[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: kirilkirkov"
  },
  {
    "path": ".htaccess",
    "content": "RewriteEngine on\n\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule ^(.*)$ index.php?/$1 [L]\n\n<IfModule mod_headers.c>    \n    Header set Access-Control-Allow-Origin *\n</IfModule>"
  },
  {
    "path": "README.md",
    "content": "# Electronic Invoicing and Warehouse Management System\n\n## Overview\nA robust and versatile system for managing electronic invoices and warehouse operations. Built using CodeIgniter 3.1.13 and Bootstrap 3.3.7, this self-hosted solution allows for unlimited free invoicing, PDF downloads, and comprehensive management of clients, items, and employees.\n\n### Key Features\n- **Unlimited Electronic Invoices:** Create, manage, and download invoices as PDFs.\n- **Multi-Company Support:** Manage multiple companies within a single account.\n- **Client and Item Management:** Maintain detailed records of clients and items with pricing.\n- **Protocol and Warranty Creation:** Generate and export protocols and warranties to PDF.\n- **Invoice Status Tracking:** Easily monitor paid and unpaid invoices.\n- **Multi-Language Support:** Available in English, French, and Bulgarian, with customizable translations.\n- **Warehouse Operations:** Track warehouse movements, manage stock quantities, and generate bills of goods.\n- **Employee Permissions:** Assign specific permissions to different employees.\n- **Reports and Statistics:** Generate comprehensive reports and export invoices as XML or Excel files.\n- **Responsive Design:** Optimized for mobile devices, tablets, and high-resolution monitors.\n- **Customizable Settings:** Adjust settings for rounding prices, toner-saving PDF options, and more.\n\n### Current Versions\n- **CodeIgniter:** 3.1.13\n- **Bootstrap:** 3.3.7\n\n## Installation\n1. Import `database.sql` to your MySQL database.\n2. Set the database, username, and password in `application/config/database.php`.\n\nIf routing does not work automatically, set the base URL in `application/config/config.php`:\n```php\n$config['base_url'] = defined('BASE_URL') ? BASE_URL : 'https://your-website.com/';\n```\n\n## Usage\n1. Visit the homepage and register a new account.\n2. Log in with your new credentials to start issuing unlimited invoices, protocols, and warranties.\n\n### Administration\n- Access the admin panel at `/admin` (e.g., `https://yoursite.com/admin`).\n- Default credentials:\n  - **Username:** admin\n  - **Password:** admin\n\n## Download as WordPress Plugin\n<a href=\"https://wordpress.org/plugins/kirilkirkov-pdf-invoice-manager/\">Available for integration with WordPress as a plugin.</a>\n\n## Screenshots\n- **PDF Invoice:** ![alt text](https://raw.githubusercontent.com/kirilkirkov/ei/master/design/user/design_of_invoice.png)\n- **Invoices List:** ![alt text](https://raw.githubusercontent.com/kirilkirkov/ei/master/design/user/design_of_invoices_list.png)\n- **Create Invoice Page:** ![alt text](https://raw.githubusercontent.com/kirilkirkov/ei/master/design/user/create_invoice_page.png)\n- **Statistics:** ![alt text](https://raw.githubusercontent.com/kirilkirkov/ei/master/design/user/stats.png)\n\n## Donate\nIf this project helps you save time in development, consider buying me a cup of coffee to support its ongoing development. Thank you!\n\n[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate/?hosted_button_id=PF5ES4K748ZEY)\n"
  },
  {
    "path": "application/.htaccess",
    "content": "<IfModule authz_core_module>\n    Require all denied\n</IfModule>\n<IfModule !authz_core_module>\n    Deny from all\n</IfModule>"
  },
  {
    "path": "application/cache/.htaccess",
    "content": "<IfModule authz_core_module>\n    Require all denied\n</IfModule>\n<IfModule !authz_core_module>\n    Deny from all\n</IfModule>"
  },
  {
    "path": "application/cache/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/config/autoload.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n  | -------------------------------------------------------------------\n  | AUTO-LOADER\n  | -------------------------------------------------------------------\n  | This file specifies which systems should be loaded by default.\n  |\n  | In order to keep the framework as light-weight as possible only the\n  | absolute minimal resources are loaded by default. For example,\n  | the database is not connected to automatically since no assumption\n  | is made regarding whether you intend to use it.  This file lets\n  | you globally define which systems you would like loaded with every\n  | request.\n  |\n  | -------------------------------------------------------------------\n  | Instructions\n  | -------------------------------------------------------------------\n  |\n  | These are the things you can load automatically:\n  |\n  | 1. Packages\n  | 2. Libraries\n  | 3. Drivers\n  | 4. Helper files\n  | 5. Custom config files\n  | 6. Language files\n  | 7. Models\n  |\n */\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Packages\n  | -------------------------------------------------------------------\n  | Prototype:\n  |\n  |  $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');\n  |\n */\n$autoload['packages'] = array();\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Libraries\n  | -------------------------------------------------------------------\n  | These are the classes located in system/libraries/ or your\n  | application/libraries/ directory, with the addition of the\n  | 'database' library, which is somewhat of a special case.\n  |\n  | Prototype:\n  |\n  |\t$autoload['libraries'] = array('database', 'email', 'session');\n  |\n  | You can also supply an alternative library name to be assigned\n  | in the controller:\n  |\n  |\t$autoload['libraries'] = array('user_agent' => 'ua');\n */\n$autoload['libraries'] = array(\n    'database',\n    'language',\n    'session'\n);\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Drivers\n  | -------------------------------------------------------------------\n  | These classes are located in system/libraries/ or in your\n  | application/libraries/ directory, but are also placed inside their\n  | own subdirectory and they extend the CI_Driver_Library class. They\n  | offer multiple interchangeable driver options.\n  |\n  | Prototype:\n  |\n  |\t$autoload['drivers'] = array('cache');\n  |\n  | You can also supply an alternative property name to be assigned in\n  | the controller:\n  |\n  |\t$autoload['drivers'] = array('cache' => 'cch');\n  |\n */\n$autoload['drivers'] = array();\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Helper Files\n  | -------------------------------------------------------------------\n  | Prototype:\n  |\n  |\t$autoload['helper'] = array('url', 'file');\n */\n$autoload['helper'] = array(\n    'url',\n    'language',\n    'lang_url',\n    'text',\n    'geterror', \n    'full_document_number',\n    'thisyeardates'\n);\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Config files\n  | -------------------------------------------------------------------\n  | Prototype:\n  |\n  |\t$autoload['config'] = array('config1', 'config2');\n  |\n  | NOTE: This item is intended for use ONLY if you have created custom\n  | config files.  Otherwise, leave it blank.\n  |\n */\n$autoload['config'] = array();\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Language files\n  | -------------------------------------------------------------------\n  | Prototype:\n  |\n  |\t$autoload['language'] = array('lang1', 'lang2');\n  |\n  | NOTE: Do not include the \"_lang\" part of your file.  For example\n  | \"codeigniter_lang.php\" would be referenced as array('codeigniter');\n  |\n */\n$autoload['language'] = array();\n\n/*\n  | -------------------------------------------------------------------\n  |  Auto-load Models\n  | -------------------------------------------------------------------\n  | Prototype:\n  |\n  |\t$autoload['model'] = array('first_model', 'second_model');\n  |\n  | You can also supply an alternative model name to be assigned\n  | in the controller:\n  |\n  |\t$autoload['model'] = array('first_model' => 'first');\n */\n$autoload['model'] = array();\n"
  },
  {
    "path": "application/config/config.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n  |--------------------------------------------------------------------------\n  | Base Site URL\n  |--------------------------------------------------------------------------\n  |\n  | URL to your CodeIgniter root. Typically this will be your base URL,\n  | WITH a trailing slash:\n  |\n  |\thttp://example.com/\n  |\n  | WARNING: You MUST set this value!\n  |\n  | If it is not set, then CodeIgniter will try guess the protocol and path\n  | your installation, but due to security concerns the hostname will be set\n  | to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.\n  | The auto-detection mechanism exists only for convenience during\n  | development and MUST NOT be used in production!\n  |\n  | If you need to allow multiple domains, remember that this file is still\n  | a PHP script and you can easily do that on your own.\n  |\n */\n\n// add your base url here into the ELSE statement - ''.\n$config['base_url'] = defined('BASE_URL') ? BASE_URL : '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Index File\n  |--------------------------------------------------------------------------\n  |\n  | Typically this will be your index.php file, unless you've renamed it to\n  | something else. If you are using mod_rewrite to remove the page set this\n  | variable so that it is blank.\n  |\n */\n$config['index_page'] = 'index.php';\n\n/*\n  |--------------------------------------------------------------------------\n  | MD5 Salt For Users Passwords\n  |--------------------------------------------------------------------------\n  |\n */\n$config['salt'] = 'uiumi';\n\n/*\n  |--------------------------------------------------------------------------\n  | URI PROTOCOL\n  |--------------------------------------------------------------------------\n  |\n  | This item determines which server global should be used to retrieve the\n  | URI string.  The default setting of 'REQUEST_URI' works for most servers.\n  | If your links do not seem to work, try one of the other delicious flavors:\n  |\n  | 'REQUEST_URI'    Uses $_SERVER['REQUEST_URI']\n  | 'QUERY_STRING'   Uses $_SERVER['QUERY_STRING']\n  | 'PATH_INFO'      Uses $_SERVER['PATH_INFO']\n  |\n  | WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!\n */\n$config['uri_protocol'] = 'REQUEST_URI';\n\n\n/*\n  |--------------------------------------------------------------------------\n  | Allowed images for upload\n  |--------------------------------------------------------------------------\n  |\n */\n$config['allowed_img_types'] = 'gif|jpg|png|jpeg|JPG|PNG|JPEG';\n\n/*\n  |--------------------------------------------------------------------------\n  | URL suffix\n  |--------------------------------------------------------------------------\n  |\n  | This option allows you to add a suffix to all URLs generated by CodeIgniter.\n  | For more information please see the user guide:\n  |\n  | https://codeigniter.com/user_guide/general/urls.html\n */\n$config['url_suffix'] = '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Default Language\n  |--------------------------------------------------------------------------\n  |\n  | This determines which set of language files should be used. Make sure\n  | there is an available translation if you intend to use something other\n  | than english.\n  |\n */\n$config['language'] = 'english';\n$config['language_abbr'] = 'en';\n$config['currency'] = 'EUR';\n$config['currencyKey'] = 'EUR';\n\n/*\n  |--------------------------------------------------------------------------\n  | Default Character Set\n  |--------------------------------------------------------------------------\n  |\n  | This determines which character set is used by default in various methods\n  | that require a character set to be provided.\n  |\n  | See http://php.net/htmlspecialchars for a list of supported charsets.\n  |\n */\n$config['charset'] = 'UTF-8';\n\n/*\n  |--------------------------------------------------------------------------\n  | Enable/Disable System Hooks\n  |--------------------------------------------------------------------------\n  |\n  | If you would like to use the 'hooks' feature you must enable it by\n  | setting this variable to TRUE (boolean).  See the user guide for details.\n  |\n */\n$config['enable_hooks'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Class Extension Prefix\n  |--------------------------------------------------------------------------\n  |\n  | This item allows you to set the filename/classname prefix when extending\n  | native libraries.  For more information please see the user guide:\n  |\n  | https://codeigniter.com/user_guide/general/core_classes.html\n  | https://codeigniter.com/user_guide/general/creating_libraries.html\n  |\n */\n$config['subclass_prefix'] = 'MY_';\n\n/*\n  |--------------------------------------------------------------------------\n  | Composer auto-loading\n  |--------------------------------------------------------------------------\n  |\n  | Enabling this setting will tell CodeIgniter to look for a Composer\n  | package auto-loader script in application/vendor/autoload.php.\n  |\n  |\t$config['composer_autoload'] = TRUE;\n  |\n  | Or if you have your vendor/ directory located somewhere else, you\n  | can opt to set a specific path as well:\n  |\n  |\t$config['composer_autoload'] = '/path/to/vendor/autoload.php';\n  |\n  | For more information about Composer, please visit http://getcomposer.org/\n  |\n  | Note: This will NOT disable or override the CodeIgniter-specific\n  |\tautoloading (application/config/autoload.php)\n */\n$config['composer_autoload'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Allowed URL Characters\n  |--------------------------------------------------------------------------\n  |\n  | This lets you specify which characters are permitted within your URLs.\n  | When someone tries to submit a URL with disallowed characters they will\n  | get a warning message.\n  |\n  | As a security measure you are STRONGLY encouraged to restrict URLs to\n  | as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-\n  |\n  | Leave blank to allow all characters -- but only if you are insane.\n  |\n  | The configured value is actually a regular expression character group\n  | and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i\n  |\n  | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!\n  |\n */\n$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\\-';\n\n/*\n  |--------------------------------------------------------------------------\n  | Enable Query Strings\n  |--------------------------------------------------------------------------\n  |\n  | By default CodeIgniter uses search-engine friendly segment based URLs:\n  | example.com/who/what/where/\n  |\n  | You can optionally enable standard query string based URLs:\n  | example.com?who=me&what=something&where=here\n  |\n  | Options are: TRUE or FALSE (boolean)\n  |\n  | The other items let you set the query string 'words' that will\n  | invoke your controllers and its functions:\n  | example.com/index.php?c=controller&m=function\n  |\n  | Please note that some of the helpers won't work as expected when\n  | this feature is enabled, since CodeIgniter is designed primarily to\n  | use segment based URLs.\n  |\n */\n$config['enable_query_strings'] = FALSE;\n$config['controller_trigger'] = 'c';\n$config['function_trigger'] = 'm';\n$config['directory_trigger'] = 'd';\n\n/*\n  |--------------------------------------------------------------------------\n  | Allow $_GET array\n  |--------------------------------------------------------------------------\n  |\n  | By default CodeIgniter enables access to the $_GET array.  If for some\n  | reason you would like to disable it, set 'allow_get_array' to FALSE.\n  |\n  | WARNING: This feature is DEPRECATED and currently available only\n  |          for backwards compatibility purposes!\n  |\n */\n$config['allow_get_array'] = TRUE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Error Logging Threshold\n  |--------------------------------------------------------------------------\n  |\n  | You can enable error logging by setting a threshold over zero. The\n  | threshold determines what gets logged. Threshold options are:\n  |\n  |\t0 = Disables logging, Error logging TURNED OFF\n  |\t1 = Error Messages (including PHP errors)\n  |\t2 = Debug Messages\n  |\t3 = Informational Messages\n  |\t4 = All Messages\n  |\n  | You can also pass an array with threshold levels to show individual error types\n  |\n  | \tarray(2) = Debug Messages, without Error Messages\n  |\n  | For a live site you'll usually only enable Errors (1) to be logged otherwise\n  | your log files will fill up very fast.\n  |\n */\n$config['log_threshold'] = 1;\n\n/*\n  |--------------------------------------------------------------------------\n  | Error Logging Directory Path\n  |--------------------------------------------------------------------------\n  |\n  | Leave this BLANK unless you would like to set something other than the default\n  | application/logs/ directory. Use a full server path with trailing slash.\n  |\n */\n$config['log_path'] = '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Log File Extension\n  |--------------------------------------------------------------------------\n  |\n  | The default filename extension for log files. The default 'php' allows for\n  | protecting the log files via basic scripting, when they are to be stored\n  | under a publicly accessible directory.\n  |\n  | Note: Leaving it blank will default to 'php'.\n  |\n */\n$config['log_file_extension'] = '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Log File Permissions\n  |--------------------------------------------------------------------------\n  |\n  | The file system permissions to be applied on newly created log files.\n  |\n  | IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal\n  |            integer notation (i.e. 0700, 0644, etc.)\n */\n$config['log_file_permissions'] = 0644;\n\n/*\n  |--------------------------------------------------------------------------\n  | Date Format for Logs\n  |--------------------------------------------------------------------------\n  |\n  | Each item that is logged has an associated date. You can use PHP date\n  | codes to set your own date formatting\n  |\n */\n$config['log_date_format'] = 'Y-m-d H:i:s';\n\n/*\n  |--------------------------------------------------------------------------\n  | Error Views Directory Path\n  |--------------------------------------------------------------------------\n  |\n  | Leave this BLANK unless you would like to set something other than the default\n  | application/views/errors/ directory.  Use a full server path with trailing slash.\n  |\n */\n$config['error_views_path'] = '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Cache Directory Path\n  |--------------------------------------------------------------------------\n  |\n  | Leave this BLANK unless you would like to set something other than the default\n  | application/cache/ directory.  Use a full server path with trailing slash.\n  |\n */\n$config['cache_path'] = '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Cache Include Query String\n  |--------------------------------------------------------------------------\n  |\n  | Whether to take the URL query string into consideration when generating\n  | output cache files. Valid options are:\n  |\n  |\tFALSE      = Disabled\n  |\tTRUE       = Enabled, take all query parameters into account.\n  |\t             Please be aware that this may result in numerous cache\n  |\t             files generated for the same page over and over again.\n  |\tarray('q') = Enabled, but only take into account the specified list\n  |\t             of query parameters.\n  |\n */\n$config['cache_query_string'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Encryption Key\n  |--------------------------------------------------------------------------\n  |\n  | If you use the Encryption class, you must set an encryption key.\n  | See the user guide for more info.\n  |\n  | https://codeigniter.com/user_guide/libraries/encryption.html\n  |\n */\n$config['encryption_key'] = '';\n\n/*\n  |--------------------------------------------------------------------------\n  | Session Variables\n  |--------------------------------------------------------------------------\n  |\n  | 'sess_driver'\n  |\n  |\tThe storage driver to use: files, database, redis, memcached\n  |\n  | 'sess_cookie_name'\n  |\n  |\tThe session cookie name, must contain only [0-9a-z_-] characters\n  |\n  | 'sess_expiration'\n  |\n  |\tThe number of SECONDS you want the session to last.\n  |\tSetting to 0 (zero) means expire when the browser is closed.\n  |\n  | 'sess_save_path'\n  |\n  |\tThe location to save sessions to, driver dependent.\n  |\n  |\tFor the 'files' driver, it's a path to a writable directory.\n  |\tWARNING: Only absolute paths are supported!\n  |\n  |\tFor the 'database' driver, it's a table name.\n  |\tPlease read up the manual for the format with other session drivers.\n  |\n  |\tIMPORTANT: You are REQUIRED to set a valid save path!\n  |\n  | 'sess_match_ip'\n  |\n  |\tWhether to match the user's IP address when reading the session data.\n  |\n  |\tWARNING: If you're using the database driver, don't forget to update\n  |\t         your session table's PRIMARY KEY when changing this setting.\n  |\n  | 'sess_time_to_update'\n  |\n  |\tHow many seconds between CI regenerating the session ID.\n  |\n  | 'sess_regenerate_destroy'\n  |\n  |\tWhether to destroy session data associated with the old session ID\n  |\twhen auto-regenerating the session ID. When set to FALSE, the data\n  |\twill be later deleted by the garbage collector.\n  |\n  | Other session cookie settings are shared with the rest of the application,\n  | except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.\n  |\n */\n$config['sess_driver'] = 'files';\n$config['sess_cookie_name'] = 'tyson';\n$config['sess_expiration'] = 7200;\n$config['sess_save_path'] = '/tmp';\n$config['sess_match_ip'] = FALSE;\n$config['sess_time_to_update'] = 300;\n$config['sess_regenerate_destroy'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Cookie Related Variables\n  |--------------------------------------------------------------------------\n  |\n  | 'cookie_prefix'   = Set a cookie name prefix if you need to avoid collisions\n  | 'cookie_domain'   = Set to .your-domain.com for site-wide cookies\n  | 'cookie_path'     = Typically will be a forward slash\n  | 'cookie_secure'   = Cookie will only be set if a secure HTTPS connection exists.\n  | 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript)\n  |\n  | Note: These settings (with the exception of 'cookie_prefix' and\n  |       'cookie_httponly') will also affect sessions.\n  |\n */\n$config['cookie_prefix'] = '';\n$config['cookie_domain'] = '';\n$config['cookie_path'] = '/';\n$config['cookie_secure'] = FALSE;\n$config['cookie_httponly'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Standardize newlines\n  |--------------------------------------------------------------------------\n  |\n  | Determines whether to standardize newline characters in input data,\n  | meaning to replace \\r\\n, \\r, \\n occurrences with the PHP_EOL value.\n  |\n  | WARNING: This feature is DEPRECATED and currently available only\n  |          for backwards compatibility purposes!\n  |\n */\n$config['standardize_newlines'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Global XSS Filtering\n  |--------------------------------------------------------------------------\n  |\n  | Determines whether the XSS filter is always active when GET, POST or\n  | COOKIE data is encountered\n  |\n  | WARNING: This feature is DEPRECATED and currently available only\n  |          for backwards compatibility purposes!\n  |\n */\n$config['global_xss_filtering'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Cross Site Request Forgery\n  |--------------------------------------------------------------------------\n  | Enables a CSRF cookie token to be set. When set to TRUE, token will be\n  | checked on a submitted form. If you are accepting user data, it is strongly\n  | recommended CSRF protection be enabled.\n  |\n  | 'csrf_token_name' = The token name\n  | 'csrf_cookie_name' = The cookie name\n  | 'csrf_expire' = The number in seconds the token should expire.\n  | 'csrf_regenerate' = Regenerate token on every submission\n  | 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks\n */\n$config['csrf_protection'] = TRUE;\n$config['csrf_token_name'] = 'csrf_test_name';\n$config['csrf_cookie_name'] = 'csrf_cookie_name';\n$config['csrf_expire'] = 7200;\n$config['csrf_regenerate'] = FALSE;\n$config['csrf_exclude_uris'] = array();\n\n/*\n  |--------------------------------------------------------------------------\n  | Output Compression\n  |--------------------------------------------------------------------------\n  |\n  | Enables Gzip output compression for faster page loads.  When enabled,\n  | the output class will test whether your server supports Gzip.\n  | Even if it does, however, not all browsers support compression\n  | so enable only if you are reasonably sure your visitors can handle it.\n  |\n  | Only used if zlib.output_compression is turned off in your php.ini.\n  | Please do not use it together with httpd-level output compression.\n  |\n  | VERY IMPORTANT:  If you are getting a blank page when compression is enabled it\n  | means you are prematurely outputting something to your browser. It could\n  | even be a line of whitespace at the end of one of your scripts.  For\n  | compression to work, nothing can be sent before the output buffer is called\n  | by the output class.  Do not 'echo' any values with compression enabled.\n  |\n */\n$config['compress_output'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Master Time Reference\n  |--------------------------------------------------------------------------\n  |\n  | Options are 'local' or any PHP supported timezone. This preference tells\n  | the system whether to use your server's local time as the master 'now'\n  | reference, or convert it to the configured one timezone. See the 'date\n  | helper' page of the user guide for information regarding date handling.\n  |\n */\n$config['time_reference'] = 'local';\n\n/*\n  |--------------------------------------------------------------------------\n  | Rewrite PHP Short Tags\n  |--------------------------------------------------------------------------\n  |\n  | If your PHP installation does not have short tag support enabled CI\n  | can rewrite the tags on-the-fly, enabling you to utilize that syntax\n  | in your view files.  Options are TRUE or FALSE (boolean)\n  |\n  | Note: You need to have eval() enabled for this to work.\n  |\n */\n$config['rewrite_short_tags'] = FALSE;\n\n/*\n  |--------------------------------------------------------------------------\n  | Reverse Proxy IPs\n  |--------------------------------------------------------------------------\n  |\n  | If your server is behind a reverse proxy, you must whitelist the proxy\n  | IP addresses from which CodeIgniter should trust headers such as\n  | HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify\n  | the visitor's IP address.\n  |\n  | You can use both an array or a comma-separated list of proxy addresses,\n  | as well as specifying whole subnets. Here are a few examples:\n  |\n  | Comma-separated:\t'10.0.1.200,192.168.5.0/24'\n  | Array:\t\tarray('10.0.1.200', '192.168.5.0/24')\n */\n$config['proxy_ips'] = '';\n\n/*\n * Array with available permissions\n */\n$config['permissions'] = array(\n    'perm_add_invoice' => 1,\n    'perm_edit_invoice' => 1,\n    'perm_delete_invoice' => 1,\n    'perm_change_inv_status' => 1,\n    'perm_add_clients' => 1,\n    'perm_edit_clients' => 1,\n    'perm_delete_clients' => 1,\n    'perm_add_items' => 1,\n    'perm_edit_items' => 1,\n    'perm_delete_items' => 1,\n    'perm_can_manage_rights' => 1,\n    'perm_delete_employees' => 1,\n    'perm_edit_employees' => 1,\n    'perm_add_employees' => 1,\n    'perm_can_manage_firms' => 1,\n    'perm_add_movement' => 1,\n    'perm_view_movement_page' => 1,\n    'perm_view_store_stocks' => 1,\n    'perm_view_warranty_page' => 1,\n    'perm_add_warranty' => 1,\n    'perm_view_warranty_events' => 1,\n    'perm_add_warranty_events' => 1,\n    'perm_view_protocols_page' => 1,\n    'perm_add_protocol' => 1,\n    'perm_view_plans_page' => 1\n);\n$config['templates'] = array(\n    'creative',\n    'toner-save'\n);\n/*\n * used for links (routes)\n */\n$config['inv_readable_types'] = array(\n    'tax_inv' => 'invoice',\n    'prof' => 'pro-forma',\n    'debit' => 'debit-note',\n    'credit' => 'credit-note'\n);\n/*\n * invoices statuses\n */\n$config['inv_statuses'] = array(\n    'issued',\n    'draft',\n    'sended',\n    'canceled',\n    'accepted',\n    'refused'\n);\n/*\n * plans\n */\n$config['plans'] = array(\n    'BASIC' => array(\n        'PRICE' => 5,\n        'NUM_INVOICES' => 20,\n        'NUM_FIRMS' => 1\n    ),\n    'ADVANCED' => array(\n        'PRICE' => 15,\n        'NUM_INVOICES' => 200,\n        'NUM_FIRMS' => 3\n    ),\n    'PRO' => array(\n        'PRICE' => 50, // per year\n        'NUM_INVOICES' => 3000,\n        'NUM_FIRMS' => 10\n    )\n);\n"
  },
  {
    "path": "application/config/constants.php",
    "content": "<?php\n\nif (isset($_SERVER['SERVER_PORT']))\n{\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Base URL\n\t|--------------------------------------------------------------------------\n\t*/\n\tdefine('BASE_URL',\n\t\t(!empty($_SERVER['SERVER_PORT'])?$_SERVER['SERVER_PORT']==443?'https':'http':FALSE).\n\t\t\"://\".(!empty($_SERVER['SERVER_NAME'])?$_SERVER['SERVER_NAME']:FALSE).str_replace(basename($_SERVER['SCRIPT_NAME']),\"\",$_SERVER['SCRIPT_NAME']));\n\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Current URL\n\t|--------------------------------------------------------------------------\n\t*/\n\tdefine('CURRENT_URL', (!empty($_SERVER['SERVER_PORT'])?$_SERVER['SERVER_PORT']==443?'https':'http':FALSE).\"://\".(!empty($_SERVER['SERVER_NAME'])?$_SERVER['SERVER_NAME']:FALSE).str_replace('//', '/', $_SERVER['REQUEST_URI']));\n}\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n  |--------------------------------------------------------------------------\n  | Display Debug backtrace\n  |--------------------------------------------------------------------------\n  |\n  | If set to TRUE, a backtrace will be displayed along with php errors. If\n  | error_reporting is disabled, the backtrace will not display, regardless\n  | of this setting\n  |\n */\ndefined('SHOW_DEBUG_BACKTRACE') OR define('SHOW_DEBUG_BACKTRACE', TRUE);\n\n/*\n  |--------------------------------------------------------------------------\n  | File and Directory Modes\n  |--------------------------------------------------------------------------\n  |\n  | These prefs are used when checking and setting modes when working\n  | with the file system.  The defaults are fine on servers with proper\n  | security, but you may wish (or even need) to change the values in\n  | certain environments (Apache running a separate process for each\n  | user, PHP under CGI with Apache suEXEC, etc.).  Octal values should\n  | always be used to set the mode correctly.\n  |\n */\ndefined('FILE_READ_MODE') OR define('FILE_READ_MODE', 0644);\ndefined('FILE_WRITE_MODE') OR define('FILE_WRITE_MODE', 0666);\ndefined('DIR_READ_MODE') OR define('DIR_READ_MODE', 0755);\ndefined('DIR_WRITE_MODE') OR define('DIR_WRITE_MODE', 0755);\n\n/*\n  |--------------------------------------------------------------------------\n  | File Stream Modes\n  |--------------------------------------------------------------------------\n  |\n  | These modes are used when working with fopen()/popen()\n  |\n */\ndefined('FOPEN_READ') OR define('FOPEN_READ', 'rb');\ndefined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b');\ndefined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care\ndefined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care\ndefined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab');\ndefined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b');\ndefined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb');\ndefined('FOPEN_READ_WRITE_CREATE_STRICT') OR define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');\n\n/*\n  |--------------------------------------------------------------------------\n  | Exit Status Codes\n  |--------------------------------------------------------------------------\n  |\n  | Used to indicate the conditions under which the script is exit()ing.\n  | While there is no universal standard for error codes, there are some\n  | broad conventions.  Three such conventions are mentioned below, for\n  | those who wish to make use of them.  The CodeIgniter defaults were\n  | chosen for the least overlap with these conventions, while still\n  | leaving room for others to be defined in future versions and user\n  | applications.\n  |\n  | The three main conventions used for determining exit status codes\n  | are as follows:\n  |\n  |    Standard C/C++ Library (stdlibc):\n  |       http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html\n  |       (This link also contains other GNU-specific conventions)\n  |    BSD sysexits.h:\n  |       http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits\n  |    Bash scripting:\n  |       http://tldp.org/LDP/abs/html/exitcodes.html\n  |\n */\ndefined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors\ndefined('EXIT_ERROR') OR define('EXIT_ERROR', 1); // generic error\ndefined('EXIT_CONFIG') OR define('EXIT_CONFIG', 3); // configuration error\ndefined('EXIT_UNKNOWN_FILE') OR define('EXIT_UNKNOWN_FILE', 4); // file not found\ndefined('EXIT_UNKNOWN_CLASS') OR define('EXIT_UNKNOWN_CLASS', 5); // unknown class\ndefined('EXIT_UNKNOWN_METHOD') OR define('EXIT_UNKNOWN_METHOD', 6); // unknown class member\ndefined('EXIT_USER_INPUT') OR define('EXIT_USER_INPUT', 7); // invalid user input\ndefined('EXIT_DATABASE') OR define('EXIT_DATABASE', 8); // database error\ndefined('EXIT__AUTO_MIN') OR define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code\ndefined('EXIT__AUTO_MAX') OR define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code\n\n\n/*\n * Mine CONSTANTS\n */\ndefine('COMPANIES_IMAGES_DIR', 'companiesimages');\ndefine('BLOG_IMAGES_DIR', 'blogimages');\ndefine('FEATURES_IMAGES_DIR', 'featuresimages');\n"
  },
  {
    "path": "application/config/database.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------\n| DATABASE CONNECTIVITY SETTINGS\n| -------------------------------------------------------------------\n| This file will contain the settings needed to access your database.\n|\n| For complete instructions please consult the 'Database Connection'\n| page of the User Guide.\n|\n| -------------------------------------------------------------------\n| EXPLANATION OF VARIABLES\n| -------------------------------------------------------------------\n|\n|\t['dsn']      The full DSN string describe a connection to the database.\n|\t['hostname'] The hostname of your database server.\n|\t['username'] The username used to connect to the database\n|\t['password'] The password used to connect to the database\n|\t['database'] The name of the database you want to connect to\n|\t['dbdriver'] The database driver. e.g.: mysqli.\n|\t\t\tCurrently supported:\n|\t\t\t\t cubrid, ibase, mssql, mysql, mysqli, oci8,\n|\t\t\t\t odbc, pdo, postgre, sqlite, sqlite3, sqlsrv\n|\t['dbprefix'] You can add an optional prefix, which will be added\n|\t\t\t\t to the table name when using the  Query Builder class\n|\t['pconnect'] TRUE/FALSE - Whether to use a persistent connection\n|\t['db_debug'] TRUE/FALSE - Whether database errors should be displayed.\n|\t['cache_on'] TRUE/FALSE - Enables/disables query caching\n|\t['cachedir'] The path to the folder where cache files should be stored\n|\t['char_set'] The character set used in communicating with the database\n|\t['dbcollat'] The character collation used in communicating with the database\n|\t\t\t\t NOTE: For MySQL and MySQLi databases, this setting is only used\n| \t\t\t\t as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7\n|\t\t\t\t (and in table creation queries made with DB Forge).\n| \t\t\t\t There is an incompatibility in PHP with mysql_real_escape_string() which\n| \t\t\t\t can make your site vulnerable to SQL injection if you are using a\n| \t\t\t\t multi-byte character set and are running versions lower than these.\n| \t\t\t\t Sites using Latin-1 or UTF-8 database character set and collation are unaffected.\n|\t['swap_pre'] A default table prefix that should be swapped with the dbprefix\n|\t['encrypt']  Whether or not to use an encrypted connection.\n|\n|\t\t\t'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE\n|\t\t\t'mysqli' and 'pdo/mysql' drivers accept an array with the following options:\n|\n|\t\t\t\t'ssl_key'    - Path to the private key file\n|\t\t\t\t'ssl_cert'   - Path to the public key certificate file\n|\t\t\t\t'ssl_ca'     - Path to the certificate authority file\n|\t\t\t\t'ssl_capath' - Path to a directory containing trusted CA certificats in PEM format\n|\t\t\t\t'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')\n|\t\t\t\t'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only)\n|\n|\t['compress'] Whether or not to use client compression (MySQL only)\n|\t['stricton'] TRUE/FALSE - forces 'Strict Mode' connections\n|\t\t\t\t\t\t\t- good for ensuring strict SQL while developing\n|\t['ssl_options']\tUsed to set various SSL options that can be used when making SSL connections.\n|\t['failover'] array - A array with 0 or more data for connections if the main should fail.\n|\t['save_queries'] TRUE/FALSE - Whether to \"save\" all executed queries.\n| \t\t\t\tNOTE: Disabling this will also effectively disable both\n| \t\t\t\t$this->db->last_query() and profiling of DB queries.\n| \t\t\t\tWhen you run a query, with this setting set to TRUE (default),\n| \t\t\t\tCodeIgniter will store the SQL statement for debugging purposes.\n| \t\t\t\tHowever, this may cause high memory usage, especially if you run\n| \t\t\t\ta lot of SQL queries ... disable this to avoid that problem.\n|\n| The $active_group variable lets you choose which connection group to\n| make active.  By default there is only one group (the 'default' group).\n|\n| The $query_builder variables lets you determine whether or not to load\n| the query builder class.\n*/\n$active_group = 'default';\n$query_builder = TRUE;\n\n$db['default'] = array(\n\t'dsn'\t=> '',\n\t'hostname' => 'localhost',\n\t'username' => 'root',\n\t'password' => 'toor',\n\t'database' => 'test',\n\t'dbdriver' => 'mysqli',\n\t'dbprefix' => '',\n\t'pconnect' => FALSE,\n\t'db_debug' => (ENVIRONMENT !== 'production'),\n\t'cache_on' => FALSE,\n\t'cachedir' => '',\n\t'char_set' => 'utf8',\n\t'dbcollat' => 'utf8_general_ci',\n\t'swap_pre' => '',\n\t'encrypt' => FALSE,\n\t'compress' => FALSE,\n\t'stricton' => FALSE,\n\t'failover' => array(),\n\t'save_queries' => TRUE\n);\n"
  },
  {
    "path": "application/config/doctypes.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$_doctypes = array(\n\t'xhtml11' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n\t'xhtml1-strict' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n\t'xhtml1-trans' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n\t'xhtml1-frame' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n\t'xhtml-basic11' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n\t'html5' => '<!DOCTYPE html>',\n\t'html4-strict' => '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">',\n\t'html4-trans' => '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">',\n\t'html4-frame' => '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">',\n\t'mathml1' => '<!DOCTYPE math SYSTEM \"http://www.w3.org/Math/DTD/mathml1/mathml.dtd\">',\n\t'mathml2' => '<!DOCTYPE math PUBLIC \"-//W3C//DTD MathML 2.0//EN\" \"http://www.w3.org/Math/DTD/mathml2/mathml2.dtd\">',\n\t'svg10' => '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">',\n\t'svg11' => '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">',\n\t'svg11-basic' => '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1 Basic//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd\">',\n\t'svg11-tiny' => '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1 Tiny//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd\">',\n\t'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN\" \"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd\">',\n\t'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC \"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN\" \"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd\">',\n\t'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML+RDFa 1.0//EN\" \"http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd\">',\n\t'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML+RDFa 1.1//EN\" \"http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd\">'\n);\n"
  },
  {
    "path": "application/config/foreign_chars.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------\n| Foreign Characters\n| -------------------------------------------------------------------\n| This file contains an array of foreign characters for transliteration\n| conversion used by the Text helper\n|\n*/\n$foreign_characters = array(\n\t'/ä|æ|ǽ/' => 'ae',\n\t'/ö|œ/' => 'oe',\n\t'/ü/' => 'ue',\n\t'/Ä/' => 'Ae',\n\t'/Ü/' => 'Ue',\n\t'/Ö/' => 'Oe',\n\t'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',\n\t'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',\n\t'/Б/' => 'B',\n\t'/б/' => 'b',\n\t'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',\n\t'/ç|ć|ĉ|ċ|č/' => 'c',\n\t'/Д/' => 'D',\n\t'/д/' => 'd',\n\t'/Ð|Ď|Đ|Δ/' => 'Dj',\n\t'/ð|ď|đ|δ/' => 'dj',\n\t'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E',\n\t'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e',\n\t'/Ф/' => 'F',\n\t'/ф/' => 'f',\n\t'/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G',\n\t'/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g',\n\t'/Ĥ|Ħ/' => 'H',\n\t'/ĥ|ħ/' => 'h',\n\t'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I',\n\t'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i',\n\t'/Ĵ/' => 'J',\n\t'/ĵ/' => 'j',\n\t'/Ķ|Κ|К/' => 'K',\n\t'/ķ|κ|к/' => 'k',\n\t'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',\n\t'/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',\n\t'/М/' => 'M',\n\t'/м/' => 'm',\n\t'/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',\n\t'/ñ|ń|ņ|ň|ŉ|ν|н/' => 'n',\n\t'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O',\n\t'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',\n\t'/П/' => 'P',\n\t'/п/' => 'p',\n\t'/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',\n\t'/ŕ|ŗ|ř|ρ|р/' => 'r',\n\t'/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',\n\t'/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',\n\t'/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T',\n\t'/ț|ţ|ť|ŧ|т/' => 't',\n\t'/Þ|þ/' => 'th',\n\t'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',\n\t'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',\n\t'/Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y',\n\t'/ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y',\n\t'/В/' => 'V',\n\t'/в/' => 'v',\n\t'/Ŵ/' => 'W',\n\t'/ŵ/' => 'w',\n\t'/Ź|Ż|Ž|Ζ|З/' => 'Z',\n\t'/ź|ż|ž|ζ|з/' => 'z',\n\t'/Æ|Ǽ/' => 'AE',\n\t'/ß/' => 'ss',\n\t'/Ĳ/' => 'IJ',\n\t'/ĳ/' => 'ij',\n\t'/Œ/' => 'OE',\n\t'/ƒ/' => 'f',\n\t'/ξ/' => 'ks',\n\t'/π/' => 'p',\n\t'/β/' => 'v',\n\t'/μ/' => 'm',\n\t'/ψ/' => 'ps',\n\t'/Ё/' => 'Yo',\n\t'/ё/' => 'yo',\n\t'/Є/' => 'Ye',\n\t'/є/' => 'ye',\n\t'/Ї/' => 'Yi',\n\t'/Ж/' => 'Zh',\n\t'/ж/' => 'zh',\n\t'/Х/' => 'Kh',\n\t'/х/' => 'kh',\n\t'/Ц/' => 'Ts',\n\t'/ц/' => 'ts',\n\t'/Ч/' => 'Ch',\n\t'/ч/' => 'ch',\n\t'/Ш/' => 'Sh',\n\t'/ш/' => 'sh',\n\t'/Щ/' => 'Shch',\n\t'/щ/' => 'shch',\n\t'/Ъ|ъ|Ь|ь/' => '',\n\t'/Ю/' => 'Yu',\n\t'/ю/' => 'yu',\n\t'/Я/' => 'Ya',\n\t'/я/' => 'ya'\n);\n"
  },
  {
    "path": "application/config/hooks.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------------\n| Hooks\n| -------------------------------------------------------------------------\n| This file lets you define \"hooks\" to extend CI without hacking the core\n| files.  Please see the user guide for info:\n|\n|\thttps://codeigniter.com/user_guide/general/hooks.html\n|\n*/\n"
  },
  {
    "path": "application/config/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/config/memcached.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------------\n| Memcached settings\n| -------------------------------------------------------------------------\n| Your Memcached servers can be specified below.\n|\n|\tSee: https://codeigniter.com/user_guide/libraries/caching.html#memcached\n|\n*/\n$config = array(\n\t'default' => array(\n\t\t'hostname' => '127.0.0.1',\n\t\t'port'     => '11211',\n\t\t'weight'   => '1',\n\t),\n);\n"
  },
  {
    "path": "application/config/migration.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n|--------------------------------------------------------------------------\n| Enable/Disable Migrations\n|--------------------------------------------------------------------------\n|\n| Migrations are disabled by default for security reasons.\n| You should enable migrations whenever you intend to do a schema migration\n| and disable it back when you're done.\n|\n*/\n$config['migration_enabled'] = FALSE;\n\n/*\n|--------------------------------------------------------------------------\n| Migration Type\n|--------------------------------------------------------------------------\n|\n| Migration file names may be based on a sequential identifier or on\n| a timestamp. Options are:\n|\n|   'sequential' = Sequential migration naming (001_add_blog.php)\n|   'timestamp'  = Timestamp migration naming (20121031104401_add_blog.php)\n|                  Use timestamp format YYYYMMDDHHIISS.\n|\n| Note: If this configuration value is missing the Migration library\n|       defaults to 'sequential' for backward compatibility with CI2.\n|\n*/\n$config['migration_type'] = 'timestamp';\n\n/*\n|--------------------------------------------------------------------------\n| Migrations table\n|--------------------------------------------------------------------------\n|\n| This is the name of the table that will store the current migrations state.\n| When migrations runs it will store in a database table which migration\n| level the system is at. It then compares the migration level in this\n| table to the $config['migration_version'] if they are not the same it\n| will migrate up. This must be set.\n|\n*/\n$config['migration_table'] = 'migrations';\n\n/*\n|--------------------------------------------------------------------------\n| Auto Migrate To Latest\n|--------------------------------------------------------------------------\n|\n| If this is set to TRUE when you load the migrations class and have\n| $config['migration_enabled'] set to TRUE the system will auto migrate\n| to your latest migration (whatever $config['migration_version'] is\n| set to). This way you do not have to call migrations anywhere else\n| in your code to have the latest migration.\n|\n*/\n$config['migration_auto_latest'] = FALSE;\n\n/*\n|--------------------------------------------------------------------------\n| Migrations version\n|--------------------------------------------------------------------------\n|\n| This is used to set migration version that the file system should be on.\n| If you run $this->migration->current() this is the version that schema will\n| be upgraded / downgraded to.\n|\n*/\n$config['migration_version'] = 0;\n\n/*\n|--------------------------------------------------------------------------\n| Migrations Path\n|--------------------------------------------------------------------------\n|\n| Path to your migrations folder.\n| Typically, it will be within your application path.\n| Also, writing permission is required within the migrations path.\n|\n*/\n$config['migration_path'] = APPPATH.'migrations/';\n"
  },
  {
    "path": "application/config/mimes.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------\n| MIME TYPES\n| -------------------------------------------------------------------\n| This file contains an array of mime types.  It is used by the\n| Upload class to help identify allowed file types.\n|\n*/\nreturn array(\n\t'hqx'\t=>\tarray('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),\n\t'cpt'\t=>\t'application/mac-compactpro',\n\t'csv'\t=>\tarray('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),\n\t'bin'\t=>\tarray('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),\n\t'dms'\t=>\t'application/octet-stream',\n\t'lha'\t=>\t'application/octet-stream',\n\t'lzh'\t=>\t'application/octet-stream',\n\t'exe'\t=>\tarray('application/octet-stream', 'application/x-msdownload'),\n\t'class'\t=>\t'application/octet-stream',\n\t'psd'\t=>\tarray('application/x-photoshop', 'image/vnd.adobe.photoshop'),\n\t'so'\t=>\t'application/octet-stream',\n\t'sea'\t=>\t'application/octet-stream',\n\t'dll'\t=>\t'application/octet-stream',\n\t'oda'\t=>\t'application/oda',\n\t'pdf'\t=>\tarray('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'),\n\t'ai'\t=>\tarray('application/pdf', 'application/postscript'),\n\t'eps'\t=>\t'application/postscript',\n\t'ps'\t=>\t'application/postscript',\n\t'smi'\t=>\t'application/smil',\n\t'smil'\t=>\t'application/smil',\n\t'mif'\t=>\t'application/vnd.mif',\n\t'xls'\t=>\tarray('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'),\n\t'ppt'\t=>\tarray('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'),\n\t'pptx'\t=> \tarray('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'),\n\t'wbxml'\t=>\t'application/wbxml',\n\t'wmlc'\t=>\t'application/wmlc',\n\t'dcr'\t=>\t'application/x-director',\n\t'dir'\t=>\t'application/x-director',\n\t'dxr'\t=>\t'application/x-director',\n\t'dvi'\t=>\t'application/x-dvi',\n\t'gtar'\t=>\t'application/x-gtar',\n\t'gz'\t=>\t'application/x-gzip',\n\t'gzip'  =>\t'application/x-gzip',\n\t'php'\t=>\tarray('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'),\n\t'php4'\t=>\t'application/x-httpd-php',\n\t'php3'\t=>\t'application/x-httpd-php',\n\t'phtml'\t=>\t'application/x-httpd-php',\n\t'phps'\t=>\t'application/x-httpd-php-source',\n\t'js'\t=>\tarray('application/x-javascript', 'text/plain'),\n\t'swf'\t=>\t'application/x-shockwave-flash',\n\t'sit'\t=>\t'application/x-stuffit',\n\t'tar'\t=>\t'application/x-tar',\n\t'tgz'\t=>\tarray('application/x-tar', 'application/x-gzip-compressed'),\n\t'z'\t=>\t'application/x-compress',\n\t'xhtml'\t=>\t'application/xhtml+xml',\n\t'xht'\t=>\t'application/xhtml+xml',\n\t'zip'\t=>\tarray('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),\n\t'rar'\t=>\tarray('application/x-rar', 'application/rar', 'application/x-rar-compressed'),\n\t'mid'\t=>\t'audio/midi',\n\t'midi'\t=>\t'audio/midi',\n\t'mpga'\t=>\t'audio/mpeg',\n\t'mp2'\t=>\t'audio/mpeg',\n\t'mp3'\t=>\tarray('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),\n\t'aif'\t=>\tarray('audio/x-aiff', 'audio/aiff'),\n\t'aiff'\t=>\tarray('audio/x-aiff', 'audio/aiff'),\n\t'aifc'\t=>\t'audio/x-aiff',\n\t'ram'\t=>\t'audio/x-pn-realaudio',\n\t'rm'\t=>\t'audio/x-pn-realaudio',\n\t'rpm'\t=>\t'audio/x-pn-realaudio-plugin',\n\t'ra'\t=>\t'audio/x-realaudio',\n\t'rv'\t=>\t'video/vnd.rn-realvideo',\n\t'wav'\t=>\tarray('audio/x-wav', 'audio/wave', 'audio/wav'),\n\t'bmp'\t=>\tarray('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'),\n\t'gif'\t=>\t'image/gif',\n\t'jpeg'\t=>\tarray('image/jpeg', 'image/pjpeg'),\n\t'jpg'\t=>\tarray('image/jpeg', 'image/pjpeg'),\n\t'jpe'\t=>\tarray('image/jpeg', 'image/pjpeg'),\n\t'jp2'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'j2k'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'jpf'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'jpg2'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'jpx'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'jpm'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'mj2'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'mjp2'\t=>\tarray('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),\n\t'png'\t=>\tarray('image/png',  'image/x-png'),\n\t'tiff'\t=>\t'image/tiff',\n\t'tif'\t=>\t'image/tiff',\n\t'css'\t=>\tarray('text/css', 'text/plain'),\n\t'html'\t=>\tarray('text/html', 'text/plain'),\n\t'htm'\t=>\tarray('text/html', 'text/plain'),\n\t'shtml'\t=>\tarray('text/html', 'text/plain'),\n\t'txt'\t=>\t'text/plain',\n\t'text'\t=>\t'text/plain',\n\t'log'\t=>\tarray('text/plain', 'text/x-log'),\n\t'rtx'\t=>\t'text/richtext',\n\t'rtf'\t=>\t'text/rtf',\n\t'xml'\t=>\tarray('application/xml', 'text/xml', 'text/plain'),\n\t'xsl'\t=>\tarray('application/xml', 'text/xsl', 'text/xml'),\n\t'mpeg'\t=>\t'video/mpeg',\n\t'mpg'\t=>\t'video/mpeg',\n\t'mpe'\t=>\t'video/mpeg',\n\t'qt'\t=>\t'video/quicktime',\n\t'mov'\t=>\t'video/quicktime',\n\t'avi'\t=>\tarray('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'),\n\t'movie'\t=>\t'video/x-sgi-movie',\n\t'doc'\t=>\tarray('application/msword', 'application/vnd.ms-office'),\n\t'docx'\t=>\tarray('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'),\n\t'dot'\t=>\tarray('application/msword', 'application/vnd.ms-office'),\n\t'dotx'\t=>\tarray('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'),\n\t'xlsx'\t=>\tarray('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'),\n\t'word'\t=>\tarray('application/msword', 'application/octet-stream'),\n\t'xl'\t=>\t'application/excel',\n\t'eml'\t=>\t'message/rfc822',\n\t'json'  =>\tarray('application/json', 'text/json'),\n\t'pem'   =>\tarray('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),\n\t'p10'   =>\tarray('application/x-pkcs10', 'application/pkcs10'),\n\t'p12'   =>\t'application/x-pkcs12',\n\t'p7a'   =>\t'application/x-pkcs7-signature',\n\t'p7c'   =>\tarray('application/pkcs7-mime', 'application/x-pkcs7-mime'),\n\t'p7m'   =>\tarray('application/pkcs7-mime', 'application/x-pkcs7-mime'),\n\t'p7r'   =>\t'application/x-pkcs7-certreqresp',\n\t'p7s'   =>\t'application/pkcs7-signature',\n\t'crt'   =>\tarray('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'),\n\t'crl'   =>\tarray('application/pkix-crl', 'application/pkcs-crl'),\n\t'der'   =>\t'application/x-x509-ca-cert',\n\t'kdb'   =>\t'application/octet-stream',\n\t'pgp'   =>\t'application/pgp',\n\t'gpg'   =>\t'application/gpg-keys',\n\t'sst'   =>\t'application/octet-stream',\n\t'csr'   =>\t'application/octet-stream',\n\t'rsa'   =>\t'application/x-pkcs7',\n\t'cer'   =>\tarray('application/pkix-cert', 'application/x-x509-ca-cert'),\n\t'3g2'   =>\t'video/3gpp2',\n\t'3gp'   =>\tarray('video/3gp', 'video/3gpp'),\n\t'mp4'   =>\t'video/mp4',\n\t'm4a'   =>\t'audio/x-m4a',\n\t'f4v'   =>\tarray('video/mp4', 'video/x-f4v'),\n\t'flv'\t=>\t'video/x-flv',\n\t'webm'\t=>\t'video/webm',\n\t'aac'   =>\t'audio/x-acc',\n\t'm4u'   =>\t'application/vnd.mpegurl',\n\t'm3u'   =>\t'text/plain',\n\t'xspf'  =>\t'application/xspf+xml',\n\t'vlc'   =>\t'application/videolan',\n\t'wmv'   =>\tarray('video/x-ms-wmv', 'video/x-ms-asf'),\n\t'au'    =>\t'audio/x-au',\n\t'ac3'   =>\t'audio/ac3',\n\t'flac'  =>\t'audio/x-flac',\n\t'ogg'   =>\tarray('audio/ogg', 'video/ogg', 'application/ogg'),\n\t'kmz'\t=>\tarray('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'),\n\t'kml'\t=>\tarray('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'),\n\t'ics'\t=>\t'text/calendar',\n\t'ical'\t=>\t'text/calendar',\n\t'zsh'\t=>\t'text/x-scriptzsh',\n\t'7zip'\t=>\tarray('application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),\n\t'cdr'\t=>\tarray('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'),\n\t'wma'\t=>\tarray('audio/x-ms-wma', 'video/x-ms-asf'),\n\t'jar'\t=>\tarray('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'),\n\t'svg'\t=>\tarray('image/svg+xml', 'application/xml', 'text/xml'),\n\t'vcf'\t=>\t'text/x-vcard',\n\t'srt'\t=>\tarray('text/srt', 'text/plain'),\n\t'vtt'\t=>\tarray('text/vtt', 'text/plain'),\n\t'ico'\t=>\tarray('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'),\n\t'odc'\t=>\t'application/vnd.oasis.opendocument.chart',\n\t'otc'\t=>\t'application/vnd.oasis.opendocument.chart-template',\n\t'odf'\t=>\t'application/vnd.oasis.opendocument.formula',\n\t'otf'\t=>\t'application/vnd.oasis.opendocument.formula-template',\n\t'odg'\t=>\t'application/vnd.oasis.opendocument.graphics',\n\t'otg'\t=>\t'application/vnd.oasis.opendocument.graphics-template',\n\t'odi'\t=>\t'application/vnd.oasis.opendocument.image',\n\t'oti'\t=>\t'application/vnd.oasis.opendocument.image-template',\n\t'odp'\t=>\t'application/vnd.oasis.opendocument.presentation',\n\t'otp'\t=>\t'application/vnd.oasis.opendocument.presentation-template',\n\t'ods'\t=>\t'application/vnd.oasis.opendocument.spreadsheet',\n\t'ots'\t=>\t'application/vnd.oasis.opendocument.spreadsheet-template',\n\t'odt'\t=>\t'application/vnd.oasis.opendocument.text',\n\t'odm'\t=>\t'application/vnd.oasis.opendocument.text-master',\n\t'ott'\t=>\t'application/vnd.oasis.opendocument.text-template',\n\t'oth'\t=>\t'application/vnd.oasis.opendocument.text-web'\n);\n"
  },
  {
    "path": "application/config/profiler.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------------\n| Profiler Sections\n| -------------------------------------------------------------------------\n| This file lets you determine whether or not various sections of Profiler\n| data are displayed when the Profiler is enabled.\n| Please see the user guide for info:\n|\n|\thttps://codeigniter.com/user_guide/general/profiling.html\n|\n*/\n"
  },
  {
    "path": "application/config/routes.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n  | -------------------------------------------------------------------------\n  | URI ROUTING\n  | -------------------------------------------------------------------------\n  | This file lets you re-map URI requests to specific controller functions.\n  |\n  | Typically there is a one-to-one relationship between a URL string\n  | and its corresponding controller class/method. The segments in a\n  | URL normally follow this pattern:\n  |\n  |\texample.com/class/method/id/\n  |\n  | In some instances, however, you may want to remap this relationship\n  | so that a different class/function is called than the one\n  | corresponding to the URL.\n  |\n  | Please see the user guide for complete details:\n  |\n  |\thttps://codeigniter.com/user_guide/general/routing.html\n  |\n  | -------------------------------------------------------------------------\n  | RESERVED ROUTES\n  | -------------------------------------------------------------------------\n  |\n  | There are three reserved routes:\n  |\n  |\t$route['default_controller'] = 'welcome';\n  |\n  | This route indicates which controller class should be loaded if the\n  | URI contains no data. In the above example, the \"welcome\" class\n  | would be loaded.\n  |\n  |\t$route['404_override'] = 'errors/page_missing';\n  |\n  | This route will tell the Router which controller/method to use if those\n  | provided in the URL cannot be matched to a valid route.\n  |\n  |\t$route['translate_uri_dashes'] = FALSE;\n  |\n  | This is not exactly a route, but allows you to automatically route\n  | controller and method names that contain dashes. '-' isn't a valid\n  | class or method name character, so it requires translation.\n  | When you set this option to TRUE, it will replace ALL dashes in the\n  | controller and method URI segments.\n  |\n  | Examples:\tmy-controller/index\t-> my_controller/index\n  |\t\tmy-controller/my-method\t-> my_controller/my_method\n */\n$route['(\\w{2})?/?loadlanguage/(:any)'] = \"Loader/jsFile/$2\";\n$route['default_controller'] = 'home';\n$route['404_override'] = '';\n$route['translate_uri_dashes'] = FALSE;\n\n/* ADMIN PANEL ROUTES */\n$route['admin'] = \"admin/home/login\";\n$route['admin/logout'] = \"admin/home/login/logout\";\n$route['admin/plans/requests'] = \"admin/plans/requests\";\n$route['admin/plans/requests/(:num)'] = \"admin/plans/requests/index/$1\";\n$route['admin/plans/individual/request'] = \"admin/plans/requests/custom\";\n$route['admin/plans/individual/request/(:num)'] = \"admin/plans/requests/custom/$1\";\n/* ADMIN PANEL ROUTES */\n$route['bankpayment'] = \"users/plans/PlansUsers/cardPayment\";\n/* AJAX CALLED */\n/* USERS PANEL ROUTES */\n$route['(\\w{2})?/?user'] = \"users/home\";\n$route['(\\w{2})?/?user/logout'] = \"home/logout\";\n$route['(\\w{2})?/?user/managefirms'] = \"users/managefirms/managefirms\";\n$route['(\\w{2})?/?user/managefirms/edit/(:num)'] = \"users/managefirms/managefirms/editCompany/$2\";\n$route['(\\w{2})?/?user/managefirms/edit/(:num)/(:num)'] = \"users/managefirms/managefirms/editCompany/$2/$3\";\n$route['(\\w{2})?/?user/usecompany/(:num)'] = \"users/home/home/useCompany/$2\";\n$route['(\\w{2})?/?user/managefirms/delete-translation/(:num)/(:num)'] = \"users/managefirms/managefirms/deleteTranslation/$2/$3\";\n$route['(\\w{2})?/?user/managefirms/delete-company/(:num)'] = \"users/managefirms/managefirms/deleteCompany/$2\";\n$route['(\\w{2})?/?user/managefirms/make-default/(:num)'] = \"users/managefirms/managefirms/makeDefaultFirm/$2\";\n$route['(\\w{2})?/?user/managefirms/make-default-translation/(:num)/(:num)'] = \"users/managefirms/managefirms/makeDefaultTranslation/$2/$3\";\n$route['(\\w{2})?/?user/new/invoice'] = \"users/invoices/newinvoice\";\n$route['(\\w{2})?/?user/settings/invoices'] = \"users/settings/invoices\";\n$route['(\\w{2})?/?user/defaultcurrency'] = 'users/settings/invoices/defaultcurrency'; // ajax called\n$route['(\\w{2})?/?user/settings/invoices/delete/default/(:num)'] = 'users/settings/invoices/deletedefaultcurrency/$2';\n$route['(\\w{2})?/?user/settings/invoices/delete/currency/(:num)'] = 'users/settings/invoices/deletecurrency/$2';\n$route['(\\w{2})?/?user/addnewquantitytype'] = 'users/invoices/newinvoice/addnewquantitytype'; // ajax called\n$route['(\\w{2})?/?user/settings'] = \"users/settings/settings\";\n$route['(\\w{2})?/?user/settings/invoices/delete/quantitytype/(:num)'] = 'users/settings/invoices/deletequantitytype/$2';\n$route['user/addnewpaymentmethod'] = 'users/invoices/newinvoice/addnewpaymentmethod'; // ajax called\n$route['(\\w{2})?/?user/settings/invoices/delete/paymentmethod/(:num)'] = 'users/settings/invoices/deletepaymentmethod/$2';\n$route['(\\w{2})?/?user/settings/invoices/delete/novatreason/(:num)'] = 'users/settings/invoices/deletenovatreason/$2';\n$route['(\\w{2})?/?user/modalselector'] = 'users/invoices/newinvoice/modalselector'; // ajax called\n$route['(\\w{2})?/?user/invoices'] = \"users/invoices/invoices\";\n$route['(\\w{2})?/?user/invoices/(:num)'] = \"users/invoices/invoices/index/$2\";\n$route['(\\w{2})?/?user/(invoice|pro-forma|debit-note|credit-note)/edit/(:num)'] = \"users/invoices/newinvoice/index/$2/$3\";\n$route['(\\w{2})?/?user/clients'] = \"users/clients/clients\";\n$route['(\\w{2})?/?user/clients/(:num)'] = \"users/clients/clients/index/$2\";\n$route['(\\w{2})?/?user/client/delete/(:num)'] = \"users/clients/clients/deleteclient/$2\";\n$route['(\\w{2})?/?user/client/edit/(:num)'] = \"users/clients/clients/addclient/$2\";\n$route['(\\w{2})?/?user/client/add'] = \"users/clients/clients/addclient\";\n$route['(\\w{2})?/?user/items'] = \"users/items/items\";\n$route['(\\w{2})?/?user/items/(:num)'] = \"users/items/items/index/$2\";\n$route['(\\w{2})?/?user/item/delete/(:num)'] = \"users/items/items/deleteitem/$2\";\n$route['(\\w{2})?/?user/item/edit/(:num)'] = \"users/items/items/additem/$2\";\n$route['(\\w{2})?/?user/item/add'] = \"users/items/items/additem\";\n$route['(\\w{2})?/?user/settings/employees'] = \"users/settings/employees\";\n$route['(\\w{2})?/?user/settings/employees/(:num)'] = \"users/settings/employees/index/$2\";\n$route['(\\w{2})?/?user/settings/employees/add'] = \"users/settings/employees/addnew\";\n$route['(\\w{2})?/?user/settings/employees/add/(:num)'] = \"users/settings/employees/addnew/$2\";\n$route['(\\w{2})?/?user/settings/employees/delete/(:num)'] = \"users/settings/employees/deleteemployee/$2\";\n$route['(\\w{2})?/?user/settings/employees/rights/(:num)'] = \"users/settings/employees/managerights/$2\";\n$route['(\\w{2})?/?user/admin'] = \"users/settings/admin\";\n$route['(\\w{2})?/?user/(invoice|pro-forma|debit-note|credit-note)/view/(:num)'] = \"users/invoices/invoiceview/index/$2/$3\";\n$route['(\\w{2})?/?user/(invoice|pro-forma|debit-note|credit-note)/print/(original|copy)/(:num)'] = \"users/invoices/invoiceview/viewInvoiceAsPdf/$2/$3/$4\";\n$route['(\\w{2})?/?user/invoice/delete/(:num)'] = \"users/invoices/invoices/deleteInvoice/$2\";\n$route['(\\w{2})?/?user/reports'] = \"users/reports/reports\";\n$route['(\\w{2})?/?user/settings/global'] = \"users/settings/GlobalSettings\";\n$route['(\\w{2})?/?user/changeinvoicestatus'] = 'users/invoices/invoices/changeinvoicepaymentstatus'; // ajax called\n$route['(\\w{2})?/?user/findresults'] = 'users/home/home/findresults'; // ajax called\n$route['(\\w{2})?/?user/client/view/(:num)'] = \"users/clients/clients/viewclient/$2\";\n$route['(\\w{2})?/?user/item/view/(:num)'] = \"users/items/items/viewitem/$2\";\n$route['(\\w{2})?/?user/import-export'] = \"users/import_export/ImportExport\";\n$route['(\\w{2})?/?user/store'] = \"users/store/Store\";\n$route['(\\w{2})?/?user/store/(:num)'] = \"users/store/store/index/$2\";\n$route['(\\w{2})?/?user/settings/stores'] = \"users/settings/stores\";\n$route['(\\w{2})?/?user/settings/stores/delete/store/(:num)'] = \"users/settings/stores/deletestore/$2\";\n$route['(\\w{2})?/?user/store/add-movement'] = \"users/store/Store/addmovement\";\n$route['(\\w{2})?/?user/movement/view/(:num)'] = \"users/store/movementview/index/$2\";\n$route['(\\w{2})?/?user/store-order/print/(:num)'] = \"users/store/movementview/viewMovementAsPdf/$2\";\n$route['(\\w{2})?/?user/store/stocks'] = \"users/store/Store/stocks\";\n$route['(\\w{2})?/?user/store/stocks/(:num)'] = \"users/store/Store/stocks/$2\";\n$route['(\\w{2})?/?user/warranties'] = \"users/warranty/warranty\";\n$route['(\\w{2})?/?user/warranties/(:num)'] = \"users/warranty/warranty/index/$2\";\n$route['(\\w{2})?/?user/warranties/add-warranty'] = \"users/warranty/warranty/addwarranty\";\n$route['(\\w{2})?/?user/warranty/print/(:num)'] = \"users/warranty/warrantyview/viewWarrantyAsPdf/$2\";\n$route['(\\w{2})?/?user/warranty/edit/(:num)'] = \"users/warranty/warranty/addwarranty/$2\";\n$route['(\\w{2})?/?user/settings/warranty'] = \"users/settings/warranty\";\n$route['(\\w{2})?/?user/settings/warranty/delete/condition/(:num)'] = \"users/settings/warranty/deleteCondition/$2\";\n$route['(\\w{2})?/?user/warranty/events/(:num)'] = \"users/warranty/events/index/$2\";\n$route['(\\w{2})?/?user/warranty/events/(:num)/add-event'] = \"users/warranty/events/addevent/$2\";\n$route['(\\w{2})?/?user/protocols'] = \"users/protocols/protocols\";\n$route['(\\w{2})?/?user/protocols/(:num)'] = \"users/protocols/protocols/index/$2\";\n$route['(\\w{2})?/?user/settings/protocols'] = \"users/settings/protocols\";\n$route['(\\w{2})?/?user/protocols/add-protocol'] = \"users/protocols/protocols/addprotocol\";\n$route['(\\w{2})?/?user/protocol/print/(:num)'] = \"users/protocols/protocolview/viewProtocolAsPdf/$2\";\n$route['(\\w{2})?/?user/protocol/edit/(:num)'] = \"users/protocols/protocols/addprotocol/$2\";\n$route['(\\w{2})?/?user/settings/protocols/delete/provider-transmit/(:num)'] = \"users/settings/protocols/deleteProviderTransmitText/$2\";\n$route['(\\w{2})?/?user/settings/protocols/delete/contract/(:num)'] = \"users/settings/protocols/deleteContract/$2\";\n$route['(\\w{2})?/?user/plans'] = \"users/plans/PlansUsers\";\n$route['(\\w{2})?/?user/plan/(:any)'] = \"users/plans/PlansUsers/chooseperiod/$2\";\n$route['(\\w{2})?/?user/myplan/request'] = \"users/plans/PlansUsers/planrequest\";\n$route['pdffooter'] = 'home/getinvoicefooter';\n/* USERS PANEL ROUTES */\n\n$route['^(\\w{2})$'] = $route['default_controller'];\n$route['(\\w{2})?/?login'] = \"registration/login\";\n$route['(\\w{2})?/?password-forgotten'] = \"registration/forgotten\";\n$route['(\\w{2})?/?choose-type-of-login'] = 'registration/choosetype';\n$route['accept/invoice/(:any)'] = 'home/publicAcceptInvoice/$1';\n$route['^(\\w{2})/(:any)$'] = '$2';\n"
  },
  {
    "path": "application/config/smileys.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------\n| SMILEYS\n| -------------------------------------------------------------------\n| This file contains an array of smileys for use with the emoticon helper.\n| Individual images can be used to replace multiple smileys.  For example:\n| :-) and :) use the same image replacement.\n|\n| Please see user guide for more info:\n| https://codeigniter.com/user_guide/helpers/smiley_helper.html\n|\n*/\n$smileys = array(\n\n//\tsmiley\t\t\timage name\t\t\t\t\t\twidth\theight\talt\n\n\t':-)'\t\t\t=>\tarray('grin.gif',\t\t\t'19',\t'19',\t'grin'),\n\t':lol:'\t\t\t=>\tarray('lol.gif',\t\t\t'19',\t'19',\t'LOL'),\n\t':cheese:'\t\t=>\tarray('cheese.gif',\t\t\t'19',\t'19',\t'cheese'),\n\t':)'\t\t\t=>\tarray('smile.gif',\t\t\t'19',\t'19',\t'smile'),\n\t';-)'\t\t\t=>\tarray('wink.gif',\t\t\t'19',\t'19',\t'wink'),\n\t';)'\t\t\t=>\tarray('wink.gif',\t\t\t'19',\t'19',\t'wink'),\n\t':smirk:'\t\t=>\tarray('smirk.gif',\t\t\t'19',\t'19',\t'smirk'),\n\t':roll:'\t\t=>\tarray('rolleyes.gif',\t\t'19',\t'19',\t'rolleyes'),\n\t':-S'\t\t\t=>\tarray('confused.gif',\t\t'19',\t'19',\t'confused'),\n\t':wow:'\t\t\t=>\tarray('surprise.gif',\t\t'19',\t'19',\t'surprised'),\n\t':bug:'\t\t\t=>\tarray('bigsurprise.gif',\t'19',\t'19',\t'big surprise'),\n\t':-P'\t\t\t=>\tarray('tongue_laugh.gif',\t'19',\t'19',\t'tongue laugh'),\n\t'%-P'\t\t\t=>\tarray('tongue_rolleye.gif',\t'19',\t'19',\t'tongue rolleye'),\n\t';-P'\t\t\t=>\tarray('tongue_wink.gif',\t'19',\t'19',\t'tongue wink'),\n\t':P'\t\t\t=>\tarray('raspberry.gif',\t\t'19',\t'19',\t'raspberry'),\n\t':blank:'\t\t=>\tarray('blank.gif',\t\t\t'19',\t'19',\t'blank stare'),\n\t':long:'\t\t=>\tarray('longface.gif',\t\t'19',\t'19',\t'long face'),\n\t':ohh:'\t\t\t=>\tarray('ohh.gif',\t\t\t'19',\t'19',\t'ohh'),\n\t':grrr:'\t\t=>\tarray('grrr.gif',\t\t\t'19',\t'19',\t'grrr'),\n\t':gulp:'\t\t=>\tarray('gulp.gif',\t\t\t'19',\t'19',\t'gulp'),\n\t'8-/'\t\t\t=>\tarray('ohoh.gif',\t\t\t'19',\t'19',\t'oh oh'),\n\t':down:'\t\t=>\tarray('downer.gif',\t\t\t'19',\t'19',\t'downer'),\n\t':red:'\t\t\t=>\tarray('embarrassed.gif',\t'19',\t'19',\t'red face'),\n\t':sick:'\t\t=>\tarray('sick.gif',\t\t\t'19',\t'19',\t'sick'),\n\t':shut:'\t\t=>\tarray('shuteye.gif',\t\t'19',\t'19',\t'shut eye'),\n\t':-/'\t\t\t=>\tarray('hmm.gif',\t\t\t'19',\t'19',\t'hmmm'),\n\t'>:('\t\t\t=>\tarray('mad.gif',\t\t\t'19',\t'19',\t'mad'),\n\t':mad:'\t\t\t=>\tarray('mad.gif',\t\t\t'19',\t'19',\t'mad'),\n\t'>:-('\t\t\t=>\tarray('angry.gif',\t\t\t'19',\t'19',\t'angry'),\n\t':angry:'\t\t=>\tarray('angry.gif',\t\t\t'19',\t'19',\t'angry'),\n\t':zip:'\t\t\t=>\tarray('zip.gif',\t\t\t'19',\t'19',\t'zipper'),\n\t':kiss:'\t\t=>\tarray('kiss.gif',\t\t\t'19',\t'19',\t'kiss'),\n\t':ahhh:'\t\t=>\tarray('shock.gif',\t\t\t'19',\t'19',\t'shock'),\n\t':coolsmile:'\t=>\tarray('shade_smile.gif',\t'19',\t'19',\t'cool smile'),\n\t':coolsmirk:'\t=>\tarray('shade_smirk.gif',\t'19',\t'19',\t'cool smirk'),\n\t':coolgrin:'\t=>\tarray('shade_grin.gif',\t\t'19',\t'19',\t'cool grin'),\n\t':coolhmm:'\t\t=>\tarray('shade_hmm.gif',\t\t'19',\t'19',\t'cool hmm'),\n\t':coolmad:'\t\t=>\tarray('shade_mad.gif',\t\t'19',\t'19',\t'cool mad'),\n\t':coolcheese:'\t=>\tarray('shade_cheese.gif',\t'19',\t'19',\t'cool cheese'),\n\t':vampire:'\t\t=>\tarray('vampire.gif',\t\t'19',\t'19',\t'vampire'),\n\t':snake:'\t\t=>\tarray('snake.gif',\t\t\t'19',\t'19',\t'snake'),\n\t':exclaim:'\t\t=>\tarray('exclaim.gif',\t\t'19',\t'19',\t'exclaim'),\n\t':question:'\t=>\tarray('question.gif',\t\t'19',\t'19',\t'question')\n\n);\n"
  },
  {
    "path": "application/config/user_agents.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n| -------------------------------------------------------------------\n| USER AGENT TYPES\n| -------------------------------------------------------------------\n| This file contains four arrays of user agent data. It is used by the\n| User Agent Class to help identify browser, platform, robot, and\n| mobile device data. The array keys are used to identify the device\n| and the array values are used to set the actual name of the item.\n*/\n$platforms = array(\n\t'windows nt 10.0'\t=> 'Windows 10',\n\t'windows nt 6.3'\t=> 'Windows 8.1',\n\t'windows nt 6.2'\t=> 'Windows 8',\n\t'windows nt 6.1'\t=> 'Windows 7',\n\t'windows nt 6.0'\t=> 'Windows Vista',\n\t'windows nt 5.2'\t=> 'Windows 2003',\n\t'windows nt 5.1'\t=> 'Windows XP',\n\t'windows nt 5.0'\t=> 'Windows 2000',\n\t'windows nt 4.0'\t=> 'Windows NT 4.0',\n\t'winnt4.0'\t\t\t=> 'Windows NT 4.0',\n\t'winnt 4.0'\t\t\t=> 'Windows NT',\n\t'winnt'\t\t\t\t=> 'Windows NT',\n\t'windows 98'\t\t=> 'Windows 98',\n\t'win98'\t\t\t\t=> 'Windows 98',\n\t'windows 95'\t\t=> 'Windows 95',\n\t'win95'\t\t\t\t=> 'Windows 95',\n\t'windows phone'\t\t\t=> 'Windows Phone',\n\t'windows'\t\t\t=> 'Unknown Windows OS',\n\t'android'\t\t\t=> 'Android',\n\t'blackberry'\t\t=> 'BlackBerry',\n\t'iphone'\t\t\t=> 'iOS',\n\t'ipad'\t\t\t\t=> 'iOS',\n\t'ipod'\t\t\t\t=> 'iOS',\n\t'os x'\t\t\t\t=> 'Mac OS X',\n\t'ppc mac'\t\t\t=> 'Power PC Mac',\n\t'freebsd'\t\t\t=> 'FreeBSD',\n\t'ppc'\t\t\t\t=> 'Macintosh',\n\t'linux'\t\t\t\t=> 'Linux',\n\t'debian'\t\t\t=> 'Debian',\n\t'sunos'\t\t\t\t=> 'Sun Solaris',\n\t'beos'\t\t\t\t=> 'BeOS',\n\t'apachebench'\t\t=> 'ApacheBench',\n\t'aix'\t\t\t\t=> 'AIX',\n\t'irix'\t\t\t\t=> 'Irix',\n\t'osf'\t\t\t\t=> 'DEC OSF',\n\t'hp-ux'\t\t\t\t=> 'HP-UX',\n\t'netbsd'\t\t\t=> 'NetBSD',\n\t'bsdi'\t\t\t\t=> 'BSDi',\n\t'openbsd'\t\t\t=> 'OpenBSD',\n\t'gnu'\t\t\t\t=> 'GNU/Linux',\n\t'unix'\t\t\t\t=> 'Unknown Unix OS',\n\t'symbian' \t\t\t=> 'Symbian OS'\n);\n\n\n// The order of this array should NOT be changed. Many browsers return\n// multiple browser types so we want to identify the sub-type first.\n$browsers = array(\n\t'OPR'\t\t\t=> 'Opera',\n\t'Flock'\t\t\t=> 'Flock',\n\t'Edge'\t\t\t=> 'Spartan',\n\t'Chrome'\t\t=> 'Chrome',\n\t// Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string\n\t'Opera.*?Version'\t=> 'Opera',\n\t'Opera'\t\t\t=> 'Opera',\n\t'MSIE'\t\t\t=> 'Internet Explorer',\n\t'Internet Explorer'\t=> 'Internet Explorer',\n\t'Trident.* rv'\t=> 'Internet Explorer',\n\t'Shiira'\t\t=> 'Shiira',\n\t'Firefox'\t\t=> 'Firefox',\n\t'Chimera'\t\t=> 'Chimera',\n\t'Phoenix'\t\t=> 'Phoenix',\n\t'Firebird'\t\t=> 'Firebird',\n\t'Camino'\t\t=> 'Camino',\n\t'Netscape'\t\t=> 'Netscape',\n\t'OmniWeb'\t\t=> 'OmniWeb',\n\t'Safari'\t\t=> 'Safari',\n\t'Mozilla'\t\t=> 'Mozilla',\n\t'Konqueror'\t\t=> 'Konqueror',\n\t'icab'\t\t\t=> 'iCab',\n\t'Lynx'\t\t\t=> 'Lynx',\n\t'Links'\t\t\t=> 'Links',\n\t'hotjava'\t\t=> 'HotJava',\n\t'amaya'\t\t\t=> 'Amaya',\n\t'IBrowse'\t\t=> 'IBrowse',\n\t'Maxthon'\t\t=> 'Maxthon',\n\t'Ubuntu'\t\t=> 'Ubuntu Web Browser'\n);\n\n$mobiles = array(\n\t// legacy array, old values commented out\n\t'mobileexplorer'\t=> 'Mobile Explorer',\n//  'openwave'\t\t\t=> 'Open Wave',\n//\t'opera mini'\t\t=> 'Opera Mini',\n//\t'operamini'\t\t\t=> 'Opera Mini',\n//\t'elaine'\t\t\t=> 'Palm',\n\t'palmsource'\t\t=> 'Palm',\n//\t'digital paths'\t\t=> 'Palm',\n//\t'avantgo'\t\t\t=> 'Avantgo',\n//\t'xiino'\t\t\t\t=> 'Xiino',\n\t'palmscape'\t\t\t=> 'Palmscape',\n//\t'nokia'\t\t\t\t=> 'Nokia',\n//\t'ericsson'\t\t\t=> 'Ericsson',\n//\t'blackberry'\t\t=> 'BlackBerry',\n//\t'motorola'\t\t\t=> 'Motorola'\n\n\t// Phones and Manufacturers\n\t'motorola'\t\t=> 'Motorola',\n\t'nokia'\t\t\t=> 'Nokia',\n\t'palm'\t\t\t=> 'Palm',\n\t'iphone'\t\t=> 'Apple iPhone',\n\t'ipad'\t\t\t=> 'iPad',\n\t'ipod'\t\t\t=> 'Apple iPod Touch',\n\t'sony'\t\t\t=> 'Sony Ericsson',\n\t'ericsson'\t\t=> 'Sony Ericsson',\n\t'blackberry'\t=> 'BlackBerry',\n\t'cocoon'\t\t=> 'O2 Cocoon',\n\t'blazer'\t\t=> 'Treo',\n\t'lg'\t\t\t=> 'LG',\n\t'amoi'\t\t\t=> 'Amoi',\n\t'xda'\t\t\t=> 'XDA',\n\t'mda'\t\t\t=> 'MDA',\n\t'vario'\t\t\t=> 'Vario',\n\t'htc'\t\t\t=> 'HTC',\n\t'samsung'\t\t=> 'Samsung',\n\t'sharp'\t\t\t=> 'Sharp',\n\t'sie-'\t\t\t=> 'Siemens',\n\t'alcatel'\t\t=> 'Alcatel',\n\t'benq'\t\t\t=> 'BenQ',\n\t'ipaq'\t\t\t=> 'HP iPaq',\n\t'mot-'\t\t\t=> 'Motorola',\n\t'playstation portable'\t=> 'PlayStation Portable',\n\t'playstation 3'\t\t=> 'PlayStation 3',\n\t'playstation vita'  \t=> 'PlayStation Vita',\n\t'hiptop'\t\t=> 'Danger Hiptop',\n\t'nec-'\t\t\t=> 'NEC',\n\t'panasonic'\t\t=> 'Panasonic',\n\t'philips'\t\t=> 'Philips',\n\t'sagem'\t\t\t=> 'Sagem',\n\t'sanyo'\t\t\t=> 'Sanyo',\n\t'spv'\t\t\t=> 'SPV',\n\t'zte'\t\t\t=> 'ZTE',\n\t'sendo'\t\t\t=> 'Sendo',\n\t'nintendo dsi'\t=> 'Nintendo DSi',\n\t'nintendo ds'\t=> 'Nintendo DS',\n\t'nintendo 3ds'\t=> 'Nintendo 3DS',\n\t'wii'\t\t\t=> 'Nintendo Wii',\n\t'open web'\t\t=> 'Open Web',\n\t'openweb'\t\t=> 'OpenWeb',\n\n\t// Operating Systems\n\t'android'\t\t=> 'Android',\n\t'symbian'\t\t=> 'Symbian',\n\t'SymbianOS'\t\t=> 'SymbianOS',\n\t'elaine'\t\t=> 'Palm',\n\t'series60'\t\t=> 'Symbian S60',\n\t'windows ce'\t=> 'Windows CE',\n\n\t// Browsers\n\t'obigo'\t\t\t=> 'Obigo',\n\t'netfront'\t\t=> 'Netfront Browser',\n\t'openwave'\t\t=> 'Openwave Browser',\n\t'mobilexplorer'\t=> 'Mobile Explorer',\n\t'operamini'\t\t=> 'Opera Mini',\n\t'opera mini'\t=> 'Opera Mini',\n\t'opera mobi'\t=> 'Opera Mobile',\n\t'fennec'\t\t=> 'Firefox Mobile',\n\n\t// Other\n\t'digital paths'\t=> 'Digital Paths',\n\t'avantgo'\t\t=> 'AvantGo',\n\t'xiino'\t\t\t=> 'Xiino',\n\t'novarra'\t\t=> 'Novarra Transcoder',\n\t'vodafone'\t\t=> 'Vodafone',\n\t'docomo'\t\t=> 'NTT DoCoMo',\n\t'o2'\t\t\t=> 'O2',\n\n\t// Fallback\n\t'mobile'\t\t=> 'Generic Mobile',\n\t'wireless'\t\t=> 'Generic Mobile',\n\t'j2me'\t\t\t=> 'Generic Mobile',\n\t'midp'\t\t\t=> 'Generic Mobile',\n\t'cldc'\t\t\t=> 'Generic Mobile',\n\t'up.link'\t\t=> 'Generic Mobile',\n\t'up.browser'\t=> 'Generic Mobile',\n\t'smartphone'\t=> 'Generic Mobile',\n\t'cellphone'\t\t=> 'Generic Mobile'\n);\n\n// There are hundreds of bots but these are the most common.\n$robots = array(\n\t'googlebot'\t\t=> 'Googlebot',\n\t'msnbot'\t\t=> 'MSNBot',\n\t'baiduspider'\t\t=> 'Baiduspider',\n\t'bingbot'\t\t=> 'Bing',\n\t'slurp'\t\t\t=> 'Inktomi Slurp',\n\t'yahoo'\t\t\t=> 'Yahoo',\n\t'ask jeeves'\t\t=> 'Ask Jeeves',\n\t'fastcrawler'\t\t=> 'FastCrawler',\n\t'infoseek'\t\t=> 'InfoSeek Robot 1.0',\n\t'lycos'\t\t\t=> 'Lycos',\n\t'yandex'\t\t=> 'YandexBot',\n\t'mediapartners-google'\t=> 'MediaPartners Google',\n\t'CRAZYWEBCRAWLER'\t=> 'Crazy Webcrawler',\n\t'adsbot-google'\t\t=> 'AdsBot Google',\n\t'feedfetcher-google'\t=> 'Feedfetcher Google',\n\t'curious george'\t=> 'Curious George',\n\t'ia_archiver'\t\t=> 'Alexa Crawler',\n\t'MJ12bot'\t\t=> 'Majestic-12',\n\t'Uptimebot'\t\t=> 'Uptimebot'\n);\n"
  },
  {
    "path": "application/controllers/Home.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\nclass Home extends MY_Controller\n{\n\n    private $blogLimit = 5;\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n\t\t$head['title'] = lang('title_home');\n\t\t$head['description'] = lang('description_home'); \n        $this->render('home/index', $head, $data);\n    }\n\n    public function logout()\n    {\n        unset($_SESSION['user_login']);\n        unset($_SESSION['selected_company']);\n        redirect(lang_url());\n    }\n\n    /*\n     * Called from HtmlToPdf library to load footer for invoices\n     * wkhtmltopdf cant call files for footer/header :(\n     */\n\n    public function getInvoiceFooter()\n    {\n        if (!isset($_GET['num'])) {\n            log_message('error', 'Call footer for wkhtmltopdf without GET[num] variable - ' . print_r($_SESSION['user_login'], true));\n            exit;\n        }\n        $data = array();\n        $data['num'] = $_GET['num'];\n        $data['type'] = $_GET['type'];\n        $data['pageTranslate'] = urldecode($_GET['pageTranslate']);\n        $this->load->view('invoices_parts/footer.php', $data);\n    }\n\n    public function publicAcceptInvoice($uniqid)\n    {\n        $data = array();\n\n        $arr = explode('u', $uniqid);\n        if (!isset($arr[0]) || !is_numeric($arr[0])) {\n            show_404();\n        }\n\n        $userId = $arr[0];\n        $row = $this->PublicModel->getInvoiceForAccept($userId, $uniqid);\n        if (empty($row)) {\n            log_message('error', 'Try to accept not available invoice with uniqid - ' . $uniqid);\n            show_404();\n        }\n\n        $invoice = modules::run('users/invoices/invoiceview/getInvoiceByNumber', $row['inv_type'], $row['inv_number']);\n        if ($invoice == null) {\n            show_404();\n        }\n\n        if (isset($_POST['action']) && ($_POST['action'] == 'accepted' || $_POST['action'] == 'refused')) {\n            modules::run('users/invoices/invoices/changeInvoiceStatus', $invoice['id'], $_POST['action']);\n            if ($_POST['action'] == 'accepted') {\n                $action = 'accepted';\n                $info = '';\n            } else {\n                $action = 'refused';\n                $info = $_POST['refuse_reason'];\n            }\n            $this->PublicModel->setInvoiceLog($invoice['id'], $action, $info);\n            redirect(base_url('accept/invoice/' . $invoice['uniqid']));\n        }\n\n        $template = $this->PublicModel->getOneValueStore('opt_invTemplate', $userId);\n\n        $templates = $this->config->item('templates');\n        if (!in_array($template, $templates)) {\n            $template = $templates[0];\n        }\n\n        $templatesDir = 'application/modules/users/views/invoices/templates/';\n        $templateFile = $templatesDir . $template . '.php';\n        if (!is_file($templateFile)) {\n            show_error(lang('no_template_file'));\n        }\n        $data['templateFile'] = $templateFile;\n        $data['invoice'] = $invoice;\n        $data['origin'] = 'original';\n        $this->load->view('parts/invaccept/header');\n        $this->load->view('invoices_parts/invoice_accept', $data);\n        $this->load->view('parts/invaccept/footer');\n    }\n\n}\n"
  },
  {
    "path": "application/controllers/Loader.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n/* Set internal character encoding to UTF-8 */\nmb_internal_encoding(\"UTF-8\");\n\nclass Loader extends MY_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->helper('file');\n    }\n\n    /*\n     * Load language javascript file\n     */\n\n    public function jsFile($file = null)\n    {\n        $contents = file_get_contents(APPPATH . 'language' . DIRECTORY_SEPARATOR . MY_LANGUAGE_FULL_NAME . DIRECTORY_SEPARATOR . 'js' . DIRECTORY_SEPARATOR . $file);\n        if (!$contents) {\n            header('HTTP/1.1 404 Not Found');\n            return;\n        }\n        echo $contents;\n    }\n\n}\n"
  },
  {
    "path": "application/controllers/Registration.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\nclass Registration extends MY_Controller\n{\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        if (isset($_POST['email'])) {\n\n            if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {\n                $this->session->set_flashdata('resultRegister', 'Invalid email');\n                redirect(lang_url('registration'));\n            }\n\n            $takenEmail = $this->PublicModel->checkUserFreeEmail($_POST['email']);\n            if($takenEmail !== true) {\n                $this->session->set_flashdata('resultRegister', $takenEmail);\n                redirect(lang_url('registration'));\n            }\n\n            $result = $this->PublicModel->registerUser($_POST);\n            if ($result === true) {\n                // $returned_email = $this->registerUser();\n                // $this->setUserLogin($returned_email, 1);\n                redirect(lang_url('login'));\n            } else {\n                $this->session->set_flashdata('resultRegister', $result);\n                redirect(lang_url('registration'));\n            }\n        }\n        $head['title'] = lang('title_register');\n        $head['description'] = lang('description_register');\n        $this->render('registration/index', $head, $data);\n    }\n\n    public function login()\n    {\n        $data = array();\n        $head = array();\n        if (isset($_POST['email'])) {\n            $this->loginCheck();\n        }\n        $head['title'] = lang('title_login');\n        $head['description'] = lang('description_login');\n        $this->render('registration/login', $head, $data);\n    }\n\n    private function loginCheck()\n    {\n        $result = $this->PublicModel->loginCheck($_POST);\n        if ($result !== false) {\n            if ($result == 3) {\n                $_SESSION['savedPost'] = $_POST;\n                redirect(lang_url('choose-type-of-login'));\n            } else {\n                $this->setUserLogin($_POST['email'], $result);\n            }\n        } else {\n            $this->session->set_flashdata('email', $_POST['email']);\n            $this->session->set_flashdata('loginErrors', lang('usr_or_pass_invalid'));\n            redirect(lang_url('login'));\n        }\n    }\n}\n"
  },
  {
    "path": "application/controllers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/core/ADMIN_Controller.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Gitgub:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass ADMIN_Controller extends HEAD_Controller\n{\n\n    protected $history;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->helper(array('pagination', 'uploader', 'except_letters'));\n        $this->load->model(array('GeneralAdminModel'));\n        $this->login_check();\n        $this->history = $this->config->item('admin_history');\n    }\n\n    protected function render($view, $head, $data = null)\n    {\n        $this->load->view('parts/general/header', $head);\n        $this->load->view($view, $data);\n        $this->load->view('parts/general/footer');\n    }\n\n    /*\n     * If we dont have logged session and try to open \n     * different page from just /admin/ (login)..\n     */\n\n    private function login_check()\n    {\n        if (!$this->session->userdata('logged_in') && $this->uri->segment(2) != null) {\n            redirect('admin');\n        }\n        $this->username = $this->session->userdata('logged_in');\n        $this->user_id = @$_SESSION['logged_user_info']['id'];\n    }\n\n    protected function saveHistory($activity)\n    {\n        if ($this->history === true) {\n            $this->GeneralAdminModel->setHistory($activity, $this->username, $this->user_id);\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/core/HEAD_Controller.php",
    "content": "<?php\n\nclass HEAD_Controller extends MX_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct(); \n        $this->output->enable_profiler(ENVIRONMENT == 'development');\n    }\n\n}\n"
  },
  {
    "path": "application/core/MY_Controller.php",
    "content": "<?php\n\nclass MY_Controller extends HEAD_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function render($view, $head, $data = null)\n    {\n        $this->load->view('parts/header', $head);\n        $this->load->view($view, $data);\n        $this->load->view('parts/footer');\n    }\n\n    public function setUserLogin($email, $type)\n    {\n        $userInfo = $this->PublicModel->getUserInfoFromEmail($email, $type);\n        if (!empty($userInfo)) {\n            if ($type == 2) {\n                $email = $userInfo['employee']['email'];\n            } else {\n                $email = $userInfo['user']['email'];\n            }\n            $_SESSION['user_login'] = array(\n                'email' => $email,\n                'type' => $type\n            );\n            redirect(lang_url('user'));\n        } else {\n            log_message('error', ':Error: - Cant set user login for email: ' . $email);\n            redirect(base_url());\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/core/MY_Loader.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\r\n\r\n/* load the MX_Loader class */\r\nrequire APPPATH.\"third_party/MX/Loader.php\";\r\n\r\nclass MY_Loader extends MX_Loader {}"
  },
  {
    "path": "application/core/MY_Router.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\r\n\r\n/* load the MX_Router class */\r\nrequire APPPATH.\"third_party/MX/Router.php\";\r\n\r\nclass MY_Router extends MX_Router {}"
  },
  {
    "path": "application/core/USER_Controller.php",
    "content": "<?php\n\nclass USER_Controller extends HEAD_Controller\n{\n\n    private $firms;\n    protected $firmInfo;\n    public $userInfo;\n    public $planUnits;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->loginCheck();\n        $this->load->helper(array(\n            'uploader',\n            'pagination'\n        ));\n        $this->load->library(array(\n            'MailSend',\n            'Plans'\n        ));\n        $this->planUnits = $this->plans->getMyCurrentPlanUnits();\n        $this->firmCkecker();\n    }\n\n    public function render($view, $head, $data = null)\n    {\n        $vars = array();\n        $vars = $this->loadValueStores();\n        $vars['myFirms'] = $this->firms;\n        $vars['canUseFirms'] = $this->canUseFirms;\n        $vars['firmInfo'] = $this->firmInfo;\n        $this->load->vars($vars);\n        $head['planUnits'] = $this->planUnits;\n        $this->load->view('parts/header', $head);\n        $this->load->view($view, $data);\n        $this->load->view('parts/footer');\n    }\n\n    /*\n     * If session type == 2 is employee\n     * and return info for him\n     */\n\n    private function loginCheck()\n    {\n        if (!isset($_SESSION['user_login'])) {\n            redirect(lang_url('login'));\n        } else {\n            $userInfo = $this->PublicModel->getUserInfoFromEmail($_SESSION['user_login']['email'], $_SESSION['user_login']['type']);\n            if (!empty($userInfo) && $userInfo['user'] != null) {\n                $this->userInfo = $userInfo;\n                /*\n                 *  DEFINE USER AND EMPLOYEE CONSTANTS\n                 */\n                define('USER_ID', $userInfo['user']['id']);\n                if (isset($userInfo['employee'])) {\n                    define('EMPLOYEE_ID', $userInfo['employee']['id']);\n                }\n                $this->loadPermissions();\n            } else {\n                log_message('error', ':Error: - User try to login, he have session but cant get user info from email: ' . $_SESSION['user_login']);\n                redirect(base_url());\n            }\n        }\n    }\n\n    private function loadPermissions()\n    {\n        $permissions = null;\n        if (defined('EMPLOYEE_ID')) {\n            $this->load->model('SettingsModel');\n            $permissions = $this->SettingsModel->getPermissions();\n        }\n        $this->load->library('permissions', $permissions);\n    }\n\n    /*\n     * Check user or employee selected firm\n     * Check rights to access selected firm\n     */\n\n    private function firmCkecker()\n    {\n        $this->load->model('HomeModel');\n        $defaultFirmForUser = $this->HomeModel->getDefaultCompany();\n        $firmsForUser = $this->HomeModel->getFirms();\n        if (isset($_SESSION['selected_company'])) {\n            $isValidFirmForUser = $this->HomeModel->checkCompanyIsValidForUser($_SESSION['selected_company']['id']);\n            if (!empty($isValidFirmForUser)) {\n                $selectedFirmId = $_SESSION['selected_company']['id'];\n                $this->firmInfo = $isValidFirmForUser;\n            } else {\n                $selectedFirmId = $defaultFirmForUser['id'];\n                $this->firmInfo = $defaultFirmForUser;\n                unset($_SESSION['selected_company']);\n            }\n        } else {\n            $selectedFirmId = $defaultFirmForUser['id'];\n            $this->firmInfo = $defaultFirmForUser;\n        }\n        if (!defined('EMPLOYEE_ID')) {\n            $firmId = $selectedFirmId;\n            $canUseFirms = array();\n            foreach ($firmsForUser as $frm) {\n                array_push($canUseFirms, $frm['id']);\n            }\n        } else {\n            $employeeFirms = $canUseFirms = $this->HomeModel->getEmployeeAvailableFirms();\n            if (!empty($employeeFirms)) {\n                if (in_array($selectedFirmId, $employeeFirms)) {\n                    $firmId = $selectedFirmId;\n                } else {\n                    $firmId = $employeeFirms[0];\n                }\n            } else {\n                show_error(lang('you_cant_view_any_firms'));\n            }\n        }\n        define('SELECTED_COMPANY_ID', $firmId);\n        $this->firms = $firmsForUser;\n        $this->canUseFirms = $canUseFirms;\n        if (empty($firmsForUser) && (uri_string() != 'user' && uri_string() != $this->language->getUrlAbbrevation() . '/user')) {\n            redirect(lang_url('user'));\n        }\n        $this->checkExceededLimitOfCompanies();\n    }\n\n    /*\n     * if we have added companies\n     * check how many companies we can use\n     * for selected plan\n     */\n\n    private function checkExceededLimitOfCompanies()\n    {\n        if (!empty($this->firms)) {\n            $planUnits = $this->planUnits;\n            if (count($this->firms) > $planUnits['num_firms']) {\n                // pages that are allowed to view\n                if (uri_string() != 'user/managefirms' &&\n                        uri_string() != $this->language->getUrlAbbrevation() . '/user/managefirms' &&\n                        $this->uri->segment(2) != 'plans' &&\n                        $this->uri->segment(2) != 'plan' &&\n                        $this->uri->segment(2) != 'myplan') {\n                    redirect(lang_url('user/managefirms'));\n                }\n            }\n        }\n    }\n\n    public function saveHistory()\n    {\n        //INSERT DELAYED\n    }\n\n    protected function validateCompanyDetails($checkBulstat = true)\n    {\n        $errors = array();\n        if (mb_strlen(trim($_POST['firm_name'])) == 0) {\n            $errors[] = lang('empty_firm_name');\n        }\n        if ($checkBulstat === true) {\n            if (mb_strlen(trim($_POST['firm_bulstat'])) == 0) {\n                $errors[] = lang('empty_firm_bulstat');\n            } else {\n                $result = $this->checkBulstatIsFree();\n                if ($result == false) {\n                    $errors[] = lang('bulstat_is_taken');\n                }\n            }\n        }\n        if (mb_strlen(trim($_POST['firm_reg_address'])) == 0) {\n            $errors[] = lang('empty_firm_reg_address');\n        }\n        if (mb_strlen(trim($_POST['firm_city'])) == 0) {\n            $errors[] = lang('empty_firm_city');\n        }\n        if (mb_strlen(trim($_POST['firm_mol'])) == 0) {\n            $errors[] = lang('empty_firm_mol');\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        $this->session->set_flashdata('firm_name', $_POST['firm_name']);\n        $this->session->set_flashdata('firm_bulstat', @$_POST['firm_bulstat']);\n        $this->session->set_flashdata('firm_reg_address', $_POST['firm_reg_address']);\n        $this->session->set_flashdata('firm_city', $_POST['firm_city']);\n        $this->session->set_flashdata('firm_mol', $_POST['firm_mol']);\n        return $errors;\n    }\n\n    protected function addCompanyFolders($companyId)\n    {\n        if (!mkdir('./attachments/' . COMPANIES_IMAGES_DIR . '/' . $companyId, 0777)) {\n            log_message('error', 'Error create company folder: ./attachments/' . COMPANIES_IMAGES_DIR . '/' . $companyId);\n        }\n    }\n\n    private function checkBulstatIsFree()\n    {\n        $result = $this->HomeModel->checkBulstatIsFree($_POST['firm_bulstat']);\n        return $result;\n    }\n\n    private function loadValueStores()\n    {\n        $result = $this->PublicModel->getValueStores();\n        if (empty($result)) {\n            show_error(lang('error_load_options'));\n        }\n        return $result;\n    }\n\n}\n"
  },
  {
    "path": "application/core/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/helpers/except_letters_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nfunction except_letters($str)\n{\n    return mb_ereg_replace('[^a-zA-Zа-яА-Я0-9\\s]', '', $str);\n}\n"
  },
  {
    "path": "application/helpers/full_document_number_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH'))\n    exit('No direct script access allowed');\n\nfunction full_document_number($inv, $length = 10, $padding = '0')\n{\n    return str_pad(intval($inv), intval($length), $padding, STR_PAD_LEFT);\n}\n"
  },
  {
    "path": "application/helpers/get_client_ip_address_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nfunction get_client_ip_address()\n{\n    $ipaddress = '';\n    if (isset($_SERVER['HTTP_CLIENT_IP']))\n        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];\n    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))\n        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];\n    else if (isset($_SERVER['HTTP_X_FORWARDED']))\n        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];\n    else if (isset($_SERVER['HTTP_FORWARDED_FOR']))\n        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];\n    else if (isset($_SERVER['HTTP_FORWARDED']))\n        $ipaddress = $_SERVER['HTTP_FORWARDED'];\n    else if (isset($_SERVER['REMOTE_ADDR']))\n        $ipaddress = $_SERVER['REMOTE_ADDR'];\n    else\n        $ipaddress = 'UNKNOWN';\n    return $ipaddress;\n}\n"
  },
  {
    "path": "application/helpers/geterror_helper.php",
    "content": "<?php\nif (!defined('BASEPATH'))\n    exit('No direct script access allowed');\n\n/*\n * Return error message\n */\n\nfunction geterror($input)\n{\n    if (is_array($input)) {\n        $output = implode('<br>', $input);\n    } else {\n        $output = $input;\n    }\n    ?>\n    <div class=\"alert-errors\">\n        <?= $output ?>\n        <a href=\"javascript:void(0);\" class=\"close-alert\">\n            <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n        </a>\n    </div>\n    <?php\n}\n"
  },
  {
    "path": "application/helpers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/helpers/lang_url_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH'))\n    exit('No direct script access allowed');\n\n/*\n * Constant LANG_URL is comming from class Language\n * This function returns the full url with selected language\n * Can be used for links.. like navigation or others..\n */\n\nfunction lang_url($goto = null)\n{\n    if ($goto != null) {\n        $goto = '/' . ltrim($goto, '/');\n    }\n    return trim(LANG_URL) . trim($goto);\n}\n"
  },
  {
    "path": "application/helpers/pagination_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n/*\n * Bootstrap Pagination Helper\n */\n\nfunction pagination($url, $rowscount, $per_page, $segment = 2)\n{\n    $ci = & get_instance();\n    $ci->load->library('pagination');\n\n    $config = array();\n    $config[\"base_url\"] = lang_url($url);\n    $config[\"total_rows\"] = $rowscount;\n    $config[\"per_page\"] = $per_page;\n    $config[\"uri_segment\"] = $segment;\n    $config['full_tag_open'] = '<nav><ul class=\"pagination\">';\n    $config['full_tag_close'] = '</ul></nav>';\n    $config['num_tag_open'] = '<li>';\n    $config['num_tag_close'] = '</li>';\n    $config['cur_tag_open'] = '<li class=\"active\"><a>';\n    $config['cur_tag_close'] = '</a></li>';\n    $config['next_tag_open'] = '<li>';\n    $config['next_tag_close'] = '</li>';\n    $config['prev_tag_open'] = '<li>';\n    $config['prev_tag_close'] = '</li>';\n    $config['first_link'] = lang('first');\n    $config['first_tag_open'] = '<li>';\n    $config['first_tag_close'] = '</li>';\n    $config['last_link'] = lang('last');\n    $config['last_tag_open'] = '<li>';\n    $config['last_tag_close'] = '</li>';\n    $config['next_link'] = lang('next');\n    $config['prev_link'] = lang('previous');\n    $config['reuse_query_string'] = TRUE;\n    $ci->pagination->initialize($config);\n    return $ci->pagination->create_links();\n}\n"
  },
  {
    "path": "application/helpers/thisyeardates_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\n/*\n * return first day and last day from this year\n */\n\nfunction thisyeardates()\n{\n    $array = array();\n    $date = new DateTime('now');\n    $date->modify('first day of January ' . date('Y'));\n    $array['from'] = $date->format('d.m.Y');\n\n    $date = new DateTime('now');\n    $date->modify('last day of December ' . date('Y'));\n    $array['to'] = $date->format('d.m.Y');\n    return $array;\n}\n"
  },
  {
    "path": "application/helpers/uploader_helper.php",
    "content": "<?php\n\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nfunction uploader($path, $inputName = false)\n{\n    if ($inputName === false) {\n        $iName = 'input_file';\n    } else {\n        $iName = $inputName;\n    }\n\n    $ci = & get_instance();\n    if ($_FILES[$iName]['size'] == 0) {\n        return false;\n    }\n    $config = array();\n    $config['upload_path'] = $path;\n    $config['allowed_types'] = $ci->config->item('allowed_img_types');\n    $ci->load->library('upload', $config);\n    $ci->upload->initialize($config);\n    if (!$ci->upload->do_upload($iName)) {\n        log_message('error', 'Image Upload Error: ' . $ci->upload->display_errors());\n        return array('result' => false, 'value' => $ci->upload->display_errors());\n    }\n    $img = $ci->upload->data();\n    if ($img['file_name'] != null) {\n        return array('result' => true, 'value' => $img['file_name']);\n    }\n    return false;\n}\n"
  },
  {
    "path": "application/hooks/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/language/bulgarian/db_lang.php",
    "content": ""
  },
  {
    "path": "application/language/bulgarian/email_lang.php",
    "content": ""
  },
  {
    "path": "application/language/bulgarian/form_validation_lang.php",
    "content": "<?php\n\n "
  },
  {
    "path": "application/language/bulgarian/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/language/bulgarian/js/all.js",
    "content": "var lang = {\n    invalid_email: 'Невалиден имейл адрес!',\n    invalid_pass: 'Въведете парола!',\n    invalid_pass2: 'Повтори паролата!',\n    passwords_dont_match: 'Паролите не съвшадат!',\n    rules_not_checked: 'Потвърди правилата!',\n    proforma: 'Проформа',\n    invoice: 'Данъчна',\n    debit_note: 'Дебитно известие',\n    credit_note: 'Кредитно известие',\n    errorCreateDocument: 'Намерихме следните празни полета',\n    currencyItemNotSame: 'Въведената цена за този артикул е с различна валута',\n    errorCreateClient: 'Има празни полета на клиента!',\n    errorCreateItem: 'Има празни полета на артикул!',\n    errorCreateEmployee: 'Невалидни полета!',\n    noCheckedCheckboxes: 'Не е избрано нищо!',\n    confirmDelete: 'Сигурен ли сте, че искате да изтриете?',\n    errorChangeInvStatusAjax: 'Проблем със смяната на статуса на фактурата. Свържете се с нас!',\n    confirmCancel: 'Сигурен ли сте, че искате да анулирате?',\n    confirmRemoveCancel: 'Сигурен ли сте, че искате да премахнете статус анулирана?',\n    show_main_menu: 'Покажи менюто',\n    hide_main_menu: 'Скрий менюто'\n};"
  },
  {
    "path": "application/language/bulgarian/pagination_lang.php",
    "content": "<?php \n$lang['first'] = 'Първа';\n$lang['last'] = 'Последна';\n$lang['next'] = 'Следваща';\n$lang['previous'] = 'Предишна';\n$lang['previous'] = 'Предишна';\n$lang['pagination_last_link'] = 'Последна';\n$lang['pagination_first_link'] = 'Първа';\n"
  },
  {
    "path": "application/language/bulgarian/profiler_lang.php",
    "content": "<?php ?>\n"
  },
  {
    "path": "application/language/bulgarian/public_lang.php",
    "content": "<?php\n\n$lang['btn_home'] = 'Начало';\n$lang['btn_register'] = 'Регистрирай се безплатно';\n$lang['btn_plans'] = 'Планове';\n$lang['btn_features'] = 'Функционалности';\n$lang['btn_help'] = 'Помощ';\n$lang['btn_contacts'] = 'Контакти';\n$lang['btn_login'] = 'Вход';\n$lang['header_text'] = 'Лесно издаване и изпращане на фактури';\n$lang['login_email'] = 'Имейл';\n$lang['login_pass'] = 'Парола';\n$lang['btn_logme'] = 'Вход';\n$lang['home_slide_tx1'] = 'Създай';\n$lang['home_slide_free'] = 'безплатно';\n$lang['check_our_options'] = 'Виж какво предлагаме!';\n$lang['home_slide_register_now'] = 'Регистрирай се!';\n$lang['electronic_invoices'] = 'електронни &nbsp&nbspфактури';\n$lang['register_now'] = 'Регистрирай се!';\n$lang['text_register_after_carousel'] = 'Регистрирай';\n$lang['text_free_after_carousel'] = 'безплатен';\n$lang['text_account_after_carousel'] = 'акаунт и почни да издаваш фактури!';\n$lang['text_bottom_after_carousel'] = 'Регистрацията е само с попълване на 3 полета и отнема по-малко от 1 минута!';\n$lang['what_is'] = 'Какво е';\n$lang['and_how_it_works'] = 'и как работи?';\n$lang['forgotten_pass'] = 'Забравена парола?';\n$lang['one_acc'] = '1 акаунт - няколко фирми';\n$lang['send_by_email'] = 'Изпращане по имейл';\n$lang['invent_store'] = 'Складова програма';\n$lang['down_pdf'] = 'Свали в PDF';\n$lang['24_support'] = '27/7 Поддръжка';\n$lang['inv_templates'] = 'Дизайни на фактури';\n$lang['become_member_in_3'] = 'Изпращане на фактури!';\n$lang['payment_methods'] = 'Начини на плащане';\n$lang['support_footer'] = 'Поддръжка';\n$lang['support_questions'] = 'Често задавани въпроси';\n$lang['support_menu'] = 'Създай фактура';\n$lang['comming_features'] = 'Функционалности които скоро ще добавим';\n$lang['registration_modal'] = 'Регистрация';\n$lang['reg_email'] = 'Вашият имейл адрес';\n$lang['reg_pass'] = 'Вашата парола';\n$lang['reg_pass_repeat'] = 'Повтори паролата';\n$lang['reg_p_email'] = 'yourname@domain.com';\n$lang['reg_p_secret'] = 'Тайна парола';\n$lang['reg_p_secret2'] = 'Повтори тайната парола';\n$lang['close'] = 'Затвори';\n$lang['register_me'] = 'Регистрирай ме';\n$lang['confirm_rules'] = 'Потвърди правилата';\n$lang['read_rules'] = 'Правила и условия';\n$lang['write_us'] = 'Изпрати ни съобщение';\n$lang['contacts'] = 'Контакти';\n$lang['or_send_to'] = 'или изпрати до';\n$lang['your_name'] = 'Вашето име';\n$lang['your_email'] = 'Вашият имейл';\n$lang['your_subject'] = 'Тема на съобщението';\n$lang['send'] = 'Изпрати';\n$lang['we_received'] = 'Благодарим ви! Получихме вашето съобщение и ще ви отговорим скоро!';\n$lang['find_by_keyword'] = 'Търси по дума:';\n$lang['term'] = 'Термин';\n$lang['find_by_tags'] = 'Тагове:';\n$lang['published'] = 'публикувана';\n$lang['features'] = 'Функционалности';\n$lang['registration'] = 'Регистрация';\n$lang['register_account'] = 'Регистрирай акаунт';\n$lang['i_have_account'] = 'Вече имам регистриран акаунт';\n$lang['login'] = 'Вход';\n$lang['log_to_your_acc'] = 'Вход в акаунта';\n$lang['invalid_email'] = 'Невалиден имейл адрес!';\n$lang['empty_password'] = 'Не е въведена парола!';\n$lang['empty_password_repeat'] = 'Моля повторете паролата!';\n$lang['passwords_dont_match'] = 'Паролите не съвпадат!';\n$lang['rules_not_checked'] = 'Не сте се съгласили с правилата!';\n$lang['blog_preview'] = 'Преглед';\n$lang['recover_your_pass'] = 'Възстановяване на парола';\n$lang['send_pass_link'] = 'Изпрати ми нова парола';\n$lang['help_footer'] = 'Прочетете често задаваните въпроси, ако имате допълнителна нужда пишете ни!';\n$lang['help'] = 'ПОМОЩ';\n$lang['specifications'] = 'Спецификаций';\n$lang['plans'] = 'Планове';\n$lang['store'] = 'Склад';\n$lang['saved_clients'] = 'Клиенти';\n$lang['saved_articles'] = 'Артикули';\n$lang['create_protocols'] = 'Създаване на протоколи';\n$lang['periodic_invoices'] = 'Периодични фактури';\n$lang['registered_by_user'] = 'Този имейл адрес е регистриран от друг потребител.';\n$lang['usr_or_pass_invalid'] = 'Имейла или паролата е грешен!';\n$lang['database_error'] = 'Има някакъв проблем! Моля свържете се с нас!';\n$lang['choose_type_of_login'] = 'Избери тип на вход за потребител';\n$lang['there_are_two_types'] = 'Има два типа за вход на този имейл и парола!';\n$lang['type_employee'] = 'Вход като служител';\n$lang['type_user'] = 'Вход като администратор';\n$lang['example_of_xml_import_file'] = 'Пример на XML файл за импорт';\n$lang['imports_feature'] = 'Импортиране на фактури';\n$lang['universal_xml'] = 'Универсален XML импорт';\n$lang['exports_feature'] = 'Експортиране на фактури';\n$lang['export_in_xml'] = 'Експорт в XML';\n$lang['xml_export_info'] = 'Също поддъжваме експорт в XML (същото е като Универсален XML файл за импорт) ,но с включени артикули';\n$lang['export_in_excel'] = 'Експорт в EXCEL';\n$lang['excel_export_info'] = 'Също поддържаме експорт в XLS с информация за фактура и клиент. Експортираните полета са: Invoice Number | Invoice Type | Client Name | Client Address | Client Bulstat/PIN | Client Vat Number | Client Accountable person | Date of issue | Date Tax Event | Invoice Amount | Discount | Tax Base | Vat Sum | Total | Currency | Payment Type | Payment status | Compiled | Sended | Received | Date of receive | Return reason | Date created | Vat Reason | Remarks | Maturity date';\n$lang['create_and_send_inv_with'] = 'Създавай и изпращай фактури с';\n$lang['p_reason'] = 'Причина';\n$lang['log_me_public_home'] = 'Вход в системата ми';\n$lang['use_it_online'] = 'Използвай онлайн';\n$lang['there_is']  ='Няма';\n$lang['no_need'] = 'нужда';\n$lang['to_down_noth'] = 'да сваляте нищо. Можете да я използвате изцяло';\n$lang['high_protect_serve'] = 'онлайн и да пазите информацията си на силно защитените ни сървъри.';\n$lang['have_support'] = 'Имайте постоянен';\n$lang['every_day_and_hour']='съпорт'; \n$lang['make_it_easy'] ='Издавай всеки месец до 5 фактури безплатно!';\n$lang['reg_for_free_use_for'] = 'Издавай и изпращай фактури първият месец безплатно, след това само за 100лв на година. Регистрацията отнема 1 минута';\n$lang['issue_to_5'] = 'Издавай всеки месец до 5 фактури безплатно!';\n$lang['security'] = 'Защита и криптиране';"
  },
  {
    "path": "application/language/bulgarian/titles_lang.php",
    "content": "<?php\r\n\r\n$lang['title_home'] = 'Електронни фактури, Изпращане по електронна поща';\r\n$lang['description_home'] = 'Стартирайте издаването и изпращането на електронни фактури';\r\n\r\n$lang['title_login'] = 'Влезте и започнете да издавате фактури';\r\n$lang['description_login'] = 'Въведете имейла и паролата си и влезте в програмата си за фактуриране';\r\n\r\n$lang['title_register'] = 'Регистрация';\r\n$lang['description_register'] = 'Регистрирайте се просто като въведете имейл и парола';\r\n\r\n$lang['title_forgotten'] = 'Възстановете паролата си';\r\n$lang['description_forgotten'] = 'Променете забравената си парола';"
  },
  {
    "path": "application/language/bulgarian/upload_lang.php",
    "content": "<?php\n\n$lang['upload_userfile_not_set'] = \"Unable to find a post variable called userfile.\";\n$lang['upload_file_exceeds_limit'] = \"The uploaded file exceeds the maximum allowed size in your PHP configuration file.\";\n$lang['upload_file_exceeds_form_limit'] = \"The uploaded file exceeds the maximum size allowed by the submission form.\";\n$lang['upload_file_partial'] = \"The file was only partially uploaded.\";\n$lang['upload_no_temp_directory'] = \"The temporary folder is missing.\";\n$lang['upload_unable_to_write_file'] = \"The file could not be written to disk.\";\n$lang['upload_stopped_by_extension'] = \"The file upload was stopped by extension.\";\n$lang['upload_no_file_selected'] = \"You did not select a file to upload.\";\n$lang['upload_invalid_filetype'] = \"The filetype you are attempting to upload is not allowed.\";\n$lang['upload_invalid_filesize'] = \"The file you are attempting to upload is larger than the permitted size.\";\n$lang['upload_invalid_dimensions'] = \"The image you are attempting to upload exceedes the maximum height or width.\";\n$lang['upload_destination_error'] = \"A problem was encountered while attempting to move the uploaded file to the final destination.\";\n$lang['upload_no_filepath'] = \"The upload path does not appear to be valid.\";\n$lang['upload_no_file_types'] = \"You have not specified any allowed file types.\";\n$lang['upload_bad_filename'] = \"The file name you submitted already exists on the server.\";\n$lang['upload_not_writable'] = \"The upload destination folder does not appear to be writable.\";\n"
  },
  {
    "path": "application/language/bulgarian/users_lang.php",
    "content": "<?php\n\n$lang['change_firm'] = 'Смени фирмата';\n$lang['manage_firms'] = 'Оправление на фирми';\n$lang['search_header_u'] = 'Търси';\n$lang['menu_create_invoice'] = 'Създай фактура';\n$lang['menu_list_invoices'] = 'Мойте фактури';\n$lang['dont_have_firms'] = ' Нямате създадени фирми';\n$lang['no_firm_data'] = 'Въведете данни на фирмата ви';\n$lang['firm_name'] = 'Име на фирмата:';\n$lang['firm_bulstat'] = 'Булстат:';\n$lang['firm_reg_address'] = 'Адрес на регистрация:';\n$lang['firm_city'] = 'Град:';\n$lang['firm_mol'] = 'Мол:';\n$lang['save_firm_details'] = 'Запиши';\n$lang['empty_firm_name'] = 'Не е въведено име на фирмата!';\n$lang['empty_firm_bulstat'] = 'Не е въведен булстат!';\n$lang['empty_firm_reg_address'] = 'Не е въведен адрес на регистрация!';\n$lang['empty_firm_city'] = 'не е въведен град!';\n$lang['empty_firm_mol'] = 'Не е въведен мол!';\n$lang['bulstat_is_taken'] = 'Този булстат вече е регистриран!';\n$lang['menu_home'] = 'Начало';\n$lang['selected_home'] = 'Начало';\n$lang['selected_manage_firms'] = 'Управление на фирми';\n$lang['add_new_company'] = 'Добави фирма';\n$lang['list_firms'] = 'Списък на мойте фирми';\n$lang['firm_default'] = 'По подразбиране';\n$lang['make_firm_default'] = 'Направи по подразбиране';\n$lang['delete_firm_confirm'] = 'Сигурни ли сте, че искате да изтриете тази фирма? Това ще изтрие всичко свързано с нея!';\n$lang['default_firm_confirm'] = 'Сигурни ли сте, че искате тази фирма да е по подразбиране?';\n$lang['menu_list_clients'] = 'Клиенти';\n$lang['company_deleted'] = 'Фирмата е изтрита!';\n$lang['company_added'] = 'Фирмата е добавена!';\n$lang['firms_translations'] = 'Преводи';\n$lang['trans_name'] = 'Име на превод(за вътрешно ползване):';\n$lang['firm_image'] = 'Лого';\n$lang['no_image'] = 'Няма снимка';\n$lang['add_new_translation'] = 'Добави нов превод';\n$lang['save_changes'] = 'Запиши промените';\n$lang['save_translation'] = 'Запиши превода';\n$lang['translation_updated'] = 'Превода е обновен успешно!';\n$lang['upload_img_error'] = 'Проблем при качване на картинка - ';\n$lang['add_translation'] = 'Добави превод';\n$lang['new_translation_added'] = 'Новият превод е добавен!';\n$lang['translation_is_default'] = 'По подразбиране';\n$lang['make_translation_default'] = 'Направи по подразбиране';\n$lang['default_translate_confirm'] = 'Сигурни ли сте, че искате да направите този превод по подразбиране?';\n$lang['delete_translation'] = 'Изтрий превода';\n$lang['translation_deleted'] = 'Превода е изтрит успешно';\n$lang['translation_delete_confirm'] = 'Сигурни ли сте, че искате да изтриете този превод?';\n$lang['error_delete_translation'] = 'Проблем с изтриването на превода!';\n$lang['invoice'] = 'Фактура';\n$lang['create_inv_type'] = 'Тип:';\n$lang['create_inv_proforma'] = 'Проформа';\n$lang['create_inv_debit'] = 'Дебитно известие';\n$lang['create_inv_credit'] = 'Кредитно известие';\n$lang['create_inv_invoice'] = 'Данъчна';\n$lang['or'] = 'или';\n$lang['open_invoices'] = 'Отвори фактурите';\n$lang['create_inv_save'] = 'Създай фактура';\n$lang['create_invoice'] = 'Създай фактура';\n$lang['create_inv_client'] = 'Клиент:';\n$lang['create_inv_choose'] = 'Избери от списъка';\n$lang['create_inv_bulstat'] = 'Булстат:';\n$lang['create_inv_mol'] = 'Мол:';\n$lang['create_inv_city'] = 'Град:';\n$lang['create_inv_address'] = 'Адрес:';\n$lang['create_inv_country'] = 'Държава:';\n$lang['create_inv_recipient'] = 'Име на получател:';\n$lang['create_inv_inv_num'] = 'Фактура';\n$lang['create_inv_date_create'] = 'Дата на създаване:';\n$lang['create_inv_date_tax'] = 'Дата на данъчно събитие:';\n$lang['create_inv_i_maturity_date'] = 'Покажи дата на падеж';\n$lang['create_inv_maturity_date'] = 'Дата на падеж:';\n$lang['create_inv_cash_acc'] = 'Касова отчетност';\n$lang['create_inv_item'] = 'Артикул';\n$lang['create_inv_quantity'] = 'Количество';\n$lang['create_inv_price'] = 'Цена';\n$lang['create_inv_total'] = 'Крайна цена';\n$lang['sure_want_to_del_item'] = 'Сигурен ли сте, че искате да изтриете този артикул?';\n$lang['add_new_item_to_table'] = 'Добави артикул';\n$lang['create_inv_remarks'] = 'Забележки';\n$lang['visibile_for_client'] = 'видими за клиента';\n$lang['create_inv_payment_type'] = 'Начин на плащане';\n$lang['create_inv_invoice_amount'] = 'Сума по фактура';\n$lang['create_inv_discount'] = 'Отстъпка';\n$lang['create_inv_tax_base'] = 'Данъчна основа';\n$lang['create_inv_vat'] = 'ДДС:';\n$lang['create_inv_total'] = 'Общо:';\n$lang['create_inv_no_vat_mark'] = 'Не начислявай ДДС';\n$lang['create_inv_reason_no_vat'] = 'Причина за неначисляване на ДДС:';\n$lang['select_curreny'] = 'Избери валута:';\n$lang['settings_invoices'] = 'Настройки по фактури';\n$lang['menu_list_items'] = 'Артикули';\n$lang['default_currency'] = 'Избери валута по подразбиране';\n$lang['default_currency_null'] = 'Не е избрана валута по подразбиране';\n$lang['clear_def_currency'] = 'Изчисти';\n$lang['confirm_del_def_currency'] = 'Сигурен ли сте, че искате да изтриете валутата по подразбиране за тази фирма - ';\n$lang['select_def_currency'] = 'Избери валута по подразбиране';\n$lang['selected_new_def'] = 'Избрана успешно!';\n$lang['not_selected_new_def'] = 'Проблем с избирането! Моля, свържете се с поддръжката!';\n$lang['no_currency_selected'] = 'По подразбиране е избрана валута - EUR';\n$lang['my_currencies'] = 'Мойте валуте';\n$lang['currency_name'] = 'Име';\n$lang['currency_value'] = 'Стойност';\n$lang['add_new_currency'] = 'Добави нова';\n$lang['curr_name_for_int_use'] = 'За вътрешно ползване';\n$lang['no_my_currencies_added'] = 'Нямате добавени валути';\n$lang['conirm_del_my_currency'] = 'Сигурен ли сте, че искате да изтриете тази валута?';\n$lang['create_new_quantity'] = 'Добави нова..';\n$lang['add_the_quantity'] = 'Добави тип количество';\n$lang['type_quantity_type'] = 'Добави твойта мерна единица тук';\n$lang['add_new_quantity_type'] = 'Добави нова мерна единица';\n$lang['settings'] = 'Настойки';\n$lang['my_quantity_types'] = 'Мойте мерни единици';\n$lang['quantity_name'] = 'Име';\n$lang['no_my_quantity_types'] = 'Нямате добавени мерни единици';\n$lang['add_new_q_type'] = 'Добави нова';\n$lang['conirm_del_my_quantity_type'] = 'Сигурен ли сте, че искате да изтриете тази мерна единица?';\n$lang['create_inv_save_draft'] = 'Запиши чернова';\n$lang['create_new_pay_method'] = 'Добави нов..';\n$lang['add_new_payment_method'] = 'Добави нов начин на плащане';\n$lang['type_payment_method'] = 'Напиши нов метод за плащане';\n$lang['add_the_pay_method'] = 'Добави';\n$lang['my_payment_methods'] = 'Начини на плащане';\n$lang['conirm_del_my_pay_method'] = 'Сигурен ли сте, че искате да изтриете този начин на плащане?';\n$lang['no_my_pay_methods'] = 'Нямате ваши начини на плащане';\n$lang['my_no_vat_reasons'] = 'Причини за неначисляване на ДДС';\n$lang['vat_reason'] = 'Причина';\n$lang['no_my_no_vat_reasons'] = 'Нямате добавени причини за неначисляване на ДДС';\n$lang['add_new_vat_reas'] = 'Добави нова причина';\n$lang['add_new_p_method'] = 'Добави нова';\n$lang['confirm_del_no_vat_reason'] = 'Сигурен ли сте, че искате да изтриете тази причина за неначисляване на ДДС?';\n$lang['create_inv_individual'] = 'Клиента е физическо лице';\n$lang['create_inv_ident_num'] = 'ЕГН:';\n$lang['create_inv_client_vat_registered'] = 'Има регистрация по ДДС';\n$lang['create_inv_vat_number'] = 'ДДС Номер:';\n$lang['error_load_options'] = 'Проблем с акаунта ви! Моля свържете се с поддръжката!';\n$lang['how_do_you_round_values'] = 'Как искате да се закръгляват стойностите във фактурите Ви';\n$lang['update_round_totals'] = 'Обнови';\n$lang['to_inv_num'] = 'По фактура номер';\n$lang['to_inv_date'] = 'от дата';\n$lang['add_new_inv_translation'] = 'Добави нов превод за фактура';\n$lang['invoice_settings'] = 'Настройки по фактурите';\n$lang['choose_translation'] = 'Избери превод';\n$lang['what_mean_new_translate'] = 'Какво значи да добавя нов превод?';\n$lang['what_mean_new_translate_explain'] = 'Можете да добавяте ваш превод на фактурите така, че при създаване на нова фактура да бъде на избран от вас език. Винаги можете да смените превода на фактурата като използвате формата за редакция.';\n$lang['your_translation'] = 'ваш превод';\n$lang['lang_name_internal_use'] = 'Име на езика(за вътрешно ползване)';\n$lang['trans_language_name'] = 'Име на езика';\n$lang['trans_recipient'] = 'Получател';\n$lang['trans_bulstat'] = 'Булстат';\n$lang['trans_mol'] = 'МОЛ';\n$lang['trans_sender'] = 'Изпращач';\n$lang['trans_original'] = 'Оригинал';\n$lang['trans_number'] = 'Номер';\n$lang['trans_date_of_issue'] = 'Дата на създваване';\n$lang['trans_date_tax_event'] = 'Дата на данъчно събитие';\n$lang['trans_to_an_invoice'] = 'По фактура';\n$lang['trans_from_date'] = 'От дата';\n$lang['trans_invoice'] = 'Фактура';\n$lang['trans_debit_note'] = 'Дебитно известие';\n$lang['trans_credit_note'] = 'Кредитно известие';\n$lang['trans_remarks'] = 'Забележки';\n$lang['trans_pro_forma'] = 'Проформа';\n$lang['trans_products_name'] = 'Артикул';\n$lang['trans_quantity'] = 'Количество';\n$lang['trans_single_price'] = 'Единична цена';\n$lang['trans_value'] = 'Крайна цена';\n$lang['trans_discount'] = 'Отстъпка';\n$lang['trans_payment_type'] = 'Начин на плащане';\n$lang['trans_amount'] = 'Сума по фактура';\n$lang['trans_tax_base'] = 'Данъчна основа';\n$lang['trans_percentage_vat'] = 'Процент ДДС';\n$lang['trans_vat_charget'] = 'ДДС';\n$lang['trans_everything'] = 'Всичко';\n$lang['trans_reason_non_var'] = 'Причина за неначисляване на ДДС';\n$lang['trans_compiled'] = 'Издадена';\n$lang['trans_signature'] = 'Подпис';\n$lang['trans_schiffer'] = 'Шифър';\n$lang['trans_page'] = 'Страница';\n$lang['trans_i_accept'] = 'Приемам';\n$lang['trans_i_refuse'] = 'Отказвам';\n$lang['trans_receive_from'] = 'Получихте фактура от \"Име на фирмата\"';\n$lang['you_receved_tr'] = 'Получихте';\n$lang['from_tr'] = 'от';\n$lang['save_new_translate'] = 'Запиши превода';\n$lang['default_inv_lang_en'] = 'Английски';\n$lang['default_inv_lang_bg'] = 'Български';\n$lang['default_inv_lang_fr'] = 'Френски';\n$lang['err_create_to_inv_num'] = 'Попълнете полето \"по фактура номер\"!';\n$lang['err_create_to_inv_date'] = 'Попълнете полето \"от дата\"!';\n$lang['err_create_client_name'] = 'Попълнете името на клиента!';\n$lang['err_create_client_addr'] = 'Попълнете адреса на клиента!';\n$lang['err_create_inv_num'] = 'Попълнете полето с номер на фактурата!';\n$lang['err_create_date_create'] = 'Попълнете полето за дата на създаване на фактурата!';\n$lang['err_create_tax_event'] = 'Попълнете полето за данъчно събитие на фактурата!';\n$lang['err_create_inv_num_is_taken'] = 'Вече има фактура с този номер, изберете друг';\n$lang['err_create_no_item_name'] = 'Попълнете всички имена на добавените артикули!';\n$lang['err_create_no_item_qua'] = 'Попълнете всички количества на добавените артикули!';\n$lang['choose_client'] = 'Избери клиент от списъка';\n$lang['choose_item'] = 'Избери артикул от списъка';\n$lang['no_clients_selector'] = 'Няма клиенти';\n$lang['no_items_selector'] = 'Няма артикули';\n$lang['invoices'] = 'Фактури';\n$lang['list_inv_num'] = 'Номер';\n$lang['list_inv_date'] = 'Дата';\n$lang['list_inv_client'] = 'Клиент';\n$lang['list_inv_type'] = 'Тип';\n$lang['list_inv_status'] = 'Статус';\n$lang['list_inv_sum'] = 'Сума';\n$lang['create_new_inv'] = 'Създай нова фактура';\n$lang['list_inv_manage'] = 'Други';\n$lang['list_inv_payment_status'] = 'Плащания';\n$lang['no_invoices_yet'] = 'Нямате издадени фактури';\n$lang['type_debit'] = 'Дебитно известие';\n$lang['type_tax_inv'] = 'Данъчна';\n$lang['type_prof'] = 'Проформа';\n$lang['type_credit'] = 'Кредитно известие';\n$lang['status_issued'] = 'Издадена';\n$lang['status_draft'] = 'Чернова';\n$lang['status_refused'] = 'Върната';\n$lang['status_accepted'] = 'Приета';\n$lang['status_sended'] = 'Изпратена';\n$lang['status_canceled'] = 'Анулирана';\n$lang['update_inv_save'] = 'Обнови';\n$lang['show_translation_on_edit'] = 'Покажи преводите';\n$lang['show_translation_firm_on_edit'] = 'Покажи преводите на фирмата';\n$lang['show_translation_now_use'] = '(в момента използвате превод на %transname%)';\n$lang['show_translation_firm_now_use'] = '(в момента използвате име на фирмата - %transname%)';\n$lang['no_vat_reason_selected'] = 'Избери от списъка';\n$lang['stop_inv_calculator'] = 'Спри автоматичния калкулатор при издаване на документ';\n$lang['stop_movem_calculator'] = 'Спри автоматичния калкулатор при издаване на документ';\n$lang['no_clients_yet'] = 'Нямате клиенти';\n$lang['list_cli_name'] = 'Име';\n$lang['list_cli_bulstat'] = 'Булстат';\n$lang['list_cli_manage'] = 'Оправление';\n$lang['clients'] = 'Клиенти';\n$lang['add_new_client'] = 'Добави клиент';\n$lang['add_client'] = 'Добави клиент';\n$lang['save_client'] = 'Запиши клиента';\n$lang['cancel_save_client'] = 'Отказ';\n$lang['confirm_delete_client'] = 'Сигурен ли сте, че искате да изтриете този клиент?';\n$lang['list_item_name'] = 'Име';\n$lang['list_cli_price'] = 'Цена';\n$lang['list_cli_qu_type'] = 'Мерна единица';\n$lang['list_cli_manage'] = 'Оправление';\n$lang['confirm_delete_item'] = 'Сигурен ли сте, че искате да изтриете този артикул?';\n$lang['no_items_yet'] = 'Нямате артикули';\n$lang['add_new_item'] = 'Добави артикул';\n$lang['add_item'] = 'Добави артикул';\n$lang['add_item_name'] = 'Име';\n$lang['add_item_qua_type'] = 'Мерна единица';\n$lang['add_item_price'] = 'Цена';\n$lang['add_item_currency'] = 'Валута';\n$lang['cancel_save_item'] = 'Отказ';\n$lang['save_item'] = 'Запиши артикула';\n$lang['no_currency_selected_item'] = 'Не е избрана валута';\n$lang['items'] = 'Артикули';\n$lang['err_create_item_name'] = 'Името на артикула е празно!';\n$lang['no_employees_yet'] = 'Няма служители';\n$lang['add_new_employee'] = 'Добави служител';\n$lang['add_employee_name'] = 'Име';\n$lang['add_employee_email'] = 'Имейл';\n$lang['add_employee_phone'] = 'Телефон';\n$lang['add_employee_pass'] = 'Парола';\n$lang['cancel_save_employee'] = 'Отказ';\n$lang['save_employee'] = 'Запиши служителя';\n$lang['list_empl_name'] = 'Име';\n$lang['list_empl_email'] = 'Имейл';\n$lang['list_empl_phone'] = 'Телефон';\n$lang['list_empl_manage'] = 'Оправление';\n$lang['confirm_delete_employee'] = 'Сигурен ли сте, че искате да изтриете този служител?';\n$lang['if_dont_change_emp_pass'] = 'Ако не искате да променяте паролата оставете това поле празно';\n$lang['employee_email_taken'] = 'Вече имате добавен служител с този имейл адрес';\n$lang['no_permissions'] = 'Нямате права да използвате този раздел!';\n$lang['perm_add_invoice'] = 'Добавя фактури';\n$lang['perm_edit_invoice'] = 'Редактира фактури';\n$lang['perm_delete_invoice'] = 'Трие фактури';\n$lang['perm_change_inv_status'] = 'Сменя статуса на фактурите';\n$lang['perm_add_clients'] = 'Добавя клиент';\n$lang['perm_edit_clients'] = 'Редактира клиенти';\n$lang['perm_delete_clients'] = 'Изтрива клиенти';\n$lang['perm_add_items'] = 'Добавя артикули';\n$lang['perm_edit_items'] = 'Редактира артикули';\n$lang['perm_delete_items'] = 'Изтрива артикули';\n$lang['perm_can_manage_rights'] = 'Променя пварата на другите служители';\n$lang['perm_add_employees'] = 'Добавя нови служители';\n$lang['perm_can_manage_firms'] = 'Може да променя настройките на фирмата';\n$lang['perm_view_plans_page'] = 'Може да отваря страницата с плановете';\n$lang['success_save_new_perms'] = 'Новите права са зададени!';\n$lang['perm_delete_employees'] = 'Може да трие служители';\n$lang['perm_edit_employees'] = 'Може да редактира служители';\n$lang['usr_admin_menu'] = 'Профил на администратор';\n$lang['save_user_data'] = 'Запиши';\n$lang['cancel_save_user'] = 'Отказ';\n$lang['if_dont_change_usr_pass'] = 'Ако не искате да променяте паролата оставете това поле празно';\n$lang['this_email_is_used'] = 'Този имейл вече се използва от друг потребител!';\n$lang['success_update_user_adm'] = 'Потребителя е обновен!';\n$lang['problem_update_user_adm_em'] = 'Този имейл адрес е зает от служител или друг акаунт!';\n$lang['can_access_firms'] = 'Има достъп до фирми:';\n$lang['you_cant_view_any_firms'] = 'Нямате достъп до никакви фирми!';\n$lang['employee_add_success'] = 'Служителят е добавен успешно!';\n$lang['no_template_file'] = 'Не е зареден никакъв дизайн! Свържете се с поддръжката!';\n$lang['composed_from'] = 'Съставен от:';\n$lang['schiffer_replace'] = 'Шифър (заменя подписа)';\n$lang['download_print_copy'] = 'Свали/Принтирай Копие';\n$lang['download_print_original'] = 'Свали/Принтирай Оригинал';\n$lang['original_txt'] = 'Оригинал';\n$lang['copy_txt'] = 'Копие';\n$lang['confirm_delete_invoice'] = 'Сигурен ли сте, че искате да изтриете тази фактура?';\n$lang['delete'] = 'Изтрий';\n$lang['from_date'] = 'От дата:';\n$lang['to_date'] = 'До дата:';\n$lang['show_statistic'] = 'Покажи статистиката';\n$lang['reports'] = 'Справки';\n$lang['menu_list_reports'] = 'Справки';\n$lang['num_invoices_stat'] = 'Брой издадени фактури';\n$lang['all_the_time'] = 'За целия период';\n$lang['num_created'] = 'Брой издадени';\n$lang['issued'] = 'Издадена';\n$lang['num_invoices_by_month_stat'] = 'Брой издадени фактури по месец';\n$lang['no_reports_yet'] = 'Няма издадени фактури за избрания период';\n$lang['no_reports_yet_all_time'] = 'Няма издадени фактури до момента';\n$lang['amount_invoices_by_month_stat'] = 'Сума в %currency% на издадените фактури по месец';\n$lang['pages_pagination_num'] = 'Брой редове който да се показват';\n$lang['payment_status_paid'] = 'Платена';\n$lang['payment_status_unpaid'] = 'Неплатена';\n$lang['payment_status_partly_paid'] = 'Частично платена';\n$lang['top_search_no_results'] = 'Няма намерени резултати!';\n$lang['show_drafts_report'] = 'Покажи черновите';\n$lang['to_canceled_stat'] = 'Анулирай';\n$lang['remove_canceled_stat'] = 'Премахни статус анулирана';\n$lang['top_clients_stat'] = 'Топ 10 клиенти - суми по фактури (във валута %currency%)';\n$lang['sum_of_invoices_in_stat'] = 'Сума на издадените фактури';\n$lang['menu_list_import_export'] = 'Импорт/Експорт';\n$lang['no_invoices_result_export'] = 'Няма издадени фактури';\n$lang['selected_invalid_exporter'] = 'Избрали сте невалиден експорт!';\n$lang['export'] = 'Експорт';\n$lang['import'] = 'Импорт';\n$lang['not_selected_import_file'] = 'Изберете файл за импортиране';\n$lang['try_to_import_wrong_file_format'] = 'Файлът който се опитвате да импортирате е с грешен формат';\n$lang['no_invoice_note_in_xml_import'] = 'Няма invoice note в xml файла. Проверете дали xml файла е с правилна структора.';\n$lang['imp_invalid_inv_type'] = 'Невалиден тип на фактура';\n$lang['imp_inv_number_taken'] = 'Номера на фактурата е зает';\n$lang['imp_wrong_date_created'] = 'Грешен timestamp формат за дата на издаване';\n$lang['imp_wrong_date_tax_event'] = 'Грешен timestamp формат за дата на данъчно събитие';\n$lang['imp_wrong_date_maturity'] = 'Грешна дата на падеж';\n$lang['imp_to_inv_date_wrong'] = 'Невалидно поле (по фактура от дата)';\n$lang['imp_no_client_name'] = 'Името на клиента е празно';\n$lang['imp_no_client_addr'] = 'Адреса на клиента е празен';\n$lang['imp_no_item_name'] = 'Артикул %rowNum% е с празно име';\n$lang['imp_no_item_quantity'] = 'Артикул %rowNum% няма въведено количество';\n$lang['imp_no_items'] = 'Няма намерени артикули';\n$lang['inv_num_row_in_file'] = 'Номер ред фактура във файла';\n$lang['inv_number'] = 'Фактура номер';\n$lang['inv_type'] = 'Фактура тип';\n$lang['inv_errors'] = 'Проблеми';\n$lang['import_results'] = 'Резултат от импорта';\n$lang['inv_action_history'] = 'Действия';\n$lang['search_inv_num'] = 'фактура номер:';\n$lang['search_client'] = 'Клиент';\n$lang['search_item'] = 'Артиклул';\n$lang['search_amount_from'] = 'Цена от';\n$lang['search_to'] = 'до';\n$lang['search_date_from'] = 'Дата на създаване от';\n$lang['search_payment_type'] = 'Начин на плащане:';\n$lang['search_inv_type'] = 'Тип';\n$lang['search_inv_payments'] = 'Плащания';\n$lang['search_paied'] = 'Платена';\n$lang['search_unpaied'] = 'Неплатена';\n$lang['search_inv_status'] = 'Статус';\n$lang['search_issued'] = 'Издадена';\n$lang['search_sended'] = 'Изпратена';\n$lang['search_refused'] = 'Върната';\n$lang['search_accepted'] = 'Приета';\n$lang['search_canceled'] = 'Анулирана';\n$lang['search_draft'] = 'Чернова';\n$lang['search_client_name'] = 'Име на клиент';\n$lang['search_client_bulstat'] = 'Булстат';\n$lang['search_item_name'] = 'Артикул';\n$lang['clear_search'] = 'Изчисти търсенето';\n$lang['menu_list_store'] = 'Склад';\n$lang['store_settings'] = 'Склад настройки';\n$lang['my_added_stores'] = 'Складове';\n$lang['store_name'] = 'Име на склад';\n$lang['no_stores_added'] = 'Няма добавени складове';\n$lang['add_new_store'] = 'Добави склад';\n$lang['empty_store_name'] = 'Няма име на склад';\n$lang['store_name_taken'] = 'Това име е заето';\n$lang['confirm_delete_store'] = 'Сигурен ли сте, че искате да изтриете този склад?';\n$lang['add_store_movement'] = 'Добави движение';\n$lang['open_store_movements'] = 'Покажи движенията';\n$lang['create_store_movement'] = 'Създай движение';\n$lang['movement_type_in'] = 'Вкарване';\n$lang['movement_type_out'] = 'Изкарване';\n$lang['movement_type_move'] = 'Преместване';\n$lang['movement_type_revision'] = 'Ревизия';\n$lang['create_movement_type'] = 'Тип движение:';\n$lang['create_movement_id'] = 'Движение';\n$lang['create_movement_date_create'] = 'Дата на създаване';\n$lang['create_movement_amount'] = 'Цена';\n$lang['choose_movem_translation'] = 'Избери превод на стокова разписка';\n$lang['how_do_you_round_values_in_move'] = 'До кой знак искате да се закръгляват стойностите в движенията';\n$lang['err_create_movem_num'] = 'Няма номер на движение';\n$lang['err_create_movem_num_is_taken'] = 'Този номер на движение е зает';\n$lang['err_movem_create_date_create'] = 'Въведете дата на създаване';\n$lang['movement_added'] = 'Движението е добавено';\n$lang['movem_from_store'] = 'От склад:';\n$lang['movem_to_store'] = 'Към склад:';\n$lang['create_movem_from_client'] = 'От клиент:';\n$lang['create_movem_to_client'] = 'Към клиент:';\n$lang['item_is_not_in_store'] = 'Артикул %item% не съществува в този склад';\n$lang['item_no_enought_quantity'] = 'Артикул %item% няма достатъчно количество';\n$lang['allow_negative_qua_in_store'] = 'Ползволи отрицателни стойности в складовете';\n$lang['trans_bill_of_goods'] = 'Стокова разписка';\n$lang['trans_date'] = 'Дата';\n$lang['trans_address'] = 'Адрес';\n$lang['trans_betrayed'] = 'Предал';\n$lang['trans_accepted'] = 'Приел';\n$lang['trans_vat'] = 'ДДС';\n$lang['trans_vat_amount'] = 'ДДС Стойност';\n$lang['trans_no_vat_reason'] = 'Причина за неначисляване на ДДС';\n$lang['trans_product_name'] = 'Артикул';\n$lang['trans_product_quantity'] = 'Количество';\n$lang['trans_product_quantity_type'] = 'Мерна единица';\n$lang['trans_product_amount'] = 'Цена';\n$lang['trans_payment_method'] = 'Начин на плащане';\n$lang['no_movements_yet'] = 'Няма движения по склада';\n$lang['list_movement'] = 'Движение';\n$lang['list_bill_of_lading'] = 'Стоков разписка';\n$lang['list_movem_type'] = 'Тип';\n$lang['list_movem_status'] = 'Статус';\n$lang['list_movem_from'] = 'От';\n$lang['list_movem_to'] = 'До';\n$lang['movem_preview'] = 'Преглед';\n$lang['movem_type_in'] = 'Вкарване';\n$lang['movem_type_out'] = 'Изкарване';\n$lang['movem_type_move'] = 'Преместване';\n$lang['movem_type_revision'] = 'Ревизия';\n$lang['movem_stat_confirmed'] = 'Потвърдена';\n$lang['movem_stat_cancelled'] = 'Анулирана';\n$lang['search_by_store'] = 'Склад:';\n$lang['search_store_client'] = 'Клиент:';\n$lang['all_stores'] = 'Всички складове';\n$lang['preview_movem_num'] = 'Движение номер:';\n$lang['preview_movem_type'] = 'Движение тип:';\n$lang['preview_movem_currency'] = 'Движение валута:';\n$lang['preview_movem_status'] = 'Движение статус:';\n$lang['preview_movem_from'] = 'От:';\n$lang['preview_movem_to'] = 'До:';\n$lang['movement_item_name'] = 'Артикул';\n$lang['movement_item_quantity'] = 'Количество';\n$lang['movement_item_before_revision'] = 'Преди ревизията';\n$lang['movement_item_after_revision'] = 'След ревизията';\n$lang['movement_item_difference'] = 'Разлика';\n$lang['bill_of_lading'] = 'Стокова разписка';\n$lang['trans_city'] = 'Град';\n$lang['momvem_betrayed'] = 'Предал';\n$lang['momvem_accepted'] = 'Приел';\n$lang['store_stocks'] = 'Стоки';\n$lang['preview_movem_betrayed'] = 'Предал:';\n$lang['preview_movem_accepted'] = 'Приел:';\n$lang['no_stocks_yet'] = 'Няма стоки';\n$lang['back_to_movements'] = 'Обратно в движенията';\n$lang['countInvoices'] = 'Брой фактури:';\n$lang['with_sum_of'] = 'с обща сума';\n$lang['report_show_paid'] = 'Покажи само платените фактури';\n$lang['report_show_unpaid'] = 'Покажи само неплатените фактури';\n$lang['report_show_partly_paid'] = 'Покажи само частично платените фактури';\n$lang['report_show_all'] = 'Покажи всички видове (платени, неплатени) фактури';\n$lang['menu_list_warranties'] = 'Гаранционни карти';\n$lang['no_warranties_yet'] = 'Няма добавени гаранционни карти';\n$lang['add_warranty'] = 'Добави гаранционна карта';\n$lang['add_war_translation'] = 'Добави език';\n$lang['create_warranty_id'] = 'Гаранционна карта';\n$lang['create_warranty_from_date'] = 'Валидна от:';\n$lang['create_war_item'] = 'Артикул';\n$lang['create_war_months'] = 'Месеци';\n$lang['create_war_serial_num'] = 'Сериен номер';\n$lang['open_warranties'] = 'отвори списъка';\n$lang['create_warranty'] = 'Създай';\n$lang['trans_warranty_card'] = 'Гаранционна карта';\n$lang['trans_date_valid'] = 'Валидна от';\n$lang['trans_product_months'] = 'Месеци';\n$lang['trans_product_valid_to'] = 'Валидна до';\n$lang['trans_product_serial_num'] = 'Сериен номер';\n$lang['trans_received'] = 'Получена';\n$lang['trans_warranty_conditions'] = 'Гаранционни правила';\n$lang['err_create_war_num'] = 'Невалиден номер на гаранция';\n$lang['err_create_war_num_is_taken'] = 'Вече има гаранция с този номер';\n$lang['err_create_war_no_item_month'] = 'Няма въведени месеци за артикул';\n$lang['warranty_added'] = 'Гаранционната карта е добавена';\n$lang['delete_warranties'] = 'Изтрий';\n$lang['list_war_number'] = 'Номер';\n$lang['list_war_to_inv'] = 'По фактура';\n$lang['list_war_valid_from'] = 'Валидна от';\n$lang['list_war_client'] = 'Клиент';\n$lang['list_war_action'] = 'Действия';\n$lang['create_warranty_to_inv'] = 'По фактура номер:';\n$lang['edit_warranty'] = 'Редакция';\n$lang['warranty_updated'] = 'Гаранцията е обновена';\n$lang['warranty_received'] = 'Получена';\n$lang['warranty_compiled'] = 'Съставена';\n$lang['warranty_conditions'] = 'Условия';\n$lang['warranty_settings'] = 'Настройки гаранционни карти';\n$lang['add_new_condition'] = 'Добави условие';\n$lang['warranty_conditions'] = 'Условия';\n$lang['no_conditions_added'] = 'Няма добавени условия';\n$lang['condition_title'] = 'Заглавие (за вътрешно ползване)';\n$lang['condition_description'] = 'Условие за клиента';\n$lang['confirm_delete_condition'] = 'Сигурен ли сте, че искате да изтриете това условие?';\n$lang['war_condit_preview_descr'] = 'Преглед на текста';\n$lang['select_saved_condition'] = 'Избери от записани условия';\n$lang['list_war_events'] = 'Събирия';\n$lang['war_events'] = 'Събития';\n$lang['add_new_war_event'] = 'Добави събитие';\n$lang['date_war_event_manupulation'] = 'Дата на събитие';\n$lang['war_event_item'] = 'Артикул';\n$lang['repair'] = 'Поправка';\n$lang['war_event_type'] = 'Тип';\n$lang['war_event_description'] = 'Описание';\n$lang['save_war_event'] = 'Запиши';\n$lang['replacement'] = 'Заменяне';\n$lang['no_war_events_yet'] = 'Няма събития';\n$lang['war_ev_item'] = 'Артикул:';\n$lang['war_ev_type'] = 'Тип:';\n$lang['war_ev_date'] = 'Дата:';\n$lang['war_ev_descr'] = 'Описание:';\n$lang['menu_list_protocols'] = 'Протоколи';\n$lang['perm_add_movement'] = 'Може да добавя движения';\n$lang['perm_view_movement_page'] = 'Може да преглежда движенията';\n$lang['perm_view_store_stocks'] = 'Може да преглежда наличностите в складове';\n$lang['perm_view_warranty_page'] = 'Може да преглежда гаранционните карти';\n$lang['perm_add_warranty'] = 'Може да добавя гаранционна карта';\n$lang['perm_view_warranty_events'] = 'Може да вижда събитията по гаранцийте';\n$lang['perm_add_warranty_events'] = 'Може да добавя събития по гаранцийте';\n$lang['perm_view_protocols_page'] = 'Може да вижда страницата с протоколи';\n$lang['no_protocols_yet'] = 'Няма добавени протоколи';\n$lang['protocols_settings'] = 'Настройки по протоколи';\n$lang['add_protocol'] = 'Добави протокол';\n$lang['delete_protocols'] = 'Изтрий';\n$lang['perm_add_protocol'] = 'Може да добавя протоколи';\n$lang['create_protocol_acceptable'] = 'Приел';\n$lang['create_protocol_transmitter'] = 'Предал';\n$lang['create_protocol_type'] = 'Тип';\n$lang['create_protocol_from_date'] = 'От дата:';\n$lang['protocol_number'] = 'Протокол';\n$lang['create_protocol'] = 'Създай протокол';\n$lang['open_protocols'] = 'Отвори протоколите';\n$lang['my_added_provider_transmits'] = 'Предавателен текст';\n$lang['no_provider_trans_txts_added'] = 'Няма добавени предавателни текстове';\n$lang['provider_trans_title'] = 'Заглавие (за вътрешно ползване)';\n$lang['provider_trans_description'] = 'Описание за потребителя';\n$lang['add_new_provider_desc'] = 'Добави';\n$lang['confirm_delete_provider_trasmit'] = 'Сигурен ли сте, че искате да изтриете този предавателен текст?';\n$lang['no_contr_txts_added'] = 'Няма договорни текстове добавени';\n$lang['select_saved_contracts'] = 'Избери от списък с договорни текстове';\n$lang['protocol_contracts'] = 'Договор';\n$lang['provider_transmit'] = 'Доставчикът предава';\n$lang['select_saved_provider_trans'] = 'Избери от списъка';\n$lang['add_protocol_translation'] = 'Добави превод за протокол';\n$lang['trans_protocol_number'] = 'Номер';\n$lang['trans_supplier'] = 'Доставчик';\n$lang['trans_product_final_price'] = 'Общо';\n$lang['trans_final_amount'] = 'Общо';\n$lang['err_create_prot_num'] = 'Няма номер на протокол';\n$lang['err_create_prot_num_is_taken'] = 'Този номер на протокол е зает';\n$lang['err_create_prot_no_item_qa'] = 'Няма въведено количество';\n$lang['protocol_added'] = 'Протокола е добавен';\n$lang['protocol_updated'] = 'Протокола е обновен';\n$lang['protocol_to_inv'] = 'По фактура';\n$lang['protocol_from_date'] = 'От дата';\n$lang['protocol_client'] = 'Клиент';\n$lang['protocols_action'] = 'Действия';\n$lang['create_protocol_amount'] = 'Цнеа';\n$lang['trans_to_invoice'] = 'По фактура';\n$lang['trans_transmission_protocol'] = 'Приемо-предавателен протокол';\n$lang['language'] = 'Език';\n$lang['show_logo_in_inv'] = 'Покажи логото във фактурите';\n$lang['remove_firm_image'] = 'Изтрий логото';\n$lang['firm_vat_number'] = 'ДДС Номер';\n$lang['firm_is_vat_registered'] = 'Регистрация по ДДС';\n$lang['firm_details_changed'] = 'Данните на фирмата са сменени';\n$lang['trans_vat_number'] = 'ДДС Номер';\n$lang['partly_paid'] = 'Частично платена';\n$lang['search_partly_paid'] = 'Частично платена';\n$lang['logout'] = 'Изход';\n$lang['home'] = 'Начало';\n$lang['warranties'] = 'Гаранционни карти';\n$lang['protocols'] = 'Протоколи';\n$lang['import_export'] = 'Импорт/Ескпорт';\n$lang['explain_inv_translation'] = 'Добавете/изберете превод на фактурите които издавате на вашият език';\n$lang['explain_firm_translation'] = 'Изберете превод данните на фирмата ви';\n$lang['search'] = 'Търси';\n$lang['explain_movem_translation'] = 'Добавете/изберете превод на стоковите разписки които издавате на вашият език';\n$lang['explain_protocol_translation'] = 'Добавете/изберете превод на протоколите които издавате на вашият език';\n$lang['explain_war_translation'] = 'Добавете/изберете превод на гаранцията която издавате на вашият език';\n$lang['bulstat'] = 'Булстат:';\n$lang['ident_num'] = 'ЕГН:';\n$lang['amount'] = 'Цена:';\n$lang['employees'] = 'Служители';\n$lang['global'] = 'Общи настройки';\n$lang['warranty'] = 'Гаранции';\n$lang['add_employees'] = 'Добавяне на служител';\n$lang['rights'] = 'Права';\n$lang['save'] = 'Запиши';\n$lang['my_added_contracts'] = 'Договорни текстове';\n$lang['edit_admin'] = 'редакция на администратор';\n$lang['preview_client'] = 'Преглед на клиент';\n$lang['edit'] = 'Редактирай';\n$lang['preview_item'] = 'Преглед на артикул';\n$lang['add_movement'] = 'Добави движение';\n$lang['stocks'] = 'Стоки';\n$lang['movement_preview'] = 'Преглед на движение';\n$lang['warranty_events'] = 'Събития по гаранционна карта';\n$lang['cancel'] = 'Отказ';\n$lang['add_warranty_event'] = 'Добави събитие';\n$lang['edit_firm_info'] = 'Редакция на фирма';\n$lang['documents'] = 'Документи';\n$lang['companies'] = 'Фирми';\n$lang['show_main_menu'] = 'Покажи менюто';\n$lang['plan_basic'] = 'Персонален';\n$lang['plan_advanced'] = 'Напреднал';\n$lang['plan_pro'] = 'Професионален';\n$lang['plan_custom'] = 'Индивидуален';\n$lang['plans_most'] = 'Най';\n$lang['plans_popular'] = 'Популярен';\n$lang['plans_month'] = 'месец';\n$lang['plans_choose'] = 'Избери';\n$lang['plans_num_inv'] = 'Фактури';\n$lang['plans_num_firms'] = 'Фирми';\n$lang['plans_one_m_bonus'] = '+1 месец БОНУС';\n$lang['plan_period'] = 'Период';\n$lang['plans_period'] = 'Период на плана';\n$lang['confirm_plan_requiest'] = 'Потвърди заявката';\n$lang['plan_period'] = 'Период';\n$lang['plan_payment_type'] = 'Начин на плащане';\n$lang['plan_payment_bank'] = 'Банков път';\n$lang['plan_payment_paypal'] = 'PayPal';\n$lang['plan_payment_sms'] = 'СМС Съобщение';\n$lang['plan_payment_easypay'] = 'Каса на EasyPay';\n$lang['plan_period_month'] = 'Месец';\n$lang['plan_period_months'] = 'Месеца';\n$lang['plan_period_year'] = 'Година';\n$lang['my_plan_request'] = 'Заявка за план';\n$lang['payment_awaiting'] = 'Очакваме плащането Ви';\n$lang['plan_type'] = 'Тип на плана';\n$lang['plan_date_generated'] = 'Дата на заявката';\n$lang['plan_req_num'] = 'Номер на заявка';\n$lang['payment_details'] = 'Информация за плащането';\n$lang['info_box'] = 'Важно!';\n$lang['plan_will_started'] = 'Планът Ви ще бъде активиран веднага щом получим плащането и ще Ви бъде изпратена фактура на имейл адресът';\n$lang['cancel_pay_req'] = 'Откажи заявката';\n$lang['confirm_cancel_req'] = 'Сигурен ли сте, че искате да откажете заявката?';\n$lang['pay_det_name_of_rec'] = 'Име на получателя';\n$lang['pay_det_iban'] = 'IBAN на получателя';\n$lang['pay_det_bic'] = 'BIC на получателя';\n$lang['pay_det_to_bank'] = 'При банка';\n$lang['pay_det_sum'] = 'Сума за плащане';\n$lang['dont_forget_req_num'] = 'Не забравяйте да сложите номера на заявката в описанието';\n$lang['plans_make_request'] = 'Направи заявка';\n$lang['plan_send_us_req'] = 'Какъв е планът който желаете да използвате?';\n$lang['send_plan_req'] = 'Изпрати заявката';\n$lang['plan_req_inv_per_mon'] = 'Колко фактури месечно искате да издавате';\n$lang['plan_req_companies'] = 'Колко фирми ще използвате';\n$lang['when_we_see_plan_req'] = 'След като направим преглед на планът който искате ще го добавим в страницата с останалите планове и ще бъдете уведомени по имейл.';\n$lang['plan_req_sended'] = 'Заявката за план е изпратена. Очаквайте да ви уведомим по имейл в рамките на деня.';\n$lang['already_have_req'] = 'Вече имате направена заявка за индивидуален план с %num_inv% фактури и %companies% фирми. Ако изпратите нова старата ще бъде премахната.';\n$lang['plans_make_new_request'] = 'Нова заявка';\n$lang['title_everytime'] = 'Система за електронно фактуриране - ';\n$lang['title_clients'] = 'Клиенти';\n$lang['title_add_client'] = 'Добави клиент';\n$lang['title_preview_client'] = 'Преглед на клиент';\n$lang['title_home_page'] = 'Начало';\n$lang['title_import_export'] = 'Импорт/Експорт';\n$lang['title_invoices'] = 'Списък фактури';\n$lang['title_inv_preview'] = 'Преглед на фактура - ';\n$lang['title_new_inv'] = 'Нова фактура';\n$lang['title_items'] = 'Артикули';\n$lang['title_add_item'] = 'Добави артикул';\n$lang['title_item_preview'] = 'Преглед на артикул';\n$lang['title_manage_firms'] = 'Управление на фирмите';\n$lang['title_edit_firm'] = 'Редакция на фирма';\n$lang['title_plans'] = 'Абонаментни планове';\n$lang['title_choose_plan_period'] = 'Избиране на период за абонаментен план';\n$lang['title_plan_req'] = 'Вашата заявка за абонаментен план';\n$lang['title_protocols'] = 'Протоколи';\n$lang['title_add_protocol'] = 'Добави протокол';\n$lang['title_reports'] = 'Справки';\n$lang['title_admin'] = 'Редакция на администратор';\n$lang['title_employees'] = 'Служители';\n$lang['title_add_employee'] = 'Добави служител';\n$lang['title_empl_rights'] = 'Права на служители';\n$lang['title_global_sett'] = 'Общи настройки';\n$lang['title_inv_sett'] = 'Настройки по фактури';\n$lang['title_protoc_sett'] = 'Настройки по протоколи';\n$lang['title_settings'] = 'Настройки';\n$lang['title_store_sett'] = 'Настройки по склад';\n$lang['title_warr_sett'] = 'Настройки по гаранциите';\n$lang['title_movem_prev'] = 'Преглед на движение';\n$lang['title_movements'] = 'Движения';\n$lang['title_add_movement'] = 'Добави движение';\n$lang['title_stocks'] = 'Стоки';\n$lang['title_events'] = 'Събития по гаранции';\n$lang['title_add_event'] = 'Добави събитие по гаранция';\n$lang['title_warranties'] = 'Гаранции';\n$lang['title_add_warr'] = 'Добави гаранционна карта';\n$lang['create_first_one_inv'] = 'Създай първата';\n$lang['limit_inv_error'] = 'Вие сте изчерпали лимита си за създаване на фактури. Ако искате да издадете фактура ще трябва да подновите плана си или да изчакате 1 месец от последната издадена фактура за да можете да изададете нова такава (максимум 5)';\n$lang['my_active_plans'] = 'Активни планове';\n$lang['active_to'] = 'Активен до:';\n$lang['left_inv_from_plan'] = 'Оставащи фактури:';\n$lang['num_companies_plan'] = 'Фирми:';\n$lang['started_from'] = 'Стартиран от:';\n$lang['exceeded_limit_firms'] = 'Вашият лимит за използване на фирми е превишен. Моля изтрийте някоя от фирмите или преминете на по-висок план за да продължите работата си в сайта. Това изтриване няма да бъде перманентно и при преминаване на по-голям план ще имате възможност за възстановяване на фирмата.';\n$lang['create_movement_lot'] = 'Партида:';\n$lang['create_movement_expire'] = 'Срок на годност:';\n$lang['preview_movem_lot'] = 'Партиден номер:';\n$lang['preview_movem_expire'] = 'Изтича на:';\n$lang['expire_date_to'] = 'Срок на годност до:';\n$lang['bill_of_lading_down'] = 'Свали стокова рапзиска';\n$lang['preview_movem_to_inv'] = 'Към фактура:';\n$lang['to_inv_movem_not_set'] = 'Не е създадена фактура';\n$lang['pay_elsewhere'] = 'Искам да платя от друго място. Покажи ми банковата сметка.';\n$lang['inv_templ_change'] = 'Смени изгледа на фактурите';\n$lang['plans_year'] = 'година';\n$lang['plan_period_years'] = 'години';\n$lang['per_12_months'] = 'за 12 месеца';"
  },
  {
    "path": "application/language/english/db_lang.php",
    "content": ""
  },
  {
    "path": "application/language/english/email_lang.php",
    "content": ""
  },
  {
    "path": "application/language/english/form_validation_lang.php",
    "content": "<?php\n\n "
  },
  {
    "path": "application/language/english/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/language/english/js/all.js",
    "content": "var lang = {\n    invalid_email: 'Invalid email address!',\n    invalid_pass: 'Please enter password!',\n    invalid_pass2: 'Please repeat the passwrod!',\n    passwords_dont_match: 'Passwords dont match!',\n    rules_not_checked: 'Please check rules!',\n    proforma: 'Pro-forma',\n    invoice: 'Invoice',\n    debit_note: 'Debit note',\n    credit_note: 'Credit note',\n    errorCreateDocument: 'We have found following blank fields',\n    currencyItemNotSame: 'The price entered for this item is in a different currency',\n    errorCreateClient: 'Some client required fields are blank!',\n    errorCreateItem: 'Some item required fields are blank!',\n    errorCreateEmployee: 'You have invalid fields!',\n    noCheckedCheckboxes: 'There is nothing selected!',\n    confirmDelete: 'Are you sure want to delete?',\n    errorChangeInvStatusAjax: 'Invoice status change error. Try again please!',\n    confirmCancel: 'Are you sure want to cancel?',\n    confirmRemoveCancel: 'Are you sure want to remove status cancelled?',\n    show_main_menu: 'Show menu',\n    hide_main_menu: 'Hide menu'\n};"
  },
  {
    "path": "application/language/english/pagination_lang.php",
    "content": "<?php \n$lang['first'] = 'First';\n$lang['last'] = 'Last';\n$lang['next'] = 'Next';\n$lang['previous'] = 'Previous';\n$lang['pagination_last_link'] = 'Last';\n$lang['pagination_first_link'] = 'First';\n"
  },
  {
    "path": "application/language/english/profiler_lang.php",
    "content": "<?php ?>\n"
  },
  {
    "path": "application/language/english/public_lang.php",
    "content": "<?php\n\n$lang['btn_home'] = 'Home';\n$lang['btn_register'] = 'Register now for free';\n$lang['btn_plans'] = 'Plans';\n$lang['btn_features'] = 'Features';\n$lang['btn_help'] = 'Help';\n$lang['btn_contacts'] = 'Contacts';\n$lang['btn_login'] = 'Login';\n$lang['header_text'] = 'Easily Create And Send Invoices';\n$lang['login_email'] = 'Email';\n$lang['login_pass'] = 'Password';\n$lang['btn_logme'] = 'Log Me';\n$lang['home_slide_tx1'] = 'Create';\n$lang['home_slide_free'] = 'free';\n$lang['check_our_options'] = 'Check our options and features!';\n$lang['home_slide_register_now'] = 'Register now!';\n$lang['electronic_invoices'] = 'electronic invoices';\n$lang['register_now'] = 'Register now!';\n$lang['text_register_after_carousel'] = 'Register a';\n$lang['text_free_after_carousel'] = 'free';\n$lang['text_account_after_carousel'] = 'account and start issuing invoices!';\n$lang['text_bottom_after_carousel'] = 'For registration need to fill only 3 fields! It will take less than 1 minute and start to issue invoices!';\n$lang['what_is'] = 'What is';\n$lang['and_how_it_works'] = 'and how it works?';\n$lang['forgotten_pass'] = 'Forgot your password?';\n$lang['one_acc'] = '1 Account - multiple firms';\n$lang['send_by_email'] = 'Send by email';\n$lang['invent_store'] = 'Inventory and Store System';\n$lang['down_pdf'] = 'Download as PDF';\n$lang['24_support'] = '27/7 Support';\n$lang['inv_templates'] = 'Invoice Templates';\n$lang['become_member_in_3'] = 'Send invoices just in 3 easy steps!';\n$lang['payment_methods'] = 'Payment methods';\n$lang['support_footer'] = 'Support';\n$lang['support_questions'] = 'Asked questions';\n$lang['support_menu'] = 'Create invoice';\n$lang['comming_features'] = 'Comming new features';\n$lang['registration_modal'] = 'Registration';\n$lang['reg_email'] = 'Your email address';\n$lang['reg_pass'] = 'Your password';\n$lang['reg_pass_repeat'] = 'Repeat password';\n$lang['reg_p_email'] = 'yourname@domain.com';\n$lang['reg_p_secret'] = 'Your secret password';\n$lang['reg_p_secret2'] = 'Repeat your secret password';\n$lang['close'] = 'Close';\n$lang['register_me'] = 'Register me';\n$lang['confirm_rules'] = 'Confirm rules';\n$lang['read_rules'] = 'Terms & Conditions';\n$lang['write_us'] = 'Write us message';\n$lang['contacts'] = 'Contacts';\n$lang['or_send_to'] = 'or send to';\n$lang['your_name'] = 'Your name';\n$lang['your_email'] = 'Your email';\n$lang['your_subject'] = 'Your subject';\n$lang['send'] = 'Send';\n$lang['we_received'] = 'Thank you! We received your message and will reply to you soon!';\n$lang['find_by_keyword'] = 'Find by keyword:';\n$lang['term'] = 'Term';\n$lang['find_by_tags'] = 'Find by tags:';\n$lang['published'] = 'published';\n$lang['features'] = 'Features';\n$lang['registration'] = 'Registration';\n$lang['register_account'] = 'Register Account';\n$lang['i_have_account'] = 'I allready have account';\n$lang['login'] = 'Login';\n$lang['log_to_your_acc'] = 'Login to your account';\n$lang['invalid_email'] = 'Invalid email address!';\n$lang['empty_password'] = 'Password is empty!';\n$lang['empty_password_repeat'] = 'Please repeat password!';\n$lang['passwords_dont_match'] = 'Passwords dont match!';\n$lang['rules_not_checked'] = 'Rules are not confirmed!';\n$lang['blog_preview'] = 'Blog preview';\n$lang['recover_your_pass'] = 'Recover your password';\n$lang['send_pass_link'] = 'Send me new password';\n$lang['help_footer'] = 'Read the most frequently asked questions if you need further assistance, please contact us!';\n$lang['help'] = 'HELP';\n$lang['specifications'] = 'Specifications';\n$lang['plans'] = 'Plans';\n$lang['store'] = 'Store';\n$lang['saved_clients'] = 'Clients';\n$lang['saved_articles'] = 'Articles';\n$lang['create_protocols'] = 'Create Protocols';\n$lang['periodic_invoices'] = 'Periodic Invoices';\n$lang['registered_by_user'] = 'This email address is registered by another user.';\n$lang['usr_or_pass_invalid'] = 'Username or password is wrong!';\n$lang['database_error'] = 'We have error now. Please contact us!';\n$lang['choose_type_of_login'] = 'Choose type of login';\n$lang['there_are_two_types'] = 'There are two types of login for this email and password!';\n$lang['type_employee'] = 'Login as employee';\n$lang['type_user'] = 'Login as user';\n$lang['example_of_xml_import_file'] = 'Example of XML import file';\n$lang['imports_feature'] = 'Import invoices';\n$lang['universal_xml'] = 'Universal XML Import';\n$lang['exports_feature'] = 'Export invoices';\n$lang['export_in_xml'] = 'Export in XML';\n$lang['xml_export_info'] = 'We also support export in XML (its same as Universal XML Import file) but with included items';\n$lang['export_in_excel'] = 'Export in EXCEL';\n$lang['excel_export_info'] = 'We also support export in XLS with invoice and client info. Exported columns: Invoice Number | Invoice Type | Client Name | Client Address | Client Bulstat/PIN | Client Vat Number | Client Accountable person | Date of issue | Date Tax Event | Invoice Amount | Discount | Tax Base | Vat Sum | Total | Currency | Payment Type | Payment status | Compiled | Sended | Received | Date of receive | Return reason | Date created | Vat Reason | Remarks | Maturity date';\n$lang['create_and_send_inv_with'] = 'Create and send invoices with';\n$lang['p_reason'] = 'Reason';\n$lang['log_me_public_home'] = 'Login to my account';\n$lang['use_it_online'] = 'Use it online';\n$lang['there_is']  ='There is';\n$lang['no_need'] = 'NO need';\n$lang['to_down_noth'] = 'to download nothing. You can use it absolutley';\n$lang['high_protect_serve'] = 'online and save your data to our high protected servers.';\n$lang['have_support'] = 'You will have support';\n$lang['every_day_and_hour']='everyday and hour'; \n$lang['make_it_easy'] ='Issue to 5 invoices every month for free!';\n$lang['reg_for_free_use_for'] = 'Issue and send invoices the first month for free with the highest plan, then just for 50€ per year. Registration takes 1 minute';\n$lang['issue_to_5'] = 'Issue to 5 invoices every month for free!';\n$lang['security'] = 'Security and Encription';"
  },
  {
    "path": "application/language/english/titles_lang.php",
    "content": "<?php\r\n\r\n$lang['title_home'] = 'Electronic invoices, E-mails';\r\n$lang['description_home'] = 'Start issuing and sending electronic invoices';\r\n\r\n$lang['title_login'] = 'Sign in and start issuing invoices';\r\n$lang['description_login'] = 'Enter your email and password and sign in to your billing program';\r\n\r\n$lang['title_register'] = 'Registration';\r\n$lang['description_register'] = 'Register simply by entering your email and password';\r\n\r\n$lang['title_forgotten'] = 'Restore your password';\r\n$lang['description_forgotten'] = 'Change your forgotten password';"
  },
  {
    "path": "application/language/english/upload_lang.php",
    "content": "<?php\n\n$lang['upload_userfile_not_set'] = \"Unable to find a post variable called userfile.\";\n$lang['upload_file_exceeds_limit'] = \"The uploaded file exceeds the maximum allowed size in your PHP configuration file.\";\n$lang['upload_file_exceeds_form_limit'] = \"The uploaded file exceeds the maximum size allowed by the submission form.\";\n$lang['upload_file_partial'] = \"The file was only partially uploaded.\";\n$lang['upload_no_temp_directory'] = \"The temporary folder is missing.\";\n$lang['upload_unable_to_write_file'] = \"The file could not be written to disk.\";\n$lang['upload_stopped_by_extension'] = \"The file upload was stopped by extension.\";\n$lang['upload_no_file_selected'] = \"You did not select a file to upload.\";\n$lang['upload_invalid_filetype'] = \"The filetype you are attempting to upload is not allowed.\";\n$lang['upload_invalid_filesize'] = \"The file you are attempting to upload is larger than the permitted size.\";\n$lang['upload_invalid_dimensions'] = \"The image you are attempting to upload exceedes the maximum height or width.\";\n$lang['upload_destination_error'] = \"A problem was encountered while attempting to move the uploaded file to the final destination.\";\n$lang['upload_no_filepath'] = \"The upload path does not appear to be valid.\";\n$lang['upload_no_file_types'] = \"You have not specified any allowed file types.\";\n$lang['upload_bad_filename'] = \"The file name you submitted already exists on the server.\";\n$lang['upload_not_writable'] = \"The upload destination folder does not appear to be writable.\";\n"
  },
  {
    "path": "application/language/english/users_lang.php",
    "content": "<?php\n\n$lang['change_firm'] = 'Change company';\n$lang['manage_firms'] = 'Manage companies';\n$lang['search_header_u'] = 'Search';\n$lang['menu_create_invoice'] = 'Create invoice';\n$lang['menu_list_invoices'] = 'My Invoices';\n$lang['dont_have_firms'] = ' You dont have companies';\n$lang['no_firm_data'] = 'Enter your company details';\n$lang['firm_name'] = 'Company name:';\n$lang['firm_bulstat'] = 'Company bulstat:';\n$lang['firm_reg_address'] = 'Registration adress:';\n$lang['firm_city'] = 'Company city:';\n$lang['firm_mol'] = 'Company accountable person:';\n$lang['save_firm_details'] = 'Save details';\n$lang['empty_firm_name'] = 'Empty company name!';\n$lang['empty_firm_bulstat'] = 'Empty company bulstat!';\n$lang['empty_firm_reg_address'] = 'Empty company registration address!';\n$lang['empty_firm_city'] = 'Empty company city!';\n$lang['empty_firm_mol'] = 'Empty company accountable person!';\n$lang['bulstat_is_taken'] = 'Company bulstat is allready registered!';\n$lang['menu_home'] = 'Home';\n$lang['selected_home'] = 'Home';\n$lang['selected_manage_firms'] = 'Manage firms';\n$lang['add_new_company'] = 'Add company';\n$lang['list_firms'] = 'List of my firms';\n$lang['firm_default'] = 'Default';\n$lang['make_firm_default'] = 'Make default';\n$lang['delete_firm_confirm'] = 'Are you sure want to delete this company? This will remove anything that is created for her!';\n$lang['default_firm_confirm'] = 'Are you sure want to make this company default?';\n$lang['menu_list_clients'] = 'My Clients';\n$lang['company_deleted'] = 'The company is deleted!';\n$lang['company_added'] = 'Company added!';\n$lang['firms_translations'] = 'Translations';\n$lang['trans_name'] = 'Translation name(for internally usage):';\n$lang['firm_image'] = 'Logo';\n$lang['no_image'] = 'No image';\n$lang['add_new_translation'] = 'Add new translation';\n$lang['save_changes'] = 'Save changes';\n$lang['save_translation'] = 'Save translation';\n$lang['translation_updated'] = 'Translation is successful updated!';\n$lang['upload_img_error'] = 'Upload image error - ';\n$lang['add_translation'] = 'Add translation';\n$lang['new_translation_added'] = 'New translation is added!';\n$lang['translation_is_default'] = 'default';\n$lang['make_translation_default'] = 'Make default';\n$lang['default_translate_confirm'] = 'Are you sure want to make this translation to default?';\n$lang['delete_translation'] = 'Delete translation';\n$lang['translation_deleted'] = 'Translation is deleted successful!';\n$lang['translation_delete_confirm'] = 'Are you sure want to delete this translation?';\n$lang['error_delete_translation'] = 'Error delete translation!';\n$lang['invoice'] = 'Invoice';\n$lang['create_inv_type'] = 'Type:';\n$lang['create_inv_proforma'] = 'Pro-forma';\n$lang['create_inv_debit'] = 'Debit note';\n$lang['create_inv_credit'] = 'Credit note';\n$lang['create_inv_invoice'] = 'Invoice';\n$lang['or'] = 'or';\n$lang['open_invoices'] = 'Open Invoices';\n$lang['create_inv_save'] = 'Create Invoice';\n$lang['create_invoice'] = 'Create Invoice';\n$lang['create_inv_client'] = 'Client:';\n$lang['create_inv_choose'] = 'Select from list';\n$lang['create_inv_bulstat'] = 'Bulstat:';\n$lang['create_inv_mol'] = 'Accountable person:';\n$lang['create_inv_city'] = 'City:';\n$lang['create_inv_address'] = 'Address:';\n$lang['create_inv_country'] = 'Country:';\n$lang['create_inv_recipient'] = 'Beneficiary:';\n$lang['create_inv_inv_num'] = 'Invoice';\n$lang['create_inv_date_create'] = 'Invoice date:';\n$lang['create_inv_date_tax'] = 'A date of a tax event:';\n$lang['create_inv_i_maturity_date'] = 'Indicate a maturity date';\n$lang['create_inv_maturity_date'] = 'Maturity date:';\n$lang['create_inv_cash_acc'] = 'Cash accounting';\n$lang['create_inv_item'] = 'Item';\n$lang['create_inv_quantity'] = 'Quantity';\n$lang['create_inv_price'] = 'Price';\n$lang['create_inv_total'] = 'Total';\n$lang['sure_want_to_del_item'] = 'Are you sure want to delete this item?';\n$lang['add_new_item_to_table'] = 'Add Item';\n$lang['create_inv_remarks'] = 'Remarks';\n$lang['visibile_for_client'] = 'Visible for client';\n$lang['create_inv_payment_type'] = 'Payment method';\n$lang['create_inv_invoice_amount'] = 'Invoice amount';\n$lang['create_inv_discount'] = 'Discount';\n$lang['create_inv_tax_base'] = 'Tax base';\n$lang['create_inv_vat'] = 'VAT:';\n$lang['create_inv_total'] = 'Total:';\n$lang['create_inv_no_vat_mark'] = 'No Vat';\n$lang['create_inv_reason_no_vat'] = 'Reason for non-charging VAT:';\n$lang['select_curreny'] = 'Selected currency:';\n$lang['settings_invoices'] = 'Settings Invoices';\n$lang['menu_list_items'] = 'My Items';\n$lang['default_currency'] = 'Choose default currency for invoices';\n$lang['default_currency_null'] = 'No default currency selected';\n$lang['clear_def_currency'] = 'Clear';\n$lang['confirm_del_def_currency'] = 'Are you sure want to delete default currency for company - ';\n$lang['select_def_currency'] = 'Select default currency';\n$lang['selected_new_def'] = 'Selected successful!';\n$lang['not_selected_new_def'] = 'Selection problem! Please contact support!';\n$lang['no_currency_selected'] = 'Default EUR currency selected';\n$lang['my_currencies'] = 'My currencies';\n$lang['currency_name'] = 'Name';\n$lang['currency_value'] = 'Value';\n$lang['add_new_currency'] = 'Add new';\n$lang['curr_name_for_int_use'] = 'For internal use';\n$lang['no_my_currencies_added'] = 'You dont have added currencies';\n$lang['conirm_del_my_currency'] = 'Are you sure want to delete your currency?';\n$lang['create_new_quantity'] = 'Create new..';\n$lang['add_the_quantity'] = 'Add quantity type';\n$lang['type_quantity_type'] = 'Set your quantity type here';\n$lang['add_new_quantity_type'] = 'Add new quantity type';\n$lang['settings'] = 'Settings';\n$lang['my_quantity_types'] = 'My quantity types';\n$lang['quantity_name'] = 'Name';\n$lang['no_my_quantity_types'] = 'You dont have yours quantity types';\n$lang['add_new_q_type'] = 'Add new';\n$lang['conirm_del_my_quantity_type'] = 'Are you sure want to delete your quantity type?';\n$lang['create_inv_save_draft'] = 'Save draft';\n$lang['create_new_pay_method'] = 'Create new method..';\n$lang['add_new_payment_method'] = 'Add new payment method';\n$lang['type_payment_method'] = 'Type new payment method';\n$lang['add_the_pay_method'] = 'Add payment method';\n$lang['my_payment_methods'] = 'My payment methods';\n$lang['conirm_del_my_pay_method'] = 'Are you sure want to delete this payment method?';\n$lang['no_my_pay_methods'] = 'You dont have custom payment methods';\n$lang['my_no_vat_reasons'] = 'My no vat reasons';\n$lang['vat_reason'] = 'Vat reason';\n$lang['no_my_no_vat_reasons'] = 'You dont have saved vat reasons';\n$lang['add_new_vat_reas'] = 'Add new reason';\n$lang['add_new_p_method'] = 'Add new';\n$lang['confirm_del_no_vat_reason'] = 'Are you sure want to delete this no vat reason?';\n$lang['create_inv_individual'] = 'Individual';\n$lang['create_inv_ident_num'] = 'Identification number:';\n$lang['create_inv_client_vat_registered'] = 'VAT registration';\n$lang['create_inv_vat_number'] = 'VAT Number:';\n$lang['error_load_options'] = 'Error with your account! Please contact support!';\n$lang['how_do_you_round_values'] = 'How do you want to round out the totals on your invoices';\n$lang['update_round_totals'] = 'Update';\n$lang['to_inv_num'] = 'To invoice number';\n$lang['to_inv_date'] = 'from date';\n$lang['add_new_inv_translation'] = 'Add new invoice translation';\n$lang['invoice_settings'] = 'Invoice settings';\n$lang['choose_translation'] = 'Choose translation';\n$lang['what_mean_new_translate'] = 'What mean to add new translation?';\n$lang['what_mean_new_translate_explain'] = 'You can add you translation for invoices. When you create new invoice it will be translated to your own language.You can always change the invoice translation using the edit form';\n$lang['your_translation'] = 'your translation';\n$lang['lang_name_internal_use'] = 'Language name(for internal use)';\n$lang['trans_language_name'] = 'Language name';\n$lang['trans_recipient'] = 'Recipient';\n$lang['trans_bulstat'] = 'Bulstat';\n$lang['trans_mol'] = 'Accountable person';\n$lang['trans_sender'] = 'Sender';\n$lang['trans_original'] = 'Original';\n$lang['trans_number'] = 'Number';\n$lang['trans_date_of_issue'] = 'Date of issue';\n$lang['trans_date_tax_event'] = 'Date of tax event';\n$lang['trans_to_an_invoice'] = 'To an invoice';\n$lang['trans_from_date'] = 'From date';\n$lang['trans_invoice'] = 'Invoice';\n$lang['trans_debit_note'] = 'Debit Note';\n$lang['trans_credit_note'] = 'Credit Note';\n$lang['trans_remarks'] = 'Remarks';\n$lang['trans_pro_forma'] = 'Pro-forma';\n$lang['trans_products_name'] = 'Item';\n$lang['trans_quantity'] = 'Quantity';\n$lang['trans_single_price'] = 'Single price';\n$lang['trans_value'] = 'Final value of item';\n$lang['trans_discount'] = 'Discount';\n$lang['trans_payment_type'] = 'Payment Type';\n$lang['trans_amount'] = 'Amount';\n$lang['trans_tax_base'] = 'Tax base';\n$lang['trans_percentage_vat'] = 'Percentage Vat';\n$lang['trans_vat_charget'] = 'Vat charget';\n$lang['trans_everything'] = 'Everything';\n$lang['trans_reason_non_var'] = 'Reason for non charging vat';\n$lang['trans_compiled'] = 'Compiled';\n$lang['trans_signature'] = 'Signature';\n$lang['trans_schiffer'] = 'Schiffer';\n$lang['trans_page'] = 'Page';\n$lang['trans_i_accept'] = 'I accept';\n$lang['trans_i_refuse'] = 'I refuse';\n$lang['trans_receive_from'] = 'You receive invoice from \"firm name\"';\n$lang['you_receved_tr'] = 'You received';\n$lang['from_tr'] = 'from';\n$lang['save_new_translate'] = 'Save new translation';\n$lang['default_inv_lang_en'] = 'English';\n$lang['default_inv_lang_bg'] = 'Bulgarian';\n$lang['default_inv_lang_fr'] = 'France';\n$lang['err_create_to_inv_num'] = 'Please enter to invoice number field!';\n$lang['err_create_to_inv_date'] = 'Please enter to invoice date field!';\n$lang['err_create_client_name'] = 'Please enter client name field!';\n$lang['err_create_client_addr'] = 'Please enter client address field!';\n$lang['err_create_inv_num'] = 'Please enter invoice number field!';\n$lang['err_create_date_create'] = 'Please enter invoice date field!';\n$lang['err_create_tax_event'] = 'Please enter tax event field!';\n$lang['err_create_inv_num_is_taken'] = 'Invoice number is taken! Choose another one!';\n$lang['err_create_no_item_name'] = 'Please fill all item names!';\n$lang['err_create_no_item_qua'] = 'Please fill all item quantities!';\n$lang['choose_client'] = 'Select client from list';\n$lang['choose_item'] = 'Select item from list';\n$lang['no_clients_selector'] = 'No clients';\n$lang['no_items_selector'] = 'No items';\n$lang['invoices'] = 'Invoices';\n$lang['list_inv_num'] = 'Number';\n$lang['list_inv_date'] = 'Date';\n$lang['list_inv_client'] = 'Client';\n$lang['list_inv_type'] = 'Type';\n$lang['list_inv_status'] = 'Status';\n$lang['list_inv_sum'] = 'Value';\n$lang['create_new_inv'] = 'Create new invoice';\n$lang['list_inv_manage'] = 'Options';\n$lang['list_inv_payment_status'] = 'Payments';\n$lang['no_invoices_yet'] = 'You dont have invoices.';\n$lang['type_debit'] = 'Debit note';\n$lang['type_tax_inv'] = 'Invoice';\n$lang['type_prof'] = 'Pro-forma';\n$lang['type_credit'] = 'Credit note';\n$lang['status_issued'] = 'Issued';\n$lang['status_draft'] = 'Draft';\n$lang['status_refused'] = 'Refused';\n$lang['status_accepted'] = 'Accepted';\n$lang['status_sended'] = 'Sended';\n$lang['status_canceled'] = 'Canceled';\n$lang['update_inv_save'] = 'Update';\n$lang['show_translation_on_edit'] = 'Show translations';\n$lang['show_translation_firm_on_edit'] = 'Show firms translations';\n$lang['show_translation_now_use'] = '(now use %transname% translation)';\n$lang['show_translation_firm_now_use'] = '(now use firm name - %transname%)';\n$lang['no_vat_reason_selected'] = 'Select from list';\n$lang['stop_inv_calculator'] = 'Stop invoice calculator';\n$lang['stop_movem_calculator'] = 'Stop movement calculator';\n$lang['no_clients_yet'] = 'You dont have clients';\n$lang['list_cli_name'] = 'Name';\n$lang['list_cli_bulstat'] = 'Bulstat';\n$lang['list_cli_manage'] = 'Manage';\n$lang['clients'] = 'Clients';\n$lang['add_new_client'] = 'Add Client';\n$lang['add_client'] = 'Add Client';\n$lang['save_client'] = 'Save client';\n$lang['cancel_save_client'] = 'Cancel';\n$lang['confirm_delete_client'] = 'Are you sure want to delete this client?';\n$lang['list_item_name'] = 'Name';\n$lang['list_cli_price'] = 'Price';\n$lang['list_cli_qu_type'] = 'Quantity type';\n$lang['list_cli_manage'] = 'Manage';\n$lang['confirm_delete_item'] = 'Are you sure want to delete this item?';\n$lang['no_items_yet'] = 'Dont have items';\n$lang['add_new_item'] = 'Add item';\n$lang['add_item'] = 'Add item';\n$lang['add_item_name'] = 'Name';\n$lang['add_item_qua_type'] = 'Quantity type';\n$lang['add_item_price'] = 'Price';\n$lang['add_item_currency'] = 'Currency';\n$lang['cancel_save_item'] = 'Cancel';\n$lang['save_item'] = 'Save item';\n$lang['no_currency_selected_item'] = 'No currency selected';\n$lang['items'] = 'Items';\n$lang['err_create_item_name'] = 'Item name is empty!';\n$lang['no_employees_yet'] = 'No employees';\n$lang['add_new_employee'] = 'Add employee';\n$lang['add_employee_name'] = 'Name';\n$lang['add_employee_email'] = 'Email';\n$lang['add_employee_phone'] = 'Phone';\n$lang['add_employee_pass'] = 'Password';\n$lang['cancel_save_employee'] = 'Cancel';\n$lang['save_employee'] = 'Save employee';\n$lang['list_empl_name'] = 'Name';\n$lang['list_empl_email'] = 'Email';\n$lang['list_empl_phone'] = 'Phone';\n$lang['list_empl_manage'] = 'Manage';\n$lang['confirm_delete_employee'] = 'Are you sure want to delete this employee?';\n$lang['if_dont_change_emp_pass'] = 'If dont want to change employee password, leave it blank';\n$lang['employee_email_taken'] = 'You allready have employee with this email';\n$lang['no_permissions'] = 'You dont have permission to use this feature!';\n$lang['perm_add_invoice'] = 'Add invoices';\n$lang['perm_edit_invoice'] = 'Edit invoices';\n$lang['perm_delete_invoice'] = 'Delete invoices';\n$lang['perm_change_inv_status'] = 'Change invoices status';\n$lang['perm_add_clients'] = 'Add clients';\n$lang['perm_edit_clients'] = 'Edit clients';\n$lang['perm_delete_clients'] = 'Delete clients';\n$lang['perm_add_items'] = 'Add items';\n$lang['perm_edit_items'] = 'Edit items';\n$lang['perm_delete_items'] = 'Delete items';\n$lang['perm_can_manage_rights'] = 'Manage rights of other employees';\n$lang['perm_add_employees'] = 'Can add new employees';\n$lang['perm_can_manage_firms'] = 'Can change settings of firms';\n$lang['success_save_new_perms'] = 'New permissions are saved!';\n$lang['perm_delete_employees'] = 'Can delete employees';\n$lang['perm_edit_employees'] = 'Can edit employees';\n$lang['perm_view_plans_page'] = 'Can open plans page';\n$lang['usr_admin_menu'] = 'Admin profile';\n$lang['save_user_data'] = 'Save user';\n$lang['cancel_save_user'] = 'Cancel';\n$lang['if_dont_change_usr_pass'] = 'If dont want to change user password, leave it blanк';\n$lang['this_email_is_used'] = 'This email is allready used!';\n$lang['success_update_user_adm'] = 'User is update successful!';\n$lang['problem_update_user_adm_em'] = 'This email address is taken from your employee or another account!';\n$lang['can_access_firms'] = 'Can access firms:';\n$lang['you_cant_view_any_firms'] = 'Sorry but you dont have access to any firms!';\n$lang['employee_add_success'] = 'Employee successful added!';\n$lang['no_template_file'] = 'No template file finded! Please contact support!';\n$lang['composed_from'] = 'Composed from:';\n$lang['schiffer_replace'] = 'Schiffer (replaces signature)';\n$lang['download_print_copy'] = 'Download/Print Copy';\n$lang['download_print_original'] = 'Download/Print Original';\n$lang['original_txt'] = 'Original';\n$lang['copy_txt'] = 'Copy';\n$lang['confirm_delete_invoice'] = 'Are you sure want to delete this invoice? This will be permanently!';\n$lang['delete'] = 'Delete';\n$lang['from_date'] = 'From date:';\n$lang['to_date'] = 'To date:';\n$lang['show_statistic'] = 'Show statistics';\n$lang['reports'] = 'Reports';\n$lang['menu_list_reports'] = 'Reports';\n$lang['num_invoices_stat'] = 'Number of issued invoices';\n$lang['all_the_time'] = 'All the time';\n$lang['num_created'] = 'Num created';\n$lang['issued'] = 'Issued';\n$lang['num_invoices_by_month_stat'] = 'Number of issued invoices by month';\n$lang['no_reports_yet'] = 'There are no issued invoices for selected time';\n$lang['no_reports_yet_all_time'] = 'There are no issued invoices to the moment';\n$lang['amount_invoices_by_month_stat'] = 'Amount %currency% of issued invoices by month';\n$lang['pages_pagination_num'] = 'Num rows in pagination pages';\n$lang['payment_status_paid'] = 'Paid';\n$lang['payment_status_unpaid'] = 'Unpaid';\n$lang['payment_status_partly_paid'] = 'Partly paid';\n$lang['top_search_no_results'] = 'No results found!';\n$lang['show_drafts_report'] = 'Show drafts';\n$lang['to_canceled_stat'] = 'Cancel';\n$lang['remove_canceled_stat'] = 'Remove status cancelled';\n$lang['top_clients_stat'] = 'Top 10 clients - sum of invoices (amount in %currency%)';\n$lang['sum_of_invoices_in_stat'] = 'Sum of issued invoices';\n$lang['menu_list_import_export'] = 'Import/Export';\n$lang['no_invoices_result_export'] = 'There are no invoices';\n$lang['selected_invalid_exporter'] = 'You select invalid exporter!';\n$lang['export'] = 'Export';\n$lang['import'] = 'Import';\n$lang['not_selected_import_file'] = 'Please select file to import';\n$lang['try_to_import_wrong_file_format'] = 'The file you try to import is with wrong format';\n$lang['no_invoice_note_in_xml_import'] = 'No invoice note in xml file. Please sure that this xml is with valid structure.';\n$lang['imp_invalid_inv_type'] = 'Invalid invoice type';\n$lang['imp_inv_number_taken'] = 'Invoice number is taken';\n$lang['imp_wrong_date_created'] = 'Wrong date created timestamp';\n$lang['imp_wrong_date_tax_event'] = 'Wrong date of tax event';\n$lang['imp_wrong_date_maturity'] = 'Wrong maturity date';\n$lang['imp_to_inv_date_wrong'] = 'To invoice date invalid';\n$lang['imp_no_client_name'] = 'Client name is empty';\n$lang['imp_no_client_addr'] = 'Client address is empty';\n$lang['imp_no_item_name'] = 'Item %rowNum% name is empty';\n$lang['imp_no_item_quantity'] = 'Item %rowNum% quantity is empty';\n$lang['imp_no_items'] = 'No items found';\n$lang['inv_num_row_in_file'] = 'Num row of invoice in file';\n$lang['inv_number'] = 'Invoice Number';\n$lang['inv_type'] = 'Invoice Type';\n$lang['inv_errors'] = 'Errors';\n$lang['import_results'] = 'Results of import';\n$lang['inv_action_history'] = 'Status action history';\n$lang['search_inv_num'] = 'Invoice num:';\n$lang['search_client'] = 'Client';\n$lang['search_item'] = 'Item';\n$lang['search_amount_from'] = 'Amount from';\n$lang['search_to'] = 'to';\n$lang['search_date_from'] = 'Date create from';\n$lang['search_payment_type'] = 'Payment type:';\n$lang['search_inv_type'] = 'Type';\n$lang['search_inv_payments'] = 'Payments';\n$lang['search_paied'] = 'Paid';\n$lang['search_unpaied'] = 'Unpaid';\n$lang['search_inv_status'] = 'Status';\n$lang['search_issued'] = 'Issued';\n$lang['search_sended'] = 'Sended';\n$lang['search_refused'] = 'Refused';\n$lang['search_accepted'] = 'Accepted';\n$lang['search_canceled'] = 'Canceled';\n$lang['search_draft'] = 'Draft';\n$lang['search_client_name'] = 'Client name';\n$lang['search_client_bulstat'] = 'Client bulstat';\n$lang['search_item_name'] = 'Item name';\n$lang['clear_search'] = 'Clear search';\n$lang['menu_list_store'] = 'Store';\n$lang['store_settings'] = 'Store settings';\n$lang['my_added_stores'] = 'My stores';\n$lang['store_name'] = 'Store name';\n$lang['no_stores_added'] = 'No stores added';\n$lang['add_new_store'] = 'Add store';\n$lang['empty_store_name'] = 'Empty store name';\n$lang['store_name_taken'] = 'Store name is taken';\n$lang['confirm_delete_store'] = 'Are you sure want to delete this store?';\n$lang['add_store_movement'] = 'Store order';\n$lang['open_store_movements'] = 'Open store movements';\n$lang['create_store_movement'] = 'Create movement';\n$lang['movement_type_in'] = 'In';\n$lang['movement_type_out'] = 'Out';\n$lang['movement_type_move'] = 'Move';\n$lang['movement_type_revision'] = 'Revision';\n$lang['create_movement_type'] = 'Movement type:';\n$lang['create_movement_id'] = 'Movement';\n$lang['create_movement_date_create'] = 'Date created';\n$lang['create_movement_amount'] = 'Movement amount';\n$lang['choose_movem_translation'] = 'Choose Store order translation';\n$lang['how_do_you_round_values_in_move'] = 'To which character do you want to round up the values in the movements';\n$lang['err_create_movem_num'] = 'Movement number is empty';\n$lang['err_create_movem_num_is_taken'] = 'Movement number si taken';\n$lang['err_movem_create_date_create'] = 'Please enter date create';\n$lang['movement_added'] = 'Movement is added';\n$lang['movem_from_store'] = 'From store:';\n$lang['movem_to_store'] = 'To store:';\n$lang['create_movem_from_client'] = 'From client:';\n$lang['create_movem_to_client'] = 'To client:';\n$lang['item_is_not_in_store'] = 'Item %item% is not in this store';\n$lang['item_no_enought_quantity'] = 'Item %item% dont have enought quantity in store';\n$lang['allow_negative_qua_in_store'] = 'Allow negative quantities in store';\n$lang['trans_bill_of_goods'] = 'Store order';\n$lang['trans_date'] = 'Date';\n$lang['trans_address'] = 'Address';\n$lang['trans_betrayed'] = 'Betrayed';\n$lang['trans_accepted'] = 'Accepted';\n$lang['trans_vat'] = 'Vat';\n$lang['trans_vat_amount'] = 'Vat amount';\n$lang['trans_no_vat_reason'] = 'No vat reason';\n$lang['trans_product_name'] = 'Product name';\n$lang['trans_product_quantity'] = 'Product quantity';\n$lang['trans_product_quantity_type'] = 'Product quantity type';\n$lang['trans_product_amount'] = 'Product amount';\n$lang['trans_payment_method'] = 'Payment method';\n$lang['no_movements_yet'] = 'No movements added';\n$lang['list_movement'] = 'Movement';\n$lang['list_bill_of_lading'] = 'Store order';\n$lang['list_movem_type'] = 'Type';\n$lang['list_movem_status'] = 'Status';\n$lang['list_movem_from'] = 'From';\n$lang['list_movem_to'] = 'To';\n$lang['movem_preview'] = 'Preview';\n$lang['movem_type_in'] = 'In';\n$lang['movem_type_out'] = 'Out';\n$lang['movem_type_move'] = 'Move';\n$lang['movem_type_revision'] = 'Revision';\n$lang['movem_stat_confirmed'] = 'Confirmed';\n$lang['movem_stat_cancelled'] = 'Cancelled';\n$lang['search_by_store'] = 'Store:';\n$lang['search_store_client'] = 'Client:';\n$lang['all_stores'] = 'All stores';\n$lang['preview_movem_num'] = 'Movement number:';\n$lang['preview_movem_type'] = 'Movement type:';\n$lang['preview_movem_currency'] = 'Movement currency:';\n$lang['preview_movem_status'] = 'Movement status:';\n$lang['preview_movem_from'] = 'From:';\n$lang['preview_movem_to'] = 'To:';\n$lang['movement_item_name'] = 'Item name';\n$lang['movement_item_quantity'] = 'Quantity';\n$lang['movement_item_before_revision'] = 'Before revision';\n$lang['movement_item_after_revision'] = 'After revision';\n$lang['movement_item_difference'] = 'Difference';\n$lang['bill_of_lading'] = 'Store order';\n$lang['trans_city'] = 'City';\n$lang['momvem_betrayed'] = 'Betrayed';\n$lang['momvem_accepted'] = 'Accepted';\n$lang['store_stocks'] = 'Stocks';\n$lang['preview_movem_betrayed'] = 'Betrayed:';\n$lang['preview_movem_accepted'] = 'Accepted:';\n$lang['no_stocks_yet'] = 'No stocks';\n$lang['back_to_movements'] = 'Back to movements';\n$lang['countInvoices'] = 'Count invoices:';\n$lang['with_sum_of'] = 'with total amount of';\n$lang['report_show_paid'] = 'Show only paid invoices';\n$lang['report_show_unpaid'] = 'Show only unpaid invoices';\n$lang['report_show_partly_paid'] = 'Show only partly paid invoices';\n$lang['report_show_all'] = 'Show only all (paid, unpaid) invoices';\n$lang['menu_list_warranties'] = 'Warranties';\n$lang['no_warranties_yet'] = 'No warranties added';\n$lang['add_warranty'] = 'Add warranty';\n$lang['add_war_translation'] = 'Add warranty language';\n$lang['create_warranty_id'] = 'Warranty';\n$lang['create_warranty_from_date'] = 'Valid from date:';\n$lang['create_war_item'] = 'Item';\n$lang['create_war_months'] = 'Months';\n$lang['create_war_serial_num'] = 'Serial Number';\n$lang['open_warranties'] = 'open warranties list';\n$lang['create_warranty'] = 'Create warranty';\n$lang['trans_warranty_card'] = 'Warranty Card';\n$lang['trans_date_valid'] = 'Date valid';\n$lang['trans_product_months'] = 'Months';\n$lang['trans_product_valid_to'] = 'Valid to';\n$lang['trans_product_serial_num'] = 'Serial number';\n$lang['trans_received'] = 'Received';\n$lang['trans_warranty_conditions'] = 'Warranty conditions';\n$lang['err_create_war_num'] = 'Invalid warranty number';\n$lang['err_create_war_num_is_taken'] = 'Warranty number is taken';\n$lang['err_create_war_no_item_month'] = 'No item month';\n$lang['warranty_added'] = 'Warranty added';\n$lang['delete_warranties'] = 'Delete';\n$lang['list_war_number'] = 'Number';\n$lang['list_war_to_inv'] = 'To invoice';\n$lang['list_war_valid_from'] = 'Valid from';\n$lang['list_war_client'] = 'Client';\n$lang['list_war_action'] = 'Actions';\n$lang['create_warranty_to_inv'] = 'To invoice number:';\n$lang['edit_warranty'] = 'Edit';\n$lang['warranty_updated'] = 'Warranty updated';\n$lang['warranty_received'] = 'Received';\n$lang['warranty_compiled'] = 'Compiled';\n$lang['warranty_conditions'] = 'Conditions';\n$lang['warranty_settings'] = 'Warranty settings';\n$lang['add_new_condition'] = 'Add condition';\n$lang['warranty_conditions'] = 'Warranty conditions';\n$lang['no_conditions_added'] = 'No conditions added';\n$lang['condition_title'] = 'Title (for internal use)';\n$lang['condition_description'] = 'The condition for client';\n$lang['confirm_delete_condition'] = 'Are you sure want to delete this condition?';\n$lang['war_condit_preview_descr'] = 'Preview description';\n$lang['select_saved_condition'] = 'Select saved condition';\n$lang['list_war_events'] = 'Events';\n$lang['war_events'] = 'Events';\n$lang['add_new_war_event'] = 'Add event';\n$lang['date_war_event_manupulation'] = 'Event date';\n$lang['war_event_item'] = 'Item';\n$lang['repair'] = 'Repair';\n$lang['war_event_type'] = 'Type';\n$lang['war_event_description'] = 'Description';\n$lang['save_war_event'] = 'Save';\n$lang['replacement'] = 'Replacement';\n$lang['no_war_events_yet'] = 'No warranty events';\n$lang['war_ev_item'] = 'Item:';\n$lang['war_ev_type'] = 'Type:';\n$lang['war_ev_date'] = 'Date:';\n$lang['war_ev_descr'] = 'Description:';\n$lang['menu_list_protocols'] = 'Protocols';\n$lang['perm_add_movement'] = 'Can add movements';\n$lang['perm_view_movement_page'] = 'Can view movements';\n$lang['perm_view_store_stocks'] = 'Can view store stocks page';\n$lang['perm_view_warranty_page'] = 'Can view warranty page';\n$lang['perm_add_warranty'] = 'Can add warranties';\n$lang['perm_view_warranty_events'] = 'Can view warranty events';\n$lang['perm_add_warranty_events'] = 'Can add warranty event';\n$lang['perm_view_protocols_page'] = 'Can view protocols page';\n$lang['no_protocols_yet'] = 'No protocols added';\n$lang['protocols_settings'] = 'Protocols settings';\n$lang['add_protocol'] = 'Add protocols';\n$lang['delete_protocols'] = 'Delete';\n$lang['perm_add_protocol'] = 'Can add protocols';\n$lang['create_protocol_acceptable'] = 'Acceptable';\n$lang['create_protocol_transmitter'] = 'Transmitter';\n$lang['create_protocol_type'] = 'Type';\n$lang['create_protocol_from_date'] = 'From date:';\n$lang['protocol_number'] = 'Protocol';\n$lang['create_protocol'] = 'Create protocol';\n$lang['open_protocols'] = 'Open protocols';\n$lang['my_added_provider_transmits'] = 'Provider transmit texts';\n$lang['no_provider_trans_txts_added'] = 'No provider transmit texts added';\n$lang['provider_trans_title'] = 'Title (for internal use)';\n$lang['provider_trans_description'] = 'Description for users';\n$lang['add_new_provider_desc'] = 'Add';\n$lang['confirm_delete_provider_trasmit'] = 'Are you sure want to delete provider transmit text?';\n$lang['no_contr_txts_added'] = 'No contract texts added';\n$lang['select_saved_contracts'] = 'Select from saved contracts';\n$lang['protocol_contracts'] = 'Contract';\n$lang['provider_transmit'] = 'Provider transmit';\n$lang['select_saved_provider_trans'] = 'Select from saved texts';\n$lang['add_protocol_translation'] = 'Add protocol language';\n$lang['trans_protocol_number'] = 'Number';\n$lang['trans_supplier'] = 'Supplier';\n$lang['trans_product_final_price'] = 'Final price';\n$lang['trans_final_amount'] = 'Final amount';\n$lang['err_create_prot_num'] = 'Empty protocol number';\n$lang['err_create_prot_num_is_taken'] = 'This protocol number is taken';\n$lang['err_create_prot_no_item_qa'] = 'Empty quantity';\n$lang['protocol_added'] = 'Protocol is added';\n$lang['protocol_updated'] = 'Protocol is updated';\n$lang['protocol_to_inv'] = 'To invoice';\n$lang['protocol_from_date'] = 'From date';\n$lang['protocol_client'] = 'Client';\n$lang['protocols_action'] = 'Action';\n$lang['create_protocol_amount'] = 'Amount';\n$lang['trans_to_invoice'] = 'To invoice';\n$lang['trans_transmission_protocol'] = 'Transmission protocol';\n$lang['language'] = 'Language';\n$lang['show_logo_in_inv'] = 'Show logo in invoices';\n$lang['remove_firm_image'] = 'Remove logo';\n$lang['firm_vat_number'] = 'Vat Number';\n$lang['firm_is_vat_registered'] = 'Vat Registration';\n$lang['firm_details_changed'] = 'Firm details are changed';\n$lang['trans_vat_number'] = 'Vat Number';\n$lang['partly_paid'] = 'Partly paid';\n$lang['search_partly_paid'] = 'Partly paid';\n$lang['logout'] = 'Logout';\n$lang['home'] = 'Home';\n$lang['warranties'] = 'Warranties';\n$lang['protocols'] = 'Protocols';\n$lang['import_export'] = 'Import/Export';\n$lang['explain_inv_translation'] = 'Add/select a translation of the invoices you issue in your language';\n$lang['explain_firm_translation'] = 'Select a translation of your business data';\n$lang['search'] = 'Search';\n$lang['explain_movem_translation'] = 'Add/select a translation of the Store order you issue in your language';\n$lang['explain_protocol_translation'] = 'Add/select a translation of protocol you issue in your language';\n$lang['explain_war_translation'] = 'Add/select a translation of warranty you issue in your language';\n$lang['bulstat'] = 'Bulstat:';\n$lang['ident_num'] = 'Ident Number:';\n$lang['amount'] = 'Amount:';\n$lang['employees'] = 'Employees';\n$lang['global'] = 'Global settings';\n$lang['warranty'] = 'Warranty';\n$lang['add_employees'] = 'Add employee';\n$lang['rights'] = 'Rights';\n$lang['save'] = 'Save';\n$lang['my_added_contracts'] = 'Contract texts';\n$lang['edit_admin'] = 'administrator edit';\n$lang['preview_client'] = 'Client preview';\n$lang['edit'] = 'Edit';\n$lang['preview_item'] = 'Item preview';\n$lang['add_movement'] = 'Add movement';\n$lang['stocks'] = 'Stocks';\n$lang['movement_preview'] = 'Movement preview';\n$lang['warranty_events'] = 'Warranty events';\n$lang['cancel'] = 'Cancel';\n$lang['add_warranty_event'] = 'Add warranty event';\n$lang['edit_firm_info'] = 'Firm edit';\n$lang['documents'] = 'Invoices';\n$lang['companies'] = 'Companies';\n$lang['show_main_menu'] = 'Show menu';\n$lang['plan_basic'] = 'Basic';\n$lang['plan_advanced'] = 'Advanced';\n$lang['plan_pro'] = 'Pro';\n$lang['plan_custom'] = 'Custom';\n$lang['plans_most'] = 'Most';\n$lang['plans_popular'] = 'Popular';\n$lang['plans_month'] = 'month';\n$lang['plans_choose'] = 'Choose';\n$lang['plans_num_inv'] = 'Invoices';\n$lang['plans_num_firms'] = 'Companies';\n$lang['plans_one_m_bonus'] = '+1 month BONUS';\n$lang['plan_period'] = 'Period';\n$lang['plans_period'] = 'Plans period';\n$lang['confirm_plan_requiest'] = 'Confirm requiest';\n$lang['plan_period'] = 'Period';\n$lang['plan_payment_type'] = 'Payment method';\n$lang['plan_payment_bank'] = 'Bank';\n$lang['plan_payment_paypal'] = 'PayPal';\n$lang['plan_payment_sms'] = 'SMS';\n$lang['plan_payment_easypay'] = 'EasyPay';\n$lang['plan_period_month'] = 'Month';\n$lang['plan_period_months'] = 'Months';\n$lang['plan_period_year'] = 'Year';\n$lang['my_plan_request'] = 'Plan request';\n$lang['payment_awaiting'] = 'We are awaiting your payment';\n$lang['plan_type'] = 'Plan type';\n$lang['plan_date_generated'] = 'Date of payment request';\n$lang['plan_req_num'] = 'Request number';\n$lang['payment_details'] = 'Payment details';\n$lang['info_box'] = 'Info!';\n$lang['plan_will_started'] = 'Your plan will be activated as soon as we receive your payment and you will receive invoices to your email address';\n$lang['cancel_pay_req'] = 'Cancel payment request';\n$lang['confirm_cancel_req'] = 'Are you sure want to cancel this payment request?';\n$lang['pay_det_name_of_rec'] = 'Name of recipient';\n$lang['pay_det_iban'] = 'IBAN of recipient';\n$lang['pay_det_bic'] = 'BIC of recipient';\n$lang['pay_det_to_bank'] = 'To bank';\n$lang['pay_det_sum'] = 'Amount';\n$lang['dont_forget_req_num'] = 'Be sure to include the request number in the description';\n$lang['plans_make_request'] = 'Make a request';\n$lang['plan_send_us_req'] = 'What is the plan you want to use?';\n$lang['send_plan_req'] = 'Send request';\n$lang['plan_req_inv_per_mon'] = 'How many invoices do you want to issue per month';\n$lang['plan_req_companies'] = 'How many businesses you will use';\n$lang['when_we_see_plan_req'] = 'Once we review the plan you want, we will add it to the other plans page and you will be notified by email.';\n$lang['plan_req_sended'] = 'Plan request sent. Expect to notify you by email within the day.';\n$lang['already_have_req'] = 'You already have request for individual plan with  %num_inv% invoices and %companies% companies. If you send new request the old will be rejected.';\n$lang['plans_make_new_request'] = 'Make a new request';\n$lang['title_everytime'] = 'Electronic invoicing - ';\n$lang['title_clients'] = 'Clients';\n$lang['title_add_client'] = 'Add client';\n$lang['title_preview_client'] = 'Preview client';\n$lang['title_home_page'] = 'Home';\n$lang['title_import_export'] = 'Import/Export';\n$lang['title_invoices'] = 'List invoices';\n$lang['title_inv_preview'] = 'Invoice preview - ';\n$lang['title_new_inv'] = 'New invoice';\n$lang['title_items'] = 'Items';\n$lang['title_add_item'] = 'Add item';\n$lang['title_item_preview'] = 'Item preview';\n$lang['title_manage_firms'] = 'Manage firms';\n$lang['title_edit_firm'] = 'Edit firm';\n$lang['title_plans'] = 'Plans';\n$lang['title_choose_plan_period'] = 'Choose plan period';\n$lang['title_plan_req'] = 'Your plan request';\n$lang['title_protocols'] = 'Protocols';\n$lang['title_add_protocol'] = 'Add protocol';\n$lang['title_reports'] = 'Reports';\n$lang['title_admin'] = 'Edit administrator';\n$lang['title_employees'] = 'Employees';\n$lang['title_add_employee'] = 'Add employee';\n$lang['title_empl_rights'] = 'Employees rights';\n$lang['title_global_sett'] = 'Global settings';\n$lang['title_inv_sett'] = 'Invoices settings';\n$lang['title_protoc_sett'] = 'Protocols settings';\n$lang['title_settings'] = 'Setting';\n$lang['title_store_sett'] = 'Store settings';\n$lang['title_warr_sett'] = 'Warranty settings';\n$lang['title_movem_prev'] = 'Movement preview';\n$lang['title_movements'] = 'Movements';\n$lang['title_add_movement'] = 'Add movement';\n$lang['title_stocks'] = 'Stock';\n$lang['title_events'] = 'Warranty events';\n$lang['title_add_event'] = 'Add warranty event';\n$lang['title_warranties'] = 'Warranties';\n$lang['title_add_warr'] = 'Add warranty';\n$lang['create_first_one_inv'] = 'Create first one';\n$lang['limit_inv_error'] = 'You have exhausted your invoice limit. If you want to issue an invoice you will have to renew your plan or must wait one month from last issued invoices to have new one (max 5)';\n$lang['my_active_plans'] = 'Active plans';\n$lang['active_to'] = 'Active to:';\n$lang['left_inv_from_plan'] = 'Left invoices:';\n$lang['num_companies_plan'] = 'Firms:';\n$lang['started_from'] = 'Started from:';\n$lang['exceeded_limit_firms'] = 'Your business usage limit is exceeded. Please delete any of the companies or move on to a higher plan to continue working on the site. This deletion will not be permanent and if you go to a larger plan, you will have the opportunity to restore the company.';\n$lang['create_movement_lot'] = 'LOT#:';\n$lang['create_movement_expire'] = 'Expiry date:';\n$lang['preview_movem_lot'] = 'LOT#:';\n$lang['preview_movem_expire'] = 'Expiry date:';\n$lang['expire_date_to'] = 'Expiry date to:';\n$lang['bill_of_lading_down'] = 'Download store order';\n$lang['preview_movem_to_inv'] = 'To invoice:';\n$lang['to_inv_movem_not_set'] = 'No created invoice';\n$lang['pay_elsewhere'] = 'I want to pay elsewhere. Show me bank details.';\n$lang['inv_templ_change'] = 'Change invoices template';\n$lang['plans_year'] = 'year';\n$lang['plan_period_years'] = 'years';\n$lang['per_12_months'] = 'per 12 months';"
  },
  {
    "path": "application/language/france/db_lang.php",
    "content": ""
  },
  {
    "path": "application/language/france/email_lang.php",
    "content": ""
  },
  {
    "path": "application/language/france/form_validation_lang.php",
    "content": "<?php\n\n "
  },
  {
    "path": "application/language/france/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/language/france/js/all.js",
    "content": "var lang = {\n    invalid_email: 'Adresse e-mail invalide!',\n    invalid_pass: 'Veuillez entrer le mot de passe!',\n    invalid_pass2: 'Merci de répéter le mot de passe!',\n    passwords_dont_match: 'Les mots de passe ne correspondent pas!',\n    rules_not_checked: 'Veuillez vérifier les règles!',\n    proforma: 'Pro-forme',\n    invoice: \"Facture d'achat\",\n    debit_note: 'Note de débit',\n    credit_note: 'Note de crédit',\n    errorCreateDocument: 'Nous avons trouvé les champs vides suivants',\n    currencyItemNotSame: 'Le prix saisi pour cet article est dans une devise différente',\n    errorCreateClient: 'Certains champs obligatoires du client sont vides!',\n    errorCreateItem: 'Certains champs obligatoires sont vides!',\n    errorCreateEmployee: 'Vous avez des champs invalides!',\n    noCheckedCheckboxes: \"Il n'y a rien sélectionné!\",\n    confirmDelete: 'Voulez-vous vraiment supprimer?',\n    errorChangeInvStatusAjax: \"Erreur de changement d'état de la facture. Essayez à nouveau s'il vous plaît!\",\n    confirmCancel: 'Êtes-vous sûr de vouloir annuler?',\n    confirmRemoveCancel: 'Voulez-vous vraiment supprimer le statut annulé?',\n    show_main_menu: 'Afficher le menu',\n    hide_main_menu: 'Masquer le menu'\n};"
  },
  {
    "path": "application/language/france/pagination_lang.php",
    "content": "<?php \n$lang['first'] = 'Premier';\n$lang['last'] = 'Dernier';\n$lang['next'] = 'Prochain';\n$lang['previous'] = 'précédent';\n$lang['pagination_last_link'] = 'Dernier';\n$lang['pagination_first_link'] = 'Premier';\n"
  },
  {
    "path": "application/language/france/profiler_lang.php",
    "content": "<?php ?>\n"
  },
  {
    "path": "application/language/france/public_lang.php",
    "content": "<?php\n\n$lang['btn_home'] = 'Accueil';\n$lang['btn_register'] = 'inscription';\n$lang['btn_plans'] = 'Des plans';\n$lang['btn_features'] = 'fonctionnalités';\n$lang['btn_help'] = 'Aidez';\n$lang['btn_contacts'] = 'Contacts';\n$lang['btn_login'] = \"Connexion\";\n$lang['header_text'] = 'Créez et envoyez facilement des factures';\n$lang['login_email'] = 'Email';\n$lang['login_pass'] = 'Mot de passe';\n$lang['btn_logme'] = 'Connectez';\n$lang['home_slide_tx1'] = 'émettre';\n$lang['home_slide_free'] = 'gratuitement';\n$lang['check_our_options'] = 'Consultez nos options et fonctionnalités!';\n$lang['home_slide_register_now'] = 'Inscrire maintenant!';\n$lang['electronic_invoices'] = 'factures électroniques';\n$lang['register_now'] = 'Inscrire maintenant!';\n$lang['text_register_after_carousel'] = 'Inscrivez-vous';\n$lang['text_free_after_carousel'] = 'gratuitement';\n$lang['text_account_after_carousel'] = 'compte et commencer à émettre des factures!';\n$lang['text_bottom_after_carousel'] = \"Pour l'inscription besoin de remplir seulement 3 champs! Il faudra moins d'une minute et commencer à émettre des factures!\";\n$lang['what_is'] = 'Quel est';\n$lang['and_how_it_works'] = 'et comment ça marche?';\n$lang['forgotten_pass'] = 'Mot de passe oublié?';\n$lang['one_acc'] = '1 Compte - plusieurs entreprises';\n$lang['send_by_email'] = 'Envoyé par email';\n$lang['invent_store'] = 'Inventaire et système de stockage';\n$lang['down_pdf'] = 'Télécharger en PDF';\n$lang['24_support'] = '27/7 Soutien';\n$lang['inv_templates'] = 'Modèles de factures';\n$lang['become_member_in_3'] = 'Envoyer des factures en seulement 3 étapes faciles!';\n$lang['payment_methods'] = 'Méthodes de payement';\n$lang['support_footer'] = 'Soutien';\n$lang['support_questions'] = 'Questions posées';\n$lang['support_menu'] = 'Créer une facture';\n$lang['comming_features'] = 'De nouvelles fonctionnalités';\n$lang['registration_modal'] = 'enregistrement';\n$lang['reg_email'] = 'Votre adresse email';\n$lang['reg_pass'] = 'Votre mot de passe';\n$lang['reg_pass_repeat'] = 'Répéter le mot de passe';\n$lang['reg_p_email'] = 'yourname@domain.com';\n$lang['reg_p_secret'] = 'Votre mot de passe secret';\n$lang['reg_p_secret2'] = 'Répétez votre mot de passe secret';\n$lang['close'] = 'Fermer';\n$lang['register_me'] = 'Inscrivez-moi';\n$lang['confirm_rules'] = 'Confirmer les règles';\n$lang['read_rules'] = 'termes et conditions';\n$lang['write_us'] = 'Écrivez-nous un message';\n$lang['contacts'] = 'Contacts';\n$lang['or_send_to'] = 'ou envoyer à';\n$lang['your_name'] = 'Votre nom';\n$lang['your_email'] = 'Votre email';\n$lang['your_subject'] = 'Votre sujet';\n$lang['send'] = 'Envoyer';\n$lang['we_received'] = 'Je vous remercie! Nous avons reçu votre message et vous répondrons bientôt!';\n$lang['find_by_keyword'] = 'Rechercher par mot-clé:';\n$lang['term'] = 'Terme';\n$lang['find_by_tags'] = 'Rechercher par tags:';\n$lang['published'] = 'publié';\n$lang['features'] = 'Caractéristiques';\n$lang['registration'] = 'enregistrement';\n$lang['register_account'] = 'Créer un compte';\n$lang['i_have_account'] = \"J'ai déjà un compte\";\n$lang['login'] = 'Connexion';\n$lang['log_to_your_acc'] = 'Connectez-vous à votre compte';\n$lang['invalid_email'] = 'Adresse e-mail invalide!';\n$lang['empty_password'] = 'Le mot de passe est vide!';\n$lang['empty_password_repeat'] = 'Veuillez répéter le mot de passe!';\n$lang['passwords_dont_match'] = 'Les mots de passe ne correspondent pas!';\n$lang['rules_not_checked'] = 'Les règles ne sont pas confirmées!';\n$lang['blog_preview'] = 'Aperçu du blog';\n$lang['recover_your_pass'] = 'Récupérer votre mot de passe';\n$lang['send_pass_link'] = 'Envoyez-moi un nouveau mot de passe';\n$lang['help_footer'] = \"Lisez les questions les plus fréquemment posées si vous avez besoin d'aide supplémentaire, s'il vous plaît contactez-nous!\";\n$lang['help'] = 'AIDEZ-MOI';\n$lang['specifications'] = 'Caractéristiques';\n$lang['plans'] = 'Des plans';\n$lang['store'] = 'Entrepôt';\n$lang['saved_clients'] = 'Clients';\n$lang['saved_articles'] = 'Des articles';\n$lang['create_protocols'] = 'Créer des protocoles';\n$lang['periodic_invoices'] = 'Factures périodiques';\n$lang['registered_by_user'] = 'Cette adresse email est enregistrée par un autre utilisateur.';\n$lang['usr_or_pass_invalid'] = \"Le nom d'utilisateur ou le mot de passe est erroné!\";\n$lang['database_error'] = \"Nous avons une erreur maintenant. Contactez nous s'il vous plait!\";\n$lang['choose_type_of_login'] = 'Choisissez le type de connexion';\n$lang['there_are_two_types'] = 'Il existe deux types de connexion pour cet e-mail et ce mot de passe!';\n$lang['type_employee'] = \"Connexion en tant qu'employé\";\n$lang['type_user'] = \"Connexion en tant qu'utilisateur\";\n$lang['example_of_xml_import_file'] = \"Exemple de fichier d'importation XML\";\n$lang['imports_feature'] = 'Importer des factures';\n$lang['universal_xml'] = 'Importation XML universelle';\n$lang['exports_feature'] = 'Exporter les factures';\n$lang['export_in_xml'] = 'Exporter en XML';\n$lang['xml_export_info'] = \"Nous prenons également en charge l'export en XML (identique au fichier Universal XML Import) mais avec les éléments inclus\";\n$lang['export_in_excel'] = 'Exporter en EXCEL';\n$lang['excel_export_info'] = \"Nous soutenons également l'exportation dans XLS avec la facture et l'information de client. Colonnes exportées: Invoice Number | Invoice Type | Client Name | Client Address | Client Bulstat/PIN | Client Vat Number | Client Accountable person | Date of issue | Date Tax Event | Invoice Amount | Discount | Tax Base | Vat Sum | Total | Currency | Payment Type | Payment status | Compiled | Sended | Received | Date of receive | Return reason | Date created | Vat Reason | Remarks | Maturity date\";\n$lang['create_and_send_inv_with'] = 'Créer et envoyer des factures avec';\n$lang['p_reason'] = 'Raison';\n$lang['log_me_public_home'] = 'Connectez-vous à mon compte';\n$lang['use_it_online'] = 'Utilisez-le en ligne';\n$lang['there_is']  ='Il y a';\n$lang['no_need'] = \"Ce n'est pas nécessaire\";\n$lang['to_down_noth'] = \"télécharger rien. Vous pouvez l'utiliser absolument\";\n$lang['high_protect_serve'] = 'en ligne et sauvegardez vos données sur nos serveurs hautement protégés.';\n$lang['have_support'] = 'Vous aurez du soutien';\n$lang['every_day_and_hour']='tous les jours et heure'; \n$lang['make_it_easy'] ='Emettre à 5 factures chaque mois gratuitement!';\n$lang['reg_for_free_use_for'] = \"Créer et envoyer des factures le premier mois gratuitement avec le plan le plus élevé, alors seulement pour 50 € par an. L'inscription prend 1 minute\";\n$lang['issue_to_5'] = 'Emettre à 5 factures chaque mois gratuitement!';\n$lang['security'] = 'Sécurité et Cryptage';"
  },
  {
    "path": "application/language/france/titles_lang.php",
    "content": "<?php\r\n\r\n$lang['title_home'] = 'Factures électroniques, E-mails';\r\n$lang['description_home'] = 'Commencer à émettre et à envoyer des factures électroniques';\r\n\r\n$lang['title_login'] = 'Connectez-vous et commencez à émettre des factures';\r\n$lang['description_login'] = 'Entrez votre email et votre mot de passe et connectez-vous à votre programme de facturation';\r\n\r\n$lang['title_register'] = 'Inscription';\r\n$lang['description_register'] = 'Inscrivez-vous simplement en entrant votre email et votre mot de passe';\r\n\r\n$lang['title_forgotten'] = 'Restaurez votre mot de passe';\r\n$lang['description_forgotten'] = 'Changer votre mot de passe oublié';"
  },
  {
    "path": "application/language/france/upload_lang.php",
    "content": "<?php\n\n$lang['upload_userfile_not_set'] = \"Impossible de trouver une variable de publication appelée fichier utilisateur.\";\n$lang['upload_file_exceeds_limit'] = \"Le fichier téléchargé dépasse la taille maximale autorisée dans votre fichier de configuration PHP.\";\n$lang['upload_file_exceeds_form_limit'] = \"Le fichier téléchargé dépasse la taille maximale autorisée par le formulaire de soumission.\";\n$lang['upload_file_partial'] = \"Le fichier n'a été que partiellement téléchargé.\";\n$lang['upload_no_temp_directory'] = \"Le fichier n'a été que partiellement téléchargé. Le dossier temporaire est manquant.\";\n$lang['upload_unable_to_write_file'] = \"Le fichier n'a pas pu être écrit sur le disque.\";\n$lang['upload_stopped_by_extension'] = \"Le téléchargement du fichier a été arrêté par extension.\";\n$lang['upload_no_file_selected'] = \"Vous n'avez pas sélectionné de fichier à télécharger.\";\n$lang['upload_invalid_filetype'] = \"Le type de fichier que vous essayez de télécharger n'est pas autorisé.\";\n$lang['upload_invalid_filesize'] = \"Le fichier que vous essayez de télécharger est plus grand que la taille autorisée.\";\n$lang['upload_invalid_dimensions'] = \"L'image que vous tentez de télécharger dépasse la hauteur ou la largeur maximale.\";\n$lang['upload_destination_error'] = \"Un problème est survenu lors de la tentative de déplacement du fichier téléchargé vers la destination finale.\";\n$lang['upload_no_filepath'] = \"Le chemin de téléchargement ne semble pas être valide.\";\n$lang['upload_no_file_types'] = \"Vous n'avez spécifié aucun type de fichier autorisé.\";\n$lang['upload_bad_filename'] = \"Le nom de fichier que vous avez envoyé existe déjà sur le serveur.\";\n$lang['upload_not_writable'] = \"Le dossier de destination du téléchargement ne semble pas accessible en écriture.\";\n"
  },
  {
    "path": "application/language/france/users_lang.php",
    "content": "<?php\n\n$lang['change_firm'] = \"Changer d'entreprise\";\n$lang['manage_firms'] = 'Gérer les entreprises';\n$lang['search_header_u'] = 'Chercher';\n$lang['menu_create_invoice'] = 'Créer une facture';\n$lang['menu_list_invoices'] = 'Mes factures';\n$lang['dont_have_firms'] = \"Vous n'avez pas d'entreprises\";\n$lang['no_firm_data'] = 'Entrez les détails de votre entreprise';\n$lang['firm_name'] = 'Nom de la compagnie:';\n$lang['firm_bulstat'] = 'Société bulstat:';\n$lang['firm_reg_address'] = \"Adresse d'enregistrement:\";\n$lang['firm_city'] = \"Ville de l'entreprise:\";\n$lang['firm_mol'] = \"Personne responsable de l'entreprise:\";\n$lang['save_firm_details'] = 'Enregistrer les détails';\n$lang['empty_firm_name'] = \"Nom de l'entreprise vide!\";\n$lang['empty_firm_bulstat'] = \"Bulstat de l'entreprise vide!\";\n$lang['empty_firm_reg_address'] = \"Adresse d'enregistrement de l'entreprise vide!\";\n$lang['empty_firm_city'] = 'Ville de compagnie vide!';\n$lang['empty_firm_mol'] = 'Personne responsable de la société vide!';\n$lang['bulstat_is_taken'] = 'La société bulstat est déjà enregistrée!';\n$lang['menu_home'] = 'Accueil';\n$lang['selected_home'] = 'Accueil';\n$lang['selected_manage_firms'] = 'Gérer les entreprises';\n$lang['add_new_company'] = 'Ajouter une entreprise';\n$lang['list_firms'] = 'Liste de mes entreprises';\n$lang['firm_default'] = 'Défaut';\n$lang['make_firm_default'] = 'Faire défaut';\n$lang['delete_firm_confirm'] = 'Voulez-vous vraiment supprimer cette société? Cela va supprimer tout ce qui est créé pour elle!';\n$lang['default_firm_confirm'] = 'Voulez-vous vraiment rendre cette société par défaut?';\n$lang['menu_list_clients'] = 'Mes clients';\n$lang['company_deleted'] = \"L'entreprise est supprimée!\";\n$lang['company_added'] = 'Compagnie ajoutée!';\n$lang['firms_translations'] = 'Traductions';\n$lang['trans_name'] = 'Nom de la traduction (pour usage interne):';\n$lang['firm_image'] = 'Logo';\n$lang['no_image'] = \"Pas d'image\";\n$lang['add_new_translation'] = 'Ajouter une nouvelle traduction';\n$lang['save_changes'] = 'Sauvegarder les modifications';\n$lang['save_translation'] = 'Sauvegarder la traduction';\n$lang['translation_updated'] = 'La traduction est mise à jour avec succès!';\n$lang['upload_img_error'] = \"Importer une erreur d'image -\";\n$lang['add_translation'] = 'Ajouter une traduction';\n$lang['new_translation_added'] = 'Nouvelle traduction est ajoutée!';\n$lang['translation_is_default'] = 'défaut';\n$lang['make_translation_default'] = 'Faire défaut';\n$lang['default_translate_confirm'] = 'Êtes-vous sûr de vouloir faire cette traduction par défaut?';\n$lang['delete_translation'] = 'Supprimer la traduction';\n$lang['translation_deleted'] = 'La traduction est supprimée avec succès!';\n$lang['translation_delete_confirm'] = 'Voulez-vous vraiment supprimer cette traduction?';\n$lang['error_delete_translation'] = 'Erreur Supprimer la traduction!';\n$lang['invoice'] = \"Facture d'achat\";\n$lang['create_inv_type'] = 'Type:';\n$lang['create_inv_proforma'] = 'Pro-forma';\n$lang['create_inv_debit'] = 'Note de débit';\n$lang['create_inv_credit'] = 'Note de crédit';\n$lang['create_inv_invoice'] = \"Facture d'achat\";\n$lang['or'] = 'ou';\n$lang['open_invoices'] = 'Ouvrir les factures';\n$lang['create_inv_save'] = 'Créer une facture';\n$lang['create_invoice'] = 'Créer une facture';\n$lang['create_inv_client'] = 'Client:';\n$lang['create_inv_choose'] = 'Sélectionnez dans la liste';\n$lang['create_inv_bulstat'] = 'Bulstat:';\n$lang['create_inv_mol'] = 'Personne responsable:';\n$lang['create_inv_city'] = 'Ville:';\n$lang['create_inv_address'] = 'Adresse:';\n$lang['create_inv_country'] = 'Pays:';\n$lang['create_inv_recipient'] = 'Bénéficiaire:';\n$lang['create_inv_inv_num'] = \"Facture d'achat\";\n$lang['create_inv_date_create'] = 'Date de facture:';\n$lang['create_inv_date_tax'] = \"Une date d'un événement fiscal:\";\n$lang['create_inv_i_maturity_date'] = \"Indiquer une date d'échéance\";\n$lang['create_inv_maturity_date'] = \"Date d'échéance:\";\n$lang['create_inv_cash_acc'] = 'Comptabilité de caisse';\n$lang['create_inv_item'] = 'Article';\n$lang['create_inv_quantity'] = 'Quantité';\n$lang['create_inv_price'] = 'Prix';\n$lang['create_inv_total'] = 'Total';\n$lang['sure_want_to_del_item'] = 'Voulez-vous vraiment supprimer cet élément?';\n$lang['add_new_item_to_table'] = 'Ajouter un item';\n$lang['create_inv_remarks'] = 'Remarques';\n$lang['visibile_for_client'] = 'Visible pour le client';\n$lang['create_inv_payment_type'] = \"Mode de paiement\";\n$lang['create_inv_invoice_amount'] = 'Montant de la facture';\n$lang['create_inv_discount'] = 'Remise';\n$lang['create_inv_tax_base'] = \"Base d'imposition\";\n$lang['create_inv_vat'] = 'TVA:';\n$lang['create_inv_total'] = 'Total';\n$lang['create_inv_no_vat_mark'] = 'No TVA';\n$lang['create_inv_reason_no_vat'] = 'Raison de la TVA non facturée:';\n$lang['select_curreny'] = 'Devise sélectionnée:';\n$lang['settings_invoices'] = 'Paramètres Factures';\n$lang['menu_list_items'] = 'Mes articles';\n$lang['default_currency'] = 'Choisir la devise par défaut pour les factures';\n$lang['default_currency_null'] = 'Aucune devise par défaut sélectionnée';\n$lang['clear_def_currency'] = 'Clair';\n$lang['confirm_del_def_currency'] = \"Voulez-vous vraiment supprimer la devise par défaut pour l'entreprise? - \";\n$lang['select_def_currency'] = 'Sélectionnez la devise par défaut';\n$lang['selected_new_def'] = 'Sélectionné réussi!';\n$lang['not_selected_new_def'] = \"Problème de sélection! S'il vous plaît contacter le support!\";\n$lang['no_currency_selected'] = 'Devise EUR par défaut sélectionnée';\n$lang['my_currencies'] = 'Mes devises';\n$lang['currency_name'] = 'prénom';\n$lang['currency_value'] = 'Valeur';\n$lang['add_new_currency'] = 'Ajouter un nouveau';\n$lang['curr_name_for_int_use'] = 'Pour usage interne';\n$lang['no_my_currencies_added'] = \"Vous n'avez pas ajouté de devises\";\n$lang['conirm_del_my_currency'] = \"Voulez-vous vraiment supprimer votre devise?\";\n$lang['create_new_quantity'] = 'Créer un nouveau..';\n$lang['add_the_quantity'] = 'Ajouter un type de quantité';\n$lang['type_quantity_type'] = 'Définissez votre type de quantité ici';\n$lang['add_new_quantity_type'] = 'Ajouter un nouveau type de quantité';\n$lang['settings'] = 'Paramètres';\n$lang['my_quantity_types'] = 'Mes types de quantité';\n$lang['quantity_name'] = 'prénom';\n$lang['no_my_quantity_types'] = \"Vous n'avez pas les types de quantité\";\n$lang['add_new_q_type'] = 'Ajouter un nouveau';\n$lang['conirm_del_my_quantity_type'] = 'Êtes-vous sûr de vouloir supprimer votre type de quantité?';\n$lang['create_inv_save_draft'] = 'Enregistrer';\n$lang['create_new_pay_method'] = 'Créer une nouvelle méthode ..';\n$lang['add_new_payment_method'] = 'Ajouter une nouvelle méthode de paiement';\n$lang['type_payment_method'] = 'Tapez la nouvelle méthode de paiement';\n$lang['add_the_pay_method'] = 'Ajouter une méthode de paiement';\n$lang['my_payment_methods'] = 'Mes méthodes de paiement';\n$lang['conirm_del_my_pay_method'] = 'Voulez-vous vraiment supprimer ce mode de paiement?';\n$lang['no_my_pay_methods'] = \"Vous n'avez pas de méthodes de paiement personnalisées\";\n$lang['my_no_vat_reasons'] = 'Mes raisons sans TVA';\n$lang['vat_reason'] = 'Raison de la TVA';\n$lang['no_my_no_vat_reasons'] = \"Vous n'avez pas enregistré de raisons de TVA\";\n$lang['add_new_vat_reas'] = 'Ajouter une nouvelle raison';\n$lang['add_new_p_method'] = 'Ajouter un nouveau';\n$lang['confirm_del_no_vat_reason'] = 'Êtes-vous sûr de vouloir supprimer cette raison sans TVA?';\n$lang['create_inv_individual'] = 'Individuel';\n$lang['create_inv_ident_num'] = \"Numéro d'identification:\";\n$lang['create_inv_client_vat_registered'] = 'Enregistrement de la TVA';\n$lang['create_inv_vat_number'] = 'Numéro de TVA:';\n$lang['error_load_options'] = \"Erreur avec votre compte! S'il vous plaît contacter le support!\";\n$lang['how_do_you_round_values'] = 'Comment voulez-vous arrondir les totaux de vos factures?';\n$lang['update_round_totals'] = 'Mettre à jour';\n$lang['to_inv_num'] = 'Pour facturer le numéro';\n$lang['to_inv_date'] = 'partir de la date';\n$lang['add_new_inv_translation'] = 'Ajouter une nouvelle traduction de la facture';\n$lang['invoice_settings'] = \"Paramètres de facture\";\n$lang['choose_translation'] = 'Choisissez la traduction';\n$lang['what_mean_new_translate'] = 'Que signifie ajouter une nouvelle traduction?';\n$lang['what_mean_new_translate_explain'] = \"Vous pouvez ajouter votre traduction pour les factures. Lorsque vous créez une nouvelle facture, elle sera traduite dans votre propre langue.Vous pouvez toujours modifier la traduction de la facture en utilisant le formulaire d'édition\";\n$lang['your_translation'] = 'votre traduction';\n$lang['lang_name_internal_use'] = 'Nom de la langue (pour usage interne)';\n$lang['trans_language_name'] = 'Nom de la langue';\n$lang['trans_recipient'] = 'Bénéficiaire';\n$lang['trans_bulstat'] = 'Bulstat';\n$lang['trans_mol'] = 'Personne responsable';\n$lang['trans_sender'] = 'Expéditeur';\n$lang['trans_original'] = 'Original';\n$lang['trans_number'] = 'Nombre';\n$lang['trans_date_of_issue'] = \"Date d'Emission\";\n$lang['trans_date_tax_event'] = \"Date de l'événement fiscal\";\n$lang['trans_to_an_invoice'] = 'Pour une facture';\n$lang['trans_from_date'] = 'Partir de la date';\n$lang['trans_invoice'] = \"Facture d'achat\";\n$lang['trans_debit_note'] = 'Note de débit';\n$lang['trans_credit_note'] = 'Note de crédit';\n$lang['trans_remarks'] = 'Remarques';\n$lang['trans_pro_forma'] = 'Pro-forma';\n$lang['trans_products_name'] = 'Article';\n$lang['trans_quantity'] = 'Quantité';\n$lang['trans_single_price'] = 'Prix unique';\n$lang['trans_value'] = \"Valeur finale de l'article\";\n$lang['trans_discount'] = 'Remise';\n$lang['trans_payment_type'] = 'Type de paiement';\n$lang['trans_amount'] = 'Montant';\n$lang['trans_tax_base'] = \"Base d'imposition\";\n$lang['trans_percentage_vat'] = 'Pourcentage de TVA';\n$lang['trans_vat_charget'] = 'TVA facturée';\n$lang['trans_everything'] = 'Tout';\n$lang['trans_reason_non_var'] = 'Raison de la TVA non facturée';\n$lang['trans_compiled'] = 'Compilé';\n$lang['trans_signature'] = 'Signature';\n$lang['trans_schiffer'] = 'Schiffer';\n$lang['trans_page'] = 'Page';\n$lang['trans_i_accept'] = \"J'accepte\";\n$lang['trans_i_refuse'] = 'je refuse';\n$lang['trans_receive_from'] = 'Vous recevez une facture de \"nom de l\\'entreprise\"';\n$lang['you_receved_tr'] = 'Tu as reçu';\n$lang['from_tr'] = 'de';\n$lang['save_new_translate'] = 'Enregistrer une nouvelle traduction';\n$lang['default_inv_lang_en'] = 'Anglais';\n$lang['default_inv_lang_bg'] = 'Bulgare';\n$lang['default_inv_lang_fr'] = 'Français';\n$lang['err_create_to_inv_num'] = \"S'il vous plaît entrer dans le champ numéro de facture!\";\n$lang['err_create_to_inv_date'] = \"S'il vous plaît entrer dans le champ de la date de facturation!\";\n$lang['err_create_client_name'] = 'Veuillez entrer le champ du nom du client!';\n$lang['err_create_client_addr'] = \"Veuillez entrer le champ d'adresse du client!\";\n$lang['err_create_inv_num'] = 'Veuillez entrer le champ du numéro de facture!';\n$lang['err_create_date_create'] = 'Veuillez entrer le champ de la date de facturation!';\n$lang['err_create_tax_event'] = \"Veuillez entrer le champ de l'événement fiscal!\";\n$lang['err_create_inv_num_is_taken'] = 'Le numéro de facture est pris! Choisissez-en un autre!';\n$lang['err_create_no_item_name'] = \"S'il vous plaît remplir tous les noms d'articles!\";\n$lang['err_create_no_item_qua'] = \"S'il vous plaît remplir toutes les quantités d'articles!\";\n$lang['choose_client'] = 'Sélectionnez un client dans la liste';\n$lang['choose_item'] = 'Sélectionnez un élément de la liste';\n$lang['no_clients_selector'] = 'Aucun client';\n$lang['no_items_selector'] = \"Pas d'objet\";\n$lang['invoices'] = 'Factures';\n$lang['list_inv_num'] = 'Nombre';\n$lang['list_inv_date'] = 'Rendez-vous amoureux';\n$lang['list_inv_client'] = 'Client';\n$lang['list_inv_type'] = 'Type';\n$lang['list_inv_status'] = 'Statut';\n$lang['list_inv_sum'] = 'Valeur';\n$lang['create_new_inv'] = 'Créer une nouvelle facture';\n$lang['list_inv_manage'] = 'Options';\n$lang['list_inv_payment_status'] = 'Paiements';\n$lang['no_invoices_yet'] = \"Vous n'avez pas de factures\";\n$lang['type_debit'] = 'Note de débit';\n$lang['type_tax_inv'] = \"Facture d'achat\";\n$lang['type_prof'] = 'Pro-forma';\n$lang['type_credit'] = 'Note de crédit';\n$lang['status_issued'] = 'Publié';\n$lang['status_draft'] = 'Brouillon';\n$lang['status_refused'] = 'Refusé';\n$lang['status_accepted'] = 'Accepté';\n$lang['status_sended'] = 'Envoyé';\n$lang['status_canceled'] = 'Annulé';\n$lang['update_inv_save'] = 'Mettre à jour';\n$lang['show_translation_on_edit'] = 'Afficher les traductions';\n$lang['show_translation_firm_on_edit'] = \"Afficher les traductions d'entreprises\";\n$lang['show_translation_now_use'] = '(utilisez maintenant %transname% translation)';\n$lang['show_translation_firm_now_use'] = \"(Maintenant, utilisez le nom de l'entreprise - %transname%)\";\n$lang['no_vat_reason_selected'] = 'Sélectionnez dans la liste';\n$lang['stop_inv_calculator'] = 'Arrêter le calculateur de facture';\n$lang['stop_movem_calculator'] = 'Arrêter le calculateur de mouvement';\n$lang['no_clients_yet'] = \"Vous n'avez pas de clients\";\n$lang['list_cli_name'] = 'prénom';\n$lang['list_cli_bulstat'] = 'Bulstat';\n$lang['list_cli_manage'] = 'Gérer';\n$lang['clients'] = 'Clients';\n$lang['add_new_client'] = 'Ajouter un client';\n$lang['add_client'] = 'Ajouter un client';\n$lang['save_client'] = 'Enregistrer le client';\n$lang['cancel_save_client'] = 'Annuler';\n$lang['confirm_delete_client'] = 'Êtes-vous sûr de vouloir supprimer ce client?';\n$lang['list_item_name'] = 'prénom';\n$lang['list_cli_price'] = 'Prix';\n$lang['list_cli_qu_type'] = 'Type de quantité';\n$lang['list_cli_manage'] = 'Gérer';\n$lang['confirm_delete_item'] = 'Voulez-vous vraiment supprimer cet élément?';\n$lang['no_items_yet'] = \"Ne pas avoir d'articles\";\n$lang['add_new_item'] = 'Ajouter un item';\n$lang['add_item'] = 'Ajouter un item';\n$lang['add_item_name'] = 'prénom';\n$lang['add_item_qua_type'] = 'Type de quantité';\n$lang['add_item_price'] = 'Prix';\n$lang['add_item_currency'] = 'Devise';\n$lang['cancel_save_item'] = 'Annuler';\n$lang['save_item'] = \"Enregistrer l'article\";\n$lang['no_currency_selected_item'] = 'Pas de devise sélectionnée';\n$lang['items'] = 'Articles';\n$lang['err_create_item_name'] = \"Le nom de l'article est vide!\";\n$lang['no_employees_yet'] = 'Aucun employé';\n$lang['add_new_employee'] = 'Ajouter un employé';\n$lang['add_employee_name'] = 'prénom';\n$lang['add_employee_email'] = 'Email';\n$lang['add_employee_phone'] = 'Téléphone';\n$lang['add_employee_pass'] = 'Mot de passe';\n$lang['cancel_save_employee'] = 'Annuler';\n$lang['save_employee'] = \"Enregistrer l'employé\";\n$lang['list_empl_name'] = 'prénom';\n$lang['list_empl_email'] = 'Email';\n$lang['list_empl_phone'] = 'Téléphone';\n$lang['list_empl_manage'] = 'Gérer';\n$lang['confirm_delete_employee'] = 'Êtes-vous sûr de vouloir supprimer cet employé?';\n$lang['if_dont_change_emp_pass'] = 'Si vous ne voulez pas changer le mot de passe employé, laissez-le vide';\n$lang['employee_email_taken'] = 'Vous avez déjà un employé avec cet email';\n$lang['no_permissions'] = \"Vous n'avez pas la permission d'utiliser cette fonctionnalité!\";\n$lang['perm_add_invoice'] = 'Ajouter des factures';\n$lang['perm_edit_invoice'] = 'Modifier les factures';\n$lang['perm_delete_invoice'] = 'Supprimer les factures';\n$lang['perm_change_inv_status'] = 'Modifier le statut des factures';\n$lang['perm_add_clients'] = 'Ajouter des clients';\n$lang['perm_edit_clients'] = 'Modifier les clients';\n$lang['perm_delete_clients'] = 'Supprimer les clients';\n$lang['perm_add_items'] = 'Ajouter des articles';\n$lang['perm_edit_items'] = 'Modifier les éléments';\n$lang['perm_delete_items'] = 'Supprimer les éléments';\n$lang['perm_can_manage_rights'] = 'Gérer les droits des autres employés';\n$lang['perm_add_employees'] = 'Peut ajouter de nouveaux employés';\n$lang['perm_can_manage_firms'] = 'Peut changer les paramètres des entreprises';\n$lang['success_save_new_perms'] = 'Les nouvelles autorisations sont sauvegardées!';\n$lang['perm_delete_employees'] = 'Peut supprimer des employés';\n$lang['perm_edit_employees'] = 'Peut modifier les employés';\n$lang['perm_view_plans_page'] = 'Peut ouvrir la page des plans';\n$lang['usr_admin_menu'] = \"Profil d'administrateur\";\n$lang['save_user_data'] = \"Enregistrer l'utilisateur\";\n$lang['cancel_save_user'] = 'Annuler';\n$lang['if_dont_change_usr_pass'] = \"Si vous ne voulez pas changer le mot de passe de l'utilisateur, laissez-le blanque\";\n$lang['this_email_is_used'] = 'Cet e-mail est déjà pris!';\n$lang['success_update_user_adm'] = \"L'utilisateur est mis à jour avec succès!\";\n$lang['problem_update_user_adm_em'] = \"Cette adresse e-mail provient de votre employé ou d'un autre compte!\";\n$lang['can_access_firms'] = 'Peut accéder aux entreprises:';\n$lang['you_cant_view_any_firms'] = \"Désolé mais vous n'avez accès à aucune entreprise!\";\n$lang['employee_add_success'] = 'Employé réussi ajouté!';\n$lang['no_template_file'] = \"Aucun fichier de modèle trouvé! S'il vous plaît contacter le support!\";\n$lang['composed_from'] = 'Composé de:';\n$lang['schiffer_replace'] = 'Schiffer (remplace la signature)';\n$lang['download_print_copy'] = 'Télécharger / Imprimer une copie';\n$lang['download_print_original'] = \"Télécharger / Imprimer l'original\";\n$lang['original_txt'] = 'Original';\n$lang['copy_txt'] = 'Copie';\n$lang['confirm_delete_invoice'] = 'Voulez-vous vraiment supprimer cette facture? Ce sera en permanence!';\n$lang['delete'] = 'Effacer';\n$lang['from_date'] = 'Partir de la date:';\n$lang['to_date'] = 'À ce jour:';\n$lang['show_statistic'] = 'Montrez les statistiques';\n$lang['reports'] = 'Rapports';\n$lang['menu_list_reports'] = 'Rapports';\n$lang['num_invoices_stat'] = 'Nombre de factures émises';\n$lang['all_the_time'] = 'Tout le temps';\n$lang['num_created'] = 'Num créé';\n$lang['issued'] = 'Publié';\n$lang['num_invoices_by_month_stat'] = 'Nombre de factures émises par mois';\n$lang['no_reports_yet'] = \"Il n'y a pas de factures émises pour l'heure sélectionnée\";\n$lang['no_reports_yet_all_time'] = \"Il n'y a pas de factures émises pour le moment\";\n$lang['amount_invoices_by_month_stat'] = 'Montant %currency% des factures émises par mois';\n$lang['pages_pagination_num'] = 'Num lignes dans les pages de pagination';\n$lang['payment_status_paid'] = 'Payé';\n$lang['payment_status_unpaid'] = 'Non payé';\n$lang['payment_status_partly_paid'] = 'Partiellement payé';\n$lang['top_search_no_results'] = 'Aucun résultat trouvé!';\n$lang['show_drafts_report'] = 'Afficher les brouillons';\n$lang['to_canceled_stat'] = 'Annuler';\n$lang['remove_canceled_stat'] = 'Supprimer le statut annulé';\n$lang['top_clients_stat'] = 'Top 10 des clients - somme des factures (montant en %currency%)';\n$lang['sum_of_invoices_in_stat'] = 'Somme des factures émises';\n$lang['menu_list_import_export'] = 'Import/Export';\n$lang['no_invoices_result_export'] = \"Il n'y a pas de factures\";\n$lang['selected_invalid_exporter'] = 'Vous sélectionnez un exportateur invalide!';\n$lang['export'] = 'Export';\n$lang['import'] = 'Import';\n$lang['not_selected_import_file'] = 'Veuillez sélectionner le fichier à importer';\n$lang['try_to_import_wrong_file_format'] = \"Le fichier que vous essayez d'importer est au format incorrect\";\n$lang['no_invoice_note_in_xml_import'] = \"Aucune note de facture dans le fichier XML. S'il vous plaît assurez-vous que ce xml est avec une structure valide\";\n$lang['imp_invalid_inv_type'] = 'Type de facture incorrect';\n$lang['imp_inv_number_taken'] = 'Le numéro de facture est pris';\n$lang['imp_wrong_date_created'] = 'Date erronée créée horodatage';\n$lang['imp_wrong_date_tax_event'] = \"Mauvaise date d'événement fiscal\";\n$lang['imp_wrong_date_maturity'] = \"Mauvaise date d'échéance\";\n$lang['imp_to_inv_date_wrong'] = 'Pour facturer la date invalide';\n$lang['imp_no_client_name'] = 'Le nom du client est vide';\n$lang['imp_no_client_addr'] = \"L'adresse du client est vide\";\n$lang['imp_no_item_name'] = \"L'élément %rowNum% name est vide\";\n$lang['imp_no_item_quantity'] = \"L'élément %rowNum% quantity est vide\";\n$lang['imp_no_items'] = 'Aucun élément trouvé';\n$lang['inv_num_row_in_file'] = 'Numéro de facture dans le fichier';\n$lang['inv_number'] = 'Numéro de facture';\n$lang['inv_type'] = 'Type de facture';\n$lang['inv_errors'] = 'les erreurs';\n$lang['import_results'] = \"Résultats d'importation\";\n$lang['inv_action_history'] = 'Historique des actions de statut';\n$lang['search_inv_num'] = 'Numéro de facture:';\n$lang['search_client'] = 'Client';\n$lang['search_item'] = 'Article';\n$lang['search_amount_from'] = 'Montant de';\n$lang['search_to'] = 'à';\n$lang['search_date_from'] = 'Date de création à partir de';\n$lang['search_payment_type'] = 'Type de paiement:';\n$lang['search_inv_type'] = 'Type';\n$lang['search_inv_payments'] = 'Paiements';\n$lang['search_paied'] = 'Payé';\n$lang['search_unpaied'] = 'Non payé';\n$lang['search_inv_status'] = 'Statut';\n$lang['search_issued'] = 'Publié';\n$lang['search_sended'] = 'Envoyé';\n$lang['search_refused'] = 'Refusé';\n$lang['search_accepted'] = 'Accepté';\n$lang['search_canceled'] = 'Annulé';\n$lang['search_draft'] = 'Brouillon';\n$lang['search_client_name'] = 'Nom du client';\n$lang['search_client_bulstat'] = 'Bulstat client';\n$lang['search_item_name'] = \"Nom de l'article\";\n$lang['clear_search'] = 'Effacer la recherche';\n$lang['menu_list_store'] = 'Entrepôt';\n$lang['store_settings'] = 'Entrepôt paramètres';\n$lang['my_added_stores'] = 'My Entrepôt';\n$lang['store_name'] = 'Entrepôt nom';\n$lang['no_stores_added'] = 'Aucun Entrepôt ajouté';\n$lang['add_new_store'] = 'Ajouter un Entrepôt';\n$lang['empty_store_name'] = 'Nom du Entrepôt vide';\n$lang['store_name_taken'] = 'Le nom du Entrepôt est pris';\n$lang['confirm_delete_store'] = 'Êtes-vous sûr de vouloir supprimer ce Entrepôt?';\n$lang['add_store_movement'] = 'Commande de Entrepôt';\n$lang['open_store_movements'] = 'Ouvrir les mouvements du Entrepôt';\n$lang['create_store_movement'] = 'Créer un mouvement';\n$lang['movement_type_in'] = 'Yin';\n$lang['movement_type_out'] = 'Out';\n$lang['movement_type_move'] = 'Déplacer';\n$lang['movement_type_revision'] = 'Révision';\n$lang['create_movement_type'] = 'Type de mouvement:';\n$lang['create_movement_id'] = 'Mouvement';\n$lang['create_movement_date_create'] = 'Date de création';\n$lang['create_movement_amount'] = 'Montant du mouvement';\n$lang['choose_movem_translation'] = 'Choisir la traduction de commande de Entrepôt';\n$lang['how_do_you_round_values_in_move'] = 'Quel personnage voulez-vous arrondir les valeurs dans les mouvements';\n$lang['err_create_movem_num'] = 'Le numéro de mouvement est vide';\n$lang['err_create_movem_num_is_taken'] = 'Numéro de mouvement et pris';\n$lang['err_movem_create_date_create'] = 'Veuillez entrer la date de création';\n$lang['movement_added'] = 'Le mouvement est ajouté';\n$lang['movem_from_store'] = 'Du Entrepôt:';\n$lang['movem_to_store'] = 'À Entrepôt:';\n$lang['create_movem_from_client'] = 'Du client:';\n$lang['create_movem_to_client'] = 'Pour le client:';\n$lang['item_is_not_in_store'] = \"L'élément %item% n'est pas dans ce Entrepôt\";\n$lang['item_no_enought_quantity'] = \"L'élément %item% n'a pas assez de quantité dans Entrepôt\";\n$lang['allow_negative_qua_in_store'] = 'Autoriser les quantités négatives dans Entrepôt';\n$lang['trans_bill_of_goods'] = 'Entrepôt commande';\n$lang['trans_date'] = 'Rendez-vous amoureux';\n$lang['trans_address'] = 'Adresse';\n$lang['trans_betrayed'] = 'Trahi';\n$lang['trans_accepted'] = 'Accepté';\n$lang['trans_vat'] = 'T.V.A';\n$lang['trans_vat_amount'] = 'Montant de la TVA';\n$lang['trans_no_vat_reason'] = 'Aucune raison de TVA';\n$lang['trans_product_name'] = 'Nom du produit';\n$lang['trans_product_quantity'] = 'La quantité de produit';\n$lang['trans_product_quantity_type'] = 'Type de quantité de produit';\n$lang['trans_product_amount'] = 'Montant du produit';\n$lang['trans_payment_method'] = 'Mode de paiement';\n$lang['no_movements_yet'] = 'Aucun mouvement ajouté';\n$lang['list_movement'] = 'Mouvement';\n$lang['list_bill_of_lading'] = 'Entrepôt commande';\n$lang['list_movem_type'] = 'Type';\n$lang['list_movem_status'] = 'Statut';\n$lang['list_movem_from'] = 'De';\n$lang['list_movem_to'] = 'À';\n$lang['movem_preview'] = 'Aperçu';\n$lang['movem_type_in'] = 'Dans';\n$lang['movem_type_out'] = 'En dehors';\n$lang['movem_type_move'] = 'Bouge toi';\n$lang['movem_type_revision'] = 'Révision';\n$lang['movem_stat_confirmed'] = 'Confirmé';\n$lang['movem_stat_cancelled'] = 'Annulé';\n$lang['search_by_store'] = 'Entrepôt:';\n$lang['search_store_client'] = 'Client:';\n$lang['all_stores'] = 'Tous les Entrepôt';\n$lang['preview_movem_num'] = 'Numéro de mouvement:';\n$lang['preview_movem_type'] = 'Type de mouvement:';\n$lang['preview_movem_currency'] = 'Devise de mouvement:';\n$lang['preview_movem_status'] = 'Statut de mouvement:';\n$lang['preview_movem_from'] = 'De:';\n$lang['preview_movem_to'] = 'À:';\n$lang['movement_item_name'] = \"Nom de l'article\";\n$lang['movement_item_quantity'] = 'Quantité';\n$lang['movement_item_before_revision'] = 'Avant la révision';\n$lang['movement_item_after_revision'] = 'Après révision';\n$lang['movement_item_difference'] = 'Différence';\n$lang['bill_of_lading'] = 'Commande de Entrepôt';\n$lang['trans_city'] = 'Ville';\n$lang['momvem_betrayed'] = 'Trahi';\n$lang['momvem_accepted'] = 'Accepté';\n$lang['store_stocks'] = 'Stocks';\n$lang['preview_movem_betrayed'] = 'Trahi:';\n$lang['preview_movem_accepted'] = 'Accepté:';\n$lang['no_stocks_yet'] = 'Aucun stock';\n$lang['back_to_movements'] = 'Retour aux mouvements';\n$lang['countInvoices'] = 'Compter les factures:';\n$lang['with_sum_of'] = 'avec la quantité totale de';\n$lang['report_show_paid'] = 'Afficher uniquement les factures payées';\n$lang['report_show_unpaid'] = 'Afficher uniquement les factures impayées';\n$lang['report_show_partly_paid'] = 'Afficher uniquement les factures partiellement payées';\n$lang['report_show_all'] = 'Afficher uniquement toutes les factures (payées, non payées)';\n$lang['menu_list_warranties'] = 'Garanties';\n$lang['no_warranties_yet'] = 'Aucune garantie ajoutée';\n$lang['add_warranty'] = 'Ajouter une garantie';\n$lang['add_war_translation'] = 'Ajouter une langue de garantie';\n$lang['create_warranty_id'] = 'garantie';\n$lang['create_warranty_from_date'] = 'Valable à partir de date:';\n$lang['create_war_item'] = 'Article';\n$lang['create_war_months'] = 'Mois';\n$lang['create_war_serial_num'] = 'Numéro de série';\n$lang['open_warranties'] = 'liste des garanties ouvertes';\n$lang['create_warranty'] = 'Créer une garantie';\n$lang['trans_warranty_card'] = 'Carte de garantie';\n$lang['trans_date_valid'] = 'Date valide';\n$lang['trans_product_months'] = 'Mois';\n$lang['trans_product_valid_to'] = 'Valable pour';\n$lang['trans_product_serial_num'] = 'Numéro de série';\n$lang['trans_received'] = 'Reçu';\n$lang['trans_warranty_conditions'] = 'Conditions de garantie';\n$lang['err_create_war_num'] = 'Numéro de garantie invalide';\n$lang['err_create_war_num_is_taken'] = 'Le numéro de garantie est pris';\n$lang['err_create_war_no_item_month'] = 'Aucun article';\n$lang['warranty_added'] = 'Garantie ajoutée';\n$lang['delete_warranties'] = 'Effacer';\n$lang['list_war_number'] = 'Nombre';\n$lang['list_war_to_inv'] = 'Pour facturer';\n$lang['list_war_valid_from'] = 'Valide à partir de';\n$lang['list_war_client'] = 'Client';\n$lang['list_war_action'] = 'actes';\n$lang['create_warranty_to_inv'] = 'Pour facturer le numéro:';\n$lang['edit_warranty'] = 'modifier';\n$lang['warranty_updated'] = 'Garantie mise à jour';\n$lang['warranty_received'] = 'Reçu';\n$lang['warranty_compiled'] = 'Compilé';\n$lang['warranty_conditions'] = 'Conditions';\n$lang['warranty_settings'] = 'Paramètres de garantie';\n$lang['add_new_condition'] = 'Ajouter une condition';\n$lang['warranty_conditions'] = 'Conditions de garantie';\n$lang['no_conditions_added'] = 'Aucune condition ajoutée';\n$lang['condition_title'] = 'Titre (pour usage interne)';\n$lang['condition_description'] = 'La condition pour le client';\n$lang['confirm_delete_condition'] = 'Êtes-vous sûr de vouloir supprimer cette condition?';\n$lang['war_condit_preview_descr'] = 'Aperçu de la description';\n$lang['select_saved_condition'] = 'Sélectionnez la condition enregistrée';\n$lang['list_war_events'] = 'Événements';\n$lang['war_events'] = 'Événements';\n$lang['add_new_war_event'] = 'Ajouter un évènement';\n$lang['date_war_event_manupulation'] = \"Date de l'événement\";\n$lang['war_event_item'] = 'Article';\n$lang['repair'] = 'réparation';\n$lang['war_event_type'] = 'Type';\n$lang['war_event_description'] = 'La description';\n$lang['save_war_event'] = 'sauvegarder';\n$lang['replacement'] = 'Remplacement';\n$lang['no_war_events_yet'] = 'Aucun événement de garantie';\n$lang['war_ev_item'] = 'Article:';\n$lang['war_ev_type'] = 'Type:';\n$lang['war_ev_date'] = 'Rendez-vous amoureux:';\n$lang['war_ev_descr'] = 'La description:';\n$lang['menu_list_protocols'] = 'Protocoles';\n$lang['perm_add_movement'] = 'Peut ajouter des mouvements';\n$lang['perm_view_movement_page'] = 'Peut voir les mouvements';\n$lang['perm_view_store_stocks'] = 'Peut voir la page des stocks du entrepôt';\n$lang['perm_view_warranty_page'] = 'Peut voir la page de garantie';\n$lang['perm_add_warranty'] = 'Peut ajouter des garanties';\n$lang['perm_view_warranty_events'] = 'Peut voir les événements de garantie';\n$lang['perm_add_warranty_events'] = 'Peut ajouter un événement de garantie';\n$lang['perm_view_protocols_page'] = 'Peut voir la page des protocoles';\n$lang['no_protocols_yet'] = 'Aucun protocole ajouté';\n$lang['protocols_settings'] = 'Paramètres de protocoles';\n$lang['add_protocol'] = 'Ajouter des protocoles';\n$lang['delete_protocols'] = 'Effacer';\n$lang['perm_add_protocol'] = 'Peut ajouter des protocoles';\n$lang['create_protocol_acceptable'] = 'Acceptable';\n$lang['create_protocol_transmitter'] = 'Émetteur';\n$lang['create_protocol_type'] = 'Type';\n$lang['create_protocol_from_date'] = 'Partir de la date:';\n$lang['protocol_number'] = 'Protocole';\n$lang['create_protocol'] = 'Créer un protocole';\n$lang['open_protocols'] = 'Protocoles ouverts';\n$lang['my_added_provider_transmits'] = 'Fournisseur transmettre des textes';\n$lang['no_provider_trans_txts_added'] = 'Aucun fournisseur ne transmet de texte ajouté';\n$lang['provider_trans_title'] = 'Titre (pour usage interne)';\n$lang['provider_trans_description'] = 'Description pour les utilisateurs';\n$lang['add_new_provider_desc'] = 'Ajouter';\n$lang['confirm_delete_provider_trasmit'] = 'Voulez-vous vraiment supprimer le texte de transmission du fournisseur?';\n$lang['no_contr_txts_added'] = 'Aucun texte de contrat ajouté';\n$lang['select_saved_contracts'] = 'Sélectionnez parmi les contrats enregistrés';\n$lang['protocol_contracts'] = 'Contrat';\n$lang['provider_transmit'] = 'Fournisseur transmettre';\n$lang['select_saved_provider_trans'] = 'Choisissez parmi les textes sauvegardés';\n$lang['add_protocol_translation'] = 'Ajouter un langage de protocole';\n$lang['trans_protocol_number'] = 'Nombre';\n$lang['trans_supplier'] = 'Fournisseur';\n$lang['trans_product_final_price'] = 'Prix final';\n$lang['trans_final_amount'] = 'Le montant final';\n$lang['err_create_prot_num'] = 'Numéro de protocole vide';\n$lang['err_create_prot_num_is_taken'] = 'Ce numéro de protocole est pris';\n$lang['err_create_prot_no_item_qa'] = 'Quantité vide';\n$lang['protocol_added'] = 'Protocole ajouté';\n$lang['protocol_updated'] = 'Protocole mis à jour';\n$lang['protocol_to_inv'] = 'Pour facturer';\n$lang['protocol_from_date'] = 'Partir de la date';\n$lang['protocol_client'] = 'Client';\n$lang['protocols_action'] = 'action';\n$lang['create_protocol_amount'] = 'Montant';\n$lang['trans_to_invoice'] = 'Pour facturer';\n$lang['trans_transmission_protocol'] = 'Protocole de transmission';\n$lang['language'] = 'La langue';\n$lang['show_logo_in_inv'] = 'Afficher le logo dans les factures';\n$lang['remove_firm_image'] = 'Supprimer le logo';\n$lang['firm_vat_number'] = 'Numéro de TVA';\n$lang['firm_is_vat_registered'] = 'Enregistrement de la TVA';\n$lang['firm_details_changed'] = \"Les détails de l'entreprise sont modifiés\";\n$lang['trans_vat_number'] = 'Numéro de TVA';\n$lang['partly_paid'] = 'Partiellement payé';\n$lang['search_partly_paid'] = 'Partiellement payé';\n$lang['logout'] = 'Connectez - Out';\n$lang['home'] = 'Accueil';\n$lang['warranties'] = 'Garanties';\n$lang['protocols'] = 'Protocoles';\n$lang['import_export'] = 'Import/Export';\n$lang['explain_inv_translation'] = 'Ajouter / sélectionner une traduction des factures que vous émettez dans votre langue';\n$lang['explain_firm_translation'] = \"Sélectionnez une traduction de vos données d'entreprise\";\n$lang['search'] = 'Chercher';\n$lang['explain_movem_translation'] = 'Ajouter / sélectionner une traduction de la commande Store que vous avez émise dans votre langue';\n$lang['explain_protocol_translation'] = 'Ajouter / sélectionner une traduction de protocole que vous émettez dans votre langue';\n$lang['explain_war_translation'] = 'Ajouter / sélectionner une traduction de garantie que vous émettez dans votre langue';\n$lang['bulstat'] = 'Bulstat:';\n$lang['ident_num'] = \"Numéro d'identification:\";\n$lang['amount'] = 'Montant:';\n$lang['employees'] = 'Des employés';\n$lang['global'] = 'Des employés...';\n$lang['warranty'] = 'garantie';\n$lang['add_employees'] = 'Ajouter un employé';\n$lang['rights'] = 'Droits';\n$lang['save'] = 'sauvegarder';\n$lang['my_added_contracts'] = 'Textes contractuels';\n$lang['edit_admin'] = 'administrateur modifier';\n$lang['preview_client'] = 'Aperçu du client';\n$lang['edit'] = 'modifier';\n$lang['preview_item'] = \"Aperçu de l'article\";\n$lang['add_movement'] = 'Ajouter un mouvement';\n$lang['stocks'] = 'Stocks';\n$lang['movement_preview'] = 'Aperçu du mouvement';\n$lang['warranty_events'] = 'Événements de garantie';\n$lang['cancel'] = 'Annuler';\n$lang['add_warranty_event'] = 'Ajouter un événement de garantie';\n$lang['edit_firm_info'] = 'Modification ferme';\n$lang['documents'] = 'Factures';\n$lang['companies'] = 'Entreprises';\n$lang['show_main_menu'] = 'Afficher le menu';\n$lang['plan_basic'] = 'De base';\n$lang['plan_advanced'] = 'Avancée';\n$lang['plan_pro'] = 'Pro';\n$lang['plan_custom'] = 'Douane';\n$lang['plans_most'] = 'Plus';\n$lang['plans_popular'] = 'Populaire';\n$lang['plans_month'] = 'mois';\n$lang['plans_choose'] = 'Choisir';\n$lang['plans_num_inv'] = 'Factures';\n$lang['plans_num_firms'] = 'Entreprises';\n$lang['plans_one_m_bonus'] = '+1 BONUS du mois';\n$lang['plan_period'] = 'Période';\n$lang['plans_period'] = 'Période des plans';\n$lang['confirm_plan_requiest'] = 'Confirmer la requête';\n$lang['plan_period'] = 'Période';\n$lang['plan_payment_type'] = 'Mode de paiement';\n$lang['plan_payment_bank'] = 'Banque';\n$lang['plan_payment_paypal'] = 'PayPal';\n$lang['plan_payment_sms'] = 'SMS';\n$lang['plan_payment_easypay'] = 'EasyPay';\n$lang['plan_period_month'] = 'Mois';\n$lang['plan_period_months'] = 'Mois';\n$lang['plan_period_year'] = 'An';\n$lang['my_plan_request'] = 'Demande de plan';\n$lang['payment_awaiting'] = 'Nous attendons votre paiement';\n$lang['plan_type'] = 'Type de plan';\n$lang['plan_date_generated'] = 'Date de demande de paiement';\n$lang['plan_req_num'] = 'Numéro de la demande';\n$lang['payment_details'] = 'Détails de paiement';\n$lang['info_box'] = 'Info!';\n$lang['plan_will_started'] = 'Votre plan sera activé dès réception de votre paiement et vous recevrez des factures à votre adresse e-mail';\n$lang['cancel_pay_req'] = 'Annuler la demande de paiement';\n$lang['confirm_cancel_req'] = 'Voulez-vous vraiment annuler cette demande de paiement?';\n$lang['pay_det_name_of_rec'] = 'Nom du récipient';\n$lang['pay_det_iban'] = 'IBAN du destinataire';\n$lang['pay_det_bic'] = 'BIC du destinataire';\n$lang['pay_det_to_bank'] = 'Pour banque';\n$lang['pay_det_sum'] = 'Montant';\n$lang['dont_forget_req_num'] = \"Assurez-vous d'inclure le numéro de la demande dans la description\";\n$lang['plans_make_request'] = 'Faire une demande';\n$lang['plan_send_us_req'] = 'Quel est le plan que vous voulez utiliser?';\n$lang['send_plan_req'] = 'Envoyer une demande';\n$lang['plan_req_inv_per_mon'] = 'Combien de factures voulez-vous émettre par mois';\n$lang['plan_req_companies'] = \"Combien d'entreprises utiliserez-vous\";\n$lang['when_we_see_plan_req'] = \"Une fois que nous aurons examiné le plan que vous souhaitez, nous l'ajouterons à la page des autres plans et vous en serez informé par courrier électronique.\";\n$lang['plan_req_sended'] = 'Demande de plan envoyée. Attendez-vous à vous informer par email dans la journée.';\n$lang['already_have_req'] = \"Vous avez déjà une demande de plan individuel avec %num_inv% factures et% entreprises% entreprises. Si vous envoyez une nouvelle demande, l'ancienne sera rejetée.\";\n$lang['plans_make_new_request'] = 'Faire une nouvelle demande';\n$lang['title_everytime'] = 'Facturation électronique - ';\n$lang['title_clients'] = 'Clients';\n$lang['title_add_client'] = 'Ajouter un client';\n$lang['title_preview_client'] = 'Aperçu du client';\n$lang['title_home_page'] = 'Accueil';\n$lang['title_import_export'] = 'Import/Export';\n$lang['title_invoices'] = 'Liste des factures';\n$lang['title_inv_preview'] = 'Aperçu de la facture - ';\n$lang['title_new_inv'] = 'Nouvelle facture';\n$lang['title_items'] = 'Articles';\n$lang['title_add_item'] = 'Ajouter un item';\n$lang['title_item_preview'] = \"Aperçu de l'article\";\n$lang['title_manage_firms'] = 'Gérer les entreprises';\n$lang['title_edit_firm'] = 'Modifier la société';\n$lang['title_plans'] = 'Des plans';\n$lang['title_choose_plan_period'] = 'Choisissez la période du plan';\n$lang['title_plan_req'] = 'Votre demande de plan';\n$lang['title_protocols'] = 'Protocoles';\n$lang['title_add_protocol'] = 'Ajouter un protocole';\n$lang['title_reports'] = 'Rapports';\n$lang['title_admin'] = \"Modifier l'administrateur\";\n$lang['title_employees'] = 'Des employés';\n$lang['title_add_employee'] = 'Ajouter un employé';\n$lang['title_empl_rights'] = 'Droits des employés';\n$lang['title_global_sett'] = 'Paramètres globaux';\n$lang['title_inv_sett'] = 'Paramètres de factures';\n$lang['title_protoc_sett'] = 'Paramètres de protocoles';\n$lang['title_settings'] = 'Réglage';\n$lang['title_store_sett'] = 'Paramètres du magasin';\n$lang['title_warr_sett'] = 'Paramètres de garantie';\n$lang['title_movem_prev'] = 'Aperçu du mouvement';\n$lang['title_movements'] = 'Mouvements';\n$lang['title_add_movement'] = 'Ajouter un mouvement';\n$lang['title_stocks'] = 'Stock';\n$lang['title_events'] = 'Événements de garantie';\n$lang['title_add_event'] = 'Ajouter un événement de garantie';\n$lang['title_warranties'] = 'Garanties';\n$lang['title_add_warr'] = 'Ajouter une garantie';\n$lang['create_first_one_inv'] = 'Créer le premier';\n$lang['limit_inv_error'] = 'Vous avez épuisé votre limite de facturation. Si vous souhaitez émettre une facture, vous devrez renouveler votre plan ou attendre un mois à compter des dernières factures émises pour en avoir une nouvelle (maximum 5)';\n$lang['my_active_plans'] = 'Plans actifs';\n$lang['active_to'] = 'Actif à:';\n$lang['left_inv_from_plan'] = 'Factures de gauche:';\n$lang['num_companies_plan'] = 'Entreprises:';\n$lang['started_from'] = 'A commencé depuis:';\n$lang['exceeded_limit_firms'] = \"La limite d'utilisation de votre entreprise est dépassée. Veuillez supprimer l'une des sociétés ou passer à un plan supérieur pour continuer à travailler sur le site. Cette suppression ne sera pas permanente et si vous allez à un plan plus large, vous aurez l'occasion de restaurer l'entreprise.\";\n$lang['create_movement_lot'] = 'LOT#:';\n$lang['create_movement_expire'] = \"Date d'expiration:\";\n$lang['preview_movem_lot'] = 'LOT#:';\n$lang['preview_movem_expire'] = \"Date d'expiration:\";\n$lang['expire_date_to'] = \"Date d'expiration à:\";\n$lang['bill_of_lading_down'] = 'Télécharger la commande de magasin';\n$lang['preview_movem_to_inv'] = 'Pour facturer:';\n$lang['to_inv_movem_not_set'] = 'Aucune facture créée';\n$lang['pay_elsewhere'] = 'Je veux payer ailleurs. Montrez-moi les coordonnées bancaires.';\n$lang['inv_templ_change'] = 'Modifier le modèle de factures';\n$lang['plans_year'] = 'an';\n$lang['plan_period_years'] = 'an';\n$lang['per_12_months'] = 'par 12 mois';"
  },
  {
    "path": "application/language/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/HtmlToPdf.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n/*\n * Convert html of invoice to pdf\n * Use wkhtmltopdf tool - http://wkhtmltopdf.org/\n */\n\nclass HtmlToPdf\n{\n\n    private $num;\n    private $type;\n\n    public function generatePdf(\n    $html, $left_right = null, $top_bot = null, $dpi = null, $size = null, $extra_params = null\n    )\n    {\n        if ($left_right === null) {\n            $left_right = 4;\n        }\n        if ($top_bot === null) {\n            $top_bot = 10;\n        }\n        if ($dpi === null) {\n            $dpi = 96;\n        }\n        if ($size === null) {\n            $size = 'A4';\n        }\n\n        $sys_tmp_dir = sys_get_temp_dir();\n\n        $tmpfile = tempnam($sys_tmp_dir, 'pdf_html');\n\n        if ($tmpfile === false) {\n            log_message('error', 'Was not able to generate a temporary file for ' . $this->type . ' preview in system /tmp for user - ' . print_r($_SESSION['user_login'], true));\n        }\n\n        $tmphtml = $tmpfile . '.html';\n\n        $protocol = 'http';\n        if (!empty($_SERVER['HTTPS'])) {\n            $protocol = 'https';\n        }\n\n        if (false === file_put_contents($tmphtml, $html)) {\n            log_message('error', 'Was not able to put html to a temporary file for ' . $this->type . ' preview in system /tmp for user - ' . print_r($_SESSION['user_login'], true));\n        }\n        $tmpfname = tempnam($sys_tmp_dir, 'html_pdf');\n\n        if ($tmpfname === false) {\n            log_message('error', 'Was not able to generate a temporary file 2 for ' . $this->type . ' preview in system /tmp for user - ' . print_r($_SESSION['user_login'], true));\n        }\n\t\tif(!file_exists('/home/kirilkirkov91/wkhtmltox/bin/wkhtmltopdf')) {\n\t\t\tlog_message('error', 'Please choose directory of wkhtmltopdf bin file in next $cmd variable');\n\t\t}\n\n        $footerUrl = base_url('pdffooter?num=' . $this->num . '&type=' . $this->type . '&pageTranslate=' . $this->pageTranslation);\n        $cmd = '/home/kirilkirkov91/wkhtmltox/bin/wkhtmltopdf --footer-html \"' . $footerUrl . '\" --load-error-handling ignore --enable-local-file-access' .\n                ' --no-stop-slow-scripts' .\n                ' -q ' . $extra_params .\n                ' -d ' . $dpi .\n                ' -s ' . $size .\n                ' -L ' . intval($left_right) . 'mm' .\n                ' -R ' . intval($left_right) . 'mm' .\n                ' -T ' . intval($top_bot) . 'mm' .\n                ' -B ' . intval($top_bot) . 'mm' .\n                ' ' . escapeshellarg($tmphtml) .\n                ' ' . escapeshellarg($tmpfname) .\n                ' &>> ' . escapeshellarg('pdfs.log');\n\n        exec($cmd, $output, $exit_status);\n        /*\n         * It must run without call xvfb! Download source for os from - https://wkhtmltopdf.org/downloads.html\n         * Extract to some folder and call the app\n         * If when call var_dump(file_get_contents($tmpfname)); returns null\n         * its possible to have error with xvfb\n         * https://unix.stackexchange.com/questions/192642/wkhtmltopdf-qxcbconnection-could-not-connect-to-display\n         */\n        if (is_file($tmphtml)) {\n            unlink($tmphtml);\n        }\n\n        if ($exit_status !== 0) {\n            if (is_file($tmpfname)) {\n                unlink($tmpfname);\n            }\n            if (is_file($tmpfile)) {\n                unlink($tmpfile);\n            }\n            log_message('error', 'Generating PDF failed. See logs for more information. Problem for user - ' . print_r($_SESSION['user_login'], true));\n        }\n\n        $pdfcontents = file_get_contents($tmpfname);\n\n        if (is_file($tmpfname)) {\n            unlink($tmpfname);\n        }\n\n        if (is_file($tmpfile)) {\n            unlink($tmpfile);\n        }\n\n        if ($pdfcontents === false) {\n            log_message('error', 'Couldn\\'t read the PDF file for user - ' . print_r($_SESSION['user_login'], true));\n        }\n\n        return $pdfcontents;\n    }\n\n    public function setNum($num)\n    {\n        $this->num = $num;\n    }\n\n    public function setType($type)\n    {\n        $this->type = urlencode($type);\n    }\n\n    public function setPageTranslate($translation)\n    {\n        $this->pageTranslation = urlencode($translation);\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/Language.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n * This class loads languages for site\n * Its is not with very good code but.. for short time.. \n * it works :)\n */\n\nclass Language\n{\n\n    protected $CI;\n    private $urlAbbrevation;\n\n    public function __construct()\n    {\n        $this->CI = & get_instance();\n        $this->CI->load->model('PublicModel');\n        $this->urlAbbrevation = strtolower($this->CI->uri->segment(1));\n        $this->setLanguage();\n    }\n\n    private function setLanguage()\n    {\n        $defaultLanguageName = $language = $this->CI->config->item('language');\n        $defaultLanguageAbbr = $myLanguage = strtolower($this->CI->config->item('language_abbr'));\n        $currency = $this->CI->config->item('currency');\n        $currencyKey = $this->CI->config->item('currencyKey');\n        $langLinkStart = '';\n        /*\n         * If try to select default language, clean it and return to url\n         * Else get the language\n         */\n        if ($this->urlAbbrevation == $defaultLanguageAbbr) {\n            $currentUrl = str_replace($this->urlAbbrevation, '', uri_string());\n            redirect(base_url($currentUrl));\n        } else {\n            $myLang = $this->CI->PublicModel->getOneLanguage($this->urlAbbrevation);\n            if ($myLang != null) {\n                $myLanguage = $myLang['abbr'];\n                $language = $myLang['name'];\n                $currency = $myLang['currency'];\n                $currencyKey = $myLang['currencyKey'];\n                $langLinkStart = $myLanguage . '/';\n            }\n        }\n        $this->CI->lang->load('public', $language);\n        $this->CI->lang->load('users', $language);\n\t\t$this->CI->lang->load('titles', $language);\n\n        define('MY_LANGUAGE_FULL_NAME', $language);\n        define('MY_LANGUAGE_ABBR', $myLanguage);\n        define('MY_DEFAULT_LANGUAGE_ABBR', $defaultLanguageAbbr);\n        define('MY_DEFAULT_LANGUAGE_NAME', $defaultLanguageName);\n        define('CURRENCY', $currency);\n        define('CURRENCY_KEY', $currencyKey);\n        define('LANG_URL', rtrim(base_url($langLinkStart), '/'));\n    }\n\n    public function getUrlAbbrevation()\n    {\n        return $this->urlAbbrevation;\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/MailSend.php",
    "content": "<?php\r\n\r\ndefined('BASEPATH') OR exit('No direct script access allowed');\r\nrequire 'PHPMailer/PHPMailerAutoload.php';\r\n\r\n/*\r\n * This class is used to send invoices from users\r\n */\r\nclass MailSend\r\n{\r\n\r\n    public $mail;\r\n\r\n    public function loadMailerSettings()\r\n    {\r\n        $this->mail = new PHPMailer;\r\n        //$this->mail->SMTPDebug = 1;\r\n        $this->mail->IsSMTP();\r\n        $this->mail->CharSet = \"UTF-8\";\r\n        $this->mail->Host = 'smtp.gmail.com';\r\n        $this->mail->SMTPAuth = true;\r\n        $this->mail->Username = 'support@lm-style.com';\r\n        $this->mail->Password = 'sleeder1';\r\n        $this->mail->SMTPSecure = 'tls';\r\n        $this->mail->Port = 587;\r\n    }\r\n\r\n    public function sendTo($toEmail, $recipientName, $subject, $msg)\r\n    {\r\n        $this->mail->setFrom('support@lm-style.com', 'pmInvoice');\r\n        $this->mail->addAddress($toEmail, $recipientName);\r\n        $this->mail->ClearReplyTos();\r\n        $this->mail->addReplyTo('kiro2424@gmail.com', 'EXAMPLE');\r\n        //$this->mail->isHTML(true);\r\n        $this->mail->Subject = $subject;\r\n        $this->mail->Body = $msg;\r\n        if (!$this->mail->Send()) {\r\n            echo \"Mailer Error: \" . $this->mail->ErrorInfo;\r\n        } else {\r\n            echo \"Message sent!\";\r\n        }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Autoloader.php",
    "content": "<?php\n\nPHPExcel_Autoloader::register();\n//    As we always try to run the autoloader before anything else, we can use it to do a few\n//        simple checks and initialisations\n//PHPExcel_Shared_ZipStreamWrapper::register();\n// check mbstring.func_overload\nif (ini_get('mbstring.func_overload') & 2) {\n    throw new PHPExcel_Exception('Multibyte function overloading in PHP must be disabled for string functions (2).');\n}\nPHPExcel_Shared_String::buildCharacterSets();\n\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Autoloader\n{\n    /**\n     * Register the Autoloader with SPL\n     *\n     */\n    public static function register()\n    {\n        if (function_exists('__autoload')) {\n            // Register any existing autoloader function with SPL, so we don't get any clashes\n            spl_autoload_register('__autoload');\n        }\n        // Register ourselves with SPL\n        if (version_compare(PHP_VERSION, '5.3.0') >= 0) {\n            return spl_autoload_register(array('PHPExcel_Autoloader', 'load'), true, true);\n        } else {\n            return spl_autoload_register(array('PHPExcel_Autoloader', 'load'));\n        }\n    }\n\n    /**\n     * Autoload a class identified by name\n     *\n     * @param    string    $pClassName        Name of the object to load\n     */\n    public static function load($pClassName)\n    {\n        if ((class_exists($pClassName, false)) || (strpos($pClassName, 'PHPExcel') !== 0)) {\n            // Either already loaded, or not a PHPExcel class request\n            return false;\n        }\n\n        $pClassFilePath = PHPEXCEL_ROOT .\n            str_replace('_', DIRECTORY_SEPARATOR, $pClassName) .\n            '.php';\n\n        if ((file_exists($pClassFilePath) === false) || (is_readable($pClassFilePath) === false)) {\n            // Can't load\n            return false;\n        }\n\n        require($pClassFilePath);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_APC\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Prefix used to uniquely identify cache data for this worksheet\n     *\n     * @access    private\n     * @var string\n     */\n    private $cachePrefix = null;\n\n    /**\n     * Cache timeout\n     *\n     * @access    private\n     * @var integer\n     */\n    private $cacheTime = 600;\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @access  private\n     * @return  void\n     * @throws  PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            if (!apc_store(\n                $this->cachePrefix . $this->currentObjectID . '.cache',\n                serialize($this->currentObject),\n                $this->cacheTime\n            )) {\n                $this->__destruct();\n                throw new PHPExcel_Exception('Failed to store cell ' . $this->currentObjectID . ' in APC');\n            }\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @access  public\n     * @param   string         $pCoord  Coordinate address of the cell to update\n     * @param   PHPExcel_Cell  $cell    Cell to update\n     * @return  PHPExcel_Cell\n     * @throws  PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n        $this->cellCache[$pCoord] = true;\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n    /**\n     * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?\n     *\n     * @access  public\n     * @param   string  $pCoord  Coordinate address of the cell to check\n     * @throws  PHPExcel_Exception\n     * @return  boolean\n     */\n    public function isDataSet($pCoord)\n    {\n        //    Check if the requested entry is the current object, or exists in the cache\n        if (parent::isDataSet($pCoord)) {\n            if ($this->currentObjectID == $pCoord) {\n                return true;\n            }\n            //    Check if the requested entry still exists in apc\n            $success = apc_fetch($this->cachePrefix.$pCoord.'.cache');\n            if ($success === false) {\n                //    Entry no longer exists in APC, so clear it from the cache array\n                parent::deleteCacheData($pCoord);\n                throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in APC cache');\n            }\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @access  public\n     * @param   string         $pCoord  Coordinate of the cell\n     * @throws  PHPExcel_Exception\n     * @return  PHPExcel_Cell  Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (parent::isDataSet($pCoord)) {\n            $obj = apc_fetch($this->cachePrefix . $pCoord . '.cache');\n            if ($obj === false) {\n                //    Entry no longer exists in APC, so clear it from the cache array\n                parent::deleteCacheData($pCoord);\n                throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in APC cache');\n            }\n        } else {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = unserialize($obj);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n    /**\n     * Delete a cell in cache identified by coordinate address\n     *\n     * @access  public\n     * @param   string  $pCoord  Coordinate address of the cell to delete\n     * @throws  PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord)\n    {\n        //    Delete the entry from APC\n        apc_delete($this->cachePrefix.$pCoord.'.cache');\n\n        //    Delete the entry from our cell address array\n        parent::deleteCacheData($pCoord);\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @access  public\n     * @param   PHPExcel_Worksheet  $parent  The new worksheet\n     * @throws  PHPExcel_Exception\n     * @return  void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        parent::copyCellCollection($parent);\n        //    Get a new id for the new file name\n        $baseUnique = $this->getUniqueID();\n        $newCachePrefix = substr(md5($baseUnique), 0, 8) . '.';\n        $cacheList = $this->getCellList();\n        foreach ($cacheList as $cellID) {\n            if ($cellID != $this->currentObjectID) {\n                $obj = apc_fetch($this->cachePrefix . $cellID . '.cache');\n                if ($obj === false) {\n                    //    Entry no longer exists in APC, so clear it from the cache array\n                    parent::deleteCacheData($cellID);\n                    throw new PHPExcel_Exception('Cell entry ' . $cellID . ' no longer exists in APC');\n                }\n                if (!apc_store($newCachePrefix . $cellID . '.cache', $obj, $this->cacheTime)) {\n                    $this->__destruct();\n                    throw new PHPExcel_Exception('Failed to store cell ' . $cellID . ' in APC');\n                }\n            }\n        }\n        $this->cachePrefix = $newCachePrefix;\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return  void\n     */\n    public function unsetWorksheetCells()\n    {\n        if ($this->currentObject !== null) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n\n        //    Flush the APC cache\n        $this->__destruct();\n\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param  PHPExcel_Worksheet  $parent     The worksheet for this cell collection\n     * @param  array of mixed      $arguments  Additional initialisation arguments\n     */\n    public function __construct(PHPExcel_Worksheet $parent, $arguments)\n    {\n        $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;\n\n        if ($this->cachePrefix === null) {\n            $baseUnique = $this->getUniqueID();\n            $this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.';\n            $this->cacheTime = $cacheTime;\n\n            parent::__construct($parent);\n        }\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        $cacheList = $this->getCellList();\n        foreach ($cacheList as $cellID) {\n            apc_delete($this->cachePrefix . $cellID . '.cache');\n        }\n    }\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return  boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        if (!function_exists('apc_store')) {\n            return false;\n        }\n        if (apc_sma_info() === false) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_CacheBase\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_CachedObjectStorage_CacheBase\n{\n    /**\n     * Parent worksheet\n     *\n     * @var PHPExcel_Worksheet\n     */\n    protected $parent;\n\n    /**\n     * The currently active Cell\n     *\n     * @var PHPExcel_Cell\n     */\n    protected $currentObject = null;\n\n    /**\n     * Coordinate address of the currently active Cell\n     *\n     * @var string\n     */\n    protected $currentObjectID = null;\n\n    /**\n     * Flag indicating whether the currently active Cell requires saving\n     *\n     * @var boolean\n     */\n    protected $currentCellIsDirty = true;\n\n    /**\n     * An array of cells or cell pointers for the worksheet cells held in this cache,\n     *        and indexed by their coordinate address within the worksheet\n     *\n     * @var array of mixed\n     */\n    protected $cellCache = array();\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     */\n    public function __construct(PHPExcel_Worksheet $parent)\n    {\n        //    Set our parent worksheet.\n        //    This is maintained within the cache controller to facilitate re-attaching it to PHPExcel_Cell objects when\n        //        they are woken from a serialized state\n        $this->parent = $parent;\n    }\n\n    /**\n     * Return the parent worksheet for this cell collection\n     *\n     * @return    PHPExcel_Worksheet\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?\n     *\n     * @param    string        $pCoord        Coordinate address of the cell to check\n     * @return    boolean\n     */\n    public function isDataSet($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return true;\n        }\n        //    Check if the requested entry exists in the cache\n        return isset($this->cellCache[$pCoord]);\n    }\n\n    /**\n     * Move a cell object from one address to another\n     *\n     * @param    string        $fromAddress    Current address of the cell to move\n     * @param    string        $toAddress        Destination address of the cell to move\n     * @return    boolean\n     */\n    public function moveCell($fromAddress, $toAddress)\n    {\n        if ($fromAddress === $this->currentObjectID) {\n            $this->currentObjectID = $toAddress;\n        }\n        $this->currentCellIsDirty = true;\n        if (isset($this->cellCache[$fromAddress])) {\n            $this->cellCache[$toAddress] = &$this->cellCache[$fromAddress];\n            unset($this->cellCache[$fromAddress]);\n        }\n\n        return true;\n    }\n\n    /**\n     * Add or Update a cell in cache\n     *\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function updateCacheData(PHPExcel_Cell $cell)\n    {\n        return $this->addCacheData($cell->getCoordinate(), $cell);\n    }\n\n    /**\n     * Delete a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to delete\n     * @throws    PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID && !is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObjectID = $this->currentObject = null;\n        }\n\n        if (is_object($this->cellCache[$pCoord])) {\n            $this->cellCache[$pCoord]->detach();\n            unset($this->cellCache[$pCoord]);\n        }\n        $this->currentCellIsDirty = false;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return    string[]\n     */\n    public function getCellList()\n    {\n        return array_keys($this->cellCache);\n    }\n\n    /**\n     * Sort the list of all cell addresses currently held in cache by row and column\n     *\n     * @return    string[]\n     */\n    public function getSortedCellList()\n    {\n        $sortKeys = array();\n        foreach ($this->getCellList() as $coord) {\n            sscanf($coord, '%[A-Z]%d', $column, $row);\n            $sortKeys[sprintf('%09d%3s', $row, $column)] = $coord;\n        }\n        ksort($sortKeys);\n\n        return array_values($sortKeys);\n    }\n\n    /**\n     * Get highest worksheet column and highest row that have cell records\n     *\n     * @return array Highest column name and highest row number\n     */\n    public function getHighestRowAndColumn()\n    {\n        // Lookup highest column and highest row\n        $col = array('A' => '1A');\n        $row = array(1);\n        foreach ($this->getCellList() as $coord) {\n            sscanf($coord, '%[A-Z]%d', $c, $r);\n            $row[$r] = $r;\n            $col[$c] = strlen($c).$c;\n        }\n        if (!empty($row)) {\n            // Determine highest column and row\n            $highestRow = max($row);\n            $highestColumn = substr(max($col), 1);\n        }\n\n        return array(\n            'row'    => $highestRow,\n            'column' => $highestColumn\n        );\n    }\n\n    /**\n     * Return the cell address of the currently active cell object\n     *\n     * @return    string\n     */\n    public function getCurrentAddress()\n    {\n        return $this->currentObjectID;\n    }\n\n    /**\n     * Return the column address of the currently active cell object\n     *\n     * @return    string\n     */\n    public function getCurrentColumn()\n    {\n        sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row);\n        return $column;\n    }\n\n    /**\n     * Return the row address of the currently active cell object\n     *\n     * @return    integer\n     */\n    public function getCurrentRow()\n    {\n        sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row);\n        return (integer) $row;\n    }\n\n    /**\n     * Get highest worksheet column\n     *\n     * @param   string     $row        Return the highest column for the specified row,\n     *                                     or the highest column of any row if no row number is passed\n     * @return  string     Highest column name\n     */\n    public function getHighestColumn($row = null)\n    {\n        if ($row == null) {\n            $colRow = $this->getHighestRowAndColumn();\n            return $colRow['column'];\n        }\n\n        $columnList = array(1);\n        foreach ($this->getCellList() as $coord) {\n            sscanf($coord, '%[A-Z]%d', $c, $r);\n            if ($r != $row) {\n                continue;\n            }\n            $columnList[] = PHPExcel_Cell::columnIndexFromString($c);\n        }\n        return PHPExcel_Cell::stringFromColumnIndex(max($columnList) - 1);\n    }\n\n    /**\n     * Get highest worksheet row\n     *\n     * @param   string     $column     Return the highest row for the specified column,\n     *                                     or the highest row of any column if no column letter is passed\n     * @return  int        Highest row number\n     */\n    public function getHighestRow($column = null)\n    {\n        if ($column == null) {\n            $colRow = $this->getHighestRowAndColumn();\n            return $colRow['row'];\n        }\n\n        $rowList = array(0);\n        foreach ($this->getCellList() as $coord) {\n            sscanf($coord, '%[A-Z]%d', $c, $r);\n            if ($c != $column) {\n                continue;\n            }\n            $rowList[] = $r;\n        }\n\n        return max($rowList);\n    }\n\n    /**\n     * Generate a unique ID for cache referencing\n     *\n     * @return string Unique Reference\n     */\n    protected function getUniqueID()\n    {\n        if (function_exists('posix_getpid')) {\n            $baseUnique = posix_getpid();\n        } else {\n            $baseUnique = mt_rand();\n        }\n        return uniqid($baseUnique, true);\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        $this->currentCellIsDirty;\n        $this->storeData();\n\n        $this->parent = $parent;\n        if (($this->currentObject !== null) && (is_object($this->currentObject))) {\n            $this->currentObject->attach($this);\n        }\n    }    //    function copyCellCollection()\n\n    /**\n     * Remove a row, deleting all cells in that row\n     *\n     * @param string    $row    Row number to remove\n     * @return void\n     */\n    public function removeRow($row)\n    {\n        foreach ($this->getCellList() as $coord) {\n            sscanf($coord, '%[A-Z]%d', $c, $r);\n            if ($r == $row) {\n                $this->deleteCacheData($coord);\n            }\n        }\n    }\n\n    /**\n     * Remove a column, deleting all cells in that column\n     *\n     * @param string    $column    Column ID to remove\n     * @return void\n     */\n    public function removeColumn($column)\n    {\n        foreach ($this->getCellList() as $coord) {\n            sscanf($coord, '%[A-Z]%d', $c, $r);\n            if ($c == $column) {\n                $this->deleteCacheData($coord);\n            }\n        }\n    }\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_DiscISAM\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Name of the file for this cache\n     *\n     * @var string\n     */\n    private $fileName = null;\n\n    /**\n     * File handle for this cache file\n     *\n     * @var resource\n     */\n    private $fileHandle = null;\n\n    /**\n     * Directory/Folder where the cache file is located\n     *\n     * @var string\n     */\n    private $cacheDirectory = null;\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            fseek($this->fileHandle, 0, SEEK_END);\n\n            $this->cellCache[$this->currentObjectID] = array(\n                'ptr' => ftell($this->fileHandle),\n                'sz'  => fwrite($this->fileHandle, serialize($this->currentObject))\n            );\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (!isset($this->cellCache[$pCoord])) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']);\n        $this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz']));\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        parent::copyCellCollection($parent);\n        //    Get a new id for the new file name\n        $baseUnique = $this->getUniqueID();\n        $newFileName = $this->cacheDirectory.'/PHPExcel.'.$baseUnique.'.cache';\n        //    Copy the existing cell cache file\n        copy($this->fileName, $newFileName);\n        $this->fileName = $newFileName;\n        //    Open the copied cell cache file\n        $this->fileHandle = fopen($this->fileName, 'a+');\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n\n        //    Close down the temporary cache file\n        $this->__destruct();\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     * @param    array of mixed        $arguments    Additional initialisation arguments\n     */\n    public function __construct(PHPExcel_Worksheet $parent, $arguments)\n    {\n        $this->cacheDirectory    = ((isset($arguments['dir'])) && ($arguments['dir'] !== null))\n                                    ? $arguments['dir']\n                                    : PHPExcel_Shared_File::sys_get_temp_dir();\n\n        parent::__construct($parent);\n        if (is_null($this->fileHandle)) {\n            $baseUnique = $this->getUniqueID();\n            $this->fileName = $this->cacheDirectory.'/PHPExcel.'.$baseUnique.'.cache';\n            $this->fileHandle = fopen($this->fileName, 'a+');\n        }\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        if (!is_null($this->fileHandle)) {\n            fclose($this->fileHandle);\n            unlink($this->fileName);\n        }\n        $this->fileHandle = null;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_ICache\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\ninterface PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell);\n\n    /**\n     * Add or Update a cell in cache\n     *\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function updateCacheData(PHPExcel_Cell $cell);\n\n    /**\n     * Fetch a cell from cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to retrieve\n     * @return PHPExcel_Cell     Cell that was found, or null if not found\n     * @throws    PHPExcel_Exception\n     */\n    public function getCacheData($pCoord);\n\n    /**\n     * Delete a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to delete\n     * @throws    PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord);\n\n    /**\n     * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?\n     *\n     * @param    string        $pCoord        Coordinate address of the cell to check\n     * @return    boolean\n     */\n    public function isDataSet($pCoord);\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return    string[]\n     */\n    public function getCellList();\n\n    /**\n     * Get the list of all cell addresses currently held in cache sorted by column and row\n     *\n     * @return    string[]\n     */\n    public function getSortedCellList();\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent);\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable();\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Igbinary.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_Igbinary\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_Igbinary extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            $this->cellCache[$this->currentObjectID] = igbinary_serialize($this->currentObject);\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }    //    function _storeData()\n\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }    //    function addCacheData()\n\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (!isset($this->cellCache[$pCoord])) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = igbinary_unserialize($this->cellCache[$pCoord]);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }    //    function getCacheData()\n\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }    //    function unsetWorksheetCells()\n\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        if (!function_exists('igbinary_serialize')) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_Memcache\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Prefix used to uniquely identify cache data for this worksheet\n     *\n     * @var string\n     */\n    private $cachePrefix = null;\n\n    /**\n     * Cache timeout\n     *\n     * @var integer\n     */\n    private $cacheTime = 600;\n\n    /**\n     * Memcache interface\n     *\n     * @var resource\n     */\n    private $memcache = null;\n\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            $obj = serialize($this->currentObject);\n            if (!$this->memcache->replace($this->cachePrefix . $this->currentObjectID . '.cache', $obj, null, $this->cacheTime)) {\n                if (!$this->memcache->add($this->cachePrefix . $this->currentObjectID . '.cache', $obj, null, $this->cacheTime)) {\n                    $this->__destruct();\n                    throw new PHPExcel_Exception(\"Failed to store cell {$this->currentObjectID} in MemCache\");\n                }\n            }\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }    //    function _storeData()\n\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n        $this->cellCache[$pCoord] = true;\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }    //    function addCacheData()\n\n\n    /**\n     * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?\n     *\n     * @param    string        $pCoord        Coordinate address of the cell to check\n     * @return    boolean\n     * @return    boolean\n     */\n    public function isDataSet($pCoord)\n    {\n        //    Check if the requested entry is the current object, or exists in the cache\n        if (parent::isDataSet($pCoord)) {\n            if ($this->currentObjectID == $pCoord) {\n                return true;\n            }\n            //    Check if the requested entry still exists in Memcache\n            $success = $this->memcache->get($this->cachePrefix.$pCoord.'.cache');\n            if ($success === false) {\n                //    Entry no longer exists in Memcache, so clear it from the cache array\n                parent::deleteCacheData($pCoord);\n                throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in MemCache');\n            }\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (parent::isDataSet($pCoord)) {\n            $obj = $this->memcache->get($this->cachePrefix . $pCoord . '.cache');\n            if ($obj === false) {\n                //    Entry no longer exists in Memcache, so clear it from the cache array\n                parent::deleteCacheData($pCoord);\n                throw new PHPExcel_Exception(\"Cell entry {$pCoord} no longer exists in MemCache\");\n            }\n        } else {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = unserialize($obj);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n    /**\n     * Delete a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to delete\n     * @throws    PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord)\n    {\n        //    Delete the entry from Memcache\n        $this->memcache->delete($this->cachePrefix . $pCoord . '.cache');\n\n        //    Delete the entry from our cell address array\n        parent::deleteCacheData($pCoord);\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        parent::copyCellCollection($parent);\n        //    Get a new id for the new file name\n        $baseUnique = $this->getUniqueID();\n        $newCachePrefix = substr(md5($baseUnique), 0, 8) . '.';\n        $cacheList = $this->getCellList();\n        foreach ($cacheList as $cellID) {\n            if ($cellID != $this->currentObjectID) {\n                $obj = $this->memcache->get($this->cachePrefix.$cellID.'.cache');\n                if ($obj === false) {\n                    //    Entry no longer exists in Memcache, so clear it from the cache array\n                    parent::deleteCacheData($cellID);\n                    throw new PHPExcel_Exception(\"Cell entry {$cellID} no longer exists in MemCache\");\n                }\n                if (!$this->memcache->add($newCachePrefix . $cellID . '.cache', $obj, null, $this->cacheTime)) {\n                    $this->__destruct();\n                    throw new PHPExcel_Exception(\"Failed to store cell {$cellID} in MemCache\");\n                }\n            }\n        }\n        $this->cachePrefix = $newCachePrefix;\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n\n        //    Flush the Memcache cache\n        $this->__destruct();\n\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     * @param    array of mixed        $arguments    Additional initialisation arguments\n     */\n    public function __construct(PHPExcel_Worksheet $parent, $arguments)\n    {\n        $memcacheServer = (isset($arguments['memcacheServer'])) ? $arguments['memcacheServer'] : 'localhost';\n        $memcachePort = (isset($arguments['memcachePort'])) ? $arguments['memcachePort'] : 11211;\n        $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;\n\n        if (is_null($this->cachePrefix)) {\n            $baseUnique = $this->getUniqueID();\n            $this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.';\n\n            //    Set a new Memcache object and connect to the Memcache server\n            $this->memcache = new Memcache();\n            if (!$this->memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback'))) {\n                throw new PHPExcel_Exception(\"Could not connect to MemCache server at {$memcacheServer}:{$memcachePort}\");\n            }\n            $this->cacheTime = $cacheTime;\n\n            parent::__construct($parent);\n        }\n    }\n\n    /**\n     * Memcache error handler\n     *\n     * @param    string    $host        Memcache server\n     * @param    integer    $port        Memcache port\n     * @throws    PHPExcel_Exception\n     */\n    public function failureCallback($host, $port)\n    {\n        throw new PHPExcel_Exception(\"memcache {$host}:{$port} failed\");\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        $cacheList = $this->getCellList();\n        foreach ($cacheList as $cellID) {\n            $this->memcache->delete($this->cachePrefix.$cellID . '.cache');\n        }\n    }\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        if (!function_exists('memcache_add')) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_Memory\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_Memory extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Dummy method callable from CacheBase, but unused by Memory cache\n     *\n     * @return    void\n     */\n    protected function storeData()\n    {\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        $this->cellCache[$pCoord] = $cell;\n\n        //    Set current entry to the new/updated entry\n        $this->currentObjectID = $pCoord;\n\n        return $cell;\n    }\n\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        //    Check if the entry that has been requested actually exists\n        if (!isset($this->cellCache[$pCoord])) {\n            $this->currentObjectID = null;\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n\n        //    Return requested entry\n        return $this->cellCache[$pCoord];\n    }\n\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        parent::copyCellCollection($parent);\n\n        $newCollection = array();\n        foreach ($this->cellCache as $k => &$cell) {\n            $newCollection[$k] = clone $cell;\n            $newCollection[$k]->attach($this);\n        }\n\n        $this->cellCache = $newCollection;\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     */\n    public function unsetWorksheetCells()\n    {\n        // Because cells are all stored as intact objects in memory, we need to detach each one from the parent\n        foreach ($this->cellCache as $k => &$cell) {\n            $cell->detach();\n            $this->cellCache[$k] = null;\n        }\n        unset($cell);\n\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_MemoryGZip\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_MemoryGZip extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            $this->cellCache[$this->currentObjectID] = gzdeflate(serialize($this->currentObject));\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (!isset($this->cellCache[$pCoord])) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = unserialize(gzinflate($this->cellCache[$pCoord]));\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_MemorySerialized\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_MemorySerialized extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            $this->cellCache[$this->currentObjectID] = serialize($this->currentObject);\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (!isset($this->cellCache[$pCoord])) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = unserialize($this->cellCache[$pCoord]);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_PHPTemp\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Name of the file for this cache\n     *\n     * @var string\n     */\n    private $fileHandle = null;\n\n    /**\n     * Memory limit to use before reverting to file cache\n     *\n     * @var integer\n     */\n    private $memoryCacheSize = null;\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            fseek($this->fileHandle, 0, SEEK_END);\n\n            $this->cellCache[$this->currentObjectID] = array(\n                'ptr' => ftell($this->fileHandle),\n                'sz'  => fwrite($this->fileHandle, serialize($this->currentObject))\n            );\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        if (!isset($this->cellCache[$pCoord])) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']);\n        $this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz']));\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        parent::copyCellCollection($parent);\n        //    Open a new stream for the cell cache data\n        $newFileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+');\n        //    Copy the existing cell cache data to the new stream\n        fseek($this->fileHandle, 0);\n        while (!feof($this->fileHandle)) {\n            fwrite($newFileHandle, fread($this->fileHandle, 1024));\n        }\n        $this->fileHandle = $newFileHandle;\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n\n        //    Close down the php://temp file\n        $this->__destruct();\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     * @param    array of mixed        $arguments    Additional initialisation arguments\n     */\n    public function __construct(PHPExcel_Worksheet $parent, $arguments)\n    {\n        $this->memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB';\n\n        parent::__construct($parent);\n        if (is_null($this->fileHandle)) {\n            $this->fileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+');\n        }\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        if (!is_null($this->fileHandle)) {\n            fclose($this->fileHandle);\n        }\n        $this->fileHandle = null;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/SQLite.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_SQLite\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_SQLite extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Database table name\n     *\n     * @var string\n     */\n    private $TableName = null;\n\n    /**\n     * Database handle\n     *\n     * @var resource\n     */\n    private $DBHandle = null;\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            if (!$this->DBHandle->queryExec(\"INSERT OR REPLACE INTO kvp_\".$this->TableName.\" VALUES('\".$this->currentObjectID.\"','\".sqlite_escape_string(serialize($this->currentObject)).\"')\")) {\n                throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n            }\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        $query = \"SELECT value FROM kvp_\".$this->TableName.\" WHERE id='\".$pCoord.\"'\";\n        $cellResultSet = $this->DBHandle->query($query, SQLITE_ASSOC);\n        if ($cellResultSet === false) {\n            throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n        } elseif ($cellResultSet->numRows() == 0) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n\n        $cellResult = $cellResultSet->fetchSingle();\n        $this->currentObject = unserialize($cellResult);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     * Is a value set for an indexed cell?\n     *\n     * @param    string        $pCoord        Coordinate address of the cell to check\n     * @return    boolean\n     */\n    public function isDataSet($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return true;\n        }\n\n        //    Check if the requested entry exists in the cache\n        $query = \"SELECT id FROM kvp_\".$this->TableName.\" WHERE id='\".$pCoord.\"'\";\n        $cellResultSet = $this->DBHandle->query($query, SQLITE_ASSOC);\n        if ($cellResultSet === false) {\n            throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n        } elseif ($cellResultSet->numRows() == 0) {\n            //    Return null if requested entry doesn't exist in cache\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Delete a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to delete\n     * @throws    PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            $this->currentObject->detach();\n            $this->currentObjectID = $this->currentObject = null;\n        }\n\n        //    Check if the requested entry exists in the cache\n        $query = \"DELETE FROM kvp_\".$this->TableName.\" WHERE id='\".$pCoord.\"'\";\n        if (!$this->DBHandle->queryExec($query)) {\n            throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n        }\n\n        $this->currentCellIsDirty = false;\n    }\n\n    /**\n     * Move a cell object from one address to another\n     *\n     * @param    string        $fromAddress    Current address of the cell to move\n     * @param    string        $toAddress        Destination address of the cell to move\n     * @return    boolean\n     */\n    public function moveCell($fromAddress, $toAddress)\n    {\n        if ($fromAddress === $this->currentObjectID) {\n            $this->currentObjectID = $toAddress;\n        }\n\n        $query = \"DELETE FROM kvp_\".$this->TableName.\" WHERE id='\".$toAddress.\"'\";\n        $result = $this->DBHandle->exec($query);\n        if ($result === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        $query = \"UPDATE kvp_\".$this->TableName.\" SET id='\".$toAddress.\"' WHERE id='\".$fromAddress.\"'\";\n        $result = $this->DBHandle->exec($query);\n        if ($result === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        return true;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return    string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        $query = \"SELECT id FROM kvp_\".$this->TableName;\n        $cellIdsResult = $this->DBHandle->unbufferedQuery($query, SQLITE_ASSOC);\n        if ($cellIdsResult === false) {\n            throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n        }\n\n        $cellKeys = array();\n        foreach ($cellIdsResult as $row) {\n            $cellKeys[] = $row['id'];\n        }\n\n        return $cellKeys;\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        $this->currentCellIsDirty;\n        $this->storeData();\n\n        //    Get a new id for the new table name\n        $tableName = str_replace('.', '_', $this->getUniqueID());\n        if (!$this->DBHandle->queryExec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)\n            AS SELECT * FROM kvp_'.$this->TableName)\n        ) {\n            throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n        }\n\n        //    Copy the existing cell cache file\n        $this->TableName = $tableName;\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n\n        //    Close down the temporary cache file\n        $this->__destruct();\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     */\n    public function __construct(PHPExcel_Worksheet $parent)\n    {\n        parent::__construct($parent);\n        if (is_null($this->DBHandle)) {\n            $this->TableName = str_replace('.', '_', $this->getUniqueID());\n            $_DBName = ':memory:';\n\n            $this->DBHandle = new SQLiteDatabase($_DBName);\n            if ($this->DBHandle === false) {\n                throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n            }\n            if (!$this->DBHandle->queryExec('CREATE TABLE kvp_'.$this->TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) {\n                throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError()));\n            }\n        }\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        if (!is_null($this->DBHandle)) {\n            $this->DBHandle->queryExec('DROP TABLE kvp_'.$this->TableName);\n        }\n        $this->DBHandle = null;\n    }\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        if (!function_exists('sqlite_open')) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/SQLite3.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_SQLite3\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Database table name\n     *\n     * @var string\n     */\n    private $TableName = null;\n\n    /**\n     * Database handle\n     *\n     * @var resource\n     */\n    private $DBHandle = null;\n\n    /**\n     * Prepared statement for a SQLite3 select query\n     *\n     * @var SQLite3Stmt\n     */\n    private $selectQuery;\n\n    /**\n     * Prepared statement for a SQLite3 insert query\n     *\n     * @var SQLite3Stmt\n     */\n    private $insertQuery;\n\n    /**\n     * Prepared statement for a SQLite3 update query\n     *\n     * @var SQLite3Stmt\n     */\n    private $updateQuery;\n\n    /**\n     * Prepared statement for a SQLite3 delete query\n     *\n     * @var SQLite3Stmt\n     */\n    private $deleteQuery;\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            $this->insertQuery->bindValue('id', $this->currentObjectID, SQLITE3_TEXT);\n            $this->insertQuery->bindValue('data', serialize($this->currentObject), SQLITE3_BLOB);\n            $result = $this->insertQuery->execute();\n            if ($result === false) {\n                throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n            }\n            $this->currentCellIsDirty = false;\n        }\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param     string             $pCoord        Coordinate of the cell\n     * @throws     PHPExcel_Exception\n     * @return     PHPExcel_Cell     Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        $this->selectQuery->bindValue('id', $pCoord, SQLITE3_TEXT);\n        $cellResult = $this->selectQuery->execute();\n        if ($cellResult === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n        $cellData = $cellResult->fetchArray(SQLITE3_ASSOC);\n        if ($cellData === false) {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n\n        $this->currentObject = unserialize($cellData['value']);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n    /**\n     *    Is a value set for an indexed cell?\n     *\n     * @param    string        $pCoord        Coordinate address of the cell to check\n     * @return    boolean\n     */\n    public function isDataSet($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return true;\n        }\n\n        //    Check if the requested entry exists in the cache\n        $this->selectQuery->bindValue('id', $pCoord, SQLITE3_TEXT);\n        $cellResult = $this->selectQuery->execute();\n        if ($cellResult === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n        $cellData = $cellResult->fetchArray(SQLITE3_ASSOC);\n\n        return ($cellData === false) ? false : true;\n    }\n\n    /**\n     *    Delete a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to delete\n     * @throws    PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            $this->currentObject->detach();\n            $this->currentObjectID = $this->currentObject = null;\n        }\n\n        //    Check if the requested entry exists in the cache\n        $this->deleteQuery->bindValue('id', $pCoord, SQLITE3_TEXT);\n        $result = $this->deleteQuery->execute();\n        if ($result === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        $this->currentCellIsDirty = false;\n    }\n\n    /**\n     * Move a cell object from one address to another\n     *\n     * @param    string        $fromAddress    Current address of the cell to move\n     * @param    string        $toAddress        Destination address of the cell to move\n     * @return    boolean\n     */\n    public function moveCell($fromAddress, $toAddress)\n    {\n        if ($fromAddress === $this->currentObjectID) {\n            $this->currentObjectID = $toAddress;\n        }\n\n        $this->deleteQuery->bindValue('id', $toAddress, SQLITE3_TEXT);\n        $result = $this->deleteQuery->execute();\n        if ($result === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        $this->updateQuery->bindValue('toid', $toAddress, SQLITE3_TEXT);\n        $this->updateQuery->bindValue('fromid', $fromAddress, SQLITE3_TEXT);\n        $result = $this->updateQuery->execute();\n        if ($result === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        return true;\n    }\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return    string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        $query = \"SELECT id FROM kvp_\".$this->TableName;\n        $cellIdsResult = $this->DBHandle->query($query);\n        if ($cellIdsResult === false) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        $cellKeys = array();\n        while ($row = $cellIdsResult->fetchArray(SQLITE3_ASSOC)) {\n            $cellKeys[] = $row['id'];\n        }\n\n        return $cellKeys;\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        $this->currentCellIsDirty;\n        $this->storeData();\n\n        //    Get a new id for the new table name\n        $tableName = str_replace('.', '_', $this->getUniqueID());\n        if (!$this->DBHandle->exec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)\n            AS SELECT * FROM kvp_'.$this->TableName)\n        ) {\n            throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n        }\n\n        //    Copy the existing cell cache file\n        $this->TableName = $tableName;\n    }\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n\n        //    Close down the temporary cache file\n        $this->__destruct();\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     */\n    public function __construct(PHPExcel_Worksheet $parent)\n    {\n        parent::__construct($parent);\n        if (is_null($this->DBHandle)) {\n            $this->TableName = str_replace('.', '_', $this->getUniqueID());\n            $_DBName = ':memory:';\n\n            $this->DBHandle = new SQLite3($_DBName);\n            if ($this->DBHandle === false) {\n                throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n            }\n            if (!$this->DBHandle->exec('CREATE TABLE kvp_'.$this->TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) {\n                throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg());\n            }\n        }\n\n        $this->selectQuery = $this->DBHandle->prepare(\"SELECT value FROM kvp_\".$this->TableName.\" WHERE id = :id\");\n        $this->insertQuery = $this->DBHandle->prepare(\"INSERT OR REPLACE INTO kvp_\".$this->TableName.\" VALUES(:id,:data)\");\n        $this->updateQuery = $this->DBHandle->prepare(\"UPDATE kvp_\".$this->TableName.\" SET id=:toId WHERE id=:fromId\");\n        $this->deleteQuery = $this->DBHandle->prepare(\"DELETE FROM kvp_\".$this->TableName.\" WHERE id = :id\");\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        if (!is_null($this->DBHandle)) {\n            $this->DBHandle->exec('DROP TABLE kvp_'.$this->TableName);\n            $this->DBHandle->close();\n        }\n        $this->DBHandle = null;\n    }\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        if (!class_exists('SQLite3', false)) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorage_Wincache\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache\n{\n    /**\n     * Prefix used to uniquely identify cache data for this worksheet\n     *\n     * @var string\n     */\n    private $cachePrefix = null;\n\n    /**\n     * Cache timeout\n     *\n     * @var integer\n     */\n    private $cacheTime = 600;\n\n\n    /**\n     * Store cell data in cache for the current cell object if it's \"dirty\",\n     *     and the 'nullify' the current cell object\n     *\n     * @return    void\n     * @throws    PHPExcel_Exception\n     */\n    protected function storeData()\n    {\n        if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {\n            $this->currentObject->detach();\n\n            $obj = serialize($this->currentObject);\n            if (wincache_ucache_exists($this->cachePrefix.$this->currentObjectID.'.cache')) {\n                if (!wincache_ucache_set($this->cachePrefix.$this->currentObjectID.'.cache', $obj, $this->cacheTime)) {\n                    $this->__destruct();\n                    throw new PHPExcel_Exception('Failed to store cell '.$this->currentObjectID.' in WinCache');\n                }\n            } else {\n                if (!wincache_ucache_add($this->cachePrefix.$this->currentObjectID.'.cache', $obj, $this->cacheTime)) {\n                    $this->__destruct();\n                    throw new PHPExcel_Exception('Failed to store cell '.$this->currentObjectID.' in WinCache');\n                }\n            }\n            $this->currentCellIsDirty = false;\n        }\n\n        $this->currentObjectID = $this->currentObject = null;\n    }\n\n    /**\n     * Add or Update a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to update\n     * @param    PHPExcel_Cell    $cell        Cell to update\n     * @return    PHPExcel_Cell\n     * @throws    PHPExcel_Exception\n     */\n    public function addCacheData($pCoord, PHPExcel_Cell $cell)\n    {\n        if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {\n            $this->storeData();\n        }\n        $this->cellCache[$pCoord] = true;\n\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = $cell;\n        $this->currentCellIsDirty = true;\n\n        return $cell;\n    }\n\n    /**\n     * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?\n     *\n     * @param    string        $pCoord        Coordinate address of the cell to check\n     * @return    boolean\n     */\n    public function isDataSet($pCoord)\n    {\n        //    Check if the requested entry is the current object, or exists in the cache\n        if (parent::isDataSet($pCoord)) {\n            if ($this->currentObjectID == $pCoord) {\n                return true;\n            }\n            //    Check if the requested entry still exists in cache\n            $success = wincache_ucache_exists($this->cachePrefix.$pCoord.'.cache');\n            if ($success === false) {\n                //    Entry no longer exists in Wincache, so clear it from the cache array\n                parent::deleteCacheData($pCoord);\n                throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');\n            }\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param    string            $pCoord        Coordinate of the cell\n     * @throws    PHPExcel_Exception\n     * @return    PHPExcel_Cell    Cell that was found, or null if not found\n     */\n    public function getCacheData($pCoord)\n    {\n        if ($pCoord === $this->currentObjectID) {\n            return $this->currentObject;\n        }\n        $this->storeData();\n\n        //    Check if the entry that has been requested actually exists\n        $obj = null;\n        if (parent::isDataSet($pCoord)) {\n            $success = false;\n            $obj = wincache_ucache_get($this->cachePrefix.$pCoord.'.cache', $success);\n            if ($success === false) {\n                //    Entry no longer exists in WinCache, so clear it from the cache array\n                parent::deleteCacheData($pCoord);\n                throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');\n            }\n        } else {\n            //    Return null if requested entry doesn't exist in cache\n            return null;\n        }\n\n        //    Set current entry to the requested entry\n        $this->currentObjectID = $pCoord;\n        $this->currentObject = unserialize($obj);\n        //    Re-attach this as the cell's parent\n        $this->currentObject->attach($this);\n\n        //    Return requested entry\n        return $this->currentObject;\n    }\n\n\n    /**\n     * Get a list of all cell addresses currently held in cache\n     *\n     * @return  string[]\n     */\n    public function getCellList()\n    {\n        if ($this->currentObjectID !== null) {\n            $this->storeData();\n        }\n\n        return parent::getCellList();\n    }\n\n    /**\n     * Delete a cell in cache identified by coordinate address\n     *\n     * @param    string            $pCoord        Coordinate address of the cell to delete\n     * @throws    PHPExcel_Exception\n     */\n    public function deleteCacheData($pCoord)\n    {\n        //    Delete the entry from Wincache\n        wincache_ucache_delete($this->cachePrefix.$pCoord.'.cache');\n\n        //    Delete the entry from our cell address array\n        parent::deleteCacheData($pCoord);\n    }\n\n    /**\n     * Clone the cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The new worksheet\n     * @return    void\n     */\n    public function copyCellCollection(PHPExcel_Worksheet $parent)\n    {\n        parent::copyCellCollection($parent);\n        //    Get a new id for the new file name\n        $baseUnique = $this->getUniqueID();\n        $newCachePrefix = substr(md5($baseUnique), 0, 8) . '.';\n        $cacheList = $this->getCellList();\n        foreach ($cacheList as $cellID) {\n            if ($cellID != $this->currentObjectID) {\n                $success = false;\n                $obj = wincache_ucache_get($this->cachePrefix.$cellID.'.cache', $success);\n                if ($success === false) {\n                    //    Entry no longer exists in WinCache, so clear it from the cache array\n                    parent::deleteCacheData($cellID);\n                    throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');\n                }\n                if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->cacheTime)) {\n                    $this->__destruct();\n                    throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');\n                }\n            }\n        }\n        $this->cachePrefix = $newCachePrefix;\n    }\n\n\n    /**\n     * Clear the cell collection and disconnect from our parent\n     *\n     * @return    void\n     */\n    public function unsetWorksheetCells()\n    {\n        if (!is_null($this->currentObject)) {\n            $this->currentObject->detach();\n            $this->currentObject = $this->currentObjectID = null;\n        }\n\n        //    Flush the WinCache cache\n        $this->__destruct();\n\n        $this->cellCache = array();\n\n        //    detach ourself from the worksheet, so that it can then delete this object successfully\n        $this->parent = null;\n    }\n\n    /**\n     * Initialise this new cell collection\n     *\n     * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection\n     * @param    array of mixed        $arguments    Additional initialisation arguments\n     */\n    public function __construct(PHPExcel_Worksheet $parent, $arguments)\n    {\n        $cacheTime    = (isset($arguments['cacheTime']))    ? $arguments['cacheTime']    : 600;\n\n        if (is_null($this->cachePrefix)) {\n            $baseUnique = $this->getUniqueID();\n            $this->cachePrefix = substr(md5($baseUnique), 0, 8).'.';\n            $this->cacheTime = $cacheTime;\n\n            parent::__construct($parent);\n        }\n    }\n\n    /**\n     * Destroy this cell collection\n     */\n    public function __destruct()\n    {\n        $cacheList = $this->getCellList();\n        foreach ($cacheList as $cellID) {\n            wincache_ucache_delete($this->cachePrefix.$cellID.'.cache');\n        }\n    }\n\n    /**\n     * Identify whether the caching method is currently available\n     * Some methods are dependent on the availability of certain extensions being enabled in the PHP build\n     *\n     * @return    boolean\n     */\n    public static function cacheMethodIsAvailable()\n    {\n        if (!function_exists('wincache_ucache_add')) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CachedObjectStorageFactory.php",
    "content": "<?php\n\n/**\n * PHPExcel_CachedObjectStorageFactory\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_CachedObjectStorage\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CachedObjectStorageFactory\n{\n    const cache_in_memory               = 'Memory';\n    const cache_in_memory_gzip          = 'MemoryGZip';\n    const cache_in_memory_serialized    = 'MemorySerialized';\n    const cache_igbinary                = 'Igbinary';\n    const cache_to_discISAM             = 'DiscISAM';\n    const cache_to_apc                  = 'APC';\n    const cache_to_memcache             = 'Memcache';\n    const cache_to_phpTemp              = 'PHPTemp';\n    const cache_to_wincache             = 'Wincache';\n    const cache_to_sqlite               = 'SQLite';\n    const cache_to_sqlite3              = 'SQLite3';\n\n    /**\n     * Name of the method used for cell cacheing\n     *\n     * @var string\n     */\n    private static $cacheStorageMethod = null;\n\n    /**\n     * Name of the class used for cell cacheing\n     *\n     * @var string\n     */\n    private static $cacheStorageClass = null;\n\n    /**\n     * List of all possible cache storage methods\n     *\n     * @var string[]\n     */\n    private static $storageMethods = array(\n        self::cache_in_memory,\n        self::cache_in_memory_gzip,\n        self::cache_in_memory_serialized,\n        self::cache_igbinary,\n        self::cache_to_phpTemp,\n        self::cache_to_discISAM,\n        self::cache_to_apc,\n        self::cache_to_memcache,\n        self::cache_to_wincache,\n        self::cache_to_sqlite,\n        self::cache_to_sqlite3,\n    );\n\n    /**\n     * Default arguments for each cache storage method\n     *\n     * @var array of mixed array\n     */\n    private static $storageMethodDefaultParameters = array(\n        self::cache_in_memory               => array(\n                                                    ),\n        self::cache_in_memory_gzip          => array(\n                                                    ),\n        self::cache_in_memory_serialized    => array(\n                                                    ),\n        self::cache_igbinary                => array(\n                                                    ),\n        self::cache_to_phpTemp              => array( 'memoryCacheSize' => '1MB'\n                                                    ),\n        self::cache_to_discISAM             => array( 'dir'             => null\n                                                    ),\n        self::cache_to_apc                  => array( 'cacheTime'       => 600\n                                                    ),\n        self::cache_to_memcache             => array( 'memcacheServer'  => 'localhost',\n                                                      'memcachePort'    => 11211,\n                                                      'cacheTime'       => 600\n                                                    ),\n        self::cache_to_wincache             => array( 'cacheTime'       => 600\n                                                    ),\n        self::cache_to_sqlite               => array(\n                                                    ),\n        self::cache_to_sqlite3              => array(\n                                                    ),\n    );\n\n    /**\n     * Arguments for the active cache storage method\n     *\n     * @var array of mixed array\n     */\n    private static $storageMethodParameters = array();\n\n    /**\n     * Return the current cache storage method\n     *\n     * @return string|null\n     **/\n    public static function getCacheStorageMethod()\n    {\n        return self::$cacheStorageMethod;\n    }\n\n    /**\n     * Return the current cache storage class\n     *\n     * @return PHPExcel_CachedObjectStorage_ICache|null\n     **/\n    public static function getCacheStorageClass()\n    {\n        return self::$cacheStorageClass;\n    }\n\n    /**\n     * Return the list of all possible cache storage methods\n     *\n     * @return string[]\n     **/\n    public static function getAllCacheStorageMethods()\n    {\n        return self::$storageMethods;\n    }\n\n    /**\n     * Return the list of all available cache storage methods\n     *\n     * @return string[]\n     **/\n    public static function getCacheStorageMethods()\n    {\n        $activeMethods = array();\n        foreach (self::$storageMethods as $storageMethod) {\n            $cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $storageMethod;\n            if (call_user_func(array($cacheStorageClass, 'cacheMethodIsAvailable'))) {\n                $activeMethods[] = $storageMethod;\n            }\n        }\n        return $activeMethods;\n    }\n\n    /**\n     * Identify the cache storage method to use\n     *\n     * @param    string            $method        Name of the method to use for cell cacheing\n     * @param    array of mixed    $arguments    Additional arguments to pass to the cell caching class\n     *                                        when instantiating\n     * @return boolean\n     **/\n    public static function initialize($method = self::cache_in_memory, $arguments = array())\n    {\n        if (!in_array($method, self::$storageMethods)) {\n            return false;\n        }\n\n        $cacheStorageClass = 'PHPExcel_CachedObjectStorage_'.$method;\n        if (!call_user_func(array( $cacheStorageClass,\n                                   'cacheMethodIsAvailable'))) {\n            return false;\n        }\n\n        self::$storageMethodParameters[$method] = self::$storageMethodDefaultParameters[$method];\n        foreach ($arguments as $k => $v) {\n            if (array_key_exists($k, self::$storageMethodParameters[$method])) {\n                self::$storageMethodParameters[$method][$k] = $v;\n            }\n        }\n\n        if (self::$cacheStorageMethod === null) {\n            self::$cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $method;\n            self::$cacheStorageMethod = $method;\n        }\n        return true;\n    }\n\n    /**\n     * Initialise the cache storage\n     *\n     * @param    PHPExcel_Worksheet     $parent        Enable cell caching for this worksheet\n     * @return    PHPExcel_CachedObjectStorage_ICache\n     **/\n    public static function getInstance(PHPExcel_Worksheet $parent)\n    {\n        $cacheMethodIsAvailable = true;\n        if (self::$cacheStorageMethod === null) {\n            $cacheMethodIsAvailable = self::initialize();\n        }\n\n        if ($cacheMethodIsAvailable) {\n            $instance = new self::$cacheStorageClass(\n                $parent,\n                self::$storageMethodParameters[self::$cacheStorageMethod]\n            );\n            if ($instance !== null) {\n                return $instance;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Clear the cache storage\n     *\n     **/\n    public static function finalize()\n    {\n        self::$cacheStorageMethod = null;\n        self::$cacheStorageClass = null;\n        self::$storageMethodParameters = array();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CalcEngine/CyclicReferenceStack.php",
    "content": "<?php\n\n/**\n * PHPExcel_CalcEngine_CyclicReferenceStack\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CalcEngine_CyclicReferenceStack\n{\n    /**\n     *  The call stack for calculated cells\n     *\n     *  @var mixed[]\n     */\n    private $stack = array();\n\n    /**\n     * Return the number of entries on the stack\n     *\n     * @return  integer\n     */\n    public function count()\n    {\n        return count($this->stack);\n    }\n\n    /**\n     * Push a new entry onto the stack\n     *\n     * @param  mixed  $value\n     */\n    public function push($value)\n    {\n        $this->stack[$value] = $value;\n    }\n\n    /**\n     * Pop the last entry from the stack\n     *\n     * @return  mixed\n     */\n    public function pop()\n    {\n        return array_pop($this->stack);\n    }\n\n    /**\n     * Test to see if a specified entry exists on the stack\n     *\n     * @param  mixed  $value  The value to test\n     */\n    public function onStack($value)\n    {\n        return isset($this->stack[$value]);\n    }\n\n    /**\n     * Clear the stack\n     */\n    public function clear()\n    {\n        $this->stack = array();\n    }\n\n    /**\n     * Return an array of all entries on the stack\n     *\n     * @return  mixed[]\n     */\n    public function showStack()\n    {\n        return $this->stack;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/CalcEngine/Logger.php",
    "content": "<?php\n\n/**\n * PHPExcel_CalcEngine_Logger\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_CalcEngine_Logger\n{\n    /**\n     * Flag to determine whether a debug log should be generated by the calculation engine\n     *        If true, then a debug log will be generated\n     *        If false, then a debug log will not be generated\n     *\n     * @var boolean\n     */\n    private $writeDebugLog = false;\n\n    /**\n     * Flag to determine whether a debug log should be echoed by the calculation engine\n     *        If true, then a debug log will be echoed\n     *        If false, then a debug log will not be echoed\n     * A debug log can only be echoed if it is generated\n     *\n     * @var boolean\n     */\n    private $echoDebugLog = false;\n\n    /**\n     * The debug log generated by the calculation engine\n     *\n     * @var string[]\n     */\n    private $debugLog = array();\n\n    /**\n     * The calculation engine cell reference stack\n     *\n     * @var PHPExcel_CalcEngine_CyclicReferenceStack\n     */\n    private $cellStack;\n\n    /**\n     * Instantiate a Calculation engine logger\n     *\n     * @param  PHPExcel_CalcEngine_CyclicReferenceStack $stack\n     */\n    public function __construct(PHPExcel_CalcEngine_CyclicReferenceStack $stack)\n    {\n        $this->cellStack = $stack;\n    }\n\n    /**\n     * Enable/Disable Calculation engine logging\n     *\n     * @param  boolean $pValue\n     */\n    public function setWriteDebugLog($pValue = false)\n    {\n        $this->writeDebugLog = $pValue;\n    }\n\n    /**\n     * Return whether calculation engine logging is enabled or disabled\n     *\n     * @return  boolean\n     */\n    public function getWriteDebugLog()\n    {\n        return $this->writeDebugLog;\n    }\n\n    /**\n     * Enable/Disable echoing of debug log information\n     *\n     * @param  boolean $pValue\n     */\n    public function setEchoDebugLog($pValue = false)\n    {\n        $this->echoDebugLog = $pValue;\n    }\n\n    /**\n     * Return whether echoing of debug log information is enabled or disabled\n     *\n     * @return  boolean\n     */\n    public function getEchoDebugLog()\n    {\n        return $this->echoDebugLog;\n    }\n\n    /**\n     * Write an entry to the calculation engine debug log\n     */\n    public function writeDebugLog()\n    {\n        //    Only write the debug log if logging is enabled\n        if ($this->writeDebugLog) {\n            $message = implode(func_get_args());\n            $cellReference = implode(' -> ', $this->cellStack->showStack());\n            if ($this->echoDebugLog) {\n                echo $cellReference,\n                    ($this->cellStack->count() > 0 ? ' => ' : ''),\n                    $message,\n                    PHP_EOL;\n            }\n            $this->debugLog[] = $cellReference .\n                ($this->cellStack->count() > 0 ? ' => ' : '') .\n                $message;\n        }\n    }\n\n    /**\n     * Clear the calculation engine debug log\n     */\n    public function clearLog()\n    {\n        $this->debugLog = array();\n    }\n\n    /**\n     * Return the calculation engine debug log\n     *\n     * @return  string[]\n     */\n    public function getLog()\n    {\n        return $this->debugLog;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Database.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Calculation_Database\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Database\n{\n    /**\n     * fieldExtract\n     *\n     * Extracts the column ID to use for the data field.\n     *\n     * @access    private\n     * @param    mixed[]        $database        The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    mixed        $field            Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @return    string|NULL\n     *\n     */\n    private static function fieldExtract($database, $field)\n    {\n        $field = strtoupper(PHPExcel_Calculation_Functions::flattenSingleValue($field));\n        $fieldNames = array_map('strtoupper', array_shift($database));\n\n        if (is_numeric($field)) {\n            $keys = array_keys($fieldNames);\n            return $keys[$field-1];\n        }\n        $key = array_search($field, $fieldNames);\n        return ($key) ? $key : null;\n    }\n\n    /**\n     * filter\n     *\n     * Parses the selection criteria, extracts the database rows that match those criteria, and\n     * returns that subset of rows.\n     *\n     * @access    private\n     * @param    mixed[]        $database        The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    mixed[]        $criteria        The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    array of mixed\n     *\n     */\n    private static function filter($database, $criteria)\n    {\n        $fieldNames = array_shift($database);\n        $criteriaNames = array_shift($criteria);\n\n        //    Convert the criteria into a set of AND/OR conditions with [:placeholders]\n        $testConditions = $testValues = array();\n        $testConditionsCount = 0;\n        foreach ($criteriaNames as $key => $criteriaName) {\n            $testCondition = array();\n            $testConditionCount = 0;\n            foreach ($criteria as $row => $criterion) {\n                if ($criterion[$key] > '') {\n                    $testCondition[] = '[:'.$criteriaName.']'.PHPExcel_Calculation_Functions::ifCondition($criterion[$key]);\n                    $testConditionCount++;\n                }\n            }\n            if ($testConditionCount > 1) {\n                $testConditions[] = 'OR(' . implode(',', $testCondition) . ')';\n                $testConditionsCount++;\n            } elseif ($testConditionCount == 1) {\n                $testConditions[] = $testCondition[0];\n                $testConditionsCount++;\n            }\n        }\n\n        if ($testConditionsCount > 1) {\n            $testConditionSet = 'AND(' . implode(',', $testConditions) . ')';\n        } elseif ($testConditionsCount == 1) {\n            $testConditionSet = $testConditions[0];\n        }\n\n        //    Loop through each row of the database\n        foreach ($database as $dataRow => $dataValues) {\n            //    Substitute actual values from the database row for our [:placeholders]\n            $testConditionList = $testConditionSet;\n            foreach ($criteriaNames as $key => $criteriaName) {\n                $k = array_search($criteriaName, $fieldNames);\n                if (isset($dataValues[$k])) {\n                    $dataValue = $dataValues[$k];\n                    $dataValue = (is_string($dataValue)) ? PHPExcel_Calculation::wrapResult(strtoupper($dataValue)) : $dataValue;\n                    $testConditionList = str_replace('[:' . $criteriaName . ']', $dataValue, $testConditionList);\n                }\n            }\n            //    evaluate the criteria against the row data\n            $result = PHPExcel_Calculation::getInstance()->_calculateFormulaValue('='.$testConditionList);\n            //    If the row failed to meet the criteria, remove it from the database\n            if (!$result) {\n                unset($database[$dataRow]);\n            }\n        }\n\n        return $database;\n    }\n\n\n    private static function getFilteredColumn($database, $field, $criteria)\n    {\n        //    reduce the database to a set of rows that match all the criteria\n        $database = self::filter($database, $criteria);\n        //    extract an array of values for the requested column\n        $colData = array();\n        foreach ($database as $row) {\n            $colData[] = $row[$field];\n        }\n        \n        return $colData;\n    }\n\n    /**\n     * DAVERAGE\n     *\n     * Averages the values in a column of a list or database that match conditions you specify.\n     *\n     * Excel Function:\n     *        DAVERAGE(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DAVERAGE($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::AVERAGE(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DCOUNT\n     *\n     * Counts the cells that contain numbers in a column of a list or database that match conditions\n     * that you specify.\n     *\n     * Excel Function:\n     *        DCOUNT(database,[field],criteria)\n     *\n     * Excel Function:\n     *        DAVERAGE(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    integer\n     *\n     * @TODO    The field argument is optional. If field is omitted, DCOUNT counts all records in the\n     *            database that match the criteria.\n     *\n     */\n    public static function DCOUNT($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::COUNT(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DCOUNTA\n     *\n     * Counts the nonblank cells in a column of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DCOUNTA(database,[field],criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    integer\n     *\n     * @TODO    The field argument is optional. If field is omitted, DCOUNTA counts all records in the\n     *            database that match the criteria.\n     *\n     */\n    public static function DCOUNTA($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        //    reduce the database to a set of rows that match all the criteria\n        $database = self::filter($database, $criteria);\n        //    extract an array of values for the requested column\n        $colData = array();\n        foreach ($database as $row) {\n            $colData[] = $row[$field];\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::COUNTA(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DGET\n     *\n     * Extracts a single value from a column of a list or database that matches conditions that you\n     * specify.\n     *\n     * Excel Function:\n     *        DGET(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    mixed\n     *\n     */\n    public static function DGET($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        $colData = self::getFilteredColumn($database, $field, $criteria);\n        if (count($colData) > 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        return $colData[0];\n    }\n\n\n    /**\n     * DMAX\n     *\n     * Returns the largest number in a column of a list or database that matches conditions you that\n     * specify.\n     *\n     * Excel Function:\n     *        DMAX(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DMAX($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::MAX(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DMIN\n     *\n     * Returns the smallest number in a column of a list or database that matches conditions you that\n     * specify.\n     *\n     * Excel Function:\n     *        DMIN(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DMIN($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::MIN(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DPRODUCT\n     *\n     * Multiplies the values in a column of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DPRODUCT(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DPRODUCT($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_MathTrig::PRODUCT(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DSTDEV\n     *\n     * Estimates the standard deviation of a population based on a sample by using the numbers in a\n     * column of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DSTDEV(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DSTDEV($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::STDEV(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DSTDEVP\n     *\n     * Calculates the standard deviation of a population based on the entire population by using the\n     * numbers in a column of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DSTDEVP(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DSTDEVP($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::STDEVP(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DSUM\n     *\n     * Adds the numbers in a column of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DSUM(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DSUM($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_MathTrig::SUM(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DVAR\n     *\n     * Estimates the variance of a population based on a sample by using the numbers in a column\n     * of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DVAR(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DVAR($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::VARFunc(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n\n\n    /**\n     * DVARP\n     *\n     * Calculates the variance of a population based on the entire population by using the numbers\n     * in a column of a list or database that match conditions that you specify.\n     *\n     * Excel Function:\n     *        DVARP(database,field,criteria)\n     *\n     * @access    public\n     * @category Database Functions\n     * @param    mixed[]            $database    The range of cells that makes up the list or database.\n     *                                        A database is a list of related data in which rows of related\n     *                                        information are records, and columns of data are fields. The\n     *                                        first row of the list contains labels for each column.\n     * @param    string|integer    $field        Indicates which column is used in the function. Enter the\n     *                                        column label enclosed between double quotation marks, such as\n     *                                        \"Age\" or \"Yield,\" or a number (without quotation marks) that\n     *                                        represents the position of the column within the list: 1 for\n     *                                        the first column, 2 for the second column, and so on.\n     * @param    mixed[]            $criteria    The range of cells that contains the conditions you specify.\n     *                                        You can use any range for the criteria argument, as long as it\n     *                                        includes at least one column label and at least one cell below\n     *                                        the column label in which you specify a condition for the\n     *                                        column.\n     * @return    float\n     *\n     */\n    public static function DVARP($database, $field, $criteria)\n    {\n        $field = self::fieldExtract($database, $field);\n        if (is_null($field)) {\n            return null;\n        }\n\n        // Return\n        return PHPExcel_Calculation_Statistical::VARP(\n            self::getFilteredColumn($database, $field, $criteria)\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/DateTime.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Calculation_DateTime\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_DateTime\n{\n    /**\n     * Identify if a year is a leap year or not\n     *\n     * @param    integer    $year    The year to test\n     * @return    boolean            TRUE if the year is a leap year, otherwise FALSE\n     */\n    public static function isLeapYear($year)\n    {\n        return ((($year % 4) == 0) && (($year % 100) != 0) || (($year % 400) == 0));\n    }\n\n\n    /**\n     * Return the number of days between two dates based on a 360 day calendar\n     *\n     * @param    integer    $startDay        Day of month of the start date\n     * @param    integer    $startMonth        Month of the start date\n     * @param    integer    $startYear        Year of the start date\n     * @param    integer    $endDay            Day of month of the start date\n     * @param    integer    $endMonth        Month of the start date\n     * @param    integer    $endYear        Year of the start date\n     * @param    boolean $methodUS        Whether to use the US method or the European method of calculation\n     * @return    integer    Number of days between the start date and the end date\n     */\n    private static function dateDiff360($startDay, $startMonth, $startYear, $endDay, $endMonth, $endYear, $methodUS)\n    {\n        if ($startDay == 31) {\n            --$startDay;\n        } elseif ($methodUS && ($startMonth == 2 && ($startDay == 29 || ($startDay == 28 && !self::isLeapYear($startYear))))) {\n            $startDay = 30;\n        }\n        if ($endDay == 31) {\n            if ($methodUS && $startDay != 30) {\n                $endDay = 1;\n                if ($endMonth == 12) {\n                    ++$endYear;\n                    $endMonth = 1;\n                } else {\n                    ++$endMonth;\n                }\n            } else {\n                $endDay = 30;\n            }\n        }\n\n        return $endDay + $endMonth * 30 + $endYear * 360 - $startDay - $startMonth * 30 - $startYear * 360;\n    }\n\n\n    /**\n     * getDateValue\n     *\n     * @param    string    $dateValue\n     * @return    mixed    Excel date/time serial value, or string if error\n     */\n    public static function getDateValue($dateValue)\n    {\n        if (!is_numeric($dateValue)) {\n            if ((is_string($dateValue)) &&\n                (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            if ((is_object($dateValue)) && ($dateValue instanceof DateTime)) {\n                $dateValue = PHPExcel_Shared_Date::PHPToExcel($dateValue);\n            } else {\n                $saveReturnDateType = PHPExcel_Calculation_Functions::getReturnDateType();\n                PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);\n                $dateValue = self::DATEVALUE($dateValue);\n                PHPExcel_Calculation_Functions::setReturnDateType($saveReturnDateType);\n            }\n        }\n        return $dateValue;\n    }\n\n\n    /**\n     * getTimeValue\n     *\n     * @param    string    $timeValue\n     * @return    mixed    Excel date/time serial value, or string if error\n     */\n    private static function getTimeValue($timeValue)\n    {\n        $saveReturnDateType = PHPExcel_Calculation_Functions::getReturnDateType();\n        PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);\n        $timeValue = self::TIMEVALUE($timeValue);\n        PHPExcel_Calculation_Functions::setReturnDateType($saveReturnDateType);\n        return $timeValue;\n    }\n\n\n    private static function adjustDateByMonths($dateValue = 0, $adjustmentMonths = 0)\n    {\n        // Execute function\n        $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue);\n        $oMonth = (int) $PHPDateObject->format('m');\n        $oYear = (int) $PHPDateObject->format('Y');\n\n        $adjustmentMonthsString = (string) $adjustmentMonths;\n        if ($adjustmentMonths > 0) {\n            $adjustmentMonthsString = '+'.$adjustmentMonths;\n        }\n        if ($adjustmentMonths != 0) {\n            $PHPDateObject->modify($adjustmentMonthsString.' months');\n        }\n        $nMonth = (int) $PHPDateObject->format('m');\n        $nYear = (int) $PHPDateObject->format('Y');\n\n        $monthDiff = ($nMonth - $oMonth) + (($nYear - $oYear) * 12);\n        if ($monthDiff != $adjustmentMonths) {\n            $adjustDays = (int) $PHPDateObject->format('d');\n            $adjustDaysString = '-'.$adjustDays.' days';\n            $PHPDateObject->modify($adjustDaysString);\n        }\n        return $PHPDateObject;\n    }\n\n\n    /**\n     * DATETIMENOW\n     *\n     * Returns the current date and time.\n     * The NOW function is useful when you need to display the current date and time on a worksheet or\n     * calculate a value based on the current date and time, and have that value updated each time you\n     * open the worksheet.\n     *\n     * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date\n     * and time format of your regional settings. PHPExcel does not change cell formatting in this way.\n     *\n     * Excel Function:\n     *        NOW()\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function DATETIMENOW()\n    {\n        $saveTimeZone = date_default_timezone_get();\n        date_default_timezone_set('UTC');\n        $retValue = false;\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                $retValue = (float) PHPExcel_Shared_Date::PHPToExcel(time());\n                break;\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                $retValue = (integer) time();\n                break;\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                $retValue = new DateTime();\n                break;\n        }\n        date_default_timezone_set($saveTimeZone);\n\n        return $retValue;\n    }\n\n\n    /**\n     * DATENOW\n     *\n     * Returns the current date.\n     * The NOW function is useful when you need to display the current date and time on a worksheet or\n     * calculate a value based on the current date and time, and have that value updated each time you\n     * open the worksheet.\n     *\n     * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date\n     * and time format of your regional settings. PHPExcel does not change cell formatting in this way.\n     *\n     * Excel Function:\n     *        TODAY()\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function DATENOW()\n    {\n        $saveTimeZone = date_default_timezone_get();\n        date_default_timezone_set('UTC');\n        $retValue = false;\n        $excelDateTime = floor(PHPExcel_Shared_Date::PHPToExcel(time()));\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                $retValue = (float) $excelDateTime;\n                break;\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                $retValue = (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateTime);\n                break;\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                $retValue = PHPExcel_Shared_Date::ExcelToPHPObject($excelDateTime);\n                break;\n        }\n        date_default_timezone_set($saveTimeZone);\n\n        return $retValue;\n    }\n\n\n    /**\n     * DATE\n     *\n     * The DATE function returns a value that represents a particular date.\n     *\n     * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date\n     * format of your regional settings. PHPExcel does not change cell formatting in this way.\n     *\n     * Excel Function:\n     *        DATE(year,month,day)\n     *\n     * PHPExcel is a lot more forgiving than MS Excel when passing non numeric values to this function.\n     * A Month name or abbreviation (English only at this point) such as 'January' or 'Jan' will still be accepted,\n     *     as will a day value with a suffix (e.g. '21st' rather than simply 21); again only English language.\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    integer        $year    The value of the year argument can include one to four digits.\n     *                                Excel interprets the year argument according to the configured\n     *                                date system: 1900 or 1904.\n     *                                If year is between 0 (zero) and 1899 (inclusive), Excel adds that\n     *                                value to 1900 to calculate the year. For example, DATE(108,1,2)\n     *                                returns January 2, 2008 (1900+108).\n     *                                If year is between 1900 and 9999 (inclusive), Excel uses that\n     *                                value as the year. For example, DATE(2008,1,2) returns January 2,\n     *                                2008.\n     *                                If year is less than 0 or is 10000 or greater, Excel returns the\n     *                                #NUM! error value.\n     * @param    integer        $month    A positive or negative integer representing the month of the year\n     *                                from 1 to 12 (January to December).\n     *                                If month is greater than 12, month adds that number of months to\n     *                                the first month in the year specified. For example, DATE(2008,14,2)\n     *                                returns the serial number representing February 2, 2009.\n     *                                If month is less than 1, month subtracts the magnitude of that\n     *                                number of months, plus 1, from the first month in the year\n     *                                specified. For example, DATE(2008,-3,2) returns the serial number\n     *                                representing September 2, 2007.\n     * @param    integer        $day    A positive or negative integer representing the day of the month\n     *                                from 1 to 31.\n     *                                If day is greater than the number of days in the month specified,\n     *                                day adds that number of days to the first day in the month. For\n     *                                example, DATE(2008,1,35) returns the serial number representing\n     *                                February 4, 2008.\n     *                                If day is less than 1, day subtracts the magnitude that number of\n     *                                days, plus one, from the first day of the month specified. For\n     *                                example, DATE(2008,1,-15) returns the serial number representing\n     *                                December 16, 2007.\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function DATE($year = 0, $month = 1, $day = 1)\n    {\n        $year  = PHPExcel_Calculation_Functions::flattenSingleValue($year);\n        $month = PHPExcel_Calculation_Functions::flattenSingleValue($month);\n        $day   = PHPExcel_Calculation_Functions::flattenSingleValue($day);\n\n        if (($month !== null) && (!is_numeric($month))) {\n            $month = PHPExcel_Shared_Date::monthStringToNumber($month);\n        }\n\n        if (($day !== null) && (!is_numeric($day))) {\n            $day = PHPExcel_Shared_Date::dayStringToNumber($day);\n        }\n\n        $year = ($year !== null) ? PHPExcel_Shared_String::testStringAsNumeric($year) : 0;\n        $month = ($month !== null) ? PHPExcel_Shared_String::testStringAsNumeric($month) : 0;\n        $day = ($day !== null) ? PHPExcel_Shared_String::testStringAsNumeric($day) : 0;\n        if ((!is_numeric($year)) ||\n            (!is_numeric($month)) ||\n            (!is_numeric($day))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $year    = (integer) $year;\n        $month    = (integer) $month;\n        $day    = (integer) $day;\n\n        $baseYear = PHPExcel_Shared_Date::getExcelCalendar();\n        // Validate parameters\n        if ($year < ($baseYear-1900)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ((($baseYear-1900) != 0) && ($year < $baseYear) && ($year >= 1900)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        if (($year < $baseYear) && ($year >= ($baseYear-1900))) {\n            $year += 1900;\n        }\n\n        if ($month < 1) {\n            //    Handle year/month adjustment if month < 1\n            --$month;\n            $year += ceil($month / 12) - 1;\n            $month = 13 - abs($month % 12);\n        } elseif ($month > 12) {\n            //    Handle year/month adjustment if month > 12\n            $year += floor($month / 12);\n            $month = ($month % 12);\n        }\n\n        // Re-validate the year parameter after adjustments\n        if (($year < $baseYear) || ($year >= 10000)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year, $month, $day);\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                return (float) $excelDateValue;\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                return (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateValue);\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                return PHPExcel_Shared_Date::ExcelToPHPObject($excelDateValue);\n        }\n    }\n\n\n    /**\n     * TIME\n     *\n     * The TIME function returns a value that represents a particular time.\n     *\n     * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time\n     * format of your regional settings. PHPExcel does not change cell formatting in this way.\n     *\n     * Excel Function:\n     *        TIME(hour,minute,second)\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    integer        $hour        A number from 0 (zero) to 32767 representing the hour.\n     *                                    Any value greater than 23 will be divided by 24 and the remainder\n     *                                    will be treated as the hour value. For example, TIME(27,0,0) =\n     *                                    TIME(3,0,0) = .125 or 3:00 AM.\n     * @param    integer        $minute        A number from 0 to 32767 representing the minute.\n     *                                    Any value greater than 59 will be converted to hours and minutes.\n     *                                    For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.\n     * @param    integer        $second        A number from 0 to 32767 representing the second.\n     *                                    Any value greater than 59 will be converted to hours, minutes,\n     *                                    and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148\n     *                                    or 12:33:20 AM\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function TIME($hour = 0, $minute = 0, $second = 0)\n    {\n        $hour = PHPExcel_Calculation_Functions::flattenSingleValue($hour);\n        $minute = PHPExcel_Calculation_Functions::flattenSingleValue($minute);\n        $second = PHPExcel_Calculation_Functions::flattenSingleValue($second);\n\n        if ($hour == '') {\n            $hour = 0;\n        }\n        if ($minute == '') {\n            $minute = 0;\n        }\n        if ($second == '') {\n            $second = 0;\n        }\n\n        if ((!is_numeric($hour)) || (!is_numeric($minute)) || (!is_numeric($second))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $hour = (integer) $hour;\n        $minute = (integer) $minute;\n        $second = (integer) $second;\n\n        if ($second < 0) {\n            $minute += floor($second / 60);\n            $second = 60 - abs($second % 60);\n            if ($second == 60) {\n                $second = 0;\n            }\n        } elseif ($second >= 60) {\n            $minute += floor($second / 60);\n            $second = $second % 60;\n        }\n        if ($minute < 0) {\n            $hour += floor($minute / 60);\n            $minute = 60 - abs($minute % 60);\n            if ($minute == 60) {\n                $minute = 0;\n            }\n        } elseif ($minute >= 60) {\n            $hour += floor($minute / 60);\n            $minute = $minute % 60;\n        }\n\n        if ($hour > 23) {\n            $hour = $hour % 24;\n        } elseif ($hour < 0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                $date = 0;\n                $calendar = PHPExcel_Shared_Date::getExcelCalendar();\n                if ($calendar != PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900) {\n                    $date = 1;\n                }\n                return (float) PHPExcel_Shared_Date::FormattedPHPToExcel($calendar, 1, $date, $hour, $minute, $second);\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::FormattedPHPToExcel(1970, 1, 1, $hour, $minute, $second));    // -2147468400; //    -2147472000 + 3600\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                $dayAdjust = 0;\n                if ($hour < 0) {\n                    $dayAdjust = floor($hour / 24);\n                    $hour = 24 - abs($hour % 24);\n                    if ($hour == 24) {\n                        $hour = 0;\n                    }\n                } elseif ($hour >= 24) {\n                    $dayAdjust = floor($hour / 24);\n                    $hour = $hour % 24;\n                }\n                $phpDateObject = new DateTime('1900-01-01 '.$hour.':'.$minute.':'.$second);\n                if ($dayAdjust != 0) {\n                    $phpDateObject->modify($dayAdjust.' days');\n                }\n                return $phpDateObject;\n        }\n    }\n\n\n    /**\n     * DATEVALUE\n     *\n     * Returns a value that represents a particular date.\n     * Use DATEVALUE to convert a date represented by a text string to an Excel or PHP date/time stamp\n     * value.\n     *\n     * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date\n     * format of your regional settings. PHPExcel does not change cell formatting in this way.\n     *\n     * Excel Function:\n     *        DATEVALUE(dateValue)\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    string    $dateValue        Text that represents a date in a Microsoft Excel date format.\n     *                                    For example, \"1/30/2008\" or \"30-Jan-2008\" are text strings within\n     *                                    quotation marks that represent dates. Using the default date\n     *                                    system in Excel for Windows, date_text must represent a date from\n     *                                    January 1, 1900, to December 31, 9999. Using the default date\n     *                                    system in Excel for the Macintosh, date_text must represent a date\n     *                                    from January 1, 1904, to December 31, 9999. DATEVALUE returns the\n     *                                    #VALUE! error value if date_text is out of this range.\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function DATEVALUE($dateValue = 1)\n    {\n        $dateValue = trim(PHPExcel_Calculation_Functions::flattenSingleValue($dateValue), '\"');\n        //    Strip any ordinals because they're allowed in Excel (English only)\n        $dateValue = preg_replace('/(\\d)(st|nd|rd|th)([ -\\/])/Ui', '$1$3', $dateValue);\n        //    Convert separators (/ . or space) to hyphens (should also handle dot used for ordinals in some countries, e.g. Denmark, Germany)\n        $dateValue    = str_replace(array('/', '.', '-', '  '), array(' ', ' ', ' ', ' '), $dateValue);\n\n        $yearFound = false;\n        $t1 = explode(' ', $dateValue);\n        foreach ($t1 as &$t) {\n            if ((is_numeric($t)) && ($t > 31)) {\n                if ($yearFound) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                } else {\n                    if ($t < 100) {\n                        $t += 1900;\n                    }\n                    $yearFound = true;\n                }\n            }\n        }\n        if ((count($t1) == 1) && (strpos($t, ':') != false)) {\n            //    We've been fed a time value without any date\n            return 0.0;\n        } elseif (count($t1) == 2) {\n            //    We only have two parts of the date: either day/month or month/year\n            if ($yearFound) {\n                array_unshift($t1, 1);\n            } else {\n                array_push($t1, date('Y'));\n            }\n        }\n        unset($t);\n        $dateValue = implode(' ', $t1);\n\n        $PHPDateArray = date_parse($dateValue);\n        if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) {\n            $testVal1 = strtok($dateValue, '- ');\n            if ($testVal1 !== false) {\n                $testVal2 = strtok('- ');\n                if ($testVal2 !== false) {\n                    $testVal3 = strtok('- ');\n                    if ($testVal3 === false) {\n                        $testVal3 = strftime('%Y');\n                    }\n                } else {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            $PHPDateArray = date_parse($testVal1.'-'.$testVal2.'-'.$testVal3);\n            if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) {\n                $PHPDateArray = date_parse($testVal2.'-'.$testVal1.'-'.$testVal3);\n                if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n            }\n        }\n\n        if (($PHPDateArray !== false) && ($PHPDateArray['error_count'] == 0)) {\n            // Execute function\n            if ($PHPDateArray['year'] == '') {\n                $PHPDateArray['year'] = strftime('%Y');\n            }\n            if ($PHPDateArray['year'] < 1900) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            if ($PHPDateArray['month'] == '') {\n                $PHPDateArray['month'] = strftime('%m');\n            }\n            if ($PHPDateArray['day'] == '') {\n                $PHPDateArray['day'] = strftime('%d');\n            }\n            $excelDateValue = floor(\n                PHPExcel_Shared_Date::FormattedPHPToExcel(\n                    $PHPDateArray['year'],\n                    $PHPDateArray['month'],\n                    $PHPDateArray['day'],\n                    $PHPDateArray['hour'],\n                    $PHPDateArray['minute'],\n                    $PHPDateArray['second']\n                )\n            );\n\n            switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n                case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                    return (float) $excelDateValue;\n                case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                    return (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateValue);\n                case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                    return new DateTime($PHPDateArray['year'].'-'.$PHPDateArray['month'].'-'.$PHPDateArray['day'].' 00:00:00');\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * TIMEVALUE\n     *\n     * Returns a value that represents a particular time.\n     * Use TIMEVALUE to convert a time represented by a text string to an Excel or PHP date/time stamp\n     * value.\n     *\n     * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time\n     * format of your regional settings. PHPExcel does not change cell formatting in this way.\n     *\n     * Excel Function:\n     *        TIMEVALUE(timeValue)\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    string    $timeValue        A text string that represents a time in any one of the Microsoft\n     *                                    Excel time formats; for example, \"6:45 PM\" and \"18:45\" text strings\n     *                                    within quotation marks that represent time.\n     *                                    Date information in time_text is ignored.\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function TIMEVALUE($timeValue)\n    {\n        $timeValue = trim(PHPExcel_Calculation_Functions::flattenSingleValue($timeValue), '\"');\n        $timeValue = str_replace(array('/', '.'), array('-', '-'), $timeValue);\n\n        $PHPDateArray = date_parse($timeValue);\n        if (($PHPDateArray !== false) && ($PHPDateArray['error_count'] == 0)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel(\n                    $PHPDateArray['year'],\n                    $PHPDateArray['month'],\n                    $PHPDateArray['day'],\n                    $PHPDateArray['hour'],\n                    $PHPDateArray['minute'],\n                    $PHPDateArray['second']\n                );\n            } else {\n                $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel(1900, 1, 1, $PHPDateArray['hour'], $PHPDateArray['minute'], $PHPDateArray['second']) - 1;\n            }\n\n            switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n                case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                    return (float) $excelDateValue;\n                case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                    return (integer) $phpDateValue = PHPExcel_Shared_Date::ExcelToPHP($excelDateValue+25569) - 3600;\n                case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                    return new DateTime('1900-01-01 '.$PHPDateArray['hour'].':'.$PHPDateArray['minute'].':'.$PHPDateArray['second']);\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * DATEDIF\n     *\n     * @param    mixed    $startDate        Excel date serial value, PHP date/time stamp, PHP DateTime object\n     *                                    or a standard date string\n     * @param    mixed    $endDate        Excel date serial value, PHP date/time stamp, PHP DateTime object\n     *                                    or a standard date string\n     * @param    string    $unit\n     * @return    integer    Interval between the dates\n     */\n    public static function DATEDIF($startDate = 0, $endDate = 0, $unit = 'D')\n    {\n        $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate);\n        $endDate   = PHPExcel_Calculation_Functions::flattenSingleValue($endDate);\n        $unit      = strtoupper(PHPExcel_Calculation_Functions::flattenSingleValue($unit));\n\n        if (is_string($startDate = self::getDateValue($startDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($endDate = self::getDateValue($endDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Validate parameters\n        if ($startDate >= $endDate) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $difference = $endDate - $startDate;\n\n        $PHPStartDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($startDate);\n        $startDays = $PHPStartDateObject->format('j');\n        $startMonths = $PHPStartDateObject->format('n');\n        $startYears = $PHPStartDateObject->format('Y');\n\n        $PHPEndDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($endDate);\n        $endDays = $PHPEndDateObject->format('j');\n        $endMonths = $PHPEndDateObject->format('n');\n        $endYears = $PHPEndDateObject->format('Y');\n\n        $retVal = PHPExcel_Calculation_Functions::NaN();\n        switch ($unit) {\n            case 'D':\n                $retVal = intval($difference);\n                break;\n            case 'M':\n                $retVal = intval($endMonths - $startMonths) + (intval($endYears - $startYears) * 12);\n                //    We're only interested in full months\n                if ($endDays < $startDays) {\n                    --$retVal;\n                }\n                break;\n            case 'Y':\n                $retVal = intval($endYears - $startYears);\n                //    We're only interested in full months\n                if ($endMonths < $startMonths) {\n                    --$retVal;\n                } elseif (($endMonths == $startMonths) && ($endDays < $startDays)) {\n                    --$retVal;\n                }\n                break;\n            case 'MD':\n                if ($endDays < $startDays) {\n                    $retVal = $endDays;\n                    $PHPEndDateObject->modify('-'.$endDays.' days');\n                    $adjustDays = $PHPEndDateObject->format('j');\n                    if ($adjustDays > $startDays) {\n                        $retVal += ($adjustDays - $startDays);\n                    }\n                } else {\n                    $retVal = $endDays - $startDays;\n                }\n                break;\n            case 'YM':\n                $retVal = intval($endMonths - $startMonths);\n                if ($retVal < 0) {\n                    $retVal += 12;\n                }\n                //    We're only interested in full months\n                if ($endDays < $startDays) {\n                    --$retVal;\n                }\n                break;\n            case 'YD':\n                $retVal = intval($difference);\n                if ($endYears > $startYears) {\n                    while ($endYears > $startYears) {\n                        $PHPEndDateObject->modify('-1 year');\n                        $endYears = $PHPEndDateObject->format('Y');\n                    }\n                    $retVal = $PHPEndDateObject->format('z') - $PHPStartDateObject->format('z');\n                    if ($retVal < 0) {\n                        $retVal += 365;\n                    }\n                }\n                break;\n            default:\n                $retVal = PHPExcel_Calculation_Functions::NaN();\n        }\n        return $retVal;\n    }\n\n\n    /**\n     * DAYS360\n     *\n     * Returns the number of days between two dates based on a 360-day year (twelve 30-day months),\n     * which is used in some accounting calculations. Use this function to help compute payments if\n     * your accounting system is based on twelve 30-day months.\n     *\n     * Excel Function:\n     *        DAYS360(startDate,endDate[,method])\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    mixed        $startDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                        PHP DateTime object, or a standard date string\n     * @param    mixed        $endDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                        PHP DateTime object, or a standard date string\n     * @param    boolean        $method            US or European Method\n     *                                        FALSE or omitted: U.S. (NASD) method. If the starting date is\n     *                                        the last day of a month, it becomes equal to the 30th of the\n     *                                        same month. If the ending date is the last day of a month and\n     *                                        the starting date is earlier than the 30th of a month, the\n     *                                        ending date becomes equal to the 1st of the next month;\n     *                                        otherwise the ending date becomes equal to the 30th of the\n     *                                        same month.\n     *                                        TRUE: European method. Starting dates and ending dates that\n     *                                        occur on the 31st of a month become equal to the 30th of the\n     *                                        same month.\n     * @return    integer        Number of days between start date and end date\n     */\n    public static function DAYS360($startDate = 0, $endDate = 0, $method = false)\n    {\n        $startDate    = PHPExcel_Calculation_Functions::flattenSingleValue($startDate);\n        $endDate    = PHPExcel_Calculation_Functions::flattenSingleValue($endDate);\n\n        if (is_string($startDate = self::getDateValue($startDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($endDate = self::getDateValue($endDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (!is_bool($method)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Execute function\n        $PHPStartDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($startDate);\n        $startDay = $PHPStartDateObject->format('j');\n        $startMonth = $PHPStartDateObject->format('n');\n        $startYear = $PHPStartDateObject->format('Y');\n\n        $PHPEndDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($endDate);\n        $endDay = $PHPEndDateObject->format('j');\n        $endMonth = $PHPEndDateObject->format('n');\n        $endYear = $PHPEndDateObject->format('Y');\n\n        return self::dateDiff360($startDay, $startMonth, $startYear, $endDay, $endMonth, $endYear, !$method);\n    }\n\n\n    /**\n     * YEARFRAC\n     *\n     * Calculates the fraction of the year represented by the number of whole days between two dates\n     * (the start_date and the end_date).\n     * Use the YEARFRAC worksheet function to identify the proportion of a whole year's benefits or\n     * obligations to assign to a specific term.\n     *\n     * Excel Function:\n     *        YEARFRAC(startDate,endDate[,method])\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    mixed    $startDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @param    mixed    $endDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @param    integer    $method            Method used for the calculation\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float    fraction of the year\n     */\n    public static function YEARFRAC($startDate = 0, $endDate = 0, $method = 0)\n    {\n        $startDate    = PHPExcel_Calculation_Functions::flattenSingleValue($startDate);\n        $endDate    = PHPExcel_Calculation_Functions::flattenSingleValue($endDate);\n        $method        = PHPExcel_Calculation_Functions::flattenSingleValue($method);\n\n        if (is_string($startDate = self::getDateValue($startDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($endDate = self::getDateValue($endDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (((is_numeric($method)) && (!is_string($method))) || ($method == '')) {\n            switch ($method) {\n                case 0:\n                    return self::DAYS360($startDate, $endDate) / 360;\n                case 1:\n                    $days = self::DATEDIF($startDate, $endDate);\n                    $startYear = self::YEAR($startDate);\n                    $endYear = self::YEAR($endDate);\n                    $years = $endYear - $startYear + 1;\n                    $leapDays = 0;\n                    if ($years == 1) {\n                        if (self::isLeapYear($endYear)) {\n                            $startMonth = self::MONTHOFYEAR($startDate);\n                            $endMonth = self::MONTHOFYEAR($endDate);\n                            $endDay = self::DAYOFMONTH($endDate);\n                            if (($startMonth < 3) ||\n                                (($endMonth * 100 + $endDay) >= (2 * 100 + 29))) {\n                                 $leapDays += 1;\n                            }\n                        }\n                    } else {\n                        for ($year = $startYear; $year <= $endYear; ++$year) {\n                            if ($year == $startYear) {\n                                $startMonth = self::MONTHOFYEAR($startDate);\n                                $startDay = self::DAYOFMONTH($startDate);\n                                if ($startMonth < 3) {\n                                    $leapDays += (self::isLeapYear($year)) ? 1 : 0;\n                                }\n                            } elseif ($year == $endYear) {\n                                $endMonth = self::MONTHOFYEAR($endDate);\n                                $endDay = self::DAYOFMONTH($endDate);\n                                if (($endMonth * 100 + $endDay) >= (2 * 100 + 29)) {\n                                    $leapDays += (self::isLeapYear($year)) ? 1 : 0;\n                                }\n                            } else {\n                                $leapDays += (self::isLeapYear($year)) ? 1 : 0;\n                            }\n                        }\n                        if ($years == 2) {\n                            if (($leapDays == 0) && (self::isLeapYear($startYear)) && ($days > 365)) {\n                                $leapDays = 1;\n                            } elseif ($days < 366) {\n                                $years = 1;\n                            }\n                        }\n                        $leapDays /= $years;\n                    }\n                    return $days / (365 + $leapDays);\n                case 2:\n                    return self::DATEDIF($startDate, $endDate) / 360;\n                case 3:\n                    return self::DATEDIF($startDate, $endDate) / 365;\n                case 4:\n                    return self::DAYS360($startDate, $endDate, true) / 360;\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * NETWORKDAYS\n     *\n     * Returns the number of whole working days between start_date and end_date. Working days\n     * exclude weekends and any dates identified in holidays.\n     * Use NETWORKDAYS to calculate employee benefits that accrue based on the number of days\n     * worked during a specific term.\n     *\n     * Excel Function:\n     *        NETWORKDAYS(startDate,endDate[,holidays[,holiday[,...]]])\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    mixed            $startDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                            PHP DateTime object, or a standard date string\n     * @param    mixed            $endDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                            PHP DateTime object, or a standard date string\n     * @param    mixed            $holidays,...    Optional series of Excel date serial value (float), PHP date\n     *                                            timestamp (integer), PHP DateTime object, or a standard date\n     *                                            strings that will be excluded from the working calendar, such\n     *                                            as state and federal holidays and floating holidays.\n     * @return    integer            Interval between the dates\n     */\n    public static function NETWORKDAYS($startDate, $endDate)\n    {\n        //    Retrieve the mandatory start and end date that are referenced in the function definition\n        $startDate    = PHPExcel_Calculation_Functions::flattenSingleValue($startDate);\n        $endDate    = PHPExcel_Calculation_Functions::flattenSingleValue($endDate);\n        //    Flush the mandatory start and end date that are referenced in the function definition, and get the optional days\n        $dateArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        array_shift($dateArgs);\n        array_shift($dateArgs);\n\n        //    Validate the start and end dates\n        if (is_string($startDate = $sDate = self::getDateValue($startDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $startDate = (float) floor($startDate);\n        if (is_string($endDate = $eDate = self::getDateValue($endDate))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $endDate = (float) floor($endDate);\n\n        if ($sDate > $eDate) {\n            $startDate = $eDate;\n            $endDate = $sDate;\n        }\n\n        // Execute function\n        $startDoW = 6 - self::DAYOFWEEK($startDate, 2);\n        if ($startDoW < 0) {\n            $startDoW = 0;\n        }\n        $endDoW = self::DAYOFWEEK($endDate, 2);\n        if ($endDoW >= 6) {\n            $endDoW = 0;\n        }\n\n        $wholeWeekDays = floor(($endDate - $startDate) / 7) * 5;\n        $partWeekDays = $endDoW + $startDoW;\n        if ($partWeekDays > 5) {\n            $partWeekDays -= 5;\n        }\n\n        //    Test any extra holiday parameters\n        $holidayCountedArray = array();\n        foreach ($dateArgs as $holidayDate) {\n            if (is_string($holidayDate = self::getDateValue($holidayDate))) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) {\n                if ((self::DAYOFWEEK($holidayDate, 2) < 6) && (!in_array($holidayDate, $holidayCountedArray))) {\n                    --$partWeekDays;\n                    $holidayCountedArray[] = $holidayDate;\n                }\n            }\n        }\n\n        if ($sDate > $eDate) {\n            return 0 - ($wholeWeekDays + $partWeekDays);\n        }\n        return $wholeWeekDays + $partWeekDays;\n    }\n\n\n    /**\n     * WORKDAY\n     *\n     * Returns the date that is the indicated number of working days before or after a date (the\n     * starting date). Working days exclude weekends and any dates identified as holidays.\n     * Use WORKDAY to exclude weekends or holidays when you calculate invoice due dates, expected\n     * delivery times, or the number of days of work performed.\n     *\n     * Excel Function:\n     *        WORKDAY(startDate,endDays[,holidays[,holiday[,...]]])\n     *\n     * @access    public\n     * @category Date/Time Functions\n     * @param    mixed        $startDate        Excel date serial value (float), PHP date timestamp (integer),\n     *                                        PHP DateTime object, or a standard date string\n     * @param    integer        $endDays        The number of nonweekend and nonholiday days before or after\n     *                                        startDate. A positive value for days yields a future date; a\n     *                                        negative value yields a past date.\n     * @param    mixed        $holidays,...    Optional series of Excel date serial value (float), PHP date\n     *                                        timestamp (integer), PHP DateTime object, or a standard date\n     *                                        strings that will be excluded from the working calendar, such\n     *                                        as state and federal holidays and floating holidays.\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function WORKDAY($startDate, $endDays)\n    {\n        //    Retrieve the mandatory start date and days that are referenced in the function definition\n        $startDate    = PHPExcel_Calculation_Functions::flattenSingleValue($startDate);\n        $endDays    = PHPExcel_Calculation_Functions::flattenSingleValue($endDays);\n        //    Flush the mandatory start date and days that are referenced in the function definition, and get the optional days\n        $dateArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        array_shift($dateArgs);\n        array_shift($dateArgs);\n\n        if ((is_string($startDate = self::getDateValue($startDate))) || (!is_numeric($endDays))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $startDate = (float) floor($startDate);\n        $endDays = (int) floor($endDays);\n        //    If endDays is 0, we always return startDate\n        if ($endDays == 0) {\n            return $startDate;\n        }\n\n        $decrementing = ($endDays < 0) ? true : false;\n\n        //    Adjust the start date if it falls over a weekend\n\n        $startDoW = self::DAYOFWEEK($startDate, 3);\n        if (self::DAYOFWEEK($startDate, 3) >= 5) {\n            $startDate += ($decrementing) ? -$startDoW + 4: 7 - $startDoW;\n            ($decrementing) ? $endDays++ : $endDays--;\n        }\n\n        //    Add endDays\n        $endDate = (float) $startDate + (intval($endDays / 5) * 7) + ($endDays % 5);\n\n        //    Adjust the calculated end date if it falls over a weekend\n        $endDoW = self::DAYOFWEEK($endDate, 3);\n        if ($endDoW >= 5) {\n            $endDate += ($decrementing) ? -$endDoW + 4: 7 - $endDoW;\n        }\n\n        //    Test any extra holiday parameters\n        if (!empty($dateArgs)) {\n            $holidayCountedArray = $holidayDates = array();\n            foreach ($dateArgs as $holidayDate) {\n                if (($holidayDate !== null) && (trim($holidayDate) > '')) {\n                    if (is_string($holidayDate = self::getDateValue($holidayDate))) {\n                        return PHPExcel_Calculation_Functions::VALUE();\n                    }\n                    if (self::DAYOFWEEK($holidayDate, 3) < 5) {\n                        $holidayDates[] = $holidayDate;\n                    }\n                }\n            }\n            if ($decrementing) {\n                rsort($holidayDates, SORT_NUMERIC);\n            } else {\n                sort($holidayDates, SORT_NUMERIC);\n            }\n            foreach ($holidayDates as $holidayDate) {\n                if ($decrementing) {\n                    if (($holidayDate <= $startDate) && ($holidayDate >= $endDate)) {\n                        if (!in_array($holidayDate, $holidayCountedArray)) {\n                            --$endDate;\n                            $holidayCountedArray[] = $holidayDate;\n                        }\n                    }\n                } else {\n                    if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) {\n                        if (!in_array($holidayDate, $holidayCountedArray)) {\n                            ++$endDate;\n                            $holidayCountedArray[] = $holidayDate;\n                        }\n                    }\n                }\n                //    Adjust the calculated end date if it falls over a weekend\n                $endDoW = self::DAYOFWEEK($endDate, 3);\n                if ($endDoW >= 5) {\n                    $endDate += ($decrementing) ? -$endDoW + 4 : 7 - $endDoW;\n                }\n            }\n        }\n\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                return (float) $endDate;\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                return (integer) PHPExcel_Shared_Date::ExcelToPHP($endDate);\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                return PHPExcel_Shared_Date::ExcelToPHPObject($endDate);\n        }\n    }\n\n\n    /**\n     * DAYOFMONTH\n     *\n     * Returns the day of the month, for a specified date. The day is given as an integer\n     * ranging from 1 to 31.\n     *\n     * Excel Function:\n     *        DAY(dateValue)\n     *\n     * @param    mixed    $dateValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @return    int        Day of the month\n     */\n    public static function DAYOFMONTH($dateValue = 1)\n    {\n        $dateValue    = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n\n        if ($dateValue === null) {\n            $dateValue = 1;\n        } elseif (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($dateValue == 0.0) {\n            return 0;\n        } elseif ($dateValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue);\n\n        return (int) $PHPDateObject->format('j');\n    }\n\n\n    /**\n     * DAYOFWEEK\n     *\n     * Returns the day of the week for a specified date. The day is given as an integer\n     * ranging from 0 to 7 (dependent on the requested style).\n     *\n     * Excel Function:\n     *        WEEKDAY(dateValue[,style])\n     *\n     * @param    mixed    $dateValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @param    int        $style            A number that determines the type of return value\n     *                                        1 or omitted    Numbers 1 (Sunday) through 7 (Saturday).\n     *                                        2                Numbers 1 (Monday) through 7 (Sunday).\n     *                                        3                Numbers 0 (Monday) through 6 (Sunday).\n     * @return    int        Day of the week value\n     */\n    public static function DAYOFWEEK($dateValue = 1, $style = 1)\n    {\n        $dateValue    = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n        $style        = PHPExcel_Calculation_Functions::flattenSingleValue($style);\n\n        if (!is_numeric($style)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif (($style < 1) || ($style > 3)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $style = floor($style);\n\n        if ($dateValue === null) {\n            $dateValue = 1;\n        } elseif (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($dateValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue);\n        $DoW = $PHPDateObject->format('w');\n\n        $firstDay = 1;\n        switch ($style) {\n            case 1:\n                ++$DoW;\n                break;\n            case 2:\n                if ($DoW == 0) {\n                    $DoW = 7;\n                }\n                break;\n            case 3:\n                if ($DoW == 0) {\n                    $DoW = 7;\n                }\n                $firstDay = 0;\n                --$DoW;\n                break;\n        }\n        if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL) {\n            //    Test for Excel's 1900 leap year, and introduce the error as required\n            if (($PHPDateObject->format('Y') == 1900) && ($PHPDateObject->format('n') <= 2)) {\n                --$DoW;\n                if ($DoW < $firstDay) {\n                    $DoW += 7;\n                }\n            }\n        }\n\n        return (int) $DoW;\n    }\n\n\n    /**\n     * WEEKOFYEAR\n     *\n     * Returns the week of the year for a specified date.\n     * The WEEKNUM function considers the week containing January 1 to be the first week of the year.\n     * However, there is a European standard that defines the first week as the one with the majority\n     * of days (four or more) falling in the new year. This means that for years in which there are\n     * three days or less in the first week of January, the WEEKNUM function returns week numbers\n     * that are incorrect according to the European standard.\n     *\n     * Excel Function:\n     *        WEEKNUM(dateValue[,style])\n     *\n     * @param    mixed    $dateValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @param    boolean    $method            Week begins on Sunday or Monday\n     *                                        1 or omitted    Week begins on Sunday.\n     *                                        2                Week begins on Monday.\n     * @return    int        Week Number\n     */\n    public static function WEEKOFYEAR($dateValue = 1, $method = 1)\n    {\n        $dateValue    = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n        $method        = PHPExcel_Calculation_Functions::flattenSingleValue($method);\n\n        if (!is_numeric($method)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif (($method < 1) || ($method > 2)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $method = floor($method);\n\n        if ($dateValue === null) {\n            $dateValue = 1;\n        } elseif (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($dateValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue);\n        $dayOfYear = $PHPDateObject->format('z');\n        $dow = $PHPDateObject->format('w');\n        $PHPDateObject->modify('-' . $dayOfYear . ' days');\n        $dow = $PHPDateObject->format('w');\n        $daysInFirstWeek = 7 - (($dow + (2 - $method)) % 7);\n        $dayOfYear -= $daysInFirstWeek;\n        $weekOfYear = ceil($dayOfYear / 7) + 1;\n\n        return (int) $weekOfYear;\n    }\n\n\n    /**\n     * MONTHOFYEAR\n     *\n     * Returns the month of a date represented by a serial number.\n     * The month is given as an integer, ranging from 1 (January) to 12 (December).\n     *\n     * Excel Function:\n     *        MONTH(dateValue)\n     *\n     * @param    mixed    $dateValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @return    int        Month of the year\n     */\n    public static function MONTHOFYEAR($dateValue = 1)\n    {\n        $dateValue    = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n\n        if ($dateValue === null) {\n            $dateValue = 1;\n        } elseif (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($dateValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue);\n\n        return (int) $PHPDateObject->format('n');\n    }\n\n\n    /**\n     * YEAR\n     *\n     * Returns the year corresponding to a date.\n     * The year is returned as an integer in the range 1900-9999.\n     *\n     * Excel Function:\n     *        YEAR(dateValue)\n     *\n     * @param    mixed    $dateValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard date string\n     * @return    int        Year\n     */\n    public static function YEAR($dateValue = 1)\n    {\n        $dateValue    = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n\n        if ($dateValue === null) {\n            $dateValue = 1;\n        } elseif (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($dateValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Execute function\n        $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue);\n\n        return (int) $PHPDateObject->format('Y');\n    }\n\n\n    /**\n     * HOUROFDAY\n     *\n     * Returns the hour of a time value.\n     * The hour is given as an integer, ranging from 0 (12:00 A.M.) to 23 (11:00 P.M.).\n     *\n     * Excel Function:\n     *        HOUR(timeValue)\n     *\n     * @param    mixed    $timeValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard time string\n     * @return    int        Hour\n     */\n    public static function HOUROFDAY($timeValue = 0)\n    {\n        $timeValue    = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue);\n\n        if (!is_numeric($timeValue)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                $testVal = strtok($timeValue, '/-: ');\n                if (strlen($testVal) < strlen($timeValue)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n            }\n            $timeValue = self::getTimeValue($timeValue);\n            if (is_string($timeValue)) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        // Execute function\n        if ($timeValue >= 1) {\n            $timeValue = fmod($timeValue, 1);\n        } elseif ($timeValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue);\n\n        return (int) gmdate('G', $timeValue);\n    }\n\n\n    /**\n     * MINUTEOFHOUR\n     *\n     * Returns the minutes of a time value.\n     * The minute is given as an integer, ranging from 0 to 59.\n     *\n     * Excel Function:\n     *        MINUTE(timeValue)\n     *\n     * @param    mixed    $timeValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard time string\n     * @return    int        Minute\n     */\n    public static function MINUTEOFHOUR($timeValue = 0)\n    {\n        $timeValue = $timeTester    = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue);\n\n        if (!is_numeric($timeValue)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                $testVal = strtok($timeValue, '/-: ');\n                if (strlen($testVal) < strlen($timeValue)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n            }\n            $timeValue = self::getTimeValue($timeValue);\n            if (is_string($timeValue)) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        // Execute function\n        if ($timeValue >= 1) {\n            $timeValue = fmod($timeValue, 1);\n        } elseif ($timeValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue);\n\n        return (int) gmdate('i', $timeValue);\n    }\n\n\n    /**\n     * SECONDOFMINUTE\n     *\n     * Returns the seconds of a time value.\n     * The second is given as an integer in the range 0 (zero) to 59.\n     *\n     * Excel Function:\n     *        SECOND(timeValue)\n     *\n     * @param    mixed    $timeValue        Excel date serial value (float), PHP date timestamp (integer),\n     *                                    PHP DateTime object, or a standard time string\n     * @return    int        Second\n     */\n    public static function SECONDOFMINUTE($timeValue = 0)\n    {\n        $timeValue    = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue);\n\n        if (!is_numeric($timeValue)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                $testVal = strtok($timeValue, '/-: ');\n                if (strlen($testVal) < strlen($timeValue)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n            }\n            $timeValue = self::getTimeValue($timeValue);\n            if (is_string($timeValue)) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        // Execute function\n        if ($timeValue >= 1) {\n            $timeValue = fmod($timeValue, 1);\n        } elseif ($timeValue < 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue);\n\n        return (int) gmdate('s', $timeValue);\n    }\n\n\n    /**\n     * EDATE\n     *\n     * Returns the serial number that represents the date that is the indicated number of months\n     * before or after a specified date (the start_date).\n     * Use EDATE to calculate maturity dates or due dates that fall on the same day of the month\n     * as the date of issue.\n     *\n     * Excel Function:\n     *        EDATE(dateValue,adjustmentMonths)\n     *\n     * @param    mixed    $dateValue            Excel date serial value (float), PHP date timestamp (integer),\n     *                                        PHP DateTime object, or a standard date string\n     * @param    int        $adjustmentMonths    The number of months before or after start_date.\n     *                                        A positive value for months yields a future date;\n     *                                        a negative value yields a past date.\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function EDATE($dateValue = 1, $adjustmentMonths = 0)\n    {\n        $dateValue            = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n        $adjustmentMonths    = PHPExcel_Calculation_Functions::flattenSingleValue($adjustmentMonths);\n\n        if (!is_numeric($adjustmentMonths)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $adjustmentMonths = floor($adjustmentMonths);\n\n        if (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Execute function\n        $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths);\n\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                return (float) PHPExcel_Shared_Date::PHPToExcel($PHPDateObject);\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::PHPToExcel($PHPDateObject));\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                return $PHPDateObject;\n        }\n    }\n\n\n    /**\n     * EOMONTH\n     *\n     * Returns the date value for the last day of the month that is the indicated number of months\n     * before or after start_date.\n     * Use EOMONTH to calculate maturity dates or due dates that fall on the last day of the month.\n     *\n     * Excel Function:\n     *        EOMONTH(dateValue,adjustmentMonths)\n     *\n     * @param    mixed    $dateValue            Excel date serial value (float), PHP date timestamp (integer),\n     *                                        PHP DateTime object, or a standard date string\n     * @param    int        $adjustmentMonths    The number of months before or after start_date.\n     *                                        A positive value for months yields a future date;\n     *                                        a negative value yields a past date.\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function EOMONTH($dateValue = 1, $adjustmentMonths = 0)\n    {\n        $dateValue            = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue);\n        $adjustmentMonths    = PHPExcel_Calculation_Functions::flattenSingleValue($adjustmentMonths);\n\n        if (!is_numeric($adjustmentMonths)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $adjustmentMonths = floor($adjustmentMonths);\n\n        if (is_string($dateValue = self::getDateValue($dateValue))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Execute function\n        $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths+1);\n        $adjustDays = (int) $PHPDateObject->format('d');\n        $adjustDaysString = '-' . $adjustDays . ' days';\n        $PHPDateObject->modify($adjustDaysString);\n\n        switch (PHPExcel_Calculation_Functions::getReturnDateType()) {\n            case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL:\n                return (float) PHPExcel_Shared_Date::PHPToExcel($PHPDateObject);\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC:\n                return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::PHPToExcel($PHPDateObject));\n            case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT:\n                return $PHPDateObject;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Engineering.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/** EULER */\ndefine('EULER', 2.71828182845904523536);\n\n/**\n * PHPExcel_Calculation_Engineering\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Engineering\n{\n    /**\n     * Details of the Units of measure that can be used in CONVERTUOM()\n     *\n     * @var mixed[]\n     */\n    private static $conversionUnits = array(\n        'g'     => array('Group' => 'Mass',        'Unit Name' => 'Gram',                     'AllowPrefix' => true),\n        'sg'    => array('Group' => 'Mass',        'Unit Name' => 'Slug',                     'AllowPrefix' => false),\n        'lbm'   => array('Group' => 'Mass',        'Unit Name' => 'Pound mass (avoirdupois)', 'AllowPrefix' => false),\n        'u'     => array('Group' => 'Mass',        'Unit Name' => 'U (atomic mass unit)',     'AllowPrefix' => true),\n        'ozm'   => array('Group' => 'Mass',        'Unit Name' => 'Ounce mass (avoirdupois)', 'AllowPrefix' => false),\n        'm'     => array('Group' => 'Distance',    'Unit Name' => 'Meter',                    'AllowPrefix' => true),\n        'mi'    => array('Group' => 'Distance',    'Unit Name' => 'Statute mile',             'AllowPrefix' => false),\n        'Nmi'   => array('Group' => 'Distance',    'Unit Name' => 'Nautical mile',            'AllowPrefix' => false),\n        'in'    => array('Group' => 'Distance',    'Unit Name' => 'Inch',                     'AllowPrefix' => false),\n        'ft'    => array('Group' => 'Distance',    'Unit Name' => 'Foot',                     'AllowPrefix' => false),\n        'yd'    => array('Group' => 'Distance',    'Unit Name' => 'Yard',                     'AllowPrefix' => false),\n        'ang'   => array('Group' => 'Distance',    'Unit Name' => 'Angstrom',                 'AllowPrefix' => true),\n        'Pica'  => array('Group' => 'Distance',    'Unit Name' => 'Pica (1/72 in)',           'AllowPrefix' => false),\n        'yr'    => array('Group' => 'Time',        'Unit Name' => 'Year',                     'AllowPrefix' => false),\n        'day'   => array('Group' => 'Time',        'Unit Name' => 'Day',                      'AllowPrefix' => false),\n        'hr'    => array('Group' => 'Time',        'Unit Name' => 'Hour',                     'AllowPrefix' => false),\n        'mn'    => array('Group' => 'Time',        'Unit Name' => 'Minute',                   'AllowPrefix' => false),\n        'sec'   => array('Group' => 'Time',        'Unit Name' => 'Second',                   'AllowPrefix' => true),\n        'Pa'    => array('Group' => 'Pressure',    'Unit Name' => 'Pascal',                   'AllowPrefix' => true),\n        'p'     => array('Group' => 'Pressure',    'Unit Name' => 'Pascal',                   'AllowPrefix' => true),\n        'atm'   => array('Group' => 'Pressure',    'Unit Name' => 'Atmosphere',               'AllowPrefix' => true),\n        'at'    => array('Group' => 'Pressure',    'Unit Name' => 'Atmosphere',               'AllowPrefix' => true),\n        'mmHg'  => array('Group' => 'Pressure',    'Unit Name' => 'mm of Mercury',            'AllowPrefix' => true),\n        'N'     => array('Group' => 'Force',       'Unit Name' => 'Newton',                   'AllowPrefix' => true),\n        'dyn'   => array('Group' => 'Force',       'Unit Name' => 'Dyne',                     'AllowPrefix' => true),\n        'dy'    => array('Group' => 'Force',       'Unit Name' => 'Dyne',                     'AllowPrefix' => true),\n        'lbf'   => array('Group' => 'Force',       'Unit Name' => 'Pound force',              'AllowPrefix' => false),\n        'J'     => array('Group' => 'Energy',      'Unit Name' => 'Joule',                    'AllowPrefix' => true),\n        'e'     => array('Group' => 'Energy',      'Unit Name' => 'Erg',                      'AllowPrefix' => true),\n        'c'     => array('Group' => 'Energy',      'Unit Name' => 'Thermodynamic calorie',    'AllowPrefix' => true),\n        'cal'   => array('Group' => 'Energy',      'Unit Name' => 'IT calorie',               'AllowPrefix' => true),\n        'eV'    => array('Group' => 'Energy',      'Unit Name' => 'Electron volt',            'AllowPrefix' => true),\n        'ev'    => array('Group' => 'Energy',      'Unit Name' => 'Electron volt',            'AllowPrefix' => true),\n        'HPh'   => array('Group' => 'Energy',      'Unit Name' => 'Horsepower-hour',          'AllowPrefix' => false),\n        'hh'    => array('Group' => 'Energy',      'Unit Name' => 'Horsepower-hour',          'AllowPrefix' => false),\n        'Wh'    => array('Group' => 'Energy',      'Unit Name' => 'Watt-hour',                'AllowPrefix' => true),\n        'wh'    => array('Group' => 'Energy',      'Unit Name' => 'Watt-hour',                'AllowPrefix' => true),\n        'flb'   => array('Group' => 'Energy',      'Unit Name' => 'Foot-pound',               'AllowPrefix' => false),\n        'BTU'   => array('Group' => 'Energy',      'Unit Name' => 'BTU',                      'AllowPrefix' => false),\n        'btu'   => array('Group' => 'Energy',      'Unit Name' => 'BTU',                      'AllowPrefix' => false),\n        'HP'    => array('Group' => 'Power',       'Unit Name' => 'Horsepower',               'AllowPrefix' => false),\n        'h'     => array('Group' => 'Power',       'Unit Name' => 'Horsepower',               'AllowPrefix' => false),\n        'W'     => array('Group' => 'Power',       'Unit Name' => 'Watt',                     'AllowPrefix' => true),\n        'w'     => array('Group' => 'Power',       'Unit Name' => 'Watt',                     'AllowPrefix' => true),\n        'T'     => array('Group' => 'Magnetism',   'Unit Name' => 'Tesla',                    'AllowPrefix' => true),\n        'ga'    => array('Group' => 'Magnetism',   'Unit Name' => 'Gauss',                    'AllowPrefix' => true),\n        'C'     => array('Group' => 'Temperature', 'Unit Name' => 'Celsius',                  'AllowPrefix' => false),\n        'cel'   => array('Group' => 'Temperature', 'Unit Name' => 'Celsius',                  'AllowPrefix' => false),\n        'F'     => array('Group' => 'Temperature', 'Unit Name' => 'Fahrenheit',               'AllowPrefix' => false),\n        'fah'   => array('Group' => 'Temperature', 'Unit Name' => 'Fahrenheit',               'AllowPrefix' => false),\n        'K'     => array('Group' => 'Temperature', 'Unit Name' => 'Kelvin',                   'AllowPrefix' => false),\n        'kel'   => array('Group' => 'Temperature', 'Unit Name' => 'Kelvin',                   'AllowPrefix' => false),\n        'tsp'   => array('Group' => 'Liquid',      'Unit Name' => 'Teaspoon',                 'AllowPrefix' => false),\n        'tbs'   => array('Group' => 'Liquid',      'Unit Name' => 'Tablespoon',               'AllowPrefix' => false),\n        'oz'    => array('Group' => 'Liquid',      'Unit Name' => 'Fluid Ounce',              'AllowPrefix' => false),\n        'cup'   => array('Group' => 'Liquid',      'Unit Name' => 'Cup',                      'AllowPrefix' => false),\n        'pt'    => array('Group' => 'Liquid',      'Unit Name' => 'U.S. Pint',                'AllowPrefix' => false),\n        'us_pt' => array('Group' => 'Liquid',      'Unit Name' => 'U.S. Pint',                'AllowPrefix' => false),\n        'uk_pt' => array('Group' => 'Liquid',      'Unit Name' => 'U.K. Pint',                'AllowPrefix' => false),\n        'qt'    => array('Group' => 'Liquid',      'Unit Name' => 'Quart',                    'AllowPrefix' => false),\n        'gal'   => array('Group' => 'Liquid',      'Unit Name' => 'Gallon',                   'AllowPrefix' => false),\n        'l'     => array('Group' => 'Liquid',      'Unit Name' => 'Litre',                    'AllowPrefix' => true),\n        'lt'    => array('Group' => 'Liquid',      'Unit Name' => 'Litre',                    'AllowPrefix' => true),\n    );\n\n    /**\n     * Details of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM()\n     *\n     * @var mixed[]\n     */\n    private static $conversionMultipliers = array(\n        'Y' => array('multiplier' => 1E24,  'name' => 'yotta'),\n        'Z' => array('multiplier' => 1E21,  'name' => 'zetta'),\n        'E' => array('multiplier' => 1E18,  'name' => 'exa'),\n        'P' => array('multiplier' => 1E15,  'name' => 'peta'),\n        'T' => array('multiplier' => 1E12,  'name' => 'tera'),\n        'G' => array('multiplier' => 1E9,   'name' => 'giga'),\n        'M' => array('multiplier' => 1E6,   'name' => 'mega'),\n        'k' => array('multiplier' => 1E3,   'name' => 'kilo'),\n        'h' => array('multiplier' => 1E2,   'name' => 'hecto'),\n        'e' => array('multiplier' => 1E1,   'name' => 'deka'),\n        'd' => array('multiplier' => 1E-1,  'name' => 'deci'),\n        'c' => array('multiplier' => 1E-2,  'name' => 'centi'),\n        'm' => array('multiplier' => 1E-3,  'name' => 'milli'),\n        'u' => array('multiplier' => 1E-6,  'name' => 'micro'),\n        'n' => array('multiplier' => 1E-9,  'name' => 'nano'),\n        'p' => array('multiplier' => 1E-12, 'name' => 'pico'),\n        'f' => array('multiplier' => 1E-15, 'name' => 'femto'),\n        'a' => array('multiplier' => 1E-18, 'name' => 'atto'),\n        'z' => array('multiplier' => 1E-21, 'name' => 'zepto'),\n        'y' => array('multiplier' => 1E-24, 'name' => 'yocto'),\n    );\n\n    /**\n     * Details of the Units of measure conversion factors, organised by group\n     *\n     * @var mixed[]\n     */\n    private static $unitConversions = array(\n        'Mass' => array(\n            'g' => array(\n                'g'   => 1.0,\n                'sg'  => 6.85220500053478E-05,\n                'lbm' => 2.20462291469134E-03,\n                'u'   => 6.02217000000000E+23,\n                'ozm' => 3.52739718003627E-02,\n            ),\n            'sg' => array(\n                'g'   => 1.45938424189287E+04,\n                'sg'  => 1.0,\n                'lbm' => 3.21739194101647E+01,\n                'u'   => 8.78866000000000E+27,\n                'ozm' => 5.14782785944229E+02,\n            ),\n            'lbm' => array(\n                'g'   => 4.5359230974881148E+02,\n                'sg'  => 3.10810749306493E-02,\n                'lbm' => 1.0,\n                'u'   => 2.73161000000000E+26,\n                'ozm' => 1.60000023429410E+01,\n            ),\n            'u' => array(\n                'g'   => 1.66053100460465E-24,\n                'sg'  => 1.13782988532950E-28,\n                'lbm' => 3.66084470330684E-27,\n                'u'   => 1.0,\n                'ozm' => 5.85735238300524E-26,\n            ),\n            'ozm' => array(\n                'g'   => 2.83495152079732E+01,\n                'sg'  => 1.94256689870811E-03,\n                'lbm' => 6.24999908478882E-02,\n                'u'   => 1.70725600000000E+25,\n                'ozm' => 1.0,\n            ),\n        ),\n        'Distance' => array(\n            'm' => array(\n                'm'    => 1.0,\n                'mi'   => 6.21371192237334E-04,\n                'Nmi'  => 5.39956803455724E-04,\n                'in'   => 3.93700787401575E+01,\n                'ft'   => 3.28083989501312E+00,\n                'yd'   => 1.09361329797891E+00,\n                'ang'  => 1.00000000000000E+10,\n                'Pica' => 2.83464566929116E+03,\n            ),\n            'mi' => array(\n                'm'    => 1.60934400000000E+03,\n                'mi'   => 1.0,\n                'Nmi'  => 8.68976241900648E-01,\n                'in'   => 6.33600000000000E+04,\n                'ft'   => 5.28000000000000E+03,\n                'yd'   => 1.76000000000000E+03,\n                'ang'  => 1.60934400000000E+13,\n                'Pica' => 4.56191999999971E+06,\n            ),\n            'Nmi' => array(\n                'm'    => 1.85200000000000E+03,\n                'mi'   => 1.15077944802354E+00,\n                'Nmi'  => 1.0,\n                'in'   => 7.29133858267717E+04,\n                'ft'   => 6.07611548556430E+03,\n                'yd'   => 2.02537182785694E+03,\n                'ang'  => 1.85200000000000E+13,\n                'Pica' => 5.24976377952723E+06,\n            ),\n            'in' => array(\n                'm'    => 2.54000000000000E-02,\n                'mi'   => 1.57828282828283E-05,\n                'Nmi'  => 1.37149028077754E-05,\n                'in'   => 1.0,\n                'ft'   => 8.33333333333333E-02,\n                'yd'   => 2.77777777686643E-02,\n                'ang'  => 2.54000000000000E+08,\n                'Pica' => 7.19999999999955E+01,\n            ),\n            'ft' => array(\n                'm'    => 3.04800000000000E-01,\n                'mi'   => 1.89393939393939E-04,\n                'Nmi'  => 1.64578833693305E-04,\n                'in'   => 1.20000000000000E+01,\n                'ft'   => 1.0,\n                'yd'   => 3.33333333223972E-01,\n                'ang'  => 3.04800000000000E+09,\n                'Pica' => 8.63999999999946E+02,\n            ),\n            'yd' => array(\n                'm'    => 9.14400000300000E-01,\n                'mi'   => 5.68181818368230E-04,\n                'Nmi'  => 4.93736501241901E-04,\n                'in'   => 3.60000000118110E+01,\n                'ft'   => 3.00000000000000E+00,\n                'yd'   => 1.0,\n                'ang'  => 9.14400000300000E+09,\n                'Pica' => 2.59200000085023E+03,\n            ),\n            'ang' => array(\n                'm'    => 1.00000000000000E-10,\n                'mi'   => 6.21371192237334E-14,\n                'Nmi'  => 5.39956803455724E-14,\n                'in'   => 3.93700787401575E-09,\n                'ft'   => 3.28083989501312E-10,\n                'yd'   => 1.09361329797891E-10,\n                'ang'  => 1.0,\n                'Pica' => 2.83464566929116E-07,\n            ),\n            'Pica' => array(\n                'm'    => 3.52777777777800E-04,\n                'mi'   => 2.19205948372629E-07,\n                'Nmi'  => 1.90484761219114E-07,\n                'in'   => 1.38888888888898E-02,\n                'ft'   => 1.15740740740748E-03,\n                'yd'   => 3.85802469009251E-04,\n                'ang'  => 3.52777777777800E+06,\n                'Pica' => 1.0,\n            ),\n        ),\n        'Time' => array(\n            'yr' => array(\n                'yr'  => 1.0,\n                'day' => 365.25,\n                'hr'  => 8766.0,\n                'mn'  => 525960.0,\n                'sec' => 31557600.0,\n            ),\n            'day' => array(\n                'yr'  => 2.73785078713210E-03,\n                'day' => 1.0,\n                'hr'  => 24.0,\n                'mn'  => 1440.0,\n                'sec' => 86400.0,\n            ),\n            'hr' => array(\n                'yr'  => 1.14077116130504E-04,\n                'day' => 4.16666666666667E-02,\n                'hr'  => 1.0,\n                'mn'  => 60.0,\n                'sec' => 3600.0,\n            ),\n            'mn' => array(\n                'yr'  => 1.90128526884174E-06,\n                'day' => 6.94444444444444E-04,\n                'hr'  => 1.66666666666667E-02,\n                'mn'  => 1.0,\n                'sec' => 60.0,\n            ),\n            'sec' => array(\n                'yr'  => 3.16880878140289E-08,\n                'day' => 1.15740740740741E-05,\n                'hr'  => 2.77777777777778E-04,\n                'mn'  => 1.66666666666667E-02,\n                'sec' => 1.0,\n            ),\n        ),\n        'Pressure' => array(\n            'Pa' => array(\n                'Pa'   => 1.0,\n                'p'    => 1.0,\n                'atm'  => 9.86923299998193E-06,\n                'at'   => 9.86923299998193E-06,\n                'mmHg' => 7.50061707998627E-03,\n            ),\n            'p' => array(\n                'Pa'   => 1.0,\n                'p'    => 1.0,\n                'atm'  => 9.86923299998193E-06,\n                'at'   => 9.86923299998193E-06,\n                'mmHg' => 7.50061707998627E-03,\n            ),\n            'atm' => array(\n                'Pa'   => 1.01324996583000E+05,\n                'p'    => 1.01324996583000E+05,\n                'atm'  => 1.0,\n                'at'   => 1.0,\n                'mmHg' => 760.0,\n            ),\n            'at' => array(\n                'Pa'   => 1.01324996583000E+05,\n                'p'    => 1.01324996583000E+05,\n                'atm'  => 1.0,\n                'at'   => 1.0,\n                'mmHg' => 760.0,\n            ),\n            'mmHg' => array(\n                'Pa'   => 1.33322363925000E+02,\n                'p'    => 1.33322363925000E+02,\n                'atm'  => 1.31578947368421E-03,\n                'at'   => 1.31578947368421E-03,\n                'mmHg' => 1.0,\n            ),\n        ),\n        'Force' => array(\n            'N' => array(\n                'N'   => 1.0,\n                'dyn' => 1.0E+5,\n                'dy'  => 1.0E+5,\n                'lbf' => 2.24808923655339E-01,\n            ),\n            'dyn' => array(\n                'N'   => 1.0E-5,\n                'dyn' => 1.0,\n                'dy'  => 1.0,\n                'lbf' => 2.24808923655339E-06,\n            ),\n            'dy' => array(\n                'N'   => 1.0E-5,\n                'dyn' => 1.0,\n                'dy'  => 1.0,\n                'lbf' => 2.24808923655339E-06,\n            ),\n            'lbf' => array(\n                'N'   => 4.448222,\n                'dyn' => 4.448222E+5,\n                'dy'  => 4.448222E+5,\n                'lbf' => 1.0,\n            ),\n        ),\n        'Energy' => array(\n            'J' => array(\n                'J'   => 1.0,\n                'e'   => 9.99999519343231E+06,\n                'c'   => 2.39006249473467E-01,\n                'cal' => 2.38846190642017E-01,\n                'eV'  => 6.24145700000000E+18,\n                'ev'  => 6.24145700000000E+18,\n                'HPh' => 3.72506430801000E-07,\n                'hh'  => 3.72506430801000E-07,\n                'Wh'  => 2.77777916238711E-04,\n                'wh'  => 2.77777916238711E-04,\n                'flb' => 2.37304222192651E+01,\n                'BTU' => 9.47815067349015E-04,\n                'btu' => 9.47815067349015E-04,\n            ),\n            'e' => array(\n                'J'   => 1.00000048065700E-07,\n                'e'   => 1.0,\n                'c'   => 2.39006364353494E-08,\n                'cal' => 2.38846305445111E-08,\n                'eV'  => 6.24146000000000E+11,\n                'ev'  => 6.24146000000000E+11,\n                'HPh' => 3.72506609848824E-14,\n                'hh'  => 3.72506609848824E-14,\n                'Wh'  => 2.77778049754611E-11,\n                'wh'  => 2.77778049754611E-11,\n                'flb' => 2.37304336254586E-06,\n                'BTU' => 9.47815522922962E-11,\n                'btu' => 9.47815522922962E-11,\n            ),\n            'c' => array(\n                'J'   => 4.18399101363672E+00,\n                'e'   => 4.18398900257312E+07,\n                'c'   => 1.0,\n                'cal' => 9.99330315287563E-01,\n                'eV'  => 2.61142000000000E+19,\n                'ev'  => 2.61142000000000E+19,\n                'HPh' => 1.55856355899327E-06,\n                'hh'  => 1.55856355899327E-06,\n                'Wh'  => 1.16222030532950E-03,\n                'wh'  => 1.16222030532950E-03,\n                'flb' => 9.92878733152102E+01,\n                'BTU' => 3.96564972437776E-03,\n                'btu' => 3.96564972437776E-03,\n            ),\n            'cal' => array(\n                'J'   => 4.18679484613929E+00,\n                'e'   => 4.18679283372801E+07,\n                'c'   => 1.00067013349059E+00,\n                'cal' => 1.0,\n                'eV'  => 2.61317000000000E+19,\n                'ev'  => 2.61317000000000E+19,\n                'HPh' => 1.55960800463137E-06,\n                'hh'  => 1.55960800463137E-06,\n                'Wh'  => 1.16299914807955E-03,\n                'wh'  => 1.16299914807955E-03,\n                'flb' => 9.93544094443283E+01,\n                'BTU' => 3.96830723907002E-03,\n                'btu' => 3.96830723907002E-03,\n            ),\n            'eV' => array(\n                'J'   => 1.60219000146921E-19,\n                'e'   => 1.60218923136574E-12,\n                'c'   => 3.82933423195043E-20,\n                'cal' => 3.82676978535648E-20,\n                'eV'  => 1.0,\n                'ev'  => 1.0,\n                'HPh' => 5.96826078912344E-26,\n                'hh'  => 5.96826078912344E-26,\n                'Wh'  => 4.45053000026614E-23,\n                'wh'  => 4.45053000026614E-23,\n                'flb' => 3.80206452103492E-18,\n                'BTU' => 1.51857982414846E-22,\n                'btu' => 1.51857982414846E-22,\n            ),\n            'ev' => array(\n                'J'   => 1.60219000146921E-19,\n                'e'   => 1.60218923136574E-12,\n                'c'   => 3.82933423195043E-20,\n                'cal' => 3.82676978535648E-20,\n                'eV'  => 1.0,\n                'ev'  => 1.0,\n                'HPh' => 5.96826078912344E-26,\n                'hh'  => 5.96826078912344E-26,\n                'Wh'  => 4.45053000026614E-23,\n                'wh'  => 4.45053000026614E-23,\n                'flb' => 3.80206452103492E-18,\n                'BTU' => 1.51857982414846E-22,\n                'btu' => 1.51857982414846E-22,\n            ),\n            'HPh' => array(\n                'J'   => 2.68451741316170E+06,\n                'e'   => 2.68451612283024E+13,\n                'c'   => 6.41616438565991E+05,\n                'cal' => 6.41186757845835E+05,\n                'eV'  => 1.67553000000000E+25,\n                'ev'  => 1.67553000000000E+25,\n                'HPh' => 1.0,\n                'hh'  => 1.0,\n                'Wh'  => 7.45699653134593E+02,\n                'wh'  => 7.45699653134593E+02,\n                'flb' => 6.37047316692964E+07,\n                'BTU' => 2.54442605275546E+03,\n                'btu' => 2.54442605275546E+03,\n            ),\n            'hh' => array(\n                'J'   => 2.68451741316170E+06,\n                'e'   => 2.68451612283024E+13,\n                'c'   => 6.41616438565991E+05,\n                'cal' => 6.41186757845835E+05,\n                'eV'  => 1.67553000000000E+25,\n                'ev'  => 1.67553000000000E+25,\n                'HPh' => 1.0,\n                'hh'  => 1.0,\n                'Wh'  => 7.45699653134593E+02,\n                'wh'  => 7.45699653134593E+02,\n                'flb' => 6.37047316692964E+07,\n                'BTU' => 2.54442605275546E+03,\n                'btu' => 2.54442605275546E+03,\n            ),\n            'Wh' => array(\n                'J'   => 3.59999820554720E+03,\n                'e'   => 3.59999647518369E+10,\n                'c'   => 8.60422069219046E+02,\n                'cal' => 8.59845857713046E+02,\n                'eV'  => 2.24692340000000E+22,\n                'ev'  => 2.24692340000000E+22,\n                'HPh' => 1.34102248243839E-03,\n                'hh'  => 1.34102248243839E-03,\n                'Wh'  => 1.0,\n                'wh'  => 1.0,\n                'flb' => 8.54294774062316E+04,\n                'BTU' => 3.41213254164705E+00,\n                'btu' => 3.41213254164705E+00,\n            ),\n            'wh' => array(\n                'J'   => 3.59999820554720E+03,\n                'e'   => 3.59999647518369E+10,\n                'c'   => 8.60422069219046E+02,\n                'cal' => 8.59845857713046E+02,\n                'eV'  => 2.24692340000000E+22,\n                'ev'  => 2.24692340000000E+22,\n                'HPh' => 1.34102248243839E-03,\n                'hh'  => 1.34102248243839E-03,\n                'Wh'  => 1.0,\n                'wh'  => 1.0,\n                'flb' => 8.54294774062316E+04,\n                'BTU' => 3.41213254164705E+00,\n                'btu' => 3.41213254164705E+00,\n            ),\n            'flb' => array(\n                'J'   => 4.21400003236424E-02,\n                'e'   => 4.21399800687660E+05,\n                'c'   => 1.00717234301644E-02,\n                'cal' => 1.00649785509554E-02,\n                'eV'  => 2.63015000000000E+17,\n                'ev'  => 2.63015000000000E+17,\n                'HPh' => 1.56974211145130E-08,\n                'hh'  => 1.56974211145130E-08,\n                'Wh'  => 1.17055614802000E-05,\n                'wh'  => 1.17055614802000E-05,\n                'flb' => 1.0,\n                'BTU' => 3.99409272448406E-05,\n                'btu' => 3.99409272448406E-05,\n            ),\n            'BTU' => array(\n                'J'   => 1.05505813786749E+03,\n                'e'   => 1.05505763074665E+10,\n                'c'   => 2.52165488508168E+02,\n                'cal' => 2.51996617135510E+02,\n                'eV'  => 6.58510000000000E+21,\n                'ev'  => 6.58510000000000E+21,\n                'HPh' => 3.93015941224568E-04,\n                'hh'  => 3.93015941224568E-04,\n                'Wh'  => 2.93071851047526E-01,\n                'wh'  => 2.93071851047526E-01,\n                'flb' => 2.50369750774671E+04,\n                'BTU' => 1.0,\n                'btu' => 1.0,\n            ),\n            'btu' => array(\n                'J'   => 1.05505813786749E+03,\n                'e'   => 1.05505763074665E+10,\n                'c'   => 2.52165488508168E+02,\n                'cal' => 2.51996617135510E+02,\n                'eV'  => 6.58510000000000E+21,\n                'ev'  => 6.58510000000000E+21,\n                'HPh' => 3.93015941224568E-04,\n                'hh'  => 3.93015941224568E-04,\n                'Wh'  => 2.93071851047526E-01,\n                'wh'  => 2.93071851047526E-01,\n                'flb' => 2.50369750774671E+04,\n                'BTU' => 1.0,\n                'btu' => 1.0,\n            ),\n        ),\n        'Power' => array(\n            'HP' => array(\n                'HP' => 1.0,\n                'h'  => 1.0,\n                'W'  => 7.45701000000000E+02,\n                'w'  => 7.45701000000000E+02,\n            ),\n            'h' => array(\n                'HP' => 1.0,\n                'h'  => 1.0,\n                'W'  => 7.45701000000000E+02,\n                'w'  => 7.45701000000000E+02,\n            ),\n            'W' => array(\n                'HP' => 1.34102006031908E-03,\n                'h'  => 1.34102006031908E-03,\n                'W'  => 1.0,\n                'w'  => 1.0,\n            ),\n            'w' => array(\n                'HP' => 1.34102006031908E-03,\n                'h'  => 1.34102006031908E-03,\n                'W'  => 1.0,\n                'w'  => 1.0,\n            ),\n        ),\n        'Magnetism' => array(\n            'T' => array(\n                'T'  => 1.0,\n                'ga' => 10000.0,\n            ),\n            'ga' => array(\n                'T'  => 0.0001,\n                'ga' => 1.0,\n            ),\n        ),\n        'Liquid' => array(\n            'tsp' => array(\n                'tsp'   => 1.0,\n                'tbs'   => 3.33333333333333E-01,\n                'oz'    => 1.66666666666667E-01,\n                'cup'   => 2.08333333333333E-02,\n                'pt'    => 1.04166666666667E-02,\n                'us_pt' => 1.04166666666667E-02,\n                'uk_pt' => 8.67558516821960E-03,\n                'qt'    => 5.20833333333333E-03,\n                'gal'   => 1.30208333333333E-03,\n                'l'     => 4.92999408400710E-03,\n                'lt'    => 4.92999408400710E-03,\n            ),\n            'tbs' => array(\n                'tsp'   => 3.00000000000000E+00,\n                'tbs'   => 1.0,\n                'oz'    => 5.00000000000000E-01,\n                'cup'   => 6.25000000000000E-02,\n                'pt'    => 3.12500000000000E-02,\n                'us_pt' => 3.12500000000000E-02,\n                'uk_pt' => 2.60267555046588E-02,\n                'qt'    => 1.56250000000000E-02,\n                'gal'   => 3.90625000000000E-03,\n                'l'     => 1.47899822520213E-02,\n                'lt'    => 1.47899822520213E-02,\n            ),\n            'oz' => array(\n                'tsp'   => 6.00000000000000E+00,\n                'tbs'   => 2.00000000000000E+00,\n                'oz'    => 1.0,\n                'cup'   => 1.25000000000000E-01,\n                'pt'    => 6.25000000000000E-02,\n                'us_pt' => 6.25000000000000E-02,\n                'uk_pt' => 5.20535110093176E-02,\n                'qt'    => 3.12500000000000E-02,\n                'gal'   => 7.81250000000000E-03,\n                'l'     => 2.95799645040426E-02,\n                'lt'    => 2.95799645040426E-02,\n            ),\n            'cup' => array(\n                'tsp'   => 4.80000000000000E+01,\n                'tbs'   => 1.60000000000000E+01,\n                'oz'    => 8.00000000000000E+00,\n                'cup'   => 1.0,\n                'pt'    => 5.00000000000000E-01,\n                'us_pt' => 5.00000000000000E-01,\n                'uk_pt' => 4.16428088074541E-01,\n                'qt'    => 2.50000000000000E-01,\n                'gal'   => 6.25000000000000E-02,\n                'l'     => 2.36639716032341E-01,\n                'lt'    => 2.36639716032341E-01,\n            ),\n            'pt' => array(\n                'tsp'   => 9.60000000000000E+01,\n                'tbs'   => 3.20000000000000E+01,\n                'oz'    => 1.60000000000000E+01,\n                'cup'   => 2.00000000000000E+00,\n                'pt'    => 1.0,\n                'us_pt' => 1.0,\n                'uk_pt' => 8.32856176149081E-01,\n                'qt'    => 5.00000000000000E-01,\n                'gal'   => 1.25000000000000E-01,\n                'l'     => 4.73279432064682E-01,\n                'lt'    => 4.73279432064682E-01,\n            ),\n            'us_pt' => array(\n                'tsp'   => 9.60000000000000E+01,\n                'tbs'   => 3.20000000000000E+01,\n                'oz'    => 1.60000000000000E+01,\n                'cup'   => 2.00000000000000E+00,\n                'pt'    => 1.0,\n                'us_pt' => 1.0,\n                'uk_pt' => 8.32856176149081E-01,\n                'qt'    => 5.00000000000000E-01,\n                'gal'   => 1.25000000000000E-01,\n                'l'     => 4.73279432064682E-01,\n                'lt'    => 4.73279432064682E-01,\n            ),\n            'uk_pt' => array(\n                'tsp'   => 1.15266000000000E+02,\n                'tbs'   => 3.84220000000000E+01,\n                'oz'    => 1.92110000000000E+01,\n                'cup'   => 2.40137500000000E+00,\n                'pt'    => 1.20068750000000E+00,\n                'us_pt' => 1.20068750000000E+00,\n                'uk_pt' => 1.0,\n                'qt'    => 6.00343750000000E-01,\n                'gal'   => 1.50085937500000E-01,\n                'l'     => 5.68260698087162E-01,\n                'lt'    => 5.68260698087162E-01,\n            ),\n            'qt' => array(\n                'tsp'   => 1.92000000000000E+02,\n                'tbs'   => 6.40000000000000E+01,\n                'oz'    => 3.20000000000000E+01,\n                'cup'   => 4.00000000000000E+00,\n                'pt'    => 2.00000000000000E+00,\n                'us_pt' => 2.00000000000000E+00,\n                'uk_pt' => 1.66571235229816E+00,\n                'qt'    => 1.0,\n                'gal'   => 2.50000000000000E-01,\n                'l'     => 9.46558864129363E-01,\n                'lt'    => 9.46558864129363E-01,\n            ),\n            'gal' => array(\n                'tsp'   => 7.68000000000000E+02,\n                'tbs'   => 2.56000000000000E+02,\n                'oz'    => 1.28000000000000E+02,\n                'cup'   => 1.60000000000000E+01,\n                'pt'    => 8.00000000000000E+00,\n                'us_pt' => 8.00000000000000E+00,\n                'uk_pt' => 6.66284940919265E+00,\n                'qt'    => 4.00000000000000E+00,\n                'gal'   => 1.0,\n                'l'     => 3.78623545651745E+00,\n                'lt'    => 3.78623545651745E+00,\n            ),\n            'l' => array(\n                'tsp'   => 2.02840000000000E+02,\n                'tbs'   => 6.76133333333333E+01,\n                'oz'    => 3.38066666666667E+01,\n                'cup'   => 4.22583333333333E+00,\n                'pt'    => 2.11291666666667E+00,\n                'us_pt' => 2.11291666666667E+00,\n                'uk_pt' => 1.75975569552166E+00,\n                'qt'    => 1.05645833333333E+00,\n                'gal'   => 2.64114583333333E-01,\n                'l'     => 1.0,\n                'lt'    => 1.0,\n            ),\n            'lt' => array(\n                'tsp'   => 2.02840000000000E+02,\n                'tbs'   => 6.76133333333333E+01,\n                'oz'    => 3.38066666666667E+01,\n                'cup'   => 4.22583333333333E+00,\n                'pt'    => 2.11291666666667E+00,\n                'us_pt' => 2.11291666666667E+00,\n                'uk_pt' => 1.75975569552166E+00,\n                'qt'    => 1.05645833333333E+00,\n                'gal'   => 2.64114583333333E-01,\n                'l'     => 1.0,\n                'lt'    => 1.0,\n            ),\n        ),\n    );\n\n\n    /**\n     * parseComplex\n     *\n     * Parses a complex number into its real and imaginary parts, and an I or J suffix\n     *\n     * @param    string        $complexNumber    The complex number\n     * @return    string[]    Indexed on \"real\", \"imaginary\" and \"suffix\"\n     */\n    public static function parseComplex($complexNumber)\n    {\n        $workString = (string) $complexNumber;\n\n        $realNumber = $imaginary = 0;\n        //    Extract the suffix, if there is one\n        $suffix = substr($workString, -1);\n        if (!is_numeric($suffix)) {\n            $workString = substr($workString, 0, -1);\n        } else {\n            $suffix = '';\n        }\n\n        //    Split the input into its Real and Imaginary components\n        $leadingSign = 0;\n        if (strlen($workString) > 0) {\n            $leadingSign = (($workString{0} == '+') || ($workString{0} == '-')) ? 1 : 0;\n        }\n        $power = '';\n        $realNumber = strtok($workString, '+-');\n        if (strtoupper(substr($realNumber, -1)) == 'E') {\n            $power = strtok('+-');\n            ++$leadingSign;\n        }\n\n        $realNumber = substr($workString, 0, strlen($realNumber)+strlen($power)+$leadingSign);\n\n        if ($suffix != '') {\n            $imaginary = substr($workString, strlen($realNumber));\n\n            if (($imaginary == '') && (($realNumber == '') || ($realNumber == '+') || ($realNumber == '-'))) {\n                $imaginary = $realNumber.'1';\n                $realNumber = '0';\n            } elseif ($imaginary == '') {\n                $imaginary = $realNumber;\n                $realNumber = '0';\n            } elseif (($imaginary == '+') || ($imaginary == '-')) {\n                $imaginary .= '1';\n            }\n        }\n\n        return array(\n            'real'   => $realNumber,\n            'imaginary' => $imaginary,\n            'suffix' => $suffix\n        );\n    }\n\n\n    /**\n     * Cleans the leading characters in a complex number string\n     *\n     * @param    string        $complexNumber    The complex number to clean\n     * @return    string        The \"cleaned\" complex number\n     */\n    private static function cleanComplex($complexNumber)\n    {\n        if ($complexNumber{0} == '+') {\n            $complexNumber = substr($complexNumber, 1);\n        }\n        if ($complexNumber{0} == '0') {\n            $complexNumber = substr($complexNumber, 1);\n        }\n        if ($complexNumber{0} == '.') {\n            $complexNumber = '0'.$complexNumber;\n        }\n        if ($complexNumber{0} == '+') {\n            $complexNumber = substr($complexNumber, 1);\n        }\n        return $complexNumber;\n    }\n\n    /**\n     * Formats a number base string value with leading zeroes\n     *\n     * @param    string        $xVal        The \"number\" to pad\n     * @param    integer        $places        The length that we want to pad this value\n     * @return    string        The padded \"number\"\n     */\n    private static function nbrConversionFormat($xVal, $places)\n    {\n        if (!is_null($places)) {\n            if (strlen($xVal) <= $places) {\n                return substr(str_pad($xVal, $places, '0', STR_PAD_LEFT), -10);\n            } else {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n        }\n\n        return substr($xVal, -10);\n    }\n\n    /**\n     *    BESSELI\n     *\n     *    Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated\n     *        for purely imaginary arguments\n     *\n     *    Excel Function:\n     *        BESSELI(x,ord)\n     *\n     *    @access    public\n     *    @category Engineering Functions\n     *    @param    float        $x        The value at which to evaluate the function.\n     *                                If x is nonnumeric, BESSELI returns the #VALUE! error value.\n     *    @param    integer        $ord    The order of the Bessel function.\n     *                                If ord is not an integer, it is truncated.\n     *                                If $ord is nonnumeric, BESSELI returns the #VALUE! error value.\n     *                                If $ord < 0, BESSELI returns the #NUM! error value.\n     *    @return    float\n     *\n     */\n    public static function BESSELI($x, $ord)\n    {\n        $x    = (is_null($x))    ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $ord    = (is_null($ord))    ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($ord);\n\n        if ((is_numeric($x)) && (is_numeric($ord))) {\n            $ord    = floor($ord);\n            if ($ord < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            if (abs($x) <= 30) {\n                $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord);\n                $ordK = 1;\n                $fSqrX = ($x * $x) / 4;\n                do {\n                    $fTerm *= $fSqrX;\n                    $fTerm /= ($ordK * ($ordK + $ord));\n                    $fResult += $fTerm;\n                } while ((abs($fTerm) > 1e-12) && (++$ordK < 100));\n            } else {\n                $f_2_PI = 2 * M_PI;\n\n                $fXAbs = abs($x);\n                $fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs);\n                if (($ord & 1) && ($x < 0)) {\n                    $fResult = -$fResult;\n                }\n            }\n            return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     *    BESSELJ\n     *\n     *    Returns the Bessel function\n     *\n     *    Excel Function:\n     *        BESSELJ(x,ord)\n     *\n     *    @access    public\n     *    @category Engineering Functions\n     *    @param    float        $x        The value at which to evaluate the function.\n     *                                If x is nonnumeric, BESSELJ returns the #VALUE! error value.\n     *    @param    integer        $ord    The order of the Bessel function. If n is not an integer, it is truncated.\n     *                                If $ord is nonnumeric, BESSELJ returns the #VALUE! error value.\n     *                                If $ord < 0, BESSELJ returns the #NUM! error value.\n     *    @return    float\n     *\n     */\n    public static function BESSELJ($x, $ord)\n    {\n        $x    = (is_null($x))    ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $ord    = (is_null($ord))    ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($ord);\n\n        if ((is_numeric($x)) && (is_numeric($ord))) {\n            $ord    = floor($ord);\n            if ($ord < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            $fResult = 0;\n            if (abs($x) <= 30) {\n                $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord);\n                $ordK = 1;\n                $fSqrX = ($x * $x) / -4;\n                do {\n                    $fTerm *= $fSqrX;\n                    $fTerm /= ($ordK * ($ordK + $ord));\n                    $fResult += $fTerm;\n                } while ((abs($fTerm) > 1e-12) && (++$ordK < 100));\n            } else {\n                $f_PI_DIV_2 = M_PI / 2;\n                $f_PI_DIV_4 = M_PI / 4;\n\n                $fXAbs = abs($x);\n                $fResult = sqrt(M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4);\n                if (($ord & 1) && ($x < 0)) {\n                    $fResult = -$fResult;\n                }\n            }\n            return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    private static function besselK0($fNum)\n    {\n        if ($fNum <= 2) {\n            $fNum2 = $fNum * 0.5;\n            $y = ($fNum2 * $fNum2);\n            $fRet = -log($fNum2) * self::BESSELI($fNum, 0) +\n                (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y *\n                (0.10750e-3 + $y * 0.74e-5))))));\n        } else {\n            $y = 2 / $fNum;\n            $fRet = exp(-$fNum) / sqrt($fNum) *\n                (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y *\n                (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3))))));\n        }\n        return $fRet;\n    }\n\n\n    private static function besselK1($fNum)\n    {\n        if ($fNum <= 2) {\n            $fNum2 = $fNum * 0.5;\n            $y = ($fNum2 * $fNum2);\n            $fRet = log($fNum2) * self::BESSELI($fNum, 1) +\n                (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y *\n                (-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum;\n        } else {\n            $y = 2 / $fNum;\n            $fRet = exp(-$fNum) / sqrt($fNum) *\n                (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y *\n                (0.325614e-2 + $y * (-0.68245e-3)))))));\n        }\n        return $fRet;\n    }\n\n\n    /**\n     *    BESSELK\n     *\n     *    Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated\n     *        for purely imaginary arguments.\n     *\n     *    Excel Function:\n     *        BESSELK(x,ord)\n     *\n     *    @access    public\n     *    @category Engineering Functions\n     *    @param    float        $x        The value at which to evaluate the function.\n     *                                If x is nonnumeric, BESSELK returns the #VALUE! error value.\n     *    @param    integer        $ord    The order of the Bessel function. If n is not an integer, it is truncated.\n     *                                If $ord is nonnumeric, BESSELK returns the #VALUE! error value.\n     *                                If $ord < 0, BESSELK returns the #NUM! error value.\n     *    @return    float\n     *\n     */\n    public static function BESSELK($x, $ord)\n    {\n        $x        = (is_null($x))        ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $ord    = (is_null($ord))    ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($ord);\n\n        if ((is_numeric($x)) && (is_numeric($ord))) {\n            if (($ord < 0) || ($x == 0.0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            switch (floor($ord)) {\n                case 0:\n                    return self::besselK0($x);\n                case 1:\n                    return self::besselK1($x);\n                default:\n                    $fTox    = 2 / $x;\n                    $fBkm    = self::besselK0($x);\n                    $fBk    = self::besselK1($x);\n                    for ($n = 1; $n < $ord; ++$n) {\n                        $fBkp    = $fBkm + $n * $fTox * $fBk;\n                        $fBkm    = $fBk;\n                        $fBk    = $fBkp;\n                    }\n            }\n            return (is_nan($fBk)) ? PHPExcel_Calculation_Functions::NaN() : $fBk;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    private static function besselY0($fNum)\n    {\n        if ($fNum < 8.0) {\n            $y = ($fNum * $fNum);\n            $f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733))));\n            $f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y))));\n            $fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum);\n        } else {\n            $z = 8.0 / $fNum;\n            $y = ($z * $z);\n            $xx = $fNum - 0.785398164;\n            $f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6)));\n            $f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7))));\n            $fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2);\n        }\n        return $fRet;\n    }\n\n\n    private static function besselY1($fNum)\n    {\n        if ($fNum < 8.0) {\n            $y = ($fNum * $fNum);\n            $f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y *\n                (-0.4237922726e7 + $y * 0.8511937935e4)))));\n            $f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y *\n                (0.1020426050e6 + $y * (0.3549632885e3 + $y)))));\n            $fRet = $f1 / $f2 + 0.636619772 * ( self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum);\n        } else {\n            $fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491);\n        }\n        return $fRet;\n    }\n\n\n    /**\n     *    BESSELY\n     *\n     *    Returns the Bessel function, which is also called the Weber function or the Neumann function.\n     *\n     *    Excel Function:\n     *        BESSELY(x,ord)\n     *\n     *    @access    public\n     *    @category Engineering Functions\n     *    @param    float        $x        The value at which to evaluate the function.\n     *                                If x is nonnumeric, BESSELK returns the #VALUE! error value.\n     *    @param    integer        $ord    The order of the Bessel function. If n is not an integer, it is truncated.\n     *                                If $ord is nonnumeric, BESSELK returns the #VALUE! error value.\n     *                                If $ord < 0, BESSELK returns the #NUM! error value.\n     *\n     *    @return    float\n     */\n    public static function BESSELY($x, $ord)\n    {\n        $x        = (is_null($x))        ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $ord    = (is_null($ord))    ? 0.0 :    PHPExcel_Calculation_Functions::flattenSingleValue($ord);\n\n        if ((is_numeric($x)) && (is_numeric($ord))) {\n            if (($ord < 0) || ($x == 0.0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            switch (floor($ord)) {\n                case 0:\n                    return self::besselY0($x);\n                case 1:\n                    return self::besselY1($x);\n                default:\n                    $fTox    = 2 / $x;\n                    $fBym    = self::besselY0($x);\n                    $fBy    = self::besselY1($x);\n                    for ($n = 1; $n < $ord; ++$n) {\n                        $fByp    = $n * $fTox * $fBy - $fBym;\n                        $fBym    = $fBy;\n                        $fBy    = $fByp;\n                    }\n            }\n            return (is_nan($fBy)) ? PHPExcel_Calculation_Functions::NaN() : $fBy;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * BINTODEC\n     *\n     * Return a binary value as decimal.\n     *\n     * Excel Function:\n     *        BIN2DEC(x)\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The binary number (as a string) that you want to convert. The number\n     *                                cannot contain more than 10 characters (10 bits). The most significant\n     *                                bit of number is the sign bit. The remaining 9 bits are magnitude bits.\n     *                                Negative numbers are represented using two's-complement notation.\n     *                                If number is not a valid binary number, or if number contains more than\n     *                                10 characters (10 bits), BIN2DEC returns the #NUM! error value.\n     * @return    string\n     */\n    public static function BINTODEC($x)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n\n        if (is_bool($x)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $x = (int) $x;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n            $x = floor($x);\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[01]/', $x, $out)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if (strlen($x) > 10) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif (strlen($x) == 10) {\n            //    Two's Complement\n            $x = substr($x, -9);\n            return '-'.(512-bindec($x));\n        }\n        return bindec($x);\n    }\n\n\n    /**\n     * BINTOHEX\n     *\n     * Return a binary value as hex.\n     *\n     * Excel Function:\n     *        BIN2HEX(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The binary number (as a string) that you want to convert. The number\n     *                                cannot contain more than 10 characters (10 bits). The most significant\n     *                                bit of number is the sign bit. The remaining 9 bits are magnitude bits.\n     *                                Negative numbers are represented using two's-complement notation.\n     *                                If number is not a valid binary number, or if number contains more than\n     *                                10 characters (10 bits), BIN2HEX returns the #NUM! error value.\n     * @param    integer        $places    The number of characters to use. If places is omitted, BIN2HEX uses the\n     *                                minimum number of characters necessary. Places is useful for padding the\n     *                                return value with leading 0s (zeros).\n     *                                If places is not an integer, it is truncated.\n     *                                If places is nonnumeric, BIN2HEX returns the #VALUE! error value.\n     *                                If places is negative, BIN2HEX returns the #NUM! error value.\n     * @return    string\n     */\n    public static function BINTOHEX($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $x = (int) $x;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n            $x = floor($x);\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[01]/', $x, $out)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if (strlen($x) > 10) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif (strlen($x) == 10) {\n            //    Two's Complement\n            return str_repeat('F', 8).substr(strtoupper(dechex(bindec(substr($x, -9)))), -2);\n        }\n        $hexVal = (string) strtoupper(dechex(bindec($x)));\n\n        return self::nbrConversionFormat($hexVal, $places);\n    }\n\n\n    /**\n     * BINTOOCT\n     *\n     * Return a binary value as octal.\n     *\n     * Excel Function:\n     *        BIN2OCT(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The binary number (as a string) that you want to convert. The number\n     *                                cannot contain more than 10 characters (10 bits). The most significant\n     *                                bit of number is the sign bit. The remaining 9 bits are magnitude bits.\n     *                                Negative numbers are represented using two's-complement notation.\n     *                                If number is not a valid binary number, or if number contains more than\n     *                                10 characters (10 bits), BIN2OCT returns the #NUM! error value.\n     * @param    integer        $places    The number of characters to use. If places is omitted, BIN2OCT uses the\n     *                                minimum number of characters necessary. Places is useful for padding the\n     *                                return value with leading 0s (zeros).\n     *                                If places is not an integer, it is truncated.\n     *                                If places is nonnumeric, BIN2OCT returns the #VALUE! error value.\n     *                                If places is negative, BIN2OCT returns the #NUM! error value.\n     * @return    string\n     */\n    public static function BINTOOCT($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $x = (int) $x;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n            $x = floor($x);\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[01]/', $x, $out)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if (strlen($x) > 10) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif (strlen($x) == 10) {\n            //    Two's Complement\n            return str_repeat('7', 7).substr(strtoupper(decoct(bindec(substr($x, -9)))), -3);\n        }\n        $octVal = (string) decoct(bindec($x));\n\n        return self::nbrConversionFormat($octVal, $places);\n    }\n\n\n    /**\n     * DECTOBIN\n     *\n     * Return a decimal value as binary.\n     *\n     * Excel Function:\n     *        DEC2BIN(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The decimal integer you want to convert. If number is negative,\n     *                                valid place values are ignored and DEC2BIN returns a 10-character\n     *                                (10-bit) binary number in which the most significant bit is the sign\n     *                                bit. The remaining 9 bits are magnitude bits. Negative numbers are\n     *                                represented using two's-complement notation.\n     *                                If number < -512 or if number > 511, DEC2BIN returns the #NUM! error\n     *                                value.\n     *                                If number is nonnumeric, DEC2BIN returns the #VALUE! error value.\n     *                                If DEC2BIN requires more than places characters, it returns the #NUM!\n     *                                error value.\n     * @param    integer        $places    The number of characters to use. If places is omitted, DEC2BIN uses\n     *                                the minimum number of characters necessary. Places is useful for\n     *                                padding the return value with leading 0s (zeros).\n     *                                If places is not an integer, it is truncated.\n     *                                If places is nonnumeric, DEC2BIN returns the #VALUE! error value.\n     *                                If places is zero or negative, DEC2BIN returns the #NUM! error value.\n     * @return    string\n     */\n    public static function DECTOBIN($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $x = (int) $x;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) floor($x);\n        $r = decbin($x);\n        if (strlen($r) == 32) {\n            //    Two's Complement\n            $r = substr($r, -10);\n        } elseif (strlen($r) > 11) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        return self::nbrConversionFormat($r, $places);\n    }\n\n\n    /**\n     * DECTOHEX\n     *\n     * Return a decimal value as hex.\n     *\n     * Excel Function:\n     *        DEC2HEX(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The decimal integer you want to convert. If number is negative,\n     *                                places is ignored and DEC2HEX returns a 10-character (40-bit)\n     *                                hexadecimal number in which the most significant bit is the sign\n     *                                bit. The remaining 39 bits are magnitude bits. Negative numbers\n     *                                are represented using two's-complement notation.\n     *                                If number < -549,755,813,888 or if number > 549,755,813,887,\n     *                                DEC2HEX returns the #NUM! error value.\n     *                                If number is nonnumeric, DEC2HEX returns the #VALUE! error value.\n     *                                If DEC2HEX requires more than places characters, it returns the\n     *                                #NUM! error value.\n     * @param    integer        $places    The number of characters to use. If places is omitted, DEC2HEX uses\n     *                                the minimum number of characters necessary. Places is useful for\n     *                                padding the return value with leading 0s (zeros).\n     *                                If places is not an integer, it is truncated.\n     *                                If places is nonnumeric, DEC2HEX returns the #VALUE! error value.\n     *                                If places is zero or negative, DEC2HEX returns the #NUM! error value.\n     * @return    string\n     */\n    public static function DECTOHEX($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $x = (int) $x;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) floor($x);\n        $r = strtoupper(dechex($x));\n        if (strlen($r) == 8) {\n            //    Two's Complement\n            $r = 'FF'.$r;\n        }\n\n        return self::nbrConversionFormat($r, $places);\n    }\n\n\n    /**\n     * DECTOOCT\n     *\n     * Return an decimal value as octal.\n     *\n     * Excel Function:\n     *        DEC2OCT(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The decimal integer you want to convert. If number is negative,\n     *                                places is ignored and DEC2OCT returns a 10-character (30-bit)\n     *                                octal number in which the most significant bit is the sign bit.\n     *                                The remaining 29 bits are magnitude bits. Negative numbers are\n     *                                represented using two's-complement notation.\n     *                                If number < -536,870,912 or if number > 536,870,911, DEC2OCT\n     *                                returns the #NUM! error value.\n     *                                If number is nonnumeric, DEC2OCT returns the #VALUE! error value.\n     *                                If DEC2OCT requires more than places characters, it returns the\n     *                                #NUM! error value.\n     * @param    integer        $places    The number of characters to use. If places is omitted, DEC2OCT uses\n     *                                the minimum number of characters necessary. Places is useful for\n     *                                padding the return value with leading 0s (zeros).\n     *                                If places is not an integer, it is truncated.\n     *                                If places is nonnumeric, DEC2OCT returns the #VALUE! error value.\n     *                                If places is zero or negative, DEC2OCT returns the #NUM! error value.\n     * @return    string\n     */\n    public static function DECTOOCT($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $x = (int) $x;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) floor($x);\n        $r = decoct($x);\n        if (strlen($r) == 11) {\n            //    Two's Complement\n            $r = substr($r, -10);\n        }\n\n        return self::nbrConversionFormat($r, $places);\n    }\n\n\n    /**\n     * HEXTOBIN\n     *\n     * Return a hex value as binary.\n     *\n     * Excel Function:\n     *        HEX2BIN(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x            the hexadecimal number you want to convert. Number cannot\n     *                                    contain more than 10 characters. The most significant bit of\n     *                                    number is the sign bit (40th bit from the right). The remaining\n     *                                    9 bits are magnitude bits. Negative numbers are represented\n     *                                    using two's-complement notation.\n     *                                    If number is negative, HEX2BIN ignores places and returns a\n     *                                    10-character binary number.\n     *                                    If number is negative, it cannot be less than FFFFFFFE00, and\n     *                                    if number is positive, it cannot be greater than 1FF.\n     *                                    If number is not a valid hexadecimal number, HEX2BIN returns\n     *                                    the #NUM! error value.\n     *                                    If HEX2BIN requires more than places characters, it returns\n     *                                    the #NUM! error value.\n     * @param    integer        $places        The number of characters to use. If places is omitted,\n     *                                    HEX2BIN uses the minimum number of characters necessary. Places\n     *                                    is useful for padding the return value with leading 0s (zeros).\n     *                                    If places is not an integer, it is truncated.\n     *                                    If places is nonnumeric, HEX2BIN returns the #VALUE! error value.\n     *                                    If places is negative, HEX2BIN returns the #NUM! error value.\n     * @return    string\n     */\n    public static function HEXTOBIN($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $binVal = decbin(hexdec($x));\n\n        return substr(self::nbrConversionFormat($binVal, $places), -10);\n    }\n\n\n    /**\n     * HEXTODEC\n     *\n     * Return a hex value as decimal.\n     *\n     * Excel Function:\n     *        HEX2DEC(x)\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The hexadecimal number you want to convert. This number cannot\n     *                                contain more than 10 characters (40 bits). The most significant\n     *                                bit of number is the sign bit. The remaining 39 bits are magnitude\n     *                                bits. Negative numbers are represented using two's-complement\n     *                                notation.\n     *                                If number is not a valid hexadecimal number, HEX2DEC returns the\n     *                                #NUM! error value.\n     * @return    string\n     */\n    public static function HEXTODEC($x)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n\n        if (is_bool($x)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return hexdec($x);\n    }\n\n\n    /**\n     * HEXTOOCT\n     *\n     * Return a hex value as octal.\n     *\n     * Excel Function:\n     *        HEX2OCT(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x            The hexadecimal number you want to convert. Number cannot\n     *                                    contain more than 10 characters. The most significant bit of\n     *                                    number is the sign bit. The remaining 39 bits are magnitude\n     *                                    bits. Negative numbers are represented using two's-complement\n     *                                    notation.\n     *                                    If number is negative, HEX2OCT ignores places and returns a\n     *                                    10-character octal number.\n     *                                    If number is negative, it cannot be less than FFE0000000, and\n     *                                    if number is positive, it cannot be greater than 1FFFFFFF.\n     *                                    If number is not a valid hexadecimal number, HEX2OCT returns\n     *                                    the #NUM! error value.\n     *                                    If HEX2OCT requires more than places characters, it returns\n     *                                    the #NUM! error value.\n     * @param    integer        $places        The number of characters to use. If places is omitted, HEX2OCT\n     *                                    uses the minimum number of characters necessary. Places is\n     *                                    useful for padding the return value with leading 0s (zeros).\n     *                                    If places is not an integer, it is truncated.\n     *                                    If places is nonnumeric, HEX2OCT returns the #VALUE! error\n     *                                    value.\n     *                                    If places is negative, HEX2OCT returns the #NUM! error value.\n     * @return    string\n     */\n    public static function HEXTOOCT($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) $x;\n        if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $octVal = decoct(hexdec($x));\n\n        return self::nbrConversionFormat($octVal, $places);\n    }    //    function HEXTOOCT()\n\n\n    /**\n     * OCTTOBIN\n     *\n     * Return an octal value as binary.\n     *\n     * Excel Function:\n     *        OCT2BIN(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x            The octal number you want to convert. Number may not\n     *                                    contain more than 10 characters. The most significant\n     *                                    bit of number is the sign bit. The remaining 29 bits\n     *                                    are magnitude bits. Negative numbers are represented\n     *                                    using two's-complement notation.\n     *                                    If number is negative, OCT2BIN ignores places and returns\n     *                                    a 10-character binary number.\n     *                                    If number is negative, it cannot be less than 7777777000,\n     *                                    and if number is positive, it cannot be greater than 777.\n     *                                    If number is not a valid octal number, OCT2BIN returns\n     *                                    the #NUM! error value.\n     *                                    If OCT2BIN requires more than places characters, it\n     *                                    returns the #NUM! error value.\n     * @param    integer        $places        The number of characters to use. If places is omitted,\n     *                                    OCT2BIN uses the minimum number of characters necessary.\n     *                                    Places is useful for padding the return value with\n     *                                    leading 0s (zeros).\n     *                                    If places is not an integer, it is truncated.\n     *                                    If places is nonnumeric, OCT2BIN returns the #VALUE!\n     *                                    error value.\n     *                                    If places is negative, OCT2BIN returns the #NUM! error\n     *                                    value.\n     * @return    string\n     */\n    public static function OCTTOBIN($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) $x;\n        if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $r = decbin(octdec($x));\n\n        return self::nbrConversionFormat($r, $places);\n    }\n\n\n    /**\n     * OCTTODEC\n     *\n     * Return an octal value as decimal.\n     *\n     * Excel Function:\n     *        OCT2DEC(x)\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x        The octal number you want to convert. Number may not contain\n     *                                more than 10 octal characters (30 bits). The most significant\n     *                                bit of number is the sign bit. The remaining 29 bits are\n     *                                magnitude bits. Negative numbers are represented using\n     *                                two's-complement notation.\n     *                                If number is not a valid octal number, OCT2DEC returns the\n     *                                #NUM! error value.\n     * @return    string\n     */\n    public static function OCTTODEC($x)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n\n        if (is_bool($x)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) $x;\n        if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return octdec($x);\n    }\n\n\n    /**\n     * OCTTOHEX\n     *\n     * Return an octal value as hex.\n     *\n     * Excel Function:\n     *        OCT2HEX(x[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $x            The octal number you want to convert. Number may not contain\n     *                                    more than 10 octal characters (30 bits). The most significant\n     *                                    bit of number is the sign bit. The remaining 29 bits are\n     *                                    magnitude bits. Negative numbers are represented using\n     *                                    two's-complement notation.\n     *                                    If number is negative, OCT2HEX ignores places and returns a\n     *                                    10-character hexadecimal number.\n     *                                    If number is not a valid octal number, OCT2HEX returns the\n     *                                    #NUM! error value.\n     *                                    If OCT2HEX requires more than places characters, it returns\n     *                                    the #NUM! error value.\n     * @param    integer        $places        The number of characters to use. If places is omitted, OCT2HEX\n     *                                    uses the minimum number of characters necessary. Places is useful\n     *                                    for padding the return value with leading 0s (zeros).\n     *                                    If places is not an integer, it is truncated.\n     *                                    If places is nonnumeric, OCT2HEX returns the #VALUE! error value.\n     *                                    If places is negative, OCT2HEX returns the #NUM! error value.\n     * @return    string\n     */\n    public static function OCTTOHEX($x, $places = null)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $places    = PHPExcel_Calculation_Functions::flattenSingleValue($places);\n\n        if (is_bool($x)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $x = (string) $x;\n        if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $hexVal = strtoupper(dechex(octdec($x)));\n\n        return self::nbrConversionFormat($hexVal, $places);\n    }\n\n\n    /**\n     * COMPLEX\n     *\n     * Converts real and imaginary coefficients into a complex number of the form x + yi or x + yj.\n     *\n     * Excel Function:\n     *        COMPLEX(realNumber,imaginary[,places])\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    float        $realNumber        The real coefficient of the complex number.\n     * @param    float        $imaginary        The imaginary coefficient of the complex number.\n     * @param    string        $suffix            The suffix for the imaginary component of the complex number.\n     *                                        If omitted, the suffix is assumed to be \"i\".\n     * @return    string\n     */\n    public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i')\n    {\n        $realNumber = (is_null($realNumber)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($realNumber);\n        $imaginary  = (is_null($imaginary))  ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($imaginary);\n        $suffix     = (is_null($suffix))     ? 'i' : PHPExcel_Calculation_Functions::flattenSingleValue($suffix);\n\n        if (((is_numeric($realNumber)) && (is_numeric($imaginary))) &&\n            (($suffix == 'i') || ($suffix == 'j') || ($suffix == ''))) {\n            $realNumber    = (float) $realNumber;\n            $imaginary    = (float) $imaginary;\n\n            if ($suffix == '') {\n                $suffix = 'i';\n            }\n            if ($realNumber == 0.0) {\n                if ($imaginary == 0.0) {\n                    return (string) '0';\n                } elseif ($imaginary == 1.0) {\n                    return (string) $suffix;\n                } elseif ($imaginary == -1.0) {\n                    return (string) '-'.$suffix;\n                }\n                return (string) $imaginary.$suffix;\n            } elseif ($imaginary == 0.0) {\n                return (string) $realNumber;\n            } elseif ($imaginary == 1.0) {\n                return (string) $realNumber.'+'.$suffix;\n            } elseif ($imaginary == -1.0) {\n                return (string) $realNumber.'-'.$suffix;\n            }\n            if ($imaginary > 0) {\n                $imaginary = (string) '+'.$imaginary;\n            }\n            return (string) $realNumber.$imaginary.$suffix;\n        }\n\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * IMAGINARY\n     *\n     * Returns the imaginary coefficient of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMAGINARY(complexNumber)\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $complexNumber    The complex number for which you want the imaginary\n     *                                         coefficient.\n     * @return    float\n     */\n    public static function IMAGINARY($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n        return $parsedComplex['imaginary'];\n    }\n\n\n    /**\n     * IMREAL\n     *\n     * Returns the real coefficient of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMREAL(complexNumber)\n     *\n     * @access    public\n     * @category Engineering Functions\n     * @param    string        $complexNumber    The complex number for which you want the real coefficient.\n     * @return    float\n     */\n    public static function IMREAL($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n        return $parsedComplex['real'];\n    }\n\n\n    /**\n     * IMABS\n     *\n     * Returns the absolute value (modulus) of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMABS(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the absolute value.\n     * @return    float\n     */\n    public static function IMABS($complexNumber)\n    {\n        $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        return sqrt(\n            ($parsedComplex['real'] * $parsedComplex['real']) +\n            ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])\n        );\n    }\n\n\n    /**\n     * IMARGUMENT\n     *\n     * Returns the argument theta of a complex number, i.e. the angle in radians from the real\n     * axis to the representation of the number in polar coordinates.\n     *\n     * Excel Function:\n     *        IMARGUMENT(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the argument theta.\n     * @return    float\n     */\n    public static function IMARGUMENT($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if ($parsedComplex['real'] == 0.0) {\n            if ($parsedComplex['imaginary'] == 0.0) {\n                return 0.0;\n            } elseif ($parsedComplex['imaginary'] < 0.0) {\n                return M_PI / -2;\n            } else {\n                return M_PI / 2;\n            }\n        } elseif ($parsedComplex['real'] > 0.0) {\n            return atan($parsedComplex['imaginary'] / $parsedComplex['real']);\n        } elseif ($parsedComplex['imaginary'] < 0.0) {\n            return 0 - (M_PI - atan(abs($parsedComplex['imaginary']) / abs($parsedComplex['real'])));\n        } else {\n            return M_PI - atan($parsedComplex['imaginary'] / abs($parsedComplex['real']));\n        }\n    }\n\n\n    /**\n     * IMCONJUGATE\n     *\n     * Returns the complex conjugate of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMCONJUGATE(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the conjugate.\n     * @return    string\n     */\n    public static function IMCONJUGATE($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if ($parsedComplex['imaginary'] == 0.0) {\n            return $parsedComplex['real'];\n        } else {\n            return self::cleanComplex(\n                self::COMPLEX(\n                    $parsedComplex['real'],\n                    0 - $parsedComplex['imaginary'],\n                    $parsedComplex['suffix']\n                )\n            );\n        }\n    }\n\n\n    /**\n     * IMCOS\n     *\n     * Returns the cosine of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMCOS(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the cosine.\n     * @return    string|float\n     */\n    public static function IMCOS($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if ($parsedComplex['imaginary'] == 0.0) {\n            return cos($parsedComplex['real']);\n        } else {\n            return self::IMCONJUGATE(\n                self::COMPLEX(\n                    cos($parsedComplex['real']) * cosh($parsedComplex['imaginary']),\n                    sin($parsedComplex['real']) * sinh($parsedComplex['imaginary']),\n                    $parsedComplex['suffix']\n                )\n            );\n        }\n    }\n\n\n    /**\n     * IMSIN\n     *\n     * Returns the sine of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMSIN(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the sine.\n     * @return    string|float\n     */\n    public static function IMSIN($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if ($parsedComplex['imaginary'] == 0.0) {\n            return sin($parsedComplex['real']);\n        } else {\n            return self::COMPLEX(\n                sin($parsedComplex['real']) * cosh($parsedComplex['imaginary']),\n                cos($parsedComplex['real']) * sinh($parsedComplex['imaginary']),\n                $parsedComplex['suffix']\n            );\n        }\n    }\n\n\n    /**\n     * IMSQRT\n     *\n     * Returns the square root of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMSQRT(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the square root.\n     * @return    string\n     */\n    public static function IMSQRT($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        $theta = self::IMARGUMENT($complexNumber);\n        $d1 = cos($theta / 2);\n        $d2 = sin($theta / 2);\n        $r = sqrt(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])));\n\n        if ($parsedComplex['suffix'] == '') {\n            return self::COMPLEX($d1 * $r, $d2 * $r);\n        } else {\n            return self::COMPLEX($d1 * $r, $d2 * $r, $parsedComplex['suffix']);\n        }\n    }\n\n\n    /**\n     * IMLN\n     *\n     * Returns the natural logarithm of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMLN(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the natural logarithm.\n     * @return    string\n     */\n    public static function IMLN($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        $logR = log(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])));\n        $t = self::IMARGUMENT($complexNumber);\n\n        if ($parsedComplex['suffix'] == '') {\n            return self::COMPLEX($logR, $t);\n        } else {\n            return self::COMPLEX($logR, $t, $parsedComplex['suffix']);\n        }\n    }\n\n\n    /**\n     * IMLOG10\n     *\n     * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMLOG10(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the common logarithm.\n     * @return    string\n     */\n    public static function IMLOG10($complexNumber)\n    {\n        $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) {\n            return log10($parsedComplex['real']);\n        }\n\n        return self::IMPRODUCT(log10(EULER), self::IMLN($complexNumber));\n    }\n\n\n    /**\n     * IMLOG2\n     *\n     * Returns the base-2 logarithm of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMLOG2(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the base-2 logarithm.\n     * @return    string\n     */\n    public static function IMLOG2($complexNumber)\n    {\n        $complexNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) {\n            return log($parsedComplex['real'], 2);\n        }\n\n        return self::IMPRODUCT(log(EULER, 2), self::IMLN($complexNumber));\n    }\n\n\n    /**\n     * IMEXP\n     *\n     * Returns the exponential of a complex number in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMEXP(complexNumber)\n     *\n     * @param    string        $complexNumber    The complex number for which you want the exponential.\n     * @return    string\n     */\n    public static function IMEXP($complexNumber)\n    {\n        $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {\n            return '1';\n        }\n\n        $e = exp($parsedComplex['real']);\n        $eX = $e * cos($parsedComplex['imaginary']);\n        $eY = $e * sin($parsedComplex['imaginary']);\n\n        if ($parsedComplex['suffix'] == '') {\n            return self::COMPLEX($eX, $eY);\n        } else {\n            return self::COMPLEX($eX, $eY, $parsedComplex['suffix']);\n        }\n    }\n\n\n    /**\n     * IMPOWER\n     *\n     * Returns a complex number in x + yi or x + yj text format raised to a power.\n     *\n     * Excel Function:\n     *        IMPOWER(complexNumber,realNumber)\n     *\n     * @param    string        $complexNumber    The complex number you want to raise to a power.\n     * @param    float        $realNumber        The power to which you want to raise the complex number.\n     * @return    string\n     */\n    public static function IMPOWER($complexNumber, $realNumber)\n    {\n        $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);\n        $realNumber    = PHPExcel_Calculation_Functions::flattenSingleValue($realNumber);\n\n        if (!is_numeric($realNumber)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        $parsedComplex = self::parseComplex($complexNumber);\n\n        $r = sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']));\n        $rPower = pow($r, $realNumber);\n        $theta = self::IMARGUMENT($complexNumber) * $realNumber;\n        if ($theta == 0) {\n            return 1;\n        } elseif ($parsedComplex['imaginary'] == 0.0) {\n            return self::COMPLEX($rPower * cos($theta), $rPower * sin($theta), $parsedComplex['suffix']);\n        } else {\n            return self::COMPLEX($rPower * cos($theta), $rPower * sin($theta), $parsedComplex['suffix']);\n        }\n    }\n\n\n    /**\n     * IMDIV\n     *\n     * Returns the quotient of two complex numbers in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMDIV(complexDividend,complexDivisor)\n     *\n     * @param    string        $complexDividend    The complex numerator or dividend.\n     * @param    string        $complexDivisor        The complex denominator or divisor.\n     * @return    string\n     */\n    public static function IMDIV($complexDividend, $complexDivisor)\n    {\n        $complexDividend    = PHPExcel_Calculation_Functions::flattenSingleValue($complexDividend);\n        $complexDivisor    = PHPExcel_Calculation_Functions::flattenSingleValue($complexDivisor);\n\n        $parsedComplexDividend = self::parseComplex($complexDividend);\n        $parsedComplexDivisor = self::parseComplex($complexDivisor);\n\n        if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] != '') &&\n            ($parsedComplexDividend['suffix'] != $parsedComplexDivisor['suffix'])) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] == '')) {\n            $parsedComplexDivisor['suffix'] = $parsedComplexDividend['suffix'];\n        }\n\n        $d1 = ($parsedComplexDividend['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['imaginary']);\n        $d2 = ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['real']) - ($parsedComplexDividend['real'] * $parsedComplexDivisor['imaginary']);\n        $d3 = ($parsedComplexDivisor['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDivisor['imaginary'] * $parsedComplexDivisor['imaginary']);\n\n        $r = $d1 / $d3;\n        $i = $d2 / $d3;\n\n        if ($i > 0.0) {\n            return self::cleanComplex($r.'+'.$i.$parsedComplexDivisor['suffix']);\n        } elseif ($i < 0.0) {\n            return self::cleanComplex($r.$i.$parsedComplexDivisor['suffix']);\n        } else {\n            return $r;\n        }\n    }\n\n\n    /**\n     * IMSUB\n     *\n     * Returns the difference of two complex numbers in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMSUB(complexNumber1,complexNumber2)\n     *\n     * @param    string        $complexNumber1        The complex number from which to subtract complexNumber2.\n     * @param    string        $complexNumber2        The complex number to subtract from complexNumber1.\n     * @return    string\n     */\n    public static function IMSUB($complexNumber1, $complexNumber2)\n    {\n        $complexNumber1    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber1);\n        $complexNumber2    = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber2);\n\n        $parsedComplex1 = self::parseComplex($complexNumber1);\n        $parsedComplex2 = self::parseComplex($complexNumber2);\n\n        if ((($parsedComplex1['suffix'] != '') && ($parsedComplex2['suffix'] != '')) &&\n            ($parsedComplex1['suffix'] != $parsedComplex2['suffix'])) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif (($parsedComplex1['suffix'] == '') && ($parsedComplex2['suffix'] != '')) {\n            $parsedComplex1['suffix'] = $parsedComplex2['suffix'];\n        }\n\n        $d1 = $parsedComplex1['real'] - $parsedComplex2['real'];\n        $d2 = $parsedComplex1['imaginary'] - $parsedComplex2['imaginary'];\n\n        return self::COMPLEX($d1, $d2, $parsedComplex1['suffix']);\n    }\n\n\n    /**\n     * IMSUM\n     *\n     * Returns the sum of two or more complex numbers in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMSUM(complexNumber[,complexNumber[,...]])\n     *\n     * @param    string        $complexNumber,...    Series of complex numbers to add\n     * @return    string\n     */\n    public static function IMSUM()\n    {\n        // Return value\n        $returnValue = self::parseComplex('0');\n        $activeSuffix = '';\n\n        // Loop through the arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            $parsedComplex = self::parseComplex($arg);\n\n            if ($activeSuffix == '') {\n                $activeSuffix = $parsedComplex['suffix'];\n            } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n\n            $returnValue['real'] += $parsedComplex['real'];\n            $returnValue['imaginary'] += $parsedComplex['imaginary'];\n        }\n\n        if ($returnValue['imaginary'] == 0.0) {\n            $activeSuffix = '';\n        }\n        return self::COMPLEX($returnValue['real'], $returnValue['imaginary'], $activeSuffix);\n    }\n\n\n    /**\n     * IMPRODUCT\n     *\n     * Returns the product of two or more complex numbers in x + yi or x + yj text format.\n     *\n     * Excel Function:\n     *        IMPRODUCT(complexNumber[,complexNumber[,...]])\n     *\n     * @param    string        $complexNumber,...    Series of complex numbers to multiply\n     * @return    string\n     */\n    public static function IMPRODUCT()\n    {\n        // Return value\n        $returnValue = self::parseComplex('1');\n        $activeSuffix = '';\n\n        // Loop through the arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            $parsedComplex = self::parseComplex($arg);\n\n            $workValue = $returnValue;\n            if (($parsedComplex['suffix'] != '') && ($activeSuffix == '')) {\n                $activeSuffix = $parsedComplex['suffix'];\n            } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $returnValue['real'] = ($workValue['real'] * $parsedComplex['real']) - ($workValue['imaginary'] * $parsedComplex['imaginary']);\n            $returnValue['imaginary'] = ($workValue['real'] * $parsedComplex['imaginary']) + ($workValue['imaginary'] * $parsedComplex['real']);\n        }\n\n        if ($returnValue['imaginary'] == 0.0) {\n            $activeSuffix = '';\n        }\n        return self::COMPLEX($returnValue['real'], $returnValue['imaginary'], $activeSuffix);\n    }\n\n\n    /**\n     *    DELTA\n     *\n     *    Tests whether two values are equal. Returns 1 if number1 = number2; returns 0 otherwise.\n     *    Use this function to filter a set of values. For example, by summing several DELTA\n     *    functions you calculate the count of equal pairs. This function is also known as the\n     *    Kronecker Delta function.\n     *\n     *    Excel Function:\n     *        DELTA(a[,b])\n     *\n     *    @param    float        $a    The first number.\n     *    @param    float        $b    The second number. If omitted, b is assumed to be zero.\n     *    @return    int\n     */\n    public static function DELTA($a, $b = 0)\n    {\n        $a = PHPExcel_Calculation_Functions::flattenSingleValue($a);\n        $b = PHPExcel_Calculation_Functions::flattenSingleValue($b);\n\n        return (int) ($a == $b);\n    }\n\n\n    /**\n     *    GESTEP\n     *\n     *    Excel Function:\n     *        GESTEP(number[,step])\n     *\n     *    Returns 1 if number >= step; returns 0 (zero) otherwise\n     *    Use this function to filter a set of values. For example, by summing several GESTEP\n     *    functions you calculate the count of values that exceed a threshold.\n     *\n     *    @param    float        $number        The value to test against step.\n     *    @param    float        $step        The threshold value.\n     *                                    If you omit a value for step, GESTEP uses zero.\n     *    @return    int\n     */\n    public static function GESTEP($number, $step = 0)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $step    = PHPExcel_Calculation_Functions::flattenSingleValue($step);\n\n        return (int) ($number >= $step);\n    }\n\n\n    //\n    //    Private method to calculate the erf value\n    //\n    private static $twoSqrtPi = 1.128379167095512574;\n\n    public static function erfVal($x)\n    {\n        if (abs($x) > 2.2) {\n            return 1 - self::erfcVal($x);\n        }\n        $sum = $term = $x;\n        $xsqr = ($x * $x);\n        $j = 1;\n        do {\n            $term *= $xsqr / $j;\n            $sum -= $term / (2 * $j + 1);\n            ++$j;\n            $term *= $xsqr / $j;\n            $sum += $term / (2 * $j + 1);\n            ++$j;\n            if ($sum == 0.0) {\n                break;\n            }\n        } while (abs($term / $sum) > PRECISION);\n        return self::$twoSqrtPi * $sum;\n    }\n\n\n    /**\n     *    ERF\n     *\n     *    Returns the error function integrated between the lower and upper bound arguments.\n     *\n     *    Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments,\n     *            the function would return a #NUM! error. However, in Excel 2010, the function algorithm was\n     *            improved, so that it can now calculate the function for both positive and negative ranges.\n     *            PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments.\n     *\n     *    Excel Function:\n     *        ERF(lower[,upper])\n     *\n     *    @param    float        $lower    lower bound for integrating ERF\n     *    @param    float        $upper    upper bound for integrating ERF.\n     *                                If omitted, ERF integrates between zero and lower_limit\n     *    @return    float\n     */\n    public static function ERF($lower, $upper = null)\n    {\n        $lower    = PHPExcel_Calculation_Functions::flattenSingleValue($lower);\n        $upper    = PHPExcel_Calculation_Functions::flattenSingleValue($upper);\n\n        if (is_numeric($lower)) {\n            if (is_null($upper)) {\n                return self::erfVal($lower);\n            }\n            if (is_numeric($upper)) {\n                return self::erfVal($upper) - self::erfVal($lower);\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    //\n    //    Private method to calculate the erfc value\n    //\n    private static $oneSqrtPi = 0.564189583547756287;\n\n    private static function erfcVal($x)\n    {\n        if (abs($x) < 2.2) {\n            return 1 - self::erfVal($x);\n        }\n        if ($x < 0) {\n            return 2 - self::ERFC(-$x);\n        }\n        $a = $n = 1;\n        $b = $c = $x;\n        $d = ($x * $x) + 0.5;\n        $q1 = $q2 = $b / $d;\n        $t = 0;\n        do {\n            $t = $a * $n + $b * $x;\n            $a = $b;\n            $b = $t;\n            $t = $c * $n + $d * $x;\n            $c = $d;\n            $d = $t;\n            $n += 0.5;\n            $q1 = $q2;\n            $q2 = $b / $d;\n        } while ((abs($q1 - $q2) / $q2) > PRECISION);\n        return self::$oneSqrtPi * exp(-$x * $x) * $q2;\n    }\n\n\n    /**\n     *    ERFC\n     *\n     *    Returns the complementary ERF function integrated between x and infinity\n     *\n     *    Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument,\n     *        the function would return a #NUM! error. However, in Excel 2010, the function algorithm was\n     *        improved, so that it can now calculate the function for both positive and negative x values.\n     *            PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments.\n     *\n     *    Excel Function:\n     *        ERFC(x)\n     *\n     *    @param    float    $x    The lower bound for integrating ERFC\n     *    @return    float\n     */\n    public static function ERFC($x)\n    {\n        $x = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n\n        if (is_numeric($x)) {\n            return self::erfcVal($x);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     *    getConversionGroups\n     *    Returns a list of the different conversion groups for UOM conversions\n     *\n     *    @return    array\n     */\n    public static function getConversionGroups()\n    {\n        $conversionGroups = array();\n        foreach (self::$conversionUnits as $conversionUnit) {\n            $conversionGroups[] = $conversionUnit['Group'];\n        }\n        return array_merge(array_unique($conversionGroups));\n    }\n\n\n    /**\n     *    getConversionGroupUnits\n     *    Returns an array of units of measure, for a specified conversion group, or for all groups\n     *\n     *    @param    string    $group    The group whose units of measure you want to retrieve\n     *    @return    array\n     */\n    public static function getConversionGroupUnits($group = null)\n    {\n        $conversionGroups = array();\n        foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) {\n            if ((is_null($group)) || ($conversionGroup['Group'] == $group)) {\n                $conversionGroups[$conversionGroup['Group']][] = $conversionUnit;\n            }\n        }\n        return $conversionGroups;\n    }\n\n\n    /**\n     *    getConversionGroupUnitDetails\n     *\n     *    @param    string    $group    The group whose units of measure you want to retrieve\n     *    @return    array\n     */\n    public static function getConversionGroupUnitDetails($group = null)\n    {\n        $conversionGroups = array();\n        foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) {\n            if ((is_null($group)) || ($conversionGroup['Group'] == $group)) {\n                $conversionGroups[$conversionGroup['Group']][] = array(\n                    'unit'        => $conversionUnit,\n                    'description' => $conversionGroup['Unit Name']\n                );\n            }\n        }\n        return $conversionGroups;\n    }\n\n\n    /**\n     *    getConversionMultipliers\n     *    Returns an array of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM()\n     *\n     *    @return    array of mixed\n     */\n    public static function getConversionMultipliers()\n    {\n        return self::$conversionMultipliers;\n    }\n\n\n    /**\n     *    CONVERTUOM\n     *\n     *    Converts a number from one measurement system to another.\n     *    For example, CONVERT can translate a table of distances in miles to a table of distances\n     *    in kilometers.\n     *\n     *    Excel Function:\n     *        CONVERT(value,fromUOM,toUOM)\n     *\n     *    @param    float        $value        The value in fromUOM to convert.\n     *    @param    string        $fromUOM    The units for value.\n     *    @param    string        $toUOM        The units for the result.\n     *\n     *    @return    float\n     */\n    public static function CONVERTUOM($value, $fromUOM, $toUOM)\n    {\n        $value   = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $fromUOM = PHPExcel_Calculation_Functions::flattenSingleValue($fromUOM);\n        $toUOM   = PHPExcel_Calculation_Functions::flattenSingleValue($toUOM);\n\n        if (!is_numeric($value)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $fromMultiplier = 1.0;\n        if (isset(self::$conversionUnits[$fromUOM])) {\n            $unitGroup1 = self::$conversionUnits[$fromUOM]['Group'];\n        } else {\n            $fromMultiplier = substr($fromUOM, 0, 1);\n            $fromUOM = substr($fromUOM, 1);\n            if (isset(self::$conversionMultipliers[$fromMultiplier])) {\n                $fromMultiplier = self::$conversionMultipliers[$fromMultiplier]['multiplier'];\n            } else {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            if ((isset(self::$conversionUnits[$fromUOM])) && (self::$conversionUnits[$fromUOM]['AllowPrefix'])) {\n                $unitGroup1 = self::$conversionUnits[$fromUOM]['Group'];\n            } else {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n        }\n        $value *= $fromMultiplier;\n\n        $toMultiplier = 1.0;\n        if (isset(self::$conversionUnits[$toUOM])) {\n            $unitGroup2 = self::$conversionUnits[$toUOM]['Group'];\n        } else {\n            $toMultiplier = substr($toUOM, 0, 1);\n            $toUOM = substr($toUOM, 1);\n            if (isset(self::$conversionMultipliers[$toMultiplier])) {\n                $toMultiplier = self::$conversionMultipliers[$toMultiplier]['multiplier'];\n            } else {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            if ((isset(self::$conversionUnits[$toUOM])) && (self::$conversionUnits[$toUOM]['AllowPrefix'])) {\n                $unitGroup2 = self::$conversionUnits[$toUOM]['Group'];\n            } else {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n        }\n        if ($unitGroup1 != $unitGroup2) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n\n        if (($fromUOM == $toUOM) && ($fromMultiplier == $toMultiplier)) {\n            //    We've already factored $fromMultiplier into the value, so we need\n            //        to reverse it again\n            return $value / $fromMultiplier;\n        } elseif ($unitGroup1 == 'Temperature') {\n            if (($fromUOM == 'F') || ($fromUOM == 'fah')) {\n                if (($toUOM == 'F') || ($toUOM == 'fah')) {\n                    return $value;\n                } else {\n                    $value = (($value - 32) / 1.8);\n                    if (($toUOM == 'K') || ($toUOM == 'kel')) {\n                        $value += 273.15;\n                    }\n                    return $value;\n                }\n            } elseif ((($fromUOM == 'K') || ($fromUOM == 'kel')) &&\n                      (($toUOM == 'K') || ($toUOM == 'kel'))) {\n                        return $value;\n            } elseif ((($fromUOM == 'C') || ($fromUOM == 'cel')) &&\n                      (($toUOM == 'C') || ($toUOM == 'cel'))) {\n                    return $value;\n            }\n            if (($toUOM == 'F') || ($toUOM == 'fah')) {\n                if (($fromUOM == 'K') || ($fromUOM == 'kel')) {\n                    $value -= 273.15;\n                }\n                return ($value * 1.8) + 32;\n            }\n            if (($toUOM == 'C') || ($toUOM == 'cel')) {\n                return $value - 273.15;\n            }\n            return $value + 273.15;\n        }\n        return ($value * self::$unitConversions[$unitGroup1][$fromUOM][$toUOM]) / $toMultiplier;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Exception.php",
    "content": "<?php\n\n/**\n * PHPExcel_Calculation_Exception\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Exception extends PHPExcel_Exception\n{\n    /**\n     * Error handler callback\n     *\n     * @param mixed $code\n     * @param mixed $string\n     * @param mixed $file\n     * @param mixed $line\n     * @param mixed $context\n     */\n    public static function errorHandlerCallback($code, $string, $file, $line, $context)\n    {\n        $e = new self($string, $code);\n        $e->line = $line;\n        $e->file = $file;\n        throw $e;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php",
    "content": "<?php\n\n/**\n * PHPExcel_Calculation_ExceptionHandler\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_ExceptionHandler\n{\n    /**\n     * Register errorhandler\n     */\n    public function __construct()\n    {\n        set_error_handler(array('PHPExcel_Calculation_Exception', 'errorHandlerCallback'), E_ALL);\n    }\n\n    /**\n     * Unregister errorhandler\n     */\n    public function __destruct()\n    {\n        restore_error_handler();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Financial.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/** FINANCIAL_MAX_ITERATIONS */\ndefine('FINANCIAL_MAX_ITERATIONS', 128);\n\n/** FINANCIAL_PRECISION */\ndefine('FINANCIAL_PRECISION', 1.0e-08);\n\n/**\n * PHPExcel_Calculation_Financial\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Financial\n{\n    /**\n     * isLastDayOfMonth\n     *\n     * Returns a boolean TRUE/FALSE indicating if this date is the last date of the month\n     *\n     * @param    DateTime    $testDate    The date for testing\n     * @return    boolean\n     */\n    private static function isLastDayOfMonth($testDate)\n    {\n        return ($testDate->format('d') == $testDate->format('t'));\n    }\n\n\n    /**\n     * isFirstDayOfMonth\n     *\n     * Returns a boolean TRUE/FALSE indicating if this date is the first date of the month\n     *\n     * @param    DateTime    $testDate    The date for testing\n     * @return    boolean\n     */\n    private static function isFirstDayOfMonth($testDate)\n    {\n        return ($testDate->format('d') == 1);\n    }\n\n\n    private static function couponFirstPeriodDate($settlement, $maturity, $frequency, $next)\n    {\n        $months = 12 / $frequency;\n\n        $result = PHPExcel_Shared_Date::ExcelToPHPObject($maturity);\n        $eom = self::isLastDayOfMonth($result);\n\n        while ($settlement < PHPExcel_Shared_Date::PHPToExcel($result)) {\n            $result->modify('-'.$months.' months');\n        }\n        if ($next) {\n            $result->modify('+'.$months.' months');\n        }\n\n        if ($eom) {\n            $result->modify('-1 day');\n        }\n\n        return PHPExcel_Shared_Date::PHPToExcel($result);\n    }\n\n\n    private static function isValidFrequency($frequency)\n    {\n        if (($frequency == 1) || ($frequency == 2) || ($frequency == 4)) {\n            return true;\n        }\n        if ((PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) &&\n            (($frequency == 6) || ($frequency == 12))) {\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * daysPerYear\n     *\n     * Returns the number of days in a specified year, as defined by the \"basis\" value\n     *\n     * @param    integer        $year    The year against which we're testing\n     * @param   integer        $basis    The type of day count:\n     *                                    0 or omitted US (NASD)    360\n     *                                    1                        Actual (365 or 366 in a leap year)\n     *                                    2                        360\n     *                                    3                        365\n     *                                    4                        European 360\n     * @return    integer\n     */\n    private static function daysPerYear($year, $basis = 0)\n    {\n        switch ($basis) {\n            case 0:\n            case 2:\n            case 4:\n                $daysPerYear = 360;\n                break;\n            case 3:\n                $daysPerYear = 365;\n                break;\n            case 1:\n                $daysPerYear = (PHPExcel_Calculation_DateTime::isLeapYear($year)) ? 366 : 365;\n                break;\n            default:\n                return PHPExcel_Calculation_Functions::NaN();\n        }\n        return $daysPerYear;\n    }\n\n\n    private static function interestAndPrincipal($rate = 0, $per = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0)\n    {\n        $pmt = self::PMT($rate, $nper, $pv, $fv, $type);\n        $capital = $pv;\n        for ($i = 1; $i<= $per; ++$i) {\n            $interest = ($type && $i == 1) ? 0 : -$capital * $rate;\n            $principal = $pmt - $interest;\n            $capital += $principal;\n        }\n        return array($interest, $principal);\n    }\n\n\n    /**\n     * ACCRINT\n     *\n     * Returns the accrued interest for a security that pays periodic interest.\n     *\n     * Excel Function:\n     *        ACCRINT(issue,firstinterest,settlement,rate,par,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    $issue            The security's issue date.\n     * @param    mixed    $firstinterest    The security's first interest date.\n     * @param    mixed    $settlement        The security's settlement date.\n     *                                    The security settlement date is the date after the issue date\n     *                                    when the security is traded to the buyer.\n     * @param    float    $rate            The security's annual coupon rate.\n     * @param    float    $par            The security's par value.\n     *                                    If you omit par, ACCRINT uses $1,000.\n     * @param    integer    $frequency        the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer    $basis            The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function ACCRINT($issue, $firstinterest, $settlement, $rate, $par = 1000, $frequency = 1, $basis = 0)\n    {\n        $issue        = PHPExcel_Calculation_Functions::flattenSingleValue($issue);\n        $firstinterest    = PHPExcel_Calculation_Functions::flattenSingleValue($firstinterest);\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $rate        = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $par        = (is_null($par))        ? 1000 :    PHPExcel_Calculation_Functions::flattenSingleValue($par);\n        $frequency    = (is_null($frequency))    ? 1    :         PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis        = (is_null($basis))        ? 0    :        PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if ((is_numeric($rate)) && (is_numeric($par))) {\n            $rate    = (float) $rate;\n            $par    = (float) $par;\n            if (($rate <= 0) || ($par <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis);\n            if (!is_numeric($daysBetweenIssueAndSettlement)) {\n                //    return date error\n                return $daysBetweenIssueAndSettlement;\n            }\n\n            return $par * $rate * $daysBetweenIssueAndSettlement;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * ACCRINTM\n     *\n     * Returns the accrued interest for a security that pays interest at maturity.\n     *\n     * Excel Function:\n     *        ACCRINTM(issue,settlement,rate[,par[,basis]])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    issue        The security's issue date.\n     * @param    mixed    settlement    The security's settlement (or maturity) date.\n     * @param    float    rate        The security's annual coupon rate.\n     * @param    float    par            The security's par value.\n     *                                    If you omit par, ACCRINT uses $1,000.\n     * @param    integer    basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function ACCRINTM($issue, $settlement, $rate, $par = 1000, $basis = 0)\n    {\n        $issue        = PHPExcel_Calculation_Functions::flattenSingleValue($issue);\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $rate        = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $par        = (is_null($par))    ? 1000 :    PHPExcel_Calculation_Functions::flattenSingleValue($par);\n        $basis        = (is_null($basis))    ? 0 :        PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if ((is_numeric($rate)) && (is_numeric($par))) {\n            $rate    = (float) $rate;\n            $par    = (float) $par;\n            if (($rate <= 0) || ($par <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis);\n            if (!is_numeric($daysBetweenIssueAndSettlement)) {\n                //    return date error\n                return $daysBetweenIssueAndSettlement;\n            }\n            return $par * $rate * $daysBetweenIssueAndSettlement;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * AMORDEGRC\n     *\n     * Returns the depreciation for each accounting period.\n     * This function is provided for the French accounting system. If an asset is purchased in\n     * the middle of the accounting period, the prorated depreciation is taken into account.\n     * The function is similar to AMORLINC, except that a depreciation coefficient is applied in\n     * the calculation depending on the life of the assets.\n     * This function will return the depreciation until the last period of the life of the assets\n     * or until the cumulated value of depreciation is greater than the cost of the assets minus\n     * the salvage value.\n     *\n     * Excel Function:\n     *        AMORDEGRC(cost,purchased,firstPeriod,salvage,period,rate[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    cost        The cost of the asset.\n     * @param    mixed    purchased    Date of the purchase of the asset.\n     * @param    mixed    firstPeriod    Date of the end of the first period.\n     * @param    mixed    salvage        The salvage value at the end of the life of the asset.\n     * @param    float    period        The period.\n     * @param    float    rate        Rate of depreciation.\n     * @param    integer    basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function AMORDEGRC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0)\n    {\n        $cost            = PHPExcel_Calculation_Functions::flattenSingleValue($cost);\n        $purchased        = PHPExcel_Calculation_Functions::flattenSingleValue($purchased);\n        $firstPeriod    = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod);\n        $salvage        = PHPExcel_Calculation_Functions::flattenSingleValue($salvage);\n        $period            = floor(PHPExcel_Calculation_Functions::flattenSingleValue($period));\n        $rate            = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $basis            = (is_null($basis))    ? 0 :    (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    The depreciation coefficients are:\n        //    Life of assets (1/rate)        Depreciation coefficient\n        //    Less than 3 years            1\n        //    Between 3 and 4 years        1.5\n        //    Between 5 and 6 years        2\n        //    More than 6 years            2.5\n        $fUsePer = 1.0 / $rate;\n        if ($fUsePer < 3.0) {\n            $amortiseCoeff = 1.0;\n        } elseif ($fUsePer < 5.0) {\n            $amortiseCoeff = 1.5;\n        } elseif ($fUsePer <= 6.0) {\n            $amortiseCoeff = 2.0;\n        } else {\n            $amortiseCoeff = 2.5;\n        }\n\n        $rate *= $amortiseCoeff;\n        $fNRate = round(PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis) * $rate * $cost, 0);\n        $cost -= $fNRate;\n        $fRest = $cost - $salvage;\n\n        for ($n = 0; $n < $period; ++$n) {\n            $fNRate = round($rate * $cost, 0);\n            $fRest -= $fNRate;\n\n            if ($fRest < 0.0) {\n                switch ($period - $n) {\n                    case 0:\n                    case 1:\n                        return round($cost * 0.5, 0);\n                    default:\n                        return 0.0;\n                }\n            }\n            $cost -= $fNRate;\n        }\n        return $fNRate;\n    }\n\n\n    /**\n     * AMORLINC\n     *\n     * Returns the depreciation for each accounting period.\n     * This function is provided for the French accounting system. If an asset is purchased in\n     * the middle of the accounting period, the prorated depreciation is taken into account.\n     *\n     * Excel Function:\n     *        AMORLINC(cost,purchased,firstPeriod,salvage,period,rate[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    cost        The cost of the asset.\n     * @param    mixed    purchased    Date of the purchase of the asset.\n     * @param    mixed    firstPeriod    Date of the end of the first period.\n     * @param    mixed    salvage        The salvage value at the end of the life of the asset.\n     * @param    float    period        The period.\n     * @param    float    rate        Rate of depreciation.\n     * @param    integer    basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function AMORLINC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0)\n    {\n        $cost        = PHPExcel_Calculation_Functions::flattenSingleValue($cost);\n        $purchased   = PHPExcel_Calculation_Functions::flattenSingleValue($purchased);\n        $firstPeriod = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod);\n        $salvage     = PHPExcel_Calculation_Functions::flattenSingleValue($salvage);\n        $period      = PHPExcel_Calculation_Functions::flattenSingleValue($period);\n        $rate        = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $basis       = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        $fOneRate = $cost * $rate;\n        $fCostDelta = $cost - $salvage;\n        //    Note, quirky variation for leap years on the YEARFRAC for this function\n        $purchasedYear = PHPExcel_Calculation_DateTime::YEAR($purchased);\n        $yearFrac = PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis);\n\n        if (($basis == 1) && ($yearFrac < 1) && (PHPExcel_Calculation_DateTime::isLeapYear($purchasedYear))) {\n            $yearFrac *= 365 / 366;\n        }\n\n        $f0Rate = $yearFrac * $rate * $cost;\n        $nNumOfFullPeriods = intval(($cost - $salvage - $f0Rate) / $fOneRate);\n\n        if ($period == 0) {\n            return $f0Rate;\n        } elseif ($period <= $nNumOfFullPeriods) {\n            return $fOneRate;\n        } elseif ($period == ($nNumOfFullPeriods + 1)) {\n            return ($fCostDelta - $fOneRate * $nNumOfFullPeriods - $f0Rate);\n        } else {\n            return 0.0;\n        }\n    }\n\n\n    /**\n     * COUPDAYBS\n     *\n     * Returns the number of days from the beginning of the coupon period to the settlement date.\n     *\n     * Excel Function:\n     *        COUPDAYBS(settlement,maturity,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    frequency    the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function COUPDAYBS($settlement, $maturity, $frequency, $basis = 0)\n    {\n        $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity   = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $frequency  = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis      = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis);\n        $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, false);\n\n        return PHPExcel_Calculation_DateTime::YEARFRAC($prev, $settlement, $basis) * $daysPerYear;\n    }\n\n\n    /**\n     * COUPDAYS\n     *\n     * Returns the number of days in the coupon period that contains the settlement date.\n     *\n     * Excel Function:\n     *        COUPDAYS(settlement,maturity,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    frequency    the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function COUPDAYS($settlement, $maturity, $frequency, $basis = 0)\n    {\n        $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity   = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $frequency  = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis      = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        switch ($basis) {\n            case 3:\n                // Actual/365\n                return 365 / $frequency;\n            case 1:\n                // Actual/actual\n                if ($frequency == 1) {\n                    $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($maturity), $basis);\n                    return ($daysPerYear / $frequency);\n                }\n                $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, false);\n                $next = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true);\n                return ($next - $prev);\n            default:\n                // US (NASD) 30/360, Actual/360 or European 30/360\n                return 360 / $frequency;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * COUPDAYSNC\n     *\n     * Returns the number of days from the settlement date to the next coupon date.\n     *\n     * Excel Function:\n     *        COUPDAYSNC(settlement,maturity,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    frequency    the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function COUPDAYSNC($settlement, $maturity, $frequency, $basis = 0)\n    {\n        $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity   = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $frequency  = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis      = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis);\n        $next = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true);\n\n        return PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $next, $basis) * $daysPerYear;\n    }\n\n\n    /**\n     * COUPNCD\n     *\n     * Returns the next coupon date after the settlement date.\n     *\n     * Excel Function:\n     *        COUPNCD(settlement,maturity,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    frequency    the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function COUPNCD($settlement, $maturity, $frequency, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $frequency    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis        = (is_null($basis))    ? 0 :    (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        return self::couponFirstPeriodDate($settlement, $maturity, $frequency, true);\n    }\n\n\n    /**\n     * COUPNUM\n     *\n     * Returns the number of coupons payable between the settlement date and maturity date,\n     * rounded up to the nearest whole coupon.\n     *\n     * Excel Function:\n     *        COUPNUM(settlement,maturity,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    frequency    the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    integer\n     */\n    public static function COUPNUM($settlement, $maturity, $frequency, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $frequency    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis        = (is_null($basis))    ? 0 :    (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        $settlement = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true);\n        $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis) * 365;\n\n        switch ($frequency) {\n            case 1: // annual payments\n                return ceil($daysBetweenSettlementAndMaturity / 360);\n            case 2: // half-yearly\n                return ceil($daysBetweenSettlementAndMaturity / 180);\n            case 4: // quarterly\n                return ceil($daysBetweenSettlementAndMaturity / 90);\n            case 6: // bimonthly\n                return ceil($daysBetweenSettlementAndMaturity / 60);\n            case 12: // monthly\n                return ceil($daysBetweenSettlementAndMaturity / 30);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * COUPPCD\n     *\n     * Returns the previous coupon date before the settlement date.\n     *\n     * Excel Function:\n     *        COUPPCD(settlement,maturity,frequency[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    frequency    the number of coupon payments per year.\n     *                                    Valid frequency values are:\n     *                                        1    Annual\n     *                                        2    Semi-Annual\n     *                                        4    Quarterly\n     *                                    If working in Gnumeric Mode, the following frequency options are\n     *                                    also available\n     *                                        6    Bimonthly\n     *                                        12    Monthly\n     * @param    integer        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    mixed    Excel date/time serial value, PHP date/time serial value or PHP date/time object,\n     *                        depending on the value of the ReturnDateType flag\n     */\n    public static function COUPPCD($settlement, $maturity, $frequency, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $frequency    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis        = (is_null($basis))    ? 0 :    (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        return self::couponFirstPeriodDate($settlement, $maturity, $frequency, false);\n    }\n\n\n    /**\n     * CUMIPMT\n     *\n     * Returns the cumulative interest paid on a loan between the start and end periods.\n     *\n     * Excel Function:\n     *        CUMIPMT(rate,nper,pv,start,end[,type])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    $rate    The Interest rate\n     * @param    integer    $nper    The total number of payment periods\n     * @param    float    $pv        Present Value\n     * @param    integer    $start    The first period in the calculation.\n     *                            Payment periods are numbered beginning with 1.\n     * @param    integer    $end    The last period in the calculation.\n     * @param    integer    $type    A number 0 or 1 and indicates when payments are due:\n     *                                0 or omitted    At the end of the period.\n     *                                1                At the beginning of the period.\n     * @return    float\n     */\n    public static function CUMIPMT($rate, $nper, $pv, $start, $end, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $nper    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $start    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($start);\n        $end    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($end);\n        $type    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ($start < 1 || $start > $end) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Calculate\n        $interest = 0;\n        for ($per = $start; $per <= $end; ++$per) {\n            $interest += self::IPMT($rate, $per, $nper, $pv, 0, $type);\n        }\n\n        return $interest;\n    }\n\n\n    /**\n     * CUMPRINC\n     *\n     * Returns the cumulative principal paid on a loan between the start and end periods.\n     *\n     * Excel Function:\n     *        CUMPRINC(rate,nper,pv,start,end[,type])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    $rate    The Interest rate\n     * @param    integer    $nper    The total number of payment periods\n     * @param    float    $pv        Present Value\n     * @param    integer    $start    The first period in the calculation.\n     *                            Payment periods are numbered beginning with 1.\n     * @param    integer    $end    The last period in the calculation.\n     * @param    integer    $type    A number 0 or 1 and indicates when payments are due:\n     *                                0 or omitted    At the end of the period.\n     *                                1                At the beginning of the period.\n     * @return    float\n     */\n    public static function CUMPRINC($rate, $nper, $pv, $start, $end, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $nper    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $start    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($start);\n        $end    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($end);\n        $type    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ($start < 1 || $start > $end) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Calculate\n        $principal = 0;\n        for ($per = $start; $per <= $end; ++$per) {\n            $principal += self::PPMT($rate, $per, $nper, $pv, 0, $type);\n        }\n\n        return $principal;\n    }\n\n\n    /**\n     * DB\n     *\n     * Returns the depreciation of an asset for a specified period using the\n     * fixed-declining balance method.\n     * This form of depreciation is used if you want to get a higher depreciation value\n     * at the beginning of the depreciation (as opposed to linear depreciation). The\n     * depreciation value is reduced with every depreciation period by the depreciation\n     * already deducted from the initial cost.\n     *\n     * Excel Function:\n     *        DB(cost,salvage,life,period[,month])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    cost        Initial cost of the asset.\n     * @param    float    salvage        Value at the end of the depreciation.\n     *                                (Sometimes called the salvage value of the asset)\n     * @param    integer    life        Number of periods over which the asset is depreciated.\n     *                                (Sometimes called the useful life of the asset)\n     * @param    integer    period        The period for which you want to calculate the\n     *                                depreciation. Period must use the same units as life.\n     * @param    integer    month        Number of months in the first year. If month is omitted,\n     *                                it defaults to 12.\n     * @return    float\n     */\n    public static function DB($cost, $salvage, $life, $period, $month = 12)\n    {\n        $cost        = PHPExcel_Calculation_Functions::flattenSingleValue($cost);\n        $salvage    = PHPExcel_Calculation_Functions::flattenSingleValue($salvage);\n        $life        = PHPExcel_Calculation_Functions::flattenSingleValue($life);\n        $period        = PHPExcel_Calculation_Functions::flattenSingleValue($period);\n        $month        = PHPExcel_Calculation_Functions::flattenSingleValue($month);\n\n        //    Validate\n        if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($month))) {\n            $cost    = (float) $cost;\n            $salvage = (float) $salvage;\n            $life    = (int) $life;\n            $period  = (int) $period;\n            $month   = (int) $month;\n            if ($cost == 0) {\n                return 0.0;\n            } elseif (($cost < 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($month < 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            //    Set Fixed Depreciation Rate\n            $fixedDepreciationRate = 1 - pow(($salvage / $cost), (1 / $life));\n            $fixedDepreciationRate = round($fixedDepreciationRate, 3);\n\n            //    Loop through each period calculating the depreciation\n            $previousDepreciation = 0;\n            for ($per = 1; $per <= $period; ++$per) {\n                if ($per == 1) {\n                    $depreciation = $cost * $fixedDepreciationRate * $month / 12;\n                } elseif ($per == ($life + 1)) {\n                    $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate * (12 - $month) / 12;\n                } else {\n                    $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate;\n                }\n                $previousDepreciation += $depreciation;\n            }\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                $depreciation = round($depreciation, 2);\n            }\n            return $depreciation;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * DDB\n     *\n     * Returns the depreciation of an asset for a specified period using the\n     * double-declining balance method or some other method you specify.\n     *\n     * Excel Function:\n     *        DDB(cost,salvage,life,period[,factor])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    cost        Initial cost of the asset.\n     * @param    float    salvage        Value at the end of the depreciation.\n     *                                (Sometimes called the salvage value of the asset)\n     * @param    integer    life        Number of periods over which the asset is depreciated.\n     *                                (Sometimes called the useful life of the asset)\n     * @param    integer    period        The period for which you want to calculate the\n     *                                depreciation. Period must use the same units as life.\n     * @param    float    factor        The rate at which the balance declines.\n     *                                If factor is omitted, it is assumed to be 2 (the\n     *                                double-declining balance method).\n     * @return    float\n     */\n    public static function DDB($cost, $salvage, $life, $period, $factor = 2.0)\n    {\n        $cost        = PHPExcel_Calculation_Functions::flattenSingleValue($cost);\n        $salvage    = PHPExcel_Calculation_Functions::flattenSingleValue($salvage);\n        $life        = PHPExcel_Calculation_Functions::flattenSingleValue($life);\n        $period        = PHPExcel_Calculation_Functions::flattenSingleValue($period);\n        $factor        = PHPExcel_Calculation_Functions::flattenSingleValue($factor);\n\n        //    Validate\n        if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($factor))) {\n            $cost    = (float) $cost;\n            $salvage = (float) $salvage;\n            $life    = (int) $life;\n            $period  = (int) $period;\n            $factor  = (float) $factor;\n            if (($cost <= 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($factor <= 0.0) || ($period > $life)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            //    Set Fixed Depreciation Rate\n            $fixedDepreciationRate = 1 - pow(($salvage / $cost), (1 / $life));\n            $fixedDepreciationRate = round($fixedDepreciationRate, 3);\n\n            //    Loop through each period calculating the depreciation\n            $previousDepreciation = 0;\n            for ($per = 1; $per <= $period; ++$per) {\n                $depreciation = min(($cost - $previousDepreciation) * ($factor / $life), ($cost - $salvage - $previousDepreciation));\n                $previousDepreciation += $depreciation;\n            }\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                $depreciation = round($depreciation, 2);\n            }\n            return $depreciation;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * DISC\n     *\n     * Returns the discount rate for a security.\n     *\n     * Excel Function:\n     *        DISC(settlement,maturity,price,redemption[,basis])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue\n     *                                date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    integer    price        The security's price per $100 face value.\n     * @param    integer    redemption    The security's redemption value per $100 face value.\n     * @param    integer    basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function DISC($settlement, $maturity, $price, $redemption, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $price        = PHPExcel_Calculation_Functions::flattenSingleValue($price);\n        $redemption    = PHPExcel_Calculation_Functions::flattenSingleValue($redemption);\n        $basis        = PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if ((is_numeric($price)) && (is_numeric($redemption)) && (is_numeric($basis))) {\n            $price        = (float) $price;\n            $redemption    = (float) $redemption;\n            $basis        = (int) $basis;\n            if (($price <= 0) || ($redemption <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n\n            return ((1 - $price / $redemption) / $daysBetweenSettlementAndMaturity);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * DOLLARDE\n     *\n     * Converts a dollar price expressed as an integer part and a fraction\n     *        part into a dollar price expressed as a decimal number.\n     * Fractional dollar numbers are sometimes used for security prices.\n     *\n     * Excel Function:\n     *        DOLLARDE(fractional_dollar,fraction)\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    $fractional_dollar    Fractional Dollar\n     * @param    integer    $fraction            Fraction\n     * @return    float\n     */\n    public static function DOLLARDE($fractional_dollar = null, $fraction = 0)\n    {\n        $fractional_dollar    = PHPExcel_Calculation_Functions::flattenSingleValue($fractional_dollar);\n        $fraction            = (int)PHPExcel_Calculation_Functions::flattenSingleValue($fraction);\n\n        // Validate parameters\n        if (is_null($fractional_dollar) || $fraction < 0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ($fraction == 0) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $dollars = floor($fractional_dollar);\n        $cents = fmod($fractional_dollar, 1);\n        $cents /= $fraction;\n        $cents *= pow(10, ceil(log10($fraction)));\n        return $dollars + $cents;\n    }\n\n\n    /**\n     * DOLLARFR\n     *\n     * Converts a dollar price expressed as a decimal number into a dollar price\n     *        expressed as a fraction.\n     * Fractional dollar numbers are sometimes used for security prices.\n     *\n     * Excel Function:\n     *        DOLLARFR(decimal_dollar,fraction)\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    $decimal_dollar        Decimal Dollar\n     * @param    integer    $fraction            Fraction\n     * @return    float\n     */\n    public static function DOLLARFR($decimal_dollar = null, $fraction = 0)\n    {\n        $decimal_dollar    = PHPExcel_Calculation_Functions::flattenSingleValue($decimal_dollar);\n        $fraction        = (int)PHPExcel_Calculation_Functions::flattenSingleValue($fraction);\n\n        // Validate parameters\n        if (is_null($decimal_dollar) || $fraction < 0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ($fraction == 0) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $dollars = floor($decimal_dollar);\n        $cents = fmod($decimal_dollar, 1);\n        $cents *= $fraction;\n        $cents *= pow(10, -ceil(log10($fraction)));\n        return $dollars + $cents;\n    }\n\n\n    /**\n     * EFFECT\n     *\n     * Returns the effective interest rate given the nominal rate and the number of\n     *        compounding payments per year.\n     *\n     * Excel Function:\n     *        EFFECT(nominal_rate,npery)\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    $nominal_rate        Nominal interest rate\n     * @param    integer    $npery                Number of compounding payments per year\n     * @return    float\n     */\n    public static function EFFECT($nominal_rate = 0, $npery = 0)\n    {\n        $nominal_rate    = PHPExcel_Calculation_Functions::flattenSingleValue($nominal_rate);\n        $npery            = (int)PHPExcel_Calculation_Functions::flattenSingleValue($npery);\n\n        // Validate parameters\n        if ($nominal_rate <= 0 || $npery < 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        return pow((1 + $nominal_rate / $npery), $npery) - 1;\n    }\n\n\n    /**\n     * FV\n     *\n     * Returns the Future Value of a cash flow with constant payments and interest rate (annuities).\n     *\n     * Excel Function:\n     *        FV(rate,nper,pmt[,pv[,type]])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    $rate    The interest rate per period\n     * @param    int        $nper    Total number of payment periods in an annuity\n     * @param    float    $pmt    The payment made each period: it cannot change over the\n     *                            life of the annuity. Typically, pmt contains principal\n     *                            and interest but no other fees or taxes.\n     * @param    float    $pv        Present Value, or the lump-sum amount that a series of\n     *                            future payments is worth right now.\n     * @param    integer    $type    A number 0 or 1 and indicates when payments are due:\n     *                                0 or omitted    At the end of the period.\n     *                                1                At the beginning of the period.\n     * @return    float\n     */\n    public static function FV($rate = 0, $nper = 0, $pmt = 0, $pv = 0, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $nper    = PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pmt    = PHPExcel_Calculation_Functions::flattenSingleValue($pmt);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $type    = PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Calculate\n        if (!is_null($rate) && $rate != 0) {\n            return -$pv * pow(1 + $rate, $nper) - $pmt * (1 + $rate * $type) * (pow(1 + $rate, $nper) - 1) / $rate;\n        }\n        return -$pv - $pmt * $nper;\n    }\n\n\n    /**\n     * FVSCHEDULE\n     *\n     * Returns the future value of an initial principal after applying a series of compound interest rates.\n     * Use FVSCHEDULE to calculate the future value of an investment with a variable or adjustable rate.\n     *\n     * Excel Function:\n     *        FVSCHEDULE(principal,schedule)\n     *\n     * @param    float    $principal    The present value.\n     * @param    float[]    $schedule    An array of interest rates to apply.\n     * @return    float\n     */\n    public static function FVSCHEDULE($principal, $schedule)\n    {\n        $principal    = PHPExcel_Calculation_Functions::flattenSingleValue($principal);\n        $schedule    = PHPExcel_Calculation_Functions::flattenArray($schedule);\n\n        foreach ($schedule as $rate) {\n            $principal *= 1 + $rate;\n        }\n\n        return $principal;\n    }\n\n\n    /**\n     * INTRATE\n     *\n     * Returns the interest rate for a fully invested security.\n     *\n     * Excel Function:\n     *        INTRATE(settlement,maturity,investment,redemption[,basis])\n     *\n     * @param    mixed    $settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue date when the security is traded to the buyer.\n     * @param    mixed    $maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    integer    $investment    The amount invested in the security.\n     * @param    integer    $redemption    The amount to be received at maturity.\n     * @param    integer    $basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function INTRATE($settlement, $maturity, $investment, $redemption, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $investment    = PHPExcel_Calculation_Functions::flattenSingleValue($investment);\n        $redemption    = PHPExcel_Calculation_Functions::flattenSingleValue($redemption);\n        $basis        = PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if ((is_numeric($investment)) && (is_numeric($redemption)) && (is_numeric($basis))) {\n            $investment    = (float) $investment;\n            $redemption    = (float) $redemption;\n            $basis        = (int) $basis;\n            if (($investment <= 0) || ($redemption <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n\n            return (($redemption / $investment) - 1) / ($daysBetweenSettlementAndMaturity);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * IPMT\n     *\n     * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate.\n     *\n     * Excel Function:\n     *        IPMT(rate,per,nper,pv[,fv][,type])\n     *\n     * @param    float    $rate    Interest rate per period\n     * @param    int        $per    Period for which we want to find the interest\n     * @param    int        $nper    Number of periods\n     * @param    float    $pv        Present Value\n     * @param    float    $fv        Future Value\n     * @param    int        $type    Payment type: 0 = at the end of each period, 1 = at the beginning of each period\n     * @return    float\n     */\n    public static function IPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $per    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($per);\n        $nper    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $fv        = PHPExcel_Calculation_Functions::flattenSingleValue($fv);\n        $type    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ($per <= 0 || $per > $nper) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Calculate\n        $interestAndPrincipal = self::interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type);\n        return $interestAndPrincipal[0];\n    }\n\n    /**\n     * IRR\n     *\n     * Returns the internal rate of return for a series of cash flows represented by the numbers in values.\n     * These cash flows do not have to be even, as they would be for an annuity. However, the cash flows must occur\n     * at regular intervals, such as monthly or annually. The internal rate of return is the interest rate received\n     * for an investment consisting of payments (negative values) and income (positive values) that occur at regular\n     * periods.\n     *\n     * Excel Function:\n     *        IRR(values[,guess])\n     *\n     * @param    float[]    $values        An array or a reference to cells that contain numbers for which you want\n     *                                    to calculate the internal rate of return.\n     *                                Values must contain at least one positive value and one negative value to\n     *                                    calculate the internal rate of return.\n     * @param    float    $guess        A number that you guess is close to the result of IRR\n     * @return    float\n     */\n    public static function IRR($values, $guess = 0.1)\n    {\n        if (!is_array($values)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $values = PHPExcel_Calculation_Functions::flattenArray($values);\n        $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess);\n\n        // create an initial range, with a root somewhere between 0 and guess\n        $x1 = 0.0;\n        $x2 = $guess;\n        $f1 = self::NPV($x1, $values);\n        $f2 = self::NPV($x2, $values);\n        for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) {\n            if (($f1 * $f2) < 0.0) {\n                break;\n            }\n            if (abs($f1) < abs($f2)) {\n                $f1 = self::NPV($x1 += 1.6 * ($x1 - $x2), $values);\n            } else {\n                $f2 = self::NPV($x2 += 1.6 * ($x2 - $x1), $values);\n            }\n        }\n        if (($f1 * $f2) > 0.0) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        $f = self::NPV($x1, $values);\n        if ($f < 0.0) {\n            $rtb = $x1;\n            $dx = $x2 - $x1;\n        } else {\n            $rtb = $x2;\n            $dx = $x1 - $x2;\n        }\n\n        for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) {\n            $dx *= 0.5;\n            $x_mid = $rtb + $dx;\n            $f_mid = self::NPV($x_mid, $values);\n            if ($f_mid <= 0.0) {\n                $rtb = $x_mid;\n            }\n            if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) {\n                return $x_mid;\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * ISPMT\n     *\n     * Returns the interest payment for an investment based on an interest rate and a constant payment schedule.\n     *\n     * Excel Function:\n     *     =ISPMT(interest_rate, period, number_payments, PV)\n     *\n     * interest_rate is the interest rate for the investment\n     *\n     * period is the period to calculate the interest rate.  It must be betweeen 1 and number_payments.\n     *\n     * number_payments is the number of payments for the annuity\n     *\n     * PV is the loan amount or present value of the payments\n     */\n    public static function ISPMT()\n    {\n        // Return value\n        $returnValue = 0;\n\n        // Get the parameters\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        $interestRate = array_shift($aArgs);\n        $period = array_shift($aArgs);\n        $numberPeriods = array_shift($aArgs);\n        $principleRemaining = array_shift($aArgs);\n\n        // Calculate\n        $principlePayment = ($principleRemaining * 1.0) / ($numberPeriods * 1.0);\n        for ($i=0; $i <= $period; ++$i) {\n            $returnValue = $interestRate * $principleRemaining * -1;\n            $principleRemaining -= $principlePayment;\n            // principle needs to be 0 after the last payment, don't let floating point screw it up\n            if ($i == $numberPeriods) {\n                $returnValue = 0;\n            }\n        }\n        return($returnValue);\n    }\n\n\n    /**\n     * MIRR\n     *\n     * Returns the modified internal rate of return for a series of periodic cash flows. MIRR considers both\n     *        the cost of the investment and the interest received on reinvestment of cash.\n     *\n     * Excel Function:\n     *        MIRR(values,finance_rate, reinvestment_rate)\n     *\n     * @param    float[]    $values                An array or a reference to cells that contain a series of payments and\n     *                                            income occurring at regular intervals.\n     *                                        Payments are negative value, income is positive values.\n     * @param    float    $finance_rate        The interest rate you pay on the money used in the cash flows\n     * @param    float    $reinvestment_rate    The interest rate you receive on the cash flows as you reinvest them\n     * @return    float\n     */\n    public static function MIRR($values, $finance_rate, $reinvestment_rate)\n    {\n        if (!is_array($values)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $values                = PHPExcel_Calculation_Functions::flattenArray($values);\n        $finance_rate        = PHPExcel_Calculation_Functions::flattenSingleValue($finance_rate);\n        $reinvestment_rate    = PHPExcel_Calculation_Functions::flattenSingleValue($reinvestment_rate);\n        $n = count($values);\n\n        $rr = 1.0 + $reinvestment_rate;\n        $fr = 1.0 + $finance_rate;\n\n        $npv_pos = $npv_neg = 0.0;\n        foreach ($values as $i => $v) {\n            if ($v >= 0) {\n                $npv_pos += $v / pow($rr, $i);\n            } else {\n                $npv_neg += $v / pow($fr, $i);\n            }\n        }\n\n        if (($npv_neg == 0) || ($npv_pos == 0) || ($reinvestment_rate <= -1)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        $mirr = pow((-$npv_pos * pow($rr, $n))\n                / ($npv_neg * ($rr)), (1.0 / ($n - 1))) - 1.0;\n\n        return (is_finite($mirr) ? $mirr : PHPExcel_Calculation_Functions::VALUE());\n    }\n\n\n    /**\n     * NOMINAL\n     *\n     * Returns the nominal interest rate given the effective rate and the number of compounding payments per year.\n     *\n     * @param    float    $effect_rate    Effective interest rate\n     * @param    int        $npery            Number of compounding payments per year\n     * @return    float\n     */\n    public static function NOMINAL($effect_rate = 0, $npery = 0)\n    {\n        $effect_rate    = PHPExcel_Calculation_Functions::flattenSingleValue($effect_rate);\n        $npery            = (int)PHPExcel_Calculation_Functions::flattenSingleValue($npery);\n\n        // Validate parameters\n        if ($effect_rate <= 0 || $npery < 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Calculate\n        return $npery * (pow($effect_rate + 1, 1 / $npery) - 1);\n    }\n\n\n    /**\n     * NPER\n     *\n     * Returns the number of periods for a cash flow with constant periodic payments (annuities), and interest rate.\n     *\n     * @param    float    $rate    Interest rate per period\n     * @param    int        $pmt    Periodic payment (annuity)\n     * @param    float    $pv        Present Value\n     * @param    float    $fv        Future Value\n     * @param    int        $type    Payment type: 0 = at the end of each period, 1 = at the beginning of each period\n     * @return    float\n     */\n    public static function NPER($rate = 0, $pmt = 0, $pv = 0, $fv = 0, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $pmt    = PHPExcel_Calculation_Functions::flattenSingleValue($pmt);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $fv        = PHPExcel_Calculation_Functions::flattenSingleValue($fv);\n        $type    = PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Calculate\n        if (!is_null($rate) && $rate != 0) {\n            if ($pmt == 0 && $pv == 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return log(($pmt * (1 + $rate * $type) / $rate - $fv) / ($pv + $pmt * (1 + $rate * $type) / $rate)) / log(1 + $rate);\n        }\n        if ($pmt == 0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return (-$pv -$fv) / $pmt;\n    }\n\n    /**\n     * NPV\n     *\n     * Returns the Net Present Value of a cash flow series given a discount rate.\n     *\n     * @return    float\n     */\n    public static function NPV()\n    {\n        // Return value\n        $returnValue = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $rate = array_shift($aArgs);\n        for ($i = 1; $i <= count($aArgs); ++$i) {\n            // Is it a numeric value?\n            if (is_numeric($aArgs[$i - 1])) {\n                $returnValue += $aArgs[$i - 1] / pow(1 + $rate, $i);\n            }\n        }\n\n        // Return\n        return $returnValue;\n    }\n\n    /**\n     * PMT\n     *\n     * Returns the constant payment (annuity) for a cash flow with a constant interest rate.\n     *\n     * @param    float    $rate    Interest rate per period\n     * @param    int        $nper    Number of periods\n     * @param    float    $pv        Present Value\n     * @param    float    $fv        Future Value\n     * @param    int        $type    Payment type: 0 = at the end of each period, 1 = at the beginning of each period\n     * @return    float\n     */\n    public static function PMT($rate = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $nper    = PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $fv        = PHPExcel_Calculation_Functions::flattenSingleValue($fv);\n        $type    = PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Calculate\n        if (!is_null($rate) && $rate != 0) {\n            return (-$fv - $pv * pow(1 + $rate, $nper)) / (1 + $rate * $type) / ((pow(1 + $rate, $nper) - 1) / $rate);\n        }\n        return (-$pv - $fv) / $nper;\n    }\n\n\n    /**\n     * PPMT\n     *\n     * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate.\n     *\n     * @param    float    $rate    Interest rate per period\n     * @param    int        $per    Period for which we want to find the interest\n     * @param    int        $nper    Number of periods\n     * @param    float    $pv        Present Value\n     * @param    float    $fv        Future Value\n     * @param    int        $type    Payment type: 0 = at the end of each period, 1 = at the beginning of each period\n     * @return    float\n     */\n    public static function PPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $per    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($per);\n        $nper    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $fv        = PHPExcel_Calculation_Functions::flattenSingleValue($fv);\n        $type    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ($per <= 0 || $per > $nper) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // Calculate\n        $interestAndPrincipal = self::interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type);\n        return $interestAndPrincipal[1];\n    }\n\n\n    public static function PRICE($settlement, $maturity, $rate, $yield, $redemption, $frequency, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $rate        = (float) PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $yield        = (float) PHPExcel_Calculation_Functions::flattenSingleValue($yield);\n        $redemption    = (float) PHPExcel_Calculation_Functions::flattenSingleValue($redemption);\n        $frequency    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency);\n        $basis        = (is_null($basis))    ? 0 :    (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (($settlement > $maturity) ||\n            (!self::isValidFrequency($frequency)) ||\n            (($basis < 0) || ($basis > 4))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        $dsc = self::COUPDAYSNC($settlement, $maturity, $frequency, $basis);\n        $e = self::COUPDAYS($settlement, $maturity, $frequency, $basis);\n        $n = self::COUPNUM($settlement, $maturity, $frequency, $basis);\n        $a = self::COUPDAYBS($settlement, $maturity, $frequency, $basis);\n\n        $baseYF    = 1.0 + ($yield / $frequency);\n        $rfp    = 100 * ($rate / $frequency);\n        $de    = $dsc / $e;\n\n        $result = $redemption / pow($baseYF, (--$n + $de));\n        for ($k = 0; $k <= $n; ++$k) {\n            $result += $rfp / (pow($baseYF, ($k + $de)));\n        }\n        $result -= $rfp * ($a / $e);\n\n        return $result;\n    }\n\n\n    /**\n     * PRICEDISC\n     *\n     * Returns the price per $100 face value of a discounted security.\n     *\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    int        discount    The security's discount rate.\n     * @param    int        redemption    The security's redemption value per $100 face value.\n     * @param    int        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function PRICEDISC($settlement, $maturity, $discount, $redemption, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $discount    = (float) PHPExcel_Calculation_Functions::flattenSingleValue($discount);\n        $redemption    = (float) PHPExcel_Calculation_Functions::flattenSingleValue($redemption);\n        $basis        = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if ((is_numeric($discount)) && (is_numeric($redemption)) && (is_numeric($basis))) {\n            if (($discount <= 0) || ($redemption <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n\n            return $redemption * (1 - $discount * $daysBetweenSettlementAndMaturity);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * PRICEMAT\n     *\n     * Returns the price per $100 face value of a security that pays interest at maturity.\n     *\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security's settlement date is the date after the issue date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    mixed    issue        The security's issue date.\n     * @param    int        rate        The security's interest rate at date of issue.\n     * @param    int        yield        The security's annual yield.\n     * @param    int        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function PRICEMAT($settlement, $maturity, $issue, $rate, $yield, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $issue        = PHPExcel_Calculation_Functions::flattenSingleValue($issue);\n        $rate        = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $yield        = PHPExcel_Calculation_Functions::flattenSingleValue($yield);\n        $basis        = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if (is_numeric($rate) && is_numeric($yield)) {\n            if (($rate <= 0) || ($yield <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis);\n            if (!is_numeric($daysPerYear)) {\n                return $daysPerYear;\n            }\n            $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis);\n            if (!is_numeric($daysBetweenIssueAndSettlement)) {\n                //    return date error\n                return $daysBetweenIssueAndSettlement;\n            }\n            $daysBetweenIssueAndSettlement *= $daysPerYear;\n            $daysBetweenIssueAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $maturity, $basis);\n            if (!is_numeric($daysBetweenIssueAndMaturity)) {\n                //    return date error\n                return $daysBetweenIssueAndMaturity;\n            }\n            $daysBetweenIssueAndMaturity *= $daysPerYear;\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n            $daysBetweenSettlementAndMaturity *= $daysPerYear;\n\n            return ((100 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate * 100)) /\n                   (1 + (($daysBetweenSettlementAndMaturity / $daysPerYear) * $yield)) -\n                   (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate * 100));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * PV\n     *\n     * Returns the Present Value of a cash flow with constant payments and interest rate (annuities).\n     *\n     * @param    float    $rate    Interest rate per period\n     * @param    int        $nper    Number of periods\n     * @param    float    $pmt    Periodic payment (annuity)\n     * @param    float    $fv        Future Value\n     * @param    int        $type    Payment type: 0 = at the end of each period, 1 = at the beginning of each period\n     * @return    float\n     */\n    public static function PV($rate = 0, $nper = 0, $pmt = 0, $fv = 0, $type = 0)\n    {\n        $rate    = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $nper    = PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pmt    = PHPExcel_Calculation_Functions::flattenSingleValue($pmt);\n        $fv        = PHPExcel_Calculation_Functions::flattenSingleValue($fv);\n        $type    = PHPExcel_Calculation_Functions::flattenSingleValue($type);\n\n        // Validate parameters\n        if ($type != 0 && $type != 1) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // Calculate\n        if (!is_null($rate) && $rate != 0) {\n            return (-$pmt * (1 + $rate * $type) * ((pow(1 + $rate, $nper) - 1) / $rate) - $fv) / pow(1 + $rate, $nper);\n        }\n        return -$fv - $pmt * $nper;\n    }\n\n\n    /**\n     * RATE\n     *\n     * Returns the interest rate per period of an annuity.\n     * RATE is calculated by iteration and can have zero or more solutions.\n     * If the successive results of RATE do not converge to within 0.0000001 after 20 iterations,\n     * RATE returns the #NUM! error value.\n     *\n     * Excel Function:\n     *        RATE(nper,pmt,pv[,fv[,type[,guess]]])\n     *\n     * @access    public\n     * @category Financial Functions\n     * @param    float    nper        The total number of payment periods in an annuity.\n     * @param    float    pmt            The payment made each period and cannot change over the life\n     *                                    of the annuity.\n     *                                Typically, pmt includes principal and interest but no other\n     *                                    fees or taxes.\n     * @param    float    pv            The present value - the total amount that a series of future\n     *                                    payments is worth now.\n     * @param    float    fv            The future value, or a cash balance you want to attain after\n     *                                    the last payment is made. If fv is omitted, it is assumed\n     *                                    to be 0 (the future value of a loan, for example, is 0).\n     * @param    integer    type        A number 0 or 1 and indicates when payments are due:\n     *                                        0 or omitted    At the end of the period.\n     *                                        1                At the beginning of the period.\n     * @param    float    guess        Your guess for what the rate will be.\n     *                                    If you omit guess, it is assumed to be 10 percent.\n     * @return    float\n     **/\n    public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1)\n    {\n        $nper    = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper);\n        $pmt    = PHPExcel_Calculation_Functions::flattenSingleValue($pmt);\n        $pv        = PHPExcel_Calculation_Functions::flattenSingleValue($pv);\n        $fv        = (is_null($fv))    ? 0.0    :    PHPExcel_Calculation_Functions::flattenSingleValue($fv);\n        $type    = (is_null($type))    ? 0        :    (int) PHPExcel_Calculation_Functions::flattenSingleValue($type);\n        $guess    = (is_null($guess))    ? 0.1    :    PHPExcel_Calculation_Functions::flattenSingleValue($guess);\n\n        $rate = $guess;\n        if (abs($rate) < FINANCIAL_PRECISION) {\n            $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;\n        } else {\n            $f = exp($nper * log(1 + $rate));\n            $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;\n        }\n        $y0 = $pv + $pmt * $nper + $fv;\n        $y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;\n\n        // find root by secant method\n        $i  = $x0 = 0.0;\n        $x1 = $rate;\n        while ((abs($y0 - $y1) > FINANCIAL_PRECISION) && ($i < FINANCIAL_MAX_ITERATIONS)) {\n            $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);\n            $x0 = $x1;\n            $x1 = $rate;\n            if (($nper * abs($pmt)) > ($pv - $fv)) {\n                $x1 = abs($x1);\n            }\n            if (abs($rate) < FINANCIAL_PRECISION) {\n                $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;\n            } else {\n                $f = exp($nper * log(1 + $rate));\n                $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;\n            }\n\n            $y0 = $y1;\n            $y1 = $y;\n            ++$i;\n        }\n        return $rate;\n    }\n\n\n    /**\n     * RECEIVED\n     *\n     * Returns the price per $100 face value of a discounted security.\n     *\n     * @param    mixed    settlement    The security's settlement date.\n     *                                The security settlement date is the date after the issue date when the security is traded to the buyer.\n     * @param    mixed    maturity    The security's maturity date.\n     *                                The maturity date is the date when the security expires.\n     * @param    int        investment    The amount invested in the security.\n     * @param    int        discount    The security's discount rate.\n     * @param    int        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function RECEIVED($settlement, $maturity, $investment, $discount, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $investment    = (float) PHPExcel_Calculation_Functions::flattenSingleValue($investment);\n        $discount    = (float) PHPExcel_Calculation_Functions::flattenSingleValue($discount);\n        $basis        = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if ((is_numeric($investment)) && (is_numeric($discount)) && (is_numeric($basis))) {\n            if (($investment <= 0) || ($discount <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n\n            return $investment / ( 1 - ($discount * $daysBetweenSettlementAndMaturity));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SLN\n     *\n     * Returns the straight-line depreciation of an asset for one period\n     *\n     * @param    cost        Initial cost of the asset\n     * @param    salvage        Value at the end of the depreciation\n     * @param    life        Number of periods over which the asset is depreciated\n     * @return    float\n     */\n    public static function SLN($cost, $salvage, $life)\n    {\n        $cost        = PHPExcel_Calculation_Functions::flattenSingleValue($cost);\n        $salvage    = PHPExcel_Calculation_Functions::flattenSingleValue($salvage);\n        $life        = PHPExcel_Calculation_Functions::flattenSingleValue($life);\n\n        // Calculate\n        if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life))) {\n            if ($life < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return ($cost - $salvage) / $life;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SYD\n     *\n     * Returns the sum-of-years' digits depreciation of an asset for a specified period.\n     *\n     * @param    cost        Initial cost of the asset\n     * @param    salvage        Value at the end of the depreciation\n     * @param    life        Number of periods over which the asset is depreciated\n     * @param    period        Period\n     * @return    float\n     */\n    public static function SYD($cost, $salvage, $life, $period)\n    {\n        $cost        = PHPExcel_Calculation_Functions::flattenSingleValue($cost);\n        $salvage    = PHPExcel_Calculation_Functions::flattenSingleValue($salvage);\n        $life        = PHPExcel_Calculation_Functions::flattenSingleValue($life);\n        $period        = PHPExcel_Calculation_Functions::flattenSingleValue($period);\n\n        // Calculate\n        if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period))) {\n            if (($life < 1) || ($period > $life)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return (($cost - $salvage) * ($life - $period + 1) * 2) / ($life * ($life + 1));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * TBILLEQ\n     *\n     * Returns the bond-equivalent yield for a Treasury bill.\n     *\n     * @param    mixed    settlement    The Treasury bill's settlement date.\n     *                                The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n     * @param    mixed    maturity    The Treasury bill's maturity date.\n     *                                The maturity date is the date when the Treasury bill expires.\n     * @param    int        discount    The Treasury bill's discount rate.\n     * @return    float\n     */\n    public static function TBILLEQ($settlement, $maturity, $discount)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $discount    = PHPExcel_Calculation_Functions::flattenSingleValue($discount);\n\n        //    Use TBILLPRICE for validation\n        $testValue = self::TBILLPRICE($settlement, $maturity, $discount);\n        if (is_string($testValue)) {\n            return $testValue;\n        }\n\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n            ++$maturity;\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360;\n        } else {\n            $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::getDateValue($maturity) - PHPExcel_Calculation_DateTime::getDateValue($settlement));\n        }\n\n        return (365 * $discount) / (360 - $discount * $daysBetweenSettlementAndMaturity);\n    }\n\n\n    /**\n     * TBILLPRICE\n     *\n     * Returns the yield for a Treasury bill.\n     *\n     * @param    mixed    settlement    The Treasury bill's settlement date.\n     *                                The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n     * @param    mixed    maturity    The Treasury bill's maturity date.\n     *                                The maturity date is the date when the Treasury bill expires.\n     * @param    int        discount    The Treasury bill's discount rate.\n     * @return    float\n     */\n    public static function TBILLPRICE($settlement, $maturity, $discount)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $discount    = PHPExcel_Calculation_Functions::flattenSingleValue($discount);\n\n        if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        //    Validate\n        if (is_numeric($discount)) {\n            if ($discount <= 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                ++$maturity;\n                $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360;\n                if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                    //    return date error\n                    return $daysBetweenSettlementAndMaturity;\n                }\n            } else {\n                $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::getDateValue($maturity) - PHPExcel_Calculation_DateTime::getDateValue($settlement));\n            }\n\n            if ($daysBetweenSettlementAndMaturity > 360) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            $price = 100 * (1 - (($discount * $daysBetweenSettlementAndMaturity) / 360));\n            if ($price <= 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return $price;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * TBILLYIELD\n     *\n     * Returns the yield for a Treasury bill.\n     *\n     * @param    mixed    settlement    The Treasury bill's settlement date.\n     *                                The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n     * @param    mixed    maturity    The Treasury bill's maturity date.\n     *                                The maturity date is the date when the Treasury bill expires.\n     * @param    int        price        The Treasury bill's price per $100 face value.\n     * @return    float\n     */\n    public static function TBILLYIELD($settlement, $maturity, $price)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $price        = PHPExcel_Calculation_Functions::flattenSingleValue($price);\n\n        //    Validate\n        if (is_numeric($price)) {\n            if ($price <= 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                ++$maturity;\n                $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360;\n                if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                    //    return date error\n                    return $daysBetweenSettlementAndMaturity;\n                }\n            } else {\n                $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::getDateValue($maturity) - PHPExcel_Calculation_DateTime::getDateValue($settlement));\n            }\n\n            if ($daysBetweenSettlementAndMaturity > 360) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            return ((100 - $price) / $price) * (360 / $daysBetweenSettlementAndMaturity);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    public static function XIRR($values, $dates, $guess = 0.1)\n    {\n        if ((!is_array($values)) && (!is_array($dates))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $values = PHPExcel_Calculation_Functions::flattenArray($values);\n        $dates  = PHPExcel_Calculation_Functions::flattenArray($dates);\n        $guess  = PHPExcel_Calculation_Functions::flattenSingleValue($guess);\n        if (count($values) != count($dates)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        // create an initial range, with a root somewhere between 0 and guess\n        $x1 = 0.0;\n        $x2 = $guess;\n        $f1 = self::XNPV($x1, $values, $dates);\n        $f2 = self::XNPV($x2, $values, $dates);\n        for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) {\n            if (($f1 * $f2) < 0.0) {\n                break;\n            } elseif (abs($f1) < abs($f2)) {\n                $f1 = self::XNPV($x1 += 1.6 * ($x1 - $x2), $values, $dates);\n            } else {\n                $f2 = self::XNPV($x2 += 1.6 * ($x2 - $x1), $values, $dates);\n            }\n        }\n        if (($f1 * $f2) > 0.0) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        $f = self::XNPV($x1, $values, $dates);\n        if ($f < 0.0) {\n            $rtb = $x1;\n            $dx = $x2 - $x1;\n        } else {\n            $rtb = $x2;\n            $dx = $x1 - $x2;\n        }\n\n        for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) {\n            $dx *= 0.5;\n            $x_mid = $rtb + $dx;\n            $f_mid = self::XNPV($x_mid, $values, $dates);\n            if ($f_mid <= 0.0) {\n                $rtb = $x_mid;\n            }\n            if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) {\n                return $x_mid;\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * XNPV\n     *\n     * Returns the net present value for a schedule of cash flows that is not necessarily periodic.\n     * To calculate the net present value for a series of cash flows that is periodic, use the NPV function.\n     *\n     * Excel Function:\n     *        =XNPV(rate,values,dates)\n     *\n     * @param    float            $rate        The discount rate to apply to the cash flows.\n     * @param    array of float    $values     A series of cash flows that corresponds to a schedule of payments in dates.\n     *                                         The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment.\n     *                                         If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year.\n     *                                         The series of values must contain at least one positive value and one negative value.\n     * @param    array of mixed    $dates      A schedule of payment dates that corresponds to the cash flow payments.\n     *                                         The first payment date indicates the beginning of the schedule of payments.\n     *                                         All other dates must be later than this date, but they may occur in any order.\n     * @return    float\n     */\n    public static function XNPV($rate, $values, $dates)\n    {\n        $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        if (!is_numeric($rate)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if ((!is_array($values)) || (!is_array($dates))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $values    = PHPExcel_Calculation_Functions::flattenArray($values);\n        $dates    = PHPExcel_Calculation_Functions::flattenArray($dates);\n        $valCount = count($values);\n        if ($valCount != count($dates)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        if ((min($values) > 0) || (max($values) < 0)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        $xnpv = 0.0;\n        for ($i = 0; $i < $valCount; ++$i) {\n            if (!is_numeric($values[$i])) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            $xnpv += $values[$i] / pow(1 + $rate, PHPExcel_Calculation_DateTime::DATEDIF($dates[0], $dates[$i], 'd') / 365);\n        }\n        return (is_finite($xnpv)) ? $xnpv : PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * YIELDDISC\n     *\n     * Returns the annual yield of a security that pays interest at maturity.\n     *\n     * @param    mixed    settlement      The security's settlement date.\n     *                                    The security's settlement date is the date after the issue date when the security is traded to the buyer.\n     * @param    mixed    maturity        The security's maturity date.\n     *                                    The maturity date is the date when the security expires.\n     * @param    int        price         The security's price per $100 face value.\n     * @param    int        redemption    The security's redemption value per $100 face value.\n     * @param    int        basis         The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function YIELDDISC($settlement, $maturity, $price, $redemption, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $price        = PHPExcel_Calculation_Functions::flattenSingleValue($price);\n        $redemption    = PHPExcel_Calculation_Functions::flattenSingleValue($redemption);\n        $basis        = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if (is_numeric($price) && is_numeric($redemption)) {\n            if (($price <= 0) || ($redemption <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis);\n            if (!is_numeric($daysPerYear)) {\n                return $daysPerYear;\n            }\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n            $daysBetweenSettlementAndMaturity *= $daysPerYear;\n\n            return (($redemption - $price) / $price) * ($daysPerYear / $daysBetweenSettlementAndMaturity);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * YIELDMAT\n     *\n     * Returns the annual yield of a security that pays interest at maturity.\n     *\n     * @param    mixed    settlement     The security's settlement date.\n     *                                   The security's settlement date is the date after the issue date when the security is traded to the buyer.\n     * @param    mixed    maturity       The security's maturity date.\n     *                                   The maturity date is the date when the security expires.\n     * @param    mixed    issue          The security's issue date.\n     * @param    int        rate         The security's interest rate at date of issue.\n     * @param    int        price        The security's price per $100 face value.\n     * @param    int        basis        The type of day count to use.\n     *                                        0 or omitted    US (NASD) 30/360\n     *                                        1                Actual/actual\n     *                                        2                Actual/360\n     *                                        3                Actual/365\n     *                                        4                European 30/360\n     * @return    float\n     */\n    public static function YIELDMAT($settlement, $maturity, $issue, $rate, $price, $basis = 0)\n    {\n        $settlement    = PHPExcel_Calculation_Functions::flattenSingleValue($settlement);\n        $maturity    = PHPExcel_Calculation_Functions::flattenSingleValue($maturity);\n        $issue        = PHPExcel_Calculation_Functions::flattenSingleValue($issue);\n        $rate        = PHPExcel_Calculation_Functions::flattenSingleValue($rate);\n        $price        = PHPExcel_Calculation_Functions::flattenSingleValue($price);\n        $basis        = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis);\n\n        //    Validate\n        if (is_numeric($rate) && is_numeric($price)) {\n            if (($rate <= 0) || ($price <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis);\n            if (!is_numeric($daysPerYear)) {\n                return $daysPerYear;\n            }\n            $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis);\n            if (!is_numeric($daysBetweenIssueAndSettlement)) {\n                //    return date error\n                return $daysBetweenIssueAndSettlement;\n            }\n            $daysBetweenIssueAndSettlement *= $daysPerYear;\n            $daysBetweenIssueAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $maturity, $basis);\n            if (!is_numeric($daysBetweenIssueAndMaturity)) {\n                //    return date error\n                return $daysBetweenIssueAndMaturity;\n            }\n            $daysBetweenIssueAndMaturity *= $daysPerYear;\n            $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis);\n            if (!is_numeric($daysBetweenSettlementAndMaturity)) {\n                //    return date error\n                return $daysBetweenSettlementAndMaturity;\n            }\n            $daysBetweenSettlementAndMaturity *= $daysPerYear;\n\n            return ((1 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate) - (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) /\n                   (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) *\n                   ($daysPerYear / $daysBetweenSettlementAndMaturity);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php",
    "content": "<?php\n\n/*\nPARTLY BASED ON:\n    Copyright (c) 2007 E. W. Bachtal, Inc.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n    and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n    including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,\n    and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\n    subject to the following conditions:\n\n      The above copyright notice and this permission notice shall be included in all copies or substantial\n      portions of the Software.\n\n    The software is provided \"as is\", without warranty of any kind, express or implied, including but not\n    limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In\n    no event shall the authors or copyright holders be liable for any claim, damages or other liability,\n    whether in an action of contract, tort or otherwise, arising from, out of or in connection with the\n    software or the use or other dealings in the software.\n\n    http://ewbi.blogs.com/develops/2007/03/excel_formula_p.html\n    http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html\n*/\n\n/**\n * PHPExcel_Calculation_FormulaParser\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\nclass PHPExcel_Calculation_FormulaParser\n{\n    /* Character constants */\n    const QUOTE_DOUBLE  = '\"';\n    const QUOTE_SINGLE  = '\\'';\n    const BRACKET_CLOSE = ']';\n    const BRACKET_OPEN  = '[';\n    const BRACE_OPEN    = '{';\n    const BRACE_CLOSE   = '}';\n    const PAREN_OPEN    = '(';\n    const PAREN_CLOSE   = ')';\n    const SEMICOLON     = ';';\n    const WHITESPACE    = ' ';\n    const COMMA         = ',';\n    const ERROR_START   = '#';\n\n    const OPERATORS_SN             = \"+-\";\n    const OPERATORS_INFIX         = \"+-*/^&=><\";\n    const OPERATORS_POSTFIX     = \"%\";\n\n    /**\n     * Formula\n     *\n     * @var string\n     */\n    private $formula;\n\n    /**\n     * Tokens\n     *\n     * @var PHPExcel_Calculation_FormulaToken[]\n     */\n    private $tokens = array();\n\n    /**\n     * Create a new PHPExcel_Calculation_FormulaParser\n     *\n     * @param     string        $pFormula    Formula to parse\n     * @throws     PHPExcel_Calculation_Exception\n     */\n    public function __construct($pFormula = '')\n    {\n        // Check parameters\n        if (is_null($pFormula)) {\n            throw new PHPExcel_Calculation_Exception(\"Invalid parameter passed: formula\");\n        }\n\n        // Initialise values\n        $this->formula = trim($pFormula);\n        // Parse!\n        $this->parseToTokens();\n    }\n\n    /**\n     * Get Formula\n     *\n     * @return string\n     */\n    public function getFormula()\n    {\n        return $this->formula;\n    }\n\n    /**\n     * Get Token\n     *\n     * @param     int        $pId    Token id\n     * @return    string\n     * @throws  PHPExcel_Calculation_Exception\n     */\n    public function getToken($pId = 0)\n    {\n        if (isset($this->tokens[$pId])) {\n            return $this->tokens[$pId];\n        } else {\n            throw new PHPExcel_Calculation_Exception(\"Token with id $pId does not exist.\");\n        }\n    }\n\n    /**\n     * Get Token count\n     *\n     * @return string\n     */\n    public function getTokenCount()\n    {\n        return count($this->tokens);\n    }\n\n    /**\n     * Get Tokens\n     *\n     * @return PHPExcel_Calculation_FormulaToken[]\n     */\n    public function getTokens()\n    {\n        return $this->tokens;\n    }\n\n    /**\n     * Parse to tokens\n     */\n    private function parseToTokens()\n    {\n        // No attempt is made to verify formulas; assumes formulas are derived from Excel, where\n        // they can only exist if valid; stack overflows/underflows sunk as nulls without exceptions.\n\n        // Check if the formula has a valid starting =\n        $formulaLength = strlen($this->formula);\n        if ($formulaLength < 2 || $this->formula{0} != '=') {\n            return;\n        }\n\n        // Helper variables\n        $tokens1    = $tokens2     = $stack = array();\n        $inString    = $inPath     = $inRange     = $inError = false;\n        $token        = $previousToken    = $nextToken    = null;\n\n        $index    = 1;\n        $value    = '';\n\n        $ERRORS             = array(\"#NULL!\", \"#DIV/0!\", \"#VALUE!\", \"#REF!\", \"#NAME?\", \"#NUM!\", \"#N/A\");\n        $COMPARATORS_MULTI     = array(\">=\", \"<=\", \"<>\");\n\n        while ($index < $formulaLength) {\n            // state-dependent character evaluation (order is important)\n\n            // double-quoted strings\n            // embeds are doubled\n            // end marks token\n            if ($inString) {\n                if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) {\n                    if ((($index + 2) <= $formulaLength) && ($this->formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE)) {\n                        $value .= PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE;\n                        ++$index;\n                    } else {\n                        $inString = false;\n                        $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_TEXT);\n                        $value = \"\";\n                    }\n                } else {\n                    $value .= $this->formula{$index};\n                }\n                ++$index;\n                continue;\n            }\n\n            // single-quoted strings (links)\n            // embeds are double\n            // end does not mark a token\n            if ($inPath) {\n                if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) {\n                    if ((($index + 2) <= $formulaLength) && ($this->formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE)) {\n                        $value .= PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE;\n                        ++$index;\n                    } else {\n                        $inPath = false;\n                    }\n                } else {\n                    $value .= $this->formula{$index};\n                }\n                ++$index;\n                continue;\n            }\n\n            // bracked strings (R1C1 range index or linked workbook name)\n            // no embeds (changed to \"()\" by Excel)\n            // end does not mark a token\n            if ($inRange) {\n                if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_CLOSE) {\n                    $inRange = false;\n                }\n                $value .= $this->formula{$index};\n                ++$index;\n                continue;\n            }\n\n            // error values\n            // end marks a token, determined from absolute list of values\n            if ($inError) {\n                $value .= $this->formula{$index};\n                ++$index;\n                if (in_array($value, $ERRORS)) {\n                    $inError = false;\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_ERROR);\n                    $value = \"\";\n                }\n                continue;\n            }\n\n            // scientific notation check\n            if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_SN, $this->formula{$index}) !== false) {\n                if (strlen($value) > 1) {\n                    if (preg_match(\"/^[1-9]{1}(\\.[0-9]+)?E{1}$/\", $this->formula{$index}) != 0) {\n                        $value .= $this->formula{$index};\n                        ++$index;\n                        continue;\n                    }\n                }\n            }\n\n            // independent character evaluation (order not important)\n\n            // establish state-dependent character evaluations\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) {\n                if (strlen($value > 0)) {\n                    // unexpected\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);\n                    $value = \"\";\n                }\n                $inString = true;\n                ++$index;\n                continue;\n            }\n\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) {\n                if (strlen($value) > 0) {\n                    // unexpected\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);\n                    $value = \"\";\n                }\n                $inPath = true;\n                ++$index;\n                continue;\n            }\n\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_OPEN) {\n                $inRange = true;\n                $value .= PHPExcel_Calculation_FormulaParser::BRACKET_OPEN;\n                ++$index;\n                continue;\n            }\n\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::ERROR_START) {\n                if (strlen($value) > 0) {\n                    // unexpected\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);\n                    $value = \"\";\n                }\n                $inError = true;\n                $value .= PHPExcel_Calculation_FormulaParser::ERROR_START;\n                ++$index;\n                continue;\n            }\n\n            // mark start and end of arrays and array rows\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_OPEN) {\n                if (strlen($value) > 0) {\n                    // unexpected\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN);\n                    $value = \"\";\n                }\n\n                $tmp = new PHPExcel_Calculation_FormulaToken(\"ARRAY\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);\n                $tokens1[] = $tmp;\n                $stack[] = clone $tmp;\n\n                $tmp = new PHPExcel_Calculation_FormulaToken(\"ARRAYROW\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);\n                $tokens1[] = $tmp;\n                $stack[] = clone $tmp;\n\n                ++$index;\n                continue;\n            }\n\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::SEMICOLON) {\n                if (strlen($value) > 0) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n\n                $tmp = array_pop($stack);\n                $tmp->setValue(\"\");\n                $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);\n                $tokens1[] = $tmp;\n\n                $tmp = new PHPExcel_Calculation_FormulaToken(\",\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT);\n                $tokens1[] = $tmp;\n\n                $tmp = new PHPExcel_Calculation_FormulaToken(\"ARRAYROW\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);\n                $tokens1[] = $tmp;\n                $stack[] = clone $tmp;\n\n                ++$index;\n                continue;\n            }\n\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_CLOSE) {\n                if (strlen($value) > 0) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n\n                $tmp = array_pop($stack);\n                $tmp->setValue(\"\");\n                $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);\n                $tokens1[] = $tmp;\n\n                $tmp = array_pop($stack);\n                $tmp->setValue(\"\");\n                $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);\n                $tokens1[] = $tmp;\n\n                ++$index;\n                continue;\n            }\n\n            // trim white-space\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) {\n                if (strlen($value) > 0) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n                $tokens1[] = new PHPExcel_Calculation_FormulaToken(\"\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE);\n                ++$index;\n                while (($this->formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) && ($index < $formulaLength)) {\n                    ++$index;\n                }\n                continue;\n            }\n\n            // multi-character comparators\n            if (($index + 2) <= $formulaLength) {\n                if (in_array(substr($this->formula, $index, 2), $COMPARATORS_MULTI)) {\n                    if (strlen($value) > 0) {\n                        $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                        $value = \"\";\n                    }\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken(substr($this->formula, $index, 2), PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL);\n                    $index += 2;\n                    continue;\n                }\n            }\n\n            // standard infix operators\n            if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_INFIX, $this->formula{$index}) !== false) {\n                if (strlen($value) > 0) {\n                    $tokens1[] =new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n                $tokens1[] = new PHPExcel_Calculation_FormulaToken($this->formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX);\n                ++$index;\n                continue;\n            }\n\n            // standard postfix operators (only one)\n            if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_POSTFIX, $this->formula{$index}) !== false) {\n                if (strlen($value) > 0) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n                $tokens1[] = new PHPExcel_Calculation_FormulaToken($this->formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX);\n                ++$index;\n                continue;\n            }\n\n            // start subexpression or function\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_OPEN) {\n                if (strlen($value) > 0) {\n                    $tmp = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);\n                    $tokens1[] = $tmp;\n                    $stack[] = clone $tmp;\n                    $value = \"\";\n                } else {\n                    $tmp = new PHPExcel_Calculation_FormulaToken(\"\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START);\n                    $tokens1[] = $tmp;\n                    $stack[] = clone $tmp;\n                }\n                ++$index;\n                continue;\n            }\n\n            // function, subexpression, or array parameters, or operand unions\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::COMMA) {\n                if (strlen($value) > 0) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n\n                $tmp = array_pop($stack);\n                $tmp->setValue(\"\");\n                $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);\n                $stack[] = $tmp;\n\n                if ($tmp->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken(\",\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_UNION);\n                } else {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken(\",\", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT);\n                }\n                ++$index;\n                continue;\n            }\n\n            // stop subexpression\n            if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_CLOSE) {\n                if (strlen($value) > 0) {\n                    $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n                    $value = \"\";\n                }\n\n                $tmp = array_pop($stack);\n                $tmp->setValue(\"\");\n                $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP);\n                $tokens1[] = $tmp;\n\n                ++$index;\n                continue;\n            }\n\n            // token accumulation\n            $value .= $this->formula{$index};\n            ++$index;\n        }\n\n        // dump remaining accumulation\n        if (strlen($value) > 0) {\n            $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND);\n        }\n\n        // move tokenList to new set, excluding unnecessary white-space tokens and converting necessary ones to intersections\n        $tokenCount = count($tokens1);\n        for ($i = 0; $i < $tokenCount; ++$i) {\n            $token = $tokens1[$i];\n            if (isset($tokens1[$i - 1])) {\n                $previousToken = $tokens1[$i - 1];\n            } else {\n                $previousToken = null;\n            }\n            if (isset($tokens1[$i + 1])) {\n                $nextToken = $tokens1[$i + 1];\n            } else {\n                $nextToken = null;\n            }\n\n            if (is_null($token)) {\n                continue;\n            }\n\n            if ($token->getTokenType() != PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE) {\n                $tokens2[] = $token;\n                continue;\n            }\n\n            if (is_null($previousToken)) {\n                continue;\n            }\n\n            if (! (\n                    (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||\n                    (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||\n                    ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)\n                  ) ) {\n                continue;\n            }\n\n            if (is_null($nextToken)) {\n                continue;\n            }\n\n            if (! (\n                    (($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) ||\n                    (($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) ||\n                    ($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)\n                  ) ) {\n                continue;\n            }\n\n            $tokens2[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_INTERSECTION);\n        }\n\n        // move tokens to final list, switching infix \"-\" operators to prefix when appropriate, switching infix \"+\" operators\n        // to noop when appropriate, identifying operand and infix-operator subtypes, and pulling \"@\" from function names\n        $this->tokens = array();\n\n        $tokenCount = count($tokens2);\n        for ($i = 0; $i < $tokenCount; ++$i) {\n            $token = $tokens2[$i];\n            if (isset($tokens2[$i - 1])) {\n                $previousToken = $tokens2[$i - 1];\n            } else {\n                $previousToken = null;\n            }\n            if (isset($tokens2[$i + 1])) {\n                $nextToken = $tokens2[$i + 1];\n            } else {\n                $nextToken = null;\n            }\n\n            if (is_null($token)) {\n                continue;\n            }\n\n            if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == \"-\") {\n                if ($i == 0) {\n                    $token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX);\n                } elseif ((($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) &&\n                    ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||\n                    (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) &&\n                    ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||\n                    ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) ||\n                    ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)) {\n                    $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH);\n                } else {\n                    $token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX);\n                }\n\n                $this->tokens[] = $token;\n                continue;\n            }\n\n            if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == \"+\") {\n                if ($i == 0) {\n                    continue;\n                } elseif ((($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) &&\n                    ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||\n                    (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) &&\n                    ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) ||\n                    ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) ||\n                    ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)) {\n                    $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH);\n                } else {\n                    continue;\n                }\n\n                $this->tokens[] = $token;\n                continue;\n            }\n\n            if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX &&\n                $token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) {\n                if (strpos(\"<>=\", substr($token->getValue(), 0, 1)) !== false) {\n                    $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL);\n                } elseif ($token->getValue() == \"&\") {\n                    $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_CONCATENATION);\n                } else {\n                    $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH);\n                }\n\n                $this->tokens[] = $token;\n                continue;\n            }\n\n            if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND &&\n                $token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) {\n                if (!is_numeric($token->getValue())) {\n                    if (strtoupper($token->getValue()) == \"TRUE\" || strtoupper($token->getValue() == \"FALSE\")) {\n                        $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL);\n                    } else {\n                        $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_RANGE);\n                    }\n                } else {\n                    $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NUMBER);\n                }\n\n                $this->tokens[] = $token;\n                continue;\n            }\n\n            if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) {\n                if (strlen($token->getValue() > 0)) {\n                    if (substr($token->getValue(), 0, 1) == \"@\") {\n                        $token->setValue(substr($token->getValue(), 1));\n                    }\n                }\n            }\n\n            $this->tokens[] = $token;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php",
    "content": "<?php\n\n/*\nPARTLY BASED ON:\n    Copyright (c) 2007 E. W. Bachtal, Inc.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n    and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n    including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,\n    and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\n    subject to the following conditions:\n\n      The above copyright notice and this permission notice shall be included in all copies or substantial\n      portions of the Software.\n\n    The software is provided \"as is\", without warranty of any kind, express or implied, including but not\n    limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In\n    no event shall the authors or copyright holders be liable for any claim, damages or other liability,\n    whether in an action of contract, tort or otherwise, arising from, out of or in connection with the\n    software or the use or other dealings in the software.\n\n    http://ewbi.blogs.com/develops/2007/03/excel_formula_p.html\n    http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html\n*/\n\n/**\n * PHPExcel_Calculation_FormulaToken\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\nclass PHPExcel_Calculation_FormulaToken\n{\n    /* Token types */\n    const TOKEN_TYPE_NOOP            = 'Noop';\n    const TOKEN_TYPE_OPERAND         = 'Operand';\n    const TOKEN_TYPE_FUNCTION        = 'Function';\n    const TOKEN_TYPE_SUBEXPRESSION   = 'Subexpression';\n    const TOKEN_TYPE_ARGUMENT        = 'Argument';\n    const TOKEN_TYPE_OPERATORPREFIX  = 'OperatorPrefix';\n    const TOKEN_TYPE_OPERATORINFIX   = 'OperatorInfix';\n    const TOKEN_TYPE_OPERATORPOSTFIX = 'OperatorPostfix';\n    const TOKEN_TYPE_WHITESPACE      = 'Whitespace';\n    const TOKEN_TYPE_UNKNOWN         = 'Unknown';\n\n    /* Token subtypes */\n    const TOKEN_SUBTYPE_NOTHING       = 'Nothing';\n    const TOKEN_SUBTYPE_START         = 'Start';\n    const TOKEN_SUBTYPE_STOP          = 'Stop';\n    const TOKEN_SUBTYPE_TEXT          = 'Text';\n    const TOKEN_SUBTYPE_NUMBER        = 'Number';\n    const TOKEN_SUBTYPE_LOGICAL       = 'Logical';\n    const TOKEN_SUBTYPE_ERROR         = 'Error';\n    const TOKEN_SUBTYPE_RANGE         = 'Range';\n    const TOKEN_SUBTYPE_MATH          = 'Math';\n    const TOKEN_SUBTYPE_CONCATENATION = 'Concatenation';\n    const TOKEN_SUBTYPE_INTERSECTION  = 'Intersection';\n    const TOKEN_SUBTYPE_UNION         = 'Union';\n\n    /**\n     * Value\n     *\n     * @var string\n     */\n    private $value;\n\n    /**\n     * Token Type (represented by TOKEN_TYPE_*)\n     *\n     * @var string\n     */\n    private $tokenType;\n\n    /**\n     * Token SubType (represented by TOKEN_SUBTYPE_*)\n     *\n     * @var string\n     */\n    private $tokenSubType;\n\n    /**\n     * Create a new PHPExcel_Calculation_FormulaToken\n     *\n     * @param string    $pValue\n     * @param string    $pTokenType     Token type (represented by TOKEN_TYPE_*)\n     * @param string    $pTokenSubType     Token Subtype (represented by TOKEN_SUBTYPE_*)\n     */\n    public function __construct($pValue, $pTokenType = PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN, $pTokenSubType = PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING)\n    {\n        // Initialise values\n        $this->value       = $pValue;\n        $this->tokenType    = $pTokenType;\n        $this->tokenSubType = $pTokenSubType;\n    }\n\n    /**\n     * Get Value\n     *\n     * @return string\n     */\n    public function getValue()\n    {\n        return $this->value;\n    }\n\n    /**\n     * Set Value\n     *\n     * @param string    $value\n     */\n    public function setValue($value)\n    {\n        $this->value = $value;\n    }\n\n    /**\n     * Get Token Type (represented by TOKEN_TYPE_*)\n     *\n     * @return string\n     */\n    public function getTokenType()\n    {\n        return $this->tokenType;\n    }\n\n    /**\n     * Set Token Type\n     *\n     * @param string    $value\n     */\n    public function setTokenType($value = PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN)\n    {\n        $this->tokenType = $value;\n    }\n\n    /**\n     * Get Token SubType (represented by TOKEN_SUBTYPE_*)\n     *\n     * @return string\n     */\n    public function getTokenSubType()\n    {\n        return $this->tokenSubType;\n    }\n\n    /**\n     * Set Token SubType\n     *\n     * @param string    $value\n     */\n    public function setTokenSubType($value = PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING)\n    {\n        $this->tokenSubType = $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Function.php",
    "content": "<?php\n\n/**\n * PHPExcel_Calculation_Function\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Function\n{\n    /* Function categories */\n    const CATEGORY_CUBE                 = 'Cube';\n    const CATEGORY_DATABASE             = 'Database';\n    const CATEGORY_DATE_AND_TIME        = 'Date and Time';\n    const CATEGORY_ENGINEERING          = 'Engineering';\n    const CATEGORY_FINANCIAL            = 'Financial';\n    const CATEGORY_INFORMATION          = 'Information';\n    const CATEGORY_LOGICAL              = 'Logical';\n    const CATEGORY_LOOKUP_AND_REFERENCE = 'Lookup and Reference';\n    const CATEGORY_MATH_AND_TRIG        = 'Math and Trig';\n    const CATEGORY_STATISTICAL          = 'Statistical';\n    const CATEGORY_TEXT_AND_DATA        = 'Text and Data';\n\n    /**\n     * Category (represented by CATEGORY_*)\n     *\n     * @var string\n     */\n    private $category;\n\n    /**\n     * Excel name\n     *\n     * @var string\n     */\n    private $excelName;\n\n    /**\n     * PHPExcel name\n     *\n     * @var string\n     */\n    private $phpExcelName;\n\n    /**\n     * Create a new PHPExcel_Calculation_Function\n     *\n     * @param     string        $pCategory         Category (represented by CATEGORY_*)\n     * @param     string        $pExcelName        Excel function name\n     * @param     string        $pPHPExcelName    PHPExcel function mapping\n     * @throws     PHPExcel_Calculation_Exception\n     */\n    public function __construct($pCategory = null, $pExcelName = null, $pPHPExcelName = null)\n    {\n        if (($pCategory !== null) && ($pExcelName !== null) && ($pPHPExcelName !== null)) {\n            // Initialise values\n            $this->category     = $pCategory;\n            $this->excelName    = $pExcelName;\n            $this->phpExcelName = $pPHPExcelName;\n        } else {\n            throw new PHPExcel_Calculation_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Get Category (represented by CATEGORY_*)\n     *\n     * @return string\n     */\n    public function getCategory()\n    {\n        return $this->category;\n    }\n\n    /**\n     * Set Category (represented by CATEGORY_*)\n     *\n     * @param     string        $value\n     * @throws     PHPExcel_Calculation_Exception\n     */\n    public function setCategory($value = null)\n    {\n        if (!is_null($value)) {\n            $this->category = $value;\n        } else {\n            throw new PHPExcel_Calculation_Exception(\"Invalid parameter passed.\");\n        }\n    }\n\n    /**\n     * Get Excel name\n     *\n     * @return string\n     */\n    public function getExcelName()\n    {\n        return $this->excelName;\n    }\n\n    /**\n     * Set Excel name\n     *\n     * @param string    $value\n     */\n    public function setExcelName($value)\n    {\n        $this->excelName = $value;\n    }\n\n    /**\n     * Get PHPExcel name\n     *\n     * @return string\n     */\n    public function getPHPExcelName()\n    {\n        return $this->phpExcelName;\n    }\n\n    /**\n     * Set PHPExcel name\n     *\n     * @param string    $value\n     */\n    public function setPHPExcelName($value)\n    {\n        $this->phpExcelName = $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Functions.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n\n/** MAX_VALUE */\ndefine('MAX_VALUE', 1.2e308);\n\n/** 2 / PI */\ndefine('M_2DIVPI', 0.63661977236758134307553505349006);\n\n/** MAX_ITERATIONS */\ndefine('MAX_ITERATIONS', 256);\n\n/** PRECISION */\ndefine('PRECISION', 8.88E-016);\n\n\n/**\n * PHPExcel_Calculation_Functions\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Functions\n{\n\n    /** constants */\n    const COMPATIBILITY_EXCEL      = 'Excel';\n    const COMPATIBILITY_GNUMERIC   = 'Gnumeric';\n    const COMPATIBILITY_OPENOFFICE = 'OpenOfficeCalc';\n\n    const RETURNDATE_PHP_NUMERIC = 'P';\n    const RETURNDATE_PHP_OBJECT  = 'O';\n    const RETURNDATE_EXCEL       = 'E';\n\n\n    /**\n     * Compatibility mode to use for error checking and responses\n     *\n     * @access    private\n     * @var string\n     */\n    protected static $compatibilityMode = self::COMPATIBILITY_EXCEL;\n\n    /**\n     * Data Type to use when returning date values\n     *\n     * @access    private\n     * @var string\n     */\n    protected static $returnDateType = self::RETURNDATE_EXCEL;\n\n    /**\n     * List of error codes\n     *\n     * @access    private\n     * @var array\n     */\n    protected static $errorCodes = array(\n        'null'           => '#NULL!',\n        'divisionbyzero' => '#DIV/0!',\n        'value'          => '#VALUE!',\n        'reference'      => '#REF!',\n        'name'           => '#NAME?',\n        'num'            => '#NUM!',\n        'na'             => '#N/A',\n        'gettingdata'    => '#GETTING_DATA'\n    );\n\n\n    /**\n     * Set the Compatibility Mode\n     *\n     * @access    public\n     * @category Function Configuration\n     * @param     string        $compatibilityMode        Compatibility Mode\n     *                                                Permitted values are:\n     *                                                    PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL            'Excel'\n     *                                                    PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC        'Gnumeric'\n     *                                                    PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE    'OpenOfficeCalc'\n     * @return     boolean    (Success or Failure)\n     */\n    public static function setCompatibilityMode($compatibilityMode)\n    {\n        if (($compatibilityMode == self::COMPATIBILITY_EXCEL) ||\n            ($compatibilityMode == self::COMPATIBILITY_GNUMERIC) ||\n            ($compatibilityMode == self::COMPATIBILITY_OPENOFFICE)) {\n            self::$compatibilityMode = $compatibilityMode;\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Return the current Compatibility Mode\n     *\n     * @access    public\n     * @category Function Configuration\n     * @return     string        Compatibility Mode\n     *                            Possible Return values are:\n     *                                PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL            'Excel'\n     *                                PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC        'Gnumeric'\n     *                                PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE    'OpenOfficeCalc'\n     */\n    public static function getCompatibilityMode()\n    {\n        return self::$compatibilityMode;\n    }\n\n\n    /**\n     * Set the Return Date Format used by functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object)\n     *\n     * @access    public\n     * @category Function Configuration\n     * @param     string    $returnDateType            Return Date Format\n     *                                                Permitted values are:\n     *                                                    PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC        'P'\n     *                                                    PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT        'O'\n     *                                                    PHPExcel_Calculation_Functions::RETURNDATE_EXCEL            'E'\n     * @return     boolean                            Success or failure\n     */\n    public static function setReturnDateType($returnDateType)\n    {\n        if (($returnDateType == self::RETURNDATE_PHP_NUMERIC) ||\n            ($returnDateType == self::RETURNDATE_PHP_OBJECT) ||\n            ($returnDateType == self::RETURNDATE_EXCEL)) {\n            self::$returnDateType = $returnDateType;\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Return the current Return Date Format for functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object)\n     *\n     * @access    public\n     * @category Function Configuration\n     * @return     string        Return Date Format\n     *                            Possible Return values are:\n     *                                PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC        'P'\n     *                                PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT        'O'\n     *                                PHPExcel_Calculation_Functions::RETURNDATE_EXCEL            'E'\n     */\n    public static function getReturnDateType()\n    {\n        return self::$returnDateType;\n    }\n\n\n    /**\n     * DUMMY\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #Not Yet Implemented\n     */\n    public static function DUMMY()\n    {\n        return '#Not Yet Implemented';\n    }\n\n\n    /**\n     * DIV0\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #Not Yet Implemented\n     */\n    public static function DIV0()\n    {\n        return self::$errorCodes['divisionbyzero'];\n    }\n\n\n    /**\n     * NA\n     *\n     * Excel Function:\n     *        =NA()\n     *\n     * Returns the error value #N/A\n     *        #N/A is the error value that means \"no value is available.\"\n     *\n     * @access    public\n     * @category Logical Functions\n     * @return    string    #N/A!\n     */\n    public static function NA()\n    {\n        return self::$errorCodes['na'];\n    }\n\n\n    /**\n     * NaN\n     *\n     * Returns the error value #NUM!\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #NUM!\n     */\n    public static function NaN()\n    {\n        return self::$errorCodes['num'];\n    }\n\n\n    /**\n     * NAME\n     *\n     * Returns the error value #NAME?\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #NAME?\n     */\n    public static function NAME()\n    {\n        return self::$errorCodes['name'];\n    }\n\n\n    /**\n     * REF\n     *\n     * Returns the error value #REF!\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #REF!\n     */\n    public static function REF()\n    {\n        return self::$errorCodes['reference'];\n    }\n\n\n    /**\n     * NULL\n     *\n     * Returns the error value #NULL!\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #NULL!\n     */\n    public static function NULL()\n    {\n        return self::$errorCodes['null'];\n    }\n\n\n    /**\n     * VALUE\n     *\n     * Returns the error value #VALUE!\n     *\n     * @access    public\n     * @category Error Returns\n     * @return    string    #VALUE!\n     */\n    public static function VALUE()\n    {\n        return self::$errorCodes['value'];\n    }\n\n\n    public static function isMatrixValue($idx)\n    {\n        return ((substr_count($idx, '.') <= 1) || (preg_match('/\\.[A-Z]/', $idx) > 0));\n    }\n\n\n    public static function isValue($idx)\n    {\n        return (substr_count($idx, '.') == 0);\n    }\n\n\n    public static function isCellValue($idx)\n    {\n        return (substr_count($idx, '.') > 1);\n    }\n\n\n    public static function ifCondition($condition)\n    {\n        $condition    = PHPExcel_Calculation_Functions::flattenSingleValue($condition);\n        if (!isset($condition{0})) {\n            $condition = '=\"\"';\n        }\n        if (!in_array($condition{0}, array('>', '<', '='))) {\n            if (!is_numeric($condition)) {\n                $condition = PHPExcel_Calculation::wrapResult(strtoupper($condition));\n            }\n            return '=' . $condition;\n        } else {\n            preg_match('/([<>=]+)(.*)/', $condition, $matches);\n            list(, $operator, $operand) = $matches;\n\n            if (!is_numeric($operand)) {\n                $operand = str_replace('\"', '\"\"', $operand);\n                $operand = PHPExcel_Calculation::wrapResult(strtoupper($operand));\n            }\n\n            return $operator.$operand;\n        }\n    }\n\n    /**\n     * ERROR_TYPE\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function ERROR_TYPE($value = '')\n    {\n        $value = self::flattenSingleValue($value);\n\n        $i = 1;\n        foreach (self::$errorCodes as $errorCode) {\n            if ($value === $errorCode) {\n                return $i;\n            }\n            ++$i;\n        }\n        return self::NA();\n    }\n\n\n    /**\n     * IS_BLANK\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function IS_BLANK($value = null)\n    {\n        if (!is_null($value)) {\n            $value    = self::flattenSingleValue($value);\n        }\n\n        return is_null($value);\n    }\n\n\n    /**\n     * IS_ERR\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function IS_ERR($value = '')\n    {\n        $value = self::flattenSingleValue($value);\n\n        return self::IS_ERROR($value) && (!self::IS_NA($value));\n    }\n\n\n    /**\n     * IS_ERROR\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function IS_ERROR($value = '')\n    {\n        $value = self::flattenSingleValue($value);\n\n        if (!is_string($value)) {\n            return false;\n        }\n        return in_array($value, array_values(self::$errorCodes));\n    }\n\n\n    /**\n     * IS_NA\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function IS_NA($value = '')\n    {\n        $value = self::flattenSingleValue($value);\n\n        return ($value === self::NA());\n    }\n\n\n    /**\n     * IS_EVEN\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function IS_EVEN($value = null)\n    {\n        $value = self::flattenSingleValue($value);\n\n        if ($value === null) {\n            return self::NAME();\n        } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) {\n            return self::VALUE();\n        }\n\n        return ($value % 2 == 0);\n    }\n\n\n    /**\n     * IS_ODD\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function IS_ODD($value = null)\n    {\n        $value = self::flattenSingleValue($value);\n\n        if ($value === null) {\n            return self::NAME();\n        } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) {\n            return self::VALUE();\n        }\n\n        return (abs($value) % 2 == 1);\n    }\n\n\n    /**\n     * IS_NUMBER\n     *\n     * @param    mixed    $value        Value to check\n     * @return    boolean\n     */\n    public static function IS_NUMBER($value = null)\n    {\n        $value = self::flattenSingleValue($value);\n\n        if (is_string($value)) {\n            return false;\n        }\n        return is_numeric($value);\n    }\n\n\n    /**\n     * IS_LOGICAL\n     *\n     * @param    mixed    $value        Value to check\n     * @return    boolean\n     */\n    public static function IS_LOGICAL($value = null)\n    {\n        $value = self::flattenSingleValue($value);\n\n        return is_bool($value);\n    }\n\n\n    /**\n     * IS_TEXT\n     *\n     * @param    mixed    $value        Value to check\n     * @return    boolean\n     */\n    public static function IS_TEXT($value = null)\n    {\n        $value = self::flattenSingleValue($value);\n\n        return (is_string($value) && !self::IS_ERROR($value));\n    }\n\n\n    /**\n     * IS_NONTEXT\n     *\n     * @param    mixed    $value        Value to check\n     * @return    boolean\n     */\n    public static function IS_NONTEXT($value = null)\n    {\n        return !self::IS_TEXT($value);\n    }\n\n\n    /**\n     * VERSION\n     *\n     * @return    string    Version information\n     */\n    public static function VERSION()\n    {\n        return 'PHPExcel ##VERSION##, ##DATE##';\n    }\n\n\n    /**\n     * N\n     *\n     * Returns a value converted to a number\n     *\n     * @param    value        The value you want converted\n     * @return    number        N converts values listed in the following table\n     *        If value is or refers to N returns\n     *        A number            That number\n     *        A date                The serial number of that date\n     *        TRUE                1\n     *        FALSE                0\n     *        An error value        The error value\n     *        Anything else        0\n     */\n    public static function N($value = null)\n    {\n        while (is_array($value)) {\n            $value = array_shift($value);\n        }\n\n        switch (gettype($value)) {\n            case 'double':\n            case 'float':\n            case 'integer':\n                return $value;\n            case 'boolean':\n                return (integer) $value;\n            case 'string':\n                //    Errors\n                if ((strlen($value) > 0) && ($value{0} == '#')) {\n                    return $value;\n                }\n                break;\n        }\n        return 0;\n    }\n\n\n    /**\n     * TYPE\n     *\n     * Returns a number that identifies the type of a value\n     *\n     * @param    value        The value you want tested\n     * @return    number        N converts values listed in the following table\n     *        If value is or refers to N returns\n     *        A number            1\n     *        Text                2\n     *        Logical Value        4\n     *        An error value        16\n     *        Array or Matrix        64\n     */\n    public static function TYPE($value = null)\n    {\n        $value = self::flattenArrayIndexed($value);\n        if (is_array($value) && (count($value) > 1)) {\n            end($value);\n            $a = key($value);\n            //    Range of cells is an error\n            if (self::isCellValue($a)) {\n                return 16;\n            //    Test for Matrix\n            } elseif (self::isMatrixValue($a)) {\n                return 64;\n            }\n        } elseif (empty($value)) {\n            //    Empty Cell\n            return 1;\n        }\n        $value = self::flattenSingleValue($value);\n\n        if (($value === null) || (is_float($value)) || (is_int($value))) {\n                return 1;\n        } elseif (is_bool($value)) {\n                return 4;\n        } elseif (is_array($value)) {\n                return 64;\n        } elseif (is_string($value)) {\n            //    Errors\n            if ((strlen($value) > 0) && ($value{0} == '#')) {\n                return 16;\n            }\n            return 2;\n        }\n        return 0;\n    }\n\n\n    /**\n     * Convert a multi-dimensional array to a simple 1-dimensional array\n     *\n     * @param    array    $array    Array to be flattened\n     * @return    array    Flattened array\n     */\n    public static function flattenArray($array)\n    {\n        if (!is_array($array)) {\n            return (array) $array;\n        }\n\n        $arrayValues = array();\n        foreach ($array as $value) {\n            if (is_array($value)) {\n                foreach ($value as $val) {\n                    if (is_array($val)) {\n                        foreach ($val as $v) {\n                            $arrayValues[] = $v;\n                        }\n                    } else {\n                        $arrayValues[] = $val;\n                    }\n                }\n            } else {\n                $arrayValues[] = $value;\n            }\n        }\n\n        return $arrayValues;\n    }\n\n\n    /**\n     * Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing\n     *\n     * @param    array    $array    Array to be flattened\n     * @return    array    Flattened array\n     */\n    public static function flattenArrayIndexed($array)\n    {\n        if (!is_array($array)) {\n            return (array) $array;\n        }\n\n        $arrayValues = array();\n        foreach ($array as $k1 => $value) {\n            if (is_array($value)) {\n                foreach ($value as $k2 => $val) {\n                    if (is_array($val)) {\n                        foreach ($val as $k3 => $v) {\n                            $arrayValues[$k1.'.'.$k2.'.'.$k3] = $v;\n                        }\n                    } else {\n                        $arrayValues[$k1.'.'.$k2] = $val;\n                    }\n                }\n            } else {\n                $arrayValues[$k1] = $value;\n            }\n        }\n\n        return $arrayValues;\n    }\n\n\n    /**\n     * Convert an array to a single scalar value by extracting the first element\n     *\n     * @param    mixed        $value        Array or scalar value\n     * @return    mixed\n     */\n    public static function flattenSingleValue($value = '')\n    {\n        while (is_array($value)) {\n            $value = array_pop($value);\n        }\n\n        return $value;\n    }\n}\n\n\n//\n//    There are a few mathematical functions that aren't available on all versions of PHP for all platforms\n//    These functions aren't available in Windows implementations of PHP prior to version 5.3.0\n//    So we test if they do exist for this version of PHP/operating platform; and if not we create them\n//\nif (!function_exists('acosh')) {\n    function acosh($x)\n    {\n        return 2 * log(sqrt(($x + 1) / 2) + sqrt(($x - 1) / 2));\n    }    //    function acosh()\n}\n\nif (!function_exists('asinh')) {\n    function asinh($x)\n    {\n        return log($x + sqrt(1 + $x * $x));\n    }    //    function asinh()\n}\n\nif (!function_exists('atanh')) {\n    function atanh($x)\n    {\n        return (log(1 + $x) - log(1 - $x)) / 2;\n    }    //    function atanh()\n}\n\n\n//\n//    Strangely, PHP doesn't have a mb_str_replace multibyte function\n//    As we'll only ever use this function with UTF-8 characters, we can simply \"hard-code\" the character set\n//\nif ((!function_exists('mb_str_replace')) &&\n    (function_exists('mb_substr')) && (function_exists('mb_strlen')) && (function_exists('mb_strpos'))) {\n    function mb_str_replace($search, $replace, $subject)\n    {\n        if (is_array($subject)) {\n            $ret = array();\n            foreach ($subject as $key => $val) {\n                $ret[$key] = mb_str_replace($search, $replace, $val);\n            }\n            return $ret;\n        }\n\n        foreach ((array) $search as $key => $s) {\n            if ($s == '' && $s !== 0) {\n                continue;\n            }\n            $r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : '');\n            $pos = mb_strpos($subject, $s, 0, 'UTF-8');\n            while ($pos !== false) {\n                $subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8');\n                $pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8');\n            }\n        }\n        return $subject;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Logical.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Calculation_Logical\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Logical\n{\n    /**\n     * TRUE\n     *\n     * Returns the boolean TRUE.\n     *\n     * Excel Function:\n     *        =TRUE()\n     *\n     * @access    public\n     * @category Logical Functions\n     * @return    boolean        True\n     */\n    public static function TRUE()\n    {\n        return true;\n    }\n\n\n    /**\n     * FALSE\n     *\n     * Returns the boolean FALSE.\n     *\n     * Excel Function:\n     *        =FALSE()\n     *\n     * @access    public\n     * @category Logical Functions\n     * @return    boolean        False\n     */\n    public static function FALSE()\n    {\n        return false;\n    }\n\n\n    /**\n     * LOGICAL_AND\n     *\n     * Returns boolean TRUE if all its arguments are TRUE; returns FALSE if one or more argument is FALSE.\n     *\n     * Excel Function:\n     *        =AND(logical1[,logical2[, ...]])\n     *\n     *        The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays\n     *            or references that contain logical values.\n     *\n     *        Boolean arguments are treated as True or False as appropriate\n     *        Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False\n     *        If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds\n     *            the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value\n     *\n     * @access    public\n     * @category Logical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    boolean        The logical AND of the arguments.\n     */\n    public static function LOGICAL_AND()\n    {\n        // Return value\n        $returnValue = true;\n\n        // Loop through the arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        $argCount = -1;\n        foreach ($aArgs as $argCount => $arg) {\n            // Is it a boolean value?\n            if (is_bool($arg)) {\n                $returnValue = $returnValue && $arg;\n            } elseif ((is_numeric($arg)) && (!is_string($arg))) {\n                $returnValue = $returnValue && ($arg != 0);\n            } elseif (is_string($arg)) {\n                $arg = strtoupper($arg);\n                if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) {\n                    $arg = true;\n                } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) {\n                    $arg = false;\n                } else {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n                $returnValue = $returnValue && ($arg != 0);\n            }\n        }\n\n        // Return\n        if ($argCount < 0) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * LOGICAL_OR\n     *\n     * Returns boolean TRUE if any argument is TRUE; returns FALSE if all arguments are FALSE.\n     *\n     * Excel Function:\n     *        =OR(logical1[,logical2[, ...]])\n     *\n     *        The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays\n     *            or references that contain logical values.\n     *\n     *        Boolean arguments are treated as True or False as appropriate\n     *        Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False\n     *        If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds\n     *            the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value\n     *\n     * @access    public\n     * @category Logical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    boolean        The logical OR of the arguments.\n     */\n    public static function LOGICAL_OR()\n    {\n        // Return value\n        $returnValue = false;\n\n        // Loop through the arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        $argCount = -1;\n        foreach ($aArgs as $argCount => $arg) {\n            // Is it a boolean value?\n            if (is_bool($arg)) {\n                $returnValue = $returnValue || $arg;\n            } elseif ((is_numeric($arg)) && (!is_string($arg))) {\n                $returnValue = $returnValue || ($arg != 0);\n            } elseif (is_string($arg)) {\n                $arg = strtoupper($arg);\n                if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) {\n                    $arg = true;\n                } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) {\n                    $arg = false;\n                } else {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n                $returnValue = $returnValue || ($arg != 0);\n            }\n        }\n\n        // Return\n        if ($argCount < 0) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * NOT\n     *\n     * Returns the boolean inverse of the argument.\n     *\n     * Excel Function:\n     *        =NOT(logical)\n     *\n     *        The argument must evaluate to a logical value such as TRUE or FALSE\n     *\n     *        Boolean arguments are treated as True or False as appropriate\n     *        Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False\n     *        If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds\n     *            the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value\n     *\n     * @access    public\n     * @category Logical Functions\n     * @param    mixed        $logical    A value or expression that can be evaluated to TRUE or FALSE\n     * @return    boolean        The boolean inverse of the argument.\n     */\n    public static function NOT($logical = false)\n    {\n        $logical = PHPExcel_Calculation_Functions::flattenSingleValue($logical);\n        if (is_string($logical)) {\n            $logical = strtoupper($logical);\n            if (($logical == 'TRUE') || ($logical == PHPExcel_Calculation::getTRUE())) {\n                return false;\n            } elseif (($logical == 'FALSE') || ($logical == PHPExcel_Calculation::getFALSE())) {\n                return true;\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n\n        return !$logical;\n    }\n\n    /**\n     * STATEMENT_IF\n     *\n     * Returns one value if a condition you specify evaluates to TRUE and another value if it evaluates to FALSE.\n     *\n     * Excel Function:\n     *        =IF(condition[,returnIfTrue[,returnIfFalse]])\n     *\n     *        Condition is any value or expression that can be evaluated to TRUE or FALSE.\n     *            For example, A10=100 is a logical expression; if the value in cell A10 is equal to 100,\n     *            the expression evaluates to TRUE. Otherwise, the expression evaluates to FALSE.\n     *            This argument can use any comparison calculation operator.\n     *        ReturnIfTrue is the value that is returned if condition evaluates to TRUE.\n     *            For example, if this argument is the text string \"Within budget\" and the condition argument evaluates to TRUE,\n     *            then the IF function returns the text \"Within budget\"\n     *            If condition is TRUE and ReturnIfTrue is blank, this argument returns 0 (zero). To display the word TRUE, use\n     *            the logical value TRUE for this argument.\n     *            ReturnIfTrue can be another formula.\n     *        ReturnIfFalse is the value that is returned if condition evaluates to FALSE.\n     *            For example, if this argument is the text string \"Over budget\" and the condition argument evaluates to FALSE,\n     *            then the IF function returns the text \"Over budget\".\n     *            If condition is FALSE and ReturnIfFalse is omitted, then the logical value FALSE is returned.\n     *            If condition is FALSE and ReturnIfFalse is blank, then the value 0 (zero) is returned.\n     *            ReturnIfFalse can be another formula.\n     *\n     * @access    public\n     * @category Logical Functions\n     * @param    mixed    $condition        Condition to evaluate\n     * @param    mixed    $returnIfTrue    Value to return when condition is true\n     * @param    mixed    $returnIfFalse    Optional value to return when condition is false\n     * @return    mixed    The value of returnIfTrue or returnIfFalse determined by condition\n     */\n    public static function STATEMENT_IF($condition = true, $returnIfTrue = 0, $returnIfFalse = false)\n    {\n        $condition     = (is_null($condition))     ? true :  (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($condition);\n        $returnIfTrue  = (is_null($returnIfTrue))  ? 0 :     PHPExcel_Calculation_Functions::flattenSingleValue($returnIfTrue);\n        $returnIfFalse = (is_null($returnIfFalse)) ? false : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfFalse);\n\n        return ($condition) ? $returnIfTrue : $returnIfFalse;\n    }\n\n\n    /**\n     * IFERROR\n     *\n     * Excel Function:\n     *        =IFERROR(testValue,errorpart)\n     *\n     * @access    public\n     * @category Logical Functions\n     * @param    mixed    $testValue    Value to check, is also the value returned when no error\n     * @param    mixed    $errorpart    Value to return when testValue is an error condition\n     * @return    mixed    The value of errorpart or testValue determined by error condition\n     */\n    public static function IFERROR($testValue = '', $errorpart = '')\n    {\n        $testValue = (is_null($testValue)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($testValue);\n        $errorpart = (is_null($errorpart)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($errorpart);\n\n        return self::STATEMENT_IF(PHPExcel_Calculation_Functions::IS_ERROR($testValue), $errorpart, $testValue);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/LookupRef.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Calculation_LookupRef\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_LookupRef\n{\n    /**\n     * CELL_ADDRESS\n     *\n     * Creates a cell address as text, given specified row and column numbers.\n     *\n     * Excel Function:\n     *        =ADDRESS(row, column, [relativity], [referenceStyle], [sheetText])\n     *\n     * @param    row                Row number to use in the cell reference\n     * @param    column            Column number to use in the cell reference\n     * @param    relativity        Flag indicating the type of reference to return\n     *                                1 or omitted    Absolute\n     *                                2                Absolute row; relative column\n     *                                3                Relative row; absolute column\n     *                                4                Relative\n     * @param    referenceStyle    A logical value that specifies the A1 or R1C1 reference style.\n     *                                TRUE or omitted        CELL_ADDRESS returns an A1-style reference\n     *                                FALSE                CELL_ADDRESS returns an R1C1-style reference\n     * @param    sheetText        Optional Name of worksheet to use\n     * @return    string\n     */\n    public static function CELL_ADDRESS($row, $column, $relativity = 1, $referenceStyle = true, $sheetText = '')\n    {\n        $row        = PHPExcel_Calculation_Functions::flattenSingleValue($row);\n        $column     = PHPExcel_Calculation_Functions::flattenSingleValue($column);\n        $relativity = PHPExcel_Calculation_Functions::flattenSingleValue($relativity);\n        $sheetText  = PHPExcel_Calculation_Functions::flattenSingleValue($sheetText);\n\n        if (($row < 1) || ($column < 1)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if ($sheetText > '') {\n            if (strpos($sheetText, ' ') !== false) {\n                $sheetText = \"'\".$sheetText.\"'\";\n            }\n            $sheetText .='!';\n        }\n        if ((!is_bool($referenceStyle)) || $referenceStyle) {\n            $rowRelative = $columnRelative = '$';\n            $column = PHPExcel_Cell::stringFromColumnIndex($column-1);\n            if (($relativity == 2) || ($relativity == 4)) {\n                $columnRelative = '';\n            }\n            if (($relativity == 3) || ($relativity == 4)) {\n                $rowRelative = '';\n            }\n            return $sheetText.$columnRelative.$column.$rowRelative.$row;\n        } else {\n            if (($relativity == 2) || ($relativity == 4)) {\n                $column = '['.$column.']';\n            }\n            if (($relativity == 3) || ($relativity == 4)) {\n                $row = '['.$row.']';\n            }\n            return $sheetText.'R'.$row.'C'.$column;\n        }\n    }\n\n\n    /**\n     * COLUMN\n     *\n     * Returns the column number of the given cell reference\n     * If the cell reference is a range of cells, COLUMN returns the column numbers of each column in the reference as a horizontal array.\n     * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the\n     *        reference of the cell in which the COLUMN function appears; otherwise this function returns 0.\n     *\n     * Excel Function:\n     *        =COLUMN([cellAddress])\n     *\n     * @param    cellAddress        A reference to a range of cells for which you want the column numbers\n     * @return    integer or array of integer\n     */\n    public static function COLUMN($cellAddress = null)\n    {\n        if (is_null($cellAddress) || trim($cellAddress) === '') {\n            return 0;\n        }\n\n        if (is_array($cellAddress)) {\n            foreach ($cellAddress as $columnKey => $value) {\n                $columnKey = preg_replace('/[^a-z]/i', '', $columnKey);\n                return (integer) PHPExcel_Cell::columnIndexFromString($columnKey);\n            }\n        } else {\n            if (strpos($cellAddress, '!') !== false) {\n                list($sheet, $cellAddress) = explode('!', $cellAddress);\n            }\n            if (strpos($cellAddress, ':') !== false) {\n                list($startAddress, $endAddress) = explode(':', $cellAddress);\n                $startAddress = preg_replace('/[^a-z]/i', '', $startAddress);\n                $endAddress = preg_replace('/[^a-z]/i', '', $endAddress);\n                $returnValue = array();\n                do {\n                    $returnValue[] = (integer) PHPExcel_Cell::columnIndexFromString($startAddress);\n                } while ($startAddress++ != $endAddress);\n                return $returnValue;\n            } else {\n                $cellAddress = preg_replace('/[^a-z]/i', '', $cellAddress);\n                return (integer) PHPExcel_Cell::columnIndexFromString($cellAddress);\n            }\n        }\n    }\n\n\n    /**\n     * COLUMNS\n     *\n     * Returns the number of columns in an array or reference.\n     *\n     * Excel Function:\n     *        =COLUMNS(cellAddress)\n     *\n     * @param    cellAddress        An array or array formula, or a reference to a range of cells for which you want the number of columns\n     * @return    integer            The number of columns in cellAddress\n     */\n    public static function COLUMNS($cellAddress = null)\n    {\n        if (is_null($cellAddress) || $cellAddress === '') {\n            return 1;\n        } elseif (!is_array($cellAddress)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        reset($cellAddress);\n        $isMatrix = (is_numeric(key($cellAddress)));\n        list($columns, $rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress);\n\n        if ($isMatrix) {\n            return $rows;\n        } else {\n            return $columns;\n        }\n    }\n\n\n    /**\n     * ROW\n     *\n     * Returns the row number of the given cell reference\n     * If the cell reference is a range of cells, ROW returns the row numbers of each row in the reference as a vertical array.\n     * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the\n     *        reference of the cell in which the ROW function appears; otherwise this function returns 0.\n     *\n     * Excel Function:\n     *        =ROW([cellAddress])\n     *\n     * @param    cellAddress        A reference to a range of cells for which you want the row numbers\n     * @return    integer or array of integer\n     */\n    public static function ROW($cellAddress = null)\n    {\n        if (is_null($cellAddress) || trim($cellAddress) === '') {\n            return 0;\n        }\n\n        if (is_array($cellAddress)) {\n            foreach ($cellAddress as $columnKey => $rowValue) {\n                foreach ($rowValue as $rowKey => $cellValue) {\n                    return (integer) preg_replace('/[^0-9]/i', '', $rowKey);\n                }\n            }\n        } else {\n            if (strpos($cellAddress, '!') !== false) {\n                list($sheet, $cellAddress) = explode('!', $cellAddress);\n            }\n            if (strpos($cellAddress, ':') !== false) {\n                list($startAddress, $endAddress) = explode(':', $cellAddress);\n                $startAddress = preg_replace('/[^0-9]/', '', $startAddress);\n                $endAddress = preg_replace('/[^0-9]/', '', $endAddress);\n                $returnValue = array();\n                do {\n                    $returnValue[][] = (integer) $startAddress;\n                } while ($startAddress++ != $endAddress);\n                return $returnValue;\n            } else {\n                list($cellAddress) = explode(':', $cellAddress);\n                return (integer) preg_replace('/[^0-9]/', '', $cellAddress);\n            }\n        }\n    }\n\n\n    /**\n     * ROWS\n     *\n     * Returns the number of rows in an array or reference.\n     *\n     * Excel Function:\n     *        =ROWS(cellAddress)\n     *\n     * @param    cellAddress        An array or array formula, or a reference to a range of cells for which you want the number of rows\n     * @return    integer            The number of rows in cellAddress\n     */\n    public static function ROWS($cellAddress = null)\n    {\n        if (is_null($cellAddress) || $cellAddress === '') {\n            return 1;\n        } elseif (!is_array($cellAddress)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        reset($cellAddress);\n        $isMatrix = (is_numeric(key($cellAddress)));\n        list($columns, $rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress);\n\n        if ($isMatrix) {\n            return $columns;\n        } else {\n            return $rows;\n        }\n    }\n\n\n    /**\n     * HYPERLINK\n     *\n     * Excel Function:\n     *        =HYPERLINK(linkURL,displayName)\n     *\n     * @access    public\n     * @category Logical Functions\n     * @param    string            $linkURL        Value to check, is also the value returned when no error\n     * @param    string            $displayName    Value to return when testValue is an error condition\n     * @param    PHPExcel_Cell    $pCell            The cell to set the hyperlink in\n     * @return    mixed    The value of $displayName (or $linkURL if $displayName was blank)\n     */\n    public static function HYPERLINK($linkURL = '', $displayName = null, PHPExcel_Cell $pCell = null)\n    {\n        $args = func_get_args();\n        $pCell = array_pop($args);\n\n        $linkURL     = (is_null($linkURL))     ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($linkURL);\n        $displayName = (is_null($displayName)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($displayName);\n\n        if ((!is_object($pCell)) || (trim($linkURL) == '')) {\n            return PHPExcel_Calculation_Functions::REF();\n        }\n\n        if ((is_object($displayName)) || trim($displayName) == '') {\n            $displayName = $linkURL;\n        }\n\n        $pCell->getHyperlink()->setUrl($linkURL);\n        $pCell->getHyperlink()->setTooltip($displayName);\n\n        return $displayName;\n    }\n\n\n    /**\n     * INDIRECT\n     *\n     * Returns the reference specified by a text string.\n     * References are immediately evaluated to display their contents.\n     *\n     * Excel Function:\n     *        =INDIRECT(cellAddress)\n     *\n     * NOTE - INDIRECT() does not yet support the optional a1 parameter introduced in Excel 2010\n     *\n     * @param    cellAddress        $cellAddress    The cell address of the current cell (containing this formula)\n     * @param    PHPExcel_Cell    $pCell            The current cell (containing this formula)\n     * @return    mixed            The cells referenced by cellAddress\n     *\n     * @todo    Support for the optional a1 parameter introduced in Excel 2010\n     *\n     */\n    public static function INDIRECT($cellAddress = null, PHPExcel_Cell $pCell = null)\n    {\n        $cellAddress    = PHPExcel_Calculation_Functions::flattenSingleValue($cellAddress);\n        if (is_null($cellAddress) || $cellAddress === '') {\n            return PHPExcel_Calculation_Functions::REF();\n        }\n\n        $cellAddress1 = $cellAddress;\n        $cellAddress2 = null;\n        if (strpos($cellAddress, ':') !== false) {\n            list($cellAddress1, $cellAddress2) = explode(':', $cellAddress);\n        }\n\n        if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress1, $matches)) ||\n            ((!is_null($cellAddress2)) && (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress2, $matches)))) {\n            if (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $cellAddress1, $matches)) {\n                return PHPExcel_Calculation_Functions::REF();\n            }\n\n            if (strpos($cellAddress, '!') !== false) {\n                list($sheetName, $cellAddress) = explode('!', $cellAddress);\n                $sheetName = trim($sheetName, \"'\");\n                $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);\n            } else {\n                $pSheet = $pCell->getWorksheet();\n            }\n\n            return PHPExcel_Calculation::getInstance()->extractNamedRange($cellAddress, $pSheet, false);\n        }\n\n        if (strpos($cellAddress, '!') !== false) {\n            list($sheetName, $cellAddress) = explode('!', $cellAddress);\n            $sheetName = trim($sheetName, \"'\");\n            $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);\n        } else {\n            $pSheet = $pCell->getWorksheet();\n        }\n\n        return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false);\n    }\n\n\n    /**\n     * OFFSET\n     *\n     * Returns a reference to a range that is a specified number of rows and columns from a cell or range of cells.\n     * The reference that is returned can be a single cell or a range of cells. You can specify the number of rows and\n     * the number of columns to be returned.\n     *\n     * Excel Function:\n     *        =OFFSET(cellAddress, rows, cols, [height], [width])\n     *\n     * @param    cellAddress        The reference from which you want to base the offset. Reference must refer to a cell or\n     *                                range of adjacent cells; otherwise, OFFSET returns the #VALUE! error value.\n     * @param    rows            The number of rows, up or down, that you want the upper-left cell to refer to.\n     *                                Using 5 as the rows argument specifies that the upper-left cell in the reference is\n     *                                five rows below reference. Rows can be positive (which means below the starting reference)\n     *                                or negative (which means above the starting reference).\n     * @param    cols            The number of columns, to the left or right, that you want the upper-left cell of the result\n     *                                to refer to. Using 5 as the cols argument specifies that the upper-left cell in the\n     *                                reference is five columns to the right of reference. Cols can be positive (which means\n     *                                to the right of the starting reference) or negative (which means to the left of the\n     *                                starting reference).\n     * @param    height            The height, in number of rows, that you want the returned reference to be. Height must be a positive number.\n     * @param    width            The width, in number of columns, that you want the returned reference to be. Width must be a positive number.\n     * @return    string            A reference to a cell or range of cells\n     */\n    public static function OFFSET($cellAddress = null, $rows = 0, $columns = 0, $height = null, $width = null)\n    {\n        $rows    = PHPExcel_Calculation_Functions::flattenSingleValue($rows);\n        $columns = PHPExcel_Calculation_Functions::flattenSingleValue($columns);\n        $height  = PHPExcel_Calculation_Functions::flattenSingleValue($height);\n        $width   = PHPExcel_Calculation_Functions::flattenSingleValue($width);\n        if ($cellAddress == null) {\n            return 0;\n        }\n\n        $args = func_get_args();\n        $pCell = array_pop($args);\n        if (!is_object($pCell)) {\n            return PHPExcel_Calculation_Functions::REF();\n        }\n\n        $sheetName = null;\n        if (strpos($cellAddress, \"!\")) {\n            list($sheetName, $cellAddress) = explode(\"!\", $cellAddress);\n            $sheetName = trim($sheetName, \"'\");\n        }\n        if (strpos($cellAddress, \":\")) {\n            list($startCell, $endCell) = explode(\":\", $cellAddress);\n        } else {\n            $startCell = $endCell = $cellAddress;\n        }\n        list($startCellColumn, $startCellRow) = PHPExcel_Cell::coordinateFromString($startCell);\n        list($endCellColumn, $endCellRow) = PHPExcel_Cell::coordinateFromString($endCell);\n\n        $startCellRow += $rows;\n        $startCellColumn = PHPExcel_Cell::columnIndexFromString($startCellColumn) - 1;\n        $startCellColumn += $columns;\n\n        if (($startCellRow <= 0) || ($startCellColumn < 0)) {\n            return PHPExcel_Calculation_Functions::REF();\n        }\n        $endCellColumn = PHPExcel_Cell::columnIndexFromString($endCellColumn) - 1;\n        if (($width != null) && (!is_object($width))) {\n            $endCellColumn = $startCellColumn + $width - 1;\n        } else {\n            $endCellColumn += $columns;\n        }\n        $startCellColumn = PHPExcel_Cell::stringFromColumnIndex($startCellColumn);\n\n        if (($height != null) && (!is_object($height))) {\n            $endCellRow = $startCellRow + $height - 1;\n        } else {\n            $endCellRow += $rows;\n        }\n\n        if (($endCellRow <= 0) || ($endCellColumn < 0)) {\n            return PHPExcel_Calculation_Functions::REF();\n        }\n        $endCellColumn = PHPExcel_Cell::stringFromColumnIndex($endCellColumn);\n\n        $cellAddress = $startCellColumn.$startCellRow;\n        if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) {\n            $cellAddress .= ':'.$endCellColumn.$endCellRow;\n        }\n\n        if ($sheetName !== null) {\n            $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);\n        } else {\n            $pSheet = $pCell->getWorksheet();\n        }\n\n        return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false);\n    }\n\n\n    /**\n     * CHOOSE\n     *\n     * Uses lookup_value to return a value from the list of value arguments.\n     * Use CHOOSE to select one of up to 254 values based on the lookup_value.\n     *\n     * Excel Function:\n     *        =CHOOSE(index_num, value1, [value2], ...)\n     *\n     * @param    index_num        Specifies which value argument is selected.\n     *                            Index_num must be a number between 1 and 254, or a formula or reference to a cell containing a number\n     *                                between 1 and 254.\n     * @param    value1...        Value1 is required, subsequent values are optional.\n     *                            Between 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on\n     *                                index_num. The arguments can be numbers, cell references, defined names, formulas, functions, or\n     *                                text.\n     * @return    mixed            The selected value\n     */\n    public static function CHOOSE()\n    {\n        $chooseArgs = func_get_args();\n        $chosenEntry = PHPExcel_Calculation_Functions::flattenArray(array_shift($chooseArgs));\n        $entryCount = count($chooseArgs) - 1;\n\n        if (is_array($chosenEntry)) {\n            $chosenEntry = array_shift($chosenEntry);\n        }\n        if ((is_numeric($chosenEntry)) && (!is_bool($chosenEntry))) {\n            --$chosenEntry;\n        } else {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $chosenEntry = floor($chosenEntry);\n        if (($chosenEntry < 0) || ($chosenEntry > $entryCount)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (is_array($chooseArgs[$chosenEntry])) {\n            return PHPExcel_Calculation_Functions::flattenArray($chooseArgs[$chosenEntry]);\n        } else {\n            return $chooseArgs[$chosenEntry];\n        }\n    }\n\n\n    /**\n     * MATCH\n     *\n     * The MATCH function searches for a specified item in a range of cells\n     *\n     * Excel Function:\n     *        =MATCH(lookup_value, lookup_array, [match_type])\n     *\n     * @param    lookup_value    The value that you want to match in lookup_array\n     * @param    lookup_array    The range of cells being searched\n     * @param    match_type        The number -1, 0, or 1. -1 means above, 0 means exact match, 1 means below. If match_type is 1 or -1, the list has to be ordered.\n     * @return    integer            The relative position of the found item\n     */\n    public static function MATCH($lookup_value, $lookup_array, $match_type = 1)\n    {\n        $lookup_array = PHPExcel_Calculation_Functions::flattenArray($lookup_array);\n        $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);\n        $match_type    = (is_null($match_type)) ? 1 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($match_type);\n        //    MATCH is not case sensitive\n        $lookup_value = strtolower($lookup_value);\n\n        //    lookup_value type has to be number, text, or logical values\n        if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n\n        //    match_type is 0, 1 or -1\n        if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n\n        //    lookup_array should not be empty\n        $lookupArraySize = count($lookup_array);\n        if ($lookupArraySize <= 0) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n\n        //    lookup_array should contain only number, text, or logical values, or empty (null) cells\n        foreach ($lookup_array as $i => $lookupArrayValue) {\n            //    check the type of the value\n            if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) &&\n                (!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            //    convert strings to lowercase for case-insensitive testing\n            if (is_string($lookupArrayValue)) {\n                $lookup_array[$i] = strtolower($lookupArrayValue);\n            }\n            if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) {\n                $lookup_array = array_slice($lookup_array, 0, $i-1);\n            }\n        }\n\n        // if match_type is 1 or -1, the list has to be ordered\n        if ($match_type == 1) {\n            asort($lookup_array);\n            $keySet = array_keys($lookup_array);\n        } elseif ($match_type == -1) {\n            arsort($lookup_array);\n            $keySet = array_keys($lookup_array);\n        }\n\n        // **\n        // find the match\n        // **\n        foreach ($lookup_array as $i => $lookupArrayValue) {\n            if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) {\n                //    exact match\n                return ++$i;\n            } elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) {\n                $i = array_search($i, $keySet);\n                // if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value\n                if ($i < 1) {\n                    // 1st cell was already smaller than the lookup_value\n                    break;\n                } else {\n                    // the previous cell was the match\n                    return $keySet[$i-1]+1;\n                }\n            } elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) {\n                $i = array_search($i, $keySet);\n                // if match_type is 1 <=> find the largest value that is less than or equal to lookup_value\n                if ($i < 1) {\n                    // 1st cell was already bigger than the lookup_value\n                    break;\n                } else {\n                    // the previous cell was the match\n                    return $keySet[$i-1]+1;\n                }\n            }\n        }\n\n        //    unsuccessful in finding a match, return #N/A error value\n        return PHPExcel_Calculation_Functions::NA();\n    }\n\n\n    /**\n     * INDEX\n     *\n     * Uses an index to choose a value from a reference or array\n     *\n     * Excel Function:\n     *        =INDEX(range_array, row_num, [column_num])\n     *\n     * @param    range_array        A range of cells or an array constant\n     * @param    row_num            The row in array from which to return a value. If row_num is omitted, column_num is required.\n     * @param    column_num        The column in array from which to return a value. If column_num is omitted, row_num is required.\n     * @return    mixed            the value of a specified cell or array of cells\n     */\n    public static function INDEX($arrayValues, $rowNum = 0, $columnNum = 0)\n    {\n        if (($rowNum < 0) || ($columnNum < 0)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (!is_array($arrayValues)) {\n            return PHPExcel_Calculation_Functions::REF();\n        }\n\n        $rowKeys = array_keys($arrayValues);\n        $columnKeys = @array_keys($arrayValues[$rowKeys[0]]);\n\n        if ($columnNum > count($columnKeys)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($columnNum == 0) {\n            if ($rowNum == 0) {\n                return $arrayValues;\n            }\n            $rowNum = $rowKeys[--$rowNum];\n            $returnArray = array();\n            foreach ($arrayValues as $arrayColumn) {\n                if (is_array($arrayColumn)) {\n                    if (isset($arrayColumn[$rowNum])) {\n                        $returnArray[] = $arrayColumn[$rowNum];\n                    } else {\n                        return $arrayValues[$rowNum];\n                    }\n                } else {\n                    return $arrayValues[$rowNum];\n                }\n            }\n            return $returnArray;\n        }\n        $columnNum = $columnKeys[--$columnNum];\n        if ($rowNum > count($rowKeys)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif ($rowNum == 0) {\n            return $arrayValues[$columnNum];\n        }\n        $rowNum = $rowKeys[--$rowNum];\n\n        return $arrayValues[$rowNum][$columnNum];\n    }\n\n\n    /**\n     * TRANSPOSE\n     *\n     * @param    array    $matrixData    A matrix of values\n     * @return    array\n     *\n     * Unlike the Excel TRANSPOSE function, which will only work on a single row or column, this function will transpose a full matrix.\n     */\n    public static function TRANSPOSE($matrixData)\n    {\n        $returnMatrix = array();\n        if (!is_array($matrixData)) {\n            $matrixData = array(array($matrixData));\n        }\n\n        $column = 0;\n        foreach ($matrixData as $matrixRow) {\n            $row = 0;\n            foreach ($matrixRow as $matrixCell) {\n                $returnMatrix[$row][$column] = $matrixCell;\n                ++$row;\n            }\n            ++$column;\n        }\n        return $returnMatrix;\n    }\n\n\n    private static function vlookupSort($a, $b)\n    {\n        reset($a);\n        $firstColumn = key($a);\n        if (($aLower = strtolower($a[$firstColumn])) == ($bLower = strtolower($b[$firstColumn]))) {\n            return 0;\n        }\n        return ($aLower < $bLower) ? -1 : 1;\n    }\n\n\n    /**\n     * VLOOKUP\n     * The VLOOKUP function searches for value in the left-most column of lookup_array and returns the value in the same row based on the index_number.\n     * @param    lookup_value    The value that you want to match in lookup_array\n     * @param    lookup_array    The range of cells being searched\n     * @param    index_number    The column number in table_array from which the matching value must be returned. The first column is 1.\n     * @param    not_exact_match    Determines if you are looking for an exact match based on lookup_value.\n     * @return    mixed            The value of the found cell\n     */\n    public static function VLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true)\n    {\n        $lookup_value    = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);\n        $index_number    = PHPExcel_Calculation_Functions::flattenSingleValue($index_number);\n        $not_exact_match = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match);\n\n        // index_number must be greater than or equal to 1\n        if ($index_number < 1) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // index_number must be less than or equal to the number of columns in lookup_array\n        if ((!is_array($lookup_array)) || (empty($lookup_array))) {\n            return PHPExcel_Calculation_Functions::REF();\n        } else {\n            $f = array_keys($lookup_array);\n            $firstRow = array_pop($f);\n            if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) {\n                return PHPExcel_Calculation_Functions::REF();\n            } else {\n                $columnKeys = array_keys($lookup_array[$firstRow]);\n                $returnColumn = $columnKeys[--$index_number];\n                $firstColumn = array_shift($columnKeys);\n            }\n        }\n\n        if (!$not_exact_match) {\n            uasort($lookup_array, array('self', 'vlookupSort'));\n        }\n\n        $rowNumber = $rowValue = false;\n        foreach ($lookup_array as $rowKey => $rowData) {\n            if ((is_numeric($lookup_value) && is_numeric($rowData[$firstColumn]) && ($rowData[$firstColumn] > $lookup_value)) ||\n                (!is_numeric($lookup_value) && !is_numeric($rowData[$firstColumn]) && (strtolower($rowData[$firstColumn]) > strtolower($lookup_value)))) {\n                break;\n            }\n            $rowNumber = $rowKey;\n            $rowValue = $rowData[$firstColumn];\n        }\n\n        if ($rowNumber !== false) {\n            if ((!$not_exact_match) && ($rowValue != $lookup_value)) {\n                //    if an exact match is required, we have what we need to return an appropriate response\n                return PHPExcel_Calculation_Functions::NA();\n            } else {\n                //    otherwise return the appropriate value\n                return $lookup_array[$rowNumber][$returnColumn];\n            }\n        }\n\n        return PHPExcel_Calculation_Functions::NA();\n    }\n\n\n    /**\n     * HLOOKUP\n     * The HLOOKUP function searches for value in the top-most row of lookup_array and returns the value in the same column based on the index_number.\n     * @param    lookup_value    The value that you want to match in lookup_array\n     * @param    lookup_array    The range of cells being searched\n     * @param    index_number    The row number in table_array from which the matching value must be returned. The first row is 1.\n     * @param    not_exact_match Determines if you are looking for an exact match based on lookup_value.\n     * @return   mixed           The value of the found cell\n     */\n    public static function HLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true)\n    {\n        $lookup_value   = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);\n        $index_number   = PHPExcel_Calculation_Functions::flattenSingleValue($index_number);\n        $not_exact_match    = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match);\n\n        // index_number must be greater than or equal to 1\n        if ($index_number < 1) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        // index_number must be less than or equal to the number of columns in lookup_array\n        if ((!is_array($lookup_array)) || (empty($lookup_array))) {\n            return PHPExcel_Calculation_Functions::REF();\n        } else {\n            $f = array_keys($lookup_array);\n            $firstRow = array_pop($f);\n            if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) {\n                return PHPExcel_Calculation_Functions::REF();\n            } else {\n                $columnKeys = array_keys($lookup_array[$firstRow]);\n                                $firstkey = $f[0] - 1;\n                $returnColumn = $firstkey + $index_number;\n                $firstColumn = array_shift($f);\n            }\n        }\n\n        if (!$not_exact_match) {\n            $firstRowH = asort($lookup_array[$firstColumn]);\n        }\n\n        $rowNumber = $rowValue = false;\n        foreach ($lookup_array[$firstColumn] as $rowKey => $rowData) {\n            if ((is_numeric($lookup_value) && is_numeric($rowData) && ($rowData > $lookup_value)) ||\n                (!is_numeric($lookup_value) && !is_numeric($rowData) && (strtolower($rowData) > strtolower($lookup_value)))) {\n                break;\n            }\n            $rowNumber = $rowKey;\n            $rowValue = $rowData;\n        }\n\n        if ($rowNumber !== false) {\n            if ((!$not_exact_match) && ($rowValue != $lookup_value)) {\n                //  if an exact match is required, we have what we need to return an appropriate response\n                return PHPExcel_Calculation_Functions::NA();\n            } else {\n                //  otherwise return the appropriate value\n                return $lookup_array[$returnColumn][$rowNumber];\n            }\n        }\n\n        return PHPExcel_Calculation_Functions::NA();\n    }\n\n\n    /**\n     * LOOKUP\n     * The LOOKUP function searches for value either from a one-row or one-column range or from an array.\n     * @param    lookup_value    The value that you want to match in lookup_array\n     * @param    lookup_vector    The range of cells being searched\n     * @param    result_vector    The column from which the matching value must be returned\n     * @return    mixed            The value of the found cell\n     */\n    public static function LOOKUP($lookup_value, $lookup_vector, $result_vector = null)\n    {\n        $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value);\n\n        if (!is_array($lookup_vector)) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n        $lookupRows = count($lookup_vector);\n        $l = array_keys($lookup_vector);\n        $l = array_shift($l);\n        $lookupColumns = count($lookup_vector[$l]);\n        if ((($lookupRows == 1) && ($lookupColumns > 1)) || (($lookupRows == 2) && ($lookupColumns != 2))) {\n            $lookup_vector = self::TRANSPOSE($lookup_vector);\n            $lookupRows = count($lookup_vector);\n            $l = array_keys($lookup_vector);\n            $lookupColumns = count($lookup_vector[array_shift($l)]);\n        }\n\n        if (is_null($result_vector)) {\n            $result_vector = $lookup_vector;\n        }\n        $resultRows = count($result_vector);\n        $l = array_keys($result_vector);\n        $l = array_shift($l);\n        $resultColumns = count($result_vector[$l]);\n        if ((($resultRows == 1) && ($resultColumns > 1)) || (($resultRows == 2) && ($resultColumns != 2))) {\n            $result_vector = self::TRANSPOSE($result_vector);\n            $resultRows = count($result_vector);\n            $r = array_keys($result_vector);\n            $resultColumns = count($result_vector[array_shift($r)]);\n        }\n\n        if ($lookupRows == 2) {\n            $result_vector = array_pop($lookup_vector);\n            $lookup_vector = array_shift($lookup_vector);\n        }\n        if ($lookupColumns != 2) {\n            foreach ($lookup_vector as &$value) {\n                if (is_array($value)) {\n                    $k = array_keys($value);\n                    $key1 = $key2 = array_shift($k);\n                    $key2++;\n                    $dataValue1 = $value[$key1];\n                } else {\n                    $key1 = 0;\n                    $key2 = 1;\n                    $dataValue1 = $value;\n                }\n                $dataValue2 = array_shift($result_vector);\n                if (is_array($dataValue2)) {\n                    $dataValue2 = array_shift($dataValue2);\n                }\n                $value = array($key1 => $dataValue1, $key2 => $dataValue2);\n            }\n            unset($value);\n        }\n\n        return self::VLOOKUP($lookup_value, $lookup_vector, 2);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/MathTrig.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Calculation_MathTrig\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_MathTrig\n{\n    //\n    //    Private method to return an array of the factors of the input value\n    //\n    private static function factors($value)\n    {\n        $startVal = floor(sqrt($value));\n\n        $factorArray = array();\n        for ($i = $startVal; $i > 1; --$i) {\n            if (($value % $i) == 0) {\n                $factorArray = array_merge($factorArray, self::factors($value / $i));\n                $factorArray = array_merge($factorArray, self::factors($i));\n                if ($i <= sqrt($value)) {\n                    break;\n                }\n            }\n        }\n        if (!empty($factorArray)) {\n            rsort($factorArray);\n            return $factorArray;\n        } else {\n            return array((integer) $value);\n        }\n    }\n\n\n    private static function romanCut($num, $n)\n    {\n        return ($num - ($num % $n ) ) / $n;\n    }\n\n\n    /**\n     * ATAN2\n     *\n     * This function calculates the arc tangent of the two variables x and y. It is similar to\n     *        calculating the arc tangent of y ÷ x, except that the signs of both arguments are used\n     *        to determine the quadrant of the result.\n     * The arctangent is the angle from the x-axis to a line containing the origin (0, 0) and a\n     *        point with coordinates (xCoordinate, yCoordinate). The angle is given in radians between\n     *        -pi and pi, excluding -pi.\n     *\n     * Note that the Excel ATAN2() function accepts its arguments in the reverse order to the standard\n     *        PHP atan2() function, so we need to reverse them here before calling the PHP atan() function.\n     *\n     * Excel Function:\n     *        ATAN2(xCoordinate,yCoordinate)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $xCoordinate        The x-coordinate of the point.\n     * @param    float    $yCoordinate        The y-coordinate of the point.\n     * @return    float    The inverse tangent of the specified x- and y-coordinates.\n     */\n    public static function ATAN2($xCoordinate = null, $yCoordinate = null)\n    {\n        $xCoordinate = PHPExcel_Calculation_Functions::flattenSingleValue($xCoordinate);\n        $yCoordinate = PHPExcel_Calculation_Functions::flattenSingleValue($yCoordinate);\n\n        $xCoordinate = ($xCoordinate !== null) ? $xCoordinate : 0.0;\n        $yCoordinate = ($yCoordinate !== null) ? $yCoordinate : 0.0;\n\n        if (((is_numeric($xCoordinate)) || (is_bool($xCoordinate))) &&\n            ((is_numeric($yCoordinate)))  || (is_bool($yCoordinate))) {\n            $xCoordinate    = (float) $xCoordinate;\n            $yCoordinate    = (float) $yCoordinate;\n\n            if (($xCoordinate == 0) && ($yCoordinate == 0)) {\n                return PHPExcel_Calculation_Functions::DIV0();\n            }\n\n            return atan2($yCoordinate, $xCoordinate);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * CEILING\n     *\n     * Returns number rounded up, away from zero, to the nearest multiple of significance.\n     *        For example, if you want to avoid using pennies in your prices and your product is\n     *        priced at $4.42, use the formula =CEILING(4.42,0.05) to round prices up to the\n     *        nearest nickel.\n     *\n     * Excel Function:\n     *        CEILING(number[,significance])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $number            The number you want to round.\n     * @param    float    $significance    The multiple to which you want to round.\n     * @return    float    Rounded Number\n     */\n    public static function CEILING($number, $significance = null)\n    {\n        $number       = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $significance = PHPExcel_Calculation_Functions::flattenSingleValue($significance);\n\n        if ((is_null($significance)) &&\n            (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) {\n            $significance = $number / abs($number);\n        }\n\n        if ((is_numeric($number)) && (is_numeric($significance))) {\n            if (($number == 0.0 ) || ($significance == 0.0)) {\n                return 0.0;\n            } elseif (self::SIGN($number) == self::SIGN($significance)) {\n                return ceil($number / $significance) * $significance;\n            } else {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * COMBIN\n     *\n     * Returns the number of combinations for a given number of items. Use COMBIN to\n     *        determine the total possible number of groups for a given number of items.\n     *\n     * Excel Function:\n     *        COMBIN(numObjs,numInSet)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    int        $numObjs    Number of different objects\n     * @param    int        $numInSet    Number of objects in each combination\n     * @return    int        Number of combinations\n     */\n    public static function COMBIN($numObjs, $numInSet)\n    {\n        $numObjs    = PHPExcel_Calculation_Functions::flattenSingleValue($numObjs);\n        $numInSet    = PHPExcel_Calculation_Functions::flattenSingleValue($numInSet);\n\n        if ((is_numeric($numObjs)) && (is_numeric($numInSet))) {\n            if ($numObjs < $numInSet) {\n                return PHPExcel_Calculation_Functions::NaN();\n            } elseif ($numInSet < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return round(self::FACT($numObjs) / self::FACT($numObjs - $numInSet)) / self::FACT($numInSet);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * EVEN\n     *\n     * Returns number rounded up to the nearest even integer.\n     * You can use this function for processing items that come in twos. For example,\n     *        a packing crate accepts rows of one or two items. The crate is full when\n     *        the number of items, rounded up to the nearest two, matches the crate's\n     *        capacity.\n     *\n     * Excel Function:\n     *        EVEN(number)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $number            Number to round\n     * @return    int        Rounded Number\n     */\n    public static function EVEN($number)\n    {\n        $number = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n\n        if (is_null($number)) {\n            return 0;\n        } elseif (is_bool($number)) {\n            $number = (int) $number;\n        }\n\n        if (is_numeric($number)) {\n            $significance = 2 * self::SIGN($number);\n            return (int) self::CEILING($number, $significance);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FACT\n     *\n     * Returns the factorial of a number.\n     * The factorial of a number is equal to 1*2*3*...* number.\n     *\n     * Excel Function:\n     *        FACT(factVal)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $factVal    Factorial Value\n     * @return    int        Factorial\n     */\n    public static function FACT($factVal)\n    {\n        $factVal    = PHPExcel_Calculation_Functions::flattenSingleValue($factVal);\n\n        if (is_numeric($factVal)) {\n            if ($factVal < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $factLoop = floor($factVal);\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                if ($factVal > $factLoop) {\n                    return PHPExcel_Calculation_Functions::NaN();\n                }\n            }\n\n            $factorial = 1;\n            while ($factLoop > 1) {\n                $factorial *= $factLoop--;\n            }\n            return $factorial ;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FACTDOUBLE\n     *\n     * Returns the double factorial of a number.\n     *\n     * Excel Function:\n     *        FACTDOUBLE(factVal)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $factVal    Factorial Value\n     * @return    int        Double Factorial\n     */\n    public static function FACTDOUBLE($factVal)\n    {\n        $factLoop    = PHPExcel_Calculation_Functions::flattenSingleValue($factVal);\n\n        if (is_numeric($factLoop)) {\n            $factLoop    = floor($factLoop);\n            if ($factVal < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $factorial = 1;\n            while ($factLoop > 1) {\n                $factorial *= $factLoop--;\n                --$factLoop;\n            }\n            return $factorial ;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FLOOR\n     *\n     * Rounds number down, toward zero, to the nearest multiple of significance.\n     *\n     * Excel Function:\n     *        FLOOR(number[,significance])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $number            Number to round\n     * @param    float    $significance    Significance\n     * @return    float    Rounded Number\n     */\n    public static function FLOOR($number, $significance = null)\n    {\n        $number            = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $significance    = PHPExcel_Calculation_Functions::flattenSingleValue($significance);\n\n        if ((is_null($significance)) &&\n            (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) {\n            $significance = $number/abs($number);\n        }\n\n        if ((is_numeric($number)) && (is_numeric($significance))) {\n            if ($significance == 0.0) {\n                return PHPExcel_Calculation_Functions::DIV0();\n            } elseif ($number == 0.0) {\n                return 0.0;\n            } elseif (self::SIGN($number) == self::SIGN($significance)) {\n                return floor($number / $significance) * $significance;\n            } else {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n        }\n\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * GCD\n     *\n     * Returns the greatest common divisor of a series of numbers.\n     * The greatest common divisor is the largest integer that divides both\n     *        number1 and number2 without a remainder.\n     *\n     * Excel Function:\n     *        GCD(number1[,number2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed    $arg,...        Data values\n     * @return    integer                    Greatest Common Divisor\n     */\n    public static function GCD()\n    {\n        $returnValue = 1;\n        $allValuesFactors = array();\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $value) {\n            if (!is_numeric($value)) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            } elseif ($value == 0) {\n                continue;\n            } elseif ($value < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $myFactors = self::factors($value);\n            $myCountedFactors = array_count_values($myFactors);\n            $allValuesFactors[] = $myCountedFactors;\n        }\n        $allValuesCount = count($allValuesFactors);\n        if ($allValuesCount == 0) {\n            return 0;\n        }\n\n        $mergedArray = $allValuesFactors[0];\n        for ($i=1; $i < $allValuesCount; ++$i) {\n            $mergedArray = array_intersect_key($mergedArray, $allValuesFactors[$i]);\n        }\n        $mergedArrayValues = count($mergedArray);\n        if ($mergedArrayValues == 0) {\n            return $returnValue;\n        } elseif ($mergedArrayValues > 1) {\n            foreach ($mergedArray as $mergedKey => $mergedValue) {\n                foreach ($allValuesFactors as $highestPowerTest) {\n                    foreach ($highestPowerTest as $testKey => $testValue) {\n                        if (($testKey == $mergedKey) && ($testValue < $mergedValue)) {\n                            $mergedArray[$mergedKey] = $testValue;\n                            $mergedValue = $testValue;\n                        }\n                    }\n                }\n            }\n\n            $returnValue = 1;\n            foreach ($mergedArray as $key => $value) {\n                $returnValue *= pow($key, $value);\n            }\n            return $returnValue;\n        } else {\n            $keys = array_keys($mergedArray);\n            $key = $keys[0];\n            $value = $mergedArray[$key];\n            foreach ($allValuesFactors as $testValue) {\n                foreach ($testValue as $mergedKey => $mergedValue) {\n                    if (($mergedKey == $key) && ($mergedValue < $value)) {\n                        $value = $mergedValue;\n                    }\n                }\n            }\n            return pow($key, $value);\n        }\n    }\n\n\n    /**\n     * INT\n     *\n     * Casts a floating point value to an integer\n     *\n     * Excel Function:\n     *        INT(number)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $number            Number to cast to an integer\n     * @return    integer    Integer value\n     */\n    public static function INT($number)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n\n        if (is_null($number)) {\n            return 0;\n        } elseif (is_bool($number)) {\n            return (int) $number;\n        }\n        if (is_numeric($number)) {\n            return (int) floor($number);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * LCM\n     *\n     * Returns the lowest common multiplier of a series of numbers\n     * The least common multiple is the smallest positive integer that is a multiple\n     * of all integer arguments number1, number2, and so on. Use LCM to add fractions\n     * with different denominators.\n     *\n     * Excel Function:\n     *        LCM(number1[,number2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed    $arg,...        Data values\n     * @return    int        Lowest Common Multiplier\n     */\n    public static function LCM()\n    {\n        $returnValue = 1;\n        $allPoweredFactors = array();\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $value) {\n            if (!is_numeric($value)) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            if ($value == 0) {\n                return 0;\n            } elseif ($value < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $myFactors = self::factors(floor($value));\n            $myCountedFactors = array_count_values($myFactors);\n            $myPoweredFactors = array();\n            foreach ($myCountedFactors as $myCountedFactor => $myCountedPower) {\n                $myPoweredFactors[$myCountedFactor] = pow($myCountedFactor, $myCountedPower);\n            }\n            foreach ($myPoweredFactors as $myPoweredValue => $myPoweredFactor) {\n                if (array_key_exists($myPoweredValue, $allPoweredFactors)) {\n                    if ($allPoweredFactors[$myPoweredValue] < $myPoweredFactor) {\n                        $allPoweredFactors[$myPoweredValue] = $myPoweredFactor;\n                    }\n                } else {\n                    $allPoweredFactors[$myPoweredValue] = $myPoweredFactor;\n                }\n            }\n        }\n        foreach ($allPoweredFactors as $allPoweredFactor) {\n            $returnValue *= (integer) $allPoweredFactor;\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * LOG_BASE\n     *\n     * Returns the logarithm of a number to a specified base. The default base is 10.\n     *\n     * Excel Function:\n     *        LOG(number[,base])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    float    $number        The positive real number for which you want the logarithm\n     * @param    float    $base        The base of the logarithm. If base is omitted, it is assumed to be 10.\n     * @return    float\n     */\n    public static function LOG_BASE($number = null, $base = 10)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $base    = (is_null($base)) ? 10 : (float) PHPExcel_Calculation_Functions::flattenSingleValue($base);\n\n        if ((!is_numeric($base)) || (!is_numeric($number))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (($base <= 0) || ($number <= 0)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return log($number, $base);\n    }\n\n\n    /**\n     * MDETERM\n     *\n     * Returns the matrix determinant of an array.\n     *\n     * Excel Function:\n     *        MDETERM(array)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    array    $matrixValues    A matrix of values\n     * @return    float\n     */\n    public static function MDETERM($matrixValues)\n    {\n        $matrixData = array();\n        if (!is_array($matrixValues)) {\n            $matrixValues = array(array($matrixValues));\n        }\n\n        $row = $maxColumn = 0;\n        foreach ($matrixValues as $matrixRow) {\n            if (!is_array($matrixRow)) {\n                $matrixRow = array($matrixRow);\n            }\n            $column = 0;\n            foreach ($matrixRow as $matrixCell) {\n                if ((is_string($matrixCell)) || ($matrixCell === null)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n                $matrixData[$column][$row] = $matrixCell;\n                ++$column;\n            }\n            if ($column > $maxColumn) {\n                $maxColumn = $column;\n            }\n            ++$row;\n        }\n        if ($row != $maxColumn) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        try {\n            $matrix = new PHPExcel_Shared_JAMA_Matrix($matrixData);\n            return $matrix->det();\n        } catch (PHPExcel_Exception $ex) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n    }\n\n\n    /**\n     * MINVERSE\n     *\n     * Returns the inverse matrix for the matrix stored in an array.\n     *\n     * Excel Function:\n     *        MINVERSE(array)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    array    $matrixValues    A matrix of values\n     * @return    array\n     */\n    public static function MINVERSE($matrixValues)\n    {\n        $matrixData = array();\n        if (!is_array($matrixValues)) {\n            $matrixValues = array(array($matrixValues));\n        }\n\n        $row = $maxColumn = 0;\n        foreach ($matrixValues as $matrixRow) {\n            if (!is_array($matrixRow)) {\n                $matrixRow = array($matrixRow);\n            }\n            $column = 0;\n            foreach ($matrixRow as $matrixCell) {\n                if ((is_string($matrixCell)) || ($matrixCell === null)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n                $matrixData[$column][$row] = $matrixCell;\n                ++$column;\n            }\n            if ($column > $maxColumn) {\n                $maxColumn = $column;\n            }\n            ++$row;\n        }\n        if ($row != $maxColumn) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        try {\n            $matrix = new PHPExcel_Shared_JAMA_Matrix($matrixData);\n            return $matrix->inverse()->getArray();\n        } catch (PHPExcel_Exception $ex) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n    }\n\n\n    /**\n     * MMULT\n     *\n     * @param    array    $matrixData1    A matrix of values\n     * @param    array    $matrixData2    A matrix of values\n     * @return    array\n     */\n    public static function MMULT($matrixData1, $matrixData2)\n    {\n        $matrixAData = $matrixBData = array();\n        if (!is_array($matrixData1)) {\n            $matrixData1 = array(array($matrixData1));\n        }\n        if (!is_array($matrixData2)) {\n            $matrixData2 = array(array($matrixData2));\n        }\n\n        try {\n            $rowA = 0;\n            foreach ($matrixData1 as $matrixRow) {\n                if (!is_array($matrixRow)) {\n                    $matrixRow = array($matrixRow);\n                }\n                $columnA = 0;\n                foreach ($matrixRow as $matrixCell) {\n                    if ((!is_numeric($matrixCell)) || ($matrixCell === null)) {\n                        return PHPExcel_Calculation_Functions::VALUE();\n                    }\n                    $matrixAData[$rowA][$columnA] = $matrixCell;\n                    ++$columnA;\n                }\n                ++$rowA;\n            }\n            $matrixA = new PHPExcel_Shared_JAMA_Matrix($matrixAData);\n            $rowB = 0;\n            foreach ($matrixData2 as $matrixRow) {\n                if (!is_array($matrixRow)) {\n                    $matrixRow = array($matrixRow);\n                }\n                $columnB = 0;\n                foreach ($matrixRow as $matrixCell) {\n                    if ((!is_numeric($matrixCell)) || ($matrixCell === null)) {\n                        return PHPExcel_Calculation_Functions::VALUE();\n                    }\n                    $matrixBData[$rowB][$columnB] = $matrixCell;\n                    ++$columnB;\n                }\n                ++$rowB;\n            }\n            $matrixB = new PHPExcel_Shared_JAMA_Matrix($matrixBData);\n\n            if ($columnA != $rowB) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n\n            return $matrixA->times($matrixB)->getArray();\n        } catch (PHPExcel_Exception $ex) {\n            var_dump($ex->getMessage());\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n    }\n\n\n    /**\n     * MOD\n     *\n     * @param    int        $a        Dividend\n     * @param    int        $b        Divisor\n     * @return    int        Remainder\n     */\n    public static function MOD($a = 1, $b = 1)\n    {\n        $a = PHPExcel_Calculation_Functions::flattenSingleValue($a);\n        $b = PHPExcel_Calculation_Functions::flattenSingleValue($b);\n\n        if ($b == 0.0) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        } elseif (($a < 0.0) && ($b > 0.0)) {\n            return $b - fmod(abs($a), $b);\n        } elseif (($a > 0.0) && ($b < 0.0)) {\n            return $b + fmod($a, abs($b));\n        }\n\n        return fmod($a, $b);\n    }\n\n\n    /**\n     * MROUND\n     *\n     * Rounds a number to the nearest multiple of a specified value\n     *\n     * @param    float    $number            Number to round\n     * @param    int        $multiple        Multiple to which you want to round $number\n     * @return    float    Rounded Number\n     */\n    public static function MROUND($number, $multiple)\n    {\n        $number   = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $multiple = PHPExcel_Calculation_Functions::flattenSingleValue($multiple);\n\n        if ((is_numeric($number)) && (is_numeric($multiple))) {\n            if ($multiple == 0) {\n                return 0;\n            }\n            if ((self::SIGN($number)) == (self::SIGN($multiple))) {\n                $multiplier = 1 / $multiple;\n                return round($number * $multiplier) / $multiplier;\n            }\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * MULTINOMIAL\n     *\n     * Returns the ratio of the factorial of a sum of values to the product of factorials.\n     *\n     * @param    array of mixed        Data Series\n     * @return    float\n     */\n    public static function MULTINOMIAL()\n    {\n        $summer = 0;\n        $divisor = 1;\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) {\n            // Is it a numeric value?\n            if (is_numeric($arg)) {\n                if ($arg < 1) {\n                    return PHPExcel_Calculation_Functions::NaN();\n                }\n                $summer += floor($arg);\n                $divisor *= self::FACT($arg);\n            } else {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n        }\n\n        // Return\n        if ($summer > 0) {\n            $summer = self::FACT($summer);\n            return $summer / $divisor;\n        }\n        return 0;\n    }\n\n\n    /**\n     * ODD\n     *\n     * Returns number rounded up to the nearest odd integer.\n     *\n     * @param    float    $number            Number to round\n     * @return    int        Rounded Number\n     */\n    public static function ODD($number)\n    {\n        $number = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n\n        if (is_null($number)) {\n            return 1;\n        } elseif (is_bool($number)) {\n            return 1;\n        } elseif (is_numeric($number)) {\n            $significance = self::SIGN($number);\n            if ($significance == 0) {\n                return 1;\n            }\n\n            $result = self::CEILING($number, $significance);\n            if ($result == self::EVEN($result)) {\n                $result += $significance;\n            }\n\n            return (int) $result;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * POWER\n     *\n     * Computes x raised to the power y.\n     *\n     * @param    float        $x\n     * @param    float        $y\n     * @return    float\n     */\n    public static function POWER($x = 0, $y = 2)\n    {\n        $x    = PHPExcel_Calculation_Functions::flattenSingleValue($x);\n        $y    = PHPExcel_Calculation_Functions::flattenSingleValue($y);\n\n        // Validate parameters\n        if ($x == 0.0 && $y == 0.0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        } elseif ($x == 0.0 && $y < 0.0) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        // Return\n        $result = pow($x, $y);\n        return (!is_nan($result) && !is_infinite($result)) ? $result : PHPExcel_Calculation_Functions::NaN();\n    }\n\n\n    /**\n     * PRODUCT\n     *\n     * PRODUCT returns the product of all the values and cells referenced in the argument list.\n     *\n     * Excel Function:\n     *        PRODUCT(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function PRODUCT()\n    {\n        // Return value\n        $returnValue = null;\n\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                if (is_null($returnValue)) {\n                    $returnValue = $arg;\n                } else {\n                    $returnValue *= $arg;\n                }\n            }\n        }\n\n        // Return\n        if (is_null($returnValue)) {\n            return 0;\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * QUOTIENT\n     *\n     * QUOTIENT function returns the integer portion of a division. Numerator is the divided number\n     *        and denominator is the divisor.\n     *\n     * Excel Function:\n     *        QUOTIENT(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function QUOTIENT()\n    {\n        // Return value\n        $returnValue = null;\n\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                if (is_null($returnValue)) {\n                    $returnValue = ($arg == 0) ? 0 : $arg;\n                } else {\n                    if (($returnValue == 0) || ($arg == 0)) {\n                        $returnValue = 0;\n                    } else {\n                        $returnValue /= $arg;\n                    }\n                }\n            }\n        }\n\n        // Return\n        return intval($returnValue);\n    }\n\n\n    /**\n     * RAND\n     *\n     * @param    int        $min    Minimal value\n     * @param    int        $max    Maximal value\n     * @return    int        Random number\n     */\n    public static function RAND($min = 0, $max = 0)\n    {\n        $min = PHPExcel_Calculation_Functions::flattenSingleValue($min);\n        $max = PHPExcel_Calculation_Functions::flattenSingleValue($max);\n\n        if ($min == 0 && $max == 0) {\n            return (mt_rand(0, 10000000)) / 10000000;\n        } else {\n            return mt_rand($min, $max);\n        }\n    }\n\n\n    public static function ROMAN($aValue, $style = 0)\n    {\n        $aValue    = PHPExcel_Calculation_Functions::flattenSingleValue($aValue);\n        $style    = (is_null($style))    ? 0 :    (integer) PHPExcel_Calculation_Functions::flattenSingleValue($style);\n        if ((!is_numeric($aValue)) || ($aValue < 0) || ($aValue >= 4000)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $aValue = (integer) $aValue;\n        if ($aValue == 0) {\n            return '';\n        }\n\n        $mill = array('', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM');\n        $cent = array('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM');\n        $tens = array('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC');\n        $ones = array('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX');\n\n        $roman = '';\n        while ($aValue > 5999) {\n            $roman .= 'M';\n            $aValue -= 1000;\n        }\n        $m = self::romanCut($aValue, 1000);\n        $aValue %= 1000;\n        $c = self::romanCut($aValue, 100);\n        $aValue %= 100;\n        $t = self::romanCut($aValue, 10);\n        $aValue %= 10;\n\n        return $roman.$mill[$m].$cent[$c].$tens[$t].$ones[$aValue];\n    }\n\n\n    /**\n     * ROUNDUP\n     *\n     * Rounds a number up to a specified number of decimal places\n     *\n     * @param    float    $number            Number to round\n     * @param    int        $digits            Number of digits to which you want to round $number\n     * @return    float    Rounded Number\n     */\n    public static function ROUNDUP($number, $digits)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $digits    = PHPExcel_Calculation_Functions::flattenSingleValue($digits);\n\n        if ((is_numeric($number)) && (is_numeric($digits))) {\n            $significance = pow(10, (int) $digits);\n            if ($number < 0.0) {\n                return floor($number * $significance) / $significance;\n            } else {\n                return ceil($number * $significance) / $significance;\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * ROUNDDOWN\n     *\n     * Rounds a number down to a specified number of decimal places\n     *\n     * @param    float    $number            Number to round\n     * @param    int        $digits            Number of digits to which you want to round $number\n     * @return    float    Rounded Number\n     */\n    public static function ROUNDDOWN($number, $digits)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n        $digits    = PHPExcel_Calculation_Functions::flattenSingleValue($digits);\n\n        if ((is_numeric($number)) && (is_numeric($digits))) {\n            $significance = pow(10, (int) $digits);\n            if ($number < 0.0) {\n                return ceil($number * $significance) / $significance;\n            } else {\n                return floor($number * $significance) / $significance;\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SERIESSUM\n     *\n     * Returns the sum of a power series\n     *\n     * @param    float            $x    Input value to the power series\n     * @param    float            $n    Initial power to which you want to raise $x\n     * @param    float            $m    Step by which to increase $n for each term in the series\n     * @param    array of mixed        Data Series\n     * @return    float\n     */\n    public static function SERIESSUM()\n    {\n        $returnValue = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        $x = array_shift($aArgs);\n        $n = array_shift($aArgs);\n        $m = array_shift($aArgs);\n\n        if ((is_numeric($x)) && (is_numeric($n)) && (is_numeric($m))) {\n            // Calculate\n            $i = 0;\n            foreach ($aArgs as $arg) {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    $returnValue += $arg * pow($x, $n + ($m * $i++));\n                } else {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n            }\n            return $returnValue;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SIGN\n     *\n     * Determines the sign of a number. Returns 1 if the number is positive, zero (0)\n     *        if the number is 0, and -1 if the number is negative.\n     *\n     * @param    float    $number            Number to round\n     * @return    int        sign value\n     */\n    public static function SIGN($number)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n\n        if (is_bool($number)) {\n            return (int) $number;\n        }\n        if (is_numeric($number)) {\n            if ($number == 0.0) {\n                return 0;\n            }\n            return $number / abs($number);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SQRTPI\n     *\n     * Returns the square root of (number * pi).\n     *\n     * @param    float    $number        Number\n     * @return    float    Square Root of Number * Pi\n     */\n    public static function SQRTPI($number)\n    {\n        $number    = PHPExcel_Calculation_Functions::flattenSingleValue($number);\n\n        if (is_numeric($number)) {\n            if ($number < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return sqrt($number * M_PI) ;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SUBTOTAL\n     *\n     * Returns a subtotal in a list or database.\n     *\n     * @param    int        the number 1 to 11 that specifies which function to\n     *                    use in calculating subtotals within a list.\n     * @param    array of mixed        Data Series\n     * @return    float\n     */\n    public static function SUBTOTAL()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $subtotal = array_shift($aArgs);\n\n        if ((is_numeric($subtotal)) && (!is_string($subtotal))) {\n            switch ($subtotal) {\n                case 1:\n                    return PHPExcel_Calculation_Statistical::AVERAGE($aArgs);\n                case 2:\n                    return PHPExcel_Calculation_Statistical::COUNT($aArgs);\n                case 3:\n                    return PHPExcel_Calculation_Statistical::COUNTA($aArgs);\n                case 4:\n                    return PHPExcel_Calculation_Statistical::MAX($aArgs);\n                case 5:\n                    return PHPExcel_Calculation_Statistical::MIN($aArgs);\n                case 6:\n                    return self::PRODUCT($aArgs);\n                case 7:\n                    return PHPExcel_Calculation_Statistical::STDEV($aArgs);\n                case 8:\n                    return PHPExcel_Calculation_Statistical::STDEVP($aArgs);\n                case 9:\n                    return self::SUM($aArgs);\n                case 10:\n                    return PHPExcel_Calculation_Statistical::VARFunc($aArgs);\n                case 11:\n                    return PHPExcel_Calculation_Statistical::VARP($aArgs);\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SUM\n     *\n     * SUM computes the sum of all the values and cells referenced in the argument list.\n     *\n     * Excel Function:\n     *        SUM(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function SUM()\n    {\n        $returnValue = 0;\n\n        // Loop through the arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                $returnValue += $arg;\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * SUMIF\n     *\n     * Counts the number of cells that contain numbers within the list of arguments\n     *\n     * Excel Function:\n     *        SUMIF(value1[,value2[, ...]],condition)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    string        $condition        The criteria that defines which cells will be summed.\n     * @return    float\n     */\n    public static function SUMIF($aArgs, $condition, $sumArgs = array())\n    {\n        $returnValue = 0;\n\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs);\n        $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs);\n        if (empty($sumArgs)) {\n            $sumArgs = $aArgs;\n        }\n        $condition = PHPExcel_Calculation_Functions::ifCondition($condition);\n        // Loop through arguments\n        foreach ($aArgs as $key => $arg) {\n            if (!is_numeric($arg)) {\n                $arg = str_replace('\"', '\"\"', $arg);\n                $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));\n            }\n\n            $testCondition = '='.$arg.$condition;\n            if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {\n                // Is it a value within our criteria\n                $returnValue += $sumArgs[$key];\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n \t/**\n\t *\tSUMIFS\n\t *\n\t *\tCounts the number of cells that contain numbers within the list of arguments\n\t *\n\t *\tExcel Function:\n\t *\t\tSUMIFS(value1[,value2[, ...]],condition)\n\t *\n\t *\t@access\tpublic\n\t *\t@category Mathematical and Trigonometric Functions\n\t *\t@param\tmixed\t\t$arg,...\t\tData values\n\t *\t@param\tstring\t\t$condition\t\tThe criteria that defines which cells will be summed.\n\t *\t@return\tfloat\n\t */\n\tpublic static function SUMIFS() {\n\t\t$arrayList = func_get_args();\n\n\t\t$sumArgs = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList));\n\n        while (count($arrayList) > 0) {\n            $aArgsArray[] = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList));\n            $conditions[] = PHPExcel_Calculation_Functions::ifCondition(array_shift($arrayList));\n        }\n\n        // Loop through each set of arguments and conditions\n        foreach ($conditions as $index => $condition) {\n            $aArgs = $aArgsArray[$index];\n            $wildcard = false;\n            if ((strpos($condition, '*') !== false) || (strpos($condition, '?') !== false)) {\n                // * and ? are wildcard characters.\n                // Use ~* and ~? for literal star and question mark\n                // Code logic doesn't yet handle escaping\n                $condition = trim(ltrim($condition, '=<>'), '\"');\n                $wildcard = true;\n            }\n            // Loop through arguments\n            foreach ($aArgs as $key => $arg) {\n                if ($wildcard) {\n                    if (!fnmatch($condition, $arg, FNM_CASEFOLD)) {\n                        // Is it a value within our criteria\n                        $sumArgs[$key] = 0.0;\n                    }\n                } else {\n                    if (!is_numeric($arg)) {\n                        $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));\n                    }\n                    $testCondition = '='.$arg.$condition;\n                    if (!PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {\n                        // Is it a value within our criteria\n                        $sumArgs[$key] = 0.0;\n                    }\n                }\n            }\n        }\n\n\t\t// Return\n\t\treturn array_sum($sumArgs);\n\t}\n\n\n    /**\n     * SUMPRODUCT\n     *\n     * Excel Function:\n     *        SUMPRODUCT(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function SUMPRODUCT()\n    {\n        $arrayList = func_get_args();\n\n        $wrkArray = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList));\n        $wrkCellCount = count($wrkArray);\n\n        for ($i=0; $i< $wrkCellCount; ++$i) {\n            if ((!is_numeric($wrkArray[$i])) || (is_string($wrkArray[$i]))) {\n                $wrkArray[$i] = 0;\n            }\n        }\n\n        foreach ($arrayList as $matrixData) {\n            $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData);\n            $count = count($array2);\n            if ($wrkCellCount != $count) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n\n            foreach ($array2 as $i => $val) {\n                if ((!is_numeric($val)) || (is_string($val))) {\n                    $val = 0;\n                }\n                $wrkArray[$i] *= $val;\n            }\n        }\n\n        return array_sum($wrkArray);\n    }\n\n\n    /**\n     * SUMSQ\n     *\n     * SUMSQ returns the sum of the squares of the arguments\n     *\n     * Excel Function:\n     *        SUMSQ(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function SUMSQ()\n    {\n        $returnValue = 0;\n\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                $returnValue += ($arg * $arg);\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * SUMX2MY2\n     *\n     * @param    mixed[]    $matrixData1    Matrix #1\n     * @param    mixed[]    $matrixData2    Matrix #2\n     * @return    float\n     */\n    public static function SUMX2MY2($matrixData1, $matrixData2)\n    {\n        $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1);\n        $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2);\n        $count = min(count($array1), count($array2));\n\n        $result = 0;\n        for ($i = 0; $i < $count; ++$i) {\n            if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) &&\n                ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) {\n                $result += ($array1[$i] * $array1[$i]) - ($array2[$i] * $array2[$i]);\n            }\n        }\n\n        return $result;\n    }\n\n\n    /**\n     * SUMX2PY2\n     *\n     * @param    mixed[]    $matrixData1    Matrix #1\n     * @param    mixed[]    $matrixData2    Matrix #2\n     * @return    float\n     */\n    public static function SUMX2PY2($matrixData1, $matrixData2)\n    {\n        $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1);\n        $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2);\n        $count = min(count($array1), count($array2));\n\n        $result = 0;\n        for ($i = 0; $i < $count; ++$i) {\n            if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) &&\n                ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) {\n                $result += ($array1[$i] * $array1[$i]) + ($array2[$i] * $array2[$i]);\n            }\n        }\n\n        return $result;\n    }\n\n\n    /**\n     * SUMXMY2\n     *\n     * @param    mixed[]    $matrixData1    Matrix #1\n     * @param    mixed[]    $matrixData2    Matrix #2\n     * @return    float\n     */\n    public static function SUMXMY2($matrixData1, $matrixData2)\n    {\n        $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1);\n        $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2);\n        $count = min(count($array1), count($array2));\n\n        $result = 0;\n        for ($i = 0; $i < $count; ++$i) {\n            if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) &&\n                ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) {\n                $result += ($array1[$i] - $array2[$i]) * ($array1[$i] - $array2[$i]);\n            }\n        }\n\n        return $result;\n    }\n\n\n    /**\n     * TRUNC\n     *\n     * Truncates value to the number of fractional digits by number_digits.\n     *\n     * @param    float        $value\n     * @param    int            $digits\n     * @return    float        Truncated value\n     */\n    public static function TRUNC($value = 0, $digits = 0)\n    {\n        $value    = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $digits    = PHPExcel_Calculation_Functions::flattenSingleValue($digits);\n\n        // Validate parameters\n        if ((!is_numeric($value)) || (!is_numeric($digits))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $digits = floor($digits);\n\n        // Truncate\n        $adjust = pow(10, $digits);\n\n        if (($digits > 0) && (rtrim(intval((abs($value) - abs(intval($value))) * $adjust), '0') < $adjust/10)) {\n            return $value;\n        }\n\n        return (intval($value * $adjust)) / $adjust;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Statistical.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/trendClass.php';\n\n\n/** LOG_GAMMA_X_MAX_VALUE */\ndefine('LOG_GAMMA_X_MAX_VALUE', 2.55e305);\n\n/** XMININ */\ndefine('XMININ', 2.23e-308);\n\n/** EPS */\ndefine('EPS', 2.22e-16);\n\n/** SQRT2PI */\ndefine('SQRT2PI', 2.5066282746310005024157652848110452530069867406099);\n\n/**\n * PHPExcel_Calculation_Statistical\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Statistical\n{\n    private static function checkTrendArrays(&$array1, &$array2)\n    {\n        if (!is_array($array1)) {\n            $array1 = array($array1);\n        }\n        if (!is_array($array2)) {\n            $array2 = array($array2);\n        }\n\n        $array1 = PHPExcel_Calculation_Functions::flattenArray($array1);\n        $array2 = PHPExcel_Calculation_Functions::flattenArray($array2);\n        foreach ($array1 as $key => $value) {\n            if ((is_bool($value)) || (is_string($value)) || (is_null($value))) {\n                unset($array1[$key]);\n                unset($array2[$key]);\n            }\n        }\n        foreach ($array2 as $key => $value) {\n            if ((is_bool($value)) || (is_string($value)) || (is_null($value))) {\n                unset($array1[$key]);\n                unset($array2[$key]);\n            }\n        }\n        $array1 = array_merge($array1);\n        $array2 = array_merge($array2);\n\n        return true;\n    }\n\n\n    /**\n     * Beta function.\n     *\n     * @author Jaco van Kooten\n     *\n     * @param p require p>0\n     * @param q require q>0\n     * @return 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow\n     */\n    private static function beta($p, $q)\n    {\n        if ($p <= 0.0 || $q <= 0.0 || ($p + $q) > LOG_GAMMA_X_MAX_VALUE) {\n            return 0.0;\n        } else {\n            return exp(self::logBeta($p, $q));\n        }\n    }\n\n\n    /**\n     * Incomplete beta function\n     *\n     * @author Jaco van Kooten\n     * @author Paul Meagher\n     *\n     * The computation is based on formulas from Numerical Recipes, Chapter 6.4 (W.H. Press et al, 1992).\n     * @param x require 0<=x<=1\n     * @param p require p>0\n     * @param q require q>0\n     * @return 0 if x<0, p<=0, q<=0 or p+q>2.55E305 and 1 if x>1 to avoid errors and over/underflow\n     */\n    private static function incompleteBeta($x, $p, $q)\n    {\n        if ($x <= 0.0) {\n            return 0.0;\n        } elseif ($x >= 1.0) {\n            return 1.0;\n        } elseif (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > LOG_GAMMA_X_MAX_VALUE)) {\n            return 0.0;\n        }\n        $beta_gam = exp((0 - self::logBeta($p, $q)) + $p * log($x) + $q * log(1.0 - $x));\n        if ($x < ($p + 1.0) / ($p + $q + 2.0)) {\n            return $beta_gam * self::betaFraction($x, $p, $q) / $p;\n        } else {\n            return 1.0 - ($beta_gam * self::betaFraction(1 - $x, $q, $p) / $q);\n        }\n    }\n\n\n    // Function cache for logBeta function\n    private static $logBetaCacheP      = 0.0;\n    private static $logBetaCacheQ      = 0.0;\n    private static $logBetaCacheResult = 0.0;\n\n    /**\n     * The natural logarithm of the beta function.\n     *\n     * @param p require p>0\n     * @param q require q>0\n     * @return 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow\n     * @author Jaco van Kooten\n     */\n    private static function logBeta($p, $q)\n    {\n        if ($p != self::$logBetaCacheP || $q != self::$logBetaCacheQ) {\n            self::$logBetaCacheP = $p;\n            self::$logBetaCacheQ = $q;\n            if (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > LOG_GAMMA_X_MAX_VALUE)) {\n                self::$logBetaCacheResult = 0.0;\n            } else {\n                self::$logBetaCacheResult = self::logGamma($p) + self::logGamma($q) - self::logGamma($p + $q);\n            }\n        }\n        return self::$logBetaCacheResult;\n    }\n\n\n    /**\n     * Evaluates of continued fraction part of incomplete beta function.\n     * Based on an idea from Numerical Recipes (W.H. Press et al, 1992).\n     * @author Jaco van Kooten\n     */\n    private static function betaFraction($x, $p, $q)\n    {\n        $c = 1.0;\n        $sum_pq = $p + $q;\n        $p_plus = $p + 1.0;\n        $p_minus = $p - 1.0;\n        $h = 1.0 - $sum_pq * $x / $p_plus;\n        if (abs($h) < XMININ) {\n            $h = XMININ;\n        }\n        $h = 1.0 / $h;\n        $frac = $h;\n        $m     = 1;\n        $delta = 0.0;\n        while ($m <= MAX_ITERATIONS && abs($delta-1.0) > PRECISION) {\n            $m2 = 2 * $m;\n            // even index for d\n            $d = $m * ($q - $m) * $x / ( ($p_minus + $m2) * ($p + $m2));\n            $h = 1.0 + $d * $h;\n            if (abs($h) < XMININ) {\n                $h = XMININ;\n            }\n            $h = 1.0 / $h;\n            $c = 1.0 + $d / $c;\n            if (abs($c) < XMININ) {\n                $c = XMININ;\n            }\n            $frac *= $h * $c;\n            // odd index for d\n            $d = -($p + $m) * ($sum_pq + $m) * $x / (($p + $m2) * ($p_plus + $m2));\n            $h = 1.0 + $d * $h;\n            if (abs($h) < XMININ) {\n                $h = XMININ;\n            }\n            $h = 1.0 / $h;\n            $c = 1.0 + $d / $c;\n            if (abs($c) < XMININ) {\n                $c = XMININ;\n            }\n            $delta = $h * $c;\n            $frac *= $delta;\n            ++$m;\n        }\n        return $frac;\n    }\n\n\n    /**\n     * logGamma function\n     *\n     * @version 1.1\n     * @author Jaco van Kooten\n     *\n     * Original author was Jaco van Kooten. Ported to PHP by Paul Meagher.\n     *\n     * The natural logarithm of the gamma function. <br />\n     * Based on public domain NETLIB (Fortran) code by W. J. Cody and L. Stoltz <br />\n     * Applied Mathematics Division <br />\n     * Argonne National Laboratory <br />\n     * Argonne, IL 60439 <br />\n     * <p>\n     * References:\n     * <ol>\n     * <li>W. J. Cody and K. E. Hillstrom, 'Chebyshev Approximations for the Natural\n     *     Logarithm of the Gamma Function,' Math. Comp. 21, 1967, pp. 198-203.</li>\n     * <li>K. E. Hillstrom, ANL/AMD Program ANLC366S, DGAMMA/DLGAMA, May, 1969.</li>\n     * <li>Hart, Et. Al., Computer Approximations, Wiley and sons, New York, 1968.</li>\n     * </ol>\n     * </p>\n     * <p>\n     * From the original documentation:\n     * </p>\n     * <p>\n     * This routine calculates the LOG(GAMMA) function for a positive real argument X.\n     * Computation is based on an algorithm outlined in references 1 and 2.\n     * The program uses rational functions that theoretically approximate LOG(GAMMA)\n     * to at least 18 significant decimal digits. The approximation for X > 12 is from\n     * reference 3, while approximations for X < 12.0 are similar to those in reference\n     * 1, but are unpublished. The accuracy achieved depends on the arithmetic system,\n     * the compiler, the intrinsic functions, and proper selection of the\n     * machine-dependent constants.\n     * </p>\n     * <p>\n     * Error returns: <br />\n     * The program returns the value XINF for X .LE. 0.0 or when overflow would occur.\n     * The computation is believed to be free of underflow and overflow.\n     * </p>\n     * @return MAX_VALUE for x < 0.0 or when overflow would occur, i.e. x > 2.55E305\n     */\n\n    // Function cache for logGamma\n    private static $logGammaCacheResult = 0.0;\n    private static $logGammaCacheX      = 0.0;\n\n    private static function logGamma($x)\n    {\n        // Log Gamma related constants\n        static $lg_d1 = -0.5772156649015328605195174;\n        static $lg_d2 = 0.4227843350984671393993777;\n        static $lg_d4 = 1.791759469228055000094023;\n\n        static $lg_p1 = array(\n            4.945235359296727046734888,\n            201.8112620856775083915565,\n            2290.838373831346393026739,\n            11319.67205903380828685045,\n            28557.24635671635335736389,\n            38484.96228443793359990269,\n            26377.48787624195437963534,\n            7225.813979700288197698961\n        );\n        static $lg_p2 = array(\n            4.974607845568932035012064,\n            542.4138599891070494101986,\n            15506.93864978364947665077,\n            184793.2904445632425417223,\n            1088204.76946882876749847,\n            3338152.967987029735917223,\n            5106661.678927352456275255,\n            3074109.054850539556250927\n        );\n        static $lg_p4 = array(\n            14745.02166059939948905062,\n            2426813.369486704502836312,\n            121475557.4045093227939592,\n            2663432449.630976949898078,\n            29403789566.34553899906876,\n            170266573776.5398868392998,\n            492612579337.743088758812,\n            560625185622.3951465078242\n        );\n        static $lg_q1 = array(\n            67.48212550303777196073036,\n            1113.332393857199323513008,\n            7738.757056935398733233834,\n            27639.87074403340708898585,\n            54993.10206226157329794414,\n            61611.22180066002127833352,\n            36351.27591501940507276287,\n            8785.536302431013170870835\n        );\n        static $lg_q2 = array(\n            183.0328399370592604055942,\n            7765.049321445005871323047,\n            133190.3827966074194402448,\n            1136705.821321969608938755,\n            5267964.117437946917577538,\n            13467014.54311101692290052,\n            17827365.30353274213975932,\n            9533095.591844353613395747\n        );\n        static $lg_q4 = array(\n            2690.530175870899333379843,\n            639388.5654300092398984238,\n            41355999.30241388052042842,\n            1120872109.61614794137657,\n            14886137286.78813811542398,\n            101680358627.2438228077304,\n            341747634550.7377132798597,\n            446315818741.9713286462081\n        );\n        static $lg_c  = array(\n            -0.001910444077728,\n            8.4171387781295e-4,\n            -5.952379913043012e-4,\n            7.93650793500350248e-4,\n            -0.002777777777777681622553,\n            0.08333333333333333331554247,\n            0.0057083835261\n        );\n\n        // Rough estimate of the fourth root of logGamma_xBig\n        static $lg_frtbig = 2.25e76;\n        static $pnt68     = 0.6796875;\n\n\n        if ($x == self::$logGammaCacheX) {\n            return self::$logGammaCacheResult;\n        }\n        $y = $x;\n        if ($y > 0.0 && $y <= LOG_GAMMA_X_MAX_VALUE) {\n            if ($y <= EPS) {\n                $res = -log(y);\n            } elseif ($y <= 1.5) {\n                // ---------------------\n                //    EPS .LT. X .LE. 1.5\n                // ---------------------\n                if ($y < $pnt68) {\n                    $corr = -log($y);\n                    $xm1 = $y;\n                } else {\n                    $corr = 0.0;\n                    $xm1 = $y - 1.0;\n                }\n                if ($y <= 0.5 || $y >= $pnt68) {\n                    $xden = 1.0;\n                    $xnum = 0.0;\n                    for ($i = 0; $i < 8; ++$i) {\n                        $xnum = $xnum * $xm1 + $lg_p1[$i];\n                        $xden = $xden * $xm1 + $lg_q1[$i];\n                    }\n                    $res = $corr + $xm1 * ($lg_d1 + $xm1 * ($xnum / $xden));\n                } else {\n                    $xm2 = $y - 1.0;\n                    $xden = 1.0;\n                    $xnum = 0.0;\n                    for ($i = 0; $i < 8; ++$i) {\n                        $xnum = $xnum * $xm2 + $lg_p2[$i];\n                        $xden = $xden * $xm2 + $lg_q2[$i];\n                    }\n                    $res = $corr + $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden));\n                }\n            } elseif ($y <= 4.0) {\n                // ---------------------\n                //    1.5 .LT. X .LE. 4.0\n                // ---------------------\n                $xm2 = $y - 2.0;\n                $xden = 1.0;\n                $xnum = 0.0;\n                for ($i = 0; $i < 8; ++$i) {\n                    $xnum = $xnum * $xm2 + $lg_p2[$i];\n                    $xden = $xden * $xm2 + $lg_q2[$i];\n                }\n                $res = $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden));\n            } elseif ($y <= 12.0) {\n                // ----------------------\n                //    4.0 .LT. X .LE. 12.0\n                // ----------------------\n                $xm4 = $y - 4.0;\n                $xden = -1.0;\n                $xnum = 0.0;\n                for ($i = 0; $i < 8; ++$i) {\n                    $xnum = $xnum * $xm4 + $lg_p4[$i];\n                    $xden = $xden * $xm4 + $lg_q4[$i];\n                }\n                $res = $lg_d4 + $xm4 * ($xnum / $xden);\n            } else {\n                // ---------------------------------\n                //    Evaluate for argument .GE. 12.0\n                // ---------------------------------\n                $res = 0.0;\n                if ($y <= $lg_frtbig) {\n                    $res = $lg_c[6];\n                    $ysq = $y * $y;\n                    for ($i = 0; $i < 6; ++$i) {\n                        $res = $res / $ysq + $lg_c[$i];\n                    }\n                    $res /= $y;\n                    $corr = log($y);\n                    $res = $res + log(SQRT2PI) - 0.5 * $corr;\n                    $res += $y * ($corr - 1.0);\n                }\n            }\n        } else {\n            // --------------------------\n            //    Return for bad arguments\n            // --------------------------\n            $res = MAX_VALUE;\n        }\n        // ------------------------------\n        //    Final adjustments and return\n        // ------------------------------\n        self::$logGammaCacheX = $x;\n        self::$logGammaCacheResult = $res;\n        return $res;\n    }\n\n\n    //\n    //    Private implementation of the incomplete Gamma function\n    //\n    private static function incompleteGamma($a, $x)\n    {\n        static $max = 32;\n        $summer = 0;\n        for ($n=0; $n<=$max; ++$n) {\n            $divisor = $a;\n            for ($i=1; $i<=$n; ++$i) {\n                $divisor *= ($a + $i);\n            }\n            $summer += (pow($x, $n) / $divisor);\n        }\n        return pow($x, $a) * exp(0-$x) * $summer;\n    }\n\n\n    //\n    //    Private implementation of the Gamma function\n    //\n    private static function gamma($data)\n    {\n        if ($data == 0.0) {\n            return 0;\n        }\n\n        static $p0 = 1.000000000190015;\n        static $p = array(\n            1 => 76.18009172947146,\n            2 => -86.50532032941677,\n            3 => 24.01409824083091,\n            4 => -1.231739572450155,\n            5 => 1.208650973866179e-3,\n            6 => -5.395239384953e-6\n        );\n\n        $y = $x = $data;\n        $tmp = $x + 5.5;\n        $tmp -= ($x + 0.5) * log($tmp);\n\n        $summer = $p0;\n        for ($j=1; $j<=6; ++$j) {\n            $summer += ($p[$j] / ++$y);\n        }\n        return exp(0 - $tmp + log(SQRT2PI * $summer / $x));\n    }\n\n\n    /***************************************************************************\n     *                                inverse_ncdf.php\n     *                            -------------------\n     *    begin                : Friday, January 16, 2004\n     *    copyright            : (C) 2004 Michael Nickerson\n     *    email                : nickersonm@yahoo.com\n     *\n     ***************************************************************************/\n    private static function inverseNcdf($p)\n    {\n        //    Inverse ncdf approximation by Peter J. Acklam, implementation adapted to\n        //    PHP by Michael Nickerson, using Dr. Thomas Ziegler's C implementation as\n        //    a guide. http://home.online.no/~pjacklam/notes/invnorm/index.html\n        //    I have not checked the accuracy of this implementation. Be aware that PHP\n        //    will truncate the coeficcients to 14 digits.\n\n        //    You have permission to use and distribute this function freely for\n        //    whatever purpose you want, but please show common courtesy and give credit\n        //    where credit is due.\n\n        //    Input paramater is $p - probability - where 0 < p < 1.\n\n        //    Coefficients in rational approximations\n        static $a = array(\n            1 => -3.969683028665376e+01,\n            2 => 2.209460984245205e+02,\n            3 => -2.759285104469687e+02,\n            4 => 1.383577518672690e+02,\n            5 => -3.066479806614716e+01,\n            6 => 2.506628277459239e+00\n        );\n\n        static $b = array(\n            1 => -5.447609879822406e+01,\n            2 => 1.615858368580409e+02,\n            3 => -1.556989798598866e+02,\n            4 => 6.680131188771972e+01,\n            5 => -1.328068155288572e+01\n        );\n\n        static $c = array(\n            1 => -7.784894002430293e-03,\n            2 => -3.223964580411365e-01,\n            3 => -2.400758277161838e+00,\n            4 => -2.549732539343734e+00,\n            5 => 4.374664141464968e+00,\n            6 => 2.938163982698783e+00\n        );\n\n        static $d = array(\n            1 => 7.784695709041462e-03,\n            2 => 3.224671290700398e-01,\n            3 => 2.445134137142996e+00,\n            4 => 3.754408661907416e+00\n        );\n\n        //    Define lower and upper region break-points.\n        $p_low = 0.02425;            //Use lower region approx. below this\n        $p_high = 1 - $p_low;        //Use upper region approx. above this\n\n        if (0 < $p && $p < $p_low) {\n            //    Rational approximation for lower region.\n            $q = sqrt(-2 * log($p));\n            return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) /\n                    (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1);\n        } elseif ($p_low <= $p && $p <= $p_high) {\n            //    Rational approximation for central region.\n            $q = $p - 0.5;\n            $r = $q * $q;\n            return ((((($a[1] * $r + $a[2]) * $r + $a[3]) * $r + $a[4]) * $r + $a[5]) * $r + $a[6]) * $q /\n                   ((((($b[1] * $r + $b[2]) * $r + $b[3]) * $r + $b[4]) * $r + $b[5]) * $r + 1);\n        } elseif ($p_high < $p && $p < 1) {\n            //    Rational approximation for upper region.\n            $q = sqrt(-2 * log(1 - $p));\n            return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) /\n                     (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1);\n        }\n        //    If 0 < p < 1, return a null value\n        return PHPExcel_Calculation_Functions::NULL();\n    }\n\n\n    private static function inverseNcdf2($prob)\n    {\n        //    Approximation of inverse standard normal CDF developed by\n        //    B. Moro, \"The Full Monte,\" Risk 8(2), Feb 1995, 57-58.\n\n        $a1 = 2.50662823884;\n        $a2 = -18.61500062529;\n        $a3 = 41.39119773534;\n        $a4 = -25.44106049637;\n\n        $b1 = -8.4735109309;\n        $b2 = 23.08336743743;\n        $b3 = -21.06224101826;\n        $b4 = 3.13082909833;\n\n        $c1 = 0.337475482272615;\n        $c2 = 0.976169019091719;\n        $c3 = 0.160797971491821;\n        $c4 = 2.76438810333863E-02;\n        $c5 = 3.8405729373609E-03;\n        $c6 = 3.951896511919E-04;\n        $c7 = 3.21767881768E-05;\n        $c8 = 2.888167364E-07;\n        $c9 = 3.960315187E-07;\n\n        $y = $prob - 0.5;\n        if (abs($y) < 0.42) {\n            $z = ($y * $y);\n            $z = $y * ((($a4 * $z + $a3) * $z + $a2) * $z + $a1) / (((($b4 * $z + $b3) * $z + $b2) * $z + $b1) * $z + 1);\n        } else {\n            if ($y > 0) {\n                $z = log(-log(1 - $prob));\n            } else {\n                $z = log(-log($prob));\n            }\n            $z = $c1 + $z * ($c2 + $z * ($c3 + $z * ($c4 + $z * ($c5 + $z * ($c6 + $z * ($c7 + $z * ($c8 + $z * $c9)))))));\n            if ($y < 0) {\n                $z = -$z;\n            }\n        }\n        return $z;\n    }    //    function inverseNcdf2()\n\n\n    private static function inverseNcdf3($p)\n    {\n        //    ALGORITHM AS241 APPL. STATIST. (1988) VOL. 37, NO. 3.\n        //    Produces the normal deviate Z corresponding to a given lower\n        //    tail area of P; Z is accurate to about 1 part in 10**16.\n        //\n        //    This is a PHP version of the original FORTRAN code that can\n        //    be found at http://lib.stat.cmu.edu/apstat/\n        $split1 = 0.425;\n        $split2 = 5;\n        $const1 = 0.180625;\n        $const2 = 1.6;\n\n        //    coefficients for p close to 0.5\n        $a0 = 3.3871328727963666080;\n        $a1 = 1.3314166789178437745E+2;\n        $a2 = 1.9715909503065514427E+3;\n        $a3 = 1.3731693765509461125E+4;\n        $a4 = 4.5921953931549871457E+4;\n        $a5 = 6.7265770927008700853E+4;\n        $a6 = 3.3430575583588128105E+4;\n        $a7 = 2.5090809287301226727E+3;\n\n        $b1 = 4.2313330701600911252E+1;\n        $b2 = 6.8718700749205790830E+2;\n        $b3 = 5.3941960214247511077E+3;\n        $b4 = 2.1213794301586595867E+4;\n        $b5 = 3.9307895800092710610E+4;\n        $b6 = 2.8729085735721942674E+4;\n        $b7 = 5.2264952788528545610E+3;\n\n        //    coefficients for p not close to 0, 0.5 or 1.\n        $c0 = 1.42343711074968357734;\n        $c1 = 4.63033784615654529590;\n        $c2 = 5.76949722146069140550;\n        $c3 = 3.64784832476320460504;\n        $c4 = 1.27045825245236838258;\n        $c5 = 2.41780725177450611770E-1;\n        $c6 = 2.27238449892691845833E-2;\n        $c7 = 7.74545014278341407640E-4;\n\n        $d1 = 2.05319162663775882187;\n        $d2 = 1.67638483018380384940;\n        $d3 = 6.89767334985100004550E-1;\n        $d4 = 1.48103976427480074590E-1;\n        $d5 = 1.51986665636164571966E-2;\n        $d6 = 5.47593808499534494600E-4;\n        $d7 = 1.05075007164441684324E-9;\n\n        //    coefficients for p near 0 or 1.\n        $e0 = 6.65790464350110377720;\n        $e1 = 5.46378491116411436990;\n        $e2 = 1.78482653991729133580;\n        $e3 = 2.96560571828504891230E-1;\n        $e4 = 2.65321895265761230930E-2;\n        $e5 = 1.24266094738807843860E-3;\n        $e6 = 2.71155556874348757815E-5;\n        $e7 = 2.01033439929228813265E-7;\n\n        $f1 = 5.99832206555887937690E-1;\n        $f2 = 1.36929880922735805310E-1;\n        $f3 = 1.48753612908506148525E-2;\n        $f4 = 7.86869131145613259100E-4;\n        $f5 = 1.84631831751005468180E-5;\n        $f6 = 1.42151175831644588870E-7;\n        $f7 = 2.04426310338993978564E-15;\n\n        $q = $p - 0.5;\n\n        //    computation for p close to 0.5\n        if (abs($q) <= split1) {\n            $R = $const1 - $q * $q;\n            $z = $q * ((((((($a7 * $R + $a6) * $R + $a5) * $R + $a4) * $R + $a3) * $R + $a2) * $R + $a1) * $R + $a0) /\n                      ((((((($b7 * $R + $b6) * $R + $b5) * $R + $b4) * $R + $b3) * $R + $b2) * $R + $b1) * $R + 1);\n        } else {\n            if ($q < 0) {\n                $R = $p;\n            } else {\n                $R = 1 - $p;\n            }\n            $R = pow(-log($R), 2);\n\n            //    computation for p not close to 0, 0.5 or 1.\n            if ($R <= $split2) {\n                $R = $R - $const2;\n                $z = ((((((($c7 * $R + $c6) * $R + $c5) * $R + $c4) * $R + $c3) * $R + $c2) * $R + $c1) * $R + $c0) /\n                     ((((((($d7 * $R + $d6) * $R + $d5) * $R + $d4) * $R + $d3) * $R + $d2) * $R + $d1) * $R + 1);\n            } else {\n            //    computation for p near 0 or 1.\n                $R = $R - $split2;\n                $z = ((((((($e7 * $R + $e6) * $R + $e5) * $R + $e4) * $R + $e3) * $R + $e2) * $R + $e1) * $R + $e0) /\n                     ((((((($f7 * $R + $f6) * $R + $f5) * $R + $f4) * $R + $f3) * $R + $f2) * $R + $f1) * $R + 1);\n            }\n            if ($q < 0) {\n                $z = -$z;\n            }\n        }\n        return $z;\n    }\n\n\n    /**\n     * AVEDEV\n     *\n     * Returns the average of the absolute deviations of data points from their mean.\n     * AVEDEV is a measure of the variability in a data set.\n     *\n     * Excel Function:\n     *        AVEDEV(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function AVEDEV()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n\n        // Return value\n        $returnValue = null;\n\n        $aMean = self::AVERAGE($aArgs);\n        if ($aMean != PHPExcel_Calculation_Functions::DIV0()) {\n            $aCount = 0;\n            foreach ($aArgs as $k => $arg) {\n                if ((is_bool($arg)) &&\n                    ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) {\n                    $arg = (integer) $arg;\n                }\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    if (is_null($returnValue)) {\n                        $returnValue = abs($arg - $aMean);\n                    } else {\n                        $returnValue += abs($arg - $aMean);\n                    }\n                    ++$aCount;\n                }\n            }\n\n            // Return\n            if ($aCount == 0) {\n                return PHPExcel_Calculation_Functions::DIV0();\n            }\n            return $returnValue / $aCount;\n        }\n        return PHPExcel_Calculation_Functions::NaN();\n    }\n\n\n    /**\n     * AVERAGE\n     *\n     * Returns the average (arithmetic mean) of the arguments\n     *\n     * Excel Function:\n     *        AVERAGE(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function AVERAGE()\n    {\n        $returnValue = $aCount = 0;\n\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()) as $k => $arg) {\n            if ((is_bool($arg)) &&\n                ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) {\n                $arg = (integer) $arg;\n            }\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                if (is_null($returnValue)) {\n                    $returnValue = $arg;\n                } else {\n                    $returnValue += $arg;\n                }\n                ++$aCount;\n            }\n        }\n\n        // Return\n        if ($aCount > 0) {\n            return $returnValue / $aCount;\n        } else {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n    }\n\n\n    /**\n     * AVERAGEA\n     *\n     * Returns the average of its arguments, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        AVERAGEA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function AVERAGEA()\n    {\n        $returnValue = null;\n\n        $aCount = 0;\n        // Loop through arguments\n        foreach (PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()) as $k => $arg) {\n            if ((is_bool($arg)) &&\n                (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n            } else {\n                if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) {\n                    if (is_bool($arg)) {\n                        $arg = (integer) $arg;\n                    } elseif (is_string($arg)) {\n                        $arg = 0;\n                    }\n                    if (is_null($returnValue)) {\n                        $returnValue = $arg;\n                    } else {\n                        $returnValue += $arg;\n                    }\n                    ++$aCount;\n                }\n            }\n        }\n\n        if ($aCount > 0) {\n            return $returnValue / $aCount;\n        } else {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n    }\n\n\n    /**\n     * AVERAGEIF\n     *\n     * Returns the average value from a range of cells that contain numbers within the list of arguments\n     *\n     * Excel Function:\n     *        AVERAGEIF(value1[,value2[, ...]],condition)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    string        $condition        The criteria that defines which cells will be checked.\n     * @param    mixed[]        $averageArgs    Data values\n     * @return    float\n     */\n    public static function AVERAGEIF($aArgs, $condition, $averageArgs = array())\n    {\n        $returnValue = 0;\n\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs);\n        $averageArgs = PHPExcel_Calculation_Functions::flattenArray($averageArgs);\n        if (empty($averageArgs)) {\n            $averageArgs = $aArgs;\n        }\n        $condition = PHPExcel_Calculation_Functions::ifCondition($condition);\n        // Loop through arguments\n        $aCount = 0;\n        foreach ($aArgs as $key => $arg) {\n            if (!is_numeric($arg)) {\n                $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));\n            }\n            $testCondition = '='.$arg.$condition;\n            if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {\n                if ((is_null($returnValue)) || ($arg > $returnValue)) {\n                    $returnValue += $arg;\n                    ++$aCount;\n                }\n            }\n        }\n\n        if ($aCount > 0) {\n            return $returnValue / $aCount;\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * BETADIST\n     *\n     * Returns the beta distribution.\n     *\n     * @param    float        $value            Value at which you want to evaluate the distribution\n     * @param    float        $alpha            Parameter to the distribution\n     * @param    float        $beta            Parameter to the distribution\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function BETADIST($value, $alpha, $beta, $rMin = 0, $rMax = 1)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha);\n        $beta  = PHPExcel_Calculation_Functions::flattenSingleValue($beta);\n        $rMin  = PHPExcel_Calculation_Functions::flattenSingleValue($rMin);\n        $rMax  = PHPExcel_Calculation_Functions::flattenSingleValue($rMax);\n\n        if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) {\n            if (($value < $rMin) || ($value > $rMax) || ($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ($rMin > $rMax) {\n                $tmp = $rMin;\n                $rMin = $rMax;\n                $rMax = $tmp;\n            }\n            $value -= $rMin;\n            $value /= ($rMax - $rMin);\n            return self::incompleteBeta($value, $alpha, $beta);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * BETAINV\n     *\n     * Returns the inverse of the beta distribution.\n     *\n     * @param    float        $probability    Probability at which you want to evaluate the distribution\n     * @param    float        $alpha            Parameter to the distribution\n     * @param    float        $beta            Parameter to the distribution\n     * @param    float        $rMin            Minimum value\n     * @param    float        $rMax            Maximum value\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function BETAINV($probability, $alpha, $beta, $rMin = 0, $rMax = 1)\n    {\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $alpha       = PHPExcel_Calculation_Functions::flattenSingleValue($alpha);\n        $beta        = PHPExcel_Calculation_Functions::flattenSingleValue($beta);\n        $rMin        = PHPExcel_Calculation_Functions::flattenSingleValue($rMin);\n        $rMax        = PHPExcel_Calculation_Functions::flattenSingleValue($rMax);\n\n        if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) {\n            if (($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax) || ($probability <= 0) || ($probability > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ($rMin > $rMax) {\n                $tmp = $rMin;\n                $rMin = $rMax;\n                $rMax = $tmp;\n            }\n            $a = 0;\n            $b = 2;\n\n            $i = 0;\n            while ((($b - $a) > PRECISION) && ($i++ < MAX_ITERATIONS)) {\n                $guess = ($a + $b) / 2;\n                $result = self::BETADIST($guess, $alpha, $beta);\n                if (($result == $probability) || ($result == 0)) {\n                    $b = $a;\n                } elseif ($result > $probability) {\n                    $b = $guess;\n                } else {\n                    $a = $guess;\n                }\n            }\n            if ($i == MAX_ITERATIONS) {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            return round($rMin + $guess * ($rMax - $rMin), 12);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * BINOMDIST\n     *\n     * Returns the individual term binomial distribution probability. Use BINOMDIST in problems with\n     *        a fixed number of tests or trials, when the outcomes of any trial are only success or failure,\n     *        when trials are independent, and when the probability of success is constant throughout the\n     *        experiment. For example, BINOMDIST can calculate the probability that two of the next three\n     *        babies born are male.\n     *\n     * @param    float        $value            Number of successes in trials\n     * @param    float        $trials            Number of trials\n     * @param    float        $probability    Probability of success on each trial\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     * @todo    Cumulative distribution function\n     *\n     */\n    public static function BINOMDIST($value, $trials, $probability, $cumulative)\n    {\n        $value       = floor(PHPExcel_Calculation_Functions::flattenSingleValue($value));\n        $trials      = floor(PHPExcel_Calculation_Functions::flattenSingleValue($trials));\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n\n        if ((is_numeric($value)) && (is_numeric($trials)) && (is_numeric($probability))) {\n            if (($value < 0) || ($value > $trials)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if (($probability < 0) || ($probability > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ((is_numeric($cumulative)) || (is_bool($cumulative))) {\n                if ($cumulative) {\n                    $summer = 0;\n                    for ($i = 0; $i <= $value; ++$i) {\n                        $summer += PHPExcel_Calculation_MathTrig::COMBIN($trials, $i) * pow($probability, $i) * pow(1 - $probability, $trials - $i);\n                    }\n                    return $summer;\n                } else {\n                    return PHPExcel_Calculation_MathTrig::COMBIN($trials, $value) * pow($probability, $value) * pow(1 - $probability, $trials - $value) ;\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * CHIDIST\n     *\n     * Returns the one-tailed probability of the chi-squared distribution.\n     *\n     * @param    float        $value            Value for the function\n     * @param    float        $degrees        degrees of freedom\n     * @return    float\n     */\n    public static function CHIDIST($value, $degrees)\n    {\n        $value   = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees));\n\n        if ((is_numeric($value)) && (is_numeric($degrees))) {\n            if ($degrees < 1) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ($value < 0) {\n                if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                    return 1;\n                }\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return 1 - (self::incompleteGamma($degrees/2, $value/2) / self::gamma($degrees/2));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * CHIINV\n     *\n     * Returns the one-tailed probability of the chi-squared distribution.\n     *\n     * @param    float        $probability    Probability for the function\n     * @param    float        $degrees        degrees of freedom\n     * @return    float\n     */\n    public static function CHIINV($probability, $degrees)\n    {\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $degrees     = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees));\n\n        if ((is_numeric($probability)) && (is_numeric($degrees))) {\n            $xLo = 100;\n            $xHi = 0;\n\n            $x = $xNew = 1;\n            $dx    = 1;\n            $i = 0;\n\n            while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) {\n                // Apply Newton-Raphson step\n                $result = self::CHIDIST($x, $degrees);\n                $error = $result - $probability;\n                if ($error == 0.0) {\n                    $dx = 0;\n                } elseif ($error < 0.0) {\n                    $xLo = $x;\n                } else {\n                    $xHi = $x;\n                }\n                // Avoid division by zero\n                if ($result != 0.0) {\n                    $dx = $error / $result;\n                    $xNew = $x - $dx;\n                }\n                // If the NR fails to converge (which for example may be the\n                // case if the initial guess is too rough) we apply a bisection\n                // step to determine a more narrow interval around the root.\n                if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) {\n                    $xNew = ($xLo + $xHi) / 2;\n                    $dx = $xNew - $x;\n                }\n                $x = $xNew;\n            }\n            if ($i == MAX_ITERATIONS) {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            return round($x, 12);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * CONFIDENCE\n     *\n     * Returns the confidence interval for a population mean\n     *\n     * @param    float        $alpha\n     * @param    float        $stdDev        Standard Deviation\n     * @param    float        $size\n     * @return    float\n     *\n     */\n    public static function CONFIDENCE($alpha, $stdDev, $size)\n    {\n        $alpha  = PHPExcel_Calculation_Functions::flattenSingleValue($alpha);\n        $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev);\n        $size   = floor(PHPExcel_Calculation_Functions::flattenSingleValue($size));\n\n        if ((is_numeric($alpha)) && (is_numeric($stdDev)) && (is_numeric($size))) {\n            if (($alpha <= 0) || ($alpha >= 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if (($stdDev <= 0) || ($size < 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return self::NORMSINV(1 - $alpha / 2) * $stdDev / sqrt($size);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * CORREL\n     *\n     * Returns covariance, the average of the products of deviations for each data point pair.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function CORREL($yValues, $xValues = null)\n    {\n        if ((is_null($xValues)) || (!is_array($yValues)) || (!is_array($xValues))) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getCorrelation();\n    }\n\n\n    /**\n     * COUNT\n     *\n     * Counts the number of cells that contain numbers within the list of arguments\n     *\n     * Excel Function:\n     *        COUNT(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    int\n     */\n    public static function COUNT()\n    {\n        $returnValue = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n        foreach ($aArgs as $k => $arg) {\n            if ((is_bool($arg)) &&\n                ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) {\n                $arg = (integer) $arg;\n            }\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                ++$returnValue;\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * COUNTA\n     *\n     * Counts the number of cells that are not empty within the list of arguments\n     *\n     * Excel Function:\n     *        COUNTA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    int\n     */\n    public static function COUNTA()\n    {\n        $returnValue = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a numeric, boolean or string value?\n            if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) {\n                ++$returnValue;\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * COUNTBLANK\n     *\n     * Counts the number of empty cells within the list of arguments\n     *\n     * Excel Function:\n     *        COUNTBLANK(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    int\n     */\n    public static function COUNTBLANK()\n    {\n        $returnValue = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a blank cell?\n            if ((is_null($arg)) || ((is_string($arg)) && ($arg == ''))) {\n                ++$returnValue;\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * COUNTIF\n     *\n     * Counts the number of cells that contain numbers within the list of arguments\n     *\n     * Excel Function:\n     *        COUNTIF(value1[,value2[, ...]],condition)\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    string        $condition        The criteria that defines which cells will be counted.\n     * @return    int\n     */\n    public static function COUNTIF($aArgs, $condition)\n    {\n        $returnValue = 0;\n\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs);\n        $condition = PHPExcel_Calculation_Functions::ifCondition($condition);\n        // Loop through arguments\n        foreach ($aArgs as $arg) {\n            if (!is_numeric($arg)) {\n                $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));\n            }\n            $testCondition = '='.$arg.$condition;\n            if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {\n                // Is it a value within our criteria\n                ++$returnValue;\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * COVAR\n     *\n     * Returns covariance, the average of the products of deviations for each data point pair.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function COVAR($yValues, $xValues)\n    {\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getCovariance();\n    }\n\n\n    /**\n     * CRITBINOM\n     *\n     * Returns the smallest value for which the cumulative binomial distribution is greater\n     *        than or equal to a criterion value\n     *\n     * See http://support.microsoft.com/kb/828117/ for details of the algorithm used\n     *\n     * @param    float        $trials            number of Bernoulli trials\n     * @param    float        $probability    probability of a success on each trial\n     * @param    float        $alpha            criterion value\n     * @return    int\n     *\n     * @todo    Warning. This implementation differs from the algorithm detailed on the MS\n     *            web site in that $CumPGuessMinus1 = $CumPGuess - 1 rather than $CumPGuess - $PGuess\n     *            This eliminates a potential endless loop error, but may have an adverse affect on the\n     *            accuracy of the function (although all my tests have so far returned correct results).\n     *\n     */\n    public static function CRITBINOM($trials, $probability, $alpha)\n    {\n        $trials      = floor(PHPExcel_Calculation_Functions::flattenSingleValue($trials));\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $alpha       = PHPExcel_Calculation_Functions::flattenSingleValue($alpha);\n\n        if ((is_numeric($trials)) && (is_numeric($probability)) && (is_numeric($alpha))) {\n            if ($trials < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            } elseif (($probability < 0) || ($probability > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            } elseif (($alpha < 0) || ($alpha > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            } elseif ($alpha <= 0.5) {\n                $t = sqrt(log(1 / ($alpha * $alpha)));\n                $trialsApprox = 0 - ($t + (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t));\n            } else {\n                $t = sqrt(log(1 / pow(1 - $alpha, 2)));\n                $trialsApprox = $t - (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t);\n            }\n            $Guess = floor($trials * $probability + $trialsApprox * sqrt($trials * $probability * (1 - $probability)));\n            if ($Guess < 0) {\n                $Guess = 0;\n            } elseif ($Guess > $trials) {\n                $Guess = $trials;\n            }\n\n            $TotalUnscaledProbability = $UnscaledPGuess = $UnscaledCumPGuess = 0.0;\n            $EssentiallyZero = 10e-12;\n\n            $m = floor($trials * $probability);\n            ++$TotalUnscaledProbability;\n            if ($m == $Guess) {\n                ++$UnscaledPGuess;\n            }\n            if ($m <= $Guess) {\n                ++$UnscaledCumPGuess;\n            }\n\n            $PreviousValue = 1;\n            $Done = false;\n            $k = $m + 1;\n            while ((!$Done) && ($k <= $trials)) {\n                $CurrentValue = $PreviousValue * ($trials - $k + 1) * $probability / ($k * (1 - $probability));\n                $TotalUnscaledProbability += $CurrentValue;\n                if ($k == $Guess) {\n                    $UnscaledPGuess += $CurrentValue;\n                }\n                if ($k <= $Guess) {\n                    $UnscaledCumPGuess += $CurrentValue;\n                }\n                if ($CurrentValue <= $EssentiallyZero) {\n                    $Done = true;\n                }\n                $PreviousValue = $CurrentValue;\n                ++$k;\n            }\n\n            $PreviousValue = 1;\n            $Done = false;\n            $k = $m - 1;\n            while ((!$Done) && ($k >= 0)) {\n                $CurrentValue = $PreviousValue * $k + 1 * (1 - $probability) / (($trials - $k) * $probability);\n                $TotalUnscaledProbability += $CurrentValue;\n                if ($k == $Guess) {\n                    $UnscaledPGuess += $CurrentValue;\n                }\n                if ($k <= $Guess) {\n                    $UnscaledCumPGuess += $CurrentValue;\n                }\n                if ($CurrentValue <= $EssentiallyZero) {\n                    $Done = true;\n                }\n                $PreviousValue = $CurrentValue;\n                --$k;\n            }\n\n            $PGuess = $UnscaledPGuess / $TotalUnscaledProbability;\n            $CumPGuess = $UnscaledCumPGuess / $TotalUnscaledProbability;\n\n//            $CumPGuessMinus1 = $CumPGuess - $PGuess;\n            $CumPGuessMinus1 = $CumPGuess - 1;\n\n            while (true) {\n                if (($CumPGuessMinus1 < $alpha) && ($CumPGuess >= $alpha)) {\n                    return $Guess;\n                } elseif (($CumPGuessMinus1 < $alpha) && ($CumPGuess < $alpha)) {\n                    $PGuessPlus1 = $PGuess * ($trials - $Guess) * $probability / $Guess / (1 - $probability);\n                    $CumPGuessMinus1 = $CumPGuess;\n                    $CumPGuess = $CumPGuess + $PGuessPlus1;\n                    $PGuess = $PGuessPlus1;\n                    ++$Guess;\n                } elseif (($CumPGuessMinus1 >= $alpha) && ($CumPGuess >= $alpha)) {\n                    $PGuessMinus1 = $PGuess * $Guess * (1 - $probability) / ($trials - $Guess + 1) / $probability;\n                    $CumPGuess = $CumPGuessMinus1;\n                    $CumPGuessMinus1 = $CumPGuessMinus1 - $PGuess;\n                    $PGuess = $PGuessMinus1;\n                    --$Guess;\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * DEVSQ\n     *\n     * Returns the sum of squares of deviations of data points from their sample mean.\n     *\n     * Excel Function:\n     *        DEVSQ(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function DEVSQ()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n\n        // Return value\n        $returnValue = null;\n\n        $aMean = self::AVERAGE($aArgs);\n        if ($aMean != PHPExcel_Calculation_Functions::DIV0()) {\n            $aCount = -1;\n            foreach ($aArgs as $k => $arg) {\n                // Is it a numeric value?\n                if ((is_bool($arg)) &&\n                    ((!PHPExcel_Calculation_Functions::isCellValue($k)) ||\n                    (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) {\n                    $arg = (integer) $arg;\n                }\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    if (is_null($returnValue)) {\n                        $returnValue = pow(($arg - $aMean), 2);\n                    } else {\n                        $returnValue += pow(($arg - $aMean), 2);\n                    }\n                    ++$aCount;\n                }\n            }\n\n            // Return\n            if (is_null($returnValue)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            } else {\n                return $returnValue;\n            }\n        }\n        return self::NA();\n    }\n\n\n    /**\n     * EXPONDIST\n     *\n     *    Returns the exponential distribution. Use EXPONDIST to model the time between events,\n     *        such as how long an automated bank teller takes to deliver cash. For example, you can\n     *        use EXPONDIST to determine the probability that the process takes at most 1 minute.\n     *\n     * @param    float        $value            Value of the function\n     * @param    float        $lambda            The parameter value\n     * @param    boolean        $cumulative\n     * @return    float\n     */\n    public static function EXPONDIST($value, $lambda, $cumulative)\n    {\n        $value    = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $lambda    = PHPExcel_Calculation_Functions::flattenSingleValue($lambda);\n        $cumulative    = PHPExcel_Calculation_Functions::flattenSingleValue($cumulative);\n\n        if ((is_numeric($value)) && (is_numeric($lambda))) {\n            if (($value < 0) || ($lambda < 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ((is_numeric($cumulative)) || (is_bool($cumulative))) {\n                if ($cumulative) {\n                    return 1 - exp(0-$value*$lambda);\n                } else {\n                    return $lambda * exp(0-$value*$lambda);\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FISHER\n     *\n     * Returns the Fisher transformation at x. This transformation produces a function that\n     *        is normally distributed rather than skewed. Use this function to perform hypothesis\n     *        testing on the correlation coefficient.\n     *\n     * @param    float        $value\n     * @return    float\n     */\n    public static function FISHER($value)\n    {\n        $value    = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n\n        if (is_numeric($value)) {\n            if (($value <= -1) || ($value >= 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return 0.5 * log((1+$value)/(1-$value));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FISHERINV\n     *\n     * Returns the inverse of the Fisher transformation. Use this transformation when\n     *        analyzing correlations between ranges or arrays of data. If y = FISHER(x), then\n     *        FISHERINV(y) = x.\n     *\n     * @param    float        $value\n     * @return    float\n     */\n    public static function FISHERINV($value)\n    {\n        $value    = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n\n        if (is_numeric($value)) {\n            return (exp(2 * $value) - 1) / (exp(2 * $value) + 1);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FORECAST\n     *\n     * Calculates, or predicts, a future value by using existing values. The predicted value is a y-value for a given x-value.\n     *\n     * @param    float                Value of X for which we want to find Y\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function FORECAST($xValue, $yValues, $xValues)\n    {\n        $xValue    = PHPExcel_Calculation_Functions::flattenSingleValue($xValue);\n        if (!is_numeric($xValue)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        } elseif (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getValueOfYForX($xValue);\n    }\n\n\n    /**\n     * GAMMADIST\n     *\n     * Returns the gamma distribution.\n     *\n     * @param    float        $value            Value at which you want to evaluate the distribution\n     * @param    float        $a                Parameter to the distribution\n     * @param    float        $b                Parameter to the distribution\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function GAMMADIST($value, $a, $b, $cumulative)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $a     = PHPExcel_Calculation_Functions::flattenSingleValue($a);\n        $b     = PHPExcel_Calculation_Functions::flattenSingleValue($b);\n\n        if ((is_numeric($value)) && (is_numeric($a)) && (is_numeric($b))) {\n            if (($value < 0) || ($a <= 0) || ($b <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ((is_numeric($cumulative)) || (is_bool($cumulative))) {\n                if ($cumulative) {\n                    return self::incompleteGamma($a, $value / $b) / self::gamma($a);\n                } else {\n                    return (1 / (pow($b, $a) * self::gamma($a))) * pow($value, $a-1) * exp(0-($value / $b));\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * GAMMAINV\n     *\n     * Returns the inverse of the beta distribution.\n     *\n     * @param    float        $probability    Probability at which you want to evaluate the distribution\n     * @param    float        $alpha            Parameter to the distribution\n     * @param    float        $beta            Parameter to the distribution\n     * @return    float\n     *\n     */\n    public static function GAMMAINV($probability, $alpha, $beta)\n    {\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $alpha       = PHPExcel_Calculation_Functions::flattenSingleValue($alpha);\n        $beta        = PHPExcel_Calculation_Functions::flattenSingleValue($beta);\n\n        if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta))) {\n            if (($alpha <= 0) || ($beta <= 0) || ($probability < 0) || ($probability > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n\n            $xLo = 0;\n            $xHi = $alpha * $beta * 5;\n\n            $x = $xNew = 1;\n            $error = $pdf = 0;\n            $dx    = 1024;\n            $i = 0;\n\n            while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) {\n                // Apply Newton-Raphson step\n                $error = self::GAMMADIST($x, $alpha, $beta, true) - $probability;\n                if ($error < 0.0) {\n                    $xLo = $x;\n                } else {\n                    $xHi = $x;\n                }\n                $pdf = self::GAMMADIST($x, $alpha, $beta, false);\n                // Avoid division by zero\n                if ($pdf != 0.0) {\n                    $dx = $error / $pdf;\n                    $xNew = $x - $dx;\n                }\n                // If the NR fails to converge (which for example may be the\n                // case if the initial guess is too rough) we apply a bisection\n                // step to determine a more narrow interval around the root.\n                if (($xNew < $xLo) || ($xNew > $xHi) || ($pdf == 0.0)) {\n                    $xNew = ($xLo + $xHi) / 2;\n                    $dx = $xNew - $x;\n                }\n                $x = $xNew;\n            }\n            if ($i == MAX_ITERATIONS) {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            return $x;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * GAMMALN\n     *\n     * Returns the natural logarithm of the gamma function.\n     *\n     * @param    float        $value\n     * @return    float\n     */\n    public static function GAMMALN($value)\n    {\n        $value    = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n\n        if (is_numeric($value)) {\n            if ($value <= 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return log(self::gamma($value));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * GEOMEAN\n     *\n     * Returns the geometric mean of an array or range of positive data. For example, you\n     *        can use GEOMEAN to calculate average growth rate given compound interest with\n     *        variable rates.\n     *\n     * Excel Function:\n     *        GEOMEAN(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function GEOMEAN()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        $aMean = PHPExcel_Calculation_MathTrig::PRODUCT($aArgs);\n        if (is_numeric($aMean) && ($aMean > 0)) {\n            $aCount = self::COUNT($aArgs) ;\n            if (self::MIN($aArgs) > 0) {\n                return pow($aMean, (1 / $aCount));\n            }\n        }\n        return PHPExcel_Calculation_Functions::NaN();\n    }\n\n\n    /**\n     * GROWTH\n     *\n     * Returns values along a predicted emponential trend\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @param    array of mixed        Values of X for which we want to find Y\n     * @param    boolean                A logical value specifying whether to force the intersect to equal 0.\n     * @return    array of float\n     */\n    public static function GROWTH($yValues, $xValues = array(), $newValues = array(), $const = true)\n    {\n        $yValues = PHPExcel_Calculation_Functions::flattenArray($yValues);\n        $xValues = PHPExcel_Calculation_Functions::flattenArray($xValues);\n        $newValues = PHPExcel_Calculation_Functions::flattenArray($newValues);\n        $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const);\n\n        $bestFitExponential = trendClass::calculate(trendClass::TREND_EXPONENTIAL, $yValues, $xValues, $const);\n        if (empty($newValues)) {\n            $newValues = $bestFitExponential->getXValues();\n        }\n\n        $returnArray = array();\n        foreach ($newValues as $xValue) {\n            $returnArray[0][] = $bestFitExponential->getValueOfYForX($xValue);\n        }\n\n        return $returnArray;\n    }\n\n\n    /**\n     * HARMEAN\n     *\n     * Returns the harmonic mean of a data set. The harmonic mean is the reciprocal of the\n     *        arithmetic mean of reciprocals.\n     *\n     * Excel Function:\n     *        HARMEAN(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function HARMEAN()\n    {\n        // Return value\n        $returnValue = PHPExcel_Calculation_Functions::NA();\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        if (self::MIN($aArgs) < 0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $aCount = 0;\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                if ($arg <= 0) {\n                    return PHPExcel_Calculation_Functions::NaN();\n                }\n                if (is_null($returnValue)) {\n                    $returnValue = (1 / $arg);\n                } else {\n                    $returnValue += (1 / $arg);\n                }\n                ++$aCount;\n            }\n        }\n\n        // Return\n        if ($aCount > 0) {\n            return 1 / ($returnValue / $aCount);\n        } else {\n            return $returnValue;\n        }\n    }\n\n\n    /**\n     * HYPGEOMDIST\n     *\n     * Returns the hypergeometric distribution. HYPGEOMDIST returns the probability of a given number of\n     * sample successes, given the sample size, population successes, and population size.\n     *\n     * @param    float        $sampleSuccesses        Number of successes in the sample\n     * @param    float        $sampleNumber            Size of the sample\n     * @param    float        $populationSuccesses    Number of successes in the population\n     * @param    float        $populationNumber        Population size\n     * @return    float\n     *\n     */\n    public static function HYPGEOMDIST($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber)\n    {\n        $sampleSuccesses     = floor(PHPExcel_Calculation_Functions::flattenSingleValue($sampleSuccesses));\n        $sampleNumber        = floor(PHPExcel_Calculation_Functions::flattenSingleValue($sampleNumber));\n        $populationSuccesses = floor(PHPExcel_Calculation_Functions::flattenSingleValue($populationSuccesses));\n        $populationNumber    = floor(PHPExcel_Calculation_Functions::flattenSingleValue($populationNumber));\n\n        if ((is_numeric($sampleSuccesses)) && (is_numeric($sampleNumber)) && (is_numeric($populationSuccesses)) && (is_numeric($populationNumber))) {\n            if (($sampleSuccesses < 0) || ($sampleSuccesses > $sampleNumber) || ($sampleSuccesses > $populationSuccesses)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if (($sampleNumber <= 0) || ($sampleNumber > $populationNumber)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if (($populationSuccesses <= 0) || ($populationSuccesses > $populationNumber)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return PHPExcel_Calculation_MathTrig::COMBIN($populationSuccesses, $sampleSuccesses) *\n                   PHPExcel_Calculation_MathTrig::COMBIN($populationNumber - $populationSuccesses, $sampleNumber - $sampleSuccesses) /\n                   PHPExcel_Calculation_MathTrig::COMBIN($populationNumber, $sampleNumber);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * INTERCEPT\n     *\n     * Calculates the point at which a line will intersect the y-axis by using existing x-values and y-values.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function INTERCEPT($yValues, $xValues)\n    {\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getIntersect();\n    }\n\n\n    /**\n     * KURT\n     *\n     * Returns the kurtosis of a data set. Kurtosis characterizes the relative peakedness\n     * or flatness of a distribution compared with the normal distribution. Positive\n     * kurtosis indicates a relatively peaked distribution. Negative kurtosis indicates a\n     * relatively flat distribution.\n     *\n     * @param    array    Data Series\n     * @return    float\n     */\n    public static function KURT()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n        $mean = self::AVERAGE($aArgs);\n        $stdDev = self::STDEV($aArgs);\n\n        if ($stdDev > 0) {\n            $count = $summer = 0;\n            // Loop through arguments\n            foreach ($aArgs as $k => $arg) {\n                if ((is_bool($arg)) &&\n                    (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n                } else {\n                    // Is it a numeric value?\n                    if ((is_numeric($arg)) && (!is_string($arg))) {\n                        $summer += pow((($arg - $mean) / $stdDev), 4);\n                        ++$count;\n                    }\n                }\n            }\n\n            // Return\n            if ($count > 3) {\n                return $summer * ($count * ($count+1) / (($count-1) * ($count-2) * ($count-3))) - (3 * pow($count-1, 2) / (($count-2) * ($count-3)));\n            }\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * LARGE\n     *\n     * Returns the nth largest value in a data set. You can use this function to\n     *        select a value based on its relative standing.\n     *\n     * Excel Function:\n     *        LARGE(value1[,value2[, ...]],entry)\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    int            $entry            Position (ordered from the largest) in the array or range of data to return\n     * @return    float\n     *\n     */\n    public static function LARGE()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $entry = floor(array_pop($aArgs));\n\n        if ((is_numeric($entry)) && (!is_string($entry))) {\n            $mArgs = array();\n            foreach ($aArgs as $arg) {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    $mArgs[] = $arg;\n                }\n            }\n            $count = self::COUNT($mArgs);\n            $entry = floor(--$entry);\n            if (($entry < 0) || ($entry >= $count) || ($count == 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            rsort($mArgs);\n            return $mArgs[$entry];\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * LINEST\n     *\n     * Calculates the statistics for a line by using the \"least squares\" method to calculate a straight line that best fits your data,\n     *        and then returns an array that describes the line.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @param    boolean                A logical value specifying whether to force the intersect to equal 0.\n     * @param    boolean                A logical value specifying whether to return additional regression statistics.\n     * @return    array\n     */\n    public static function LINEST($yValues, $xValues = null, $const = true, $stats = false)\n    {\n        $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const);\n        $stats = (is_null($stats)) ? false : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($stats);\n        if (is_null($xValues)) {\n            $xValues = range(1, count(PHPExcel_Calculation_Functions::flattenArray($yValues)));\n        }\n\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return 0;\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues, $const);\n        if ($stats) {\n            return array(\n                array(\n                    $bestFitLinear->getSlope(),\n                    $bestFitLinear->getSlopeSE(),\n                    $bestFitLinear->getGoodnessOfFit(),\n                    $bestFitLinear->getF(),\n                    $bestFitLinear->getSSRegression(),\n                ),\n                array(\n                    $bestFitLinear->getIntersect(),\n                    $bestFitLinear->getIntersectSE(),\n                    $bestFitLinear->getStdevOfResiduals(),\n                    $bestFitLinear->getDFResiduals(),\n                    $bestFitLinear->getSSResiduals()\n                )\n            );\n        } else {\n            return array(\n                $bestFitLinear->getSlope(),\n                $bestFitLinear->getIntersect()\n            );\n        }\n    }\n\n\n    /**\n     * LOGEST\n     *\n     * Calculates an exponential curve that best fits the X and Y data series,\n     *        and then returns an array that describes the line.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @param    boolean                A logical value specifying whether to force the intersect to equal 0.\n     * @param    boolean                A logical value specifying whether to return additional regression statistics.\n     * @return    array\n     */\n    public static function LOGEST($yValues, $xValues = null, $const = true, $stats = false)\n    {\n        $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const);\n        $stats = (is_null($stats)) ? false : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($stats);\n        if (is_null($xValues)) {\n            $xValues = range(1, count(PHPExcel_Calculation_Functions::flattenArray($yValues)));\n        }\n\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        foreach ($yValues as $value) {\n            if ($value <= 0.0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n        }\n\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return 1;\n        }\n\n        $bestFitExponential = trendClass::calculate(trendClass::TREND_EXPONENTIAL, $yValues, $xValues, $const);\n        if ($stats) {\n            return array(\n                array(\n                    $bestFitExponential->getSlope(),\n                    $bestFitExponential->getSlopeSE(),\n                    $bestFitExponential->getGoodnessOfFit(),\n                    $bestFitExponential->getF(),\n                    $bestFitExponential->getSSRegression(),\n                ),\n                array(\n                    $bestFitExponential->getIntersect(),\n                    $bestFitExponential->getIntersectSE(),\n                    $bestFitExponential->getStdevOfResiduals(),\n                    $bestFitExponential->getDFResiduals(),\n                    $bestFitExponential->getSSResiduals()\n                )\n            );\n        } else {\n            return array(\n                $bestFitExponential->getSlope(),\n                $bestFitExponential->getIntersect()\n            );\n        }\n    }\n\n\n    /**\n     * LOGINV\n     *\n     * Returns the inverse of the normal cumulative distribution\n     *\n     * @param    float        $probability\n     * @param    float        $mean\n     * @param    float        $stdDev\n     * @return    float\n     *\n     * @todo    Try implementing P J Acklam's refinement algorithm for greater\n     *            accuracy if I can get my head round the mathematics\n     *            (as described at) http://home.online.no/~pjacklam/notes/invnorm/\n     */\n    public static function LOGINV($probability, $mean, $stdDev)\n    {\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $mean        = PHPExcel_Calculation_Functions::flattenSingleValue($mean);\n        $stdDev      = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev);\n\n        if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) {\n            if (($probability < 0) || ($probability > 1) || ($stdDev <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return exp($mean + $stdDev * self::NORMSINV($probability));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * LOGNORMDIST\n     *\n     * Returns the cumulative lognormal distribution of x, where ln(x) is normally distributed\n     * with parameters mean and standard_dev.\n     *\n     * @param    float        $value\n     * @param    float        $mean\n     * @param    float        $stdDev\n     * @return    float\n     */\n    public static function LOGNORMDIST($value, $mean, $stdDev)\n    {\n        $value  = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $mean   = PHPExcel_Calculation_Functions::flattenSingleValue($mean);\n        $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev);\n\n        if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) {\n            if (($value <= 0) || ($stdDev <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return self::NORMSDIST((log($value) - $mean) / $stdDev);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * MAX\n     *\n     * MAX returns the value of the element of the values passed that has the highest value,\n     *        with negative numbers considered smaller than positive numbers.\n     *\n     * Excel Function:\n     *        MAX(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function MAX()\n    {\n        $returnValue = null;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                if ((is_null($returnValue)) || ($arg > $returnValue)) {\n                    $returnValue = $arg;\n                }\n            }\n        }\n\n        if (is_null($returnValue)) {\n            return 0;\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * MAXA\n     *\n     * Returns the greatest value in a list of arguments, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        MAXA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function MAXA()\n    {\n        $returnValue = null;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) {\n                if (is_bool($arg)) {\n                    $arg = (integer) $arg;\n                } elseif (is_string($arg)) {\n                    $arg = 0;\n                }\n                if ((is_null($returnValue)) || ($arg > $returnValue)) {\n                    $returnValue = $arg;\n                }\n            }\n        }\n\n        if (is_null($returnValue)) {\n            return 0;\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * MAXIF\n     *\n     * Counts the maximum value within a range of cells that contain numbers within the list of arguments\n     *\n     * Excel Function:\n     *        MAXIF(value1[,value2[, ...]],condition)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    string        $condition        The criteria that defines which cells will be checked.\n     * @return    float\n     */\n    public static function MAXIF($aArgs, $condition, $sumArgs = array())\n    {\n        $returnValue = null;\n\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs);\n        $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs);\n        if (empty($sumArgs)) {\n            $sumArgs = $aArgs;\n        }\n        $condition = PHPExcel_Calculation_Functions::ifCondition($condition);\n        // Loop through arguments\n        foreach ($aArgs as $key => $arg) {\n            if (!is_numeric($arg)) {\n                $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));\n            }\n            $testCondition = '='.$arg.$condition;\n            if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {\n                if ((is_null($returnValue)) || ($arg > $returnValue)) {\n                    $returnValue = $arg;\n                }\n            }\n        }\n\n        return $returnValue;\n    }\n\n    /**\n     * MEDIAN\n     *\n     * Returns the median of the given numbers. The median is the number in the middle of a set of numbers.\n     *\n     * Excel Function:\n     *        MEDIAN(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function MEDIAN()\n    {\n        $returnValue = PHPExcel_Calculation_Functions::NaN();\n\n        $mArgs = array();\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                $mArgs[] = $arg;\n            }\n        }\n\n        $mValueCount = count($mArgs);\n        if ($mValueCount > 0) {\n            sort($mArgs, SORT_NUMERIC);\n            $mValueCount = $mValueCount / 2;\n            if ($mValueCount == floor($mValueCount)) {\n                $returnValue = ($mArgs[$mValueCount--] + $mArgs[$mValueCount]) / 2;\n            } else {\n                $mValueCount = floor($mValueCount);\n                $returnValue = $mArgs[$mValueCount];\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * MIN\n     *\n     * MIN returns the value of the element of the values passed that has the smallest value,\n     *        with negative numbers considered smaller than positive numbers.\n     *\n     * Excel Function:\n     *        MIN(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function MIN()\n    {\n        $returnValue = null;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                if ((is_null($returnValue)) || ($arg < $returnValue)) {\n                    $returnValue = $arg;\n                }\n            }\n        }\n\n        if (is_null($returnValue)) {\n            return 0;\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * MINA\n     *\n     * Returns the smallest value in a list of arguments, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        MINA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function MINA()\n    {\n        $returnValue = null;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) {\n                if (is_bool($arg)) {\n                    $arg = (integer) $arg;\n                } elseif (is_string($arg)) {\n                    $arg = 0;\n                }\n                if ((is_null($returnValue)) || ($arg < $returnValue)) {\n                    $returnValue = $arg;\n                }\n            }\n        }\n\n        if (is_null($returnValue)) {\n            return 0;\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * MINIF\n     *\n     * Returns the minimum value within a range of cells that contain numbers within the list of arguments\n     *\n     * Excel Function:\n     *        MINIF(value1[,value2[, ...]],condition)\n     *\n     * @access    public\n     * @category Mathematical and Trigonometric Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    string        $condition        The criteria that defines which cells will be checked.\n     * @return    float\n     */\n    public static function MINIF($aArgs, $condition, $sumArgs = array())\n    {\n        $returnValue = null;\n\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs);\n        $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs);\n        if (empty($sumArgs)) {\n            $sumArgs = $aArgs;\n        }\n        $condition = PHPExcel_Calculation_Functions::ifCondition($condition);\n        // Loop through arguments\n        foreach ($aArgs as $key => $arg) {\n            if (!is_numeric($arg)) {\n                $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg));\n            }\n            $testCondition = '='.$arg.$condition;\n            if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) {\n                if ((is_null($returnValue)) || ($arg < $returnValue)) {\n                    $returnValue = $arg;\n                }\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    //\n    //    Special variant of array_count_values that isn't limited to strings and integers,\n    //        but can work with floating point numbers as values\n    //\n    private static function modeCalc($data)\n    {\n        $frequencyArray = array();\n        foreach ($data as $datum) {\n            $found = false;\n            foreach ($frequencyArray as $key => $value) {\n                if ((string) $value['value'] == (string) $datum) {\n                    ++$frequencyArray[$key]['frequency'];\n                    $found = true;\n                    break;\n                }\n            }\n            if (!$found) {\n                $frequencyArray[] = array(\n                    'value'     => $datum,\n                    'frequency' => 1\n                );\n            }\n        }\n\n        foreach ($frequencyArray as $key => $value) {\n            $frequencyList[$key] = $value['frequency'];\n            $valueList[$key] = $value['value'];\n        }\n        array_multisort($frequencyList, SORT_DESC, $valueList, SORT_ASC, SORT_NUMERIC, $frequencyArray);\n\n        if ($frequencyArray[0]['frequency'] == 1) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n        return $frequencyArray[0]['value'];\n    }\n\n\n    /**\n     * MODE\n     *\n     * Returns the most frequently occurring, or repetitive, value in an array or range of data\n     *\n     * Excel Function:\n     *        MODE(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function MODE()\n    {\n        $returnValue = PHPExcel_Calculation_Functions::NA();\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        $mArgs = array();\n        foreach ($aArgs as $arg) {\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                $mArgs[] = $arg;\n            }\n        }\n\n        if (!empty($mArgs)) {\n            return self::modeCalc($mArgs);\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * NEGBINOMDIST\n     *\n     * Returns the negative binomial distribution. NEGBINOMDIST returns the probability that\n     *        there will be number_f failures before the number_s-th success, when the constant\n     *        probability of a success is probability_s. This function is similar to the binomial\n     *        distribution, except that the number of successes is fixed, and the number of trials is\n     *        variable. Like the binomial, trials are assumed to be independent.\n     *\n     * @param    float        $failures        Number of Failures\n     * @param    float        $successes        Threshold number of Successes\n     * @param    float        $probability    Probability of success on each trial\n     * @return    float\n     *\n     */\n    public static function NEGBINOMDIST($failures, $successes, $probability)\n    {\n        $failures    = floor(PHPExcel_Calculation_Functions::flattenSingleValue($failures));\n        $successes   = floor(PHPExcel_Calculation_Functions::flattenSingleValue($successes));\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n\n        if ((is_numeric($failures)) && (is_numeric($successes)) && (is_numeric($probability))) {\n            if (($failures < 0) || ($successes < 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            } elseif (($probability < 0) || ($probability > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {\n                if (($failures + $successes - 1) <= 0) {\n                    return PHPExcel_Calculation_Functions::NaN();\n                }\n            }\n            return (PHPExcel_Calculation_MathTrig::COMBIN($failures + $successes - 1, $successes - 1)) * (pow($probability, $successes)) * (pow(1 - $probability, $failures));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * NORMDIST\n     *\n     * Returns the normal distribution for the specified mean and standard deviation. This\n     * function has a very wide range of applications in statistics, including hypothesis\n     * testing.\n     *\n     * @param    float        $value\n     * @param    float        $mean        Mean Value\n     * @param    float        $stdDev        Standard Deviation\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function NORMDIST($value, $mean, $stdDev, $cumulative)\n    {\n        $value  = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $mean   = PHPExcel_Calculation_Functions::flattenSingleValue($mean);\n        $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev);\n\n        if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) {\n            if ($stdDev < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ((is_numeric($cumulative)) || (is_bool($cumulative))) {\n                if ($cumulative) {\n                    return 0.5 * (1 + PHPExcel_Calculation_Engineering::erfVal(($value - $mean) / ($stdDev * sqrt(2))));\n                } else {\n                    return (1 / (SQRT2PI * $stdDev)) * exp(0 - (pow($value - $mean, 2) / (2 * ($stdDev * $stdDev))));\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * NORMINV\n     *\n     * Returns the inverse of the normal cumulative distribution for the specified mean and standard deviation.\n     *\n     * @param    float        $value\n     * @param    float        $mean        Mean Value\n     * @param    float        $stdDev        Standard Deviation\n     * @return    float\n     *\n     */\n    public static function NORMINV($probability, $mean, $stdDev)\n    {\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $mean        = PHPExcel_Calculation_Functions::flattenSingleValue($mean);\n        $stdDev      = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev);\n\n        if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) {\n            if (($probability < 0) || ($probability > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ($stdDev < 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return (self::inverseNcdf($probability) * $stdDev) + $mean;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * NORMSDIST\n     *\n     * Returns the standard normal cumulative distribution function. The distribution has\n     * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a\n     * table of standard normal curve areas.\n     *\n     * @param    float        $value\n     * @return    float\n     */\n    public static function NORMSDIST($value)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n\n        return self::NORMDIST($value, 0, 1, true);\n    }\n\n\n    /**\n     * NORMSINV\n     *\n     * Returns the inverse of the standard normal cumulative distribution\n     *\n     * @param    float        $value\n     * @return    float\n     */\n    public static function NORMSINV($value)\n    {\n        return self::NORMINV($value, 0, 1);\n    }\n\n\n    /**\n     * PERCENTILE\n     *\n     * Returns the nth percentile of values in a range..\n     *\n     * Excel Function:\n     *        PERCENTILE(value1[,value2[, ...]],entry)\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    float        $entry            Percentile value in the range 0..1, inclusive.\n     * @return    float\n     */\n    public static function PERCENTILE()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $entry = array_pop($aArgs);\n\n        if ((is_numeric($entry)) && (!is_string($entry))) {\n            if (($entry < 0) || ($entry > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $mArgs = array();\n            foreach ($aArgs as $arg) {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    $mArgs[] = $arg;\n                }\n            }\n            $mValueCount = count($mArgs);\n            if ($mValueCount > 0) {\n                sort($mArgs);\n                $count = self::COUNT($mArgs);\n                $index = $entry * ($count-1);\n                $iBase = floor($index);\n                if ($index == $iBase) {\n                    return $mArgs[$index];\n                } else {\n                    $iNext = $iBase + 1;\n                    $iProportion = $index - $iBase;\n                    return $mArgs[$iBase] + (($mArgs[$iNext] - $mArgs[$iBase]) * $iProportion) ;\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * PERCENTRANK\n     *\n     * Returns the rank of a value in a data set as a percentage of the data set.\n     *\n     * @param    array of number        An array of, or a reference to, a list of numbers.\n     * @param    number                The number whose rank you want to find.\n     * @param    number                The number of significant digits for the returned percentage value.\n     * @return    float\n     */\n    public static function PERCENTRANK($valueSet, $value, $significance = 3)\n    {\n        $valueSet     = PHPExcel_Calculation_Functions::flattenArray($valueSet);\n        $value        = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $significance = (is_null($significance)) ? 3 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($significance);\n\n        foreach ($valueSet as $key => $valueEntry) {\n            if (!is_numeric($valueEntry)) {\n                unset($valueSet[$key]);\n            }\n        }\n        sort($valueSet, SORT_NUMERIC);\n        $valueCount = count($valueSet);\n        if ($valueCount == 0) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        $valueAdjustor = $valueCount - 1;\n        if (($value < $valueSet[0]) || ($value > $valueSet[$valueAdjustor])) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n\n        $pos = array_search($value, $valueSet);\n        if ($pos === false) {\n            $pos = 0;\n            $testValue = $valueSet[0];\n            while ($testValue < $value) {\n                $testValue = $valueSet[++$pos];\n            }\n            --$pos;\n            $pos += (($value - $valueSet[$pos]) / ($testValue - $valueSet[$pos]));\n        }\n\n        return round($pos / $valueAdjustor, $significance);\n    }\n\n\n    /**\n     * PERMUT\n     *\n     * Returns the number of permutations for a given number of objects that can be\n     *        selected from number objects. A permutation is any set or subset of objects or\n     *        events where internal order is significant. Permutations are different from\n     *        combinations, for which the internal order is not significant. Use this function\n     *        for lottery-style probability calculations.\n     *\n     * @param    int        $numObjs    Number of different objects\n     * @param    int        $numInSet    Number of objects in each permutation\n     * @return    int        Number of permutations\n     */\n    public static function PERMUT($numObjs, $numInSet)\n    {\n        $numObjs  = PHPExcel_Calculation_Functions::flattenSingleValue($numObjs);\n        $numInSet = PHPExcel_Calculation_Functions::flattenSingleValue($numInSet);\n\n        if ((is_numeric($numObjs)) && (is_numeric($numInSet))) {\n            $numInSet = floor($numInSet);\n            if ($numObjs < $numInSet) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return round(PHPExcel_Calculation_MathTrig::FACT($numObjs) / PHPExcel_Calculation_MathTrig::FACT($numObjs - $numInSet));\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * POISSON\n     *\n     * Returns the Poisson distribution. A common application of the Poisson distribution\n     * is predicting the number of events over a specific time, such as the number of\n     * cars arriving at a toll plaza in 1 minute.\n     *\n     * @param    float        $value\n     * @param    float        $mean        Mean Value\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function POISSON($value, $mean, $cumulative)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $mean  = PHPExcel_Calculation_Functions::flattenSingleValue($mean);\n\n        if ((is_numeric($value)) && (is_numeric($mean))) {\n            if (($value < 0) || ($mean <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ((is_numeric($cumulative)) || (is_bool($cumulative))) {\n                if ($cumulative) {\n                    $summer = 0;\n                    for ($i = 0; $i <= floor($value); ++$i) {\n                        $summer += pow($mean, $i) / PHPExcel_Calculation_MathTrig::FACT($i);\n                    }\n                    return exp(0-$mean) * $summer;\n                } else {\n                    return (exp(0-$mean) * pow($mean, $value)) / PHPExcel_Calculation_MathTrig::FACT($value);\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * QUARTILE\n     *\n     * Returns the quartile of a data set.\n     *\n     * Excel Function:\n     *        QUARTILE(value1[,value2[, ...]],entry)\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    int            $entry            Quartile value in the range 1..3, inclusive.\n     * @return    float\n     */\n    public static function QUARTILE()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $entry = floor(array_pop($aArgs));\n\n        if ((is_numeric($entry)) && (!is_string($entry))) {\n            $entry /= 4;\n            if (($entry < 0) || ($entry > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return self::PERCENTILE($aArgs, $entry);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * RANK\n     *\n     * Returns the rank of a number in a list of numbers.\n     *\n     * @param    number                The number whose rank you want to find.\n     * @param    array of number        An array of, or a reference to, a list of numbers.\n     * @param    mixed                Order to sort the values in the value set\n     * @return    float\n     */\n    public static function RANK($value, $valueSet, $order = 0)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $valueSet = PHPExcel_Calculation_Functions::flattenArray($valueSet);\n        $order = (is_null($order)) ? 0 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($order);\n\n        foreach ($valueSet as $key => $valueEntry) {\n            if (!is_numeric($valueEntry)) {\n                unset($valueSet[$key]);\n            }\n        }\n\n        if ($order == 0) {\n            rsort($valueSet, SORT_NUMERIC);\n        } else {\n            sort($valueSet, SORT_NUMERIC);\n        }\n        $pos = array_search($value, $valueSet);\n        if ($pos === false) {\n            return PHPExcel_Calculation_Functions::NA();\n        }\n\n        return ++$pos;\n    }\n\n\n    /**\n     * RSQ\n     *\n     * Returns the square of the Pearson product moment correlation coefficient through data points in known_y's and known_x's.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function RSQ($yValues, $xValues)\n    {\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getGoodnessOfFit();\n    }\n\n\n    /**\n     * SKEW\n     *\n     * Returns the skewness of a distribution. Skewness characterizes the degree of asymmetry\n     * of a distribution around its mean. Positive skewness indicates a distribution with an\n     * asymmetric tail extending toward more positive values. Negative skewness indicates a\n     * distribution with an asymmetric tail extending toward more negative values.\n     *\n     * @param    array    Data Series\n     * @return    float\n     */\n    public static function SKEW()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n        $mean = self::AVERAGE($aArgs);\n        $stdDev = self::STDEV($aArgs);\n\n        $count = $summer = 0;\n        // Loop through arguments\n        foreach ($aArgs as $k => $arg) {\n            if ((is_bool($arg)) &&\n                (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n            } else {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    $summer += pow((($arg - $mean) / $stdDev), 3);\n                    ++$count;\n                }\n            }\n        }\n\n        if ($count > 2) {\n            return $summer * ($count / (($count-1) * ($count-2)));\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * SLOPE\n     *\n     * Returns the slope of the linear regression line through data points in known_y's and known_x's.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function SLOPE($yValues, $xValues)\n    {\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getSlope();\n    }\n\n\n    /**\n     * SMALL\n     *\n     * Returns the nth smallest value in a data set. You can use this function to\n     *        select a value based on its relative standing.\n     *\n     * Excel Function:\n     *        SMALL(value1[,value2[, ...]],entry)\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    int            $entry            Position (ordered from the smallest) in the array or range of data to return\n     * @return    float\n     */\n    public static function SMALL()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $entry = array_pop($aArgs);\n\n        if ((is_numeric($entry)) && (!is_string($entry))) {\n            $mArgs = array();\n            foreach ($aArgs as $arg) {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    $mArgs[] = $arg;\n                }\n            }\n            $count = self::COUNT($mArgs);\n            $entry = floor(--$entry);\n            if (($entry < 0) || ($entry >= $count) || ($count == 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            sort($mArgs);\n            return $mArgs[$entry];\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * STANDARDIZE\n     *\n     * Returns a normalized value from a distribution characterized by mean and standard_dev.\n     *\n     * @param    float    $value        Value to normalize\n     * @param    float    $mean        Mean Value\n     * @param    float    $stdDev        Standard Deviation\n     * @return    float    Standardized value\n     */\n    public static function STANDARDIZE($value, $mean, $stdDev)\n    {\n        $value  = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $mean   = PHPExcel_Calculation_Functions::flattenSingleValue($mean);\n        $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev);\n\n        if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) {\n            if ($stdDev <= 0) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            return ($value - $mean) / $stdDev ;\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * STDEV\n     *\n     * Estimates standard deviation based on a sample. The standard deviation is a measure of how\n     *        widely values are dispersed from the average value (the mean).\n     *\n     * Excel Function:\n     *        STDEV(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function STDEV()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n\n        // Return value\n        $returnValue = null;\n\n        $aMean = self::AVERAGE($aArgs);\n        if (!is_null($aMean)) {\n            $aCount = -1;\n            foreach ($aArgs as $k => $arg) {\n                if ((is_bool($arg)) &&\n                    ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) {\n                    $arg = (integer) $arg;\n                }\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    if (is_null($returnValue)) {\n                        $returnValue = pow(($arg - $aMean), 2);\n                    } else {\n                        $returnValue += pow(($arg - $aMean), 2);\n                    }\n                    ++$aCount;\n                }\n            }\n\n            // Return\n            if (($aCount > 0) && ($returnValue >= 0)) {\n                return sqrt($returnValue / $aCount);\n            }\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * STDEVA\n     *\n     * Estimates standard deviation based on a sample, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        STDEVA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function STDEVA()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n\n        $returnValue = null;\n\n        $aMean = self::AVERAGEA($aArgs);\n        if (!is_null($aMean)) {\n            $aCount = -1;\n            foreach ($aArgs as $k => $arg) {\n                if ((is_bool($arg)) &&\n                    (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n                } else {\n                    // Is it a numeric value?\n                    if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) {\n                        if (is_bool($arg)) {\n                            $arg = (integer) $arg;\n                        } elseif (is_string($arg)) {\n                            $arg = 0;\n                        }\n                        if (is_null($returnValue)) {\n                            $returnValue = pow(($arg - $aMean), 2);\n                        } else {\n                            $returnValue += pow(($arg - $aMean), 2);\n                        }\n                        ++$aCount;\n                    }\n                }\n            }\n\n            if (($aCount > 0) && ($returnValue >= 0)) {\n                return sqrt($returnValue / $aCount);\n            }\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * STDEVP\n     *\n     * Calculates standard deviation based on the entire population\n     *\n     * Excel Function:\n     *        STDEVP(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function STDEVP()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n\n        $returnValue = null;\n\n        $aMean = self::AVERAGE($aArgs);\n        if (!is_null($aMean)) {\n            $aCount = 0;\n            foreach ($aArgs as $k => $arg) {\n                if ((is_bool($arg)) &&\n                    ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) {\n                    $arg = (integer) $arg;\n                }\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    if (is_null($returnValue)) {\n                        $returnValue = pow(($arg - $aMean), 2);\n                    } else {\n                        $returnValue += pow(($arg - $aMean), 2);\n                    }\n                    ++$aCount;\n                }\n            }\n\n            if (($aCount > 0) && ($returnValue >= 0)) {\n                return sqrt($returnValue / $aCount);\n            }\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * STDEVPA\n     *\n     * Calculates standard deviation based on the entire population, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        STDEVPA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function STDEVPA()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n\n        $returnValue = null;\n\n        $aMean = self::AVERAGEA($aArgs);\n        if (!is_null($aMean)) {\n            $aCount = 0;\n            foreach ($aArgs as $k => $arg) {\n                if ((is_bool($arg)) &&\n                    (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n                } else {\n                    // Is it a numeric value?\n                    if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) {\n                        if (is_bool($arg)) {\n                            $arg = (integer) $arg;\n                        } elseif (is_string($arg)) {\n                            $arg = 0;\n                        }\n                        if (is_null($returnValue)) {\n                            $returnValue = pow(($arg - $aMean), 2);\n                        } else {\n                            $returnValue += pow(($arg - $aMean), 2);\n                        }\n                        ++$aCount;\n                    }\n                }\n            }\n\n            if (($aCount > 0) && ($returnValue >= 0)) {\n                return sqrt($returnValue / $aCount);\n            }\n        }\n        return PHPExcel_Calculation_Functions::DIV0();\n    }\n\n\n    /**\n     * STEYX\n     *\n     * Returns the standard error of the predicted y-value for each x in the regression.\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @return    float\n     */\n    public static function STEYX($yValues, $xValues)\n    {\n        if (!self::checkTrendArrays($yValues, $xValues)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $yValueCount = count($yValues);\n        $xValueCount = count($xValues);\n\n        if (($yValueCount == 0) || ($yValueCount != $xValueCount)) {\n            return PHPExcel_Calculation_Functions::NA();\n        } elseif ($yValueCount == 1) {\n            return PHPExcel_Calculation_Functions::DIV0();\n        }\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues);\n        return $bestFitLinear->getStdevOfResiduals();\n    }\n\n\n    /**\n     * TDIST\n     *\n     * Returns the probability of Student's T distribution.\n     *\n     * @param    float        $value            Value for the function\n     * @param    float        $degrees        degrees of freedom\n     * @param    float        $tails            number of tails (1 or 2)\n     * @return    float\n     */\n    public static function TDIST($value, $degrees, $tails)\n    {\n        $value        = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $degrees    = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees));\n        $tails        = floor(PHPExcel_Calculation_Functions::flattenSingleValue($tails));\n\n        if ((is_numeric($value)) && (is_numeric($degrees)) && (is_numeric($tails))) {\n            if (($value < 0) || ($degrees < 1) || ($tails < 1) || ($tails > 2)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            //    tdist, which finds the probability that corresponds to a given value\n            //    of t with k degrees of freedom. This algorithm is translated from a\n            //    pascal function on p81 of \"Statistical Computing in Pascal\" by D\n            //    Cooke, A H Craven & G M Clark (1985: Edward Arnold (Pubs.) Ltd:\n            //    London). The above Pascal algorithm is itself a translation of the\n            //    fortran algoritm \"AS 3\" by B E Cooper of the Atlas Computer\n            //    Laboratory as reported in (among other places) \"Applied Statistics\n            //    Algorithms\", editied by P Griffiths and I D Hill (1985; Ellis\n            //    Horwood Ltd.; W. Sussex, England).\n            $tterm = $degrees;\n            $ttheta = atan2($value, sqrt($tterm));\n            $tc = cos($ttheta);\n            $ts = sin($ttheta);\n            $tsum = 0;\n\n            if (($degrees % 2) == 1) {\n                $ti = 3;\n                $tterm = $tc;\n            } else {\n                $ti = 2;\n                $tterm = 1;\n            }\n\n            $tsum = $tterm;\n            while ($ti < $degrees) {\n                $tterm *= $tc * $tc * ($ti - 1) / $ti;\n                $tsum += $tterm;\n                $ti += 2;\n            }\n            $tsum *= $ts;\n            if (($degrees % 2) == 1) {\n                $tsum = M_2DIVPI * ($tsum + $ttheta);\n            }\n            $tValue = 0.5 * (1 + $tsum);\n            if ($tails == 1) {\n                return 1 - abs($tValue);\n            } else {\n                return 1 - abs((1 - $tValue) - $tValue);\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * TINV\n     *\n     * Returns the one-tailed probability of the chi-squared distribution.\n     *\n     * @param    float        $probability    Probability for the function\n     * @param    float        $degrees        degrees of freedom\n     * @return    float\n     */\n    public static function TINV($probability, $degrees)\n    {\n        $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability);\n        $degrees     = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees));\n\n        if ((is_numeric($probability)) && (is_numeric($degrees))) {\n            $xLo = 100;\n            $xHi = 0;\n\n            $x = $xNew = 1;\n            $dx    = 1;\n            $i = 0;\n\n            while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) {\n                // Apply Newton-Raphson step\n                $result = self::TDIST($x, $degrees, 2);\n                $error = $result - $probability;\n                if ($error == 0.0) {\n                    $dx = 0;\n                } elseif ($error < 0.0) {\n                    $xLo = $x;\n                } else {\n                    $xHi = $x;\n                }\n                // Avoid division by zero\n                if ($result != 0.0) {\n                    $dx = $error / $result;\n                    $xNew = $x - $dx;\n                }\n                // If the NR fails to converge (which for example may be the\n                // case if the initial guess is too rough) we apply a bisection\n                // step to determine a more narrow interval around the root.\n                if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) {\n                    $xNew = ($xLo + $xHi) / 2;\n                    $dx = $xNew - $x;\n                }\n                $x = $xNew;\n            }\n            if ($i == MAX_ITERATIONS) {\n                return PHPExcel_Calculation_Functions::NA();\n            }\n            return round($x, 12);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * TREND\n     *\n     * Returns values along a linear trend\n     *\n     * @param    array of mixed        Data Series Y\n     * @param    array of mixed        Data Series X\n     * @param    array of mixed        Values of X for which we want to find Y\n     * @param    boolean                A logical value specifying whether to force the intersect to equal 0.\n     * @return    array of float\n     */\n    public static function TREND($yValues, $xValues = array(), $newValues = array(), $const = true)\n    {\n        $yValues = PHPExcel_Calculation_Functions::flattenArray($yValues);\n        $xValues = PHPExcel_Calculation_Functions::flattenArray($xValues);\n        $newValues = PHPExcel_Calculation_Functions::flattenArray($newValues);\n        $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const);\n\n        $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues, $const);\n        if (empty($newValues)) {\n            $newValues = $bestFitLinear->getXValues();\n        }\n\n        $returnArray = array();\n        foreach ($newValues as $xValue) {\n            $returnArray[0][] = $bestFitLinear->getValueOfYForX($xValue);\n        }\n\n        return $returnArray;\n    }\n\n\n    /**\n     * TRIMMEAN\n     *\n     * Returns the mean of the interior of a data set. TRIMMEAN calculates the mean\n     *        taken by excluding a percentage of data points from the top and bottom tails\n     *        of a data set.\n     *\n     * Excel Function:\n     *        TRIMEAN(value1[,value2[, ...]], $discard)\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @param    float        $discard        Percentage to discard\n     * @return    float\n     */\n    public static function TRIMMEAN()\n    {\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n\n        // Calculate\n        $percent = array_pop($aArgs);\n\n        if ((is_numeric($percent)) && (!is_string($percent))) {\n            if (($percent < 0) || ($percent > 1)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            $mArgs = array();\n            foreach ($aArgs as $arg) {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) && (!is_string($arg))) {\n                    $mArgs[] = $arg;\n                }\n            }\n            $discard = floor(self::COUNT($mArgs) * $percent / 2);\n            sort($mArgs);\n            for ($i=0; $i < $discard; ++$i) {\n                array_pop($mArgs);\n                array_shift($mArgs);\n            }\n            return self::AVERAGE($mArgs);\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * VARFunc\n     *\n     * Estimates variance based on a sample.\n     *\n     * Excel Function:\n     *        VAR(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function VARFunc()\n    {\n        $returnValue = PHPExcel_Calculation_Functions::DIV0();\n\n        $summerA = $summerB = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        $aCount = 0;\n        foreach ($aArgs as $arg) {\n            if (is_bool($arg)) {\n                $arg = (integer) $arg;\n            }\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                $summerA += ($arg * $arg);\n                $summerB += $arg;\n                ++$aCount;\n            }\n        }\n\n        if ($aCount > 1) {\n            $summerA *= $aCount;\n            $summerB *= $summerB;\n            $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1));\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * VARA\n     *\n     * Estimates variance based on a sample, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        VARA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function VARA()\n    {\n        $returnValue = PHPExcel_Calculation_Functions::DIV0();\n\n        $summerA = $summerB = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n        $aCount = 0;\n        foreach ($aArgs as $k => $arg) {\n            if ((is_string($arg)) &&\n                (PHPExcel_Calculation_Functions::isValue($k))) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            } elseif ((is_string($arg)) &&\n                (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n            } else {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) {\n                    if (is_bool($arg)) {\n                        $arg = (integer) $arg;\n                    } elseif (is_string($arg)) {\n                        $arg = 0;\n                    }\n                    $summerA += ($arg * $arg);\n                    $summerB += $arg;\n                    ++$aCount;\n                }\n            }\n        }\n\n        if ($aCount > 1) {\n            $summerA *= $aCount;\n            $summerB *= $summerB;\n            $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1));\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * VARP\n     *\n     * Calculates variance based on the entire population\n     *\n     * Excel Function:\n     *        VARP(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function VARP()\n    {\n        // Return value\n        $returnValue = PHPExcel_Calculation_Functions::DIV0();\n\n        $summerA = $summerB = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        $aCount = 0;\n        foreach ($aArgs as $arg) {\n            if (is_bool($arg)) {\n                $arg = (integer) $arg;\n            }\n            // Is it a numeric value?\n            if ((is_numeric($arg)) && (!is_string($arg))) {\n                $summerA += ($arg * $arg);\n                $summerB += $arg;\n                ++$aCount;\n            }\n        }\n\n        if ($aCount > 0) {\n            $summerA *= $aCount;\n            $summerB *= $summerB;\n            $returnValue = ($summerA - $summerB) / ($aCount * $aCount);\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * VARPA\n     *\n     * Calculates variance based on the entire population, including numbers, text, and logical values\n     *\n     * Excel Function:\n     *        VARPA(value1[,value2[, ...]])\n     *\n     * @access    public\n     * @category Statistical Functions\n     * @param    mixed        $arg,...        Data values\n     * @return    float\n     */\n    public static function VARPA()\n    {\n        $returnValue = PHPExcel_Calculation_Functions::DIV0();\n\n        $summerA = $summerB = 0;\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args());\n        $aCount = 0;\n        foreach ($aArgs as $k => $arg) {\n            if ((is_string($arg)) &&\n                (PHPExcel_Calculation_Functions::isValue($k))) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            } elseif ((is_string($arg)) &&\n                (!PHPExcel_Calculation_Functions::isMatrixValue($k))) {\n            } else {\n                // Is it a numeric value?\n                if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) {\n                    if (is_bool($arg)) {\n                        $arg = (integer) $arg;\n                    } elseif (is_string($arg)) {\n                        $arg = 0;\n                    }\n                    $summerA += ($arg * $arg);\n                    $summerB += $arg;\n                    ++$aCount;\n                }\n            }\n        }\n\n        if ($aCount > 0) {\n            $summerA *= $aCount;\n            $summerB *= $summerB;\n            $returnValue = ($summerA - $summerB) / ($aCount * $aCount);\n        }\n        return $returnValue;\n    }\n\n\n    /**\n     * WEIBULL\n     *\n     * Returns the Weibull distribution. Use this distribution in reliability\n     * analysis, such as calculating a device's mean time to failure.\n     *\n     * @param    float        $value\n     * @param    float        $alpha        Alpha Parameter\n     * @param    float        $beta        Beta Parameter\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function WEIBULL($value, $alpha, $beta, $cumulative)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha);\n        $beta  = PHPExcel_Calculation_Functions::flattenSingleValue($beta);\n\n        if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta))) {\n            if (($value < 0) || ($alpha <= 0) || ($beta <= 0)) {\n                return PHPExcel_Calculation_Functions::NaN();\n            }\n            if ((is_numeric($cumulative)) || (is_bool($cumulative))) {\n                if ($cumulative) {\n                    return 1 - exp(0 - pow($value / $beta, $alpha));\n                } else {\n                    return ($alpha / pow($beta, $alpha)) * pow($value, $alpha - 1) * exp(0 - pow($value / $beta, $alpha));\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * ZTEST\n     *\n     * Returns the Weibull distribution. Use this distribution in reliability\n     * analysis, such as calculating a device's mean time to failure.\n     *\n     * @param    float        $dataSet\n     * @param    float        $m0        Alpha Parameter\n     * @param    float        $sigma    Beta Parameter\n     * @param    boolean        $cumulative\n     * @return    float\n     *\n     */\n    public static function ZTEST($dataSet, $m0, $sigma = null)\n    {\n        $dataSet = PHPExcel_Calculation_Functions::flattenArrayIndexed($dataSet);\n        $m0      = PHPExcel_Calculation_Functions::flattenSingleValue($m0);\n        $sigma   = PHPExcel_Calculation_Functions::flattenSingleValue($sigma);\n\n        if (is_null($sigma)) {\n            $sigma = self::STDEV($dataSet);\n        }\n        $n = count($dataSet);\n\n        return 1 - self::NORMSDIST((self::AVERAGE($dataSet) - $m0) / ($sigma / SQRT($n)));\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/TextData.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Calculation_TextData\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Calculation\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_TextData\n{\n    private static $invalidChars;\n\n    private static function unicodeToOrd($c)\n    {\n        if (ord($c{0}) >=0 && ord($c{0}) <= 127) {\n            return ord($c{0});\n        } elseif (ord($c{0}) >= 192 && ord($c{0}) <= 223) {\n            return (ord($c{0})-192)*64 + (ord($c{1})-128);\n        } elseif (ord($c{0}) >= 224 && ord($c{0}) <= 239) {\n            return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128);\n        } elseif (ord($c{0}) >= 240 && ord($c{0}) <= 247) {\n            return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128);\n        } elseif (ord($c{0}) >= 248 && ord($c{0}) <= 251) {\n            return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128);\n        } elseif (ord($c{0}) >= 252 && ord($c{0}) <= 253) {\n            return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128);\n        } elseif (ord($c{0}) >= 254 && ord($c{0}) <= 255) {\n            // error\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        return 0;\n    }\n\n    /**\n     * CHARACTER\n     *\n     * @param    string    $character    Value\n     * @return    int\n     */\n    public static function CHARACTER($character)\n    {\n        $character = PHPExcel_Calculation_Functions::flattenSingleValue($character);\n\n        if ((!is_numeric($character)) || ($character < 0)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (function_exists('mb_convert_encoding')) {\n            return mb_convert_encoding('&#'.intval($character).';', 'UTF-8', 'HTML-ENTITIES');\n        } else {\n            return chr(intval($character));\n        }\n    }\n\n\n    /**\n     * TRIMNONPRINTABLE\n     *\n     * @param    mixed    $stringValue    Value to check\n     * @return    string\n     */\n    public static function TRIMNONPRINTABLE($stringValue = '')\n    {\n        $stringValue    = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue);\n\n        if (is_bool($stringValue)) {\n            return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        if (self::$invalidChars == null) {\n            self::$invalidChars = range(chr(0), chr(31));\n        }\n\n        if (is_string($stringValue) || is_numeric($stringValue)) {\n            return str_replace(self::$invalidChars, '', trim($stringValue, \"\\x00..\\x1F\"));\n        }\n        return null;\n    }\n\n\n    /**\n     * TRIMSPACES\n     *\n     * @param    mixed    $stringValue    Value to check\n     * @return    string\n     */\n    public static function TRIMSPACES($stringValue = '')\n    {\n        $stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue);\n        if (is_bool($stringValue)) {\n            return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        if (is_string($stringValue) || is_numeric($stringValue)) {\n            return trim(preg_replace('/ +/', ' ', trim($stringValue, ' ')), ' ');\n        }\n        return null;\n    }\n\n\n    /**\n     * ASCIICODE\n     *\n     * @param    string    $characters        Value\n     * @return    int\n     */\n    public static function ASCIICODE($characters)\n    {\n        if (($characters === null) || ($characters === '')) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        $characters    = PHPExcel_Calculation_Functions::flattenSingleValue($characters);\n        if (is_bool($characters)) {\n            if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                $characters = (int) $characters;\n            } else {\n                $characters = ($characters) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n            }\n        }\n\n        $character = $characters;\n        if ((function_exists('mb_strlen')) && (function_exists('mb_substr'))) {\n            if (mb_strlen($characters, 'UTF-8') > 1) {\n                $character = mb_substr($characters, 0, 1, 'UTF-8');\n            }\n            return self::unicodeToOrd($character);\n        } else {\n            if (strlen($characters) > 0) {\n                $character = substr($characters, 0, 1);\n            }\n            return ord($character);\n        }\n    }\n\n\n    /**\n     * CONCATENATE\n     *\n     * @return    string\n     */\n    public static function CONCATENATE()\n    {\n        $returnValue = '';\n\n        // Loop through arguments\n        $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());\n        foreach ($aArgs as $arg) {\n            if (is_bool($arg)) {\n                if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n                    $arg = (int) $arg;\n                } else {\n                    $arg = ($arg) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n                }\n            }\n            $returnValue .= $arg;\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * DOLLAR\n     *\n     * This function converts a number to text using currency format, with the decimals rounded to the specified place.\n     * The format used is $#,##0.00_);($#,##0.00)..\n     *\n     * @param    float    $value            The value to format\n     * @param    int        $decimals        The number of digits to display to the right of the decimal point.\n     *                                    If decimals is negative, number is rounded to the left of the decimal point.\n     *                                    If you omit decimals, it is assumed to be 2\n     * @return    string\n     */\n    public static function DOLLAR($value = 0, $decimals = 2)\n    {\n        $value        = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $decimals    = is_null($decimals) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($decimals);\n\n        // Validate parameters\n        if (!is_numeric($value) || !is_numeric($decimals)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $decimals = floor($decimals);\n\n        $mask = '$#,##0';\n        if ($decimals > 0) {\n            $mask .= '.' . str_repeat('0', $decimals);\n        } else {\n            $round = pow(10, abs($decimals));\n            if ($value < 0) {\n                $round = 0-$round;\n            }\n            $value = PHPExcel_Calculation_MathTrig::MROUND($value, $round);\n        }\n\n        return PHPExcel_Style_NumberFormat::toFormattedString($value, $mask);\n\n    }\n\n\n    /**\n     * SEARCHSENSITIVE\n     *\n     * @param    string    $needle        The string to look for\n     * @param    string    $haystack    The string in which to look\n     * @param    int        $offset        Offset within $haystack\n     * @return    string\n     */\n    public static function SEARCHSENSITIVE($needle, $haystack, $offset = 1)\n    {\n        $needle   = PHPExcel_Calculation_Functions::flattenSingleValue($needle);\n        $haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack);\n        $offset   = PHPExcel_Calculation_Functions::flattenSingleValue($offset);\n\n        if (!is_bool($needle)) {\n            if (is_bool($haystack)) {\n                $haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n            }\n\n            if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) {\n                if (PHPExcel_Shared_String::CountCharacters($needle) == 0) {\n                    return $offset;\n                }\n                if (function_exists('mb_strpos')) {\n                    $pos = mb_strpos($haystack, $needle, --$offset, 'UTF-8');\n                } else {\n                    $pos = strpos($haystack, $needle, --$offset);\n                }\n                if ($pos !== false) {\n                    return ++$pos;\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * SEARCHINSENSITIVE\n     *\n     * @param    string    $needle        The string to look for\n     * @param    string    $haystack    The string in which to look\n     * @param    int        $offset        Offset within $haystack\n     * @return    string\n     */\n    public static function SEARCHINSENSITIVE($needle, $haystack, $offset = 1)\n    {\n        $needle   = PHPExcel_Calculation_Functions::flattenSingleValue($needle);\n        $haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack);\n        $offset   = PHPExcel_Calculation_Functions::flattenSingleValue($offset);\n\n        if (!is_bool($needle)) {\n            if (is_bool($haystack)) {\n                $haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n            }\n\n            if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) {\n                if (PHPExcel_Shared_String::CountCharacters($needle) == 0) {\n                    return $offset;\n                }\n                if (function_exists('mb_stripos')) {\n                    $pos = mb_stripos($haystack, $needle, --$offset, 'UTF-8');\n                } else {\n                    $pos = stripos($haystack, $needle, --$offset);\n                }\n                if ($pos !== false) {\n                    return ++$pos;\n                }\n            }\n        }\n        return PHPExcel_Calculation_Functions::VALUE();\n    }\n\n\n    /**\n     * FIXEDFORMAT\n     *\n     * @param    mixed        $value    Value to check\n     * @param    integer        $decimals\n     * @param    boolean        $no_commas\n     * @return    boolean\n     */\n    public static function FIXEDFORMAT($value, $decimals = 2, $no_commas = false)\n    {\n        $value     = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $decimals  = PHPExcel_Calculation_Functions::flattenSingleValue($decimals);\n        $no_commas = PHPExcel_Calculation_Functions::flattenSingleValue($no_commas);\n\n        // Validate parameters\n        if (!is_numeric($value) || !is_numeric($decimals)) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        $decimals = floor($decimals);\n\n        $valueResult = round($value, $decimals);\n        if ($decimals < 0) {\n            $decimals = 0;\n        }\n        if (!$no_commas) {\n            $valueResult = number_format($valueResult, $decimals);\n        }\n\n        return (string) $valueResult;\n    }\n\n\n    /**\n     * LEFT\n     *\n     * @param    string    $value    Value\n     * @param    int        $chars    Number of characters\n     * @return    string\n     */\n    public static function LEFT($value = '', $chars = 1)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);\n\n        if ($chars < 0) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (is_bool($value)) {\n            $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        if (function_exists('mb_substr')) {\n            return mb_substr($value, 0, $chars, 'UTF-8');\n        } else {\n            return substr($value, 0, $chars);\n        }\n    }\n\n\n    /**\n     * MID\n     *\n     * @param    string    $value    Value\n     * @param    int        $start    Start character\n     * @param    int        $chars    Number of characters\n     * @return    string\n     */\n    public static function MID($value = '', $start = 1, $chars = null)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $start = PHPExcel_Calculation_Functions::flattenSingleValue($start);\n        $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);\n\n        if (($start < 1) || ($chars < 0)) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (is_bool($value)) {\n            $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        if (function_exists('mb_substr')) {\n            return mb_substr($value, --$start, $chars, 'UTF-8');\n        } else {\n            return substr($value, --$start, $chars);\n        }\n    }\n\n\n    /**\n     * RIGHT\n     *\n     * @param    string    $value    Value\n     * @param    int        $chars    Number of characters\n     * @return    string\n     */\n    public static function RIGHT($value = '', $chars = 1)\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars);\n\n        if ($chars < 0) {\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n\n        if (is_bool($value)) {\n            $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        if ((function_exists('mb_substr')) && (function_exists('mb_strlen'))) {\n            return mb_substr($value, mb_strlen($value, 'UTF-8') - $chars, $chars, 'UTF-8');\n        } else {\n            return substr($value, strlen($value) - $chars);\n        }\n    }\n\n\n    /**\n     * STRINGLENGTH\n     *\n     * @param    string    $value    Value\n     * @return    string\n     */\n    public static function STRINGLENGTH($value = '')\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n\n        if (is_bool($value)) {\n            $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        if (function_exists('mb_strlen')) {\n            return mb_strlen($value, 'UTF-8');\n        } else {\n            return strlen($value);\n        }\n    }\n\n\n    /**\n     * LOWERCASE\n     *\n     * Converts a string value to upper case.\n     *\n     * @param    string        $mixedCaseString\n     * @return    string\n     */\n    public static function LOWERCASE($mixedCaseString)\n    {\n        $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString);\n\n        if (is_bool($mixedCaseString)) {\n            $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        return PHPExcel_Shared_String::StrToLower($mixedCaseString);\n    }\n\n\n    /**\n     * UPPERCASE\n     *\n     * Converts a string value to upper case.\n     *\n     * @param    string        $mixedCaseString\n     * @return    string\n     */\n    public static function UPPERCASE($mixedCaseString)\n    {\n        $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString);\n\n        if (is_bool($mixedCaseString)) {\n            $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        return PHPExcel_Shared_String::StrToUpper($mixedCaseString);\n    }\n\n\n    /**\n     * PROPERCASE\n     *\n     * Converts a string value to upper case.\n     *\n     * @param    string        $mixedCaseString\n     * @return    string\n     */\n    public static function PROPERCASE($mixedCaseString)\n    {\n        $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString);\n\n        if (is_bool($mixedCaseString)) {\n            $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE();\n        }\n\n        return PHPExcel_Shared_String::StrToTitle($mixedCaseString);\n    }\n\n\n    /**\n     * REPLACE\n     *\n     * @param    string    $oldText    String to modify\n     * @param    int        $start        Start character\n     * @param    int        $chars        Number of characters\n     * @param    string    $newText    String to replace in defined position\n     * @return    string\n     */\n    public static function REPLACE($oldText = '', $start = 1, $chars = null, $newText)\n    {\n        $oldText = PHPExcel_Calculation_Functions::flattenSingleValue($oldText);\n        $start   = PHPExcel_Calculation_Functions::flattenSingleValue($start);\n        $chars   = PHPExcel_Calculation_Functions::flattenSingleValue($chars);\n        $newText = PHPExcel_Calculation_Functions::flattenSingleValue($newText);\n\n        $left = self::LEFT($oldText, $start-1);\n        $right = self::RIGHT($oldText, self::STRINGLENGTH($oldText)-($start+$chars)+1);\n\n        return $left.$newText.$right;\n    }\n\n\n    /**\n     * SUBSTITUTE\n     *\n     * @param    string    $text        Value\n     * @param    string    $fromText    From Value\n     * @param    string    $toText        To Value\n     * @param    integer    $instance    Instance Number\n     * @return    string\n     */\n    public static function SUBSTITUTE($text = '', $fromText = '', $toText = '', $instance = 0)\n    {\n        $text     = PHPExcel_Calculation_Functions::flattenSingleValue($text);\n        $fromText = PHPExcel_Calculation_Functions::flattenSingleValue($fromText);\n        $toText   = PHPExcel_Calculation_Functions::flattenSingleValue($toText);\n        $instance = floor(PHPExcel_Calculation_Functions::flattenSingleValue($instance));\n\n        if ($instance == 0) {\n            if (function_exists('mb_str_replace')) {\n                return mb_str_replace($fromText, $toText, $text);\n            } else {\n                return str_replace($fromText, $toText, $text);\n            }\n        } else {\n            $pos = -1;\n            while ($instance > 0) {\n                if (function_exists('mb_strpos')) {\n                    $pos = mb_strpos($text, $fromText, $pos+1, 'UTF-8');\n                } else {\n                    $pos = strpos($text, $fromText, $pos+1);\n                }\n                if ($pos === false) {\n                    break;\n                }\n                --$instance;\n            }\n            if ($pos !== false) {\n                if (function_exists('mb_strlen')) {\n                    return self::REPLACE($text, ++$pos, mb_strlen($fromText, 'UTF-8'), $toText);\n                } else {\n                    return self::REPLACE($text, ++$pos, strlen($fromText), $toText);\n                }\n            }\n        }\n\n        return $text;\n    }\n\n\n    /**\n     * RETURNSTRING\n     *\n     * @param    mixed    $testValue    Value to check\n     * @return    boolean\n     */\n    public static function RETURNSTRING($testValue = '')\n    {\n        $testValue = PHPExcel_Calculation_Functions::flattenSingleValue($testValue);\n\n        if (is_string($testValue)) {\n            return $testValue;\n        }\n        return null;\n    }\n\n\n    /**\n     * TEXTFORMAT\n     *\n     * @param    mixed    $value    Value to check\n     * @param    string    $format    Format mask to use\n     * @return    boolean\n     */\n    public static function TEXTFORMAT($value, $format)\n    {\n        $value  = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n        $format = PHPExcel_Calculation_Functions::flattenSingleValue($format);\n\n        if ((is_string($value)) && (!is_numeric($value)) && PHPExcel_Shared_Date::isDateTimeFormatCode($format)) {\n            $value = PHPExcel_Calculation_DateTime::DATEVALUE($value);\n        }\n\n        return (string) PHPExcel_Style_NumberFormat::toFormattedString($value, $format);\n    }\n\n    /**\n     * VALUE\n     *\n     * @param    mixed    $value    Value to check\n     * @return    boolean\n     */\n    public static function VALUE($value = '')\n    {\n        $value = PHPExcel_Calculation_Functions::flattenSingleValue($value);\n\n        if (!is_numeric($value)) {\n            $numberValue = str_replace(\n                PHPExcel_Shared_String::getThousandsSeparator(),\n                '',\n                trim($value, \" \\t\\n\\r\\0\\x0B\" . PHPExcel_Shared_String::getCurrencyCode())\n            );\n            if (is_numeric($numberValue)) {\n                return (float) $numberValue;\n            }\n\n            $dateSetting = PHPExcel_Calculation_Functions::getReturnDateType();\n            PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);\n\n            if (strpos($value, ':') !== false) {\n                $timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($value);\n                if ($timeValue !== PHPExcel_Calculation_Functions::VALUE()) {\n                    PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);\n                    return $timeValue;\n                }\n            }\n            $dateValue = PHPExcel_Calculation_DateTime::DATEVALUE($value);\n            if ($dateValue !== PHPExcel_Calculation_Functions::VALUE()) {\n                PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);\n                return $dateValue;\n            }\n            PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);\n\n            return PHPExcel_Calculation_Functions::VALUE();\n        }\n        return (float) $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/Token/Stack.php",
    "content": "<?php\n\n/**\n * PHPExcel_Calculation_Token_Stack\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation_Token_Stack\n{\n    /**\n     *  The parser stack for formulae\n     *\n     *  @var mixed[]\n     */\n    private $stack = array();\n\n    /**\n     *  Count of entries in the parser stack\n     *\n     *  @var integer\n     */\n    private $count = 0;\n\n    /**\n     * Return the number of entries on the stack\n     *\n     * @return  integer\n     */\n    public function count()\n    {\n        return $this->count;\n    }\n\n    /**\n     * Push a new entry onto the stack\n     *\n     * @param  mixed  $type\n     * @param  mixed  $value\n     * @param  mixed  $reference\n     */\n    public function push($type, $value, $reference = null)\n    {\n        $this->stack[$this->count++] = array(\n            'type'      => $type,\n            'value'     => $value,\n            'reference' => $reference\n        );\n        if ($type == 'Function') {\n            $localeFunction = PHPExcel_Calculation::localeFunc($value);\n            if ($localeFunction != $value) {\n                $this->stack[($this->count - 1)]['localeValue'] = $localeFunction;\n            }\n        }\n    }\n\n    /**\n     * Pop the last entry from the stack\n     *\n     * @return  mixed\n     */\n    public function pop()\n    {\n        if ($this->count > 0) {\n            return $this->stack[--$this->count];\n        }\n        return null;\n    }\n\n    /**\n     * Return an entry from the stack without removing it\n     *\n     * @param   integer  $n  number indicating how far back in the stack we want to look\n     * @return  mixed\n     */\n    public function last($n = 1)\n    {\n        if ($this->count - $n < 0) {\n            return null;\n        }\n        return $this->stack[$this->count - $n];\n    }\n\n    /**\n     * Clear the stack\n     */\n    public function clear()\n    {\n        $this->stack = array();\n        $this->count = 0;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation/functionlist.txt",
    "content": "ABS\nACCRINT\nACCRINTM\nACOS\nACOSH\nADDRESS\nAMORDEGRC\nAMORLINC\nAND\nAREAS\nASC\nASIN\nASINH\nATAN\nATAN2\nATANH\nAVEDEV\nAVERAGE\nAVERAGEA\nAVERAGEIF\nAVERAGEIFS\nBAHTTEXT\nBESSELI\nBESSELJ\nBESSELK\nBESSELY\nBETADIST\nBETAINV\nBIN2DEC\nBIN2HEX\nBIN2OCT\nBINOMDIST\nCEILING\nCELL\nCHAR\nCHIDIST\nCHIINV\nCHITEST\nCHOOSE\nCLEAN\nCODE\nCOLUMN\nCOLUMNS\nCOMBIN\nCOMPLEX\nCONCATENATE\nCONFIDENCE\nCONVERT\nCORREL\nCOS\nCOSH\nCOUNT\nCOUNTA\nCOUNTBLANK\nCOUNTIF\nCOUNTIFS\nCOUPDAYBS\nCOUPDAYBS\nCOUPDAYSNC\nCOUPNCD\nCOUPNUM\nCOUPPCD\nCOVAR\nCRITBINOM\nCUBEKPIMEMBER\nCUBEMEMBER\nCUBEMEMBERPROPERTY\nCUBERANKEDMEMBER\nCUBESET\nCUBESETCOUNT\nCUBEVALUE\nCUMIPMT\nCUMPRINC\nDATE\nDATEDIF\nDATEVALUE\nDAVERAGE\nDAY\nDAYS360\nDB\nDCOUNT\nDCOUNTA\nDDB\nDEC2BIN\nDEC2HEX\nDEC2OCT\nDEGREES\nDELTA\nDEVSQ\nDGET\nDISC\nDMAX\nDMIN\nDOLLAR\nDOLLARDE\nDOLLARFR\nDPRODUCT\nDSTDEV\nDSTDEVP\nDSUM\nDURATION\nDVAR\nDVARP\nEDATE\nEFFECT\nEOMONTH\nERF\nERFC\nERROR.TYPE\nEVEN\nEXACT\nEXP\nEXPONDIST\nFACT\nFACTDOUBLE\nFALSE\nFDIST\nFIND\nFINDB\nFINV\nFISHER\nFISHERINV\nFIXED\nFLOOR\nFORECAST\nFREQUENCY\nFTEST\nFV\nFVSCHEDULE\nGAMAMDIST\nGAMMAINV\nGAMMALN\nGCD\nGEOMEAN\nGESTEP\nGETPIVOTDATA\nGROWTH\nHARMEAN\nHEX2BIN\nHEX2OCT\nHLOOKUP\nHOUR\nHYPERLINK\nHYPGEOMDIST\nIF\nIFERROR\nIMABS\nIMAGINARY\nIMARGUMENT\nIMCONJUGATE\nIMCOS\nIMEXP\nIMLN\nIMLOG10\nIMLOG2\nIMPOWER\nIMPRODUCT\nIMREAL\nIMSIN\nIMSQRT\nIMSUB\nIMSUM\nINDEX\nINDIRECT\nINFO\nINT\nINTERCEPT\nINTRATE\nIPMT\nIRR\nISBLANK\nISERR\nISERROR\nISEVEN\nISLOGICAL\nISNA\nISNONTEXT\nISNUMBER\nISODD\nISPMT\nISREF\nISTEXT\nJIS\nKURT\nLARGE\nLCM\nLEFT\nLEFTB\nLEN\nLENB\nLINEST\nLN\nLOG\nLOG10\nLOGEST\nLOGINV\nLOGNORMDIST\nLOOKUP\nLOWER\nMATCH\nMAX\nMAXA\nMDETERM\nMDURATION\nMEDIAN\nMID\nMIDB\nMIN\nMINA\nMINUTE\nMINVERSE\nMIRR\nMMULT\nMOD\nMODE\nMONTH\nMROUND\nMULTINOMIAL\nN\nNA\nNEGBINOMDIST\nNETWORKDAYS\nNOMINAL\nNORMDIST\nNORMINV\nNORMSDIST\nNORMSINV\nNOT\nNOW\nNPER\nNPV\nOCT2BIN\nOCT2DEC\nOCT2HEX\nODD\nODDFPRICE\nODDFYIELD\nODDLPRICE\nODDLYIELD\nOFFSET\nOR\nPEARSON\nPERCENTILE\nPERCENTRANK\nPERMUT\nPHONETIC\nPI\nPMT\nPOISSON\nPOWER\nPPMT\nPRICE\nPRICEDISC\nPRICEMAT\nPROB\nPRODUCT\nPROPER\nPV\nQUARTILE\nQUOTIENT\nRADIANS\nRAND\nRANDBETWEEN\nRANK\nRATE\nRECEIVED\nREPLACE\nREPLACEB\nREPT\nRIGHT\nRIGHTB\nROMAN\nROUND\nROUNDDOWN\nROUNDUP\nROW\nROWS\nRSQ\nRTD\nSEARCH\nSEARCHB\nSECOND\nSERIESSUM\nSIGN\nSIN\nSINH\nSKEW\nSLN\nSLOPE\nSMALL\nSQRT\nSQRTPI\nSTANDARDIZE\nSTDEV\nSTDEVA\nSTDEVP\nSTDEVPA\nSTEYX\nSUBSTITUTE\nSUBTOTAL\nSUM\nSUMIF\nSUMIFS\nSUMPRODUCT\nSUMSQ\nSUMX2MY2\nSUMX2PY2\nSUMXMY2\nSYD\nT\nTAN\nTANH\nTBILLEQ\nTBILLPRICE\nTBILLYIELD\nTDIST\nTEXT\nTIME\nTIMEVALUE\nTINV\nTODAY\nTRANSPOSE\nTREND\nTRIM\nTRIMMEAN\nTRUE\nTRUNC\nTTEST\nTYPE\nUPPER\nUSDOLLAR\nVALUE\nVAR\nVARA\nVARP\nVARPA\nVDB\nVERSION\nVLOOKUP\nWEEKDAY\nWEEKNUM\nWEIBULL\nWORKDAY\nXIRR\nXNPV\nYEAR\nYEARFRAC\nYIELD\nYIELDDISC\nYIELDMAT\nZTEST\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Calculation.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\nif (!defined('CALCULATION_REGEXP_CELLREF')) {\n    //    Test for support of \\P (multibyte options) in PCRE\n    if (defined('PREG_BAD_UTF8_ERROR')) {\n        //    Cell reference (cell or range of cells, with or without a sheet reference)\n        define('CALCULATION_REGEXP_CELLREF', '((([^\\s,!&%^\\/\\*\\+<>=-]*)|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\"))!)?\\$?([a-z]{1,3})\\$?(\\d{1,7})');\n        //    Named Range of cells\n        define('CALCULATION_REGEXP_NAMEDRANGE', '((([^\\s,!&%^\\/\\*\\+<>=-]*)|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\"))!)?([_A-Z][_A-Z0-9\\.]*)');\n    } else {\n        //    Cell reference (cell or range of cells, with or without a sheet reference)\n        define('CALCULATION_REGEXP_CELLREF', '(((\\w*)|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\"))!)?\\$?([a-z]{1,3})\\$?(\\d+)');\n        //    Named Range of cells\n        define('CALCULATION_REGEXP_NAMEDRANGE', '(((\\w*)|(\\'.*\\')|(\\\".*\\\"))!)?([_A-Z][_A-Z0-9\\.]*)');\n    }\n}\n\n/**\n * PHPExcel_Calculation (Multiton)\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Calculation\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Calculation\n{\n    /** Constants                */\n    /** Regular Expressions        */\n    //    Numeric operand\n    const CALCULATION_REGEXP_NUMBER        = '[-+]?\\d*\\.?\\d+(e[-+]?\\d+)?';\n    //    String operand\n    const CALCULATION_REGEXP_STRING        = '\"(?:[^\"]|\"\")*\"';\n    //    Opening bracket\n    const CALCULATION_REGEXP_OPENBRACE    = '\\(';\n    //    Function (allow for the old @ symbol that could be used to prefix a function, but we'll ignore it)\n    const CALCULATION_REGEXP_FUNCTION    = '@?([A-Z][A-Z0-9\\.]*)[\\s]*\\(';\n    //    Cell reference (cell or range of cells, with or without a sheet reference)\n    const CALCULATION_REGEXP_CELLREF    = CALCULATION_REGEXP_CELLREF;\n    //    Named Range of cells\n    const CALCULATION_REGEXP_NAMEDRANGE    = CALCULATION_REGEXP_NAMEDRANGE;\n    //    Error\n    const CALCULATION_REGEXP_ERROR        = '\\#[A-Z][A-Z0_\\/]*[!\\?]?';\n\n\n    /** constants */\n    const RETURN_ARRAY_AS_ERROR = 'error';\n    const RETURN_ARRAY_AS_VALUE = 'value';\n    const RETURN_ARRAY_AS_ARRAY = 'array';\n\n    private static $returnArrayAsType = self::RETURN_ARRAY_AS_VALUE;\n\n\n    /**\n     * Instance of this class\n     *\n     * @access    private\n     * @var PHPExcel_Calculation\n     */\n    private static $instance;\n\n\n    /**\n     * Instance of the workbook this Calculation Engine is using\n     *\n     * @access    private\n     * @var PHPExcel\n     */\n    private $workbook;\n\n    /**\n     * List of instances of the calculation engine that we've instantiated for individual workbooks\n     *\n     * @access    private\n     * @var PHPExcel_Calculation[]\n     */\n    private static $workbookSets;\n\n    /**\n     * Calculation cache\n     *\n     * @access    private\n     * @var array\n     */\n    private $calculationCache = array ();\n\n\n    /**\n     * Calculation cache enabled\n     *\n     * @access    private\n     * @var boolean\n     */\n    private $calculationCacheEnabled = true;\n\n\n    /**\n     * List of operators that can be used within formulae\n     * The true/false value indicates whether it is a binary operator or a unary operator\n     *\n     * @access    private\n     * @var array\n     */\n    private static $operators = array(\n        '+' => true,    '-' => true,    '*' => true,    '/' => true,\n        '^' => true,    '&' => true,    '%' => false,    '~' => false,\n        '>' => true,    '<' => true,    '=' => true,    '>=' => true,\n        '<=' => true,    '<>' => true,    '|' => true,    ':' => true\n    );\n\n    /**\n     * List of binary operators (those that expect two operands)\n     *\n     * @access    private\n     * @var array\n     */\n    private static $binaryOperators = array(\n        '+' => true,    '-' => true,    '*' => true,    '/' => true,\n        '^' => true,    '&' => true,    '>' => true,    '<' => true,\n        '=' => true,    '>=' => true,    '<=' => true,    '<>' => true,\n        '|' => true,    ':' => true\n    );\n\n    /**\n     * The debug log generated by the calculation engine\n     *\n     * @access    private\n     * @var PHPExcel_CalcEngine_Logger\n     *\n     */\n    private $debugLog;\n\n    /**\n     * Flag to determine how formula errors should be handled\n     *        If true, then a user error will be triggered\n     *        If false, then an exception will be thrown\n     *\n     * @access    public\n     * @var boolean\n     *\n     */\n    public $suppressFormulaErrors = false;\n\n    /**\n     * Error message for any error that was raised/thrown by the calculation engine\n     *\n     * @access    public\n     * @var string\n     *\n     */\n    public $formulaError = null;\n\n    /**\n     * An array of the nested cell references accessed by the calculation engine, used for the debug log\n     *\n     * @access    private\n     * @var array of string\n     *\n     */\n    private $cyclicReferenceStack;\n\n    private $cellStack = array();\n\n    /**\n     * Current iteration counter for cyclic formulae\n     * If the value is 0 (or less) then cyclic formulae will throw an exception,\n     *    otherwise they will iterate to the limit defined here before returning a result\n     *\n     * @var integer\n     *\n     */\n    private $cyclicFormulaCounter = 1;\n\n    private $cyclicFormulaCell = '';\n\n    /**\n     * Number of iterations for cyclic formulae\n     *\n     * @var integer\n     *\n     */\n    public $cyclicFormulaCount = 1;\n\n    /**\n     * Epsilon Precision used for comparisons in calculations\n     *\n     * @var float\n     *\n     */\n    private $delta    = 0.1e-12;\n\n\n    /**\n     * The current locale setting\n     *\n     * @var string\n     *\n     */\n    private static $localeLanguage = 'en_us';                    //    US English    (default locale)\n\n    /**\n     * List of available locale settings\n     * Note that this is read for the locale subdirectory only when requested\n     *\n     * @var string[]\n     *\n     */\n    private static $validLocaleLanguages = array(\n        'en'        //    English        (default language)\n    );\n\n    /**\n     * Locale-specific argument separator for function arguments\n     *\n     * @var string\n     *\n     */\n    private static $localeArgumentSeparator = ',';\n    private static $localeFunctions = array();\n\n    /**\n     * Locale-specific translations for Excel constants (True, False and Null)\n     *\n     * @var string[]\n     *\n     */\n    public static $localeBoolean = array(\n        'TRUE'  => 'TRUE',\n        'FALSE' => 'FALSE',\n        'NULL'  => 'NULL'\n    );\n\n    /**\n     * Excel constant string translations to their PHP equivalents\n     * Constant conversion from text name/value to actual (datatyped) value\n     *\n     * @var string[]\n     *\n     */\n    private static $excelConstants = array(\n        'TRUE'  => true,\n        'FALSE' => false,\n        'NULL'  => null\n    );\n\n     //    PHPExcel functions\n    private static $PHPExcelFunctions = array(\n        'ABS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'abs',\n            'argumentCount' => '1'\n        ),\n        'ACCRINT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::ACCRINT',\n            'argumentCount' => '4-7'\n        ),\n        'ACCRINTM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::ACCRINTM',\n            'argumentCount' => '3-5'\n        ),\n        'ACOS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'acos',\n            'argumentCount' => '1'\n        ),\n        'ACOSH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'acosh',\n            'argumentCount' => '1'\n        ),\n        'ADDRESS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::CELL_ADDRESS',\n            'argumentCount' => '2-5'\n        ),\n        'AMORDEGRC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::AMORDEGRC',\n            'argumentCount' => '6,7'\n        ),\n        'AMORLINC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::AMORLINC',\n            'argumentCount' => '6,7'\n        ),\n        'AND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::LOGICAL_AND',\n            'argumentCount' => '1+'\n        ),\n        'AREAS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'ASC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'ASIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'asin',\n            'argumentCount' => '1'\n        ),\n        'ASINH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'asinh',\n            'argumentCount' => '1'\n        ),\n        'ATAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'atan',\n            'argumentCount' => '1'\n        ),\n        'ATAN2' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::ATAN2',\n            'argumentCount' => '2'\n        ),\n        'ATANH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'atanh',\n            'argumentCount' => '1'\n        ),\n        'AVEDEV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::AVEDEV',\n            'argumentCount' => '1+'\n        ),\n        'AVERAGE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGE',\n            'argumentCount' => '1+'\n        ),\n        'AVERAGEA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGEA',\n            'argumentCount' => '1+'\n        ),\n        'AVERAGEIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGEIF',\n            'argumentCount' => '2,3'\n        ),\n        'AVERAGEIFS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '3+'\n        ),\n        'BAHTTEXT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'BESSELI' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELI',\n            'argumentCount' => '2'\n        ),\n        'BESSELJ' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELJ',\n            'argumentCount' => '2'\n        ),\n        'BESSELK' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELK',\n            'argumentCount' => '2'\n        ),\n        'BESSELY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELY',\n            'argumentCount' => '2'\n        ),\n        'BETADIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::BETADIST',\n            'argumentCount' => '3-5'\n        ),\n        'BETAINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::BETAINV',\n            'argumentCount' => '3-5'\n        ),\n        'BIN2DEC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BINTODEC',\n            'argumentCount' => '1'\n        ),\n        'BIN2HEX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BINTOHEX',\n            'argumentCount' => '1,2'\n        ),\n        'BIN2OCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::BINTOOCT',\n            'argumentCount' => '1,2'\n        ),\n        'BINOMDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::BINOMDIST',\n            'argumentCount' => '4'\n        ),\n        'CEILING' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::CEILING',\n            'argumentCount' => '2'\n        ),\n        'CELL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1,2'\n        ),\n        'CHAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::CHARACTER',\n            'argumentCount' => '1'\n        ),\n        'CHIDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::CHIDIST',\n            'argumentCount' => '2'\n        ),\n        'CHIINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::CHIINV',\n            'argumentCount' => '2'\n        ),\n        'CHITEST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2'\n        ),\n        'CHOOSE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::CHOOSE',\n            'argumentCount' => '2+'\n        ),\n        'CLEAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::TRIMNONPRINTABLE',\n            'argumentCount' => '1'\n        ),\n        'CODE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::ASCIICODE',\n            'argumentCount' => '1'\n        ),\n        'COLUMN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::COLUMN',\n            'argumentCount' => '-1',\n            'passByReference' => array(true)\n        ),\n        'COLUMNS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::COLUMNS',\n            'argumentCount' => '1'\n        ),\n        'COMBIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::COMBIN',\n            'argumentCount' => '2'\n        ),\n        'COMPLEX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::COMPLEX',\n            'argumentCount' => '2,3'\n        ),\n        'CONCATENATE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::CONCATENATE',\n            'argumentCount' => '1+'\n        ),\n        'CONFIDENCE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::CONFIDENCE',\n            'argumentCount' => '3'\n        ),\n        'CONVERT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::CONVERTUOM',\n            'argumentCount' => '3'\n        ),\n        'CORREL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::CORREL',\n            'argumentCount' => '2'\n        ),\n        'COS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'cos',\n            'argumentCount' => '1'\n        ),\n        'COSH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'cosh',\n            'argumentCount' => '1'\n        ),\n        'COUNT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::COUNT',\n            'argumentCount' => '1+'\n        ),\n        'COUNTA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTA',\n            'argumentCount' => '1+'\n        ),\n        'COUNTBLANK' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTBLANK',\n            'argumentCount' => '1'\n        ),\n        'COUNTIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTIF',\n            'argumentCount' => '2'\n        ),\n        'COUNTIFS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2'\n        ),\n        'COUPDAYBS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYBS',\n            'argumentCount' => '3,4'\n        ),\n        'COUPDAYS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYS',\n            'argumentCount' => '3,4'\n        ),\n        'COUPDAYSNC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYSNC',\n            'argumentCount' => '3,4'\n        ),\n        'COUPNCD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::COUPNCD',\n            'argumentCount' => '3,4'\n        ),\n        'COUPNUM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::COUPNUM',\n            'argumentCount' => '3,4'\n        ),\n        'COUPPCD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::COUPPCD',\n            'argumentCount' => '3,4'\n        ),\n        'COVAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::COVAR',\n            'argumentCount' => '2'\n        ),\n        'CRITBINOM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::CRITBINOM',\n            'argumentCount' => '3'\n        ),\n        'CUBEKPIMEMBER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUBEMEMBER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUBEMEMBERPROPERTY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUBERANKEDMEMBER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUBESET' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUBESETCOUNT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUBEVALUE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '?'\n        ),\n        'CUMIPMT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::CUMIPMT',\n            'argumentCount' => '6'\n        ),\n        'CUMPRINC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::CUMPRINC',\n            'argumentCount' => '6'\n        ),\n        'DATE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DATE',\n            'argumentCount' => '3'\n        ),\n        'DATEDIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DATEDIF',\n            'argumentCount' => '2,3'\n        ),\n        'DATEVALUE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DATEVALUE',\n            'argumentCount' => '1'\n        ),\n        'DAVERAGE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DAVERAGE',\n            'argumentCount' => '3'\n        ),\n        'DAY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DAYOFMONTH',\n            'argumentCount' => '1'\n        ),\n        'DAYS360' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DAYS360',\n            'argumentCount' => '2,3'\n        ),\n        'DB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::DB',\n            'argumentCount' => '4,5'\n        ),\n        'DCOUNT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DCOUNT',\n            'argumentCount' => '3'\n        ),\n        'DCOUNTA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DCOUNTA',\n            'argumentCount' => '3'\n        ),\n        'DDB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::DDB',\n            'argumentCount' => '4,5'\n        ),\n        'DEC2BIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOBIN',\n            'argumentCount' => '1,2'\n        ),\n        'DEC2HEX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOHEX',\n            'argumentCount' => '1,2'\n        ),\n        'DEC2OCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOOCT',\n            'argumentCount' => '1,2'\n        ),\n        'DEGREES' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'rad2deg',\n            'argumentCount' => '1'\n        ),\n        'DELTA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::DELTA',\n            'argumentCount' => '1,2'\n        ),\n        'DEVSQ' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::DEVSQ',\n            'argumentCount' => '1+'\n        ),\n        'DGET' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DGET',\n            'argumentCount' => '3'\n        ),\n        'DISC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::DISC',\n            'argumentCount' => '4,5'\n        ),\n        'DMAX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DMAX',\n            'argumentCount' => '3'\n        ),\n        'DMIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DMIN',\n            'argumentCount' => '3'\n        ),\n        'DOLLAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::DOLLAR',\n            'argumentCount' => '1,2'\n        ),\n        'DOLLARDE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::DOLLARDE',\n            'argumentCount' => '2'\n        ),\n        'DOLLARFR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::DOLLARFR',\n            'argumentCount' => '2'\n        ),\n        'DPRODUCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DPRODUCT',\n            'argumentCount' => '3'\n        ),\n        'DSTDEV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DSTDEV',\n            'argumentCount' => '3'\n        ),\n        'DSTDEVP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DSTDEVP',\n            'argumentCount' => '3'\n        ),\n        'DSUM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DSUM',\n            'argumentCount' => '3'\n        ),\n        'DURATION' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '5,6'\n        ),\n        'DVAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DVAR',\n            'argumentCount' => '3'\n        ),\n        'DVARP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE,\n            'functionCall' => 'PHPExcel_Calculation_Database::DVARP',\n            'argumentCount' => '3'\n        ),\n        'EDATE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::EDATE',\n            'argumentCount' => '2'\n        ),\n        'EFFECT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::EFFECT',\n            'argumentCount' => '2'\n        ),\n        'EOMONTH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::EOMONTH',\n            'argumentCount' => '2'\n        ),\n        'ERF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::ERF',\n            'argumentCount' => '1,2'\n        ),\n        'ERFC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::ERFC',\n            'argumentCount' => '1'\n        ),\n        'ERROR.TYPE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::ERROR_TYPE',\n            'argumentCount' => '1'\n        ),\n        'EVEN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::EVEN',\n            'argumentCount' => '1'\n        ),\n        'EXACT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2'\n        ),\n        'EXP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'exp',\n            'argumentCount' => '1'\n        ),\n        'EXPONDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::EXPONDIST',\n            'argumentCount' => '3'\n        ),\n        'FACT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::FACT',\n            'argumentCount' => '1'\n        ),\n        'FACTDOUBLE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::FACTDOUBLE',\n            'argumentCount' => '1'\n        ),\n        'FALSE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::FALSE',\n            'argumentCount' => '0'\n        ),\n        'FDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '3'\n        ),\n        'FIND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHSENSITIVE',\n            'argumentCount' => '2,3'\n        ),\n        'FINDB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHSENSITIVE',\n            'argumentCount' => '2,3'\n        ),\n        'FINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '3'\n        ),\n        'FISHER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::FISHER',\n            'argumentCount' => '1'\n        ),\n        'FISHERINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::FISHERINV',\n            'argumentCount' => '1'\n        ),\n        'FIXED' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::FIXEDFORMAT',\n            'argumentCount' => '1-3'\n        ),\n        'FLOOR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::FLOOR',\n            'argumentCount' => '2'\n        ),\n        'FORECAST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::FORECAST',\n            'argumentCount' => '3'\n        ),\n        'FREQUENCY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2'\n        ),\n        'FTEST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2'\n        ),\n        'FV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::FV',\n            'argumentCount' => '3-5'\n        ),\n        'FVSCHEDULE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::FVSCHEDULE',\n            'argumentCount' => '2'\n        ),\n        'GAMMADIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMADIST',\n            'argumentCount' => '4'\n        ),\n        'GAMMAINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMAINV',\n            'argumentCount' => '3'\n        ),\n        'GAMMALN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMALN',\n            'argumentCount' => '1'\n        ),\n        'GCD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::GCD',\n            'argumentCount' => '1+'\n        ),\n        'GEOMEAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::GEOMEAN',\n            'argumentCount' => '1+'\n        ),\n        'GESTEP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::GESTEP',\n            'argumentCount' => '1,2'\n        ),\n        'GETPIVOTDATA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2+'\n        ),\n        'GROWTH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::GROWTH',\n            'argumentCount' => '1-4'\n        ),\n        'HARMEAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::HARMEAN',\n            'argumentCount' => '1+'\n        ),\n        'HEX2BIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTOBIN',\n            'argumentCount' => '1,2'\n        ),\n        'HEX2DEC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTODEC',\n            'argumentCount' => '1'\n        ),\n        'HEX2OCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTOOCT',\n            'argumentCount' => '1,2'\n        ),\n        'HLOOKUP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::HLOOKUP',\n            'argumentCount' => '3,4'\n        ),\n        'HOUR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::HOUROFDAY',\n            'argumentCount' => '1'\n        ),\n        'HYPERLINK' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::HYPERLINK',\n            'argumentCount' => '1,2',\n            'passCellReference' => true\n        ),\n        'HYPGEOMDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::HYPGEOMDIST',\n            'argumentCount' => '4'\n        ),\n        'IF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::STATEMENT_IF',\n            'argumentCount' => '1-3'\n        ),\n        'IFERROR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::IFERROR',\n            'argumentCount' => '2'\n        ),\n        'IMABS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMABS',\n            'argumentCount' => '1'\n        ),\n        'IMAGINARY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMAGINARY',\n            'argumentCount' => '1'\n        ),\n        'IMARGUMENT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMARGUMENT',\n            'argumentCount' => '1'\n        ),\n        'IMCONJUGATE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMCONJUGATE',\n            'argumentCount' => '1'\n        ),\n        'IMCOS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMCOS',\n            'argumentCount' => '1'\n        ),\n        'IMDIV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMDIV',\n            'argumentCount' => '2'\n        ),\n        'IMEXP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMEXP',\n            'argumentCount' => '1'\n        ),\n        'IMLN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMLN',\n            'argumentCount' => '1'\n        ),\n        'IMLOG10' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMLOG10',\n            'argumentCount' => '1'\n        ),\n        'IMLOG2' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMLOG2',\n            'argumentCount' => '1'\n        ),\n        'IMPOWER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMPOWER',\n            'argumentCount' => '2'\n        ),\n        'IMPRODUCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMPRODUCT',\n            'argumentCount' => '1+'\n        ),\n        'IMREAL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMREAL',\n            'argumentCount' => '1'\n        ),\n        'IMSIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMSIN',\n            'argumentCount' => '1'\n        ),\n        'IMSQRT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMSQRT',\n            'argumentCount' => '1'\n        ),\n        'IMSUB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMSUB',\n            'argumentCount' => '2'\n        ),\n        'IMSUM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::IMSUM',\n            'argumentCount' => '1+'\n        ),\n        'INDEX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::INDEX',\n            'argumentCount' => '1-4'\n        ),\n        'INDIRECT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::INDIRECT',\n            'argumentCount' => '1,2',\n            'passCellReference' => true\n        ),\n        'INFO' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'INT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::INT',\n            'argumentCount' => '1'\n        ),\n        'INTERCEPT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::INTERCEPT',\n            'argumentCount' => '2'\n        ),\n        'INTRATE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::INTRATE',\n            'argumentCount' => '4,5'\n        ),\n        'IPMT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::IPMT',\n            'argumentCount' => '4-6'\n        ),\n        'IRR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::IRR',\n            'argumentCount' => '1,2'\n        ),\n        'ISBLANK' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_BLANK',\n            'argumentCount' => '1'\n        ),\n        'ISERR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_ERR',\n            'argumentCount' => '1'\n        ),\n        'ISERROR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_ERROR',\n            'argumentCount' => '1'\n        ),\n        'ISEVEN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_EVEN',\n            'argumentCount' => '1'\n        ),\n        'ISLOGICAL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_LOGICAL',\n            'argumentCount' => '1'\n        ),\n        'ISNA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_NA',\n            'argumentCount' => '1'\n        ),\n        'ISNONTEXT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_NONTEXT',\n            'argumentCount' => '1'\n        ),\n        'ISNUMBER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_NUMBER',\n            'argumentCount' => '1'\n        ),\n        'ISODD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_ODD',\n            'argumentCount' => '1'\n        ),\n        'ISPMT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::ISPMT',\n            'argumentCount' => '4'\n        ),\n        'ISREF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'ISTEXT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::IS_TEXT',\n            'argumentCount' => '1'\n        ),\n        'JIS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'KURT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::KURT',\n            'argumentCount' => '1+'\n        ),\n        'LARGE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::LARGE',\n            'argumentCount' => '2'\n        ),\n        'LCM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::LCM',\n            'argumentCount' => '1+'\n        ),\n        'LEFT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::LEFT',\n            'argumentCount' => '1,2'\n        ),\n        'LEFTB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::LEFT',\n            'argumentCount' => '1,2'\n        ),\n        'LEN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::STRINGLENGTH',\n            'argumentCount' => '1'\n        ),\n        'LENB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::STRINGLENGTH',\n            'argumentCount' => '1'\n        ),\n        'LINEST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::LINEST',\n            'argumentCount' => '1-4'\n        ),\n        'LN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'log',\n            'argumentCount' => '1'\n        ),\n        'LOG' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::LOG_BASE',\n            'argumentCount' => '1,2'\n        ),\n        'LOG10' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'log10',\n            'argumentCount' => '1'\n        ),\n        'LOGEST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::LOGEST',\n            'argumentCount' => '1-4'\n        ),\n        'LOGINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::LOGINV',\n            'argumentCount' => '3'\n        ),\n        'LOGNORMDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::LOGNORMDIST',\n            'argumentCount' => '3'\n        ),\n        'LOOKUP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::LOOKUP',\n            'argumentCount' => '2,3'\n        ),\n        'LOWER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::LOWERCASE',\n            'argumentCount' => '1'\n        ),\n        'MATCH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::MATCH',\n            'argumentCount' => '2,3'\n        ),\n        'MAX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MAX',\n            'argumentCount' => '1+'\n        ),\n        'MAXA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MAXA',\n            'argumentCount' => '1+'\n        ),\n        'MAXIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MAXIF',\n            'argumentCount' => '2+'\n        ),\n        'MDETERM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::MDETERM',\n            'argumentCount' => '1'\n        ),\n        'MDURATION' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '5,6'\n        ),\n        'MEDIAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MEDIAN',\n            'argumentCount' => '1+'\n        ),\n        'MEDIANIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2+'\n        ),\n        'MID' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::MID',\n            'argumentCount' => '3'\n        ),\n        'MIDB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::MID',\n            'argumentCount' => '3'\n        ),\n        'MIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MIN',\n            'argumentCount' => '1+'\n        ),\n        'MINA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MINA',\n            'argumentCount' => '1+'\n        ),\n        'MINIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MINIF',\n            'argumentCount' => '2+'\n        ),\n        'MINUTE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::MINUTEOFHOUR',\n            'argumentCount' => '1'\n        ),\n        'MINVERSE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::MINVERSE',\n            'argumentCount' => '1'\n        ),\n        'MIRR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::MIRR',\n            'argumentCount' => '3'\n        ),\n        'MMULT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::MMULT',\n            'argumentCount' => '2'\n        ),\n        'MOD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::MOD',\n            'argumentCount' => '2'\n        ),\n        'MODE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::MODE',\n            'argumentCount' => '1+'\n        ),\n        'MONTH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::MONTHOFYEAR',\n            'argumentCount' => '1'\n        ),\n        'MROUND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::MROUND',\n            'argumentCount' => '2'\n        ),\n        'MULTINOMIAL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::MULTINOMIAL',\n            'argumentCount' => '1+'\n        ),\n        'N' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::N',\n            'argumentCount' => '1'\n        ),\n        'NA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::NA',\n            'argumentCount' => '0'\n        ),\n        'NEGBINOMDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::NEGBINOMDIST',\n            'argumentCount' => '3'\n        ),\n        'NETWORKDAYS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::NETWORKDAYS',\n            'argumentCount' => '2+'\n        ),\n        'NOMINAL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::NOMINAL',\n            'argumentCount' => '2'\n        ),\n        'NORMDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::NORMDIST',\n            'argumentCount' => '4'\n        ),\n        'NORMINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::NORMINV',\n            'argumentCount' => '3'\n        ),\n        'NORMSDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::NORMSDIST',\n            'argumentCount' => '1'\n        ),\n        'NORMSINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::NORMSINV',\n            'argumentCount' => '1'\n        ),\n        'NOT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::NOT',\n            'argumentCount' => '1'\n        ),\n        'NOW' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DATETIMENOW',\n            'argumentCount' => '0'\n        ),\n        'NPER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::NPER',\n            'argumentCount' => '3-5'\n        ),\n        'NPV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::NPV',\n            'argumentCount' => '2+'\n        ),\n        'OCT2BIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTOBIN',\n            'argumentCount' => '1,2'\n        ),\n        'OCT2DEC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTODEC',\n            'argumentCount' => '1'\n        ),\n        'OCT2HEX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING,\n            'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTOHEX',\n            'argumentCount' => '1,2'\n        ),\n        'ODD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::ODD',\n            'argumentCount' => '1'\n        ),\n        'ODDFPRICE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '8,9'\n        ),\n        'ODDFYIELD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '8,9'\n        ),\n        'ODDLPRICE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '7,8'\n        ),\n        'ODDLYIELD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '7,8'\n        ),\n        'OFFSET' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::OFFSET',\n            'argumentCount' => '3-5',\n            'passCellReference' => true,\n            'passByReference' => array(true)\n        ),\n        'OR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::LOGICAL_OR',\n            'argumentCount' => '1+'\n        ),\n        'PEARSON' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::CORREL',\n            'argumentCount' => '2'\n        ),\n        'PERCENTILE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::PERCENTILE',\n            'argumentCount' => '2'\n        ),\n        'PERCENTRANK' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::PERCENTRANK',\n            'argumentCount' => '2,3'\n        ),\n        'PERMUT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::PERMUT',\n            'argumentCount' => '2'\n        ),\n        'PHONETIC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1'\n        ),\n        'PI' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'pi',\n            'argumentCount' => '0'\n        ),\n        'PMT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::PMT',\n            'argumentCount' => '3-5'\n        ),\n        'POISSON' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::POISSON',\n            'argumentCount' => '3'\n        ),\n        'POWER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::POWER',\n            'argumentCount' => '2'\n        ),\n        'PPMT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::PPMT',\n            'argumentCount' => '4-6'\n        ),\n        'PRICE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::PRICE',\n            'argumentCount' => '6,7'\n        ),\n        'PRICEDISC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::PRICEDISC',\n            'argumentCount' => '4,5'\n        ),\n        'PRICEMAT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::PRICEMAT',\n            'argumentCount' => '5,6'\n        ),\n        'PROB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '3,4'\n        ),\n        'PRODUCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::PRODUCT',\n            'argumentCount' => '1+'\n        ),\n        'PROPER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::PROPERCASE',\n            'argumentCount' => '1'\n        ),\n        'PV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::PV',\n            'argumentCount' => '3-5'\n        ),\n        'QUARTILE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::QUARTILE',\n            'argumentCount' => '2'\n        ),\n        'QUOTIENT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::QUOTIENT',\n            'argumentCount' => '2'\n        ),\n        'RADIANS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'deg2rad',\n            'argumentCount' => '1'\n        ),\n        'RAND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::RAND',\n            'argumentCount' => '0'\n        ),\n        'RANDBETWEEN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::RAND',\n            'argumentCount' => '2'\n        ),\n        'RANK' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::RANK',\n            'argumentCount' => '2,3'\n        ),\n        'RATE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::RATE',\n            'argumentCount' => '3-6'\n        ),\n        'RECEIVED' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::RECEIVED',\n            'argumentCount' => '4-5'\n        ),\n        'REPLACE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::REPLACE',\n            'argumentCount' => '4'\n        ),\n        'REPLACEB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::REPLACE',\n            'argumentCount' => '4'\n        ),\n        'REPT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'str_repeat',\n            'argumentCount' => '2'\n        ),\n        'RIGHT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::RIGHT',\n            'argumentCount' => '1,2'\n        ),\n        'RIGHTB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::RIGHT',\n            'argumentCount' => '1,2'\n        ),\n        'ROMAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::ROMAN',\n            'argumentCount' => '1,2'\n        ),\n        'ROUND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'round',\n            'argumentCount' => '2'\n        ),\n        'ROUNDDOWN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::ROUNDDOWN',\n            'argumentCount' => '2'\n        ),\n        'ROUNDUP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::ROUNDUP',\n            'argumentCount' => '2'\n        ),\n        'ROW' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::ROW',\n            'argumentCount' => '-1',\n            'passByReference' => array(true)\n        ),\n        'ROWS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::ROWS',\n            'argumentCount' => '1'\n        ),\n        'RSQ' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::RSQ',\n            'argumentCount' => '2'\n        ),\n        'RTD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '1+'\n        ),\n        'SEARCH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHINSENSITIVE',\n            'argumentCount' => '2,3'\n        ),\n        'SEARCHB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHINSENSITIVE',\n            'argumentCount' => '2,3'\n        ),\n        'SECOND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::SECONDOFMINUTE',\n            'argumentCount' => '1'\n        ),\n        'SERIESSUM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SERIESSUM',\n            'argumentCount' => '4'\n        ),\n        'SIGN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SIGN',\n            'argumentCount' => '1'\n        ),\n        'SIN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'sin',\n            'argumentCount' => '1'\n        ),\n        'SINH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'sinh',\n            'argumentCount' => '1'\n        ),\n        'SKEW' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::SKEW',\n            'argumentCount' => '1+'\n        ),\n        'SLN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::SLN',\n            'argumentCount' => '3'\n        ),\n        'SLOPE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::SLOPE',\n            'argumentCount' => '2'\n        ),\n        'SMALL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::SMALL',\n            'argumentCount' => '2'\n        ),\n        'SQRT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'sqrt',\n            'argumentCount' => '1'\n        ),\n        'SQRTPI' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SQRTPI',\n            'argumentCount' => '1'\n        ),\n        'STANDARDIZE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::STANDARDIZE',\n            'argumentCount' => '3'\n        ),\n        'STDEV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::STDEV',\n            'argumentCount' => '1+'\n        ),\n        'STDEVA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVA',\n            'argumentCount' => '1+'\n        ),\n        'STDEVP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVP',\n            'argumentCount' => '1+'\n        ),\n        'STDEVPA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVPA',\n            'argumentCount' => '1+'\n        ),\n        'STEYX' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::STEYX',\n            'argumentCount' => '2'\n        ),\n        'SUBSTITUTE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::SUBSTITUTE',\n            'argumentCount' => '3,4'\n        ),\n        'SUBTOTAL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUBTOTAL',\n            'argumentCount' => '2+'\n        ),\n        'SUM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUM',\n            'argumentCount' => '1+'\n        ),\n        'SUMIF' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMIF',\n            'argumentCount' => '2,3'\n        ),\n        'SUMIFS' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMIFS',\n            'argumentCount' => '3+'\n        ),\n        'SUMPRODUCT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMPRODUCT',\n            'argumentCount' => '1+'\n        ),\n        'SUMSQ' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMSQ',\n            'argumentCount' => '1+'\n        ),\n        'SUMX2MY2' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMX2MY2',\n            'argumentCount' => '2'\n        ),\n        'SUMX2PY2' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMX2PY2',\n            'argumentCount' => '2'\n        ),\n        'SUMXMY2' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMXMY2',\n            'argumentCount' => '2'\n        ),\n        'SYD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::SYD',\n            'argumentCount' => '4'\n        ),\n        'T' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::RETURNSTRING',\n            'argumentCount' => '1'\n        ),\n        'TAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'tan',\n            'argumentCount' => '1'\n        ),\n        'TANH' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'tanh',\n            'argumentCount' => '1'\n        ),\n        'TBILLEQ' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::TBILLEQ',\n            'argumentCount' => '3'\n        ),\n        'TBILLPRICE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::TBILLPRICE',\n            'argumentCount' => '3'\n        ),\n        'TBILLYIELD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::TBILLYIELD',\n            'argumentCount' => '3'\n        ),\n        'TDIST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::TDIST',\n            'argumentCount' => '3'\n        ),\n        'TEXT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::TEXTFORMAT',\n            'argumentCount' => '2'\n        ),\n        'TIME' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::TIME',\n            'argumentCount' => '3'\n        ),\n        'TIMEVALUE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::TIMEVALUE',\n            'argumentCount' => '1'\n        ),\n        'TINV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::TINV',\n            'argumentCount' => '2'\n        ),\n        'TODAY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DATENOW',\n            'argumentCount' => '0'\n        ),\n        'TRANSPOSE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::TRANSPOSE',\n            'argumentCount' => '1'\n        ),\n        'TREND' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::TREND',\n            'argumentCount' => '1-4'\n        ),\n        'TRIM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::TRIMSPACES',\n            'argumentCount' => '1'\n        ),\n        'TRIMMEAN' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::TRIMMEAN',\n            'argumentCount' => '2'\n        ),\n        'TRUE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL,\n            'functionCall' => 'PHPExcel_Calculation_Logical::TRUE',\n            'argumentCount' => '0'\n        ),\n        'TRUNC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG,\n            'functionCall' => 'PHPExcel_Calculation_MathTrig::TRUNC',\n            'argumentCount' => '1,2'\n        ),\n        'TTEST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '4'\n        ),\n        'TYPE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::TYPE',\n            'argumentCount' => '1'\n        ),\n        'UPPER' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::UPPERCASE',\n            'argumentCount' => '1'\n        ),\n        'USDOLLAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '2'\n        ),\n        'VALUE' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,\n            'functionCall' => 'PHPExcel_Calculation_TextData::VALUE',\n            'argumentCount' => '1'\n        ),\n        'VAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::VARFunc',\n            'argumentCount' => '1+'\n        ),\n        'VARA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::VARA',\n            'argumentCount' => '1+'\n        ),\n        'VARP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::VARP',\n            'argumentCount' => '1+'\n        ),\n        'VARPA' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::VARPA',\n            'argumentCount' => '1+'\n        ),\n        'VDB' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '5-7'\n        ),\n        'VERSION' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION,\n            'functionCall' => 'PHPExcel_Calculation_Functions::VERSION',\n            'argumentCount' => '0'\n        ),\n        'VLOOKUP' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE,\n            'functionCall' => 'PHPExcel_Calculation_LookupRef::VLOOKUP',\n            'argumentCount' => '3,4'\n        ),\n        'WEEKDAY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::DAYOFWEEK',\n            'argumentCount' => '1,2'\n        ),\n        'WEEKNUM' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::WEEKOFYEAR',\n            'argumentCount' => '1,2'\n        ),\n        'WEIBULL' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::WEIBULL',\n            'argumentCount' => '4'\n        ),\n        'WORKDAY' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::WORKDAY',\n            'argumentCount' => '2+'\n        ),\n        'XIRR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::XIRR',\n            'argumentCount' => '2,3'\n        ),\n        'XNPV' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::XNPV',\n            'argumentCount' => '3'\n        ),\n        'YEAR' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::YEAR',\n            'argumentCount' => '1'\n        ),\n        'YEARFRAC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME,\n            'functionCall' => 'PHPExcel_Calculation_DateTime::YEARFRAC',\n            'argumentCount' => '2,3'\n        ),\n        'YIELD' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',\n            'argumentCount' => '6,7'\n        ),\n        'YIELDDISC' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::YIELDDISC',\n            'argumentCount' => '4,5'\n        ),\n        'YIELDMAT' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL,\n            'functionCall' => 'PHPExcel_Calculation_Financial::YIELDMAT',\n            'argumentCount' => '5,6'\n        ),\n        'ZTEST' => array(\n            'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,\n            'functionCall' => 'PHPExcel_Calculation_Statistical::ZTEST',\n            'argumentCount' => '2-3'\n        )\n    );\n\n    //    Internal functions used for special control purposes\n    private static $controlFunctions = array(\n        'MKMATRIX' => array(\n            'argumentCount' => '*',\n            'functionCall' => 'self::mkMatrix'\n        )\n    );\n\n\n    public function __construct(PHPExcel $workbook = null)\n    {\n        $this->delta = 1 * pow(10, 0 - ini_get('precision'));\n\n        $this->workbook = $workbook;\n        $this->cyclicReferenceStack = new PHPExcel_CalcEngine_CyclicReferenceStack();\n        $this->_debugLog = new PHPExcel_CalcEngine_Logger($this->cyclicReferenceStack);\n    }\n\n\n    private static function loadLocales()\n    {\n        $localeFileDirectory = PHPEXCEL_ROOT.'PHPExcel/locale/';\n        foreach (glob($localeFileDirectory.'/*', GLOB_ONLYDIR) as $filename) {\n            $filename = substr($filename, strlen($localeFileDirectory)+1);\n            if ($filename != 'en') {\n                self::$validLocaleLanguages[] = $filename;\n            }\n        }\n    }\n\n    /**\n     * Get an instance of this class\n     *\n     * @access    public\n     * @param   PHPExcel $workbook  Injected workbook for working with a PHPExcel object,\n     *                                    or NULL to create a standalone claculation engine\n     * @return PHPExcel_Calculation\n     */\n    public static function getInstance(PHPExcel $workbook = null)\n    {\n        if ($workbook !== null) {\n            $instance = $workbook->getCalculationEngine();\n            if (isset($instance)) {\n                return $instance;  \n            }\n        }\n\n        if (!isset(self::$instance) || (self::$instance === null)) {\n            self::$instance = new PHPExcel_Calculation();\n        }\n        return self::$instance;\n    }\n\n    /**\n     * Unset an instance of this class\n     *\n     * @access    public\n     */\n    public function __destruct()\n    {\n        $this->workbook = null;\n    }\n\n    /**\n     * Flush the calculation cache for any existing instance of this class\n     *        but only if a PHPExcel_Calculation instance exists\n     *\n     * @access    public\n     * @return null\n     */\n    public function flushInstance()\n    {\n        $this->clearCalculationCache();\n    }\n\n\n    /**\n     * Get the debuglog for this claculation engine instance\n     *\n     * @access    public\n     * @return PHPExcel_CalcEngine_Logger\n     */\n    public function getDebugLog()\n    {\n        return $this->_debugLog;\n    }\n\n    /**\n     * __clone implementation. Cloning should not be allowed in a Singleton!\n     *\n     * @access    public\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    final public function __clone()\n    {\n        throw new PHPExcel_Calculation_Exception('Cloning the calculation engine is not allowed!');\n    }\n\n\n    /**\n     * Return the locale-specific translation of TRUE\n     *\n     * @access    public\n     * @return     string        locale-specific translation of TRUE\n     */\n    public static function getTRUE()\n    {\n        return self::$localeBoolean['TRUE'];\n    }\n\n    /**\n     * Return the locale-specific translation of FALSE\n     *\n     * @access    public\n     * @return     string        locale-specific translation of FALSE\n     */\n    public static function getFALSE()\n    {\n        return self::$localeBoolean['FALSE'];\n    }\n\n    /**\n     * Set the Array Return Type (Array or Value of first element in the array)\n     *\n     * @access    public\n     * @param     string    $returnType            Array return type\n     * @return     boolean                    Success or failure\n     */\n    public static function setArrayReturnType($returnType)\n    {\n        if (($returnType == self::RETURN_ARRAY_AS_VALUE) ||\n            ($returnType == self::RETURN_ARRAY_AS_ERROR) ||\n            ($returnType == self::RETURN_ARRAY_AS_ARRAY)) {\n            self::$returnArrayAsType = $returnType;\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Return the Array Return Type (Array or Value of first element in the array)\n     *\n     * @access    public\n     * @return     string        $returnType            Array return type\n     */\n    public static function getArrayReturnType()\n    {\n        return self::$returnArrayAsType;\n    }\n\n\n    /**\n     * Is calculation caching enabled?\n     *\n     * @access    public\n     * @return boolean\n     */\n    public function getCalculationCacheEnabled()\n    {\n        return $this->calculationCacheEnabled;\n    }\n\n    /**\n     * Enable/disable calculation cache\n     *\n     * @access    public\n     * @param boolean $pValue\n     */\n    public function setCalculationCacheEnabled($pValue = true)\n    {\n        $this->calculationCacheEnabled = $pValue;\n        $this->clearCalculationCache();\n    }\n\n\n    /**\n     * Enable calculation cache\n     */\n    public function enableCalculationCache()\n    {\n        $this->setCalculationCacheEnabled(true);\n    }\n\n\n    /**\n     * Disable calculation cache\n     */\n    public function disableCalculationCache()\n    {\n        $this->setCalculationCacheEnabled(false);\n    }\n\n\n    /**\n     * Clear calculation cache\n     */\n    public function clearCalculationCache()\n    {\n        $this->calculationCache = array();\n    }\n\n    /**\n     * Clear calculation cache for a specified worksheet\n     *\n     * @param string $worksheetName\n     */\n    public function clearCalculationCacheForWorksheet($worksheetName)\n    {\n        if (isset($this->calculationCache[$worksheetName])) {\n            unset($this->calculationCache[$worksheetName]);\n        }\n    }\n\n    /**\n     * Rename calculation cache for a specified worksheet\n     *\n     * @param string $fromWorksheetName\n     * @param string $toWorksheetName\n     */\n    public function renameCalculationCacheForWorksheet($fromWorksheetName, $toWorksheetName)\n    {\n        if (isset($this->calculationCache[$fromWorksheetName])) {\n            $this->calculationCache[$toWorksheetName] = &$this->calculationCache[$fromWorksheetName];\n            unset($this->calculationCache[$fromWorksheetName]);\n        }\n    }\n\n\n    /**\n     * Get the currently defined locale code\n     *\n     * @return string\n     */\n    public function getLocale()\n    {\n        return self::$localeLanguage;\n    }\n\n\n    /**\n     * Set the locale code\n     *\n     * @param string $locale  The locale to use for formula translation\n     * @return boolean\n     */\n    public function setLocale($locale = 'en_us')\n    {\n        //    Identify our locale and language\n        $language = $locale = strtolower($locale);\n        if (strpos($locale, '_') !== false) {\n            list($language) = explode('_', $locale);\n        }\n\n        if (count(self::$validLocaleLanguages) == 1) {\n            self::loadLocales();\n        }\n        //    Test whether we have any language data for this language (any locale)\n        if (in_array($language, self::$validLocaleLanguages)) {\n            //    initialise language/locale settings\n            self::$localeFunctions = array();\n            self::$localeArgumentSeparator = ',';\n            self::$localeBoolean = array('TRUE' => 'TRUE', 'FALSE' => 'FALSE', 'NULL' => 'NULL');\n            //    Default is English, if user isn't requesting english, then read the necessary data from the locale files\n            if ($locale != 'en_us') {\n                //    Search for a file with a list of function names for locale\n                $functionNamesFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $locale).DIRECTORY_SEPARATOR.'functions';\n                if (!file_exists($functionNamesFile)) {\n                    //    If there isn't a locale specific function file, look for a language specific function file\n                    $functionNamesFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'functions';\n                    if (!file_exists($functionNamesFile)) {\n                        return false;\n                    }\n                }\n                //    Retrieve the list of locale or language specific function names\n                $localeFunctions = file($functionNamesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\n                foreach ($localeFunctions as $localeFunction) {\n                    list($localeFunction) = explode('##', $localeFunction);    //    Strip out comments\n                    if (strpos($localeFunction, '=') !== false) {\n                        list($fName, $lfName) = explode('=', $localeFunction);\n                        $fName = trim($fName);\n                        $lfName = trim($lfName);\n                        if ((isset(self::$PHPExcelFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) {\n                            self::$localeFunctions[$fName] = $lfName;\n                        }\n                    }\n                }\n                //    Default the TRUE and FALSE constants to the locale names of the TRUE() and FALSE() functions\n                if (isset(self::$localeFunctions['TRUE'])) {\n                    self::$localeBoolean['TRUE'] = self::$localeFunctions['TRUE'];\n                }\n                if (isset(self::$localeFunctions['FALSE'])) {\n                    self::$localeBoolean['FALSE'] = self::$localeFunctions['FALSE'];\n                }\n\n                $configFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $locale).DIRECTORY_SEPARATOR.'config';\n                if (!file_exists($configFile)) {\n                    $configFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'config';\n                }\n                if (file_exists($configFile)) {\n                    $localeSettings = file($configFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\n                    foreach ($localeSettings as $localeSetting) {\n                        list($localeSetting) = explode('##', $localeSetting);    //    Strip out comments\n                        if (strpos($localeSetting, '=') !== false) {\n                            list($settingName, $settingValue) = explode('=', $localeSetting);\n                            $settingName = strtoupper(trim($settingName));\n                            switch ($settingName) {\n                                case 'ARGUMENTSEPARATOR':\n                                    self::$localeArgumentSeparator = trim($settingValue);\n                                    break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            self::$functionReplaceFromExcel = self::$functionReplaceToExcel =\n            self::$functionReplaceFromLocale = self::$functionReplaceToLocale = null;\n            self::$localeLanguage = $locale;\n            return true;\n        }\n        return false;\n    }\n\n\n\n    public static function translateSeparator($fromSeparator, $toSeparator, $formula, &$inBraces)\n    {\n        $strlen = mb_strlen($formula);\n        for ($i = 0; $i < $strlen; ++$i) {\n            $chr = mb_substr($formula, $i, 1);\n            switch ($chr) {\n                case '{':\n                    $inBraces = true;\n                    break;\n                case '}':\n                    $inBraces = false;\n                    break;\n                case $fromSeparator:\n                    if (!$inBraces) {\n                        $formula = mb_substr($formula, 0, $i).$toSeparator.mb_substr($formula, $i+1);\n                    }\n            }\n        }\n        return $formula;\n    }\n\n    private static function translateFormula($from, $to, $formula, $fromSeparator, $toSeparator)\n    {\n        //    Convert any Excel function names to the required language\n        if (self::$localeLanguage !== 'en_us') {\n            $inBraces = false;\n            //    If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators\n            if (strpos($formula, '\"') !== false) {\n                //    So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded\n                //        the formula\n                $temp = explode('\"', $formula);\n                $i = false;\n                foreach ($temp as &$value) {\n                    //    Only count/replace in alternating array entries\n                    if ($i = !$i) {\n                        $value = preg_replace($from, $to, $value);\n                        $value = self::translateSeparator($fromSeparator, $toSeparator, $value, $inBraces);\n                    }\n                }\n                unset($value);\n                //    Then rebuild the formula string\n                $formula = implode('\"', $temp);\n            } else {\n                //    If there's no quoted strings, then we do a simple count/replace\n                $formula = preg_replace($from, $to, $formula);\n                $formula = self::translateSeparator($fromSeparator, $toSeparator, $formula, $inBraces);\n            }\n        }\n\n        return $formula;\n    }\n\n    private static $functionReplaceFromExcel = null;\n    private static $functionReplaceToLocale  = null;\n\n    public function _translateFormulaToLocale($formula)\n    {\n        if (self::$functionReplaceFromExcel === null) {\n            self::$functionReplaceFromExcel = array();\n            foreach (array_keys(self::$localeFunctions) as $excelFunctionName) {\n                self::$functionReplaceFromExcel[] = '/(@?[^\\w\\.])'.preg_quote($excelFunctionName).'([\\s]*\\()/Ui';\n            }\n            foreach (array_keys(self::$localeBoolean) as $excelBoolean) {\n                self::$functionReplaceFromExcel[] = '/(@?[^\\w\\.])'.preg_quote($excelBoolean).'([^\\w\\.])/Ui';\n            }\n\n        }\n\n        if (self::$functionReplaceToLocale === null) {\n            self::$functionReplaceToLocale = array();\n            foreach (array_values(self::$localeFunctions) as $localeFunctionName) {\n                self::$functionReplaceToLocale[] = '$1'.trim($localeFunctionName).'$2';\n            }\n            foreach (array_values(self::$localeBoolean) as $localeBoolean) {\n                self::$functionReplaceToLocale[] = '$1'.trim($localeBoolean).'$2';\n            }\n        }\n\n        return self::translateFormula(self::$functionReplaceFromExcel, self::$functionReplaceToLocale, $formula, ',', self::$localeArgumentSeparator);\n    }\n\n\n    private static $functionReplaceFromLocale = null;\n    private static $functionReplaceToExcel    = null;\n\n    public function _translateFormulaToEnglish($formula)\n    {\n        if (self::$functionReplaceFromLocale === null) {\n            self::$functionReplaceFromLocale = array();\n            foreach (array_values(self::$localeFunctions) as $localeFunctionName) {\n                self::$functionReplaceFromLocale[] = '/(@?[^\\w\\.])'.preg_quote($localeFunctionName).'([\\s]*\\()/Ui';\n            }\n            foreach (array_values(self::$localeBoolean) as $excelBoolean) {\n                self::$functionReplaceFromLocale[] = '/(@?[^\\w\\.])'.preg_quote($excelBoolean).'([^\\w\\.])/Ui';\n            }\n        }\n\n        if (self::$functionReplaceToExcel === null) {\n            self::$functionReplaceToExcel = array();\n            foreach (array_keys(self::$localeFunctions) as $excelFunctionName) {\n                self::$functionReplaceToExcel[] = '$1'.trim($excelFunctionName).'$2';\n            }\n            foreach (array_keys(self::$localeBoolean) as $excelBoolean) {\n                self::$functionReplaceToExcel[] = '$1'.trim($excelBoolean).'$2';\n            }\n        }\n\n        return self::translateFormula(self::$functionReplaceFromLocale, self::$functionReplaceToExcel, $formula, self::$localeArgumentSeparator, ',');\n    }\n\n\n    public static function localeFunc($function)\n    {\n        if (self::$localeLanguage !== 'en_us') {\n            $functionName = trim($function, '(');\n            if (isset(self::$localeFunctions[$functionName])) {\n                $brace = ($functionName != $function);\n                $function = self::$localeFunctions[$functionName];\n                if ($brace) {\n                    $function .= '(';\n                }\n            }\n        }\n        return $function;\n    }\n\n\n\n\n    /**\n     * Wrap string values in quotes\n     *\n     * @param mixed $value\n     * @return mixed\n     */\n    public static function wrapResult($value)\n    {\n        if (is_string($value)) {\n            //    Error values cannot be \"wrapped\"\n            if (preg_match('/^'.self::CALCULATION_REGEXP_ERROR.'$/i', $value, $match)) {\n                //    Return Excel errors \"as is\"\n                return $value;\n            }\n            //    Return strings wrapped in quotes\n            return '\"'.$value.'\"';\n        //    Convert numeric errors to NaN error\n        } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n\n        return $value;\n    }\n\n\n    /**\n     * Remove quotes used as a wrapper to identify string values\n     *\n     * @param mixed $value\n     * @return mixed\n     */\n    public static function unwrapResult($value)\n    {\n        if (is_string($value)) {\n            if ((isset($value{0})) && ($value{0} == '\"') && (substr($value, -1) == '\"')) {\n                return substr($value, 1, -1);\n            }\n        //    Convert numeric errors to NaN error\n        } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return $value;\n    }\n\n\n\n\n    /**\n     * Calculate cell value (using formula from a cell ID)\n     * Retained for backward compatibility\n     *\n     * @access    public\n     * @param    PHPExcel_Cell    $pCell    Cell to calculate\n     * @return    mixed\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function calculate(PHPExcel_Cell $pCell = null)\n    {\n        try {\n            return $this->calculateCellValue($pCell);\n        } catch (PHPExcel_Exception $e) {\n            throw new PHPExcel_Calculation_Exception($e->getMessage());\n        }\n    }\n\n\n    /**\n     * Calculate the value of a cell formula\n     *\n     * @access    public\n     * @param    PHPExcel_Cell    $pCell        Cell to calculate\n     * @param    Boolean            $resetLog    Flag indicating whether the debug log should be reset or not\n     * @return    mixed\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function calculateCellValue(PHPExcel_Cell $pCell = null, $resetLog = true)\n    {\n        if ($pCell === null) {\n            return null;\n        }\n\n        $returnArrayAsType = self::$returnArrayAsType;\n        if ($resetLog) {\n            //    Initialise the logging settings if requested\n            $this->formulaError = null;\n            $this->_debugLog->clearLog();\n            $this->cyclicReferenceStack->clear();\n            $this->cyclicFormulaCounter = 1;\n\n            self::$returnArrayAsType = self::RETURN_ARRAY_AS_ARRAY;\n        }\n\n        //    Execute the calculation for the cell formula\n        $this->cellStack[] = array(\n            'sheet' => $pCell->getWorksheet()->getTitle(),\n            'cell' => $pCell->getCoordinate(),\n        );\n        try {\n            $result = self::unwrapResult($this->_calculateFormulaValue($pCell->getValue(), $pCell->getCoordinate(), $pCell));\n            $cellAddress = array_pop($this->cellStack);\n            $this->workbook->getSheetByName($cellAddress['sheet'])->getCell($cellAddress['cell']);\n        } catch (PHPExcel_Exception $e) {\n            $cellAddress = array_pop($this->cellStack);\n            $this->workbook->getSheetByName($cellAddress['sheet'])->getCell($cellAddress['cell']);\n            throw new PHPExcel_Calculation_Exception($e->getMessage());\n        }\n\n        if ((is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) {\n            self::$returnArrayAsType = $returnArrayAsType;\n            $testResult = PHPExcel_Calculation_Functions::flattenArray($result);\n            if (self::$returnArrayAsType == self::RETURN_ARRAY_AS_ERROR) {\n                return PHPExcel_Calculation_Functions::VALUE();\n            }\n            //    If there's only a single cell in the array, then we allow it\n            if (count($testResult) != 1) {\n                //    If keys are numeric, then it's a matrix result rather than a cell range result, so we permit it\n                $r = array_keys($result);\n                $r = array_shift($r);\n                if (!is_numeric($r)) {\n                    return PHPExcel_Calculation_Functions::VALUE();\n                }\n                if (is_array($result[$r])) {\n                    $c = array_keys($result[$r]);\n                    $c = array_shift($c);\n                    if (!is_numeric($c)) {\n                        return PHPExcel_Calculation_Functions::VALUE();\n                    }\n                }\n            }\n            $result = array_shift($testResult);\n        }\n        self::$returnArrayAsType = $returnArrayAsType;\n\n\n        if ($result === null) {\n            return 0;\n        } elseif ((is_float($result)) && ((is_nan($result)) || (is_infinite($result)))) {\n            return PHPExcel_Calculation_Functions::NaN();\n        }\n        return $result;\n    }\n\n\n    /**\n     * Validate and parse a formula string\n     *\n     * @param    string        $formula        Formula to parse\n     * @return    array\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function parseFormula($formula)\n    {\n        //    Basic validation that this is indeed a formula\n        //    We return an empty array if not\n        $formula = trim($formula);\n        if ((!isset($formula{0})) || ($formula{0} != '=')) {\n            return array();\n        }\n        $formula = ltrim(substr($formula, 1));\n        if (!isset($formula{0})) {\n            return array();\n        }\n\n        //    Parse the formula and return the token stack\n        return $this->_parseFormula($formula);\n    }\n\n\n    /**\n     * Calculate the value of a formula\n     *\n     * @param    string            $formula    Formula to parse\n     * @param    string            $cellID        Address of the cell to calculate\n     * @param    PHPExcel_Cell    $pCell        Cell to calculate\n     * @return    mixed\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function calculateFormula($formula, $cellID = null, PHPExcel_Cell $pCell = null)\n    {\n        //    Initialise the logging settings\n        $this->formulaError = null;\n        $this->_debugLog->clearLog();\n        $this->cyclicReferenceStack->clear();\n\n        if ($this->workbook !== null && $cellID === null && $pCell === null) {\n            $cellID = 'A1';\n            $pCell = $this->workbook->getActiveSheet()->getCell($cellID);\n        } else {\n            //    Disable calculation cacheing because it only applies to cell calculations, not straight formulae\n            //    But don't actually flush any cache\n            $resetCache = $this->getCalculationCacheEnabled();\n            $this->calculationCacheEnabled = false;\n        }\n\n        //    Execute the calculation\n        try {\n            $result = self::unwrapResult($this->_calculateFormulaValue($formula, $cellID, $pCell));\n        } catch (PHPExcel_Exception $e) {\n            throw new PHPExcel_Calculation_Exception($e->getMessage());\n        }\n\n        if ($this->workbook === null) {\n            //    Reset calculation cacheing to its previous state\n            $this->calculationCacheEnabled = $resetCache;\n        }\n\n        return $result;\n    }\n\n\n    public function getValueFromCache($cellReference, &$cellValue)\n    {\n        // Is calculation cacheing enabled?\n        // Is the value present in calculation cache?\n        $this->_debugLog->writeDebugLog('Testing cache value for cell ', $cellReference);\n        if (($this->calculationCacheEnabled) && (isset($this->calculationCache[$cellReference]))) {\n            $this->_debugLog->writeDebugLog('Retrieving value for cell ', $cellReference, ' from cache');\n            // Return the cached result\n            $cellValue = $this->calculationCache[$cellReference];\n            return true;\n        }\n        return false;\n    }\n\n    public function saveValueToCache($cellReference, $cellValue)\n    {\n        if ($this->calculationCacheEnabled) {\n            $this->calculationCache[$cellReference] = $cellValue;\n        }\n    }\n\n    /**\n     * Parse a cell formula and calculate its value\n     *\n     * @param    string            $formula    The formula to parse and calculate\n     * @param    string            $cellID        The ID (e.g. A3) of the cell that we are calculating\n     * @param    PHPExcel_Cell    $pCell        Cell to calculate\n     * @return    mixed\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function _calculateFormulaValue($formula, $cellID = null, PHPExcel_Cell $pCell = null)\n    {\n        $cellValue = null;\n\n        //    Basic validation that this is indeed a formula\n        //    We simply return the cell value if not\n        $formula = trim($formula);\n        if ($formula{0} != '=') {\n            return self::wrapResult($formula);\n        }\n        $formula = ltrim(substr($formula, 1));\n        if (!isset($formula{0})) {\n            return self::wrapResult($formula);\n        }\n\n        $pCellParent = ($pCell !== null) ? $pCell->getWorksheet() : null;\n        $wsTitle = ($pCellParent !== null) ? $pCellParent->getTitle() : \"\\x00Wrk\";\n        $wsCellReference = $wsTitle . '!' . $cellID;\n\n        if (($cellID !== null) && ($this->getValueFromCache($wsCellReference, $cellValue))) {\n            return $cellValue;\n        }\n\n        if (($wsTitle{0} !== \"\\x00\") && ($this->cyclicReferenceStack->onStack($wsCellReference))) {\n            if ($this->cyclicFormulaCount <= 0) {\n                $this->cyclicFormulaCell = '';\n                return $this->raiseFormulaError('Cyclic Reference in Formula');\n            } elseif ($this->cyclicFormulaCell === $wsCellReference) {\n                ++$this->cyclicFormulaCounter;\n                if ($this->cyclicFormulaCounter >= $this->cyclicFormulaCount) {\n                    $this->cyclicFormulaCell = '';\n                    return $cellValue;\n                }\n            } elseif ($this->cyclicFormulaCell == '') {\n                if ($this->cyclicFormulaCounter >= $this->cyclicFormulaCount) {\n                    return $cellValue;\n                }\n                $this->cyclicFormulaCell = $wsCellReference;\n            }\n        }\n\n        //    Parse the formula onto the token stack and calculate the value\n        $this->cyclicReferenceStack->push($wsCellReference);\n        $cellValue = $this->processTokenStack($this->_parseFormula($formula, $pCell), $cellID, $pCell);\n        $this->cyclicReferenceStack->pop();\n\n        // Save to calculation cache\n        if ($cellID !== null) {\n            $this->saveValueToCache($wsCellReference, $cellValue);\n        }\n\n        //    Return the calculated value\n        return $cellValue;\n    }\n\n\n    /**\n     * Ensure that paired matrix operands are both matrices and of the same size\n     *\n     * @param    mixed        &$operand1    First matrix operand\n     * @param    mixed        &$operand2    Second matrix operand\n     * @param    integer        $resize        Flag indicating whether the matrices should be resized to match\n     *                                        and (if so), whether the smaller dimension should grow or the\n     *                                        larger should shrink.\n     *                                            0 = no resize\n     *                                            1 = shrink to fit\n     *                                            2 = extend to fit\n     */\n    private static function checkMatrixOperands(&$operand1, &$operand2, $resize = 1)\n    {\n        //    Examine each of the two operands, and turn them into an array if they aren't one already\n        //    Note that this function should only be called if one or both of the operand is already an array\n        if (!is_array($operand1)) {\n            list($matrixRows, $matrixColumns) = self::getMatrixDimensions($operand2);\n            $operand1 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand1));\n            $resize = 0;\n        } elseif (!is_array($operand2)) {\n            list($matrixRows, $matrixColumns) = self::getMatrixDimensions($operand1);\n            $operand2 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand2));\n            $resize = 0;\n        }\n\n        list($matrix1Rows, $matrix1Columns) = self::getMatrixDimensions($operand1);\n        list($matrix2Rows, $matrix2Columns) = self::getMatrixDimensions($operand2);\n        if (($matrix1Rows == $matrix2Columns) && ($matrix2Rows == $matrix1Columns)) {\n            $resize = 1;\n        }\n\n        if ($resize == 2) {\n            //    Given two matrices of (potentially) unequal size, convert the smaller in each dimension to match the larger\n            self::resizeMatricesExtend($operand1, $operand2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns);\n        } elseif ($resize == 1) {\n            //    Given two matrices of (potentially) unequal size, convert the larger in each dimension to match the smaller\n            self::resizeMatricesShrink($operand1, $operand2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns);\n        }\n        return array( $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns);\n    }\n\n\n    /**\n     * Read the dimensions of a matrix, and re-index it with straight numeric keys starting from row 0, column 0\n     *\n     * @param    mixed        &$matrix        matrix operand\n     * @return    array        An array comprising the number of rows, and number of columns\n     */\n    private static function getMatrixDimensions(&$matrix)\n    {\n        $matrixRows = count($matrix);\n        $matrixColumns = 0;\n        foreach ($matrix as $rowKey => $rowValue) {\n            $matrixColumns = max(count($rowValue), $matrixColumns);\n            if (!is_array($rowValue)) {\n                $matrix[$rowKey] = array($rowValue);\n            } else {\n                $matrix[$rowKey] = array_values($rowValue);\n            }\n        }\n        $matrix = array_values($matrix);\n        return array($matrixRows, $matrixColumns);\n    }\n\n\n    /**\n     * Ensure that paired matrix operands are both matrices of the same size\n     *\n     * @param    mixed        &$matrix1        First matrix operand\n     * @param    mixed        &$matrix2        Second matrix operand\n     * @param    integer        $matrix1Rows    Row size of first matrix operand\n     * @param    integer        $matrix1Columns    Column size of first matrix operand\n     * @param    integer        $matrix2Rows    Row size of second matrix operand\n     * @param    integer        $matrix2Columns    Column size of second matrix operand\n     */\n    private static function resizeMatricesShrink(&$matrix1, &$matrix2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns)\n    {\n        if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) {\n            if ($matrix2Rows < $matrix1Rows) {\n                for ($i = $matrix2Rows; $i < $matrix1Rows; ++$i) {\n                    unset($matrix1[$i]);\n                }\n            }\n            if ($matrix2Columns < $matrix1Columns) {\n                for ($i = 0; $i < $matrix1Rows; ++$i) {\n                    for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) {\n                        unset($matrix1[$i][$j]);\n                    }\n                }\n            }\n        }\n\n        if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) {\n            if ($matrix1Rows < $matrix2Rows) {\n                for ($i = $matrix1Rows; $i < $matrix2Rows; ++$i) {\n                    unset($matrix2[$i]);\n                }\n            }\n            if ($matrix1Columns < $matrix2Columns) {\n                for ($i = 0; $i < $matrix2Rows; ++$i) {\n                    for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) {\n                        unset($matrix2[$i][$j]);\n                    }\n                }\n            }\n        }\n    }\n\n\n    /**\n     * Ensure that paired matrix operands are both matrices of the same size\n     *\n     * @param    mixed        &$matrix1    First matrix operand\n     * @param    mixed        &$matrix2    Second matrix operand\n     * @param    integer        $matrix1Rows    Row size of first matrix operand\n     * @param    integer        $matrix1Columns    Column size of first matrix operand\n     * @param    integer        $matrix2Rows    Row size of second matrix operand\n     * @param    integer        $matrix2Columns    Column size of second matrix operand\n     */\n    private static function resizeMatricesExtend(&$matrix1, &$matrix2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns)\n    {\n        if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) {\n            if ($matrix2Columns < $matrix1Columns) {\n                for ($i = 0; $i < $matrix2Rows; ++$i) {\n                    $x = $matrix2[$i][$matrix2Columns-1];\n                    for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) {\n                        $matrix2[$i][$j] = $x;\n                    }\n                }\n            }\n            if ($matrix2Rows < $matrix1Rows) {\n                $x = $matrix2[$matrix2Rows-1];\n                for ($i = 0; $i < $matrix1Rows; ++$i) {\n                    $matrix2[$i] = $x;\n                }\n            }\n        }\n\n        if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) {\n            if ($matrix1Columns < $matrix2Columns) {\n                for ($i = 0; $i < $matrix1Rows; ++$i) {\n                    $x = $matrix1[$i][$matrix1Columns-1];\n                    for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) {\n                        $matrix1[$i][$j] = $x;\n                    }\n                }\n            }\n            if ($matrix1Rows < $matrix2Rows) {\n                $x = $matrix1[$matrix1Rows-1];\n                for ($i = 0; $i < $matrix2Rows; ++$i) {\n                    $matrix1[$i] = $x;\n                }\n            }\n        }\n    }\n\n\n    /**\n     * Format details of an operand for display in the log (based on operand type)\n     *\n     * @param    mixed        $value    First matrix operand\n     * @return    mixed\n     */\n    private function showValue($value)\n    {\n        if ($this->_debugLog->getWriteDebugLog()) {\n            $testArray = PHPExcel_Calculation_Functions::flattenArray($value);\n            if (count($testArray) == 1) {\n                $value = array_pop($testArray);\n            }\n\n            if (is_array($value)) {\n                $returnMatrix = array();\n                $pad = $rpad = ', ';\n                foreach ($value as $row) {\n                    if (is_array($row)) {\n                        $returnMatrix[] = implode($pad, array_map(array($this, 'showValue'), $row));\n                        $rpad = '; ';\n                    } else {\n                        $returnMatrix[] = $this->showValue($row);\n                    }\n                }\n                return '{ '.implode($rpad, $returnMatrix).' }';\n            } elseif (is_string($value) && (trim($value, '\"') == $value)) {\n                return '\"'.$value.'\"';\n            } elseif (is_bool($value)) {\n                return ($value) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE'];\n            }\n        }\n        return PHPExcel_Calculation_Functions::flattenSingleValue($value);\n    }\n\n\n    /**\n     * Format type and details of an operand for display in the log (based on operand type)\n     *\n     * @param    mixed        $value    First matrix operand\n     * @return    mixed\n     */\n    private function showTypeDetails($value)\n    {\n        if ($this->_debugLog->getWriteDebugLog()) {\n            $testArray = PHPExcel_Calculation_Functions::flattenArray($value);\n            if (count($testArray) == 1) {\n                $value = array_pop($testArray);\n            }\n\n            if ($value === null) {\n                return 'a NULL value';\n            } elseif (is_float($value)) {\n                $typeString = 'a floating point number';\n            } elseif (is_int($value)) {\n                $typeString = 'an integer number';\n            } elseif (is_bool($value)) {\n                $typeString = 'a boolean';\n            } elseif (is_array($value)) {\n                $typeString = 'a matrix';\n            } else {\n                if ($value == '') {\n                    return 'an empty string';\n                } elseif ($value{0} == '#') {\n                    return 'a '.$value.' error';\n                } else {\n                    $typeString = 'a string';\n                }\n            }\n            return $typeString.' with a value of '.$this->showValue($value);\n        }\n    }\n\n\n    private function convertMatrixReferences($formula)\n    {\n        static $matrixReplaceFrom = array('{', ';', '}');\n        static $matrixReplaceTo = array('MKMATRIX(MKMATRIX(', '),MKMATRIX(', '))');\n\n        //    Convert any Excel matrix references to the MKMATRIX() function\n        if (strpos($formula, '{') !== false) {\n            //    If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators\n            if (strpos($formula, '\"') !== false) {\n                //    So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded\n                //        the formula\n                $temp = explode('\"', $formula);\n                //    Open and Closed counts used for trapping mismatched braces in the formula\n                $openCount = $closeCount = 0;\n                $i = false;\n                foreach ($temp as &$value) {\n                    //    Only count/replace in alternating array entries\n                    if ($i = !$i) {\n                        $openCount += substr_count($value, '{');\n                        $closeCount += substr_count($value, '}');\n                        $value = str_replace($matrixReplaceFrom, $matrixReplaceTo, $value);\n                    }\n                }\n                unset($value);\n                //    Then rebuild the formula string\n                $formula = implode('\"', $temp);\n            } else {\n                //    If there's no quoted strings, then we do a simple count/replace\n                $openCount = substr_count($formula, '{');\n                $closeCount = substr_count($formula, '}');\n                $formula = str_replace($matrixReplaceFrom, $matrixReplaceTo, $formula);\n            }\n            //    Trap for mismatched braces and trigger an appropriate error\n            if ($openCount < $closeCount) {\n                if ($openCount > 0) {\n                    return $this->raiseFormulaError(\"Formula Error: Mismatched matrix braces '}'\");\n                } else {\n                    return $this->raiseFormulaError(\"Formula Error: Unexpected '}' encountered\");\n                }\n            } elseif ($openCount > $closeCount) {\n                if ($closeCount > 0) {\n                    return $this->raiseFormulaError(\"Formula Error: Mismatched matrix braces '{'\");\n                } else {\n                    return $this->raiseFormulaError(\"Formula Error: Unexpected '{' encountered\");\n                }\n            }\n        }\n\n        return $formula;\n    }\n\n\n    private static function mkMatrix()\n    {\n        return func_get_args();\n    }\n\n\n    //    Binary Operators\n    //    These operators always work on two values\n    //    Array key is the operator, the value indicates whether this is a left or right associative operator\n    private static $operatorAssociativity    = array(\n        '^' => 0,                                                            //    Exponentiation\n        '*' => 0, '/' => 0,                                                 //    Multiplication and Division\n        '+' => 0, '-' => 0,                                                    //    Addition and Subtraction\n        '&' => 0,                                                            //    Concatenation\n        '|' => 0, ':' => 0,                                                    //    Intersect and Range\n        '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0        //    Comparison\n    );\n\n    //    Comparison (Boolean) Operators\n    //    These operators work on two values, but always return a boolean result\n    private static $comparisonOperators    = array('>' => true, '<' => true, '=' => true, '>=' => true, '<=' => true, '<>' => true);\n\n    //    Operator Precedence\n    //    This list includes all valid operators, whether binary (including boolean) or unary (such as %)\n    //    Array key is the operator, the value is its precedence\n    private static $operatorPrecedence    = array(\n        ':' => 8,                                                                //    Range\n        '|' => 7,                                                                //    Intersect\n        '~' => 6,                                                                //    Negation\n        '%' => 5,                                                                //    Percentage\n        '^' => 4,                                                                //    Exponentiation\n        '*' => 3, '/' => 3,                                                     //    Multiplication and Division\n        '+' => 2, '-' => 2,                                                        //    Addition and Subtraction\n        '&' => 1,                                                                //    Concatenation\n        '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0            //    Comparison\n    );\n\n    // Convert infix to postfix notation\n    private function _parseFormula($formula, PHPExcel_Cell $pCell = null)\n    {\n        if (($formula = $this->convertMatrixReferences(trim($formula))) === false) {\n            return false;\n        }\n\n        //    If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet),\n        //        so we store the parent worksheet so that we can re-attach it when necessary\n        $pCellParent = ($pCell !== null) ? $pCell->getWorksheet() : null;\n\n        $regexpMatchString = '/^('.self::CALCULATION_REGEXP_FUNCTION.\n                               '|'.self::CALCULATION_REGEXP_CELLREF.\n                               '|'.self::CALCULATION_REGEXP_NUMBER.\n                               '|'.self::CALCULATION_REGEXP_STRING.\n                               '|'.self::CALCULATION_REGEXP_OPENBRACE.\n                               '|'.self::CALCULATION_REGEXP_NAMEDRANGE.\n                               '|'.self::CALCULATION_REGEXP_ERROR.\n                             ')/si';\n\n        //    Start with initialisation\n        $index = 0;\n        $stack = new PHPExcel_Calculation_Token_Stack;\n        $output = array();\n        $expectingOperator = false;                    //    We use this test in syntax-checking the expression to determine when a\n                                                    //        - is a negation or + is a positive operator rather than an operation\n        $expectingOperand = false;                    //    We use this test in syntax-checking the expression to determine whether an operand\n                                                    //        should be null in a function call\n        //    The guts of the lexical parser\n        //    Loop through the formula extracting each operator and operand in turn\n        while (true) {\n//echo 'Assessing Expression '.substr($formula, $index), PHP_EOL;\n            $opCharacter = $formula{$index};    //    Get the first character of the value at the current index position\n//echo 'Initial character of expression block is '.$opCharacter, PHP_EOL;\n            if ((isset(self::$comparisonOperators[$opCharacter])) && (strlen($formula) > $index) && (isset(self::$comparisonOperators[$formula{$index+1}]))) {\n                $opCharacter .= $formula{++$index};\n//echo 'Initial character of expression block is comparison operator '.$opCharacter.PHP_EOL;\n            }\n\n            //    Find out if we're currently at the beginning of a number, variable, cell reference, function, parenthesis or operand\n            $isOperandOrFunction = preg_match($regexpMatchString, substr($formula, $index), $match);\n//echo '$isOperandOrFunction is '.(($isOperandOrFunction) ? 'True' : 'False').PHP_EOL;\n//var_dump($match);\n\n            if ($opCharacter == '-' && !$expectingOperator) {                //    Is it a negation instead of a minus?\n//echo 'Element is a Negation operator', PHP_EOL;\n                $stack->push('Unary Operator', '~');                            //    Put a negation on the stack\n                ++$index;                                                    //        and drop the negation symbol\n            } elseif ($opCharacter == '%' && $expectingOperator) {\n//echo 'Element is a Percentage operator', PHP_EOL;\n                $stack->push('Unary Operator', '%');                            //    Put a percentage on the stack\n                ++$index;\n            } elseif ($opCharacter == '+' && !$expectingOperator) {            //    Positive (unary plus rather than binary operator plus) can be discarded?\n//echo 'Element is a Positive number, not Plus operator', PHP_EOL;\n                ++$index;                                                    //    Drop the redundant plus symbol\n            } elseif ((($opCharacter == '~') || ($opCharacter == '|')) && (!$isOperandOrFunction)) {    //    We have to explicitly deny a tilde or pipe, because they are legal\n                return $this->raiseFormulaError(\"Formula Error: Illegal character '~'\");                //        on the stack but not in the input expression\n\n            } elseif ((isset(self::$operators[$opCharacter]) or $isOperandOrFunction) && $expectingOperator) {    //    Are we putting an operator on the stack?\n//echo 'Element with value '.$opCharacter.' is an Operator', PHP_EOL;\n                while ($stack->count() > 0 &&\n                    ($o2 = $stack->last()) &&\n                    isset(self::$operators[$o2['value']]) &&\n                    @(self::$operatorAssociativity[$opCharacter] ? self::$operatorPrecedence[$opCharacter] < self::$operatorPrecedence[$o2['value']] : self::$operatorPrecedence[$opCharacter] <= self::$operatorPrecedence[$o2['value']])) {\n                    $output[] = $stack->pop();                                //    Swap operands and higher precedence operators from the stack to the output\n                }\n                $stack->push('Binary Operator', $opCharacter);    //    Finally put our current operator onto the stack\n                ++$index;\n                $expectingOperator = false;\n\n            } elseif ($opCharacter == ')' && $expectingOperator) {            //    Are we expecting to close a parenthesis?\n//echo 'Element is a Closing bracket', PHP_EOL;\n                $expectingOperand = false;\n                while (($o2 = $stack->pop()) && $o2['value'] != '(') {        //    Pop off the stack back to the last (\n                    if ($o2 === null) {\n                        return $this->raiseFormulaError('Formula Error: Unexpected closing brace \")\"');\n                    } else {\n                        $output[] = $o2;\n                    }\n                }\n                $d = $stack->last(2);\n                if (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $d['value'], $matches)) {    //    Did this parenthesis just close a function?\n                    $functionName = $matches[1];                                        //    Get the function name\n//echo 'Closed Function is '.$functionName, PHP_EOL;\n                    $d = $stack->pop();\n                    $argumentCount = $d['value'];        //    See how many arguments there were (argument count is the next value stored on the stack)\n//if ($argumentCount == 0) {\n//    echo 'With no arguments', PHP_EOL;\n//} elseif ($argumentCount == 1) {\n//    echo 'With 1 argument', PHP_EOL;\n//} else {\n//    echo 'With '.$argumentCount.' arguments', PHP_EOL;\n//}\n                    $output[] = $d;                        //    Dump the argument count on the output\n                    $output[] = $stack->pop();            //    Pop the function and push onto the output\n                    if (isset(self::$controlFunctions[$functionName])) {\n//echo 'Built-in function '.$functionName, PHP_EOL;\n                        $expectedArgumentCount = self::$controlFunctions[$functionName]['argumentCount'];\n                        $functionCall = self::$controlFunctions[$functionName]['functionCall'];\n                    } elseif (isset(self::$PHPExcelFunctions[$functionName])) {\n//echo 'PHPExcel function '.$functionName, PHP_EOL;\n                        $expectedArgumentCount = self::$PHPExcelFunctions[$functionName]['argumentCount'];\n                        $functionCall = self::$PHPExcelFunctions[$functionName]['functionCall'];\n                    } else {    // did we somehow push a non-function on the stack? this should never happen\n                        return $this->raiseFormulaError(\"Formula Error: Internal error, non-function on stack\");\n                    }\n                    //    Check the argument count\n                    $argumentCountError = false;\n                    if (is_numeric($expectedArgumentCount)) {\n                        if ($expectedArgumentCount < 0) {\n//echo '$expectedArgumentCount is between 0 and '.abs($expectedArgumentCount), PHP_EOL;\n                            if ($argumentCount > abs($expectedArgumentCount)) {\n                                $argumentCountError = true;\n                                $expectedArgumentCountString = 'no more than '.abs($expectedArgumentCount);\n                            }\n                        } else {\n//echo '$expectedArgumentCount is numeric '.$expectedArgumentCount, PHP_EOL;\n                            if ($argumentCount != $expectedArgumentCount) {\n                                $argumentCountError = true;\n                                $expectedArgumentCountString = $expectedArgumentCount;\n                            }\n                        }\n                    } elseif ($expectedArgumentCount != '*') {\n                        $isOperandOrFunction = preg_match('/(\\d*)([-+,])(\\d*)/', $expectedArgumentCount, $argMatch);\n//print_r($argMatch);\n//echo PHP_EOL;\n                        switch ($argMatch[2]) {\n                            case '+':\n                                if ($argumentCount < $argMatch[1]) {\n                                    $argumentCountError = true;\n                                    $expectedArgumentCountString = $argMatch[1].' or more ';\n                                }\n                                break;\n                            case '-':\n                                if (($argumentCount < $argMatch[1]) || ($argumentCount > $argMatch[3])) {\n                                    $argumentCountError = true;\n                                    $expectedArgumentCountString = 'between '.$argMatch[1].' and '.$argMatch[3];\n                                }\n                                break;\n                            case ',':\n                                if (($argumentCount != $argMatch[1]) && ($argumentCount != $argMatch[3])) {\n                                    $argumentCountError = true;\n                                    $expectedArgumentCountString = 'either '.$argMatch[1].' or '.$argMatch[3];\n                                }\n                                break;\n                        }\n                    }\n                    if ($argumentCountError) {\n                        return $this->raiseFormulaError(\"Formula Error: Wrong number of arguments for $functionName() function: $argumentCount given, \".$expectedArgumentCountString.\" expected\");\n                    }\n                }\n                ++$index;\n\n            } elseif ($opCharacter == ',') {            //    Is this the separator for function arguments?\n//echo 'Element is a Function argument separator', PHP_EOL;\n                while (($o2 = $stack->pop()) && $o2['value'] != '(') {        //    Pop off the stack back to the last (\n                    if ($o2 === null) {\n                        return $this->raiseFormulaError(\"Formula Error: Unexpected ,\");\n                    } else {\n                        $output[] = $o2;    // pop the argument expression stuff and push onto the output\n                    }\n                }\n                //    If we've a comma when we're expecting an operand, then what we actually have is a null operand;\n                //        so push a null onto the stack\n                if (($expectingOperand) || (!$expectingOperator)) {\n                    $output[] = array('type' => 'NULL Value', 'value' => self::$excelConstants['NULL'], 'reference' => null);\n                }\n                // make sure there was a function\n                $d = $stack->last(2);\n                if (!preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $d['value'], $matches)) {\n                    return $this->raiseFormulaError(\"Formula Error: Unexpected ,\");\n                }\n                $d = $stack->pop();\n                $stack->push($d['type'], ++$d['value'], $d['reference']);    // increment the argument count\n                $stack->push('Brace', '(');    // put the ( back on, we'll need to pop back to it again\n                $expectingOperator = false;\n                $expectingOperand = true;\n                ++$index;\n\n            } elseif ($opCharacter == '(' && !$expectingOperator) {\n//                echo 'Element is an Opening Bracket<br />';\n                $stack->push('Brace', '(');\n                ++$index;\n\n            } elseif ($isOperandOrFunction && !$expectingOperator) {    // do we now have a function/variable/number?\n                $expectingOperator = true;\n                $expectingOperand = false;\n                $val = $match[1];\n                $length = strlen($val);\n//                echo 'Element with value '.$val.' is an Operand, Variable, Constant, String, Number, Cell Reference or Function<br />';\n\n                if (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $val, $matches)) {\n                    $val = preg_replace('/\\s/u', '', $val);\n//                    echo 'Element '.$val.' is a Function<br />';\n                    if (isset(self::$PHPExcelFunctions[strtoupper($matches[1])]) || isset(self::$controlFunctions[strtoupper($matches[1])])) {    // it's a function\n                        $stack->push('Function', strtoupper($val));\n                        $ax = preg_match('/^\\s*(\\s*\\))/ui', substr($formula, $index+$length), $amatch);\n                        if ($ax) {\n                            $stack->push('Operand Count for Function '.strtoupper($val).')', 0);\n                            $expectingOperator = true;\n                        } else {\n                            $stack->push('Operand Count for Function '.strtoupper($val).')', 1);\n                            $expectingOperator = false;\n                        }\n                        $stack->push('Brace', '(');\n                    } else {    // it's a var w/ implicit multiplication\n                        $output[] = array('type' => 'Value', 'value' => $matches[1], 'reference' => null);\n                    }\n                } elseif (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $val, $matches)) {\n//                    echo 'Element '.$val.' is a Cell reference<br />';\n                    //    Watch for this case-change when modifying to allow cell references in different worksheets...\n                    //    Should only be applied to the actual cell column, not the worksheet name\n\n                    //    If the last entry on the stack was a : operator, then we have a cell range reference\n                    $testPrevOp = $stack->last(1);\n                    if ($testPrevOp['value'] == ':') {\n                        //    If we have a worksheet reference, then we're playing with a 3D reference\n                        if ($matches[2] == '') {\n                            //    Otherwise, we 'inherit' the worksheet reference from the start cell reference\n                            //    The start of the cell range reference should be the last entry in $output\n                            $startCellRef = $output[count($output)-1]['value'];\n                            preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $startCellRef, $startMatches);\n                            if ($startMatches[2] > '') {\n                                $val = $startMatches[2].'!'.$val;\n                            }\n                        } else {\n                            return $this->raiseFormulaError(\"3D Range references are not yet supported\");\n                        }\n                    }\n\n                    $output[] = array('type' => 'Cell Reference', 'value' => $val, 'reference' => $val);\n//                    $expectingOperator = FALSE;\n                } else {    // it's a variable, constant, string, number or boolean\n//                    echo 'Element is a Variable, Constant, String, Number or Boolean<br />';\n                    //    If the last entry on the stack was a : operator, then we may have a row or column range reference\n                    $testPrevOp = $stack->last(1);\n                    if ($testPrevOp['value'] == ':') {\n                        $startRowColRef = $output[count($output)-1]['value'];\n                        $rangeWS1 = '';\n                        if (strpos('!', $startRowColRef) !== false) {\n                            list($rangeWS1, $startRowColRef) = explode('!', $startRowColRef);\n                        }\n                        if ($rangeWS1 != '') {\n                            $rangeWS1 .= '!';\n                        }\n                        $rangeWS2 = $rangeWS1;\n                        if (strpos('!', $val) !== false) {\n                            list($rangeWS2, $val) = explode('!', $val);\n                        }\n                        if ($rangeWS2 != '') {\n                            $rangeWS2 .= '!';\n                        }\n                        if ((is_integer($startRowColRef)) && (ctype_digit($val)) &&\n                            ($startRowColRef <= 1048576) && ($val <= 1048576)) {\n                            //    Row range\n                            $endRowColRef = ($pCellParent !== null) ? $pCellParent->getHighestColumn() : 'XFD';    //    Max 16,384 columns for Excel2007\n                            $output[count($output)-1]['value'] = $rangeWS1.'A'.$startRowColRef;\n                            $val = $rangeWS2.$endRowColRef.$val;\n                        } elseif ((ctype_alpha($startRowColRef)) && (ctype_alpha($val)) &&\n                            (strlen($startRowColRef) <= 3) && (strlen($val) <= 3)) {\n                            //    Column range\n                            $endRowColRef = ($pCellParent !== null) ? $pCellParent->getHighestRow() : 1048576;        //    Max 1,048,576 rows for Excel2007\n                            $output[count($output)-1]['value'] = $rangeWS1.strtoupper($startRowColRef).'1';\n                            $val = $rangeWS2.$val.$endRowColRef;\n                        }\n                    }\n\n                    $localeConstant = false;\n                    if ($opCharacter == '\"') {\n//                        echo 'Element is a String<br />';\n                        //    UnEscape any quotes within the string\n                        $val = self::wrapResult(str_replace('\"\"', '\"', self::unwrapResult($val)));\n                    } elseif (is_numeric($val)) {\n//                        echo 'Element is a Number<br />';\n                        if ((strpos($val, '.') !== false) || (stripos($val, 'e') !== false) || ($val > PHP_INT_MAX) || ($val < -PHP_INT_MAX)) {\n//                            echo 'Casting '.$val.' to float<br />';\n                            $val = (float) $val;\n                        } else {\n//                            echo 'Casting '.$val.' to integer<br />';\n                            $val = (integer) $val;\n                        }\n                    } elseif (isset(self::$excelConstants[trim(strtoupper($val))])) {\n                        $excelConstant = trim(strtoupper($val));\n//                        echo 'Element '.$excelConstant.' is an Excel Constant<br />';\n                        $val = self::$excelConstants[$excelConstant];\n                    } elseif (($localeConstant = array_search(trim(strtoupper($val)), self::$localeBoolean)) !== false) {\n//                        echo 'Element '.$localeConstant.' is an Excel Constant<br />';\n                        $val = self::$excelConstants[$localeConstant];\n                    }\n                    $details = array('type' => 'Value', 'value' => $val, 'reference' => null);\n                    if ($localeConstant) {\n                        $details['localeValue'] = $localeConstant;\n                    }\n                    $output[] = $details;\n                }\n                $index += $length;\n\n            } elseif ($opCharacter == '$') {    // absolute row or column range\n                ++$index;\n            } elseif ($opCharacter == ')') {    // miscellaneous error checking\n                if ($expectingOperand) {\n                    $output[] = array('type' => 'NULL Value', 'value' => self::$excelConstants['NULL'], 'reference' => null);\n                    $expectingOperand = false;\n                    $expectingOperator = true;\n                } else {\n                    return $this->raiseFormulaError(\"Formula Error: Unexpected ')'\");\n                }\n            } elseif (isset(self::$operators[$opCharacter]) && !$expectingOperator) {\n                return $this->raiseFormulaError(\"Formula Error: Unexpected operator '$opCharacter'\");\n            } else {    // I don't even want to know what you did to get here\n                return $this->raiseFormulaError(\"Formula Error: An unexpected error occured\");\n            }\n            //    Test for end of formula string\n            if ($index == strlen($formula)) {\n                //    Did we end with an operator?.\n                //    Only valid for the % unary operator\n                if ((isset(self::$operators[$opCharacter])) && ($opCharacter != '%')) {\n                    return $this->raiseFormulaError(\"Formula Error: Operator '$opCharacter' has no operands\");\n                } else {\n                    break;\n                }\n            }\n            //    Ignore white space\n            while (($formula{$index} == \"\\n\") || ($formula{$index} == \"\\r\")) {\n                ++$index;\n            }\n            if ($formula{$index} == ' ') {\n                while ($formula{$index} == ' ') {\n                    ++$index;\n                }\n                //    If we're expecting an operator, but only have a space between the previous and next operands (and both are\n                //        Cell References) then we have an INTERSECTION operator\n//                echo 'Possible Intersect Operator<br />';\n                if (($expectingOperator) && (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'.*/Ui', substr($formula, $index), $match)) &&\n                    ($output[count($output)-1]['type'] == 'Cell Reference')) {\n//                    echo 'Element is an Intersect Operator<br />';\n                    while ($stack->count() > 0 &&\n                        ($o2 = $stack->last()) &&\n                        isset(self::$operators[$o2['value']]) &&\n                        @(self::$operatorAssociativity[$opCharacter] ? self::$operatorPrecedence[$opCharacter] < self::$operatorPrecedence[$o2['value']] : self::$operatorPrecedence[$opCharacter] <= self::$operatorPrecedence[$o2['value']])) {\n                        $output[] = $stack->pop();                                //    Swap operands and higher precedence operators from the stack to the output\n                    }\n                    $stack->push('Binary Operator', '|');    //    Put an Intersect Operator on the stack\n                    $expectingOperator = false;\n                }\n            }\n        }\n\n        while (($op = $stack->pop()) !== null) {    // pop everything off the stack and push onto output\n            if ((is_array($op) && $op['value'] == '(') || ($op === '(')) {\n                return $this->raiseFormulaError(\"Formula Error: Expecting ')'\");    // if there are any opening braces on the stack, then braces were unbalanced\n            }\n            $output[] = $op;\n        }\n        return $output;\n    }\n\n\n    private static function dataTestReference(&$operandData)\n    {\n        $operand = $operandData['value'];\n        if (($operandData['reference'] === null) && (is_array($operand))) {\n            $rKeys = array_keys($operand);\n            $rowKey = array_shift($rKeys);\n            $cKeys = array_keys(array_keys($operand[$rowKey]));\n            $colKey = array_shift($cKeys);\n            if (ctype_upper($colKey)) {\n                $operandData['reference'] = $colKey.$rowKey;\n            }\n        }\n        return $operand;\n    }\n\n    // evaluate postfix notation\n    private function processTokenStack($tokens, $cellID = null, PHPExcel_Cell $pCell = null)\n    {\n        if ($tokens == false) {\n            return false;\n        }\n\n        //    If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent cell collection),\n        //        so we store the parent cell collection so that we can re-attach it when necessary\n        $pCellWorksheet = ($pCell !== null) ? $pCell->getWorksheet() : null;\n        $pCellParent = ($pCell !== null) ? $pCell->getParent() : null;\n        $stack = new PHPExcel_Calculation_Token_Stack;\n\n        //    Loop through each token in turn\n        foreach ($tokens as $tokenData) {\n//            print_r($tokenData);\n//            echo '<br />';\n            $token = $tokenData['value'];\n//            echo '<b>Token is '.$token.'</b><br />';\n            // if the token is a binary operator, pop the top two values off the stack, do the operation, and push the result back on the stack\n            if (isset(self::$binaryOperators[$token])) {\n//                echo 'Token is a binary operator<br />';\n                //    We must have two operands, error if we don't\n                if (($operand2Data = $stack->pop()) === null) {\n                    return $this->raiseFormulaError('Internal error - Operand value missing from stack');\n                }\n                if (($operand1Data = $stack->pop()) === null) {\n                    return $this->raiseFormulaError('Internal error - Operand value missing from stack');\n                }\n\n                $operand1 = self::dataTestReference($operand1Data);\n                $operand2 = self::dataTestReference($operand2Data);\n\n                //    Log what we're doing\n                if ($token == ':') {\n                    $this->_debugLog->writeDebugLog('Evaluating Range ', $this->showValue($operand1Data['reference']), ' ', $token, ' ', $this->showValue($operand2Data['reference']));\n                } else {\n                    $this->_debugLog->writeDebugLog('Evaluating ', $this->showValue($operand1), ' ', $token, ' ', $this->showValue($operand2));\n                }\n\n                //    Process the operation in the appropriate manner\n                switch ($token) {\n                    //    Comparison (Boolean) Operators\n                    case '>':            //    Greater than\n                    case '<':            //    Less than\n                    case '>=':            //    Greater than or Equal to\n                    case '<=':            //    Less than or Equal to\n                    case '=':            //    Equality\n                    case '<>':            //    Inequality\n                        $this->executeBinaryComparisonOperation($cellID, $operand1, $operand2, $token, $stack);\n                        break;\n                    //    Binary Operators\n                    case ':':            //    Range\n                        $sheet1 = $sheet2 = '';\n                        if (strpos($operand1Data['reference'], '!') !== false) {\n                            list($sheet1, $operand1Data['reference']) = explode('!', $operand1Data['reference']);\n                        } else {\n                            $sheet1 = ($pCellParent !== null) ? $pCellWorksheet->getTitle() : '';\n                        }\n                        if (strpos($operand2Data['reference'], '!') !== false) {\n                            list($sheet2, $operand2Data['reference']) = explode('!', $operand2Data['reference']);\n                        } else {\n                            $sheet2 = $sheet1;\n                        }\n                        if ($sheet1 == $sheet2) {\n                            if ($operand1Data['reference'] === null) {\n                                if ((trim($operand1Data['value']) != '') && (is_numeric($operand1Data['value']))) {\n                                    $operand1Data['reference'] = $pCell->getColumn().$operand1Data['value'];\n                                } elseif (trim($operand1Data['reference']) == '') {\n                                    $operand1Data['reference'] = $pCell->getCoordinate();\n                                } else {\n                                    $operand1Data['reference'] = $operand1Data['value'].$pCell->getRow();\n                                }\n                            }\n                            if ($operand2Data['reference'] === null) {\n                                if ((trim($operand2Data['value']) != '') && (is_numeric($operand2Data['value']))) {\n                                    $operand2Data['reference'] = $pCell->getColumn().$operand2Data['value'];\n                                } elseif (trim($operand2Data['reference']) == '') {\n                                    $operand2Data['reference'] = $pCell->getCoordinate();\n                                } else {\n                                    $operand2Data['reference'] = $operand2Data['value'].$pCell->getRow();\n                                }\n                            }\n\n                            $oData = array_merge(explode(':', $operand1Data['reference']), explode(':', $operand2Data['reference']));\n                            $oCol = $oRow = array();\n                            foreach ($oData as $oDatum) {\n                                $oCR = PHPExcel_Cell::coordinateFromString($oDatum);\n                                $oCol[] = PHPExcel_Cell::columnIndexFromString($oCR[0]) - 1;\n                                $oRow[] = $oCR[1];\n                            }\n                            $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow);\n                            if ($pCellParent !== null) {\n                                $cellValue = $this->extractCellRange($cellRef, $this->workbook->getSheetByName($sheet1), false);\n                            } else {\n                                return $this->raiseFormulaError('Unable to access Cell Reference');\n                            }\n                            $stack->push('Cell Reference', $cellValue, $cellRef);\n                        } else {\n                            $stack->push('Error', PHPExcel_Calculation_Functions::REF(), null);\n                        }\n                        break;\n                    case '+':            //    Addition\n                        $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'plusEquals', $stack);\n                        break;\n                    case '-':            //    Subtraction\n                        $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'minusEquals', $stack);\n                        break;\n                    case '*':            //    Multiplication\n                        $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'arrayTimesEquals', $stack);\n                        break;\n                    case '/':            //    Division\n                        $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'arrayRightDivide', $stack);\n                        break;\n                    case '^':            //    Exponential\n                        $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'power', $stack);\n                        break;\n                    case '&':            //    Concatenation\n                        //    If either of the operands is a matrix, we need to treat them both as matrices\n                        //        (converting the other operand to a matrix if need be); then perform the required\n                        //        matrix operation\n                        if (is_bool($operand1)) {\n                            $operand1 = ($operand1) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE'];\n                        }\n                        if (is_bool($operand2)) {\n                            $operand2 = ($operand2) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE'];\n                        }\n                        if ((is_array($operand1)) || (is_array($operand2))) {\n                            //    Ensure that both operands are arrays/matrices\n                            self::checkMatrixOperands($operand1, $operand2, 2);\n                            try {\n                                //    Convert operand 1 from a PHP array to a matrix\n                                $matrix = new PHPExcel_Shared_JAMA_Matrix($operand1);\n                                //    Perform the required operation against the operand 1 matrix, passing in operand 2\n                                $matrixResult = $matrix->concat($operand2);\n                                $result = $matrixResult->getArray();\n                            } catch (PHPExcel_Exception $ex) {\n                                $this->_debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage());\n                                $result = '#VALUE!';\n                            }\n                        } else {\n                            $result = '\"'.str_replace('\"\"', '\"', self::unwrapResult($operand1, '\"').self::unwrapResult($operand2, '\"')).'\"';\n                        }\n                        $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result));\n                        $stack->push('Value', $result);\n                        break;\n                    case '|':            //    Intersect\n                        $rowIntersect = array_intersect_key($operand1, $operand2);\n                        $cellIntersect = $oCol = $oRow = array();\n                        foreach (array_keys($rowIntersect) as $row) {\n                            $oRow[] = $row;\n                            foreach ($rowIntersect[$row] as $col => $data) {\n                                $oCol[] = PHPExcel_Cell::columnIndexFromString($col) - 1;\n                                $cellIntersect[$row] = array_intersect_key($operand1[$row], $operand2[$row]);\n                            }\n                        }\n                        $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow);\n                        $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($cellIntersect));\n                        $stack->push('Value', $cellIntersect, $cellRef);\n                        break;\n                }\n\n            // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on\n            } elseif (($token === '~') || ($token === '%')) {\n//                echo 'Token is a unary operator<br />';\n                if (($arg = $stack->pop()) === null) {\n                    return $this->raiseFormulaError('Internal error - Operand value missing from stack');\n                }\n                $arg = $arg['value'];\n                if ($token === '~') {\n//                    echo 'Token is a negation operator<br />';\n                    $this->_debugLog->writeDebugLog('Evaluating Negation of ', $this->showValue($arg));\n                    $multiplier = -1;\n                } else {\n//                    echo 'Token is a percentile operator<br />';\n                    $this->_debugLog->writeDebugLog('Evaluating Percentile of ', $this->showValue($arg));\n                    $multiplier = 0.01;\n                }\n                if (is_array($arg)) {\n                    self::checkMatrixOperands($arg, $multiplier, 2);\n                    try {\n                        $matrix1 = new PHPExcel_Shared_JAMA_Matrix($arg);\n                        $matrixResult = $matrix1->arrayTimesEquals($multiplier);\n                        $result = $matrixResult->getArray();\n                    } catch (PHPExcel_Exception $ex) {\n                        $this->_debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage());\n                        $result = '#VALUE!';\n                    }\n                    $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result));\n                    $stack->push('Value', $result);\n                } else {\n                    $this->executeNumericBinaryOperation($cellID, $multiplier, $arg, '*', 'arrayTimesEquals', $stack);\n                }\n\n            } elseif (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $token, $matches)) {\n                $cellRef = null;\n//                echo 'Element '.$token.' is a Cell reference<br />';\n                if (isset($matches[8])) {\n//                    echo 'Reference is a Range of cells<br />';\n                    if ($pCell === null) {\n//                        We can't access the range, so return a REF error\n                        $cellValue = PHPExcel_Calculation_Functions::REF();\n                    } else {\n                        $cellRef = $matches[6].$matches[7].':'.$matches[9].$matches[10];\n                        if ($matches[2] > '') {\n                            $matches[2] = trim($matches[2], \"\\\"'\");\n                            if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) {\n                                //    It's a Reference to an external workbook (not currently supported)\n                                return $this->raiseFormulaError('Unable to access External Workbook');\n                            }\n                            $matches[2] = trim($matches[2], \"\\\"'\");\n//                            echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'<br />';\n                            $this->_debugLog->writeDebugLog('Evaluating Cell Range ', $cellRef, ' in worksheet ', $matches[2]);\n                            if ($pCellParent !== null) {\n                                $cellValue = $this->extractCellRange($cellRef, $this->workbook->getSheetByName($matches[2]), false);\n                            } else {\n                                return $this->raiseFormulaError('Unable to access Cell Reference');\n                            }\n                            $this->_debugLog->writeDebugLog('Evaluation Result for cells ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue));\n//                            $cellRef = $matches[2].'!'.$cellRef;\n                        } else {\n//                            echo '$cellRef='.$cellRef.' in current worksheet<br />';\n                            $this->_debugLog->writeDebugLog('Evaluating Cell Range ', $cellRef, ' in current worksheet');\n                            if ($pCellParent !== null) {\n                                $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false);\n                            } else {\n                                return $this->raiseFormulaError('Unable to access Cell Reference');\n                            }\n                            $this->_debugLog->writeDebugLog('Evaluation Result for cells ', $cellRef, ' is ', $this->showTypeDetails($cellValue));\n                        }\n                    }\n                } else {\n//                    echo 'Reference is a single Cell<br />';\n                    if ($pCell === null) {\n//                        We can't access the cell, so return a REF error\n                        $cellValue = PHPExcel_Calculation_Functions::REF();\n                    } else {\n                        $cellRef = $matches[6].$matches[7];\n                        if ($matches[2] > '') {\n                            $matches[2] = trim($matches[2], \"\\\"'\");\n                            if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) {\n                                //    It's a Reference to an external workbook (not currently supported)\n                                return $this->raiseFormulaError('Unable to access External Workbook');\n                            }\n//                            echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'<br />';\n                            $this->_debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in worksheet ', $matches[2]);\n                            if ($pCellParent !== null) {\n                                $cellSheet = $this->workbook->getSheetByName($matches[2]);\n                                if ($cellSheet && $cellSheet->cellExists($cellRef)) {\n                                    $cellValue = $this->extractCellRange($cellRef, $this->workbook->getSheetByName($matches[2]), false);\n                                    $pCell->attach($pCellParent);\n                                } else {\n                                    $cellValue = null;\n                                }\n                            } else {\n                                return $this->raiseFormulaError('Unable to access Cell Reference');\n                            }\n                            $this->_debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue));\n//                            $cellRef = $matches[2].'!'.$cellRef;\n                        } else {\n//                            echo '$cellRef='.$cellRef.' in current worksheet<br />';\n                            $this->_debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in current worksheet');\n                            if ($pCellParent->isDataSet($cellRef)) {\n                                $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false);\n                                $pCell->attach($pCellParent);\n                            } else {\n                                $cellValue = null;\n                            }\n                            $this->_debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' is ', $this->showTypeDetails($cellValue));\n                        }\n                    }\n                }\n                $stack->push('Value', $cellValue, $cellRef);\n\n            // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on\n            } elseif (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $token, $matches)) {\n//                echo 'Token is a function<br />';\n                $functionName = $matches[1];\n                $argCount = $stack->pop();\n                $argCount = $argCount['value'];\n                if ($functionName != 'MKMATRIX') {\n                    $this->_debugLog->writeDebugLog('Evaluating Function ', self::localeFunc($functionName), '() with ', (($argCount == 0) ? 'no' : $argCount), ' argument', (($argCount == 1) ? '' : 's'));\n                }\n                if ((isset(self::$PHPExcelFunctions[$functionName])) || (isset(self::$controlFunctions[$functionName]))) {    // function\n                    if (isset(self::$PHPExcelFunctions[$functionName])) {\n                        $functionCall = self::$PHPExcelFunctions[$functionName]['functionCall'];\n                        $passByReference = isset(self::$PHPExcelFunctions[$functionName]['passByReference']);\n                        $passCellReference = isset(self::$PHPExcelFunctions[$functionName]['passCellReference']);\n                    } elseif (isset(self::$controlFunctions[$functionName])) {\n                        $functionCall = self::$controlFunctions[$functionName]['functionCall'];\n                        $passByReference = isset(self::$controlFunctions[$functionName]['passByReference']);\n                        $passCellReference = isset(self::$controlFunctions[$functionName]['passCellReference']);\n                    }\n                    // get the arguments for this function\n//                    echo 'Function '.$functionName.' expects '.$argCount.' arguments<br />';\n                    $args = $argArrayVals = array();\n                    for ($i = 0; $i < $argCount; ++$i) {\n                        $arg = $stack->pop();\n                        $a = $argCount - $i - 1;\n                        if (($passByReference) &&\n                            (isset(self::$PHPExcelFunctions[$functionName]['passByReference'][$a])) &&\n                            (self::$PHPExcelFunctions[$functionName]['passByReference'][$a])) {\n                            if ($arg['reference'] === null) {\n                                $args[] = $cellID;\n                                if ($functionName != 'MKMATRIX') {\n                                    $argArrayVals[] = $this->showValue($cellID);\n                                }\n                            } else {\n                                $args[] = $arg['reference'];\n                                if ($functionName != 'MKMATRIX') {\n                                    $argArrayVals[] = $this->showValue($arg['reference']);\n                                }\n                            }\n                        } else {\n                            $args[] = self::unwrapResult($arg['value']);\n                            if ($functionName != 'MKMATRIX') {\n                                $argArrayVals[] = $this->showValue($arg['value']);\n                            }\n                        }\n                    }\n                    //    Reverse the order of the arguments\n                    krsort($args);\n                    if (($passByReference) && ($argCount == 0)) {\n                        $args[] = $cellID;\n                        $argArrayVals[] = $this->showValue($cellID);\n                    }\n//                    echo 'Arguments are: ';\n//                    print_r($args);\n//                    echo '<br />';\n                    if ($functionName != 'MKMATRIX') {\n                        if ($this->_debugLog->getWriteDebugLog()) {\n                            krsort($argArrayVals);\n                            $this->_debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', implode(self::$localeArgumentSeparator.' ', PHPExcel_Calculation_Functions::flattenArray($argArrayVals)), ' )');\n                        }\n                    }\n                    //    Process each argument in turn, building the return value as an array\n//                    if (($argCount == 1) && (is_array($args[1])) && ($functionName != 'MKMATRIX')) {\n//                        $operand1 = $args[1];\n//                        $this->_debugLog->writeDebugLog('Argument is a matrix: ', $this->showValue($operand1));\n//                        $result = array();\n//                        $row = 0;\n//                        foreach($operand1 as $args) {\n//                            if (is_array($args)) {\n//                                foreach($args as $arg) {\n//                                    $this->_debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', $this->showValue($arg), ' )');\n//                                    $r = call_user_func_array($functionCall, $arg);\n//                                    $this->_debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($r));\n//                                    $result[$row][] = $r;\n//                                }\n//                                ++$row;\n//                            } else {\n//                                $this->_debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', $this->showValue($args), ' )');\n//                                $r = call_user_func_array($functionCall, $args);\n//                                $this->_debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($r));\n//                                $result[] = $r;\n//                            }\n//                        }\n//                    } else {\n                    //    Process the argument with the appropriate function call\n                    if ($passCellReference) {\n                        $args[] = $pCell;\n                    }\n                    if (strpos($functionCall, '::') !== false) {\n                        $result = call_user_func_array(explode('::', $functionCall), $args);\n                    } else {\n                        foreach ($args as &$arg) {\n                            $arg = PHPExcel_Calculation_Functions::flattenSingleValue($arg);\n                        }\n                        unset($arg);\n                        $result = call_user_func_array($functionCall, $args);\n                    }\n                    if ($functionName != 'MKMATRIX') {\n                        $this->_debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($result));\n                    }\n                    $stack->push('Value', self::wrapResult($result));\n                }\n\n            } else {\n                // if the token is a number, boolean, string or an Excel error, push it onto the stack\n                if (isset(self::$excelConstants[strtoupper($token)])) {\n                    $excelConstant = strtoupper($token);\n//                    echo 'Token is a PHPExcel constant: '.$excelConstant.'<br />';\n                    $stack->push('Constant Value', self::$excelConstants[$excelConstant]);\n                    $this->_debugLog->writeDebugLog('Evaluating Constant ', $excelConstant, ' as ', $this->showTypeDetails(self::$excelConstants[$excelConstant]));\n                } elseif ((is_numeric($token)) || ($token === null) || (is_bool($token)) || ($token == '') || ($token{0} == '\"') || ($token{0} == '#')) {\n//                    echo 'Token is a number, boolean, string, null or an Excel error<br />';\n                    $stack->push('Value', $token);\n                // if the token is a named range, push the named range name onto the stack\n                } elseif (preg_match('/^'.self::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $token, $matches)) {\n//                    echo 'Token is a named range<br />';\n                    $namedRange = $matches[6];\n//                    echo 'Named Range is '.$namedRange.'<br />';\n                    $this->_debugLog->writeDebugLog('Evaluating Named Range ', $namedRange);\n                    $cellValue = $this->extractNamedRange($namedRange, ((null !== $pCell) ? $pCellWorksheet : null), false);\n                    $pCell->attach($pCellParent);\n                    $this->_debugLog->writeDebugLog('Evaluation Result for named range ', $namedRange, ' is ', $this->showTypeDetails($cellValue));\n                    $stack->push('Named Range', $cellValue, $namedRange);\n                } else {\n                    return $this->raiseFormulaError(\"undefined variable '$token'\");\n                }\n            }\n        }\n        // when we're out of tokens, the stack should have a single element, the final result\n        if ($stack->count() != 1) {\n            return $this->raiseFormulaError(\"internal error\");\n        }\n        $output = $stack->pop();\n        $output = $output['value'];\n\n//        if ((is_array($output)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) {\n//            return array_shift(PHPExcel_Calculation_Functions::flattenArray($output));\n//        }\n        return $output;\n    }\n\n\n    private function validateBinaryOperand($cellID, &$operand, &$stack)\n    {\n        if (is_array($operand)) {\n            if ((count($operand, COUNT_RECURSIVE) - count($operand)) == 1) {\n                do {\n                    $operand = array_pop($operand);\n                } while (is_array($operand));\n            }\n        }\n        //    Numbers, matrices and booleans can pass straight through, as they're already valid\n        if (is_string($operand)) {\n            //    We only need special validations for the operand if it is a string\n            //    Start by stripping off the quotation marks we use to identify true excel string values internally\n            if ($operand > '' && $operand{0} == '\"') {\n                $operand = self::unwrapResult($operand);\n            }\n            //    If the string is a numeric value, we treat it as a numeric, so no further testing\n            if (!is_numeric($operand)) {\n                //    If not a numeric, test to see if the value is an Excel error, and so can't be used in normal binary operations\n                if ($operand > '' && $operand{0} == '#') {\n                    $stack->push('Value', $operand);\n                    $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($operand));\n                    return false;\n                } elseif (!PHPExcel_Shared_String::convertToNumberIfFraction($operand)) {\n                    //    If not a numeric or a fraction, then it's a text string, and so can't be used in mathematical binary operations\n                    $stack->push('Value', '#VALUE!');\n                    $this->_debugLog->writeDebugLog('Evaluation Result is a ', $this->showTypeDetails('#VALUE!'));\n                    return false;\n                }\n            }\n        }\n\n        //    return a true if the value of the operand is one that we can use in normal binary operations\n        return true;\n    }\n\n\n    private function executeBinaryComparisonOperation($cellID, $operand1, $operand2, $operation, &$stack, $recursingArrays = false)\n    {\n        //    If we're dealing with matrix operations, we want a matrix result\n        if ((is_array($operand1)) || (is_array($operand2))) {\n            $result = array();\n            if ((is_array($operand1)) && (!is_array($operand2))) {\n                foreach ($operand1 as $x => $operandData) {\n                    $this->_debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2));\n                    $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2, $operation, $stack);\n                    $r = $stack->pop();\n                    $result[$x] = $r['value'];\n                }\n            } elseif ((!is_array($operand1)) && (is_array($operand2))) {\n                foreach ($operand2 as $x => $operandData) {\n                    $this->_debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operand1), ' ', $operation, ' ', $this->showValue($operandData));\n                    $this->executeBinaryComparisonOperation($cellID, $operand1, $operandData, $operation, $stack);\n                    $r = $stack->pop();\n                    $result[$x] = $r['value'];\n                }\n            } else {\n                if (!$recursingArrays) {\n                    self::checkMatrixOperands($operand1, $operand2, 2);\n                }\n                foreach ($operand1 as $x => $operandData) {\n                    $this->_debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2[$x]));\n                    $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2[$x], $operation, $stack, true);\n                    $r = $stack->pop();\n                    $result[$x] = $r['value'];\n                }\n            }\n            //    Log the result details\n            $this->_debugLog->writeDebugLog('Comparison Evaluation Result is ', $this->showTypeDetails($result));\n            //    And push the result onto the stack\n            $stack->push('Array', $result);\n            return true;\n        }\n\n        //    Simple validate the two operands if they are string values\n        if (is_string($operand1) && $operand1 > '' && $operand1{0} == '\"') {\n            $operand1 = self::unwrapResult($operand1);\n        }\n        if (is_string($operand2) && $operand2 > '' && $operand2{0} == '\"') {\n            $operand2 = self::unwrapResult($operand2);\n        }\n\n        // Use case insensitive comparaison if not OpenOffice mode\n        if (PHPExcel_Calculation_Functions::getCompatibilityMode() != PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {\n            if (is_string($operand1)) {\n                $operand1 = strtoupper($operand1);\n            }\n            if (is_string($operand2)) {\n                $operand2 = strtoupper($operand2);\n            }\n        }\n\n        $useLowercaseFirstComparison = is_string($operand1) && is_string($operand2) && PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE;\n\n        //    execute the necessary operation\n        switch ($operation) {\n            //    Greater than\n            case '>':\n                if ($useLowercaseFirstComparison) {\n                    $result = $this->strcmpLowercaseFirst($operand1, $operand2) > 0;\n                } else {\n                    $result = ($operand1 > $operand2);\n                }\n                break;\n            //    Less than\n            case '<':\n                if ($useLowercaseFirstComparison) {\n                    $result = $this->strcmpLowercaseFirst($operand1, $operand2) < 0;\n                } else {\n                    $result = ($operand1 < $operand2);\n                }\n                break;\n            //    Equality\n            case '=':\n                if (is_numeric($operand1) && is_numeric($operand2)) {\n                    $result = (abs($operand1 - $operand2) < $this->delta);\n                } else {\n                    $result = strcmp($operand1, $operand2) == 0;\n                }\n                break;\n            //    Greater than or equal\n            case '>=':\n                if (is_numeric($operand1) && is_numeric($operand2)) {\n                    $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 > $operand2));\n                } elseif ($useLowercaseFirstComparison) {\n                    $result = $this->strcmpLowercaseFirst($operand1, $operand2) >= 0;\n                } else {\n                    $result = strcmp($operand1, $operand2) >= 0;\n                }\n                break;\n            //    Less than or equal\n            case '<=':\n                if (is_numeric($operand1) && is_numeric($operand2)) {\n                    $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 < $operand2));\n                } elseif ($useLowercaseFirstComparison) {\n                    $result = $this->strcmpLowercaseFirst($operand1, $operand2) <= 0;\n                } else {\n                    $result = strcmp($operand1, $operand2) <= 0;\n                }\n                break;\n            //    Inequality\n            case '<>':\n                if (is_numeric($operand1) && is_numeric($operand2)) {\n                    $result = (abs($operand1 - $operand2) > 1E-14);\n                } else {\n                    $result = strcmp($operand1, $operand2) != 0;\n                }\n                break;\n        }\n\n        //    Log the result details\n        $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result));\n        //    And push the result onto the stack\n        $stack->push('Value', $result);\n        return true;\n    }\n\n    /**\n     * Compare two strings in the same way as strcmp() except that lowercase come before uppercase letters\n     * @param    string    $str1    First string value for the comparison\n     * @param    string    $str2    Second string value for the comparison\n     * @return   integer\n     */\n    private function strcmpLowercaseFirst($str1, $str2)\n    {\n        $inversedStr1 = PHPExcel_Shared_String::StrCaseReverse($str1);\n        $inversedStr2 = PHPExcel_Shared_String::StrCaseReverse($str2);\n\n        return strcmp($inversedStr1, $inversedStr2);\n    }\n\n    private function executeNumericBinaryOperation($cellID, $operand1, $operand2, $operation, $matrixFunction, &$stack)\n    {\n        //    Validate the two operands\n        if (!$this->validateBinaryOperand($cellID, $operand1, $stack)) {\n            return false;\n        }\n        if (!$this->validateBinaryOperand($cellID, $operand2, $stack)) {\n            return false;\n        }\n\n        //    If either of the operands is a matrix, we need to treat them both as matrices\n        //        (converting the other operand to a matrix if need be); then perform the required\n        //        matrix operation\n        if ((is_array($operand1)) || (is_array($operand2))) {\n            //    Ensure that both operands are arrays/matrices of the same size\n            self::checkMatrixOperands($operand1, $operand2, 2);\n\n            try {\n                //    Convert operand 1 from a PHP array to a matrix\n                $matrix = new PHPExcel_Shared_JAMA_Matrix($operand1);\n                //    Perform the required operation against the operand 1 matrix, passing in operand 2\n                $matrixResult = $matrix->$matrixFunction($operand2);\n                $result = $matrixResult->getArray();\n            } catch (PHPExcel_Exception $ex) {\n                $this->_debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage());\n                $result = '#VALUE!';\n            }\n        } else {\n            if ((PHPExcel_Calculation_Functions::getCompatibilityMode() != PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) &&\n                ((is_string($operand1) && !is_numeric($operand1) && strlen($operand1)>0) ||\n                 (is_string($operand2) && !is_numeric($operand2) && strlen($operand2)>0))) {\n                $result = PHPExcel_Calculation_Functions::VALUE();\n            } else {\n                //    If we're dealing with non-matrix operations, execute the necessary operation\n                switch ($operation) {\n                    //    Addition\n                    case '+':\n                        $result = $operand1 + $operand2;\n                        break;\n                    //    Subtraction\n                    case '-':\n                        $result = $operand1 - $operand2;\n                        break;\n                    //    Multiplication\n                    case '*':\n                        $result = $operand1 * $operand2;\n                        break;\n                    //    Division\n                    case '/':\n                        if ($operand2 == 0) {\n                            //    Trap for Divide by Zero error\n                            $stack->push('Value', '#DIV/0!');\n                            $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails('#DIV/0!'));\n                            return false;\n                        } else {\n                            $result = $operand1 / $operand2;\n                        }\n                        break;\n                    //    Power\n                    case '^':\n                        $result = pow($operand1, $operand2);\n                        break;\n                }\n            }\n        }\n\n        //    Log the result details\n        $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result));\n        //    And push the result onto the stack\n        $stack->push('Value', $result);\n        return true;\n    }\n\n\n    // trigger an error, but nicely, if need be\n    protected function raiseFormulaError($errorMessage)\n    {\n        $this->formulaError = $errorMessage;\n        $this->cyclicReferenceStack->clear();\n        if (!$this->suppressFormulaErrors) {\n            throw new PHPExcel_Calculation_Exception($errorMessage);\n        }\n        trigger_error($errorMessage, E_USER_ERROR);\n    }\n\n\n    /**\n     * Extract range values\n     *\n     * @param    string                &$pRange    String based range representation\n     * @param    PHPExcel_Worksheet    $pSheet        Worksheet\n     * @param    boolean                $resetLog    Flag indicating whether calculation log should be reset or not\n     * @return  mixed                Array of values in range if range contains more than one element. Otherwise, a single value is returned.\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function extractCellRange(&$pRange = 'A1', PHPExcel_Worksheet $pSheet = null, $resetLog = true)\n    {\n        // Return value\n        $returnValue = array ();\n\n//        echo 'extractCellRange('.$pRange.')', PHP_EOL;\n        if ($pSheet !== null) {\n            $pSheetName = $pSheet->getTitle();\n//            echo 'Passed sheet name is '.$pSheetName.PHP_EOL;\n//            echo 'Range reference is '.$pRange.PHP_EOL;\n            if (strpos($pRange, '!') !== false) {\n//                echo '$pRange reference includes sheet reference', PHP_EOL;\n                list($pSheetName, $pRange) = PHPExcel_Worksheet::extractSheetTitle($pRange, true);\n//                echo 'New sheet name is '.$pSheetName, PHP_EOL;\n//                echo 'Adjusted Range reference is '.$pRange, PHP_EOL;\n                $pSheet = $this->workbook->getSheetByName($pSheetName);\n            }\n\n            // Extract range\n            $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange);\n            $pRange = $pSheetName.'!'.$pRange;\n            if (!isset($aReferences[1])) {\n                //    Single cell in range\n                sscanf($aReferences[0], '%[A-Z]%d', $currentCol, $currentRow);\n                $cellValue = null;\n                if ($pSheet->cellExists($aReferences[0])) {\n                    $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog);\n                } else {\n                    $returnValue[$currentRow][$currentCol] = null;\n                }\n            } else {\n                // Extract cell data for all cells in the range\n                foreach ($aReferences as $reference) {\n                    // Extract range\n                    sscanf($reference, '%[A-Z]%d', $currentCol, $currentRow);\n                    $cellValue = null;\n                    if ($pSheet->cellExists($reference)) {\n                        $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog);\n                    } else {\n                        $returnValue[$currentRow][$currentCol] = null;\n                    }\n                }\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * Extract range values\n     *\n     * @param    string                &$pRange    String based range representation\n     * @param    PHPExcel_Worksheet    $pSheet        Worksheet\n     * @return  mixed                Array of values in range if range contains more than one element. Otherwise, a single value is returned.\n     * @param    boolean                $resetLog    Flag indicating whether calculation log should be reset or not\n     * @throws    PHPExcel_Calculation_Exception\n     */\n    public function extractNamedRange(&$pRange = 'A1', PHPExcel_Worksheet $pSheet = null, $resetLog = true)\n    {\n        // Return value\n        $returnValue = array ();\n\n//        echo 'extractNamedRange('.$pRange.')<br />';\n        if ($pSheet !== null) {\n            $pSheetName = $pSheet->getTitle();\n//            echo 'Current sheet name is '.$pSheetName.'<br />';\n//            echo 'Range reference is '.$pRange.'<br />';\n            if (strpos($pRange, '!') !== false) {\n//                echo '$pRange reference includes sheet reference', PHP_EOL;\n                list($pSheetName, $pRange) = PHPExcel_Worksheet::extractSheetTitle($pRange, true);\n//                echo 'New sheet name is '.$pSheetName, PHP_EOL;\n//                echo 'Adjusted Range reference is '.$pRange, PHP_EOL;\n                $pSheet = $this->workbook->getSheetByName($pSheetName);\n            }\n\n            // Named range?\n            $namedRange = PHPExcel_NamedRange::resolveRange($pRange, $pSheet);\n            if ($namedRange !== null) {\n                $pSheet = $namedRange->getWorksheet();\n//                echo 'Named Range '.$pRange.' (';\n                $pRange = $namedRange->getRange();\n                $splitRange = PHPExcel_Cell::splitRange($pRange);\n                //    Convert row and column references\n                if (ctype_alpha($splitRange[0][0])) {\n                    $pRange = $splitRange[0][0] . '1:' . $splitRange[0][1] . $namedRange->getWorksheet()->getHighestRow();\n                } elseif (ctype_digit($splitRange[0][0])) {\n                    $pRange = 'A' . $splitRange[0][0] . ':' . $namedRange->getWorksheet()->getHighestColumn() . $splitRange[0][1];\n                }\n//                echo $pRange.') is in sheet '.$namedRange->getWorksheet()->getTitle().'<br />';\n\n//                if ($pSheet->getTitle() != $namedRange->getWorksheet()->getTitle()) {\n//                    if (!$namedRange->getLocalOnly()) {\n//                        $pSheet = $namedRange->getWorksheet();\n//                    } else {\n//                        return $returnValue;\n//                    }\n//                }\n            } else {\n                return PHPExcel_Calculation_Functions::REF();\n            }\n\n            // Extract range\n            $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange);\n//            var_dump($aReferences);\n            if (!isset($aReferences[1])) {\n                //    Single cell (or single column or row) in range\n                list($currentCol, $currentRow) = PHPExcel_Cell::coordinateFromString($aReferences[0]);\n                $cellValue = null;\n                if ($pSheet->cellExists($aReferences[0])) {\n                    $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog);\n                } else {\n                    $returnValue[$currentRow][$currentCol] = null;\n                }\n            } else {\n                // Extract cell data for all cells in the range\n                foreach ($aReferences as $reference) {\n                    // Extract range\n                    list($currentCol, $currentRow) = PHPExcel_Cell::coordinateFromString($reference);\n//                    echo 'NAMED RANGE: $currentCol='.$currentCol.' $currentRow='.$currentRow.'<br />';\n                    $cellValue = null;\n                    if ($pSheet->cellExists($reference)) {\n                        $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog);\n                    } else {\n                        $returnValue[$currentRow][$currentCol] = null;\n                    }\n                }\n            }\n//                print_r($returnValue);\n//            echo '<br />';\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * Is a specific function implemented?\n     *\n     * @param    string    $pFunction    Function Name\n     * @return    boolean\n     */\n    public function isImplemented($pFunction = '')\n    {\n        $pFunction = strtoupper($pFunction);\n        if (isset(self::$PHPExcelFunctions[$pFunction])) {\n            return (self::$PHPExcelFunctions[$pFunction]['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY');\n        } else {\n            return false;\n        }\n    }\n\n\n    /**\n     * Get a list of all implemented functions as an array of function objects\n     *\n     * @return    array of PHPExcel_Calculation_Function\n     */\n    public function listFunctions()\n    {\n        $returnValue = array();\n\n        foreach (self::$PHPExcelFunctions as $functionName => $function) {\n            if ($function['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY') {\n                $returnValue[$functionName] = new PHPExcel_Calculation_Function(\n                    $function['category'],\n                    $functionName,\n                    $function['functionCall']\n                );\n            }\n        }\n\n        return $returnValue;\n    }\n\n\n    /**\n     * Get a list of all Excel function names\n     *\n     * @return    array\n     */\n    public function listAllFunctionNames()\n    {\n        return array_keys(self::$PHPExcelFunctions);\n    }\n\n    /**\n     * Get a list of implemented Excel function names\n     *\n     * @return    array\n     */\n    public function listFunctionNames()\n    {\n        $returnValue = array();\n        foreach (self::$PHPExcelFunctions as $functionName => $function) {\n            if ($function['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY') {\n                $returnValue[] = $functionName;\n            }\n        }\n\n        return $returnValue;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Cell_AdvancedValueBinder\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder\n{\n    /**\n     * Bind value to a cell\n     *\n     * @param  PHPExcel_Cell  $cell  Cell to bind value to\n     * @param  mixed $value          Value to bind in cell\n     * @return boolean\n     */\n    public function bindValue(PHPExcel_Cell $cell, $value = null)\n    {\n        // sanitize UTF-8 strings\n        if (is_string($value)) {\n            $value = PHPExcel_Shared_String::SanitizeUTF8($value);\n        }\n\n        // Find out data type\n        $dataType = parent::dataTypeForValue($value);\n\n        // Style logic - strings\n        if ($dataType === PHPExcel_Cell_DataType::TYPE_STRING && !$value instanceof PHPExcel_RichText) {\n            //    Test for booleans using locale-setting\n            if ($value == PHPExcel_Calculation::getTRUE()) {\n                $cell->setValueExplicit(true, PHPExcel_Cell_DataType::TYPE_BOOL);\n                return true;\n            } elseif ($value == PHPExcel_Calculation::getFALSE()) {\n                $cell->setValueExplicit(false, PHPExcel_Cell_DataType::TYPE_BOOL);\n                return true;\n            }\n\n            // Check for number in scientific format\n            if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NUMBER.'$/', $value)) {\n                $cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                return true;\n            }\n\n            // Check for fraction\n            if (preg_match('/^([+-]?)\\s*([0-9]+)\\s?\\/\\s*([0-9]+)$/', $value, $matches)) {\n                // Convert value to number\n                $value = $matches[2] / $matches[3];\n                if ($matches[1] == '-') {\n                    $value = 0 - $value;\n                }\n                $cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode('??/??');\n                return true;\n            } elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\\s?\\/\\s*([0-9]*)$/', $value, $matches)) {\n                // Convert value to number\n                $value = $matches[2] + ($matches[3] / $matches[4]);\n                if ($matches[1] == '-') {\n                    $value = 0 - $value;\n                }\n                $cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode('# ??/??');\n                return true;\n            }\n\n            // Check for percentage\n            if (preg_match('/^\\-?[0-9]*\\.?[0-9]*\\s?\\%$/', $value)) {\n                // Convert value to number\n                $value = (float) str_replace('%', '', $value) / 100;\n                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00);\n                return true;\n            }\n\n            // Check for currency\n            $currencyCode = PHPExcel_Shared_String::getCurrencyCode();\n            $decimalSeparator = PHPExcel_Shared_String::getDecimalSeparator();\n            $thousandsSeparator = PHPExcel_Shared_String::getThousandsSeparator();\n            if (preg_match('/^'.preg_quote($currencyCode).' *(\\d{1,3}('.preg_quote($thousandsSeparator).'\\d{3})*|(\\d+))('.preg_quote($decimalSeparator).'\\d{2})?$/', $value)) {\n                // Convert value to number\n                $value = (float) trim(str_replace(array($currencyCode, $thousandsSeparator, $decimalSeparator), array('', '', '.'), $value));\n                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode(\n                        str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE)\n                    );\n                return true;\n            } elseif (preg_match('/^\\$ *(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$/', $value)) {\n                // Convert value to number\n                $value = (float) trim(str_replace(array('$',','), '', $value));\n                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE);\n                return true;\n            }\n\n            // Check for time without seconds e.g. '9:45', '09:45'\n            if (preg_match('/^(\\d|[0-1]\\d|2[0-3]):[0-5]\\d$/', $value)) {\n                // Convert value to number\n                list($h, $m) = explode(':', $value);\n                $days = $h / 24 + $m / 1440;\n                $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3);\n                return true;\n            }\n\n            // Check for time with seconds '9:45:59', '09:45:59'\n            if (preg_match('/^(\\d|[0-1]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$/', $value)) {\n                // Convert value to number\n                list($h, $m, $s) = explode(':', $value);\n                $days = $h / 24 + $m / 1440 + $s / 86400;\n                // Convert value to number\n                $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);\n                return true;\n            }\n\n            // Check for datetime, e.g. '2008-12-31', '2008-12-31 15:59', '2008-12-31 15:59:10'\n            if (($d = PHPExcel_Shared_Date::stringToExcel($value)) !== false) {\n                // Convert value to number\n                $cell->setValueExplicit($d, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n                // Determine style. Either there is a time part or not. Look for ':'\n                if (strpos($value, ':') !== false) {\n                    $formatCode = 'yyyy-mm-dd h:mm';\n                } else {\n                    $formatCode = 'yyyy-mm-dd';\n                }\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getNumberFormat()->setFormatCode($formatCode);\n                return true;\n            }\n\n            // Check for newline character \"\\n\"\n            if (strpos($value, \"\\n\") !== false) {\n                $value = PHPExcel_Shared_String::SanitizeUTF8($value);\n                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);\n                // Set style\n                $cell->getWorksheet()->getStyle($cell->getCoordinate())\n                    ->getAlignment()->setWrapText(true);\n                return true;\n            }\n        }\n\n        // Not bound yet? Use parent...\n        return parent::bindValue($cell, $value);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell/DataType.php",
    "content": "<?php\n\n/**\n * PHPExcel_Cell_DataType\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Cell_DataType\n{\n    /* Data types */\n    const TYPE_STRING2  = 'str';\n    const TYPE_STRING   = 's';\n    const TYPE_FORMULA  = 'f';\n    const TYPE_NUMERIC  = 'n';\n    const TYPE_BOOL     = 'b';\n    const TYPE_NULL     = 'null';\n    const TYPE_INLINE   = 'inlineStr';\n    const TYPE_ERROR    = 'e';\n\n    /**\n     * List of error codes\n     *\n     * @var array\n     */\n    private static $errorCodes = array(\n        '#NULL!'  => 0,\n        '#DIV/0!' => 1,\n        '#VALUE!' => 2,\n        '#REF!'   => 3,\n        '#NAME?'  => 4,\n        '#NUM!'   => 5,\n        '#N/A'    => 6\n    );\n\n    /**\n     * Get list of error codes\n     *\n     * @return array\n     */\n    public static function getErrorCodes()\n    {\n        return self::$errorCodes;\n    }\n\n    /**\n     * DataType for value\n     *\n     * @deprecated  Replaced by PHPExcel_Cell_IValueBinder infrastructure, will be removed in version 1.8.0\n     * @param       mixed  $pValue\n     * @return      string\n     */\n    public static function dataTypeForValue($pValue = null)\n    {\n        return PHPExcel_Cell_DefaultValueBinder::dataTypeForValue($pValue);\n    }\n\n    /**\n     * Check a string that it satisfies Excel requirements\n     *\n     * @param  mixed  Value to sanitize to an Excel string\n     * @return mixed  Sanitized value\n     */\n    public static function checkString($pValue = null)\n    {\n        if ($pValue instanceof PHPExcel_RichText) {\n            // TODO: Sanitize Rich-Text string (max. character count is 32,767)\n            return $pValue;\n        }\n\n        // string must never be longer than 32,767 characters, truncate if necessary\n        $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 32767);\n\n        // we require that newline is represented as \"\\n\" in core, not as \"\\r\\n\" or \"\\r\"\n        $pValue = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $pValue);\n\n        return $pValue;\n    }\n\n    /**\n     * Check a value that it is a valid error code\n     *\n     * @param  mixed   Value to sanitize to an Excel error code\n     * @return string  Sanitized value\n     */\n    public static function checkErrorCode($pValue = null)\n    {\n        $pValue = (string) $pValue;\n\n        if (!array_key_exists($pValue, self::$errorCodes)) {\n            $pValue = '#NULL!';\n        }\n\n        return $pValue;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php",
    "content": "<?php\n\n/**\n * PHPExcel_Cell_DataValidation\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Cell_DataValidation\n{\n    /* Data validation types */\n    const TYPE_NONE        = 'none';\n    const TYPE_CUSTOM      = 'custom';\n    const TYPE_DATE        = 'date';\n    const TYPE_DECIMAL     = 'decimal';\n    const TYPE_LIST        = 'list';\n    const TYPE_TEXTLENGTH  = 'textLength';\n    const TYPE_TIME        = 'time';\n    const TYPE_WHOLE       = 'whole';\n\n    /* Data validation error styles */\n    const STYLE_STOP         = 'stop';\n    const STYLE_WARNING      = 'warning';\n    const STYLE_INFORMATION  = 'information';\n\n    /* Data validation operators */\n    const OPERATOR_BETWEEN             = 'between';\n    const OPERATOR_EQUAL               = 'equal';\n    const OPERATOR_GREATERTHAN         = 'greaterThan';\n    const OPERATOR_GREATERTHANOREQUAL  = 'greaterThanOrEqual';\n    const OPERATOR_LESSTHAN            = 'lessThan';\n    const OPERATOR_LESSTHANOREQUAL     = 'lessThanOrEqual';\n    const OPERATOR_NOTBETWEEN          = 'notBetween';\n    const OPERATOR_NOTEQUAL            = 'notEqual';\n\n    /**\n     * Formula 1\n     *\n     * @var string\n     */\n    private $formula1;\n\n    /**\n     * Formula 2\n     *\n     * @var string\n     */\n    private $formula2;\n\n    /**\n     * Type\n     *\n     * @var string\n     */\n    private $type = PHPExcel_Cell_DataValidation::TYPE_NONE;\n\n    /**\n     * Error style\n     *\n     * @var string\n     */\n    private $errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;\n\n    /**\n     * Operator\n     *\n     * @var string\n     */\n    private $operator;\n\n    /**\n     * Allow Blank\n     *\n     * @var boolean\n     */\n    private $allowBlank;\n\n    /**\n     * Show DropDown\n     *\n     * @var boolean\n     */\n    private $showDropDown;\n\n    /**\n     * Show InputMessage\n     *\n     * @var boolean\n     */\n    private $showInputMessage;\n\n    /**\n     * Show ErrorMessage\n     *\n     * @var boolean\n     */\n    private $showErrorMessage;\n\n    /**\n     * Error title\n     *\n     * @var string\n     */\n    private $errorTitle;\n\n    /**\n     * Error\n     *\n     * @var string\n     */\n    private $error;\n\n    /**\n     * Prompt title\n     *\n     * @var string\n     */\n    private $promptTitle;\n\n    /**\n     * Prompt\n     *\n     * @var string\n     */\n    private $prompt;\n\n    /**\n     * Create a new PHPExcel_Cell_DataValidation\n     */\n    public function __construct()\n    {\n        // Initialise member variables\n        $this->formula1          = '';\n        $this->formula2          = '';\n        $this->type              = PHPExcel_Cell_DataValidation::TYPE_NONE;\n        $this->errorStyle        = PHPExcel_Cell_DataValidation::STYLE_STOP;\n        $this->operator          = '';\n        $this->allowBlank        = false;\n        $this->showDropDown      = false;\n        $this->showInputMessage  = false;\n        $this->showErrorMessage  = false;\n        $this->errorTitle        = '';\n        $this->error             = '';\n        $this->promptTitle       = '';\n        $this->prompt            = '';\n    }\n\n    /**\n     * Get Formula 1\n     *\n     * @return string\n     */\n    public function getFormula1()\n    {\n        return $this->formula1;\n    }\n\n    /**\n     * Set Formula 1\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setFormula1($value = '')\n    {\n        $this->formula1 = $value;\n        return $this;\n    }\n\n    /**\n     * Get Formula 2\n     *\n     * @return string\n     */\n    public function getFormula2()\n    {\n        return $this->formula2;\n    }\n\n    /**\n     * Set Formula 2\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setFormula2($value = '')\n    {\n        $this->formula2 = $value;\n        return $this;\n    }\n\n    /**\n     * Get Type\n     *\n     * @return string\n     */\n    public function getType()\n    {\n        return $this->type;\n    }\n\n    /**\n     * Set Type\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setType($value = PHPExcel_Cell_DataValidation::TYPE_NONE)\n    {\n        $this->type = $value;\n        return $this;\n    }\n\n    /**\n     * Get Error style\n     *\n     * @return string\n     */\n    public function getErrorStyle()\n    {\n        return $this->errorStyle;\n    }\n\n    /**\n     * Set Error style\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setErrorStyle($value = PHPExcel_Cell_DataValidation::STYLE_STOP)\n    {\n        $this->errorStyle = $value;\n        return $this;\n    }\n\n    /**\n     * Get Operator\n     *\n     * @return string\n     */\n    public function getOperator()\n    {\n        return $this->operator;\n    }\n\n    /**\n     * Set Operator\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setOperator($value = '')\n    {\n        $this->operator = $value;\n        return $this;\n    }\n\n    /**\n     * Get Allow Blank\n     *\n     * @return boolean\n     */\n    public function getAllowBlank()\n    {\n        return $this->allowBlank;\n    }\n\n    /**\n     * Set Allow Blank\n     *\n     * @param  boolean    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setAllowBlank($value = false)\n    {\n        $this->allowBlank = $value;\n        return $this;\n    }\n\n    /**\n     * Get Show DropDown\n     *\n     * @return boolean\n     */\n    public function getShowDropDown()\n    {\n        return $this->showDropDown;\n    }\n\n    /**\n     * Set Show DropDown\n     *\n     * @param  boolean    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setShowDropDown($value = false)\n    {\n        $this->showDropDown = $value;\n        return $this;\n    }\n\n    /**\n     * Get Show InputMessage\n     *\n     * @return boolean\n     */\n    public function getShowInputMessage()\n    {\n        return $this->showInputMessage;\n    }\n\n    /**\n     * Set Show InputMessage\n     *\n     * @param  boolean    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setShowInputMessage($value = false)\n    {\n        $this->showInputMessage = $value;\n        return $this;\n    }\n\n    /**\n     * Get Show ErrorMessage\n     *\n     * @return boolean\n     */\n    public function getShowErrorMessage()\n    {\n        return $this->showErrorMessage;\n    }\n\n    /**\n     * Set Show ErrorMessage\n     *\n     * @param  boolean    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setShowErrorMessage($value = false)\n    {\n        $this->showErrorMessage = $value;\n        return $this;\n    }\n\n    /**\n     * Get Error title\n     *\n     * @return string\n     */\n    public function getErrorTitle()\n    {\n        return $this->errorTitle;\n    }\n\n    /**\n     * Set Error title\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setErrorTitle($value = '')\n    {\n        $this->errorTitle = $value;\n        return $this;\n    }\n\n    /**\n     * Get Error\n     *\n     * @return string\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * Set Error\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setError($value = '')\n    {\n        $this->error = $value;\n        return $this;\n    }\n\n    /**\n     * Get Prompt title\n     *\n     * @return string\n     */\n    public function getPromptTitle()\n    {\n        return $this->promptTitle;\n    }\n\n    /**\n     * Set Prompt title\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setPromptTitle($value = '')\n    {\n        $this->promptTitle = $value;\n        return $this;\n    }\n\n    /**\n     * Get Prompt\n     *\n     * @return string\n     */\n    public function getPrompt()\n    {\n        return $this->prompt;\n    }\n\n    /**\n     * Set Prompt\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_DataValidation\n     */\n    public function setPrompt($value = '')\n    {\n        $this->prompt = $value;\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->formula1 .\n            $this->formula2 .\n            $this->type = PHPExcel_Cell_DataValidation::TYPE_NONE .\n            $this->errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP .\n            $this->operator .\n            ($this->allowBlank ? 't' : 'f') .\n            ($this->showDropDown ? 't' : 'f') .\n            ($this->showInputMessage ? 't' : 'f') .\n            ($this->showErrorMessage ? 't' : 'f') .\n            $this->errorTitle .\n            $this->error .\n            $this->promptTitle .\n            $this->prompt .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Cell_DefaultValueBinder\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder\n{\n    /**\n     * Bind value to a cell\n     *\n     * @param  PHPExcel_Cell  $cell   Cell to bind value to\n     * @param  mixed          $value  Value to bind in cell\n     * @return boolean\n     */\n    public function bindValue(PHPExcel_Cell $cell, $value = null)\n    {\n        // sanitize UTF-8 strings\n        if (is_string($value)) {\n            $value = PHPExcel_Shared_String::SanitizeUTF8($value);\n        } elseif (is_object($value)) {\n            // Handle any objects that might be injected\n            if ($value instanceof DateTime) {\n                $value = $value->format('Y-m-d H:i:s');\n            } elseif (!($value instanceof PHPExcel_RichText)) {\n                $value = (string) $value;\n            }\n        }\n\n        // Set value explicit\n        $cell->setValueExplicit($value, self::dataTypeForValue($value));\n\n        // Done!\n        return true;\n    }\n\n    /**\n     * DataType for value\n     *\n     * @param   mixed  $pValue\n     * @return  string\n     */\n    public static function dataTypeForValue($pValue = null)\n    {\n        // Match the value against a few data types\n        if ($pValue === null) {\n            return PHPExcel_Cell_DataType::TYPE_NULL;\n        } elseif ($pValue === '') {\n            return PHPExcel_Cell_DataType::TYPE_STRING;\n        } elseif ($pValue instanceof PHPExcel_RichText) {\n            return PHPExcel_Cell_DataType::TYPE_INLINE;\n        } elseif ($pValue{0} === '=' && strlen($pValue) > 1) {\n            return PHPExcel_Cell_DataType::TYPE_FORMULA;\n        } elseif (is_bool($pValue)) {\n            return PHPExcel_Cell_DataType::TYPE_BOOL;\n        } elseif (is_float($pValue) || is_int($pValue)) {\n            return PHPExcel_Cell_DataType::TYPE_NUMERIC;\n        } elseif (preg_match('/^[\\+\\-]?([0-9]+\\\\.?[0-9]*|[0-9]*\\\\.?[0-9]+)([Ee][\\-\\+]?[0-2]?\\d{1,3})?$/', $pValue)) {\n            $tValue = ltrim($pValue, '+-');\n            if (is_string($pValue) && $tValue{0} === '0' && strlen($tValue) > 1 && $tValue{1} !== '.') {\n                return PHPExcel_Cell_DataType::TYPE_STRING;\n            } elseif ((strpos($pValue, '.') === false) && ($pValue > PHP_INT_MAX)) {\n                return PHPExcel_Cell_DataType::TYPE_STRING;\n            }\n            return PHPExcel_Cell_DataType::TYPE_NUMERIC;\n        } elseif (is_string($pValue) && array_key_exists($pValue, PHPExcel_Cell_DataType::getErrorCodes())) {\n            return PHPExcel_Cell_DataType::TYPE_ERROR;\n        }\n\n        return PHPExcel_Cell_DataType::TYPE_STRING;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php",
    "content": "<?php\n\n/**\n * PHPExcel_Cell_Hyperlink\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Cell_Hyperlink\n{\n    /**\n     * URL to link the cell to\n     *\n     * @var string\n     */\n    private $url;\n\n    /**\n     * Tooltip to display on the hyperlink\n     *\n     * @var string\n     */\n    private $tooltip;\n\n    /**\n     * Create a new PHPExcel_Cell_Hyperlink\n     *\n     * @param  string  $pUrl      Url to link the cell to\n     * @param  string  $pTooltip  Tooltip to display on the hyperlink\n     */\n    public function __construct($pUrl = '', $pTooltip = '')\n    {\n        // Initialise member variables\n        $this->url     = $pUrl;\n        $this->tooltip = $pTooltip;\n    }\n\n    /**\n     * Get URL\n     *\n     * @return string\n     */\n    public function getUrl()\n    {\n        return $this->url;\n    }\n\n    /**\n     * Set URL\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_Hyperlink\n     */\n    public function setUrl($value = '')\n    {\n        $this->url = $value;\n        return $this;\n    }\n\n    /**\n     * Get tooltip\n     *\n     * @return string\n     */\n    public function getTooltip()\n    {\n        return $this->tooltip;\n    }\n\n    /**\n     * Set tooltip\n     *\n     * @param  string    $value\n     * @return PHPExcel_Cell_Hyperlink\n     */\n    public function setTooltip($value = '')\n    {\n        $this->tooltip = $value;\n        return $this;\n    }\n\n    /**\n     * Is this hyperlink internal? (to another worksheet)\n     *\n     * @return boolean\n     */\n    public function isInternal()\n    {\n        return strpos($this->url, 'sheet://') !== false;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->url .\n            $this->tooltip .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php",
    "content": "<?php\n\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Cell_IValueBinder\n *\n * @category   PHPExcel\n * @package    PHPExcel_Cell\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\ninterface PHPExcel_Cell_IValueBinder\n{\n    /**\n     * Bind value to a cell\n     *\n     * @param  PHPExcel_Cell $cell    Cell to bind value to\n     * @param  mixed $value           Value to bind in cell\n     * @return boolean\n     */\n    public function bindValue(PHPExcel_Cell $cell, $value = null);\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Cell.php",
    "content": "<?php\n\n/**\n *    PHPExcel_Cell\n *\n *    Copyright (c) 2006 - 2015 PHPExcel\n *\n *    This library is free software; you can redistribute it and/or\n *    modify it under the terms of the GNU Lesser General Public\n *    License as published by the Free Software Foundation; either\n *    version 2.1 of the License, or (at your option) any later version.\n *\n *    This library is distributed in the hope that it will be useful,\n *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *    Lesser General Public License for more details.\n *\n *    You should have received a copy of the GNU Lesser General Public\n *    License along with this library; if not, write to the Free Software\n *    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *    @category    PHPExcel\n *    @package    PHPExcel_Cell\n *    @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *    @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *    @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Cell\n{\n    /**\n     *  Default range variable constant\n     *\n     *  @var  string\n     */\n    const DEFAULT_RANGE = 'A1:A1';\n\n    /**\n     *    Value binder to use\n     *\n     *    @var    PHPExcel_Cell_IValueBinder\n     */\n    private static $valueBinder;\n\n    /**\n     *    Value of the cell\n     *\n     *    @var    mixed\n     */\n    private $value;\n\n    /**\n     *    Calculated value of the cell (used for caching)\n     *    This returns the value last calculated by MS Excel or whichever spreadsheet program was used to\n     *        create the original spreadsheet file.\n     *    Note that this value is not guaranteed to reflect the actual calculated value because it is\n     *        possible that auto-calculation was disabled in the original spreadsheet, and underlying data\n     *        values used by the formula have changed since it was last calculated.\n     *\n     *    @var mixed\n     */\n    private $calculatedValue;\n\n    /**\n     *    Type of the cell data\n     *\n     *    @var    string\n     */\n    private $dataType;\n\n    /**\n     *    Parent worksheet\n     *\n     *    @var    PHPExcel_CachedObjectStorage_CacheBase\n     */\n    private $parent;\n\n    /**\n     *    Index to cellXf\n     *\n     *    @var    int\n     */\n    private $xfIndex = 0;\n\n    /**\n     *    Attributes of the formula\n     *\n     */\n    private $formulaAttributes;\n\n\n    /**\n     *    Send notification to the cache controller\n     *\n     *    @return void\n     **/\n    public function notifyCacheController()\n    {\n        $this->parent->updateCacheData($this);\n\n        return $this;\n    }\n\n    public function detach()\n    {\n        $this->parent = null;\n    }\n\n    public function attach(PHPExcel_CachedObjectStorage_CacheBase $parent)\n    {\n        $this->parent = $parent;\n    }\n\n\n    /**\n     *    Create a new Cell\n     *\n     *    @param    mixed                $pValue\n     *    @param    string                $pDataType\n     *    @param    PHPExcel_Worksheet    $pSheet\n     *    @throws    PHPExcel_Exception\n     */\n    public function __construct($pValue = null, $pDataType = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // Initialise cell value\n        $this->value = $pValue;\n\n        // Set worksheet cache\n        $this->parent = $pSheet->getCellCacheController();\n\n        // Set datatype?\n        if ($pDataType !== null) {\n            if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2) {\n                $pDataType = PHPExcel_Cell_DataType::TYPE_STRING;\n            }\n            $this->dataType = $pDataType;\n        } elseif (!self::getValueBinder()->bindValue($this, $pValue)) {\n            throw new PHPExcel_Exception(\"Value could not be bound to cell.\");\n        }\n    }\n\n    /**\n     *    Get cell coordinate column\n     *\n     *    @return    string\n     */\n    public function getColumn()\n    {\n        return $this->parent->getCurrentColumn();\n    }\n\n    /**\n     *    Get cell coordinate row\n     *\n     *    @return    int\n     */\n    public function getRow()\n    {\n        return $this->parent->getCurrentRow();\n    }\n\n    /**\n     *    Get cell coordinate\n     *\n     *    @return    string\n     */\n    public function getCoordinate()\n    {\n        return $this->parent->getCurrentAddress();\n    }\n\n    /**\n     *    Get cell value\n     *\n     *    @return    mixed\n     */\n    public function getValue()\n    {\n        return $this->value;\n    }\n\n    /**\n     *    Get cell value with formatting\n     *\n     *    @return    string\n     */\n    public function getFormattedValue()\n    {\n        return (string) PHPExcel_Style_NumberFormat::toFormattedString(\n            $this->getCalculatedValue(),\n            $this->getStyle()\n                ->getNumberFormat()->getFormatCode()\n        );\n    }\n\n    /**\n     *    Set cell value\n     *\n     *    Sets the value for a cell, automatically determining the datatype using the value binder\n     *\n     *    @param    mixed    $pValue                    Value\n     *    @return    PHPExcel_Cell\n     *    @throws    PHPExcel_Exception\n     */\n    public function setValue($pValue = null)\n    {\n        if (!self::getValueBinder()->bindValue($this, $pValue)) {\n            throw new PHPExcel_Exception(\"Value could not be bound to cell.\");\n        }\n        return $this;\n    }\n\n    /**\n     *    Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder)\n     *\n     *    @param    mixed    $pValue            Value\n     *    @param    string    $pDataType        Explicit data type\n     *    @return    PHPExcel_Cell\n     *    @throws    PHPExcel_Exception\n     */\n    public function setValueExplicit($pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING)\n    {\n        // set the value according to data type\n        switch ($pDataType) {\n            case PHPExcel_Cell_DataType::TYPE_NULL:\n                $this->value = $pValue;\n                break;\n            case PHPExcel_Cell_DataType::TYPE_STRING2:\n                $pDataType = PHPExcel_Cell_DataType::TYPE_STRING;\n                // no break\n            case PHPExcel_Cell_DataType::TYPE_STRING:\n                // Synonym for string\n            case PHPExcel_Cell_DataType::TYPE_INLINE:\n                // Rich text\n                $this->value = PHPExcel_Cell_DataType::checkString($pValue);\n                break;\n            case PHPExcel_Cell_DataType::TYPE_NUMERIC:\n                $this->value = (float) $pValue;\n                break;\n            case PHPExcel_Cell_DataType::TYPE_FORMULA:\n                $this->value = (string) $pValue;\n                break;\n            case PHPExcel_Cell_DataType::TYPE_BOOL:\n                $this->value = (bool) $pValue;\n                break;\n            case PHPExcel_Cell_DataType::TYPE_ERROR:\n                $this->value = PHPExcel_Cell_DataType::checkErrorCode($pValue);\n                break;\n            default:\n                throw new PHPExcel_Exception('Invalid datatype: ' . $pDataType);\n                break;\n        }\n\n        // set the datatype\n        $this->dataType = $pDataType;\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *    Get calculated cell value\n     *\n     *    @deprecated        Since version 1.7.8 for planned changes to cell for array formula handling\n     *\n     *    @param    boolean $resetLog  Whether the calculation engine logger should be reset or not\n     *    @return    mixed\n     *    @throws    PHPExcel_Exception\n     */\n    public function getCalculatedValue($resetLog = true)\n    {\n//echo 'Cell '.$this->getCoordinate().' value is a '.$this->dataType.' with a value of '.$this->getValue().PHP_EOL;\n        if ($this->dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {\n            try {\n//echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value'.PHP_EOL;\n                $result = PHPExcel_Calculation::getInstance(\n                    $this->getWorksheet()->getParent()\n                )->calculateCellValue($this, $resetLog);\n//echo $this->getCoordinate().' calculation result is '.$result.PHP_EOL;\n                //    We don't yet handle array returns\n                if (is_array($result)) {\n                    while (is_array($result)) {\n                        $result = array_pop($result);\n                    }\n                }\n            } catch (PHPExcel_Exception $ex) {\n                if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->calculatedValue !== null)) {\n//echo 'Returning fallback value of '.$this->calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL;\n                    return $this->calculatedValue; // Fallback for calculations referencing external files.\n                }\n//echo 'Calculation Exception: '.$ex->getMessage().PHP_EOL;\n                $result = '#N/A';\n                throw new PHPExcel_Calculation_Exception(\n                    $this->getWorksheet()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage()\n                );\n            }\n\n            if ($result === '#Not Yet Implemented') {\n//echo 'Returning fallback value of '.$this->calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL;\n                return $this->calculatedValue; // Fallback if calculation engine does not support the formula.\n            }\n//echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().PHP_EOL;\n            return $result;\n        } elseif ($this->value instanceof PHPExcel_RichText) {\n//        echo 'Cell value for '.$this->getCoordinate().' is rich text: Returning data value of '.$this->value.'<br />';\n            return $this->value->getPlainText();\n        }\n//        echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->value.'<br />';\n        return $this->value;\n    }\n\n    /**\n     *    Set old calculated value (cached)\n     *\n     *    @param    mixed $pValue    Value\n     *    @return    PHPExcel_Cell\n     */\n    public function setCalculatedValue($pValue = null)\n    {\n        if ($pValue !== null) {\n            $this->calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue;\n        }\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *    Get old calculated value (cached)\n     *    This returns the value last calculated by MS Excel or whichever spreadsheet program was used to\n     *        create the original spreadsheet file.\n     *    Note that this value is not guaranteed to refelect the actual calculated value because it is\n     *        possible that auto-calculation was disabled in the original spreadsheet, and underlying data\n     *        values used by the formula have changed since it was last calculated.\n     *\n     *    @return    mixed\n     */\n    public function getOldCalculatedValue()\n    {\n        return $this->calculatedValue;\n    }\n\n    /**\n     *    Get cell data type\n     *\n     *    @return string\n     */\n    public function getDataType()\n    {\n        return $this->dataType;\n    }\n\n    /**\n     *    Set cell data type\n     *\n     *    @param    string $pDataType\n     *    @return    PHPExcel_Cell\n     */\n    public function setDataType($pDataType = PHPExcel_Cell_DataType::TYPE_STRING)\n    {\n        if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2) {\n            $pDataType = PHPExcel_Cell_DataType::TYPE_STRING;\n        }\n        $this->dataType = $pDataType;\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *  Identify if the cell contains a formula\n     *\n     *  @return boolean\n     */\n    public function isFormula()\n    {\n        return $this->dataType == PHPExcel_Cell_DataType::TYPE_FORMULA;\n    }\n\n    /**\n     *    Does this cell contain Data validation rules?\n     *\n     *    @return    boolean\n     *    @throws    PHPExcel_Exception\n     */\n    public function hasDataValidation()\n    {\n        if (!isset($this->parent)) {\n            throw new PHPExcel_Exception('Cannot check for data validation when cell is not bound to a worksheet');\n        }\n\n        return $this->getWorksheet()->dataValidationExists($this->getCoordinate());\n    }\n\n    /**\n     *    Get Data validation rules\n     *\n     *    @return    PHPExcel_Cell_DataValidation\n     *    @throws    PHPExcel_Exception\n     */\n    public function getDataValidation()\n    {\n        if (!isset($this->parent)) {\n            throw new PHPExcel_Exception('Cannot get data validation for cell that is not bound to a worksheet');\n        }\n\n        return $this->getWorksheet()->getDataValidation($this->getCoordinate());\n    }\n\n    /**\n     *    Set Data validation rules\n     *\n     *    @param    PHPExcel_Cell_DataValidation    $pDataValidation\n     *    @return    PHPExcel_Cell\n     *    @throws    PHPExcel_Exception\n     */\n    public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = null)\n    {\n        if (!isset($this->parent)) {\n            throw new PHPExcel_Exception('Cannot set data validation for cell that is not bound to a worksheet');\n        }\n\n        $this->getWorksheet()->setDataValidation($this->getCoordinate(), $pDataValidation);\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *    Does this cell contain a Hyperlink?\n     *\n     *    @return boolean\n     *    @throws    PHPExcel_Exception\n     */\n    public function hasHyperlink()\n    {\n        if (!isset($this->parent)) {\n            throw new PHPExcel_Exception('Cannot check for hyperlink when cell is not bound to a worksheet');\n        }\n\n        return $this->getWorksheet()->hyperlinkExists($this->getCoordinate());\n    }\n\n    /**\n     *    Get Hyperlink\n     *\n     *    @return    PHPExcel_Cell_Hyperlink\n     *    @throws    PHPExcel_Exception\n     */\n    public function getHyperlink()\n    {\n        if (!isset($this->parent)) {\n            throw new PHPExcel_Exception('Cannot get hyperlink for cell that is not bound to a worksheet');\n        }\n\n        return $this->getWorksheet()->getHyperlink($this->getCoordinate());\n    }\n\n    /**\n     *    Set Hyperlink\n     *\n     *    @param    PHPExcel_Cell_Hyperlink    $pHyperlink\n     *    @return    PHPExcel_Cell\n     *    @throws    PHPExcel_Exception\n     */\n    public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = null)\n    {\n        if (!isset($this->parent)) {\n            throw new PHPExcel_Exception('Cannot set hyperlink for cell that is not bound to a worksheet');\n        }\n\n        $this->getWorksheet()->setHyperlink($this->getCoordinate(), $pHyperlink);\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *    Get parent worksheet\n     *\n     *    @return PHPExcel_CachedObjectStorage_CacheBase\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     *    Get parent worksheet\n     *\n     *    @return PHPExcel_Worksheet\n     */\n    public function getWorksheet()\n    {\n        return $this->parent->getParent();\n    }\n\n    /**\n     *    Is this cell in a merge range\n     *\n     *    @return boolean\n     */\n    public function isInMergeRange()\n    {\n        return (boolean) $this->getMergeRange();\n    }\n\n    /**\n     *    Is this cell the master (top left cell) in a merge range (that holds the actual data value)\n     *\n     *    @return boolean\n     */\n    public function isMergeRangeValueCell()\n    {\n        if ($mergeRange = $this->getMergeRange()) {\n            $mergeRange = PHPExcel_Cell::splitRange($mergeRange);\n            list($startCell) = $mergeRange[0];\n            if ($this->getCoordinate() === $startCell) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     *    If this cell is in a merge range, then return the range\n     *\n     *    @return string\n     */\n    public function getMergeRange()\n    {\n        foreach ($this->getWorksheet()->getMergeCells() as $mergeRange) {\n            if ($this->isInRange($mergeRange)) {\n                return $mergeRange;\n            }\n        }\n        return false;\n    }\n\n    /**\n     *    Get cell style\n     *\n     *    @return    PHPExcel_Style\n     */\n    public function getStyle()\n    {\n        return $this->getWorksheet()->getStyle($this->getCoordinate());\n    }\n\n    /**\n     *    Re-bind parent\n     *\n     *    @param    PHPExcel_Worksheet $parent\n     *    @return    PHPExcel_Cell\n     */\n    public function rebindParent(PHPExcel_Worksheet $parent)\n    {\n        $this->parent = $parent->getCellCacheController();\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *    Is cell in a specific range?\n     *\n     *    @param    string    $pRange        Cell range (e.g. A1:A1)\n     *    @return    boolean\n     */\n    public function isInRange($pRange = 'A1:A1')\n    {\n        list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange);\n\n        // Translate properties\n        $myColumn = self::columnIndexFromString($this->getColumn());\n        $myRow    = $this->getRow();\n\n        // Verify if cell is in range\n        return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) &&\n                ($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow)\n               );\n    }\n\n    /**\n     *    Coordinate from string\n     *\n     *    @param    string    $pCoordinateString\n     *    @return    array    Array containing column and row (indexes 0 and 1)\n     *    @throws    PHPExcel_Exception\n     */\n    public static function coordinateFromString($pCoordinateString = 'A1')\n    {\n        if (preg_match(\"/^([$]?[A-Z]{1,3})([$]?\\d{1,7})$/\", $pCoordinateString, $matches)) {\n            return array($matches[1],$matches[2]);\n        } elseif ((strpos($pCoordinateString, ':') !== false) || (strpos($pCoordinateString, ',') !== false)) {\n            throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells');\n        } elseif ($pCoordinateString == '') {\n            throw new PHPExcel_Exception('Cell coordinate can not be zero-length string');\n        }\n\n        throw new PHPExcel_Exception('Invalid cell coordinate '.$pCoordinateString);\n    }\n\n    /**\n     *    Make string row, column or cell coordinate absolute\n     *\n     *    @param    string    $pCoordinateString        e.g. 'A' or '1' or 'A1'\n     *                    Note that this value can be a row or column reference as well as a cell reference\n     *    @return    string    Absolute coordinate        e.g. '$A' or '$1' or '$A$1'\n     *    @throws    PHPExcel_Exception\n     */\n    public static function absoluteReference($pCoordinateString = 'A1')\n    {\n        if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) {\n            // Split out any worksheet name from the reference\n            $worksheet = '';\n            $cellAddress = explode('!', $pCoordinateString);\n            if (count($cellAddress) > 1) {\n                list($worksheet, $pCoordinateString) = $cellAddress;\n            }\n            if ($worksheet > '') {\n                $worksheet .= '!';\n            }\n\n            // Create absolute coordinate\n            if (ctype_digit($pCoordinateString)) {\n                return $worksheet . '$' . $pCoordinateString;\n            } elseif (ctype_alpha($pCoordinateString)) {\n                return $worksheet . '$' . strtoupper($pCoordinateString);\n            }\n            return $worksheet . self::absoluteCoordinate($pCoordinateString);\n        }\n\n        throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells');\n    }\n\n    /**\n     *    Make string coordinate absolute\n     *\n     *    @param    string    $pCoordinateString        e.g. 'A1'\n     *    @return    string    Absolute coordinate        e.g. '$A$1'\n     *    @throws    PHPExcel_Exception\n     */\n    public static function absoluteCoordinate($pCoordinateString = 'A1')\n    {\n        if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) {\n            // Split out any worksheet name from the coordinate\n            $worksheet = '';\n            $cellAddress = explode('!', $pCoordinateString);\n            if (count($cellAddress) > 1) {\n                list($worksheet, $pCoordinateString) = $cellAddress;\n            }\n            if ($worksheet > '') {\n                $worksheet .= '!';\n            }\n\n            // Create absolute coordinate\n            list($column, $row) = self::coordinateFromString($pCoordinateString);\n            $column = ltrim($column, '$');\n            $row = ltrim($row, '$');\n            return $worksheet . '$' . $column . '$' . $row;\n        }\n\n        throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells');\n    }\n\n    /**\n     *    Split range into coordinate strings\n     *\n     *    @param    string    $pRange        e.g. 'B4:D9' or 'B4:D9,H2:O11' or 'B4'\n     *    @return    array    Array containg one or more arrays containing one or two coordinate strings\n     *                                e.g. array('B4','D9') or array(array('B4','D9'),array('H2','O11'))\n     *                                        or array('B4')\n     */\n    public static function splitRange($pRange = 'A1:A1')\n    {\n        // Ensure $pRange is a valid range\n        if (empty($pRange)) {\n            $pRange = self::DEFAULT_RANGE;\n        }\n\n        $exploded = explode(',', $pRange);\n        $counter = count($exploded);\n        for ($i = 0; $i < $counter; ++$i) {\n            $exploded[$i] = explode(':', $exploded[$i]);\n        }\n        return $exploded;\n    }\n\n    /**\n     *    Build range from coordinate strings\n     *\n     *    @param    array    $pRange    Array containg one or more arrays containing one or two coordinate strings\n     *    @return    string    String representation of $pRange\n     *    @throws    PHPExcel_Exception\n     */\n    public static function buildRange($pRange)\n    {\n        // Verify range\n        if (!is_array($pRange) || empty($pRange) || !is_array($pRange[0])) {\n            throw new PHPExcel_Exception('Range does not contain any information');\n        }\n\n        // Build range\n        $imploded = array();\n        $counter = count($pRange);\n        for ($i = 0; $i < $counter; ++$i) {\n            $pRange[$i] = implode(':', $pRange[$i]);\n        }\n        $imploded = implode(',', $pRange);\n\n        return $imploded;\n    }\n\n    /**\n     *    Calculate range boundaries\n     *\n     *    @param    string    $pRange        Cell range (e.g. A1:A1)\n     *    @return    array    Range coordinates array(Start Cell, End Cell)\n     *                    where Start Cell and End Cell are arrays (Column Number, Row Number)\n     */\n    public static function rangeBoundaries($pRange = 'A1:A1')\n    {\n        // Ensure $pRange is a valid range\n        if (empty($pRange)) {\n            $pRange = self::DEFAULT_RANGE;\n        }\n\n        // Uppercase coordinate\n        $pRange = strtoupper($pRange);\n\n        // Extract range\n        if (strpos($pRange, ':') === false) {\n            $rangeA = $rangeB = $pRange;\n        } else {\n            list($rangeA, $rangeB) = explode(':', $pRange);\n        }\n\n        // Calculate range outer borders\n        $rangeStart = self::coordinateFromString($rangeA);\n        $rangeEnd    = self::coordinateFromString($rangeB);\n\n        // Translate column into index\n        $rangeStart[0]    = self::columnIndexFromString($rangeStart[0]);\n        $rangeEnd[0]    = self::columnIndexFromString($rangeEnd[0]);\n\n        return array($rangeStart, $rangeEnd);\n    }\n\n    /**\n     *    Calculate range dimension\n     *\n     *    @param    string    $pRange        Cell range (e.g. A1:A1)\n     *    @return    array    Range dimension (width, height)\n     */\n    public static function rangeDimension($pRange = 'A1:A1')\n    {\n        // Calculate range outer borders\n        list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange);\n\n        return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) );\n    }\n\n    /**\n     *    Calculate range boundaries\n     *\n     *    @param    string    $pRange        Cell range (e.g. A1:A1)\n     *    @return    array    Range coordinates array(Start Cell, End Cell)\n     *                    where Start Cell and End Cell are arrays (Column ID, Row Number)\n     */\n    public static function getRangeBoundaries($pRange = 'A1:A1')\n    {\n        // Ensure $pRange is a valid range\n        if (empty($pRange)) {\n            $pRange = self::DEFAULT_RANGE;\n        }\n\n        // Uppercase coordinate\n        $pRange = strtoupper($pRange);\n\n        // Extract range\n        if (strpos($pRange, ':') === false) {\n            $rangeA = $rangeB = $pRange;\n        } else {\n            list($rangeA, $rangeB) = explode(':', $pRange);\n        }\n\n        return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB));\n    }\n\n    /**\n     *    Column index from string\n     *\n     *    @param    string $pString\n     *    @return    int Column index (base 1 !!!)\n     */\n    public static function columnIndexFromString($pString = 'A')\n    {\n        //    Using a lookup cache adds a slight memory overhead, but boosts speed\n        //    caching using a static within the method is faster than a class static,\n        //        though it's additional memory overhead\n        static $_indexCache = array();\n\n        if (isset($_indexCache[$pString])) {\n            return $_indexCache[$pString];\n        }\n        //    It's surprising how costly the strtoupper() and ord() calls actually are, so we use a lookup array rather than use ord()\n        //        and make it case insensitive to get rid of the strtoupper() as well. Because it's a static, there's no significant\n        //        memory overhead either\n        static $_columnLookup = array(\n            'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 11, 'L' => 12, 'M' => 13,\n            'N' => 14, 'O' => 15, 'P' => 16, 'Q' => 17, 'R' => 18, 'S' => 19, 'T' => 20, 'U' => 21, 'V' => 22, 'W' => 23, 'X' => 24, 'Y' => 25, 'Z' => 26,\n            'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10, 'k' => 11, 'l' => 12, 'm' => 13,\n            'n' => 14, 'o' => 15, 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26\n        );\n\n        //    We also use the language construct isset() rather than the more costly strlen() function to match the length of $pString\n        //        for improved performance\n        if (isset($pString{0})) {\n            if (!isset($pString{1})) {\n                $_indexCache[$pString] = $_columnLookup[$pString];\n                return $_indexCache[$pString];\n            } elseif (!isset($pString{2})) {\n                $_indexCache[$pString] = $_columnLookup[$pString{0}] * 26 + $_columnLookup[$pString{1}];\n                return $_indexCache[$pString];\n            } elseif (!isset($pString{3})) {\n                $_indexCache[$pString] = $_columnLookup[$pString{0}] * 676 + $_columnLookup[$pString{1}] * 26 + $_columnLookup[$pString{2}];\n                return $_indexCache[$pString];\n            }\n        }\n        throw new PHPExcel_Exception(\"Column string index can not be \" . ((isset($pString{0})) ? \"longer than 3 characters\" : \"empty\"));\n    }\n\n    /**\n     *    String from columnindex\n     *\n     *    @param    int $pColumnIndex Column index (base 0 !!!)\n     *    @return    string\n     */\n    public static function stringFromColumnIndex($pColumnIndex = 0)\n    {\n        //    Using a lookup cache adds a slight memory overhead, but boosts speed\n        //    caching using a static within the method is faster than a class static,\n        //        though it's additional memory overhead\n        static $_indexCache = array();\n\n        if (!isset($_indexCache[$pColumnIndex])) {\n            // Determine column string\n            if ($pColumnIndex < 26) {\n                $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);\n            } elseif ($pColumnIndex < 702) {\n                $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) .\n                                              chr(65 + $pColumnIndex % 26);\n            } else {\n                $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) .\n                                              chr(65 + ((($pColumnIndex - 26) % 676) / 26)) .\n                                              chr(65 + $pColumnIndex % 26);\n            }\n        }\n        return $_indexCache[$pColumnIndex];\n    }\n\n    /**\n     *    Extract all cell references in range\n     *\n     *    @param    string    $pRange        Range (e.g. A1 or A1:C10 or A1:E10 A20:E25)\n     *    @return    array    Array containing single cell references\n     */\n    public static function extractAllCellReferencesInRange($pRange = 'A1')\n    {\n        // Returnvalue\n        $returnValue = array();\n\n        // Explode spaces\n        $cellBlocks = explode(' ', str_replace('$', '', strtoupper($pRange)));\n        foreach ($cellBlocks as $cellBlock) {\n            // Single cell?\n            if (strpos($cellBlock, ':') === false && strpos($cellBlock, ',') === false) {\n                $returnValue[] = $cellBlock;\n                continue;\n            }\n\n            // Range...\n            $ranges = self::splitRange($cellBlock);\n            foreach ($ranges as $range) {\n                // Single cell?\n                if (!isset($range[1])) {\n                    $returnValue[] = $range[0];\n                    continue;\n                }\n\n                // Range...\n                list($rangeStart, $rangeEnd)    = $range;\n                sscanf($rangeStart, '%[A-Z]%d', $startCol, $startRow);\n                sscanf($rangeEnd, '%[A-Z]%d', $endCol, $endRow);\n                ++$endCol;\n\n                // Current data\n                $currentCol = $startCol;\n                $currentRow = $startRow;\n\n                // Loop cells\n                while ($currentCol != $endCol) {\n                    while ($currentRow <= $endRow) {\n                        $returnValue[] = $currentCol.$currentRow;\n                        ++$currentRow;\n                    }\n                    ++$currentCol;\n                    $currentRow = $startRow;\n                }\n            }\n        }\n\n        //    Sort the result by column and row\n        $sortKeys = array();\n        foreach (array_unique($returnValue) as $coord) {\n            sscanf($coord, '%[A-Z]%d', $column, $row);\n            $sortKeys[sprintf('%3s%09d', $column, $row)] = $coord;\n        }\n        ksort($sortKeys);\n\n        // Return value\n        return array_values($sortKeys);\n    }\n\n    /**\n     * Compare 2 cells\n     *\n     * @param    PHPExcel_Cell    $a    Cell a\n     * @param    PHPExcel_Cell    $b    Cell b\n     * @return    int        Result of comparison (always -1 or 1, never zero!)\n     */\n    public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b)\n    {\n        if ($a->getRow() < $b->getRow()) {\n            return -1;\n        } elseif ($a->getRow() > $b->getRow()) {\n            return 1;\n        } elseif (self::columnIndexFromString($a->getColumn()) < self::columnIndexFromString($b->getColumn())) {\n            return -1;\n        } else {\n            return 1;\n        }\n    }\n\n    /**\n     * Get value binder to use\n     *\n     * @return PHPExcel_Cell_IValueBinder\n     */\n    public static function getValueBinder()\n    {\n        if (self::$valueBinder === null) {\n            self::$valueBinder = new PHPExcel_Cell_DefaultValueBinder();\n        }\n\n        return self::$valueBinder;\n    }\n\n    /**\n     * Set value binder to use\n     *\n     * @param PHPExcel_Cell_IValueBinder $binder\n     * @throws PHPExcel_Exception\n     */\n    public static function setValueBinder(PHPExcel_Cell_IValueBinder $binder = null)\n    {\n        if ($binder === null) {\n            throw new PHPExcel_Exception(\"A PHPExcel_Cell_IValueBinder is required for PHPExcel to function correctly.\");\n        }\n\n        self::$valueBinder = $binder;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if ((is_object($value)) && ($key != 'parent')) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n\n    /**\n     * Get index to cellXf\n     *\n     * @return int\n     */\n    public function getXfIndex()\n    {\n        return $this->xfIndex;\n    }\n\n    /**\n     * Set index to cellXf\n     *\n     * @param int $pValue\n     * @return PHPExcel_Cell\n     */\n    public function setXfIndex($pValue = 0)\n    {\n        $this->xfIndex = $pValue;\n\n        return $this->notifyCacheController();\n    }\n\n    /**\n     *    @deprecated        Since version 1.7.8 for planned changes to cell for array formula handling\n     */\n    public function setFormulaAttributes($pAttributes)\n    {\n        $this->formulaAttributes = $pAttributes;\n        return $this;\n    }\n\n    /**\n     *    @deprecated        Since version 1.7.8 for planned changes to cell for array formula handling\n     */\n    public function getFormulaAttributes()\n    {\n        return $this->formulaAttributes;\n    }\n\n    /**\n     * Convert to string\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        return (string) $this->getValue();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Axis.php",
    "content": "<?php\n\n/**\n * Created by PhpStorm.\n * User: Wiktor Trzonkowski\n * Date: 6/17/14\n * Time: 12:11 PM\n */\n\nclass PHPExcel_Chart_Axis extends PHPExcel_Chart_Properties\n{\n    /**\n     * Axis Number\n     *\n     * @var  array of mixed\n     */\n    private $axisNumber = array(\n        'format' => self::FORMAT_CODE_GENERAL,\n        'source_linked' => 1\n    );\n\n    /**\n     * Axis Options\n     *\n     * @var  array of mixed\n     */\n    private $axisOptions = array(\n        'minimum' => null,\n        'maximum' => null,\n        'major_unit' => null,\n        'minor_unit' => null,\n        'orientation' => self::ORIENTATION_NORMAL,\n        'minor_tick_mark' => self::TICK_MARK_NONE,\n        'major_tick_mark' => self::TICK_MARK_NONE,\n        'axis_labels' => self::AXIS_LABELS_NEXT_TO,\n        'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO,\n        'horizontal_crosses_value' => null\n    );\n\n    /**\n     * Fill Properties\n     *\n     * @var  array of mixed\n     */\n    private $fillProperties = array(\n        'type' => self::EXCEL_COLOR_TYPE_ARGB,\n        'value' => null,\n        'alpha' => 0\n    );\n\n    /**\n     * Line Properties\n     *\n     * @var  array of mixed\n     */\n    private $lineProperties = array(\n        'type' => self::EXCEL_COLOR_TYPE_ARGB,\n        'value' => null,\n        'alpha' => 0\n    );\n\n    /**\n     * Line Style Properties\n     *\n     * @var  array of mixed\n     */\n    private $lineStyleProperties = array(\n        'width' => '9525',\n        'compound' => self::LINE_STYLE_COMPOUND_SIMPLE,\n        'dash' => self::LINE_STYLE_DASH_SOLID,\n        'cap' => self::LINE_STYLE_CAP_FLAT,\n        'join' => self::LINE_STYLE_JOIN_BEVEL,\n        'arrow' => array(\n            'head' => array(\n                'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,\n                'size' => self::LINE_STYLE_ARROW_SIZE_5\n            ),\n            'end' => array(\n                'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,\n                'size' => self::LINE_STYLE_ARROW_SIZE_8\n            ),\n        )\n    );\n\n    /**\n     * Shadow Properties\n     *\n     * @var  array of mixed\n     */\n    private $shadowProperties = array(\n        'presets' => self::SHADOW_PRESETS_NOSHADOW,\n        'effect' => null,\n        'color' => array(\n            'type' => self::EXCEL_COLOR_TYPE_STANDARD,\n            'value' => 'black',\n            'alpha' => 40,\n        ),\n        'size' => array(\n            'sx' => null,\n            'sy' => null,\n            'kx' => null\n        ),\n        'blur' => null,\n        'direction' => null,\n        'distance' => null,\n        'algn' => null,\n        'rotWithShape' => null\n    );\n\n    /**\n     * Glow Properties\n     *\n     * @var  array of mixed\n     */\n    private $glowProperties = array(\n        'size' => null,\n        'color' => array(\n            'type' => self::EXCEL_COLOR_TYPE_STANDARD,\n            'value' => 'black',\n            'alpha' => 40\n        )\n    );\n\n    /**\n     * Soft Edge Properties\n     *\n     * @var  array of mixed\n     */\n    private $softEdges = array(\n        'size' => null\n    );\n\n    /**\n     * Get Series Data Type\n     *\n     * @return  string\n     */\n    public function setAxisNumberProperties($format_code)\n    {\n        $this->axisNumber['format'] = (string) $format_code;\n        $this->axisNumber['source_linked'] = 0;\n    }\n\n    /**\n     * Get Axis Number Format Data Type\n     *\n     * @return  string\n     */\n    public function getAxisNumberFormat()\n    {\n        return $this->axisNumber['format'];\n    }\n\n    /**\n     * Get Axis Number Source Linked\n     *\n     * @return  string\n     */\n    public function getAxisNumberSourceLinked()\n    {\n        return (string) $this->axisNumber['source_linked'];\n    }\n\n    /**\n     * Set Axis Options Properties\n     *\n     * @param string $axis_labels\n     * @param string $horizontal_crosses_value\n     * @param string $horizontal_crosses\n     * @param string $axis_orientation\n     * @param string $major_tmt\n     * @param string $minor_tmt\n     * @param string $minimum\n     * @param string $maximum\n     * @param string $major_unit\n     * @param string $minor_unit\n     *\n     */\n    public function setAxisOptionsProperties($axis_labels, $horizontal_crosses_value = null, $horizontal_crosses = null, $axis_orientation = null, $major_tmt = null, $minor_tmt = null, $minimum = null, $maximum = null, $major_unit = null, $minor_unit = null)\n    {\n        $this->axisOptions['axis_labels'] = (string) $axis_labels;\n        ($horizontal_crosses_value !== null) ? $this->axisOptions['horizontal_crosses_value'] = (string) $horizontal_crosses_value : null;\n        ($horizontal_crosses !== null) ? $this->axisOptions['horizontal_crosses'] = (string) $horizontal_crosses : null;\n        ($axis_orientation !== null) ? $this->axisOptions['orientation'] = (string) $axis_orientation : null;\n        ($major_tmt !== null) ? $this->axisOptions['major_tick_mark'] = (string) $major_tmt : null;\n        ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null;\n        ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null;\n        ($minimum !== null) ? $this->axisOptions['minimum'] = (string) $minimum : null;\n        ($maximum !== null) ? $this->axisOptions['maximum'] = (string) $maximum : null;\n        ($major_unit !== null) ? $this->axisOptions['major_unit'] = (string) $major_unit : null;\n        ($minor_unit !== null) ? $this->axisOptions['minor_unit'] = (string) $minor_unit : null;\n    }\n\n    /**\n     * Get Axis Options Property\n     *\n     * @param string $property\n     *\n     * @return string\n     */\n    public function getAxisOptionsProperty($property)\n    {\n        return $this->axisOptions[$property];\n    }\n\n    /**\n     * Set Axis Orientation Property\n     *\n     * @param string $orientation\n     *\n     */\n    public function setAxisOrientation($orientation)\n    {\n        $this->orientation = (string) $orientation;\n    }\n\n    /**\n     * Set Fill Property\n     *\n     * @param string $color\n     * @param int $alpha\n     * @param string $type\n     *\n     */\n    public function setFillParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB)\n    {\n        $this->fillProperties = $this->setColorProperties($color, $alpha, $type);\n    }\n\n    /**\n     * Set Line Property\n     *\n     * @param string $color\n     * @param int $alpha\n     * @param string $type\n     *\n     */\n    public function setLineParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB)\n    {\n        $this->lineProperties = $this->setColorProperties($color, $alpha, $type);\n    }\n\n    /**\n     * Get Fill Property\n     *\n     * @param string $property\n     *\n     * @return string\n     */\n    public function getFillProperty($property)\n    {\n        return $this->fillProperties[$property];\n    }\n\n    /**\n     * Get Line Property\n     *\n     * @param string $property\n     *\n     * @return string\n     */\n    public function getLineProperty($property)\n    {\n        return $this->lineProperties[$property];\n    }\n\n    /**\n     * Set Line Style Properties\n     *\n     * @param float $line_width\n     * @param string $compound_type\n     * @param string $dash_type\n     * @param string $cap_type\n     * @param string $join_type\n     * @param string $head_arrow_type\n     * @param string $head_arrow_size\n     * @param string $end_arrow_type\n     * @param string $end_arrow_size\n     *\n     */\n    public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null)\n    {\n        (!is_null($line_width)) ? $this->lineStyleProperties['width'] = $this->getExcelPointsWidth((float) $line_width) : null;\n        (!is_null($compound_type)) ? $this->lineStyleProperties['compound'] = (string) $compound_type : null;\n        (!is_null($dash_type)) ? $this->lineStyleProperties['dash'] = (string) $dash_type : null;\n        (!is_null($cap_type)) ? $this->lineStyleProperties['cap'] = (string) $cap_type : null;\n        (!is_null($join_type)) ? $this->lineStyleProperties['join'] = (string) $join_type : null;\n        (!is_null($head_arrow_type)) ? $this->lineStyleProperties['arrow']['head']['type'] = (string) $head_arrow_type : null;\n        (!is_null($head_arrow_size)) ? $this->lineStyleProperties['arrow']['head']['size'] = (string) $head_arrow_size : null;\n        (!is_null($end_arrow_type)) ? $this->lineStyleProperties['arrow']['end']['type'] = (string) $end_arrow_type : null;\n        (!is_null($end_arrow_size)) ? $this->lineStyleProperties['arrow']['end']['size'] = (string) $end_arrow_size : null;\n    }\n\n    /**\n     * Get Line Style Property\n     *\n     * @param array|string $elements\n     *\n     * @return string\n     */\n    public function getLineStyleProperty($elements)\n    {\n        return $this->getArrayElementsValue($this->lineStyleProperties, $elements);\n    }\n\n    /**\n     * Get Line Style Arrow Excel Width\n     *\n     * @param string $arrow\n     *\n     * @return string\n     */\n    public function getLineStyleArrowWidth($arrow)\n    {\n        return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'w');\n    }\n\n    /**\n     * Get Line Style Arrow Excel Length\n     *\n     * @param string $arrow\n     *\n     * @return string\n     */\n    public function getLineStyleArrowLength($arrow)\n    {\n        return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'len');\n    }\n\n    /**\n     * Set Shadow Properties\n     *\n     * @param int $shadow_presets\n     * @param string $sh_color_value\n     * @param string $sh_color_type\n     * @param string $sh_color_alpha\n     * @param float $sh_blur\n     * @param int $sh_angle\n     * @param float $sh_distance\n     *\n     */\n    public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null)\n    {\n        $this->setShadowPresetsProperties((int) $sh_presets)\n            ->setShadowColor(\n                is_null($sh_color_value) ? $this->shadowProperties['color']['value'] : $sh_color_value,\n                is_null($sh_color_alpha) ? (int) $this->shadowProperties['color']['alpha'] : $sh_color_alpha,\n                is_null($sh_color_type) ? $this->shadowProperties['color']['type'] : $sh_color_type\n            )\n            ->setShadowBlur($sh_blur)\n            ->setShadowAngle($sh_angle)\n            ->setShadowDistance($sh_distance);\n    }\n\n    /**\n     * Set Shadow Color\n     *\n     * @param int $shadow_presets\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setShadowPresetsProperties($shadow_presets)\n    {\n        $this->shadowProperties['presets'] = $shadow_presets;\n        $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets));\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Properties from Maped Values\n     *\n     * @param array $properties_map\n     * @param * $reference\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setShadowProperiesMapValues(array $properties_map, &$reference = null)\n    {\n        $base_reference = $reference;\n        foreach ($properties_map as $property_key => $property_val) {\n            if (is_array($property_val)) {\n                if ($reference === null) {\n                    $reference = & $this->shadowProperties[$property_key];\n                } else {\n                    $reference = & $reference[$property_key];\n                }\n                $this->setShadowProperiesMapValues($property_val, $reference);\n            } else {\n                if ($base_reference === null) {\n                    $this->shadowProperties[$property_key] = $property_val;\n                } else {\n                    $reference[$property_key] = $property_val;\n                }\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Color\n     *\n     * @param string $color\n     * @param int $alpha\n     * @param string $type\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setShadowColor($color, $alpha, $type)\n    {\n        $this->shadowProperties['color'] = $this->setColorProperties($color, $alpha, $type);\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Blur\n     *\n     * @param float $blur\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setShadowBlur($blur)\n    {\n        if ($blur !== null) {\n            $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Angle\n     *\n     * @param int $angle\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setShadowAngle($angle)\n    {\n        if ($angle !== null) {\n            $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Distance\n     *\n     * @param float $distance\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setShadowDistance($distance)\n    {\n        if ($distance !== null) {\n            $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get Glow Property\n     *\n     * @param float $size\n     * @param string $color_value\n     * @param int $color_alpha\n     * @param string $color_type\n     */\n    public function getShadowProperty($elements)\n    {\n        return $this->getArrayElementsValue($this->shadowProperties, $elements);\n    }\n\n    /**\n     * Set Glow Properties\n     *\n     * @param float $size\n     * @param string $color_value\n     * @param int $color_alpha\n     * @param string $color_type\n     */\n    public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null)\n    {\n        $this->setGlowSize($size)\n            ->setGlowColor(\n                is_null($color_value) ? $this->glowProperties['color']['value'] : $color_value,\n                is_null($color_alpha) ? (int) $this->glowProperties['color']['alpha'] : $color_alpha,\n                is_null($color_type) ? $this->glowProperties['color']['type'] : $color_type\n            );\n    }\n\n    /**\n     * Get Glow Property\n     *\n     * @param array|string $property\n     *\n     * @return string\n     */\n    public function getGlowProperty($property)\n    {\n        return $this->getArrayElementsValue($this->glowProperties, $property);\n    }\n\n    /**\n     * Set Glow Color\n     *\n     * @param float $size\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setGlowSize($size)\n    {\n        if (!is_null($size)) {\n            $this->glowProperties['size'] = $this->getExcelPointsWidth($size);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Glow Color\n     *\n     * @param string $color\n     * @param int $alpha\n     * @param string $type\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    private function setGlowColor($color, $alpha, $type)\n    {\n        $this->glowProperties['color'] = $this->setColorProperties($color, $alpha, $type);\n\n        return $this;\n    }\n\n    /**\n     * Set Soft Edges Size\n     *\n     * @param float $size\n     */\n    public function setSoftEdges($size)\n    {\n        if (!is_null($size)) {\n            $softEdges['size'] = (string) $this->getExcelPointsWidth($size);\n        }\n    }\n\n    /**\n     * Get Soft Edges Size\n     *\n     * @return string\n     */\n    public function getSoftEdgesSize()\n    {\n        return $this->softEdges['size'];\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/DataSeries.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Chart_DataSeries\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Chart_DataSeries\n{\n    const TYPE_BARCHART        = 'barChart';\n    const TYPE_BARCHART_3D     = 'bar3DChart';\n    const TYPE_LINECHART       = 'lineChart';\n    const TYPE_LINECHART_3D    = 'line3DChart';\n    const TYPE_AREACHART       = 'areaChart';\n    const TYPE_AREACHART_3D    = 'area3DChart';\n    const TYPE_PIECHART        = 'pieChart';\n    const TYPE_PIECHART_3D     = 'pie3DChart';\n    const TYPE_DOUGHTNUTCHART  = 'doughnutChart';\n    const TYPE_DONUTCHART      = self::TYPE_DOUGHTNUTCHART;    //    Synonym\n    const TYPE_SCATTERCHART    = 'scatterChart';\n    const TYPE_SURFACECHART    = 'surfaceChart';\n    const TYPE_SURFACECHART_3D = 'surface3DChart';\n    const TYPE_RADARCHART      = 'radarChart';\n    const TYPE_BUBBLECHART     = 'bubbleChart';\n    const TYPE_STOCKCHART      = 'stockChart';\n    const TYPE_CANDLECHART     = self::TYPE_STOCKCHART;       //    Synonym\n\n    const GROUPING_CLUSTERED       = 'clustered';\n    const GROUPING_STACKED         = 'stacked';\n    const GROUPING_PERCENT_STACKED = 'percentStacked';\n    const GROUPING_STANDARD        = 'standard';\n\n    const DIRECTION_BAR        = 'bar';\n    const DIRECTION_HORIZONTAL = self::DIRECTION_BAR;\n    const DIRECTION_COL        = 'col';\n    const DIRECTION_COLUMN     = self::DIRECTION_COL;\n    const DIRECTION_VERTICAL   = self::DIRECTION_COL;\n\n    const STYLE_LINEMARKER   = 'lineMarker';\n    const STYLE_SMOOTHMARKER = 'smoothMarker';\n    const STYLE_MARKER       = 'marker';\n    const STYLE_FILLED       = 'filled';\n\n\n    /**\n     * Series Plot Type\n     *\n     * @var string\n     */\n    private $plotType;\n\n    /**\n     * Plot Grouping Type\n     *\n     * @var boolean\n     */\n    private $plotGrouping;\n\n    /**\n     * Plot Direction\n     *\n     * @var boolean\n     */\n    private $plotDirection;\n\n    /**\n     * Plot Style\n     *\n     * @var string\n     */\n    private $plotStyle;\n\n    /**\n     * Order of plots in Series\n     *\n     * @var array of integer\n     */\n    private $plotOrder = array();\n\n    /**\n     * Plot Label\n     *\n     * @var array of PHPExcel_Chart_DataSeriesValues\n     */\n    private $plotLabel = array();\n\n    /**\n     * Plot Category\n     *\n     * @var array of PHPExcel_Chart_DataSeriesValues\n     */\n    private $plotCategory = array();\n\n    /**\n     * Smooth Line\n     *\n     * @var string\n     */\n    private $smoothLine;\n\n    /**\n     * Plot Values\n     *\n     * @var array of PHPExcel_Chart_DataSeriesValues\n     */\n    private $plotValues = array();\n\n    /**\n     * Create a new PHPExcel_Chart_DataSeries\n     */\n    public function __construct($plotType = null, $plotGrouping = null, $plotOrder = array(), $plotLabel = array(), $plotCategory = array(), $plotValues = array(), $plotDirection = null, $smoothLine = null, $plotStyle = null)\n    {\n        $this->plotType = $plotType;\n        $this->plotGrouping = $plotGrouping;\n        $this->plotOrder = $plotOrder;\n        $keys = array_keys($plotValues);\n        $this->plotValues = $plotValues;\n        if ((count($plotLabel) == 0) || (is_null($plotLabel[$keys[0]]))) {\n            $plotLabel[$keys[0]] = new PHPExcel_Chart_DataSeriesValues();\n        }\n\n        $this->plotLabel = $plotLabel;\n        if ((count($plotCategory) == 0) || (is_null($plotCategory[$keys[0]]))) {\n            $plotCategory[$keys[0]] = new PHPExcel_Chart_DataSeriesValues();\n        }\n        $this->plotCategory = $plotCategory;\n        $this->smoothLine = $smoothLine;\n        $this->plotStyle = $plotStyle;\n        \n        if (is_null($plotDirection)) {\n            $plotDirection = self::DIRECTION_COL;\n        }\n        $this->plotDirection = $plotDirection;\n    }\n\n    /**\n     * Get Plot Type\n     *\n     * @return string\n     */\n    public function getPlotType()\n    {\n        return $this->plotType;\n    }\n\n    /**\n     * Set Plot Type\n     *\n     * @param string $plotType\n     * @return PHPExcel_Chart_DataSeries\n     */\n    public function setPlotType($plotType = '')\n    {\n        $this->plotType = $plotType;\n        return $this;\n    }\n\n    /**\n     * Get Plot Grouping Type\n     *\n     * @return string\n     */\n    public function getPlotGrouping()\n    {\n        return $this->plotGrouping;\n    }\n\n    /**\n     * Set Plot Grouping Type\n     *\n     * @param string $groupingType\n     * @return PHPExcel_Chart_DataSeries\n     */\n    public function setPlotGrouping($groupingType = null)\n    {\n        $this->plotGrouping = $groupingType;\n        return $this;\n    }\n\n    /**\n     * Get Plot Direction\n     *\n     * @return string\n     */\n    public function getPlotDirection()\n    {\n        return $this->plotDirection;\n    }\n\n    /**\n     * Set Plot Direction\n     *\n     * @param string $plotDirection\n     * @return PHPExcel_Chart_DataSeries\n     */\n    public function setPlotDirection($plotDirection = null)\n    {\n        $this->plotDirection = $plotDirection;\n        return $this;\n    }\n\n    /**\n     * Get Plot Order\n     *\n     * @return string\n     */\n    public function getPlotOrder()\n    {\n        return $this->plotOrder;\n    }\n\n    /**\n     * Get Plot Labels\n     *\n     * @return array of PHPExcel_Chart_DataSeriesValues\n     */\n    public function getPlotLabels()\n    {\n        return $this->plotLabel;\n    }\n\n    /**\n     * Get Plot Label by Index\n     *\n     * @return PHPExcel_Chart_DataSeriesValues\n     */\n    public function getPlotLabelByIndex($index)\n    {\n        $keys = array_keys($this->plotLabel);\n        if (in_array($index, $keys)) {\n            return $this->plotLabel[$index];\n        } elseif (isset($keys[$index])) {\n            return $this->plotLabel[$keys[$index]];\n        }\n        return false;\n    }\n\n    /**\n     * Get Plot Categories\n     *\n     * @return array of PHPExcel_Chart_DataSeriesValues\n     */\n    public function getPlotCategories()\n    {\n        return $this->plotCategory;\n    }\n\n    /**\n     * Get Plot Category by Index\n     *\n     * @return PHPExcel_Chart_DataSeriesValues\n     */\n    public function getPlotCategoryByIndex($index)\n    {\n        $keys = array_keys($this->plotCategory);\n        if (in_array($index, $keys)) {\n            return $this->plotCategory[$index];\n        } elseif (isset($keys[$index])) {\n            return $this->plotCategory[$keys[$index]];\n        }\n        return false;\n    }\n\n    /**\n     * Get Plot Style\n     *\n     * @return string\n     */\n    public function getPlotStyle()\n    {\n        return $this->plotStyle;\n    }\n\n    /**\n     * Set Plot Style\n     *\n     * @param string $plotStyle\n     * @return PHPExcel_Chart_DataSeries\n     */\n    public function setPlotStyle($plotStyle = null)\n    {\n        $this->plotStyle = $plotStyle;\n        return $this;\n    }\n\n    /**\n     * Get Plot Values\n     *\n     * @return array of PHPExcel_Chart_DataSeriesValues\n     */\n    public function getPlotValues()\n    {\n        return $this->plotValues;\n    }\n\n    /**\n     * Get Plot Values by Index\n     *\n     * @return PHPExcel_Chart_DataSeriesValues\n     */\n    public function getPlotValuesByIndex($index)\n    {\n        $keys = array_keys($this->plotValues);\n        if (in_array($index, $keys)) {\n            return $this->plotValues[$index];\n        } elseif (isset($keys[$index])) {\n            return $this->plotValues[$keys[$index]];\n        }\n        return false;\n    }\n\n    /**\n     * Get Number of Plot Series\n     *\n     * @return integer\n     */\n    public function getPlotSeriesCount()\n    {\n        return count($this->plotValues);\n    }\n\n    /**\n     * Get Smooth Line\n     *\n     * @return boolean\n     */\n    public function getSmoothLine()\n    {\n        return $this->smoothLine;\n    }\n\n    /**\n     * Set Smooth Line\n     *\n     * @param boolean $smoothLine\n     * @return PHPExcel_Chart_DataSeries\n     */\n    public function setSmoothLine($smoothLine = true)\n    {\n        $this->smoothLine = $smoothLine;\n        return $this;\n    }\n\n    public function refresh(PHPExcel_Worksheet $worksheet)\n    {\n        foreach ($this->plotValues as $plotValues) {\n            if ($plotValues !== null) {\n                $plotValues->refresh($worksheet, true);\n            }\n        }\n        foreach ($this->plotLabel as $plotValues) {\n            if ($plotValues !== null) {\n                $plotValues->refresh($worksheet, true);\n            }\n        }\n        foreach ($this->plotCategory as $plotValues) {\n            if ($plotValues !== null) {\n                $plotValues->refresh($worksheet, false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/DataSeriesValues.php",
    "content": "<?php\n\n/**\n * PHPExcel_Chart_DataSeriesValues\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart_DataSeriesValues\n{\n\n    const DATASERIES_TYPE_STRING    = 'String';\n    const DATASERIES_TYPE_NUMBER    = 'Number';\n\n    private static $dataTypeValues = array(\n        self::DATASERIES_TYPE_STRING,\n        self::DATASERIES_TYPE_NUMBER,\n    );\n\n    /**\n     * Series Data Type\n     *\n     * @var    string\n     */\n    private $dataType;\n\n    /**\n     * Series Data Source\n     *\n     * @var    string\n     */\n    private $dataSource;\n\n    /**\n     * Format Code\n     *\n     * @var    string\n     */\n    private $formatCode;\n\n    /**\n     * Series Point Marker\n     *\n     * @var    string\n     */\n    private $pointMarker;\n\n    /**\n     * Point Count (The number of datapoints in the dataseries)\n     *\n     * @var    integer\n     */\n    private $pointCount = 0;\n\n    /**\n     * Data Values\n     *\n     * @var    array of mixed\n     */\n    private $dataValues = array();\n\n    /**\n     * Create a new PHPExcel_Chart_DataSeriesValues object\n     */\n    public function __construct($dataType = self::DATASERIES_TYPE_NUMBER, $dataSource = null, $formatCode = null, $pointCount = 0, $dataValues = array(), $marker = null)\n    {\n        $this->setDataType($dataType);\n        $this->dataSource = $dataSource;\n        $this->formatCode = $formatCode;\n        $this->pointCount = $pointCount;\n        $this->dataValues = $dataValues;\n        $this->pointMarker = $marker;\n    }\n\n    /**\n     * Get Series Data Type\n     *\n     * @return    string\n     */\n    public function getDataType()\n    {\n        return $this->dataType;\n    }\n\n    /**\n     * Set Series Data Type\n     *\n     * @param    string    $dataType    Datatype of this data series\n     *                                Typical values are:\n     *                                    PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_STRING\n     *                                        Normally used for axis point values\n     *                                    PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_NUMBER\n     *                                        Normally used for chart data values\n     * @return    PHPExcel_Chart_DataSeriesValues\n     */\n    public function setDataType($dataType = self::DATASERIES_TYPE_NUMBER)\n    {\n        if (!in_array($dataType, self::$dataTypeValues)) {\n            throw new PHPExcel_Chart_Exception('Invalid datatype for chart data series values');\n        }\n        $this->dataType = $dataType;\n\n        return $this;\n    }\n\n    /**\n     * Get Series Data Source (formula)\n     *\n     * @return    string\n     */\n    public function getDataSource()\n    {\n        return $this->dataSource;\n    }\n\n    /**\n     * Set Series Data Source (formula)\n     *\n     * @param    string    $dataSource\n     * @return    PHPExcel_Chart_DataSeriesValues\n     */\n    public function setDataSource($dataSource = null, $refreshDataValues = true)\n    {\n        $this->dataSource = $dataSource;\n\n        if ($refreshDataValues) {\n            //    TO DO\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get Point Marker\n     *\n     * @return string\n     */\n    public function getPointMarker()\n    {\n        return $this->pointMarker;\n    }\n\n    /**\n     * Set Point Marker\n     *\n     * @param    string    $marker\n     * @return    PHPExcel_Chart_DataSeriesValues\n     */\n    public function setPointMarker($marker = null)\n    {\n        $this->pointMarker = $marker;\n\n        return $this;\n    }\n\n    /**\n     * Get Series Format Code\n     *\n     * @return    string\n     */\n    public function getFormatCode()\n    {\n        return $this->formatCode;\n    }\n\n    /**\n     * Set Series Format Code\n     *\n     * @param    string    $formatCode\n     * @return    PHPExcel_Chart_DataSeriesValues\n     */\n    public function setFormatCode($formatCode = null)\n    {\n        $this->formatCode = $formatCode;\n\n        return $this;\n    }\n\n    /**\n     * Get Series Point Count\n     *\n     * @return    integer\n     */\n    public function getPointCount()\n    {\n        return $this->pointCount;\n    }\n\n    /**\n     * Identify if the Data Series is a multi-level or a simple series\n     *\n     * @return    boolean\n     */\n    public function isMultiLevelSeries()\n    {\n        if (count($this->dataValues) > 0) {\n            return is_array($this->dataValues[0]);\n        }\n        return null;\n    }\n\n    /**\n     * Return the level count of a multi-level Data Series\n     *\n     * @return    boolean\n     */\n    public function multiLevelCount()\n    {\n        $levelCount = 0;\n        foreach ($this->dataValues as $dataValueSet) {\n            $levelCount = max($levelCount, count($dataValueSet));\n        }\n        return $levelCount;\n    }\n\n    /**\n     * Get Series Data Values\n     *\n     * @return    array of mixed\n     */\n    public function getDataValues()\n    {\n        return $this->dataValues;\n    }\n\n    /**\n     * Get the first Series Data value\n     *\n     * @return    mixed\n     */\n    public function getDataValue()\n    {\n        $count = count($this->dataValues);\n        if ($count == 0) {\n            return null;\n        } elseif ($count == 1) {\n            return $this->dataValues[0];\n        }\n        return $this->dataValues;\n    }\n\n    /**\n     * Set Series Data Values\n     *\n     * @param    array    $dataValues\n     * @param    boolean    $refreshDataSource\n     *                    TRUE - refresh the value of dataSource based on the values of $dataValues\n     *                    FALSE - don't change the value of dataSource\n     * @return    PHPExcel_Chart_DataSeriesValues\n     */\n    public function setDataValues($dataValues = array(), $refreshDataSource = true)\n    {\n        $this->dataValues = PHPExcel_Calculation_Functions::flattenArray($dataValues);\n        $this->pointCount = count($dataValues);\n\n        if ($refreshDataSource) {\n            //    TO DO\n        }\n\n        return $this;\n    }\n\n    private function stripNulls($var)\n    {\n        return $var !== null;\n    }\n\n    public function refresh(PHPExcel_Worksheet $worksheet, $flatten = true)\n    {\n        if ($this->dataSource !== null) {\n            $calcEngine = PHPExcel_Calculation::getInstance($worksheet->getParent());\n            $newDataValues = PHPExcel_Calculation::unwrapResult(\n                $calcEngine->_calculateFormulaValue(\n                    '='.$this->dataSource,\n                    null,\n                    $worksheet->getCell('A1')\n                )\n            );\n            if ($flatten) {\n                $this->dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues);\n                foreach ($this->dataValues as &$dataValue) {\n                    if ((!empty($dataValue)) && ($dataValue[0] == '#')) {\n                        $dataValue = 0.0;\n                    }\n                }\n                unset($dataValue);\n            } else {\n                $cellRange = explode('!', $this->dataSource);\n                if (count($cellRange) > 1) {\n                    list(, $cellRange) = $cellRange;\n                }\n\n                $dimensions = PHPExcel_Cell::rangeDimension(str_replace('$', '', $cellRange));\n                if (($dimensions[0] == 1) || ($dimensions[1] == 1)) {\n                    $this->dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues);\n                } else {\n                    $newArray = array_values(array_shift($newDataValues));\n                    foreach ($newArray as $i => $newDataSet) {\n                        $newArray[$i] = array($newDataSet);\n                    }\n\n                    foreach ($newDataValues as $newDataSet) {\n                        $i = 0;\n                        foreach ($newDataSet as $newDataVal) {\n                            array_unshift($newArray[$i++], $newDataVal);\n                        }\n                    }\n                    $this->dataValues = $newArray;\n                }\n            }\n            $this->pointCount = count($this->dataValues);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Exception.php",
    "content": "<?php\n\n/**\n * PHPExcel_Chart_Exception\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Chart\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart_Exception extends PHPExcel_Exception\n{\n    /**\n     * Error handler callback\n     *\n     * @param mixed $code\n     * @param mixed $string\n     * @param mixed $file\n     * @param mixed $line\n     * @param mixed $context\n     */\n    public static function errorHandlerCallback($code, $string, $file, $line, $context)\n    {\n        $e = new self($string, $code);\n        $e->line = $line;\n        $e->file = $file;\n        throw $e;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/GridLines.php",
    "content": "<?php\n\n/**\n * Created by PhpStorm.\n * User: Wiktor Trzonkowski\n * Date: 7/2/14\n * Time: 2:36 PM\n */\n\nclass PHPExcel_Chart_GridLines extends PHPExcel_Chart_Properties\n{\n\n  /**\n   * Properties of Class:\n   * Object State (State for Minor Tick Mark) @var bool\n   * Line Properties @var  array of mixed\n   * Shadow Properties @var  array of mixed\n   * Glow Properties @var  array of mixed\n   * Soft Properties @var  array of mixed\n   *\n   */\n\n    private $objectState = false;\n\n    private $lineProperties = array(\n        'color' => array(\n            'type' => self::EXCEL_COLOR_TYPE_STANDARD,\n            'value' => null,\n            'alpha' => 0\n        ),\n        'style' => array(\n            'width' => '9525',\n            'compound' => self::LINE_STYLE_COMPOUND_SIMPLE,\n            'dash' => self::LINE_STYLE_DASH_SOLID,\n            'cap' => self::LINE_STYLE_CAP_FLAT,\n            'join' => self::LINE_STYLE_JOIN_BEVEL,\n            'arrow' => array(\n                'head' => array(\n                    'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,\n                    'size' => self::LINE_STYLE_ARROW_SIZE_5\n                ),\n                'end' => array(\n                    'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,\n                    'size' => self::LINE_STYLE_ARROW_SIZE_8\n                ),\n            )\n        )\n    );\n\n    private $shadowProperties = array(\n        'presets' => self::SHADOW_PRESETS_NOSHADOW,\n        'effect' => null,\n        'color' => array(\n            'type' => self::EXCEL_COLOR_TYPE_STANDARD,\n            'value' => 'black',\n            'alpha' => 85,\n        ),\n        'size' => array(\n            'sx' => null,\n            'sy' => null,\n            'kx' => null\n        ),\n        'blur' => null,\n        'direction' => null,\n        'distance' => null,\n        'algn' => null,\n        'rotWithShape' => null\n    );\n\n    private $glowProperties = array(\n        'size' => null,\n        'color' => array(\n            'type' => self::EXCEL_COLOR_TYPE_STANDARD,\n            'value' => 'black',\n            'alpha' => 40\n        )\n    );\n\n    private $softEdges = array(\n        'size' => null\n     );\n\n    /**\n     * Get Object State\n     *\n     * @return bool\n     */\n\n    public function getObjectState()\n    {\n        return $this->objectState;\n    }\n\n    /**\n     * Change Object State to True\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n\n    private function activateObject()\n    {\n        $this->objectState = true;\n\n        return $this;\n    }\n\n    /**\n     * Set Line Color Properties\n     *\n     * @param string $value\n     * @param int $alpha\n     * @param string $type\n     */\n\n    public function setLineColorProperties($value, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_STANDARD)\n    {\n        $this->activateObject()\n            ->lineProperties['color'] = $this->setColorProperties(\n                $value,\n                $alpha,\n                $type\n            );\n    }\n\n    /**\n     * Set Line Color Properties\n     *\n     * @param float $line_width\n     * @param string $compound_type\n     * @param string $dash_type\n     * @param string $cap_type\n     * @param string $join_type\n     * @param string $head_arrow_type\n     * @param string $head_arrow_size\n     * @param string $end_arrow_type\n     * @param string $end_arrow_size\n     */\n\n    public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null)\n    {\n        $this->activateObject();\n        (!is_null($line_width))\n                ? $this->lineProperties['style']['width'] = $this->getExcelPointsWidth((float) $line_width)\n                : null;\n        (!is_null($compound_type))\n                ? $this->lineProperties['style']['compound'] = (string) $compound_type\n                : null;\n        (!is_null($dash_type))\n                ? $this->lineProperties['style']['dash'] = (string) $dash_type\n                : null;\n        (!is_null($cap_type))\n                ? $this->lineProperties['style']['cap'] = (string) $cap_type\n                : null;\n        (!is_null($join_type))\n                ? $this->lineProperties['style']['join'] = (string) $join_type\n                : null;\n        (!is_null($head_arrow_type))\n                ? $this->lineProperties['style']['arrow']['head']['type'] = (string) $head_arrow_type\n                : null;\n        (!is_null($head_arrow_size))\n                ? $this->lineProperties['style']['arrow']['head']['size'] = (string) $head_arrow_size\n                : null;\n        (!is_null($end_arrow_type))\n                ? $this->lineProperties['style']['arrow']['end']['type'] = (string) $end_arrow_type\n                : null;\n        (!is_null($end_arrow_size))\n                ? $this->lineProperties['style']['arrow']['end']['size'] = (string) $end_arrow_size\n                : null;\n    }\n\n    /**\n     * Get Line Color Property\n     *\n     * @param string $parameter\n     *\n     * @return string\n     */\n\n    public function getLineColorProperty($parameter)\n    {\n        return $this->lineProperties['color'][$parameter];\n    }\n\n    /**\n     * Get Line Style Property\n     *\n     * @param    array|string $elements\n     *\n     * @return string\n     */\n\n    public function getLineStyleProperty($elements)\n    {\n        return $this->getArrayElementsValue($this->lineProperties['style'], $elements);\n    }\n\n    /**\n     * Set Glow Properties\n     *\n     * @param    float $size\n     * @param    string $color_value\n     * @param    int $color_alpha\n     * @param    string $color_type\n     *\n     */\n\n    public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null)\n    {\n        $this\n                ->activateObject()\n                ->setGlowSize($size)\n                ->setGlowColor($color_value, $color_alpha, $color_type);\n    }\n\n    /**\n     * Get Glow Color Property\n     *\n     * @param string $property\n     *\n     * @return string\n     */\n\n    public function getGlowColor($property)\n    {\n        return $this->glowProperties['color'][$property];\n    }\n\n    /**\n     * Get Glow Size\n     *\n     * @return string\n     */\n\n    public function getGlowSize()\n    {\n        return $this->glowProperties['size'];\n    }\n\n    /**\n     * Set Glow Size\n     *\n     * @param float $size\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n\n    private function setGlowSize($size)\n    {\n        $this->glowProperties['size'] = $this->getExcelPointsWidth((float) $size);\n\n        return $this;\n    }\n\n    /**\n     * Set Glow Color\n     *\n     * @param string $color\n     * @param int $alpha\n     * @param string $type\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n\n    private function setGlowColor($color, $alpha, $type)\n    {\n        if (!is_null($color)) {\n            $this->glowProperties['color']['value'] = (string) $color;\n        }\n        if (!is_null($alpha)) {\n            $this->glowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha);\n        }\n        if (!is_null($type)) {\n            $this->glowProperties['color']['type'] = (string) $type;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get Line Style Arrow Parameters\n     *\n     * @param string $arrow_selector\n     * @param string $property_selector\n     *\n     * @return string\n     */\n\n    public function getLineStyleArrowParameters($arrow_selector, $property_selector)\n    {\n        return $this->getLineStyleArrowSize($this->lineProperties['style']['arrow'][$arrow_selector]['size'], $property_selector);\n    }\n\n    /**\n     * Set Shadow Properties\n     *\n     * @param int $sh_presets\n     * @param string $sh_color_value\n     * @param string $sh_color_type\n     * @param int $sh_color_alpha\n     * @param string $sh_blur\n     * @param int $sh_angle\n     * @param float $sh_distance\n     *\n     */\n\n    public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null)\n    {\n        $this->activateObject()\n            ->setShadowPresetsProperties((int) $sh_presets)\n            ->setShadowColor(\n                is_null($sh_color_value) ? $this->shadowProperties['color']['value'] : $sh_color_value,\n                is_null($sh_color_alpha) ? (int) $this->shadowProperties['color']['alpha'] : $this->getTrueAlpha($sh_color_alpha),\n                is_null($sh_color_type) ? $this->shadowProperties['color']['type'] : $sh_color_type\n            )\n            ->setShadowBlur($sh_blur)\n            ->setShadowAngle($sh_angle)\n            ->setShadowDistance($sh_distance);\n    }\n\n    /**\n     * Set Shadow Presets Properties\n     *\n     * @param int $shadow_presets\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n\n    private function setShadowPresetsProperties($shadow_presets)\n    {\n        $this->shadowProperties['presets'] = $shadow_presets;\n        $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets));\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Properties Values\n     *\n     * @param array $properties_map\n     * @param * $reference\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n\n    private function setShadowProperiesMapValues(array $properties_map, &$reference = null)\n    {\n        $base_reference = $reference;\n        foreach ($properties_map as $property_key => $property_val) {\n            if (is_array($property_val)) {\n                if ($reference === null) {\n                    $reference = & $this->shadowProperties[$property_key];\n                } else {\n                    $reference = & $reference[$property_key];\n                }\n                $this->setShadowProperiesMapValues($property_val, $reference);\n            } else {\n                if ($base_reference === null) {\n                    $this->shadowProperties[$property_key] = $property_val;\n                } else {\n                    $reference[$property_key] = $property_val;\n                }\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Color\n     *\n     * @param string $color\n     * @param int $alpha\n     * @param string $type\n     * @return PHPExcel_Chart_GridLines\n     */\n    private function setShadowColor($color, $alpha, $type)\n    {\n        if (!is_null($color)) {\n            $this->shadowProperties['color']['value'] = (string) $color;\n        }\n        if (!is_null($alpha)) {\n            $this->shadowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha);\n        }\n        if (!is_null($type)) {\n            $this->shadowProperties['color']['type'] = (string) $type;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Blur\n     *\n     * @param float $blur\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n    private function setShadowBlur($blur)\n    {\n        if ($blur !== null) {\n            $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Angle\n     *\n     * @param int $angle\n     * @return PHPExcel_Chart_GridLines\n     */\n\n    private function setShadowAngle($angle)\n    {\n        if ($angle !== null) {\n            $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set Shadow Distance\n     *\n     * @param float $distance\n     * @return PHPExcel_Chart_GridLines\n     */\n    private function setShadowDistance($distance)\n    {\n        if ($distance !== null) {\n            $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get Shadow Property\n     *\n     * @param string $elements\n     * @param array $elements\n     * @return string\n     */\n    public function getShadowProperty($elements)\n    {\n        return $this->getArrayElementsValue($this->shadowProperties, $elements);\n    }\n\n    /**\n     * Set Soft Edges Size\n     *\n     * @param float $size\n     */\n    public function setSoftEdgesSize($size)\n    {\n        if (!is_null($size)) {\n            $this->activateObject();\n            $softEdges['size'] = (string) $this->getExcelPointsWidth($size);\n        }\n    }\n\n    /**\n     * Get Soft Edges Size\n     *\n     * @return string\n     */\n    public function getSoftEdgesSize()\n    {\n        return $this->softEdges['size'];\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Layout.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Chart_Layout\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Chart_Layout\n{\n    /**\n     * layoutTarget\n     *\n     * @var string\n     */\n    private $layoutTarget;\n\n    /**\n     * X Mode\n     *\n     * @var string\n     */\n    private $xMode;\n\n    /**\n     * Y Mode\n     *\n     * @var string\n     */\n    private $yMode;\n\n    /**\n     * X-Position\n     *\n     * @var float\n     */\n    private $xPos;\n\n    /**\n     * Y-Position\n     *\n     * @var float\n     */\n    private $yPos;\n\n    /**\n     * width\n     *\n     * @var float\n     */\n    private $width;\n\n    /**\n     * height\n     *\n     * @var float\n     */\n    private $height;\n\n    /**\n     * show legend key\n     * Specifies that legend keys should be shown in data labels\n     *\n     * @var boolean\n     */\n    private $showLegendKey;\n\n    /**\n     * show value\n     * Specifies that the value should be shown in a data label.\n     *\n     * @var boolean\n     */\n    private $showVal;\n\n    /**\n     * show category name\n     * Specifies that the category name should be shown in the data label.\n     *\n     * @var boolean\n     */\n    private $showCatName;\n\n    /**\n     * show data series name\n     * Specifies that the series name should be shown in the data label.\n     *\n     * @var boolean\n     */\n    private $showSerName;\n\n    /**\n     * show percentage\n     * Specifies that the percentage should be shown in the data label.\n     *\n     * @var boolean\n     */\n    private $showPercent;\n\n    /**\n     * show bubble size\n     *\n     * @var boolean\n     */\n    private $showBubbleSize;\n\n    /**\n     * show leader lines\n     * Specifies that leader lines should be shown for the data label.\n     *\n     * @var boolean\n     */\n    private $showLeaderLines;\n\n\n    /**\n     * Create a new PHPExcel_Chart_Layout\n     */\n    public function __construct($layout = array())\n    {\n        if (isset($layout['layoutTarget'])) {\n            $this->layoutTarget = $layout['layoutTarget'];\n        }\n        if (isset($layout['xMode'])) {\n            $this->xMode = $layout['xMode'];\n        }\n        if (isset($layout['yMode'])) {\n            $this->yMode = $layout['yMode'];\n        }\n        if (isset($layout['x'])) {\n            $this->xPos = (float) $layout['x'];\n        }\n        if (isset($layout['y'])) {\n            $this->yPos = (float) $layout['y'];\n        }\n        if (isset($layout['w'])) {\n            $this->width = (float) $layout['w'];\n        }\n        if (isset($layout['h'])) {\n            $this->height = (float) $layout['h'];\n        }\n    }\n\n    /**\n     * Get Layout Target\n     *\n     * @return string\n     */\n    public function getLayoutTarget()\n    {\n        return $this->layoutTarget;\n    }\n\n    /**\n     * Set Layout Target\n     *\n     * @param Layout Target $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setLayoutTarget($value)\n    {\n        $this->layoutTarget = $value;\n        return $this;\n    }\n\n    /**\n     * Get X-Mode\n     *\n     * @return string\n     */\n    public function getXMode()\n    {\n        return $this->xMode;\n    }\n\n    /**\n     * Set X-Mode\n     *\n     * @param X-Mode $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setXMode($value)\n    {\n        $this->xMode = $value;\n        return $this;\n    }\n\n    /**\n     * Get Y-Mode\n     *\n     * @return string\n     */\n    public function getYMode()\n    {\n        return $this->yMode;\n    }\n\n    /**\n     * Set Y-Mode\n     *\n     * @param Y-Mode $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setYMode($value)\n    {\n        $this->yMode = $value;\n        return $this;\n    }\n\n    /**\n     * Get X-Position\n     *\n     * @return number\n     */\n    public function getXPosition()\n    {\n        return $this->xPos;\n    }\n\n    /**\n     * Set X-Position\n     *\n     * @param X-Position $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setXPosition($value)\n    {\n        $this->xPos = $value;\n        return $this;\n    }\n\n    /**\n     * Get Y-Position\n     *\n     * @return number\n     */\n    public function getYPosition()\n    {\n        return $this->yPos;\n    }\n\n    /**\n     * Set Y-Position\n     *\n     * @param Y-Position $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setYPosition($value)\n    {\n        $this->yPos = $value;\n        return $this;\n    }\n\n    /**\n     * Get Width\n     *\n     * @return number\n     */\n    public function getWidth()\n    {\n        return $this->width;\n    }\n\n    /**\n     * Set Width\n     *\n     * @param Width $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setWidth($value)\n    {\n        $this->width = $value;\n        return $this;\n    }\n\n    /**\n     * Get Height\n     *\n     * @return number\n     */\n    public function getHeight()\n    {\n        return $this->height;\n    }\n\n    /**\n     * Set Height\n     *\n     * @param Height $value\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setHeight($value)\n    {\n        $this->height = $value;\n        return $this;\n    }\n\n\n    /**\n     * Get show legend key\n     *\n     * @return boolean\n     */\n    public function getShowLegendKey()\n    {\n        return $this->showLegendKey;\n    }\n\n    /**\n     * Set show legend key\n     * Specifies that legend keys should be shown in data labels.\n     *\n     * @param boolean $value        Show legend key\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowLegendKey($value)\n    {\n        $this->showLegendKey = $value;\n        return $this;\n    }\n\n    /**\n     * Get show value\n     *\n     * @return boolean\n     */\n    public function getShowVal()\n    {\n        return $this->showVal;\n    }\n\n    /**\n     * Set show val\n     * Specifies that the value should be shown in data labels.\n     *\n     * @param boolean $value        Show val\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowVal($value)\n    {\n        $this->showVal = $value;\n        return $this;\n    }\n\n    /**\n     * Get show category name\n     *\n     * @return boolean\n     */\n    public function getShowCatName()\n    {\n        return $this->showCatName;\n    }\n\n    /**\n     * Set show cat name\n     * Specifies that the category name should be shown in data labels.\n     *\n     * @param boolean $value        Show cat name\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowCatName($value)\n    {\n        $this->showCatName = $value;\n        return $this;\n    }\n\n    /**\n     * Get show data series name\n     *\n     * @return boolean\n     */\n    public function getShowSerName()\n    {\n        return $this->showSerName;\n    }\n\n    /**\n     * Set show ser name\n     * Specifies that the series name should be shown in data labels.\n     *\n     * @param boolean $value        Show series name\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowSerName($value)\n    {\n        $this->showSerName = $value;\n        return $this;\n    }\n\n    /**\n     * Get show percentage\n     *\n     * @return boolean\n     */\n    public function getShowPercent()\n    {\n        return $this->showPercent;\n    }\n\n    /**\n     * Set show percentage\n     * Specifies that the percentage should be shown in data labels.\n     *\n     * @param boolean $value        Show percentage\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowPercent($value)\n    {\n        $this->showPercent = $value;\n        return $this;\n    }\n\n    /**\n     * Get show bubble size\n     *\n     * @return boolean\n     */\n    public function getShowBubbleSize()\n    {\n        return $this->showBubbleSize;\n    }\n\n    /**\n     * Set show bubble size\n     * Specifies that the bubble size should be shown in data labels.\n     *\n     * @param boolean $value        Show bubble size\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowBubbleSize($value)\n    {\n        $this->showBubbleSize = $value;\n        return $this;\n    }\n\n    /**\n     * Get show leader lines\n     *\n     * @return boolean\n     */\n    public function getShowLeaderLines()\n    {\n        return $this->showLeaderLines;\n    }\n\n    /**\n     * Set show leader lines\n     * Specifies that leader lines should be shown in data labels.\n     *\n     * @param boolean $value        Show leader lines\n     * @return PHPExcel_Chart_Layout\n     */\n    public function setShowLeaderLines($value)\n    {\n        $this->showLeaderLines = $value;\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Legend.php",
    "content": "<?php\n\n/**\n * PHPExcel_Chart_Legend\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart_Legend\n{\n    /** Legend positions */\n    const xlLegendPositionBottom = -4107;    //    Below the chart.\n    const xlLegendPositionCorner = 2;        //    In the upper right-hand corner of the chart border.\n    const xlLegendPositionCustom = -4161;    //    A custom position.\n    const xlLegendPositionLeft   = -4131;    //    Left of the chart.\n    const xlLegendPositionRight  = -4152;    //    Right of the chart.\n    const xlLegendPositionTop    = -4160;    //    Above the chart.\n\n    const POSITION_RIGHT    = 'r';\n    const POSITION_LEFT     = 'l';\n    const POSITION_BOTTOM   = 'b';\n    const POSITION_TOP      = 't';\n    const POSITION_TOPRIGHT = 'tr';\n\n    private static $positionXLref = array(\n        self::xlLegendPositionBottom => self::POSITION_BOTTOM,\n        self::xlLegendPositionCorner => self::POSITION_TOPRIGHT,\n        self::xlLegendPositionCustom => '??',\n        self::xlLegendPositionLeft   => self::POSITION_LEFT,\n        self::xlLegendPositionRight  => self::POSITION_RIGHT,\n        self::xlLegendPositionTop    => self::POSITION_TOP\n    );\n\n    /**\n     * Legend position\n     *\n     * @var    string\n     */\n    private $position = self::POSITION_RIGHT;\n\n    /**\n     * Allow overlay of other elements?\n     *\n     * @var    boolean\n     */\n    private $overlay = true;\n\n    /**\n     * Legend Layout\n     *\n     * @var    PHPExcel_Chart_Layout\n     */\n    private $layout = null;\n\n\n    /**\n     *    Create a new PHPExcel_Chart_Legend\n     */\n    public function __construct($position = self::POSITION_RIGHT, PHPExcel_Chart_Layout $layout = null, $overlay = false)\n    {\n        $this->setPosition($position);\n        $this->layout = $layout;\n        $this->setOverlay($overlay);\n    }\n\n    /**\n     * Get legend position as an excel string value\n     *\n     * @return    string\n     */\n    public function getPosition()\n    {\n        return $this->position;\n    }\n\n    /**\n     * Get legend position using an excel string value\n     *\n     * @param    string    $position\n     */\n    public function setPosition($position = self::POSITION_RIGHT)\n    {\n        if (!in_array($position, self::$positionXLref)) {\n            return false;\n        }\n\n        $this->position = $position;\n        return true;\n    }\n\n    /**\n     * Get legend position as an Excel internal numeric value\n     *\n     * @return    number\n     */\n    public function getPositionXL()\n    {\n        return array_search($this->position, self::$positionXLref);\n    }\n\n    /**\n     * Set legend position using an Excel internal numeric value\n     *\n     * @param    number    $positionXL\n     */\n    public function setPositionXL($positionXL = self::xlLegendPositionRight)\n    {\n        if (!array_key_exists($positionXL, self::$positionXLref)) {\n            return false;\n        }\n\n        $this->position = self::$positionXLref[$positionXL];\n        return true;\n    }\n\n    /**\n     * Get allow overlay of other elements?\n     *\n     * @return    boolean\n     */\n    public function getOverlay()\n    {\n        return $this->overlay;\n    }\n\n    /**\n     * Set allow overlay of other elements?\n     *\n     * @param    boolean    $overlay\n     * @return    boolean\n     */\n    public function setOverlay($overlay = false)\n    {\n        if (!is_bool($overlay)) {\n            return false;\n        }\n\n        $this->overlay = $overlay;\n        return true;\n    }\n\n    /**\n     * Get Layout\n     *\n     * @return PHPExcel_Chart_Layout\n     */\n    public function getLayout()\n    {\n        return $this->layout;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/PlotArea.php",
    "content": "<?php\n\n/**\n * PHPExcel_Chart_PlotArea\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart_PlotArea\n{\n    /**\n     * PlotArea Layout\n     *\n     * @var PHPExcel_Chart_Layout\n     */\n    private $layout = null;\n\n    /**\n     * Plot Series\n     *\n     * @var array of PHPExcel_Chart_DataSeries\n     */\n    private $plotSeries = array();\n\n    /**\n     * Create a new PHPExcel_Chart_PlotArea\n     */\n    public function __construct(PHPExcel_Chart_Layout $layout = null, $plotSeries = array())\n    {\n        $this->layout = $layout;\n        $this->plotSeries = $plotSeries;\n    }\n\n    /**\n     * Get Layout\n     *\n     * @return PHPExcel_Chart_Layout\n     */\n    public function getLayout()\n    {\n        return $this->layout;\n    }\n\n    /**\n     * Get Number of Plot Groups\n     *\n     * @return array of PHPExcel_Chart_DataSeries\n     */\n    public function getPlotGroupCount()\n    {\n        return count($this->plotSeries);\n    }\n\n    /**\n     * Get Number of Plot Series\n     *\n     * @return integer\n     */\n    public function getPlotSeriesCount()\n    {\n        $seriesCount = 0;\n        foreach ($this->plotSeries as $plot) {\n            $seriesCount += $plot->getPlotSeriesCount();\n        }\n        return $seriesCount;\n    }\n\n    /**\n     * Get Plot Series\n     *\n     * @return array of PHPExcel_Chart_DataSeries\n     */\n    public function getPlotGroup()\n    {\n        return $this->plotSeries;\n    }\n\n    /**\n     * Get Plot Series by Index\n     *\n     * @return PHPExcel_Chart_DataSeries\n     */\n    public function getPlotGroupByIndex($index)\n    {\n        return $this->plotSeries[$index];\n    }\n\n    /**\n     * Set Plot Series\n     *\n     * @param [PHPExcel_Chart_DataSeries]\n     * @return PHPExcel_Chart_PlotArea\n     */\n    public function setPlotSeries($plotSeries = array())\n    {\n        $this->plotSeries = $plotSeries;\n        \n        return $this;\n    }\n\n    public function refresh(PHPExcel_Worksheet $worksheet)\n    {\n        foreach ($this->plotSeries as $plotSeries) {\n            $plotSeries->refresh($worksheet);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Properties.php",
    "content": "<?php\n/**\n * Created by PhpStorm.\n * User: nhw2h8s\n * Date: 7/2/14\n * Time: 5:45 PM\n */\n\nabstract class PHPExcel_Chart_Properties\n{\n    const\n        EXCEL_COLOR_TYPE_STANDARD = 'prstClr',\n        EXCEL_COLOR_TYPE_SCHEME = 'schemeClr',\n        EXCEL_COLOR_TYPE_ARGB = 'srgbClr';\n\n    const\n        AXIS_LABELS_LOW = 'low',\n        AXIS_LABELS_HIGH = 'high',\n        AXIS_LABELS_NEXT_TO = 'nextTo',\n        AXIS_LABELS_NONE = 'none';\n\n    const\n        TICK_MARK_NONE = 'none',\n        TICK_MARK_INSIDE = 'in',\n        TICK_MARK_OUTSIDE = 'out',\n        TICK_MARK_CROSS = 'cross';\n\n    const\n        HORIZONTAL_CROSSES_AUTOZERO = 'autoZero',\n        HORIZONTAL_CROSSES_MAXIMUM = 'max';\n\n    const\n        FORMAT_CODE_GENERAL = 'General',\n        FORMAT_CODE_NUMBER = '#,##0.00',\n        FORMAT_CODE_CURRENCY = '$#,##0.00',\n        FORMAT_CODE_ACCOUNTING = '_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)',\n        FORMAT_CODE_DATE = 'm/d/yyyy',\n        FORMAT_CODE_TIME = '[$-F400]h:mm:ss AM/PM',\n        FORMAT_CODE_PERCENTAGE = '0.00%',\n        FORMAT_CODE_FRACTION = '# ?/?',\n        FORMAT_CODE_SCIENTIFIC = '0.00E+00',\n        FORMAT_CODE_TEXT = '@',\n        FORMAT_CODE_SPECIAL = '00000';\n\n    const\n        ORIENTATION_NORMAL = 'minMax',\n        ORIENTATION_REVERSED = 'maxMin';\n\n    const\n        LINE_STYLE_COMPOUND_SIMPLE = 'sng',\n        LINE_STYLE_COMPOUND_DOUBLE = 'dbl',\n        LINE_STYLE_COMPOUND_THICKTHIN = 'thickThin',\n        LINE_STYLE_COMPOUND_THINTHICK = 'thinThick',\n        LINE_STYLE_COMPOUND_TRIPLE = 'tri',\n\n        LINE_STYLE_DASH_SOLID = 'solid',\n        LINE_STYLE_DASH_ROUND_DOT = 'sysDot',\n        LINE_STYLE_DASH_SQUERE_DOT = 'sysDash',\n        LINE_STYPE_DASH_DASH = 'dash',\n        LINE_STYLE_DASH_DASH_DOT = 'dashDot',\n        LINE_STYLE_DASH_LONG_DASH = 'lgDash',\n        LINE_STYLE_DASH_LONG_DASH_DOT = 'lgDashDot',\n        LINE_STYLE_DASH_LONG_DASH_DOT_DOT = 'lgDashDotDot',\n\n        LINE_STYLE_CAP_SQUARE = 'sq',\n        LINE_STYLE_CAP_ROUND = 'rnd',\n        LINE_STYLE_CAP_FLAT = 'flat',\n\n        LINE_STYLE_JOIN_ROUND = 'bevel',\n        LINE_STYLE_JOIN_MITER = 'miter',\n        LINE_STYLE_JOIN_BEVEL = 'bevel',\n\n        LINE_STYLE_ARROW_TYPE_NOARROW = null,\n        LINE_STYLE_ARROW_TYPE_ARROW = 'triangle',\n        LINE_STYLE_ARROW_TYPE_OPEN = 'arrow',\n        LINE_STYLE_ARROW_TYPE_STEALTH = 'stealth',\n        LINE_STYLE_ARROW_TYPE_DIAMOND = 'diamond',\n        LINE_STYLE_ARROW_TYPE_OVAL = 'oval',\n\n        LINE_STYLE_ARROW_SIZE_1 = 1,\n        LINE_STYLE_ARROW_SIZE_2 = 2,\n        LINE_STYLE_ARROW_SIZE_3 = 3,\n        LINE_STYLE_ARROW_SIZE_4 = 4,\n        LINE_STYLE_ARROW_SIZE_5 = 5,\n        LINE_STYLE_ARROW_SIZE_6 = 6,\n        LINE_STYLE_ARROW_SIZE_7 = 7,\n        LINE_STYLE_ARROW_SIZE_8 = 8,\n        LINE_STYLE_ARROW_SIZE_9 = 9;\n\n    const\n        SHADOW_PRESETS_NOSHADOW = null,\n        SHADOW_PRESETS_OUTER_BOTTTOM_RIGHT = 1,\n        SHADOW_PRESETS_OUTER_BOTTOM = 2,\n        SHADOW_PRESETS_OUTER_BOTTOM_LEFT = 3,\n        SHADOW_PRESETS_OUTER_RIGHT = 4,\n        SHADOW_PRESETS_OUTER_CENTER = 5,\n        SHADOW_PRESETS_OUTER_LEFT = 6,\n        SHADOW_PRESETS_OUTER_TOP_RIGHT = 7,\n        SHADOW_PRESETS_OUTER_TOP = 8,\n        SHADOW_PRESETS_OUTER_TOP_LEFT = 9,\n        SHADOW_PRESETS_INNER_BOTTTOM_RIGHT = 10,\n        SHADOW_PRESETS_INNER_BOTTOM = 11,\n        SHADOW_PRESETS_INNER_BOTTOM_LEFT = 12,\n        SHADOW_PRESETS_INNER_RIGHT = 13,\n        SHADOW_PRESETS_INNER_CENTER = 14,\n        SHADOW_PRESETS_INNER_LEFT = 15,\n        SHADOW_PRESETS_INNER_TOP_RIGHT = 16,\n        SHADOW_PRESETS_INNER_TOP = 17,\n        SHADOW_PRESETS_INNER_TOP_LEFT = 18,\n        SHADOW_PRESETS_PERSPECTIVE_BELOW = 19,\n        SHADOW_PRESETS_PERSPECTIVE_UPPER_RIGHT = 20,\n        SHADOW_PRESETS_PERSPECTIVE_UPPER_LEFT = 21,\n        SHADOW_PRESETS_PERSPECTIVE_LOWER_RIGHT = 22,\n        SHADOW_PRESETS_PERSPECTIVE_LOWER_LEFT = 23;\n\n    protected function getExcelPointsWidth($width)\n    {\n        return $width * 12700;\n    }\n\n    protected function getExcelPointsAngle($angle)\n    {\n        return $angle * 60000;\n    }\n\n    protected function getTrueAlpha($alpha)\n    {\n        return (string) 100 - $alpha . '000';\n    }\n\n    protected function setColorProperties($color, $alpha, $type)\n    {\n        return array(\n            'type' => (string) $type,\n            'value' => (string) $color,\n            'alpha' => (string) $this->getTrueAlpha($alpha)\n        );\n    }\n\n    protected function getLineStyleArrowSize($array_selector, $array_kay_selector)\n    {\n        $sizes = array(\n            1 => array('w' => 'sm', 'len' => 'sm'),\n            2 => array('w' => 'sm', 'len' => 'med'),\n            3 => array('w' => 'sm', 'len' => 'lg'),\n            4 => array('w' => 'med', 'len' => 'sm'),\n            5 => array('w' => 'med', 'len' => 'med'),\n            6 => array('w' => 'med', 'len' => 'lg'),\n            7 => array('w' => 'lg', 'len' => 'sm'),\n            8 => array('w' => 'lg', 'len' => 'med'),\n            9 => array('w' => 'lg', 'len' => 'lg')\n        );\n\n        return $sizes[$array_selector][$array_kay_selector];\n    }\n\n    protected function getShadowPresetsMap($shadow_presets_option)\n    {\n        $presets_options = array(\n            //OUTER\n            1 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '2700000',\n                'algn' => 'tl',\n                'rotWithShape' => '0'\n            ),\n            2 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '5400000',\n                'algn' => 't',\n                'rotWithShape' => '0'\n            ),\n            3 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '8100000',\n                'algn' => 'tr',\n                'rotWithShape' => '0'\n            ),\n            4 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'algn' => 'l',\n                'rotWithShape' => '0'\n            ),\n            5 => array(\n                'effect' => 'outerShdw',\n                'size' => array(\n                    'sx' => '102000',\n                    'sy' => '102000'\n                )\n                ,\n                'blur' => '63500',\n                'distance' => '38100',\n                'algn' => 'ctr',\n                'rotWithShape' => '0'\n            ),\n            6 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '10800000',\n                'algn' => 'r',\n                'rotWithShape' => '0'\n            ),\n            7 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '18900000',\n                'algn' => 'bl',\n                'rotWithShape' => '0'\n            ),\n            8 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '16200000',\n                'rotWithShape' => '0'\n            ),\n            9 => array(\n                'effect' => 'outerShdw',\n                'blur' => '50800',\n                'distance' => '38100',\n                'direction' => '13500000',\n                'algn' => 'br',\n                'rotWithShape' => '0'\n            ),\n            //INNER\n            10 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '2700000',\n            ),\n            11 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '5400000',\n            ),\n            12 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '8100000',\n            ),\n            13 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n            ),\n            14 => array(\n                'effect' => 'innerShdw',\n                'blur' => '114300',\n            ),\n            15 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '10800000',\n            ),\n            16 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '18900000',\n            ),\n            17 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '16200000',\n            ),\n            18 => array(\n                'effect' => 'innerShdw',\n                'blur' => '63500',\n                'distance' => '50800',\n                'direction' => '13500000',\n            ),\n            //perspective\n            19 => array(\n                'effect' => 'outerShdw',\n                'blur' => '152400',\n                'distance' => '317500',\n                'size' => array(\n                    'sx' => '90000',\n                    'sy' => '-19000',\n                ),\n                'direction' => '5400000',\n                'rotWithShape' => '0',\n            ),\n            20 => array(\n                'effect' => 'outerShdw',\n                'blur' => '76200',\n                'direction' => '18900000',\n                'size' => array(\n                    'sy' => '23000',\n                    'kx' => '-1200000',\n                ),\n                'algn' => 'bl',\n                'rotWithShape' => '0',\n            ),\n            21 => array(\n                'effect' => 'outerShdw',\n                'blur' => '76200',\n                'direction' => '13500000',\n                'size' => array(\n                    'sy' => '23000',\n                    'kx' => '1200000',\n                ),\n                'algn' => 'br',\n                'rotWithShape' => '0',\n            ),\n            22 => array(\n                'effect' => 'outerShdw',\n                'blur' => '76200',\n                'distance' => '12700',\n                'direction' => '2700000',\n                'size' => array(\n                    'sy' => '-23000',\n                    'kx' => '-800400',\n                ),\n                'algn' => 'bl',\n                'rotWithShape' => '0',\n            ),\n            23 => array(\n                'effect' => 'outerShdw',\n                'blur' => '76200',\n                'distance' => '12700',\n                'direction' => '8100000',\n                'size' => array(\n                    'sy' => '-23000',\n                    'kx' => '800400',\n                ),\n                'algn' => 'br',\n                'rotWithShape' => '0',\n            ),\n        );\n\n        return $presets_options[$shadow_presets_option];\n    }\n\n    protected function getArrayElementsValue($properties, $elements)\n    {\n        $reference = & $properties;\n        if (!is_array($elements)) {\n            return $reference[$elements];\n        } else {\n            foreach ($elements as $keys) {\n                $reference = & $reference[$keys];\n            }\n            return $reference;\n        }\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt",
    "content": "ChartDirector\r\n\thttp://www.advsofteng.com/cdphp.html\r\n\r\nGraPHPite\r\n\thttp://graphpite.sourceforge.net/\r\n\r\nJpGraph\r\n\thttp://www.aditus.nu/jpgraph/\r\n\r\nLibChart\r\n\thttp://naku.dohcrew.com/libchart/pages/introduction/\r\n\r\npChart\r\n\thttp://pchart.sourceforge.net/\r\n\r\nTeeChart\r\n\thttp://www.steema.com/products/teechart/overview.html\r\n\r\nPHPGraphLib\r\n    http://www.ebrueggeman.com/phpgraphlib"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Renderer/jpgraph.php",
    "content": "<?php\n\nrequire_once(PHPExcel_Settings::getChartRendererPath().'/jpgraph.php');\n\n/**\n * PHPExcel_Chart_Renderer_jpgraph\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart_Renderer\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart_Renderer_jpgraph\n{\n    private static $width    = 640;\n\n    private static $height    = 480;\n\n    private static $colourSet = array(\n        'mediumpurple1',    'palegreen3',     'gold1',          'cadetblue1',\n        'darkmagenta',      'coral',          'dodgerblue3',    'eggplant',\n        'mediumblue',       'magenta',        'sandybrown',     'cyan',\n        'firebrick1',       'forestgreen',    'deeppink4',      'darkolivegreen',\n        'goldenrod2'\n    );\n\n    private static $markSet = array(\n        'diamond'  => MARK_DIAMOND,\n        'square'   => MARK_SQUARE,\n        'triangle' => MARK_UTRIANGLE,\n        'x'        => MARK_X,\n        'star'     => MARK_STAR,\n        'dot'      => MARK_FILLEDCIRCLE,\n        'dash'     => MARK_DTRIANGLE,\n        'circle'   => MARK_CIRCLE,\n        'plus'     => MARK_CROSS\n    );\n\n\n    private $chart;\n\n    private $graph;\n\n    private static $plotColour = 0;\n\n    private static $plotMark = 0;\n\n\n    private function formatPointMarker($seriesPlot, $markerID)\n    {\n        $plotMarkKeys = array_keys(self::$markSet);\n        if (is_null($markerID)) {\n            //    Use default plot marker (next marker in the series)\n            self::$plotMark %= count(self::$markSet);\n            $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);\n        } elseif ($markerID !== 'none') {\n            //    Use specified plot marker (if it exists)\n            if (isset(self::$markSet[$markerID])) {\n                $seriesPlot->mark->SetType(self::$markSet[$markerID]);\n            } else {\n                //    If the specified plot marker doesn't exist, use default plot marker (next marker in the series)\n                self::$plotMark %= count(self::$markSet);\n                $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);\n            }\n        } else {\n            //    Hide plot marker\n            $seriesPlot->mark->Hide();\n        }\n        $seriesPlot->mark->SetColor(self::$colourSet[self::$plotColour]);\n        $seriesPlot->mark->SetFillColor(self::$colourSet[self::$plotColour]);\n        $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);\n\n        return $seriesPlot;\n    }\n\n\n    private function formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '')\n    {\n        $datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode();\n        if (!is_null($datasetLabelFormatCode)) {\n            //    Retrieve any label formatting code\n            $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode);\n        }\n\n        $testCurrentIndex = 0;\n        foreach ($datasetLabels as $i => $datasetLabel) {\n            if (is_array($datasetLabel)) {\n                if ($rotation == 'bar') {\n                    $datasetLabels[$i] = implode(\" \", $datasetLabel);\n                } else {\n                    $datasetLabel = array_reverse($datasetLabel);\n                    $datasetLabels[$i] = implode(\"\\n\", $datasetLabel);\n                }\n            } else {\n                //    Format labels according to any formatting code\n                if (!is_null($datasetLabelFormatCode)) {\n                    $datasetLabels[$i] = PHPExcel_Style_NumberFormat::toFormattedString($datasetLabel, $datasetLabelFormatCode);\n                }\n            }\n            ++$testCurrentIndex;\n        }\n\n        return $datasetLabels;\n    }\n\n\n    private function percentageSumCalculation($groupID, $seriesCount)\n    {\n        //    Adjust our values to a percentage value across all series in the group\n        for ($i = 0; $i < $seriesCount; ++$i) {\n            if ($i == 0) {\n                $sumValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();\n            } else {\n                $nextValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();\n                foreach ($nextValues as $k => $value) {\n                    if (isset($sumValues[$k])) {\n                        $sumValues[$k] += $value;\n                    } else {\n                        $sumValues[$k] = $value;\n                    }\n                }\n            }\n        }\n\n        return $sumValues;\n    }\n\n\n    private function percentageAdjustValues($dataValues, $sumValues)\n    {\n        foreach ($dataValues as $k => $dataValue) {\n            $dataValues[$k] = $dataValue / $sumValues[$k] * 100;\n        }\n\n        return $dataValues;\n    }\n\n\n    private function getCaption($captionElement)\n    {\n        //    Read any caption\n        $caption = (!is_null($captionElement)) ? $captionElement->getCaption() : null;\n        //    Test if we have a title caption to display\n        if (!is_null($caption)) {\n            //    If we do, it could be a plain string or an array\n            if (is_array($caption)) {\n                //    Implode an array to a plain string\n                $caption = implode('', $caption);\n            }\n        }\n        return $caption;\n    }\n\n\n    private function renderTitle()\n    {\n        $title = $this->getCaption($this->chart->getTitle());\n        if (!is_null($title)) {\n            $this->graph->title->Set($title);\n        }\n    }\n\n\n    private function renderLegend()\n    {\n        $legend = $this->chart->getLegend();\n        if (!is_null($legend)) {\n            $legendPosition = $legend->getPosition();\n            $legendOverlay = $legend->getOverlay();\n            switch ($legendPosition) {\n                case 'r':\n                    $this->graph->legend->SetPos(0.01, 0.5, 'right', 'center');    //    right\n                    $this->graph->legend->SetColumns(1);\n                    break;\n                case 'l':\n                    $this->graph->legend->SetPos(0.01, 0.5, 'left', 'center');    //    left\n                    $this->graph->legend->SetColumns(1);\n                    break;\n                case 't':\n                    $this->graph->legend->SetPos(0.5, 0.01, 'center', 'top');    //    top\n                    break;\n                case 'b':\n                    $this->graph->legend->SetPos(0.5, 0.99, 'center', 'bottom');    //    bottom\n                    break;\n                default:\n                    $this->graph->legend->SetPos(0.01, 0.01, 'right', 'top');    //    top-right\n                    $this->graph->legend->SetColumns(1);\n                    break;\n            }\n        } else {\n            $this->graph->legend->Hide();\n        }\n    }\n\n\n    private function renderCartesianPlotArea($type = 'textlin')\n    {\n        $this->graph = new Graph(self::$width, self::$height);\n        $this->graph->SetScale($type);\n\n        $this->renderTitle();\n\n        //    Rotate for bar rather than column chart\n        $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection();\n        $reverse = ($rotation == 'bar') ? true : false;\n\n        $xAxisLabel = $this->chart->getXAxisLabel();\n        if (!is_null($xAxisLabel)) {\n            $title = $this->getCaption($xAxisLabel);\n            if (!is_null($title)) {\n                $this->graph->xaxis->SetTitle($title, 'center');\n                $this->graph->xaxis->title->SetMargin(35);\n                if ($reverse) {\n                    $this->graph->xaxis->title->SetAngle(90);\n                    $this->graph->xaxis->title->SetMargin(90);\n                }\n            }\n        }\n\n        $yAxisLabel = $this->chart->getYAxisLabel();\n        if (!is_null($yAxisLabel)) {\n            $title = $this->getCaption($yAxisLabel);\n            if (!is_null($title)) {\n                $this->graph->yaxis->SetTitle($title, 'center');\n                if ($reverse) {\n                    $this->graph->yaxis->title->SetAngle(0);\n                    $this->graph->yaxis->title->SetMargin(-55);\n                }\n            }\n        }\n    }\n\n\n    private function renderPiePlotArea($doughnut = false)\n    {\n        $this->graph = new PieGraph(self::$width, self::$height);\n\n        $this->renderTitle();\n    }\n\n\n    private function renderRadarPlotArea()\n    {\n        $this->graph = new RadarGraph(self::$width, self::$height);\n        $this->graph->SetScale('lin');\n\n        $this->renderTitle();\n    }\n\n\n    private function renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d')\n    {\n        $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();\n\n        $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());\n        if ($labelCount > 0) {\n            $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();\n            $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);\n            $this->graph->xaxis->SetTickLabels($datasetLabels);\n        }\n\n        $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n        $seriesPlots = array();\n        if ($grouping == 'percentStacked') {\n            $sumValues = $this->percentageSumCalculation($groupID, $seriesCount);\n        }\n\n        //    Loop through each data series in turn\n        for ($i = 0; $i < $seriesCount; ++$i) {\n            $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();\n            $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();\n\n            if ($grouping == 'percentStacked') {\n                $dataValues = $this->percentageAdjustValues($dataValues, $sumValues);\n            }\n\n            //    Fill in any missing values in the $dataValues array\n            $testCurrentIndex = 0;\n            foreach ($dataValues as $k => $dataValue) {\n                while ($k != $testCurrentIndex) {\n                    $dataValues[$testCurrentIndex] = null;\n                    ++$testCurrentIndex;\n                }\n                ++$testCurrentIndex;\n            }\n\n            $seriesPlot = new LinePlot($dataValues);\n            if ($combination) {\n                $seriesPlot->SetBarCenter();\n            }\n\n            if ($filled) {\n                $seriesPlot->SetFilled(true);\n                $seriesPlot->SetColor('black');\n                $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);\n            } else {\n                //    Set the appropriate plot marker\n                $this->formatPointMarker($seriesPlot, $marker);\n            }\n            $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();\n            $seriesPlot->SetLegend($dataLabel);\n\n            $seriesPlots[] = $seriesPlot;\n        }\n\n        if ($grouping == 'standard') {\n            $groupPlot = $seriesPlots;\n        } else {\n            $groupPlot = new AccLinePlot($seriesPlots);\n        }\n        $this->graph->Add($groupPlot);\n    }\n\n\n    private function renderPlotBar($groupID, $dimensions = '2d')\n    {\n        $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection();\n        //    Rotate for bar rather than column chart\n        if (($groupID == 0) && ($rotation == 'bar')) {\n            $this->graph->Set90AndMargin();\n        }\n        $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();\n\n        $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());\n        if ($labelCount > 0) {\n            $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();\n            $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation);\n            //    Rotate for bar rather than column chart\n            if ($rotation == 'bar') {\n                $datasetLabels = array_reverse($datasetLabels);\n                $this->graph->yaxis->SetPos('max');\n                $this->graph->yaxis->SetLabelAlign('center', 'top');\n                $this->graph->yaxis->SetLabelSide(SIDE_RIGHT);\n            }\n            $this->graph->xaxis->SetTickLabels($datasetLabels);\n        }\n\n\n        $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n        $seriesPlots = array();\n        if ($grouping == 'percentStacked') {\n            $sumValues = $this->percentageSumCalculation($groupID, $seriesCount);\n        }\n\n        //    Loop through each data series in turn\n        for ($j = 0; $j < $seriesCount; ++$j) {\n            $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();\n            if ($grouping == 'percentStacked') {\n                $dataValues = $this->percentageAdjustValues($dataValues, $sumValues);\n            }\n\n            //    Fill in any missing values in the $dataValues array\n            $testCurrentIndex = 0;\n            foreach ($dataValues as $k => $dataValue) {\n                while ($k != $testCurrentIndex) {\n                    $dataValues[$testCurrentIndex] = null;\n                    ++$testCurrentIndex;\n                }\n                ++$testCurrentIndex;\n            }\n\n            //    Reverse the $dataValues order for bar rather than column chart\n            if ($rotation == 'bar') {\n                $dataValues = array_reverse($dataValues);\n            }\n            $seriesPlot = new BarPlot($dataValues);\n            $seriesPlot->SetColor('black');\n            $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);\n            if ($dimensions == '3d') {\n                $seriesPlot->SetShadow();\n            }\n            if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) {\n                $dataLabel = '';\n            } else {\n                $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue();\n            }\n            $seriesPlot->SetLegend($dataLabel);\n\n            $seriesPlots[] = $seriesPlot;\n        }\n        //    Reverse the plot order for bar rather than column chart\n        if (($rotation == 'bar') && (!($grouping == 'percentStacked'))) {\n            $seriesPlots = array_reverse($seriesPlots);\n        }\n\n        if ($grouping == 'clustered') {\n            $groupPlot = new GroupBarPlot($seriesPlots);\n        } elseif ($grouping == 'standard') {\n            $groupPlot = new GroupBarPlot($seriesPlots);\n        } else {\n            $groupPlot = new AccBarPlot($seriesPlots);\n            if ($dimensions == '3d') {\n                $groupPlot->SetShadow();\n            }\n        }\n\n        $this->graph->Add($groupPlot);\n    }\n\n\n    private function renderPlotScatter($groupID, $bubble)\n    {\n        $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();\n        $scatterStyle = $bubbleSize = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();\n\n        $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n        $seriesPlots = array();\n\n        //    Loop through each data series in turn\n        for ($i = 0; $i < $seriesCount; ++$i) {\n            $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();\n            $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();\n\n            foreach ($dataValuesY as $k => $dataValueY) {\n                $dataValuesY[$k] = $k;\n            }\n\n            $seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY);\n            if ($scatterStyle == 'lineMarker') {\n                $seriesPlot->SetLinkPoints();\n                $seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]);\n            } elseif ($scatterStyle == 'smoothMarker') {\n                $spline = new Spline($dataValuesY, $dataValuesX);\n                list($splineDataY, $splineDataX) = $spline->Get(count($dataValuesX) * self::$width / 20);\n                $lplot = new LinePlot($splineDataX, $splineDataY);\n                $lplot->SetColor(self::$colourSet[self::$plotColour]);\n\n                $this->graph->Add($lplot);\n            }\n\n            if ($bubble) {\n                $this->formatPointMarker($seriesPlot, 'dot');\n                $seriesPlot->mark->SetColor('black');\n                $seriesPlot->mark->SetSize($bubbleSize);\n            } else {\n                $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();\n                $this->formatPointMarker($seriesPlot, $marker);\n            }\n            $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();\n            $seriesPlot->SetLegend($dataLabel);\n\n            $this->graph->Add($seriesPlot);\n        }\n    }\n\n\n    private function renderPlotRadar($groupID)\n    {\n        $radarStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();\n\n        $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n        $seriesPlots = array();\n\n        //    Loop through each data series in turn\n        for ($i = 0; $i < $seriesCount; ++$i) {\n            $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();\n            $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();\n            $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();\n\n            $dataValues = array();\n            foreach ($dataValuesY as $k => $dataValueY) {\n                $dataValues[$k] = implode(' ', array_reverse($dataValueY));\n            }\n            $tmp = array_shift($dataValues);\n            $dataValues[] = $tmp;\n            $tmp = array_shift($dataValuesX);\n            $dataValuesX[] = $tmp;\n\n            $this->graph->SetTitles(array_reverse($dataValues));\n\n            $seriesPlot = new RadarPlot(array_reverse($dataValuesX));\n\n            $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();\n            $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);\n            if ($radarStyle == 'filled') {\n                $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]);\n            }\n            $this->formatPointMarker($seriesPlot, $marker);\n            $seriesPlot->SetLegend($dataLabel);\n\n            $this->graph->Add($seriesPlot);\n        }\n    }\n\n\n    private function renderPlotContour($groupID)\n    {\n        $contourStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();\n\n        $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n        $seriesPlots = array();\n\n        $dataValues = array();\n        //    Loop through each data series in turn\n        for ($i = 0; $i < $seriesCount; ++$i) {\n            $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();\n            $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();\n\n            $dataValues[$i] = $dataValuesX;\n        }\n        $seriesPlot = new ContourPlot($dataValues);\n\n        $this->graph->Add($seriesPlot);\n    }\n\n\n    private function renderPlotStock($groupID)\n    {\n        $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n        $plotOrder = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder();\n\n        $dataValues = array();\n        //    Loop through each data series in turn and build the plot arrays\n        foreach ($plotOrder as $i => $v) {\n            $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues();\n            foreach ($dataValuesX as $j => $dataValueX) {\n                $dataValues[$plotOrder[$i]][$j] = $dataValueX;\n            }\n        }\n        if (empty($dataValues)) {\n            return;\n        }\n\n        $dataValuesPlot = array();\n        // Flatten the plot arrays to a single dimensional array to work with jpgraph\n        for ($j = 0; $j < count($dataValues[0]); ++$j) {\n            for ($i = 0; $i < $seriesCount; ++$i) {\n                $dataValuesPlot[] = $dataValues[$i][$j];\n            }\n        }\n\n        // Set the x-axis labels\n        $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());\n        if ($labelCount > 0) {\n            $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();\n            $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);\n            $this->graph->xaxis->SetTickLabels($datasetLabels);\n        }\n\n        $seriesPlot = new StockPlot($dataValuesPlot);\n        $seriesPlot->SetWidth(20);\n\n        $this->graph->Add($seriesPlot);\n    }\n\n\n    private function renderAreaChart($groupCount, $dimensions = '2d')\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');\n\n        $this->renderCartesianPlotArea();\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $this->renderPlotLine($i, true, false, $dimensions);\n        }\n    }\n\n\n    private function renderLineChart($groupCount, $dimensions = '2d')\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');\n\n        $this->renderCartesianPlotArea();\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $this->renderPlotLine($i, false, false, $dimensions);\n        }\n    }\n\n\n    private function renderBarChart($groupCount, $dimensions = '2d')\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php');\n\n        $this->renderCartesianPlotArea();\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $this->renderPlotBar($i, $dimensions);\n        }\n    }\n\n\n    private function renderScatterChart($groupCount)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php');\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');\n\n        $this->renderCartesianPlotArea('linlin');\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $this->renderPlotScatter($i, false);\n        }\n    }\n\n\n    private function renderBubbleChart($groupCount)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');\n\n        $this->renderCartesianPlotArea('linlin');\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $this->renderPlotScatter($i, true);\n        }\n    }\n\n\n    private function renderPieChart($groupCount, $dimensions = '2d', $doughnut = false, $multiplePlots = false)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie.php');\n        if ($dimensions == '3d') {\n            require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie3d.php');\n        }\n\n        $this->renderPiePlotArea($doughnut);\n\n        $iLimit = ($multiplePlots) ? $groupCount : 1;\n        for ($groupID = 0; $groupID < $iLimit; ++$groupID) {\n            $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();\n            $exploded = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();\n            if ($groupID == 0) {\n                $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());\n                if ($labelCount > 0) {\n                    $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();\n                    $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);\n                }\n            }\n\n            $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();\n            $seriesPlots = array();\n            //    For pie charts, we only display the first series: doughnut charts generally display all series\n            $jLimit = ($multiplePlots) ? $seriesCount : 1;\n            //    Loop through each data series in turn\n            for ($j = 0; $j < $jLimit; ++$j) {\n                $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();\n\n                //    Fill in any missing values in the $dataValues array\n                $testCurrentIndex = 0;\n                foreach ($dataValues as $k => $dataValue) {\n                    while ($k != $testCurrentIndex) {\n                        $dataValues[$testCurrentIndex] = null;\n                        ++$testCurrentIndex;\n                    }\n                    ++$testCurrentIndex;\n                }\n\n                if ($dimensions == '3d') {\n                    $seriesPlot = new PiePlot3D($dataValues);\n                } else {\n                    if ($doughnut) {\n                        $seriesPlot = new PiePlotC($dataValues);\n                    } else {\n                        $seriesPlot = new PiePlot($dataValues);\n                    }\n                }\n\n                if ($multiplePlots) {\n                    $seriesPlot->SetSize(($jLimit-$j) / ($jLimit * 4));\n                }\n\n                if ($doughnut) {\n                    $seriesPlot->SetMidColor('white');\n                }\n\n                $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);\n                if (count($datasetLabels) > 0) {\n                    $seriesPlot->SetLabels(array_fill(0, count($datasetLabels), ''));\n                }\n                if ($dimensions != '3d') {\n                    $seriesPlot->SetGuideLines(false);\n                }\n                if ($j == 0) {\n                    if ($exploded) {\n                        $seriesPlot->ExplodeAll();\n                    }\n                    $seriesPlot->SetLegends($datasetLabels);\n                }\n\n                $this->graph->Add($seriesPlot);\n            }\n        }\n    }\n\n\n    private function renderRadarChart($groupCount)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_radar.php');\n\n        $this->renderRadarPlotArea();\n\n        for ($groupID = 0; $groupID < $groupCount; ++$groupID) {\n            $this->renderPlotRadar($groupID);\n        }\n    }\n\n\n    private function renderStockChart($groupCount)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_stock.php');\n\n        $this->renderCartesianPlotArea('intint');\n\n        for ($groupID = 0; $groupID < $groupCount; ++$groupID) {\n            $this->renderPlotStock($groupID);\n        }\n    }\n\n\n    private function renderContourChart($groupCount, $dimensions)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_contour.php');\n\n        $this->renderCartesianPlotArea('intint');\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $this->renderPlotContour($i);\n        }\n    }\n\n\n    private function renderCombinationChart($groupCount, $dimensions, $outputDestination)\n    {\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php');\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php');\n        require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');\n\n        $this->renderCartesianPlotArea();\n\n        for ($i = 0; $i < $groupCount; ++$i) {\n            $dimensions = null;\n            $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();\n            switch ($chartType) {\n                case 'area3DChart':\n                    $dimensions = '3d';\n                    // no break\n                case 'areaChart':\n                    $this->renderPlotLine($i, true, true, $dimensions);\n                    break;\n                case 'bar3DChart':\n                    $dimensions = '3d';\n                    // no break\n                case 'barChart':\n                    $this->renderPlotBar($i, $dimensions);\n                    break;\n                case 'line3DChart':\n                    $dimensions = '3d';\n                    // no break\n                case 'lineChart':\n                    $this->renderPlotLine($i, false, true, $dimensions);\n                    break;\n                case 'scatterChart':\n                    $this->renderPlotScatter($i, false);\n                    break;\n                case 'bubbleChart':\n                    $this->renderPlotScatter($i, true);\n                    break;\n                default:\n                    $this->graph = null;\n                    return false;\n            }\n        }\n\n        $this->renderLegend();\n\n        $this->graph->Stroke($outputDestination);\n        return true;\n    }\n\n\n    public function render($outputDestination)\n    {\n        self::$plotColour = 0;\n\n        $groupCount = $this->chart->getPlotArea()->getPlotGroupCount();\n\n        $dimensions = null;\n        if ($groupCount == 1) {\n            $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType();\n        } else {\n            $chartTypes = array();\n            for ($i = 0; $i < $groupCount; ++$i) {\n                $chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();\n            }\n            $chartTypes = array_unique($chartTypes);\n            if (count($chartTypes) == 1) {\n                $chartType = array_pop($chartTypes);\n            } elseif (count($chartTypes) == 0) {\n                echo 'Chart is not yet implemented<br />';\n                return false;\n            } else {\n                return $this->renderCombinationChart($groupCount, $dimensions, $outputDestination);\n            }\n        }\n\n        switch ($chartType) {\n            case 'area3DChart':\n                $dimensions = '3d';\n                // no break\n            case 'areaChart':\n                $this->renderAreaChart($groupCount, $dimensions);\n                break;\n            case 'bar3DChart':\n                $dimensions = '3d';\n                // no break\n            case 'barChart':\n                $this->renderBarChart($groupCount, $dimensions);\n                break;\n            case 'line3DChart':\n                $dimensions = '3d';\n                // no break\n            case 'lineChart':\n                $this->renderLineChart($groupCount, $dimensions);\n                break;\n            case 'pie3DChart':\n                $dimensions = '3d';\n                // no break\n            case 'pieChart':\n                $this->renderPieChart($groupCount, $dimensions, false, false);\n                break;\n            case 'doughnut3DChart':\n                $dimensions = '3d';\n                // no break\n            case 'doughnutChart':\n                $this->renderPieChart($groupCount, $dimensions, true, true);\n                break;\n            case 'scatterChart':\n                $this->renderScatterChart($groupCount);\n                break;\n            case 'bubbleChart':\n                $this->renderBubbleChart($groupCount);\n                break;\n            case 'radarChart':\n                $this->renderRadarChart($groupCount);\n                break;\n            case 'surface3DChart':\n                $dimensions = '3d';\n                // no break\n            case 'surfaceChart':\n                $this->renderContourChart($groupCount, $dimensions);\n                break;\n            case 'stockChart':\n                $this->renderStockChart($groupCount, $dimensions);\n                break;\n            default:\n                echo $chartType.' is not yet implemented<br />';\n                return false;\n        }\n        $this->renderLegend();\n\n        $this->graph->Stroke($outputDestination);\n        return true;\n    }\n\n\n    /**\n     * Create a new PHPExcel_Chart_Renderer_jpgraph\n     */\n    public function __construct(PHPExcel_Chart $chart)\n    {\n        $this->graph    = null;\n        $this->chart    = $chart;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart/Title.php",
    "content": "<?php\n\n/**\n * PHPExcel_Chart_Title\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart_Title\n{\n\n    /**\n     * Title Caption\n     *\n     * @var string\n     */\n    private $caption = null;\n\n    /**\n     * Title Layout\n     *\n     * @var PHPExcel_Chart_Layout\n     */\n    private $layout = null;\n\n    /**\n     * Create a new PHPExcel_Chart_Title\n     */\n    public function __construct($caption = null, PHPExcel_Chart_Layout $layout = null)\n    {\n        $this->caption = $caption;\n        $this->layout = $layout;\n    }\n\n    /**\n     * Get caption\n     *\n     * @return string\n     */\n    public function getCaption()\n    {\n        return $this->caption;\n    }\n\n    /**\n     * Set caption\n     *\n     * @param string $caption\n     * @return PHPExcel_Chart_Title\n     */\n    public function setCaption($caption = null)\n    {\n        $this->caption = $caption;\n        \n        return $this;\n    }\n\n    /**\n     * Get Layout\n     *\n     * @return PHPExcel_Chart_Layout\n     */\n    public function getLayout()\n    {\n        return $this->layout;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Chart.php",
    "content": "<?php\n\n/**\n * PHPExcel_Chart\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Chart\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Chart\n{\n    /**\n     * Chart Name\n     *\n     * @var string\n     */\n    private $name = '';\n\n    /**\n     * Worksheet\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $worksheet;\n\n    /**\n     * Chart Title\n     *\n     * @var PHPExcel_Chart_Title\n     */\n    private $title;\n\n    /**\n     * Chart Legend\n     *\n     * @var PHPExcel_Chart_Legend\n     */\n    private $legend;\n\n    /**\n     * X-Axis Label\n     *\n     * @var PHPExcel_Chart_Title\n     */\n    private $xAxisLabel;\n\n    /**\n     * Y-Axis Label\n     *\n     * @var PHPExcel_Chart_Title\n     */\n    private $yAxisLabel;\n\n    /**\n     * Chart Plot Area\n     *\n     * @var PHPExcel_Chart_PlotArea\n     */\n    private $plotArea;\n\n    /**\n     * Plot Visible Only\n     *\n     * @var boolean\n     */\n    private $plotVisibleOnly = true;\n\n    /**\n     * Display Blanks as\n     *\n     * @var string\n     */\n    private $displayBlanksAs = '0';\n\n    /**\n     * Chart Asix Y as\n     *\n     * @var PHPExcel_Chart_Axis\n     */\n    private $yAxis;\n\n    /**\n     * Chart Asix X as\n     *\n     * @var PHPExcel_Chart_Axis\n     */\n    private $xAxis;\n\n    /**\n     * Chart Major Gridlines as\n     *\n     * @var PHPExcel_Chart_GridLines\n     */\n    private $majorGridlines;\n\n    /**\n     * Chart Minor Gridlines as\n     *\n     * @var PHPExcel_Chart_GridLines\n     */\n    private $minorGridlines;\n\n    /**\n     * Top-Left Cell Position\n     *\n     * @var string\n     */\n    private $topLeftCellRef = 'A1';\n\n\n    /**\n     * Top-Left X-Offset\n     *\n     * @var integer\n     */\n    private $topLeftXOffset = 0;\n\n\n    /**\n     * Top-Left Y-Offset\n     *\n     * @var integer\n     */\n    private $topLeftYOffset = 0;\n\n\n    /**\n     * Bottom-Right Cell Position\n     *\n     * @var string\n     */\n    private $bottomRightCellRef = 'A1';\n\n\n    /**\n     * Bottom-Right X-Offset\n     *\n     * @var integer\n     */\n    private $bottomRightXOffset = 10;\n\n\n    /**\n     * Bottom-Right Y-Offset\n     *\n     * @var integer\n     */\n    private $bottomRightYOffset = 10;\n\n\n    /**\n     * Create a new PHPExcel_Chart\n     */\n    public function __construct($name, PHPExcel_Chart_Title $title = null, PHPExcel_Chart_Legend $legend = null, PHPExcel_Chart_PlotArea $plotArea = null, $plotVisibleOnly = true, $displayBlanksAs = '0', PHPExcel_Chart_Title $xAxisLabel = null, PHPExcel_Chart_Title $yAxisLabel = null, PHPExcel_Chart_Axis $xAxis = null, PHPExcel_Chart_Axis $yAxis = null, PHPExcel_Chart_GridLines $majorGridlines = null, PHPExcel_Chart_GridLines $minorGridlines = null)\n    {\n        $this->name = $name;\n        $this->title = $title;\n        $this->legend = $legend;\n        $this->xAxisLabel = $xAxisLabel;\n        $this->yAxisLabel = $yAxisLabel;\n        $this->plotArea = $plotArea;\n        $this->plotVisibleOnly = $plotVisibleOnly;\n        $this->displayBlanksAs = $displayBlanksAs;\n        $this->xAxis = $xAxis;\n        $this->yAxis = $yAxis;\n        $this->majorGridlines = $majorGridlines;\n        $this->minorGridlines = $minorGridlines;\n    }\n\n    /**\n     * Get Name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * Get Worksheet\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function getWorksheet()\n    {\n        return $this->worksheet;\n    }\n\n    /**\n     * Set Worksheet\n     *\n     * @param    PHPExcel_Worksheet    $pValue\n     * @throws    PHPExcel_Chart_Exception\n     * @return PHPExcel_Chart\n     */\n    public function setWorksheet(PHPExcel_Worksheet $pValue = null)\n    {\n        $this->worksheet = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get Title\n     *\n     * @return PHPExcel_Chart_Title\n     */\n    public function getTitle()\n    {\n        return $this->title;\n    }\n\n    /**\n     * Set Title\n     *\n     * @param    PHPExcel_Chart_Title $title\n     * @return    PHPExcel_Chart\n     */\n    public function setTitle(PHPExcel_Chart_Title $title)\n    {\n        $this->title = $title;\n\n        return $this;\n    }\n\n    /**\n     * Get Legend\n     *\n     * @return PHPExcel_Chart_Legend\n     */\n    public function getLegend()\n    {\n        return $this->legend;\n    }\n\n    /**\n     * Set Legend\n     *\n     * @param    PHPExcel_Chart_Legend $legend\n     * @return    PHPExcel_Chart\n     */\n    public function setLegend(PHPExcel_Chart_Legend $legend)\n    {\n        $this->legend = $legend;\n\n        return $this;\n    }\n\n    /**\n     * Get X-Axis Label\n     *\n     * @return PHPExcel_Chart_Title\n     */\n    public function getXAxisLabel()\n    {\n        return $this->xAxisLabel;\n    }\n\n    /**\n     * Set X-Axis Label\n     *\n     * @param    PHPExcel_Chart_Title $label\n     * @return    PHPExcel_Chart\n     */\n    public function setXAxisLabel(PHPExcel_Chart_Title $label)\n    {\n        $this->xAxisLabel = $label;\n\n        return $this;\n    }\n\n    /**\n     * Get Y-Axis Label\n     *\n     * @return PHPExcel_Chart_Title\n     */\n    public function getYAxisLabel()\n    {\n        return $this->yAxisLabel;\n    }\n\n    /**\n     * Set Y-Axis Label\n     *\n     * @param    PHPExcel_Chart_Title $label\n     * @return    PHPExcel_Chart\n     */\n    public function setYAxisLabel(PHPExcel_Chart_Title $label)\n    {\n        $this->yAxisLabel = $label;\n\n        return $this;\n    }\n\n    /**\n     * Get Plot Area\n     *\n     * @return PHPExcel_Chart_PlotArea\n     */\n    public function getPlotArea()\n    {\n        return $this->plotArea;\n    }\n\n    /**\n     * Get Plot Visible Only\n     *\n     * @return boolean\n     */\n    public function getPlotVisibleOnly()\n    {\n        return $this->plotVisibleOnly;\n    }\n\n    /**\n     * Set Plot Visible Only\n     *\n     * @param boolean $plotVisibleOnly\n     * @return PHPExcel_Chart\n     */\n    public function setPlotVisibleOnly($plotVisibleOnly = true)\n    {\n        $this->plotVisibleOnly = $plotVisibleOnly;\n\n        return $this;\n    }\n\n    /**\n     * Get Display Blanks as\n     *\n     * @return string\n     */\n    public function getDisplayBlanksAs()\n    {\n        return $this->displayBlanksAs;\n    }\n\n    /**\n     * Set Display Blanks as\n     *\n     * @param string $displayBlanksAs\n     * @return PHPExcel_Chart\n     */\n    public function setDisplayBlanksAs($displayBlanksAs = '0')\n    {\n        $this->displayBlanksAs = $displayBlanksAs;\n    }\n\n\n    /**\n     * Get yAxis\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    public function getChartAxisY()\n    {\n        if ($this->yAxis !== null) {\n            return $this->yAxis;\n        }\n\n        return new PHPExcel_Chart_Axis();\n    }\n\n    /**\n     * Get xAxis\n     *\n     * @return PHPExcel_Chart_Axis\n     */\n    public function getChartAxisX()\n    {\n        if ($this->xAxis !== null) {\n            return $this->xAxis;\n        }\n\n        return new PHPExcel_Chart_Axis();\n    }\n\n    /**\n     * Get Major Gridlines\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n    public function getMajorGridlines()\n    {\n        if ($this->majorGridlines !== null) {\n            return $this->majorGridlines;\n        }\n\n        return new PHPExcel_Chart_GridLines();\n    }\n\n    /**\n     * Get Minor Gridlines\n     *\n     * @return PHPExcel_Chart_GridLines\n     */\n    public function getMinorGridlines()\n    {\n        if ($this->minorGridlines !== null) {\n            return $this->minorGridlines;\n        }\n\n        return new PHPExcel_Chart_GridLines();\n    }\n\n\n    /**\n     * Set the Top Left position for the chart\n     *\n     * @param    string    $cell\n     * @param    integer    $xOffset\n     * @param    integer    $yOffset\n     * @return PHPExcel_Chart\n     */\n    public function setTopLeftPosition($cell, $xOffset = null, $yOffset = null)\n    {\n        $this->topLeftCellRef = $cell;\n        if (!is_null($xOffset)) {\n            $this->setTopLeftXOffset($xOffset);\n        }\n        if (!is_null($yOffset)) {\n            $this->setTopLeftYOffset($yOffset);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get the top left position of the chart\n     *\n     * @return array    an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell\n     */\n    public function getTopLeftPosition()\n    {\n        return array(\n            'cell'    => $this->topLeftCellRef,\n            'xOffset' => $this->topLeftXOffset,\n            'yOffset' => $this->topLeftYOffset\n        );\n    }\n\n    /**\n     * Get the cell address where the top left of the chart is fixed\n     *\n     * @return string\n     */\n    public function getTopLeftCell()\n    {\n        return $this->topLeftCellRef;\n    }\n\n    /**\n     * Set the Top Left cell position for the chart\n     *\n     * @param    string    $cell\n     * @return PHPExcel_Chart\n     */\n    public function setTopLeftCell($cell)\n    {\n        $this->topLeftCellRef = $cell;\n\n        return $this;\n    }\n\n    /**\n     * Set the offset position within the Top Left cell for the chart\n     *\n     * @param    integer    $xOffset\n     * @param    integer    $yOffset\n     * @return PHPExcel_Chart\n     */\n    public function setTopLeftOffset($xOffset = null, $yOffset = null)\n    {\n        if (!is_null($xOffset)) {\n            $this->setTopLeftXOffset($xOffset);\n        }\n        if (!is_null($yOffset)) {\n            $this->setTopLeftYOffset($yOffset);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get the offset position within the Top Left cell for the chart\n     *\n     * @return integer[]\n     */\n    public function getTopLeftOffset()\n    {\n        return array(\n            'X' => $this->topLeftXOffset,\n            'Y' => $this->topLeftYOffset\n        );\n    }\n\n    public function setTopLeftXOffset($xOffset)\n    {\n        $this->topLeftXOffset = $xOffset;\n\n        return $this;\n    }\n\n    public function getTopLeftXOffset()\n    {\n        return $this->topLeftXOffset;\n    }\n\n    public function setTopLeftYOffset($yOffset)\n    {\n        $this->topLeftYOffset = $yOffset;\n\n        return $this;\n    }\n\n    public function getTopLeftYOffset()\n    {\n        return $this->topLeftYOffset;\n    }\n\n    /**\n     * Set the Bottom Right position of the chart\n     *\n     * @param    string    $cell\n     * @param    integer    $xOffset\n     * @param    integer    $yOffset\n     * @return PHPExcel_Chart\n     */\n    public function setBottomRightPosition($cell, $xOffset = null, $yOffset = null)\n    {\n        $this->bottomRightCellRef = $cell;\n        if (!is_null($xOffset)) {\n            $this->setBottomRightXOffset($xOffset);\n        }\n        if (!is_null($yOffset)) {\n            $this->setBottomRightYOffset($yOffset);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get the bottom right position of the chart\n     *\n     * @return array    an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell\n     */\n    public function getBottomRightPosition()\n    {\n        return array(\n            'cell'    => $this->bottomRightCellRef,\n            'xOffset' => $this->bottomRightXOffset,\n            'yOffset' => $this->bottomRightYOffset\n        );\n    }\n\n    public function setBottomRightCell($cell)\n    {\n        $this->bottomRightCellRef = $cell;\n\n        return $this;\n    }\n\n    /**\n     * Get the cell address where the bottom right of the chart is fixed\n     *\n     * @return string\n     */\n    public function getBottomRightCell()\n    {\n        return $this->bottomRightCellRef;\n    }\n\n    /**\n     * Set the offset position within the Bottom Right cell for the chart\n     *\n     * @param    integer    $xOffset\n     * @param    integer    $yOffset\n     * @return PHPExcel_Chart\n     */\n    public function setBottomRightOffset($xOffset = null, $yOffset = null)\n    {\n        if (!is_null($xOffset)) {\n            $this->setBottomRightXOffset($xOffset);\n        }\n        if (!is_null($yOffset)) {\n            $this->setBottomRightYOffset($yOffset);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get the offset position within the Bottom Right cell for the chart\n     *\n     * @return integer[]\n     */\n    public function getBottomRightOffset()\n    {\n        return array(\n            'X' => $this->bottomRightXOffset,\n            'Y' => $this->bottomRightYOffset\n        );\n    }\n\n    public function setBottomRightXOffset($xOffset)\n    {\n        $this->bottomRightXOffset = $xOffset;\n\n        return $this;\n    }\n\n    public function getBottomRightXOffset()\n    {\n        return $this->bottomRightXOffset;\n    }\n\n    public function setBottomRightYOffset($yOffset)\n    {\n        $this->bottomRightYOffset = $yOffset;\n\n        return $this;\n    }\n\n    public function getBottomRightYOffset()\n    {\n        return $this->bottomRightYOffset;\n    }\n\n\n    public function refresh()\n    {\n        if ($this->worksheet !== null) {\n            $this->plotArea->refresh($this->worksheet);\n        }\n    }\n\n    public function render($outputDestination = null)\n    {\n        $libraryName = PHPExcel_Settings::getChartRendererName();\n        if (is_null($libraryName)) {\n            return false;\n        }\n        //    Ensure that data series values are up-to-date before we render\n        $this->refresh();\n\n        $libraryPath = PHPExcel_Settings::getChartRendererPath();\n        $includePath = str_replace('\\\\', '/', get_include_path());\n        $rendererPath = str_replace('\\\\', '/', $libraryPath);\n        if (strpos($rendererPath, $includePath) === false) {\n            set_include_path(get_include_path() . PATH_SEPARATOR . $libraryPath);\n        }\n\n        $rendererName = 'PHPExcel_Chart_Renderer_'.$libraryName;\n        $renderer = new $rendererName($this);\n\n        if ($outputDestination == 'php://output') {\n            $outputDestination = null;\n        }\n        return $renderer->render($outputDestination);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Comment.php",
    "content": "<?php\n\n/**\n * PHPExcel_Comment\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Comment implements PHPExcel_IComparable\n{\n    /**\n     * Author\n     *\n     * @var string\n     */\n    private $author;\n\n    /**\n     * Rich text comment\n     *\n     * @var PHPExcel_RichText\n     */\n    private $text;\n\n    /**\n     * Comment width (CSS style, i.e. XXpx or YYpt)\n     *\n     * @var string\n     */\n    private $width = '96pt';\n\n    /**\n     * Left margin (CSS style, i.e. XXpx or YYpt)\n     *\n     * @var string\n     */\n    private $marginLeft = '59.25pt';\n\n    /**\n     * Top margin (CSS style, i.e. XXpx or YYpt)\n     *\n     * @var string\n     */\n    private $marginTop = '1.5pt';\n\n    /**\n     * Visible\n     *\n     * @var boolean\n     */\n    private $visible = false;\n\n    /**\n     * Comment height (CSS style, i.e. XXpx or YYpt)\n     *\n     * @var string\n     */\n    private $height = '55.5pt';\n\n    /**\n     * Comment fill color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    private $fillColor;\n\n    /**\n     * Alignment\n     *\n     * @var string\n     */\n    private $alignment;\n\n    /**\n     * Create a new PHPExcel_Comment\n     *\n     * @throws PHPExcel_Exception\n     */\n    public function __construct()\n    {\n        // Initialise variables\n        $this->author    = 'Author';\n        $this->text      = new PHPExcel_RichText();\n        $this->fillColor = new PHPExcel_Style_Color('FFFFFFE1');\n        $this->alignment = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL;\n    }\n\n    /**\n     * Get Author\n     *\n     * @return string\n     */\n    public function getAuthor()\n    {\n        return $this->author;\n    }\n\n    /**\n     * Set Author\n     *\n     * @param string $pValue\n     * @return PHPExcel_Comment\n     */\n    public function setAuthor($pValue = '')\n    {\n        $this->author = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Rich text comment\n     *\n     * @return PHPExcel_RichText\n     */\n    public function getText()\n    {\n        return $this->text;\n    }\n\n    /**\n     * Set Rich text comment\n     *\n     * @param PHPExcel_RichText $pValue\n     * @return PHPExcel_Comment\n     */\n    public function setText(PHPExcel_RichText $pValue)\n    {\n        $this->text = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get comment width (CSS style, i.e. XXpx or YYpt)\n     *\n     * @return string\n     */\n    public function getWidth()\n    {\n        return $this->width;\n    }\n\n    /**\n     * Set comment width (CSS style, i.e. XXpx or YYpt)\n     *\n     * @param string $value\n     * @return PHPExcel_Comment\n     */\n    public function setWidth($value = '96pt')\n    {\n        $this->width = $value;\n        return $this;\n    }\n\n    /**\n     * Get comment height (CSS style, i.e. XXpx or YYpt)\n     *\n     * @return string\n     */\n    public function getHeight()\n    {\n        return $this->height;\n    }\n\n    /**\n     * Set comment height (CSS style, i.e. XXpx or YYpt)\n     *\n     * @param string $value\n     * @return PHPExcel_Comment\n     */\n    public function setHeight($value = '55.5pt')\n    {\n        $this->height = $value;\n        return $this;\n    }\n\n    /**\n     * Get left margin (CSS style, i.e. XXpx or YYpt)\n     *\n     * @return string\n     */\n    public function getMarginLeft()\n    {\n        return $this->marginLeft;\n    }\n\n    /**\n     * Set left margin (CSS style, i.e. XXpx or YYpt)\n     *\n     * @param string $value\n     * @return PHPExcel_Comment\n     */\n    public function setMarginLeft($value = '59.25pt')\n    {\n        $this->marginLeft = $value;\n        return $this;\n    }\n\n    /**\n     * Get top margin (CSS style, i.e. XXpx or YYpt)\n     *\n     * @return string\n     */\n    public function getMarginTop()\n    {\n        return $this->marginTop;\n    }\n\n    /**\n     * Set top margin (CSS style, i.e. XXpx or YYpt)\n     *\n     * @param string $value\n     * @return PHPExcel_Comment\n     */\n    public function setMarginTop($value = '1.5pt')\n    {\n        $this->marginTop = $value;\n        return $this;\n    }\n\n    /**\n     * Is the comment visible by default?\n     *\n     * @return boolean\n     */\n    public function getVisible()\n    {\n        return $this->visible;\n    }\n\n    /**\n     * Set comment default visibility\n     *\n     * @param boolean $value\n     * @return PHPExcel_Comment\n     */\n    public function setVisible($value = false)\n    {\n        $this->visible = $value;\n        return $this;\n    }\n\n    /**\n     * Get fill color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getFillColor()\n    {\n        return $this->fillColor;\n    }\n\n    /**\n     * Set Alignment\n     *\n     * @param string $pValue\n     * @return PHPExcel_Comment\n     */\n    public function setAlignment($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL)\n    {\n        $this->alignment = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Alignment\n     *\n     * @return string\n     */\n    public function getAlignment()\n    {\n        return $this->alignment;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->author .\n            $this->text->getHashCode() .\n            $this->width .\n            $this->height .\n            $this->marginLeft .\n            $this->marginTop .\n            ($this->visible ? 1 : 0) .\n            $this->fillColor->getHashCode() .\n            $this->alignment .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n\n    /**\n     * Convert to string\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->text->getPlainText();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/DocumentProperties.php",
    "content": "<?php\n\n/**\n * PHPExcel_DocumentProperties\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package    PHPExcel\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_DocumentProperties\n{\n    /** constants */\n    const PROPERTY_TYPE_BOOLEAN = 'b';\n    const PROPERTY_TYPE_INTEGER = 'i';\n    const PROPERTY_TYPE_FLOAT   = 'f';\n    const PROPERTY_TYPE_DATE    = 'd';\n    const PROPERTY_TYPE_STRING  = 's';\n    const PROPERTY_TYPE_UNKNOWN = 'u';\n\n    /**\n     * Creator\n     *\n     * @var string\n     */\n    private $creator = 'Unknown Creator';\n\n    /**\n     * LastModifiedBy\n     *\n     * @var string\n     */\n    private $lastModifiedBy;\n\n    /**\n     * Created\n     *\n     * @var datetime\n     */\n    private $created;\n\n    /**\n     * Modified\n     *\n     * @var datetime\n     */\n    private $modified;\n\n    /**\n     * Title\n     *\n     * @var string\n     */\n    private $title = 'Untitled Spreadsheet';\n\n    /**\n     * Description\n     *\n     * @var string\n     */\n    private $description = '';\n\n    /**\n     * Subject\n     *\n     * @var string\n     */\n    private $subject = '';\n\n    /**\n     * Keywords\n     *\n     * @var string\n     */\n    private $keywords = '';\n\n    /**\n     * Category\n     *\n     * @var string\n     */\n    private $category = '';\n\n    /**\n     * Manager\n     *\n     * @var string\n     */\n    private $manager = '';\n\n    /**\n     * Company\n     *\n     * @var string\n     */\n    private $company = 'Microsoft Corporation';\n\n    /**\n     * Custom Properties\n     *\n     * @var string\n     */\n    private $customProperties = array();\n\n\n    /**\n     * Create a new PHPExcel_DocumentProperties\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->lastModifiedBy = $this->creator;\n        $this->created  = time();\n        $this->modified = time();\n    }\n\n    /**\n     * Get Creator\n     *\n     * @return string\n     */\n    public function getCreator()\n    {\n        return $this->creator;\n    }\n\n    /**\n     * Set Creator\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setCreator($pValue = '')\n    {\n        $this->creator = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Last Modified By\n     *\n     * @return string\n     */\n    public function getLastModifiedBy()\n    {\n        return $this->lastModifiedBy;\n    }\n\n    /**\n     * Set Last Modified By\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setLastModifiedBy($pValue = '')\n    {\n        $this->lastModifiedBy = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Created\n     *\n     * @return datetime\n     */\n    public function getCreated()\n    {\n        return $this->created;\n    }\n\n    /**\n     * Set Created\n     *\n     * @param datetime $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setCreated($pValue = null)\n    {\n        if ($pValue === null) {\n            $pValue = time();\n        } elseif (is_string($pValue)) {\n            if (is_numeric($pValue)) {\n                $pValue = intval($pValue);\n            } else {\n                $pValue = strtotime($pValue);\n            }\n        }\n\n        $this->created = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Modified\n     *\n     * @return datetime\n     */\n    public function getModified()\n    {\n        return $this->modified;\n    }\n\n    /**\n     * Set Modified\n     *\n     * @param datetime $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setModified($pValue = null)\n    {\n        if ($pValue === null) {\n            $pValue = time();\n        } elseif (is_string($pValue)) {\n            if (is_numeric($pValue)) {\n                $pValue = intval($pValue);\n            } else {\n                $pValue = strtotime($pValue);\n            }\n        }\n\n        $this->modified = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Title\n     *\n     * @return string\n     */\n    public function getTitle()\n    {\n        return $this->title;\n    }\n\n    /**\n     * Set Title\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setTitle($pValue = '')\n    {\n        $this->title = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Description\n     *\n     * @return string\n     */\n    public function getDescription()\n    {\n        return $this->description;\n    }\n\n    /**\n     * Set Description\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setDescription($pValue = '')\n    {\n        $this->description = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Subject\n     *\n     * @return string\n     */\n    public function getSubject()\n    {\n        return $this->subject;\n    }\n\n    /**\n     * Set Subject\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setSubject($pValue = '')\n    {\n        $this->subject = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Keywords\n     *\n     * @return string\n     */\n    public function getKeywords()\n    {\n        return $this->keywords;\n    }\n\n    /**\n     * Set Keywords\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setKeywords($pValue = '')\n    {\n        $this->keywords = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Category\n     *\n     * @return string\n     */\n    public function getCategory()\n    {\n        return $this->category;\n    }\n\n    /**\n     * Set Category\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setCategory($pValue = '')\n    {\n        $this->category = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Company\n     *\n     * @return string\n     */\n    public function getCompany()\n    {\n        return $this->company;\n    }\n\n    /**\n     * Set Company\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setCompany($pValue = '')\n    {\n        $this->company = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Manager\n     *\n     * @return string\n     */\n    public function getManager()\n    {\n        return $this->manager;\n    }\n\n    /**\n     * Set Manager\n     *\n     * @param string $pValue\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setManager($pValue = '')\n    {\n        $this->manager = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get a List of Custom Property Names\n     *\n     * @return array of string\n     */\n    public function getCustomProperties()\n    {\n        return array_keys($this->customProperties);\n    }\n\n    /**\n     * Check if a Custom Property is defined\n     *\n     * @param string $propertyName\n     * @return boolean\n     */\n    public function isCustomPropertySet($propertyName)\n    {\n        return isset($this->customProperties[$propertyName]);\n    }\n\n    /**\n     * Get a Custom Property Value\n     *\n     * @param string $propertyName\n     * @return string\n     */\n    public function getCustomPropertyValue($propertyName)\n    {\n        if (isset($this->customProperties[$propertyName])) {\n            return $this->customProperties[$propertyName]['value'];\n        }\n\n    }\n\n    /**\n     * Get a Custom Property Type\n     *\n     * @param string $propertyName\n     * @return string\n     */\n    public function getCustomPropertyType($propertyName)\n    {\n        if (isset($this->customProperties[$propertyName])) {\n            return $this->customProperties[$propertyName]['type'];\n        }\n\n    }\n\n    /**\n     * Set a Custom Property\n     *\n     * @param string $propertyName\n     * @param mixed $propertyValue\n     * @param string $propertyType\n     *      'i'    : Integer\n     *   'f' : Floating Point\n     *   's' : String\n     *   'd' : Date/Time\n     *   'b' : Boolean\n     * @return PHPExcel_DocumentProperties\n     */\n    public function setCustomProperty($propertyName, $propertyValue = '', $propertyType = null)\n    {\n        if (($propertyType === null) || (!in_array($propertyType, array(self::PROPERTY_TYPE_INTEGER,\n                                                                        self::PROPERTY_TYPE_FLOAT,\n                                                                        self::PROPERTY_TYPE_STRING,\n                                                                        self::PROPERTY_TYPE_DATE,\n                                                                        self::PROPERTY_TYPE_BOOLEAN)))) {\n            if ($propertyValue === null) {\n                $propertyType = self::PROPERTY_TYPE_STRING;\n            } elseif (is_float($propertyValue)) {\n                $propertyType = self::PROPERTY_TYPE_FLOAT;\n            } elseif (is_int($propertyValue)) {\n                $propertyType = self::PROPERTY_TYPE_INTEGER;\n            } elseif (is_bool($propertyValue)) {\n                $propertyType = self::PROPERTY_TYPE_BOOLEAN;\n            } else {\n                $propertyType = self::PROPERTY_TYPE_STRING;\n            }\n        }\n\n        $this->customProperties[$propertyName] = array(\n            'value' => $propertyValue,\n            'type' => $propertyType\n        );\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n\n    public static function convertProperty($propertyValue, $propertyType)\n    {\n        switch ($propertyType) {\n            case 'empty':     //    Empty\n                return '';\n                break;\n            case 'null':      //    Null\n                return null;\n                break;\n            case 'i1':        //    1-Byte Signed Integer\n            case 'i2':        //    2-Byte Signed Integer\n            case 'i4':        //    4-Byte Signed Integer\n            case 'i8':        //    8-Byte Signed Integer\n            case 'int':       //    Integer\n                return (int) $propertyValue;\n                break;\n            case 'ui1':       //    1-Byte Unsigned Integer\n            case 'ui2':       //    2-Byte Unsigned Integer\n            case 'ui4':       //    4-Byte Unsigned Integer\n            case 'ui8':       //    8-Byte Unsigned Integer\n            case 'uint':      //    Unsigned Integer\n                return abs((int) $propertyValue);\n                break;\n            case 'r4':        //    4-Byte Real Number\n            case 'r8':        //    8-Byte Real Number\n            case 'decimal':   //    Decimal\n                return (float) $propertyValue;\n                break;\n            case 'lpstr':     //    LPSTR\n            case 'lpwstr':    //    LPWSTR\n            case 'bstr':      //    Basic String\n                return $propertyValue;\n                break;\n            case 'date':      //    Date and Time\n            case 'filetime':  //    File Time\n                return strtotime($propertyValue);\n                break;\n            case 'bool':     //    Boolean\n                return ($propertyValue == 'true') ? true : false;\n                break;\n            case 'cy':       //    Currency\n            case 'error':    //    Error Status Code\n            case 'vector':   //    Vector\n            case 'array':    //    Array\n            case 'blob':     //    Binary Blob\n            case 'oblob':    //    Binary Blob Object\n            case 'stream':   //    Binary Stream\n            case 'ostream':  //    Binary Stream Object\n            case 'storage':  //    Binary Storage\n            case 'ostorage': //    Binary Storage Object\n            case 'vstream':  //    Binary Versioned Stream\n            case 'clsid':    //    Class ID\n            case 'cf':       //    Clipboard Data\n                return $propertyValue;\n                break;\n        }\n        return $propertyValue;\n    }\n\n    public static function convertPropertyType($propertyType)\n    {\n        switch ($propertyType) {\n            case 'i1':       //    1-Byte Signed Integer\n            case 'i2':       //    2-Byte Signed Integer\n            case 'i4':       //    4-Byte Signed Integer\n            case 'i8':       //    8-Byte Signed Integer\n            case 'int':      //    Integer\n            case 'ui1':      //    1-Byte Unsigned Integer\n            case 'ui2':      //    2-Byte Unsigned Integer\n            case 'ui4':      //    4-Byte Unsigned Integer\n            case 'ui8':      //    8-Byte Unsigned Integer\n            case 'uint':     //    Unsigned Integer\n                return self::PROPERTY_TYPE_INTEGER;\n                break;\n            case 'r4':       //    4-Byte Real Number\n            case 'r8':       //    8-Byte Real Number\n            case 'decimal':  //    Decimal\n                return self::PROPERTY_TYPE_FLOAT;\n                break;\n            case 'empty':    //    Empty\n            case 'null':     //    Null\n            case 'lpstr':    //    LPSTR\n            case 'lpwstr':   //    LPWSTR\n            case 'bstr':     //    Basic String\n                return self::PROPERTY_TYPE_STRING;\n                break;\n            case 'date':     //    Date and Time\n            case 'filetime': //    File Time\n                return self::PROPERTY_TYPE_DATE;\n                break;\n            case 'bool':     //    Boolean\n                return self::PROPERTY_TYPE_BOOLEAN;\n                break;\n            case 'cy':       //    Currency\n            case 'error':    //    Error Status Code\n            case 'vector':   //    Vector\n            case 'array':    //    Array\n            case 'blob':     //    Binary Blob\n            case 'oblob':    //    Binary Blob Object\n            case 'stream':   //    Binary Stream\n            case 'ostream':  //    Binary Stream Object\n            case 'storage':  //    Binary Storage\n            case 'ostorage': //    Binary Storage Object\n            case 'vstream':  //    Binary Versioned Stream\n            case 'clsid':    //    Class ID\n            case 'cf':       //    Clipboard Data\n                return self::PROPERTY_TYPE_UNKNOWN;\n                break;\n        }\n        return self::PROPERTY_TYPE_UNKNOWN;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/DocumentSecurity.php",
    "content": "<?php\n\n/**\n * PHPExcel_DocumentSecurity\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_DocumentSecurity\n{\n    /**\n     * LockRevision\n     *\n     * @var boolean\n     */\n    private $lockRevision;\n\n    /**\n     * LockStructure\n     *\n     * @var boolean\n     */\n    private $lockStructure;\n\n    /**\n     * LockWindows\n     *\n     * @var boolean\n     */\n    private $lockWindows;\n\n    /**\n     * RevisionsPassword\n     *\n     * @var string\n     */\n    private $revisionsPassword;\n\n    /**\n     * WorkbookPassword\n     *\n     * @var string\n     */\n    private $workbookPassword;\n\n    /**\n     * Create a new PHPExcel_DocumentSecurity\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->lockRevision      = false;\n        $this->lockStructure     = false;\n        $this->lockWindows       = false;\n        $this->revisionsPassword = '';\n        $this->workbookPassword  = '';\n    }\n\n    /**\n     * Is some sort of document security enabled?\n     *\n     * @return boolean\n     */\n    public function isSecurityEnabled()\n    {\n        return  $this->lockRevision ||\n                $this->lockStructure ||\n                $this->lockWindows;\n    }\n\n    /**\n     * Get LockRevision\n     *\n     * @return boolean\n     */\n    public function getLockRevision()\n    {\n        return $this->lockRevision;\n    }\n\n    /**\n     * Set LockRevision\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_DocumentSecurity\n     */\n    public function setLockRevision($pValue = false)\n    {\n        $this->lockRevision = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get LockStructure\n     *\n     * @return boolean\n     */\n    public function getLockStructure()\n    {\n        return $this->lockStructure;\n    }\n\n    /**\n     * Set LockStructure\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_DocumentSecurity\n     */\n    public function setLockStructure($pValue = false)\n    {\n        $this->lockStructure = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get LockWindows\n     *\n     * @return boolean\n     */\n    public function getLockWindows()\n    {\n        return $this->lockWindows;\n    }\n\n    /**\n     * Set LockWindows\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_DocumentSecurity\n     */\n    public function setLockWindows($pValue = false)\n    {\n        $this->lockWindows = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get RevisionsPassword (hashed)\n     *\n     * @return string\n     */\n    public function getRevisionsPassword()\n    {\n        return $this->revisionsPassword;\n    }\n\n    /**\n     * Set RevisionsPassword\n     *\n     * @param string     $pValue\n     * @param boolean     $pAlreadyHashed If the password has already been hashed, set this to true\n     * @return PHPExcel_DocumentSecurity\n     */\n    public function setRevisionsPassword($pValue = '', $pAlreadyHashed = false)\n    {\n        if (!$pAlreadyHashed) {\n            $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue);\n        }\n        $this->revisionsPassword = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get WorkbookPassword (hashed)\n     *\n     * @return string\n     */\n    public function getWorkbookPassword()\n    {\n        return $this->workbookPassword;\n    }\n\n    /**\n     * Set WorkbookPassword\n     *\n     * @param string     $pValue\n     * @param boolean     $pAlreadyHashed If the password has already been hashed, set this to true\n     * @return PHPExcel_DocumentSecurity\n     */\n    public function setWorkbookPassword($pValue = '', $pAlreadyHashed = false)\n    {\n        if (!$pAlreadyHashed) {\n            $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue);\n        }\n        $this->workbookPassword = $pValue;\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Exception.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Exception\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Exception extends Exception\n{\n    /**\n     * Error handler callback\n     *\n     * @param mixed $code\n     * @param mixed $string\n     * @param mixed $file\n     * @param mixed $line\n     * @param mixed $context\n     */\n    public static function errorHandlerCallback($code, $string, $file, $line, $context)\n    {\n        $e = new self($string, $code);\n        $e->line = $line;\n        $e->file = $file;\n        throw $e;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/HashTable.php",
    "content": "<?php\n\n/**\n * PHPExcel_HashTable\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_HashTable\n{\n    /**\n     * HashTable elements\n     *\n     * @var array\n     */\n    protected $items = array();\n\n    /**\n     * HashTable key map\n     *\n     * @var array\n     */\n    protected $keyMap = array();\n\n    /**\n     * Create a new PHPExcel_HashTable\n     *\n     * @param    PHPExcel_IComparable[] $pSource    Optional source array to create HashTable from\n     * @throws    PHPExcel_Exception\n     */\n    public function __construct($pSource = null)\n    {\n        if ($pSource !== null) {\n            // Create HashTable\n            $this->addFromSource($pSource);\n        }\n    }\n\n    /**\n     * Add HashTable items from source\n     *\n     * @param    PHPExcel_IComparable[] $pSource    Source array to create HashTable from\n     * @throws    PHPExcel_Exception\n     */\n    public function addFromSource($pSource = null)\n    {\n        // Check if an array was passed\n        if ($pSource == null) {\n            return;\n        } elseif (!is_array($pSource)) {\n            throw new PHPExcel_Exception('Invalid array parameter passed.');\n        }\n\n        foreach ($pSource as $item) {\n            $this->add($item);\n        }\n    }\n\n    /**\n     * Add HashTable item\n     *\n     * @param    PHPExcel_IComparable $pSource    Item to add\n     * @throws    PHPExcel_Exception\n     */\n    public function add(PHPExcel_IComparable $pSource = null)\n    {\n        $hash = $pSource->getHashCode();\n        if (!isset($this->items[$hash])) {\n            $this->items[$hash] = $pSource;\n            $this->keyMap[count($this->items) - 1] = $hash;\n        }\n    }\n\n    /**\n     * Remove HashTable item\n     *\n     * @param    PHPExcel_IComparable $pSource    Item to remove\n     * @throws    PHPExcel_Exception\n     */\n    public function remove(PHPExcel_IComparable $pSource = null)\n    {\n        $hash = $pSource->getHashCode();\n        if (isset($this->items[$hash])) {\n            unset($this->items[$hash]);\n\n            $deleteKey = -1;\n            foreach ($this->keyMap as $key => $value) {\n                if ($deleteKey >= 0) {\n                    $this->keyMap[$key - 1] = $value;\n                }\n\n                if ($value == $hash) {\n                    $deleteKey = $key;\n                }\n            }\n            unset($this->keyMap[count($this->keyMap) - 1]);\n        }\n    }\n\n    /**\n     * Clear HashTable\n     *\n     */\n    public function clear()\n    {\n        $this->items = array();\n        $this->keyMap = array();\n    }\n\n    /**\n     * Count\n     *\n     * @return int\n     */\n    public function count()\n    {\n        return count($this->items);\n    }\n\n    /**\n     * Get index for hash code\n     *\n     * @param    string    $pHashCode\n     * @return    int    Index\n     */\n    public function getIndexForHashCode($pHashCode = '')\n    {\n        return array_search($pHashCode, $this->keyMap);\n    }\n\n    /**\n     * Get by index\n     *\n     * @param    int    $pIndex\n     * @return    PHPExcel_IComparable\n     *\n     */\n    public function getByIndex($pIndex = 0)\n    {\n        if (isset($this->keyMap[$pIndex])) {\n            return $this->getByHashCode($this->keyMap[$pIndex]);\n        }\n\n        return null;\n    }\n\n    /**\n     * Get by hashcode\n     *\n     * @param    string    $pHashCode\n     * @return    PHPExcel_IComparable\n     *\n     */\n    public function getByHashCode($pHashCode = '')\n    {\n        if (isset($this->items[$pHashCode])) {\n            return $this->items[$pHashCode];\n        }\n\n        return null;\n    }\n\n    /**\n     * HashTable to array\n     *\n     * @return PHPExcel_IComparable[]\n     */\n    public function toArray()\n    {\n        return $this->items;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Helper/HTML.php",
    "content": "<?php\n\nclass PHPExcel_Helper_HTML\n{\n    protected static $colourMap = array(\n        'aliceblue' => 'f0f8ff',\n        'antiquewhite' => 'faebd7',\n        'antiquewhite1' => 'ffefdb',\n        'antiquewhite2' => 'eedfcc',\n        'antiquewhite3' => 'cdc0b0',\n        'antiquewhite4' => '8b8378',\n        'aqua' => '00ffff',\n        'aquamarine1' => '7fffd4',\n        'aquamarine2' => '76eec6',\n        'aquamarine4' => '458b74',\n        'azure1' => 'f0ffff',\n        'azure2' => 'e0eeee',\n        'azure3' => 'c1cdcd',\n        'azure4' => '838b8b',\n        'beige' => 'f5f5dc',\n        'bisque1' => 'ffe4c4',\n        'bisque2' => 'eed5b7',\n        'bisque3' => 'cdb79e',\n        'bisque4' => '8b7d6b',\n        'black' => '000000',\n        'blanchedalmond' => 'ffebcd',\n        'blue' => '0000ff',\n        'blue1' => '0000ff',\n        'blue2' => '0000ee',\n        'blue4' => '00008b',\n        'blueviolet' => '8a2be2',\n        'brown' => 'a52a2a',\n        'brown1' => 'ff4040',\n        'brown2' => 'ee3b3b',\n        'brown3' => 'cd3333',\n        'brown4' => '8b2323',\n        'burlywood' => 'deb887',\n        'burlywood1' => 'ffd39b',\n        'burlywood2' => 'eec591',\n        'burlywood3' => 'cdaa7d',\n        'burlywood4' => '8b7355',\n        'cadetblue' => '5f9ea0',\n        'cadetblue1' => '98f5ff',\n        'cadetblue2' => '8ee5ee',\n        'cadetblue3' => '7ac5cd',\n        'cadetblue4' => '53868b',\n        'chartreuse1' => '7fff00',\n        'chartreuse2' => '76ee00',\n        'chartreuse3' => '66cd00',\n        'chartreuse4' => '458b00',\n        'chocolate' => 'd2691e',\n        'chocolate1' => 'ff7f24',\n        'chocolate2' => 'ee7621',\n        'chocolate3' => 'cd661d',\n        'coral' => 'ff7f50',\n        'coral1' => 'ff7256',\n        'coral2' => 'ee6a50',\n        'coral3' => 'cd5b45',\n        'coral4' => '8b3e2f',\n        'cornflowerblue' => '6495ed',\n        'cornsilk1' => 'fff8dc',\n        'cornsilk2' => 'eee8cd',\n        'cornsilk3' => 'cdc8b1',\n        'cornsilk4' => '8b8878',\n        'cyan1' => '00ffff',\n        'cyan2' => '00eeee',\n        'cyan3' => '00cdcd',\n        'cyan4' => '008b8b',\n        'darkgoldenrod' => 'b8860b',\n        'darkgoldenrod1' => 'ffb90f',\n        'darkgoldenrod2' => 'eead0e',\n        'darkgoldenrod3' => 'cd950c',\n        'darkgoldenrod4' => '8b6508',\n        'darkgreen' => '006400',\n        'darkkhaki' => 'bdb76b',\n        'darkolivegreen' => '556b2f',\n        'darkolivegreen1' => 'caff70',\n        'darkolivegreen2' => 'bcee68',\n        'darkolivegreen3' => 'a2cd5a',\n        'darkolivegreen4' => '6e8b3d',\n        'darkorange' => 'ff8c00',\n        'darkorange1' => 'ff7f00',\n        'darkorange2' => 'ee7600',\n        'darkorange3' => 'cd6600',\n        'darkorange4' => '8b4500',\n        'darkorchid' => '9932cc',\n        'darkorchid1' => 'bf3eff',\n        'darkorchid2' => 'b23aee',\n        'darkorchid3' => '9a32cd',\n        'darkorchid4' => '68228b',\n        'darksalmon' => 'e9967a',\n        'darkseagreen' => '8fbc8f',\n        'darkseagreen1' => 'c1ffc1',\n        'darkseagreen2' => 'b4eeb4',\n        'darkseagreen3' => '9bcd9b',\n        'darkseagreen4' => '698b69',\n        'darkslateblue' => '483d8b',\n        'darkslategray' => '2f4f4f',\n        'darkslategray1' => '97ffff',\n        'darkslategray2' => '8deeee',\n        'darkslategray3' => '79cdcd',\n        'darkslategray4' => '528b8b',\n        'darkturquoise' => '00ced1',\n        'darkviolet' => '9400d3',\n        'deeppink1' => 'ff1493',\n        'deeppink2' => 'ee1289',\n        'deeppink3' => 'cd1076',\n        'deeppink4' => '8b0a50',\n        'deepskyblue1' => '00bfff',\n        'deepskyblue2' => '00b2ee',\n        'deepskyblue3' => '009acd',\n        'deepskyblue4' => '00688b',\n        'dimgray' => '696969',\n        'dodgerblue1' => '1e90ff',\n        'dodgerblue2' => '1c86ee',\n        'dodgerblue3' => '1874cd',\n        'dodgerblue4' => '104e8b',\n        'firebrick' => 'b22222',\n        'firebrick1' => 'ff3030',\n        'firebrick2' => 'ee2c2c',\n        'firebrick3' => 'cd2626',\n        'firebrick4' => '8b1a1a',\n        'floralwhite' => 'fffaf0',\n        'forestgreen' => '228b22',\n        'fuchsia' => 'ff00ff',\n        'gainsboro' => 'dcdcdc',\n        'ghostwhite' => 'f8f8ff',\n        'gold1' => 'ffd700',\n        'gold2' => 'eec900',\n        'gold3' => 'cdad00',\n        'gold4' => '8b7500',\n        'goldenrod' => 'daa520',\n        'goldenrod1' => 'ffc125',\n        'goldenrod2' => 'eeb422',\n        'goldenrod3' => 'cd9b1d',\n        'goldenrod4' => '8b6914',\n        'gray' => 'bebebe',\n        'gray1' => '030303',\n        'gray10' => '1a1a1a',\n        'gray11' => '1c1c1c',\n        'gray12' => '1f1f1f',\n        'gray13' => '212121',\n        'gray14' => '242424',\n        'gray15' => '262626',\n        'gray16' => '292929',\n        'gray17' => '2b2b2b',\n        'gray18' => '2e2e2e',\n        'gray19' => '303030',\n        'gray2' => '050505',\n        'gray20' => '333333',\n        'gray21' => '363636',\n        'gray22' => '383838',\n        'gray23' => '3b3b3b',\n        'gray24' => '3d3d3d',\n        'gray25' => '404040',\n        'gray26' => '424242',\n        'gray27' => '454545',\n        'gray28' => '474747',\n        'gray29' => '4a4a4a',\n        'gray3' => '080808',\n        'gray30' => '4d4d4d',\n        'gray31' => '4f4f4f',\n        'gray32' => '525252',\n        'gray33' => '545454',\n        'gray34' => '575757',\n        'gray35' => '595959',\n        'gray36' => '5c5c5c',\n        'gray37' => '5e5e5e',\n        'gray38' => '616161',\n        'gray39' => '636363',\n        'gray4' => '0a0a0a',\n        'gray40' => '666666',\n        'gray41' => '696969',\n        'gray42' => '6b6b6b',\n        'gray43' => '6e6e6e',\n        'gray44' => '707070',\n        'gray45' => '737373',\n        'gray46' => '757575',\n        'gray47' => '787878',\n        'gray48' => '7a7a7a',\n        'gray49' => '7d7d7d',\n        'gray5' => '0d0d0d',\n        'gray50' => '7f7f7f',\n        'gray51' => '828282',\n        'gray52' => '858585',\n        'gray53' => '878787',\n        'gray54' => '8a8a8a',\n        'gray55' => '8c8c8c',\n        'gray56' => '8f8f8f',\n        'gray57' => '919191',\n        'gray58' => '949494',\n        'gray59' => '969696',\n        'gray6' => '0f0f0f',\n        'gray60' => '999999',\n        'gray61' => '9c9c9c',\n        'gray62' => '9e9e9e',\n        'gray63' => 'a1a1a1',\n        'gray64' => 'a3a3a3',\n        'gray65' => 'a6a6a6',\n        'gray66' => 'a8a8a8',\n        'gray67' => 'ababab',\n        'gray68' => 'adadad',\n        'gray69' => 'b0b0b0',\n        'gray7' => '121212',\n        'gray70' => 'b3b3b3',\n        'gray71' => 'b5b5b5',\n        'gray72' => 'b8b8b8',\n        'gray73' => 'bababa',\n        'gray74' => 'bdbdbd',\n        'gray75' => 'bfbfbf',\n        'gray76' => 'c2c2c2',\n        'gray77' => 'c4c4c4',\n        'gray78' => 'c7c7c7',\n        'gray79' => 'c9c9c9',\n        'gray8' => '141414',\n        'gray80' => 'cccccc',\n        'gray81' => 'cfcfcf',\n        'gray82' => 'd1d1d1',\n        'gray83' => 'd4d4d4',\n        'gray84' => 'd6d6d6',\n        'gray85' => 'd9d9d9',\n        'gray86' => 'dbdbdb',\n        'gray87' => 'dedede',\n        'gray88' => 'e0e0e0',\n        'gray89' => 'e3e3e3',\n        'gray9' => '171717',\n        'gray90' => 'e5e5e5',\n        'gray91' => 'e8e8e8',\n        'gray92' => 'ebebeb',\n        'gray93' => 'ededed',\n        'gray94' => 'f0f0f0',\n        'gray95' => 'f2f2f2',\n        'gray97' => 'f7f7f7',\n        'gray98' => 'fafafa',\n        'gray99' => 'fcfcfc',\n        'green' => '00ff00',\n        'green1' => '00ff00',\n        'green2' => '00ee00',\n        'green3' => '00cd00',\n        'green4' => '008b00',\n        'greenyellow' => 'adff2f',\n        'honeydew1' => 'f0fff0',\n        'honeydew2' => 'e0eee0',\n        'honeydew3' => 'c1cdc1',\n        'honeydew4' => '838b83',\n        'hotpink' => 'ff69b4',\n        'hotpink1' => 'ff6eb4',\n        'hotpink2' => 'ee6aa7',\n        'hotpink3' => 'cd6090',\n        'hotpink4' => '8b3a62',\n        'indianred' => 'cd5c5c',\n        'indianred1' => 'ff6a6a',\n        'indianred2' => 'ee6363',\n        'indianred3' => 'cd5555',\n        'indianred4' => '8b3a3a',\n        'ivory1' => 'fffff0',\n        'ivory2' => 'eeeee0',\n        'ivory3' => 'cdcdc1',\n        'ivory4' => '8b8b83',\n        'khaki' => 'f0e68c',\n        'khaki1' => 'fff68f',\n        'khaki2' => 'eee685',\n        'khaki3' => 'cdc673',\n        'khaki4' => '8b864e',\n        'lavender' => 'e6e6fa',\n        'lavenderblush1' => 'fff0f5',\n        'lavenderblush2' => 'eee0e5',\n        'lavenderblush3' => 'cdc1c5',\n        'lavenderblush4' => '8b8386',\n        'lawngreen' => '7cfc00',\n        'lemonchiffon1' => 'fffacd',\n        'lemonchiffon2' => 'eee9bf',\n        'lemonchiffon3' => 'cdc9a5',\n        'lemonchiffon4' => '8b8970',\n        'light' => 'eedd82',\n        'lightblue' => 'add8e6',\n        'lightblue1' => 'bfefff',\n        'lightblue2' => 'b2dfee',\n        'lightblue3' => '9ac0cd',\n        'lightblue4' => '68838b',\n        'lightcoral' => 'f08080',\n        'lightcyan1' => 'e0ffff',\n        'lightcyan2' => 'd1eeee',\n        'lightcyan3' => 'b4cdcd',\n        'lightcyan4' => '7a8b8b',\n        'lightgoldenrod1' => 'ffec8b',\n        'lightgoldenrod2' => 'eedc82',\n        'lightgoldenrod3' => 'cdbe70',\n        'lightgoldenrod4' => '8b814c',\n        'lightgoldenrodyellow' => 'fafad2',\n        'lightgray' => 'd3d3d3',\n        'lightpink' => 'ffb6c1',\n        'lightpink1' => 'ffaeb9',\n        'lightpink2' => 'eea2ad',\n        'lightpink3' => 'cd8c95',\n        'lightpink4' => '8b5f65',\n        'lightsalmon1' => 'ffa07a',\n        'lightsalmon2' => 'ee9572',\n        'lightsalmon3' => 'cd8162',\n        'lightsalmon4' => '8b5742',\n        'lightseagreen' => '20b2aa',\n        'lightskyblue' => '87cefa',\n        'lightskyblue1' => 'b0e2ff',\n        'lightskyblue2' => 'a4d3ee',\n        'lightskyblue3' => '8db6cd',\n        'lightskyblue4' => '607b8b',\n        'lightslateblue' => '8470ff',\n        'lightslategray' => '778899',\n        'lightsteelblue' => 'b0c4de',\n        'lightsteelblue1' => 'cae1ff',\n        'lightsteelblue2' => 'bcd2ee',\n        'lightsteelblue3' => 'a2b5cd',\n        'lightsteelblue4' => '6e7b8b',\n        'lightyellow1' => 'ffffe0',\n        'lightyellow2' => 'eeeed1',\n        'lightyellow3' => 'cdcdb4',\n        'lightyellow4' => '8b8b7a',\n        'lime' => '00ff00',\n        'limegreen' => '32cd32',\n        'linen' => 'faf0e6',\n        'magenta' => 'ff00ff',\n        'magenta2' => 'ee00ee',\n        'magenta3' => 'cd00cd',\n        'magenta4' => '8b008b',\n        'maroon' => 'b03060',\n        'maroon1' => 'ff34b3',\n        'maroon2' => 'ee30a7',\n        'maroon3' => 'cd2990',\n        'maroon4' => '8b1c62',\n        'medium' => '66cdaa',\n        'mediumaquamarine' => '66cdaa',\n        'mediumblue' => '0000cd',\n        'mediumorchid' => 'ba55d3',\n        'mediumorchid1' => 'e066ff',\n        'mediumorchid2' => 'd15fee',\n        'mediumorchid3' => 'b452cd',\n        'mediumorchid4' => '7a378b',\n        'mediumpurple' => '9370db',\n        'mediumpurple1' => 'ab82ff',\n        'mediumpurple2' => '9f79ee',\n        'mediumpurple3' => '8968cd',\n        'mediumpurple4' => '5d478b',\n        'mediumseagreen' => '3cb371',\n        'mediumslateblue' => '7b68ee',\n        'mediumspringgreen' => '00fa9a',\n        'mediumturquoise' => '48d1cc',\n        'mediumvioletred' => 'c71585',\n        'midnightblue' => '191970',\n        'mintcream' => 'f5fffa',\n        'mistyrose1' => 'ffe4e1',\n        'mistyrose2' => 'eed5d2',\n        'mistyrose3' => 'cdb7b5',\n        'mistyrose4' => '8b7d7b',\n        'moccasin' => 'ffe4b5',\n        'navajowhite1' => 'ffdead',\n        'navajowhite2' => 'eecfa1',\n        'navajowhite3' => 'cdb38b',\n        'navajowhite4' => '8b795e',\n        'navy' => '000080',\n        'navyblue' => '000080',\n        'oldlace' => 'fdf5e6',\n        'olive' => '808000',\n        'olivedrab' => '6b8e23',\n        'olivedrab1' => 'c0ff3e',\n        'olivedrab2' => 'b3ee3a',\n        'olivedrab4' => '698b22',\n        'orange' => 'ffa500',\n        'orange1' => 'ffa500',\n        'orange2' => 'ee9a00',\n        'orange3' => 'cd8500',\n        'orange4' => '8b5a00',\n        'orangered1' => 'ff4500',\n        'orangered2' => 'ee4000',\n        'orangered3' => 'cd3700',\n        'orangered4' => '8b2500',\n        'orchid' => 'da70d6',\n        'orchid1' => 'ff83fa',\n        'orchid2' => 'ee7ae9',\n        'orchid3' => 'cd69c9',\n        'orchid4' => '8b4789',\n        'pale' => 'db7093',\n        'palegoldenrod' => 'eee8aa',\n        'palegreen' => '98fb98',\n        'palegreen1' => '9aff9a',\n        'palegreen2' => '90ee90',\n        'palegreen3' => '7ccd7c',\n        'palegreen4' => '548b54',\n        'paleturquoise' => 'afeeee',\n        'paleturquoise1' => 'bbffff',\n        'paleturquoise2' => 'aeeeee',\n        'paleturquoise3' => '96cdcd',\n        'paleturquoise4' => '668b8b',\n        'palevioletred' => 'db7093',\n        'palevioletred1' => 'ff82ab',\n        'palevioletred2' => 'ee799f',\n        'palevioletred3' => 'cd6889',\n        'palevioletred4' => '8b475d',\n        'papayawhip' => 'ffefd5',\n        'peachpuff1' => 'ffdab9',\n        'peachpuff2' => 'eecbad',\n        'peachpuff3' => 'cdaf95',\n        'peachpuff4' => '8b7765',\n        'pink' => 'ffc0cb',\n        'pink1' => 'ffb5c5',\n        'pink2' => 'eea9b8',\n        'pink3' => 'cd919e',\n        'pink4' => '8b636c',\n        'plum' => 'dda0dd',\n        'plum1' => 'ffbbff',\n        'plum2' => 'eeaeee',\n        'plum3' => 'cd96cd',\n        'plum4' => '8b668b',\n        'powderblue' => 'b0e0e6',\n        'purple' => 'a020f0',\n        'rebeccapurple' => '663399',\n        'purple1' => '9b30ff',\n        'purple2' => '912cee',\n        'purple3' => '7d26cd',\n        'purple4' => '551a8b',\n        'red' => 'ff0000',\n        'red1' => 'ff0000',\n        'red2' => 'ee0000',\n        'red3' => 'cd0000',\n        'red4' => '8b0000',\n        'rosybrown' => 'bc8f8f',\n        'rosybrown1' => 'ffc1c1',\n        'rosybrown2' => 'eeb4b4',\n        'rosybrown3' => 'cd9b9b',\n        'rosybrown4' => '8b6969',\n        'royalblue' => '4169e1',\n        'royalblue1' => '4876ff',\n        'royalblue2' => '436eee',\n        'royalblue3' => '3a5fcd',\n        'royalblue4' => '27408b',\n        'saddlebrown' => '8b4513',\n        'salmon' => 'fa8072',\n        'salmon1' => 'ff8c69',\n        'salmon2' => 'ee8262',\n        'salmon3' => 'cd7054',\n        'salmon4' => '8b4c39',\n        'sandybrown' => 'f4a460',\n        'seagreen1' => '54ff9f',\n        'seagreen2' => '4eee94',\n        'seagreen3' => '43cd80',\n        'seagreen4' => '2e8b57',\n        'seashell1' => 'fff5ee',\n        'seashell2' => 'eee5de',\n        'seashell3' => 'cdc5bf',\n        'seashell4' => '8b8682',\n        'sienna' => 'a0522d',\n        'sienna1' => 'ff8247',\n        'sienna2' => 'ee7942',\n        'sienna3' => 'cd6839',\n        'sienna4' => '8b4726',\n        'silver' => 'c0c0c0',\n        'skyblue' => '87ceeb',\n        'skyblue1' => '87ceff',\n        'skyblue2' => '7ec0ee',\n        'skyblue3' => '6ca6cd',\n        'skyblue4' => '4a708b',\n        'slateblue' => '6a5acd',\n        'slateblue1' => '836fff',\n        'slateblue2' => '7a67ee',\n        'slateblue3' => '6959cd',\n        'slateblue4' => '473c8b',\n        'slategray' => '708090',\n        'slategray1' => 'c6e2ff',\n        'slategray2' => 'b9d3ee',\n        'slategray3' => '9fb6cd',\n        'slategray4' => '6c7b8b',\n        'snow1' => 'fffafa',\n        'snow2' => 'eee9e9',\n        'snow3' => 'cdc9c9',\n        'snow4' => '8b8989',\n        'springgreen1' => '00ff7f',\n        'springgreen2' => '00ee76',\n        'springgreen3' => '00cd66',\n        'springgreen4' => '008b45',\n        'steelblue' => '4682b4',\n        'steelblue1' => '63b8ff',\n        'steelblue2' => '5cacee',\n        'steelblue3' => '4f94cd',\n        'steelblue4' => '36648b',\n        'tan' => 'd2b48c',\n        'tan1' => 'ffa54f',\n        'tan2' => 'ee9a49',\n        'tan3' => 'cd853f',\n        'tan4' => '8b5a2b',\n        'teal' => '008080',\n        'thistle' => 'd8bfd8',\n        'thistle1' => 'ffe1ff',\n        'thistle2' => 'eed2ee',\n        'thistle3' => 'cdb5cd',\n        'thistle4' => '8b7b8b',\n        'tomato1' => 'ff6347',\n        'tomato2' => 'ee5c42',\n        'tomato3' => 'cd4f39',\n        'tomato4' => '8b3626',\n        'turquoise' => '40e0d0',\n        'turquoise1' => '00f5ff',\n        'turquoise2' => '00e5ee',\n        'turquoise3' => '00c5cd',\n        'turquoise4' => '00868b',\n        'violet' => 'ee82ee',\n        'violetred' => 'd02090',\n        'violetred1' => 'ff3e96',\n        'violetred2' => 'ee3a8c',\n        'violetred3' => 'cd3278',\n        'violetred4' => '8b2252',\n        'wheat' => 'f5deb3',\n        'wheat1' => 'ffe7ba',\n        'wheat2' => 'eed8ae',\n        'wheat3' => 'cdba96',\n        'wheat4' => '8b7e66',\n        'white' => 'ffffff',\n        'whitesmoke' => 'f5f5f5',\n        'yellow' => 'ffff00',\n        'yellow1' => 'ffff00',\n        'yellow2' => 'eeee00',\n        'yellow3' => 'cdcd00',\n        'yellow4' => '8b8b00',\n        'yellowgreen' => '9acd32',\n    );\n\n    protected $face;\n    protected $size;\n    protected $color;\n\n    protected $bold = false;\n    protected $italic = false;\n    protected $underline = false;\n    protected $superscript = false;\n    protected $subscript = false;\n    protected $strikethrough = false;\n\n    protected $startTagCallbacks = array(\n        'font' => 'startFontTag',\n        'b' => 'startBoldTag',\n        'strong' => 'startBoldTag',\n        'i' => 'startItalicTag',\n        'em' => 'startItalicTag',\n        'u' => 'startUnderlineTag',\n        'ins' => 'startUnderlineTag',\n        'del' => 'startStrikethruTag',\n        'sup' => 'startSuperscriptTag',\n        'sub' => 'startSubscriptTag',\n    );\n\n    protected $endTagCallbacks = array(\n        'font' => 'endFontTag',\n        'b' => 'endBoldTag',\n        'strong' => 'endBoldTag',\n        'i' => 'endItalicTag',\n        'em' => 'endItalicTag',\n        'u' => 'endUnderlineTag',\n        'ins' => 'endUnderlineTag',\n        'del' => 'endStrikethruTag',\n        'sup' => 'endSuperscriptTag',\n        'sub' => 'endSubscriptTag',\n        'br' => 'breakTag',\n        'p' => 'breakTag',\n        'h1' => 'breakTag',\n        'h2' => 'breakTag',\n        'h3' => 'breakTag',\n        'h4' => 'breakTag',\n        'h5' => 'breakTag',\n        'h6' => 'breakTag',\n    );\n\n    protected $stack = array();\n\n    protected $stringData = '';\n\n    protected $richTextObject;\n\n    protected function initialise()\n    {\n        $this->face = $this->size = $this->color = null;\n        $this->bold = $this->italic = $this->underline = $this->superscript = $this->subscript = $this->strikethrough = false;\n\n        $this->stack = array();\n\n        $this->stringData = '';\n    }\n\n    public function toRichTextObject($html)\n    {\n        $this->initialise();\n\n        //  Create a new DOM object\n        $dom = new \\DOMDocument;\n        //  Load the HTML file into the DOM object\n        //  Note the use of error suppression, because typically this will be an html fragment, so not fully valid markup\n        $loaded = @$dom->loadHTML($html);\n\n        //  Discard excess white space\n        $dom->preserveWhiteSpace = false;\n\n        $this->richTextObject = new PHPExcel_RichText();;\n        $this->parseElements($dom);\n\n        // Clean any further spurious whitespace\n        $this->cleanWhitespace();\n\n        return $this->richTextObject;\n    }\n\n    protected function cleanWhitespace()\n    {\n        foreach ($this->richTextObject->getRichTextElements() as $key => $element) {\n            $text = $element->getText();\n            // Trim any leading spaces on the first run\n            if ($key == 0) {\n                $text = ltrim($text);\n            }\n            // Trim any spaces immediately after a line break\n            $text = preg_replace('/\\n */mu', \"\\n\", $text);\n            $element->setText($text);\n        }\n    }\n\n    protected function buildTextRun()\n    {\n        $text = $this->stringData;\n        if (trim($text) === '') {\n            return;\n        }\n\n        $richtextRun = $this->richTextObject->createTextRun($this->stringData);\n        if ($this->face) {\n            $richtextRun->getFont()->setName($this->face);\n        }\n        if ($this->size) {\n            $richtextRun->getFont()->setSize($this->size);\n        }\n        if ($this->color) {\n            $richtextRun->getFont()->setColor(new PHPExcel_Style_Color('ff' . $this->color));\n        }\n        if ($this->bold) {\n            $richtextRun->getFont()->setBold(true);\n        }\n        if ($this->italic) {\n            $richtextRun->getFont()->setItalic(true);\n        }\n        if ($this->underline) {\n            $richtextRun->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);\n        }\n        if ($this->superscript) {\n            $richtextRun->getFont()->setSuperScript(true);\n        }\n        if ($this->subscript) {\n            $richtextRun->getFont()->setSubScript(true);\n        }\n        if ($this->strikethrough) {\n            $richtextRun->getFont()->setStrikethrough(true);\n        }\n        $this->stringData = '';\n    }\n\n    protected function rgbToColour($rgb)\n    {\n        preg_match_all('/\\d+/', $rgb, $values);\n        foreach ($values[0] as &$value) {\n            $value = str_pad(dechex($value), 2, '0', STR_PAD_LEFT);\n        }\n        return implode($values[0]);\n    }\n\n    protected function colourNameLookup($rgb)\n    {\n        return self::$colourMap[$rgb];\n    }\n\n    protected function startFontTag($tag)\n    {\n        foreach ($tag->attributes as $attribute) {\n            $attributeName = strtolower($attribute->name);\n            $attributeValue = $attribute->value;\n\n            if ($attributeName == 'color') {\n                if (preg_match('/rgb\\s*\\(/', $attributeValue)) {\n                    $this->$attributeName = $this->rgbToColour($attributeValue);\n                } elseif (strpos(trim($attributeValue), '#') === 0) {\n                    $this->$attributeName = ltrim($attributeValue, '#');\n                } else {\n                    $this->$attributeName = $this->colourNameLookup($attributeValue);\n                }\n            } else {\n                $this->$attributeName = $attributeValue;\n            }\n        }\n    }\n\n    protected function endFontTag()\n    {\n        $this->face = $this->size = $this->color = null;\n    }\n\n    protected function startBoldTag()\n    {\n        $this->bold = true;\n    }\n\n    protected function endBoldTag()\n    {\n        $this->bold = false;\n    }\n\n    protected function startItalicTag()\n    {\n        $this->italic = true;\n    }\n\n    protected function endItalicTag()\n    {\n        $this->italic = false;\n    }\n\n    protected function startUnderlineTag()\n    {\n        $this->underline = true;\n    }\n\n    protected function endUnderlineTag()\n    {\n        $this->underline = false;\n    }\n\n    protected function startSubscriptTag()\n    {\n        $this->subscript = true;\n    }\n\n    protected function endSubscriptTag()\n    {\n        $this->subscript = false;\n    }\n\n    protected function startSuperscriptTag()\n    {\n        $this->superscript = true;\n    }\n\n    protected function endSuperscriptTag()\n    {\n        $this->superscript = false;\n    }\n\n    protected function startStrikethruTag()\n    {\n        $this->strikethrough = true;\n    }\n\n    protected function endStrikethruTag()\n    {\n        $this->strikethrough = false;\n    }\n\n    protected function breakTag()\n    {\n        $this->stringData .= \"\\n\";\n    }\n\n    protected function parseTextNode(DOMText $textNode)\n    {\n        $domText = preg_replace(\n            '/\\s+/u',\n            ' ',\n            str_replace(array(\"\\r\", \"\\n\"), ' ', $textNode->nodeValue)\n        );\n        $this->stringData .= $domText;\n        $this->buildTextRun();\n    }\n\n    protected function handleCallback($element, $callbackTag, $callbacks)\n    {\n        if (isset($callbacks[$callbackTag])) {\n            $elementHandler = $callbacks[$callbackTag];\n            if (method_exists($this, $elementHandler)) {\n                call_user_func(array($this, $elementHandler), $element);\n            }\n        }\n    }\n\n    protected function parseElementNode(DOMElement $element)\n    {\n        $callbackTag = strtolower($element->nodeName);\n        $this->stack[] = $callbackTag;\n\n        $this->handleCallback($element, $callbackTag, $this->startTagCallbacks);\n\n        $this->parseElements($element);\n        array_pop($this->stack);\n\n        $this->handleCallback($element, $callbackTag, $this->endTagCallbacks);\n    }\n\n    protected function parseElements(DOMNode $element)\n    {\n        foreach ($element->childNodes as $child) {\n            if ($child instanceof DOMText) {\n                $this->parseTextNode($child);\n            } elseif ($child instanceof DOMElement) {\n                $this->parseElementNode($child);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/IComparable.php",
    "content": "<?php\n\n/**\n * PHPExcel_IComparable\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\ninterface PHPExcel_IComparable\n{\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode();\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/IOFactory.php",
    "content": "<?php\n\n/**    PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_IOFactory\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_IOFactory\n{\n    /**\n     * Search locations\n     *\n     * @var    array\n     * @access    private\n     * @static\n     */\n    private static $searchLocations = array(\n        array( 'type' => 'IWriter', 'path' => 'PHPExcel/Writer/{0}.php', 'class' => 'PHPExcel_Writer_{0}' ),\n        array( 'type' => 'IReader', 'path' => 'PHPExcel/Reader/{0}.php', 'class' => 'PHPExcel_Reader_{0}' )\n    );\n\n    /**\n     * Autoresolve classes\n     *\n     * @var    array\n     * @access    private\n     * @static\n     */\n    private static $autoResolveClasses = array(\n        'Excel2007',\n        'Excel5',\n        'Excel2003XML',\n        'OOCalc',\n        'SYLK',\n        'Gnumeric',\n        'HTML',\n        'CSV',\n    );\n\n    /**\n     *    Private constructor for PHPExcel_IOFactory\n     */\n    private function __construct()\n    {\n    }\n\n    /**\n     * Get search locations\n     *\n     * @static\n     * @access    public\n     * @return    array\n     */\n    public static function getSearchLocations()\n    {\n        return self::$searchLocations;\n    }\n\n    /**\n     * Set search locations\n     *\n     * @static\n     * @access    public\n     * @param    array $value\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public static function setSearchLocations($value)\n    {\n        if (is_array($value)) {\n            self::$searchLocations = $value;\n        } else {\n            throw new PHPExcel_Reader_Exception('Invalid parameter passed.');\n        }\n    }\n\n    /**\n     * Add search location\n     *\n     * @static\n     * @access    public\n     * @param    string $type        Example: IWriter\n     * @param    string $location    Example: PHPExcel/Writer/{0}.php\n     * @param    string $classname     Example: PHPExcel_Writer_{0}\n     */\n    public static function addSearchLocation($type = '', $location = '', $classname = '')\n    {\n        self::$searchLocations[] = array( 'type' => $type, 'path' => $location, 'class' => $classname );\n    }\n\n    /**\n     * Create PHPExcel_Writer_IWriter\n     *\n     * @static\n     * @access    public\n     * @param    PHPExcel $phpExcel\n     * @param    string  $writerType    Example: Excel2007\n     * @return    PHPExcel_Writer_IWriter\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public static function createWriter(PHPExcel $phpExcel, $writerType = '')\n    {\n        // Search type\n        $searchType = 'IWriter';\n\n        // Include class\n        foreach (self::$searchLocations as $searchLocation) {\n            if ($searchLocation['type'] == $searchType) {\n                $className = str_replace('{0}', $writerType, $searchLocation['class']);\n\n                $instance = new $className($phpExcel);\n                if ($instance !== null) {\n                    return $instance;\n                }\n            }\n        }\n\n        // Nothing found...\n        throw new PHPExcel_Reader_Exception(\"No $searchType found for type $writerType\");\n    }\n\n    /**\n     * Create PHPExcel_Reader_IReader\n     *\n     * @static\n     * @access    public\n     * @param    string $readerType    Example: Excel2007\n     * @return    PHPExcel_Reader_IReader\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public static function createReader($readerType = '')\n    {\n        // Search type\n        $searchType = 'IReader';\n\n        // Include class\n        foreach (self::$searchLocations as $searchLocation) {\n            if ($searchLocation['type'] == $searchType) {\n                $className = str_replace('{0}', $readerType, $searchLocation['class']);\n\n                $instance = new $className();\n                if ($instance !== null) {\n                    return $instance;\n                }\n            }\n        }\n\n        // Nothing found...\n        throw new PHPExcel_Reader_Exception(\"No $searchType found for type $readerType\");\n    }\n\n    /**\n     * Loads PHPExcel from file using automatic PHPExcel_Reader_IReader resolution\n     *\n     * @static\n     * @access public\n     * @param     string         $pFilename        The name of the spreadsheet file\n     * @return    PHPExcel\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public static function load($pFilename)\n    {\n        $reader = self::createReaderForFile($pFilename);\n        return $reader->load($pFilename);\n    }\n\n    /**\n     * Identify file type using automatic PHPExcel_Reader_IReader resolution\n     *\n     * @static\n     * @access public\n     * @param     string         $pFilename        The name of the spreadsheet file to identify\n     * @return    string\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public static function identify($pFilename)\n    {\n        $reader = self::createReaderForFile($pFilename);\n        $className = get_class($reader);\n        $classType = explode('_', $className);\n        unset($reader);\n        return array_pop($classType);\n    }\n\n    /**\n     * Create PHPExcel_Reader_IReader for file using automatic PHPExcel_Reader_IReader resolution\n     *\n     * @static\n     * @access    public\n     * @param     string         $pFilename        The name of the spreadsheet file\n     * @return    PHPExcel_Reader_IReader\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public static function createReaderForFile($pFilename)\n    {\n        // First, lucky guess by inspecting file extension\n        $pathinfo = pathinfo($pFilename);\n\n        $extensionType = null;\n        if (isset($pathinfo['extension'])) {\n            switch (strtolower($pathinfo['extension'])) {\n                case 'xlsx':            //    Excel (OfficeOpenXML) Spreadsheet\n                case 'xlsm':            //    Excel (OfficeOpenXML) Macro Spreadsheet (macros will be discarded)\n                case 'xltx':            //    Excel (OfficeOpenXML) Template\n                case 'xltm':            //    Excel (OfficeOpenXML) Macro Template (macros will be discarded)\n                    $extensionType = 'Excel2007';\n                    break;\n                case 'xls':                //    Excel (BIFF) Spreadsheet\n                case 'xlt':                //    Excel (BIFF) Template\n                    $extensionType = 'Excel5';\n                    break;\n                case 'ods':                //    Open/Libre Offic Calc\n                case 'ots':                //    Open/Libre Offic Calc Template\n                    $extensionType = 'OOCalc';\n                    break;\n                case 'slk':\n                    $extensionType = 'SYLK';\n                    break;\n                case 'xml':                //    Excel 2003 SpreadSheetML\n                    $extensionType = 'Excel2003XML';\n                    break;\n                case 'gnumeric':\n                    $extensionType = 'Gnumeric';\n                    break;\n                case 'htm':\n                case 'html':\n                    $extensionType = 'HTML';\n                    break;\n                case 'csv':\n                    // Do nothing\n                    // We must not try to use CSV reader since it loads\n                    // all files including Excel files etc.\n                    break;\n                default:\n                    break;\n            }\n\n            if ($extensionType !== null) {\n                $reader = self::createReader($extensionType);\n                // Let's see if we are lucky\n                if (isset($reader) && $reader->canRead($pFilename)) {\n                    return $reader;\n                }\n            }\n        }\n\n        // If we reach here then \"lucky guess\" didn't give any result\n        // Try walking through all the options in self::$autoResolveClasses\n        foreach (self::$autoResolveClasses as $autoResolveClass) {\n            //    Ignore our original guess, we know that won't work\n            if ($autoResolveClass !== $extensionType) {\n                $reader = self::createReader($autoResolveClass);\n                if ($reader->canRead($pFilename)) {\n                    return $reader;\n                }\n            }\n        }\n\n        throw new PHPExcel_Reader_Exception('Unable to identify a reader for this file');\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/NamedRange.php",
    "content": "<?php\n\n/**\n * PHPExcel_NamedRange\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_NamedRange\n{\n    /**\n     * Range name\n     *\n     * @var string\n     */\n    private $name;\n\n    /**\n     * Worksheet on which the named range can be resolved\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $worksheet;\n\n    /**\n     * Range of the referenced cells\n     *\n     * @var string\n     */\n    private $range;\n\n    /**\n     * Is the named range local? (i.e. can only be used on $this->worksheet)\n     *\n     * @var bool\n     */\n    private $localOnly;\n\n    /**\n     * Scope\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $scope;\n\n    /**\n     * Create a new NamedRange\n     *\n     * @param string $pName\n     * @param PHPExcel_Worksheet $pWorksheet\n     * @param string $pRange\n     * @param bool $pLocalOnly\n     * @param PHPExcel_Worksheet|null $pScope    Scope. Only applies when $pLocalOnly = true. Null for global scope.\n     * @throws PHPExcel_Exception\n     */\n    public function __construct($pName = null, PHPExcel_Worksheet $pWorksheet, $pRange = 'A1', $pLocalOnly = false, $pScope = null)\n    {\n        // Validate data\n        if (($pName === null) || ($pWorksheet === null) || ($pRange === null)) {\n            throw new PHPExcel_Exception('Parameters can not be null.');\n        }\n\n        // Set local members\n        $this->name       = $pName;\n        $this->worksheet  = $pWorksheet;\n        $this->range      = $pRange;\n        $this->localOnly  = $pLocalOnly;\n        $this->scope      = ($pLocalOnly == true) ? (($pScope == null) ? $pWorksheet : $pScope) : null;\n    }\n\n    /**\n     * Get name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * Set name\n     *\n     * @param string $value\n     * @return PHPExcel_NamedRange\n     */\n    public function setName($value = null)\n    {\n        if ($value !== null) {\n            // Old title\n            $oldTitle = $this->name;\n\n            // Re-attach\n            if ($this->worksheet !== null) {\n                $this->worksheet->getParent()->removeNamedRange($this->name, $this->worksheet);\n            }\n            $this->name = $value;\n\n            if ($this->worksheet !== null) {\n                $this->worksheet->getParent()->addNamedRange($this);\n            }\n\n            // New title\n            $newTitle = $this->name;\n            PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->worksheet->getParent(), $oldTitle, $newTitle);\n        }\n        return $this;\n    }\n\n    /**\n     * Get worksheet\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function getWorksheet()\n    {\n        return $this->worksheet;\n    }\n\n    /**\n     * Set worksheet\n     *\n     * @param PHPExcel_Worksheet $value\n     * @return PHPExcel_NamedRange\n     */\n    public function setWorksheet(PHPExcel_Worksheet $value = null)\n    {\n        if ($value !== null) {\n            $this->worksheet = $value;\n        }\n        return $this;\n    }\n\n    /**\n     * Get range\n     *\n     * @return string\n     */\n    public function getRange()\n    {\n        return $this->range;\n    }\n\n    /**\n     * Set range\n     *\n     * @param string $value\n     * @return PHPExcel_NamedRange\n     */\n    public function setRange($value = null)\n    {\n        if ($value !== null) {\n            $this->range = $value;\n        }\n        return $this;\n    }\n\n    /**\n     * Get localOnly\n     *\n     * @return bool\n     */\n    public function getLocalOnly()\n    {\n        return $this->localOnly;\n    }\n\n    /**\n     * Set localOnly\n     *\n     * @param bool $value\n     * @return PHPExcel_NamedRange\n     */\n    public function setLocalOnly($value = false)\n    {\n        $this->localOnly = $value;\n        $this->scope = $value ? $this->worksheet : null;\n        return $this;\n    }\n\n    /**\n     * Get scope\n     *\n     * @return PHPExcel_Worksheet|null\n     */\n    public function getScope()\n    {\n        return $this->scope;\n    }\n\n    /**\n     * Set scope\n     *\n     * @param PHPExcel_Worksheet|null $value\n     * @return PHPExcel_NamedRange\n     */\n    public function setScope(PHPExcel_Worksheet $value = null)\n    {\n        $this->scope = $value;\n        $this->localOnly = ($value == null) ? false : true;\n        return $this;\n    }\n\n    /**\n     * Resolve a named range to a regular cell range\n     *\n     * @param string $pNamedRange Named range\n     * @param PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope\n     * @return PHPExcel_NamedRange\n     */\n    public static function resolveRange($pNamedRange = '', PHPExcel_Worksheet $pSheet)\n    {\n        return $pSheet->getParent()->getNamedRange($pNamedRange, $pSheet);\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Abstract.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_Abstract\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * Read data only?\n     * Identifies whether the Reader should only read data values for cells, and ignore any formatting information;\n     *        or whether it should read both data and formatting\n     *\n     * @var    boolean\n     */\n    protected $readDataOnly = false;\n\n    /**\n     * Read empty cells?\n     * Identifies whether the Reader should read data values for cells all cells, or should ignore cells containing\n     *         null value or empty string\n     *\n     * @var    boolean\n     */\n    protected $readEmptyCells = true;\n\n    /**\n     * Read charts that are defined in the workbook?\n     * Identifies whether the Reader should read the definitions for any charts that exist in the workbook;\n     *\n     * @var    boolean\n     */\n    protected $includeCharts = false;\n\n    /**\n     * Restrict which sheets should be loaded?\n     * This property holds an array of worksheet names to be loaded. If null, then all worksheets will be loaded.\n     *\n     * @var array of string\n     */\n    protected $loadSheetsOnly;\n\n    /**\n     * PHPExcel_Reader_IReadFilter instance\n     *\n     * @var PHPExcel_Reader_IReadFilter\n     */\n    protected $readFilter;\n\n    protected $fileHandle = null;\n\n\n    /**\n     * Read data only?\n     *        If this is true, then the Reader will only read data values for cells, it will not read any formatting information.\n     *        If false (the default) it will read data and formatting.\n     *\n     * @return    boolean\n     */\n    public function getReadDataOnly()\n    {\n        return $this->readDataOnly;\n    }\n\n    /**\n     * Set read data only\n     *        Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information.\n     *        Set to false (the default) to advise the Reader to read both data and formatting for cells.\n     *\n     * @param    boolean    $pValue\n     *\n     * @return    PHPExcel_Reader_IReader\n     */\n    public function setReadDataOnly($pValue = false)\n    {\n        $this->readDataOnly = $pValue;\n        return $this;\n    }\n\n    /**\n     * Read empty cells?\n     *        If this is true (the default), then the Reader will read data values for all cells, irrespective of value.\n     *        If false it will not read data for cells containing a null value or an empty string.\n     *\n     * @return    boolean\n     */\n    public function getReadEmptyCells()\n    {\n        return $this->readEmptyCells;\n    }\n\n    /**\n     * Set read empty cells\n     *        Set to true (the default) to advise the Reader read data values for all cells, irrespective of value.\n     *        Set to false to advise the Reader to ignore cells containing a null value or an empty string.\n     *\n     * @param    boolean    $pValue\n     *\n     * @return    PHPExcel_Reader_IReader\n     */\n    public function setReadEmptyCells($pValue = true)\n    {\n        $this->readEmptyCells = $pValue;\n        return $this;\n    }\n\n    /**\n     * Read charts in workbook?\n     *        If this is true, then the Reader will include any charts that exist in the workbook.\n     *      Note that a ReadDataOnly value of false overrides, and charts won't be read regardless of the IncludeCharts value.\n     *        If false (the default) it will ignore any charts defined in the workbook file.\n     *\n     * @return    boolean\n     */\n    public function getIncludeCharts()\n    {\n        return $this->includeCharts;\n    }\n\n    /**\n     * Set read charts in workbook\n     *        Set to true, to advise the Reader to include any charts that exist in the workbook.\n     *      Note that a ReadDataOnly value of false overrides, and charts won't be read regardless of the IncludeCharts value.\n     *        Set to false (the default) to discard charts.\n     *\n     * @param    boolean    $pValue\n     *\n     * @return    PHPExcel_Reader_IReader\n     */\n    public function setIncludeCharts($pValue = false)\n    {\n        $this->includeCharts = (boolean) $pValue;\n        return $this;\n    }\n\n    /**\n     * Get which sheets to load\n     * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null\n     *        indicating that all worksheets in the workbook should be loaded.\n     *\n     * @return mixed\n     */\n    public function getLoadSheetsOnly()\n    {\n        return $this->loadSheetsOnly;\n    }\n\n    /**\n     * Set which sheets to load\n     *\n     * @param mixed $value\n     *        This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name.\n     *        If NULL, then it tells the Reader to read all worksheets in the workbook\n     *\n     * @return PHPExcel_Reader_IReader\n     */\n    public function setLoadSheetsOnly($value = null)\n    {\n        if ($value === null) {\n            return $this->setLoadAllSheets();\n        }\n\n        $this->loadSheetsOnly = is_array($value) ? $value : array($value);\n        return $this;\n    }\n\n    /**\n     * Set all sheets to load\n     *        Tells the Reader to load all worksheets from the workbook.\n     *\n     * @return PHPExcel_Reader_IReader\n     */\n    public function setLoadAllSheets()\n    {\n        $this->loadSheetsOnly = null;\n        return $this;\n    }\n\n    /**\n     * Read filter\n     *\n     * @return PHPExcel_Reader_IReadFilter\n     */\n    public function getReadFilter()\n    {\n        return $this->readFilter;\n    }\n\n    /**\n     * Set read filter\n     *\n     * @param PHPExcel_Reader_IReadFilter $pValue\n     * @return PHPExcel_Reader_IReader\n     */\n    public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue)\n    {\n        $this->readFilter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Open file for reading\n     *\n     * @param string $pFilename\n     * @throws    PHPExcel_Reader_Exception\n     * @return resource\n     */\n    protected function openFile($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename) || !is_readable($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        // Open file\n        $this->fileHandle = fopen($pFilename, 'r');\n        if ($this->fileHandle === false) {\n            throw new PHPExcel_Reader_Exception(\"Could not open file \" . $pFilename . \" for reading.\");\n        }\n    }\n\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return boolean\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function canRead($pFilename)\n    {\n        // Check if file exists\n        try {\n            $this->openFile($pFilename);\n        } catch (Exception $e) {\n            return false;\n        }\n\n        $readable = $this->isValidFormat();\n        fclose($this->fileHandle);\n        return $readable;\n    }\n\n    /**\n     * Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks\n     *\n     * @param     string         $xml\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function securityScan($xml)\n    {\n        $pattern = '/\\\\0?' . implode('\\\\0?', str_split('<!DOCTYPE')) . '\\\\0?/';\n        if (preg_match($pattern, $xml)) {\n            throw new PHPExcel_Reader_Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks');\n        }\n        return $xml;\n    }\n\n    /**\n     * Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks\n     *\n     * @param     string         $filestream\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function securityScanFile($filestream)\n    {\n        return $this->securityScan(file_get_contents($filestream));\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/CSV.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_CSV\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_CSV extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * Input encoding\n     *\n     * @access    private\n     * @var    string\n     */\n    private $inputEncoding = 'UTF-8';\n\n    /**\n     * Delimiter\n     *\n     * @access    private\n     * @var string\n     */\n    private $delimiter = ',';\n\n    /**\n     * Enclosure\n     *\n     * @access    private\n     * @var    string\n     */\n    private $enclosure = '\"';\n\n    /**\n     * Sheet index to read\n     *\n     * @access    private\n     * @var    int\n     */\n    private $sheetIndex = 0;\n\n    /**\n     * Load rows contiguously\n     *\n     * @access    private\n     * @var    int\n     */\n    private $contiguous = false;\n\n    /**\n     * Row counter for loading rows contiguously\n     *\n     * @var    int\n     */\n    private $contiguousRow = -1;\n\n\n    /**\n     * Create a new PHPExcel_Reader_CSV\n     */\n    public function __construct()\n    {\n        $this->readFilter = new PHPExcel_Reader_DefaultReadFilter();\n    }\n\n    /**\n     * Validate that the current file is a CSV file\n     *\n     * @return boolean\n     */\n    protected function isValidFormat()\n    {\n        return true;\n    }\n\n    /**\n     * Set input encoding\n     *\n     * @param string $pValue Input encoding\n     */\n    public function setInputEncoding($pValue = 'UTF-8')\n    {\n        $this->inputEncoding = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get input encoding\n     *\n     * @return string\n     */\n    public function getInputEncoding()\n    {\n        return $this->inputEncoding;\n    }\n\n    /**\n     * Move filepointer past any BOM marker\n     *\n     */\n    protected function skipBOM()\n    {\n        rewind($this->fileHandle);\n\n        switch ($this->inputEncoding) {\n            case 'UTF-8':\n                fgets($this->fileHandle, 4) == \"\\xEF\\xBB\\xBF\" ?\n                    fseek($this->fileHandle, 3) : fseek($this->fileHandle, 0);\n                break;\n            case 'UTF-16LE':\n                fgets($this->fileHandle, 3) == \"\\xFF\\xFE\" ?\n                    fseek($this->fileHandle, 2) : fseek($this->fileHandle, 0);\n                break;\n            case 'UTF-16BE':\n                fgets($this->fileHandle, 3) == \"\\xFE\\xFF\" ?\n                    fseek($this->fileHandle, 2) : fseek($this->fileHandle, 0);\n                break;\n            case 'UTF-32LE':\n                fgets($this->fileHandle, 5) == \"\\xFF\\xFE\\x00\\x00\" ?\n                    fseek($this->fileHandle, 4) : fseek($this->fileHandle, 0);\n                break;\n            case 'UTF-32BE':\n                fgets($this->fileHandle, 5) == \"\\x00\\x00\\xFE\\xFF\" ?\n                    fseek($this->fileHandle, 4) : fseek($this->fileHandle, 0);\n                break;\n            default:\n                break;\n        }\n    }\n\n    /**\n     * Identify any separator that is explicitly set in the file\n     *\n     */\n    protected function checkSeparator()\n    {\n        $line = fgets($this->fileHandle);\n        if ($line === false) {\n            return;\n        }\n\n        if ((strlen(trim($line, \"\\r\\n\")) == 5) && (stripos($line, 'sep=') === 0)) {\n            $this->delimiter = substr($line, 4, 1);\n            return;\n        }\n        return $this->skipBOM();\n    }\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param     string         $pFilename\n     * @throws    PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Open file\n        $this->openFile($pFilename);\n        if (!$this->isValidFormat()) {\n            fclose($this->fileHandle);\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid Spreadsheet file.\");\n        }\n        $fileHandle = $this->fileHandle;\n\n        // Skip BOM, if any\n        $this->skipBOM();\n        $this->checkSeparator();\n\n        $escapeEnclosures = array( \"\\\\\" . $this->enclosure, $this->enclosure . $this->enclosure );\n\n        $worksheetInfo = array();\n        $worksheetInfo[0]['worksheetName'] = 'Worksheet';\n        $worksheetInfo[0]['lastColumnLetter'] = 'A';\n        $worksheetInfo[0]['lastColumnIndex'] = 0;\n        $worksheetInfo[0]['totalRows'] = 0;\n        $worksheetInfo[0]['totalColumns'] = 0;\n\n        // Loop through each line of the file in turn\n        while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) {\n            $worksheetInfo[0]['totalRows']++;\n            $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1);\n        }\n\n        $worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']);\n        $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1;\n\n        // Close file\n        fclose($fileHandle);\n\n        return $worksheetInfo;\n    }\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return PHPExcel\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Create new PHPExcel\n        $objPHPExcel = new PHPExcel();\n\n        // Load into this instance\n        return $this->loadIntoExisting($pFilename, $objPHPExcel);\n    }\n\n    /**\n     * Loads PHPExcel from file into PHPExcel instance\n     *\n     * @param     string         $pFilename\n     * @param    PHPExcel    $objPHPExcel\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)\n    {\n        $lineEnding = ini_get('auto_detect_line_endings');\n        ini_set('auto_detect_line_endings', true);\n\n        // Open file\n        $this->openFile($pFilename);\n        if (!$this->isValidFormat()) {\n            fclose($this->fileHandle);\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid Spreadsheet file.\");\n        }\n        $fileHandle = $this->fileHandle;\n\n        // Skip BOM, if any\n        $this->skipBOM();\n        $this->checkSeparator();\n\n        // Create new PHPExcel object\n        while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) {\n            $objPHPExcel->createSheet();\n        }\n        $sheet = $objPHPExcel->setActiveSheetIndex($this->sheetIndex);\n\n        $escapeEnclosures = array( \"\\\\\" . $this->enclosure,\n                                   $this->enclosure . $this->enclosure\n                                 );\n\n        // Set our starting row based on whether we're in contiguous mode or not\n        $currentRow = 1;\n        if ($this->contiguous) {\n            $currentRow = ($this->contiguousRow == -1) ? $sheet->getHighestRow(): $this->contiguousRow;\n        }\n\n        // Loop through each line of the file in turn\n        while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) {\n            $columnLetter = 'A';\n            foreach ($rowData as $rowDatum) {\n                if ($rowDatum != '' && $this->readFilter->readCell($columnLetter, $currentRow)) {\n                    // Unescape enclosures\n                    $rowDatum = str_replace($escapeEnclosures, $this->enclosure, $rowDatum);\n\n                    // Convert encoding if necessary\n                    if ($this->inputEncoding !== 'UTF-8') {\n                        $rowDatum = PHPExcel_Shared_String::ConvertEncoding($rowDatum, 'UTF-8', $this->inputEncoding);\n                    }\n\n                    // Set cell value\n                    $sheet->getCell($columnLetter . $currentRow)->setValue($rowDatum);\n                }\n                ++$columnLetter;\n            }\n            ++$currentRow;\n        }\n\n        // Close file\n        fclose($fileHandle);\n\n        if ($this->contiguous) {\n            $this->contiguousRow = $currentRow;\n        }\n\n        ini_set('auto_detect_line_endings', $lineEnding);\n\n        // Return\n        return $objPHPExcel;\n    }\n\n    /**\n     * Get delimiter\n     *\n     * @return string\n     */\n    public function getDelimiter()\n    {\n        return $this->delimiter;\n    }\n\n    /**\n     * Set delimiter\n     *\n     * @param    string    $pValue        Delimiter, defaults to ,\n     * @return    PHPExcel_Reader_CSV\n     */\n    public function setDelimiter($pValue = ',')\n    {\n        $this->delimiter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get enclosure\n     *\n     * @return string\n     */\n    public function getEnclosure()\n    {\n        return $this->enclosure;\n    }\n\n    /**\n     * Set enclosure\n     *\n     * @param    string    $pValue        Enclosure, defaults to \"\n     * @return PHPExcel_Reader_CSV\n     */\n    public function setEnclosure($pValue = '\"')\n    {\n        if ($pValue == '') {\n            $pValue = '\"';\n        }\n        $this->enclosure = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get sheet index\n     *\n     * @return integer\n     */\n    public function getSheetIndex()\n    {\n        return $this->sheetIndex;\n    }\n\n    /**\n     * Set sheet index\n     *\n     * @param    integer        $pValue        Sheet index\n     * @return PHPExcel_Reader_CSV\n     */\n    public function setSheetIndex($pValue = 0)\n    {\n        $this->sheetIndex = $pValue;\n        return $this;\n    }\n\n    /**\n     * Set Contiguous\n     *\n     * @param boolean $contiguous\n     */\n    public function setContiguous($contiguous = false)\n    {\n        $this->contiguous = (bool) $contiguous;\n        if (!$contiguous) {\n            $this->contiguousRow = -1;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get Contiguous\n     *\n     * @return boolean\n     */\n    public function getContiguous()\n    {\n        return $this->contiguous;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_DefaultReadFilter\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_DefaultReadFilter implements PHPExcel_Reader_IReadFilter\n{\n    /**\n     * Should this cell be read?\n     *\n     * @param    $column           Column address (as a string value like \"A\", or \"IV\")\n     * @param    $row              Row number\n     * @param    $worksheetName    Optional worksheet name\n     * @return   boolean\n     */\n    public function readCell($column, $row, $worksheetName = '')\n    {\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_Excel2003XML\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Excel2003XML extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * Formats\n     *\n     * @var array\n     */\n    protected $styles = array();\n\n    /**\n     * Character set used in the file\n     *\n     * @var string\n     */\n    protected $charSet = 'UTF-8';\n\n    /**\n     * Create a new PHPExcel_Reader_Excel2003XML\n     */\n    public function __construct()\n    {\n        $this->readFilter = new PHPExcel_Reader_DefaultReadFilter();\n    }\n\n\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return     boolean\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function canRead($pFilename)\n    {\n\n        //    Office                    xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n        //    Excel                    xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n        //    XML Spreadsheet            xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\n        //    Spreadsheet component    xmlns:c=\"urn:schemas-microsoft-com:office:component:spreadsheet\"\n        //    XML schema                 xmlns:s=\"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\"\n        //    XML data type            xmlns:dt=\"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882\"\n        //    MS-persist recordset    xmlns:rs=\"urn:schemas-microsoft-com:rowset\"\n        //    Rowset                    xmlns:z=\"#RowsetSchema\"\n        //\n\n        $signature = array(\n                '<?xml version=\"1.0\"',\n                '<?mso-application progid=\"Excel.Sheet\"?>'\n            );\n\n        // Open file\n        $this->openFile($pFilename);\n        $fileHandle = $this->fileHandle;\n        \n        // Read sample data (first 2 KB will do)\n        $data = fread($fileHandle, 2048);\n        fclose($fileHandle);\n\n        $valid = true;\n        foreach ($signature as $match) {\n            // every part of the signature must be present\n            if (strpos($data, $match) === false) {\n                $valid = false;\n                break;\n            }\n        }\n\n        //    Retrieve charset encoding\n        if (preg_match('/<?xml.*encoding=[\\'\"](.*?)[\\'\"].*?>/um', $data, $matches)) {\n            $this->charSet = strtoupper($matches[1]);\n        }\n//        echo 'Character Set is ', $this->charSet,'<br />';\n\n        return $valid;\n    }\n\n\n    /**\n     * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object\n     *\n     * @param     string         $pFilename\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function listWorksheetNames($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n        if (!$this->canRead($pFilename)) {\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid Spreadsheet file.\");\n        }\n\n        $worksheetNames = array();\n\n        $xml = simplexml_load_string($this->securityScan(file_get_contents($pFilename)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n        $namespaces = $xml->getNamespaces(true);\n\n        $xml_ss = $xml->children($namespaces['ss']);\n        foreach ($xml_ss->Worksheet as $worksheet) {\n            $worksheet_ss = $worksheet->attributes($namespaces['ss']);\n            $worksheetNames[] = self::convertStringEncoding((string) $worksheet_ss['Name'], $this->charSet);\n        }\n\n        return $worksheetNames;\n    }\n\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param   string     $pFilename\n     * @throws   PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $worksheetInfo = array();\n\n        $xml = simplexml_load_string($this->securityScan(file_get_contents($pFilename)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n        $namespaces = $xml->getNamespaces(true);\n\n        $worksheetID = 1;\n        $xml_ss = $xml->children($namespaces['ss']);\n        foreach ($xml_ss->Worksheet as $worksheet) {\n            $worksheet_ss = $worksheet->attributes($namespaces['ss']);\n\n            $tmpInfo = array();\n            $tmpInfo['worksheetName'] = '';\n            $tmpInfo['lastColumnLetter'] = 'A';\n            $tmpInfo['lastColumnIndex'] = 0;\n            $tmpInfo['totalRows'] = 0;\n            $tmpInfo['totalColumns'] = 0;\n\n            if (isset($worksheet_ss['Name'])) {\n                $tmpInfo['worksheetName'] = (string) $worksheet_ss['Name'];\n            } else {\n                $tmpInfo['worksheetName'] = \"Worksheet_{$worksheetID}\";\n            }\n\n            if (isset($worksheet->Table->Row)) {\n                $rowIndex = 0;\n\n                foreach ($worksheet->Table->Row as $rowData) {\n                    $columnIndex = 0;\n                    $rowHasData = false;\n\n                    foreach ($rowData->Cell as $cell) {\n                        if (isset($cell->Data)) {\n                            $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex);\n                            $rowHasData = true;\n                        }\n\n                        ++$columnIndex;\n                    }\n\n                    ++$rowIndex;\n\n                    if ($rowHasData) {\n                        $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex);\n                    }\n                }\n            }\n\n            $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);\n            $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;\n\n            $worksheetInfo[] = $tmpInfo;\n            ++$worksheetID;\n        }\n\n        return $worksheetInfo;\n    }\n\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Create new PHPExcel\n        $objPHPExcel = new PHPExcel();\n        $objPHPExcel->removeSheetByIndex(0);\n\n        // Load into this instance\n        return $this->loadIntoExisting($pFilename, $objPHPExcel);\n    }\n\n    protected static function identifyFixedStyleValue($styleList, &$styleAttributeValue)\n    {\n        $styleAttributeValue = strtolower($styleAttributeValue);\n        foreach ($styleList as $style) {\n            if ($styleAttributeValue == strtolower($style)) {\n                $styleAttributeValue = $style;\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * pixel units to excel width units(units of 1/256th of a character width)\n     * @param pxs\n     * @return\n     */\n    protected static function pixel2WidthUnits($pxs)\n    {\n        $UNIT_OFFSET_MAP = array(0, 36, 73, 109, 146, 182, 219);\n\n        $widthUnits = 256 * ($pxs / 7);\n        $widthUnits += $UNIT_OFFSET_MAP[($pxs % 7)];\n        return $widthUnits;\n    }\n\n    /**\n     * excel width units(units of 1/256th of a character width) to pixel units\n     * @param widthUnits\n     * @return\n     */\n    protected static function widthUnits2Pixel($widthUnits)\n    {\n        $pixels = ($widthUnits / 256) * 7;\n        $offsetWidthUnits = $widthUnits % 256;\n        $pixels += round($offsetWidthUnits / (256 / 7));\n        return $pixels;\n    }\n\n    protected static function hex2str($hex)\n    {\n        return chr(hexdec($hex[1]));\n    }\n\n    /**\n     * Loads PHPExcel from file into PHPExcel instance\n     *\n     * @param     string         $pFilename\n     * @param    PHPExcel    $objPHPExcel\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)\n    {\n        $fromFormats    = array('\\-', '\\ ');\n        $toFormats      = array('-', ' ');\n\n        $underlineStyles = array (\n            PHPExcel_Style_Font::UNDERLINE_NONE,\n            PHPExcel_Style_Font::UNDERLINE_DOUBLE,\n            PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING,\n            PHPExcel_Style_Font::UNDERLINE_SINGLE,\n            PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING\n        );\n        $verticalAlignmentStyles = array (\n            PHPExcel_Style_Alignment::VERTICAL_BOTTOM,\n            PHPExcel_Style_Alignment::VERTICAL_TOP,\n            PHPExcel_Style_Alignment::VERTICAL_CENTER,\n            PHPExcel_Style_Alignment::VERTICAL_JUSTIFY\n        );\n        $horizontalAlignmentStyles = array (\n            PHPExcel_Style_Alignment::HORIZONTAL_GENERAL,\n            PHPExcel_Style_Alignment::HORIZONTAL_LEFT,\n            PHPExcel_Style_Alignment::HORIZONTAL_RIGHT,\n            PHPExcel_Style_Alignment::HORIZONTAL_CENTER,\n            PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS,\n            PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY\n        );\n\n        $timezoneObj = new DateTimeZone('Europe/London');\n        $GMT = new DateTimeZone('UTC');\n\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        if (!$this->canRead($pFilename)) {\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid Spreadsheet file.\");\n        }\n\n        $xml = simplexml_load_string($this->securityScan(file_get_contents($pFilename)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n        $namespaces = $xml->getNamespaces(true);\n\n        $docProps = $objPHPExcel->getProperties();\n        if (isset($xml->DocumentProperties[0])) {\n            foreach ($xml->DocumentProperties[0] as $propertyName => $propertyValue) {\n                switch ($propertyName) {\n                    case 'Title':\n                        $docProps->setTitle(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Subject':\n                        $docProps->setSubject(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Author':\n                        $docProps->setCreator(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Created':\n                        $creationDate = strtotime($propertyValue);\n                        $docProps->setCreated($creationDate);\n                        break;\n                    case 'LastAuthor':\n                        $docProps->setLastModifiedBy(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'LastSaved':\n                        $lastSaveDate = strtotime($propertyValue);\n                        $docProps->setModified($lastSaveDate);\n                        break;\n                    case 'Company':\n                        $docProps->setCompany(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Category':\n                        $docProps->setCategory(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Manager':\n                        $docProps->setManager(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Keywords':\n                        $docProps->setKeywords(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                    case 'Description':\n                        $docProps->setDescription(self::convertStringEncoding($propertyValue, $this->charSet));\n                        break;\n                }\n            }\n        }\n        if (isset($xml->CustomDocumentProperties)) {\n            foreach ($xml->CustomDocumentProperties[0] as $propertyName => $propertyValue) {\n                $propertyAttributes = $propertyValue->attributes($namespaces['dt']);\n                $propertyName = preg_replace_callback('/_x([0-9a-z]{4})_/', 'PHPExcel_Reader_Excel2003XML::hex2str', $propertyName);\n                $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_UNKNOWN;\n                switch ((string) $propertyAttributes) {\n                    case 'string':\n                        $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;\n                        $propertyValue = trim($propertyValue);\n                        break;\n                    case 'boolean':\n                        $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN;\n                        $propertyValue = (bool) $propertyValue;\n                        break;\n                    case 'integer':\n                        $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_INTEGER;\n                        $propertyValue = intval($propertyValue);\n                        break;\n                    case 'float':\n                        $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT;\n                        $propertyValue = floatval($propertyValue);\n                        break;\n                    case 'dateTime.tz':\n                        $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE;\n                        $propertyValue = strtotime(trim($propertyValue));\n                        break;\n                }\n                $docProps->setCustomProperty($propertyName, $propertyValue, $propertyType);\n            }\n        }\n\n        foreach ($xml->Styles[0] as $style) {\n            $style_ss = $style->attributes($namespaces['ss']);\n            $styleID = (string) $style_ss['ID'];\n//            echo 'Style ID = '.$styleID.'<br />';\n            $this->styles[$styleID] = (isset($this->styles['Default'])) ? $this->styles['Default'] : array();\n            foreach ($style as $styleType => $styleData) {\n                $styleAttributes = $styleData->attributes($namespaces['ss']);\n//                echo $styleType.'<br />';\n                switch ($styleType) {\n                    case 'Alignment':\n                        foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) {\n//                                echo $styleAttributeKey.' = '.$styleAttributeValue.'<br />';\n                            $styleAttributeValue = (string) $styleAttributeValue;\n                            switch ($styleAttributeKey) {\n                                case 'Vertical':\n                                    if (self::identifyFixedStyleValue($verticalAlignmentStyles, $styleAttributeValue)) {\n                                        $this->styles[$styleID]['alignment']['vertical'] = $styleAttributeValue;\n                                    }\n                                    break;\n                                case 'Horizontal':\n                                    if (self::identifyFixedStyleValue($horizontalAlignmentStyles, $styleAttributeValue)) {\n                                        $this->styles[$styleID]['alignment']['horizontal'] = $styleAttributeValue;\n                                    }\n                                    break;\n                                case 'WrapText':\n                                    $this->styles[$styleID]['alignment']['wrap'] = true;\n                                    break;\n                            }\n                        }\n                        break;\n                    case 'Borders':\n                        foreach ($styleData->Border as $borderStyle) {\n                            $borderAttributes = $borderStyle->attributes($namespaces['ss']);\n                            $thisBorder = array();\n                            foreach ($borderAttributes as $borderStyleKey => $borderStyleValue) {\n//                                    echo $borderStyleKey.' = '.$borderStyleValue.'<br />';\n                                switch ($borderStyleKey) {\n                                    case 'LineStyle':\n                                        $thisBorder['style'] = PHPExcel_Style_Border::BORDER_MEDIUM;\n//                                                $thisBorder['style'] = $borderStyleValue;\n                                        break;\n                                    case 'Weight':\n//                                                $thisBorder['style'] = $borderStyleValue;\n                                        break;\n                                    case 'Position':\n                                        $borderPosition = strtolower($borderStyleValue);\n                                        break;\n                                    case 'Color':\n                                        $borderColour = substr($borderStyleValue, 1);\n                                        $thisBorder['color']['rgb'] = $borderColour;\n                                        break;\n                                }\n                            }\n                            if (!empty($thisBorder)) {\n                                if (($borderPosition == 'left') || ($borderPosition == 'right') || ($borderPosition == 'top') || ($borderPosition == 'bottom')) {\n                                    $this->styles[$styleID]['borders'][$borderPosition] = $thisBorder;\n                                }\n                            }\n                        }\n                        break;\n                    case 'Font':\n                        foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) {\n//                                echo $styleAttributeKey.' = '.$styleAttributeValue.'<br />';\n                            $styleAttributeValue = (string) $styleAttributeValue;\n                            switch ($styleAttributeKey) {\n                                case 'FontName':\n                                    $this->styles[$styleID]['font']['name'] = $styleAttributeValue;\n                                    break;\n                                case 'Size':\n                                    $this->styles[$styleID]['font']['size'] = $styleAttributeValue;\n                                    break;\n                                case 'Color':\n                                    $this->styles[$styleID]['font']['color']['rgb'] = substr($styleAttributeValue, 1);\n                                    break;\n                                case 'Bold':\n                                    $this->styles[$styleID]['font']['bold'] = true;\n                                    break;\n                                case 'Italic':\n                                    $this->styles[$styleID]['font']['italic'] = true;\n                                    break;\n                                case 'Underline':\n                                    if (self::identifyFixedStyleValue($underlineStyles, $styleAttributeValue)) {\n                                        $this->styles[$styleID]['font']['underline'] = $styleAttributeValue;\n                                    }\n                                    break;\n                            }\n                        }\n                        break;\n                    case 'Interior':\n                        foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) {\n//                                echo $styleAttributeKey.' = '.$styleAttributeValue.'<br />';\n                            switch ($styleAttributeKey) {\n                                case 'Color':\n                                    $this->styles[$styleID]['fill']['color']['rgb'] = substr($styleAttributeValue, 1);\n                                    break;\n                            }\n                        }\n                        break;\n                    case 'NumberFormat':\n                        foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) {\n//                                echo $styleAttributeKey.' = '.$styleAttributeValue.'<br />';\n                            $styleAttributeValue = str_replace($fromFormats, $toFormats, $styleAttributeValue);\n                            switch ($styleAttributeValue) {\n                                case 'Short Date':\n                                    $styleAttributeValue = 'dd/mm/yyyy';\n                                    break;\n                            }\n                            if ($styleAttributeValue > '') {\n                                $this->styles[$styleID]['numberformat']['code'] = $styleAttributeValue;\n                            }\n                        }\n                        break;\n                    case 'Protection':\n                        foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) {\n//                                echo $styleAttributeKey.' = '.$styleAttributeValue.'<br />';\n                        }\n                        break;\n                }\n            }\n//            print_r($this->styles[$styleID]);\n//            echo '<hr />';\n        }\n//        echo '<hr />';\n\n        $worksheetID = 0;\n        $xml_ss = $xml->children($namespaces['ss']);\n\n        foreach ($xml_ss->Worksheet as $worksheet) {\n            $worksheet_ss = $worksheet->attributes($namespaces['ss']);\n\n            if ((isset($this->loadSheetsOnly)) && (isset($worksheet_ss['Name'])) &&\n                (!in_array($worksheet_ss['Name'], $this->loadSheetsOnly))) {\n                continue;\n            }\n\n//            echo '<h3>Worksheet: ', $worksheet_ss['Name'],'<h3>';\n//\n            // Create new Worksheet\n            $objPHPExcel->createSheet();\n            $objPHPExcel->setActiveSheetIndex($worksheetID);\n            if (isset($worksheet_ss['Name'])) {\n                $worksheetName = self::convertStringEncoding((string) $worksheet_ss['Name'], $this->charSet);\n                //    Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in\n                //        formula cells... during the load, all formulae should be correct, and we're simply bringing\n                //        the worksheet name in line with the formula, not the reverse\n                $objPHPExcel->getActiveSheet()->setTitle($worksheetName, false);\n            }\n\n            $columnID = 'A';\n            if (isset($worksheet->Table->Column)) {\n                foreach ($worksheet->Table->Column as $columnData) {\n                    $columnData_ss = $columnData->attributes($namespaces['ss']);\n                    if (isset($columnData_ss['Index'])) {\n                        $columnID = PHPExcel_Cell::stringFromColumnIndex($columnData_ss['Index']-1);\n                    }\n                    if (isset($columnData_ss['Width'])) {\n                        $columnWidth = $columnData_ss['Width'];\n//                        echo '<b>Setting column width for '.$columnID.' to '.$columnWidth.'</b><br />';\n                        $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth($columnWidth / 5.4);\n                    }\n                    ++$columnID;\n                }\n            }\n\n            $rowID = 1;\n            if (isset($worksheet->Table->Row)) {\n                $additionalMergedCells = 0;\n                foreach ($worksheet->Table->Row as $rowData) {\n                    $rowHasData = false;\n                    $row_ss = $rowData->attributes($namespaces['ss']);\n                    if (isset($row_ss['Index'])) {\n                        $rowID = (integer) $row_ss['Index'];\n                    }\n//                    echo '<b>Row '.$rowID.'</b><br />';\n\n                    $columnID = 'A';\n                    foreach ($rowData->Cell as $cell) {\n                        $cell_ss = $cell->attributes($namespaces['ss']);\n                        if (isset($cell_ss['Index'])) {\n                            $columnID = PHPExcel_Cell::stringFromColumnIndex($cell_ss['Index']-1);\n                        }\n                        $cellRange = $columnID.$rowID;\n\n                        if ($this->getReadFilter() !== null) {\n                            if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) {\n                                continue;\n                            }\n                        }\n\n                        if ((isset($cell_ss['MergeAcross'])) || (isset($cell_ss['MergeDown']))) {\n                            $columnTo = $columnID;\n                            if (isset($cell_ss['MergeAcross'])) {\n                                $additionalMergedCells += (int)$cell_ss['MergeAcross'];\n                                $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cell_ss['MergeAcross'] -1);\n                            }\n                            $rowTo = $rowID;\n                            if (isset($cell_ss['MergeDown'])) {\n                                $rowTo = $rowTo + $cell_ss['MergeDown'];\n                            }\n                            $cellRange .= ':'.$columnTo.$rowTo;\n                            $objPHPExcel->getActiveSheet()->mergeCells($cellRange);\n                        }\n\n                        $cellIsSet = $hasCalculatedValue = false;\n                        $cellDataFormula = '';\n                        if (isset($cell_ss['Formula'])) {\n                            $cellDataFormula = $cell_ss['Formula'];\n                            // added this as a check for array formulas\n                            if (isset($cell_ss['ArrayRange'])) {\n                                $cellDataCSEFormula = $cell_ss['ArrayRange'];\n//                                echo \"found an array formula at \".$columnID.$rowID.\"<br />\";\n                            }\n                            $hasCalculatedValue = true;\n                        }\n                        if (isset($cell->Data)) {\n                            $cellValue = $cellData = $cell->Data;\n                            $type = PHPExcel_Cell_DataType::TYPE_NULL;\n                            $cellData_ss = $cellData->attributes($namespaces['ss']);\n                            if (isset($cellData_ss['Type'])) {\n                                $cellDataType = $cellData_ss['Type'];\n                                switch ($cellDataType) {\n                                    /*\n                                    const TYPE_STRING        = 's';\n                                    const TYPE_FORMULA        = 'f';\n                                    const TYPE_NUMERIC        = 'n';\n                                    const TYPE_BOOL            = 'b';\n                                    const TYPE_NULL            = 'null';\n                                    const TYPE_INLINE        = 'inlineStr';\n                                    const TYPE_ERROR        = 'e';\n                                    */\n                                    case 'String':\n                                        $cellValue = self::convertStringEncoding($cellValue, $this->charSet);\n                                        $type = PHPExcel_Cell_DataType::TYPE_STRING;\n                                        break;\n                                    case 'Number':\n                                        $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                        $cellValue = (float) $cellValue;\n                                        if (floor($cellValue) == $cellValue) {\n                                            $cellValue = (integer) $cellValue;\n                                        }\n                                        break;\n                                    case 'Boolean':\n                                        $type = PHPExcel_Cell_DataType::TYPE_BOOL;\n                                        $cellValue = ($cellValue != 0);\n                                        break;\n                                    case 'DateTime':\n                                        $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                        $cellValue = PHPExcel_Shared_Date::PHPToExcel(strtotime($cellValue));\n                                        break;\n                                    case 'Error':\n                                        $type = PHPExcel_Cell_DataType::TYPE_ERROR;\n                                        break;\n                                }\n                            }\n\n                            if ($hasCalculatedValue) {\n//                                echo 'FORMULA<br />';\n                                $type = PHPExcel_Cell_DataType::TYPE_FORMULA;\n                                $columnNumber = PHPExcel_Cell::columnIndexFromString($columnID);\n                                if (substr($cellDataFormula, 0, 3) == 'of:') {\n                                    $cellDataFormula = substr($cellDataFormula, 3);\n//                                    echo 'Before: ', $cellDataFormula,'<br />';\n                                    $temp = explode('\"', $cellDataFormula);\n                                    $key = false;\n                                    foreach ($temp as &$value) {\n                                        //    Only replace in alternate array entries (i.e. non-quoted blocks)\n                                        if ($key = !$key) {\n                                            $value = str_replace(array('[.', '.', ']'), '', $value);\n                                        }\n                                    }\n                                } else {\n                                    //    Convert R1C1 style references to A1 style references (but only when not quoted)\n//                                    echo 'Before: ', $cellDataFormula,'<br />';\n                                    $temp = explode('\"', $cellDataFormula);\n                                    $key = false;\n                                    foreach ($temp as &$value) {\n                                        //    Only replace in alternate array entries (i.e. non-quoted blocks)\n                                        if ($key = !$key) {\n                                            preg_match_all('/(R(\\[?-?\\d*\\]?))(C(\\[?-?\\d*\\]?))/', $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE);\n                                            //    Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way\n                                            //        through the formula from left to right. Reversing means that we work right to left.through\n                                            //        the formula\n                                            $cellReferences = array_reverse($cellReferences);\n                                            //    Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent,\n                                            //        then modify the formula to use that new reference\n                                            foreach ($cellReferences as $cellReference) {\n                                                $rowReference = $cellReference[2][0];\n                                                //    Empty R reference is the current row\n                                                if ($rowReference == '') {\n                                                    $rowReference = $rowID;\n                                                }\n                                                //    Bracketed R references are relative to the current row\n                                                if ($rowReference{0} == '[') {\n                                                    $rowReference = $rowID + trim($rowReference, '[]');\n                                                }\n                                                $columnReference = $cellReference[4][0];\n                                                //    Empty C reference is the current column\n                                                if ($columnReference == '') {\n                                                    $columnReference = $columnNumber;\n                                                }\n                                                //    Bracketed C references are relative to the current column\n                                                if ($columnReference{0} == '[') {\n                                                    $columnReference = $columnNumber + trim($columnReference, '[]');\n                                                }\n                                                $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference;\n                                                $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));\n                                            }\n                                        }\n                                    }\n                                }\n                                unset($value);\n                                //    Then rebuild the formula string\n                                $cellDataFormula = implode('\"', $temp);\n//                                echo 'After: ', $cellDataFormula,'<br />';\n                            }\n\n//                            echo 'Cell '.$columnID.$rowID.' is a '.$type.' with a value of '.(($hasCalculatedValue) ? $cellDataFormula : $cellValue).'<br />';\n//\n                            $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $cellValue), $type);\n                            if ($hasCalculatedValue) {\n//                                echo 'Formula result is '.$cellValue.'<br />';\n                                $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setCalculatedValue($cellValue);\n                            }\n                            $cellIsSet = $rowHasData = true;\n                        }\n\n                        if (isset($cell->Comment)) {\n//                            echo '<b>comment found</b><br />';\n                            $commentAttributes = $cell->Comment->attributes($namespaces['ss']);\n                            $author = 'unknown';\n                            if (isset($commentAttributes->Author)) {\n                                $author = (string)$commentAttributes->Author;\n//                                echo 'Author: ', $author,'<br />';\n                            }\n                            $node = $cell->Comment->Data->asXML();\n//                            $annotation = str_replace('html:','',substr($node,49,-10));\n//                            echo $annotation,'<br />';\n                            $annotation = strip_tags($node);\n//                            echo 'Annotation: ', $annotation,'<br />';\n                            $objPHPExcel->getActiveSheet()->getComment($columnID.$rowID)->setAuthor(self::convertStringEncoding($author, $this->charSet))->setText($this->parseRichText($annotation));\n                        }\n\n                        if (($cellIsSet) && (isset($cell_ss['StyleID']))) {\n                            $style = (string) $cell_ss['StyleID'];\n//                            echo 'Cell style for '.$columnID.$rowID.' is '.$style.'<br />';\n                            if ((isset($this->styles[$style])) && (!empty($this->styles[$style]))) {\n//                                echo 'Cell '.$columnID.$rowID.'<br />';\n//                                print_r($this->styles[$style]);\n//                                echo '<br />';\n                                if (!$objPHPExcel->getActiveSheet()->cellExists($columnID.$rowID)) {\n                                    $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setValue(null);\n                                }\n                                $objPHPExcel->getActiveSheet()->getStyle($cellRange)->applyFromArray($this->styles[$style]);\n                            }\n                        }\n                        ++$columnID;\n                        while ($additionalMergedCells > 0) {\n                            ++$columnID;\n                            $additionalMergedCells--;\n                        }\n                    }\n\n                    if ($rowHasData) {\n                        if (isset($row_ss['StyleID'])) {\n                            $rowStyle = $row_ss['StyleID'];\n                        }\n                        if (isset($row_ss['Height'])) {\n                            $rowHeight = $row_ss['Height'];\n//                            echo '<b>Setting row height to '.$rowHeight.'</b><br />';\n                            $objPHPExcel->getActiveSheet()->getRowDimension($rowID)->setRowHeight($rowHeight);\n                        }\n                    }\n\n                    ++$rowID;\n                }\n            }\n            ++$worksheetID;\n        }\n\n        // Return\n        return $objPHPExcel;\n    }\n\n\n    protected static function convertStringEncoding($string, $charset)\n    {\n        if ($charset != 'UTF-8') {\n            return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', $charset);\n        }\n        return $string;\n    }\n\n\n    protected function parseRichText($is = '')\n    {\n        $value = new PHPExcel_RichText();\n\n        $value->createText(self::convertStringEncoding($is, $this->charSet));\n\n        return $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel2007/Chart.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Reader_Excel2007\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\n\n/**\n * PHPExcel_Reader_Excel2007_Chart\n *\n * @category    PHPExcel\n * @package        PHPExcel_Reader_Excel2007\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Reader_Excel2007_Chart\n{\n    private static function getAttribute($component, $name, $format)\n    {\n        $attributes = $component->attributes();\n        if (isset($attributes[$name])) {\n            if ($format == 'string') {\n                return (string) $attributes[$name];\n            } elseif ($format == 'integer') {\n                return (integer) $attributes[$name];\n            } elseif ($format == 'boolean') {\n                return (boolean) ($attributes[$name] === '0' || $attributes[$name] !== 'true') ? false : true;\n            } else {\n                return (float) $attributes[$name];\n            }\n        }\n        return null;\n    }\n\n\n    private static function readColor($color, $background = false)\n    {\n        if (isset($color[\"rgb\"])) {\n            return (string)$color[\"rgb\"];\n        } elseif (isset($color[\"indexed\"])) {\n            return PHPExcel_Style_Color::indexedColor($color[\"indexed\"]-7, $background)->getARGB();\n        }\n    }\n\n    public static function readChart($chartElements, $chartName)\n    {\n        $namespacesChartMeta = $chartElements->getNamespaces(true);\n        $chartElementsC = $chartElements->children($namespacesChartMeta['c']);\n\n        $XaxisLabel = $YaxisLabel = $legend = $title = null;\n        $dispBlanksAs = $plotVisOnly = null;\n\n        foreach ($chartElementsC as $chartElementKey => $chartElement) {\n            switch ($chartElementKey) {\n                case \"chart\":\n                    foreach ($chartElement as $chartDetailsKey => $chartDetails) {\n                        $chartDetailsC = $chartDetails->children($namespacesChartMeta['c']);\n                        switch ($chartDetailsKey) {\n                            case \"plotArea\":\n                                $plotAreaLayout = $XaxisLable = $YaxisLable = null;\n                                $plotSeries = $plotAttributes = array();\n                                foreach ($chartDetails as $chartDetailKey => $chartDetail) {\n                                    switch ($chartDetailKey) {\n                                        case \"layout\":\n                                            $plotAreaLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta, 'plotArea');\n                                            break;\n                                        case \"catAx\":\n                                            if (isset($chartDetail->title)) {\n                                                $XaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta, 'cat');\n                                            }\n                                            break;\n                                        case \"dateAx\":\n                                            if (isset($chartDetail->title)) {\n                                                $XaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta, 'cat');\n                                            }\n                                            break;\n                                        case \"valAx\":\n                                            if (isset($chartDetail->title)) {\n                                                $YaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta, 'cat');\n                                            }\n                                            break;\n                                        case \"barChart\":\n                                        case \"bar3DChart\":\n                                            $barDirection = self::getAttribute($chartDetail->barDir, 'val', 'string');\n                                            $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotSer->setPlotDirection($barDirection);\n                                            $plotSeries[] = $plotSer;\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"lineChart\":\n                                        case \"line3DChart\":\n                                            $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"areaChart\":\n                                        case \"area3DChart\":\n                                            $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"doughnutChart\":\n                                        case \"pieChart\":\n                                        case \"pie3DChart\":\n                                            $explosion = isset($chartDetail->ser->explosion);\n                                            $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotSer->setPlotStyle($explosion);\n                                            $plotSeries[] = $plotSer;\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"scatterChart\":\n                                            $scatterStyle = self::getAttribute($chartDetail->scatterStyle, 'val', 'string');\n                                            $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotSer->setPlotStyle($scatterStyle);\n                                            $plotSeries[] = $plotSer;\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"bubbleChart\":\n                                            $bubbleScale = self::getAttribute($chartDetail->bubbleScale, 'val', 'integer');\n                                            $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotSer->setPlotStyle($bubbleScale);\n                                            $plotSeries[] = $plotSer;\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"radarChart\":\n                                            $radarStyle = self::getAttribute($chartDetail->radarStyle, 'val', 'string');\n                                            $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotSer->setPlotStyle($radarStyle);\n                                            $plotSeries[] = $plotSer;\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"surfaceChart\":\n                                        case \"surface3DChart\":\n                                            $wireFrame = self::getAttribute($chartDetail->wireframe, 'val', 'boolean');\n                                            $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotSer->setPlotStyle($wireFrame);\n                                            $plotSeries[] = $plotSer;\n                                            $plotAttributes = self::readChartAttributes($chartDetail);\n                                            break;\n                                        case \"stockChart\":\n                                            $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey);\n                                            $plotAttributes = self::readChartAttributes($plotAreaLayout);\n                                            break;\n                                    }\n                                }\n                                if ($plotAreaLayout == null) {\n                                    $plotAreaLayout = new PHPExcel_Chart_Layout();\n                                }\n                                $plotArea = new PHPExcel_Chart_PlotArea($plotAreaLayout, $plotSeries);\n                                self::setChartAttributes($plotAreaLayout, $plotAttributes);\n                                break;\n                            case \"plotVisOnly\":\n                                $plotVisOnly = self::getAttribute($chartDetails, 'val', 'string');\n                                break;\n                            case \"dispBlanksAs\":\n                                $dispBlanksAs = self::getAttribute($chartDetails, 'val', 'string');\n                                break;\n                            case \"title\":\n                                $title = self::chartTitle($chartDetails, $namespacesChartMeta, 'title');\n                                break;\n                            case \"legend\":\n                                $legendPos = 'r';\n                                $legendLayout = null;\n                                $legendOverlay = false;\n                                foreach ($chartDetails as $chartDetailKey => $chartDetail) {\n                                    switch ($chartDetailKey) {\n                                        case \"legendPos\":\n                                            $legendPos = self::getAttribute($chartDetail, 'val', 'string');\n                                            break;\n                                        case \"overlay\":\n                                            $legendOverlay = self::getAttribute($chartDetail, 'val', 'boolean');\n                                            break;\n                                        case \"layout\":\n                                            $legendLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta, 'legend');\n                                            break;\n                                    }\n                                }\n                                $legend = new PHPExcel_Chart_Legend($legendPos, $legendLayout, $legendOverlay);\n                                break;\n                        }\n                    }\n            }\n        }\n        $chart = new PHPExcel_Chart($chartName, $title, $legend, $plotArea, $plotVisOnly, $dispBlanksAs, $XaxisLabel, $YaxisLabel);\n\n        return $chart;\n    }\n\n    private static function chartTitle($titleDetails, $namespacesChartMeta, $type)\n    {\n        $caption = array();\n        $titleLayout = null;\n        foreach ($titleDetails as $titleDetailKey => $chartDetail) {\n            switch ($titleDetailKey) {\n                case \"tx\":\n                    $titleDetails = $chartDetail->rich->children($namespacesChartMeta['a']);\n                    foreach ($titleDetails as $titleKey => $titleDetail) {\n                        switch ($titleKey) {\n                            case \"p\":\n                                $titleDetailPart = $titleDetail->children($namespacesChartMeta['a']);\n                                $caption[] = self::parseRichText($titleDetailPart);\n                        }\n                    }\n                    break;\n                case \"layout\":\n                    $titleLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta);\n                    break;\n            }\n        }\n\n        return new PHPExcel_Chart_Title($caption, $titleLayout);\n    }\n\n    private static function chartLayoutDetails($chartDetail, $namespacesChartMeta)\n    {\n        if (!isset($chartDetail->manualLayout)) {\n            return null;\n        }\n        $details = $chartDetail->manualLayout->children($namespacesChartMeta['c']);\n        if (is_null($details)) {\n            return null;\n        }\n        $layout = array();\n        foreach ($details as $detailKey => $detail) {\n//            echo $detailKey, ' => ',self::getAttribute($detail, 'val', 'string'),PHP_EOL;\n            $layout[$detailKey] = self::getAttribute($detail, 'val', 'string');\n        }\n        return new PHPExcel_Chart_Layout($layout);\n    }\n\n    private static function chartDataSeries($chartDetail, $namespacesChartMeta, $plotType)\n    {\n        $multiSeriesType = null;\n        $smoothLine = false;\n        $seriesLabel = $seriesCategory = $seriesValues = $plotOrder = array();\n\n        $seriesDetailSet = $chartDetail->children($namespacesChartMeta['c']);\n        foreach ($seriesDetailSet as $seriesDetailKey => $seriesDetails) {\n            switch ($seriesDetailKey) {\n                case \"grouping\":\n                    $multiSeriesType = self::getAttribute($chartDetail->grouping, 'val', 'string');\n                    break;\n                case \"ser\":\n                    $marker = null;\n                    foreach ($seriesDetails as $seriesKey => $seriesDetail) {\n                        switch ($seriesKey) {\n                            case \"idx\":\n                                $seriesIndex = self::getAttribute($seriesDetail, 'val', 'integer');\n                                break;\n                            case \"order\":\n                                $seriesOrder = self::getAttribute($seriesDetail, 'val', 'integer');\n                                $plotOrder[$seriesIndex] = $seriesOrder;\n                                break;\n                            case \"tx\":\n                                $seriesLabel[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta);\n                                break;\n                            case \"marker\":\n                                $marker = self::getAttribute($seriesDetail->symbol, 'val', 'string');\n                                break;\n                            case \"smooth\":\n                                $smoothLine = self::getAttribute($seriesDetail, 'val', 'boolean');\n                                break;\n                            case \"cat\":\n                                $seriesCategory[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta);\n                                break;\n                            case \"val\":\n                                $seriesValues[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker);\n                                break;\n                            case \"xVal\":\n                                $seriesCategory[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker);\n                                break;\n                            case \"yVal\":\n                                $seriesValues[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker);\n                                break;\n                        }\n                    }\n            }\n        }\n        return new PHPExcel_Chart_DataSeries($plotType, $multiSeriesType, $plotOrder, $seriesLabel, $seriesCategory, $seriesValues, $smoothLine);\n    }\n\n\n    private static function chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker = null, $smoothLine = false)\n    {\n        if (isset($seriesDetail->strRef)) {\n            $seriesSource = (string) $seriesDetail->strRef->f;\n            $seriesData = self::chartDataSeriesValues($seriesDetail->strRef->strCache->children($namespacesChartMeta['c']), 's');\n\n            return new PHPExcel_Chart_DataSeriesValues('String', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine);\n        } elseif (isset($seriesDetail->numRef)) {\n            $seriesSource = (string) $seriesDetail->numRef->f;\n            $seriesData = self::chartDataSeriesValues($seriesDetail->numRef->numCache->children($namespacesChartMeta['c']));\n\n            return new PHPExcel_Chart_DataSeriesValues('Number', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine);\n        } elseif (isset($seriesDetail->multiLvlStrRef)) {\n            $seriesSource = (string) $seriesDetail->multiLvlStrRef->f;\n            $seriesData = self::chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlStrRef->multiLvlStrCache->children($namespacesChartMeta['c']), 's');\n            $seriesData['pointCount'] = count($seriesData['dataValues']);\n\n            return new PHPExcel_Chart_DataSeriesValues('String', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine);\n        } elseif (isset($seriesDetail->multiLvlNumRef)) {\n            $seriesSource = (string) $seriesDetail->multiLvlNumRef->f;\n            $seriesData = self::chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlNumRef->multiLvlNumCache->children($namespacesChartMeta['c']), 's');\n            $seriesData['pointCount'] = count($seriesData['dataValues']);\n\n            return new PHPExcel_Chart_DataSeriesValues('String', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine);\n        }\n        return null;\n    }\n\n\n    private static function chartDataSeriesValues($seriesValueSet, $dataType = 'n')\n    {\n        $seriesVal = array();\n        $formatCode = '';\n        $pointCount = 0;\n\n        foreach ($seriesValueSet as $seriesValueIdx => $seriesValue) {\n            switch ($seriesValueIdx) {\n                case 'ptCount':\n                    $pointCount = self::getAttribute($seriesValue, 'val', 'integer');\n                    break;\n                case 'formatCode':\n                    $formatCode = (string) $seriesValue;\n                    break;\n                case 'pt':\n                    $pointVal = self::getAttribute($seriesValue, 'idx', 'integer');\n                    if ($dataType == 's') {\n                        $seriesVal[$pointVal] = (string) $seriesValue->v;\n                    } else {\n                        $seriesVal[$pointVal] = (float) $seriesValue->v;\n                    }\n                    break;\n            }\n        }\n\n        return array(\n            'formatCode'    => $formatCode,\n            'pointCount'    => $pointCount,\n            'dataValues'    => $seriesVal\n        );\n    }\n\n    private static function chartDataSeriesValuesMultiLevel($seriesValueSet, $dataType = 'n')\n    {\n        $seriesVal = array();\n        $formatCode = '';\n        $pointCount = 0;\n\n        foreach ($seriesValueSet->lvl as $seriesLevelIdx => $seriesLevel) {\n            foreach ($seriesLevel as $seriesValueIdx => $seriesValue) {\n                switch ($seriesValueIdx) {\n                    case 'ptCount':\n                        $pointCount = self::getAttribute($seriesValue, 'val', 'integer');\n                        break;\n                    case 'formatCode':\n                        $formatCode = (string) $seriesValue;\n                        break;\n                    case 'pt':\n                        $pointVal = self::getAttribute($seriesValue, 'idx', 'integer');\n                        if ($dataType == 's') {\n                            $seriesVal[$pointVal][] = (string) $seriesValue->v;\n                        } else {\n                            $seriesVal[$pointVal][] = (float) $seriesValue->v;\n                        }\n                        break;\n                }\n            }\n        }\n\n        return array(\n            'formatCode'    => $formatCode,\n            'pointCount'    => $pointCount,\n            'dataValues'    => $seriesVal\n        );\n    }\n\n    private static function parseRichText($titleDetailPart = null)\n    {\n        $value = new PHPExcel_RichText();\n\n        foreach ($titleDetailPart as $titleDetailElementKey => $titleDetailElement) {\n            if (isset($titleDetailElement->t)) {\n                $objText = $value->createTextRun((string) $titleDetailElement->t);\n            }\n            if (isset($titleDetailElement->rPr)) {\n                if (isset($titleDetailElement->rPr->rFont[\"val\"])) {\n                    $objText->getFont()->setName((string) $titleDetailElement->rPr->rFont[\"val\"]);\n                }\n\n                $fontSize = (self::getAttribute($titleDetailElement->rPr, 'sz', 'integer'));\n                if (!is_null($fontSize)) {\n                    $objText->getFont()->setSize(floor($fontSize / 100));\n                }\n\n                $fontColor = (self::getAttribute($titleDetailElement->rPr, 'color', 'string'));\n                if (!is_null($fontColor)) {\n                    $objText->getFont()->setColor(new PHPExcel_Style_Color(self::readColor($fontColor)));\n                }\n\n                $bold = self::getAttribute($titleDetailElement->rPr, 'b', 'boolean');\n                if (!is_null($bold)) {\n                    $objText->getFont()->setBold($bold);\n                }\n\n                $italic = self::getAttribute($titleDetailElement->rPr, 'i', 'boolean');\n                if (!is_null($italic)) {\n                    $objText->getFont()->setItalic($italic);\n                }\n\n                $baseline = self::getAttribute($titleDetailElement->rPr, 'baseline', 'integer');\n                if (!is_null($baseline)) {\n                    if ($baseline > 0) {\n                        $objText->getFont()->setSuperScript(true);\n                    } elseif ($baseline < 0) {\n                        $objText->getFont()->setSubScript(true);\n                    }\n                }\n\n                $underscore = (self::getAttribute($titleDetailElement->rPr, 'u', 'string'));\n                if (!is_null($underscore)) {\n                    if ($underscore == 'sng') {\n                        $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);\n                    } elseif ($underscore == 'dbl') {\n                        $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE);\n                    } else {\n                        $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_NONE);\n                    }\n                }\n\n                $strikethrough = (self::getAttribute($titleDetailElement->rPr, 's', 'string'));\n                if (!is_null($strikethrough)) {\n                    if ($strikethrough == 'noStrike') {\n                        $objText->getFont()->setStrikethrough(false);\n                    } else {\n                        $objText->getFont()->setStrikethrough(true);\n                    }\n                }\n            }\n        }\n\n        return $value;\n    }\n\n    private static function readChartAttributes($chartDetail)\n    {\n        $plotAttributes = array();\n        if (isset($chartDetail->dLbls)) {\n            if (isset($chartDetail->dLbls->howLegendKey)) {\n                $plotAttributes['showLegendKey'] = self::getAttribute($chartDetail->dLbls->showLegendKey, 'val', 'string');\n            }\n            if (isset($chartDetail->dLbls->showVal)) {\n                $plotAttributes['showVal'] = self::getAttribute($chartDetail->dLbls->showVal, 'val', 'string');\n            }\n            if (isset($chartDetail->dLbls->showCatName)) {\n                $plotAttributes['showCatName'] = self::getAttribute($chartDetail->dLbls->showCatName, 'val', 'string');\n            }\n            if (isset($chartDetail->dLbls->showSerName)) {\n                $plotAttributes['showSerName'] = self::getAttribute($chartDetail->dLbls->showSerName, 'val', 'string');\n            }\n            if (isset($chartDetail->dLbls->showPercent)) {\n                $plotAttributes['showPercent'] = self::getAttribute($chartDetail->dLbls->showPercent, 'val', 'string');\n            }\n            if (isset($chartDetail->dLbls->showBubbleSize)) {\n                $plotAttributes['showBubbleSize'] = self::getAttribute($chartDetail->dLbls->showBubbleSize, 'val', 'string');\n            }\n            if (isset($chartDetail->dLbls->showLeaderLines)) {\n                $plotAttributes['showLeaderLines'] = self::getAttribute($chartDetail->dLbls->showLeaderLines, 'val', 'string');\n            }\n        }\n\n        return $plotAttributes;\n    }\n\n    private static function setChartAttributes($plotArea, $plotAttributes)\n    {\n        foreach ($plotAttributes as $plotAttributeKey => $plotAttributeValue) {\n            switch ($plotAttributeKey) {\n                case 'showLegendKey':\n                    $plotArea->setShowLegendKey($plotAttributeValue);\n                    break;\n                case 'showVal':\n                    $plotArea->setShowVal($plotAttributeValue);\n                    break;\n                case 'showCatName':\n                    $plotArea->setShowCatName($plotAttributeValue);\n                    break;\n                case 'showSerName':\n                    $plotArea->setShowSerName($plotAttributeValue);\n                    break;\n                case 'showPercent':\n                    $plotArea->setShowPercent($plotAttributeValue);\n                    break;\n                case 'showBubbleSize':\n                    $plotArea->setShowBubbleSize($plotAttributeValue);\n                    break;\n                case 'showLeaderLines':\n                    $plotArea->setShowLeaderLines($plotAttributeValue);\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel2007/Theme.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Reader_Excel2007_Theme\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Reader_Excel2007_Theme\n{\n    /**\n     * Theme Name\n     *\n     * @var string\n     */\n    private $themeName;\n\n    /**\n     * Colour Scheme Name\n     *\n     * @var string\n     */\n    private $colourSchemeName;\n\n    /**\n     * Colour Map indexed by position\n     *\n     * @var array of string\n     */\n    private $colourMapValues;\n\n\n    /**\n     * Colour Map\n     *\n     * @var array of string\n     */\n    private $colourMap;\n\n\n    /**\n     * Create a new PHPExcel_Theme\n     *\n     */\n    public function __construct($themeName, $colourSchemeName, $colourMap)\n    {\n        // Initialise values\n        $this->themeName        = $themeName;\n        $this->colourSchemeName = $colourSchemeName;\n        $this->colourMap        = $colourMap;\n    }\n\n    /**\n     * Get Theme Name\n     *\n     * @return string\n     */\n    public function getThemeName()\n    {\n        return $this->themeName;\n    }\n\n    /**\n     * Get colour Scheme Name\n     *\n     * @return string\n     */\n    public function getColourSchemeName()\n    {\n        return $this->colourSchemeName;\n    }\n\n    /**\n     * Get colour Map Value by Position\n     *\n     * @return string\n     */\n    public function getColourByIndex($index = 0)\n    {\n        if (isset($this->colourMap[$index])) {\n            return $this->colourMap[$index];\n        }\n        return null;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if ((is_object($value)) && ($key != '_parent')) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_Excel2007\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Excel2007 extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * PHPExcel_ReferenceHelper instance\n     *\n     * @var PHPExcel_ReferenceHelper\n     */\n    private $referenceHelper = null;\n\n    /**\n     * PHPExcel_Reader_Excel2007_Theme instance\n     *\n     * @var PHPExcel_Reader_Excel2007_Theme\n     */\n    private static $theme = null;\n\n    /**\n     * Create a new PHPExcel_Reader_Excel2007 instance\n     */\n    public function __construct()\n    {\n        $this->readFilter = new PHPExcel_Reader_DefaultReadFilter();\n        $this->referenceHelper = PHPExcel_ReferenceHelper::getInstance();\n    }\n\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return     boolean\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function canRead($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        // Check if zip class exists\n//        if (!class_exists($zipClass, false)) {\n//            throw new PHPExcel_Reader_Exception($zipClass . \" library is not enabled\");\n//        }\n\n        $xl = false;\n        // Load file\n        $zip = new $zipClass;\n        if ($zip->open($pFilename) === true) {\n            // check if it is an OOXML archive\n            $rels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"_rels/.rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n            if ($rels !== false) {\n                foreach ($rels->Relationship as $rel) {\n                    switch ($rel[\"Type\"]) {\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\":\n                            if (basename($rel[\"Target\"]) == 'workbook.xml') {\n                                $xl = true;\n                            }\n                            break;\n\n                    }\n                }\n            }\n            $zip->close();\n        }\n\n        return $xl;\n    }\n\n\n    /**\n     * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object\n     *\n     * @param     string         $pFilename\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function listWorksheetNames($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $worksheetNames = array();\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        $zip = new $zipClass;\n        $zip->open($pFilename);\n\n        //    The files we're looking at here are small enough that simpleXML is more efficient than XMLReader\n        $rels = simplexml_load_string(\n            $this->securityScan($this->getFromZipArchive($zip, \"_rels/.rels\"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions())\n        ); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n        foreach ($rels->Relationship as $rel) {\n            switch ($rel[\"Type\"]) {\n                case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\":\n                    $xmlWorkbook = simplexml_load_string(\n                        $this->securityScan($this->getFromZipArchive($zip, \"{$rel['Target']}\"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions())\n                    );  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n\n                    if ($xmlWorkbook->sheets) {\n                        foreach ($xmlWorkbook->sheets->sheet as $eleSheet) {\n                            // Check if sheet should be skipped\n                            $worksheetNames[] = (string) $eleSheet[\"name\"];\n                        }\n                    }\n            }\n        }\n\n        $zip->close();\n\n        return $worksheetNames;\n    }\n\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param   string     $pFilename\n     * @throws   PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $worksheetInfo = array();\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        $zip = new $zipClass;\n        $zip->open($pFilename);\n\n        $rels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"_rels/.rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n        foreach ($rels->Relationship as $rel) {\n            if ($rel[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\") {\n                $dir = dirname($rel[\"Target\"]);\n                $relsWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"$dir/_rels/\" . basename($rel[\"Target\"]) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                $relsWorkbook->registerXPathNamespace(\"rel\", \"http://schemas.openxmlformats.org/package/2006/relationships\");\n\n                $worksheets = array();\n                foreach ($relsWorkbook->Relationship as $ele) {\n                    if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\") {\n                        $worksheets[(string) $ele[\"Id\"]] = $ele[\"Target\"];\n                    }\n                }\n\n                $xmlWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"{$rel['Target']}\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n                if ($xmlWorkbook->sheets) {\n                    $dir = dirname($rel[\"Target\"]);\n                    foreach ($xmlWorkbook->sheets->sheet as $eleSheet) {\n                        $tmpInfo = array(\n                            'worksheetName' => (string) $eleSheet[\"name\"],\n                            'lastColumnLetter' => 'A',\n                            'lastColumnIndex' => 0,\n                            'totalRows' => 0,\n                            'totalColumns' => 0,\n                        );\n\n                        $fileWorksheet = $worksheets[(string) self::getArrayItem($eleSheet->attributes(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"), \"id\")];\n\n                        $xml = new XMLReader();\n                        $res = $xml->xml($this->securityScanFile('zip://'.PHPExcel_Shared_File::realpath($pFilename).'#'.\"$dir/$fileWorksheet\"), null, PHPExcel_Settings::getLibXmlLoaderOptions());\n                        $xml->setParserProperty(2, true);\n\n                        $currCells = 0;\n                        while ($xml->read()) {\n                            if ($xml->name == 'row' && $xml->nodeType == XMLReader::ELEMENT) {\n                                $row = $xml->getAttribute('r');\n                                $tmpInfo['totalRows'] = $row;\n                                $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells);\n                                $currCells = 0;\n                            } elseif ($xml->name == 'c' && $xml->nodeType == XMLReader::ELEMENT) {\n                                $currCells++;\n                            }\n                        }\n                        $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells);\n                        $xml->close();\n\n                        $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;\n                        $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);\n\n                        $worksheetInfo[] = $tmpInfo;\n                    }\n                }\n            }\n        }\n\n        $zip->close();\n\n        return $worksheetInfo;\n    }\n\n    private static function castToBoolean($c)\n    {\n//        echo 'Initial Cast to Boolean', PHP_EOL;\n        $value = isset($c->v) ? (string) $c->v : null;\n        if ($value == '0') {\n            return false;\n        } elseif ($value == '1') {\n            return true;\n        } else {\n            return (bool)$c->v;\n        }\n        return $value;\n    }\n\n    private static function castToError($c)\n    {\n//        echo 'Initial Cast to Error', PHP_EOL;\n        return isset($c->v) ? (string) $c->v : null;\n    }\n\n    private static function castToString($c)\n    {\n//        echo 'Initial Cast to String, PHP_EOL;\n        return isset($c->v) ? (string) $c->v : null;\n    }\n\n    private function castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType)\n    {\n//        echo 'Formula', PHP_EOL;\n//        echo '$c->f is ', $c->f, PHP_EOL;\n        $cellDataType       = 'f';\n        $value              = \"={$c->f}\";\n        $calculatedValue    = self::$castBaseType($c);\n\n        // Shared formula?\n        if (isset($c->f['t']) && strtolower((string)$c->f['t']) == 'shared') {\n//            echo 'SHARED FORMULA', PHP_EOL;\n            $instance = (string)$c->f['si'];\n\n//            echo 'Instance ID = ', $instance, PHP_EOL;\n//\n//            echo 'Shared Formula Array:', PHP_EOL;\n//            print_r($sharedFormulas);\n            if (!isset($sharedFormulas[(string)$c->f['si']])) {\n//                echo 'SETTING NEW SHARED FORMULA', PHP_EOL;\n//                echo 'Master is ', $r, PHP_EOL;\n//                echo 'Formula is ', $value, PHP_EOL;\n                $sharedFormulas[$instance] = array('master' => $r, 'formula' => $value);\n//                echo 'New Shared Formula Array:', PHP_EOL;\n//                print_r($sharedFormulas);\n            } else {\n//                echo 'GETTING SHARED FORMULA', PHP_EOL;\n//                echo 'Master is ', $sharedFormulas[$instance]['master'], PHP_EOL;\n//                echo 'Formula is ', $sharedFormulas[$instance]['formula'], PHP_EOL;\n                $master = PHPExcel_Cell::coordinateFromString($sharedFormulas[$instance]['master']);\n                $current = PHPExcel_Cell::coordinateFromString($r);\n\n                $difference = array(0, 0);\n                $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]);\n                $difference[1] = $current[1] - $master[1];\n\n                $value = $this->referenceHelper->updateFormulaReferences($sharedFormulas[$instance]['formula'], 'A1', $difference[0], $difference[1]);\n//                echo 'Adjusted Formula is ', $value, PHP_EOL;\n            }\n        }\n    }\n\n\n    private function getFromZipArchive($archive, $fileName = '')\n    {\n        // Root-relative paths\n        if (strpos($fileName, '//') !== false) {\n            $fileName = substr($fileName, strpos($fileName, '//') + 1);\n        }\n        $fileName = PHPExcel_Shared_File::realpath($fileName);\n\n        // Sadly, some 3rd party xlsx generators don't use consistent case for filenaming\n        //    so we need to load case-insensitively from the zip file\n        \n        // Apache POI fixes\n        $contents = $archive->getFromIndex(\n            $archive->locateName($fileName, ZIPARCHIVE::FL_NOCASE)\n        );\n        if ($contents === false) {\n            $contents = $archive->getFromIndex(\n                $archive->locateName(substr($fileName, 1), ZIPARCHIVE::FL_NOCASE)\n            );\n        }\n\n        return $contents;\n    }\n\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return  PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        // Initialisations\n        $excel = new PHPExcel;\n        $excel->removeSheetByIndex(0);\n        if (!$this->readDataOnly) {\n            $excel->removeCellStyleXfByIndex(0); // remove the default style\n            $excel->removeCellXfByIndex(0); // remove the default style\n        }\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        $zip = new $zipClass;\n        $zip->open($pFilename);\n\n        //    Read the theme first, because we need the colour scheme when reading the styles\n        $wbRels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"xl/_rels/workbook.xml.rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n        foreach ($wbRels->Relationship as $rel) {\n            switch ($rel[\"Type\"]) {\n                case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\":\n                    $themeOrderArray = array('lt1', 'dk1', 'lt2', 'dk2');\n                    $themeOrderAdditional = count($themeOrderArray);\n\n                    $xmlTheme = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"xl/{$rel['Target']}\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                    if (is_object($xmlTheme)) {\n                        $xmlThemeName = $xmlTheme->attributes();\n                        $xmlTheme = $xmlTheme->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\");\n                        $themeName = (string)$xmlThemeName['name'];\n\n                        $colourScheme = $xmlTheme->themeElements->clrScheme->attributes();\n                        $colourSchemeName = (string)$colourScheme['name'];\n                        $colourScheme = $xmlTheme->themeElements->clrScheme->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\");\n\n                        $themeColours = array();\n                        foreach ($colourScheme as $k => $xmlColour) {\n                            $themePos = array_search($k, $themeOrderArray);\n                            if ($themePos === false) {\n                                $themePos = $themeOrderAdditional++;\n                            }\n                            if (isset($xmlColour->sysClr)) {\n                                $xmlColourData = $xmlColour->sysClr->attributes();\n                                $themeColours[$themePos] = $xmlColourData['lastClr'];\n                            } elseif (isset($xmlColour->srgbClr)) {\n                                $xmlColourData = $xmlColour->srgbClr->attributes();\n                                $themeColours[$themePos] = $xmlColourData['val'];\n                            }\n                        }\n                        self::$theme = new PHPExcel_Reader_Excel2007_Theme($themeName, $colourSchemeName, $themeColours);\n                    }\n                    break;\n            }\n        }\n\n        $rels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"_rels/.rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n        foreach ($rels->Relationship as $rel) {\n            switch ($rel[\"Type\"]) {\n                case \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\":\n                    $xmlCore = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"{$rel['Target']}\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                    if (is_object($xmlCore)) {\n                        $xmlCore->registerXPathNamespace(\"dc\", \"http://purl.org/dc/elements/1.1/\");\n                        $xmlCore->registerXPathNamespace(\"dcterms\", \"http://purl.org/dc/terms/\");\n                        $xmlCore->registerXPathNamespace(\"cp\", \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\");\n                        $docProps = $excel->getProperties();\n                        $docProps->setCreator((string) self::getArrayItem($xmlCore->xpath(\"dc:creator\")));\n                        $docProps->setLastModifiedBy((string) self::getArrayItem($xmlCore->xpath(\"cp:lastModifiedBy\")));\n                        $docProps->setCreated(strtotime(self::getArrayItem($xmlCore->xpath(\"dcterms:created\")))); //! respect xsi:type\n                        $docProps->setModified(strtotime(self::getArrayItem($xmlCore->xpath(\"dcterms:modified\")))); //! respect xsi:type\n                        $docProps->setTitle((string) self::getArrayItem($xmlCore->xpath(\"dc:title\")));\n                        $docProps->setDescription((string) self::getArrayItem($xmlCore->xpath(\"dc:description\")));\n                        $docProps->setSubject((string) self::getArrayItem($xmlCore->xpath(\"dc:subject\")));\n                        $docProps->setKeywords((string) self::getArrayItem($xmlCore->xpath(\"cp:keywords\")));\n                        $docProps->setCategory((string) self::getArrayItem($xmlCore->xpath(\"cp:category\")));\n                    }\n                    break;\n                case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\":\n                    $xmlCore = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"{$rel['Target']}\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                    if (is_object($xmlCore)) {\n                        $docProps = $excel->getProperties();\n                        if (isset($xmlCore->Company)) {\n                            $docProps->setCompany((string) $xmlCore->Company);\n                        }\n                        if (isset($xmlCore->Manager)) {\n                            $docProps->setManager((string) $xmlCore->Manager);\n                        }\n                    }\n                    break;\n                case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties\":\n                    $xmlCore = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"{$rel['Target']}\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                    if (is_object($xmlCore)) {\n                        $docProps = $excel->getProperties();\n                        foreach ($xmlCore as $xmlProperty) {\n                            $cellDataOfficeAttributes = $xmlProperty->attributes();\n                            if (isset($cellDataOfficeAttributes['name'])) {\n                                $propertyName = (string) $cellDataOfficeAttributes['name'];\n                                $cellDataOfficeChildren = $xmlProperty->children('http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes');\n                                $attributeType = $cellDataOfficeChildren->getName();\n                                $attributeValue = (string) $cellDataOfficeChildren->{$attributeType};\n                                $attributeValue = PHPExcel_DocumentProperties::convertProperty($attributeValue, $attributeType);\n                                $attributeType = PHPExcel_DocumentProperties::convertPropertyType($attributeType);\n                                $docProps->setCustomProperty($propertyName, $attributeValue, $attributeType);\n                            }\n                        }\n                    }\n                    break;\n                //Ribbon\n                case \"http://schemas.microsoft.com/office/2006/relationships/ui/extensibility\":\n                    $customUI = $rel['Target'];\n                    if (!is_null($customUI)) {\n                        $this->readRibbon($excel, $customUI, $zip);\n                    }\n                    break;\n                case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\":\n                    $dir = dirname($rel[\"Target\"]);\n                    $relsWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"$dir/_rels/\" . basename($rel[\"Target\"]) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                    $relsWorkbook->registerXPathNamespace(\"rel\", \"http://schemas.openxmlformats.org/package/2006/relationships\");\n\n                    $sharedStrings = array();\n                    $xpath = self::getArrayItem($relsWorkbook->xpath(\"rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings']\"));\n                    $xmlStrings = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"$dir/$xpath[Target]\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n                    if (isset($xmlStrings) && isset($xmlStrings->si)) {\n                        foreach ($xmlStrings->si as $val) {\n                            if (isset($val->t)) {\n                                $sharedStrings[] = PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $val->t);\n                            } elseif (isset($val->r)) {\n                                $sharedStrings[] = $this->parseRichText($val);\n                            }\n                        }\n                    }\n\n                    $worksheets = array();\n                    $macros = $customUI = null;\n                    foreach ($relsWorkbook->Relationship as $ele) {\n                        switch ($ele['Type']) {\n                            case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\":\n                                $worksheets[(string) $ele[\"Id\"]] = $ele[\"Target\"];\n                                break;\n                            // a vbaProject ? (: some macros)\n                            case \"http://schemas.microsoft.com/office/2006/relationships/vbaProject\":\n                                $macros = $ele[\"Target\"];\n                                break;\n                        }\n                    }\n\n                    if (!is_null($macros)) {\n                        $macrosCode = $this->getFromZipArchive($zip, 'xl/vbaProject.bin');//vbaProject.bin always in 'xl' dir and always named vbaProject.bin\n                        if ($macrosCode !== false) {\n                            $excel->setMacrosCode($macrosCode);\n                            $excel->setHasMacros(true);\n                            //short-circuit : not reading vbaProject.bin.rel to get Signature =>allways vbaProjectSignature.bin in 'xl' dir\n                            $Certificate = $this->getFromZipArchive($zip, 'xl/vbaProjectSignature.bin');\n                            if ($Certificate !== false) {\n                                $excel->setMacrosCertificate($Certificate);\n                            }\n                        }\n                    }\n                    $styles     = array();\n                    $cellStyles = array();\n                    $xpath = self::getArrayItem($relsWorkbook->xpath(\"rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles']\"));\n                    $xmlStyles = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"$dir/$xpath[Target]\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                    //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n\n                    $numFmts = null;\n                    if ($xmlStyles && $xmlStyles->numFmts[0]) {\n                        $numFmts = $xmlStyles->numFmts[0];\n                    }\n                    if (isset($numFmts) && ($numFmts !== null)) {\n                        $numFmts->registerXPathNamespace(\"sml\", \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n                    }\n                    if (!$this->readDataOnly && $xmlStyles) {\n                        foreach ($xmlStyles->cellXfs->xf as $xf) {\n                            $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;\n                            if ($xf[\"numFmtId\"]) {\n                                if (isset($numFmts)) {\n                                    $tmpNumFmt = self::getArrayItem($numFmts->xpath(\"sml:numFmt[@numFmtId=$xf[numFmtId]]\"));\n\n                                    if (isset($tmpNumFmt[\"formatCode\"])) {\n                                        $numFmt = (string) $tmpNumFmt[\"formatCode\"];\n                                    }\n                                }\n\n                                // We shouldn't override any of the built-in MS Excel values (values below id 164)\n                                //  But there's a lot of naughty homebrew xlsx writers that do use \"reserved\" id values that aren't actually used\n                                //  So we make allowance for them rather than lose formatting masks\n                                if ((int)$xf[\"numFmtId\"] < 164 && PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf[\"numFmtId\"]) !== '') {\n                                    $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf[\"numFmtId\"]);\n                                }\n                            }\n                            $quotePrefix = false;\n                            if (isset($xf[\"quotePrefix\"])) {\n                                $quotePrefix = (boolean) $xf[\"quotePrefix\"];\n                            }\n\n                            $style = (object) array(\n                                \"numFmt\" => $numFmt,\n                                \"font\" => $xmlStyles->fonts->font[intval($xf[\"fontId\"])],\n                                \"fill\" => $xmlStyles->fills->fill[intval($xf[\"fillId\"])],\n                                \"border\" => $xmlStyles->borders->border[intval($xf[\"borderId\"])],\n                                \"alignment\" => $xf->alignment,\n                                \"protection\" => $xf->protection,\n                                \"quotePrefix\" => $quotePrefix,\n                            );\n                            $styles[] = $style;\n\n                            // add style to cellXf collection\n                            $objStyle = new PHPExcel_Style;\n                            self::readStyle($objStyle, $style);\n                            $excel->addCellXf($objStyle);\n                        }\n\n                        foreach ($xmlStyles->cellStyleXfs->xf as $xf) {\n                            $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;\n                            if ($numFmts && $xf[\"numFmtId\"]) {\n                                $tmpNumFmt = self::getArrayItem($numFmts->xpath(\"sml:numFmt[@numFmtId=$xf[numFmtId]]\"));\n                                if (isset($tmpNumFmt[\"formatCode\"])) {\n                                    $numFmt = (string) $tmpNumFmt[\"formatCode\"];\n                                } elseif ((int)$xf[\"numFmtId\"] < 165) {\n                                    $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf[\"numFmtId\"]);\n                                }\n                            }\n\n                            $cellStyle = (object) array(\n                                \"numFmt\" => $numFmt,\n                                \"font\" => $xmlStyles->fonts->font[intval($xf[\"fontId\"])],\n                                \"fill\" => $xmlStyles->fills->fill[intval($xf[\"fillId\"])],\n                                \"border\" => $xmlStyles->borders->border[intval($xf[\"borderId\"])],\n                                \"alignment\" => $xf->alignment,\n                                \"protection\" => $xf->protection,\n                                \"quotePrefix\" => $quotePrefix,\n                            );\n                            $cellStyles[] = $cellStyle;\n\n                            // add style to cellStyleXf collection\n                            $objStyle = new PHPExcel_Style;\n                            self::readStyle($objStyle, $cellStyle);\n                            $excel->addCellStyleXf($objStyle);\n                        }\n                    }\n\n                    $dxfs = array();\n                    if (!$this->readDataOnly && $xmlStyles) {\n                        //    Conditional Styles\n                        if ($xmlStyles->dxfs) {\n                            foreach ($xmlStyles->dxfs->dxf as $dxf) {\n                                $style = new PHPExcel_Style(false, true);\n                                self::readStyle($style, $dxf);\n                                $dxfs[] = $style;\n                            }\n                        }\n                        //    Cell Styles\n                        if ($xmlStyles->cellStyles) {\n                            foreach ($xmlStyles->cellStyles->cellStyle as $cellStyle) {\n                                if (intval($cellStyle['builtinId']) == 0) {\n                                    if (isset($cellStyles[intval($cellStyle['xfId'])])) {\n                                        // Set default style\n                                        $style = new PHPExcel_Style;\n                                        self::readStyle($style, $cellStyles[intval($cellStyle['xfId'])]);\n\n                                        // normal style, currently not using it for anything\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    $xmlWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"{$rel['Target']}\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n\n                    // Set base date\n                    if ($xmlWorkbook->workbookPr) {\n                        PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900);\n                        if (isset($xmlWorkbook->workbookPr['date1904'])) {\n                            if (self::boolean((string) $xmlWorkbook->workbookPr['date1904'])) {\n                                PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904);\n                            }\n                        }\n                    }\n\n                    $sheetId = 0; // keep track of new sheet id in final workbook\n                    $oldSheetId = -1; // keep track of old sheet id in final workbook\n                    $countSkippedSheets = 0; // keep track of number of skipped sheets\n                    $mapSheetId = array(); // mapping of sheet ids from old to new\n\n                    $charts = $chartDetails = array();\n\n                    if ($xmlWorkbook->sheets) {\n                        foreach ($xmlWorkbook->sheets->sheet as $eleSheet) {\n                            ++$oldSheetId;\n\n                            // Check if sheet should be skipped\n                            if (isset($this->loadSheetsOnly) && !in_array((string) $eleSheet[\"name\"], $this->loadSheetsOnly)) {\n                                ++$countSkippedSheets;\n                                $mapSheetId[$oldSheetId] = null;\n                                continue;\n                            }\n\n                            // Map old sheet id in original workbook to new sheet id.\n                            // They will differ if loadSheetsOnly() is being used\n                            $mapSheetId[$oldSheetId] = $oldSheetId - $countSkippedSheets;\n\n                            // Load sheet\n                            $docSheet = $excel->createSheet();\n                            //    Use false for $updateFormulaCellReferences to prevent adjustment of worksheet\n                            //        references in formula cells... during the load, all formulae should be correct,\n                            //        and we're simply bringing the worksheet name in line with the formula, not the\n                            //        reverse\n                            $docSheet->setTitle((string) $eleSheet[\"name\"], false);\n                            $fileWorksheet = $worksheets[(string) self::getArrayItem($eleSheet->attributes(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"), \"id\")];\n                            $xmlSheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"$dir/$fileWorksheet\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());  //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n\n                            $sharedFormulas = array();\n\n                            if (isset($eleSheet[\"state\"]) && (string) $eleSheet[\"state\"] != '') {\n                                $docSheet->setSheetState((string) $eleSheet[\"state\"]);\n                            }\n\n                            if (isset($xmlSheet->sheetViews) && isset($xmlSheet->sheetViews->sheetView)) {\n                                if (isset($xmlSheet->sheetViews->sheetView['zoomScale'])) {\n                                    $docSheet->getSheetView()->setZoomScale(intval($xmlSheet->sheetViews->sheetView['zoomScale']));\n                                }\n                                if (isset($xmlSheet->sheetViews->sheetView['zoomScaleNormal'])) {\n                                    $docSheet->getSheetView()->setZoomScaleNormal(intval($xmlSheet->sheetViews->sheetView['zoomScaleNormal']));\n                                }\n                                if (isset($xmlSheet->sheetViews->sheetView['view'])) {\n                                    $docSheet->getSheetView()->setView((string) $xmlSheet->sheetViews->sheetView['view']);\n                                }\n                                if (isset($xmlSheet->sheetViews->sheetView['showGridLines'])) {\n                                    $docSheet->setShowGridLines(self::boolean((string)$xmlSheet->sheetViews->sheetView['showGridLines']));\n                                }\n                                if (isset($xmlSheet->sheetViews->sheetView['showRowColHeaders'])) {\n                                    $docSheet->setShowRowColHeaders(self::boolean((string)$xmlSheet->sheetViews->sheetView['showRowColHeaders']));\n                                }\n                                if (isset($xmlSheet->sheetViews->sheetView['rightToLeft'])) {\n                                    $docSheet->setRightToLeft(self::boolean((string)$xmlSheet->sheetViews->sheetView['rightToLeft']));\n                                }\n                                if (isset($xmlSheet->sheetViews->sheetView->pane)) {\n                                    if (isset($xmlSheet->sheetViews->sheetView->pane['topLeftCell'])) {\n                                        $docSheet->freezePane((string)$xmlSheet->sheetViews->sheetView->pane['topLeftCell']);\n                                    } else {\n                                        $xSplit = 0;\n                                        $ySplit = 0;\n\n                                        if (isset($xmlSheet->sheetViews->sheetView->pane['xSplit'])) {\n                                            $xSplit = 1 + intval($xmlSheet->sheetViews->sheetView->pane['xSplit']);\n                                        }\n\n                                        if (isset($xmlSheet->sheetViews->sheetView->pane['ySplit'])) {\n                                            $ySplit = 1 + intval($xmlSheet->sheetViews->sheetView->pane['ySplit']);\n                                        }\n\n                                        $docSheet->freezePaneByColumnAndRow($xSplit, $ySplit);\n                                    }\n                                }\n\n                                if (isset($xmlSheet->sheetViews->sheetView->selection)) {\n                                    if (isset($xmlSheet->sheetViews->sheetView->selection['sqref'])) {\n                                        $sqref = (string)$xmlSheet->sheetViews->sheetView->selection['sqref'];\n                                        $sqref = explode(' ', $sqref);\n                                        $sqref = $sqref[0];\n                                        $docSheet->setSelectedCells($sqref);\n                                    }\n                                }\n                            }\n\n                            if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->tabColor)) {\n                                if (isset($xmlSheet->sheetPr->tabColor['rgb'])) {\n                                    $docSheet->getTabColor()->setARGB((string)$xmlSheet->sheetPr->tabColor['rgb']);\n                                }\n                            }\n                            if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr['codeName'])) {\n                                $docSheet->setCodeName((string) $xmlSheet->sheetPr['codeName']);\n                            }\n                            if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->outlinePr)) {\n                                if (isset($xmlSheet->sheetPr->outlinePr['summaryRight']) &&\n                                    !self::boolean((string) $xmlSheet->sheetPr->outlinePr['summaryRight'])) {\n                                    $docSheet->setShowSummaryRight(false);\n                                } else {\n                                    $docSheet->setShowSummaryRight(true);\n                                }\n\n                                if (isset($xmlSheet->sheetPr->outlinePr['summaryBelow']) &&\n                                    !self::boolean((string) $xmlSheet->sheetPr->outlinePr['summaryBelow'])) {\n                                    $docSheet->setShowSummaryBelow(false);\n                                } else {\n                                    $docSheet->setShowSummaryBelow(true);\n                                }\n                            }\n\n                            if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->pageSetUpPr)) {\n                                if (isset($xmlSheet->sheetPr->pageSetUpPr['fitToPage']) &&\n                                    !self::boolean((string) $xmlSheet->sheetPr->pageSetUpPr['fitToPage'])) {\n                                    $docSheet->getPageSetup()->setFitToPage(false);\n                                } else {\n                                    $docSheet->getPageSetup()->setFitToPage(true);\n                                }\n                            }\n\n                            if (isset($xmlSheet->sheetFormatPr)) {\n                                if (isset($xmlSheet->sheetFormatPr['customHeight']) &&\n                                    self::boolean((string) $xmlSheet->sheetFormatPr['customHeight']) &&\n                                    isset($xmlSheet->sheetFormatPr['defaultRowHeight'])) {\n                                    $docSheet->getDefaultRowDimension()->setRowHeight((float)$xmlSheet->sheetFormatPr['defaultRowHeight']);\n                                }\n                                if (isset($xmlSheet->sheetFormatPr['defaultColWidth'])) {\n                                    $docSheet->getDefaultColumnDimension()->setWidth((float)$xmlSheet->sheetFormatPr['defaultColWidth']);\n                                }\n                                if (isset($xmlSheet->sheetFormatPr['zeroHeight']) &&\n                                    ((string)$xmlSheet->sheetFormatPr['zeroHeight'] == '1')) {\n                                    $docSheet->getDefaultRowDimension()->setZeroHeight(true);\n                                }\n                            }\n\n                            if (isset($xmlSheet->cols) && !$this->readDataOnly) {\n                                foreach ($xmlSheet->cols->col as $col) {\n                                    for ($i = intval($col[\"min\"]) - 1; $i < intval($col[\"max\"]); ++$i) {\n                                        if ($col[\"style\"] && !$this->readDataOnly) {\n                                            $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setXfIndex(intval($col[\"style\"]));\n                                        }\n                                        if (self::boolean($col[\"bestFit\"])) {\n                                            //$docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setAutoSize(true);\n                                        }\n                                        if (self::boolean($col[\"hidden\"])) {\n                                        // echo PHPExcel_Cell::stringFromColumnIndex($i), ': HIDDEN COLUMN',PHP_EOL;\n                                            $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setVisible(false);\n                                        }\n                                        if (self::boolean($col[\"collapsed\"])) {\n                                            $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setCollapsed(true);\n                                        }\n                                        if ($col[\"outlineLevel\"] > 0) {\n                                            $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setOutlineLevel(intval($col[\"outlineLevel\"]));\n                                        }\n                                        $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setWidth(floatval($col[\"width\"]));\n\n                                        if (intval($col[\"max\"]) == 16384) {\n                                            break;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if (isset($xmlSheet->printOptions) && !$this->readDataOnly) {\n                                if (self::boolean((string) $xmlSheet->printOptions['gridLinesSet'])) {\n                                    $docSheet->setShowGridlines(true);\n                                }\n                                if (self::boolean((string) $xmlSheet->printOptions['gridLines'])) {\n                                    $docSheet->setPrintGridlines(true);\n                                }\n                                if (self::boolean((string) $xmlSheet->printOptions['horizontalCentered'])) {\n                                    $docSheet->getPageSetup()->setHorizontalCentered(true);\n                                }\n                                if (self::boolean((string) $xmlSheet->printOptions['verticalCentered'])) {\n                                    $docSheet->getPageSetup()->setVerticalCentered(true);\n                                }\n                            }\n\n                            if ($xmlSheet && $xmlSheet->sheetData && $xmlSheet->sheetData->row) {\n                                foreach ($xmlSheet->sheetData->row as $row) {\n                                    if ($row[\"ht\"] && !$this->readDataOnly) {\n                                        $docSheet->getRowDimension(intval($row[\"r\"]))->setRowHeight(floatval($row[\"ht\"]));\n                                    }\n                                    if (self::boolean($row[\"hidden\"]) && !$this->readDataOnly) {\n                                        $docSheet->getRowDimension(intval($row[\"r\"]))->setVisible(false);\n                                    }\n                                    if (self::boolean($row[\"collapsed\"])) {\n                                        $docSheet->getRowDimension(intval($row[\"r\"]))->setCollapsed(true);\n                                    }\n                                    if ($row[\"outlineLevel\"] > 0) {\n                                        $docSheet->getRowDimension(intval($row[\"r\"]))->setOutlineLevel(intval($row[\"outlineLevel\"]));\n                                    }\n                                    if ($row[\"s\"] && !$this->readDataOnly) {\n                                        $docSheet->getRowDimension(intval($row[\"r\"]))->setXfIndex(intval($row[\"s\"]));\n                                    }\n\n                                    foreach ($row->c as $c) {\n                                        $r                     = (string) $c[\"r\"];\n                                        $cellDataType         = (string) $c[\"t\"];\n                                        $value                = null;\n                                        $calculatedValue     = null;\n\n                                        // Read cell?\n                                        if ($this->getReadFilter() !== null) {\n                                            $coordinates = PHPExcel_Cell::coordinateFromString($r);\n\n                                            if (!$this->getReadFilter()->readCell($coordinates[0], $coordinates[1], $docSheet->getTitle())) {\n                                                continue;\n                                            }\n                                        }\n\n    //                                    echo 'Reading cell ', $coordinates[0], $coordinates[1], PHP_EOL;\n    //                                    print_r($c);\n    //                                    echo PHP_EOL;\n    //                                    echo 'Cell Data Type is ', $cellDataType, ': ';\n    //\n                                        // Read cell!\n                                        switch ($cellDataType) {\n                                            case \"s\":\n    //                                            echo 'String', PHP_EOL;\n                                                if ((string)$c->v != '') {\n                                                    $value = $sharedStrings[intval($c->v)];\n\n                                                    if ($value instanceof PHPExcel_RichText) {\n                                                        $value = clone $value;\n                                                    }\n                                                } else {\n                                                    $value = '';\n                                                }\n                                                break;\n                                            case \"b\":\n    //                                            echo 'Boolean', PHP_EOL;\n                                                if (!isset($c->f)) {\n                                                    $value = self::castToBoolean($c);\n                                                } else {\n                                                    // Formula\n                                                    $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToBoolean');\n                                                    if (isset($c->f['t'])) {\n                                                        $att = array();\n                                                        $att = $c->f;\n                                                        $docSheet->getCell($r)->setFormulaAttributes($att);\n                                                    }\n    //                                                echo '$calculatedValue = ', $calculatedValue, PHP_EOL;\n                                                }\n                                                break;\n                                            case \"inlineStr\":\n//                                                echo 'Inline String', PHP_EOL;\n                                                if (isset($c->f)) {\n                                                    $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToError');\n                                                } else {\n                                                    $value = $this->parseRichText($c->is);\n                                                }\n                                                break;\n                                            case \"e\":\n    //                                            echo 'Error', PHP_EOL;\n                                                if (!isset($c->f)) {\n                                                    $value = self::castToError($c);\n                                                } else {\n                                                    // Formula\n                                                    $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToError');\n    //                                                echo '$calculatedValue = ', $calculatedValue, PHP_EOL;\n                                                }\n                                                break;\n                                            default:\n//                                                echo 'Default', PHP_EOL;\n                                                if (!isset($c->f)) {\n    //                                                echo 'Not a Formula', PHP_EOL;\n                                                    $value = self::castToString($c);\n                                                } else {\n    //                                                echo 'Treat as Formula', PHP_EOL;\n                                                    // Formula\n                                                    $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToString');\n    //                                                echo '$calculatedValue = ', $calculatedValue, PHP_EOL;\n                                                }\n                                                break;\n                                        }\n    //                                    echo 'Value is ', $value, PHP_EOL;\n\n                                        // Check for numeric values\n                                        if (is_numeric($value) && $cellDataType != 's') {\n                                            if ($value == (int)$value) {\n                                                $value = (int)$value;\n                                            } elseif ($value == (float)$value) {\n                                                $value = (float)$value;\n                                            } elseif ($value == (double)$value) {\n                                                $value = (double)$value;\n                                            }\n                                        }\n\n                                        // Rich text?\n                                        if ($value instanceof PHPExcel_RichText && $this->readDataOnly) {\n                                            $value = $value->getPlainText();\n                                        }\n\n                                        $cell = $docSheet->getCell($r);\n                                        // Assign value\n                                        if ($cellDataType != '') {\n                                            $cell->setValueExplicit($value, $cellDataType);\n                                        } else {\n                                            $cell->setValue($value);\n                                        }\n                                        if ($calculatedValue !== null) {\n                                            $cell->setCalculatedValue($calculatedValue);\n                                        }\n\n                                        // Style information?\n                                        if ($c[\"s\"] && !$this->readDataOnly) {\n                                            // no style index means 0, it seems\n                                            $cell->setXfIndex(isset($styles[intval($c[\"s\"])]) ?\n                                                intval($c[\"s\"]) : 0);\n                                        }\n                                    }\n                                }\n                            }\n\n                            $conditionals = array();\n                            if (!$this->readDataOnly && $xmlSheet && $xmlSheet->conditionalFormatting) {\n                                foreach ($xmlSheet->conditionalFormatting as $conditional) {\n                                    foreach ($conditional->cfRule as $cfRule) {\n                                        if (((string)$cfRule[\"type\"] == PHPExcel_Style_Conditional::CONDITION_NONE || (string)$cfRule[\"type\"] == PHPExcel_Style_Conditional::CONDITION_CELLIS || (string)$cfRule[\"type\"] == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT || (string)$cfRule[\"type\"] == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) && isset($dxfs[intval($cfRule[\"dxfId\"])])) {\n                                            $conditionals[(string) $conditional[\"sqref\"]][intval($cfRule[\"priority\"])] = $cfRule;\n                                        }\n                                    }\n                                }\n\n                                foreach ($conditionals as $ref => $cfRules) {\n                                    ksort($cfRules);\n                                    $conditionalStyles = array();\n                                    foreach ($cfRules as $cfRule) {\n                                        $objConditional = new PHPExcel_Style_Conditional();\n                                        $objConditional->setConditionType((string)$cfRule[\"type\"]);\n                                        $objConditional->setOperatorType((string)$cfRule[\"operator\"]);\n\n                                        if ((string)$cfRule[\"text\"] != '') {\n                                            $objConditional->setText((string)$cfRule[\"text\"]);\n                                        }\n\n                                        if (count($cfRule->formula) > 1) {\n                                            foreach ($cfRule->formula as $formula) {\n                                                $objConditional->addCondition((string)$formula);\n                                            }\n                                        } else {\n                                            $objConditional->addCondition((string)$cfRule->formula);\n                                        }\n                                        $objConditional->setStyle(clone $dxfs[intval($cfRule[\"dxfId\"])]);\n                                        $conditionalStyles[] = $objConditional;\n                                    }\n\n                                    // Extract all cell references in $ref\n                                    $cellBlocks = explode(' ', str_replace('$', '', strtoupper($ref)));\n                                    foreach ($cellBlocks as $cellBlock) {\n                                        $docSheet->getStyle($cellBlock)->setConditionalStyles($conditionalStyles);\n                                    }\n                                }\n                            }\n\n                            $aKeys = array(\"sheet\", \"objects\", \"scenarios\", \"formatCells\", \"formatColumns\", \"formatRows\", \"insertColumns\", \"insertRows\", \"insertHyperlinks\", \"deleteColumns\", \"deleteRows\", \"selectLockedCells\", \"sort\", \"autoFilter\", \"pivotTables\", \"selectUnlockedCells\");\n                            if (!$this->readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) {\n                                foreach ($aKeys as $key) {\n                                    $method = \"set\" . ucfirst($key);\n                                    $docSheet->getProtection()->$method(self::boolean((string) $xmlSheet->sheetProtection[$key]));\n                                }\n                            }\n\n                            if (!$this->readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) {\n                                $docSheet->getProtection()->setPassword((string) $xmlSheet->sheetProtection[\"password\"], true);\n                                if ($xmlSheet->protectedRanges->protectedRange) {\n                                    foreach ($xmlSheet->protectedRanges->protectedRange as $protectedRange) {\n                                        $docSheet->protectCells((string) $protectedRange[\"sqref\"], (string) $protectedRange[\"password\"], true);\n                                    }\n                                }\n                            }\n\n                            if ($xmlSheet && $xmlSheet->autoFilter && !$this->readDataOnly) {\n                                $autoFilterRange = (string) $xmlSheet->autoFilter[\"ref\"];\n                                if (strpos($autoFilterRange, ':') !== false) {\n                                    $autoFilter = $docSheet->getAutoFilter();\n                                    $autoFilter->setRange($autoFilterRange);\n\n                                    foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) {\n                                        $column = $autoFilter->getColumnByOffset((integer) $filterColumn[\"colId\"]);\n                                        //    Check for standard filters\n                                        if ($filterColumn->filters) {\n                                            $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER);\n                                            $filters = $filterColumn->filters;\n                                            if ((isset($filters[\"blank\"])) && ($filters[\"blank\"] == 1)) {\n                                                //    Operator is undefined, but always treated as EQUAL\n                                                $column->createRule()->setRule(null, '')->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER);\n                                            }\n                                            //    Standard filters are always an OR join, so no join rule needs to be set\n                                            //    Entries can be either filter elements\n                                            foreach ($filters->filter as $filterRule) {\n                                                //    Operator is undefined, but always treated as EQUAL\n                                                $column->createRule()->setRule(null, (string) $filterRule[\"val\"])->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER);\n                                            }\n                                            //    Or Date Group elements\n                                            foreach ($filters->dateGroupItem as $dateGroupItem) {\n                                                $column->createRule()->setRule(\n                                                    //    Operator is undefined, but always treated as EQUAL\n                                                    null,\n                                                    array(\n                                                        'year' => (string) $dateGroupItem[\"year\"],\n                                                        'month' => (string) $dateGroupItem[\"month\"],\n                                                        'day' => (string) $dateGroupItem[\"day\"],\n                                                        'hour' => (string) $dateGroupItem[\"hour\"],\n                                                        'minute' => (string) $dateGroupItem[\"minute\"],\n                                                        'second' => (string) $dateGroupItem[\"second\"],\n                                                    ),\n                                                    (string) $dateGroupItem[\"dateTimeGrouping\"]\n                                                )\n                                                ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP);\n                                            }\n                                        }\n                                        //    Check for custom filters\n                                        if ($filterColumn->customFilters) {\n                                            $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER);\n                                            $customFilters = $filterColumn->customFilters;\n                                            //    Custom filters can an AND or an OR join;\n                                            //        and there should only ever be one or two entries\n                                            if ((isset($customFilters[\"and\"])) && ($customFilters[\"and\"] == 1)) {\n                                                $column->setJoin(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND);\n                                            }\n                                            foreach ($customFilters->customFilter as $filterRule) {\n                                                $column->createRule()->setRule(\n                                                    (string) $filterRule[\"operator\"],\n                                                    (string) $filterRule[\"val\"]\n                                                )\n                                                ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER);\n                                            }\n                                        }\n                                        //    Check for dynamic filters\n                                        if ($filterColumn->dynamicFilter) {\n                                            $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER);\n                                            //    We should only ever have one dynamic filter\n                                            foreach ($filterColumn->dynamicFilter as $filterRule) {\n                                                $column->createRule()->setRule(\n                                                    //    Operator is undefined, but always treated as EQUAL\n                                                    null,\n                                                    (string) $filterRule[\"val\"],\n                                                    (string) $filterRule[\"type\"]\n                                                )\n                                                ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER);\n                                                if (isset($filterRule[\"val\"])) {\n                                                    $column->setAttribute('val', (string) $filterRule[\"val\"]);\n                                                }\n                                                if (isset($filterRule[\"maxVal\"])) {\n                                                    $column->setAttribute('maxVal', (string) $filterRule[\"maxVal\"]);\n                                                }\n                                            }\n                                        }\n                                        //    Check for dynamic filters\n                                        if ($filterColumn->top10) {\n                                            $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER);\n                                            //    We should only ever have one top10 filter\n                                            foreach ($filterColumn->top10 as $filterRule) {\n                                                $column->createRule()->setRule(\n                                                    (((isset($filterRule[\"percent\"])) && ($filterRule[\"percent\"] == 1))\n                                                        ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT\n                                                        : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE\n                                                    ),\n                                                    (string) $filterRule[\"val\"],\n                                                    (((isset($filterRule[\"top\"])) && ($filterRule[\"top\"] == 1))\n                                                        ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP\n                                                        : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM\n                                                    )\n                                                )\n                                                ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER);\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                            if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->readDataOnly) {\n                                foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) {\n                                    $mergeRef = (string) $mergeCell[\"ref\"];\n                                    if (strpos($mergeRef, ':') !== false) {\n                                        $docSheet->mergeCells((string) $mergeCell[\"ref\"]);\n                                    }\n                                }\n                            }\n\n                            if ($xmlSheet && $xmlSheet->pageMargins && !$this->readDataOnly) {\n                                $docPageMargins = $docSheet->getPageMargins();\n                                $docPageMargins->setLeft(floatval($xmlSheet->pageMargins[\"left\"]));\n                                $docPageMargins->setRight(floatval($xmlSheet->pageMargins[\"right\"]));\n                                $docPageMargins->setTop(floatval($xmlSheet->pageMargins[\"top\"]));\n                                $docPageMargins->setBottom(floatval($xmlSheet->pageMargins[\"bottom\"]));\n                                $docPageMargins->setHeader(floatval($xmlSheet->pageMargins[\"header\"]));\n                                $docPageMargins->setFooter(floatval($xmlSheet->pageMargins[\"footer\"]));\n                            }\n\n                            if ($xmlSheet && $xmlSheet->pageSetup && !$this->readDataOnly) {\n                                $docPageSetup = $docSheet->getPageSetup();\n\n                                if (isset($xmlSheet->pageSetup[\"orientation\"])) {\n                                    $docPageSetup->setOrientation((string) $xmlSheet->pageSetup[\"orientation\"]);\n                                }\n                                if (isset($xmlSheet->pageSetup[\"paperSize\"])) {\n                                    $docPageSetup->setPaperSize(intval($xmlSheet->pageSetup[\"paperSize\"]));\n                                }\n                                if (isset($xmlSheet->pageSetup[\"scale\"])) {\n                                    $docPageSetup->setScale(intval($xmlSheet->pageSetup[\"scale\"]), false);\n                                }\n                                if (isset($xmlSheet->pageSetup[\"fitToHeight\"]) && intval($xmlSheet->pageSetup[\"fitToHeight\"]) >= 0) {\n                                    $docPageSetup->setFitToHeight(intval($xmlSheet->pageSetup[\"fitToHeight\"]), false);\n                                }\n                                if (isset($xmlSheet->pageSetup[\"fitToWidth\"]) && intval($xmlSheet->pageSetup[\"fitToWidth\"]) >= 0) {\n                                    $docPageSetup->setFitToWidth(intval($xmlSheet->pageSetup[\"fitToWidth\"]), false);\n                                }\n                                if (isset($xmlSheet->pageSetup[\"firstPageNumber\"]) && isset($xmlSheet->pageSetup[\"useFirstPageNumber\"]) &&\n                                    self::boolean((string) $xmlSheet->pageSetup[\"useFirstPageNumber\"])) {\n                                    $docPageSetup->setFirstPageNumber(intval($xmlSheet->pageSetup[\"firstPageNumber\"]));\n                                }\n                            }\n\n                            if ($xmlSheet && $xmlSheet->headerFooter && !$this->readDataOnly) {\n                                $docHeaderFooter = $docSheet->getHeaderFooter();\n\n                                if (isset($xmlSheet->headerFooter[\"differentOddEven\"]) &&\n                                    self::boolean((string)$xmlSheet->headerFooter[\"differentOddEven\"])) {\n                                    $docHeaderFooter->setDifferentOddEven(true);\n                                } else {\n                                    $docHeaderFooter->setDifferentOddEven(false);\n                                }\n                                if (isset($xmlSheet->headerFooter[\"differentFirst\"]) &&\n                                    self::boolean((string)$xmlSheet->headerFooter[\"differentFirst\"])) {\n                                    $docHeaderFooter->setDifferentFirst(true);\n                                } else {\n                                    $docHeaderFooter->setDifferentFirst(false);\n                                }\n                                if (isset($xmlSheet->headerFooter[\"scaleWithDoc\"]) &&\n                                    !self::boolean((string)$xmlSheet->headerFooter[\"scaleWithDoc\"])) {\n                                    $docHeaderFooter->setScaleWithDocument(false);\n                                } else {\n                                    $docHeaderFooter->setScaleWithDocument(true);\n                                }\n                                if (isset($xmlSheet->headerFooter[\"alignWithMargins\"]) &&\n                                    !self::boolean((string)$xmlSheet->headerFooter[\"alignWithMargins\"])) {\n                                    $docHeaderFooter->setAlignWithMargins(false);\n                                } else {\n                                    $docHeaderFooter->setAlignWithMargins(true);\n                                }\n\n                                $docHeaderFooter->setOddHeader((string) $xmlSheet->headerFooter->oddHeader);\n                                $docHeaderFooter->setOddFooter((string) $xmlSheet->headerFooter->oddFooter);\n                                $docHeaderFooter->setEvenHeader((string) $xmlSheet->headerFooter->evenHeader);\n                                $docHeaderFooter->setEvenFooter((string) $xmlSheet->headerFooter->evenFooter);\n                                $docHeaderFooter->setFirstHeader((string) $xmlSheet->headerFooter->firstHeader);\n                                $docHeaderFooter->setFirstFooter((string) $xmlSheet->headerFooter->firstFooter);\n                            }\n\n                            if ($xmlSheet && $xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk && !$this->readDataOnly) {\n                                foreach ($xmlSheet->rowBreaks->brk as $brk) {\n                                    if ($brk[\"man\"]) {\n                                        $docSheet->setBreak(\"A$brk[id]\", PHPExcel_Worksheet::BREAK_ROW);\n                                    }\n                                }\n                            }\n                            if ($xmlSheet && $xmlSheet->colBreaks && $xmlSheet->colBreaks->brk && !$this->readDataOnly) {\n                                foreach ($xmlSheet->colBreaks->brk as $brk) {\n                                    if ($brk[\"man\"]) {\n                                        $docSheet->setBreak(PHPExcel_Cell::stringFromColumnIndex((string) $brk[\"id\"]) . \"1\", PHPExcel_Worksheet::BREAK_COLUMN);\n                                    }\n                                }\n                            }\n\n                            if ($xmlSheet && $xmlSheet->dataValidations && !$this->readDataOnly) {\n                                foreach ($xmlSheet->dataValidations->dataValidation as $dataValidation) {\n                                    // Uppercase coordinate\n                                    $range = strtoupper($dataValidation[\"sqref\"]);\n                                    $rangeSet = explode(' ', $range);\n                                    foreach ($rangeSet as $range) {\n                                        $stRange = $docSheet->shrinkRangeToFit($range);\n\n                                        // Extract all cell references in $range\n                                        foreach (PHPExcel_Cell::extractAllCellReferencesInRange($stRange) as $reference) {\n                                            // Create validation\n                                            $docValidation = $docSheet->getCell($reference)->getDataValidation();\n                                            $docValidation->setType((string) $dataValidation[\"type\"]);\n                                            $docValidation->setErrorStyle((string) $dataValidation[\"errorStyle\"]);\n                                            $docValidation->setOperator((string) $dataValidation[\"operator\"]);\n                                            $docValidation->setAllowBlank($dataValidation[\"allowBlank\"] != 0);\n                                            $docValidation->setShowDropDown($dataValidation[\"showDropDown\"] == 0);\n                                            $docValidation->setShowInputMessage($dataValidation[\"showInputMessage\"] != 0);\n                                            $docValidation->setShowErrorMessage($dataValidation[\"showErrorMessage\"] != 0);\n                                            $docValidation->setErrorTitle((string) $dataValidation[\"errorTitle\"]);\n                                            $docValidation->setError((string) $dataValidation[\"error\"]);\n                                            $docValidation->setPromptTitle((string) $dataValidation[\"promptTitle\"]);\n                                            $docValidation->setPrompt((string) $dataValidation[\"prompt\"]);\n                                            $docValidation->setFormula1((string) $dataValidation->formula1);\n                                            $docValidation->setFormula2((string) $dataValidation->formula2);\n                                        }\n                                    }\n                                }\n                            }\n\n                            // Add hyperlinks\n                            $hyperlinks = array();\n                            if (!$this->readDataOnly) {\n                                // Locate hyperlink relations\n                                if ($zip->locateName(dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")) {\n                                    $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                                    foreach ($relsWorksheet->Relationship as $ele) {\n                                        if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\") {\n                                            $hyperlinks[(string)$ele[\"Id\"]] = (string)$ele[\"Target\"];\n                                        }\n                                    }\n                                }\n\n                                // Loop through hyperlinks\n                                if ($xmlSheet && $xmlSheet->hyperlinks) {\n                                    foreach ($xmlSheet->hyperlinks->hyperlink as $hyperlink) {\n                                        // Link url\n                                        $linkRel = $hyperlink->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships');\n\n                                        foreach (PHPExcel_Cell::extractAllCellReferencesInRange($hyperlink['ref']) as $cellReference) {\n                                            $cell = $docSheet->getCell($cellReference);\n                                            if (isset($linkRel['id'])) {\n                                                $hyperlinkUrl = $hyperlinks[ (string)$linkRel['id'] ];\n                                                if (isset($hyperlink['location'])) {\n                                                    $hyperlinkUrl .= '#' . (string) $hyperlink['location'];\n                                                }\n                                                $cell->getHyperlink()->setUrl($hyperlinkUrl);\n                                            } elseif (isset($hyperlink['location'])) {\n                                                $cell->getHyperlink()->setUrl('sheet://' . (string)$hyperlink['location']);\n                                            }\n\n                                            // Tooltip\n                                            if (isset($hyperlink['tooltip'])) {\n                                                $cell->getHyperlink()->setTooltip((string)$hyperlink['tooltip']);\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                            // Add comments\n                            $comments = array();\n                            $vmlComments = array();\n                            if (!$this->readDataOnly) {\n                                // Locate comment relations\n                                if ($zip->locateName(dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")) {\n                                    $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                                    foreach ($relsWorksheet->Relationship as $ele) {\n                                        if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\") {\n                                            $comments[(string)$ele[\"Id\"]] = (string)$ele[\"Target\"];\n                                        }\n                                        if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\") {\n                                            $vmlComments[(string)$ele[\"Id\"]] = (string)$ele[\"Target\"];\n                                        }\n                                    }\n                                }\n\n                                // Loop through comments\n                                foreach ($comments as $relName => $relPath) {\n                                    // Load comments file\n                                    $relPath = PHPExcel_Shared_File::realpath(dirname(\"$dir/$fileWorksheet\") . \"/\" . $relPath);\n                                    $commentsFile = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $relPath)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n\n                                    // Utility variables\n                                    $authors = array();\n\n                                    // Loop through authors\n                                    foreach ($commentsFile->authors->author as $author) {\n                                        $authors[] = (string)$author;\n                                    }\n\n                                    // Loop through contents\n                                    foreach ($commentsFile->commentList->comment as $comment) {\n                                        if (!empty($comment['authorId'])) {\n                                            $docSheet->getComment((string)$comment['ref'])->setAuthor($authors[(string)$comment['authorId']]);\n                                        }\n                                        $docSheet->getComment((string)$comment['ref'])->setText($this->parseRichText($comment->text));\n                                    }\n                                }\n\n                                // Loop through VML comments\n                                foreach ($vmlComments as $relName => $relPath) {\n                                    // Load VML comments file\n                                    $relPath = PHPExcel_Shared_File::realpath(dirname(\"$dir/$fileWorksheet\") . \"/\" . $relPath);\n                                    $vmlCommentsFile = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $relPath)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                                    $vmlCommentsFile->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');\n\n                                    $shapes = $vmlCommentsFile->xpath('//v:shape');\n                                    foreach ($shapes as $shape) {\n                                        $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');\n\n                                        if (isset($shape['style'])) {\n                                            $style        = (string)$shape['style'];\n                                            $fillColor    = strtoupper(substr((string)$shape['fillcolor'], 1));\n                                            $column       = null;\n                                            $row          = null;\n\n                                            $clientData   = $shape->xpath('.//x:ClientData');\n                                            if (is_array($clientData) && !empty($clientData)) {\n                                                $clientData   = $clientData[0];\n\n                                                if (isset($clientData['ObjectType']) && (string)$clientData['ObjectType'] == 'Note') {\n                                                    $temp = $clientData->xpath('.//x:Row');\n                                                    if (is_array($temp)) {\n                                                        $row = $temp[0];\n                                                    }\n\n                                                    $temp = $clientData->xpath('.//x:Column');\n                                                    if (is_array($temp)) {\n                                                        $column = $temp[0];\n                                                    }\n                                                }\n                                            }\n\n                                            if (($column !== null) && ($row !== null)) {\n                                                // Set comment properties\n                                                $comment = $docSheet->getCommentByColumnAndRow((string) $column, $row + 1);\n                                                $comment->getFillColor()->setRGB($fillColor);\n\n                                                // Parse style\n                                                $styleArray = explode(';', str_replace(' ', '', $style));\n                                                foreach ($styleArray as $stylePair) {\n                                                    $stylePair = explode(':', $stylePair);\n\n                                                    if ($stylePair[0] == 'margin-left') {\n                                                        $comment->setMarginLeft($stylePair[1]);\n                                                    }\n                                                    if ($stylePair[0] == 'margin-top') {\n                                                        $comment->setMarginTop($stylePair[1]);\n                                                    }\n                                                    if ($stylePair[0] == 'width') {\n                                                        $comment->setWidth($stylePair[1]);\n                                                    }\n                                                    if ($stylePair[0] == 'height') {\n                                                        $comment->setHeight($stylePair[1]);\n                                                    }\n                                                    if ($stylePair[0] == 'visibility') {\n                                                        $comment->setVisible($stylePair[1] == 'visible');\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n\n                                // Header/footer images\n                                if ($xmlSheet && $xmlSheet->legacyDrawingHF && !$this->readDataOnly) {\n                                    if ($zip->locateName(dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")) {\n                                        $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                                        $vmlRelationship = '';\n\n                                        foreach ($relsWorksheet->Relationship as $ele) {\n                                            if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\") {\n                                                $vmlRelationship = self::dirAdd(\"$dir/$fileWorksheet\", $ele[\"Target\"]);\n                                            }\n                                        }\n\n                                        if ($vmlRelationship != '') {\n                                            // Fetch linked images\n                                            $relsVML = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname($vmlRelationship) . '/_rels/' . basename($vmlRelationship) . '.rels')), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                                            $drawings = array();\n                                            foreach ($relsVML->Relationship as $ele) {\n                                                if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\") {\n                                                    $drawings[(string) $ele[\"Id\"]] = self::dirAdd($vmlRelationship, $ele[\"Target\"]);\n                                                }\n                                            }\n\n                                            // Fetch VML document\n                                            $vmlDrawing = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $vmlRelationship)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                                            $vmlDrawing->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');\n\n                                            $hfImages = array();\n\n                                            $shapes = $vmlDrawing->xpath('//v:shape');\n                                            foreach ($shapes as $idx => $shape) {\n                                                $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml');\n                                                $imageData = $shape->xpath('//v:imagedata');\n                                                $imageData = $imageData[$idx];\n\n                                                $imageData = $imageData->attributes('urn:schemas-microsoft-com:office:office');\n                                                $style = self::toCSSArray((string)$shape['style']);\n\n                                                $hfImages[ (string)$shape['id'] ] = new PHPExcel_Worksheet_HeaderFooterDrawing();\n                                                if (isset($imageData['title'])) {\n                                                    $hfImages[ (string)$shape['id'] ]->setName((string)$imageData['title']);\n                                                }\n\n                                                $hfImages[ (string)$shape['id'] ]->setPath(\"zip://\".PHPExcel_Shared_File::realpath($pFilename).\"#\" . $drawings[(string)$imageData['relid']], false);\n                                                $hfImages[ (string)$shape['id'] ]->setResizeProportional(false);\n                                                $hfImages[ (string)$shape['id'] ]->setWidth($style['width']);\n                                                $hfImages[ (string)$shape['id'] ]->setHeight($style['height']);\n                                                if (isset($style['margin-left'])) {\n                                                    $hfImages[ (string)$shape['id'] ]->setOffsetX($style['margin-left']);\n                                                }\n                                                $hfImages[ (string)$shape['id'] ]->setOffsetY($style['margin-top']);\n                                                $hfImages[ (string)$shape['id'] ]->setResizeProportional(true);\n                                            }\n\n                                            $docSheet->getHeaderFooter()->setImages($hfImages);\n                                        }\n                                    }\n                                }\n\n                            }\n\n                            // TODO: Autoshapes from twoCellAnchors!\n                            if ($zip->locateName(dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")) {\n                                $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname(\"$dir/$fileWorksheet\") . \"/_rels/\" . basename($fileWorksheet) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                                $drawings = array();\n                                foreach ($relsWorksheet->Relationship as $ele) {\n                                    if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\") {\n                                        $drawings[(string) $ele[\"Id\"]] = self::dirAdd(\"$dir/$fileWorksheet\", $ele[\"Target\"]);\n                                    }\n                                }\n                                if ($xmlSheet->drawing && !$this->readDataOnly) {\n                                    foreach ($xmlSheet->drawing as $drawing) {\n                                        $fileDrawing = $drawings[(string) self::getArrayItem($drawing->attributes(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"), \"id\")];\n                                        $relsDrawing = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname($fileDrawing) . \"/_rels/\" . basename($fileDrawing) . \".rels\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships\");\n                                        $images = array();\n\n                                        if ($relsDrawing && $relsDrawing->Relationship) {\n                                            foreach ($relsDrawing->Relationship as $ele) {\n                                                if ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\") {\n                                                    $images[(string) $ele[\"Id\"]] = self::dirAdd($fileDrawing, $ele[\"Target\"]);\n                                                } elseif ($ele[\"Type\"] == \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\") {\n                                                    if ($this->includeCharts) {\n                                                        $charts[self::dirAdd($fileDrawing, $ele[\"Target\"])] = array(\n                                                            'id'        => (string) $ele[\"Id\"],\n                                                            'sheet'    => $docSheet->getTitle()\n                                                        );\n                                                    }\n                                                }\n                                            }\n                                        }\n                                        $xmlDrawing = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $fileDrawing)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions())->children(\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\");\n\n                                        if ($xmlDrawing->oneCellAnchor) {\n                                            foreach ($xmlDrawing->oneCellAnchor as $oneCellAnchor) {\n                                                if ($oneCellAnchor->pic->blipFill) {\n                                                    $blip = $oneCellAnchor->pic->blipFill->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->blip;\n                                                    $xfrm = $oneCellAnchor->pic->spPr->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->xfrm;\n                                                    $outerShdw = $oneCellAnchor->pic->spPr->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->effectLst->outerShdw;\n                                                    $objDrawing = new PHPExcel_Worksheet_Drawing;\n                                                    $objDrawing->setName((string) self::getArrayItem($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), \"name\"));\n                                                    $objDrawing->setDescription((string) self::getArrayItem($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), \"descr\"));\n                                                    $objDrawing->setPath(\"zip://\".PHPExcel_Shared_File::realpath($pFilename).\"#\" . $images[(string) self::getArrayItem($blip->attributes(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"), \"embed\")], false);\n                                                    $objDrawing->setCoordinates(PHPExcel_Cell::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1));\n                                                    $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff));\n                                                    $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff));\n                                                    $objDrawing->setResizeProportional(false);\n                                                    $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), \"cx\")));\n                                                    $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), \"cy\")));\n                                                    if ($xfrm) {\n                                                        $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($xfrm->attributes(), \"rot\")));\n                                                    }\n                                                    if ($outerShdw) {\n                                                        $shadow = $objDrawing->getShadow();\n                                                        $shadow->setVisible(true);\n                                                        $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), \"blurRad\")));\n                                                        $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), \"dist\")));\n                                                        $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($outerShdw->attributes(), \"dir\")));\n                                                        $shadow->setAlignment((string) self::getArrayItem($outerShdw->attributes(), \"algn\"));\n                                                        $shadow->getColor()->setRGB(self::getArrayItem($outerShdw->srgbClr->attributes(), \"val\"));\n                                                        $shadow->setAlpha(self::getArrayItem($outerShdw->srgbClr->alpha->attributes(), \"val\") / 1000);\n                                                    }\n                                                    $objDrawing->setWorksheet($docSheet);\n                                                } else {\n                                                    //    ? Can charts be positioned with a oneCellAnchor ?\n                                                    $coordinates    = PHPExcel_Cell::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1);\n                                                    $offsetX        = PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff);\n                                                    $offsetY        = PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff);\n                                                    $width          = PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), \"cx\"));\n                                                    $height         = PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), \"cy\"));\n                                                }\n                                            }\n                                        }\n                                        if ($xmlDrawing->twoCellAnchor) {\n                                            foreach ($xmlDrawing->twoCellAnchor as $twoCellAnchor) {\n                                                if ($twoCellAnchor->pic->blipFill) {\n                                                    $blip = $twoCellAnchor->pic->blipFill->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->blip;\n                                                    $xfrm = $twoCellAnchor->pic->spPr->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->xfrm;\n                                                    $outerShdw = $twoCellAnchor->pic->spPr->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->effectLst->outerShdw;\n                                                    $objDrawing = new PHPExcel_Worksheet_Drawing;\n                                                    $objDrawing->setName((string) self::getArrayItem($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), \"name\"));\n                                                    $objDrawing->setDescription((string) self::getArrayItem($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), \"descr\"));\n                                                    $objDrawing->setPath(\"zip://\".PHPExcel_Shared_File::realpath($pFilename).\"#\" . $images[(string) self::getArrayItem($blip->attributes(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"), \"embed\")], false);\n                                                    $objDrawing->setCoordinates(PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1));\n                                                    $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff));\n                                                    $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff));\n                                                    $objDrawing->setResizeProportional(false);\n\n                                                    if ($xfrm) {\n                                                        $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($xfrm->ext->attributes(), \"cx\")));\n                                                        $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($xfrm->ext->attributes(), \"cy\")));\n                                                        $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($xfrm->attributes(), \"rot\")));\n                                                    }\n                                                    if ($outerShdw) {\n                                                        $shadow = $objDrawing->getShadow();\n                                                        $shadow->setVisible(true);\n                                                        $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), \"blurRad\")));\n                                                        $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), \"dist\")));\n                                                        $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($outerShdw->attributes(), \"dir\")));\n                                                        $shadow->setAlignment((string) self::getArrayItem($outerShdw->attributes(), \"algn\"));\n                                                        $shadow->getColor()->setRGB(self::getArrayItem($outerShdw->srgbClr->attributes(), \"val\"));\n                                                        $shadow->setAlpha(self::getArrayItem($outerShdw->srgbClr->alpha->attributes(), \"val\") / 1000);\n                                                    }\n                                                    $objDrawing->setWorksheet($docSheet);\n                                                } elseif (($this->includeCharts) && ($twoCellAnchor->graphicFrame)) {\n                                                    $fromCoordinate = PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1);\n                                                    $fromOffsetX    = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff);\n                                                    $fromOffsetY    = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff);\n                                                    $toCoordinate   = PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->to->col) . ($twoCellAnchor->to->row + 1);\n                                                    $toOffsetX      = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->to->colOff);\n                                                    $toOffsetY      = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->to->rowOff);\n                                                    $graphic        = $twoCellAnchor->graphicFrame->children(\"http://schemas.openxmlformats.org/drawingml/2006/main\")->graphic;\n                                                    $chartRef       = $graphic->graphicData->children(\"http://schemas.openxmlformats.org/drawingml/2006/chart\")->chart;\n                                                    $thisChart      = (string) $chartRef->attributes(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\");\n\n                                                    $chartDetails[$docSheet->getTitle().'!'.$thisChart] = array(\n                                                        'fromCoordinate'    => $fromCoordinate,\n                                                        'fromOffsetX'       => $fromOffsetX,\n                                                        'fromOffsetY'       => $fromOffsetY,\n                                                        'toCoordinate'      => $toCoordinate,\n                                                        'toOffsetX'         => $toOffsetX,\n                                                        'toOffsetY'         => $toOffsetY,\n                                                        'worksheetTitle'    => $docSheet->getTitle()\n                                                    );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                            // Loop through definedNames\n                            if ($xmlWorkbook->definedNames) {\n                                foreach ($xmlWorkbook->definedNames->definedName as $definedName) {\n                                    // Extract range\n                                    $extractedRange = (string)$definedName;\n                                    $extractedRange = preg_replace('/\\'(\\w+)\\'\\!/', '', $extractedRange);\n                                    if (($spos = strpos($extractedRange, '!')) !== false) {\n                                        $extractedRange = substr($extractedRange, 0, $spos).str_replace('$', '', substr($extractedRange, $spos));\n                                    } else {\n                                        $extractedRange = str_replace('$', '', $extractedRange);\n                                    }\n\n                                    // Valid range?\n                                    if (stripos((string)$definedName, '#REF!') !== false || $extractedRange == '') {\n                                        continue;\n                                    }\n\n                                    // Some definedNames are only applicable if we are on the same sheet...\n                                    if ((string)$definedName['localSheetId'] != '' && (string)$definedName['localSheetId'] == $sheetId) {\n                                        // Switch on type\n                                        switch ((string)$definedName['name']) {\n                                            case '_xlnm._FilterDatabase':\n                                                if ((string)$definedName['hidden'] !== '1') {\n                                                    $extractedRange = explode(',', $extractedRange);\n                                                    foreach ($extractedRange as $range) {\n                                                        $autoFilterRange = $range;\n                                                        if (strpos($autoFilterRange, ':') !== false) {\n                                                            $docSheet->getAutoFilter()->setRange($autoFilterRange);\n                                                        }\n                                                    }\n                                                }\n                                                break;\n                                            case '_xlnm.Print_Titles':\n                                                // Split $extractedRange\n                                                $extractedRange = explode(',', $extractedRange);\n\n                                                // Set print titles\n                                                foreach ($extractedRange as $range) {\n                                                    $matches = array();\n                                                    $range = str_replace('$', '', $range);\n\n                                                    // check for repeating columns, e g. 'A:A' or 'A:D'\n                                                    if (preg_match('/!?([A-Z]+)\\:([A-Z]+)$/', $range, $matches)) {\n                                                        $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($matches[1], $matches[2]));\n                                                    } elseif (preg_match('/!?(\\d+)\\:(\\d+)$/', $range, $matches)) {\n                                                        // check for repeating rows, e.g. '1:1' or '1:5'\n                                                        $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($matches[1], $matches[2]));\n                                                    }\n                                                }\n                                                break;\n                                            case '_xlnm.Print_Area':\n                                                $rangeSets = explode(',', $extractedRange);        // FIXME: what if sheetname contains comma?\n                                                $newRangeSets = array();\n                                                foreach ($rangeSets as $rangeSet) {\n                                                    $range = explode('!', $rangeSet);    // FIXME: what if sheetname contains exclamation mark?\n                                                    $rangeSet = isset($range[1]) ? $range[1] : $range[0];\n                                                    if (strpos($rangeSet, ':') === false) {\n                                                        $rangeSet = $rangeSet . ':' . $rangeSet;\n                                                    }\n                                                    $newRangeSets[] = str_replace('$', '', $rangeSet);\n                                                }\n                                                $docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets));\n                                                break;\n\n                                            default:\n                                                break;\n                                        }\n                                    }\n                                }\n                            }\n\n                            // Next sheet id\n                            ++$sheetId;\n                        }\n\n                        // Loop through definedNames\n                        if ($xmlWorkbook->definedNames) {\n                            foreach ($xmlWorkbook->definedNames->definedName as $definedName) {\n                                // Extract range\n                                $extractedRange = (string)$definedName;\n                                $extractedRange = preg_replace('/\\'(\\w+)\\'\\!/', '', $extractedRange);\n                                if (($spos = strpos($extractedRange, '!')) !== false) {\n                                    $extractedRange = substr($extractedRange, 0, $spos).str_replace('$', '', substr($extractedRange, $spos));\n                                } else {\n                                    $extractedRange = str_replace('$', '', $extractedRange);\n                                }\n\n                                // Valid range?\n                                if (stripos((string)$definedName, '#REF!') !== false || $extractedRange == '') {\n                                    continue;\n                                }\n\n                                // Some definedNames are only applicable if we are on the same sheet...\n                                if ((string)$definedName['localSheetId'] != '') {\n                                    // Local defined name\n                                    // Switch on type\n                                    switch ((string)$definedName['name']) {\n                                        case '_xlnm._FilterDatabase':\n                                        case '_xlnm.Print_Titles':\n                                        case '_xlnm.Print_Area':\n                                            break;\n                                        default:\n                                            if ($mapSheetId[(integer) $definedName['localSheetId']] !== null) {\n                                                $range = explode('!', (string)$definedName);\n                                                if (count($range) == 2) {\n                                                    $range[0] = str_replace(\"''\", \"'\", $range[0]);\n                                                    $range[0] = str_replace(\"'\", \"\", $range[0]);\n                                                    if ($worksheet = $docSheet->getParent()->getSheetByName($range[0])) {\n                                                        $extractedRange = str_replace('$', '', $range[1]);\n                                                        $scope = $docSheet->getParent()->getSheet($mapSheetId[(integer) $definedName['localSheetId']]);\n                                                        $excel->addNamedRange(new PHPExcel_NamedRange((string)$definedName['name'], $worksheet, $extractedRange, true, $scope));\n                                                    }\n                                                }\n                                            }\n                                            break;\n                                    }\n                                } elseif (!isset($definedName['localSheetId'])) {\n                                    // \"Global\" definedNames\n                                    $locatedSheet = null;\n                                    $extractedSheetName = '';\n                                    if (strpos((string)$definedName, '!') !== false) {\n                                        // Extract sheet name\n                                        $extractedSheetName = PHPExcel_Worksheet::extractSheetTitle((string)$definedName, true);\n                                        $extractedSheetName = $extractedSheetName[0];\n\n                                        // Locate sheet\n                                        $locatedSheet = $excel->getSheetByName($extractedSheetName);\n\n                                        // Modify range\n                                        $range = explode('!', $extractedRange);\n                                        $extractedRange = isset($range[1]) ? $range[1] : $range[0];\n                                    }\n\n                                    if ($locatedSheet !== null) {\n                                        $excel->addNamedRange(new PHPExcel_NamedRange((string)$definedName['name'], $locatedSheet, $extractedRange, false));\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    if ((!$this->readDataOnly) || (!empty($this->loadSheetsOnly))) {\n                        // active sheet index\n                        $activeTab = intval($xmlWorkbook->bookViews->workbookView[\"activeTab\"]); // refers to old sheet index\n\n                        // keep active sheet index if sheet is still loaded, else first sheet is set as the active\n                        if (isset($mapSheetId[$activeTab]) && $mapSheetId[$activeTab] !== null) {\n                            $excel->setActiveSheetIndex($mapSheetId[$activeTab]);\n                        } else {\n                            if ($excel->getSheetCount() == 0) {\n                                $excel->createSheet();\n                            }\n                            $excel->setActiveSheetIndex(0);\n                        }\n                    }\n                    break;\n            }\n        }\n\n        if (!$this->readDataOnly) {\n            $contentTypes = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, \"[Content_Types].xml\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n            foreach ($contentTypes->Override as $contentType) {\n                switch ($contentType[\"ContentType\"]) {\n                    case \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\":\n                        if ($this->includeCharts) {\n                            $chartEntryRef = ltrim($contentType['PartName'], '/');\n                            $chartElements = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $chartEntryRef)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                            $objChart = PHPExcel_Reader_Excel2007_Chart::readChart($chartElements, basename($chartEntryRef, '.xml'));\n\n//                            echo 'Chart ', $chartEntryRef, '<br />';\n//                            var_dump($charts[$chartEntryRef]);\n//\n                            if (isset($charts[$chartEntryRef])) {\n                                $chartPositionRef = $charts[$chartEntryRef]['sheet'].'!'.$charts[$chartEntryRef]['id'];\n//                                echo 'Position Ref ', $chartPositionRef, '<br />';\n                                if (isset($chartDetails[$chartPositionRef])) {\n//                                    var_dump($chartDetails[$chartPositionRef]);\n\n                                    $excel->getSheetByName($charts[$chartEntryRef]['sheet'])->addChart($objChart);\n                                    $objChart->setWorksheet($excel->getSheetByName($charts[$chartEntryRef]['sheet']));\n                                    $objChart->setTopLeftPosition($chartDetails[$chartPositionRef]['fromCoordinate'], $chartDetails[$chartPositionRef]['fromOffsetX'], $chartDetails[$chartPositionRef]['fromOffsetY']);\n                                    $objChart->setBottomRightPosition($chartDetails[$chartPositionRef]['toCoordinate'], $chartDetails[$chartPositionRef]['toOffsetX'], $chartDetails[$chartPositionRef]['toOffsetY']);\n                                }\n                            }\n                        }\n                }\n            }\n        }\n\n        $zip->close();\n\n        return $excel;\n    }\n\n    private static function readColor($color, $background = false)\n    {\n        if (isset($color[\"rgb\"])) {\n            return (string)$color[\"rgb\"];\n        } elseif (isset($color[\"indexed\"])) {\n            return PHPExcel_Style_Color::indexedColor($color[\"indexed\"]-7, $background)->getARGB();\n        } elseif (isset($color[\"theme\"])) {\n            if (self::$theme !== null) {\n                $returnColour = self::$theme->getColourByIndex((int)$color[\"theme\"]);\n                if (isset($color[\"tint\"])) {\n                    $tintAdjust = (float) $color[\"tint\"];\n                    $returnColour = PHPExcel_Style_Color::changeBrightness($returnColour, $tintAdjust);\n                }\n                return 'FF'.$returnColour;\n            }\n        }\n\n        if ($background) {\n            return 'FFFFFFFF';\n        }\n        return 'FF000000';\n    }\n\n    private static function readStyle($docStyle, $style)\n    {\n        // format code\n//        if (isset($style->numFmt)) {\n//            if (isset($style->numFmt['formatCode'])) {\n//                $docStyle->getNumberFormat()->setFormatCode((string) $style->numFmt['formatCode']);\n//            } else {\n                $docStyle->getNumberFormat()->setFormatCode($style->numFmt);\n//            }\n//        }\n\n        // font\n        if (isset($style->font)) {\n            $docStyle->getFont()->setName((string) $style->font->name[\"val\"]);\n            $docStyle->getFont()->setSize((string) $style->font->sz[\"val\"]);\n            if (isset($style->font->b)) {\n                $docStyle->getFont()->setBold(!isset($style->font->b[\"val\"]) || self::boolean((string) $style->font->b[\"val\"]));\n            }\n            if (isset($style->font->i)) {\n                $docStyle->getFont()->setItalic(!isset($style->font->i[\"val\"]) || self::boolean((string) $style->font->i[\"val\"]));\n            }\n            if (isset($style->font->strike)) {\n                $docStyle->getFont()->setStrikethrough(!isset($style->font->strike[\"val\"]) || self::boolean((string) $style->font->strike[\"val\"]));\n            }\n            $docStyle->getFont()->getColor()->setARGB(self::readColor($style->font->color));\n\n            if (isset($style->font->u) && !isset($style->font->u[\"val\"])) {\n                $docStyle->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);\n            } elseif (isset($style->font->u) && isset($style->font->u[\"val\"])) {\n                $docStyle->getFont()->setUnderline((string)$style->font->u[\"val\"]);\n            }\n\n            if (isset($style->font->vertAlign) && isset($style->font->vertAlign[\"val\"])) {\n                $vertAlign = strtolower((string)$style->font->vertAlign[\"val\"]);\n                if ($vertAlign == 'superscript') {\n                    $docStyle->getFont()->setSuperScript(true);\n                }\n                if ($vertAlign == 'subscript') {\n                    $docStyle->getFont()->setSubScript(true);\n                }\n            }\n        }\n\n        // fill\n        if (isset($style->fill)) {\n            if ($style->fill->gradientFill) {\n                $gradientFill = $style->fill->gradientFill[0];\n                if (!empty($gradientFill[\"type\"])) {\n                    $docStyle->getFill()->setFillType((string) $gradientFill[\"type\"]);\n                }\n                $docStyle->getFill()->setRotation(floatval($gradientFill[\"degree\"]));\n                $gradientFill->registerXPathNamespace(\"sml\", \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\");\n                $docStyle->getFill()->getStartColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath(\"sml:stop[@position=0]\"))->color));\n                $docStyle->getFill()->getEndColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath(\"sml:stop[@position=1]\"))->color));\n            } elseif ($style->fill->patternFill) {\n                $patternType = (string)$style->fill->patternFill[\"patternType\"] != '' ? (string)$style->fill->patternFill[\"patternType\"] : 'solid';\n                $docStyle->getFill()->setFillType($patternType);\n                if ($style->fill->patternFill->fgColor) {\n                    $docStyle->getFill()->getStartColor()->setARGB(self::readColor($style->fill->patternFill->fgColor, true));\n                } else {\n                    $docStyle->getFill()->getStartColor()->setARGB('FF000000');\n                }\n                if ($style->fill->patternFill->bgColor) {\n                    $docStyle->getFill()->getEndColor()->setARGB(self::readColor($style->fill->patternFill->bgColor, true));\n                }\n            }\n        }\n\n        // border\n        if (isset($style->border)) {\n            $diagonalUp = self::boolean((string) $style->border[\"diagonalUp\"]);\n            $diagonalDown = self::boolean((string) $style->border[\"diagonalDown\"]);\n            if (!$diagonalUp && !$diagonalDown) {\n                $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_NONE);\n            } elseif ($diagonalUp && !$diagonalDown) {\n                $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_UP);\n            } elseif (!$diagonalUp && $diagonalDown) {\n                $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_DOWN);\n            } else {\n                $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_BOTH);\n            }\n            self::readBorder($docStyle->getBorders()->getLeft(), $style->border->left);\n            self::readBorder($docStyle->getBorders()->getRight(), $style->border->right);\n            self::readBorder($docStyle->getBorders()->getTop(), $style->border->top);\n            self::readBorder($docStyle->getBorders()->getBottom(), $style->border->bottom);\n            self::readBorder($docStyle->getBorders()->getDiagonal(), $style->border->diagonal);\n        }\n\n        // alignment\n        if (isset($style->alignment)) {\n            $docStyle->getAlignment()->setHorizontal((string) $style->alignment[\"horizontal\"]);\n            $docStyle->getAlignment()->setVertical((string) $style->alignment[\"vertical\"]);\n\n            $textRotation = 0;\n            if ((int)$style->alignment[\"textRotation\"] <= 90) {\n                $textRotation = (int)$style->alignment[\"textRotation\"];\n            } elseif ((int)$style->alignment[\"textRotation\"] > 90) {\n                $textRotation = 90 - (int)$style->alignment[\"textRotation\"];\n            }\n\n            $docStyle->getAlignment()->setTextRotation(intval($textRotation));\n            $docStyle->getAlignment()->setWrapText(self::boolean((string) $style->alignment[\"wrapText\"]));\n            $docStyle->getAlignment()->setShrinkToFit(self::boolean((string) $style->alignment[\"shrinkToFit\"]));\n            $docStyle->getAlignment()->setIndent(intval((string)$style->alignment[\"indent\"]) > 0 ? intval((string)$style->alignment[\"indent\"]) : 0);\n            $docStyle->getAlignment()->setReadorder(intval((string)$style->alignment[\"readingOrder\"]) > 0 ? intval((string)$style->alignment[\"readingOrder\"]) : 0);\n        }\n\n        // protection\n        if (isset($style->protection)) {\n            if (isset($style->protection['locked'])) {\n                if (self::boolean((string) $style->protection['locked'])) {\n                    $docStyle->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_PROTECTED);\n                } else {\n                    $docStyle->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);\n                }\n            }\n\n            if (isset($style->protection['hidden'])) {\n                if (self::boolean((string) $style->protection['hidden'])) {\n                    $docStyle->getProtection()->setHidden(PHPExcel_Style_Protection::PROTECTION_PROTECTED);\n                } else {\n                    $docStyle->getProtection()->setHidden(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);\n                }\n            }\n        }\n\n        // top-level style settings\n        if (isset($style->quotePrefix)) {\n            $docStyle->setQuotePrefix($style->quotePrefix);\n        }\n    }\n\n    private static function readBorder($docBorder, $eleBorder)\n    {\n        if (isset($eleBorder[\"style\"])) {\n            $docBorder->setBorderStyle((string) $eleBorder[\"style\"]);\n        }\n        if (isset($eleBorder->color)) {\n            $docBorder->getColor()->setARGB(self::readColor($eleBorder->color));\n        }\n    }\n\n    private function parseRichText($is = null)\n    {\n        $value = new PHPExcel_RichText();\n\n        if (isset($is->t)) {\n            $value->createText(PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $is->t));\n        } else {\n            if (is_object($is->r)) {\n                foreach ($is->r as $run) {\n                    if (!isset($run->rPr)) {\n                        $objText = $value->createText(PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $run->t));\n\n                    } else {\n                        $objText = $value->createTextRun(PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $run->t));\n\n                        if (isset($run->rPr->rFont[\"val\"])) {\n                            $objText->getFont()->setName((string) $run->rPr->rFont[\"val\"]);\n                        }\n                        if (isset($run->rPr->sz[\"val\"])) {\n                            $objText->getFont()->setSize((string) $run->rPr->sz[\"val\"]);\n                        }\n                        if (isset($run->rPr->color)) {\n                            $objText->getFont()->setColor(new PHPExcel_Style_Color(self::readColor($run->rPr->color)));\n                        }\n                        if ((isset($run->rPr->b[\"val\"]) && self::boolean((string) $run->rPr->b[\"val\"])) ||\n                            (isset($run->rPr->b) && !isset($run->rPr->b[\"val\"]))) {\n                            $objText->getFont()->setBold(true);\n                        }\n                        if ((isset($run->rPr->i[\"val\"]) && self::boolean((string) $run->rPr->i[\"val\"])) ||\n                            (isset($run->rPr->i) && !isset($run->rPr->i[\"val\"]))) {\n                            $objText->getFont()->setItalic(true);\n                        }\n                        if (isset($run->rPr->vertAlign) && isset($run->rPr->vertAlign[\"val\"])) {\n                            $vertAlign = strtolower((string)$run->rPr->vertAlign[\"val\"]);\n                            if ($vertAlign == 'superscript') {\n                                $objText->getFont()->setSuperScript(true);\n                            }\n                            if ($vertAlign == 'subscript') {\n                                $objText->getFont()->setSubScript(true);\n                            }\n                        }\n                        if (isset($run->rPr->u) && !isset($run->rPr->u[\"val\"])) {\n                            $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);\n                        } elseif (isset($run->rPr->u) && isset($run->rPr->u[\"val\"])) {\n                            $objText->getFont()->setUnderline((string)$run->rPr->u[\"val\"]);\n                        }\n                        if ((isset($run->rPr->strike[\"val\"]) && self::boolean((string) $run->rPr->strike[\"val\"])) ||\n                            (isset($run->rPr->strike) && !isset($run->rPr->strike[\"val\"]))) {\n                            $objText->getFont()->setStrikethrough(true);\n                        }\n                    }\n                }\n            }\n        }\n\n        return $value;\n    }\n\n    private function readRibbon($excel, $customUITarget, $zip)\n    {\n        $baseDir = dirname($customUITarget);\n        $nameCustomUI = basename($customUITarget);\n        // get the xml file (ribbon)\n        $localRibbon = $this->getFromZipArchive($zip, $customUITarget);\n        $customUIImagesNames = array();\n        $customUIImagesBinaries = array();\n        // something like customUI/_rels/customUI.xml.rels\n        $pathRels = $baseDir . '/_rels/' . $nameCustomUI . '.rels';\n        $dataRels = $this->getFromZipArchive($zip, $pathRels);\n        if ($dataRels) {\n            // exists and not empty if the ribbon have some pictures (other than internal MSO)\n            $UIRels = simplexml_load_string($this->securityScan($dataRels), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n            if ($UIRels) {\n                // we need to save id and target to avoid parsing customUI.xml and \"guess\" if it's a pseudo callback who load the image\n                foreach ($UIRels->Relationship as $ele) {\n                    if ($ele[\"Type\"] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') {\n                        // an image ?\n                        $customUIImagesNames[(string) $ele['Id']] = (string)$ele['Target'];\n                        $customUIImagesBinaries[(string)$ele['Target']] = $this->getFromZipArchive($zip, $baseDir . '/' . (string) $ele['Target']);\n                    }\n                }\n            }\n        }\n        if ($localRibbon) {\n            $excel->setRibbonXMLData($customUITarget, $localRibbon);\n            if (count($customUIImagesNames) > 0 && count($customUIImagesBinaries) > 0) {\n                $excel->setRibbonBinObjects($customUIImagesNames, $customUIImagesBinaries);\n            } else {\n                $excel->setRibbonBinObjects(null);\n            }\n        } else {\n            $excel->setRibbonXMLData(null);\n            $excel->setRibbonBinObjects(null);\n        }\n    }\n\n    private static function getArrayItem($array, $key = 0)\n    {\n        return (isset($array[$key]) ? $array[$key] : null);\n    }\n\n    private static function dirAdd($base, $add)\n    {\n        return preg_replace('~[^/]+/\\.\\./~', '', dirname($base) . \"/$add\");\n    }\n\n    private static function toCSSArray($style)\n    {\n        $style = str_replace(array(\"\\r\",\"\\n\"), \"\", $style);\n\n        $temp = explode(';', $style);\n        $style = array();\n        foreach ($temp as $item) {\n            $item = explode(':', $item);\n\n            if (strpos($item[1], 'px') !== false) {\n                $item[1] = str_replace('px', '', $item[1]);\n            }\n            if (strpos($item[1], 'pt') !== false) {\n                $item[1] = str_replace('pt', '', $item[1]);\n                $item[1] = PHPExcel_Shared_Font::fontSizeToPixels($item[1]);\n            }\n            if (strpos($item[1], 'in') !== false) {\n                $item[1] = str_replace('in', '', $item[1]);\n                $item[1] = PHPExcel_Shared_Font::inchSizeToPixels($item[1]);\n            }\n            if (strpos($item[1], 'cm') !== false) {\n                $item[1] = str_replace('cm', '', $item[1]);\n                $item[1] = PHPExcel_Shared_Font::centimeterSizeToPixels($item[1]);\n            }\n\n            $style[$item[0]] = $item[1];\n        }\n\n        return $style;\n    }\n\n    private static function boolean($value = null)\n    {\n        if (is_object($value)) {\n            $value = (string) $value;\n        }\n        if (is_numeric($value)) {\n            return (bool) $value;\n        }\n        return ($value === 'true' || $value === 'TRUE');\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF5.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_Color_BIFF5\n{\n    protected static $map = array(\n        0x08 => '000000',\n        0x09 => 'FFFFFF',\n        0x0A => 'FF0000',\n        0x0B => '00FF00',\n        0x0C => '0000FF',\n        0x0D => 'FFFF00',\n        0x0E => 'FF00FF',\n        0x0F => '00FFFF',\n        0x10 => '800000',\n        0x11 => '008000',\n        0x12 => '000080',\n        0x13 => '808000',\n        0x14 => '800080',\n        0x15 => '008080',\n        0x16 => 'C0C0C0',\n        0x17 => '808080',\n        0x18 => '8080FF',\n        0x19 => '802060',\n        0x1A => 'FFFFC0',\n        0x1B => 'A0E0F0',\n        0x1C => '600080',\n        0x1D => 'FF8080',\n        0x1E => '0080C0',\n        0x1F => 'C0C0FF',\n        0x20 => '000080',\n        0x21 => 'FF00FF',\n        0x22 => 'FFFF00',\n        0x23 => '00FFFF',\n        0x24 => '800080',\n        0x25 => '800000',\n        0x26 => '008080',\n        0x27 => '0000FF',\n        0x28 => '00CFFF',\n        0x29 => '69FFFF',\n        0x2A => 'E0FFE0',\n        0x2B => 'FFFF80',\n        0x2C => 'A6CAF0',\n        0x2D => 'DD9CB3',\n        0x2E => 'B38FEE',\n        0x2F => 'E3E3E3',\n        0x30 => '2A6FF9',\n        0x31 => '3FB8CD',\n        0x32 => '488436',\n        0x33 => '958C41',\n        0x34 => '8E5E42',\n        0x35 => 'A0627A',\n        0x36 => '624FAC',\n        0x37 => '969696',\n        0x38 => '1D2FBE',\n        0x39 => '286676',\n        0x3A => '004500',\n        0x3B => '453E01',\n        0x3C => '6A2813',\n        0x3D => '85396A',\n        0x3E => '4A3285',\n        0x3F => '424242',\n    );\n\n    /**\n     * Map color array from BIFF5 built-in color index\n     *\n     * @param int $color\n     * @return array\n     */\n    public static function lookup($color)\n    {\n        if (isset(self::$map[$color])) {\n            return array('rgb' => self::$map[$color]);\n        }\n        return array('rgb' => '000000');\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF8.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_Color_BIFF8\n{\n    protected static $map = array(\n        0x08 => '000000',\n        0x09 => 'FFFFFF',\n        0x0A => 'FF0000',\n        0x0B => '00FF00',\n        0x0C => '0000FF',\n        0x0D => 'FFFF00',\n        0x0E => 'FF00FF',\n        0x0F => '00FFFF',\n        0x10 => '800000',\n        0x11 => '008000',\n        0x12 => '000080',\n        0x13 => '808000',\n        0x14 => '800080',\n        0x15 => '008080',\n        0x16 => 'C0C0C0',\n        0x17 => '808080',\n        0x18 => '9999FF',\n        0x19 => '993366',\n        0x1A => 'FFFFCC',\n        0x1B => 'CCFFFF',\n        0x1C => '660066',\n        0x1D => 'FF8080',\n        0x1E => '0066CC',\n        0x1F => 'CCCCFF',\n        0x20 => '000080',\n        0x21 => 'FF00FF',\n        0x22 => 'FFFF00',\n        0x23 => '00FFFF',\n        0x24 => '800080',\n        0x25 => '800000',\n        0x26 => '008080',\n        0x27 => '0000FF',\n        0x28 => '00CCFF',\n        0x29 => 'CCFFFF',\n        0x2A => 'CCFFCC',\n        0x2B => 'FFFF99',\n        0x2C => '99CCFF',\n        0x2D => 'FF99CC',\n        0x2E => 'CC99FF',\n        0x2F => 'FFCC99',\n        0x30 => '3366FF',\n        0x31 => '33CCCC',\n        0x32 => '99CC00',\n        0x33 => 'FFCC00',\n        0x34 => 'FF9900',\n        0x35 => 'FF6600',\n        0x36 => '666699',\n        0x37 => '969696',\n        0x38 => '003366',\n        0x39 => '339966',\n        0x3A => '003300',\n        0x3B => '333300',\n        0x3C => '993300',\n        0x3D => '993366',\n        0x3E => '333399',\n        0x3F => '333333',\n    );\n\n   /**\n     * Map color array from BIFF8 built-in color index\n     *\n     * @param int $color\n     * @return array\n     */\n    public static function lookup($color)\n    {\n        if (isset(self::$map[$color])) {\n            return array('rgb' => self::$map[$color]);\n        }\n        return array('rgb' => '000000');\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Color/BuiltIn.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_Color_BuiltIn\n{\n    protected static $map = array(\n        0x00 => '000000',\n        0x01 => 'FFFFFF',\n        0x02 => 'FF0000',\n        0x03 => '00FF00',\n        0x04 => '0000FF',\n        0x05 => 'FFFF00',\n        0x06 => 'FF00FF',\n        0x07 => '00FFFF',\n        0x40 => '000000', // system window text color\n        0x41 => 'FFFFFF', // system window background color\n    );\n\n    /**\n     * Map built-in color to RGB value\n     *\n     * @param int $color Indexed color\n     * @return array\n     */\n    public static function lookup($color)\n    {\n        if (isset(self::$map[$color])) {\n            return array('rgb' => self::$map[$color]);\n        }\n        return array('rgb' => '000000');\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Color.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_Color\n{\n    /**\n     * Read color\n     *\n     * @param int $color Indexed color\n     * @param array $palette Color palette\n     * @return array RGB color value, example: array('rgb' => 'FF0000')\n     */\n    public static function map($color, $palette, $version)\n    {\n        if ($color <= 0x07 || $color >= 0x40) {\n            // special built-in color\n            return PHPExcel_Reader_Excel5_Color_BuiltIn::lookup($color);\n        } elseif (isset($palette) && isset($palette[$color - 8])) {\n            // palette color, color index 0x08 maps to pallete index 0\n            return $palette[$color - 8];\n        } else {\n            // default color table\n            if ($version == PHPExcel_Reader_Excel5::XLS_BIFF8) {\n                return PHPExcel_Reader_Excel5_Color_BIFF8::lookup($color);\n            } else {\n                // BIFF5\n                return PHPExcel_Reader_Excel5_Color_BIFF5::lookup($color);\n            }\n        }\n\n        return $color;\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/ErrorCode.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_ErrorCode\n{\n    protected static $map = array(\n        0x00 => '#NULL!',\n        0x07 => '#DIV/0!',\n        0x0F => '#VALUE!',\n        0x17 => '#REF!',\n        0x1D => '#NAME?',\n        0x24 => '#NUM!',\n        0x2A => '#N/A',\n    );\n\n    /**\n     * Map error code, e.g. '#N/A'\n     *\n     * @param int $code\n     * @return string\n     */\n    public static function lookup($code)\n    {\n        if (isset(self::$map[$code])) {\n            return self::$map[$code];\n        }\n        return false;\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_Excel5_Escher\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Excel5_Escher\n{\n    const DGGCONTAINER      = 0xF000;\n    const BSTORECONTAINER   = 0xF001;\n    const DGCONTAINER       = 0xF002;\n    const SPGRCONTAINER     = 0xF003;\n    const SPCONTAINER       = 0xF004;\n    const DGG               = 0xF006;\n    const BSE               = 0xF007;\n    const DG                = 0xF008;\n    const SPGR              = 0xF009;\n    const SP                = 0xF00A;\n    const OPT               = 0xF00B;\n    const CLIENTTEXTBOX     = 0xF00D;\n    const CLIENTANCHOR      = 0xF010;\n    const CLIENTDATA        = 0xF011;\n    const BLIPJPEG          = 0xF01D;\n    const BLIPPNG           = 0xF01E;\n    const SPLITMENUCOLORS   = 0xF11E;\n    const TERTIARYOPT       = 0xF122;\n\n    /**\n     * Escher stream data (binary)\n     *\n     * @var string\n     */\n    private $data;\n\n    /**\n     * Size in bytes of the Escher stream data\n     *\n     * @var int\n     */\n    private $dataSize;\n\n    /**\n     * Current position of stream pointer in Escher stream data\n     *\n     * @var int\n     */\n    private $pos;\n\n    /**\n     * The object to be returned by the reader. Modified during load.\n     *\n     * @var mixed\n     */\n    private $object;\n\n    /**\n     * Create a new PHPExcel_Reader_Excel5_Escher instance\n     *\n     * @param mixed $object\n     */\n    public function __construct($object)\n    {\n        $this->object = $object;\n    }\n\n    /**\n     * Load Escher stream data. May be a partial Escher stream.\n     *\n     * @param string $data\n     */\n    public function load($data)\n    {\n        $this->data = $data;\n\n        // total byte size of Excel data (workbook global substream + sheet substreams)\n        $this->dataSize = strlen($this->data);\n\n        $this->pos = 0;\n\n        // Parse Escher stream\n        while ($this->pos < $this->dataSize) {\n            // offset: 2; size: 2: Record Type\n            $fbt = PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos + 2);\n\n            switch ($fbt) {\n                case self::DGGCONTAINER:\n                    $this->readDggContainer();\n                    break;\n                case self::DGG:\n                    $this->readDgg();\n                    break;\n                case self::BSTORECONTAINER:\n                    $this->readBstoreContainer();\n                    break;\n                case self::BSE:\n                    $this->readBSE();\n                    break;\n                case self::BLIPJPEG:\n                    $this->readBlipJPEG();\n                    break;\n                case self::BLIPPNG:\n                    $this->readBlipPNG();\n                    break;\n                case self::OPT:\n                    $this->readOPT();\n                    break;\n                case self::TERTIARYOPT:\n                    $this->readTertiaryOPT();\n                    break;\n                case self::SPLITMENUCOLORS:\n                    $this->readSplitMenuColors();\n                    break;\n                case self::DGCONTAINER:\n                    $this->readDgContainer();\n                    break;\n                case self::DG:\n                    $this->readDg();\n                    break;\n                case self::SPGRCONTAINER:\n                    $this->readSpgrContainer();\n                    break;\n                case self::SPCONTAINER:\n                    $this->readSpContainer();\n                    break;\n                case self::SPGR:\n                    $this->readSpgr();\n                    break;\n                case self::SP:\n                    $this->readSp();\n                    break;\n                case self::CLIENTTEXTBOX:\n                    $this->readClientTextbox();\n                    break;\n                case self::CLIENTANCHOR:\n                    $this->readClientAnchor();\n                    break;\n                case self::CLIENTDATA:\n                    $this->readClientData();\n                    break;\n                default:\n                    $this->readDefault();\n                    break;\n            }\n        }\n\n        return $this->object;\n    }\n\n    /**\n     * Read a generic record\n     */\n    private function readDefault()\n    {\n        // offset 0; size: 2; recVer and recInstance\n        $verInstance = PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos);\n\n        // offset: 2; size: 2: Record Type\n        $fbt = PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos + 2);\n\n        // bit: 0-3; mask: 0x000F; recVer\n        $recVer = (0x000F & $verInstance) >> 0;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read DggContainer record (Drawing Group Container)\n     */\n    private function readDggContainer()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // record is a container, read contents\n        $dggContainer = new PHPExcel_Shared_Escher_DggContainer();\n        $this->object->setDggContainer($dggContainer);\n        $reader = new PHPExcel_Reader_Excel5_Escher($dggContainer);\n        $reader->load($recordData);\n    }\n\n    /**\n     * Read Dgg record (Drawing Group)\n     */\n    private function readDgg()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read BstoreContainer record (Blip Store Container)\n     */\n    private function readBstoreContainer()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // record is a container, read contents\n        $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();\n        $this->object->setBstoreContainer($bstoreContainer);\n        $reader = new PHPExcel_Reader_Excel5_Escher($bstoreContainer);\n        $reader->load($recordData);\n    }\n\n    /**\n     * Read BSE record\n     */\n    private function readBSE()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // add BSE to BstoreContainer\n        $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();\n        $this->object->addBSE($BSE);\n\n        $BSE->setBLIPType($recInstance);\n\n        // offset: 0; size: 1; btWin32 (MSOBLIPTYPE)\n        $btWin32 = ord($recordData[0]);\n\n        // offset: 1; size: 1; btWin32 (MSOBLIPTYPE)\n        $btMacOS = ord($recordData[1]);\n\n        // offset: 2; size: 16; MD4 digest\n        $rgbUid = substr($recordData, 2, 16);\n\n        // offset: 18; size: 2; tag\n        $tag = PHPExcel_Reader_Excel5::getInt2d($recordData, 18);\n\n        // offset: 20; size: 4; size of BLIP in bytes\n        $size = PHPExcel_Reader_Excel5::getInt4d($recordData, 20);\n\n        // offset: 24; size: 4; number of references to this BLIP\n        $cRef = PHPExcel_Reader_Excel5::getInt4d($recordData, 24);\n\n        // offset: 28; size: 4; MSOFO file offset\n        $foDelay = PHPExcel_Reader_Excel5::getInt4d($recordData, 28);\n\n        // offset: 32; size: 1; unused1\n        $unused1 = ord($recordData{32});\n\n        // offset: 33; size: 1; size of nameData in bytes (including null terminator)\n        $cbName = ord($recordData{33});\n\n        // offset: 34; size: 1; unused2\n        $unused2 = ord($recordData{34});\n\n        // offset: 35; size: 1; unused3\n        $unused3 = ord($recordData{35});\n\n        // offset: 36; size: $cbName; nameData\n        $nameData = substr($recordData, 36, $cbName);\n\n        // offset: 36 + $cbName, size: var; the BLIP data\n        $blipData = substr($recordData, 36 + $cbName);\n\n        // record is a container, read contents\n        $reader = new PHPExcel_Reader_Excel5_Escher($BSE);\n        $reader->load($blipData);\n    }\n\n    /**\n     * Read BlipJPEG record. Holds raw JPEG image data\n     */\n    private function readBlipJPEG()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        $pos = 0;\n\n        // offset: 0; size: 16; rgbUid1 (MD4 digest of)\n        $rgbUid1 = substr($recordData, 0, 16);\n        $pos += 16;\n\n        // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3\n        if (in_array($recInstance, array(0x046B, 0x06E3))) {\n            $rgbUid2 = substr($recordData, 16, 16);\n            $pos += 16;\n        }\n\n        // offset: var; size: 1; tag\n        $tag = ord($recordData{$pos});\n        $pos += 1;\n\n        // offset: var; size: var; the raw image data\n        $data = substr($recordData, $pos);\n\n        $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();\n        $blip->setData($data);\n\n        $this->object->setBlip($blip);\n    }\n\n    /**\n     * Read BlipPNG record. Holds raw PNG image data\n     */\n    private function readBlipPNG()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        $pos = 0;\n\n        // offset: 0; size: 16; rgbUid1 (MD4 digest of)\n        $rgbUid1 = substr($recordData, 0, 16);\n        $pos += 16;\n\n        // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3\n        if ($recInstance == 0x06E1) {\n            $rgbUid2 = substr($recordData, 16, 16);\n            $pos += 16;\n        }\n\n        // offset: var; size: 1; tag\n        $tag = ord($recordData{$pos});\n        $pos += 1;\n\n        // offset: var; size: var; the raw image data\n        $data = substr($recordData, $pos);\n\n        $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();\n        $blip->setData($data);\n\n        $this->object->setBlip($blip);\n    }\n\n    /**\n     * Read OPT record. This record may occur within DggContainer record or SpContainer\n     */\n    private function readOPT()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        $this->readOfficeArtRGFOPTE($recordData, $recInstance);\n    }\n\n    /**\n     * Read TertiaryOPT record\n     */\n    private function readTertiaryOPT()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read SplitMenuColors record\n     */\n    private function readSplitMenuColors()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read DgContainer record (Drawing Container)\n     */\n    private function readDgContainer()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // record is a container, read contents\n        $dgContainer = new PHPExcel_Shared_Escher_DgContainer();\n        $this->object->setDgContainer($dgContainer);\n        $reader = new PHPExcel_Reader_Excel5_Escher($dgContainer);\n        $escher = $reader->load($recordData);\n    }\n\n    /**\n     * Read Dg record (Drawing)\n     */\n    private function readDg()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read SpgrContainer record (Shape Group Container)\n     */\n    private function readSpgrContainer()\n    {\n        // context is either context DgContainer or SpgrContainer\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // record is a container, read contents\n        $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();\n\n        if ($this->object instanceof PHPExcel_Shared_Escher_DgContainer) {\n            // DgContainer\n            $this->object->setSpgrContainer($spgrContainer);\n        } else {\n            // SpgrContainer\n            $this->object->addChild($spgrContainer);\n        }\n\n        $reader = new PHPExcel_Reader_Excel5_Escher($spgrContainer);\n        $escher = $reader->load($recordData);\n    }\n\n    /**\n     * Read SpContainer record (Shape Container)\n     */\n    private function readSpContainer()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // add spContainer to spgrContainer\n        $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();\n        $this->object->addChild($spContainer);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // record is a container, read contents\n        $reader = new PHPExcel_Reader_Excel5_Escher($spContainer);\n        $escher = $reader->load($recordData);\n    }\n\n    /**\n     * Read Spgr record (Shape Group)\n     */\n    private function readSpgr()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read Sp record (Shape)\n     */\n    private function readSp()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read ClientTextbox record\n     */\n    private function readClientTextbox()\n    {\n        // offset: 0; size: 2; recVer and recInstance\n\n        // bit: 4-15; mask: 0xFFF0; recInstance\n        $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4;\n\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read ClientAnchor record. This record holds information about where the shape is anchored in worksheet\n     */\n    private function readClientAnchor()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n\n        // offset: 2; size: 2; upper-left corner column index (0-based)\n        $c1 = PHPExcel_Reader_Excel5::getInt2d($recordData, 2);\n\n        // offset: 4; size: 2; upper-left corner horizontal offset in 1/1024 of column width\n        $startOffsetX = PHPExcel_Reader_Excel5::getInt2d($recordData, 4);\n\n        // offset: 6; size: 2; upper-left corner row index (0-based)\n        $r1 = PHPExcel_Reader_Excel5::getInt2d($recordData, 6);\n\n        // offset: 8; size: 2; upper-left corner vertical offset in 1/256 of row height\n        $startOffsetY = PHPExcel_Reader_Excel5::getInt2d($recordData, 8);\n\n        // offset: 10; size: 2; bottom-right corner column index (0-based)\n        $c2 = PHPExcel_Reader_Excel5::getInt2d($recordData, 10);\n\n        // offset: 12; size: 2; bottom-right corner horizontal offset in 1/1024 of column width\n        $endOffsetX = PHPExcel_Reader_Excel5::getInt2d($recordData, 12);\n\n        // offset: 14; size: 2; bottom-right corner row index (0-based)\n        $r2 = PHPExcel_Reader_Excel5::getInt2d($recordData, 14);\n\n        // offset: 16; size: 2; bottom-right corner vertical offset in 1/256 of row height\n        $endOffsetY = PHPExcel_Reader_Excel5::getInt2d($recordData, 16);\n\n        // set the start coordinates\n        $this->object->setStartCoordinates(PHPExcel_Cell::stringFromColumnIndex($c1) . ($r1 + 1));\n\n        // set the start offsetX\n        $this->object->setStartOffsetX($startOffsetX);\n\n        // set the start offsetY\n        $this->object->setStartOffsetY($startOffsetY);\n\n        // set the end coordinates\n        $this->object->setEndCoordinates(PHPExcel_Cell::stringFromColumnIndex($c2) . ($r2 + 1));\n\n        // set the end offsetX\n        $this->object->setEndOffsetX($endOffsetX);\n\n        // set the end offsetY\n        $this->object->setEndOffsetY($endOffsetY);\n    }\n\n    /**\n     * Read ClientData record\n     */\n    private function readClientData()\n    {\n        $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4);\n        $recordData = substr($this->data, $this->pos + 8, $length);\n\n        // move stream pointer to next record\n        $this->pos += 8 + $length;\n    }\n\n    /**\n     * Read OfficeArtRGFOPTE table of property-value pairs\n     *\n     * @param string $data Binary data\n     * @param int $n Number of properties\n     */\n    private function readOfficeArtRGFOPTE($data, $n)\n    {\n        $splicedComplexData = substr($data, 6 * $n);\n\n        // loop through property-value pairs\n        for ($i = 0; $i < $n; ++$i) {\n            // read 6 bytes at a time\n            $fopte = substr($data, 6 * $i, 6);\n\n            // offset: 0; size: 2; opid\n            $opid = PHPExcel_Reader_Excel5::getInt2d($fopte, 0);\n\n            // bit: 0-13; mask: 0x3FFF; opid.opid\n            $opidOpid = (0x3FFF & $opid) >> 0;\n\n            // bit: 14; mask 0x4000; 1 = value in op field is BLIP identifier\n            $opidFBid = (0x4000 & $opid) >> 14;\n\n            // bit: 15; mask 0x8000; 1 = this is a complex property, op field specifies size of complex data\n            $opidFComplex = (0x8000 & $opid) >> 15;\n\n            // offset: 2; size: 4; the value for this property\n            $op = PHPExcel_Reader_Excel5::getInt4d($fopte, 2);\n\n            if ($opidFComplex) {\n                $complexData = substr($splicedComplexData, 0, $op);\n                $splicedComplexData = substr($splicedComplexData, $op);\n\n                // we store string value with complex data\n                $value = $complexData;\n            } else {\n                // we store integer value\n                $value = $op;\n            }\n\n            $this->object->setOPT($opidOpid, $value);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/MD5.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_Excel5_MD5\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt        LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Excel5_MD5\n{\n    // Context\n    private $a;\n    private $b;\n    private $c;\n    private $d;\n\n    /**\n     * MD5 stream constructor\n     */\n    public function __construct()\n    {\n        $this->reset();\n    }\n\n    /**\n     * Reset the MD5 stream context\n     */\n    public function reset()\n    {\n        $this->a = 0x67452301;\n        $this->b = 0xEFCDAB89;\n        $this->c = 0x98BADCFE;\n        $this->d = 0x10325476;\n    }\n\n    /**\n     * Get MD5 stream context\n     *\n     * @return string\n     */\n    public function getContext()\n    {\n        $s = '';\n        foreach (array('a', 'b', 'c', 'd') as $i) {\n            $v = $this->{$i};\n            $s .= chr($v & 0xff);\n            $s .= chr(($v >> 8) & 0xff);\n            $s .= chr(($v >> 16) & 0xff);\n            $s .= chr(($v >> 24) & 0xff);\n        }\n\n        return $s;\n    }\n\n    /**\n     * Add data to context\n     *\n     * @param string $data Data to add\n     */\n    public function add($data)\n    {\n        $words = array_values(unpack('V16', $data));\n\n        $A = $this->a;\n        $B = $this->b;\n        $C = $this->c;\n        $D = $this->d;\n\n        $F = array('PHPExcel_Reader_Excel5_MD5','f');\n        $G = array('PHPExcel_Reader_Excel5_MD5','g');\n        $H = array('PHPExcel_Reader_Excel5_MD5','h');\n        $I = array('PHPExcel_Reader_Excel5_MD5','i');\n\n        /* ROUND 1 */\n        self::step($F, $A, $B, $C, $D, $words[0], 7, 0xd76aa478);\n        self::step($F, $D, $A, $B, $C, $words[1], 12, 0xe8c7b756);\n        self::step($F, $C, $D, $A, $B, $words[2], 17, 0x242070db);\n        self::step($F, $B, $C, $D, $A, $words[3], 22, 0xc1bdceee);\n        self::step($F, $A, $B, $C, $D, $words[4], 7, 0xf57c0faf);\n        self::step($F, $D, $A, $B, $C, $words[5], 12, 0x4787c62a);\n        self::step($F, $C, $D, $A, $B, $words[6], 17, 0xa8304613);\n        self::step($F, $B, $C, $D, $A, $words[7], 22, 0xfd469501);\n        self::step($F, $A, $B, $C, $D, $words[8], 7, 0x698098d8);\n        self::step($F, $D, $A, $B, $C, $words[9], 12, 0x8b44f7af);\n        self::step($F, $C, $D, $A, $B, $words[10], 17, 0xffff5bb1);\n        self::step($F, $B, $C, $D, $A, $words[11], 22, 0x895cd7be);\n        self::step($F, $A, $B, $C, $D, $words[12], 7, 0x6b901122);\n        self::step($F, $D, $A, $B, $C, $words[13], 12, 0xfd987193);\n        self::step($F, $C, $D, $A, $B, $words[14], 17, 0xa679438e);\n        self::step($F, $B, $C, $D, $A, $words[15], 22, 0x49b40821);\n\n        /* ROUND 2 */\n        self::step($G, $A, $B, $C, $D, $words[1], 5, 0xf61e2562);\n        self::step($G, $D, $A, $B, $C, $words[6], 9, 0xc040b340);\n        self::step($G, $C, $D, $A, $B, $words[11], 14, 0x265e5a51);\n        self::step($G, $B, $C, $D, $A, $words[0], 20, 0xe9b6c7aa);\n        self::step($G, $A, $B, $C, $D, $words[5], 5, 0xd62f105d);\n        self::step($G, $D, $A, $B, $C, $words[10], 9, 0x02441453);\n        self::step($G, $C, $D, $A, $B, $words[15], 14, 0xd8a1e681);\n        self::step($G, $B, $C, $D, $A, $words[4], 20, 0xe7d3fbc8);\n        self::step($G, $A, $B, $C, $D, $words[9], 5, 0x21e1cde6);\n        self::step($G, $D, $A, $B, $C, $words[14], 9, 0xc33707d6);\n        self::step($G, $C, $D, $A, $B, $words[3], 14, 0xf4d50d87);\n        self::step($G, $B, $C, $D, $A, $words[8], 20, 0x455a14ed);\n        self::step($G, $A, $B, $C, $D, $words[13], 5, 0xa9e3e905);\n        self::step($G, $D, $A, $B, $C, $words[2], 9, 0xfcefa3f8);\n        self::step($G, $C, $D, $A, $B, $words[7], 14, 0x676f02d9);\n        self::step($G, $B, $C, $D, $A, $words[12], 20, 0x8d2a4c8a);\n\n        /* ROUND 3 */\n        self::step($H, $A, $B, $C, $D, $words[5], 4, 0xfffa3942);\n        self::step($H, $D, $A, $B, $C, $words[8], 11, 0x8771f681);\n        self::step($H, $C, $D, $A, $B, $words[11], 16, 0x6d9d6122);\n        self::step($H, $B, $C, $D, $A, $words[14], 23, 0xfde5380c);\n        self::step($H, $A, $B, $C, $D, $words[1], 4, 0xa4beea44);\n        self::step($H, $D, $A, $B, $C, $words[4], 11, 0x4bdecfa9);\n        self::step($H, $C, $D, $A, $B, $words[7], 16, 0xf6bb4b60);\n        self::step($H, $B, $C, $D, $A, $words[10], 23, 0xbebfbc70);\n        self::step($H, $A, $B, $C, $D, $words[13], 4, 0x289b7ec6);\n        self::step($H, $D, $A, $B, $C, $words[0], 11, 0xeaa127fa);\n        self::step($H, $C, $D, $A, $B, $words[3], 16, 0xd4ef3085);\n        self::step($H, $B, $C, $D, $A, $words[6], 23, 0x04881d05);\n        self::step($H, $A, $B, $C, $D, $words[9], 4, 0xd9d4d039);\n        self::step($H, $D, $A, $B, $C, $words[12], 11, 0xe6db99e5);\n        self::step($H, $C, $D, $A, $B, $words[15], 16, 0x1fa27cf8);\n        self::step($H, $B, $C, $D, $A, $words[2], 23, 0xc4ac5665);\n\n        /* ROUND 4 */\n        self::step($I, $A, $B, $C, $D, $words[0], 6, 0xf4292244);\n        self::step($I, $D, $A, $B, $C, $words[7], 10, 0x432aff97);\n        self::step($I, $C, $D, $A, $B, $words[14], 15, 0xab9423a7);\n        self::step($I, $B, $C, $D, $A, $words[5], 21, 0xfc93a039);\n        self::step($I, $A, $B, $C, $D, $words[12], 6, 0x655b59c3);\n        self::step($I, $D, $A, $B, $C, $words[3], 10, 0x8f0ccc92);\n        self::step($I, $C, $D, $A, $B, $words[10], 15, 0xffeff47d);\n        self::step($I, $B, $C, $D, $A, $words[1], 21, 0x85845dd1);\n        self::step($I, $A, $B, $C, $D, $words[8], 6, 0x6fa87e4f);\n        self::step($I, $D, $A, $B, $C, $words[15], 10, 0xfe2ce6e0);\n        self::step($I, $C, $D, $A, $B, $words[6], 15, 0xa3014314);\n        self::step($I, $B, $C, $D, $A, $words[13], 21, 0x4e0811a1);\n        self::step($I, $A, $B, $C, $D, $words[4], 6, 0xf7537e82);\n        self::step($I, $D, $A, $B, $C, $words[11], 10, 0xbd3af235);\n        self::step($I, $C, $D, $A, $B, $words[2], 15, 0x2ad7d2bb);\n        self::step($I, $B, $C, $D, $A, $words[9], 21, 0xeb86d391);\n\n        $this->a = ($this->a + $A) & 0xffffffff;\n        $this->b = ($this->b + $B) & 0xffffffff;\n        $this->c = ($this->c + $C) & 0xffffffff;\n        $this->d = ($this->d + $D) & 0xffffffff;\n    }\n\n    private static function f($X, $Y, $Z)\n    {\n        return (($X & $Y) | ((~ $X) & $Z)); // X AND Y OR NOT X AND Z\n    }\n\n    private static function g($X, $Y, $Z)\n    {\n        return (($X & $Z) | ($Y & (~ $Z))); // X AND Z OR Y AND NOT Z\n    }\n\n    private static function h($X, $Y, $Z)\n    {\n        return ($X ^ $Y ^ $Z); // X XOR Y XOR Z\n    }\n\n    private static function i($X, $Y, $Z)\n    {\n        return ($Y ^ ($X | (~ $Z))) ; // Y XOR (X OR NOT Z)\n    }\n\n    private static function step($func, &$A, $B, $C, $D, $M, $s, $t)\n    {\n        $A = ($A + call_user_func($func, $B, $C, $D) + $M + $t) & 0xffffffff;\n        $A = self::rotate($A, $s);\n        $A = ($B + $A) & 0xffffffff;\n    }\n\n    private static function rotate($decimal, $bits)\n    {\n        $binary = str_pad(decbin($decimal), 32, \"0\", STR_PAD_LEFT);\n        return bindec(substr($binary, $bits).substr($binary, 0, $bits));\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/RC4.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_Excel5_RC4\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Excel5_RC4\n{\n    // Context\n    protected $s = array();\n    protected $i = 0;\n    protected $j = 0;\n\n    /**\n     * RC4 stream decryption/encryption constrcutor\n     *\n     * @param string $key Encryption key/passphrase\n     */\n    public function __construct($key)\n    {\n        $len = strlen($key);\n\n        for ($this->i = 0; $this->i < 256; $this->i++) {\n            $this->s[$this->i] = $this->i;\n        }\n\n        $this->j = 0;\n        for ($this->i = 0; $this->i < 256; $this->i++) {\n            $this->j = ($this->j + $this->s[$this->i] + ord($key[$this->i % $len])) % 256;\n            $t = $this->s[$this->i];\n            $this->s[$this->i] = $this->s[$this->j];\n            $this->s[$this->j] = $t;\n        }\n        $this->i = $this->j = 0;\n    }\n\n    /**\n     * Symmetric decryption/encryption function\n     *\n     * @param string $data Data to encrypt/decrypt\n     *\n     * @return string\n     */\n    public function RC4($data)\n    {\n        $len = strlen($data);\n        for ($c = 0; $c < $len; $c++) {\n            $this->i = ($this->i + 1) % 256;\n            $this->j = ($this->j + $this->s[$this->i]) % 256;\n            $t = $this->s[$this->i];\n            $this->s[$this->i] = $this->s[$this->j];\n            $this->s[$this->j] = $t;\n\n            $t = ($this->s[$this->i] + $this->s[$this->j]) % 256;\n\n            $data[$c] = chr(ord($data[$c]) ^ $this->s[$t]);\n        }\n        return $data;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Style/Border.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_Style_Border\n{\n    protected static $map = array(\n        0x00 => PHPExcel_Style_Border::BORDER_NONE,\n        0x01 => PHPExcel_Style_Border::BORDER_THIN,\n        0x02 => PHPExcel_Style_Border::BORDER_MEDIUM,\n        0x03 => PHPExcel_Style_Border::BORDER_DASHED,\n        0x04 => PHPExcel_Style_Border::BORDER_DOTTED,\n        0x05 => PHPExcel_Style_Border::BORDER_THICK,\n        0x06 => PHPExcel_Style_Border::BORDER_DOUBLE,\n        0x07 => PHPExcel_Style_Border::BORDER_HAIR,\n        0x08 => PHPExcel_Style_Border::BORDER_MEDIUMDASHED,\n        0x09 => PHPExcel_Style_Border::BORDER_DASHDOT,\n        0x0A => PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT,\n        0x0B => PHPExcel_Style_Border::BORDER_DASHDOTDOT,\n        0x0C => PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT,\n        0x0D => PHPExcel_Style_Border::BORDER_SLANTDASHDOT,\n    );\n\n    /**\n     * Map border style\n     * OpenOffice documentation: 2.5.11\n     *\n     * @param int $index\n     * @return string\n     */\n    public static function lookup($index)\n    {\n        if (isset(self::$map[$index])) {\n            return self::$map[$index];\n        }\n        return PHPExcel_Style_Border::BORDER_NONE;\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5/Style/FillPattern.php",
    "content": "<?php\n\nclass PHPExcel_Reader_Excel5_Style_FillPattern\n{\n    protected static $map = array(\n        0x00 => PHPExcel_Style_Fill::FILL_NONE,\n        0x01 => PHPExcel_Style_Fill::FILL_SOLID,\n        0x02 => PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY,\n        0x03 => PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY,\n        0x04 => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY,\n        0x05 => PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL,\n        0x06 => PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL,\n        0x07 => PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN,\n        0x08 => PHPExcel_Style_Fill::FILL_PATTERN_DARKUP,\n        0x09 => PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID,\n        0x0A => PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS,\n        0x0B => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL,\n        0x0C => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL,\n        0x0D => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN,\n        0x0E => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP,\n        0x0F => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID,\n        0x10 => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS,\n        0x11 => PHPExcel_Style_Fill::FILL_PATTERN_GRAY125,\n        0x12 => PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625,\n    );\n\n    /**\n     * Get fill pattern from index\n     * OpenOffice documentation: 2.5.12\n     *\n     * @param int $index\n     * @return string\n     */\n    public static function lookup($index)\n    {\n        if (isset(self::$map[$index])) {\n            return self::$map[$index];\n        }\n        return PHPExcel_Style_Fill::FILL_NONE;\n    }\n}"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Excel5.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_Excel5\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n// Original file header of ParseXL (used as the base for this class):\n// --------------------------------------------------------------------------------\n// Adapted from Excel_Spreadsheet_Reader developed by users bizon153,\n// trex005, and mmp11 (SourceForge.net)\n// http://sourceforge.net/projects/phpexcelreader/\n// Primary changes made by canyoncasa (dvc) for ParseXL 1.00 ...\n//     Modelled moreso after Perl Excel Parse/Write modules\n//     Added Parse_Excel_Spreadsheet object\n//         Reads a whole worksheet or tab as row,column array or as\n//         associated hash of indexed rows and named column fields\n//     Added variables for worksheet (tab) indexes and names\n//     Added an object call for loading individual woorksheets\n//     Changed default indexing defaults to 0 based arrays\n//     Fixed date/time and percent formats\n//     Includes patches found at SourceForge...\n//         unicode patch by nobody\n//         unpack(\"d\") machine depedency patch by matchy\n//         boundsheet utf16 patch by bjaenichen\n//     Renamed functions for shorter names\n//     General code cleanup and rigor, including <80 column width\n//     Included a testcase Excel file and PHP example calls\n//     Code works for PHP 5.x\n\n// Primary changes made by canyoncasa (dvc) for ParseXL 1.10 ...\n// http://sourceforge.net/tracker/index.php?func=detail&aid=1466964&group_id=99160&atid=623334\n//     Decoding of formula conditions, results, and tokens.\n//     Support for user-defined named cells added as an array \"namedcells\"\n//         Patch code for user-defined named cells supports single cells only.\n//         NOTE: this patch only works for BIFF8 as BIFF5-7 use a different\n//         external sheet reference structure\nclass PHPExcel_Reader_Excel5 extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    // ParseXL definitions\n    const XLS_BIFF8                     = 0x0600;\n    const XLS_BIFF7                     = 0x0500;\n    const XLS_WorkbookGlobals           = 0x0005;\n    const XLS_Worksheet                 = 0x0010;\n\n    // record identifiers\n    const XLS_TYPE_FORMULA              = 0x0006;\n    const XLS_TYPE_EOF                  = 0x000a;\n    const XLS_TYPE_PROTECT              = 0x0012;\n    const XLS_TYPE_OBJECTPROTECT        = 0x0063;\n    const XLS_TYPE_SCENPROTECT          = 0x00dd;\n    const XLS_TYPE_PASSWORD             = 0x0013;\n    const XLS_TYPE_HEADER               = 0x0014;\n    const XLS_TYPE_FOOTER               = 0x0015;\n    const XLS_TYPE_EXTERNSHEET          = 0x0017;\n    const XLS_TYPE_DEFINEDNAME          = 0x0018;\n    const XLS_TYPE_VERTICALPAGEBREAKS   = 0x001a;\n    const XLS_TYPE_HORIZONTALPAGEBREAKS = 0x001b;\n    const XLS_TYPE_NOTE                 = 0x001c;\n    const XLS_TYPE_SELECTION            = 0x001d;\n    const XLS_TYPE_DATEMODE             = 0x0022;\n    const XLS_TYPE_EXTERNNAME           = 0x0023;\n    const XLS_TYPE_LEFTMARGIN           = 0x0026;\n    const XLS_TYPE_RIGHTMARGIN          = 0x0027;\n    const XLS_TYPE_TOPMARGIN            = 0x0028;\n    const XLS_TYPE_BOTTOMMARGIN         = 0x0029;\n    const XLS_TYPE_PRINTGRIDLINES       = 0x002b;\n    const XLS_TYPE_FILEPASS             = 0x002f;\n    const XLS_TYPE_FONT                 = 0x0031;\n    const XLS_TYPE_CONTINUE             = 0x003c;\n    const XLS_TYPE_PANE                 = 0x0041;\n    const XLS_TYPE_CODEPAGE             = 0x0042;\n    const XLS_TYPE_DEFCOLWIDTH          = 0x0055;\n    const XLS_TYPE_OBJ                  = 0x005d;\n    const XLS_TYPE_COLINFO              = 0x007d;\n    const XLS_TYPE_IMDATA               = 0x007f;\n    const XLS_TYPE_SHEETPR              = 0x0081;\n    const XLS_TYPE_HCENTER              = 0x0083;\n    const XLS_TYPE_VCENTER              = 0x0084;\n    const XLS_TYPE_SHEET                = 0x0085;\n    const XLS_TYPE_PALETTE              = 0x0092;\n    const XLS_TYPE_SCL                  = 0x00a0;\n    const XLS_TYPE_PAGESETUP            = 0x00a1;\n    const XLS_TYPE_MULRK                = 0x00bd;\n    const XLS_TYPE_MULBLANK             = 0x00be;\n    const XLS_TYPE_DBCELL               = 0x00d7;\n    const XLS_TYPE_XF                   = 0x00e0;\n    const XLS_TYPE_MERGEDCELLS          = 0x00e5;\n    const XLS_TYPE_MSODRAWINGGROUP      = 0x00eb;\n    const XLS_TYPE_MSODRAWING           = 0x00ec;\n    const XLS_TYPE_SST                  = 0x00fc;\n    const XLS_TYPE_LABELSST             = 0x00fd;\n    const XLS_TYPE_EXTSST               = 0x00ff;\n    const XLS_TYPE_EXTERNALBOOK         = 0x01ae;\n    const XLS_TYPE_DATAVALIDATIONS      = 0x01b2;\n    const XLS_TYPE_TXO                  = 0x01b6;\n    const XLS_TYPE_HYPERLINK            = 0x01b8;\n    const XLS_TYPE_DATAVALIDATION       = 0x01be;\n    const XLS_TYPE_DIMENSION            = 0x0200;\n    const XLS_TYPE_BLANK                = 0x0201;\n    const XLS_TYPE_NUMBER               = 0x0203;\n    const XLS_TYPE_LABEL                = 0x0204;\n    const XLS_TYPE_BOOLERR              = 0x0205;\n    const XLS_TYPE_STRING               = 0x0207;\n    const XLS_TYPE_ROW                  = 0x0208;\n    const XLS_TYPE_INDEX                = 0x020b;\n    const XLS_TYPE_ARRAY                = 0x0221;\n    const XLS_TYPE_DEFAULTROWHEIGHT     = 0x0225;\n    const XLS_TYPE_WINDOW2              = 0x023e;\n    const XLS_TYPE_RK                   = 0x027e;\n    const XLS_TYPE_STYLE                = 0x0293;\n    const XLS_TYPE_FORMAT               = 0x041e;\n    const XLS_TYPE_SHAREDFMLA           = 0x04bc;\n    const XLS_TYPE_BOF                  = 0x0809;\n    const XLS_TYPE_SHEETPROTECTION      = 0x0867;\n    const XLS_TYPE_RANGEPROTECTION      = 0x0868;\n    const XLS_TYPE_SHEETLAYOUT          = 0x0862;\n    const XLS_TYPE_XFEXT                = 0x087d;\n    const XLS_TYPE_PAGELAYOUTVIEW       = 0x088b;\n    const XLS_TYPE_UNKNOWN              = 0xffff;\n\n    // Encryption type\n    const MS_BIFF_CRYPTO_NONE           = 0;\n    const MS_BIFF_CRYPTO_XOR            = 1;\n    const MS_BIFF_CRYPTO_RC4            = 2;\n    \n    // Size of stream blocks when using RC4 encryption\n    const REKEY_BLOCK                   = 0x400;\n\n    /**\n     * Summary Information stream data.\n     *\n     * @var string\n     */\n    private $summaryInformation;\n\n    /**\n     * Extended Summary Information stream data.\n     *\n     * @var string\n     */\n    private $documentSummaryInformation;\n\n    /**\n     * User-Defined Properties stream data.\n     *\n     * @var string\n     */\n    private $userDefinedProperties;\n\n    /**\n     * Workbook stream data. (Includes workbook globals substream as well as sheet substreams)\n     *\n     * @var string\n     */\n    private $data;\n\n    /**\n     * Size in bytes of $this->data\n     *\n     * @var int\n     */\n    private $dataSize;\n\n    /**\n     * Current position in stream\n     *\n     * @var integer\n     */\n    private $pos;\n\n    /**\n     * Workbook to be returned by the reader.\n     *\n     * @var PHPExcel\n     */\n    private $phpExcel;\n\n    /**\n     * Worksheet that is currently being built by the reader.\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $phpSheet;\n\n    /**\n     * BIFF version\n     *\n     * @var int\n     */\n    private $version;\n\n    /**\n     * Codepage set in the Excel file being read. Only important for BIFF5 (Excel 5.0 - Excel 95)\n     * For BIFF8 (Excel 97 - Excel 2003) this will always have the value 'UTF-16LE'\n     *\n     * @var string\n     */\n    private $codepage;\n\n    /**\n     * Shared formats\n     *\n     * @var array\n     */\n    private $formats;\n\n    /**\n     * Shared fonts\n     *\n     * @var array\n     */\n    private $objFonts;\n\n    /**\n     * Color palette\n     *\n     * @var array\n     */\n    private $palette;\n\n    /**\n     * Worksheets\n     *\n     * @var array\n     */\n    private $sheets;\n\n    /**\n     * External books\n     *\n     * @var array\n     */\n    private $externalBooks;\n\n    /**\n     * REF structures. Only applies to BIFF8.\n     *\n     * @var array\n     */\n    private $ref;\n\n    /**\n     * External names\n     *\n     * @var array\n     */\n    private $externalNames;\n\n    /**\n     * Defined names\n     *\n     * @var array\n     */\n    private $definedname;\n\n    /**\n     * Shared strings. Only applies to BIFF8.\n     *\n     * @var array\n     */\n    private $sst;\n\n    /**\n     * Panes are frozen? (in sheet currently being read). See WINDOW2 record.\n     *\n     * @var boolean\n     */\n    private $frozen;\n\n    /**\n     * Fit printout to number of pages? (in sheet currently being read). See SHEETPR record.\n     *\n     * @var boolean\n     */\n    private $isFitToPages;\n\n    /**\n     * Objects. One OBJ record contributes with one entry.\n     *\n     * @var array\n     */\n    private $objs;\n\n    /**\n     * Text Objects. One TXO record corresponds with one entry.\n     *\n     * @var array\n     */\n    private $textObjects;\n\n    /**\n     * Cell Annotations (BIFF8)\n     *\n     * @var array\n     */\n    private $cellNotes;\n\n    /**\n     * The combined MSODRAWINGGROUP data\n     *\n     * @var string\n     */\n    private $drawingGroupData;\n\n    /**\n     * The combined MSODRAWING data (per sheet)\n     *\n     * @var string\n     */\n    private $drawingData;\n\n    /**\n     * Keep track of XF index\n     *\n     * @var int\n     */\n    private $xfIndex;\n\n    /**\n     * Mapping of XF index (that is a cell XF) to final index in cellXf collection\n     *\n     * @var array\n     */\n    private $mapCellXfIndex;\n\n    /**\n     * Mapping of XF index (that is a style XF) to final index in cellStyleXf collection\n     *\n     * @var array\n     */\n    private $mapCellStyleXfIndex;\n\n    /**\n     * The shared formulas in a sheet. One SHAREDFMLA record contributes with one value.\n     *\n     * @var array\n     */\n    private $sharedFormulas;\n\n    /**\n     * The shared formula parts in a sheet. One FORMULA record contributes with one value if it\n     * refers to a shared formula.\n     *\n     * @var array\n     */\n    private $sharedFormulaParts;\n\n    /**\n     * The type of encryption in use\n     *\n     * @var int\n     */\n    private $encryption = 0;\n    \n    /**\n     * The position in the stream after which contents are encrypted\n     *\n     * @var int\n     */\n    private $encryptionStartPos = false;\n\n    /**\n     * The current RC4 decryption object\n     *\n     * @var PHPExcel_Reader_Excel5_RC4\n     */\n    private $rc4Key = null;\n\n    /**\n     * The position in the stream that the RC4 decryption object was left at\n     *\n     * @var int\n     */\n    private $rc4Pos = 0;\n\n    /**\n     * The current MD5 context state\n     *\n     * @var string\n     */\n    private $md5Ctxt = null;\n\n    /**\n     * Create a new PHPExcel_Reader_Excel5 instance\n     */\n    public function __construct()\n    {\n        $this->readFilter = new PHPExcel_Reader_DefaultReadFilter();\n    }\n\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return     boolean\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function canRead($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        try {\n            // Use ParseXL for the hard work.\n            $ole = new PHPExcel_Shared_OLERead();\n\n            // get excel data\n            $res = $ole->read($pFilename);\n            return true;\n        } catch (PHPExcel_Exception $e) {\n            return false;\n        }\n    }\n\n    /**\n     * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object\n     *\n     * @param     string         $pFilename\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function listWorksheetNames($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $worksheetNames = array();\n\n        // Read the OLE file\n        $this->loadOLE($pFilename);\n\n        // total byte size of Excel data (workbook global substream + sheet substreams)\n        $this->dataSize = strlen($this->data);\n\n        $this->pos        = 0;\n        $this->sheets    = array();\n\n        // Parse Workbook Global Substream\n        while ($this->pos < $this->dataSize) {\n            $code = self::getInt2d($this->data, $this->pos);\n\n            switch ($code) {\n                case self::XLS_TYPE_BOF:\n                    $this->readBof();\n                    break;\n                case self::XLS_TYPE_SHEET:\n                    $this->readSheet();\n                    break;\n                case self::XLS_TYPE_EOF:\n                    $this->readDefault();\n                    break 2;\n                default:\n                    $this->readDefault();\n                    break;\n            }\n        }\n\n        foreach ($this->sheets as $sheet) {\n            if ($sheet['sheetType'] != 0x00) {\n                // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module\n                continue;\n            }\n\n            $worksheetNames[] = $sheet['name'];\n        }\n\n        return $worksheetNames;\n    }\n\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param   string     $pFilename\n     * @throws   PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $worksheetInfo = array();\n\n        // Read the OLE file\n        $this->loadOLE($pFilename);\n\n        // total byte size of Excel data (workbook global substream + sheet substreams)\n        $this->dataSize = strlen($this->data);\n\n        // initialize\n        $this->pos    = 0;\n        $this->sheets = array();\n\n        // Parse Workbook Global Substream\n        while ($this->pos < $this->dataSize) {\n            $code = self::getInt2d($this->data, $this->pos);\n\n            switch ($code) {\n                case self::XLS_TYPE_BOF:\n                    $this->readBof();\n                    break;\n                case self::XLS_TYPE_SHEET:\n                    $this->readSheet();\n                    break;\n                case self::XLS_TYPE_EOF:\n                    $this->readDefault();\n                    break 2;\n                default:\n                    $this->readDefault();\n                    break;\n            }\n        }\n\n        // Parse the individual sheets\n        foreach ($this->sheets as $sheet) {\n            if ($sheet['sheetType'] != 0x00) {\n                // 0x00: Worksheet\n                // 0x02: Chart\n                // 0x06: Visual Basic module\n                continue;\n            }\n\n            $tmpInfo = array();\n            $tmpInfo['worksheetName'] = $sheet['name'];\n            $tmpInfo['lastColumnLetter'] = 'A';\n            $tmpInfo['lastColumnIndex'] = 0;\n            $tmpInfo['totalRows'] = 0;\n            $tmpInfo['totalColumns'] = 0;\n\n            $this->pos = $sheet['offset'];\n\n            while ($this->pos <= $this->dataSize - 4) {\n                $code = self::getInt2d($this->data, $this->pos);\n\n                switch ($code) {\n                    case self::XLS_TYPE_RK:\n                    case self::XLS_TYPE_LABELSST:\n                    case self::XLS_TYPE_NUMBER:\n                    case self::XLS_TYPE_FORMULA:\n                    case self::XLS_TYPE_BOOLERR:\n                    case self::XLS_TYPE_LABEL:\n                        $length = self::getInt2d($this->data, $this->pos + 2);\n                        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n                        // move stream pointer to next record\n                        $this->pos += 4 + $length;\n\n                        $rowIndex = self::getInt2d($recordData, 0) + 1;\n                        $columnIndex = self::getInt2d($recordData, 2);\n\n                        $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex);\n                        $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex);\n                        break;\n                    case self::XLS_TYPE_BOF:\n                        $this->readBof();\n                        break;\n                    case self::XLS_TYPE_EOF:\n                        $this->readDefault();\n                        break 2;\n                    default:\n                        $this->readDefault();\n                        break;\n                }\n            }\n\n            $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);\n            $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;\n\n            $worksheetInfo[] = $tmpInfo;\n        }\n\n        return $worksheetInfo;\n    }\n\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Read the OLE file\n        $this->loadOLE($pFilename);\n\n        // Initialisations\n        $this->phpExcel = new PHPExcel;\n        $this->phpExcel->removeSheetByIndex(0); // remove 1st sheet\n        if (!$this->readDataOnly) {\n            $this->phpExcel->removeCellStyleXfByIndex(0); // remove the default style\n            $this->phpExcel->removeCellXfByIndex(0); // remove the default style\n        }\n\n        // Read the summary information stream (containing meta data)\n        $this->readSummaryInformation();\n\n        // Read the Additional document summary information stream (containing application-specific meta data)\n        $this->readDocumentSummaryInformation();\n\n        // total byte size of Excel data (workbook global substream + sheet substreams)\n        $this->dataSize = strlen($this->data);\n\n        // initialize\n        $this->pos                 = 0;\n        $this->codepage            = 'CP1252';\n        $this->formats             = array();\n        $this->objFonts            = array();\n        $this->palette             = array();\n        $this->sheets              = array();\n        $this->externalBooks       = array();\n        $this->ref                 = array();\n        $this->definedname         = array();\n        $this->sst                 = array();\n        $this->drawingGroupData    = '';\n        $this->xfIndex             = '';\n        $this->mapCellXfIndex      = array();\n        $this->mapCellStyleXfIndex = array();\n\n        // Parse Workbook Global Substream\n        while ($this->pos < $this->dataSize) {\n            $code = self::getInt2d($this->data, $this->pos);\n\n            switch ($code) {\n                case self::XLS_TYPE_BOF:\n                    $this->readBof();\n                    break;\n                case self::XLS_TYPE_FILEPASS:\n                    $this->readFilepass();\n                    break;\n                case self::XLS_TYPE_CODEPAGE:\n                    $this->readCodepage();\n                    break;\n                case self::XLS_TYPE_DATEMODE:\n                    $this->readDateMode();\n                    break;\n                case self::XLS_TYPE_FONT:\n                    $this->readFont();\n                    break;\n                case self::XLS_TYPE_FORMAT:\n                    $this->readFormat();\n                    break;\n                case self::XLS_TYPE_XF:\n                    $this->readXf();\n                    break;\n                case self::XLS_TYPE_XFEXT:\n                    $this->readXfExt();\n                    break;\n                case self::XLS_TYPE_STYLE:\n                    $this->readStyle();\n                    break;\n                case self::XLS_TYPE_PALETTE:\n                    $this->readPalette();\n                    break;\n                case self::XLS_TYPE_SHEET:\n                    $this->readSheet();\n                    break;\n                case self::XLS_TYPE_EXTERNALBOOK:\n                    $this->readExternalBook();\n                    break;\n                case self::XLS_TYPE_EXTERNNAME:\n                    $this->readExternName();\n                    break;\n                case self::XLS_TYPE_EXTERNSHEET:\n                    $this->readExternSheet();\n                    break;\n                case self::XLS_TYPE_DEFINEDNAME:\n                    $this->readDefinedName();\n                    break;\n                case self::XLS_TYPE_MSODRAWINGGROUP:\n                    $this->readMsoDrawingGroup();\n                    break;\n                case self::XLS_TYPE_SST:\n                    $this->readSst();\n                    break;\n                case self::XLS_TYPE_EOF:\n                    $this->readDefault();\n                    break 2;\n                default:\n                    $this->readDefault();\n                    break;\n            }\n        }\n\n        // Resolve indexed colors for font, fill, and border colors\n        // Cannot be resolved already in XF record, because PALETTE record comes afterwards\n        if (!$this->readDataOnly) {\n            foreach ($this->objFonts as $objFont) {\n                if (isset($objFont->colorIndex)) {\n                    $color = PHPExcel_Reader_Excel5_Color::map($objFont->colorIndex, $this->palette, $this->version);\n                    $objFont->getColor()->setRGB($color['rgb']);\n                }\n            }\n\n            foreach ($this->phpExcel->getCellXfCollection() as $objStyle) {\n                // fill start and end color\n                $fill = $objStyle->getFill();\n\n                if (isset($fill->startcolorIndex)) {\n                    $startColor = PHPExcel_Reader_Excel5_Color::map($fill->startcolorIndex, $this->palette, $this->version);\n                    $fill->getStartColor()->setRGB($startColor['rgb']);\n                }\n                if (isset($fill->endcolorIndex)) {\n                    $endColor = PHPExcel_Reader_Excel5_Color::map($fill->endcolorIndex, $this->palette, $this->version);\n                    $fill->getEndColor()->setRGB($endColor['rgb']);\n                }\n\n                // border colors\n                $top      = $objStyle->getBorders()->getTop();\n                $right    = $objStyle->getBorders()->getRight();\n                $bottom   = $objStyle->getBorders()->getBottom();\n                $left     = $objStyle->getBorders()->getLeft();\n                $diagonal = $objStyle->getBorders()->getDiagonal();\n\n                if (isset($top->colorIndex)) {\n                    $borderTopColor = PHPExcel_Reader_Excel5_Color::map($top->colorIndex, $this->palette, $this->version);\n                    $top->getColor()->setRGB($borderTopColor['rgb']);\n                }\n                if (isset($right->colorIndex)) {\n                    $borderRightColor = PHPExcel_Reader_Excel5_Color::map($right->colorIndex, $this->palette, $this->version);\n                    $right->getColor()->setRGB($borderRightColor['rgb']);\n                }\n                if (isset($bottom->colorIndex)) {\n                    $borderBottomColor = PHPExcel_Reader_Excel5_Color::map($bottom->colorIndex, $this->palette, $this->version);\n                    $bottom->getColor()->setRGB($borderBottomColor['rgb']);\n                }\n                if (isset($left->colorIndex)) {\n                    $borderLeftColor = PHPExcel_Reader_Excel5_Color::map($left->colorIndex, $this->palette, $this->version);\n                    $left->getColor()->setRGB($borderLeftColor['rgb']);\n                }\n                if (isset($diagonal->colorIndex)) {\n                    $borderDiagonalColor = PHPExcel_Reader_Excel5_Color::map($diagonal->colorIndex, $this->palette, $this->version);\n                    $diagonal->getColor()->setRGB($borderDiagonalColor['rgb']);\n                }\n            }\n        }\n\n        // treat MSODRAWINGGROUP records, workbook-level Escher\n        if (!$this->readDataOnly && $this->drawingGroupData) {\n            $escherWorkbook = new PHPExcel_Shared_Escher();\n            $reader = new PHPExcel_Reader_Excel5_Escher($escherWorkbook);\n            $escherWorkbook = $reader->load($this->drawingGroupData);\n\n            // debug Escher stream\n            //$debug = new Debug_Escher(new PHPExcel_Shared_Escher());\n            //$debug->load($this->drawingGroupData);\n        }\n\n        // Parse the individual sheets\n        foreach ($this->sheets as $sheet) {\n            if ($sheet['sheetType'] != 0x00) {\n                // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module\n                continue;\n            }\n\n            // check if sheet should be skipped\n            if (isset($this->loadSheetsOnly) && !in_array($sheet['name'], $this->loadSheetsOnly)) {\n                continue;\n            }\n\n            // add sheet to PHPExcel object\n            $this->phpSheet = $this->phpExcel->createSheet();\n            //    Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula\n            //        cells... during the load, all formulae should be correct, and we're simply bringing the worksheet\n            //        name in line with the formula, not the reverse\n            $this->phpSheet->setTitle($sheet['name'], false);\n            $this->phpSheet->setSheetState($sheet['sheetState']);\n\n            $this->pos = $sheet['offset'];\n\n            // Initialize isFitToPages. May change after reading SHEETPR record.\n            $this->isFitToPages = false;\n\n            // Initialize drawingData\n            $this->drawingData = '';\n\n            // Initialize objs\n            $this->objs = array();\n\n            // Initialize shared formula parts\n            $this->sharedFormulaParts = array();\n\n            // Initialize shared formulas\n            $this->sharedFormulas = array();\n\n            // Initialize text objs\n            $this->textObjects = array();\n\n            // Initialize cell annotations\n            $this->cellNotes = array();\n            $this->textObjRef = -1;\n\n            while ($this->pos <= $this->dataSize - 4) {\n                $code = self::getInt2d($this->data, $this->pos);\n\n                switch ($code) {\n                    case self::XLS_TYPE_BOF:\n                        $this->readBof();\n                        break;\n                    case self::XLS_TYPE_PRINTGRIDLINES:\n                        $this->readPrintGridlines();\n                        break;\n                    case self::XLS_TYPE_DEFAULTROWHEIGHT:\n                        $this->readDefaultRowHeight();\n                        break;\n                    case self::XLS_TYPE_SHEETPR:\n                        $this->readSheetPr();\n                        break;\n                    case self::XLS_TYPE_HORIZONTALPAGEBREAKS:\n                        $this->readHorizontalPageBreaks();\n                        break;\n                    case self::XLS_TYPE_VERTICALPAGEBREAKS:\n                        $this->readVerticalPageBreaks();\n                        break;\n                    case self::XLS_TYPE_HEADER:\n                        $this->readHeader();\n                        break;\n                    case self::XLS_TYPE_FOOTER:\n                        $this->readFooter();\n                        break;\n                    case self::XLS_TYPE_HCENTER:\n                        $this->readHcenter();\n                        break;\n                    case self::XLS_TYPE_VCENTER:\n                        $this->readVcenter();\n                        break;\n                    case self::XLS_TYPE_LEFTMARGIN:\n                        $this->readLeftMargin();\n                        break;\n                    case self::XLS_TYPE_RIGHTMARGIN:\n                        $this->readRightMargin();\n                        break;\n                    case self::XLS_TYPE_TOPMARGIN:\n                        $this->readTopMargin();\n                        break;\n                    case self::XLS_TYPE_BOTTOMMARGIN:\n                        $this->readBottomMargin();\n                        break;\n                    case self::XLS_TYPE_PAGESETUP:\n                        $this->readPageSetup();\n                        break;\n                    case self::XLS_TYPE_PROTECT:\n                        $this->readProtect();\n                        break;\n                    case self::XLS_TYPE_SCENPROTECT:\n                        $this->readScenProtect();\n                        break;\n                    case self::XLS_TYPE_OBJECTPROTECT:\n                        $this->readObjectProtect();\n                        break;\n                    case self::XLS_TYPE_PASSWORD:\n                        $this->readPassword();\n                        break;\n                    case self::XLS_TYPE_DEFCOLWIDTH:\n                        $this->readDefColWidth();\n                        break;\n                    case self::XLS_TYPE_COLINFO:\n                        $this->readColInfo();\n                        break;\n                    case self::XLS_TYPE_DIMENSION:\n                        $this->readDefault();\n                        break;\n                    case self::XLS_TYPE_ROW:\n                        $this->readRow();\n                        break;\n                    case self::XLS_TYPE_DBCELL:\n                        $this->readDefault();\n                        break;\n                    case self::XLS_TYPE_RK:\n                        $this->readRk();\n                        break;\n                    case self::XLS_TYPE_LABELSST:\n                        $this->readLabelSst();\n                        break;\n                    case self::XLS_TYPE_MULRK:\n                        $this->readMulRk();\n                        break;\n                    case self::XLS_TYPE_NUMBER:\n                        $this->readNumber();\n                        break;\n                    case self::XLS_TYPE_FORMULA:\n                        $this->readFormula();\n                        break;\n                    case self::XLS_TYPE_SHAREDFMLA:\n                        $this->readSharedFmla();\n                        break;\n                    case self::XLS_TYPE_BOOLERR:\n                        $this->readBoolErr();\n                        break;\n                    case self::XLS_TYPE_MULBLANK:\n                        $this->readMulBlank();\n                        break;\n                    case self::XLS_TYPE_LABEL:\n                        $this->readLabel();\n                        break;\n                    case self::XLS_TYPE_BLANK:\n                        $this->readBlank();\n                        break;\n                    case self::XLS_TYPE_MSODRAWING:\n                        $this->readMsoDrawing();\n                        break;\n                    case self::XLS_TYPE_OBJ:\n                        $this->readObj();\n                        break;\n                    case self::XLS_TYPE_WINDOW2:\n                        $this->readWindow2();\n                        break;\n                    case self::XLS_TYPE_PAGELAYOUTVIEW:\n                        $this->readPageLayoutView();\n                        break;\n                    case self::XLS_TYPE_SCL:\n                        $this->readScl();\n                        break;\n                    case self::XLS_TYPE_PANE:\n                        $this->readPane();\n                        break;\n                    case self::XLS_TYPE_SELECTION:\n                        $this->readSelection();\n                        break;\n                    case self::XLS_TYPE_MERGEDCELLS:\n                        $this->readMergedCells();\n                        break;\n                    case self::XLS_TYPE_HYPERLINK:\n                        $this->readHyperLink();\n                        break;\n                    case self::XLS_TYPE_DATAVALIDATIONS:\n                        $this->readDataValidations();\n                        break;\n                    case self::XLS_TYPE_DATAVALIDATION:\n                        $this->readDataValidation();\n                        break;\n                    case self::XLS_TYPE_SHEETLAYOUT:\n                        $this->readSheetLayout();\n                        break;\n                    case self::XLS_TYPE_SHEETPROTECTION:\n                        $this->readSheetProtection();\n                        break;\n                    case self::XLS_TYPE_RANGEPROTECTION:\n                        $this->readRangeProtection();\n                        break;\n                    case self::XLS_TYPE_NOTE:\n                        $this->readNote();\n                        break;\n                    //case self::XLS_TYPE_IMDATA:                $this->readImData();                    break;\n                    case self::XLS_TYPE_TXO:\n                        $this->readTextObject();\n                        break;\n                    case self::XLS_TYPE_CONTINUE:\n                        $this->readContinue();\n                        break;\n                    case self::XLS_TYPE_EOF:\n                        $this->readDefault();\n                        break 2;\n                    default:\n                        $this->readDefault();\n                        break;\n                }\n\n            }\n\n            // treat MSODRAWING records, sheet-level Escher\n            if (!$this->readDataOnly && $this->drawingData) {\n                $escherWorksheet = new PHPExcel_Shared_Escher();\n                $reader = new PHPExcel_Reader_Excel5_Escher($escherWorksheet);\n                $escherWorksheet = $reader->load($this->drawingData);\n\n                // debug Escher stream\n                //$debug = new Debug_Escher(new PHPExcel_Shared_Escher());\n                //$debug->load($this->drawingData);\n\n                // get all spContainers in one long array, so they can be mapped to OBJ records\n                $allSpContainers = $escherWorksheet->getDgContainer()->getSpgrContainer()->getAllSpContainers();\n            }\n\n            // treat OBJ records\n            foreach ($this->objs as $n => $obj) {\n//                echo '<hr /><b>Object</b> reference is ', $n,'<br />';\n//                var_dump($obj);\n//                echo '<br />';\n\n                // the first shape container never has a corresponding OBJ record, hence $n + 1\n                if (isset($allSpContainers[$n + 1]) && is_object($allSpContainers[$n + 1])) {\n                    $spContainer = $allSpContainers[$n + 1];\n\n                    // we skip all spContainers that are a part of a group shape since we cannot yet handle those\n                    if ($spContainer->getNestingLevel() > 1) {\n                        continue;\n                    }\n\n                    // calculate the width and height of the shape\n                    list($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($spContainer->getStartCoordinates());\n                    list($endColumn, $endRow) = PHPExcel_Cell::coordinateFromString($spContainer->getEndCoordinates());\n\n                    $startOffsetX = $spContainer->getStartOffsetX();\n                    $startOffsetY = $spContainer->getStartOffsetY();\n                    $endOffsetX = $spContainer->getEndOffsetX();\n                    $endOffsetY = $spContainer->getEndOffsetY();\n\n                    $width = PHPExcel_Shared_Excel5::getDistanceX($this->phpSheet, $startColumn, $startOffsetX, $endColumn, $endOffsetX);\n                    $height = PHPExcel_Shared_Excel5::getDistanceY($this->phpSheet, $startRow, $startOffsetY, $endRow, $endOffsetY);\n\n                    // calculate offsetX and offsetY of the shape\n                    $offsetX = $startOffsetX * PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, $startColumn) / 1024;\n                    $offsetY = $startOffsetY * PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $startRow) / 256;\n\n                    switch ($obj['otObjType']) {\n                        case 0x19:\n                            // Note\n//                            echo 'Cell Annotation Object<br />';\n//                            echo 'Object ID is ', $obj['idObjID'],'<br />';\n                            if (isset($this->cellNotes[$obj['idObjID']])) {\n                                $cellNote = $this->cellNotes[$obj['idObjID']];\n\n                                if (isset($this->textObjects[$obj['idObjID']])) {\n                                    $textObject = $this->textObjects[$obj['idObjID']];\n                                    $this->cellNotes[$obj['idObjID']]['objTextData'] = $textObject;\n                                }\n                            }\n                            break;\n                        case 0x08:\n//                            echo 'Picture Object<br />';\n                            // picture\n                            // get index to BSE entry (1-based)\n                            $BSEindex = $spContainer->getOPT(0x0104);\n                            $BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection();\n                            $BSE = $BSECollection[$BSEindex - 1];\n                            $blipType = $BSE->getBlipType();\n\n                            // need check because some blip types are not supported by Escher reader such as EMF\n                            if ($blip = $BSE->getBlip()) {\n                                $ih = imagecreatefromstring($blip->getData());\n                                $drawing = new PHPExcel_Worksheet_MemoryDrawing();\n                                $drawing->setImageResource($ih);\n\n                                // width, height, offsetX, offsetY\n                                $drawing->setResizeProportional(false);\n                                $drawing->setWidth($width);\n                                $drawing->setHeight($height);\n                                $drawing->setOffsetX($offsetX);\n                                $drawing->setOffsetY($offsetY);\n\n                                switch ($blipType) {\n                                    case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:\n                                        $drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG);\n                                        $drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_JPEG);\n                                        break;\n                                    case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:\n                                        $drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG);\n                                        $drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_PNG);\n                                        break;\n                                }\n\n                                $drawing->setWorksheet($this->phpSheet);\n                                $drawing->setCoordinates($spContainer->getStartCoordinates());\n                            }\n                            break;\n                        default:\n                            // other object type\n                            break;\n                    }\n                }\n            }\n\n            // treat SHAREDFMLA records\n            if ($this->version == self::XLS_BIFF8) {\n                foreach ($this->sharedFormulaParts as $cell => $baseCell) {\n                    list($column, $row) = PHPExcel_Cell::coordinateFromString($cell);\n                    if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($column, $row, $this->phpSheet->getTitle())) {\n                        $formula = $this->getFormulaFromStructure($this->sharedFormulas[$baseCell], $cell);\n                        $this->phpSheet->getCell($cell)->setValueExplicit('=' . $formula, PHPExcel_Cell_DataType::TYPE_FORMULA);\n                    }\n                }\n            }\n\n            if (!empty($this->cellNotes)) {\n                foreach ($this->cellNotes as $note => $noteDetails) {\n                    if (!isset($noteDetails['objTextData'])) {\n                        if (isset($this->textObjects[$note])) {\n                            $textObject = $this->textObjects[$note];\n                            $noteDetails['objTextData'] = $textObject;\n                        } else {\n                            $noteDetails['objTextData']['text'] = '';\n                        }\n                    }\n//                    echo '<b>Cell annotation ', $note,'</b><br />';\n//                    var_dump($noteDetails);\n//                    echo '<br />';\n                    $cellAddress = str_replace('$', '', $noteDetails['cellRef']);\n                    $this->phpSheet->getComment($cellAddress)->setAuthor($noteDetails['author'])->setText($this->parseRichText($noteDetails['objTextData']['text']));\n                }\n            }\n        }\n\n        // add the named ranges (defined names)\n        foreach ($this->definedname as $definedName) {\n            if ($definedName['isBuiltInName']) {\n                switch ($definedName['name']) {\n                    case pack('C', 0x06):\n                        // print area\n                        //    in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2\n                        $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma?\n\n                        $extractedRanges = array();\n                        foreach ($ranges as $range) {\n                            // $range should look like one of these\n                            //        Foo!$C$7:$J$66\n                            //        Bar!$A$1:$IV$2\n                            $explodes = explode('!', $range);    // FIXME: what if sheetname contains exclamation mark?\n                            $sheetName = trim($explodes[0], \"'\");\n                            if (count($explodes) == 2) {\n                                if (strpos($explodes[1], ':') === false) {\n                                    $explodes[1] = $explodes[1] . ':' . $explodes[1];\n                                }\n                                $extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66\n                            }\n                        }\n                        if ($docSheet = $this->phpExcel->getSheetByName($sheetName)) {\n                            $docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2\n                        }\n                        break;\n                    case pack('C', 0x07):\n                        // print titles (repeating rows)\n                        // Assuming BIFF8, there are 3 cases\n                        // 1. repeating rows\n                        //        formula looks like this: Sheet!$A$1:$IV$2\n                        //        rows 1-2 repeat\n                        // 2. repeating columns\n                        //        formula looks like this: Sheet!$A$1:$B$65536\n                        //        columns A-B repeat\n                        // 3. both repeating rows and repeating columns\n                        //        formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2\n                        $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma?\n                        foreach ($ranges as $range) {\n                            // $range should look like this one of these\n                            //        Sheet!$A$1:$B$65536\n                            //        Sheet!$A$1:$IV$2\n                            $explodes = explode('!', $range);\n                            if (count($explodes) == 2) {\n                                if ($docSheet = $this->phpExcel->getSheetByName($explodes[0])) {\n                                    $extractedRange = $explodes[1];\n                                    $extractedRange = str_replace('$', '', $extractedRange);\n\n                                    $coordinateStrings = explode(':', $extractedRange);\n                                    if (count($coordinateStrings) == 2) {\n                                        list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[0]);\n                                        list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[1]);\n\n                                        if ($firstColumn == 'A' and $lastColumn == 'IV') {\n                                            // then we have repeating rows\n                                            $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($firstRow, $lastRow));\n                                        } elseif ($firstRow == 1 and $lastRow == 65536) {\n                                            // then we have repeating columns\n                                            $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($firstColumn, $lastColumn));\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        break;\n                }\n            } else {\n                // Extract range\n                $explodes = explode('!', $definedName['formula']);\n\n                if (count($explodes) == 2) {\n                    if (($docSheet = $this->phpExcel->getSheetByName($explodes[0])) ||\n                        ($docSheet = $this->phpExcel->getSheetByName(trim($explodes[0], \"'\")))) {\n                        $extractedRange = $explodes[1];\n                        $extractedRange = str_replace('$', '', $extractedRange);\n\n                        $localOnly = ($definedName['scope'] == 0) ? false : true;\n\n                        $scope = ($definedName['scope'] == 0) ? null : $this->phpExcel->getSheetByName($this->sheets[$definedName['scope'] - 1]['name']);\n\n                        $this->phpExcel->addNamedRange(new PHPExcel_NamedRange((string)$definedName['name'], $docSheet, $extractedRange, $localOnly, $scope));\n                    }\n                } else {\n                    //    Named Value\n                    //    TODO Provide support for named values\n                }\n            }\n        }\n        $this->data = null;\n\n        return $this->phpExcel;\n    }\n    \n    /**\n     * Read record data from stream, decrypting as required\n     *\n     * @param string $data   Data stream to read from\n     * @param int    $pos    Position to start reading from\n     * @param int    $length Record data length\n     *\n     * @return string Record data\n     */\n    private function readRecordData($data, $pos, $len)\n    {\n        $data = substr($data, $pos, $len);\n        \n        // File not encrypted, or record before encryption start point\n        if ($this->encryption == self::MS_BIFF_CRYPTO_NONE || $pos < $this->encryptionStartPos) {\n            return $data;\n        }\n    \n        $recordData = '';\n        if ($this->encryption == self::MS_BIFF_CRYPTO_RC4) {\n            $oldBlock = floor($this->rc4Pos / self::REKEY_BLOCK);\n            $block = floor($pos / self::REKEY_BLOCK);\n            $endBlock = floor(($pos + $len) / self::REKEY_BLOCK);\n\n            // Spin an RC4 decryptor to the right spot. If we have a decryptor sitting\n            // at a point earlier in the current block, re-use it as we can save some time.\n            if ($block != $oldBlock || $pos < $this->rc4Pos || !$this->rc4Key) {\n                $this->rc4Key = $this->makeKey($block, $this->md5Ctxt);\n                $step = $pos % self::REKEY_BLOCK;\n            } else {\n                $step = $pos - $this->rc4Pos;\n            }\n            $this->rc4Key->RC4(str_repeat(\"\\0\", $step));\n\n            // Decrypt record data (re-keying at the end of every block)\n            while ($block != $endBlock) {\n                $step = self::REKEY_BLOCK - ($pos % self::REKEY_BLOCK);\n                $recordData .= $this->rc4Key->RC4(substr($data, 0, $step));\n                $data = substr($data, $step);\n                $pos += $step;\n                $len -= $step;\n                $block++;\n                $this->rc4Key = $this->makeKey($block, $this->md5Ctxt);\n            }\n            $recordData .= $this->rc4Key->RC4(substr($data, 0, $len));\n\n            // Keep track of the position of this decryptor.\n            // We'll try and re-use it later if we can to speed things up\n            $this->rc4Pos = $pos + $len;\n        } elseif ($this->encryption == self::MS_BIFF_CRYPTO_XOR) {\n            throw new PHPExcel_Reader_Exception('XOr encryption not supported');\n        }\n        return $recordData;\n    }\n\n    /**\n     * Use OLE reader to extract the relevant data streams from the OLE file\n     *\n     * @param string $pFilename\n     */\n    private function loadOLE($pFilename)\n    {\n        // OLE reader\n        $ole = new PHPExcel_Shared_OLERead();\n        // get excel data,\n        $res = $ole->read($pFilename);\n        // Get workbook data: workbook stream + sheet streams\n        $this->data = $ole->getStream($ole->wrkbook);\n        // Get summary information data\n        $this->summaryInformation = $ole->getStream($ole->summaryInformation);\n        // Get additional document summary information data\n        $this->documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation);\n        // Get user-defined property data\n//        $this->userDefinedProperties = $ole->getUserDefinedProperties();\n    }\n\n\n    /**\n     * Read summary information\n     */\n    private function readSummaryInformation()\n    {\n        if (!isset($this->summaryInformation)) {\n            return;\n        }\n\n        // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark)\n        // offset: 2; size: 2;\n        // offset: 4; size: 2; OS version\n        // offset: 6; size: 2; OS indicator\n        // offset: 8; size: 16\n        // offset: 24; size: 4; section count\n        $secCount = self::getInt4d($this->summaryInformation, 24);\n\n        // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9\n        // offset: 44; size: 4\n        $secOffset = self::getInt4d($this->summaryInformation, 44);\n\n        // section header\n        // offset: $secOffset; size: 4; section length\n        $secLength = self::getInt4d($this->summaryInformation, $secOffset);\n\n        // offset: $secOffset+4; size: 4; property count\n        $countProperties = self::getInt4d($this->summaryInformation, $secOffset+4);\n\n        // initialize code page (used to resolve string values)\n        $codePage = 'CP1252';\n\n        // offset: ($secOffset+8); size: var\n        // loop through property decarations and properties\n        for ($i = 0; $i < $countProperties; ++$i) {\n            // offset: ($secOffset+8) + (8 * $i); size: 4; property ID\n            $id = self::getInt4d($this->summaryInformation, ($secOffset+8) + (8 * $i));\n\n            // Use value of property id as appropriate\n            // offset: ($secOffset+12) + (8 * $i); size: 4; offset from beginning of section (48)\n            $offset = self::getInt4d($this->summaryInformation, ($secOffset+12) + (8 * $i));\n\n            $type = self::getInt4d($this->summaryInformation, $secOffset + $offset);\n\n            // initialize property value\n            $value = null;\n\n            // extract property value based on property type\n            switch ($type) {\n                case 0x02: // 2 byte signed integer\n                    $value = self::getInt2d($this->summaryInformation, $secOffset + 4 + $offset);\n                    break;\n                case 0x03: // 4 byte signed integer\n                    $value = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset);\n                    break;\n                case 0x13: // 4 byte unsigned integer\n                    // not needed yet, fix later if necessary\n                    break;\n                case 0x1E: // null-terminated string prepended by dword string length\n                    $byteLength = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset);\n                    $value = substr($this->summaryInformation, $secOffset + 8 + $offset, $byteLength);\n                    $value = PHPExcel_Shared_String::ConvertEncoding($value, 'UTF-8', $codePage);\n                    $value = rtrim($value);\n                    break;\n                case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)\n                    // PHP-time\n                    $value = PHPExcel_Shared_OLE::OLE2LocalDate(substr($this->summaryInformation, $secOffset + 4 + $offset, 8));\n                    break;\n                case 0x47: // Clipboard format\n                    // not needed yet, fix later if necessary\n                    break;\n            }\n\n            switch ($id) {\n                case 0x01:    //    Code Page\n                    $codePage = PHPExcel_Shared_CodePage::NumberToName($value);\n                    break;\n                case 0x02:    //    Title\n                    $this->phpExcel->getProperties()->setTitle($value);\n                    break;\n                case 0x03:    //    Subject\n                    $this->phpExcel->getProperties()->setSubject($value);\n                    break;\n                case 0x04:    //    Author (Creator)\n                    $this->phpExcel->getProperties()->setCreator($value);\n                    break;\n                case 0x05:    //    Keywords\n                    $this->phpExcel->getProperties()->setKeywords($value);\n                    break;\n                case 0x06:    //    Comments (Description)\n                    $this->phpExcel->getProperties()->setDescription($value);\n                    break;\n                case 0x07:    //    Template\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x08:    //    Last Saved By (LastModifiedBy)\n                    $this->phpExcel->getProperties()->setLastModifiedBy($value);\n                    break;\n                case 0x09:    //    Revision\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0A:    //    Total Editing Time\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0B:    //    Last Printed\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0C:    //    Created Date/Time\n                    $this->phpExcel->getProperties()->setCreated($value);\n                    break;\n                case 0x0D:    //    Modified Date/Time\n                    $this->phpExcel->getProperties()->setModified($value);\n                    break;\n                case 0x0E:    //    Number of Pages\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0F:    //    Number of Words\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x10:    //    Number of Characters\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x11:    //    Thumbnail\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x12:    //    Name of creating application\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x13:    //    Security\n                    //    Not supported by PHPExcel\n                    break;\n            }\n        }\n    }\n\n\n    /**\n     * Read additional document summary information\n     */\n    private function readDocumentSummaryInformation()\n    {\n        if (!isset($this->documentSummaryInformation)) {\n            return;\n        }\n\n        //    offset: 0;    size: 2;    must be 0xFE 0xFF (UTF-16 LE byte order mark)\n        //    offset: 2;    size: 2;\n        //    offset: 4;    size: 2;    OS version\n        //    offset: 6;    size: 2;    OS indicator\n        //    offset: 8;    size: 16\n        //    offset: 24;    size: 4;    section count\n        $secCount = self::getInt4d($this->documentSummaryInformation, 24);\n//        echo '$secCount = ', $secCount,'<br />';\n\n        // offset: 28;    size: 16;    first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae\n        // offset: 44;    size: 4;    first section offset\n        $secOffset = self::getInt4d($this->documentSummaryInformation, 44);\n//        echo '$secOffset = ', $secOffset,'<br />';\n\n        //    section header\n        //    offset: $secOffset;    size: 4;    section length\n        $secLength = self::getInt4d($this->documentSummaryInformation, $secOffset);\n//        echo '$secLength = ', $secLength,'<br />';\n\n        //    offset: $secOffset+4;    size: 4;    property count\n        $countProperties = self::getInt4d($this->documentSummaryInformation, $secOffset+4);\n//        echo '$countProperties = ', $countProperties,'<br />';\n\n        // initialize code page (used to resolve string values)\n        $codePage = 'CP1252';\n\n        //    offset: ($secOffset+8);    size: var\n        //    loop through property decarations and properties\n        for ($i = 0; $i < $countProperties; ++$i) {\n//            echo 'Property ', $i,'<br />';\n            //    offset: ($secOffset+8) + (8 * $i);    size: 4;    property ID\n            $id = self::getInt4d($this->documentSummaryInformation, ($secOffset+8) + (8 * $i));\n//            echo 'ID is ', $id,'<br />';\n\n            // Use value of property id as appropriate\n            // offset: 60 + 8 * $i;    size: 4;    offset from beginning of section (48)\n            $offset = self::getInt4d($this->documentSummaryInformation, ($secOffset+12) + (8 * $i));\n\n            $type = self::getInt4d($this->documentSummaryInformation, $secOffset + $offset);\n//            echo 'Type is ', $type,', ';\n\n            // initialize property value\n            $value = null;\n\n            // extract property value based on property type\n            switch ($type) {\n                case 0x02:    //    2 byte signed integer\n                    $value = self::getInt2d($this->documentSummaryInformation, $secOffset + 4 + $offset);\n                    break;\n                case 0x03:    //    4 byte signed integer\n                    $value = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset);\n                    break;\n                case 0x0B:  // Boolean\n                    $value = self::getInt2d($this->documentSummaryInformation, $secOffset + 4 + $offset);\n                    $value = ($value == 0 ? false : true);\n                    break;\n                case 0x13:    //    4 byte unsigned integer\n                    // not needed yet, fix later if necessary\n                    break;\n                case 0x1E:    //    null-terminated string prepended by dword string length\n                    $byteLength = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset);\n                    $value = substr($this->documentSummaryInformation, $secOffset + 8 + $offset, $byteLength);\n                    $value = PHPExcel_Shared_String::ConvertEncoding($value, 'UTF-8', $codePage);\n                    $value = rtrim($value);\n                    break;\n                case 0x40:    //    Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)\n                    // PHP-Time\n                    $value = PHPExcel_Shared_OLE::OLE2LocalDate(substr($this->documentSummaryInformation, $secOffset + 4 + $offset, 8));\n                    break;\n                case 0x47:    //    Clipboard format\n                    // not needed yet, fix later if necessary\n                    break;\n            }\n\n            switch ($id) {\n                case 0x01:    //    Code Page\n                    $codePage = PHPExcel_Shared_CodePage::NumberToName($value);\n                    break;\n                case 0x02:    //    Category\n                    $this->phpExcel->getProperties()->setCategory($value);\n                    break;\n                case 0x03:    //    Presentation Target\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x04:    //    Bytes\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x05:    //    Lines\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x06:    //    Paragraphs\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x07:    //    Slides\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x08:    //    Notes\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x09:    //    Hidden Slides\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0A:    //    MM Clips\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0B:    //    Scale Crop\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0C:    //    Heading Pairs\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0D:    //    Titles of Parts\n                    //    Not supported by PHPExcel\n                    break;\n                case 0x0E:    //    Manager\n                    $this->phpExcel->getProperties()->setManager($value);\n                    break;\n                case 0x0F:    //    Company\n                    $this->phpExcel->getProperties()->setCompany($value);\n                    break;\n                case 0x10:    //    Links up-to-date\n                    //    Not supported by PHPExcel\n                    break;\n            }\n        }\n    }\n\n\n    /**\n     * Reads a general type of BIFF record. Does nothing except for moving stream pointer forward to next record.\n     */\n    private function readDefault()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n//        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n    }\n\n\n    /**\n     *    The NOTE record specifies a comment associated with a particular cell. In Excel 95 (BIFF7) and earlier versions,\n     *        this record stores a note (cell note). This feature was significantly enhanced in Excel 97.\n     */\n    private function readNote()\n    {\n//        echo '<b>Read Cell Annotation</b><br />';\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        $cellAddress = $this->readBIFF8CellAddress(substr($recordData, 0, 4));\n        if ($this->version == self::XLS_BIFF8) {\n            $noteObjID = self::getInt2d($recordData, 6);\n            $noteAuthor = self::readUnicodeStringLong(substr($recordData, 8));\n            $noteAuthor = $noteAuthor['value'];\n//            echo 'Note Address=', $cellAddress,'<br />';\n//            echo 'Note Object ID=', $noteObjID,'<br />';\n//            echo 'Note Author=', $noteAuthor,'<hr />';\n//\n            $this->cellNotes[$noteObjID] = array(\n                'cellRef'   => $cellAddress,\n                'objectID'  => $noteObjID,\n                'author'    => $noteAuthor\n            );\n        } else {\n            $extension = false;\n            if ($cellAddress == '$B$65536') {\n                //    If the address row is -1 and the column is 0, (which translates as $B$65536) then this is a continuation\n                //        note from the previous cell annotation. We're not yet handling this, so annotations longer than the\n                //        max 2048 bytes will probably throw a wobbly.\n                $row = self::getInt2d($recordData, 0);\n                $extension = true;\n                $cellAddress = array_pop(array_keys($this->phpSheet->getComments()));\n            }\n//            echo 'Note Address=', $cellAddress,'<br />';\n\n            $cellAddress = str_replace('$', '', $cellAddress);\n            $noteLength = self::getInt2d($recordData, 4);\n            $noteText = trim(substr($recordData, 6));\n//            echo 'Note Length=', $noteLength,'<br />';\n//            echo 'Note Text=', $noteText,'<br />';\n\n            if ($extension) {\n                //    Concatenate this extension with the currently set comment for the cell\n                $comment = $this->phpSheet->getComment($cellAddress);\n                $commentText = $comment->getText()->getPlainText();\n                $comment->setText($this->parseRichText($commentText.$noteText));\n            } else {\n                //    Set comment for the cell\n                $this->phpSheet->getComment($cellAddress)->setText($this->parseRichText($noteText));\n//                                                    ->setAuthor($author)\n            }\n        }\n\n    }\n\n\n    /**\n     *    The TEXT Object record contains the text associated with a cell annotation.\n     */\n    private function readTextObject()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        // recordData consists of an array of subrecords looking like this:\n        //    grbit: 2 bytes; Option Flags\n        //    rot: 2 bytes; rotation\n        //    cchText: 2 bytes; length of the text (in the first continue record)\n        //    cbRuns: 2 bytes; length of the formatting (in the second continue record)\n        // followed by the continuation records containing the actual text and formatting\n        $grbitOpts  = self::getInt2d($recordData, 0);\n        $rot        = self::getInt2d($recordData, 2);\n        $cchText    = self::getInt2d($recordData, 10);\n        $cbRuns     = self::getInt2d($recordData, 12);\n        $text       = $this->getSplicedRecordData();\n\n        $this->textObjects[$this->textObjRef] = array(\n            'text'      => substr($text[\"recordData\"], $text[\"spliceOffsets\"][0]+1, $cchText),\n            'format'    => substr($text[\"recordData\"], $text[\"spliceOffsets\"][1], $cbRuns),\n            'alignment' => $grbitOpts,\n            'rotation'  => $rot\n        );\n\n//        echo '<b>_readTextObject()</b><br />';\n//        var_dump($this->textObjects[$this->textObjRef]);\n//        echo '<br />';\n    }\n\n\n    /**\n     * Read BOF\n     */\n    private function readBof()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = substr($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 2; size: 2; type of the following data\n        $substreamType = self::getInt2d($recordData, 2);\n\n        switch ($substreamType) {\n            case self::XLS_WorkbookGlobals:\n                $version = self::getInt2d($recordData, 0);\n                if (($version != self::XLS_BIFF8) && ($version != self::XLS_BIFF7)) {\n                    throw new PHPExcel_Reader_Exception('Cannot read this Excel file. Version is too old.');\n                }\n                $this->version = $version;\n                break;\n            case self::XLS_Worksheet:\n                // do not use this version information for anything\n                // it is unreliable (OpenOffice doc, 5.8), use only version information from the global stream\n                break;\n            default:\n                // substream, e.g. chart\n                // just skip the entire substream\n                do {\n                    $code = self::getInt2d($this->data, $this->pos);\n                    $this->readDefault();\n                } while ($code != self::XLS_TYPE_EOF && $this->pos < $this->dataSize);\n                break;\n        }\n    }\n\n\n    /**\n     * FILEPASS\n     *\n     * This record is part of the File Protection Block. It\n     * contains information about the read/write password of the\n     * file. All record contents following this record will be\n     * encrypted.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     *\n     * The decryption functions and objects used from here on in\n     * are based on the source of Spreadsheet-ParseExcel:\n     * http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel/\n     */\n    private function readFilepass()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n\n        if ($length != 54) {\n            throw new PHPExcel_Reader_Exception('Unexpected file pass record length');\n        }\n        \n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n        \n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) {\n            throw new PHPExcel_Reader_Exception('Decryption password incorrect');\n        }\n        \n        $this->encryption = self::MS_BIFF_CRYPTO_RC4;\n\n        // Decryption required from the record after next onwards\n        $this->encryptionStartPos = $this->pos + self::getInt2d($this->data, $this->pos + 2);\n    }\n\n    /**\n     * Make an RC4 decryptor for the given block\n     *\n     * @var int    $block      Block for which to create decrypto\n     * @var string $valContext MD5 context state\n     *\n     * @return PHPExcel_Reader_Excel5_RC4\n     */\n    private function makeKey($block, $valContext)\n    {\n        $pwarray = str_repeat(\"\\0\", 64);\n\n        for ($i = 0; $i < 5; $i++) {\n            $pwarray[$i] = $valContext[$i];\n        }\n        \n        $pwarray[5] = chr($block & 0xff);\n        $pwarray[6] = chr(($block >> 8) & 0xff);\n        $pwarray[7] = chr(($block >> 16) & 0xff);\n        $pwarray[8] = chr(($block >> 24) & 0xff);\n\n        $pwarray[9] = \"\\x80\";\n        $pwarray[56] = \"\\x48\";\n\n        $md5 = new PHPExcel_Reader_Excel5_MD5();\n        $md5->add($pwarray);\n\n        $s = $md5->getContext();\n        return new PHPExcel_Reader_Excel5_RC4($s);\n    }\n\n    /**\n     * Verify RC4 file password\n     *\n     * @var string $password        Password to check\n     * @var string $docid           Document id\n     * @var string $salt_data       Salt data\n     * @var string $hashedsalt_data Hashed salt data\n     * @var string &$valContext     Set to the MD5 context of the value\n     *\n     * @return bool Success\n     */\n    private function verifyPassword($password, $docid, $salt_data, $hashedsalt_data, &$valContext)\n    {\n        $pwarray = str_repeat(\"\\0\", 64);\n\n        for ($i = 0; $i < strlen($password); $i++) {\n            $o = ord(substr($password, $i, 1));\n            $pwarray[2 * $i] = chr($o & 0xff);\n            $pwarray[2 * $i + 1] = chr(($o >> 8) & 0xff);\n        }\n        $pwarray[2 * $i] = chr(0x80);\n        $pwarray[56] = chr(($i << 4) & 0xff);\n\n        $md5 = new PHPExcel_Reader_Excel5_MD5();\n        $md5->add($pwarray);\n\n        $mdContext1 = $md5->getContext();\n\n        $offset = 0;\n        $keyoffset = 0;\n        $tocopy = 5;\n\n        $md5->reset();\n\n        while ($offset != 16) {\n            if ((64 - $offset) < 5) {\n                $tocopy = 64 - $offset;\n            }\n            for ($i = 0; $i <= $tocopy; $i++) {\n                $pwarray[$offset + $i] = $mdContext1[$keyoffset + $i];\n            }\n            $offset += $tocopy;\n\n            if ($offset == 64) {\n                $md5->add($pwarray);\n                $keyoffset = $tocopy;\n                $tocopy = 5 - $tocopy;\n                $offset = 0;\n                continue;\n            }\n\n            $keyoffset = 0;\n            $tocopy = 5;\n            for ($i = 0; $i < 16; $i++) {\n                $pwarray[$offset + $i] = $docid[$i];\n            }\n            $offset += 16;\n        }\n\n        $pwarray[16] = \"\\x80\";\n        for ($i = 0; $i < 47; $i++) {\n            $pwarray[17 + $i] = \"\\0\";\n        }\n        $pwarray[56] = \"\\x80\";\n        $pwarray[57] = \"\\x0a\";\n\n        $md5->add($pwarray);\n        $valContext = $md5->getContext();\n\n        $key = $this->makeKey(0, $valContext);\n\n        $salt = $key->RC4($salt_data);\n        $hashedsalt = $key->RC4($hashedsalt_data);\n        \n        $salt .= \"\\x80\" . str_repeat(\"\\0\", 47);\n        $salt[56] = \"\\x80\";\n\n        $md5->reset();\n        $md5->add($salt);\n        $mdContext2 = $md5->getContext();\n\n        return $mdContext2 == $hashedsalt;\n    }\n\n    /**\n     * CODEPAGE\n     *\n     * This record stores the text encoding used to write byte\n     * strings, stored as MS Windows code page identifier.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readCodepage()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; code page identifier\n        $codepage = self::getInt2d($recordData, 0);\n\n        $this->codepage = PHPExcel_Shared_CodePage::NumberToName($codepage);\n    }\n\n\n    /**\n     * DATEMODE\n     *\n     * This record specifies the base date for displaying date\n     * values. All dates are stored as count of days past this\n     * base date. In BIFF2-BIFF4 this record is part of the\n     * Calculation Settings Block. In BIFF5-BIFF8 it is\n     * stored in the Workbook Globals Substream.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readDateMode()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; 0 = base 1900, 1 = base 1904\n        PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900);\n        if (ord($recordData{0}) == 1) {\n            PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904);\n        }\n    }\n\n\n    /**\n     * Read a FONT record\n     */\n    private function readFont()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            $objFont = new PHPExcel_Style_Font();\n\n            // offset: 0; size: 2; height of the font (in twips = 1/20 of a point)\n            $size = self::getInt2d($recordData, 0);\n            $objFont->setSize($size / 20);\n\n            // offset: 2; size: 2; option flags\n            // bit: 0; mask 0x0001; bold (redundant in BIFF5-BIFF8)\n            // bit: 1; mask 0x0002; italic\n            $isItalic = (0x0002 & self::getInt2d($recordData, 2)) >> 1;\n            if ($isItalic) {\n                $objFont->setItalic(true);\n            }\n\n            // bit: 2; mask 0x0004; underlined (redundant in BIFF5-BIFF8)\n            // bit: 3; mask 0x0008; strike\n            $isStrike = (0x0008 & self::getInt2d($recordData, 2)) >> 3;\n            if ($isStrike) {\n                $objFont->setStrikethrough(true);\n            }\n\n            // offset: 4; size: 2; colour index\n            $colorIndex = self::getInt2d($recordData, 4);\n            $objFont->colorIndex = $colorIndex;\n\n            // offset: 6; size: 2; font weight\n            $weight = self::getInt2d($recordData, 6);\n            switch ($weight) {\n                case 0x02BC:\n                    $objFont->setBold(true);\n                    break;\n            }\n\n            // offset: 8; size: 2; escapement type\n            $escapement = self::getInt2d($recordData, 8);\n            switch ($escapement) {\n                case 0x0001:\n                    $objFont->setSuperScript(true);\n                    break;\n                case 0x0002:\n                    $objFont->setSubScript(true);\n                    break;\n            }\n\n            // offset: 10; size: 1; underline type\n            $underlineType = ord($recordData{10});\n            switch ($underlineType) {\n                case 0x00:\n                    break; // no underline\n                case 0x01:\n                    $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);\n                    break;\n                case 0x02:\n                    $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE);\n                    break;\n                case 0x21:\n                    $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING);\n                    break;\n                case 0x22:\n                    $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING);\n                    break;\n            }\n\n            // offset: 11; size: 1; font family\n            // offset: 12; size: 1; character set\n            // offset: 13; size: 1; not used\n            // offset: 14; size: var; font name\n            if ($this->version == self::XLS_BIFF8) {\n                $string = self::readUnicodeStringShort(substr($recordData, 14));\n            } else {\n                $string = $this->readByteStringShort(substr($recordData, 14));\n            }\n            $objFont->setName($string['value']);\n\n            $this->objFonts[] = $objFont;\n        }\n    }\n\n\n    /**\n     * FORMAT\n     *\n     * This record contains information about a number format.\n     * All FORMAT records occur together in a sequential list.\n     *\n     * In BIFF2-BIFF4 other records referencing a FORMAT record\n     * contain a zero-based index into this list. From BIFF5 on\n     * the FORMAT record contains the index itself that will be\n     * used by other records.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readFormat()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            $indexCode = self::getInt2d($recordData, 0);\n\n            if ($this->version == self::XLS_BIFF8) {\n                $string = self::readUnicodeStringLong(substr($recordData, 2));\n            } else {\n                // BIFF7\n                $string = $this->readByteStringShort(substr($recordData, 2));\n            }\n\n            $formatString = $string['value'];\n            $this->formats[$indexCode] = $formatString;\n        }\n    }\n\n\n    /**\n     * XF - Extended Format\n     *\n     * This record contains formatting information for cells, rows, columns or styles.\n     * According to http://support.microsoft.com/kb/147732 there are always at least 15 cell style XF\n     * and 1 cell XF.\n     * Inspection of Excel files generated by MS Office Excel shows that XF records 0-14 are cell style XF\n     * and XF record 15 is a cell XF\n     * We only read the first cell style XF and skip the remaining cell style XF records\n     * We read all cell XF records.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readXf()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        $objStyle = new PHPExcel_Style();\n\n        if (!$this->readDataOnly) {\n            // offset:  0; size: 2; Index to FONT record\n            if (self::getInt2d($recordData, 0) < 4) {\n                $fontIndex = self::getInt2d($recordData, 0);\n            } else {\n                // this has to do with that index 4 is omitted in all BIFF versions for some strange reason\n                // check the OpenOffice documentation of the FONT record\n                $fontIndex = self::getInt2d($recordData, 0) - 1;\n            }\n            $objStyle->setFont($this->objFonts[$fontIndex]);\n\n            // offset:  2; size: 2; Index to FORMAT record\n            $numberFormatIndex = self::getInt2d($recordData, 2);\n            if (isset($this->formats[$numberFormatIndex])) {\n                // then we have user-defined format code\n                $numberformat = array('code' => $this->formats[$numberFormatIndex]);\n            } elseif (($code = PHPExcel_Style_NumberFormat::builtInFormatCode($numberFormatIndex)) !== '') {\n                // then we have built-in format code\n                $numberformat = array('code' => $code);\n            } else {\n                // we set the general format code\n                $numberformat = array('code' => 'General');\n            }\n            $objStyle->getNumberFormat()->setFormatCode($numberformat['code']);\n\n            // offset:  4; size: 2; XF type, cell protection, and parent style XF\n            // bit 2-0; mask 0x0007; XF_TYPE_PROT\n            $xfTypeProt = self::getInt2d($recordData, 4);\n            // bit 0; mask 0x01; 1 = cell is locked\n            $isLocked = (0x01 & $xfTypeProt) >> 0;\n            $objStyle->getProtection()->setLocked($isLocked ? PHPExcel_Style_Protection::PROTECTION_INHERIT : PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);\n\n            // bit 1; mask 0x02; 1 = Formula is hidden\n            $isHidden = (0x02 & $xfTypeProt) >> 1;\n            $objStyle->getProtection()->setHidden($isHidden ? PHPExcel_Style_Protection::PROTECTION_PROTECTED : PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);\n\n            // bit 2; mask 0x04; 0 = Cell XF, 1 = Cell Style XF\n            $isCellStyleXf = (0x04 & $xfTypeProt) >> 2;\n\n            // offset:  6; size: 1; Alignment and text break\n            // bit 2-0, mask 0x07; horizontal alignment\n            $horAlign = (0x07 & ord($recordData{6})) >> 0;\n            switch ($horAlign) {\n                case 0:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_GENERAL);\n                    break;\n                case 1:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);\n                    break;\n                case 2:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);\n                    break;\n                case 3:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);\n                    break;\n                case 4:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_FILL);\n                    break;\n                case 5:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);\n                    break;\n                case 6:\n                    $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS);\n                    break;\n            }\n            // bit 3, mask 0x08; wrap text\n            $wrapText = (0x08 & ord($recordData{6})) >> 3;\n            switch ($wrapText) {\n                case 0:\n                    $objStyle->getAlignment()->setWrapText(false);\n                    break;\n                case 1:\n                    $objStyle->getAlignment()->setWrapText(true);\n                    break;\n            }\n            // bit 6-4, mask 0x70; vertical alignment\n            $vertAlign = (0x70 & ord($recordData{6})) >> 4;\n            switch ($vertAlign) {\n                case 0:\n                    $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP);\n                    break;\n                case 1:\n                    $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);\n                    break;\n                case 2:\n                    $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_BOTTOM);\n                    break;\n                case 3:\n                    $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_JUSTIFY);\n                    break;\n            }\n\n            if ($this->version == self::XLS_BIFF8) {\n                // offset:  7; size: 1; XF_ROTATION: Text rotation angle\n                $angle = ord($recordData{7});\n                $rotation = 0;\n                if ($angle <= 90) {\n                    $rotation = $angle;\n                } elseif ($angle <= 180) {\n                    $rotation = 90 - $angle;\n                } elseif ($angle == 255) {\n                    $rotation = -165;\n                }\n                $objStyle->getAlignment()->setTextRotation($rotation);\n\n                // offset:  8; size: 1; Indentation, shrink to cell size, and text direction\n                // bit: 3-0; mask: 0x0F; indent level\n                $indent = (0x0F & ord($recordData{8})) >> 0;\n                $objStyle->getAlignment()->setIndent($indent);\n\n                // bit: 4; mask: 0x10; 1 = shrink content to fit into cell\n                $shrinkToFit = (0x10 & ord($recordData{8})) >> 4;\n                switch ($shrinkToFit) {\n                    case 0:\n                        $objStyle->getAlignment()->setShrinkToFit(false);\n                        break;\n                    case 1:\n                        $objStyle->getAlignment()->setShrinkToFit(true);\n                        break;\n                }\n\n                // offset:  9; size: 1; Flags used for attribute groups\n\n                // offset: 10; size: 4; Cell border lines and background area\n                // bit: 3-0; mask: 0x0000000F; left style\n                if ($bordersLeftStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x0000000F & self::getInt4d($recordData, 10)) >> 0)) {\n                    $objStyle->getBorders()->getLeft()->setBorderStyle($bordersLeftStyle);\n                }\n                // bit: 7-4; mask: 0x000000F0; right style\n                if ($bordersRightStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x000000F0 & self::getInt4d($recordData, 10)) >> 4)) {\n                    $objStyle->getBorders()->getRight()->setBorderStyle($bordersRightStyle);\n                }\n                // bit: 11-8; mask: 0x00000F00; top style\n                if ($bordersTopStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x00000F00 & self::getInt4d($recordData, 10)) >> 8)) {\n                    $objStyle->getBorders()->getTop()->setBorderStyle($bordersTopStyle);\n                }\n                // bit: 15-12; mask: 0x0000F000; bottom style\n                if ($bordersBottomStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x0000F000 & self::getInt4d($recordData, 10)) >> 12)) {\n                    $objStyle->getBorders()->getBottom()->setBorderStyle($bordersBottomStyle);\n                }\n                // bit: 22-16; mask: 0x007F0000; left color\n                $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & self::getInt4d($recordData, 10)) >> 16;\n\n                // bit: 29-23; mask: 0x3F800000; right color\n                $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & self::getInt4d($recordData, 10)) >> 23;\n\n                // bit: 30; mask: 0x40000000; 1 = diagonal line from top left to right bottom\n                $diagonalDown = (0x40000000 & self::getInt4d($recordData, 10)) >> 30 ? true : false;\n\n                // bit: 31; mask: 0x80000000; 1 = diagonal line from bottom left to top right\n                $diagonalUp = (0x80000000 & self::getInt4d($recordData, 10)) >> 31 ? true : false;\n\n                if ($diagonalUp == false && $diagonalDown == false) {\n                    $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_NONE);\n                } elseif ($diagonalUp == true && $diagonalDown == false) {\n                    $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_UP);\n                } elseif ($diagonalUp == false && $diagonalDown == true) {\n                    $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_DOWN);\n                } elseif ($diagonalUp == true && $diagonalDown == true) {\n                    $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_BOTH);\n                }\n\n                // offset: 14; size: 4;\n                // bit: 6-0; mask: 0x0000007F; top color\n                $objStyle->getBorders()->getTop()->colorIndex = (0x0000007F & self::getInt4d($recordData, 14)) >> 0;\n\n                // bit: 13-7; mask: 0x00003F80; bottom color\n                $objStyle->getBorders()->getBottom()->colorIndex = (0x00003F80 & self::getInt4d($recordData, 14)) >> 7;\n\n                // bit: 20-14; mask: 0x001FC000; diagonal color\n                $objStyle->getBorders()->getDiagonal()->colorIndex = (0x001FC000 & self::getInt4d($recordData, 14)) >> 14;\n\n                // bit: 24-21; mask: 0x01E00000; diagonal style\n                if ($bordersDiagonalStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x01E00000 & self::getInt4d($recordData, 14)) >> 21)) {\n                    $objStyle->getBorders()->getDiagonal()->setBorderStyle($bordersDiagonalStyle);\n                }\n\n                // bit: 31-26; mask: 0xFC000000 fill pattern\n                if ($fillType = PHPExcel_Reader_Excel5_Style_FillPattern::lookup((0xFC000000 & self::getInt4d($recordData, 14)) >> 26)) {\n                    $objStyle->getFill()->setFillType($fillType);\n                }\n                // offset: 18; size: 2; pattern and background colour\n                // bit: 6-0; mask: 0x007F; color index for pattern color\n                $objStyle->getFill()->startcolorIndex = (0x007F & self::getInt2d($recordData, 18)) >> 0;\n\n                // bit: 13-7; mask: 0x3F80; color index for pattern background\n                $objStyle->getFill()->endcolorIndex = (0x3F80 & self::getInt2d($recordData, 18)) >> 7;\n            } else {\n                // BIFF5\n\n                // offset: 7; size: 1; Text orientation and flags\n                $orientationAndFlags = ord($recordData{7});\n\n                // bit: 1-0; mask: 0x03; XF_ORIENTATION: Text orientation\n                $xfOrientation = (0x03 & $orientationAndFlags) >> 0;\n                switch ($xfOrientation) {\n                    case 0:\n                        $objStyle->getAlignment()->setTextRotation(0);\n                        break;\n                    case 1:\n                        $objStyle->getAlignment()->setTextRotation(-165);\n                        break;\n                    case 2:\n                        $objStyle->getAlignment()->setTextRotation(90);\n                        break;\n                    case 3:\n                        $objStyle->getAlignment()->setTextRotation(-90);\n                        break;\n                }\n\n                // offset: 8; size: 4; cell border lines and background area\n                $borderAndBackground = self::getInt4d($recordData, 8);\n\n                // bit: 6-0; mask: 0x0000007F; color index for pattern color\n                $objStyle->getFill()->startcolorIndex = (0x0000007F & $borderAndBackground) >> 0;\n\n                // bit: 13-7; mask: 0x00003F80; color index for pattern background\n                $objStyle->getFill()->endcolorIndex = (0x00003F80 & $borderAndBackground) >> 7;\n\n                // bit: 21-16; mask: 0x003F0000; fill pattern\n                $objStyle->getFill()->setFillType(PHPExcel_Reader_Excel5_Style_FillPattern::lookup((0x003F0000 & $borderAndBackground) >> 16));\n\n                // bit: 24-22; mask: 0x01C00000; bottom line style\n                $objStyle->getBorders()->getBottom()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x01C00000 & $borderAndBackground) >> 22));\n\n                // bit: 31-25; mask: 0xFE000000; bottom line color\n                $objStyle->getBorders()->getBottom()->colorIndex = (0xFE000000 & $borderAndBackground) >> 25;\n\n                // offset: 12; size: 4; cell border lines\n                $borderLines = self::getInt4d($recordData, 12);\n\n                // bit: 2-0; mask: 0x00000007; top line style\n                $objStyle->getBorders()->getTop()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x00000007 & $borderLines) >> 0));\n\n                // bit: 5-3; mask: 0x00000038; left line style\n                $objStyle->getBorders()->getLeft()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x00000038 & $borderLines) >> 3));\n\n                // bit: 8-6; mask: 0x000001C0; right line style\n                $objStyle->getBorders()->getRight()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x000001C0 & $borderLines) >> 6));\n\n                // bit: 15-9; mask: 0x0000FE00; top line color index\n                $objStyle->getBorders()->getTop()->colorIndex = (0x0000FE00 & $borderLines) >> 9;\n\n                // bit: 22-16; mask: 0x007F0000; left line color index\n                $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & $borderLines) >> 16;\n\n                // bit: 29-23; mask: 0x3F800000; right line color index\n                $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & $borderLines) >> 23;\n            }\n\n            // add cellStyleXf or cellXf and update mapping\n            if ($isCellStyleXf) {\n                // we only read one style XF record which is always the first\n                if ($this->xfIndex == 0) {\n                    $this->phpExcel->addCellStyleXf($objStyle);\n                    $this->mapCellStyleXfIndex[$this->xfIndex] = 0;\n                }\n            } else {\n                // we read all cell XF records\n                $this->phpExcel->addCellXf($objStyle);\n                $this->mapCellXfIndex[$this->xfIndex] = count($this->phpExcel->getCellXfCollection()) - 1;\n            }\n\n            // update XF index for when we read next record\n            ++$this->xfIndex;\n        }\n    }\n\n\n    /**\n     *\n     */\n    private function readXfExt()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; 0x087D = repeated header\n\n            // offset: 2; size: 2\n\n            // offset: 4; size: 8; not used\n\n            // offset: 12; size: 2; record version\n\n            // offset: 14; size: 2; index to XF record which this record modifies\n            $ixfe = self::getInt2d($recordData, 14);\n\n            // offset: 16; size: 2; not used\n\n            // offset: 18; size: 2; number of extension properties that follow\n            $cexts = self::getInt2d($recordData, 18);\n\n            // start reading the actual extension data\n            $offset = 20;\n            while ($offset < $length) {\n                // extension type\n                $extType = self::getInt2d($recordData, $offset);\n\n                // extension length\n                $cb = self::getInt2d($recordData, $offset + 2);\n\n                // extension data\n                $extData = substr($recordData, $offset + 4, $cb);\n\n                switch ($extType) {\n                    case 4:        // fill start color\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $fill = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFill();\n                                $fill->getStartColor()->setRGB($rgb);\n                                unset($fill->startcolorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 5:        // fill end color\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $fill = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFill();\n                                $fill->getEndColor()->setRGB($rgb);\n                                unset($fill->endcolorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 7:        // border color top\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $top = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getTop();\n                                $top->getColor()->setRGB($rgb);\n                                unset($top->colorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 8:        // border color bottom\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $bottom = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getBottom();\n                                $bottom->getColor()->setRGB($rgb);\n                                unset($bottom->colorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 9:        // border color left\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $left = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getLeft();\n                                $left->getColor()->setRGB($rgb);\n                                unset($left->colorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 10:        // border color right\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $right = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getRight();\n                                $right->getColor()->setRGB($rgb);\n                                unset($right->colorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 11:        // border color diagonal\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $diagonal = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getDiagonal();\n                                $diagonal->getColor()->setRGB($rgb);\n                                unset($diagonal->colorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                    case 13:    // font color\n                        $xclfType  = self::getInt2d($extData, 0); // color type\n                        $xclrValue = substr($extData, 4, 4); // color value (value based on color type)\n\n                        if ($xclfType == 2) {\n                            $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2}));\n\n                            // modify the relevant style property\n                            if (isset($this->mapCellXfIndex[$ixfe])) {\n                                $font = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFont();\n                                $font->getColor()->setRGB($rgb);\n                                unset($font->colorIndex); // normal color index does not apply, discard\n                            }\n                        }\n                        break;\n                }\n\n                $offset += $cb;\n            }\n        }\n\n    }\n\n\n    /**\n     * Read STYLE record\n     */\n    private function readStyle()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; index to XF record and flag for built-in style\n            $ixfe = self::getInt2d($recordData, 0);\n\n            // bit: 11-0; mask 0x0FFF; index to XF record\n            $xfIndex = (0x0FFF & $ixfe) >> 0;\n\n            // bit: 15; mask 0x8000; 0 = user-defined style, 1 = built-in style\n            $isBuiltIn = (bool) ((0x8000 & $ixfe) >> 15);\n\n            if ($isBuiltIn) {\n                // offset: 2; size: 1; identifier for built-in style\n                $builtInId = ord($recordData{2});\n\n                switch ($builtInId) {\n                    case 0x00:\n                        // currently, we are not using this for anything\n                        break;\n                    default:\n                        break;\n                }\n            } else {\n                // user-defined; not supported by PHPExcel\n            }\n        }\n    }\n\n\n    /**\n     * Read PALETTE record\n     */\n    private function readPalette()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; number of following colors\n            $nm = self::getInt2d($recordData, 0);\n\n            // list of RGB colors\n            for ($i = 0; $i < $nm; ++$i) {\n                $rgb = substr($recordData, 2 + 4 * $i, 4);\n                $this->palette[] = self::readRGB($rgb);\n            }\n        }\n    }\n\n\n    /**\n     * SHEET\n     *\n     * This record is  located in the  Workbook Globals\n     * Substream  and represents a sheet inside the workbook.\n     * One SHEET record is written for each sheet. It stores the\n     * sheet name and a stream offset to the BOF record of the\n     * respective Sheet Substream within the Workbook Stream.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readSheet()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // offset: 0; size: 4; absolute stream position of the BOF record of the sheet\n        // NOTE: not encrypted\n        $rec_offset = self::getInt4d($this->data, $this->pos + 4);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 4; size: 1; sheet state\n        switch (ord($recordData{4})) {\n            case 0x00:\n                $sheetState = PHPExcel_Worksheet::SHEETSTATE_VISIBLE;\n                break;\n            case 0x01:\n                $sheetState = PHPExcel_Worksheet::SHEETSTATE_HIDDEN;\n                break;\n            case 0x02:\n                $sheetState = PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN;\n                break;\n            default:\n                $sheetState = PHPExcel_Worksheet::SHEETSTATE_VISIBLE;\n                break;\n        }\n\n        // offset: 5; size: 1; sheet type\n        $sheetType = ord($recordData{5});\n\n        // offset: 6; size: var; sheet name\n        if ($this->version == self::XLS_BIFF8) {\n            $string = self::readUnicodeStringShort(substr($recordData, 6));\n            $rec_name = $string['value'];\n        } elseif ($this->version == self::XLS_BIFF7) {\n            $string = $this->readByteStringShort(substr($recordData, 6));\n            $rec_name = $string['value'];\n        }\n\n        $this->sheets[] = array(\n            'name' => $rec_name,\n            'offset' => $rec_offset,\n            'sheetState' => $sheetState,\n            'sheetType' => $sheetType,\n        );\n    }\n\n\n    /**\n     * Read EXTERNALBOOK record\n     */\n    private function readExternalBook()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset within record data\n        $offset = 0;\n\n        // there are 4 types of records\n        if (strlen($recordData) > 4) {\n            // external reference\n            // offset: 0; size: 2; number of sheet names ($nm)\n            $nm = self::getInt2d($recordData, 0);\n            $offset += 2;\n\n            // offset: 2; size: var; encoded URL without sheet name (Unicode string, 16-bit length)\n            $encodedUrlString = self::readUnicodeStringLong(substr($recordData, 2));\n            $offset += $encodedUrlString['size'];\n\n            // offset: var; size: var; list of $nm sheet names (Unicode strings, 16-bit length)\n            $externalSheetNames = array();\n            for ($i = 0; $i < $nm; ++$i) {\n                $externalSheetNameString = self::readUnicodeStringLong(substr($recordData, $offset));\n                $externalSheetNames[] = $externalSheetNameString['value'];\n                $offset += $externalSheetNameString['size'];\n            }\n\n            // store the record data\n            $this->externalBooks[] = array(\n                'type' => 'external',\n                'encodedUrl' => $encodedUrlString['value'],\n                'externalSheetNames' => $externalSheetNames,\n            );\n        } elseif (substr($recordData, 2, 2) == pack('CC', 0x01, 0x04)) {\n            // internal reference\n            // offset: 0; size: 2; number of sheet in this document\n            // offset: 2; size: 2; 0x01 0x04\n            $this->externalBooks[] = array(\n                'type' => 'internal',\n            );\n        } elseif (substr($recordData, 0, 4) == pack('vCC', 0x0001, 0x01, 0x3A)) {\n            // add-in function\n            // offset: 0; size: 2; 0x0001\n            $this->externalBooks[] = array(\n                'type' => 'addInFunction',\n            );\n        } elseif (substr($recordData, 0, 2) == pack('v', 0x0000)) {\n            // DDE links, OLE links\n            // offset: 0; size: 2; 0x0000\n            // offset: 2; size: var; encoded source document name\n            $this->externalBooks[] = array(\n                'type' => 'DDEorOLE',\n            );\n        }\n    }\n\n\n    /**\n     * Read EXTERNNAME record.\n     */\n    private function readExternName()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // external sheet references provided for named cells\n        if ($this->version == self::XLS_BIFF8) {\n            // offset: 0; size: 2; options\n            $options = self::getInt2d($recordData, 0);\n\n            // offset: 2; size: 2;\n\n            // offset: 4; size: 2; not used\n\n            // offset: 6; size: var\n            $nameString = self::readUnicodeStringShort(substr($recordData, 6));\n\n            // offset: var; size: var; formula data\n            $offset = 6 + $nameString['size'];\n            $formula = $this->getFormulaFromStructure(substr($recordData, $offset));\n\n            $this->externalNames[] = array(\n                'name' => $nameString['value'],\n                'formula' => $formula,\n            );\n        }\n    }\n\n\n    /**\n     * Read EXTERNSHEET record\n     */\n    private function readExternSheet()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // external sheet references provided for named cells\n        if ($this->version == self::XLS_BIFF8) {\n            // offset: 0; size: 2; number of following ref structures\n            $nm = self::getInt2d($recordData, 0);\n            for ($i = 0; $i < $nm; ++$i) {\n                $this->ref[] = array(\n                    // offset: 2 + 6 * $i; index to EXTERNALBOOK record\n                    'externalBookIndex' => self::getInt2d($recordData, 2 + 6 * $i),\n                    // offset: 4 + 6 * $i; index to first sheet in EXTERNALBOOK record\n                    'firstSheetIndex' => self::getInt2d($recordData, 4 + 6 * $i),\n                    // offset: 6 + 6 * $i; index to last sheet in EXTERNALBOOK record\n                    'lastSheetIndex' => self::getInt2d($recordData, 6 + 6 * $i),\n                );\n            }\n        }\n    }\n\n\n    /**\n     * DEFINEDNAME\n     *\n     * This record is part of a Link Table. It contains the name\n     * and the token array of an internal defined name. Token\n     * arrays of defined names contain tokens with aberrant\n     * token classes.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readDefinedName()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->version == self::XLS_BIFF8) {\n            // retrieves named cells\n\n            // offset: 0; size: 2; option flags\n            $opts = self::getInt2d($recordData, 0);\n\n            // bit: 5; mask: 0x0020; 0 = user-defined name, 1 = built-in-name\n            $isBuiltInName = (0x0020 & $opts) >> 5;\n\n            // offset: 2; size: 1; keyboard shortcut\n\n            // offset: 3; size: 1; length of the name (character count)\n            $nlen = ord($recordData{3});\n\n            // offset: 4; size: 2; size of the formula data (it can happen that this is zero)\n            // note: there can also be additional data, this is not included in $flen\n            $flen = self::getInt2d($recordData, 4);\n\n            // offset: 8; size: 2; 0=Global name, otherwise index to sheet (1-based)\n            $scope = self::getInt2d($recordData, 8);\n\n            // offset: 14; size: var; Name (Unicode string without length field)\n            $string = self::readUnicodeString(substr($recordData, 14), $nlen);\n\n            // offset: var; size: $flen; formula data\n            $offset = 14 + $string['size'];\n            $formulaStructure = pack('v', $flen) . substr($recordData, $offset);\n\n            try {\n                $formula = $this->getFormulaFromStructure($formulaStructure);\n            } catch (PHPExcel_Exception $e) {\n                $formula = '';\n            }\n\n            $this->definedname[] = array(\n                'isBuiltInName' => $isBuiltInName,\n                'name' => $string['value'],\n                'formula' => $formula,\n                'scope' => $scope,\n            );\n        }\n    }\n\n\n    /**\n     * Read MSODRAWINGGROUP record\n     */\n    private function readMsoDrawingGroup()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n\n        // get spliced record data\n        $splicedRecordData = $this->getSplicedRecordData();\n        $recordData = $splicedRecordData['recordData'];\n\n        $this->drawingGroupData .= $recordData;\n    }\n\n\n    /**\n     * SST - Shared String Table\n     *\n     * This record contains a list of all strings used anywhere\n     * in the workbook. Each string occurs only once. The\n     * workbook uses indexes into the list to reference the\n     * strings.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     **/\n    private function readSst()\n    {\n        // offset within (spliced) record data\n        $pos = 0;\n\n        // get spliced record data\n        $splicedRecordData = $this->getSplicedRecordData();\n\n        $recordData = $splicedRecordData['recordData'];\n        $spliceOffsets = $splicedRecordData['spliceOffsets'];\n\n        // offset: 0; size: 4; total number of strings in the workbook\n        $pos += 4;\n\n        // offset: 4; size: 4; number of following strings ($nm)\n        $nm = self::getInt4d($recordData, 4);\n        $pos += 4;\n\n        // loop through the Unicode strings (16-bit length)\n        for ($i = 0; $i < $nm; ++$i) {\n            // number of characters in the Unicode string\n            $numChars = self::getInt2d($recordData, $pos);\n            $pos += 2;\n\n            // option flags\n            $optionFlags = ord($recordData{$pos});\n            ++$pos;\n\n            // bit: 0; mask: 0x01; 0 = compressed; 1 = uncompressed\n            $isCompressed = (($optionFlags & 0x01) == 0) ;\n\n            // bit: 2; mask: 0x02; 0 = ordinary; 1 = Asian phonetic\n            $hasAsian = (($optionFlags & 0x04) != 0);\n\n            // bit: 3; mask: 0x03; 0 = ordinary; 1 = Rich-Text\n            $hasRichText = (($optionFlags & 0x08) != 0);\n\n            if ($hasRichText) {\n                // number of Rich-Text formatting runs\n                $formattingRuns = self::getInt2d($recordData, $pos);\n                $pos += 2;\n            }\n\n            if ($hasAsian) {\n                // size of Asian phonetic setting\n                $extendedRunLength = self::getInt4d($recordData, $pos);\n                $pos += 4;\n            }\n\n            // expected byte length of character array if not split\n            $len = ($isCompressed) ? $numChars : $numChars * 2;\n\n            // look up limit position\n            foreach ($spliceOffsets as $spliceOffset) {\n                // it can happen that the string is empty, therefore we need\n                // <= and not just <\n                if ($pos <= $spliceOffset) {\n                    $limitpos = $spliceOffset;\n                    break;\n                }\n            }\n\n            if ($pos + $len <= $limitpos) {\n                // character array is not split between records\n\n                $retstr = substr($recordData, $pos, $len);\n                $pos += $len;\n            } else {\n                // character array is split between records\n\n                // first part of character array\n                $retstr = substr($recordData, $pos, $limitpos - $pos);\n\n                $bytesRead = $limitpos - $pos;\n\n                // remaining characters in Unicode string\n                $charsLeft = $numChars - (($isCompressed) ? $bytesRead : ($bytesRead / 2));\n\n                $pos = $limitpos;\n\n                // keep reading the characters\n                while ($charsLeft > 0) {\n                    // look up next limit position, in case the string span more than one continue record\n                    foreach ($spliceOffsets as $spliceOffset) {\n                        if ($pos < $spliceOffset) {\n                            $limitpos = $spliceOffset;\n                            break;\n                        }\n                    }\n\n                    // repeated option flags\n                    // OpenOffice.org documentation 5.21\n                    $option = ord($recordData{$pos});\n                    ++$pos;\n\n                    if ($isCompressed && ($option == 0)) {\n                        // 1st fragment compressed\n                        // this fragment compressed\n                        $len = min($charsLeft, $limitpos - $pos);\n                        $retstr .= substr($recordData, $pos, $len);\n                        $charsLeft -= $len;\n                        $isCompressed = true;\n                    } elseif (!$isCompressed && ($option != 0)) {\n                        // 1st fragment uncompressed\n                        // this fragment uncompressed\n                        $len = min($charsLeft * 2, $limitpos - $pos);\n                        $retstr .= substr($recordData, $pos, $len);\n                        $charsLeft -= $len / 2;\n                        $isCompressed = false;\n                    } elseif (!$isCompressed && ($option == 0)) {\n                        // 1st fragment uncompressed\n                        // this fragment compressed\n                        $len = min($charsLeft, $limitpos - $pos);\n                        for ($j = 0; $j < $len; ++$j) {\n                            $retstr .= $recordData{$pos + $j} . chr(0);\n                        }\n                        $charsLeft -= $len;\n                        $isCompressed = false;\n                    } else {\n                        // 1st fragment compressed\n                        // this fragment uncompressed\n                        $newstr = '';\n                        for ($j = 0; $j < strlen($retstr); ++$j) {\n                            $newstr .= $retstr[$j] . chr(0);\n                        }\n                        $retstr = $newstr;\n                        $len = min($charsLeft * 2, $limitpos - $pos);\n                        $retstr .= substr($recordData, $pos, $len);\n                        $charsLeft -= $len / 2;\n                        $isCompressed = false;\n                    }\n\n                    $pos += $len;\n                }\n            }\n\n            // convert to UTF-8\n            $retstr = self::encodeUTF16($retstr, $isCompressed);\n\n            // read additional Rich-Text information, if any\n            $fmtRuns = array();\n            if ($hasRichText) {\n                // list of formatting runs\n                for ($j = 0; $j < $formattingRuns; ++$j) {\n                    // first formatted character; zero-based\n                    $charPos = self::getInt2d($recordData, $pos + $j * 4);\n\n                    // index to font record\n                    $fontIndex = self::getInt2d($recordData, $pos + 2 + $j * 4);\n\n                    $fmtRuns[] = array(\n                        'charPos' => $charPos,\n                        'fontIndex' => $fontIndex,\n                    );\n                }\n                $pos += 4 * $formattingRuns;\n            }\n\n            // read additional Asian phonetics information, if any\n            if ($hasAsian) {\n                // For Asian phonetic settings, we skip the extended string data\n                $pos += $extendedRunLength;\n            }\n\n            // store the shared sting\n            $this->sst[] = array(\n                'value' => $retstr,\n                'fmtRuns' => $fmtRuns,\n            );\n        }\n\n        // getSplicedRecordData() takes care of moving current position in data stream\n    }\n\n\n    /**\n     * Read PRINTGRIDLINES record\n     */\n    private function readPrintGridlines()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) {\n            // offset: 0; size: 2; 0 = do not print sheet grid lines; 1 = print sheet gridlines\n            $printGridlines = (bool) self::getInt2d($recordData, 0);\n            $this->phpSheet->setPrintGridlines($printGridlines);\n        }\n    }\n\n\n    /**\n     * Read DEFAULTROWHEIGHT record\n     */\n    private function readDefaultRowHeight()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; option flags\n        // offset: 2; size: 2; default height for unused rows, (twips 1/20 point)\n        $height = self::getInt2d($recordData, 2);\n        $this->phpSheet->getDefaultRowDimension()->setRowHeight($height / 20);\n    }\n\n\n    /**\n     * Read SHEETPR record\n     */\n    private function readSheetPr()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2\n\n        // bit: 6; mask: 0x0040; 0 = outline buttons above outline group\n        $isSummaryBelow = (0x0040 & self::getInt2d($recordData, 0)) >> 6;\n        $this->phpSheet->setShowSummaryBelow($isSummaryBelow);\n\n        // bit: 7; mask: 0x0080; 0 = outline buttons left of outline group\n        $isSummaryRight = (0x0080 & self::getInt2d($recordData, 0)) >> 7;\n        $this->phpSheet->setShowSummaryRight($isSummaryRight);\n\n        // bit: 8; mask: 0x100; 0 = scale printout in percent, 1 = fit printout to number of pages\n        // this corresponds to radio button setting in page setup dialog in Excel\n        $this->isFitToPages = (bool) ((0x0100 & self::getInt2d($recordData, 0)) >> 8);\n    }\n\n\n    /**\n     * Read HORIZONTALPAGEBREAKS record\n     */\n    private function readHorizontalPageBreaks()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) {\n            // offset: 0; size: 2; number of the following row index structures\n            $nm = self::getInt2d($recordData, 0);\n\n            // offset: 2; size: 6 * $nm; list of $nm row index structures\n            for ($i = 0; $i < $nm; ++$i) {\n                $r = self::getInt2d($recordData, 2 + 6 * $i);\n                $cf = self::getInt2d($recordData, 2 + 6 * $i + 2);\n                $cl = self::getInt2d($recordData, 2 + 6 * $i + 4);\n\n                // not sure why two column indexes are necessary?\n                $this->phpSheet->setBreakByColumnAndRow($cf, $r, PHPExcel_Worksheet::BREAK_ROW);\n            }\n        }\n    }\n\n\n    /**\n     * Read VERTICALPAGEBREAKS record\n     */\n    private function readVerticalPageBreaks()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) {\n            // offset: 0; size: 2; number of the following column index structures\n            $nm = self::getInt2d($recordData, 0);\n\n            // offset: 2; size: 6 * $nm; list of $nm row index structures\n            for ($i = 0; $i < $nm; ++$i) {\n                $c = self::getInt2d($recordData, 2 + 6 * $i);\n                $rf = self::getInt2d($recordData, 2 + 6 * $i + 2);\n                $rl = self::getInt2d($recordData, 2 + 6 * $i + 4);\n\n                // not sure why two row indexes are necessary?\n                $this->phpSheet->setBreakByColumnAndRow($c, $rf, PHPExcel_Worksheet::BREAK_COLUMN);\n            }\n        }\n    }\n\n\n    /**\n     * Read HEADER record\n     */\n    private function readHeader()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: var\n            // realized that $recordData can be empty even when record exists\n            if ($recordData) {\n                if ($this->version == self::XLS_BIFF8) {\n                    $string = self::readUnicodeStringLong($recordData);\n                } else {\n                    $string = $this->readByteStringShort($recordData);\n                }\n\n                $this->phpSheet->getHeaderFooter()->setOddHeader($string['value']);\n                $this->phpSheet->getHeaderFooter()->setEvenHeader($string['value']);\n            }\n        }\n    }\n\n\n    /**\n     * Read FOOTER record\n     */\n    private function readFooter()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: var\n            // realized that $recordData can be empty even when record exists\n            if ($recordData) {\n                if ($this->version == self::XLS_BIFF8) {\n                    $string = self::readUnicodeStringLong($recordData);\n                } else {\n                    $string = $this->readByteStringShort($recordData);\n                }\n                $this->phpSheet->getHeaderFooter()->setOddFooter($string['value']);\n                $this->phpSheet->getHeaderFooter()->setEvenFooter($string['value']);\n            }\n        }\n    }\n\n\n    /**\n     * Read HCENTER record\n     */\n    private function readHcenter()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; 0 = print sheet left aligned, 1 = print sheet centered horizontally\n            $isHorizontalCentered = (bool) self::getInt2d($recordData, 0);\n\n            $this->phpSheet->getPageSetup()->setHorizontalCentered($isHorizontalCentered);\n        }\n    }\n\n\n    /**\n     * Read VCENTER record\n     */\n    private function readVcenter()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; 0 = print sheet aligned at top page border, 1 = print sheet vertically centered\n            $isVerticalCentered = (bool) self::getInt2d($recordData, 0);\n\n            $this->phpSheet->getPageSetup()->setVerticalCentered($isVerticalCentered);\n        }\n    }\n\n\n    /**\n     * Read LEFTMARGIN record\n     */\n    private function readLeftMargin()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 8\n            $this->phpSheet->getPageMargins()->setLeft(self::extractNumber($recordData));\n        }\n    }\n\n\n    /**\n     * Read RIGHTMARGIN record\n     */\n    private function readRightMargin()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 8\n            $this->phpSheet->getPageMargins()->setRight(self::extractNumber($recordData));\n        }\n    }\n\n\n    /**\n     * Read TOPMARGIN record\n     */\n    private function readTopMargin()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 8\n            $this->phpSheet->getPageMargins()->setTop(self::extractNumber($recordData));\n        }\n    }\n\n\n    /**\n     * Read BOTTOMMARGIN record\n     */\n    private function readBottomMargin()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 8\n            $this->phpSheet->getPageMargins()->setBottom(self::extractNumber($recordData));\n        }\n    }\n\n\n    /**\n     * Read PAGESETUP record\n     */\n    private function readPageSetup()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; paper size\n            $paperSize = self::getInt2d($recordData, 0);\n\n            // offset: 2; size: 2; scaling factor\n            $scale = self::getInt2d($recordData, 2);\n\n            // offset: 6; size: 2; fit worksheet width to this number of pages, 0 = use as many as needed\n            $fitToWidth = self::getInt2d($recordData, 6);\n\n            // offset: 8; size: 2; fit worksheet height to this number of pages, 0 = use as many as needed\n            $fitToHeight = self::getInt2d($recordData, 8);\n\n            // offset: 10; size: 2; option flags\n\n            // bit: 1; mask: 0x0002; 0=landscape, 1=portrait\n            $isPortrait = (0x0002 & self::getInt2d($recordData, 10)) >> 1;\n\n            // bit: 2; mask: 0x0004; 1= paper size, scaling factor, paper orient. not init\n            // when this bit is set, do not use flags for those properties\n            $isNotInit = (0x0004 & self::getInt2d($recordData, 10)) >> 2;\n\n            if (!$isNotInit) {\n                $this->phpSheet->getPageSetup()->setPaperSize($paperSize);\n                switch ($isPortrait) {\n                    case 0:\n                        $this->phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);\n                        break;\n                    case 1:\n                        $this->phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT);\n                        break;\n                }\n\n                $this->phpSheet->getPageSetup()->setScale($scale, false);\n                $this->phpSheet->getPageSetup()->setFitToPage((bool) $this->isFitToPages);\n                $this->phpSheet->getPageSetup()->setFitToWidth($fitToWidth, false);\n                $this->phpSheet->getPageSetup()->setFitToHeight($fitToHeight, false);\n            }\n\n            // offset: 16; size: 8; header margin (IEEE 754 floating-point value)\n            $marginHeader = self::extractNumber(substr($recordData, 16, 8));\n            $this->phpSheet->getPageMargins()->setHeader($marginHeader);\n\n            // offset: 24; size: 8; footer margin (IEEE 754 floating-point value)\n            $marginFooter = self::extractNumber(substr($recordData, 24, 8));\n            $this->phpSheet->getPageMargins()->setFooter($marginFooter);\n        }\n    }\n\n\n    /**\n     * PROTECT - Sheet protection (BIFF2 through BIFF8)\n     *   if this record is omitted, then it also means no sheet protection\n     */\n    private function readProtect()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        // offset: 0; size: 2;\n\n        // bit 0, mask 0x01; 1 = sheet is protected\n        $bool = (0x01 & self::getInt2d($recordData, 0)) >> 0;\n        $this->phpSheet->getProtection()->setSheet((bool)$bool);\n    }\n\n\n    /**\n     * SCENPROTECT\n     */\n    private function readScenProtect()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        // offset: 0; size: 2;\n\n        // bit: 0, mask 0x01; 1 = scenarios are protected\n        $bool = (0x01 & self::getInt2d($recordData, 0)) >> 0;\n\n        $this->phpSheet->getProtection()->setScenarios((bool)$bool);\n    }\n\n\n    /**\n     * OBJECTPROTECT\n     */\n    private function readObjectProtect()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        // offset: 0; size: 2;\n\n        // bit: 0, mask 0x01; 1 = objects are protected\n        $bool = (0x01 & self::getInt2d($recordData, 0)) >> 0;\n\n        $this->phpSheet->getProtection()->setObjects((bool)$bool);\n    }\n\n\n    /**\n     * PASSWORD - Sheet protection (hashed) password (BIFF2 through BIFF8)\n     */\n    private function readPassword()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; 16-bit hash value of password\n            $password = strtoupper(dechex(self::getInt2d($recordData, 0))); // the hashed password\n            $this->phpSheet->getProtection()->setPassword($password, true);\n        }\n    }\n\n\n    /**\n     * Read DEFCOLWIDTH record\n     */\n    private function readDefColWidth()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; default column width\n        $width = self::getInt2d($recordData, 0);\n        if ($width != 8) {\n            $this->phpSheet->getDefaultColumnDimension()->setWidth($width);\n        }\n    }\n\n\n    /**\n     * Read COLINFO record\n     */\n    private function readColInfo()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; index to first column in range\n            $fc = self::getInt2d($recordData, 0); // first column index\n\n            // offset: 2; size: 2; index to last column in range\n            $lc = self::getInt2d($recordData, 2); // first column index\n\n            // offset: 4; size: 2; width of the column in 1/256 of the width of the zero character\n            $width = self::getInt2d($recordData, 4);\n\n            // offset: 6; size: 2; index to XF record for default column formatting\n            $xfIndex = self::getInt2d($recordData, 6);\n\n            // offset: 8; size: 2; option flags\n            // bit: 0; mask: 0x0001; 1= columns are hidden\n            $isHidden = (0x0001 & self::getInt2d($recordData, 8)) >> 0;\n\n            // bit: 10-8; mask: 0x0700; outline level of the columns (0 = no outline)\n            $level = (0x0700 & self::getInt2d($recordData, 8)) >> 8;\n\n            // bit: 12; mask: 0x1000; 1 = collapsed\n            $isCollapsed = (0x1000 & self::getInt2d($recordData, 8)) >> 12;\n\n            // offset: 10; size: 2; not used\n\n            for ($i = $fc; $i <= $lc; ++$i) {\n                if ($lc == 255 || $lc == 256) {\n                    $this->phpSheet->getDefaultColumnDimension()->setWidth($width / 256);\n                    break;\n                }\n                $this->phpSheet->getColumnDimensionByColumn($i)->setWidth($width / 256);\n                $this->phpSheet->getColumnDimensionByColumn($i)->setVisible(!$isHidden);\n                $this->phpSheet->getColumnDimensionByColumn($i)->setOutlineLevel($level);\n                $this->phpSheet->getColumnDimensionByColumn($i)->setCollapsed($isCollapsed);\n                $this->phpSheet->getColumnDimensionByColumn($i)->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n        }\n    }\n\n\n    /**\n     * ROW\n     *\n     * This record contains the properties of a single row in a\n     * sheet. Rows and cells in a sheet are divided into blocks\n     * of 32 rows.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readRow()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; index of this row\n            $r = self::getInt2d($recordData, 0);\n\n            // offset: 2; size: 2; index to column of the first cell which is described by a cell record\n\n            // offset: 4; size: 2; index to column of the last cell which is described by a cell record, increased by 1\n\n            // offset: 6; size: 2;\n\n            // bit: 14-0; mask: 0x7FFF; height of the row, in twips = 1/20 of a point\n            $height = (0x7FFF & self::getInt2d($recordData, 6)) >> 0;\n\n            // bit: 15: mask: 0x8000; 0 = row has custom height; 1= row has default height\n            $useDefaultHeight = (0x8000 & self::getInt2d($recordData, 6)) >> 15;\n\n            if (!$useDefaultHeight) {\n                $this->phpSheet->getRowDimension($r + 1)->setRowHeight($height / 20);\n            }\n\n            // offset: 8; size: 2; not used\n\n            // offset: 10; size: 2; not used in BIFF5-BIFF8\n\n            // offset: 12; size: 4; option flags and default row formatting\n\n            // bit: 2-0: mask: 0x00000007; outline level of the row\n            $level = (0x00000007 & self::getInt4d($recordData, 12)) >> 0;\n            $this->phpSheet->getRowDimension($r + 1)->setOutlineLevel($level);\n\n            // bit: 4; mask: 0x00000010; 1 = outline group start or ends here... and is collapsed\n            $isCollapsed = (0x00000010 & self::getInt4d($recordData, 12)) >> 4;\n            $this->phpSheet->getRowDimension($r + 1)->setCollapsed($isCollapsed);\n\n            // bit: 5; mask: 0x00000020; 1 = row is hidden\n            $isHidden = (0x00000020 & self::getInt4d($recordData, 12)) >> 5;\n            $this->phpSheet->getRowDimension($r + 1)->setVisible(!$isHidden);\n\n            // bit: 7; mask: 0x00000080; 1 = row has explicit format\n            $hasExplicitFormat = (0x00000080 & self::getInt4d($recordData, 12)) >> 7;\n\n            // bit: 27-16; mask: 0x0FFF0000; only applies when hasExplicitFormat = 1; index to XF record\n            $xfIndex = (0x0FFF0000 & self::getInt4d($recordData, 12)) >> 16;\n\n            if ($hasExplicitFormat) {\n                $this->phpSheet->getRowDimension($r + 1)->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n        }\n    }\n\n\n    /**\n     * Read RK record\n     * This record represents a cell that contains an RK value\n     * (encoded integer or floating-point value). If a\n     * floating-point value cannot be encoded to an RK value,\n     * a NUMBER record will be written. This record replaces the\n     * record INTEGER written in BIFF2.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readRk()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; index to row\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; index to column\n        $column = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($column);\n\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            // offset: 4; size: 2; index to XF record\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            // offset: 6; size: 4; RK value\n            $rknum = self::getInt4d($recordData, 6);\n            $numValue = self::getIEEE754($rknum);\n\n            $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n            if (!$this->readDataOnly) {\n                // add style information\n                $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n\n            // add cell\n            $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n        }\n    }\n\n\n    /**\n     * Read LABELSST record\n     * This record represents a cell that contains a string. It\n     * replaces the LABEL record and RSTRING record used in\n     * BIFF2-BIFF5.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readLabelSst()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; index to row\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; index to column\n        $column = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($column);\n\n        $emptyCell = true;\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            // offset: 4; size: 2; index to XF record\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            // offset: 6; size: 4; index to SST record\n            $index = self::getInt4d($recordData, 6);\n\n            // add cell\n            if (($fmtRuns = $this->sst[$index]['fmtRuns']) && !$this->readDataOnly) {\n                // then we should treat as rich text\n                $richText = new PHPExcel_RichText();\n                $charPos = 0;\n                $sstCount = count($this->sst[$index]['fmtRuns']);\n                for ($i = 0; $i <= $sstCount; ++$i) {\n                    if (isset($fmtRuns[$i])) {\n                        $text = PHPExcel_Shared_String::Substring($this->sst[$index]['value'], $charPos, $fmtRuns[$i]['charPos'] - $charPos);\n                        $charPos = $fmtRuns[$i]['charPos'];\n                    } else {\n                        $text = PHPExcel_Shared_String::Substring($this->sst[$index]['value'], $charPos, PHPExcel_Shared_String::CountCharacters($this->sst[$index]['value']));\n                    }\n\n                    if (PHPExcel_Shared_String::CountCharacters($text) > 0) {\n                        if ($i == 0) { // first text run, no style\n                            $richText->createText($text);\n                        } else {\n                            $textRun = $richText->createTextRun($text);\n                            if (isset($fmtRuns[$i - 1])) {\n                                if ($fmtRuns[$i - 1]['fontIndex'] < 4) {\n                                    $fontIndex = $fmtRuns[$i - 1]['fontIndex'];\n                                } else {\n                                    // this has to do with that index 4 is omitted in all BIFF versions for some strange reason\n                                    // check the OpenOffice documentation of the FONT record\n                                    $fontIndex = $fmtRuns[$i - 1]['fontIndex'] - 1;\n                                }\n                                $textRun->setFont(clone $this->objFonts[$fontIndex]);\n                            }\n                        }\n                    }\n                }\n                if ($this->readEmptyCells || trim($richText->getPlainText()) !== '') {\n                    $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n                    $cell->setValueExplicit($richText, PHPExcel_Cell_DataType::TYPE_STRING);\n                    $emptyCell = false;\n                }\n            } else {\n                if ($this->readEmptyCells || trim($this->sst[$index]['value']) !== '') {\n                    $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n                    $cell->setValueExplicit($this->sst[$index]['value'], PHPExcel_Cell_DataType::TYPE_STRING);\n                    $emptyCell = false;\n                }\n            }\n\n            if (!$this->readDataOnly && !$emptyCell) {\n                // add style information\n                $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n        }\n    }\n\n\n    /**\n     * Read MULRK record\n     * This record represents a cell range containing RK value\n     * cells. All cells are located in the same row.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readMulRk()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; index to row\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; index to first column\n        $colFirst = self::getInt2d($recordData, 2);\n\n        // offset: var; size: 2; index to last column\n        $colLast = self::getInt2d($recordData, $length - 2);\n        $columns = $colLast - $colFirst + 1;\n\n        // offset within record data\n        $offset = 4;\n\n        for ($i = 0; $i < $columns; ++$i) {\n            $columnString = PHPExcel_Cell::stringFromColumnIndex($colFirst + $i);\n\n            // Read cell?\n            if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n                // offset: var; size: 2; index to XF record\n                $xfIndex = self::getInt2d($recordData, $offset);\n\n                // offset: var; size: 4; RK value\n                $numValue = self::getIEEE754(self::getInt4d($recordData, $offset + 2));\n                $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n                if (!$this->readDataOnly) {\n                    // add style\n                    $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n                }\n\n                // add cell value\n                $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n            }\n\n            $offset += 6;\n        }\n    }\n\n\n    /**\n     * Read NUMBER record\n     * This record represents a cell that contains a\n     * floating-point value.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readNumber()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; index to row\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size 2; index to column\n        $column = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($column);\n\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            // offset 4; size: 2; index to XF record\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            $numValue = self::extractNumber(substr($recordData, 6, 8));\n\n            $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n            if (!$this->readDataOnly) {\n                // add cell style\n                $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n\n            // add cell value\n            $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC);\n        }\n    }\n\n\n    /**\n     * Read FORMULA record + perhaps a following STRING record if formula result is a string\n     * This record contains the token array and the result of a\n     * formula cell.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readFormula()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; row index\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; col index\n        $column = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($column);\n\n        // offset: 20: size: variable; formula structure\n        $formulaStructure = substr($recordData, 20);\n\n        // offset: 14: size: 2; option flags, recalculate always, recalculate on open etc.\n        $options = self::getInt2d($recordData, 14);\n\n        // bit: 0; mask: 0x0001; 1 = recalculate always\n        // bit: 1; mask: 0x0002; 1 = calculate on open\n        // bit: 2; mask: 0x0008; 1 = part of a shared formula\n        $isPartOfSharedFormula = (bool) (0x0008 & $options);\n\n        // WARNING:\n        // We can apparently not rely on $isPartOfSharedFormula. Even when $isPartOfSharedFormula = true\n        // the formula data may be ordinary formula data, therefore we need to check\n        // explicitly for the tExp token (0x01)\n        $isPartOfSharedFormula = $isPartOfSharedFormula && ord($formulaStructure{2}) == 0x01;\n\n        if ($isPartOfSharedFormula) {\n            // part of shared formula which means there will be a formula with a tExp token and nothing else\n            // get the base cell, grab tExp token\n            $baseRow = self::getInt2d($formulaStructure, 3);\n            $baseCol = self::getInt2d($formulaStructure, 5);\n            $this->_baseCell = PHPExcel_Cell::stringFromColumnIndex($baseCol). ($baseRow + 1);\n        }\n\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            if ($isPartOfSharedFormula) {\n                // formula is added to this cell after the sheet has been read\n                $this->sharedFormulaParts[$columnString . ($row + 1)] = $this->_baseCell;\n            }\n\n            // offset: 16: size: 4; not used\n\n            // offset: 4; size: 2; XF index\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            // offset: 6; size: 8; result of the formula\n            if ((ord($recordData{6}) == 0) && (ord($recordData{12}) == 255) && (ord($recordData{13}) == 255)) {\n                // String formula. Result follows in appended STRING record\n                $dataType = PHPExcel_Cell_DataType::TYPE_STRING;\n\n                // read possible SHAREDFMLA record\n                $code = self::getInt2d($this->data, $this->pos);\n                if ($code == self::XLS_TYPE_SHAREDFMLA) {\n                    $this->readSharedFmla();\n                }\n\n                // read STRING record\n                $value = $this->readString();\n            } elseif ((ord($recordData{6}) == 1)\n                && (ord($recordData{12}) == 255)\n                && (ord($recordData{13}) == 255)) {\n                // Boolean formula. Result is in +2; 0=false, 1=true\n                $dataType = PHPExcel_Cell_DataType::TYPE_BOOL;\n                $value = (bool) ord($recordData{8});\n            } elseif ((ord($recordData{6}) == 2)\n                && (ord($recordData{12}) == 255)\n                && (ord($recordData{13}) == 255)) {\n                // Error formula. Error code is in +2\n                $dataType = PHPExcel_Cell_DataType::TYPE_ERROR;\n                $value = PHPExcel_Reader_Excel5_ErrorCode::lookup(ord($recordData{8}));\n            } elseif ((ord($recordData{6}) == 3)\n                && (ord($recordData{12}) == 255)\n                && (ord($recordData{13}) == 255)) {\n                // Formula result is a null string\n                $dataType = PHPExcel_Cell_DataType::TYPE_NULL;\n                $value = '';\n            } else {\n                // forumla result is a number, first 14 bytes like _NUMBER record\n                $dataType = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                $value = self::extractNumber(substr($recordData, 6, 8));\n            }\n\n            $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n            if (!$this->readDataOnly) {\n                // add cell style\n                $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n\n            // store the formula\n            if (!$isPartOfSharedFormula) {\n                // not part of shared formula\n                // add cell value. If we can read formula, populate with formula, otherwise just used cached value\n                try {\n                    if ($this->version != self::XLS_BIFF8) {\n                        throw new PHPExcel_Reader_Exception('Not BIFF8. Can only read BIFF8 formulas');\n                    }\n                    $formula = $this->getFormulaFromStructure($formulaStructure); // get formula in human language\n                    $cell->setValueExplicit('=' . $formula, PHPExcel_Cell_DataType::TYPE_FORMULA);\n\n                } catch (PHPExcel_Exception $e) {\n                    $cell->setValueExplicit($value, $dataType);\n                }\n            } else {\n                if ($this->version == self::XLS_BIFF8) {\n                    // do nothing at this point, formula id added later in the code\n                } else {\n                    $cell->setValueExplicit($value, $dataType);\n                }\n            }\n\n            // store the cached calculated value\n            $cell->setCalculatedValue($value);\n        }\n    }\n\n\n    /**\n     * Read a SHAREDFMLA record. This function just stores the binary shared formula in the reader,\n     * which usually contains relative references.\n     * These will be used to construct the formula in each shared formula part after the sheet is read.\n     */\n    private function readSharedFmla()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0, size: 6; cell range address of the area used by the shared formula, not used for anything\n        $cellRange = substr($recordData, 0, 6);\n        $cellRange = $this->readBIFF5CellRangeAddressFixed($cellRange); // note: even BIFF8 uses BIFF5 syntax\n\n        // offset: 6, size: 1; not used\n\n        // offset: 7, size: 1; number of existing FORMULA records for this shared formula\n        $no = ord($recordData{7});\n\n        // offset: 8, size: var; Binary token array of the shared formula\n        $formula = substr($recordData, 8);\n\n        // at this point we only store the shared formula for later use\n        $this->sharedFormulas[$this->_baseCell] = $formula;\n    }\n\n\n    /**\n     * Read a STRING record from current stream position and advance the stream pointer to next record\n     * This record is used for storing result from FORMULA record when it is a string, and\n     * it occurs directly after the FORMULA record\n     *\n     * @return string The string contents as UTF-8\n     */\n    private function readString()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->version == self::XLS_BIFF8) {\n            $string = self::readUnicodeStringLong($recordData);\n            $value = $string['value'];\n        } else {\n            $string = $this->readByteStringLong($recordData);\n            $value = $string['value'];\n        }\n\n        return $value;\n    }\n\n\n    /**\n     * Read BOOLERR record\n     * This record represents a Boolean value or error value\n     * cell.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readBoolErr()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; row index\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; column index\n        $column = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($column);\n\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            // offset: 4; size: 2; index to XF record\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            // offset: 6; size: 1; the boolean value or error value\n            $boolErr = ord($recordData{6});\n\n            // offset: 7; size: 1; 0=boolean; 1=error\n            $isError = ord($recordData{7});\n\n            $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n            switch ($isError) {\n                case 0: // boolean\n                    $value = (bool) $boolErr;\n\n                    // add cell value\n                    $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_BOOL);\n                    break;\n                case 1: // error type\n                    $value = PHPExcel_Reader_Excel5_ErrorCode::lookup($boolErr);\n\n                    // add cell value\n                    $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_ERROR);\n                    break;\n            }\n\n            if (!$this->readDataOnly) {\n                // add cell style\n                $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n        }\n    }\n\n\n    /**\n     * Read MULBLANK record\n     * This record represents a cell range of empty cells. All\n     * cells are located in the same row\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readMulBlank()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; index to row\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; index to first column\n        $fc = self::getInt2d($recordData, 2);\n\n        // offset: 4; size: 2 x nc; list of indexes to XF records\n        // add style information\n        if (!$this->readDataOnly && $this->readEmptyCells) {\n            for ($i = 0; $i < $length / 2 - 3; ++$i) {\n                $columnString = PHPExcel_Cell::stringFromColumnIndex($fc + $i);\n\n                // Read cell?\n                if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n                    $xfIndex = self::getInt2d($recordData, 4 + 2 * $i);\n                    $this->phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n                }\n            }\n        }\n\n        // offset: 6; size 2; index to last column (not needed)\n    }\n\n\n    /**\n     * Read LABEL record\n     * This record represents a cell that contains a string. In\n     * BIFF8 it is usually replaced by the LABELSST record.\n     * Excel still uses this record, if it copies unformatted\n     * text cells to the clipboard.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readLabel()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; index to row\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; index to column\n        $column = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($column);\n\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            // offset: 4; size: 2; XF index\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            // add cell value\n            // todo: what if string is very long? continue record\n            if ($this->version == self::XLS_BIFF8) {\n                $string = self::readUnicodeStringLong(substr($recordData, 6));\n                $value = $string['value'];\n            } else {\n                $string = $this->readByteStringLong(substr($recordData, 6));\n                $value = $string['value'];\n            }\n            if ($this->readEmptyCells || trim($value) !== '') {\n                $cell = $this->phpSheet->getCell($columnString . ($row + 1));\n                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);\n\n                if (!$this->readDataOnly) {\n                    // add cell style\n                    $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n                }\n            }\n        }\n    }\n\n\n    /**\n     * Read BLANK record\n     */\n    private function readBlank()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; row index\n        $row = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; col index\n        $col = self::getInt2d($recordData, 2);\n        $columnString = PHPExcel_Cell::stringFromColumnIndex($col);\n\n        // Read cell?\n        if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) {\n            // offset: 4; size: 2; XF index\n            $xfIndex = self::getInt2d($recordData, 4);\n\n            // add style information\n            if (!$this->readDataOnly && $this->readEmptyCells) {\n                $this->phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->mapCellXfIndex[$xfIndex]);\n            }\n        }\n    }\n\n\n    /**\n     * Read MSODRAWING record\n     */\n    private function readMsoDrawing()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n\n        // get spliced record data\n        $splicedRecordData = $this->getSplicedRecordData();\n        $recordData = $splicedRecordData['recordData'];\n\n        $this->drawingData .= $recordData;\n    }\n\n\n    /**\n     * Read OBJ record\n     */\n    private function readObj()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly || $this->version != self::XLS_BIFF8) {\n            return;\n        }\n\n        // recordData consists of an array of subrecords looking like this:\n        //    ft: 2 bytes; ftCmo type (0x15)\n        //    cb: 2 bytes; size in bytes of ftCmo data\n        //    ot: 2 bytes; Object Type\n        //    id: 2 bytes; Object id number\n        //    grbit: 2 bytes; Option Flags\n        //    data: var; subrecord data\n\n        // for now, we are just interested in the second subrecord containing the object type\n        $ftCmoType  = self::getInt2d($recordData, 0);\n        $cbCmoSize  = self::getInt2d($recordData, 2);\n        $otObjType  = self::getInt2d($recordData, 4);\n        $idObjID    = self::getInt2d($recordData, 6);\n        $grbitOpts  = self::getInt2d($recordData, 6);\n\n        $this->objs[] = array(\n            'ftCmoType' => $ftCmoType,\n            'cbCmoSize' => $cbCmoSize,\n            'otObjType' => $otObjType,\n            'idObjID'   => $idObjID,\n            'grbitOpts' => $grbitOpts\n        );\n        $this->textObjRef = $idObjID;\n\n//        echo '<b>_readObj()</b><br />';\n//        var_dump(end($this->objs));\n//        echo '<br />';\n    }\n\n\n    /**\n     * Read WINDOW2 record\n     */\n    private function readWindow2()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; option flags\n        $options = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; index to first visible row\n        $firstVisibleRow = self::getInt2d($recordData, 2);\n\n        // offset: 4; size: 2; index to first visible colum\n        $firstVisibleColumn = self::getInt2d($recordData, 4);\n        if ($this->version === self::XLS_BIFF8) {\n            // offset:  8; size: 2; not used\n            // offset: 10; size: 2; cached magnification factor in page break preview (in percent); 0 = Default (60%)\n            // offset: 12; size: 2; cached magnification factor in normal view (in percent); 0 = Default (100%)\n            // offset: 14; size: 4; not used\n            $zoomscaleInPageBreakPreview = self::getInt2d($recordData, 10);\n            if ($zoomscaleInPageBreakPreview === 0) {\n                $zoomscaleInPageBreakPreview = 60;\n            }\n            $zoomscaleInNormalView = self::getInt2d($recordData, 12);\n            if ($zoomscaleInNormalView === 0) {\n                $zoomscaleInNormalView = 100;\n            }\n        }\n\n        // bit: 1; mask: 0x0002; 0 = do not show gridlines, 1 = show gridlines\n        $showGridlines = (bool) ((0x0002 & $options) >> 1);\n        $this->phpSheet->setShowGridlines($showGridlines);\n\n        // bit: 2; mask: 0x0004; 0 = do not show headers, 1 = show headers\n        $showRowColHeaders = (bool) ((0x0004 & $options) >> 2);\n        $this->phpSheet->setShowRowColHeaders($showRowColHeaders);\n\n        // bit: 3; mask: 0x0008; 0 = panes are not frozen, 1 = panes are frozen\n        $this->frozen = (bool) ((0x0008 & $options) >> 3);\n\n        // bit: 6; mask: 0x0040; 0 = columns from left to right, 1 = columns from right to left\n        $this->phpSheet->setRightToLeft((bool)((0x0040 & $options) >> 6));\n\n        // bit: 10; mask: 0x0400; 0 = sheet not active, 1 = sheet active\n        $isActive = (bool) ((0x0400 & $options) >> 10);\n        if ($isActive) {\n            $this->phpExcel->setActiveSheetIndex($this->phpExcel->getIndex($this->phpSheet));\n        }\n\n        // bit: 11; mask: 0x0800; 0 = normal view, 1 = page break view\n        $isPageBreakPreview = (bool) ((0x0800 & $options) >> 11);\n\n        //FIXME: set $firstVisibleRow and $firstVisibleColumn\n\n        if ($this->phpSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT) {\n            //NOTE: this setting is inferior to page layout view(Excel2007-)\n            $view = $isPageBreakPreview ? PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW : PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL;\n            $this->phpSheet->getSheetView()->setView($view);\n            if ($this->version === self::XLS_BIFF8) {\n                $zoomScale = $isPageBreakPreview ? $zoomscaleInPageBreakPreview : $zoomscaleInNormalView;\n                $this->phpSheet->getSheetView()->setZoomScale($zoomScale);\n                $this->phpSheet->getSheetView()->setZoomScaleNormal($zoomscaleInNormalView);\n            }\n        }\n    }\n\n    /**\n     * Read PLV Record(Created by Excel2007 or upper)\n     */\n    private function readPageLayoutView()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        //var_dump(unpack(\"vrt/vgrbitFrt/V2reserved/vwScalePLV/vgrbit\", $recordData));\n\n        // offset: 0; size: 2; rt\n        //->ignore\n        $rt = self::getInt2d($recordData, 0);\n        // offset: 2; size: 2; grbitfr\n        //->ignore\n        $grbitFrt = self::getInt2d($recordData, 2);\n        // offset: 4; size: 8; reserved\n        //->ignore\n\n        // offset: 12; size 2; zoom scale\n        $wScalePLV = self::getInt2d($recordData, 12);\n        // offset: 14; size 2; grbit\n        $grbit = self::getInt2d($recordData, 14);\n\n        // decomprise grbit\n        $fPageLayoutView   = $grbit & 0x01;\n        $fRulerVisible     = ($grbit >> 1) & 0x01; //no support\n        $fWhitespaceHidden = ($grbit >> 3) & 0x01; //no support\n\n        if ($fPageLayoutView === 1) {\n            $this->phpSheet->getSheetView()->setView(PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT);\n            $this->phpSheet->getSheetView()->setZoomScale($wScalePLV); //set by Excel2007 only if SHEETVIEW_PAGE_LAYOUT\n        }\n        //otherwise, we cannot know whether SHEETVIEW_PAGE_LAYOUT or SHEETVIEW_PAGE_BREAK_PREVIEW.\n    }\n\n    /**\n     * Read SCL record\n     */\n    private function readScl()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // offset: 0; size: 2; numerator of the view magnification\n        $numerator = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; numerator of the view magnification\n        $denumerator = self::getInt2d($recordData, 2);\n\n        // set the zoom scale (in percent)\n        $this->phpSheet->getSheetView()->setZoomScale($numerator * 100 / $denumerator);\n    }\n\n\n    /**\n     * Read PANE record\n     */\n    private function readPane()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; position of vertical split\n            $px = self::getInt2d($recordData, 0);\n\n            // offset: 2; size: 2; position of horizontal split\n            $py = self::getInt2d($recordData, 2);\n\n            if ($this->frozen) {\n                // frozen panes\n                $this->phpSheet->freezePane(PHPExcel_Cell::stringFromColumnIndex($px) . ($py + 1));\n            } else {\n                // unfrozen panes; split windows; not supported by PHPExcel core\n            }\n        }\n    }\n\n\n    /**\n     * Read SELECTION record. There is one such record for each pane in the sheet.\n     */\n    private function readSelection()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 1; pane identifier\n            $paneId = ord($recordData{0});\n\n            // offset: 1; size: 2; index to row of the active cell\n            $r = self::getInt2d($recordData, 1);\n\n            // offset: 3; size: 2; index to column of the active cell\n            $c = self::getInt2d($recordData, 3);\n\n            // offset: 5; size: 2; index into the following cell range list to the\n            //  entry that contains the active cell\n            $index = self::getInt2d($recordData, 5);\n\n            // offset: 7; size: var; cell range address list containing all selected cell ranges\n            $data = substr($recordData, 7);\n            $cellRangeAddressList = $this->readBIFF5CellRangeAddressList($data); // note: also BIFF8 uses BIFF5 syntax\n\n            $selectedCells = $cellRangeAddressList['cellRangeAddresses'][0];\n\n            // first row '1' + last row '16384' indicates that full column is selected (apparently also in BIFF8!)\n            if (preg_match('/^([A-Z]+1\\:[A-Z]+)16384$/', $selectedCells)) {\n                $selectedCells = preg_replace('/^([A-Z]+1\\:[A-Z]+)16384$/', '${1}1048576', $selectedCells);\n            }\n\n            // first row '1' + last row '65536' indicates that full column is selected\n            if (preg_match('/^([A-Z]+1\\:[A-Z]+)65536$/', $selectedCells)) {\n                $selectedCells = preg_replace('/^([A-Z]+1\\:[A-Z]+)65536$/', '${1}1048576', $selectedCells);\n            }\n\n            // first column 'A' + last column 'IV' indicates that full row is selected\n            if (preg_match('/^(A[0-9]+\\:)IV([0-9]+)$/', $selectedCells)) {\n                $selectedCells = preg_replace('/^(A[0-9]+\\:)IV([0-9]+)$/', '${1}XFD${2}', $selectedCells);\n            }\n\n            $this->phpSheet->setSelectedCells($selectedCells);\n        }\n    }\n\n\n    private function includeCellRangeFiltered($cellRangeAddress)\n    {\n        $includeCellRange = true;\n        if ($this->getReadFilter() !== null) {\n            $includeCellRange = false;\n            $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($cellRangeAddress);\n            $rangeBoundaries[1][0]++;\n            for ($row = $rangeBoundaries[0][1]; $row <= $rangeBoundaries[1][1]; $row++) {\n                for ($column = $rangeBoundaries[0][0]; $column != $rangeBoundaries[1][0]; $column++) {\n                    if ($this->getReadFilter()->readCell($column, $row, $this->phpSheet->getTitle())) {\n                        $includeCellRange = true;\n                        break 2;\n                    }\n                }\n            }\n        }\n        return $includeCellRange;\n    }\n\n\n    /**\n     * MERGEDCELLS\n     *\n     * This record contains the addresses of merged cell ranges\n     * in the current sheet.\n     *\n     * --    \"OpenOffice.org's Documentation of the Microsoft\n     *         Excel File Format\"\n     */\n    private function readMergedCells()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) {\n            $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($recordData);\n            foreach ($cellRangeAddressList['cellRangeAddresses'] as $cellRangeAddress) {\n                if ((strpos($cellRangeAddress, ':') !== false) &&\n                    ($this->includeCellRangeFiltered($cellRangeAddress))) {\n                    $this->phpSheet->mergeCells($cellRangeAddress);\n                }\n            }\n        }\n    }\n\n\n    /**\n     * Read HYPERLINK record\n     */\n    private function readHyperLink()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer forward to next record\n        $this->pos += 4 + $length;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 8; cell range address of all cells containing this hyperlink\n            try {\n                $cellRange = $this->readBIFF8CellRangeAddressFixed($recordData, 0, 8);\n            } catch (PHPExcel_Exception $e) {\n                return;\n            }\n\n            // offset: 8, size: 16; GUID of StdLink\n\n            // offset: 24, size: 4; unknown value\n\n            // offset: 28, size: 4; option flags\n            // bit: 0; mask: 0x00000001; 0 = no link or extant, 1 = file link or URL\n            $isFileLinkOrUrl = (0x00000001 & self::getInt2d($recordData, 28)) >> 0;\n\n            // bit: 1; mask: 0x00000002; 0 = relative path, 1 = absolute path or URL\n            $isAbsPathOrUrl = (0x00000001 & self::getInt2d($recordData, 28)) >> 1;\n\n            // bit: 2 (and 4); mask: 0x00000014; 0 = no description\n            $hasDesc = (0x00000014 & self::getInt2d($recordData, 28)) >> 2;\n\n            // bit: 3; mask: 0x00000008; 0 = no text, 1 = has text\n            $hasText = (0x00000008 & self::getInt2d($recordData, 28)) >> 3;\n\n            // bit: 7; mask: 0x00000080; 0 = no target frame, 1 = has target frame\n            $hasFrame = (0x00000080 & self::getInt2d($recordData, 28)) >> 7;\n\n            // bit: 8; mask: 0x00000100; 0 = file link or URL, 1 = UNC path (inc. server name)\n            $isUNC = (0x00000100 & self::getInt2d($recordData, 28)) >> 8;\n\n            // offset within record data\n            $offset = 32;\n\n            if ($hasDesc) {\n                // offset: 32; size: var; character count of description text\n                $dl = self::getInt4d($recordData, 32);\n                // offset: 36; size: var; character array of description text, no Unicode string header, always 16-bit characters, zero terminated\n                $desc = self::encodeUTF16(substr($recordData, 36, 2 * ($dl - 1)), false);\n                $offset += 4 + 2 * $dl;\n            }\n            if ($hasFrame) {\n                $fl = self::getInt4d($recordData, $offset);\n                $offset += 4 + 2 * $fl;\n            }\n\n            // detect type of hyperlink (there are 4 types)\n            $hyperlinkType = null;\n\n            if ($isUNC) {\n                $hyperlinkType = 'UNC';\n            } elseif (!$isFileLinkOrUrl) {\n                $hyperlinkType = 'workbook';\n            } elseif (ord($recordData{$offset}) == 0x03) {\n                $hyperlinkType = 'local';\n            } elseif (ord($recordData{$offset}) == 0xE0) {\n                $hyperlinkType = 'URL';\n            }\n\n            switch ($hyperlinkType) {\n                case 'URL':\n                    // section 5.58.2: Hyperlink containing a URL\n                    // e.g. http://example.org/index.php\n\n                    // offset: var; size: 16; GUID of URL Moniker\n                    $offset += 16;\n                    // offset: var; size: 4; size (in bytes) of character array of the URL including trailing zero word\n                    $us = self::getInt4d($recordData, $offset);\n                    $offset += 4;\n                    // offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated\n                    $url = self::encodeUTF16(substr($recordData, $offset, $us - 2), false);\n                    $nullOffset = strpos($url, 0x00);\n                    if ($nullOffset) {\n                        $url = substr($url, 0, $nullOffset);\n                    }\n                    $url .= $hasText ? '#' : '';\n                    $offset += $us;\n                    break;\n                case 'local':\n                    // section 5.58.3: Hyperlink to local file\n                    // examples:\n                    //   mydoc.txt\n                    //   ../../somedoc.xls#Sheet!A1\n\n                    // offset: var; size: 16; GUI of File Moniker\n                    $offset += 16;\n\n                    // offset: var; size: 2; directory up-level count.\n                    $upLevelCount = self::getInt2d($recordData, $offset);\n                    $offset += 2;\n\n                    // offset: var; size: 4; character count of the shortened file path and name, including trailing zero word\n                    $sl = self::getInt4d($recordData, $offset);\n                    $offset += 4;\n\n                    // offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string)\n                    $shortenedFilePath = substr($recordData, $offset, $sl);\n                    $shortenedFilePath = self::encodeUTF16($shortenedFilePath, true);\n                    $shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero\n\n                    $offset += $sl;\n\n                    // offset: var; size: 24; unknown sequence\n                    $offset += 24;\n\n                    // extended file path\n                    // offset: var; size: 4; size of the following file link field including string lenth mark\n                    $sz = self::getInt4d($recordData, $offset);\n                    $offset += 4;\n\n                    // only present if $sz > 0\n                    if ($sz > 0) {\n                        // offset: var; size: 4; size of the character array of the extended file path and name\n                        $xl = self::getInt4d($recordData, $offset);\n                        $offset += 4;\n\n                        // offset: var; size 2; unknown\n                        $offset += 2;\n\n                        // offset: var; size $xl; character array of the extended file path and name.\n                        $extendedFilePath = substr($recordData, $offset, $xl);\n                        $extendedFilePath = self::encodeUTF16($extendedFilePath, false);\n                        $offset += $xl;\n                    }\n\n                    // construct the path\n                    $url = str_repeat('..\\\\', $upLevelCount);\n                    $url .= ($sz > 0) ? $extendedFilePath : $shortenedFilePath; // use extended path if available\n                    $url .= $hasText ? '#' : '';\n\n                    break;\n                case 'UNC':\n                    // section 5.58.4: Hyperlink to a File with UNC (Universal Naming Convention) Path\n                    // todo: implement\n                    return;\n                case 'workbook':\n                    // section 5.58.5: Hyperlink to the Current Workbook\n                    // e.g. Sheet2!B1:C2, stored in text mark field\n                    $url = 'sheet://';\n                    break;\n                default:\n                    return;\n            }\n\n            if ($hasText) {\n                // offset: var; size: 4; character count of text mark including trailing zero word\n                $tl = self::getInt4d($recordData, $offset);\n                $offset += 4;\n                // offset: var; size: var; character array of the text mark without the # sign, no Unicode header, always 16-bit characters, zero-terminated\n                $text = self::encodeUTF16(substr($recordData, $offset, 2 * ($tl - 1)), false);\n                $url .= $text;\n            }\n\n            // apply the hyperlink to all the relevant cells\n            foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cellRange) as $coordinate) {\n                $this->phpSheet->getCell($coordinate)->getHyperLink()->setUrl($url);\n            }\n        }\n    }\n\n\n    /**\n     * Read DATAVALIDATIONS record\n     */\n    private function readDataValidations()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer forward to next record\n        $this->pos += 4 + $length;\n    }\n\n\n    /**\n     * Read DATAVALIDATION record\n     */\n    private function readDataValidation()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer forward to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        // offset: 0; size: 4; Options\n        $options = self::getInt4d($recordData, 0);\n\n        // bit: 0-3; mask: 0x0000000F; type\n        $type = (0x0000000F & $options) >> 0;\n        switch ($type) {\n            case 0x00:\n                $type = PHPExcel_Cell_DataValidation::TYPE_NONE;\n                break;\n            case 0x01:\n                $type = PHPExcel_Cell_DataValidation::TYPE_WHOLE;\n                break;\n            case 0x02:\n                $type = PHPExcel_Cell_DataValidation::TYPE_DECIMAL;\n                break;\n            case 0x03:\n                $type = PHPExcel_Cell_DataValidation::TYPE_LIST;\n                break;\n            case 0x04:\n                $type = PHPExcel_Cell_DataValidation::TYPE_DATE;\n                break;\n            case 0x05:\n                $type = PHPExcel_Cell_DataValidation::TYPE_TIME;\n                break;\n            case 0x06:\n                $type = PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH;\n                break;\n            case 0x07:\n                $type = PHPExcel_Cell_DataValidation::TYPE_CUSTOM;\n                break;\n        }\n\n        // bit: 4-6; mask: 0x00000070; error type\n        $errorStyle = (0x00000070 & $options) >> 4;\n        switch ($errorStyle) {\n            case 0x00:\n                $errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;\n                break;\n            case 0x01:\n                $errorStyle = PHPExcel_Cell_DataValidation::STYLE_WARNING;\n                break;\n            case 0x02:\n                $errorStyle = PHPExcel_Cell_DataValidation::STYLE_INFORMATION;\n                break;\n        }\n\n        // bit: 7; mask: 0x00000080; 1= formula is explicit (only applies to list)\n        // I have only seen cases where this is 1\n        $explicitFormula = (0x00000080 & $options) >> 7;\n\n        // bit: 8; mask: 0x00000100; 1= empty cells allowed\n        $allowBlank = (0x00000100 & $options) >> 8;\n\n        // bit: 9; mask: 0x00000200; 1= suppress drop down arrow in list type validity\n        $suppressDropDown = (0x00000200 & $options) >> 9;\n\n        // bit: 18; mask: 0x00040000; 1= show prompt box if cell selected\n        $showInputMessage = (0x00040000 & $options) >> 18;\n\n        // bit: 19; mask: 0x00080000; 1= show error box if invalid values entered\n        $showErrorMessage = (0x00080000 & $options) >> 19;\n\n        // bit: 20-23; mask: 0x00F00000; condition operator\n        $operator = (0x00F00000 & $options) >> 20;\n        switch ($operator) {\n            case 0x00:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN;\n                break;\n            case 0x01:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_NOTBETWEEN;\n                break;\n            case 0x02:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_EQUAL;\n                break;\n            case 0x03:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_NOTEQUAL;\n                break;\n            case 0x04:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHAN;\n                break;\n            case 0x05:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_LESSTHAN;\n                break;\n            case 0x06:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHANOREQUAL;\n                break;\n            case 0x07:\n                $operator = PHPExcel_Cell_DataValidation::OPERATOR_LESSTHANOREQUAL;\n                break;\n        }\n\n        // offset: 4; size: var; title of the prompt box\n        $offset = 4;\n        $string = self::readUnicodeStringLong(substr($recordData, $offset));\n        $promptTitle = $string['value'] !== chr(0) ? $string['value'] : '';\n        $offset += $string['size'];\n\n        // offset: var; size: var; title of the error box\n        $string = self::readUnicodeStringLong(substr($recordData, $offset));\n        $errorTitle = $string['value'] !== chr(0) ? $string['value'] : '';\n        $offset += $string['size'];\n\n        // offset: var; size: var; text of the prompt box\n        $string = self::readUnicodeStringLong(substr($recordData, $offset));\n        $prompt = $string['value'] !== chr(0) ? $string['value'] : '';\n        $offset += $string['size'];\n\n        // offset: var; size: var; text of the error box\n        $string = self::readUnicodeStringLong(substr($recordData, $offset));\n        $error = $string['value'] !== chr(0) ? $string['value'] : '';\n        $offset += $string['size'];\n\n        // offset: var; size: 2; size of the formula data for the first condition\n        $sz1 = self::getInt2d($recordData, $offset);\n        $offset += 2;\n\n        // offset: var; size: 2; not used\n        $offset += 2;\n\n        // offset: var; size: $sz1; formula data for first condition (without size field)\n        $formula1 = substr($recordData, $offset, $sz1);\n        $formula1 = pack('v', $sz1) . $formula1; // prepend the length\n        try {\n            $formula1 = $this->getFormulaFromStructure($formula1);\n\n            // in list type validity, null characters are used as item separators\n            if ($type == PHPExcel_Cell_DataValidation::TYPE_LIST) {\n                $formula1 = str_replace(chr(0), ',', $formula1);\n            }\n        } catch (PHPExcel_Exception $e) {\n            return;\n        }\n        $offset += $sz1;\n\n        // offset: var; size: 2; size of the formula data for the first condition\n        $sz2 = self::getInt2d($recordData, $offset);\n        $offset += 2;\n\n        // offset: var; size: 2; not used\n        $offset += 2;\n\n        // offset: var; size: $sz2; formula data for second condition (without size field)\n        $formula2 = substr($recordData, $offset, $sz2);\n        $formula2 = pack('v', $sz2) . $formula2; // prepend the length\n        try {\n            $formula2 = $this->getFormulaFromStructure($formula2);\n        } catch (PHPExcel_Exception $e) {\n            return;\n        }\n        $offset += $sz2;\n\n        // offset: var; size: var; cell range address list with\n        $cellRangeAddressList = $this->readBIFF8CellRangeAddressList(substr($recordData, $offset));\n        $cellRangeAddresses = $cellRangeAddressList['cellRangeAddresses'];\n\n        foreach ($cellRangeAddresses as $cellRange) {\n            $stRange = $this->phpSheet->shrinkRangeToFit($cellRange);\n            foreach (PHPExcel_Cell::extractAllCellReferencesInRange($stRange) as $coordinate) {\n                $objValidation = $this->phpSheet->getCell($coordinate)->getDataValidation();\n                $objValidation->setType($type);\n                $objValidation->setErrorStyle($errorStyle);\n                $objValidation->setAllowBlank((bool)$allowBlank);\n                $objValidation->setShowInputMessage((bool)$showInputMessage);\n                $objValidation->setShowErrorMessage((bool)$showErrorMessage);\n                $objValidation->setShowDropDown(!$suppressDropDown);\n                $objValidation->setOperator($operator);\n                $objValidation->setErrorTitle($errorTitle);\n                $objValidation->setError($error);\n                $objValidation->setPromptTitle($promptTitle);\n                $objValidation->setPrompt($prompt);\n                $objValidation->setFormula1($formula1);\n                $objValidation->setFormula2($formula2);\n            }\n        }\n    }\n\n    /**\n     * Read SHEETLAYOUT record. Stores sheet tab color information.\n     */\n    private function readSheetLayout()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // local pointer in record data\n        $offset = 0;\n\n        if (!$this->readDataOnly) {\n            // offset: 0; size: 2; repeated record identifier 0x0862\n\n            // offset: 2; size: 10; not used\n\n            // offset: 12; size: 4; size of record data\n            // Excel 2003 uses size of 0x14 (documented), Excel 2007 uses size of 0x28 (not documented?)\n            $sz = self::getInt4d($recordData, 12);\n\n            switch ($sz) {\n                case 0x14:\n                    // offset: 16; size: 2; color index for sheet tab\n                    $colorIndex = self::getInt2d($recordData, 16);\n                    $color = PHPExcel_Reader_Excel5_Color::map($colorIndex, $this->palette, $this->version);\n                    $this->phpSheet->getTabColor()->setRGB($color['rgb']);\n                    break;\n                case 0x28:\n                    // TODO: Investigate structure for .xls SHEETLAYOUT record as saved by MS Office Excel 2007\n                    return;\n                    break;\n            }\n        }\n    }\n\n\n    /**\n     * Read SHEETPROTECTION record (FEATHEADR)\n     */\n    private function readSheetProtection()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        if ($this->readDataOnly) {\n            return;\n        }\n\n        // offset: 0; size: 2; repeated record header\n\n        // offset: 2; size: 2; FRT cell reference flag (=0 currently)\n\n        // offset: 4; size: 8; Currently not used and set to 0\n\n        // offset: 12; size: 2; Shared feature type index (2=Enhanced Protetion, 4=SmartTag)\n        $isf = self::getInt2d($recordData, 12);\n        if ($isf != 2) {\n            return;\n        }\n\n        // offset: 14; size: 1; =1 since this is a feat header\n\n        // offset: 15; size: 4; size of rgbHdrSData\n\n        // rgbHdrSData, assume \"Enhanced Protection\"\n        // offset: 19; size: 2; option flags\n        $options = self::getInt2d($recordData, 19);\n\n        // bit: 0; mask 0x0001; 1 = user may edit objects, 0 = users must not edit objects\n        $bool = (0x0001 & $options) >> 0;\n        $this->phpSheet->getProtection()->setObjects(!$bool);\n\n        // bit: 1; mask 0x0002; edit scenarios\n        $bool = (0x0002 & $options) >> 1;\n        $this->phpSheet->getProtection()->setScenarios(!$bool);\n\n        // bit: 2; mask 0x0004; format cells\n        $bool = (0x0004 & $options) >> 2;\n        $this->phpSheet->getProtection()->setFormatCells(!$bool);\n\n        // bit: 3; mask 0x0008; format columns\n        $bool = (0x0008 & $options) >> 3;\n        $this->phpSheet->getProtection()->setFormatColumns(!$bool);\n\n        // bit: 4; mask 0x0010; format rows\n        $bool = (0x0010 & $options) >> 4;\n        $this->phpSheet->getProtection()->setFormatRows(!$bool);\n\n        // bit: 5; mask 0x0020; insert columns\n        $bool = (0x0020 & $options) >> 5;\n        $this->phpSheet->getProtection()->setInsertColumns(!$bool);\n\n        // bit: 6; mask 0x0040; insert rows\n        $bool = (0x0040 & $options) >> 6;\n        $this->phpSheet->getProtection()->setInsertRows(!$bool);\n\n        // bit: 7; mask 0x0080; insert hyperlinks\n        $bool = (0x0080 & $options) >> 7;\n        $this->phpSheet->getProtection()->setInsertHyperlinks(!$bool);\n\n        // bit: 8; mask 0x0100; delete columns\n        $bool = (0x0100 & $options) >> 8;\n        $this->phpSheet->getProtection()->setDeleteColumns(!$bool);\n\n        // bit: 9; mask 0x0200; delete rows\n        $bool = (0x0200 & $options) >> 9;\n        $this->phpSheet->getProtection()->setDeleteRows(!$bool);\n\n        // bit: 10; mask 0x0400; select locked cells\n        $bool = (0x0400 & $options) >> 10;\n        $this->phpSheet->getProtection()->setSelectLockedCells(!$bool);\n\n        // bit: 11; mask 0x0800; sort cell range\n        $bool = (0x0800 & $options) >> 11;\n        $this->phpSheet->getProtection()->setSort(!$bool);\n\n        // bit: 12; mask 0x1000; auto filter\n        $bool = (0x1000 & $options) >> 12;\n        $this->phpSheet->getProtection()->setAutoFilter(!$bool);\n\n        // bit: 13; mask 0x2000; pivot tables\n        $bool = (0x2000 & $options) >> 13;\n        $this->phpSheet->getProtection()->setPivotTables(!$bool);\n\n        // bit: 14; mask 0x4000; select unlocked cells\n        $bool = (0x4000 & $options) >> 14;\n        $this->phpSheet->getProtection()->setSelectUnlockedCells(!$bool);\n\n        // offset: 21; size: 2; not used\n    }\n\n\n    /**\n     * Read RANGEPROTECTION record\n     * Reading of this record is based on Microsoft Office Excel 97-2000 Binary File Format Specification,\n     * where it is referred to as FEAT record\n     */\n    private function readRangeProtection()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n\n        // local pointer in record data\n        $offset = 0;\n\n        if (!$this->readDataOnly) {\n            $offset += 12;\n\n            // offset: 12; size: 2; shared feature type, 2 = enhanced protection, 4 = smart tag\n            $isf = self::getInt2d($recordData, 12);\n            if ($isf != 2) {\n                // we only read FEAT records of type 2\n                return;\n            }\n            $offset += 2;\n\n            $offset += 5;\n\n            // offset: 19; size: 2; count of ref ranges this feature is on\n            $cref = self::getInt2d($recordData, 19);\n            $offset += 2;\n\n            $offset += 6;\n\n            // offset: 27; size: 8 * $cref; list of cell ranges (like in hyperlink record)\n            $cellRanges = array();\n            for ($i = 0; $i < $cref; ++$i) {\n                try {\n                    $cellRange = $this->readBIFF8CellRangeAddressFixed(substr($recordData, 27 + 8 * $i, 8));\n                } catch (PHPExcel_Exception $e) {\n                    return;\n                }\n                $cellRanges[] = $cellRange;\n                $offset += 8;\n            }\n\n            // offset: var; size: var; variable length of feature specific data\n            $rgbFeat = substr($recordData, $offset);\n            $offset += 4;\n\n            // offset: var; size: 4; the encrypted password (only 16-bit although field is 32-bit)\n            $wPassword = self::getInt4d($recordData, $offset);\n            $offset += 4;\n\n            // Apply range protection to sheet\n            if ($cellRanges) {\n                $this->phpSheet->protectCells(implode(' ', $cellRanges), strtoupper(dechex($wPassword)), true);\n            }\n        }\n    }\n\n\n    /**\n     * Read IMDATA record\n     */\n    private function readImData()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n\n        // get spliced record data\n        $splicedRecordData = $this->getSplicedRecordData();\n        $recordData = $splicedRecordData['recordData'];\n\n        // UNDER CONSTRUCTION\n\n        // offset: 0; size: 2; image format\n        $cf = self::getInt2d($recordData, 0);\n\n        // offset: 2; size: 2; environment from which the file was written\n        $env = self::getInt2d($recordData, 2);\n\n        // offset: 4; size: 4; length of the image data\n        $lcb = self::getInt4d($recordData, 4);\n\n        // offset: 8; size: var; image data\n        $iData = substr($recordData, 8);\n\n        switch ($cf) {\n            case 0x09: // Windows bitmap format\n                // BITMAPCOREINFO\n                // 1. BITMAPCOREHEADER\n                // offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure\n                $bcSize = self::getInt4d($iData, 0);\n    //            var_dump($bcSize);\n\n                // offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels\n                $bcWidth = self::getInt2d($iData, 4);\n    //            var_dump($bcWidth);\n\n                // offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels.\n                $bcHeight = self::getInt2d($iData, 6);\n    //            var_dump($bcHeight);\n                $ih = imagecreatetruecolor($bcWidth, $bcHeight);\n\n                // offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1\n\n                // offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24\n                $bcBitCount = self::getInt2d($iData, 10);\n    //            var_dump($bcBitCount);\n\n                $rgbString = substr($iData, 12);\n                $rgbTriples = array();\n                while (strlen($rgbString) > 0) {\n                    $rgbTriples[] = unpack('Cb/Cg/Cr', $rgbString);\n                    $rgbString = substr($rgbString, 3);\n                }\n                $x = 0;\n                $y = 0;\n                foreach ($rgbTriples as $i => $rgbTriple) {\n                    $color = imagecolorallocate($ih, $rgbTriple['r'], $rgbTriple['g'], $rgbTriple['b']);\n                    imagesetpixel($ih, $x, $bcHeight - 1 - $y, $color);\n                    $x = ($x + 1) % $bcWidth;\n                    $y = $y + floor(($x + 1) / $bcWidth);\n                }\n                //imagepng($ih, 'image.png');\n\n                $drawing = new PHPExcel_Worksheet_Drawing();\n                $drawing->setPath($filename);\n                $drawing->setWorksheet($this->phpSheet);\n                break;\n            case 0x02: // Windows metafile or Macintosh PICT format\n            case 0x0e: // native format\n            default:\n                break;\n        }\n\n        // getSplicedRecordData() takes care of moving current position in data stream\n    }\n\n\n    /**\n     * Read a free CONTINUE record. Free CONTINUE record may be a camouflaged MSODRAWING record\n     * When MSODRAWING data on a sheet exceeds 8224 bytes, CONTINUE records are used instead. Undocumented.\n     * In this case, we must treat the CONTINUE record as a MSODRAWING record\n     */\n    private function readContinue()\n    {\n        $length = self::getInt2d($this->data, $this->pos + 2);\n        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);\n\n        // check if we are reading drawing data\n        // this is in case a free CONTINUE record occurs in other circumstances we are unaware of\n        if ($this->drawingData == '') {\n            // move stream pointer to next record\n            $this->pos += 4 + $length;\n\n            return;\n        }\n\n        // check if record data is at least 4 bytes long, otherwise there is no chance this is MSODRAWING data\n        if ($length < 4) {\n            // move stream pointer to next record\n            $this->pos += 4 + $length;\n\n            return;\n        }\n\n        // dirty check to see if CONTINUE record could be a camouflaged MSODRAWING record\n        // look inside CONTINUE record to see if it looks like a part of an Escher stream\n        // we know that Escher stream may be split at least at\n        //        0xF003 MsofbtSpgrContainer\n        //        0xF004 MsofbtSpContainer\n        //        0xF00D MsofbtClientTextbox\n        $validSplitPoints = array(0xF003, 0xF004, 0xF00D); // add identifiers if we find more\n\n        $splitPoint = self::getInt2d($recordData, 2);\n        if (in_array($splitPoint, $validSplitPoints)) {\n            // get spliced record data (and move pointer to next record)\n            $splicedRecordData = $this->getSplicedRecordData();\n            $this->drawingData .= $splicedRecordData['recordData'];\n\n            return;\n        }\n\n        // move stream pointer to next record\n        $this->pos += 4 + $length;\n    }\n\n\n    /**\n     * Reads a record from current position in data stream and continues reading data as long as CONTINUE\n     * records are found. Splices the record data pieces and returns the combined string as if record data\n     * is in one piece.\n     * Moves to next current position in data stream to start of next record different from a CONtINUE record\n     *\n     * @return array\n     */\n    private function getSplicedRecordData()\n    {\n        $data = '';\n        $spliceOffsets = array();\n\n        $i = 0;\n        $spliceOffsets[0] = 0;\n\n        do {\n            ++$i;\n\n            // offset: 0; size: 2; identifier\n            $identifier = self::getInt2d($this->data, $this->pos);\n            // offset: 2; size: 2; length\n            $length = self::getInt2d($this->data, $this->pos + 2);\n            $data .= $this->readRecordData($this->data, $this->pos + 4, $length);\n\n            $spliceOffsets[$i] = $spliceOffsets[$i - 1] + $length;\n\n            $this->pos += 4 + $length;\n            $nextIdentifier = self::getInt2d($this->data, $this->pos);\n        } while ($nextIdentifier == self::XLS_TYPE_CONTINUE);\n\n        $splicedData = array(\n            'recordData' => $data,\n            'spliceOffsets' => $spliceOffsets,\n        );\n\n        return $splicedData;\n\n    }\n\n\n    /**\n     * Convert formula structure into human readable Excel formula like 'A3+A5*5'\n     *\n     * @param string $formulaStructure The complete binary data for the formula\n     * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas\n     * @return string Human readable formula\n     */\n    private function getFormulaFromStructure($formulaStructure, $baseCell = 'A1')\n    {\n        // offset: 0; size: 2; size of the following formula data\n        $sz = self::getInt2d($formulaStructure, 0);\n\n        // offset: 2; size: sz\n        $formulaData = substr($formulaStructure, 2, $sz);\n\n        // for debug: dump the formula data\n        //echo '<xmp>';\n        //echo 'size: ' . $sz . \"\\n\";\n        //echo 'the entire formula data: ';\n        //Debug::dump($formulaData);\n        //echo \"\\n----\\n\";\n\n        // offset: 2 + sz; size: variable (optional)\n        if (strlen($formulaStructure) > 2 + $sz) {\n            $additionalData = substr($formulaStructure, 2 + $sz);\n\n            // for debug: dump the additional data\n            //echo 'the entire additional data: ';\n            //Debug::dump($additionalData);\n            //echo \"\\n----\\n\";\n        } else {\n            $additionalData = '';\n        }\n\n        return $this->getFormulaFromData($formulaData, $additionalData, $baseCell);\n    }\n\n\n    /**\n     * Take formula data and additional data for formula and return human readable formula\n     *\n     * @param string $formulaData The binary data for the formula itself\n     * @param string $additionalData Additional binary data going with the formula\n     * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas\n     * @return string Human readable formula\n     */\n    private function getFormulaFromData($formulaData, $additionalData = '', $baseCell = 'A1')\n    {\n        // start parsing the formula data\n        $tokens = array();\n\n        while (strlen($formulaData) > 0 and $token = $this->getNextToken($formulaData, $baseCell)) {\n            $tokens[] = $token;\n            $formulaData = substr($formulaData, $token['size']);\n\n            // for debug: dump the token\n            //var_dump($token);\n        }\n\n        $formulaString = $this->createFormulaFromTokens($tokens, $additionalData);\n\n        return $formulaString;\n    }\n\n\n    /**\n     * Take array of tokens together with additional data for formula and return human readable formula\n     *\n     * @param array $tokens\n     * @param array $additionalData Additional binary data going with the formula\n     * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas\n     * @return string Human readable formula\n     */\n    private function createFormulaFromTokens($tokens, $additionalData)\n    {\n        // empty formula?\n        if (empty($tokens)) {\n            return '';\n        }\n\n        $formulaStrings = array();\n        foreach ($tokens as $token) {\n            // initialize spaces\n            $space0 = isset($space0) ? $space0 : ''; // spaces before next token, not tParen\n            $space1 = isset($space1) ? $space1 : ''; // carriage returns before next token, not tParen\n            $space2 = isset($space2) ? $space2 : ''; // spaces before opening parenthesis\n            $space3 = isset($space3) ? $space3 : ''; // carriage returns before opening parenthesis\n            $space4 = isset($space4) ? $space4 : ''; // spaces before closing parenthesis\n            $space5 = isset($space5) ? $space5 : ''; // carriage returns before closing parenthesis\n\n            switch ($token['name']) {\n                case 'tAdd': // addition\n                case 'tConcat': // addition\n                case 'tDiv': // division\n                case 'tEQ': // equality\n                case 'tGE': // greater than or equal\n                case 'tGT': // greater than\n                case 'tIsect': // intersection\n                case 'tLE': // less than or equal\n                case 'tList': // less than or equal\n                case 'tLT': // less than\n                case 'tMul': // multiplication\n                case 'tNE': // multiplication\n                case 'tPower': // power\n                case 'tRange': // range\n                case 'tSub': // subtraction\n                    $op2 = array_pop($formulaStrings);\n                    $op1 = array_pop($formulaStrings);\n                    $formulaStrings[] = \"$op1$space1$space0{$token['data']}$op2\";\n                    unset($space0, $space1);\n                    break;\n                case 'tUplus': // unary plus\n                case 'tUminus': // unary minus\n                    $op = array_pop($formulaStrings);\n                    $formulaStrings[] = \"$space1$space0{$token['data']}$op\";\n                    unset($space0, $space1);\n                    break;\n                case 'tPercent': // percent sign\n                    $op = array_pop($formulaStrings);\n                    $formulaStrings[] = \"$op$space1$space0{$token['data']}\";\n                    unset($space0, $space1);\n                    break;\n                case 'tAttrVolatile': // indicates volatile function\n                case 'tAttrIf':\n                case 'tAttrSkip':\n                case 'tAttrChoose':\n                    // token is only important for Excel formula evaluator\n                    // do nothing\n                    break;\n                case 'tAttrSpace': // space / carriage return\n                    // space will be used when next token arrives, do not alter formulaString stack\n                    switch ($token['data']['spacetype']) {\n                        case 'type0':\n                            $space0 = str_repeat(' ', $token['data']['spacecount']);\n                            break;\n                        case 'type1':\n                            $space1 = str_repeat(\"\\n\", $token['data']['spacecount']);\n                            break;\n                        case 'type2':\n                            $space2 = str_repeat(' ', $token['data']['spacecount']);\n                            break;\n                        case 'type3':\n                            $space3 = str_repeat(\"\\n\", $token['data']['spacecount']);\n                            break;\n                        case 'type4':\n                            $space4 = str_repeat(' ', $token['data']['spacecount']);\n                            break;\n                        case 'type5':\n                            $space5 = str_repeat(\"\\n\", $token['data']['spacecount']);\n                            break;\n                    }\n                    break;\n                case 'tAttrSum': // SUM function with one parameter\n                    $op = array_pop($formulaStrings);\n                    $formulaStrings[] = \"{$space1}{$space0}SUM($op)\";\n                    unset($space0, $space1);\n                    break;\n                case 'tFunc': // function with fixed number of arguments\n                case 'tFuncV': // function with variable number of arguments\n                    if ($token['data']['function'] != '') {\n                        // normal function\n                        $ops = array(); // array of operators\n                        for ($i = 0; $i < $token['data']['args']; ++$i) {\n                            $ops[] = array_pop($formulaStrings);\n                        }\n                        $ops = array_reverse($ops);\n                        $formulaStrings[] = \"$space1$space0{$token['data']['function']}(\" . implode(',', $ops) . \")\";\n                        unset($space0, $space1);\n                    } else {\n                        // add-in function\n                        $ops = array(); // array of operators\n                        for ($i = 0; $i < $token['data']['args'] - 1; ++$i) {\n                            $ops[] = array_pop($formulaStrings);\n                        }\n                        $ops = array_reverse($ops);\n                        $function = array_pop($formulaStrings);\n                        $formulaStrings[] = \"$space1$space0$function(\" . implode(',', $ops) . \")\";\n                        unset($space0, $space1);\n                    }\n                    break;\n                case 'tParen': // parenthesis\n                    $expression = array_pop($formulaStrings);\n                    $formulaStrings[] = \"$space3$space2($expression$space5$space4)\";\n                    unset($space2, $space3, $space4, $space5);\n                    break;\n                case 'tArray': // array constant\n                    $constantArray = self::readBIFF8ConstantArray($additionalData);\n                    $formulaStrings[] = $space1 . $space0 . $constantArray['value'];\n                    $additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data\n                    unset($space0, $space1);\n                    break;\n                case 'tMemArea':\n                    // bite off chunk of additional data\n                    $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($additionalData);\n                    $additionalData = substr($additionalData, $cellRangeAddressList['size']);\n                    $formulaStrings[] = \"$space1$space0{$token['data']}\";\n                    unset($space0, $space1);\n                    break;\n                case 'tArea': // cell range address\n                case 'tBool': // boolean\n                case 'tErr': // error code\n                case 'tInt': // integer\n                case 'tMemErr':\n                case 'tMemFunc':\n                case 'tMissArg':\n                case 'tName':\n                case 'tNameX':\n                case 'tNum': // number\n                case 'tRef': // single cell reference\n                case 'tRef3d': // 3d cell reference\n                case 'tArea3d': // 3d cell range reference\n                case 'tRefN':\n                case 'tAreaN':\n                case 'tStr': // string\n                    $formulaStrings[] = \"$space1$space0{$token['data']}\";\n                    unset($space0, $space1);\n                    break;\n            }\n        }\n        $formulaString = $formulaStrings[0];\n\n        // for debug: dump the human readable formula\n        //echo '----' . \"\\n\";\n        //echo 'Formula: ' . $formulaString;\n\n        return $formulaString;\n    }\n\n\n    /**\n     * Fetch next token from binary formula data\n     *\n     * @param string Formula data\n     * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas\n     * @return array\n     * @throws PHPExcel_Reader_Exception\n     */\n    private function getNextToken($formulaData, $baseCell = 'A1')\n    {\n        // offset: 0; size: 1; token id\n        $id = ord($formulaData[0]); // token id\n        $name = false; // initialize token name\n\n        switch ($id) {\n            case 0x03:\n                $name = 'tAdd';\n                $size = 1;\n                $data = '+';\n                break;\n            case 0x04:\n                $name = 'tSub';\n                $size = 1;\n                $data = '-';\n                break;\n            case 0x05:\n                $name = 'tMul';\n                $size = 1;\n                $data = '*';\n                break;\n            case 0x06:\n                $name = 'tDiv';\n                $size = 1;\n                $data = '/';\n                break;\n            case 0x07:\n                $name = 'tPower';\n                $size = 1;\n                $data = '^';\n                break;\n            case 0x08:\n                $name = 'tConcat';\n                $size = 1;\n                $data = '&';\n                break;\n            case 0x09:\n                $name = 'tLT';\n                $size = 1;\n                $data = '<';\n                break;\n            case 0x0A:\n                $name = 'tLE';\n                $size = 1;\n                $data = '<=';\n                break;\n            case 0x0B:\n                $name = 'tEQ';\n                $size = 1;\n                $data = '=';\n                break;\n            case 0x0C:\n                $name = 'tGE';\n                $size = 1;\n                $data = '>=';\n                break;\n            case 0x0D:\n                $name = 'tGT';\n                $size = 1;\n                $data = '>';\n                break;\n            case 0x0E:\n                $name = 'tNE';\n                $size = 1;\n                $data = '<>';\n                break;\n            case 0x0F:\n                $name = 'tIsect';\n                $size = 1;\n                $data = ' ';\n                break;\n            case 0x10:\n                $name = 'tList';\n                $size = 1;\n                $data = ',';\n                break;\n            case 0x11:\n                $name = 'tRange';\n                $size = 1;\n                $data = ':';\n                break;\n            case 0x12:\n                $name = 'tUplus';\n                $size = 1;\n                $data = '+';\n                break;\n            case 0x13:\n                $name = 'tUminus';\n                $size = 1;\n                $data = '-';\n                break;\n            case 0x14:\n                $name = 'tPercent';\n                $size = 1;\n                $data = '%';\n                break;\n            case 0x15:    //    parenthesis\n                $name  = 'tParen';\n                $size  = 1;\n                $data = null;\n                break;\n            case 0x16:    //    missing argument\n                $name = 'tMissArg';\n                $size = 1;\n                $data = '';\n                break;\n            case 0x17:    //    string\n                $name = 'tStr';\n                // offset: 1; size: var; Unicode string, 8-bit string length\n                $string = self::readUnicodeStringShort(substr($formulaData, 1));\n                $size = 1 + $string['size'];\n                $data = self::UTF8toExcelDoubleQuoted($string['value']);\n                break;\n            case 0x19:    //    Special attribute\n                // offset: 1; size: 1; attribute type flags:\n                switch (ord($formulaData[1])) {\n                    case 0x01:\n                        $name = 'tAttrVolatile';\n                        $size = 4;\n                        $data = null;\n                        break;\n                    case 0x02:\n                        $name = 'tAttrIf';\n                        $size = 4;\n                        $data = null;\n                        break;\n                    case 0x04:\n                        $name = 'tAttrChoose';\n                        // offset: 2; size: 2; number of choices in the CHOOSE function ($nc, number of parameters decreased by 1)\n                        $nc = self::getInt2d($formulaData, 2);\n                        // offset: 4; size: 2 * $nc\n                        // offset: 4 + 2 * $nc; size: 2\n                        $size = 2 * $nc + 6;\n                        $data = null;\n                        break;\n                    case 0x08:\n                        $name = 'tAttrSkip';\n                        $size = 4;\n                        $data = null;\n                        break;\n                    case 0x10:\n                        $name = 'tAttrSum';\n                        $size = 4;\n                        $data = null;\n                        break;\n                    case 0x40:\n                    case 0x41:\n                        $name = 'tAttrSpace';\n                        $size = 4;\n                        // offset: 2; size: 2; space type and position\n                        switch (ord($formulaData[2])) {\n                            case 0x00:\n                                $spacetype = 'type0';\n                                break;\n                            case 0x01:\n                                $spacetype = 'type1';\n                                break;\n                            case 0x02:\n                                $spacetype = 'type2';\n                                break;\n                            case 0x03:\n                                $spacetype = 'type3';\n                                break;\n                            case 0x04:\n                                $spacetype = 'type4';\n                                break;\n                            case 0x05:\n                                $spacetype = 'type5';\n                                break;\n                            default:\n                                throw new PHPExcel_Reader_Exception('Unrecognized space type in tAttrSpace token');\n                                break;\n                        }\n                        // offset: 3; size: 1; number of inserted spaces/carriage returns\n                        $spacecount = ord($formulaData[3]);\n\n                        $data = array('spacetype' => $spacetype, 'spacecount' => $spacecount);\n                        break;\n                    default:\n                        throw new PHPExcel_Reader_Exception('Unrecognized attribute flag in tAttr token');\n                        break;\n                }\n                break;\n            case 0x1C:    //    error code\n                // offset: 1; size: 1; error code\n                $name = 'tErr';\n                $size = 2;\n                $data = PHPExcel_Reader_Excel5_ErrorCode::lookup(ord($formulaData[1]));\n                break;\n            case 0x1D:    //    boolean\n                // offset: 1; size: 1; 0 = false, 1 = true;\n                $name = 'tBool';\n                $size = 2;\n                $data = ord($formulaData[1]) ? 'TRUE' : 'FALSE';\n                break;\n            case 0x1E:    //    integer\n                // offset: 1; size: 2; unsigned 16-bit integer\n                $name = 'tInt';\n                $size = 3;\n                $data = self::getInt2d($formulaData, 1);\n                break;\n            case 0x1F:    //    number\n                // offset: 1; size: 8;\n                $name = 'tNum';\n                $size = 9;\n                $data = self::extractNumber(substr($formulaData, 1));\n                $data = str_replace(',', '.', (string)$data); // in case non-English locale\n                break;\n            case 0x20:    //    array constant\n            case 0x40:\n            case 0x60:\n                // offset: 1; size: 7; not used\n                $name = 'tArray';\n                $size = 8;\n                $data = null;\n                break;\n            case 0x21:    //    function with fixed number of arguments\n            case 0x41:\n            case 0x61:\n                $name = 'tFunc';\n                $size = 3;\n                // offset: 1; size: 2; index to built-in sheet function\n                switch (self::getInt2d($formulaData, 1)) {\n                    case 2:\n                        $function = 'ISNA';\n                        $args = 1;\n                        break;\n                    case 3:\n                        $function = 'ISERROR';\n                        $args = 1;\n                        break;\n                    case 10:\n                        $function = 'NA';\n                        $args = 0;\n                        break;\n                    case 15:\n                        $function = 'SIN';\n                        $args = 1;\n                        break;\n                    case 16:\n                        $function = 'COS';\n                        $args = 1;\n                        break;\n                    case 17:\n                        $function = 'TAN';\n                        $args = 1;\n                        break;\n                    case 18:\n                        $function = 'ATAN';\n                        $args = 1;\n                        break;\n                    case 19:\n                        $function = 'PI';\n                        $args = 0;\n                        break;\n                    case 20:\n                        $function = 'SQRT';\n                        $args = 1;\n                        break;\n                    case 21:\n                        $function = 'EXP';\n                        $args = 1;\n                        break;\n                    case 22:\n                        $function = 'LN';\n                        $args = 1;\n                        break;\n                    case 23:\n                        $function = 'LOG10';\n                        $args = 1;\n                        break;\n                    case 24:\n                        $function = 'ABS';\n                        $args = 1;\n                        break;\n                    case 25:\n                        $function = 'INT';\n                        $args = 1;\n                        break;\n                    case 26:\n                        $function = 'SIGN';\n                        $args = 1;\n                        break;\n                    case 27:\n                        $function = 'ROUND';\n                        $args = 2;\n                        break;\n                    case 30:\n                        $function = 'REPT';\n                        $args = 2;\n                        break;\n                    case 31:\n                        $function = 'MID';\n                        $args = 3;\n                        break;\n                    case 32:\n                        $function = 'LEN';\n                        $args = 1;\n                        break;\n                    case 33:\n                        $function = 'VALUE';\n                        $args = 1;\n                        break;\n                    case 34:\n                        $function = 'TRUE';\n                        $args = 0;\n                        break;\n                    case 35:\n                        $function = 'FALSE';\n                        $args = 0;\n                        break;\n                    case 38:\n                        $function = 'NOT';\n                        $args = 1;\n                        break;\n                    case 39:\n                        $function = 'MOD';\n                        $args = 2;\n                        break;\n                    case 40:\n                        $function = 'DCOUNT';\n                        $args = 3;\n                        break;\n                    case 41:\n                        $function = 'DSUM';\n                        $args = 3;\n                        break;\n                    case 42:\n                        $function = 'DAVERAGE';\n                        $args = 3;\n                        break;\n                    case 43:\n                        $function = 'DMIN';\n                        $args = 3;\n                        break;\n                    case 44:\n                        $function = 'DMAX';\n                        $args = 3;\n                        break;\n                    case 45:\n                        $function = 'DSTDEV';\n                        $args = 3;\n                        break;\n                    case 48:\n                        $function = 'TEXT';\n                        $args = 2;\n                        break;\n                    case 61:\n                        $function = 'MIRR';\n                        $args = 3;\n                        break;\n                    case 63:\n                        $function = 'RAND';\n                        $args = 0;\n                        break;\n                    case 65:\n                        $function = 'DATE';\n                        $args = 3;\n                        break;\n                    case 66:\n                        $function = 'TIME';\n                        $args = 3;\n                        break;\n                    case 67:\n                        $function = 'DAY';\n                        $args = 1;\n                        break;\n                    case 68:\n                        $function = 'MONTH';\n                        $args = 1;\n                        break;\n                    case 69:\n                        $function = 'YEAR';\n                        $args = 1;\n                        break;\n                    case 71:\n                        $function = 'HOUR';\n                        $args = 1;\n                        break;\n                    case 72:\n                        $function = 'MINUTE';\n                        $args = 1;\n                        break;\n                    case 73:\n                        $function = 'SECOND';\n                        $args = 1;\n                        break;\n                    case 74:\n                        $function = 'NOW';\n                        $args = 0;\n                        break;\n                    case 75:\n                        $function = 'AREAS';\n                        $args = 1;\n                        break;\n                    case 76:\n                        $function = 'ROWS';\n                        $args = 1;\n                        break;\n                    case 77:\n                        $function = 'COLUMNS';\n                        $args = 1;\n                        break;\n                    case 83:\n                        $function = 'TRANSPOSE';\n                        $args = 1;\n                        break;\n                    case 86:\n                        $function = 'TYPE';\n                        $args = 1;\n                        break;\n                    case 97:\n                        $function = 'ATAN2';\n                        $args = 2;\n                        break;\n                    case 98:\n                        $function = 'ASIN';\n                        $args = 1;\n                        break;\n                    case 99:\n                        $function = 'ACOS';\n                        $args = 1;\n                        break;\n                    case 105:\n                        $function = 'ISREF';\n                        $args = 1;\n                        break;\n                    case 111:\n                        $function = 'CHAR';\n                        $args = 1;\n                        break;\n                    case 112:\n                        $function = 'LOWER';\n                        $args = 1;\n                        break;\n                    case 113:\n                        $function = 'UPPER';\n                        $args = 1;\n                        break;\n                    case 114:\n                        $function = 'PROPER';\n                        $args = 1;\n                        break;\n                    case 117:\n                        $function = 'EXACT';\n                        $args = 2;\n                        break;\n                    case 118:\n                        $function = 'TRIM';\n                        $args = 1;\n                        break;\n                    case 119:\n                        $function = 'REPLACE';\n                        $args = 4;\n                        break;\n                    case 121:\n                        $function = 'CODE';\n                        $args = 1;\n                        break;\n                    case 126:\n                        $function = 'ISERR';\n                        $args = 1;\n                        break;\n                    case 127:\n                        $function = 'ISTEXT';\n                        $args = 1;\n                        break;\n                    case 128:\n                        $function = 'ISNUMBER';\n                        $args = 1;\n                        break;\n                    case 129:\n                        $function = 'ISBLANK';\n                        $args = 1;\n                        break;\n                    case 130:\n                        $function = 'T';\n                        $args = 1;\n                        break;\n                    case 131:\n                        $function = 'N';\n                        $args = 1;\n                        break;\n                    case 140:\n                        $function = 'DATEVALUE';\n                        $args = 1;\n                        break;\n                    case 141:\n                        $function = 'TIMEVALUE';\n                        $args = 1;\n                        break;\n                    case 142:\n                        $function = 'SLN';\n                        $args = 3;\n                        break;\n                    case 143:\n                        $function = 'SYD';\n                        $args = 4;\n                        break;\n                    case 162:\n                        $function = 'CLEAN';\n                        $args = 1;\n                        break;\n                    case 163:\n                        $function = 'MDETERM';\n                        $args = 1;\n                        break;\n                    case 164:\n                        $function = 'MINVERSE';\n                        $args = 1;\n                        break;\n                    case 165:\n                        $function = 'MMULT';\n                        $args = 2;\n                        break;\n                    case 184:\n                        $function = 'FACT';\n                        $args = 1;\n                        break;\n                    case 189:\n                        $function = 'DPRODUCT';\n                        $args = 3;\n                        break;\n                    case 190:\n                        $function = 'ISNONTEXT';\n                        $args = 1;\n                        break;\n                    case 195:\n                        $function = 'DSTDEVP';\n                        $args = 3;\n                        break;\n                    case 196:\n                        $function = 'DVARP';\n                        $args = 3;\n                        break;\n                    case 198:\n                        $function = 'ISLOGICAL';\n                        $args = 1;\n                        break;\n                    case 199:\n                        $function = 'DCOUNTA';\n                        $args = 3;\n                        break;\n                    case 207:\n                        $function = 'REPLACEB';\n                        $args = 4;\n                        break;\n                    case 210:\n                        $function = 'MIDB';\n                        $args = 3;\n                        break;\n                    case 211:\n                        $function = 'LENB';\n                        $args = 1;\n                        break;\n                    case 212:\n                        $function = 'ROUNDUP';\n                        $args = 2;\n                        break;\n                    case 213:\n                        $function = 'ROUNDDOWN';\n                        $args = 2;\n                        break;\n                    case 214:\n                        $function = 'ASC';\n                        $args = 1;\n                        break;\n                    case 215:\n                        $function = 'DBCS';\n                        $args = 1;\n                        break;\n                    case 221:\n                        $function = 'TODAY';\n                        $args = 0;\n                        break;\n                    case 229:\n                        $function = 'SINH';\n                        $args = 1;\n                        break;\n                    case 230:\n                        $function = 'COSH';\n                        $args = 1;\n                        break;\n                    case 231:\n                        $function = 'TANH';\n                        $args = 1;\n                        break;\n                    case 232:\n                        $function = 'ASINH';\n                        $args = 1;\n                        break;\n                    case 233:\n                        $function = 'ACOSH';\n                        $args = 1;\n                        break;\n                    case 234:\n                        $function = 'ATANH';\n                        $args = 1;\n                        break;\n                    case 235:\n                        $function = 'DGET';\n                        $args = 3;\n                        break;\n                    case 244:\n                        $function = 'INFO';\n                        $args = 1;\n                        break;\n                    case 252:\n                        $function = 'FREQUENCY';\n                        $args = 2;\n                        break;\n                    case 261:\n                        $function = 'ERROR.TYPE';\n                        $args = 1;\n                        break;\n                    case 271:\n                        $function = 'GAMMALN';\n                        $args = 1;\n                        break;\n                    case 273:\n                        $function = 'BINOMDIST';\n                        $args = 4;\n                        break;\n                    case 274:\n                        $function = 'CHIDIST';\n                        $args = 2;\n                        break;\n                    case 275:\n                        $function = 'CHIINV';\n                        $args = 2;\n                        break;\n                    case 276:\n                        $function = 'COMBIN';\n                        $args = 2;\n                        break;\n                    case 277:\n                        $function = 'CONFIDENCE';\n                        $args = 3;\n                        break;\n                    case 278:\n                        $function = 'CRITBINOM';\n                        $args = 3;\n                        break;\n                    case 279:\n                        $function = 'EVEN';\n                        $args = 1;\n                        break;\n                    case 280:\n                        $function = 'EXPONDIST';\n                        $args = 3;\n                        break;\n                    case 281:\n                        $function = 'FDIST';\n                        $args = 3;\n                        break;\n                    case 282:\n                        $function = 'FINV';\n                        $args = 3;\n                        break;\n                    case 283:\n                        $function = 'FISHER';\n                        $args = 1;\n                        break;\n                    case 284:\n                        $function = 'FISHERINV';\n                        $args = 1;\n                        break;\n                    case 285:\n                        $function = 'FLOOR';\n                        $args = 2;\n                        break;\n                    case 286:\n                        $function = 'GAMMADIST';\n                        $args = 4;\n                        break;\n                    case 287:\n                        $function = 'GAMMAINV';\n                        $args = 3;\n                        break;\n                    case 288:\n                        $function = 'CEILING';\n                        $args = 2;\n                        break;\n                    case 289:\n                        $function = 'HYPGEOMDIST';\n                        $args = 4;\n                        break;\n                    case 290:\n                        $function = 'LOGNORMDIST';\n                        $args = 3;\n                        break;\n                    case 291:\n                        $function = 'LOGINV';\n                        $args = 3;\n                        break;\n                    case 292:\n                        $function = 'NEGBINOMDIST';\n                        $args = 3;\n                        break;\n                    case 293:\n                        $function = 'NORMDIST';\n                        $args = 4;\n                        break;\n                    case 294:\n                        $function = 'NORMSDIST';\n                        $args = 1;\n                        break;\n                    case 295:\n                        $function = 'NORMINV';\n                        $args = 3;\n                        break;\n                    case 296:\n                        $function = 'NORMSINV';\n                        $args = 1;\n                        break;\n                    case 297:\n                        $function = 'STANDARDIZE';\n                        $args = 3;\n                        break;\n                    case 298:\n                        $function = 'ODD';\n                        $args = 1;\n                        break;\n                    case 299:\n                        $function = 'PERMUT';\n                        $args = 2;\n                        break;\n                    case 300:\n                        $function = 'POISSON';\n                        $args = 3;\n                        break;\n                    case 301:\n                        $function = 'TDIST';\n                        $args = 3;\n                        break;\n                    case 302:\n                        $function = 'WEIBULL';\n                        $args = 4;\n                        break;\n                    case 303:\n                        $function = 'SUMXMY2';\n                        $args = 2;\n                        break;\n                    case 304:\n                        $function = 'SUMX2MY2';\n                        $args = 2;\n                        break;\n                    case 305:\n                        $function = 'SUMX2PY2';\n                        $args = 2;\n                        break;\n                    case 306:\n                        $function = 'CHITEST';\n                        $args = 2;\n                        break;\n                    case 307:\n                        $function = 'CORREL';\n                        $args = 2;\n                        break;\n                    case 308:\n                        $function = 'COVAR';\n                        $args = 2;\n                        break;\n                    case 309:\n                        $function = 'FORECAST';\n                        $args = 3;\n                        break;\n                    case 310:\n                        $function = 'FTEST';\n                        $args = 2;\n                        break;\n                    case 311:\n                        $function = 'INTERCEPT';\n                        $args = 2;\n                        break;\n                    case 312:\n                        $function = 'PEARSON';\n                        $args = 2;\n                        break;\n                    case 313:\n                        $function = 'RSQ';\n                        $args = 2;\n                        break;\n                    case 314:\n                        $function = 'STEYX';\n                        $args = 2;\n                        break;\n                    case 315:\n                        $function = 'SLOPE';\n                        $args = 2;\n                        break;\n                    case 316:\n                        $function = 'TTEST';\n                        $args = 4;\n                        break;\n                    case 325:\n                        $function = 'LARGE';\n                        $args = 2;\n                        break;\n                    case 326:\n                        $function = 'SMALL';\n                        $args = 2;\n                        break;\n                    case 327:\n                        $function = 'QUARTILE';\n                        $args = 2;\n                        break;\n                    case 328:\n                        $function = 'PERCENTILE';\n                        $args = 2;\n                        break;\n                    case 331:\n                        $function = 'TRIMMEAN';\n                        $args = 2;\n                        break;\n                    case 332:\n                        $function = 'TINV';\n                        $args = 2;\n                        break;\n                    case 337:\n                        $function = 'POWER';\n                        $args = 2;\n                        break;\n                    case 342:\n                        $function = 'RADIANS';\n                        $args = 1;\n                        break;\n                    case 343:\n                        $function = 'DEGREES';\n                        $args = 1;\n                        break;\n                    case 346:\n                        $function = 'COUNTIF';\n                        $args = 2;\n                        break;\n                    case 347:\n                        $function = 'COUNTBLANK';\n                        $args = 1;\n                        break;\n                    case 350:\n                        $function = 'ISPMT';\n                        $args = 4;\n                        break;\n                    case 351:\n                        $function = 'DATEDIF';\n                        $args = 3;\n                        break;\n                    case 352:\n                        $function = 'DATESTRING';\n                        $args = 1;\n                        break;\n                    case 353:\n                        $function = 'NUMBERSTRING';\n                        $args = 2;\n                        break;\n                    case 360:\n                        $function = 'PHONETIC';\n                        $args = 1;\n                        break;\n                    case 368:\n                        $function = 'BAHTTEXT';\n                        $args = 1;\n                        break;\n                    default:\n                        throw new PHPExcel_Reader_Exception('Unrecognized function in formula');\n                        break;\n                }\n                $data = array('function' => $function, 'args' => $args);\n                break;\n            case 0x22:    //    function with variable number of arguments\n            case 0x42:\n            case 0x62:\n                $name = 'tFuncV';\n                $size = 4;\n                // offset: 1; size: 1; number of arguments\n                $args = ord($formulaData[1]);\n                // offset: 2: size: 2; index to built-in sheet function\n                $index = self::getInt2d($formulaData, 2);\n                switch ($index) {\n                    case 0:\n                        $function = 'COUNT';\n                        break;\n                    case 1:\n                        $function = 'IF';\n                        break;\n                    case 4:\n                        $function = 'SUM';\n                        break;\n                    case 5:\n                        $function = 'AVERAGE';\n                        break;\n                    case 6:\n                        $function = 'MIN';\n                        break;\n                    case 7:\n                        $function = 'MAX';\n                        break;\n                    case 8:\n                        $function = 'ROW';\n                        break;\n                    case 9:\n                        $function = 'COLUMN';\n                        break;\n                    case 11:\n                        $function = 'NPV';\n                        break;\n                    case 12:\n                        $function = 'STDEV';\n                        break;\n                    case 13:\n                        $function = 'DOLLAR';\n                        break;\n                    case 14:\n                        $function = 'FIXED';\n                        break;\n                    case 28:\n                        $function = 'LOOKUP';\n                        break;\n                    case 29:\n                        $function = 'INDEX';\n                        break;\n                    case 36:\n                        $function = 'AND';\n                        break;\n                    case 37:\n                        $function = 'OR';\n                        break;\n                    case 46:\n                        $function = 'VAR';\n                        break;\n                    case 49:\n                        $function = 'LINEST';\n                        break;\n                    case 50:\n                        $function = 'TREND';\n                        break;\n                    case 51:\n                        $function = 'LOGEST';\n                        break;\n                    case 52:\n                        $function = 'GROWTH';\n                        break;\n                    case 56:\n                        $function = 'PV';\n                        break;\n                    case 57:\n                        $function = 'FV';\n                        break;\n                    case 58:\n                        $function = 'NPER';\n                        break;\n                    case 59:\n                        $function = 'PMT';\n                        break;\n                    case 60:\n                        $function = 'RATE';\n                        break;\n                    case 62:\n                        $function = 'IRR';\n                        break;\n                    case 64:\n                        $function = 'MATCH';\n                        break;\n                    case 70:\n                        $function = 'WEEKDAY';\n                        break;\n                    case 78:\n                        $function = 'OFFSET';\n                        break;\n                    case 82:\n                        $function = 'SEARCH';\n                        break;\n                    case 100:\n                        $function = 'CHOOSE';\n                        break;\n                    case 101:\n                        $function = 'HLOOKUP';\n                        break;\n                    case 102:\n                        $function = 'VLOOKUP';\n                        break;\n                    case 109:\n                        $function = 'LOG';\n                        break;\n                    case 115:\n                        $function = 'LEFT';\n                        break;\n                    case 116:\n                        $function = 'RIGHT';\n                        break;\n                    case 120:\n                        $function = 'SUBSTITUTE';\n                        break;\n                    case 124:\n                        $function = 'FIND';\n                        break;\n                    case 125:\n                        $function = 'CELL';\n                        break;\n                    case 144:\n                        $function = 'DDB';\n                        break;\n                    case 148:\n                        $function = 'INDIRECT';\n                        break;\n                    case 167:\n                        $function = 'IPMT';\n                        break;\n                    case 168:\n                        $function = 'PPMT';\n                        break;\n                    case 169:\n                        $function = 'COUNTA';\n                        break;\n                    case 183:\n                        $function = 'PRODUCT';\n                        break;\n                    case 193:\n                        $function = 'STDEVP';\n                        break;\n                    case 194:\n                        $function = 'VARP';\n                        break;\n                    case 197:\n                        $function = 'TRUNC';\n                        break;\n                    case 204:\n                        $function = 'USDOLLAR';\n                        break;\n                    case 205:\n                        $function = 'FINDB';\n                        break;\n                    case 206:\n                        $function = 'SEARCHB';\n                        break;\n                    case 208:\n                        $function = 'LEFTB';\n                        break;\n                    case 209:\n                        $function = 'RIGHTB';\n                        break;\n                    case 216:\n                        $function = 'RANK';\n                        break;\n                    case 219:\n                        $function = 'ADDRESS';\n                        break;\n                    case 220:\n                        $function = 'DAYS360';\n                        break;\n                    case 222:\n                        $function = 'VDB';\n                        break;\n                    case 227:\n                        $function = 'MEDIAN';\n                        break;\n                    case 228:\n                        $function = 'SUMPRODUCT';\n                        break;\n                    case 247:\n                        $function = 'DB';\n                        break;\n                    case 255:\n                        $function = '';\n                        break;\n                    case 269:\n                        $function = 'AVEDEV';\n                        break;\n                    case 270:\n                        $function = 'BETADIST';\n                        break;\n                    case 272:\n                        $function = 'BETAINV';\n                        break;\n                    case 317:\n                        $function = 'PROB';\n                        break;\n                    case 318:\n                        $function = 'DEVSQ';\n                        break;\n                    case 319:\n                        $function = 'GEOMEAN';\n                        break;\n                    case 320:\n                        $function = 'HARMEAN';\n                        break;\n                    case 321:\n                        $function = 'SUMSQ';\n                        break;\n                    case 322:\n                        $function = 'KURT';\n                        break;\n                    case 323:\n                        $function = 'SKEW';\n                        break;\n                    case 324:\n                        $function = 'ZTEST';\n                        break;\n                    case 329:\n                        $function = 'PERCENTRANK';\n                        break;\n                    case 330:\n                        $function = 'MODE';\n                        break;\n                    case 336:\n                        $function = 'CONCATENATE';\n                        break;\n                    case 344:\n                        $function = 'SUBTOTAL';\n                        break;\n                    case 345:\n                        $function = 'SUMIF';\n                        break;\n                    case 354:\n                        $function = 'ROMAN';\n                        break;\n                    case 358:\n                        $function = 'GETPIVOTDATA';\n                        break;\n                    case 359:\n                        $function = 'HYPERLINK';\n                        break;\n                    case 361:\n                        $function = 'AVERAGEA';\n                        break;\n                    case 362:\n                        $function = 'MAXA';\n                        break;\n                    case 363:\n                        $function = 'MINA';\n                        break;\n                    case 364:\n                        $function = 'STDEVPA';\n                        break;\n                    case 365:\n                        $function = 'VARPA';\n                        break;\n                    case 366:\n                        $function = 'STDEVA';\n                        break;\n                    case 367:\n                        $function = 'VARA';\n                        break;\n                    default:\n                        throw new PHPExcel_Reader_Exception('Unrecognized function in formula');\n                        break;\n                }\n                $data = array('function' => $function, 'args' => $args);\n                break;\n            case 0x23:    //    index to defined name\n            case 0x43:\n            case 0x63:\n                $name = 'tName';\n                $size = 5;\n                // offset: 1; size: 2; one-based index to definedname record\n                $definedNameIndex = self::getInt2d($formulaData, 1) - 1;\n                // offset: 2; size: 2; not used\n                $data = $this->definedname[$definedNameIndex]['name'];\n                break;\n            case 0x24:    //    single cell reference e.g. A5\n            case 0x44:\n            case 0x64:\n                $name = 'tRef';\n                $size = 5;\n                $data = $this->readBIFF8CellAddress(substr($formulaData, 1, 4));\n                break;\n            case 0x25:    //    cell range reference to cells in the same sheet (2d)\n            case 0x45:\n            case 0x65:\n                $name = 'tArea';\n                $size = 9;\n                $data = $this->readBIFF8CellRangeAddress(substr($formulaData, 1, 8));\n                break;\n            case 0x26:    //    Constant reference sub-expression\n            case 0x46:\n            case 0x66:\n                $name = 'tMemArea';\n                // offset: 1; size: 4; not used\n                // offset: 5; size: 2; size of the following subexpression\n                $subSize = self::getInt2d($formulaData, 5);\n                $size = 7 + $subSize;\n                $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize));\n                break;\n            case 0x27:    //    Deleted constant reference sub-expression\n            case 0x47:\n            case 0x67:\n                $name = 'tMemErr';\n                // offset: 1; size: 4; not used\n                // offset: 5; size: 2; size of the following subexpression\n                $subSize = self::getInt2d($formulaData, 5);\n                $size = 7 + $subSize;\n                $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize));\n                break;\n            case 0x29:    //    Variable reference sub-expression\n            case 0x49:\n            case 0x69:\n                $name = 'tMemFunc';\n                // offset: 1; size: 2; size of the following sub-expression\n                $subSize = self::getInt2d($formulaData, 1);\n                $size = 3 + $subSize;\n                $data = $this->getFormulaFromData(substr($formulaData, 3, $subSize));\n                break;\n            case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places\n            case 0x4C:\n            case 0x6C:\n                $name = 'tRefN';\n                $size = 5;\n                $data = $this->readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell);\n                break;\n            case 0x2D:    //    Relative 2d range reference\n            case 0x4D:\n            case 0x6D:\n                $name = 'tAreaN';\n                $size = 9;\n                $data = $this->readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell);\n                break;\n            case 0x39:    //    External name\n            case 0x59:\n            case 0x79:\n                $name = 'tNameX';\n                $size = 7;\n                // offset: 1; size: 2; index to REF entry in EXTERNSHEET record\n                // offset: 3; size: 2; one-based index to DEFINEDNAME or EXTERNNAME record\n                $index = self::getInt2d($formulaData, 3);\n                // assume index is to EXTERNNAME record\n                $data = $this->externalNames[$index - 1]['name'];\n                // offset: 5; size: 2; not used\n                break;\n            case 0x3A:    //    3d reference to cell\n            case 0x5A:\n            case 0x7A:\n                $name = 'tRef3d';\n                $size = 7;\n\n                try {\n                    // offset: 1; size: 2; index to REF entry\n                    $sheetRange = $this->readSheetRangeByRefIndex(self::getInt2d($formulaData, 1));\n                    // offset: 3; size: 4; cell address\n                    $cellAddress = $this->readBIFF8CellAddress(substr($formulaData, 3, 4));\n\n                    $data = \"$sheetRange!$cellAddress\";\n                } catch (PHPExcel_Exception $e) {\n                    // deleted sheet reference\n                    $data = '#REF!';\n                }\n                break;\n            case 0x3B:    //    3d reference to cell range\n            case 0x5B:\n            case 0x7B:\n                $name = 'tArea3d';\n                $size = 11;\n\n                try {\n                    // offset: 1; size: 2; index to REF entry\n                    $sheetRange = $this->readSheetRangeByRefIndex(self::getInt2d($formulaData, 1));\n                    // offset: 3; size: 8; cell address\n                    $cellRangeAddress = $this->readBIFF8CellRangeAddress(substr($formulaData, 3, 8));\n\n                    $data = \"$sheetRange!$cellRangeAddress\";\n                } catch (PHPExcel_Exception $e) {\n                    // deleted sheet reference\n                    $data = '#REF!';\n                }\n                break;\n            // Unknown cases    // don't know how to deal with\n            default:\n                throw new PHPExcel_Reader_Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula');\n                break;\n        }\n\n        return array(\n            'id' => $id,\n            'name' => $name,\n            'size' => $size,\n            'data' => $data,\n        );\n    }\n\n\n    /**\n     * Reads a cell address in BIFF8 e.g. 'A2' or '$A$2'\n     * section 3.3.4\n     *\n     * @param string $cellAddressStructure\n     * @return string\n     */\n    private function readBIFF8CellAddress($cellAddressStructure)\n    {\n        // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767))\n        $row = self::getInt2d($cellAddressStructure, 0) + 1;\n\n        // offset: 2; size: 2; index to column or column offset + relative flags\n        // bit: 7-0; mask 0x00FF; column index\n        $column = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::getInt2d($cellAddressStructure, 2));\n\n        // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)\n        if (!(0x4000 & self::getInt2d($cellAddressStructure, 2))) {\n            $column = '$' . $column;\n        }\n        // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)\n        if (!(0x8000 & self::getInt2d($cellAddressStructure, 2))) {\n            $row = '$' . $row;\n        }\n\n        return $column . $row;\n    }\n\n\n    /**\n     * Reads a cell address in BIFF8 for shared formulas. Uses positive and negative values for row and column\n     * to indicate offsets from a base cell\n     * section 3.3.4\n     *\n     * @param string $cellAddressStructure\n     * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas\n     * @return string\n     */\n    private function readBIFF8CellAddressB($cellAddressStructure, $baseCell = 'A1')\n    {\n        list($baseCol, $baseRow) = PHPExcel_Cell::coordinateFromString($baseCell);\n        $baseCol = PHPExcel_Cell::columnIndexFromString($baseCol) - 1;\n\n        // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767))\n        $rowIndex = self::getInt2d($cellAddressStructure, 0);\n        $row = self::getInt2d($cellAddressStructure, 0) + 1;\n\n        // offset: 2; size: 2; index to column or column offset + relative flags\n        // bit: 7-0; mask 0x00FF; column index\n        $colIndex = 0x00FF & self::getInt2d($cellAddressStructure, 2);\n\n        // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)\n        if (!(0x4000 & self::getInt2d($cellAddressStructure, 2))) {\n            $column = PHPExcel_Cell::stringFromColumnIndex($colIndex);\n            $column = '$' . $column;\n        } else {\n            $colIndex = ($colIndex <= 127) ? $colIndex : $colIndex - 256;\n            $column = PHPExcel_Cell::stringFromColumnIndex($baseCol + $colIndex);\n        }\n\n        // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)\n        if (!(0x8000 & self::getInt2d($cellAddressStructure, 2))) {\n            $row = '$' . $row;\n        } else {\n            $rowIndex = ($rowIndex <= 32767) ? $rowIndex : $rowIndex - 65536;\n            $row = $baseRow + $rowIndex;\n        }\n\n        return $column . $row;\n    }\n\n\n    /**\n     * Reads a cell range address in BIFF5 e.g. 'A2:B6' or 'A1'\n     * always fixed range\n     * section 2.5.14\n     *\n     * @param string $subData\n     * @return string\n     * @throws PHPExcel_Reader_Exception\n     */\n    private function readBIFF5CellRangeAddressFixed($subData)\n    {\n        // offset: 0; size: 2; index to first row\n        $fr = self::getInt2d($subData, 0) + 1;\n\n        // offset: 2; size: 2; index to last row\n        $lr = self::getInt2d($subData, 2) + 1;\n\n        // offset: 4; size: 1; index to first column\n        $fc = ord($subData{4});\n\n        // offset: 5; size: 1; index to last column\n        $lc = ord($subData{5});\n\n        // check values\n        if ($fr > $lr || $fc > $lc) {\n            throw new PHPExcel_Reader_Exception('Not a cell range address');\n        }\n\n        // column index to letter\n        $fc = PHPExcel_Cell::stringFromColumnIndex($fc);\n        $lc = PHPExcel_Cell::stringFromColumnIndex($lc);\n\n        if ($fr == $lr and $fc == $lc) {\n            return \"$fc$fr\";\n        }\n        return \"$fc$fr:$lc$lr\";\n    }\n\n\n    /**\n     * Reads a cell range address in BIFF8 e.g. 'A2:B6' or 'A1'\n     * always fixed range\n     * section 2.5.14\n     *\n     * @param string $subData\n     * @return string\n     * @throws PHPExcel_Reader_Exception\n     */\n    private function readBIFF8CellRangeAddressFixed($subData)\n    {\n        // offset: 0; size: 2; index to first row\n        $fr = self::getInt2d($subData, 0) + 1;\n\n        // offset: 2; size: 2; index to last row\n        $lr = self::getInt2d($subData, 2) + 1;\n\n        // offset: 4; size: 2; index to first column\n        $fc = self::getInt2d($subData, 4);\n\n        // offset: 6; size: 2; index to last column\n        $lc = self::getInt2d($subData, 6);\n\n        // check values\n        if ($fr > $lr || $fc > $lc) {\n            throw new PHPExcel_Reader_Exception('Not a cell range address');\n        }\n\n        // column index to letter\n        $fc = PHPExcel_Cell::stringFromColumnIndex($fc);\n        $lc = PHPExcel_Cell::stringFromColumnIndex($lc);\n\n        if ($fr == $lr and $fc == $lc) {\n            return \"$fc$fr\";\n        }\n        return \"$fc$fr:$lc$lr\";\n    }\n\n\n    /**\n     * Reads a cell range address in BIFF8 e.g. 'A2:B6' or '$A$2:$B$6'\n     * there are flags indicating whether column/row index is relative\n     * section 3.3.4\n     *\n     * @param string $subData\n     * @return string\n     */\n    private function readBIFF8CellRangeAddress($subData)\n    {\n        // todo: if cell range is just a single cell, should this funciton\n        // not just return e.g. 'A1' and not 'A1:A1' ?\n\n        // offset: 0; size: 2; index to first row (0... 65535) (or offset (-32768... 32767))\n            $fr = self::getInt2d($subData, 0) + 1;\n\n        // offset: 2; size: 2; index to last row (0... 65535) (or offset (-32768... 32767))\n            $lr = self::getInt2d($subData, 2) + 1;\n\n        // offset: 4; size: 2; index to first column or column offset + relative flags\n\n        // bit: 7-0; mask 0x00FF; column index\n        $fc = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::getInt2d($subData, 4));\n\n        // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)\n        if (!(0x4000 & self::getInt2d($subData, 4))) {\n            $fc = '$' . $fc;\n        }\n\n        // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)\n        if (!(0x8000 & self::getInt2d($subData, 4))) {\n            $fr = '$' . $fr;\n        }\n\n        // offset: 6; size: 2; index to last column or column offset + relative flags\n\n        // bit: 7-0; mask 0x00FF; column index\n        $lc = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::getInt2d($subData, 6));\n\n        // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)\n        if (!(0x4000 & self::getInt2d($subData, 6))) {\n            $lc = '$' . $lc;\n        }\n\n        // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)\n        if (!(0x8000 & self::getInt2d($subData, 6))) {\n            $lr = '$' . $lr;\n        }\n\n        return \"$fc$fr:$lc$lr\";\n    }\n\n\n    /**\n     * Reads a cell range address in BIFF8 for shared formulas. Uses positive and negative values for row and column\n     * to indicate offsets from a base cell\n     * section 3.3.4\n     *\n     * @param string $subData\n     * @param string $baseCell Base cell\n     * @return string Cell range address\n     */\n    private function readBIFF8CellRangeAddressB($subData, $baseCell = 'A1')\n    {\n        list($baseCol, $baseRow) = PHPExcel_Cell::coordinateFromString($baseCell);\n        $baseCol = PHPExcel_Cell::columnIndexFromString($baseCol) - 1;\n\n        // TODO: if cell range is just a single cell, should this funciton\n        // not just return e.g. 'A1' and not 'A1:A1' ?\n\n        // offset: 0; size: 2; first row\n        $frIndex = self::getInt2d($subData, 0); // adjust below\n\n        // offset: 2; size: 2; relative index to first row (0... 65535) should be treated as offset (-32768... 32767)\n        $lrIndex = self::getInt2d($subData, 2); // adjust below\n\n        // offset: 4; size: 2; first column with relative/absolute flags\n\n        // bit: 7-0; mask 0x00FF; column index\n        $fcIndex = 0x00FF & self::getInt2d($subData, 4);\n\n        // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)\n        if (!(0x4000 & self::getInt2d($subData, 4))) {\n            // absolute column index\n            $fc = PHPExcel_Cell::stringFromColumnIndex($fcIndex);\n            $fc = '$' . $fc;\n        } else {\n            // column offset\n            $fcIndex = ($fcIndex <= 127) ? $fcIndex : $fcIndex - 256;\n            $fc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $fcIndex);\n        }\n\n        // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)\n        if (!(0x8000 & self::getInt2d($subData, 4))) {\n            // absolute row index\n            $fr = $frIndex + 1;\n            $fr = '$' . $fr;\n        } else {\n            // row offset\n            $frIndex = ($frIndex <= 32767) ? $frIndex : $frIndex - 65536;\n            $fr = $baseRow + $frIndex;\n        }\n\n        // offset: 6; size: 2; last column with relative/absolute flags\n\n        // bit: 7-0; mask 0x00FF; column index\n        $lcIndex = 0x00FF & self::getInt2d($subData, 6);\n        $lcIndex = ($lcIndex <= 127) ? $lcIndex : $lcIndex - 256;\n        $lc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $lcIndex);\n\n        // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index)\n        if (!(0x4000 & self::getInt2d($subData, 6))) {\n            // absolute column index\n            $lc = PHPExcel_Cell::stringFromColumnIndex($lcIndex);\n            $lc = '$' . $lc;\n        } else {\n            // column offset\n            $lcIndex = ($lcIndex <= 127) ? $lcIndex : $lcIndex - 256;\n            $lc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $lcIndex);\n        }\n\n        // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index)\n        if (!(0x8000 & self::getInt2d($subData, 6))) {\n            // absolute row index\n            $lr = $lrIndex + 1;\n            $lr = '$' . $lr;\n        } else {\n            // row offset\n            $lrIndex = ($lrIndex <= 32767) ? $lrIndex : $lrIndex - 65536;\n            $lr = $baseRow + $lrIndex;\n        }\n\n        return \"$fc$fr:$lc$lr\";\n    }\n\n\n    /**\n     * Read BIFF8 cell range address list\n     * section 2.5.15\n     *\n     * @param string $subData\n     * @return array\n     */\n    private function readBIFF8CellRangeAddressList($subData)\n    {\n        $cellRangeAddresses = array();\n\n        // offset: 0; size: 2; number of the following cell range addresses\n        $nm = self::getInt2d($subData, 0);\n\n        $offset = 2;\n        // offset: 2; size: 8 * $nm; list of $nm (fixed) cell range addresses\n        for ($i = 0; $i < $nm; ++$i) {\n            $cellRangeAddresses[] = $this->readBIFF8CellRangeAddressFixed(substr($subData, $offset, 8));\n            $offset += 8;\n        }\n\n        return array(\n            'size' => 2 + 8 * $nm,\n            'cellRangeAddresses' => $cellRangeAddresses,\n        );\n    }\n\n\n    /**\n     * Read BIFF5 cell range address list\n     * section 2.5.15\n     *\n     * @param string $subData\n     * @return array\n     */\n    private function readBIFF5CellRangeAddressList($subData)\n    {\n        $cellRangeAddresses = array();\n\n        // offset: 0; size: 2; number of the following cell range addresses\n        $nm = self::getInt2d($subData, 0);\n\n        $offset = 2;\n        // offset: 2; size: 6 * $nm; list of $nm (fixed) cell range addresses\n        for ($i = 0; $i < $nm; ++$i) {\n            $cellRangeAddresses[] = $this->readBIFF5CellRangeAddressFixed(substr($subData, $offset, 6));\n            $offset += 6;\n        }\n\n        return array(\n            'size' => 2 + 6 * $nm,\n            'cellRangeAddresses' => $cellRangeAddresses,\n        );\n    }\n\n\n    /**\n     * Get a sheet range like Sheet1:Sheet3 from REF index\n     * Note: If there is only one sheet in the range, one gets e.g Sheet1\n     * It can also happen that the REF structure uses the -1 (FFFF) code to indicate deleted sheets,\n     * in which case an PHPExcel_Reader_Exception is thrown\n     *\n     * @param int $index\n     * @return string|false\n     * @throws PHPExcel_Reader_Exception\n     */\n    private function readSheetRangeByRefIndex($index)\n    {\n        if (isset($this->ref[$index])) {\n            $type = $this->externalBooks[$this->ref[$index]['externalBookIndex']]['type'];\n\n            switch ($type) {\n                case 'internal':\n                    // check if we have a deleted 3d reference\n                    if ($this->ref[$index]['firstSheetIndex'] == 0xFFFF or $this->ref[$index]['lastSheetIndex'] == 0xFFFF) {\n                        throw new PHPExcel_Reader_Exception('Deleted sheet reference');\n                    }\n\n                    // we have normal sheet range (collapsed or uncollapsed)\n                    $firstSheetName = $this->sheets[$this->ref[$index]['firstSheetIndex']]['name'];\n                    $lastSheetName = $this->sheets[$this->ref[$index]['lastSheetIndex']]['name'];\n\n                    if ($firstSheetName == $lastSheetName) {\n                        // collapsed sheet range\n                        $sheetRange = $firstSheetName;\n                    } else {\n                        $sheetRange = \"$firstSheetName:$lastSheetName\";\n                    }\n\n                    // escape the single-quotes\n                    $sheetRange = str_replace(\"'\", \"''\", $sheetRange);\n\n                    // if there are special characters, we need to enclose the range in single-quotes\n                    // todo: check if we have identified the whole set of special characters\n                    // it seems that the following characters are not accepted for sheet names\n                    // and we may assume that they are not present: []*/:\\?\n                    if (preg_match(\"/[ !\\\"@#£$%&{()}<>=+'|^,;-]/\", $sheetRange)) {\n                        $sheetRange = \"'$sheetRange'\";\n                    }\n\n                    return $sheetRange;\n                    break;\n                default:\n                    // TODO: external sheet support\n                    throw new PHPExcel_Reader_Exception('Excel5 reader only supports internal sheets in fomulas');\n                    break;\n            }\n        }\n        return false;\n    }\n\n\n    /**\n     * read BIFF8 constant value array from array data\n     * returns e.g. array('value' => '{1,2;3,4}', 'size' => 40}\n     * section 2.5.8\n     *\n     * @param string $arrayData\n     * @return array\n     */\n    private static function readBIFF8ConstantArray($arrayData)\n    {\n        // offset: 0; size: 1; number of columns decreased by 1\n        $nc = ord($arrayData[0]);\n\n        // offset: 1; size: 2; number of rows decreased by 1\n        $nr = self::getInt2d($arrayData, 1);\n        $size = 3; // initialize\n        $arrayData = substr($arrayData, 3);\n\n        // offset: 3; size: var; list of ($nc + 1) * ($nr + 1) constant values\n        $matrixChunks = array();\n        for ($r = 1; $r <= $nr + 1; ++$r) {\n            $items = array();\n            for ($c = 1; $c <= $nc + 1; ++$c) {\n                $constant = self::readBIFF8Constant($arrayData);\n                $items[] = $constant['value'];\n                $arrayData = substr($arrayData, $constant['size']);\n                $size += $constant['size'];\n            }\n            $matrixChunks[] = implode(',', $items); // looks like e.g. '1,\"hello\"'\n        }\n        $matrix = '{' . implode(';', $matrixChunks) . '}';\n\n        return array(\n            'value' => $matrix,\n            'size' => $size,\n        );\n    }\n\n\n    /**\n     * read BIFF8 constant value which may be 'Empty Value', 'Number', 'String Value', 'Boolean Value', 'Error Value'\n     * section 2.5.7\n     * returns e.g. array('value' => '5', 'size' => 9)\n     *\n     * @param string $valueData\n     * @return array\n     */\n    private static function readBIFF8Constant($valueData)\n    {\n        // offset: 0; size: 1; identifier for type of constant\n        $identifier = ord($valueData[0]);\n\n        switch ($identifier) {\n            case 0x00: // empty constant (what is this?)\n                $value = '';\n                $size = 9;\n                break;\n            case 0x01: // number\n                // offset: 1; size: 8; IEEE 754 floating-point value\n                $value = self::extractNumber(substr($valueData, 1, 8));\n                $size = 9;\n                break;\n            case 0x02: // string value\n                // offset: 1; size: var; Unicode string, 16-bit string length\n                $string = self::readUnicodeStringLong(substr($valueData, 1));\n                $value = '\"' . $string['value'] . '\"';\n                $size = 1 + $string['size'];\n                break;\n            case 0x04: // boolean\n                // offset: 1; size: 1; 0 = FALSE, 1 = TRUE\n                if (ord($valueData[1])) {\n                    $value = 'TRUE';\n                } else {\n                    $value = 'FALSE';\n                }\n                $size = 9;\n                break;\n            case 0x10: // error code\n                // offset: 1; size: 1; error code\n                $value = PHPExcel_Reader_Excel5_ErrorCode::lookup(ord($valueData[1]));\n                $size = 9;\n                break;\n        }\n        return array(\n            'value' => $value,\n            'size' => $size,\n        );\n    }\n\n\n    /**\n     * Extract RGB color\n     * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.4\n     *\n     * @param string $rgb Encoded RGB value (4 bytes)\n     * @return array\n     */\n    private static function readRGB($rgb)\n    {\n        // offset: 0; size 1; Red component\n        $r = ord($rgb{0});\n\n        // offset: 1; size: 1; Green component\n        $g = ord($rgb{1});\n\n        // offset: 2; size: 1; Blue component\n        $b = ord($rgb{2});\n\n        // HEX notation, e.g. 'FF00FC'\n        $rgb = sprintf('%02X%02X%02X', $r, $g, $b);\n\n        return array('rgb' => $rgb);\n    }\n\n\n    /**\n     * Read byte string (8-bit string length)\n     * OpenOffice documentation: 2.5.2\n     *\n     * @param string $subData\n     * @return array\n     */\n    private function readByteStringShort($subData)\n    {\n        // offset: 0; size: 1; length of the string (character count)\n        $ln = ord($subData[0]);\n\n        // offset: 1: size: var; character array (8-bit characters)\n        $value = $this->decodeCodepage(substr($subData, 1, $ln));\n\n        return array(\n            'value' => $value,\n            'size' => 1 + $ln, // size in bytes of data structure\n        );\n    }\n\n\n    /**\n     * Read byte string (16-bit string length)\n     * OpenOffice documentation: 2.5.2\n     *\n     * @param string $subData\n     * @return array\n     */\n    private function readByteStringLong($subData)\n    {\n        // offset: 0; size: 2; length of the string (character count)\n        $ln = self::getInt2d($subData, 0);\n\n        // offset: 2: size: var; character array (8-bit characters)\n        $value = $this->decodeCodepage(substr($subData, 2));\n\n        //return $string;\n        return array(\n            'value' => $value,\n            'size' => 2 + $ln, // size in bytes of data structure\n        );\n    }\n\n\n    /**\n     * Extracts an Excel Unicode short string (8-bit string length)\n     * OpenOffice documentation: 2.5.3\n     * function will automatically find out where the Unicode string ends.\n     *\n     * @param string $subData\n     * @return array\n     */\n    private static function readUnicodeStringShort($subData)\n    {\n        $value = '';\n\n        // offset: 0: size: 1; length of the string (character count)\n        $characterCount = ord($subData[0]);\n\n        $string = self::readUnicodeString(substr($subData, 1), $characterCount);\n\n        // add 1 for the string length\n        $string['size'] += 1;\n\n        return $string;\n    }\n\n\n    /**\n     * Extracts an Excel Unicode long string (16-bit string length)\n     * OpenOffice documentation: 2.5.3\n     * this function is under construction, needs to support rich text, and Asian phonetic settings\n     *\n     * @param string $subData\n     * @return array\n     */\n    private static function readUnicodeStringLong($subData)\n    {\n        $value = '';\n\n        // offset: 0: size: 2; length of the string (character count)\n        $characterCount = self::getInt2d($subData, 0);\n\n        $string = self::readUnicodeString(substr($subData, 2), $characterCount);\n\n        // add 2 for the string length\n        $string['size'] += 2;\n\n        return $string;\n    }\n\n\n    /**\n     * Read Unicode string with no string length field, but with known character count\n     * this function is under construction, needs to support rich text, and Asian phonetic settings\n     * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.3\n     *\n     * @param string $subData\n     * @param int $characterCount\n     * @return array\n     */\n    private static function readUnicodeString($subData, $characterCount)\n    {\n        $value = '';\n\n        // offset: 0: size: 1; option flags\n        // bit: 0; mask: 0x01; character compression (0 = compressed 8-bit, 1 = uncompressed 16-bit)\n        $isCompressed = !((0x01 & ord($subData[0])) >> 0);\n\n        // bit: 2; mask: 0x04; Asian phonetic settings\n        $hasAsian = (0x04) & ord($subData[0]) >> 2;\n\n        // bit: 3; mask: 0x08; Rich-Text settings\n        $hasRichText = (0x08) & ord($subData[0]) >> 3;\n\n        // offset: 1: size: var; character array\n        // this offset assumes richtext and Asian phonetic settings are off which is generally wrong\n        // needs to be fixed\n        $value = self::encodeUTF16(substr($subData, 1, $isCompressed ? $characterCount : 2 * $characterCount), $isCompressed);\n\n        return array(\n            'value' => $value,\n            'size' => $isCompressed ? 1 + $characterCount : 1 + 2 * $characterCount, // the size in bytes including the option flags\n        );\n    }\n\n\n    /**\n     * Convert UTF-8 string to string surounded by double quotes. Used for explicit string tokens in formulas.\n     * Example:  hello\"world  -->  \"hello\"\"world\"\n     *\n     * @param string $value UTF-8 encoded string\n     * @return string\n     */\n    private static function UTF8toExcelDoubleQuoted($value)\n    {\n        return '\"' . str_replace('\"', '\"\"', $value) . '\"';\n    }\n\n\n    /**\n     * Reads first 8 bytes of a string and return IEEE 754 float\n     *\n     * @param string $data Binary string that is at least 8 bytes long\n     * @return float\n     */\n    private static function extractNumber($data)\n    {\n        $rknumhigh = self::getInt4d($data, 4);\n        $rknumlow = self::getInt4d($data, 0);\n        $sign = ($rknumhigh & 0x80000000) >> 31;\n        $exp = (($rknumhigh & 0x7ff00000) >> 20) - 1023;\n        $mantissa = (0x100000 | ($rknumhigh & 0x000fffff));\n        $mantissalow1 = ($rknumlow & 0x80000000) >> 31;\n        $mantissalow2 = ($rknumlow & 0x7fffffff);\n        $value = $mantissa / pow(2, (20 - $exp));\n\n        if ($mantissalow1 != 0) {\n            $value += 1 / pow(2, (21 - $exp));\n        }\n\n        $value += $mantissalow2 / pow(2, (52 - $exp));\n        if ($sign) {\n            $value *= -1;\n        }\n\n        return $value;\n    }\n\n\n    private static function getIEEE754($rknum)\n    {\n        if (($rknum & 0x02) != 0) {\n            $value = $rknum >> 2;\n        } else {\n            // changes by mmp, info on IEEE754 encoding from\n            // research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html\n            // The RK format calls for using only the most significant 30 bits\n            // of the 64 bit floating point value. The other 34 bits are assumed\n            // to be 0 so we use the upper 30 bits of $rknum as follows...\n            $sign = ($rknum & 0x80000000) >> 31;\n            $exp = ($rknum & 0x7ff00000) >> 20;\n            $mantissa = (0x100000 | ($rknum & 0x000ffffc));\n            $value = $mantissa / pow(2, (20- ($exp - 1023)));\n            if ($sign) {\n                $value = -1 * $value;\n            }\n            //end of changes by mmp\n        }\n        if (($rknum & 0x01) != 0) {\n            $value /= 100;\n        }\n        return $value;\n    }\n\n\n    /**\n     * Get UTF-8 string from (compressed or uncompressed) UTF-16 string\n     *\n     * @param string $string\n     * @param bool $compressed\n     * @return string\n     */\n    private static function encodeUTF16($string, $compressed = '')\n    {\n        if ($compressed) {\n            $string = self::uncompressByteString($string);\n        }\n\n        return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', 'UTF-16LE');\n    }\n\n    /**\n     * Convert UTF-16 string in compressed notation to uncompressed form. Only used for BIFF8.\n     *\n     * @param string $string\n     * @return string\n     */\n    private static function uncompressByteString($string)\n    {\n        $uncompressedString = '';\n        $strLen = strlen($string);\n        for ($i = 0; $i < $strLen; ++$i) {\n            $uncompressedString .= $string[$i] . \"\\0\";\n        }\n\n        return $uncompressedString;\n    }\n\n    /**\n     * Convert string to UTF-8. Only used for BIFF5.\n     *\n     * @param string $string\n     * @return string\n     */\n    private function decodeCodepage($string)\n    {\n        return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', $this->codepage);\n    }\n\n    /**\n     * Read 16-bit unsigned integer\n     *\n     * @param string $data\n     * @param int $pos\n     * @return int\n     */\n    public static function getInt2d($data, $pos)\n    {\n        return ord($data[$pos]) | (ord($data[$pos+1]) << 8);\n    }\n\n    /**\n     * Read 32-bit signed integer\n     *\n     * @param string $data\n     * @param int $pos\n     * @return int\n     */\n    public static function getInt4d($data, $pos)\n    {\n        // FIX: represent numbers correctly on 64-bit system\n        // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334\n        // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems\n        $_or_24 = ord($data[$pos + 3]);\n        if ($_or_24 >= 128) {\n            // negative number\n            $_ord_24 = -abs((256 - $_or_24) << 24);\n        } else {\n            $_ord_24 = ($_or_24 & 127) << 24;\n        }\n        return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24;\n    }\n\n    private function parseRichText($is = '')\n    {\n        $value = new PHPExcel_RichText();\n        $value->createText($is);\n\n        return $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Exception.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_Exception\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Exception extends PHPExcel_Exception\n{\n    /**\n     * Error handler callback\n     *\n     * @param mixed $code\n     * @param mixed $string\n     * @param mixed $file\n     * @param mixed $line\n     * @param mixed $context\n     */\n    public static function errorHandlerCallback($code, $string, $file, $line, $context)\n    {\n        $e = new self($string, $code);\n        $e->line = $line;\n        $e->file = $file;\n        throw $e;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/Gnumeric.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_Gnumeric\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_Gnumeric extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * Formats\n     *\n     * @var array\n     */\n    private $styles = array();\n\n    /**\n     * Shared Expressions\n     *\n     * @var array\n     */\n    private $expressions = array();\n\n    private $referenceHelper = null;\n\n    /**\n     * Create a new PHPExcel_Reader_Gnumeric\n     */\n    public function __construct()\n    {\n        $this->readFilter     = new PHPExcel_Reader_DefaultReadFilter();\n        $this->referenceHelper = PHPExcel_ReferenceHelper::getInstance();\n    }\n\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return     boolean\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function canRead($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        // Check if gzlib functions are available\n        if (!function_exists('gzread')) {\n            throw new PHPExcel_Reader_Exception(\"gzlib library is not enabled\");\n        }\n\n        // Read signature data (first 3 bytes)\n        $fh = fopen($pFilename, 'r');\n        $data = fread($fh, 2);\n        fclose($fh);\n\n        if ($data != chr(0x1F).chr(0x8B)) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object\n     *\n     * @param     string         $pFilename\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function listWorksheetNames($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $xml = new XMLReader();\n        $xml->xml($this->securityScanFile('compress.zlib://'.realpath($pFilename)), null, PHPExcel_Settings::getLibXmlLoaderOptions());\n        $xml->setParserProperty(2, true);\n\n        $worksheetNames = array();\n        while ($xml->read()) {\n            if ($xml->name == 'gnm:SheetName' && $xml->nodeType == XMLReader::ELEMENT) {\n                $xml->read();    //    Move onto the value node\n                $worksheetNames[] = (string) $xml->value;\n            } elseif ($xml->name == 'gnm:Sheets') {\n                //    break out of the loop once we've got our sheet names rather than parse the entire file\n                break;\n            }\n        }\n\n        return $worksheetNames;\n    }\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param   string     $pFilename\n     * @throws   PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $xml = new XMLReader();\n        $xml->xml($this->securityScanFile('compress.zlib://'.realpath($pFilename)), null, PHPExcel_Settings::getLibXmlLoaderOptions());\n        $xml->setParserProperty(2, true);\n\n        $worksheetInfo = array();\n        while ($xml->read()) {\n            if ($xml->name == 'gnm:Sheet' && $xml->nodeType == XMLReader::ELEMENT) {\n                $tmpInfo = array(\n                    'worksheetName' => '',\n                    'lastColumnLetter' => 'A',\n                    'lastColumnIndex' => 0,\n                    'totalRows' => 0,\n                    'totalColumns' => 0,\n                );\n\n                while ($xml->read()) {\n                    if ($xml->name == 'gnm:Name' && $xml->nodeType == XMLReader::ELEMENT) {\n                        $xml->read();    //    Move onto the value node\n                        $tmpInfo['worksheetName'] = (string) $xml->value;\n                    } elseif ($xml->name == 'gnm:MaxCol' && $xml->nodeType == XMLReader::ELEMENT) {\n                        $xml->read();    //    Move onto the value node\n                        $tmpInfo['lastColumnIndex'] = (int) $xml->value;\n                        $tmpInfo['totalColumns'] = (int) $xml->value + 1;\n                    } elseif ($xml->name == 'gnm:MaxRow' && $xml->nodeType == XMLReader::ELEMENT) {\n                        $xml->read();    //    Move onto the value node\n                        $tmpInfo['totalRows'] = (int) $xml->value + 1;\n                        break;\n                    }\n                }\n                $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);\n                $worksheetInfo[] = $tmpInfo;\n            }\n        }\n\n        return $worksheetInfo;\n    }\n\n    private function gzfileGetContents($filename)\n    {\n        $file = @gzopen($filename, 'rb');\n        if ($file !== false) {\n            $data = '';\n            while (!gzeof($file)) {\n                $data .= gzread($file, 1024);\n            }\n            gzclose($file);\n        }\n        return $data;\n    }\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Create new PHPExcel\n        $objPHPExcel = new PHPExcel();\n\n        // Load into this instance\n        return $this->loadIntoExisting($pFilename, $objPHPExcel);\n    }\n\n    /**\n     * Loads PHPExcel from file into PHPExcel instance\n     *\n     * @param     string         $pFilename\n     * @param    PHPExcel    $objPHPExcel\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $timezoneObj = new DateTimeZone('Europe/London');\n        $GMT = new DateTimeZone('UTC');\n\n        $gFileData = $this->gzfileGetContents($pFilename);\n\n//        echo '<pre>';\n//        echo htmlentities($gFileData,ENT_QUOTES,'UTF-8');\n//        echo '</pre><hr />';\n//\n        $xml = simplexml_load_string($this->securityScan($gFileData), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n        $namespacesMeta = $xml->getNamespaces(true);\n\n//        var_dump($namespacesMeta);\n//\n        $gnmXML = $xml->children($namespacesMeta['gnm']);\n\n        $docProps = $objPHPExcel->getProperties();\n        //    Document Properties are held differently, depending on the version of Gnumeric\n        if (isset($namespacesMeta['office'])) {\n            $officeXML = $xml->children($namespacesMeta['office']);\n            $officeDocXML = $officeXML->{'document-meta'};\n            $officeDocMetaXML = $officeDocXML->meta;\n\n            foreach ($officeDocMetaXML as $officePropertyData) {\n                $officePropertyDC = array();\n                if (isset($namespacesMeta['dc'])) {\n                    $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']);\n                }\n                foreach ($officePropertyDC as $propertyName => $propertyValue) {\n                    $propertyValue = (string) $propertyValue;\n                    switch ($propertyName) {\n                        case 'title':\n                            $docProps->setTitle(trim($propertyValue));\n                            break;\n                        case 'subject':\n                            $docProps->setSubject(trim($propertyValue));\n                            break;\n                        case 'creator':\n                            $docProps->setCreator(trim($propertyValue));\n                            $docProps->setLastModifiedBy(trim($propertyValue));\n                            break;\n                        case 'date':\n                            $creationDate = strtotime(trim($propertyValue));\n                            $docProps->setCreated($creationDate);\n                            $docProps->setModified($creationDate);\n                            break;\n                        case 'description':\n                            $docProps->setDescription(trim($propertyValue));\n                            break;\n                    }\n                }\n                $officePropertyMeta = array();\n                if (isset($namespacesMeta['meta'])) {\n                    $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);\n                }\n                foreach ($officePropertyMeta as $propertyName => $propertyValue) {\n                    $attributes = $propertyValue->attributes($namespacesMeta['meta']);\n                    $propertyValue = (string) $propertyValue;\n                    switch ($propertyName) {\n                        case 'keyword':\n                            $docProps->setKeywords(trim($propertyValue));\n                            break;\n                        case 'initial-creator':\n                            $docProps->setCreator(trim($propertyValue));\n                            $docProps->setLastModifiedBy(trim($propertyValue));\n                            break;\n                        case 'creation-date':\n                            $creationDate = strtotime(trim($propertyValue));\n                            $docProps->setCreated($creationDate);\n                            $docProps->setModified($creationDate);\n                            break;\n                        case 'user-defined':\n                            list(, $attrName) = explode(':', $attributes['name']);\n                            switch ($attrName) {\n                                case 'publisher':\n                                    $docProps->setCompany(trim($propertyValue));\n                                    break;\n                                case 'category':\n                                    $docProps->setCategory(trim($propertyValue));\n                                    break;\n                                case 'manager':\n                                    $docProps->setManager(trim($propertyValue));\n                                    break;\n                            }\n                            break;\n                    }\n                }\n            }\n        } elseif (isset($gnmXML->Summary)) {\n            foreach ($gnmXML->Summary->Item as $summaryItem) {\n                $propertyName = $summaryItem->name;\n                $propertyValue = $summaryItem->{'val-string'};\n                switch ($propertyName) {\n                    case 'title':\n                        $docProps->setTitle(trim($propertyValue));\n                        break;\n                    case 'comments':\n                        $docProps->setDescription(trim($propertyValue));\n                        break;\n                    case 'keywords':\n                        $docProps->setKeywords(trim($propertyValue));\n                        break;\n                    case 'category':\n                        $docProps->setCategory(trim($propertyValue));\n                        break;\n                    case 'manager':\n                        $docProps->setManager(trim($propertyValue));\n                        break;\n                    case 'author':\n                        $docProps->setCreator(trim($propertyValue));\n                        $docProps->setLastModifiedBy(trim($propertyValue));\n                        break;\n                    case 'company':\n                        $docProps->setCompany(trim($propertyValue));\n                        break;\n                }\n            }\n        }\n\n        $worksheetID = 0;\n        foreach ($gnmXML->Sheets->Sheet as $sheet) {\n            $worksheetName = (string) $sheet->Name;\n//            echo '<b>Worksheet: ', $worksheetName,'</b><br />';\n            if ((isset($this->loadSheetsOnly)) && (!in_array($worksheetName, $this->loadSheetsOnly))) {\n                continue;\n            }\n\n            $maxRow = $maxCol = 0;\n\n            // Create new Worksheet\n            $objPHPExcel->createSheet();\n            $objPHPExcel->setActiveSheetIndex($worksheetID);\n            //    Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula\n            //        cells... during the load, all formulae should be correct, and we're simply bringing the worksheet\n            //        name in line with the formula, not the reverse\n            $objPHPExcel->getActiveSheet()->setTitle($worksheetName, false);\n\n            if ((!$this->readDataOnly) && (isset($sheet->PrintInformation))) {\n                if (isset($sheet->PrintInformation->Margins)) {\n                    foreach ($sheet->PrintInformation->Margins->children('gnm', true) as $key => $margin) {\n                        $marginAttributes = $margin->attributes();\n                        $marginSize = 72 / 100;    //    Default\n                        switch ($marginAttributes['PrefUnit']) {\n                            case 'mm':\n                                $marginSize = intval($marginAttributes['Points']) / 100;\n                                break;\n                        }\n                        switch ($key) {\n                            case 'top':\n                                $objPHPExcel->getActiveSheet()->getPageMargins()->setTop($marginSize);\n                                break;\n                            case 'bottom':\n                                $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom($marginSize);\n                                break;\n                            case 'left':\n                                $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft($marginSize);\n                                break;\n                            case 'right':\n                                $objPHPExcel->getActiveSheet()->getPageMargins()->setRight($marginSize);\n                                break;\n                            case 'header':\n                                $objPHPExcel->getActiveSheet()->getPageMargins()->setHeader($marginSize);\n                                break;\n                            case 'footer':\n                                $objPHPExcel->getActiveSheet()->getPageMargins()->setFooter($marginSize);\n                                break;\n                        }\n                    }\n                }\n            }\n\n            foreach ($sheet->Cells->Cell as $cell) {\n                $cellAttributes = $cell->attributes();\n                $row = (int) $cellAttributes->Row + 1;\n                $column = (int) $cellAttributes->Col;\n\n                if ($row > $maxRow) {\n                    $maxRow = $row;\n                }\n                if ($column > $maxCol) {\n                    $maxCol = $column;\n                }\n\n                $column = PHPExcel_Cell::stringFromColumnIndex($column);\n\n                // Read cell?\n                if ($this->getReadFilter() !== null) {\n                    if (!$this->getReadFilter()->readCell($column, $row, $worksheetName)) {\n                        continue;\n                    }\n                }\n\n                $ValueType = $cellAttributes->ValueType;\n                $ExprID = (string) $cellAttributes->ExprID;\n//                echo 'Cell ', $column, $row,'<br />';\n//                echo 'Type is ', $ValueType,'<br />';\n//                echo 'Value is ', $cell,'<br />';\n                $type = PHPExcel_Cell_DataType::TYPE_FORMULA;\n                if ($ExprID > '') {\n                    if (((string) $cell) > '') {\n                        $this->expressions[$ExprID] = array(\n                            'column'    => $cellAttributes->Col,\n                            'row'        => $cellAttributes->Row,\n                            'formula'    => (string) $cell\n                        );\n//                        echo 'NEW EXPRESSION ', $ExprID,'<br />';\n                    } else {\n                        $expression = $this->expressions[$ExprID];\n\n                        $cell = $this->referenceHelper->updateFormulaReferences(\n                            $expression['formula'],\n                            'A1',\n                            $cellAttributes->Col - $expression['column'],\n                            $cellAttributes->Row - $expression['row'],\n                            $worksheetName\n                        );\n//                        echo 'SHARED EXPRESSION ', $ExprID,'<br />';\n//                        echo 'New Value is ', $cell,'<br />';\n                    }\n                    $type = PHPExcel_Cell_DataType::TYPE_FORMULA;\n                } else {\n                    switch ($ValueType) {\n                        case '10':        //    NULL\n                            $type = PHPExcel_Cell_DataType::TYPE_NULL;\n                            break;\n                        case '20':        //    Boolean\n                            $type = PHPExcel_Cell_DataType::TYPE_BOOL;\n                            $cell = ($cell == 'TRUE') ? true: false;\n                            break;\n                        case '30':        //    Integer\n                            $cell = intval($cell);\n                            // Excel 2007+ doesn't differentiate between integer and float, so set the value and dropthru to the next (numeric) case\n                        case '40':        //    Float\n                            $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                            break;\n                        case '50':        //    Error\n                            $type = PHPExcel_Cell_DataType::TYPE_ERROR;\n                            break;\n                        case '60':        //    String\n                            $type = PHPExcel_Cell_DataType::TYPE_STRING;\n                            break;\n                        case '70':        //    Cell Range\n                        case '80':        //    Array\n                    }\n                }\n                $objPHPExcel->getActiveSheet()->getCell($column.$row)->setValueExplicit($cell, $type);\n            }\n\n            if ((!$this->readDataOnly) && (isset($sheet->Objects))) {\n                foreach ($sheet->Objects->children('gnm', true) as $key => $comment) {\n                    $commentAttributes = $comment->attributes();\n                    //    Only comment objects are handled at the moment\n                    if ($commentAttributes->Text) {\n                        $objPHPExcel->getActiveSheet()->getComment((string)$commentAttributes->ObjectBound)->setAuthor((string)$commentAttributes->Author)->setText($this->parseRichText((string)$commentAttributes->Text));\n                    }\n                }\n            }\n//            echo '$maxCol=', $maxCol,'; $maxRow=', $maxRow,'<br />';\n//\n            foreach ($sheet->Styles->StyleRegion as $styleRegion) {\n                $styleAttributes = $styleRegion->attributes();\n                if (($styleAttributes['startRow'] <= $maxRow) &&\n                    ($styleAttributes['startCol'] <= $maxCol)) {\n                    $startColumn = PHPExcel_Cell::stringFromColumnIndex((int) $styleAttributes['startCol']);\n                    $startRow = $styleAttributes['startRow'] + 1;\n\n                    $endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol'];\n                    $endColumn = PHPExcel_Cell::stringFromColumnIndex($endColumn);\n                    $endRow = ($styleAttributes['endRow'] > $maxRow) ? $maxRow : $styleAttributes['endRow'];\n                    $endRow += 1;\n                    $cellRange = $startColumn.$startRow.':'.$endColumn.$endRow;\n//                    echo $cellRange,'<br />';\n\n                    $styleAttributes = $styleRegion->Style->attributes();\n//                    var_dump($styleAttributes);\n//                    echo '<br />';\n\n                    //    We still set the number format mask for date/time values, even if readDataOnly is true\n                    if ((!$this->readDataOnly) ||\n                        (PHPExcel_Shared_Date::isDateTimeFormatCode((string) $styleAttributes['Format']))) {\n                        $styleArray = array();\n                        $styleArray['numberformat']['code'] = (string) $styleAttributes['Format'];\n                        //    If readDataOnly is false, we set all formatting information\n                        if (!$this->readDataOnly) {\n                            switch ($styleAttributes['HAlign']) {\n                                case '1':\n                                    $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL;\n                                    break;\n                                case '2':\n                                    $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_LEFT;\n                                    break;\n                                case '4':\n                                    $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_RIGHT;\n                                    break;\n                                case '8':\n                                    $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_CENTER;\n                                    break;\n                                case '16':\n                                case '64':\n                                    $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS;\n                                    break;\n                                case '32':\n                                    $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY;\n                                    break;\n                            }\n\n                            switch ($styleAttributes['VAlign']) {\n                                case '1':\n                                    $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_TOP;\n                                    break;\n                                case '2':\n                                    $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_BOTTOM;\n                                    break;\n                                case '4':\n                                    $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_CENTER;\n                                    break;\n                                case '8':\n                                    $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_JUSTIFY;\n                                    break;\n                            }\n\n                            $styleArray['alignment']['wrap'] = ($styleAttributes['WrapText'] == '1') ? true : false;\n                            $styleArray['alignment']['shrinkToFit'] = ($styleAttributes['ShrinkToFit'] == '1') ? true : false;\n                            $styleArray['alignment']['indent'] = (intval($styleAttributes[\"Indent\"]) > 0) ? $styleAttributes[\"indent\"] : 0;\n\n                            $RGB = self::parseGnumericColour($styleAttributes[\"Fore\"]);\n                            $styleArray['font']['color']['rgb'] = $RGB;\n                            $RGB = self::parseGnumericColour($styleAttributes[\"Back\"]);\n                            $shade = $styleAttributes[\"Shade\"];\n                            if (($RGB != '000000') || ($shade != '0')) {\n                                $styleArray['fill']['color']['rgb'] = $styleArray['fill']['startcolor']['rgb'] = $RGB;\n                                $RGB2 = self::parseGnumericColour($styleAttributes[\"PatternColor\"]);\n                                $styleArray['fill']['endcolor']['rgb'] = $RGB2;\n                                switch ($shade) {\n                                    case '1':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_SOLID;\n                                        break;\n                                    case '2':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR;\n                                        break;\n                                    case '3':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_GRADIENT_PATH;\n                                        break;\n                                    case '4':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN;\n                                        break;\n                                    case '5':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY;\n                                        break;\n                                    case '6':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID;\n                                        break;\n                                    case '7':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL;\n                                        break;\n                                    case '8':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS;\n                                        break;\n                                    case '9':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKUP;\n                                        break;\n                                    case '10':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL;\n                                        break;\n                                    case '11':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625;\n                                        break;\n                                    case '12':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_GRAY125;\n                                        break;\n                                    case '13':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN;\n                                        break;\n                                    case '14':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY;\n                                        break;\n                                    case '15':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID;\n                                        break;\n                                    case '16':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL;\n                                        break;\n                                    case '17':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS;\n                                        break;\n                                    case '18':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP;\n                                        break;\n                                    case '19':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL;\n                                        break;\n                                    case '20':\n                                        $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY;\n                                        break;\n                                }\n                            }\n\n                            $fontAttributes = $styleRegion->Style->Font->attributes();\n//                            var_dump($fontAttributes);\n//                            echo '<br />';\n                            $styleArray['font']['name'] = (string) $styleRegion->Style->Font;\n                            $styleArray['font']['size'] = intval($fontAttributes['Unit']);\n                            $styleArray['font']['bold'] = ($fontAttributes['Bold'] == '1') ? true : false;\n                            $styleArray['font']['italic'] = ($fontAttributes['Italic'] == '1') ? true : false;\n                            $styleArray['font']['strike'] = ($fontAttributes['StrikeThrough'] == '1') ? true : false;\n                            switch ($fontAttributes['Underline']) {\n                                case '1':\n                                    $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_SINGLE;\n                                    break;\n                                case '2':\n                                    $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_DOUBLE;\n                                    break;\n                                case '3':\n                                    $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING;\n                                    break;\n                                case '4':\n                                    $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING;\n                                    break;\n                                default:\n                                    $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_NONE;\n                                    break;\n                            }\n                            switch ($fontAttributes['Script']) {\n                                case '1':\n                                    $styleArray['font']['superScript'] = true;\n                                    break;\n                                case '-1':\n                                    $styleArray['font']['subScript'] = true;\n                                    break;\n                            }\n\n                            if (isset($styleRegion->Style->StyleBorder)) {\n                                if (isset($styleRegion->Style->StyleBorder->Top)) {\n                                    $styleArray['borders']['top'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Top->attributes());\n                                }\n                                if (isset($styleRegion->Style->StyleBorder->Bottom)) {\n                                    $styleArray['borders']['bottom'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Bottom->attributes());\n                                }\n                                if (isset($styleRegion->Style->StyleBorder->Left)) {\n                                    $styleArray['borders']['left'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Left->attributes());\n                                }\n                                if (isset($styleRegion->Style->StyleBorder->Right)) {\n                                    $styleArray['borders']['right'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Right->attributes());\n                                }\n                                if ((isset($styleRegion->Style->StyleBorder->Diagonal)) && (isset($styleRegion->Style->StyleBorder->{'Rev-Diagonal'}))) {\n                                    $styleArray['borders']['diagonal'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Diagonal->attributes());\n                                    $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_BOTH;\n                                } elseif (isset($styleRegion->Style->StyleBorder->Diagonal)) {\n                                    $styleArray['borders']['diagonal'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Diagonal->attributes());\n                                    $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_UP;\n                                } elseif (isset($styleRegion->Style->StyleBorder->{'Rev-Diagonal'})) {\n                                    $styleArray['borders']['diagonal'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->{'Rev-Diagonal'}->attributes());\n                                    $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_DOWN;\n                                }\n                            }\n                            if (isset($styleRegion->Style->HyperLink)) {\n                                //    TO DO\n                                $hyperlink = $styleRegion->Style->HyperLink->attributes();\n                            }\n                        }\n//                        var_dump($styleArray);\n//                        echo '<br />';\n                        $objPHPExcel->getActiveSheet()->getStyle($cellRange)->applyFromArray($styleArray);\n                    }\n                }\n            }\n\n            if ((!$this->readDataOnly) && (isset($sheet->Cols))) {\n                //    Column Widths\n                $columnAttributes = $sheet->Cols->attributes();\n                $defaultWidth = $columnAttributes['DefaultSizePts']  / 5.4;\n                $c = 0;\n                foreach ($sheet->Cols->ColInfo as $columnOverride) {\n                    $columnAttributes = $columnOverride->attributes();\n                    $column = $columnAttributes['No'];\n                    $columnWidth = $columnAttributes['Unit']  / 5.4;\n                    $hidden = ((isset($columnAttributes['Hidden'])) && ($columnAttributes['Hidden'] == '1')) ? true : false;\n                    $columnCount = (isset($columnAttributes['Count'])) ? $columnAttributes['Count'] : 1;\n                    while ($c < $column) {\n                        $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($defaultWidth);\n                        ++$c;\n                    }\n                    while (($c < ($column+$columnCount)) && ($c <= $maxCol)) {\n                        $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($columnWidth);\n                        if ($hidden) {\n                            $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setVisible(false);\n                        }\n                        ++$c;\n                    }\n                }\n                while ($c <= $maxCol) {\n                    $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($defaultWidth);\n                    ++$c;\n                }\n            }\n\n            if ((!$this->readDataOnly) && (isset($sheet->Rows))) {\n                //    Row Heights\n                $rowAttributes = $sheet->Rows->attributes();\n                $defaultHeight = $rowAttributes['DefaultSizePts'];\n                $r = 0;\n\n                foreach ($sheet->Rows->RowInfo as $rowOverride) {\n                    $rowAttributes = $rowOverride->attributes();\n                    $row = $rowAttributes['No'];\n                    $rowHeight = $rowAttributes['Unit'];\n                    $hidden = ((isset($rowAttributes['Hidden'])) && ($rowAttributes['Hidden'] == '1')) ? true : false;\n                    $rowCount = (isset($rowAttributes['Count'])) ? $rowAttributes['Count'] : 1;\n                    while ($r < $row) {\n                        ++$r;\n                        $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight);\n                    }\n                    while (($r < ($row+$rowCount)) && ($r < $maxRow)) {\n                        ++$r;\n                        $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($rowHeight);\n                        if ($hidden) {\n                            $objPHPExcel->getActiveSheet()->getRowDimension($r)->setVisible(false);\n                        }\n                    }\n                }\n                while ($r < $maxRow) {\n                    ++$r;\n                    $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight);\n                }\n            }\n\n            //    Handle Merged Cells in this worksheet\n            if (isset($sheet->MergedRegions)) {\n                foreach ($sheet->MergedRegions->Merge as $mergeCells) {\n                    if (strpos($mergeCells, ':') !== false) {\n                        $objPHPExcel->getActiveSheet()->mergeCells($mergeCells);\n                    }\n                }\n            }\n\n            $worksheetID++;\n        }\n\n        //    Loop through definedNames (global named ranges)\n        if (isset($gnmXML->Names)) {\n            foreach ($gnmXML->Names->Name as $namedRange) {\n                $name = (string) $namedRange->name;\n                $range = (string) $namedRange->value;\n                if (stripos($range, '#REF!') !== false) {\n                    continue;\n                }\n\n                $range = explode('!', $range);\n                $range[0] = trim($range[0], \"'\");\n                if ($worksheet = $objPHPExcel->getSheetByName($range[0])) {\n                    $extractedRange = str_replace('$', '', $range[1]);\n                    $objPHPExcel->addNamedRange(new PHPExcel_NamedRange($name, $worksheet, $extractedRange));\n                }\n            }\n        }\n\n        // Return\n        return $objPHPExcel;\n    }\n\n    private static function parseBorderAttributes($borderAttributes)\n    {\n        $styleArray = array();\n        if (isset($borderAttributes[\"Color\"])) {\n            $styleArray['color']['rgb'] = self::parseGnumericColour($borderAttributes[\"Color\"]);\n        }\n\n        switch ($borderAttributes[\"Style\"]) {\n            case '0':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_NONE;\n                break;\n            case '1':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                break;\n            case '2':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUM;\n                break;\n            case '3':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_SLANTDASHDOT;\n                break;\n            case '4':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHED;\n                break;\n            case '5':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_THICK;\n                break;\n            case '6':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_DOUBLE;\n                break;\n            case '7':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_DOTTED;\n                break;\n            case '8':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHED;\n                break;\n            case '9':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHDOT;\n                break;\n            case '10':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT;\n                break;\n            case '11':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHDOTDOT;\n                break;\n            case '12':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT;\n                break;\n            case '13':\n                $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT;\n                break;\n        }\n        return $styleArray;\n    }\n\n    private function parseRichText($is = '')\n    {\n        $value = new PHPExcel_RichText();\n        $value->createText($is);\n\n        return $value;\n    }\n\n    private static function parseGnumericColour($gnmColour)\n    {\n        list($gnmR, $gnmG, $gnmB) = explode(':', $gnmColour);\n        $gnmR = substr(str_pad($gnmR, 4, '0', STR_PAD_RIGHT), 0, 2);\n        $gnmG = substr(str_pad($gnmG, 4, '0', STR_PAD_RIGHT), 0, 2);\n        $gnmB = substr(str_pad($gnmB, 4, '0', STR_PAD_RIGHT), 0, 2);\n        return $gnmR . $gnmG . $gnmB;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/HTML.php",
    "content": "<?php\n\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_HTML\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n/** PHPExcel root directory */\nclass PHPExcel_Reader_HTML extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n\n    /**\n     * Input encoding\n     *\n     * @var string\n     */\n    protected $inputEncoding = 'ANSI';\n\n    /**\n     * Sheet index to read\n     *\n     * @var int\n     */\n    protected $sheetIndex = 0;\n\n    /**\n     * Formats\n     *\n     * @var array\n     */\n    protected $formats = array(\n        'h1' => array(\n            'font' => array(\n                'bold' => true,\n                'size' => 24,\n            ),\n        ), //    Bold, 24pt\n        'h2' => array(\n            'font' => array(\n                'bold' => true,\n                'size' => 18,\n            ),\n        ), //    Bold, 18pt\n        'h3' => array(\n            'font' => array(\n                'bold' => true,\n                'size' => 13.5,\n            ),\n        ), //    Bold, 13.5pt\n        'h4' => array(\n            'font' => array(\n                'bold' => true,\n                'size' => 12,\n            ),\n        ), //    Bold, 12pt\n        'h5' => array(\n            'font' => array(\n                'bold' => true,\n                'size' => 10,\n            ),\n        ), //    Bold, 10pt\n        'h6' => array(\n            'font' => array(\n                'bold' => true,\n                'size' => 7.5,\n            ),\n        ), //    Bold, 7.5pt\n        'a' => array(\n            'font' => array(\n                'underline' => true,\n                'color' => array(\n                    'argb' => PHPExcel_Style_Color::COLOR_BLUE,\n                ),\n            ),\n        ), //    Blue underlined\n        'hr' => array(\n            'borders' => array(\n                'bottom' => array(\n                    'style' => PHPExcel_Style_Border::BORDER_THIN,\n                    'color' => array(\n                        PHPExcel_Style_Color::COLOR_BLACK,\n                    ),\n                ),\n            ),\n        ), //    Bottom border\n    );\n\n    protected $rowspan = array();\n\n    /**\n     * Create a new PHPExcel_Reader_HTML\n     */\n    public function __construct()\n    {\n        $this->readFilter = new PHPExcel_Reader_DefaultReadFilter();\n    }\n\n    /**\n     * Validate that the current file is an HTML file\n     *\n     * @return boolean\n     */\n    protected function isValidFormat()\n    {\n        //    Reading 2048 bytes should be enough to validate that the format is HTML\n        $data = fread($this->fileHandle, 2048);\n        if ((strpos($data, '<') !== false) &&\n                (strlen($data) !== strlen(strip_tags($data)))) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param  string                    $pFilename\n     * @return PHPExcel\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Create new PHPExcel\n        $objPHPExcel = new PHPExcel();\n\n        // Load into this instance\n        return $this->loadIntoExisting($pFilename, $objPHPExcel);\n    }\n\n    /**\n     * Set input encoding\n     *\n     * @param string $pValue Input encoding\n     */\n    public function setInputEncoding($pValue = 'ANSI')\n    {\n        $this->inputEncoding = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get input encoding\n     *\n     * @return string\n     */\n    public function getInputEncoding()\n    {\n        return $this->inputEncoding;\n    }\n\n    //    Data Array used for testing only, should write to PHPExcel object on completion of tests\n    protected $dataArray = array();\n    protected $tableLevel = 0;\n    protected $nestedColumn = array('A');\n\n    protected function setTableStartColumn($column)\n    {\n        if ($this->tableLevel == 0) {\n            $column = 'A';\n        }\n        ++$this->tableLevel;\n        $this->nestedColumn[$this->tableLevel] = $column;\n\n        return $this->nestedColumn[$this->tableLevel];\n    }\n\n    protected function getTableStartColumn()\n    {\n        return $this->nestedColumn[$this->tableLevel];\n    }\n\n    protected function releaseTableStartColumn()\n    {\n        --$this->tableLevel;\n\n        return array_pop($this->nestedColumn);\n    }\n\n    protected function flushCell($sheet, $column, $row, &$cellContent)\n    {\n        if (is_string($cellContent)) {\n            //    Simple String content\n            if (trim($cellContent) > '') {\n                //    Only actually write it if there's content in the string\n//                echo 'FLUSH CELL: ' , $column , $row , ' => ' , $cellContent , '<br />';\n                //    Write to worksheet to be done here...\n                //    ... we return the cell so we can mess about with styles more easily\n                $sheet->setCellValue($column . $row, $cellContent, true);\n                $this->dataArray[$row][$column] = $cellContent;\n            }\n        } else {\n            //    We have a Rich Text run\n            //    TODO\n            $this->dataArray[$row][$column] = 'RICH TEXT: ' . $cellContent;\n        }\n        $cellContent = (string) '';\n    }\n\n    protected function processDomElement(DOMNode $element, $sheet, &$row, &$column, &$cellContent, $format = null)\n    {\n        foreach ($element->childNodes as $child) {\n            if ($child instanceof DOMText) {\n                $domText = preg_replace('/\\s+/u', ' ', trim($child->nodeValue));\n                if (is_string($cellContent)) {\n                    //    simply append the text if the cell content is a plain text string\n                    $cellContent .= $domText;\n                } else {\n                    //    but if we have a rich text run instead, we need to append it correctly\n                    //    TODO\n                }\n            } elseif ($child instanceof DOMElement) {\n//                echo '<b>DOM ELEMENT: </b>' , strtoupper($child->nodeName) , '<br />';\n\n                $attributeArray = array();\n                foreach ($child->attributes as $attribute) {\n//                    echo '<b>ATTRIBUTE: </b>' , $attribute->name , ' => ' , $attribute->value , '<br />';\n                    $attributeArray[$attribute->name] = $attribute->value;\n                }\n\n                switch ($child->nodeName) {\n                    case 'meta':\n                        foreach ($attributeArray as $attributeName => $attributeValue) {\n                            switch ($attributeName) {\n                                case 'content':\n                                    //    TODO\n                                    //    Extract character set, so we can convert to UTF-8 if required\n                                    break;\n                            }\n                        }\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                        break;\n                    case 'title':\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                        $sheet->setTitle($cellContent);\n                        $cellContent = '';\n                        break;\n                    case 'span':\n                    case 'div':\n                    case 'font':\n                    case 'i':\n                    case 'em':\n                    case 'strong':\n                    case 'b':\n//                        echo 'STYLING, SPAN OR DIV<br />';\n                        if ($cellContent > '') {\n                            $cellContent .= ' ';\n                        }\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                        if ($cellContent > '') {\n                            $cellContent .= ' ';\n                        }\n//                        echo 'END OF STYLING, SPAN OR DIV<br />';\n                        break;\n                    case 'hr':\n                        $this->flushCell($sheet, $column, $row, $cellContent);\n                        ++$row;\n                        if (isset($this->formats[$child->nodeName])) {\n                            $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]);\n                        } else {\n                            $cellContent = '----------';\n                            $this->flushCell($sheet, $column, $row, $cellContent);\n                        }\n                        ++$row;\n                        // Add a break after a horizontal rule, simply by allowing the code to dropthru\n                    case 'br':\n                        if ($this->tableLevel > 0) {\n                            //    If we're inside a table, replace with a \\n\n                            $cellContent .= \"\\n\";\n                        } else {\n                            //    Otherwise flush our existing content and move the row cursor on\n                            $this->flushCell($sheet, $column, $row, $cellContent);\n                            ++$row;\n                        }\n//                        echo 'HARD LINE BREAK: ' , '<br />';\n                        break;\n                    case 'a':\n//                        echo 'START OF HYPERLINK: ' , '<br />';\n                        foreach ($attributeArray as $attributeName => $attributeValue) {\n                            switch ($attributeName) {\n                                case 'href':\n//                                    echo 'Link to ' , $attributeValue , '<br />';\n                                    $sheet->getCell($column . $row)->getHyperlink()->setUrl($attributeValue);\n                                    if (isset($this->formats[$child->nodeName])) {\n                                        $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]);\n                                    }\n                                    break;\n                            }\n                        }\n                        $cellContent .= ' ';\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                        echo 'END OF HYPERLINK:' , '<br />';\n                        break;\n                    case 'h1':\n                    case 'h2':\n                    case 'h3':\n                    case 'h4':\n                    case 'h5':\n                    case 'h6':\n                    case 'ol':\n                    case 'ul':\n                    case 'p':\n                        if ($this->tableLevel > 0) {\n                            //    If we're inside a table, replace with a \\n\n                            $cellContent .= \"\\n\";\n//                            echo 'LIST ENTRY: ' , '<br />';\n                            $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                            echo 'END OF LIST ENTRY:' , '<br />';\n                        } else {\n                            if ($cellContent > '') {\n                                $this->flushCell($sheet, $column, $row, $cellContent);\n                                $row++;\n                            }\n//                            echo 'START OF PARAGRAPH: ' , '<br />';\n                            $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                            echo 'END OF PARAGRAPH:' , '<br />';\n                            $this->flushCell($sheet, $column, $row, $cellContent);\n\n                            if (isset($this->formats[$child->nodeName])) {\n                                $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]);\n                            }\n\n                            $row++;\n                            $column = 'A';\n                        }\n                        break;\n                    case 'li':\n                        if ($this->tableLevel > 0) {\n                            //    If we're inside a table, replace with a \\n\n                            $cellContent .= \"\\n\";\n//                            echo 'LIST ENTRY: ' , '<br />';\n                            $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                            echo 'END OF LIST ENTRY:' , '<br />';\n                        } else {\n                            if ($cellContent > '') {\n                                $this->flushCell($sheet, $column, $row, $cellContent);\n                            }\n                            ++$row;\n//                            echo 'LIST ENTRY: ' , '<br />';\n                            $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                            echo 'END OF LIST ENTRY:' , '<br />';\n                            $this->flushCell($sheet, $column, $row, $cellContent);\n                            $column = 'A';\n                        }\n                        break;\n                    case 'table':\n                        $this->flushCell($sheet, $column, $row, $cellContent);\n                        $column = $this->setTableStartColumn($column);\n//                        echo 'START OF TABLE LEVEL ' , $this->tableLevel , '<br />';\n                        if ($this->tableLevel > 1) {\n                            --$row;\n                        }\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                        echo 'END OF TABLE LEVEL ' , $this->tableLevel , '<br />';\n                        $column = $this->releaseTableStartColumn();\n                        if ($this->tableLevel > 1) {\n                            ++$column;\n                        } else {\n                            ++$row;\n                        }\n                        break;\n                    case 'thead':\n                    case 'tbody':\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                        break;\n                    case 'tr':\n                        $column = $this->getTableStartColumn();\n                        $cellContent = '';\n//                        echo 'START OF TABLE ' , $this->tableLevel , ' ROW<br />';\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                        ++$row;\n//                        echo 'END OF TABLE ' , $this->tableLevel , ' ROW<br />';\n                        break;\n                    case 'th':\n                    case 'td':\n//                        echo 'START OF TABLE ' , $this->tableLevel , ' CELL<br />';\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n//                        echo 'END OF TABLE ' , $this->tableLevel , ' CELL<br />';\n\n                        while (isset($this->rowspan[$column . $row])) {\n                            ++$column;\n                        }\n\n                        $this->flushCell($sheet, $column, $row, $cellContent);\n\n//                        if (isset($attributeArray['style']) && !empty($attributeArray['style'])) {\n//                            $styleAry = $this->getPhpExcelStyleArray($attributeArray['style']);\n//\n//                            if (!empty($styleAry)) {\n//                                $sheet->getStyle($column . $row)->applyFromArray($styleAry);\n//                            }\n//                        }\n\n                        if (isset($attributeArray['rowspan']) && isset($attributeArray['colspan'])) {\n                            //create merging rowspan and colspan\n                            $columnTo = $column;\n                            for ($i = 0; $i < $attributeArray['colspan'] - 1; $i++) {\n                                ++$columnTo;\n                            }\n                            $range = $column . $row . ':' . $columnTo . ($row + $attributeArray['rowspan'] - 1);\n                            foreach (\\PHPExcel_Cell::extractAllCellReferencesInRange($range) as $value) {\n                                $this->rowspan[$value] = true;\n                            }\n                            $sheet->mergeCells($range);\n                            $column = $columnTo;\n                        } elseif (isset($attributeArray['rowspan'])) {\n                            //create merging rowspan\n                            $range = $column . $row . ':' . $column . ($row + $attributeArray['rowspan'] - 1);\n                            foreach (\\PHPExcel_Cell::extractAllCellReferencesInRange($range) as $value) {\n                                $this->rowspan[$value] = true;\n                            }\n                            $sheet->mergeCells($range);\n                        } elseif (isset($attributeArray['colspan'])) {\n                            //create merging colspan\n                            $columnTo = $column;\n                            for ($i = 0; $i < $attributeArray['colspan'] - 1; $i++) {\n                                ++$columnTo;\n                            }\n                            $sheet->mergeCells($column . $row . ':' . $columnTo . $row);\n                            $column = $columnTo;\n                        }\n                        ++$column;\n                        break;\n                    case 'body':\n                        $row = 1;\n                        $column = 'A';\n                        $content = '';\n                        $this->tableLevel = 0;\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                        break;\n                    default:\n                        $this->processDomElement($child, $sheet, $row, $column, $cellContent);\n                }\n            }\n        }\n    }\n\n    /**\n     * Loads PHPExcel from file into PHPExcel instance\n     *\n     * @param  string                    $pFilename\n     * @param  PHPExcel                  $objPHPExcel\n     * @return PHPExcel\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)\n    {\n        // Open file to validate\n        $this->openFile($pFilename);\n        if (!$this->isValidFormat()) {\n            fclose($this->fileHandle);\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid HTML file.\");\n        }\n        //    Close after validating\n        fclose($this->fileHandle);\n\n        // Create new PHPExcel\n        while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) {\n            $objPHPExcel->createSheet();\n        }\n        $objPHPExcel->setActiveSheetIndex($this->sheetIndex);\n\n        //    Create a new DOM object\n        $dom = new domDocument;\n        //    Reload the HTML file into the DOM object\n        $loaded = $dom->loadHTML(mb_convert_encoding($this->securityScanFile($pFilename), 'HTML-ENTITIES', 'UTF-8'));\n        if ($loaded === false) {\n            throw new PHPExcel_Reader_Exception('Failed to load ' . $pFilename . ' as a DOM Document');\n        }\n\n        //    Discard white space\n        $dom->preserveWhiteSpace = false;\n\n        $row = 0;\n        $column = 'A';\n        $content = '';\n        $this->processDomElement($dom, $objPHPExcel->getActiveSheet(), $row, $column, $content);\n\n        // Return\n        return $objPHPExcel;\n    }\n\n    /**\n     * Get sheet index\n     *\n     * @return int\n     */\n    public function getSheetIndex()\n    {\n        return $this->sheetIndex;\n    }\n\n    /**\n     * Set sheet index\n     *\n     * @param  int                  $pValue Sheet index\n     * @return PHPExcel_Reader_HTML\n     */\n    public function setSheetIndex($pValue = 0)\n    {\n        $this->sheetIndex = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks\n     *\n     * @param     string         $xml\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function securityScan($xml)\n    {\n        $pattern = '/\\\\0?' . implode('\\\\0?', str_split('<!ENTITY')) . '\\\\0?/';\n        if (preg_match($pattern, $xml)) {\n            throw new PHPExcel_Reader_Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks');\n        }\n        return $xml;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_IReadFilter\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\ninterface PHPExcel_Reader_IReadFilter\n{\n    /**\n     * Should this cell be read?\n     *\n     * @param    $column           Column address (as a string value like \"A\", or \"IV\")\n     * @param    $row              Row number\n     * @param    $worksheetName    Optional worksheet name\n     * @return   boolean\n     */\n    public function readCell($column, $row, $worksheetName = '');\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/IReader.php",
    "content": "<?php\n\n/**\n * PHPExcel_Reader_IReader\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\ninterface PHPExcel_Reader_IReader\n{\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return     boolean\n     */\n    public function canRead($pFilename);\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return  PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename);\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_OOCalc\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_OOCalc extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * Formats\n     *\n     * @var array\n     */\n    private $styles = array();\n\n    /**\n     * Create a new PHPExcel_Reader_OOCalc\n     */\n    public function __construct()\n    {\n        $this->readFilter     = new PHPExcel_Reader_DefaultReadFilter();\n    }\n\n    /**\n     * Can the current PHPExcel_Reader_IReader read the file?\n     *\n     * @param     string         $pFilename\n     * @return     boolean\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function canRead($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        // Check if zip class exists\n//        if (!class_exists($zipClass, false)) {\n//            throw new PHPExcel_Reader_Exception($zipClass . \" library is not enabled\");\n//        }\n\n        $mimeType = 'UNKNOWN';\n        // Load file\n        $zip = new $zipClass;\n        if ($zip->open($pFilename) === true) {\n            // check if it is an OOXML archive\n            $stat = $zip->statName('mimetype');\n            if ($stat && ($stat['size'] <= 255)) {\n                $mimeType = $zip->getFromName($stat['name']);\n            } elseif ($stat = $zip->statName('META-INF/manifest.xml')) {\n                $xml = simplexml_load_string($this->securityScan($zip->getFromName('META-INF/manifest.xml')), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n                $namespacesContent = $xml->getNamespaces(true);\n                if (isset($namespacesContent['manifest'])) {\n                    $manifest = $xml->children($namespacesContent['manifest']);\n                    foreach ($manifest as $manifestDataSet) {\n                        $manifestAttributes = $manifestDataSet->attributes($namespacesContent['manifest']);\n                        if ($manifestAttributes->{'full-path'} == '/') {\n                            $mimeType = (string) $manifestAttributes->{'media-type'};\n                            break;\n                        }\n                    }\n                }\n            }\n\n            $zip->close();\n\n            return ($mimeType === 'application/vnd.oasis.opendocument.spreadsheet');\n        }\n\n        return false;\n    }\n\n\n    /**\n     * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object\n     *\n     * @param     string         $pFilename\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function listWorksheetNames($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        $zip = new $zipClass;\n        if (!$zip->open($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! Error opening file.\");\n        }\n\n        $worksheetNames = array();\n\n        $xml = new XMLReader();\n        $res = $xml->xml($this->securityScanFile('zip://'.realpath($pFilename).'#content.xml'), null, PHPExcel_Settings::getLibXmlLoaderOptions());\n        $xml->setParserProperty(2, true);\n\n        //    Step into the first level of content of the XML\n        $xml->read();\n        while ($xml->read()) {\n            //    Quickly jump through to the office:body node\n            while ($xml->name !== 'office:body') {\n                if ($xml->isEmptyElement) {\n                    $xml->read();\n                } else {\n                    $xml->next();\n                }\n            }\n            //    Now read each node until we find our first table:table node\n            while ($xml->read()) {\n                if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) {\n                    //    Loop through each table:table node reading the table:name attribute for each worksheet name\n                    do {\n                        $worksheetNames[] = $xml->getAttribute('table:name');\n                        $xml->next();\n                    } while ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT);\n                }\n            }\n        }\n\n        return $worksheetNames;\n    }\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param   string     $pFilename\n     * @throws   PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $worksheetInfo = array();\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        $zip = new $zipClass;\n        if (!$zip->open($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! Error opening file.\");\n        }\n\n        $xml = new XMLReader();\n        $res = $xml->xml($this->securityScanFile('zip://'.realpath($pFilename).'#content.xml'), null, PHPExcel_Settings::getLibXmlLoaderOptions());\n        $xml->setParserProperty(2, true);\n\n        //    Step into the first level of content of the XML\n        $xml->read();\n        while ($xml->read()) {\n            //    Quickly jump through to the office:body node\n            while ($xml->name !== 'office:body') {\n                if ($xml->isEmptyElement) {\n                    $xml->read();\n                } else {\n                    $xml->next();\n                }\n            }\n                //    Now read each node until we find our first table:table node\n            while ($xml->read()) {\n                if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) {\n                    $worksheetNames[] = $xml->getAttribute('table:name');\n\n                    $tmpInfo = array(\n                        'worksheetName' => $xml->getAttribute('table:name'),\n                        'lastColumnLetter' => 'A',\n                        'lastColumnIndex' => 0,\n                        'totalRows' => 0,\n                        'totalColumns' => 0,\n                    );\n\n                    //    Loop through each child node of the table:table element reading\n                    $currCells = 0;\n                    do {\n                        $xml->read();\n                        if ($xml->name == 'table:table-row' && $xml->nodeType == XMLReader::ELEMENT) {\n                            $rowspan = $xml->getAttribute('table:number-rows-repeated');\n                            $rowspan = empty($rowspan) ? 1 : $rowspan;\n                            $tmpInfo['totalRows'] += $rowspan;\n                            $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells);\n                            $currCells = 0;\n                            //    Step into the row\n                            $xml->read();\n                            do {\n                                if ($xml->name == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) {\n                                    if (!$xml->isEmptyElement) {\n                                        $currCells++;\n                                        $xml->next();\n                                    } else {\n                                        $xml->read();\n                                    }\n                                } elseif ($xml->name == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) {\n                                    $mergeSize = $xml->getAttribute('table:number-columns-repeated');\n                                    $currCells += $mergeSize;\n                                    $xml->read();\n                                }\n                            } while ($xml->name != 'table:table-row');\n                        }\n                    } while ($xml->name != 'table:table');\n\n                    $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells);\n                    $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1;\n                    $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);\n                    $worksheetInfo[] = $tmpInfo;\n                }\n            }\n\n//                foreach ($workbookData->table as $worksheetDataSet) {\n//                    $worksheetData = $worksheetDataSet->children($namespacesContent['table']);\n//                    $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);\n//\n//                    $rowIndex = 0;\n//                    foreach ($worksheetData as $key => $rowData) {\n//                        switch ($key) {\n//                            case 'table-row' :\n//                                $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);\n//                                $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ?\n//                                        $rowDataTableAttributes['number-rows-repeated'] : 1;\n//                                $columnIndex = 0;\n//\n//                                foreach ($rowData as $key => $cellData) {\n//                                    $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);\n//                                    $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ?\n//                                        $cellDataTableAttributes['number-columns-repeated'] : 1;\n//                                    $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);\n//                                    if (isset($cellDataOfficeAttributes['value-type'])) {\n//                                        $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex + $colRepeats - 1);\n//                                        $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex + $rowRepeats);\n//                                    }\n//                                    $columnIndex += $colRepeats;\n//                                }\n//                                $rowIndex += $rowRepeats;\n//                                break;\n//                        }\n//                    }\n//\n//                    $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);\n//                    $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;\n//\n//                }\n//            }\n        }\n\n        return $worksheetInfo;\n    }\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Create new PHPExcel\n        $objPHPExcel = new PHPExcel();\n\n        // Load into this instance\n        return $this->loadIntoExisting($pFilename, $objPHPExcel);\n    }\n\n    private static function identifyFixedStyleValue($styleList, &$styleAttributeValue)\n    {\n        $styleAttributeValue = strtolower($styleAttributeValue);\n        foreach ($styleList as $style) {\n            if ($styleAttributeValue == strtolower($style)) {\n                $styleAttributeValue = $style;\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Loads PHPExcel from file into PHPExcel instance\n     *\n     * @param     string         $pFilename\n     * @param    PHPExcel    $objPHPExcel\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)\n    {\n        // Check if file exists\n        if (!file_exists($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! File does not exist.\");\n        }\n\n        $timezoneObj = new DateTimeZone('Europe/London');\n        $GMT = new DateTimeZone('UTC');\n\n        $zipClass = PHPExcel_Settings::getZipClass();\n\n        $zip = new $zipClass;\n        if (!$zip->open($pFilename)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $pFilename . \" for reading! Error opening file.\");\n        }\n\n//        echo '<h1>Meta Information</h1>';\n        $xml = simplexml_load_string($this->securityScan($zip->getFromName(\"meta.xml\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n        $namespacesMeta = $xml->getNamespaces(true);\n//        echo '<pre>';\n//        print_r($namespacesMeta);\n//        echo '</pre><hr />';\n\n        $docProps = $objPHPExcel->getProperties();\n        $officeProperty = $xml->children($namespacesMeta['office']);\n        foreach ($officeProperty as $officePropertyData) {\n            $officePropertyDC = array();\n            if (isset($namespacesMeta['dc'])) {\n                $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']);\n            }\n            foreach ($officePropertyDC as $propertyName => $propertyValue) {\n                $propertyValue = (string) $propertyValue;\n                switch ($propertyName) {\n                    case 'title':\n                        $docProps->setTitle($propertyValue);\n                        break;\n                    case 'subject':\n                        $docProps->setSubject($propertyValue);\n                        break;\n                    case 'creator':\n                        $docProps->setCreator($propertyValue);\n                        $docProps->setLastModifiedBy($propertyValue);\n                        break;\n                    case 'date':\n                        $creationDate = strtotime($propertyValue);\n                        $docProps->setCreated($creationDate);\n                        $docProps->setModified($creationDate);\n                        break;\n                    case 'description':\n                        $docProps->setDescription($propertyValue);\n                        break;\n                }\n            }\n            $officePropertyMeta = array();\n            if (isset($namespacesMeta['dc'])) {\n                $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);\n            }\n            foreach ($officePropertyMeta as $propertyName => $propertyValue) {\n                $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']);\n                $propertyValue = (string) $propertyValue;\n                switch ($propertyName) {\n                    case 'initial-creator':\n                        $docProps->setCreator($propertyValue);\n                        break;\n                    case 'keyword':\n                        $docProps->setKeywords($propertyValue);\n                        break;\n                    case 'creation-date':\n                        $creationDate = strtotime($propertyValue);\n                        $docProps->setCreated($creationDate);\n                        break;\n                    case 'user-defined':\n                        $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;\n                        foreach ($propertyValueAttributes as $key => $value) {\n                            if ($key == 'name') {\n                                $propertyValueName = (string) $value;\n                            } elseif ($key == 'value-type') {\n                                switch ($value) {\n                                    case 'date':\n                                        $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue, 'date');\n                                        $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE;\n                                        break;\n                                    case 'boolean':\n                                        $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue, 'bool');\n                                        $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN;\n                                        break;\n                                    case 'float':\n                                        $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue, 'r4');\n                                        $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT;\n                                        break;\n                                    default:\n                                        $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING;\n                                }\n                            }\n                        }\n                        $docProps->setCustomProperty($propertyValueName, $propertyValue, $propertyValueType);\n                        break;\n                }\n            }\n        }\n\n\n//        echo '<h1>Workbook Content</h1>';\n        $xml = simplexml_load_string($this->securityScan($zip->getFromName(\"content.xml\")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions());\n        $namespacesContent = $xml->getNamespaces(true);\n//        echo '<pre>';\n//        print_r($namespacesContent);\n//        echo '</pre><hr />';\n\n        $workbook = $xml->children($namespacesContent['office']);\n        foreach ($workbook->body->spreadsheet as $workbookData) {\n            $workbookData = $workbookData->children($namespacesContent['table']);\n            $worksheetID = 0;\n            foreach ($workbookData->table as $worksheetDataSet) {\n                $worksheetData = $worksheetDataSet->children($namespacesContent['table']);\n//                print_r($worksheetData);\n//                echo '<br />';\n                $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);\n//                print_r($worksheetDataAttributes);\n//                echo '<br />';\n                if ((isset($this->loadSheetsOnly)) && (isset($worksheetDataAttributes['name'])) &&\n                    (!in_array($worksheetDataAttributes['name'], $this->loadSheetsOnly))) {\n                    continue;\n                }\n\n//                echo '<h2>Worksheet '.$worksheetDataAttributes['name'].'</h2>';\n                // Create new Worksheet\n                $objPHPExcel->createSheet();\n                $objPHPExcel->setActiveSheetIndex($worksheetID);\n                if (isset($worksheetDataAttributes['name'])) {\n                    $worksheetName = (string) $worksheetDataAttributes['name'];\n                    //    Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in\n                    //        formula cells... during the load, all formulae should be correct, and we're simply\n                    //        bringing the worksheet name in line with the formula, not the reverse\n                    $objPHPExcel->getActiveSheet()->setTitle($worksheetName, false);\n                }\n\n                $rowID = 1;\n                foreach ($worksheetData as $key => $rowData) {\n//                    echo '<b>'.$key.'</b><br />';\n                    switch ($key) {\n                        case 'table-header-rows':\n                            foreach ($rowData as $key => $cellData) {\n                                $rowData = $cellData;\n                                break;\n                            }\n                        case 'table-row':\n                            $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);\n                            $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ? $rowDataTableAttributes['number-rows-repeated'] : 1;\n                            $columnID = 'A';\n                            foreach ($rowData as $key => $cellData) {\n                                if ($this->getReadFilter() !== null) {\n                                    if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) {\n                                        continue;\n                                    }\n                                }\n\n//                                echo '<b>'.$columnID.$rowID.'</b><br />';\n                                $cellDataText = (isset($namespacesContent['text'])) ? $cellData->children($namespacesContent['text']) : '';\n                                $cellDataOffice = $cellData->children($namespacesContent['office']);\n                                $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);\n                                $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);\n\n//                                echo 'Office Attributes: ';\n//                                print_r($cellDataOfficeAttributes);\n//                                echo '<br />Table Attributes: ';\n//                                print_r($cellDataTableAttributes);\n//                                echo '<br />Cell Data Text';\n//                                print_r($cellDataText);\n//                                echo '<br />';\n//\n                                $type = $formatting = $hyperlink = null;\n                                $hasCalculatedValue = false;\n                                $cellDataFormula = '';\n                                if (isset($cellDataTableAttributes['formula'])) {\n                                    $cellDataFormula = $cellDataTableAttributes['formula'];\n                                    $hasCalculatedValue = true;\n                                }\n\n                                if (isset($cellDataOffice->annotation)) {\n//                                    echo 'Cell has comment<br />';\n                                    $annotationText = $cellDataOffice->annotation->children($namespacesContent['text']);\n                                    $textArray = array();\n                                    foreach ($annotationText as $t) {\n                                        if (isset($t->span)) {\n                                            foreach ($t->span as $text) {\n                                                $textArray[] = (string)$text;\n                                            }\n                                        } else {\n                                            $textArray[] = (string) $t;\n                                        }\n                                    }\n                                    $text = implode(\"\\n\", $textArray);\n//                                    echo $text, '<br />';\n                                    $objPHPExcel->getActiveSheet()->getComment($columnID.$rowID)->setText($this->parseRichText($text));\n//                                                                    ->setAuthor( $author )\n                                }\n\n                                if (isset($cellDataText->p)) {\n                                    // Consolidate if there are multiple p records (maybe with spans as well)\n                                    $dataArray = array();\n                                    // Text can have multiple text:p and within those, multiple text:span.\n                                    // text:p newlines, but text:span does not.\n                                    // Also, here we assume there is no text data is span fields are specified, since\n                                    // we have no way of knowing proper positioning anyway.\n                                    foreach ($cellDataText->p as $pData) {\n                                        if (isset($pData->span)) {\n                                            // span sections do not newline, so we just create one large string here\n                                            $spanSection = \"\";\n                                            foreach ($pData->span as $spanData) {\n                                                $spanSection .= $spanData;\n                                            }\n                                            array_push($dataArray, $spanSection);\n                                        } else {\n                                            array_push($dataArray, $pData);\n                                        }\n                                    }\n                                    $allCellDataText = implode($dataArray, \"\\n\");\n\n//                                    echo 'Value Type is '.$cellDataOfficeAttributes['value-type'].'<br />';\n                                    switch ($cellDataOfficeAttributes['value-type']) {\n                                        case 'string':\n                                            $type = PHPExcel_Cell_DataType::TYPE_STRING;\n                                            $dataValue = $allCellDataText;\n                                            if (isset($dataValue->a)) {\n                                                $dataValue = $dataValue->a;\n                                                $cellXLinkAttributes = $dataValue->attributes($namespacesContent['xlink']);\n                                                $hyperlink = $cellXLinkAttributes['href'];\n                                            }\n                                            break;\n                                        case 'boolean':\n                                            $type = PHPExcel_Cell_DataType::TYPE_BOOL;\n                                            $dataValue = ($allCellDataText == 'TRUE') ? true : false;\n                                            break;\n                                        case 'percentage':\n                                            $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                            $dataValue = (float) $cellDataOfficeAttributes['value'];\n                                            if (floor($dataValue) == $dataValue) {\n                                                $dataValue = (integer) $dataValue;\n                                            }\n                                            $formatting = PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00;\n                                            break;\n                                        case 'currency':\n                                            $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                            $dataValue = (float) $cellDataOfficeAttributes['value'];\n                                            if (floor($dataValue) == $dataValue) {\n                                                $dataValue = (integer) $dataValue;\n                                            }\n                                            $formatting = PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE;\n                                            break;\n                                        case 'float':\n                                            $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                            $dataValue = (float) $cellDataOfficeAttributes['value'];\n                                            if (floor($dataValue) == $dataValue) {\n                                                if ($dataValue == (integer) $dataValue) {\n                                                    $dataValue = (integer) $dataValue;\n                                                } else {\n                                                    $dataValue = (float) $dataValue;\n                                                }\n                                            }\n                                            break;\n                                        case 'date':\n                                            $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                            $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT);\n                                            $dateObj->setTimeZone($timezoneObj);\n                                            list($year, $month, $day, $hour, $minute, $second) = explode(' ', $dateObj->format('Y m d H i s'));\n                                            $dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year, $month, $day, $hour, $minute, $second);\n                                            if ($dataValue != floor($dataValue)) {\n                                                $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15.' '.PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4;\n                                            } else {\n                                                $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15;\n                                            }\n                                            break;\n                                        case 'time':\n                                            $type = PHPExcel_Cell_DataType::TYPE_NUMERIC;\n                                            $dataValue = PHPExcel_Shared_Date::PHPToExcel(strtotime('01-01-1970 '.implode(':', sscanf($cellDataOfficeAttributes['time-value'], 'PT%dH%dM%dS'))));\n                                            $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4;\n                                            break;\n                                    }\n//                                    echo 'Data value is '.$dataValue.'<br />';\n//                                    if ($hyperlink !== null) {\n//                                        echo 'Hyperlink is '.$hyperlink.'<br />';\n//                                    }\n                                } else {\n                                    $type = PHPExcel_Cell_DataType::TYPE_NULL;\n                                    $dataValue = null;\n                                }\n\n                                if ($hasCalculatedValue) {\n                                    $type = PHPExcel_Cell_DataType::TYPE_FORMULA;\n//                                    echo 'Formula: ', $cellDataFormula, PHP_EOL;\n                                    $cellDataFormula = substr($cellDataFormula, strpos($cellDataFormula, ':=')+1);\n                                    $temp = explode('\"', $cellDataFormula);\n                                    $tKey = false;\n                                    foreach ($temp as &$value) {\n                                        //    Only replace in alternate array entries (i.e. non-quoted blocks)\n                                        if ($tKey = !$tKey) {\n                                            $value = preg_replace('/\\[([^\\.]+)\\.([^\\.]+):\\.([^\\.]+)\\]/Ui', '$1!$2:$3', $value);    //  Cell range reference in another sheet\n                                            $value = preg_replace('/\\[([^\\.]+)\\.([^\\.]+)\\]/Ui', '$1!$2', $value);       //  Cell reference in another sheet\n                                            $value = preg_replace('/\\[\\.([^\\.]+):\\.([^\\.]+)\\]/Ui', '$1:$2', $value);    //  Cell range reference\n                                            $value = preg_replace('/\\[\\.([^\\.]+)\\]/Ui', '$1', $value);                  //  Simple cell reference\n                                            $value = PHPExcel_Calculation::translateSeparator(';', ',', $value, $inBraces);\n                                        }\n                                    }\n                                    unset($value);\n                                    //    Then rebuild the formula string\n                                    $cellDataFormula = implode('\"', $temp);\n//                                    echo 'Adjusted Formula: ', $cellDataFormula, PHP_EOL;\n                                }\n\n                                $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ? $cellDataTableAttributes['number-columns-repeated'] : 1;\n                                if ($type !== null) {\n                                    for ($i = 0; $i < $colRepeats; ++$i) {\n                                        if ($i > 0) {\n                                            ++$columnID;\n                                        }\n                                        if ($type !== PHPExcel_Cell_DataType::TYPE_NULL) {\n                                            for ($rowAdjust = 0; $rowAdjust < $rowRepeats; ++$rowAdjust) {\n                                                $rID = $rowID + $rowAdjust;\n                                                $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $dataValue), $type);\n                                                if ($hasCalculatedValue) {\n//                                                    echo 'Forumla result is '.$dataValue.'<br />';\n                                                    $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setCalculatedValue($dataValue);\n                                                }\n                                                if ($formatting !== null) {\n                                                    $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode($formatting);\n                                                } else {\n                                                    $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_GENERAL);\n                                                }\n                                                if ($hyperlink !== null) {\n                                                    $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->getHyperlink()->setUrl($hyperlink);\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n\n                                //    Merged cells\n                                if ((isset($cellDataTableAttributes['number-columns-spanned'])) || (isset($cellDataTableAttributes['number-rows-spanned']))) {\n                                    if (($type !== PHPExcel_Cell_DataType::TYPE_NULL) || (!$this->readDataOnly)) {\n                                        $columnTo = $columnID;\n                                        if (isset($cellDataTableAttributes['number-columns-spanned'])) {\n                                            $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cellDataTableAttributes['number-columns-spanned'] -2);\n                                        }\n                                        $rowTo = $rowID;\n                                        if (isset($cellDataTableAttributes['number-rows-spanned'])) {\n                                            $rowTo = $rowTo + $cellDataTableAttributes['number-rows-spanned'] - 1;\n                                        }\n                                        $cellRange = $columnID.$rowID.':'.$columnTo.$rowTo;\n                                        $objPHPExcel->getActiveSheet()->mergeCells($cellRange);\n                                    }\n                                }\n\n                                ++$columnID;\n                            }\n                            $rowID += $rowRepeats;\n                            break;\n                    }\n                }\n                ++$worksheetID;\n            }\n        }\n\n        // Return\n        return $objPHPExcel;\n    }\n\n    private function parseRichText($is = '')\n    {\n        $value = new PHPExcel_RichText();\n\n        $value->createText($is);\n\n        return $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Reader/SYLK.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Reader_SYLK\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Reader\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Reader_SYLK extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader\n{\n    /**\n     * Input encoding\n     *\n     * @var string\n     */\n    private $inputEncoding = 'ANSI';\n\n    /**\n     * Sheet index to read\n     *\n     * @var int\n     */\n    private $sheetIndex = 0;\n\n    /**\n     * Formats\n     *\n     * @var array\n     */\n    private $formats = array();\n\n    /**\n     * Format Count\n     *\n     * @var int\n     */\n    private $format = 0;\n\n    /**\n     * Create a new PHPExcel_Reader_SYLK\n     */\n    public function __construct()\n    {\n        $this->readFilter = new PHPExcel_Reader_DefaultReadFilter();\n    }\n\n    /**\n     * Validate that the current file is a SYLK file\n     *\n     * @return boolean\n     */\n    protected function isValidFormat()\n    {\n        // Read sample data (first 2 KB will do)\n        $data = fread($this->fileHandle, 2048);\n\n        // Count delimiters in file\n        $delimiterCount = substr_count($data, ';');\n        if ($delimiterCount < 1) {\n            return false;\n        }\n\n        // Analyze first line looking for ID; signature\n        $lines = explode(\"\\n\", $data);\n        if (substr($lines[0], 0, 4) != 'ID;P') {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Set input encoding\n     *\n     * @param string $pValue Input encoding\n     */\n    public function setInputEncoding($pValue = 'ANSI')\n    {\n        $this->inputEncoding = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get input encoding\n     *\n     * @return string\n     */\n    public function getInputEncoding()\n    {\n        return $this->inputEncoding;\n    }\n\n    /**\n     * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)\n     *\n     * @param   string     $pFilename\n     * @throws   PHPExcel_Reader_Exception\n     */\n    public function listWorksheetInfo($pFilename)\n    {\n        // Open file\n        $this->openFile($pFilename);\n        if (!$this->isValidFormat()) {\n            fclose($this->fileHandle);\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid Spreadsheet file.\");\n        }\n        $fileHandle = $this->fileHandle;\n        rewind($fileHandle);\n\n        $worksheetInfo = array();\n        $worksheetInfo[0]['worksheetName'] = 'Worksheet';\n        $worksheetInfo[0]['lastColumnLetter'] = 'A';\n        $worksheetInfo[0]['lastColumnIndex'] = 0;\n        $worksheetInfo[0]['totalRows'] = 0;\n        $worksheetInfo[0]['totalColumns'] = 0;\n\n        // Loop through file\n        $rowData = array();\n\n        // loop through one row (line) at a time in the file\n        $rowIndex = 0;\n        while (($rowData = fgets($fileHandle)) !== false) {\n            $columnIndex = 0;\n\n            // convert SYLK encoded $rowData to UTF-8\n            $rowData = PHPExcel_Shared_String::SYLKtoUTF8($rowData);\n\n            // explode each row at semicolons while taking into account that literal semicolon (;)\n            // is escaped like this (;;)\n            $rowData = explode(\"\\t\", str_replace('¤', ';', str_replace(';', \"\\t\", str_replace(';;', '¤', rtrim($rowData)))));\n\n            $dataType = array_shift($rowData);\n            if ($dataType == 'C') {\n                //  Read cell value data\n                foreach ($rowData as $rowDatum) {\n                    switch ($rowDatum{0}) {\n                        case 'C':\n                        case 'X':\n                            $columnIndex = substr($rowDatum, 1) - 1;\n                            break;\n                        case 'R':\n                        case 'Y':\n                            $rowIndex = substr($rowDatum, 1);\n                            break;\n                    }\n\n                    $worksheetInfo[0]['totalRows'] = max($worksheetInfo[0]['totalRows'], $rowIndex);\n                    $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], $columnIndex);\n                }\n            }\n        }\n\n        $worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']);\n        $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1;\n\n        // Close file\n        fclose($fileHandle);\n\n        return $worksheetInfo;\n    }\n\n    /**\n     * Loads PHPExcel from file\n     *\n     * @param     string         $pFilename\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function load($pFilename)\n    {\n        // Create new PHPExcel\n        $objPHPExcel = new PHPExcel();\n\n        // Load into this instance\n        return $this->loadIntoExisting($pFilename, $objPHPExcel);\n    }\n\n    /**\n     * Loads PHPExcel from file into PHPExcel instance\n     *\n     * @param     string         $pFilename\n     * @param    PHPExcel    $objPHPExcel\n     * @return     PHPExcel\n     * @throws     PHPExcel_Reader_Exception\n     */\n    public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel)\n    {\n        // Open file\n        $this->openFile($pFilename);\n        if (!$this->isValidFormat()) {\n            fclose($this->fileHandle);\n            throw new PHPExcel_Reader_Exception($pFilename . \" is an Invalid Spreadsheet file.\");\n        }\n        $fileHandle = $this->fileHandle;\n        rewind($fileHandle);\n\n        // Create new PHPExcel\n        while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) {\n            $objPHPExcel->createSheet();\n        }\n        $objPHPExcel->setActiveSheetIndex($this->sheetIndex);\n\n        $fromFormats    = array('\\-',    '\\ ');\n        $toFormats        = array('-',    ' ');\n\n        // Loop through file\n        $rowData = array();\n        $column = $row = '';\n\n        // loop through one row (line) at a time in the file\n        while (($rowData = fgets($fileHandle)) !== false) {\n            // convert SYLK encoded $rowData to UTF-8\n            $rowData = PHPExcel_Shared_String::SYLKtoUTF8($rowData);\n\n            // explode each row at semicolons while taking into account that literal semicolon (;)\n            // is escaped like this (;;)\n            $rowData = explode(\"\\t\", str_replace('¤', ';', str_replace(';', \"\\t\", str_replace(';;', '¤', rtrim($rowData)))));\n\n            $dataType = array_shift($rowData);\n            //    Read shared styles\n            if ($dataType == 'P') {\n                $formatArray = array();\n                foreach ($rowData as $rowDatum) {\n                    switch ($rowDatum{0}) {\n                        case 'P':\n                            $formatArray['numberformat']['code'] = str_replace($fromFormats, $toFormats, substr($rowDatum, 1));\n                            break;\n                        case 'E':\n                        case 'F':\n                            $formatArray['font']['name'] = substr($rowDatum, 1);\n                            break;\n                        case 'L':\n                            $formatArray['font']['size'] = substr($rowDatum, 1);\n                            break;\n                        case 'S':\n                            $styleSettings = substr($rowDatum, 1);\n                            for ($i=0; $i<strlen($styleSettings); ++$i) {\n                                switch ($styleSettings{$i}) {\n                                    case 'I':\n                                        $formatArray['font']['italic'] = true;\n                                        break;\n                                    case 'D':\n                                        $formatArray['font']['bold'] = true;\n                                        break;\n                                    case 'T':\n                                        $formatArray['borders']['top']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                    case 'B':\n                                        $formatArray['borders']['bottom']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                    case 'L':\n                                        $formatArray['borders']['left']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                    case 'R':\n                                        $formatArray['borders']['right']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                }\n                            }\n                            break;\n                    }\n                }\n                $this->formats['P'.$this->format++] = $formatArray;\n            //    Read cell value data\n            } elseif ($dataType == 'C') {\n                $hasCalculatedValue = false;\n                $cellData = $cellDataFormula = '';\n                foreach ($rowData as $rowDatum) {\n                    switch ($rowDatum{0}) {\n                        case 'C':\n                        case 'X':\n                            $column = substr($rowDatum, 1);\n                            break;\n                        case 'R':\n                        case 'Y':\n                            $row = substr($rowDatum, 1);\n                            break;\n                        case 'K':\n                            $cellData = substr($rowDatum, 1);\n                            break;\n                        case 'E':\n                            $cellDataFormula = '='.substr($rowDatum, 1);\n                            //    Convert R1C1 style references to A1 style references (but only when not quoted)\n                            $temp = explode('\"', $cellDataFormula);\n                            $key = false;\n                            foreach ($temp as &$value) {\n                                //    Only count/replace in alternate array entries\n                                if ($key = !$key) {\n                                    preg_match_all('/(R(\\[?-?\\d*\\]?))(C(\\[?-?\\d*\\]?))/', $value, $cellReferences, PREG_SET_ORDER+PREG_OFFSET_CAPTURE);\n                                    //    Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way\n                                    //        through the formula from left to right. Reversing means that we work right to left.through\n                                    //        the formula\n                                    $cellReferences = array_reverse($cellReferences);\n                                    //    Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent,\n                                    //        then modify the formula to use that new reference\n                                    foreach ($cellReferences as $cellReference) {\n                                        $rowReference = $cellReference[2][0];\n                                        //    Empty R reference is the current row\n                                        if ($rowReference == '') {\n                                            $rowReference = $row;\n                                        }\n                                        //    Bracketed R references are relative to the current row\n                                        if ($rowReference{0} == '[') {\n                                            $rowReference = $row + trim($rowReference, '[]');\n                                        }\n                                        $columnReference = $cellReference[4][0];\n                                        //    Empty C reference is the current column\n                                        if ($columnReference == '') {\n                                            $columnReference = $column;\n                                        }\n                                        //    Bracketed C references are relative to the current column\n                                        if ($columnReference{0} == '[') {\n                                            $columnReference = $column + trim($columnReference, '[]');\n                                        }\n                                        $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference;\n\n                                        $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));\n                                    }\n                                }\n                            }\n                            unset($value);\n                            //    Then rebuild the formula string\n                            $cellDataFormula = implode('\"', $temp);\n                            $hasCalculatedValue = true;\n                            break;\n                    }\n                }\n                $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1);\n                $cellData = PHPExcel_Calculation::unwrapResult($cellData);\n\n                // Set cell value\n                $objPHPExcel->getActiveSheet()->getCell($columnLetter.$row)->setValue(($hasCalculatedValue) ? $cellDataFormula : $cellData);\n                if ($hasCalculatedValue) {\n                    $cellData = PHPExcel_Calculation::unwrapResult($cellData);\n                    $objPHPExcel->getActiveSheet()->getCell($columnLetter.$row)->setCalculatedValue($cellData);\n                }\n            //    Read cell formatting\n            } elseif ($dataType == 'F') {\n                $formatStyle = $columnWidth = $styleSettings = '';\n                $styleData = array();\n                foreach ($rowData as $rowDatum) {\n                    switch ($rowDatum{0}) {\n                        case 'C':\n                        case 'X':\n                            $column = substr($rowDatum, 1);\n                            break;\n                        case 'R':\n                        case 'Y':\n                            $row = substr($rowDatum, 1);\n                            break;\n                        case 'P':\n                            $formatStyle = $rowDatum;\n                            break;\n                        case 'W':\n                            list($startCol, $endCol, $columnWidth) = explode(' ', substr($rowDatum, 1));\n                            break;\n                        case 'S':\n                            $styleSettings = substr($rowDatum, 1);\n                            for ($i=0; $i<strlen($styleSettings); ++$i) {\n                                switch ($styleSettings{$i}) {\n                                    case 'I':\n                                        $styleData['font']['italic'] = true;\n                                        break;\n                                    case 'D':\n                                        $styleData['font']['bold'] = true;\n                                        break;\n                                    case 'T':\n                                        $styleData['borders']['top']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                    case 'B':\n                                        $styleData['borders']['bottom']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                    case 'L':\n                                        $styleData['borders']['left']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                    case 'R':\n                                        $styleData['borders']['right']['style'] = PHPExcel_Style_Border::BORDER_THIN;\n                                        break;\n                                }\n                            }\n                            break;\n                    }\n                }\n                if (($formatStyle > '') && ($column > '') && ($row > '')) {\n                    $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1);\n                    if (isset($this->formats[$formatStyle])) {\n                        $objPHPExcel->getActiveSheet()->getStyle($columnLetter.$row)->applyFromArray($this->formats[$formatStyle]);\n                    }\n                }\n                if ((!empty($styleData)) && ($column > '') && ($row > '')) {\n                    $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1);\n                    $objPHPExcel->getActiveSheet()->getStyle($columnLetter.$row)->applyFromArray($styleData);\n                }\n                if ($columnWidth > '') {\n                    if ($startCol == $endCol) {\n                        $startCol = PHPExcel_Cell::stringFromColumnIndex($startCol-1);\n                        $objPHPExcel->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth);\n                    } else {\n                        $startCol = PHPExcel_Cell::stringFromColumnIndex($startCol-1);\n                        $endCol = PHPExcel_Cell::stringFromColumnIndex($endCol-1);\n                        $objPHPExcel->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth);\n                        do {\n                            $objPHPExcel->getActiveSheet()->getColumnDimension(++$startCol)->setWidth($columnWidth);\n                        } while ($startCol != $endCol);\n                    }\n                }\n            } else {\n                foreach ($rowData as $rowDatum) {\n                    switch ($rowDatum{0}) {\n                        case 'C':\n                        case 'X':\n                            $column = substr($rowDatum, 1);\n                            break;\n                        case 'R':\n                        case 'Y':\n                            $row = substr($rowDatum, 1);\n                            break;\n                    }\n                }\n            }\n        }\n\n        // Close file\n        fclose($fileHandle);\n\n        // Return\n        return $objPHPExcel;\n    }\n\n    /**\n     * Get sheet index\n     *\n     * @return int\n     */\n    public function getSheetIndex()\n    {\n        return $this->sheetIndex;\n    }\n\n    /**\n     * Set sheet index\n     *\n     * @param    int        $pValue        Sheet index\n     * @return PHPExcel_Reader_SYLK\n     */\n    public function setSheetIndex($pValue = 0)\n    {\n        $this->sheetIndex = $pValue;\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/ReferenceHelper.php",
    "content": "<?php\n\n/**\n * PHPExcel_ReferenceHelper (Singleton)\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_ReferenceHelper\n{\n    /**    Constants                */\n    /**    Regular Expressions      */\n    const REFHELPER_REGEXP_CELLREF      = '((\\w*|\\'[^!]*\\')!)?(?<![:a-z\\$])(\\$?[a-z]{1,3}\\$?\\d+)(?=[^:!\\d\\'])';\n    const REFHELPER_REGEXP_CELLRANGE    = '((\\w*|\\'[^!]*\\')!)?(\\$?[a-z]{1,3}\\$?\\d+):(\\$?[a-z]{1,3}\\$?\\d+)';\n    const REFHELPER_REGEXP_ROWRANGE     = '((\\w*|\\'[^!]*\\')!)?(\\$?\\d+):(\\$?\\d+)';\n    const REFHELPER_REGEXP_COLRANGE     = '((\\w*|\\'[^!]*\\')!)?(\\$?[a-z]{1,3}):(\\$?[a-z]{1,3})';\n\n    /**\n     * Instance of this class\n     *\n     * @var PHPExcel_ReferenceHelper\n     */\n    private static $instance;\n\n    /**\n     * Get an instance of this class\n     *\n     * @return PHPExcel_ReferenceHelper\n     */\n    public static function getInstance()\n    {\n        if (!isset(self::$instance) || (self::$instance === null)) {\n            self::$instance = new PHPExcel_ReferenceHelper();\n        }\n\n        return self::$instance;\n    }\n\n    /**\n     * Create a new PHPExcel_ReferenceHelper\n     */\n    protected function __construct()\n    {\n    }\n\n    /**\n     * Compare two column addresses\n     * Intended for use as a Callback function for sorting column addresses by column\n     *\n     * @param   string   $a  First column to test (e.g. 'AA')\n     * @param   string   $b  Second column to test (e.g. 'Z')\n     * @return  integer\n     */\n    public static function columnSort($a, $b)\n    {\n        return strcasecmp(strlen($a) . $a, strlen($b) . $b);\n    }\n\n    /**\n     * Compare two column addresses\n     * Intended for use as a Callback function for reverse sorting column addresses by column\n     *\n     * @param   string   $a  First column to test (e.g. 'AA')\n     * @param   string   $b  Second column to test (e.g. 'Z')\n     * @return  integer\n     */\n    public static function columnReverseSort($a, $b)\n    {\n        return 1 - strcasecmp(strlen($a) . $a, strlen($b) . $b);\n    }\n\n    /**\n     * Compare two cell addresses\n     * Intended for use as a Callback function for sorting cell addresses by column and row\n     *\n     * @param   string   $a  First cell to test (e.g. 'AA1')\n     * @param   string   $b  Second cell to test (e.g. 'Z1')\n     * @return  integer\n     */\n    public static function cellSort($a, $b)\n    {\n        sscanf($a, '%[A-Z]%d', $ac, $ar);\n        sscanf($b, '%[A-Z]%d', $bc, $br);\n\n        if ($ar == $br) {\n            return strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc);\n        }\n        return ($ar < $br) ? -1 : 1;\n    }\n\n    /**\n     * Compare two cell addresses\n     * Intended for use as a Callback function for sorting cell addresses by column and row\n     *\n     * @param   string   $a  First cell to test (e.g. 'AA1')\n     * @param   string   $b  Second cell to test (e.g. 'Z1')\n     * @return  integer\n     */\n    public static function cellReverseSort($a, $b)\n    {\n        sscanf($a, '%[A-Z]%d', $ac, $ar);\n        sscanf($b, '%[A-Z]%d', $bc, $br);\n\n        if ($ar == $br) {\n            return 1 - strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc);\n        }\n        return ($ar < $br) ? 1 : -1;\n    }\n\n    /**\n     * Test whether a cell address falls within a defined range of cells\n     *\n     * @param   string     $cellAddress        Address of the cell we're testing\n     * @param   integer    $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer    $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     * @param   integer    $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer    $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @return  boolean\n     */\n    private static function cellAddressInDeleteRange($cellAddress, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)\n    {\n        list($cellColumn, $cellRow) = PHPExcel_Cell::coordinateFromString($cellAddress);\n        $cellColumnIndex = PHPExcel_Cell::columnIndexFromString($cellColumn);\n        //    Is cell within the range of rows/columns if we're deleting\n        if ($pNumRows < 0 &&\n            ($cellRow >= ($beforeRow + $pNumRows)) &&\n            ($cellRow < $beforeRow)) {\n            return true;\n        } elseif ($pNumCols < 0 &&\n            ($cellColumnIndex >= ($beforeColumnIndex + $pNumCols)) &&\n            ($cellColumnIndex < $beforeColumnIndex)) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Update page breaks when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustPageBreaks(PHPExcel_Worksheet $pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aBreaks = $pSheet->getBreaks();\n        ($pNumCols > 0 || $pNumRows > 0) ?\n            uksort($aBreaks, array('PHPExcel_ReferenceHelper','cellReverseSort')) :\n            uksort($aBreaks, array('PHPExcel_ReferenceHelper','cellSort'));\n\n        foreach ($aBreaks as $key => $value) {\n            if (self::cellAddressInDeleteRange($key, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)) {\n                //    If we're deleting, then clear any defined breaks that are within the range\n                //        of rows/columns that we're deleting\n                $pSheet->setBreak($key, PHPExcel_Worksheet::BREAK_NONE);\n            } else {\n                //    Otherwise update any affected breaks by inserting a new break at the appropriate point\n                //        and removing the old affected break\n                $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows);\n                if ($key != $newReference) {\n                    $pSheet->setBreak($newReference, $value)\n                        ->setBreak($key, PHPExcel_Worksheet::BREAK_NONE);\n                }\n            }\n        }\n    }\n\n    /**\n     * Update cell comments when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustComments($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aComments = $pSheet->getComments();\n        $aNewComments = array(); // the new array of all comments\n\n        foreach ($aComments as $key => &$value) {\n            // Any comments inside a deleted range will be ignored\n            if (!self::cellAddressInDeleteRange($key, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)) {\n                // Otherwise build a new array of comments indexed by the adjusted cell reference\n                $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows);\n                $aNewComments[$newReference] = $value;\n            }\n        }\n        //    Replace the comments array with the new set of comments\n        $pSheet->setComments($aNewComments);\n    }\n\n    /**\n     * Update hyperlinks when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustHyperlinks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aHyperlinkCollection = $pSheet->getHyperlinkCollection();\n        ($pNumCols > 0 || $pNumRows > 0) ? uksort($aHyperlinkCollection, array('PHPExcel_ReferenceHelper','cellReverseSort')) : uksort($aHyperlinkCollection, array('PHPExcel_ReferenceHelper','cellSort'));\n\n        foreach ($aHyperlinkCollection as $key => $value) {\n            $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows);\n            if ($key != $newReference) {\n                $pSheet->setHyperlink($newReference, $value);\n                $pSheet->setHyperlink($key, null);\n            }\n        }\n    }\n\n    /**\n     * Update data validations when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustDataValidations($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aDataValidationCollection = $pSheet->getDataValidationCollection();\n        ($pNumCols > 0 || $pNumRows > 0) ? uksort($aDataValidationCollection, array('PHPExcel_ReferenceHelper','cellReverseSort')) : uksort($aDataValidationCollection, array('PHPExcel_ReferenceHelper','cellSort'));\n        \n        foreach ($aDataValidationCollection as $key => $value) {\n            $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows);\n            if ($key != $newReference) {\n                $pSheet->setDataValidation($newReference, $value);\n                $pSheet->setDataValidation($key, null);\n            }\n        }\n    }\n\n    /**\n     * Update merged cells when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustMergeCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aMergeCells = $pSheet->getMergeCells();\n        $aNewMergeCells = array(); // the new array of all merge cells\n        foreach ($aMergeCells as $key => &$value) {\n            $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows);\n            $aNewMergeCells[$newReference] = $newReference;\n        }\n        $pSheet->setMergeCells($aNewMergeCells); // replace the merge cells array\n    }\n\n    /**\n     * Update protected cells when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustProtectedCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aProtectedCells = $pSheet->getProtectedCells();\n        ($pNumCols > 0 || $pNumRows > 0) ?\n            uksort($aProtectedCells, array('PHPExcel_ReferenceHelper','cellReverseSort')) :\n            uksort($aProtectedCells, array('PHPExcel_ReferenceHelper','cellSort'));\n        foreach ($aProtectedCells as $key => $value) {\n            $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows);\n            if ($key != $newReference) {\n                $pSheet->protectCells($newReference, $value, true);\n                $pSheet->unprotectCells($key);\n            }\n        }\n    }\n\n    /**\n     * Update column dimensions when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustColumnDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aColumnDimensions = array_reverse($pSheet->getColumnDimensions(), true);\n        if (!empty($aColumnDimensions)) {\n            foreach ($aColumnDimensions as $objColumnDimension) {\n                $newReference = $this->updateCellReference($objColumnDimension->getColumnIndex() . '1', $pBefore, $pNumCols, $pNumRows);\n                list($newReference) = PHPExcel_Cell::coordinateFromString($newReference);\n                if ($objColumnDimension->getColumnIndex() != $newReference) {\n                    $objColumnDimension->setColumnIndex($newReference);\n                }\n            }\n            $pSheet->refreshColumnDimensions();\n        }\n    }\n\n    /**\n     * Update row dimensions when inserting/deleting rows/columns\n     *\n     * @param   PHPExcel_Worksheet  $pSheet             The worksheet that we're editing\n     * @param   string              $pBefore            Insert/Delete before this cell address (e.g. 'A1')\n     * @param   integer             $beforeColumnIndex  Index number of the column we're inserting/deleting before\n     * @param   integer             $pNumCols           Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $beforeRow          Number of the row we're inserting/deleting before\n     * @param   integer             $pNumRows           Number of rows to insert/delete (negative values indicate deletion)\n     */\n    protected function adjustRowDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows)\n    {\n        $aRowDimensions = array_reverse($pSheet->getRowDimensions(), true);\n        if (!empty($aRowDimensions)) {\n            foreach ($aRowDimensions as $objRowDimension) {\n                $newReference = $this->updateCellReference('A' . $objRowDimension->getRowIndex(), $pBefore, $pNumCols, $pNumRows);\n                list(, $newReference) = PHPExcel_Cell::coordinateFromString($newReference);\n                if ($objRowDimension->getRowIndex() != $newReference) {\n                    $objRowDimension->setRowIndex($newReference);\n                }\n            }\n            $pSheet->refreshRowDimensions();\n\n            $copyDimension = $pSheet->getRowDimension($beforeRow - 1);\n            for ($i = $beforeRow; $i <= $beforeRow - 1 + $pNumRows; ++$i) {\n                $newDimension = $pSheet->getRowDimension($i);\n                $newDimension->setRowHeight($copyDimension->getRowHeight());\n                $newDimension->setVisible($copyDimension->getVisible());\n                $newDimension->setOutlineLevel($copyDimension->getOutlineLevel());\n                $newDimension->setCollapsed($copyDimension->getCollapsed());\n            }\n        }\n    }\n\n    /**\n     * Insert a new column or row, updating all possible related data\n     *\n     * @param   string              $pBefore    Insert before this cell address (e.g. 'A1')\n     * @param   integer             $pNumCols   Number of columns to insert/delete (negative values indicate deletion)\n     * @param   integer             $pNumRows   Number of rows to insert/delete (negative values indicate deletion)\n     * @param   PHPExcel_Worksheet  $pSheet     The worksheet that we're editing\n     * @throws  PHPExcel_Exception\n     */\n    public function insertNewBefore($pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, PHPExcel_Worksheet $pSheet = null)\n    {\n        $remove = ($pNumCols < 0 || $pNumRows < 0);\n        $aCellCollection = $pSheet->getCellCollection();\n\n        // Get coordinates of $pBefore\n        $beforeColumn    = 'A';\n        $beforeRow        = 1;\n        list($beforeColumn, $beforeRow) = PHPExcel_Cell::coordinateFromString($pBefore);\n        $beforeColumnIndex = PHPExcel_Cell::columnIndexFromString($beforeColumn);\n\n        // Clear cells if we are removing columns or rows\n        $highestColumn    = $pSheet->getHighestColumn();\n        $highestRow    = $pSheet->getHighestRow();\n\n        // 1. Clear column strips if we are removing columns\n        if ($pNumCols < 0 && $beforeColumnIndex - 2 + $pNumCols > 0) {\n            for ($i = 1; $i <= $highestRow - 1; ++$i) {\n                for ($j = $beforeColumnIndex - 1 + $pNumCols; $j <= $beforeColumnIndex - 2; ++$j) {\n                    $coordinate = PHPExcel_Cell::stringFromColumnIndex($j) . $i;\n                    $pSheet->removeConditionalStyles($coordinate);\n                    if ($pSheet->cellExists($coordinate)) {\n                        $pSheet->getCell($coordinate)->setValueExplicit('', PHPExcel_Cell_DataType::TYPE_NULL);\n                        $pSheet->getCell($coordinate)->setXfIndex(0);\n                    }\n                }\n            }\n        }\n\n        // 2. Clear row strips if we are removing rows\n        if ($pNumRows < 0 && $beforeRow - 1 + $pNumRows > 0) {\n            for ($i = $beforeColumnIndex - 1; $i <= PHPExcel_Cell::columnIndexFromString($highestColumn) - 1; ++$i) {\n                for ($j = $beforeRow + $pNumRows; $j <= $beforeRow - 1; ++$j) {\n                    $coordinate = PHPExcel_Cell::stringFromColumnIndex($i) . $j;\n                    $pSheet->removeConditionalStyles($coordinate);\n                    if ($pSheet->cellExists($coordinate)) {\n                        $pSheet->getCell($coordinate)->setValueExplicit('', PHPExcel_Cell_DataType::TYPE_NULL);\n                        $pSheet->getCell($coordinate)->setXfIndex(0);\n                    }\n                }\n            }\n        }\n\n        // Loop through cells, bottom-up, and change cell coordinates\n        if ($remove) {\n            // It's faster to reverse and pop than to use unshift, especially with large cell collections\n            $aCellCollection = array_reverse($aCellCollection);\n        }\n        while ($cellID = array_pop($aCellCollection)) {\n            $cell = $pSheet->getCell($cellID);\n            $cellIndex = PHPExcel_Cell::columnIndexFromString($cell->getColumn());\n\n            if ($cellIndex-1 + $pNumCols < 0) {\n                continue;\n            }\n\n            // New coordinates\n            $newCoordinates = PHPExcel_Cell::stringFromColumnIndex($cellIndex-1 + $pNumCols) . ($cell->getRow() + $pNumRows);\n\n            // Should the cell be updated? Move value and cellXf index from one cell to another.\n            if (($cellIndex >= $beforeColumnIndex) && ($cell->getRow() >= $beforeRow)) {\n                // Update cell styles\n                $pSheet->getCell($newCoordinates)->setXfIndex($cell->getXfIndex());\n\n                // Insert this cell at its new location\n                if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) {\n                    // Formula should be adjusted\n                    $pSheet->getCell($newCoordinates)\n                           ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle()));\n                } else {\n                    // Formula should not be adjusted\n                    $pSheet->getCell($newCoordinates)->setValue($cell->getValue());\n                }\n\n                // Clear the original cell\n                $pSheet->getCellCacheController()->deleteCacheData($cellID);\n            } else {\n                /*    We don't need to update styles for rows/columns before our insertion position,\n                        but we do still need to adjust any formulae    in those cells                    */\n                if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) {\n                    // Formula should be adjusted\n                    $cell->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle()));\n                }\n\n            }\n        }\n\n        // Duplicate styles for the newly inserted cells\n        $highestColumn    = $pSheet->getHighestColumn();\n        $highestRow    = $pSheet->getHighestRow();\n\n        if ($pNumCols > 0 && $beforeColumnIndex - 2 > 0) {\n            for ($i = $beforeRow; $i <= $highestRow - 1; ++$i) {\n                // Style\n                $coordinate = PHPExcel_Cell::stringFromColumnIndex($beforeColumnIndex - 2) . $i;\n                if ($pSheet->cellExists($coordinate)) {\n                    $xfIndex = $pSheet->getCell($coordinate)->getXfIndex();\n                    $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ?\n                        $pSheet->getConditionalStyles($coordinate) : false;\n                    for ($j = $beforeColumnIndex - 1; $j <= $beforeColumnIndex - 2 + $pNumCols; ++$j) {\n                        $pSheet->getCellByColumnAndRow($j, $i)->setXfIndex($xfIndex);\n                        if ($conditionalStyles) {\n                            $cloned = array();\n                            foreach ($conditionalStyles as $conditionalStyle) {\n                                $cloned[] = clone $conditionalStyle;\n                            }\n                            $pSheet->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($j) . $i, $cloned);\n                        }\n                    }\n                }\n\n            }\n        }\n\n        if ($pNumRows > 0 && $beforeRow - 1 > 0) {\n            for ($i = $beforeColumnIndex - 1; $i <= PHPExcel_Cell::columnIndexFromString($highestColumn) - 1; ++$i) {\n                // Style\n                $coordinate = PHPExcel_Cell::stringFromColumnIndex($i) . ($beforeRow - 1);\n                if ($pSheet->cellExists($coordinate)) {\n                    $xfIndex = $pSheet->getCell($coordinate)->getXfIndex();\n                    $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ?\n                        $pSheet->getConditionalStyles($coordinate) : false;\n                    for ($j = $beforeRow; $j <= $beforeRow - 1 + $pNumRows; ++$j) {\n                        $pSheet->getCell(PHPExcel_Cell::stringFromColumnIndex($i) . $j)->setXfIndex($xfIndex);\n                        if ($conditionalStyles) {\n                            $cloned = array();\n                            foreach ($conditionalStyles as $conditionalStyle) {\n                                $cloned[] = clone $conditionalStyle;\n                            }\n                            $pSheet->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($i) . $j, $cloned);\n                        }\n                    }\n                }\n            }\n        }\n\n        // Update worksheet: column dimensions\n        $this->adjustColumnDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        // Update worksheet: row dimensions\n        $this->adjustRowDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        //    Update worksheet: page breaks\n        $this->adjustPageBreaks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        //    Update worksheet: comments\n        $this->adjustComments($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        // Update worksheet: hyperlinks\n        $this->adjustHyperlinks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        // Update worksheet: data validations\n        $this->adjustDataValidations($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        // Update worksheet: merge cells\n        $this->adjustMergeCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        // Update worksheet: protected cells\n        $this->adjustProtectedCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows);\n\n        // Update worksheet: autofilter\n        $autoFilter = $pSheet->getAutoFilter();\n        $autoFilterRange = $autoFilter->getRange();\n        if (!empty($autoFilterRange)) {\n            if ($pNumCols != 0) {\n                $autoFilterColumns = array_keys($autoFilter->getColumns());\n                if (count($autoFilterColumns) > 0) {\n                    sscanf($pBefore, '%[A-Z]%d', $column, $row);\n                    $columnIndex = PHPExcel_Cell::columnIndexFromString($column);\n                    list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($autoFilterRange);\n                    if ($columnIndex <= $rangeEnd[0]) {\n                        if ($pNumCols < 0) {\n                            //    If we're actually deleting any columns that fall within the autofilter range,\n                            //        then we delete any rules for those columns\n                            $deleteColumn = $columnIndex + $pNumCols - 1;\n                            $deleteCount = abs($pNumCols);\n                            for ($i = 1; $i <= $deleteCount; ++$i) {\n                                if (in_array(PHPExcel_Cell::stringFromColumnIndex($deleteColumn), $autoFilterColumns)) {\n                                    $autoFilter->clearColumn(PHPExcel_Cell::stringFromColumnIndex($deleteColumn));\n                                }\n                                ++$deleteColumn;\n                            }\n                        }\n                        $startCol = ($columnIndex > $rangeStart[0]) ? $columnIndex : $rangeStart[0];\n\n                        //    Shuffle columns in autofilter range\n                        if ($pNumCols > 0) {\n                            //    For insert, we shuffle from end to beginning to avoid overwriting\n                            $startColID = PHPExcel_Cell::stringFromColumnIndex($startCol-1);\n                            $toColID = PHPExcel_Cell::stringFromColumnIndex($startCol+$pNumCols-1);\n                            $endColID = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]);\n\n                            $startColRef = $startCol;\n                            $endColRef = $rangeEnd[0];\n                            $toColRef = $rangeEnd[0]+$pNumCols;\n\n                            do {\n                                $autoFilter->shiftColumn(PHPExcel_Cell::stringFromColumnIndex($endColRef-1), PHPExcel_Cell::stringFromColumnIndex($toColRef-1));\n                                --$endColRef;\n                                --$toColRef;\n                            } while ($startColRef <= $endColRef);\n                        } else {\n                            //    For delete, we shuffle from beginning to end to avoid overwriting\n                            $startColID = PHPExcel_Cell::stringFromColumnIndex($startCol-1);\n                            $toColID = PHPExcel_Cell::stringFromColumnIndex($startCol+$pNumCols-1);\n                            $endColID = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]);\n                            do {\n                                $autoFilter->shiftColumn($startColID, $toColID);\n                                ++$startColID;\n                                ++$toColID;\n                            } while ($startColID != $endColID);\n                        }\n                    }\n                }\n            }\n            $pSheet->setAutoFilter($this->updateCellReference($autoFilterRange, $pBefore, $pNumCols, $pNumRows));\n        }\n\n        // Update worksheet: freeze pane\n        if ($pSheet->getFreezePane() != '') {\n            $pSheet->freezePane($this->updateCellReference($pSheet->getFreezePane(), $pBefore, $pNumCols, $pNumRows));\n        }\n\n        // Page setup\n        if ($pSheet->getPageSetup()->isPrintAreaSet()) {\n            $pSheet->getPageSetup()->setPrintArea($this->updateCellReference($pSheet->getPageSetup()->getPrintArea(), $pBefore, $pNumCols, $pNumRows));\n        }\n\n        // Update worksheet: drawings\n        $aDrawings = $pSheet->getDrawingCollection();\n        foreach ($aDrawings as $objDrawing) {\n            $newReference = $this->updateCellReference($objDrawing->getCoordinates(), $pBefore, $pNumCols, $pNumRows);\n            if ($objDrawing->getCoordinates() != $newReference) {\n                $objDrawing->setCoordinates($newReference);\n            }\n        }\n\n        // Update workbook: named ranges\n        if (count($pSheet->getParent()->getNamedRanges()) > 0) {\n            foreach ($pSheet->getParent()->getNamedRanges() as $namedRange) {\n                if ($namedRange->getWorksheet()->getHashCode() == $pSheet->getHashCode()) {\n                    $namedRange->setRange($this->updateCellReference($namedRange->getRange(), $pBefore, $pNumCols, $pNumRows));\n                }\n            }\n        }\n\n        // Garbage collect\n        $pSheet->garbageCollect();\n    }\n\n    /**\n     * Update references within formulas\n     *\n     * @param    string    $pFormula    Formula to update\n     * @param    int        $pBefore    Insert before this one\n     * @param    int        $pNumCols    Number of columns to insert\n     * @param    int        $pNumRows    Number of rows to insert\n     * @param   string  $sheetName  Worksheet name/title\n     * @return    string    Updated formula\n     * @throws    PHPExcel_Exception\n     */\n    public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '')\n    {\n        //    Update cell references in the formula\n        $formulaBlocks = explode('\"', $pFormula);\n        $i = false;\n        foreach ($formulaBlocks as &$formulaBlock) {\n            //    Ignore blocks that were enclosed in quotes (alternating entries in the $formulaBlocks array after the explode)\n            if ($i = !$i) {\n                $adjustCount = 0;\n                $newCellTokens = $cellTokens = array();\n                //    Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5)\n                $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_ROWRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);\n                if ($matchCount > 0) {\n                    foreach ($matches as $match) {\n                        $fromString = ($match[2] > '') ? $match[2].'!' : '';\n                        $fromString .= $match[3].':'.$match[4];\n                        $modified3 = substr($this->updateCellReference('$A'.$match[3], $pBefore, $pNumCols, $pNumRows), 2);\n                        $modified4 = substr($this->updateCellReference('$A'.$match[4], $pBefore, $pNumCols, $pNumRows), 2);\n\n                        if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) {\n                            if (($match[2] == '') || (trim($match[2], \"'\") == $sheetName)) {\n                                $toString = ($match[2] > '') ? $match[2].'!' : '';\n                                $toString .= $modified3.':'.$modified4;\n                                //    Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more\n                                $column = 100000;\n                                $row = 10000000 + trim($match[3], '$');\n                                $cellIndex = $column.$row;\n\n                                $newCellTokens[$cellIndex] = preg_quote($toString);\n                                $cellTokens[$cellIndex] = '/(?<!\\d\\$\\!)'.preg_quote($fromString).'(?!\\d)/i';\n                                ++$adjustCount;\n                            }\n                        }\n                    }\n                }\n                //    Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E)\n                $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_COLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);\n                if ($matchCount > 0) {\n                    foreach ($matches as $match) {\n                        $fromString = ($match[2] > '') ? $match[2].'!' : '';\n                        $fromString .= $match[3].':'.$match[4];\n                        $modified3 = substr($this->updateCellReference($match[3].'$1', $pBefore, $pNumCols, $pNumRows), 0, -2);\n                        $modified4 = substr($this->updateCellReference($match[4].'$1', $pBefore, $pNumCols, $pNumRows), 0, -2);\n\n                        if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) {\n                            if (($match[2] == '') || (trim($match[2], \"'\") == $sheetName)) {\n                                $toString = ($match[2] > '') ? $match[2].'!' : '';\n                                $toString .= $modified3.':'.$modified4;\n                                //    Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more\n                                $column = PHPExcel_Cell::columnIndexFromString(trim($match[3], '$')) + 100000;\n                                $row = 10000000;\n                                $cellIndex = $column.$row;\n\n                                $newCellTokens[$cellIndex] = preg_quote($toString);\n                                $cellTokens[$cellIndex] = '/(?<![A-Z\\$\\!])'.preg_quote($fromString).'(?![A-Z])/i';\n                                ++$adjustCount;\n                            }\n                        }\n                    }\n                }\n                //    Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5)\n                $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);\n                if ($matchCount > 0) {\n                    foreach ($matches as $match) {\n                        $fromString = ($match[2] > '') ? $match[2].'!' : '';\n                        $fromString .= $match[3].':'.$match[4];\n                        $modified3 = $this->updateCellReference($match[3], $pBefore, $pNumCols, $pNumRows);\n                        $modified4 = $this->updateCellReference($match[4], $pBefore, $pNumCols, $pNumRows);\n\n                        if ($match[3].$match[4] !== $modified3.$modified4) {\n                            if (($match[2] == '') || (trim($match[2], \"'\") == $sheetName)) {\n                                $toString = ($match[2] > '') ? $match[2].'!' : '';\n                                $toString .= $modified3.':'.$modified4;\n                                list($column, $row) = PHPExcel_Cell::coordinateFromString($match[3]);\n                                //    Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more\n                                $column = PHPExcel_Cell::columnIndexFromString(trim($column, '$')) + 100000;\n                                $row = trim($row, '$') + 10000000;\n                                $cellIndex = $column.$row;\n\n                                $newCellTokens[$cellIndex] = preg_quote($toString);\n                                $cellTokens[$cellIndex] = '/(?<![A-Z]\\$\\!)'.preg_quote($fromString).'(?!\\d)/i';\n                                ++$adjustCount;\n                            }\n                        }\n                    }\n                }\n                //    Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5)\n                $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLREF.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);\n\n                if ($matchCount > 0) {\n                    foreach ($matches as $match) {\n                        $fromString = ($match[2] > '') ? $match[2].'!' : '';\n                        $fromString .= $match[3];\n\n                        $modified3 = $this->updateCellReference($match[3], $pBefore, $pNumCols, $pNumRows);\n                        if ($match[3] !== $modified3) {\n                            if (($match[2] == '') || (trim($match[2], \"'\") == $sheetName)) {\n                                $toString = ($match[2] > '') ? $match[2].'!' : '';\n                                $toString .= $modified3;\n                                list($column, $row) = PHPExcel_Cell::coordinateFromString($match[3]);\n                                //    Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more\n                                $column = PHPExcel_Cell::columnIndexFromString(trim($column, '$')) + 100000;\n                                $row = trim($row, '$') + 10000000;\n                                $cellIndex = $row . $column;\n\n                                $newCellTokens[$cellIndex] = preg_quote($toString);\n                                $cellTokens[$cellIndex] = '/(?<![A-Z\\$\\!])'.preg_quote($fromString).'(?!\\d)/i';\n                                ++$adjustCount;\n                            }\n                        }\n                    }\n                }\n                if ($adjustCount > 0) {\n                    if ($pNumCols > 0 || $pNumRows > 0) {\n                        krsort($cellTokens);\n                        krsort($newCellTokens);\n                    } else {\n                        ksort($cellTokens);\n                        ksort($newCellTokens);\n                    }   //  Update cell references in the formula\n                    $formulaBlock = str_replace('\\\\', '', preg_replace($cellTokens, $newCellTokens, $formulaBlock));\n                }\n            }\n        }\n        unset($formulaBlock);\n\n        //    Then rebuild the formula string\n        return implode('\"', $formulaBlocks);\n    }\n\n    /**\n     * Update cell reference\n     *\n     * @param    string    $pCellRange            Cell range\n     * @param    int        $pBefore            Insert before this one\n     * @param    int        $pNumCols            Number of columns to increment\n     * @param    int        $pNumRows            Number of rows to increment\n     * @return    string    Updated cell range\n     * @throws    PHPExcel_Exception\n     */\n    public function updateCellReference($pCellRange = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0)\n    {\n        // Is it in another worksheet? Will not have to update anything.\n        if (strpos($pCellRange, \"!\") !== false) {\n            return $pCellRange;\n        // Is it a range or a single cell?\n        } elseif (strpos($pCellRange, ':') === false && strpos($pCellRange, ',') === false) {\n            // Single cell\n            return $this->updateSingleCellReference($pCellRange, $pBefore, $pNumCols, $pNumRows);\n        } elseif (strpos($pCellRange, ':') !== false || strpos($pCellRange, ',') !== false) {\n            // Range\n            return $this->updateCellRange($pCellRange, $pBefore, $pNumCols, $pNumRows);\n        } else {\n            // Return original\n            return $pCellRange;\n        }\n    }\n\n    /**\n     * Update named formulas (i.e. containing worksheet references / named ranges)\n     *\n     * @param PHPExcel $pPhpExcel    Object to update\n     * @param string $oldName        Old name (name to replace)\n     * @param string $newName        New name\n     */\n    public function updateNamedFormulas(PHPExcel $pPhpExcel, $oldName = '', $newName = '')\n    {\n        if ($oldName == '') {\n            return;\n        }\n\n        foreach ($pPhpExcel->getWorksheetIterator() as $sheet) {\n            foreach ($sheet->getCellCollection(false) as $cellID) {\n                $cell = $sheet->getCell($cellID);\n                if (($cell !== null) && ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA)) {\n                    $formula = $cell->getValue();\n                    if (strpos($formula, $oldName) !== false) {\n                        $formula = str_replace(\"'\" . $oldName . \"'!\", \"'\" . $newName . \"'!\", $formula);\n                        $formula = str_replace($oldName . \"!\", $newName . \"!\", $formula);\n                        $cell->setValueExplicit($formula, PHPExcel_Cell_DataType::TYPE_FORMULA);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Update cell range\n     *\n     * @param    string    $pCellRange            Cell range    (e.g. 'B2:D4', 'B:C' or '2:3')\n     * @param    int        $pBefore            Insert before this one\n     * @param    int        $pNumCols            Number of columns to increment\n     * @param    int        $pNumRows            Number of rows to increment\n     * @return    string    Updated cell range\n     * @throws    PHPExcel_Exception\n     */\n    private function updateCellRange($pCellRange = 'A1:A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0)\n    {\n        if (strpos($pCellRange, ':') !== false || strpos($pCellRange, ',') !== false) {\n            // Update range\n            $range = PHPExcel_Cell::splitRange($pCellRange);\n            $ic = count($range);\n            for ($i = 0; $i < $ic; ++$i) {\n                $jc = count($range[$i]);\n                for ($j = 0; $j < $jc; ++$j) {\n                    if (ctype_alpha($range[$i][$j])) {\n                        $r = PHPExcel_Cell::coordinateFromString($this->updateSingleCellReference($range[$i][$j].'1', $pBefore, $pNumCols, $pNumRows));\n                        $range[$i][$j] = $r[0];\n                    } elseif (ctype_digit($range[$i][$j])) {\n                        $r = PHPExcel_Cell::coordinateFromString($this->updateSingleCellReference('A'.$range[$i][$j], $pBefore, $pNumCols, $pNumRows));\n                        $range[$i][$j] = $r[1];\n                    } else {\n                        $range[$i][$j] = $this->updateSingleCellReference($range[$i][$j], $pBefore, $pNumCols, $pNumRows);\n                    }\n                }\n            }\n\n            // Recreate range string\n            return PHPExcel_Cell::buildRange($range);\n        } else {\n            throw new PHPExcel_Exception(\"Only cell ranges may be passed to this method.\");\n        }\n    }\n\n    /**\n     * Update single cell reference\n     *\n     * @param    string    $pCellReference        Single cell reference\n     * @param    int        $pBefore            Insert before this one\n     * @param    int        $pNumCols            Number of columns to increment\n     * @param    int        $pNumRows            Number of rows to increment\n     * @return    string    Updated cell reference\n     * @throws    PHPExcel_Exception\n     */\n    private function updateSingleCellReference($pCellReference = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0)\n    {\n        if (strpos($pCellReference, ':') === false && strpos($pCellReference, ',') === false) {\n            // Get coordinates of $pBefore\n            list($beforeColumn, $beforeRow) = PHPExcel_Cell::coordinateFromString($pBefore);\n\n            // Get coordinates of $pCellReference\n            list($newColumn, $newRow) = PHPExcel_Cell::coordinateFromString($pCellReference);\n\n            // Verify which parts should be updated\n            $updateColumn = (($newColumn{0} != '$') && ($beforeColumn{0} != '$') && (PHPExcel_Cell::columnIndexFromString($newColumn) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)));\n            $updateRow = (($newRow{0} != '$') && ($beforeRow{0} != '$') && $newRow >= $beforeRow);\n\n            // Create new column reference\n            if ($updateColumn) {\n                $newColumn    = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($newColumn) - 1 + $pNumCols);\n            }\n\n            // Create new row reference\n            if ($updateRow) {\n                $newRow    = $newRow + $pNumRows;\n            }\n\n            // Return new reference\n            return $newColumn . $newRow;\n        } else {\n            throw new PHPExcel_Exception(\"Only single cell references may be passed to this method.\");\n        }\n    }\n\n    /**\n     * __clone implementation. Cloning should not be allowed in a Singleton!\n     *\n     * @throws    PHPExcel_Exception\n     */\n    final public function __clone()\n    {\n        throw new PHPExcel_Exception(\"Cloning a Singleton is not allowed!\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php",
    "content": "<?php\n\n/**\n * PHPExcel_RichText_ITextElement\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_RichText\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\ninterface PHPExcel_RichText_ITextElement\n{\n    /**\n     * Get text\n     *\n     * @return string    Text\n     */\n    public function getText();\n\n    /**\n     * Set text\n     *\n     * @param     $pText string    Text\n     * @return PHPExcel_RichText_ITextElement\n     */\n    public function setText($pText = '');\n\n    /**\n     * Get font\n     *\n     * @return PHPExcel_Style_Font\n     */\n    public function getFont();\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode();\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/RichText/Run.php",
    "content": "<?php\n\n/**\n * PHPExcel_RichText_Run\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_RichText\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_RichText_Run extends PHPExcel_RichText_TextElement implements PHPExcel_RichText_ITextElement\n{\n    /**\n     * Font\n     *\n     * @var PHPExcel_Style_Font\n     */\n    private $font;\n\n    /**\n     * Create a new PHPExcel_RichText_Run instance\n     *\n     * @param     string        $pText        Text\n     */\n    public function __construct($pText = '')\n    {\n        // Initialise variables\n        $this->setText($pText);\n        $this->font = new PHPExcel_Style_Font();\n    }\n\n    /**\n     * Get font\n     *\n     * @return PHPExcel_Style_Font\n     */\n    public function getFont()\n    {\n        return $this->font;\n    }\n\n    /**\n     * Set font\n     *\n     * @param    PHPExcel_Style_Font        $pFont        Font\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_RichText_ITextElement\n     */\n    public function setFont(PHPExcel_Style_Font $pFont = null)\n    {\n        $this->font = $pFont;\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->getText() .\n            $this->font->getHashCode() .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/RichText/TextElement.php",
    "content": "<?php\n\n/**\n * PHPExcel_RichText_TextElement\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_RichText\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_RichText_TextElement implements PHPExcel_RichText_ITextElement\n{\n    /**\n     * Text\n     *\n     * @var string\n     */\n    private $text;\n\n    /**\n     * Create a new PHPExcel_RichText_TextElement instance\n     *\n     * @param     string        $pText        Text\n     */\n    public function __construct($pText = '')\n    {\n        // Initialise variables\n        $this->text = $pText;\n    }\n\n    /**\n     * Get text\n     *\n     * @return string    Text\n     */\n    public function getText()\n    {\n        return $this->text;\n    }\n\n    /**\n     * Set text\n     *\n     * @param     $pText string    Text\n     * @return PHPExcel_RichText_ITextElement\n     */\n    public function setText($pText = '')\n    {\n        $this->text = $pText;\n        return $this;\n    }\n\n    /**\n     * Get font\n     *\n     * @return PHPExcel_Style_Font\n     */\n    public function getFont()\n    {\n        return null;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->text .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/RichText.php",
    "content": "<?php\n\n/**\n * PHPExcel_RichText\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_RichText\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_RichText implements PHPExcel_IComparable\n{\n    /**\n     * Rich text elements\n     *\n     * @var PHPExcel_RichText_ITextElement[]\n     */\n    private $richTextElements;\n\n    /**\n     * Create a new PHPExcel_RichText instance\n     *\n     * @param PHPExcel_Cell $pCell\n     * @throws PHPExcel_Exception\n     */\n    public function __construct(PHPExcel_Cell $pCell = null)\n    {\n        // Initialise variables\n        $this->richTextElements = array();\n\n        // Rich-Text string attached to cell?\n        if ($pCell !== null) {\n            // Add cell text and style\n            if ($pCell->getValue() != \"\") {\n                $objRun = new PHPExcel_RichText_Run($pCell->getValue());\n                $objRun->setFont(clone $pCell->getParent()->getStyle($pCell->getCoordinate())->getFont());\n                $this->addText($objRun);\n            }\n\n            // Set parent value\n            $pCell->setValueExplicit($this, PHPExcel_Cell_DataType::TYPE_STRING);\n        }\n    }\n\n    /**\n     * Add text\n     *\n     * @param PHPExcel_RichText_ITextElement $pText Rich text element\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_RichText\n     */\n    public function addText(PHPExcel_RichText_ITextElement $pText = null)\n    {\n        $this->richTextElements[] = $pText;\n        return $this;\n    }\n\n    /**\n     * Create text\n     *\n     * @param string $pText Text\n     * @return PHPExcel_RichText_TextElement\n     * @throws PHPExcel_Exception\n     */\n    public function createText($pText = '')\n    {\n        $objText = new PHPExcel_RichText_TextElement($pText);\n        $this->addText($objText);\n        return $objText;\n    }\n\n    /**\n     * Create text run\n     *\n     * @param string $pText Text\n     * @return PHPExcel_RichText_Run\n     * @throws PHPExcel_Exception\n     */\n    public function createTextRun($pText = '')\n    {\n        $objText = new PHPExcel_RichText_Run($pText);\n        $this->addText($objText);\n        return $objText;\n    }\n\n    /**\n     * Get plain text\n     *\n     * @return string\n     */\n    public function getPlainText()\n    {\n        // Return value\n        $returnValue = '';\n\n        // Loop through all PHPExcel_RichText_ITextElement\n        foreach ($this->richTextElements as $text) {\n            $returnValue .= $text->getText();\n        }\n\n        // Return\n        return $returnValue;\n    }\n\n    /**\n     * Convert to string\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->getPlainText();\n    }\n\n    /**\n     * Get Rich Text elements\n     *\n     * @return PHPExcel_RichText_ITextElement[]\n     */\n    public function getRichTextElements()\n    {\n        return $this->richTextElements;\n    }\n\n    /**\n     * Set Rich Text elements\n     *\n     * @param PHPExcel_RichText_ITextElement[] $pElements Array of elements\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_RichText\n     */\n    public function setRichTextElements($pElements = null)\n    {\n        if (is_array($pElements)) {\n            $this->richTextElements = $pElements;\n        } else {\n            throw new PHPExcel_Exception(\"Invalid PHPExcel_RichText_ITextElement[] array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        $hashElements = '';\n        foreach ($this->richTextElements as $element) {\n            $hashElements .= $element->getHashCode();\n        }\n\n        return md5(\n            $hashElements .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Settings.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel_Settings\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Settings\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Settings\n{\n    /**    constants */\n    /**    Available Zip library classes */\n    const PCLZIP     = 'PHPExcel_Shared_ZipArchive';\n    const ZIPARCHIVE = 'ZipArchive';\n\n    /**    Optional Chart Rendering libraries */\n    const CHART_RENDERER_JPGRAPH = 'jpgraph';\n\n    /**    Optional PDF Rendering libraries */\n    const PDF_RENDERER_TCPDF  = 'tcPDF';\n    const PDF_RENDERER_DOMPDF = 'DomPDF';\n    const PDF_RENDERER_MPDF   = 'mPDF';\n\n\n    private static $chartRenderers = array(\n        self::CHART_RENDERER_JPGRAPH,\n    );\n\n    private static $pdfRenderers = array(\n        self::PDF_RENDERER_TCPDF,\n        self::PDF_RENDERER_DOMPDF,\n        self::PDF_RENDERER_MPDF,\n    );\n\n\n    /**\n     * Name of the class used for Zip file management\n     *    e.g.\n     *        ZipArchive\n     *\n     * @var string\n     */\n    private static $zipClass = self::ZIPARCHIVE;\n\n\n    /**\n     * Name of the external Library used for rendering charts\n     *    e.g.\n     *        jpgraph\n     *\n     * @var string\n     */\n    private static $chartRendererName;\n\n    /**\n     * Directory Path to the external Library used for rendering charts\n     *\n     * @var string\n     */\n    private static $chartRendererPath;\n\n\n    /**\n     * Name of the external Library used for rendering PDF files\n     *    e.g.\n     *         mPDF\n     *\n     * @var string\n     */\n    private static $pdfRendererName;\n\n    /**\n     * Directory Path to the external Library used for rendering PDF files\n     *\n     * @var string\n     */\n    private static $pdfRendererPath;\n\n    /**\n     * Default options for libxml loader\n     *\n     * @var int\n     */\n    private static $libXmlLoaderOptions = null;\n\n    /**\n     * Set the Zip handler Class that PHPExcel should use for Zip file management (PCLZip or ZipArchive)\n     *\n     * @param string $zipClass    The Zip handler class that PHPExcel should use for Zip file management\n     *      e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive\n     * @return    boolean    Success or failure\n     */\n    public static function setZipClass($zipClass)\n    {\n        if (($zipClass === self::PCLZIP) ||\n            ($zipClass === self::ZIPARCHIVE)) {\n            self::$zipClass = $zipClass;\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Return the name of the Zip handler Class that PHPExcel is configured to use (PCLZip or ZipArchive)\n     *    or Zip file management\n     *\n     * @return string Name of the Zip handler Class that PHPExcel is configured to use\n     *    for Zip file management\n     *    e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive\n     */\n    public static function getZipClass()\n    {\n        return self::$zipClass;\n    }\n\n\n    /**\n     * Return the name of the method that is currently configured for cell cacheing\n     *\n     * @return string Name of the cacheing method\n     */\n    public static function getCacheStorageMethod()\n    {\n        return PHPExcel_CachedObjectStorageFactory::getCacheStorageMethod();\n    }\n\n\n    /**\n     * Return the name of the class that is currently being used for cell cacheing\n     *\n     * @return string Name of the class currently being used for cacheing\n     */\n    public static function getCacheStorageClass()\n    {\n        return PHPExcel_CachedObjectStorageFactory::getCacheStorageClass();\n    }\n\n\n    /**\n     * Set the method that should be used for cell cacheing\n     *\n     * @param string $method Name of the cacheing method\n     * @param array $arguments Optional configuration arguments for the cacheing method\n     * @return boolean Success or failure\n     */\n    public static function setCacheStorageMethod($method = PHPExcel_CachedObjectStorageFactory::cache_in_memory, $arguments = array())\n    {\n        return PHPExcel_CachedObjectStorageFactory::initialize($method, $arguments);\n    }\n\n\n    /**\n     * Set the locale code to use for formula translations and any special formatting\n     *\n     * @param string $locale The locale code to use (e.g. \"fr\" or \"pt_br\" or \"en_uk\")\n     * @return boolean Success or failure\n     */\n    public static function setLocale($locale = 'en_us')\n    {\n        return PHPExcel_Calculation::getInstance()->setLocale($locale);\n    }\n\n\n    /**\n     * Set details of the external library that PHPExcel should use for rendering charts\n     *\n     * @param string $libraryName    Internal reference name of the library\n     *    e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH\n     * @param string $libraryBaseDir Directory path to the library's base folder\n     *\n     * @return    boolean    Success or failure\n     */\n    public static function setChartRenderer($libraryName, $libraryBaseDir)\n    {\n        if (!self::setChartRendererName($libraryName)) {\n            return false;\n        }\n        return self::setChartRendererPath($libraryBaseDir);\n    }\n\n\n    /**\n     * Identify to PHPExcel the external library to use for rendering charts\n     *\n     * @param string $libraryName    Internal reference name of the library\n     *    e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH\n     *\n     * @return    boolean    Success or failure\n     */\n    public static function setChartRendererName($libraryName)\n    {\n        if (!in_array($libraryName, self::$chartRenderers)) {\n            return false;\n        }\n        self::$chartRendererName = $libraryName;\n\n        return true;\n    }\n\n\n    /**\n     * Tell PHPExcel where to find the external library to use for rendering charts\n     *\n     * @param string $libraryBaseDir    Directory path to the library's base folder\n     * @return    boolean    Success or failure\n     */\n    public static function setChartRendererPath($libraryBaseDir)\n    {\n        if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) {\n            return false;\n        }\n        self::$chartRendererPath = $libraryBaseDir;\n\n        return true;\n    }\n\n\n    /**\n     * Return the Chart Rendering Library that PHPExcel is currently configured to use (e.g. jpgraph)\n     *\n     * @return string|NULL Internal reference name of the Chart Rendering Library that PHPExcel is\n     *    currently configured to use\n     *    e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH\n     */\n    public static function getChartRendererName()\n    {\n        return self::$chartRendererName;\n    }\n\n\n    /**\n     * Return the directory path to the Chart Rendering Library that PHPExcel is currently configured to use\n     *\n     * @return string|NULL Directory Path to the Chart Rendering Library that PHPExcel is\n     *     currently configured to use\n     */\n    public static function getChartRendererPath()\n    {\n        return self::$chartRendererPath;\n    }\n\n\n    /**\n     * Set details of the external library that PHPExcel should use for rendering PDF files\n     *\n     * @param string $libraryName Internal reference name of the library\n     *     e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,\n     *     PHPExcel_Settings::PDF_RENDERER_DOMPDF\n     *  or PHPExcel_Settings::PDF_RENDERER_MPDF\n     * @param string $libraryBaseDir Directory path to the library's base folder\n     *\n     * @return boolean Success or failure\n     */\n    public static function setPdfRenderer($libraryName, $libraryBaseDir)\n    {\n        if (!self::setPdfRendererName($libraryName)) {\n            return false;\n        }\n        return self::setPdfRendererPath($libraryBaseDir);\n    }\n\n\n    /**\n     * Identify to PHPExcel the external library to use for rendering PDF files\n     *\n     * @param string $libraryName Internal reference name of the library\n     *     e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,\n     *    PHPExcel_Settings::PDF_RENDERER_DOMPDF\n     *     or PHPExcel_Settings::PDF_RENDERER_MPDF\n     *\n     * @return boolean Success or failure\n     */\n    public static function setPdfRendererName($libraryName)\n    {\n        if (!in_array($libraryName, self::$pdfRenderers)) {\n            return false;\n        }\n        self::$pdfRendererName = $libraryName;\n\n        return true;\n    }\n\n\n    /**\n     * Tell PHPExcel where to find the external library to use for rendering PDF files\n     *\n     * @param string $libraryBaseDir Directory path to the library's base folder\n     * @return boolean Success or failure\n     */\n    public static function setPdfRendererPath($libraryBaseDir)\n    {\n        if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) {\n            return false;\n        }\n        self::$pdfRendererPath = $libraryBaseDir;\n\n        return true;\n    }\n\n\n    /**\n     * Return the PDF Rendering Library that PHPExcel is currently configured to use (e.g. dompdf)\n     *\n     * @return string|NULL Internal reference name of the PDF Rendering Library that PHPExcel is\n     *     currently configured to use\n     *  e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,\n     *  PHPExcel_Settings::PDF_RENDERER_DOMPDF\n     *  or PHPExcel_Settings::PDF_RENDERER_MPDF\n     */\n    public static function getPdfRendererName()\n    {\n        return self::$pdfRendererName;\n    }\n\n    /**\n     * Return the directory path to the PDF Rendering Library that PHPExcel is currently configured to use\n     *\n     * @return string|NULL Directory Path to the PDF Rendering Library that PHPExcel is\n     *        currently configured to use\n     */\n    public static function getPdfRendererPath()\n    {\n        return self::$pdfRendererPath;\n    }\n\n    /**\n     * Set options for libxml loader\n     *\n     * @param   int   $options   Options for libxml loader\n     */\n    public static function setLibXmlLoaderOptions($options = null)\n    {\n        if (is_null($options) && defined('LIBXML_DTDLOAD')) {\n            $options = LIBXML_DTDLOAD | LIBXML_DTDATTR;\n        }\n        if (version_compare(PHP_VERSION, '5.2.11') >= 0) {\n            @libxml_disable_entity_loader((bool) $options);\n        }\n        self::$libXmlLoaderOptions = $options;\n    }\n\n    /**\n     * Get defined options for libxml loader.\n     * Defaults to LIBXML_DTDLOAD | LIBXML_DTDATTR when not set explicitly.\n     *\n     * @return int Default options for libxml loader\n     */\n    public static function getLibXmlLoaderOptions()\n    {\n        if (is_null(self::$libXmlLoaderOptions) && defined('LIBXML_DTDLOAD')) {\n            self::setLibXmlLoaderOptions(LIBXML_DTDLOAD | LIBXML_DTDATTR);\n        } elseif (is_null(self::$libXmlLoaderOptions)) {\n            self::$libXmlLoaderOptions = true;\n        }\n        if (version_compare(PHP_VERSION, '5.2.11') >= 0) {\n            @libxml_disable_entity_loader((bool) self::$libXmlLoaderOptions);\n        }\n        return self::$libXmlLoaderOptions;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/CodePage.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_CodePage\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_CodePage\n{\n    /**\n     * Convert Microsoft Code Page Identifier to Code Page Name which iconv\n     * and mbstring understands\n     *\n     * @param integer $codePage Microsoft Code Page Indentifier\n     * @return string Code Page Name\n     * @throws PHPExcel_Exception\n     */\n    public static function NumberToName($codePage = 1252)\n    {\n        switch ($codePage) {\n            case 367:\n                return 'ASCII';    //    ASCII\n            case 437:\n                return 'CP437';    //    OEM US\n            case 720:\n                throw new PHPExcel_Exception('Code page 720 not supported.');    //    OEM Arabic\n            case 737:\n                return 'CP737';    //    OEM Greek\n            case 775:\n                return 'CP775';    //    OEM Baltic\n            case 850:\n                return 'CP850';    //    OEM Latin I\n            case 852:\n                return 'CP852';    //    OEM Latin II (Central European)\n            case 855:\n                return 'CP855';    //    OEM Cyrillic\n            case 857:\n                return 'CP857';    //    OEM Turkish\n            case 858:\n                return 'CP858';    //    OEM Multilingual Latin I with Euro\n            case 860:\n                return 'CP860';    //    OEM Portugese\n            case 861:\n                return 'CP861';    //    OEM Icelandic\n            case 862:\n                return 'CP862';    //    OEM Hebrew\n            case 863:\n                return 'CP863';    //    OEM Canadian (French)\n            case 864:\n                return 'CP864';    //    OEM Arabic\n            case 865:\n                return 'CP865';    //    OEM Nordic\n            case 866:\n                return 'CP866';    //    OEM Cyrillic (Russian)\n            case 869:\n                return 'CP869';    //    OEM Greek (Modern)\n            case 874:\n                return 'CP874';    //    ANSI Thai\n            case 932:\n                return 'CP932';    //    ANSI Japanese Shift-JIS\n            case 936:\n                return 'CP936';    //    ANSI Chinese Simplified GBK\n            case 949:\n                return 'CP949';    //    ANSI Korean (Wansung)\n            case 950:\n                return 'CP950';    //    ANSI Chinese Traditional BIG5\n            case 1200:\n                return 'UTF-16LE'; //    UTF-16 (BIFF8)\n            case 1250:\n                return 'CP1250';   //    ANSI Latin II (Central European)\n            case 1251:\n                return 'CP1251';   //    ANSI Cyrillic\n            case 0:\n                //    CodePage is not always correctly set when the xls file was saved by Apple's Numbers program\n            case 1252:\n                return 'CP1252';   //    ANSI Latin I (BIFF4-BIFF7)\n            case 1253:\n                return 'CP1253';   //    ANSI Greek\n            case 1254:\n                return 'CP1254';   //    ANSI Turkish\n            case 1255:\n                return 'CP1255';   //    ANSI Hebrew\n            case 1256:\n                return 'CP1256';   //    ANSI Arabic\n            case 1257:\n                return 'CP1257';   //    ANSI Baltic\n            case 1258:\n                return 'CP1258';   //    ANSI Vietnamese\n            case 1361:\n                return 'CP1361';   //    ANSI Korean (Johab)\n            case 10000:\n                return 'MAC';      //    Apple Roman\n            case 10001:\n                return 'CP932';    //    Macintosh Japanese\n            case 10002:\n                return 'CP950';    //    Macintosh Chinese Traditional\n            case 10003:\n                return 'CP1361';   //    Macintosh Korean\n            case 10004:\t\n                return 'MACARABIC';  //\tApple Arabic\n            case 10005:\n                return 'MACHEBREW';\t\t//\tApple Hebrew\n            case 10006:\n                return 'MACGREEK';  //    Macintosh Greek\n            case 10007:\n                return 'MACCYRILLIC';  //    Macintosh Cyrillic\n            case 10008:\n                return 'CP936';  //    Macintosh - Simplified Chinese (GB 2312)\n            case 10010:\n                return 'MACROMANIA';\t//\tMacintosh Romania\n            case 10017:\n                return 'MACUKRAINE';\t//\tMacintosh Ukraine\n            case 10021:\n                return 'MACTHAI';\t//\tMacintosh Thai\n            case 10029:\n                return 'MACCENTRALEUROPE';  //    Macintosh Central Europe\n            case 10079:\n                return 'MACICELAND';  //    Macintosh Icelandic\n            case 10081:\n                return 'MACTURKISH';  //    Macintosh Turkish\n            case 10082:\n                return 'MACCROATIAN';\t//\tMacintosh Croatian\n            case 21010:\n                return 'UTF-16LE';  //    UTF-16 (BIFF8) This isn't correct, but some Excel writer libraries erroneously use Codepage 21010 for UTF-16LE\n            case 32768:\n                return 'MAC';      //    Apple Roman\n            case 32769:\n                throw new PHPExcel_Exception('Code page 32769 not supported.');  //    ANSI Latin I (BIFF2-BIFF3)\n            case 65000:\n                return 'UTF-7';    //    Unicode (UTF-7)\n            case 65001:\n                return 'UTF-8';    //    Unicode (UTF-8)\n        }\n        throw new PHPExcel_Exception('Unknown codepage: ' . $codePage);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Date.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Date\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Date\n{\n    /** constants */\n    const CALENDAR_WINDOWS_1900 = 1900;        //    Base date of 1st Jan 1900 = 1.0\n    const CALENDAR_MAC_1904 = 1904;            //    Base date of 2nd Jan 1904 = 1.0\n\n    /*\n     * Names of the months of the year, indexed by shortname\n     * Planned usage for locale settings\n     *\n     * @public\n     * @var    string[]\n     */\n    public static $monthNames = array(\n        'Jan' => 'January',\n        'Feb' => 'February',\n        'Mar' => 'March',\n        'Apr' => 'April',\n        'May' => 'May',\n        'Jun' => 'June',\n        'Jul' => 'July',\n        'Aug' => 'August',\n        'Sep' => 'September',\n        'Oct' => 'October',\n        'Nov' => 'November',\n        'Dec' => 'December',\n    );\n\n    /*\n     * Names of the months of the year, indexed by shortname\n     * Planned usage for locale settings\n     *\n     * @public\n     * @var    string[]\n     */\n    public static $numberSuffixes = array(\n        'st',\n        'nd',\n        'rd',\n        'th',\n    );\n\n    /*\n     * Base calendar year to use for calculations\n     *\n     * @private\n     * @var    int\n     */\n    protected static $excelBaseDate = self::CALENDAR_WINDOWS_1900;\n\n    /**\n     * Set the Excel calendar (Windows 1900 or Mac 1904)\n     *\n     * @param     integer    $baseDate           Excel base date (1900 or 1904)\n     * @return    boolean                        Success or failure\n     */\n    public static function setExcelCalendar($baseDate)\n    {\n        if (($baseDate == self::CALENDAR_WINDOWS_1900) ||\n            ($baseDate == self::CALENDAR_MAC_1904)) {\n            self::$excelBaseDate = $baseDate;\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Return the Excel calendar (Windows 1900 or Mac 1904)\n     *\n     * @return     integer    Excel base date (1900 or 1904)\n     */\n    public static function getExcelCalendar()\n    {\n        return self::$excelBaseDate;\n    }\n\n\n    /**\n     *    Convert a date from Excel to PHP\n     *\n     *    @param        integer        $dateValue            Excel date/time value\n     *    @param        boolean        $adjustToTimezone    Flag indicating whether $dateValue should be treated as\n     *                                                    a UST timestamp, or adjusted to UST\n     *    @param        string         $timezone            The timezone for finding the adjustment from UST\n     *    @return       integer        PHP serialized date/time\n     */\n    public static function ExcelToPHP($dateValue = 0, $adjustToTimezone = false, $timezone = null)\n    {\n        if (self::$excelBaseDate == self::CALENDAR_WINDOWS_1900) {\n            $myexcelBaseDate = 25569;\n            //    Adjust for the spurious 29-Feb-1900 (Day 60)\n            if ($dateValue < 60) {\n                --$myexcelBaseDate;\n            }\n        } else {\n            $myexcelBaseDate = 24107;\n        }\n\n        // Perform conversion\n        if ($dateValue >= 1) {\n            $utcDays = $dateValue - $myexcelBaseDate;\n            $returnValue = round($utcDays * 86400);\n            if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) {\n                $returnValue = (integer) $returnValue;\n            }\n        } else {\n            $hours = round($dateValue * 24);\n            $mins = round($dateValue * 1440) - round($hours * 60);\n            $secs = round($dateValue * 86400) - round($hours * 3600) - round($mins * 60);\n            $returnValue = (integer) gmmktime($hours, $mins, $secs);\n        }\n\n        $timezoneAdjustment = ($adjustToTimezone) ?\n            PHPExcel_Shared_TimeZone::getTimezoneAdjustment($timezone, $returnValue) :\n            0;\n\n        return $returnValue + $timezoneAdjustment;\n    }\n\n\n    /**\n     * Convert a date from Excel to a PHP Date/Time object\n     *\n     * @param    integer        $dateValue        Excel date/time value\n     * @return    DateTime                    PHP date/time object\n     */\n    public static function ExcelToPHPObject($dateValue = 0)\n    {\n        $dateTime = self::ExcelToPHP($dateValue);\n        $days = floor($dateTime / 86400);\n        $time = round((($dateTime / 86400) - $days) * 86400);\n        $hours = round($time / 3600);\n        $minutes = round($time / 60) - ($hours * 60);\n        $seconds = round($time) - ($hours * 3600) - ($minutes * 60);\n\n        $dateObj = date_create('1-Jan-1970+'.$days.' days');\n        $dateObj->setTime($hours, $minutes, $seconds);\n\n        return $dateObj;\n    }\n\n\n    /**\n     *    Convert a date from PHP to Excel\n     *\n     *    @param    mixed        $dateValue            PHP serialized date/time or date object\n     *    @param    boolean        $adjustToTimezone    Flag indicating whether $dateValue should be treated as\n     *                                                    a UST timestamp, or adjusted to UST\n     *    @param    string         $timezone            The timezone for finding the adjustment from UST\n     *    @return    mixed        Excel date/time value\n     *                            or boolean FALSE on failure\n     */\n    public static function PHPToExcel($dateValue = 0, $adjustToTimezone = false, $timezone = null)\n    {\n        $saveTimeZone = date_default_timezone_get();\n        date_default_timezone_set('UTC');\n\n        $timezoneAdjustment = ($adjustToTimezone) ?\n            PHPExcel_Shared_TimeZone::getTimezoneAdjustment($timezone ? $timezone : $saveTimeZone, $dateValue) :\n            0;\n\n        $retValue = false;\n        if ((is_object($dateValue)) && ($dateValue instanceof DateTime)) {\n            $dateValue->add(new DateInterval('PT' . $timezoneAdjustment . 'S'));\n            $retValue = self::FormattedPHPToExcel($dateValue->format('Y'), $dateValue->format('m'), $dateValue->format('d'), $dateValue->format('H'), $dateValue->format('i'), $dateValue->format('s'));\n        } elseif (is_numeric($dateValue)) {\n            $dateValue += $timezoneAdjustment;\n            $retValue = self::FormattedPHPToExcel(date('Y', $dateValue), date('m', $dateValue), date('d', $dateValue), date('H', $dateValue), date('i', $dateValue), date('s', $dateValue));\n        } elseif (is_string($dateValue)) {\n            $retValue = self::stringToExcel($dateValue);\n        }\n        date_default_timezone_set($saveTimeZone);\n\n        return $retValue;\n    }\n\n\n    /**\n     * FormattedPHPToExcel\n     *\n     * @param    integer    $year\n     * @param    integer    $month\n     * @param    integer    $day\n     * @param    integer    $hours\n     * @param    integer    $minutes\n     * @param    integer    $seconds\n     * @return   integer    Excel date/time value\n     */\n    public static function FormattedPHPToExcel($year, $month, $day, $hours = 0, $minutes = 0, $seconds = 0)\n    {\n        if (self::$excelBaseDate == self::CALENDAR_WINDOWS_1900) {\n            //\n            //    Fudge factor for the erroneous fact that the year 1900 is treated as a Leap Year in MS Excel\n            //    This affects every date following 28th February 1900\n            //\n            $excel1900isLeapYear = true;\n            if (($year == 1900) && ($month <= 2)) {\n                $excel1900isLeapYear = false;\n            }\n            $myexcelBaseDate = 2415020;\n        } else {\n            $myexcelBaseDate = 2416481;\n            $excel1900isLeapYear = false;\n        }\n\n        //    Julian base date Adjustment\n        if ($month > 2) {\n            $month -= 3;\n        } else {\n            $month += 9;\n            --$year;\n        }\n\n        //    Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0)\n        $century = substr($year, 0, 2);\n        $decade = substr($year, 2, 2);\n        $excelDate = floor((146097 * $century) / 4) + floor((1461 * $decade) / 4) + floor((153 * $month + 2) / 5) + $day + 1721119 - $myexcelBaseDate + $excel1900isLeapYear;\n\n        $excelTime = (($hours * 3600) + ($minutes * 60) + $seconds) / 86400;\n\n        return (float) $excelDate + $excelTime;\n    }\n\n\n    /**\n     * Is a given cell a date/time?\n     *\n     * @param     PHPExcel_Cell    $pCell\n     * @return     boolean\n     */\n    public static function isDateTime(PHPExcel_Cell $pCell)\n    {\n        return self::isDateTimeFormat(\n            $pCell->getWorksheet()->getStyle(\n                $pCell->getCoordinate()\n            )->getNumberFormat()\n        );\n    }\n\n\n    /**\n     * Is a given number format a date/time?\n     *\n     * @param     PHPExcel_Style_NumberFormat    $pFormat\n     * @return     boolean\n     */\n    public static function isDateTimeFormat(PHPExcel_Style_NumberFormat $pFormat)\n    {\n        return self::isDateTimeFormatCode($pFormat->getFormatCode());\n    }\n\n\n    private static $possibleDateFormatCharacters = 'eymdHs';\n\n    /**\n     * Is a given number format code a date/time?\n     *\n     * @param     string    $pFormatCode\n     * @return     boolean\n     */\n    public static function isDateTimeFormatCode($pFormatCode = '')\n    {\n        if (strtolower($pFormatCode) === strtolower(PHPExcel_Style_NumberFormat::FORMAT_GENERAL)) {\n            //    \"General\" contains an epoch letter 'e', so we trap for it explicitly here (case-insensitive check)\n            return false;\n        }\n        if (preg_match('/[0#]E[+-]0/i', $pFormatCode)) {\n            //    Scientific format\n            return false;\n        }\n\n        // Switch on formatcode\n        switch ($pFormatCode) {\n            //    Explicitly defined date formats\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYMINUS:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMMINUS:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_MYMINUS:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME1:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME2:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME5:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME6:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME7:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME8:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX16:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX17:\n            case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX22:\n                return true;\n        }\n\n        //    Typically number, currency or accounting (or occasionally fraction) formats\n        if ((substr($pFormatCode, 0, 1) == '_') || (substr($pFormatCode, 0, 2) == '0 ')) {\n            return false;\n        }\n        // Try checking for any of the date formatting characters that don't appear within square braces\n        if (preg_match('/(^|\\])[^\\[]*['.self::$possibleDateFormatCharacters.']/i', $pFormatCode)) {\n            //    We might also have a format mask containing quoted strings...\n            //        we don't want to test for any of our characters within the quoted blocks\n            if (strpos($pFormatCode, '\"') !== false) {\n                $segMatcher = false;\n                foreach (explode('\"', $pFormatCode) as $subVal) {\n                    //    Only test in alternate array entries (the non-quoted blocks)\n                    if (($segMatcher = !$segMatcher) &&\n                        (preg_match('/(^|\\])[^\\[]*['.self::$possibleDateFormatCharacters.']/i', $subVal))) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n            return true;\n        }\n\n        // No date...\n        return false;\n    }\n\n\n    /**\n     * Convert a date/time string to Excel time\n     *\n     * @param    string    $dateValue        Examples: '2009-12-31', '2009-12-31 15:59', '2009-12-31 15:59:10'\n     * @return    float|FALSE        Excel date/time serial value\n     */\n    public static function stringToExcel($dateValue = '')\n    {\n        if (strlen($dateValue) < 2) {\n            return false;\n        }\n        if (!preg_match('/^(\\d{1,4}[ \\.\\/\\-][A-Z]{3,9}([ \\.\\/\\-]\\d{1,4})?|[A-Z]{3,9}[ \\.\\/\\-]\\d{1,4}([ \\.\\/\\-]\\d{1,4})?|\\d{1,4}[ \\.\\/\\-]\\d{1,4}([ \\.\\/\\-]\\d{1,4})?)( \\d{1,2}:\\d{1,2}(:\\d{1,2})?)?$/iu', $dateValue)) {\n            return false;\n        }\n\n        $dateValueNew = PHPExcel_Calculation_DateTime::DATEVALUE($dateValue);\n\n        if ($dateValueNew === PHPExcel_Calculation_Functions::VALUE()) {\n            return false;\n        }\n\n        if (strpos($dateValue, ':') !== false) {\n            $timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($dateValue);\n            if ($timeValue === PHPExcel_Calculation_Functions::VALUE()) {\n                return false;\n            }\n            $dateValueNew += $timeValue;\n        }\n        return $dateValueNew;\n    }\n\n    /**\n     * Converts a month name (either a long or a short name) to a month number\n     *\n     * @param     string    $month    Month name or abbreviation\n     * @return    integer|string     Month number (1 - 12), or the original string argument if it isn't a valid month name\n     */\n    public static function monthStringToNumber($month)\n    {\n        $monthIndex = 1;\n        foreach (self::$monthNames as $shortMonthName => $longMonthName) {\n            if (($month === $longMonthName) || ($month === $shortMonthName)) {\n                return $monthIndex;\n            }\n            ++$monthIndex;\n        }\n        return $month;\n    }\n\n    /**\n     * Strips an ordinal froma numeric value\n     *\n     * @param     string    $day      Day number with an ordinal\n     * @return    integer|string      The integer value with any ordinal stripped, or the original string argument if it isn't a valid numeric\n     */\n    public static function dayStringToNumber($day)\n    {\n        $strippedDayValue = (str_replace(self::$numberSuffixes, '', $day));\n        if (is_numeric($strippedDayValue)) {\n            return (integer) $strippedDayValue;\n        }\n        return $day;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Drawing.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Shared_Drawing\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Shared_Drawing\n{\n    /**\n     * Convert pixels to EMU\n     *\n     * @param     int $pValue    Value in pixels\n     * @return     int            Value in EMU\n     */\n    public static function pixelsToEMU($pValue = 0)\n    {\n        return round($pValue * 9525);\n    }\n\n    /**\n     * Convert EMU to pixels\n     *\n     * @param     int $pValue    Value in EMU\n     * @return     int            Value in pixels\n     */\n    public static function EMUToPixels($pValue = 0)\n    {\n        if ($pValue != 0) {\n            return round($pValue / 9525);\n        } else {\n            return 0;\n        }\n    }\n\n    /**\n     * Convert pixels to column width. Exact algorithm not known.\n     * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875\n     * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional.\n     *\n     * @param     int $pValue    Value in pixels\n     * @param     PHPExcel_Style_Font $pDefaultFont    Default font of the workbook\n     * @return     int            Value in cell dimension\n     */\n    public static function pixelsToCellDimension($pValue = 0, PHPExcel_Style_Font $pDefaultFont)\n    {\n        // Font name and size\n        $name = $pDefaultFont->getName();\n        $size = $pDefaultFont->getSize();\n\n        if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) {\n            // Exact width can be determined\n            $colWidth = $pValue * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width'] / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px'];\n        } else {\n            // We don't have data for this particular font and size, use approximation by\n            // extrapolating from Calibri 11\n            $colWidth = $pValue * 11 * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / $size;\n        }\n\n        return $colWidth;\n    }\n\n    /**\n     * Convert column width from (intrinsic) Excel units to pixels\n     *\n     * @param     float    $pValue        Value in cell dimension\n     * @param     PHPExcel_Style_Font $pDefaultFont    Default font of the workbook\n     * @return     int        Value in pixels\n     */\n    public static function cellDimensionToPixels($pValue = 0, PHPExcel_Style_Font $pDefaultFont)\n    {\n        // Font name and size\n        $name = $pDefaultFont->getName();\n        $size = $pDefaultFont->getSize();\n\n        if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) {\n            // Exact width can be determined\n            $colWidth = $pValue * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px'] / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width'];\n        } else {\n            // We don't have data for this particular font and size, use approximation by\n            // extrapolating from Calibri 11\n            $colWidth = $pValue * $size * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / 11;\n        }\n\n        // Round pixels to closest integer\n        $colWidth = (int) round($colWidth);\n\n        return $colWidth;\n    }\n\n    /**\n     * Convert pixels to points\n     *\n     * @param     int $pValue    Value in pixels\n     * @return     int            Value in points\n     */\n    public static function pixelsToPoints($pValue = 0)\n    {\n        return $pValue * 0.67777777;\n    }\n\n    /**\n     * Convert points to pixels\n     *\n     * @param     int $pValue    Value in points\n     * @return     int            Value in pixels\n     */\n    public static function pointsToPixels($pValue = 0)\n    {\n        if ($pValue != 0) {\n            return (int) ceil($pValue * 1.333333333);\n        } else {\n            return 0;\n        }\n    }\n\n    /**\n     * Convert degrees to angle\n     *\n     * @param     int $pValue    Degrees\n     * @return     int            Angle\n     */\n    public static function degreesToAngle($pValue = 0)\n    {\n        return (int)round($pValue * 60000);\n    }\n\n    /**\n     * Convert angle to degrees\n     *\n     * @param     int $pValue    Angle\n     * @return     int            Degrees\n     */\n    public static function angleToDegrees($pValue = 0)\n    {\n        if ($pValue != 0) {\n            return round($pValue / 60000);\n        } else {\n            return 0;\n        }\n    }\n\n    /**\n     * Create a new image from file. By alexander at alexauto dot nl\n     *\n     * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214\n     * @param string $filename Path to Windows DIB (BMP) image\n     * @return resource\n     */\n    public static function imagecreatefrombmp($p_sFile)\n    {\n        //    Load the image into a string\n        $file = fopen($p_sFile, \"rb\");\n        $read = fread($file, 10);\n        while (!feof($file) && ($read<>\"\")) {\n            $read .= fread($file, 1024);\n        }\n\n        $temp = unpack(\"H*\", $read);\n        $hex = $temp[1];\n        $header = substr($hex, 0, 108);\n\n        //    Process the header\n        //    Structure: http://www.fastgraph.com/help/bmp_header_format.html\n        if (substr($header, 0, 4)==\"424d\") {\n            //    Cut it in parts of 2 bytes\n            $header_parts = str_split($header, 2);\n\n            //    Get the width        4 bytes\n            $width = hexdec($header_parts[19].$header_parts[18]);\n\n            //    Get the height        4 bytes\n            $height = hexdec($header_parts[23].$header_parts[22]);\n\n            //    Unset the header params\n            unset($header_parts);\n        }\n\n        //    Define starting X and Y\n        $x = 0;\n        $y = 1;\n\n        //    Create newimage\n        $image = imagecreatetruecolor($width, $height);\n\n        //    Grab the body from the image\n        $body = substr($hex, 108);\n\n        //    Calculate if padding at the end-line is needed\n        //    Divided by two to keep overview.\n        //    1 byte = 2 HEX-chars\n        $body_size = (strlen($body)/2);\n        $header_size = ($width*$height);\n\n        //    Use end-line padding? Only when needed\n        $usePadding = ($body_size>($header_size*3)+4);\n\n        //    Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption\n        //    Calculate the next DWORD-position in the body\n        for ($i = 0; $i < $body_size; $i += 3) {\n            //    Calculate line-ending and padding\n            if ($x >= $width) {\n                // If padding needed, ignore image-padding\n                // Shift i to the ending of the current 32-bit-block\n                if ($usePadding) {\n                    $i += $width%4;\n                }\n\n                //    Reset horizontal position\n                $x = 0;\n\n                //    Raise the height-position (bottom-up)\n                $y++;\n\n                //    Reached the image-height? Break the for-loop\n                if ($y > $height) {\n                    break;\n                }\n            }\n\n            // Calculation of the RGB-pixel (defined as BGR in image-data)\n            // Define $i_pos as absolute position in the body\n            $i_pos    = $i * 2;\n            $r        = hexdec($body[$i_pos+4].$body[$i_pos+5]);\n            $g        = hexdec($body[$i_pos+2].$body[$i_pos+3]);\n            $b        = hexdec($body[$i_pos].$body[$i_pos+1]);\n\n            // Calculate and draw the pixel\n            $color    = imagecolorallocate($image, $r, $g, $b);\n            imagesetpixel($image, $x, $height-$y, $color);\n\n            // Raise the horizontal position\n            $x++;\n        }\n\n        // Unset the body / free the memory\n        unset($body);\n\n        //    Return image-object\n        return $image;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer\n{\n    /**\n     * Parent Shape Group Container\n     *\n     * @var PHPExcel_Shared_Escher_DgContainer_SpgrContainer\n     */\n    private $parent;\n\n    /**\n     * Is this a group shape?\n     *\n     * @var boolean\n     */\n    private $spgr = false;\n\n    /**\n     * Shape type\n     *\n     * @var int\n     */\n    private $spType;\n\n    /**\n     * Shape flag\n     *\n     * @var int\n     */\n    private $spFlag;\n\n    /**\n     * Shape index (usually group shape has index 0, and the rest: 1,2,3...)\n     *\n     * @var boolean\n     */\n    private $spId;\n\n    /**\n     * Array of options\n     *\n     * @var array\n     */\n    private $OPT;\n\n    /**\n     * Cell coordinates of upper-left corner of shape, e.g. 'A1'\n     *\n     * @var string\n     */\n    private $startCoordinates;\n\n    /**\n     * Horizontal offset of upper-left corner of shape measured in 1/1024 of column width\n     *\n     * @var int\n     */\n    private $startOffsetX;\n\n    /**\n     * Vertical offset of upper-left corner of shape measured in 1/256 of row height\n     *\n     * @var int\n     */\n    private $startOffsetY;\n\n    /**\n     * Cell coordinates of bottom-right corner of shape, e.g. 'B2'\n     *\n     * @var string\n     */\n    private $endCoordinates;\n\n    /**\n     * Horizontal offset of bottom-right corner of shape measured in 1/1024 of column width\n     *\n     * @var int\n     */\n    private $endOffsetX;\n\n    /**\n     * Vertical offset of bottom-right corner of shape measured in 1/256 of row height\n     *\n     * @var int\n     */\n    private $endOffsetY;\n\n    /**\n     * Set parent Shape Group Container\n     *\n     * @param PHPExcel_Shared_Escher_DgContainer_SpgrContainer $parent\n     */\n    public function setParent($parent)\n    {\n        $this->parent = $parent;\n    }\n\n    /**\n     * Get the parent Shape Group Container\n     *\n     * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Set whether this is a group shape\n     *\n     * @param boolean $value\n     */\n    public function setSpgr($value = false)\n    {\n        $this->spgr = $value;\n    }\n\n    /**\n     * Get whether this is a group shape\n     *\n     * @return boolean\n     */\n    public function getSpgr()\n    {\n        return $this->spgr;\n    }\n\n    /**\n     * Set the shape type\n     *\n     * @param int $value\n     */\n    public function setSpType($value)\n    {\n        $this->spType = $value;\n    }\n\n    /**\n     * Get the shape type\n     *\n     * @return int\n     */\n    public function getSpType()\n    {\n        return $this->spType;\n    }\n\n    /**\n     * Set the shape flag\n     *\n     * @param int $value\n     */\n    public function setSpFlag($value)\n    {\n        $this->spFlag = $value;\n    }\n\n    /**\n     * Get the shape flag\n     *\n     * @return int\n     */\n    public function getSpFlag()\n    {\n        return $this->spFlag;\n    }\n\n    /**\n     * Set the shape index\n     *\n     * @param int $value\n     */\n    public function setSpId($value)\n    {\n        $this->spId = $value;\n    }\n\n    /**\n     * Get the shape index\n     *\n     * @return int\n     */\n    public function getSpId()\n    {\n        return $this->spId;\n    }\n\n    /**\n     * Set an option for the Shape Group Container\n     *\n     * @param int $property The number specifies the option\n     * @param mixed $value\n     */\n    public function setOPT($property, $value)\n    {\n        $this->OPT[$property] = $value;\n    }\n\n    /**\n     * Get an option for the Shape Group Container\n     *\n     * @param int $property The number specifies the option\n     * @return mixed\n     */\n    public function getOPT($property)\n    {\n        if (isset($this->OPT[$property])) {\n            return $this->OPT[$property];\n        }\n        return null;\n    }\n\n    /**\n     * Get the collection of options\n     *\n     * @return array\n     */\n    public function getOPTCollection()\n    {\n        return $this->OPT;\n    }\n\n    /**\n     * Set cell coordinates of upper-left corner of shape\n     *\n     * @param string $value\n     */\n    public function setStartCoordinates($value = 'A1')\n    {\n        $this->startCoordinates = $value;\n    }\n\n    /**\n     * Get cell coordinates of upper-left corner of shape\n     *\n     * @return string\n     */\n    public function getStartCoordinates()\n    {\n        return $this->startCoordinates;\n    }\n\n    /**\n     * Set offset in x-direction of upper-left corner of shape measured in 1/1024 of column width\n     *\n     * @param int $startOffsetX\n     */\n    public function setStartOffsetX($startOffsetX = 0)\n    {\n        $this->startOffsetX = $startOffsetX;\n    }\n\n    /**\n     * Get offset in x-direction of upper-left corner of shape measured in 1/1024 of column width\n     *\n     * @return int\n     */\n    public function getStartOffsetX()\n    {\n        return $this->startOffsetX;\n    }\n\n    /**\n     * Set offset in y-direction of upper-left corner of shape measured in 1/256 of row height\n     *\n     * @param int $startOffsetY\n     */\n    public function setStartOffsetY($startOffsetY = 0)\n    {\n        $this->startOffsetY = $startOffsetY;\n    }\n\n    /**\n     * Get offset in y-direction of upper-left corner of shape measured in 1/256 of row height\n     *\n     * @return int\n     */\n    public function getStartOffsetY()\n    {\n        return $this->startOffsetY;\n    }\n\n    /**\n     * Set cell coordinates of bottom-right corner of shape\n     *\n     * @param string $value\n     */\n    public function setEndCoordinates($value = 'A1')\n    {\n        $this->endCoordinates = $value;\n    }\n\n    /**\n     * Get cell coordinates of bottom-right corner of shape\n     *\n     * @return string\n     */\n    public function getEndCoordinates()\n    {\n        return $this->endCoordinates;\n    }\n\n    /**\n     * Set offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width\n     *\n     * @param int $startOffsetX\n     */\n    public function setEndOffsetX($endOffsetX = 0)\n    {\n        $this->endOffsetX = $endOffsetX;\n    }\n\n    /**\n     * Get offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width\n     *\n     * @return int\n     */\n    public function getEndOffsetX()\n    {\n        return $this->endOffsetX;\n    }\n\n    /**\n     * Set offset in y-direction of bottom-right corner of shape measured in 1/256 of row height\n     *\n     * @param int $endOffsetY\n     */\n    public function setEndOffsetY($endOffsetY = 0)\n    {\n        $this->endOffsetY = $endOffsetY;\n    }\n\n    /**\n     * Get offset in y-direction of bottom-right corner of shape measured in 1/256 of row height\n     *\n     * @return int\n     */\n    public function getEndOffsetY()\n    {\n        return $this->endOffsetY;\n    }\n\n    /**\n     * Get the nesting level of this spContainer. This is the number of spgrContainers between this spContainer and\n     * the dgContainer. A value of 1 = immediately within first spgrContainer\n     * Higher nesting level occurs if and only if spContainer is part of a shape group\n     *\n     * @return int Nesting level\n     */\n    public function getNestingLevel()\n    {\n        $nestingLevel = 0;\n\n        $parent = $this->getParent();\n        while ($parent instanceof PHPExcel_Shared_Escher_DgContainer_SpgrContainer) {\n            ++$nestingLevel;\n            $parent = $parent->getParent();\n        }\n\n        return $nestingLevel;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DgContainer_SpgrContainer\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DgContainer_SpgrContainer\n{\n    /**\n     * Parent Shape Group Container\n     *\n     * @var PHPExcel_Shared_Escher_DgContainer_SpgrContainer\n     */\n    private $parent;\n\n    /**\n     * Shape Container collection\n     *\n     * @var array\n     */\n    private $children = array();\n\n    /**\n     * Set parent Shape Group Container\n     *\n     * @param PHPExcel_Shared_Escher_DgContainer_SpgrContainer $parent\n     */\n    public function setParent($parent)\n    {\n        $this->parent = $parent;\n    }\n\n    /**\n     * Get the parent Shape Group Container if any\n     *\n     * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer|null\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Add a child. This will be either spgrContainer or spContainer\n     *\n     * @param mixed $child\n     */\n    public function addChild($child)\n    {\n        $this->children[] = $child;\n        $child->setParent($this);\n    }\n\n    /**\n     * Get collection of Shape Containers\n     */\n    public function getChildren()\n    {\n        return $this->children;\n    }\n\n    /**\n     * Recursively get all spContainers within this spgrContainer\n     *\n     * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer[]\n     */\n    public function getAllSpContainers()\n    {\n        $allSpContainers = array();\n\n        foreach ($this->children as $child) {\n            if ($child instanceof PHPExcel_Shared_Escher_DgContainer_SpgrContainer) {\n                $allSpContainers = array_merge($allSpContainers, $child->getAllSpContainers());\n            } else {\n                $allSpContainers[] = $child;\n            }\n        }\n\n        return $allSpContainers;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DgContainer\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DgContainer\n{\n    /**\n     * Drawing index, 1-based.\n     *\n     * @var int\n     */\n    private $dgId;\n\n    /**\n     * Last shape index in this drawing\n     *\n     * @var int\n     */\n    private $lastSpId;\n\n    private $spgrContainer = null;\n\n    public function getDgId()\n    {\n        return $this->dgId;\n    }\n\n    public function setDgId($value)\n    {\n        $this->dgId = $value;\n    }\n\n    public function getLastSpId()\n    {\n        return $this->lastSpId;\n    }\n\n    public function setLastSpId($value)\n    {\n        $this->lastSpId = $value;\n    }\n\n    public function getSpgrContainer()\n    {\n        return $this->spgrContainer;\n    }\n\n    public function setSpgrContainer($spgrContainer)\n    {\n        return $this->spgrContainer = $spgrContainer;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip\n{\n    /**\n     * The parent BSE\n     *\n     * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE\n     */\n    private $parent;\n\n    /**\n     * Raw image data\n     *\n     * @var string\n     */\n    private $data;\n\n    /**\n     * Get the raw image data\n     *\n     * @return string\n     */\n    public function getData()\n    {\n        return $this->data;\n    }\n\n    /**\n     * Set the raw image data\n     *\n     * @param string\n     */\n    public function setData($data)\n    {\n        $this->data = $data;\n    }\n\n    /**\n     * Set parent BSE\n     *\n     * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $parent\n     */\n    public function setParent($parent)\n    {\n        $this->parent = $parent;\n    }\n\n    /**\n     * Get parent BSE\n     *\n     * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $parent\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE\n{\n    const BLIPTYPE_ERROR    = 0x00;\n    const BLIPTYPE_UNKNOWN  = 0x01;\n    const BLIPTYPE_EMF      = 0x02;\n    const BLIPTYPE_WMF      = 0x03;\n    const BLIPTYPE_PICT     = 0x04;\n    const BLIPTYPE_JPEG     = 0x05;\n    const BLIPTYPE_PNG      = 0x06;\n    const BLIPTYPE_DIB      = 0x07;\n    const BLIPTYPE_TIFF     = 0x11;\n    const BLIPTYPE_CMYKJPEG = 0x12;\n\n    /**\n     * The parent BLIP Store Entry Container\n     *\n     * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer\n     */\n    private $parent;\n\n    /**\n     * The BLIP (Big Large Image or Picture)\n     *\n     * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip\n     */\n    private $blip;\n\n    /**\n     * The BLIP type\n     *\n     * @var int\n     */\n    private $blipType;\n\n    /**\n     * Set parent BLIP Store Entry Container\n     *\n     * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer $parent\n     */\n    public function setParent($parent)\n    {\n        $this->parent = $parent;\n    }\n\n    /**\n     * Get the BLIP\n     *\n     * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip\n     */\n    public function getBlip()\n    {\n        return $this->blip;\n    }\n\n    /**\n     * Set the BLIP\n     *\n     * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip $blip\n     */\n    public function setBlip($blip)\n    {\n        $this->blip = $blip;\n        $blip->setParent($this);\n    }\n\n    /**\n     * Get the BLIP type\n     *\n     * @return int\n     */\n    public function getBlipType()\n    {\n        return $this->blipType;\n    }\n\n    /**\n     * Set the BLIP type\n     *\n     * @param int\n     */\n    public function setBlipType($blipType)\n    {\n        $this->blipType = $blipType;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DggContainer_BstoreContainer\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DggContainer_BstoreContainer\n{\n    /**\n     * BLIP Store Entries. Each of them holds one BLIP (Big Large Image or Picture)\n     *\n     * @var array\n     */\n    private $BSECollection = array();\n\n    /**\n     * Add a BLIP Store Entry\n     *\n     * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $BSE\n     */\n    public function addBSE($BSE)\n    {\n        $this->BSECollection[] = $BSE;\n        $BSE->setParent($this);\n    }\n\n    /**\n     * Get the collection of BLIP Store Entries\n     *\n     * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE[]\n     */\n    public function getBSECollection()\n    {\n        return $this->BSECollection;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher_DggContainer\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher_DggContainer\n{\n    /**\n     * Maximum shape index of all shapes in all drawings increased by one\n     *\n     * @var int\n     */\n    private $spIdMax;\n\n    /**\n     * Total number of drawings saved\n     *\n     * @var int\n     */\n    private $cDgSaved;\n\n    /**\n     * Total number of shapes saved (including group shapes)\n     *\n     * @var int\n     */\n    private $cSpSaved;\n\n    /**\n     * BLIP Store Container\n     *\n     * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer\n     */\n    private $bstoreContainer;\n\n    /**\n     * Array of options for the drawing group\n     *\n     * @var array\n     */\n    private $OPT = array();\n\n    /**\n     * Array of identifier clusters containg information about the maximum shape identifiers\n     *\n     * @var array\n     */\n    private $IDCLs = array();\n\n    /**\n     * Get maximum shape index of all shapes in all drawings (plus one)\n     *\n     * @return int\n     */\n    public function getSpIdMax()\n    {\n        return $this->spIdMax;\n    }\n\n    /**\n     * Set maximum shape index of all shapes in all drawings (plus one)\n     *\n     * @param int\n     */\n    public function setSpIdMax($value)\n    {\n        $this->spIdMax = $value;\n    }\n\n    /**\n     * Get total number of drawings saved\n     *\n     * @return int\n     */\n    public function getCDgSaved()\n    {\n        return $this->cDgSaved;\n    }\n\n    /**\n     * Set total number of drawings saved\n     *\n     * @param int\n     */\n    public function setCDgSaved($value)\n    {\n        $this->cDgSaved = $value;\n    }\n\n    /**\n     * Get total number of shapes saved (including group shapes)\n     *\n     * @return int\n     */\n    public function getCSpSaved()\n    {\n        return $this->cSpSaved;\n    }\n\n    /**\n     * Set total number of shapes saved (including group shapes)\n     *\n     * @param int\n     */\n    public function setCSpSaved($value)\n    {\n        $this->cSpSaved = $value;\n    }\n\n    /**\n     * Get BLIP Store Container\n     *\n     * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer\n     */\n    public function getBstoreContainer()\n    {\n        return $this->bstoreContainer;\n    }\n\n    /**\n     * Set BLIP Store Container\n     *\n     * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer $bstoreContainer\n     */\n    public function setBstoreContainer($bstoreContainer)\n    {\n        $this->bstoreContainer = $bstoreContainer;\n    }\n\n    /**\n     * Set an option for the drawing group\n     *\n     * @param int $property The number specifies the option\n     * @param mixed $value\n     */\n    public function setOPT($property, $value)\n    {\n        $this->OPT[$property] = $value;\n    }\n\n    /**\n     * Get an option for the drawing group\n     *\n     * @param int $property The number specifies the option\n     * @return mixed\n     */\n    public function getOPT($property)\n    {\n        if (isset($this->OPT[$property])) {\n            return $this->OPT[$property];\n        }\n        return null;\n    }\n\n    /**\n     * Get identifier clusters\n     *\n     * @return array\n     */\n    public function getIDCLs()\n    {\n        return $this->IDCLs;\n    }\n\n    /**\n     * Set identifier clusters. array(<drawingId> => <max shape id>, ...)\n     *\n     * @param array $pValue\n     */\n    public function setIDCLs($pValue)\n    {\n        $this->IDCLs = $pValue;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Escher.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Escher\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Escher\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Escher\n{\n    /**\n     * Drawing Group Container\n     *\n     * @var PHPExcel_Shared_Escher_DggContainer\n     */\n    private $dggContainer;\n\n    /**\n     * Drawing Container\n     *\n     * @var PHPExcel_Shared_Escher_DgContainer\n     */\n    private $dgContainer;\n\n    /**\n     * Get Drawing Group Container\n     *\n     * @return PHPExcel_Shared_Escher_DgContainer\n     */\n    public function getDggContainer()\n    {\n        return $this->dggContainer;\n    }\n\n    /**\n     * Set Drawing Group Container\n     *\n     * @param PHPExcel_Shared_Escher_DggContainer $dggContainer\n     */\n    public function setDggContainer($dggContainer)\n    {\n        return $this->dggContainer = $dggContainer;\n    }\n\n    /**\n     * Get Drawing Container\n     *\n     * @return PHPExcel_Shared_Escher_DgContainer\n     */\n    public function getDgContainer()\n    {\n        return $this->dgContainer;\n    }\n\n    /**\n     * Set Drawing Container\n     *\n     * @param PHPExcel_Shared_Escher_DgContainer $dgContainer\n     */\n    public function setDgContainer($dgContainer)\n    {\n        return $this->dgContainer = $dgContainer;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Excel5.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_Excel5\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_Excel5\n{\n    /**\n     * Get the width of a column in pixels. We use the relationship y = ceil(7x) where\n     * x is the width in intrinsic Excel units (measuring width in number of normal characters)\n     * This holds for Arial 10\n     *\n     * @param PHPExcel_Worksheet $sheet The sheet\n     * @param string $col The column\n     * @return integer The width in pixels\n    */\n    public static function sizeCol($sheet, $col = 'A')\n    {\n        // default font of the workbook\n        $font = $sheet->getParent()->getDefaultStyle()->getFont();\n\n        $columnDimensions = $sheet->getColumnDimensions();\n\n        // first find the true column width in pixels (uncollapsed and unhidden)\n        if (isset($columnDimensions[$col]) and $columnDimensions[$col]->getWidth() != -1) {\n            // then we have column dimension with explicit width\n            $columnDimension = $columnDimensions[$col];\n            $width = $columnDimension->getWidth();\n            $pixelWidth = PHPExcel_Shared_Drawing::cellDimensionToPixels($width, $font);\n        } elseif ($sheet->getDefaultColumnDimension()->getWidth() != -1) {\n            // then we have default column dimension with explicit width\n            $defaultColumnDimension = $sheet->getDefaultColumnDimension();\n            $width = $defaultColumnDimension->getWidth();\n            $pixelWidth = PHPExcel_Shared_Drawing::cellDimensionToPixels($width, $font);\n        } else {\n            // we don't even have any default column dimension. Width depends on default font\n            $pixelWidth = PHPExcel_Shared_Font::getDefaultColumnWidthByFont($font, true);\n        }\n\n        // now find the effective column width in pixels\n        if (isset($columnDimensions[$col]) and !$columnDimensions[$col]->getVisible()) {\n            $effectivePixelWidth = 0;\n        } else {\n            $effectivePixelWidth = $pixelWidth;\n        }\n\n        return $effectivePixelWidth;\n    }\n\n    /**\n     * Convert the height of a cell from user's units to pixels. By interpolation\n     * the relationship is: y = 4/3x. If the height hasn't been set by the user we\n     * use the default value. If the row is hidden we use a value of zero.\n     *\n     * @param PHPExcel_Worksheet $sheet The sheet\n     * @param integer $row The row index (1-based)\n     * @return integer The width in pixels\n     */\n    public static function sizeRow($sheet, $row = 1)\n    {\n        // default font of the workbook\n        $font = $sheet->getParent()->getDefaultStyle()->getFont();\n\n        $rowDimensions = $sheet->getRowDimensions();\n\n        // first find the true row height in pixels (uncollapsed and unhidden)\n        if (isset($rowDimensions[$row]) and $rowDimensions[$row]->getRowHeight() != -1) {\n            // then we have a row dimension\n            $rowDimension = $rowDimensions[$row];\n            $rowHeight = $rowDimension->getRowHeight();\n            $pixelRowHeight = (int) ceil(4 * $rowHeight / 3); // here we assume Arial 10\n        } elseif ($sheet->getDefaultRowDimension()->getRowHeight() != -1) {\n            // then we have a default row dimension with explicit height\n            $defaultRowDimension = $sheet->getDefaultRowDimension();\n            $rowHeight = $defaultRowDimension->getRowHeight();\n            $pixelRowHeight = PHPExcel_Shared_Drawing::pointsToPixels($rowHeight);\n        } else {\n            // we don't even have any default row dimension. Height depends on default font\n            $pointRowHeight = PHPExcel_Shared_Font::getDefaultRowHeightByFont($font);\n            $pixelRowHeight = PHPExcel_Shared_Font::fontSizeToPixels($pointRowHeight);\n        }\n\n        // now find the effective row height in pixels\n        if (isset($rowDimensions[$row]) and !$rowDimensions[$row]->getVisible()) {\n            $effectivePixelRowHeight = 0;\n        } else {\n            $effectivePixelRowHeight = $pixelRowHeight;\n        }\n\n        return $effectivePixelRowHeight;\n    }\n\n    /**\n     * Get the horizontal distance in pixels between two anchors\n     * The distanceX is found as sum of all the spanning columns widths minus correction for the two offsets\n     *\n     * @param PHPExcel_Worksheet $sheet\n     * @param string $startColumn\n     * @param integer $startOffsetX Offset within start cell measured in 1/1024 of the cell width\n     * @param string $endColumn\n     * @param integer $endOffsetX Offset within end cell measured in 1/1024 of the cell width\n     * @return integer Horizontal measured in pixels\n     */\n    public static function getDistanceX(PHPExcel_Worksheet $sheet, $startColumn = 'A', $startOffsetX = 0, $endColumn = 'A', $endOffsetX = 0)\n    {\n        $distanceX = 0;\n\n        // add the widths of the spanning columns\n        $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1; // 1-based\n        $endColumnIndex = PHPExcel_Cell::columnIndexFromString($endColumn) - 1; // 1-based\n        for ($i = $startColumnIndex; $i <= $endColumnIndex; ++$i) {\n            $distanceX += self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($i));\n        }\n\n        // correct for offsetX in startcell\n        $distanceX -= (int) floor(self::sizeCol($sheet, $startColumn) * $startOffsetX / 1024);\n\n        // correct for offsetX in endcell\n        $distanceX -= (int) floor(self::sizeCol($sheet, $endColumn) * (1 - $endOffsetX / 1024));\n\n        return $distanceX;\n    }\n\n    /**\n     * Get the vertical distance in pixels between two anchors\n     * The distanceY is found as sum of all the spanning rows minus two offsets\n     *\n     * @param PHPExcel_Worksheet $sheet\n     * @param integer $startRow (1-based)\n     * @param integer $startOffsetY Offset within start cell measured in 1/256 of the cell height\n     * @param integer $endRow (1-based)\n     * @param integer $endOffsetY Offset within end cell measured in 1/256 of the cell height\n     * @return integer Vertical distance measured in pixels\n     */\n    public static function getDistanceY(PHPExcel_Worksheet $sheet, $startRow = 1, $startOffsetY = 0, $endRow = 1, $endOffsetY = 0)\n    {\n        $distanceY = 0;\n\n        // add the widths of the spanning rows\n        for ($row = $startRow; $row <= $endRow; ++$row) {\n            $distanceY += self::sizeRow($sheet, $row);\n        }\n\n        // correct for offsetX in startcell\n        $distanceY -= (int) floor(self::sizeRow($sheet, $startRow) * $startOffsetY / 256);\n\n        // correct for offsetX in endcell\n        $distanceY -= (int) floor(self::sizeRow($sheet, $endRow) * (1 - $endOffsetY / 256));\n\n        return $distanceY;\n    }\n\n    /**\n     * Convert 1-cell anchor coordinates to 2-cell anchor coordinates\n     * This function is ported from PEAR Spreadsheet_Writer_Excel with small modifications\n     *\n     * Calculate the vertices that define the position of the image as required by\n     * the OBJ record.\n     *\n     *         +------------+------------+\n     *         |     A      |      B     |\n     *   +-----+------------+------------+\n     *   |     |(x1,y1)     |            |\n     *   |  1  |(A1)._______|______      |\n     *   |     |    |              |     |\n     *   |     |    |              |     |\n     *   +-----+----|    BITMAP    |-----+\n     *   |     |    |              |     |\n     *   |  2  |    |______________.     |\n     *   |     |            |        (B2)|\n     *   |     |            |     (x2,y2)|\n     *   +---- +------------+------------+\n     *\n     * Example of a bitmap that covers some of the area from cell A1 to cell B2.\n     *\n     * Based on the width and height of the bitmap we need to calculate 8 vars:\n     *     $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2.\n     * The width and height of the cells are also variable and have to be taken into\n     * account.\n     * The values of $col_start and $row_start are passed in from the calling\n     * function. The values of $col_end and $row_end are calculated by subtracting\n     * the width and height of the bitmap from the width and height of the\n     * underlying cells.\n     * The vertices are expressed as a percentage of the underlying cell width as\n     * follows (rhs values are in pixels):\n     *\n     *       x1 = X / W *1024\n     *       y1 = Y / H *256\n     *       x2 = (X-1) / W *1024\n     *       y2 = (Y-1) / H *256\n     *\n     *       Where:  X is distance from the left side of the underlying cell\n     *               Y is distance from the top of the underlying cell\n     *               W is the width of the cell\n     *               H is the height of the cell\n     *\n     * @param PHPExcel_Worksheet $sheet\n     * @param string $coordinates E.g. 'A1'\n     * @param integer $offsetX Horizontal offset in pixels\n     * @param integer $offsetY Vertical offset in pixels\n     * @param integer $width Width in pixels\n     * @param integer $height Height in pixels\n     * @return array\n     */\n    public static function oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height)\n    {\n        list($column, $row) = PHPExcel_Cell::coordinateFromString($coordinates);\n        $col_start = PHPExcel_Cell::columnIndexFromString($column) - 1;\n        $row_start = $row - 1;\n\n        $x1 = $offsetX;\n        $y1 = $offsetY;\n\n        // Initialise end cell to the same as the start cell\n        $col_end    = $col_start;  // Col containing lower right corner of object\n        $row_end    = $row_start;  // Row containing bottom right corner of object\n\n        // Zero the specified offset if greater than the cell dimensions\n        if ($x1 >= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start))) {\n            $x1 = 0;\n        }\n        if ($y1 >= self::sizeRow($sheet, $row_start + 1)) {\n            $y1 = 0;\n        }\n\n        $width      = $width  + $x1 -1;\n        $height     = $height + $y1 -1;\n\n        // Subtract the underlying cell widths to find the end cell of the image\n        while ($width >= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end))) {\n            $width -= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end));\n            ++$col_end;\n        }\n\n        // Subtract the underlying cell heights to find the end cell of the image\n        while ($height >= self::sizeRow($sheet, $row_end + 1)) {\n            $height -= self::sizeRow($sheet, $row_end + 1);\n            ++$row_end;\n        }\n\n        // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell\n        // with zero height or width.\n        if (self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) == 0) {\n            return;\n        }\n        if (self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end))   == 0) {\n            return;\n        }\n        if (self::sizeRow($sheet, $row_start + 1) == 0) {\n            return;\n        }\n        if (self::sizeRow($sheet, $row_end + 1)   == 0) {\n            return;\n        }\n\n        // Convert the pixel values to the percentage value expected by Excel\n        $x1 = $x1     / self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start))   * 1024;\n        $y1 = $y1     / self::sizeRow($sheet, $row_start + 1)   *  256;\n        $x2 = ($width + 1)  / self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end))     * 1024; // Distance to right side of object\n        $y2 = ($height + 1) / self::sizeRow($sheet, $row_end + 1)     *  256; // Distance to bottom of object\n\n        $startCoordinates = PHPExcel_Cell::stringFromColumnIndex($col_start) . ($row_start + 1);\n        $endCoordinates = PHPExcel_Cell::stringFromColumnIndex($col_end) . ($row_end + 1);\n\n        $twoAnchor = array(\n            'startCoordinates' => $startCoordinates,\n            'startOffsetX' => $x1,\n            'startOffsetY' => $y1,\n            'endCoordinates' => $endCoordinates,\n            'endOffsetX' => $x2,\n            'endOffsetY' => $y2,\n        );\n\n        return  $twoAnchor;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/File.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_File\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_File\n{\n    /*\n     * Use Temp or File Upload Temp for temporary files\n     *\n     * @protected\n     * @var    boolean\n     */\n    protected static $useUploadTempDirectory = false;\n\n\n    /**\n     * Set the flag indicating whether the File Upload Temp directory should be used for temporary files\n     *\n     * @param     boolean    $useUploadTempDir        Use File Upload Temporary directory (true or false)\n     */\n    public static function setUseUploadTempDirectory($useUploadTempDir = false)\n    {\n        self::$useUploadTempDirectory = (boolean) $useUploadTempDir;\n    }\n\n\n    /**\n     * Get the flag indicating whether the File Upload Temp directory should be used for temporary files\n     *\n     * @return     boolean    Use File Upload Temporary directory (true or false)\n     */\n    public static function getUseUploadTempDirectory()\n    {\n        return self::$useUploadTempDirectory;\n    }\n\n\n    /**\n      * Verify if a file exists\n      *\n      * @param     string    $pFilename    Filename\n      * @return bool\n      */\n    public static function file_exists($pFilename)\n    {\n        // Sick construction, but it seems that\n        // file_exists returns strange values when\n        // doing the original file_exists on ZIP archives...\n        if (strtolower(substr($pFilename, 0, 3)) == 'zip') {\n            // Open ZIP file and verify if the file exists\n            $zipFile     = substr($pFilename, 6, strpos($pFilename, '#') - 6);\n            $archiveFile = substr($pFilename, strpos($pFilename, '#') + 1);\n\n            $zip = new ZipArchive();\n            if ($zip->open($zipFile) === true) {\n                $returnValue = ($zip->getFromName($archiveFile) !== false);\n                $zip->close();\n                return $returnValue;\n            } else {\n                return false;\n            }\n        } else {\n            // Regular file_exists\n            return file_exists($pFilename);\n        }\n    }\n\n    /**\n     * Returns canonicalized absolute pathname, also for ZIP archives\n     *\n     * @param string $pFilename\n     * @return string\n     */\n    public static function realpath($pFilename)\n    {\n        // Returnvalue\n        $returnValue = '';\n\n        // Try using realpath()\n        if (file_exists($pFilename)) {\n            $returnValue = realpath($pFilename);\n        }\n\n        // Found something?\n        if ($returnValue == '' || ($returnValue === null)) {\n            $pathArray = explode('/', $pFilename);\n            while (in_array('..', $pathArray) && $pathArray[0] != '..') {\n                for ($i = 0; $i < count($pathArray); ++$i) {\n                    if ($pathArray[$i] == '..' && $i > 0) {\n                        unset($pathArray[$i]);\n                        unset($pathArray[$i - 1]);\n                        break;\n                    }\n                }\n            }\n            $returnValue = implode('/', $pathArray);\n        }\n\n        // Return\n        return $returnValue;\n    }\n\n    /**\n     * Get the systems temporary directory.\n     *\n     * @return string\n     */\n    public static function sys_get_temp_dir()\n    {\n        if (self::$useUploadTempDirectory) {\n            //  use upload-directory when defined to allow running on environments having very restricted\n            //      open_basedir configs\n            if (ini_get('upload_tmp_dir') !== false) {\n                if ($temp = ini_get('upload_tmp_dir')) {\n                    if (file_exists($temp)) {\n                        return realpath($temp);\n                    }\n                }\n            }\n        }\n\n        // sys_get_temp_dir is only available since PHP 5.2.1\n        // http://php.net/manual/en/function.sys-get-temp-dir.php#94119\n        if (!function_exists('sys_get_temp_dir')) {\n            if ($temp = getenv('TMP')) {\n                if ((!empty($temp)) && (file_exists($temp))) {\n                    return realpath($temp);\n                }\n            }\n            if ($temp = getenv('TEMP')) {\n                if ((!empty($temp)) && (file_exists($temp))) {\n                    return realpath($temp);\n                }\n            }\n            if ($temp = getenv('TMPDIR')) {\n                if ((!empty($temp)) && (file_exists($temp))) {\n                    return realpath($temp);\n                }\n            }\n\n            // trick for creating a file in system's temporary dir\n            // without knowing the path of the system's temporary dir\n            $temp = tempnam(__FILE__, '');\n            if (file_exists($temp)) {\n                unlink($temp);\n                return realpath(dirname($temp));\n            }\n\n            return null;\n        }\n\n        // use ordinary built-in PHP function\n        //    There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only\n        //        be called if we're running 5.2.1 or earlier\n        return realpath(sys_get_temp_dir());\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/Font.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Shared_Font\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Shared_Font\n{\n    /* Methods for resolving autosize value */\n    const AUTOSIZE_METHOD_APPROX    = 'approx';\n    const AUTOSIZE_METHOD_EXACT     = 'exact';\n\n    private static $autoSizeMethods = array(\n        self::AUTOSIZE_METHOD_APPROX,\n        self::AUTOSIZE_METHOD_EXACT,\n    );\n\n    /** Character set codes used by BIFF5-8 in Font records */\n    const CHARSET_ANSI_LATIN                = 0x00;\n    const CHARSET_SYSTEM_DEFAULT            = 0x01;\n    const CHARSET_SYMBOL                    = 0x02;\n    const CHARSET_APPLE_ROMAN               = 0x4D;\n    const CHARSET_ANSI_JAPANESE_SHIFTJIS    = 0x80;\n    const CHARSET_ANSI_KOREAN_HANGUL        = 0x81;\n    const CHARSET_ANSI_KOREAN_JOHAB         = 0x82;\n    const CHARSET_ANSI_CHINESE_SIMIPLIFIED  = 0x86;        //    gb2312\n    const CHARSET_ANSI_CHINESE_TRADITIONAL  = 0x88;        //    big5\n    const CHARSET_ANSI_GREEK                = 0xA1;\n    const CHARSET_ANSI_TURKISH              = 0xA2;\n    const CHARSET_ANSI_VIETNAMESE           = 0xA3;\n    const CHARSET_ANSI_HEBREW               = 0xB1;\n    const CHARSET_ANSI_ARABIC               = 0xB2;\n    const CHARSET_ANSI_BALTIC               = 0xBA;\n    const CHARSET_ANSI_CYRILLIC             = 0xCC;\n    const CHARSET_ANSI_THAI                 = 0xDD;\n    const CHARSET_ANSI_LATIN_II             = 0xEE;\n    const CHARSET_OEM_LATIN_I               = 0xFF;\n\n    //  XXX: Constants created!\n    /** Font filenames */\n    const ARIAL                             = 'arial.ttf';\n    const ARIAL_BOLD                        = 'arialbd.ttf';\n    const ARIAL_ITALIC                      = 'ariali.ttf';\n    const ARIAL_BOLD_ITALIC                 = 'arialbi.ttf';\n\n    const CALIBRI                           = 'CALIBRI.TTF';\n    const CALIBRI_BOLD                      = 'CALIBRIB.TTF';\n    const CALIBRI_ITALIC                    = 'CALIBRII.TTF';\n    const CALIBRI_BOLD_ITALIC               = 'CALIBRIZ.TTF';\n\n    const COMIC_SANS_MS                     = 'comic.ttf';\n    const COMIC_SANS_MS_BOLD                = 'comicbd.ttf';\n\n    const COURIER_NEW                       = 'cour.ttf';\n    const COURIER_NEW_BOLD                  = 'courbd.ttf';\n    const COURIER_NEW_ITALIC                = 'couri.ttf';\n    const COURIER_NEW_BOLD_ITALIC           = 'courbi.ttf';\n\n    const GEORGIA                           = 'georgia.ttf';\n    const GEORGIA_BOLD                      = 'georgiab.ttf';\n    const GEORGIA_ITALIC                    = 'georgiai.ttf';\n    const GEORGIA_BOLD_ITALIC               = 'georgiaz.ttf';\n\n    const IMPACT                            = 'impact.ttf';\n\n    const LIBERATION_SANS                   = 'LiberationSans-Regular.ttf';\n    const LIBERATION_SANS_BOLD              = 'LiberationSans-Bold.ttf';\n    const LIBERATION_SANS_ITALIC            = 'LiberationSans-Italic.ttf';\n    const LIBERATION_SANS_BOLD_ITALIC       = 'LiberationSans-BoldItalic.ttf';\n\n    const LUCIDA_CONSOLE                    = 'lucon.ttf';\n    const LUCIDA_SANS_UNICODE               = 'l_10646.ttf';\n\n    const MICROSOFT_SANS_SERIF              = 'micross.ttf';\n\n    const PALATINO_LINOTYPE                 = 'pala.ttf';\n    const PALATINO_LINOTYPE_BOLD            = 'palab.ttf';\n    const PALATINO_LINOTYPE_ITALIC          = 'palai.ttf';\n    const PALATINO_LINOTYPE_BOLD_ITALIC     = 'palabi.ttf';\n\n    const SYMBOL                            = 'symbol.ttf';\n\n    const TAHOMA                            = 'tahoma.ttf';\n    const TAHOMA_BOLD                       = 'tahomabd.ttf';\n\n    const TIMES_NEW_ROMAN                   = 'times.ttf';\n    const TIMES_NEW_ROMAN_BOLD              = 'timesbd.ttf';\n    const TIMES_NEW_ROMAN_ITALIC            = 'timesi.ttf';\n    const TIMES_NEW_ROMAN_BOLD_ITALIC       = 'timesbi.ttf';\n\n    const TREBUCHET_MS                      = 'trebuc.ttf';\n    const TREBUCHET_MS_BOLD                 = 'trebucbd.ttf';\n    const TREBUCHET_MS_ITALIC               = 'trebucit.ttf';\n    const TREBUCHET_MS_BOLD_ITALIC          = 'trebucbi.ttf';\n\n    const VERDANA                           = 'verdana.ttf';\n    const VERDANA_BOLD                      = 'verdanab.ttf';\n    const VERDANA_ITALIC                    = 'verdanai.ttf';\n    const VERDANA_BOLD_ITALIC               = 'verdanaz.ttf';\n\n    /**\n     * AutoSize method\n     *\n     * @var string\n     */\n    private static $autoSizeMethod = self::AUTOSIZE_METHOD_APPROX;\n\n    /**\n     * Path to folder containing TrueType font .ttf files\n     *\n     * @var string\n     */\n    private static $trueTypeFontPath = null;\n\n    /**\n     * How wide is a default column for a given default font and size?\n     * Empirical data found by inspecting real Excel files and reading off the pixel width\n     * in Microsoft Office Excel 2007.\n     *\n     * @var array\n     */\n    public static $defaultColumnWidths = array(\n        'Arial' => array(\n             1 => array('px' => 24, 'width' => 12.00000000),\n             2 => array('px' => 24, 'width' => 12.00000000),\n             3 => array('px' => 32, 'width' => 10.66406250),\n             4 => array('px' => 32, 'width' => 10.66406250),\n             5 => array('px' => 40, 'width' => 10.00000000),\n             6 => array('px' => 48, 'width' =>  9.59765625),\n             7 => array('px' => 48, 'width' =>  9.59765625),\n             8 => array('px' => 56, 'width' =>  9.33203125),\n             9 => array('px' => 64, 'width' =>  9.14062500),\n            10 => array('px' => 64, 'width' =>  9.14062500),\n        ),\n        'Calibri' => array(\n             1 => array('px' => 24, 'width' => 12.00000000),\n             2 => array('px' => 24, 'width' => 12.00000000),\n             3 => array('px' => 32, 'width' => 10.66406250),\n             4 => array('px' => 32, 'width' => 10.66406250),\n             5 => array('px' => 40, 'width' => 10.00000000),\n             6 => array('px' => 48, 'width' =>  9.59765625),\n             7 => array('px' => 48, 'width' =>  9.59765625),\n             8 => array('px' => 56, 'width' =>  9.33203125),\n             9 => array('px' => 56, 'width' =>  9.33203125),\n            10 => array('px' => 64, 'width' =>  9.14062500),\n            11 => array('px' => 64, 'width' =>  9.14062500),\n        ),\n        'Verdana' => array(\n             1 => array('px' => 24, 'width' => 12.00000000),\n             2 => array('px' => 24, 'width' => 12.00000000),\n             3 => array('px' => 32, 'width' => 10.66406250),\n             4 => array('px' => 32, 'width' => 10.66406250),\n             5 => array('px' => 40, 'width' => 10.00000000),\n             6 => array('px' => 48, 'width' =>  9.59765625),\n             7 => array('px' => 48, 'width' =>  9.59765625),\n             8 => array('px' => 64, 'width' =>  9.14062500),\n             9 => array('px' => 72, 'width' =>  9.00000000),\n            10 => array('px' => 72, 'width' =>  9.00000000),\n        ),\n    );\n\n    /**\n     * Set autoSize method\n     *\n     * @param string $pValue\n     * @return     boolean                    Success or failure\n     */\n    public static function setAutoSizeMethod($pValue = self::AUTOSIZE_METHOD_APPROX)\n    {\n        if (!in_array($pValue, self::$autoSizeMethods)) {\n            return false;\n        }\n        self::$autoSizeMethod = $pValue;\n\n        return true;\n    }\n\n    /**\n     * Get autoSize method\n     *\n     * @return string\n     */\n    public static function getAutoSizeMethod()\n    {\n        return self::$autoSizeMethod;\n    }\n\n    /**\n     * Set the path to the folder containing .ttf files. There should be a trailing slash.\n     * Typical locations on variout some platforms:\n     *    <ul>\n     *        <li>C:/Windows/Fonts/</li>\n     *        <li>/usr/share/fonts/truetype/</li>\n     *        <li>~/.fonts/</li>\n     *    </ul>\n     *\n     * @param string $pValue\n     */\n    public static function setTrueTypeFontPath($pValue = '')\n    {\n        self::$trueTypeFontPath = $pValue;\n    }\n\n    /**\n     * Get the path to the folder containing .ttf files.\n     *\n     * @return string\n     */\n    public static function getTrueTypeFontPath()\n    {\n        return self::$trueTypeFontPath;\n    }\n\n    /**\n     * Calculate an (approximate) OpenXML column width, based on font size and text contained\n     *\n     * @param     PHPExcel_Style_Font            $font            Font object\n     * @param     PHPExcel_RichText|string    $cellText        Text to calculate width\n     * @param     integer                        $rotation        Rotation angle\n     * @param     PHPExcel_Style_Font|NULL    $defaultFont    Font object\n     * @return     integer        Column width\n     */\n    public static function calculateColumnWidth(PHPExcel_Style_Font $font, $cellText = '', $rotation = 0, PHPExcel_Style_Font $defaultFont = null)\n    {\n        // If it is rich text, use plain text\n        if ($cellText instanceof PHPExcel_RichText) {\n            $cellText = $cellText->getPlainText();\n        }\n\n        // Special case if there are one or more newline characters (\"\\n\")\n        if (strpos($cellText, \"\\n\") !== false) {\n            $lineTexts = explode(\"\\n\", $cellText);\n            $lineWidths = array();\n            foreach ($lineTexts as $lineText) {\n                $lineWidths[] = self::calculateColumnWidth($font, $lineText, $rotation = 0, $defaultFont);\n            }\n            return max($lineWidths); // width of longest line in cell\n        }\n\n        // Try to get the exact text width in pixels\n        $approximate = self::$autoSizeMethod == self::AUTOSIZE_METHOD_APPROX;\n        if (!$approximate) {\n            $columnWidthAdjust = ceil(self::getTextWidthPixelsExact('n', $font, 0) * 1.07);\n            try {\n                // Width of text in pixels excl. padding\n                // and addition because Excel adds some padding, just use approx width of 'n' glyph\n                $columnWidth = self::getTextWidthPixelsExact($cellText, $font, $rotation) + $columnWidthAdjust;\n            } catch (PHPExcel_Exception $e) {\n                $approximate = true;\n            }\n        }\n\n        if ($approximate) {\n            $columnWidthAdjust = self::getTextWidthPixelsApprox('n', $font, 0);\n            // Width of text in pixels excl. padding, approximation\n            // and addition because Excel adds some padding, just use approx width of 'n' glyph\n            $columnWidth = self::getTextWidthPixelsApprox($cellText, $font, $rotation) + $columnWidthAdjust;\n        }\n\n        // Convert from pixel width to column width\n        $columnWidth = PHPExcel_Shared_Drawing::pixelsToCellDimension($columnWidth, $defaultFont);\n\n        // Return\n        return round($columnWidth, 6);\n    }\n\n    /**\n     * Get GD text width in pixels for a string of text in a certain font at a certain rotation angle\n     *\n     * @param string $text\n     * @param PHPExcel_Style_Font\n     * @param int $rotation\n     * @return int\n     * @throws PHPExcel_Exception\n     */\n    public static function getTextWidthPixelsExact($text, PHPExcel_Style_Font $font, $rotation = 0)\n    {\n        if (!function_exists('imagettfbbox')) {\n            throw new PHPExcel_Exception('GD library needs to be enabled');\n        }\n\n        // font size should really be supplied in pixels in GD2,\n        // but since GD2 seems to assume 72dpi, pixels and points are the same\n        $fontFile = self::getTrueTypeFontFileFromFont($font);\n        $textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text);\n\n        // Get corners positions\n        $lowerLeftCornerX  = $textBox[0];\n//        $lowerLeftCornerY  = $textBox[1];\n        $lowerRightCornerX = $textBox[2];\n//        $lowerRightCornerY = $textBox[3];\n        $upperRightCornerX = $textBox[4];\n//        $upperRightCornerY = $textBox[5];\n        $upperLeftCornerX  = $textBox[6];\n//        $upperLeftCornerY  = $textBox[7];\n\n        // Consider the rotation when calculating the width\n        $textWidth = max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX);\n\n        return $textWidth;\n    }\n\n    /**\n     * Get approximate width in pixels for a string of text in a certain font at a certain rotation angle\n     *\n     * @param string $columnText\n     * @param PHPExcel_Style_Font $font\n     * @param int $rotation\n     * @return int Text width in pixels (no padding added)\n     */\n    public static function getTextWidthPixelsApprox($columnText, PHPExcel_Style_Font $font = null, $rotation = 0)\n    {\n        $fontName = $font->getName();\n        $fontSize = $font->getSize();\n\n        // Calculate column width in pixels. We assume fixed glyph width. Result varies with font name and size.\n        switch ($fontName) {\n            case 'Calibri':\n                // value 8.26 was found via interpolation by inspecting real Excel files with Calibri 11 font.\n                $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText));\n                $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size\n                break;\n\n            case 'Arial':\n                // value 7 was found via interpolation by inspecting real Excel files with Arial 10 font.\n//                $columnWidth = (int) (7 * PHPExcel_Shared_String::CountCharacters($columnText));\n                // value 8 was set because of experience in different exports at Arial 10 font.\n                $columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText));\n                $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size\n                break;\n\n            case 'Verdana':\n                // value 8 was found via interpolation by inspecting real Excel files with Verdana 10 font.\n                $columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText));\n                $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size\n                break;\n\n            default:\n                // just assume Calibri\n                $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText));\n                $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size\n                break;\n        }\n\n        // Calculate approximate rotated column width\n        if ($rotation !== 0) {\n            if ($rotation == -165) {\n                // stacked text\n                $columnWidth = 4; // approximation\n            } else {\n                // rotated text\n                $columnWidth = $columnWidth * cos(deg2rad($rotation))\n                                + $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation\n            }\n        }\n\n        // pixel width is an integer\n        return (int) $columnWidth;\n    }\n\n    /**\n     * Calculate an (approximate) pixel size, based on a font points size\n     *\n     * @param     int        $fontSizeInPoints    Font size (in points)\n     * @return     int        Font size (in pixels)\n     */\n    public static function fontSizeToPixels($fontSizeInPoints = 11)\n    {\n        return (int) ((4 / 3) * $fontSizeInPoints);\n    }\n\n    /**\n     * Calculate an (approximate) pixel size, based on inch size\n     *\n     * @param     int        $sizeInInch    Font size (in inch)\n     * @return     int        Size (in pixels)\n     */\n    public static function inchSizeToPixels($sizeInInch = 1)\n    {\n        return ($sizeInInch * 96);\n    }\n\n    /**\n     * Calculate an (approximate) pixel size, based on centimeter size\n     *\n     * @param     int        $sizeInCm    Font size (in centimeters)\n     * @return     int        Size (in pixels)\n     */\n    public static function centimeterSizeToPixels($sizeInCm = 1)\n    {\n        return ($sizeInCm * 37.795275591);\n    }\n\n    /**\n     * Returns the font path given the font\n     *\n     * @param PHPExcel_Style_Font\n     * @return string Path to TrueType font file\n     */\n    public static function getTrueTypeFontFileFromFont($font)\n    {\n        if (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath)) {\n            throw new PHPExcel_Exception('Valid directory to TrueType Font files not specified');\n        }\n\n        $name        = $font->getName();\n        $bold        = $font->getBold();\n        $italic      = $font->getItalic();\n\n        // Check if we can map font to true type font file\n        switch ($name) {\n            case 'Arial':\n                $fontFile = (\n                    $bold ? ($italic ? self::ARIAL_BOLD_ITALIC : self::ARIAL_BOLD)\n                          : ($italic ? self::ARIAL_ITALIC : self::ARIAL)\n                );\n                break;\n            case 'Calibri':\n                $fontFile = (\n                    $bold ? ($italic ? self::CALIBRI_BOLD_ITALIC : self::CALIBRI_BOLD)\n                          : ($italic ? self::CALIBRI_ITALIC : self::CALIBRI)\n                );\n                break;\n            case 'Courier New':\n                $fontFile = (\n                    $bold ? ($italic ? self::COURIER_NEW_BOLD_ITALIC : self::COURIER_NEW_BOLD)\n                          : ($italic ? self::COURIER_NEW_ITALIC : self::COURIER_NEW)\n                );\n                break;\n            case 'Comic Sans MS':\n                $fontFile = (\n                    $bold ? self::COMIC_SANS_MS_BOLD : self::COMIC_SANS_MS\n                );\n                break;\n            case 'Georgia':\n                $fontFile = (\n                    $bold ? ($italic ? self::GEORGIA_BOLD_ITALIC : self::GEORGIA_BOLD)\n                          : ($italic ? self::GEORGIA_ITALIC : self::GEORGIA)\n                );\n                break;\n            case 'Impact':\n                $fontFile = self::IMPACT;\n                break;\n            case 'Liberation Sans':\n                $fontFile = (\n                    $bold ? ($italic ? self::LIBERATION_SANS_BOLD_ITALIC : self::LIBERATION_SANS_BOLD)\n                          : ($italic ? self::LIBERATION_SANS_ITALIC : self::LIBERATION_SANS)\n                );\n                break;\n            case 'Lucida Console':\n                $fontFile = self::LUCIDA_CONSOLE;\n                break;\n            case 'Lucida Sans Unicode':\n                $fontFile = self::LUCIDA_SANS_UNICODE;\n                break;\n            case 'Microsoft Sans Serif':\n                $fontFile = self::MICROSOFT_SANS_SERIF;\n                break;\n            case 'Palatino Linotype':\n                $fontFile = (\n                    $bold ? ($italic ? self::PALATINO_LINOTYPE_BOLD_ITALIC : self::PALATINO_LINOTYPE_BOLD)\n                          : ($italic ? self::PALATINO_LINOTYPE_ITALIC : self::PALATINO_LINOTYPE)\n                );\n                break;\n            case 'Symbol':\n                $fontFile = self::SYMBOL;\n                break;\n            case 'Tahoma':\n                $fontFile = (\n                    $bold ? self::TAHOMA_BOLD : self::TAHOMA\n                );\n                break;\n            case 'Times New Roman':\n                $fontFile = (\n                    $bold ? ($italic ? self::TIMES_NEW_ROMAN_BOLD_ITALIC : self::TIMES_NEW_ROMAN_BOLD)\n                          : ($italic ? self::TIMES_NEW_ROMAN_ITALIC : self::TIMES_NEW_ROMAN)\n                );\n                break;\n            case 'Trebuchet MS':\n                $fontFile = (\n                    $bold ? ($italic ? self::TREBUCHET_MS_BOLD_ITALIC : self::TREBUCHET_MS_BOLD)\n                          : ($italic ? self::TREBUCHET_MS_ITALIC : self::TREBUCHET_MS)\n                );\n                break;\n            case 'Verdana':\n                $fontFile = (\n                    $bold ? ($italic ? self::VERDANA_BOLD_ITALIC : self::VERDANA_BOLD)\n                          : ($italic ? self::VERDANA_ITALIC : self::VERDANA)\n                );\n                break;\n            default:\n                throw new PHPExcel_Exception('Unknown font name \"'. $name .'\". Cannot map to TrueType font file');\n                break;\n        }\n\n        $fontFile = self::$trueTypeFontPath . $fontFile;\n\n        // Check if file actually exists\n        if (!file_exists($fontFile)) {\n            throw new PHPExcel_Exception('TrueType Font file not found');\n        }\n\n        return $fontFile;\n    }\n\n    /**\n     * Returns the associated charset for the font name.\n     *\n     * @param string $name Font name\n     * @return int Character set code\n     */\n    public static function getCharsetFromFontName($name)\n    {\n        switch ($name) {\n            // Add more cases. Check FONT records in real Excel files.\n            case 'EucrosiaUPC':\n                return self::CHARSET_ANSI_THAI;\n            case 'Wingdings':\n                return self::CHARSET_SYMBOL;\n            case 'Wingdings 2':\n                return self::CHARSET_SYMBOL;\n            case 'Wingdings 3':\n                return self::CHARSET_SYMBOL;\n            default:\n                return self::CHARSET_ANSI_LATIN;\n        }\n    }\n\n    /**\n     * Get the effective column width for columns without a column dimension or column with width -1\n     * For example, for Calibri 11 this is 9.140625 (64 px)\n     *\n     * @param PHPExcel_Style_Font $font The workbooks default font\n     * @param boolean $pPixels true = return column width in pixels, false = return in OOXML units\n     * @return mixed Column width\n     */\n    public static function getDefaultColumnWidthByFont(PHPExcel_Style_Font $font, $pPixels = false)\n    {\n        if (isset(self::$defaultColumnWidths[$font->getName()][$font->getSize()])) {\n            // Exact width can be determined\n            $columnWidth = $pPixels ?\n                self::$defaultColumnWidths[$font->getName()][$font->getSize()]['px']\n                    : self::$defaultColumnWidths[$font->getName()][$font->getSize()]['width'];\n\n        } else {\n            // We don't have data for this particular font and size, use approximation by\n            // extrapolating from Calibri 11\n            $columnWidth = $pPixels ?\n                self::$defaultColumnWidths['Calibri'][11]['px']\n                    : self::$defaultColumnWidths['Calibri'][11]['width'];\n            $columnWidth = $columnWidth * $font->getSize() / 11;\n\n            // Round pixels to closest integer\n            if ($pPixels) {\n                $columnWidth = (int) round($columnWidth);\n            }\n        }\n\n        return $columnWidth;\n    }\n\n    /**\n     * Get the effective row height for rows without a row dimension or rows with height -1\n     * For example, for Calibri 11 this is 15 points\n     *\n     * @param PHPExcel_Style_Font $font The workbooks default font\n     * @return float Row height in points\n     */\n    public static function getDefaultRowHeightByFont(PHPExcel_Style_Font $font)\n    {\n        switch ($font->getName()) {\n            case 'Arial':\n                switch ($font->getSize()) {\n                    case 10:\n                        // inspection of Arial 10 workbook says 12.75pt ~17px\n                        $rowHeight = 12.75;\n                        break;\n                    case 9:\n                        // inspection of Arial 9 workbook says 12.00pt ~16px\n                        $rowHeight = 12;\n                        break;\n                    case 8:\n                        // inspection of Arial 8 workbook says 11.25pt ~15px\n                        $rowHeight = 11.25;\n                        break;\n                    case 7:\n                        // inspection of Arial 7 workbook says 9.00pt ~12px\n                        $rowHeight = 9;\n                        break;\n                    case 6:\n                    case 5:\n                        // inspection of Arial 5,6 workbook says 8.25pt ~11px\n                        $rowHeight = 8.25;\n                        break;\n                    case 4:\n                        // inspection of Arial 4 workbook says 6.75pt ~9px\n                        $rowHeight = 6.75;\n                        break;\n                    case 3:\n                        // inspection of Arial 3 workbook says 6.00pt ~8px\n                        $rowHeight = 6;\n                        break;\n                    case 2:\n                    case 1:\n                        // inspection of Arial 1,2 workbook says 5.25pt ~7px\n                        $rowHeight = 5.25;\n                        break;\n                    default:\n                        // use Arial 10 workbook as an approximation, extrapolation\n                        $rowHeight = 12.75 * $font->getSize() / 10;\n                        break;\n                }\n                break;\n\n            case 'Calibri':\n                switch ($font->getSize()) {\n                    case 11:\n                        // inspection of Calibri 11 workbook says 15.00pt ~20px\n                        $rowHeight = 15;\n                        break;\n                    case 10:\n                        // inspection of Calibri 10 workbook says 12.75pt ~17px\n                        $rowHeight = 12.75;\n                        break;\n                    case 9:\n                        // inspection of Calibri 9 workbook says 12.00pt ~16px\n                        $rowHeight = 12;\n                        break;\n                    case 8:\n                        // inspection of Calibri 8 workbook says 11.25pt ~15px\n                        $rowHeight = 11.25;\n                        break;\n                    case 7:\n                        // inspection of Calibri 7 workbook says 9.00pt ~12px\n                        $rowHeight = 9;\n                        break;\n                    case 6:\n                    case 5:\n                        // inspection of Calibri 5,6 workbook says 8.25pt ~11px\n                        $rowHeight = 8.25;\n                        break;\n                    case 4:\n                        // inspection of Calibri 4 workbook says 6.75pt ~9px\n                        $rowHeight = 6.75;\n                        break;\n                    case 3:\n                        // inspection of Calibri 3 workbook says 6.00pt ~8px\n                        $rowHeight = 6.00;\n                        break;\n                    case 2:\n                    case 1:\n                        // inspection of Calibri 1,2 workbook says 5.25pt ~7px\n                        $rowHeight = 5.25;\n                        break;\n                    default:\n                        // use Calibri 11 workbook as an approximation, extrapolation\n                        $rowHeight = 15 * $font->getSize() / 11;\n                        break;\n                }\n                break;\n\n            case 'Verdana':\n                switch ($font->getSize()) {\n                    case 10:\n                        // inspection of Verdana 10 workbook says 12.75pt ~17px\n                        $rowHeight = 12.75;\n                        break;\n                    case 9:\n                        // inspection of Verdana 9 workbook says 11.25pt ~15px\n                        $rowHeight = 11.25;\n                        break;\n                    case 8:\n                        // inspection of Verdana 8 workbook says 10.50pt ~14px\n                        $rowHeight = 10.50;\n                        break;\n                    case 7:\n                        // inspection of Verdana 7 workbook says 9.00pt ~12px\n                        $rowHeight = 9.00;\n                        break;\n                    case 6:\n                    case 5:\n                        // inspection of Verdana 5,6 workbook says 8.25pt ~11px\n                        $rowHeight = 8.25;\n                        break;\n                    case 4:\n                        // inspection of Verdana 4 workbook says 6.75pt ~9px\n                        $rowHeight = 6.75;\n                        break;\n                    case 3:\n                        // inspection of Verdana 3 workbook says 6.00pt ~8px\n                        $rowHeight = 6;\n                        break;\n                    case 2:\n                    case 1:\n                        // inspection of Verdana 1,2 workbook says 5.25pt ~7px\n                        $rowHeight = 5.25;\n                        break;\n                    default:\n                        // use Verdana 10 workbook as an approximation, extrapolation\n                        $rowHeight = 12.75 * $font->getSize() / 10;\n                        break;\n                }\n                break;\n            default:\n                // just use Calibri as an approximation\n                $rowHeight = 15 * $font->getSize() / 11;\n                break;\n        }\n\n        return $rowHeight;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/CHANGELOG.TXT",
    "content": "Mar 1, 2005 11:15 AST by PM\n\n+ For consistency, renamed Math.php to Maths.java, utils to util, \n  tests to test, docs to doc - \n\n+ Removed conditional logic from top of Matrix class.\n\n+ Switched to using hypo function in Maths.php for all php-hypot calls.\n  NOTE TO SELF: Need to make sure that all decompositions have been \n  switched over to using the bundled hypo.\n\nFeb 25, 2005 at 10:00 AST by PM\n\n+ Recommend using simpler Error.php instead of JAMA_Error.php but \n  can be persuaded otherwise.\n\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/CholeskyDecomposition.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    Cholesky decomposition class\n *\n *    For a symmetric, positive definite matrix A, the Cholesky decomposition\n *    is an lower triangular matrix L so that A = L*L'.\n *\n *    If the matrix is not symmetric or positive definite, the constructor\n *    returns a partial decomposition and sets an internal flag that may\n *    be queried by the isSPD() method.\n *\n *    @author Paul Meagher\n *    @author Michael Bommarito\n *    @version 1.2\n */\nclass CholeskyDecomposition\n{\n    /**\n     *    Decomposition storage\n     *    @var array\n     *    @access private\n     */\n    private $L = array();\n\n    /**\n     *    Matrix row and column dimension\n     *    @var int\n     *    @access private\n     */\n    private $m;\n\n    /**\n     *    Symmetric positive definite flag\n     *    @var boolean\n     *    @access private\n     */\n    private $isspd = true;\n\n    /**\n     *    CholeskyDecomposition\n     *\n     *    Class constructor - decomposes symmetric positive definite matrix\n     *    @param mixed Matrix square symmetric positive definite matrix\n     */\n    public function __construct($A = null)\n    {\n        if ($A instanceof Matrix) {\n            $this->L = $A->getArray();\n            $this->m = $A->getRowDimension();\n\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = $i; $j < $this->m; ++$j) {\n                    for ($sum = $this->L[$i][$j], $k = $i - 1; $k >= 0; --$k) {\n                        $sum -= $this->L[$i][$k] * $this->L[$j][$k];\n                    }\n                    if ($i == $j) {\n                        if ($sum >= 0) {\n                            $this->L[$i][$i] = sqrt($sum);\n                        } else {\n                            $this->isspd = false;\n                        }\n                    } else {\n                        if ($this->L[$i][$i] != 0) {\n                            $this->L[$j][$i] = $sum / $this->L[$i][$i];\n                        }\n                    }\n                }\n\n                for ($k = $i+1; $k < $this->m; ++$k) {\n                    $this->L[$i][$k] = 0.0;\n                }\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(JAMAError(ARGUMENT_TYPE_EXCEPTION));\n        }\n    }    //    function __construct()\n\n    /**\n     *    Is the matrix symmetric and positive definite?\n     *\n     *    @return boolean\n     */\n    public function isSPD()\n    {\n        return $this->isspd;\n    }    //    function isSPD()\n\n    /**\n     *    getL\n     *\n     *    Return triangular factor.\n     *    @return Matrix Lower triangular matrix\n     */\n    public function getL()\n    {\n        return new Matrix($this->L);\n    }    //    function getL()\n\n    /**\n     *    Solve A*X = B\n     *\n     *    @param $B Row-equal matrix\n     *    @return Matrix L * L' * X = B\n     */\n    public function solve($B = null)\n    {\n        if ($B instanceof Matrix) {\n            if ($B->getRowDimension() == $this->m) {\n                if ($this->isspd) {\n                    $X  = $B->getArrayCopy();\n                    $nx = $B->getColumnDimension();\n\n                    for ($k = 0; $k < $this->m; ++$k) {\n                        for ($i = $k + 1; $i < $this->m; ++$i) {\n                            for ($j = 0; $j < $nx; ++$j) {\n                                $X[$i][$j] -= $X[$k][$j] * $this->L[$i][$k];\n                            }\n                        }\n                        for ($j = 0; $j < $nx; ++$j) {\n                            $X[$k][$j] /= $this->L[$k][$k];\n                        }\n                    }\n\n                    for ($k = $this->m - 1; $k >= 0; --$k) {\n                        for ($j = 0; $j < $nx; ++$j) {\n                            $X[$k][$j] /= $this->L[$k][$k];\n                        }\n                        for ($i = 0; $i < $k; ++$i) {\n                            for ($j = 0; $j < $nx; ++$j) {\n                                $X[$i][$j] -= $X[$k][$j] * $this->L[$k][$i];\n                            }\n                        }\n                    }\n\n                    return new Matrix($X, $this->m, $nx);\n                } else {\n                    throw new PHPExcel_Calculation_Exception(JAMAError(MatrixSPDException));\n                }\n            } else {\n                throw new PHPExcel_Calculation_Exception(JAMAError(MATRIX_DIMENSION_EXCEPTION));\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(JAMAError(ARGUMENT_TYPE_EXCEPTION));\n        }\n    }    //    function solve()\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    Class to obtain eigenvalues and eigenvectors of a real matrix.\n *\n *    If A is symmetric, then A = V*D*V' where the eigenvalue matrix D\n *    is diagonal and the eigenvector matrix V is orthogonal (i.e.\n *    A = V.times(D.times(V.transpose())) and V.times(V.transpose())\n *    equals the identity matrix).\n *\n *    If A is not symmetric, then the eigenvalue matrix D is block diagonal\n *    with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues,\n *    lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda].  The\n *    columns of V represent the eigenvectors in the sense that A*V = V*D,\n *    i.e. A.times(V) equals V.times(D).  The matrix V may be badly\n *    conditioned, or even singular, so the validity of the equation\n *    A = V*D*inverse(V) depends upon V.cond().\n *\n *    @author  Paul Meagher\n *    @license PHP v3.0\n *    @version 1.1\n */\nclass EigenvalueDecomposition\n{\n    /**\n     *    Row and column dimension (square matrix).\n     *    @var int\n     */\n    private $n;\n\n    /**\n     *    Internal symmetry flag.\n     *    @var int\n     */\n    private $issymmetric;\n\n    /**\n     *    Arrays for internal storage of eigenvalues.\n     *    @var array\n     */\n    private $d = array();\n    private $e = array();\n\n    /**\n     *    Array for internal storage of eigenvectors.\n     *    @var array\n     */\n    private $V = array();\n\n    /**\n    *    Array for internal storage of nonsymmetric Hessenberg form.\n    *    @var array\n    */\n    private $H = array();\n\n    /**\n    *    Working storage for nonsymmetric algorithm.\n    *    @var array\n    */\n    private $ort;\n\n    /**\n    *    Used for complex scalar division.\n    *    @var float\n    */\n    private $cdivr;\n    private $cdivi;\n\n    /**\n     *    Symmetric Householder reduction to tridiagonal form.\n     *\n     *    @access private\n     */\n    private function tred2()\n    {\n        //  This is derived from the Algol procedures tred2 by\n        //  Bowdler, Martin, Reinsch, and Wilkinson, Handbook for\n        //  Auto. Comp., Vol.ii-Linear Algebra, and the corresponding\n        //  Fortran subroutine in EISPACK.\n        $this->d = $this->V[$this->n-1];\n        // Householder reduction to tridiagonal form.\n        for ($i = $this->n-1; $i > 0; --$i) {\n            $i_ = $i -1;\n            // Scale to avoid under/overflow.\n            $h = $scale = 0.0;\n            $scale += array_sum(array_map(abs, $this->d));\n            if ($scale == 0.0) {\n                $this->e[$i] = $this->d[$i_];\n                $this->d = array_slice($this->V[$i_], 0, $i_);\n                for ($j = 0; $j < $i; ++$j) {\n                    $this->V[$j][$i] = $this->V[$i][$j] = 0.0;\n                }\n            } else {\n                // Generate Householder vector.\n                for ($k = 0; $k < $i; ++$k) {\n                    $this->d[$k] /= $scale;\n                    $h += pow($this->d[$k], 2);\n                }\n                $f = $this->d[$i_];\n                $g = sqrt($h);\n                if ($f > 0) {\n                    $g = -$g;\n                }\n                $this->e[$i] = $scale * $g;\n                $h = $h - $f * $g;\n                $this->d[$i_] = $f - $g;\n                for ($j = 0; $j < $i; ++$j) {\n                    $this->e[$j] = 0.0;\n                }\n                // Apply similarity transformation to remaining columns.\n                for ($j = 0; $j < $i; ++$j) {\n                    $f = $this->d[$j];\n                    $this->V[$j][$i] = $f;\n                    $g = $this->e[$j] + $this->V[$j][$j] * $f;\n                    for ($k = $j+1; $k <= $i_; ++$k) {\n                        $g += $this->V[$k][$j] * $this->d[$k];\n                        $this->e[$k] += $this->V[$k][$j] * $f;\n                    }\n                    $this->e[$j] = $g;\n                }\n                $f = 0.0;\n                for ($j = 0; $j < $i; ++$j) {\n                    $this->e[$j] /= $h;\n                    $f += $this->e[$j] * $this->d[$j];\n                }\n                $hh = $f / (2 * $h);\n                for ($j=0; $j < $i; ++$j) {\n                    $this->e[$j] -= $hh * $this->d[$j];\n                }\n                for ($j = 0; $j < $i; ++$j) {\n                    $f = $this->d[$j];\n                    $g = $this->e[$j];\n                    for ($k = $j; $k <= $i_; ++$k) {\n                        $this->V[$k][$j] -= ($f * $this->e[$k] + $g * $this->d[$k]);\n                    }\n                    $this->d[$j] = $this->V[$i-1][$j];\n                    $this->V[$i][$j] = 0.0;\n                }\n            }\n            $this->d[$i] = $h;\n        }\n\n        // Accumulate transformations.\n        for ($i = 0; $i < $this->n-1; ++$i) {\n            $this->V[$this->n-1][$i] = $this->V[$i][$i];\n            $this->V[$i][$i] = 1.0;\n            $h = $this->d[$i+1];\n            if ($h != 0.0) {\n                for ($k = 0; $k <= $i; ++$k) {\n                    $this->d[$k] = $this->V[$k][$i+1] / $h;\n                }\n                for ($j = 0; $j <= $i; ++$j) {\n                    $g = 0.0;\n                    for ($k = 0; $k <= $i; ++$k) {\n                        $g += $this->V[$k][$i+1] * $this->V[$k][$j];\n                    }\n                    for ($k = 0; $k <= $i; ++$k) {\n                        $this->V[$k][$j] -= $g * $this->d[$k];\n                    }\n                }\n            }\n            for ($k = 0; $k <= $i; ++$k) {\n                $this->V[$k][$i+1] = 0.0;\n            }\n        }\n\n        $this->d = $this->V[$this->n-1];\n        $this->V[$this->n-1] = array_fill(0, $j, 0.0);\n        $this->V[$this->n-1][$this->n-1] = 1.0;\n        $this->e[0] = 0.0;\n    }\n\n    /**\n     *    Symmetric tridiagonal QL algorithm.\n     *\n     *    This is derived from the Algol procedures tql2, by\n     *    Bowdler, Martin, Reinsch, and Wilkinson, Handbook for\n     *    Auto. Comp., Vol.ii-Linear Algebra, and the corresponding\n     *    Fortran subroutine in EISPACK.\n     *\n     *    @access private\n     */\n    private function tql2()\n    {\n        for ($i = 1; $i < $this->n; ++$i) {\n            $this->e[$i-1] = $this->e[$i];\n        }\n        $this->e[$this->n-1] = 0.0;\n        $f = 0.0;\n        $tst1 = 0.0;\n        $eps  = pow(2.0, -52.0);\n\n        for ($l = 0; $l < $this->n; ++$l) {\n            // Find small subdiagonal element\n            $tst1 = max($tst1, abs($this->d[$l]) + abs($this->e[$l]));\n            $m = $l;\n            while ($m < $this->n) {\n                if (abs($this->e[$m]) <= $eps * $tst1) {\n                    break;\n                }\n                ++$m;\n            }\n            // If m == l, $this->d[l] is an eigenvalue,\n            // otherwise, iterate.\n            if ($m > $l) {\n                $iter = 0;\n                do {\n                    // Could check iteration count here.\n                    $iter += 1;\n                    // Compute implicit shift\n                    $g = $this->d[$l];\n                    $p = ($this->d[$l+1] - $g) / (2.0 * $this->e[$l]);\n                    $r = hypo($p, 1.0);\n                    if ($p < 0) {\n                        $r *= -1;\n                    }\n                    $this->d[$l] = $this->e[$l] / ($p + $r);\n                    $this->d[$l+1] = $this->e[$l] * ($p + $r);\n                    $dl1 = $this->d[$l+1];\n                    $h = $g - $this->d[$l];\n                    for ($i = $l + 2; $i < $this->n; ++$i) {\n                        $this->d[$i] -= $h;\n                    }\n                    $f += $h;\n                    // Implicit QL transformation.\n                    $p = $this->d[$m];\n                    $c = 1.0;\n                    $c2 = $c3 = $c;\n                    $el1 = $this->e[$l + 1];\n                    $s = $s2 = 0.0;\n                    for ($i = $m-1; $i >= $l; --$i) {\n                        $c3 = $c2;\n                        $c2 = $c;\n                        $s2 = $s;\n                        $g  = $c * $this->e[$i];\n                        $h  = $c * $p;\n                        $r  = hypo($p, $this->e[$i]);\n                        $this->e[$i+1] = $s * $r;\n                        $s = $this->e[$i] / $r;\n                        $c = $p / $r;\n                        $p = $c * $this->d[$i] - $s * $g;\n                        $this->d[$i+1] = $h + $s * ($c * $g + $s * $this->d[$i]);\n                        // Accumulate transformation.\n                        for ($k = 0; $k < $this->n; ++$k) {\n                            $h = $this->V[$k][$i+1];\n                            $this->V[$k][$i+1] = $s * $this->V[$k][$i] + $c * $h;\n                            $this->V[$k][$i] = $c * $this->V[$k][$i] - $s * $h;\n                        }\n                    }\n                    $p = -$s * $s2 * $c3 * $el1 * $this->e[$l] / $dl1;\n                    $this->e[$l] = $s * $p;\n                    $this->d[$l] = $c * $p;\n                // Check for convergence.\n                } while (abs($this->e[$l]) > $eps * $tst1);\n            }\n            $this->d[$l] = $this->d[$l] + $f;\n            $this->e[$l] = 0.0;\n        }\n\n        // Sort eigenvalues and corresponding vectors.\n        for ($i = 0; $i < $this->n - 1; ++$i) {\n            $k = $i;\n            $p = $this->d[$i];\n            for ($j = $i+1; $j < $this->n; ++$j) {\n                if ($this->d[$j] < $p) {\n                    $k = $j;\n                    $p = $this->d[$j];\n                }\n            }\n            if ($k != $i) {\n                $this->d[$k] = $this->d[$i];\n                $this->d[$i] = $p;\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $p = $this->V[$j][$i];\n                    $this->V[$j][$i] = $this->V[$j][$k];\n                    $this->V[$j][$k] = $p;\n                }\n            }\n        }\n    }\n\n    /**\n     *    Nonsymmetric reduction to Hessenberg form.\n     *\n     *    This is derived from the Algol procedures orthes and ortran,\n     *    by Martin and Wilkinson, Handbook for Auto. Comp.,\n     *    Vol.ii-Linear Algebra, and the corresponding\n     *    Fortran subroutines in EISPACK.\n     *\n     *    @access private\n     */\n    private function orthes()\n    {\n        $low  = 0;\n        $high = $this->n-1;\n\n        for ($m = $low+1; $m <= $high-1; ++$m) {\n            // Scale column.\n            $scale = 0.0;\n            for ($i = $m; $i <= $high; ++$i) {\n                $scale = $scale + abs($this->H[$i][$m-1]);\n            }\n            if ($scale != 0.0) {\n                // Compute Householder transformation.\n                $h = 0.0;\n                for ($i = $high; $i >= $m; --$i) {\n                    $this->ort[$i] = $this->H[$i][$m-1] / $scale;\n                    $h += $this->ort[$i] * $this->ort[$i];\n                }\n                $g = sqrt($h);\n                if ($this->ort[$m] > 0) {\n                    $g *= -1;\n                }\n                $h -= $this->ort[$m] * $g;\n                $this->ort[$m] -= $g;\n                // Apply Householder similarity transformation\n                // H = (I -u * u' / h) * H * (I -u * u') / h)\n                for ($j = $m; $j < $this->n; ++$j) {\n                    $f = 0.0;\n                    for ($i = $high; $i >= $m; --$i) {\n                        $f += $this->ort[$i] * $this->H[$i][$j];\n                    }\n                    $f /= $h;\n                    for ($i = $m; $i <= $high; ++$i) {\n                        $this->H[$i][$j] -= $f * $this->ort[$i];\n                    }\n                }\n                for ($i = 0; $i <= $high; ++$i) {\n                    $f = 0.0;\n                    for ($j = $high; $j >= $m; --$j) {\n                        $f += $this->ort[$j] * $this->H[$i][$j];\n                    }\n                    $f = $f / $h;\n                    for ($j = $m; $j <= $high; ++$j) {\n                        $this->H[$i][$j] -= $f * $this->ort[$j];\n                    }\n                }\n                $this->ort[$m] = $scale * $this->ort[$m];\n                $this->H[$m][$m-1] = $scale * $g;\n            }\n        }\n\n        // Accumulate transformations (Algol's ortran).\n        for ($i = 0; $i < $this->n; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                $this->V[$i][$j] = ($i == $j ? 1.0 : 0.0);\n            }\n        }\n        for ($m = $high-1; $m >= $low+1; --$m) {\n            if ($this->H[$m][$m-1] != 0.0) {\n                for ($i = $m+1; $i <= $high; ++$i) {\n                    $this->ort[$i] = $this->H[$i][$m-1];\n                }\n                for ($j = $m; $j <= $high; ++$j) {\n                    $g = 0.0;\n                    for ($i = $m; $i <= $high; ++$i) {\n                        $g += $this->ort[$i] * $this->V[$i][$j];\n                    }\n                    // Double division avoids possible underflow\n                    $g = ($g / $this->ort[$m]) / $this->H[$m][$m-1];\n                    for ($i = $m; $i <= $high; ++$i) {\n                        $this->V[$i][$j] += $g * $this->ort[$i];\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     *    Performs complex division.\n     *\n     *    @access private\n     */\n    private function cdiv($xr, $xi, $yr, $yi)\n    {\n        if (abs($yr) > abs($yi)) {\n            $r = $yi / $yr;\n            $d = $yr + $r * $yi;\n            $this->cdivr = ($xr + $r * $xi) / $d;\n            $this->cdivi = ($xi - $r * $xr) / $d;\n        } else {\n            $r = $yr / $yi;\n            $d = $yi + $r * $yr;\n            $this->cdivr = ($r * $xr + $xi) / $d;\n            $this->cdivi = ($r * $xi - $xr) / $d;\n        }\n    }\n\n    /**\n     *    Nonsymmetric reduction from Hessenberg to real Schur form.\n     *\n     *    Code is derived from the Algol procedure hqr2,\n     *    by Martin and Wilkinson, Handbook for Auto. Comp.,\n     *    Vol.ii-Linear Algebra, and the corresponding\n     *    Fortran subroutine in EISPACK.\n     *\n     *    @access private\n     */\n    private function hqr2()\n    {\n        //  Initialize\n        $nn = $this->n;\n        $n  = $nn - 1;\n        $low = 0;\n        $high = $nn - 1;\n        $eps = pow(2.0, -52.0);\n        $exshift = 0.0;\n        $p = $q = $r = $s = $z = 0;\n        // Store roots isolated by balanc and compute matrix norm\n        $norm = 0.0;\n\n        for ($i = 0; $i < $nn; ++$i) {\n            if (($i < $low) or ($i > $high)) {\n                $this->d[$i] = $this->H[$i][$i];\n                $this->e[$i] = 0.0;\n            }\n            for ($j = max($i-1, 0); $j < $nn; ++$j) {\n                $norm = $norm + abs($this->H[$i][$j]);\n            }\n        }\n\n        // Outer loop over eigenvalue index\n        $iter = 0;\n        while ($n >= $low) {\n            // Look for single small sub-diagonal element\n            $l = $n;\n            while ($l > $low) {\n                $s = abs($this->H[$l-1][$l-1]) + abs($this->H[$l][$l]);\n                if ($s == 0.0) {\n                    $s = $norm;\n                }\n                if (abs($this->H[$l][$l-1]) < $eps * $s) {\n                    break;\n                }\n                --$l;\n            }\n            // Check for convergence\n            // One root found\n            if ($l == $n) {\n                $this->H[$n][$n] = $this->H[$n][$n] + $exshift;\n                $this->d[$n] = $this->H[$n][$n];\n                $this->e[$n] = 0.0;\n                --$n;\n                $iter = 0;\n            // Two roots found\n            } elseif ($l == $n-1) {\n                $w = $this->H[$n][$n-1] * $this->H[$n-1][$n];\n                $p = ($this->H[$n-1][$n-1] - $this->H[$n][$n]) / 2.0;\n                $q = $p * $p + $w;\n                $z = sqrt(abs($q));\n                $this->H[$n][$n] = $this->H[$n][$n] + $exshift;\n                $this->H[$n-1][$n-1] = $this->H[$n-1][$n-1] + $exshift;\n                $x = $this->H[$n][$n];\n                // Real pair\n                if ($q >= 0) {\n                    if ($p >= 0) {\n                        $z = $p + $z;\n                    } else {\n                        $z = $p - $z;\n                    }\n                    $this->d[$n-1] = $x + $z;\n                    $this->d[$n] = $this->d[$n-1];\n                    if ($z != 0.0) {\n                        $this->d[$n] = $x - $w / $z;\n                    }\n                    $this->e[$n-1] = 0.0;\n                    $this->e[$n] = 0.0;\n                    $x = $this->H[$n][$n-1];\n                    $s = abs($x) + abs($z);\n                    $p = $x / $s;\n                    $q = $z / $s;\n                    $r = sqrt($p * $p + $q * $q);\n                    $p = $p / $r;\n                    $q = $q / $r;\n                    // Row modification\n                    for ($j = $n-1; $j < $nn; ++$j) {\n                        $z = $this->H[$n-1][$j];\n                        $this->H[$n-1][$j] = $q * $z + $p * $this->H[$n][$j];\n                        $this->H[$n][$j] = $q * $this->H[$n][$j] - $p * $z;\n                    }\n                    // Column modification\n                    for ($i = 0; $i <= $n; ++$i) {\n                        $z = $this->H[$i][$n-1];\n                        $this->H[$i][$n-1] = $q * $z + $p * $this->H[$i][$n];\n                        $this->H[$i][$n] = $q * $this->H[$i][$n] - $p * $z;\n                    }\n                    // Accumulate transformations\n                    for ($i = $low; $i <= $high; ++$i) {\n                        $z = $this->V[$i][$n-1];\n                        $this->V[$i][$n-1] = $q * $z + $p * $this->V[$i][$n];\n                        $this->V[$i][$n] = $q * $this->V[$i][$n] - $p * $z;\n                    }\n                // Complex pair\n                } else {\n                    $this->d[$n-1] = $x + $p;\n                    $this->d[$n] = $x + $p;\n                    $this->e[$n-1] = $z;\n                    $this->e[$n] = -$z;\n                }\n                $n = $n - 2;\n                $iter = 0;\n            // No convergence yet\n            } else {\n                // Form shift\n                $x = $this->H[$n][$n];\n                $y = 0.0;\n                $w = 0.0;\n                if ($l < $n) {\n                    $y = $this->H[$n-1][$n-1];\n                    $w = $this->H[$n][$n-1] * $this->H[$n-1][$n];\n                }\n                // Wilkinson's original ad hoc shift\n                if ($iter == 10) {\n                    $exshift += $x;\n                    for ($i = $low; $i <= $n; ++$i) {\n                        $this->H[$i][$i] -= $x;\n                    }\n                    $s = abs($this->H[$n][$n-1]) + abs($this->H[$n-1][$n-2]);\n                    $x = $y = 0.75 * $s;\n                    $w = -0.4375 * $s * $s;\n                }\n                // MATLAB's new ad hoc shift\n                if ($iter == 30) {\n                    $s = ($y - $x) / 2.0;\n                    $s = $s * $s + $w;\n                    if ($s > 0) {\n                        $s = sqrt($s);\n                        if ($y < $x) {\n                            $s = -$s;\n                        }\n                        $s = $x - $w / (($y - $x) / 2.0 + $s);\n                        for ($i = $low; $i <= $n; ++$i) {\n                            $this->H[$i][$i] -= $s;\n                        }\n                        $exshift += $s;\n                        $x = $y = $w = 0.964;\n                    }\n                }\n                // Could check iteration count here.\n                $iter = $iter + 1;\n                // Look for two consecutive small sub-diagonal elements\n                $m = $n - 2;\n                while ($m >= $l) {\n                    $z = $this->H[$m][$m];\n                    $r = $x - $z;\n                    $s = $y - $z;\n                    $p = ($r * $s - $w) / $this->H[$m+1][$m] + $this->H[$m][$m+1];\n                    $q = $this->H[$m+1][$m+1] - $z - $r - $s;\n                    $r = $this->H[$m+2][$m+1];\n                    $s = abs($p) + abs($q) + abs($r);\n                    $p = $p / $s;\n                    $q = $q / $s;\n                    $r = $r / $s;\n                    if ($m == $l) {\n                        break;\n                    }\n                    if (abs($this->H[$m][$m-1]) * (abs($q) + abs($r)) <\n                        $eps * (abs($p) * (abs($this->H[$m-1][$m-1]) + abs($z) + abs($this->H[$m+1][$m+1])))) {\n                        break;\n                    }\n                    --$m;\n                }\n                for ($i = $m + 2; $i <= $n; ++$i) {\n                    $this->H[$i][$i-2] = 0.0;\n                    if ($i > $m+2) {\n                        $this->H[$i][$i-3] = 0.0;\n                    }\n                }\n                // Double QR step involving rows l:n and columns m:n\n                for ($k = $m; $k <= $n-1; ++$k) {\n                    $notlast = ($k != $n-1);\n                    if ($k != $m) {\n                        $p = $this->H[$k][$k-1];\n                        $q = $this->H[$k+1][$k-1];\n                        $r = ($notlast ? $this->H[$k+2][$k-1] : 0.0);\n                        $x = abs($p) + abs($q) + abs($r);\n                        if ($x != 0.0) {\n                            $p = $p / $x;\n                            $q = $q / $x;\n                            $r = $r / $x;\n                        }\n                    }\n                    if ($x == 0.0) {\n                        break;\n                    }\n                    $s = sqrt($p * $p + $q * $q + $r * $r);\n                    if ($p < 0) {\n                        $s = -$s;\n                    }\n                    if ($s != 0) {\n                        if ($k != $m) {\n                            $this->H[$k][$k-1] = -$s * $x;\n                        } elseif ($l != $m) {\n                            $this->H[$k][$k-1] = -$this->H[$k][$k-1];\n                        }\n                        $p = $p + $s;\n                        $x = $p / $s;\n                        $y = $q / $s;\n                        $z = $r / $s;\n                        $q = $q / $p;\n                        $r = $r / $p;\n                        // Row modification\n                        for ($j = $k; $j < $nn; ++$j) {\n                            $p = $this->H[$k][$j] + $q * $this->H[$k+1][$j];\n                            if ($notlast) {\n                                $p = $p + $r * $this->H[$k+2][$j];\n                                $this->H[$k+2][$j] = $this->H[$k+2][$j] - $p * $z;\n                            }\n                            $this->H[$k][$j] = $this->H[$k][$j] - $p * $x;\n                            $this->H[$k+1][$j] = $this->H[$k+1][$j] - $p * $y;\n                        }\n                        // Column modification\n                        for ($i = 0; $i <= min($n, $k+3); ++$i) {\n                            $p = $x * $this->H[$i][$k] + $y * $this->H[$i][$k+1];\n                            if ($notlast) {\n                                $p = $p + $z * $this->H[$i][$k+2];\n                                $this->H[$i][$k+2] = $this->H[$i][$k+2] - $p * $r;\n                            }\n                            $this->H[$i][$k] = $this->H[$i][$k] - $p;\n                            $this->H[$i][$k+1] = $this->H[$i][$k+1] - $p * $q;\n                        }\n                        // Accumulate transformations\n                        for ($i = $low; $i <= $high; ++$i) {\n                            $p = $x * $this->V[$i][$k] + $y * $this->V[$i][$k+1];\n                            if ($notlast) {\n                                $p = $p + $z * $this->V[$i][$k+2];\n                                $this->V[$i][$k+2] = $this->V[$i][$k+2] - $p * $r;\n                            }\n                            $this->V[$i][$k] = $this->V[$i][$k] - $p;\n                            $this->V[$i][$k+1] = $this->V[$i][$k+1] - $p * $q;\n                        }\n                    }  // ($s != 0)\n                }  // k loop\n            }  // check convergence\n        }  // while ($n >= $low)\n\n        // Backsubstitute to find vectors of upper triangular form\n        if ($norm == 0.0) {\n            return;\n        }\n\n        for ($n = $nn-1; $n >= 0; --$n) {\n            $p = $this->d[$n];\n            $q = $this->e[$n];\n            // Real vector\n            if ($q == 0) {\n                $l = $n;\n                $this->H[$n][$n] = 1.0;\n                for ($i = $n-1; $i >= 0; --$i) {\n                    $w = $this->H[$i][$i] - $p;\n                    $r = 0.0;\n                    for ($j = $l; $j <= $n; ++$j) {\n                        $r = $r + $this->H[$i][$j] * $this->H[$j][$n];\n                    }\n                    if ($this->e[$i] < 0.0) {\n                        $z = $w;\n                        $s = $r;\n                    } else {\n                        $l = $i;\n                        if ($this->e[$i] == 0.0) {\n                            if ($w != 0.0) {\n                                $this->H[$i][$n] = -$r / $w;\n                            } else {\n                                $this->H[$i][$n] = -$r / ($eps * $norm);\n                            }\n                        // Solve real equations\n                        } else {\n                            $x = $this->H[$i][$i+1];\n                            $y = $this->H[$i+1][$i];\n                            $q = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i];\n                            $t = ($x * $s - $z * $r) / $q;\n                            $this->H[$i][$n] = $t;\n                            if (abs($x) > abs($z)) {\n                                $this->H[$i+1][$n] = (-$r - $w * $t) / $x;\n                            } else {\n                                $this->H[$i+1][$n] = (-$s - $y * $t) / $z;\n                            }\n                        }\n                        // Overflow control\n                        $t = abs($this->H[$i][$n]);\n                        if (($eps * $t) * $t > 1) {\n                            for ($j = $i; $j <= $n; ++$j) {\n                                $this->H[$j][$n] = $this->H[$j][$n] / $t;\n                            }\n                        }\n                    }\n                }\n            // Complex vector\n            } elseif ($q < 0) {\n                $l = $n-1;\n                // Last vector component imaginary so matrix is triangular\n                if (abs($this->H[$n][$n-1]) > abs($this->H[$n-1][$n])) {\n                    $this->H[$n-1][$n-1] = $q / $this->H[$n][$n-1];\n                    $this->H[$n-1][$n] = -($this->H[$n][$n] - $p) / $this->H[$n][$n-1];\n                } else {\n                    $this->cdiv(0.0, -$this->H[$n-1][$n], $this->H[$n-1][$n-1] - $p, $q);\n                    $this->H[$n-1][$n-1] = $this->cdivr;\n                    $this->H[$n-1][$n]   = $this->cdivi;\n                }\n                $this->H[$n][$n-1] = 0.0;\n                $this->H[$n][$n] = 1.0;\n                for ($i = $n-2; $i >= 0; --$i) {\n                    // double ra,sa,vr,vi;\n                    $ra = 0.0;\n                    $sa = 0.0;\n                    for ($j = $l; $j <= $n; ++$j) {\n                        $ra = $ra + $this->H[$i][$j] * $this->H[$j][$n-1];\n                        $sa = $sa + $this->H[$i][$j] * $this->H[$j][$n];\n                    }\n                    $w = $this->H[$i][$i] - $p;\n                    if ($this->e[$i] < 0.0) {\n                        $z = $w;\n                        $r = $ra;\n                        $s = $sa;\n                    } else {\n                        $l = $i;\n                        if ($this->e[$i] == 0) {\n                            $this->cdiv(-$ra, -$sa, $w, $q);\n                            $this->H[$i][$n-1] = $this->cdivr;\n                            $this->H[$i][$n]   = $this->cdivi;\n                        } else {\n                            // Solve complex equations\n                            $x = $this->H[$i][$i+1];\n                            $y = $this->H[$i+1][$i];\n                            $vr = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i] - $q * $q;\n                            $vi = ($this->d[$i] - $p) * 2.0 * $q;\n                            if ($vr == 0.0 & $vi == 0.0) {\n                                $vr = $eps * $norm * (abs($w) + abs($q) + abs($x) + abs($y) + abs($z));\n                            }\n                            $this->cdiv($x * $r - $z * $ra + $q * $sa, $x * $s - $z * $sa - $q * $ra, $vr, $vi);\n                            $this->H[$i][$n-1] = $this->cdivr;\n                            $this->H[$i][$n]   = $this->cdivi;\n                            if (abs($x) > (abs($z) + abs($q))) {\n                                $this->H[$i+1][$n-1] = (-$ra - $w * $this->H[$i][$n-1] + $q * $this->H[$i][$n]) / $x;\n                                $this->H[$i+1][$n] = (-$sa - $w * $this->H[$i][$n] - $q * $this->H[$i][$n-1]) / $x;\n                            } else {\n                                $this->cdiv(-$r - $y * $this->H[$i][$n-1], -$s - $y * $this->H[$i][$n], $z, $q);\n                                $this->H[$i+1][$n-1] = $this->cdivr;\n                                $this->H[$i+1][$n]   = $this->cdivi;\n                            }\n                        }\n                        // Overflow control\n                        $t = max(abs($this->H[$i][$n-1]), abs($this->H[$i][$n]));\n                        if (($eps * $t) * $t > 1) {\n                            for ($j = $i; $j <= $n; ++$j) {\n                                $this->H[$j][$n-1] = $this->H[$j][$n-1] / $t;\n                                $this->H[$j][$n]   = $this->H[$j][$n] / $t;\n                            }\n                        }\n                    } // end else\n                } // end for\n            } // end else for complex case\n        } // end for\n\n        // Vectors of isolated roots\n        for ($i = 0; $i < $nn; ++$i) {\n            if ($i < $low | $i > $high) {\n                for ($j = $i; $j < $nn; ++$j) {\n                    $this->V[$i][$j] = $this->H[$i][$j];\n                }\n            }\n        }\n\n        // Back transformation to get eigenvectors of original matrix\n        for ($j = $nn-1; $j >= $low; --$j) {\n            for ($i = $low; $i <= $high; ++$i) {\n                $z = 0.0;\n                for ($k = $low; $k <= min($j, $high); ++$k) {\n                    $z = $z + $this->V[$i][$k] * $this->H[$k][$j];\n                }\n                $this->V[$i][$j] = $z;\n            }\n        }\n    } // end hqr2\n\n    /**\n     *    Constructor: Check for symmetry, then construct the eigenvalue decomposition\n     *\n     *    @access public\n     *    @param A  Square matrix\n     *    @return Structure to access D and V.\n     */\n    public function __construct($Arg)\n    {\n        $this->A = $Arg->getArray();\n        $this->n = $Arg->getColumnDimension();\n\n        $issymmetric = true;\n        for ($j = 0; ($j < $this->n) & $issymmetric; ++$j) {\n            for ($i = 0; ($i < $this->n) & $issymmetric; ++$i) {\n                $issymmetric = ($this->A[$i][$j] == $this->A[$j][$i]);\n            }\n        }\n\n        if ($issymmetric) {\n            $this->V = $this->A;\n            // Tridiagonalize.\n            $this->tred2();\n            // Diagonalize.\n            $this->tql2();\n        } else {\n            $this->H = $this->A;\n            $this->ort = array();\n            // Reduce to Hessenberg form.\n            $this->orthes();\n            // Reduce Hessenberg to real Schur form.\n            $this->hqr2();\n        }\n    }\n\n    /**\n     *    Return the eigenvector matrix\n     *\n     *    @access public\n     *    @return V\n     */\n    public function getV()\n    {\n        return new Matrix($this->V, $this->n, $this->n);\n    }\n\n    /**\n     *    Return the real parts of the eigenvalues\n     *\n     *    @access public\n     *    @return real(diag(D))\n     */\n    public function getRealEigenvalues()\n    {\n        return $this->d;\n    }\n\n    /**\n     *    Return the imaginary parts of the eigenvalues\n     *\n     *    @access public\n     *    @return imag(diag(D))\n     */\n    public function getImagEigenvalues()\n    {\n        return $this->e;\n    }\n\n    /**\n     *    Return the block diagonal eigenvalue matrix\n     *\n     *    @access public\n     *    @return D\n     */\n    public function getD()\n    {\n        for ($i = 0; $i < $this->n; ++$i) {\n            $D[$i] = array_fill(0, $this->n, 0.0);\n            $D[$i][$i] = $this->d[$i];\n            if ($this->e[$i] == 0) {\n                continue;\n            }\n            $o = ($this->e[$i] > 0) ? $i + 1 : $i - 1;\n            $D[$i][$o] = $this->e[$i];\n        }\n        return new Matrix($D);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/LUDecomposition.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n\n *    unit lower triangular matrix L, an n-by-n upper triangular matrix U,\n *    and a permutation vector piv of length m so that A(piv,:) = L*U.\n *    If m < n, then L is m-by-m and U is m-by-n.\n *\n *    The LU decompostion with pivoting always exists, even if the matrix is\n *    singular, so the constructor will never fail. The primary use of the\n *    LU decomposition is in the solution of square systems of simultaneous\n *    linear equations. This will fail if isNonsingular() returns false.\n *\n *    @author Paul Meagher\n *    @author Bartosz Matosiuk\n *    @author Michael Bommarito\n *    @version 1.1\n *    @license PHP v3.0\n */\nclass PHPExcel_Shared_JAMA_LUDecomposition\n{\n    const MATRIX_SINGULAR_EXCEPTION    = \"Can only perform operation on singular matrix.\";\n    const MATRIX_SQUARE_EXCEPTION      = \"Mismatched Row dimension\";\n\n    /**\n     *    Decomposition storage\n     *    @var array\n     */\n    private $LU = array();\n\n    /**\n     *    Row dimension.\n     *    @var int\n     */\n    private $m;\n\n    /**\n     *    Column dimension.\n     *    @var int\n     */\n    private $n;\n\n    /**\n     *    Pivot sign.\n     *    @var int\n     */\n    private $pivsign;\n\n    /**\n     *    Internal storage of pivot vector.\n     *    @var array\n     */\n    private $piv = array();\n\n    /**\n     *    LU Decomposition constructor.\n     *\n     *    @param $A Rectangular matrix\n     *    @return Structure to access L, U and piv.\n     */\n    public function __construct($A)\n    {\n        if ($A instanceof PHPExcel_Shared_JAMA_Matrix) {\n            // Use a \"left-looking\", dot-product, Crout/Doolittle algorithm.\n            $this->LU = $A->getArray();\n            $this->m  = $A->getRowDimension();\n            $this->n  = $A->getColumnDimension();\n            for ($i = 0; $i < $this->m; ++$i) {\n                $this->piv[$i] = $i;\n            }\n            $this->pivsign = 1;\n            $LUrowi = $LUcolj = array();\n\n            // Outer loop.\n            for ($j = 0; $j < $this->n; ++$j) {\n                // Make a copy of the j-th column to localize references.\n                for ($i = 0; $i < $this->m; ++$i) {\n                    $LUcolj[$i] = &$this->LU[$i][$j];\n                }\n                // Apply previous transformations.\n                for ($i = 0; $i < $this->m; ++$i) {\n                    $LUrowi = $this->LU[$i];\n                    // Most of the time is spent in the following dot product.\n                    $kmax = min($i, $j);\n                    $s = 0.0;\n                    for ($k = 0; $k < $kmax; ++$k) {\n                        $s += $LUrowi[$k] * $LUcolj[$k];\n                    }\n                    $LUrowi[$j] = $LUcolj[$i] -= $s;\n                }\n                // Find pivot and exchange if necessary.\n                $p = $j;\n                for ($i = $j+1; $i < $this->m; ++$i) {\n                    if (abs($LUcolj[$i]) > abs($LUcolj[$p])) {\n                        $p = $i;\n                    }\n                }\n                if ($p != $j) {\n                    for ($k = 0; $k < $this->n; ++$k) {\n                        $t = $this->LU[$p][$k];\n                        $this->LU[$p][$k] = $this->LU[$j][$k];\n                        $this->LU[$j][$k] = $t;\n                    }\n                    $k = $this->piv[$p];\n                    $this->piv[$p] = $this->piv[$j];\n                    $this->piv[$j] = $k;\n                    $this->pivsign = $this->pivsign * -1;\n                }\n                // Compute multipliers.\n                if (($j < $this->m) && ($this->LU[$j][$j] != 0.0)) {\n                    for ($i = $j+1; $i < $this->m; ++$i) {\n                        $this->LU[$i][$j] /= $this->LU[$j][$j];\n                    }\n                }\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::ARGUMENT_TYPE_EXCEPTION);\n        }\n    }    //    function __construct()\n\n    /**\n     *    Get lower triangular factor.\n     *\n     *    @return array Lower triangular factor\n     */\n    public function getL()\n    {\n        for ($i = 0; $i < $this->m; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                if ($i > $j) {\n                    $L[$i][$j] = $this->LU[$i][$j];\n                } elseif ($i == $j) {\n                    $L[$i][$j] = 1.0;\n                } else {\n                    $L[$i][$j] = 0.0;\n                }\n            }\n        }\n        return new PHPExcel_Shared_JAMA_Matrix($L);\n    }    //    function getL()\n\n    /**\n     *    Get upper triangular factor.\n     *\n     *    @return array Upper triangular factor\n     */\n    public function getU()\n    {\n        for ($i = 0; $i < $this->n; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                if ($i <= $j) {\n                    $U[$i][$j] = $this->LU[$i][$j];\n                } else {\n                    $U[$i][$j] = 0.0;\n                }\n            }\n        }\n        return new PHPExcel_Shared_JAMA_Matrix($U);\n    }    //    function getU()\n\n    /**\n     *    Return pivot permutation vector.\n     *\n     *    @return array Pivot vector\n     */\n    public function getPivot()\n    {\n        return $this->piv;\n    }    //    function getPivot()\n\n    /**\n     *    Alias for getPivot\n     *\n     *    @see getPivot\n     */\n    public function getDoublePivot()\n    {\n        return $this->getPivot();\n    }    //    function getDoublePivot()\n\n    /**\n     *    Is the matrix nonsingular?\n     *\n     *    @return true if U, and hence A, is nonsingular.\n     */\n    public function isNonsingular()\n    {\n        for ($j = 0; $j < $this->n; ++$j) {\n            if ($this->LU[$j][$j] == 0) {\n                return false;\n            }\n        }\n        return true;\n    }    //    function isNonsingular()\n\n    /**\n     *    Count determinants\n     *\n     *    @return array d matrix deterninat\n     */\n    public function det()\n    {\n        if ($this->m == $this->n) {\n            $d = $this->pivsign;\n            for ($j = 0; $j < $this->n; ++$j) {\n                $d *= $this->LU[$j][$j];\n            }\n            return $d;\n        } else {\n            throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::MATRIX_DIMENSION_EXCEPTION);\n        }\n    }    //    function det()\n\n    /**\n     *    Solve A*X = B\n     *\n     *    @param  $B  A Matrix with as many rows as A and any number of columns.\n     *    @return  X so that L*U*X = B(piv,:)\n     *    @PHPExcel_Calculation_Exception  IllegalArgumentException Matrix row dimensions must agree.\n     *    @PHPExcel_Calculation_Exception  RuntimeException  Matrix is singular.\n     */\n    public function solve($B)\n    {\n        if ($B->getRowDimension() == $this->m) {\n            if ($this->isNonsingular()) {\n                // Copy right hand side with pivoting\n                $nx = $B->getColumnDimension();\n                $X  = $B->getMatrix($this->piv, 0, $nx-1);\n                // Solve L*Y = B(piv,:)\n                for ($k = 0; $k < $this->n; ++$k) {\n                    for ($i = $k+1; $i < $this->n; ++$i) {\n                        for ($j = 0; $j < $nx; ++$j) {\n                            $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k];\n                        }\n                    }\n                }\n                // Solve U*X = Y;\n                for ($k = $this->n-1; $k >= 0; --$k) {\n                    for ($j = 0; $j < $nx; ++$j) {\n                        $X->A[$k][$j] /= $this->LU[$k][$k];\n                    }\n                    for ($i = 0; $i < $k; ++$i) {\n                        for ($j = 0; $j < $nx; ++$j) {\n                            $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k];\n                        }\n                    }\n                }\n                return $X;\n            } else {\n                throw new PHPExcel_Calculation_Exception(self::MATRIX_SINGULAR_EXCEPTION);\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::MATRIX_SQUARE_EXCEPTION);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/Matrix.php",
    "content": "<?php\n/**\n * @package JAMA\n */\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    /**\n     * @ignore\n     */\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../../');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n\n/*\n *    Matrix class\n *\n *    @author Paul Meagher\n *    @author Michael Bommarito\n *    @author Lukasz Karapuda\n *    @author Bartek Matosiuk\n *    @version 1.8\n *    @license PHP v3.0\n *    @see http://math.nist.gov/javanumerics/jama/\n */\nclass PHPExcel_Shared_JAMA_Matrix\n{\n    const POLYMORPHIC_ARGUMENT_EXCEPTION = \"Invalid argument pattern for polymorphic function.\";\n    const ARGUMENT_TYPE_EXCEPTION        = \"Invalid argument type.\";\n    const ARGUMENT_BOUNDS_EXCEPTION      = \"Invalid argument range.\";\n    const MATRIX_DIMENSION_EXCEPTION     = \"Matrix dimensions are not equal.\";\n    const ARRAY_LENGTH_EXCEPTION         = \"Array length must be a multiple of m.\";\n\n    /**\n     *    Matrix storage\n     *\n     *    @var array\n     *    @access public\n     */\n    public $A = array();\n\n    /**\n     *    Matrix row dimension\n     *\n     *    @var int\n     *    @access private\n     */\n    private $m;\n\n    /**\n     *    Matrix column dimension\n     *\n     *    @var int\n     *    @access private\n     */\n    private $n;\n\n    /**\n     *    Polymorphic constructor\n     *\n     *    As PHP has no support for polymorphic constructors, we hack our own sort of polymorphism using func_num_args, func_get_arg, and gettype. In essence, we're just implementing a simple RTTI filter and calling the appropriate constructor.\n     */\n    public function __construct()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                //Rectangular matrix - m x n initialized from 2D array\n                case 'array':\n                    $this->m = count($args[0]);\n                    $this->n = count($args[0][0]);\n                    $this->A = $args[0];\n                    break;\n                //Square matrix - n x n\n                case 'integer':\n                    $this->m = $args[0];\n                    $this->n = $args[0];\n                    $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0));\n                    break;\n                //Rectangular matrix - m x n\n                case 'integer,integer':\n                    $this->m = $args[0];\n                    $this->n = $args[1];\n                    $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0));\n                    break;\n                //Rectangular matrix - m x n initialized from packed array\n                case 'array,integer':\n                    $this->m = $args[1];\n                    if ($this->m != 0) {\n                        $this->n = count($args[0]) / $this->m;\n                    } else {\n                        $this->n = 0;\n                    }\n                    if (($this->m * $this->n) == count($args[0])) {\n                        for ($i = 0; $i < $this->m; ++$i) {\n                            for ($j = 0; $j < $this->n; ++$j) {\n                                $this->A[$i][$j] = $args[0][$i + $j * $this->m];\n                            }\n                        }\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARRAY_LENGTH_EXCEPTION);\n                    }\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    getArray\n     *\n     *    @return array Matrix array\n     */\n    public function getArray()\n    {\n        return $this->A;\n    }\n\n    /**\n     *    getRowDimension\n     *\n     *    @return int Row dimension\n     */\n    public function getRowDimension()\n    {\n        return $this->m;\n    }\n\n    /**\n     *    getColumnDimension\n     *\n     *    @return int Column dimension\n     */\n    public function getColumnDimension()\n    {\n        return $this->n;\n    }\n\n    /**\n     *    get\n     *\n     *    Get the i,j-th element of the matrix.\n     *    @param int $i Row position\n     *    @param int $j Column position\n     *    @return mixed Element (int/float/double)\n     */\n    public function get($i = null, $j = null)\n    {\n        return $this->A[$i][$j];\n    }\n\n    /**\n     *    getMatrix\n     *\n     *    Get a submatrix\n     *    @param int $i0 Initial row index\n     *    @param int $iF Final row index\n     *    @param int $j0 Initial column index\n     *    @param int $jF Final column index\n     *    @return Matrix Submatrix\n     */\n    public function getMatrix()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                //A($i0...; $j0...)\n                case 'integer,integer':\n                    list($i0, $j0) = $args;\n                    if ($i0 >= 0) {\n                        $m = $this->m - $i0;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    if ($j0 >= 0) {\n                        $n = $this->n - $j0;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);\n                    for ($i = $i0; $i < $this->m; ++$i) {\n                        for ($j = $j0; $j < $this->n; ++$j) {\n                            $R->set($i, $j, $this->A[$i][$j]);\n                        }\n                    }\n                    return $R;\n                    break;\n                //A($i0...$iF; $j0...$jF)\n                case 'integer,integer,integer,integer':\n                    list($i0, $iF, $j0, $jF) = $args;\n                    if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) {\n                        $m = $iF - $i0;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    if (($jF > $j0) && ($this->n >= $jF) && ($j0 >= 0)) {\n                        $n = $jF - $j0;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    $R = new PHPExcel_Shared_JAMA_Matrix($m+1, $n+1);\n                    for ($i = $i0; $i <= $iF; ++$i) {\n                        for ($j = $j0; $j <= $jF; ++$j) {\n                            $R->set($i - $i0, $j - $j0, $this->A[$i][$j]);\n                        }\n                    }\n                    return $R;\n                    break;\n                //$R = array of row indices; $C = array of column indices\n                case 'array,array':\n                    list($RL, $CL) = $args;\n                    if (count($RL) > 0) {\n                        $m = count($RL);\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    if (count($CL) > 0) {\n                        $n = count($CL);\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);\n                    for ($i = 0; $i < $m; ++$i) {\n                        for ($j = 0; $j < $n; ++$j) {\n                            $R->set($i - $i0, $j - $j0, $this->A[$RL[$i]][$CL[$j]]);\n                        }\n                    }\n                    return $R;\n                    break;\n                //$RL = array of row indices; $CL = array of column indices\n                case 'array,array':\n                    list($RL, $CL) = $args;\n                    if (count($RL) > 0) {\n                        $m = count($RL);\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    if (count($CL) > 0) {\n                        $n = count($CL);\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);\n                    for ($i = 0; $i < $m; ++$i) {\n                        for ($j = 0; $j < $n; ++$j) {\n                            $R->set($i, $j, $this->A[$RL[$i]][$CL[$j]]);\n                        }\n                    }\n                    return $R;\n                    break;\n                //A($i0...$iF); $CL = array of column indices\n                case 'integer,integer,array':\n                    list($i0, $iF, $CL) = $args;\n                    if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) {\n                        $m = $iF - $i0;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    if (count($CL) > 0) {\n                        $n = count($CL);\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);\n                    for ($i = $i0; $i < $iF; ++$i) {\n                        for ($j = 0; $j < $n; ++$j) {\n                            $R->set($i - $i0, $j, $this->A[$RL[$i]][$j]);\n                        }\n                    }\n                    return $R;\n                    break;\n                //$RL = array of row indices\n                case 'array,integer,integer':\n                    list($RL, $j0, $jF) = $args;\n                    if (count($RL) > 0) {\n                        $m = count($RL);\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    if (($jF >= $j0) && ($this->n >= $jF) && ($j0 >= 0)) {\n                        $n = $jF - $j0;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION);\n                    }\n                    $R = new PHPExcel_Shared_JAMA_Matrix($m, $n+1);\n                    for ($i = 0; $i < $m; ++$i) {\n                        for ($j = $j0; $j <= $jF; ++$j) {\n                            $R->set($i, $j - $j0, $this->A[$RL[$i]][$j]);\n                        }\n                    }\n                    return $R;\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    checkMatrixDimensions\n     *\n     *    Is matrix B the same size?\n     *    @param Matrix $B Matrix B\n     *    @return boolean\n     */\n    public function checkMatrixDimensions($B = null)\n    {\n        if ($B instanceof PHPExcel_Shared_JAMA_Matrix) {\n            if (($this->m == $B->getRowDimension()) && ($this->n == $B->getColumnDimension())) {\n                return true;\n            } else {\n                throw new PHPExcel_Calculation_Exception(self::MATRIX_DIMENSION_EXCEPTION);\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n        }\n    }    //    function checkMatrixDimensions()\n\n    /**\n     *    set\n     *\n     *    Set the i,j-th element of the matrix.\n     *    @param int $i Row position\n     *    @param int $j Column position\n     *    @param mixed $c Int/float/double value\n     *    @return mixed Element (int/float/double)\n     */\n    public function set($i = null, $j = null, $c = null)\n    {\n        // Optimized set version just has this\n        $this->A[$i][$j] = $c;\n    }    //    function set()\n\n    /**\n     *    identity\n     *\n     *    Generate an identity matrix.\n     *    @param int $m Row dimension\n     *    @param int $n Column dimension\n     *    @return Matrix Identity matrix\n     */\n    public function identity($m = null, $n = null)\n    {\n        return $this->diagonal($m, $n, 1);\n    }\n\n    /**\n     *    diagonal\n     *\n     *    Generate a diagonal matrix\n     *    @param int $m Row dimension\n     *    @param int $n Column dimension\n     *    @param mixed $c Diagonal value\n     *    @return Matrix Diagonal matrix\n     */\n    public function diagonal($m = null, $n = null, $c = 1)\n    {\n        $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);\n        for ($i = 0; $i < $m; ++$i) {\n            $R->set($i, $i, $c);\n        }\n        return $R;\n    }\n\n    /**\n     *    getMatrixByRow\n     *\n     *    Get a submatrix by row index/range\n     *    @param int $i0 Initial row index\n     *    @param int $iF Final row index\n     *    @return Matrix Submatrix\n     */\n    public function getMatrixByRow($i0 = null, $iF = null)\n    {\n        if (is_int($i0)) {\n            if (is_int($iF)) {\n                return $this->getMatrix($i0, 0, $iF + 1, $this->n);\n            } else {\n                return $this->getMatrix($i0, 0, $i0 + 1, $this->n);\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n        }\n    }\n\n    /**\n     *    getMatrixByCol\n     *\n     *    Get a submatrix by column index/range\n     *    @param int $i0 Initial column index\n     *    @param int $iF Final column index\n     *    @return Matrix Submatrix\n     */\n    public function getMatrixByCol($j0 = null, $jF = null)\n    {\n        if (is_int($j0)) {\n            if (is_int($jF)) {\n                return $this->getMatrix(0, $j0, $this->m, $jF + 1);\n            } else {\n                return $this->getMatrix(0, $j0, $this->m, $j0 + 1);\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n        }\n    }\n\n    /**\n     *    transpose\n     *\n     *    Tranpose matrix\n     *    @return Matrix Transposed matrix\n     */\n    public function transpose()\n    {\n        $R = new PHPExcel_Shared_JAMA_Matrix($this->n, $this->m);\n        for ($i = 0; $i < $this->m; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                $R->set($j, $i, $this->A[$i][$j]);\n            }\n        }\n        return $R;\n    }    //    function transpose()\n\n    /**\n     *    trace\n     *\n     *    Sum of diagonal elements\n     *    @return float Sum of diagonal elements\n     */\n    public function trace()\n    {\n        $s = 0;\n        $n = min($this->m, $this->n);\n        for ($i = 0; $i < $n; ++$i) {\n            $s += $this->A[$i][$i];\n        }\n        return $s;\n    }\n\n    /**\n     *    uminus\n     *\n     *    Unary minus matrix -A\n     *    @return Matrix Unary minus matrix\n     */\n    public function uminus()\n    {\n    }\n\n    /**\n     *    plus\n     *\n     *    A + B\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Sum\n     */\n    public function plus()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $M->set($i, $j, $M->get($i, $j) + $this->A[$i][$j]);\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    plusEquals\n     *\n     *    A = A + B\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Sum\n     */\n    public function plusEquals()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $validValues = true;\n                    $value = $M->get($i, $j);\n                    if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {\n                        $this->A[$i][$j] = trim($this->A[$i][$j], '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);\n                    }\n                    if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {\n                        $value = trim($value, '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);\n                    }\n                    if ($validValues) {\n                        $this->A[$i][$j] += $value;\n                    } else {\n                        $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();\n                    }\n                }\n            }\n            return $this;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    minus\n     *\n     *    A - B\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Sum\n     */\n    public function minus()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $M->set($i, $j, $M->get($i, $j) - $this->A[$i][$j]);\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    minusEquals\n     *\n     *    A = A - B\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Sum\n     */\n    public function minusEquals()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $validValues = true;\n                    $value = $M->get($i, $j);\n                    if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {\n                        $this->A[$i][$j] = trim($this->A[$i][$j], '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);\n                    }\n                    if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {\n                        $value = trim($value, '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);\n                    }\n                    if ($validValues) {\n                        $this->A[$i][$j] -= $value;\n                    } else {\n                        $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();\n                    }\n                }\n            }\n            return $this;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    arrayTimes\n     *\n     *    Element-by-element multiplication\n     *    Cij = Aij * Bij\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Matrix Cij\n     */\n    public function arrayTimes()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $M->set($i, $j, $M->get($i, $j) * $this->A[$i][$j]);\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    arrayTimesEquals\n     *\n     *    Element-by-element multiplication\n     *    Aij = Aij * Bij\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Matrix Aij\n     */\n    public function arrayTimesEquals()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $validValues = true;\n                    $value = $M->get($i, $j);\n                    if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {\n                        $this->A[$i][$j] = trim($this->A[$i][$j], '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);\n                    }\n                    if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {\n                        $value = trim($value, '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);\n                    }\n                    if ($validValues) {\n                        $this->A[$i][$j] *= $value;\n                    } else {\n                        $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();\n                    }\n                }\n            }\n            return $this;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    arrayRightDivide\n     *\n     *    Element-by-element right division\n     *    A / B\n     *    @param Matrix $B Matrix B\n     *    @return Matrix Division result\n     */\n    public function arrayRightDivide()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $validValues = true;\n                    $value = $M->get($i, $j);\n                    if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {\n                        $this->A[$i][$j] = trim($this->A[$i][$j], '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);\n                    }\n                    if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {\n                        $value = trim($value, '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);\n                    }\n                    if ($validValues) {\n                        if ($value == 0) {\n                            //    Trap for Divide by Zero error\n                            $M->set($i, $j, '#DIV/0!');\n                        } else {\n                            $M->set($i, $j, $this->A[$i][$j] / $value);\n                        }\n                    } else {\n                        $M->set($i, $j, PHPExcel_Calculation_Functions::NaN());\n                    }\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n\n    /**\n     *    arrayRightDivideEquals\n     *\n     *    Element-by-element right division\n     *    Aij = Aij / Bij\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Matrix Aij\n     */\n    public function arrayRightDivideEquals()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $this->A[$i][$j] = $this->A[$i][$j] / $M->get($i, $j);\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n\n    /**\n     *    arrayLeftDivide\n     *\n     *    Element-by-element Left division\n     *    A / B\n     *    @param Matrix $B Matrix B\n     *    @return Matrix Division result\n     */\n    public function arrayLeftDivide()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $M->set($i, $j, $M->get($i, $j) / $this->A[$i][$j]);\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n\n    /**\n     *    arrayLeftDivideEquals\n     *\n     *    Element-by-element Left division\n     *    Aij = Aij / Bij\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Matrix Aij\n     */\n    public function arrayLeftDivideEquals()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $this->A[$i][$j] = $M->get($i, $j) / $this->A[$i][$j];\n                }\n            }\n            return $M;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n\n    /**\n     *    times\n     *\n     *    Matrix multiplication\n     *    @param mixed $n Matrix/Array/Scalar\n     *    @return Matrix Product\n     */\n    public function times()\n    {\n        if (func_num_args() > 0) {\n            $args  = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $B = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    if ($this->n == $B->m) {\n                        $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n);\n                        for ($j = 0; $j < $B->n; ++$j) {\n                            for ($k = 0; $k < $this->n; ++$k) {\n                                $Bcolj[$k] = $B->A[$k][$j];\n                            }\n                            for ($i = 0; $i < $this->m; ++$i) {\n                                $Arowi = $this->A[$i];\n                                $s = 0;\n                                for ($k = 0; $k < $this->n; ++$k) {\n                                    $s += $Arowi[$k] * $Bcolj[$k];\n                                }\n                                $C->A[$i][$j] = $s;\n                            }\n                        }\n                        return $C;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(JAMAError(MatrixDimensionMismatch));\n                    }\n                    break;\n                case 'array':\n                    $B = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    if ($this->n == $B->m) {\n                        $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n);\n                        for ($i = 0; $i < $C->m; ++$i) {\n                            for ($j = 0; $j < $C->n; ++$j) {\n                                $s = \"0\";\n                                for ($k = 0; $k < $C->n; ++$k) {\n                                    $s += $this->A[$i][$k] * $B->A[$k][$j];\n                                }\n                                $C->A[$i][$j] = $s;\n                            }\n                        }\n                        return $C;\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(JAMAError(MatrixDimensionMismatch));\n                    }\n                    return $M;\n                    break;\n                case 'integer':\n                    $C = new PHPExcel_Shared_JAMA_Matrix($this->A);\n                    for ($i = 0; $i < $C->m; ++$i) {\n                        for ($j = 0; $j < $C->n; ++$j) {\n                            $C->A[$i][$j] *= $args[0];\n                        }\n                    }\n                    return $C;\n                    break;\n                case 'double':\n                    $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $this->n);\n                    for ($i = 0; $i < $C->m; ++$i) {\n                        for ($j = 0; $j < $C->n; ++$j) {\n                            $C->A[$i][$j] = $args[0] * $this->A[$i][$j];\n                        }\n                    }\n                    return $C;\n                    break;\n                case 'float':\n                    $C = new PHPExcel_Shared_JAMA_Matrix($this->A);\n                    for ($i = 0; $i < $C->m; ++$i) {\n                        for ($j = 0; $j < $C->n; ++$j) {\n                            $C->A[$i][$j] *= $args[0];\n                        }\n                    }\n                    return $C;\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    power\n     *\n     *    A = A ^ B\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Sum\n     */\n    public function power()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                    break;\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $validValues = true;\n                    $value = $M->get($i, $j);\n                    if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {\n                        $this->A[$i][$j] = trim($this->A[$i][$j], '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);\n                    }\n                    if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {\n                        $value = trim($value, '\"');\n                        $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);\n                    }\n                    if ($validValues) {\n                        $this->A[$i][$j] = pow($this->A[$i][$j], $value);\n                    } else {\n                        $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();\n                    }\n                }\n            }\n            return $this;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    concat\n     *\n     *    A = A & B\n     *    @param mixed $B Matrix/Array\n     *    @return Matrix Sum\n     */\n    public function concat()\n    {\n        if (func_num_args() > 0) {\n            $args = func_get_args();\n            $match = implode(\",\", array_map('gettype', $args));\n\n            switch ($match) {\n                case 'object':\n                    if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) {\n                        $M = $args[0];\n                    } else {\n                        throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION);\n                    }\n                case 'array':\n                    $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);\n                    break;\n                default:\n                    throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n                    break;\n            }\n            $this->checkMatrixDimensions($M);\n            for ($i = 0; $i < $this->m; ++$i) {\n                for ($j = 0; $j < $this->n; ++$j) {\n                    $this->A[$i][$j] = trim($this->A[$i][$j], '\"').trim($M->get($i, $j), '\"');\n                }\n            }\n            return $this;\n        } else {\n            throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION);\n        }\n    }\n\n    /**\n     *    Solve A*X = B.\n     *\n     *    @param Matrix $B Right hand side\n     *    @return Matrix ... Solution if A is square, least squares solution otherwise\n     */\n    public function solve($B)\n    {\n        if ($this->m == $this->n) {\n            $LU = new PHPExcel_Shared_JAMA_LUDecomposition($this);\n            return $LU->solve($B);\n        } else {\n            $QR = new PHPExcel_Shared_JAMA_QRDecomposition($this);\n            return $QR->solve($B);\n        }\n    }\n\n    /**\n     *    Matrix inverse or pseudoinverse.\n     *\n     *    @return Matrix ... Inverse(A) if A is square, pseudoinverse otherwise.\n     */\n    public function inverse()\n    {\n        return $this->solve($this->identity($this->m, $this->m));\n    }\n\n    /**\n     *    det\n     *\n     *    Calculate determinant\n     *    @return float Determinant\n     */\n    public function det()\n    {\n        $L = new PHPExcel_Shared_JAMA_LUDecomposition($this);\n        return $L->det();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/QRDecomposition.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    For an m-by-n matrix A with m >= n, the QR decomposition is an m-by-n\n *    orthogonal matrix Q and an n-by-n upper triangular matrix R so that\n *    A = Q*R.\n *\n *    The QR decompostion always exists, even if the matrix does not have\n *    full rank, so the constructor will never fail.  The primary use of the\n *    QR decomposition is in the least squares solution of nonsquare systems\n *    of simultaneous linear equations.  This will fail if isFullRank()\n *    returns false.\n *\n *    @author  Paul Meagher\n *    @license PHP v3.0\n *    @version 1.1\n */\nclass PHPExcel_Shared_JAMA_QRDecomposition\n{\n    const MATRIX_RANK_EXCEPTION  = \"Can only perform operation on full-rank matrix.\";\n\n    /**\n     *    Array for internal storage of decomposition.\n     *    @var array\n     */\n    private $QR = array();\n\n    /**\n     *    Row dimension.\n     *    @var integer\n     */\n    private $m;\n\n    /**\n    *    Column dimension.\n    *    @var integer\n    */\n    private $n;\n\n    /**\n     *    Array for internal storage of diagonal of R.\n     *    @var  array\n     */\n    private $Rdiag = array();\n\n\n    /**\n     *    QR Decomposition computed by Householder reflections.\n     *\n     *    @param matrix $A Rectangular matrix\n     *    @return Structure to access R and the Householder vectors and compute Q.\n     */\n    public function __construct($A)\n    {\n        if ($A instanceof PHPExcel_Shared_JAMA_Matrix) {\n            // Initialize.\n            $this->QR = $A->getArrayCopy();\n            $this->m  = $A->getRowDimension();\n            $this->n  = $A->getColumnDimension();\n            // Main loop.\n            for ($k = 0; $k < $this->n; ++$k) {\n                // Compute 2-norm of k-th column without under/overflow.\n                $nrm = 0.0;\n                for ($i = $k; $i < $this->m; ++$i) {\n                    $nrm = hypo($nrm, $this->QR[$i][$k]);\n                }\n                if ($nrm != 0.0) {\n                    // Form k-th Householder vector.\n                    if ($this->QR[$k][$k] < 0) {\n                        $nrm = -$nrm;\n                    }\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $this->QR[$i][$k] /= $nrm;\n                    }\n                    $this->QR[$k][$k] += 1.0;\n                    // Apply transformation to remaining columns.\n                    for ($j = $k+1; $j < $this->n; ++$j) {\n                        $s = 0.0;\n                        for ($i = $k; $i < $this->m; ++$i) {\n                            $s += $this->QR[$i][$k] * $this->QR[$i][$j];\n                        }\n                        $s = -$s/$this->QR[$k][$k];\n                        for ($i = $k; $i < $this->m; ++$i) {\n                            $this->QR[$i][$j] += $s * $this->QR[$i][$k];\n                        }\n                    }\n                }\n                $this->Rdiag[$k] = -$nrm;\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::ARGUMENT_TYPE_EXCEPTION);\n        }\n    }    //    function __construct()\n\n\n    /**\n     *    Is the matrix full rank?\n     *\n     *    @return boolean true if R, and hence A, has full rank, else false.\n     */\n    public function isFullRank()\n    {\n        for ($j = 0; $j < $this->n; ++$j) {\n            if ($this->Rdiag[$j] == 0) {\n                return false;\n            }\n        }\n        return true;\n    }    //    function isFullRank()\n\n    /**\n     *    Return the Householder vectors\n     *\n     *    @return Matrix Lower trapezoidal matrix whose columns define the reflections\n     */\n    public function getH()\n    {\n        for ($i = 0; $i < $this->m; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                if ($i >= $j) {\n                    $H[$i][$j] = $this->QR[$i][$j];\n                } else {\n                    $H[$i][$j] = 0.0;\n                }\n            }\n        }\n        return new PHPExcel_Shared_JAMA_Matrix($H);\n    }    //    function getH()\n\n    /**\n     *    Return the upper triangular factor\n     *\n     *    @return Matrix upper triangular factor\n     */\n    public function getR()\n    {\n        for ($i = 0; $i < $this->n; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                if ($i < $j) {\n                    $R[$i][$j] = $this->QR[$i][$j];\n                } elseif ($i == $j) {\n                    $R[$i][$j] = $this->Rdiag[$i];\n                } else {\n                    $R[$i][$j] = 0.0;\n                }\n            }\n        }\n        return new PHPExcel_Shared_JAMA_Matrix($R);\n    }    //    function getR()\n\n    /**\n     *    Generate and return the (economy-sized) orthogonal factor\n     *\n     *    @return Matrix orthogonal factor\n     */\n    public function getQ()\n    {\n        for ($k = $this->n-1; $k >= 0; --$k) {\n            for ($i = 0; $i < $this->m; ++$i) {\n                $Q[$i][$k] = 0.0;\n            }\n            $Q[$k][$k] = 1.0;\n            for ($j = $k; $j < $this->n; ++$j) {\n                if ($this->QR[$k][$k] != 0) {\n                    $s = 0.0;\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $s += $this->QR[$i][$k] * $Q[$i][$j];\n                    }\n                    $s = -$s/$this->QR[$k][$k];\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $Q[$i][$j] += $s * $this->QR[$i][$k];\n                    }\n                }\n            }\n        }\n        /*\n        for($i = 0; $i < count($Q); ++$i) {\n            for($j = 0; $j < count($Q); ++$j) {\n                if (! isset($Q[$i][$j]) ) {\n                    $Q[$i][$j] = 0;\n                }\n            }\n        }\n        */\n        return new PHPExcel_Shared_JAMA_Matrix($Q);\n    }    //    function getQ()\n\n    /**\n     *    Least squares solution of A*X = B\n     *\n     *    @param Matrix $B A Matrix with as many rows as A and any number of columns.\n     *    @return Matrix Matrix that minimizes the two norm of Q*R*X-B.\n     */\n    public function solve($B)\n    {\n        if ($B->getRowDimension() == $this->m) {\n            if ($this->isFullRank()) {\n                // Copy right hand side\n                $nx = $B->getColumnDimension();\n                $X  = $B->getArrayCopy();\n                // Compute Y = transpose(Q)*B\n                for ($k = 0; $k < $this->n; ++$k) {\n                    for ($j = 0; $j < $nx; ++$j) {\n                        $s = 0.0;\n                        for ($i = $k; $i < $this->m; ++$i) {\n                            $s += $this->QR[$i][$k] * $X[$i][$j];\n                        }\n                        $s = -$s/$this->QR[$k][$k];\n                        for ($i = $k; $i < $this->m; ++$i) {\n                            $X[$i][$j] += $s * $this->QR[$i][$k];\n                        }\n                    }\n                }\n                // Solve R*X = Y;\n                for ($k = $this->n-1; $k >= 0; --$k) {\n                    for ($j = 0; $j < $nx; ++$j) {\n                        $X[$k][$j] /= $this->Rdiag[$k];\n                    }\n                    for ($i = 0; $i < $k; ++$i) {\n                        for ($j = 0; $j < $nx; ++$j) {\n                            $X[$i][$j] -= $X[$k][$j]* $this->QR[$i][$k];\n                        }\n                    }\n                }\n                $X = new PHPExcel_Shared_JAMA_Matrix($X);\n                return ($X->getMatrix(0, $this->n-1, 0, $nx));\n            } else {\n                throw new PHPExcel_Calculation_Exception(self::MATRIX_RANK_EXCEPTION);\n            }\n        } else {\n            throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::MATRIX_DIMENSION_EXCEPTION);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/SingularValueDecomposition.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    For an m-by-n matrix A with m >= n, the singular value decomposition is\n *    an m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, and\n *    an n-by-n orthogonal matrix V so that A = U*S*V'.\n *\n *    The singular values, sigma[$k] = S[$k][$k], are ordered so that\n *    sigma[0] >= sigma[1] >= ... >= sigma[n-1].\n *\n *    The singular value decompostion always exists, so the constructor will\n *    never fail.  The matrix condition number and the effective numerical\n *    rank can be computed from this decomposition.\n *\n *    @author  Paul Meagher\n *    @license PHP v3.0\n *    @version 1.1\n */\nclass SingularValueDecomposition\n{\n    /**\n     *    Internal storage of U.\n     *    @var array\n     */\n    private $U = array();\n\n    /**\n     *    Internal storage of V.\n     *    @var array\n     */\n    private $V = array();\n\n    /**\n     *    Internal storage of singular values.\n     *    @var array\n     */\n    private $s = array();\n\n    /**\n     *    Row dimension.\n     *    @var int\n     */\n    private $m;\n\n    /**\n     *    Column dimension.\n     *    @var int\n     */\n    private $n;\n\n    /**\n     *    Construct the singular value decomposition\n     *\n     *    Derived from LINPACK code.\n     *\n     *    @param $A Rectangular matrix\n     *    @return Structure to access U, S and V.\n     */\n    public function __construct($Arg)\n    {\n        // Initialize.\n        $A = $Arg->getArrayCopy();\n        $this->m = $Arg->getRowDimension();\n        $this->n = $Arg->getColumnDimension();\n        $nu      = min($this->m, $this->n);\n        $e       = array();\n        $work    = array();\n        $wantu   = true;\n        $wantv   = true;\n        $nct = min($this->m - 1, $this->n);\n        $nrt = max(0, min($this->n - 2, $this->m));\n\n        // Reduce A to bidiagonal form, storing the diagonal elements\n        // in s and the super-diagonal elements in e.\n        for ($k = 0; $k < max($nct, $nrt); ++$k) {\n            if ($k < $nct) {\n                // Compute the transformation for the k-th column and\n                // place the k-th diagonal in s[$k].\n                // Compute 2-norm of k-th column without under/overflow.\n                $this->s[$k] = 0;\n                for ($i = $k; $i < $this->m; ++$i) {\n                    $this->s[$k] = hypo($this->s[$k], $A[$i][$k]);\n                }\n                if ($this->s[$k] != 0.0) {\n                    if ($A[$k][$k] < 0.0) {\n                        $this->s[$k] = -$this->s[$k];\n                    }\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $A[$i][$k] /= $this->s[$k];\n                    }\n                    $A[$k][$k] += 1.0;\n                }\n                $this->s[$k] = -$this->s[$k];\n            }\n\n            for ($j = $k + 1; $j < $this->n; ++$j) {\n                if (($k < $nct) & ($this->s[$k] != 0.0)) {\n                    // Apply the transformation.\n                    $t = 0;\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $t += $A[$i][$k] * $A[$i][$j];\n                    }\n                    $t = -$t / $A[$k][$k];\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $A[$i][$j] += $t * $A[$i][$k];\n                    }\n                    // Place the k-th row of A into e for the\n                    // subsequent calculation of the row transformation.\n                    $e[$j] = $A[$k][$j];\n                }\n            }\n\n            if ($wantu and ($k < $nct)) {\n                // Place the transformation in U for subsequent back\n                // multiplication.\n                for ($i = $k; $i < $this->m; ++$i) {\n                    $this->U[$i][$k] = $A[$i][$k];\n                }\n            }\n\n            if ($k < $nrt) {\n                // Compute the k-th row transformation and place the\n                // k-th super-diagonal in e[$k].\n                // Compute 2-norm without under/overflow.\n                $e[$k] = 0;\n                for ($i = $k + 1; $i < $this->n; ++$i) {\n                    $e[$k] = hypo($e[$k], $e[$i]);\n                }\n                if ($e[$k] != 0.0) {\n                    if ($e[$k+1] < 0.0) {\n                        $e[$k] = -$e[$k];\n                    }\n                    for ($i = $k + 1; $i < $this->n; ++$i) {\n                        $e[$i] /= $e[$k];\n                    }\n                    $e[$k+1] += 1.0;\n                }\n                $e[$k] = -$e[$k];\n                if (($k+1 < $this->m) and ($e[$k] != 0.0)) {\n                    // Apply the transformation.\n                    for ($i = $k+1; $i < $this->m; ++$i) {\n                        $work[$i] = 0.0;\n                    }\n                    for ($j = $k+1; $j < $this->n; ++$j) {\n                        for ($i = $k+1; $i < $this->m; ++$i) {\n                            $work[$i] += $e[$j] * $A[$i][$j];\n                        }\n                    }\n                    for ($j = $k + 1; $j < $this->n; ++$j) {\n                        $t = -$e[$j] / $e[$k+1];\n                        for ($i = $k + 1; $i < $this->m; ++$i) {\n                            $A[$i][$j] += $t * $work[$i];\n                        }\n                    }\n                }\n                if ($wantv) {\n                    // Place the transformation in V for subsequent\n                    // back multiplication.\n                    for ($i = $k + 1; $i < $this->n; ++$i) {\n                        $this->V[$i][$k] = $e[$i];\n                    }\n                }\n            }\n        }\n\n        // Set up the final bidiagonal matrix or order p.\n        $p = min($this->n, $this->m + 1);\n        if ($nct < $this->n) {\n            $this->s[$nct] = $A[$nct][$nct];\n        }\n        if ($this->m < $p) {\n            $this->s[$p-1] = 0.0;\n        }\n        if ($nrt + 1 < $p) {\n            $e[$nrt] = $A[$nrt][$p-1];\n        }\n        $e[$p-1] = 0.0;\n        // If required, generate U.\n        if ($wantu) {\n            for ($j = $nct; $j < $nu; ++$j) {\n                for ($i = 0; $i < $this->m; ++$i) {\n                    $this->U[$i][$j] = 0.0;\n                }\n                $this->U[$j][$j] = 1.0;\n            }\n            for ($k = $nct - 1; $k >= 0; --$k) {\n                if ($this->s[$k] != 0.0) {\n                    for ($j = $k + 1; $j < $nu; ++$j) {\n                        $t = 0;\n                        for ($i = $k; $i < $this->m; ++$i) {\n                            $t += $this->U[$i][$k] * $this->U[$i][$j];\n                        }\n                        $t = -$t / $this->U[$k][$k];\n                        for ($i = $k; $i < $this->m; ++$i) {\n                            $this->U[$i][$j] += $t * $this->U[$i][$k];\n                        }\n                    }\n                    for ($i = $k; $i < $this->m; ++$i) {\n                        $this->U[$i][$k] = -$this->U[$i][$k];\n                    }\n                    $this->U[$k][$k] = 1.0 + $this->U[$k][$k];\n                    for ($i = 0; $i < $k - 1; ++$i) {\n                        $this->U[$i][$k] = 0.0;\n                    }\n                } else {\n                    for ($i = 0; $i < $this->m; ++$i) {\n                        $this->U[$i][$k] = 0.0;\n                    }\n                    $this->U[$k][$k] = 1.0;\n                }\n            }\n        }\n\n        // If required, generate V.\n        if ($wantv) {\n            for ($k = $this->n - 1; $k >= 0; --$k) {\n                if (($k < $nrt) and ($e[$k] != 0.0)) {\n                    for ($j = $k + 1; $j < $nu; ++$j) {\n                        $t = 0;\n                        for ($i = $k + 1; $i < $this->n; ++$i) {\n                            $t += $this->V[$i][$k]* $this->V[$i][$j];\n                        }\n                        $t = -$t / $this->V[$k+1][$k];\n                        for ($i = $k + 1; $i < $this->n; ++$i) {\n                            $this->V[$i][$j] += $t * $this->V[$i][$k];\n                        }\n                    }\n                }\n                for ($i = 0; $i < $this->n; ++$i) {\n                    $this->V[$i][$k] = 0.0;\n                }\n                $this->V[$k][$k] = 1.0;\n            }\n        }\n\n        // Main iteration loop for the singular values.\n        $pp   = $p - 1;\n        $iter = 0;\n        $eps  = pow(2.0, -52.0);\n\n        while ($p > 0) {\n            // Here is where a test for too many iterations would go.\n            // This section of the program inspects for negligible\n            // elements in the s and e arrays.  On completion the\n            // variables kase and k are set as follows:\n            // kase = 1  if s(p) and e[k-1] are negligible and k<p\n            // kase = 2  if s(k) is negligible and k<p\n            // kase = 3  if e[k-1] is negligible, k<p, and\n            //           s(k), ..., s(p) are not negligible (qr step).\n            // kase = 4  if e(p-1) is negligible (convergence).\n            for ($k = $p - 2; $k >= -1; --$k) {\n                if ($k == -1) {\n                    break;\n                }\n                if (abs($e[$k]) <= $eps * (abs($this->s[$k]) + abs($this->s[$k+1]))) {\n                    $e[$k] = 0.0;\n                    break;\n                }\n            }\n            if ($k == $p - 2) {\n                $kase = 4;\n            } else {\n                for ($ks = $p - 1; $ks >= $k; --$ks) {\n                    if ($ks == $k) {\n                        break;\n                    }\n                    $t = ($ks != $p ? abs($e[$ks]) : 0.) + ($ks != $k + 1 ? abs($e[$ks-1]) : 0.);\n                    if (abs($this->s[$ks]) <= $eps * $t) {\n                        $this->s[$ks] = 0.0;\n                        break;\n                    }\n                }\n                if ($ks == $k) {\n                    $kase = 3;\n                } elseif ($ks == $p-1) {\n                    $kase = 1;\n                } else {\n                    $kase = 2;\n                    $k = $ks;\n                }\n            }\n            ++$k;\n\n            // Perform the task indicated by kase.\n            switch ($kase) {\n                // Deflate negligible s(p).\n                case 1:\n                    $f = $e[$p-2];\n                    $e[$p-2] = 0.0;\n                    for ($j = $p - 2; $j >= $k; --$j) {\n                        $t  = hypo($this->s[$j], $f);\n                        $cs = $this->s[$j] / $t;\n                        $sn = $f / $t;\n                        $this->s[$j] = $t;\n                        if ($j != $k) {\n                            $f = -$sn * $e[$j-1];\n                            $e[$j-1] = $cs * $e[$j-1];\n                        }\n                        if ($wantv) {\n                            for ($i = 0; $i < $this->n; ++$i) {\n                                $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$p-1];\n                                $this->V[$i][$p-1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$p-1];\n                                $this->V[$i][$j] = $t;\n                            }\n                        }\n                    }\n                    break;\n                // Split at negligible s(k).\n                case 2:\n                    $f = $e[$k-1];\n                    $e[$k-1] = 0.0;\n                    for ($j = $k; $j < $p; ++$j) {\n                        $t = hypo($this->s[$j], $f);\n                        $cs = $this->s[$j] / $t;\n                        $sn = $f / $t;\n                        $this->s[$j] = $t;\n                        $f = -$sn * $e[$j];\n                        $e[$j] = $cs * $e[$j];\n                        if ($wantu) {\n                            for ($i = 0; $i < $this->m; ++$i) {\n                                $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$k-1];\n                                $this->U[$i][$k-1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$k-1];\n                                $this->U[$i][$j] = $t;\n                            }\n                        }\n                    }\n                    break;\n                // Perform one qr step.\n                case 3:\n                    // Calculate the shift.\n                    $scale = max(max(max(max(abs($this->s[$p-1]), abs($this->s[$p-2])), abs($e[$p-2])), abs($this->s[$k])), abs($e[$k]));\n                    $sp   = $this->s[$p-1] / $scale;\n                    $spm1 = $this->s[$p-2] / $scale;\n                    $epm1 = $e[$p-2] / $scale;\n                    $sk   = $this->s[$k] / $scale;\n                    $ek   = $e[$k] / $scale;\n                    $b    = (($spm1 + $sp) * ($spm1 - $sp) + $epm1 * $epm1) / 2.0;\n                    $c    = ($sp * $epm1) * ($sp * $epm1);\n                    $shift = 0.0;\n                    if (($b != 0.0) || ($c != 0.0)) {\n                        $shift = sqrt($b * $b + $c);\n                        if ($b < 0.0) {\n                            $shift = -$shift;\n                        }\n                        $shift = $c / ($b + $shift);\n                    }\n                    $f = ($sk + $sp) * ($sk - $sp) + $shift;\n                    $g = $sk * $ek;\n                    // Chase zeros.\n                    for ($j = $k; $j < $p-1; ++$j) {\n                        $t  = hypo($f, $g);\n                        $cs = $f/$t;\n                        $sn = $g/$t;\n                        if ($j != $k) {\n                            $e[$j-1] = $t;\n                        }\n                        $f = $cs * $this->s[$j] + $sn * $e[$j];\n                        $e[$j] = $cs * $e[$j] - $sn * $this->s[$j];\n                        $g = $sn * $this->s[$j+1];\n                        $this->s[$j+1] = $cs * $this->s[$j+1];\n                        if ($wantv) {\n                            for ($i = 0; $i < $this->n; ++$i) {\n                                $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$j+1];\n                                $this->V[$i][$j+1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$j+1];\n                                $this->V[$i][$j] = $t;\n                            }\n                        }\n                        $t = hypo($f, $g);\n                        $cs = $f/$t;\n                        $sn = $g/$t;\n                        $this->s[$j] = $t;\n                        $f = $cs * $e[$j] + $sn * $this->s[$j+1];\n                        $this->s[$j+1] = -$sn * $e[$j] + $cs * $this->s[$j+1];\n                        $g = $sn * $e[$j+1];\n                        $e[$j+1] = $cs * $e[$j+1];\n                        if ($wantu && ($j < $this->m - 1)) {\n                            for ($i = 0; $i < $this->m; ++$i) {\n                                $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$j+1];\n                                $this->U[$i][$j+1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$j+1];\n                                $this->U[$i][$j] = $t;\n                            }\n                        }\n                    }\n                    $e[$p-2] = $f;\n                    $iter = $iter + 1;\n                    break;\n                // Convergence.\n                case 4:\n                    // Make the singular values positive.\n                    if ($this->s[$k] <= 0.0) {\n                        $this->s[$k] = ($this->s[$k] < 0.0 ? -$this->s[$k] : 0.0);\n                        if ($wantv) {\n                            for ($i = 0; $i <= $pp; ++$i) {\n                                $this->V[$i][$k] = -$this->V[$i][$k];\n                            }\n                        }\n                    }\n                    // Order the singular values.\n                    while ($k < $pp) {\n                        if ($this->s[$k] >= $this->s[$k+1]) {\n                            break;\n                        }\n                        $t = $this->s[$k];\n                        $this->s[$k] = $this->s[$k+1];\n                        $this->s[$k+1] = $t;\n                        if ($wantv and ($k < $this->n - 1)) {\n                            for ($i = 0; $i < $this->n; ++$i) {\n                                $t = $this->V[$i][$k+1];\n                                $this->V[$i][$k+1] = $this->V[$i][$k];\n                                $this->V[$i][$k] = $t;\n                            }\n                        }\n                        if ($wantu and ($k < $this->m-1)) {\n                            for ($i = 0; $i < $this->m; ++$i) {\n                                $t = $this->U[$i][$k+1];\n                                $this->U[$i][$k+1] = $this->U[$i][$k];\n                                $this->U[$i][$k] = $t;\n                            }\n                        }\n                        ++$k;\n                    }\n                    $iter = 0;\n                    --$p;\n                    break;\n            } // end switch\n        } // end while\n\n    } // end constructor\n\n\n    /**\n     *    Return the left singular vectors\n     *\n     *    @access public\n     *    @return U\n     */\n    public function getU()\n    {\n        return new Matrix($this->U, $this->m, min($this->m + 1, $this->n));\n    }\n\n\n    /**\n     *    Return the right singular vectors\n     *\n     *    @access public\n     *    @return V\n     */\n    public function getV()\n    {\n        return new Matrix($this->V);\n    }\n\n\n    /**\n     *    Return the one-dimensional array of singular values\n     *\n     *    @access public\n     *    @return diagonal of S.\n     */\n    public function getSingularValues()\n    {\n        return $this->s;\n    }\n\n\n    /**\n     *    Return the diagonal matrix of singular values\n     *\n     *    @access public\n     *    @return S\n     */\n    public function getS()\n    {\n        for ($i = 0; $i < $this->n; ++$i) {\n            for ($j = 0; $j < $this->n; ++$j) {\n                $S[$i][$j] = 0.0;\n            }\n            $S[$i][$i] = $this->s[$i];\n        }\n        return new Matrix($S);\n    }\n\n\n    /**\n     *    Two norm\n     *\n     *    @access public\n     *    @return max(S)\n     */\n    public function norm2()\n    {\n        return $this->s[0];\n    }\n\n\n    /**\n     *    Two norm condition number\n     *\n     *    @access public\n     *    @return max(S)/min(S)\n     */\n    public function cond()\n    {\n        return $this->s[0] / $this->s[min($this->m, $this->n) - 1];\n    }\n\n\n    /**\n     *    Effective numerical matrix rank\n     *\n     *    @access public\n     *    @return Number of nonnegligible singular values.\n     */\n    public function rank()\n    {\n        $eps = pow(2.0, -52.0);\n        $tol = max($this->m, $this->n) * $this->s[0] * $eps;\n        $r = 0;\n        for ($i = 0; $i < count($this->s); ++$i) {\n            if ($this->s[$i] > $tol) {\n                ++$r;\n            }\n        }\n        return $r;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/utils/Error.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    Error handling\n *    @author Michael Bommarito\n *    @version 01292005\n */\n\n//Language constant\ndefine('JAMALANG', 'EN');\n\n\n//All errors may be defined by the following format:\n//define('ExceptionName', N);\n//$error['lang'][ExceptionName] = 'Error message';\n$error = array();\n\n/*\nI've used Babelfish and a little poor knowledge of Romance/Germanic languages for the translations here.\nFeel free to correct anything that looks amiss to you.\n*/\n\ndefine('POLYMORPHIC_ARGUMENT_EXCEPTION', -1);\n$error['EN'][POLYMORPHIC_ARGUMENT_EXCEPTION] = \"Invalid argument pattern for polymorphic function.\";\n$error['FR'][POLYMORPHIC_ARGUMENT_EXCEPTION] = \"Modèle inadmissible d'argument pour la fonction polymorphe.\".\n$error['DE'][POLYMORPHIC_ARGUMENT_EXCEPTION] = \"Unzulässiges Argumentmuster für polymorphe Funktion.\";\n\ndefine('ARGUMENT_TYPE_EXCEPTION', -2);\n$error['EN'][ARGUMENT_TYPE_EXCEPTION] = \"Invalid argument type.\";\n$error['FR'][ARGUMENT_TYPE_EXCEPTION] = \"Type inadmissible d'argument.\";\n$error['DE'][ARGUMENT_TYPE_EXCEPTION] = \"Unzulässige Argumentart.\";\n\ndefine('ARGUMENT_BOUNDS_EXCEPTION', -3);\n$error['EN'][ARGUMENT_BOUNDS_EXCEPTION] = \"Invalid argument range.\";\n$error['FR'][ARGUMENT_BOUNDS_EXCEPTION] = \"Gamme inadmissible d'argument.\";\n$error['DE'][ARGUMENT_BOUNDS_EXCEPTION] = \"Unzulässige Argumentstrecke.\";\n\ndefine('MATRIX_DIMENSION_EXCEPTION', -4);\n$error['EN'][MATRIX_DIMENSION_EXCEPTION] = \"Matrix dimensions are not equal.\";\n$error['FR'][MATRIX_DIMENSION_EXCEPTION] = \"Les dimensions de Matrix ne sont pas égales.\";\n$error['DE'][MATRIX_DIMENSION_EXCEPTION] = \"Matrixmaße sind nicht gleich.\";\n\ndefine('PRECISION_LOSS_EXCEPTION', -5);\n$error['EN'][PRECISION_LOSS_EXCEPTION] = \"Significant precision loss detected.\";\n$error['FR'][PRECISION_LOSS_EXCEPTION] = \"Perte significative de précision détectée.\";\n$error['DE'][PRECISION_LOSS_EXCEPTION] = \"Bedeutender Präzision Verlust ermittelte.\";\n\ndefine('MATRIX_SPD_EXCEPTION', -6);\n$error['EN'][MATRIX_SPD_EXCEPTION] = \"Can only perform operation on symmetric positive definite matrix.\";\n$error['FR'][MATRIX_SPD_EXCEPTION] = \"Perte significative de précision détectée.\";\n$error['DE'][MATRIX_SPD_EXCEPTION] = \"Bedeutender Präzision Verlust ermittelte.\";\n\ndefine('MATRIX_SINGULAR_EXCEPTION', -7);\n$error['EN'][MATRIX_SINGULAR_EXCEPTION] = \"Can only perform operation on singular matrix.\";\n\ndefine('MATRIX_RANK_EXCEPTION', -8);\n$error['EN'][MATRIX_RANK_EXCEPTION] = \"Can only perform operation on full-rank matrix.\";\n\ndefine('ARRAY_LENGTH_EXCEPTION', -9);\n$error['EN'][ARRAY_LENGTH_EXCEPTION] = \"Array length must be a multiple of m.\";\n\ndefine('ROW_LENGTH_EXCEPTION', -10);\n$error['EN'][ROW_LENGTH_EXCEPTION] = \"All rows must have the same length.\";\n\n/**\n *    Custom error handler\n *    @param int $num Error number\n */\nfunction JAMAError($errorNumber = null)\n{\n    global $error;\n\n    if (isset($errorNumber)) {\n        if (isset($error[JAMALANG][$errorNumber])) {\n            return $error[JAMALANG][$errorNumber];\n        } else {\n            return $error['EN'][$errorNumber];\n        }\n    } else {\n        return (\"Invalid argument to JAMAError()\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/JAMA/utils/Maths.php",
    "content": "<?php\n/**\n *    @package JAMA\n *\n *    Pythagorean Theorem:\n *\n *    a = 3\n *    b = 4\n *    r = sqrt(square(a) + square(b))\n *    r = 5\n *\n *    r = sqrt(a^2 + b^2) without under/overflow.\n */\nfunction hypo($a, $b)\n{\n    if (abs($a) > abs($b)) {\n        $r = $b / $a;\n        $r = abs($a) * sqrt(1 + $r * $r);\n    } elseif ($b != 0) {\n        $r = $a / $b;\n        $r = abs($b) * sqrt(1 + $r * $r);\n    } else {\n        $r = 0.0;\n    }\n    return $r;\n}    //    function hypo()\n\n\n/**\n *    Mike Bommarito's version.\n *    Compute n-dimensional hyotheneuse.\n *\nfunction hypot() {\n    $s = 0;\n    foreach (func_get_args() as $d) {\n        if (is_numeric($d)) {\n            $s += pow($d, 2);\n        } else {\n            throw new PHPExcel_Calculation_Exception(JAMAError(ARGUMENT_TYPE_EXCEPTION));\n        }\n    }\n    return sqrt($s);\n}\n*/\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_OLE_ChainedBlockStream\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_OLE\n * @copyright  Copyright (c) 2006 - 2007 Christian Schmidt\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_OLE_ChainedBlockStream\n{\n    /**\n     * The OLE container of the file that is being read.\n     * @var OLE\n     */\n    public $ole;\n\n    /**\n     * Parameters specified by fopen().\n     * @var array\n     */\n    public $params;\n\n    /**\n     * The binary data of the file.\n     * @var  string\n     */\n    public $data;\n\n    /**\n     * The file pointer.\n     * @var  int  byte offset\n     */\n    public $pos;\n\n    /**\n     * Implements support for fopen().\n     * For creating streams using this wrapper, use OLE_PPS_File::getStream().\n     *\n     * @param    string    $path            resource name including scheme, e.g.\n     *                                    ole-chainedblockstream://oleInstanceId=1\n     * @param    string    $mode            only \"r\" is supported\n     * @param    int        $options        mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH\n     * @param    string  &$openedPath    absolute path of the opened stream (out parameter)\n     * @return    bool    true on success\n     */\n    public function stream_open($path, $mode, $options, &$openedPath)\n    {\n        if ($mode != 'r') {\n            if ($options & STREAM_REPORT_ERRORS) {\n                trigger_error('Only reading is supported', E_USER_WARNING);\n            }\n            return false;\n        }\n\n        // 25 is length of \"ole-chainedblockstream://\"\n        parse_str(substr($path, 25), $this->params);\n        if (!isset($this->params['oleInstanceId'], $this->params['blockId'], $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) {\n            if ($options & STREAM_REPORT_ERRORS) {\n                trigger_error('OLE stream not found', E_USER_WARNING);\n            }\n            return false;\n        }\n        $this->ole = $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']];\n\n        $blockId = $this->params['blockId'];\n        $this->data = '';\n        if (isset($this->params['size']) && $this->params['size'] < $this->ole->bigBlockThreshold && $blockId != $this->ole->root->_StartBlock) {\n            // Block id refers to small blocks\n            $rootPos = $this->ole->_getBlockOffset($this->ole->root->_StartBlock);\n            while ($blockId != -2) {\n                $pos = $rootPos + $blockId * $this->ole->bigBlockSize;\n                $blockId = $this->ole->sbat[$blockId];\n                fseek($this->ole->_file_handle, $pos);\n                $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize);\n            }\n        } else {\n            // Block id refers to big blocks\n            while ($blockId != -2) {\n                $pos = $this->ole->_getBlockOffset($blockId);\n                fseek($this->ole->_file_handle, $pos);\n                $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize);\n                $blockId = $this->ole->bbat[$blockId];\n            }\n        }\n        if (isset($this->params['size'])) {\n            $this->data = substr($this->data, 0, $this->params['size']);\n        }\n\n        if ($options & STREAM_USE_PATH) {\n            $openedPath = $path;\n        }\n\n        return true;\n    }\n\n    /**\n     * Implements support for fclose().\n     *\n     */\n    public function stream_close()\n    {\n        $this->ole = null;\n        unset($GLOBALS['_OLE_INSTANCES']);\n    }\n\n    /**\n     * Implements support for fread(), fgets() etc.\n     *\n     * @param   int        $count    maximum number of bytes to read\n     * @return  string\n     */\n    public function stream_read($count)\n    {\n        if ($this->stream_eof()) {\n            return false;\n        }\n        $s = substr($this->data, $this->pos, $count);\n        $this->pos += $count;\n        return $s;\n    }\n\n    /**\n     * Implements support for feof().\n     *\n     * @return  bool  TRUE if the file pointer is at EOF; otherwise FALSE\n     */\n    public function stream_eof()\n    {\n        return $this->pos >= strlen($this->data);\n    }\n\n    /**\n     * Returns the position of the file pointer, i.e. its offset into the file\n     * stream. Implements support for ftell().\n     *\n     * @return  int\n     */\n    public function stream_tell()\n    {\n        return $this->pos;\n    }\n\n    /**\n     * Implements support for fseek().\n     *\n     * @param    int        $offset    byte offset\n     * @param    int        $whence    SEEK_SET, SEEK_CUR or SEEK_END\n     * @return    bool\n     */\n    public function stream_seek($offset, $whence)\n    {\n        if ($whence == SEEK_SET && $offset >= 0) {\n            $this->pos = $offset;\n        } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) {\n            $this->pos += $offset;\n        } elseif ($whence == SEEK_END && -$offset <= sizeof($this->data)) {\n            $this->pos = strlen($this->data) + $offset;\n        } else {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Implements support for fstat(). Currently the only supported field is\n     * \"size\".\n     * @return  array\n     */\n    public function stream_stat()\n    {\n        return array(\n            'size' => strlen($this->data),\n            );\n    }\n\n    // Methods used by stream_wrapper_register() that are not implemented:\n    // bool stream_flush ( void )\n    // int stream_write ( string data )\n    // bool rename ( string path_from, string path_to )\n    // bool mkdir ( string path, int mode, int options )\n    // bool rmdir ( string path, int options )\n    // bool dir_opendir ( string path, int options )\n    // array url_stat ( string path, int flags )\n    // string dir_readdir ( void )\n    // bool dir_rewinddir ( void )\n    // bool dir_closedir ( void )\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/OLE/PPS/File.php",
    "content": "<?php\n/* vim: set expandtab tabstop=4 shiftwidth=4: */\n// +----------------------------------------------------------------------+\n// | PHP Version 4                                                        |\n// +----------------------------------------------------------------------+\n// | Copyright (c) 1997-2002 The PHP Group                                |\n// +----------------------------------------------------------------------+\n// | This source file is subject to version 2.02 of the PHP license,      |\n// | that is bundled with this package in the file LICENSE, and is        |\n// | available at through the world-wide-web at                           |\n// | http://www.php.net/license/2_02.txt.                                 |\n// | If you did not receive a copy of the PHP license and are unable to   |\n// | obtain it through the world-wide-web, please send a note to          |\n// | license@php.net so we can mail you a copy immediately.               |\n// +----------------------------------------------------------------------+\n// | Author: Xavier Noguer <xnoguer@php.net>                              |\n// | Based on OLE::Storage_Lite by Kawai, Takanori                        |\n// +----------------------------------------------------------------------+\n//\n// $Id: File.php,v 1.11 2007/02/13 21:00:42 schmidt Exp $\n\n\n/**\n* Class for creating File PPS's for OLE containers\n*\n* @author   Xavier Noguer <xnoguer@php.net>\n* @category PHPExcel\n* @package  PHPExcel_Shared_OLE\n*/\nclass PHPExcel_Shared_OLE_PPS_File extends PHPExcel_Shared_OLE_PPS\n{\n    /**\n    * The constructor\n    *\n    * @access public\n    * @param string $name The name of the file (in Unicode)\n    * @see OLE::Asc2Ucs()\n    */\n    public function __construct($name)\n    {\n        parent::__construct(null, $name, PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE, null, null, null, null, null, '', array());\n    }\n\n    /**\n    * Initialization method. Has to be called right after OLE_PPS_File().\n    *\n    * @access public\n    * @return mixed true on success\n    */\n    public function init()\n    {\n        return true;\n    }\n\n    /**\n    * Append data to PPS\n    *\n    * @access public\n    * @param string $data The data to append\n    */\n    public function append($data)\n    {\n        $this->_data .= $data;\n    }\n\n    /**\n     * Returns a stream for reading this file using fread() etc.\n     * @return  resource  a read-only stream\n     */\n    public function getStream()\n    {\n        $this->ole->getStream($this);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/OLE/PPS/Root.php",
    "content": "<?php\n/* vim: set expandtab tabstop=4 shiftwidth=4: */\n// +----------------------------------------------------------------------+\n// | PHP Version 4                                                        |\n// +----------------------------------------------------------------------+\n// | Copyright (c) 1997-2002 The PHP Group                                |\n// +----------------------------------------------------------------------+\n// | This source file is subject to version 2.02 of the PHP license,      |\n// | that is bundled with this package in the file LICENSE, and is        |\n// | available at through the world-wide-web at                           |\n// | http://www.php.net/license/2_02.txt.                                 |\n// | If you did not receive a copy of the PHP license and are unable to   |\n// | obtain it through the world-wide-web, please send a note to          |\n// | license@php.net so we can mail you a copy immediately.               |\n// +----------------------------------------------------------------------+\n// | Author: Xavier Noguer <xnoguer@php.net>                              |\n// | Based on OLE::Storage_Lite by Kawai, Takanori                        |\n// +----------------------------------------------------------------------+\n//\n// $Id: Root.php,v 1.9 2005/04/23 21:53:49 dufuz Exp $\n\n\n/**\n* Class for creating Root PPS's for OLE containers\n*\n* @author   Xavier Noguer <xnoguer@php.net>\n* @category PHPExcel\n* @package  PHPExcel_Shared_OLE\n*/\nclass PHPExcel_Shared_OLE_PPS_Root extends PHPExcel_Shared_OLE_PPS\n{\n\n    /**\n     * Directory for temporary files\n     * @var string\n     */\n    protected $tempDirectory = null;\n\n    /**\n     * @param integer $time_1st A timestamp\n     * @param integer $time_2nd A timestamp\n     */\n    public function __construct($time_1st, $time_2nd, $raChild)\n    {\n        $this->_tempDir = PHPExcel_Shared_File::sys_get_temp_dir();\n\n        parent::__construct(null, PHPExcel_Shared_OLE::Asc2Ucs('Root Entry'), PHPExcel_Shared_OLE::OLE_PPS_TYPE_ROOT, null, null, null, $time_1st, $time_2nd, null, $raChild);\n    }\n\n    /**\n    * Method for saving the whole OLE container (including files).\n    * In fact, if called with an empty argument (or '-'), it saves to a\n    * temporary file and then outputs it's contents to stdout.\n    * If a resource pointer to a stream created by fopen() is passed\n    * it will be used, but you have to close such stream by yourself.\n    *\n    * @param string|resource $filename The name of the file or stream where to save the OLE container.\n    * @access public\n    * @return mixed true on success\n    */\n    public function save($filename)\n    {\n        // Initial Setting for saving\n        $this->_BIG_BLOCK_SIZE  = pow(\n            2,\n            (isset($this->_BIG_BLOCK_SIZE))? self::adjust2($this->_BIG_BLOCK_SIZE) : 9\n        );\n        $this->_SMALL_BLOCK_SIZE= pow(\n            2,\n            (isset($this->_SMALL_BLOCK_SIZE))?  self::adjust2($this->_SMALL_BLOCK_SIZE) : 6\n        );\n\n        if (is_resource($filename)) {\n            $this->_FILEH_ = $filename;\n        } elseif ($filename == '-' || $filename == '') {\n            if ($this->tempDirectory === null) {\n                $this->tempDirectory = PHPExcel_Shared_File::sys_get_temp_dir();\n            }\n            $this->_tmp_filename = tempnam($this->tempDirectory, \"OLE_PPS_Root\");\n            $this->_FILEH_ = fopen($this->_tmp_filename, \"w+b\");\n            if ($this->_FILEH_ == false) {\n                throw new PHPExcel_Writer_Exception(\"Can't create temporary file.\");\n            }\n        } else {\n            $this->_FILEH_ = fopen($filename, \"wb\");\n        }\n        if ($this->_FILEH_ == false) {\n            throw new PHPExcel_Writer_Exception(\"Can't open $filename. It may be in use or protected.\");\n        }\n        // Make an array of PPS's (for Save)\n        $aList = array();\n        PHPExcel_Shared_OLE_PPS::_savePpsSetPnt($aList, array($this));\n        // calculate values for header\n        list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo);\n        // Save Header\n        $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt);\n\n        // Make Small Data string (write SBD)\n        $this->_data = $this->_makeSmallData($aList);\n\n        // Write BB\n        $this->_saveBigData($iSBDcnt, $aList);\n        // Write PPS\n        $this->_savePps($aList);\n        // Write Big Block Depot and BDList and Adding Header informations\n        $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt);\n\n        if (!is_resource($filename)) {\n            fclose($this->_FILEH_);\n        }\n\n        return true;\n    }\n\n    /**\n    * Calculate some numbers\n    *\n    * @access public\n    * @param array $raList Reference to an array of PPS's\n    * @return array The array of numbers\n    */\n    public function _calcSize(&$raList)\n    {\n        // Calculate Basic Setting\n        list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0);\n        $iSmallLen = 0;\n        $iSBcnt = 0;\n        $iCount = count($raList);\n        for ($i = 0; $i < $iCount; ++$i) {\n            if ($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE) {\n                $raList[$i]->Size = $raList[$i]->_DataLen();\n                if ($raList[$i]->Size < PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) {\n                    $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE)\n                                  + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);\n                } else {\n                    $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) +\n                        (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));\n                }\n            }\n        }\n        $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE;\n        $iSlCnt = floor($this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE);\n        $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0);\n        $iBBcnt +=  (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) +\n                      (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0));\n        $iCnt = count($raList);\n        $iBdCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_PPS_SIZE;\n        $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0));\n\n        return array($iSBDcnt, $iBBcnt, $iPPScnt);\n    }\n\n    /**\n    * Helper function for caculating a magic value for block sizes\n    *\n    * @access public\n    * @param integer $i2 The argument\n    * @see save()\n    * @return integer\n    */\n    private static function adjust2($i2)\n    {\n        $iWk = log($i2)/log(2);\n        return ($iWk > floor($iWk))? floor($iWk)+1:$iWk;\n    }\n\n    /**\n    * Save OLE header\n    *\n    * @access public\n    * @param integer $iSBDcnt\n    * @param integer $iBBcnt\n    * @param integer $iPPScnt\n    */\n    public function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt)\n    {\n        $FILE = $this->_FILEH_;\n\n        // Calculate Basic Setting\n        $iBlCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE;\n        $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE;\n\n        $iBdExL = 0;\n        $iAll = $iBBcnt + $iPPScnt + $iSBDcnt;\n        $iAllW = $iAll;\n        $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);\n        $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);\n\n        // Calculate BD count\n        if ($iBdCnt > $i1stBdL) {\n            while (1) {\n                ++$iBdExL;\n                ++$iAllW;\n                $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);\n                $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);\n                if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) {\n                    break;\n                }\n            }\n        }\n\n        // Save Header\n        fwrite(\n            $FILE,\n            \"\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1\"\n            . \"\\x00\\x00\\x00\\x00\"\n            . \"\\x00\\x00\\x00\\x00\"\n            . \"\\x00\\x00\\x00\\x00\"\n            . \"\\x00\\x00\\x00\\x00\"\n            . pack(\"v\", 0x3b)\n            . pack(\"v\", 0x03)\n            . pack(\"v\", -2)\n            . pack(\"v\", 9)\n            . pack(\"v\", 6)\n            . pack(\"v\", 0)\n            . \"\\x00\\x00\\x00\\x00\"\n            . \"\\x00\\x00\\x00\\x00\"\n            . pack(\"V\", $iBdCnt)\n            . pack(\"V\", $iBBcnt+$iSBDcnt) //ROOT START\n            . pack(\"V\", 0)\n            . pack(\"V\", 0x1000)\n            . pack(\"V\", $iSBDcnt ? 0 : -2) //Small Block Depot\n            . pack(\"V\", $iSBDcnt)\n        );\n        // Extra BDList Start, Count\n        if ($iBdCnt < $i1stBdL) {\n            fwrite(\n                $FILE,\n                pack(\"V\", -2) // Extra BDList Start\n                . pack(\"V\", 0)// Extra BDList Count\n            );\n        } else {\n            fwrite($FILE, pack(\"V\", $iAll+$iBdCnt) . pack(\"V\", $iBdExL));\n        }\n\n        // BDList\n        for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; ++$i) {\n            fwrite($FILE, pack(\"V\", $iAll+$i));\n        }\n        if ($i < $i1stBdL) {\n            $jB = $i1stBdL - $i;\n            for ($j = 0; $j < $jB; ++$j) {\n                fwrite($FILE, (pack(\"V\", -1)));\n            }\n        }\n    }\n\n    /**\n    * Saving big data (PPS's with data bigger than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL)\n    *\n    * @access public\n    * @param integer $iStBlk\n    * @param array &$raList Reference to array of PPS's\n    */\n    public function _saveBigData($iStBlk, &$raList)\n    {\n        $FILE = $this->_FILEH_;\n\n        // cycle through PPS's\n        $iCount = count($raList);\n        for ($i = 0; $i < $iCount; ++$i) {\n            if ($raList[$i]->Type != PHPExcel_Shared_OLE::OLE_PPS_TYPE_DIR) {\n                $raList[$i]->Size = $raList[$i]->_DataLen();\n                if (($raList[$i]->Size >= PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) || (($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_ROOT) && isset($raList[$i]->_data))) {\n                    // Write Data\n                    //if (isset($raList[$i]->_PPS_FILE)) {\n                    //    $iLen = 0;\n                    //    fseek($raList[$i]->_PPS_FILE, 0); // To The Top\n                    //    while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) {\n                    //        $iLen += strlen($sBuff);\n                    //        fwrite($FILE, $sBuff);\n                    //    }\n                    //} else {\n                        fwrite($FILE, $raList[$i]->_data);\n                    //}\n\n                    if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) {\n                        fwrite($FILE, str_repeat(\"\\x00\", $this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)));\n                    }\n                    // Set For PPS\n                    $raList[$i]->_StartBlock = $iStBlk;\n                    $iStBlk +=\n                            (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) +\n                                (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));\n                }\n                // Close file for each PPS, and unlink it\n                //if (isset($raList[$i]->_PPS_FILE)) {\n                //    fclose($raList[$i]->_PPS_FILE);\n                //    $raList[$i]->_PPS_FILE = null;\n                //    unlink($raList[$i]->_tmp_filename);\n                //}\n            }\n        }\n    }\n\n    /**\n    * get small data (PPS's with data smaller than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL)\n    *\n    * @access public\n    * @param array &$raList Reference to array of PPS's\n    */\n    public function _makeSmallData(&$raList)\n    {\n        $sRes = '';\n        $FILE = $this->_FILEH_;\n        $iSmBlk = 0;\n\n        $iCount = count($raList);\n        for ($i = 0; $i < $iCount; ++$i) {\n            // Make SBD, small data string\n            if ($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE) {\n                if ($raList[$i]->Size <= 0) {\n                    continue;\n                }\n                if ($raList[$i]->Size < PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) {\n                    $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE)\n                                  + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);\n                    // Add to SBD\n                    $jB = $iSmbCnt - 1;\n                    for ($j = 0; $j < $jB; ++$j) {\n                        fwrite($FILE, pack(\"V\", $j+$iSmBlk+1));\n                    }\n                    fwrite($FILE, pack(\"V\", -2));\n\n                    //// Add to Data String(this will be written for RootEntry)\n                    //if ($raList[$i]->_PPS_FILE) {\n                    //    fseek($raList[$i]->_PPS_FILE, 0); // To The Top\n                    //    while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) {\n                    //        $sRes .= $sBuff;\n                    //    }\n                    //} else {\n                        $sRes .= $raList[$i]->_data;\n                    //}\n                    if ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) {\n                        $sRes .= str_repeat(\"\\x00\", $this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE));\n                    }\n                    // Set for PPS\n                    $raList[$i]->_StartBlock = $iSmBlk;\n                    $iSmBlk += $iSmbCnt;\n                }\n            }\n        }\n        $iSbCnt = floor($this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE);\n        if ($iSmBlk % $iSbCnt) {\n            $iB = $iSbCnt - ($iSmBlk % $iSbCnt);\n            for ($i = 0; $i < $iB; ++$i) {\n                fwrite($FILE, pack(\"V\", -1));\n            }\n        }\n        return $sRes;\n    }\n\n    /**\n    * Saves all the PPS's WKs\n    *\n    * @access public\n    * @param array $raList Reference to an array with all PPS's\n    */\n    public function _savePps(&$raList)\n    {\n        // Save each PPS WK\n        $iC = count($raList);\n        for ($i = 0; $i < $iC; ++$i) {\n            fwrite($this->_FILEH_, $raList[$i]->_getPpsWk());\n        }\n        // Adjust for Block\n        $iCnt = count($raList);\n        $iBCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_PPS_SIZE;\n        if ($iCnt % $iBCnt) {\n            fwrite($this->_FILEH_, str_repeat(\"\\x00\", ($iBCnt - ($iCnt % $iBCnt)) * PHPExcel_Shared_OLE::OLE_PPS_SIZE));\n        }\n    }\n\n    /**\n    * Saving Big Block Depot\n    *\n    * @access public\n    * @param integer $iSbdSize\n    * @param integer $iBsize\n    * @param integer $iPpsCnt\n    */\n    public function _saveBbd($iSbdSize, $iBsize, $iPpsCnt)\n    {\n        $FILE = $this->_FILEH_;\n        // Calculate Basic Setting\n        $iBbCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE;\n        $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE;\n\n        $iBdExL = 0;\n        $iAll = $iBsize + $iPpsCnt + $iSbdSize;\n        $iAllW = $iAll;\n        $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);\n        $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);\n        // Calculate BD count\n        if ($iBdCnt >$i1stBdL) {\n            while (1) {\n                ++$iBdExL;\n                ++$iAllW;\n                $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);\n                $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);\n                if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) {\n                    break;\n                }\n            }\n        }\n\n        // Making BD\n        // Set for SBD\n        if ($iSbdSize > 0) {\n            for ($i = 0; $i < ($iSbdSize - 1); ++$i) {\n                fwrite($FILE, pack(\"V\", $i+1));\n            }\n            fwrite($FILE, pack(\"V\", -2));\n        }\n        // Set for B\n        for ($i = 0; $i < ($iBsize - 1); ++$i) {\n            fwrite($FILE, pack(\"V\", $i+$iSbdSize+1));\n        }\n        fwrite($FILE, pack(\"V\", -2));\n\n        // Set for PPS\n        for ($i = 0; $i < ($iPpsCnt - 1); ++$i) {\n            fwrite($FILE, pack(\"V\", $i+$iSbdSize+$iBsize+1));\n        }\n        fwrite($FILE, pack(\"V\", -2));\n        // Set for BBD itself ( 0xFFFFFFFD : BBD)\n        for ($i = 0; $i < $iBdCnt; ++$i) {\n            fwrite($FILE, pack(\"V\", 0xFFFFFFFD));\n        }\n        // Set for ExtraBDList\n        for ($i = 0; $i < $iBdExL; ++$i) {\n            fwrite($FILE, pack(\"V\", 0xFFFFFFFC));\n        }\n        // Adjust for Block\n        if (($iAllW + $iBdCnt) % $iBbCnt) {\n            $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt));\n            for ($i = 0; $i < $iBlock; ++$i) {\n                fwrite($FILE, pack(\"V\", -1));\n            }\n        }\n        // Extra BDList\n        if ($iBdCnt > $i1stBdL) {\n            $iN=0;\n            $iNb=0;\n            for ($i = $i1stBdL; $i < $iBdCnt; $i++, ++$iN) {\n                if ($iN >= ($iBbCnt - 1)) {\n                    $iN = 0;\n                    ++$iNb;\n                    fwrite($FILE, pack(\"V\", $iAll+$iBdCnt+$iNb));\n                }\n                fwrite($FILE, pack(\"V\", $iBsize+$iSbdSize+$iPpsCnt+$i));\n            }\n            if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) {\n                $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1));\n                for ($i = 0; $i < $iB; ++$i) {\n                    fwrite($FILE, pack(\"V\", -1));\n                }\n            }\n            fwrite($FILE, pack(\"V\", -2));\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/OLE/PPS.php",
    "content": "<?php\n/* vim: set expandtab tabstop=4 shiftwidth=4: */\n// +----------------------------------------------------------------------+\n// | PHP Version 4                                                        |\n// +----------------------------------------------------------------------+\n// | Copyright (c) 1997-2002 The PHP Group                                |\n// +----------------------------------------------------------------------+\n// | This source file is subject to version 2.02 of the PHP license,      |\n// | that is bundled with this package in the file LICENSE, and is        |\n// | available at through the world-wide-web at                           |\n// | http://www.php.net/license/2_02.txt.                                 |\n// | If you did not receive a copy of the PHP license and are unable to   |\n// | obtain it through the world-wide-web, please send a note to          |\n// | license@php.net so we can mail you a copy immediately.               |\n// +----------------------------------------------------------------------+\n// | Author: Xavier Noguer <xnoguer@php.net>                              |\n// | Based on OLE::Storage_Lite by Kawai, Takanori                        |\n// +----------------------------------------------------------------------+\n//\n// $Id: PPS.php,v 1.7 2007/02/13 21:00:42 schmidt Exp $\n\n\n/**\n* Class for creating PPS's for OLE containers\n*\n* @author   Xavier Noguer <xnoguer@php.net>\n* @category PHPExcel\n* @package  PHPExcel_Shared_OLE\n*/\nclass PHPExcel_Shared_OLE_PPS\n{\n    /**\n    * The PPS index\n    * @var integer\n    */\n    public $No;\n\n    /**\n    * The PPS name (in Unicode)\n    * @var string\n    */\n    public $Name;\n\n    /**\n    * The PPS type. Dir, Root or File\n    * @var integer\n    */\n    public $Type;\n\n    /**\n    * The index of the previous PPS\n    * @var integer\n    */\n    public $PrevPps;\n\n    /**\n    * The index of the next PPS\n    * @var integer\n    */\n    public $NextPps;\n\n    /**\n    * The index of it's first child if this is a Dir or Root PPS\n    * @var integer\n    */\n    public $DirPps;\n\n    /**\n    * A timestamp\n    * @var integer\n    */\n    public $Time1st;\n\n    /**\n    * A timestamp\n    * @var integer\n    */\n    public $Time2nd;\n\n    /**\n    * Starting block (small or big) for this PPS's data  inside the container\n    * @var integer\n    */\n    public $_StartBlock;\n\n    /**\n    * The size of the PPS's data (in bytes)\n    * @var integer\n    */\n    public $Size;\n\n    /**\n    * The PPS's data (only used if it's not using a temporary file)\n    * @var string\n    */\n    public $_data;\n\n    /**\n    * Array of child PPS's (only used by Root and Dir PPS's)\n    * @var array\n    */\n    public $children = array();\n\n    /**\n    * Pointer to OLE container\n    * @var OLE\n    */\n    public $ole;\n\n    /**\n    * The constructor\n    *\n    * @access public\n    * @param integer $No   The PPS index\n    * @param string  $name The PPS name\n    * @param integer $type The PPS type. Dir, Root or File\n    * @param integer $prev The index of the previous PPS\n    * @param integer $next The index of the next PPS\n    * @param integer $dir  The index of it's first child if this is a Dir or Root PPS\n    * @param integer $time_1st A timestamp\n    * @param integer $time_2nd A timestamp\n    * @param string  $data  The (usually binary) source data of the PPS\n    * @param array   $children Array containing children PPS for this PPS\n    */\n    public function __construct($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children)\n    {\n        $this->No      = $No;\n        $this->Name    = $name;\n        $this->Type    = $type;\n        $this->PrevPps = $prev;\n        $this->NextPps = $next;\n        $this->DirPps  = $dir;\n        $this->Time1st = $time_1st;\n        $this->Time2nd = $time_2nd;\n        $this->_data      = $data;\n        $this->children   = $children;\n        if ($data != '') {\n            $this->Size = strlen($data);\n        } else {\n            $this->Size = 0;\n        }\n    }\n\n    /**\n    * Returns the amount of data saved for this PPS\n    *\n    * @access public\n    * @return integer The amount of data (in bytes)\n    */\n    public function _DataLen()\n    {\n        if (!isset($this->_data)) {\n            return 0;\n        }\n        //if (isset($this->_PPS_FILE)) {\n        //    fseek($this->_PPS_FILE, 0);\n        //    $stats = fstat($this->_PPS_FILE);\n        //    return $stats[7];\n        //} else {\n            return strlen($this->_data);\n        //}\n    }\n\n    /**\n    * Returns a string with the PPS's WK (What is a WK?)\n    *\n    * @access public\n    * @return string The binary string\n    */\n    public function _getPpsWk()\n    {\n        $ret = str_pad($this->Name, 64, \"\\x00\");\n\n        $ret .= pack(\"v\", strlen($this->Name) + 2)  // 66\n              . pack(\"c\", $this->Type)              // 67\n              . pack(\"c\", 0x00) //UK                // 68\n              . pack(\"V\", $this->PrevPps) //Prev    // 72\n              . pack(\"V\", $this->NextPps) //Next    // 76\n              . pack(\"V\", $this->DirPps)  //Dir     // 80\n              . \"\\x00\\x09\\x02\\x00\"                  // 84\n              . \"\\x00\\x00\\x00\\x00\"                  // 88\n              . \"\\xc0\\x00\\x00\\x00\"                  // 92\n              . \"\\x00\\x00\\x00\\x46\"                  // 96 // Seems to be ok only for Root\n              . \"\\x00\\x00\\x00\\x00\"                  // 100\n              . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time1st)       // 108\n              . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time2nd)       // 116\n              . pack(\"V\", isset($this->_StartBlock)?\n                        $this->_StartBlock:0)        // 120\n              . pack(\"V\", $this->Size)               // 124\n              . pack(\"V\", 0);                        // 128\n        return $ret;\n    }\n\n    /**\n    * Updates index and pointers to previous, next and children PPS's for this\n    * PPS. I don't think it'll work with Dir PPS's.\n    *\n    * @access public\n    * @param array &$raList Reference to the array of PPS's for the whole OLE\n    *                          container\n    * @return integer          The index for this PPS\n    */\n    public static function _savePpsSetPnt(&$raList, $to_save, $depth = 0)\n    {\n        if (!is_array($to_save) || (empty($to_save))) {\n            return 0xFFFFFFFF;\n        } elseif (count($to_save) == 1) {\n            $cnt = count($raList);\n            // If the first entry, it's the root... Don't clone it!\n            $raList[$cnt] = ( $depth == 0 ) ? $to_save[0] : clone $to_save[0];\n            $raList[$cnt]->No = $cnt;\n            $raList[$cnt]->PrevPps = 0xFFFFFFFF;\n            $raList[$cnt]->NextPps = 0xFFFFFFFF;\n            $raList[$cnt]->DirPps  = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++);\n        } else {\n            $iPos  = floor(count($to_save) / 2);\n            $aPrev = array_slice($to_save, 0, $iPos);\n            $aNext = array_slice($to_save, $iPos + 1);\n            $cnt   = count($raList);\n            // If the first entry, it's the root... Don't clone it!\n            $raList[$cnt] = ( $depth == 0 ) ? $to_save[$iPos] : clone $to_save[$iPos];\n            $raList[$cnt]->No = $cnt;\n            $raList[$cnt]->PrevPps = self::_savePpsSetPnt($raList, $aPrev, $depth++);\n            $raList[$cnt]->NextPps = self::_savePpsSetPnt($raList, $aNext, $depth++);\n            $raList[$cnt]->DirPps  = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++);\n\n        }\n        return $cnt;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/OLE.php",
    "content": "<?php\n/* vim: set expandtab tabstop=4 shiftwidth=4: */\n// +----------------------------------------------------------------------+\n// | PHP Version 4                                                        |\n// +----------------------------------------------------------------------+\n// | Copyright (c) 1997-2002 The PHP Group                                |\n// +----------------------------------------------------------------------+\n// | This source file is subject to version 2.02 of the PHP license,      |\n// | that is bundled with this package in the file LICENSE, and is        |\n// | available at through the world-wide-web at                           |\n// | http://www.php.net/license/2_02.txt.                                 |\n// | If you did not receive a copy of the PHP license and are unable to   |\n// | obtain it through the world-wide-web, please send a note to          |\n// | license@php.net so we can mail you a copy immediately.               |\n// +----------------------------------------------------------------------+\n// | Author: Xavier Noguer <xnoguer@php.net>                              |\n// | Based on OLE::Storage_Lite by Kawai, Takanori                        |\n// +----------------------------------------------------------------------+\n//\n// $Id: OLE.php,v 1.13 2007/03/07 14:38:25 schmidt Exp $\n\n\n/**\n* Array for storing OLE instances that are accessed from\n* OLE_ChainedBlockStream::stream_open().\n* @var  array\n*/\n$GLOBALS['_OLE_INSTANCES'] = array();\n\n/**\n* OLE package base class.\n*\n* @author   Xavier Noguer <xnoguer@php.net>\n* @author   Christian Schmidt <schmidt@php.net>\n* @category   PHPExcel\n* @package    PHPExcel_Shared_OLE\n*/\nclass PHPExcel_Shared_OLE\n{\n    const OLE_PPS_TYPE_ROOT   =      5;\n    const OLE_PPS_TYPE_DIR    =      1;\n    const OLE_PPS_TYPE_FILE   =      2;\n    const OLE_DATA_SIZE_SMALL = 0x1000;\n    const OLE_LONG_INT_SIZE   =      4;\n    const OLE_PPS_SIZE        =   0x80;\n\n    /**\n     * The file handle for reading an OLE container\n     * @var resource\n    */\n    public $_file_handle;\n\n    /**\n    * Array of PPS's found on the OLE container\n    * @var array\n    */\n    public $_list = array();\n\n    /**\n     * Root directory of OLE container\n     * @var OLE_PPS_Root\n    */\n    public $root;\n\n    /**\n     * Big Block Allocation Table\n     * @var array  (blockId => nextBlockId)\n    */\n    public $bbat;\n\n    /**\n     * Short Block Allocation Table\n     * @var array  (blockId => nextBlockId)\n    */\n    public $sbat;\n\n    /**\n     * Size of big blocks. This is usually 512.\n     * @var  int  number of octets per block.\n    */\n    public $bigBlockSize;\n\n    /**\n     * Size of small blocks. This is usually 64.\n     * @var  int  number of octets per block\n    */\n    public $smallBlockSize;\n\n    /**\n     * Reads an OLE container from the contents of the file given.\n     *\n     * @acces public\n     * @param string $file\n     * @return mixed true on success, PEAR_Error on failure\n    */\n    public function read($file)\n    {\n        $fh = fopen($file, \"r\");\n        if (!$fh) {\n            throw new PHPExcel_Reader_Exception(\"Can't open file $file\");\n        }\n        $this->_file_handle = $fh;\n\n        $signature = fread($fh, 8);\n        if (\"\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1\" != $signature) {\n            throw new PHPExcel_Reader_Exception(\"File doesn't seem to be an OLE container.\");\n        }\n        fseek($fh, 28);\n        if (fread($fh, 2) != \"\\xFE\\xFF\") {\n            // This shouldn't be a problem in practice\n            throw new PHPExcel_Reader_Exception(\"Only Little-Endian encoding is supported.\");\n        }\n        // Size of blocks and short blocks in bytes\n        $this->bigBlockSize = pow(2, self::_readInt2($fh));\n        $this->smallBlockSize  = pow(2, self::_readInt2($fh));\n\n        // Skip UID, revision number and version number\n        fseek($fh, 44);\n        // Number of blocks in Big Block Allocation Table\n        $bbatBlockCount = self::_readInt4($fh);\n\n        // Root chain 1st block\n        $directoryFirstBlockId = self::_readInt4($fh);\n\n        // Skip unused bytes\n        fseek($fh, 56);\n        // Streams shorter than this are stored using small blocks\n        $this->bigBlockThreshold = self::_readInt4($fh);\n        // Block id of first sector in Short Block Allocation Table\n        $sbatFirstBlockId = self::_readInt4($fh);\n        // Number of blocks in Short Block Allocation Table\n        $sbbatBlockCount = self::_readInt4($fh);\n        // Block id of first sector in Master Block Allocation Table\n        $mbatFirstBlockId = self::_readInt4($fh);\n        // Number of blocks in Master Block Allocation Table\n        $mbbatBlockCount = self::_readInt4($fh);\n        $this->bbat = array();\n\n        // Remaining 4 * 109 bytes of current block is beginning of Master\n        // Block Allocation Table\n        $mbatBlocks = array();\n        for ($i = 0; $i < 109; ++$i) {\n            $mbatBlocks[] = self::_readInt4($fh);\n        }\n\n        // Read rest of Master Block Allocation Table (if any is left)\n        $pos = $this->_getBlockOffset($mbatFirstBlockId);\n        for ($i = 0; $i < $mbbatBlockCount; ++$i) {\n            fseek($fh, $pos);\n            for ($j = 0; $j < $this->bigBlockSize / 4 - 1; ++$j) {\n                $mbatBlocks[] = self::_readInt4($fh);\n            }\n            // Last block id in each block points to next block\n            $pos = $this->_getBlockOffset(self::_readInt4($fh));\n        }\n\n        // Read Big Block Allocation Table according to chain specified by\n        // $mbatBlocks\n        for ($i = 0; $i < $bbatBlockCount; ++$i) {\n            $pos = $this->_getBlockOffset($mbatBlocks[$i]);\n            fseek($fh, $pos);\n            for ($j = 0; $j < $this->bigBlockSize / 4; ++$j) {\n                $this->bbat[] = self::_readInt4($fh);\n            }\n        }\n\n        // Read short block allocation table (SBAT)\n        $this->sbat = array();\n        $shortBlockCount = $sbbatBlockCount * $this->bigBlockSize / 4;\n        $sbatFh = $this->getStream($sbatFirstBlockId);\n        for ($blockId = 0; $blockId < $shortBlockCount; ++$blockId) {\n            $this->sbat[$blockId] = self::_readInt4($sbatFh);\n        }\n        fclose($sbatFh);\n\n        $this->_readPpsWks($directoryFirstBlockId);\n\n        return true;\n    }\n\n    /**\n     * @param  int  block id\n     * @param  int  byte offset from beginning of file\n     * @access public\n     */\n    public function _getBlockOffset($blockId)\n    {\n        return 512 + $blockId * $this->bigBlockSize;\n    }\n\n    /**\n    * Returns a stream for use with fread() etc. External callers should\n    * use PHPExcel_Shared_OLE_PPS_File::getStream().\n    * @param   int|PPS   block id or PPS\n    * @return  resource  read-only stream\n    */\n    public function getStream($blockIdOrPps)\n    {\n        static $isRegistered = false;\n        if (!$isRegistered) {\n            stream_wrapper_register('ole-chainedblockstream', 'PHPExcel_Shared_OLE_ChainedBlockStream');\n            $isRegistered = true;\n        }\n\n        // Store current instance in global array, so that it can be accessed\n        // in OLE_ChainedBlockStream::stream_open().\n        // Object is removed from self::$instances in OLE_Stream::close().\n        $GLOBALS['_OLE_INSTANCES'][] = $this;\n        $instanceId = end(array_keys($GLOBALS['_OLE_INSTANCES']));\n\n        $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId;\n        if ($blockIdOrPps instanceof PHPExcel_Shared_OLE_PPS) {\n            $path .= '&blockId=' . $blockIdOrPps->_StartBlock;\n            $path .= '&size=' . $blockIdOrPps->Size;\n        } else {\n            $path .= '&blockId=' . $blockIdOrPps;\n        }\n        return fopen($path, 'r');\n    }\n\n    /**\n     * Reads a signed char.\n     * @param   resource  file handle\n     * @return  int\n     * @access public\n     */\n    private static function _readInt1($fh)\n    {\n        list(, $tmp) = unpack(\"c\", fread($fh, 1));\n        return $tmp;\n    }\n\n    /**\n     * Reads an unsigned short (2 octets).\n     * @param   resource  file handle\n     * @return  int\n     * @access public\n     */\n    private static function _readInt2($fh)\n    {\n        list(, $tmp) = unpack(\"v\", fread($fh, 2));\n        return $tmp;\n    }\n\n    /**\n     * Reads an unsigned long (4 octets).\n     * @param   resource  file handle\n     * @return  int\n     * @access public\n     */\n    private static function _readInt4($fh)\n    {\n        list(, $tmp) = unpack(\"V\", fread($fh, 4));\n        return $tmp;\n    }\n\n    /**\n    * Gets information about all PPS's on the OLE container from the PPS WK's\n    * creates an OLE_PPS object for each one.\n    *\n    * @access public\n    * @param  integer  the block id of the first block\n    * @return mixed true on success, PEAR_Error on failure\n    */\n    public function _readPpsWks($blockId)\n    {\n        $fh = $this->getStream($blockId);\n        for ($pos = 0;; $pos += 128) {\n            fseek($fh, $pos, SEEK_SET);\n            $nameUtf16 = fread($fh, 64);\n            $nameLength = self::_readInt2($fh);\n            $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2);\n            // Simple conversion from UTF-16LE to ISO-8859-1\n            $name = str_replace(\"\\x00\", \"\", $nameUtf16);\n            $type = self::_readInt1($fh);\n            switch ($type) {\n                case self::OLE_PPS_TYPE_ROOT:\n                    $pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array());\n                    $this->root = $pps;\n                    break;\n                case self::OLE_PPS_TYPE_DIR:\n                    $pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null, null, null, null, null, array());\n                    break;\n                case self::OLE_PPS_TYPE_FILE:\n                    $pps = new PHPExcel_Shared_OLE_PPS_File($name);\n                    break;\n                default:\n                    continue;\n            }\n            fseek($fh, 1, SEEK_CUR);\n            $pps->Type    = $type;\n            $pps->Name    = $name;\n            $pps->PrevPps = self::_readInt4($fh);\n            $pps->NextPps = self::_readInt4($fh);\n            $pps->DirPps  = self::_readInt4($fh);\n            fseek($fh, 20, SEEK_CUR);\n            $pps->Time1st = self::OLE2LocalDate(fread($fh, 8));\n            $pps->Time2nd = self::OLE2LocalDate(fread($fh, 8));\n            $pps->_StartBlock = self::_readInt4($fh);\n            $pps->Size = self::_readInt4($fh);\n            $pps->No = count($this->_list);\n            $this->_list[] = $pps;\n\n            // check if the PPS tree (starting from root) is complete\n            if (isset($this->root) && $this->_ppsTreeComplete($this->root->No)) {\n                break;\n            }\n        }\n        fclose($fh);\n\n        // Initialize $pps->children on directories\n        foreach ($this->_list as $pps) {\n            if ($pps->Type == self::OLE_PPS_TYPE_DIR || $pps->Type == self::OLE_PPS_TYPE_ROOT) {\n                $nos = array($pps->DirPps);\n                $pps->children = array();\n                while ($nos) {\n                    $no = array_pop($nos);\n                    if ($no != -1) {\n                        $childPps = $this->_list[$no];\n                        $nos[] = $childPps->PrevPps;\n                        $nos[] = $childPps->NextPps;\n                        $pps->children[] = $childPps;\n                    }\n                }\n            }\n        }\n\n        return true;\n    }\n\n    /**\n    * It checks whether the PPS tree is complete (all PPS's read)\n    * starting with the given PPS (not necessarily root)\n    *\n    * @access public\n    * @param integer $index The index of the PPS from which we are checking\n    * @return boolean Whether the PPS tree for the given PPS is complete\n    */\n    public function _ppsTreeComplete($index)\n    {\n        return isset($this->_list[$index]) &&\n               ($pps = $this->_list[$index]) &&\n               ($pps->PrevPps == -1 ||\n                $this->_ppsTreeComplete($pps->PrevPps)) &&\n               ($pps->NextPps == -1 ||\n                $this->_ppsTreeComplete($pps->NextPps)) &&\n               ($pps->DirPps == -1 ||\n                $this->_ppsTreeComplete($pps->DirPps));\n    }\n\n    /**\n    * Checks whether a PPS is a File PPS or not.\n    * If there is no PPS for the index given, it will return false.\n    *\n    * @access public\n    * @param integer $index The index for the PPS\n    * @return bool true if it's a File PPS, false otherwise\n    */\n    public function isFile($index)\n    {\n        if (isset($this->_list[$index])) {\n            return ($this->_list[$index]->Type == self::OLE_PPS_TYPE_FILE);\n        }\n        return false;\n    }\n\n    /**\n    * Checks whether a PPS is a Root PPS or not.\n    * If there is no PPS for the index given, it will return false.\n    *\n    * @access public\n    * @param integer $index The index for the PPS.\n    * @return bool true if it's a Root PPS, false otherwise\n    */\n    public function isRoot($index)\n    {\n        if (isset($this->_list[$index])) {\n            return ($this->_list[$index]->Type == self::OLE_PPS_TYPE_ROOT);\n        }\n        return false;\n    }\n\n    /**\n    * Gives the total number of PPS's found in the OLE container.\n    *\n    * @access public\n    * @return integer The total number of PPS's found in the OLE container\n    */\n    public function ppsTotal()\n    {\n        return count($this->_list);\n    }\n\n    /**\n    * Gets data from a PPS\n    * If there is no PPS for the index given, it will return an empty string.\n    *\n    * @access public\n    * @param integer $index    The index for the PPS\n    * @param integer $position The position from which to start reading\n    *                          (relative to the PPS)\n    * @param integer $length   The amount of bytes to read (at most)\n    * @return string The binary string containing the data requested\n    * @see OLE_PPS_File::getStream()\n    */\n    public function getData($index, $position, $length)\n    {\n        // if position is not valid return empty string\n        if (!isset($this->_list[$index]) || ($position >= $this->_list[$index]->Size) || ($position < 0)) {\n            return '';\n        }\n        $fh = $this->getStream($this->_list[$index]);\n        $data = stream_get_contents($fh, $length, $position);\n        fclose($fh);\n        return $data;\n    }\n\n    /**\n    * Gets the data length from a PPS\n    * If there is no PPS for the index given, it will return 0.\n    *\n    * @access public\n    * @param integer $index    The index for the PPS\n    * @return integer The amount of bytes in data the PPS has\n    */\n    public function getDataLength($index)\n    {\n        if (isset($this->_list[$index])) {\n            return $this->_list[$index]->Size;\n        }\n        return 0;\n    }\n\n    /**\n    * Utility function to transform ASCII text to Unicode\n    *\n    * @access public\n    * @static\n    * @param string $ascii The ASCII string to transform\n    * @return string The string in Unicode\n    */\n    public static function Asc2Ucs($ascii)\n    {\n        $rawname = '';\n        for ($i = 0; $i < strlen($ascii); ++$i) {\n            $rawname .= $ascii{$i} . \"\\x00\";\n        }\n        return $rawname;\n    }\n\n    /**\n    * Utility function\n    * Returns a string for the OLE container with the date given\n    *\n    * @access public\n    * @static\n    * @param integer $date A timestamp\n    * @return string The string for the OLE container\n    */\n    public static function LocalDate2OLE($date = null)\n    {\n        if (!isset($date)) {\n            return \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\";\n        }\n\n        // factor used for separating numbers into 4 bytes parts\n        $factor = pow(2, 32);\n\n        // days from 1-1-1601 until the beggining of UNIX era\n        $days = 134774;\n        // calculate seconds\n        $big_date = $days*24*3600 + gmmktime(date(\"H\", $date), date(\"i\", $date), date(\"s\", $date), date(\"m\", $date), date(\"d\", $date), date(\"Y\", $date));\n        // multiply just to make MS happy\n        $big_date *= 10000000;\n\n        $high_part = floor($big_date / $factor);\n        // lower 4 bytes\n        $low_part = floor((($big_date / $factor) - $high_part) * $factor);\n\n        // Make HEX string\n        $res = '';\n\n        for ($i = 0; $i < 4; ++$i) {\n            $hex = $low_part % 0x100;\n            $res .= pack('c', $hex);\n            $low_part /= 0x100;\n        }\n        for ($i = 0; $i < 4; ++$i) {\n            $hex = $high_part % 0x100;\n            $res .= pack('c', $hex);\n            $high_part /= 0x100;\n        }\n        return $res;\n    }\n\n    /**\n    * Returns a timestamp from an OLE container's date\n    *\n    * @access public\n    * @static\n    * @param integer $string A binary string with the encoded date\n    * @return string The timestamp corresponding to the string\n    */\n    public static function OLE2LocalDate($string)\n    {\n        if (strlen($string) != 8) {\n            return new PEAR_Error(\"Expecting 8 byte string\");\n        }\n\n        // factor used for separating numbers into 4 bytes parts\n        $factor = pow(2, 32);\n        list(, $high_part) = unpack('V', substr($string, 4, 4));\n        list(, $low_part) = unpack('V', substr($string, 0, 4));\n\n        $big_date = ($high_part * $factor) + $low_part;\n        // translate to seconds\n        $big_date /= 10000000;\n\n        // days from 1-1-1601 until the beggining of UNIX era\n        $days = 134774;\n\n        // translate to seconds from beggining of UNIX era\n        $big_date -= $days * 24 * 3600;\n        return floor($big_date);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/OLERead.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\ndefined('IDENTIFIER_OLE') ||\n    define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1));\n\nclass PHPExcel_Shared_OLERead\n{\n    private $data = '';\n\n    // OLE identifier\n    const IDENTIFIER_OLE                    = IDENTIFIER_OLE;\n\n    // Size of a sector = 512 bytes\n    const BIG_BLOCK_SIZE                    = 0x200;\n\n    // Size of a short sector = 64 bytes\n    const SMALL_BLOCK_SIZE                  = 0x40;\n\n    // Size of a directory entry always = 128 bytes\n    const PROPERTY_STORAGE_BLOCK_SIZE       = 0x80;\n\n    // Minimum size of a standard stream = 4096 bytes, streams smaller than this are stored as short streams\n    const SMALL_BLOCK_THRESHOLD             = 0x1000;\n\n    // header offsets\n    const NUM_BIG_BLOCK_DEPOT_BLOCKS_POS    = 0x2c;\n    const ROOT_START_BLOCK_POS              = 0x30;\n    const SMALL_BLOCK_DEPOT_BLOCK_POS       = 0x3c;\n    const EXTENSION_BLOCK_POS               = 0x44;\n    const NUM_EXTENSION_BLOCK_POS           = 0x48;\n    const BIG_BLOCK_DEPOT_BLOCKS_POS        = 0x4c;\n\n    // property storage offsets (directory offsets)\n    const SIZE_OF_NAME_POS                  = 0x40;\n    const TYPE_POS                          = 0x42;\n    const START_BLOCK_POS                   = 0x74;\n    const SIZE_POS                          = 0x78;\n\n\n\n    public $wrkbook                         = null;\n    public $summaryInformation              = null;\n    public $documentSummaryInformation      = null;\n\n\n    /**\n     * Read the file\n     *\n     * @param $sFileName string Filename\n     * @throws PHPExcel_Reader_Exception\n     */\n    public function read($sFileName)\n    {\n        // Check if file exists and is readable\n        if (!is_readable($sFileName)) {\n            throw new PHPExcel_Reader_Exception(\"Could not open \" . $sFileName . \" for reading! File does not exist, or it is not readable.\");\n        }\n\n        // Get the file identifier\n        // Don't bother reading the whole file until we know it's a valid OLE file\n        $this->data = file_get_contents($sFileName, false, null, 0, 8);\n\n        // Check OLE identifier\n        if ($this->data != self::IDENTIFIER_OLE) {\n            throw new PHPExcel_Reader_Exception('The filename ' . $sFileName . ' is not recognised as an OLE file');\n        }\n\n        // Get the file data\n        $this->data = file_get_contents($sFileName);\n\n        // Total number of sectors used for the SAT\n        $this->numBigBlockDepotBlocks = self::getInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS);\n\n        // SecID of the first sector of the directory stream\n        $this->rootStartBlock = self::getInt4d($this->data, self::ROOT_START_BLOCK_POS);\n\n        // SecID of the first sector of the SSAT (or -2 if not extant)\n        $this->sbdStartBlock = self::getInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS);\n\n        // SecID of the first sector of the MSAT (or -2 if no additional sectors are used)\n        $this->extensionBlock = self::getInt4d($this->data, self::EXTENSION_BLOCK_POS);\n\n        // Total number of sectors used by MSAT\n        $this->numExtensionBlocks = self::getInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS);\n\n        $bigBlockDepotBlocks = array();\n        $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS;\n\n        $bbdBlocks = $this->numBigBlockDepotBlocks;\n\n        if ($this->numExtensionBlocks != 0) {\n            $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS)/4;\n        }\n\n        for ($i = 0; $i < $bbdBlocks; ++$i) {\n              $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos);\n              $pos += 4;\n        }\n\n        for ($j = 0; $j < $this->numExtensionBlocks; ++$j) {\n            $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE;\n            $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1);\n\n            for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) {\n                $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos);\n                $pos += 4;\n            }\n\n            $bbdBlocks += $blocksToRead;\n            if ($bbdBlocks < $this->numBigBlockDepotBlocks) {\n                $this->extensionBlock = self::getInt4d($this->data, $pos);\n            }\n        }\n\n        $pos = 0;\n        $this->bigBlockChain = '';\n        $bbs = self::BIG_BLOCK_SIZE / 4;\n        for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) {\n            $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE;\n\n            $this->bigBlockChain .= substr($this->data, $pos, 4*$bbs);\n            $pos += 4*$bbs;\n        }\n\n        $pos = 0;\n        $sbdBlock = $this->sbdStartBlock;\n        $this->smallBlockChain = '';\n        while ($sbdBlock != -2) {\n            $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE;\n\n            $this->smallBlockChain .= substr($this->data, $pos, 4*$bbs);\n            $pos += 4*$bbs;\n\n            $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock*4);\n        }\n\n        // read the directory stream\n        $block = $this->rootStartBlock;\n        $this->entry = $this->_readData($block);\n\n        $this->readPropertySets();\n    }\n\n    /**\n     * Extract binary stream data\n     *\n     * @return string\n     */\n    public function getStream($stream)\n    {\n        if ($stream === null) {\n            return null;\n        }\n\n        $streamData = '';\n\n        if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) {\n            $rootdata = $this->_readData($this->props[$this->rootentry]['startBlock']);\n\n            $block = $this->props[$stream]['startBlock'];\n\n            while ($block != -2) {\n                  $pos = $block * self::SMALL_BLOCK_SIZE;\n                $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE);\n\n                $block = self::getInt4d($this->smallBlockChain, $block*4);\n            }\n\n            return $streamData;\n        } else {\n            $numBlocks = $this->props[$stream]['size'] / self::BIG_BLOCK_SIZE;\n            if ($this->props[$stream]['size'] % self::BIG_BLOCK_SIZE != 0) {\n                ++$numBlocks;\n            }\n\n            if ($numBlocks == 0) {\n                return '';\n            }\n\n            $block = $this->props[$stream]['startBlock'];\n\n            while ($block != -2) {\n                $pos = ($block + 1) * self::BIG_BLOCK_SIZE;\n                $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE);\n                $block = self::getInt4d($this->bigBlockChain, $block*4);\n            }\n\n            return $streamData;\n        }\n    }\n\n    /**\n     * Read a standard stream (by joining sectors using information from SAT)\n     *\n     * @param int $bl Sector ID where the stream starts\n     * @return string Data for standard stream\n     */\n    private function _readData($bl)\n    {\n        $block = $bl;\n        $data = '';\n\n        while ($block != -2) {\n            $pos = ($block + 1) * self::BIG_BLOCK_SIZE;\n            $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE);\n            $block = self::getInt4d($this->bigBlockChain, $block*4);\n        }\n        return $data;\n    }\n\n    /**\n     * Read entries in the directory stream.\n     */\n    private function readPropertySets()\n    {\n        $offset = 0;\n\n        // loop through entires, each entry is 128 bytes\n        $entryLen = strlen($this->entry);\n        while ($offset < $entryLen) {\n            // entry data (128 bytes)\n            $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE);\n\n            // size in bytes of name\n            $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS+1]) << 8);\n\n            // type of entry\n            $type = ord($d[self::TYPE_POS]);\n\n            // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook)\n            // sectorID of first sector of the short-stream container stream, if this entry is root entry\n            $startBlock = self::getInt4d($d, self::START_BLOCK_POS);\n\n            $size = self::getInt4d($d, self::SIZE_POS);\n\n            $name = str_replace(\"\\x00\", \"\", substr($d, 0, $nameSize));\n\n            $this->props[] = array(\n                'name' => $name,\n                'type' => $type,\n                'startBlock' => $startBlock,\n                'size' => $size\n            );\n\n            // tmp helper to simplify checks\n            $upName = strtoupper($name);\n\n            // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook)\n            if (($upName === 'WORKBOOK') || ($upName === 'BOOK')) {\n                $this->wrkbook = count($this->props) - 1;\n            } elseif ($upName === 'ROOT ENTRY' || $upName === 'R') {\n                // Root entry\n                $this->rootentry = count($this->props) - 1;\n            }\n\n            // Summary information\n            if ($name == chr(5) . 'SummaryInformation') {\n//                echo 'Summary Information<br />';\n                $this->summaryInformation = count($this->props) - 1;\n            }\n\n            // Additional Document Summary information\n            if ($name == chr(5) . 'DocumentSummaryInformation') {\n//                echo 'Document Summary Information<br />';\n                $this->documentSummaryInformation = count($this->props) - 1;\n            }\n\n            $offset += self::PROPERTY_STORAGE_BLOCK_SIZE;\n        }\n    }\n\n    /**\n     * Read 4 bytes of data at specified position\n     *\n     * @param string $data\n     * @param int $pos\n     * @return int\n     */\n    private static function getInt4d($data, $pos)\n    {\n        // FIX: represent numbers correctly on 64-bit system\n        // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334\n        // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems\n        $_or_24 = ord($data[$pos + 3]);\n        if ($_or_24 >= 128) {\n            // negative number\n            $_ord_24 = -abs((256 - $_or_24) << 24);\n        } else {\n            $_ord_24 = ($_or_24 & 127) << 24;\n        }\n        return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/PCLZip/gnu-lgpl.txt",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\r\n\t\t       Version 2.1, February 1999\r\n\r\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n[This is the first released version of the Lesser GPL.  It also counts\r\n as the successor of the GNU Library Public License, version 2, hence\r\n the version number 2.1.]\r\n\r\n\t\t\t    Preamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicenses are intended to guarantee your freedom to share and change\r\nfree software--to make sure the software is free for all its users.\r\n\r\n  This license, the Lesser General Public License, applies to some\r\nspecially designated software packages--typically libraries--of the\r\nFree Software Foundation and other authors who decide to use it.  You\r\ncan use it too, but we suggest you first think carefully about whether\r\nthis license or the ordinary General Public License is the better\r\nstrategy to use in any particular case, based on the explanations below.\r\n\r\n  When we speak of free software, we are referring to freedom of use,\r\nnot price.  Our General Public Licenses are designed to make sure that\r\nyou have the freedom to distribute copies of free software (and charge\r\nfor this service if you wish); that you receive source code or can get\r\nit if you want it; that you can change the software and use pieces of\r\nit in new free programs; and that you are informed that you can do\r\nthese things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\ndistributors to deny you these rights or to ask you to surrender these\r\nrights.  These restrictions translate to certain responsibilities for\r\nyou if you distribute copies of the library or if you modify it.\r\n\r\n  For example, if you distribute copies of the library, whether gratis\r\nor for a fee, you must give the recipients all the rights that we gave\r\nyou.  You must make sure that they, too, receive or can get the source\r\ncode.  If you link other code with the library, you must provide\r\ncomplete object files to the recipients, so that they can relink them\r\nwith the library after making changes to the library and recompiling\r\nit.  And you must show them these terms so they know their rights.\r\n\r\n  We protect your rights with a two-step method: (1) we copyright the\r\nlibrary, and (2) we offer you this license, which gives you legal\r\npermission to copy, distribute and/or modify the library.\r\n\r\n  To protect each distributor, we want to make it very clear that\r\nthere is no warranty for the free library.  Also, if the library is\r\nmodified by someone else and passed on, the recipients should know\r\nthat what they have is not the original version, so that the original\r\nauthor's reputation will not be affected by problems that might be\r\nintroduced by others.\r\n\f\r\n  Finally, software patents pose a constant threat to the existence of\r\nany free program.  We wish to make sure that a company cannot\r\neffectively restrict the users of a free program by obtaining a\r\nrestrictive license from a patent holder.  Therefore, we insist that\r\nany patent license obtained for a version of the library must be\r\nconsistent with the full freedom of use specified in this license.\r\n\r\n  Most GNU software, including some libraries, is covered by the\r\nordinary GNU General Public License.  This license, the GNU Lesser\r\nGeneral Public License, applies to certain designated libraries, and\r\nis quite different from the ordinary General Public License.  We use\r\nthis license for certain libraries in order to permit linking those\r\nlibraries into non-free programs.\r\n\r\n  When a program is linked with a library, whether statically or using\r\na shared library, the combination of the two is legally speaking a\r\ncombined work, a derivative of the original library.  The ordinary\r\nGeneral Public License therefore permits such linking only if the\r\nentire combination fits its criteria of freedom.  The Lesser General\r\nPublic License permits more lax criteria for linking other code with\r\nthe library.\r\n\r\n  We call this license the \"Lesser\" General Public License because it\r\ndoes Less to protect the user's freedom than the ordinary General\r\nPublic License.  It also provides other free software developers Less\r\nof an advantage over competing non-free programs.  These disadvantages\r\nare the reason we use the ordinary General Public License for many\r\nlibraries.  However, the Lesser license provides advantages in certain\r\nspecial circumstances.\r\n\r\n  For example, on rare occasions, there may be a special need to\r\nencourage the widest possible use of a certain library, so that it becomes\r\na de-facto standard.  To achieve this, non-free programs must be\r\nallowed to use the library.  A more frequent case is that a free\r\nlibrary does the same job as widely used non-free libraries.  In this\r\ncase, there is little to gain by limiting the free library to free\r\nsoftware only, so we use the Lesser General Public License.\r\n\r\n  In other cases, permission to use a particular library in non-free\r\nprograms enables a greater number of people to use a large body of\r\nfree software.  For example, permission to use the GNU C Library in\r\nnon-free programs enables many more people to use the whole GNU\r\noperating system, as well as its variant, the GNU/Linux operating\r\nsystem.\r\n\r\n  Although the Lesser General Public License is Less protective of the\r\nusers' freedom, it does ensure that the user of a program that is\r\nlinked with the Library has the freedom and the wherewithal to run\r\nthat program using a modified version of the Library.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.  Pay close attention to the difference between a\r\n\"work based on the library\" and a \"work that uses the library\".  The\r\nformer contains code derived from the library, whereas the latter must\r\nbe combined with the library in order to run.\r\n\f\r\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\r\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License Agreement applies to any software library or other\r\nprogram which contains a notice placed by the copyright holder or\r\nother authorized party saying it may be distributed under the terms of\r\nthis Lesser General Public License (also called \"this License\").\r\nEach licensee is addressed as \"you\".\r\n\r\n  A \"library\" means a collection of software functions and/or data\r\nprepared so as to be conveniently linked with application programs\r\n(which use some of those functions and data) to form executables.\r\n\r\n  The \"Library\", below, refers to any such software library or work\r\nwhich has been distributed under these terms.  A \"work based on the\r\nLibrary\" means either the Library or any derivative work under\r\ncopyright law: that is to say, a work containing the Library or a\r\nportion of it, either verbatim or with modifications and/or translated\r\nstraightforwardly into another language.  (Hereinafter, translation is\r\nincluded without limitation in the term \"modification\".)\r\n\r\n  \"Source code\" for a work means the preferred form of the work for\r\nmaking modifications to it.  For a library, complete source code means\r\nall the source code for all modules it contains, plus any associated\r\ninterface definition files, plus the scripts used to control compilation\r\nand installation of the library.\r\n\r\n  Activities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning a program using the Library is not restricted, and output from\r\nsuch a program is covered only if its contents constitute a work based\r\non the Library (independent of the use of the Library in a tool for\r\nwriting it).  Whether that is true depends on what the Library does\r\nand what the program that uses the Library does.\r\n  \r\n  1. You may copy and distribute verbatim copies of the Library's\r\ncomplete source code as you receive it, in any medium, provided that\r\nyou conspicuously and appropriately publish on each copy an\r\nappropriate copyright notice and disclaimer of warranty; keep intact\r\nall the notices that refer to this License and to the absence of any\r\nwarranty; and distribute a copy of this License along with the\r\nLibrary.\r\n\r\n  You may charge a fee for the physical act of transferring a copy,\r\nand you may at your option offer warranty protection in exchange for a\r\nfee.\r\n\f\r\n  2. You may modify your copy or copies of the Library or any portion\r\nof it, thus forming a work based on the Library, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) The modified work must itself be a software library.\r\n\r\n    b) You must cause the files modified to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    c) You must cause the whole of the work to be licensed at no\r\n    charge to all third parties under the terms of this License.\r\n\r\n    d) If a facility in the modified Library refers to a function or a\r\n    table of data to be supplied by an application program that uses\r\n    the facility, other than as an argument passed when the facility\r\n    is invoked, then you must make a good faith effort to ensure that,\r\n    in the event an application does not supply such function or\r\n    table, the facility still operates, and performs whatever part of\r\n    its purpose remains meaningful.\r\n\r\n    (For example, a function in a library to compute square roots has\r\n    a purpose that is entirely well-defined independent of the\r\n    application.  Therefore, Subsection 2d requires that any\r\n    application-supplied function or table used by this function must\r\n    be optional: if the application does not supply it, the square\r\n    root function must still compute square roots.)\r\n\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Library,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Library, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote\r\nit.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Library.\r\n\r\nIn addition, mere aggregation of another work not based on the Library\r\nwith the Library (or with a work based on the Library) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may opt to apply the terms of the ordinary GNU General Public\r\nLicense instead of this License to a given copy of the Library.  To do\r\nthis, you must alter all the notices that refer to this License, so\r\nthat they refer to the ordinary GNU General Public License, version 2,\r\ninstead of to this License.  (If a newer version than version 2 of the\r\nordinary GNU General Public License has appeared, then you can specify\r\nthat version instead if you wish.)  Do not make any other change in\r\nthese notices.\r\n\f\r\n  Once this change is made in a given copy, it is irreversible for\r\nthat copy, so the ordinary GNU General Public License applies to all\r\nsubsequent copies and derivative works made from that copy.\r\n\r\n  This option is useful when you wish to copy part of the code of\r\nthe Library into a program that is not a library.\r\n\r\n  4. You may copy and distribute the Library (or a portion or\r\nderivative of it, under Section 2) in object code or executable form\r\nunder the terms of Sections 1 and 2 above provided that you accompany\r\nit with the complete corresponding machine-readable source code, which\r\nmust be distributed under the terms of Sections 1 and 2 above on a\r\nmedium customarily used for software interchange.\r\n\r\n  If distribution of object code is made by offering access to copy\r\nfrom a designated place, then offering equivalent access to copy the\r\nsource code from the same place satisfies the requirement to\r\ndistribute the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\r\n  5. A program that contains no derivative of any portion of the\r\nLibrary, but is designed to work with the Library by being compiled or\r\nlinked with it, is called a \"work that uses the Library\".  Such a\r\nwork, in isolation, is not a derivative work of the Library, and\r\ntherefore falls outside the scope of this License.\r\n\r\n  However, linking a \"work that uses the Library\" with the Library\r\ncreates an executable that is a derivative of the Library (because it\r\ncontains portions of the Library), rather than a \"work that uses the\r\nlibrary\".  The executable is therefore covered by this License.\r\nSection 6 states terms for distribution of such executables.\r\n\r\n  When a \"work that uses the Library\" uses material from a header file\r\nthat is part of the Library, the object code for the work may be a\r\nderivative work of the Library even though the source code is not.\r\nWhether this is true is especially significant if the work can be\r\nlinked without the Library, or if the work is itself a library.  The\r\nthreshold for this to be true is not precisely defined by law.\r\n\r\n  If such an object file uses only numerical parameters, data\r\nstructure layouts and accessors, and small macros and small inline\r\nfunctions (ten lines or less in length), then the use of the object\r\nfile is unrestricted, regardless of whether it is legally a derivative\r\nwork.  (Executables containing this object code plus portions of the\r\nLibrary will still fall under Section 6.)\r\n\r\n  Otherwise, if the work is a derivative of the Library, you may\r\ndistribute the object code for the work under the terms of Section 6.\r\nAny executables containing that work also fall under Section 6,\r\nwhether or not they are linked directly with the Library itself.\r\n\f\r\n  6. As an exception to the Sections above, you may also combine or\r\nlink a \"work that uses the Library\" with the Library to produce a\r\nwork containing portions of the Library, and distribute that work\r\nunder terms of your choice, provided that the terms permit\r\nmodification of the work for the customer's own use and reverse\r\nengineering for debugging such modifications.\r\n\r\n  You must give prominent notice with each copy of the work that the\r\nLibrary is used in it and that the Library and its use are covered by\r\nthis License.  You must supply a copy of this License.  If the work\r\nduring execution displays copyright notices, you must include the\r\ncopyright notice for the Library among them, as well as a reference\r\ndirecting the user to the copy of this License.  Also, you must do one\r\nof these things:\r\n\r\n    a) Accompany the work with the complete corresponding\r\n    machine-readable source code for the Library including whatever\r\n    changes were used in the work (which must be distributed under\r\n    Sections 1 and 2 above); and, if the work is an executable linked\r\n    with the Library, with the complete machine-readable \"work that\r\n    uses the Library\", as object code and/or source code, so that the\r\n    user can modify the Library and then relink to produce a modified\r\n    executable containing the modified Library.  (It is understood\r\n    that the user who changes the contents of definitions files in the\r\n    Library will not necessarily be able to recompile the application\r\n    to use the modified definitions.)\r\n\r\n    b) Use a suitable shared library mechanism for linking with the\r\n    Library.  A suitable mechanism is one that (1) uses at run time a\r\n    copy of the library already present on the user's computer system,\r\n    rather than copying library functions into the executable, and (2)\r\n    will operate properly with a modified version of the library, if\r\n    the user installs one, as long as the modified version is\r\n    interface-compatible with the version that the work was made with.\r\n\r\n    c) Accompany the work with a written offer, valid for at\r\n    least three years, to give the same user the materials\r\n    specified in Subsection 6a, above, for a charge no more\r\n    than the cost of performing this distribution.\r\n\r\n    d) If distribution of the work is made by offering access to copy\r\n    from a designated place, offer equivalent access to copy the above\r\n    specified materials from the same place.\r\n\r\n    e) Verify that the user has already received a copy of these\r\n    materials or that you have already sent this user a copy.\r\n\r\n  For an executable, the required form of the \"work that uses the\r\nLibrary\" must include any data and utility programs needed for\r\nreproducing the executable from it.  However, as a special exception,\r\nthe materials to be distributed need not include anything that is\r\nnormally distributed (in either source or binary form) with the major\r\ncomponents (compiler, kernel, and so on) of the operating system on\r\nwhich the executable runs, unless that component itself accompanies\r\nthe executable.\r\n\r\n  It may happen that this requirement contradicts the license\r\nrestrictions of other proprietary libraries that do not normally\r\naccompany the operating system.  Such a contradiction means you cannot\r\nuse both them and the Library together in an executable that you\r\ndistribute.\r\n\f\r\n  7. You may place library facilities that are a work based on the\r\nLibrary side-by-side in a single library together with other library\r\nfacilities not covered by this License, and distribute such a combined\r\nlibrary, provided that the separate distribution of the work based on\r\nthe Library and of the other library facilities is otherwise\r\npermitted, and provided that you do these two things:\r\n\r\n    a) Accompany the combined library with a copy of the same work\r\n    based on the Library, uncombined with any other library\r\n    facilities.  This must be distributed under the terms of the\r\n    Sections above.\r\n\r\n    b) Give prominent notice with the combined library of the fact\r\n    that part of it is a work based on the Library, and explaining\r\n    where to find the accompanying uncombined form of the same work.\r\n\r\n  8. You may not copy, modify, sublicense, link with, or distribute\r\nthe Library except as expressly provided under this License.  Any\r\nattempt otherwise to copy, modify, sublicense, link with, or\r\ndistribute the Library is void, and will automatically terminate your\r\nrights under this License.  However, parties who have received copies,\r\nor rights, from you under this License will not have their licenses\r\nterminated so long as such parties remain in full compliance.\r\n\r\n  9. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Library or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Library (or any work based on the\r\nLibrary), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Library or works based on it.\r\n\r\n  10. Each time you redistribute the Library (or any work based on the\r\nLibrary), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute, link with or modify the Library\r\nsubject to these terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties with\r\nthis License.\r\n\f\r\n  11. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Library at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Library by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Library.\r\n\r\nIf any portion of this section is held invalid or unenforceable under any\r\nparticular circumstance, the balance of the section is intended to apply,\r\nand the section as a whole is intended to apply in other circumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\r\n  12. If the distribution and/or use of the Library is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Library under this License may add\r\nan explicit geographical distribution limitation excluding those countries,\r\nso that distribution is permitted only in or among countries not thus\r\nexcluded.  In such case, this License incorporates the limitation as if\r\nwritten in the body of this License.\r\n\r\n  13. The Free Software Foundation may publish revised and/or new\r\nversions of the Lesser General Public License from time to time.\r\nSuch new versions will be similar in spirit to the present version,\r\nbut may differ in detail to address new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Library\r\nspecifies a version number of this License which applies to it and\r\n\"any later version\", you have the option of following the terms and\r\nconditions either of that version or of any later version published by\r\nthe Free Software Foundation.  If the Library does not specify a\r\nlicense version number, you may choose any version ever published by\r\nthe Free Software Foundation.\r\n\f\r\n  14. If you wish to incorporate parts of the Library into other free\r\nprograms whose distribution conditions are incompatible with these,\r\nwrite to the author to ask for permission.  For software which is\r\ncopyrighted by the Free Software Foundation, write to the Free\r\nSoftware Foundation; we sometimes make exceptions for this.  Our\r\ndecision will be guided by the two goals of preserving the free status\r\nof all derivatives of our free software and of promoting the sharing\r\nand reuse of software generally.\r\n\r\n\t\t\t    NO WARRANTY\r\n\r\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\r\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r\nDAMAGES.\r\n\r\n\t\t     END OF TERMS AND CONDITIONS\r\n\f\r\n           How to Apply These Terms to Your New Libraries\r\n\r\n  If you develop a new library, and you want it to be of the greatest\r\npossible use to the public, we recommend making it free software that\r\neveryone can redistribute and change.  You can do so by permitting\r\nredistribution under these terms (or, alternatively, under the terms of the\r\nordinary General Public License).\r\n\r\n  To apply these terms, attach the following notices to the library.  It is\r\nsafest to attach them to the start of each source file to most effectively\r\nconvey the exclusion of warranty; and each file should have at least the\r\n\"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the library's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This library is free software; you can redistribute it and/or\r\n    modify it under the terms of the GNU Lesser General Public\r\n    License as published by the Free Software Foundation; either\r\n    version 2.1 of the License, or (at your option) any later version.\r\n\r\n    This library is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n    Lesser General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Lesser General Public\r\n    License along with this library; if not, write to the Free Software\r\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\nYou should also get your employer (if you work as a programmer) or your\r\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\r\nnecessary.  Here is a sample; alter the names:\r\n\r\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\r\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r\n\r\n  <signature of Ty Coon>, 1 April 1990\r\n  Ty Coon, President of Vice\r\n\r\nThat's all there is to it!\r\n\r\n\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/PCLZip/pclzip.lib.php",
    "content": "<?php\n// --------------------------------------------------------------------------------\n// PhpConcept Library - Zip Module 2.8.2\n// --------------------------------------------------------------------------------\n// License GNU/LGPL - Vincent Blavet - August 2009\n// http://www.phpconcept.net\n// --------------------------------------------------------------------------------\n//\n// Presentation :\n//     PclZip is a PHP library that manage ZIP archives.\n//     So far tests show that archives generated by PclZip are readable by\n//     WinZip application and other tools.\n//\n// Description :\n//     See readme.txt and http://www.phpconcept.net\n//\n// Warning :\n//     This library and the associated files are non commercial, non professional\n//     work.\n//     It should not have unexpected results. However if any damage is caused by\n//     this software the author can not be responsible.\n//     The use of this software is at the risk of the user.\n//\n// --------------------------------------------------------------------------------\n// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $\n// --------------------------------------------------------------------------------\n\n// ----- Constants\nif (!defined('PCLZIP_READ_BLOCK_SIZE')) {\n    define('PCLZIP_READ_BLOCK_SIZE', 2048);\n}\n\n// ----- File list separator\n// In version 1.x of PclZip, the separator for file list is a space\n// (which is not a very smart choice, specifically for windows paths !).\n// A better separator should be a comma (,). This constant gives you the\n// abilty to change that.\n// However notice that changing this value, may have impact on existing\n// scripts, using space separated filenames.\n// Recommanded values for compatibility with older versions :\n//define('PCLZIP_SEPARATOR', ' ');\n// Recommanded values for smart separation of filenames.\nif (!defined('PCLZIP_SEPARATOR')) {\n    define('PCLZIP_SEPARATOR', ',');\n}\n\n// ----- Error configuration\n// 0 : PclZip Class integrated error handling\n// 1 : PclError external library error handling. By enabling this\n//         you must ensure that you have included PclError library.\n// [2,...] : reserved for futur use\nif (!defined('PCLZIP_ERROR_EXTERNAL')) {\n    define('PCLZIP_ERROR_EXTERNAL', 0);\n}\n\n// ----- Optional static temporary directory\n//             By default temporary files are generated in the script current\n//             path.\n//             If defined :\n//             - MUST BE terminated by a '/'.\n//             - MUST be a valid, already created directory\n//             Samples :\n// define('PCLZIP_TEMPORARY_DIR', '/temp/');\n// define('PCLZIP_TEMPORARY_DIR', 'C:/Temp/');\nif (!defined('PCLZIP_TEMPORARY_DIR')) {\n    define('PCLZIP_TEMPORARY_DIR', '');\n}\n\n// ----- Optional threshold ratio for use of temporary files\n//             Pclzip sense the size of the file to add/extract and decide to\n//             use or not temporary file. The algorythm is looking for\n//             memory_limit of PHP and apply a ratio.\n//             threshold = memory_limit * ratio.\n//             Recommended values are under 0.5. Default 0.47.\n//             Samples :\n// define('PCLZIP_TEMPORARY_FILE_RATIO', 0.5);\nif (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {\n    define('PCLZIP_TEMPORARY_FILE_RATIO', 0.47);\n}\n\n// --------------------------------------------------------------------------------\n// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****\n// --------------------------------------------------------------------------------\n\n// ----- Global variables\n$g_pclzip_version = \"2.8.2\";\n\n// ----- Error codes\n//     -1 : Unable to open file in binary write mode\n//     -2 : Unable to open file in binary read mode\n//     -3 : Invalid parameters\n//     -4 : File does not exist\n//     -5 : Filename is too long (max. 255)\n//     -6 : Not a valid zip file\n//     -7 : Invalid extracted file size\n//     -8 : Unable to create directory\n//     -9 : Invalid archive extension\n//    -10 : Invalid archive format\n//    -11 : Unable to delete file (unlink)\n//    -12 : Unable to rename file (rename)\n//    -13 : Invalid header checksum\n//    -14 : Invalid archive size\ndefine('PCLZIP_ERR_USER_ABORTED', 2);\ndefine('PCLZIP_ERR_NO_ERROR', 0);\ndefine('PCLZIP_ERR_WRITE_OPEN_FAIL', -1);\ndefine('PCLZIP_ERR_READ_OPEN_FAIL', -2);\ndefine('PCLZIP_ERR_INVALID_PARAMETER', -3);\ndefine('PCLZIP_ERR_MISSING_FILE', -4);\ndefine('PCLZIP_ERR_FILENAME_TOO_LONG', -5);\ndefine('PCLZIP_ERR_INVALID_ZIP', -6);\ndefine('PCLZIP_ERR_BAD_EXTRACTED_FILE', -7);\ndefine('PCLZIP_ERR_DIR_CREATE_FAIL', -8);\ndefine('PCLZIP_ERR_BAD_EXTENSION', -9);\ndefine('PCLZIP_ERR_BAD_FORMAT', -10);\ndefine('PCLZIP_ERR_DELETE_FILE_FAIL', -11);\ndefine('PCLZIP_ERR_RENAME_FILE_FAIL', -12);\ndefine('PCLZIP_ERR_BAD_CHECKSUM', -13);\ndefine('PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14);\ndefine('PCLZIP_ERR_MISSING_OPTION_VALUE', -15);\ndefine('PCLZIP_ERR_INVALID_OPTION_VALUE', -16);\ndefine('PCLZIP_ERR_ALREADY_A_DIRECTORY', -17);\ndefine('PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18);\ndefine('PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19);\ndefine('PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20);\ndefine('PCLZIP_ERR_DIRECTORY_RESTRICTION', -21);\n\n// ----- Options values\ndefine('PCLZIP_OPT_PATH', 77001);\ndefine('PCLZIP_OPT_ADD_PATH', 77002);\ndefine('PCLZIP_OPT_REMOVE_PATH', 77003);\ndefine('PCLZIP_OPT_REMOVE_ALL_PATH', 77004);\ndefine('PCLZIP_OPT_SET_CHMOD', 77005);\ndefine('PCLZIP_OPT_EXTRACT_AS_STRING', 77006);\ndefine('PCLZIP_OPT_NO_COMPRESSION', 77007);\ndefine('PCLZIP_OPT_BY_NAME', 77008);\ndefine('PCLZIP_OPT_BY_INDEX', 77009);\ndefine('PCLZIP_OPT_BY_EREG', 77010);\ndefine('PCLZIP_OPT_BY_PREG', 77011);\ndefine('PCLZIP_OPT_COMMENT', 77012);\ndefine('PCLZIP_OPT_ADD_COMMENT', 77013);\ndefine('PCLZIP_OPT_PREPEND_COMMENT', 77014);\ndefine('PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015);\ndefine('PCLZIP_OPT_REPLACE_NEWER', 77016);\ndefine('PCLZIP_OPT_STOP_ON_ERROR', 77017);\n// Having big trouble with crypt. Need to multiply 2 long int\n// which is not correctly supported by PHP ...\n//define('PCLZIP_OPT_CRYPT', 77018);\ndefine('PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019);\ndefine('PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020);\ndefine('PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020); // alias\ndefine('PCLZIP_OPT_TEMP_FILE_ON', 77021);\ndefine('PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021); // alias\ndefine('PCLZIP_OPT_TEMP_FILE_OFF', 77022);\ndefine('PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022); // alias\n\n// ----- File description attributes\ndefine('PCLZIP_ATT_FILE_NAME', 79001);\ndefine('PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002);\ndefine('PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003);\ndefine('PCLZIP_ATT_FILE_MTIME', 79004);\ndefine('PCLZIP_ATT_FILE_CONTENT', 79005);\ndefine('PCLZIP_ATT_FILE_COMMENT', 79006);\n\n// ----- Call backs values\ndefine('PCLZIP_CB_PRE_EXTRACT', 78001);\ndefine('PCLZIP_CB_POST_EXTRACT', 78002);\ndefine('PCLZIP_CB_PRE_ADD', 78003);\ndefine('PCLZIP_CB_POST_ADD', 78004);\n/* For futur use\ndefine('PCLZIP_CB_PRE_LIST', 78005);\ndefine('PCLZIP_CB_POST_LIST', 78006);\ndefine('PCLZIP_CB_PRE_DELETE', 78007);\ndefine('PCLZIP_CB_POST_DELETE', 78008);\n*/\n\n// --------------------------------------------------------------------------------\n// Class : PclZip\n// Description :\n//     PclZip is the class that represent a Zip archive.\n//     The public methods allow the manipulation of the archive.\n// Attributes :\n//     Attributes must not be accessed directly.\n// Methods :\n//     PclZip() : Object creator\n//     create() : Creates the Zip archive\n//     listContent() : List the content of the Zip archive\n//     extract() : Extract the content of the archive\n//     properties() : List the properties of the archive\n// --------------------------------------------------------------------------------\nclass PclZip\n{\n    // ----- Filename of the zip file\n    public $zipname = '';\n\n    // ----- File descriptor of the zip file\n    public $zip_fd = 0;\n\n    // ----- Internal error handling\n    public $error_code = 1;\n    public $error_string = '';\n\n    // ----- Current status of the magic_quotes_runtime\n    // This value store the php configuration for magic_quotes\n    // The class can then disable the magic_quotes and reset it after\n    public $magic_quotes_status;\n\n    // --------------------------------------------------------------------------------\n    // Function : PclZip()\n    // Description :\n    //     Creates a PclZip object and set the name of the associated Zip archive\n    //     filename.\n    //     Note that no real action is taken, if the archive does not exist it is not\n    //     created. Use create() for that.\n    // --------------------------------------------------------------------------------\n    public function __construct($p_zipname)\n    {\n\n        // ----- Tests the zlib\n        if (!function_exists('gzopen')) {\n            die('Abort '.basename(__FILE__).' : Missing zlib extensions');\n        }\n\n        // ----- Set the attributes\n        $this->zipname = $p_zipname;\n        $this->zip_fd = 0;\n        $this->magic_quotes_status = -1;\n\n        // ----- Return\n        return;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //     create($p_filelist, $p_add_dir=\"\", $p_remove_dir=\"\")\n    //     create($p_filelist, $p_option, $p_option_value, ...)\n    // Description :\n    //     This method supports two different synopsis. The first one is historical.\n    //     This method creates a Zip Archive. The Zip file is created in the\n    //     filesystem. The files and directories indicated in $p_filelist\n    //     are added in the archive. See the parameters description for the\n    //     supported format of $p_filelist.\n    //     When a directory is in the list, the directory and its content is added\n    //     in the archive.\n    //     In this synopsis, the function takes an optional variable list of\n    //     options. See bellow the supported options.\n    // Parameters :\n    //     $p_filelist : An array containing file or directory names, or\n    //                                 a string containing one filename or one directory name, or\n    //                                 a string containing a list of filenames and/or directory\n    //                                 names separated by spaces.\n    //     $p_add_dir : A path to add before the real path of the archived file,\n    //                                in order to have it memorized in the archive.\n    //     $p_remove_dir : A path to remove from the real path of the file to archive,\n    //                                     in order to have a shorter path memorized in the archive.\n    //                                     When $p_add_dir and $p_remove_dir are set, $p_remove_dir\n    //                                     is removed first, before $p_add_dir is added.\n    // Options :\n    //     PCLZIP_OPT_ADD_PATH :\n    //     PCLZIP_OPT_REMOVE_PATH :\n    //     PCLZIP_OPT_REMOVE_ALL_PATH :\n    //     PCLZIP_OPT_COMMENT :\n    //     PCLZIP_CB_PRE_ADD :\n    //     PCLZIP_CB_POST_ADD :\n    // Return Values :\n    //     0 on failure,\n    //     The list of the added files, with a status of the add action.\n    //     (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function create($p_filelist)\n    {\n        $v_result=1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Set default values\n        $v_options = array();\n        $v_options[PCLZIP_OPT_NO_COMPRESSION] = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Look for arguments\n        if ($v_size > 1) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Remove from the options list the first argument\n            array_shift($v_arg_list);\n            $v_size--;\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_ADD => 'optional',\n                    PCLZIP_CB_POST_ADD => 'optional',\n                    PCLZIP_OPT_NO_COMPRESSION => 'optional',\n                    PCLZIP_OPT_COMMENT => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                    //, PCLZIP_OPT_CRYPT => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n            } else {\n                // ----- Look for 2 args\n                // Here we need to support the first historic synopsis of the\n                // method.\n                // ----- Get the first argument\n                $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Init\n        $v_string_list = array();\n        $v_att_list = array();\n        $v_filedescr_list = array();\n        $p_result_list = array();\n\n        // ----- Look if the $p_filelist is really an array\n        if (is_array($p_filelist)) {\n            // ----- Look if the first element is also an array\n            //             This will mean that this is a file description entry\n            if (isset($p_filelist[0]) && is_array($p_filelist[0])) {\n                $v_att_list = $p_filelist;\n            } else {\n                // ----- The list is a list of string names\n                $v_string_list = $p_filelist;\n            }\n        } elseif (is_string($p_filelist)) {\n            // ----- Look if the $p_filelist is a string\n            // ----- Create a list from the string\n            $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);\n        } else {\n            // ----- Invalid variable type for $p_filelist\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_filelist\");\n            return 0;\n        }\n\n        // ----- Reformat the string list\n        if (sizeof($v_string_list) != 0) {\n            foreach ($v_string_list as $v_string) {\n                if ($v_string != '') {\n                    $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;\n                } else {\n                }\n            }\n        }\n\n        // ----- For each file in the list check the attributes\n        $v_supported_attributes = array(\n            PCLZIP_ATT_FILE_NAME => 'mandatory',\n            PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional',\n            PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional',\n            PCLZIP_ATT_FILE_MTIME => 'optional',\n            PCLZIP_ATT_FILE_CONTENT => 'optional',\n            PCLZIP_ATT_FILE_COMMENT => 'optional'\n        );\n        foreach ($v_att_list as $v_entry) {\n            $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes);\n            if ($v_result != 1) {\n                return 0;\n            }\n        }\n\n        // ----- Expand the filelist (expand directories)\n        $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Call the create fct\n        $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Return\n        return $p_result_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //     add($p_filelist, $p_add_dir=\"\", $p_remove_dir=\"\")\n    //     add($p_filelist, $p_option, $p_option_value, ...)\n    // Description :\n    //     This method supports two synopsis. The first one is historical.\n    //     This methods add the list of files in an existing archive.\n    //     If a file with the same name already exists, it is added at the end of the\n    //     archive, the first one is still present.\n    //     If the archive does not exist, it is created.\n    // Parameters :\n    //     $p_filelist : An array containing file or directory names, or\n    //                                 a string containing one filename or one directory name, or\n    //                                 a string containing a list of filenames and/or directory\n    //                                 names separated by spaces.\n    //     $p_add_dir : A path to add before the real path of the archived file,\n    //                                in order to have it memorized in the archive.\n    //     $p_remove_dir : A path to remove from the real path of the file to archive,\n    //                                     in order to have a shorter path memorized in the archive.\n    //                                     When $p_add_dir and $p_remove_dir are set, $p_remove_dir\n    //                                     is removed first, before $p_add_dir is added.\n    // Options :\n    //     PCLZIP_OPT_ADD_PATH :\n    //     PCLZIP_OPT_REMOVE_PATH :\n    //     PCLZIP_OPT_REMOVE_ALL_PATH :\n    //     PCLZIP_OPT_COMMENT :\n    //     PCLZIP_OPT_ADD_COMMENT :\n    //     PCLZIP_OPT_PREPEND_COMMENT :\n    //     PCLZIP_CB_PRE_ADD :\n    //     PCLZIP_CB_POST_ADD :\n    // Return Values :\n    //     0 on failure,\n    //     The list of the added files, with a status of the add action.\n    //     (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function add($p_filelist)\n    {\n        $v_result=1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Set default values\n        $v_options = array();\n        $v_options[PCLZIP_OPT_NO_COMPRESSION] = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Look for arguments\n        if ($v_size > 1) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Remove form the options list the first argument\n            array_shift($v_arg_list);\n            $v_size--;\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_ADD => 'optional',\n                    PCLZIP_CB_POST_ADD => 'optional',\n                    PCLZIP_OPT_NO_COMPRESSION => 'optional',\n                    PCLZIP_OPT_COMMENT => 'optional',\n                    PCLZIP_OPT_ADD_COMMENT => 'optional',\n                    PCLZIP_OPT_PREPEND_COMMENT => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                    //, PCLZIP_OPT_CRYPT => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n            } else {\n                // ----- Look for 2 args\n                // Here we need to support the first historic synopsis of the\n                // method.\n                // ----- Get the first argument\n                $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    // ----- Return\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Init\n        $v_string_list = array();\n        $v_att_list = array();\n        $v_filedescr_list = array();\n        $p_result_list = array();\n\n        // ----- Look if the $p_filelist is really an array\n        if (is_array($p_filelist)) {\n            // ----- Look if the first element is also an array\n            //             This will mean that this is a file description entry\n            if (isset($p_filelist[0]) && is_array($p_filelist[0])) {\n                $v_att_list = $p_filelist;\n            } else {\n                // ----- The list is a list of string names\n                $v_string_list = $p_filelist;\n            }\n        } elseif (is_string($p_filelist)) {\n            // ----- Look if the $p_filelist is a string\n            // ----- Create a list from the string\n            $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);\n        } else {\n            // ----- Invalid variable type for $p_filelist\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type '\".gettype($p_filelist).\"' for p_filelist\");\n            return 0;\n        }\n\n        // ----- Reformat the string list\n        if (sizeof($v_string_list) != 0) {\n            foreach ($v_string_list as $v_string) {\n                $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;\n            }\n        }\n\n        // ----- For each file in the list check the attributes\n        $v_supported_attributes = array(\n          PCLZIP_ATT_FILE_NAME => 'mandatory',\n          PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional',\n          PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional',\n          PCLZIP_ATT_FILE_MTIME => 'optional',\n          PCLZIP_ATT_FILE_CONTENT => 'optional',\n          PCLZIP_ATT_FILE_COMMENT => 'optional',\n        );\n        foreach ($v_att_list as $v_entry) {\n            $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes);\n            if ($v_result != 1) {\n                return 0;\n            }\n        }\n\n        // ----- Expand the filelist (expand directories)\n        $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Call the create fct\n        $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);\n        if ($v_result != 1) {\n            return 0;\n        }\n\n        // ----- Return\n        return $p_result_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : listContent()\n    // Description :\n    //     This public method, gives the list of the files and directories, with their\n    //     properties.\n    //     The properties of each entries in the list are (used also in other functions) :\n    //         filename : Name of the file. For a create or add action it is the filename\n    //                                given by the user. For an extract function it is the filename\n    //                                of the extracted file.\n    //         stored_filename : Name of the file / directory stored in the archive.\n    //         size : Size of the stored file.\n    //         compressed_size : Size of the file's data compressed in the archive\n    //                                             (without the headers overhead)\n    //         mtime : Last known modification date of the file (UNIX timestamp)\n    //         comment : Comment associated with the file\n    //         folder : true | false\n    //         index : index of the file in the archive\n    //         status : status of the action (depending of the action) :\n    //                            Values are :\n    //                                ok : OK !\n    //                                filtered : the file / dir is not extracted (filtered by user)\n    //                                already_a_directory : the file can not be extracted because a\n    //                                                                            directory with the same name already exists\n    //                                write_protected : the file can not be extracted because a file\n    //                                                                    with the same name already exists and is\n    //                                                                    write protected\n    //                                newer_exist : the file was not extracted because a newer file exists\n    //                                path_creation_fail : the file is not extracted because the folder\n    //                                                                         does not exist and can not be created\n    //                                write_error : the file was not extracted because there was a\n    //                                                            error while writing the file\n    //                                read_error : the file was not extracted because there was a error\n    //                                                         while reading the file\n    //                                invalid_header : the file was not extracted because of an archive\n    //                                                                 format error (bad file header)\n    //     Note that each time a method can continue operating when there\n    //     is an action error on a file, the error is only logged in the file status.\n    // Return Values :\n    //     0 on an unrecoverable failure,\n    //     The list of the files in the archive.\n    // --------------------------------------------------------------------------------\n    public function listContent()\n    {\n        $v_result=1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return(0);\n        }\n\n        // ----- Call the extracting fct\n        $p_list = array();\n        if (($v_result = $this->privList($p_list)) != 1) {\n            unset($p_list);\n            return(0);\n        }\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //     extract($p_path=\"./\", $p_remove_path=\"\")\n    //     extract([$p_option, $p_option_value, ...])\n    // Description :\n    //     This method supports two synopsis. The first one is historical.\n    //     This method extract all the files / directories from the archive to the\n    //     folder indicated in $p_path.\n    //     If you want to ignore the 'root' part of path of the memorized files\n    //     you can indicate this in the optional $p_remove_path parameter.\n    //     By default, if a newer file with the same name already exists, the\n    //     file is not extracted.\n    //\n    //     If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions\n    //     are used, the path indicated in PCLZIP_OPT_ADD_PATH is append\n    //     at the end of the path value of PCLZIP_OPT_PATH.\n    // Parameters :\n    //     $p_path : Path where the files and directories are to be extracted\n    //     $p_remove_path : First part ('root' part) of the memorized path\n    //                                        (if any similar) to remove while extracting.\n    // Options :\n    //     PCLZIP_OPT_PATH :\n    //     PCLZIP_OPT_ADD_PATH :\n    //     PCLZIP_OPT_REMOVE_PATH :\n    //     PCLZIP_OPT_REMOVE_ALL_PATH :\n    //     PCLZIP_CB_PRE_EXTRACT :\n    //     PCLZIP_CB_POST_EXTRACT :\n    // Return Values :\n    //     0 or a negative value on failure,\n    //     The list of the extracted files, with a status of the action.\n    //     (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function extract()\n    {\n        $v_result=1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return(0);\n        }\n\n        // ----- Set default values\n        $v_options = array();\n    //        $v_path = \"./\";\n        $v_path = '';\n        $v_remove_path = \"\";\n        $v_remove_all_path = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Default values for option\n        $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false;\n\n        // ----- Look for arguments\n        if ($v_size > 0) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (\n                  PCLZIP_OPT_PATH => 'optional',\n                  PCLZIP_OPT_REMOVE_PATH => 'optional',\n                  PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                  PCLZIP_OPT_ADD_PATH => 'optional',\n                  PCLZIP_CB_PRE_EXTRACT => 'optional',\n                  PCLZIP_CB_POST_EXTRACT => 'optional',\n                  PCLZIP_OPT_SET_CHMOD => 'optional',\n                  PCLZIP_OPT_BY_NAME => 'optional',\n                  PCLZIP_OPT_BY_EREG => 'optional',\n                  PCLZIP_OPT_BY_PREG => 'optional',\n                  PCLZIP_OPT_BY_INDEX => 'optional',\n                  PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',\n                  PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',\n                  PCLZIP_OPT_REPLACE_NEWER => 'optional',\n                  PCLZIP_OPT_STOP_ON_ERROR => 'optional',\n                  PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',\n                  PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                  PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                  PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n\n                // ----- Set the arguments\n                if (isset($v_options[PCLZIP_OPT_PATH])) {\n                    $v_path = $v_options[PCLZIP_OPT_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {\n                    $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n                    $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {\n                    // ----- Check for '/' in last path char\n                    if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {\n                        $v_path .= '/';\n                    }\n                    $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];\n                }\n            } else {\n                // ----- Look for 2 args\n                // Here we need to support the first historic synopsis of the\n                // method.\n                // ----- Get the first argument\n                $v_path = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_remove_path = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    // ----- Return\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Trace\n\n        // ----- Call the extracting fct\n        $p_list = array();\n        $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options);\n        if ($v_result < 1) {\n            unset($p_list);\n            return(0);\n        }\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //     extractByIndex($p_index, $p_path=\"./\", $p_remove_path=\"\")\n    //     extractByIndex($p_index, [$p_option, $p_option_value, ...])\n    // Description :\n    //     This method supports two synopsis. The first one is historical.\n    //     This method is doing a partial extract of the archive.\n    //     The extracted files or folders are identified by their index in the\n    //     archive (from 0 to n).\n    //     Note that if the index identify a folder, only the folder entry is\n    //     extracted, not all the files included in the archive.\n    // Parameters :\n    //     $p_index : A single index (integer) or a string of indexes of files to\n    //                            extract. The form of the string is \"0,4-6,8-12\" with only numbers\n    //                            and '-' for range or ',' to separate ranges. No spaces or ';'\n    //                            are allowed.\n    //     $p_path : Path where the files and directories are to be extracted\n    //     $p_remove_path : First part ('root' part) of the memorized path\n    //                                        (if any similar) to remove while extracting.\n    // Options :\n    //     PCLZIP_OPT_PATH :\n    //     PCLZIP_OPT_ADD_PATH :\n    //     PCLZIP_OPT_REMOVE_PATH :\n    //     PCLZIP_OPT_REMOVE_ALL_PATH :\n    //     PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and\n    //         not as files.\n    //         The resulting content is in a new field 'content' in the file\n    //         structure.\n    //         This option must be used alone (any other options are ignored).\n    //     PCLZIP_CB_PRE_EXTRACT :\n    //     PCLZIP_CB_POST_EXTRACT :\n    // Return Values :\n    //     0 on failure,\n    //     The list of the extracted files, with a status of the action.\n    //     (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    //function extractByIndex($p_index, options...)\n    public function extractByIndex($p_index)\n    {\n        $v_result=1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return(0);\n        }\n\n        // ----- Set default values\n        $v_options = array();\n    //        $v_path = \"./\";\n        $v_path = '';\n        $v_remove_path = \"\";\n        $v_remove_all_path = false;\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Default values for option\n        $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false;\n\n        // ----- Look for arguments\n        if ($v_size > 1) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Remove form the options list the first argument\n            array_shift($v_arg_list);\n            $v_size--;\n\n            // ----- Look for first arg\n            if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n                // ----- Parse the options\n                $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array(\n                    PCLZIP_OPT_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_PATH => 'optional',\n                    PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                    PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',\n                    PCLZIP_OPT_ADD_PATH => 'optional',\n                    PCLZIP_CB_PRE_EXTRACT => 'optional',\n                    PCLZIP_CB_POST_EXTRACT => 'optional',\n                    PCLZIP_OPT_SET_CHMOD => 'optional',\n                    PCLZIP_OPT_REPLACE_NEWER => 'optional',\n                    PCLZIP_OPT_STOP_ON_ERROR => 'optional',\n                    PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                    PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                ));\n                if ($v_result != 1) {\n                    return 0;\n                }\n\n                // ----- Set the arguments\n                if (isset($v_options[PCLZIP_OPT_PATH])) {\n                    $v_path = $v_options[PCLZIP_OPT_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {\n                    $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n                    $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n                }\n                if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {\n                    // ----- Check for '/' in last path char\n                    if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {\n                        $v_path .= '/';\n                    }\n                    $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];\n                }\n                if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {\n                    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false;\n                } else {\n                }\n            } else {\n                // ----- Look for 2 args\n                // Here we need to support the first historic synopsis of the\n                // method.\n\n                // ----- Get the first argument\n                $v_path = $v_arg_list[0];\n\n                // ----- Look for the optional second argument\n                if ($v_size == 2) {\n                    $v_remove_path = $v_arg_list[1];\n                } elseif ($v_size > 2) {\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n                    // ----- Return\n                    return 0;\n                }\n            }\n        }\n\n        // ----- Trace\n\n        // ----- Trick\n        // Here I want to reuse extractByRule(), so I need to parse the $p_index\n        // with privParseOptions()\n        $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);\n        $v_options_trick = array();\n        $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array (PCLZIP_OPT_BY_INDEX => 'optional'));\n        if ($v_result != 1) {\n            return 0;\n        }\n        $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];\n\n        // ----- Look for default option values\n        $this->privOptionDefaultThreshold($v_options);\n\n        // ----- Call the extracting fct\n        if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {\n            return(0);\n        }\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function :\n    //     delete([$p_option, $p_option_value, ...])\n    // Description :\n    //     This method removes files from the archive.\n    //     If no parameters are given, then all the archive is emptied.\n    // Parameters :\n    //     None or optional arguments.\n    // Options :\n    //     PCLZIP_OPT_BY_INDEX :\n    //     PCLZIP_OPT_BY_NAME :\n    //     PCLZIP_OPT_BY_EREG :\n    //     PCLZIP_OPT_BY_PREG :\n    // Return Values :\n    //     0 on failure,\n    //     The list of the files which are still present in the archive.\n    //     (see PclZip::listContent() for list entry format)\n    // --------------------------------------------------------------------------------\n    public function delete()\n    {\n        $v_result=1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return(0);\n        }\n\n        // ----- Set default values\n        $v_options = array();\n\n        // ----- Look for variable options arguments\n        $v_size = func_num_args();\n\n        // ----- Look for arguments\n        if ($v_size > 0) {\n            // ----- Get the arguments\n            $v_arg_list = func_get_args();\n\n            // ----- Parse the options\n            $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (\n                PCLZIP_OPT_BY_NAME => 'optional',\n                PCLZIP_OPT_BY_EREG => 'optional',\n                PCLZIP_OPT_BY_PREG => 'optional',\n                PCLZIP_OPT_BY_INDEX => 'optional'\n            ));\n            if ($v_result != 1) {\n                    return 0;\n            }\n        }\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Call the delete fct\n        $v_list = array();\n        if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {\n            $this->privSwapBackMagicQuotes();\n            unset($v_list);\n            return(0);\n        }\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : deleteByIndex()\n    // Description :\n    //     ***** Deprecated *****\n    //     delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.\n    // --------------------------------------------------------------------------------\n    public function deleteByIndex($p_index)\n    {\n\n        $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);\n\n        // ----- Return\n        return $p_list;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : properties()\n    // Description :\n    //     This method gives the properties of the archive.\n    //     The properties are :\n    //         nb : Number of files in the archive\n    //         comment : Comment associated with the archive file\n    //         status : not_exist, ok\n    // Parameters :\n    //     None\n    // Return Values :\n    //     0 on failure,\n    //     An array with the archive properties.\n    // --------------------------------------------------------------------------------\n    public function properties()\n    {\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            $this->privSwapBackMagicQuotes();\n            return(0);\n        }\n\n        // ----- Default properties\n        $v_prop = array();\n        $v_prop['comment'] = '';\n        $v_prop['nb'] = 0;\n        $v_prop['status'] = 'not_exist';\n\n        // ----- Look if file exists\n        if (@is_file($this->zipname)) {\n            // ----- Open the zip file\n            if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) {\n                $this->privSwapBackMagicQuotes();\n\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\''.$this->zipname.'\\' in binary read mode');\n\n                // ----- Return\n                return 0;\n            }\n\n            // ----- Read the central directory informations\n            $v_central_dir = array();\n            if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n                $this->privSwapBackMagicQuotes();\n                return 0;\n            }\n\n            // ----- Close the zip file\n            $this->privCloseFd();\n\n            // ----- Set the user attributes\n            $v_prop['comment'] = $v_central_dir['comment'];\n            $v_prop['nb'] = $v_central_dir['entries'];\n            $v_prop['status'] = 'ok';\n        }\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_prop;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : duplicate()\n    // Description :\n    //     This method creates an archive by copying the content of an other one. If\n    //     the archive already exist, it is replaced by the new one without any warning.\n    // Parameters :\n    //     $p_archive : The filename of a valid archive, or\n    //                                a valid PclZip object.\n    // Return Values :\n    //     1 on success.\n    //     0 or a negative value on error (error code).\n    // --------------------------------------------------------------------------------\n    public function duplicate($p_archive)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Look if the $p_archive is a PclZip object\n        if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) {\n            // ----- Duplicate the archive\n            $v_result = $this->privDuplicate($p_archive->zipname);\n        } elseif (is_string($p_archive)) {\n            // ----- Look if the $p_archive is a string (so a filename)\n            // ----- Check that $p_archive is a valid zip file\n            // TBC : Should also check the archive format\n            if (!is_file($p_archive)) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"No file with filename '\".$p_archive.\"'\");\n                $v_result = PCLZIP_ERR_MISSING_FILE;\n            } else {\n                // ----- Duplicate the archive\n                $v_result = $this->privDuplicate($p_archive);\n            }\n        } else {\n            // ----- Invalid variable\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_archive_to_add\");\n            $v_result = PCLZIP_ERR_INVALID_PARAMETER;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : merge()\n    // Description :\n    //     This method merge the $p_archive_to_add archive at the end of the current\n    //     one ($this).\n    //     If the archive ($this) does not exist, the merge becomes a duplicate.\n    //     If the $p_archive_to_add archive does not exist, the merge is a success.\n    // Parameters :\n    //     $p_archive_to_add : It can be directly the filename of a valid zip archive,\n    //                                             or a PclZip object archive.\n    // Return Values :\n    //     1 on success,\n    //     0 or negative values on error (see below).\n    // --------------------------------------------------------------------------------\n    public function merge($p_archive_to_add)\n    {\n        $v_result = 1;\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Check archive\n        if (!$this->privCheckFormat()) {\n            return(0);\n        }\n\n        // ----- Look if the $p_archive_to_add is a PclZip object\n        if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) {\n            // ----- Merge the archive\n            $v_result = $this->privMerge($p_archive_to_add);\n        } elseif (is_string($p_archive_to_add)) {\n            // ----- Look if the $p_archive_to_add is a string (so a filename)\n            // ----- Create a temporary archive\n            $v_object_archive = new PclZip($p_archive_to_add);\n\n            // ----- Merge the archive\n            $v_result = $this->privMerge($v_object_archive);\n        } else {\n            // ----- Invalid variable\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_archive_to_add\");\n            $v_result = PCLZIP_ERR_INVALID_PARAMETER;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n\n\n    // --------------------------------------------------------------------------------\n    // Function : errorCode()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function errorCode()\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            return(PclErrorCode());\n        } else {\n            return($this->error_code);\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : errorName()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function errorName($p_with_code = false)\n    {\n        $v_name = array(\n            PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',\n            PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',\n            PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',\n            PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',\n            PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',\n            PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',\n            PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',\n            PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',\n            PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',\n            PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',\n            PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',\n            PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',\n            PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',\n            PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',\n            PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',\n            PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',\n            PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',\n            PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',\n            PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION',\n            PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE',\n            PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION',\n        );\n\n        if (isset($v_name[$this->error_code])) {\n            $v_value = $v_name[$this->error_code];\n        } else {\n            $v_value = 'NoName';\n        }\n\n        if ($p_with_code) {\n            return($v_value.' ('.$this->error_code.')');\n        } else {\n            return($v_value);\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : errorInfo()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function errorInfo($p_full = false)\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            return(PclErrorString());\n        } else {\n            if ($p_full) {\n                return($this->errorName(true).\" : \".$this->error_string);\n            } else {\n                return($this->error_string.\" [code \".$this->error_code.\"]\");\n            }\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n\n    // --------------------------------------------------------------------------------\n    // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****\n    // *****                                                                                                                *****\n    // *****             THESES FUNCTIONS MUST NOT BE USED DIRECTLY             *****\n    // --------------------------------------------------------------------------------\n\n\n\n    // --------------------------------------------------------------------------------\n    // Function : privCheckFormat()\n    // Description :\n    //     This method check that the archive exists and is a valid zip archive.\n    //     Several level of check exists. (futur)\n    // Parameters :\n    //     $p_level : Level of check. Default 0.\n    //                            0 : Check the first bytes (magic codes) (default value))\n    //                            1 : 0 + Check the central directory (futur)\n    //                            2 : 1 + Check each file header (futur)\n    // Return Values :\n    //     true on success,\n    //     false on error, the error code is set.\n    // --------------------------------------------------------------------------------\n    public function privCheckFormat($p_level = 0)\n    {\n        $v_result = true;\n\n        // ----- Reset the file system cache\n        clearstatcache();\n\n        // ----- Reset the error handler\n        $this->privErrorReset();\n\n        // ----- Look if the file exits\n        if (!is_file($this->zipname)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"Missing archive file '\".$this->zipname.\"'\");\n            return(false);\n        }\n\n        // ----- Check that the file is readeable\n        if (!is_readable($this->zipname)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to read archive '\".$this->zipname.\"'\");\n            return(false);\n        }\n\n        // ----- Check the magic code\n        // TBC\n\n        // ----- Check the central header\n        // TBC\n\n        // ----- Check each file header\n        // TBC\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privParseOptions()\n    // Description :\n    //     This internal methods reads the variable list of arguments ($p_options_list,\n    //     $p_size) and generate an array with the options and values ($v_result_list).\n    //     $v_requested_options contains the options that can be present and those that\n    //     must be present.\n    //     $v_requested_options is an array, with the option value as key, and 'optional',\n    //     or 'mandatory' as value.\n    // Parameters :\n    //     See above.\n    // Return Values :\n    //     1 on success.\n    //     0 on failure.\n    // --------------------------------------------------------------------------------\n    public function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false)\n    {\n        $v_result=1;\n\n        // ----- Read the options\n        $i=0;\n        while ($i<$p_size) {\n            // ----- Check if the option is supported\n            if (!isset($v_requested_options[$p_options_list[$i]])) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid optional parameter '\".$p_options_list[$i].\"' for this method\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Look for next option\n            switch ($p_options_list[$i]) {\n                // ----- Look for options that request a path value\n                case PCLZIP_OPT_PATH:\n                case PCLZIP_OPT_REMOVE_PATH:\n                case PCLZIP_OPT_ADD_PATH:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);\n                    $i++;\n                    break;\n\n                case PCLZIP_OPT_TEMP_FILE_THRESHOLD:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'\");\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Check the value\n                    $v_value = $p_options_list[$i+1];\n                    if ((!is_integer($v_value)) || ($v_value<0)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Integer expected for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value (and convert it in bytes)\n                    $v_result_list[$p_options_list[$i]] = $v_value*1048576;\n                    $i++;\n                    break;\n\n                case PCLZIP_OPT_TEMP_FILE_ON:\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'\");\n                        return PclZip::errorCode();\n                    }\n\n                    $v_result_list[$p_options_list[$i]] = true;\n                    break;\n\n                case PCLZIP_OPT_TEMP_FILE_OFF:\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'\");\n                        return PclZip::errorCode();\n                    }\n                    // ----- Check for incompatible options\n                    if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'\");\n                        return PclZip::errorCode();\n                    }\n                    $v_result_list[$p_options_list[$i]] = true;\n                    break;\n\n                case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i+1]) && ($p_options_list[$i+1] != '')) {\n                        $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);\n                        $i++;\n                    } else {\n                    }\n                    break;\n                // ----- Look for options that request an array of string for value\n                case PCLZIP_OPT_BY_NAME:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i+1])) {\n                            $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];\n                    } elseif (is_array($p_options_list[$i+1])) {\n                            $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    $i++;\n                    break;\n                // ----- Look for options that request an EREG or PREG expression\n                case PCLZIP_OPT_BY_EREG:\n                    // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG\n                    // to PCLZIP_OPT_BY_PREG\n                    $p_options_list[$i] = PCLZIP_OPT_BY_PREG;\n                case PCLZIP_OPT_BY_PREG:\n                //case PCLZIP_OPT_CRYPT :\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i+1])) {\n                            $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    $i++;\n                    break;\n\n                // ----- Look for options that takes a string\n                case PCLZIP_OPT_COMMENT:\n                case PCLZIP_OPT_ADD_COMMENT:\n                case PCLZIP_OPT_PREPEND_COMMENT:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    if (is_string($p_options_list[$i+1])) {\n                            $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\" .PclZipUtilOptionText($p_options_list[$i]) .\"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    $i++;\n                    break;\n\n                // ----- Look for options that request an array of index\n                case PCLZIP_OPT_BY_INDEX:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_work_list = array();\n                    if (is_string($p_options_list[$i+1])) {\n                        // ----- Remove spaces\n                        $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');\n\n                        // ----- Parse items\n                        $v_work_list = explode(\",\", $p_options_list[$i+1]);\n                    } elseif (is_integer($p_options_list[$i+1])) {\n                            $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];\n                    } elseif (is_array($p_options_list[$i+1])) {\n                            $v_work_list = $p_options_list[$i+1];\n                    } else {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Value must be integer, string or array for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Reduce the index list\n                    // each index item in the list must be a couple with a start and\n                    // an end value : [0,3], [5-5], [8-10], ...\n                    // ----- Check the format of each item\n                    $v_sort_flag=false;\n                    $v_sort_value=0;\n                    for ($j=0; $j<sizeof($v_work_list); $j++) {\n                        // ----- Explode the item\n                        $v_item_list = explode(\"-\", $v_work_list[$j]);\n                        $v_size_item_list = sizeof($v_item_list);\n\n                        // ----- TBC : Here we might check that each item is a\n                        // real integer ...\n\n                        // ----- Look for single value\n                        if ($v_size_item_list == 1) {\n                            // ----- Set the option value\n                            $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];\n                            $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];\n                        } elseif ($v_size_item_list == 2) {\n                            // ----- Set the option value\n                            $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];\n                            $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];\n                        } else {\n                            // ----- Error log\n                            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Too many values in index range for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                            // ----- Return\n                            return PclZip::errorCode();\n                        }\n\n\n                        // ----- Look for list sort\n                        if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {\n                            $v_sort_flag=true;\n\n                            // ----- TBC : An automatic sort should be writen ...\n                            // ----- Error log\n                            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Invalid order of index range for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                            // ----- Return\n                            return PclZip::errorCode();\n                        }\n                        $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];\n                    }\n\n                    // ----- Sort the items\n                    if ($v_sort_flag) {\n                        // TBC : To Be Completed\n                    }\n                    // ----- Next option\n                    $i++;\n                    break;\n                // ----- Look for options that request no value\n                case PCLZIP_OPT_REMOVE_ALL_PATH:\n                case PCLZIP_OPT_EXTRACT_AS_STRING:\n                case PCLZIP_OPT_NO_COMPRESSION:\n                case PCLZIP_OPT_EXTRACT_IN_OUTPUT:\n                case PCLZIP_OPT_REPLACE_NEWER:\n                case PCLZIP_OPT_STOP_ON_ERROR:\n                    $v_result_list[$p_options_list[$i]] = true;\n                    break;\n                // ----- Look for options that request an octal value\n                case PCLZIP_OPT_SET_CHMOD:\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                    // ----- Get the value\n                    $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n                    $i++;\n                    break;\n\n                // ----- Look for options that request a call-back\n                case PCLZIP_CB_PRE_EXTRACT:\n                case PCLZIP_CB_POST_EXTRACT:\n                case PCLZIP_CB_PRE_ADD:\n                case PCLZIP_CB_POST_ADD:\n                /* for futur use\n                case PCLZIP_CB_PRE_DELETE :\n                case PCLZIP_CB_POST_DELETE :\n                case PCLZIP_CB_PRE_LIST :\n                case PCLZIP_CB_POST_LIST :\n                */\n                    // ----- Check the number of parameters\n                    if (($i+1) >= $p_size) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Get the value\n                    $v_function_name = $p_options_list[$i+1];\n\n                    // ----- Check that the value is a valid existing function\n                    if (!function_exists($v_function_name)) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Function '\".$v_function_name.\"()' is not an existing function for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Set the attribute\n                    $v_result_list[$p_options_list[$i]] = $v_function_name;\n                    $i++;\n                    break;\n                default:\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Unknown parameter '\" .$p_options_list[$i].\"'\");\n\n                    // ----- Return\n                    return PclZip::errorCode();\n            }\n\n            // ----- Next options\n            $i++;\n        }\n\n        // ----- Look for mandatory options\n        if ($v_requested_options !== false) {\n            for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {\n                // ----- Look for mandatory option\n                if ($v_requested_options[$key] == 'mandatory') {\n                    // ----- Look if present\n                    if (!isset($v_result_list[$key])) {\n                        // ----- Error log\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Missing mandatory parameter \".PclZipUtilOptionText($key).\"(\".$key.\")\");\n\n                        // ----- Return\n                        return PclZip::errorCode();\n                    }\n                }\n            }\n        }\n\n        // ----- Look for default values\n        if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privOptionDefaultThreshold()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privOptionDefaultThreshold(&$p_options)\n    {\n        $v_result=1;\n\n        if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {\n            return $v_result;\n        }\n\n        // ----- Get 'memory_limit' configuration value\n        $v_memory_limit = ini_get('memory_limit');\n        $v_memory_limit = trim($v_memory_limit);\n        $last = strtolower(substr($v_memory_limit, -1));\n\n        if ($last == 'g') {\n            //$v_memory_limit = $v_memory_limit*1024*1024*1024;\n            $v_memory_limit = $v_memory_limit*1073741824;\n        }\n        if ($last == 'm') {\n            //$v_memory_limit = $v_memory_limit*1024*1024;\n            $v_memory_limit = $v_memory_limit*1048576;\n        }\n        if ($last == 'k') {\n            $v_memory_limit = $v_memory_limit*1024;\n        }\n\n        $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO);\n\n        // ----- Sanity check : No threshold if value lower than 1M\n        if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {\n            unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privFileDescrParseAtt()\n    // Description :\n    // Parameters :\n    // Return Values :\n    //     1 on success.\n    //     0 on failure.\n    // --------------------------------------------------------------------------------\n    public function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false)\n    {\n        $v_result=1;\n\n        // ----- For each file in the list check the attributes\n        foreach ($p_file_list as $v_key => $v_value) {\n            // ----- Check if the option is supported\n            if (!isset($v_requested_options[$v_key])) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid file attribute '\".$v_key.\"' for this file\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Look for attribute\n            switch ($v_key) {\n                case PCLZIP_ATT_FILE_NAME:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);\n\n                    if ($p_filedescr['filename'] == '') {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty filename for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n                    break;\n                case PCLZIP_ATT_FILE_NEW_SHORT_NAME:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);\n\n                    if ($p_filedescr['new_short_name'] == '') {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty short filename for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n                    break;\n                case PCLZIP_ATT_FILE_NEW_FULL_NAME:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n\n                    $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);\n\n                    if ($p_filedescr['new_full_name'] == '') {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty full filename for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n                    break;\n                // ----- Look for options that takes a string\n                case PCLZIP_ATT_FILE_COMMENT:\n                    if (!is_string($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n                    $p_filedescr['comment'] = $v_value;\n                    break;\n                case PCLZIP_ATT_FILE_MTIME:\n                    if (!is_integer($v_value)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". Integer expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n                        return PclZip::errorCode();\n                    }\n                    $p_filedescr['mtime'] = $v_value;\n                    break;\n                case PCLZIP_ATT_FILE_CONTENT:\n                    $p_filedescr['content'] = $v_value;\n                    break;\n                default:\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Unknown parameter '\".$v_key.\"'\");\n\n                    // ----- Return\n                    return PclZip::errorCode();\n            }\n\n            // ----- Look for mandatory options\n            if ($v_requested_options !== false) {\n                for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) {\n                    // ----- Look for mandatory option\n                    if ($v_requested_options[$key] == 'mandatory') {\n                        // ----- Look if present\n                        if (!isset($p_file_list[$key])) {\n                            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Missing mandatory parameter \".PclZipUtilOptionText($key).\"(\".$key.\")\");\n                            return PclZip::errorCode();\n                        }\n                    }\n                }\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privFileDescrExpand()\n    // Description :\n    //     This method look for each item of the list to see if its a file, a folder\n    //     or a string to be added as file. For any other type of files (link, other)\n    //     just ignore the item.\n    //     Then prepare the information that will be stored for that file.\n    //     When its a folder, expand the folder with all the files that are in that\n    //     folder (recursively).\n    // Parameters :\n    // Return Values :\n    //     1 on success.\n    //     0 on failure.\n    // --------------------------------------------------------------------------------\n    public function privFileDescrExpand(&$p_filedescr_list, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Create a result list\n        $v_result_list = array();\n\n        // ----- Look each entry\n        for ($i=0; $i<sizeof($p_filedescr_list); $i++) {\n            // ----- Get filedescr\n            $v_descr = $p_filedescr_list[$i];\n\n            // ----- Reduce the filename\n            $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);\n            $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);\n\n            // ----- Look for real file or folder\n            if (file_exists($v_descr['filename'])) {\n                if (@is_file($v_descr['filename'])) {\n                    $v_descr['type'] = 'file';\n                } elseif (@is_dir($v_descr['filename'])) {\n                    $v_descr['type'] = 'folder';\n                } elseif (@is_link($v_descr['filename'])) {\n                    // skip\n                    continue;\n                } else {\n                    // skip\n                    continue;\n                }\n            } elseif (isset($v_descr['content'])) {\n                // ----- Look for string added as file\n                $v_descr['type'] = 'virtual_file';\n            } else {\n                // ----- Missing file\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"File '\".$v_descr['filename'].\"' does not exist\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Calculate the stored filename\n            $this->privCalculateStoredFilename($v_descr, $p_options);\n\n            // ----- Add the descriptor in result list\n            $v_result_list[sizeof($v_result_list)] = $v_descr;\n\n            // ----- Look for folder\n            if ($v_descr['type'] == 'folder') {\n                // ----- List of items in folder\n                $v_dirlist_descr = array();\n                $v_dirlist_nb = 0;\n                if ($v_folder_handler = @opendir($v_descr['filename'])) {\n                    while (($v_item_handler = @readdir($v_folder_handler)) !== false) {\n                        // ----- Skip '.' and '..'\n                        if (($v_item_handler == '.') || ($v_item_handler == '..')) {\n                                continue;\n                        }\n\n                        // ----- Compose the full filename\n                        $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;\n\n                        // ----- Look for different stored filename\n                        // Because the name of the folder was changed, the name of the\n                        // files/sub-folders also change\n                        if (($v_descr['stored_filename'] != $v_descr['filename'])\n                                 && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {\n                            if ($v_descr['stored_filename'] != '') {\n                                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;\n                            } else {\n                                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;\n                            }\n                        }\n                        $v_dirlist_nb++;\n                    }\n\n                    @closedir($v_folder_handler);\n                } else {\n                    // TBC : unable to open folder in read mode\n                }\n\n                // ----- Expand each element of the list\n                if ($v_dirlist_nb != 0) {\n                    // ----- Expand\n                    if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {\n                        return $v_result;\n                    }\n\n                    // ----- Concat the resulting list\n                    $v_result_list = array_merge($v_result_list, $v_dirlist_descr);\n                }\n\n                // ----- Free local array\n                unset($v_dirlist_descr);\n            }\n        }\n\n        // ----- Get the result list\n        $p_filedescr_list = $v_result_list;\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCreate()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privCreate($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result=1;\n        $v_list_detail = array();\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Open the file in write mode\n        if (($v_result = $this->privOpenFd('wb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Add the list of files\n        $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);\n\n        // ----- Close\n        $this->privCloseFd();\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAdd()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAdd($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result=1;\n        $v_list_detail = array();\n\n        // ----- Look if the archive exists or is empty\n        if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) {\n            // ----- Do a create\n            $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);\n\n            // ----- Return\n            return $v_result;\n        }\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Open the zip file\n        if (($v_result=$this->privOpenFd('rb')) != 1) {\n            // ----- Magic quotes trick\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($this->zip_fd);\n\n        // ----- Creates a temporay file\n        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';\n\n        // ----- Open the temporary file in write mode\n        if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_zip_temp_name.'\\' in binary write mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Copy the files from the archive to the temporary file\n        // TBC : Here I should better append the file and go back to erase the central dir\n        $v_size = $v_central_dir['offset'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = fread($this->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Swap the file descriptor\n        // Here is a trick : I swap the temporary fd with the zip fd, in order to use\n        // the following methods on the temporary fil and not the real archive\n        $v_swap = $this->zip_fd;\n        $this->zip_fd = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Add the files\n        $v_header_list = array();\n        if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) {\n            fclose($v_zip_temp_fd);\n            $this->privCloseFd();\n            @unlink($v_zip_temp_name);\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($this->zip_fd);\n\n        // ----- Copy the block of file headers from the old archive\n        $v_size = $v_central_dir['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($v_zip_temp_fd, $v_read_size);\n            @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Create the Central Dir files header\n        for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++) {\n            // ----- Create the file header\n            if ($v_header_list[$i]['status'] == 'ok') {\n                if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                    fclose($v_zip_temp_fd);\n                    $this->privCloseFd();\n                    @unlink($v_zip_temp_name);\n                    $this->privSwapBackMagicQuotes();\n\n                    // ----- Return\n                    return $v_result;\n                }\n                $v_count++;\n            }\n\n            // ----- Transform the header to a 'usable' info\n            $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n        }\n\n        // ----- Zip file comment\n        $v_comment = $v_central_dir['comment'];\n        if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n            $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n        }\n        if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {\n            $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];\n        }\n        if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {\n            $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;\n        }\n\n        // ----- Calculate the size of the central header\n        $v_size = @ftell($this->zip_fd)-$v_offset;\n\n        // ----- Create the central dir footer\n        if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) {\n            // ----- Reset the file list\n            unset($v_header_list);\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Swap back the file descriptor\n        $v_swap = $this->zip_fd;\n        $this->zip_fd = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Close\n        $this->privCloseFd();\n\n        // ----- Close the temporary file\n        @fclose($v_zip_temp_fd);\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Delete the zip file\n        // TBC : I should test the result ...\n        @unlink($this->zipname);\n\n        // ----- Rename the temporary file\n        // TBC : I should test the result ...\n        //@rename($v_zip_temp_name, $this->zipname);\n        PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privOpenFd()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privOpenFd($p_mode)\n    {\n        $v_result=1;\n\n        // ----- Look if already open\n        if ($this->zip_fd != 0) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \\''.$this->zipname.'\\' already open');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Open the zip file\n        if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\''.$this->zipname.'\\' in '.$p_mode.' mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCloseFd()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privCloseFd()\n    {\n        $v_result=1;\n\n        if ($this->zip_fd != 0) {\n            @fclose($this->zip_fd);\n        }\n        $this->zip_fd = 0;\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddList()\n    // Description :\n    //     $p_add_dir and $p_remove_dir will give the ability to memorize a path which is\n    //     different from the real path of the file. This is usefull if you want to have PclTar\n    //     running in any directory, and memorize relative path from an other directory.\n    // Parameters :\n    //     $p_list : An array containing the file or directory names to add in the tar\n    //     $p_result_list : list of added files with their properties (specially the status field)\n    //     $p_add_dir : Path to add in the filename path archived\n    //     $p_remove_dir : Path to remove in the filename path archived\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    //    public function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)\n    public function privAddList($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Add the files\n        $v_header_list = array();\n        if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($this->zip_fd);\n\n        // ----- Create the Central Dir files header\n        for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++) {\n            // ----- Create the file header\n            if ($v_header_list[$i]['status'] == 'ok') {\n                if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                    // ----- Return\n                    return $v_result;\n                }\n                $v_count++;\n            }\n\n            // ----- Transform the header to a 'usable' info\n            $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n        }\n\n        // ----- Zip file comment\n        $v_comment = '';\n        if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n            $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n        }\n\n        // ----- Calculate the size of the central header\n        $v_size = @ftell($this->zip_fd)-$v_offset;\n\n        // ----- Create the central dir footer\n        if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) {\n            // ----- Reset the file list\n            unset($v_header_list);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddFileList()\n    // Description :\n    // Parameters :\n    //     $p_filedescr_list : An array containing the file description\n    //                                            or directory names to add in the zip\n    //     $p_result_list : list of added files with their properties (specially the status field)\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)\n    {\n        $v_result=1;\n        $v_header = array();\n\n        // ----- Recuperate the current number of elt in list\n        $v_nb = sizeof($p_result_list);\n\n        // ----- Loop on the files\n        for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {\n            // ----- Format the filename\n            $p_filedescr_list[$j]['filename'] = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);\n\n            // ----- Skip empty file names\n            // TBC : Can this be possible ? not checked in DescrParseAtt ?\n            if ($p_filedescr_list[$j]['filename'] == \"\") {\n                continue;\n            }\n\n            // ----- Check the filename\n            if (($p_filedescr_list[$j]['type'] != 'virtual_file') && (!file_exists($p_filedescr_list[$j]['filename']))) {\n                PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"File '\".$p_filedescr_list[$j]['filename'].\"' does not exist\");\n                return PclZip::errorCode();\n            }\n\n            // ----- Look if it is a file or a dir with no all path remove option\n            // or a dir with all its path removed\n    //            if (    (is_file($p_filedescr_list[$j]['filename']))\n    //                    || (    is_dir($p_filedescr_list[$j]['filename'])\n            if (($p_filedescr_list[$j]['type'] == 'file') || ($p_filedescr_list[$j]['type'] == 'virtual_file') || (($p_filedescr_list[$j]['type'] == 'folder') && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]) || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {\n                // ----- Add the file\n                $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, $p_options);\n                if ($v_result != 1) {\n                    return $v_result;\n                }\n\n                // ----- Store the file infos\n                $p_result_list[$v_nb++] = $v_header;\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAddFile($p_filedescr, &$p_header, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Working variable\n        $p_filename = $p_filedescr['filename'];\n\n        // TBC : Already done in the fileAtt check ... ?\n        if ($p_filename == \"\") {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid file list parameter (invalid or empty list)\");\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Look for a stored different filename\n        /* TBC : Removed\n        if (isset($p_filedescr['stored_filename'])) {\n            $v_stored_filename = $p_filedescr['stored_filename'];\n        }\n        else {\n            $v_stored_filename = $p_filedescr['stored_filename'];\n        }\n        */\n\n        // ----- Set the file properties\n        clearstatcache();\n        $p_header['version'] = 20;\n        $p_header['version_extracted'] = 10;\n        $p_header['flag'] = 0;\n        $p_header['compression'] = 0;\n        $p_header['crc'] = 0;\n        $p_header['compressed_size'] = 0;\n        $p_header['filename_len'] = strlen($p_filename);\n        $p_header['extra_len'] = 0;\n        $p_header['disk'] = 0;\n        $p_header['internal'] = 0;\n        $p_header['offset'] = 0;\n        $p_header['filename'] = $p_filename;\n    // TBC : Removed        $p_header['stored_filename'] = $v_stored_filename;\n        $p_header['stored_filename'] = $p_filedescr['stored_filename'];\n        $p_header['extra'] = '';\n        $p_header['status'] = 'ok';\n        $p_header['index'] = -1;\n\n        // ----- Look for regular file\n        if ($p_filedescr['type']=='file') {\n            $p_header['external'] = 0x00000000;\n            $p_header['size'] = filesize($p_filename);\n        } elseif ($p_filedescr['type']=='folder') {\n            // ----- Look for regular folder\n            $p_header['external'] = 0x00000010;\n            $p_header['mtime'] = filemtime($p_filename);\n            $p_header['size'] = filesize($p_filename);\n        } elseif ($p_filedescr['type'] == 'virtual_file') {\n            // ----- Look for virtual file\n            $p_header['external'] = 0x00000000;\n            $p_header['size'] = strlen($p_filedescr['content']);\n        }\n\n        // ----- Look for filetime\n        if (isset($p_filedescr['mtime'])) {\n            $p_header['mtime'] = $p_filedescr['mtime'];\n        } elseif ($p_filedescr['type'] == 'virtual_file') {\n            $p_header['mtime'] = time();\n        } else {\n            $p_header['mtime'] = filemtime($p_filename);\n        }\n\n        // ------ Look for file comment\n        if (isset($p_filedescr['comment'])) {\n            $p_header['comment_len'] = strlen($p_filedescr['comment']);\n            $p_header['comment'] = $p_filedescr['comment'];\n        } else {\n            $p_header['comment_len'] = 0;\n            $p_header['comment'] = '';\n        }\n\n        // ----- Look for pre-add callback\n        if (isset($p_options[PCLZIP_CB_PRE_ADD])) {\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_header, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_header['status'] = \"skipped\";\n                $v_result = 1;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {\n                $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);\n            }\n        }\n\n        // ----- Look for empty stored filename\n        if ($p_header['stored_filename'] == \"\") {\n            $p_header['status'] = \"filtered\";\n        }\n\n        // ----- Check the path length\n        if (strlen($p_header['stored_filename']) > 0xFF) {\n            $p_header['status'] = 'filename_too_long';\n        }\n\n        // ----- Look if no error, or file not skipped\n        if ($p_header['status'] == 'ok') {\n            // ----- Look for a file\n            if ($p_filedescr['type'] == 'file') {\n                // ----- Look for using temporary file to zip\n                if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])))) {\n                    $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);\n                    if ($v_result < PCLZIP_ERR_NO_ERROR) {\n                        return $v_result;\n                    }\n                } else {\n                    // ----- Use \"in memory\" zip algo\n                    // ----- Open the source file\n                    if (($v_file = @fopen($p_filename, \"rb\")) == 0) {\n                        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to open file '$p_filename' in binary read mode\");\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Read the file content\n                    $v_content = @fread($v_file, $p_header['size']);\n\n                    // ----- Close the file\n                    @fclose($v_file);\n\n                    // ----- Calculate the CRC\n                    $p_header['crc'] = @crc32($v_content);\n\n                    // ----- Look for no compression\n                    if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {\n                        // ----- Set header parameters\n                        $p_header['compressed_size'] = $p_header['size'];\n                        $p_header['compression'] = 0;\n                    } else {\n                        // ----- Look for normal compression\n                        // ----- Compress the content\n                        $v_content = @gzdeflate($v_content);\n\n                        // ----- Set header parameters\n                        $p_header['compressed_size'] = strlen($v_content);\n                        $p_header['compression'] = 8;\n                    }\n\n                    // ----- Call the header generation\n                    if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n                        @fclose($v_file);\n                        return $v_result;\n                    }\n\n                    // ----- Write the compressed (or not) content\n                    @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);\n                }\n            } elseif ($p_filedescr['type'] == 'virtual_file') {\n                // ----- Look for a virtual file (a file from string)\n                $v_content = $p_filedescr['content'];\n\n                // ----- Calculate the CRC\n                $p_header['crc'] = @crc32($v_content);\n\n                // ----- Look for no compression\n                if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {\n                    // ----- Set header parameters\n                    $p_header['compressed_size'] = $p_header['size'];\n                    $p_header['compression'] = 0;\n                } else {\n                    // ----- Look for normal compression\n                    // ----- Compress the content\n                    $v_content = @gzdeflate($v_content);\n\n                    // ----- Set header parameters\n                    $p_header['compressed_size'] = strlen($v_content);\n                    $p_header['compression'] = 8;\n                }\n\n                // ----- Call the header generation\n                if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n                    @fclose($v_file);\n                    return $v_result;\n                }\n\n                // ----- Write the compressed (or not) content\n                @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);\n            } elseif ($p_filedescr['type'] == 'folder') {\n                // ----- Look for a directory\n                // ----- Look for directory last '/'\n                if (@substr($p_header['stored_filename'], -1) != '/') {\n                    $p_header['stored_filename'] .= '/';\n                }\n\n                // ----- Set the file properties\n                $p_header['size'] = 0;\n                //$p_header['external'] = 0x41FF0010;     // Value for a folder : to be checked\n                $p_header['external'] = 0x00000010;     // Value for a folder : to be checked\n\n                // ----- Call the header generation\n                if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n                    return $v_result;\n                }\n            }\n        }\n\n        // ----- Look for post-add callback\n        if (isset($p_options[PCLZIP_CB_POST_ADD])) {\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_header, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Ignored\n                $v_result = 1;\n            }\n\n            // ----- Update the informations\n            // Nothing can be modified\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privAddFileUsingTempFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)\n    {\n        $v_result=PCLZIP_ERR_NO_ERROR;\n\n        // ----- Working variable\n        $p_filename = $p_filedescr['filename'];\n\n\n        // ----- Open the source file\n        if (($v_file = @fopen($p_filename, \"rb\")) == 0) {\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to open file '$p_filename' in binary read mode\");\n            return PclZip::errorCode();\n        }\n\n        // ----- Creates a compressed temporary file\n        $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';\n        if (($v_file_compressed = @gzopen($v_gzip_temp_name, \"wb\")) == 0) {\n            fclose($v_file);\n            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary write mode');\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        $v_size = filesize($p_filename);\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($v_file, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @gzputs($v_file_compressed, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Close the file\n        @fclose($v_file);\n        @gzclose($v_file_compressed);\n\n        // ----- Check the minimum file size\n        if (filesize($v_gzip_temp_name) < 18) {\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \\''.$v_gzip_temp_name.'\\' has invalid filesize - should be minimum 18 bytes');\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the compressed attributes\n        if (($v_file_compressed = @fopen($v_gzip_temp_name, \"rb\")) == 0) {\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary read mode');\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the gzip file header\n        $v_binary_data = @fread($v_file_compressed, 10);\n        $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);\n\n        // ----- Check some parameters\n        $v_data_header['os'] = bin2hex($v_data_header['os']);\n\n        // ----- Read the gzip file footer\n        @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);\n        $v_binary_data = @fread($v_file_compressed, 8);\n        $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);\n\n        // ----- Set the attributes\n        $p_header['compression'] = ord($v_data_header['cm']);\n        //$p_header['mtime'] = $v_data_header['mtime'];\n        $p_header['crc'] = $v_data_footer['crc'];\n        $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;\n\n        // ----- Close the file\n        @fclose($v_file_compressed);\n\n        // ----- Call the header generation\n        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n            return $v_result;\n        }\n\n        // ----- Add the compressed data\n        if (($v_file_compressed = @fopen($v_gzip_temp_name, \"rb\")) == 0) {\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary read mode');\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        fseek($v_file_compressed, 10);\n        $v_size = $p_header['compressed_size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($v_file_compressed, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Close the file\n        @fclose($v_file_compressed);\n\n        // ----- Unlink the temporary file\n        @unlink($v_gzip_temp_name);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCalculateStoredFilename()\n    // Description :\n    //     Based on file descriptor properties and global options, this method\n    //     calculate the filename that will be stored in the archive.\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privCalculateStoredFilename(&$p_filedescr, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Working variables\n        $p_filename = $p_filedescr['filename'];\n        if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {\n            $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];\n        } else {\n            $p_add_dir = '';\n        }\n        if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {\n            $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];\n        } else {\n            $p_remove_dir = '';\n        }\n        if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n            $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n        } else {\n            $p_remove_all_dir = 0;\n        }\n\n        // ----- Look for full name change\n        if (isset($p_filedescr['new_full_name'])) {\n            // ----- Remove drive letter if any\n            $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);\n        } else {\n            // ----- Look for path and/or short name change\n            // ----- Look for short name change\n            // Its when we cahnge just the filename but not the path\n            if (isset($p_filedescr['new_short_name'])) {\n                $v_path_info = pathinfo($p_filename);\n                $v_dir = '';\n                if ($v_path_info['dirname'] != '') {\n                    $v_dir = $v_path_info['dirname'].'/';\n                }\n                $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];\n            } else {\n                // ----- Calculate the stored filename\n                $v_stored_filename = $p_filename;\n            }\n\n            // ----- Look for all path to remove\n            if ($p_remove_all_dir) {\n                $v_stored_filename = basename($p_filename);\n            } elseif ($p_remove_dir != \"\") {\n                // ----- Look for partial path remove\n                if (substr($p_remove_dir, -1) != '/') {\n                    $p_remove_dir .= \"/\";\n                }\n\n                if ((substr($p_filename, 0, 2) == \"./\") || (substr($p_remove_dir, 0, 2) == \"./\")) {\n                    if ((substr($p_filename, 0, 2) == \"./\") && (substr($p_remove_dir, 0, 2) != \"./\")) {\n                        $p_remove_dir = \"./\".$p_remove_dir;\n                    }\n                    if ((substr($p_filename, 0, 2) != \"./\") && (substr($p_remove_dir, 0, 2) == \"./\")) {\n                        $p_remove_dir = substr($p_remove_dir, 2);\n                    }\n                }\n\n                $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename);\n                if ($v_compare > 0) {\n                    if ($v_compare == 2) {\n                        $v_stored_filename = \"\";\n                    } else {\n                        $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir));\n                    }\n                }\n            }\n\n            // ----- Remove drive letter if any\n            $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);\n\n            // ----- Look for path to add\n            if ($p_add_dir != \"\") {\n                if (substr($p_add_dir, -1) == \"/\") {\n                    $v_stored_filename = $p_add_dir.$v_stored_filename;\n                } else {\n                    $v_stored_filename = $p_add_dir.\"/\".$v_stored_filename;\n                }\n            }\n        }\n\n        // ----- Filename (reduce the path of stored name)\n        $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);\n        $p_filedescr['stored_filename'] = $v_stored_filename;\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privWriteFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privWriteFileHeader(&$p_header)\n    {\n        $v_result=1;\n\n        // ----- Store the offset position of the file\n        $p_header['offset'] = ftell($this->zip_fd);\n\n        // ----- Transform UNIX mtime to DOS format mdate/mtime\n        $v_date = getdate($p_header['mtime']);\n        $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;\n        $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];\n\n        // ----- Packed data\n        $v_binary_data = pack(\"VvvvvvVVVvv\", 0x04034b50, $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len']);\n\n        // ----- Write the first 148 bytes of the header in the archive\n        fputs($this->zip_fd, $v_binary_data, 30);\n\n        // ----- Write the variable fields\n        if (strlen($p_header['stored_filename']) != 0) {\n            fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));\n        }\n        if ($p_header['extra_len'] != 0) {\n            fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privWriteCentralFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privWriteCentralFileHeader(&$p_header)\n    {\n        $v_result=1;\n\n        // TBC\n        //for(reset($p_header); $key = key($p_header); next($p_header)) {\n        //}\n\n        // ----- Transform UNIX mtime to DOS format mdate/mtime\n        $v_date = getdate($p_header['mtime']);\n        $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;\n        $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];\n\n\n        // ----- Packed data\n        $v_binary_data = pack(\"VvvvvvvVVVvvvvvVV\", 0x02014b50, $p_header['version'], $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'], $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']);\n\n        // ----- Write the 42 bytes of the header in the zip file\n        fputs($this->zip_fd, $v_binary_data, 46);\n\n        // ----- Write the variable fields\n        if (strlen($p_header['stored_filename']) != 0) {\n            fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));\n        }\n        if ($p_header['extra_len'] != 0) {\n            fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);\n        }\n        if ($p_header['comment_len'] != 0) {\n            fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privWriteCentralHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)\n    {\n        $v_result = 1;\n\n        // ----- Packed data\n        $v_binary_data = pack(\"VvvvvVVv\", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment));\n\n        // ----- Write the 22 bytes of the header in the zip file\n        fputs($this->zip_fd, $v_binary_data, 22);\n\n        // ----- Write the variable fields\n        if (strlen($p_comment) != 0) {\n            fputs($this->zip_fd, $p_comment, strlen($p_comment));\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privList()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privList(&$p_list)\n    {\n        $v_result = 1;\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Open the zip file\n        if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) {\n            // ----- Magic quotes trick\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\''.$this->zipname.'\\' in binary read mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privSwapBackMagicQuotes();\n            return $v_result;\n        }\n\n        // ----- Go to beginning of Central Dir\n        @rewind($this->zip_fd);\n        if (@fseek($this->zip_fd, $v_central_dir['offset'])) {\n            $this->privSwapBackMagicQuotes();\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read each entry\n        for ($i=0; $i<$v_central_dir['entries']; $i++) {\n            // ----- Read the file header\n            if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) {\n                $this->privSwapBackMagicQuotes();\n                return $v_result;\n            }\n            $v_header['index'] = $i;\n\n            // ----- Get the only interesting attributes\n            $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);\n            unset($v_header);\n        }\n\n        // ----- Close the zip file\n        $this->privCloseFd();\n\n        // ----- Magic quotes trick\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privConvertHeader2FileInfo()\n    // Description :\n    //     This function takes the file informations from the central directory\n    //     entries and extract the interesting parameters that will be given back.\n    //     The resulting file infos are set in the array $p_info\n    //         $p_info['filename'] : Filename with full path. Given by user (add),\n    //                                                     extracted in the filesystem (extract).\n    //         $p_info['stored_filename'] : Stored filename in the archive.\n    //         $p_info['size'] = Size of the file.\n    //         $p_info['compressed_size'] = Compressed size of the file.\n    //         $p_info['mtime'] = Last modification date of the file.\n    //         $p_info['comment'] = Comment associated with the file.\n    //         $p_info['folder'] = true/false : indicates if the entry is a folder or not.\n    //         $p_info['status'] = status of the action on the file.\n    //         $p_info['crc'] = CRC of the file content.\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privConvertHeader2FileInfo($p_header, &$p_info)\n    {\n        $v_result=1;\n\n        // ----- Get the interesting attributes\n        $v_temp_path = PclZipUtilPathReduction($p_header['filename']);\n        $p_info['filename'] = $v_temp_path;\n        $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']);\n        $p_info['stored_filename'] = $v_temp_path;\n        $p_info['size'] = $p_header['size'];\n        $p_info['compressed_size'] = $p_header['compressed_size'];\n        $p_info['mtime'] = $p_header['mtime'];\n        $p_info['comment'] = $p_header['comment'];\n        $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);\n        $p_info['index'] = $p_header['index'];\n        $p_info['status'] = $p_header['status'];\n        $p_info['crc'] = $p_header['crc'];\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractByRule()\n    // Description :\n    //     Extract a file or directory depending of rules (by index, by name, ...)\n    // Parameters :\n    //     $p_file_list : An array where will be placed the properties of each\n    //                                    extracted file\n    //     $p_path : Path to add while writing the extracted files\n    //     $p_remove_path : Path to remove (from the file memorized path) while writing the\n    //                                        extracted files. If the path does not match the file path,\n    //                                        the file is extracted with its memorized path.\n    //                                        $p_remove_path does not apply to 'list' mode.\n    //                                        $p_path and $p_remove_path are commulative.\n    // Return Values :\n    //     1 on success,0 or less on error (see error code list)\n    // --------------------------------------------------------------------------------\n    public function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Magic quotes trick\n        $this->privDisableMagicQuotes();\n\n        // ----- Check the path\n        if (($p_path == \"\") || ((substr($p_path, 0, 1) != \"/\") && (substr($p_path, 0, 3) != \"../\") && (substr($p_path, 1, 2)!=\":/\"))) {\n            $p_path = \"./\".$p_path;\n        }\n\n        // ----- Reduce the path last (and duplicated) '/'\n        if (($p_path != \"./\") && ($p_path != \"/\")) {\n            // ----- Look for the path end '/'\n            while (substr($p_path, -1) == \"/\") {\n                $p_path = substr($p_path, 0, strlen($p_path)-1);\n            }\n        }\n\n        // ----- Look for path to remove format (should end by /)\n        if (($p_remove_path != \"\") && (substr($p_remove_path, -1) != '/')) {\n            $p_remove_path .= '/';\n        }\n        $p_remove_path_size = strlen($p_remove_path);\n\n        // ----- Open the zip file\n        if (($v_result = $this->privOpenFd('rb')) != 1) {\n            $this->privSwapBackMagicQuotes();\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            // ----- Close the zip file\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n        }\n\n        // ----- Start at beginning of Central Dir\n        $v_pos_entry = $v_central_dir['offset'];\n\n        // ----- Read each entry\n        $j_start = 0;\n        for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) {\n            // ----- Read next Central dir entry\n            @rewind($this->zip_fd);\n            if (@fseek($this->zip_fd, $v_pos_entry)) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $this->privSwapBackMagicQuotes();\n\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read the file header\n            $v_header = array();\n            if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $this->privSwapBackMagicQuotes();\n\n                return $v_result;\n            }\n\n            // ----- Store the index\n            $v_header['index'] = $i;\n\n            // ----- Store the file position\n            $v_pos_entry = ftell($this->zip_fd);\n\n            // ----- Look for the specific extract rules\n            $v_extract = false;\n\n            // ----- Look for extract by name rule\n            if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {\n                // ----- Look if the filename is in the list\n                for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {\n                    // ----- Look for a directory\n                    if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == \"/\") {\n                        // ----- Look if the directory is in the filename path\n                        if ((strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {\n                            $v_extract = true;\n                        }\n                    } elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {\n                        // ----- Look for a filename\n                        $v_extract = true;\n                    }\n                }\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != \"\")) {\n                // ----- Look for extract by preg rule\n                if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {\n                    $v_extract = true;\n                }\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {\n                // ----- Look for extract by index rule\n                // ----- Look if the index is in the list\n                for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {\n                    if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {\n                            $v_extract = true;\n                    }\n                    if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {\n                            $j_start = $j+1;\n                    }\n\n                    if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {\n                        break;\n                    }\n                }\n            } else {\n                // ----- Look for no rule, which means extract all the archive\n                $v_extract = true;\n            }\n\n            // ----- Check compression method\n            if (($v_extract) && (($v_header['compression'] != 8) && ($v_header['compression'] != 0))) {\n                $v_header['status'] = 'unsupported_compression';\n\n                // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n                    $this->privSwapBackMagicQuotes();\n\n                    PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, \"Filename '\".$v_header['stored_filename'].\"' is compressed by an unsupported compression method (\".$v_header['compression'].\") \");\n\n                    return PclZip::errorCode();\n                }\n            }\n\n            // ----- Check encrypted files\n            if (($v_extract) && (($v_header['flag'] & 1) == 1)) {\n                $v_header['status'] = 'unsupported_encryption';\n                // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n                    $this->privSwapBackMagicQuotes();\n\n                    PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, \"Unsupported encryption for  filename '\".$v_header['stored_filename'].\"'\");\n\n                    return PclZip::errorCode();\n                }\n            }\n\n            // ----- Look for real extraction\n            if (($v_extract) && ($v_header['status'] != 'ok')) {\n                $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]);\n                if ($v_result != 1) {\n                    $this->privCloseFd();\n                    $this->privSwapBackMagicQuotes();\n                    return $v_result;\n                }\n\n                $v_extract = false;\n            }\n\n            // ----- Look for real extraction\n            if ($v_extract) {\n                // ----- Go to the file position\n                @rewind($this->zip_fd);\n                if (@fseek($this->zip_fd, $v_header['offset'])) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n\n                    $this->privSwapBackMagicQuotes();\n\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                    // ----- Return\n                    return PclZip::errorCode();\n                }\n\n                // ----- Look for extraction as string\n                if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {\n                    $v_string = '';\n\n                    // ----- Extracting the file\n                    $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);\n                    if ($v_result1 < 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n                        return $v_result1;\n                    }\n\n                    // ----- Get the only interesting attributes\n                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) {\n                        // ----- Close the zip file\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result;\n                    }\n\n                    // ----- Set the file content\n                    $p_file_list[$v_nb_extracted]['content'] = $v_string;\n\n                    // ----- Next extracted file\n                    $v_nb_extracted++;\n\n                    // ----- Look for user callback abort\n                    if ($v_result1 == 2) {\n                        break;\n                    }\n                } elseif ((isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {\n                    // ----- Look for extraction in standard output\n                    // ----- Extracting the file in standard output\n                    $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);\n                    if ($v_result1 < 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n                        return $v_result1;\n                    }\n\n                    // ----- Get the only interesting attributes\n                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n                        return $v_result;\n                    }\n\n                    // ----- Look for user callback abort\n                    if ($v_result1 == 2) {\n                        break;\n                    }\n                } else {\n                    // ----- Look for normal extraction\n                    // ----- Extracting the file\n                    $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options);\n                    if ($v_result1 < 1) {\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n                        return $v_result1;\n                    }\n\n                    // ----- Get the only interesting attributes\n                    if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {\n                        // ----- Close the zip file\n                        $this->privCloseFd();\n                        $this->privSwapBackMagicQuotes();\n\n                        return $v_result;\n                    }\n\n                    // ----- Look for user callback abort\n                    if ($v_result1 == 2) {\n                        break;\n                    }\n                }\n            }\n        }\n\n        // ----- Close the zip file\n        $this->privCloseFd();\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    //\n    // 1 : ... ?\n    // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback\n    // --------------------------------------------------------------------------------\n    public function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Read the file header\n        if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n\n        // ----- Check that the file header is coherent with $p_entry info\n        if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n            // TBC\n        }\n\n        // ----- Look for all path to remove\n        if ($p_remove_all_path == true) {\n            // ----- Look for folder entry that not need to be extracted\n            if (($p_entry['external']&0x00000010)==0x00000010) {\n                $p_entry['status'] = \"filtered\";\n\n                return $v_result;\n            }\n\n            // ----- Get the basename of the path\n            $p_entry['filename'] = basename($p_entry['filename']);\n        } elseif ($p_remove_path != \"\") {\n            // ----- Look for path to remove\n            if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) {\n                // ----- Change the file status\n                $p_entry['status'] = \"filtered\";\n\n                // ----- Return\n                return $v_result;\n            }\n\n            $p_remove_path_size = strlen($p_remove_path);\n            if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) {\n                // ----- Remove the path\n                $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);\n            }\n        }\n\n        // ----- Add the path\n        if ($p_path != '') {\n            $p_entry['filename'] = $p_path.\"/\".$p_entry['filename'];\n        }\n\n        // ----- Check a base_dir_restriction\n        if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {\n            $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']);\n            if ($v_inclusion == 0) {\n                PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, \"Filename '\".$p_entry['filename'].\"' is outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION\");\n\n                return PclZip::errorCode();\n            }\n        }\n\n        // ----- Look for pre-extract callback\n        if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_entry['status'] = \"skipped\";\n                $v_result = 1;\n            }\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                // ----- This status is internal and will be changed in 'skipped'\n                $p_entry['status'] = \"aborted\";\n                $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            $p_entry['filename'] = $v_local_header['filename'];\n        }\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n            // ----- Look for specific actions while the file exist\n            if (file_exists($p_entry['filename'])) {\n                // ----- Look if file is a directory\n                if (is_dir($p_entry['filename'])) {\n                    // ----- Change the file status\n                    $p_entry['status'] = \"already_a_directory\";\n\n                    // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                    // For historical reason first PclZip implementation does not stop\n                    // when this kind of error occurs.\n                    if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, \"Filename '\".$p_entry['filename'].\"' is already used by an existing directory\");\n                        return PclZip::errorCode();\n                    }\n                } elseif (!is_writeable($p_entry['filename'])) {\n                    // ----- Look if file is write protected\n                    // ----- Change the file status\n                    $p_entry['status'] = \"write_protected\";\n\n                    // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                    // For historical reason first PclZip implementation does not stop\n                    // when this kind of error occurs.\n                    if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n                        PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, \"Filename '\".$p_entry['filename'].\"' exists and is write protected\");\n                        return PclZip::errorCode();\n                    }\n                } elseif (filemtime($p_entry['filename']) > $p_entry['mtime']) {\n                    // ----- Look if the extracted file is older\n                    // ----- Change the file status\n                    if ((isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER] === true)) {\n                    } else {\n                        $p_entry['status'] = \"newer_exist\";\n\n                        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n                        // For historical reason first PclZip implementation does not stop\n                        // when this kind of error occurs.\n                        if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) {\n                            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, \"Newer version of '\".$p_entry['filename'].\"' exists and option PCLZIP_OPT_REPLACE_NEWER is not selected\");\n                            return PclZip::errorCode();\n                        }\n                    }\n                } else {\n                }\n            } else {\n                // ----- Check the directory availability and create it if necessary\n                if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) {\n                    $v_dir_to_check = $p_entry['filename'];\n                } elseif (!strstr($p_entry['filename'], \"/\")) {\n                    $v_dir_to_check = \"\";\n                } else {\n                    $v_dir_to_check = dirname($p_entry['filename']);\n                }\n\n                if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {\n                    // ----- Change the file status\n                    $p_entry['status'] = \"path_creation_fail\";\n\n                    // ----- Return\n                    //return $v_result;\n                    $v_result = 1;\n                }\n            }\n        }\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n            // ----- Do the extraction (if not a folder)\n            if (!(($p_entry['external']&0x00000010) == 0x00000010)) {\n                // ----- Look for not compressed file\n                if ($p_entry['compression'] == 0) {\n                    // ----- Opening destination file\n                    if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n                        // ----- Change the file status\n                        $p_entry['status'] = \"write_error\";\n\n                        // ----- Return\n                        return $v_result;\n                    }\n\n                    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n                    $v_size = $p_entry['compressed_size'];\n                    while ($v_size != 0) {\n                        $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n                        $v_buffer = @fread($this->zip_fd, $v_read_size);\n                        /* Try to speed up the code\n                        $v_binary_data = pack('a'.$v_read_size, $v_buffer);\n                        @fwrite($v_dest_file, $v_binary_data, $v_read_size);\n                        */\n                        @fwrite($v_dest_file, $v_buffer, $v_read_size);\n                        $v_size -= $v_read_size;\n                    }\n\n                    // ----- Closing the destination file\n                    fclose($v_dest_file);\n\n                    // ----- Change the file mtime\n                    touch($p_entry['filename'], $p_entry['mtime']);\n                } else {\n                    // ----- TBC\n                    // Need to be finished\n                    if (($p_entry['flag'] & 1) == 1) {\n                        PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \\''.$p_entry['filename'].'\\' is encrypted. Encrypted files are not supported.');\n                        return PclZip::errorCode();\n                    }\n\n                    // ----- Look for using temporary file to unzip\n                    if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])))) {\n                        $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);\n                        if ($v_result < PCLZIP_ERR_NO_ERROR) {\n                            return $v_result;\n                        }\n                    } else {\n                        // ----- Look for extract in memory\n                        // ----- Read the compressed file in a buffer (one shot)\n                        $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                        // ----- Decompress the file\n                        $v_file_content = @gzinflate($v_buffer);\n                        unset($v_buffer);\n                        if ($v_file_content === false) {\n                            // ----- Change the file status\n                            // TBC\n                            $p_entry['status'] = \"error\";\n\n                            return $v_result;\n                        }\n\n                        // ----- Opening destination file\n                        if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n                            // ----- Change the file status\n                            $p_entry['status'] = \"write_error\";\n\n                            return $v_result;\n                        }\n\n                        // ----- Write the uncompressed data\n                        @fwrite($v_dest_file, $v_file_content, $p_entry['size']);\n                        unset($v_file_content);\n\n                        // ----- Closing the destination file\n                        @fclose($v_dest_file);\n                    }\n\n                    // ----- Change the file mtime\n                    @touch($p_entry['filename'], $p_entry['mtime']);\n                }\n\n                // ----- Look for chmod option\n                if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {\n                    // ----- Change the mode of the file\n                    @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);\n                }\n            }\n        }\n\n        // ----- Change abort status\n        if ($p_entry['status'] == \"aborted\") {\n            $p_entry['status'] = \"skipped\";\n        } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n            // ----- Look for post-extract callback\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                    $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFileUsingTempFile()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privExtractFileUsingTempFile(&$p_entry, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Creates a temporary file\n        $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';\n        if (($v_dest_file = @fopen($v_gzip_temp_name, \"wb\")) == 0) {\n            fclose($v_file);\n            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary write mode');\n            return PclZip::errorCode();\n        }\n\n        // ----- Write gz file format header\n        $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));\n        @fwrite($v_dest_file, $v_binary_data, 10);\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        $v_size = $p_entry['compressed_size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($this->zip_fd, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($v_dest_file, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Write gz file format footer\n        $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);\n        @fwrite($v_dest_file, $v_binary_data, 8);\n\n        // ----- Close the temporary file\n        @fclose($v_dest_file);\n\n        // ----- Opening destination file\n        if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n            $p_entry['status'] = \"write_error\";\n            return $v_result;\n        }\n\n        // ----- Open the temporary gz file\n        if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {\n            @fclose($v_dest_file);\n            $p_entry['status'] = \"read_error\";\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary read mode');\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n        $v_size = $p_entry['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @gzread($v_src_file, $v_read_size);\n            //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($v_dest_file, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n        @fclose($v_dest_file);\n        @gzclose($v_src_file);\n\n        // ----- Delete the temporary file\n        @unlink($v_gzip_temp_name);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFileInOutput()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privExtractFileInOutput(&$p_entry, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Read the file header\n        if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n            return $v_result;\n        }\n\n        // ----- Check that the file header is coherent with $p_entry info\n        if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n            // TBC\n        }\n\n        // ----- Look for pre-extract callback\n        if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_entry['status'] = \"skipped\";\n                $v_result = 1;\n            }\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                // ----- This status is internal and will be changed in 'skipped'\n                $p_entry['status'] = \"aborted\";\n                    $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            $p_entry['filename'] = $v_local_header['filename'];\n        }\n\n        // ----- Trace\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n            // ----- Do the extraction (if not a folder)\n            if (!(($p_entry['external']&0x00000010)==0x00000010)) {\n                // ----- Look for not compressed file\n                if ($p_entry['compressed_size'] == $p_entry['size']) {\n                    // ----- Read the file in a buffer (one shot)\n                    $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                    // ----- Send the file to the output\n                    echo $v_buffer;\n                    unset($v_buffer);\n                } else {\n                    // ----- Read the compressed file in a buffer (one shot)\n                    $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                    // ----- Decompress the file\n                    $v_file_content = gzinflate($v_buffer);\n                    unset($v_buffer);\n\n                    // ----- Send the file to the output\n                    echo $v_file_content;\n                    unset($v_file_content);\n                }\n            }\n        }\n\n        // ----- Change abort status\n        if ($p_entry['status'] == \"aborted\") {\n            $p_entry['status'] = \"skipped\";\n        } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n            // ----- Look for post-extract callback\n\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                    $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n        }\n\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privExtractFileAsString()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privExtractFileAsString(&$p_entry, &$p_string, &$p_options)\n    {\n        $v_result=1;\n\n        // ----- Read the file header\n        $v_header = array();\n        if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Check that the file header is coherent with $p_entry info\n        if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n            // TBC\n        }\n\n        // ----- Look for pre-extract callback\n        if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n            if ($v_result == 0) {\n                // ----- Change the file status\n                $p_entry['status'] = \"skipped\";\n                $v_result = 1;\n            }\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                // ----- This status is internal and will be changed in 'skipped'\n                $p_entry['status'] = \"aborted\";\n                    $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n\n            // ----- Update the informations\n            // Only some fields can be modified\n            $p_entry['filename'] = $v_local_header['filename'];\n        }\n\n        // ----- Look if extraction should be done\n        if ($p_entry['status'] == 'ok') {\n            // ----- Do the extraction (if not a folder)\n            if (!(($p_entry['external']&0x00000010)==0x00000010)) {\n                // ----- Look for not compressed file\n    //            if ($p_entry['compressed_size'] == $p_entry['size'])\n                if ($p_entry['compression'] == 0) {\n                    // ----- Reading the file\n                    $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);\n                } else {\n                    // ----- Reading the file\n                    $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n                    // ----- Decompress the file\n                    if (($p_string = @gzinflate($v_data)) === false) {\n                        // TBC\n                    }\n                }\n                // ----- Trace\n            } else {\n                    // TBC : error : can not extract a folder in a string\n            }\n        }\n\n        // ----- Change abort status\n        if ($p_entry['status'] == \"aborted\") {\n            $p_entry['status'] = \"skipped\";\n        } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n            // ----- Look for post-extract callback\n            // ----- Generate a local information\n            $v_local_header = array();\n            $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n            // ----- Swap the content to header\n            $v_local_header['content'] = $p_string;\n            $p_string = '';\n\n            // ----- Call the callback\n            // Here I do not use call_user_func() because I need to send a reference to the\n            // header.\n    //            eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');\n            $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n            // ----- Swap back the content to header\n            $p_string = $v_local_header['content'];\n            unset($v_local_header['content']);\n\n            // ----- Look for abort result\n            if ($v_result == 2) {\n                    $v_result = PCLZIP_ERR_USER_ABORTED;\n            }\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privReadFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privReadFileHeader(&$p_header)\n    {\n        $v_result=1;\n\n        // ----- Read the 4 bytes signature\n        $v_binary_data = @fread($this->zip_fd, 4);\n        $v_data = unpack('Vid', $v_binary_data);\n\n        // ----- Check signature\n        if ($v_data['id'] != 0x04034b50) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the first 42 bytes of the header\n        $v_binary_data = fread($this->zip_fd, 26);\n\n        // ----- Look for invalid block size\n        if (strlen($v_binary_data) != 26) {\n            $p_header['filename'] = \"\";\n            $p_header['status'] = \"invalid_header\";\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid block size : \".strlen($v_binary_data));\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the values\n        $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);\n\n        // ----- Get filename\n        $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);\n\n        // ----- Get extra_fields\n        if ($v_data['extra_len'] != 0) {\n            $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);\n        } else {\n            $p_header['extra'] = '';\n        }\n\n        // ----- Extract properties\n        $p_header['version_extracted'] = $v_data['version'];\n        $p_header['compression'] = $v_data['compression'];\n        $p_header['size'] = $v_data['size'];\n        $p_header['compressed_size'] = $v_data['compressed_size'];\n        $p_header['crc'] = $v_data['crc'];\n        $p_header['flag'] = $v_data['flag'];\n        $p_header['filename_len'] = $v_data['filename_len'];\n\n        // ----- Recuperate date in UNIX format\n        $p_header['mdate'] = $v_data['mdate'];\n        $p_header['mtime'] = $v_data['mtime'];\n        if ($p_header['mdate'] && $p_header['mtime']) {\n            // ----- Extract time\n            $v_hour = ($p_header['mtime'] & 0xF800) >> 11;\n            $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;\n            $v_seconde = ($p_header['mtime'] & 0x001F)*2;\n\n            // ----- Extract date\n            $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;\n            $v_month = ($p_header['mdate'] & 0x01E0) >> 5;\n            $v_day = $p_header['mdate'] & 0x001F;\n\n            // ----- Get UNIX date format\n            $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);\n\n        } else {\n            $p_header['mtime'] = time();\n        }\n\n        // TBC\n        //for(reset($v_data); $key = key($v_data); next($v_data)) {\n        //}\n\n        // ----- Set the stored filename\n        $p_header['stored_filename'] = $p_header['filename'];\n\n        // ----- Set the status field\n        $p_header['status'] = \"ok\";\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privReadCentralFileHeader()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privReadCentralFileHeader(&$p_header)\n    {\n        $v_result = 1;\n\n        // ----- Read the 4 bytes signature\n        $v_binary_data = @fread($this->zip_fd, 4);\n        $v_data = unpack('Vid', $v_binary_data);\n\n        // ----- Check signature\n        if ($v_data['id'] != 0x02014b50) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read the first 42 bytes of the header\n        $v_binary_data = fread($this->zip_fd, 42);\n\n        // ----- Look for invalid block size\n        if (strlen($v_binary_data) != 42) {\n            $p_header['filename'] = \"\";\n            $p_header['status'] = \"invalid_header\";\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid block size : \".strlen($v_binary_data));\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the values\n        $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);\n\n        // ----- Get filename\n        if ($p_header['filename_len'] != 0) {\n            $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);\n        } else {\n            $p_header['filename'] = '';\n        }\n\n        // ----- Get extra\n        if ($p_header['extra_len'] != 0) {\n            $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);\n        } else {\n            $p_header['extra'] = '';\n        }\n\n        // ----- Get comment\n        if ($p_header['comment_len'] != 0) {\n            $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);\n        } else {\n            $p_header['comment'] = '';\n        }\n\n        // ----- Extract properties\n\n        // ----- Recuperate date in UNIX format\n        //if ($p_header['mdate'] && $p_header['mtime'])\n        // TBC : bug : this was ignoring time with 0/0/0\n        if (1) {\n            // ----- Extract time\n            $v_hour = ($p_header['mtime'] & 0xF800) >> 11;\n            $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;\n            $v_seconde = ($p_header['mtime'] & 0x001F)*2;\n\n            // ----- Extract date\n            $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;\n            $v_month = ($p_header['mdate'] & 0x01E0) >> 5;\n            $v_day = $p_header['mdate'] & 0x001F;\n\n            // ----- Get UNIX date format\n            $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);\n\n        } else {\n            $p_header['mtime'] = time();\n        }\n\n        // ----- Set the stored filename\n        $p_header['stored_filename'] = $p_header['filename'];\n\n        // ----- Set default status to ok\n        $p_header['status'] = 'ok';\n\n        // ----- Look if it is a directory\n        if (substr($p_header['filename'], -1) == '/') {\n            //$p_header['external'] = 0x41FF0010;\n            $p_header['external'] = 0x00000010;\n        }\n\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privCheckFileHeaders()\n    // Description :\n    // Parameters :\n    // Return Values :\n    //     1 on success,\n    //     0 on error;\n    // --------------------------------------------------------------------------------\n    public function privCheckFileHeaders(&$p_local_header, &$p_central_header)\n    {\n        $v_result=1;\n\n        // ----- Check the static values\n        // TBC\n        if ($p_local_header['filename'] != $p_central_header['filename']) {\n        }\n        if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {\n        }\n        if ($p_local_header['flag'] != $p_central_header['flag']) {\n        }\n        if ($p_local_header['compression'] != $p_central_header['compression']) {\n        }\n        if ($p_local_header['mtime'] != $p_central_header['mtime']) {\n        }\n        if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {\n        }\n\n        // ----- Look for flag bit 3\n        if (($p_local_header['flag'] & 8) == 8) {\n            $p_local_header['size'] = $p_central_header['size'];\n            $p_local_header['compressed_size'] = $p_central_header['compressed_size'];\n            $p_local_header['crc'] = $p_central_header['crc'];\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privReadEndCentralDir()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privReadEndCentralDir(&$p_central_dir)\n    {\n        $v_result=1;\n\n        // ----- Go to the end of the zip file\n        $v_size = filesize($this->zipname);\n        @fseek($this->zip_fd, $v_size);\n        if (@ftell($this->zip_fd) != $v_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \\''.$this->zipname.'\\'');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- First try : look if this is an archive with no commentaries (most of the time)\n        // in this case the end of central dir is at 22 bytes of the file end\n        $v_found = 0;\n        if ($v_size > 26) {\n            @fseek($this->zip_fd, $v_size-22);\n            if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \\''.$this->zipname.'\\'');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read for bytes\n            $v_binary_data = @fread($this->zip_fd, 4);\n            $v_data = @unpack('Vid', $v_binary_data);\n\n            // ----- Check signature\n            if ($v_data['id'] == 0x06054b50) {\n                $v_found = 1;\n            }\n\n            $v_pos = ftell($this->zip_fd);\n        }\n\n        // ----- Go back to the maximum possible size of the Central Dir End Record\n        if (!$v_found) {\n            $v_maximum_size = 65557; // 0xFFFF + 22;\n            if ($v_maximum_size > $v_size) {\n                $v_maximum_size = $v_size;\n            }\n            @fseek($this->zip_fd, $v_size-$v_maximum_size);\n            if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \\''.$this->zipname.'\\'');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read byte per byte in order to find the signature\n            $v_pos = ftell($this->zip_fd);\n            $v_bytes = 0x00000000;\n            while ($v_pos < $v_size) {\n                // ----- Read a byte\n                $v_byte = @fread($this->zip_fd, 1);\n\n                // -----    Add the byte\n                //$v_bytes = ($v_bytes << 8) | Ord($v_byte);\n                // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number\n                // Otherwise on systems where we have 64bit integers the check below for the magic number will fail.\n                $v_bytes = (($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);\n\n                // ----- Compare the bytes\n                if ($v_bytes == 0x504b0506) {\n                    $v_pos++;\n                    break;\n                }\n\n                $v_pos++;\n            }\n\n            // ----- Look if not found end of central dir\n            if ($v_pos == $v_size) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Unable to find End of Central Dir Record signature\");\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n        }\n\n        // ----- Read the first 18 bytes of the header\n        $v_binary_data = fread($this->zip_fd, 18);\n\n        // ----- Look for invalid block size\n        if (strlen($v_binary_data) != 18) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid End of Central Dir Record size : \".strlen($v_binary_data));\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Extract the values\n        $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);\n\n        // ----- Check the global size\n        if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {\n            // ----- Removed in release 2.2 see readme file\n            // The check of the file size is a little too strict.\n            // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.\n            // While decrypted, zip has training 0 bytes\n            if (0) {\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive. Some trailing bytes exists after the archive.');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n        }\n\n        // ----- Get comment\n        if ($v_data['comment_size'] != 0) {\n            $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);\n        } else {\n            $p_central_dir['comment'] = '';\n        }\n\n        $p_central_dir['entries'] = $v_data['entries'];\n        $p_central_dir['disk_entries'] = $v_data['disk_entries'];\n        $p_central_dir['offset'] = $v_data['offset'];\n        $p_central_dir['size'] = $v_data['size'];\n        $p_central_dir['disk'] = $v_data['disk'];\n        $p_central_dir['disk_start'] = $v_data['disk_start'];\n\n        // TBC\n        //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {\n        //}\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDeleteByRule()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privDeleteByRule(&$p_result_list, &$p_options)\n    {\n        $v_result=1;\n        $v_list_detail = array();\n\n        // ----- Open the zip file\n        if (($v_result=$this->privOpenFd('rb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privCloseFd();\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($this->zip_fd);\n\n        // ----- Scan all the files\n        // ----- Start at beginning of Central Dir\n        $v_pos_entry = $v_central_dir['offset'];\n        @rewind($this->zip_fd);\n        if (@fseek($this->zip_fd, $v_pos_entry)) {\n            // ----- Close the zip file\n            $this->privCloseFd();\n\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Read each entry\n        $v_header_list = array();\n        $j_start = 0;\n        for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) {\n            // ----- Read the file header\n            $v_header_list[$v_nb_extracted] = array();\n            if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n\n                return $v_result;\n            }\n\n\n            // ----- Store the index\n            $v_header_list[$v_nb_extracted]['index'] = $i;\n\n            // ----- Look for the specific extract rules\n            $v_found = false;\n\n            // ----- Look for extract by name rule\n            if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {\n                // ----- Look if the filename is in the list\n                for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {\n                    // ----- Look for a directory\n                    if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == \"/\") {\n                        // ----- Look if the directory is in the filename path\n                        if ((strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {\n                            $v_found = true;\n                        } elseif ((($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {\n                            $v_found = true;\n                        }\n                    } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {\n                        // ----- Look for a filename\n                        $v_found = true;\n                    }\n                }\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != \"\")) {\n                // ----- Look for extract by preg rule\n                if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {\n                        $v_found = true;\n                }\n            } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {\n                // ----- Look for extract by index rule\n                // ----- Look if the index is in the list\n                for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {\n                    if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {\n                        $v_found = true;\n                    }\n                    if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {\n                        $j_start = $j+1;\n                    }\n                    if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {\n                        break;\n                    }\n                }\n            } else {\n                $v_found = true;\n            }\n\n            // ----- Look for deletion\n            if ($v_found) {\n                unset($v_header_list[$v_nb_extracted]);\n            } else {\n                $v_nb_extracted++;\n            }\n        }\n\n        // ----- Look if something need to be deleted\n        if ($v_nb_extracted > 0) {\n            // ----- Creates a temporay file\n            $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';\n\n            // ----- Creates a temporary zip archive\n            $v_temp_zip = new PclZip($v_zip_temp_name);\n\n            // ----- Open the temporary zip file in write mode\n            if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {\n                $this->privCloseFd();\n\n                // ----- Return\n                return $v_result;\n            }\n\n            // ----- Look which file need to be kept\n            for ($i=0; $i<sizeof($v_header_list); $i++) {\n                // ----- Calculate the position of the header\n                @rewind($this->zip_fd);\n                if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Error log\n                    PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                    // ----- Return\n                    return PclZip::errorCode();\n                }\n\n                // ----- Read the file header\n                $v_local_header = array();\n                if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n\n                // ----- Check that local file header is same as central file header\n                if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) {\n                    // TBC\n                }\n                unset($v_local_header);\n\n                // ----- Write the file header\n                if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n\n                // ----- Read/write the data block\n                if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {\n                    // ----- Close the zip file\n                    $this->privCloseFd();\n                    $v_temp_zip->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n            }\n\n            // ----- Store the offset of the central dir\n            $v_offset = @ftell($v_temp_zip->zip_fd);\n\n            // ----- Re-Create the Central Dir files header\n            for ($i=0; $i<sizeof($v_header_list); $i++) {\n                // ----- Create the file header\n                if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                    $v_temp_zip->privCloseFd();\n                    $this->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n                }\n\n                // ----- Transform the header to a 'usable' info\n                $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n            }\n\n\n            // ----- Zip file comment\n            $v_comment = '';\n            if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n                $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n            }\n\n            // ----- Calculate the size of the central header\n            $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;\n\n            // ----- Create the central dir footer\n            if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {\n                    // ----- Reset the file list\n                    unset($v_header_list);\n                    $v_temp_zip->privCloseFd();\n                    $this->privCloseFd();\n                    @unlink($v_zip_temp_name);\n\n                    // ----- Return\n                    return $v_result;\n            }\n\n            // ----- Close\n            $v_temp_zip->privCloseFd();\n            $this->privCloseFd();\n\n            // ----- Delete the zip file\n            // TBC : I should test the result ...\n            @unlink($this->zipname);\n\n            // ----- Rename the temporary file\n            // TBC : I should test the result ...\n            //@rename($v_zip_temp_name, $this->zipname);\n            PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n            // ----- Destroy the temporary archive\n            unset($v_temp_zip);\n        } elseif ($v_central_dir['entries'] != 0) {\n            // ----- Remove every files : reset the file\n            $this->privCloseFd();\n\n            if (($v_result = $this->privOpenFd('wb')) != 1) {\n                return $v_result;\n            }\n\n            if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {\n                return $v_result;\n            }\n\n            $this->privCloseFd();\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDirCheck()\n    // Description :\n    //     Check if a directory exists, if not it creates it and all the parents directory\n    //     which may be useful.\n    // Parameters :\n    //     $p_dir : Directory path to check.\n    // Return Values :\n    //        1 : OK\n    //     -1 : Unable to create directory\n    // --------------------------------------------------------------------------------\n    public function privDirCheck($p_dir, $p_is_dir = false)\n    {\n        $v_result = 1;\n\n        // ----- Remove the final '/'\n        if (($p_is_dir) && (substr($p_dir, -1)=='/')) {\n            $p_dir = substr($p_dir, 0, strlen($p_dir)-1);\n        }\n\n        // ----- Check the directory availability\n        if ((is_dir($p_dir)) || ($p_dir == \"\")) {\n            return 1;\n        }\n\n        // ----- Extract parent directory\n        $p_parent_dir = dirname($p_dir);\n\n        // ----- Just a check\n        if ($p_parent_dir != $p_dir) {\n            // ----- Look for parent directory\n            if ($p_parent_dir != \"\") {\n                if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) {\n                    return $v_result;\n                }\n            }\n        }\n\n        // ----- Create the directory\n        if (!@mkdir($p_dir, 0777)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, \"Unable to create directory '$p_dir'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privMerge()\n    // Description :\n    //     If $p_archive_to_add does not exist, the function exit with a success result.\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privMerge(&$p_archive_to_add)\n    {\n        $v_result=1;\n\n        // ----- Look if the archive_to_add exists\n        if (!is_file($p_archive_to_add->zipname)) {\n            // ----- Nothing to merge, so merge is a success\n            $v_result = 1;\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Look if the archive exists\n        if (!is_file($this->zipname)) {\n            // ----- Do a duplicate\n            $v_result = $this->privDuplicate($p_archive_to_add->zipname);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Open the zip file\n        if (($v_result=$this->privOpenFd('rb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir = array();\n        if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {\n            $this->privCloseFd();\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($this->zip_fd);\n\n        // ----- Open the archive_to_add file\n        if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) {\n            $this->privCloseFd();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Read the central directory informations\n        $v_central_dir_to_add = array();\n        if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) {\n            $this->privCloseFd();\n            $p_archive_to_add->privCloseFd();\n\n            return $v_result;\n        }\n\n        // ----- Go to beginning of File\n        @rewind($p_archive_to_add->zip_fd);\n\n        // ----- Creates a temporay file\n        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';\n\n        // ----- Open the temporary file in write mode\n        if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) {\n            $this->privCloseFd();\n            $p_archive_to_add->privCloseFd();\n\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_zip_temp_name.'\\' in binary write mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Copy the files from the archive to the temporary file\n        // TBC : Here I should better append the file and go back to erase the central dir\n        $v_size = $v_central_dir['offset'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = fread($this->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Copy the files from the archive_to_add into the temporary file\n        $v_size = $v_central_dir_to_add['offset'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($v_zip_temp_fd);\n\n        // ----- Copy the block of file headers from the old archive\n        $v_size = $v_central_dir['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($this->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Copy the block of file headers from the archive_to_add\n        $v_size = $v_central_dir_to_add['size'];\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);\n            @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Merge the file comments\n        $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];\n\n        // ----- Calculate the size of the (new) central header\n        $v_size = @ftell($v_zip_temp_fd)-$v_offset;\n\n        // ----- Swap the file descriptor\n        // Here is a trick : I swap the temporary fd with the zip fd, in order to use\n        // the following methods on the temporary fil and not the real archive fd\n        $v_swap = $this->zip_fd;\n        $this->zip_fd = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Create the central dir footer\n        if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) {\n            $this->privCloseFd();\n            $p_archive_to_add->privCloseFd();\n            @fclose($v_zip_temp_fd);\n            $this->zip_fd = null;\n\n            // ----- Reset the file list\n            unset($v_header_list);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Swap back the file descriptor\n        $v_swap = $this->zip_fd;\n        $this->zip_fd = $v_zip_temp_fd;\n        $v_zip_temp_fd = $v_swap;\n\n        // ----- Close\n        $this->privCloseFd();\n        $p_archive_to_add->privCloseFd();\n\n        // ----- Close the temporary file\n        @fclose($v_zip_temp_fd);\n\n        // ----- Delete the zip file\n        // TBC : I should test the result ...\n        @unlink($this->zipname);\n\n        // ----- Rename the temporary file\n        // TBC : I should test the result ...\n        //@rename($v_zip_temp_name, $this->zipname);\n        PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDuplicate()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privDuplicate($p_archive_filename)\n    {\n        $v_result=1;\n\n        // ----- Look if the $p_archive_filename exists\n        if (!is_file($p_archive_filename)) {\n            // ----- Nothing to duplicate, so duplicate is a success.\n            $v_result = 1;\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Open the zip file\n        if (($v_result=$this->privOpenFd('wb')) != 1) {\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Open the temporary file in write mode\n        if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) {\n            $this->privCloseFd();\n\n            PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \\''.$p_archive_filename.'\\' in binary write mode');\n\n            // ----- Return\n            return PclZip::errorCode();\n        }\n\n        // ----- Copy the files from the archive to the temporary file\n        // TBC : Here I should better append the file and go back to erase the central dir\n        $v_size = filesize($p_archive_filename);\n        while ($v_size != 0) {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = fread($v_zip_temp_fd, $v_read_size);\n            @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n        }\n\n        // ----- Close\n        $this->privCloseFd();\n\n        // ----- Close the temporary file\n        @fclose($v_zip_temp_fd);\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privErrorLog()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privErrorLog($p_error_code = 0, $p_error_string = '')\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            PclError($p_error_code, $p_error_string);\n        } else {\n            $this->error_code = $p_error_code;\n            $this->error_string = $p_error_string;\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privErrorReset()\n    // Description :\n    // Parameters :\n    // --------------------------------------------------------------------------------\n    public function privErrorReset()\n    {\n        if (PCLZIP_ERROR_EXTERNAL == 1) {\n            PclErrorReset();\n        } else {\n            $this->error_code = 0;\n            $this->error_string = '';\n        }\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privDisableMagicQuotes()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privDisableMagicQuotes()\n    {\n        $v_result=1;\n\n        // ----- Look if function exists\n        if ((!function_exists(\"get_magic_quotes_runtime\")) || (!function_exists(\"set_magic_quotes_runtime\"))) {\n            return $v_result;\n        }\n\n        // ----- Look if already done\n        if ($this->magic_quotes_status != -1) {\n            return $v_result;\n        }\n\n        // ----- Get and memorize the magic_quote value\n        $this->magic_quotes_status = @get_magic_quotes_runtime();\n\n        // ----- Disable magic_quotes\n        if ($this->magic_quotes_status == 1) {\n            @set_magic_quotes_runtime(0);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n\n    // --------------------------------------------------------------------------------\n    // Function : privSwapBackMagicQuotes()\n    // Description :\n    // Parameters :\n    // Return Values :\n    // --------------------------------------------------------------------------------\n    public function privSwapBackMagicQuotes()\n    {\n        $v_result=1;\n\n        // ----- Look if function exists\n        if ((!function_exists(\"get_magic_quotes_runtime\")) || (!function_exists(\"set_magic_quotes_runtime\"))) {\n            return $v_result;\n        }\n\n        // ----- Look if something to do\n        if ($this->magic_quotes_status != -1) {\n            return $v_result;\n        }\n\n        // ----- Swap back magic_quotes\n        if ($this->magic_quotes_status == 1) {\n            @set_magic_quotes_runtime($this->magic_quotes_status);\n        }\n\n        // ----- Return\n        return $v_result;\n    }\n    // --------------------------------------------------------------------------------\n}\n// End of class\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilPathReduction()\n// Description :\n// Parameters :\n// Return Values :\n// --------------------------------------------------------------------------------\nfunction PclZipUtilPathReduction($p_dir)\n{\n    $v_result = \"\";\n\n    // ----- Look for not empty path\n    if ($p_dir != \"\") {\n        // ----- Explode path by directory names\n        $v_list = explode(\"/\", $p_dir);\n\n        // ----- Study directories from last to first\n        $v_skip = 0;\n        for ($i=sizeof($v_list)-1; $i>=0; $i--) {\n            // ----- Look for current path\n            if ($v_list[$i] == \".\") {\n                // ----- Ignore this directory\n                // Should be the first $i=0, but no check is done\n            } elseif ($v_list[$i] == \"..\") {\n                $v_skip++;\n            } elseif ($v_list[$i] == \"\") {\n                // ----- First '/' i.e. root slash\n                if ($i == 0) {\n                    $v_result = \"/\".$v_result;\n                    if ($v_skip > 0) {\n                        // ----- It is an invalid path, so the path is not modified\n                        // TBC\n                        $v_result = $p_dir;\n                        $v_skip = 0;\n                    }\n                } elseif ($i == (sizeof($v_list)-1)) {\n                    // ----- Last '/' i.e. indicates a directory\n                    $v_result = $v_list[$i];\n                } else {\n                    // ----- Double '/' inside the path\n                    // ----- Ignore only the double '//' in path,\n                    // but not the first and last '/'\n                }\n            } else {\n                // ----- Look for item to skip\n                if ($v_skip > 0) {\n                    $v_skip--;\n                } else {\n                    $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?\"/\".$v_result:\"\");\n                }\n            }\n        }\n\n        // ----- Look for skip\n        if ($v_skip > 0) {\n            while ($v_skip > 0) {\n                $v_result = '../'.$v_result;\n                $v_skip--;\n            }\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilPathInclusion()\n// Description :\n//     This function indicates if the path $p_path is under the $p_dir tree. Or,\n//     said in an other way, if the file or sub-dir $p_path is inside the dir\n//     $p_dir.\n//     The function indicates also if the path is exactly the same as the dir.\n//     This function supports path with duplicated '/' like '//', but does not\n//     support '.' or '..' statements.\n// Parameters :\n// Return Values :\n//     0 if $p_path is not inside directory $p_dir\n//     1 if $p_path is inside directory $p_dir\n//     2 if $p_path is exactly the same as $p_dir\n// --------------------------------------------------------------------------------\nfunction PclZipUtilPathInclusion($p_dir, $p_path)\n{\n    $v_result = 1;\n\n    // ----- Look for path beginning by ./\n    if (($p_dir == '.') || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {\n        $p_dir = PclZipUtilTranslateWinPath(getcwd(), false).'/'.substr($p_dir, 1);\n    }\n    if (($p_path == '.') || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {\n        $p_path = PclZipUtilTranslateWinPath(getcwd(), false).'/'.substr($p_path, 1);\n    }\n\n    // ----- Explode dir and path by directory separator\n    $v_list_dir = explode(\"/\", $p_dir);\n    $v_list_dir_size = sizeof($v_list_dir);\n    $v_list_path = explode(\"/\", $p_path);\n    $v_list_path_size = sizeof($v_list_path);\n\n    // ----- Study directories paths\n    $i = 0;\n    $j = 0;\n    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {\n        // ----- Look for empty dir (path reduction)\n        if ($v_list_dir[$i] == '') {\n            $i++;\n            continue;\n        }\n        if ($v_list_path[$j] == '') {\n            $j++;\n            continue;\n        }\n\n        // ----- Compare the items\n        if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ($v_list_path[$j] != '')) {\n            $v_result = 0;\n        }\n\n        // ----- Next items\n        $i++;\n        $j++;\n    }\n\n    // ----- Look if everything seems to be the same\n    if ($v_result) {\n        // ----- Skip all the empty items\n        while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) {\n            $j++;\n        }\n        while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) {\n            $i++;\n        }\n\n        if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {\n            // ----- There are exactly the same\n            $v_result = 2;\n        } elseif ($i < $v_list_dir_size) {\n            // ----- The path is shorter than the dir\n            $v_result = 0;\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilCopyBlock()\n// Description :\n// Parameters :\n//     $p_mode : read/write compression mode\n//                         0 : src & dest normal\n//                         1 : src gzip, dest normal\n//                         2 : src normal, dest gzip\n//                         3 : src & dest gzip\n// Return Values :\n// --------------------------------------------------------------------------------\nfunction PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0)\n{\n    $v_result = 1;\n\n    if ($p_mode==0) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($p_src, $v_read_size);\n            @fwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    } elseif ($p_mode==1) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @gzread($p_src, $v_read_size);\n            @fwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    } elseif ($p_mode==2) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($p_src, $v_read_size);\n            @gzwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    } elseif ($p_mode==3) {\n        while ($p_size != 0) {\n            $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @gzread($p_src, $v_read_size);\n            @gzwrite($p_dest, $v_buffer, $v_read_size);\n            $p_size -= $v_read_size;\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilRename()\n// Description :\n//     This function tries to do a simple rename() function. If it fails, it\n//     tries to copy the $p_src file in a new $p_dest file and then unlink the\n//     first one.\n// Parameters :\n//     $p_src : Old filename\n//     $p_dest : New filename\n// Return Values :\n//     1 on success, 0 on failure.\n// --------------------------------------------------------------------------------\nfunction PclZipUtilRename($p_src, $p_dest)\n{\n    $v_result = 1;\n\n    // ----- Try to rename the files\n    if (!@rename($p_src, $p_dest)) {\n        // ----- Try to copy & unlink the src\n        if (!@copy($p_src, $p_dest)) {\n            $v_result = 0;\n        } elseif (!@unlink($p_src)) {\n            $v_result = 0;\n        }\n    }\n\n    // ----- Return\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilOptionText()\n// Description :\n//     Translate option value in text. Mainly for debug purpose.\n// Parameters :\n//     $p_option : the option value.\n// Return Values :\n//     The option text value.\n// --------------------------------------------------------------------------------\nfunction PclZipUtilOptionText($p_option)\n{\n    $v_list = get_defined_constants();\n    for (reset($v_list); $v_key = key($v_list); next($v_list)) {\n        $v_prefix = substr($v_key, 0, 10);\n        if ((($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) {\n            return $v_key;\n        }\n    }\n\n    $v_result = 'Unknown';\n\n    return $v_result;\n}\n// --------------------------------------------------------------------------------\n\n// --------------------------------------------------------------------------------\n// Function : PclZipUtilTranslateWinPath()\n// Description :\n//     Translate windows path by replacing '\\' by '/' and optionally removing\n//     drive letter.\n// Parameters :\n//     $p_path : path to translate.\n//     $p_remove_disk_letter : true | false\n// Return Values :\n//     The path translated.\n// --------------------------------------------------------------------------------\nfunction PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true)\n{\n    if (stristr(php_uname(), 'windows')) {\n        // ----- Look for potential disk letter\n        if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {\n            $p_path = substr($p_path, $v_position+1);\n        }\n        // ----- Change potential windows directory separator\n        if ((strpos($p_path, '\\\\') > 0) || (substr($p_path, 0, 1) == '\\\\')) {\n            $p_path = strtr($p_path, '\\\\', '/');\n        }\n    }\n    return $p_path;\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/PCLZip/readme.txt",
    "content": "// --------------------------------------------------------------------------------\r\n// PclZip 2.8.2 - readme.txt\r\n// --------------------------------------------------------------------------------\r\n// License GNU/LGPL - August 2009\r\n// Vincent Blavet - vincent@phpconcept.net\r\n// http://www.phpconcept.net\r\n// --------------------------------------------------------------------------------\r\n// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $\r\n// --------------------------------------------------------------------------------\r\n\r\n\r\n\r\n0 - Sommaire\r\n============\r\n    1 - Introduction\r\n    2 - What's new\r\n    3 - Corrected bugs\r\n    4 - Known bugs or limitations\r\n    5 - License\r\n    6 - Warning\r\n    7 - Documentation\r\n    8 - Author\r\n    9 - Contribute\r\n\r\n1 - Introduction\r\n================\r\n\r\n  PclZip is a library that allow you to manage a Zip archive.\r\n\r\n  Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip\r\n\r\n2 - What's new\r\n==============\r\n\r\n  Version 2.8.2 :\r\n    - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with \r\n      extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string\r\n      can also be modified in the post-extract call back.\r\n    **Bugs correction :\r\n    - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly    \r\n    - Remove use of eval() and do direct call to callback functions\r\n    - Correct support of 64bits systems (Thanks to WordPress team)\r\n\r\n  Version 2.8.1 :\r\n    - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is\r\n      deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will\r\n      automatically replace it by PCLZIP_OPT_BY_PREG.\r\n  \r\n  Version 2.8 :\r\n    - Improve extraction of zip archive for large files by using temporary files\r\n      This feature is working like the one defined in r2.7.\r\n      Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF,\r\n      PCLZIP_OPT_TEMP_FILE_THRESHOLD\r\n    - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto\r\n      sense of temporary file use.\r\n    - Bug correction : Reduce filepath in returned file list to remove ennoying\r\n      './/' preambule in file path.\r\n\r\n  Version 2.7 :\r\n    - Improve creation of zip archive for large files :\r\n      PclZip will now autosense the configured memory and use temporary files\r\n      when large file is suspected.\r\n      This feature can also ne triggered by manual options in create() and add()\r\n      methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files,\r\n      'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, \r\n      'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size\r\n      threshold to use temporary files.\r\n      Using \"temporary files\" rather than \"memory\" might take more time, but\r\n      might give the ability to zip very large files :\r\n      Tested on my win laptop with a 88Mo file :\r\n        Zip \"in-memory\" : 18sec (max_execution_time=30, memory_limit=180Mo)\r\n        Zip \"tmporary-files\" : 23sec (max_execution_time=30, memory_limit=30Mo)\r\n    - Replace use of mktime() by time() to limit the E_STRICT error messages.\r\n    - Bug correction : When adding files with full windows path (drive letter)\r\n      PclZip is now working. Before, if the drive letter is not the default\r\n      path, PclZip was not able to add the file.\r\n\r\n  Version 2.6 :\r\n    - Code optimisation\r\n    - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to\r\n      add a comment for a specific file. (Don't really know if this is usefull)\r\n    - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string \r\n      as a file.\r\n    - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with\r\n      a file.\r\n    - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted\r\n      with current time\r\n    - Add CRC value in the informations returned back for each file after an\r\n      action.\r\n    - Add missing closedir() statement.\r\n    - When adding a folder, and removing the path of this folder, files were\r\n      incorrectly added with a '/' at the beginning. Which means files are \r\n      related to root in unix systems. Corrected.\r\n    - Add conditional if before constant definition. This will allow users\r\n      to redefine constants without changing the file, and then improve\r\n      upgrade of pclzip code for new versions.\r\n  \r\n  Version 2.5 :\r\n    - Introduce the ability to add file/folder with individual properties (file descriptor).\r\n      This gives for example the ability to change the filename of a zipped file.\r\n      . Able to add files individually\r\n      . Able to change full name\r\n      . Able to change short name\r\n      . Compatible with global options\r\n    - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME\r\n    - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE\r\n    - Add a security control feature. PclZip can extract any file in any folder\r\n      of a system. People may use this to upload a zip file and try to override\r\n      a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the\r\n      ability to forgive any directory transversal behavior.\r\n    - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path\r\n    - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION\r\n    - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend\r\n      by current path (getcwd())\r\n  \r\n  Version 2.4 :\r\n    - Code improvment : try to speed up the code by removing unusefull call to pack()\r\n    - Correct bug in delete() : delete() should be called with no argument. This was not\r\n      the case in 2.3. This is corrected in 2.4.\r\n    - Correct a bug in path_inclusion function. When the path has several '../../', the\r\n      result was bad.\r\n    - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will \r\n      disable it while working and det it back to its original value.\r\n      This resolve a lots of bad formated archive errors.\r\n    - Bug correction : PclZip now correctly unzip file in some specific situation,\r\n      when compressed content has same size as uncompressed content.\r\n    - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', \r\n      directories are not any more created.\r\n    - Code improvment : correct unclosed opendir(), better handling of . and .. in\r\n      loops.\r\n\r\n\r\n  Version 2.3 :\r\n    - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not\r\n      give the same result in PHP4 and PHP5 ....\r\n\r\n  Version 2.2 :\r\n    - Try development of PCLZIP_OPT_CRYPT .....\r\n      However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers,\r\n      the result (greater than a long) is not supported by PHP. Even the use of bcmath\r\n      functions does not help. I did not find yet a solution ...;\r\n    - Add missing '/' at end of directory entries\r\n    - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or\r\n      error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION.\r\n    - Corrected : Bad \"version need to extract\" field in local file header\r\n    - Add private method privCheckFileHeaders() in order to check local and central\r\n      file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives\r\n      the ability to have a local file header without size, compressed size and crc filled.\r\n    - Add a generic status 'error' for file status\r\n    - Add control of compression type. PclZip only support deflate compression method.\r\n      Before v2.2, PclZip does not check the compression method used in an archive while\r\n      extracting. With v2.2 PclZip returns a new error status for a file using an unsupported\r\n      compression method. New status is \"unsupported_compression\". New error code is\r\n      PCLZIP_ERR_UNSUPPORTED_COMPRESSION.\r\n    - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files\r\n      when errors like 'a folder with same name exists' or 'a newer file exists' or\r\n      'a write protected file' exists, rather than set a status for the concerning file\r\n      and resume the extract of the zip.\r\n    - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the\r\n      replacement of the file, even if a  newer version of the file exists.\r\n      Note that today if a file with the same name already exists but is older it will be\r\n      replaced by the extracted one.\r\n    - Improve PclZipUtilOption()\r\n    - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central\r\n      directory structure is the last data in the archive. Crypt encryption/decryption of\r\n      zip archive put trailing 0 bytes after decryption. PclZip is now supporting this.\r\n\r\n  Version 2.1 :\r\n    - Add the ability to abort the extraction by using a user callback function.\r\n      The user can now return the value '2' in its callback which indicates to stop the\r\n      extraction. For a pre call-back extract is stopped before the extration of the current\r\n      file. For a post call back, the extraction is stopped after.\r\n    - Add the ability to extract a file (or several files) directly in the standard output.\r\n      This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract().\r\n    - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT,\r\n      PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments\r\n      in the zip archive.\r\n    - When merging two archives, the comments are not any more lost, but merged, with a \r\n      blank space separator.\r\n    - Corrected bug : Files are not deleted when all files are asked to be deleted.\r\n    - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature.\r\n\r\n\r\n  Version 2.0 :\r\n    ***** Warning : Some new features may break the backward compatibility for your scripts.\r\n                    Please carefully read the readme file.\r\n    - Add the ability to delete by Index, name and regular expression. This feature is \r\n      performed by the method delete(), which uses the optional parameters\r\n      PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG.\r\n    - Add the ability to extract by regular expression. To extract by regexp you must use the method\r\n      extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG \r\n      (depending if you want to use ereg() or preg_match() syntax) followed by the \r\n      regular expression pattern.\r\n    - Add the ability to extract by index, directly with the extract() method. This is a\r\n      code improvment of the extractByIndex() method.\r\n    - Add the ability to extract by name. To extract by name you must use the method\r\n      extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to\r\n      extract or an array of filenames to extract. To extract all a folder, use the folder\r\n      name rather than the filename with a '/' at the end.\r\n    - Add the ability to add files without compression. This is done with a new attribute\r\n      which is PCLZIP_OPT_NO_COMPRESSION.\r\n    - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly\r\n      in a string without using any file (or temporary file).\r\n    - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string.\r\n      The default separator is now a comma (,) and not any more a blank space.\r\n      THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with\r\n      your script.\r\n    - Improve algorythm performance by removing the use of temporary files when adding or \r\n      extracting files in an archive.\r\n    - Add (correct) detection of empty filename zipping. This can occurs when the removed\r\n      path is the same\r\n      as a zipped dir. The dir is not zipped (['status'] = filtered), only its content.\r\n    - Add better support for windows paths (thanks for help from manus@manusfreedom.com).\r\n    - Corrected bug : When the archive file already exists with size=0, the add() method\r\n      fails. Corrected in 2.0.\r\n    - Remove the use of OS_WINDOWS constant. Use php_uname() function rather.\r\n    - Control the order of index ranges in extract by index feature.\r\n    - Change the internal management of folders (better handling of internal flag).\r\n\r\n\r\n  Version 1.3 :\r\n    - Removing the double include check. This is now done by include_once() and require_once()\r\n      PHP directives.\r\n    - Changing the error handling mecanism : Remove the use of an external error library.\r\n      The former PclError...() functions are replaced by internal equivalent methods.\r\n      By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library.\r\n      Introducing the use of constants for error codes rather than integer values. This will help\r\n      in futur improvment.\r\n      Introduction of error handling functions like errorCode(), errorName() and errorInfo().\r\n    - Remove the deprecated use of calling function with arguments passed by reference.\r\n    - Add the calling of extract(), extractByIndex(), create() and add() functions\r\n      with variable options rather than fixed arguments.\r\n    - Add the ability to remove all the file path while extracting or adding,\r\n      without any need to specify the path to remove.\r\n      This is available for extract(), extractByIndex(), create() and add() functionS by using\r\n      the new variable options parameters :\r\n      - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct.\r\n    - Ability to change the mode of a file after the extraction (chmod()).\r\n      This is available for extract() and extractByIndex() functionS by using\r\n      the new variable options parameters.\r\n      - PCLZIP_OPT_SET_CHMOD : by setting the value of this option.\r\n    - Ability to definition call-back options. These call-back will be called during the adding,\r\n      or the extracting of file (extract(), extractByIndex(), create() and add() functions) :\r\n      - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user\r\n        can trigerred the change the filename of the extracted file. The user can triggered the\r\n        skip of the extraction. This is adding a 'skipped' status in the file list result value.\r\n      - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file.\r\n        Nothing can be triggered from that point.\r\n      - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user\r\n        can trigerred the change the stored filename of the added file. The user can triggered the\r\n        skip of the add. This is adding a 'skipped' status in the file list result value.\r\n      - PCLZIP_CB_POST_ADD : will be called after each add of a file.\r\n        Nothing can be triggered from that point.\r\n    - Two status are added in the file list returned as function result : skipped & filename_too_long\r\n      'skipped' is used when a call-back function ask for skipping the file.\r\n      'filename_too_long' is used while adding a file with a too long filename to archive (the file is\r\n      not added)\r\n    - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into\r\n      a directory.\r\n    - Add a check of the presence of the archive file before some actions (like list, ...)\r\n    - Add the initialisation of field \"index\" in header array. This means that by\r\n      default index will be -1 when not explicitly set by the methods.\r\n\r\n  Version 1.2 :\r\n    - Adding a duplicate function.\r\n    - Adding a merge function. The merge function is a \"quick merge\" function,\r\n      it just append the content of an archive at the end of the first one. There\r\n      is no check for duplicate files or more recent files.\r\n    - Improve the search of the central directory end.\r\n\r\n  Version 1.1.2 :\r\n\r\n    - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license\r\n      (see License section).\r\n    - Adding the optional support of a static temporary directory. You will need to configure\r\n      the constant PCLZIP_TEMPORARY_DIR if you want to use this feature.\r\n    - Improving the rename() function. In some cases rename() does not work (different\r\n      Filesystems), so it will be replaced by a copy() + unlink() functions.\r\n\r\n  Version 1.1.1 :\r\n\r\n    - Maintenance release, no new feature.\r\n\r\n  Version 1.1 :\r\n\r\n    - New method Add() : adding files in the archive\r\n    - New method ExtractByIndex() : partial extract of the archive, files are identified by\r\n      their index in the archive\r\n    - New method DeleteByIndex() : delete some files/folder entries from the archive,\r\n      files are identified by their index in the archive.\r\n    - Adding a test of the zlib extension presence. If not present abort the script.\r\n\r\n  Version 1.0.1 :\r\n\r\n    - No new feature\r\n\r\n\r\n3 - Corrected bugs\r\n==================\r\n\r\n  Corrected in Version 2.0 :\r\n    - Corrected : During an extraction, if a call-back fucntion is used and try to skip\r\n                  a file, all the extraction process is stopped. \r\n\r\n  Corrected in Version 1.3 :\r\n    - Corrected : Support of static synopsis for method extract() is broken.\r\n    - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF).\r\n    - Corrected : When an extract is done with a remove_path parameter, the entry for\r\n      the directory with exactly the same path is not skipped/filtered.\r\n    - Corrected : extractByIndex() and deleteByIndex() were not managing index in the\r\n      right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This\r\n      is due to a sort of the index resulting table that puts 11 before 3-5 (sort on\r\n      string and not interger). The sort is temporarilly removed, this means that\r\n      you must provide a sorted list of index ranges.\r\n\r\n  Corrected in Version 1.2 :\r\n\r\n    - Nothing.\r\n\r\n  Corrected in Version 1.1.2 :\r\n\r\n    - Corrected : Winzip is unable to delete or add new files in a PclZip created archives.\r\n\r\n  Corrected in Version 1.1.1 :\r\n\r\n    - Corrected : When archived file is not compressed (0% compression), the\r\n      extract method fails.\r\n\r\n  Corrected in Version 1.1 :\r\n\r\n    - Corrected : Adding a complete tree of folder may result in a bad archive\r\n      creation.\r\n\r\n  Corrected in Version 1.0.1 :\r\n\r\n    - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024).\r\n\r\n\r\n4 - Known bugs or limitations\r\n=============================\r\n\r\n  Please publish bugs reports in SourceForge :\r\n    http://sourceforge.net/tracker/?group_id=40254&atid=427564\r\n\r\n  In Version 2.x :\r\n    - PclZip does only support file uncompressed or compressed with deflate (compression method 8)\r\n    - PclZip does not support password protected zip archive\r\n    - Some concern were seen when changing mtime of a file while archiving. \r\n      Seems to be linked to Daylight Saving Time (PclTest_changing_mtime).\r\n\r\n  In Version 1.2 :\r\n\r\n    - merge() methods does not check for duplicate files or last date of modifications.\r\n\r\n  In Version 1.1 :\r\n\r\n    - Limitation : Using 'extract' fields in the file header in the zip archive is not supported.\r\n    - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to\r\n      add a file in a PclZip created archive. (Corrected in v.1.2)\r\n\r\n  In Version 1.0.1 :\r\n\r\n    - Adding a complete tree of folder may result in a bad archive\r\n      creation. (Corrected in V.1.1).\r\n    - Path given to methods must be in the unix format (/) and not the Windows format (\\).\r\n      Workaround : Use only / directory separators.\r\n    - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz\r\n      added suffix. Files with these names may already exist and may be overwritten.\r\n      Workaround : none.\r\n    - PclZip does not check if the zlib extension is present. If it is absent, the zip\r\n      file is not created and the lib abort without warning.\r\n      Workaround : enable the zlib extension on the php install\r\n\r\n  In Version 1.0 :\r\n\r\n    - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024).\r\n      (Corrected in v.1.0.1)\r\n    - Limitation : Multi-disk zip archive are not supported.\r\n\r\n\r\n5 - License\r\n===========\r\n\r\n  Since version 1.1.2, PclZip Library is released under GNU/LGPL license.\r\n  This library is free, so you can use it at no cost.\r\n\r\n  HOWEVER, if you release a script, an application, a library or any kind of\r\n  code using PclZip library (or a part of it), YOU MUST :\r\n  - Indicate in the documentation (or a readme file), that your work\r\n    uses PclZip Library, and make a reference to the author and the web site\r\n    http://www.phpconcept.net\r\n  - Gives the ability to the final user to update the PclZip libary.\r\n\r\n  I will also appreciate that you send me a mail (vincent@phpconcept.net), just to\r\n  be aware that someone is using PclZip.\r\n\r\n  For more information about GNU/LGPL license : http://www.gnu.org\r\n\r\n6 - Warning\r\n=================\r\n\r\n  This library and the associated files are non commercial, non professional work.\r\n  It should not have unexpected results. However if any damage is caused by this software\r\n  the author can not be responsible.\r\n  The use of this software is at the risk of the user.\r\n\r\n7 - Documentation\r\n=================\r\n  PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php\r\n  A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/\r\n\r\n8 - Author\r\n==========\r\n\r\n  This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time.\r\n\r\n9 - Contribute\r\n==============\r\n  If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net.\r\n  If you can help in financing PhpConcept hosting service, please go to\r\n  http://www.phpconcept.net/soutien.php\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Shared_PasswordHasher\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Shared_PasswordHasher\n{\n    /**\n     * Create a password hash from a given string.\n     *\n     * This method is based on the algorithm provided by\n     * Daniel Rentz of OpenOffice and the PEAR package\n     * Spreadsheet_Excel_Writer by Xavier Noguer <xnoguer@rezebra.com>.\n     *\n     * @param     string    $pPassword    Password to hash\n     * @return     string                Hashed password\n     */\n    public static function hashPassword($pPassword = '')\n    {\n        $password   = 0x0000;\n        $charPos    = 1;       // char position\n\n        // split the plain text password in its component characters\n        $chars = preg_split('//', $pPassword, -1, PREG_SPLIT_NO_EMPTY);\n        foreach ($chars as $char) {\n            $value            = ord($char) << $charPos++;    // shifted ASCII value\n            $rotated_bits    = $value >> 15;                // rotated bits beyond bit 15\n            $value            &= 0x7fff;                    // first 15 bits\n            $password        ^= ($value | $rotated_bits);\n        }\n\n        $password ^= strlen($pPassword);\n        $password ^= 0xCE4B;\n\n        return(strtoupper(dechex($password)));\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/String.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_String\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_String\n{\n    /**    Constants                */\n    /**    Regular Expressions        */\n    //    Fraction\n    const STRING_REGEXP_FRACTION    = '(-?)(\\d+)\\s+(\\d+\\/\\d+)';\n\n\n    /**\n     * Control characters array\n     *\n     * @var string[]\n     */\n    private static $controlCharacters = array();\n\n    /**\n     * SYLK Characters array\n     *\n     * $var array\n     */\n    private static $SYLKCharacters = array();\n\n    /**\n     * Decimal separator\n     *\n     * @var string\n     */\n    private static $decimalSeparator;\n\n    /**\n     * Thousands separator\n     *\n     * @var string\n     */\n    private static $thousandsSeparator;\n\n    /**\n     * Currency code\n     *\n     * @var string\n     */\n    private static $currencyCode;\n\n    /**\n     * Is mbstring extension avalable?\n     *\n     * @var boolean\n     */\n    private static $isMbstringEnabled;\n\n    /**\n     * Is iconv extension avalable?\n     *\n     * @var boolean\n     */\n    private static $isIconvEnabled;\n\n    /**\n     * Build control characters array\n     */\n    private static function buildControlCharacters()\n    {\n        for ($i = 0; $i <= 31; ++$i) {\n            if ($i != 9 && $i != 10 && $i != 13) {\n                $find = '_x' . sprintf('%04s', strtoupper(dechex($i))) . '_';\n                $replace = chr($i);\n                self::$controlCharacters[$find] = $replace;\n            }\n        }\n    }\n\n    /**\n     * Build SYLK characters array\n     */\n    private static function buildSYLKCharacters()\n    {\n        self::$SYLKCharacters = array(\n            \"\\x1B 0\"  => chr(0),\n            \"\\x1B 1\"  => chr(1),\n            \"\\x1B 2\"  => chr(2),\n            \"\\x1B 3\"  => chr(3),\n            \"\\x1B 4\"  => chr(4),\n            \"\\x1B 5\"  => chr(5),\n            \"\\x1B 6\"  => chr(6),\n            \"\\x1B 7\"  => chr(7),\n            \"\\x1B 8\"  => chr(8),\n            \"\\x1B 9\"  => chr(9),\n            \"\\x1B :\"  => chr(10),\n            \"\\x1B ;\"  => chr(11),\n            \"\\x1B <\"  => chr(12),\n            \"\\x1B :\"  => chr(13),\n            \"\\x1B >\"  => chr(14),\n            \"\\x1B ?\"  => chr(15),\n            \"\\x1B!0\"  => chr(16),\n            \"\\x1B!1\"  => chr(17),\n            \"\\x1B!2\"  => chr(18),\n            \"\\x1B!3\"  => chr(19),\n            \"\\x1B!4\"  => chr(20),\n            \"\\x1B!5\"  => chr(21),\n            \"\\x1B!6\"  => chr(22),\n            \"\\x1B!7\"  => chr(23),\n            \"\\x1B!8\"  => chr(24),\n            \"\\x1B!9\"  => chr(25),\n            \"\\x1B!:\"  => chr(26),\n            \"\\x1B!;\"  => chr(27),\n            \"\\x1B!<\"  => chr(28),\n            \"\\x1B!=\"  => chr(29),\n            \"\\x1B!>\"  => chr(30),\n            \"\\x1B!?\"  => chr(31),\n            \"\\x1B'?\"  => chr(127),\n            \"\\x1B(0\"  => '€', // 128 in CP1252\n            \"\\x1B(2\"  => '‚', // 130 in CP1252\n            \"\\x1B(3\"  => 'ƒ', // 131 in CP1252\n            \"\\x1B(4\"  => '„', // 132 in CP1252\n            \"\\x1B(5\"  => '…', // 133 in CP1252\n            \"\\x1B(6\"  => '†', // 134 in CP1252\n            \"\\x1B(7\"  => '‡', // 135 in CP1252\n            \"\\x1B(8\"  => 'ˆ', // 136 in CP1252\n            \"\\x1B(9\"  => '‰', // 137 in CP1252\n            \"\\x1B(:\"  => 'Š', // 138 in CP1252\n            \"\\x1B(;\"  => '‹', // 139 in CP1252\n            \"\\x1BNj\"  => 'Œ', // 140 in CP1252\n            \"\\x1B(>\"  => 'Ž', // 142 in CP1252\n            \"\\x1B)1\"  => '‘', // 145 in CP1252\n            \"\\x1B)2\"  => '’', // 146 in CP1252\n            \"\\x1B)3\"  => '“', // 147 in CP1252\n            \"\\x1B)4\"  => '”', // 148 in CP1252\n            \"\\x1B)5\"  => '•', // 149 in CP1252\n            \"\\x1B)6\"  => '–', // 150 in CP1252\n            \"\\x1B)7\"  => '—', // 151 in CP1252\n            \"\\x1B)8\"  => '˜', // 152 in CP1252\n            \"\\x1B)9\"  => '™', // 153 in CP1252\n            \"\\x1B):\"  => 'š', // 154 in CP1252\n            \"\\x1B);\"  => '›', // 155 in CP1252\n            \"\\x1BNz\"  => 'œ', // 156 in CP1252\n            \"\\x1B)>\"  => 'ž', // 158 in CP1252\n            \"\\x1B)?\"  => 'Ÿ', // 159 in CP1252\n            \"\\x1B*0\"  => ' ', // 160 in CP1252\n            \"\\x1BN!\"  => '¡', // 161 in CP1252\n            \"\\x1BN\\\"\" => '¢', // 162 in CP1252\n            \"\\x1BN#\"  => '£', // 163 in CP1252\n            \"\\x1BN(\"  => '¤', // 164 in CP1252\n            \"\\x1BN%\"  => '¥', // 165 in CP1252\n            \"\\x1B*6\"  => '¦', // 166 in CP1252\n            \"\\x1BN'\"  => '§', // 167 in CP1252\n            \"\\x1BNH \" => '¨', // 168 in CP1252\n            \"\\x1BNS\"  => '©', // 169 in CP1252\n            \"\\x1BNc\"  => 'ª', // 170 in CP1252\n            \"\\x1BN+\"  => '«', // 171 in CP1252\n            \"\\x1B*<\"  => '¬', // 172 in CP1252\n            \"\\x1B*=\"  => '­', // 173 in CP1252\n            \"\\x1BNR\"  => '®', // 174 in CP1252\n            \"\\x1B*?\"  => '¯', // 175 in CP1252\n            \"\\x1BN0\"  => '°', // 176 in CP1252\n            \"\\x1BN1\"  => '±', // 177 in CP1252\n            \"\\x1BN2\"  => '²', // 178 in CP1252\n            \"\\x1BN3\"  => '³', // 179 in CP1252\n            \"\\x1BNB \" => '´', // 180 in CP1252\n            \"\\x1BN5\"  => 'µ', // 181 in CP1252\n            \"\\x1BN6\"  => '¶', // 182 in CP1252\n            \"\\x1BN7\"  => '·', // 183 in CP1252\n            \"\\x1B+8\"  => '¸', // 184 in CP1252\n            \"\\x1BNQ\"  => '¹', // 185 in CP1252\n            \"\\x1BNk\"  => 'º', // 186 in CP1252\n            \"\\x1BN;\"  => '»', // 187 in CP1252\n            \"\\x1BN<\"  => '¼', // 188 in CP1252\n            \"\\x1BN=\"  => '½', // 189 in CP1252\n            \"\\x1BN>\"  => '¾', // 190 in CP1252\n            \"\\x1BN?\"  => '¿', // 191 in CP1252\n            \"\\x1BNAA\" => 'À', // 192 in CP1252\n            \"\\x1BNBA\" => 'Á', // 193 in CP1252\n            \"\\x1BNCA\" => 'Â', // 194 in CP1252\n            \"\\x1BNDA\" => 'Ã', // 195 in CP1252\n            \"\\x1BNHA\" => 'Ä', // 196 in CP1252\n            \"\\x1BNJA\" => 'Å', // 197 in CP1252\n            \"\\x1BNa\"  => 'Æ', // 198 in CP1252\n            \"\\x1BNKC\" => 'Ç', // 199 in CP1252\n            \"\\x1BNAE\" => 'È', // 200 in CP1252\n            \"\\x1BNBE\" => 'É', // 201 in CP1252\n            \"\\x1BNCE\" => 'Ê', // 202 in CP1252\n            \"\\x1BNHE\" => 'Ë', // 203 in CP1252\n            \"\\x1BNAI\" => 'Ì', // 204 in CP1252\n            \"\\x1BNBI\" => 'Í', // 205 in CP1252\n            \"\\x1BNCI\" => 'Î', // 206 in CP1252\n            \"\\x1BNHI\" => 'Ï', // 207 in CP1252\n            \"\\x1BNb\"  => 'Ð', // 208 in CP1252\n            \"\\x1BNDN\" => 'Ñ', // 209 in CP1252\n            \"\\x1BNAO\" => 'Ò', // 210 in CP1252\n            \"\\x1BNBO\" => 'Ó', // 211 in CP1252\n            \"\\x1BNCO\" => 'Ô', // 212 in CP1252\n            \"\\x1BNDO\" => 'Õ', // 213 in CP1252\n            \"\\x1BNHO\" => 'Ö', // 214 in CP1252\n            \"\\x1B-7\"  => '×', // 215 in CP1252\n            \"\\x1BNi\"  => 'Ø', // 216 in CP1252\n            \"\\x1BNAU\" => 'Ù', // 217 in CP1252\n            \"\\x1BNBU\" => 'Ú', // 218 in CP1252\n            \"\\x1BNCU\" => 'Û', // 219 in CP1252\n            \"\\x1BNHU\" => 'Ü', // 220 in CP1252\n            \"\\x1B-=\"  => 'Ý', // 221 in CP1252\n            \"\\x1BNl\"  => 'Þ', // 222 in CP1252\n            \"\\x1BN{\"  => 'ß', // 223 in CP1252\n            \"\\x1BNAa\" => 'à', // 224 in CP1252\n            \"\\x1BNBa\" => 'á', // 225 in CP1252\n            \"\\x1BNCa\" => 'â', // 226 in CP1252\n            \"\\x1BNDa\" => 'ã', // 227 in CP1252\n            \"\\x1BNHa\" => 'ä', // 228 in CP1252\n            \"\\x1BNJa\" => 'å', // 229 in CP1252\n            \"\\x1BNq\"  => 'æ', // 230 in CP1252\n            \"\\x1BNKc\" => 'ç', // 231 in CP1252\n            \"\\x1BNAe\" => 'è', // 232 in CP1252\n            \"\\x1BNBe\" => 'é', // 233 in CP1252\n            \"\\x1BNCe\" => 'ê', // 234 in CP1252\n            \"\\x1BNHe\" => 'ë', // 235 in CP1252\n            \"\\x1BNAi\" => 'ì', // 236 in CP1252\n            \"\\x1BNBi\" => 'í', // 237 in CP1252\n            \"\\x1BNCi\" => 'î', // 238 in CP1252\n            \"\\x1BNHi\" => 'ï', // 239 in CP1252\n            \"\\x1BNs\"  => 'ð', // 240 in CP1252\n            \"\\x1BNDn\" => 'ñ', // 241 in CP1252\n            \"\\x1BNAo\" => 'ò', // 242 in CP1252\n            \"\\x1BNBo\" => 'ó', // 243 in CP1252\n            \"\\x1BNCo\" => 'ô', // 244 in CP1252\n            \"\\x1BNDo\" => 'õ', // 245 in CP1252\n            \"\\x1BNHo\" => 'ö', // 246 in CP1252\n            \"\\x1B/7\"  => '÷', // 247 in CP1252\n            \"\\x1BNy\"  => 'ø', // 248 in CP1252\n            \"\\x1BNAu\" => 'ù', // 249 in CP1252\n            \"\\x1BNBu\" => 'ú', // 250 in CP1252\n            \"\\x1BNCu\" => 'û', // 251 in CP1252\n            \"\\x1BNHu\" => 'ü', // 252 in CP1252\n            \"\\x1B/=\"  => 'ý', // 253 in CP1252\n            \"\\x1BN|\"  => 'þ', // 254 in CP1252\n            \"\\x1BNHy\" => 'ÿ', // 255 in CP1252\n        );\n    }\n\n    /**\n     * Get whether mbstring extension is available\n     *\n     * @return boolean\n     */\n    public static function getIsMbstringEnabled()\n    {\n        if (isset(self::$isMbstringEnabled)) {\n            return self::$isMbstringEnabled;\n        }\n\n        self::$isMbstringEnabled = function_exists('mb_convert_encoding') ?\n            true : false;\n\n        return self::$isMbstringEnabled;\n    }\n\n    /**\n     * Get whether iconv extension is available\n     *\n     * @return boolean\n     */\n    public static function getIsIconvEnabled()\n    {\n        if (isset(self::$isIconvEnabled)) {\n            return self::$isIconvEnabled;\n        }\n\n        // Fail if iconv doesn't exist\n        if (!function_exists('iconv')) {\n            self::$isIconvEnabled = false;\n            return false;\n        }\n\n        // Sometimes iconv is not working, and e.g. iconv('UTF-8', 'UTF-16LE', 'x') just returns false,\n        if (!@iconv('UTF-8', 'UTF-16LE', 'x')) {\n            self::$isIconvEnabled = false;\n            return false;\n        }\n\n        // Sometimes iconv_substr('A', 0, 1, 'UTF-8') just returns false in PHP 5.2.0\n        // we cannot use iconv in that case either (http://bugs.php.net/bug.php?id=37773)\n        if (!@iconv_substr('A', 0, 1, 'UTF-8')) {\n            self::$isIconvEnabled = false;\n            return false;\n        }\n\n        // CUSTOM: IBM AIX iconv() does not work\n        if (defined('PHP_OS') && @stristr(PHP_OS, 'AIX') && defined('ICONV_IMPL') && (@strcasecmp(ICONV_IMPL, 'unknown') == 0) && defined('ICONV_VERSION') && (@strcasecmp(ICONV_VERSION, 'unknown') == 0)) {\n            self::$isIconvEnabled = false;\n            return false;\n        }\n\n        // If we reach here no problems were detected with iconv\n        self::$isIconvEnabled = true;\n        return true;\n    }\n\n    public static function buildCharacterSets()\n    {\n        if (empty(self::$controlCharacters)) {\n            self::buildControlCharacters();\n        }\n        if (empty(self::$SYLKCharacters)) {\n            self::buildSYLKCharacters();\n        }\n    }\n\n    /**\n     * Convert from OpenXML escaped control character to PHP control character\n     *\n     * Excel 2007 team:\n     * ----------------\n     * That's correct, control characters are stored directly in the shared-strings table.\n     * We do encode characters that cannot be represented in XML using the following escape sequence:\n     * _xHHHH_ where H represents a hexadecimal character in the character's value...\n     * So you could end up with something like _x0008_ in a string (either in a cell value (<v>)\n     * element or in the shared string <t> element.\n     *\n     * @param     string    $value    Value to unescape\n     * @return     string\n     */\n    public static function ControlCharacterOOXML2PHP($value = '')\n    {\n        return str_replace(array_keys(self::$controlCharacters), array_values(self::$controlCharacters), $value);\n    }\n\n    /**\n     * Convert from PHP control character to OpenXML escaped control character\n     *\n     * Excel 2007 team:\n     * ----------------\n     * That's correct, control characters are stored directly in the shared-strings table.\n     * We do encode characters that cannot be represented in XML using the following escape sequence:\n     * _xHHHH_ where H represents a hexadecimal character in the character's value...\n     * So you could end up with something like _x0008_ in a string (either in a cell value (<v>)\n     * element or in the shared string <t> element.\n     *\n     * @param     string    $value    Value to escape\n     * @return     string\n     */\n    public static function ControlCharacterPHP2OOXML($value = '')\n    {\n        return str_replace(array_values(self::$controlCharacters), array_keys(self::$controlCharacters), $value);\n    }\n\n    /**\n     * Try to sanitize UTF8, stripping invalid byte sequences. Not perfect. Does not surrogate characters.\n     *\n     * @param string $value\n     * @return string\n     */\n    public static function SanitizeUTF8($value)\n    {\n        if (self::getIsIconvEnabled()) {\n            $value = @iconv('UTF-8', 'UTF-8', $value);\n            return $value;\n        }\n\n        if (self::getIsMbstringEnabled()) {\n            $value = mb_convert_encoding($value, 'UTF-8', 'UTF-8');\n            return $value;\n        }\n\n        // else, no conversion\n        return $value;\n    }\n\n    /**\n     * Check if a string contains UTF8 data\n     *\n     * @param string $value\n     * @return boolean\n     */\n    public static function IsUTF8($value = '')\n    {\n        return $value === '' || preg_match('/^./su', $value) === 1;\n    }\n\n    /**\n     * Formats a numeric value as a string for output in various output writers forcing\n     * point as decimal separator in case locale is other than English.\n     *\n     * @param mixed $value\n     * @return string\n     */\n    public static function FormatNumber($value)\n    {\n        if (is_float($value)) {\n            return str_replace(',', '.', $value);\n        }\n        return (string) $value;\n    }\n\n    /**\n     * Converts a UTF-8 string into BIFF8 Unicode string data (8-bit string length)\n     * Writes the string using uncompressed notation, no rich text, no Asian phonetics\n     * If mbstring extension is not available, ASCII is assumed, and compressed notation is used\n     * although this will give wrong results for non-ASCII strings\n     * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3\n     *\n     * @param string  $value    UTF-8 encoded string\n     * @param mixed[] $arrcRuns Details of rich text runs in $value\n     * @return string\n     */\n    public static function UTF8toBIFF8UnicodeShort($value, $arrcRuns = array())\n    {\n        // character count\n        $ln = self::CountCharacters($value, 'UTF-8');\n        // option flags\n        if (empty($arrcRuns)) {\n            $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ?\n                0x0001 : 0x0000;\n            $data = pack('CC', $ln, $opt);\n            // characters\n            $data .= self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8');\n        } else {\n            $data = pack('vC', $ln, 0x09);\n            $data .= pack('v', count($arrcRuns));\n            // characters\n            $data .= self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8');\n            foreach ($arrcRuns as $cRun) {\n                $data .= pack('v', $cRun['strlen']);\n                $data .= pack('v', $cRun['fontidx']);\n            }\n        }\n        return $data;\n    }\n\n    /**\n     * Converts a UTF-8 string into BIFF8 Unicode string data (16-bit string length)\n     * Writes the string using uncompressed notation, no rich text, no Asian phonetics\n     * If mbstring extension is not available, ASCII is assumed, and compressed notation is used\n     * although this will give wrong results for non-ASCII strings\n     * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3\n     *\n     * @param string $value UTF-8 encoded string\n     * @return string\n     */\n    public static function UTF8toBIFF8UnicodeLong($value)\n    {\n        // character count\n        $ln = self::CountCharacters($value, 'UTF-8');\n\n        // option flags\n        $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ?\n            0x0001 : 0x0000;\n\n        // characters\n        $chars = self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8');\n\n        $data = pack('vC', $ln, $opt) . $chars;\n        return $data;\n    }\n\n    /**\n     * Convert string from one encoding to another. First try mbstring, then iconv, finally strlen\n     *\n     * @param string $value\n     * @param string $to Encoding to convert to, e.g. 'UTF-8'\n     * @param string $from Encoding to convert from, e.g. 'UTF-16LE'\n     * @return string\n     */\n    public static function ConvertEncoding($value, $to, $from)\n    {\n        if (self::getIsIconvEnabled()) {\n            return iconv($from, $to, $value);\n        }\n\n        if (self::getIsMbstringEnabled()) {\n            return mb_convert_encoding($value, $to, $from);\n        }\n\n        if ($from == 'UTF-16LE') {\n            return self::utf16_decode($value, false);\n        } elseif ($from == 'UTF-16BE') {\n            return self::utf16_decode($value);\n        }\n        // else, no conversion\n        return $value;\n    }\n\n    /**\n     * Decode UTF-16 encoded strings.\n     *\n     * Can handle both BOM'ed data and un-BOM'ed data.\n     * Assumes Big-Endian byte order if no BOM is available.\n     * This function was taken from http://php.net/manual/en/function.utf8-decode.php\n     * and $bom_be parameter added.\n     *\n     * @param   string  $str  UTF-16 encoded data to decode.\n     * @return  string  UTF-8 / ISO encoded data.\n     * @access  public\n     * @version 0.2 / 2010-05-13\n     * @author  Rasmus Andersson {@link http://rasmusandersson.se/}\n     * @author vadik56\n     */\n    public static function utf16_decode($str, $bom_be = true)\n    {\n        if (strlen($str) < 2) {\n            return $str;\n        }\n        $c0 = ord($str{0});\n        $c1 = ord($str{1});\n        if ($c0 == 0xfe && $c1 == 0xff) {\n            $str = substr($str, 2);\n        } elseif ($c0 == 0xff && $c1 == 0xfe) {\n            $str = substr($str, 2);\n            $bom_be = false;\n        }\n        $len = strlen($str);\n        $newstr = '';\n        for ($i=0; $i<$len; $i+=2) {\n            if ($bom_be) {\n                $val = ord($str{$i})   << 4;\n                $val += ord($str{$i+1});\n            } else {\n                $val = ord($str{$i+1}) << 4;\n                $val += ord($str{$i});\n            }\n            $newstr .= ($val == 0x228) ? \"\\n\" : chr($val);\n        }\n        return $newstr;\n    }\n\n    /**\n     * Get character count. First try mbstring, then iconv, finally strlen\n     *\n     * @param string $value\n     * @param string $enc Encoding\n     * @return int Character count\n     */\n    public static function CountCharacters($value, $enc = 'UTF-8')\n    {\n        if (self::getIsMbstringEnabled()) {\n            return mb_strlen($value, $enc);\n        }\n\n        if (self::getIsIconvEnabled()) {\n            return iconv_strlen($value, $enc);\n        }\n\n        // else strlen\n        return strlen($value);\n    }\n\n    /**\n     * Get a substring of a UTF-8 encoded string. First try mbstring, then iconv, finally strlen\n     *\n     * @param string $pValue UTF-8 encoded string\n     * @param int $pStart Start offset\n     * @param int $pLength Maximum number of characters in substring\n     * @return string\n     */\n    public static function Substring($pValue = '', $pStart = 0, $pLength = 0)\n    {\n        if (self::getIsMbstringEnabled()) {\n            return mb_substr($pValue, $pStart, $pLength, 'UTF-8');\n        }\n\n        if (self::getIsIconvEnabled()) {\n            return iconv_substr($pValue, $pStart, $pLength, 'UTF-8');\n        }\n\n        // else substr\n        return substr($pValue, $pStart, $pLength);\n    }\n\n    /**\n     * Convert a UTF-8 encoded string to upper case\n     *\n     * @param string $pValue UTF-8 encoded string\n     * @return string\n     */\n    public static function StrToUpper($pValue = '')\n    {\n        if (function_exists('mb_convert_case')) {\n            return mb_convert_case($pValue, MB_CASE_UPPER, \"UTF-8\");\n        }\n        return strtoupper($pValue);\n    }\n\n    /**\n     * Convert a UTF-8 encoded string to lower case\n     *\n     * @param string $pValue UTF-8 encoded string\n     * @return string\n     */\n    public static function StrToLower($pValue = '')\n    {\n        if (function_exists('mb_convert_case')) {\n            return mb_convert_case($pValue, MB_CASE_LOWER, \"UTF-8\");\n        }\n        return strtolower($pValue);\n    }\n\n    /**\n     * Convert a UTF-8 encoded string to title/proper case\n     *    (uppercase every first character in each word, lower case all other characters)\n     *\n     * @param string $pValue UTF-8 encoded string\n     * @return string\n     */\n    public static function StrToTitle($pValue = '')\n    {\n        if (function_exists('mb_convert_case')) {\n            return mb_convert_case($pValue, MB_CASE_TITLE, \"UTF-8\");\n        }\n        return ucwords($pValue);\n    }\n\n    public static function mb_is_upper($char)\n    {\n        return mb_strtolower($char, \"UTF-8\") != $char;\n    }\n\n    public static function mb_str_split($string)\n    {\n        # Split at all position not after the start: ^\n        # and not before the end: $\n        return preg_split('/(?<!^)(?!$)/u', $string);\n    }\n\n    /**\n     * Reverse the case of a string, so that all uppercase characters become lowercase\n     *    and all lowercase characters become uppercase\n     *\n     * @param string $pValue UTF-8 encoded string\n     * @return string\n     */\n    public static function StrCaseReverse($pValue = '')\n    {\n        if (self::getIsMbstringEnabled()) {\n            $characters = self::mb_str_split($pValue);\n            foreach ($characters as &$character) {\n                if (self::mb_is_upper($character)) {\n                    $character = mb_strtolower($character, 'UTF-8');\n                } else {\n                    $character = mb_strtoupper($character, 'UTF-8');\n                }\n            }\n            return implode('', $characters);\n        }\n        return strtolower($pValue) ^ strtoupper($pValue) ^ $pValue;\n    }\n\n    /**\n     * Identify whether a string contains a fractional numeric value,\n     *    and convert it to a numeric if it is\n     *\n     * @param string &$operand string value to test\n     * @return boolean\n     */\n    public static function convertToNumberIfFraction(&$operand)\n    {\n        if (preg_match('/^'.self::STRING_REGEXP_FRACTION.'$/i', $operand, $match)) {\n            $sign = ($match[1] == '-') ? '-' : '+';\n            $fractionFormula = '='.$sign.$match[2].$sign.$match[3];\n            $operand = PHPExcel_Calculation::getInstance()->_calculateFormulaValue($fractionFormula);\n            return true;\n        }\n        return false;\n    }    //    function convertToNumberIfFraction()\n\n    /**\n     * Get the decimal separator. If it has not yet been set explicitly, try to obtain number\n     * formatting information from locale.\n     *\n     * @return string\n     */\n    public static function getDecimalSeparator()\n    {\n        if (!isset(self::$decimalSeparator)) {\n            $localeconv = localeconv();\n            self::$decimalSeparator = ($localeconv['decimal_point'] != '')\n                ? $localeconv['decimal_point'] : $localeconv['mon_decimal_point'];\n\n            if (self::$decimalSeparator == '') {\n                // Default to .\n                self::$decimalSeparator = '.';\n            }\n        }\n        return self::$decimalSeparator;\n    }\n\n    /**\n     * Set the decimal separator. Only used by PHPExcel_Style_NumberFormat::toFormattedString()\n     * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF\n     *\n     * @param string $pValue Character for decimal separator\n     */\n    public static function setDecimalSeparator($pValue = '.')\n    {\n        self::$decimalSeparator = $pValue;\n    }\n\n    /**\n     * Get the thousands separator. If it has not yet been set explicitly, try to obtain number\n     * formatting information from locale.\n     *\n     * @return string\n     */\n    public static function getThousandsSeparator()\n    {\n        if (!isset(self::$thousandsSeparator)) {\n            $localeconv = localeconv();\n            self::$thousandsSeparator = ($localeconv['thousands_sep'] != '')\n                ? $localeconv['thousands_sep'] : $localeconv['mon_thousands_sep'];\n\n            if (self::$thousandsSeparator == '') {\n                // Default to .\n                self::$thousandsSeparator = ',';\n            }\n        }\n        return self::$thousandsSeparator;\n    }\n\n    /**\n     * Set the thousands separator. Only used by PHPExcel_Style_NumberFormat::toFormattedString()\n     * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF\n     *\n     * @param string $pValue Character for thousands separator\n     */\n    public static function setThousandsSeparator($pValue = ',')\n    {\n        self::$thousandsSeparator = $pValue;\n    }\n\n    /**\n     *    Get the currency code. If it has not yet been set explicitly, try to obtain the\n     *        symbol information from locale.\n     *\n     * @return string\n     */\n    public static function getCurrencyCode()\n    {\n        if (!isset(self::$currencyCode)) {\n            $localeconv = localeconv();\n            self::$currencyCode = ($localeconv['currency_symbol'] != '')\n                ? $localeconv['currency_symbol'] : $localeconv['int_curr_symbol'];\n\n            if (self::$currencyCode == '') {\n                // Default to $\n                self::$currencyCode = '$';\n            }\n        }\n        return self::$currencyCode;\n    }\n\n    /**\n     * Set the currency code. Only used by PHPExcel_Style_NumberFormat::toFormattedString()\n     *        to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF\n     *\n     * @param string $pValue Character for currency code\n     */\n    public static function setCurrencyCode($pValue = '$')\n    {\n        self::$currencyCode = $pValue;\n    }\n\n    /**\n     * Convert SYLK encoded string to UTF-8\n     *\n     * @param string $pValue\n     * @return string UTF-8 encoded string\n     */\n    public static function SYLKtoUTF8($pValue = '')\n    {\n        // If there is no escape character in the string there is nothing to do\n        if (strpos($pValue, '\u001b') === false) {\n            return $pValue;\n        }\n\n        foreach (self::$SYLKCharacters as $k => $v) {\n            $pValue = str_replace($k, $v, $pValue);\n        }\n\n        return $pValue;\n    }\n\n    /**\n     * Retrieve any leading numeric part of a string, or return the full string if no leading numeric\n     *    (handles basic integer or float, but not exponent or non decimal)\n     *\n     * @param    string    $value\n     * @return    mixed    string or only the leading numeric part of the string\n     */\n    public static function testStringAsNumeric($value)\n    {\n        if (is_numeric($value)) {\n            return $value;\n        }\n        $v = floatval($value);\n        return (is_numeric(substr($value, 0, strlen($v)))) ? $v : $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/TimeZone.php",
    "content": "<?php\n\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Shared_TimeZone\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Shared_TimeZone\n{\n    /*\n     * Default Timezone used for date/time conversions\n     *\n     * @private\n     * @var    string\n     */\n    protected static $timezone    = 'UTC';\n\n    /**\n     * Validate a Timezone name\n     *\n     * @param     string        $timezone            Time zone (e.g. 'Europe/London')\n     * @return     boolean                        Success or failure\n     */\n    public static function _validateTimeZone($timezone)\n    {\n        if (in_array($timezone, DateTimeZone::listIdentifiers())) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Set the Default Timezone used for date/time conversions\n     *\n     * @param     string        $timezone            Time zone (e.g. 'Europe/London')\n     * @return     boolean                        Success or failure\n     */\n    public static function setTimeZone($timezone)\n    {\n        if (self::_validateTimezone($timezone)) {\n            self::$timezone = $timezone;\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n     * Return the Default Timezone used for date/time conversions\n     *\n     * @return     string        Timezone (e.g. 'Europe/London')\n     */\n    public static function getTimeZone()\n    {\n        return self::$timezone;\n    }\n\n\n    /**\n     *    Return the Timezone transition for the specified timezone and timestamp\n     *\n     *    @param        DateTimeZone         $objTimezone    The timezone for finding the transitions\n     *    @param        integer                 $timestamp        PHP date/time value for finding the current transition\n     *    @return         array                The current transition details\n     */\n    private static function getTimezoneTransitions($objTimezone, $timestamp)\n    {\n        $allTransitions = $objTimezone->getTransitions();\n        $transitions = array();\n        foreach ($allTransitions as $key => $transition) {\n            if ($transition['ts'] > $timestamp) {\n                $transitions[] = ($key > 0) ? $allTransitions[$key - 1] : $transition;\n                break;\n            }\n            if (empty($transitions)) {\n                $transitions[] = end($allTransitions);\n            }\n        }\n\n        return $transitions;\n    }\n\n    /**\n     *    Return the Timezone offset used for date/time conversions to/from UST\n     *    This requires both the timezone and the calculated date/time to allow for local DST\n     *\n     *    @param        string                 $timezone        The timezone for finding the adjustment to UST\n     *    @param        integer                 $timestamp        PHP date/time value\n     *    @return         integer                Number of seconds for timezone adjustment\n     *    @throws        PHPExcel_Exception\n     */\n    public static function getTimeZoneAdjustment($timezone, $timestamp)\n    {\n        if ($timezone !== null) {\n            if (!self::_validateTimezone($timezone)) {\n                throw new PHPExcel_Exception(\"Invalid timezone \" . $timezone);\n            }\n        } else {\n            $timezone = self::$timezone;\n        }\n\n        if ($timezone == 'UST') {\n            return 0;\n        }\n\n        $objTimezone = new DateTimeZone($timezone);\n        if (version_compare(PHP_VERSION, '5.3.0') >= 0) {\n            $transitions = $objTimezone->getTransitions($timestamp, $timestamp);\n        } else {\n            $transitions = self::getTimezoneTransitions($objTimezone, $timestamp);\n        }\n\n        return (count($transitions) > 0) ? $transitions[0]['offset'] : 0;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php",
    "content": "<?php\n\nif (!defined('DATE_W3C')) {\n    define('DATE_W3C', 'Y-m-d\\TH:i:sP');\n}\n\nif (!defined('DEBUGMODE_ENABLED')) {\n    define('DEBUGMODE_ENABLED', false);\n}\n\n/**\n * PHPExcel_Shared_XMLWriter\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_XMLWriter extends XMLWriter\n{\n    /** Temporary storage method */\n    const STORAGE_MEMORY    = 1;\n    const STORAGE_DISK      = 2;\n\n    /**\n     * Temporary filename\n     *\n     * @var string\n     */\n    private $tempFileName  = '';\n\n    /**\n     * Create a new PHPExcel_Shared_XMLWriter instance\n     *\n     * @param int      $pTemporaryStorage        Temporary storage location\n     * @param string   $pTemporaryStorageFolder  Temporary storage folder\n     */\n    public function __construct($pTemporaryStorage = self::STORAGE_MEMORY, $pTemporaryStorageFolder = null)\n    {\n        // Open temporary storage\n        if ($pTemporaryStorage == self::STORAGE_MEMORY) {\n            $this->openMemory();\n        } else {\n            // Create temporary filename\n            if ($pTemporaryStorageFolder === null) {\n                $pTemporaryStorageFolder = PHPExcel_Shared_File::sys_get_temp_dir();\n            }\n            $this->tempFileName = @tempnam($pTemporaryStorageFolder, 'xml');\n\n            // Open storage\n            if ($this->openUri($this->tempFileName) === false) {\n                // Fallback to memory...\n                $this->openMemory();\n            }\n        }\n\n        // Set default values\n        if (DEBUGMODE_ENABLED) {\n            $this->setIndent(true);\n        }\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        // Unlink temporary files\n        if ($this->tempFileName != '') {\n            @unlink($this->tempFileName);\n        }\n    }\n\n    /**\n     * Get written data\n     *\n     * @return $data\n     */\n    public function getData()\n    {\n        if ($this->tempFileName == '') {\n            return $this->outputMemory(true);\n        } else {\n            $this->flush();\n            return file_get_contents($this->tempFileName);\n        }\n    }\n\n    /**\n     * Fallback method for writeRaw, introduced in PHP 5.2\n     *\n     * @param string $text\n     * @return string\n     */\n    public function writeRawData($text)\n    {\n        if (is_array($text)) {\n            $text = implode(\"\\n\", $text);\n        }\n\n        if (method_exists($this, 'writeRaw')) {\n            return $this->writeRaw(htmlspecialchars($text));\n        }\n\n        return $this->text($text);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/ZipArchive.php",
    "content": "<?php\n\nif (!defined('PCLZIP_TEMPORARY_DIR')) {\n    define('PCLZIP_TEMPORARY_DIR', PHPExcel_Shared_File::sys_get_temp_dir() . DIRECTORY_SEPARATOR);\n}\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/PCLZip/pclzip.lib.php';\n\n/**\n * PHPExcel_Shared_ZipArchive\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_ZipArchive\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_ZipArchive\n{\n\n    /**    constants */\n    const OVERWRITE = 'OVERWRITE';\n    const CREATE    = 'CREATE';\n\n\n    /**\n     * Temporary storage directory\n     *\n     * @var string\n     */\n    private $tempDir;\n\n    /**\n     * Zip Archive Stream Handle\n     *\n     * @var string\n     */\n    private $zip;\n\n\n    /**\n     * Open a new zip archive\n     *\n     * @param    string    $fileName    Filename for the zip archive\n     * @return    boolean\n     */\n    public function open($fileName)\n    {\n        $this->tempDir = PHPExcel_Shared_File::sys_get_temp_dir();\n        $this->zip = new PclZip($fileName);\n\n        return true;\n    }\n\n\n    /**\n     * Close this zip archive\n     *\n     */\n    public function close()\n    {\n    }\n\n\n    /**\n     * Add a new file to the zip archive from a string of raw data.\n     *\n     * @param    string    $localname        Directory/Name of the file to add to the zip archive\n     * @param    string    $contents        String of data to add to the zip archive\n     */\n    public function addFromString($localname, $contents)\n    {\n        $filenameParts = pathinfo($localname);\n\n        $handle = fopen($this->tempDir.'/'.$filenameParts[\"basename\"], \"wb\");\n        fwrite($handle, $contents);\n        fclose($handle);\n\n        $res = $this->zip->add($this->tempDir.'/'.$filenameParts[\"basename\"], PCLZIP_OPT_REMOVE_PATH, $this->tempDir, PCLZIP_OPT_ADD_PATH, $filenameParts[\"dirname\"]);\n        if ($res == 0) {\n            throw new PHPExcel_Writer_Exception(\"Error zipping files : \" . $this->zip->errorInfo(true));\n        }\n\n        unlink($this->tempDir.'/'.$filenameParts[\"basename\"]);\n    }\n\n    /**\n     * Find if given fileName exist in archive (Emulate ZipArchive locateName())\n     *\n     * @param        string        $fileName        Filename for the file in zip archive\n     * @return        boolean\n     */\n    public function locateName($fileName)\n    {\n        $fileName = strtolower($fileName);\n\n        $list = $this->zip->listContent();\n        $listCount = count($list);\n        $index = -1;\n        for ($i = 0; $i < $listCount; ++$i) {\n            if (strtolower($list[$i][\"filename\"]) == $fileName ||\n                strtolower($list[$i][\"stored_filename\"]) == $fileName) {\n                $index = $i;\n                break;\n            }\n        }\n        return ($index > -1) ? $index : false;\n    }\n\n    /**\n     * Extract file from archive by given fileName (Emulate ZipArchive getFromName())\n     *\n     * @param        string        $fileName        Filename for the file in zip archive\n     * @return        string  $contents        File string contents\n     */\n    public function getFromName($fileName)\n    {\n        $index = $this->locateName($fileName);\n\n        if ($index !== false) {\n            $extracted = $this->getFromIndex($index);\n        } else {\n            $fileName = substr($fileName, 1);\n            $index = $this->locateName($fileName);\n            if ($index === false) {\n                return false;\n            }\n            $extracted = $this->zip->getFromIndex($index);\n        }\n\n        $contents = $extracted;\n        if ((is_array($extracted)) && ($extracted != 0)) {\n            $contents = $extracted[0][\"content\"];\n        }\n\n        return $contents;\n    }\n    \n    public function getFromIndex($index) {\n        $extracted = $this->zip->extractByIndex($index, PCLZIP_OPT_EXTRACT_AS_STRING);\n        $contents = '';\n        if ((is_array($extracted)) && ($extracted != 0)) {\n            $contents = $extracted[0][\"content\"];\n        }\n\n        return $contents;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php",
    "content": "<?php\n\n/**\n * PHPExcel_Shared_ZipStreamWrapper\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Shared_ZipStreamWrapper\n{\n    /**\n     * Internal ZipAcrhive\n     *\n     * @var ZipArchive\n     */\n    private $archive;\n\n    /**\n     * Filename in ZipAcrhive\n     *\n     * @var string\n     */\n    private $fileNameInArchive = '';\n\n    /**\n     * Position in file\n     *\n     * @var int\n     */\n    private $position = 0;\n\n    /**\n     * Data\n     *\n     * @var mixed\n     */\n    private $data = '';\n\n    /**\n     * Register wrapper\n     */\n    public static function register()\n    {\n        @stream_wrapper_unregister('zip');\n        @stream_wrapper_register('zip', __CLASS__);\n    }\n\n    /**\n     * Implements support for fopen().\n     *\n     * @param    string    $path            resource name including scheme, e.g.\n     * @param    string    $mode            only \"r\" is supported\n     * @param    int        $options        mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH\n     * @param    string  &$openedPath    absolute path of the opened stream (out parameter)\n     * @return    bool    true on success\n     */\n    public function stream_open($path, $mode, $options, &$opened_path)\n    {\n        // Check for mode\n        if ($mode{0} != 'r') {\n            throw new PHPExcel_Reader_Exception('Mode ' . $mode . ' is not supported. Only read mode is supported.');\n        }\n\n        $pos = strrpos($path, '#');\n        $url['host'] = substr($path, 6, $pos - 6); // 6: strlen('zip://')\n        $url['fragment'] = substr($path, $pos + 1);\n\n        // Open archive\n        $this->archive = new ZipArchive();\n        $this->archive->open($url['host']);\n\n        $this->fileNameInArchive = $url['fragment'];\n        $this->position = 0;\n        $this->data = $this->archive->getFromName($this->fileNameInArchive);\n\n        return true;\n    }\n\n    /**\n     * Implements support for fstat().\n     *\n     * @return  boolean\n     */\n    public function statName()\n    {\n        return $this->fileNameInArchive;\n    }\n\n    /**\n     * Implements support for fstat().\n     *\n     * @return  boolean\n     */\n    public function url_stat()\n    {\n        return $this->statName($this->fileNameInArchive);\n    }\n\n    /**\n     * Implements support for fstat().\n     *\n     * @return  boolean\n     */\n    public function stream_stat()\n    {\n        return $this->archive->statName($this->fileNameInArchive);\n    }\n\n    /**\n     * Implements support for fread(), fgets() etc.\n     *\n     * @param   int        $count    maximum number of bytes to read\n     * @return  string\n     */\n    public function stream_read($count)\n    {\n        $ret = substr($this->data, $this->position, $count);\n        $this->position += strlen($ret);\n        return $ret;\n    }\n\n    /**\n     * Returns the position of the file pointer, i.e. its offset into the file\n     * stream. Implements support for ftell().\n     *\n     * @return  int\n     */\n    public function stream_tell()\n    {\n        return $this->position;\n    }\n\n    /**\n     * EOF stream\n     *\n     * @return    bool\n     */\n    public function stream_eof()\n    {\n        return $this->position >= strlen($this->data);\n    }\n\n    /**\n     * Seek stream\n     *\n     * @param    int        $offset    byte offset\n     * @param    int        $whence    SEEK_SET, SEEK_CUR or SEEK_END\n     * @return    bool\n     */\n    public function stream_seek($offset, $whence)\n    {\n        switch ($whence) {\n            case SEEK_SET:\n                if ($offset < strlen($this->data) && $offset >= 0) {\n                     $this->position = $offset;\n                     return true;\n                } else {\n                     return false;\n                }\n                break;\n            case SEEK_CUR:\n                if ($offset >= 0) {\n                     $this->position += $offset;\n                     return true;\n                } else {\n                     return false;\n                }\n                break;\n            case SEEK_END:\n                if (strlen($this->data) + $offset >= 0) {\n                     $this->position = strlen($this->data) + $offset;\n                     return true;\n                } else {\n                     return false;\n                }\n                break;\n            default:\n                return false;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php",
    "content": "<?php\n\n/**\n * PHPExcel_Best_Fit\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Best_Fit\n{\n    /**\n     * Indicator flag for a calculation error\n     *\n     * @var    boolean\n     **/\n    protected $error = false;\n\n    /**\n     * Algorithm type to use for best-fit\n     *\n     * @var    string\n     **/\n    protected $bestFitType = 'undetermined';\n\n    /**\n     * Number of entries in the sets of x- and y-value arrays\n     *\n     * @var    int\n     **/\n    protected $valueCount = 0;\n\n    /**\n     * X-value dataseries of values\n     *\n     * @var    float[]\n     **/\n    protected $xValues = array();\n\n    /**\n     * Y-value dataseries of values\n     *\n     * @var    float[]\n     **/\n    protected $yValues = array();\n\n    /**\n     * Flag indicating whether values should be adjusted to Y=0\n     *\n     * @var    boolean\n     **/\n    protected $adjustToZero = false;\n\n    /**\n     * Y-value series of best-fit values\n     *\n     * @var    float[]\n     **/\n    protected $yBestFitValues = array();\n\n    protected $goodnessOfFit = 1;\n\n    protected $stdevOfResiduals = 0;\n\n    protected $covariance = 0;\n\n    protected $correlation = 0;\n\n    protected $SSRegression = 0;\n\n    protected $SSResiduals = 0;\n\n    protected $DFResiduals = 0;\n\n    protected $f = 0;\n\n    protected $slope = 0;\n\n    protected $slopeSE = 0;\n\n    protected $intersect = 0;\n\n    protected $intersectSE = 0;\n\n    protected $xOffset = 0;\n\n    protected $yOffset = 0;\n\n\n    public function getError()\n    {\n        return $this->error;\n    }\n\n\n    public function getBestFitType()\n    {\n        return $this->bestFitType;\n    }\n\n    /**\n     * Return the Y-Value for a specified value of X\n     *\n     * @param     float        $xValue            X-Value\n     * @return     float                        Y-Value\n     */\n    public function getValueOfYForX($xValue)\n    {\n        return false;\n    }\n\n    /**\n     * Return the X-Value for a specified value of Y\n     *\n     * @param     float        $yValue            Y-Value\n     * @return     float                        X-Value\n     */\n    public function getValueOfXForY($yValue)\n    {\n        return false;\n    }\n\n    /**\n     * Return the original set of X-Values\n     *\n     * @return     float[]                X-Values\n     */\n    public function getXValues()\n    {\n        return $this->xValues;\n    }\n\n    /**\n     * Return the Equation of the best-fit line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     */\n    public function getEquation($dp = 0)\n    {\n        return false;\n    }\n\n    /**\n     * Return the Slope of the line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     */\n    public function getSlope($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->slope, $dp);\n        }\n        return $this->slope;\n    }\n\n    /**\n     * Return the standard error of the Slope\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     */\n    public function getSlopeSE($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->slopeSE, $dp);\n        }\n        return $this->slopeSE;\n    }\n\n    /**\n     * Return the Value of X where it intersects Y = 0\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     */\n    public function getIntersect($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->intersect, $dp);\n        }\n        return $this->intersect;\n    }\n\n    /**\n     * Return the standard error of the Intersect\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     */\n    public function getIntersectSE($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->intersectSE, $dp);\n        }\n        return $this->intersectSE;\n    }\n\n    /**\n     * Return the goodness of fit for this regression\n     *\n     * @param     int        $dp        Number of places of decimal precision to return\n     * @return     float\n     */\n    public function getGoodnessOfFit($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->goodnessOfFit, $dp);\n        }\n        return $this->goodnessOfFit;\n    }\n\n    public function getGoodnessOfFitPercent($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->goodnessOfFit * 100, $dp);\n        }\n        return $this->goodnessOfFit * 100;\n    }\n\n    /**\n     * Return the standard deviation of the residuals for this regression\n     *\n     * @param     int        $dp        Number of places of decimal precision to return\n     * @return     float\n     */\n    public function getStdevOfResiduals($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->stdevOfResiduals, $dp);\n        }\n        return $this->stdevOfResiduals;\n    }\n\n    public function getSSRegression($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->SSRegression, $dp);\n        }\n        return $this->SSRegression;\n    }\n\n    public function getSSResiduals($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->SSResiduals, $dp);\n        }\n        return $this->SSResiduals;\n    }\n\n    public function getDFResiduals($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->DFResiduals, $dp);\n        }\n        return $this->DFResiduals;\n    }\n\n    public function getF($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->f, $dp);\n        }\n        return $this->f;\n    }\n\n    public function getCovariance($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->covariance, $dp);\n        }\n        return $this->covariance;\n    }\n\n    public function getCorrelation($dp = 0)\n    {\n        if ($dp != 0) {\n            return round($this->correlation, $dp);\n        }\n        return $this->correlation;\n    }\n\n    public function getYBestFitValues()\n    {\n        return $this->yBestFitValues;\n    }\n\n    protected function calculateGoodnessOfFit($sumX, $sumY, $sumX2, $sumY2, $sumXY, $meanX, $meanY, $const)\n    {\n        $SSres = $SScov = $SScor = $SStot = $SSsex = 0.0;\n        foreach ($this->xValues as $xKey => $xValue) {\n            $bestFitY = $this->yBestFitValues[$xKey] = $this->getValueOfYForX($xValue);\n\n            $SSres += ($this->yValues[$xKey] - $bestFitY) * ($this->yValues[$xKey] - $bestFitY);\n            if ($const) {\n                $SStot += ($this->yValues[$xKey] - $meanY) * ($this->yValues[$xKey] - $meanY);\n            } else {\n                $SStot += $this->yValues[$xKey] * $this->yValues[$xKey];\n            }\n            $SScov += ($this->xValues[$xKey] - $meanX) * ($this->yValues[$xKey] - $meanY);\n            if ($const) {\n                $SSsex += ($this->xValues[$xKey] - $meanX) * ($this->xValues[$xKey] - $meanX);\n            } else {\n                $SSsex += $this->xValues[$xKey] * $this->xValues[$xKey];\n            }\n        }\n\n        $this->SSResiduals = $SSres;\n        $this->DFResiduals = $this->valueCount - 1 - $const;\n\n        if ($this->DFResiduals == 0.0) {\n            $this->stdevOfResiduals = 0.0;\n        } else {\n            $this->stdevOfResiduals = sqrt($SSres / $this->DFResiduals);\n        }\n        if (($SStot == 0.0) || ($SSres == $SStot)) {\n            $this->goodnessOfFit = 1;\n        } else {\n            $this->goodnessOfFit = 1 - ($SSres / $SStot);\n        }\n\n        $this->SSRegression = $this->goodnessOfFit * $SStot;\n        $this->covariance = $SScov / $this->valueCount;\n        $this->correlation = ($this->valueCount * $sumXY - $sumX * $sumY) / sqrt(($this->valueCount * $sumX2 - pow($sumX, 2)) * ($this->valueCount * $sumY2 - pow($sumY, 2)));\n        $this->slopeSE = $this->stdevOfResiduals / sqrt($SSsex);\n        $this->intersectSE = $this->stdevOfResiduals * sqrt(1 / ($this->valueCount - ($sumX * $sumX) / $sumX2));\n        if ($this->SSResiduals != 0.0) {\n            if ($this->DFResiduals == 0.0) {\n                $this->f = 0.0;\n            } else {\n                $this->f = $this->SSRegression / ($this->SSResiduals / $this->DFResiduals);\n            }\n        } else {\n            if ($this->DFResiduals == 0.0) {\n                $this->f = 0.0;\n            } else {\n                $this->f = $this->SSRegression / $this->DFResiduals;\n            }\n        }\n    }\n\n    protected function leastSquareFit($yValues, $xValues, $const)\n    {\n        // calculate sums\n        $x_sum = array_sum($xValues);\n        $y_sum = array_sum($yValues);\n        $meanX = $x_sum / $this->valueCount;\n        $meanY = $y_sum / $this->valueCount;\n        $mBase = $mDivisor = $xx_sum = $xy_sum = $yy_sum = 0.0;\n        for ($i = 0; $i < $this->valueCount; ++$i) {\n            $xy_sum += $xValues[$i] * $yValues[$i];\n            $xx_sum += $xValues[$i] * $xValues[$i];\n            $yy_sum += $yValues[$i] * $yValues[$i];\n\n            if ($const) {\n                $mBase += ($xValues[$i] - $meanX) * ($yValues[$i] - $meanY);\n                $mDivisor += ($xValues[$i] - $meanX) * ($xValues[$i] - $meanX);\n            } else {\n                $mBase += $xValues[$i] * $yValues[$i];\n                $mDivisor += $xValues[$i] * $xValues[$i];\n            }\n        }\n\n        // calculate slope\n//        $this->slope = (($this->valueCount * $xy_sum) - ($x_sum * $y_sum)) / (($this->valueCount * $xx_sum) - ($x_sum * $x_sum));\n        $this->slope = $mBase / $mDivisor;\n\n        // calculate intersect\n//        $this->intersect = ($y_sum - ($this->slope * $x_sum)) / $this->valueCount;\n        if ($const) {\n            $this->intersect = $meanY - ($this->slope * $meanX);\n        } else {\n            $this->intersect = 0;\n        }\n\n        $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum, $meanX, $meanY, $const);\n    }\n\n    /**\n     * Define the regression\n     *\n     * @param    float[]        $yValues    The set of Y-values for this regression\n     * @param    float[]        $xValues    The set of X-values for this regression\n     * @param    boolean        $const\n     */\n    public function __construct($yValues, $xValues = array(), $const = true)\n    {\n        //    Calculate number of points\n        $nY = count($yValues);\n        $nX = count($xValues);\n\n        //    Define X Values if necessary\n        if ($nX == 0) {\n            $xValues = range(1, $nY);\n            $nX = $nY;\n        } elseif ($nY != $nX) {\n            //    Ensure both arrays of points are the same size\n            $this->error = true;\n            return false;\n        }\n\n        $this->valueCount = $nY;\n        $this->xValues = $xValues;\n        $this->yValues = $yValues;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php",
    "content": "<?php\n\nrequire_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php');\n\n/**\n * PHPExcel_Exponential_Best_Fit\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Exponential_Best_Fit extends PHPExcel_Best_Fit\n{\n    /**\n     * Algorithm type to use for best-fit\n     * (Name of this trend class)\n     *\n     * @var    string\n     **/\n    protected $bestFitType        = 'exponential';\n\n    /**\n     * Return the Y-Value for a specified value of X\n     *\n     * @param     float        $xValue            X-Value\n     * @return     float                        Y-Value\n     **/\n    public function getValueOfYForX($xValue)\n    {\n        return $this->getIntersect() * pow($this->getSlope(), ($xValue - $this->xOffset));\n    }\n\n    /**\n     * Return the X-Value for a specified value of Y\n     *\n     * @param     float        $yValue            Y-Value\n     * @return     float                        X-Value\n     **/\n    public function getValueOfXForY($yValue)\n    {\n        return log(($yValue + $this->yOffset) / $this->getIntersect()) / log($this->getSlope());\n    }\n\n    /**\n     * Return the Equation of the best-fit line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getEquation($dp = 0)\n    {\n        $slope = $this->getSlope($dp);\n        $intersect = $this->getIntersect($dp);\n\n        return 'Y = ' . $intersect . ' * ' . $slope . '^X';\n    }\n\n    /**\n     * Return the Slope of the line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getSlope($dp = 0)\n    {\n        if ($dp != 0) {\n            return round(exp($this->_slope), $dp);\n        }\n        return exp($this->_slope);\n    }\n\n    /**\n     * Return the Value of X where it intersects Y = 0\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getIntersect($dp = 0)\n    {\n        if ($dp != 0) {\n            return round(exp($this->intersect), $dp);\n        }\n        return exp($this->intersect);\n    }\n\n    /**\n     * Execute the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param     float[]    $yValues    The set of Y-values for this regression\n     * @param     float[]    $xValues    The set of X-values for this regression\n     * @param     boolean    $const\n     */\n    private function exponentialRegression($yValues, $xValues, $const)\n    {\n        foreach ($yValues as &$value) {\n            if ($value < 0.0) {\n                $value = 0 - log(abs($value));\n            } elseif ($value > 0.0) {\n                $value = log($value);\n            }\n        }\n        unset($value);\n\n        $this->leastSquareFit($yValues, $xValues, $const);\n    }\n\n    /**\n     * Define the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param    float[]        $yValues    The set of Y-values for this regression\n     * @param    float[]        $xValues    The set of X-values for this regression\n     * @param    boolean        $const\n     */\n    public function __construct($yValues, $xValues = array(), $const = true)\n    {\n        if (parent::__construct($yValues, $xValues) !== false) {\n            $this->exponentialRegression($yValues, $xValues, $const);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php",
    "content": "<?php\n\nrequire_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php');\n\n/**\n * PHPExcel_Linear_Best_Fit\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Linear_Best_Fit extends PHPExcel_Best_Fit\n{\n    /**\n     * Algorithm type to use for best-fit\n     * (Name of this trend class)\n     *\n     * @var    string\n     **/\n    protected $bestFitType        = 'linear';\n\n    /**\n     * Return the Y-Value for a specified value of X\n     *\n     * @param     float        $xValue            X-Value\n     * @return     float                        Y-Value\n     **/\n    public function getValueOfYForX($xValue)\n    {\n        return $this->getIntersect() + $this->getSlope() * $xValue;\n    }\n\n    /**\n     * Return the X-Value for a specified value of Y\n     *\n     * @param     float        $yValue            Y-Value\n     * @return     float                        X-Value\n     **/\n    public function getValueOfXForY($yValue)\n    {\n        return ($yValue - $this->getIntersect()) / $this->getSlope();\n    }\n\n\n    /**\n     * Return the Equation of the best-fit line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getEquation($dp = 0)\n    {\n        $slope = $this->getSlope($dp);\n        $intersect = $this->getIntersect($dp);\n\n        return 'Y = ' . $intersect . ' + ' . $slope . ' * X';\n    }\n\n    /**\n     * Execute the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param     float[]    $yValues    The set of Y-values for this regression\n     * @param     float[]    $xValues    The set of X-values for this regression\n     * @param     boolean    $const\n     */\n    private function linearRegression($yValues, $xValues, $const)\n    {\n        $this->leastSquareFit($yValues, $xValues, $const);\n    }\n\n    /**\n     * Define the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param    float[]        $yValues    The set of Y-values for this regression\n     * @param    float[]        $xValues    The set of X-values for this regression\n     * @param    boolean        $const\n     */\n    public function __construct($yValues, $xValues = array(), $const = true)\n    {\n        if (parent::__construct($yValues, $xValues) !== false) {\n            $this->linearRegression($yValues, $xValues, $const);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php",
    "content": "<?php\n\nrequire_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php');\n\n/**\n * PHPExcel_Logarithmic_Best_Fit\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Logarithmic_Best_Fit extends PHPExcel_Best_Fit\n{\n    /**\n     * Algorithm type to use for best-fit\n     * (Name of this trend class)\n     *\n     * @var    string\n     **/\n    protected $bestFitType        = 'logarithmic';\n\n    /**\n     * Return the Y-Value for a specified value of X\n     *\n     * @param     float        $xValue            X-Value\n     * @return     float                        Y-Value\n     **/\n    public function getValueOfYForX($xValue)\n    {\n        return $this->getIntersect() + $this->getSlope() * log($xValue - $this->xOffset);\n    }\n\n    /**\n     * Return the X-Value for a specified value of Y\n     *\n     * @param     float        $yValue            Y-Value\n     * @return     float                        X-Value\n     **/\n    public function getValueOfXForY($yValue)\n    {\n        return exp(($yValue - $this->getIntersect()) / $this->getSlope());\n    }\n\n    /**\n     * Return the Equation of the best-fit line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getEquation($dp = 0)\n    {\n        $slope = $this->getSlope($dp);\n        $intersect = $this->getIntersect($dp);\n\n        return 'Y = '.$intersect.' + '.$slope.' * log(X)';\n    }\n\n    /**\n     * Execute the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param     float[]    $yValues    The set of Y-values for this regression\n     * @param     float[]    $xValues    The set of X-values for this regression\n     * @param     boolean    $const\n     */\n    private function logarithmicRegression($yValues, $xValues, $const)\n    {\n        foreach ($xValues as &$value) {\n            if ($value < 0.0) {\n                $value = 0 - log(abs($value));\n            } elseif ($value > 0.0) {\n                $value = log($value);\n            }\n        }\n        unset($value);\n\n        $this->leastSquareFit($yValues, $xValues, $const);\n    }\n\n    /**\n     * Define the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param    float[]        $yValues    The set of Y-values for this regression\n     * @param    float[]        $xValues    The set of X-values for this regression\n     * @param    boolean        $const\n     */\n    public function __construct($yValues, $xValues = array(), $const = true)\n    {\n        if (parent::__construct($yValues, $xValues) !== false) {\n            $this->logarithmicRegression($yValues, $xValues, $const);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php",
    "content": "<?php\n\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php';\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/JAMA/Matrix.php';\n\n/**\n * PHPExcel_Polynomial_Best_Fit\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Polynomial_Best_Fit extends PHPExcel_Best_Fit\n{\n    /**\n     * Algorithm type to use for best-fit\n     * (Name of this trend class)\n     *\n     * @var    string\n     **/\n    protected $bestFitType = 'polynomial';\n\n    /**\n     * Polynomial order\n     *\n     * @protected\n     * @var    int\n     **/\n    protected $order = 0;\n\n\n    /**\n     * Return the order of this polynomial\n     *\n     * @return     int\n     **/\n    public function getOrder()\n    {\n        return $this->order;\n    }\n\n\n    /**\n     * Return the Y-Value for a specified value of X\n     *\n     * @param     float        $xValue            X-Value\n     * @return     float                        Y-Value\n     **/\n    public function getValueOfYForX($xValue)\n    {\n        $retVal = $this->getIntersect();\n        $slope = $this->getSlope();\n        foreach ($slope as $key => $value) {\n            if ($value != 0.0) {\n                $retVal += $value * pow($xValue, $key + 1);\n            }\n        }\n        return $retVal;\n    }\n\n\n    /**\n     * Return the X-Value for a specified value of Y\n     *\n     * @param     float        $yValue            Y-Value\n     * @return     float                        X-Value\n     **/\n    public function getValueOfXForY($yValue)\n    {\n        return ($yValue - $this->getIntersect()) / $this->getSlope();\n    }\n\n\n    /**\n     * Return the Equation of the best-fit line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getEquation($dp = 0)\n    {\n        $slope = $this->getSlope($dp);\n        $intersect = $this->getIntersect($dp);\n\n        $equation = 'Y = ' . $intersect;\n        foreach ($slope as $key => $value) {\n            if ($value != 0.0) {\n                $equation .= ' + ' . $value . ' * X';\n                if ($key > 0) {\n                    $equation .= '^' . ($key + 1);\n                }\n            }\n        }\n        return $equation;\n    }\n\n\n    /**\n     * Return the Slope of the line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getSlope($dp = 0)\n    {\n        if ($dp != 0) {\n            $coefficients = array();\n            foreach ($this->_slope as $coefficient) {\n                $coefficients[] = round($coefficient, $dp);\n            }\n            return $coefficients;\n        }\n        return $this->_slope;\n    }\n\n\n    public function getCoefficients($dp = 0)\n    {\n        return array_merge(array($this->getIntersect($dp)), $this->getSlope($dp));\n    }\n\n\n    /**\n     * Execute the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param    int            $order        Order of Polynomial for this regression\n     * @param    float[]        $yValues    The set of Y-values for this regression\n     * @param    float[]        $xValues    The set of X-values for this regression\n     * @param    boolean        $const\n     */\n    private function polynomialRegression($order, $yValues, $xValues, $const)\n    {\n        // calculate sums\n        $x_sum = array_sum($xValues);\n        $y_sum = array_sum($yValues);\n        $xx_sum = $xy_sum = 0;\n        for ($i = 0; $i < $this->valueCount; ++$i) {\n            $xy_sum += $xValues[$i] * $yValues[$i];\n            $xx_sum += $xValues[$i] * $xValues[$i];\n            $yy_sum += $yValues[$i] * $yValues[$i];\n        }\n        /*\n         *    This routine uses logic from the PHP port of polyfit version 0.1\n         *    written by Michael Bommarito and Paul Meagher\n         *\n         *    The function fits a polynomial function of order $order through\n         *    a series of x-y data points using least squares.\n         *\n         */\n        for ($i = 0; $i < $this->valueCount; ++$i) {\n            for ($j = 0; $j <= $order; ++$j) {\n                $A[$i][$j] = pow($xValues[$i], $j);\n            }\n        }\n        for ($i=0; $i < $this->valueCount; ++$i) {\n            $B[$i] = array($yValues[$i]);\n        }\n        $matrixA = new Matrix($A);\n        $matrixB = new Matrix($B);\n        $C = $matrixA->solve($matrixB);\n\n        $coefficients = array();\n        for ($i = 0; $i < $C->m; ++$i) {\n            $r = $C->get($i, 0);\n            if (abs($r) <= pow(10, -9)) {\n                $r = 0;\n            }\n            $coefficients[] = $r;\n        }\n\n        $this->intersect = array_shift($coefficients);\n        $this->_slope = $coefficients;\n\n        $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum);\n        foreach ($this->xValues as $xKey => $xValue) {\n            $this->yBestFitValues[$xKey] = $this->getValueOfYForX($xValue);\n        }\n    }\n\n\n    /**\n     * Define the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param    int            $order        Order of Polynomial for this regression\n     * @param    float[]        $yValues    The set of Y-values for this regression\n     * @param    float[]        $xValues    The set of X-values for this regression\n     * @param    boolean        $const\n     */\n    public function __construct($order, $yValues, $xValues = array(), $const = true)\n    {\n        if (parent::__construct($yValues, $xValues) !== false) {\n            if ($order < $this->valueCount) {\n                $this->bestFitType .= '_'.$order;\n                $this->order = $order;\n                $this->polynomialRegression($order, $yValues, $xValues, $const);\n                if (($this->getGoodnessOfFit() < 0.0) || ($this->getGoodnessOfFit() > 1.0)) {\n                    $this->_error = true;\n                }\n            } else {\n                $this->_error = true;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php",
    "content": "<?php\n\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php';\n\n/**\n * PHPExcel_Power_Best_Fit\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Power_Best_Fit extends PHPExcel_Best_Fit\n{\n    /**\n     * Algorithm type to use for best-fit\n     * (Name of this trend class)\n     *\n     * @var    string\n     **/\n    protected $bestFitType        = 'power';\n\n\n    /**\n     * Return the Y-Value for a specified value of X\n     *\n     * @param     float        $xValue            X-Value\n     * @return     float                        Y-Value\n     **/\n    public function getValueOfYForX($xValue)\n    {\n        return $this->getIntersect() * pow(($xValue - $this->xOffset), $this->getSlope());\n    }\n\n\n    /**\n     * Return the X-Value for a specified value of Y\n     *\n     * @param     float        $yValue            Y-Value\n     * @return     float                        X-Value\n     **/\n    public function getValueOfXForY($yValue)\n    {\n        return pow((($yValue + $this->yOffset) / $this->getIntersect()), (1 / $this->getSlope()));\n    }\n\n\n    /**\n     * Return the Equation of the best-fit line\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getEquation($dp = 0)\n    {\n        $slope = $this->getSlope($dp);\n        $intersect = $this->getIntersect($dp);\n\n        return 'Y = ' . $intersect . ' * X^' . $slope;\n    }\n\n\n    /**\n     * Return the Value of X where it intersects Y = 0\n     *\n     * @param     int        $dp        Number of places of decimal precision to display\n     * @return     string\n     **/\n    public function getIntersect($dp = 0)\n    {\n        if ($dp != 0) {\n            return round(exp($this->intersect), $dp);\n        }\n        return exp($this->intersect);\n    }\n\n\n    /**\n     * Execute the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param     float[]    $yValues    The set of Y-values for this regression\n     * @param     float[]    $xValues    The set of X-values for this regression\n     * @param     boolean    $const\n     */\n    private function powerRegression($yValues, $xValues, $const)\n    {\n        foreach ($xValues as &$value) {\n            if ($value < 0.0) {\n                $value = 0 - log(abs($value));\n            } elseif ($value > 0.0) {\n                $value = log($value);\n            }\n        }\n        unset($value);\n        foreach ($yValues as &$value) {\n            if ($value < 0.0) {\n                $value = 0 - log(abs($value));\n            } elseif ($value > 0.0) {\n                $value = log($value);\n            }\n        }\n        unset($value);\n\n        $this->leastSquareFit($yValues, $xValues, $const);\n    }\n\n\n    /**\n     * Define the regression and calculate the goodness of fit for a set of X and Y data values\n     *\n     * @param     float[]    $yValues    The set of Y-values for this regression\n     * @param     float[]    $xValues    The set of X-values for this regression\n     * @param     boolean    $const\n     */\n    public function __construct($yValues, $xValues = array(), $const = true)\n    {\n        if (parent::__construct($yValues, $xValues) !== false) {\n            $this->powerRegression($yValues, $xValues, $const);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Shared/trend/trendClass.php",
    "content": "<?php\n\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php';\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php';\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php';\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php';\nrequire_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/polynomialBestFitClass.php';\n\n/**\n * PHPExcel_trendClass\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Shared_Trend\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass trendClass\n{\n    const TREND_LINEAR            = 'Linear';\n    const TREND_LOGARITHMIC       = 'Logarithmic';\n    const TREND_EXPONENTIAL       = 'Exponential';\n    const TREND_POWER             = 'Power';\n    const TREND_POLYNOMIAL_2      = 'Polynomial_2';\n    const TREND_POLYNOMIAL_3      = 'Polynomial_3';\n    const TREND_POLYNOMIAL_4      = 'Polynomial_4';\n    const TREND_POLYNOMIAL_5      = 'Polynomial_5';\n    const TREND_POLYNOMIAL_6      = 'Polynomial_6';\n    const TREND_BEST_FIT          = 'Bestfit';\n    const TREND_BEST_FIT_NO_POLY  = 'Bestfit_no_Polynomials';\n\n    /**\n     * Names of the best-fit trend analysis methods\n     *\n     * @var string[]\n     **/\n    private static $trendTypes = array(\n        self::TREND_LINEAR,\n        self::TREND_LOGARITHMIC,\n        self::TREND_EXPONENTIAL,\n        self::TREND_POWER\n    );\n\n    /**\n     * Names of the best-fit trend polynomial orders\n     *\n     * @var string[]\n     **/\n    private static $trendTypePolynomialOrders = array(\n        self::TREND_POLYNOMIAL_2,\n        self::TREND_POLYNOMIAL_3,\n        self::TREND_POLYNOMIAL_4,\n        self::TREND_POLYNOMIAL_5,\n        self::TREND_POLYNOMIAL_6\n    );\n\n    /**\n     * Cached results for each method when trying to identify which provides the best fit\n     *\n     * @var PHPExcel_Best_Fit[]\n     **/\n    private static $trendCache = array();\n\n\n    public static function calculate($trendType = self::TREND_BEST_FIT, $yValues, $xValues = array(), $const = true)\n    {\n        //    Calculate number of points in each dataset\n        $nY = count($yValues);\n        $nX = count($xValues);\n\n        //    Define X Values if necessary\n        if ($nX == 0) {\n            $xValues = range(1, $nY);\n            $nX = $nY;\n        } elseif ($nY != $nX) {\n            //    Ensure both arrays of points are the same size\n            trigger_error(\"trend(): Number of elements in coordinate arrays do not match.\", E_USER_ERROR);\n        }\n\n        $key = md5($trendType.$const.serialize($yValues).serialize($xValues));\n        //    Determine which trend method has been requested\n        switch ($trendType) {\n            //    Instantiate and return the class for the requested trend method\n            case self::TREND_LINEAR:\n            case self::TREND_LOGARITHMIC:\n            case self::TREND_EXPONENTIAL:\n            case self::TREND_POWER:\n                if (!isset(self::$trendCache[$key])) {\n                    $className = 'PHPExcel_'.$trendType.'_Best_Fit';\n                    self::$trendCache[$key] = new $className($yValues, $xValues, $const);\n                }\n                return self::$trendCache[$key];\n            case self::TREND_POLYNOMIAL_2:\n            case self::TREND_POLYNOMIAL_3:\n            case self::TREND_POLYNOMIAL_4:\n            case self::TREND_POLYNOMIAL_5:\n            case self::TREND_POLYNOMIAL_6:\n                if (!isset(self::$trendCache[$key])) {\n                    $order = substr($trendType, -1);\n                    self::$trendCache[$key] = new PHPExcel_Polynomial_Best_Fit($order, $yValues, $xValues, $const);\n                }\n                return self::$trendCache[$key];\n            case self::TREND_BEST_FIT:\n            case self::TREND_BEST_FIT_NO_POLY:\n                //    If the request is to determine the best fit regression, then we test each trend line in turn\n                //    Start by generating an instance of each available trend method\n                foreach (self::$trendTypes as $trendMethod) {\n                    $className = 'PHPExcel_'.$trendMethod.'BestFit';\n                    $bestFit[$trendMethod] = new $className($yValues, $xValues, $const);\n                    $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();\n                }\n                if ($trendType != self::TREND_BEST_FIT_NO_POLY) {\n                    foreach (self::$trendTypePolynomialOrders as $trendMethod) {\n                        $order = substr($trendMethod, -1);\n                        $bestFit[$trendMethod] = new PHPExcel_Polynomial_Best_Fit($order, $yValues, $xValues, $const);\n                        if ($bestFit[$trendMethod]->getError()) {\n                            unset($bestFit[$trendMethod]);\n                        } else {\n                            $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();\n                        }\n                    }\n                }\n                //    Determine which of our trend lines is the best fit, and then we return the instance of that trend class\n                arsort($bestFitValue);\n                $bestFitType = key($bestFitValue);\n                return $bestFit[$bestFitType];\n            default:\n                return false;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Alignment.php",
    "content": "<?php\n/**\n * PHPExcel_Style_Alignment\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Alignment extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Horizontal alignment styles */\n    const HORIZONTAL_GENERAL           = 'general';\n    const HORIZONTAL_LEFT              = 'left';\n    const HORIZONTAL_RIGHT             = 'right';\n    const HORIZONTAL_CENTER            = 'center';\n    const HORIZONTAL_CENTER_CONTINUOUS = 'centerContinuous';\n    const HORIZONTAL_JUSTIFY           = 'justify';\n    const HORIZONTAL_FILL              = 'fill';\n    const HORIZONTAL_DISTRIBUTED       = 'distributed';        // Excel2007 only\n\n    /* Vertical alignment styles */\n    const VERTICAL_BOTTOM      = 'bottom';\n    const VERTICAL_TOP         = 'top';\n    const VERTICAL_CENTER      = 'center';\n    const VERTICAL_JUSTIFY     = 'justify';\n    const VERTICAL_DISTRIBUTED = 'distributed';        // Excel2007 only\n\n    /* Read order */\n    const READORDER_CONTEXT = 0;\n    const READORDER_LTR     = 1;\n    const READORDER_RTL     = 2;\n\n    /**\n     * Horizontal alignment\n     *\n     * @var string\n     */\n    protected $horizontal = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL;\n\n    /**\n     * Vertical alignment\n     *\n     * @var string\n     */\n    protected $vertical = PHPExcel_Style_Alignment::VERTICAL_BOTTOM;\n\n    /**\n     * Text rotation\n     *\n     * @var integer\n     */\n    protected $textRotation = 0;\n\n    /**\n     * Wrap text\n     *\n     * @var boolean\n     */\n    protected $wrapText = false;\n\n    /**\n     * Shrink to fit\n     *\n     * @var boolean\n     */\n    protected $shrinkToFit = false;\n\n    /**\n     * Indent - only possible with horizontal alignment left and right\n     *\n     * @var integer\n     */\n    protected $indent = 0;\n\n    /**\n     * Read order\n     *\n     * @var integer\n     */\n    protected $readorder = 0;\n\n    /**\n     * Create a new PHPExcel_Style_Alignment\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                       Leave this value at default unless you understand exactly what\n     *                                          its ramifications are\n     * @param    boolean    $isConditional   Flag indicating if this is a conditional style or not\n     *                                       Leave this value at default unless you understand exactly what\n     *                                          its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        if ($isConditional) {\n            $this->horizontal   = null;\n            $this->vertical     = null;\n            $this->textRotation = null;\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Alignment\n     */\n    public function getSharedComponent()\n    {\n        return $this->parent->getSharedComponent()->getAlignment();\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('alignment' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray(\n     *        array(\n     *            'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,\n     *            'vertical'   => PHPExcel_Style_Alignment::VERTICAL_CENTER,\n     *            'rotation'   => 0,\n     *            'wrap'            => TRUE\n     *        )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Alignment\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())\n                    ->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (isset($pStyles['horizontal'])) {\n                    $this->setHorizontal($pStyles['horizontal']);\n                }\n                if (isset($pStyles['vertical'])) {\n                    $this->setVertical($pStyles['vertical']);\n                }\n                if (isset($pStyles['rotation'])) {\n                    $this->setTextRotation($pStyles['rotation']);\n                }\n                if (isset($pStyles['wrap'])) {\n                    $this->setWrapText($pStyles['wrap']);\n                }\n                if (isset($pStyles['shrinkToFit'])) {\n                    $this->setShrinkToFit($pStyles['shrinkToFit']);\n                }\n                if (isset($pStyles['indent'])) {\n                    $this->setIndent($pStyles['indent']);\n                }\n                if (isset($pStyles['readorder'])) {\n                    $this->setReadorder($pStyles['readorder']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Horizontal\n     *\n     * @return string\n     */\n    public function getHorizontal()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHorizontal();\n        }\n        return $this->horizontal;\n    }\n\n    /**\n     * Set Horizontal\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setHorizontal($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL)\n    {\n        if ($pValue == '') {\n            $pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL;\n        }\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('horizontal' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->horizontal = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Vertical\n     *\n     * @return string\n     */\n    public function getVertical()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getVertical();\n        }\n        return $this->vertical;\n    }\n\n    /**\n     * Set Vertical\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setVertical($pValue = PHPExcel_Style_Alignment::VERTICAL_BOTTOM)\n    {\n        if ($pValue == '') {\n            $pValue = PHPExcel_Style_Alignment::VERTICAL_BOTTOM;\n        }\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('vertical' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->vertical = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get TextRotation\n     *\n     * @return int\n     */\n    public function getTextRotation()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getTextRotation();\n        }\n        return $this->textRotation;\n    }\n\n    /**\n     * Set TextRotation\n     *\n     * @param int $pValue\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setTextRotation($pValue = 0)\n    {\n        // Excel2007 value 255 => PHPExcel value -165\n        if ($pValue == 255) {\n            $pValue = -165;\n        }\n\n        // Set rotation\n        if (($pValue >= -90 && $pValue <= 90) || $pValue == -165) {\n            if ($this->isSupervisor) {\n                $styleArray = $this->getStyleArray(array('rotation' => $pValue));\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n            } else {\n                $this->textRotation = $pValue;\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Text rotation should be a value between -90 and 90.\");\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get Wrap Text\n     *\n     * @return boolean\n     */\n    public function getWrapText()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getWrapText();\n        }\n        return $this->wrapText;\n    }\n\n    /**\n     * Set Wrap Text\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setWrapText($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('wrap' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->wrapText = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Shrink to fit\n     *\n     * @return boolean\n     */\n    public function getShrinkToFit()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getShrinkToFit();\n        }\n        return $this->shrinkToFit;\n    }\n\n    /**\n     * Set Shrink to fit\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setShrinkToFit($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('shrinkToFit' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->shrinkToFit = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get indent\n     *\n     * @return int\n     */\n    public function getIndent()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getIndent();\n        }\n        return $this->indent;\n    }\n\n    /**\n     * Set indent\n     *\n     * @param int $pValue\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setIndent($pValue = 0)\n    {\n        if ($pValue > 0) {\n            if ($this->getHorizontal() != self::HORIZONTAL_GENERAL &&\n                $this->getHorizontal() != self::HORIZONTAL_LEFT &&\n                $this->getHorizontal() != self::HORIZONTAL_RIGHT) {\n                $pValue = 0; // indent not supported\n            }\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('indent' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->indent = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get read order\n     *\n     * @return integer\n     */\n    public function getReadorder()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getReadorder();\n        }\n        return $this->readorder;\n    }\n\n    /**\n     * Set read order\n     *\n     * @param int $pValue\n     * @return PHPExcel_Style_Alignment\n     */\n    public function setReadorder($pValue = 0)\n    {\n        if ($pValue < 0 || $pValue > 2) {\n            $pValue = 0;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('readorder' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->readorder = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->horizontal .\n            $this->vertical .\n            $this->textRotation .\n            ($this->wrapText ? 't' : 'f') .\n            ($this->shrinkToFit ? 't' : 'f') .\n            $this->indent .\n            $this->readorder .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Border.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Border\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Border extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Border style */\n    const BORDER_NONE             = 'none';\n    const BORDER_DASHDOT          = 'dashDot';\n    const BORDER_DASHDOTDOT       = 'dashDotDot';\n    const BORDER_DASHED           = 'dashed';\n    const BORDER_DOTTED           = 'dotted';\n    const BORDER_DOUBLE           = 'double';\n    const BORDER_HAIR             = 'hair';\n    const BORDER_MEDIUM           = 'medium';\n    const BORDER_MEDIUMDASHDOT    = 'mediumDashDot';\n    const BORDER_MEDIUMDASHDOTDOT = 'mediumDashDotDot';\n    const BORDER_MEDIUMDASHED     = 'mediumDashed';\n    const BORDER_SLANTDASHDOT     = 'slantDashDot';\n    const BORDER_THICK            = 'thick';\n    const BORDER_THIN             = 'thin';\n\n    /**\n     * Border style\n     *\n     * @var string\n     */\n    protected $borderStyle = PHPExcel_Style_Border::BORDER_NONE;\n\n    /**\n     * Border color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    protected $color;\n\n    /**\n     * Parent property name\n     *\n     * @var string\n     */\n    protected $parentPropertyName;\n\n    /**\n     * Create a new PHPExcel_Style_Border\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        // Initialise values\n        $this->color    = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor);\n\n        // bind parent if we are a supervisor\n        if ($isSupervisor) {\n            $this->color->bindParent($this, 'color');\n        }\n    }\n\n    /**\n     * Bind parent. Only used for supervisor\n     *\n     * @param PHPExcel_Style_Borders $parent\n     * @param string $parentPropertyName\n     * @return PHPExcel_Style_Border\n     */\n    public function bindParent($parent, $parentPropertyName = null)\n    {\n        $this->parent = $parent;\n        $this->parentPropertyName = $parentPropertyName;\n        return $this;\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Border\n     * @throws PHPExcel_Exception\n     */\n    public function getSharedComponent()\n    {\n        switch ($this->parentPropertyName) {\n            case 'allBorders':\n            case 'horizontal':\n            case 'inside':\n            case 'outline':\n            case 'vertical':\n                throw new PHPExcel_Exception('Cannot get shared component for a pseudo-border.');\n                break;\n            case 'bottom':\n                return $this->parent->getSharedComponent()->getBottom();\n            case 'diagonal':\n                return $this->parent->getSharedComponent()->getDiagonal();\n            case 'left':\n                return $this->parent->getSharedComponent()->getLeft();\n            case 'right':\n                return $this->parent->getSharedComponent()->getRight();\n            case 'top':\n                return $this->parent->getSharedComponent()->getTop();\n        }\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        switch ($this->parentPropertyName) {\n            case 'allBorders':\n            case 'bottom':\n            case 'diagonal':\n            case 'horizontal':\n            case 'inside':\n            case 'left':\n            case 'outline':\n            case 'right':\n            case 'top':\n            case 'vertical':\n                $key = strtolower('vertical');\n                break;\n        }\n        return $this->parent->getStyleArray(array($key => $array));\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getTop()->applyFromArray(\n     *        array(\n     *            'style' => PHPExcel_Style_Border::BORDER_DASHDOT,\n     *            'color' => array(\n     *                'rgb' => '808080'\n     *            )\n     *        )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Border\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (isset($pStyles['style'])) {\n                    $this->setBorderStyle($pStyles['style']);\n                }\n                if (isset($pStyles['color'])) {\n                    $this->getColor()->applyFromArray($pStyles['color']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Border style\n     *\n     * @return string\n     */\n    public function getBorderStyle()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getBorderStyle();\n        }\n        return $this->borderStyle;\n    }\n\n    /**\n     * Set Border style\n     *\n     * @param string|boolean    $pValue\n     *                            When passing a boolean, FALSE equates PHPExcel_Style_Border::BORDER_NONE\n     *                                and TRUE to PHPExcel_Style_Border::BORDER_MEDIUM\n     * @return PHPExcel_Style_Border\n     */\n    public function setBorderStyle($pValue = PHPExcel_Style_Border::BORDER_NONE)\n    {\n\n        if (empty($pValue)) {\n            $pValue = PHPExcel_Style_Border::BORDER_NONE;\n        } elseif (is_bool($pValue) && $pValue) {\n            $pValue = PHPExcel_Style_Border::BORDER_MEDIUM;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('style' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->borderStyle = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Border Color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getColor()\n    {\n        return $this->color;\n    }\n\n    /**\n     * Set Border Color\n     *\n     * @param    PHPExcel_Style_Color $pValue\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Border\n     */\n    public function setColor(PHPExcel_Style_Color $pValue = null)\n    {\n        // make sure parameter is a real color and not a supervisor\n        $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue;\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB()));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->color = $color;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->borderStyle .\n            $this->color->getHashCode() .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Borders.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Borders\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Borders extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Diagonal directions */\n    const DIAGONAL_NONE = 0;\n    const DIAGONAL_UP   = 1;\n    const DIAGONAL_DOWN = 2;\n    const DIAGONAL_BOTH = 3;\n\n    /**\n     * Left\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $left;\n\n    /**\n     * Right\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $right;\n\n    /**\n     * Top\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $top;\n\n    /**\n     * Bottom\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $bottom;\n\n    /**\n     * Diagonal\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $diagonal;\n\n    /**\n     * DiagonalDirection\n     *\n     * @var int\n     */\n    protected $diagonalDirection;\n\n    /**\n     * All borders psedo-border. Only applies to supervisor.\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $allBorders;\n\n    /**\n     * Outline psedo-border. Only applies to supervisor.\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $outline;\n\n    /**\n     * Inside psedo-border. Only applies to supervisor.\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $inside;\n\n    /**\n     * Vertical pseudo-border. Only applies to supervisor.\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $vertical;\n\n    /**\n     * Horizontal pseudo-border. Only applies to supervisor.\n     *\n     * @var PHPExcel_Style_Border\n     */\n    protected $horizontal;\n\n    /**\n     * Create a new PHPExcel_Style_Borders\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        // Initialise values\n        $this->left = new PHPExcel_Style_Border($isSupervisor, $isConditional);\n        $this->right = new PHPExcel_Style_Border($isSupervisor, $isConditional);\n        $this->top = new PHPExcel_Style_Border($isSupervisor, $isConditional);\n        $this->bottom = new PHPExcel_Style_Border($isSupervisor, $isConditional);\n        $this->diagonal = new PHPExcel_Style_Border($isSupervisor, $isConditional);\n        $this->diagonalDirection = PHPExcel_Style_Borders::DIAGONAL_NONE;\n\n        // Specially for supervisor\n        if ($isSupervisor) {\n            // Initialize pseudo-borders\n            $this->allBorders = new PHPExcel_Style_Border(true);\n            $this->outline = new PHPExcel_Style_Border(true);\n            $this->inside = new PHPExcel_Style_Border(true);\n            $this->vertical = new PHPExcel_Style_Border(true);\n            $this->horizontal = new PHPExcel_Style_Border(true);\n\n            // bind parent if we are a supervisor\n            $this->left->bindParent($this, 'left');\n            $this->right->bindParent($this, 'right');\n            $this->top->bindParent($this, 'top');\n            $this->bottom->bindParent($this, 'bottom');\n            $this->diagonal->bindParent($this, 'diagonal');\n            $this->allBorders->bindParent($this, 'allBorders');\n            $this->outline->bindParent($this, 'outline');\n            $this->inside->bindParent($this, 'inside');\n            $this->vertical->bindParent($this, 'vertical');\n            $this->horizontal->bindParent($this, 'horizontal');\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Borders\n     */\n    public function getSharedComponent()\n    {\n        return $this->parent->getSharedComponent()->getBorders();\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('borders' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray(\n     *         array(\n     *             'bottom'     => array(\n     *                 'style' => PHPExcel_Style_Border::BORDER_DASHDOT,\n     *                 'color' => array(\n     *                     'rgb' => '808080'\n     *                 )\n     *             ),\n     *             'top'     => array(\n     *                 'style' => PHPExcel_Style_Border::BORDER_DASHDOT,\n     *                 'color' => array(\n     *                     'rgb' => '808080'\n     *                 )\n     *             )\n     *         )\n     * );\n     * </code>\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray(\n     *         array(\n     *             'allborders' => array(\n     *                 'style' => PHPExcel_Style_Border::BORDER_DASHDOT,\n     *                 'color' => array(\n     *                     'rgb' => '808080'\n     *                 )\n     *             )\n     *         )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Borders\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (array_key_exists('left', $pStyles)) {\n                    $this->getLeft()->applyFromArray($pStyles['left']);\n                }\n                if (array_key_exists('right', $pStyles)) {\n                    $this->getRight()->applyFromArray($pStyles['right']);\n                }\n                if (array_key_exists('top', $pStyles)) {\n                    $this->getTop()->applyFromArray($pStyles['top']);\n                }\n                if (array_key_exists('bottom', $pStyles)) {\n                    $this->getBottom()->applyFromArray($pStyles['bottom']);\n                }\n                if (array_key_exists('diagonal', $pStyles)) {\n                    $this->getDiagonal()->applyFromArray($pStyles['diagonal']);\n                }\n                if (array_key_exists('diagonaldirection', $pStyles)) {\n                    $this->setDiagonalDirection($pStyles['diagonaldirection']);\n                }\n                if (array_key_exists('allborders', $pStyles)) {\n                    $this->getLeft()->applyFromArray($pStyles['allborders']);\n                    $this->getRight()->applyFromArray($pStyles['allborders']);\n                    $this->getTop()->applyFromArray($pStyles['allborders']);\n                    $this->getBottom()->applyFromArray($pStyles['allborders']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Left\n     *\n     * @return PHPExcel_Style_Border\n     */\n    public function getLeft()\n    {\n        return $this->left;\n    }\n\n    /**\n     * Get Right\n     *\n     * @return PHPExcel_Style_Border\n     */\n    public function getRight()\n    {\n        return $this->right;\n    }\n\n    /**\n     * Get Top\n     *\n     * @return PHPExcel_Style_Border\n     */\n    public function getTop()\n    {\n        return $this->top;\n    }\n\n    /**\n     * Get Bottom\n     *\n     * @return PHPExcel_Style_Border\n     */\n    public function getBottom()\n    {\n        return $this->bottom;\n    }\n\n    /**\n     * Get Diagonal\n     *\n     * @return PHPExcel_Style_Border\n     */\n    public function getDiagonal()\n    {\n        return $this->diagonal;\n    }\n\n    /**\n     * Get AllBorders (pseudo-border). Only applies to supervisor.\n     *\n     * @return PHPExcel_Style_Border\n     * @throws PHPExcel_Exception\n     */\n    public function getAllBorders()\n    {\n        if (!$this->isSupervisor) {\n            throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.');\n        }\n        return $this->allBorders;\n    }\n\n    /**\n     * Get Outline (pseudo-border). Only applies to supervisor.\n     *\n     * @return boolean\n     * @throws PHPExcel_Exception\n     */\n    public function getOutline()\n    {\n        if (!$this->isSupervisor) {\n            throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.');\n        }\n        return $this->outline;\n    }\n\n    /**\n     * Get Inside (pseudo-border). Only applies to supervisor.\n     *\n     * @return boolean\n     * @throws PHPExcel_Exception\n     */\n    public function getInside()\n    {\n        if (!$this->isSupervisor) {\n            throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.');\n        }\n        return $this->inside;\n    }\n\n    /**\n     * Get Vertical (pseudo-border). Only applies to supervisor.\n     *\n     * @return PHPExcel_Style_Border\n     * @throws PHPExcel_Exception\n     */\n    public function getVertical()\n    {\n        if (!$this->isSupervisor) {\n            throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.');\n        }\n        return $this->vertical;\n    }\n\n    /**\n     * Get Horizontal (pseudo-border). Only applies to supervisor.\n     *\n     * @return PHPExcel_Style_Border\n     * @throws PHPExcel_Exception\n     */\n    public function getHorizontal()\n    {\n        if (!$this->isSupervisor) {\n            throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.');\n        }\n        return $this->horizontal;\n    }\n\n    /**\n     * Get DiagonalDirection\n     *\n     * @return int\n     */\n    public function getDiagonalDirection()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getDiagonalDirection();\n        }\n        return $this->diagonalDirection;\n    }\n\n    /**\n     * Set DiagonalDirection\n     *\n     * @param int $pValue\n     * @return PHPExcel_Style_Borders\n     */\n    public function setDiagonalDirection($pValue = PHPExcel_Style_Borders::DIAGONAL_NONE)\n    {\n        if ($pValue == '') {\n            $pValue = PHPExcel_Style_Borders::DIAGONAL_NONE;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('diagonaldirection' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->diagonalDirection = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashcode();\n        }\n        return md5(\n            $this->getLeft()->getHashCode() .\n            $this->getRight()->getHashCode() .\n            $this->getTop()->getHashCode() .\n            $this->getBottom()->getHashCode() .\n            $this->getDiagonal()->getHashCode() .\n            $this->getDiagonalDirection() .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Color.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Color\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Color extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Colors */\n    const COLOR_BLACK      = 'FF000000';\n    const COLOR_WHITE      = 'FFFFFFFF';\n    const COLOR_RED        = 'FFFF0000';\n    const COLOR_DARKRED    = 'FF800000';\n    const COLOR_BLUE       = 'FF0000FF';\n    const COLOR_DARKBLUE   = 'FF000080';\n    const COLOR_GREEN      = 'FF00FF00';\n    const COLOR_DARKGREEN  = 'FF008000';\n    const COLOR_YELLOW     = 'FFFFFF00';\n    const COLOR_DARKYELLOW = 'FF808000';\n\n    /**\n     * Indexed colors array\n     *\n     * @var array\n     */\n    protected static $indexedColors;\n\n    /**\n     * ARGB - Alpha RGB\n     *\n     * @var string\n     */\n    protected $argb = null;\n\n    /**\n     * Parent property name\n     *\n     * @var string\n     */\n    protected $parentPropertyName;\n\n\n    /**\n     * Create a new PHPExcel_Style_Color\n     *\n     * @param    string    $pARGB            ARGB value for the colour\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($pARGB = PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor = false, $isConditional = false)\n    {\n        //    Supervisor?\n        parent::__construct($isSupervisor);\n\n        //    Initialise values\n        if (!$isConditional) {\n            $this->argb = $pARGB;\n        }\n    }\n\n    /**\n     * Bind parent. Only used for supervisor\n     *\n     * @param mixed $parent\n     * @param string $parentPropertyName\n     * @return PHPExcel_Style_Color\n     */\n    public function bindParent($parent, $parentPropertyName = null)\n    {\n        $this->parent = $parent;\n        $this->parentPropertyName = $parentPropertyName;\n        return $this;\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getSharedComponent()\n    {\n        switch ($this->parentPropertyName) {\n            case 'endColor':\n                return $this->parent->getSharedComponent()->getEndColor();\n            case 'color':\n                return $this->parent->getSharedComponent()->getColor();\n            case 'startColor':\n                return $this->parent->getSharedComponent()->getStartColor();\n        }\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        switch ($this->parentPropertyName) {\n            case 'endColor':\n                $key = 'endcolor';\n                break;\n            case 'color':\n                $key = 'color';\n                break;\n            case 'startColor':\n                $key = 'startcolor';\n                break;\n\n        }\n        return $this->parent->getStyleArray(array($key => $array));\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->getColor()->applyFromArray( array('rgb' => '808080') );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Color\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (array_key_exists('rgb', $pStyles)) {\n                    $this->setRGB($pStyles['rgb']);\n                }\n                if (array_key_exists('argb', $pStyles)) {\n                    $this->setARGB($pStyles['argb']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get ARGB\n     *\n     * @return string\n     */\n    public function getARGB()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getARGB();\n        }\n        return $this->argb;\n    }\n\n    /**\n     * Set ARGB\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_Color\n     */\n    public function setARGB($pValue = PHPExcel_Style_Color::COLOR_BLACK)\n    {\n        if ($pValue == '') {\n            $pValue = PHPExcel_Style_Color::COLOR_BLACK;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('argb' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->argb = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get RGB\n     *\n     * @return string\n     */\n    public function getRGB()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getRGB();\n        }\n        return substr($this->argb, 2);\n    }\n\n    /**\n     * Set RGB\n     *\n     * @param    string    $pValue    RGB value\n     * @return PHPExcel_Style_Color\n     */\n    public function setRGB($pValue = '000000')\n    {\n        if ($pValue == '') {\n            $pValue = '000000';\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('argb' => 'FF' . $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->argb = 'FF' . $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get a specified colour component of an RGB value\n     *\n     * @private\n     * @param    string        $RGB        The colour as an RGB value (e.g. FF00CCCC or CCDDEE\n     * @param    int            $offset        Position within the RGB value to extract\n     * @param    boolean        $hex        Flag indicating whether the component should be returned as a hex or a\n     *                                    decimal value\n     * @return    string        The extracted colour component\n     */\n    private static function getColourComponent($RGB, $offset, $hex = true)\n    {\n        $colour = substr($RGB, $offset, 2);\n        if (!$hex) {\n            $colour = hexdec($colour);\n        }\n        return $colour;\n    }\n\n    /**\n     * Get the red colour component of an RGB value\n     *\n     * @param    string        $RGB        The colour as an RGB value (e.g. FF00CCCC or CCDDEE\n     * @param    boolean        $hex        Flag indicating whether the component should be returned as a hex or a\n     *                                    decimal value\n     * @return    string        The red colour component\n     */\n    public static function getRed($RGB, $hex = true)\n    {\n        return self::getColourComponent($RGB, strlen($RGB) - 6, $hex);\n    }\n\n    /**\n     * Get the green colour component of an RGB value\n     *\n     * @param    string        $RGB        The colour as an RGB value (e.g. FF00CCCC or CCDDEE\n     * @param    boolean        $hex        Flag indicating whether the component should be returned as a hex or a\n     *                                    decimal value\n     * @return    string        The green colour component\n     */\n    public static function getGreen($RGB, $hex = true)\n    {\n        return self::getColourComponent($RGB, strlen($RGB) - 4, $hex);\n    }\n\n    /**\n     * Get the blue colour component of an RGB value\n     *\n     * @param    string        $RGB        The colour as an RGB value (e.g. FF00CCCC or CCDDEE\n     * @param    boolean        $hex        Flag indicating whether the component should be returned as a hex or a\n     *                                    decimal value\n     * @return    string        The blue colour component\n     */\n    public static function getBlue($RGB, $hex = true)\n    {\n        return self::getColourComponent($RGB, strlen($RGB) - 2, $hex);\n    }\n\n    /**\n     * Adjust the brightness of a color\n     *\n     * @param    string        $hex    The colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE)\n     * @param    float        $adjustPercentage    The percentage by which to adjust the colour as a float from -1 to 1\n     * @return    string        The adjusted colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE)\n     */\n    public static function changeBrightness($hex, $adjustPercentage)\n    {\n        $rgba = (strlen($hex) == 8);\n\n        $red = self::getRed($hex, false);\n        $green = self::getGreen($hex, false);\n        $blue = self::getBlue($hex, false);\n        if ($adjustPercentage > 0) {\n            $red += (255 - $red) * $adjustPercentage;\n            $green += (255 - $green) * $adjustPercentage;\n            $blue += (255 - $blue) * $adjustPercentage;\n        } else {\n            $red += $red * $adjustPercentage;\n            $green += $green * $adjustPercentage;\n            $blue += $blue * $adjustPercentage;\n        }\n\n        if ($red < 0) {\n            $red = 0;\n        } elseif ($red > 255) {\n            $red = 255;\n        }\n        if ($green < 0) {\n            $green = 0;\n        } elseif ($green > 255) {\n            $green = 255;\n        }\n        if ($blue < 0) {\n            $blue = 0;\n        } elseif ($blue > 255) {\n            $blue = 255;\n        }\n\n        $rgb = strtoupper(\n            str_pad(dechex($red), 2, '0', 0) .\n            str_pad(dechex($green), 2, '0', 0) .\n            str_pad(dechex($blue), 2, '0', 0)\n        );\n        return (($rgba) ? 'FF' : '') . $rgb;\n    }\n\n    /**\n     * Get indexed color\n     *\n     * @param    int            $pIndex            Index entry point into the colour array\n     * @param    boolean        $background        Flag to indicate whether default background or foreground colour\n     *                                            should be returned if the indexed colour doesn't exist\n     * @return    PHPExcel_Style_Color\n     */\n    public static function indexedColor($pIndex, $background = false)\n    {\n        // Clean parameter\n        $pIndex = intval($pIndex);\n\n        // Indexed colors\n        if (is_null(self::$indexedColors)) {\n            self::$indexedColors = array(\n                    1    => 'FF000000',    //    System Colour #1 - Black\n                    2    => 'FFFFFFFF',    //    System Colour #2 - White\n                    3    => 'FFFF0000',    //    System Colour #3 - Red\n                    4    => 'FF00FF00',    //    System Colour #4 - Green\n                    5    => 'FF0000FF',    //    System Colour #5 - Blue\n                    6    => 'FFFFFF00',    //    System Colour #6 - Yellow\n                    7    => 'FFFF00FF',    //    System Colour #7- Magenta\n                    8    => 'FF00FFFF',    //    System Colour #8- Cyan\n                    9    => 'FF800000',    //    Standard Colour #9\n                    10    => 'FF008000',    //    Standard Colour #10\n                    11    => 'FF000080',    //    Standard Colour #11\n                    12    => 'FF808000',    //    Standard Colour #12\n                    13    => 'FF800080',    //    Standard Colour #13\n                    14    => 'FF008080',    //    Standard Colour #14\n                    15    => 'FFC0C0C0',    //    Standard Colour #15\n                    16    => 'FF808080',    //    Standard Colour #16\n                    17    => 'FF9999FF',    //    Chart Fill Colour #17\n                    18    => 'FF993366',    //    Chart Fill Colour #18\n                    19    => 'FFFFFFCC',    //    Chart Fill Colour #19\n                    20    => 'FFCCFFFF',    //    Chart Fill Colour #20\n                    21    => 'FF660066',    //    Chart Fill Colour #21\n                    22    => 'FFFF8080',    //    Chart Fill Colour #22\n                    23    => 'FF0066CC',    //    Chart Fill Colour #23\n                    24    => 'FFCCCCFF',    //    Chart Fill Colour #24\n                    25    => 'FF000080',    //    Chart Line Colour #25\n                    26    => 'FFFF00FF',    //    Chart Line Colour #26\n                    27    => 'FFFFFF00',    //    Chart Line Colour #27\n                    28    => 'FF00FFFF',    //    Chart Line Colour #28\n                    29    => 'FF800080',    //    Chart Line Colour #29\n                    30    => 'FF800000',    //    Chart Line Colour #30\n                    31    => 'FF008080',    //    Chart Line Colour #31\n                    32    => 'FF0000FF',    //    Chart Line Colour #32\n                    33    => 'FF00CCFF',    //    Standard Colour #33\n                    34    => 'FFCCFFFF',    //    Standard Colour #34\n                    35    => 'FFCCFFCC',    //    Standard Colour #35\n                    36    => 'FFFFFF99',    //    Standard Colour #36\n                    37    => 'FF99CCFF',    //    Standard Colour #37\n                    38    => 'FFFF99CC',    //    Standard Colour #38\n                    39    => 'FFCC99FF',    //    Standard Colour #39\n                    40    => 'FFFFCC99',    //    Standard Colour #40\n                    41    => 'FF3366FF',    //    Standard Colour #41\n                    42    => 'FF33CCCC',    //    Standard Colour #42\n                    43    => 'FF99CC00',    //    Standard Colour #43\n                    44    => 'FFFFCC00',    //    Standard Colour #44\n                    45    => 'FFFF9900',    //    Standard Colour #45\n                    46    => 'FFFF6600',    //    Standard Colour #46\n                    47    => 'FF666699',    //    Standard Colour #47\n                    48    => 'FF969696',    //    Standard Colour #48\n                    49    => 'FF003366',    //    Standard Colour #49\n                    50    => 'FF339966',    //    Standard Colour #50\n                    51    => 'FF003300',    //    Standard Colour #51\n                    52    => 'FF333300',    //    Standard Colour #52\n                    53    => 'FF993300',    //    Standard Colour #53\n                    54    => 'FF993366',    //    Standard Colour #54\n                    55    => 'FF333399',    //    Standard Colour #55\n                    56    => 'FF333333'    //    Standard Colour #56\n                );\n        }\n\n        if (array_key_exists($pIndex, self::$indexedColors)) {\n            return new PHPExcel_Style_Color(self::$indexedColors[$pIndex]);\n        }\n\n        if ($background) {\n            return new PHPExcel_Style_Color(self::COLOR_WHITE);\n        }\n        return new PHPExcel_Style_Color(self::COLOR_BLACK);\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->argb .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Conditional.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Style_Conditional\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Style_Conditional implements PHPExcel_IComparable\n{\n    /* Condition types */\n    const CONDITION_NONE         = 'none';\n    const CONDITION_CELLIS       = 'cellIs';\n    const CONDITION_CONTAINSTEXT = 'containsText';\n    const CONDITION_EXPRESSION   = 'expression';\n\n    /* Operator types */\n    const OPERATOR_NONE               = '';\n    const OPERATOR_BEGINSWITH         = 'beginsWith';\n    const OPERATOR_ENDSWITH           = 'endsWith';\n    const OPERATOR_EQUAL              = 'equal';\n    const OPERATOR_GREATERTHAN        = 'greaterThan';\n    const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual';\n    const OPERATOR_LESSTHAN           = 'lessThan';\n    const OPERATOR_LESSTHANOREQUAL    = 'lessThanOrEqual';\n    const OPERATOR_NOTEQUAL           = 'notEqual';\n    const OPERATOR_CONTAINSTEXT       = 'containsText';\n    const OPERATOR_NOTCONTAINS        = 'notContains';\n    const OPERATOR_BETWEEN            = 'between';\n\n    /**\n     * Condition type\n     *\n     * @var int\n     */\n    private $conditionType;\n\n    /**\n     * Operator type\n     *\n     * @var int\n     */\n    private $operatorType;\n\n    /**\n     * Text\n     *\n     * @var string\n     */\n    private $text;\n\n    /**\n     * Condition\n     *\n     * @var string[]\n     */\n    private $condition = array();\n\n    /**\n     * Style\n     *\n     * @var PHPExcel_Style\n     */\n    private $style;\n\n    /**\n     * Create a new PHPExcel_Style_Conditional\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->conditionType = PHPExcel_Style_Conditional::CONDITION_NONE;\n        $this->operatorType  = PHPExcel_Style_Conditional::OPERATOR_NONE;\n        $this->text          = null;\n        $this->condition     = array();\n        $this->style         = new PHPExcel_Style(false, true);\n    }\n\n    /**\n     * Get Condition type\n     *\n     * @return string\n     */\n    public function getConditionType()\n    {\n        return $this->conditionType;\n    }\n\n    /**\n     * Set Condition type\n     *\n     * @param string $pValue    PHPExcel_Style_Conditional condition type\n     * @return PHPExcel_Style_Conditional\n     */\n    public function setConditionType($pValue = PHPExcel_Style_Conditional::CONDITION_NONE)\n    {\n        $this->conditionType = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Operator type\n     *\n     * @return string\n     */\n    public function getOperatorType()\n    {\n        return $this->operatorType;\n    }\n\n    /**\n     * Set Operator type\n     *\n     * @param string $pValue    PHPExcel_Style_Conditional operator type\n     * @return PHPExcel_Style_Conditional\n     */\n    public function setOperatorType($pValue = PHPExcel_Style_Conditional::OPERATOR_NONE)\n    {\n        $this->operatorType = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get text\n     *\n     * @return string\n     */\n    public function getText()\n    {\n        return $this->text;\n    }\n\n    /**\n     * Set text\n     *\n     * @param string $value\n     * @return PHPExcel_Style_Conditional\n     */\n    public function setText($value = null)\n    {\n        $this->text = $value;\n        return $this;\n    }\n\n    /**\n     * Get Condition\n     *\n     * @deprecated Deprecated, use getConditions instead\n     * @return string\n     */\n    public function getCondition()\n    {\n        if (isset($this->condition[0])) {\n            return $this->condition[0];\n        }\n\n        return '';\n    }\n\n    /**\n     * Set Condition\n     *\n     * @deprecated Deprecated, use setConditions instead\n     * @param string $pValue    Condition\n     * @return PHPExcel_Style_Conditional\n     */\n    public function setCondition($pValue = '')\n    {\n        if (!is_array($pValue)) {\n            $pValue = array($pValue);\n        }\n\n        return $this->setConditions($pValue);\n    }\n\n    /**\n     * Get Conditions\n     *\n     * @return string[]\n     */\n    public function getConditions()\n    {\n        return $this->condition;\n    }\n\n    /**\n     * Set Conditions\n     *\n     * @param string[] $pValue    Condition\n     * @return PHPExcel_Style_Conditional\n     */\n    public function setConditions($pValue)\n    {\n        if (!is_array($pValue)) {\n            $pValue = array($pValue);\n        }\n        $this->condition = $pValue;\n        return $this;\n    }\n\n    /**\n     * Add Condition\n     *\n     * @param string $pValue    Condition\n     * @return PHPExcel_Style_Conditional\n     */\n    public function addCondition($pValue = '')\n    {\n        $this->condition[] = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Style\n     *\n     * @return PHPExcel_Style\n     */\n    public function getStyle()\n    {\n        return $this->style;\n    }\n\n    /**\n     * Set Style\n     *\n     * @param     PHPExcel_Style $pValue\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Style_Conditional\n     */\n    public function setStyle(PHPExcel_Style $pValue = null)\n    {\n           $this->style = $pValue;\n           return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->conditionType .\n            $this->operatorType .\n            implode(';', $this->condition) .\n            $this->style->getHashCode() .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Fill.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Fill\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Fill extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Fill types */\n    const FILL_NONE                    = 'none';\n    const FILL_SOLID                   = 'solid';\n    const FILL_GRADIENT_LINEAR         = 'linear';\n    const FILL_GRADIENT_PATH           = 'path';\n    const FILL_PATTERN_DARKDOWN        = 'darkDown';\n    const FILL_PATTERN_DARKGRAY        = 'darkGray';\n    const FILL_PATTERN_DARKGRID        = 'darkGrid';\n    const FILL_PATTERN_DARKHORIZONTAL  = 'darkHorizontal';\n    const FILL_PATTERN_DARKTRELLIS     = 'darkTrellis';\n    const FILL_PATTERN_DARKUP          = 'darkUp';\n    const FILL_PATTERN_DARKVERTICAL    = 'darkVertical';\n    const FILL_PATTERN_GRAY0625        = 'gray0625';\n    const FILL_PATTERN_GRAY125         = 'gray125';\n    const FILL_PATTERN_LIGHTDOWN       = 'lightDown';\n    const FILL_PATTERN_LIGHTGRAY       = 'lightGray';\n    const FILL_PATTERN_LIGHTGRID       = 'lightGrid';\n    const FILL_PATTERN_LIGHTHORIZONTAL = 'lightHorizontal';\n    const FILL_PATTERN_LIGHTTRELLIS    = 'lightTrellis';\n    const FILL_PATTERN_LIGHTUP         = 'lightUp';\n    const FILL_PATTERN_LIGHTVERTICAL   = 'lightVertical';\n    const FILL_PATTERN_MEDIUMGRAY      = 'mediumGray';\n\n    /**\n     * Fill type\n     *\n     * @var string\n     */\n    protected $fillType = PHPExcel_Style_Fill::FILL_NONE;\n\n    /**\n     * Rotation\n     *\n     * @var double\n     */\n    protected $rotation = 0;\n\n    /**\n     * Start color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    protected $startColor;\n\n    /**\n     * End color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    protected $endColor;\n\n    /**\n     * Create a new PHPExcel_Style_Fill\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        // Initialise values\n        if ($isConditional) {\n            $this->fillType = null;\n        }\n        $this->startColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_WHITE, $isSupervisor, $isConditional);\n        $this->endColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional);\n\n        // bind parent if we are a supervisor\n        if ($isSupervisor) {\n            $this->startColor->bindParent($this, 'startColor');\n            $this->endColor->bindParent($this, 'endColor');\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Fill\n     */\n    public function getSharedComponent()\n    {\n        return $this->parent->getSharedComponent()->getFill();\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('fill' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFill()->applyFromArray(\n     *        array(\n     *            'type'       => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR,\n     *            'rotation'   => 0,\n     *            'startcolor' => array(\n     *                'rgb' => '000000'\n     *            ),\n     *            'endcolor'   => array(\n     *                'argb' => 'FFFFFFFF'\n     *            )\n     *        )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Fill\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (array_key_exists('type', $pStyles)) {\n                    $this->setFillType($pStyles['type']);\n                }\n                if (array_key_exists('rotation', $pStyles)) {\n                    $this->setRotation($pStyles['rotation']);\n                }\n                if (array_key_exists('startcolor', $pStyles)) {\n                    $this->getStartColor()->applyFromArray($pStyles['startcolor']);\n                }\n                if (array_key_exists('endcolor', $pStyles)) {\n                    $this->getEndColor()->applyFromArray($pStyles['endcolor']);\n                }\n                if (array_key_exists('color', $pStyles)) {\n                    $this->getStartColor()->applyFromArray($pStyles['color']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Fill Type\n     *\n     * @return string\n     */\n    public function getFillType()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getFillType();\n        }\n        return $this->fillType;\n    }\n\n    /**\n     * Set Fill Type\n     *\n     * @param string $pValue    PHPExcel_Style_Fill fill type\n     * @return PHPExcel_Style_Fill\n     */\n    public function setFillType($pValue = PHPExcel_Style_Fill::FILL_NONE)\n    {\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('type' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->fillType = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Rotation\n     *\n     * @return double\n     */\n    public function getRotation()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getRotation();\n        }\n        return $this->rotation;\n    }\n\n    /**\n     * Set Rotation\n     *\n     * @param double $pValue\n     * @return PHPExcel_Style_Fill\n     */\n    public function setRotation($pValue = 0)\n    {\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('rotation' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->rotation = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Start Color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getStartColor()\n    {\n        return $this->startColor;\n    }\n\n    /**\n     * Set Start Color\n     *\n     * @param    PHPExcel_Style_Color $pValue\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Fill\n     */\n    public function setStartColor(PHPExcel_Style_Color $pValue = null)\n    {\n        // make sure parameter is a real color and not a supervisor\n        $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue;\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStartColor()->getStyleArray(array('argb' => $color->getARGB()));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->startColor = $color;\n        }\n        return $this;\n    }\n\n    /**\n     * Get End Color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getEndColor()\n    {\n        return $this->endColor;\n    }\n\n    /**\n     * Set End Color\n     *\n     * @param    PHPExcel_Style_Color $pValue\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Fill\n     */\n    public function setEndColor(PHPExcel_Style_Color $pValue = null)\n    {\n        // make sure parameter is a real color and not a supervisor\n        $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue;\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getEndColor()->getStyleArray(array('argb' => $color->getARGB()));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->endColor = $color;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->getFillType() .\n            $this->getRotation() .\n            $this->getStartColor()->getHashCode() .\n            $this->getEndColor()->getHashCode() .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Font.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Font\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Font extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Underline types */\n    const UNDERLINE_NONE             = 'none';\n    const UNDERLINE_DOUBLE           = 'double';\n    const UNDERLINE_DOUBLEACCOUNTING = 'doubleAccounting';\n    const UNDERLINE_SINGLE           = 'single';\n    const UNDERLINE_SINGLEACCOUNTING = 'singleAccounting';\n\n    /**\n     * Font Name\n     *\n     * @var string\n     */\n    protected $name = 'Calibri';\n\n    /**\n     * Font Size\n     *\n     * @var float\n     */\n    protected $size = 11;\n\n    /**\n     * Bold\n     *\n     * @var boolean\n     */\n    protected $bold = false;\n\n    /**\n     * Italic\n     *\n     * @var boolean\n     */\n    protected $italic = false;\n\n    /**\n     * Superscript\n     *\n     * @var boolean\n     */\n    protected $superScript = false;\n\n    /**\n     * Subscript\n     *\n     * @var boolean\n     */\n    protected $subScript = false;\n\n    /**\n     * Underline\n     *\n     * @var string\n     */\n    protected $underline = self::UNDERLINE_NONE;\n\n    /**\n     * Strikethrough\n     *\n     * @var boolean\n     */\n    protected $strikethrough = false;\n\n    /**\n     * Foreground color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    protected $color;\n\n    /**\n     * Create a new PHPExcel_Style_Font\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        // Initialise values\n        if ($isConditional) {\n            $this->name = null;\n            $this->size = null;\n            $this->bold = null;\n            $this->italic = null;\n            $this->superScript = null;\n            $this->subScript = null;\n            $this->underline = null;\n            $this->strikethrough = null;\n            $this->color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional);\n        } else {\n            $this->color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor);\n        }\n        // bind parent if we are a supervisor\n        if ($isSupervisor) {\n            $this->color->bindParent($this, 'color');\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Font\n     */\n    public function getSharedComponent()\n    {\n        return $this->parent->getSharedComponent()->getFont();\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('font' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->applyFromArray(\n     *        array(\n     *            'name'        => 'Arial',\n     *            'bold'        => TRUE,\n     *            'italic'    => FALSE,\n     *            'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE,\n     *            'strike'    => FALSE,\n     *            'color'        => array(\n     *                'rgb' => '808080'\n     *            )\n     *        )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Font\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (array_key_exists('name', $pStyles)) {\n                    $this->setName($pStyles['name']);\n                }\n                if (array_key_exists('bold', $pStyles)) {\n                    $this->setBold($pStyles['bold']);\n                }\n                if (array_key_exists('italic', $pStyles)) {\n                    $this->setItalic($pStyles['italic']);\n                }\n                if (array_key_exists('superScript', $pStyles)) {\n                    $this->setSuperScript($pStyles['superScript']);\n                }\n                if (array_key_exists('subScript', $pStyles)) {\n                    $this->setSubScript($pStyles['subScript']);\n                }\n                if (array_key_exists('underline', $pStyles)) {\n                    $this->setUnderline($pStyles['underline']);\n                }\n                if (array_key_exists('strike', $pStyles)) {\n                    $this->setStrikethrough($pStyles['strike']);\n                }\n                if (array_key_exists('color', $pStyles)) {\n                    $this->getColor()->applyFromArray($pStyles['color']);\n                }\n                if (array_key_exists('size', $pStyles)) {\n                    $this->setSize($pStyles['size']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getName();\n        }\n        return $this->name;\n    }\n\n    /**\n     * Set Name\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setName($pValue = 'Calibri')\n    {\n        if ($pValue == '') {\n            $pValue = 'Calibri';\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('name' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->name = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Size\n     *\n     * @return double\n     */\n    public function getSize()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getSize();\n        }\n        return $this->size;\n    }\n\n    /**\n     * Set Size\n     *\n     * @param double $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setSize($pValue = 10)\n    {\n        if ($pValue == '') {\n            $pValue = 10;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('size' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->size = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Bold\n     *\n     * @return boolean\n     */\n    public function getBold()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getBold();\n        }\n        return $this->bold;\n    }\n\n    /**\n     * Set Bold\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setBold($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('bold' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->bold = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Italic\n     *\n     * @return boolean\n     */\n    public function getItalic()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getItalic();\n        }\n        return $this->italic;\n    }\n\n    /**\n     * Set Italic\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setItalic($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('italic' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->italic = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get SuperScript\n     *\n     * @return boolean\n     */\n    public function getSuperScript()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getSuperScript();\n        }\n        return $this->superScript;\n    }\n\n    /**\n     * Set SuperScript\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setSuperScript($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('superScript' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->superScript = $pValue;\n            $this->subScript = !$pValue;\n        }\n        return $this;\n    }\n\n        /**\n     * Get SubScript\n     *\n     * @return boolean\n     */\n    public function getSubScript()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getSubScript();\n        }\n        return $this->subScript;\n    }\n\n    /**\n     * Set SubScript\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setSubScript($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('subScript' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->subScript = $pValue;\n            $this->superScript = !$pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Underline\n     *\n     * @return string\n     */\n    public function getUnderline()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getUnderline();\n        }\n        return $this->underline;\n    }\n\n    /**\n     * Set Underline\n     *\n     * @param string|boolean $pValue    PHPExcel_Style_Font underline type\n     *                                    If a boolean is passed, then TRUE equates to UNDERLINE_SINGLE,\n     *                                        false equates to UNDERLINE_NONE\n     * @return PHPExcel_Style_Font\n     */\n    public function setUnderline($pValue = self::UNDERLINE_NONE)\n    {\n        if (is_bool($pValue)) {\n            $pValue = ($pValue) ? self::UNDERLINE_SINGLE : self::UNDERLINE_NONE;\n        } elseif ($pValue == '') {\n            $pValue = self::UNDERLINE_NONE;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('underline' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->underline = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Strikethrough\n     *\n     * @return boolean\n     */\n    public function getStrikethrough()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getStrikethrough();\n        }\n        return $this->strikethrough;\n    }\n\n    /**\n     * Set Strikethrough\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Style_Font\n     */\n    public function setStrikethrough($pValue = false)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('strike' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->strikethrough = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getColor()\n    {\n        return $this->color;\n    }\n\n    /**\n     * Set Color\n     *\n     * @param    PHPExcel_Style_Color $pValue\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Font\n     */\n    public function setColor(PHPExcel_Style_Color $pValue = null)\n    {\n        // make sure parameter is a real color and not a supervisor\n        $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue;\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB()));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->color = $color;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->name .\n            $this->size .\n            ($this->bold ? 't' : 'f') .\n            ($this->italic ? 't' : 'f') .\n            ($this->superScript ? 't' : 'f') .\n            ($this->subScript ? 't' : 'f') .\n            $this->underline .\n            ($this->strikethrough ? 't' : 'f') .\n            $this->color->getHashCode() .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_NumberFormat\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_NumberFormat extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /* Pre-defined formats */\n    const FORMAT_GENERAL                 = 'General';\n\n    const FORMAT_TEXT                    = '@';\n\n    const FORMAT_NUMBER                  = '0';\n    const FORMAT_NUMBER_00               = '0.00';\n    const FORMAT_NUMBER_COMMA_SEPARATED1 = '#,##0.00';\n    const FORMAT_NUMBER_COMMA_SEPARATED2 = '#,##0.00_-';\n\n    const FORMAT_PERCENTAGE              = '0%';\n    const FORMAT_PERCENTAGE_00           = '0.00%';\n\n    const FORMAT_DATE_YYYYMMDD2          = 'yyyy-mm-dd';\n    const FORMAT_DATE_YYYYMMDD           = 'yy-mm-dd';\n    const FORMAT_DATE_DDMMYYYY           = 'dd/mm/yy';\n    const FORMAT_DATE_DMYSLASH           = 'd/m/y';\n    const FORMAT_DATE_DMYMINUS           = 'd-m-y';\n    const FORMAT_DATE_DMMINUS            = 'd-m';\n    const FORMAT_DATE_MYMINUS            = 'm-y';\n    const FORMAT_DATE_XLSX14             = 'mm-dd-yy';\n    const FORMAT_DATE_XLSX15             = 'd-mmm-yy';\n    const FORMAT_DATE_XLSX16             = 'd-mmm';\n    const FORMAT_DATE_XLSX17             = 'mmm-yy';\n    const FORMAT_DATE_XLSX22             = 'm/d/yy h:mm';\n    const FORMAT_DATE_DATETIME           = 'd/m/y h:mm';\n    const FORMAT_DATE_TIME1              = 'h:mm AM/PM';\n    const FORMAT_DATE_TIME2              = 'h:mm:ss AM/PM';\n    const FORMAT_DATE_TIME3              = 'h:mm';\n    const FORMAT_DATE_TIME4              = 'h:mm:ss';\n    const FORMAT_DATE_TIME5              = 'mm:ss';\n    const FORMAT_DATE_TIME6              = 'h:mm:ss';\n    const FORMAT_DATE_TIME7              = 'i:s.S';\n    const FORMAT_DATE_TIME8              = 'h:mm:ss;@';\n    const FORMAT_DATE_YYYYMMDDSLASH      = 'yy/mm/dd;@';\n\n    const FORMAT_CURRENCY_USD_SIMPLE     = '\"$\"#,##0.00_-';\n    const FORMAT_CURRENCY_USD            = '$#,##0_-';\n    const FORMAT_CURRENCY_EUR_SIMPLE     = '[$EUR ]#,##0.00_-';\n\n    /**\n     * Excel built-in number formats\n     *\n     * @var array\n     */\n    protected static $builtInFormats;\n\n    /**\n     * Excel built-in number formats (flipped, for faster lookups)\n     *\n     * @var array\n     */\n    protected static $flippedBuiltInFormats;\n\n    /**\n     * Format Code\n     *\n     * @var string\n     */\n    protected $formatCode = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;\n\n    /**\n     * Built-in format Code\n     *\n     * @var string\n     */\n    protected $builtInFormatCode    = 0;\n\n    /**\n     * Create a new PHPExcel_Style_NumberFormat\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        if ($isConditional) {\n            $this->formatCode = null;\n            $this->builtInFormatCode = false;\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_NumberFormat\n     */\n    public function getSharedComponent()\n    {\n        return $this->parent->getSharedComponent()->getNumberFormat();\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('numberformat' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getNumberFormat()->applyFromArray(\n     *        array(\n     *            'code' => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE\n     *        )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_NumberFormat\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (array_key_exists('code', $pStyles)) {\n                    $this->setFormatCode($pStyles['code']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Format Code\n     *\n     * @return string\n     */\n    public function getFormatCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getFormatCode();\n        }\n        if ($this->builtInFormatCode !== false) {\n            return self::builtInFormatCode($this->builtInFormatCode);\n        }\n        return $this->formatCode;\n    }\n\n    /**\n     * Set Format Code\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_NumberFormat\n     */\n    public function setFormatCode($pValue = PHPExcel_Style_NumberFormat::FORMAT_GENERAL)\n    {\n        if ($pValue == '') {\n            $pValue = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('code' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->formatCode = $pValue;\n            $this->builtInFormatCode = self::builtInFormatCodeIndex($pValue);\n        }\n        return $this;\n    }\n\n    /**\n     * Get Built-In Format Code\n     *\n     * @return int\n     */\n    public function getBuiltInFormatCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getBuiltInFormatCode();\n        }\n        return $this->builtInFormatCode;\n    }\n\n    /**\n     * Set Built-In Format Code\n     *\n     * @param int $pValue\n     * @return PHPExcel_Style_NumberFormat\n     */\n    public function setBuiltInFormatCode($pValue = 0)\n    {\n\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('code' => self::builtInFormatCode($pValue)));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->builtInFormatCode = $pValue;\n            $this->formatCode = self::builtInFormatCode($pValue);\n        }\n        return $this;\n    }\n\n    /**\n     * Fill built-in format codes\n     */\n    private static function fillBuiltInFormatCodes()\n    {\n        //  [MS-OI29500: Microsoft Office Implementation Information for ISO/IEC-29500 Standard Compliance]\n        //  18.8.30. numFmt (Number Format)\n        //\n        //  The ECMA standard defines built-in format IDs\n        //      14: \"mm-dd-yy\"\n        //      22: \"m/d/yy h:mm\"\n        //      37: \"#,##0 ;(#,##0)\"\n        //      38: \"#,##0 ;[Red](#,##0)\"\n        //      39: \"#,##0.00;(#,##0.00)\"\n        //      40: \"#,##0.00;[Red](#,##0.00)\"\n        //      47: \"mmss.0\"\n        //      KOR fmt 55: \"yyyy-mm-dd\"\n        //  Excel defines built-in format IDs\n        //      14: \"m/d/yyyy\"\n        //      22: \"m/d/yyyy h:mm\"\n        //      37: \"#,##0_);(#,##0)\"\n        //      38: \"#,##0_);[Red](#,##0)\"\n        //      39: \"#,##0.00_);(#,##0.00)\"\n        //      40: \"#,##0.00_);[Red](#,##0.00)\"\n        //      47: \"mm:ss.0\"\n        //      KOR fmt 55: \"yyyy/mm/dd\"\n \n        // Built-in format codes\n        if (is_null(self::$builtInFormats)) {\n            self::$builtInFormats = array();\n\n            // General\n            self::$builtInFormats[0] = PHPExcel_Style_NumberFormat::FORMAT_GENERAL;\n            self::$builtInFormats[1] = '0';\n            self::$builtInFormats[2] = '0.00';\n            self::$builtInFormats[3] = '#,##0';\n            self::$builtInFormats[4] = '#,##0.00';\n\n            self::$builtInFormats[9] = '0%';\n            self::$builtInFormats[10] = '0.00%';\n            self::$builtInFormats[11] = '0.00E+00';\n            self::$builtInFormats[12] = '# ?/?';\n            self::$builtInFormats[13] = '# ??/??';\n            self::$builtInFormats[14] = 'm/d/yyyy';                     // Despite ECMA 'mm-dd-yy';\n            self::$builtInFormats[15] = 'd-mmm-yy';\n            self::$builtInFormats[16] = 'd-mmm';\n            self::$builtInFormats[17] = 'mmm-yy';\n            self::$builtInFormats[18] = 'h:mm AM/PM';\n            self::$builtInFormats[19] = 'h:mm:ss AM/PM';\n            self::$builtInFormats[20] = 'h:mm';\n            self::$builtInFormats[21] = 'h:mm:ss';\n            self::$builtInFormats[22] = 'm/d/yyyy h:mm';                // Despite ECMA 'm/d/yy h:mm';\n\n            self::$builtInFormats[37] = '#,##0_);(#,##0)';              //  Despite ECMA '#,##0 ;(#,##0)';\n            self::$builtInFormats[38] = '#,##0_);[Red](#,##0)';         //  Despite ECMA '#,##0 ;[Red](#,##0)';\n            self::$builtInFormats[39] = '#,##0.00_);(#,##0.00)';        //  Despite ECMA '#,##0.00;(#,##0.00)';\n            self::$builtInFormats[40] = '#,##0.00_);[Red](#,##0.00)';   //  Despite ECMA '#,##0.00;[Red](#,##0.00)';\n\n            self::$builtInFormats[44] = '_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)';\n            self::$builtInFormats[45] = 'mm:ss';\n            self::$builtInFormats[46] = '[h]:mm:ss';\n            self::$builtInFormats[47] = 'mm:ss.0';                      //  Despite ECMA 'mmss.0';\n            self::$builtInFormats[48] = '##0.0E+0';\n            self::$builtInFormats[49] = '@';\n\n            // CHT\n            self::$builtInFormats[27] = '[$-404]e/m/d';\n            self::$builtInFormats[30] = 'm/d/yy';\n            self::$builtInFormats[36] = '[$-404]e/m/d';\n            self::$builtInFormats[50] = '[$-404]e/m/d';\n            self::$builtInFormats[57] = '[$-404]e/m/d';\n\n            // THA\n            self::$builtInFormats[59] = 't0';\n            self::$builtInFormats[60] = 't0.00';\n            self::$builtInFormats[61] = 't#,##0';\n            self::$builtInFormats[62] = 't#,##0.00';\n            self::$builtInFormats[67] = 't0%';\n            self::$builtInFormats[68] = 't0.00%';\n            self::$builtInFormats[69] = 't# ?/?';\n            self::$builtInFormats[70] = 't# ??/??';\n\n            // Flip array (for faster lookups)\n            self::$flippedBuiltInFormats = array_flip(self::$builtInFormats);\n        }\n    }\n\n    /**\n     * Get built-in format code\n     *\n     * @param    int        $pIndex\n     * @return    string\n     */\n    public static function builtInFormatCode($pIndex)\n    {\n        // Clean parameter\n        $pIndex = intval($pIndex);\n\n        // Ensure built-in format codes are available\n        self::fillBuiltInFormatCodes();\n        // Lookup format code\n        if (isset(self::$builtInFormats[$pIndex])) {\n            return self::$builtInFormats[$pIndex];\n        }\n\n        return '';\n    }\n\n    /**\n     * Get built-in format code index\n     *\n     * @param    string        $formatCode\n     * @return    int|boolean\n     */\n    public static function builtInFormatCodeIndex($formatCode)\n    {\n        // Ensure built-in format codes are available\n        self::fillBuiltInFormatCodes();\n\n        // Lookup format code\n        if (isset(self::$flippedBuiltInFormats[$formatCode])) {\n            return self::$flippedBuiltInFormats[$formatCode];\n        }\n\n        return false;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->formatCode .\n            $this->builtInFormatCode .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Search/replace values to convert Excel date/time format masks to PHP format masks\n     *\n     * @var array\n     */\n    private static $dateFormatReplacements = array(\n            // first remove escapes related to non-format characters\n            '\\\\'    => '',\n            //    12-hour suffix\n            'am/pm' => 'A',\n            //    4-digit year\n            'e'     => 'Y',\n            'yyyy'  => 'Y',\n            //    2-digit year\n            'yy'    => 'y',\n            //    first letter of month - no php equivalent\n            'mmmmm' => 'M',\n            //    full month name\n            'mmmm'  => 'F',\n            //    short month name\n            'mmm'   => 'M',\n            //    mm is minutes if time, but can also be month w/leading zero\n            //    so we try to identify times be the inclusion of a : separator in the mask\n            //    It isn't perfect, but the best way I know how\n            ':mm'   => ':i',\n            'mm:'   => 'i:',\n            //    month leading zero\n            'mm'    => 'm',\n            //    month no leading zero\n            'm'     => 'n',\n            //    full day of week name\n            'dddd'  => 'l',\n            //    short day of week name\n            'ddd'   => 'D',\n            //    days leading zero\n            'dd'    => 'd',\n            //    days no leading zero\n            'd'     => 'j',\n            //    seconds\n            'ss'    => 's',\n            //    fractional seconds - no php equivalent\n            '.s'    => ''\n        );\n    /**\n     * Search/replace values to convert Excel date/time format masks hours to PHP format masks (24 hr clock)\n     *\n     * @var array\n     */\n    private static $dateFormatReplacements24 = array(\n            'hh' => 'H',\n            'h'  => 'G'\n        );\n    /**\n     * Search/replace values to convert Excel date/time format masks hours to PHP format masks (12 hr clock)\n     *\n     * @var array\n     */\n    private static $dateFormatReplacements12 = array(\n            'hh' => 'h',\n            'h'  => 'g'\n        );\n\n    private static function setLowercaseCallback($matches) {\n        return mb_strtolower($matches[0]);\n    }\n\n    private static function escapeQuotesCallback($matches) {\n        return '\\\\' . implode('\\\\', str_split($matches[1]));\n    }\n\n    private static function formatAsDate(&$value, &$format)\n    {\n        // strip off first part containing e.g. [$-F800] or [$USD-409]\n        // general syntax: [$<Currency string>-<language info>]\n        // language info is in hexadecimal\n        $format = preg_replace('/^(\\[\\$[A-Z]*-[0-9A-F]*\\])/i', '', $format);\n\n        // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case;\n        //    but we don't want to change any quoted strings\n        $format = preg_replace_callback('/(?:^|\")([^\"]*)(?:$|\")/', array('self', 'setLowercaseCallback'), $format);\n\n        // Only process the non-quoted blocks for date format characters\n        $blocks = explode('\"', $format);\n        foreach($blocks as $key => &$block) {\n            if ($key % 2 == 0) {\n                $block = strtr($block, self::$dateFormatReplacements);\n                if (!strpos($block, 'A')) {\n                    // 24-hour time format\n                    $block = strtr($block, self::$dateFormatReplacements24);\n                } else {\n                    // 12-hour time format\n                    $block = strtr($block, self::$dateFormatReplacements12);\n                }\n            }\n        }\n        $format = implode('\"', $blocks);\n\n        // escape any quoted characters so that DateTime format() will render them correctly\n        $format = preg_replace_callback('/\"(.*)\"/U', array('self', 'escapeQuotesCallback'), $format);\n\n        $dateObj = PHPExcel_Shared_Date::ExcelToPHPObject($value);\n        $value = $dateObj->format($format);\n    }\n\n    private static function formatAsPercentage(&$value, &$format)\n    {\n        if ($format === self::FORMAT_PERCENTAGE) {\n            $value = round((100 * $value), 0) . '%';\n        } else {\n            if (preg_match('/\\.[#0]+/i', $format, $m)) {\n                $s = substr($m[0], 0, 1) . (strlen($m[0]) - 1);\n                $format = str_replace($m[0], $s, $format);\n            }\n            if (preg_match('/^[#0]+/', $format, $m)) {\n                $format = str_replace($m[0], strlen($m[0]), $format);\n            }\n            $format = '%' . str_replace('%', 'f%%', $format);\n\n            $value = sprintf($format, 100 * $value);\n        }\n    }\n\n    private static function formatAsFraction(&$value, &$format)\n    {\n        $sign = ($value < 0) ? '-' : '';\n\n        $integerPart = floor(abs($value));\n        $decimalPart = trim(fmod(abs($value), 1), '0.');\n        $decimalLength = strlen($decimalPart);\n        $decimalDivisor = pow(10, $decimalLength);\n\n        $GCD = PHPExcel_Calculation_MathTrig::GCD($decimalPart, $decimalDivisor);\n\n        $adjustedDecimalPart = $decimalPart/$GCD;\n        $adjustedDecimalDivisor = $decimalDivisor/$GCD;\n\n        if ((strpos($format, '0') !== false) || (strpos($format, '#') !== false) || (substr($format, 0, 3) == '? ?')) {\n            if ($integerPart == 0) {\n                $integerPart = '';\n            }\n            $value = \"$sign$integerPart $adjustedDecimalPart/$adjustedDecimalDivisor\";\n        } else {\n            $adjustedDecimalPart += $integerPart * $adjustedDecimalDivisor;\n            $value = \"$sign$adjustedDecimalPart/$adjustedDecimalDivisor\";\n        }\n    }\n\n    private static function complexNumberFormatMask($number, $mask, $level = 0)\n    {\n        $sign = ($number < 0.0);\n        $number = abs($number);\n        if (strpos($mask, '.') !== false) {\n            $numbers = explode('.', $number . '.0');\n            $masks = explode('.', $mask . '.0');\n            $result1 = self::complexNumberFormatMask($numbers[0], $masks[0], 1);\n            $result2 = strrev(self::complexNumberFormatMask(strrev($numbers[1]), strrev($masks[1]), 1));\n            return (($sign) ? '-' : '') . $result1 . '.' . $result2;\n        }\n\n        $r = preg_match_all('/0+/', $mask, $result, PREG_OFFSET_CAPTURE);\n        if ($r > 1) {\n            $result = array_reverse($result[0]);\n\n            foreach ($result as $block) {\n                $divisor = 1 . $block[0];\n                $size = strlen($block[0]);\n                $offset = $block[1];\n\n                $blockValue = sprintf(\n                    '%0' . $size . 'd',\n                    fmod($number, $divisor)\n                );\n                $number = floor($number / $divisor);\n                $mask = substr_replace($mask, $blockValue, $offset, $size);\n            }\n            if ($number > 0) {\n                $mask = substr_replace($mask, $number, $offset, 0);\n            }\n            $result = $mask;\n        } else {\n            $result = $number;\n        }\n\n        return (($sign) ? '-' : '') . $result;\n    }\n\n    /**\n     * Convert a value in a pre-defined format to a PHP string\n     *\n     * @param mixed    $value        Value to format\n     * @param string    $format        Format code\n     * @param array        $callBack    Callback function for additional formatting of string\n     * @return string    Formatted string\n     */\n    public static function toFormattedString($value = '0', $format = PHPExcel_Style_NumberFormat::FORMAT_GENERAL, $callBack = null)\n    {\n        // For now we do not treat strings although section 4 of a format code affects strings\n        if (!is_numeric($value)) {\n            return $value;\n        }\n\n        // For 'General' format code, we just pass the value although this is not entirely the way Excel does it,\n        // it seems to round numbers to a total of 10 digits.\n        if (($format === PHPExcel_Style_NumberFormat::FORMAT_GENERAL) || ($format === PHPExcel_Style_NumberFormat::FORMAT_TEXT)) {\n            return $value;\n        }\n\n        // Convert any other escaped characters to quoted strings, e.g. (\\T to \"T\")\n        $format = preg_replace('/(\\\\\\(.))(?=(?:[^\"]|\"[^\"]*\")*$)/u', '\"${2}\"', $format);\n\n        // Get the sections, there can be up to four sections, separated with a semi-colon (but only if not a quoted literal)\n        $sections = preg_split('/(;)(?=(?:[^\"]|\"[^\"]*\")*$)/u', $format);\n\n        // Extract the relevant section depending on whether number is positive, negative, or zero?\n        // Text not supported yet.\n        // Here is how the sections apply to various values in Excel:\n        //   1 section:   [POSITIVE/NEGATIVE/ZERO/TEXT]\n        //   2 sections:  [POSITIVE/ZERO/TEXT] [NEGATIVE]\n        //   3 sections:  [POSITIVE/TEXT] [NEGATIVE] [ZERO]\n        //   4 sections:  [POSITIVE] [NEGATIVE] [ZERO] [TEXT]\n        switch (count($sections)) {\n            case 1:\n                $format = $sections[0];\n                break;\n            case 2:\n                $format = ($value >= 0) ? $sections[0] : $sections[1];\n                $value = abs($value); // Use the absolute value\n                break;\n            case 3:\n                $format = ($value > 0) ?\n                    $sections[0] : ( ($value < 0) ?\n                        $sections[1] : $sections[2]);\n                $value = abs($value); // Use the absolute value\n                break;\n            case 4:\n                $format = ($value > 0) ?\n                    $sections[0] : ( ($value < 0) ?\n                        $sections[1] : $sections[2]);\n                $value = abs($value); // Use the absolute value\n                break;\n            default:\n                // something is wrong, just use first section\n                $format = $sections[0];\n                break;\n        }\n\n        // In Excel formats, \"_\" is used to add spacing,\n        //    The following character indicates the size of the spacing, which we can't do in HTML, so we just use a standard space\n        $format = preg_replace('/_./', ' ', $format);\n\n        // Save format with color information for later use below\n        $formatColor = $format;\n\n        // Strip color information\n        $color_regex = '/^\\\\[[a-zA-Z]+\\\\]/';\n        $format = preg_replace($color_regex, '', $format);\n\n        // Let's begin inspecting the format and converting the value to a formatted string\n\n        //  Check for date/time characters (not inside quotes)\n        if (preg_match('/(\\[\\$[A-Z]*-[0-9A-F]*\\])*[hmsdy](?=(?:[^\"]|\"[^\"]*\")*$)/miu', $format, $matches)) {\n            // datetime format\n            self::formatAsDate($value, $format);\n        } elseif (preg_match('/%$/', $format)) {\n            // % number format\n            self::formatAsPercentage($value, $format);\n        } else {\n            if ($format === self::FORMAT_CURRENCY_EUR_SIMPLE) {\n                $value = 'EUR ' . sprintf('%1.2f', $value);\n            } else {\n                // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols\n                $format = str_replace(array('\"', '*'), '', $format);\n\n                // Find out if we need thousands separator\n                // This is indicated by a comma enclosed by a digit placeholder:\n                //        #,#   or   0,0\n                $useThousands = preg_match('/(#,#|0,0)/', $format);\n                if ($useThousands) {\n                    $format = preg_replace('/0,0/', '00', $format);\n                    $format = preg_replace('/#,#/', '##', $format);\n                }\n\n                // Scale thousands, millions,...\n                // This is indicated by a number of commas after a digit placeholder:\n                //        #,   or    0.0,,\n                $scale = 1; // same as no scale\n                $matches = array();\n                if (preg_match('/(#|0)(,+)/', $format, $matches)) {\n                    $scale = pow(1000, strlen($matches[2]));\n\n                    // strip the commas\n                    $format = preg_replace('/0,+/', '0', $format);\n                    $format = preg_replace('/#,+/', '#', $format);\n                }\n\n                if (preg_match('/#?.*\\?\\/\\?/', $format, $m)) {\n                    //echo 'Format mask is fractional '.$format.' <br />';\n                    if ($value != (int)$value) {\n                        self::formatAsFraction($value, $format);\n                    }\n\n                } else {\n                    // Handle the number itself\n\n                    // scale number\n                    $value = $value / $scale;\n\n                    // Strip #\n                    $format = preg_replace('/\\\\#/', '0', $format);\n\n                    $n = \"/\\[[^\\]]+\\]/\";\n                    $m = preg_replace($n, '', $format);\n                    $number_regex = \"/(0+)(\\.?)(0*)/\";\n                    if (preg_match($number_regex, $m, $matches)) {\n                        $left = $matches[1];\n                        $dec = $matches[2];\n                        $right = $matches[3];\n\n                        // minimun width of formatted number (including dot)\n                        $minWidth = strlen($left) + strlen($dec) + strlen($right);\n                        if ($useThousands) {\n                            $value = number_format(\n                                $value,\n                                strlen($right),\n                                PHPExcel_Shared_String::getDecimalSeparator(),\n                                PHPExcel_Shared_String::getThousandsSeparator()\n                            );\n                            $value = preg_replace($number_regex, $value, $format);\n                        } else {\n                            if (preg_match('/[0#]E[+-]0/i', $format)) {\n                                //    Scientific format\n                                $value = sprintf('%5.2E', $value);\n                            } elseif (preg_match('/0([^\\d\\.]+)0/', $format)) {\n                                $value = self::complexNumberFormatMask($value, $format);\n                            } else {\n                                $sprintf_pattern = \"%0$minWidth.\" . strlen($right) . \"f\";\n                                $value = sprintf($sprintf_pattern, $value);\n                                $value = preg_replace($number_regex, $value, $format);\n                            }\n                        }\n                    }\n                }\n                if (preg_match('/\\[\\$(.*)\\]/u', $format, $m)) {\n                    //  Currency or Accounting\n                    $currencyFormat = $m[0];\n                    $currencyCode = $m[1];\n                    list($currencyCode) = explode('-', $currencyCode);\n                    if ($currencyCode == '') {\n                        $currencyCode = PHPExcel_Shared_String::getCurrencyCode();\n                    }\n                    $value = preg_replace('/\\[\\$([^\\]]*)\\]/u', $currencyCode, $value);\n                }\n            }\n        }\n\n        // Escape any escaped slashes to a single slash\n        $format = preg_replace(\"/\\\\\\\\/u\", '\\\\', $format);\n\n        // Additional formatting provided by callback function\n        if ($callBack !== null) {\n            list($writerInstance, $function) = $callBack;\n            $value = $writerInstance->$function($value, $formatColor);\n        }\n\n        return $value;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Protection.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Protection\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style_Protection extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /** Protection styles */\n    const PROTECTION_INHERIT      = 'inherit';\n    const PROTECTION_PROTECTED    = 'protected';\n    const PROTECTION_UNPROTECTED  = 'unprotected';\n\n    /**\n     * Locked\n     *\n     * @var string\n     */\n    protected $locked;\n\n    /**\n     * Hidden\n     *\n     * @var string\n     */\n    protected $hidden;\n\n    /**\n     * Create a new PHPExcel_Style_Protection\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     * @param    boolean    $isConditional    Flag indicating if this is a conditional style or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        parent::__construct($isSupervisor);\n\n        // Initialise values\n        if (!$isConditional) {\n            $this->locked = self::PROTECTION_INHERIT;\n            $this->hidden = self::PROTECTION_INHERIT;\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style_Protection\n     */\n    public function getSharedComponent()\n    {\n        return $this->parent->getSharedComponent()->getProtection();\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('protection' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->getLocked()->applyFromArray(\n     *        array(\n     *            'locked' => TRUE,\n     *            'hidden' => FALSE\n     *        )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style_Protection\n     */\n    public function applyFromArray($pStyles = null)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles));\n            } else {\n                if (isset($pStyles['locked'])) {\n                    $this->setLocked($pStyles['locked']);\n                }\n                if (isset($pStyles['hidden'])) {\n                    $this->setHidden($pStyles['hidden']);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get locked\n     *\n     * @return string\n     */\n    public function getLocked()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getLocked();\n        }\n        return $this->locked;\n    }\n\n    /**\n     * Set locked\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_Protection\n     */\n    public function setLocked($pValue = self::PROTECTION_INHERIT)\n    {\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('locked' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->locked = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hidden\n     *\n     * @return string\n     */\n    public function getHidden()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHidden();\n        }\n        return $this->hidden;\n    }\n\n    /**\n     * Set hidden\n     *\n     * @param string $pValue\n     * @return PHPExcel_Style_Protection\n     */\n    public function setHidden($pValue = self::PROTECTION_INHERIT)\n    {\n        if ($this->isSupervisor) {\n            $styleArray = $this->getStyleArray(array('hidden' => $pValue));\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->hidden = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getHashCode();\n        }\n        return md5(\n            $this->locked .\n            $this->hidden .\n            __CLASS__\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style/Supervisor.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style_Supervisor\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Style_Supervisor\n{\n    /**\n     * Supervisor?\n     *\n     * @var boolean\n     */\n    protected $isSupervisor;\n\n    /**\n     * Parent. Only used for supervisor\n     *\n     * @var PHPExcel_Style\n     */\n    protected $parent;\n\n    /**\n     * Create a new PHPExcel_Style_Alignment\n     *\n     * @param    boolean    $isSupervisor    Flag indicating if this is a supervisor or not\n     *                                    Leave this value at default unless you understand exactly what\n     *                                        its ramifications are\n     */\n    public function __construct($isSupervisor = false)\n    {\n        // Supervisor?\n        $this->isSupervisor = $isSupervisor;\n    }\n\n    /**\n     * Bind parent. Only used for supervisor\n     *\n     * @param PHPExcel $parent\n     * @return PHPExcel_Style_Supervisor\n     */\n    public function bindParent($parent, $parentPropertyName = null)\n    {\n        $this->parent = $parent;\n        return $this;\n    }\n\n    /**\n     * Is this a supervisor or a cell style component?\n     *\n     * @return boolean\n     */\n    public function getIsSupervisor()\n    {\n        return $this->isSupervisor;\n    }\n\n    /**\n     * Get the currently active sheet. Only used for supervisor\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function getActiveSheet()\n    {\n        return $this->parent->getActiveSheet();\n    }\n\n    /**\n     * Get the currently active cell coordinate in currently active sheet.\n     * Only used for supervisor\n     *\n     * @return string E.g. 'A1'\n     */\n    public function getSelectedCells()\n    {\n        return $this->getActiveSheet()->getSelectedCells();\n    }\n\n    /**\n     * Get the currently active cell coordinate in currently active sheet.\n     * Only used for supervisor\n     *\n     * @return string E.g. 'A1'\n     */\n    public function getActiveCell()\n    {\n        return $this->getActiveSheet()->getActiveCell();\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if ((is_object($value)) && ($key != 'parent')) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Style.php",
    "content": "<?php\n\n/**\n * PHPExcel_Style\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Style\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Style extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable\n{\n    /**\n     * Font\n     *\n     * @var PHPExcel_Style_Font\n     */\n    protected $font;\n\n    /**\n     * Fill\n     *\n     * @var PHPExcel_Style_Fill\n     */\n    protected $fill;\n\n    /**\n     * Borders\n     *\n     * @var PHPExcel_Style_Borders\n     */\n    protected $borders;\n\n    /**\n     * Alignment\n     *\n     * @var PHPExcel_Style_Alignment\n     */\n    protected $alignment;\n\n    /**\n     * Number Format\n     *\n     * @var PHPExcel_Style_NumberFormat\n     */\n    protected $numberFormat;\n\n    /**\n     * Conditional styles\n     *\n     * @var PHPExcel_Style_Conditional[]\n     */\n    protected $conditionalStyles;\n\n    /**\n     * Protection\n     *\n     * @var PHPExcel_Style_Protection\n     */\n    protected $protection;\n\n    /**\n     * Index of style in collection. Only used for real style.\n     *\n     * @var int\n     */\n    protected $index;\n\n    /**\n     * Use Quote Prefix when displaying in cell editor. Only used for real style.\n     *\n     * @var boolean\n     */\n    protected $quotePrefix = false;\n\n    /**\n     * Create a new PHPExcel_Style\n     *\n     * @param boolean $isSupervisor Flag indicating if this is a supervisor or not\n     *         Leave this value at default unless you understand exactly what\n     *    its ramifications are\n     * @param boolean $isConditional Flag indicating if this is a conditional style or not\n     *       Leave this value at default unless you understand exactly what\n     *    its ramifications are\n     */\n    public function __construct($isSupervisor = false, $isConditional = false)\n    {\n        // Supervisor?\n        $this->isSupervisor = $isSupervisor;\n\n        // Initialise values\n        $this->conditionalStyles = array();\n        $this->font         = new PHPExcel_Style_Font($isSupervisor, $isConditional);\n        $this->fill         = new PHPExcel_Style_Fill($isSupervisor, $isConditional);\n        $this->borders      = new PHPExcel_Style_Borders($isSupervisor, $isConditional);\n        $this->alignment    = new PHPExcel_Style_Alignment($isSupervisor, $isConditional);\n        $this->numberFormat = new PHPExcel_Style_NumberFormat($isSupervisor, $isConditional);\n        $this->protection   = new PHPExcel_Style_Protection($isSupervisor, $isConditional);\n\n        // bind parent if we are a supervisor\n        if ($isSupervisor) {\n            $this->font->bindParent($this);\n            $this->fill->bindParent($this);\n            $this->borders->bindParent($this);\n            $this->alignment->bindParent($this);\n            $this->numberFormat->bindParent($this);\n            $this->protection->bindParent($this);\n        }\n    }\n\n    /**\n     * Get the shared style component for the currently active cell in currently active sheet.\n     * Only used for style supervisor\n     *\n     * @return PHPExcel_Style\n     */\n    public function getSharedComponent()\n    {\n        $activeSheet = $this->getActiveSheet();\n        $selectedCell = $this->getActiveCell(); // e.g. 'A1'\n\n        if ($activeSheet->cellExists($selectedCell)) {\n            $xfIndex = $activeSheet->getCell($selectedCell)->getXfIndex();\n        } else {\n            $xfIndex = 0;\n        }\n\n        return $this->parent->getCellXfByIndex($xfIndex);\n    }\n\n    /**\n     * Get parent. Only used for style supervisor\n     *\n     * @return PHPExcel\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Build style array from subcomponents\n     *\n     * @param array $array\n     * @return array\n     */\n    public function getStyleArray($array)\n    {\n        return array('quotePrefix' => $array);\n    }\n\n    /**\n     * Apply styles from array\n     *\n     * <code>\n     * $objPHPExcel->getActiveSheet()->getStyle('B2')->applyFromArray(\n     *         array(\n     *             'font'    => array(\n     *                 'name'      => 'Arial',\n     *                 'bold'      => true,\n     *                 'italic'    => false,\n     *                 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE,\n     *                 'strike'    => false,\n     *                 'color'     => array(\n     *                     'rgb' => '808080'\n     *                 )\n     *             ),\n     *             'borders' => array(\n     *                 'bottom'     => array(\n     *                     'style' => PHPExcel_Style_Border::BORDER_DASHDOT,\n     *                     'color' => array(\n     *                         'rgb' => '808080'\n     *                     )\n     *                 ),\n     *                 'top'     => array(\n     *                     'style' => PHPExcel_Style_Border::BORDER_DASHDOT,\n     *                     'color' => array(\n     *                         'rgb' => '808080'\n     *                     )\n     *                 )\n     *             ),\n     *             'quotePrefix'    => true\n     *         )\n     * );\n     * </code>\n     *\n     * @param    array    $pStyles    Array containing style information\n     * @param     boolean        $pAdvanced    Advanced mode for setting borders.\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Style\n     */\n    public function applyFromArray($pStyles = null, $pAdvanced = true)\n    {\n        if (is_array($pStyles)) {\n            if ($this->isSupervisor) {\n                $pRange = $this->getSelectedCells();\n\n                // Uppercase coordinate\n                $pRange = strtoupper($pRange);\n\n                // Is it a cell range or a single cell?\n                if (strpos($pRange, ':') === false) {\n                    $rangeA = $pRange;\n                    $rangeB = $pRange;\n                } else {\n                    list($rangeA, $rangeB) = explode(':', $pRange);\n                }\n\n                // Calculate range outer borders\n                $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);\n                $rangeEnd   = PHPExcel_Cell::coordinateFromString($rangeB);\n\n                // Translate column into index\n                $rangeStart[0]    = PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1;\n                $rangeEnd[0]    = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1;\n\n                // Make sure we can loop upwards on rows and columns\n                if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {\n                    $tmp = $rangeStart;\n                    $rangeStart = $rangeEnd;\n                    $rangeEnd = $tmp;\n                }\n\n                // ADVANCED MODE:\n                if ($pAdvanced && isset($pStyles['borders'])) {\n                    // 'allborders' is a shorthand property for 'outline' and 'inside' and\n                    //        it applies to components that have not been set explicitly\n                    if (isset($pStyles['borders']['allborders'])) {\n                        foreach (array('outline', 'inside') as $component) {\n                            if (!isset($pStyles['borders'][$component])) {\n                                $pStyles['borders'][$component] = $pStyles['borders']['allborders'];\n                            }\n                        }\n                        unset($pStyles['borders']['allborders']); // not needed any more\n                    }\n                    // 'outline' is a shorthand property for 'top', 'right', 'bottom', 'left'\n                    //        it applies to components that have not been set explicitly\n                    if (isset($pStyles['borders']['outline'])) {\n                        foreach (array('top', 'right', 'bottom', 'left') as $component) {\n                            if (!isset($pStyles['borders'][$component])) {\n                                $pStyles['borders'][$component] = $pStyles['borders']['outline'];\n                            }\n                        }\n                        unset($pStyles['borders']['outline']); // not needed any more\n                    }\n                    // 'inside' is a shorthand property for 'vertical' and 'horizontal'\n                    //        it applies to components that have not been set explicitly\n                    if (isset($pStyles['borders']['inside'])) {\n                        foreach (array('vertical', 'horizontal') as $component) {\n                            if (!isset($pStyles['borders'][$component])) {\n                                $pStyles['borders'][$component] = $pStyles['borders']['inside'];\n                            }\n                        }\n                        unset($pStyles['borders']['inside']); // not needed any more\n                    }\n                    // width and height characteristics of selection, 1, 2, or 3 (for 3 or more)\n                    $xMax = min($rangeEnd[0] - $rangeStart[0] + 1, 3);\n                    $yMax = min($rangeEnd[1] - $rangeStart[1] + 1, 3);\n\n                    // loop through up to 3 x 3 = 9 regions\n                    for ($x = 1; $x <= $xMax; ++$x) {\n                        // start column index for region\n                        $colStart = ($x == 3) ?\n                            PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0])\n                                : PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $x - 1);\n                        // end column index for region\n                        $colEnd = ($x == 1) ?\n                            PHPExcel_Cell::stringFromColumnIndex($rangeStart[0])\n                                : PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] - $xMax + $x);\n\n                        for ($y = 1; $y <= $yMax; ++$y) {\n                            // which edges are touching the region\n                            $edges = array();\n                            if ($x == 1) {\n                                // are we at left edge\n                                $edges[] = 'left';\n                            }\n                            if ($x == $xMax) {\n                                // are we at right edge\n                                $edges[] = 'right';\n                            }\n                            if ($y == 1) {\n                                // are we at top edge?\n                                $edges[] = 'top';\n                            }\n                            if ($y == $yMax) {\n                                // are we at bottom edge?\n                                $edges[] = 'bottom';\n                            }\n\n                            // start row index for region\n                            $rowStart = ($y == 3) ?\n                                $rangeEnd[1] : $rangeStart[1] + $y - 1;\n\n                            // end row index for region\n                            $rowEnd = ($y == 1) ?\n                                $rangeStart[1] : $rangeEnd[1] - $yMax + $y;\n\n                            // build range for region\n                            $range = $colStart . $rowStart . ':' . $colEnd . $rowEnd;\n\n                            // retrieve relevant style array for region\n                            $regionStyles = $pStyles;\n                            unset($regionStyles['borders']['inside']);\n\n                            // what are the inner edges of the region when looking at the selection\n                            $innerEdges = array_diff(array('top', 'right', 'bottom', 'left'), $edges);\n\n                            // inner edges that are not touching the region should take the 'inside' border properties if they have been set\n                            foreach ($innerEdges as $innerEdge) {\n                                switch ($innerEdge) {\n                                    case 'top':\n                                    case 'bottom':\n                                        // should pick up 'horizontal' border property if set\n                                        if (isset($pStyles['borders']['horizontal'])) {\n                                            $regionStyles['borders'][$innerEdge] = $pStyles['borders']['horizontal'];\n                                        } else {\n                                            unset($regionStyles['borders'][$innerEdge]);\n                                        }\n                                        break;\n                                    case 'left':\n                                    case 'right':\n                                        // should pick up 'vertical' border property if set\n                                        if (isset($pStyles['borders']['vertical'])) {\n                                            $regionStyles['borders'][$innerEdge] = $pStyles['borders']['vertical'];\n                                        } else {\n                                            unset($regionStyles['borders'][$innerEdge]);\n                                        }\n                                        break;\n                                }\n                            }\n\n                            // apply region style to region by calling applyFromArray() in simple mode\n                            $this->getActiveSheet()->getStyle($range)->applyFromArray($regionStyles, false);\n                        }\n                    }\n                    return $this;\n                }\n\n                // SIMPLE MODE:\n                // Selection type, inspect\n                if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) {\n                    $selectionType = 'COLUMN';\n                } elseif (preg_match('/^A[0-9]+:XFD[0-9]+$/', $pRange)) {\n                    $selectionType = 'ROW';\n                } else {\n                    $selectionType = 'CELL';\n                }\n\n                // First loop through columns, rows, or cells to find out which styles are affected by this operation\n                switch ($selectionType) {\n                    case 'COLUMN':\n                        $oldXfIndexes = array();\n                        for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {\n                            $oldXfIndexes[$this->getActiveSheet()->getColumnDimensionByColumn($col)->getXfIndex()] = true;\n                        }\n                        break;\n                    case 'ROW':\n                        $oldXfIndexes = array();\n                        for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {\n                            if ($this->getActiveSheet()->getRowDimension($row)->getXfIndex() == null) {\n                                $oldXfIndexes[0] = true; // row without explicit style should be formatted based on default style\n                            } else {\n                                $oldXfIndexes[$this->getActiveSheet()->getRowDimension($row)->getXfIndex()] = true;\n                            }\n                        }\n                        break;\n                    case 'CELL':\n                        $oldXfIndexes = array();\n                        for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {\n                            for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {\n                                $oldXfIndexes[$this->getActiveSheet()->getCellByColumnAndRow($col, $row)->getXfIndex()] = true;\n                            }\n                        }\n                        break;\n                }\n\n                // clone each of the affected styles, apply the style array, and add the new styles to the workbook\n                $workbook = $this->getActiveSheet()->getParent();\n                foreach ($oldXfIndexes as $oldXfIndex => $dummy) {\n                    $style = $workbook->getCellXfByIndex($oldXfIndex);\n                    $newStyle = clone $style;\n                    $newStyle->applyFromArray($pStyles);\n\n                    if ($existingStyle = $workbook->getCellXfByHashCode($newStyle->getHashCode())) {\n                        // there is already such cell Xf in our collection\n                        $newXfIndexes[$oldXfIndex] = $existingStyle->getIndex();\n                    } else {\n                        // we don't have such a cell Xf, need to add\n                        $workbook->addCellXf($newStyle);\n                        $newXfIndexes[$oldXfIndex] = $newStyle->getIndex();\n                    }\n                }\n\n                // Loop through columns, rows, or cells again and update the XF index\n                switch ($selectionType) {\n                    case 'COLUMN':\n                        for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {\n                            $columnDimension = $this->getActiveSheet()->getColumnDimensionByColumn($col);\n                            $oldXfIndex = $columnDimension->getXfIndex();\n                            $columnDimension->setXfIndex($newXfIndexes[$oldXfIndex]);\n                        }\n                        break;\n\n                    case 'ROW':\n                        for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {\n                            $rowDimension = $this->getActiveSheet()->getRowDimension($row);\n                            $oldXfIndex = $rowDimension->getXfIndex() === null ?\n                                0 : $rowDimension->getXfIndex(); // row without explicit style should be formatted based on default style\n                            $rowDimension->setXfIndex($newXfIndexes[$oldXfIndex]);\n                        }\n                        break;\n\n                    case 'CELL':\n                        for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {\n                            for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {\n                                $cell = $this->getActiveSheet()->getCellByColumnAndRow($col, $row);\n                                $oldXfIndex = $cell->getXfIndex();\n                                $cell->setXfIndex($newXfIndexes[$oldXfIndex]);\n                            }\n                        }\n                        break;\n                }\n\n            } else {\n                // not a supervisor, just apply the style array directly on style object\n                if (array_key_exists('fill', $pStyles)) {\n                    $this->getFill()->applyFromArray($pStyles['fill']);\n                }\n                if (array_key_exists('font', $pStyles)) {\n                    $this->getFont()->applyFromArray($pStyles['font']);\n                }\n                if (array_key_exists('borders', $pStyles)) {\n                    $this->getBorders()->applyFromArray($pStyles['borders']);\n                }\n                if (array_key_exists('alignment', $pStyles)) {\n                    $this->getAlignment()->applyFromArray($pStyles['alignment']);\n                }\n                if (array_key_exists('numberformat', $pStyles)) {\n                    $this->getNumberFormat()->applyFromArray($pStyles['numberformat']);\n                }\n                if (array_key_exists('protection', $pStyles)) {\n                    $this->getProtection()->applyFromArray($pStyles['protection']);\n                }\n                if (array_key_exists('quotePrefix', $pStyles)) {\n                    $this->quotePrefix = $pStyles['quotePrefix'];\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Invalid style array passed.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Fill\n     *\n     * @return PHPExcel_Style_Fill\n     */\n    public function getFill()\n    {\n        return $this->fill;\n    }\n\n    /**\n     * Get Font\n     *\n     * @return PHPExcel_Style_Font\n     */\n    public function getFont()\n    {\n        return $this->font;\n    }\n\n    /**\n     * Set font\n     *\n     * @param PHPExcel_Style_Font $font\n     * @return PHPExcel_Style\n     */\n    public function setFont(PHPExcel_Style_Font $font)\n    {\n        $this->font = $font;\n        return $this;\n    }\n\n    /**\n     * Get Borders\n     *\n     * @return PHPExcel_Style_Borders\n     */\n    public function getBorders()\n    {\n        return $this->borders;\n    }\n\n    /**\n     * Get Alignment\n     *\n     * @return PHPExcel_Style_Alignment\n     */\n    public function getAlignment()\n    {\n        return $this->alignment;\n    }\n\n    /**\n     * Get Number Format\n     *\n     * @return PHPExcel_Style_NumberFormat\n     */\n    public function getNumberFormat()\n    {\n        return $this->numberFormat;\n    }\n\n    /**\n     * Get Conditional Styles. Only used on supervisor.\n     *\n     * @return PHPExcel_Style_Conditional[]\n     */\n    public function getConditionalStyles()\n    {\n        return $this->getActiveSheet()->getConditionalStyles($this->getActiveCell());\n    }\n\n    /**\n     * Set Conditional Styles. Only used on supervisor.\n     *\n     * @param PHPExcel_Style_Conditional[] $pValue Array of condtional styles\n     * @return PHPExcel_Style\n     */\n    public function setConditionalStyles($pValue = null)\n    {\n        if (is_array($pValue)) {\n            $this->getActiveSheet()->setConditionalStyles($this->getSelectedCells(), $pValue);\n        }\n        return $this;\n    }\n\n    /**\n     * Get Protection\n     *\n     * @return PHPExcel_Style_Protection\n     */\n    public function getProtection()\n    {\n        return $this->protection;\n    }\n\n    /**\n     * Get quote prefix\n     *\n     * @return boolean\n     */\n    public function getQuotePrefix()\n    {\n        if ($this->isSupervisor) {\n            return $this->getSharedComponent()->getQuotePrefix();\n        }\n        return $this->quotePrefix;\n    }\n\n    /**\n     * Set quote prefix\n     *\n     * @param boolean $pValue\n     */\n    public function setQuotePrefix($pValue)\n    {\n        if ($pValue == '') {\n            $pValue = false;\n        }\n        if ($this->isSupervisor) {\n            $styleArray = array('quotePrefix' => $pValue);\n            $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);\n        } else {\n            $this->quotePrefix = (boolean) $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string Hash code\n     */\n    public function getHashCode()\n    {\n        $hashConditionals = '';\n        foreach ($this->conditionalStyles as $conditional) {\n            $hashConditionals .= $conditional->getHashCode();\n        }\n\n        return md5(\n            $this->fill->getHashCode() .\n            $this->font->getHashCode() .\n            $this->borders->getHashCode() .\n            $this->alignment->getHashCode() .\n            $this->numberFormat->getHashCode() .\n            $hashConditionals .\n            $this->protection->getHashCode() .\n            ($this->quotePrefix  ? 't' : 'f') .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Get own index in style collection\n     *\n     * @return int\n     */\n    public function getIndex()\n    {\n        return $this->index;\n    }\n\n    /**\n     * Set own index in style collection\n     *\n     * @param int $pValue\n     */\n    public function setIndex($pValue)\n    {\n        $this->index = $pValue;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column/Rule.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_AutoFilter_Column_Rule\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Worksheet\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_AutoFilter_Column_Rule\n{\n    const AUTOFILTER_RULETYPE_FILTER        = 'filter';\n    const AUTOFILTER_RULETYPE_DATEGROUP     = 'dateGroupItem';\n    const AUTOFILTER_RULETYPE_CUSTOMFILTER  = 'customFilter';\n    const AUTOFILTER_RULETYPE_DYNAMICFILTER = 'dynamicFilter';\n    const AUTOFILTER_RULETYPE_TOPTENFILTER  = 'top10Filter';\n\n    private static $ruleTypes = array(\n        //    Currently we're not handling\n        //        colorFilter\n        //        extLst\n        //        iconFilter\n        self::AUTOFILTER_RULETYPE_FILTER,\n        self::AUTOFILTER_RULETYPE_DATEGROUP,\n        self::AUTOFILTER_RULETYPE_CUSTOMFILTER,\n        self::AUTOFILTER_RULETYPE_DYNAMICFILTER,\n        self::AUTOFILTER_RULETYPE_TOPTENFILTER,\n    );\n\n    const AUTOFILTER_RULETYPE_DATEGROUP_YEAR   = 'year';\n    const AUTOFILTER_RULETYPE_DATEGROUP_MONTH  = 'month';\n    const AUTOFILTER_RULETYPE_DATEGROUP_DAY    = 'day';\n    const AUTOFILTER_RULETYPE_DATEGROUP_HOUR   = 'hour';\n    const AUTOFILTER_RULETYPE_DATEGROUP_MINUTE = 'minute';\n    const AUTOFILTER_RULETYPE_DATEGROUP_SECOND = 'second';\n\n    private static $dateTimeGroups = array(\n        self::AUTOFILTER_RULETYPE_DATEGROUP_YEAR,\n        self::AUTOFILTER_RULETYPE_DATEGROUP_MONTH,\n        self::AUTOFILTER_RULETYPE_DATEGROUP_DAY,\n        self::AUTOFILTER_RULETYPE_DATEGROUP_HOUR,\n        self::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE,\n        self::AUTOFILTER_RULETYPE_DATEGROUP_SECOND,\n    );\n\n    const AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY    = 'yesterday';\n    const AUTOFILTER_RULETYPE_DYNAMIC_TODAY        = 'today';\n    const AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW     = 'tomorrow';\n    const AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE   = 'yearToDate';\n    const AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR     = 'thisYear';\n    const AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER  = 'thisQuarter';\n    const AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH    = 'thisMonth';\n    const AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK     = 'thisWeek';\n    const AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR     = 'lastYear';\n    const AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER  = 'lastQuarter';\n    const AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH    = 'lastMonth';\n    const AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK     = 'lastWeek';\n    const AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR     = 'nextYear';\n    const AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER  = 'nextQuarter';\n    const AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH    = 'nextMonth';\n    const AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK     = 'nextWeek';\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1      = 'M1';\n    const AUTOFILTER_RULETYPE_DYNAMIC_JANUARY      = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2      = 'M2';\n    const AUTOFILTER_RULETYPE_DYNAMIC_FEBRUARY     = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3      = 'M3';\n    const AUTOFILTER_RULETYPE_DYNAMIC_MARCH        = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4      = 'M4';\n    const AUTOFILTER_RULETYPE_DYNAMIC_APRIL        = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5      = 'M5';\n    const AUTOFILTER_RULETYPE_DYNAMIC_MAY          = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6      = 'M6';\n    const AUTOFILTER_RULETYPE_DYNAMIC_JUNE         = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7      = 'M7';\n    const AUTOFILTER_RULETYPE_DYNAMIC_JULY         = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8      = 'M8';\n    const AUTOFILTER_RULETYPE_DYNAMIC_AUGUST       = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9      = 'M9';\n    const AUTOFILTER_RULETYPE_DYNAMIC_SEPTEMBER    = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10     = 'M10';\n    const AUTOFILTER_RULETYPE_DYNAMIC_OCTOBER      = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11     = 'M11';\n    const AUTOFILTER_RULETYPE_DYNAMIC_NOVEMBER     = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11;\n    const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12     = 'M12';\n    const AUTOFILTER_RULETYPE_DYNAMIC_DECEMBER     = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12;\n    const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1    = 'Q1';\n    const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2    = 'Q2';\n    const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3    = 'Q3';\n    const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4    = 'Q4';\n    const AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE = 'aboveAverage';\n    const AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE = 'belowAverage';\n\n    private static $dynamicTypes = array(\n        self::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_TODAY,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE,\n        self::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE,\n    );\n\n    /*\n     *    The only valid filter rule operators for filter and customFilter types are:\n     *        <xsd:enumeration value=\"equal\"/>\n     *        <xsd:enumeration value=\"lessThan\"/>\n     *        <xsd:enumeration value=\"lessThanOrEqual\"/>\n     *        <xsd:enumeration value=\"notEqual\"/>\n     *        <xsd:enumeration value=\"greaterThanOrEqual\"/>\n     *        <xsd:enumeration value=\"greaterThan\"/>\n     */\n    const AUTOFILTER_COLUMN_RULE_EQUAL              = 'equal';\n    const AUTOFILTER_COLUMN_RULE_NOTEQUAL           = 'notEqual';\n    const AUTOFILTER_COLUMN_RULE_GREATERTHAN        = 'greaterThan';\n    const AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL = 'greaterThanOrEqual';\n    const AUTOFILTER_COLUMN_RULE_LESSTHAN           = 'lessThan';\n    const AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL    = 'lessThanOrEqual';\n\n    private static $operators = array(\n        self::AUTOFILTER_COLUMN_RULE_EQUAL,\n        self::AUTOFILTER_COLUMN_RULE_NOTEQUAL,\n        self::AUTOFILTER_COLUMN_RULE_GREATERTHAN,\n        self::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL,\n        self::AUTOFILTER_COLUMN_RULE_LESSTHAN,\n        self::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL,\n    );\n\n    const AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE = 'byValue';\n    const AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT  = 'byPercent';\n\n    private static $topTenValue = array(\n        self::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE,\n        self::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT,\n    );\n\n    const AUTOFILTER_COLUMN_RULE_TOPTEN_TOP    = 'top';\n    const AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM = 'bottom';\n\n    private static $topTenType = array(\n        self::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP,\n        self::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM,\n    );\n\n\n    /* Rule Operators (Numeric, Boolean etc) */\n//    const AUTOFILTER_COLUMN_RULE_BETWEEN            = 'between';        //    greaterThanOrEqual 1 && lessThanOrEqual 2\n    /* Rule Operators (Numeric Special) which are translated to standard numeric operators with calculated values */\n//    const AUTOFILTER_COLUMN_RULE_TOPTEN                = 'topTen';            //    greaterThan calculated value\n//    const AUTOFILTER_COLUMN_RULE_TOPTENPERCENT        = 'topTenPercent';    //    greaterThan calculated value\n//    const AUTOFILTER_COLUMN_RULE_ABOVEAVERAGE        = 'aboveAverage';    //    Value is calculated as the average\n//    const AUTOFILTER_COLUMN_RULE_BELOWAVERAGE        = 'belowAverage';    //    Value is calculated as the average\n    /* Rule Operators (String) which are set as wild-carded values */\n//    const AUTOFILTER_COLUMN_RULE_BEGINSWITH            = 'beginsWith';            // A*\n//    const AUTOFILTER_COLUMN_RULE_ENDSWITH            = 'endsWith';            // *Z\n//    const AUTOFILTER_COLUMN_RULE_CONTAINS            = 'contains';            // *B*\n//    const AUTOFILTER_COLUMN_RULE_DOESNTCONTAIN        = 'notEqual';            //    notEqual *B*\n    /* Rule Operators (Date Special) which are translated to standard numeric operators with calculated values */\n//    const AUTOFILTER_COLUMN_RULE_BEFORE                = 'lessThan';\n//    const AUTOFILTER_COLUMN_RULE_AFTER                = 'greaterThan';\n//    const AUTOFILTER_COLUMN_RULE_YESTERDAY            = 'yesterday';\n//    const AUTOFILTER_COLUMN_RULE_TODAY                = 'today';\n//    const AUTOFILTER_COLUMN_RULE_TOMORROW            = 'tomorrow';\n//    const AUTOFILTER_COLUMN_RULE_LASTWEEK            = 'lastWeek';\n//    const AUTOFILTER_COLUMN_RULE_THISWEEK            = 'thisWeek';\n//    const AUTOFILTER_COLUMN_RULE_NEXTWEEK            = 'nextWeek';\n//    const AUTOFILTER_COLUMN_RULE_LASTMONTH            = 'lastMonth';\n//    const AUTOFILTER_COLUMN_RULE_THISMONTH            = 'thisMonth';\n//    const AUTOFILTER_COLUMN_RULE_NEXTMONTH            = 'nextMonth';\n//    const AUTOFILTER_COLUMN_RULE_LASTQUARTER        = 'lastQuarter';\n//    const AUTOFILTER_COLUMN_RULE_THISQUARTER        = 'thisQuarter';\n//    const AUTOFILTER_COLUMN_RULE_NEXTQUARTER        = 'nextQuarter';\n//    const AUTOFILTER_COLUMN_RULE_LASTYEAR            = 'lastYear';\n//    const AUTOFILTER_COLUMN_RULE_THISYEAR            = 'thisYear';\n//    const AUTOFILTER_COLUMN_RULE_NEXTYEAR            = 'nextYear';\n//    const AUTOFILTER_COLUMN_RULE_YEARTODATE            = 'yearToDate';            //    <dynamicFilter val=\"40909\" type=\"yearToDate\" maxVal=\"41113\"/>\n//    const AUTOFILTER_COLUMN_RULE_ALLDATESINMONTH    = 'allDatesInMonth';    //    <dynamicFilter type=\"M2\"/> for Month/February\n//    const AUTOFILTER_COLUMN_RULE_ALLDATESINQUARTER    = 'allDatesInQuarter';    //    <dynamicFilter type=\"Q2\"/> for Quarter 2\n\n    /**\n     * Autofilter Column\n     *\n     * @var PHPExcel_Worksheet_AutoFilter_Column\n     */\n    private $parent = null;\n\n\n    /**\n     * Autofilter Rule Type\n     *\n     * @var string\n     */\n    private $ruleType = self::AUTOFILTER_RULETYPE_FILTER;\n\n\n    /**\n     * Autofilter Rule Value\n     *\n     * @var string\n     */\n    private $value = '';\n\n    /**\n     * Autofilter Rule Operator\n     *\n     * @var string\n     */\n    private $operator = self::AUTOFILTER_COLUMN_RULE_EQUAL;\n\n    /**\n     * DateTimeGrouping Group Value\n     *\n     * @var string\n     */\n    private $grouping = '';\n\n\n    /**\n     * Create a new PHPExcel_Worksheet_AutoFilter_Column_Rule\n     *\n     * @param PHPExcel_Worksheet_AutoFilter_Column $pParent\n     */\n    public function __construct(PHPExcel_Worksheet_AutoFilter_Column $pParent = null)\n    {\n        $this->parent = $pParent;\n    }\n\n    /**\n     * Get AutoFilter Rule Type\n     *\n     * @return string\n     */\n    public function getRuleType()\n    {\n        return $this->ruleType;\n    }\n\n    /**\n     *    Set AutoFilter Rule Type\n     *\n     *    @param    string        $pRuleType\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setRuleType($pRuleType = self::AUTOFILTER_RULETYPE_FILTER)\n    {\n        if (!in_array($pRuleType, self::$ruleTypes)) {\n            throw new PHPExcel_Exception('Invalid rule type for column AutoFilter Rule.');\n        }\n\n        $this->ruleType = $pRuleType;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Rule Value\n     *\n     * @return string\n     */\n    public function getValue()\n    {\n        return $this->value;\n    }\n\n    /**\n     *    Set AutoFilter Rule Value\n     *\n     *    @param    string|string[]        $pValue\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function setValue($pValue = '')\n    {\n        if (is_array($pValue)) {\n            $grouping = -1;\n            foreach ($pValue as $key => $value) {\n                //    Validate array entries\n                if (!in_array($key, self::$dateTimeGroups)) {\n                    //    Remove any invalid entries from the value array\n                    unset($pValue[$key]);\n                } else {\n                    //    Work out what the dateTime grouping will be\n                    $grouping = max($grouping, array_search($key, self::$dateTimeGroups));\n                }\n            }\n            if (count($pValue) == 0) {\n                throw new PHPExcel_Exception('Invalid rule value for column AutoFilter Rule.');\n            }\n            //    Set the dateTime grouping that we've anticipated\n            $this->setGrouping(self::$dateTimeGroups[$grouping]);\n        }\n        $this->value = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Rule Operator\n     *\n     * @return string\n     */\n    public function getOperator()\n    {\n        return $this->operator;\n    }\n\n    /**\n     *    Set AutoFilter Rule Operator\n     *\n     *    @param    string        $pOperator\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function setOperator($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL)\n    {\n        if (empty($pOperator)) {\n            $pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL;\n        }\n        if ((!in_array($pOperator, self::$operators)) &&\n            (!in_array($pOperator, self::$topTenValue))) {\n            throw new PHPExcel_Exception('Invalid operator for column AutoFilter Rule.');\n        }\n        $this->operator = $pOperator;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Rule Grouping\n     *\n     * @return string\n     */\n    public function getGrouping()\n    {\n        return $this->grouping;\n    }\n\n    /**\n     *    Set AutoFilter Rule Grouping\n     *\n     *    @param    string        $pGrouping\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function setGrouping($pGrouping = null)\n    {\n        if (($pGrouping !== null) &&\n            (!in_array($pGrouping, self::$dateTimeGroups)) &&\n            (!in_array($pGrouping, self::$dynamicTypes)) &&\n            (!in_array($pGrouping, self::$topTenType))) {\n            throw new PHPExcel_Exception('Invalid rule type for column AutoFilter Rule.');\n        }\n        $this->grouping = $pGrouping;\n\n        return $this;\n    }\n\n    /**\n     *    Set AutoFilter Rule\n     *\n     *    @param    string                $pOperator\n     *    @param    string|string[]        $pValue\n     *    @param    string                $pGrouping\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function setRule($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL, $pValue = '', $pGrouping = null)\n    {\n        $this->setOperator($pOperator);\n        $this->setValue($pValue);\n        //    Only set grouping if it's been passed in as a user-supplied argument,\n        //        otherwise we're calculating it when we setValue() and don't want to overwrite that\n        //        If the user supplies an argumnet for grouping, then on their own head be it\n        if ($pGrouping !== null) {\n            $this->setGrouping($pGrouping);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get this Rule's AutoFilter Column Parent\n     *\n     * @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Set this Rule's AutoFilter Column Parent\n     *\n     * @param PHPExcel_Worksheet_AutoFilter_Column\n     * @return PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function setParent(PHPExcel_Worksheet_AutoFilter_Column $pParent = null)\n    {\n        $this->parent = $pParent;\n\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                if ($key == 'parent') {\n                    //    Detach from autofilter column parent\n                    $this->$key = null;\n                } else {\n                    $this->$key = clone $value;\n                }\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_AutoFilter_Column\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category    PHPExcel\n * @package        PHPExcel_Worksheet\n * @copyright    Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license        http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version        ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_AutoFilter_Column\n{\n    const AUTOFILTER_FILTERTYPE_FILTER         = 'filters';\n    const AUTOFILTER_FILTERTYPE_CUSTOMFILTER   = 'customFilters';\n    //    Supports no more than 2 rules, with an And/Or join criteria\n    //        if more than 1 rule is defined\n    const AUTOFILTER_FILTERTYPE_DYNAMICFILTER  = 'dynamicFilter';\n    //    Even though the filter rule is constant, the filtered data can vary\n    //        e.g. filtered by date = TODAY\n    const AUTOFILTER_FILTERTYPE_TOPTENFILTER   = 'top10';\n\n    /**\n     * Types of autofilter rules\n     *\n     * @var string[]\n     */\n    private static $filterTypes = array(\n        //    Currently we're not handling\n        //        colorFilter\n        //        extLst\n        //        iconFilter\n        self::AUTOFILTER_FILTERTYPE_FILTER,\n        self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER,\n        self::AUTOFILTER_FILTERTYPE_DYNAMICFILTER,\n        self::AUTOFILTER_FILTERTYPE_TOPTENFILTER,\n    );\n\n    /* Multiple Rule Connections */\n    const AUTOFILTER_COLUMN_JOIN_AND = 'and';\n    const AUTOFILTER_COLUMN_JOIN_OR  = 'or';\n\n    /**\n     * Join options for autofilter rules\n     *\n     * @var string[]\n     */\n    private static $ruleJoins = array(\n        self::AUTOFILTER_COLUMN_JOIN_AND,\n        self::AUTOFILTER_COLUMN_JOIN_OR,\n    );\n\n    /**\n     * Autofilter\n     *\n     * @var PHPExcel_Worksheet_AutoFilter\n     */\n    private $parent;\n\n\n    /**\n     * Autofilter Column Index\n     *\n     * @var string\n     */\n    private $columnIndex = '';\n\n\n    /**\n     * Autofilter Column Filter Type\n     *\n     * @var string\n     */\n    private $filterType = self::AUTOFILTER_FILTERTYPE_FILTER;\n\n\n    /**\n     * Autofilter Multiple Rules And/Or\n     *\n     * @var string\n     */\n    private $join = self::AUTOFILTER_COLUMN_JOIN_OR;\n\n\n    /**\n     * Autofilter Column Rules\n     *\n     * @var array of PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    private $ruleset = array();\n\n\n    /**\n     * Autofilter Column Dynamic Attributes\n     *\n     * @var array of mixed\n     */\n    private $attributes = array();\n\n\n    /**\n     * Create a new PHPExcel_Worksheet_AutoFilter_Column\n     *\n     *    @param    string                           $pColumn        Column (e.g. A)\n     *    @param    PHPExcel_Worksheet_AutoFilter  $pParent        Autofilter for this column\n     */\n    public function __construct($pColumn, PHPExcel_Worksheet_AutoFilter $pParent = null)\n    {\n        $this->columnIndex = $pColumn;\n        $this->parent = $pParent;\n    }\n\n    /**\n     * Get AutoFilter Column Index\n     *\n     * @return string\n     */\n    public function getColumnIndex()\n    {\n        return $this->columnIndex;\n    }\n\n    /**\n     *    Set AutoFilter Column Index\n     *\n     *    @param    string        $pColumn        Column (e.g. A)\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setColumnIndex($pColumn)\n    {\n        // Uppercase coordinate\n        $pColumn = strtoupper($pColumn);\n        if ($this->parent !== null) {\n            $this->parent->testColumnInRange($pColumn);\n        }\n\n        $this->columnIndex = $pColumn;\n\n        return $this;\n    }\n\n    /**\n     * Get this Column's AutoFilter Parent\n     *\n     * @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Set this Column's AutoFilter Parent\n     *\n     * @param PHPExcel_Worksheet_AutoFilter\n     * @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setParent(PHPExcel_Worksheet_AutoFilter $pParent = null)\n    {\n        $this->parent = $pParent;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Type\n     *\n     * @return string\n     */\n    public function getFilterType()\n    {\n        return $this->filterType;\n    }\n\n    /**\n     *    Set AutoFilter Type\n     *\n     *    @param    string        $pFilterType\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setFilterType($pFilterType = self::AUTOFILTER_FILTERTYPE_FILTER)\n    {\n        if (!in_array($pFilterType, self::$filterTypes)) {\n            throw new PHPExcel_Exception('Invalid filter type for column AutoFilter.');\n        }\n\n        $this->filterType = $pFilterType;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Multiple Rules And/Or Join\n     *\n     * @return string\n     */\n    public function getJoin()\n    {\n        return $this->join;\n    }\n\n    /**\n     *    Set AutoFilter Multiple Rules And/Or\n     *\n     *    @param    string        $pJoin        And/Or\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setJoin($pJoin = self::AUTOFILTER_COLUMN_JOIN_OR)\n    {\n        // Lowercase And/Or\n        $pJoin = strtolower($pJoin);\n        if (!in_array($pJoin, self::$ruleJoins)) {\n            throw new PHPExcel_Exception('Invalid rule connection for column AutoFilter.');\n        }\n\n        $this->join = $pJoin;\n\n        return $this;\n    }\n\n    /**\n     *    Set AutoFilter Attributes\n     *\n     *    @param    string[]        $pAttributes\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setAttributes($pAttributes = array())\n    {\n        $this->attributes = $pAttributes;\n\n        return $this;\n    }\n\n    /**\n     *    Set An AutoFilter Attribute\n     *\n     *    @param    string        $pName        Attribute Name\n     *    @param    string        $pValue        Attribute Value\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function setAttribute($pName, $pValue)\n    {\n        $this->attributes[$pName] = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Column Attributes\n     *\n     * @return string\n     */\n    public function getAttributes()\n    {\n        return $this->attributes;\n    }\n\n    /**\n     * Get specific AutoFilter Column Attribute\n     *\n     *    @param    string        $pName        Attribute Name\n     * @return string\n     */\n    public function getAttribute($pName)\n    {\n        if (isset($this->attributes[$pName])) {\n            return $this->attributes[$pName];\n        }\n        return null;\n    }\n\n    /**\n     * Get all AutoFilter Column Rules\n     *\n     * @throws    PHPExcel_Exception\n     * @return array of PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function getRules()\n    {\n        return $this->ruleset;\n    }\n\n    /**\n     * Get a specified AutoFilter Column Rule\n     *\n     * @param    integer    $pIndex        Rule index in the ruleset array\n     * @return    PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function getRule($pIndex)\n    {\n        if (!isset($this->ruleset[$pIndex])) {\n            $this->ruleset[$pIndex] = new PHPExcel_Worksheet_AutoFilter_Column_Rule($this);\n        }\n        return $this->ruleset[$pIndex];\n    }\n\n    /**\n     * Create a new AutoFilter Column Rule in the ruleset\n     *\n     * @return    PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function createRule()\n    {\n        $this->ruleset[] = new PHPExcel_Worksheet_AutoFilter_Column_Rule($this);\n\n        return end($this->ruleset);\n    }\n\n    /**\n     * Add a new AutoFilter Column Rule to the ruleset\n     *\n     * @param    PHPExcel_Worksheet_AutoFilter_Column_Rule    $pRule\n     * @param    boolean    $returnRule     Flag indicating whether the rule object or the column object should be returned\n     * @return    PHPExcel_Worksheet_AutoFilter_Column|PHPExcel_Worksheet_AutoFilter_Column_Rule\n     */\n    public function addRule(PHPExcel_Worksheet_AutoFilter_Column_Rule $pRule, $returnRule = true)\n    {\n        $pRule->setParent($this);\n        $this->ruleset[] = $pRule;\n\n        return ($returnRule) ? $pRule : $this;\n    }\n\n    /**\n     * Delete a specified AutoFilter Column Rule\n     *    If the number of rules is reduced to 1, then we reset And/Or logic to Or\n     *\n     * @param    integer    $pIndex        Rule index in the ruleset array\n     * @return    PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function deleteRule($pIndex)\n    {\n        if (isset($this->ruleset[$pIndex])) {\n            unset($this->ruleset[$pIndex]);\n            //    If we've just deleted down to a single rule, then reset And/Or joining to Or\n            if (count($this->ruleset) <= 1) {\n                $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Delete all AutoFilter Column Rules\n     *\n     * @return    PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function clearRules()\n    {\n        $this->ruleset = array();\n        $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR);\n\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                if ($key == 'parent') {\n                    //    Detach from autofilter parent\n                    $this->$key = null;\n                } else {\n                    $this->$key = clone $value;\n                }\n            } elseif ((is_array($value)) && ($key == 'ruleset')) {\n                //    The columns array of PHPExcel_Worksheet_AutoFilter objects\n                $this->$key = array();\n                foreach ($value as $k => $v) {\n                    $this->$key[$k] = clone $v;\n                    // attach the new cloned Rule to this new cloned Autofilter Cloned object\n                    $this->$key[$k]->setParent($this);\n                }\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/AutoFilter.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_AutoFilter\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_AutoFilter\n{\n    /**\n     * Autofilter Worksheet\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $workSheet;\n\n\n    /**\n     * Autofilter Range\n     *\n     * @var string\n     */\n    private $range = '';\n\n\n    /**\n     * Autofilter Column Ruleset\n     *\n     * @var array of PHPExcel_Worksheet_AutoFilter_Column\n     */\n    private $columns = array();\n\n\n    /**\n     * Create a new PHPExcel_Worksheet_AutoFilter\n     *\n     *    @param    string        $pRange        Cell range (i.e. A1:E10)\n     * @param PHPExcel_Worksheet $pSheet\n     */\n    public function __construct($pRange = '', PHPExcel_Worksheet $pSheet = null)\n    {\n        $this->range = $pRange;\n        $this->workSheet = $pSheet;\n    }\n\n    /**\n     * Get AutoFilter Parent Worksheet\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function getParent()\n    {\n        return $this->workSheet;\n    }\n\n    /**\n     * Set AutoFilter Parent Worksheet\n     *\n     * @param PHPExcel_Worksheet $pSheet\n     * @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function setParent(PHPExcel_Worksheet $pSheet = null)\n    {\n        $this->workSheet = $pSheet;\n\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter Range\n     *\n     * @return string\n     */\n    public function getRange()\n    {\n        return $this->range;\n    }\n\n    /**\n     *    Set AutoFilter Range\n     *\n     *    @param    string        $pRange        Cell range (i.e. A1:E10)\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function setRange($pRange = '')\n    {\n        // Uppercase coordinate\n        $cellAddress = explode('!', strtoupper($pRange));\n        if (count($cellAddress) > 1) {\n            list($worksheet, $pRange) = $cellAddress;\n        }\n\n        if (strpos($pRange, ':') !== false) {\n            $this->range = $pRange;\n        } elseif (empty($pRange)) {\n            $this->range = '';\n        } else {\n            throw new PHPExcel_Exception('Autofilter must be set on a range of cells.');\n        }\n\n        if (empty($pRange)) {\n            //    Discard all column rules\n            $this->columns = array();\n        } else {\n            //    Discard any column rules that are no longer valid within this range\n            list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range);\n            foreach ($this->columns as $key => $value) {\n                $colIndex = PHPExcel_Cell::columnIndexFromString($key);\n                if (($rangeStart[0] > $colIndex) || ($rangeEnd[0] < $colIndex)) {\n                    unset($this->columns[$key]);\n                }\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get all AutoFilter Columns\n     *\n     * @throws    PHPExcel_Exception\n     * @return array of PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function getColumns()\n    {\n        return $this->columns;\n    }\n\n    /**\n     * Validate that the specified column is in the AutoFilter range\n     *\n     * @param    string    $column            Column name (e.g. A)\n     * @throws    PHPExcel_Exception\n     * @return    integer    The column offset within the autofilter range\n     */\n    public function testColumnInRange($column)\n    {\n        if (empty($this->range)) {\n            throw new PHPExcel_Exception(\"No autofilter range is defined.\");\n        }\n\n        $columnIndex = PHPExcel_Cell::columnIndexFromString($column);\n        list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range);\n        if (($rangeStart[0] > $columnIndex) || ($rangeEnd[0] < $columnIndex)) {\n            throw new PHPExcel_Exception(\"Column is outside of current autofilter range.\");\n        }\n\n        return $columnIndex - $rangeStart[0];\n    }\n\n    /**\n     * Get a specified AutoFilter Column Offset within the defined AutoFilter range\n     *\n     * @param    string    $pColumn        Column name (e.g. A)\n     * @throws    PHPExcel_Exception\n     * @return integer    The offset of the specified column within the autofilter range\n     */\n    public function getColumnOffset($pColumn)\n    {\n        return $this->testColumnInRange($pColumn);\n    }\n\n    /**\n     * Get a specified AutoFilter Column\n     *\n     * @param    string    $pColumn        Column name (e.g. A)\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function getColumn($pColumn)\n    {\n        $this->testColumnInRange($pColumn);\n\n        if (!isset($this->columns[$pColumn])) {\n            $this->columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this);\n        }\n\n        return $this->columns[$pColumn];\n    }\n\n    /**\n     * Get a specified AutoFilter Column by it's offset\n     *\n     * @param    integer    $pColumnOffset        Column offset within range (starting from 0)\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet_AutoFilter_Column\n     */\n    public function getColumnByOffset($pColumnOffset = 0)\n    {\n        list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range);\n        $pColumn = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $pColumnOffset - 1);\n\n        return $this->getColumn($pColumn);\n    }\n\n    /**\n     *    Set AutoFilter\n     *\n     *    @param    PHPExcel_Worksheet_AutoFilter_Column|string        $pColumn\n     *            A simple string containing a Column ID like 'A' is permitted\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function setColumn($pColumn)\n    {\n        if ((is_string($pColumn)) && (!empty($pColumn))) {\n            $column = $pColumn;\n        } elseif (is_object($pColumn) && ($pColumn instanceof PHPExcel_Worksheet_AutoFilter_Column)) {\n            $column = $pColumn->getColumnIndex();\n        } else {\n            throw new PHPExcel_Exception(\"Column is not within the autofilter range.\");\n        }\n        $this->testColumnInRange($column);\n\n        if (is_string($pColumn)) {\n            $this->columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this);\n        } elseif (is_object($pColumn) && ($pColumn instanceof PHPExcel_Worksheet_AutoFilter_Column)) {\n            $pColumn->setParent($this);\n            $this->columns[$column] = $pColumn;\n        }\n        ksort($this->columns);\n\n        return $this;\n    }\n\n    /**\n     * Clear a specified AutoFilter Column\n     *\n     * @param    string  $pColumn    Column name (e.g. A)\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function clearColumn($pColumn)\n    {\n        $this->testColumnInRange($pColumn);\n\n        if (isset($this->columns[$pColumn])) {\n            unset($this->columns[$pColumn]);\n        }\n\n        return $this;\n    }\n\n    /**\n     *    Shift an AutoFilter Column Rule to a different column\n     *\n     *    Note: This method bypasses validation of the destination column to ensure it is within this AutoFilter range.\n     *        Nor does it verify whether any column rule already exists at $toColumn, but will simply overrideany existing value.\n     *        Use with caution.\n     *\n     *    @param    string    $fromColumn        Column name (e.g. A)\n     *    @param    string    $toColumn        Column name (e.g. B)\n     *    @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function shiftColumn($fromColumn = null, $toColumn = null)\n    {\n        $fromColumn = strtoupper($fromColumn);\n        $toColumn = strtoupper($toColumn);\n\n        if (($fromColumn !== null) && (isset($this->columns[$fromColumn])) && ($toColumn !== null)) {\n            $this->columns[$fromColumn]->setParent();\n            $this->columns[$fromColumn]->setColumnIndex($toColumn);\n            $this->columns[$toColumn] = $this->columns[$fromColumn];\n            $this->columns[$toColumn]->setParent($this);\n            unset($this->columns[$fromColumn]);\n\n            ksort($this->columns);\n        }\n\n        return $this;\n    }\n\n\n    /**\n     *    Test if cell value is in the defined set of values\n     *\n     *    @param    mixed        $cellValue\n     *    @param    mixed[]        $dataSet\n     *    @return boolean\n     */\n    private static function filterTestInSimpleDataSet($cellValue, $dataSet)\n    {\n        $dataSetValues = $dataSet['filterValues'];\n        $blanks = $dataSet['blanks'];\n        if (($cellValue == '') || ($cellValue === null)) {\n            return $blanks;\n        }\n        return in_array($cellValue, $dataSetValues);\n    }\n\n    /**\n     *    Test if cell value is in the defined set of Excel date values\n     *\n     *    @param    mixed        $cellValue\n     *    @param    mixed[]        $dataSet\n     *    @return boolean\n     */\n    private static function filterTestInDateGroupSet($cellValue, $dataSet)\n    {\n        $dateSet = $dataSet['filterValues'];\n        $blanks = $dataSet['blanks'];\n        if (($cellValue == '') || ($cellValue === null)) {\n            return $blanks;\n        }\n\n        if (is_numeric($cellValue)) {\n            $dateValue = PHPExcel_Shared_Date::ExcelToPHP($cellValue);\n            if ($cellValue < 1) {\n                //    Just the time part\n                $dtVal = date('His', $dateValue);\n                $dateSet = $dateSet['time'];\n            } elseif ($cellValue == floor($cellValue)) {\n                //    Just the date part\n                $dtVal = date('Ymd', $dateValue);\n                $dateSet = $dateSet['date'];\n            } else {\n                //    date and time parts\n                $dtVal = date('YmdHis', $dateValue);\n                $dateSet = $dateSet['dateTime'];\n            }\n            foreach ($dateSet as $dateValue) {\n                //    Use of substr to extract value at the appropriate group level\n                if (substr($dtVal, 0, strlen($dateValue)) == $dateValue) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    /**\n     *    Test if cell value is within a set of values defined by a ruleset\n     *\n     *    @param    mixed        $cellValue\n     *    @param    mixed[]        $ruleSet\n     *    @return boolean\n     */\n    private static function filterTestInCustomDataSet($cellValue, $ruleSet)\n    {\n        $dataSet = $ruleSet['filterRules'];\n        $join = $ruleSet['join'];\n        $customRuleForBlanks = isset($ruleSet['customRuleForBlanks']) ? $ruleSet['customRuleForBlanks'] : false;\n\n        if (!$customRuleForBlanks) {\n            //    Blank cells are always ignored, so return a FALSE\n            if (($cellValue == '') || ($cellValue === null)) {\n                return false;\n            }\n        }\n        $returnVal = ($join == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND);\n        foreach ($dataSet as $rule) {\n            if (is_numeric($rule['value'])) {\n                //    Numeric values are tested using the appropriate operator\n                switch ($rule['operator']) {\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL:\n                        $retVal    = ($cellValue == $rule['value']);\n                        break;\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL:\n                        $retVal    = ($cellValue != $rule['value']);\n                        break;\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN:\n                        $retVal    = ($cellValue > $rule['value']);\n                        break;\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL:\n                        $retVal    = ($cellValue >= $rule['value']);\n                        break;\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN:\n                        $retVal    = ($cellValue < $rule['value']);\n                        break;\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL:\n                        $retVal    = ($cellValue <= $rule['value']);\n                        break;\n                }\n            } elseif ($rule['value'] == '') {\n                switch ($rule['operator']) {\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL:\n                        $retVal    = (($cellValue == '') || ($cellValue === null));\n                        break;\n                    case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL:\n                        $retVal    = (($cellValue != '') && ($cellValue !== null));\n                        break;\n                    default:\n                        $retVal    = true;\n                        break;\n                }\n            } else {\n                //    String values are always tested for equality, factoring in for wildcards (hence a regexp test)\n                $retVal    = preg_match('/^'.$rule['value'].'$/i', $cellValue);\n            }\n            //    If there are multiple conditions, then we need to test both using the appropriate join operator\n            switch ($join) {\n                case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR:\n                    $returnVal = $returnVal || $retVal;\n                    //    Break as soon as we have a TRUE match for OR joins,\n                    //        to avoid unnecessary additional code execution\n                    if ($returnVal) {\n                        return $returnVal;\n                    }\n                    break;\n                case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND:\n                    $returnVal = $returnVal && $retVal;\n                    break;\n            }\n        }\n\n        return $returnVal;\n    }\n\n    /**\n     *    Test if cell date value is matches a set of values defined by a set of months\n     *\n     *    @param    mixed        $cellValue\n     *    @param    mixed[]        $monthSet\n     *    @return boolean\n     */\n    private static function filterTestInPeriodDateSet($cellValue, $monthSet)\n    {\n        //    Blank cells are always ignored, so return a FALSE\n        if (($cellValue == '') || ($cellValue === null)) {\n            return false;\n        }\n\n        if (is_numeric($cellValue)) {\n            $dateValue = date('m', PHPExcel_Shared_Date::ExcelToPHP($cellValue));\n            if (in_array($dateValue, $monthSet)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     *    Search/Replace arrays to convert Excel wildcard syntax to a regexp syntax for preg_matching\n     *\n     *    @var    array\n     */\n    private static $fromReplace = array('\\*', '\\?', '~~', '~.*', '~.?');\n    private static $toReplace   = array('.*', '.',  '~',  '\\*',  '\\?');\n\n\n    /**\n     *    Convert a dynamic rule daterange to a custom filter range expression for ease of calculation\n     *\n     *    @param    string                                        $dynamicRuleType\n     *    @param    PHPExcel_Worksheet_AutoFilter_Column        &$filterColumn\n     *    @return mixed[]\n     */\n    private function dynamicFilterDateRange($dynamicRuleType, &$filterColumn)\n    {\n        $rDateType = PHPExcel_Calculation_Functions::getReturnDateType();\n        PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC);\n        $val = $maxVal = null;\n\n        $ruleValues = array();\n        $baseDate = PHPExcel_Calculation_DateTime::DATENOW();\n        //    Calculate start/end dates for the required date range based on current date\n        switch ($dynamicRuleType) {\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK:\n                $baseDate = strtotime('-7 days', $baseDate);\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK:\n                $baseDate = strtotime('-7 days', $baseDate);\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH:\n                $baseDate = strtotime('-1 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH:\n                $baseDate = strtotime('+1 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER:\n                $baseDate = strtotime('-3 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER:\n                $baseDate = strtotime('+3 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR:\n                $baseDate = strtotime('-1 year', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR:\n                $baseDate = strtotime('+1 year', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n        }\n\n        switch ($dynamicRuleType) {\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TODAY:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW:\n                $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(strtotime('+1 day', $baseDate));\n                $val = (int) PHPExcel_Shared_Date::PHPToExcel($baseDate);\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE:\n                $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(strtotime('+1 day', $baseDate));\n                $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1, date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR:\n                $maxVal = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 31, 12, date('Y', $baseDate)));\n                ++$maxVal;\n                $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1, date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER:\n                $thisMonth = date('m', $baseDate);\n                $thisQuarter = floor(--$thisMonth / 3);\n                $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(gmmktime(0, 0, 0, date('t', $baseDate), (1+$thisQuarter)*3, date('Y', $baseDate)));\n                ++$maxVal;\n                $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1+$thisQuarter*3, date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH:\n                $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(gmmktime(0, 0, 0, date('t', $baseDate), date('m', $baseDate), date('Y', $baseDate)));\n                ++$maxVal;\n                $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate)));\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK:\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK:\n                $dayOfWeek = date('w', $baseDate);\n                $val = (int) PHPExcel_Shared_Date::PHPToExcel($baseDate) - $dayOfWeek;\n                $maxVal = $val + 7;\n                break;\n        }\n\n        switch ($dynamicRuleType) {\n            //    Adjust Today dates for Yesterday and Tomorrow\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY:\n                --$maxVal;\n                --$val;\n                break;\n            case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW:\n                ++$maxVal;\n                ++$val;\n                break;\n        }\n\n        //    Set the filter column rule attributes ready for writing\n        $filterColumn->setAttributes(array('val' => $val, 'maxVal' => $maxVal));\n\n        //    Set the rules for identifying rows for hide/show\n        $ruleValues[] = array('operator' => PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, 'value' => $val);\n        $ruleValues[] = array('operator' => PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN, 'value' => $maxVal);\n        PHPExcel_Calculation_Functions::setReturnDateType($rDateType);\n\n        return array('method' => 'filterTestInCustomDataSet', 'arguments' => array('filterRules' => $ruleValues, 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND));\n    }\n\n    private function calculateTopTenValue($columnID, $startRow, $endRow, $ruleType, $ruleValue)\n    {\n        $range = $columnID.$startRow.':'.$columnID.$endRow;\n        $dataValues = PHPExcel_Calculation_Functions::flattenArray($this->workSheet->rangeToArray($range, null, true, false));\n\n        $dataValues = array_filter($dataValues);\n        if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) {\n            rsort($dataValues);\n        } else {\n            sort($dataValues);\n        }\n\n        return array_pop(array_slice($dataValues, 0, $ruleValue));\n    }\n\n    /**\n     *    Apply the AutoFilter rules to the AutoFilter Range\n     *\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function showHideRows()\n    {\n        list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range);\n\n        //    The heading row should always be visible\n//        echo 'AutoFilter Heading Row ', $rangeStart[1],' is always SHOWN',PHP_EOL;\n        $this->workSheet->getRowDimension($rangeStart[1])->setVisible(true);\n\n        $columnFilterTests = array();\n        foreach ($this->columns as $columnID => $filterColumn) {\n            $rules = $filterColumn->getRules();\n            switch ($filterColumn->getFilterType()) {\n                case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER:\n                    $ruleValues = array();\n                    //    Build a list of the filter value selections\n                    foreach ($rules as $rule) {\n                        $ruleType = $rule->getRuleType();\n                        $ruleValues[] = $rule->getValue();\n                    }\n                    //    Test if we want to include blanks in our filter criteria\n                    $blanks = false;\n                    $ruleDataSet = array_filter($ruleValues);\n                    if (count($ruleValues) != count($ruleDataSet)) {\n                        $blanks = true;\n                    }\n                    if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER) {\n                        //    Filter on absolute values\n                        $columnFilterTests[$columnID] = array(\n                            'method' => 'filterTestInSimpleDataSet',\n                            'arguments' => array('filterValues' => $ruleDataSet, 'blanks' => $blanks)\n                        );\n                    } else {\n                        //    Filter on date group values\n                        $arguments = array(\n                            'date' => array(),\n                            'time' => array(),\n                            'dateTime' => array(),\n                        );\n                        foreach ($ruleDataSet as $ruleValue) {\n                            $date = $time = '';\n                            if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR])) &&\n                                ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR] !== '')) {\n                                $date .= sprintf('%04d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]);\n                            }\n                            if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH])) &&\n                                ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH] != '')) {\n                                $date .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]);\n                            }\n                            if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY])) &&\n                                ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY] !== '')) {\n                                $date .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]);\n                            }\n                            if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR])) &&\n                                ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR] !== '')) {\n                                $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]);\n                            }\n                            if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE])) &&\n                                ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE] !== '')) {\n                                $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]);\n                            }\n                            if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND])) &&\n                                ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND] !== '')) {\n                                $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]);\n                            }\n                            $dateTime = $date . $time;\n                            $arguments['date'][] = $date;\n                            $arguments['time'][] = $time;\n                            $arguments['dateTime'][] = $dateTime;\n                        }\n                        //    Remove empty elements\n                        $arguments['date'] = array_filter($arguments['date']);\n                        $arguments['time'] = array_filter($arguments['time']);\n                        $arguments['dateTime'] = array_filter($arguments['dateTime']);\n                        $columnFilterTests[$columnID] = array(\n                            'method' => 'filterTestInDateGroupSet',\n                            'arguments' => array('filterValues' => $arguments, 'blanks' => $blanks)\n                        );\n                    }\n                    break;\n                case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER:\n                    $customRuleForBlanks = false;\n                    $ruleValues = array();\n                    //    Build a list of the filter value selections\n                    foreach ($rules as $rule) {\n                        $ruleType = $rule->getRuleType();\n                        $ruleValue = $rule->getValue();\n                        if (!is_numeric($ruleValue)) {\n                            //    Convert to a regexp allowing for regexp reserved characters, wildcards and escaped wildcards\n                            $ruleValue = preg_quote($ruleValue);\n                            $ruleValue = str_replace(self::$fromReplace, self::$toReplace, $ruleValue);\n                            if (trim($ruleValue) == '') {\n                                $customRuleForBlanks = true;\n                                $ruleValue = trim($ruleValue);\n                            }\n                        }\n                        $ruleValues[] = array('operator' => $rule->getOperator(), 'value' => $ruleValue);\n                    }\n                    $join = $filterColumn->getJoin();\n                    $columnFilterTests[$columnID] = array(\n                        'method' => 'filterTestInCustomDataSet',\n                        'arguments' => array('filterRules' => $ruleValues, 'join' => $join, 'customRuleForBlanks' => $customRuleForBlanks)\n                    );\n                    break;\n                case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER:\n                    $ruleValues = array();\n                    foreach ($rules as $rule) {\n                        //    We should only ever have one Dynamic Filter Rule anyway\n                        $dynamicRuleType = $rule->getGrouping();\n                        if (($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) ||\n                            ($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE)) {\n                            //    Number (Average) based\n                            //    Calculate the average\n                            $averageFormula = '=AVERAGE('.$columnID.($rangeStart[1]+1).':'.$columnID.$rangeEnd[1].')';\n                            $average = PHPExcel_Calculation::getInstance()->calculateFormula($averageFormula, null, $this->workSheet->getCell('A1'));\n                            //    Set above/below rule based on greaterThan or LessTan\n                            $operator = ($dynamicRuleType === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE)\n                                ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN\n                                : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN;\n                            $ruleValues[] = array('operator' => $operator,\n                                                   'value' => $average\n                                                 );\n                            $columnFilterTests[$columnID] = array(\n                                'method' => 'filterTestInCustomDataSet',\n                                'arguments' => array('filterRules' => $ruleValues, 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR)\n                            );\n                        } else {\n                            //    Date based\n                            if ($dynamicRuleType{0} == 'M' || $dynamicRuleType{0} == 'Q') {\n                                //    Month or Quarter\n                                sscanf($dynamicRuleType, '%[A-Z]%d', $periodType, $period);\n                                if ($periodType == 'M') {\n                                    $ruleValues = array($period);\n                                } else {\n                                    --$period;\n                                    $periodEnd = (1+$period)*3;\n                                    $periodStart = 1+$period*3;\n                                    $ruleValues = range($periodStart, $periodEnd);\n                                }\n                                $columnFilterTests[$columnID] = array(\n                                    'method' => 'filterTestInPeriodDateSet',\n                                    'arguments' => $ruleValues\n                                );\n                                $filterColumn->setAttributes(array());\n                            } else {\n                                //    Date Range\n                                $columnFilterTests[$columnID] = $this->dynamicFilterDateRange($dynamicRuleType, $filterColumn);\n                                break;\n                            }\n                        }\n                    }\n                    break;\n                case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER:\n                    $ruleValues = array();\n                    $dataRowCount = $rangeEnd[1] - $rangeStart[1];\n                    foreach ($rules as $rule) {\n                        //    We should only ever have one Dynamic Filter Rule anyway\n                        $toptenRuleType = $rule->getGrouping();\n                        $ruleValue = $rule->getValue();\n                        $ruleOperator = $rule->getOperator();\n                    }\n                    if ($ruleOperator === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) {\n                        $ruleValue = floor($ruleValue * ($dataRowCount / 100));\n                    }\n                    if ($ruleValue < 1) {\n                        $ruleValue = 1;\n                    }\n                    if ($ruleValue > 500) {\n                        $ruleValue = 500;\n                    }\n\n                    $maxVal = $this->calculateTopTenValue($columnID, $rangeStart[1]+1, $rangeEnd[1], $toptenRuleType, $ruleValue);\n\n                    $operator = ($toptenRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP)\n                        ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL\n                        : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL;\n                    $ruleValues[] = array('operator' => $operator, 'value' => $maxVal);\n                    $columnFilterTests[$columnID] = array(\n                        'method' => 'filterTestInCustomDataSet',\n                        'arguments' => array('filterRules' => $ruleValues, 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR)\n                    );\n                    $filterColumn->setAttributes(array('maxVal' => $maxVal));\n                    break;\n            }\n        }\n\n//        echo 'Column Filter Test CRITERIA',PHP_EOL;\n//        var_dump($columnFilterTests);\n//\n        //    Execute the column tests for each row in the autoFilter range to determine show/hide,\n        for ($row = $rangeStart[1]+1; $row <= $rangeEnd[1]; ++$row) {\n//            echo 'Testing Row = ', $row,PHP_EOL;\n            $result = true;\n            foreach ($columnFilterTests as $columnID => $columnFilterTest) {\n//                echo 'Testing cell ', $columnID.$row,PHP_EOL;\n                $cellValue = $this->workSheet->getCell($columnID.$row)->getCalculatedValue();\n//                echo 'Value is ', $cellValue,PHP_EOL;\n                //    Execute the filter test\n                $result = $result &&\n                    call_user_func_array(\n                        array('PHPExcel_Worksheet_AutoFilter', $columnFilterTest['method']),\n                        array($cellValue, $columnFilterTest['arguments'])\n                    );\n//                echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL;\n                //    If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests\n                if (!$result) {\n                    break;\n                }\n            }\n            //    Set show/hide for the row based on the result of the autoFilter result\n//            echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL;\n            $this->workSheet->getRowDimension($row)->setVisible($result);\n        }\n\n        return $this;\n    }\n\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                if ($key == 'workSheet') {\n                    //    Detach from worksheet\n                    $this->{$key} = null;\n                } else {\n                    $this->{$key} = clone $value;\n                }\n            } elseif ((is_array($value)) && ($key == 'columns')) {\n                //    The columns array of PHPExcel_Worksheet_AutoFilter objects\n                $this->{$key} = array();\n                foreach ($value as $k => $v) {\n                    $this->{$key}[$k] = clone $v;\n                    // attach the new cloned Column to this new cloned Autofilter object\n                    $this->{$key}[$k]->setParent($this);\n                }\n            } else {\n                $this->{$key} = $value;\n            }\n        }\n    }\n\n    /**\n     * toString method replicates previous behavior by returning the range if object is\n     *    referenced as a property of its parent.\n     */\n    public function __toString()\n    {\n        return (string) $this->range;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_BaseDrawing\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable\n{\n    /**\n     * Image counter\n     *\n     * @var int\n     */\n    private static $imageCounter = 0;\n\n    /**\n     * Image index\n     *\n     * @var int\n     */\n    private $imageIndex = 0;\n\n    /**\n     * Name\n     *\n     * @var string\n     */\n    protected $name;\n\n    /**\n     * Description\n     *\n     * @var string\n     */\n    protected $description;\n\n    /**\n     * Worksheet\n     *\n     * @var PHPExcel_Worksheet\n     */\n    protected $worksheet;\n\n    /**\n     * Coordinates\n     *\n     * @var string\n     */\n    protected $coordinates;\n\n    /**\n     * Offset X\n     *\n     * @var int\n     */\n    protected $offsetX;\n\n    /**\n     * Offset Y\n     *\n     * @var int\n     */\n    protected $offsetY;\n\n    /**\n     * Width\n     *\n     * @var int\n     */\n    protected $width;\n\n    /**\n     * Height\n     *\n     * @var int\n     */\n    protected $height;\n\n    /**\n     * Proportional resize\n     *\n     * @var boolean\n     */\n    protected $resizeProportional;\n\n    /**\n     * Rotation\n     *\n     * @var int\n     */\n    protected $rotation;\n\n    /**\n     * Shadow\n     *\n     * @var PHPExcel_Worksheet_Drawing_Shadow\n     */\n    protected $shadow;\n\n    /**\n     * Create a new PHPExcel_Worksheet_BaseDrawing\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->name                = '';\n        $this->description        = '';\n        $this->worksheet          = null;\n        $this->coordinates        = 'A1';\n        $this->offsetX            = 0;\n        $this->offsetY            = 0;\n        $this->width              = 0;\n        $this->height             = 0;\n        $this->resizeProportional = true;\n        $this->rotation           = 0;\n        $this->shadow             = new PHPExcel_Worksheet_Drawing_Shadow();\n\n        // Set image index\n        self::$imageCounter++;\n        $this->imageIndex             = self::$imageCounter;\n    }\n\n    /**\n     * Get image index\n     *\n     * @return int\n     */\n    public function getImageIndex()\n    {\n        return $this->imageIndex;\n    }\n\n    /**\n     * Get Name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * Set Name\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setName($pValue = '')\n    {\n        $this->name = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Description\n     *\n     * @return string\n     */\n    public function getDescription()\n    {\n        return $this->description;\n    }\n\n    /**\n     * Set Description\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setDescription($pValue = '')\n    {\n        $this->description = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Worksheet\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function getWorksheet()\n    {\n        return $this->worksheet;\n    }\n\n    /**\n     * Set Worksheet\n     *\n     * @param     PHPExcel_Worksheet     $pValue\n     * @param     bool                $pOverrideOld    If a Worksheet has already been assigned, overwrite it and remove image from old Worksheet?\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setWorksheet(PHPExcel_Worksheet $pValue = null, $pOverrideOld = false)\n    {\n        if (is_null($this->worksheet)) {\n            // Add drawing to PHPExcel_Worksheet\n            $this->worksheet = $pValue;\n            $this->worksheet->getCell($this->coordinates);\n            $this->worksheet->getDrawingCollection()->append($this);\n        } else {\n            if ($pOverrideOld) {\n                // Remove drawing from old PHPExcel_Worksheet\n                $iterator = $this->worksheet->getDrawingCollection()->getIterator();\n\n                while ($iterator->valid()) {\n                    if ($iterator->current()->getHashCode() == $this->getHashCode()) {\n                        $this->worksheet->getDrawingCollection()->offsetUnset($iterator->key());\n                        $this->worksheet = null;\n                        break;\n                    }\n                }\n\n                // Set new PHPExcel_Worksheet\n                $this->setWorksheet($pValue);\n            } else {\n                throw new PHPExcel_Exception(\"A PHPExcel_Worksheet has already been assigned. Drawings can only exist on one PHPExcel_Worksheet.\");\n            }\n        }\n        return $this;\n    }\n\n    /**\n     * Get Coordinates\n     *\n     * @return string\n     */\n    public function getCoordinates()\n    {\n        return $this->coordinates;\n    }\n\n    /**\n     * Set Coordinates\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setCoordinates($pValue = 'A1')\n    {\n        $this->coordinates = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get OffsetX\n     *\n     * @return int\n     */\n    public function getOffsetX()\n    {\n        return $this->offsetX;\n    }\n\n    /**\n     * Set OffsetX\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setOffsetX($pValue = 0)\n    {\n        $this->offsetX = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get OffsetY\n     *\n     * @return int\n     */\n    public function getOffsetY()\n    {\n        return $this->offsetY;\n    }\n\n    /**\n     * Set OffsetY\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setOffsetY($pValue = 0)\n    {\n        $this->offsetY = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Width\n     *\n     * @return int\n     */\n    public function getWidth()\n    {\n        return $this->width;\n    }\n\n    /**\n     * Set Width\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setWidth($pValue = 0)\n    {\n        // Resize proportional?\n        if ($this->resizeProportional && $pValue != 0) {\n            $ratio = $this->height / ($this->width != 0 ? $this->width : 1);\n            $this->height = round($ratio * $pValue);\n        }\n\n        // Set width\n        $this->width = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get Height\n     *\n     * @return int\n     */\n    public function getHeight()\n    {\n        return $this->height;\n    }\n\n    /**\n     * Set Height\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setHeight($pValue = 0)\n    {\n        // Resize proportional?\n        if ($this->resizeProportional && $pValue != 0) {\n            $ratio = $this->width / ($this->height != 0 ? $this->height : 1);\n            $this->width = round($ratio * $pValue);\n        }\n\n        // Set height\n        $this->height = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Set width and height with proportional resize\n     * Example:\n     * <code>\n     * $objDrawing->setResizeProportional(true);\n     * $objDrawing->setWidthAndHeight(160,120);\n     * </code>\n     *\n     * @author Vincent@luo MSN:kele_100@hotmail.com\n     * @param int $width\n     * @param int $height\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setWidthAndHeight($width = 0, $height = 0)\n    {\n        $xratio = $width / ($this->width != 0 ? $this->width : 1);\n        $yratio = $height / ($this->height != 0 ? $this->height : 1);\n        if ($this->resizeProportional && !($width == 0 || $height == 0)) {\n            if (($xratio * $this->height) < $height) {\n                $this->height = ceil($xratio * $this->height);\n                $this->width  = $width;\n            } else {\n                $this->width    = ceil($yratio * $this->width);\n                $this->height    = $height;\n            }\n        } else {\n            $this->width = $width;\n            $this->height = $height;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get ResizeProportional\n     *\n     * @return boolean\n     */\n    public function getResizeProportional()\n    {\n        return $this->resizeProportional;\n    }\n\n    /**\n     * Set ResizeProportional\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setResizeProportional($pValue = true)\n    {\n        $this->resizeProportional = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Rotation\n     *\n     * @return int\n     */\n    public function getRotation()\n    {\n        return $this->rotation;\n    }\n\n    /**\n     * Set Rotation\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setRotation($pValue = 0)\n    {\n        $this->rotation = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Shadow\n     *\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function getShadow()\n    {\n        return $this->shadow;\n    }\n\n    /**\n     * Set Shadow\n     *\n     * @param     PHPExcel_Worksheet_Drawing_Shadow $pValue\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_BaseDrawing\n     */\n    public function setShadow(PHPExcel_Worksheet_Drawing_Shadow $pValue = null)\n    {\n           $this->shadow = $pValue;\n           return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->name .\n            $this->description .\n            $this->worksheet->getHashCode() .\n            $this->coordinates .\n            $this->offsetX .\n            $this->offsetY .\n            $this->width .\n            $this->height .\n            $this->rotation .\n            $this->shadow->getHashCode() .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_CellIterator\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Worksheet_CellIterator\n{\n    /**\n     * PHPExcel_Worksheet to iterate\n     *\n     * @var PHPExcel_Worksheet\n     */\n    protected $subject;\n\n    /**\n     * Current iterator position\n     *\n     * @var mixed\n     */\n    protected $position = null;\n\n    /**\n     * Iterate only existing cells\n     *\n     * @var boolean\n     */\n    protected $onlyExistingCells = false;\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->subject);\n    }\n\n    /**\n     * Get loop only existing cells\n     *\n     * @return boolean\n     */\n    public function getIterateOnlyExistingCells()\n    {\n        return $this->onlyExistingCells;\n    }\n\n    /**\n     * Validate start/end values for \"IterateOnlyExistingCells\" mode, and adjust if necessary\n     *\n     * @throws PHPExcel_Exception\n     */\n    abstract protected function adjustForExistingOnlyRange();\n\n    /**\n     * Set the iterator to loop only existing cells\n     *\n     * @param    boolean        $value\n     * @throws PHPExcel_Exception\n     */\n    public function setIterateOnlyExistingCells($value = true)\n    {\n        $this->onlyExistingCells = (boolean) $value;\n\n        $this->adjustForExistingOnlyRange();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/Column.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_Column\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_Column\n{\n    /**\n     * PHPExcel_Worksheet\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $parent;\n\n    /**\n     * Column index\n     *\n     * @var string\n     */\n    private $columnIndex;\n\n    /**\n     * Create a new column\n     *\n     * @param PHPExcel_Worksheet     $parent\n     * @param string                $columnIndex\n     */\n    public function __construct(PHPExcel_Worksheet $parent = null, $columnIndex = 'A')\n    {\n        // Set parent and column index\n        $this->parent         = $parent;\n        $this->columnIndex = $columnIndex;\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->parent);\n    }\n\n    /**\n     * Get column index\n     *\n     * @return string\n     */\n    public function getColumnIndex()\n    {\n        return $this->columnIndex;\n    }\n\n    /**\n     * Get cell iterator\n     *\n     * @param    integer                $startRow        The row number at which to start iterating\n     * @param    integer                $endRow            Optionally, the row number at which to stop iterating\n     * @return PHPExcel_Worksheet_CellIterator\n     */\n    public function getCellIterator($startRow = 1, $endRow = null)\n    {\n        return new PHPExcel_Worksheet_ColumnCellIterator($this->parent, $this->columnIndex, $startRow, $endRow);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/ColumnCellIterator.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_ColumnCellIterator\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_ColumnCellIterator extends PHPExcel_Worksheet_CellIterator implements Iterator\n{\n    /**\n     * Column index\n     *\n     * @var string\n     */\n    protected $columnIndex;\n\n    /**\n     * Start position\n     *\n     * @var int\n     */\n    protected $startRow = 1;\n\n    /**\n     * End position\n     *\n     * @var int\n     */\n    protected $endRow = 1;\n\n    /**\n     * Create a new row iterator\n     *\n     * @param    PHPExcel_Worksheet    $subject        The worksheet to iterate over\n     * @param   string              $columnIndex    The column that we want to iterate\n     * @param    integer                $startRow        The row number at which to start iterating\n     * @param    integer                $endRow            Optionally, the row number at which to stop iterating\n     */\n    public function __construct(PHPExcel_Worksheet $subject = null, $columnIndex = 'A', $startRow = 1, $endRow = null)\n    {\n        // Set subject\n        $this->subject = $subject;\n        $this->columnIndex = PHPExcel_Cell::columnIndexFromString($columnIndex) - 1;\n        $this->resetEnd($endRow);\n        $this->resetStart($startRow);\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->subject);\n    }\n\n    /**\n     * (Re)Set the start row and the current row pointer\n     *\n     * @param integer    $startRow    The row number at which to start iterating\n     * @return PHPExcel_Worksheet_ColumnCellIterator\n     * @throws PHPExcel_Exception\n     */\n    public function resetStart($startRow = 1)\n    {\n        $this->startRow = $startRow;\n        $this->adjustForExistingOnlyRange();\n        $this->seek($startRow);\n\n        return $this;\n    }\n\n    /**\n     * (Re)Set the end row\n     *\n     * @param integer    $endRow    The row number at which to stop iterating\n     * @return PHPExcel_Worksheet_ColumnCellIterator\n     * @throws PHPExcel_Exception\n     */\n    public function resetEnd($endRow = null)\n    {\n        $this->endRow = ($endRow) ? $endRow : $this->subject->getHighestRow();\n        $this->adjustForExistingOnlyRange();\n\n        return $this;\n    }\n\n    /**\n     * Set the row pointer to the selected row\n     *\n     * @param integer    $row    The row number to set the current pointer at\n     * @return PHPExcel_Worksheet_ColumnCellIterator\n     * @throws PHPExcel_Exception\n     */\n    public function seek($row = 1)\n    {\n        if (($row < $this->startRow) || ($row > $this->endRow)) {\n            throw new PHPExcel_Exception(\"Row $row is out of range ({$this->startRow} - {$this->endRow})\");\n        } elseif ($this->onlyExistingCells && !($this->subject->cellExistsByColumnAndRow($this->columnIndex, $row))) {\n            throw new PHPExcel_Exception('In \"IterateOnlyExistingCells\" mode and Cell does not exist');\n        }\n        $this->position = $row;\n\n        return $this;\n    }\n\n    /**\n     * Rewind the iterator to the starting row\n     */\n    public function rewind()\n    {\n        $this->position = $this->startRow;\n    }\n\n    /**\n     * Return the current cell in this worksheet column\n     *\n     * @return PHPExcel_Worksheet_Row\n     */\n    public function current()\n    {\n        return $this->subject->getCellByColumnAndRow($this->columnIndex, $this->position);\n    }\n\n    /**\n     * Return the current iterator key\n     *\n     * @return int\n     */\n    public function key()\n    {\n        return $this->position;\n    }\n\n    /**\n     * Set the iterator to its next value\n     */\n    public function next()\n    {\n        do {\n            ++$this->position;\n        } while (($this->onlyExistingCells) &&\n            (!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->position)) &&\n            ($this->position <= $this->endRow));\n    }\n\n    /**\n     * Set the iterator to its previous value\n     */\n    public function prev()\n    {\n        if ($this->position <= $this->startRow) {\n            throw new PHPExcel_Exception(\"Row is already at the beginning of range ({$this->startRow} - {$this->endRow})\");\n        }\n\n        do {\n            --$this->position;\n        } while (($this->onlyExistingCells) &&\n            (!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->position)) &&\n            ($this->position >= $this->startRow));\n    }\n\n    /**\n     * Indicate if more rows exist in the worksheet range of rows that we're iterating\n     *\n     * @return boolean\n     */\n    public function valid()\n    {\n        return $this->position <= $this->endRow;\n    }\n\n    /**\n     * Validate start/end values for \"IterateOnlyExistingCells\" mode, and adjust if necessary\n     *\n     * @throws PHPExcel_Exception\n     */\n    protected function adjustForExistingOnlyRange()\n    {\n        if ($this->onlyExistingCells) {\n            while ((!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->startRow)) &&\n                ($this->startRow <= $this->endRow)) {\n                ++$this->startRow;\n            }\n            if ($this->startRow > $this->endRow) {\n                throw new PHPExcel_Exception('No cells exist within the specified range');\n            }\n            while ((!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->endRow)) &&\n                ($this->endRow >= $this->startRow)) {\n                --$this->endRow;\n            }\n            if ($this->endRow < $this->startRow) {\n                throw new PHPExcel_Exception('No cells exist within the specified range');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_ColumnDimension\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_ColumnDimension extends PHPExcel_Worksheet_Dimension\n{\n    /**\n     * Column index\n     *\n     * @var int\n     */\n    private $columnIndex;\n\n    /**\n     * Column width\n     *\n     * When this is set to a negative value, the column width should be ignored by IWriter\n     *\n     * @var double\n     */\n    private $width = -1;\n\n    /**\n     * Auto size?\n     *\n     * @var bool\n     */\n    private $autoSize = false;\n\n    /**\n     * Create a new PHPExcel_Worksheet_ColumnDimension\n     *\n     * @param string $pIndex Character column index\n     */\n    public function __construct($pIndex = 'A')\n    {\n        // Initialise values\n        $this->columnIndex = $pIndex;\n\n        // set dimension as unformatted by default\n        parent::__construct(0);\n    }\n\n    /**\n     * Get ColumnIndex\n     *\n     * @return string\n     */\n    public function getColumnIndex()\n    {\n        return $this->columnIndex;\n    }\n\n    /**\n     * Set ColumnIndex\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_ColumnDimension\n     */\n    public function setColumnIndex($pValue)\n    {\n        $this->columnIndex = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Width\n     *\n     * @return double\n     */\n    public function getWidth()\n    {\n        return $this->width;\n    }\n\n    /**\n     * Set Width\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_ColumnDimension\n     */\n    public function setWidth($pValue = -1)\n    {\n        $this->width = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Auto Size\n     *\n     * @return bool\n     */\n    public function getAutoSize()\n    {\n        return $this->autoSize;\n    }\n\n    /**\n     * Set Auto Size\n     *\n     * @param bool $pValue\n     * @return PHPExcel_Worksheet_ColumnDimension\n     */\n    public function setAutoSize($pValue = false)\n    {\n        $this->autoSize = $pValue;\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/ColumnIterator.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_ColumnIterator\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_ColumnIterator implements Iterator\n{\n    /**\n     * PHPExcel_Worksheet to iterate\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $subject;\n\n    /**\n     * Current iterator position\n     *\n     * @var int\n     */\n    private $position = 0;\n\n    /**\n     * Start position\n     *\n     * @var int\n     */\n    private $startColumn = 0;\n\n\n    /**\n     * End position\n     *\n     * @var int\n     */\n    private $endColumn = 0;\n\n\n    /**\n     * Create a new column iterator\n     *\n     * @param    PHPExcel_Worksheet    $subject    The worksheet to iterate over\n     * @param    string                $startColumn    The column address at which to start iterating\n     * @param    string                $endColumn        Optionally, the column address at which to stop iterating\n     */\n    public function __construct(PHPExcel_Worksheet $subject = null, $startColumn = 'A', $endColumn = null)\n    {\n        // Set subject\n        $this->subject = $subject;\n        $this->resetEnd($endColumn);\n        $this->resetStart($startColumn);\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->subject);\n    }\n\n    /**\n     * (Re)Set the start column and the current column pointer\n     *\n     * @param integer    $startColumn    The column address at which to start iterating\n     * @return PHPExcel_Worksheet_ColumnIterator\n     * @throws PHPExcel_Exception\n     */\n    public function resetStart($startColumn = 'A')\n    {\n        $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1;\n        if ($startColumnIndex > PHPExcel_Cell::columnIndexFromString($this->subject->getHighestColumn()) - 1) {\n            throw new PHPExcel_Exception(\"Start column ({$startColumn}) is beyond highest column ({$this->subject->getHighestColumn()})\");\n        }\n\n        $this->startColumn = $startColumnIndex;\n        if ($this->endColumn < $this->startColumn) {\n            $this->endColumn = $this->startColumn;\n        }\n        $this->seek($startColumn);\n\n        return $this;\n    }\n\n    /**\n     * (Re)Set the end column\n     *\n     * @param string    $endColumn    The column address at which to stop iterating\n     * @return PHPExcel_Worksheet_ColumnIterator\n     */\n    public function resetEnd($endColumn = null)\n    {\n        $endColumn = ($endColumn) ? $endColumn : $this->subject->getHighestColumn();\n        $this->endColumn = PHPExcel_Cell::columnIndexFromString($endColumn) - 1;\n\n        return $this;\n    }\n\n    /**\n     * Set the column pointer to the selected column\n     *\n     * @param string    $column    The column address to set the current pointer at\n     * @return PHPExcel_Worksheet_ColumnIterator\n     * @throws PHPExcel_Exception\n     */\n    public function seek($column = 'A')\n    {\n        $column = PHPExcel_Cell::columnIndexFromString($column) - 1;\n        if (($column < $this->startColumn) || ($column > $this->endColumn)) {\n            throw new PHPExcel_Exception(\"Column $column is out of range ({$this->startColumn} - {$this->endColumn})\");\n        }\n        $this->position = $column;\n\n        return $this;\n    }\n\n    /**\n     * Rewind the iterator to the starting column\n     */\n    public function rewind()\n    {\n        $this->position = $this->startColumn;\n    }\n\n    /**\n     * Return the current column in this worksheet\n     *\n     * @return PHPExcel_Worksheet_Column\n     */\n    public function current()\n    {\n        return new PHPExcel_Worksheet_Column($this->subject, PHPExcel_Cell::stringFromColumnIndex($this->position));\n    }\n\n    /**\n     * Return the current iterator key\n     *\n     * @return string\n     */\n    public function key()\n    {\n        return PHPExcel_Cell::stringFromColumnIndex($this->position);\n    }\n\n    /**\n     * Set the iterator to its next value\n     */\n    public function next()\n    {\n        ++$this->position;\n    }\n\n    /**\n     * Set the iterator to its previous value\n     *\n     * @throws PHPExcel_Exception\n     */\n    public function prev()\n    {\n        if ($this->position <= $this->startColumn) {\n            throw new PHPExcel_Exception(\n                \"Column is already at the beginning of range (\" .\n                PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . \" - \" .\n                PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . \")\"\n            );\n        }\n\n        --$this->position;\n    }\n\n    /**\n     * Indicate if more columns exist in the worksheet range of columns that we're iterating\n     *\n     * @return boolean\n     */\n    public function valid()\n    {\n        return $this->position <= $this->endColumn;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/Dimension.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_Dimension\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Worksheet_Dimension\n{\n    /**\n     * Visible?\n     *\n     * @var bool\n     */\n    private $visible = true;\n\n    /**\n     * Outline level\n     *\n     * @var int\n     */\n    private $outlineLevel = 0;\n\n    /**\n     * Collapsed\n     *\n     * @var bool\n     */\n    private $collapsed = false;\n\n    /**\n     * Index to cellXf. Null value means row has no explicit cellXf format.\n     *\n     * @var int|null\n     */\n    private $xfIndex;\n\n    /**\n     * Create a new PHPExcel_Worksheet_Dimension\n     *\n     * @param int $pIndex Numeric row index\n     */\n    public function __construct($initialValue = null)\n    {\n        // set dimension as unformatted by default\n        $this->xfIndex = $initialValue;\n    }\n\n    /**\n     * Get Visible\n     *\n     * @return bool\n     */\n    public function getVisible()\n    {\n        return $this->visible;\n    }\n\n    /**\n     * Set Visible\n     *\n     * @param bool $pValue\n     * @return PHPExcel_Worksheet_Dimension\n     */\n    public function setVisible($pValue = true)\n    {\n        $this->visible = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Outline Level\n     *\n     * @return int\n     */\n    public function getOutlineLevel()\n    {\n        return $this->outlineLevel;\n    }\n\n    /**\n     * Set Outline Level\n     *\n     * Value must be between 0 and 7\n     *\n     * @param int $pValue\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet_Dimension\n     */\n    public function setOutlineLevel($pValue)\n    {\n        if ($pValue < 0 || $pValue > 7) {\n            throw new PHPExcel_Exception(\"Outline level must range between 0 and 7.\");\n        }\n\n        $this->outlineLevel = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Collapsed\n     *\n     * @return bool\n     */\n    public function getCollapsed()\n    {\n        return $this->collapsed;\n    }\n\n    /**\n     * Set Collapsed\n     *\n     * @param bool $pValue\n     * @return PHPExcel_Worksheet_Dimension\n     */\n    public function setCollapsed($pValue = true)\n    {\n        $this->collapsed = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get index to cellXf\n     *\n     * @return int\n     */\n    public function getXfIndex()\n    {\n        return $this->xfIndex;\n    }\n\n    /**\n     * Set index to cellXf\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_Dimension\n     */\n    public function setXfIndex($pValue = 0)\n    {\n        $this->xfIndex = $pValue;\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_Drawing_Shadow\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet_Drawing\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_Drawing_Shadow implements PHPExcel_IComparable\n{\n    /* Shadow alignment */\n    const SHADOW_BOTTOM       = 'b';\n    const SHADOW_BOTTOM_LEFT  = 'bl';\n    const SHADOW_BOTTOM_RIGHT = 'br';\n    const SHADOW_CENTER       = 'ctr';\n    const SHADOW_LEFT         = 'l';\n    const SHADOW_TOP          = 't';\n    const SHADOW_TOP_LEFT     = 'tl';\n    const SHADOW_TOP_RIGHT    = 'tr';\n\n    /**\n     * Visible\n     *\n     * @var boolean\n     */\n    private $visible;\n\n    /**\n     * Blur radius\n     *\n     * Defaults to 6\n     *\n     * @var int\n     */\n    private $blurRadius;\n\n    /**\n     * Shadow distance\n     *\n     * Defaults to 2\n     *\n     * @var int\n     */\n    private $distance;\n\n    /**\n     * Shadow direction (in degrees)\n     *\n     * @var int\n     */\n    private $direction;\n\n    /**\n     * Shadow alignment\n     *\n     * @var int\n     */\n    private $alignment;\n\n    /**\n     * Color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    private $color;\n\n    /**\n     * Alpha\n     *\n     * @var int\n     */\n    private $alpha;\n\n    /**\n     * Create a new PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->visible     = false;\n        $this->blurRadius  = 6;\n        $this->distance    = 2;\n        $this->direction   = 0;\n        $this->alignment   = PHPExcel_Worksheet_Drawing_Shadow::SHADOW_BOTTOM_RIGHT;\n        $this->color       = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK);\n        $this->alpha       = 50;\n    }\n\n    /**\n     * Get Visible\n     *\n     * @return boolean\n     */\n    public function getVisible()\n    {\n        return $this->visible;\n    }\n\n    /**\n     * Set Visible\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setVisible($pValue = false)\n    {\n        $this->visible = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Blur radius\n     *\n     * @return int\n     */\n    public function getBlurRadius()\n    {\n        return $this->blurRadius;\n    }\n\n    /**\n     * Set Blur radius\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setBlurRadius($pValue = 6)\n    {\n        $this->blurRadius = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Shadow distance\n     *\n     * @return int\n     */\n    public function getDistance()\n    {\n        return $this->distance;\n    }\n\n    /**\n     * Set Shadow distance\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setDistance($pValue = 2)\n    {\n        $this->distance = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Shadow direction (in degrees)\n     *\n     * @return int\n     */\n    public function getDirection()\n    {\n        return $this->direction;\n    }\n\n    /**\n     * Set Shadow direction (in degrees)\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setDirection($pValue = 0)\n    {\n        $this->direction = $pValue;\n        return $this;\n    }\n\n   /**\n     * Get Shadow alignment\n     *\n     * @return int\n     */\n    public function getAlignment()\n    {\n        return $this->alignment;\n    }\n\n    /**\n     * Set Shadow alignment\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setAlignment($pValue = 0)\n    {\n        $this->alignment = $pValue;\n        return $this;\n    }\n\n   /**\n     * Get Color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getColor()\n    {\n        return $this->color;\n    }\n\n    /**\n     * Set Color\n     *\n     * @param     PHPExcel_Style_Color $pValue\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setColor(PHPExcel_Style_Color $pValue = null)\n    {\n           $this->color = $pValue;\n           return $this;\n    }\n\n   /**\n     * Get Alpha\n     *\n     * @return int\n     */\n    public function getAlpha()\n    {\n        return $this->alpha;\n    }\n\n    /**\n     * Set Alpha\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_Drawing_Shadow\n     */\n    public function setAlpha($pValue = 0)\n    {\n        $this->alpha = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            ($this->visible ? 't' : 'f') .\n            $this->blurRadius .\n            $this->distance .\n            $this->direction .\n            $this->alignment .\n            $this->color->getHashCode() .\n            $this->alpha .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_Drawing\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet_Drawing\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_Drawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable\n{\n    /**\n     * Path\n     *\n     * @var string\n     */\n    private $path;\n\n    /**\n     * Create a new PHPExcel_Worksheet_Drawing\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->path = '';\n\n        // Initialize parent\n        parent::__construct();\n    }\n\n    /**\n     * Get Filename\n     *\n     * @return string\n     */\n    public function getFilename()\n    {\n        return basename($this->path);\n    }\n\n    /**\n     * Get indexed filename (using image index)\n     *\n     * @return string\n     */\n    public function getIndexedFilename()\n    {\n        $fileName = $this->getFilename();\n        $fileName = str_replace(' ', '_', $fileName);\n        return str_replace('.' . $this->getExtension(), '', $fileName) . $this->getImageIndex() . '.' . $this->getExtension();\n    }\n\n    /**\n     * Get Extension\n     *\n     * @return string\n     */\n    public function getExtension()\n    {\n        $exploded = explode(\".\", basename($this->path));\n        return $exploded[count($exploded) - 1];\n    }\n\n    /**\n     * Get Path\n     *\n     * @return string\n     */\n    public function getPath()\n    {\n        return $this->path;\n    }\n\n    /**\n     * Set Path\n     *\n     * @param     string         $pValue            File path\n     * @param     boolean        $pVerifyFile    Verify file\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_Drawing\n     */\n    public function setPath($pValue = '', $pVerifyFile = true)\n    {\n        if ($pVerifyFile) {\n            if (file_exists($pValue)) {\n                $this->path = $pValue;\n\n                if ($this->width == 0 && $this->height == 0) {\n                    // Get width/height\n                    list($this->width, $this->height) = getimagesize($pValue);\n                }\n            } else {\n                throw new PHPExcel_Exception(\"File $pValue not found!\");\n            }\n        } else {\n            $this->path = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->path .\n            parent::getHashCode() .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php",
    "content": "<?php\n/**\n * PHPExcel_Worksheet_HeaderFooter\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not,241 write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n *\n * <code>\n * Header/Footer Formatting Syntax taken from Office Open XML Part 4 - Markup Language Reference, page 1970:\n *\n * There are a number of formatting codes that can be written inline with the actual header / footer text, which\n * affect the formatting in the header or footer.\n *\n * Example: This example shows the text \"Center Bold Header\" on the first line (center section), and the date on\n * the second line (center section).\n *         &CCenter &\"-,Bold\"Bold&\"-,Regular\"Header_x000A_&D\n *\n * General Rules:\n * There is no required order in which these codes must appear.\n *\n * The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again:\n * - strikethrough\n * - superscript\n * - subscript\n * Superscript and subscript cannot both be ON at same time. Whichever comes first wins and the other is ignored,\n * while the first is ON.\n * &L - code for \"left section\" (there are three header / footer locations, \"left\", \"center\", and \"right\"). When\n * two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the\n * order of appearance, and placed into the left section.\n * &P - code for \"current page #\"\n * &N - code for \"total pages\"\n * &font size - code for \"text font size\", where font size is a font size in points.\n * &K - code for \"text font color\"\n * RGB Color is specified as RRGGBB\n * Theme Color is specifed as TTSNN where TT is the theme color Id, S is either \"+\" or \"-\" of the tint/shade\n * value, NN is the tint/shade value.\n * &S - code for \"text strikethrough\" on / off\n * &X - code for \"text super script\" on / off\n * &Y - code for \"text subscript\" on / off\n * &C - code for \"center section\". When two or more occurrences of this section marker exist, the contents\n * from all markers are concatenated, in the order of appearance, and placed into the center section.\n *\n * &D - code for \"date\"\n * &T - code for \"time\"\n * &G - code for \"picture as background\"\n * &U - code for \"text single underline\"\n * &E - code for \"double underline\"\n * &R - code for \"right section\". When two or more occurrences of this section marker exist, the contents\n * from all markers are concatenated, in the order of appearance, and placed into the right section.\n * &Z - code for \"this workbook's file path\"\n * &F - code for \"this workbook's file name\"\n * &A - code for \"sheet tab name\"\n * &+ - code for add to page #.\n * &- - code for subtract from page #.\n * &\"font name,font type\" - code for \"text font name\" and \"text font type\", where font name and font type\n * are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font\n * name, it means \"none specified\". Both of font name and font type can be localized values.\n * &\"-,Bold\" - code for \"bold font style\"\n * &B - also means \"bold font style\".\n * &\"-,Regular\" - code for \"regular font style\"\n * &\"-,Italic\" - code for \"italic font style\"\n * &I - also means \"italic font style\"\n * &\"-,Bold Italic\" code for \"bold italic font style\"\n * &O - code for \"outline style\"\n * &H - code for \"shadow style\"\n * </code>\n *\n */\nclass PHPExcel_Worksheet_HeaderFooter\n{\n    /* Header/footer image location */\n    const IMAGE_HEADER_LEFT   = 'LH';\n    const IMAGE_HEADER_CENTER = 'CH';\n    const IMAGE_HEADER_RIGHT  = 'RH';\n    const IMAGE_FOOTER_LEFT   = 'LF';\n    const IMAGE_FOOTER_CENTER = 'CF';\n    const IMAGE_FOOTER_RIGHT  = 'RF';\n\n    /**\n     * OddHeader\n     *\n     * @var string\n     */\n    private $oddHeader = '';\n\n    /**\n     * OddFooter\n     *\n     * @var string\n     */\n    private $oddFooter = '';\n\n    /**\n     * EvenHeader\n     *\n     * @var string\n     */\n    private $evenHeader = '';\n\n    /**\n     * EvenFooter\n     *\n     * @var string\n     */\n    private $evenFooter = '';\n\n    /**\n     * FirstHeader\n     *\n     * @var string\n     */\n    private $firstHeader = '';\n\n    /**\n     * FirstFooter\n     *\n     * @var string\n     */\n    private $firstFooter = '';\n\n    /**\n     * Different header for Odd/Even, defaults to false\n     *\n     * @var boolean\n     */\n    private $differentOddEven = false;\n\n    /**\n     * Different header for first page, defaults to false\n     *\n     * @var boolean\n     */\n    private $differentFirst = false;\n\n    /**\n     * Scale with document, defaults to true\n     *\n     * @var boolean\n     */\n    private $scaleWithDocument = true;\n\n    /**\n     * Align with margins, defaults to true\n     *\n     * @var boolean\n     */\n    private $alignWithMargins = true;\n\n    /**\n     * Header/footer images\n     *\n     * @var PHPExcel_Worksheet_HeaderFooterDrawing[]\n     */\n    private $headerFooterImages = array();\n\n    /**\n     * Create a new PHPExcel_Worksheet_HeaderFooter\n     */\n    public function __construct()\n    {\n    }\n\n    /**\n     * Get OddHeader\n     *\n     * @return string\n     */\n    public function getOddHeader()\n    {\n        return $this->oddHeader;\n    }\n\n    /**\n     * Set OddHeader\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setOddHeader($pValue)\n    {\n        $this->oddHeader = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get OddFooter\n     *\n     * @return string\n     */\n    public function getOddFooter()\n    {\n        return $this->oddFooter;\n    }\n\n    /**\n     * Set OddFooter\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setOddFooter($pValue)\n    {\n        $this->oddFooter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get EvenHeader\n     *\n     * @return string\n     */\n    public function getEvenHeader()\n    {\n        return $this->evenHeader;\n    }\n\n    /**\n     * Set EvenHeader\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setEvenHeader($pValue)\n    {\n        $this->evenHeader = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get EvenFooter\n     *\n     * @return string\n     */\n    public function getEvenFooter()\n    {\n        return $this->evenFooter;\n    }\n\n    /**\n     * Set EvenFooter\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setEvenFooter($pValue)\n    {\n        $this->evenFooter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get FirstHeader\n     *\n     * @return string\n     */\n    public function getFirstHeader()\n    {\n        return $this->firstHeader;\n    }\n\n    /**\n     * Set FirstHeader\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setFirstHeader($pValue)\n    {\n        $this->firstHeader = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get FirstFooter\n     *\n     * @return string\n     */\n    public function getFirstFooter()\n    {\n        return $this->firstFooter;\n    }\n\n    /**\n     * Set FirstFooter\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setFirstFooter($pValue)\n    {\n        $this->firstFooter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get DifferentOddEven\n     *\n     * @return boolean\n     */\n    public function getDifferentOddEven()\n    {\n        return $this->differentOddEven;\n    }\n\n    /**\n     * Set DifferentOddEven\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setDifferentOddEven($pValue = false)\n    {\n        $this->differentOddEven = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get DifferentFirst\n     *\n     * @return boolean\n     */\n    public function getDifferentFirst()\n    {\n        return $this->differentFirst;\n    }\n\n    /**\n     * Set DifferentFirst\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setDifferentFirst($pValue = false)\n    {\n        $this->differentFirst = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get ScaleWithDocument\n     *\n     * @return boolean\n     */\n    public function getScaleWithDocument()\n    {\n        return $this->scaleWithDocument;\n    }\n\n    /**\n     * Set ScaleWithDocument\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setScaleWithDocument($pValue = true)\n    {\n        $this->scaleWithDocument = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get AlignWithMargins\n     *\n     * @return boolean\n     */\n    public function getAlignWithMargins()\n    {\n        return $this->alignWithMargins;\n    }\n\n    /**\n     * Set AlignWithMargins\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setAlignWithMargins($pValue = true)\n    {\n        $this->alignWithMargins = $pValue;\n        return $this;\n    }\n\n    /**\n     * Add header/footer image\n     *\n     * @param PHPExcel_Worksheet_HeaderFooterDrawing $image\n     * @param string $location\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function addImage(PHPExcel_Worksheet_HeaderFooterDrawing $image = null, $location = self::IMAGE_HEADER_LEFT)\n    {\n        $this->headerFooterImages[$location] = $image;\n        return $this;\n    }\n\n    /**\n     * Remove header/footer image\n     *\n     * @param string $location\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function removeImage($location = self::IMAGE_HEADER_LEFT)\n    {\n        if (isset($this->headerFooterImages[$location])) {\n            unset($this->headerFooterImages[$location]);\n        }\n        return $this;\n    }\n\n    /**\n     * Set header/footer images\n     *\n     * @param PHPExcel_Worksheet_HeaderFooterDrawing[] $images\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setImages($images)\n    {\n        if (!is_array($images)) {\n            throw new PHPExcel_Exception('Invalid parameter!');\n        }\n\n        $this->headerFooterImages = $images;\n        return $this;\n    }\n\n    /**\n     * Get header/footer images\n     *\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing[]\n     */\n    public function getImages()\n    {\n        // Sort array\n        $images = array();\n        if (isset($this->headerFooterImages[self::IMAGE_HEADER_LEFT])) {\n            $images[self::IMAGE_HEADER_LEFT] =         $this->headerFooterImages[self::IMAGE_HEADER_LEFT];\n        }\n        if (isset($this->headerFooterImages[self::IMAGE_HEADER_CENTER])) {\n            $images[self::IMAGE_HEADER_CENTER] =     $this->headerFooterImages[self::IMAGE_HEADER_CENTER];\n        }\n        if (isset($this->headerFooterImages[self::IMAGE_HEADER_RIGHT])) {\n            $images[self::IMAGE_HEADER_RIGHT] =     $this->headerFooterImages[self::IMAGE_HEADER_RIGHT];\n        }\n        if (isset($this->headerFooterImages[self::IMAGE_FOOTER_LEFT])) {\n            $images[self::IMAGE_FOOTER_LEFT] =         $this->headerFooterImages[self::IMAGE_FOOTER_LEFT];\n        }\n        if (isset($this->headerFooterImages[self::IMAGE_FOOTER_CENTER])) {\n            $images[self::IMAGE_FOOTER_CENTER] =     $this->headerFooterImages[self::IMAGE_FOOTER_CENTER];\n        }\n        if (isset($this->headerFooterImages[self::IMAGE_FOOTER_RIGHT])) {\n            $images[self::IMAGE_FOOTER_RIGHT] =     $this->headerFooterImages[self::IMAGE_FOOTER_RIGHT];\n        }\n        $this->headerFooterImages = $images;\n\n        return $this->headerFooterImages;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_HeaderFooterDrawing\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_HeaderFooterDrawing extends PHPExcel_Worksheet_Drawing implements PHPExcel_IComparable\n{\n    /**\n     * Path\n     *\n     * @var string\n     */\n    private $path;\n\n    /**\n     * Name\n     *\n     * @var string\n     */\n    protected $name;\n\n    /**\n     * Offset X\n     *\n     * @var int\n     */\n    protected $offsetX;\n\n    /**\n     * Offset Y\n     *\n     * @var int\n     */\n    protected $offsetY;\n\n    /**\n     * Width\n     *\n     * @var int\n     */\n    protected $width;\n\n    /**\n     * Height\n     *\n     * @var int\n     */\n    protected $height;\n\n    /**\n     * Proportional resize\n     *\n     * @var boolean\n     */\n    protected $resizeProportional;\n\n    /**\n     * Create a new PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->path                = '';\n        $this->name                = '';\n        $this->offsetX             = 0;\n        $this->offsetY             = 0;\n        $this->width               = 0;\n        $this->height              = 0;\n        $this->resizeProportional  = true;\n    }\n\n    /**\n     * Get Name\n     *\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * Set Name\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setName($pValue = '')\n    {\n        $this->name = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get OffsetX\n     *\n     * @return int\n     */\n    public function getOffsetX()\n    {\n        return $this->offsetX;\n    }\n\n    /**\n     * Set OffsetX\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setOffsetX($pValue = 0)\n    {\n        $this->offsetX = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get OffsetY\n     *\n     * @return int\n     */\n    public function getOffsetY()\n    {\n        return $this->offsetY;\n    }\n\n    /**\n     * Set OffsetY\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setOffsetY($pValue = 0)\n    {\n        $this->offsetY = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Width\n     *\n     * @return int\n     */\n    public function getWidth()\n    {\n        return $this->width;\n    }\n\n    /**\n     * Set Width\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setWidth($pValue = 0)\n    {\n        // Resize proportional?\n        if ($this->resizeProportional && $pValue != 0) {\n            $ratio = $this->width / $this->height;\n            $this->height = round($ratio * $pValue);\n        }\n\n        // Set width\n        $this->width = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get Height\n     *\n     * @return int\n     */\n    public function getHeight()\n    {\n        return $this->height;\n    }\n\n    /**\n     * Set Height\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setHeight($pValue = 0)\n    {\n        // Resize proportional?\n        if ($this->resizeProportional && $pValue != 0) {\n            $ratio = $this->width / $this->height;\n            $this->width = round($ratio * $pValue);\n        }\n\n        // Set height\n        $this->height = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Set width and height with proportional resize\n     * Example:\n     * <code>\n     * $objDrawing->setResizeProportional(true);\n     * $objDrawing->setWidthAndHeight(160,120);\n     * </code>\n     *\n     * @author Vincent@luo MSN:kele_100@hotmail.com\n     * @param int $width\n     * @param int $height\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setWidthAndHeight($width = 0, $height = 0)\n    {\n        $xratio = $width / $this->width;\n        $yratio = $height / $this->height;\n        if ($this->resizeProportional && !($width == 0 || $height == 0)) {\n            if (($xratio * $this->height) < $height) {\n                $this->height = ceil($xratio * $this->height);\n                $this->width  = $width;\n            } else {\n                $this->width    = ceil($yratio * $this->width);\n                $this->height    = $height;\n            }\n        }\n        return $this;\n    }\n\n    /**\n     * Get ResizeProportional\n     *\n     * @return boolean\n     */\n    public function getResizeProportional()\n    {\n        return $this->resizeProportional;\n    }\n\n    /**\n     * Set ResizeProportional\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setResizeProportional($pValue = true)\n    {\n        $this->resizeProportional = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Filename\n     *\n     * @return string\n     */\n    public function getFilename()\n    {\n        return basename($this->path);\n    }\n\n    /**\n     * Get Extension\n     *\n     * @return string\n     */\n    public function getExtension()\n    {\n        $parts = explode(\".\", basename($this->path));\n        return end($parts);\n    }\n\n    /**\n     * Get Path\n     *\n     * @return string\n     */\n    public function getPath()\n    {\n        return $this->path;\n    }\n\n    /**\n     * Set Path\n     *\n     * @param     string         $pValue            File path\n     * @param     boolean        $pVerifyFile    Verify file\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_HeaderFooterDrawing\n     */\n    public function setPath($pValue = '', $pVerifyFile = true)\n    {\n        if ($pVerifyFile) {\n            if (file_exists($pValue)) {\n                $this->path = $pValue;\n\n                if ($this->width == 0 && $this->height == 0) {\n                    // Get width/height\n                    list($this->width, $this->height) = getimagesize($pValue);\n                }\n            } else {\n                throw new PHPExcel_Exception(\"File $pValue not found!\");\n            }\n        } else {\n            $this->path = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->path .\n            $this->name .\n            $this->offsetX .\n            $this->offsetY .\n            $this->width .\n            $this->height .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_MemoryDrawing\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_MemoryDrawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable\n{\n    /* Rendering functions */\n    const RENDERING_DEFAULT = 'imagepng';\n    const RENDERING_PNG     = 'imagepng';\n    const RENDERING_GIF     = 'imagegif';\n    const RENDERING_JPEG    = 'imagejpeg';\n\n    /* MIME types */\n    const MIMETYPE_DEFAULT  = 'image/png';\n    const MIMETYPE_PNG      = 'image/png';\n    const MIMETYPE_GIF      = 'image/gif';\n    const MIMETYPE_JPEG     = 'image/jpeg';\n\n    /**\n     * Image resource\n     *\n     * @var resource\n     */\n    private $imageResource;\n\n    /**\n     * Rendering function\n     *\n     * @var string\n     */\n    private $renderingFunction;\n\n    /**\n     * Mime type\n     *\n     * @var string\n     */\n    private $mimeType;\n\n    /**\n     * Unique name\n     *\n     * @var string\n     */\n    private $uniqueName;\n\n    /**\n     * Create a new PHPExcel_Worksheet_MemoryDrawing\n     */\n    public function __construct()\n    {\n        // Initialise values\n        $this->imageResource     = null;\n        $this->renderingFunction = self::RENDERING_DEFAULT;\n        $this->mimeType          = self::MIMETYPE_DEFAULT;\n        $this->uniqueName        = md5(rand(0, 9999). time() . rand(0, 9999));\n\n        // Initialize parent\n        parent::__construct();\n    }\n\n    /**\n     * Get image resource\n     *\n     * @return resource\n     */\n    public function getImageResource()\n    {\n        return $this->imageResource;\n    }\n\n    /**\n     * Set image resource\n     *\n     * @param    $value resource\n     * @return PHPExcel_Worksheet_MemoryDrawing\n     */\n    public function setImageResource($value = null)\n    {\n        $this->imageResource = $value;\n\n        if (!is_null($this->imageResource)) {\n            // Get width/height\n            $this->width  = imagesx($this->imageResource);\n            $this->height = imagesy($this->imageResource);\n        }\n        return $this;\n    }\n\n    /**\n     * Get rendering function\n     *\n     * @return string\n     */\n    public function getRenderingFunction()\n    {\n        return $this->renderingFunction;\n    }\n\n    /**\n     * Set rendering function\n     *\n     * @param string $value\n     * @return PHPExcel_Worksheet_MemoryDrawing\n     */\n    public function setRenderingFunction($value = PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT)\n    {\n        $this->renderingFunction = $value;\n        return $this;\n    }\n\n    /**\n     * Get mime type\n     *\n     * @return string\n     */\n    public function getMimeType()\n    {\n        return $this->mimeType;\n    }\n\n    /**\n     * Set mime type\n     *\n     * @param string $value\n     * @return PHPExcel_Worksheet_MemoryDrawing\n     */\n    public function setMimeType($value = PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT)\n    {\n        $this->mimeType = $value;\n        return $this;\n    }\n\n    /**\n     * Get indexed filename (using image index)\n     *\n     * @return string\n     */\n    public function getIndexedFilename()\n    {\n        $extension = strtolower($this->getMimeType());\n        $extension = explode('/', $extension);\n        $extension = $extension[1];\n\n        return $this->uniqueName . $this->getImageIndex() . '.' . $extension;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        return md5(\n            $this->renderingFunction .\n            $this->mimeType .\n            $this->uniqueName .\n            parent::getHashCode() .\n            __CLASS__\n        );\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Worksheet_PageMargins\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Worksheet_PageMargins\n{\n    /**\n     * Left\n     *\n     * @var double\n     */\n    private $left        = 0.7;\n\n    /**\n     * Right\n     *\n     * @var double\n     */\n    private $right        = 0.7;\n\n    /**\n     * Top\n     *\n     * @var double\n     */\n    private $top        = 0.75;\n\n    /**\n     * Bottom\n     *\n     * @var double\n     */\n    private $bottom    = 0.75;\n\n    /**\n     * Header\n     *\n     * @var double\n     */\n    private $header     = 0.3;\n\n    /**\n     * Footer\n     *\n     * @var double\n     */\n    private $footer     = 0.3;\n\n    /**\n     * Create a new PHPExcel_Worksheet_PageMargins\n     */\n    public function __construct()\n    {\n    }\n\n    /**\n     * Get Left\n     *\n     * @return double\n     */\n    public function getLeft()\n    {\n        return $this->left;\n    }\n\n    /**\n     * Set Left\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function setLeft($pValue)\n    {\n        $this->left = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Right\n     *\n     * @return double\n     */\n    public function getRight()\n    {\n        return $this->right;\n    }\n\n    /**\n     * Set Right\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function setRight($pValue)\n    {\n        $this->right = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Top\n     *\n     * @return double\n     */\n    public function getTop()\n    {\n        return $this->top;\n    }\n\n    /**\n     * Set Top\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function setTop($pValue)\n    {\n        $this->top = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Bottom\n     *\n     * @return double\n     */\n    public function getBottom()\n    {\n        return $this->bottom;\n    }\n\n    /**\n     * Set Bottom\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function setBottom($pValue)\n    {\n        $this->bottom = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Header\n     *\n     * @return double\n     */\n    public function getHeader()\n    {\n        return $this->header;\n    }\n\n    /**\n     * Set Header\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function setHeader($pValue)\n    {\n        $this->header = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Footer\n     *\n     * @return double\n     */\n    public function getFooter()\n    {\n        return $this->footer;\n    }\n\n    /**\n     * Set Footer\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function setFooter($pValue)\n    {\n        $this->footer = $pValue;\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Worksheet_PageSetup\n *\n * <code>\n * Paper size taken from Office Open XML Part 4 - Markup Language Reference, page 1988:\n *\n * 1 = Letter paper (8.5 in. by 11 in.)\n * 2 = Letter small paper (8.5 in. by 11 in.)\n * 3 = Tabloid paper (11 in. by 17 in.)\n * 4 = Ledger paper (17 in. by 11 in.)\n * 5 = Legal paper (8.5 in. by 14 in.)\n * 6 = Statement paper (5.5 in. by 8.5 in.)\n * 7 = Executive paper (7.25 in. by 10.5 in.)\n * 8 = A3 paper (297 mm by 420 mm)\n * 9 = A4 paper (210 mm by 297 mm)\n * 10 = A4 small paper (210 mm by 297 mm)\n * 11 = A5 paper (148 mm by 210 mm)\n * 12 = B4 paper (250 mm by 353 mm)\n * 13 = B5 paper (176 mm by 250 mm)\n * 14 = Folio paper (8.5 in. by 13 in.)\n * 15 = Quarto paper (215 mm by 275 mm)\n * 16 = Standard paper (10 in. by 14 in.)\n * 17 = Standard paper (11 in. by 17 in.)\n * 18 = Note paper (8.5 in. by 11 in.)\n * 19 = #9 envelope (3.875 in. by 8.875 in.)\n * 20 = #10 envelope (4.125 in. by 9.5 in.)\n * 21 = #11 envelope (4.5 in. by 10.375 in.)\n * 22 = #12 envelope (4.75 in. by 11 in.)\n * 23 = #14 envelope (5 in. by 11.5 in.)\n * 24 = C paper (17 in. by 22 in.)\n * 25 = D paper (22 in. by 34 in.)\n * 26 = E paper (34 in. by 44 in.)\n * 27 = DL envelope (110 mm by 220 mm)\n * 28 = C5 envelope (162 mm by 229 mm)\n * 29 = C3 envelope (324 mm by 458 mm)\n * 30 = C4 envelope (229 mm by 324 mm)\n * 31 = C6 envelope (114 mm by 162 mm)\n * 32 = C65 envelope (114 mm by 229 mm)\n * 33 = B4 envelope (250 mm by 353 mm)\n * 34 = B5 envelope (176 mm by 250 mm)\n * 35 = B6 envelope (176 mm by 125 mm)\n * 36 = Italy envelope (110 mm by 230 mm)\n * 37 = Monarch envelope (3.875 in. by 7.5 in.).\n * 38 = 6 3/4 envelope (3.625 in. by 6.5 in.)\n * 39 = US standard fanfold (14.875 in. by 11 in.)\n * 40 = German standard fanfold (8.5 in. by 12 in.)\n * 41 = German legal fanfold (8.5 in. by 13 in.)\n * 42 = ISO B4 (250 mm by 353 mm)\n * 43 = Japanese double postcard (200 mm by 148 mm)\n * 44 = Standard paper (9 in. by 11 in.)\n * 45 = Standard paper (10 in. by 11 in.)\n * 46 = Standard paper (15 in. by 11 in.)\n * 47 = Invite envelope (220 mm by 220 mm)\n * 50 = Letter extra paper (9.275 in. by 12 in.)\n * 51 = Legal extra paper (9.275 in. by 15 in.)\n * 52 = Tabloid extra paper (11.69 in. by 18 in.)\n * 53 = A4 extra paper (236 mm by 322 mm)\n * 54 = Letter transverse paper (8.275 in. by 11 in.)\n * 55 = A4 transverse paper (210 mm by 297 mm)\n * 56 = Letter extra transverse paper (9.275 in. by 12 in.)\n * 57 = SuperA/SuperA/A4 paper (227 mm by 356 mm)\n * 58 = SuperB/SuperB/A3 paper (305 mm by 487 mm)\n * 59 = Letter plus paper (8.5 in. by 12.69 in.)\n * 60 = A4 plus paper (210 mm by 330 mm)\n * 61 = A5 transverse paper (148 mm by 210 mm)\n * 62 = JIS B5 transverse paper (182 mm by 257 mm)\n * 63 = A3 extra paper (322 mm by 445 mm)\n * 64 = A5 extra paper (174 mm by 235 mm)\n * 65 = ISO B5 extra paper (201 mm by 276 mm)\n * 66 = A2 paper (420 mm by 594 mm)\n * 67 = A3 transverse paper (297 mm by 420 mm)\n * 68 = A3 extra transverse paper (322 mm by 445 mm)\n * </code>\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Worksheet_PageSetup\n{\n    /* Paper size */\n    const PAPERSIZE_LETTER                          = 1;\n    const PAPERSIZE_LETTER_SMALL                    = 2;\n    const PAPERSIZE_TABLOID                         = 3;\n    const PAPERSIZE_LEDGER                          = 4;\n    const PAPERSIZE_LEGAL                           = 5;\n    const PAPERSIZE_STATEMENT                       = 6;\n    const PAPERSIZE_EXECUTIVE                       = 7;\n    const PAPERSIZE_A3                              = 8;\n    const PAPERSIZE_A4                              = 9;\n    const PAPERSIZE_A4_SMALL                        = 10;\n    const PAPERSIZE_A5                              = 11;\n    const PAPERSIZE_B4                              = 12;\n    const PAPERSIZE_B5                              = 13;\n    const PAPERSIZE_FOLIO                           = 14;\n    const PAPERSIZE_QUARTO                          = 15;\n    const PAPERSIZE_STANDARD_1                      = 16;\n    const PAPERSIZE_STANDARD_2                      = 17;\n    const PAPERSIZE_NOTE                            = 18;\n    const PAPERSIZE_NO9_ENVELOPE                    = 19;\n    const PAPERSIZE_NO10_ENVELOPE                   = 20;\n    const PAPERSIZE_NO11_ENVELOPE                   = 21;\n    const PAPERSIZE_NO12_ENVELOPE                   = 22;\n    const PAPERSIZE_NO14_ENVELOPE                   = 23;\n    const PAPERSIZE_C                               = 24;\n    const PAPERSIZE_D                               = 25;\n    const PAPERSIZE_E                               = 26;\n    const PAPERSIZE_DL_ENVELOPE                     = 27;\n    const PAPERSIZE_C5_ENVELOPE                     = 28;\n    const PAPERSIZE_C3_ENVELOPE                     = 29;\n    const PAPERSIZE_C4_ENVELOPE                     = 30;\n    const PAPERSIZE_C6_ENVELOPE                     = 31;\n    const PAPERSIZE_C65_ENVELOPE                    = 32;\n    const PAPERSIZE_B4_ENVELOPE                     = 33;\n    const PAPERSIZE_B5_ENVELOPE                     = 34;\n    const PAPERSIZE_B6_ENVELOPE                     = 35;\n    const PAPERSIZE_ITALY_ENVELOPE                  = 36;\n    const PAPERSIZE_MONARCH_ENVELOPE                = 37;\n    const PAPERSIZE_6_3_4_ENVELOPE                  = 38;\n    const PAPERSIZE_US_STANDARD_FANFOLD             = 39;\n    const PAPERSIZE_GERMAN_STANDARD_FANFOLD         = 40;\n    const PAPERSIZE_GERMAN_LEGAL_FANFOLD            = 41;\n    const PAPERSIZE_ISO_B4                          = 42;\n    const PAPERSIZE_JAPANESE_DOUBLE_POSTCARD        = 43;\n    const PAPERSIZE_STANDARD_PAPER_1                = 44;\n    const PAPERSIZE_STANDARD_PAPER_2                = 45;\n    const PAPERSIZE_STANDARD_PAPER_3                = 46;\n    const PAPERSIZE_INVITE_ENVELOPE                 = 47;\n    const PAPERSIZE_LETTER_EXTRA_PAPER              = 48;\n    const PAPERSIZE_LEGAL_EXTRA_PAPER               = 49;\n    const PAPERSIZE_TABLOID_EXTRA_PAPER             = 50;\n    const PAPERSIZE_A4_EXTRA_PAPER                  = 51;\n    const PAPERSIZE_LETTER_TRANSVERSE_PAPER         = 52;\n    const PAPERSIZE_A4_TRANSVERSE_PAPER             = 53;\n    const PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER   = 54;\n    const PAPERSIZE_SUPERA_SUPERA_A4_PAPER          = 55;\n    const PAPERSIZE_SUPERB_SUPERB_A3_PAPER          = 56;\n    const PAPERSIZE_LETTER_PLUS_PAPER               = 57;\n    const PAPERSIZE_A4_PLUS_PAPER                   = 58;\n    const PAPERSIZE_A5_TRANSVERSE_PAPER             = 59;\n    const PAPERSIZE_JIS_B5_TRANSVERSE_PAPER         = 60;\n    const PAPERSIZE_A3_EXTRA_PAPER                  = 61;\n    const PAPERSIZE_A5_EXTRA_PAPER                  = 62;\n    const PAPERSIZE_ISO_B5_EXTRA_PAPER              = 63;\n    const PAPERSIZE_A2_PAPER                        = 64;\n    const PAPERSIZE_A3_TRANSVERSE_PAPER             = 65;\n    const PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER       = 66;\n\n    /* Page orientation */\n    const ORIENTATION_DEFAULT                       = 'default';\n    const ORIENTATION_LANDSCAPE                     = 'landscape';\n    const ORIENTATION_PORTRAIT                      = 'portrait';\n\n    /* Print Range Set Method */\n    const SETPRINTRANGE_OVERWRITE                   = 'O';\n    const SETPRINTRANGE_INSERT                      = 'I';\n\n\n    /**\n     * Paper size\n     *\n     * @var int\n     */\n    private $paperSize = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER;\n\n    /**\n     * Orientation\n     *\n     * @var string\n     */\n    private $orientation = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT;\n\n    /**\n     * Scale (Print Scale)\n     *\n     * Print scaling. Valid values range from 10 to 400\n     * This setting is overridden when fitToWidth and/or fitToHeight are in use\n     *\n     * @var int?\n     */\n    private $scale = 100;\n\n    /**\n      * Fit To Page\n      * Whether scale or fitToWith / fitToHeight applies\n      *\n      * @var boolean\n      */\n    private $fitToPage = false;\n\n    /**\n      * Fit To Height\n      * Number of vertical pages to fit on\n      *\n      * @var int?\n      */\n    private $fitToHeight    = 1;\n\n    /**\n      * Fit To Width\n      * Number of horizontal pages to fit on\n      *\n      * @var int?\n      */\n    private $fitToWidth    = 1;\n\n    /**\n     * Columns to repeat at left\n     *\n     * @var array Containing start column and end column, empty array if option unset\n     */\n    private $columnsToRepeatAtLeft = array('', '');\n\n    /**\n     * Rows to repeat at top\n     *\n     * @var array Containing start row number and end row number, empty array if option unset\n     */\n    private $rowsToRepeatAtTop = array(0, 0);\n\n    /**\n     * Center page horizontally\n     *\n     * @var boolean\n     */\n    private $horizontalCentered = false;\n\n    /**\n     * Center page vertically\n     *\n     * @var boolean\n     */\n    private $verticalCentered = false;\n\n    /**\n     * Print area\n     *\n     * @var string\n     */\n    private $printArea = null;\n\n    /**\n     * First page number\n     *\n     * @var int\n     */\n    private $firstPageNumber = null;\n\n    /**\n     * Create a new PHPExcel_Worksheet_PageSetup\n     */\n    public function __construct()\n    {\n    }\n\n    /**\n     * Get Paper Size\n     *\n     * @return int\n     */\n    public function getPaperSize()\n    {\n        return $this->paperSize;\n    }\n\n    /**\n     * Set Paper Size\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setPaperSize($pValue = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER)\n    {\n        $this->paperSize = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Orientation\n     *\n     * @return string\n     */\n    public function getOrientation()\n    {\n        return $this->orientation;\n    }\n\n    /**\n     * Set Orientation\n     *\n     * @param string $pValue\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setOrientation($pValue = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT)\n    {\n        $this->orientation = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Scale\n     *\n     * @return int?\n     */\n    public function getScale()\n    {\n        return $this->scale;\n    }\n\n    /**\n     * Set Scale\n     *\n     * Print scaling. Valid values range from 10 to 400\n     * This setting is overridden when fitToWidth and/or fitToHeight are in use\n     *\n     * @param     int?    $pValue\n     * @param boolean    $pUpdate    Update fitToPage so scaling applies rather than fitToHeight / fitToWidth\n     * @return PHPExcel_Worksheet_PageSetup\n     * @throws     PHPExcel_Exception\n     */\n    public function setScale($pValue = 100, $pUpdate = true)\n    {\n        // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface,\n        // but it is apparently still able to handle any scale >= 0, where 0 results in 100\n        if (($pValue >= 0) || is_null($pValue)) {\n            $this->scale = $pValue;\n            if ($pUpdate) {\n                $this->fitToPage = false;\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Scale must not be negative\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get Fit To Page\n     *\n     * @return boolean\n     */\n    public function getFitToPage()\n    {\n        return $this->fitToPage;\n    }\n\n    /**\n     * Set Fit To Page\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setFitToPage($pValue = true)\n    {\n        $this->fitToPage = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Fit To Height\n     *\n     * @return int?\n     */\n    public function getFitToHeight()\n    {\n        return $this->fitToHeight;\n    }\n\n    /**\n     * Set Fit To Height\n     *\n     * @param int? $pValue\n     * @param boolean $pUpdate Update fitToPage so it applies rather than scaling\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setFitToHeight($pValue = 1, $pUpdate = true)\n    {\n        $this->fitToHeight = $pValue;\n        if ($pUpdate) {\n            $this->fitToPage = true;\n        }\n        return $this;\n    }\n\n    /**\n     * Get Fit To Width\n     *\n     * @return int?\n     */\n    public function getFitToWidth()\n    {\n        return $this->fitToWidth;\n    }\n\n    /**\n     * Set Fit To Width\n     *\n     * @param int? $pValue\n     * @param boolean $pUpdate Update fitToPage so it applies rather than scaling\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setFitToWidth($pValue = 1, $pUpdate = true)\n    {\n        $this->fitToWidth = $pValue;\n        if ($pUpdate) {\n            $this->fitToPage = true;\n        }\n        return $this;\n    }\n\n    /**\n     * Is Columns to repeat at left set?\n     *\n     * @return boolean\n     */\n    public function isColumnsToRepeatAtLeftSet()\n    {\n        if (is_array($this->columnsToRepeatAtLeft)) {\n            if ($this->columnsToRepeatAtLeft[0] != '' && $this->columnsToRepeatAtLeft[1] != '') {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Get Columns to repeat at left\n     *\n     * @return array Containing start column and end column, empty array if option unset\n     */\n    public function getColumnsToRepeatAtLeft()\n    {\n        return $this->columnsToRepeatAtLeft;\n    }\n\n    /**\n     * Set Columns to repeat at left\n     *\n     * @param array $pValue Containing start column and end column, empty array if option unset\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setColumnsToRepeatAtLeft($pValue = null)\n    {\n        if (is_array($pValue)) {\n            $this->columnsToRepeatAtLeft = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Set Columns to repeat at left by start and end\n     *\n     * @param string $pStart\n     * @param string $pEnd\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setColumnsToRepeatAtLeftByStartAndEnd($pStart = 'A', $pEnd = 'A')\n    {\n        $this->columnsToRepeatAtLeft = array($pStart, $pEnd);\n        return $this;\n    }\n\n    /**\n     * Is Rows to repeat at top set?\n     *\n     * @return boolean\n     */\n    public function isRowsToRepeatAtTopSet()\n    {\n        if (is_array($this->rowsToRepeatAtTop)) {\n            if ($this->rowsToRepeatAtTop[0] != 0 && $this->rowsToRepeatAtTop[1] != 0) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Get Rows to repeat at top\n     *\n     * @return array Containing start column and end column, empty array if option unset\n     */\n    public function getRowsToRepeatAtTop()\n    {\n        return $this->rowsToRepeatAtTop;\n    }\n\n    /**\n     * Set Rows to repeat at top\n     *\n     * @param array    $pValue    Containing start column and end column, empty array if option unset\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setRowsToRepeatAtTop($pValue = null)\n    {\n        if (is_array($pValue)) {\n            $this->rowsToRepeatAtTop = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     * Set Rows to repeat at top by start and end\n     *\n     * @param int $pStart\n     * @param int $pEnd\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setRowsToRepeatAtTopByStartAndEnd($pStart = 1, $pEnd = 1)\n    {\n        $this->rowsToRepeatAtTop = array($pStart, $pEnd);\n        return $this;\n    }\n\n    /**\n     * Get center page horizontally\n     *\n     * @return bool\n     */\n    public function getHorizontalCentered()\n    {\n        return $this->horizontalCentered;\n    }\n\n    /**\n     * Set center page horizontally\n     *\n     * @param bool $value\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setHorizontalCentered($value = false)\n    {\n        $this->horizontalCentered = $value;\n        return $this;\n    }\n\n    /**\n     * Get center page vertically\n     *\n     * @return bool\n     */\n    public function getVerticalCentered()\n    {\n        return $this->verticalCentered;\n    }\n\n    /**\n     * Set center page vertically\n     *\n     * @param bool $value\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function setVerticalCentered($value = false)\n    {\n        $this->verticalCentered = $value;\n        return $this;\n    }\n\n    /**\n     *    Get print area\n     *\n     * @param    int        $index    Identifier for a specific print area range if several ranges have been set\n     *                            Default behaviour, or a index value of 0, will return all ranges as a comma-separated string\n     *                            Otherwise, the specific range identified by the value of $index will be returned\n     *                            Print areas are numbered from 1\n     * @throws    PHPExcel_Exception\n     * @return    string\n     */\n    public function getPrintArea($index = 0)\n    {\n        if ($index == 0) {\n            return $this->printArea;\n        }\n        $printAreas = explode(',', $this->printArea);\n        if (isset($printAreas[$index-1])) {\n            return $printAreas[$index-1];\n        }\n        throw new PHPExcel_Exception(\"Requested Print Area does not exist\");\n    }\n\n    /**\n     * Is print area set?\n     *\n     * @param    int        $index    Identifier for a specific print area range if several ranges have been set\n     *                            Default behaviour, or an index value of 0, will identify whether any print range is set\n     *                            Otherwise, existence of the range identified by the value of $index will be returned\n     *                            Print areas are numbered from 1\n     * @return    boolean\n     */\n    public function isPrintAreaSet($index = 0)\n    {\n        if ($index == 0) {\n            return !is_null($this->printArea);\n        }\n        $printAreas = explode(',', $this->printArea);\n        return isset($printAreas[$index-1]);\n    }\n\n    /**\n     * Clear a print area\n     *\n     * @param    int        $index    Identifier for a specific print area range if several ranges have been set\n     *                            Default behaviour, or an index value of 0, will clear all print ranges that are set\n     *                            Otherwise, the range identified by the value of $index will be removed from the series\n     *                            Print areas are numbered from 1\n     * @return    PHPExcel_Worksheet_PageSetup\n     */\n    public function clearPrintArea($index = 0)\n    {\n        if ($index == 0) {\n            $this->printArea = null;\n        } else {\n            $printAreas = explode(',', $this->printArea);\n            if (isset($printAreas[$index-1])) {\n                unset($printAreas[$index-1]);\n                $this->printArea = implode(',', $printAreas);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20'\n     *\n     * @param    string    $value\n     * @param    int        $index    Identifier for a specific print area range allowing several ranges to be set\n     *                            When the method is \"O\"verwrite, then a positive integer index will overwrite that indexed\n     *                                entry in the print areas list; a negative index value will identify which entry to\n     *                                overwrite working bacward through the print area to the list, with the last entry as -1.\n     *                                Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.\n     *                            When the method is \"I\"nsert, then a positive index will insert after that indexed entry in\n     *                                the print areas list, while a negative index will insert before the indexed entry.\n     *                                Specifying an index value of 0, will always append the new print range at the end of the\n     *                                list.\n     *                            Print areas are numbered from 1\n     * @param    string    $method    Determines the method used when setting multiple print areas\n     *                            Default behaviour, or the \"O\" method, overwrites existing print area\n     *                            The \"I\" method, inserts the new print area before any specified index, or at the end of the list\n     * @return    PHPExcel_Worksheet_PageSetup\n     * @throws    PHPExcel_Exception\n     */\n    public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE)\n    {\n        if (strpos($value, '!') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate must not specify a worksheet.');\n        } elseif (strpos($value, ':') === false) {\n            throw new PHPExcel_Exception('Cell coordinate must be a range of cells.');\n        } elseif (strpos($value, '$') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate must not be absolute.');\n        }\n        $value = strtoupper($value);\n\n        if ($method == self::SETPRINTRANGE_OVERWRITE) {\n            if ($index == 0) {\n                $this->printArea = $value;\n            } else {\n                $printAreas = explode(',', $this->printArea);\n                if ($index < 0) {\n                    $index = count($printAreas) - abs($index) + 1;\n                }\n                if (($index <= 0) || ($index > count($printAreas))) {\n                    throw new PHPExcel_Exception('Invalid index for setting print range.');\n                }\n                $printAreas[$index-1] = $value;\n                $this->printArea = implode(',', $printAreas);\n            }\n        } elseif ($method == self::SETPRINTRANGE_INSERT) {\n            if ($index == 0) {\n                $this->printArea .= ($this->printArea == '') ? $value : ','.$value;\n            } else {\n                $printAreas = explode(',', $this->printArea);\n                if ($index < 0) {\n                    $index = abs($index) - 1;\n                }\n                if ($index > count($printAreas)) {\n                    throw new PHPExcel_Exception('Invalid index for setting print range.');\n                }\n                $printAreas = array_merge(array_slice($printAreas, 0, $index), array($value), array_slice($printAreas, $index));\n                $this->printArea = implode(',', $printAreas);\n            }\n        } else {\n            throw new PHPExcel_Exception('Invalid method for setting print range.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas\n     *\n     * @param    string    $value\n     * @param    int        $index    Identifier for a specific print area range allowing several ranges to be set\n     *                            A positive index will insert after that indexed entry in the print areas list, while a\n     *                                negative index will insert before the indexed entry.\n     *                                Specifying an index value of 0, will always append the new print range at the end of the\n     *                                list.\n     *                            Print areas are numbered from 1\n     * @return    PHPExcel_Worksheet_PageSetup\n     * @throws    PHPExcel_Exception\n     */\n    public function addPrintArea($value, $index = -1)\n    {\n        return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT);\n    }\n\n    /**\n     * Set print area\n     *\n     * @param    int        $column1    Column 1\n     * @param    int        $row1        Row 1\n     * @param    int        $column2    Column 2\n     * @param    int        $row2        Row 2\n     * @param    int        $index        Identifier for a specific print area range allowing several ranges to be set\n     *                                When the method is \"O\"verwrite, then a positive integer index will overwrite that indexed\n     *                                    entry in the print areas list; a negative index value will identify which entry to\n     *                                    overwrite working bacward through the print area to the list, with the last entry as -1.\n     *                                    Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.\n     *                                When the method is \"I\"nsert, then a positive index will insert after that indexed entry in\n     *                                    the print areas list, while a negative index will insert before the indexed entry.\n     *                                    Specifying an index value of 0, will always append the new print range at the end of the\n     *                                    list.\n     *                                Print areas are numbered from 1\n     * @param    string    $method        Determines the method used when setting multiple print areas\n     *                                Default behaviour, or the \"O\" method, overwrites existing print area\n     *                                The \"I\" method, inserts the new print area before any specified index, or at the end of the list\n     * @return    PHPExcel_Worksheet_PageSetup\n     * @throws    PHPExcel_Exception\n     */\n    public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE)\n    {\n        return $this->setPrintArea(\n            PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2,\n            $index,\n            $method\n        );\n    }\n\n    /**\n     * Add a new print area to the list of print areas\n     *\n     * @param    int        $column1    Start Column for the print area\n     * @param    int        $row1        Start Row for the print area\n     * @param    int        $column2    End Column for the print area\n     * @param    int        $row2        End Row for the print area\n     * @param    int        $index        Identifier for a specific print area range allowing several ranges to be set\n     *                                A positive index will insert after that indexed entry in the print areas list, while a\n     *                                    negative index will insert before the indexed entry.\n     *                                    Specifying an index value of 0, will always append the new print range at the end of the\n     *                                    list.\n     *                                Print areas are numbered from 1\n     * @return    PHPExcel_Worksheet_PageSetup\n     * @throws    PHPExcel_Exception\n     */\n    public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1)\n    {\n        return $this->setPrintArea(\n            PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2,\n            $index,\n            self::SETPRINTRANGE_INSERT\n        );\n    }\n\n    /**\n     * Get first page number\n     *\n     * @return int\n     */\n    public function getFirstPageNumber()\n    {\n        return $this->firstPageNumber;\n    }\n\n    /**\n     * Set first page number\n     *\n     * @param int $value\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function setFirstPageNumber($value = null)\n    {\n        $this->firstPageNumber = $value;\n        return $this;\n    }\n\n    /**\n     * Reset first page number\n     *\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function resetFirstPageNumber()\n    {\n        return $this->setFirstPageNumber(null);\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Worksheet_Protection\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Worksheet_Protection\n{\n    /**\n     * Sheet\n     *\n     * @var boolean\n     */\n    private $sheet                    = false;\n\n    /**\n     * Objects\n     *\n     * @var boolean\n     */\n    private $objects                = false;\n\n    /**\n     * Scenarios\n     *\n     * @var boolean\n     */\n    private $scenarios                = false;\n\n    /**\n     * Format cells\n     *\n     * @var boolean\n     */\n    private $formatCells            = false;\n\n    /**\n     * Format columns\n     *\n     * @var boolean\n     */\n    private $formatColumns            = false;\n\n    /**\n     * Format rows\n     *\n     * @var boolean\n     */\n    private $formatRows            = false;\n\n    /**\n     * Insert columns\n     *\n     * @var boolean\n     */\n    private $insertColumns            = false;\n\n    /**\n     * Insert rows\n     *\n     * @var boolean\n     */\n    private $insertRows            = false;\n\n    /**\n     * Insert hyperlinks\n     *\n     * @var boolean\n     */\n    private $insertHyperlinks        = false;\n\n    /**\n     * Delete columns\n     *\n     * @var boolean\n     */\n    private $deleteColumns            = false;\n\n    /**\n     * Delete rows\n     *\n     * @var boolean\n     */\n    private $deleteRows            = false;\n\n    /**\n     * Select locked cells\n     *\n     * @var boolean\n     */\n    private $selectLockedCells        = false;\n\n    /**\n     * Sort\n     *\n     * @var boolean\n     */\n    private $sort                    = false;\n\n    /**\n     * AutoFilter\n     *\n     * @var boolean\n     */\n    private $autoFilter            = false;\n\n    /**\n     * Pivot tables\n     *\n     * @var boolean\n     */\n    private $pivotTables            = false;\n\n    /**\n     * Select unlocked cells\n     *\n     * @var boolean\n     */\n    private $selectUnlockedCells    = false;\n\n    /**\n     * Password\n     *\n     * @var string\n     */\n    private $password                = '';\n\n    /**\n     * Create a new PHPExcel_Worksheet_Protection\n     */\n    public function __construct()\n    {\n    }\n\n    /**\n     * Is some sort of protection enabled?\n     *\n     * @return boolean\n     */\n    public function isProtectionEnabled()\n    {\n        return $this->sheet ||\n            $this->objects ||\n            $this->scenarios ||\n            $this->formatCells ||\n            $this->formatColumns ||\n            $this->formatRows ||\n            $this->insertColumns ||\n            $this->insertRows ||\n            $this->insertHyperlinks ||\n            $this->deleteColumns ||\n            $this->deleteRows ||\n            $this->selectLockedCells ||\n            $this->sort ||\n            $this->autoFilter ||\n            $this->pivotTables ||\n            $this->selectUnlockedCells;\n    }\n\n    /**\n     * Get Sheet\n     *\n     * @return boolean\n     */\n    public function getSheet()\n    {\n        return $this->sheet;\n    }\n\n    /**\n     * Set Sheet\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setSheet($pValue = false)\n    {\n        $this->sheet = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Objects\n     *\n     * @return boolean\n     */\n    public function getObjects()\n    {\n        return $this->objects;\n    }\n\n    /**\n     * Set Objects\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setObjects($pValue = false)\n    {\n        $this->objects = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Scenarios\n     *\n     * @return boolean\n     */\n    public function getScenarios()\n    {\n        return $this->scenarios;\n    }\n\n    /**\n     * Set Scenarios\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setScenarios($pValue = false)\n    {\n        $this->scenarios = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get FormatCells\n     *\n     * @return boolean\n     */\n    public function getFormatCells()\n    {\n        return $this->formatCells;\n    }\n\n    /**\n     * Set FormatCells\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setFormatCells($pValue = false)\n    {\n        $this->formatCells = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get FormatColumns\n     *\n     * @return boolean\n     */\n    public function getFormatColumns()\n    {\n        return $this->formatColumns;\n    }\n\n    /**\n     * Set FormatColumns\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setFormatColumns($pValue = false)\n    {\n        $this->formatColumns = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get FormatRows\n     *\n     * @return boolean\n     */\n    public function getFormatRows()\n    {\n        return $this->formatRows;\n    }\n\n    /**\n     * Set FormatRows\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setFormatRows($pValue = false)\n    {\n        $this->formatRows = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get InsertColumns\n     *\n     * @return boolean\n     */\n    public function getInsertColumns()\n    {\n        return $this->insertColumns;\n    }\n\n    /**\n     * Set InsertColumns\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setInsertColumns($pValue = false)\n    {\n        $this->insertColumns = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get InsertRows\n     *\n     * @return boolean\n     */\n    public function getInsertRows()\n    {\n        return $this->insertRows;\n    }\n\n    /**\n     * Set InsertRows\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setInsertRows($pValue = false)\n    {\n        $this->insertRows = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get InsertHyperlinks\n     *\n     * @return boolean\n     */\n    public function getInsertHyperlinks()\n    {\n        return $this->insertHyperlinks;\n    }\n\n    /**\n     * Set InsertHyperlinks\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setInsertHyperlinks($pValue = false)\n    {\n        $this->insertHyperlinks = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get DeleteColumns\n     *\n     * @return boolean\n     */\n    public function getDeleteColumns()\n    {\n        return $this->deleteColumns;\n    }\n\n    /**\n     * Set DeleteColumns\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setDeleteColumns($pValue = false)\n    {\n        $this->deleteColumns = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get DeleteRows\n     *\n     * @return boolean\n     */\n    public function getDeleteRows()\n    {\n        return $this->deleteRows;\n    }\n\n    /**\n     * Set DeleteRows\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setDeleteRows($pValue = false)\n    {\n        $this->deleteRows = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get SelectLockedCells\n     *\n     * @return boolean\n     */\n    public function getSelectLockedCells()\n    {\n        return $this->selectLockedCells;\n    }\n\n    /**\n     * Set SelectLockedCells\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setSelectLockedCells($pValue = false)\n    {\n        $this->selectLockedCells = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Sort\n     *\n     * @return boolean\n     */\n    public function getSort()\n    {\n        return $this->sort;\n    }\n\n    /**\n     * Set Sort\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setSort($pValue = false)\n    {\n        $this->sort = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get AutoFilter\n     *\n     * @return boolean\n     */\n    public function getAutoFilter()\n    {\n        return $this->autoFilter;\n    }\n\n    /**\n     * Set AutoFilter\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setAutoFilter($pValue = false)\n    {\n        $this->autoFilter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get PivotTables\n     *\n     * @return boolean\n     */\n    public function getPivotTables()\n    {\n        return $this->pivotTables;\n    }\n\n    /**\n     * Set PivotTables\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setPivotTables($pValue = false)\n    {\n        $this->pivotTables = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get SelectUnlockedCells\n     *\n     * @return boolean\n     */\n    public function getSelectUnlockedCells()\n    {\n        return $this->selectUnlockedCells;\n    }\n\n    /**\n     * Set SelectUnlockedCells\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setSelectUnlockedCells($pValue = false)\n    {\n        $this->selectUnlockedCells = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Password (hashed)\n     *\n     * @return string\n     */\n    public function getPassword()\n    {\n        return $this->password;\n    }\n\n    /**\n     * Set Password\n     *\n     * @param string     $pValue\n     * @param boolean     $pAlreadyHashed If the password has already been hashed, set this to true\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function setPassword($pValue = '', $pAlreadyHashed = false)\n    {\n        if (!$pAlreadyHashed) {\n            $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue);\n        }\n        $this->password = $pValue;\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/Row.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_Row\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_Row\n{\n    /**\n     * PHPExcel_Worksheet\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $parent;\n\n    /**\n     * Row index\n     *\n     * @var int\n     */\n    private $rowIndex = 0;\n\n    /**\n     * Create a new row\n     *\n     * @param PHPExcel_Worksheet         $parent\n     * @param int                        $rowIndex\n     */\n    public function __construct(PHPExcel_Worksheet $parent = null, $rowIndex = 1)\n    {\n        // Set parent and row index\n        $this->parent   = $parent;\n        $this->rowIndex = $rowIndex;\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->parent);\n    }\n\n    /**\n     * Get row index\n     *\n     * @return int\n     */\n    public function getRowIndex()\n    {\n        return $this->rowIndex;\n    }\n\n    /**\n     * Get cell iterator\n     *\n     * @param    string                $startColumn    The column address at which to start iterating\n     * @param    string                $endColumn        Optionally, the column address at which to stop iterating\n     * @return PHPExcel_Worksheet_CellIterator\n     */\n    public function getCellIterator($startColumn = 'A', $endColumn = null)\n    {\n        return new PHPExcel_Worksheet_RowCellIterator($this->parent, $this->rowIndex, $startColumn, $endColumn);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/RowCellIterator.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_RowCellIterator\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_RowCellIterator extends PHPExcel_Worksheet_CellIterator implements Iterator\n{\n    /**\n     * Row index\n     *\n     * @var int\n     */\n    protected $rowIndex;\n\n    /**\n     * Start position\n     *\n     * @var int\n     */\n    protected $startColumn = 0;\n\n    /**\n     * End position\n     *\n     * @var int\n     */\n    protected $endColumn = 0;\n\n    /**\n     * Create a new column iterator\n     *\n     * @param    PHPExcel_Worksheet    $subject        The worksheet to iterate over\n     * @param   integer             $rowIndex       The row that we want to iterate\n     * @param    string                $startColumn    The column address at which to start iterating\n     * @param    string                $endColumn        Optionally, the column address at which to stop iterating\n     */\n    public function __construct(PHPExcel_Worksheet $subject = null, $rowIndex = 1, $startColumn = 'A', $endColumn = null)\n    {\n        // Set subject and row index\n        $this->subject = $subject;\n        $this->rowIndex = $rowIndex;\n        $this->resetEnd($endColumn);\n        $this->resetStart($startColumn);\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->subject);\n    }\n\n    /**\n     * (Re)Set the start column and the current column pointer\n     *\n     * @param integer    $startColumn    The column address at which to start iterating\n     * @return PHPExcel_Worksheet_RowCellIterator\n     * @throws PHPExcel_Exception\n     */\n    public function resetStart($startColumn = 'A')\n    {\n        $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1;\n        $this->startColumn = $startColumnIndex;\n        $this->adjustForExistingOnlyRange();\n        $this->seek(PHPExcel_Cell::stringFromColumnIndex($this->startColumn));\n\n        return $this;\n    }\n\n    /**\n     * (Re)Set the end column\n     *\n     * @param string    $endColumn    The column address at which to stop iterating\n     * @return PHPExcel_Worksheet_RowCellIterator\n     * @throws PHPExcel_Exception\n     */\n    public function resetEnd($endColumn = null)\n    {\n        $endColumn = ($endColumn) ? $endColumn : $this->subject->getHighestColumn();\n        $this->endColumn = PHPExcel_Cell::columnIndexFromString($endColumn) - 1;\n        $this->adjustForExistingOnlyRange();\n\n        return $this;\n    }\n\n    /**\n     * Set the column pointer to the selected column\n     *\n     * @param string    $column    The column address to set the current pointer at\n     * @return PHPExcel_Worksheet_RowCellIterator\n     * @throws PHPExcel_Exception\n     */\n    public function seek($column = 'A')\n    {\n        $column = PHPExcel_Cell::columnIndexFromString($column) - 1;\n        if (($column < $this->startColumn) || ($column > $this->endColumn)) {\n            throw new PHPExcel_Exception(\"Column $column is out of range ({$this->startColumn} - {$this->endColumn})\");\n        } elseif ($this->onlyExistingCells && !($this->subject->cellExistsByColumnAndRow($column, $this->rowIndex))) {\n            throw new PHPExcel_Exception('In \"IterateOnlyExistingCells\" mode and Cell does not exist');\n        }\n        $this->position = $column;\n\n        return $this;\n    }\n\n    /**\n     * Rewind the iterator to the starting column\n     */\n    public function rewind()\n    {\n        $this->position = $this->startColumn;\n    }\n\n    /**\n     * Return the current cell in this worksheet row\n     *\n     * @return PHPExcel_Cell\n     */\n    public function current()\n    {\n        return $this->subject->getCellByColumnAndRow($this->position, $this->rowIndex);\n    }\n\n    /**\n     * Return the current iterator key\n     *\n     * @return string\n     */\n    public function key()\n    {\n        return PHPExcel_Cell::stringFromColumnIndex($this->position);\n    }\n\n    /**\n     * Set the iterator to its next value\n     */\n    public function next()\n    {\n        do {\n            ++$this->position;\n        } while (($this->onlyExistingCells) &&\n            (!$this->subject->cellExistsByColumnAndRow($this->position, $this->rowIndex)) &&\n            ($this->position <= $this->endColumn));\n    }\n\n    /**\n     * Set the iterator to its previous value\n     *\n     * @throws PHPExcel_Exception\n     */\n    public function prev()\n    {\n        if ($this->position <= $this->startColumn) {\n            throw new PHPExcel_Exception(\n                \"Column is already at the beginning of range (\" .\n                PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . \" - \" .\n                PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . \")\"\n            );\n        }\n\n        do {\n            --$this->position;\n        } while (($this->onlyExistingCells) &&\n            (!$this->subject->cellExistsByColumnAndRow($this->position, $this->rowIndex)) &&\n            ($this->position >= $this->startColumn));\n    }\n\n    /**\n     * Indicate if more columns exist in the worksheet range of columns that we're iterating\n     *\n     * @return boolean\n     */\n    public function valid()\n    {\n        return $this->position <= $this->endColumn;\n    }\n\n    /**\n     * Validate start/end values for \"IterateOnlyExistingCells\" mode, and adjust if necessary\n     *\n     * @throws PHPExcel_Exception\n     */\n    protected function adjustForExistingOnlyRange()\n    {\n        if ($this->onlyExistingCells) {\n            while ((!$this->subject->cellExistsByColumnAndRow($this->startColumn, $this->rowIndex)) &&\n                ($this->startColumn <= $this->endColumn)) {\n                ++$this->startColumn;\n            }\n            if ($this->startColumn > $this->endColumn) {\n                throw new PHPExcel_Exception('No cells exist within the specified range');\n            }\n            while ((!$this->subject->cellExistsByColumnAndRow($this->endColumn, $this->rowIndex)) &&\n                ($this->endColumn >= $this->startColumn)) {\n                --$this->endColumn;\n            }\n            if ($this->endColumn < $this->startColumn) {\n                throw new PHPExcel_Exception('No cells exist within the specified range');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_RowDimension\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_RowDimension extends PHPExcel_Worksheet_Dimension\n{\n    /**\n     * Row index\n     *\n     * @var int\n     */\n    private $rowIndex;\n\n    /**\n     * Row height (in pt)\n     *\n     * When this is set to a negative value, the row height should be ignored by IWriter\n     *\n     * @var double\n     */\n    private $height = -1;\n\n     /**\n     * ZeroHeight for Row?\n     *\n     * @var bool\n     */\n    private $zeroHeight = false;\n\n    /**\n     * Create a new PHPExcel_Worksheet_RowDimension\n     *\n     * @param int $pIndex Numeric row index\n     */\n    public function __construct($pIndex = 0)\n    {\n        // Initialise values\n        $this->rowIndex = $pIndex;\n\n        // set dimension as unformatted by default\n        parent::__construct(null);\n    }\n\n    /**\n     * Get Row Index\n     *\n     * @return int\n     */\n    public function getRowIndex()\n    {\n        return $this->rowIndex;\n    }\n\n    /**\n     * Set Row Index\n     *\n     * @param int $pValue\n     * @return PHPExcel_Worksheet_RowDimension\n     */\n    public function setRowIndex($pValue)\n    {\n        $this->rowIndex = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Row Height\n     *\n     * @return double\n     */\n    public function getRowHeight()\n    {\n        return $this->height;\n    }\n\n    /**\n     * Set Row Height\n     *\n     * @param double $pValue\n     * @return PHPExcel_Worksheet_RowDimension\n     */\n    public function setRowHeight($pValue = -1)\n    {\n        $this->height = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get ZeroHeight\n     *\n     * @return bool\n     */\n    public function getZeroHeight()\n    {\n        return $this->zeroHeight;\n    }\n\n    /**\n     * Set ZeroHeight\n     *\n     * @param bool $pValue\n     * @return PHPExcel_Worksheet_RowDimension\n     */\n    public function setZeroHeight($pValue = false)\n    {\n        $this->zeroHeight = $pValue;\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_RowIterator\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_RowIterator implements Iterator\n{\n    /**\n     * PHPExcel_Worksheet to iterate\n     *\n     * @var PHPExcel_Worksheet\n     */\n    private $subject;\n\n    /**\n     * Current iterator position\n     *\n     * @var int\n     */\n    private $position = 1;\n\n    /**\n     * Start position\n     *\n     * @var int\n     */\n    private $startRow = 1;\n\n\n    /**\n     * End position\n     *\n     * @var int\n     */\n    private $endRow = 1;\n\n\n    /**\n     * Create a new row iterator\n     *\n     * @param    PHPExcel_Worksheet    $subject    The worksheet to iterate over\n     * @param    integer                $startRow    The row number at which to start iterating\n     * @param    integer                $endRow        Optionally, the row number at which to stop iterating\n     */\n    public function __construct(PHPExcel_Worksheet $subject, $startRow = 1, $endRow = null)\n    {\n        // Set subject\n        $this->subject = $subject;\n        $this->resetEnd($endRow);\n        $this->resetStart($startRow);\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->subject);\n    }\n\n    /**\n     * (Re)Set the start row and the current row pointer\n     *\n     * @param integer    $startRow    The row number at which to start iterating\n     * @return PHPExcel_Worksheet_RowIterator\n     * @throws PHPExcel_Exception\n     */\n    public function resetStart($startRow = 1)\n    {\n        if ($startRow > $this->subject->getHighestRow()) {\n            throw new PHPExcel_Exception(\"Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})\");\n        }\n\n        $this->startRow = $startRow;\n        if ($this->endRow < $this->startRow) {\n            $this->endRow = $this->startRow;\n        }\n        $this->seek($startRow);\n\n        return $this;\n    }\n\n    /**\n     * (Re)Set the end row\n     *\n     * @param integer    $endRow    The row number at which to stop iterating\n     * @return PHPExcel_Worksheet_RowIterator\n     */\n    public function resetEnd($endRow = null)\n    {\n        $this->endRow = ($endRow) ? $endRow : $this->subject->getHighestRow();\n\n        return $this;\n    }\n\n    /**\n     * Set the row pointer to the selected row\n     *\n     * @param integer    $row    The row number to set the current pointer at\n     * @return PHPExcel_Worksheet_RowIterator\n     * @throws PHPExcel_Exception\n     */\n    public function seek($row = 1)\n    {\n        if (($row < $this->startRow) || ($row > $this->endRow)) {\n            throw new PHPExcel_Exception(\"Row $row is out of range ({$this->startRow} - {$this->endRow})\");\n        }\n        $this->position = $row;\n\n        return $this;\n    }\n\n    /**\n     * Rewind the iterator to the starting row\n     */\n    public function rewind()\n    {\n        $this->position = $this->startRow;\n    }\n\n    /**\n     * Return the current row in this worksheet\n     *\n     * @return PHPExcel_Worksheet_Row\n     */\n    public function current()\n    {\n        return new PHPExcel_Worksheet_Row($this->subject, $this->position);\n    }\n\n    /**\n     * Return the current iterator key\n     *\n     * @return int\n     */\n    public function key()\n    {\n        return $this->position;\n    }\n\n    /**\n     * Set the iterator to its next value\n     */\n    public function next()\n    {\n        ++$this->position;\n    }\n\n    /**\n     * Set the iterator to its previous value\n     */\n    public function prev()\n    {\n        if ($this->position <= $this->startRow) {\n            throw new PHPExcel_Exception(\"Row is already at the beginning of range ({$this->startRow} - {$this->endRow})\");\n        }\n\n        --$this->position;\n    }\n\n    /**\n     * Indicate if more rows exist in the worksheet range of rows that we're iterating\n     *\n     * @return boolean\n     */\n    public function valid()\n    {\n        return $this->position <= $this->endRow;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet_SheetView\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet_SheetView\n{\n\n    /* Sheet View types */\n    const SHEETVIEW_NORMAL             = 'normal';\n    const SHEETVIEW_PAGE_LAYOUT        = 'pageLayout';\n    const SHEETVIEW_PAGE_BREAK_PREVIEW = 'pageBreakPreview';\n\n    private static $sheetViewTypes = array(\n        self::SHEETVIEW_NORMAL,\n        self::SHEETVIEW_PAGE_LAYOUT,\n        self::SHEETVIEW_PAGE_BREAK_PREVIEW,\n    );\n\n    /**\n     * ZoomScale\n     *\n     * Valid values range from 10 to 400.\n     *\n     * @var int\n     */\n    private $zoomScale = 100;\n\n    /**\n     * ZoomScaleNormal\n     *\n     * Valid values range from 10 to 400.\n     *\n     * @var int\n     */\n    private $zoomScaleNormal = 100;\n\n    /**\n     * View\n     *\n     * Valid values range from 10 to 400.\n     *\n     * @var string\n     */\n    private $sheetviewType = self::SHEETVIEW_NORMAL;\n\n    /**\n     * Create a new PHPExcel_Worksheet_SheetView\n     */\n    public function __construct()\n    {\n    }\n\n    /**\n     * Get ZoomScale\n     *\n     * @return int\n     */\n    public function getZoomScale()\n    {\n        return $this->zoomScale;\n    }\n\n    /**\n     * Set ZoomScale\n     *\n     * Valid values range from 10 to 400.\n     *\n     * @param     int     $pValue\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_SheetView\n     */\n    public function setZoomScale($pValue = 100)\n    {\n        // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface,\n        // but it is apparently still able to handle any scale >= 1\n        if (($pValue >= 1) || is_null($pValue)) {\n            $this->zoomScale = $pValue;\n        } else {\n            throw new PHPExcel_Exception(\"Scale must be greater than or equal to 1.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get ZoomScaleNormal\n     *\n     * @return int\n     */\n    public function getZoomScaleNormal()\n    {\n        return $this->zoomScaleNormal;\n    }\n\n    /**\n     * Set ZoomScale\n     *\n     * Valid values range from 10 to 400.\n     *\n     * @param     int     $pValue\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_SheetView\n     */\n    public function setZoomScaleNormal($pValue = 100)\n    {\n        if (($pValue >= 1) || is_null($pValue)) {\n            $this->zoomScaleNormal = $pValue;\n        } else {\n            throw new PHPExcel_Exception(\"Scale must be greater than or equal to 1.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Get View\n     *\n     * @return string\n     */\n    public function getView()\n    {\n        return $this->sheetviewType;\n    }\n\n    /**\n     * Set View\n     *\n     * Valid values are\n     *        'normal'            self::SHEETVIEW_NORMAL\n     *        'pageLayout'        self::SHEETVIEW_PAGE_LAYOUT\n     *        'pageBreakPreview'  self::SHEETVIEW_PAGE_BREAK_PREVIEW\n     *\n     * @param     string     $pValue\n     * @throws     PHPExcel_Exception\n     * @return PHPExcel_Worksheet_SheetView\n     */\n    public function setView($pValue = null)\n    {\n        // MS Excel 2007 allows setting the view to 'normal', 'pageLayout' or 'pageBreakPreview' via the user interface\n        if ($pValue === null) {\n            $pValue = self::SHEETVIEW_NORMAL;\n        }\n        if (in_array($pValue, self::$sheetViewTypes)) {\n            $this->sheetviewType = $pValue;\n        } else {\n            throw new PHPExcel_Exception(\"Invalid sheetview layout type.\");\n        }\n\n        return $this;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        $vars = get_object_vars($this);\n        foreach ($vars as $key => $value) {\n            if (is_object($value)) {\n                $this->$key = clone $value;\n            } else {\n                $this->$key = $value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Worksheet.php",
    "content": "<?php\n\n/**\n * PHPExcel_Worksheet\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Worksheet\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Worksheet implements PHPExcel_IComparable\n{\n    /* Break types */\n    const BREAK_NONE   = 0;\n    const BREAK_ROW    = 1;\n    const BREAK_COLUMN = 2;\n\n    /* Sheet state */\n    const SHEETSTATE_VISIBLE    = 'visible';\n    const SHEETSTATE_HIDDEN     = 'hidden';\n    const SHEETSTATE_VERYHIDDEN = 'veryHidden';\n\n    /**\n     * Invalid characters in sheet title\n     *\n     * @var array\n     */\n    private static $invalidCharacters = array('*', ':', '/', '\\\\', '?', '[', ']');\n\n    /**\n     * Parent spreadsheet\n     *\n     * @var PHPExcel\n     */\n    private $parent;\n\n    /**\n     * Cacheable collection of cells\n     *\n     * @var PHPExcel_CachedObjectStorage_xxx\n     */\n    private $cellCollection;\n\n    /**\n     * Collection of row dimensions\n     *\n     * @var PHPExcel_Worksheet_RowDimension[]\n     */\n    private $rowDimensions = array();\n\n    /**\n     * Default row dimension\n     *\n     * @var PHPExcel_Worksheet_RowDimension\n     */\n    private $defaultRowDimension;\n\n    /**\n     * Collection of column dimensions\n     *\n     * @var PHPExcel_Worksheet_ColumnDimension[]\n     */\n    private $columnDimensions = array();\n\n    /**\n     * Default column dimension\n     *\n     * @var PHPExcel_Worksheet_ColumnDimension\n     */\n    private $defaultColumnDimension = null;\n\n    /**\n     * Collection of drawings\n     *\n     * @var PHPExcel_Worksheet_BaseDrawing[]\n     */\n    private $drawingCollection = null;\n\n    /**\n     * Collection of Chart objects\n     *\n     * @var PHPExcel_Chart[]\n     */\n    private $chartCollection = array();\n\n    /**\n     * Worksheet title\n     *\n     * @var string\n     */\n    private $title;\n\n    /**\n     * Sheet state\n     *\n     * @var string\n     */\n    private $sheetState;\n\n    /**\n     * Page setup\n     *\n     * @var PHPExcel_Worksheet_PageSetup\n     */\n    private $pageSetup;\n\n    /**\n     * Page margins\n     *\n     * @var PHPExcel_Worksheet_PageMargins\n     */\n    private $pageMargins;\n\n    /**\n     * Page header/footer\n     *\n     * @var PHPExcel_Worksheet_HeaderFooter\n     */\n    private $headerFooter;\n\n    /**\n     * Sheet view\n     *\n     * @var PHPExcel_Worksheet_SheetView\n     */\n    private $sheetView;\n\n    /**\n     * Protection\n     *\n     * @var PHPExcel_Worksheet_Protection\n     */\n    private $protection;\n\n    /**\n     * Collection of styles\n     *\n     * @var PHPExcel_Style[]\n     */\n    private $styles = array();\n\n    /**\n     * Conditional styles. Indexed by cell coordinate, e.g. 'A1'\n     *\n     * @var array\n     */\n    private $conditionalStylesCollection = array();\n\n    /**\n     * Is the current cell collection sorted already?\n     *\n     * @var boolean\n     */\n    private $cellCollectionIsSorted = false;\n\n    /**\n     * Collection of breaks\n     *\n     * @var array\n     */\n    private $breaks = array();\n\n    /**\n     * Collection of merged cell ranges\n     *\n     * @var array\n     */\n    private $mergeCells = array();\n\n    /**\n     * Collection of protected cell ranges\n     *\n     * @var array\n     */\n    private $protectedCells = array();\n\n    /**\n     * Autofilter Range and selection\n     *\n     * @var PHPExcel_Worksheet_AutoFilter\n     */\n    private $autoFilter;\n\n    /**\n     * Freeze pane\n     *\n     * @var string\n     */\n    private $freezePane = '';\n\n    /**\n     * Show gridlines?\n     *\n     * @var boolean\n     */\n    private $showGridlines = true;\n\n    /**\n    * Print gridlines?\n    *\n    * @var boolean\n    */\n    private $printGridlines = false;\n\n    /**\n    * Show row and column headers?\n    *\n    * @var boolean\n    */\n    private $showRowColHeaders = true;\n\n    /**\n     * Show summary below? (Row/Column outline)\n     *\n     * @var boolean\n     */\n    private $showSummaryBelow = true;\n\n    /**\n     * Show summary right? (Row/Column outline)\n     *\n     * @var boolean\n     */\n    private $showSummaryRight = true;\n\n    /**\n     * Collection of comments\n     *\n     * @var PHPExcel_Comment[]\n     */\n    private $comments = array();\n\n    /**\n     * Active cell. (Only one!)\n     *\n     * @var string\n     */\n    private $activeCell = 'A1';\n\n    /**\n     * Selected cells\n     *\n     * @var string\n     */\n    private $selectedCells = 'A1';\n\n    /**\n     * Cached highest column\n     *\n     * @var string\n     */\n    private $cachedHighestColumn = 'A';\n\n    /**\n     * Cached highest row\n     *\n     * @var int\n     */\n    private $cachedHighestRow = 1;\n\n    /**\n     * Right-to-left?\n     *\n     * @var boolean\n     */\n    private $rightToLeft = false;\n\n    /**\n     * Hyperlinks. Indexed by cell coordinate, e.g. 'A1'\n     *\n     * @var array\n     */\n    private $hyperlinkCollection = array();\n\n    /**\n     * Data validation objects. Indexed by cell coordinate, e.g. 'A1'\n     *\n     * @var array\n     */\n    private $dataValidationCollection = array();\n\n    /**\n     * Tab color\n     *\n     * @var PHPExcel_Style_Color\n     */\n    private $tabColor;\n\n    /**\n     * Dirty flag\n     *\n     * @var boolean\n     */\n    private $dirty = true;\n\n    /**\n     * Hash\n     *\n     * @var string\n     */\n    private $hash;\n\n    /**\n    * CodeName\n    *\n    * @var string\n    */\n    private $codeName = null;\n\n    /**\n     * Create a new worksheet\n     *\n     * @param PHPExcel        $pParent\n     * @param string        $pTitle\n     */\n    public function __construct(PHPExcel $pParent = null, $pTitle = 'Worksheet')\n    {\n        // Set parent and title\n        $this->parent = $pParent;\n        $this->setTitle($pTitle, false);\n        // setTitle can change $pTitle\n        $this->setCodeName($this->getTitle());\n        $this->setSheetState(PHPExcel_Worksheet::SHEETSTATE_VISIBLE);\n\n        $this->cellCollection         = PHPExcel_CachedObjectStorageFactory::getInstance($this);\n        // Set page setup\n        $this->pageSetup              = new PHPExcel_Worksheet_PageSetup();\n        // Set page margins\n        $this->pageMargins            = new PHPExcel_Worksheet_PageMargins();\n        // Set page header/footer\n        $this->headerFooter           = new PHPExcel_Worksheet_HeaderFooter();\n        // Set sheet view\n        $this->sheetView              = new PHPExcel_Worksheet_SheetView();\n        // Drawing collection\n        $this->drawingCollection      = new ArrayObject();\n        // Chart collection\n        $this->chartCollection        = new ArrayObject();\n        // Protection\n        $this->protection             = new PHPExcel_Worksheet_Protection();\n        // Default row dimension\n        $this->defaultRowDimension    = new PHPExcel_Worksheet_RowDimension(null);\n        // Default column dimension\n        $this->defaultColumnDimension = new PHPExcel_Worksheet_ColumnDimension(null);\n        $this->autoFilter             = new PHPExcel_Worksheet_AutoFilter(null, $this);\n    }\n\n\n    /**\n     * Disconnect all cells from this PHPExcel_Worksheet object,\n     *    typically so that the worksheet object can be unset\n     *\n     */\n    public function disconnectCells()\n    {\n        if ($this->cellCollection !== null) {\n            $this->cellCollection->unsetWorksheetCells();\n            $this->cellCollection = null;\n        }\n        //    detach ourself from the workbook, so that it can then delete this worksheet successfully\n        $this->parent = null;\n    }\n\n    /**\n     * Code to execute when this worksheet is unset()\n     *\n     */\n    public function __destruct()\n    {\n        PHPExcel_Calculation::getInstance($this->parent)->clearCalculationCacheForWorksheet($this->title);\n\n        $this->disconnectCells();\n    }\n\n   /**\n     * Return the cache controller for the cell collection\n     *\n     * @return PHPExcel_CachedObjectStorage_xxx\n     */\n    public function getCellCacheController()\n    {\n        return $this->cellCollection;\n    }\n\n\n    /**\n     * Get array of invalid characters for sheet title\n     *\n     * @return array\n     */\n    public static function getInvalidCharacters()\n    {\n        return self::$invalidCharacters;\n    }\n\n    /**\n     * Check sheet code name for valid Excel syntax\n     *\n     * @param string $pValue The string to check\n     * @return string The valid string\n     * @throws Exception\n     */\n    private static function checkSheetCodeName($pValue)\n    {\n        $CharCount = PHPExcel_Shared_String::CountCharacters($pValue);\n        if ($CharCount == 0) {\n            throw new PHPExcel_Exception('Sheet code name cannot be empty.');\n        }\n        // Some of the printable ASCII characters are invalid:  * : / \\ ? [ ] and  first and last characters cannot be a \"'\"\n        if ((str_replace(self::$invalidCharacters, '', $pValue) !== $pValue) ||\n            (PHPExcel_Shared_String::Substring($pValue, -1, 1)=='\\'') ||\n            (PHPExcel_Shared_String::Substring($pValue, 0, 1)=='\\'')) {\n            throw new PHPExcel_Exception('Invalid character found in sheet code name');\n        }\n\n        // Maximum 31 characters allowed for sheet title\n        if ($CharCount > 31) {\n            throw new PHPExcel_Exception('Maximum 31 characters allowed in sheet code name.');\n        }\n\n        return $pValue;\n    }\n\n   /**\n     * Check sheet title for valid Excel syntax\n     *\n     * @param string $pValue The string to check\n     * @return string The valid string\n     * @throws PHPExcel_Exception\n     */\n    private static function checkSheetTitle($pValue)\n    {\n        // Some of the printable ASCII characters are invalid:  * : / \\ ? [ ]\n        if (str_replace(self::$invalidCharacters, '', $pValue) !== $pValue) {\n            throw new PHPExcel_Exception('Invalid character found in sheet title');\n        }\n\n        // Maximum 31 characters allowed for sheet title\n        if (PHPExcel_Shared_String::CountCharacters($pValue) > 31) {\n            throw new PHPExcel_Exception('Maximum 31 characters allowed in sheet title.');\n        }\n\n        return $pValue;\n    }\n\n    /**\n     * Get collection of cells\n     *\n     * @param boolean $pSorted Also sort the cell collection?\n     * @return PHPExcel_Cell[]\n     */\n    public function getCellCollection($pSorted = true)\n    {\n        if ($pSorted) {\n            // Re-order cell collection\n            return $this->sortCellCollection();\n        }\n        if ($this->cellCollection !== null) {\n            return $this->cellCollection->getCellList();\n        }\n        return array();\n    }\n\n    /**\n     * Sort collection of cells\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function sortCellCollection()\n    {\n        if ($this->cellCollection !== null) {\n            return $this->cellCollection->getSortedCellList();\n        }\n        return array();\n    }\n\n    /**\n     * Get collection of row dimensions\n     *\n     * @return PHPExcel_Worksheet_RowDimension[]\n     */\n    public function getRowDimensions()\n    {\n        return $this->rowDimensions;\n    }\n\n    /**\n     * Get default row dimension\n     *\n     * @return PHPExcel_Worksheet_RowDimension\n     */\n    public function getDefaultRowDimension()\n    {\n        return $this->defaultRowDimension;\n    }\n\n    /**\n     * Get collection of column dimensions\n     *\n     * @return PHPExcel_Worksheet_ColumnDimension[]\n     */\n    public function getColumnDimensions()\n    {\n        return $this->columnDimensions;\n    }\n\n    /**\n     * Get default column dimension\n     *\n     * @return PHPExcel_Worksheet_ColumnDimension\n     */\n    public function getDefaultColumnDimension()\n    {\n        return $this->defaultColumnDimension;\n    }\n\n    /**\n     * Get collection of drawings\n     *\n     * @return PHPExcel_Worksheet_BaseDrawing[]\n     */\n    public function getDrawingCollection()\n    {\n        return $this->drawingCollection;\n    }\n\n    /**\n     * Get collection of charts\n     *\n     * @return PHPExcel_Chart[]\n     */\n    public function getChartCollection()\n    {\n        return $this->chartCollection;\n    }\n\n    /**\n     * Add chart\n     *\n     * @param PHPExcel_Chart $pChart\n     * @param int|null $iChartIndex Index where chart should go (0,1,..., or null for last)\n     * @return PHPExcel_Chart\n     */\n    public function addChart(PHPExcel_Chart $pChart = null, $iChartIndex = null)\n    {\n        $pChart->setWorksheet($this);\n        if (is_null($iChartIndex)) {\n            $this->chartCollection[] = $pChart;\n        } else {\n            // Insert the chart at the requested index\n            array_splice($this->chartCollection, $iChartIndex, 0, array($pChart));\n        }\n\n        return $pChart;\n    }\n\n    /**\n     * Return the count of charts on this worksheet\n     *\n     * @return int        The number of charts\n     */\n    public function getChartCount()\n    {\n        return count($this->chartCollection);\n    }\n\n    /**\n     * Get a chart by its index position\n     *\n     * @param string $index Chart index position\n     * @return false|PHPExcel_Chart\n     * @throws PHPExcel_Exception\n     */\n    public function getChartByIndex($index = null)\n    {\n        $chartCount = count($this->chartCollection);\n        if ($chartCount == 0) {\n            return false;\n        }\n        if (is_null($index)) {\n            $index = --$chartCount;\n        }\n        if (!isset($this->chartCollection[$index])) {\n            return false;\n        }\n\n        return $this->chartCollection[$index];\n    }\n\n    /**\n     * Return an array of the names of charts on this worksheet\n     *\n     * @return string[] The names of charts\n     * @throws PHPExcel_Exception\n     */\n    public function getChartNames()\n    {\n        $chartNames = array();\n        foreach ($this->chartCollection as $chart) {\n            $chartNames[] = $chart->getName();\n        }\n        return $chartNames;\n    }\n\n    /**\n     * Get a chart by name\n     *\n     * @param string $chartName Chart name\n     * @return false|PHPExcel_Chart\n     * @throws PHPExcel_Exception\n     */\n    public function getChartByName($chartName = '')\n    {\n        $chartCount = count($this->chartCollection);\n        if ($chartCount == 0) {\n            return false;\n        }\n        foreach ($this->chartCollection as $index => $chart) {\n            if ($chart->getName() == $chartName) {\n                return $this->chartCollection[$index];\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Refresh column dimensions\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function refreshColumnDimensions()\n    {\n        $currentColumnDimensions = $this->getColumnDimensions();\n        $newColumnDimensions = array();\n\n        foreach ($currentColumnDimensions as $objColumnDimension) {\n            $newColumnDimensions[$objColumnDimension->getColumnIndex()] = $objColumnDimension;\n        }\n\n        $this->columnDimensions = $newColumnDimensions;\n\n        return $this;\n    }\n\n    /**\n     * Refresh row dimensions\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function refreshRowDimensions()\n    {\n        $currentRowDimensions = $this->getRowDimensions();\n        $newRowDimensions = array();\n\n        foreach ($currentRowDimensions as $objRowDimension) {\n            $newRowDimensions[$objRowDimension->getRowIndex()] = $objRowDimension;\n        }\n\n        $this->rowDimensions = $newRowDimensions;\n\n        return $this;\n    }\n\n    /**\n     * Calculate worksheet dimension\n     *\n     * @return string  String containing the dimension of this worksheet\n     */\n    public function calculateWorksheetDimension()\n    {\n        // Return\n        return 'A1' . ':' .  $this->getHighestColumn() . $this->getHighestRow();\n    }\n\n    /**\n     * Calculate worksheet data dimension\n     *\n     * @return string  String containing the dimension of this worksheet that actually contain data\n     */\n    public function calculateWorksheetDataDimension()\n    {\n        // Return\n        return 'A1' . ':' .  $this->getHighestDataColumn() . $this->getHighestDataRow();\n    }\n\n    /**\n     * Calculate widths for auto-size columns\n     *\n     * @param  boolean  $calculateMergeCells  Calculate merge cell width\n     * @return PHPExcel_Worksheet;\n     */\n    public function calculateColumnWidths($calculateMergeCells = false)\n    {\n        // initialize $autoSizes array\n        $autoSizes = array();\n        foreach ($this->getColumnDimensions() as $colDimension) {\n            if ($colDimension->getAutoSize()) {\n                $autoSizes[$colDimension->getColumnIndex()] = -1;\n            }\n        }\n\n        // There is only something to do if there are some auto-size columns\n        if (!empty($autoSizes)) {\n            // build list of cells references that participate in a merge\n            $isMergeCell = array();\n            foreach ($this->getMergeCells() as $cells) {\n                foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cells) as $cellReference) {\n                    $isMergeCell[$cellReference] = true;\n                }\n            }\n\n            // loop through all cells in the worksheet\n            foreach ($this->getCellCollection(false) as $cellID) {\n                $cell = $this->getCell($cellID, false);\n                if ($cell !== null && isset($autoSizes[$this->cellCollection->getCurrentColumn()])) {\n                    // Determine width if cell does not participate in a merge\n                    if (!isset($isMergeCell[$this->cellCollection->getCurrentAddress()])) {\n                        // Calculated value\n                        // To formatted string\n                        $cellValue = PHPExcel_Style_NumberFormat::toFormattedString(\n                            $cell->getCalculatedValue(),\n                            $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode()\n                        );\n\n                        $autoSizes[$this->cellCollection->getCurrentColumn()] = max(\n                            (float) $autoSizes[$this->cellCollection->getCurrentColumn()],\n                            (float)PHPExcel_Shared_Font::calculateColumnWidth(\n                                $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(),\n                                $cellValue,\n                                $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(),\n                                $this->getDefaultStyle()->getFont()\n                            )\n                        );\n                    }\n                }\n            }\n\n            // adjust column widths\n            foreach ($autoSizes as $columnIndex => $width) {\n                if ($width == -1) {\n                    $width = $this->getDefaultColumnDimension()->getWidth();\n                }\n                $this->getColumnDimension($columnIndex)->setWidth($width);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get parent\n     *\n     * @return PHPExcel\n     */\n    public function getParent()\n    {\n        return $this->parent;\n    }\n\n    /**\n     * Re-bind parent\n     *\n     * @param PHPExcel $parent\n     * @return PHPExcel_Worksheet\n     */\n    public function rebindParent(PHPExcel $parent)\n    {\n        if ($this->parent !== null) {\n            $namedRanges = $this->parent->getNamedRanges();\n            foreach ($namedRanges as $namedRange) {\n                $parent->addNamedRange($namedRange);\n            }\n\n            $this->parent->removeSheetByIndex(\n                $this->parent->getIndex($this)\n            );\n        }\n        $this->parent = $parent;\n\n        return $this;\n    }\n\n    /**\n     * Get title\n     *\n     * @return string\n     */\n    public function getTitle()\n    {\n        return $this->title;\n    }\n\n    /**\n     * Set title\n     *\n     * @param string $pValue String containing the dimension of this worksheet\n     * @param string $updateFormulaCellReferences boolean Flag indicating whether cell references in formulae should\n     *            be updated to reflect the new sheet name.\n     *          This should be left as the default true, unless you are\n     *          certain that no formula cells on any worksheet contain\n     *          references to this worksheet\n     * @return PHPExcel_Worksheet\n     */\n    public function setTitle($pValue = 'Worksheet', $updateFormulaCellReferences = true)\n    {\n        // Is this a 'rename' or not?\n        if ($this->getTitle() == $pValue) {\n            return $this;\n        }\n\n        // Syntax check\n        self::checkSheetTitle($pValue);\n\n        // Old title\n        $oldTitle = $this->getTitle();\n\n        if ($this->parent) {\n            // Is there already such sheet name?\n            if ($this->parent->sheetNameExists($pValue)) {\n                // Use name, but append with lowest possible integer\n\n                if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) {\n                    $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 29);\n                }\n                $i = 1;\n                while ($this->parent->sheetNameExists($pValue . ' ' . $i)) {\n                    ++$i;\n                    if ($i == 10) {\n                        if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) {\n                            $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 28);\n                        }\n                    } elseif ($i == 100) {\n                        if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) {\n                            $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 27);\n                        }\n                    }\n                }\n\n                $altTitle = $pValue . ' ' . $i;\n                return $this->setTitle($altTitle, $updateFormulaCellReferences);\n            }\n        }\n\n        // Set title\n        $this->title = $pValue;\n        $this->dirty = true;\n\n        if ($this->parent && $this->parent->getCalculationEngine()) {\n            // New title\n            $newTitle = $this->getTitle();\n            $this->parent->getCalculationEngine()\n                ->renameCalculationCacheForWorksheet($oldTitle, $newTitle);\n            if ($updateFormulaCellReferences) {\n                PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Get sheet state\n     *\n     * @return string Sheet state (visible, hidden, veryHidden)\n     */\n    public function getSheetState()\n    {\n        return $this->sheetState;\n    }\n\n    /**\n     * Set sheet state\n     *\n     * @param string $value Sheet state (visible, hidden, veryHidden)\n     * @return PHPExcel_Worksheet\n     */\n    public function setSheetState($value = PHPExcel_Worksheet::SHEETSTATE_VISIBLE)\n    {\n        $this->sheetState = $value;\n        return $this;\n    }\n\n    /**\n     * Get page setup\n     *\n     * @return PHPExcel_Worksheet_PageSetup\n     */\n    public function getPageSetup()\n    {\n        return $this->pageSetup;\n    }\n\n    /**\n     * Set page setup\n     *\n     * @param PHPExcel_Worksheet_PageSetup    $pValue\n     * @return PHPExcel_Worksheet\n     */\n    public function setPageSetup(PHPExcel_Worksheet_PageSetup $pValue)\n    {\n        $this->pageSetup = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get page margins\n     *\n     * @return PHPExcel_Worksheet_PageMargins\n     */\n    public function getPageMargins()\n    {\n        return $this->pageMargins;\n    }\n\n    /**\n     * Set page margins\n     *\n     * @param PHPExcel_Worksheet_PageMargins    $pValue\n     * @return PHPExcel_Worksheet\n     */\n    public function setPageMargins(PHPExcel_Worksheet_PageMargins $pValue)\n    {\n        $this->pageMargins = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get page header/footer\n     *\n     * @return PHPExcel_Worksheet_HeaderFooter\n     */\n    public function getHeaderFooter()\n    {\n        return $this->headerFooter;\n    }\n\n    /**\n     * Set page header/footer\n     *\n     * @param PHPExcel_Worksheet_HeaderFooter    $pValue\n     * @return PHPExcel_Worksheet\n     */\n    public function setHeaderFooter(PHPExcel_Worksheet_HeaderFooter $pValue)\n    {\n        $this->headerFooter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get sheet view\n     *\n     * @return PHPExcel_Worksheet_SheetView\n     */\n    public function getSheetView()\n    {\n        return $this->sheetView;\n    }\n\n    /**\n     * Set sheet view\n     *\n     * @param PHPExcel_Worksheet_SheetView    $pValue\n     * @return PHPExcel_Worksheet\n     */\n    public function setSheetView(PHPExcel_Worksheet_SheetView $pValue)\n    {\n        $this->sheetView = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Protection\n     *\n     * @return PHPExcel_Worksheet_Protection\n     */\n    public function getProtection()\n    {\n        return $this->protection;\n    }\n\n    /**\n     * Set Protection\n     *\n     * @param PHPExcel_Worksheet_Protection    $pValue\n     * @return PHPExcel_Worksheet\n     */\n    public function setProtection(PHPExcel_Worksheet_Protection $pValue)\n    {\n        $this->protection = $pValue;\n        $this->dirty = true;\n\n        return $this;\n    }\n\n    /**\n     * Get highest worksheet column\n     *\n     * @param   string     $row        Return the data highest column for the specified row,\n     *                                     or the highest column of any row if no row number is passed\n     * @return string Highest column name\n     */\n    public function getHighestColumn($row = null)\n    {\n        if ($row == null) {\n            return $this->cachedHighestColumn;\n        }\n        return $this->getHighestDataColumn($row);\n    }\n\n    /**\n     * Get highest worksheet column that contains data\n     *\n     * @param   string     $row        Return the highest data column for the specified row,\n     *                                     or the highest data column of any row if no row number is passed\n     * @return string Highest column name that contains data\n     */\n    public function getHighestDataColumn($row = null)\n    {\n        return $this->cellCollection->getHighestColumn($row);\n    }\n\n    /**\n     * Get highest worksheet row\n     *\n     * @param   string     $column     Return the highest data row for the specified column,\n     *                                     or the highest row of any column if no column letter is passed\n     * @return int Highest row number\n     */\n    public function getHighestRow($column = null)\n    {\n        if ($column == null) {\n            return $this->cachedHighestRow;\n        }\n        return $this->getHighestDataRow($column);\n    }\n\n    /**\n     * Get highest worksheet row that contains data\n     *\n     * @param   string     $column     Return the highest data row for the specified column,\n     *                                     or the highest data row of any column if no column letter is passed\n     * @return string Highest row number that contains data\n     */\n    public function getHighestDataRow($column = null)\n    {\n        return $this->cellCollection->getHighestRow($column);\n    }\n\n    /**\n     * Get highest worksheet column and highest row that have cell records\n     *\n     * @return array Highest column name and highest row number\n     */\n    public function getHighestRowAndColumn()\n    {\n        return $this->cellCollection->getHighestRowAndColumn();\n    }\n\n    /**\n     * Set a cell value\n     *\n     * @param string $pCoordinate Coordinate of the cell\n     * @param mixed $pValue Value of the cell\n     * @param bool $returnCell   Return the worksheet (false, default) or the cell (true)\n     * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified\n     */\n    public function setCellValue($pCoordinate = 'A1', $pValue = null, $returnCell = false)\n    {\n        $cell = $this->getCell(strtoupper($pCoordinate))->setValue($pValue);\n        return ($returnCell) ? $cell : $this;\n    }\n\n    /**\n     * Set a cell value by using numeric cell coordinates\n     *\n     * @param string $pColumn Numeric column coordinate of the cell (A = 0)\n     * @param string $pRow Numeric row coordinate of the cell\n     * @param mixed $pValue Value of the cell\n     * @param bool $returnCell Return the worksheet (false, default) or the cell (true)\n     * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified\n     */\n    public function setCellValueByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $returnCell = false)\n    {\n        $cell = $this->getCellByColumnAndRow($pColumn, $pRow)->setValue($pValue);\n        return ($returnCell) ? $cell : $this;\n    }\n\n    /**\n     * Set a cell value\n     *\n     * @param string $pCoordinate Coordinate of the cell\n     * @param mixed  $pValue Value of the cell\n     * @param string $pDataType Explicit data type\n     * @param bool $returnCell Return the worksheet (false, default) or the cell (true)\n     * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified\n     */\n    public function setCellValueExplicit($pCoordinate = 'A1', $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false)\n    {\n        // Set value\n        $cell = $this->getCell(strtoupper($pCoordinate))->setValueExplicit($pValue, $pDataType);\n        return ($returnCell) ? $cell : $this;\n    }\n\n    /**\n     * Set a cell value by using numeric cell coordinates\n     *\n     * @param string $pColumn Numeric column coordinate of the cell\n     * @param string $pRow Numeric row coordinate of the cell\n     * @param mixed $pValue Value of the cell\n     * @param string $pDataType Explicit data type\n     * @param bool $returnCell Return the worksheet (false, default) or the cell (true)\n     * @return PHPExcel_Worksheet|PHPExcel_Cell    Depending on the last parameter being specified\n     */\n    public function setCellValueExplicitByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false)\n    {\n        $cell = $this->getCellByColumnAndRow($pColumn, $pRow)->setValueExplicit($pValue, $pDataType);\n        return ($returnCell) ? $cell : $this;\n    }\n\n    /**\n     * Get cell at a specific coordinate\n     *\n     * @param string $pCoordinate    Coordinate of the cell\n     * @param boolean $createIfNotExists  Flag indicating whether a new cell should be created if it doesn't\n     *                                       already exist, or a null should be returned instead\n     * @throws PHPExcel_Exception\n     * @return null|PHPExcel_Cell Cell that was found/created or null\n     */\n    public function getCell($pCoordinate = 'A1', $createIfNotExists = true)\n    {\n        // Check cell collection\n        if ($this->cellCollection->isDataSet(strtoupper($pCoordinate))) {\n            return $this->cellCollection->getCacheData($pCoordinate);\n        }\n\n        // Worksheet reference?\n        if (strpos($pCoordinate, '!') !== false) {\n            $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true);\n            return $this->parent->getSheetByName($worksheetReference[0])->getCell(strtoupper($worksheetReference[1]), $createIfNotExists);\n        }\n\n        // Named range?\n        if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) &&\n            (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) {\n            $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this);\n            if ($namedRange !== null) {\n                $pCoordinate = $namedRange->getRange();\n                return $namedRange->getWorksheet()->getCell($pCoordinate, $createIfNotExists);\n            }\n        }\n\n        // Uppercase coordinate\n        $pCoordinate = strtoupper($pCoordinate);\n\n        if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate can not be a range of cells.');\n        } elseif (strpos($pCoordinate, '$') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate must not be absolute.');\n        }\n\n        // Create new cell object, if required\n        return $createIfNotExists ? $this->createNewCell($pCoordinate) : null;\n    }\n\n    /**\n     * Get cell at a specific coordinate by using numeric cell coordinates\n     *\n     * @param  string $pColumn Numeric column coordinate of the cell (starting from 0)\n     * @param string $pRow Numeric row coordinate of the cell\n     * @param boolean $createIfNotExists  Flag indicating whether a new cell should be created if it doesn't\n     *                                       already exist, or a null should be returned instead\n     * @return null|PHPExcel_Cell Cell that was found/created or null\n     */\n    public function getCellByColumnAndRow($pColumn = 0, $pRow = 1, $createIfNotExists = true)\n    {\n        $columnLetter = PHPExcel_Cell::stringFromColumnIndex($pColumn);\n        $coordinate = $columnLetter . $pRow;\n\n        if ($this->cellCollection->isDataSet($coordinate)) {\n            return $this->cellCollection->getCacheData($coordinate);\n        }\n\n        // Create new cell object, if required\n        return $createIfNotExists ? $this->createNewCell($coordinate) : null;\n    }\n\n    /**\n     * Create a new cell at the specified coordinate\n     *\n     * @param string $pCoordinate    Coordinate of the cell\n     * @return PHPExcel_Cell Cell that was created\n     */\n    private function createNewCell($pCoordinate)\n    {\n        $cell = $this->cellCollection->addCacheData(\n            $pCoordinate,\n            new PHPExcel_Cell(null, PHPExcel_Cell_DataType::TYPE_NULL, $this)\n        );\n        $this->cellCollectionIsSorted = false;\n\n        // Coordinates\n        $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate);\n        if (PHPExcel_Cell::columnIndexFromString($this->cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($aCoordinates[0])) {\n            $this->cachedHighestColumn = $aCoordinates[0];\n        }\n        $this->cachedHighestRow = max($this->cachedHighestRow, $aCoordinates[1]);\n\n        // Cell needs appropriate xfIndex from dimensions records\n        //    but don't create dimension records if they don't already exist\n        $rowDimension    = $this->getRowDimension($aCoordinates[1], false);\n        $columnDimension = $this->getColumnDimension($aCoordinates[0], false);\n\n        if ($rowDimension !== null && $rowDimension->getXfIndex() > 0) {\n            // then there is a row dimension with explicit style, assign it to the cell\n            $cell->setXfIndex($rowDimension->getXfIndex());\n        } elseif ($columnDimension !== null && $columnDimension->getXfIndex() > 0) {\n            // then there is a column dimension, assign it to the cell\n            $cell->setXfIndex($columnDimension->getXfIndex());\n        }\n\n        return $cell;\n    }\n\n    /**\n     * Does the cell at a specific coordinate exist?\n     *\n     * @param string $pCoordinate  Coordinate of the cell\n     * @throws PHPExcel_Exception\n     * @return boolean\n     */\n    public function cellExists($pCoordinate = 'A1')\n    {\n       // Worksheet reference?\n        if (strpos($pCoordinate, '!') !== false) {\n            $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true);\n            return $this->parent->getSheetByName($worksheetReference[0])->cellExists(strtoupper($worksheetReference[1]));\n        }\n\n        // Named range?\n        if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) &&\n            (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) {\n            $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this);\n            if ($namedRange !== null) {\n                $pCoordinate = $namedRange->getRange();\n                if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) {\n                    if (!$namedRange->getLocalOnly()) {\n                        return $namedRange->getWorksheet()->cellExists($pCoordinate);\n                    } else {\n                        throw new PHPExcel_Exception('Named range ' . $namedRange->getName() . ' is not accessible from within sheet ' . $this->getTitle());\n                    }\n                }\n            } else {\n                return false;\n            }\n        }\n\n        // Uppercase coordinate\n        $pCoordinate = strtoupper($pCoordinate);\n\n        if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate can not be a range of cells.');\n        } elseif (strpos($pCoordinate, '$') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate must not be absolute.');\n        } else {\n            // Coordinates\n            $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate);\n\n            // Cell exists?\n            return $this->cellCollection->isDataSet($pCoordinate);\n        }\n    }\n\n    /**\n     * Cell at a specific coordinate by using numeric cell coordinates exists?\n     *\n     * @param string $pColumn Numeric column coordinate of the cell\n     * @param string $pRow Numeric row coordinate of the cell\n     * @return boolean\n     */\n    public function cellExistsByColumnAndRow($pColumn = 0, $pRow = 1)\n    {\n        return $this->cellExists(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);\n    }\n\n    /**\n     * Get row dimension at a specific row\n     *\n     * @param int $pRow Numeric index of the row\n     * @return PHPExcel_Worksheet_RowDimension\n     */\n    public function getRowDimension($pRow = 1, $create = true)\n    {\n        // Found\n        $found = null;\n\n        // Get row dimension\n        if (!isset($this->rowDimensions[$pRow])) {\n            if (!$create) {\n                return null;\n            }\n            $this->rowDimensions[$pRow] = new PHPExcel_Worksheet_RowDimension($pRow);\n\n            $this->cachedHighestRow = max($this->cachedHighestRow, $pRow);\n        }\n        return $this->rowDimensions[$pRow];\n    }\n\n    /**\n     * Get column dimension at a specific column\n     *\n     * @param string $pColumn String index of the column\n     * @return PHPExcel_Worksheet_ColumnDimension\n     */\n    public function getColumnDimension($pColumn = 'A', $create = true)\n    {\n        // Uppercase coordinate\n        $pColumn = strtoupper($pColumn);\n\n        // Fetch dimensions\n        if (!isset($this->columnDimensions[$pColumn])) {\n            if (!$create) {\n                return null;\n            }\n            $this->columnDimensions[$pColumn] = new PHPExcel_Worksheet_ColumnDimension($pColumn);\n\n            if (PHPExcel_Cell::columnIndexFromString($this->cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($pColumn)) {\n                $this->cachedHighestColumn = $pColumn;\n            }\n        }\n        return $this->columnDimensions[$pColumn];\n    }\n\n    /**\n     * Get column dimension at a specific column by using numeric cell coordinates\n     *\n     * @param string $pColumn Numeric column coordinate of the cell\n     * @return PHPExcel_Worksheet_ColumnDimension\n     */\n    public function getColumnDimensionByColumn($pColumn = 0)\n    {\n        return $this->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($pColumn));\n    }\n\n    /**\n     * Get styles\n     *\n     * @return PHPExcel_Style[]\n     */\n    public function getStyles()\n    {\n        return $this->styles;\n    }\n\n    /**\n     * Get default style of workbook.\n     *\n     * @deprecated\n     * @return PHPExcel_Style\n     * @throws PHPExcel_Exception\n     */\n    public function getDefaultStyle()\n    {\n        return $this->parent->getDefaultStyle();\n    }\n\n    /**\n     * Set default style - should only be used by PHPExcel_IReader implementations!\n     *\n     * @deprecated\n     * @param PHPExcel_Style $pValue\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function setDefaultStyle(PHPExcel_Style $pValue)\n    {\n        $this->parent->getDefaultStyle()->applyFromArray(array(\n            'font' => array(\n                'name' => $pValue->getFont()->getName(),\n                'size' => $pValue->getFont()->getSize(),\n            ),\n        ));\n        return $this;\n    }\n\n    /**\n     * Get style for cell\n     *\n     * @param string $pCellCoordinate Cell coordinate (or range) to get style for\n     * @return PHPExcel_Style\n     * @throws PHPExcel_Exception\n     */\n    public function getStyle($pCellCoordinate = 'A1')\n    {\n        // set this sheet as active\n        $this->parent->setActiveSheetIndex($this->parent->getIndex($this));\n\n        // set cell coordinate as active\n        $this->setSelectedCells(strtoupper($pCellCoordinate));\n\n        return $this->parent->getCellXfSupervisor();\n    }\n\n    /**\n     * Get conditional styles for a cell\n     *\n     * @param string $pCoordinate\n     * @return PHPExcel_Style_Conditional[]\n     */\n    public function getConditionalStyles($pCoordinate = 'A1')\n    {\n        $pCoordinate = strtoupper($pCoordinate);\n        if (!isset($this->conditionalStylesCollection[$pCoordinate])) {\n            $this->conditionalStylesCollection[$pCoordinate] = array();\n        }\n        return $this->conditionalStylesCollection[$pCoordinate];\n    }\n\n    /**\n     * Do conditional styles exist for this cell?\n     *\n     * @param string $pCoordinate\n     * @return boolean\n     */\n    public function conditionalStylesExists($pCoordinate = 'A1')\n    {\n        if (isset($this->conditionalStylesCollection[strtoupper($pCoordinate)])) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Removes conditional styles for a cell\n     *\n     * @param string $pCoordinate\n     * @return PHPExcel_Worksheet\n     */\n    public function removeConditionalStyles($pCoordinate = 'A1')\n    {\n        unset($this->conditionalStylesCollection[strtoupper($pCoordinate)]);\n        return $this;\n    }\n\n    /**\n     * Get collection of conditional styles\n     *\n     * @return array\n     */\n    public function getConditionalStylesCollection()\n    {\n        return $this->conditionalStylesCollection;\n    }\n\n    /**\n     * Set conditional styles\n     *\n     * @param $pCoordinate string E.g. 'A1'\n     * @param $pValue PHPExcel_Style_Conditional[]\n     * @return PHPExcel_Worksheet\n     */\n    public function setConditionalStyles($pCoordinate = 'A1', $pValue)\n    {\n        $this->conditionalStylesCollection[strtoupper($pCoordinate)] = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get style for cell by using numeric cell coordinates\n     *\n     * @param int $pColumn  Numeric column coordinate of the cell\n     * @param int $pRow Numeric row coordinate of the cell\n     * @param int pColumn2 Numeric column coordinate of the range cell\n     * @param int pRow2 Numeric row coordinate of the range cell\n     * @return PHPExcel_Style\n     */\n    public function getStyleByColumnAndRow($pColumn = 0, $pRow = 1, $pColumn2 = null, $pRow2 = null)\n    {\n        if (!is_null($pColumn2) && !is_null($pRow2)) {\n            $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;\n            return $this->getStyle($cellRange);\n        }\n\n        return $this->getStyle(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);\n    }\n\n    /**\n     * Set shared cell style to a range of cells\n     *\n     * Please note that this will overwrite existing cell styles for cells in range!\n     *\n     * @deprecated\n     * @param PHPExcel_Style $pSharedCellStyle Cell style to share\n     * @param string $pRange Range of cells (i.e. \"A1:B10\"), or just one cell (i.e. \"A1\")\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function setSharedStyle(PHPExcel_Style $pSharedCellStyle = null, $pRange = '')\n    {\n        $this->duplicateStyle($pSharedCellStyle, $pRange);\n        return $this;\n    }\n\n    /**\n     * Duplicate cell style to a range of cells\n     *\n     * Please note that this will overwrite existing cell styles for cells in range!\n     *\n     * @param PHPExcel_Style $pCellStyle Cell style to duplicate\n     * @param string $pRange Range of cells (i.e. \"A1:B10\"), or just one cell (i.e. \"A1\")\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function duplicateStyle(PHPExcel_Style $pCellStyle = null, $pRange = '')\n    {\n        // make sure we have a real style and not supervisor\n        $style = $pCellStyle->getIsSupervisor() ? $pCellStyle->getSharedComponent() : $pCellStyle;\n\n        // Add the style to the workbook if necessary\n        $workbook = $this->parent;\n        if ($existingStyle = $this->parent->getCellXfByHashCode($pCellStyle->getHashCode())) {\n            // there is already such cell Xf in our collection\n            $xfIndex = $existingStyle->getIndex();\n        } else {\n            // we don't have such a cell Xf, need to add\n            $workbook->addCellXf($pCellStyle);\n            $xfIndex = $pCellStyle->getIndex();\n        }\n\n        // Calculate range outer borders\n        list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange . ':' . $pRange);\n\n        // Make sure we can loop upwards on rows and columns\n        if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {\n            $tmp = $rangeStart;\n            $rangeStart = $rangeEnd;\n            $rangeEnd = $tmp;\n        }\n\n        // Loop through cells and apply styles\n        for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {\n            for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {\n                $this->getCell(PHPExcel_Cell::stringFromColumnIndex($col - 1) . $row)->setXfIndex($xfIndex);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Duplicate conditional style to a range of cells\n     *\n     * Please note that this will overwrite existing cell styles for cells in range!\n     *\n     * @param    array of PHPExcel_Style_Conditional    $pCellStyle    Cell style to duplicate\n     * @param string $pRange Range of cells (i.e. \"A1:B10\"), or just one cell (i.e. \"A1\")\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function duplicateConditionalStyle(array $pCellStyle = null, $pRange = '')\n    {\n        foreach ($pCellStyle as $cellStyle) {\n            if (!($cellStyle instanceof PHPExcel_Style_Conditional)) {\n                throw new PHPExcel_Exception('Style is not a conditional style');\n            }\n        }\n\n        // Calculate range outer borders\n        list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange . ':' . $pRange);\n\n        // Make sure we can loop upwards on rows and columns\n        if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) {\n            $tmp = $rangeStart;\n            $rangeStart = $rangeEnd;\n            $rangeEnd = $tmp;\n        }\n\n        // Loop through cells and apply styles\n        for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) {\n            for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) {\n                $this->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($col - 1) . $row, $pCellStyle);\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Duplicate cell style array to a range of cells\n     *\n     * Please note that this will overwrite existing cell styles for cells in range,\n     * if they are in the styles array. For example, if you decide to set a range of\n     * cells to font bold, only include font bold in the styles array.\n     *\n     * @deprecated\n     * @param array $pStyles Array containing style information\n     * @param string $pRange Range of cells (i.e. \"A1:B10\"), or just one cell (i.e. \"A1\")\n     * @param boolean $pAdvanced Advanced mode for setting borders.\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function duplicateStyleArray($pStyles = null, $pRange = '', $pAdvanced = true)\n    {\n        $this->getStyle($pRange)->applyFromArray($pStyles, $pAdvanced);\n        return $this;\n    }\n\n    /**\n     * Set break on a cell\n     *\n     * @param string $pCell Cell coordinate (e.g. A1)\n     * @param int $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*)\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function setBreak($pCell = 'A1', $pBreak = PHPExcel_Worksheet::BREAK_NONE)\n    {\n        // Uppercase coordinate\n        $pCell = strtoupper($pCell);\n\n        if ($pCell != '') {\n            if ($pBreak == PHPExcel_Worksheet::BREAK_NONE) {\n                if (isset($this->breaks[$pCell])) {\n                    unset($this->breaks[$pCell]);\n                }\n            } else {\n                $this->breaks[$pCell] = $pBreak;\n            }\n        } else {\n            throw new PHPExcel_Exception('No cell coordinate specified.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set break on a cell by using numeric cell coordinates\n     *\n     * @param integer $pColumn Numeric column coordinate of the cell\n     * @param integer $pRow Numeric row coordinate of the cell\n     * @param  integer $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*)\n     * @return PHPExcel_Worksheet\n     */\n    public function setBreakByColumnAndRow($pColumn = 0, $pRow = 1, $pBreak = PHPExcel_Worksheet::BREAK_NONE)\n    {\n        return $this->setBreak(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow, $pBreak);\n    }\n\n    /**\n     * Get breaks\n     *\n     * @return array[]\n     */\n    public function getBreaks()\n    {\n        return $this->breaks;\n    }\n\n    /**\n     * Set merge on a cell range\n     *\n     * @param string $pRange  Cell range (e.g. A1:E1)\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function mergeCells($pRange = 'A1:A1')\n    {\n        // Uppercase coordinate\n        $pRange = strtoupper($pRange);\n\n        if (strpos($pRange, ':') !== false) {\n            $this->mergeCells[$pRange] = $pRange;\n\n            // make sure cells are created\n\n            // get the cells in the range\n            $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange);\n\n            // create upper left cell if it does not already exist\n            $upperLeft = $aReferences[0];\n            if (!$this->cellExists($upperLeft)) {\n                $this->getCell($upperLeft)->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL);\n            }\n\n            // Blank out the rest of the cells in the range (if they exist)\n            $count = count($aReferences);\n            for ($i = 1; $i < $count; $i++) {\n                if ($this->cellExists($aReferences[$i])) {\n                    $this->getCell($aReferences[$i])->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL);\n                }\n            }\n        } else {\n            throw new PHPExcel_Exception('Merge must be set on a range of cells.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Set merge on a cell range by using numeric cell coordinates\n     *\n     * @param int $pColumn1    Numeric column coordinate of the first cell\n     * @param int $pRow1        Numeric row coordinate of the first cell\n     * @param int $pColumn2    Numeric column coordinate of the last cell\n     * @param int $pRow2        Numeric row coordinate of the last cell\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function mergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)\n    {\n        $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;\n        return $this->mergeCells($cellRange);\n    }\n\n    /**\n     * Remove merge on a cell range\n     *\n     * @param    string            $pRange        Cell range (e.g. A1:E1)\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function unmergeCells($pRange = 'A1:A1')\n    {\n        // Uppercase coordinate\n        $pRange = strtoupper($pRange);\n\n        if (strpos($pRange, ':') !== false) {\n            if (isset($this->mergeCells[$pRange])) {\n                unset($this->mergeCells[$pRange]);\n            } else {\n                throw new PHPExcel_Exception('Cell range ' . $pRange . ' not known as merged.');\n            }\n        } else {\n            throw new PHPExcel_Exception('Merge can only be removed from a range of cells.');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Remove merge on a cell range by using numeric cell coordinates\n     *\n     * @param int $pColumn1    Numeric column coordinate of the first cell\n     * @param int $pRow1        Numeric row coordinate of the first cell\n     * @param int $pColumn2    Numeric column coordinate of the last cell\n     * @param int $pRow2        Numeric row coordinate of the last cell\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function unmergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)\n    {\n        $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;\n        return $this->unmergeCells($cellRange);\n    }\n\n    /**\n     * Get merge cells array.\n     *\n     * @return array[]\n     */\n    public function getMergeCells()\n    {\n        return $this->mergeCells;\n    }\n\n    /**\n     * Set merge cells array for the entire sheet. Use instead mergeCells() to merge\n     * a single cell range.\n     *\n     * @param array\n     */\n    public function setMergeCells($pValue = array())\n    {\n        $this->mergeCells = $pValue;\n        return $this;\n    }\n\n    /**\n     * Set protection on a cell range\n     *\n     * @param    string            $pRange                Cell (e.g. A1) or cell range (e.g. A1:E1)\n     * @param    string            $pPassword            Password to unlock the protection\n     * @param    boolean        $pAlreadyHashed    If the password has already been hashed, set this to true\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function protectCells($pRange = 'A1', $pPassword = '', $pAlreadyHashed = false)\n    {\n        // Uppercase coordinate\n        $pRange = strtoupper($pRange);\n\n        if (!$pAlreadyHashed) {\n            $pPassword = PHPExcel_Shared_PasswordHasher::hashPassword($pPassword);\n        }\n        $this->protectedCells[$pRange] = $pPassword;\n\n        return $this;\n    }\n\n    /**\n     * Set protection on a cell range by using numeric cell coordinates\n     *\n     * @param int  $pColumn1            Numeric column coordinate of the first cell\n     * @param int  $pRow1                Numeric row coordinate of the first cell\n     * @param int  $pColumn2            Numeric column coordinate of the last cell\n     * @param int  $pRow2                Numeric row coordinate of the last cell\n     * @param string $pPassword            Password to unlock the protection\n     * @param    boolean $pAlreadyHashed    If the password has already been hashed, set this to true\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function protectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false)\n    {\n        $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;\n        return $this->protectCells($cellRange, $pPassword, $pAlreadyHashed);\n    }\n\n    /**\n     * Remove protection on a cell range\n     *\n     * @param    string            $pRange        Cell (e.g. A1) or cell range (e.g. A1:E1)\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function unprotectCells($pRange = 'A1')\n    {\n        // Uppercase coordinate\n        $pRange = strtoupper($pRange);\n\n        if (isset($this->protectedCells[$pRange])) {\n            unset($this->protectedCells[$pRange]);\n        } else {\n            throw new PHPExcel_Exception('Cell range ' . $pRange . ' not known as protected.');\n        }\n        return $this;\n    }\n\n    /**\n     * Remove protection on a cell range by using numeric cell coordinates\n     *\n     * @param int  $pColumn1            Numeric column coordinate of the first cell\n     * @param int  $pRow1                Numeric row coordinate of the first cell\n     * @param int  $pColumn2            Numeric column coordinate of the last cell\n     * @param int $pRow2                Numeric row coordinate of the last cell\n     * @param string $pPassword            Password to unlock the protection\n     * @param    boolean $pAlreadyHashed    If the password has already been hashed, set this to true\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function unprotectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false)\n    {\n        $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2;\n        return $this->unprotectCells($cellRange, $pPassword, $pAlreadyHashed);\n    }\n\n    /**\n     * Get protected cells\n     *\n     * @return array[]\n     */\n    public function getProtectedCells()\n    {\n        return $this->protectedCells;\n    }\n\n    /**\n     *    Get Autofilter\n     *\n     *    @return PHPExcel_Worksheet_AutoFilter\n     */\n    public function getAutoFilter()\n    {\n        return $this->autoFilter;\n    }\n\n    /**\n     *    Set AutoFilter\n     *\n     *    @param    PHPExcel_Worksheet_AutoFilter|string   $pValue\n     *            A simple string containing a Cell range like 'A1:E10' is permitted for backward compatibility\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet\n     */\n    public function setAutoFilter($pValue)\n    {\n        $pRange = strtoupper($pValue);\n        if (is_string($pValue)) {\n            $this->autoFilter->setRange($pValue);\n        } elseif (is_object($pValue) && ($pValue instanceof PHPExcel_Worksheet_AutoFilter)) {\n            $this->autoFilter = $pValue;\n        }\n        return $this;\n    }\n\n    /**\n     *    Set Autofilter Range by using numeric cell coordinates\n     *\n     *    @param  integer  $pColumn1    Numeric column coordinate of the first cell\n     *    @param  integer  $pRow1       Numeric row coordinate of the first cell\n     *    @param  integer  $pColumn2    Numeric column coordinate of the second cell\n     *    @param  integer  $pRow2       Numeric row coordinate of the second cell\n     *    @throws    PHPExcel_Exception\n     *    @return PHPExcel_Worksheet\n     */\n    public function setAutoFilterByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)\n    {\n        return $this->setAutoFilter(\n            PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1\n            . ':' .\n            PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2\n        );\n    }\n\n    /**\n     * Remove autofilter\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function removeAutoFilter()\n    {\n        $this->autoFilter->setRange(null);\n        return $this;\n    }\n\n    /**\n     * Get Freeze Pane\n     *\n     * @return string\n     */\n    public function getFreezePane()\n    {\n        return $this->freezePane;\n    }\n\n    /**\n     * Freeze Pane\n     *\n     * @param    string        $pCell        Cell (i.e. A2)\n     *                                    Examples:\n     *                                        A2 will freeze the rows above cell A2 (i.e row 1)\n     *                                        B1 will freeze the columns to the left of cell B1 (i.e column A)\n     *                                        B2 will freeze the rows above and to the left of cell A2\n     *                                            (i.e row 1 and column A)\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function freezePane($pCell = '')\n    {\n        // Uppercase coordinate\n        $pCell = strtoupper($pCell);\n        if (strpos($pCell, ':') === false && strpos($pCell, ',') === false) {\n            $this->freezePane = $pCell;\n        } else {\n            throw new PHPExcel_Exception('Freeze pane can not be set on a range of cells.');\n        }\n        return $this;\n    }\n\n    /**\n     * Freeze Pane by using numeric cell coordinates\n     *\n     * @param int $pColumn    Numeric column coordinate of the cell\n     * @param int $pRow        Numeric row coordinate of the cell\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function freezePaneByColumnAndRow($pColumn = 0, $pRow = 1)\n    {\n        return $this->freezePane(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);\n    }\n\n    /**\n     * Unfreeze Pane\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function unfreezePane()\n    {\n        return $this->freezePane('');\n    }\n\n    /**\n     * Insert a new row, updating all possible related data\n     *\n     * @param int $pBefore    Insert before this one\n     * @param int $pNumRows    Number of rows to insert\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function insertNewRowBefore($pBefore = 1, $pNumRows = 1)\n    {\n        if ($pBefore >= 1) {\n            $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();\n            $objReferenceHelper->insertNewBefore('A' . $pBefore, 0, $pNumRows, $this);\n        } else {\n            throw new PHPExcel_Exception(\"Rows can only be inserted before at least row 1.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Insert a new column, updating all possible related data\n     *\n     * @param int $pBefore    Insert before this one\n     * @param int $pNumCols    Number of columns to insert\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function insertNewColumnBefore($pBefore = 'A', $pNumCols = 1)\n    {\n        if (!is_numeric($pBefore)) {\n            $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();\n            $objReferenceHelper->insertNewBefore($pBefore . '1', $pNumCols, 0, $this);\n        } else {\n            throw new PHPExcel_Exception(\"Column references should not be numeric.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Insert a new column, updating all possible related data\n     *\n     * @param int $pBefore    Insert before this one (numeric column coordinate of the cell)\n     * @param int $pNumCols    Number of columns to insert\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function insertNewColumnBeforeByIndex($pBefore = 0, $pNumCols = 1)\n    {\n        if ($pBefore >= 0) {\n            return $this->insertNewColumnBefore(PHPExcel_Cell::stringFromColumnIndex($pBefore), $pNumCols);\n        } else {\n            throw new PHPExcel_Exception(\"Columns can only be inserted before at least column A (0).\");\n        }\n    }\n\n    /**\n     * Delete a row, updating all possible related data\n     *\n     * @param int $pRow        Remove starting with this one\n     * @param int $pNumRows    Number of rows to remove\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function removeRow($pRow = 1, $pNumRows = 1)\n    {\n        if ($pRow >= 1) {\n            $highestRow = $this->getHighestDataRow();\n            $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();\n            $objReferenceHelper->insertNewBefore('A' . ($pRow + $pNumRows), 0, -$pNumRows, $this);\n            for ($r = 0; $r < $pNumRows; ++$r) {\n                $this->getCellCacheController()->removeRow($highestRow);\n                --$highestRow;\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Rows to be deleted should at least start from row 1.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Remove a column, updating all possible related data\n     *\n     * @param string    $pColumn     Remove starting with this one\n     * @param int       $pNumCols    Number of columns to remove\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function removeColumn($pColumn = 'A', $pNumCols = 1)\n    {\n        if (!is_numeric($pColumn)) {\n            $highestColumn = $this->getHighestDataColumn();\n            $pColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($pColumn) - 1 + $pNumCols);\n            $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance();\n            $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this);\n            for ($c = 0; $c < $pNumCols; ++$c) {\n                $this->getCellCacheController()->removeColumn($highestColumn);\n                $highestColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($highestColumn) - 2);\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Column references should not be numeric.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Remove a column, updating all possible related data\n     *\n     * @param int $pColumn    Remove starting with this one (numeric column coordinate of the cell)\n     * @param int $pNumCols    Number of columns to remove\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function removeColumnByIndex($pColumn = 0, $pNumCols = 1)\n    {\n        if ($pColumn >= 0) {\n            return $this->removeColumn(PHPExcel_Cell::stringFromColumnIndex($pColumn), $pNumCols);\n        } else {\n            throw new PHPExcel_Exception(\"Columns to be deleted should at least start from column 0\");\n        }\n    }\n\n    /**\n     * Show gridlines?\n     *\n     * @return boolean\n     */\n    public function getShowGridlines()\n    {\n        return $this->showGridlines;\n    }\n\n    /**\n     * Set show gridlines\n     *\n     * @param boolean $pValue    Show gridlines (true/false)\n     * @return PHPExcel_Worksheet\n     */\n    public function setShowGridlines($pValue = false)\n    {\n        $this->showGridlines = $pValue;\n        return $this;\n    }\n\n    /**\n    * Print gridlines?\n    *\n    * @return boolean\n    */\n    public function getPrintGridlines()\n    {\n        return $this->printGridlines;\n    }\n\n    /**\n    * Set print gridlines\n    *\n    * @param boolean $pValue Print gridlines (true/false)\n    * @return PHPExcel_Worksheet\n    */\n    public function setPrintGridlines($pValue = false)\n    {\n        $this->printGridlines = $pValue;\n        return $this;\n    }\n\n    /**\n    * Show row and column headers?\n    *\n    * @return boolean\n    */\n    public function getShowRowColHeaders()\n    {\n        return $this->showRowColHeaders;\n    }\n\n    /**\n    * Set show row and column headers\n    *\n    * @param boolean $pValue Show row and column headers (true/false)\n    * @return PHPExcel_Worksheet\n    */\n    public function setShowRowColHeaders($pValue = false)\n    {\n        $this->showRowColHeaders = $pValue;\n        return $this;\n    }\n\n    /**\n     * Show summary below? (Row/Column outlining)\n     *\n     * @return boolean\n     */\n    public function getShowSummaryBelow()\n    {\n        return $this->showSummaryBelow;\n    }\n\n    /**\n     * Set show summary below\n     *\n     * @param boolean $pValue    Show summary below (true/false)\n     * @return PHPExcel_Worksheet\n     */\n    public function setShowSummaryBelow($pValue = true)\n    {\n        $this->showSummaryBelow = $pValue;\n        return $this;\n    }\n\n    /**\n     * Show summary right? (Row/Column outlining)\n     *\n     * @return boolean\n     */\n    public function getShowSummaryRight()\n    {\n        return $this->showSummaryRight;\n    }\n\n    /**\n     * Set show summary right\n     *\n     * @param boolean $pValue    Show summary right (true/false)\n     * @return PHPExcel_Worksheet\n     */\n    public function setShowSummaryRight($pValue = true)\n    {\n        $this->showSummaryRight = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get comments\n     *\n     * @return PHPExcel_Comment[]\n     */\n    public function getComments()\n    {\n        return $this->comments;\n    }\n\n    /**\n     * Set comments array for the entire sheet.\n     *\n     * @param array of PHPExcel_Comment\n     * @return PHPExcel_Worksheet\n     */\n    public function setComments($pValue = array())\n    {\n        $this->comments = $pValue;\n\n        return $this;\n    }\n\n    /**\n     * Get comment for cell\n     *\n     * @param string $pCellCoordinate    Cell coordinate to get comment for\n     * @return PHPExcel_Comment\n     * @throws PHPExcel_Exception\n     */\n    public function getComment($pCellCoordinate = 'A1')\n    {\n        // Uppercase coordinate\n        $pCellCoordinate = strtoupper($pCellCoordinate);\n\n        if (strpos($pCellCoordinate, ':') !== false || strpos($pCellCoordinate, ',') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells.');\n        } elseif (strpos($pCellCoordinate, '$') !== false) {\n            throw new PHPExcel_Exception('Cell coordinate string must not be absolute.');\n        } elseif ($pCellCoordinate == '') {\n            throw new PHPExcel_Exception('Cell coordinate can not be zero-length string.');\n        } else {\n            // Check if we already have a comment for this cell.\n            // If not, create a new comment.\n            if (isset($this->comments[$pCellCoordinate])) {\n                return $this->comments[$pCellCoordinate];\n            } else {\n                $newComment = new PHPExcel_Comment();\n                $this->comments[$pCellCoordinate] = $newComment;\n                return $newComment;\n            }\n        }\n    }\n\n    /**\n     * Get comment for cell by using numeric cell coordinates\n     *\n     * @param int $pColumn    Numeric column coordinate of the cell\n     * @param int $pRow        Numeric row coordinate of the cell\n     * @return PHPExcel_Comment\n     */\n    public function getCommentByColumnAndRow($pColumn = 0, $pRow = 1)\n    {\n        return $this->getComment(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);\n    }\n\n    /**\n     * Get selected cell\n     *\n     * @deprecated\n     * @return string\n     */\n    public function getSelectedCell()\n    {\n        return $this->getSelectedCells();\n    }\n\n    /**\n     * Get active cell\n     *\n     * @return string Example: 'A1'\n     */\n    public function getActiveCell()\n    {\n        return $this->activeCell;\n    }\n\n    /**\n     * Get selected cells\n     *\n     * @return string\n     */\n    public function getSelectedCells()\n    {\n        return $this->selectedCells;\n    }\n\n    /**\n     * Selected cell\n     *\n     * @param    string        $pCoordinate    Cell (i.e. A1)\n     * @return PHPExcel_Worksheet\n     */\n    public function setSelectedCell($pCoordinate = 'A1')\n    {\n        return $this->setSelectedCells($pCoordinate);\n    }\n\n    /**\n     * Select a range of cells.\n     *\n     * @param    string        $pCoordinate    Cell range, examples: 'A1', 'B2:G5', 'A:C', '3:6'\n     * @throws    PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function setSelectedCells($pCoordinate = 'A1')\n    {\n        // Uppercase coordinate\n        $pCoordinate = strtoupper($pCoordinate);\n\n        // Convert 'A' to 'A:A'\n        $pCoordinate = preg_replace('/^([A-Z]+)$/', '${1}:${1}', $pCoordinate);\n\n        // Convert '1' to '1:1'\n        $pCoordinate = preg_replace('/^([0-9]+)$/', '${1}:${1}', $pCoordinate);\n\n        // Convert 'A:C' to 'A1:C1048576'\n        $pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $pCoordinate);\n\n        // Convert '1:3' to 'A1:XFD3'\n        $pCoordinate = preg_replace('/^([0-9]+):([0-9]+)$/', 'A${1}:XFD${2}', $pCoordinate);\n\n        if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) {\n            list($first, ) = PHPExcel_Cell::splitRange($pCoordinate);\n            $this->activeCell = $first[0];\n        } else {\n            $this->activeCell = $pCoordinate;\n        }\n        $this->selectedCells = $pCoordinate;\n        return $this;\n    }\n\n    /**\n     * Selected cell by using numeric cell coordinates\n     *\n     * @param int $pColumn Numeric column coordinate of the cell\n     * @param int $pRow Numeric row coordinate of the cell\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function setSelectedCellByColumnAndRow($pColumn = 0, $pRow = 1)\n    {\n        return $this->setSelectedCells(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow);\n    }\n\n    /**\n     * Get right-to-left\n     *\n     * @return boolean\n     */\n    public function getRightToLeft()\n    {\n        return $this->rightToLeft;\n    }\n\n    /**\n     * Set right-to-left\n     *\n     * @param boolean $value    Right-to-left true/false\n     * @return PHPExcel_Worksheet\n     */\n    public function setRightToLeft($value = false)\n    {\n        $this->rightToLeft = $value;\n        return $this;\n    }\n\n    /**\n     * Fill worksheet from values in array\n     *\n     * @param array $source Source array\n     * @param mixed $nullValue Value in source array that stands for blank cell\n     * @param string $startCell Insert array starting from this cell address as the top left coordinate\n     * @param boolean $strictNullComparison Apply strict comparison when testing for null values in the array\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function fromArray($source = null, $nullValue = null, $startCell = 'A1', $strictNullComparison = false)\n    {\n        if (is_array($source)) {\n            //    Convert a 1-D array to 2-D (for ease of looping)\n            if (!is_array(end($source))) {\n                $source = array($source);\n            }\n\n            // start coordinate\n            list ($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($startCell);\n\n            // Loop through $source\n            foreach ($source as $rowData) {\n                $currentColumn = $startColumn;\n                foreach ($rowData as $cellValue) {\n                    if ($strictNullComparison) {\n                        if ($cellValue !== $nullValue) {\n                            // Set cell value\n                            $this->getCell($currentColumn . $startRow)->setValue($cellValue);\n                        }\n                    } else {\n                        if ($cellValue != $nullValue) {\n                            // Set cell value\n                            $this->getCell($currentColumn . $startRow)->setValue($cellValue);\n                        }\n                    }\n                    ++$currentColumn;\n                }\n                ++$startRow;\n            }\n        } else {\n            throw new PHPExcel_Exception(\"Parameter \\$source should be an array.\");\n        }\n        return $this;\n    }\n\n    /**\n     * Create array from a range of cells\n     *\n     * @param string $pRange Range of cells (i.e. \"A1:B10\"), or just one cell (i.e. \"A1\")\n     * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist\n     * @param boolean $calculateFormulas Should formulas be calculated?\n     * @param boolean $formatData Should formatting be applied to cell values?\n     * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero\n     *                               True - Return rows and columns indexed by their actual row and column IDs\n     * @return array\n     */\n    public function rangeToArray($pRange = 'A1', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false)\n    {\n        // Returnvalue\n        $returnValue = array();\n        //    Identify the range that we need to extract from the worksheet\n        list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);\n        $minCol = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] -1);\n        $minRow = $rangeStart[1];\n        $maxCol = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] -1);\n        $maxRow = $rangeEnd[1];\n\n        $maxCol++;\n        // Loop through rows\n        $r = -1;\n        for ($row = $minRow; $row <= $maxRow; ++$row) {\n            $rRef = ($returnCellRef) ? $row : ++$r;\n            $c = -1;\n            // Loop through columns in the current row\n            for ($col = $minCol; $col != $maxCol; ++$col) {\n                $cRef = ($returnCellRef) ? $col : ++$c;\n                //    Using getCell() will create a new cell if it doesn't already exist. We don't want that to happen\n                //        so we test and retrieve directly against cellCollection\n                if ($this->cellCollection->isDataSet($col.$row)) {\n                    // Cell exists\n                    $cell = $this->cellCollection->getCacheData($col.$row);\n                    if ($cell->getValue() !== null) {\n                        if ($cell->getValue() instanceof PHPExcel_RichText) {\n                            $returnValue[$rRef][$cRef] = $cell->getValue()->getPlainText();\n                        } else {\n                            if ($calculateFormulas) {\n                                $returnValue[$rRef][$cRef] = $cell->getCalculatedValue();\n                            } else {\n                                $returnValue[$rRef][$cRef] = $cell->getValue();\n                            }\n                        }\n\n                        if ($formatData) {\n                            $style = $this->parent->getCellXfByIndex($cell->getXfIndex());\n                            $returnValue[$rRef][$cRef] = PHPExcel_Style_NumberFormat::toFormattedString(\n                                $returnValue[$rRef][$cRef],\n                                ($style && $style->getNumberFormat()) ? $style->getNumberFormat()->getFormatCode() : PHPExcel_Style_NumberFormat::FORMAT_GENERAL\n                            );\n                        }\n                    } else {\n                        // Cell holds a NULL\n                        $returnValue[$rRef][$cRef] = $nullValue;\n                    }\n                } else {\n                    // Cell doesn't exist\n                    $returnValue[$rRef][$cRef] = $nullValue;\n                }\n            }\n        }\n\n        // Return\n        return $returnValue;\n    }\n\n\n    /**\n     * Create array from a range of cells\n     *\n     * @param  string $pNamedRange Name of the Named Range\n     * @param  mixed  $nullValue Value returned in the array entry if a cell doesn't exist\n     * @param  boolean $calculateFormulas  Should formulas be calculated?\n     * @param  boolean $formatData  Should formatting be applied to cell values?\n     * @param  boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero\n     *                                True - Return rows and columns indexed by their actual row and column IDs\n     * @return array\n     * @throws PHPExcel_Exception\n     */\n    public function namedRangeToArray($pNamedRange = '', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false)\n    {\n        $namedRange = PHPExcel_NamedRange::resolveRange($pNamedRange, $this);\n        if ($namedRange !== null) {\n            $pWorkSheet = $namedRange->getWorksheet();\n            $pCellRange = $namedRange->getRange();\n\n            return $pWorkSheet->rangeToArray($pCellRange, $nullValue, $calculateFormulas, $formatData, $returnCellRef);\n        }\n\n        throw new PHPExcel_Exception('Named Range '.$pNamedRange.' does not exist.');\n    }\n\n\n    /**\n     * Create array from worksheet\n     *\n     * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist\n     * @param boolean $calculateFormulas Should formulas be calculated?\n     * @param boolean $formatData  Should formatting be applied to cell values?\n     * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero\n     *                               True - Return rows and columns indexed by their actual row and column IDs\n     * @return array\n     */\n    public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false)\n    {\n        // Garbage collect...\n        $this->garbageCollect();\n\n        //    Identify the range that we need to extract from the worksheet\n        $maxCol = $this->getHighestColumn();\n        $maxRow = $this->getHighestRow();\n        // Return\n        return $this->rangeToArray('A1:'.$maxCol.$maxRow, $nullValue, $calculateFormulas, $formatData, $returnCellRef);\n    }\n\n    /**\n     * Get row iterator\n     *\n     * @param   integer   $startRow   The row number at which to start iterating\n     * @param   integer   $endRow     The row number at which to stop iterating\n     *\n     * @return PHPExcel_Worksheet_RowIterator\n     */\n    public function getRowIterator($startRow = 1, $endRow = null)\n    {\n        return new PHPExcel_Worksheet_RowIterator($this, $startRow, $endRow);\n    }\n\n    /**\n     * Get column iterator\n     *\n     * @param   string   $startColumn The column address at which to start iterating\n     * @param   string   $endColumn   The column address at which to stop iterating\n     *\n     * @return PHPExcel_Worksheet_ColumnIterator\n     */\n    public function getColumnIterator($startColumn = 'A', $endColumn = null)\n    {\n        return new PHPExcel_Worksheet_ColumnIterator($this, $startColumn, $endColumn);\n    }\n\n    /**\n     * Run PHPExcel garabage collector.\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function garbageCollect()\n    {\n        // Flush cache\n        $this->cellCollection->getCacheData('A1');\n        // Build a reference table from images\n//        $imageCoordinates = array();\n//        $iterator = $this->getDrawingCollection()->getIterator();\n//        while ($iterator->valid()) {\n//            $imageCoordinates[$iterator->current()->getCoordinates()] = true;\n//\n//            $iterator->next();\n//        }\n//\n        // Lookup highest column and highest row if cells are cleaned\n        $colRow = $this->cellCollection->getHighestRowAndColumn();\n        $highestRow = $colRow['row'];\n        $highestColumn = PHPExcel_Cell::columnIndexFromString($colRow['column']);\n\n        // Loop through column dimensions\n        foreach ($this->columnDimensions as $dimension) {\n            $highestColumn = max($highestColumn, PHPExcel_Cell::columnIndexFromString($dimension->getColumnIndex()));\n        }\n\n        // Loop through row dimensions\n        foreach ($this->rowDimensions as $dimension) {\n            $highestRow = max($highestRow, $dimension->getRowIndex());\n        }\n\n        // Cache values\n        if ($highestColumn < 0) {\n            $this->cachedHighestColumn = 'A';\n        } else {\n            $this->cachedHighestColumn = PHPExcel_Cell::stringFromColumnIndex(--$highestColumn);\n        }\n        $this->cachedHighestRow = $highestRow;\n\n        // Return\n        return $this;\n    }\n\n    /**\n     * Get hash code\n     *\n     * @return string    Hash code\n     */\n    public function getHashCode()\n    {\n        if ($this->dirty) {\n            $this->hash = md5($this->title . $this->autoFilter . ($this->protection->isProtectionEnabled() ? 't' : 'f') . __CLASS__);\n            $this->dirty = false;\n        }\n        return $this->hash;\n    }\n\n    /**\n     * Extract worksheet title from range.\n     *\n     * Example: extractSheetTitle(\"testSheet!A1\") ==> 'A1'\n     * Example: extractSheetTitle(\"'testSheet 1'!A1\", true) ==> array('testSheet 1', 'A1');\n     *\n     * @param string $pRange    Range to extract title from\n     * @param bool $returnRange    Return range? (see example)\n     * @return mixed\n     */\n    public static function extractSheetTitle($pRange, $returnRange = false)\n    {\n        // Sheet title included?\n        if (($sep = strpos($pRange, '!')) === false) {\n            return '';\n        }\n\n        if ($returnRange) {\n            return array(trim(substr($pRange, 0, $sep), \"'\"), substr($pRange, $sep + 1));\n        }\n\n        return substr($pRange, $sep + 1);\n    }\n\n    /**\n     * Get hyperlink\n     *\n     * @param string $pCellCoordinate    Cell coordinate to get hyperlink for\n     */\n    public function getHyperlink($pCellCoordinate = 'A1')\n    {\n        // return hyperlink if we already have one\n        if (isset($this->hyperlinkCollection[$pCellCoordinate])) {\n            return $this->hyperlinkCollection[$pCellCoordinate];\n        }\n\n        // else create hyperlink\n        $this->hyperlinkCollection[$pCellCoordinate] = new PHPExcel_Cell_Hyperlink();\n        return $this->hyperlinkCollection[$pCellCoordinate];\n    }\n\n    /**\n     * Set hyperlnk\n     *\n     * @param string $pCellCoordinate    Cell coordinate to insert hyperlink\n     * @param    PHPExcel_Cell_Hyperlink    $pHyperlink\n     * @return PHPExcel_Worksheet\n     */\n    public function setHyperlink($pCellCoordinate = 'A1', PHPExcel_Cell_Hyperlink $pHyperlink = null)\n    {\n        if ($pHyperlink === null) {\n            unset($this->hyperlinkCollection[$pCellCoordinate]);\n        } else {\n            $this->hyperlinkCollection[$pCellCoordinate] = $pHyperlink;\n        }\n        return $this;\n    }\n\n    /**\n     * Hyperlink at a specific coordinate exists?\n     *\n     * @param string $pCoordinate\n     * @return boolean\n     */\n    public function hyperlinkExists($pCoordinate = 'A1')\n    {\n        return isset($this->hyperlinkCollection[$pCoordinate]);\n    }\n\n    /**\n     * Get collection of hyperlinks\n     *\n     * @return PHPExcel_Cell_Hyperlink[]\n     */\n    public function getHyperlinkCollection()\n    {\n        return $this->hyperlinkCollection;\n    }\n\n    /**\n     * Get data validation\n     *\n     * @param string $pCellCoordinate Cell coordinate to get data validation for\n     */\n    public function getDataValidation($pCellCoordinate = 'A1')\n    {\n        // return data validation if we already have one\n        if (isset($this->dataValidationCollection[$pCellCoordinate])) {\n            return $this->dataValidationCollection[$pCellCoordinate];\n        }\n\n        // else create data validation\n        $this->dataValidationCollection[$pCellCoordinate] = new PHPExcel_Cell_DataValidation();\n        return $this->dataValidationCollection[$pCellCoordinate];\n    }\n\n    /**\n     * Set data validation\n     *\n     * @param string $pCellCoordinate    Cell coordinate to insert data validation\n     * @param    PHPExcel_Cell_DataValidation    $pDataValidation\n     * @return PHPExcel_Worksheet\n     */\n    public function setDataValidation($pCellCoordinate = 'A1', PHPExcel_Cell_DataValidation $pDataValidation = null)\n    {\n        if ($pDataValidation === null) {\n            unset($this->dataValidationCollection[$pCellCoordinate]);\n        } else {\n            $this->dataValidationCollection[$pCellCoordinate] = $pDataValidation;\n        }\n        return $this;\n    }\n\n    /**\n     * Data validation at a specific coordinate exists?\n     *\n     * @param string $pCoordinate\n     * @return boolean\n     */\n    public function dataValidationExists($pCoordinate = 'A1')\n    {\n        return isset($this->dataValidationCollection[$pCoordinate]);\n    }\n\n    /**\n     * Get collection of data validations\n     *\n     * @return PHPExcel_Cell_DataValidation[]\n     */\n    public function getDataValidationCollection()\n    {\n        return $this->dataValidationCollection;\n    }\n\n    /**\n     * Accepts a range, returning it as a range that falls within the current highest row and column of the worksheet\n     *\n     * @param string $range\n     * @return string Adjusted range value\n     */\n    public function shrinkRangeToFit($range)\n    {\n        $maxCol = $this->getHighestColumn();\n        $maxRow = $this->getHighestRow();\n        $maxCol = PHPExcel_Cell::columnIndexFromString($maxCol);\n\n        $rangeBlocks = explode(' ', $range);\n        foreach ($rangeBlocks as &$rangeSet) {\n            $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($rangeSet);\n\n            if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[0][0]) > $maxCol) {\n                $rangeBoundaries[0][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol);\n            }\n            if ($rangeBoundaries[0][1] > $maxRow) {\n                $rangeBoundaries[0][1] = $maxRow;\n            }\n            if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[1][0]) > $maxCol) {\n                $rangeBoundaries[1][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol);\n            }\n            if ($rangeBoundaries[1][1] > $maxRow) {\n                $rangeBoundaries[1][1] = $maxRow;\n            }\n            $rangeSet = $rangeBoundaries[0][0].$rangeBoundaries[0][1].':'.$rangeBoundaries[1][0].$rangeBoundaries[1][1];\n        }\n        unset($rangeSet);\n        $stRange = implode(' ', $rangeBlocks);\n\n        return $stRange;\n    }\n\n    /**\n     * Get tab color\n     *\n     * @return PHPExcel_Style_Color\n     */\n    public function getTabColor()\n    {\n        if ($this->tabColor === null) {\n            $this->tabColor = new PHPExcel_Style_Color();\n        }\n        return $this->tabColor;\n    }\n\n    /**\n     * Reset tab color\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function resetTabColor()\n    {\n        $this->tabColor = null;\n        unset($this->tabColor);\n\n        return $this;\n    }\n\n    /**\n     * Tab color set?\n     *\n     * @return boolean\n     */\n    public function isTabColorSet()\n    {\n        return ($this->tabColor !== null);\n    }\n\n    /**\n     * Copy worksheet (!= clone!)\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function copy()\n    {\n        $copied = clone $this;\n\n        return $copied;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        foreach ($this as $key => $val) {\n            if ($key == 'parent') {\n                continue;\n            }\n\n            if (is_object($val) || (is_array($val))) {\n                if ($key == 'cellCollection') {\n                    $newCollection = clone $this->cellCollection;\n                    $newCollection->copyCellCollection($this);\n                    $this->cellCollection = $newCollection;\n                } elseif ($key == 'drawingCollection') {\n                    $newCollection = clone $this->drawingCollection;\n                    $this->drawingCollection = $newCollection;\n                } elseif (($key == 'autoFilter') && ($this->autoFilter instanceof PHPExcel_Worksheet_AutoFilter)) {\n                    $newAutoFilter = clone $this->autoFilter;\n                    $this->autoFilter = $newAutoFilter;\n                    $this->autoFilter->setParent($this);\n                } else {\n                    $this->{$key} = unserialize(serialize($val));\n                }\n            }\n        }\n    }\n/**\n     * Define the code name of the sheet\n     *\n     * @param null|string Same rule as Title minus space not allowed (but, like Excel, change silently space to underscore)\n     * @return objWorksheet\n     * @throws PHPExcel_Exception\n    */\n    public function setCodeName($pValue = null)\n    {\n        // Is this a 'rename' or not?\n        if ($this->getCodeName() == $pValue) {\n            return $this;\n        }\n        $pValue = str_replace(' ', '_', $pValue);//Excel does this automatically without flinching, we are doing the same\n        // Syntax check\n        // throw an exception if not valid\n        self::checkSheetCodeName($pValue);\n\n        // We use the same code that setTitle to find a valid codeName else not using a space (Excel don't like) but a '_'\n\n        if ($this->getParent()) {\n            // Is there already such sheet name?\n            if ($this->getParent()->sheetCodeNameExists($pValue)) {\n                // Use name, but append with lowest possible integer\n\n                if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) {\n                    $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 29);\n                }\n                $i = 1;\n                while ($this->getParent()->sheetCodeNameExists($pValue . '_' . $i)) {\n                    ++$i;\n                    if ($i == 10) {\n                        if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) {\n                            $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 28);\n                        }\n                    } elseif ($i == 100) {\n                        if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) {\n                            $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 27);\n                        }\n                    }\n                }\n\n                $pValue = $pValue . '_' . $i;// ok, we have a valid name\n                //codeName is'nt used in formula : no need to call for an update\n                //return $this->setTitle($altTitle, $updateFormulaCellReferences);\n            }\n        }\n\n        $this->codeName=$pValue;\n        return $this;\n    }\n    /**\n     * Return the code name of the sheet\n     *\n     * @return null|string\n    */\n    public function getCodeName()\n    {\n        return $this->codeName;\n    }\n    /**\n     * Sheet has a code name ?\n     * @return boolean\n    */\n    public function hasCodeName()\n    {\n        return !(is_null($this->codeName));\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/WorksheetIterator.php",
    "content": "<?php\n\n/**\n * PHPExcel_WorksheetIterator\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_WorksheetIterator implements Iterator\n{\n    /**\n     * Spreadsheet to iterate\n     *\n     * @var PHPExcel\n     */\n    private $subject;\n\n    /**\n     * Current iterator position\n     *\n     * @var int\n     */\n    private $position = 0;\n\n    /**\n     * Create a new worksheet iterator\n     *\n     * @param PHPExcel         $subject\n     */\n    public function __construct(PHPExcel $subject = null)\n    {\n        // Set subject\n        $this->subject = $subject;\n    }\n\n    /**\n     * Destructor\n     */\n    public function __destruct()\n    {\n        unset($this->subject);\n    }\n\n    /**\n     * Rewind iterator\n     */\n    public function rewind()\n    {\n        $this->position = 0;\n    }\n\n    /**\n     * Current PHPExcel_Worksheet\n     *\n     * @return PHPExcel_Worksheet\n     */\n    public function current()\n    {\n        return $this->subject->getSheet($this->position);\n    }\n\n    /**\n     * Current key\n     *\n     * @return int\n     */\n    public function key()\n    {\n        return $this->position;\n    }\n\n    /**\n     * Next value\n     */\n    public function next()\n    {\n        ++$this->position;\n    }\n\n    /**\n     * More PHPExcel_Worksheet instances available?\n     *\n     * @return boolean\n     */\n    public function valid()\n    {\n        return $this->position < $this->subject->getSheetCount();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Abstract.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Abstract\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter\n{\n    /**\n     * Write charts that are defined in the workbook?\n     * Identifies whether the Writer should write definitions for any charts that exist in the PHPExcel object;\n     *\n     * @var    boolean\n     */\n    protected $includeCharts = false;\n\n    /**\n     * Pre-calculate formulas\n     * Forces PHPExcel to recalculate all formulae in a workbook when saving, so that the pre-calculated values are\n     *    immediately available to MS Excel or other office spreadsheet viewer when opening the file\n     *\n     * @var boolean\n     */\n    protected $preCalculateFormulas = true;\n\n    /**\n     * Use disk caching where possible?\n     *\n     * @var boolean\n     */\n    protected $_useDiskCaching = false;\n\n    /**\n     * Disk caching directory\n     *\n     * @var string\n     */\n    protected $_diskCachingDirectory    = './';\n\n    /**\n     * Write charts in workbook?\n     *        If this is true, then the Writer will write definitions for any charts that exist in the PHPExcel object.\n     *        If false (the default) it will ignore any charts defined in the PHPExcel object.\n     *\n     * @return    boolean\n     */\n    public function getIncludeCharts()\n    {\n        return $this->includeCharts;\n    }\n\n    /**\n     * Set write charts in workbook\n     *        Set to true, to advise the Writer to include any charts that exist in the PHPExcel object.\n     *        Set to false (the default) to ignore charts.\n     *\n     * @param    boolean    $pValue\n     * @return    PHPExcel_Writer_IWriter\n     */\n    public function setIncludeCharts($pValue = false)\n    {\n        $this->includeCharts = (boolean) $pValue;\n        return $this;\n    }\n\n    /**\n     * Get Pre-Calculate Formulas flag\n     *     If this is true (the default), then the writer will recalculate all formulae in a workbook when saving,\n     *        so that the pre-calculated values are immediately available to MS Excel or other office spreadsheet\n     *        viewer when opening the file\n     *     If false, then formulae are not calculated on save. This is faster for saving in PHPExcel, but slower\n     *        when opening the resulting file in MS Excel, because Excel has to recalculate the formulae itself\n     *\n     * @return boolean\n     */\n    public function getPreCalculateFormulas()\n    {\n        return $this->preCalculateFormulas;\n    }\n\n    /**\n     * Set Pre-Calculate Formulas\n     *        Set to true (the default) to advise the Writer to calculate all formulae on save\n     *        Set to false to prevent precalculation of formulae on save.\n     *\n     * @param boolean $pValue    Pre-Calculate Formulas?\n     * @return    PHPExcel_Writer_IWriter\n     */\n    public function setPreCalculateFormulas($pValue = true)\n    {\n        $this->preCalculateFormulas = (boolean) $pValue;\n        return $this;\n    }\n\n    /**\n     * Get use disk caching where possible?\n     *\n     * @return boolean\n     */\n    public function getUseDiskCaching()\n    {\n        return $this->_useDiskCaching;\n    }\n\n    /**\n     * Set use disk caching where possible?\n     *\n     * @param     boolean     $pValue\n     * @param    string        $pDirectory        Disk caching directory\n     * @throws    PHPExcel_Writer_Exception    when directory does not exist\n     * @return PHPExcel_Writer_Excel2007\n     */\n    public function setUseDiskCaching($pValue = false, $pDirectory = null)\n    {\n        $this->_useDiskCaching = $pValue;\n\n        if ($pDirectory !== null) {\n            if (is_dir($pDirectory)) {\n                $this->_diskCachingDirectory = $pDirectory;\n            } else {\n                throw new PHPExcel_Writer_Exception(\"Directory does not exist: $pDirectory\");\n            }\n        }\n        return $this;\n    }\n\n    /**\n     * Get disk caching directory\n     *\n     * @return string\n     */\n    public function getDiskCachingDirectory()\n    {\n        return $this->_diskCachingDirectory;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/CSV.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_CSV\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_CSV\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_CSV extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter\n{\n    /**\n     * PHPExcel object\n     *\n     * @var PHPExcel\n     */\n    private $phpExcel;\n\n    /**\n     * Delimiter\n     *\n     * @var string\n     */\n    private $delimiter    = ',';\n\n    /**\n     * Enclosure\n     *\n     * @var string\n     */\n    private $enclosure    = '\"';\n\n    /**\n     * Line ending\n     *\n     * @var string\n     */\n    private $lineEnding    = PHP_EOL;\n\n    /**\n     * Sheet index to write\n     *\n     * @var int\n     */\n    private $sheetIndex    = 0;\n\n    /**\n     * Whether to write a BOM (for UTF8).\n     *\n     * @var boolean\n     */\n    private $useBOM = false;\n\n    /**\n     * Whether to write a Separator line as the first line of the file\n     *     sep=x\n     *\n     * @var boolean\n     */\n    private $includeSeparatorLine = false;\n\n    /**\n     * Whether to write a fully Excel compatible CSV file.\n     *\n     * @var boolean\n     */\n    private $excelCompatibility = false;\n\n    /**\n     * Create a new PHPExcel_Writer_CSV\n     *\n     * @param    PHPExcel    $phpExcel    PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        $this->phpExcel    = $phpExcel;\n    }\n\n    /**\n     * Save PHPExcel to file\n     *\n     * @param    string        $pFilename\n     * @throws    PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        // Fetch sheet\n        $sheet = $this->phpExcel->getSheet($this->sheetIndex);\n\n        $saveDebugLog = PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->getWriteDebugLog();\n        PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog(false);\n        $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();\n        PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);\n\n        // Open file\n        $fileHandle = fopen($pFilename, 'wb+');\n        if ($fileHandle === false) {\n            throw new PHPExcel_Writer_Exception(\"Could not open file $pFilename for writing.\");\n        }\n\n        if ($this->excelCompatibility) {\n            $this->setUseBOM(true);                //  Enforce UTF-8 BOM Header\n            $this->setIncludeSeparatorLine(true);  //  Set separator line\n            $this->setEnclosure('\"');              //  Set enclosure to \"\n            $this->setDelimiter(\";\");              //  Set delimiter to a semi-colon\n            $this->setLineEnding(\"\\r\\n\");\n        }\n        if ($this->useBOM) {\n            // Write the UTF-8 BOM code if required\n            fwrite($fileHandle, \"\\xEF\\xBB\\xBF\");\n        }\n        if ($this->includeSeparatorLine) {\n            // Write the separator line if required\n            fwrite($fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding);\n        }\n\n        //    Identify the range that we need to extract from the worksheet\n        $maxCol = $sheet->getHighestDataColumn();\n        $maxRow = $sheet->getHighestDataRow();\n\n        // Write rows to file\n        for ($row = 1; $row <= $maxRow; ++$row) {\n            // Convert the row to an array...\n            $cellsArray = $sheet->rangeToArray('A'.$row.':'.$maxCol.$row, '', $this->preCalculateFormulas);\n            // ... and write to the file\n            $this->writeLine($fileHandle, $cellsArray[0]);\n        }\n\n        // Close file\n        fclose($fileHandle);\n\n        PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);\n        PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);\n    }\n\n    /**\n     * Get delimiter\n     *\n     * @return string\n     */\n    public function getDelimiter()\n    {\n        return $this->delimiter;\n    }\n\n    /**\n     * Set delimiter\n     *\n     * @param    string    $pValue        Delimiter, defaults to ,\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setDelimiter($pValue = ',')\n    {\n        $this->delimiter = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get enclosure\n     *\n     * @return string\n     */\n    public function getEnclosure()\n    {\n        return $this->enclosure;\n    }\n\n    /**\n     * Set enclosure\n     *\n     * @param    string    $pValue        Enclosure, defaults to \"\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setEnclosure($pValue = '\"')\n    {\n        if ($pValue == '') {\n            $pValue = null;\n        }\n        $this->enclosure = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get line ending\n     *\n     * @return string\n     */\n    public function getLineEnding()\n    {\n        return $this->lineEnding;\n    }\n\n    /**\n     * Set line ending\n     *\n     * @param    string    $pValue        Line ending, defaults to OS line ending (PHP_EOL)\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setLineEnding($pValue = PHP_EOL)\n    {\n        $this->lineEnding = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get whether BOM should be used\n     *\n     * @return boolean\n     */\n    public function getUseBOM()\n    {\n        return $this->useBOM;\n    }\n\n    /**\n     * Set whether BOM should be used\n     *\n     * @param    boolean    $pValue        Use UTF-8 byte-order mark? Defaults to false\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setUseBOM($pValue = false)\n    {\n        $this->useBOM = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get whether a separator line should be included\n     *\n     * @return boolean\n     */\n    public function getIncludeSeparatorLine()\n    {\n        return $this->includeSeparatorLine;\n    }\n\n    /**\n     * Set whether a separator line should be included as the first line of the file\n     *\n     * @param    boolean    $pValue        Use separator line? Defaults to false\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setIncludeSeparatorLine($pValue = false)\n    {\n        $this->includeSeparatorLine = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get whether the file should be saved with full Excel Compatibility\n     *\n     * @return boolean\n     */\n    public function getExcelCompatibility()\n    {\n        return $this->excelCompatibility;\n    }\n\n    /**\n     * Set whether the file should be saved with full Excel Compatibility\n     *\n     * @param    boolean    $pValue        Set the file to be written as a fully Excel compatible csv file\n     *                                Note that this overrides other settings such as useBOM, enclosure and delimiter\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setExcelCompatibility($pValue = false)\n    {\n        $this->excelCompatibility = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get sheet index\n     *\n     * @return int\n     */\n    public function getSheetIndex()\n    {\n        return $this->sheetIndex;\n    }\n\n    /**\n     * Set sheet index\n     *\n     * @param    int        $pValue        Sheet index\n     * @return PHPExcel_Writer_CSV\n     */\n    public function setSheetIndex($pValue = 0)\n    {\n        $this->sheetIndex = $pValue;\n        return $this;\n    }\n\n    /**\n     * Write line to CSV file\n     *\n     * @param    mixed    $pFileHandle    PHP filehandle\n     * @param    array    $pValues        Array containing values in a row\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeLine($pFileHandle = null, $pValues = null)\n    {\n        if (is_array($pValues)) {\n            // No leading delimiter\n            $writeDelimiter = false;\n\n            // Build the line\n            $line = '';\n\n            foreach ($pValues as $element) {\n                // Escape enclosures\n                $element = str_replace($this->enclosure, $this->enclosure . $this->enclosure, $element);\n\n                // Add delimiter\n                if ($writeDelimiter) {\n                    $line .= $this->delimiter;\n                } else {\n                    $writeDelimiter = true;\n                }\n\n                // Add enclosed string\n                $line .= $this->enclosure . $element . $this->enclosure;\n            }\n\n            // Add line ending\n            $line .= $this->lineEnding;\n\n            // Write to file\n            fwrite($pFileHandle, $line);\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid data row passed to CSV writer.\");\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Chart.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_Chart\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    protected $calculateCellValues;\n\n    /**\n     * Write charts to XML format\n     *\n     * @param  PHPExcel_Chart $pChart\n     *\n     * @return  string            XML Output\n     * @throws  PHPExcel_Writer_Exception\n     */\n    public function writeChart(PHPExcel_Chart $pChart = null, $calculateCellValues = true)\n    {\n        $this->calculateCellValues = $calculateCellValues;\n\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n        //    Ensure that data series values are up-to-date before we save\n        if ($this->calculateCellValues) {\n            $pChart->refresh();\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // c:chartSpace\n        $objWriter->startElement('c:chartSpace');\n        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');\n        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');\n        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');\n\n        $objWriter->startElement('c:date1904');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n        $objWriter->startElement('c:lang');\n        $objWriter->writeAttribute('val', \"en-GB\");\n        $objWriter->endElement();\n        $objWriter->startElement('c:roundedCorners');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n\n        $this->writeAlternateContent($objWriter);\n\n        $objWriter->startElement('c:chart');\n\n        $this->writeTitle($pChart->getTitle(), $objWriter);\n\n        $objWriter->startElement('c:autoTitleDeleted');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n\n        $this->writePlotArea($pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $objWriter, $pChart->getWorksheet(), $pChart->getChartAxisX(), $pChart->getChartAxisY(), $pChart->getMajorGridlines(), $pChart->getMinorGridlines());\n\n        $this->writeLegend($pChart->getLegend(), $objWriter);\n\n        $objWriter->startElement('c:plotVisOnly');\n        $objWriter->writeAttribute('val', 1);\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:dispBlanksAs');\n        $objWriter->writeAttribute('val', \"gap\");\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showDLblsOverMax');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        $this->writePrintSettings($objWriter);\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write Chart Title\n     *\n     * @param  PHPExcel_Chart_Title $title\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeTitle(PHPExcel_Chart_Title $title = null, $objWriter)\n    {\n        if (is_null($title)) {\n            return;\n        }\n\n        $objWriter->startElement('c:title');\n        $objWriter->startElement('c:tx');\n        $objWriter->startElement('c:rich');\n\n        $objWriter->startElement('a:bodyPr');\n        $objWriter->endElement();\n\n        $objWriter->startElement('a:lstStyle');\n        $objWriter->endElement();\n\n        $objWriter->startElement('a:p');\n\n        $caption = $title->getCaption();\n        if ((is_array($caption)) && (count($caption) > 0)) {\n            $caption = $caption[0];\n        }\n        $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a');\n\n        $objWriter->endElement();\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $this->writeLayout($title->getLayout(), $objWriter);\n\n        $objWriter->startElement('c:overlay');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Chart Legend\n     *\n     * @param  PHPExcel_Chart_Legend $legend\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter)\n    {\n        if (is_null($legend)) {\n            return;\n        }\n\n        $objWriter->startElement('c:legend');\n\n        $objWriter->startElement('c:legendPos');\n        $objWriter->writeAttribute('val', $legend->getPosition());\n        $objWriter->endElement();\n\n        $this->writeLayout($legend->getLayout(), $objWriter);\n\n        $objWriter->startElement('c:overlay');\n        $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0');\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:txPr');\n        $objWriter->startElement('a:bodyPr');\n        $objWriter->endElement();\n\n        $objWriter->startElement('a:lstStyle');\n        $objWriter->endElement();\n\n        $objWriter->startElement('a:p');\n        $objWriter->startElement('a:pPr');\n        $objWriter->writeAttribute('rtl', 0);\n\n        $objWriter->startElement('a:defRPr');\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->startElement('a:endParaRPr');\n        $objWriter->writeAttribute('lang', \"en-US\");\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Chart Plot Area\n     *\n     * @param  PHPExcel_Chart_PlotArea $plotArea\n     * @param  PHPExcel_Chart_Title $xAxisLabel\n     * @param  PHPExcel_Chart_Title $yAxisLabel\n     * @param  PHPExcel_Chart_Axis $xAxis\n     * @param  PHPExcel_Chart_Axis $yAxis\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writePlotArea(PHPExcel_Chart_PlotArea $plotArea, PHPExcel_Chart_Title $xAxisLabel = null, PHPExcel_Chart_Title $yAxisLabel = null, $objWriter, PHPExcel_Worksheet $pSheet, PHPExcel_Chart_Axis $xAxis, PHPExcel_Chart_Axis $yAxis, PHPExcel_Chart_GridLines $majorGridlines, PHPExcel_Chart_GridLines $minorGridlines)\n    {\n        if (is_null($plotArea)) {\n            return;\n        }\n\n        $id1 = $id2 = 0;\n        $this->_seriesIndex = 0;\n        $objWriter->startElement('c:plotArea');\n\n        $layout = $plotArea->getLayout();\n\n        $this->writeLayout($layout, $objWriter);\n\n        $chartTypes = self::getChartType($plotArea);\n        $catIsMultiLevelSeries = $valIsMultiLevelSeries = false;\n        $plotGroupingType = '';\n        foreach ($chartTypes as $chartType) {\n            $objWriter->startElement('c:' . $chartType);\n\n            $groupCount = $plotArea->getPlotGroupCount();\n            for ($i = 0; $i < $groupCount; ++$i) {\n                $plotGroup = $plotArea->getPlotGroupByIndex($i);\n                $groupType = $plotGroup->getPlotType();\n                if ($groupType == $chartType) {\n                    $plotStyle = $plotGroup->getPlotStyle();\n                    if ($groupType === PHPExcel_Chart_DataSeries::TYPE_RADARCHART) {\n                        $objWriter->startElement('c:radarStyle');\n                        $objWriter->writeAttribute('val', $plotStyle);\n                        $objWriter->endElement();\n                    } elseif ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART) {\n                        $objWriter->startElement('c:scatterStyle');\n                        $objWriter->writeAttribute('val', $plotStyle);\n                        $objWriter->endElement();\n                    }\n\n                    $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType, $pSheet);\n                }\n            }\n\n            $this->writeDataLabels($objWriter, $layout);\n\n            if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) {\n                //    Line only, Line3D can't be smoothed\n\n                $objWriter->startElement('c:smooth');\n                $objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine());\n                $objWriter->endElement();\n            } elseif (($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) ||($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) {\n                $objWriter->startElement('c:gapWidth');\n                $objWriter->writeAttribute('val', 150);\n                $objWriter->endElement();\n\n                if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') {\n                    $objWriter->startElement('c:overlap');\n                    $objWriter->writeAttribute('val', 100);\n                    $objWriter->endElement();\n                }\n            } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {\n                $objWriter->startElement('c:bubbleScale');\n                $objWriter->writeAttribute('val', 25);\n                $objWriter->endElement();\n\n                $objWriter->startElement('c:showNegBubbles');\n                $objWriter->writeAttribute('val', 0);\n                $objWriter->endElement();\n            } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {\n                $objWriter->startElement('c:hiLowLines');\n                $objWriter->endElement();\n\n                $objWriter->startElement('c:upDownBars');\n\n                $objWriter->startElement('c:gapWidth');\n                $objWriter->writeAttribute('val', 300);\n                $objWriter->endElement();\n\n                $objWriter->startElement('c:upBars');\n                $objWriter->endElement();\n\n                $objWriter->startElement('c:downBars');\n                $objWriter->endElement();\n\n                $objWriter->endElement();\n            }\n\n            //    Generate 2 unique numbers to use for axId values\n            //                    $id1 = $id2 = rand(10000000,99999999);\n            //                    do {\n            //                        $id2 = rand(10000000,99999999);\n            //                    } while ($id1 == $id2);\n            $id1 = '75091328';\n            $id2 = '75089408';\n\n            if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {\n                $objWriter->startElement('c:axId');\n                $objWriter->writeAttribute('val', $id1);\n                $objWriter->endElement();\n                $objWriter->startElement('c:axId');\n                $objWriter->writeAttribute('val', $id2);\n                $objWriter->endElement();\n            } else {\n                $objWriter->startElement('c:firstSliceAng');\n                $objWriter->writeAttribute('val', 0);\n                $objWriter->endElement();\n\n                if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) {\n                    $objWriter->startElement('c:holeSize');\n                    $objWriter->writeAttribute('val', 50);\n                    $objWriter->endElement();\n                }\n            }\n\n            $objWriter->endElement();\n        }\n\n        if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {\n            if ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {\n                $this->writeValueAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines);\n            } else {\n                $this->writeCategoryAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis);\n            }\n\n            $this->writeValueAxis($objWriter, $plotArea, $yAxisLabel, $chartType, $id1, $id2, $valIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines);\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Data Labels\n     *\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     * @param  PHPExcel_Chart_Layout $chartLayout Chart layout\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeDataLabels($objWriter, $chartLayout)\n    {\n        $objWriter->startElement('c:dLbls');\n\n        $objWriter->startElement('c:showLegendKey');\n        $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey();\n        $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showVal');\n        $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal();\n        $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showCatName');\n        $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName();\n        $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showSerName');\n        $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName();\n        $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showPercent');\n        $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent();\n        $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showBubbleSize');\n        $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize();\n        $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:showLeaderLines');\n        $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines();\n        $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1));\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Category Axis\n     *\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     * @param  PHPExcel_Chart_PlotArea $plotArea\n     * @param  PHPExcel_Chart_Title $xAxisLabel\n     * @param  string $groupType Chart type\n     * @param  string $id1\n     * @param  string $id2\n     * @param  boolean $isMultiLevelSeries\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeCategoryAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis)\n    {\n        $objWriter->startElement('c:catAx');\n\n        if ($id1 > 0) {\n            $objWriter->startElement('c:axId');\n            $objWriter->writeAttribute('val', $id1);\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('c:scaling');\n        $objWriter->startElement('c:orientation');\n        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation'));\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:delete');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:axPos');\n        $objWriter->writeAttribute('val', \"b\");\n        $objWriter->endElement();\n\n        if (!is_null($xAxisLabel)) {\n            $objWriter->startElement('c:title');\n            $objWriter->startElement('c:tx');\n            $objWriter->startElement('c:rich');\n\n            $objWriter->startElement('a:bodyPr');\n            $objWriter->endElement();\n\n            $objWriter->startElement('a:lstStyle');\n            $objWriter->endElement();\n\n            $objWriter->startElement('a:p');\n            $objWriter->startElement('a:r');\n\n            $caption = $xAxisLabel->getCaption();\n            if (is_array($caption)) {\n                $caption = $caption[0];\n            }\n            $objWriter->startElement('a:t');\n            //                                        $objWriter->writeAttribute('xml:space', 'preserve');\n            $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption));\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n\n            $layout = $xAxisLabel->getLayout();\n            $this->writeLayout($layout, $objWriter);\n\n            $objWriter->startElement('c:overlay');\n            $objWriter->writeAttribute('val', 0);\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('c:numFmt');\n        $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat());\n        $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked());\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:majorTickMark');\n        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark'));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:minorTickMark');\n        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark'));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:tickLblPos');\n        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels'));\n        $objWriter->endElement();\n\n        if ($id2 > 0) {\n            $objWriter->startElement('c:crossAx');\n            $objWriter->writeAttribute('val', $id2);\n            $objWriter->endElement();\n\n            $objWriter->startElement('c:crosses');\n            $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses'));\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('c:auto');\n        $objWriter->writeAttribute('val', 1);\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:lblAlgn');\n        $objWriter->writeAttribute('val', \"ctr\");\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:lblOffset');\n        $objWriter->writeAttribute('val', 100);\n        $objWriter->endElement();\n\n        if ($isMultiLevelSeries) {\n            $objWriter->startElement('c:noMultiLvlLbl');\n            $objWriter->writeAttribute('val', 0);\n            $objWriter->endElement();\n        }\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Value Axis\n     *\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     * @param  PHPExcel_Chart_PlotArea $plotArea\n     * @param  PHPExcel_Chart_Title $yAxisLabel\n     * @param  string $groupType Chart type\n     * @param  string $id1\n     * @param  string $id2\n     * @param  boolean $isMultiLevelSeries\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeValueAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines)\n    {\n        $objWriter->startElement('c:valAx');\n\n        if ($id2 > 0) {\n            $objWriter->startElement('c:axId');\n            $objWriter->writeAttribute('val', $id2);\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('c:scaling');\n\n        if (!is_null($xAxis->getAxisOptionsProperty('maximum'))) {\n            $objWriter->startElement('c:max');\n            $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum'));\n            $objWriter->endElement();\n        }\n\n        if (!is_null($xAxis->getAxisOptionsProperty('minimum'))) {\n            $objWriter->startElement('c:min');\n            $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum'));\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('c:orientation');\n        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation'));\n\n\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:delete');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:axPos');\n        $objWriter->writeAttribute('val', \"l\");\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:majorGridlines');\n        $objWriter->startElement('c:spPr');\n\n        if (!is_null($majorGridlines->getLineColorProperty('value'))) {\n            $objWriter->startElement('a:ln');\n            $objWriter->writeAttribute('w', $majorGridlines->getLineStyleProperty('width'));\n            $objWriter->startElement('a:solidFill');\n            $objWriter->startElement(\"a:{$majorGridlines->getLineColorProperty('type')}\");\n            $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('value'));\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('alpha'));\n            $objWriter->endElement(); //end alpha\n            $objWriter->endElement(); //end srgbClr\n            $objWriter->endElement(); //end solidFill\n\n            $objWriter->startElement('a:prstDash');\n            $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash'));\n            $objWriter->endElement();\n\n            if ($majorGridlines->getLineStyleProperty('join') == 'miter') {\n                $objWriter->startElement('a:miter');\n                $objWriter->writeAttribute('lim', '800000');\n                $objWriter->endElement();\n            } else {\n                $objWriter->startElement('a:bevel');\n                $objWriter->endElement();\n            }\n\n            if (!is_null($majorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')))) {\n                $objWriter->startElement('a:headEnd');\n                $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')));\n                $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('head', 'w'));\n                $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('head', 'len'));\n                $objWriter->endElement();\n            }\n\n            if (!is_null($majorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')))) {\n                $objWriter->startElement('a:tailEnd');\n                $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')));\n                $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('end', 'w'));\n                $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('end', 'len'));\n                $objWriter->endElement();\n            }\n            $objWriter->endElement(); //end ln\n        }\n        $objWriter->startElement('a:effectLst');\n\n        if (!is_null($majorGridlines->getGlowSize())) {\n            $objWriter->startElement('a:glow');\n            $objWriter->writeAttribute('rad', $majorGridlines->getGlowSize());\n            $objWriter->startElement(\"a:{$majorGridlines->getGlowColor('type')}\");\n            $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('value'));\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('alpha'));\n            $objWriter->endElement(); //end alpha\n            $objWriter->endElement(); //end schemeClr\n            $objWriter->endElement(); //end glow\n        }\n\n        if (!is_null($majorGridlines->getShadowProperty('presets'))) {\n            $objWriter->startElement(\"a:{$majorGridlines->getShadowProperty('effect')}\");\n            if (!is_null($majorGridlines->getShadowProperty('blur'))) {\n                $objWriter->writeAttribute('blurRad', $majorGridlines->getShadowProperty('blur'));\n            }\n            if (!is_null($majorGridlines->getShadowProperty('distance'))) {\n                $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance'));\n            }\n            if (!is_null($majorGridlines->getShadowProperty('direction'))) {\n                $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction'));\n            }\n            if (!is_null($majorGridlines->getShadowProperty('algn'))) {\n                $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn'));\n            }\n            if (!is_null($majorGridlines->getShadowProperty(array('size', 'sx')))) {\n                $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(array('size', 'sx')));\n            }\n            if (!is_null($majorGridlines->getShadowProperty(array('size', 'sy')))) {\n                $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(array('size', 'sy')));\n            }\n            if (!is_null($majorGridlines->getShadowProperty(array('size', 'kx')))) {\n                $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(array('size', 'kx')));\n            }\n            if (!is_null($majorGridlines->getShadowProperty('rotWithShape'))) {\n                $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape'));\n            }\n            $objWriter->startElement(\"a:{$majorGridlines->getShadowProperty(array('color', 'type'))}\");\n            $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'value')));\n\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'alpha')));\n            $objWriter->endElement(); //end alpha\n\n            $objWriter->endElement(); //end color:type\n            $objWriter->endElement(); //end shadow\n        }\n\n        if (!is_null($majorGridlines->getSoftEdgesSize())) {\n            $objWriter->startElement('a:softEdge');\n            $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize());\n            $objWriter->endElement(); //end softEdge\n        }\n\n        $objWriter->endElement(); //end effectLst\n        $objWriter->endElement(); //end spPr\n        $objWriter->endElement(); //end majorGridLines\n\n        if ($minorGridlines->getObjectState()) {\n            $objWriter->startElement('c:minorGridlines');\n            $objWriter->startElement('c:spPr');\n\n            if (!is_null($minorGridlines->getLineColorProperty('value'))) {\n                $objWriter->startElement('a:ln');\n                $objWriter->writeAttribute('w', $minorGridlines->getLineStyleProperty('width'));\n                $objWriter->startElement('a:solidFill');\n                $objWriter->startElement(\"a:{$minorGridlines->getLineColorProperty('type')}\");\n                $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('value'));\n                $objWriter->startElement('a:alpha');\n                $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('alpha'));\n                $objWriter->endElement(); //end alpha\n                $objWriter->endElement(); //end srgbClr\n                $objWriter->endElement(); //end solidFill\n\n                $objWriter->startElement('a:prstDash');\n                $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash'));\n                $objWriter->endElement();\n\n                if ($minorGridlines->getLineStyleProperty('join') == 'miter') {\n                    $objWriter->startElement('a:miter');\n                    $objWriter->writeAttribute('lim', '800000');\n                    $objWriter->endElement();\n                } else {\n                    $objWriter->startElement('a:bevel');\n                    $objWriter->endElement();\n                }\n\n                if (!is_null($minorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')))) {\n                    $objWriter->startElement('a:headEnd');\n                    $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')));\n                    $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('head', 'w'));\n                    $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('head', 'len'));\n                    $objWriter->endElement();\n                }\n\n                if (!is_null($minorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')))) {\n                    $objWriter->startElement('a:tailEnd');\n                    $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')));\n                    $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('end', 'w'));\n                    $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('end', 'len'));\n                    $objWriter->endElement();\n                }\n                $objWriter->endElement(); //end ln\n            }\n\n            $objWriter->startElement('a:effectLst');\n\n            if (!is_null($minorGridlines->getGlowSize())) {\n                $objWriter->startElement('a:glow');\n                $objWriter->writeAttribute('rad', $minorGridlines->getGlowSize());\n                $objWriter->startElement(\"a:{$minorGridlines->getGlowColor('type')}\");\n                $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('value'));\n                $objWriter->startElement('a:alpha');\n                $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('alpha'));\n                $objWriter->endElement(); //end alpha\n                $objWriter->endElement(); //end schemeClr\n                $objWriter->endElement(); //end glow\n            }\n\n            if (!is_null($minorGridlines->getShadowProperty('presets'))) {\n                $objWriter->startElement(\"a:{$minorGridlines->getShadowProperty('effect')}\");\n                if (!is_null($minorGridlines->getShadowProperty('blur'))) {\n                    $objWriter->writeAttribute('blurRad', $minorGridlines->getShadowProperty('blur'));\n                }\n                if (!is_null($minorGridlines->getShadowProperty('distance'))) {\n                    $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance'));\n                }\n                if (!is_null($minorGridlines->getShadowProperty('direction'))) {\n                    $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction'));\n                }\n                if (!is_null($minorGridlines->getShadowProperty('algn'))) {\n                    $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn'));\n                }\n                if (!is_null($minorGridlines->getShadowProperty(array('size', 'sx')))) {\n                    $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(array('size', 'sx')));\n                }\n                if (!is_null($minorGridlines->getShadowProperty(array('size', 'sy')))) {\n                    $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(array('size', 'sy')));\n                }\n                if (!is_null($minorGridlines->getShadowProperty(array('size', 'kx')))) {\n                    $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(array('size', 'kx')));\n                }\n                if (!is_null($minorGridlines->getShadowProperty('rotWithShape'))) {\n                    $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape'));\n                }\n                $objWriter->startElement(\"a:{$minorGridlines->getShadowProperty(array('color', 'type'))}\");\n                $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(array('color', 'value')));\n                $objWriter->startElement('a:alpha');\n                $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(array('color', 'alpha')));\n                $objWriter->endElement(); //end alpha\n                $objWriter->endElement(); //end color:type\n                $objWriter->endElement(); //end shadow\n            }\n\n            if (!is_null($minorGridlines->getSoftEdgesSize())) {\n                $objWriter->startElement('a:softEdge');\n                $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize());\n                $objWriter->endElement(); //end softEdge\n            }\n\n            $objWriter->endElement(); //end effectLst\n            $objWriter->endElement(); //end spPr\n            $objWriter->endElement(); //end minorGridLines\n        }\n\n        if (!is_null($yAxisLabel)) {\n            $objWriter->startElement('c:title');\n            $objWriter->startElement('c:tx');\n            $objWriter->startElement('c:rich');\n\n            $objWriter->startElement('a:bodyPr');\n            $objWriter->endElement();\n\n            $objWriter->startElement('a:lstStyle');\n            $objWriter->endElement();\n\n            $objWriter->startElement('a:p');\n            $objWriter->startElement('a:r');\n\n            $caption = $yAxisLabel->getCaption();\n            if (is_array($caption)) {\n                $caption = $caption[0];\n            }\n\n            $objWriter->startElement('a:t');\n            //                                        $objWriter->writeAttribute('xml:space', 'preserve');\n            $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption));\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n\n            if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {\n                $layout = $yAxisLabel->getLayout();\n                $this->writeLayout($layout, $objWriter);\n            }\n\n            $objWriter->startElement('c:overlay');\n            $objWriter->writeAttribute('val', 0);\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('c:numFmt');\n        $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat());\n        $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked());\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:majorTickMark');\n        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark'));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:minorTickMark');\n        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark'));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:tickLblPos');\n        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels'));\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:spPr');\n\n        if (!is_null($xAxis->getFillProperty('value'))) {\n            $objWriter->startElement('a:solidFill');\n            $objWriter->startElement(\"a:\" . $xAxis->getFillProperty('type'));\n            $objWriter->writeAttribute('val', $xAxis->getFillProperty('value'));\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $xAxis->getFillProperty('alpha'));\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('a:ln');\n\n        $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width'));\n        $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap'));\n        $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound'));\n\n        if (!is_null($xAxis->getLineProperty('value'))) {\n            $objWriter->startElement('a:solidFill');\n            $objWriter->startElement(\"a:\" . $xAxis->getLineProperty('type'));\n            $objWriter->writeAttribute('val', $xAxis->getLineProperty('value'));\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $xAxis->getLineProperty('alpha'));\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n        }\n\n        $objWriter->startElement('a:prstDash');\n        $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash'));\n        $objWriter->endElement();\n\n        if ($xAxis->getLineStyleProperty('join') == 'miter') {\n            $objWriter->startElement('a:miter');\n            $objWriter->writeAttribute('lim', '800000');\n            $objWriter->endElement();\n        } else {\n            $objWriter->startElement('a:bevel');\n            $objWriter->endElement();\n        }\n\n        if (!is_null($xAxis->getLineStyleProperty(array('arrow', 'head', 'type')))) {\n            $objWriter->startElement('a:headEnd');\n            $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(array('arrow', 'head', 'type')));\n            $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('head'));\n            $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('head'));\n            $objWriter->endElement();\n        }\n\n        if (!is_null($xAxis->getLineStyleProperty(array('arrow', 'end', 'type')))) {\n            $objWriter->startElement('a:tailEnd');\n            $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(array('arrow', 'end', 'type')));\n            $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('end'));\n            $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('end'));\n            $objWriter->endElement();\n        }\n\n        $objWriter->endElement();\n\n        $objWriter->startElement('a:effectLst');\n\n        if (!is_null($xAxis->getGlowProperty('size'))) {\n            $objWriter->startElement('a:glow');\n            $objWriter->writeAttribute('rad', $xAxis->getGlowProperty('size'));\n            $objWriter->startElement(\"a:{$xAxis->getGlowProperty(array('color','type'))}\");\n            $objWriter->writeAttribute('val', $xAxis->getGlowProperty(array('color','value')));\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $xAxis->getGlowProperty(array('color','alpha')));\n            $objWriter->endElement();\n            $objWriter->endElement();\n            $objWriter->endElement();\n        }\n\n        if (!is_null($xAxis->getShadowProperty('presets'))) {\n            $objWriter->startElement(\"a:{$xAxis->getShadowProperty('effect')}\");\n\n            if (!is_null($xAxis->getShadowProperty('blur'))) {\n                $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur'));\n            }\n            if (!is_null($xAxis->getShadowProperty('distance'))) {\n                $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance'));\n            }\n            if (!is_null($xAxis->getShadowProperty('direction'))) {\n                $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction'));\n            }\n            if (!is_null($xAxis->getShadowProperty('algn'))) {\n                $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn'));\n            }\n            if (!is_null($xAxis->getShadowProperty(array('size','sx')))) {\n                $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(array('size','sx')));\n            }\n            if (!is_null($xAxis->getShadowProperty(array('size','sy')))) {\n                $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(array('size','sy')));\n            }\n            if (!is_null($xAxis->getShadowProperty(array('size','kx')))) {\n                $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(array('size','kx')));\n            }\n            if (!is_null($xAxis->getShadowProperty('rotWithShape'))) {\n                $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape'));\n            }\n\n            $objWriter->startElement(\"a:{$xAxis->getShadowProperty(array('color','type'))}\");\n            $objWriter->writeAttribute('val', $xAxis->getShadowProperty(array('color','value')));\n            $objWriter->startElement('a:alpha');\n            $objWriter->writeAttribute('val', $xAxis->getShadowProperty(array('color','alpha')));\n            $objWriter->endElement();\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n\n        if (!is_null($xAxis->getSoftEdgesSize())) {\n            $objWriter->startElement('a:softEdge');\n            $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize());\n            $objWriter->endElement();\n        }\n\n        $objWriter->endElement(); //effectList\n        $objWriter->endElement(); //end spPr\n\n        if ($id1 > 0) {\n            $objWriter->startElement('c:crossAx');\n            $objWriter->writeAttribute('val', $id2);\n            $objWriter->endElement();\n\n            if (!is_null($xAxis->getAxisOptionsProperty('horizontal_crosses_value'))) {\n                $objWriter->startElement('c:crossesAt');\n                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value'));\n                $objWriter->endElement();\n            } else {\n                $objWriter->startElement('c:crosses');\n                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses'));\n                $objWriter->endElement();\n            }\n\n            $objWriter->startElement('c:crossBetween');\n            $objWriter->writeAttribute('val', \"midCat\");\n            $objWriter->endElement();\n\n            if (!is_null($xAxis->getAxisOptionsProperty('major_unit'))) {\n                $objWriter->startElement('c:majorUnit');\n                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));\n                $objWriter->endElement();\n            }\n\n            if (!is_null($xAxis->getAxisOptionsProperty('minor_unit'))) {\n                $objWriter->startElement('c:minorUnit');\n                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit'));\n                $objWriter->endElement();\n            }\n        }\n\n        if ($isMultiLevelSeries) {\n            if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {\n                $objWriter->startElement('c:noMultiLvlLbl');\n                $objWriter->writeAttribute('val', 0);\n                $objWriter->endElement();\n            }\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Get the data series type(s) for a chart plot series\n     *\n     * @param  PHPExcel_Chart_PlotArea $plotArea\n     *\n     * @return  string|array\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private static function getChartType($plotArea)\n    {\n        $groupCount = $plotArea->getPlotGroupCount();\n\n        if ($groupCount == 1) {\n            $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType());\n        } else {\n            $chartTypes = array();\n            for ($i = 0; $i < $groupCount; ++$i) {\n                $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType();\n            }\n            $chartType = array_unique($chartTypes);\n            if (count($chartTypes) == 0) {\n                throw new PHPExcel_Writer_Exception('Chart is not yet implemented');\n            }\n        }\n\n        return $chartType;\n    }\n\n    /**\n     * Write Plot Group (series of related plots)\n     *\n     * @param  PHPExcel_Chart_DataSeries $plotGroup\n     * @param  string $groupType Type of plot for dataseries\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     * @param  boolean &$catIsMultiLevelSeries Is category a multi-series category\n     * @param  boolean &$valIsMultiLevelSeries Is value set a multi-series set\n     * @param  string &$plotGroupingType Type of grouping for multi-series values\n     * @param  PHPExcel_Worksheet $pSheet\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType, PHPExcel_Worksheet $pSheet)\n    {\n        if (is_null($plotGroup)) {\n            return;\n        }\n\n        if (($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) {\n            $objWriter->startElement('c:barDir');\n            $objWriter->writeAttribute('val', $plotGroup->getPlotDirection());\n            $objWriter->endElement();\n        }\n\n        if (!is_null($plotGroup->getPlotGrouping())) {\n            $plotGroupingType = $plotGroup->getPlotGrouping();\n            $objWriter->startElement('c:grouping');\n            $objWriter->writeAttribute('val', $plotGroupingType);\n            $objWriter->endElement();\n        }\n\n        //    Get these details before the loop, because we can use the count to check for varyColors\n        $plotSeriesOrder = $plotGroup->getPlotOrder();\n        $plotSeriesCount = count($plotSeriesOrder);\n\n        if (($groupType !== PHPExcel_Chart_DataSeries::TYPE_RADARCHART) && ($groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) {\n            if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART) {\n                if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) {\n                    $objWriter->startElement('c:varyColors');\n                    $objWriter->writeAttribute('val', 1);\n                    $objWriter->endElement();\n                } else {\n                    $objWriter->startElement('c:varyColors');\n                    $objWriter->writeAttribute('val', 0);\n                    $objWriter->endElement();\n                }\n            }\n        }\n\n        foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {\n            $objWriter->startElement('c:ser');\n\n            $objWriter->startElement('c:idx');\n            $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesIdx);\n            $objWriter->endElement();\n\n            $objWriter->startElement('c:order');\n            $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesRef);\n            $objWriter->endElement();\n\n            if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {\n                $objWriter->startElement('c:dPt');\n                $objWriter->startElement('c:idx');\n                $objWriter->writeAttribute('val', 3);\n                $objWriter->endElement();\n\n                $objWriter->startElement('c:bubble3D');\n                $objWriter->writeAttribute('val', 0);\n                $objWriter->endElement();\n\n                $objWriter->startElement('c:spPr');\n                $objWriter->startElement('a:solidFill');\n                $objWriter->startElement('a:srgbClr');\n                $objWriter->writeAttribute('val', 'FF9900');\n                $objWriter->endElement();\n                $objWriter->endElement();\n                $objWriter->endElement();\n                $objWriter->endElement();\n            }\n\n            //    Labels\n            $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef);\n            if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) {\n                $objWriter->startElement('c:tx');\n                $objWriter->startElement('c:strRef');\n                $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter);\n                $objWriter->endElement();\n                $objWriter->endElement();\n            }\n\n            //    Formatting for the points\n            if (($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) {\n                $objWriter->startElement('c:spPr');\n                $objWriter->startElement('a:ln');\n                $objWriter->writeAttribute('w', 12700);\n                if ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {\n                    $objWriter->startElement('a:noFill');\n                    $objWriter->endElement();\n                }\n                $objWriter->endElement();\n                $objWriter->endElement();\n            }\n\n            $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef);\n            if ($plotSeriesValues) {\n                $plotSeriesMarker = $plotSeriesValues->getPointMarker();\n                if ($plotSeriesMarker) {\n                    $objWriter->startElement('c:marker');\n                    $objWriter->startElement('c:symbol');\n                    $objWriter->writeAttribute('val', $plotSeriesMarker);\n                    $objWriter->endElement();\n\n                    if ($plotSeriesMarker !== 'none') {\n                        $objWriter->startElement('c:size');\n                        $objWriter->writeAttribute('val', 3);\n                        $objWriter->endElement();\n                    }\n\n                    $objWriter->endElement();\n                }\n            }\n\n            if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART)) {\n                $objWriter->startElement('c:invertIfNegative');\n                $objWriter->writeAttribute('val', 0);\n                $objWriter->endElement();\n            }\n\n            //    Category Labels\n            $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef);\n            if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) {\n                $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();\n\n                if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {\n                    if (!is_null($plotGroup->getPlotStyle())) {\n                        $plotStyle = $plotGroup->getPlotStyle();\n                        if ($plotStyle) {\n                            $objWriter->startElement('c:explosion');\n                            $objWriter->writeAttribute('val', 25);\n                            $objWriter->endElement();\n                        }\n                    }\n                }\n\n                if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {\n                    $objWriter->startElement('c:xVal');\n                } else {\n                    $objWriter->startElement('c:cat');\n                }\n\n                $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str', $pSheet);\n                $objWriter->endElement();\n            }\n\n            //    Values\n            if ($plotSeriesValues) {\n                $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries();\n\n                if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {\n                    $objWriter->startElement('c:yVal');\n                } else {\n                    $objWriter->startElement('c:val');\n                }\n\n                $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num', $pSheet);\n                $objWriter->endElement();\n            }\n\n            if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {\n                $this->writeBubbles($plotSeriesValues, $objWriter, $pSheet);\n            }\n\n            $objWriter->endElement();\n        }\n\n        $this->_seriesIndex += $plotSeriesIdx + 1;\n    }\n\n    /**\n     * Write Plot Series Label\n     *\n     * @param  PHPExcel_Chart_DataSeriesValues $plotSeriesLabel\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writePlotSeriesLabel($plotSeriesLabel, $objWriter)\n    {\n        if (is_null($plotSeriesLabel)) {\n            return;\n        }\n\n        $objWriter->startElement('c:f');\n        $objWriter->writeRawData($plotSeriesLabel->getDataSource());\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:strCache');\n        $objWriter->startElement('c:ptCount');\n        $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount());\n        $objWriter->endElement();\n\n        foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) {\n            $objWriter->startElement('c:pt');\n            $objWriter->writeAttribute('idx', $plotLabelKey);\n\n            $objWriter->startElement('c:v');\n            $objWriter->writeRawData($plotLabelValue);\n            $objWriter->endElement();\n            $objWriter->endElement();\n        }\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Plot Series Values\n     *\n     * @param  PHPExcel_Chart_DataSeriesValues $plotSeriesValues\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     * @param  string $groupType Type of plot for dataseries\n     * @param  string $dataType Datatype of series values\n     * @param  PHPExcel_Worksheet $pSheet\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, $dataType = 'str', PHPExcel_Worksheet $pSheet)\n    {\n        if (is_null($plotSeriesValues)) {\n            return;\n        }\n\n        if ($plotSeriesValues->isMultiLevelSeries()) {\n            $levelCount = $plotSeriesValues->multiLevelCount();\n\n            $objWriter->startElement('c:multiLvlStrRef');\n\n            $objWriter->startElement('c:f');\n            $objWriter->writeRawData($plotSeriesValues->getDataSource());\n            $objWriter->endElement();\n\n            $objWriter->startElement('c:multiLvlStrCache');\n\n            $objWriter->startElement('c:ptCount');\n            $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());\n            $objWriter->endElement();\n\n            for ($level = 0; $level < $levelCount; ++$level) {\n                $objWriter->startElement('c:lvl');\n\n                foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {\n                    if (isset($plotSeriesValue[$level])) {\n                        $objWriter->startElement('c:pt');\n                        $objWriter->writeAttribute('idx', $plotSeriesKey);\n\n                        $objWriter->startElement('c:v');\n                        $objWriter->writeRawData($plotSeriesValue[$level]);\n                        $objWriter->endElement();\n                        $objWriter->endElement();\n                    }\n                }\n\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        } else {\n            $objWriter->startElement('c:' . $dataType . 'Ref');\n\n            $objWriter->startElement('c:f');\n            $objWriter->writeRawData($plotSeriesValues->getDataSource());\n            $objWriter->endElement();\n\n            $objWriter->startElement('c:' . $dataType . 'Cache');\n\n            if (($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($groupType != PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {\n                if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) {\n                    $objWriter->startElement('c:formatCode');\n                    $objWriter->writeRawData($plotSeriesValues->getFormatCode());\n                    $objWriter->endElement();\n                }\n            }\n\n            $objWriter->startElement('c:ptCount');\n            $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());\n            $objWriter->endElement();\n\n            $dataValues = $plotSeriesValues->getDataValues();\n            if (!empty($dataValues)) {\n                if (is_array($dataValues)) {\n                    foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {\n                        $objWriter->startElement('c:pt');\n                        $objWriter->writeAttribute('idx', $plotSeriesKey);\n\n                        $objWriter->startElement('c:v');\n                        $objWriter->writeRawData($plotSeriesValue);\n                        $objWriter->endElement();\n                        $objWriter->endElement();\n                    }\n                }\n            }\n\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write Bubble Chart Details\n     *\n     * @param  PHPExcel_Chart_DataSeriesValues $plotSeriesValues\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeBubbles($plotSeriesValues, $objWriter, PHPExcel_Worksheet $pSheet)\n    {\n        if (is_null($plotSeriesValues)) {\n            return;\n        }\n\n        $objWriter->startElement('c:bubbleSize');\n        $objWriter->startElement('c:numLit');\n\n        $objWriter->startElement('c:formatCode');\n        $objWriter->writeRawData('General');\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:ptCount');\n        $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());\n        $objWriter->endElement();\n\n        $dataValues = $plotSeriesValues->getDataValues();\n        if (!empty($dataValues)) {\n            if (is_array($dataValues)) {\n                foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {\n                    $objWriter->startElement('c:pt');\n                    $objWriter->writeAttribute('idx', $plotSeriesKey);\n                    $objWriter->startElement('c:v');\n                    $objWriter->writeRawData(1);\n                    $objWriter->endElement();\n                    $objWriter->endElement();\n                }\n            }\n        }\n\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:bubble3D');\n        $objWriter->writeAttribute('val', 0);\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Layout\n     *\n     * @param  PHPExcel_Chart_Layout $layout\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeLayout(PHPExcel_Chart_Layout $layout = null, $objWriter)\n    {\n        $objWriter->startElement('c:layout');\n\n        if (!is_null($layout)) {\n            $objWriter->startElement('c:manualLayout');\n\n            $layoutTarget = $layout->getLayoutTarget();\n            if (!is_null($layoutTarget)) {\n                $objWriter->startElement('c:layoutTarget');\n                $objWriter->writeAttribute('val', $layoutTarget);\n                $objWriter->endElement();\n            }\n\n            $xMode = $layout->getXMode();\n            if (!is_null($xMode)) {\n                $objWriter->startElement('c:xMode');\n                $objWriter->writeAttribute('val', $xMode);\n                $objWriter->endElement();\n            }\n\n            $yMode = $layout->getYMode();\n            if (!is_null($yMode)) {\n                $objWriter->startElement('c:yMode');\n                $objWriter->writeAttribute('val', $yMode);\n                $objWriter->endElement();\n            }\n\n            $x = $layout->getXPosition();\n            if (!is_null($x)) {\n                $objWriter->startElement('c:x');\n                $objWriter->writeAttribute('val', $x);\n                $objWriter->endElement();\n            }\n\n            $y = $layout->getYPosition();\n            if (!is_null($y)) {\n                $objWriter->startElement('c:y');\n                $objWriter->writeAttribute('val', $y);\n                $objWriter->endElement();\n            }\n\n            $w = $layout->getWidth();\n            if (!is_null($w)) {\n                $objWriter->startElement('c:w');\n                $objWriter->writeAttribute('val', $w);\n                $objWriter->endElement();\n            }\n\n            $h = $layout->getHeight();\n            if (!is_null($h)) {\n                $objWriter->startElement('c:h');\n                $objWriter->writeAttribute('val', $h);\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Alternate Content block\n     *\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writeAlternateContent($objWriter)\n    {\n        $objWriter->startElement('mc:AlternateContent');\n        $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006');\n\n        $objWriter->startElement('mc:Choice');\n        $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart');\n        $objWriter->writeAttribute('Requires', 'c14');\n\n        $objWriter->startElement('c14:style');\n        $objWriter->writeAttribute('val', '102');\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->startElement('mc:Fallback');\n        $objWriter->startElement('c:style');\n        $objWriter->writeAttribute('val', '2');\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Printer Settings\n     *\n     * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     *\n     * @throws  PHPExcel_Writer_Exception\n     */\n    private function writePrintSettings($objWriter)\n    {\n        $objWriter->startElement('c:printSettings');\n\n        $objWriter->startElement('c:headerFooter');\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:pageMargins');\n        $objWriter->writeAttribute('footer', 0.3);\n        $objWriter->writeAttribute('header', 0.3);\n        $objWriter->writeAttribute('r', 0.7);\n        $objWriter->writeAttribute('l', 0.7);\n        $objWriter->writeAttribute('t', 0.75);\n        $objWriter->writeAttribute('b', 0.75);\n        $objWriter->endElement();\n\n        $objWriter->startElement('c:pageSetup');\n        $objWriter->writeAttribute('orientation', \"portrait\");\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_Comments\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_Comments extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write comments to XML format\n     *\n     * @param     PHPExcel_Worksheet                $pWorksheet\n     * @return     string                                 XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeComments(PHPExcel_Worksheet $pWorksheet = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n          // Comments cache\n          $comments    = $pWorksheet->getComments();\n\n          // Authors cache\n          $authors    = array();\n          $authorId    = 0;\n        foreach ($comments as $comment) {\n            if (!isset($authors[$comment->getAuthor()])) {\n                $authors[$comment->getAuthor()] = $authorId++;\n            }\n        }\n\n        // comments\n        $objWriter->startElement('comments');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');\n\n        // Loop through authors\n        $objWriter->startElement('authors');\n        foreach ($authors as $author => $index) {\n            $objWriter->writeElement('author', $author);\n        }\n        $objWriter->endElement();\n\n        // Loop through comments\n        $objWriter->startElement('commentList');\n        foreach ($comments as $key => $value) {\n            $this->writeComment($objWriter, $key, $value, $authors);\n        }\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write comment to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter        $objWriter             XML Writer\n     * @param    string                            $pCellReference        Cell reference\n     * @param     PHPExcel_Comment                $pComment            Comment\n     * @param    array                            $pAuthors            Array of authors\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null, $pAuthors = null)\n    {\n        // comment\n        $objWriter->startElement('comment');\n        $objWriter->writeAttribute('ref', $pCellReference);\n        $objWriter->writeAttribute('authorId', $pAuthors[$pComment->getAuthor()]);\n\n        // text\n        $objWriter->startElement('text');\n        $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $pComment->getText());\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write VML comments to XML format\n     *\n     * @param     PHPExcel_Worksheet                $pWorksheet\n     * @return     string                                 XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeVMLComments(PHPExcel_Worksheet $pWorksheet = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n          // Comments cache\n          $comments    = $pWorksheet->getComments();\n\n        // xml\n        $objWriter->startElement('xml');\n        $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');\n        $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');\n        $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel');\n\n        // o:shapelayout\n        $objWriter->startElement('o:shapelayout');\n        $objWriter->writeAttribute('v:ext', 'edit');\n\n            // o:idmap\n            $objWriter->startElement('o:idmap');\n            $objWriter->writeAttribute('v:ext', 'edit');\n            $objWriter->writeAttribute('data', '1');\n            $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // v:shapetype\n        $objWriter->startElement('v:shapetype');\n        $objWriter->writeAttribute('id', '_x0000_t202');\n        $objWriter->writeAttribute('coordsize', '21600,21600');\n        $objWriter->writeAttribute('o:spt', '202');\n        $objWriter->writeAttribute('path', 'm,l,21600r21600,l21600,xe');\n\n            // v:stroke\n            $objWriter->startElement('v:stroke');\n            $objWriter->writeAttribute('joinstyle', 'miter');\n            $objWriter->endElement();\n\n            // v:path\n            $objWriter->startElement('v:path');\n            $objWriter->writeAttribute('gradientshapeok', 't');\n            $objWriter->writeAttribute('o:connecttype', 'rect');\n            $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // Loop through comments\n        foreach ($comments as $key => $value) {\n            $this->writeVMLComment($objWriter, $key, $value);\n        }\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write VML comment to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter        $objWriter             XML Writer\n     * @param    string                            $pCellReference        Cell reference\n     * @param     PHPExcel_Comment                $pComment            Comment\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeVMLComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null)\n    {\n         // Metadata\n         list($column, $row) = PHPExcel_Cell::coordinateFromString($pCellReference);\n         $column = PHPExcel_Cell::columnIndexFromString($column);\n         $id = 1024 + $column + $row;\n         $id = substr($id, 0, 4);\n\n        // v:shape\n        $objWriter->startElement('v:shape');\n        $objWriter->writeAttribute('id', '_x0000_s' . $id);\n        $objWriter->writeAttribute('type', '#_x0000_t202');\n        $objWriter->writeAttribute('style', 'position:absolute;margin-left:' . $pComment->getMarginLeft() . ';margin-top:' . $pComment->getMarginTop() . ';width:' . $pComment->getWidth() . ';height:' . $pComment->getHeight() . ';z-index:1;visibility:' . ($pComment->getVisible() ? 'visible' : 'hidden'));\n        $objWriter->writeAttribute('fillcolor', '#' . $pComment->getFillColor()->getRGB());\n        $objWriter->writeAttribute('o:insetmode', 'auto');\n\n            // v:fill\n            $objWriter->startElement('v:fill');\n            $objWriter->writeAttribute('color2', '#' . $pComment->getFillColor()->getRGB());\n            $objWriter->endElement();\n\n            // v:shadow\n            $objWriter->startElement('v:shadow');\n            $objWriter->writeAttribute('on', 't');\n            $objWriter->writeAttribute('color', 'black');\n            $objWriter->writeAttribute('obscured', 't');\n            $objWriter->endElement();\n\n            // v:path\n            $objWriter->startElement('v:path');\n            $objWriter->writeAttribute('o:connecttype', 'none');\n            $objWriter->endElement();\n\n            // v:textbox\n            $objWriter->startElement('v:textbox');\n            $objWriter->writeAttribute('style', 'mso-direction-alt:auto');\n\n                // div\n                $objWriter->startElement('div');\n                $objWriter->writeAttribute('style', 'text-align:left');\n                $objWriter->endElement();\n\n            $objWriter->endElement();\n\n            // x:ClientData\n            $objWriter->startElement('x:ClientData');\n            $objWriter->writeAttribute('ObjectType', 'Note');\n\n                // x:MoveWithCells\n                $objWriter->writeElement('x:MoveWithCells', '');\n\n                // x:SizeWithCells\n                $objWriter->writeElement('x:SizeWithCells', '');\n\n                // x:Anchor\n                //$objWriter->writeElement('x:Anchor', $column . ', 15, ' . ($row - 2) . ', 10, ' . ($column + 4) . ', 15, ' . ($row + 5) . ', 18');\n\n                // x:AutoFill\n                $objWriter->writeElement('x:AutoFill', 'False');\n\n                // x:Row\n                $objWriter->writeElement('x:Row', ($row - 1));\n\n                // x:Column\n                $objWriter->writeElement('x:Column', ($column - 1));\n\n            $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_ContentTypes\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_ContentTypes extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write content types to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @param    boolean        $includeCharts    Flag indicating if we should include drawing details for charts\n     * @return     string                         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeContentTypes(PHPExcel $pPHPExcel = null, $includeCharts = false)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Types\n        $objWriter->startElement('Types');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types');\n\n        // Theme\n        $this->writeOverrideContentType($objWriter, '/xl/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml');\n\n        // Styles\n        $this->writeOverrideContentType($objWriter, '/xl/styles.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml');\n\n        // Rels\n        $this->writeDefaultContentType($objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml');\n\n        // XML\n        $this->writeDefaultContentType($objWriter, 'xml', 'application/xml');\n\n        // VML\n        $this->writeDefaultContentType($objWriter, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing');\n\n        // Workbook\n        if ($pPHPExcel->hasMacros()) { //Macros in workbook ?\n            // Yes : not standard content but \"macroEnabled\"\n            $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.ms-excel.sheet.macroEnabled.main+xml');\n            //... and define a new type for the VBA project\n            $this->writeDefaultContentType($objWriter, 'bin', 'application/vnd.ms-office.vbaProject');\n            if ($pPHPExcel->hasMacrosCertificate()) {// signed macros ?\n                // Yes : add needed information\n                $this->writeOverrideContentType($objWriter, '/xl/vbaProjectSignature.bin', 'application/vnd.ms-office.vbaProjectSignature');\n            }\n        } else {// no macros in workbook, so standard type\n            $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml');\n        }\n\n        // DocProps\n        $this->writeOverrideContentType($objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml');\n\n        $this->writeOverrideContentType($objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml');\n\n        $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties();\n        if (!empty($customPropertyList)) {\n            $this->writeOverrideContentType($objWriter, '/docProps/custom.xml', 'application/vnd.openxmlformats-officedocument.custom-properties+xml');\n        }\n\n        // Worksheets\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            $this->writeOverrideContentType($objWriter, '/xl/worksheets/sheet' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml');\n        }\n\n        // Shared strings\n        $this->writeOverrideContentType($objWriter, '/xl/sharedStrings.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml');\n\n        // Add worksheet relationship content types\n        $chart = 1;\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            $drawings = $pPHPExcel->getSheet($i)->getDrawingCollection();\n            $drawingCount = count($drawings);\n            $chartCount = ($includeCharts) ? $pPHPExcel->getSheet($i)->getChartCount() : 0;\n\n            //    We need a drawing relationship for the worksheet if we have either drawings or charts\n            if (($drawingCount > 0) || ($chartCount > 0)) {\n                $this->writeOverrideContentType($objWriter, '/xl/drawings/drawing' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.drawing+xml');\n            }\n\n            //    If we have charts, then we need a chart relationship for every individual chart\n            if ($chartCount > 0) {\n                for ($c = 0; $c < $chartCount; ++$c) {\n                    $this->writeOverrideContentType($objWriter, '/xl/charts/chart' . $chart++ . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml');\n                }\n            }\n        }\n\n        // Comments\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            if (count($pPHPExcel->getSheet($i)->getComments()) > 0) {\n                $this->writeOverrideContentType($objWriter, '/xl/comments' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml');\n            }\n        }\n\n        // Add media content-types\n        $aMediaContentTypes = array();\n        $mediaCount = $this->getParentWriter()->getDrawingHashTable()->count();\n        for ($i = 0; $i < $mediaCount; ++$i) {\n            $extension     = '';\n            $mimeType     = '';\n\n            if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) {\n                $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getExtension());\n                $mimeType = $this->getImageMimeType($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getPath());\n            } elseif ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) {\n                $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType());\n                $extension = explode('/', $extension);\n                $extension = $extension[1];\n\n                $mimeType = $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType();\n            }\n\n            if (!isset( $aMediaContentTypes[$extension])) {\n                $aMediaContentTypes[$extension] = $mimeType;\n\n                $this->writeDefaultContentType($objWriter, $extension, $mimeType);\n            }\n        }\n        if ($pPHPExcel->hasRibbonBinObjects()) {\n            // Some additional objects in the ribbon ?\n            // we need to write \"Extension\" but not already write for media content\n            $tabRibbonTypes=array_diff($pPHPExcel->getRibbonBinObjects('types'), array_keys($aMediaContentTypes));\n            foreach ($tabRibbonTypes as $aRibbonType) {\n                $mimeType='image/.'.$aRibbonType;//we wrote $mimeType like customUI Editor\n                $this->writeDefaultContentType($objWriter, $aRibbonType, $mimeType);\n            }\n        }\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            if (count($pPHPExcel->getSheet()->getHeaderFooter()->getImages()) > 0) {\n                foreach ($pPHPExcel->getSheet()->getHeaderFooter()->getImages() as $image) {\n                    if (!isset( $aMediaContentTypes[strtolower($image->getExtension())])) {\n                        $aMediaContentTypes[strtolower($image->getExtension())] = $this->getImageMimeType($image->getPath());\n\n                        $this->writeDefaultContentType($objWriter, strtolower($image->getExtension()), $aMediaContentTypes[strtolower($image->getExtension())]);\n                    }\n                }\n            }\n        }\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Get image mime type\n     *\n     * @param     string    $pFile    Filename\n     * @return     string    Mime Type\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function getImageMimeType($pFile = '')\n    {\n        if (PHPExcel_Shared_File::file_exists($pFile)) {\n            $image = getimagesize($pFile);\n            return image_type_to_mime_type($image[2]);\n        } else {\n            throw new PHPExcel_Writer_Exception(\"File $pFile does not exist\");\n        }\n    }\n\n    /**\n     * Write Default content type\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     string                         $pPartname         Part name\n     * @param     string                         $pContentType     Content type\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeDefaultContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '')\n    {\n        if ($pPartname != '' && $pContentType != '') {\n            // Write content type\n            $objWriter->startElement('Default');\n            $objWriter->writeAttribute('Extension', $pPartname);\n            $objWriter->writeAttribute('ContentType', $pContentType);\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Write Override content type\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     string                         $pPartname         Part name\n     * @param     string                         $pContentType     Content type\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeOverrideContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '')\n    {\n        if ($pPartname != '' && $pContentType != '') {\n            // Write content type\n            $objWriter->startElement('Override');\n            $objWriter->writeAttribute('PartName', $pPartname);\n            $objWriter->writeAttribute('ContentType', $pContentType);\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_DocProps\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_DocProps extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write docProps/app.xml to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeDocPropsApp(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Properties\n        $objWriter->startElement('Properties');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties');\n        $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes');\n\n        // Application\n        $objWriter->writeElement('Application', 'Microsoft Excel');\n\n        // DocSecurity\n        $objWriter->writeElement('DocSecurity', '0');\n\n        // ScaleCrop\n        $objWriter->writeElement('ScaleCrop', 'false');\n\n        // HeadingPairs\n        $objWriter->startElement('HeadingPairs');\n\n        // Vector\n        $objWriter->startElement('vt:vector');\n        $objWriter->writeAttribute('size', '2');\n        $objWriter->writeAttribute('baseType', 'variant');\n\n        // Variant\n        $objWriter->startElement('vt:variant');\n        $objWriter->writeElement('vt:lpstr', 'Worksheets');\n        $objWriter->endElement();\n\n        // Variant\n        $objWriter->startElement('vt:variant');\n        $objWriter->writeElement('vt:i4', $pPHPExcel->getSheetCount());\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // TitlesOfParts\n        $objWriter->startElement('TitlesOfParts');\n\n        // Vector\n        $objWriter->startElement('vt:vector');\n        $objWriter->writeAttribute('size', $pPHPExcel->getSheetCount());\n        $objWriter->writeAttribute('baseType', 'lpstr');\n\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            $objWriter->writeElement('vt:lpstr', $pPHPExcel->getSheet($i)->getTitle());\n        }\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // Company\n        $objWriter->writeElement('Company', $pPHPExcel->getProperties()->getCompany());\n\n        // Company\n        $objWriter->writeElement('Manager', $pPHPExcel->getProperties()->getManager());\n\n        // LinksUpToDate\n        $objWriter->writeElement('LinksUpToDate', 'false');\n\n        // SharedDoc\n        $objWriter->writeElement('SharedDoc', 'false');\n\n        // HyperlinksChanged\n        $objWriter->writeElement('HyperlinksChanged', 'false');\n\n        // AppVersion\n        $objWriter->writeElement('AppVersion', '12.0000');\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write docProps/core.xml to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeDocPropsCore(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // cp:coreProperties\n        $objWriter->startElement('cp:coreProperties');\n        $objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties');\n        $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');\n        $objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/');\n        $objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/');\n        $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');\n\n        // dc:creator\n        $objWriter->writeElement('dc:creator', $pPHPExcel->getProperties()->getCreator());\n\n        // cp:lastModifiedBy\n        $objWriter->writeElement('cp:lastModifiedBy', $pPHPExcel->getProperties()->getLastModifiedBy());\n\n        // dcterms:created\n        $objWriter->startElement('dcterms:created');\n        $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF');\n        $objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getCreated()));\n        $objWriter->endElement();\n\n        // dcterms:modified\n        $objWriter->startElement('dcterms:modified');\n        $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF');\n        $objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getModified()));\n        $objWriter->endElement();\n\n        // dc:title\n        $objWriter->writeElement('dc:title', $pPHPExcel->getProperties()->getTitle());\n\n        // dc:description\n        $objWriter->writeElement('dc:description', $pPHPExcel->getProperties()->getDescription());\n\n        // dc:subject\n        $objWriter->writeElement('dc:subject', $pPHPExcel->getProperties()->getSubject());\n\n        // cp:keywords\n        $objWriter->writeElement('cp:keywords', $pPHPExcel->getProperties()->getKeywords());\n\n        // cp:category\n        $objWriter->writeElement('cp:category', $pPHPExcel->getProperties()->getCategory());\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write docProps/custom.xml to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeDocPropsCustom(PHPExcel $pPHPExcel = null)\n    {\n        $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties();\n        if (empty($customPropertyList)) {\n            return;\n        }\n\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // cp:coreProperties\n        $objWriter->startElement('Properties');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties');\n        $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes');\n\n\n        foreach ($customPropertyList as $key => $customProperty) {\n            $propertyValue = $pPHPExcel->getProperties()->getCustomPropertyValue($customProperty);\n            $propertyType = $pPHPExcel->getProperties()->getCustomPropertyType($customProperty);\n\n            $objWriter->startElement('property');\n            $objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}');\n            $objWriter->writeAttribute('pid', $key+2);\n            $objWriter->writeAttribute('name', $customProperty);\n\n            switch ($propertyType) {\n                case 'i':\n                    $objWriter->writeElement('vt:i4', $propertyValue);\n                    break;\n                case 'f':\n                    $objWriter->writeElement('vt:r8', $propertyValue);\n                    break;\n                case 'b':\n                    $objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false');\n                    break;\n                case 'd':\n                    $objWriter->startElement('vt:filetime');\n                    $objWriter->writeRawData(date(DATE_W3C, $propertyValue));\n                    $objWriter->endElement();\n                    break;\n                default:\n                    $objWriter->writeElement('vt:lpwstr', $propertyValue);\n                    break;\n            }\n\n            $objWriter->endElement();\n        }\n\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_Drawing\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_Drawing extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write drawings to XML format\n     *\n     * @param     PHPExcel_Worksheet    $pWorksheet\n     * @param    int                    &$chartRef        Chart ID\n     * @param    boolean                $includeCharts    Flag indicating if we should include drawing details for charts\n     * @return     string                 XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeDrawings(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = false)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // xdr:wsDr\n        $objWriter->startElement('xdr:wsDr');\n        $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing');\n        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');\n\n        // Loop through images and write drawings\n        $i = 1;\n        $iterator = $pWorksheet->getDrawingCollection()->getIterator();\n        while ($iterator->valid()) {\n            $this->writeDrawing($objWriter, $iterator->current(), $i);\n\n            $iterator->next();\n            ++$i;\n        }\n\n        if ($includeCharts) {\n            $chartCount = $pWorksheet->getChartCount();\n            // Loop through charts and write the chart position\n            if ($chartCount > 0) {\n                for ($c = 0; $c < $chartCount; ++$c) {\n                    $this->writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c+$i);\n                }\n            }\n        }\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write drawings to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel_Chart                $pChart\n     * @param     int                            $pRelationId\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeChart(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Chart $pChart = null, $pRelationId = -1)\n    {\n        $tl = $pChart->getTopLeftPosition();\n        $tl['colRow'] = PHPExcel_Cell::coordinateFromString($tl['cell']);\n        $br = $pChart->getBottomRightPosition();\n        $br['colRow'] = PHPExcel_Cell::coordinateFromString($br['cell']);\n\n        $objWriter->startElement('xdr:twoCellAnchor');\n\n            $objWriter->startElement('xdr:from');\n                $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($tl['colRow'][0]) - 1);\n                $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['xOffset']));\n                $objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1);\n                $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['yOffset']));\n            $objWriter->endElement();\n            $objWriter->startElement('xdr:to');\n                $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($br['colRow'][0]) - 1);\n                $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['xOffset']));\n                $objWriter->writeElement('xdr:row', $br['colRow'][1] - 1);\n                $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['yOffset']));\n            $objWriter->endElement();\n\n            $objWriter->startElement('xdr:graphicFrame');\n                $objWriter->writeAttribute('macro', '');\n                $objWriter->startElement('xdr:nvGraphicFramePr');\n                    $objWriter->startElement('xdr:cNvPr');\n                        $objWriter->writeAttribute('name', 'Chart '.$pRelationId);\n                        $objWriter->writeAttribute('id', 1025 * $pRelationId);\n                    $objWriter->endElement();\n                    $objWriter->startElement('xdr:cNvGraphicFramePr');\n                        $objWriter->startElement('a:graphicFrameLocks');\n                        $objWriter->endElement();\n                    $objWriter->endElement();\n                $objWriter->endElement();\n\n                $objWriter->startElement('xdr:xfrm');\n                    $objWriter->startElement('a:off');\n                        $objWriter->writeAttribute('x', '0');\n                        $objWriter->writeAttribute('y', '0');\n                    $objWriter->endElement();\n                    $objWriter->startElement('a:ext');\n                        $objWriter->writeAttribute('cx', '0');\n                        $objWriter->writeAttribute('cy', '0');\n                    $objWriter->endElement();\n                $objWriter->endElement();\n\n                $objWriter->startElement('a:graphic');\n                    $objWriter->startElement('a:graphicData');\n                        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');\n                        $objWriter->startElement('c:chart');\n                            $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');\n                            $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');\n                            $objWriter->writeAttribute('r:id', 'rId'.$pRelationId);\n                        $objWriter->endElement();\n                    $objWriter->endElement();\n                $objWriter->endElement();\n            $objWriter->endElement();\n\n            $objWriter->startElement('xdr:clientData');\n            $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write drawings to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter            $objWriter         XML Writer\n     * @param     PHPExcel_Worksheet_BaseDrawing        $pDrawing\n     * @param     int                                    $pRelationId\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet_BaseDrawing $pDrawing = null, $pRelationId = -1)\n    {\n        if ($pRelationId >= 0) {\n            // xdr:oneCellAnchor\n            $objWriter->startElement('xdr:oneCellAnchor');\n            // Image location\n            $aCoordinates         = PHPExcel_Cell::coordinateFromString($pDrawing->getCoordinates());\n            $aCoordinates[0]     = PHPExcel_Cell::columnIndexFromString($aCoordinates[0]);\n\n            // xdr:from\n            $objWriter->startElement('xdr:from');\n            $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1);\n            $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX()));\n            $objWriter->writeElement('xdr:row', $aCoordinates[1] - 1);\n            $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY()));\n            $objWriter->endElement();\n\n            // xdr:ext\n            $objWriter->startElement('xdr:ext');\n            $objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth()));\n            $objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight()));\n            $objWriter->endElement();\n\n            // xdr:pic\n            $objWriter->startElement('xdr:pic');\n\n            // xdr:nvPicPr\n            $objWriter->startElement('xdr:nvPicPr');\n\n            // xdr:cNvPr\n            $objWriter->startElement('xdr:cNvPr');\n            $objWriter->writeAttribute('id', $pRelationId);\n            $objWriter->writeAttribute('name', $pDrawing->getName());\n            $objWriter->writeAttribute('descr', $pDrawing->getDescription());\n            $objWriter->endElement();\n\n            // xdr:cNvPicPr\n            $objWriter->startElement('xdr:cNvPicPr');\n\n            // a:picLocks\n            $objWriter->startElement('a:picLocks');\n            $objWriter->writeAttribute('noChangeAspect', '1');\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n\n            // xdr:blipFill\n            $objWriter->startElement('xdr:blipFill');\n\n            // a:blip\n            $objWriter->startElement('a:blip');\n            $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');\n            $objWriter->writeAttribute('r:embed', 'rId' . $pRelationId);\n            $objWriter->endElement();\n\n            // a:stretch\n            $objWriter->startElement('a:stretch');\n                $objWriter->writeElement('a:fillRect', null);\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n\n            // xdr:spPr\n            $objWriter->startElement('xdr:spPr');\n\n            // a:xfrm\n            $objWriter->startElement('a:xfrm');\n            $objWriter->writeAttribute('rot', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getRotation()));\n            $objWriter->endElement();\n\n            // a:prstGeom\n            $objWriter->startElement('a:prstGeom');\n            $objWriter->writeAttribute('prst', 'rect');\n\n            // a:avLst\n            $objWriter->writeElement('a:avLst', null);\n\n            $objWriter->endElement();\n\n//                        // a:solidFill\n//                        $objWriter->startElement('a:solidFill');\n\n//                            // a:srgbClr\n//                            $objWriter->startElement('a:srgbClr');\n//                            $objWriter->writeAttribute('val', 'FFFFFF');\n\n///* SHADE\n//                                // a:shade\n//                                $objWriter->startElement('a:shade');\n//                                $objWriter->writeAttribute('val', '85000');\n//                                $objWriter->endElement();\n//*/\n\n//                            $objWriter->endElement();\n\n//                        $objWriter->endElement();\n/*\n            // a:ln\n            $objWriter->startElement('a:ln');\n            $objWriter->writeAttribute('w', '88900');\n            $objWriter->writeAttribute('cap', 'sq');\n\n                // a:solidFill\n                $objWriter->startElement('a:solidFill');\n\n                    // a:srgbClr\n                    $objWriter->startElement('a:srgbClr');\n                    $objWriter->writeAttribute('val', 'FFFFFF');\n                    $objWriter->endElement();\n\n                $objWriter->endElement();\n\n                // a:miter\n                $objWriter->startElement('a:miter');\n                $objWriter->writeAttribute('lim', '800000');\n                $objWriter->endElement();\n\n            $objWriter->endElement();\n*/\n\n            if ($pDrawing->getShadow()->getVisible()) {\n                // a:effectLst\n                $objWriter->startElement('a:effectLst');\n\n                // a:outerShdw\n                $objWriter->startElement('a:outerShdw');\n                $objWriter->writeAttribute('blurRad', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius()));\n                $objWriter->writeAttribute('dist', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance()));\n                $objWriter->writeAttribute('dir', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getShadow()->getDirection()));\n                $objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment());\n                $objWriter->writeAttribute('rotWithShape', '0');\n\n                // a:srgbClr\n                $objWriter->startElement('a:srgbClr');\n                $objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB());\n\n                // a:alpha\n                $objWriter->startElement('a:alpha');\n                $objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000);\n                $objWriter->endElement();\n\n                $objWriter->endElement();\n\n                $objWriter->endElement();\n\n                $objWriter->endElement();\n            }\n/*\n\n                // a:scene3d\n                $objWriter->startElement('a:scene3d');\n\n                    // a:camera\n                    $objWriter->startElement('a:camera');\n                    $objWriter->writeAttribute('prst', 'orthographicFront');\n                    $objWriter->endElement();\n\n                    // a:lightRig\n                    $objWriter->startElement('a:lightRig');\n                    $objWriter->writeAttribute('rig', 'twoPt');\n                    $objWriter->writeAttribute('dir', 't');\n\n                        // a:rot\n                        $objWriter->startElement('a:rot');\n                        $objWriter->writeAttribute('lat', '0');\n                        $objWriter->writeAttribute('lon', '0');\n                        $objWriter->writeAttribute('rev', '0');\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                $objWriter->endElement();\n*/\n/*\n                // a:sp3d\n                $objWriter->startElement('a:sp3d');\n\n                    // a:bevelT\n                    $objWriter->startElement('a:bevelT');\n                    $objWriter->writeAttribute('w', '25400');\n                    $objWriter->writeAttribute('h', '19050');\n                    $objWriter->endElement();\n\n                    // a:contourClr\n                    $objWriter->startElement('a:contourClr');\n\n                        // a:srgbClr\n                        $objWriter->startElement('a:srgbClr');\n                        $objWriter->writeAttribute('val', 'FFFFFF');\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                $objWriter->endElement();\n*/\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n\n            // xdr:clientData\n            $objWriter->writeElement('xdr:clientData', null);\n\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Write VML header/footer images to XML format\n     *\n     * @param     PHPExcel_Worksheet                $pWorksheet\n     * @return     string                                 XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeVMLHeaderFooterImages(PHPExcel_Worksheet $pWorksheet = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Header/footer images\n        $images = $pWorksheet->getHeaderFooter()->getImages();\n\n        // xml\n        $objWriter->startElement('xml');\n        $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');\n        $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');\n        $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel');\n\n        // o:shapelayout\n        $objWriter->startElement('o:shapelayout');\n        $objWriter->writeAttribute('v:ext', 'edit');\n\n        // o:idmap\n        $objWriter->startElement('o:idmap');\n        $objWriter->writeAttribute('v:ext', 'edit');\n        $objWriter->writeAttribute('data', '1');\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // v:shapetype\n        $objWriter->startElement('v:shapetype');\n        $objWriter->writeAttribute('id', '_x0000_t75');\n        $objWriter->writeAttribute('coordsize', '21600,21600');\n        $objWriter->writeAttribute('o:spt', '75');\n        $objWriter->writeAttribute('o:preferrelative', 't');\n        $objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe');\n        $objWriter->writeAttribute('filled', 'f');\n        $objWriter->writeAttribute('stroked', 'f');\n\n        // v:stroke\n        $objWriter->startElement('v:stroke');\n        $objWriter->writeAttribute('joinstyle', 'miter');\n        $objWriter->endElement();\n\n        // v:formulas\n        $objWriter->startElement('v:formulas');\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'sum @0 1 0');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'sum 0 0 @1');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'prod @2 1 2');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'sum @0 0 1');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'prod @6 1 2');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'sum @8 21600 0');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight');\n        $objWriter->endElement();\n\n        // v:f\n        $objWriter->startElement('v:f');\n        $objWriter->writeAttribute('eqn', 'sum @10 21600 0');\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // v:path\n        $objWriter->startElement('v:path');\n        $objWriter->writeAttribute('o:extrusionok', 'f');\n        $objWriter->writeAttribute('gradientshapeok', 't');\n        $objWriter->writeAttribute('o:connecttype', 'rect');\n        $objWriter->endElement();\n\n        // o:lock\n        $objWriter->startElement('o:lock');\n        $objWriter->writeAttribute('v:ext', 'edit');\n        $objWriter->writeAttribute('aspectratio', 't');\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // Loop through images\n        foreach ($images as $key => $value) {\n            $this->writeVMLHeaderFooterImage($objWriter, $key, $value);\n        }\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write VML comment to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter        $objWriter             XML Writer\n     * @param    string                            $pReference            Reference\n     * @param     PHPExcel_Worksheet_HeaderFooterDrawing    $pImage        Image\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeVMLHeaderFooterImage(PHPExcel_Shared_XMLWriter $objWriter = null, $pReference = '', PHPExcel_Worksheet_HeaderFooterDrawing $pImage = null)\n    {\n        // Calculate object id\n        preg_match('{(\\d+)}', md5($pReference), $m);\n        $id = 1500 + (substr($m[1], 0, 2) * 1);\n\n        // Calculate offset\n        $width = $pImage->getWidth();\n        $height = $pImage->getHeight();\n        $marginLeft = $pImage->getOffsetX();\n        $marginTop = $pImage->getOffsetY();\n\n        // v:shape\n        $objWriter->startElement('v:shape');\n        $objWriter->writeAttribute('id', $pReference);\n        $objWriter->writeAttribute('o:spid', '_x0000_s' . $id);\n        $objWriter->writeAttribute('type', '#_x0000_t75');\n        $objWriter->writeAttribute('style', \"position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1\");\n\n        // v:imagedata\n        $objWriter->startElement('v:imagedata');\n        $objWriter->writeAttribute('o:relid', 'rId' . $pReference);\n        $objWriter->writeAttribute('o:title', $pImage->getName());\n        $objWriter->endElement();\n\n        // o:lock\n        $objWriter->startElement('o:lock');\n        $objWriter->writeAttribute('v:ext', 'edit');\n        $objWriter->writeAttribute('rotation', 't');\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n\n    /**\n     * Get an array of all drawings\n     *\n     * @param     PHPExcel                            $pPHPExcel\n     * @return     PHPExcel_Worksheet_Drawing[]        All drawings in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allDrawings(PHPExcel $pPHPExcel = null)\n    {\n        // Get an array of all drawings\n        $aDrawings    = array();\n\n        // Loop through PHPExcel\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            // Loop through images and add to array\n            $iterator = $pPHPExcel->getSheet($i)->getDrawingCollection()->getIterator();\n            while ($iterator->valid()) {\n                $aDrawings[] = $iterator->current();\n\n                  $iterator->next();\n            }\n        }\n\n        return $aDrawings;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_Rels\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_Rels extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write relationships to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeRelationships(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n\n        $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties();\n        if (!empty($customPropertyList)) {\n            // Relationship docProps/app.xml\n            $this->writeRelationship(\n                $objWriter,\n                4,\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',\n                'docProps/custom.xml'\n            );\n\n        }\n\n        // Relationship docProps/app.xml\n        $this->writeRelationship(\n            $objWriter,\n            3,\n            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',\n            'docProps/app.xml'\n        );\n\n        // Relationship docProps/core.xml\n        $this->writeRelationship(\n            $objWriter,\n            2,\n            'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',\n            'docProps/core.xml'\n        );\n\n        // Relationship xl/workbook.xml\n        $this->writeRelationship(\n            $objWriter,\n            1,\n            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',\n            'xl/workbook.xml'\n        );\n        // a custom UI in workbook ?\n        if ($pPHPExcel->hasRibbon()) {\n            $this->writeRelationShip(\n                $objWriter,\n                5,\n                'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',\n                $pPHPExcel->getRibbonXMLData('target')\n            );\n        }\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write workbook relationships to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeWorkbookRelationships(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n\n        // Relationship styles.xml\n        $this->writeRelationship(\n            $objWriter,\n            1,\n            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',\n            'styles.xml'\n        );\n\n        // Relationship theme/theme1.xml\n        $this->writeRelationship(\n            $objWriter,\n            2,\n            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',\n            'theme/theme1.xml'\n        );\n\n        // Relationship sharedStrings.xml\n        $this->writeRelationship(\n            $objWriter,\n            3,\n            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',\n            'sharedStrings.xml'\n        );\n\n        // Relationships with sheets\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            $this->writeRelationship(\n                $objWriter,\n                ($i + 1 + 3),\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n                'worksheets/sheet' . ($i + 1) . '.xml'\n            );\n        }\n        // Relationships for vbaProject if needed\n        // id : just after the last sheet\n        if ($pPHPExcel->hasMacros()) {\n            $this->writeRelationShip(\n                $objWriter,\n                ($i + 1 + 3),\n                'http://schemas.microsoft.com/office/2006/relationships/vbaProject',\n                'vbaProject.bin'\n            );\n            ++$i;//increment i if needed for an another relation\n        }\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write worksheet relationships to XML format\n     *\n     * Numbering is as follows:\n     *     rId1                 - Drawings\n     *  rId_hyperlink_x     - Hyperlinks\n     *\n     * @param     PHPExcel_Worksheet    $pWorksheet\n     * @param     int                    $pWorksheetId\n     * @param    boolean                $includeCharts    Flag indicating if we should write charts\n     * @return     string                 XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeWorksheetRelationships(PHPExcel_Worksheet $pWorksheet = null, $pWorksheetId = 1, $includeCharts = false)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n\n        // Write drawing relationships?\n        $d = 0;\n        if ($includeCharts) {\n            $charts = $pWorksheet->getChartCollection();\n        } else {\n            $charts = array();\n        }\n        if (($pWorksheet->getDrawingCollection()->count() > 0) ||\n            (count($charts) > 0)) {\n            $this->writeRelationship(\n                $objWriter,\n                ++$d,\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',\n                '../drawings/drawing' . $pWorksheetId . '.xml'\n            );\n        }\n\n        // Write chart relationships?\n//            $chartCount = 0;\n//            $charts = $pWorksheet->getChartCollection();\n//            echo 'Chart Rels: ' , count($charts) , '<br />';\n//            if (count($charts) > 0) {\n//                foreach ($charts as $chart) {\n//                    $this->writeRelationship(\n//                        $objWriter,\n//                        ++$d,\n//                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',\n//                        '../charts/chart' . ++$chartCount . '.xml'\n//                    );\n//                }\n//            }\n//\n        // Write hyperlink relationships?\n        $i = 1;\n        foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) {\n            if (!$hyperlink->isInternal()) {\n                $this->writeRelationship(\n                    $objWriter,\n                    '_hyperlink_' . $i,\n                    'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',\n                    $hyperlink->getUrl(),\n                    'External'\n                );\n\n                ++$i;\n            }\n        }\n\n        // Write comments relationship?\n        $i = 1;\n        if (count($pWorksheet->getComments()) > 0) {\n            $this->writeRelationship(\n                $objWriter,\n                '_comments_vml' . $i,\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',\n                '../drawings/vmlDrawing' . $pWorksheetId . '.vml'\n            );\n\n            $this->writeRelationship(\n                $objWriter,\n                '_comments' . $i,\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',\n                '../comments' . $pWorksheetId . '.xml'\n            );\n        }\n\n        // Write header/footer relationship?\n        $i = 1;\n        if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) {\n            $this->writeRelationship(\n                $objWriter,\n                '_headerfooter_vml' . $i,\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',\n                '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml'\n            );\n        }\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write drawing relationships to XML format\n     *\n     * @param     PHPExcel_Worksheet    $pWorksheet\n     * @param    int                    &$chartRef        Chart ID\n     * @param    boolean                $includeCharts    Flag indicating if we should write charts\n     * @return     string                 XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeDrawingRelationships(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = false)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n\n        // Loop through images and write relationships\n        $i = 1;\n        $iterator = $pWorksheet->getDrawingCollection()->getIterator();\n        while ($iterator->valid()) {\n            if ($iterator->current() instanceof PHPExcel_Worksheet_Drawing\n                || $iterator->current() instanceof PHPExcel_Worksheet_MemoryDrawing) {\n                // Write relationship for image drawing\n                $this->writeRelationship(\n                    $objWriter,\n                    $i,\n                    'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',\n                    '../media/' . str_replace(' ', '', $iterator->current()->getIndexedFilename())\n                );\n            }\n\n            $iterator->next();\n            ++$i;\n        }\n\n        if ($includeCharts) {\n            // Loop through charts and write relationships\n            $chartCount = $pWorksheet->getChartCount();\n            if ($chartCount > 0) {\n                for ($c = 0; $c < $chartCount; ++$c) {\n                    $this->writeRelationship(\n                        $objWriter,\n                        $i++,\n                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',\n                        '../charts/chart' . ++$chartRef . '.xml'\n                    );\n                }\n            }\n        }\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write header/footer drawing relationships to XML format\n     *\n     * @param     PHPExcel_Worksheet            $pWorksheet\n     * @return     string                         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeHeaderFooterDrawingRelationships(PHPExcel_Worksheet $pWorksheet = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n\n        // Loop through images and write relationships\n        foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) {\n            // Write relationship for image drawing\n            $this->writeRelationship(\n                $objWriter,\n                $key,\n                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',\n                '../media/' . $value->getIndexedFilename()\n            );\n        }\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write Override content type\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     int                            $pId            Relationship ID. rId will be prepended!\n     * @param     string                        $pType            Relationship type\n     * @param     string                         $pTarget        Relationship target\n     * @param     string                         $pTargetMode    Relationship target mode\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeRelationship(PHPExcel_Shared_XMLWriter $objWriter = null, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '')\n    {\n        if ($pType != '' && $pTarget != '') {\n            // Write relationship\n            $objWriter->startElement('Relationship');\n            $objWriter->writeAttribute('Id', 'rId' . $pId);\n            $objWriter->writeAttribute('Type', $pType);\n            $objWriter->writeAttribute('Target', $pTarget);\n\n            if ($pTargetMode != '') {\n                $objWriter->writeAttribute('TargetMode', $pTargetMode);\n            }\n\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/RelsRibbon.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_RelsRibbon\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version     ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_RelsRibbon extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write relationships for additional objects of custom UI (ribbon)\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeRibbonRelationships(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n        $localRels = $pPHPExcel->getRibbonBinObjects('names');\n        if (is_array($localRels)) {\n            foreach ($localRels as $aId => $aTarget) {\n                $objWriter->startElement('Relationship');\n                $objWriter->writeAttribute('Id', $aId);\n                $objWriter->writeAttribute('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');\n                $objWriter->writeAttribute('Target', $aTarget);\n                $objWriter->endElement();\n            }\n        }\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/RelsVBA.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_RelsVBA\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version     ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_RelsVBA extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write relationships for a signed VBA Project\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeVBARelationships(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // Relationships\n        $objWriter->startElement('Relationships');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n        $objWriter->startElement('Relationship');\n        $objWriter->writeAttribute('Id', 'rId1');\n        $objWriter->writeAttribute('Type', 'http://schemas.microsoft.com/office/2006/relationships/vbaProjectSignature');\n        $objWriter->writeAttribute('Target', 'vbaProjectSignature.bin');\n        $objWriter->endElement();\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_StringTable\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_StringTable extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Create worksheet stringtable\n     *\n     * @param     PHPExcel_Worksheet     $pSheet                Worksheet\n     * @param     string[]                 $pExistingTable     Existing table to eventually merge with\n     * @return     string[]                 String table for worksheet\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function createStringTable($pSheet = null, $pExistingTable = null)\n    {\n        if ($pSheet !== null) {\n            // Create string lookup table\n            $aStringTable = array();\n            $cellCollection = null;\n            $aFlippedStringTable = null;    // For faster lookup\n\n            // Is an existing table given?\n            if (($pExistingTable !== null) && is_array($pExistingTable)) {\n                $aStringTable = $pExistingTable;\n            }\n\n            // Fill index array\n            $aFlippedStringTable = $this->flipStringTable($aStringTable);\n\n            // Loop through cells\n            foreach ($pSheet->getCellCollection() as $cellID) {\n                $cell = $pSheet->getCell($cellID);\n                $cellValue = $cell->getValue();\n                if (!is_object($cellValue) &&\n                    ($cellValue !== null) &&\n                    $cellValue !== '' &&\n                    !isset($aFlippedStringTable[$cellValue]) &&\n                    ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING2 || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_NULL)) {\n                        $aStringTable[] = $cellValue;\n                        $aFlippedStringTable[$cellValue] = true;\n                } elseif ($cellValue instanceof PHPExcel_RichText &&\n                          ($cellValue !== null) &&\n                          !isset($aFlippedStringTable[$cellValue->getHashCode()])) {\n                                $aStringTable[] = $cellValue;\n                                $aFlippedStringTable[$cellValue->getHashCode()] = true;\n                }\n            }\n\n            return $aStringTable;\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid PHPExcel_Worksheet object passed.\");\n        }\n    }\n\n    /**\n     * Write string table to XML format\n     *\n     * @param     string[]     $pStringTable\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeStringTable($pStringTable = null)\n    {\n        if ($pStringTable !== null) {\n            // Create XML writer\n            $objWriter = null;\n            if ($this->getParentWriter()->getUseDiskCaching()) {\n                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n            } else {\n                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n            }\n\n            // XML header\n            $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n            // String table\n            $objWriter->startElement('sst');\n            $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');\n            $objWriter->writeAttribute('uniqueCount', count($pStringTable));\n\n            // Loop through string table\n            foreach ($pStringTable as $textElement) {\n                $objWriter->startElement('si');\n\n                if (! $textElement instanceof PHPExcel_RichText) {\n                    $textToWrite = PHPExcel_Shared_String::ControlCharacterPHP2OOXML($textElement);\n                    $objWriter->startElement('t');\n                    if ($textToWrite !== trim($textToWrite)) {\n                        $objWriter->writeAttribute('xml:space', 'preserve');\n                    }\n                    $objWriter->writeRawData($textToWrite);\n                    $objWriter->endElement();\n                } elseif ($textElement instanceof PHPExcel_RichText) {\n                    $this->writeRichText($objWriter, $textElement);\n                }\n\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n\n            return $objWriter->getData();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid string table array passed.\");\n        }\n    }\n\n    /**\n     * Write Rich Text\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel_RichText            $pRichText        Rich text\n     * @param     string                        $prefix            Optional Namespace prefix\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeRichText(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_RichText $pRichText = null, $prefix = null)\n    {\n        if ($prefix !== null) {\n            $prefix .= ':';\n        }\n            \n        // Loop through rich text elements\n        $elements = $pRichText->getRichTextElements();\n        foreach ($elements as $element) {\n            // r\n            $objWriter->startElement($prefix.'r');\n\n            // rPr\n            if ($element instanceof PHPExcel_RichText_Run) {\n                // rPr\n                $objWriter->startElement($prefix.'rPr');\n\n                // rFont\n                $objWriter->startElement($prefix.'rFont');\n                $objWriter->writeAttribute('val', $element->getFont()->getName());\n                $objWriter->endElement();\n\n                // Bold\n                $objWriter->startElement($prefix.'b');\n                $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false'));\n                $objWriter->endElement();\n\n                // Italic\n                $objWriter->startElement($prefix.'i');\n                $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false'));\n                $objWriter->endElement();\n\n                // Superscript / subscript\n                if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {\n                    $objWriter->startElement($prefix.'vertAlign');\n                    if ($element->getFont()->getSuperScript()) {\n                        $objWriter->writeAttribute('val', 'superscript');\n                    } elseif ($element->getFont()->getSubScript()) {\n                        $objWriter->writeAttribute('val', 'subscript');\n                    }\n                    $objWriter->endElement();\n                }\n\n                // Strikethrough\n                $objWriter->startElement($prefix.'strike');\n                $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false'));\n                $objWriter->endElement();\n\n                // Color\n                $objWriter->startElement($prefix.'color');\n                $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB());\n                $objWriter->endElement();\n\n                // Size\n                $objWriter->startElement($prefix.'sz');\n                $objWriter->writeAttribute('val', $element->getFont()->getSize());\n                $objWriter->endElement();\n\n                // Underline\n                $objWriter->startElement($prefix.'u');\n                $objWriter->writeAttribute('val', $element->getFont()->getUnderline());\n                $objWriter->endElement();\n\n                $objWriter->endElement();\n            }\n\n            // t\n            $objWriter->startElement($prefix.'t');\n            $objWriter->writeAttribute('xml:space', 'preserve');\n            $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText()));\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write Rich Text\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     string|PHPExcel_RichText    $pRichText        text string or Rich text\n     * @param     string                        $prefix            Optional Namespace prefix\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeRichTextForCharts(PHPExcel_Shared_XMLWriter $objWriter = null, $pRichText = null, $prefix = null)\n    {\n        if (!$pRichText instanceof PHPExcel_RichText) {\n            $textRun = $pRichText;\n            $pRichText = new PHPExcel_RichText();\n            $pRichText->createTextRun($textRun);\n        }\n\n        if ($prefix !== null) {\n            $prefix .= ':';\n        }\n            \n        // Loop through rich text elements\n        $elements = $pRichText->getRichTextElements();\n        foreach ($elements as $element) {\n            // r\n            $objWriter->startElement($prefix.'r');\n\n            // rPr\n            $objWriter->startElement($prefix.'rPr');\n\n            // Bold\n            $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0));\n            // Italic\n            $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0));\n            // Underline\n            $underlineType = $element->getFont()->getUnderline();\n            switch ($underlineType) {\n                case 'single':\n                    $underlineType = 'sng';\n                    break;\n                case 'double':\n                    $underlineType = 'dbl';\n                    break;\n            }\n            $objWriter->writeAttribute('u', $underlineType);\n            // Strikethrough\n            $objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike'));\n\n            // rFont\n            $objWriter->startElement($prefix.'latin');\n                $objWriter->writeAttribute('typeface', $element->getFont()->getName());\n            $objWriter->endElement();\n\n                // Superscript / subscript\n//                    if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {\n//                        $objWriter->startElement($prefix.'vertAlign');\n//                        if ($element->getFont()->getSuperScript()) {\n//                            $objWriter->writeAttribute('val', 'superscript');\n//                        } elseif ($element->getFont()->getSubScript()) {\n//                            $objWriter->writeAttribute('val', 'subscript');\n//                        }\n//                        $objWriter->endElement();\n//                    }\n//\n            $objWriter->endElement();\n\n            // t\n            $objWriter->startElement($prefix.'t');\n//                    $objWriter->writeAttribute('xml:space', 'preserve');    //    Excel2010 accepts, Excel2007 complains\n            $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText()));\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Flip string table (for index searching)\n     *\n     * @param     array    $stringTable    Stringtable\n     * @return     array\n     */\n    public function flipStringTable($stringTable = array())\n    {\n        // Return value\n        $returnValue = array();\n\n        // Loop through stringtable and add flipped items to $returnValue\n        foreach ($stringTable as $key => $value) {\n            if (! $value instanceof PHPExcel_RichText) {\n                $returnValue[$value] = $key;\n            } elseif ($value instanceof PHPExcel_RichText) {\n                $returnValue[$value->getHashCode()] = $key;\n            }\n        }\n\n        return $returnValue;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_Style\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_Style extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write styles to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeStyles(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // styleSheet\n        $objWriter->startElement('styleSheet');\n        $objWriter->writeAttribute('xml:space', 'preserve');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');\n\n        // numFmts\n        $objWriter->startElement('numFmts');\n        $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count());\n\n        // numFmt\n        for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) {\n            $this->writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i);\n        }\n\n        $objWriter->endElement();\n\n        // fonts\n        $objWriter->startElement('fonts');\n        $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count());\n\n        // font\n        for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) {\n            $this->writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i));\n        }\n\n        $objWriter->endElement();\n\n        // fills\n        $objWriter->startElement('fills');\n        $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count());\n\n        // fill\n        for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) {\n            $this->writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i));\n        }\n\n        $objWriter->endElement();\n\n        // borders\n        $objWriter->startElement('borders');\n        $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count());\n\n        // border\n        for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) {\n            $this->writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i));\n        }\n\n        $objWriter->endElement();\n\n        // cellStyleXfs\n        $objWriter->startElement('cellStyleXfs');\n        $objWriter->writeAttribute('count', 1);\n\n        // xf\n        $objWriter->startElement('xf');\n        $objWriter->writeAttribute('numFmtId', 0);\n        $objWriter->writeAttribute('fontId', 0);\n        $objWriter->writeAttribute('fillId', 0);\n        $objWriter->writeAttribute('borderId', 0);\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // cellXfs\n        $objWriter->startElement('cellXfs');\n        $objWriter->writeAttribute('count', count($pPHPExcel->getCellXfCollection()));\n\n        // xf\n        foreach ($pPHPExcel->getCellXfCollection() as $cellXf) {\n            $this->writeCellStyleXf($objWriter, $cellXf, $pPHPExcel);\n        }\n\n        $objWriter->endElement();\n\n        // cellStyles\n        $objWriter->startElement('cellStyles');\n        $objWriter->writeAttribute('count', 1);\n\n        // cellStyle\n        $objWriter->startElement('cellStyle');\n        $objWriter->writeAttribute('name', 'Normal');\n        $objWriter->writeAttribute('xfId', 0);\n        $objWriter->writeAttribute('builtinId', 0);\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // dxfs\n        $objWriter->startElement('dxfs');\n        $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count());\n\n        // dxf\n        for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) {\n            $this->writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle());\n        }\n\n        $objWriter->endElement();\n\n        // tableStyles\n        $objWriter->startElement('tableStyles');\n        $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9');\n        $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1');\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write Fill\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     PHPExcel_Style_Fill            $pFill            Fill style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null)\n    {\n        // Check if this is a pattern type or gradient type\n        if ($pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR ||\n            $pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_PATH) {\n            // Gradient fill\n            $this->writeGradientFill($objWriter, $pFill);\n        } elseif ($pFill->getFillType() !== null) {\n            // Pattern fill\n            $this->writePatternFill($objWriter, $pFill);\n        }\n    }\n\n    /**\n     * Write Gradient Fill\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     PHPExcel_Style_Fill            $pFill            Fill style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeGradientFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null)\n    {\n        // fill\n        $objWriter->startElement('fill');\n\n        // gradientFill\n        $objWriter->startElement('gradientFill');\n        $objWriter->writeAttribute('type', $pFill->getFillType());\n        $objWriter->writeAttribute('degree', $pFill->getRotation());\n\n        // stop\n        $objWriter->startElement('stop');\n        $objWriter->writeAttribute('position', '0');\n\n        // color\n        $objWriter->startElement('color');\n        $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB());\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        // stop\n        $objWriter->startElement('stop');\n        $objWriter->writeAttribute('position', '1');\n\n        // color\n        $objWriter->startElement('color');\n        $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB());\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Pattern Fill\n     *\n     * @param     PHPExcel_Shared_XMLWriter            $objWriter         XML Writer\n     * @param     PHPExcel_Style_Fill                    $pFill            Fill style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writePatternFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null)\n    {\n        // fill\n        $objWriter->startElement('fill');\n\n        // patternFill\n        $objWriter->startElement('patternFill');\n        $objWriter->writeAttribute('patternType', $pFill->getFillType());\n\n        if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) {\n            // fgColor\n            if ($pFill->getStartColor()->getARGB()) {\n                $objWriter->startElement('fgColor');\n                $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB());\n                $objWriter->endElement();\n            }\n        }\n        if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) {\n            // bgColor\n            if ($pFill->getEndColor()->getARGB()) {\n                $objWriter->startElement('bgColor');\n                $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB());\n                $objWriter->endElement();\n            }\n        }\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Font\n     *\n     * @param     PHPExcel_Shared_XMLWriter        $objWriter         XML Writer\n     * @param     PHPExcel_Style_Font                $pFont            Font style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeFont(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Font $pFont = null)\n    {\n        // font\n        $objWriter->startElement('font');\n        //    Weird! The order of these elements actually makes a difference when opening Excel2007\n        //        files in Excel2003 with the compatibility pack. It's not documented behaviour,\n        //        and makes for a real WTF!\n\n        // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does\n        // for conditional formatting). Otherwise it will apparently not be picked up in conditional\n        // formatting style dialog\n        if ($pFont->getBold() !== null) {\n            $objWriter->startElement('b');\n            $objWriter->writeAttribute('val', $pFont->getBold() ? '1' : '0');\n            $objWriter->endElement();\n        }\n\n        // Italic\n        if ($pFont->getItalic() !== null) {\n            $objWriter->startElement('i');\n            $objWriter->writeAttribute('val', $pFont->getItalic() ? '1' : '0');\n            $objWriter->endElement();\n        }\n\n        // Strikethrough\n        if ($pFont->getStrikethrough() !== null) {\n            $objWriter->startElement('strike');\n            $objWriter->writeAttribute('val', $pFont->getStrikethrough() ? '1' : '0');\n            $objWriter->endElement();\n        }\n\n        // Underline\n        if ($pFont->getUnderline() !== null) {\n            $objWriter->startElement('u');\n            $objWriter->writeAttribute('val', $pFont->getUnderline());\n            $objWriter->endElement();\n        }\n\n        // Superscript / subscript\n        if ($pFont->getSuperScript() === true || $pFont->getSubScript() === true) {\n            $objWriter->startElement('vertAlign');\n            if ($pFont->getSuperScript() === true) {\n                $objWriter->writeAttribute('val', 'superscript');\n            } elseif ($pFont->getSubScript() === true) {\n                $objWriter->writeAttribute('val', 'subscript');\n            }\n            $objWriter->endElement();\n        }\n\n        // Size\n        if ($pFont->getSize() !== null) {\n            $objWriter->startElement('sz');\n            $objWriter->writeAttribute('val', $pFont->getSize());\n            $objWriter->endElement();\n        }\n\n        // Foreground color\n        if ($pFont->getColor()->getARGB() !== null) {\n            $objWriter->startElement('color');\n            $objWriter->writeAttribute('rgb', $pFont->getColor()->getARGB());\n            $objWriter->endElement();\n        }\n\n        // Name\n        if ($pFont->getName() !== null) {\n            $objWriter->startElement('name');\n            $objWriter->writeAttribute('val', $pFont->getName());\n            $objWriter->endElement();\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Border\n     *\n     * @param     PHPExcel_Shared_XMLWriter            $objWriter         XML Writer\n     * @param     PHPExcel_Style_Borders                $pBorders        Borders style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeBorder(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Borders $pBorders = null)\n    {\n        // Write border\n        $objWriter->startElement('border');\n        // Diagonal?\n        switch ($pBorders->getDiagonalDirection()) {\n            case PHPExcel_Style_Borders::DIAGONAL_UP:\n                $objWriter->writeAttribute('diagonalUp', 'true');\n                $objWriter->writeAttribute('diagonalDown', 'false');\n                break;\n            case PHPExcel_Style_Borders::DIAGONAL_DOWN:\n                $objWriter->writeAttribute('diagonalUp', 'false');\n                $objWriter->writeAttribute('diagonalDown', 'true');\n                break;\n            case PHPExcel_Style_Borders::DIAGONAL_BOTH:\n                $objWriter->writeAttribute('diagonalUp', 'true');\n                $objWriter->writeAttribute('diagonalDown', 'true');\n                break;\n        }\n\n        // BorderPr\n        $this->writeBorderPr($objWriter, 'left', $pBorders->getLeft());\n        $this->writeBorderPr($objWriter, 'right', $pBorders->getRight());\n        $this->writeBorderPr($objWriter, 'top', $pBorders->getTop());\n        $this->writeBorderPr($objWriter, 'bottom', $pBorders->getBottom());\n        $this->writeBorderPr($objWriter, 'diagonal', $pBorders->getDiagonal());\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Cell Style Xf\n     *\n     * @param     PHPExcel_Shared_XMLWriter            $objWriter         XML Writer\n     * @param     PHPExcel_Style                        $pStyle            Style\n     * @param     PHPExcel                            $pPHPExcel        Workbook\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeCellStyleXf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null, PHPExcel $pPHPExcel = null)\n    {\n        // xf\n        $objWriter->startElement('xf');\n        $objWriter->writeAttribute('xfId', 0);\n        $objWriter->writeAttribute('fontId', (int)$this->getParentWriter()->getFontHashTable()->getIndexForHashCode($pStyle->getFont()->getHashCode()));\n        if ($pStyle->getQuotePrefix()) {\n            $objWriter->writeAttribute('quotePrefix', 1);\n        }\n\n        if ($pStyle->getNumberFormat()->getBuiltInFormatCode() === false) {\n            $objWriter->writeAttribute('numFmtId', (int)($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($pStyle->getNumberFormat()->getHashCode()) + 164));\n        } else {\n            $objWriter->writeAttribute('numFmtId', (int)$pStyle->getNumberFormat()->getBuiltInFormatCode());\n        }\n\n        $objWriter->writeAttribute('fillId', (int)$this->getParentWriter()->getFillHashTable()->getIndexForHashCode($pStyle->getFill()->getHashCode()));\n        $objWriter->writeAttribute('borderId', (int)$this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($pStyle->getBorders()->getHashCode()));\n\n        // Apply styles?\n        $objWriter->writeAttribute('applyFont', ($pPHPExcel->getDefaultStyle()->getFont()->getHashCode() != $pStyle->getFont()->getHashCode()) ? '1' : '0');\n        $objWriter->writeAttribute('applyNumberFormat', ($pPHPExcel->getDefaultStyle()->getNumberFormat()->getHashCode() != $pStyle->getNumberFormat()->getHashCode()) ? '1' : '0');\n        $objWriter->writeAttribute('applyFill', ($pPHPExcel->getDefaultStyle()->getFill()->getHashCode() != $pStyle->getFill()->getHashCode()) ? '1' : '0');\n        $objWriter->writeAttribute('applyBorder', ($pPHPExcel->getDefaultStyle()->getBorders()->getHashCode() != $pStyle->getBorders()->getHashCode()) ? '1' : '0');\n        $objWriter->writeAttribute('applyAlignment', ($pPHPExcel->getDefaultStyle()->getAlignment()->getHashCode() != $pStyle->getAlignment()->getHashCode()) ? '1' : '0');\n        if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {\n            $objWriter->writeAttribute('applyProtection', 'true');\n        }\n\n        // alignment\n        $objWriter->startElement('alignment');\n        $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal());\n        $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical());\n\n        $textRotation = 0;\n        if ($pStyle->getAlignment()->getTextRotation() >= 0) {\n            $textRotation = $pStyle->getAlignment()->getTextRotation();\n        } elseif ($pStyle->getAlignment()->getTextRotation() < 0) {\n            $textRotation = 90 - $pStyle->getAlignment()->getTextRotation();\n        }\n        $objWriter->writeAttribute('textRotation', $textRotation);\n\n        $objWriter->writeAttribute('wrapText', ($pStyle->getAlignment()->getWrapText() ? 'true' : 'false'));\n        $objWriter->writeAttribute('shrinkToFit', ($pStyle->getAlignment()->getShrinkToFit() ? 'true' : 'false'));\n\n        if ($pStyle->getAlignment()->getIndent() > 0) {\n            $objWriter->writeAttribute('indent', $pStyle->getAlignment()->getIndent());\n        }\n        if ($pStyle->getAlignment()->getReadorder() > 0) {\n            $objWriter->writeAttribute('readingOrder', $pStyle->getAlignment()->getReadorder());\n        }\n        $objWriter->endElement();\n\n        // protection\n        if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {\n            $objWriter->startElement('protection');\n            if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {\n                $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));\n            }\n            if ($pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {\n                $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));\n            }\n            $objWriter->endElement();\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Cell Style Dxf\n     *\n     * @param     PHPExcel_Shared_XMLWriter         $objWriter         XML Writer\n     * @param     PHPExcel_Style                    $pStyle            Style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeCellStyleDxf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null)\n    {\n        // dxf\n        $objWriter->startElement('dxf');\n\n        // font\n        $this->writeFont($objWriter, $pStyle->getFont());\n\n        // numFmt\n        $this->writeNumFmt($objWriter, $pStyle->getNumberFormat());\n\n        // fill\n        $this->writeFill($objWriter, $pStyle->getFill());\n\n        // alignment\n        $objWriter->startElement('alignment');\n        if ($pStyle->getAlignment()->getHorizontal() !== null) {\n            $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal());\n        }\n        if ($pStyle->getAlignment()->getVertical() !== null) {\n            $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical());\n        }\n\n        if ($pStyle->getAlignment()->getTextRotation() !== null) {\n            $textRotation = 0;\n            if ($pStyle->getAlignment()->getTextRotation() >= 0) {\n                $textRotation = $pStyle->getAlignment()->getTextRotation();\n            } elseif ($pStyle->getAlignment()->getTextRotation() < 0) {\n                $textRotation = 90 - $pStyle->getAlignment()->getTextRotation();\n            }\n            $objWriter->writeAttribute('textRotation', $textRotation);\n        }\n        $objWriter->endElement();\n\n        // border\n        $this->writeBorder($objWriter, $pStyle->getBorders());\n\n        // protection\n        if (($pStyle->getProtection()->getLocked() !== null) || ($pStyle->getProtection()->getHidden() !== null)) {\n            if ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT ||\n                $pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT) {\n                $objWriter->startElement('protection');\n                if (($pStyle->getProtection()->getLocked() !== null) &&\n                    ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) {\n                    $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));\n                }\n                if (($pStyle->getProtection()->getHidden() !== null) &&\n                    ($pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) {\n                    $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));\n                }\n                $objWriter->endElement();\n            }\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write BorderPr\n     *\n     * @param     PHPExcel_Shared_XMLWriter        $objWriter         XML Writer\n     * @param     string                            $pName            Element name\n     * @param     PHPExcel_Style_Border            $pBorder        Border style\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeBorderPr(PHPExcel_Shared_XMLWriter $objWriter = null, $pName = 'left', PHPExcel_Style_Border $pBorder = null)\n    {\n        // Write BorderPr\n        if ($pBorder->getBorderStyle() != PHPExcel_Style_Border::BORDER_NONE) {\n            $objWriter->startElement($pName);\n            $objWriter->writeAttribute('style', $pBorder->getBorderStyle());\n\n            // color\n            $objWriter->startElement('color');\n            $objWriter->writeAttribute('rgb', $pBorder->getColor()->getARGB());\n            $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write NumberFormat\n     *\n     * @param     PHPExcel_Shared_XMLWriter            $objWriter         XML Writer\n     * @param     PHPExcel_Style_NumberFormat            $pNumberFormat    Number Format\n     * @param     int                                    $pId            Number Format identifier\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeNumFmt(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_NumberFormat $pNumberFormat = null, $pId = 0)\n    {\n        // Translate formatcode\n        $formatCode = $pNumberFormat->getFormatCode();\n\n        // numFmt\n        if ($formatCode !== null) {\n            $objWriter->startElement('numFmt');\n            $objWriter->writeAttribute('numFmtId', ($pId + 164));\n            $objWriter->writeAttribute('formatCode', $formatCode);\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Get an array of all styles\n     *\n     * @param     PHPExcel                $pPHPExcel\n     * @return     PHPExcel_Style[]        All styles in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allStyles(PHPExcel $pPHPExcel = null)\n    {\n        return $pPHPExcel->getCellXfCollection();\n    }\n\n    /**\n     * Get an array of all conditional styles\n     *\n     * @param     PHPExcel                            $pPHPExcel\n     * @return     PHPExcel_Style_Conditional[]        All conditional styles in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allConditionalStyles(PHPExcel $pPHPExcel = null)\n    {\n        // Get an array of all styles\n        $aStyles = array();\n\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            foreach ($pPHPExcel->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) {\n                foreach ($conditionalStyles as $conditionalStyle) {\n                    $aStyles[] = $conditionalStyle;\n                }\n            }\n        }\n\n        return $aStyles;\n    }\n\n    /**\n     * Get an array of all fills\n     *\n     * @param     PHPExcel                        $pPHPExcel\n     * @return     PHPExcel_Style_Fill[]        All fills in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allFills(PHPExcel $pPHPExcel = null)\n    {\n        // Get an array of unique fills\n        $aFills = array();\n\n        // Two first fills are predefined\n        $fill0 = new PHPExcel_Style_Fill();\n        $fill0->setFillType(PHPExcel_Style_Fill::FILL_NONE);\n        $aFills[] = $fill0;\n\n        $fill1 = new PHPExcel_Style_Fill();\n        $fill1->setFillType(PHPExcel_Style_Fill::FILL_PATTERN_GRAY125);\n        $aFills[] = $fill1;\n        // The remaining fills\n        $aStyles = $this->allStyles($pPHPExcel);\n        foreach ($aStyles as $style) {\n            if (!array_key_exists($style->getFill()->getHashCode(), $aFills)) {\n                $aFills[ $style->getFill()->getHashCode() ] = $style->getFill();\n            }\n        }\n\n        return $aFills;\n    }\n\n    /**\n     * Get an array of all fonts\n     *\n     * @param     PHPExcel                        $pPHPExcel\n     * @return     PHPExcel_Style_Font[]        All fonts in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allFonts(PHPExcel $pPHPExcel = null)\n    {\n        // Get an array of unique fonts\n        $aFonts = array();\n        $aStyles = $this->allStyles($pPHPExcel);\n\n        foreach ($aStyles as $style) {\n            if (!array_key_exists($style->getFont()->getHashCode(), $aFonts)) {\n                $aFonts[ $style->getFont()->getHashCode() ] = $style->getFont();\n            }\n        }\n\n        return $aFonts;\n    }\n\n    /**\n     * Get an array of all borders\n     *\n     * @param     PHPExcel                        $pPHPExcel\n     * @return     PHPExcel_Style_Borders[]        All borders in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allBorders(PHPExcel $pPHPExcel = null)\n    {\n        // Get an array of unique borders\n        $aBorders = array();\n        $aStyles = $this->allStyles($pPHPExcel);\n\n        foreach ($aStyles as $style) {\n            if (!array_key_exists($style->getBorders()->getHashCode(), $aBorders)) {\n                $aBorders[ $style->getBorders()->getHashCode() ] = $style->getBorders();\n            }\n        }\n\n        return $aBorders;\n    }\n\n    /**\n     * Get an array of all number formats\n     *\n     * @param     PHPExcel                                $pPHPExcel\n     * @return     PHPExcel_Style_NumberFormat[]        All number formats in PHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function allNumberFormats(PHPExcel $pPHPExcel = null)\n    {\n        // Get an array of unique number formats\n        $aNumFmts = array();\n        $aStyles = $this->allStyles($pPHPExcel);\n\n        foreach ($aStyles as $style) {\n            if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !array_key_exists($style->getNumberFormat()->getHashCode(), $aNumFmts)) {\n                $aNumFmts[ $style->getNumberFormat()->getHashCode() ] = $style->getNumberFormat();\n            }\n        }\n\n        return $aNumFmts;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Writer_Excel2007_Theme\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Writer_Excel2007_Theme extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Map of Major fonts to write\n     * @static    array of string\n     *\n     */\n    private static $majorFonts = array(\n        'Jpan' => 'ＭＳ Ｐゴシック',\n        'Hang' => '맑은 고딕',\n        'Hans' => '宋体',\n        'Hant' => '新細明體',\n        'Arab' => 'Times New Roman',\n        'Hebr' => 'Times New Roman',\n        'Thai' => 'Tahoma',\n        'Ethi' => 'Nyala',\n        'Beng' => 'Vrinda',\n        'Gujr' => 'Shruti',\n        'Khmr' => 'MoolBoran',\n        'Knda' => 'Tunga',\n        'Guru' => 'Raavi',\n        'Cans' => 'Euphemia',\n        'Cher' => 'Plantagenet Cherokee',\n        'Yiii' => 'Microsoft Yi Baiti',\n        'Tibt' => 'Microsoft Himalaya',\n        'Thaa' => 'MV Boli',\n        'Deva' => 'Mangal',\n        'Telu' => 'Gautami',\n        'Taml' => 'Latha',\n        'Syrc' => 'Estrangelo Edessa',\n        'Orya' => 'Kalinga',\n        'Mlym' => 'Kartika',\n        'Laoo' => 'DokChampa',\n        'Sinh' => 'Iskoola Pota',\n        'Mong' => 'Mongolian Baiti',\n        'Viet' => 'Times New Roman',\n        'Uigh' => 'Microsoft Uighur',\n        'Geor' => 'Sylfaen',\n    );\n\n    /**\n     * Map of Minor fonts to write\n     * @static    array of string\n     *\n     */\n    private static $minorFonts = array(\n        'Jpan' => 'ＭＳ Ｐゴシック',\n        'Hang' => '맑은 고딕',\n        'Hans' => '宋体',\n        'Hant' => '新細明體',\n        'Arab' => 'Arial',\n        'Hebr' => 'Arial',\n        'Thai' => 'Tahoma',\n        'Ethi' => 'Nyala',\n        'Beng' => 'Vrinda',\n        'Gujr' => 'Shruti',\n        'Khmr' => 'DaunPenh',\n        'Knda' => 'Tunga',\n        'Guru' => 'Raavi',\n        'Cans' => 'Euphemia',\n        'Cher' => 'Plantagenet Cherokee',\n        'Yiii' => 'Microsoft Yi Baiti',\n        'Tibt' => 'Microsoft Himalaya',\n        'Thaa' => 'MV Boli',\n        'Deva' => 'Mangal',\n        'Telu' => 'Gautami',\n        'Taml' => 'Latha',\n        'Syrc' => 'Estrangelo Edessa',\n        'Orya' => 'Kalinga',\n        'Mlym' => 'Kartika',\n        'Laoo' => 'DokChampa',\n        'Sinh' => 'Iskoola Pota',\n        'Mong' => 'Mongolian Baiti',\n        'Viet' => 'Arial',\n        'Uigh' => 'Microsoft Uighur',\n        'Geor' => 'Sylfaen',\n    );\n\n    /**\n     * Map of core colours\n     * @static    array of string\n     *\n     */\n    private static $colourScheme = array(\n        'dk2'        => '1F497D',\n        'lt2'        => 'EEECE1',\n        'accent1'    => '4F81BD',\n        'accent2'    => 'C0504D',\n        'accent3'    => '9BBB59',\n        'accent4'    => '8064A2',\n        'accent5'    => '4BACC6',\n        'accent6'    => 'F79646',\n        'hlink'        => '0000FF',\n        'folHlink'    => '800080',\n    );\n            \n    /**\n     * Write theme to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeTheme(PHPExcel $pPHPExcel = null)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // a:theme\n        $objWriter->startElement('a:theme');\n        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');\n        $objWriter->writeAttribute('name', 'Office Theme');\n\n            // a:themeElements\n            $objWriter->startElement('a:themeElements');\n\n                // a:clrScheme\n                $objWriter->startElement('a:clrScheme');\n                $objWriter->writeAttribute('name', 'Office');\n\n                    // a:dk1\n                    $objWriter->startElement('a:dk1');\n\n                        // a:sysClr\n                        $objWriter->startElement('a:sysClr');\n                        $objWriter->writeAttribute('val', 'windowText');\n                        $objWriter->writeAttribute('lastClr', '000000');\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                    // a:lt1\n                    $objWriter->startElement('a:lt1');\n\n                        // a:sysClr\n                        $objWriter->startElement('a:sysClr');\n                        $objWriter->writeAttribute('val', 'window');\n                        $objWriter->writeAttribute('lastClr', 'FFFFFF');\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                    // a:dk2\n                    $this->writeColourScheme($objWriter);\n\n                $objWriter->endElement();\n\n                // a:fontScheme\n                $objWriter->startElement('a:fontScheme');\n                $objWriter->writeAttribute('name', 'Office');\n\n                    // a:majorFont\n                    $objWriter->startElement('a:majorFont');\n                        $this->writeFonts($objWriter, 'Cambria', self::$majorFonts);\n                    $objWriter->endElement();\n\n                    // a:minorFont\n                    $objWriter->startElement('a:minorFont');\n                        $this->writeFonts($objWriter, 'Calibri', self::$minorFonts);\n                    $objWriter->endElement();\n\n                $objWriter->endElement();\n\n                // a:fmtScheme\n                $objWriter->startElement('a:fmtScheme');\n                $objWriter->writeAttribute('name', 'Office');\n\n                    // a:fillStyleLst\n                    $objWriter->startElement('a:fillStyleLst');\n\n                        // a:solidFill\n                        $objWriter->startElement('a:solidFill');\n\n                            // a:schemeClr\n                            $objWriter->startElement('a:schemeClr');\n                            $objWriter->writeAttribute('val', 'phClr');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:gradFill\n                        $objWriter->startElement('a:gradFill');\n                        $objWriter->writeAttribute('rotWithShape', '1');\n\n                            // a:gsLst\n                            $objWriter->startElement('a:gsLst');\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '0');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:tint\n                                        $objWriter->startElement('a:tint');\n                                        $objWriter->writeAttribute('val', '50000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '300000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '35000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:tint\n                                        $objWriter->startElement('a:tint');\n                                        $objWriter->writeAttribute('val', '37000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '300000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '100000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:tint\n                                        $objWriter->startElement('a:tint');\n                                        $objWriter->writeAttribute('val', '15000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '350000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:lin\n                            $objWriter->startElement('a:lin');\n                            $objWriter->writeAttribute('ang', '16200000');\n                            $objWriter->writeAttribute('scaled', '1');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:gradFill\n                        $objWriter->startElement('a:gradFill');\n                        $objWriter->writeAttribute('rotWithShape', '1');\n\n                            // a:gsLst\n                            $objWriter->startElement('a:gsLst');\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '0');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '51000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '130000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '80000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '93000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '130000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '100000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '94000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '135000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:lin\n                            $objWriter->startElement('a:lin');\n                            $objWriter->writeAttribute('ang', '16200000');\n                            $objWriter->writeAttribute('scaled', '0');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                    // a:lnStyleLst\n                    $objWriter->startElement('a:lnStyleLst');\n\n                        // a:ln\n                        $objWriter->startElement('a:ln');\n                        $objWriter->writeAttribute('w', '9525');\n                        $objWriter->writeAttribute('cap', 'flat');\n                        $objWriter->writeAttribute('cmpd', 'sng');\n                        $objWriter->writeAttribute('algn', 'ctr');\n\n                            // a:solidFill\n                            $objWriter->startElement('a:solidFill');\n\n                                // a:schemeClr\n                                $objWriter->startElement('a:schemeClr');\n                                $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '95000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '105000');\n                                        $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:prstDash\n                            $objWriter->startElement('a:prstDash');\n                            $objWriter->writeAttribute('val', 'solid');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:ln\n                        $objWriter->startElement('a:ln');\n                        $objWriter->writeAttribute('w', '25400');\n                        $objWriter->writeAttribute('cap', 'flat');\n                        $objWriter->writeAttribute('cmpd', 'sng');\n                        $objWriter->writeAttribute('algn', 'ctr');\n\n                            // a:solidFill\n                            $objWriter->startElement('a:solidFill');\n\n                                // a:schemeClr\n                                $objWriter->startElement('a:schemeClr');\n                                $objWriter->writeAttribute('val', 'phClr');\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:prstDash\n                            $objWriter->startElement('a:prstDash');\n                            $objWriter->writeAttribute('val', 'solid');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:ln\n                        $objWriter->startElement('a:ln');\n                        $objWriter->writeAttribute('w', '38100');\n                        $objWriter->writeAttribute('cap', 'flat');\n                        $objWriter->writeAttribute('cmpd', 'sng');\n                        $objWriter->writeAttribute('algn', 'ctr');\n\n                            // a:solidFill\n                            $objWriter->startElement('a:solidFill');\n\n                                // a:schemeClr\n                                $objWriter->startElement('a:schemeClr');\n                                $objWriter->writeAttribute('val', 'phClr');\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:prstDash\n                            $objWriter->startElement('a:prstDash');\n                            $objWriter->writeAttribute('val', 'solid');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n\n\n                    // a:effectStyleLst\n                    $objWriter->startElement('a:effectStyleLst');\n\n                        // a:effectStyle\n                        $objWriter->startElement('a:effectStyle');\n\n                            // a:effectLst\n                            $objWriter->startElement('a:effectLst');\n\n                                // a:outerShdw\n                                $objWriter->startElement('a:outerShdw');\n                                $objWriter->writeAttribute('blurRad', '40000');\n                                $objWriter->writeAttribute('dist', '20000');\n                                $objWriter->writeAttribute('dir', '5400000');\n                                $objWriter->writeAttribute('rotWithShape', '0');\n\n                                    // a:srgbClr\n                                    $objWriter->startElement('a:srgbClr');\n                                    $objWriter->writeAttribute('val', '000000');\n\n                                        // a:alpha\n                                        $objWriter->startElement('a:alpha');\n                                        $objWriter->writeAttribute('val', '38000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:effectStyle\n                        $objWriter->startElement('a:effectStyle');\n\n                            // a:effectLst\n                            $objWriter->startElement('a:effectLst');\n\n                                // a:outerShdw\n                                $objWriter->startElement('a:outerShdw');\n                                $objWriter->writeAttribute('blurRad', '40000');\n                                $objWriter->writeAttribute('dist', '23000');\n                                $objWriter->writeAttribute('dir', '5400000');\n                                $objWriter->writeAttribute('rotWithShape', '0');\n\n                                    // a:srgbClr\n                                    $objWriter->startElement('a:srgbClr');\n                                    $objWriter->writeAttribute('val', '000000');\n\n                                        // a:alpha\n                                        $objWriter->startElement('a:alpha');\n                                        $objWriter->writeAttribute('val', '35000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:effectStyle\n                        $objWriter->startElement('a:effectStyle');\n\n                            // a:effectLst\n                            $objWriter->startElement('a:effectLst');\n\n                                // a:outerShdw\n                                $objWriter->startElement('a:outerShdw');\n                                $objWriter->writeAttribute('blurRad', '40000');\n                                $objWriter->writeAttribute('dist', '23000');\n                                $objWriter->writeAttribute('dir', '5400000');\n                                $objWriter->writeAttribute('rotWithShape', '0');\n\n                                    // a:srgbClr\n                                    $objWriter->startElement('a:srgbClr');\n                                    $objWriter->writeAttribute('val', '000000');\n\n                                        // a:alpha\n                                        $objWriter->startElement('a:alpha');\n                                        $objWriter->writeAttribute('val', '35000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:scene3d\n                            $objWriter->startElement('a:scene3d');\n\n                                // a:camera\n                                $objWriter->startElement('a:camera');\n                                $objWriter->writeAttribute('prst', 'orthographicFront');\n\n                                    // a:rot\n                                    $objWriter->startElement('a:rot');\n                                    $objWriter->writeAttribute('lat', '0');\n                                    $objWriter->writeAttribute('lon', '0');\n                                    $objWriter->writeAttribute('rev', '0');\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:lightRig\n                                $objWriter->startElement('a:lightRig');\n                                $objWriter->writeAttribute('rig', 'threePt');\n                                $objWriter->writeAttribute('dir', 't');\n\n                                    // a:rot\n                                    $objWriter->startElement('a:rot');\n                                    $objWriter->writeAttribute('lat', '0');\n                                    $objWriter->writeAttribute('lon', '0');\n                                    $objWriter->writeAttribute('rev', '1200000');\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:sp3d\n                            $objWriter->startElement('a:sp3d');\n\n                                // a:bevelT\n                                $objWriter->startElement('a:bevelT');\n                                $objWriter->writeAttribute('w', '63500');\n                                $objWriter->writeAttribute('h', '25400');\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                    // a:bgFillStyleLst\n                    $objWriter->startElement('a:bgFillStyleLst');\n\n                        // a:solidFill\n                        $objWriter->startElement('a:solidFill');\n\n                            // a:schemeClr\n                            $objWriter->startElement('a:schemeClr');\n                            $objWriter->writeAttribute('val', 'phClr');\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:gradFill\n                        $objWriter->startElement('a:gradFill');\n                        $objWriter->writeAttribute('rotWithShape', '1');\n\n                            // a:gsLst\n                            $objWriter->startElement('a:gsLst');\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '0');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:tint\n                                        $objWriter->startElement('a:tint');\n                                        $objWriter->writeAttribute('val', '40000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '350000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '40000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:tint\n                                        $objWriter->startElement('a:tint');\n                                        $objWriter->writeAttribute('val', '45000');\n                                        $objWriter->endElement();\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '99000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '350000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '100000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '20000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '255000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:path\n                            $objWriter->startElement('a:path');\n                            $objWriter->writeAttribute('path', 'circle');\n\n                                // a:fillToRect\n                                $objWriter->startElement('a:fillToRect');\n                                $objWriter->writeAttribute('l', '50000');\n                                $objWriter->writeAttribute('t', '-80000');\n                                $objWriter->writeAttribute('r', '50000');\n                                $objWriter->writeAttribute('b', '180000');\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                        // a:gradFill\n                        $objWriter->startElement('a:gradFill');\n                        $objWriter->writeAttribute('rotWithShape', '1');\n\n                            // a:gsLst\n                            $objWriter->startElement('a:gsLst');\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '0');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:tint\n                                        $objWriter->startElement('a:tint');\n                                        $objWriter->writeAttribute('val', '80000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '300000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                                // a:gs\n                                $objWriter->startElement('a:gs');\n                                $objWriter->writeAttribute('pos', '100000');\n\n                                    // a:schemeClr\n                                    $objWriter->startElement('a:schemeClr');\n                                    $objWriter->writeAttribute('val', 'phClr');\n\n                                        // a:shade\n                                        $objWriter->startElement('a:shade');\n                                        $objWriter->writeAttribute('val', '30000');\n                                        $objWriter->endElement();\n\n                                        // a:satMod\n                                        $objWriter->startElement('a:satMod');\n                                        $objWriter->writeAttribute('val', '200000');\n                                        $objWriter->endElement();\n\n                                    $objWriter->endElement();\n\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                            // a:path\n                            $objWriter->startElement('a:path');\n                            $objWriter->writeAttribute('path', 'circle');\n\n                                // a:fillToRect\n                                $objWriter->startElement('a:fillToRect');\n                                $objWriter->writeAttribute('l', '50000');\n                                $objWriter->writeAttribute('t', '50000');\n                                $objWriter->writeAttribute('r', '50000');\n                                $objWriter->writeAttribute('b', '50000');\n                                $objWriter->endElement();\n\n                            $objWriter->endElement();\n\n                        $objWriter->endElement();\n\n                    $objWriter->endElement();\n\n                $objWriter->endElement();\n\n            $objWriter->endElement();\n\n            // a:objectDefaults\n            $objWriter->writeElement('a:objectDefaults', null);\n\n            // a:extraClrSchemeLst\n            $objWriter->writeElement('a:extraClrSchemeLst', null);\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write fonts to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter\n     * @param     string                        $latinFont\n     * @param     array of string                $fontSet\n     * @return     string                         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeFonts($objWriter, $latinFont, $fontSet)\n    {\n        // a:latin\n        $objWriter->startElement('a:latin');\n        $objWriter->writeAttribute('typeface', $latinFont);\n        $objWriter->endElement();\n\n        // a:ea\n        $objWriter->startElement('a:ea');\n        $objWriter->writeAttribute('typeface', '');\n        $objWriter->endElement();\n\n        // a:cs\n        $objWriter->startElement('a:cs');\n        $objWriter->writeAttribute('typeface', '');\n        $objWriter->endElement();\n\n        foreach ($fontSet as $fontScript => $typeface) {\n            $objWriter->startElement('a:font');\n                $objWriter->writeAttribute('script', $fontScript);\n                $objWriter->writeAttribute('typeface', $typeface);\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write colour scheme to XML format\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter\n     * @return     string                         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeColourScheme($objWriter)\n    {\n        foreach (self::$colourScheme as $colourName => $colourValue) {\n            $objWriter->startElement('a:'.$colourName);\n\n                $objWriter->startElement('a:srgbClr');\n                    $objWriter->writeAttribute('val', $colourValue);\n                $objWriter->endElement();\n\n            $objWriter->endElement();\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_Workbook\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007_Workbook extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write workbook to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @param    boolean        $recalcRequired    Indicate whether formulas should be recalculated before writing\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeWorkbook(PHPExcel $pPHPExcel = null, $recalcRequired = false)\n    {\n        // Create XML writer\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n        // workbook\n        $objWriter->startElement('workbook');\n        $objWriter->writeAttribute('xml:space', 'preserve');\n        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');\n        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');\n\n        // fileVersion\n        $this->writeFileVersion($objWriter);\n\n        // workbookPr\n        $this->writeWorkbookPr($objWriter);\n\n        // workbookProtection\n        $this->writeWorkbookProtection($objWriter, $pPHPExcel);\n\n        // bookViews\n        if ($this->getParentWriter()->getOffice2003Compatibility() === false) {\n            $this->writeBookViews($objWriter, $pPHPExcel);\n        }\n\n        // sheets\n        $this->writeSheets($objWriter, $pPHPExcel);\n\n        // definedNames\n        $this->writeDefinedNames($objWriter, $pPHPExcel);\n\n        // calcPr\n        $this->writeCalcPr($objWriter, $recalcRequired);\n\n        $objWriter->endElement();\n\n        // Return\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write file version\n     *\n     * @param     PHPExcel_Shared_XMLWriter $objWriter         XML Writer\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeFileVersion(PHPExcel_Shared_XMLWriter $objWriter = null)\n    {\n        $objWriter->startElement('fileVersion');\n        $objWriter->writeAttribute('appName', 'xl');\n        $objWriter->writeAttribute('lastEdited', '4');\n        $objWriter->writeAttribute('lowestEdited', '4');\n        $objWriter->writeAttribute('rupBuild', '4505');\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write WorkbookPr\n     *\n     * @param     PHPExcel_Shared_XMLWriter $objWriter         XML Writer\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeWorkbookPr(PHPExcel_Shared_XMLWriter $objWriter = null)\n    {\n        $objWriter->startElement('workbookPr');\n\n        if (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904) {\n            $objWriter->writeAttribute('date1904', '1');\n        }\n\n        $objWriter->writeAttribute('codeName', 'ThisWorkbook');\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write BookViews\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     PHPExcel                    $pPHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeBookViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)\n    {\n        // bookViews\n        $objWriter->startElement('bookViews');\n\n        // workbookView\n        $objWriter->startElement('workbookView');\n\n        $objWriter->writeAttribute('activeTab', $pPHPExcel->getActiveSheetIndex());\n        $objWriter->writeAttribute('autoFilterDateGrouping', '1');\n        $objWriter->writeAttribute('firstSheet', '0');\n        $objWriter->writeAttribute('minimized', '0');\n        $objWriter->writeAttribute('showHorizontalScroll', '1');\n        $objWriter->writeAttribute('showSheetTabs', '1');\n        $objWriter->writeAttribute('showVerticalScroll', '1');\n        $objWriter->writeAttribute('tabRatio', '600');\n        $objWriter->writeAttribute('visibility', 'visible');\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write WorkbookProtection\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     PHPExcel                    $pPHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeWorkbookProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)\n    {\n        if ($pPHPExcel->getSecurity()->isSecurityEnabled()) {\n            $objWriter->startElement('workbookProtection');\n            $objWriter->writeAttribute('lockRevision', ($pPHPExcel->getSecurity()->getLockRevision() ? 'true' : 'false'));\n            $objWriter->writeAttribute('lockStructure', ($pPHPExcel->getSecurity()->getLockStructure() ? 'true' : 'false'));\n            $objWriter->writeAttribute('lockWindows', ($pPHPExcel->getSecurity()->getLockWindows() ? 'true' : 'false'));\n\n            if ($pPHPExcel->getSecurity()->getRevisionsPassword() != '') {\n                $objWriter->writeAttribute('revisionsPassword', $pPHPExcel->getSecurity()->getRevisionsPassword());\n            }\n\n            if ($pPHPExcel->getSecurity()->getWorkbookPassword() != '') {\n                $objWriter->writeAttribute('workbookPassword', $pPHPExcel->getSecurity()->getWorkbookPassword());\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write calcPr\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter        XML Writer\n     * @param    boolean                        $recalcRequired    Indicate whether formulas should be recalculated before writing\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeCalcPr(PHPExcel_Shared_XMLWriter $objWriter = null, $recalcRequired = true)\n    {\n        $objWriter->startElement('calcPr');\n\n        //    Set the calcid to a higher value than Excel itself will use, otherwise Excel will always recalc\n        //  If MS Excel does do a recalc, then users opening a file in MS Excel will be prompted to save on exit\n        //     because the file has changed\n        $objWriter->writeAttribute('calcId', '999999');\n        $objWriter->writeAttribute('calcMode', 'auto');\n        //    fullCalcOnLoad isn't needed if we've recalculating for the save\n        $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? 1 : 0);\n        $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? 0 : 1);\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write sheets\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     PHPExcel                    $pPHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeSheets(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)\n    {\n        // Write sheets\n        $objWriter->startElement('sheets');\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            // sheet\n            $this->writeSheet(\n                $objWriter,\n                $pPHPExcel->getSheet($i)->getTitle(),\n                ($i + 1),\n                ($i + 1 + 3),\n                $pPHPExcel->getSheet($i)->getSheetState()\n            );\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write sheet\n     *\n     * @param     PHPExcel_Shared_XMLWriter     $objWriter         XML Writer\n     * @param     string                         $pSheetname         Sheet name\n     * @param     int                            $pSheetId             Sheet id\n     * @param     int                            $pRelId                Relationship ID\n     * @param   string                      $sheetState         Sheet state (visible, hidden, veryHidden)\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeSheet(PHPExcel_Shared_XMLWriter $objWriter = null, $pSheetname = '', $pSheetId = 1, $pRelId = 1, $sheetState = 'visible')\n    {\n        if ($pSheetname != '') {\n            // Write sheet\n            $objWriter->startElement('sheet');\n            $objWriter->writeAttribute('name', $pSheetname);\n            $objWriter->writeAttribute('sheetId', $pSheetId);\n            if ($sheetState != 'visible' && $sheetState != '') {\n                $objWriter->writeAttribute('state', $sheetState);\n            }\n            $objWriter->writeAttribute('r:id', 'rId' . $pRelId);\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Write Defined Names\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel                    $pPHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeDefinedNames(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)\n    {\n        // Write defined names\n        $objWriter->startElement('definedNames');\n\n        // Named ranges\n        if (count($pPHPExcel->getNamedRanges()) > 0) {\n            // Named ranges\n            $this->writeNamedRanges($objWriter, $pPHPExcel);\n        }\n\n        // Other defined names\n        $sheetCount = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheetCount; ++$i) {\n            // definedName for autoFilter\n            $this->writeDefinedNameForAutofilter($objWriter, $pPHPExcel->getSheet($i), $i);\n\n            // definedName for Print_Titles\n            $this->writeDefinedNameForPrintTitles($objWriter, $pPHPExcel->getSheet($i), $i);\n\n            // definedName for Print_Area\n            $this->writeDefinedNameForPrintArea($objWriter, $pPHPExcel->getSheet($i), $i);\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write named ranges\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel                    $pPHPExcel\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeNamedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel)\n    {\n        // Loop named ranges\n        $namedRanges = $pPHPExcel->getNamedRanges();\n        foreach ($namedRanges as $namedRange) {\n            $this->writeDefinedNameForNamedRange($objWriter, $namedRange);\n        }\n    }\n\n    /**\n     * Write Defined Name for named range\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel_NamedRange            $pNamedRange\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeDefinedNameForNamedRange(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_NamedRange $pNamedRange)\n    {\n        // definedName for named range\n        $objWriter->startElement('definedName');\n        $objWriter->writeAttribute('name', $pNamedRange->getName());\n        if ($pNamedRange->getLocalOnly()) {\n            $objWriter->writeAttribute('localSheetId', $pNamedRange->getScope()->getParent()->getIndex($pNamedRange->getScope()));\n        }\n\n        // Create absolute coordinate and write as raw text\n        $range = PHPExcel_Cell::splitRange($pNamedRange->getRange());\n        for ($i = 0; $i < count($range); $i++) {\n            $range[$i][0] = '\\'' . str_replace(\"'\", \"''\", $pNamedRange->getWorksheet()->getTitle()) . '\\'!' . PHPExcel_Cell::absoluteReference($range[$i][0]);\n            if (isset($range[$i][1])) {\n                $range[$i][1] = PHPExcel_Cell::absoluteReference($range[$i][1]);\n            }\n        }\n        $range = PHPExcel_Cell::buildRange($range);\n\n        $objWriter->writeRawData($range);\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Defined Name for autoFilter\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel_Worksheet            $pSheet\n     * @param     int                            $pSheetId\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeDefinedNameForAutofilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0)\n    {\n        // definedName for autoFilter\n        $autoFilterRange = $pSheet->getAutoFilter()->getRange();\n        if (!empty($autoFilterRange)) {\n            $objWriter->startElement('definedName');\n            $objWriter->writeAttribute('name', '_xlnm._FilterDatabase');\n            $objWriter->writeAttribute('localSheetId', $pSheetId);\n            $objWriter->writeAttribute('hidden', '1');\n\n            // Create absolute coordinate and write as raw text\n            $range = PHPExcel_Cell::splitRange($autoFilterRange);\n            $range = $range[0];\n            //    Strip any worksheet ref so we can make the cell ref absolute\n            if (strpos($range[0], '!') !== false) {\n                list($ws, $range[0]) = explode('!', $range[0]);\n            }\n\n            $range[0] = PHPExcel_Cell::absoluteCoordinate($range[0]);\n            $range[1] = PHPExcel_Cell::absoluteCoordinate($range[1]);\n            $range = implode(':', $range);\n\n            $objWriter->writeRawData('\\'' . str_replace(\"'\", \"''\", $pSheet->getTitle()) . '\\'!' . $range);\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write Defined Name for PrintTitles\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel_Worksheet            $pSheet\n     * @param     int                            $pSheetId\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeDefinedNameForPrintTitles(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0)\n    {\n        // definedName for PrintTitles\n        if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet() || $pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) {\n            $objWriter->startElement('definedName');\n            $objWriter->writeAttribute('name', '_xlnm.Print_Titles');\n            $objWriter->writeAttribute('localSheetId', $pSheetId);\n\n            // Setting string\n            $settingString = '';\n\n            // Columns to repeat\n            if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) {\n                $repeat = $pSheet->getPageSetup()->getColumnsToRepeatAtLeft();\n\n                $settingString .= '\\'' . str_replace(\"'\", \"''\", $pSheet->getTitle()) . '\\'!$' . $repeat[0] . ':$' . $repeat[1];\n            }\n\n            // Rows to repeat\n            if ($pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) {\n                if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) {\n                    $settingString .= ',';\n                }\n\n                $repeat = $pSheet->getPageSetup()->getRowsToRepeatAtTop();\n\n                $settingString .= '\\'' . str_replace(\"'\", \"''\", $pSheet->getTitle()) . '\\'!$' . $repeat[0] . ':$' . $repeat[1];\n            }\n\n            $objWriter->writeRawData($settingString);\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write Defined Name for PrintTitles\n     *\n     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer\n     * @param     PHPExcel_Worksheet            $pSheet\n     * @param     int                            $pSheetId\n     * @throws     PHPExcel_Writer_Exception\n     */\n    private function writeDefinedNameForPrintArea(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0)\n    {\n        // definedName for PrintArea\n        if ($pSheet->getPageSetup()->isPrintAreaSet()) {\n            $objWriter->startElement('definedName');\n            $objWriter->writeAttribute('name', '_xlnm.Print_Area');\n            $objWriter->writeAttribute('localSheetId', $pSheetId);\n\n            // Setting string\n            $settingString = '';\n\n            // Print area\n            $printArea = PHPExcel_Cell::splitRange($pSheet->getPageSetup()->getPrintArea());\n\n            $chunks = array();\n            foreach ($printArea as $printAreaRect) {\n                $printAreaRect[0] = PHPExcel_Cell::absoluteReference($printAreaRect[0]);\n                $printAreaRect[1] = PHPExcel_Cell::absoluteReference($printAreaRect[1]);\n                $chunks[] = '\\'' . str_replace(\"'\", \"''\", $pSheet->getTitle()) . '\\'!' . implode(':', $printAreaRect);\n            }\n\n            $objWriter->writeRawData(implode(',', $chunks));\n\n            $objWriter->endElement();\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Writer_Excel2007_Worksheet\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Write worksheet to XML format\n     *\n     * @param    PHPExcel_Worksheet        $pSheet\n     * @param    string[]                $pStringTable\n     * @param    boolean                    $includeCharts    Flag indicating if we should write charts\n     * @return    string                    XML Output\n     * @throws    PHPExcel_Writer_Exception\n     */\n    public function writeWorksheet($pSheet = null, $pStringTable = null, $includeCharts = false)\n    {\n        if (!is_null($pSheet)) {\n            // Create XML writer\n            $objWriter = null;\n            if ($this->getParentWriter()->getUseDiskCaching()) {\n                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n            } else {\n                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n            }\n\n            // XML header\n            $objWriter->startDocument('1.0', 'UTF-8', 'yes');\n\n            // Worksheet\n            $objWriter->startElement('worksheet');\n            $objWriter->writeAttribute('xml:space', 'preserve');\n            $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');\n            $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');\n\n                // sheetPr\n                $this->writeSheetPr($objWriter, $pSheet);\n\n                // Dimension\n                $this->writeDimension($objWriter, $pSheet);\n\n                // sheetViews\n                $this->writeSheetViews($objWriter, $pSheet);\n\n                // sheetFormatPr\n                $this->writeSheetFormatPr($objWriter, $pSheet);\n\n                // cols\n                $this->writeCols($objWriter, $pSheet);\n\n                // sheetData\n                $this->writeSheetData($objWriter, $pSheet, $pStringTable);\n\n                // sheetProtection\n                $this->writeSheetProtection($objWriter, $pSheet);\n\n                // protectedRanges\n                $this->writeProtectedRanges($objWriter, $pSheet);\n\n                // autoFilter\n                $this->writeAutoFilter($objWriter, $pSheet);\n\n                // mergeCells\n                $this->writeMergeCells($objWriter, $pSheet);\n\n                // conditionalFormatting\n                $this->writeConditionalFormatting($objWriter, $pSheet);\n\n                // dataValidations\n                $this->writeDataValidations($objWriter, $pSheet);\n\n                // hyperlinks\n                $this->writeHyperlinks($objWriter, $pSheet);\n\n                // Print options\n                $this->writePrintOptions($objWriter, $pSheet);\n\n                // Page margins\n                $this->writePageMargins($objWriter, $pSheet);\n\n                // Page setup\n                $this->writePageSetup($objWriter, $pSheet);\n\n                // Header / footer\n                $this->writeHeaderFooter($objWriter, $pSheet);\n\n                // Breaks\n                $this->writeBreaks($objWriter, $pSheet);\n\n                // Drawings and/or Charts\n                $this->writeDrawings($objWriter, $pSheet, $includeCharts);\n\n                // LegacyDrawing\n                $this->writeLegacyDrawing($objWriter, $pSheet);\n\n                // LegacyDrawingHF\n                $this->writeLegacyDrawingHF($objWriter, $pSheet);\n\n            $objWriter->endElement();\n\n            // Return\n            return $objWriter->getData();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid PHPExcel_Worksheet object passed.\");\n        }\n    }\n\n    /**\n     * Write SheetPr\n     *\n     * @param    PHPExcel_Shared_XMLWriter        $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeSheetPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // sheetPr\n        $objWriter->startElement('sheetPr');\n        //$objWriter->writeAttribute('codeName',        $pSheet->getTitle());\n        if ($pSheet->getParent()->hasMacros()) {//if the workbook have macros, we need to have codeName for the sheet\n            if ($pSheet->hasCodeName()==false) {\n                $pSheet->setCodeName($pSheet->getTitle());\n            }\n            $objWriter->writeAttribute('codeName', $pSheet->getCodeName());\n        }\n        $autoFilterRange = $pSheet->getAutoFilter()->getRange();\n        if (!empty($autoFilterRange)) {\n            $objWriter->writeAttribute('filterMode', 1);\n            $pSheet->getAutoFilter()->showHideRows();\n        }\n\n        // tabColor\n        if ($pSheet->isTabColorSet()) {\n            $objWriter->startElement('tabColor');\n            $objWriter->writeAttribute('rgb', $pSheet->getTabColor()->getARGB());\n            $objWriter->endElement();\n        }\n\n        // outlinePr\n        $objWriter->startElement('outlinePr');\n        $objWriter->writeAttribute('summaryBelow', ($pSheet->getShowSummaryBelow() ? '1' : '0'));\n        $objWriter->writeAttribute('summaryRight', ($pSheet->getShowSummaryRight() ? '1' : '0'));\n        $objWriter->endElement();\n\n        // pageSetUpPr\n        if ($pSheet->getPageSetup()->getFitToPage()) {\n            $objWriter->startElement('pageSetUpPr');\n            $objWriter->writeAttribute('fitToPage', '1');\n            $objWriter->endElement();\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Dimension\n     *\n     * @param    PHPExcel_Shared_XMLWriter    $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet            $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeDimension(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // dimension\n        $objWriter->startElement('dimension');\n        $objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension());\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write SheetViews\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeSheetViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // sheetViews\n        $objWriter->startElement('sheetViews');\n\n        // Sheet selected?\n        $sheetSelected = false;\n        if ($this->getParentWriter()->getPHPExcel()->getIndex($pSheet) == $this->getParentWriter()->getPHPExcel()->getActiveSheetIndex()) {\n            $sheetSelected = true;\n        }\n\n        // sheetView\n        $objWriter->startElement('sheetView');\n        $objWriter->writeAttribute('tabSelected', $sheetSelected ? '1' : '0');\n        $objWriter->writeAttribute('workbookViewId', '0');\n\n        // Zoom scales\n        if ($pSheet->getSheetView()->getZoomScale() != 100) {\n            $objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale());\n        }\n        if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) {\n            $objWriter->writeAttribute('zoomScaleNormal', $pSheet->getSheetView()->getZoomScaleNormal());\n        }\n\n        // View Layout Type\n        if ($pSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL) {\n            $objWriter->writeAttribute('view', $pSheet->getSheetView()->getView());\n        }\n\n        // Gridlines\n        if ($pSheet->getShowGridlines()) {\n            $objWriter->writeAttribute('showGridLines', 'true');\n        } else {\n            $objWriter->writeAttribute('showGridLines', 'false');\n        }\n\n        // Row and column headers\n        if ($pSheet->getShowRowColHeaders()) {\n            $objWriter->writeAttribute('showRowColHeaders', '1');\n        } else {\n            $objWriter->writeAttribute('showRowColHeaders', '0');\n        }\n\n        // Right-to-left\n        if ($pSheet->getRightToLeft()) {\n            $objWriter->writeAttribute('rightToLeft', 'true');\n        }\n\n        $activeCell = $pSheet->getActiveCell();\n\n        // Pane\n        $pane = '';\n        $topLeftCell = $pSheet->getFreezePane();\n        if (($topLeftCell != '') && ($topLeftCell != 'A1')) {\n            $activeCell = empty($activeCell) ? $topLeftCell : $activeCell;\n            // Calculate freeze coordinates\n            $xSplit = $ySplit = 0;\n\n            list($xSplit, $ySplit) = PHPExcel_Cell::coordinateFromString($topLeftCell);\n            $xSplit = PHPExcel_Cell::columnIndexFromString($xSplit);\n\n            // pane\n            $pane = 'topRight';\n            $objWriter->startElement('pane');\n            if ($xSplit > 1) {\n                $objWriter->writeAttribute('xSplit', $xSplit - 1);\n            }\n            if ($ySplit > 1) {\n                $objWriter->writeAttribute('ySplit', $ySplit - 1);\n                $pane = ($xSplit > 1) ? 'bottomRight' : 'bottomLeft';\n            }\n            $objWriter->writeAttribute('topLeftCell', $topLeftCell);\n            $objWriter->writeAttribute('activePane', $pane);\n            $objWriter->writeAttribute('state', 'frozen');\n            $objWriter->endElement();\n\n            if (($xSplit > 1) && ($ySplit > 1)) {\n                //    Write additional selections if more than two panes (ie both an X and a Y split)\n                $objWriter->startElement('selection');\n                $objWriter->writeAttribute('pane', 'topRight');\n                $objWriter->endElement();\n                $objWriter->startElement('selection');\n                $objWriter->writeAttribute('pane', 'bottomLeft');\n                $objWriter->endElement();\n            }\n        }\n\n        // Selection\n//      if ($pane != '') {\n        // Only need to write selection element if we have a split pane\n        // We cheat a little by over-riding the active cell selection, setting it to the split cell\n        $objWriter->startElement('selection');\n        if ($pane != '') {\n            $objWriter->writeAttribute('pane', $pane);\n        }\n        $objWriter->writeAttribute('activeCell', $activeCell);\n        $objWriter->writeAttribute('sqref', $activeCell);\n        $objWriter->endElement();\n//      }\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write SheetFormatPr\n     *\n     * @param    PHPExcel_Shared_XMLWriter $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet          $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeSheetFormatPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // sheetFormatPr\n        $objWriter->startElement('sheetFormatPr');\n\n        // Default row height\n        if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) {\n            $objWriter->writeAttribute('customHeight', 'true');\n            $objWriter->writeAttribute('defaultRowHeight', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultRowDimension()->getRowHeight()));\n        } else {\n            $objWriter->writeAttribute('defaultRowHeight', '14.4');\n        }\n\n        // Set Zero Height row\n        if ((string)$pSheet->getDefaultRowDimension()->getZeroHeight()  == '1' ||\n            strtolower((string)$pSheet->getDefaultRowDimension()->getZeroHeight()) == 'true') {\n            $objWriter->writeAttribute('zeroHeight', '1');\n        }\n\n        // Default column width\n        if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) {\n            $objWriter->writeAttribute('defaultColWidth', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultColumnDimension()->getWidth()));\n        }\n\n        // Outline level - row\n        $outlineLevelRow = 0;\n        foreach ($pSheet->getRowDimensions() as $dimension) {\n            if ($dimension->getOutlineLevel() > $outlineLevelRow) {\n                $outlineLevelRow = $dimension->getOutlineLevel();\n            }\n        }\n        $objWriter->writeAttribute('outlineLevelRow', (int)$outlineLevelRow);\n\n        // Outline level - column\n        $outlineLevelCol = 0;\n        foreach ($pSheet->getColumnDimensions() as $dimension) {\n            if ($dimension->getOutlineLevel() > $outlineLevelCol) {\n                $outlineLevelCol = $dimension->getOutlineLevel();\n            }\n        }\n        $objWriter->writeAttribute('outlineLevelCol', (int)$outlineLevelCol);\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Cols\n     *\n     * @param    PHPExcel_Shared_XMLWriter $objWriter XML Writer\n     * @param    PHPExcel_Worksheet $pSheet Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeCols(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // cols\n        if (count($pSheet->getColumnDimensions()) > 0) {\n            $objWriter->startElement('cols');\n\n            $pSheet->calculateColumnWidths();\n\n            // Loop through column dimensions\n            foreach ($pSheet->getColumnDimensions() as $colDimension) {\n                // col\n                $objWriter->startElement('col');\n                $objWriter->writeAttribute('min', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));\n                $objWriter->writeAttribute('max', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));\n\n                if ($colDimension->getWidth() < 0) {\n                    // No width set, apply default of 10\n                    $objWriter->writeAttribute('width', '9.10');\n                } else {\n                    // Width set\n                    $objWriter->writeAttribute('width', PHPExcel_Shared_String::FormatNumber($colDimension->getWidth()));\n                }\n\n                // Column visibility\n                if ($colDimension->getVisible() == false) {\n                    $objWriter->writeAttribute('hidden', 'true');\n                }\n\n                // Auto size?\n                if ($colDimension->getAutoSize()) {\n                    $objWriter->writeAttribute('bestFit', 'true');\n                }\n\n                // Custom width?\n                if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) {\n                    $objWriter->writeAttribute('customWidth', 'true');\n                }\n\n                // Collapsed\n                if ($colDimension->getCollapsed() == true) {\n                    $objWriter->writeAttribute('collapsed', 'true');\n                }\n\n                // Outline level\n                if ($colDimension->getOutlineLevel() > 0) {\n                    $objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel());\n                }\n\n                // Style\n                $objWriter->writeAttribute('style', $colDimension->getXfIndex());\n\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write SheetProtection\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeSheetProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // sheetProtection\n        $objWriter->startElement('sheetProtection');\n\n        if ($pSheet->getProtection()->getPassword() != '') {\n            $objWriter->writeAttribute('password', $pSheet->getProtection()->getPassword());\n        }\n\n        $objWriter->writeAttribute('sheet', ($pSheet->getProtection()->getSheet() ? 'true' : 'false'));\n        $objWriter->writeAttribute('objects', ($pSheet->getProtection()->getObjects() ? 'true' : 'false'));\n        $objWriter->writeAttribute('scenarios', ($pSheet->getProtection()->getScenarios() ? 'true' : 'false'));\n        $objWriter->writeAttribute('formatCells', ($pSheet->getProtection()->getFormatCells() ? 'true' : 'false'));\n        $objWriter->writeAttribute('formatColumns', ($pSheet->getProtection()->getFormatColumns() ? 'true' : 'false'));\n        $objWriter->writeAttribute('formatRows', ($pSheet->getProtection()->getFormatRows() ? 'true' : 'false'));\n        $objWriter->writeAttribute('insertColumns', ($pSheet->getProtection()->getInsertColumns() ? 'true' : 'false'));\n        $objWriter->writeAttribute('insertRows', ($pSheet->getProtection()->getInsertRows() ? 'true' : 'false'));\n        $objWriter->writeAttribute('insertHyperlinks', ($pSheet->getProtection()->getInsertHyperlinks() ? 'true' : 'false'));\n        $objWriter->writeAttribute('deleteColumns', ($pSheet->getProtection()->getDeleteColumns() ? 'true' : 'false'));\n        $objWriter->writeAttribute('deleteRows', ($pSheet->getProtection()->getDeleteRows() ? 'true' : 'false'));\n        $objWriter->writeAttribute('selectLockedCells', ($pSheet->getProtection()->getSelectLockedCells() ? 'true' : 'false'));\n        $objWriter->writeAttribute('sort', ($pSheet->getProtection()->getSort() ? 'true' : 'false'));\n        $objWriter->writeAttribute('autoFilter', ($pSheet->getProtection()->getAutoFilter() ? 'true' : 'false'));\n        $objWriter->writeAttribute('pivotTables', ($pSheet->getProtection()->getPivotTables() ? 'true' : 'false'));\n        $objWriter->writeAttribute('selectUnlockedCells', ($pSheet->getProtection()->getSelectUnlockedCells() ? 'true' : 'false'));\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write ConditionalFormatting\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeConditionalFormatting(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // Conditional id\n        $id = 1;\n\n        // Loop through styles in the current worksheet\n        foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) {\n            foreach ($conditionalStyles as $conditional) {\n                // WHY was this again?\n                // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()) == '') {\n                //    continue;\n                // }\n                if ($conditional->getConditionType() != PHPExcel_Style_Conditional::CONDITION_NONE) {\n                    // conditionalFormatting\n                    $objWriter->startElement('conditionalFormatting');\n                    $objWriter->writeAttribute('sqref', $cellCoordinate);\n\n                    // cfRule\n                    $objWriter->startElement('cfRule');\n                    $objWriter->writeAttribute('type', $conditional->getConditionType());\n                    $objWriter->writeAttribute('dxfId', $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()));\n                    $objWriter->writeAttribute('priority', $id++);\n\n                    if (($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT)\n                        && $conditional->getOperatorType() != PHPExcel_Style_Conditional::OPERATOR_NONE) {\n                        $objWriter->writeAttribute('operator', $conditional->getOperatorType());\n                    }\n\n                    if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT\n                        && !is_null($conditional->getText())) {\n                        $objWriter->writeAttribute('text', $conditional->getText());\n                    }\n\n                    if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT\n                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT\n                        && !is_null($conditional->getText())) {\n                        $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH(\"' . $conditional->getText() . '\",' . $cellCoordinate . ')))');\n                    } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT\n                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BEGINSWITH\n                        && !is_null($conditional->getText())) {\n                        $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')=\"' . $conditional->getText() . '\"');\n                    } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT\n                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_ENDSWITH\n                        && !is_null($conditional->getText())) {\n                        $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')=\"' . $conditional->getText() . '\"');\n                    } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT\n                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_NOTCONTAINS\n                        && !is_null($conditional->getText())) {\n                        $objWriter->writeElement('formula', 'ISERROR(SEARCH(\"' . $conditional->getText() . '\",' . $cellCoordinate . '))');\n                    } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS\n                        || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT\n                        || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) {\n                        foreach ($conditional->getConditions() as $formula) {\n                            // Formula\n                            $objWriter->writeElement('formula', $formula);\n                        }\n                    }\n\n                    $objWriter->endElement();\n\n                    $objWriter->endElement();\n                }\n            }\n        }\n    }\n\n    /**\n     * Write DataValidations\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeDataValidations(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // Datavalidation collection\n        $dataValidationCollection = $pSheet->getDataValidationCollection();\n\n        // Write data validations?\n        if (!empty($dataValidationCollection)) {\n            $objWriter->startElement('dataValidations');\n            $objWriter->writeAttribute('count', count($dataValidationCollection));\n\n            foreach ($dataValidationCollection as $coordinate => $dv) {\n                $objWriter->startElement('dataValidation');\n\n                if ($dv->getType() != '') {\n                    $objWriter->writeAttribute('type', $dv->getType());\n                }\n\n                if ($dv->getErrorStyle() != '') {\n                    $objWriter->writeAttribute('errorStyle', $dv->getErrorStyle());\n                }\n\n                if ($dv->getOperator() != '') {\n                    $objWriter->writeAttribute('operator', $dv->getOperator());\n                }\n\n                $objWriter->writeAttribute('allowBlank', ($dv->getAllowBlank() ? '1'  : '0'));\n                $objWriter->writeAttribute('showDropDown', (!$dv->getShowDropDown() ? '1'  : '0'));\n                $objWriter->writeAttribute('showInputMessage', ($dv->getShowInputMessage() ? '1'  : '0'));\n                $objWriter->writeAttribute('showErrorMessage', ($dv->getShowErrorMessage() ? '1'  : '0'));\n\n                if ($dv->getErrorTitle() !== '') {\n                    $objWriter->writeAttribute('errorTitle', $dv->getErrorTitle());\n                }\n                if ($dv->getError() !== '') {\n                    $objWriter->writeAttribute('error', $dv->getError());\n                }\n                if ($dv->getPromptTitle() !== '') {\n                    $objWriter->writeAttribute('promptTitle', $dv->getPromptTitle());\n                }\n                if ($dv->getPrompt() !== '') {\n                    $objWriter->writeAttribute('prompt', $dv->getPrompt());\n                }\n\n                $objWriter->writeAttribute('sqref', $coordinate);\n\n                if ($dv->getFormula1() !== '') {\n                    $objWriter->writeElement('formula1', $dv->getFormula1());\n                }\n                if ($dv->getFormula2() !== '') {\n                    $objWriter->writeElement('formula2', $dv->getFormula2());\n                }\n\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write Hyperlinks\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeHyperlinks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // Hyperlink collection\n        $hyperlinkCollection = $pSheet->getHyperlinkCollection();\n\n        // Relation ID\n        $relationId = 1;\n\n        // Write hyperlinks?\n        if (!empty($hyperlinkCollection)) {\n            $objWriter->startElement('hyperlinks');\n\n            foreach ($hyperlinkCollection as $coordinate => $hyperlink) {\n                $objWriter->startElement('hyperlink');\n\n                $objWriter->writeAttribute('ref', $coordinate);\n                if (!$hyperlink->isInternal()) {\n                    $objWriter->writeAttribute('r:id', 'rId_hyperlink_' . $relationId);\n                    ++$relationId;\n                } else {\n                    $objWriter->writeAttribute('location', str_replace('sheet://', '', $hyperlink->getUrl()));\n                }\n\n                if ($hyperlink->getTooltip() != '') {\n                    $objWriter->writeAttribute('tooltip', $hyperlink->getTooltip());\n                }\n\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write ProtectedRanges\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeProtectedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        if (count($pSheet->getProtectedCells()) > 0) {\n            // protectedRanges\n            $objWriter->startElement('protectedRanges');\n\n            // Loop protectedRanges\n            foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) {\n                // protectedRange\n                $objWriter->startElement('protectedRange');\n                $objWriter->writeAttribute('name', 'p' . md5($protectedCell));\n                $objWriter->writeAttribute('sqref', $protectedCell);\n                if (!empty($passwordHash)) {\n                    $objWriter->writeAttribute('password', $passwordHash);\n                }\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write MergeCells\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeMergeCells(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        if (count($pSheet->getMergeCells()) > 0) {\n            // mergeCells\n            $objWriter->startElement('mergeCells');\n\n            // Loop mergeCells\n            foreach ($pSheet->getMergeCells() as $mergeCell) {\n                // mergeCell\n                $objWriter->startElement('mergeCell');\n                $objWriter->writeAttribute('ref', $mergeCell);\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write PrintOptions\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writePrintOptions(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // printOptions\n        $objWriter->startElement('printOptions');\n\n        $objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true': 'false'));\n        $objWriter->writeAttribute('gridLinesSet', 'true');\n\n        if ($pSheet->getPageSetup()->getHorizontalCentered()) {\n            $objWriter->writeAttribute('horizontalCentered', 'true');\n        }\n\n        if ($pSheet->getPageSetup()->getVerticalCentered()) {\n            $objWriter->writeAttribute('verticalCentered', 'true');\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write PageMargins\n     *\n     * @param    PHPExcel_Shared_XMLWriter                $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                        $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writePageMargins(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // pageMargins\n        $objWriter->startElement('pageMargins');\n        $objWriter->writeAttribute('left', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()));\n        $objWriter->writeAttribute('right', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()));\n        $objWriter->writeAttribute('top', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()));\n        $objWriter->writeAttribute('bottom', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()));\n        $objWriter->writeAttribute('header', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getHeader()));\n        $objWriter->writeAttribute('footer', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getFooter()));\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write AutoFilter\n     *\n     * @param    PHPExcel_Shared_XMLWriter                $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                        $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeAutoFilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        $autoFilterRange = $pSheet->getAutoFilter()->getRange();\n        if (!empty($autoFilterRange)) {\n            // autoFilter\n            $objWriter->startElement('autoFilter');\n\n            // Strip any worksheet reference from the filter coordinates\n            $range = PHPExcel_Cell::splitRange($autoFilterRange);\n            $range = $range[0];\n            //    Strip any worksheet ref\n            if (strpos($range[0], '!') !== false) {\n                list($ws, $range[0]) = explode('!', $range[0]);\n            }\n            $range = implode(':', $range);\n\n            $objWriter->writeAttribute('ref', str_replace('$', '', $range));\n\n            $columns = $pSheet->getAutoFilter()->getColumns();\n            if (count($columns > 0)) {\n                foreach ($columns as $columnID => $column) {\n                    $rules = $column->getRules();\n                    if (count($rules) > 0) {\n                        $objWriter->startElement('filterColumn');\n                        $objWriter->writeAttribute('colId', $pSheet->getAutoFilter()->getColumnOffset($columnID));\n\n                        $objWriter->startElement($column->getFilterType());\n                        if ($column->getJoin() == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND) {\n                            $objWriter->writeAttribute('and', 1);\n                        }\n\n                        foreach ($rules as $rule) {\n                            if (($column->getFilterType() === PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) &&\n                                ($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&\n                                ($rule->getValue() === '')) {\n                                //    Filter rule for Blanks\n                                $objWriter->writeAttribute('blank', 1);\n                            } elseif ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {\n                                //    Dynamic Filter Rule\n                                $objWriter->writeAttribute('type', $rule->getGrouping());\n                                $val = $column->getAttribute('val');\n                                if ($val !== null) {\n                                    $objWriter->writeAttribute('val', $val);\n                                }\n                                $maxVal = $column->getAttribute('maxVal');\n                                if ($maxVal !== null) {\n                                    $objWriter->writeAttribute('maxVal', $maxVal);\n                                }\n                            } elseif ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {\n                                //    Top 10 Filter Rule\n                                $objWriter->writeAttribute('val', $rule->getValue());\n                                $objWriter->writeAttribute('percent', (($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));\n                                $objWriter->writeAttribute('top', (($rule->getGrouping() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1': '0'));\n                            } else {\n                                //    Filter, DateGroupItem or CustomFilter\n                                $objWriter->startElement($rule->getRuleType());\n\n                                if ($rule->getOperator() !== PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {\n                                    $objWriter->writeAttribute('operator', $rule->getOperator());\n                                }\n                                if ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP) {\n                                    // Date Group filters\n                                    foreach ($rule->getValue() as $key => $value) {\n                                        if ($value > '') {\n                                            $objWriter->writeAttribute($key, $value);\n                                        }\n                                    }\n                                    $objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());\n                                } else {\n                                    $objWriter->writeAttribute('val', $rule->getValue());\n                                }\n\n                                $objWriter->endElement();\n                            }\n                        }\n\n                        $objWriter->endElement();\n\n                        $objWriter->endElement();\n                    }\n                }\n            }\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write PageSetup\n     *\n     * @param    PHPExcel_Shared_XMLWriter            $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                    $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writePageSetup(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // pageSetup\n        $objWriter->startElement('pageSetup');\n        $objWriter->writeAttribute('paperSize', $pSheet->getPageSetup()->getPaperSize());\n        $objWriter->writeAttribute('orientation', $pSheet->getPageSetup()->getOrientation());\n\n        if (!is_null($pSheet->getPageSetup()->getScale())) {\n            $objWriter->writeAttribute('scale', $pSheet->getPageSetup()->getScale());\n        }\n        if (!is_null($pSheet->getPageSetup()->getFitToHeight())) {\n            $objWriter->writeAttribute('fitToHeight', $pSheet->getPageSetup()->getFitToHeight());\n        } else {\n            $objWriter->writeAttribute('fitToHeight', '0');\n        }\n        if (!is_null($pSheet->getPageSetup()->getFitToWidth())) {\n            $objWriter->writeAttribute('fitToWidth', $pSheet->getPageSetup()->getFitToWidth());\n        } else {\n            $objWriter->writeAttribute('fitToWidth', '0');\n        }\n        if (!is_null($pSheet->getPageSetup()->getFirstPageNumber())) {\n            $objWriter->writeAttribute('firstPageNumber', $pSheet->getPageSetup()->getFirstPageNumber());\n            $objWriter->writeAttribute('useFirstPageNumber', '1');\n        }\n\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Header / Footer\n     *\n     * @param    PHPExcel_Shared_XMLWriter        $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeHeaderFooter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // headerFooter\n        $objWriter->startElement('headerFooter');\n        $objWriter->writeAttribute('differentOddEven', ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false'));\n        $objWriter->writeAttribute('differentFirst', ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false'));\n        $objWriter->writeAttribute('scaleWithDoc', ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false'));\n        $objWriter->writeAttribute('alignWithMargins', ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false'));\n\n        $objWriter->writeElement('oddHeader', $pSheet->getHeaderFooter()->getOddHeader());\n        $objWriter->writeElement('oddFooter', $pSheet->getHeaderFooter()->getOddFooter());\n        $objWriter->writeElement('evenHeader', $pSheet->getHeaderFooter()->getEvenHeader());\n        $objWriter->writeElement('evenFooter', $pSheet->getHeaderFooter()->getEvenFooter());\n        $objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader());\n        $objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter());\n        $objWriter->endElement();\n    }\n\n    /**\n     * Write Breaks\n     *\n     * @param    PHPExcel_Shared_XMLWriter        $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeBreaks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // Get row and column breaks\n        $aRowBreaks = array();\n        $aColumnBreaks = array();\n        foreach ($pSheet->getBreaks() as $cell => $breakType) {\n            if ($breakType == PHPExcel_Worksheet::BREAK_ROW) {\n                $aRowBreaks[] = $cell;\n            } elseif ($breakType == PHPExcel_Worksheet::BREAK_COLUMN) {\n                $aColumnBreaks[] = $cell;\n            }\n        }\n\n        // rowBreaks\n        if (!empty($aRowBreaks)) {\n            $objWriter->startElement('rowBreaks');\n            $objWriter->writeAttribute('count', count($aRowBreaks));\n            $objWriter->writeAttribute('manualBreakCount', count($aRowBreaks));\n\n            foreach ($aRowBreaks as $cell) {\n                $coords = PHPExcel_Cell::coordinateFromString($cell);\n\n                $objWriter->startElement('brk');\n                $objWriter->writeAttribute('id', $coords[1]);\n                $objWriter->writeAttribute('man', '1');\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n\n        // Second, write column breaks\n        if (!empty($aColumnBreaks)) {\n            $objWriter->startElement('colBreaks');\n            $objWriter->writeAttribute('count', count($aColumnBreaks));\n            $objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks));\n\n            foreach ($aColumnBreaks as $cell) {\n                $coords = PHPExcel_Cell::coordinateFromString($cell);\n\n                $objWriter->startElement('brk');\n                $objWriter->writeAttribute('id', PHPExcel_Cell::columnIndexFromString($coords[0]) - 1);\n                $objWriter->writeAttribute('man', '1');\n                $objWriter->endElement();\n            }\n\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write SheetData\n     *\n     * @param    PHPExcel_Shared_XMLWriter        $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                $pSheet            Worksheet\n     * @param    string[]                        $pStringTable    String table\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeSheetData(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pStringTable = null)\n    {\n        if (is_array($pStringTable)) {\n            // Flipped stringtable, for faster index searching\n            $aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable);\n\n            // sheetData\n            $objWriter->startElement('sheetData');\n\n            // Get column count\n            $colCount = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn());\n\n            // Highest row number\n            $highestRow = $pSheet->getHighestRow();\n\n            // Loop through cells\n            $cellsByRow = array();\n            foreach ($pSheet->getCellCollection() as $cellID) {\n                $cellAddress = PHPExcel_Cell::coordinateFromString($cellID);\n                $cellsByRow[$cellAddress[1]][] = $cellID;\n            }\n\n            $currentRow = 0;\n            while ($currentRow++ < $highestRow) {\n                // Get row dimension\n                $rowDimension = $pSheet->getRowDimension($currentRow);\n\n                // Write current row?\n                $writeCurrentRow = isset($cellsByRow[$currentRow]) || $rowDimension->getRowHeight() >= 0 || $rowDimension->getVisible() == false || $rowDimension->getCollapsed() == true || $rowDimension->getOutlineLevel() > 0 || $rowDimension->getXfIndex() !== null;\n\n                if ($writeCurrentRow) {\n                    // Start a new row\n                    $objWriter->startElement('row');\n                    $objWriter->writeAttribute('r', $currentRow);\n                    $objWriter->writeAttribute('spans', '1:' . $colCount);\n\n                    // Row dimensions\n                    if ($rowDimension->getRowHeight() >= 0) {\n                        $objWriter->writeAttribute('customHeight', '1');\n                        $objWriter->writeAttribute('ht', PHPExcel_Shared_String::FormatNumber($rowDimension->getRowHeight()));\n                    }\n\n                    // Row visibility\n                    if ($rowDimension->getVisible() == false) {\n                        $objWriter->writeAttribute('hidden', 'true');\n                    }\n\n                    // Collapsed\n                    if ($rowDimension->getCollapsed() == true) {\n                        $objWriter->writeAttribute('collapsed', 'true');\n                    }\n\n                    // Outline level\n                    if ($rowDimension->getOutlineLevel() > 0) {\n                        $objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel());\n                    }\n\n                    // Style\n                    if ($rowDimension->getXfIndex() !== null) {\n                        $objWriter->writeAttribute('s', $rowDimension->getXfIndex());\n                        $objWriter->writeAttribute('customFormat', '1');\n                    }\n\n                    // Write cells\n                    if (isset($cellsByRow[$currentRow])) {\n                        foreach ($cellsByRow[$currentRow] as $cellAddress) {\n                            // Write cell\n                            $this->writeCell($objWriter, $pSheet, $cellAddress, $pStringTable, $aFlippedStringTable);\n                        }\n                    }\n\n                    // End row\n                    $objWriter->endElement();\n                }\n            }\n\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Write Cell\n     *\n     * @param    PHPExcel_Shared_XMLWriter    $objWriter                XML Writer\n     * @param    PHPExcel_Worksheet            $pSheet                    Worksheet\n     * @param    PHPExcel_Cell                $pCellAddress            Cell Address\n     * @param    string[]                    $pStringTable            String table\n     * @param    string[]                    $pFlippedStringTable    String table (flipped), for faster index searching\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeCell(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pCellAddress = null, $pStringTable = null, $pFlippedStringTable = null)\n    {\n        if (is_array($pStringTable) && is_array($pFlippedStringTable)) {\n            // Cell\n            $pCell = $pSheet->getCell($pCellAddress);\n            $objWriter->startElement('c');\n            $objWriter->writeAttribute('r', $pCellAddress);\n\n            // Sheet styles\n            if ($pCell->getXfIndex() != '') {\n                $objWriter->writeAttribute('s', $pCell->getXfIndex());\n            }\n\n            // If cell value is supplied, write cell value\n            $cellValue = $pCell->getValue();\n            if (is_object($cellValue) || $cellValue !== '') {\n                // Map type\n                $mappedType = $pCell->getDataType();\n\n                // Write data type depending on its type\n                switch (strtolower($mappedType)) {\n                    case 'inlinestr':    // Inline string\n                    case 's':            // String\n                    case 'b':            // Boolean\n                        $objWriter->writeAttribute('t', $mappedType);\n                        break;\n                    case 'f':            // Formula\n                        $calculatedValue = ($this->getParentWriter()->getPreCalculateFormulas()) ?\n                            $pCell->getCalculatedValue() :\n                            $cellValue;\n                        if (is_string($calculatedValue)) {\n                            $objWriter->writeAttribute('t', 'str');\n                        }\n                        break;\n                    case 'e':            // Error\n                        $objWriter->writeAttribute('t', $mappedType);\n                }\n\n                // Write data depending on its type\n                switch (strtolower($mappedType)) {\n                    case 'inlinestr':    // Inline string\n                        if (! $cellValue instanceof PHPExcel_RichText) {\n                            $objWriter->writeElement('t', PHPExcel_Shared_String::ControlCharacterPHP2OOXML(htmlspecialchars($cellValue)));\n                        } elseif ($cellValue instanceof PHPExcel_RichText) {\n                            $objWriter->startElement('is');\n                            $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue);\n                            $objWriter->endElement();\n                        }\n\n                        break;\n                    case 's':            // String\n                        if (! $cellValue instanceof PHPExcel_RichText) {\n                            if (isset($pFlippedStringTable[$cellValue])) {\n                                $objWriter->writeElement('v', $pFlippedStringTable[$cellValue]);\n                            }\n                        } elseif ($cellValue instanceof PHPExcel_RichText) {\n                            $objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]);\n                        }\n\n                        break;\n                    case 'f':            // Formula\n                        $attributes = $pCell->getFormulaAttributes();\n                        if ($attributes['t'] == 'array') {\n                            $objWriter->startElement('f');\n                            $objWriter->writeAttribute('t', 'array');\n                            $objWriter->writeAttribute('ref', $pCellAddress);\n                            $objWriter->writeAttribute('aca', '1');\n                            $objWriter->writeAttribute('ca', '1');\n                            $objWriter->text(substr($cellValue, 1));\n                            $objWriter->endElement();\n                        } else {\n                            $objWriter->writeElement('f', substr($cellValue, 1));\n                        }\n                        if ($this->getParentWriter()->getOffice2003Compatibility() === false) {\n                            if ($this->getParentWriter()->getPreCalculateFormulas()) {\n//                                $calculatedValue = $pCell->getCalculatedValue();\n                                if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') {\n                                    $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue));\n                                } else {\n                                    $objWriter->writeElement('v', '0');\n                                }\n                            } else {\n                                $objWriter->writeElement('v', '0');\n                            }\n                        }\n                        break;\n                    case 'n':            // Numeric\n                        // force point as decimal separator in case current locale uses comma\n                        $objWriter->writeElement('v', str_replace(',', '.', $cellValue));\n                        break;\n                    case 'b':            // Boolean\n                        $objWriter->writeElement('v', ($cellValue ? '1' : '0'));\n                        break;\n                    case 'e':            // Error\n                        if (substr($cellValue, 0, 1) == '=') {\n                            $objWriter->writeElement('f', substr($cellValue, 1));\n                            $objWriter->writeElement('v', substr($cellValue, 1));\n                        } else {\n                            $objWriter->writeElement('v', $cellValue);\n                        }\n\n                        break;\n                }\n            }\n\n            $objWriter->endElement();\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Write Drawings\n     *\n     * @param    PHPExcel_Shared_XMLWriter    $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet            $pSheet            Worksheet\n     * @param    boolean                        $includeCharts    Flag indicating if we should include drawing details for charts\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeDrawings(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $includeCharts = false)\n    {\n        $chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0;\n        // If sheet contains drawings, add the relationships\n        if (($pSheet->getDrawingCollection()->count() > 0) ||\n            ($chartCount > 0)) {\n            $objWriter->startElement('drawing');\n            $objWriter->writeAttribute('r:id', 'rId1');\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write LegacyDrawing\n     *\n     * @param    PHPExcel_Shared_XMLWriter        $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeLegacyDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // If sheet contains comments, add the relationships\n        if (count($pSheet->getComments()) > 0) {\n            $objWriter->startElement('legacyDrawing');\n            $objWriter->writeAttribute('r:id', 'rId_comments_vml1');\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write LegacyDrawingHF\n     *\n     * @param    PHPExcel_Shared_XMLWriter        $objWriter        XML Writer\n     * @param    PHPExcel_Worksheet                $pSheet            Worksheet\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeLegacyDrawingHF(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)\n    {\n        // If sheet contains images, add the relationships\n        if (count($pSheet->getHeaderFooter()->getImages()) > 0) {\n            $objWriter->startElement('legacyDrawingHF');\n            $objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1');\n            $objWriter->endElement();\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007_WriterPart\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Writer_Excel2007_WriterPart\n{\n    /**\n     * Parent IWriter object\n     *\n     * @var PHPExcel_Writer_IWriter\n     */\n    private $parentWriter;\n\n    /**\n     * Set parent IWriter object\n     *\n     * @param PHPExcel_Writer_IWriter    $pWriter\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function setParentWriter(PHPExcel_Writer_IWriter $pWriter = null)\n    {\n        $this->parentWriter = $pWriter;\n    }\n\n    /**\n     * Get parent IWriter object\n     *\n     * @return PHPExcel_Writer_IWriter\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function getParentWriter()\n    {\n        if (!is_null($this->parentWriter)) {\n            return $this->parentWriter;\n        } else {\n            throw new PHPExcel_Writer_Exception(\"No parent PHPExcel_Writer_IWriter assigned.\");\n        }\n    }\n\n    /**\n     * Set parent IWriter object\n     *\n     * @param PHPExcel_Writer_IWriter    $pWriter\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function __construct(PHPExcel_Writer_IWriter $pWriter = null)\n    {\n        if (!is_null($pWriter)) {\n            $this->parentWriter = $pWriter;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel2007\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel2007\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter\n{\n    /**\n     * Pre-calculate formulas\n     * Forces PHPExcel to recalculate all formulae in a workbook when saving, so that the pre-calculated values are\n     *    immediately available to MS Excel or other office spreadsheet viewer when opening the file\n     *\n     * Overrides the default TRUE for this specific writer for performance reasons\n     *\n     * @var boolean\n     */\n    protected $preCalculateFormulas = false;\n\n    /**\n     * Office2003 compatibility\n     *\n     * @var boolean\n     */\n    private $office2003compatibility = false;\n\n    /**\n     * Private writer parts\n     *\n     * @var PHPExcel_Writer_Excel2007_WriterPart[]\n     */\n    private $writerParts    = array();\n\n    /**\n     * Private PHPExcel\n     *\n     * @var PHPExcel\n     */\n    private $spreadSheet;\n\n    /**\n     * Private string table\n     *\n     * @var string[]\n     */\n    private $stringTable    = array();\n\n    /**\n     * Private unique PHPExcel_Style_Conditional HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $stylesConditionalHashTable;\n\n    /**\n     * Private unique PHPExcel_Style HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $styleHashTable;\n\n    /**\n     * Private unique PHPExcel_Style_Fill HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $fillHashTable;\n\n    /**\n     * Private unique PHPExcel_Style_Font HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $fontHashTable;\n\n    /**\n     * Private unique PHPExcel_Style_Borders HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $bordersHashTable ;\n\n    /**\n     * Private unique PHPExcel_Style_NumberFormat HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $numFmtHashTable;\n\n    /**\n     * Private unique PHPExcel_Worksheet_BaseDrawing HashTable\n     *\n     * @var PHPExcel_HashTable\n     */\n    private $drawingHashTable;\n\n    /**\n     * Create a new PHPExcel_Writer_Excel2007\n     *\n     * @param     PHPExcel    $pPHPExcel\n     */\n    public function __construct(PHPExcel $pPHPExcel = null)\n    {\n        // Assign PHPExcel\n        $this->setPHPExcel($pPHPExcel);\n\n        $writerPartsArray = array(  'stringtable'       => 'PHPExcel_Writer_Excel2007_StringTable',\n                                    'contenttypes'      => 'PHPExcel_Writer_Excel2007_ContentTypes',\n                                    'docprops'          => 'PHPExcel_Writer_Excel2007_DocProps',\n                                    'rels'              => 'PHPExcel_Writer_Excel2007_Rels',\n                                    'theme'             => 'PHPExcel_Writer_Excel2007_Theme',\n                                    'style'             => 'PHPExcel_Writer_Excel2007_Style',\n                                    'workbook'          => 'PHPExcel_Writer_Excel2007_Workbook',\n                                    'worksheet'         => 'PHPExcel_Writer_Excel2007_Worksheet',\n                                    'drawing'           => 'PHPExcel_Writer_Excel2007_Drawing',\n                                    'comments'          => 'PHPExcel_Writer_Excel2007_Comments',\n                                    'chart'             => 'PHPExcel_Writer_Excel2007_Chart',\n                                    'relsvba'           => 'PHPExcel_Writer_Excel2007_RelsVBA',\n                                    'relsribbonobjects' => 'PHPExcel_Writer_Excel2007_RelsRibbon'\n                                 );\n\n        //    Initialise writer parts\n        //        and Assign their parent IWriters\n        foreach ($writerPartsArray as $writer => $class) {\n            $this->writerParts[$writer] = new $class($this);\n        }\n\n        $hashTablesArray = array( 'stylesConditionalHashTable',    'fillHashTable',        'fontHashTable',\n                                  'bordersHashTable',                'numFmtHashTable',        'drawingHashTable',\n                                  'styleHashTable'\n                                );\n\n        // Set HashTable variables\n        foreach ($hashTablesArray as $tableName) {\n            $this->$tableName     = new PHPExcel_HashTable();\n        }\n    }\n\n    /**\n     * Get writer part\n     *\n     * @param     string     $pPartName        Writer part name\n     * @return     PHPExcel_Writer_Excel2007_WriterPart\n     */\n    public function getWriterPart($pPartName = '')\n    {\n        if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) {\n            return $this->writerParts[strtolower($pPartName)];\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Save PHPExcel to file\n     *\n     * @param     string         $pFilename\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        if ($this->spreadSheet !== null) {\n            // garbage collect\n            $this->spreadSheet->garbageCollect();\n\n            // If $pFilename is php://output or php://stdout, make it a temporary file...\n            $originalFilename = $pFilename;\n            if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {\n                $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp');\n                if ($pFilename == '') {\n                    $pFilename = $originalFilename;\n                }\n            }\n\n            $saveDebugLog = PHPExcel_Calculation::getInstance($this->spreadSheet)->getDebugLog()->getWriteDebugLog();\n            PHPExcel_Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog(false);\n            $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();\n            PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);\n\n            // Create string lookup table\n            $this->stringTable = array();\n            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {\n                $this->stringTable = $this->getWriterPart('StringTable')->createStringTable($this->spreadSheet->getSheet($i), $this->stringTable);\n            }\n\n            // Create styles dictionaries\n            $this->styleHashTable->addFromSource($this->getWriterPart('Style')->allStyles($this->spreadSheet));\n            $this->stylesConditionalHashTable->addFromSource($this->getWriterPart('Style')->allConditionalStyles($this->spreadSheet));\n            $this->fillHashTable->addFromSource($this->getWriterPart('Style')->allFills($this->spreadSheet));\n            $this->fontHashTable->addFromSource($this->getWriterPart('Style')->allFonts($this->spreadSheet));\n            $this->bordersHashTable->addFromSource($this->getWriterPart('Style')->allBorders($this->spreadSheet));\n            $this->numFmtHashTable->addFromSource($this->getWriterPart('Style')->allNumberFormats($this->spreadSheet));\n\n            // Create drawing dictionary\n            $this->drawingHashTable->addFromSource($this->getWriterPart('Drawing')->allDrawings($this->spreadSheet));\n\n            // Create new ZIP file and open it for writing\n            $zipClass = PHPExcel_Settings::getZipClass();\n            $objZip = new $zipClass();\n\n            //    Retrieve OVERWRITE and CREATE constants from the instantiated zip class\n            //    This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP\n            $ro = new ReflectionObject($objZip);\n            $zipOverWrite = $ro->getConstant('OVERWRITE');\n            $zipCreate = $ro->getConstant('CREATE');\n\n            if (file_exists($pFilename)) {\n                unlink($pFilename);\n            }\n            // Try opening the ZIP file\n            if ($objZip->open($pFilename, $zipOverWrite) !== true) {\n                if ($objZip->open($pFilename, $zipCreate) !== true) {\n                    throw new PHPExcel_Writer_Exception(\"Could not open \" . $pFilename . \" for writing.\");\n                }\n            }\n\n            // Add [Content_Types].xml to ZIP file\n            $objZip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->spreadSheet, $this->includeCharts));\n\n            //if hasMacros, add the vbaProject.bin file, Certificate file(if exists)\n            if ($this->spreadSheet->hasMacros()) {\n                $macrosCode=$this->spreadSheet->getMacrosCode();\n                if (!is_null($macrosCode)) {// we have the code ?\n                    $objZip->addFromString('xl/vbaProject.bin', $macrosCode);//allways in 'xl', allways named vbaProject.bin\n                    if ($this->spreadSheet->hasMacrosCertificate()) {//signed macros ?\n                        // Yes : add the certificate file and the related rels file\n                        $objZip->addFromString('xl/vbaProjectSignature.bin', $this->spreadSheet->getMacrosCertificate());\n                        $objZip->addFromString('xl/_rels/vbaProject.bin.rels', $this->getWriterPart('RelsVBA')->writeVBARelationships($this->spreadSheet));\n                    }\n                }\n            }\n            //a custom UI in this workbook ? add it (\"base\" xml and additional objects (pictures) and rels)\n            if ($this->spreadSheet->hasRibbon()) {\n                $tmpRibbonTarget=$this->spreadSheet->getRibbonXMLData('target');\n                $objZip->addFromString($tmpRibbonTarget, $this->spreadSheet->getRibbonXMLData('data'));\n                if ($this->spreadSheet->hasRibbonBinObjects()) {\n                    $tmpRootPath=dirname($tmpRibbonTarget).'/';\n                    $ribbonBinObjects=$this->spreadSheet->getRibbonBinObjects('data');//the files to write\n                    foreach ($ribbonBinObjects as $aPath => $aContent) {\n                        $objZip->addFromString($tmpRootPath.$aPath, $aContent);\n                    }\n                    //the rels for files\n                    $objZip->addFromString($tmpRootPath.'_rels/'.basename($tmpRibbonTarget).'.rels', $this->getWriterPart('RelsRibbonObjects')->writeRibbonRelationships($this->spreadSheet));\n                }\n            }\n            \n            // Add relationships to ZIP file\n            $objZip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->spreadSheet));\n            $objZip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->spreadSheet));\n\n            // Add document properties to ZIP file\n            $objZip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->spreadSheet));\n            $objZip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->spreadSheet));\n            $customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->spreadSheet);\n            if ($customPropertiesPart !== null) {\n                $objZip->addFromString('docProps/custom.xml', $customPropertiesPart);\n            }\n\n            // Add theme to ZIP file\n            $objZip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->spreadSheet));\n\n            // Add string table to ZIP file\n            $objZip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->stringTable));\n\n            // Add styles to ZIP file\n            $objZip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->spreadSheet));\n\n            // Add workbook to ZIP file\n            $objZip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->spreadSheet, $this->preCalculateFormulas));\n\n            $chartCount = 0;\n            // Add worksheets\n            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {\n                $objZip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->spreadSheet->getSheet($i), $this->stringTable, $this->includeCharts));\n                if ($this->includeCharts) {\n                    $charts = $this->spreadSheet->getSheet($i)->getChartCollection();\n                    if (count($charts) > 0) {\n                        foreach ($charts as $chart) {\n                            $objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart, $this->preCalculateFormulas));\n                            $chartCount++;\n                        }\n                    }\n                }\n            }\n\n            $chartRef1 = $chartRef2 = 0;\n            // Add worksheet relationships (drawings, ...)\n            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {\n                // Add relationships\n                $objZip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->spreadSheet->getSheet($i), ($i + 1), $this->includeCharts));\n\n                $drawings = $this->spreadSheet->getSheet($i)->getDrawingCollection();\n                $drawingCount = count($drawings);\n                if ($this->includeCharts) {\n                    $chartCount = $this->spreadSheet->getSheet($i)->getChartCount();\n                }\n\n                // Add drawing and image relationship parts\n                if (($drawingCount > 0) || ($chartCount > 0)) {\n                    // Drawing relationships\n                    $objZip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->spreadSheet->getSheet($i), $chartRef1, $this->includeCharts));\n\n                    // Drawings\n                    $objZip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $chartRef2, $this->includeCharts));\n                }\n\n                // Add comment relationship parts\n                if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) {\n                    // VML Comments\n                    $objZip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->spreadSheet->getSheet($i)));\n\n                    // Comments\n                    $objZip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->spreadSheet->getSheet($i)));\n                }\n\n                // Add header/footer relationship parts\n                if (count($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) {\n                    // VML Drawings\n                    $objZip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->spreadSheet->getSheet($i)));\n\n                    // VML Drawing relationships\n                    $objZip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->spreadSheet->getSheet($i)));\n\n                    // Media\n                    foreach ($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) {\n                        $objZip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath()));\n                    }\n                }\n            }\n\n            // Add media\n            for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {\n                if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) {\n                    $imageContents = null;\n                    $imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath();\n                    if (strpos($imagePath, 'zip://') !== false) {\n                        $imagePath = substr($imagePath, 6);\n                        $imagePathSplitted = explode('#', $imagePath);\n\n                        $imageZip = new ZipArchive();\n                        $imageZip->open($imagePathSplitted[0]);\n                        $imageContents = $imageZip->getFromName($imagePathSplitted[1]);\n                        $imageZip->close();\n                        unset($imageZip);\n                    } else {\n                        $imageContents = file_get_contents($imagePath);\n                    }\n\n                    $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents);\n                } elseif ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) {\n                    ob_start();\n                    call_user_func(\n                        $this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(),\n                        $this->getDrawingHashTable()->getByIndex($i)->getImageResource()\n                    );\n                    $imageContents = ob_get_contents();\n                    ob_end_clean();\n\n                    $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents);\n                }\n            }\n\n            PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);\n            PHPExcel_Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog);\n\n            // Close file\n            if ($objZip->close() === false) {\n                throw new PHPExcel_Writer_Exception(\"Could not close zip file $pFilename.\");\n            }\n\n            // If a temporary file was used, copy it to the correct file stream\n            if ($originalFilename != $pFilename) {\n                if (copy($pFilename, $originalFilename) === false) {\n                    throw new PHPExcel_Writer_Exception(\"Could not copy temporary zip file $pFilename to $originalFilename.\");\n                }\n                @unlink($pFilename);\n            }\n        } else {\n            throw new PHPExcel_Writer_Exception(\"PHPExcel object unassigned.\");\n        }\n    }\n\n    /**\n     * Get PHPExcel object\n     *\n     * @return PHPExcel\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function getPHPExcel()\n    {\n        if ($this->spreadSheet !== null) {\n            return $this->spreadSheet;\n        } else {\n            throw new PHPExcel_Writer_Exception(\"No PHPExcel object assigned.\");\n        }\n    }\n\n    /**\n     * Set PHPExcel object\n     *\n     * @param     PHPExcel     $pPHPExcel    PHPExcel object\n     * @throws    PHPExcel_Writer_Exception\n     * @return PHPExcel_Writer_Excel2007\n     */\n    public function setPHPExcel(PHPExcel $pPHPExcel = null)\n    {\n        $this->spreadSheet = $pPHPExcel;\n        return $this;\n    }\n\n    /**\n     * Get string table\n     *\n     * @return string[]\n     */\n    public function getStringTable()\n    {\n        return $this->stringTable;\n    }\n\n    /**\n     * Get PHPExcel_Style HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getStyleHashTable()\n    {\n        return $this->styleHashTable;\n    }\n\n    /**\n     * Get PHPExcel_Style_Conditional HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getStylesConditionalHashTable()\n    {\n        return $this->stylesConditionalHashTable;\n    }\n\n    /**\n     * Get PHPExcel_Style_Fill HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getFillHashTable()\n    {\n        return $this->fillHashTable;\n    }\n\n    /**\n     * Get PHPExcel_Style_Font HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getFontHashTable()\n    {\n        return $this->fontHashTable;\n    }\n\n    /**\n     * Get PHPExcel_Style_Borders HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getBordersHashTable()\n    {\n        return $this->bordersHashTable;\n    }\n\n    /**\n     * Get PHPExcel_Style_NumberFormat HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getNumFmtHashTable()\n    {\n        return $this->numFmtHashTable;\n    }\n\n    /**\n     * Get PHPExcel_Worksheet_BaseDrawing HashTable\n     *\n     * @return PHPExcel_HashTable\n     */\n    public function getDrawingHashTable()\n    {\n        return $this->drawingHashTable;\n    }\n\n    /**\n     * Get Office2003 compatibility\n     *\n     * @return boolean\n     */\n    public function getOffice2003Compatibility()\n    {\n        return $this->office2003compatibility;\n    }\n\n    /**\n     * Set Office2003 compatibility\n     *\n     * @param boolean $pValue    Office2003 compatibility?\n     * @return PHPExcel_Writer_Excel2007\n     */\n    public function setOffice2003Compatibility($pValue = false)\n    {\n        $this->office2003compatibility = $pValue;\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5_BIFFwriter\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n// Original file header of PEAR::Spreadsheet_Excel_Writer_BIFFwriter (used as the base for this class):\n// -----------------------------------------------------------------------------------------\n// *  Module written/ported by Xavier Noguer <xnoguer@rezebra.com>\n// *\n// *  The majority of this is _NOT_ my code.  I simply ported it from the\n// *  PERL Spreadsheet::WriteExcel module.\n// *\n// *  The author of the Spreadsheet::WriteExcel module is John McNamara\n// *  <jmcnamara@cpan.org>\n// *\n// *  I _DO_ maintain this code, and John McNamara has nothing to do with the\n// *  porting of this code to PHP.  Any questions directly related to this\n// *  class library should be directed to me.\n// *\n// *  License Information:\n// *\n// *    Spreadsheet_Excel_Writer:  A library for generating Excel Spreadsheets\n// *    Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com\n// *\n// *    This library is free software; you can redistribute it and/or\n// *    modify it under the terms of the GNU Lesser General Public\n// *    License as published by the Free Software Foundation; either\n// *    version 2.1 of the License, or (at your option) any later version.\n// *\n// *    This library is distributed in the hope that it will be useful,\n// *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n// *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// *    Lesser General Public License for more details.\n// *\n// *    You should have received a copy of the GNU Lesser General Public\n// *    License along with this library; if not, write to the Free Software\n// *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// */\nclass PHPExcel_Writer_Excel5_BIFFwriter\n{\n    /**\n     * The byte order of this architecture. 0 => little endian, 1 => big endian\n     * @var integer\n     */\n    private static $byteOrder;\n\n    /**\n     * The string containing the data of the BIFF stream\n     * @var string\n     */\n    public $_data;\n\n    /**\n     * The size of the data in bytes. Should be the same as strlen($this->_data)\n     * @var integer\n     */\n    public $_datasize;\n\n    /**\n     * The maximum length for a BIFF record (excluding record header and length field). See addContinue()\n     * @var integer\n     * @see addContinue()\n     */\n    private $limit    = 8224;\n\n    /**\n     * Constructor\n     */\n    public function __construct()\n    {\n        $this->_data       = '';\n        $this->_datasize   = 0;\n//        $this->limit      = 8224;\n    }\n\n    /**\n     * Determine the byte order and store it as class data to avoid\n     * recalculating it for each call to new().\n     *\n     * @return int\n     */\n    public static function getByteOrder()\n    {\n        if (!isset(self::$byteOrder)) {\n            // Check if \"pack\" gives the required IEEE 64bit float\n            $teststr = pack(\"d\", 1.2345);\n            $number  = pack(\"C8\", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F);\n            if ($number == $teststr) {\n                $byte_order = 0;    // Little Endian\n            } elseif ($number == strrev($teststr)) {\n                $byte_order = 1;    // Big Endian\n            } else {\n                // Give up. I'll fix this in a later version.\n                throw new PHPExcel_Writer_Exception(\"Required floating point format not supported on this platform.\");\n            }\n            self::$byteOrder = $byte_order;\n        }\n\n        return self::$byteOrder;\n    }\n\n    /**\n     * General storage function\n     *\n     * @param string $data binary data to append\n     * @access private\n     */\n    protected function append($data)\n    {\n        if (strlen($data) - 4 > $this->limit) {\n            $data = $this->addContinue($data);\n        }\n        $this->_data     .= $data;\n        $this->_datasize += strlen($data);\n    }\n\n    /**\n     * General storage function like append, but returns string instead of modifying $this->_data\n     *\n     * @param string $data binary data to write\n     * @return string\n     */\n    public function writeData($data)\n    {\n        if (strlen($data) - 4 > $this->limit) {\n            $data = $this->addContinue($data);\n        }\n        $this->_datasize += strlen($data);\n\n        return $data;\n    }\n\n    /**\n     * Writes Excel BOF record to indicate the beginning of a stream or\n     * sub-stream in the BIFF file.\n     *\n     * @param  integer $type Type of BIFF file to write: 0x0005 Workbook,\n     *                       0x0010 Worksheet.\n     * @access private\n     */\n    protected function storeBof($type)\n    {\n        $record  = 0x0809;            // Record identifier    (BIFF5-BIFF8)\n        $length  = 0x0010;\n\n        // by inspection of real files, MS Office Excel 2007 writes the following\n        $unknown = pack(\"VV\", 0x000100D1, 0x00000406);\n\n        $build   = 0x0DBB;            //    Excel 97\n        $year    = 0x07CC;            //    Excel 97\n\n        $version = 0x0600;            //    BIFF8\n\n        $header  = pack(\"vv\", $record, $length);\n        $data    = pack(\"vvvv\", $version, $type, $build, $year);\n        $this->append($header . $data . $unknown);\n    }\n\n    /**\n     * Writes Excel EOF record to indicate the end of a BIFF stream.\n     *\n     * @access private\n     */\n    protected function storeEof()\n    {\n        $record    = 0x000A;   // Record identifier\n        $length    = 0x0000;   // Number of bytes to follow\n\n        $header    = pack(\"vv\", $record, $length);\n        $this->append($header);\n    }\n\n    /**\n     * Writes Excel EOF record to indicate the end of a BIFF stream.\n     *\n     * @access private\n     */\n    public function writeEof()\n    {\n        $record    = 0x000A;   // Record identifier\n        $length    = 0x0000;   // Number of bytes to follow\n        $header    = pack(\"vv\", $record, $length);\n        return $this->writeData($header);\n    }\n\n    /**\n     * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In\n     * Excel 97 the limit is 8228 bytes. Records that are longer than these limits\n     * must be split up into CONTINUE blocks.\n     *\n     * This function takes a long BIFF record and inserts CONTINUE records as\n     * necessary.\n     *\n     * @param  string  $data The original binary data to be written\n     * @return string        A very convenient string of continue blocks\n     * @access private\n     */\n    private function addContinue($data)\n    {\n        $limit  = $this->limit;\n        $record = 0x003C;         // Record identifier\n\n        // The first 2080/8224 bytes remain intact. However, we have to change\n        // the length field of the record.\n        $tmp = substr($data, 0, 2) . pack(\"v\", $limit) . substr($data, 4, $limit);\n\n        $header = pack(\"vv\", $record, $limit);  // Headers for continue records\n\n        // Retrieve chunks of 2080/8224 bytes +4 for the header.\n        $data_length = strlen($data);\n        for ($i = $limit + 4; $i < ($data_length - $limit); $i += $limit) {\n            $tmp .= $header;\n            $tmp .= substr($data, $i, $limit);\n        }\n\n        // Retrieve the last chunk of data\n        $header  = pack(\"vv\", $record, strlen($data) - $i);\n        $tmp    .= $header;\n        $tmp    .= substr($data, $i, strlen($data) - $i);\n\n        return $tmp;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Shared_Escher_DggContainer_BstoreContainer\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n */\nclass PHPExcel_Writer_Excel5_Escher\n{\n    /**\n     * The object we are writing\n     */\n    private $object;\n\n    /**\n     * The written binary data\n     */\n    private $data;\n\n    /**\n     * Shape offsets. Positions in binary stream where a new shape record begins\n     *\n     * @var array\n     */\n    private $spOffsets;\n\n    /**\n     * Shape types.\n     *\n     * @var array\n     */\n    private $spTypes;\n    \n    /**\n     * Constructor\n     *\n     * @param mixed\n     */\n    public function __construct($object)\n    {\n        $this->object = $object;\n    }\n\n    /**\n     * Process the object to be written\n     */\n    public function close()\n    {\n        // initialize\n        $this->data = '';\n\n        switch (get_class($this->object)) {\n            case 'PHPExcel_Shared_Escher':\n                if ($dggContainer = $this->object->getDggContainer()) {\n                    $writer = new PHPExcel_Writer_Excel5_Escher($dggContainer);\n                    $this->data = $writer->close();\n                } elseif ($dgContainer = $this->object->getDgContainer()) {\n                    $writer = new PHPExcel_Writer_Excel5_Escher($dgContainer);\n                    $this->data = $writer->close();\n                    $this->spOffsets = $writer->getSpOffsets();\n                    $this->spTypes = $writer->getSpTypes();\n                }\n                break;\n            case 'PHPExcel_Shared_Escher_DggContainer':\n                // this is a container record\n\n                // initialize\n                $innerData = '';\n\n                // write the dgg\n                $recVer            = 0x0;\n                $recInstance    = 0x0000;\n                $recType        = 0xF006;\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                // dgg data\n                $dggData =\n                    pack(\n                        'VVVV',\n                        $this->object->getSpIdMax(), // maximum shape identifier increased by one\n                        $this->object->getCDgSaved() + 1, // number of file identifier clusters increased by one\n                        $this->object->getCSpSaved(),\n                        $this->object->getCDgSaved() // count total number of drawings saved\n                    );\n\n                // add file identifier clusters (one per drawing)\n                $IDCLs = $this->object->getIDCLs();\n\n                foreach ($IDCLs as $dgId => $maxReducedSpId) {\n                    $dggData .= pack('VV', $dgId, $maxReducedSpId + 1);\n                }\n\n                $header = pack('vvV', $recVerInstance, $recType, strlen($dggData));\n                $innerData .= $header . $dggData;\n\n                // write the bstoreContainer\n                if ($bstoreContainer = $this->object->getBstoreContainer()) {\n                    $writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);\n                    $innerData .= $writer->close();\n                }\n\n                // write the record\n                $recVer            = 0xF;\n                $recInstance    = 0x0000;\n                $recType        = 0xF000;\n                $length            = strlen($innerData);\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $this->data = $header . $innerData;\n                break;\n            case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':\n                // this is a container record\n\n                // initialize\n                $innerData = '';\n\n                // treat the inner data\n                if ($BSECollection = $this->object->getBSECollection()) {\n                    foreach ($BSECollection as $BSE) {\n                        $writer = new PHPExcel_Writer_Excel5_Escher($BSE);\n                        $innerData .= $writer->close();\n                    }\n                }\n\n                // write the record\n                $recVer            = 0xF;\n                $recInstance    = count($this->object->getBSECollection());\n                $recType        = 0xF001;\n                $length            = strlen($innerData);\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $this->data = $header . $innerData;\n                break;\n            case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':\n                // this is a semi-container record\n\n                // initialize\n                $innerData = '';\n\n                // here we treat the inner data\n                if ($blip = $this->object->getBlip()) {\n                    $writer = new PHPExcel_Writer_Excel5_Escher($blip);\n                    $innerData .= $writer->close();\n                }\n\n                // initialize\n                $data = '';\n\n                $btWin32 = $this->object->getBlipType();\n                $btMacOS = $this->object->getBlipType();\n                $data .= pack('CC', $btWin32, $btMacOS);\n\n                $rgbUid = pack('VVVV', 0, 0, 0, 0); // todo\n                $data .= $rgbUid;\n\n                $tag = 0;\n                $size = strlen($innerData);\n                $cRef = 1;\n                $foDelay = 0; //todo\n                $unused1 = 0x0;\n                $cbName = 0x0;\n                $unused2 = 0x0;\n                $unused3 = 0x0;\n                $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);\n\n                $data .= $innerData;\n\n                // write the record\n                $recVer            = 0x2;\n                $recInstance    = $this->object->getBlipType();\n                $recType        = 0xF007;\n                $length            = strlen($data);\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |=    $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $this->data = $header;\n\n                $this->data .= $data;\n                break;\n            case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':\n                // this is an atom record\n\n                // write the record\n                switch ($this->object->getParent()->getBlipType()) {\n                    case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:\n                        // initialize\n                        $innerData = '';\n\n                        $rgbUid1 = pack('VVVV', 0, 0, 0, 0); // todo\n                        $innerData .= $rgbUid1;\n\n                        $tag = 0xFF; // todo\n                        $innerData .= pack('C', $tag);\n\n                        $innerData .= $this->object->getData();\n\n                        $recVer            = 0x0;\n                        $recInstance    = 0x46A;\n                        $recType        = 0xF01D;\n                        $length            = strlen($innerData);\n\n                        $recVerInstance  = $recVer;\n                        $recVerInstance |=    $recInstance << 4;\n\n                        $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                        $this->data = $header;\n\n                        $this->data .= $innerData;\n                        break;\n\n                    case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:\n                        // initialize\n                        $innerData = '';\n\n                        $rgbUid1 = pack('VVVV', 0, 0, 0, 0); // todo\n                        $innerData .= $rgbUid1;\n\n                        $tag = 0xFF; // todo\n                        $innerData .= pack('C', $tag);\n\n                        $innerData .= $this->object->getData();\n\n                        $recVer            = 0x0;\n                        $recInstance    = 0x6E0;\n                        $recType        = 0xF01E;\n                        $length            = strlen($innerData);\n\n                        $recVerInstance  = $recVer;\n                        $recVerInstance |=    $recInstance << 4;\n\n                        $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                        $this->data = $header;\n\n                        $this->data .= $innerData;\n                        break;\n                }\n                break;\n            case 'PHPExcel_Shared_Escher_DgContainer':\n                // this is a container record\n\n                // initialize\n                $innerData = '';\n\n                // write the dg\n                $recVer            = 0x0;\n                $recInstance    = $this->object->getDgId();\n                $recType        = 0xF008;\n                $length            = 8;\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                // number of shapes in this drawing (including group shape)\n                $countShapes = count($this->object->getSpgrContainer()->getChildren());\n                $innerData .= $header . pack('VV', $countShapes, $this->object->getLastSpId());\n                //$innerData .= $header . pack('VV', 0, 0);\n\n                // write the spgrContainer\n                if ($spgrContainer = $this->object->getSpgrContainer()) {\n                    $writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);\n                    $innerData .= $writer->close();\n\n                    // get the shape offsets relative to the spgrContainer record\n                    $spOffsets = $writer->getSpOffsets();\n                    $spTypes   = $writer->getSpTypes();\n                    \n                    // save the shape offsets relative to dgContainer\n                    foreach ($spOffsets as & $spOffset) {\n                        $spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)\n                    }\n\n                    $this->spOffsets = $spOffsets;\n                    $this->spTypes = $spTypes;\n                }\n\n                // write the record\n                $recVer            = 0xF;\n                $recInstance    = 0x0000;\n                $recType        = 0xF002;\n                $length            = strlen($innerData);\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $this->data = $header . $innerData;\n                break;\n            case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':\n                // this is a container record\n\n                // initialize\n                $innerData = '';\n\n                // initialize spape offsets\n                $totalSize = 8;\n                $spOffsets = array();\n                $spTypes   = array();\n\n                // treat the inner data\n                foreach ($this->object->getChildren() as $spContainer) {\n                    $writer = new PHPExcel_Writer_Excel5_Escher($spContainer);\n                    $spData = $writer->close();\n                    $innerData .= $spData;\n\n                    // save the shape offsets (where new shape records begin)\n                    $totalSize += strlen($spData);\n                    $spOffsets[] = $totalSize;\n                    \n                    $spTypes = array_merge($spTypes, $writer->getSpTypes());\n                }\n\n                // write the record\n                $recVer            = 0xF;\n                $recInstance    = 0x0000;\n                $recType        = 0xF003;\n                $length            = strlen($innerData);\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $this->data = $header . $innerData;\n                $this->spOffsets = $spOffsets;\n                $this->spTypes = $spTypes;\n                break;\n            case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':\n                // initialize\n                $data = '';\n\n                // build the data\n\n                // write group shape record, if necessary?\n                if ($this->object->getSpgr()) {\n                    $recVer            = 0x1;\n                    $recInstance    = 0x0000;\n                    $recType        = 0xF009;\n                    $length            = 0x00000010;\n\n                    $recVerInstance  = $recVer;\n                    $recVerInstance |= $recInstance << 4;\n\n                    $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                    $data .= $header . pack('VVVV', 0, 0, 0, 0);\n                }\n                $this->spTypes[] = ($this->object->getSpType());\n\n                // write the shape record\n                $recVer            = 0x2;\n                $recInstance    = $this->object->getSpType(); // shape type\n                $recType        = 0xF00A;\n                $length            = 0x00000008;\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $data .= $header . pack('VV', $this->object->getSpId(), $this->object->getSpgr() ? 0x0005 : 0x0A00);\n\n\n                // the options\n                if ($this->object->getOPTCollection()) {\n                    $optData = '';\n\n                    $recVer            = 0x3;\n                    $recInstance    = count($this->object->getOPTCollection());\n                    $recType        = 0xF00B;\n                    foreach ($this->object->getOPTCollection() as $property => $value) {\n                        $optData .= pack('vV', $property, $value);\n                    }\n                    $length            = strlen($optData);\n\n                    $recVerInstance  = $recVer;\n                    $recVerInstance |= $recInstance << 4;\n\n                    $header = pack('vvV', $recVerInstance, $recType, $length);\n                    $data .= $header . $optData;\n                }\n\n                // the client anchor\n                if ($this->object->getStartCoordinates()) {\n                    $clientAnchorData = '';\n\n                    $recVer            = 0x0;\n                    $recInstance    = 0x0;\n                    $recType        = 0xF010;\n\n                    // start coordinates\n                    list($column, $row) = PHPExcel_Cell::coordinateFromString($this->object->getStartCoordinates());\n                    $c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;\n                    $r1 = $row - 1;\n\n                    // start offsetX\n                    $startOffsetX = $this->object->getStartOffsetX();\n\n                    // start offsetY\n                    $startOffsetY = $this->object->getStartOffsetY();\n\n                    // end coordinates\n                    list($column, $row) = PHPExcel_Cell::coordinateFromString($this->object->getEndCoordinates());\n                    $c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;\n                    $r2 = $row - 1;\n\n                    // end offsetX\n                    $endOffsetX = $this->object->getEndOffsetX();\n\n                    // end offsetY\n                    $endOffsetY = $this->object->getEndOffsetY();\n\n                    $clientAnchorData = pack('vvvvvvvvv', $this->object->getSpFlag(), $c1, $startOffsetX, $r1, $startOffsetY, $c2, $endOffsetX, $r2, $endOffsetY);\n                    \n                    $length            = strlen($clientAnchorData);\n\n                    $recVerInstance  = $recVer;\n                    $recVerInstance |= $recInstance << 4;\n\n                    $header = pack('vvV', $recVerInstance, $recType, $length);\n                    $data .= $header . $clientAnchorData;\n                }\n\n                // the client data, just empty for now\n                if (!$this->object->getSpgr()) {\n                    $clientDataData = '';\n\n                    $recVer            = 0x0;\n                    $recInstance    = 0x0;\n                    $recType        = 0xF011;\n\n                    $length = strlen($clientDataData);\n\n                    $recVerInstance  = $recVer;\n                    $recVerInstance |= $recInstance << 4;\n\n                    $header = pack('vvV', $recVerInstance, $recType, $length);\n                    $data .= $header . $clientDataData;\n                }\n\n                // write the record\n                $recVer            = 0xF;\n                $recInstance    = 0x0000;\n                $recType        = 0xF004;\n                $length            = strlen($data);\n\n                $recVerInstance  = $recVer;\n                $recVerInstance |= $recInstance << 4;\n\n                $header = pack('vvV', $recVerInstance, $recType, $length);\n\n                $this->data = $header . $data;\n                break;\n        }\n\n        return $this->data;\n    }\n\n    /**\n     * Gets the shape offsets\n     *\n     * @return array\n     */\n    public function getSpOffsets()\n    {\n        return $this->spOffsets;\n    }\n\n    /**\n     * Gets the shape types\n     *\n     * @return array\n     */\n    public function getSpTypes()\n    {\n        return $this->spTypes;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5_Font\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel5_Font\n{\n    /**\n     * Color index\n     *\n     * @var int\n     */\n    private $colorIndex;\n\n    /**\n     * Font\n     *\n     * @var PHPExcel_Style_Font\n     */\n    private $font;\n\n    /**\n     * Constructor\n     *\n     * @param PHPExcel_Style_Font $font\n     */\n    public function __construct(PHPExcel_Style_Font $font = null)\n    {\n        $this->colorIndex = 0x7FFF;\n        $this->font = $font;\n    }\n\n    /**\n     * Set the color index\n     *\n     * @param int $colorIndex\n     */\n    public function setColorIndex($colorIndex)\n    {\n        $this->colorIndex = $colorIndex;\n    }\n\n    /**\n     * Get font record data\n     *\n     * @return string\n     */\n    public function writeFont()\n    {\n        $font_outline = 0;\n        $font_shadow = 0;\n\n        $icv = $this->colorIndex; // Index to color palette\n        if ($this->font->getSuperScript()) {\n            $sss = 1;\n        } elseif ($this->font->getSubScript()) {\n            $sss = 2;\n        } else {\n            $sss = 0;\n        }\n        $bFamily = 0; // Font family\n        $bCharSet = PHPExcel_Shared_Font::getCharsetFromFontName($this->font->getName()); // Character set\n\n        $record = 0x31;        // Record identifier\n        $reserved = 0x00;    // Reserved\n        $grbit = 0x00;        // Font attributes\n        if ($this->font->getItalic()) {\n            $grbit |= 0x02;\n        }\n        if ($this->font->getStrikethrough()) {\n            $grbit |= 0x08;\n        }\n        if ($font_outline) {\n            $grbit |= 0x10;\n        }\n        if ($font_shadow) {\n            $grbit |= 0x20;\n        }\n\n        $data = pack(\n            \"vvvvvCCCC\",\n            // Fontsize (in twips)\n            $this->font->getSize() * 20,\n            $grbit,\n            // Colour\n            $icv,\n            // Font weight\n            self::mapBold($this->font->getBold()),\n            // Superscript/Subscript\n            $sss,\n            self::mapUnderline($this->font->getUnderline()),\n            $bFamily,\n            $bCharSet,\n            $reserved\n        );\n        $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($this->font->getName());\n\n        $length = strlen($data);\n        $header = pack(\"vv\", $record, $length);\n\n        return($header . $data);\n    }\n\n    /**\n     * Map to BIFF5-BIFF8 codes for bold\n     *\n     * @param boolean $bold\n     * @return int\n     */\n    private static function mapBold($bold)\n    {\n        if ($bold) {\n            return 0x2BC;  //  700 = Bold font weight\n        }\n        return 0x190;      //  400 = Normal font weight\n    }\n\n    /**\n     * Map of BIFF2-BIFF8 codes for underline styles\n     * @static    array of int\n     *\n     */\n    private static $mapUnderline = array(\n        PHPExcel_Style_Font::UNDERLINE_NONE              => 0x00,\n        PHPExcel_Style_Font::UNDERLINE_SINGLE            => 0x01,\n        PHPExcel_Style_Font::UNDERLINE_DOUBLE            => 0x02,\n        PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING  => 0x21,\n        PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING  => 0x22,\n    );\n\n    /**\n     * Map underline\n     *\n     * @param string\n     * @return int\n     */\n    private static function mapUnderline($underline)\n    {\n        if (isset(self::$mapUnderline[$underline])) {\n            return self::$mapUnderline[$underline];\n        }\n        return 0x00;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5_Parser\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n// Original file header of PEAR::Spreadsheet_Excel_Writer_Parser (used as the base for this class):\n// -----------------------------------------------------------------------------------------\n// *  Class for parsing Excel formulas\n// *\n// *  License Information:\n// *\n// *    Spreadsheet_Excel_Writer:  A library for generating Excel Spreadsheets\n// *    Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com\n// *\n// *    This library is free software; you can redistribute it and/or\n// *    modify it under the terms of the GNU Lesser General Public\n// *    License as published by the Free Software Foundation; either\n// *    version 2.1 of the License, or (at your option) any later version.\n// *\n// *    This library is distributed in the hope that it will be useful,\n// *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n// *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// *    Lesser General Public License for more details.\n// *\n// *    You should have received a copy of the GNU Lesser General Public\n// *    License along with this library; if not, write to the Free Software\n// *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// */\nclass PHPExcel_Writer_Excel5_Parser\n{\n    /**    Constants                */\n    // Sheet title in unquoted form\n    // Invalid sheet title characters cannot occur in the sheet title:\n    //         *:/\\?[]\n    // Moreover, there are valid sheet title characters that cannot occur in unquoted form (there may be more?)\n    // +-% '^&<>=,;#()\"{}\n    const REGEX_SHEET_TITLE_UNQUOTED = '[^\\*\\:\\/\\\\\\\\\\?\\[\\]\\+\\-\\% \\\\\\'\\^\\&\\<\\>\\=\\,\\;\\#\\(\\)\\\"\\{\\}]+';\n\n    // Sheet title in quoted form (without surrounding quotes)\n    // Invalid sheet title characters cannot occur in the sheet title:\n    // *:/\\?[]                    (usual invalid sheet title characters)\n    // Single quote is represented as a pair ''\n    const REGEX_SHEET_TITLE_QUOTED = '(([^\\*\\:\\/\\\\\\\\\\?\\[\\]\\\\\\'])+|(\\\\\\'\\\\\\')+)+';\n\n    /**\n     * The index of the character we are currently looking at\n     * @var integer\n     */\n    public $currentCharacter;\n\n    /**\n     * The token we are working on.\n     * @var string\n     */\n    public $currentToken;\n\n    /**\n     * The formula to parse\n     * @var string\n     */\n    private $formula;\n\n    /**\n     * The character ahead of the current char\n     * @var string\n     */\n    public $lookAhead;\n\n    /**\n     * The parse tree to be generated\n     * @var string\n     */\n    private $parseTree;\n\n    /**\n     * Array of external sheets\n     * @var array\n     */\n    private $externalSheets;\n\n    /**\n     * Array of sheet references in the form of REF structures\n     * @var array\n     */\n    public $references;\n\n    /**\n     * The class constructor\n     *\n     */\n    public function __construct()\n    {\n        $this->currentCharacter  = 0;\n        $this->currentToken = '';       // The token we are working on.\n        $this->formula       = '';       // The formula to parse.\n        $this->lookAhead     = '';       // The character ahead of the current char.\n        $this->parseTree    = '';       // The parse tree to be generated.\n        $this->initializeHashes();      // Initialize the hashes: ptg's and function's ptg's\n        $this->externalSheets = array();\n        $this->references = array();\n    }\n\n    /**\n     * Initialize the ptg and function hashes.\n     *\n     * @access private\n     */\n    private function initializeHashes()\n    {\n        // The Excel ptg indices\n        $this->ptg = array(\n            'ptgExp'       => 0x01,\n            'ptgTbl'       => 0x02,\n            'ptgAdd'       => 0x03,\n            'ptgSub'       => 0x04,\n            'ptgMul'       => 0x05,\n            'ptgDiv'       => 0x06,\n            'ptgPower'     => 0x07,\n            'ptgConcat'    => 0x08,\n            'ptgLT'        => 0x09,\n            'ptgLE'        => 0x0A,\n            'ptgEQ'        => 0x0B,\n            'ptgGE'        => 0x0C,\n            'ptgGT'        => 0x0D,\n            'ptgNE'        => 0x0E,\n            'ptgIsect'     => 0x0F,\n            'ptgUnion'     => 0x10,\n            'ptgRange'     => 0x11,\n            'ptgUplus'     => 0x12,\n            'ptgUminus'    => 0x13,\n            'ptgPercent'   => 0x14,\n            'ptgParen'     => 0x15,\n            'ptgMissArg'   => 0x16,\n            'ptgStr'       => 0x17,\n            'ptgAttr'      => 0x19,\n            'ptgSheet'     => 0x1A,\n            'ptgEndSheet'  => 0x1B,\n            'ptgErr'       => 0x1C,\n            'ptgBool'      => 0x1D,\n            'ptgInt'       => 0x1E,\n            'ptgNum'       => 0x1F,\n            'ptgArray'     => 0x20,\n            'ptgFunc'      => 0x21,\n            'ptgFuncVar'   => 0x22,\n            'ptgName'      => 0x23,\n            'ptgRef'       => 0x24,\n            'ptgArea'      => 0x25,\n            'ptgMemArea'   => 0x26,\n            'ptgMemErr'    => 0x27,\n            'ptgMemNoMem'  => 0x28,\n            'ptgMemFunc'   => 0x29,\n            'ptgRefErr'    => 0x2A,\n            'ptgAreaErr'   => 0x2B,\n            'ptgRefN'      => 0x2C,\n            'ptgAreaN'     => 0x2D,\n            'ptgMemAreaN'  => 0x2E,\n            'ptgMemNoMemN' => 0x2F,\n            'ptgNameX'     => 0x39,\n            'ptgRef3d'     => 0x3A,\n            'ptgArea3d'    => 0x3B,\n            'ptgRefErr3d'  => 0x3C,\n            'ptgAreaErr3d' => 0x3D,\n            'ptgArrayV'    => 0x40,\n            'ptgFuncV'     => 0x41,\n            'ptgFuncVarV'  => 0x42,\n            'ptgNameV'     => 0x43,\n            'ptgRefV'      => 0x44,\n            'ptgAreaV'     => 0x45,\n            'ptgMemAreaV'  => 0x46,\n            'ptgMemErrV'   => 0x47,\n            'ptgMemNoMemV' => 0x48,\n            'ptgMemFuncV'  => 0x49,\n            'ptgRefErrV'   => 0x4A,\n            'ptgAreaErrV'  => 0x4B,\n            'ptgRefNV'     => 0x4C,\n            'ptgAreaNV'    => 0x4D,\n            'ptgMemAreaNV' => 0x4E,\n            'ptgMemNoMemN' => 0x4F,\n            'ptgFuncCEV'   => 0x58,\n            'ptgNameXV'    => 0x59,\n            'ptgRef3dV'    => 0x5A,\n            'ptgArea3dV'   => 0x5B,\n            'ptgRefErr3dV' => 0x5C,\n            'ptgAreaErr3d' => 0x5D,\n            'ptgArrayA'    => 0x60,\n            'ptgFuncA'     => 0x61,\n            'ptgFuncVarA'  => 0x62,\n            'ptgNameA'     => 0x63,\n            'ptgRefA'      => 0x64,\n            'ptgAreaA'     => 0x65,\n            'ptgMemAreaA'  => 0x66,\n            'ptgMemErrA'   => 0x67,\n            'ptgMemNoMemA' => 0x68,\n            'ptgMemFuncA'  => 0x69,\n            'ptgRefErrA'   => 0x6A,\n            'ptgAreaErrA'  => 0x6B,\n            'ptgRefNA'     => 0x6C,\n            'ptgAreaNA'    => 0x6D,\n            'ptgMemAreaNA' => 0x6E,\n            'ptgMemNoMemN' => 0x6F,\n            'ptgFuncCEA'   => 0x78,\n            'ptgNameXA'    => 0x79,\n            'ptgRef3dA'    => 0x7A,\n            'ptgArea3dA'   => 0x7B,\n            'ptgRefErr3dA' => 0x7C,\n            'ptgAreaErr3d' => 0x7D\n        );\n\n        // Thanks to Michael Meeks and Gnumeric for the initial arg values.\n        //\n        // The following hash was generated by \"function_locale.pl\" in the distro.\n        // Refer to function_locale.pl for non-English function names.\n        //\n        // The array elements are as follow:\n        // ptg:   The Excel function ptg code.\n        // args:  The number of arguments that the function takes:\n        //           >=0 is a fixed number of arguments.\n        //           -1  is a variable  number of arguments.\n        // class: The reference, value or array class of the function args.\n        // vol:   The function is volatile.\n        //\n        $this->functions = array(\n            // function                  ptg  args  class  vol\n            'COUNT'           => array(   0,   -1,    0,    0 ),\n            'IF'              => array(   1,   -1,    1,    0 ),\n            'ISNA'            => array(   2,    1,    1,    0 ),\n            'ISERROR'         => array(   3,    1,    1,    0 ),\n            'SUM'             => array(   4,   -1,    0,    0 ),\n            'AVERAGE'         => array(   5,   -1,    0,    0 ),\n            'MIN'             => array(   6,   -1,    0,    0 ),\n            'MAX'             => array(   7,   -1,    0,    0 ),\n            'ROW'             => array(   8,   -1,    0,    0 ),\n            'COLUMN'          => array(   9,   -1,    0,    0 ),\n            'NA'              => array(  10,    0,    0,    0 ),\n            'NPV'             => array(  11,   -1,    1,    0 ),\n            'STDEV'           => array(  12,   -1,    0,    0 ),\n            'DOLLAR'          => array(  13,   -1,    1,    0 ),\n            'FIXED'           => array(  14,   -1,    1,    0 ),\n            'SIN'             => array(  15,    1,    1,    0 ),\n            'COS'             => array(  16,    1,    1,    0 ),\n            'TAN'             => array(  17,    1,    1,    0 ),\n            'ATAN'            => array(  18,    1,    1,    0 ),\n            'PI'              => array(  19,    0,    1,    0 ),\n            'SQRT'            => array(  20,    1,    1,    0 ),\n            'EXP'             => array(  21,    1,    1,    0 ),\n            'LN'              => array(  22,    1,    1,    0 ),\n            'LOG10'           => array(  23,    1,    1,    0 ),\n            'ABS'             => array(  24,    1,    1,    0 ),\n            'INT'             => array(  25,    1,    1,    0 ),\n            'SIGN'            => array(  26,    1,    1,    0 ),\n            'ROUND'           => array(  27,    2,    1,    0 ),\n            'LOOKUP'          => array(  28,   -1,    0,    0 ),\n            'INDEX'           => array(  29,   -1,    0,    1 ),\n            'REPT'            => array(  30,    2,    1,    0 ),\n            'MID'             => array(  31,    3,    1,    0 ),\n            'LEN'             => array(  32,    1,    1,    0 ),\n            'VALUE'           => array(  33,    1,    1,    0 ),\n            'TRUE'            => array(  34,    0,    1,    0 ),\n            'FALSE'           => array(  35,    0,    1,    0 ),\n            'AND'             => array(  36,   -1,    0,    0 ),\n            'OR'              => array(  37,   -1,    0,    0 ),\n            'NOT'             => array(  38,    1,    1,    0 ),\n            'MOD'             => array(  39,    2,    1,    0 ),\n            'DCOUNT'          => array(  40,    3,    0,    0 ),\n            'DSUM'            => array(  41,    3,    0,    0 ),\n            'DAVERAGE'        => array(  42,    3,    0,    0 ),\n            'DMIN'            => array(  43,    3,    0,    0 ),\n            'DMAX'            => array(  44,    3,    0,    0 ),\n            'DSTDEV'          => array(  45,    3,    0,    0 ),\n            'VAR'             => array(  46,   -1,    0,    0 ),\n            'DVAR'            => array(  47,    3,    0,    0 ),\n            'TEXT'            => array(  48,    2,    1,    0 ),\n            'LINEST'          => array(  49,   -1,    0,    0 ),\n            'TREND'           => array(  50,   -1,    0,    0 ),\n            'LOGEST'          => array(  51,   -1,    0,    0 ),\n            'GROWTH'          => array(  52,   -1,    0,    0 ),\n            'PV'              => array(  56,   -1,    1,    0 ),\n            'FV'              => array(  57,   -1,    1,    0 ),\n            'NPER'            => array(  58,   -1,    1,    0 ),\n            'PMT'             => array(  59,   -1,    1,    0 ),\n            'RATE'            => array(  60,   -1,    1,    0 ),\n            'MIRR'            => array(  61,    3,    0,    0 ),\n            'IRR'             => array(  62,   -1,    0,    0 ),\n            'RAND'            => array(  63,    0,    1,    1 ),\n            'MATCH'           => array(  64,   -1,    0,    0 ),\n            'DATE'            => array(  65,    3,    1,    0 ),\n            'TIME'            => array(  66,    3,    1,    0 ),\n            'DAY'             => array(  67,    1,    1,    0 ),\n            'MONTH'           => array(  68,    1,    1,    0 ),\n            'YEAR'            => array(  69,    1,    1,    0 ),\n            'WEEKDAY'         => array(  70,   -1,    1,    0 ),\n            'HOUR'            => array(  71,    1,    1,    0 ),\n            'MINUTE'          => array(  72,    1,    1,    0 ),\n            'SECOND'          => array(  73,    1,    1,    0 ),\n            'NOW'             => array(  74,    0,    1,    1 ),\n            'AREAS'           => array(  75,    1,    0,    1 ),\n            'ROWS'            => array(  76,    1,    0,    1 ),\n            'COLUMNS'         => array(  77,    1,    0,    1 ),\n            'OFFSET'          => array(  78,   -1,    0,    1 ),\n            'SEARCH'          => array(  82,   -1,    1,    0 ),\n            'TRANSPOSE'       => array(  83,    1,    1,    0 ),\n            'TYPE'            => array(  86,    1,    1,    0 ),\n            'ATAN2'           => array(  97,    2,    1,    0 ),\n            'ASIN'            => array(  98,    1,    1,    0 ),\n            'ACOS'            => array(  99,    1,    1,    0 ),\n            'CHOOSE'          => array( 100,   -1,    1,    0 ),\n            'HLOOKUP'         => array( 101,   -1,    0,    0 ),\n            'VLOOKUP'         => array( 102,   -1,    0,    0 ),\n            'ISREF'           => array( 105,    1,    0,    0 ),\n            'LOG'             => array( 109,   -1,    1,    0 ),\n            'CHAR'            => array( 111,    1,    1,    0 ),\n            'LOWER'           => array( 112,    1,    1,    0 ),\n            'UPPER'           => array( 113,    1,    1,    0 ),\n            'PROPER'          => array( 114,    1,    1,    0 ),\n            'LEFT'            => array( 115,   -1,    1,    0 ),\n            'RIGHT'           => array( 116,   -1,    1,    0 ),\n            'EXACT'           => array( 117,    2,    1,    0 ),\n            'TRIM'            => array( 118,    1,    1,    0 ),\n            'REPLACE'         => array( 119,    4,    1,    0 ),\n            'SUBSTITUTE'      => array( 120,   -1,    1,    0 ),\n            'CODE'            => array( 121,    1,    1,    0 ),\n            'FIND'            => array( 124,   -1,    1,    0 ),\n            'CELL'            => array( 125,   -1,    0,    1 ),\n            'ISERR'           => array( 126,    1,    1,    0 ),\n            'ISTEXT'          => array( 127,    1,    1,    0 ),\n            'ISNUMBER'        => array( 128,    1,    1,    0 ),\n            'ISBLANK'         => array( 129,    1,    1,    0 ),\n            'T'               => array( 130,    1,    0,    0 ),\n            'N'               => array( 131,    1,    0,    0 ),\n            'DATEVALUE'       => array( 140,    1,    1,    0 ),\n            'TIMEVALUE'       => array( 141,    1,    1,    0 ),\n            'SLN'             => array( 142,    3,    1,    0 ),\n            'SYD'             => array( 143,    4,    1,    0 ),\n            'DDB'             => array( 144,   -1,    1,    0 ),\n            'INDIRECT'        => array( 148,   -1,    1,    1 ),\n            'CALL'            => array( 150,   -1,    1,    0 ),\n            'CLEAN'           => array( 162,    1,    1,    0 ),\n            'MDETERM'         => array( 163,    1,    2,    0 ),\n            'MINVERSE'        => array( 164,    1,    2,    0 ),\n            'MMULT'           => array( 165,    2,    2,    0 ),\n            'IPMT'            => array( 167,   -1,    1,    0 ),\n            'PPMT'            => array( 168,   -1,    1,    0 ),\n            'COUNTA'          => array( 169,   -1,    0,    0 ),\n            'PRODUCT'         => array( 183,   -1,    0,    0 ),\n            'FACT'            => array( 184,    1,    1,    0 ),\n            'DPRODUCT'        => array( 189,    3,    0,    0 ),\n            'ISNONTEXT'       => array( 190,    1,    1,    0 ),\n            'STDEVP'          => array( 193,   -1,    0,    0 ),\n            'VARP'            => array( 194,   -1,    0,    0 ),\n            'DSTDEVP'         => array( 195,    3,    0,    0 ),\n            'DVARP'           => array( 196,    3,    0,    0 ),\n            'TRUNC'           => array( 197,   -1,    1,    0 ),\n            'ISLOGICAL'       => array( 198,    1,    1,    0 ),\n            'DCOUNTA'         => array( 199,    3,    0,    0 ),\n            'USDOLLAR'        => array( 204,   -1,    1,    0 ),\n            'FINDB'           => array( 205,   -1,    1,    0 ),\n            'SEARCHB'         => array( 206,   -1,    1,    0 ),\n            'REPLACEB'        => array( 207,    4,    1,    0 ),\n            'LEFTB'           => array( 208,   -1,    1,    0 ),\n            'RIGHTB'          => array( 209,   -1,    1,    0 ),\n            'MIDB'            => array( 210,    3,    1,    0 ),\n            'LENB'            => array( 211,    1,    1,    0 ),\n            'ROUNDUP'         => array( 212,    2,    1,    0 ),\n            'ROUNDDOWN'       => array( 213,    2,    1,    0 ),\n            'ASC'             => array( 214,    1,    1,    0 ),\n            'DBCS'            => array( 215,    1,    1,    0 ),\n            'RANK'            => array( 216,   -1,    0,    0 ),\n            'ADDRESS'         => array( 219,   -1,    1,    0 ),\n            'DAYS360'         => array( 220,   -1,    1,    0 ),\n            'TODAY'           => array( 221,    0,    1,    1 ),\n            'VDB'             => array( 222,   -1,    1,    0 ),\n            'MEDIAN'          => array( 227,   -1,    0,    0 ),\n            'SUMPRODUCT'      => array( 228,   -1,    2,    0 ),\n            'SINH'            => array( 229,    1,    1,    0 ),\n            'COSH'            => array( 230,    1,    1,    0 ),\n            'TANH'            => array( 231,    1,    1,    0 ),\n            'ASINH'           => array( 232,    1,    1,    0 ),\n            'ACOSH'           => array( 233,    1,    1,    0 ),\n            'ATANH'           => array( 234,    1,    1,    0 ),\n            'DGET'            => array( 235,    3,    0,    0 ),\n            'INFO'            => array( 244,    1,    1,    1 ),\n            'DB'              => array( 247,   -1,    1,    0 ),\n            'FREQUENCY'       => array( 252,    2,    0,    0 ),\n            'ERROR.TYPE'      => array( 261,    1,    1,    0 ),\n            'REGISTER.ID'     => array( 267,   -1,    1,    0 ),\n            'AVEDEV'          => array( 269,   -1,    0,    0 ),\n            'BETADIST'        => array( 270,   -1,    1,    0 ),\n            'GAMMALN'         => array( 271,    1,    1,    0 ),\n            'BETAINV'         => array( 272,   -1,    1,    0 ),\n            'BINOMDIST'       => array( 273,    4,    1,    0 ),\n            'CHIDIST'         => array( 274,    2,    1,    0 ),\n            'CHIINV'          => array( 275,    2,    1,    0 ),\n            'COMBIN'          => array( 276,    2,    1,    0 ),\n            'CONFIDENCE'      => array( 277,    3,    1,    0 ),\n            'CRITBINOM'       => array( 278,    3,    1,    0 ),\n            'EVEN'            => array( 279,    1,    1,    0 ),\n            'EXPONDIST'       => array( 280,    3,    1,    0 ),\n            'FDIST'           => array( 281,    3,    1,    0 ),\n            'FINV'            => array( 282,    3,    1,    0 ),\n            'FISHER'          => array( 283,    1,    1,    0 ),\n            'FISHERINV'       => array( 284,    1,    1,    0 ),\n            'FLOOR'           => array( 285,    2,    1,    0 ),\n            'GAMMADIST'       => array( 286,    4,    1,    0 ),\n            'GAMMAINV'        => array( 287,    3,    1,    0 ),\n            'CEILING'         => array( 288,    2,    1,    0 ),\n            'HYPGEOMDIST'     => array( 289,    4,    1,    0 ),\n            'LOGNORMDIST'     => array( 290,    3,    1,    0 ),\n            'LOGINV'          => array( 291,    3,    1,    0 ),\n            'NEGBINOMDIST'    => array( 292,    3,    1,    0 ),\n            'NORMDIST'        => array( 293,    4,    1,    0 ),\n            'NORMSDIST'       => array( 294,    1,    1,    0 ),\n            'NORMINV'         => array( 295,    3,    1,    0 ),\n            'NORMSINV'        => array( 296,    1,    1,    0 ),\n            'STANDARDIZE'     => array( 297,    3,    1,    0 ),\n            'ODD'             => array( 298,    1,    1,    0 ),\n            'PERMUT'          => array( 299,    2,    1,    0 ),\n            'POISSON'         => array( 300,    3,    1,    0 ),\n            'TDIST'           => array( 301,    3,    1,    0 ),\n            'WEIBULL'         => array( 302,    4,    1,    0 ),\n            'SUMXMY2'         => array( 303,    2,    2,    0 ),\n            'SUMX2MY2'        => array( 304,    2,    2,    0 ),\n            'SUMX2PY2'        => array( 305,    2,    2,    0 ),\n            'CHITEST'         => array( 306,    2,    2,    0 ),\n            'CORREL'          => array( 307,    2,    2,    0 ),\n            'COVAR'           => array( 308,    2,    2,    0 ),\n            'FORECAST'        => array( 309,    3,    2,    0 ),\n            'FTEST'           => array( 310,    2,    2,    0 ),\n            'INTERCEPT'       => array( 311,    2,    2,    0 ),\n            'PEARSON'         => array( 312,    2,    2,    0 ),\n            'RSQ'             => array( 313,    2,    2,    0 ),\n            'STEYX'           => array( 314,    2,    2,    0 ),\n            'SLOPE'           => array( 315,    2,    2,    0 ),\n            'TTEST'           => array( 316,    4,    2,    0 ),\n            'PROB'            => array( 317,   -1,    2,    0 ),\n            'DEVSQ'           => array( 318,   -1,    0,    0 ),\n            'GEOMEAN'         => array( 319,   -1,    0,    0 ),\n            'HARMEAN'         => array( 320,   -1,    0,    0 ),\n            'SUMSQ'           => array( 321,   -1,    0,    0 ),\n            'KURT'            => array( 322,   -1,    0,    0 ),\n            'SKEW'            => array( 323,   -1,    0,    0 ),\n            'ZTEST'           => array( 324,   -1,    0,    0 ),\n            'LARGE'           => array( 325,    2,    0,    0 ),\n            'SMALL'           => array( 326,    2,    0,    0 ),\n            'QUARTILE'        => array( 327,    2,    0,    0 ),\n            'PERCENTILE'      => array( 328,    2,    0,    0 ),\n            'PERCENTRANK'     => array( 329,   -1,    0,    0 ),\n            'MODE'            => array( 330,   -1,    2,    0 ),\n            'TRIMMEAN'        => array( 331,    2,    0,    0 ),\n            'TINV'            => array( 332,    2,    1,    0 ),\n            'CONCATENATE'     => array( 336,   -1,    1,    0 ),\n            'POWER'           => array( 337,    2,    1,    0 ),\n            'RADIANS'         => array( 342,    1,    1,    0 ),\n            'DEGREES'         => array( 343,    1,    1,    0 ),\n            'SUBTOTAL'        => array( 344,   -1,    0,    0 ),\n            'SUMIF'           => array( 345,   -1,    0,    0 ),\n            'COUNTIF'         => array( 346,    2,    0,    0 ),\n            'COUNTBLANK'      => array( 347,    1,    0,    0 ),\n            'ISPMT'           => array( 350,    4,    1,    0 ),\n            'DATEDIF'         => array( 351,    3,    1,    0 ),\n            'DATESTRING'      => array( 352,    1,    1,    0 ),\n            'NUMBERSTRING'    => array( 353,    2,    1,    0 ),\n            'ROMAN'           => array( 354,   -1,    1,    0 ),\n            'GETPIVOTDATA'    => array( 358,   -1,    0,    0 ),\n            'HYPERLINK'       => array( 359,   -1,    1,    0 ),\n            'PHONETIC'        => array( 360,    1,    0,    0 ),\n            'AVERAGEA'        => array( 361,   -1,    0,    0 ),\n            'MAXA'            => array( 362,   -1,    0,    0 ),\n            'MINA'            => array( 363,   -1,    0,    0 ),\n            'STDEVPA'         => array( 364,   -1,    0,    0 ),\n            'VARPA'           => array( 365,   -1,    0,    0 ),\n            'STDEVA'          => array( 366,   -1,    0,    0 ),\n            'VARA'            => array( 367,   -1,    0,    0 ),\n            'BAHTTEXT'        => array( 368,    1,    0,    0 ),\n        );\n    }\n\n    /**\n     * Convert a token to the proper ptg value.\n     *\n     * @access private\n     * @param mixed $token The token to convert.\n     * @return mixed the converted token on success\n     */\n    private function convert($token)\n    {\n        if (preg_match(\"/\\\"([^\\\"]|\\\"\\\"){0,255}\\\"/\", $token)) {\n            return $this->convertString($token);\n\n        } elseif (is_numeric($token)) {\n            return $this->convertNumber($token);\n\n        // match references like A1 or $A$1\n        } elseif (preg_match('/^\\$?([A-Ia-i]?[A-Za-z])\\$?(\\d+)$/', $token)) {\n            return $this->convertRef2d($token);\n\n        // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1\n        } elseif (preg_match(\"/^\" . self::REGEX_SHEET_TITLE_UNQUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_UNQUOTED . \")?\\!\\\\$?[A-Ia-i]?[A-Za-z]\\\\$?(\\d+)$/u\", $token)) {\n            return $this->convertRef3d($token);\n\n        // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1\n        } elseif (preg_match(\"/^'\" . self::REGEX_SHEET_TITLE_QUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_QUOTED . \")?'\\!\\\\$?[A-Ia-i]?[A-Za-z]\\\\$?(\\d+)$/u\", $token)) {\n            return $this->convertRef3d($token);\n\n        // match ranges like A1:B2 or $A$1:$B$2\n        } elseif (preg_match('/^(\\$)?[A-Ia-i]?[A-Za-z](\\$)?(\\d+)\\:(\\$)?[A-Ia-i]?[A-Za-z](\\$)?(\\d+)$/', $token)) {\n            return $this->convertRange2d($token);\n\n        // match external ranges like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2\n        } elseif (preg_match(\"/^\" . self::REGEX_SHEET_TITLE_UNQUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_UNQUOTED . \")?\\!\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?(\\d+)\\:\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?(\\d+)$/u\", $token)) {\n            return $this->convertRange3d($token);\n\n        // match external ranges like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2\n        } elseif (preg_match(\"/^'\" . self::REGEX_SHEET_TITLE_QUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_QUOTED . \")?'\\!\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?(\\d+)\\:\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?(\\d+)$/u\", $token)) {\n            return $this->convertRange3d($token);\n\n        // operators (including parentheses)\n        } elseif (isset($this->ptg[$token])) {\n            return pack(\"C\", $this->ptg[$token]);\n\n        // match error codes\n        } elseif (preg_match(\"/^#[A-Z0\\/]{3,5}[!?]{1}$/\", $token) or $token == '#N/A') {\n            return $this->convertError($token);\n\n        // commented so argument number can be processed correctly. See toReversePolish().\n        /*elseif (preg_match(\"/[A-Z0-9\\xc0-\\xdc\\.]+/\", $token))\n        {\n            return($this->convertFunction($token, $this->_func_args));\n        }*/\n\n        // if it's an argument, ignore the token (the argument remains)\n        } elseif ($token == 'arg') {\n            return '';\n        }\n\n        // TODO: use real error codes\n        throw new PHPExcel_Writer_Exception(\"Unknown token $token\");\n    }\n\n    /**\n     * Convert a number token to ptgInt or ptgNum\n     *\n     * @access private\n     * @param mixed $num an integer or double for conversion to its ptg value\n     */\n    private function convertNumber($num)\n    {\n        // Integer in the range 0..2**16-1\n        if ((preg_match(\"/^\\d+$/\", $num)) and ($num <= 65535)) {\n            return pack(\"Cv\", $this->ptg['ptgInt'], $num);\n        } else { // A float\n            if (PHPExcel_Writer_Excel5_BIFFwriter::getByteOrder()) { // if it's Big Endian\n                $num = strrev($num);\n            }\n            return pack(\"Cd\", $this->ptg['ptgNum'], $num);\n        }\n    }\n\n    /**\n     * Convert a string token to ptgStr\n     *\n     * @access private\n     * @param string $string A string for conversion to its ptg value.\n     * @return mixed the converted token on success\n     */\n    private function convertString($string)\n    {\n        // chop away beggining and ending quotes\n        $string = substr($string, 1, strlen($string) - 2);\n        if (strlen($string) > 255) {\n            throw new PHPExcel_Writer_Exception(\"String is too long\");\n        }\n\n        return pack('C', $this->ptg['ptgStr']) . PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($string);\n    }\n\n    /**\n     * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of\n     * args that it takes.\n     *\n     * @access private\n     * @param string  $token    The name of the function for convertion to ptg value.\n     * @param integer $num_args The number of arguments the function receives.\n     * @return string The packed ptg for the function\n     */\n    private function convertFunction($token, $num_args)\n    {\n        $args     = $this->functions[$token][1];\n//        $volatile = $this->functions[$token][3];\n\n        // Fixed number of args eg. TIME($i, $j, $k).\n        if ($args >= 0) {\n            return pack(\"Cv\", $this->ptg['ptgFuncV'], $this->functions[$token][0]);\n        }\n        // Variable number of args eg. SUM($i, $j, $k, ..).\n        if ($args == -1) {\n            return pack(\"CCv\", $this->ptg['ptgFuncVarV'], $num_args, $this->functions[$token][0]);\n        }\n    }\n\n    /**\n     * Convert an Excel range such as A1:D4 to a ptgRefV.\n     *\n     * @access private\n     * @param string    $range    An Excel range in the A1:A2\n     * @param int        $class\n     */\n    private function convertRange2d($range, $class = 0)\n    {\n\n        // TODO: possible class value 0,1,2 check Formula.pm\n        // Split the range into 2 cell refs\n        if (preg_match('/^(\\$)?([A-Ia-i]?[A-Za-z])(\\$)?(\\d+)\\:(\\$)?([A-Ia-i]?[A-Za-z])(\\$)?(\\d+)$/', $range)) {\n            list($cell1, $cell2) = explode(':', $range);\n        } else {\n            // TODO: use real error codes\n            throw new PHPExcel_Writer_Exception(\"Unknown range separator\");\n        }\n\n        // Convert the cell references\n        list($row1, $col1) = $this->cellToPackedRowcol($cell1);\n        list($row2, $col2) = $this->cellToPackedRowcol($cell2);\n\n        // The ptg value depends on the class of the ptg.\n        if ($class == 0) {\n            $ptgArea = pack(\"C\", $this->ptg['ptgArea']);\n        } elseif ($class == 1) {\n            $ptgArea = pack(\"C\", $this->ptg['ptgAreaV']);\n        } elseif ($class == 2) {\n            $ptgArea = pack(\"C\", $this->ptg['ptgAreaA']);\n        } else {\n            // TODO: use real error codes\n            throw new PHPExcel_Writer_Exception(\"Unknown class $class\");\n        }\n        return $ptgArea . $row1 . $row2 . $col1. $col2;\n    }\n\n    /**\n     * Convert an Excel 3d range such as \"Sheet1!A1:D4\" or \"Sheet1:Sheet2!A1:D4\" to\n     * a ptgArea3d.\n     *\n     * @access private\n     * @param string $token An Excel range in the Sheet1!A1:A2 format.\n     * @return mixed The packed ptgArea3d token on success.\n     */\n    private function convertRange3d($token)\n    {\n//        $class = 0; // formulas like Sheet1!$A$1:$A$2 in list type data validation need this class (0x3B)\n\n        // Split the ref at the ! symbol\n        list($ext_ref, $range) = explode('!', $token);\n\n        // Convert the external reference part (different for BIFF8)\n        $ext_ref = $this->getRefIndex($ext_ref);\n\n        // Split the range into 2 cell refs\n        list($cell1, $cell2) = explode(':', $range);\n\n        // Convert the cell references\n        if (preg_match(\"/^(\\\\$)?[A-Ia-i]?[A-Za-z](\\\\$)?(\\d+)$/\", $cell1)) {\n            list($row1, $col1) = $this->cellToPackedRowcol($cell1);\n            list($row2, $col2) = $this->cellToPackedRowcol($cell2);\n        } else { // It's a rows range (like 26:27)\n             list($row1, $col1, $row2, $col2) = $this->rangeToPackedRange($cell1.':'.$cell2);\n        }\n\n        // The ptg value depends on the class of the ptg.\n//        if ($class == 0) {\n            $ptgArea = pack(\"C\", $this->ptg['ptgArea3d']);\n//        } elseif ($class == 1) {\n//            $ptgArea = pack(\"C\", $this->ptg['ptgArea3dV']);\n//        } elseif ($class == 2) {\n//            $ptgArea = pack(\"C\", $this->ptg['ptgArea3dA']);\n//        } else {\n//            throw new PHPExcel_Writer_Exception(\"Unknown class $class\");\n//        }\n\n        return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2;\n    }\n\n    /**\n     * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV.\n     *\n     * @access private\n     * @param string $cell An Excel cell reference\n     * @return string The cell in packed() format with the corresponding ptg\n     */\n    private function convertRef2d($cell)\n    {\n//        $class = 2; // as far as I know, this is magick.\n\n        // Convert the cell reference\n        $cell_array = $this->cellToPackedRowcol($cell);\n        list($row, $col) = $cell_array;\n\n        // The ptg value depends on the class of the ptg.\n//        if ($class == 0) {\n//            $ptgRef = pack(\"C\", $this->ptg['ptgRef']);\n//        } elseif ($class == 1) {\n//            $ptgRef = pack(\"C\", $this->ptg['ptgRefV']);\n//        } elseif ($class == 2) {\n            $ptgRef = pack(\"C\", $this->ptg['ptgRefA']);\n//        } else {\n//            // TODO: use real error codes\n//            throw new PHPExcel_Writer_Exception(\"Unknown class $class\");\n//        }\n        return $ptgRef.$row.$col;\n    }\n\n    /**\n     * Convert an Excel 3d reference such as \"Sheet1!A1\" or \"Sheet1:Sheet2!A1\" to a\n     * ptgRef3d.\n     *\n     * @access private\n     * @param string $cell An Excel cell reference\n     * @return mixed The packed ptgRef3d token on success.\n     */\n    private function convertRef3d($cell)\n    {\n//        $class = 2; // as far as I know, this is magick.\n\n        // Split the ref at the ! symbol\n        list($ext_ref, $cell) = explode('!', $cell);\n\n        // Convert the external reference part (different for BIFF8)\n        $ext_ref = $this->getRefIndex($ext_ref);\n\n        // Convert the cell reference part\n        list($row, $col) = $this->cellToPackedRowcol($cell);\n\n        // The ptg value depends on the class of the ptg.\n//        if ($class == 0) {\n//            $ptgRef = pack(\"C\", $this->ptg['ptgRef3d']);\n//        } elseif ($class == 1) {\n//            $ptgRef = pack(\"C\", $this->ptg['ptgRef3dV']);\n//        } elseif ($class == 2) {\n            $ptgRef = pack(\"C\", $this->ptg['ptgRef3dA']);\n//        } else {\n//            throw new PHPExcel_Writer_Exception(\"Unknown class $class\");\n//        }\n\n        return $ptgRef . $ext_ref. $row . $col;\n    }\n\n    /**\n     * Convert an error code to a ptgErr\n     *\n     * @access    private\n     * @param    string    $errorCode    The error code for conversion to its ptg value\n     * @return    string                The error code ptgErr\n     */\n    private function convertError($errorCode)\n    {\n        switch ($errorCode) {\n            case '#NULL!':\n                return pack(\"C\", 0x00);\n            case '#DIV/0!':\n                return pack(\"C\", 0x07);\n            case '#VALUE!':\n                return pack(\"C\", 0x0F);\n            case '#REF!':\n                return pack(\"C\", 0x17);\n            case '#NAME?':\n                return pack(\"C\", 0x1D);\n            case '#NUM!':\n                return pack(\"C\", 0x24);\n            case '#N/A':\n                return pack(\"C\", 0x2A);\n        }\n        return pack(\"C\", 0xFF);\n    }\n\n    /**\n     * Convert the sheet name part of an external reference, for example \"Sheet1\" or\n     * \"Sheet1:Sheet2\", to a packed structure.\n     *\n     * @access    private\n     * @param    string    $ext_ref    The name of the external reference\n     * @return    string                The reference index in packed() format\n     */\n    private function packExtRef($ext_ref)\n    {\n        $ext_ref = preg_replace(\"/^'/\", '', $ext_ref); // Remove leading  ' if any.\n        $ext_ref = preg_replace(\"/'$/\", '', $ext_ref); // Remove trailing ' if any.\n\n        // Check if there is a sheet range eg., Sheet1:Sheet2.\n        if (preg_match(\"/:/\", $ext_ref)) {\n            list($sheet_name1, $sheet_name2) = explode(':', $ext_ref);\n\n            $sheet1 = $this->getSheetIndex($sheet_name1);\n            if ($sheet1 == -1) {\n                throw new PHPExcel_Writer_Exception(\"Unknown sheet name $sheet_name1 in formula\");\n            }\n            $sheet2 = $this->getSheetIndex($sheet_name2);\n            if ($sheet2 == -1) {\n                throw new PHPExcel_Writer_Exception(\"Unknown sheet name $sheet_name2 in formula\");\n            }\n\n            // Reverse max and min sheet numbers if necessary\n            if ($sheet1 > $sheet2) {\n                list($sheet1, $sheet2) = array($sheet2, $sheet1);\n            }\n        } else { // Single sheet name only.\n            $sheet1 = $this->getSheetIndex($ext_ref);\n            if ($sheet1 == -1) {\n                throw new PHPExcel_Writer_Exception(\"Unknown sheet name $ext_ref in formula\");\n            }\n            $sheet2 = $sheet1;\n        }\n\n        // References are stored relative to 0xFFFF.\n        $offset = -1 - $sheet1;\n\n        return pack('vdvv', $offset, 0x00, $sheet1, $sheet2);\n    }\n\n    /**\n     * Look up the REF index that corresponds to an external sheet name\n     * (or range). If it doesn't exist yet add it to the workbook's references\n     * array. It assumes all sheet names given must exist.\n     *\n     * @access private\n     * @param string $ext_ref The name of the external reference\n     * @return mixed The reference index in packed() format on success\n     */\n    private function getRefIndex($ext_ref)\n    {\n        $ext_ref = preg_replace(\"/^'/\", '', $ext_ref); // Remove leading  ' if any.\n        $ext_ref = preg_replace(\"/'$/\", '', $ext_ref); // Remove trailing ' if any.\n        $ext_ref = str_replace('\\'\\'', '\\'', $ext_ref); // Replace escaped '' with '\n\n        // Check if there is a sheet range eg., Sheet1:Sheet2.\n        if (preg_match(\"/:/\", $ext_ref)) {\n            list($sheet_name1, $sheet_name2) = explode(':', $ext_ref);\n\n            $sheet1 = $this->getSheetIndex($sheet_name1);\n            if ($sheet1 == -1) {\n                throw new PHPExcel_Writer_Exception(\"Unknown sheet name $sheet_name1 in formula\");\n            }\n            $sheet2 = $this->getSheetIndex($sheet_name2);\n            if ($sheet2 == -1) {\n                throw new PHPExcel_Writer_Exception(\"Unknown sheet name $sheet_name2 in formula\");\n            }\n\n            // Reverse max and min sheet numbers if necessary\n            if ($sheet1 > $sheet2) {\n                list($sheet1, $sheet2) = array($sheet2, $sheet1);\n            }\n        } else { // Single sheet name only.\n            $sheet1 = $this->getSheetIndex($ext_ref);\n            if ($sheet1 == -1) {\n                throw new PHPExcel_Writer_Exception(\"Unknown sheet name $ext_ref in formula\");\n            }\n            $sheet2 = $sheet1;\n        }\n\n        // assume all references belong to this document\n        $supbook_index = 0x00;\n        $ref = pack('vvv', $supbook_index, $sheet1, $sheet2);\n        $totalreferences = count($this->references);\n        $index = -1;\n        for ($i = 0; $i < $totalreferences; ++$i) {\n            if ($ref == $this->references[$i]) {\n                $index = $i;\n                break;\n            }\n        }\n        // if REF was not found add it to references array\n        if ($index == -1) {\n            $this->references[$totalreferences] = $ref;\n            $index = $totalreferences;\n        }\n\n        return pack('v', $index);\n    }\n\n    /**\n     * Look up the index that corresponds to an external sheet name. The hash of\n     * sheet names is updated by the addworksheet() method of the\n     * PHPExcel_Writer_Excel5_Workbook class.\n     *\n     * @access    private\n     * @param    string    $sheet_name        Sheet name\n     * @return    integer                    The sheet index, -1 if the sheet was not found\n     */\n    private function getSheetIndex($sheet_name)\n    {\n        if (!isset($this->externalSheets[$sheet_name])) {\n            return -1;\n        } else {\n            return $this->externalSheets[$sheet_name];\n        }\n    }\n\n    /**\n     * This method is used to update the array of sheet names. It is\n     * called by the addWorksheet() method of the\n     * PHPExcel_Writer_Excel5_Workbook class.\n     *\n     * @access public\n     * @see PHPExcel_Writer_Excel5_Workbook::addWorksheet()\n     * @param string  $name  The name of the worksheet being added\n     * @param integer $index The index of the worksheet being added\n     */\n    public function setExtSheet($name, $index)\n    {\n        $this->externalSheets[$name] = $index;\n    }\n\n    /**\n     * pack() row and column into the required 3 or 4 byte format.\n     *\n     * @access private\n     * @param string $cell The Excel cell reference to be packed\n     * @return array Array containing the row and column in packed() format\n     */\n    private function cellToPackedRowcol($cell)\n    {\n        $cell = strtoupper($cell);\n        list($row, $col, $row_rel, $col_rel) = $this->cellToRowcol($cell);\n        if ($col >= 256) {\n            throw new PHPExcel_Writer_Exception(\"Column in: $cell greater than 255\");\n        }\n        if ($row >= 65536) {\n            throw new PHPExcel_Writer_Exception(\"Row in: $cell greater than 65536 \");\n        }\n\n        // Set the high bits to indicate if row or col are relative.\n        $col |= $col_rel << 14;\n        $col |= $row_rel << 15;\n        $col = pack('v', $col);\n\n        $row = pack('v', $row);\n\n        return array($row, $col);\n    }\n\n    /**\n     * pack() row range into the required 3 or 4 byte format.\n     * Just using maximum col/rows, which is probably not the correct solution\n     *\n     * @access private\n     * @param string $range The Excel range to be packed\n     * @return array Array containing (row1,col1,row2,col2) in packed() format\n     */\n    private function rangeToPackedRange($range)\n    {\n        preg_match('/(\\$)?(\\d+)\\:(\\$)?(\\d+)/', $range, $match);\n        // return absolute rows if there is a $ in the ref\n        $row1_rel = empty($match[1]) ? 1 : 0;\n        $row1     = $match[2];\n        $row2_rel = empty($match[3]) ? 1 : 0;\n        $row2     = $match[4];\n        // Convert 1-index to zero-index\n        --$row1;\n        --$row2;\n        // Trick poor inocent Excel\n        $col1 = 0;\n        $col2 = 65535; // FIXME: maximum possible value for Excel 5 (change this!!!)\n\n        // FIXME: this changes for BIFF8\n        if (($row1 >= 65536) or ($row2 >= 65536)) {\n            throw new PHPExcel_Writer_Exception(\"Row in: $range greater than 65536 \");\n        }\n\n        // Set the high bits to indicate if rows are relative.\n        $col1 |= $row1_rel << 15;\n        $col2 |= $row2_rel << 15;\n        $col1 = pack('v', $col1);\n        $col2 = pack('v', $col2);\n\n        $row1 = pack('v', $row1);\n        $row2 = pack('v', $row2);\n\n        return array($row1, $col1, $row2, $col2);\n    }\n\n    /**\n     * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero\n     * indexed row and column number. Also returns two (0,1) values to indicate\n     * whether the row or column are relative references.\n     *\n     * @access private\n     * @param string $cell The Excel cell reference in A1 format.\n     * @return array\n     */\n    private function cellToRowcol($cell)\n    {\n        preg_match('/(\\$)?([A-I]?[A-Z])(\\$)?(\\d+)/', $cell, $match);\n        // return absolute column if there is a $ in the ref\n        $col_rel = empty($match[1]) ? 1 : 0;\n        $col_ref = $match[2];\n        $row_rel = empty($match[3]) ? 1 : 0;\n        $row     = $match[4];\n\n        // Convert base26 column string to a number.\n        $expn = strlen($col_ref) - 1;\n        $col  = 0;\n        $col_ref_length = strlen($col_ref);\n        for ($i = 0; $i < $col_ref_length; ++$i) {\n            $col += (ord($col_ref{$i}) - 64) * pow(26, $expn);\n            --$expn;\n        }\n\n        // Convert 1-index to zero-index\n        --$row;\n        --$col;\n\n        return array($row, $col, $row_rel, $col_rel);\n    }\n\n    /**\n     * Advance to the next valid token.\n     *\n     * @access private\n     */\n    private function advance()\n    {\n        $i = $this->currentCharacter;\n        $formula_length = strlen($this->formula);\n        // eat up white spaces\n        if ($i < $formula_length) {\n            while ($this->formula{$i} == \" \") {\n                ++$i;\n            }\n\n            if ($i < ($formula_length - 1)) {\n                $this->lookAhead = $this->formula{$i+1};\n            }\n            $token = '';\n        }\n\n        while ($i < $formula_length) {\n            $token .= $this->formula{$i};\n\n            if ($i < ($formula_length - 1)) {\n                $this->lookAhead = $this->formula{$i+1};\n            } else {\n                $this->lookAhead = '';\n            }\n\n            if ($this->match($token) != '') {\n                //if ($i < strlen($this->formula) - 1) {\n                //    $this->lookAhead = $this->formula{$i+1};\n                //}\n                $this->currentCharacter = $i + 1;\n                $this->currentToken = $token;\n                return 1;\n            }\n\n            if ($i < ($formula_length - 2)) {\n                $this->lookAhead = $this->formula{$i+2};\n            } else { // if we run out of characters lookAhead becomes empty\n                $this->lookAhead = '';\n            }\n            ++$i;\n        }\n        //die(\"Lexical error \".$this->currentCharacter);\n    }\n\n    /**\n     * Checks if it's a valid token.\n     *\n     * @access private\n     * @param mixed $token The token to check.\n     * @return mixed       The checked token or false on failure\n     */\n    private function match($token)\n    {\n        switch ($token) {\n            case \"+\":\n            case \"-\":\n            case \"*\":\n            case \"/\":\n            case \"(\":\n            case \")\":\n            case \",\":\n            case \";\":\n            case \">=\":\n            case \"<=\":\n            case \"=\":\n            case \"<>\":\n            case \"^\":\n            case \"&\":\n            case \"%\":\n                return $token;\n                break;\n            case \">\":\n                if ($this->lookAhead == '=') { // it's a GE token\n                    break;\n                }\n                return $token;\n                break;\n            case \"<\":\n                // it's a LE or a NE token\n                if (($this->lookAhead == '=') or ($this->lookAhead == '>')) {\n                    break;\n                }\n                return $token;\n                break;\n            default:\n                // if it's a reference A1 or $A$1 or $A1 or A$1\n                if (preg_match('/^\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/', $token) and !preg_match(\"/[0-9]/\", $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.') and ($this->lookAhead != '!')) {\n                    return $token;\n                } elseif (preg_match(\"/^\" . self::REGEX_SHEET_TITLE_UNQUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_UNQUOTED . \")?\\!\\\\$?[A-Ia-i]?[A-Za-z]\\\\$?[0-9]+$/u\", $token) and !preg_match(\"/[0-9]/\", $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) {\n                    // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1)\n                    return $token;\n                } elseif (preg_match(\"/^'\" . self::REGEX_SHEET_TITLE_QUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_QUOTED . \")?'\\!\\\\$?[A-Ia-i]?[A-Za-z]\\\\$?[0-9]+$/u\", $token) and !preg_match(\"/[0-9]/\", $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) {\n                    // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1)\n                    return $token;\n                } elseif (preg_match('/^(\\$)?[A-Ia-i]?[A-Za-z](\\$)?[0-9]+:(\\$)?[A-Ia-i]?[A-Za-z](\\$)?[0-9]+$/', $token) && !preg_match(\"/[0-9]/\", $this->lookAhead)) {\n                    // if it's a range A1:A2 or $A$1:$A$2\n                    return $token;\n                } elseif (preg_match(\"/^\" . self::REGEX_SHEET_TITLE_UNQUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_UNQUOTED . \")?\\!\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+:\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+$/u\", $token) and !preg_match(\"/[0-9]/\", $this->lookAhead)) {\n                    // If it's an external range like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2\n                    return $token;\n                } elseif (preg_match(\"/^'\" . self::REGEX_SHEET_TITLE_QUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_QUOTED . \")?'\\!\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+:\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+$/u\", $token) and !preg_match(\"/[0-9]/\", $this->lookAhead)) {\n                    // If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2\n                    return $token;\n                } elseif (is_numeric($token) and (!is_numeric($token.$this->lookAhead) or ($this->lookAhead == '')) and ($this->lookAhead != '!') and ($this->lookAhead != ':')) {\n                    // If it's a number (check that it's not a sheet name or range)\n                    return $token;\n                } elseif (preg_match(\"/\\\"([^\\\"]|\\\"\\\"){0,255}\\\"/\", $token) and $this->lookAhead != '\"' and (substr_count($token, '\"')%2 == 0)) {\n                    // If it's a string (of maximum 255 characters)\n                    return $token;\n                } elseif (preg_match(\"/^#[A-Z0\\/]{3,5}[!?]{1}$/\", $token) or $token == '#N/A') {\n                    // If it's an error code\n                    return $token;\n                } elseif (preg_match(\"/^[A-Z0-9\\xc0-\\xdc\\.]+$/i\", $token) and ($this->lookAhead == \"(\")) {\n                    // if it's a function call\n                    return $token;\n                } elseif (substr($token, -1) == ')') {\n                    //    It's an argument of some description (e.g. a named range),\n                    //        precise nature yet to be determined\n                    return $token;\n                }\n                return '';\n        }\n    }\n\n    /**\n     * The parsing method. It parses a formula.\n     *\n     * @access public\n     * @param string $formula The formula to parse, without the initial equal\n     *                        sign (=).\n     * @return mixed true on success\n     */\n    public function parse($formula)\n    {\n        $this->currentCharacter = 0;\n        $this->formula      = $formula;\n        $this->lookAhead    = isset($formula{1}) ? $formula{1} : '';\n        $this->advance();\n        $this->parseTree   = $this->condition();\n        return true;\n    }\n\n    /**\n     * It parses a condition. It assumes the following rule:\n     * Cond -> Expr [(\">\" | \"<\") Expr]\n     *\n     * @access private\n     * @return mixed The parsed ptg'd tree on success\n     */\n    private function condition()\n    {\n        $result = $this->expression();\n        if ($this->currentToken == \"<\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgLT', $result, $result2);\n        } elseif ($this->currentToken == \">\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgGT', $result, $result2);\n        } elseif ($this->currentToken == \"<=\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgLE', $result, $result2);\n        } elseif ($this->currentToken == \">=\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgGE', $result, $result2);\n        } elseif ($this->currentToken == \"=\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgEQ', $result, $result2);\n        } elseif ($this->currentToken == \"<>\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgNE', $result, $result2);\n        } elseif ($this->currentToken == \"&\") {\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgConcat', $result, $result2);\n        }\n        return $result;\n    }\n\n    /**\n     * It parses a expression. It assumes the following rule:\n     * Expr -> Term [(\"+\" | \"-\") Term]\n     *      -> \"string\"\n     *      -> \"-\" Term : Negative value\n     *      -> \"+\" Term : Positive value\n     *      -> Error code\n     *\n     * @access private\n     * @return mixed The parsed ptg'd tree on success\n     */\n    private function expression()\n    {\n        // If it's a string return a string node\n        if (preg_match(\"/\\\"([^\\\"]|\\\"\\\"){0,255}\\\"/\", $this->currentToken)) {\n            $tmp = str_replace('\"\"', '\"', $this->currentToken);\n            if (($tmp == '\"') || ($tmp == '')) {\n                //    Trap for \"\" that has been used for an empty string\n                $tmp = '\"\"';\n            }\n            $result = $this->createTree($tmp, '', '');\n            $this->advance();\n            return $result;\n        // If it's an error code\n        } elseif (preg_match(\"/^#[A-Z0\\/]{3,5}[!?]{1}$/\", $this->currentToken) or $this->currentToken == '#N/A') {\n            $result = $this->createTree($this->currentToken, 'ptgErr', '');\n            $this->advance();\n            return $result;\n        // If it's a negative value\n        } elseif ($this->currentToken == \"-\") {\n            // catch \"-\" Term\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgUminus', $result2, '');\n            return $result;\n        // If it's a positive value\n        } elseif ($this->currentToken == \"+\") {\n            // catch \"+\" Term\n            $this->advance();\n            $result2 = $this->expression();\n            $result = $this->createTree('ptgUplus', $result2, '');\n            return $result;\n        }\n        $result = $this->term();\n        while (($this->currentToken == \"+\") or\n               ($this->currentToken == \"-\") or\n               ($this->currentToken == \"^\")) {\n        /**/\n            if ($this->currentToken == \"+\") {\n                $this->advance();\n                $result2 = $this->term();\n                $result = $this->createTree('ptgAdd', $result, $result2);\n            } elseif ($this->currentToken == \"-\") {\n                $this->advance();\n                $result2 = $this->term();\n                $result = $this->createTree('ptgSub', $result, $result2);\n            } else {\n                $this->advance();\n                $result2 = $this->term();\n                $result = $this->createTree('ptgPower', $result, $result2);\n            }\n        }\n        return $result;\n    }\n\n    /**\n     * This function just introduces a ptgParen element in the tree, so that Excel\n     * doesn't get confused when working with a parenthesized formula afterwards.\n     *\n     * @access private\n     * @see fact()\n     * @return array The parsed ptg'd tree\n     */\n    private function parenthesizedExpression()\n    {\n        $result = $this->createTree('ptgParen', $this->expression(), '');\n        return $result;\n    }\n\n    /**\n     * It parses a term. It assumes the following rule:\n     * Term -> Fact [(\"*\" | \"/\") Fact]\n     *\n     * @access private\n     * @return mixed The parsed ptg'd tree on success\n     */\n    private function term()\n    {\n        $result = $this->fact();\n        while (($this->currentToken == \"*\") or\n               ($this->currentToken == \"/\")) {\n        /**/\n            if ($this->currentToken == \"*\") {\n                $this->advance();\n                $result2 = $this->fact();\n                $result = $this->createTree('ptgMul', $result, $result2);\n            } else {\n                $this->advance();\n                $result2 = $this->fact();\n                $result = $this->createTree('ptgDiv', $result, $result2);\n            }\n        }\n        return $result;\n    }\n\n    /**\n     * It parses a factor. It assumes the following rule:\n     * Fact -> ( Expr )\n     *       | CellRef\n     *       | CellRange\n     *       | Number\n     *       | Function\n     *\n     * @access private\n     * @return mixed The parsed ptg'd tree on success\n     */\n    private function fact()\n    {\n        if ($this->currentToken == \"(\") {\n            $this->advance();         // eat the \"(\"\n            $result = $this->parenthesizedExpression();\n            if ($this->currentToken != \")\") {\n                throw new PHPExcel_Writer_Exception(\"')' token expected.\");\n            }\n            $this->advance();         // eat the \")\"\n            return $result;\n        }\n        // if it's a reference\n        if (preg_match('/^\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/', $this->currentToken)) {\n            $result = $this->createTree($this->currentToken, '', '');\n            $this->advance();\n            return $result;\n        } elseif (preg_match(\"/^\" . self::REGEX_SHEET_TITLE_UNQUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_UNQUOTED . \")?\\!\\\\$?[A-Ia-i]?[A-Za-z]\\\\$?[0-9]+$/u\", $this->currentToken)) {\n            // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1)\n            $result = $this->createTree($this->currentToken, '', '');\n            $this->advance();\n            return $result;\n        } elseif (preg_match(\"/^'\" . self::REGEX_SHEET_TITLE_QUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_QUOTED . \")?'\\!\\\\$?[A-Ia-i]?[A-Za-z]\\\\$?[0-9]+$/u\", $this->currentToken)) {\n            // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1)\n            $result = $this->createTree($this->currentToken, '', '');\n            $this->advance();\n            return $result;\n        } elseif (preg_match('/^(\\$)?[A-Ia-i]?[A-Za-z](\\$)?[0-9]+:(\\$)?[A-Ia-i]?[A-Za-z](\\$)?[0-9]+$/', $this->currentToken) or\n                preg_match('/^(\\$)?[A-Ia-i]?[A-Za-z](\\$)?[0-9]+\\.\\.(\\$)?[A-Ia-i]?[A-Za-z](\\$)?[0-9]+$/', $this->currentToken)) {\n            // if it's a range A1:B2 or $A$1:$B$2\n            // must be an error?\n            $result = $this->createTree($this->currentToken, '', '');\n            $this->advance();\n            return $result;\n        } elseif (preg_match(\"/^\" . self::REGEX_SHEET_TITLE_UNQUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_UNQUOTED . \")?\\!\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+:\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+$/u\", $this->currentToken)) {\n            // If it's an external range (Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2)\n            // must be an error?\n            //$result = $this->currentToken;\n            $result = $this->createTree($this->currentToken, '', '');\n            $this->advance();\n            return $result;\n        } elseif (preg_match(\"/^'\" . self::REGEX_SHEET_TITLE_QUOTED . \"(\\:\" . self::REGEX_SHEET_TITLE_QUOTED . \")?'\\!\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+:\\\\$?([A-Ia-i]?[A-Za-z])?\\\\$?[0-9]+$/u\", $this->currentToken)) {\n            // If it's an external range ('Sheet1'!A1:B2 or 'Sheet1'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1'!$A$1:$B$2)\n            // must be an error?\n            //$result = $this->currentToken;\n            $result = $this->createTree($this->currentToken, '', '');\n            $this->advance();\n            return $result;\n        } elseif (is_numeric($this->currentToken)) {\n            // If it's a number or a percent\n            if ($this->lookAhead == '%') {\n                $result = $this->createTree('ptgPercent', $this->currentToken, '');\n                $this->advance();  // Skip the percentage operator once we've pre-built that tree\n            } else {\n                $result = $this->createTree($this->currentToken, '', '');\n            }\n            $this->advance();\n            return $result;\n        } elseif (preg_match(\"/^[A-Z0-9\\xc0-\\xdc\\.]+$/i\", $this->currentToken)) {\n            // if it's a function call\n            $result = $this->func();\n            return $result;\n        }\n        throw new PHPExcel_Writer_Exception(\"Syntax error: \".$this->currentToken.\", lookahead: \".$this->lookAhead.\", current char: \".$this->currentCharacter);\n    }\n\n    /**\n     * It parses a function call. It assumes the following rule:\n     * Func -> ( Expr [,Expr]* )\n     *\n     * @access private\n     * @return mixed The parsed ptg'd tree on success\n     */\n    private function func()\n    {\n        $num_args = 0; // number of arguments received\n        $function = strtoupper($this->currentToken);\n        $result   = ''; // initialize result\n        $this->advance();\n        $this->advance();         // eat the \"(\"\n        while ($this->currentToken != ')') {\n        /**/\n            if ($num_args > 0) {\n                if ($this->currentToken == \",\" || $this->currentToken == \";\") {\n                    $this->advance();  // eat the \",\" or \";\"\n                } else {\n                    throw new PHPExcel_Writer_Exception(\"Syntax error: comma expected in function $function, arg #{$num_args}\");\n                }\n                $result2 = $this->condition();\n                $result = $this->createTree('arg', $result, $result2);\n            } else { // first argument\n                $result2 = $this->condition();\n                $result = $this->createTree('arg', '', $result2);\n            }\n            ++$num_args;\n        }\n        if (!isset($this->functions[$function])) {\n            throw new PHPExcel_Writer_Exception(\"Function $function() doesn't exist\");\n        }\n        $args = $this->functions[$function][1];\n        // If fixed number of args eg. TIME($i, $j, $k). Check that the number of args is valid.\n        if (($args >= 0) and ($args != $num_args)) {\n            throw new PHPExcel_Writer_Exception(\"Incorrect number of arguments in function $function() \");\n        }\n\n        $result = $this->createTree($function, $result, $num_args);\n        $this->advance();         // eat the \")\"\n        return $result;\n    }\n\n    /**\n     * Creates a tree. In fact an array which may have one or two arrays (sub-trees)\n     * as elements.\n     *\n     * @access private\n     * @param mixed $value The value of this node.\n     * @param mixed $left  The left array (sub-tree) or a final node.\n     * @param mixed $right The right array (sub-tree) or a final node.\n     * @return array A tree\n     */\n    private function createTree($value, $left, $right)\n    {\n        return array('value' => $value, 'left' => $left, 'right' => $right);\n    }\n\n    /**\n     * Builds a string containing the tree in reverse polish notation (What you\n     * would use in a HP calculator stack).\n     * The following tree:\n     *\n     *    +\n     *   / \\\n     *  2   3\n     *\n     * produces: \"23+\"\n     *\n     * The following tree:\n     *\n     *    +\n     *   / \\\n     *  3   *\n     *     / \\\n     *    6   A1\n     *\n     * produces: \"36A1*+\"\n     *\n     * In fact all operands, functions, references, etc... are written as ptg's\n     *\n     * @access public\n     * @param array $tree The optional tree to convert.\n     * @return string The tree in reverse polish notation\n     */\n    public function toReversePolish($tree = array())\n    {\n        $polish = \"\"; // the string we are going to return\n        if (empty($tree)) { // If it's the first call use parseTree\n            $tree = $this->parseTree;\n        }\n\n        if (is_array($tree['left'])) {\n            $converted_tree = $this->toReversePolish($tree['left']);\n            $polish .= $converted_tree;\n        } elseif ($tree['left'] != '') { // It's a final node\n            $converted_tree = $this->convert($tree['left']);\n            $polish .= $converted_tree;\n        }\n        if (is_array($tree['right'])) {\n            $converted_tree = $this->toReversePolish($tree['right']);\n            $polish .= $converted_tree;\n        } elseif ($tree['right'] != '') { // It's a final node\n            $converted_tree = $this->convert($tree['right']);\n            $polish .= $converted_tree;\n        }\n        // if it's a function convert it here (so we can set it's arguments)\n        if (preg_match(\"/^[A-Z0-9\\xc0-\\xdc\\.]+$/\", $tree['value']) and\n            !preg_match('/^([A-Ia-i]?[A-Za-z])(\\d+)$/', $tree['value']) and\n            !preg_match(\"/^[A-Ia-i]?[A-Za-z](\\d+)\\.\\.[A-Ia-i]?[A-Za-z](\\d+)$/\", $tree['value']) and\n            !is_numeric($tree['value']) and\n            !isset($this->ptg[$tree['value']])) {\n            // left subtree for a function is always an array.\n            if ($tree['left'] != '') {\n                $left_tree = $this->toReversePolish($tree['left']);\n            } else {\n                $left_tree = '';\n            }\n            // add it's left subtree and return.\n            return $left_tree.$this->convertFunction($tree['value'], $tree['right']);\n        } else {\n            $converted_tree = $this->convert($tree['value']);\n        }\n        $polish .= $converted_tree;\n        return $polish;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5_Workbook\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n// Original file header of PEAR::Spreadsheet_Excel_Writer_Workbook (used as the base for this class):\n// -----------------------------------------------------------------------------------------\n// /*\n// *  Module written/ported by Xavier Noguer <xnoguer@rezebra.com>\n// *\n// *  The majority of this is _NOT_ my code.  I simply ported it from the\n// *  PERL Spreadsheet::WriteExcel module.\n// *\n// *  The author of the Spreadsheet::WriteExcel module is John McNamara\n// *  <jmcnamara@cpan.org>\n// *\n// *  I _DO_ maintain this code, and John McNamara has nothing to do with the\n// *  porting of this code to PHP.  Any questions directly related to this\n// *  class library should be directed to me.\n// *\n// *  License Information:\n// *\n// *    Spreadsheet_Excel_Writer:  A library for generating Excel Spreadsheets\n// *    Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com\n// *\n// *    This library is free software; you can redistribute it and/or\n// *    modify it under the terms of the GNU Lesser General Public\n// *    License as published by the Free Software Foundation; either\n// *    version 2.1 of the License, or (at your option) any later version.\n// *\n// *    This library is distributed in the hope that it will be useful,\n// *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n// *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// *    Lesser General Public License for more details.\n// *\n// *    You should have received a copy of the GNU Lesser General Public\n// *    License along with this library; if not, write to the Free Software\n// *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// */\nclass PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter\n{\n    /**\n     * Formula parser\n     *\n     * @var PHPExcel_Writer_Excel5_Parser\n     */\n    private $parser;\n\n    /**\n     * The BIFF file size for the workbook.\n     * @var integer\n     * @see calcSheetOffsets()\n     */\n    private $biffSize;\n\n    /**\n     * XF Writers\n     * @var PHPExcel_Writer_Excel5_Xf[]\n     */\n    private $xfWriters = array();\n\n    /**\n     * Array containing the colour palette\n     * @var array\n     */\n    private $palette;\n\n    /**\n     * The codepage indicates the text encoding used for strings\n     * @var integer\n     */\n    private $codepage;\n\n    /**\n     * The country code used for localization\n     * @var integer\n     */\n    private $countryCode;\n\n    /**\n     * Workbook\n     * @var PHPExcel\n     */\n    private $phpExcel;\n\n    /**\n     * Fonts writers\n     *\n     * @var PHPExcel_Writer_Excel5_Font[]\n     */\n    private $fontWriters = array();\n\n    /**\n     * Added fonts. Maps from font's hash => index in workbook\n     *\n     * @var array\n     */\n    private $addedFonts = array();\n\n    /**\n     * Shared number formats\n     *\n     * @var array\n     */\n    private $numberFormats = array();\n\n    /**\n     * Added number formats. Maps from numberFormat's hash => index in workbook\n     *\n     * @var array\n     */\n    private $addedNumberFormats = array();\n\n    /**\n     * Sizes of the binary worksheet streams\n     *\n     * @var array\n     */\n    private $worksheetSizes = array();\n\n    /**\n     * Offsets of the binary worksheet streams relative to the start of the global workbook stream\n     *\n     * @var array\n     */\n    private $worksheetOffsets = array();\n\n    /**\n     * Total number of shared strings in workbook\n     *\n     * @var int\n     */\n    private $stringTotal;\n\n    /**\n     * Number of unique shared strings in workbook\n     *\n     * @var int\n     */\n    private $stringUnique;\n\n    /**\n     * Array of unique shared strings in workbook\n     *\n     * @var array\n     */\n    private $stringTable;\n\n    /**\n     * Color cache\n     */\n    private $colors;\n\n    /**\n     * Escher object corresponding to MSODRAWINGGROUP\n     *\n     * @var PHPExcel_Shared_Escher\n     */\n    private $escher;\n\n\n    /**\n     * Class constructor\n     *\n     * @param PHPExcel    $phpExcel        The Workbook\n     * @param int        &$str_total        Total number of strings\n     * @param int        &$str_unique    Total number of unique strings\n     * @param array        &$str_table        String Table\n     * @param array        &$colors        Colour Table\n     * @param mixed        $parser            The formula parser created for the Workbook\n     */\n    public function __construct(PHPExcel $phpExcel = null, &$str_total, &$str_unique, &$str_table, &$colors, $parser)\n    {\n        // It needs to call its parent's constructor explicitly\n        parent::__construct();\n\n        $this->parser        = $parser;\n        $this->biffSize     = 0;\n        $this->palette      = array();\n        $this->countryCode = -1;\n\n        $this->stringTotal      = &$str_total;\n        $this->stringUnique     = &$str_unique;\n        $this->stringTable      = &$str_table;\n        $this->colors        = &$colors;\n        $this->setPaletteXl97();\n\n        $this->phpExcel = $phpExcel;\n\n        // set BIFFwriter limit for CONTINUE records\n        //        $this->_limit = 8224;\n        $this->codepage = 0x04B0;\n\n        // Add empty sheets and Build color cache\n        $countSheets = $phpExcel->getSheetCount();\n        for ($i = 0; $i < $countSheets; ++$i) {\n            $phpSheet = $phpExcel->getSheet($i);\n\n            $this->parser->setExtSheet($phpSheet->getTitle(), $i);  // Register worksheet name with parser\n\n            $supbook_index = 0x00;\n            $ref = pack('vvv', $supbook_index, $i, $i);\n            $this->parser->references[] = $ref;  // Register reference with parser\n\n            // Sheet tab colors?\n            if ($phpSheet->isTabColorSet()) {\n                $this->addColor($phpSheet->getTabColor()->getRGB());\n            }\n        }\n\n    }\n\n    /**\n     * Add a new XF writer\n     *\n     * @param PHPExcel_Style\n     * @param boolean Is it a style XF?\n     * @return int Index to XF record\n     */\n    public function addXfWriter($style, $isStyleXf = false)\n    {\n        $xfWriter = new PHPExcel_Writer_Excel5_Xf($style);\n        $xfWriter->setIsStyleXf($isStyleXf);\n\n        // Add the font if not already added\n        $fontIndex = $this->addFont($style->getFont());\n\n        // Assign the font index to the xf record\n        $xfWriter->setFontIndex($fontIndex);\n\n        // Background colors, best to treat these after the font so black will come after white in custom palette\n        $xfWriter->setFgColor($this->addColor($style->getFill()->getStartColor()->getRGB()));\n        $xfWriter->setBgColor($this->addColor($style->getFill()->getEndColor()->getRGB()));\n        $xfWriter->setBottomColor($this->addColor($style->getBorders()->getBottom()->getColor()->getRGB()));\n        $xfWriter->setTopColor($this->addColor($style->getBorders()->getTop()->getColor()->getRGB()));\n        $xfWriter->setRightColor($this->addColor($style->getBorders()->getRight()->getColor()->getRGB()));\n        $xfWriter->setLeftColor($this->addColor($style->getBorders()->getLeft()->getColor()->getRGB()));\n        $xfWriter->setDiagColor($this->addColor($style->getBorders()->getDiagonal()->getColor()->getRGB()));\n\n        // Add the number format if it is not a built-in one and not already added\n        if ($style->getNumberFormat()->getBuiltInFormatCode() === false) {\n            $numberFormatHashCode = $style->getNumberFormat()->getHashCode();\n\n            if (isset($this->addedNumberFormats[$numberFormatHashCode])) {\n                $numberFormatIndex = $this->addedNumberFormats[$numberFormatHashCode];\n            } else {\n                $numberFormatIndex = 164 + count($this->numberFormats);\n                $this->numberFormats[$numberFormatIndex] = $style->getNumberFormat();\n                $this->addedNumberFormats[$numberFormatHashCode] = $numberFormatIndex;\n            }\n        } else {\n            $numberFormatIndex = (int) $style->getNumberFormat()->getBuiltInFormatCode();\n        }\n\n        // Assign the number format index to xf record\n        $xfWriter->setNumberFormatIndex($numberFormatIndex);\n\n        $this->xfWriters[] = $xfWriter;\n\n        $xfIndex = count($this->xfWriters) - 1;\n        return $xfIndex;\n    }\n\n    /**\n     * Add a font to added fonts\n     *\n     * @param PHPExcel_Style_Font $font\n     * @return int Index to FONT record\n     */\n    public function addFont(PHPExcel_Style_Font $font)\n    {\n        $fontHashCode = $font->getHashCode();\n        if (isset($this->addedFonts[$fontHashCode])) {\n            $fontIndex = $this->addedFonts[$fontHashCode];\n        } else {\n            $countFonts = count($this->fontWriters);\n            $fontIndex = ($countFonts < 4) ? $countFonts : $countFonts + 1;\n\n            $fontWriter = new PHPExcel_Writer_Excel5_Font($font);\n            $fontWriter->setColorIndex($this->addColor($font->getColor()->getRGB()));\n            $this->fontWriters[] = $fontWriter;\n\n            $this->addedFonts[$fontHashCode] = $fontIndex;\n        }\n        return $fontIndex;\n    }\n\n    /**\n     * Alter color palette adding a custom color\n     *\n     * @param string $rgb E.g. 'FF00AA'\n     * @return int Color index\n     */\n    private function addColor($rgb)\n    {\n        if (!isset($this->colors[$rgb])) {\n            if (count($this->colors) < 57) {\n                // then we add a custom color altering the palette\n                $colorIndex = 8 + count($this->colors);\n                $this->palette[$colorIndex] =\n                    array(\n                        hexdec(substr($rgb, 0, 2)),\n                        hexdec(substr($rgb, 2, 2)),\n                        hexdec(substr($rgb, 4)),\n                        0\n                    );\n                $this->colors[$rgb] = $colorIndex;\n            } else {\n                // no room for more custom colors, just map to black\n                $colorIndex = 0;\n            }\n        } else {\n            // fetch already added custom color\n            $colorIndex = $this->colors[$rgb];\n        }\n\n        return $colorIndex;\n    }\n\n    /**\n     * Sets the colour palette to the Excel 97+ default.\n     *\n     * @access private\n     */\n    private function setPaletteXl97()\n    {\n        $this->palette = array(\n            0x08 => array(0x00, 0x00, 0x00, 0x00),\n            0x09 => array(0xff, 0xff, 0xff, 0x00),\n            0x0A => array(0xff, 0x00, 0x00, 0x00),\n            0x0B => array(0x00, 0xff, 0x00, 0x00),\n            0x0C => array(0x00, 0x00, 0xff, 0x00),\n            0x0D => array(0xff, 0xff, 0x00, 0x00),\n            0x0E => array(0xff, 0x00, 0xff, 0x00),\n            0x0F => array(0x00, 0xff, 0xff, 0x00),\n            0x10 => array(0x80, 0x00, 0x00, 0x00),\n            0x11 => array(0x00, 0x80, 0x00, 0x00),\n            0x12 => array(0x00, 0x00, 0x80, 0x00),\n            0x13 => array(0x80, 0x80, 0x00, 0x00),\n            0x14 => array(0x80, 0x00, 0x80, 0x00),\n            0x15 => array(0x00, 0x80, 0x80, 0x00),\n            0x16 => array(0xc0, 0xc0, 0xc0, 0x00),\n            0x17 => array(0x80, 0x80, 0x80, 0x00),\n            0x18 => array(0x99, 0x99, 0xff, 0x00),\n            0x19 => array(0x99, 0x33, 0x66, 0x00),\n            0x1A => array(0xff, 0xff, 0xcc, 0x00),\n            0x1B => array(0xcc, 0xff, 0xff, 0x00),\n            0x1C => array(0x66, 0x00, 0x66, 0x00),\n            0x1D => array(0xff, 0x80, 0x80, 0x00),\n            0x1E => array(0x00, 0x66, 0xcc, 0x00),\n            0x1F => array(0xcc, 0xcc, 0xff, 0x00),\n            0x20 => array(0x00, 0x00, 0x80, 0x00),\n            0x21 => array(0xff, 0x00, 0xff, 0x00),\n            0x22 => array(0xff, 0xff, 0x00, 0x00),\n            0x23 => array(0x00, 0xff, 0xff, 0x00),\n            0x24 => array(0x80, 0x00, 0x80, 0x00),\n            0x25 => array(0x80, 0x00, 0x00, 0x00),\n            0x26 => array(0x00, 0x80, 0x80, 0x00),\n            0x27 => array(0x00, 0x00, 0xff, 0x00),\n            0x28 => array(0x00, 0xcc, 0xff, 0x00),\n            0x29 => array(0xcc, 0xff, 0xff, 0x00),\n            0x2A => array(0xcc, 0xff, 0xcc, 0x00),\n            0x2B => array(0xff, 0xff, 0x99, 0x00),\n            0x2C => array(0x99, 0xcc, 0xff, 0x00),\n            0x2D => array(0xff, 0x99, 0xcc, 0x00),\n            0x2E => array(0xcc, 0x99, 0xff, 0x00),\n            0x2F => array(0xff, 0xcc, 0x99, 0x00),\n            0x30 => array(0x33, 0x66, 0xff, 0x00),\n            0x31 => array(0x33, 0xcc, 0xcc, 0x00),\n            0x32 => array(0x99, 0xcc, 0x00, 0x00),\n            0x33 => array(0xff, 0xcc, 0x00, 0x00),\n            0x34 => array(0xff, 0x99, 0x00, 0x00),\n            0x35 => array(0xff, 0x66, 0x00, 0x00),\n            0x36 => array(0x66, 0x66, 0x99, 0x00),\n            0x37 => array(0x96, 0x96, 0x96, 0x00),\n            0x38 => array(0x00, 0x33, 0x66, 0x00),\n            0x39 => array(0x33, 0x99, 0x66, 0x00),\n            0x3A => array(0x00, 0x33, 0x00, 0x00),\n            0x3B => array(0x33, 0x33, 0x00, 0x00),\n            0x3C => array(0x99, 0x33, 0x00, 0x00),\n            0x3D => array(0x99, 0x33, 0x66, 0x00),\n            0x3E => array(0x33, 0x33, 0x99, 0x00),\n            0x3F => array(0x33, 0x33, 0x33, 0x00),\n        );\n    }\n\n    /**\n     * Assemble worksheets into a workbook and send the BIFF data to an OLE\n     * storage.\n     *\n     * @param    array    $pWorksheetSizes    The sizes in bytes of the binary worksheet streams\n     * @return    string    Binary data for workbook stream\n     */\n    public function writeWorkbook($pWorksheetSizes = null)\n    {\n        $this->worksheetSizes = $pWorksheetSizes;\n\n        // Calculate the number of selected worksheet tabs and call the finalization\n        // methods for each worksheet\n        $total_worksheets = $this->phpExcel->getSheetCount();\n\n        // Add part 1 of the Workbook globals, what goes before the SHEET records\n        $this->storeBof(0x0005);\n        $this->writeCodepage();\n        $this->writeWindow1();\n\n        $this->writeDateMode();\n        $this->writeAllFonts();\n        $this->writeAllNumberFormats();\n        $this->writeAllXfs();\n        $this->writeAllStyles();\n        $this->writePalette();\n\n        // Prepare part 3 of the workbook global stream, what goes after the SHEET records\n        $part3 = '';\n        if ($this->countryCode != -1) {\n            $part3 .= $this->writeCountry();\n        }\n        $part3 .= $this->writeRecalcId();\n\n        $part3 .= $this->writeSupbookInternal();\n        /* TODO: store external SUPBOOK records and XCT and CRN records\n        in case of external references for BIFF8 */\n        $part3 .= $this->writeExternalsheetBiff8();\n        $part3 .= $this->writeAllDefinedNamesBiff8();\n        $part3 .= $this->writeMsoDrawingGroup();\n        $part3 .= $this->writeSharedStringsTable();\n\n        $part3 .= $this->writeEof();\n\n        // Add part 2 of the Workbook globals, the SHEET records\n        $this->calcSheetOffsets();\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $this->writeBoundSheet($this->phpExcel->getSheet($i), $this->worksheetOffsets[$i]);\n        }\n\n        // Add part 3 of the Workbook globals\n        $this->_data .= $part3;\n\n        return $this->_data;\n    }\n\n    /**\n     * Calculate offsets for Worksheet BOF records.\n     *\n     * @access private\n     */\n    private function calcSheetOffsets()\n    {\n        $boundsheet_length = 10;  // fixed length for a BOUNDSHEET record\n\n        // size of Workbook globals part 1 + 3\n        $offset            = $this->_datasize;\n\n        // add size of Workbook globals part 2, the length of the SHEET records\n        $total_worksheets = count($this->phpExcel->getAllSheets());\n        foreach ($this->phpExcel->getWorksheetIterator() as $sheet) {\n            $offset += $boundsheet_length + strlen(PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($sheet->getTitle()));\n        }\n\n        // add the sizes of each of the Sheet substreams, respectively\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $this->worksheetOffsets[$i] = $offset;\n            $offset += $this->worksheetSizes[$i];\n        }\n        $this->biffSize = $offset;\n    }\n\n    /**\n     * Store the Excel FONT records.\n     */\n    private function writeAllFonts()\n    {\n        foreach ($this->fontWriters as $fontWriter) {\n            $this->append($fontWriter->writeFont());\n        }\n    }\n\n    /**\n     * Store user defined numerical formats i.e. FORMAT records\n     */\n    private function writeAllNumberFormats()\n    {\n        foreach ($this->numberFormats as $numberFormatIndex => $numberFormat) {\n            $this->writeNumberFormat($numberFormat->getFormatCode(), $numberFormatIndex);\n        }\n    }\n\n    /**\n     * Write all XF records.\n     */\n    private function writeAllXfs()\n    {\n        foreach ($this->xfWriters as $xfWriter) {\n            $this->append($xfWriter->writeXf());\n        }\n    }\n\n    /**\n     * Write all STYLE records.\n     */\n    private function writeAllStyles()\n    {\n        $this->writeStyle();\n    }\n\n    /**\n     * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for\n     * the NAME records.\n     */\n    private function writeExternals()\n    {\n        $countSheets = $this->phpExcel->getSheetCount();\n        // Create EXTERNCOUNT with number of worksheets\n        $this->writeExternalCount($countSheets);\n\n        // Create EXTERNSHEET for each worksheet\n        for ($i = 0; $i < $countSheets; ++$i) {\n            $this->writeExternalSheet($this->phpExcel->getSheet($i)->getTitle());\n        }\n    }\n\n    /**\n     * Write the NAME record to define the print area and the repeat rows and cols.\n     */\n    private function writeNames()\n    {\n        // total number of sheets\n        $total_worksheets = $this->phpExcel->getSheetCount();\n\n        // Create the print area NAME records\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup();\n            // Write a Name record if the print area has been defined\n            if ($sheetSetup->isPrintAreaSet()) {\n                // Print area\n                $printArea = PHPExcel_Cell::splitRange($sheetSetup->getPrintArea());\n                $printArea = $printArea[0];\n                $printArea[0] = PHPExcel_Cell::coordinateFromString($printArea[0]);\n                $printArea[1] = PHPExcel_Cell::coordinateFromString($printArea[1]);\n\n                $print_rowmin = $printArea[0][1] - 1;\n                $print_rowmax = $printArea[1][1] - 1;\n                $print_colmin = PHPExcel_Cell::columnIndexFromString($printArea[0][0]) - 1;\n                $print_colmax = PHPExcel_Cell::columnIndexFromString($printArea[1][0]) - 1;\n\n                $this->writeNameShort(\n                    $i, // sheet index\n                    0x06, // NAME type\n                    $print_rowmin,\n                    $print_rowmax,\n                    $print_colmin,\n                    $print_colmax\n                );\n            }\n        }\n\n        // Create the print title NAME records\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup();\n\n            // simultaneous repeatColumns repeatRows\n            if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) {\n                $repeat = $sheetSetup->getColumnsToRepeatAtLeft();\n                $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1;\n                $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1;\n\n                $repeat = $sheetSetup->getRowsToRepeatAtTop();\n                $rowmin = $repeat[0] - 1;\n                $rowmax = $repeat[1] - 1;\n\n                $this->writeNameLong(\n                    $i, // sheet index\n                    0x07, // NAME type\n                    $rowmin,\n                    $rowmax,\n                    $colmin,\n                    $colmax\n                );\n\n            // (exclusive) either repeatColumns or repeatRows\n            } elseif ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) {\n                // Columns to repeat\n                if ($sheetSetup->isColumnsToRepeatAtLeftSet()) {\n                    $repeat = $sheetSetup->getColumnsToRepeatAtLeft();\n                    $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1;\n                    $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1;\n                } else {\n                    $colmin = 0;\n                    $colmax = 255;\n                }\n\n                // Rows to repeat\n                if ($sheetSetup->isRowsToRepeatAtTopSet()) {\n                    $repeat = $sheetSetup->getRowsToRepeatAtTop();\n                    $rowmin = $repeat[0] - 1;\n                    $rowmax = $repeat[1] - 1;\n                } else {\n                    $rowmin = 0;\n                    $rowmax = 65535;\n                }\n\n                $this->writeNameShort(\n                    $i, // sheet index\n                    0x07, // NAME type\n                    $rowmin,\n                    $rowmax,\n                    $colmin,\n                    $colmax\n                );\n            }\n        }\n    }\n\n    /**\n     * Writes all the DEFINEDNAME records (BIFF8).\n     * So far this is only used for repeating rows/columns (print titles) and print areas\n     */\n    private function writeAllDefinedNamesBiff8()\n    {\n        $chunk = '';\n\n        // Named ranges\n        if (count($this->phpExcel->getNamedRanges()) > 0) {\n            // Loop named ranges\n            $namedRanges = $this->phpExcel->getNamedRanges();\n            foreach ($namedRanges as $namedRange) {\n                // Create absolute coordinate\n                $range = PHPExcel_Cell::splitRange($namedRange->getRange());\n                for ($i = 0; $i < count($range); $i++) {\n                    $range[$i][0] = '\\'' . str_replace(\"'\", \"''\", $namedRange->getWorksheet()->getTitle()) . '\\'!' . PHPExcel_Cell::absoluteCoordinate($range[$i][0]);\n                    if (isset($range[$i][1])) {\n                        $range[$i][1] = PHPExcel_Cell::absoluteCoordinate($range[$i][1]);\n                    }\n                }\n                $range = PHPExcel_Cell::buildRange($range); // e.g. Sheet1!$A$1:$B$2\n\n                // parse formula\n                try {\n                    $error = $this->parser->parse($range);\n                    $formulaData = $this->parser->toReversePolish();\n\n                    // make sure tRef3d is of type tRef3dR (0x3A)\n                    if (isset($formulaData{0}) and ($formulaData{0} == \"\\x7A\" or $formulaData{0} == \"\\x5A\")) {\n                        $formulaData = \"\\x3A\" . substr($formulaData, 1);\n                    }\n\n                    if ($namedRange->getLocalOnly()) {\n                        // local scope\n                        $scope = $this->phpExcel->getIndex($namedRange->getScope()) + 1;\n                    } else {\n                        // global scope\n                        $scope = 0;\n                    }\n                    $chunk .= $this->writeData($this->writeDefinedNameBiff8($namedRange->getName(), $formulaData, $scope, false));\n\n                } catch (PHPExcel_Exception $e) {\n                    // do nothing\n                }\n            }\n        }\n\n        // total number of sheets\n        $total_worksheets = $this->phpExcel->getSheetCount();\n\n        // write the print titles (repeating rows, columns), if any\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup();\n            // simultaneous repeatColumns repeatRows\n            if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) {\n                $repeat = $sheetSetup->getColumnsToRepeatAtLeft();\n                $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1;\n                $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1;\n\n                $repeat = $sheetSetup->getRowsToRepeatAtTop();\n                $rowmin = $repeat[0] - 1;\n                $rowmax = $repeat[1] - 1;\n\n                // construct formula data manually\n                $formulaData = pack('Cv', 0x29, 0x17); // tMemFunc\n                $formulaData .= pack('Cvvvvv', 0x3B, $i, 0, 65535, $colmin, $colmax); // tArea3d\n                $formulaData .= pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, 0, 255); // tArea3d\n                $formulaData .= pack('C', 0x10); // tList\n\n                // store the DEFINEDNAME record\n                $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true));\n\n            // (exclusive) either repeatColumns or repeatRows\n            } elseif ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) {\n                // Columns to repeat\n                if ($sheetSetup->isColumnsToRepeatAtLeftSet()) {\n                    $repeat = $sheetSetup->getColumnsToRepeatAtLeft();\n                    $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1;\n                    $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1;\n                } else {\n                    $colmin = 0;\n                    $colmax = 255;\n                }\n                // Rows to repeat\n                if ($sheetSetup->isRowsToRepeatAtTopSet()) {\n                    $repeat = $sheetSetup->getRowsToRepeatAtTop();\n                    $rowmin = $repeat[0] - 1;\n                    $rowmax = $repeat[1] - 1;\n                } else {\n                    $rowmin = 0;\n                    $rowmax = 65535;\n                }\n\n                // construct formula data manually because parser does not recognize absolute 3d cell references\n                $formulaData = pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, $colmin, $colmax);\n\n                // store the DEFINEDNAME record\n                $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true));\n            }\n        }\n\n        // write the print areas, if any\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup();\n            if ($sheetSetup->isPrintAreaSet()) {\n                // Print area, e.g. A3:J6,H1:X20\n                $printArea = PHPExcel_Cell::splitRange($sheetSetup->getPrintArea());\n                $countPrintArea = count($printArea);\n\n                $formulaData = '';\n                for ($j = 0; $j < $countPrintArea; ++$j) {\n                    $printAreaRect = $printArea[$j]; // e.g. A3:J6\n                    $printAreaRect[0] = PHPExcel_Cell::coordinateFromString($printAreaRect[0]);\n                    $printAreaRect[1] = PHPExcel_Cell::coordinateFromString($printAreaRect[1]);\n\n                    $print_rowmin = $printAreaRect[0][1] - 1;\n                    $print_rowmax = $printAreaRect[1][1] - 1;\n                    $print_colmin = PHPExcel_Cell::columnIndexFromString($printAreaRect[0][0]) - 1;\n                    $print_colmax = PHPExcel_Cell::columnIndexFromString($printAreaRect[1][0]) - 1;\n\n                    // construct formula data manually because parser does not recognize absolute 3d cell references\n                    $formulaData .= pack('Cvvvvv', 0x3B, $i, $print_rowmin, $print_rowmax, $print_colmin, $print_colmax);\n\n                    if ($j > 0) {\n                        $formulaData .= pack('C', 0x10); // list operator token ','\n                    }\n                }\n\n                // store the DEFINEDNAME record\n                $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x06), $formulaData, $i + 1, true));\n            }\n        }\n\n        // write autofilters, if any\n        for ($i = 0; $i < $total_worksheets; ++$i) {\n            $sheetAutoFilter = $this->phpExcel->getSheet($i)->getAutoFilter();\n            $autoFilterRange = $sheetAutoFilter->getRange();\n            if (!empty($autoFilterRange)) {\n                $rangeBounds = PHPExcel_Cell::rangeBoundaries($autoFilterRange);\n\n                //Autofilter built in name\n                $name = pack('C', 0x0D);\n\n                $chunk .= $this->writeData($this->writeShortNameBiff8($name, $i + 1, $rangeBounds, true));\n            }\n        }\n\n        return $chunk;\n    }\n\n    /**\n     * Write a DEFINEDNAME record for BIFF8 using explicit binary formula data\n     *\n     * @param    string        $name            The name in UTF-8\n     * @param    string        $formulaData    The binary formula data\n     * @param    string        $sheetIndex        1-based sheet index the defined name applies to. 0 = global\n     * @param    boolean        $isBuiltIn        Built-in name?\n     * @return    string    Complete binary record data\n     */\n    private function writeDefinedNameBiff8($name, $formulaData, $sheetIndex = 0, $isBuiltIn = false)\n    {\n        $record = 0x0018;\n\n        // option flags\n        $options = $isBuiltIn ? 0x20 : 0x00;\n\n        // length of the name, character count\n        $nlen = PHPExcel_Shared_String::CountCharacters($name);\n\n        // name with stripped length field\n        $name = substr(PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($name), 2);\n\n        // size of the formula (in bytes)\n        $sz = strlen($formulaData);\n\n        // combine the parts\n        $data = pack('vCCvvvCCCC', $options, 0, $nlen, $sz, 0, $sheetIndex, 0, 0, 0, 0)\n            . $name . $formulaData;\n        $length = strlen($data);\n\n        $header = pack('vv', $record, $length);\n\n        return $header . $data;\n    }\n\n    /**\n     * Write a short NAME record\n     *\n     * @param    string         $name\n     * @param    string         $sheetIndex        1-based sheet index the defined name applies to. 0 = global\n     * @param    integer[][]  $rangeBounds    range boundaries\n     * @param    boolean      $isHidden\n     * @return    string    Complete binary record data\n     * */\n    private function writeShortNameBiff8($name, $sheetIndex = 0, $rangeBounds, $isHidden = false)\n    {\n        $record = 0x0018;\n\n        // option flags\n        $options = ($isHidden  ? 0x21 : 0x00);\n\n        $extra  = pack(\n            'Cvvvvv',\n            0x3B,\n            $sheetIndex - 1,\n            $rangeBounds[0][1] - 1,\n            $rangeBounds[1][1] - 1,\n            $rangeBounds[0][0] - 1,\n            $rangeBounds[1][0] - 1\n        );\n\n        // size of the formula (in bytes)\n        $sz = strlen($extra);\n\n        // combine the parts\n        $data = pack('vCCvvvCCCCC', $options, 0, 1, $sz, 0, $sheetIndex, 0, 0, 0, 0, 0)\n            . $name . $extra;\n        $length = strlen($data);\n\n        $header = pack('vv', $record, $length);\n\n        return $header . $data;\n    }\n\n    /**\n     * Stores the CODEPAGE biff record.\n     */\n    private function writeCodepage()\n    {\n        $record = 0x0042;             // Record identifier\n        $length = 0x0002;             // Number of bytes to follow\n        $cv  = $this->codepage;   // The code page\n\n        $header = pack('vv', $record, $length);\n        $data   = pack('v', $cv);\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write Excel BIFF WINDOW1 record.\n     */\n    private function writeWindow1()\n    {\n        $record = 0x003D;   // Record identifier\n        $length = 0x0012;   // Number of bytes to follow\n\n        $xWn  = 0x0000;     // Horizontal position of window\n        $yWn  = 0x0000;     // Vertical position of window\n        $dxWn = 0x25BC;     // Width of window\n        $dyWn = 0x1572;     // Height of window\n\n        $grbit = 0x0038;    // Option flags\n\n        // not supported by PHPExcel, so there is only one selected sheet, the active\n        $ctabsel = 1;       // Number of workbook tabs selected\n\n        $wTabRatio = 0x0258;    // Tab to scrollbar ratio\n\n        // not supported by PHPExcel, set to 0\n        $itabFirst = 0;     // 1st displayed worksheet\n        $itabCur   = $this->phpExcel->getActiveSheetIndex();    // Active worksheet\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"vvvvvvvvv\", $xWn, $yWn, $dxWn, $dyWn, $grbit, $itabCur, $itabFirst, $ctabsel, $wTabRatio);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Writes Excel BIFF BOUNDSHEET record.\n     *\n     * @param PHPExcel_Worksheet  $sheet Worksheet name\n     * @param integer $offset    Location of worksheet BOF\n     */\n    private function writeBoundSheet($sheet, $offset)\n    {\n        $sheetname = $sheet->getTitle();\n        $record    = 0x0085;                    // Record identifier\n\n        // sheet state\n        switch ($sheet->getSheetState()) {\n            case PHPExcel_Worksheet::SHEETSTATE_VISIBLE:\n                $ss = 0x00;\n                break;\n            case PHPExcel_Worksheet::SHEETSTATE_HIDDEN:\n                $ss = 0x01;\n                break;\n            case PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN:\n                $ss = 0x02;\n                break;\n            default:\n                $ss = 0x00;\n                break;\n        }\n\n        // sheet type\n        $st = 0x00;\n\n        $grbit = 0x0000;                    // Visibility and sheet type\n\n        $data = pack(\"VCC\", $offset, $ss, $st);\n        $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($sheetname);\n\n        $length = strlen($data);\n        $header = pack(\"vv\", $record, $length);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write Internal SUPBOOK record\n     */\n    private function writeSupbookInternal()\n    {\n        $record    = 0x01AE;   // Record identifier\n        $length    = 0x0004;   // Bytes to follow\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"vv\", $this->phpExcel->getSheetCount(), 0x0401);\n        return $this->writeData($header . $data);\n    }\n\n    /**\n     * Writes the Excel BIFF EXTERNSHEET record. These references are used by\n     * formulas.\n     *\n     */\n    private function writeExternalsheetBiff8()\n    {\n        $totalReferences = count($this->parser->references);\n        $record = 0x0017;                     // Record identifier\n        $length = 2 + 6 * $totalReferences;  // Number of bytes to follow\n\n        $supbook_index = 0;           // FIXME: only using internal SUPBOOK record\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack('v', $totalReferences);\n        for ($i = 0; $i < $totalReferences; ++$i) {\n            $data .= $this->parser->references[$i];\n        }\n        return $this->writeData($header . $data);\n    }\n\n    /**\n     * Write Excel BIFF STYLE records.\n     */\n    private function writeStyle()\n    {\n        $record = 0x0293;   // Record identifier\n        $length = 0x0004;   // Bytes to follow\n\n        $ixfe    = 0x8000;  // Index to cell style XF\n        $BuiltIn = 0x00;     // Built-in style\n        $iLevel  = 0xff;     // Outline style level\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"vCC\", $ixfe, $BuiltIn, $iLevel);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Writes Excel FORMAT record for non \"built-in\" numerical formats.\n     *\n     * @param string  $format Custom format string\n     * @param integer $ifmt   Format index code\n     */\n    private function writeNumberFormat($format, $ifmt)\n    {\n        $record = 0x041E;    // Record identifier\n\n        $numberFormatString = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($format);\n        $length = 2 + strlen($numberFormatString);    // Number of bytes to follow\n\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"v\", $ifmt) .  $numberFormatString;\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write DATEMODE record to indicate the date system in use (1904 or 1900).\n     */\n    private function writeDateMode()\n    {\n        $record = 0x0022;   // Record identifier\n        $length = 0x0002;   // Bytes to follow\n\n        $f1904  = (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904)\n            ? 1\n            : 0;   // Flag for 1904 date system\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"v\", $f1904);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write BIFF record EXTERNCOUNT to indicate the number of external sheet\n     * references in the workbook.\n     *\n     * Excel only stores references to external sheets that are used in NAME.\n     * The workbook NAME record is required to define the print area and the repeat\n     * rows and columns.\n     *\n     * A similar method is used in Worksheet.php for a slightly different purpose.\n     *\n     * @param integer $cxals Number of external references\n     */\n    private function writeExternalCount($cxals)\n    {\n        $record = 0x0016;   // Record identifier\n        $length = 0x0002;   // Number of bytes to follow\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"v\", $cxals);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Writes the Excel BIFF EXTERNSHEET record. These references are used by\n     * formulas. NAME record is required to define the print area and the repeat\n     * rows and columns.\n     *\n     * A similar method is used in Worksheet.php for a slightly different purpose.\n     *\n     * @param string $sheetname Worksheet name\n     */\n    private function writeExternalSheet($sheetname)\n    {\n        $record = 0x0017;                     // Record identifier\n        $length = 0x02 + strlen($sheetname);  // Number of bytes to follow\n\n        $cch    = strlen($sheetname);         // Length of sheet name\n        $rgch   = 0x03;                       // Filename encoding\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"CC\", $cch, $rgch);\n        $this->append($header . $data . $sheetname);\n    }\n\n    /**\n     * Store the NAME record in the short format that is used for storing the print\n     * area, repeat rows only and repeat columns only.\n     *\n     * @param integer $index  Sheet index\n     * @param integer $type   Built-in name type\n     * @param integer $rowmin Start row\n     * @param integer $rowmax End row\n     * @param integer $colmin Start colum\n     * @param integer $colmax End column\n     */\n    private function writeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax)\n    {\n        $record = 0x0018;       // Record identifier\n        $length = 0x0024;       // Number of bytes to follow\n\n        $grbit  = 0x0020;       // Option flags\n        $chKey  = 0x00;         // Keyboard shortcut\n        $cch    = 0x01;         // Length of text name\n        $cce    = 0x0015;       // Length of text definition\n        $ixals  = $index + 1;   // Sheet index\n        $itab   = $ixals;       // Equal to ixals\n        $cchCustMenu    = 0x00;         // Length of cust menu text\n        $cchDescription = 0x00;         // Length of description text\n        $cchHelptopic   = 0x00;         // Length of help topic text\n        $cchStatustext  = 0x00;         // Length of status bar text\n        $rgch           = $type;        // Built-in name type\n\n        $unknown03 = 0x3b;\n        $unknown04 = 0xffff - $index;\n        $unknown05 = 0x0000;\n        $unknown06 = 0x0000;\n        $unknown07 = 0x1087;\n        $unknown08 = 0x8005;\n\n        $header = pack(\"vv\", $record, $length);\n        $data = pack(\"v\", $grbit);\n        $data .= pack(\"C\", $chKey);\n        $data .= pack(\"C\", $cch);\n        $data .= pack(\"v\", $cce);\n        $data .= pack(\"v\", $ixals);\n        $data .= pack(\"v\", $itab);\n        $data .= pack(\"C\", $cchCustMenu);\n        $data .= pack(\"C\", $cchDescription);\n        $data .= pack(\"C\", $cchHelptopic);\n        $data .= pack(\"C\", $cchStatustext);\n        $data .= pack(\"C\", $rgch);\n        $data .= pack(\"C\", $unknown03);\n        $data .= pack(\"v\", $unknown04);\n        $data .= pack(\"v\", $unknown05);\n        $data .= pack(\"v\", $unknown06);\n        $data .= pack(\"v\", $unknown07);\n        $data .= pack(\"v\", $unknown08);\n        $data .= pack(\"v\", $index);\n        $data .= pack(\"v\", $index);\n        $data .= pack(\"v\", $rowmin);\n        $data .= pack(\"v\", $rowmax);\n        $data .= pack(\"C\", $colmin);\n        $data .= pack(\"C\", $colmax);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the NAME record in the long format that is used for storing the repeat\n     * rows and columns when both are specified. This shares a lot of code with\n     * writeNameShort() but we use a separate method to keep the code clean.\n     * Code abstraction for reuse can be carried too far, and I should know. ;-)\n     *\n     * @param integer $index Sheet index\n     * @param integer $type  Built-in name type\n     * @param integer $rowmin Start row\n     * @param integer $rowmax End row\n     * @param integer $colmin Start colum\n     * @param integer $colmax End column\n     */\n    private function writeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax)\n    {\n        $record          = 0x0018;       // Record identifier\n        $length          = 0x003d;       // Number of bytes to follow\n        $grbit           = 0x0020;       // Option flags\n        $chKey           = 0x00;         // Keyboard shortcut\n        $cch             = 0x01;         // Length of text name\n        $cce             = 0x002e;       // Length of text definition\n        $ixals           = $index + 1;   // Sheet index\n        $itab            = $ixals;       // Equal to ixals\n        $cchCustMenu     = 0x00;         // Length of cust menu text\n        $cchDescription  = 0x00;         // Length of description text\n        $cchHelptopic    = 0x00;         // Length of help topic text\n        $cchStatustext   = 0x00;         // Length of status bar text\n        $rgch            = $type;        // Built-in name type\n\n        $unknown01       = 0x29;\n        $unknown02       = 0x002b;\n        $unknown03       = 0x3b;\n        $unknown04       = 0xffff-$index;\n        $unknown05       = 0x0000;\n        $unknown06       = 0x0000;\n        $unknown07       = 0x1087;\n        $unknown08       = 0x8008;\n\n        $header = pack(\"vv\", $record, $length);\n        $data = pack(\"v\", $grbit);\n        $data .= pack(\"C\", $chKey);\n        $data .= pack(\"C\", $cch);\n        $data .= pack(\"v\", $cce);\n        $data .= pack(\"v\", $ixals);\n        $data .= pack(\"v\", $itab);\n        $data .= pack(\"C\", $cchCustMenu);\n        $data .= pack(\"C\", $cchDescription);\n        $data .= pack(\"C\", $cchHelptopic);\n        $data .= pack(\"C\", $cchStatustext);\n        $data .= pack(\"C\", $rgch);\n        $data .= pack(\"C\", $unknown01);\n        $data .= pack(\"v\", $unknown02);\n        // Column definition\n        $data .= pack(\"C\", $unknown03);\n        $data .= pack(\"v\", $unknown04);\n        $data .= pack(\"v\", $unknown05);\n        $data .= pack(\"v\", $unknown06);\n        $data .= pack(\"v\", $unknown07);\n        $data .= pack(\"v\", $unknown08);\n        $data .= pack(\"v\", $index);\n        $data .= pack(\"v\", $index);\n        $data .= pack(\"v\", 0x0000);\n        $data .= pack(\"v\", 0x3fff);\n        $data .= pack(\"C\", $colmin);\n        $data .= pack(\"C\", $colmax);\n        // Row definition\n        $data .= pack(\"C\", $unknown03);\n        $data .= pack(\"v\", $unknown04);\n        $data .= pack(\"v\", $unknown05);\n        $data .= pack(\"v\", $unknown06);\n        $data .= pack(\"v\", $unknown07);\n        $data .= pack(\"v\", $unknown08);\n        $data .= pack(\"v\", $index);\n        $data .= pack(\"v\", $index);\n        $data .= pack(\"v\", $rowmin);\n        $data .= pack(\"v\", $rowmax);\n        $data .= pack(\"C\", 0x00);\n        $data .= pack(\"C\", 0xff);\n        // End of data\n        $data .= pack(\"C\", 0x10);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Stores the COUNTRY record for localization\n     *\n     * @return string\n     */\n    private function writeCountry()\n    {\n        $record = 0x008C;    // Record identifier\n        $length = 4;         // Number of bytes to follow\n\n        $header = pack('vv', $record, $length);\n        /* using the same country code always for simplicity */\n        $data = pack('vv', $this->countryCode, $this->countryCode);\n        //$this->append($header . $data);\n        return $this->writeData($header . $data);\n    }\n\n    /**\n     * Write the RECALCID record\n     *\n     * @return string\n     */\n    private function writeRecalcId()\n    {\n        $record = 0x01C1;    // Record identifier\n        $length = 8;         // Number of bytes to follow\n\n        $header = pack('vv', $record, $length);\n\n        // by inspection of real Excel files, MS Office Excel 2007 writes this\n        $data = pack('VV', 0x000001C1, 0x00001E667);\n\n        return $this->writeData($header . $data);\n    }\n\n    /**\n     * Stores the PALETTE biff record.\n     */\n    private function writePalette()\n    {\n        $aref = $this->palette;\n\n        $record = 0x0092;                // Record identifier\n        $length = 2 + 4 * count($aref);  // Number of bytes to follow\n        $ccv    = count($aref);          // Number of RGB values to follow\n        $data = '';                      // The RGB data\n\n        // Pack the RGB data\n        foreach ($aref as $color) {\n            foreach ($color as $byte) {\n                $data .= pack(\"C\", $byte);\n            }\n        }\n\n        $header = pack(\"vvv\", $record, $length, $ccv);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Handling of the SST continue blocks is complicated by the need to include an\n     * additional continuation byte depending on whether the string is split between\n     * blocks or whether it starts at the beginning of the block. (There are also\n     * additional complications that will arise later when/if Rich Strings are\n     * supported).\n     *\n     * The Excel documentation says that the SST record should be followed by an\n     * EXTSST record. The EXTSST record is a hash table that is used to optimise\n     * access to SST. However, despite the documentation it doesn't seem to be\n     * required so we will ignore it.\n     *\n     * @return string Binary data\n     */\n    private function writeSharedStringsTable()\n    {\n        // maximum size of record data (excluding record header)\n        $continue_limit = 8224;\n\n        // initialize array of record data blocks\n        $recordDatas = array();\n\n        // start SST record data block with total number of strings, total number of unique strings\n        $recordData = pack(\"VV\", $this->stringTotal, $this->stringUnique);\n\n        // loop through all (unique) strings in shared strings table\n        foreach (array_keys($this->stringTable) as $string) {\n            // here $string is a BIFF8 encoded string\n\n            // length = character count\n            $headerinfo = unpack(\"vlength/Cencoding\", $string);\n\n            // currently, this is always 1 = uncompressed\n            $encoding = $headerinfo[\"encoding\"];\n\n            // initialize finished writing current $string\n            $finished = false;\n\n            while ($finished === false) {\n                // normally, there will be only one cycle, but if string cannot immediately be written as is\n                // there will be need for more than one cylcle, if string longer than one record data block, there\n                // may be need for even more cycles\n\n                if (strlen($recordData) + strlen($string) <= $continue_limit) {\n                    // then we can write the string (or remainder of string) without any problems\n                    $recordData .= $string;\n\n                    if (strlen($recordData) + strlen($string) == $continue_limit) {\n                        // we close the record data block, and initialize a new one\n                        $recordDatas[] = $recordData;\n                        $recordData = '';\n                    }\n\n                    // we are finished writing this string\n                    $finished = true;\n                } else {\n                    // special treatment writing the string (or remainder of the string)\n                    // If the string is very long it may need to be written in more than one CONTINUE record.\n\n                    // check how many bytes more there is room for in the current record\n                    $space_remaining = $continue_limit - strlen($recordData);\n\n                    // minimum space needed\n                    // uncompressed: 2 byte string length length field + 1 byte option flags + 2 byte character\n                    // compressed:   2 byte string length length field + 1 byte option flags + 1 byte character\n                    $min_space_needed = ($encoding == 1) ? 5 : 4;\n\n                    // We have two cases\n                    // 1. space remaining is less than minimum space needed\n                    //        here we must waste the space remaining and move to next record data block\n                    // 2. space remaining is greater than or equal to minimum space needed\n                    //        here we write as much as we can in the current block, then move to next record data block\n\n                    // 1. space remaining is less than minimum space needed\n                    if ($space_remaining < $min_space_needed) {\n                        // we close the block, store the block data\n                        $recordDatas[] = $recordData;\n\n                        // and start new record data block where we start writing the string\n                        $recordData = '';\n\n                    // 2. space remaining is greater than or equal to minimum space needed\n                    } else {\n                        // initialize effective remaining space, for Unicode strings this may need to be reduced by 1, see below\n                        $effective_space_remaining = $space_remaining;\n\n                        // for uncompressed strings, sometimes effective space remaining is reduced by 1\n                        if ($encoding == 1 && (strlen($string) - $space_remaining) % 2 == 1) {\n                            --$effective_space_remaining;\n                        }\n\n                        // one block fininshed, store the block data\n                        $recordData .= substr($string, 0, $effective_space_remaining);\n\n                        $string = substr($string, $effective_space_remaining); // for next cycle in while loop\n                        $recordDatas[] = $recordData;\n\n                        // start new record data block with the repeated option flags\n                        $recordData = pack('C', $encoding);\n                    }\n                }\n            }\n        }\n\n        // Store the last record data block unless it is empty\n        // if there was no need for any continue records, this will be the for SST record data block itself\n        if (strlen($recordData) > 0) {\n            $recordDatas[] = $recordData;\n        }\n\n        // combine into one chunk with all the blocks SST, CONTINUE,...\n        $chunk = '';\n        foreach ($recordDatas as $i => $recordData) {\n            // first block should have the SST record header, remaing should have CONTINUE header\n            $record = ($i == 0) ? 0x00FC : 0x003C;\n\n            $header = pack(\"vv\", $record, strlen($recordData));\n            $data = $header . $recordData;\n\n            $chunk .= $this->writeData($data);\n        }\n\n        return $chunk;\n    }\n\n    /**\n     * Writes the MSODRAWINGGROUP record if needed. Possibly split using CONTINUE records.\n     */\n    private function writeMsoDrawingGroup()\n    {\n        // write the Escher stream if necessary\n        if (isset($this->escher)) {\n            $writer = new PHPExcel_Writer_Excel5_Escher($this->escher);\n            $data = $writer->close();\n\n            $record = 0x00EB;\n            $length = strlen($data);\n            $header = pack(\"vv\", $record, $length);\n\n            return $this->writeData($header . $data);\n        } else {\n            return '';\n        }\n    }\n\n    /**\n     * Get Escher object\n     *\n     * @return PHPExcel_Shared_Escher\n     */\n    public function getEscher()\n    {\n        return $this->escher;\n    }\n\n    /**\n     * Set Escher object\n     *\n     * @param PHPExcel_Shared_Escher $pValue\n     */\n    public function setEscher(PHPExcel_Shared_Escher $pValue = null)\n    {\n        $this->escher = $pValue;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5_Worksheet\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n// Original file header of PEAR::Spreadsheet_Excel_Writer_Worksheet (used as the base for this class):\n// -----------------------------------------------------------------------------------------\n// /*\n// *  Module written/ported by Xavier Noguer <xnoguer@rezebra.com>\n// *\n// *  The majority of this is _NOT_ my code.  I simply ported it from the\n// *  PERL Spreadsheet::WriteExcel module.\n// *\n// *  The author of the Spreadsheet::WriteExcel module is John McNamara\n// *  <jmcnamara@cpan.org>\n// *\n// *  I _DO_ maintain this code, and John McNamara has nothing to do with the\n// *  porting of this code to PHP.  Any questions directly related to this\n// *  class library should be directed to me.\n// *\n// *  License Information:\n// *\n// *    Spreadsheet_Excel_Writer:  A library for generating Excel Spreadsheets\n// *    Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com\n// *\n// *    This library is free software; you can redistribute it and/or\n// *    modify it under the terms of the GNU Lesser General Public\n// *    License as published by the Free Software Foundation; either\n// *    version 2.1 of the License, or (at your option) any later version.\n// *\n// *    This library is distributed in the hope that it will be useful,\n// *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n// *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// *    Lesser General Public License for more details.\n// *\n// *    You should have received a copy of the GNU Lesser General Public\n// *    License along with this library; if not, write to the Free Software\n// *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// */\nclass PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter\n{\n    /**\n     * Formula parser\n     *\n     * @var PHPExcel_Writer_Excel5_Parser\n     */\n    private $parser;\n\n    /**\n     * Maximum number of characters for a string (LABEL record in BIFF5)\n     * @var integer\n     */\n    private $xlsStringMaxLength;\n\n    /**\n     * Array containing format information for columns\n     * @var array\n     */\n    private $columnInfo;\n\n    /**\n     * Array containing the selected area for the worksheet\n     * @var array\n     */\n    private $selection;\n\n    /**\n     * The active pane for the worksheet\n     * @var integer\n     */\n    private $activePane;\n\n    /**\n     * Whether to use outline.\n     * @var integer\n     */\n    private $outlineOn;\n\n    /**\n     * Auto outline styles.\n     * @var bool\n     */\n    private $outlineStyle;\n\n    /**\n     * Whether to have outline summary below.\n     * @var bool\n     */\n    private $outlineBelow;\n\n    /**\n     * Whether to have outline summary at the right.\n     * @var bool\n     */\n    private $outlineRight;\n\n    /**\n     * Reference to the total number of strings in the workbook\n     * @var integer\n     */\n    private $stringTotal;\n\n    /**\n     * Reference to the number of unique strings in the workbook\n     * @var integer\n     */\n    private $stringUnique;\n\n    /**\n     * Reference to the array containing all the unique strings in the workbook\n     * @var array\n     */\n    private $stringTable;\n\n    /**\n     * Color cache\n     */\n    private $colors;\n\n    /**\n     * Index of first used row (at least 0)\n     * @var int\n     */\n    private $firstRowIndex;\n\n    /**\n     * Index of last used row. (no used rows means -1)\n     * @var int\n     */\n    private $lastRowIndex;\n\n    /**\n     * Index of first used column (at least 0)\n     * @var int\n     */\n    private $firstColumnIndex;\n\n    /**\n     * Index of last used column (no used columns means -1)\n     * @var int\n     */\n    private $lastColumnIndex;\n\n    /**\n     * Sheet object\n     * @var PHPExcel_Worksheet\n     */\n    public $phpSheet;\n\n    /**\n     * Count cell style Xfs\n     *\n     * @var int\n     */\n    private $countCellStyleXfs;\n\n    /**\n     * Escher object corresponding to MSODRAWING\n     *\n     * @var PHPExcel_Shared_Escher\n     */\n    private $escher;\n\n    /**\n     * Array of font hashes associated to FONT records index\n     *\n     * @var array\n     */\n    public $fontHashIndex;\n\n    /**\n     * Constructor\n     *\n     * @param int        &$str_total        Total number of strings\n     * @param int        &$str_unique    Total number of unique strings\n     * @param array        &$str_table        String Table\n     * @param array        &$colors        Colour Table\n     * @param mixed        $parser            The formula parser created for the Workbook\n     * @param boolean    $preCalculateFormulas    Flag indicating whether formulas should be calculated or just written\n     * @param string    $phpSheet        The worksheet to write\n     * @param PHPExcel_Worksheet $phpSheet\n     */\n    public function __construct(&$str_total, &$str_unique, &$str_table, &$colors, $parser, $preCalculateFormulas, $phpSheet)\n    {\n        // It needs to call its parent's constructor explicitly\n        parent::__construct();\n\n        // change BIFFwriter limit for CONTINUE records\n//        $this->_limit = 8224;\n\n\n        $this->_preCalculateFormulas = $preCalculateFormulas;\n        $this->stringTotal        = &$str_total;\n        $this->stringUnique        = &$str_unique;\n        $this->stringTable        = &$str_table;\n        $this->colors            = &$colors;\n        $this->parser            = $parser;\n\n        $this->phpSheet = $phpSheet;\n\n        //$this->ext_sheets        = array();\n        //$this->offset            = 0;\n        $this->xlsStringMaxLength = 255;\n        $this->columnInfo  = array();\n        $this->selection   = array(0,0,0,0);\n        $this->activePane  = 3;\n\n        $this->_print_headers = 0;\n\n        $this->outlineStyle  = 0;\n        $this->outlineBelow  = 1;\n        $this->outlineRight  = 1;\n        $this->outlineOn     = 1;\n\n        $this->fontHashIndex = array();\n\n        // calculate values for DIMENSIONS record\n        $minR = 1;\n        $minC = 'A';\n\n        $maxR  = $this->phpSheet->getHighestRow();\n        $maxC = $this->phpSheet->getHighestColumn();\n\n        // Determine lowest and highest column and row\n//        $this->firstRowIndex = ($minR > 65535) ? 65535 : $minR;\n        $this->lastRowIndex = ($maxR > 65535) ? 65535 : $maxR ;\n\n        $this->firstColumnIndex = PHPExcel_Cell::columnIndexFromString($minC);\n        $this->lastColumnIndex  = PHPExcel_Cell::columnIndexFromString($maxC);\n\n//        if ($this->firstColumnIndex > 255) $this->firstColumnIndex = 255;\n        if ($this->lastColumnIndex > 255) {\n            $this->lastColumnIndex = 255;\n        }\n\n        $this->countCellStyleXfs = count($phpSheet->getParent()->getCellStyleXfCollection());\n    }\n\n    /**\n     * Add data to the beginning of the workbook (note the reverse order)\n     * and to the end of the workbook.\n     *\n     * @access public\n     * @see PHPExcel_Writer_Excel5_Workbook::storeWorkbook()\n     */\n    public function close()\n    {\n        $phpSheet = $this->phpSheet;\n\n        $num_sheets = $phpSheet->getParent()->getSheetCount();\n\n        // Write BOF record\n        $this->storeBof(0x0010);\n\n        // Write PRINTHEADERS\n        $this->writePrintHeaders();\n\n        // Write PRINTGRIDLINES\n        $this->writePrintGridlines();\n\n        // Write GRIDSET\n        $this->writeGridset();\n\n        // Calculate column widths\n        $phpSheet->calculateColumnWidths();\n\n        // Column dimensions\n        if (($defaultWidth = $phpSheet->getDefaultColumnDimension()->getWidth()) < 0) {\n            $defaultWidth = PHPExcel_Shared_Font::getDefaultColumnWidthByFont($phpSheet->getParent()->getDefaultStyle()->getFont());\n        }\n\n        $columnDimensions = $phpSheet->getColumnDimensions();\n        $maxCol = $this->lastColumnIndex -1;\n        for ($i = 0; $i <= $maxCol; ++$i) {\n            $hidden = 0;\n            $level = 0;\n            $xfIndex = 15; // there are 15 cell style Xfs\n\n            $width = $defaultWidth;\n\n            $columnLetter = PHPExcel_Cell::stringFromColumnIndex($i);\n            if (isset($columnDimensions[$columnLetter])) {\n                $columnDimension = $columnDimensions[$columnLetter];\n                if ($columnDimension->getWidth() >= 0) {\n                    $width = $columnDimension->getWidth();\n                }\n                $hidden = $columnDimension->getVisible() ? 0 : 1;\n                $level = $columnDimension->getOutlineLevel();\n                $xfIndex = $columnDimension->getXfIndex() + 15; // there are 15 cell style Xfs\n            }\n\n            // Components of columnInfo:\n            // $firstcol first column on the range\n            // $lastcol  last column on the range\n            // $width    width to set\n            // $xfIndex  The optional cell style Xf index to apply to the columns\n            // $hidden   The optional hidden atribute\n            // $level    The optional outline level\n            $this->columnInfo[] = array($i, $i, $width, $xfIndex, $hidden, $level);\n        }\n\n        // Write GUTS\n        $this->writeGuts();\n\n        // Write DEFAULTROWHEIGHT\n        $this->writeDefaultRowHeight();\n        // Write WSBOOL\n        $this->writeWsbool();\n        // Write horizontal and vertical page breaks\n        $this->writeBreaks();\n        // Write page header\n        $this->writeHeader();\n        // Write page footer\n        $this->writeFooter();\n        // Write page horizontal centering\n        $this->writeHcenter();\n        // Write page vertical centering\n        $this->writeVcenter();\n        // Write left margin\n        $this->writeMarginLeft();\n        // Write right margin\n        $this->writeMarginRight();\n        // Write top margin\n        $this->writeMarginTop();\n        // Write bottom margin\n        $this->writeMarginBottom();\n        // Write page setup\n        $this->writeSetup();\n        // Write sheet protection\n        $this->writeProtect();\n        // Write SCENPROTECT\n        $this->writeScenProtect();\n        // Write OBJECTPROTECT\n        $this->writeObjectProtect();\n        // Write sheet password\n        $this->writePassword();\n        // Write DEFCOLWIDTH record\n        $this->writeDefcol();\n\n        // Write the COLINFO records if they exist\n        if (!empty($this->columnInfo)) {\n            $colcount = count($this->columnInfo);\n            for ($i = 0; $i < $colcount; ++$i) {\n                $this->writeColinfo($this->columnInfo[$i]);\n            }\n        }\n        $autoFilterRange = $phpSheet->getAutoFilter()->getRange();\n        if (!empty($autoFilterRange)) {\n            // Write AUTOFILTERINFO\n            $this->writeAutoFilterInfo();\n        }\n\n        // Write sheet dimensions\n        $this->writeDimensions();\n\n        // Row dimensions\n        foreach ($phpSheet->getRowDimensions() as $rowDimension) {\n            $xfIndex = $rowDimension->getXfIndex() + 15; // there are 15 cellXfs\n            $this->writeRow($rowDimension->getRowIndex() - 1, $rowDimension->getRowHeight(), $xfIndex, ($rowDimension->getVisible() ? '0' : '1'), $rowDimension->getOutlineLevel());\n        }\n\n        // Write Cells\n        foreach ($phpSheet->getCellCollection() as $cellID) {\n            $cell = $phpSheet->getCell($cellID);\n            $row = $cell->getRow() - 1;\n            $column = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1;\n\n            // Don't break Excel!\n//            if ($row + 1 > 65536 or $column + 1 > 256) {\n            if ($row > 65535 || $column > 255) {\n                break;\n            }\n\n            // Write cell value\n            $xfIndex = $cell->getXfIndex() + 15; // there are 15 cell style Xfs\n\n            $cVal = $cell->getValue();\n            if ($cVal instanceof PHPExcel_RichText) {\n                // $this->writeString($row, $column, $cVal->getPlainText(), $xfIndex);\n                $arrcRun = array();\n                $str_len = PHPExcel_Shared_String::CountCharacters($cVal->getPlainText(), 'UTF-8');\n                $str_pos = 0;\n                $elements = $cVal->getRichTextElements();\n                foreach ($elements as $element) {\n                    // FONT Index\n                    if ($element instanceof PHPExcel_RichText_Run) {\n                        $str_fontidx = $this->fontHashIndex[$element->getFont()->getHashCode()];\n                    } else {\n                        $str_fontidx = 0;\n                    }\n                    $arrcRun[] = array('strlen' => $str_pos, 'fontidx' => $str_fontidx);\n                    // Position FROM\n                    $str_pos += PHPExcel_Shared_String::CountCharacters($element->getText(), 'UTF-8');\n                }\n                $this->writeRichTextString($row, $column, $cVal->getPlainText(), $xfIndex, $arrcRun);\n            } else {\n                switch ($cell->getDatatype()) {\n                    case PHPExcel_Cell_DataType::TYPE_STRING:\n                    case PHPExcel_Cell_DataType::TYPE_NULL:\n                        if ($cVal === '' || $cVal === null) {\n                            $this->writeBlank($row, $column, $xfIndex);\n                        } else {\n                            $this->writeString($row, $column, $cVal, $xfIndex);\n                        }\n                        break;\n\n                    case PHPExcel_Cell_DataType::TYPE_NUMERIC:\n                        $this->writeNumber($row, $column, $cVal, $xfIndex);\n                        break;\n\n                    case PHPExcel_Cell_DataType::TYPE_FORMULA:\n                        $calculatedValue = $this->_preCalculateFormulas ?\n                            $cell->getCalculatedValue() : null;\n                        $this->writeFormula($row, $column, $cVal, $xfIndex, $calculatedValue);\n                        break;\n\n                    case PHPExcel_Cell_DataType::TYPE_BOOL:\n                        $this->writeBoolErr($row, $column, $cVal, 0, $xfIndex);\n                        break;\n\n                    case PHPExcel_Cell_DataType::TYPE_ERROR:\n                        $this->writeBoolErr($row, $column, self::mapErrorCode($cVal), 1, $xfIndex);\n                        break;\n\n                }\n            }\n        }\n\n        // Append\n        $this->writeMsoDrawing();\n\n        // Write WINDOW2 record\n        $this->writeWindow2();\n\n        // Write PLV record\n        $this->writePageLayoutView();\n\n        // Write ZOOM record\n        $this->writeZoom();\n        if ($phpSheet->getFreezePane()) {\n            $this->writePanes();\n        }\n\n        // Write SELECTION record\n        $this->writeSelection();\n\n        // Write MergedCellsTable Record\n        $this->writeMergedCells();\n\n        // Hyperlinks\n        foreach ($phpSheet->getHyperLinkCollection() as $coordinate => $hyperlink) {\n            list($column, $row) = PHPExcel_Cell::coordinateFromString($coordinate);\n\n            $url = $hyperlink->getUrl();\n\n            if (strpos($url, 'sheet://') !== false) {\n                // internal to current workbook\n                $url = str_replace('sheet://', 'internal:', $url);\n\n            } elseif (preg_match('/^(http:|https:|ftp:|mailto:)/', $url)) {\n                // URL\n                // $url = $url;\n\n            } else {\n                // external (local file)\n                $url = 'external:' . $url;\n            }\n\n            $this->writeUrl($row - 1, PHPExcel_Cell::columnIndexFromString($column) - 1, $url);\n        }\n\n        $this->writeDataValidity();\n        $this->writeSheetLayout();\n\n        // Write SHEETPROTECTION record\n        $this->writeSheetProtection();\n        $this->writeRangeProtection();\n\n        $arrConditionalStyles = $phpSheet->getConditionalStylesCollection();\n        if (!empty($arrConditionalStyles)) {\n            $arrConditional = array();\n            // @todo CFRule & CFHeader\n            // Write CFHEADER record\n            $this->writeCFHeader();\n            // Write ConditionalFormattingTable records\n            foreach ($arrConditionalStyles as $cellCoordinate => $conditionalStyles) {\n                foreach ($conditionalStyles as $conditional) {\n                    if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION\n                        || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS) {\n                        if (!in_array($conditional->getHashCode(), $arrConditional)) {\n                            $arrConditional[] = $conditional->getHashCode();\n                            // Write CFRULE record\n                            $this->writeCFRule($conditional);\n                        }\n                    }\n                }\n            }\n        }\n\n        $this->storeEof();\n    }\n\n    /**\n     * Write a cell range address in BIFF8\n     * always fixed range\n     * See section 2.5.14 in OpenOffice.org's Documentation of the Microsoft Excel File Format\n     *\n     * @param string $range E.g. 'A1' or 'A1:B6'\n     * @return string Binary data\n     */\n    private function writeBIFF8CellRangeAddressFixed($range = 'A1')\n    {\n        $explodes = explode(':', $range);\n\n        // extract first cell, e.g. 'A1'\n        $firstCell = $explodes[0];\n\n        // extract last cell, e.g. 'B6'\n        if (count($explodes) == 1) {\n            $lastCell = $firstCell;\n        } else {\n            $lastCell = $explodes[1];\n        }\n\n        $firstCellCoordinates = PHPExcel_Cell::coordinateFromString($firstCell); // e.g. array(0, 1)\n        $lastCellCoordinates  = PHPExcel_Cell::coordinateFromString($lastCell);  // e.g. array(1, 6)\n\n        return pack('vvvv', $firstCellCoordinates[1] - 1, $lastCellCoordinates[1] - 1, PHPExcel_Cell::columnIndexFromString($firstCellCoordinates[0]) - 1, PHPExcel_Cell::columnIndexFromString($lastCellCoordinates[0]) - 1);\n    }\n\n    /**\n     * Retrieves data from memory in one chunk, or from disk in $buffer\n     * sized chunks.\n     *\n     * @return string The data\n     */\n    public function getData()\n    {\n        $buffer = 4096;\n\n        // Return data stored in memory\n        if (isset($this->_data)) {\n            $tmp   = $this->_data;\n            unset($this->_data);\n            return $tmp;\n        }\n        // No data to return\n        return false;\n    }\n\n    /**\n     * Set the option to print the row and column headers on the printed page.\n     *\n     * @access public\n     * @param integer $print Whether to print the headers or not. Defaults to 1 (print).\n     */\n    public function printRowColHeaders($print = 1)\n    {\n        $this->_print_headers = $print;\n    }\n\n    /**\n     * This method sets the properties for outlining and grouping. The defaults\n     * correspond to Excel's defaults.\n     *\n     * @param bool $visible\n     * @param bool $symbols_below\n     * @param bool $symbols_right\n     * @param bool $auto_style\n     */\n    public function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false)\n    {\n        $this->outlineOn    = $visible;\n        $this->outlineBelow = $symbols_below;\n        $this->outlineRight = $symbols_right;\n        $this->outlineStyle = $auto_style;\n\n        // Ensure this is a boolean vale for Window2\n        if ($this->outlineOn) {\n            $this->outlineOn = 1;\n        }\n    }\n\n    /**\n     * Write a double to the specified row and column (zero indexed).\n     * An integer can be written as a double. Excel will display an\n     * integer. $format is optional.\n     *\n     * Returns  0 : normal termination\n     *         -2 : row or column out of range\n     *\n     * @param integer $row    Zero indexed row\n     * @param integer $col    Zero indexed column\n     * @param float   $num    The number to write\n     * @param mixed   $xfIndex The optional XF format\n     * @return integer\n     */\n    private function writeNumber($row, $col, $num, $xfIndex)\n    {\n        $record    = 0x0203;                 // Record identifier\n        $length    = 0x000E;                 // Number of bytes to follow\n\n        $header        = pack(\"vv\", $record, $length);\n        $data        = pack(\"vvv\", $row, $col, $xfIndex);\n        $xl_double    = pack(\"d\", $num);\n        if (self::getByteOrder()) { // if it's Big Endian\n            $xl_double = strrev($xl_double);\n        }\n\n        $this->append($header.$data.$xl_double);\n        return(0);\n    }\n\n    /**\n     * Write a LABELSST record or a LABEL record. Which one depends on BIFF version\n     *\n     * @param int $row Row index (0-based)\n     * @param int $col Column index (0-based)\n     * @param string $str The string\n     * @param int $xfIndex Index to XF record\n     */\n    private function writeString($row, $col, $str, $xfIndex)\n    {\n        $this->writeLabelSst($row, $col, $str, $xfIndex);\n    }\n\n    /**\n     * Write a LABELSST record or a LABEL record. Which one depends on BIFF version\n     * It differs from writeString by the writing of rich text strings.\n     * @param int $row Row index (0-based)\n     * @param int $col Column index (0-based)\n     * @param string $str The string\n     * @param mixed   $xfIndex The XF format index for the cell\n     * @param array $arrcRun Index to Font record and characters beginning\n     */\n    private function writeRichTextString($row, $col, $str, $xfIndex, $arrcRun)\n    {\n        $record    = 0x00FD;                   // Record identifier\n        $length    = 0x000A;                   // Bytes to follow\n        $str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($str, $arrcRun);\n\n        /* check if string is already present */\n        if (!isset($this->stringTable[$str])) {\n            $this->stringTable[$str] = $this->stringUnique++;\n        }\n        $this->stringTotal++;\n\n        $header    = pack('vv', $record, $length);\n        $data    = pack('vvvV', $row, $col, $xfIndex, $this->stringTable[$str]);\n        $this->append($header.$data);\n    }\n\n    /**\n     * Write a string to the specified row and column (zero indexed).\n     * NOTE: there is an Excel 5 defined limit of 255 characters.\n     * $format is optional.\n     * Returns  0 : normal termination\n     *         -2 : row or column out of range\n     *         -3 : long string truncated to 255 chars\n     *\n     * @access public\n     * @param integer $row    Zero indexed row\n     * @param integer $col    Zero indexed column\n     * @param string  $str    The string to write\n     * @param mixed   $xfIndex The XF format index for the cell\n     * @return integer\n     */\n    private function writeLabel($row, $col, $str, $xfIndex)\n    {\n        $strlen    = strlen($str);\n        $record    = 0x0204;                   // Record identifier\n        $length    = 0x0008 + $strlen;         // Bytes to follow\n\n        $str_error = 0;\n\n        if ($strlen > $this->xlsStringMaxLength) { // LABEL must be < 255 chars\n            $str    = substr($str, 0, $this->xlsStringMaxLength);\n            $length    = 0x0008 + $this->xlsStringMaxLength;\n            $strlen    = $this->xlsStringMaxLength;\n            $str_error = -3;\n        }\n\n        $header    = pack(\"vv\", $record, $length);\n        $data    = pack(\"vvvv\", $row, $col, $xfIndex, $strlen);\n        $this->append($header . $data . $str);\n        return($str_error);\n    }\n\n    /**\n     * Write a string to the specified row and column (zero indexed).\n     * This is the BIFF8 version (no 255 chars limit).\n     * $format is optional.\n     * Returns  0 : normal termination\n     *         -2 : row or column out of range\n     *         -3 : long string truncated to 255 chars\n     *\n     * @access public\n     * @param integer $row    Zero indexed row\n     * @param integer $col    Zero indexed column\n     * @param string  $str    The string to write\n     * @param mixed   $xfIndex The XF format index for the cell\n     * @return integer\n     */\n    private function writeLabelSst($row, $col, $str, $xfIndex)\n    {\n        $record    = 0x00FD;                   // Record identifier\n        $length    = 0x000A;                   // Bytes to follow\n\n        $str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($str);\n\n        /* check if string is already present */\n        if (!isset($this->stringTable[$str])) {\n            $this->stringTable[$str] = $this->stringUnique++;\n        }\n        $this->stringTotal++;\n\n        $header    = pack('vv', $record, $length);\n        $data    = pack('vvvV', $row, $col, $xfIndex, $this->stringTable[$str]);\n        $this->append($header.$data);\n    }\n\n    /**\n     * Writes a note associated with the cell given by the row and column.\n     * NOTE records don't have a length limit.\n     *\n     * @param integer $row    Zero indexed row\n     * @param integer $col    Zero indexed column\n     * @param string  $note   The note to write\n     */\n    private function writeNote($row, $col, $note)\n    {\n        $note_length    = strlen($note);\n        $record            = 0x001C;            // Record identifier\n        $max_length        = 2048;                // Maximun length for a NOTE record\n\n        // Length for this record is no more than 2048 + 6\n        $length    = 0x0006 + min($note_length, 2048);\n        $header    = pack(\"vv\", $record, $length);\n        $data    = pack(\"vvv\", $row, $col, $note_length);\n        $this->append($header . $data . substr($note, 0, 2048));\n\n        for ($i = $max_length; $i < $note_length; $i += $max_length) {\n            $chunk  = substr($note, $i, $max_length);\n            $length = 0x0006 + strlen($chunk);\n            $header = pack(\"vv\", $record, $length);\n            $data   = pack(\"vvv\", -1, 0, strlen($chunk));\n            $this->append($header.$data.$chunk);\n        }\n        return(0);\n    }\n\n    /**\n     * Write a blank cell to the specified row and column (zero indexed).\n     * A blank cell is used to specify formatting without adding a string\n     * or a number.\n     *\n     * A blank cell without a format serves no purpose. Therefore, we don't write\n     * a BLANK record unless a format is specified.\n     *\n     * Returns  0 : normal termination (including no format)\n     *         -1 : insufficient number of arguments\n     *         -2 : row or column out of range\n     *\n     * @param integer $row    Zero indexed row\n     * @param integer $col    Zero indexed column\n     * @param mixed   $xfIndex The XF format index\n     */\n    public function writeBlank($row, $col, $xfIndex)\n    {\n        $record    = 0x0201;                 // Record identifier\n        $length    = 0x0006;                 // Number of bytes to follow\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"vvv\", $row, $col, $xfIndex);\n        $this->append($header . $data);\n        return 0;\n    }\n\n    /**\n     * Write a boolean or an error type to the specified row and column (zero indexed)\n     *\n     * @param int $row Row index (0-based)\n     * @param int $col Column index (0-based)\n     * @param int $value\n     * @param boolean $isError Error or Boolean?\n     * @param int $xfIndex\n     */\n    private function writeBoolErr($row, $col, $value, $isError, $xfIndex)\n    {\n        $record = 0x0205;\n        $length = 8;\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"vvvCC\", $row, $col, $xfIndex, $value, $isError);\n        $this->append($header . $data);\n        return 0;\n    }\n\n    /**\n     * Write a formula to the specified row and column (zero indexed).\n     * The textual representation of the formula is passed to the parser in\n     * Parser.php which returns a packed binary string.\n     *\n     * Returns  0 : normal termination\n     *         -1 : formula errors (bad formula)\n     *         -2 : row or column out of range\n     *\n     * @param integer $row     Zero indexed row\n     * @param integer $col     Zero indexed column\n     * @param string  $formula The formula text string\n     * @param mixed   $xfIndex  The XF format index\n     * @param mixed   $calculatedValue  Calculated value\n     * @return integer\n     */\n    private function writeFormula($row, $col, $formula, $xfIndex, $calculatedValue)\n    {\n        $record    = 0x0006;     // Record identifier\n\n        // Initialize possible additional value for STRING record that should be written after the FORMULA record?\n        $stringValue = null;\n\n        // calculated value\n        if (isset($calculatedValue)) {\n            // Since we can't yet get the data type of the calculated value,\n            // we use best effort to determine data type\n            if (is_bool($calculatedValue)) {\n                // Boolean value\n                $num = pack('CCCvCv', 0x01, 0x00, (int)$calculatedValue, 0x00, 0x00, 0xFFFF);\n            } elseif (is_int($calculatedValue) || is_float($calculatedValue)) {\n                // Numeric value\n                $num = pack('d', $calculatedValue);\n            } elseif (is_string($calculatedValue)) {\n                if (array_key_exists($calculatedValue, PHPExcel_Cell_DataType::getErrorCodes())) {\n                    // Error value\n                    $num = pack('CCCvCv', 0x02, 0x00, self::mapErrorCode($calculatedValue), 0x00, 0x00, 0xFFFF);\n                } elseif ($calculatedValue === '') {\n                    // Empty string (and BIFF8)\n                    $num = pack('CCCvCv', 0x03, 0x00, 0x00, 0x00, 0x00, 0xFFFF);\n                } else {\n                    // Non-empty string value (or empty string BIFF5)\n                    $stringValue = $calculatedValue;\n                    $num = pack('CCCvCv', 0x00, 0x00, 0x00, 0x00, 0x00, 0xFFFF);\n                }\n            } else {\n                // We are really not supposed to reach here\n                $num = pack('d', 0x00);\n            }\n        } else {\n            $num = pack('d', 0x00);\n        }\n\n        $grbit        = 0x03;                // Option flags\n        $unknown    = 0x0000;            // Must be zero\n\n        // Strip the '=' or '@' sign at the beginning of the formula string\n        if ($formula{0} == '=') {\n            $formula = substr($formula, 1);\n        } else {\n            // Error handling\n            $this->writeString($row, $col, 'Unrecognised character for formula');\n            return -1;\n        }\n\n        // Parse the formula using the parser in Parser.php\n        try {\n            $error = $this->parser->parse($formula);\n            $formula = $this->parser->toReversePolish();\n\n            $formlen    = strlen($formula);    // Length of the binary string\n            $length     = 0x16 + $formlen;     // Length of the record data\n\n            $header    = pack(\"vv\", $record, $length);\n\n            $data      = pack(\"vvv\", $row, $col, $xfIndex)\n                        . $num\n                        . pack(\"vVv\", $grbit, $unknown, $formlen);\n            $this->append($header . $data . $formula);\n\n            // Append also a STRING record if necessary\n            if ($stringValue !== null) {\n                $this->writeStringRecord($stringValue);\n            }\n\n            return 0;\n\n        } catch (PHPExcel_Exception $e) {\n            // do nothing\n        }\n\n    }\n\n    /**\n     * Write a STRING record. This\n     *\n     * @param string $stringValue\n     */\n    private function writeStringRecord($stringValue)\n    {\n        $record = 0x0207;     // Record identifier\n        $data = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($stringValue);\n\n        $length = strlen($data);\n        $header = pack('vv', $record, $length);\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write a hyperlink.\n     * This is comprised of two elements: the visible label and\n     * the invisible link. The visible label is the same as the link unless an\n     * alternative string is specified. The label is written using the\n     * writeString() method. Therefore the 255 characters string limit applies.\n     * $string and $format are optional.\n     *\n     * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external\n     * directory url.\n     *\n     * Returns  0 : normal termination\n     *         -2 : row or column out of range\n     *         -3 : long string truncated to 255 chars\n     *\n     * @param integer $row    Row\n     * @param integer $col    Column\n     * @param string  $url    URL string\n     * @return integer\n     */\n    private function writeUrl($row, $col, $url)\n    {\n        // Add start row and col to arg list\n        return($this->writeUrlRange($row, $col, $row, $col, $url));\n    }\n\n    /**\n     * This is the more general form of writeUrl(). It allows a hyperlink to be\n     * written to a range of cells. This function also decides the type of hyperlink\n     * to be written. These are either, Web (http, ftp, mailto), Internal\n     * (Sheet1!A1) or external ('c:\\temp\\foo.xls#Sheet1!A1').\n     *\n     * @access private\n     * @see writeUrl()\n     * @param integer $row1   Start row\n     * @param integer $col1   Start column\n     * @param integer $row2   End row\n     * @param integer $col2   End column\n     * @param string  $url    URL string\n     * @return integer\n     */\n    public function writeUrlRange($row1, $col1, $row2, $col2, $url)\n    {\n        // Check for internal/external sheet links or default to web link\n        if (preg_match('[^internal:]', $url)) {\n            return($this->writeUrlInternal($row1, $col1, $row2, $col2, $url));\n        }\n        if (preg_match('[^external:]', $url)) {\n            return($this->writeUrlExternal($row1, $col1, $row2, $col2, $url));\n        }\n        return($this->writeUrlWeb($row1, $col1, $row2, $col2, $url));\n    }\n\n    /**\n     * Used to write http, ftp and mailto hyperlinks.\n     * The link type ($options) is 0x03 is the same as absolute dir ref without\n     * sheet. However it is differentiated by the $unknown2 data stream.\n     *\n     * @access private\n     * @see writeUrl()\n     * @param integer $row1   Start row\n     * @param integer $col1   Start column\n     * @param integer $row2   End row\n     * @param integer $col2   End column\n     * @param string  $url    URL string\n     * @return integer\n     */\n    public function writeUrlWeb($row1, $col1, $row2, $col2, $url)\n    {\n        $record      = 0x01B8;                       // Record identifier\n        $length      = 0x00000;                      // Bytes to follow\n\n        // Pack the undocumented parts of the hyperlink stream\n        $unknown1    = pack(\"H*\", \"D0C9EA79F9BACE118C8200AA004BA90B02000000\");\n        $unknown2    = pack(\"H*\", \"E0C9EA79F9BACE118C8200AA004BA90B\");\n\n        // Pack the option flags\n        $options     = pack(\"V\", 0x03);\n\n        // Convert URL to a null terminated wchar string\n        $url         = join(\"\\0\", preg_split(\"''\", $url, -1, PREG_SPLIT_NO_EMPTY));\n        $url         = $url . \"\\0\\0\\0\";\n\n        // Pack the length of the URL\n        $url_len     = pack(\"V\", strlen($url));\n\n        // Calculate the data length\n        $length      = 0x34 + strlen($url);\n\n        // Pack the header data\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"vvvv\", $row1, $row2, $col1, $col2);\n\n        // Write the packed data\n        $this->append($header . $data .\n                       $unknown1 . $options .\n                       $unknown2 . $url_len . $url);\n        return 0;\n    }\n\n    /**\n     * Used to write internal reference hyperlinks such as \"Sheet1!A1\".\n     *\n     * @access private\n     * @see writeUrl()\n     * @param integer $row1   Start row\n     * @param integer $col1   Start column\n     * @param integer $row2   End row\n     * @param integer $col2   End column\n     * @param string  $url    URL string\n     * @return integer\n     */\n    public function writeUrlInternal($row1, $col1, $row2, $col2, $url)\n    {\n        $record      = 0x01B8;                       // Record identifier\n        $length      = 0x00000;                      // Bytes to follow\n\n        // Strip URL type\n        $url = preg_replace('/^internal:/', '', $url);\n\n        // Pack the undocumented parts of the hyperlink stream\n        $unknown1    = pack(\"H*\", \"D0C9EA79F9BACE118C8200AA004BA90B02000000\");\n\n        // Pack the option flags\n        $options     = pack(\"V\", 0x08);\n\n        // Convert the URL type and to a null terminated wchar string\n        $url .= \"\\0\";\n\n        // character count\n        $url_len = PHPExcel_Shared_String::CountCharacters($url);\n        $url_len = pack('V', $url_len);\n\n        $url = PHPExcel_Shared_String::ConvertEncoding($url, 'UTF-16LE', 'UTF-8');\n\n        // Calculate the data length\n        $length      = 0x24 + strlen($url);\n\n        // Pack the header data\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"vvvv\", $row1, $row2, $col1, $col2);\n\n        // Write the packed data\n        $this->append($header . $data .\n                       $unknown1 . $options .\n                       $url_len . $url);\n        return 0;\n    }\n\n    /**\n     * Write links to external directory names such as 'c:\\foo.xls',\n     * c:\\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'.\n     *\n     * Note: Excel writes some relative links with the $dir_long string. We ignore\n     * these cases for the sake of simpler code.\n     *\n     * @access private\n     * @see writeUrl()\n     * @param integer $row1   Start row\n     * @param integer $col1   Start column\n     * @param integer $row2   End row\n     * @param integer $col2   End column\n     * @param string  $url    URL string\n     * @return integer\n     */\n    public function writeUrlExternal($row1, $col1, $row2, $col2, $url)\n    {\n        // Network drives are different. We will handle them separately\n        // MS/Novell network drives and shares start with \\\\\n        if (preg_match('[^external:\\\\\\\\]', $url)) {\n            return; //($this->writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format));\n        }\n\n        $record      = 0x01B8;                       // Record identifier\n        $length      = 0x00000;                      // Bytes to follow\n\n        // Strip URL type and change Unix dir separator to Dos style (if needed)\n        //\n        $url = preg_replace('/^external:/', '', $url);\n        $url = preg_replace('/\\//', \"\\\\\", $url);\n\n        // Determine if the link is relative or absolute:\n        //   relative if link contains no dir separator, \"somefile.xls\"\n        //   relative if link starts with up-dir, \"..\\..\\somefile.xls\"\n        //   otherwise, absolute\n\n        $absolute = 0x00; // relative path\n        if (preg_match('/^[A-Z]:/', $url)) {\n            $absolute = 0x02; // absolute path on Windows, e.g. C:\\...\n        }\n        $link_type               = 0x01 | $absolute;\n\n        // Determine if the link contains a sheet reference and change some of the\n        // parameters accordingly.\n        // Split the dir name and sheet name (if it exists)\n        $dir_long = $url;\n        if (preg_match(\"/\\#/\", $url)) {\n            $link_type |= 0x08;\n        }\n\n\n        // Pack the link type\n        $link_type   = pack(\"V\", $link_type);\n\n        // Calculate the up-level dir count e.g.. (..\\..\\..\\ == 3)\n        $up_count    = preg_match_all(\"/\\.\\.\\\\\\/\", $dir_long, $useless);\n        $up_count    = pack(\"v\", $up_count);\n\n        // Store the short dos dir name (null terminated)\n        $dir_short   = preg_replace(\"/\\.\\.\\\\\\/\", '', $dir_long) . \"\\0\";\n\n        // Store the long dir name as a wchar string (non-null terminated)\n        $dir_long       = $dir_long . \"\\0\";\n\n        // Pack the lengths of the dir strings\n        $dir_short_len = pack(\"V\", strlen($dir_short));\n        $dir_long_len  = pack(\"V\", strlen($dir_long));\n        $stream_len    = pack(\"V\", 0); //strlen($dir_long) + 0x06);\n\n        // Pack the undocumented parts of the hyperlink stream\n        $unknown1 = pack(\"H*\", 'D0C9EA79F9BACE118C8200AA004BA90B02000000');\n        $unknown2 = pack(\"H*\", '0303000000000000C000000000000046');\n        $unknown3 = pack(\"H*\", 'FFFFADDE000000000000000000000000000000000000000');\n        $unknown4 = pack(\"v\", 0x03);\n\n        // Pack the main data stream\n        $data        = pack(\"vvvv\", $row1, $row2, $col1, $col2) .\n                          $unknown1     .\n                          $link_type    .\n                          $unknown2     .\n                          $up_count     .\n                          $dir_short_len.\n                          $dir_short    .\n                          $unknown3     .\n                          $stream_len   ;/*.\n                          $dir_long_len .\n                          $unknown4     .\n                          $dir_long     .\n                          $sheet_len    .\n                          $sheet        ;*/\n\n        // Pack the header data\n        $length   = strlen($data);\n        $header   = pack(\"vv\", $record, $length);\n\n        // Write the packed data\n        $this->append($header. $data);\n        return 0;\n    }\n\n    /**\n     * This method is used to set the height and format for a row.\n     *\n     * @param integer $row    The row to set\n     * @param integer $height Height we are giving to the row.\n     *                        Use null to set XF without setting height\n     * @param integer $xfIndex  The optional cell style Xf index to apply to the columns\n     * @param bool    $hidden The optional hidden attribute\n     * @param integer $level  The optional outline level for row, in range [0,7]\n     */\n    private function writeRow($row, $height, $xfIndex, $hidden = false, $level = 0)\n    {\n        $record      = 0x0208;               // Record identifier\n        $length      = 0x0010;               // Number of bytes to follow\n\n        $colMic      = 0x0000;               // First defined column\n        $colMac      = 0x0000;               // Last defined column\n        $irwMac      = 0x0000;               // Used by Excel to optimise loading\n        $reserved    = 0x0000;               // Reserved\n        $grbit       = 0x0000;               // Option flags\n        $ixfe        = $xfIndex;\n\n        if ($height < 0) {\n            $height = null;\n        }\n\n        // Use writeRow($row, null, $XF) to set XF format without setting height\n        if ($height != null) {\n            $miyRw = $height * 20;  // row height\n        } else {\n            $miyRw = 0xff;          // default row height is 256\n        }\n\n        // Set the options flags. fUnsynced is used to show that the font and row\n        // heights are not compatible. This is usually the case for WriteExcel.\n        // The collapsed flag 0x10 doesn't seem to be used to indicate that a row\n        // is collapsed. Instead it is used to indicate that the previous row is\n        // collapsed. The zero height flag, 0x20, is used to collapse a row.\n\n        $grbit |= $level;\n        if ($hidden) {\n            $grbit |= 0x0030;\n        }\n        if ($height !== null) {\n            $grbit |= 0x0040; // fUnsynced\n        }\n        if ($xfIndex !== 0xF) {\n            $grbit |= 0x0080;\n        }\n        $grbit |= 0x0100;\n\n        $header   = pack(\"vv\", $record, $length);\n        $data     = pack(\"vvvvvvvv\", $row, $colMic, $colMac, $miyRw, $irwMac, $reserved, $grbit, $ixfe);\n        $this->append($header.$data);\n    }\n\n    /**\n     * Writes Excel DIMENSIONS to define the area in which there is data.\n     */\n    private function writeDimensions()\n    {\n        $record = 0x0200; // Record identifier\n\n        $length = 0x000E;\n        $data = pack('VVvvv', $this->firstRowIndex, $this->lastRowIndex + 1, $this->firstColumnIndex, $this->lastColumnIndex + 1, 0x0000); // reserved\n\n        $header = pack(\"vv\", $record, $length);\n        $this->append($header.$data);\n    }\n\n    /**\n     * Write BIFF record Window2.\n     */\n    private function writeWindow2()\n    {\n        $record         = 0x023E;     // Record identifier\n        $length         = 0x0012;\n\n        $grbit          = 0x00B6;     // Option flags\n        $rwTop          = 0x0000;     // Top row visible in window\n        $colLeft        = 0x0000;     // Leftmost column visible in window\n\n\n        // The options flags that comprise $grbit\n        $fDspFmla       = 0;                     // 0 - bit\n        $fDspGrid       = $this->phpSheet->getShowGridlines() ? 1 : 0; // 1\n        $fDspRwCol      = $this->phpSheet->getShowRowColHeaders() ? 1 : 0; // 2\n        $fFrozen        = $this->phpSheet->getFreezePane() ? 1 : 0;        // 3\n        $fDspZeros      = 1;                     // 4\n        $fDefaultHdr    = 1;                     // 5\n        $fArabic        = $this->phpSheet->getRightToLeft() ? 1 : 0; // 6\n        $fDspGuts       = $this->outlineOn;    // 7\n        $fFrozenNoSplit = 0;                     // 0 - bit\n        // no support in PHPExcel for selected sheet, therefore sheet is only selected if it is the active sheet\n        $fSelected      = ($this->phpSheet === $this->phpSheet->getParent()->getActiveSheet()) ? 1 : 0;\n        $fPaged         = 1;                     // 2\n        $fPageBreakPreview = $this->phpSheet->getSheetView()->getView() === PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW;\n\n        $grbit             = $fDspFmla;\n        $grbit            |= $fDspGrid       << 1;\n        $grbit            |= $fDspRwCol       << 2;\n        $grbit            |= $fFrozen           << 3;\n        $grbit            |= $fDspZeros       << 4;\n        $grbit            |= $fDefaultHdr       << 5;\n        $grbit            |= $fArabic           << 6;\n        $grbit            |= $fDspGuts       << 7;\n        $grbit            |= $fFrozenNoSplit << 8;\n        $grbit            |= $fSelected       << 9;\n        $grbit            |= $fPaged           << 10;\n        $grbit            |= $fPageBreakPreview << 11;\n\n        $header  = pack(\"vv\", $record, $length);\n        $data    = pack(\"vvv\", $grbit, $rwTop, $colLeft);\n\n        // FIXME !!!\n        $rgbHdr       = 0x0040; // Row/column heading and gridline color index\n        $zoom_factor_page_break = ($fPageBreakPreview ? $this->phpSheet->getSheetView()->getZoomScale() : 0x0000);\n        $zoom_factor_normal =  $this->phpSheet->getSheetView()->getZoomScaleNormal();\n\n        $data .= pack(\"vvvvV\", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000);\n\n        $this->append($header.$data);\n    }\n\n    /**\n     * Write BIFF record DEFAULTROWHEIGHT.\n     */\n    private function writeDefaultRowHeight()\n    {\n        $defaultRowHeight = $this->phpSheet->getDefaultRowDimension()->getRowHeight();\n\n        if ($defaultRowHeight < 0) {\n            return;\n        }\n\n        // convert to twips\n        $defaultRowHeight = (int) 20 * $defaultRowHeight;\n\n        $record   = 0x0225;      // Record identifier\n        $length   = 0x0004;      // Number of bytes to follow\n\n        $header   = pack(\"vv\", $record, $length);\n        $data     = pack(\"vv\", 1, $defaultRowHeight);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write BIFF record DEFCOLWIDTH if COLINFO records are in use.\n     */\n    private function writeDefcol()\n    {\n        $defaultColWidth = 8;\n\n        $record   = 0x0055;      // Record identifier\n        $length   = 0x0002;      // Number of bytes to follow\n\n        $header = pack(\"vv\", $record, $length);\n        $data = pack(\"v\", $defaultColWidth);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write BIFF record COLINFO to define column widths\n     *\n     * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C\n     * length record.\n     *\n     * @param array $col_array This is the only parameter received and is composed of the following:\n     *                0 => First formatted column,\n     *                1 => Last formatted column,\n     *                2 => Col width (8.43 is Excel default),\n     *                3 => The optional XF format of the column,\n     *                4 => Option flags.\n     *                5 => Optional outline level\n     */\n    private function writeColinfo($col_array)\n    {\n        if (isset($col_array[0])) {\n            $colFirst = $col_array[0];\n        }\n        if (isset($col_array[1])) {\n            $colLast = $col_array[1];\n        }\n        if (isset($col_array[2])) {\n            $coldx = $col_array[2];\n        } else {\n            $coldx = 8.43;\n        }\n        if (isset($col_array[3])) {\n            $xfIndex = $col_array[3];\n        } else {\n            $xfIndex = 15;\n        }\n        if (isset($col_array[4])) {\n            $grbit = $col_array[4];\n        } else {\n            $grbit = 0;\n        }\n        if (isset($col_array[5])) {\n            $level = $col_array[5];\n        } else {\n            $level = 0;\n        }\n        $record   = 0x007D;          // Record identifier\n        $length   = 0x000C;          // Number of bytes to follow\n\n        $coldx   *= 256;             // Convert to units of 1/256 of a char\n\n        $ixfe     = $xfIndex;\n        $reserved = 0x0000;            // Reserved\n\n        $level = max(0, min($level, 7));\n        $grbit |= $level << 8;\n\n        $header   = pack(\"vv\", $record, $length);\n        $data     = pack(\"vvvvvv\", $colFirst, $colLast, $coldx, $ixfe, $grbit, $reserved);\n        $this->append($header.$data);\n    }\n\n    /**\n     * Write BIFF record SELECTION.\n     */\n    private function writeSelection()\n    {\n        // look up the selected cell range\n        $selectedCells = $this->phpSheet->getSelectedCells();\n        $selectedCells = PHPExcel_Cell::splitRange($this->phpSheet->getSelectedCells());\n        $selectedCells = $selectedCells[0];\n        if (count($selectedCells) == 2) {\n            list($first, $last) = $selectedCells;\n        } else {\n            $first = $selectedCells[0];\n            $last  = $selectedCells[0];\n        }\n\n        list($colFirst, $rwFirst) = PHPExcel_Cell::coordinateFromString($first);\n        $colFirst = PHPExcel_Cell::columnIndexFromString($colFirst) - 1; // base 0 column index\n        --$rwFirst; // base 0 row index\n\n        list($colLast, $rwLast) = PHPExcel_Cell::coordinateFromString($last);\n        $colLast = PHPExcel_Cell::columnIndexFromString($colLast) - 1; // base 0 column index\n        --$rwLast; // base 0 row index\n\n        // make sure we are not out of bounds\n        $colFirst = min($colFirst, 255);\n        $colLast  = min($colLast, 255);\n\n        $rwFirst = min($rwFirst, 65535);\n        $rwLast  = min($rwLast, 65535);\n\n        $record   = 0x001D;                  // Record identifier\n        $length   = 0x000F;                  // Number of bytes to follow\n\n        $pnn      = $this->activePane;     // Pane position\n        $rwAct    = $rwFirst;                // Active row\n        $colAct   = $colFirst;               // Active column\n        $irefAct  = 0;                       // Active cell ref\n        $cref     = 1;                       // Number of refs\n\n        if (!isset($rwLast)) {\n            $rwLast   = $rwFirst;       // Last  row in reference\n        }\n        if (!isset($colLast)) {\n            $colLast  = $colFirst;      // Last  col in reference\n        }\n\n        // Swap last row/col for first row/col as necessary\n        if ($rwFirst > $rwLast) {\n            list($rwFirst, $rwLast) = array($rwLast, $rwFirst);\n        }\n\n        if ($colFirst > $colLast) {\n            list($colFirst, $colLast) = array($colLast, $colFirst);\n        }\n\n        $header   = pack(\"vv\", $record, $length);\n        $data     = pack(\"CvvvvvvCC\", $pnn, $rwAct, $colAct, $irefAct, $cref, $rwFirst, $rwLast, $colFirst, $colLast);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the MERGEDCELLS records for all ranges of merged cells\n     */\n    private function writeMergedCells()\n    {\n        $mergeCells = $this->phpSheet->getMergeCells();\n        $countMergeCells = count($mergeCells);\n\n        if ($countMergeCells == 0) {\n            return;\n        }\n\n        // maximum allowed number of merged cells per record\n        $maxCountMergeCellsPerRecord = 1027;\n\n        // record identifier\n        $record = 0x00E5;\n\n        // counter for total number of merged cells treated so far by the writer\n        $i = 0;\n\n        // counter for number of merged cells written in record currently being written\n        $j = 0;\n\n        // initialize record data\n        $recordData = '';\n\n        // loop through the merged cells\n        foreach ($mergeCells as $mergeCell) {\n            ++$i;\n            ++$j;\n\n            // extract the row and column indexes\n            $range = PHPExcel_Cell::splitRange($mergeCell);\n            list($first, $last) = $range[0];\n            list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($first);\n            list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($last);\n\n            $recordData .= pack('vvvv', $firstRow - 1, $lastRow - 1, PHPExcel_Cell::columnIndexFromString($firstColumn) - 1, PHPExcel_Cell::columnIndexFromString($lastColumn) - 1);\n\n            // flush record if we have reached limit for number of merged cells, or reached final merged cell\n            if ($j == $maxCountMergeCellsPerRecord or $i == $countMergeCells) {\n                $recordData = pack('v', $j) . $recordData;\n                $length = strlen($recordData);\n                $header = pack('vv', $record, $length);\n                $this->append($header . $recordData);\n\n                // initialize for next record, if any\n                $recordData = '';\n                $j = 0;\n            }\n        }\n    }\n\n    /**\n     * Write SHEETLAYOUT record\n     */\n    private function writeSheetLayout()\n    {\n        if (!$this->phpSheet->isTabColorSet()) {\n            return;\n        }\n\n        $recordData = pack(\n            'vvVVVvv',\n            0x0862,\n            0x0000, // unused\n            0x00000000, // unused\n            0x00000000, // unused\n            0x00000014, // size of record data\n            $this->colors[$this->phpSheet->getTabColor()->getRGB()], // color index\n            0x0000        // unused\n        );\n\n        $length = strlen($recordData);\n\n        $record = 0x0862; // Record identifier\n        $header = pack('vv', $record, $length);\n        $this->append($header . $recordData);\n    }\n\n    /**\n     * Write SHEETPROTECTION\n     */\n    private function writeSheetProtection()\n    {\n        // record identifier\n        $record = 0x0867;\n\n        // prepare options\n        $options  =   (int) !$this->phpSheet->getProtection()->getObjects()\n                    | (int) !$this->phpSheet->getProtection()->getScenarios()           << 1\n                    | (int) !$this->phpSheet->getProtection()->getFormatCells()         << 2\n                    | (int) !$this->phpSheet->getProtection()->getFormatColumns()       << 3\n                    | (int) !$this->phpSheet->getProtection()->getFormatRows()          << 4\n                    | (int) !$this->phpSheet->getProtection()->getInsertColumns()       << 5\n                    | (int) !$this->phpSheet->getProtection()->getInsertRows()          << 6\n                    | (int) !$this->phpSheet->getProtection()->getInsertHyperlinks()    << 7\n                    | (int) !$this->phpSheet->getProtection()->getDeleteColumns()       << 8\n                    | (int) !$this->phpSheet->getProtection()->getDeleteRows()          << 9\n                    | (int) !$this->phpSheet->getProtection()->getSelectLockedCells()   << 10\n                    | (int) !$this->phpSheet->getProtection()->getSort()                << 11\n                    | (int) !$this->phpSheet->getProtection()->getAutoFilter()          << 12\n                    | (int) !$this->phpSheet->getProtection()->getPivotTables()         << 13\n                    | (int) !$this->phpSheet->getProtection()->getSelectUnlockedCells() << 14 ;\n\n        // record data\n        $recordData = pack(\n            'vVVCVVvv',\n            0x0867, // repeated record identifier\n            0x0000, // not used\n            0x0000, // not used\n            0x00, // not used\n            0x01000200, // unknown data\n            0xFFFFFFFF, // unknown data\n            $options, // options\n            0x0000 // not used\n        );\n\n        $length = strlen($recordData);\n        $header = pack('vv', $record, $length);\n\n        $this->append($header . $recordData);\n    }\n\n    /**\n     * Write BIFF record RANGEPROTECTION\n     *\n     * Openoffice.org's Documentaion of the Microsoft Excel File Format uses term RANGEPROTECTION for these records\n     * Microsoft Office Excel 97-2007 Binary File Format Specification uses term FEAT for these records\n     */\n    private function writeRangeProtection()\n    {\n        foreach ($this->phpSheet->getProtectedCells() as $range => $password) {\n            // number of ranges, e.g. 'A1:B3 C20:D25'\n            $cellRanges = explode(' ', $range);\n            $cref = count($cellRanges);\n\n            $recordData = pack(\n                'vvVVvCVvVv',\n                0x0868,\n                0x00,\n                0x0000,\n                0x0000,\n                0x02,\n                0x0,\n                0x0000,\n                $cref,\n                0x0000,\n                0x00\n            );\n\n            foreach ($cellRanges as $cellRange) {\n                $recordData .= $this->writeBIFF8CellRangeAddressFixed($cellRange);\n            }\n\n            // the rgbFeat structure\n            $recordData .= pack(\n                'VV',\n                0x0000,\n                hexdec($password)\n            );\n\n            $recordData .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong('p' . md5($recordData));\n\n            $length = strlen($recordData);\n\n            $record = 0x0868;        // Record identifier\n            $header = pack(\"vv\", $record, $length);\n            $this->append($header . $recordData);\n        }\n    }\n\n    /**\n     * Write BIFF record EXTERNCOUNT to indicate the number of external sheet\n     * references in a worksheet.\n     *\n     * Excel only stores references to external sheets that are used in formulas.\n     * For simplicity we store references to all the sheets in the workbook\n     * regardless of whether they are used or not. This reduces the overall\n     * complexity and eliminates the need for a two way dialogue between the formula\n     * parser the worksheet objects.\n     *\n     * @param integer $count The number of external sheet references in this worksheet\n     */\n    private function writeExterncount($count)\n    {\n        $record = 0x0016;          // Record identifier\n        $length = 0x0002;          // Number of bytes to follow\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"v\", $count);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Writes the Excel BIFF EXTERNSHEET record. These references are used by\n     * formulas. A formula references a sheet name via an index. Since we store a\n     * reference to all of the external worksheets the EXTERNSHEET index is the same\n     * as the worksheet index.\n     *\n     * @param string $sheetname The name of a external worksheet\n     */\n    private function writeExternsheet($sheetname)\n    {\n        $record    = 0x0017;         // Record identifier\n\n        // References to the current sheet are encoded differently to references to\n        // external sheets.\n        //\n        if ($this->phpSheet->getTitle() == $sheetname) {\n            $sheetname = '';\n            $length    = 0x02;  // The following 2 bytes\n            $cch       = 1;     // The following byte\n            $rgch      = 0x02;  // Self reference\n        } else {\n            $length    = 0x02 + strlen($sheetname);\n            $cch       = strlen($sheetname);\n            $rgch      = 0x03;  // Reference to a sheet in the current workbook\n        }\n\n        $header = pack(\"vv\", $record, $length);\n        $data   = pack(\"CC\", $cch, $rgch);\n        $this->append($header . $data . $sheetname);\n    }\n\n    /**\n     * Writes the Excel BIFF PANE record.\n     * The panes can either be frozen or thawed (unfrozen).\n     * Frozen panes are specified in terms of an integer number of rows and columns.\n     * Thawed panes are specified in terms of Excel's units for rows and columns.\n     */\n    private function writePanes()\n    {\n        $panes = array();\n        if ($freezePane = $this->phpSheet->getFreezePane()) {\n            list($column, $row) = PHPExcel_Cell::coordinateFromString($freezePane);\n            $panes[0] = $row - 1;\n            $panes[1] = PHPExcel_Cell::columnIndexFromString($column) - 1;\n        } else {\n            // thaw panes\n            return;\n        }\n\n        $y       = isset($panes[0]) ? $panes[0] : null;\n        $x       = isset($panes[1]) ? $panes[1] : null;\n        $rwTop   = isset($panes[2]) ? $panes[2] : null;\n        $colLeft = isset($panes[3]) ? $panes[3] : null;\n        if (count($panes) > 4) { // if Active pane was received\n            $pnnAct = $panes[4];\n        } else {\n            $pnnAct = null;\n        }\n        $record  = 0x0041;       // Record identifier\n        $length  = 0x000A;       // Number of bytes to follow\n\n        // Code specific to frozen or thawed panes.\n        if ($this->phpSheet->getFreezePane()) {\n            // Set default values for $rwTop and $colLeft\n            if (!isset($rwTop)) {\n                $rwTop   = $y;\n            }\n            if (!isset($colLeft)) {\n                $colLeft = $x;\n            }\n        } else {\n            // Set default values for $rwTop and $colLeft\n            if (!isset($rwTop)) {\n                $rwTop   = 0;\n            }\n            if (!isset($colLeft)) {\n                $colLeft = 0;\n            }\n\n            // Convert Excel's row and column units to the internal units.\n            // The default row height is 12.75\n            // The default column width is 8.43\n            // The following slope and intersection values were interpolated.\n            //\n            $y = 20*$y + 255;\n            $x = 113.879*$x + 390;\n        }\n\n\n        // Determine which pane should be active. There is also the undocumented\n        // option to override this should it be necessary: may be removed later.\n        //\n        if (!isset($pnnAct)) {\n            if ($x != 0 && $y != 0) {\n                $pnnAct = 0; // Bottom right\n            }\n            if ($x != 0 && $y == 0) {\n                $pnnAct = 1; // Top right\n            }\n            if ($x == 0 && $y != 0) {\n                $pnnAct = 2; // Bottom left\n            }\n            if ($x == 0 && $y == 0) {\n                $pnnAct = 3; // Top left\n            }\n        }\n\n        $this->activePane = $pnnAct; // Used in writeSelection\n\n        $header = pack(\"vv\", $record, $length);\n        $data = pack(\"vvvvv\", $x, $y, $rwTop, $colLeft, $pnnAct);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the page setup SETUP BIFF record.\n     */\n    private function writeSetup()\n    {\n        $record       = 0x00A1;                  // Record identifier\n        $length       = 0x0022;                  // Number of bytes to follow\n\n        $iPaperSize   = $this->phpSheet->getPageSetup()->getPaperSize();    // Paper size\n\n        $iScale = $this->phpSheet->getPageSetup()->getScale() ?\n            $this->phpSheet->getPageSetup()->getScale() : 100;   // Print scaling factor\n\n        $iPageStart   = 0x01;                 // Starting page number\n        $iFitWidth    = (int) $this->phpSheet->getPageSetup()->getFitToWidth();    // Fit to number of pages wide\n        $iFitHeight    = (int) $this->phpSheet->getPageSetup()->getFitToHeight();    // Fit to number of pages high\n        $grbit        = 0x00;                 // Option flags\n        $iRes         = 0x0258;               // Print resolution\n        $iVRes        = 0x0258;               // Vertical print resolution\n\n        $numHdr       = $this->phpSheet->getPageMargins()->getHeader();  // Header Margin\n\n        $numFtr       = $this->phpSheet->getPageMargins()->getFooter();   // Footer Margin\n        $iCopies      = 0x01;                 // Number of copies\n\n        $fLeftToRight = 0x0;                     // Print over then down\n\n        // Page orientation\n        $fLandscape = ($this->phpSheet->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ?\n            0x0 : 0x1;\n\n        $fNoPls       = 0x0;                     // Setup not read from printer\n        $fNoColor     = 0x0;                     // Print black and white\n        $fDraft       = 0x0;                     // Print draft quality\n        $fNotes       = 0x0;                     // Print notes\n        $fNoOrient    = 0x0;                     // Orientation not set\n        $fUsePage     = 0x0;                     // Use custom starting page\n\n        $grbit           = $fLeftToRight;\n        $grbit          |= $fLandscape    << 1;\n        $grbit          |= $fNoPls        << 2;\n        $grbit          |= $fNoColor      << 3;\n        $grbit          |= $fDraft        << 4;\n        $grbit          |= $fNotes        << 5;\n        $grbit          |= $fNoOrient     << 6;\n        $grbit          |= $fUsePage      << 7;\n\n        $numHdr = pack(\"d\", $numHdr);\n        $numFtr = pack(\"d\", $numFtr);\n        if (self::getByteOrder()) { // if it's Big Endian\n            $numHdr = strrev($numHdr);\n            $numFtr = strrev($numFtr);\n        }\n\n        $header = pack(\"vv\", $record, $length);\n        $data1  = pack(\"vvvvvvvv\", $iPaperSize, $iScale, $iPageStart, $iFitWidth, $iFitHeight, $grbit, $iRes, $iVRes);\n        $data2  = $numHdr.$numFtr;\n        $data3  = pack(\"v\", $iCopies);\n        $this->append($header . $data1 . $data2 . $data3);\n    }\n\n    /**\n     * Store the header caption BIFF record.\n     */\n    private function writeHeader()\n    {\n        $record  = 0x0014;               // Record identifier\n\n        /* removing for now\n        // need to fix character count (multibyte!)\n        if (strlen($this->phpSheet->getHeaderFooter()->getOddHeader()) <= 255) {\n            $str      = $this->phpSheet->getHeaderFooter()->getOddHeader();       // header string\n        } else {\n            $str = '';\n        }\n        */\n\n        $recordData = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($this->phpSheet->getHeaderFooter()->getOddHeader());\n        $length = strlen($recordData);\n\n        $header   = pack(\"vv\", $record, $length);\n\n        $this->append($header . $recordData);\n    }\n\n    /**\n     * Store the footer caption BIFF record.\n     */\n    private function writeFooter()\n    {\n        $record  = 0x0015;               // Record identifier\n\n        /* removing for now\n        // need to fix character count (multibyte!)\n        if (strlen($this->phpSheet->getHeaderFooter()->getOddFooter()) <= 255) {\n            $str = $this->phpSheet->getHeaderFooter()->getOddFooter();\n        } else {\n            $str = '';\n        }\n        */\n\n        $recordData = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($this->phpSheet->getHeaderFooter()->getOddFooter());\n        $length = strlen($recordData);\n\n        $header    = pack(\"vv\", $record, $length);\n\n        $this->append($header . $recordData);\n    }\n\n    /**\n     * Store the horizontal centering HCENTER BIFF record.\n     *\n     * @access private\n     */\n    private function writeHcenter()\n    {\n        $record   = 0x0083;              // Record identifier\n        $length   = 0x0002;              // Bytes to follow\n\n        $fHCenter = $this->phpSheet->getPageSetup()->getHorizontalCentered() ? 1 : 0;     // Horizontal centering\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"v\", $fHCenter);\n\n        $this->append($header.$data);\n    }\n\n    /**\n     * Store the vertical centering VCENTER BIFF record.\n     */\n    private function writeVcenter()\n    {\n        $record   = 0x0084;              // Record identifier\n        $length   = 0x0002;              // Bytes to follow\n\n        $fVCenter = $this->phpSheet->getPageSetup()->getVerticalCentered() ? 1 : 0;     // Horizontal centering\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"v\", $fVCenter);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the LEFTMARGIN BIFF record.\n     */\n    private function writeMarginLeft()\n    {\n        $record  = 0x0026;                   // Record identifier\n        $length  = 0x0008;                   // Bytes to follow\n\n        $margin  = $this->phpSheet->getPageMargins()->getLeft();     // Margin in inches\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"d\", $margin);\n        if (self::getByteOrder()) { // if it's Big Endian\n            $data = strrev($data);\n        }\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the RIGHTMARGIN BIFF record.\n     */\n    private function writeMarginRight()\n    {\n        $record  = 0x0027;                   // Record identifier\n        $length  = 0x0008;                   // Bytes to follow\n\n        $margin  = $this->phpSheet->getPageMargins()->getRight();     // Margin in inches\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"d\", $margin);\n        if (self::getByteOrder()) { // if it's Big Endian\n            $data = strrev($data);\n        }\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the TOPMARGIN BIFF record.\n     */\n    private function writeMarginTop()\n    {\n        $record  = 0x0028;                   // Record identifier\n        $length  = 0x0008;                   // Bytes to follow\n\n        $margin  = $this->phpSheet->getPageMargins()->getTop();     // Margin in inches\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"d\", $margin);\n        if (self::getByteOrder()) { // if it's Big Endian\n            $data = strrev($data);\n        }\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Store the BOTTOMMARGIN BIFF record.\n     */\n    private function writeMarginBottom()\n    {\n        $record  = 0x0029;                   // Record identifier\n        $length  = 0x0008;                   // Bytes to follow\n\n        $margin  = $this->phpSheet->getPageMargins()->getBottom();     // Margin in inches\n\n        $header    = pack(\"vv\", $record, $length);\n        $data      = pack(\"d\", $margin);\n        if (self::getByteOrder()) { // if it's Big Endian\n            $data = strrev($data);\n        }\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the PRINTHEADERS BIFF record.\n     */\n    private function writePrintHeaders()\n    {\n        $record      = 0x002a;                   // Record identifier\n        $length      = 0x0002;                   // Bytes to follow\n\n        $fPrintRwCol = $this->_print_headers;     // Boolean flag\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"v\", $fPrintRwCol);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the\n     * GRIDSET record.\n     */\n    private function writePrintGridlines()\n    {\n        $record      = 0x002b;                    // Record identifier\n        $length      = 0x0002;                    // Bytes to follow\n\n        $fPrintGrid  = $this->phpSheet->getPrintGridlines() ? 1 : 0;    // Boolean flag\n\n        $header      = pack(\"vv\", $record, $length);\n        $data      = pack(\"v\", $fPrintGrid);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the GRIDSET BIFF record. Must be used in conjunction with the\n     * PRINTGRIDLINES record.\n     */\n    private function writeGridset()\n    {\n        $record      = 0x0082;                        // Record identifier\n        $length      = 0x0002;                        // Bytes to follow\n\n        $fGridSet    = !$this->phpSheet->getPrintGridlines();     // Boolean flag\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"v\", $fGridSet);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the AUTOFILTERINFO BIFF record. This is used to configure the number of autofilter select used in the sheet.\n     */\n    private function writeAutoFilterInfo()\n    {\n        $record      = 0x009D;                        // Record identifier\n        $length      = 0x0002;                        // Bytes to follow\n\n        $rangeBounds = PHPExcel_Cell::rangeBoundaries($this->phpSheet->getAutoFilter()->getRange());\n        $iNumFilters = 1 + $rangeBounds[1][0] - $rangeBounds[0][0];\n\n        $header   = pack(\"vv\", $record, $length);\n        $data     = pack(\"v\", $iNumFilters);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the GUTS BIFF record. This is used to configure the gutter margins\n     * where Excel outline symbols are displayed. The visibility of the gutters is\n     * controlled by a flag in WSBOOL.\n     *\n     * @see writeWsbool()\n     */\n    private function writeGuts()\n    {\n        $record      = 0x0080;   // Record identifier\n        $length      = 0x0008;   // Bytes to follow\n\n        $dxRwGut     = 0x0000;   // Size of row gutter\n        $dxColGut    = 0x0000;   // Size of col gutter\n\n        // determine maximum row outline level\n        $maxRowOutlineLevel = 0;\n        foreach ($this->phpSheet->getRowDimensions() as $rowDimension) {\n            $maxRowOutlineLevel = max($maxRowOutlineLevel, $rowDimension->getOutlineLevel());\n        }\n\n        $col_level   = 0;\n\n        // Calculate the maximum column outline level. The equivalent calculation\n        // for the row outline level is carried out in writeRow().\n        $colcount = count($this->columnInfo);\n        for ($i = 0; $i < $colcount; ++$i) {\n            $col_level = max($this->columnInfo[$i][5], $col_level);\n        }\n\n        // Set the limits for the outline levels (0 <= x <= 7).\n        $col_level = max(0, min($col_level, 7));\n\n        // The displayed level is one greater than the max outline levels\n        if ($maxRowOutlineLevel) {\n            ++$maxRowOutlineLevel;\n        }\n        if ($col_level) {\n            ++$col_level;\n        }\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"vvvv\", $dxRwGut, $dxColGut, $maxRowOutlineLevel, $col_level);\n\n        $this->append($header.$data);\n    }\n\n    /**\n     * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction\n     * with the SETUP record.\n     */\n    private function writeWsbool()\n    {\n        $record      = 0x0081;   // Record identifier\n        $length      = 0x0002;   // Bytes to follow\n        $grbit       = 0x0000;\n\n        // The only option that is of interest is the flag for fit to page. So we\n        // set all the options in one go.\n        //\n        // Set the option flags\n        $grbit |= 0x0001;                           // Auto page breaks visible\n        if ($this->outlineStyle) {\n            $grbit |= 0x0020; // Auto outline styles\n        }\n        if ($this->phpSheet->getShowSummaryBelow()) {\n            $grbit |= 0x0040; // Outline summary below\n        }\n        if ($this->phpSheet->getShowSummaryRight()) {\n            $grbit |= 0x0080; // Outline summary right\n        }\n        if ($this->phpSheet->getPageSetup()->getFitToPage()) {\n            $grbit |= 0x0100; // Page setup fit to page\n        }\n        if ($this->outlineOn) {\n            $grbit |= 0x0400; // Outline symbols displayed\n        }\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"v\", $grbit);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the HORIZONTALPAGEBREAKS and VERTICALPAGEBREAKS BIFF records.\n     */\n    private function writeBreaks()\n    {\n        // initialize\n        $vbreaks = array();\n        $hbreaks = array();\n\n        foreach ($this->phpSheet->getBreaks() as $cell => $breakType) {\n            // Fetch coordinates\n            $coordinates = PHPExcel_Cell::coordinateFromString($cell);\n\n            // Decide what to do by the type of break\n            switch ($breakType) {\n                case PHPExcel_Worksheet::BREAK_COLUMN:\n                    // Add to list of vertical breaks\n                    $vbreaks[] = PHPExcel_Cell::columnIndexFromString($coordinates[0]) - 1;\n                    break;\n                case PHPExcel_Worksheet::BREAK_ROW:\n                    // Add to list of horizontal breaks\n                    $hbreaks[] = $coordinates[1];\n                    break;\n                case PHPExcel_Worksheet::BREAK_NONE:\n                default:\n                    // Nothing to do\n                    break;\n            }\n        }\n\n        //horizontal page breaks\n        if (!empty($hbreaks)) {\n            // Sort and filter array of page breaks\n            sort($hbreaks, SORT_NUMERIC);\n            if ($hbreaks[0] == 0) { // don't use first break if it's 0\n                array_shift($hbreaks);\n            }\n\n            $record  = 0x001b;               // Record identifier\n            $cbrk    = count($hbreaks);       // Number of page breaks\n            $length  = 2 + 6 * $cbrk;      // Bytes to follow\n\n            $header  = pack(\"vv\", $record, $length);\n            $data    = pack(\"v\", $cbrk);\n\n            // Append each page break\n            foreach ($hbreaks as $hbreak) {\n                $data .= pack(\"vvv\", $hbreak, 0x0000, 0x00ff);\n            }\n\n            $this->append($header . $data);\n        }\n\n        // vertical page breaks\n        if (!empty($vbreaks)) {\n            // 1000 vertical pagebreaks appears to be an internal Excel 5 limit.\n            // It is slightly higher in Excel 97/200, approx. 1026\n            $vbreaks = array_slice($vbreaks, 0, 1000);\n\n            // Sort and filter array of page breaks\n            sort($vbreaks, SORT_NUMERIC);\n            if ($vbreaks[0] == 0) { // don't use first break if it's 0\n                array_shift($vbreaks);\n            }\n\n            $record  = 0x001a;               // Record identifier\n            $cbrk    = count($vbreaks);       // Number of page breaks\n            $length  = 2 + 6 * $cbrk;      // Bytes to follow\n\n            $header  = pack(\"vv\", $record, $length);\n            $data    = pack(\"v\", $cbrk);\n\n            // Append each page break\n            foreach ($vbreaks as $vbreak) {\n                $data .= pack(\"vvv\", $vbreak, 0x0000, 0xffff);\n            }\n\n            $this->append($header . $data);\n        }\n    }\n\n    /**\n     * Set the Biff PROTECT record to indicate that the worksheet is protected.\n     */\n    private function writeProtect()\n    {\n        // Exit unless sheet protection has been specified\n        if (!$this->phpSheet->getProtection()->getSheet()) {\n            return;\n        }\n\n        $record      = 0x0012;             // Record identifier\n        $length      = 0x0002;             // Bytes to follow\n\n        $fLock      = 1;    // Worksheet is protected\n\n        $header      = pack(\"vv\", $record, $length);\n        $data      = pack(\"v\", $fLock);\n\n        $this->append($header.$data);\n    }\n\n    /**\n     * Write SCENPROTECT\n     */\n    private function writeScenProtect()\n    {\n        // Exit if sheet protection is not active\n        if (!$this->phpSheet->getProtection()->getSheet()) {\n            return;\n        }\n\n        // Exit if scenarios are not protected\n        if (!$this->phpSheet->getProtection()->getScenarios()) {\n            return;\n        }\n\n        $record = 0x00DD; // Record identifier\n        $length = 0x0002; // Bytes to follow\n\n        $header = pack('vv', $record, $length);\n        $data = pack('v', 1);\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write OBJECTPROTECT\n     */\n    private function writeObjectProtect()\n    {\n        // Exit if sheet protection is not active\n        if (!$this->phpSheet->getProtection()->getSheet()) {\n            return;\n        }\n\n        // Exit if objects are not protected\n        if (!$this->phpSheet->getProtection()->getObjects()) {\n            return;\n        }\n\n        $record = 0x0063; // Record identifier\n        $length = 0x0002; // Bytes to follow\n\n        $header = pack('vv', $record, $length);\n        $data = pack('v', 1);\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write the worksheet PASSWORD record.\n     */\n    private function writePassword()\n    {\n        // Exit unless sheet protection and password have been specified\n        if (!$this->phpSheet->getProtection()->getSheet() || !$this->phpSheet->getProtection()->getPassword()) {\n            return;\n        }\n\n        $record      = 0x0013;               // Record identifier\n        $length      = 0x0002;               // Bytes to follow\n\n        $wPassword   = hexdec($this->phpSheet->getProtection()->getPassword());     // Encoded password\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"v\", $wPassword);\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Insert a 24bit bitmap image in a worksheet.\n     *\n     * @access public\n     * @param integer $row     The row we are going to insert the bitmap into\n     * @param integer $col     The column we are going to insert the bitmap into\n     * @param mixed   $bitmap  The bitmap filename or GD-image resource\n     * @param integer $x       The horizontal position (offset) of the image inside the cell.\n     * @param integer $y       The vertical position (offset) of the image inside the cell.\n     * @param float   $scale_x The horizontal scale\n     * @param float   $scale_y The vertical scale\n     */\n    public function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1)\n    {\n        $bitmap_array = (is_resource($bitmap) ? $this->processBitmapGd($bitmap) : $this->processBitmap($bitmap));\n        list($width, $height, $size, $data) = $bitmap_array; //$this->processBitmap($bitmap);\n\n        // Scale the frame of the image.\n        $width  *= $scale_x;\n        $height *= $scale_y;\n\n        // Calculate the vertices of the image and write the OBJ record\n        $this->positionImage($col, $row, $x, $y, $width, $height);\n\n        // Write the IMDATA record to store the bitmap data\n        $record      = 0x007f;\n        $length      = 8 + $size;\n        $cf          = 0x09;\n        $env         = 0x01;\n        $lcb         = $size;\n\n        $header      = pack(\"vvvvV\", $record, $length, $cf, $env, $lcb);\n        $this->append($header.$data);\n    }\n\n    /**\n     * Calculate the vertices that define the position of the image as required by\n     * the OBJ record.\n     *\n     *         +------------+------------+\n     *         |     A      |      B     |\n     *   +-----+------------+------------+\n     *   |     |(x1,y1)     |            |\n     *   |  1  |(A1)._______|______      |\n     *   |     |    |              |     |\n     *   |     |    |              |     |\n     *   +-----+----|    BITMAP    |-----+\n     *   |     |    |              |     |\n     *   |  2  |    |______________.     |\n     *   |     |            |        (B2)|\n     *   |     |            |     (x2,y2)|\n     *   +---- +------------+------------+\n     *\n     * Example of a bitmap that covers some of the area from cell A1 to cell B2.\n     *\n     * Based on the width and height of the bitmap we need to calculate 8 vars:\n     *     $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2.\n     * The width and height of the cells are also variable and have to be taken into\n     * account.\n     * The values of $col_start and $row_start are passed in from the calling\n     * function. The values of $col_end and $row_end are calculated by subtracting\n     * the width and height of the bitmap from the width and height of the\n     * underlying cells.\n     * The vertices are expressed as a percentage of the underlying cell width as\n     * follows (rhs values are in pixels):\n     *\n     *       x1 = X / W *1024\n     *       y1 = Y / H *256\n     *       x2 = (X-1) / W *1024\n     *       y2 = (Y-1) / H *256\n     *\n     *       Where:  X is distance from the left side of the underlying cell\n     *               Y is distance from the top of the underlying cell\n     *               W is the width of the cell\n     *               H is the height of the cell\n     * The SDK incorrectly states that the height should be expressed as a\n     *        percentage of 1024.\n     *\n     * @access private\n     * @param integer $col_start Col containing upper left corner of object\n     * @param integer $row_start Row containing top left corner of object\n     * @param integer $x1        Distance to left side of object\n     * @param integer $y1        Distance to top of object\n     * @param integer $width     Width of image frame\n     * @param integer $height    Height of image frame\n     */\n    public function positionImage($col_start, $row_start, $x1, $y1, $width, $height)\n    {\n        // Initialise end cell to the same as the start cell\n        $col_end    = $col_start;  // Col containing lower right corner of object\n        $row_end    = $row_start;  // Row containing bottom right corner of object\n\n        // Zero the specified offset if greater than the cell dimensions\n        if ($x1 >= PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start))) {\n            $x1 = 0;\n        }\n        if ($y1 >= PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_start + 1)) {\n            $y1 = 0;\n        }\n\n        $width      = $width  + $x1 -1;\n        $height     = $height + $y1 -1;\n\n        // Subtract the underlying cell widths to find the end cell of the image\n        while ($width >= PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end))) {\n            $width -= PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end));\n            ++$col_end;\n        }\n\n        // Subtract the underlying cell heights to find the end cell of the image\n        while ($height >= PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1)) {\n            $height -= PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1);\n            ++$row_end;\n        }\n\n        // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell\n        // with zero eight or width.\n        //\n        if (PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) == 0) {\n            return;\n        }\n        if (PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end))   == 0) {\n            return;\n        }\n        if (PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_start + 1) == 0) {\n            return;\n        }\n        if (PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1)   == 0) {\n            return;\n        }\n\n        // Convert the pixel values to the percentage value expected by Excel\n        $x1 = $x1     / PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start))   * 1024;\n        $y1 = $y1     / PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_start + 1)   *  256;\n        $x2 = $width  / PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end))     * 1024; // Distance to right side of object\n        $y2 = $height / PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1)     *  256; // Distance to bottom of object\n\n        $this->writeObjPicture($col_start, $x1, $row_start, $y1, $col_end, $x2, $row_end, $y2);\n    }\n\n    /**\n     * Store the OBJ record that precedes an IMDATA record. This could be generalise\n     * to support other Excel objects.\n     *\n     * @param integer $colL Column containing upper left corner of object\n     * @param integer $dxL  Distance from left side of cell\n     * @param integer $rwT  Row containing top left corner of object\n     * @param integer $dyT  Distance from top of cell\n     * @param integer $colR Column containing lower right corner of object\n     * @param integer $dxR  Distance from right of cell\n     * @param integer $rwB  Row containing bottom right corner of object\n     * @param integer $dyB  Distance from bottom of cell\n     */\n    private function writeObjPicture($colL, $dxL, $rwT, $dyT, $colR, $dxR, $rwB, $dyB)\n    {\n        $record      = 0x005d;   // Record identifier\n        $length      = 0x003c;   // Bytes to follow\n\n        $cObj        = 0x0001;   // Count of objects in file (set to 1)\n        $OT          = 0x0008;   // Object type. 8 = Picture\n        $id          = 0x0001;   // Object ID\n        $grbit       = 0x0614;   // Option flags\n\n        $cbMacro     = 0x0000;   // Length of FMLA structure\n        $Reserved1   = 0x0000;   // Reserved\n        $Reserved2   = 0x0000;   // Reserved\n\n        $icvBack     = 0x09;     // Background colour\n        $icvFore     = 0x09;     // Foreground colour\n        $fls         = 0x00;     // Fill pattern\n        $fAuto       = 0x00;     // Automatic fill\n        $icv         = 0x08;     // Line colour\n        $lns         = 0xff;     // Line style\n        $lnw         = 0x01;     // Line weight\n        $fAutoB      = 0x00;     // Automatic border\n        $frs         = 0x0000;   // Frame style\n        $cf          = 0x0009;   // Image format, 9 = bitmap\n        $Reserved3   = 0x0000;   // Reserved\n        $cbPictFmla  = 0x0000;   // Length of FMLA structure\n        $Reserved4   = 0x0000;   // Reserved\n        $grbit2      = 0x0001;   // Option flags\n        $Reserved5   = 0x0000;   // Reserved\n\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"V\", $cObj);\n        $data       .= pack(\"v\", $OT);\n        $data       .= pack(\"v\", $id);\n        $data       .= pack(\"v\", $grbit);\n        $data       .= pack(\"v\", $colL);\n        $data       .= pack(\"v\", $dxL);\n        $data       .= pack(\"v\", $rwT);\n        $data       .= pack(\"v\", $dyT);\n        $data       .= pack(\"v\", $colR);\n        $data       .= pack(\"v\", $dxR);\n        $data       .= pack(\"v\", $rwB);\n        $data       .= pack(\"v\", $dyB);\n        $data       .= pack(\"v\", $cbMacro);\n        $data       .= pack(\"V\", $Reserved1);\n        $data       .= pack(\"v\", $Reserved2);\n        $data       .= pack(\"C\", $icvBack);\n        $data       .= pack(\"C\", $icvFore);\n        $data       .= pack(\"C\", $fls);\n        $data       .= pack(\"C\", $fAuto);\n        $data       .= pack(\"C\", $icv);\n        $data       .= pack(\"C\", $lns);\n        $data       .= pack(\"C\", $lnw);\n        $data       .= pack(\"C\", $fAutoB);\n        $data       .= pack(\"v\", $frs);\n        $data       .= pack(\"V\", $cf);\n        $data       .= pack(\"v\", $Reserved3);\n        $data       .= pack(\"v\", $cbPictFmla);\n        $data       .= pack(\"v\", $Reserved4);\n        $data       .= pack(\"v\", $grbit2);\n        $data       .= pack(\"V\", $Reserved5);\n\n        $this->append($header . $data);\n    }\n\n    /**\n     * Convert a GD-image into the internal format.\n     *\n     * @access private\n     * @param resource $image The image to process\n     * @return array Array with data and properties of the bitmap\n     */\n    public function processBitmapGd($image)\n    {\n        $width = imagesx($image);\n        $height = imagesy($image);\n\n        $data = pack(\"Vvvvv\", 0x000c, $width, $height, 0x01, 0x18);\n        for ($j=$height; $j--;) {\n            for ($i=0; $i < $width; ++$i) {\n                $color = imagecolorsforindex($image, imagecolorat($image, $i, $j));\n                foreach (array(\"red\", \"green\", \"blue\") as $key) {\n                    $color[$key] = $color[$key] + round((255 - $color[$key]) * $color[\"alpha\"] / 127);\n                }\n                $data .= chr($color[\"blue\"]) . chr($color[\"green\"]) . chr($color[\"red\"]);\n            }\n            if (3*$width % 4) {\n                $data .= str_repeat(\"\\x00\", 4 - 3*$width % 4);\n            }\n        }\n\n        return array($width, $height, strlen($data), $data);\n    }\n\n    /**\n     * Convert a 24 bit bitmap into the modified internal format used by Windows.\n     * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the\n     * MSDN library.\n     *\n     * @access private\n     * @param string $bitmap The bitmap to process\n     * @return array Array with data and properties of the bitmap\n     */\n    public function processBitmap($bitmap)\n    {\n        // Open file.\n        $bmp_fd = @fopen($bitmap, \"rb\");\n        if (!$bmp_fd) {\n            throw new PHPExcel_Writer_Exception(\"Couldn't import $bitmap\");\n        }\n\n        // Slurp the file into a string.\n        $data = fread($bmp_fd, filesize($bitmap));\n\n        // Check that the file is big enough to be a bitmap.\n        if (strlen($data) <= 0x36) {\n            throw new PHPExcel_Writer_Exception(\"$bitmap doesn't contain enough data.\\n\");\n        }\n\n        // The first 2 bytes are used to identify the bitmap.\n        $identity = unpack(\"A2ident\", $data);\n        if ($identity['ident'] != \"BM\") {\n            throw new PHPExcel_Writer_Exception(\"$bitmap doesn't appear to be a valid bitmap image.\\n\");\n        }\n\n        // Remove bitmap data: ID.\n        $data = substr($data, 2);\n\n        // Read and remove the bitmap size. This is more reliable than reading\n        // the data size at offset 0x22.\n        //\n        $size_array   = unpack(\"Vsa\", substr($data, 0, 4));\n        $size   = $size_array['sa'];\n        $data   = substr($data, 4);\n        $size  -= 0x36; // Subtract size of bitmap header.\n        $size  += 0x0C; // Add size of BIFF header.\n\n        // Remove bitmap data: reserved, offset, header length.\n        $data = substr($data, 12);\n\n        // Read and remove the bitmap width and height. Verify the sizes.\n        $width_and_height = unpack(\"V2\", substr($data, 0, 8));\n        $width  = $width_and_height[1];\n        $height = $width_and_height[2];\n        $data   = substr($data, 8);\n        if ($width > 0xFFFF) {\n            throw new PHPExcel_Writer_Exception(\"$bitmap: largest image width supported is 65k.\\n\");\n        }\n        if ($height > 0xFFFF) {\n            throw new PHPExcel_Writer_Exception(\"$bitmap: largest image height supported is 65k.\\n\");\n        }\n\n        // Read and remove the bitmap planes and bpp data. Verify them.\n        $planes_and_bitcount = unpack(\"v2\", substr($data, 0, 4));\n        $data = substr($data, 4);\n        if ($planes_and_bitcount[2] != 24) { // Bitcount\n            throw new PHPExcel_Writer_Exception(\"$bitmap isn't a 24bit true color bitmap.\\n\");\n        }\n        if ($planes_and_bitcount[1] != 1) {\n            throw new PHPExcel_Writer_Exception(\"$bitmap: only 1 plane supported in bitmap image.\\n\");\n        }\n\n        // Read and remove the bitmap compression. Verify compression.\n        $compression = unpack(\"Vcomp\", substr($data, 0, 4));\n        $data = substr($data, 4);\n\n        //$compression = 0;\n        if ($compression['comp'] != 0) {\n            throw new PHPExcel_Writer_Exception(\"$bitmap: compression not supported in bitmap image.\\n\");\n        }\n\n        // Remove bitmap data: data size, hres, vres, colours, imp. colours.\n        $data = substr($data, 20);\n\n        // Add the BITMAPCOREHEADER data\n        $header  = pack(\"Vvvvv\", 0x000c, $width, $height, 0x01, 0x18);\n        $data    = $header . $data;\n\n        return (array($width, $height, $size, $data));\n    }\n\n    /**\n     * Store the window zoom factor. This should be a reduced fraction but for\n     * simplicity we will store all fractions with a numerator of 100.\n     */\n    private function writeZoom()\n    {\n        // If scale is 100 we don't need to write a record\n        if ($this->phpSheet->getSheetView()->getZoomScale() == 100) {\n            return;\n        }\n\n        $record      = 0x00A0;               // Record identifier\n        $length      = 0x0004;               // Bytes to follow\n\n        $header      = pack(\"vv\", $record, $length);\n        $data        = pack(\"vv\", $this->phpSheet->getSheetView()->getZoomScale(), 100);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Get Escher object\n     *\n     * @return PHPExcel_Shared_Escher\n     */\n    public function getEscher()\n    {\n        return $this->escher;\n    }\n\n    /**\n     * Set Escher object\n     *\n     * @param PHPExcel_Shared_Escher $pValue\n     */\n    public function setEscher(PHPExcel_Shared_Escher $pValue = null)\n    {\n        $this->escher = $pValue;\n    }\n\n    /**\n     * Write MSODRAWING record\n     */\n    private function writeMsoDrawing()\n    {\n        // write the Escher stream if necessary\n        if (isset($this->escher)) {\n            $writer = new PHPExcel_Writer_Excel5_Escher($this->escher);\n            $data = $writer->close();\n            $spOffsets = $writer->getSpOffsets();\n            $spTypes = $writer->getSpTypes();\n            // write the neccesary MSODRAWING, OBJ records\n\n            // split the Escher stream\n            $spOffsets[0] = 0;\n            $nm = count($spOffsets) - 1; // number of shapes excluding first shape\n            for ($i = 1; $i <= $nm; ++$i) {\n                // MSODRAWING record\n                $record = 0x00EC;            // Record identifier\n\n                // chunk of Escher stream for one shape\n                $dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]);\n\n                $length = strlen($dataChunk);\n                $header = pack(\"vv\", $record, $length);\n\n                $this->append($header . $dataChunk);\n\n                // OBJ record\n                $record = 0x005D; // record identifier\n                $objData = '';\n\n                // ftCmo\n                if ($spTypes[$i] == 0x00C9) {\n                    // Add ftCmo (common object data) subobject\n                    $objData .=\n                        pack(\n                            'vvvvvVVV',\n                            0x0015, // 0x0015 = ftCmo\n                            0x0012, // length of ftCmo data\n                            0x0014, // object type, 0x0014 = filter\n                            $i, // object id number, Excel seems to use 1-based index, local for the sheet\n                            0x2101, // option flags, 0x2001 is what OpenOffice.org uses\n                            0, // reserved\n                            0, // reserved\n                            0  // reserved\n                        );\n\n                    // Add ftSbs Scroll bar subobject\n                    $objData .= pack('vv', 0x00C, 0x0014);\n                    $objData .= pack('H*', '0000000000000000640001000A00000010000100');\n                    // Add ftLbsData (List box data) subobject\n                    $objData .= pack('vv', 0x0013, 0x1FEE);\n                    $objData .= pack('H*', '00000000010001030000020008005700');\n                } else {\n                    // Add ftCmo (common object data) subobject\n                    $objData .=\n                        pack(\n                            'vvvvvVVV',\n                            0x0015, // 0x0015 = ftCmo\n                            0x0012, // length of ftCmo data\n                            0x0008, // object type, 0x0008 = picture\n                            $i, // object id number, Excel seems to use 1-based index, local for the sheet\n                            0x6011, // option flags, 0x6011 is what OpenOffice.org uses\n                            0, // reserved\n                            0, // reserved\n                            0  // reserved\n                        );\n                }\n\n                // ftEnd\n                $objData .=\n                    pack(\n                        'vv',\n                        0x0000, // 0x0000 = ftEnd\n                        0x0000  // length of ftEnd data\n                    );\n\n                $length = strlen($objData);\n                $header = pack('vv', $record, $length);\n                $this->append($header . $objData);\n            }\n        }\n    }\n\n    /**\n     * Store the DATAVALIDATIONS and DATAVALIDATION records.\n     */\n    private function writeDataValidity()\n    {\n        // Datavalidation collection\n        $dataValidationCollection = $this->phpSheet->getDataValidationCollection();\n\n        // Write data validations?\n        if (!empty($dataValidationCollection)) {\n            // DATAVALIDATIONS record\n            $record = 0x01B2;      // Record identifier\n            $length = 0x0012;      // Bytes to follow\n\n            $grbit  = 0x0000;       // Prompt box at cell, no cached validity data at DV records\n            $horPos = 0x00000000;  // Horizontal position of prompt box, if fixed position\n            $verPos = 0x00000000;  // Vertical position of prompt box, if fixed position\n            $objId  = 0xFFFFFFFF;  // Object identifier of drop down arrow object, or -1 if not visible\n\n            $header = pack('vv', $record, $length);\n            $data   = pack('vVVVV', $grbit, $horPos, $verPos, $objId, count($dataValidationCollection));\n            $this->append($header.$data);\n\n            // DATAVALIDATION records\n            $record = 0x01BE;              // Record identifier\n\n            foreach ($dataValidationCollection as $cellCoordinate => $dataValidation) {\n                // initialize record data\n                $data = '';\n\n                // options\n                $options = 0x00000000;\n\n                // data type\n                $type = $dataValidation->getType();\n                switch ($type) {\n                    case PHPExcel_Cell_DataValidation::TYPE_NONE:\n                        $type = 0x00;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_WHOLE:\n                        $type = 0x01;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_DECIMAL:\n                        $type = 0x02;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_LIST:\n                        $type = 0x03;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_DATE:\n                        $type = 0x04;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_TIME:\n                        $type = 0x05;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH:\n                        $type = 0x06;\n                        break;\n                    case PHPExcel_Cell_DataValidation::TYPE_CUSTOM:\n                        $type = 0x07;\n                        break;\n                }\n                $options |= $type << 0;\n\n                // error style\n                $errorStyle = $dataValidation->getType();\n                switch ($errorStyle) {\n                    case PHPExcel_Cell_DataValidation::STYLE_STOP:\n                        $errorStyle = 0x00;\n                        break;\n                    case PHPExcel_Cell_DataValidation::STYLE_WARNING:\n                        $errorStyle = 0x01;\n                        break;\n                    case PHPExcel_Cell_DataValidation::STYLE_INFORMATION:\n                        $errorStyle = 0x02;\n                        break;\n                }\n                $options |= $errorStyle << 4;\n\n                // explicit formula?\n                if ($type == 0x03 && preg_match('/^\\\".*\\\"$/', $dataValidation->getFormula1())) {\n                    $options |= 0x01 << 7;\n                }\n\n                // empty cells allowed\n                $options |= $dataValidation->getAllowBlank() << 8;\n\n                // show drop down\n                $options |= (!$dataValidation->getShowDropDown()) << 9;\n\n                // show input message\n                $options |= $dataValidation->getShowInputMessage() << 18;\n\n                // show error message\n                $options |= $dataValidation->getShowErrorMessage() << 19;\n\n                // condition operator\n                $operator = $dataValidation->getOperator();\n                switch ($operator) {\n                    case PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN:\n                        $operator = 0x00;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_NOTBETWEEN:\n                        $operator = 0x01;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_EQUAL:\n                        $operator = 0x02;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_NOTEQUAL:\n                        $operator = 0x03;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHAN:\n                        $operator = 0x04;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_LESSTHAN:\n                        $operator = 0x05;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHANOREQUAL:\n                        $operator = 0x06;\n                        break;\n                    case PHPExcel_Cell_DataValidation::OPERATOR_LESSTHANOREQUAL:\n                        $operator = 0x07;\n                        break;\n                }\n                $options |= $operator << 20;\n\n                $data        = pack('V', $options);\n\n                // prompt title\n                $promptTitle = $dataValidation->getPromptTitle() !== '' ?\n                    $dataValidation->getPromptTitle() : chr(0);\n                $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($promptTitle);\n\n                // error title\n                $errorTitle = $dataValidation->getErrorTitle() !== '' ?\n                    $dataValidation->getErrorTitle() : chr(0);\n                $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($errorTitle);\n\n                // prompt text\n                $prompt = $dataValidation->getPrompt() !== '' ?\n                    $dataValidation->getPrompt() : chr(0);\n                $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($prompt);\n\n                // error text\n                $error = $dataValidation->getError() !== '' ?\n                    $dataValidation->getError() : chr(0);\n                $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($error);\n\n                // formula 1\n                try {\n                    $formula1 = $dataValidation->getFormula1();\n                    if ($type == 0x03) { // list type\n                        $formula1 = str_replace(',', chr(0), $formula1);\n                    }\n                    $this->parser->parse($formula1);\n                    $formula1 = $this->parser->toReversePolish();\n                    $sz1 = strlen($formula1);\n                } catch (PHPExcel_Exception $e) {\n                    $sz1 = 0;\n                    $formula1 = '';\n                }\n                $data .= pack('vv', $sz1, 0x0000);\n                $data .= $formula1;\n\n                // formula 2\n                try {\n                    $formula2 = $dataValidation->getFormula2();\n                    if ($formula2 === '') {\n                        throw new PHPExcel_Writer_Exception('No formula2');\n                    }\n                    $this->parser->parse($formula2);\n                    $formula2 = $this->parser->toReversePolish();\n                    $sz2 = strlen($formula2);\n                } catch (PHPExcel_Exception $e) {\n                    $sz2 = 0;\n                    $formula2 = '';\n                }\n                $data .= pack('vv', $sz2, 0x0000);\n                $data .= $formula2;\n\n                // cell range address list\n                $data .= pack('v', 0x0001);\n                $data .= $this->writeBIFF8CellRangeAddressFixed($cellCoordinate);\n\n                $length = strlen($data);\n                $header = pack(\"vv\", $record, $length);\n\n                $this->append($header . $data);\n            }\n        }\n    }\n\n    /**\n     * Map Error code\n     *\n     * @param string $errorCode\n     * @return int\n     */\n    private static function mapErrorCode($errorCode)\n    {\n        switch ($errorCode) {\n            case '#NULL!':\n                return 0x00;\n            case '#DIV/0!':\n                return 0x07;\n            case '#VALUE!':\n                return 0x0F;\n            case '#REF!':\n                return 0x17;\n            case '#NAME?':\n                return 0x1D;\n            case '#NUM!':\n                return 0x24;\n            case '#N/A':\n                return 0x2A;\n        }\n\n        return 0;\n    }\n\n    /**\n     * Write PLV Record\n     */\n    private function writePageLayoutView()\n    {\n        $record      = 0x088B;               // Record identifier\n        $length      = 0x0010;               // Bytes to follow\n\n        $rt         = 0x088B; // 2\n        $grbitFrt   = 0x0000; // 2\n        $reserved   = 0x0000000000000000; // 8\n        $wScalvePLV = $this->phpSheet->getSheetView()->getZoomScale(); // 2\n\n        // The options flags that comprise $grbit\n        if ($this->phpSheet->getSheetView()->getView() == PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT) {\n            $fPageLayoutView   = 1;\n        } else {\n            $fPageLayoutView   = 0;\n        }\n        $fRulerVisible     = 0;\n        $fWhitespaceHidden = 0;\n\n        $grbit      = $fPageLayoutView; // 2\n        $grbit        |= $fRulerVisible       << 1;\n        $grbit        |= $fWhitespaceHidden  << 3;\n\n        $header      = pack(\"vv\", $record, $length);\n        $data      = pack(\"vvVVvv\", $rt, $grbitFrt, 0x00000000, 0x00000000, $wScalvePLV, $grbit);\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write CFRule Record\n     * @param PHPExcel_Style_Conditional $conditional\n     */\n    private function writeCFRule(PHPExcel_Style_Conditional $conditional)\n    {\n        $record      = 0x01B1;               // Record identifier\n\n        // $type : Type of the CF\n        // $operatorType : Comparison operator\n        if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) {\n            $type = 0x02;\n            $operatorType = 0x00;\n        } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS) {\n            $type = 0x01;\n\n            switch ($conditional->getOperatorType()) {\n                case PHPExcel_Style_Conditional::OPERATOR_NONE:\n                    $operatorType = 0x00;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_EQUAL:\n                    $operatorType = 0x03;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_GREATERTHAN:\n                    $operatorType = 0x05;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_GREATERTHANOREQUAL:\n                    $operatorType = 0x07;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_LESSTHAN:\n                    $operatorType = 0x06;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_LESSTHANOREQUAL:\n                    $operatorType = 0x08;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_NOTEQUAL:\n                    $operatorType = 0x04;\n                    break;\n                case PHPExcel_Style_Conditional::OPERATOR_BETWEEN:\n                    $operatorType = 0x01;\n                    break;\n                    // not OPERATOR_NOTBETWEEN 0x02\n            }\n        }\n\n        // $szValue1 : size of the formula data for first value or formula\n        // $szValue2 : size of the formula data for second value or formula\n        $arrConditions = $conditional->getConditions();\n        $numConditions = sizeof($arrConditions);\n        if ($numConditions == 1) {\n            $szValue1 = ($arrConditions[0] <= 65535 ? 3 : 0x0000);\n            $szValue2 = 0x0000;\n            $operand1 = pack('Cv', 0x1E, $arrConditions[0]);\n            $operand2 = null;\n        } elseif ($numConditions == 2 && ($conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BETWEEN)) {\n            $szValue1 = ($arrConditions[0] <= 65535 ? 3 : 0x0000);\n            $szValue2 = ($arrConditions[1] <= 65535 ? 3 : 0x0000);\n            $operand1 = pack('Cv', 0x1E, $arrConditions[0]);\n            $operand2 = pack('Cv', 0x1E, $arrConditions[1]);\n        } else {\n            $szValue1 = 0x0000;\n            $szValue2 = 0x0000;\n            $operand1 = null;\n            $operand2 = null;\n        }\n\n        // $flags : Option flags\n        // Alignment\n        $bAlignHz = ($conditional->getStyle()->getAlignment()->getHorizontal() == null ? 1 : 0);\n        $bAlignVt = ($conditional->getStyle()->getAlignment()->getVertical() == null ? 1 : 0);\n        $bAlignWrapTx = ($conditional->getStyle()->getAlignment()->getWrapText() == false ? 1 : 0);\n        $bTxRotation = ($conditional->getStyle()->getAlignment()->getTextRotation() == null ? 1 : 0);\n        $bIndent = ($conditional->getStyle()->getAlignment()->getIndent() == 0 ? 1 : 0);\n        $bShrinkToFit = ($conditional->getStyle()->getAlignment()->getShrinkToFit() == false ? 1 : 0);\n        if ($bAlignHz == 0 || $bAlignVt == 0 || $bAlignWrapTx == 0 || $bTxRotation == 0 || $bIndent == 0 || $bShrinkToFit == 0) {\n            $bFormatAlign = 1;\n        } else {\n            $bFormatAlign = 0;\n        }\n        // Protection\n        $bProtLocked = ($conditional->getStyle()->getProtection()->getLocked() == null ? 1 : 0);\n        $bProtHidden = ($conditional->getStyle()->getProtection()->getHidden() == null ? 1 : 0);\n        if ($bProtLocked == 0 || $bProtHidden == 0) {\n            $bFormatProt = 1;\n        } else {\n            $bFormatProt = 0;\n        }\n        // Border\n        $bBorderLeft = ($conditional->getStyle()->getBorders()->getLeft()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK\n                        && $conditional->getStyle()->getBorders()->getLeft()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0);\n        $bBorderRight = ($conditional->getStyle()->getBorders()->getRight()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK\n                        && $conditional->getStyle()->getBorders()->getRight()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0);\n        $bBorderTop = ($conditional->getStyle()->getBorders()->getTop()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK\n                        && $conditional->getStyle()->getBorders()->getTop()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0);\n        $bBorderBottom = ($conditional->getStyle()->getBorders()->getBottom()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK\n                        && $conditional->getStyle()->getBorders()->getBottom()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0);\n        if ($bBorderLeft == 0 || $bBorderRight == 0 || $bBorderTop == 0 || $bBorderBottom == 0) {\n            $bFormatBorder = 1;\n        } else {\n            $bFormatBorder = 0;\n        }\n        // Pattern\n        $bFillStyle = ($conditional->getStyle()->getFill()->getFillType() == null ? 0 : 1);\n        $bFillColor = ($conditional->getStyle()->getFill()->getStartColor()->getARGB() == null ? 0 : 1);\n        $bFillColorBg = ($conditional->getStyle()->getFill()->getEndColor()->getARGB() == null ? 0 : 1);\n        if ($bFillStyle == 0 || $bFillColor == 0 || $bFillColorBg == 0) {\n            $bFormatFill = 1;\n        } else {\n            $bFormatFill = 0;\n        }\n        // Font\n        if ($conditional->getStyle()->getFont()->getName() != null\n            || $conditional->getStyle()->getFont()->getSize() != null\n            || $conditional->getStyle()->getFont()->getBold() != null\n            || $conditional->getStyle()->getFont()->getItalic() != null\n            || $conditional->getStyle()->getFont()->getSuperScript() != null\n            || $conditional->getStyle()->getFont()->getSubScript() != null\n            || $conditional->getStyle()->getFont()->getUnderline() != null\n            || $conditional->getStyle()->getFont()->getStrikethrough() != null\n            || $conditional->getStyle()->getFont()->getColor()->getARGB() != null) {\n            $bFormatFont = 1;\n        } else {\n            $bFormatFont = 0;\n        }\n        // Alignment\n        $flags = 0;\n        $flags |= (1 == $bAlignHz      ? 0x00000001 : 0);\n        $flags |= (1 == $bAlignVt      ? 0x00000002 : 0);\n        $flags |= (1 == $bAlignWrapTx  ? 0x00000004 : 0);\n        $flags |= (1 == $bTxRotation   ? 0x00000008 : 0);\n        // Justify last line flag\n        $flags |= (1 == 1              ? 0x00000010 : 0);\n        $flags |= (1 == $bIndent       ? 0x00000020 : 0);\n        $flags |= (1 == $bShrinkToFit  ? 0x00000040 : 0);\n        // Default\n        $flags |= (1 == 1              ? 0x00000080 : 0);\n        // Protection\n        $flags |= (1 == $bProtLocked   ? 0x00000100 : 0);\n        $flags |= (1 == $bProtHidden   ? 0x00000200 : 0);\n        // Border\n        $flags |= (1 == $bBorderLeft   ? 0x00000400 : 0);\n        $flags |= (1 == $bBorderRight  ? 0x00000800 : 0);\n        $flags |= (1 == $bBorderTop    ? 0x00001000 : 0);\n        $flags |= (1 == $bBorderBottom ? 0x00002000 : 0);\n        $flags |= (1 == 1              ? 0x00004000 : 0); // Top left to Bottom right border\n        $flags |= (1 == 1              ? 0x00008000 : 0); // Bottom left to Top right border\n        // Pattern\n        $flags |= (1 == $bFillStyle    ? 0x00010000 : 0);\n        $flags |= (1 == $bFillColor    ? 0x00020000 : 0);\n        $flags |= (1 == $bFillColorBg  ? 0x00040000 : 0);\n        $flags |= (1 == 1              ? 0x00380000 : 0);\n        // Font\n        $flags |= (1 == $bFormatFont   ? 0x04000000 : 0);\n        // Alignment:\n        $flags |= (1 == $bFormatAlign  ? 0x08000000 : 0);\n        // Border\n        $flags |= (1 == $bFormatBorder ? 0x10000000 : 0);\n        // Pattern\n        $flags |= (1 == $bFormatFill   ? 0x20000000 : 0);\n        // Protection\n        $flags |= (1 == $bFormatProt   ? 0x40000000 : 0);\n        // Text direction\n        $flags |= (1 == 0              ? 0x80000000 : 0);\n\n        // Data Blocks\n        if ($bFormatFont == 1) {\n            // Font Name\n            if ($conditional->getStyle()->getFont()->getName() == null) {\n                $dataBlockFont =  pack('VVVVVVVV', 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000);\n                $dataBlockFont .= pack('VVVVVVVV', 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000);\n            } else {\n                $dataBlockFont = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($conditional->getStyle()->getFont()->getName());\n            }\n            // Font Size\n            if ($conditional->getStyle()->getFont()->getSize() == null) {\n                $dataBlockFont .= pack('V', 20 * 11);\n            } else {\n                $dataBlockFont .= pack('V', 20 * $conditional->getStyle()->getFont()->getSize());\n            }\n            // Font Options\n            $dataBlockFont .= pack('V', 0);\n            // Font weight\n            if ($conditional->getStyle()->getFont()->getBold() == true) {\n                $dataBlockFont .= pack('v', 0x02BC);\n            } else {\n                $dataBlockFont .= pack('v', 0x0190);\n            }\n            // Escapement type\n            if ($conditional->getStyle()->getFont()->getSubScript() == true) {\n                $dataBlockFont .= pack('v', 0x02);\n                $fontEscapement = 0;\n            } elseif ($conditional->getStyle()->getFont()->getSuperScript() == true) {\n                $dataBlockFont .= pack('v', 0x01);\n                $fontEscapement = 0;\n            } else {\n                $dataBlockFont .= pack('v', 0x00);\n                $fontEscapement = 1;\n            }\n            // Underline type\n            switch ($conditional->getStyle()->getFont()->getUnderline()) {\n                case PHPExcel_Style_Font::UNDERLINE_NONE:\n                    $dataBlockFont .= pack('C', 0x00);\n                    $fontUnderline = 0;\n                    break;\n                case PHPExcel_Style_Font::UNDERLINE_DOUBLE:\n                    $dataBlockFont .= pack('C', 0x02);\n                    $fontUnderline = 0;\n                    break;\n                case PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING:\n                    $dataBlockFont .= pack('C', 0x22);\n                    $fontUnderline = 0;\n                    break;\n                case PHPExcel_Style_Font::UNDERLINE_SINGLE:\n                    $dataBlockFont .= pack('C', 0x01);\n                    $fontUnderline = 0;\n                    break;\n                case PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING:\n                    $dataBlockFont .= pack('C', 0x21);\n                    $fontUnderline = 0;\n                    break;\n                default: $dataBlockFont .= pack('C', 0x00);\n                    $fontUnderline = 1;\n                    break;\n            }\n            // Not used (3)\n            $dataBlockFont .= pack('vC', 0x0000, 0x00);\n            // Font color index\n            switch ($conditional->getStyle()->getFont()->getColor()->getRGB()) {\n                case '000000':\n                    $colorIdx = 0x08;\n                    break;\n                case 'FFFFFF':\n                    $colorIdx = 0x09;\n                    break;\n                case 'FF0000':\n                    $colorIdx = 0x0A;\n                    break;\n                case '00FF00':\n                    $colorIdx = 0x0B;\n                    break;\n                case '0000FF':\n                    $colorIdx = 0x0C;\n                    break;\n                case 'FFFF00':\n                    $colorIdx = 0x0D;\n                    break;\n                case 'FF00FF':\n                    $colorIdx = 0x0E;\n                    break;\n                case '00FFFF':\n                    $colorIdx = 0x0F;\n                    break;\n                case '800000':\n                    $colorIdx = 0x10;\n                    break;\n                case '008000':\n                    $colorIdx = 0x11;\n                    break;\n                case '000080':\n                    $colorIdx = 0x12;\n                    break;\n                case '808000':\n                    $colorIdx = 0x13;\n                    break;\n                case '800080':\n                    $colorIdx = 0x14;\n                    break;\n                case '008080':\n                    $colorIdx = 0x15;\n                    break;\n                case 'C0C0C0':\n                    $colorIdx = 0x16;\n                    break;\n                case '808080':\n                    $colorIdx = 0x17;\n                    break;\n                case '9999FF':\n                    $colorIdx = 0x18;\n                    break;\n                case '993366':\n                    $colorIdx = 0x19;\n                    break;\n                case 'FFFFCC':\n                    $colorIdx = 0x1A;\n                    break;\n                case 'CCFFFF':\n                    $colorIdx = 0x1B;\n                    break;\n                case '660066':\n                    $colorIdx = 0x1C;\n                    break;\n                case 'FF8080':\n                    $colorIdx = 0x1D;\n                    break;\n                case '0066CC':\n                    $colorIdx = 0x1E;\n                    break;\n                case 'CCCCFF':\n                    $colorIdx = 0x1F;\n                    break;\n                case '000080':\n                    $colorIdx = 0x20;\n                    break;\n                case 'FF00FF':\n                    $colorIdx = 0x21;\n                    break;\n                case 'FFFF00':\n                    $colorIdx = 0x22;\n                    break;\n                case '00FFFF':\n                    $colorIdx = 0x23;\n                    break;\n                case '800080':\n                    $colorIdx = 0x24;\n                    break;\n                case '800000':\n                    $colorIdx = 0x25;\n                    break;\n                case '008080':\n                    $colorIdx = 0x26;\n                    break;\n                case '0000FF':\n                    $colorIdx = 0x27;\n                    break;\n                case '00CCFF':\n                    $colorIdx = 0x28;\n                    break;\n                case 'CCFFFF':\n                    $colorIdx = 0x29;\n                    break;\n                case 'CCFFCC':\n                    $colorIdx = 0x2A;\n                    break;\n                case 'FFFF99':\n                    $colorIdx = 0x2B;\n                    break;\n                case '99CCFF':\n                    $colorIdx = 0x2C;\n                    break;\n                case 'FF99CC':\n                    $colorIdx = 0x2D;\n                    break;\n                case 'CC99FF':\n                    $colorIdx = 0x2E;\n                    break;\n                case 'FFCC99':\n                    $colorIdx = 0x2F;\n                    break;\n                case '3366FF':\n                    $colorIdx = 0x30;\n                    break;\n                case '33CCCC':\n                    $colorIdx = 0x31;\n                    break;\n                case '99CC00':\n                    $colorIdx = 0x32;\n                    break;\n                case 'FFCC00':\n                    $colorIdx = 0x33;\n                    break;\n                case 'FF9900':\n                    $colorIdx = 0x34;\n                    break;\n                case 'FF6600':\n                    $colorIdx = 0x35;\n                    break;\n                case '666699':\n                    $colorIdx = 0x36;\n                    break;\n                case '969696':\n                    $colorIdx = 0x37;\n                    break;\n                case '003366':\n                    $colorIdx = 0x38;\n                    break;\n                case '339966':\n                    $colorIdx = 0x39;\n                    break;\n                case '003300':\n                    $colorIdx = 0x3A;\n                    break;\n                case '333300':\n                    $colorIdx = 0x3B;\n                    break;\n                case '993300':\n                    $colorIdx = 0x3C;\n                    break;\n                case '993366':\n                    $colorIdx = 0x3D;\n                    break;\n                case '333399':\n                    $colorIdx = 0x3E;\n                    break;\n                case '333333':\n                    $colorIdx = 0x3F;\n                    break;\n                default:\n                    $colorIdx = 0x00;\n                    break;\n            }\n            $dataBlockFont .= pack('V', $colorIdx);\n            // Not used (4)\n            $dataBlockFont .= pack('V', 0x00000000);\n            // Options flags for modified font attributes\n            $optionsFlags = 0;\n            $optionsFlagsBold = ($conditional->getStyle()->getFont()->getBold() == null ? 1 : 0);\n            $optionsFlags |= (1 == $optionsFlagsBold  ? 0x00000002 : 0);\n            $optionsFlags |= (1 == 1                  ? 0x00000008 : 0);\n            $optionsFlags |= (1 == 1                  ? 0x00000010 : 0);\n            $optionsFlags |= (1 == 0                  ? 0x00000020 : 0);\n            $optionsFlags |= (1 == 1                  ? 0x00000080 : 0);\n            $dataBlockFont .= pack('V', $optionsFlags);\n            // Escapement type\n            $dataBlockFont .= pack('V', $fontEscapement);\n            // Underline type\n            $dataBlockFont .= pack('V', $fontUnderline);\n            // Always\n            $dataBlockFont .= pack('V', 0x00000000);\n            // Always\n            $dataBlockFont .= pack('V', 0x00000000);\n            // Not used (8)\n            $dataBlockFont .= pack('VV', 0x00000000, 0x00000000);\n            // Always\n            $dataBlockFont .= pack('v', 0x0001);\n        }\n        if ($bFormatAlign == 1) {\n            $blockAlign = 0;\n            // Alignment and text break\n            switch ($conditional->getStyle()->getAlignment()->getHorizontal()) {\n                case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL:\n                    $blockAlign = 0;\n                    break;\n                case PHPExcel_Style_Alignment::HORIZONTAL_LEFT:\n                    $blockAlign = 1;\n                    break;\n                case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT:\n                    $blockAlign = 3;\n                    break;\n                case PHPExcel_Style_Alignment::HORIZONTAL_CENTER:\n                    $blockAlign = 2;\n                    break;\n                case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS:\n                    $blockAlign = 6;\n                    break;\n                case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY:\n                    $blockAlign = 5;\n                    break;\n            }\n            if ($conditional->getStyle()->getAlignment()->getWrapText() == true) {\n                $blockAlign |= 1 << 3;\n            } else {\n                $blockAlign |= 0 << 3;\n            }\n            switch ($conditional->getStyle()->getAlignment()->getVertical()) {\n                case PHPExcel_Style_Alignment::VERTICAL_BOTTOM:\n                    $blockAlign = 2 << 4;\n                    break;\n                case PHPExcel_Style_Alignment::VERTICAL_TOP:\n                    $blockAlign = 0 << 4;\n                    break;\n                case PHPExcel_Style_Alignment::VERTICAL_CENTER:\n                    $blockAlign = 1 << 4;\n                    break;\n                case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY:\n                    $blockAlign = 3 << 4;\n                    break;\n            }\n            $blockAlign |= 0 << 7;\n\n            // Text rotation angle\n            $blockRotation = $conditional->getStyle()->getAlignment()->getTextRotation();\n\n            // Indentation\n            $blockIndent = $conditional->getStyle()->getAlignment()->getIndent();\n            if ($conditional->getStyle()->getAlignment()->getShrinkToFit() == true) {\n                $blockIndent |= 1 << 4;\n            } else {\n                $blockIndent |= 0 << 4;\n            }\n            $blockIndent |= 0 << 6;\n\n            // Relative indentation\n            $blockIndentRelative = 255;\n\n            $dataBlockAlign = pack('CCvvv', $blockAlign, $blockRotation, $blockIndent, $blockIndentRelative, 0x0000);\n        }\n        if ($bFormatBorder == 1) {\n            $blockLineStyle = 0;\n            switch ($conditional->getStyle()->getBorders()->getLeft()->getBorderStyle()) {\n                case PHPExcel_Style_Border::BORDER_NONE:\n                    $blockLineStyle |= 0x00;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THIN:\n                    $blockLineStyle |= 0x01;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUM:\n                    $blockLineStyle |= 0x02;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHED:\n                    $blockLineStyle |= 0x03;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOTTED:\n                    $blockLineStyle |= 0x04;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THICK:\n                    $blockLineStyle |= 0x05;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOUBLE:\n                    $blockLineStyle |= 0x06;\n                    break;\n                case PHPExcel_Style_Border::BORDER_HAIR:\n                    $blockLineStyle |= 0x07;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:\n                    $blockLineStyle |= 0x08;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOT:\n                    $blockLineStyle |= 0x09;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:\n                    $blockLineStyle |= 0x0A;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOTDOT:\n                    $blockLineStyle |= 0x0B;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:\n                    $blockLineStyle |= 0x0C;\n                    break;\n                case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:\n                    $blockLineStyle |= 0x0D;\n                    break;\n            }\n            switch ($conditional->getStyle()->getBorders()->getRight()->getBorderStyle()) {\n                case PHPExcel_Style_Border::BORDER_NONE:\n                    $blockLineStyle |= 0x00 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THIN:\n                    $blockLineStyle |= 0x01 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUM:\n                    $blockLineStyle |= 0x02 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHED:\n                    $blockLineStyle |= 0x03 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOTTED:\n                    $blockLineStyle |= 0x04 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THICK:\n                    $blockLineStyle |= 0x05 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOUBLE:\n                    $blockLineStyle |= 0x06 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_HAIR:\n                    $blockLineStyle |= 0x07 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:\n                    $blockLineStyle |= 0x08 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOT:\n                    $blockLineStyle |= 0x09 << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:\n                    $blockLineStyle |= 0x0A << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOTDOT:\n                    $blockLineStyle |= 0x0B << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:\n                    $blockLineStyle |= 0x0C << 4;\n                    break;\n                case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:\n                    $blockLineStyle |= 0x0D << 4;\n                    break;\n            }\n            switch ($conditional->getStyle()->getBorders()->getTop()->getBorderStyle()) {\n                case PHPExcel_Style_Border::BORDER_NONE:\n                    $blockLineStyle |= 0x00 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THIN:\n                    $blockLineStyle |= 0x01 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUM:\n                    $blockLineStyle |= 0x02 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHED:\n                    $blockLineStyle |= 0x03 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOTTED:\n                    $blockLineStyle |= 0x04 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THICK:\n                    $blockLineStyle |= 0x05 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOUBLE:\n                    $blockLineStyle |= 0x06 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_HAIR:\n                    $blockLineStyle |= 0x07 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:\n                    $blockLineStyle |= 0x08 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOT:\n                    $blockLineStyle |= 0x09 << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:\n                    $blockLineStyle |= 0x0A << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOTDOT:\n                    $blockLineStyle |= 0x0B << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:\n                    $blockLineStyle |= 0x0C << 8;\n                    break;\n                case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:\n                    $blockLineStyle |= 0x0D << 8;\n                    break;\n            }\n            switch ($conditional->getStyle()->getBorders()->getBottom()->getBorderStyle()) {\n                case PHPExcel_Style_Border::BORDER_NONE:\n                    $blockLineStyle |= 0x00 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THIN:\n                    $blockLineStyle |= 0x01 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUM:\n                    $blockLineStyle |= 0x02 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHED:\n                    $blockLineStyle |= 0x03 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOTTED:\n                    $blockLineStyle |= 0x04 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THICK:\n                    $blockLineStyle |= 0x05 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOUBLE:\n                    $blockLineStyle |= 0x06 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_HAIR:\n                    $blockLineStyle |= 0x07 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:\n                    $blockLineStyle |= 0x08 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOT:\n                    $blockLineStyle |= 0x09 << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:\n                    $blockLineStyle |= 0x0A << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOTDOT:\n                    $blockLineStyle |= 0x0B << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:\n                    $blockLineStyle |= 0x0C << 12;\n                    break;\n                case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:\n                    $blockLineStyle |= 0x0D << 12;\n                    break;\n            }\n            //@todo writeCFRule() => $blockLineStyle => Index Color for left line\n            //@todo writeCFRule() => $blockLineStyle => Index Color for right line\n            //@todo writeCFRule() => $blockLineStyle => Top-left to bottom-right on/off\n            //@todo writeCFRule() => $blockLineStyle => Bottom-left to top-right on/off\n            $blockColor = 0;\n            //@todo writeCFRule() => $blockColor => Index Color for top line\n            //@todo writeCFRule() => $blockColor => Index Color for bottom line\n            //@todo writeCFRule() => $blockColor => Index Color for diagonal line\n            switch ($conditional->getStyle()->getBorders()->getDiagonal()->getBorderStyle()) {\n                case PHPExcel_Style_Border::BORDER_NONE:\n                    $blockColor |= 0x00 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THIN:\n                    $blockColor |= 0x01 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUM:\n                    $blockColor |= 0x02 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHED:\n                    $blockColor |= 0x03 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOTTED:\n                    $blockColor |= 0x04 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_THICK:\n                    $blockColor |= 0x05 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DOUBLE:\n                    $blockColor |= 0x06 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_HAIR:\n                    $blockColor |= 0x07 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:\n                    $blockColor |= 0x08 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOT:\n                    $blockColor |= 0x09 << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:\n                    $blockColor |= 0x0A << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_DASHDOTDOT:\n                    $blockColor |= 0x0B << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:\n                    $blockColor |= 0x0C << 21;\n                    break;\n                case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:\n                    $blockColor |= 0x0D << 21;\n                    break;\n            }\n            $dataBlockBorder = pack('vv', $blockLineStyle, $blockColor);\n        }\n        if ($bFormatFill == 1) {\n            // Fill Patern Style\n            $blockFillPatternStyle = 0;\n            switch ($conditional->getStyle()->getFill()->getFillType()) {\n                case PHPExcel_Style_Fill::FILL_NONE:\n                    $blockFillPatternStyle = 0x00;\n                    break;\n                case PHPExcel_Style_Fill::FILL_SOLID:\n                    $blockFillPatternStyle = 0x01;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY:\n                    $blockFillPatternStyle = 0x02;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY:\n                    $blockFillPatternStyle = 0x03;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY:\n                    $blockFillPatternStyle = 0x04;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL:\n                    $blockFillPatternStyle = 0x05;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL:\n                    $blockFillPatternStyle = 0x06;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN:\n                    $blockFillPatternStyle = 0x07;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKUP:\n                    $blockFillPatternStyle = 0x08;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID:\n                    $blockFillPatternStyle = 0x09;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS:\n                    $blockFillPatternStyle = 0x0A;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL:\n                    $blockFillPatternStyle = 0x0B;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL:\n                    $blockFillPatternStyle = 0x0C;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN:\n                    $blockFillPatternStyle = 0x0D;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP:\n                    $blockFillPatternStyle = 0x0E;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID:\n                    $blockFillPatternStyle = 0x0F;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS:\n                    $blockFillPatternStyle = 0x10;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_GRAY125:\n                    $blockFillPatternStyle = 0x11;\n                    break;\n                case PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625:\n                    $blockFillPatternStyle = 0x12;\n                    break;\n                case PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR:\n                    $blockFillPatternStyle = 0x00;\n                    break;    // does not exist in BIFF8\n                case PHPExcel_Style_Fill::FILL_GRADIENT_PATH:\n                    $blockFillPatternStyle = 0x00;\n                    break;    // does not exist in BIFF8\n                default:\n                    $blockFillPatternStyle = 0x00;\n                    break;\n            }\n            // Color\n            switch ($conditional->getStyle()->getFill()->getStartColor()->getRGB()) {\n                case '000000':\n                    $colorIdxBg = 0x08;\n                    break;\n                case 'FFFFFF':\n                    $colorIdxBg = 0x09;\n                    break;\n                case 'FF0000':\n                    $colorIdxBg = 0x0A;\n                    break;\n                case '00FF00':\n                    $colorIdxBg = 0x0B;\n                    break;\n                case '0000FF':\n                    $colorIdxBg = 0x0C;\n                    break;\n                case 'FFFF00':\n                    $colorIdxBg = 0x0D;\n                    break;\n                case 'FF00FF':\n                    $colorIdxBg = 0x0E;\n                    break;\n                case '00FFFF':\n                    $colorIdxBg = 0x0F;\n                    break;\n                case '800000':\n                    $colorIdxBg = 0x10;\n                    break;\n                case '008000':\n                    $colorIdxBg = 0x11;\n                    break;\n                case '000080':\n                    $colorIdxBg = 0x12;\n                    break;\n                case '808000':\n                    $colorIdxBg = 0x13;\n                    break;\n                case '800080':\n                    $colorIdxBg = 0x14;\n                    break;\n                case '008080':\n                    $colorIdxBg = 0x15;\n                    break;\n                case 'C0C0C0':\n                    $colorIdxBg = 0x16;\n                    break;\n                case '808080':\n                    $colorIdxBg = 0x17;\n                    break;\n                case '9999FF':\n                    $colorIdxBg = 0x18;\n                    break;\n                case '993366':\n                    $colorIdxBg = 0x19;\n                    break;\n                case 'FFFFCC':\n                    $colorIdxBg = 0x1A;\n                    break;\n                case 'CCFFFF':\n                    $colorIdxBg = 0x1B;\n                    break;\n                case '660066':\n                    $colorIdxBg = 0x1C;\n                    break;\n                case 'FF8080':\n                    $colorIdxBg = 0x1D;\n                    break;\n                case '0066CC':\n                    $colorIdxBg = 0x1E;\n                    break;\n                case 'CCCCFF':\n                    $colorIdxBg = 0x1F;\n                    break;\n                case '000080':\n                    $colorIdxBg = 0x20;\n                    break;\n                case 'FF00FF':\n                    $colorIdxBg = 0x21;\n                    break;\n                case 'FFFF00':\n                    $colorIdxBg = 0x22;\n                    break;\n                case '00FFFF':\n                    $colorIdxBg = 0x23;\n                    break;\n                case '800080':\n                    $colorIdxBg = 0x24;\n                    break;\n                case '800000':\n                    $colorIdxBg = 0x25;\n                    break;\n                case '008080':\n                    $colorIdxBg = 0x26;\n                    break;\n                case '0000FF':\n                    $colorIdxBg = 0x27;\n                    break;\n                case '00CCFF':\n                    $colorIdxBg = 0x28;\n                    break;\n                case 'CCFFFF':\n                    $colorIdxBg = 0x29;\n                    break;\n                case 'CCFFCC':\n                    $colorIdxBg = 0x2A;\n                    break;\n                case 'FFFF99':\n                    $colorIdxBg = 0x2B;\n                    break;\n                case '99CCFF':\n                    $colorIdxBg = 0x2C;\n                    break;\n                case 'FF99CC':\n                    $colorIdxBg = 0x2D;\n                    break;\n                case 'CC99FF':\n                    $colorIdxBg = 0x2E;\n                    break;\n                case 'FFCC99':\n                    $colorIdxBg = 0x2F;\n                    break;\n                case '3366FF':\n                    $colorIdxBg = 0x30;\n                    break;\n                case '33CCCC':\n                    $colorIdxBg = 0x31;\n                    break;\n                case '99CC00':\n                    $colorIdxBg = 0x32;\n                    break;\n                case 'FFCC00':\n                    $colorIdxBg = 0x33;\n                    break;\n                case 'FF9900':\n                    $colorIdxBg = 0x34;\n                    break;\n                case 'FF6600':\n                    $colorIdxBg = 0x35;\n                    break;\n                case '666699':\n                    $colorIdxBg = 0x36;\n                    break;\n                case '969696':\n                    $colorIdxBg = 0x37;\n                    break;\n                case '003366':\n                    $colorIdxBg = 0x38;\n                    break;\n                case '339966':\n                    $colorIdxBg = 0x39;\n                    break;\n                case '003300':\n                    $colorIdxBg = 0x3A;\n                    break;\n                case '333300':\n                    $colorIdxBg = 0x3B;\n                    break;\n                case '993300':\n                    $colorIdxBg = 0x3C;\n                    break;\n                case '993366':\n                    $colorIdxBg = 0x3D;\n                    break;\n                case '333399':\n                    $colorIdxBg = 0x3E;\n                    break;\n                case '333333':\n                    $colorIdxBg = 0x3F;\n                    break;\n                default:\n                          $colorIdxBg = 0x41;\n                    break;\n            }\n            // Fg Color\n            switch ($conditional->getStyle()->getFill()->getEndColor()->getRGB()) {\n                case '000000':\n                    $colorIdxFg = 0x08;\n                    break;\n                case 'FFFFFF':\n                    $colorIdxFg = 0x09;\n                    break;\n                case 'FF0000':\n                    $colorIdxFg = 0x0A;\n                    break;\n                case '00FF00':\n                    $colorIdxFg = 0x0B;\n                    break;\n                case '0000FF':\n                    $colorIdxFg = 0x0C;\n                    break;\n                case 'FFFF00':\n                    $colorIdxFg = 0x0D;\n                    break;\n                case 'FF00FF':\n                    $colorIdxFg = 0x0E;\n                    break;\n                case '00FFFF':\n                    $colorIdxFg = 0x0F;\n                    break;\n                case '800000':\n                    $colorIdxFg = 0x10;\n                    break;\n                case '008000':\n                    $colorIdxFg = 0x11;\n                    break;\n                case '000080':\n                    $colorIdxFg = 0x12;\n                    break;\n                case '808000':\n                    $colorIdxFg = 0x13;\n                    break;\n                case '800080':\n                    $colorIdxFg = 0x14;\n                    break;\n                case '008080':\n                    $colorIdxFg = 0x15;\n                    break;\n                case 'C0C0C0':\n                    $colorIdxFg = 0x16;\n                    break;\n                case '808080':\n                    $colorIdxFg = 0x17;\n                    break;\n                case '9999FF':\n                    $colorIdxFg = 0x18;\n                    break;\n                case '993366':\n                    $colorIdxFg = 0x19;\n                    break;\n                case 'FFFFCC':\n                    $colorIdxFg = 0x1A;\n                    break;\n                case 'CCFFFF':\n                    $colorIdxFg = 0x1B;\n                    break;\n                case '660066':\n                    $colorIdxFg = 0x1C;\n                    break;\n                case 'FF8080':\n                    $colorIdxFg = 0x1D;\n                    break;\n                case '0066CC':\n                    $colorIdxFg = 0x1E;\n                    break;\n                case 'CCCCFF':\n                    $colorIdxFg = 0x1F;\n                    break;\n                case '000080':\n                    $colorIdxFg = 0x20;\n                    break;\n                case 'FF00FF':\n                    $colorIdxFg = 0x21;\n                    break;\n                case 'FFFF00':\n                    $colorIdxFg = 0x22;\n                    break;\n                case '00FFFF':\n                    $colorIdxFg = 0x23;\n                    break;\n                case '800080':\n                    $colorIdxFg = 0x24;\n                    break;\n                case '800000':\n                    $colorIdxFg = 0x25;\n                    break;\n                case '008080':\n                    $colorIdxFg = 0x26;\n                    break;\n                case '0000FF':\n                    $colorIdxFg = 0x27;\n                    break;\n                case '00CCFF':\n                    $colorIdxFg = 0x28;\n                    break;\n                case 'CCFFFF':\n                    $colorIdxFg = 0x29;\n                    break;\n                case 'CCFFCC':\n                    $colorIdxFg = 0x2A;\n                    break;\n                case 'FFFF99':\n                    $colorIdxFg = 0x2B;\n                    break;\n                case '99CCFF':\n                    $colorIdxFg = 0x2C;\n                    break;\n                case 'FF99CC':\n                    $colorIdxFg = 0x2D;\n                    break;\n                case 'CC99FF':\n                    $colorIdxFg = 0x2E;\n                    break;\n                case 'FFCC99':\n                    $colorIdxFg = 0x2F;\n                    break;\n                case '3366FF':\n                    $colorIdxFg = 0x30;\n                    break;\n                case '33CCCC':\n                    $colorIdxFg = 0x31;\n                    break;\n                case '99CC00':\n                    $colorIdxFg = 0x32;\n                    break;\n                case 'FFCC00':\n                    $colorIdxFg = 0x33;\n                    break;\n                case 'FF9900':\n                    $colorIdxFg = 0x34;\n                    break;\n                case 'FF6600':\n                    $colorIdxFg = 0x35;\n                    break;\n                case '666699':\n                    $colorIdxFg = 0x36;\n                    break;\n                case '969696':\n                    $colorIdxFg = 0x37;\n                    break;\n                case '003366':\n                    $colorIdxFg = 0x38;\n                    break;\n                case '339966':\n                    $colorIdxFg = 0x39;\n                    break;\n                case '003300':\n                    $colorIdxFg = 0x3A;\n                    break;\n                case '333300':\n                    $colorIdxFg = 0x3B;\n                    break;\n                case '993300':\n                    $colorIdxFg = 0x3C;\n                    break;\n                case '993366':\n                    $colorIdxFg = 0x3D;\n                    break;\n                case '333399':\n                    $colorIdxFg = 0x3E;\n                    break;\n                case '333333':\n                    $colorIdxFg = 0x3F;\n                    break;\n                default:\n                          $colorIdxFg = 0x40;\n                    break;\n            }\n            $dataBlockFill = pack('v', $blockFillPatternStyle);\n            $dataBlockFill .= pack('v', $colorIdxFg | ($colorIdxBg << 7));\n        }\n        if ($bFormatProt == 1) {\n            $dataBlockProtection = 0;\n            if ($conditional->getStyle()->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED) {\n                $dataBlockProtection = 1;\n            }\n            if ($conditional->getStyle()->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED) {\n                $dataBlockProtection = 1 << 1;\n            }\n        }\n\n        $data      = pack('CCvvVv', $type, $operatorType, $szValue1, $szValue2, $flags, 0x0000);\n        if ($bFormatFont == 1) { // Block Formatting : OK\n            $data .= $dataBlockFont;\n        }\n        if ($bFormatAlign == 1) {\n            $data .= $dataBlockAlign;\n        }\n        if ($bFormatBorder == 1) {\n            $data .= $dataBlockBorder;\n        }\n        if ($bFormatFill == 1) { // Block Formatting : OK\n            $data .= $dataBlockFill;\n        }\n        if ($bFormatProt == 1) {\n            $data .= $dataBlockProtection;\n        }\n        if (!is_null($operand1)) {\n            $data .= $operand1;\n        }\n        if (!is_null($operand2)) {\n            $data .= $operand2;\n        }\n        $header      = pack('vv', $record, strlen($data));\n        $this->append($header . $data);\n    }\n\n    /**\n     * Write CFHeader record\n     */\n    private function writeCFHeader()\n    {\n        $record      = 0x01B0;               // Record identifier\n        $length      = 0x0016;               // Bytes to follow\n\n        $numColumnMin = null;\n        $numColumnMax = null;\n        $numRowMin = null;\n        $numRowMax = null;\n        $arrConditional = array();\n        foreach ($this->phpSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) {\n            foreach ($conditionalStyles as $conditional) {\n                if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION\n                        || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS) {\n                    if (!in_array($conditional->getHashCode(), $arrConditional)) {\n                        $arrConditional[] = $conditional->getHashCode();\n                    }\n                    // Cells\n                    $arrCoord = PHPExcel_Cell::coordinateFromString($cellCoordinate);\n                    if (!is_numeric($arrCoord[0])) {\n                        $arrCoord[0] = PHPExcel_Cell::columnIndexFromString($arrCoord[0]);\n                    }\n                    if (is_null($numColumnMin) || ($numColumnMin > $arrCoord[0])) {\n                        $numColumnMin = $arrCoord[0];\n                    }\n                    if (is_null($numColumnMax) || ($numColumnMax < $arrCoord[0])) {\n                        $numColumnMax = $arrCoord[0];\n                    }\n                    if (is_null($numRowMin) || ($numRowMin > $arrCoord[1])) {\n                        $numRowMin = $arrCoord[1];\n                    }\n                    if (is_null($numRowMax) || ($numRowMax < $arrCoord[1])) {\n                        $numRowMax = $arrCoord[1];\n                    }\n                }\n            }\n        }\n        $needRedraw = 1;\n        $cellRange = pack('vvvv', $numRowMin-1, $numRowMax-1, $numColumnMin-1, $numColumnMax-1);\n\n        $header      = pack('vv', $record, $length);\n        $data      = pack('vv', count($arrConditional), $needRedraw);\n        $data     .= $cellRange;\n        $data     .= pack('v', 0x0001);\n        $data     .= $cellRange;\n        $this->append($header . $data);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5_Xf\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n// Original file header of PEAR::Spreadsheet_Excel_Writer_Format (used as the base for this class):\n// -----------------------------------------------------------------------------------------\n// /*\n// *  Module written/ported by Xavier Noguer <xnoguer@rezebra.com>\n// *\n// *  The majority of this is _NOT_ my code.  I simply ported it from the\n// *  PERL Spreadsheet::WriteExcel module.\n// *\n// *  The author of the Spreadsheet::WriteExcel module is John McNamara\n// *  <jmcnamara@cpan.org>\n// *\n// *  I _DO_ maintain this code, and John McNamara has nothing to do with the\n// *  porting of this code to PHP.  Any questions directly related to this\n// *  class library should be directed to me.\n// *\n// *  License Information:\n// *\n// *    Spreadsheet_Excel_Writer:  A library for generating Excel Spreadsheets\n// *    Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com\n// *\n// *    This library is free software; you can redistribute it and/or\n// *    modify it under the terms of the GNU Lesser General Public\n// *    License as published by the Free Software Foundation; either\n// *    version 2.1 of the License, or (at your option) any later version.\n// *\n// *    This library is distributed in the hope that it will be useful,\n// *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n// *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// *    Lesser General Public License for more details.\n// *\n// *    You should have received a copy of the GNU Lesser General Public\n// *    License along with this library; if not, write to the Free Software\n// *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n// */\nclass PHPExcel_Writer_Excel5_Xf\n{\n    /**\n     * Style XF or a cell XF ?\n     *\n     * @var boolean\n     */\n    private $isStyleXf;\n\n    /**\n     * Index to the FONT record. Index 4 does not exist\n     * @var integer\n     */\n    private $fontIndex;\n\n    /**\n     * An index (2 bytes) to a FORMAT record (number format).\n     * @var integer\n     */\n    private $numberFormatIndex;\n\n    /**\n     * 1 bit, apparently not used.\n     * @var integer\n     */\n    private $textJustLast;\n\n    /**\n     * The cell's foreground color.\n     * @var integer\n     */\n    private $foregroundColor;\n\n    /**\n     * The cell's background color.\n     * @var integer\n     */\n    private $backgroundColor;\n\n    /**\n     * Color of the bottom border of the cell.\n     * @var integer\n     */\n    private $bottomBorderColor;\n\n    /**\n     * Color of the top border of the cell.\n     * @var integer\n     */\n    private $topBorderColor;\n\n    /**\n    * Color of the left border of the cell.\n    * @var integer\n    */\n    private $leftBorderColor;\n\n    /**\n     * Color of the right border of the cell.\n     * @var integer\n     */\n    private $rightBorderColor;\n\n    /**\n     * Constructor\n     *\n     * @access public\n     * @param PHPExcel_Style    The XF format\n     */\n    public function __construct(PHPExcel_Style $style = null)\n    {\n        $this->isStyleXf =     false;\n        $this->fontIndex = 0;\n\n        $this->numberFormatIndex     = 0;\n\n        $this->textJustLast  = 0;\n\n        $this->foregroundColor       = 0x40;\n        $this->backgroundColor       = 0x41;\n\n        $this->_diag           = 0;\n\n        $this->bottomBorderColor   = 0x40;\n        $this->topBorderColor      = 0x40;\n        $this->leftBorderColor     = 0x40;\n        $this->rightBorderColor    = 0x40;\n        $this->_diag_color     = 0x40;\n        $this->_style = $style;\n\n    }\n\n\n    /**\n     * Generate an Excel BIFF XF record (style or cell).\n     *\n     * @return string The XF record\n     */\n    public function writeXf()\n    {\n        // Set the type of the XF record and some of the attributes.\n        if ($this->isStyleXf) {\n            $style = 0xFFF5;\n        } else {\n            $style   = self::mapLocked($this->_style->getProtection()->getLocked());\n            $style  |= self::mapHidden($this->_style->getProtection()->getHidden()) << 1;\n        }\n\n        // Flags to indicate if attributes have been set.\n        $atr_num     = ($this->numberFormatIndex != 0)?1:0;\n        $atr_fnt     = ($this->fontIndex != 0)?1:0;\n        $atr_alc     = ((int) $this->_style->getAlignment()->getWrapText()) ? 1 : 0;\n        $atr_bdr     = (self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle())   ||\n                        self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle())      ||\n                        self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle())     ||\n                        self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()))?1:0;\n        $atr_pat     = (($this->foregroundColor != 0x40) ||\n                        ($this->backgroundColor != 0x41) ||\n                        self::mapFillType($this->_style->getFill()->getFillType()))?1:0;\n        $atr_prot    = self::mapLocked($this->_style->getProtection()->getLocked())\n                        | self::mapHidden($this->_style->getProtection()->getHidden());\n\n        // Zero the default border colour if the border has not been set.\n        if (self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) == 0) {\n            $this->bottomBorderColor = 0;\n        }\n        if (self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle())  == 0) {\n            $this->topBorderColor = 0;\n        }\n        if (self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) == 0) {\n            $this->rightBorderColor = 0;\n        }\n        if (self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) == 0) {\n            $this->leftBorderColor = 0;\n        }\n        if (self::mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) == 0) {\n            $this->_diag_color = 0;\n        }\n\n        $record = 0x00E0;              // Record identifier\n        $length = 0x0014;              // Number of bytes to follow\n\n        $ifnt = $this->fontIndex;   // Index to FONT record\n        $ifmt = $this->numberFormatIndex;  // Index to FORMAT record\n\n        $align  = $this->mapHAlign($this->_style->getAlignment()->getHorizontal());       // Alignment\n        $align |= (int) $this->_style->getAlignment()->getWrapText()     << 3;\n        $align |= self::mapVAlign($this->_style->getAlignment()->getVertical())  << 4;\n        $align |= $this->textJustLast << 7;\n\n        $used_attrib  = $atr_num  << 2;\n        $used_attrib |= $atr_fnt  << 3;\n        $used_attrib |= $atr_alc  << 4;\n        $used_attrib |= $atr_bdr  << 5;\n        $used_attrib |= $atr_pat  << 6;\n        $used_attrib |= $atr_prot << 7;\n\n        $icv  = $this->foregroundColor;      // fg and bg pattern colors\n        $icv |= $this->backgroundColor      << 7;\n\n        $border1  = self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle());          // Border line style and color\n        $border1 |= self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle())         << 4;\n        $border1 |= self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle())           << 8;\n        $border1 |= self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle())        << 12;\n        $border1 |= $this->leftBorderColor    << 16;\n        $border1 |= $this->rightBorderColor   << 23;\n\n        $diagonalDirection = $this->_style->getBorders()->getDiagonalDirection();\n        $diag_tl_to_rb = $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_BOTH\n                            || $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_DOWN;\n        $diag_tr_to_lb = $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_BOTH\n                            || $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_UP;\n        $border1 |= $diag_tl_to_rb        << 30;\n        $border1 |= $diag_tr_to_lb        << 31;\n\n        $border2  = $this->topBorderColor;    // Border color\n        $border2 |= $this->bottomBorderColor   << 7;\n        $border2 |= $this->_diag_color     << 14;\n        $border2 |= self::mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle())           << 21;\n        $border2 |= self::mapFillType($this->_style->getFill()->getFillType())        << 26;\n\n        $header = pack(\"vv\", $record, $length);\n\n        //BIFF8 options: identation, shrinkToFit and  text direction\n        $biff8_options  = $this->_style->getAlignment()->getIndent();\n        $biff8_options |= (int) $this->_style->getAlignment()->getShrinkToFit() << 4;\n\n        $data  = pack(\"vvvC\", $ifnt, $ifmt, $style, $align);\n        $data .= pack(\"CCC\", self::mapTextRotation($this->_style->getAlignment()->getTextRotation()), $biff8_options, $used_attrib);\n        $data .= pack(\"VVv\", $border1, $border2, $icv);\n\n        return($header . $data);\n    }\n\n    /**\n     * Is this a style XF ?\n     *\n     * @param boolean $value\n     */\n    public function setIsStyleXf($value)\n    {\n        $this->isStyleXf = $value;\n    }\n\n    /**\n     * Sets the cell's bottom border color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setBottomColor($colorIndex)\n    {\n        $this->bottomBorderColor = $colorIndex;\n    }\n\n    /**\n     * Sets the cell's top border color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setTopColor($colorIndex)\n    {\n        $this->topBorderColor = $colorIndex;\n    }\n\n    /**\n     * Sets the cell's left border color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setLeftColor($colorIndex)\n    {\n        $this->leftBorderColor = $colorIndex;\n    }\n\n    /**\n     * Sets the cell's right border color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setRightColor($colorIndex)\n    {\n        $this->rightBorderColor = $colorIndex;\n    }\n\n    /**\n     * Sets the cell's diagonal border color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setDiagColor($colorIndex)\n    {\n        $this->_diag_color = $colorIndex;\n    }\n\n\n    /**\n     * Sets the cell's foreground color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setFgColor($colorIndex)\n    {\n        $this->foregroundColor = $colorIndex;\n    }\n\n    /**\n     * Sets the cell's background color\n     *\n     * @access public\n     * @param int $colorIndex Color index\n     */\n    public function setBgColor($colorIndex)\n    {\n        $this->backgroundColor = $colorIndex;\n    }\n\n    /**\n     * Sets the index to the number format record\n     * It can be date, time, currency, etc...\n     *\n     * @access public\n     * @param integer $numberFormatIndex Index to format record\n     */\n    public function setNumberFormatIndex($numberFormatIndex)\n    {\n        $this->numberFormatIndex = $numberFormatIndex;\n    }\n\n    /**\n     * Set the font index.\n     *\n     * @param int $value Font index, note that value 4 does not exist\n     */\n    public function setFontIndex($value)\n    {\n        $this->fontIndex = $value;\n    }\n\n    /**\n     * Map of BIFF2-BIFF8 codes for border styles\n     * @static    array of int\n     *\n     */\n    private static $mapBorderStyles = array(\n        PHPExcel_Style_Border::BORDER_NONE             => 0x00,\n        PHPExcel_Style_Border::BORDER_THIN             => 0x01,\n        PHPExcel_Style_Border::BORDER_MEDIUM           => 0x02,\n        PHPExcel_Style_Border::BORDER_DASHED           => 0x03,\n        PHPExcel_Style_Border::BORDER_DOTTED           => 0x04,\n        PHPExcel_Style_Border::BORDER_THICK            => 0x05,\n        PHPExcel_Style_Border::BORDER_DOUBLE           => 0x06,\n        PHPExcel_Style_Border::BORDER_HAIR             => 0x07,\n        PHPExcel_Style_Border::BORDER_MEDIUMDASHED     => 0x08,\n        PHPExcel_Style_Border::BORDER_DASHDOT          => 0x09,\n        PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT    => 0x0A,\n        PHPExcel_Style_Border::BORDER_DASHDOTDOT       => 0x0B,\n        PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT => 0x0C,\n        PHPExcel_Style_Border::BORDER_SLANTDASHDOT     => 0x0D,\n    );\n\n    /**\n     * Map border style\n     *\n     * @param string $borderStyle\n     * @return int\n     */\n    private static function mapBorderStyle($borderStyle)\n    {\n        if (isset(self::$mapBorderStyles[$borderStyle])) {\n            return self::$mapBorderStyles[$borderStyle];\n        }\n        return 0x00;\n    }\n\n    /**\n     * Map of BIFF2-BIFF8 codes for fill types\n     * @static    array of int\n     *\n     */\n    private static $mapFillTypes = array(\n        PHPExcel_Style_Fill::FILL_NONE                    => 0x00,\n        PHPExcel_Style_Fill::FILL_SOLID                   => 0x01,\n        PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY      => 0x02,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY        => 0x03,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY       => 0x04,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL  => 0x05,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL    => 0x06,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN        => 0x07,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKUP          => 0x08,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID        => 0x09,\n        PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS     => 0x0A,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL => 0x0B,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL   => 0x0C,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN       => 0x0D,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP         => 0x0E,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID       => 0x0F,\n        PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS    => 0x10,\n        PHPExcel_Style_Fill::FILL_PATTERN_GRAY125         => 0x11,\n        PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625        => 0x12,\n        PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR         => 0x00,    // does not exist in BIFF8\n        PHPExcel_Style_Fill::FILL_GRADIENT_PATH           => 0x00,    // does not exist in BIFF8\n    );\n\n    /**\n     * Map fill type\n     *\n     * @param string $fillType\n     * @return int\n     */\n    private static function mapFillType($fillType)\n    {\n        if (isset(self::$mapFillTypes[$fillType])) {\n            return self::$mapFillTypes[$fillType];\n        }\n        return 0x00;\n    }\n\n    /**\n     * Map of BIFF2-BIFF8 codes for horizontal alignment\n     * @static    array of int\n     *\n     */\n    private static $mapHAlignments = array(\n        PHPExcel_Style_Alignment::HORIZONTAL_GENERAL           => 0,\n        PHPExcel_Style_Alignment::HORIZONTAL_LEFT              => 1,\n        PHPExcel_Style_Alignment::HORIZONTAL_CENTER            => 2,\n        PHPExcel_Style_Alignment::HORIZONTAL_RIGHT             => 3,\n        PHPExcel_Style_Alignment::HORIZONTAL_FILL              => 4,\n        PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY           => 5,\n        PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS => 6,\n    );\n\n    /**\n     * Map to BIFF2-BIFF8 codes for horizontal alignment\n     *\n     * @param string $hAlign\n     * @return int\n     */\n    private function mapHAlign($hAlign)\n    {\n        if (isset(self::$mapHAlignments[$hAlign])) {\n            return self::$mapHAlignments[$hAlign];\n        }\n        return 0;\n    }\n\n    /**\n     * Map of BIFF2-BIFF8 codes for vertical alignment\n     * @static    array of int\n     *\n     */\n    private static $mapVAlignments = array(\n        PHPExcel_Style_Alignment::VERTICAL_TOP     => 0,\n        PHPExcel_Style_Alignment::VERTICAL_CENTER  => 1,\n        PHPExcel_Style_Alignment::VERTICAL_BOTTOM  => 2,\n        PHPExcel_Style_Alignment::VERTICAL_JUSTIFY => 3,\n    );\n\n    /**\n     * Map to BIFF2-BIFF8 codes for vertical alignment\n     *\n     * @param string $vAlign\n     * @return int\n     */\n    private static function mapVAlign($vAlign)\n    {\n        if (isset(self::$mapVAlignments[$vAlign])) {\n            return self::$mapVAlignments[$vAlign];\n        }\n        return 2;\n    }\n\n    /**\n     * Map to BIFF8 codes for text rotation angle\n     *\n     * @param int $textRotation\n     * @return int\n     */\n    private static function mapTextRotation($textRotation)\n    {\n        if ($textRotation >= 0) {\n            return $textRotation;\n        } elseif ($textRotation == -165) {\n            return 255;\n        } elseif ($textRotation < 0) {\n            return 90 - $textRotation;\n        }\n    }\n\n    /**\n     * Map locked\n     *\n     * @param string\n     * @return int\n     */\n    private static function mapLocked($locked)\n    {\n        switch ($locked) {\n            case PHPExcel_Style_Protection::PROTECTION_INHERIT:\n                return 1;\n            case PHPExcel_Style_Protection::PROTECTION_PROTECTED:\n                return 1;\n            case PHPExcel_Style_Protection::PROTECTION_UNPROTECTED:\n                return 0;\n            default:\n                return 1;\n        }\n    }\n\n    /**\n     * Map hidden\n     *\n     * @param string\n     * @return int\n     */\n    private static function mapHidden($hidden)\n    {\n        switch ($hidden) {\n            case PHPExcel_Style_Protection::PROTECTION_INHERIT:\n                return 0;\n            case PHPExcel_Style_Protection::PROTECTION_PROTECTED:\n                return 1;\n            case PHPExcel_Style_Protection::PROTECTION_UNPROTECTED:\n                return 0;\n            default:\n                return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Excel5.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Excel5\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_Excel5\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Excel5 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter\n{\n    /**\n     * PHPExcel object\n     *\n     * @var PHPExcel\n     */\n    private $phpExcel;\n\n    /**\n     * Total number of shared strings in workbook\n     *\n     * @var int\n     */\n    private $strTotal = 0;\n\n    /**\n     * Number of unique shared strings in workbook\n     *\n     * @var int\n     */\n    private $strUnique = 0;\n\n    /**\n     * Array of unique shared strings in workbook\n     *\n     * @var array\n     */\n    private $strTable = array();\n\n    /**\n     * Color cache. Mapping between RGB value and color index.\n     *\n     * @var array\n     */\n    private $colors;\n\n    /**\n     * Formula parser\n     *\n     * @var PHPExcel_Writer_Excel5_Parser\n     */\n    private $parser;\n\n    /**\n     * Identifier clusters for drawings. Used in MSODRAWINGGROUP record.\n     *\n     * @var array\n     */\n    private $IDCLs;\n\n    /**\n     * Basic OLE object summary information\n     *\n     * @var array\n     */\n    private $summaryInformation;\n\n    /**\n     * Extended OLE object document summary information\n     *\n     * @var array\n     */\n    private $documentSummaryInformation;\n\n    /**\n     * Create a new PHPExcel_Writer_Excel5\n     *\n     * @param    PHPExcel    $phpExcel    PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        $this->phpExcel    = $phpExcel;\n\n        $this->parser        = new PHPExcel_Writer_Excel5_Parser();\n    }\n\n    /**\n     * Save PHPExcel to file\n     *\n     * @param    string        $pFilename\n     * @throws    PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n\n        // garbage collect\n        $this->phpExcel->garbageCollect();\n\n        $saveDebugLog = PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->getWriteDebugLog();\n        PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog(false);\n        $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();\n        PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);\n\n        // initialize colors array\n        $this->colors = array();\n\n        // Initialise workbook writer\n        $this->writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->phpExcel, $this->strTotal, $this->strUnique, $this->strTable, $this->colors, $this->parser);\n\n        // Initialise worksheet writers\n        $countSheets = $this->phpExcel->getSheetCount();\n        for ($i = 0; $i < $countSheets; ++$i) {\n            $this->writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->strTotal, $this->strUnique, $this->strTable, $this->colors, $this->parser, $this->preCalculateFormulas, $this->phpExcel->getSheet($i));\n        }\n\n        // build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook.\n        $this->buildWorksheetEschers();\n        $this->buildWorkbookEscher();\n\n        // add 15 identical cell style Xfs\n        // for now, we use the first cellXf instead of cellStyleXf\n        $cellXfCollection = $this->phpExcel->getCellXfCollection();\n        for ($i = 0; $i < 15; ++$i) {\n            $this->writerWorkbook->addXfWriter($cellXfCollection[0], true);\n        }\n\n        // add all the cell Xfs\n        foreach ($this->phpExcel->getCellXfCollection() as $style) {\n            $this->writerWorkbook->addXfWriter($style, false);\n        }\n\n        // add fonts from rich text eleemnts\n        for ($i = 0; $i < $countSheets; ++$i) {\n            foreach ($this->writerWorksheets[$i]->phpSheet->getCellCollection() as $cellID) {\n                $cell = $this->writerWorksheets[$i]->phpSheet->getCell($cellID);\n                $cVal = $cell->getValue();\n                if ($cVal instanceof PHPExcel_RichText) {\n                    $elements = $cVal->getRichTextElements();\n                    foreach ($elements as $element) {\n                        if ($element instanceof PHPExcel_RichText_Run) {\n                            $font = $element->getFont();\n                            $this->writerWorksheets[$i]->fontHashIndex[$font->getHashCode()] = $this->writerWorkbook->addFont($font);\n                        }\n                    }\n                }\n            }\n        }\n\n        // initialize OLE file\n        $workbookStreamName = 'Workbook';\n        $OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName));\n\n        // Write the worksheet streams before the global workbook stream,\n        // because the byte sizes of these are needed in the global workbook stream\n        $worksheetSizes = array();\n        for ($i = 0; $i < $countSheets; ++$i) {\n            $this->writerWorksheets[$i]->close();\n            $worksheetSizes[] = $this->writerWorksheets[$i]->_datasize;\n        }\n\n        // add binary data for global workbook stream\n        $OLE->append($this->writerWorkbook->writeWorkbook($worksheetSizes));\n\n        // add binary data for sheet streams\n        for ($i = 0; $i < $countSheets; ++$i) {\n            $OLE->append($this->writerWorksheets[$i]->getData());\n        }\n\n        $this->documentSummaryInformation = $this->writeDocumentSummaryInformation();\n        // initialize OLE Document Summary Information\n        if (isset($this->documentSummaryInformation) && !empty($this->documentSummaryInformation)) {\n            $OLE_DocumentSummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'DocumentSummaryInformation'));\n            $OLE_DocumentSummaryInformation->append($this->documentSummaryInformation);\n        }\n\n        $this->summaryInformation = $this->writeSummaryInformation();\n        // initialize OLE Summary Information\n        if (isset($this->summaryInformation) && !empty($this->summaryInformation)) {\n            $OLE_SummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'SummaryInformation'));\n            $OLE_SummaryInformation->append($this->summaryInformation);\n        }\n\n        // define OLE Parts\n        $arrRootData = array($OLE);\n        // initialize OLE Properties file\n        if (isset($OLE_SummaryInformation)) {\n            $arrRootData[] = $OLE_SummaryInformation;\n        }\n        // initialize OLE Extended Properties file\n        if (isset($OLE_DocumentSummaryInformation)) {\n            $arrRootData[] = $OLE_DocumentSummaryInformation;\n        }\n\n        $root = new PHPExcel_Shared_OLE_PPS_Root(time(), time(), $arrRootData);\n        // save the OLE file\n        $res = $root->save($pFilename);\n\n        PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);\n        PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);\n    }\n\n    /**\n     * Set temporary storage directory\n     *\n     * @deprecated\n     * @param    string    $pValue        Temporary storage directory\n     * @throws    PHPExcel_Writer_Exception    when directory does not exist\n     * @return PHPExcel_Writer_Excel5\n     */\n    public function setTempDir($pValue = '')\n    {\n        return $this;\n    }\n\n    /**\n     * Build the Worksheet Escher objects\n     *\n     */\n    private function buildWorksheetEschers()\n    {\n        // 1-based index to BstoreContainer\n        $blipIndex = 0;\n        $lastReducedSpId = 0;\n        $lastSpId = 0;\n\n        foreach ($this->phpExcel->getAllsheets() as $sheet) {\n            // sheet index\n            $sheetIndex = $sheet->getParent()->getIndex($sheet);\n\n            $escher = null;\n\n            // check if there are any shapes for this sheet\n            $filterRange = $sheet->getAutoFilter()->getRange();\n            if (count($sheet->getDrawingCollection()) == 0 && empty($filterRange)) {\n                continue;\n            }\n\n            // create intermediate Escher object\n            $escher = new PHPExcel_Shared_Escher();\n\n            // dgContainer\n            $dgContainer = new PHPExcel_Shared_Escher_DgContainer();\n\n            // set the drawing index (we use sheet index + 1)\n            $dgId = $sheet->getParent()->getIndex($sheet) + 1;\n            $dgContainer->setDgId($dgId);\n            $escher->setDgContainer($dgContainer);\n\n            // spgrContainer\n            $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();\n            $dgContainer->setSpgrContainer($spgrContainer);\n\n            // add one shape which is the group shape\n            $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();\n            $spContainer->setSpgr(true);\n            $spContainer->setSpType(0);\n            $spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10);\n            $spgrContainer->addChild($spContainer);\n\n            // add the shapes\n\n            $countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet\n\n            foreach ($sheet->getDrawingCollection() as $drawing) {\n                ++$blipIndex;\n\n                ++$countShapes[$sheetIndex];\n\n                // add the shape\n                $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();\n\n                // set the shape type\n                $spContainer->setSpType(0x004B);\n                // set the shape flag\n                $spContainer->setSpFlag(0x02);\n\n                // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)\n                $reducedSpId = $countShapes[$sheetIndex];\n                $spId = $reducedSpId\n                    | ($sheet->getParent()->getIndex($sheet) + 1) << 10;\n                $spContainer->setSpId($spId);\n\n                // keep track of last reducedSpId\n                $lastReducedSpId = $reducedSpId;\n\n                // keep track of last spId\n                $lastSpId = $spId;\n\n                // set the BLIP index\n                $spContainer->setOPT(0x4104, $blipIndex);\n\n                // set coordinates and offsets, client anchor\n                $coordinates = $drawing->getCoordinates();\n                $offsetX = $drawing->getOffsetX();\n                $offsetY = $drawing->getOffsetY();\n                $width = $drawing->getWidth();\n                $height = $drawing->getHeight();\n\n                $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height);\n\n                $spContainer->setStartCoordinates($twoAnchor['startCoordinates']);\n                $spContainer->setStartOffsetX($twoAnchor['startOffsetX']);\n                $spContainer->setStartOffsetY($twoAnchor['startOffsetY']);\n                $spContainer->setEndCoordinates($twoAnchor['endCoordinates']);\n                $spContainer->setEndOffsetX($twoAnchor['endOffsetX']);\n                $spContainer->setEndOffsetY($twoAnchor['endOffsetY']);\n\n                $spgrContainer->addChild($spContainer);\n            }\n\n            // AutoFilters\n            if (!empty($filterRange)) {\n                $rangeBounds = PHPExcel_Cell::rangeBoundaries($filterRange);\n                $iNumColStart = $rangeBounds[0][0];\n                $iNumColEnd = $rangeBounds[1][0];\n\n                $iInc = $iNumColStart;\n                while ($iInc <= $iNumColEnd) {\n                    ++$countShapes[$sheetIndex];\n\n                    // create an Drawing Object for the dropdown\n                    $oDrawing  = new PHPExcel_Worksheet_BaseDrawing();\n                    // get the coordinates of drawing\n                    $cDrawing   = PHPExcel_Cell::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1];\n                    $oDrawing->setCoordinates($cDrawing);\n                    $oDrawing->setWorksheet($sheet);\n\n                    // add the shape\n                    $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();\n                    // set the shape type\n                    $spContainer->setSpType(0x00C9);\n                    // set the shape flag\n                    $spContainer->setSpFlag(0x01);\n\n                    // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)\n                    $reducedSpId = $countShapes[$sheetIndex];\n                    $spId = $reducedSpId\n                        | ($sheet->getParent()->getIndex($sheet) + 1) << 10;\n                    $spContainer->setSpId($spId);\n\n                    // keep track of last reducedSpId\n                    $lastReducedSpId = $reducedSpId;\n\n                    // keep track of last spId\n                    $lastSpId = $spId;\n\n                    $spContainer->setOPT(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping\n                    $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape\n                    $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest\n                    $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash\n                    $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint\n\n                    // set coordinates and offsets, client anchor\n                    $endCoordinates = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::stringFromColumnIndex($iInc - 1));\n                    $endCoordinates .= $rangeBounds[0][1] + 1;\n\n                    $spContainer->setStartCoordinates($cDrawing);\n                    $spContainer->setStartOffsetX(0);\n                    $spContainer->setStartOffsetY(0);\n                    $spContainer->setEndCoordinates($endCoordinates);\n                    $spContainer->setEndOffsetX(0);\n                    $spContainer->setEndOffsetY(0);\n\n                    $spgrContainer->addChild($spContainer);\n                    $iInc++;\n                }\n            }\n\n            // identifier clusters, used for workbook Escher object\n            $this->IDCLs[$dgId] = $lastReducedSpId;\n\n            // set last shape index\n            $dgContainer->setLastSpId($lastSpId);\n\n            // set the Escher object\n            $this->writerWorksheets[$sheetIndex]->setEscher($escher);\n        }\n    }\n\n    /**\n     * Build the Escher object corresponding to the MSODRAWINGGROUP record\n     */\n    private function buildWorkbookEscher()\n    {\n        $escher = null;\n\n        // any drawings in this workbook?\n        $found = false;\n        foreach ($this->phpExcel->getAllSheets() as $sheet) {\n            if (count($sheet->getDrawingCollection()) > 0) {\n                $found = true;\n                break;\n            }\n        }\n\n        // nothing to do if there are no drawings\n        if (!$found) {\n            return;\n        }\n\n        // if we reach here, then there are drawings in the workbook\n        $escher = new PHPExcel_Shared_Escher();\n\n        // dggContainer\n        $dggContainer = new PHPExcel_Shared_Escher_DggContainer();\n        $escher->setDggContainer($dggContainer);\n\n        // set IDCLs (identifier clusters)\n        $dggContainer->setIDCLs($this->IDCLs);\n\n        // this loop is for determining maximum shape identifier of all drawing\n        $spIdMax = 0;\n        $totalCountShapes = 0;\n        $countDrawings = 0;\n\n        foreach ($this->phpExcel->getAllsheets() as $sheet) {\n            $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet\n\n            if (count($sheet->getDrawingCollection()) > 0) {\n                ++$countDrawings;\n\n                foreach ($sheet->getDrawingCollection() as $drawing) {\n                    ++$sheetCountShapes;\n                    ++$totalCountShapes;\n\n                    $spId = $sheetCountShapes | ($this->phpExcel->getIndex($sheet) + 1) << 10;\n                    $spIdMax = max($spId, $spIdMax);\n                }\n            }\n        }\n\n        $dggContainer->setSpIdMax($spIdMax + 1);\n        $dggContainer->setCDgSaved($countDrawings);\n        $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing\n\n        // bstoreContainer\n        $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();\n        $dggContainer->setBstoreContainer($bstoreContainer);\n\n        // the BSE's (all the images)\n        foreach ($this->phpExcel->getAllsheets() as $sheet) {\n            foreach ($sheet->getDrawingCollection() as $drawing) {\n                if ($drawing instanceof PHPExcel_Worksheet_Drawing) {\n                    $filename = $drawing->getPath();\n\n                    list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);\n\n                    switch ($imageFormat) {\n                        case 1: // GIF, not supported by BIFF8, we convert to PNG\n                            $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;\n                            ob_start();\n                            imagepng(imagecreatefromgif($filename));\n                            $blipData = ob_get_contents();\n                            ob_end_clean();\n                            break;\n                        case 2: // JPEG\n                            $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;\n                            $blipData = file_get_contents($filename);\n                            break;\n                        case 3: // PNG\n                            $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;\n                            $blipData = file_get_contents($filename);\n                            break;\n                        case 6: // Windows DIB (BMP), we convert to PNG\n                            $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;\n                            ob_start();\n                            imagepng(PHPExcel_Shared_Drawing::imagecreatefrombmp($filename));\n                            $blipData = ob_get_contents();\n                            ob_end_clean();\n                            break;\n                        default:\n                            continue 2;\n                    }\n\n                    $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();\n                    $blip->setData($blipData);\n\n                    $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();\n                    $BSE->setBlipType($blipType);\n                    $BSE->setBlip($blip);\n\n                    $bstoreContainer->addBSE($BSE);\n                } elseif ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {\n                    switch ($drawing->getRenderingFunction()) {\n                        case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:\n                            $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;\n                            $renderingFunction = 'imagejpeg';\n                            break;\n                        case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:\n                        case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:\n                        case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:\n                            $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;\n                            $renderingFunction = 'imagepng';\n                            break;\n                    }\n\n                    ob_start();\n                    call_user_func($renderingFunction, $drawing->getImageResource());\n                    $blipData = ob_get_contents();\n                    ob_end_clean();\n\n                    $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();\n                    $blip->setData($blipData);\n\n                    $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();\n                    $BSE->setBlipType($blipType);\n                    $BSE->setBlip($blip);\n\n                    $bstoreContainer->addBSE($BSE);\n                }\n            }\n        }\n\n        // Set the Escher object\n        $this->writerWorkbook->setEscher($escher);\n    }\n\n    /**\n     * Build the OLE Part for DocumentSummary Information\n     * @return string\n     */\n    private function writeDocumentSummaryInformation()\n    {\n        // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark)\n        $data = pack('v', 0xFFFE);\n        // offset: 2; size: 2;\n        $data .= pack('v', 0x0000);\n        // offset: 4; size: 2; OS version\n        $data .= pack('v', 0x0106);\n        // offset: 6; size: 2; OS indicator\n        $data .= pack('v', 0x0002);\n        // offset: 8; size: 16\n        $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00);\n        // offset: 24; size: 4; section count\n        $data .= pack('V', 0x0001);\n\n        // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae\n        $data .= pack('vvvvvvvv', 0xD502, 0xD5CD, 0x2E9C, 0x101B, 0x9793, 0x0008, 0x2C2B, 0xAEF9);\n        // offset: 44; size: 4; offset of the start\n        $data .= pack('V', 0x30);\n\n        // SECTION\n        $dataSection = array();\n        $dataSection_NumProps = 0;\n        $dataSection_Summary = '';\n        $dataSection_Content = '';\n\n        // GKPIDDSI_CODEPAGE: CodePage\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer\n                               'data'    => array('data' => 1252));\n        $dataSection_NumProps++;\n\n        // GKPIDDSI_CATEGORY : Category\n        if ($this->phpExcel->getProperties()->getCategory()) {\n            $dataProp = $this->phpExcel->getProperties()->getCategory();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E),\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        // GKPIDDSI_VERSION :Version of the application that wrote the property storage\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x17),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x03),\n                               'data'    => array('pack' => 'V', 'data' => 0x000C0000));\n        $dataSection_NumProps++;\n        // GKPIDDSI_SCALE : FALSE\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0B),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x0B),\n                               'data'    => array('data' => false));\n        $dataSection_NumProps++;\n        // GKPIDDSI_LINKSDIRTY : True if any of the values for the linked properties have changed outside of the application\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x10),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x0B),\n                               'data'    => array('data' => false));\n        $dataSection_NumProps++;\n        // GKPIDDSI_SHAREDOC : FALSE\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x0B),\n                               'data'    => array('data' => false));\n        $dataSection_NumProps++;\n        // GKPIDDSI_HYPERLINKSCHANGED : True if any of the values for the _PID_LINKS (hyperlink text) have changed outside of the application\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x16),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x0B),\n                               'data'    => array('data' => false));\n        $dataSection_NumProps++;\n\n        // GKPIDDSI_DOCSPARTS\n        // MS-OSHARED p75 (2.3.3.2.2.1)\n        // Structure is VtVecUnalignedLpstrValue (2.3.3.1.9)\n        // cElements\n        $dataProp = pack('v', 0x0001);\n        $dataProp .= pack('v', 0x0000);\n        // array of UnalignedLpstr\n          // cch\n          $dataProp .= pack('v', 0x000A);\n          $dataProp .= pack('v', 0x0000);\n          // value\n          $dataProp .= 'Worksheet'.chr(0);\n\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x101E),\n                               'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n        $dataSection_NumProps++;\n\n        // GKPIDDSI_HEADINGPAIR\n        // VtVecHeadingPairValue\n          // cElements\n          $dataProp = pack('v', 0x0002);\n          $dataProp .= pack('v', 0x0000);\n          // Array of vtHeadingPair\n            // vtUnalignedString - headingString\n              // stringType\n              $dataProp .= pack('v', 0x001E);\n              // padding\n              $dataProp .= pack('v', 0x0000);\n              // UnalignedLpstr\n                // cch\n                $dataProp .= pack('v', 0x0013);\n                $dataProp .= pack('v', 0x0000);\n                // value\n                $dataProp .= 'Feuilles de calcul';\n            // vtUnalignedString - headingParts\n              // wType : 0x0003 = 32 bit signed integer\n              $dataProp .= pack('v', 0x0300);\n              // padding\n              $dataProp .= pack('v', 0x0000);\n              // value\n              $dataProp .= pack('v', 0x0100);\n              $dataProp .= pack('v', 0x0000);\n              $dataProp .= pack('v', 0x0000);\n              $dataProp .= pack('v', 0x0000);\n\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x100C),\n                               'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n        $dataSection_NumProps++;\n\n        //         4     Section Length\n        //        4     Property count\n        //        8 * $dataSection_NumProps (8 =  ID (4) + OffSet(4))\n        $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8;\n        foreach ($dataSection as $dataProp) {\n            // Summary\n            $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']);\n            // Offset\n            $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset);\n            // DataType\n            $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']);\n            // Data\n            if ($dataProp['type']['data'] == 0x02) { // 2 byte signed integer\n                $dataSection_Content .= pack('V', $dataProp['data']['data']);\n\n                $dataSection_Content_Offset += 4 + 4;\n            } elseif ($dataProp['type']['data'] == 0x03) { // 4 byte signed integer\n                $dataSection_Content .= pack('V', $dataProp['data']['data']);\n\n                $dataSection_Content_Offset += 4 + 4;\n            } elseif ($dataProp['type']['data'] == 0x0B) { // Boolean\n                if ($dataProp['data']['data'] == false) {\n                    $dataSection_Content .= pack('V', 0x0000);\n                } else {\n                    $dataSection_Content .= pack('V', 0x0001);\n                }\n                $dataSection_Content_Offset += 4 + 4;\n            } elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length\n                // Null-terminated string\n                $dataProp['data']['data'] .= chr(0);\n                $dataProp['data']['length'] += 1;\n                // Complete the string with null string for being a %4\n                $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4));\n                $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT);\n\n                $dataSection_Content .= pack('V', $dataProp['data']['length']);\n                $dataSection_Content .= $dataProp['data']['data'];\n\n                $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']);\n            } elseif ($dataProp['type']['data'] == 0x40) { // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)\n                $dataSection_Content .= $dataProp['data']['data'];\n\n                $dataSection_Content_Offset += 4 + 8;\n            } else {\n                // Data Type Not Used at the moment\n                $dataSection_Content .= $dataProp['data']['data'];\n\n                $dataSection_Content_Offset += 4 + $dataProp['data']['length'];\n            }\n        }\n        // Now $dataSection_Content_Offset contains the size of the content\n\n        // section header\n        // offset: $secOffset; size: 4; section length\n        //         + x  Size of the content (summary + content)\n        $data .= pack('V', $dataSection_Content_Offset);\n        // offset: $secOffset+4; size: 4; property count\n        $data .= pack('V', $dataSection_NumProps);\n        // Section Summary\n        $data .= $dataSection_Summary;\n        // Section Content\n        $data .= $dataSection_Content;\n\n        return $data;\n    }\n\n    /**\n     * Build the OLE Part for Summary Information\n     * @return string\n     */\n    private function writeSummaryInformation()\n    {\n        // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark)\n        $data = pack('v', 0xFFFE);\n        // offset: 2; size: 2;\n        $data .= pack('v', 0x0000);\n        // offset: 4; size: 2; OS version\n        $data .= pack('v', 0x0106);\n        // offset: 6; size: 2; OS indicator\n        $data .= pack('v', 0x0002);\n        // offset: 8; size: 16\n        $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00);\n        // offset: 24; size: 4; section count\n        $data .= pack('V', 0x0001);\n\n        // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9\n        $data .= pack('vvvvvvvv', 0x85E0, 0xF29F, 0x4FF9, 0x1068, 0x91AB, 0x0008, 0x272B, 0xD9B3);\n        // offset: 44; size: 4; offset of the start\n        $data .= pack('V', 0x30);\n\n        // SECTION\n        $dataSection = array();\n        $dataSection_NumProps = 0;\n        $dataSection_Summary = '';\n        $dataSection_Content = '';\n\n        // CodePage : CP-1252\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer\n                               'data'    => array('data' => 1252));\n        $dataSection_NumProps++;\n\n        //    Title\n        if ($this->phpExcel->getProperties()->getTitle()) {\n            $dataProp = $this->phpExcel->getProperties()->getTitle();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Subject\n        if ($this->phpExcel->getProperties()->getSubject()) {\n            $dataProp = $this->phpExcel->getProperties()->getSubject();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x03),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Author (Creator)\n        if ($this->phpExcel->getProperties()->getCreator()) {\n            $dataProp = $this->phpExcel->getProperties()->getCreator();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x04),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Keywords\n        if ($this->phpExcel->getProperties()->getKeywords()) {\n            $dataProp = $this->phpExcel->getProperties()->getKeywords();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x05),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Comments (Description)\n        if ($this->phpExcel->getProperties()->getDescription()) {\n            $dataProp = $this->phpExcel->getProperties()->getDescription();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x06),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Last Saved By (LastModifiedBy)\n        if ($this->phpExcel->getProperties()->getLastModifiedBy()) {\n            $dataProp = $this->phpExcel->getProperties()->getLastModifiedBy();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x08),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length\n                                   'data'    => array('data' => $dataProp, 'length' => strlen($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Created Date/Time\n        if ($this->phpExcel->getProperties()->getCreated()) {\n            $dataProp = $this->phpExcel->getProperties()->getCreated();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)\n                                   'data'    => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Modified Date/Time\n        if ($this->phpExcel->getProperties()->getModified()) {\n            $dataProp = $this->phpExcel->getProperties()->getModified();\n            $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D),\n                                   'offset' => array('pack' => 'V'),\n                                   'type'     => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)\n                                   'data'    => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp)));\n            $dataSection_NumProps++;\n        }\n        //    Security\n        $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13),\n                               'offset' => array('pack' => 'V'),\n                               'type'     => array('pack' => 'V', 'data' => 0x03), // 4 byte signed integer\n                               'data'    => array('data' => 0x00));\n        $dataSection_NumProps++;\n\n\n        //         4     Section Length\n        //        4     Property count\n        //        8 * $dataSection_NumProps (8 =  ID (4) + OffSet(4))\n        $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8;\n        foreach ($dataSection as $dataProp) {\n            // Summary\n            $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']);\n            // Offset\n            $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset);\n            // DataType\n            $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']);\n            // Data\n            if ($dataProp['type']['data'] == 0x02) { // 2 byte signed integer\n                $dataSection_Content .= pack('V', $dataProp['data']['data']);\n\n                $dataSection_Content_Offset += 4 + 4;\n            } elseif ($dataProp['type']['data'] == 0x03) { // 4 byte signed integer\n                $dataSection_Content .= pack('V', $dataProp['data']['data']);\n\n                $dataSection_Content_Offset += 4 + 4;\n            } elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length\n                // Null-terminated string\n                $dataProp['data']['data'] .= chr(0);\n                $dataProp['data']['length'] += 1;\n                // Complete the string with null string for being a %4\n                $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4));\n                $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT);\n\n                $dataSection_Content .= pack('V', $dataProp['data']['length']);\n                $dataSection_Content .= $dataProp['data']['data'];\n\n                $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']);\n            } elseif ($dataProp['type']['data'] == 0x40) { // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)\n                $dataSection_Content .= $dataProp['data']['data'];\n\n                $dataSection_Content_Offset += 4 + 8;\n            } else {\n                // Data Type Not Used at the moment\n            }\n        }\n        // Now $dataSection_Content_Offset contains the size of the content\n\n        // section header\n        // offset: $secOffset; size: 4; section length\n        //         + x  Size of the content (summary + content)\n        $data .= pack('V', $dataSection_Content_Offset);\n        // offset: $secOffset+4; size: 4; property count\n        $data .= pack('V', $dataSection_NumProps);\n        // Section Summary\n        $data .= $dataSection_Summary;\n        // Section Content\n        $data .= $dataSection_Content;\n\n        return $data;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/Exception.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_Exception\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_Exception extends PHPExcel_Exception\n{\n    /**\n     * Error handler callback\n     *\n     * @param mixed $code\n     * @param mixed $string\n     * @param mixed $file\n     * @param mixed $line\n     * @param mixed $context\n     */\n    public static function errorHandlerCallback($code, $string, $file, $line, $context)\n    {\n        $e = new self($string, $code);\n        $e->line = $line;\n        $e->file = $file;\n        throw $e;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/HTML.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_HTML\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_HTML\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter\n{\n    /**\n     * PHPExcel object\n     *\n     * @var PHPExcel\n     */\n    protected $phpExcel;\n\n    /**\n     * Sheet index to write\n     *\n     * @var int\n     */\n    private $sheetIndex = 0;\n\n    /**\n     * Images root\n     *\n     * @var string\n     */\n    private $imagesRoot = '.';\n\n    /**\n     * embed images, or link to images\n     *\n     * @var boolean\n     */\n    private $embedImages = false;\n\n    /**\n     * Use inline CSS?\n     *\n     * @var boolean\n     */\n    private $useInlineCss = false;\n\n    /**\n     * Array of CSS styles\n     *\n     * @var array\n     */\n    private $cssStyles;\n\n    /**\n     * Array of column widths in points\n     *\n     * @var array\n     */\n    private $columnWidths;\n\n    /**\n     * Default font\n     *\n     * @var PHPExcel_Style_Font\n     */\n    private $defaultFont;\n\n    /**\n     * Flag whether spans have been calculated\n     *\n     * @var boolean\n     */\n    private $spansAreCalculated = false;\n\n    /**\n     * Excel cells that should not be written as HTML cells\n     *\n     * @var array\n     */\n    private $isSpannedCell = array();\n\n    /**\n     * Excel cells that are upper-left corner in a cell merge\n     *\n     * @var array\n     */\n    private $isBaseCell = array();\n\n    /**\n     * Excel rows that should not be written as HTML rows\n     *\n     * @var array\n     */\n    private $isSpannedRow = array();\n\n    /**\n     * Is the current writer creating PDF?\n     *\n     * @var boolean\n     */\n    protected $isPdf = false;\n\n    /**\n     * Generate the Navigation block\n     *\n     * @var boolean\n     */\n    private $generateSheetNavigationBlock = true;\n\n    /**\n     * Create a new PHPExcel_Writer_HTML\n     *\n     * @param    PHPExcel    $phpExcel    PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        $this->phpExcel = $phpExcel;\n        $this->defaultFont = $this->phpExcel->getDefaultStyle()->getFont();\n    }\n\n    /**\n     * Save PHPExcel to file\n     *\n     * @param    string        $pFilename\n     * @throws    PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        // garbage collect\n        $this->phpExcel->garbageCollect();\n\n        $saveDebugLog = PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->getWriteDebugLog();\n        PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog(false);\n        $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();\n        PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);\n\n        // Build CSS\n        $this->buildCSS(!$this->useInlineCss);\n\n        // Open file\n        $fileHandle = fopen($pFilename, 'wb+');\n        if ($fileHandle === false) {\n            throw new PHPExcel_Writer_Exception(\"Could not open file $pFilename for writing.\");\n        }\n\n        // Write headers\n        fwrite($fileHandle, $this->generateHTMLHeader(!$this->useInlineCss));\n\n        // Write navigation (tabs)\n        if ((!$this->isPdf) && ($this->generateSheetNavigationBlock)) {\n            fwrite($fileHandle, $this->generateNavigation());\n        }\n\n        // Write data\n        fwrite($fileHandle, $this->generateSheetData());\n\n        // Write footer\n        fwrite($fileHandle, $this->generateHTMLFooter());\n\n        // Close file\n        fclose($fileHandle);\n\n        PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);\n        PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);\n    }\n\n    /**\n     * Map VAlign\n     *\n     * @param    string        $vAlign        Vertical alignment\n     * @return string\n     */\n    private function mapVAlign($vAlign)\n    {\n        switch ($vAlign) {\n            case PHPExcel_Style_Alignment::VERTICAL_BOTTOM:\n                return 'bottom';\n            case PHPExcel_Style_Alignment::VERTICAL_TOP:\n                return 'top';\n            case PHPExcel_Style_Alignment::VERTICAL_CENTER:\n            case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY:\n                return 'middle';\n            default:\n                return 'baseline';\n        }\n    }\n\n    /**\n     * Map HAlign\n     *\n     * @param    string        $hAlign        Horizontal alignment\n     * @return string|false\n     */\n    private function mapHAlign($hAlign)\n    {\n        switch ($hAlign) {\n            case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL:\n                return false;\n            case PHPExcel_Style_Alignment::HORIZONTAL_LEFT:\n                return 'left';\n            case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT:\n                return 'right';\n            case PHPExcel_Style_Alignment::HORIZONTAL_CENTER:\n            case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS:\n                return 'center';\n            case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY:\n                return 'justify';\n            default:\n                return false;\n        }\n    }\n\n    /**\n     * Map border style\n     *\n     * @param    int        $borderStyle        Sheet index\n     * @return    string\n     */\n    private function mapBorderStyle($borderStyle)\n    {\n        switch ($borderStyle) {\n            case PHPExcel_Style_Border::BORDER_NONE:\n                return 'none';\n            case PHPExcel_Style_Border::BORDER_DASHDOT:\n                return '1px dashed';\n            case PHPExcel_Style_Border::BORDER_DASHDOTDOT:\n                return '1px dotted';\n            case PHPExcel_Style_Border::BORDER_DASHED:\n                return '1px dashed';\n            case PHPExcel_Style_Border::BORDER_DOTTED:\n                return '1px dotted';\n            case PHPExcel_Style_Border::BORDER_DOUBLE:\n                return '3px double';\n            case PHPExcel_Style_Border::BORDER_HAIR:\n                return '1px solid';\n            case PHPExcel_Style_Border::BORDER_MEDIUM:\n                return '2px solid';\n            case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT:\n                return '2px dashed';\n            case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT:\n                return '2px dotted';\n            case PHPExcel_Style_Border::BORDER_MEDIUMDASHED:\n                return '2px dashed';\n            case PHPExcel_Style_Border::BORDER_SLANTDASHDOT:\n                return '2px dashed';\n            case PHPExcel_Style_Border::BORDER_THICK:\n                return '3px solid';\n            case PHPExcel_Style_Border::BORDER_THIN:\n                return '1px solid';\n            default:\n                // map others to thin\n                return '1px solid';\n        }\n    }\n\n    /**\n     * Get sheet index\n     *\n     * @return int\n     */\n    public function getSheetIndex()\n    {\n        return $this->sheetIndex;\n    }\n\n    /**\n     * Set sheet index\n     *\n     * @param    int        $pValue        Sheet index\n     * @return PHPExcel_Writer_HTML\n     */\n    public function setSheetIndex($pValue = 0)\n    {\n        $this->sheetIndex = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get sheet index\n     *\n     * @return boolean\n     */\n    public function getGenerateSheetNavigationBlock()\n    {\n        return $this->generateSheetNavigationBlock;\n    }\n\n    /**\n     * Set sheet index\n     *\n     * @param    boolean        $pValue        Flag indicating whether the sheet navigation block should be generated or not\n     * @return PHPExcel_Writer_HTML\n     */\n    public function setGenerateSheetNavigationBlock($pValue = true)\n    {\n        $this->generateSheetNavigationBlock = (bool) $pValue;\n        return $this;\n    }\n\n    /**\n     * Write all sheets (resets sheetIndex to NULL)\n     */\n    public function writeAllSheets()\n    {\n        $this->sheetIndex = null;\n        return $this;\n    }\n\n    /**\n     * Generate HTML header\n     *\n     * @param    boolean        $pIncludeStyles        Include styles?\n     * @return    string\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function generateHTMLHeader($pIncludeStyles = false)\n    {\n        // PHPExcel object known?\n        if (is_null($this->phpExcel)) {\n            throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');\n        }\n\n        // Construct HTML\n        $properties = $this->phpExcel->getProperties();\n        $html = '<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">' . PHP_EOL;\n        $html .= '<!-- Generated by PHPExcel - http://www.phpexcel.net -->' . PHP_EOL;\n        $html .= '<html>' . PHP_EOL;\n        $html .= '  <head>' . PHP_EOL;\n        $html .= '      <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">' . PHP_EOL;\n        if ($properties->getTitle() > '') {\n            $html .= '      <title>' . htmlspecialchars($properties->getTitle()) . '</title>' . PHP_EOL;\n        }\n        if ($properties->getCreator() > '') {\n            $html .= '      <meta name=\"author\" content=\"' . htmlspecialchars($properties->getCreator()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getTitle() > '') {\n            $html .= '      <meta name=\"title\" content=\"' . htmlspecialchars($properties->getTitle()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getDescription() > '') {\n            $html .= '      <meta name=\"description\" content=\"' . htmlspecialchars($properties->getDescription()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getSubject() > '') {\n            $html .= '      <meta name=\"subject\" content=\"' . htmlspecialchars($properties->getSubject()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getKeywords() > '') {\n            $html .= '      <meta name=\"keywords\" content=\"' . htmlspecialchars($properties->getKeywords()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getCategory() > '') {\n            $html .= '      <meta name=\"category\" content=\"' . htmlspecialchars($properties->getCategory()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getCompany() > '') {\n            $html .= '      <meta name=\"company\" content=\"' . htmlspecialchars($properties->getCompany()) . '\" />' . PHP_EOL;\n        }\n        if ($properties->getManager() > '') {\n            $html .= '      <meta name=\"manager\" content=\"' . htmlspecialchars($properties->getManager()) . '\" />' . PHP_EOL;\n        }\n\n        if ($pIncludeStyles) {\n            $html .= $this->generateStyles(true);\n        }\n\n        $html .= '  </head>' . PHP_EOL;\n        $html .= '' . PHP_EOL;\n        $html .= '  <body>' . PHP_EOL;\n\n        return $html;\n    }\n\n    /**\n     * Generate sheet data\n     *\n     * @return    string\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function generateSheetData()\n    {\n        // PHPExcel object known?\n        if (is_null($this->phpExcel)) {\n            throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');\n        }\n\n        // Ensure that Spans have been calculated?\n        if ($this->sheetIndex !== null || !$this->spansAreCalculated) {\n            $this->calculateSpans();\n        }\n\n        // Fetch sheets\n        $sheets = array();\n        if (is_null($this->sheetIndex)) {\n            $sheets = $this->phpExcel->getAllSheets();\n        } else {\n            $sheets[] = $this->phpExcel->getSheet($this->sheetIndex);\n        }\n\n        // Construct HTML\n        $html = '';\n\n        // Loop all sheets\n        $sheetId = 0;\n        foreach ($sheets as $sheet) {\n            // Write table header\n            $html .= $this->generateTableHeader($sheet);\n\n            // Get worksheet dimension\n            $dimension = explode(':', $sheet->calculateWorksheetDimension());\n            $dimension[0] = PHPExcel_Cell::coordinateFromString($dimension[0]);\n            $dimension[0][0] = PHPExcel_Cell::columnIndexFromString($dimension[0][0]) - 1;\n            $dimension[1] = PHPExcel_Cell::coordinateFromString($dimension[1]);\n            $dimension[1][0] = PHPExcel_Cell::columnIndexFromString($dimension[1][0]) - 1;\n\n            // row min,max\n            $rowMin = $dimension[0][1];\n            $rowMax = $dimension[1][1];\n\n            // calculate start of <tbody>, <thead>\n            $tbodyStart = $rowMin;\n            $theadStart = $theadEnd   = 0; // default: no <thead>    no </thead>\n            if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) {\n                $rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop();\n\n                // we can only support repeating rows that start at top row\n                if ($rowsToRepeatAtTop[0] == 1) {\n                    $theadStart = $rowsToRepeatAtTop[0];\n                    $theadEnd   = $rowsToRepeatAtTop[1];\n                    $tbodyStart = $rowsToRepeatAtTop[1] + 1;\n                }\n            }\n\n            // Loop through cells\n            $row = $rowMin-1;\n            while ($row++ < $rowMax) {\n                // <thead> ?\n                if ($row == $theadStart) {\n                    $html .= '        <thead>' . PHP_EOL;\n                    $cellType = 'th';\n                }\n\n                // <tbody> ?\n                if ($row == $tbodyStart) {\n                    $html .= '        <tbody>' . PHP_EOL;\n                    $cellType = 'td';\n                }\n\n                // Write row if there are HTML table cells in it\n                if (!isset($this->isSpannedRow[$sheet->getParent()->getIndex($sheet)][$row])) {\n                    // Start a new rowData\n                    $rowData = array();\n                    // Loop through columns\n                    $column = $dimension[0][0] - 1;\n                    while ($column++ < $dimension[1][0]) {\n                        // Cell exists?\n                        if ($sheet->cellExistsByColumnAndRow($column, $row)) {\n                            $rowData[$column] = PHPExcel_Cell::stringFromColumnIndex($column) . $row;\n                        } else {\n                            $rowData[$column] = '';\n                        }\n                    }\n                    $html .= $this->generateRow($sheet, $rowData, $row - 1, $cellType);\n                }\n\n                // </thead> ?\n                if ($row == $theadEnd) {\n                    $html .= '        </thead>' . PHP_EOL;\n                }\n            }\n            $html .= $this->extendRowsForChartsAndImages($sheet, $row);\n\n            // Close table body.\n            $html .= '        </tbody>' . PHP_EOL;\n\n            // Write table footer\n            $html .= $this->generateTableFooter();\n\n            // Writing PDF?\n            if ($this->isPdf) {\n                if (is_null($this->sheetIndex) && $sheetId + 1 < $this->phpExcel->getSheetCount()) {\n                    $html .= '<div style=\"page-break-before:always\" />';\n                }\n            }\n\n            // Next sheet\n            ++$sheetId;\n        }\n\n        return $html;\n    }\n\n    /**\n     * Generate sheet tabs\n     *\n     * @return    string\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function generateNavigation()\n    {\n        // PHPExcel object known?\n        if (is_null($this->phpExcel)) {\n            throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');\n        }\n\n        // Fetch sheets\n        $sheets = array();\n        if (is_null($this->sheetIndex)) {\n            $sheets = $this->phpExcel->getAllSheets();\n        } else {\n            $sheets[] = $this->phpExcel->getSheet($this->sheetIndex);\n        }\n\n        // Construct HTML\n        $html = '';\n\n        // Only if there are more than 1 sheets\n        if (count($sheets) > 1) {\n            // Loop all sheets\n            $sheetId = 0;\n\n            $html .= '<ul class=\"navigation\">' . PHP_EOL;\n\n            foreach ($sheets as $sheet) {\n                $html .= '  <li class=\"sheet' . $sheetId . '\"><a href=\"#sheet' . $sheetId . '\">' . $sheet->getTitle() . '</a></li>' . PHP_EOL;\n                ++$sheetId;\n            }\n\n            $html .= '</ul>' . PHP_EOL;\n        }\n\n        return $html;\n    }\n\n    private function extendRowsForChartsAndImages(PHPExcel_Worksheet $pSheet, $row)\n    {\n        $rowMax = $row;\n        $colMax = 'A';\n        if ($this->includeCharts) {\n            foreach ($pSheet->getChartCollection() as $chart) {\n                if ($chart instanceof PHPExcel_Chart) {\n                    $chartCoordinates = $chart->getTopLeftPosition();\n                    $chartTL = PHPExcel_Cell::coordinateFromString($chartCoordinates['cell']);\n                    $chartCol = PHPExcel_Cell::columnIndexFromString($chartTL[0]);\n                    if ($chartTL[1] > $rowMax) {\n                        $rowMax = $chartTL[1];\n                        if ($chartCol > PHPExcel_Cell::columnIndexFromString($colMax)) {\n                            $colMax = $chartTL[0];\n                        }\n                    }\n                }\n            }\n        }\n\n        foreach ($pSheet->getDrawingCollection() as $drawing) {\n            if ($drawing instanceof PHPExcel_Worksheet_Drawing) {\n                $imageTL = PHPExcel_Cell::coordinateFromString($drawing->getCoordinates());\n                $imageCol = PHPExcel_Cell::columnIndexFromString($imageTL[0]);\n                if ($imageTL[1] > $rowMax) {\n                    $rowMax = $imageTL[1];\n                    if ($imageCol > PHPExcel_Cell::columnIndexFromString($colMax)) {\n                        $colMax = $imageTL[0];\n                    }\n                }\n            }\n        }\n\n        $html = '';\n        $colMax++;\n        while ($row <= $rowMax) {\n            $html .= '<tr>';\n            for ($col = 'A'; $col != $colMax; ++$col) {\n                $html .= '<td>';\n                $html .= $this->writeImageInCell($pSheet, $col.$row);\n                if ($this->includeCharts) {\n                    $html .= $this->writeChartInCell($pSheet, $col.$row);\n                }\n                $html .= '</td>';\n            }\n            ++$row;\n            $html .= '</tr>';\n        }\n        return $html;\n    }\n\n\n    /**\n     * Generate image tag in cell\n     *\n     * @param    PHPExcel_Worksheet    $pSheet            PHPExcel_Worksheet\n     * @param    string                $coordinates    Cell coordinates\n     * @return    string\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeImageInCell(PHPExcel_Worksheet $pSheet, $coordinates)\n    {\n        // Construct HTML\n        $html = '';\n\n        // Write images\n        foreach ($pSheet->getDrawingCollection() as $drawing) {\n            if ($drawing instanceof PHPExcel_Worksheet_Drawing) {\n                if ($drawing->getCoordinates() == $coordinates) {\n                    $filename = $drawing->getPath();\n\n                    // Strip off eventual '.'\n                    if (substr($filename, 0, 1) == '.') {\n                        $filename = substr($filename, 1);\n                    }\n\n                    // Prepend images root\n                    $filename = $this->getImagesRoot() . $filename;\n\n                    // Strip off eventual '.'\n                    if (substr($filename, 0, 1) == '.' && substr($filename, 0, 2) != './') {\n                        $filename = substr($filename, 1);\n                    }\n\n                    // Convert UTF8 data to PCDATA\n                    $filename = htmlspecialchars($filename);\n\n                    $html .= PHP_EOL;\n                    if ((!$this->embedImages) || ($this->isPdf)) {\n                        $imageData = $filename;\n                    } else {\n                        $imageDetails = getimagesize($filename);\n                        if ($fp = fopen($filename, \"rb\", 0)) {\n                            $picture = fread($fp, filesize($filename));\n                            fclose($fp);\n                            // base64 encode the binary data, then break it\n                            // into chunks according to RFC 2045 semantics\n                            $base64 = chunk_split(base64_encode($picture));\n                            $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64;\n                        } else {\n                            $imageData = $filename;\n                        }\n                    }\n\n                    $html .= '<div style=\"position: relative;\">';\n                    $html .= '<img style=\"position: absolute; z-index: 1; left: ' .\n                        $drawing->getOffsetX() . 'px; top: ' . $drawing->getOffsetY() . 'px; width: ' .\n                        $drawing->getWidth() . 'px; height: ' . $drawing->getHeight() . 'px;\" src=\"' .\n                        $imageData . '\" border=\"0\" />';\n                    $html .= '</div>';\n                }\n            } elseif ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {\n                if ($drawing->getCoordinates() != $coordinates) {\n                    continue;\n                }\n                ob_start();                                //  Let's start output buffering.\n                imagepng($drawing->getImageResource());    //  This will normally output the image, but because of ob_start(), it won't.\n                $contents = ob_get_contents();             //  Instead, output above is saved to $contents\n                ob_end_clean();                            //  End the output buffer.\n\n                $dataUri = \"data:image/jpeg;base64,\" . base64_encode($contents);\n\n                //  Because of the nature of tables, width is more important than height.\n                //  max-width: 100% ensures that image doesnt overflow containing cell\n                //  width: X sets width of supplied image.\n                //  As a result, images bigger than cell will be contained and images smaller will not get stretched\n                $html .= '<img src=\"'.$dataUri.'\" style=\"max-width:100%;width:'.$drawing->getWidth().'px;\" />';\n            }\n        }\n\n        return $html;\n    }\n\n    /**\n     * Generate chart tag in cell\n     *\n     * @param    PHPExcel_Worksheet    $pSheet            PHPExcel_Worksheet\n     * @param    string                $coordinates    Cell coordinates\n     * @return    string\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function writeChartInCell(PHPExcel_Worksheet $pSheet, $coordinates)\n    {\n        // Construct HTML\n        $html = '';\n\n        // Write charts\n        foreach ($pSheet->getChartCollection() as $chart) {\n            if ($chart instanceof PHPExcel_Chart) {\n                $chartCoordinates = $chart->getTopLeftPosition();\n                if ($chartCoordinates['cell'] == $coordinates) {\n                    $chartFileName = PHPExcel_Shared_File::sys_get_temp_dir().'/'.uniqid().'.png';\n                    if (!$chart->render($chartFileName)) {\n                        return;\n                    }\n\n                    $html .= PHP_EOL;\n                    $imageDetails = getimagesize($chartFileName);\n                    if ($fp = fopen($chartFileName, \"rb\", 0)) {\n                        $picture = fread($fp, filesize($chartFileName));\n                        fclose($fp);\n                        // base64 encode the binary data, then break it\n                        // into chunks according to RFC 2045 semantics\n                        $base64 = chunk_split(base64_encode($picture));\n                        $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64;\n\n                        $html .= '<div style=\"position: relative;\">';\n                        $html .= '<img style=\"position: absolute; z-index: 1; left: ' . $chartCoordinates['xOffset'] . 'px; top: ' . $chartCoordinates['yOffset'] . 'px; width: ' . $imageDetails[0] . 'px; height: ' . $imageDetails[1] . 'px;\" src=\"' . $imageData . '\" border=\"0\" />' . PHP_EOL;\n                        $html .= '</div>';\n\n                        unlink($chartFileName);\n                    }\n                }\n            }\n        }\n\n        // Return\n        return $html;\n    }\n\n    /**\n     * Generate CSS styles\n     *\n     * @param    boolean    $generateSurroundingHTML    Generate surrounding HTML tags? (&lt;style&gt; and &lt;/style&gt;)\n     * @return    string\n     * @throws    PHPExcel_Writer_Exception\n     */\n    public function generateStyles($generateSurroundingHTML = true)\n    {\n        // PHPExcel object known?\n        if (is_null($this->phpExcel)) {\n            throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');\n        }\n\n        // Build CSS\n        $css = $this->buildCSS($generateSurroundingHTML);\n\n        // Construct HTML\n        $html = '';\n\n        // Start styles\n        if ($generateSurroundingHTML) {\n            $html .= '    <style type=\"text/css\">' . PHP_EOL;\n            $html .= '      html { ' . $this->assembleCSS($css['html']) . ' }' . PHP_EOL;\n        }\n\n        // Write all other styles\n        foreach ($css as $styleName => $styleDefinition) {\n            if ($styleName != 'html') {\n                $html .= '      ' . $styleName . ' { ' . $this->assembleCSS($styleDefinition) . ' }' . PHP_EOL;\n            }\n        }\n\n        // End styles\n        if ($generateSurroundingHTML) {\n            $html .= '    </style>' . PHP_EOL;\n        }\n\n        // Return\n        return $html;\n    }\n\n    /**\n     * Build CSS styles\n     *\n     * @param    boolean    $generateSurroundingHTML    Generate surrounding HTML style? (html { })\n     * @return    array\n     * @throws    PHPExcel_Writer_Exception\n     */\n    public function buildCSS($generateSurroundingHTML = true)\n    {\n        // PHPExcel object known?\n        if (is_null($this->phpExcel)) {\n            throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.');\n        }\n\n        // Cached?\n        if (!is_null($this->cssStyles)) {\n            return $this->cssStyles;\n        }\n\n        // Ensure that spans have been calculated\n        if (!$this->spansAreCalculated) {\n            $this->calculateSpans();\n        }\n\n        // Construct CSS\n        $css = array();\n\n        // Start styles\n        if ($generateSurroundingHTML) {\n            // html { }\n            $css['html']['font-family']      = 'Calibri, Arial, Helvetica, sans-serif';\n            $css['html']['font-size']        = '11pt';\n            $css['html']['background-color'] = 'white';\n        }\n\n\n        // table { }\n        $css['table']['border-collapse']  = 'collapse';\n        if (!$this->isPdf) {\n            $css['table']['page-break-after'] = 'always';\n        }\n\n        // .gridlines td { }\n        $css['.gridlines td']['border'] = '1px dotted black';\n        $css['.gridlines th']['border'] = '1px dotted black';\n\n        // .b {}\n        $css['.b']['text-align'] = 'center'; // BOOL\n\n        // .e {}\n        $css['.e']['text-align'] = 'center'; // ERROR\n\n        // .f {}\n        $css['.f']['text-align'] = 'right'; // FORMULA\n\n        // .inlineStr {}\n        $css['.inlineStr']['text-align'] = 'left'; // INLINE\n\n        // .n {}\n        $css['.n']['text-align'] = 'right'; // NUMERIC\n\n        // .s {}\n        $css['.s']['text-align'] = 'left'; // STRING\n\n        // Calculate cell style hashes\n        foreach ($this->phpExcel->getCellXfCollection() as $index => $style) {\n            $css['td.style' . $index] = $this->createCSSStyle($style);\n            $css['th.style' . $index] = $this->createCSSStyle($style);\n        }\n\n        // Fetch sheets\n        $sheets = array();\n        if (is_null($this->sheetIndex)) {\n            $sheets = $this->phpExcel->getAllSheets();\n        } else {\n            $sheets[] = $this->phpExcel->getSheet($this->sheetIndex);\n        }\n\n        // Build styles per sheet\n        foreach ($sheets as $sheet) {\n            // Calculate hash code\n            $sheetIndex = $sheet->getParent()->getIndex($sheet);\n\n            // Build styles\n            // Calculate column widths\n            $sheet->calculateColumnWidths();\n\n            // col elements, initialize\n            $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) - 1;\n            $column = -1;\n            while ($column++ < $highestColumnIndex) {\n                $this->columnWidths[$sheetIndex][$column] = 42; // approximation\n                $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = '42pt';\n            }\n\n            // col elements, loop through columnDimensions and set width\n            foreach ($sheet->getColumnDimensions() as $columnDimension) {\n                if (($width = PHPExcel_Shared_Drawing::cellDimensionToPixels($columnDimension->getWidth(), $this->defaultFont)) >= 0) {\n                    $width = PHPExcel_Shared_Drawing::pixelsToPoints($width);\n                    $column = PHPExcel_Cell::columnIndexFromString($columnDimension->getColumnIndex()) - 1;\n                    $this->columnWidths[$sheetIndex][$column] = $width;\n                    $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = $width . 'pt';\n\n                    if ($columnDimension->getVisible() === false) {\n                        $css['table.sheet' . $sheetIndex . ' col.col' . $column]['visibility'] = 'collapse';\n                        $css['table.sheet' . $sheetIndex . ' col.col' . $column]['*display'] = 'none'; // target IE6+7\n                    }\n                }\n            }\n\n            // Default row height\n            $rowDimension = $sheet->getDefaultRowDimension();\n\n            // table.sheetN tr { }\n            $css['table.sheet' . $sheetIndex . ' tr'] = array();\n\n            if ($rowDimension->getRowHeight() == -1) {\n                $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->phpExcel->getDefaultStyle()->getFont());\n            } else {\n                $pt_height = $rowDimension->getRowHeight();\n            }\n            $css['table.sheet' . $sheetIndex . ' tr']['height'] = $pt_height . 'pt';\n            if ($rowDimension->getVisible() === false) {\n                $css['table.sheet' . $sheetIndex . ' tr']['display']    = 'none';\n                $css['table.sheet' . $sheetIndex . ' tr']['visibility'] = 'hidden';\n            }\n\n            // Calculate row heights\n            foreach ($sheet->getRowDimensions() as $rowDimension) {\n                $row = $rowDimension->getRowIndex() - 1;\n\n                // table.sheetN tr.rowYYYYYY { }\n                $css['table.sheet' . $sheetIndex . ' tr.row' . $row] = array();\n\n                if ($rowDimension->getRowHeight() == -1) {\n                    $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->phpExcel->getDefaultStyle()->getFont());\n                } else {\n                    $pt_height = $rowDimension->getRowHeight();\n                }\n                $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['height'] = $pt_height . 'pt';\n                if ($rowDimension->getVisible() === false) {\n                    $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['display'] = 'none';\n                    $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['visibility'] = 'hidden';\n                }\n            }\n        }\n\n        // Cache\n        if (is_null($this->cssStyles)) {\n            $this->cssStyles = $css;\n        }\n\n        // Return\n        return $css;\n    }\n\n    /**\n     * Create CSS style\n     *\n     * @param    PHPExcel_Style        $pStyle            PHPExcel_Style\n     * @return    array\n     */\n    private function createCSSStyle(PHPExcel_Style $pStyle)\n    {\n        // Construct CSS\n        $css = '';\n\n        // Create CSS\n        $css = array_merge(\n            $this->createCSSStyleAlignment($pStyle->getAlignment()),\n            $this->createCSSStyleBorders($pStyle->getBorders()),\n            $this->createCSSStyleFont($pStyle->getFont()),\n            $this->createCSSStyleFill($pStyle->getFill())\n        );\n\n        // Return\n        return $css;\n    }\n\n    /**\n     * Create CSS style (PHPExcel_Style_Alignment)\n     *\n     * @param    PHPExcel_Style_Alignment        $pStyle            PHPExcel_Style_Alignment\n     * @return    array\n     */\n    private function createCSSStyleAlignment(PHPExcel_Style_Alignment $pStyle)\n    {\n        // Construct CSS\n        $css = array();\n\n        // Create CSS\n        $css['vertical-align'] = $this->mapVAlign($pStyle->getVertical());\n        if ($textAlign = $this->mapHAlign($pStyle->getHorizontal())) {\n            $css['text-align'] = $textAlign;\n            if (in_array($textAlign, array('left', 'right'))) {\n                $css['padding-'.$textAlign] = (string)((int)$pStyle->getIndent() * 9).'px';\n            }\n        }\n\n        return $css;\n    }\n\n    /**\n     * Create CSS style (PHPExcel_Style_Font)\n     *\n     * @param    PHPExcel_Style_Font        $pStyle            PHPExcel_Style_Font\n     * @return    array\n     */\n    private function createCSSStyleFont(PHPExcel_Style_Font $pStyle)\n    {\n        // Construct CSS\n        $css = array();\n\n        // Create CSS\n        if ($pStyle->getBold()) {\n            $css['font-weight'] = 'bold';\n        }\n        if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE && $pStyle->getStrikethrough()) {\n            $css['text-decoration'] = 'underline line-through';\n        } elseif ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE) {\n            $css['text-decoration'] = 'underline';\n        } elseif ($pStyle->getStrikethrough()) {\n            $css['text-decoration'] = 'line-through';\n        }\n        if ($pStyle->getItalic()) {\n            $css['font-style'] = 'italic';\n        }\n\n        $css['color']       = '#' . $pStyle->getColor()->getRGB();\n        $css['font-family'] = '\\'' . $pStyle->getName() . '\\'';\n        $css['font-size']   = $pStyle->getSize() . 'pt';\n\n        return $css;\n    }\n\n    /**\n     * Create CSS style (PHPExcel_Style_Borders)\n     *\n     * @param    PHPExcel_Style_Borders        $pStyle            PHPExcel_Style_Borders\n     * @return    array\n     */\n    private function createCSSStyleBorders(PHPExcel_Style_Borders $pStyle)\n    {\n        // Construct CSS\n        $css = array();\n\n        // Create CSS\n        $css['border-bottom'] = $this->createCSSStyleBorder($pStyle->getBottom());\n        $css['border-top']    = $this->createCSSStyleBorder($pStyle->getTop());\n        $css['border-left']   = $this->createCSSStyleBorder($pStyle->getLeft());\n        $css['border-right']  = $this->createCSSStyleBorder($pStyle->getRight());\n\n        return $css;\n    }\n\n    /**\n     * Create CSS style (PHPExcel_Style_Border)\n     *\n     * @param    PHPExcel_Style_Border        $pStyle            PHPExcel_Style_Border\n     * @return    string\n     */\n    private function createCSSStyleBorder(PHPExcel_Style_Border $pStyle)\n    {\n        // Create CSS\n//        $css = $this->mapBorderStyle($pStyle->getBorderStyle()) . ' #' . $pStyle->getColor()->getRGB();\n        //    Create CSS - add !important to non-none border styles for merged cells\n        $borderStyle = $this->mapBorderStyle($pStyle->getBorderStyle());\n        $css = $borderStyle . ' #' . $pStyle->getColor()->getRGB() . (($borderStyle == 'none') ? '' : ' !important');\n\n        return $css;\n    }\n\n    /**\n     * Create CSS style (PHPExcel_Style_Fill)\n     *\n     * @param    PHPExcel_Style_Fill        $pStyle            PHPExcel_Style_Fill\n     * @return    array\n     */\n    private function createCSSStyleFill(PHPExcel_Style_Fill $pStyle)\n    {\n        // Construct HTML\n        $css = array();\n\n        // Create CSS\n        $value = $pStyle->getFillType() == PHPExcel_Style_Fill::FILL_NONE ?\n            'white' : '#' . $pStyle->getStartColor()->getRGB();\n        $css['background-color'] = $value;\n\n        return $css;\n    }\n\n    /**\n     * Generate HTML footer\n     */\n    public function generateHTMLFooter()\n    {\n        // Construct HTML\n        $html = '';\n        $html .= '  </body>' . PHP_EOL;\n        $html .= '</html>' . PHP_EOL;\n\n        return $html;\n    }\n\n    /**\n     * Generate table header\n     *\n     * @param    PHPExcel_Worksheet    $pSheet        The worksheet for the table we are writing\n     * @return    string\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function generateTableHeader($pSheet)\n    {\n        $sheetIndex = $pSheet->getParent()->getIndex($pSheet);\n\n        // Construct HTML\n        $html = '';\n        $html .= $this->setMargins($pSheet);\n            \n        if (!$this->useInlineCss) {\n            $gridlines = $pSheet->getShowGridlines() ? ' gridlines' : '';\n            $html .= '    <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"sheet' . $sheetIndex . '\" class=\"sheet' . $sheetIndex . $gridlines . '\">' . PHP_EOL;\n        } else {\n            $style = isset($this->cssStyles['table']) ?\n                $this->assembleCSS($this->cssStyles['table']) : '';\n\n            if ($this->isPdf && $pSheet->getShowGridlines()) {\n                $html .= '    <table border=\"1\" cellpadding=\"1\" id=\"sheet' . $sheetIndex . '\" cellspacing=\"1\" style=\"' . $style . '\">' . PHP_EOL;\n            } else {\n                $html .= '    <table border=\"0\" cellpadding=\"1\" id=\"sheet' . $sheetIndex . '\" cellspacing=\"0\" style=\"' . $style . '\">' . PHP_EOL;\n            }\n        }\n\n        // Write <col> elements\n        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn()) - 1;\n        $i = -1;\n        while ($i++ < $highestColumnIndex) {\n            if (!$this->isPdf) {\n                if (!$this->useInlineCss) {\n                    $html .= '        <col class=\"col' . $i . '\">' . PHP_EOL;\n                } else {\n                    $style = isset($this->cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) ?\n                        $this->assembleCSS($this->cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) : '';\n                    $html .= '        <col style=\"' . $style . '\">' . PHP_EOL;\n                }\n            }\n        }\n\n        return $html;\n    }\n\n    /**\n     * Generate table footer\n     *\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function generateTableFooter()\n    {\n        $html = '    </table>' . PHP_EOL;\n\n        return $html;\n    }\n\n    /**\n     * Generate row\n     *\n     * @param    PHPExcel_Worksheet    $pSheet            PHPExcel_Worksheet\n     * @param    array                $pValues        Array containing cells in a row\n     * @param    int                    $pRow            Row number (0-based)\n     * @return    string\n     * @throws    PHPExcel_Writer_Exception\n     */\n    private function generateRow(PHPExcel_Worksheet $pSheet, $pValues = null, $pRow = 0, $cellType = 'td')\n    {\n        if (is_array($pValues)) {\n            // Construct HTML\n            $html = '';\n\n            // Sheet index\n            $sheetIndex = $pSheet->getParent()->getIndex($pSheet);\n\n            // DomPDF and breaks\n            if ($this->isPdf && count($pSheet->getBreaks()) > 0) {\n                $breaks = $pSheet->getBreaks();\n\n                // check if a break is needed before this row\n                if (isset($breaks['A' . $pRow])) {\n                    // close table: </table>\n                    $html .= $this->generateTableFooter();\n\n                    // insert page break\n                    $html .= '<div style=\"page-break-before:always\" />';\n\n                    // open table again: <table> + <col> etc.\n                    $html .= $this->generateTableHeader($pSheet);\n                }\n            }\n\n            // Write row start\n            if (!$this->useInlineCss) {\n                $html .= '          <tr class=\"row' . $pRow . '\">' . PHP_EOL;\n            } else {\n                $style = isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow])\n                    ? $this->assembleCSS($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) : '';\n\n                $html .= '          <tr style=\"' . $style . '\">' . PHP_EOL;\n            }\n\n            // Write cells\n            $colNum = 0;\n            foreach ($pValues as $cellAddress) {\n                $cell = ($cellAddress > '') ? $pSheet->getCell($cellAddress) : '';\n                $coordinate = PHPExcel_Cell::stringFromColumnIndex($colNum) . ($pRow + 1);\n                if (!$this->useInlineCss) {\n                    $cssClass = '';\n                    $cssClass = 'column' . $colNum;\n                } else {\n                    $cssClass = array();\n                    if ($cellType == 'th') {\n                        if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' th.column' . $colNum])) {\n                            $this->cssStyles['table.sheet' . $sheetIndex . ' th.column' . $colNum];\n                        }\n                    } else {\n                        if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum])) {\n                            $this->cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum];\n                        }\n                    }\n                }\n                $colSpan = 1;\n                $rowSpan = 1;\n\n                // initialize\n                $cellData = '&nbsp;';\n\n                // PHPExcel_Cell\n                if ($cell instanceof PHPExcel_Cell) {\n                    $cellData = '';\n                    if (is_null($cell->getParent())) {\n                        $cell->attach($pSheet);\n                    }\n                    // Value\n                    if ($cell->getValue() instanceof PHPExcel_RichText) {\n                        // Loop through rich text elements\n                        $elements = $cell->getValue()->getRichTextElements();\n                        foreach ($elements as $element) {\n                            // Rich text start?\n                            if ($element instanceof PHPExcel_RichText_Run) {\n                                $cellData .= '<span style=\"' . $this->assembleCSS($this->createCSSStyleFont($element->getFont())) . '\">';\n\n                                if ($element->getFont()->getSuperScript()) {\n                                    $cellData .= '<sup>';\n                                } elseif ($element->getFont()->getSubScript()) {\n                                    $cellData .= '<sub>';\n                                }\n                            }\n\n                            // Convert UTF8 data to PCDATA\n                            $cellText = $element->getText();\n                            $cellData .= htmlspecialchars($cellText);\n\n                            if ($element instanceof PHPExcel_RichText_Run) {\n                                if ($element->getFont()->getSuperScript()) {\n                                    $cellData .= '</sup>';\n                                } elseif ($element->getFont()->getSubScript()) {\n                                    $cellData .= '</sub>';\n                                }\n\n                                $cellData .= '</span>';\n                            }\n                        }\n                    } else {\n                        if ($this->preCalculateFormulas) {\n                            $cellData = PHPExcel_Style_NumberFormat::toFormattedString(\n                                $cell->getCalculatedValue(),\n                                $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode(),\n                                array($this, 'formatColor')\n                            );\n                        } else {\n                            $cellData = PHPExcel_Style_NumberFormat::toFormattedString(\n                                $cell->getValue(),\n                                $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode(),\n                                array($this, 'formatColor')\n                            );\n                        }\n                        $cellData = htmlspecialchars($cellData);\n                        if ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSuperScript()) {\n                            $cellData = '<sup>'.$cellData.'</sup>';\n                        } elseif ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSubScript()) {\n                            $cellData = '<sub>'.$cellData.'</sub>';\n                        }\n                    }\n\n                    // Converts the cell content so that spaces occuring at beginning of each new line are replaced by &nbsp;\n                    // Example: \"  Hello\\n to the world\" is converted to \"&nbsp;&nbsp;Hello\\n&nbsp;to the world\"\n                    $cellData = preg_replace(\"/(?m)(?:^|\\\\G) /\", '&nbsp;', $cellData);\n\n                    // convert newline \"\\n\" to '<br>'\n                    $cellData = nl2br($cellData);\n\n                    // Extend CSS class?\n                    if (!$this->useInlineCss) {\n                        $cssClass .= ' style' . $cell->getXfIndex();\n                        $cssClass .= ' ' . $cell->getDataType();\n                    } else {\n                        if ($cellType == 'th') {\n                            if (isset($this->cssStyles['th.style' . $cell->getXfIndex()])) {\n                                $cssClass = array_merge($cssClass, $this->cssStyles['th.style' . $cell->getXfIndex()]);\n                            }\n                        } else {\n                            if (isset($this->cssStyles['td.style' . $cell->getXfIndex()])) {\n                                $cssClass = array_merge($cssClass, $this->cssStyles['td.style' . $cell->getXfIndex()]);\n                            }\n                        }\n\n                        // General horizontal alignment: Actual horizontal alignment depends on dataType\n                        $sharedStyle = $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex());\n                        if ($sharedStyle->getAlignment()->getHorizontal() == PHPExcel_Style_Alignment::HORIZONTAL_GENERAL\n                            && isset($this->cssStyles['.' . $cell->getDataType()]['text-align'])) {\n                            $cssClass['text-align'] = $this->cssStyles['.' . $cell->getDataType()]['text-align'];\n                        }\n                    }\n                }\n\n                // Hyperlink?\n                if ($pSheet->hyperlinkExists($coordinate) && !$pSheet->getHyperlink($coordinate)->isInternal()) {\n                    $cellData = '<a href=\"' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getUrl()) . '\" title=\"' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getTooltip()) . '\">' . $cellData . '</a>';\n                }\n\n                // Should the cell be written or is it swallowed by a rowspan or colspan?\n                $writeCell = !(isset($this->isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])\n                            && $this->isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]);\n\n                // Colspan and Rowspan\n                $colspan = 1;\n                $rowspan = 1;\n                if (isset($this->isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])) {\n                    $spans = $this->isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum];\n                    $rowSpan = $spans['rowspan'];\n                    $colSpan = $spans['colspan'];\n\n                    //    Also apply style from last cell in merge to fix borders -\n                    //        relies on !important for non-none border declarations in createCSSStyleBorder\n                    $endCellCoord = PHPExcel_Cell::stringFromColumnIndex($colNum + $colSpan - 1) . ($pRow + $rowSpan);\n                    if (!$this->useInlineCss) {\n                        $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex();\n                    }\n                }\n\n                // Write\n                if ($writeCell) {\n                    // Column start\n                    $html .= '            <' . $cellType;\n                    if (!$this->useInlineCss) {\n                        $html .= ' class=\"' . $cssClass . '\"';\n                    } else {\n                        //** Necessary redundant code for the sake of PHPExcel_Writer_PDF **\n                        // We must explicitly write the width of the <td> element because TCPDF\n                        // does not recognize e.g. <col style=\"width:42pt\">\n                        $width = 0;\n                        $i = $colNum - 1;\n                        $e = $colNum + $colSpan - 1;\n                        while ($i++ < $e) {\n                            if (isset($this->columnWidths[$sheetIndex][$i])) {\n                                $width += $this->columnWidths[$sheetIndex][$i];\n                            }\n                        }\n                        $cssClass['width'] = $width . 'pt';\n\n                        // We must also explicitly write the height of the <td> element because TCPDF\n                        // does not recognize e.g. <tr style=\"height:50pt\">\n                        if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'])) {\n                            $height = $this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'];\n                            $cssClass['height'] = $height;\n                        }\n                        //** end of redundant code **\n\n                        $html .= ' style=\"' . $this->assembleCSS($cssClass) . '\"';\n                    }\n                    if ($colSpan > 1) {\n                        $html .= ' colspan=\"' . $colSpan . '\"';\n                    }\n                    if ($rowSpan > 1) {\n                        $html .= ' rowspan=\"' . $rowSpan . '\"';\n                    }\n                    $html .= '>';\n\n                    // Image?\n                    $html .= $this->writeImageInCell($pSheet, $coordinate);\n\n                    // Chart?\n                    if ($this->includeCharts) {\n                        $html .= $this->writeChartInCell($pSheet, $coordinate);\n                    }\n\n                    // Cell data\n                    $html .= $cellData;\n\n                    // Column end\n                    $html .= '</'.$cellType.'>' . PHP_EOL;\n                }\n\n                // Next column\n                ++$colNum;\n            }\n\n            // Write row end\n            $html .= '          </tr>' . PHP_EOL;\n\n            // Return\n            return $html;\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Invalid parameters passed.\");\n        }\n    }\n\n    /**\n     * Takes array where of CSS properties / values and converts to CSS string\n     *\n     * @param array\n     * @return string\n     */\n    private function assembleCSS($pValue = array())\n    {\n        $pairs = array();\n        foreach ($pValue as $property => $value) {\n            $pairs[] = $property . ':' . $value;\n        }\n        $string = implode('; ', $pairs);\n\n        return $string;\n    }\n\n    /**\n     * Get images root\n     *\n     * @return string\n     */\n    public function getImagesRoot()\n    {\n        return $this->imagesRoot;\n    }\n\n    /**\n     * Set images root\n     *\n     * @param string $pValue\n     * @return PHPExcel_Writer_HTML\n     */\n    public function setImagesRoot($pValue = '.')\n    {\n        $this->imagesRoot = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get embed images\n     *\n     * @return boolean\n     */\n    public function getEmbedImages()\n    {\n        return $this->embedImages;\n    }\n\n    /**\n     * Set embed images\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Writer_HTML\n     */\n    public function setEmbedImages($pValue = '.')\n    {\n        $this->embedImages = $pValue;\n        return $this;\n    }\n\n    /**\n     * Get use inline CSS?\n     *\n     * @return boolean\n     */\n    public function getUseInlineCss()\n    {\n        return $this->useInlineCss;\n    }\n\n    /**\n     * Set use inline CSS?\n     *\n     * @param boolean $pValue\n     * @return PHPExcel_Writer_HTML\n     */\n    public function setUseInlineCss($pValue = false)\n    {\n        $this->useInlineCss = $pValue;\n        return $this;\n    }\n\n    /**\n     * Add color to formatted string as inline style\n     *\n     * @param string $pValue Plain formatted value without color\n     * @param string $pFormat Format code\n     * @return string\n     */\n    public function formatColor($pValue, $pFormat)\n    {\n        // Color information, e.g. [Red] is always at the beginning\n        $color = null; // initialize\n        $matches = array();\n\n        $color_regex = '/^\\\\[[a-zA-Z]+\\\\]/';\n        if (preg_match($color_regex, $pFormat, $matches)) {\n            $color = str_replace('[', '', $matches[0]);\n            $color = str_replace(']', '', $color);\n            $color = strtolower($color);\n        }\n\n        // convert to PCDATA\n        $value = htmlspecialchars($pValue);\n\n        // color span tag\n        if ($color !== null) {\n            $value = '<span style=\"color:' . $color . '\">' . $value . '</span>';\n        }\n\n        return $value;\n    }\n\n    /**\n     * Calculate information about HTML colspan and rowspan which is not always the same as Excel's\n     */\n    private function calculateSpans()\n    {\n        // Identify all cells that should be omitted in HTML due to cell merge.\n        // In HTML only the upper-left cell should be written and it should have\n        //   appropriate rowspan / colspan attribute\n        $sheetIndexes = $this->sheetIndex !== null ?\n            array($this->sheetIndex) : range(0, $this->phpExcel->getSheetCount() - 1);\n\n        foreach ($sheetIndexes as $sheetIndex) {\n            $sheet = $this->phpExcel->getSheet($sheetIndex);\n\n            $candidateSpannedRow  = array();\n\n            // loop through all Excel merged cells\n            foreach ($sheet->getMergeCells() as $cells) {\n                list($cells,) = PHPExcel_Cell::splitRange($cells);\n                $first = $cells[0];\n                $last  = $cells[1];\n\n                list($fc, $fr) = PHPExcel_Cell::coordinateFromString($first);\n                $fc = PHPExcel_Cell::columnIndexFromString($fc) - 1;\n\n                list($lc, $lr) = PHPExcel_Cell::coordinateFromString($last);\n                $lc = PHPExcel_Cell::columnIndexFromString($lc) - 1;\n\n                // loop through the individual cells in the individual merge\n                $r = $fr - 1;\n                while ($r++ < $lr) {\n                    // also, flag this row as a HTML row that is candidate to be omitted\n                    $candidateSpannedRow[$r] = $r;\n\n                    $c = $fc - 1;\n                    while ($c++ < $lc) {\n                        if (!($c == $fc && $r == $fr)) {\n                            // not the upper-left cell (should not be written in HTML)\n                            $this->isSpannedCell[$sheetIndex][$r][$c] = array(\n                                'baseCell' => array($fr, $fc),\n                            );\n                        } else {\n                            // upper-left is the base cell that should hold the colspan/rowspan attribute\n                            $this->isBaseCell[$sheetIndex][$r][$c] = array(\n                                'xlrowspan' => $lr - $fr + 1, // Excel rowspan\n                                'rowspan'   => $lr - $fr + 1, // HTML rowspan, value may change\n                                'xlcolspan' => $lc - $fc + 1, // Excel colspan\n                                'colspan'   => $lc - $fc + 1, // HTML colspan, value may change\n                            );\n                        }\n                    }\n                }\n            }\n\n            // Identify which rows should be omitted in HTML. These are the rows where all the cells\n            //   participate in a merge and the where base cells are somewhere above.\n            $countColumns = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());\n            foreach ($candidateSpannedRow as $rowIndex) {\n                if (isset($this->isSpannedCell[$sheetIndex][$rowIndex])) {\n                    if (count($this->isSpannedCell[$sheetIndex][$rowIndex]) == $countColumns) {\n                        $this->isSpannedRow[$sheetIndex][$rowIndex] = $rowIndex;\n                    };\n                }\n            }\n\n            // For each of the omitted rows we found above, the affected rowspans should be subtracted by 1\n            if (isset($this->isSpannedRow[$sheetIndex])) {\n                foreach ($this->isSpannedRow[$sheetIndex] as $rowIndex) {\n                    $adjustedBaseCells = array();\n                    $c = -1;\n                    $e = $countColumns - 1;\n                    while ($c++ < $e) {\n                        $baseCell = $this->isSpannedCell[$sheetIndex][$rowIndex][$c]['baseCell'];\n\n                        if (!in_array($baseCell, $adjustedBaseCells)) {\n                            // subtract rowspan by 1\n                            --$this->isBaseCell[$sheetIndex][ $baseCell[0] ][ $baseCell[1] ]['rowspan'];\n                            $adjustedBaseCells[] = $baseCell;\n                        }\n                    }\n                }\n            }\n\n            // TODO: Same for columns\n        }\n\n        // We have calculated the spans\n        $this->spansAreCalculated = true;\n    }\n\n    private function setMargins(PHPExcel_Worksheet $pSheet)\n    {\n        $htmlPage = '@page { ';\n        $htmlBody = 'body { ';\n\n        $left = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()) . 'in; ';\n        $htmlPage .= 'margin-left: ' . $left;\n        $htmlBody .= 'margin-left: ' . $left;\n        $right = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()) . 'in; ';\n        $htmlPage .= 'margin-right: ' . $right;\n        $htmlBody .= 'margin-right: ' . $right;\n        $top = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()) . 'in; ';\n        $htmlPage .= 'margin-top: ' . $top;\n        $htmlBody .= 'margin-top: ' . $top;\n        $bottom = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()) . 'in; ';\n        $htmlPage .= 'margin-bottom: ' . $bottom;\n        $htmlBody .= 'margin-bottom: ' . $bottom;\n\n        $htmlPage .= \"}\\n\";\n        $htmlBody .= \"}\\n\";\n\n        return \"<style>\\n\" . $htmlPage . $htmlBody . \"</style>\\n\";\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/IWriter.php",
    "content": "<?php\n\n/**\n *  PHPExcel_Writer_IWriter\n *\n *  Copyright (c) 2006 - 2015 PHPExcel\n *\n *  This library is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU Lesser General Public\n *  License as published by the Free Software Foundation; either\n *  version 2.1 of the License, or (at your option) any later version.\n *\n *  This library is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *  Lesser General Public License for more details.\n *\n *  You should have received a copy of the GNU Lesser General Public\n *  License along with this library; if not, write to the Free Software\n *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *  @category   PHPExcel\n *  @package    PHPExcel_Writer\n *  @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *  @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *  @version    ##VERSION##, ##DATE##\n */\ninterface PHPExcel_Writer_IWriter\n{\n    /**\n     *  Save PHPExcel to file\n     *\n     *  @param   string       $pFilename  Name of the file to save\n     *  @throws  PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null);\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Cell/Comment.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Writer_OpenDocument_Cell_Comment\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @author     Alexander Pervakov <frost-nzcr4@jagmort.com>\n */\nclass PHPExcel_Writer_OpenDocument_Cell_Comment\n{\n    public static function write(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Cell $cell)\n    {\n        $comments = $cell->getWorksheet()->getComments();\n        if (!isset($comments[$cell->getCoordinate()])) {\n            return;\n        }\n        $comment = $comments[$cell->getCoordinate()];\n\n        $objWriter->startElement('office:annotation');\n            //$objWriter->writeAttribute('draw:style-name', 'gr1');\n            //$objWriter->writeAttribute('draw:text-style-name', 'P1');\n            $objWriter->writeAttribute('svg:width', $comment->getWidth());\n            $objWriter->writeAttribute('svg:height', $comment->getHeight());\n            $objWriter->writeAttribute('svg:x', $comment->getMarginLeft());\n            $objWriter->writeAttribute('svg:y', $comment->getMarginTop());\n            //$objWriter->writeAttribute('draw:caption-point-x', $comment->getMarginLeft());\n            //$objWriter->writeAttribute('draw:caption-point-y', $comment->getMarginTop());\n                $objWriter->writeElement('dc:creator', $comment->getAuthor());\n                // TODO: Not realized in PHPExcel_Comment yet.\n                //$objWriter->writeElement('dc:date', $comment->getDate());\n                $objWriter->writeElement('text:p', $comment->getText()->getPlainText());\n                    //$objWriter->writeAttribute('draw:text-style-name', 'P1');\n        $objWriter->endElement();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Content.php",
    "content": "<?php\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\n\n\n/**\n * PHPExcel_Writer_OpenDocument_Content\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @author     Alexander Pervakov <frost-nzcr4@jagmort.com>\n */\nclass PHPExcel_Writer_OpenDocument_Content extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    const NUMBER_COLS_REPEATED_MAX = 1024;\n    const NUMBER_ROWS_REPEATED_MAX = 1048576;\n\n    /**\n     * Write content.xml to XML format\n     *\n     * @param   PHPExcel                   $pPHPExcel\n     * @return  string                     XML Output\n     * @throws  PHPExcel_Writer_Exception\n     */\n    public function write(PHPExcel $pPHPExcel = null)\n    {\n        if (!$pPHPExcel) {\n            $pPHPExcel = $this->getParentWriter()->getPHPExcel(); /* @var $pPHPExcel PHPExcel */\n        }\n\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8');\n\n        // Content\n        $objWriter->startElement('office:document-content');\n            $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');\n            $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0');\n            $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0');\n            $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0');\n            $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0');\n            $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0');\n            $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n            $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');\n            $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0');\n            $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0');\n            $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0');\n            $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0');\n            $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0');\n            $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0');\n            $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML');\n            $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0');\n            $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0');\n            $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');\n            $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer');\n            $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc');\n            $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events');\n            $objWriter->writeAttribute('xmlns:xforms', 'http://www.w3.org/2002/xforms');\n            $objWriter->writeAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');\n            $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');\n            $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report');\n            $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2');\n            $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml');\n            $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#');\n            $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table');\n            $objWriter->writeAttribute('xmlns:field', 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0');\n            $objWriter->writeAttribute('xmlns:formx', 'urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0');\n            $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/');\n            $objWriter->writeAttribute('office:version', '1.2');\n\n            $objWriter->writeElement('office:scripts');\n            $objWriter->writeElement('office:font-face-decls');\n            $objWriter->writeElement('office:automatic-styles');\n\n            $objWriter->startElement('office:body');\n                $objWriter->startElement('office:spreadsheet');\n                    $objWriter->writeElement('table:calculation-settings');\n                    $this->writeSheets($objWriter);\n                    $objWriter->writeElement('table:named-expressions');\n                $objWriter->endElement();\n            $objWriter->endElement();\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n\n    /**\n     * Write sheets\n     *\n     * @param PHPExcel_Shared_XMLWriter $objWriter\n     */\n    private function writeSheets(PHPExcel_Shared_XMLWriter $objWriter)\n    {\n        $pPHPExcel = $this->getParentWriter()->getPHPExcel(); /* @var $pPHPExcel PHPExcel */\n\n        $sheet_count = $pPHPExcel->getSheetCount();\n        for ($i = 0; $i < $sheet_count; $i++) {\n            //$this->getWriterPart('Worksheet')->writeWorksheet());\n            $objWriter->startElement('table:table');\n                $objWriter->writeAttribute('table:name', $pPHPExcel->getSheet($i)->getTitle());\n                $objWriter->writeElement('office:forms');\n                $objWriter->startElement('table:table-column');\n                    $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX);\n                $objWriter->endElement();\n                $this->writeRows($objWriter, $pPHPExcel->getSheet($i));\n            $objWriter->endElement();\n        }\n    }\n\n    /**\n     * Write rows of the specified sheet\n     *\n     * @param PHPExcel_Shared_XMLWriter $objWriter\n     * @param PHPExcel_Worksheet $sheet\n     */\n    private function writeRows(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Worksheet $sheet)\n    {\n        $number_rows_repeated = self::NUMBER_ROWS_REPEATED_MAX;\n        $span_row = 0;\n        $rows = $sheet->getRowIterator();\n        while ($rows->valid()) {\n            $number_rows_repeated--;\n            $row = $rows->current();\n            if ($row->getCellIterator()->valid()) {\n                if ($span_row) {\n                    $objWriter->startElement('table:table-row');\n                    if ($span_row > 1) {\n                        $objWriter->writeAttribute('table:number-rows-repeated', $span_row);\n                    }\n                    $objWriter->startElement('table:table-cell');\n                        $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX);\n                    $objWriter->endElement();\n                    $objWriter->endElement();\n                    $span_row = 0;\n                }\n                $objWriter->startElement('table:table-row');\n                $this->writeCells($objWriter, $row);\n                $objWriter->endElement();\n            } else {\n                $span_row++;\n            }\n            $rows->next();\n        }\n    }\n\n    /**\n     * Write cells of the specified row\n     *\n     * @param PHPExcel_Shared_XMLWriter $objWriter\n     * @param PHPExcel_Worksheet_Row $row\n     * @throws PHPExcel_Writer_Exception\n     */\n    private function writeCells(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Worksheet_Row $row)\n    {\n        $number_cols_repeated = self::NUMBER_COLS_REPEATED_MAX;\n        $prev_column = -1;\n        $cells = $row->getCellIterator();\n        while ($cells->valid()) {\n            $cell = $cells->current();\n            $column = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1;\n\n            $this->writeCellSpan($objWriter, $column, $prev_column);\n            $objWriter->startElement('table:table-cell');\n\n            switch ($cell->getDataType()) {\n                case PHPExcel_Cell_DataType::TYPE_BOOL:\n                    $objWriter->writeAttribute('office:value-type', 'boolean');\n                    $objWriter->writeAttribute('office:value', $cell->getValue());\n                    $objWriter->writeElement('text:p', $cell->getValue());\n                    break;\n\n                case PHPExcel_Cell_DataType::TYPE_ERROR:\n                    throw new PHPExcel_Writer_Exception('Writing of error not implemented yet.');\n                    break;\n\n                case PHPExcel_Cell_DataType::TYPE_FORMULA:\n                    try {\n                        $formula_value = $cell->getCalculatedValue();\n                    } catch (Exception $e) {\n                        $formula_value = $cell->getValue();\n                    }\n                    $objWriter->writeAttribute('table:formula', 'of:' . $cell->getValue());\n                    if (is_numeric($formula_value)) {\n                        $objWriter->writeAttribute('office:value-type', 'float');\n                    } else {\n                        $objWriter->writeAttribute('office:value-type', 'string');\n                    }\n                    $objWriter->writeAttribute('office:value', $formula_value);\n                    $objWriter->writeElement('text:p', $formula_value);\n                    break;\n\n                case PHPExcel_Cell_DataType::TYPE_INLINE:\n                    throw new PHPExcel_Writer_Exception('Writing of inline not implemented yet.');\n                    break;\n\n                case PHPExcel_Cell_DataType::TYPE_NUMERIC:\n                    $objWriter->writeAttribute('office:value-type', 'float');\n                    $objWriter->writeAttribute('office:value', $cell->getValue());\n                    $objWriter->writeElement('text:p', $cell->getValue());\n                    break;\n\n                case PHPExcel_Cell_DataType::TYPE_STRING:\n                    $objWriter->writeAttribute('office:value-type', 'string');\n                    $objWriter->writeElement('text:p', $cell->getValue());\n                    break;\n            }\n            PHPExcel_Writer_OpenDocument_Cell_Comment::write($objWriter, $cell);\n            $objWriter->endElement();\n            $prev_column = $column;\n            $cells->next();\n        }\n        $number_cols_repeated = $number_cols_repeated - $prev_column - 1;\n        if ($number_cols_repeated > 0) {\n            if ($number_cols_repeated > 1) {\n                $objWriter->startElement('table:table-cell');\n                $objWriter->writeAttribute('table:number-columns-repeated', $number_cols_repeated);\n                $objWriter->endElement();\n            } else {\n                $objWriter->writeElement('table:table-cell');\n            }\n        }\n    }\n\n    /**\n     * Write span\n     *\n     * @param PHPExcel_Shared_XMLWriter $objWriter\n     * @param integer $curColumn\n     * @param integer $prevColumn\n     */\n    private function writeCellSpan(PHPExcel_Shared_XMLWriter $objWriter, $curColumn, $prevColumn)\n    {\n        $diff = $curColumn - $prevColumn - 1;\n        if (1 === $diff) {\n            $objWriter->writeElement('table:table-cell');\n        } elseif ($diff > 1) {\n            $objWriter->startElement('table:table-cell');\n                $objWriter->writeAttribute('table:number-columns-repeated', $diff);\n            $objWriter->endElement();\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Meta.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument_Meta\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument_Meta extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    /**\n     * Write meta.xml to XML format\n     *\n     * @param   PHPExcel                   $pPHPExcel\n     * @return  string                     XML Output\n     * @throws  PHPExcel_Writer_Exception\n     */\n    public function write(PHPExcel $pPHPExcel = null)\n    {\n        if (!$pPHPExcel) {\n            $pPHPExcel = $this->getParentWriter()->getPHPExcel();\n        }\n\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8');\n\n        // Meta\n        $objWriter->startElement('office:document-meta');\n\n        $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');\n        $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n        $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');\n        $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0');\n        $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');\n        $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#');\n        $objWriter->writeAttribute('office:version', '1.2');\n\n        $objWriter->startElement('office:meta');\n\n        $objWriter->writeElement('meta:initial-creator', $pPHPExcel->getProperties()->getCreator());\n        $objWriter->writeElement('dc:creator', $pPHPExcel->getProperties()->getCreator());\n        $objWriter->writeElement('meta:creation-date', date(DATE_W3C, $pPHPExcel->getProperties()->getCreated()));\n        $objWriter->writeElement('dc:date', date(DATE_W3C, $pPHPExcel->getProperties()->getCreated()));\n        $objWriter->writeElement('dc:title', $pPHPExcel->getProperties()->getTitle());\n        $objWriter->writeElement('dc:description', $pPHPExcel->getProperties()->getDescription());\n        $objWriter->writeElement('dc:subject', $pPHPExcel->getProperties()->getSubject());\n        $keywords = explode(' ', $pPHPExcel->getProperties()->getKeywords());\n        foreach ($keywords as $keyword) {\n            $objWriter->writeElement('meta:keyword', $keyword);\n        }\n\n        //<meta:document-statistic meta:table-count=\"XXX\" meta:cell-count=\"XXX\" meta:object-count=\"XXX\"/>\n        $objWriter->startElement('meta:user-defined');\n        $objWriter->writeAttribute('meta:name', 'Company');\n        $objWriter->writeRaw($pPHPExcel->getProperties()->getCompany());\n        $objWriter->endElement();\n \n        $objWriter->startElement('meta:user-defined');\n        $objWriter->writeAttribute('meta:name', 'category');\n        $objWriter->writeRaw($pPHPExcel->getProperties()->getCategory());\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/MetaInf.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument_MetaInf\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument_MetaInf extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    /**\n     * Write META-INF/manifest.xml to XML format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function writeManifest(PHPExcel $pPHPExcel = null)\n    {\n        if (!$pPHPExcel) {\n            $pPHPExcel = $this->getParentWriter()->getPHPExcel();\n        }\n\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8');\n\n        // Manifest\n        $objWriter->startElement('manifest:manifest');\n            $objWriter->writeAttribute('xmlns:manifest', 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0');\n            $objWriter->writeAttribute('manifest:version', '1.2');\n\n            $objWriter->startElement('manifest:file-entry');\n                $objWriter->writeAttribute('manifest:full-path', '/');\n                $objWriter->writeAttribute('manifest:version', '1.2');\n                $objWriter->writeAttribute('manifest:media-type', 'application/vnd.oasis.opendocument.spreadsheet');\n            $objWriter->endElement();\n            $objWriter->startElement('manifest:file-entry');\n                $objWriter->writeAttribute('manifest:full-path', 'meta.xml');\n                $objWriter->writeAttribute('manifest:media-type', 'text/xml');\n            $objWriter->endElement();\n            $objWriter->startElement('manifest:file-entry');\n                $objWriter->writeAttribute('manifest:full-path', 'settings.xml');\n                $objWriter->writeAttribute('manifest:media-type', 'text/xml');\n            $objWriter->endElement();\n            $objWriter->startElement('manifest:file-entry');\n                $objWriter->writeAttribute('manifest:full-path', 'content.xml');\n                $objWriter->writeAttribute('manifest:media-type', 'text/xml');\n            $objWriter->endElement();\n            $objWriter->startElement('manifest:file-entry');\n                $objWriter->writeAttribute('manifest:full-path', 'Thumbnails/thumbnail.png');\n                $objWriter->writeAttribute('manifest:media-type', 'image/png');\n            $objWriter->endElement();\n            $objWriter->startElement('manifest:file-entry');\n                $objWriter->writeAttribute('manifest:full-path', 'styles.xml');\n                $objWriter->writeAttribute('manifest:media-type', 'text/xml');\n            $objWriter->endElement();\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Mimetype.php",
    "content": "<?php\n\n/**\n * PHPExcel\n *\n * PHPExcel_Writer_OpenDocument_Mimetype\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument_Mimetype extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    /**\n     * Write mimetype to plain text format\n     *\n     * @param     PHPExcel    $pPHPExcel\n     * @return     string         XML Output\n     * @throws     PHPExcel_Writer_Exception\n     */\n    public function write(PHPExcel $pPHPExcel = null)\n    {\n        return 'application/vnd.oasis.opendocument.spreadsheet';\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Settings.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument_Settings\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument_Settings extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    /**\n     * Write settings.xml to XML format\n     *\n     * @param   PHPExcel                   $pPHPExcel\n     * @return  string                     XML Output\n     * @throws  PHPExcel_Writer_Exception\n     */\n    public function write(PHPExcel $pPHPExcel = null)\n    {\n        if (!$pPHPExcel) {\n            $pPHPExcel = $this->getParentWriter()->getPHPExcel();\n        }\n\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8');\n\n        // Settings\n        $objWriter->startElement('office:document-settings');\n            $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');\n            $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n            $objWriter->writeAttribute('xmlns:config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0');\n            $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');\n            $objWriter->writeAttribute('office:version', '1.2');\n\n            $objWriter->startElement('office:settings');\n                $objWriter->startElement('config:config-item-set');\n                    $objWriter->writeAttribute('config:name', 'ooo:view-settings');\n                    $objWriter->startElement('config:config-item-map-indexed');\n                        $objWriter->writeAttribute('config:name', 'Views');\n                    $objWriter->endElement();\n                $objWriter->endElement();\n                $objWriter->startElement('config:config-item-set');\n                    $objWriter->writeAttribute('config:name', 'ooo:configuration-settings');\n                $objWriter->endElement();\n            $objWriter->endElement();\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Styles.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument_Styles\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument_Styles extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    /**\n     * Write styles.xml to XML format\n     *\n     * @param   PHPExcel                   $pPHPExcel\n     * @return  string                     XML Output\n     * @throws  PHPExcel_Writer_Exception\n     */\n    public function write(PHPExcel $pPHPExcel = null)\n    {\n        if (!$pPHPExcel) {\n            $pPHPExcel = $this->getParentWriter()->getPHPExcel();\n        }\n\n        $objWriter = null;\n        if ($this->getParentWriter()->getUseDiskCaching()) {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());\n        } else {\n            $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);\n        }\n\n        // XML header\n        $objWriter->startDocument('1.0', 'UTF-8');\n\n        // Content\n        $objWriter->startElement('office:document-styles');\n            $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');\n            $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0');\n            $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0');\n            $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0');\n            $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0');\n            $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0');\n            $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n            $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');\n            $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0');\n            $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0');\n            $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0');\n            $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0');\n            $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0');\n            $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0');\n            $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML');\n            $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0');\n            $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0');\n            $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');\n            $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer');\n            $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc');\n            $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events');\n            $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report');\n            $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2');\n            $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml');\n            $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#');\n            $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table');\n            $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/');\n            $objWriter->writeAttribute('office:version', '1.2');\n\n            $objWriter->writeElement('office:font-face-decls');\n            $objWriter->writeElement('office:styles');\n            $objWriter->writeElement('office:automatic-styles');\n            $objWriter->writeElement('office:master-styles');\n        $objWriter->endElement();\n\n        return $objWriter->getData();\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/Thumbnails.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument_Thumbnails\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument_Thumbnails extends PHPExcel_Writer_OpenDocument_WriterPart\n{\n    /**\n     * Write Thumbnails/thumbnail.png to PNG format\n     *\n     * @param   PHPExcel                   $pPHPExcel\n     * @return  string                     XML Output\n     * @throws  PHPExcel_Writer_Exception\n     */\n    public function writeThumbnail(PHPExcel $pPHPExcel = null)\n    {\n        return '';\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument/WriterPart.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument_WriterPart\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Writer_OpenDocument_WriterPart extends PHPExcel_Writer_Excel2007_WriterPart\n{\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/OpenDocument.php",
    "content": "<?php\n\n/**\n * PHPExcel_Writer_OpenDocument\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel_Writer_OpenDocument\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_OpenDocument extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter\n{\n    /**\n     * Private writer parts\n     *\n     * @var PHPExcel_Writer_OpenDocument_WriterPart[]\n     */\n    private $writerParts = array();\n\n    /**\n     * Private PHPExcel\n     *\n     * @var PHPExcel\n     */\n    private $spreadSheet;\n\n    /**\n     * Create a new PHPExcel_Writer_OpenDocument\n     *\n     * @param PHPExcel $pPHPExcel\n     */\n    public function __construct(PHPExcel $pPHPExcel = null)\n    {\n        $this->setPHPExcel($pPHPExcel);\n\n        $writerPartsArray = array(\n            'content'    => 'PHPExcel_Writer_OpenDocument_Content',\n            'meta'       => 'PHPExcel_Writer_OpenDocument_Meta',\n            'meta_inf'   => 'PHPExcel_Writer_OpenDocument_MetaInf',\n            'mimetype'   => 'PHPExcel_Writer_OpenDocument_Mimetype',\n            'settings'   => 'PHPExcel_Writer_OpenDocument_Settings',\n            'styles'     => 'PHPExcel_Writer_OpenDocument_Styles',\n            'thumbnails' => 'PHPExcel_Writer_OpenDocument_Thumbnails'\n        );\n\n        foreach ($writerPartsArray as $writer => $class) {\n            $this->writerParts[$writer] = new $class($this);\n        }\n    }\n\n    /**\n     * Get writer part\n     *\n     * @param  string  $pPartName  Writer part name\n     * @return PHPExcel_Writer_Excel2007_WriterPart\n     */\n    public function getWriterPart($pPartName = '')\n    {\n        if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) {\n            return $this->writerParts[strtolower($pPartName)];\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Save PHPExcel to file\n     *\n     * @param  string  $pFilename\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        if (!$this->spreadSheet) {\n            throw new PHPExcel_Writer_Exception('PHPExcel object unassigned.');\n        }\n\n        // garbage collect\n        $this->spreadSheet->garbageCollect();\n\n        // If $pFilename is php://output or php://stdout, make it a temporary file...\n        $originalFilename = $pFilename;\n        if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {\n            $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp');\n            if ($pFilename == '') {\n                $pFilename = $originalFilename;\n            }\n        }\n\n        $objZip = $this->createZip($pFilename);\n\n        $objZip->addFromString('META-INF/manifest.xml', $this->getWriterPart('meta_inf')->writeManifest());\n        $objZip->addFromString('Thumbnails/thumbnail.png', $this->getWriterPart('thumbnails')->writeThumbnail());\n        $objZip->addFromString('content.xml', $this->getWriterPart('content')->write());\n        $objZip->addFromString('meta.xml', $this->getWriterPart('meta')->write());\n        $objZip->addFromString('mimetype', $this->getWriterPart('mimetype')->write());\n        $objZip->addFromString('settings.xml', $this->getWriterPart('settings')->write());\n        $objZip->addFromString('styles.xml', $this->getWriterPart('styles')->write());\n\n        // Close file\n        if ($objZip->close() === false) {\n            throw new PHPExcel_Writer_Exception(\"Could not close zip file $pFilename.\");\n        }\n\n        // If a temporary file was used, copy it to the correct file stream\n        if ($originalFilename != $pFilename) {\n            if (copy($pFilename, $originalFilename) === false) {\n                throw new PHPExcel_Writer_Exception(\"Could not copy temporary zip file $pFilename to $originalFilename.\");\n            }\n            @unlink($pFilename);\n        }\n    }\n\n    /**\n     * Create zip object\n     *\n     * @param string $pFilename\n     * @throws PHPExcel_Writer_Exception\n     * @return ZipArchive\n     */\n    private function createZip($pFilename)\n    {\n        // Create new ZIP file and open it for writing\n        $zipClass = PHPExcel_Settings::getZipClass();\n        $objZip = new $zipClass();\n\n        // Retrieve OVERWRITE and CREATE constants from the instantiated zip class\n        // This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP\n        $ro = new ReflectionObject($objZip);\n        $zipOverWrite = $ro->getConstant('OVERWRITE');\n        $zipCreate = $ro->getConstant('CREATE');\n\n        if (file_exists($pFilename)) {\n            unlink($pFilename);\n        }\n        // Try opening the ZIP file\n        if ($objZip->open($pFilename, $zipOverWrite) !== true) {\n            if ($objZip->open($pFilename, $zipCreate) !== true) {\n                throw new PHPExcel_Writer_Exception(\"Could not open $pFilename for writing.\");\n            }\n        }\n\n        return $objZip;\n    }\n\n    /**\n     * Get PHPExcel object\n     *\n     * @return PHPExcel\n     * @throws PHPExcel_Writer_Exception\n     */\n    public function getPHPExcel()\n    {\n        if ($this->spreadSheet !== null) {\n            return $this->spreadSheet;\n        } else {\n            throw new PHPExcel_Writer_Exception('No PHPExcel assigned.');\n        }\n    }\n\n    /**\n     * Set PHPExcel object\n     *\n     * @param  PHPExcel  $pPHPExcel  PHPExcel object\n     * @throws PHPExcel_Writer_Exception\n     * @return PHPExcel_Writer_Excel2007\n     */\n    public function setPHPExcel(PHPExcel $pPHPExcel = null)\n    {\n        $this->spreadSheet = $pPHPExcel;\n        return $this;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/PDF/Core.php",
    "content": "<?php\n\n/**\n *  PHPExcel_Writer_PDF_Core\n *\n *  Copyright (c) 2006 - 2015 PHPExcel\n *\n *  This library is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU Lesser General Public\n *  License as published by the Free Software Foundation; either\n *  version 2.1 of the License, or (at your option) any later version.\n *\n *  This library is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *  Lesser General Public License for more details.\n *\n *  You should have received a copy of the GNU Lesser General Public\n *  License along with this library; if not, write to the Free Software\n *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *  @category    PHPExcel\n *  @package     PHPExcel_Writer_PDF\n *  @copyright   Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *  @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *  @version     ##VERSION##, ##DATE##\n */\nabstract class PHPExcel_Writer_PDF_Core extends PHPExcel_Writer_HTML\n{\n    /**\n     * Temporary storage directory\n     *\n     * @var string\n     */\n    protected $tempDir = '';\n\n    /**\n     * Font\n     *\n     * @var string\n     */\n    protected $font = 'freesans';\n\n    /**\n     * Orientation (Over-ride)\n     *\n     * @var string\n     */\n    protected $orientation;\n\n    /**\n     * Paper size (Over-ride)\n     *\n     * @var int\n     */\n    protected $paperSize;\n\n\n    /**\n     * Temporary storage for Save Array Return type\n     *\n     * @var string\n     */\n    private $saveArrayReturnType;\n\n    /**\n     * Paper Sizes xRef List\n     *\n     * @var array\n     */\n    protected static $paperSizes = array(\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER\n            => 'LETTER',                 //    (8.5 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_SMALL\n            => 'LETTER',                 //    (8.5 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_TABLOID\n            => array(792.00, 1224.00),   //    (11 in. by 17 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEDGER\n            => array(1224.00, 792.00),   //    (17 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL\n            => 'LEGAL',                  //    (8.5 in. by 14 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_STATEMENT\n            => array(396.00, 612.00),    //    (5.5 in. by 8.5 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_EXECUTIVE\n            => 'EXECUTIVE',              //    (7.25 in. by 10.5 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3\n            => 'A3',                     //    (297 mm by 420 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4\n            => 'A4',                     //    (210 mm by 297 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_SMALL\n            => 'A4',                     //    (210 mm by 297 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5\n            => 'A5',                     //    (148 mm by 210 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_B4\n            => 'B4',                     //    (250 mm by 353 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_B5\n            => 'B5',                     //    (176 mm by 250 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_FOLIO\n            => 'FOLIO',                  //    (8.5 in. by 13 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_QUARTO\n            => array(609.45, 779.53),    //    (215 mm by 275 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_1\n            => array(720.00, 1008.00),   //    (10 in. by 14 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_2\n            => array(792.00, 1224.00),   //    (11 in. by 17 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_NOTE\n            => 'LETTER',                 //    (8.5 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO9_ENVELOPE\n            => array(279.00, 639.00),    //    (3.875 in. by 8.875 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO10_ENVELOPE\n            => array(297.00, 684.00),    //    (4.125 in. by 9.5 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO11_ENVELOPE\n            => array(324.00, 747.00),    //    (4.5 in. by 10.375 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO12_ENVELOPE\n            => array(342.00, 792.00),    //    (4.75 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO14_ENVELOPE\n            => array(360.00, 828.00),    //    (5 in. by 11.5 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_C\n            => array(1224.00, 1584.00),  //    (17 in. by 22 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_D\n            => array(1584.00, 2448.00),  //    (22 in. by 34 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_E\n            => array(2448.00, 3168.00),  //    (34 in. by 44 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_DL_ENVELOPE\n            => array(311.81, 623.62),    //    (110 mm by 220 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_C5_ENVELOPE\n            => 'C5',                     //    (162 mm by 229 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_C3_ENVELOPE\n            => 'C3',                     //    (324 mm by 458 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_C4_ENVELOPE\n            => 'C4',                     //    (229 mm by 324 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_C6_ENVELOPE\n            => 'C6',                     //    (114 mm by 162 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_C65_ENVELOPE\n            => array(323.15, 649.13),    //    (114 mm by 229 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_B4_ENVELOPE\n            => 'B4',                     //    (250 mm by 353 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_B5_ENVELOPE\n            => 'B5',                     //    (176 mm by 250 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_B6_ENVELOPE\n            => array(498.90, 354.33),    //    (176 mm by 125 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_ITALY_ENVELOPE\n            => array(311.81, 651.97),    //    (110 mm by 230 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_MONARCH_ENVELOPE\n            => array(279.00, 540.00),    //    (3.875 in. by 7.5 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_6_3_4_ENVELOPE\n            => array(261.00, 468.00),    //    (3.625 in. by 6.5 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_US_STANDARD_FANFOLD\n            => array(1071.00, 792.00),   //    (14.875 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_GERMAN_STANDARD_FANFOLD\n            => array(612.00, 864.00),    //    (8.5 in. by 12 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_GERMAN_LEGAL_FANFOLD\n            => 'FOLIO',                  //    (8.5 in. by 13 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_ISO_B4\n            => 'B4',                     //    (250 mm by 353 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_JAPANESE_DOUBLE_POSTCARD\n            => array(566.93, 419.53),    //    (200 mm by 148 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_1\n            => array(648.00, 792.00),    //    (9 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_2\n            => array(720.00, 792.00),    //    (10 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_3\n            => array(1080.00, 792.00),   //    (15 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_INVITE_ENVELOPE\n            => array(623.62, 623.62),    //    (220 mm by 220 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_EXTRA_PAPER\n            => array(667.80, 864.00),    //    (9.275 in. by 12 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL_EXTRA_PAPER\n            => array(667.80, 1080.00),   //    (9.275 in. by 15 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_TABLOID_EXTRA_PAPER\n            => array(841.68, 1296.00),   //    (11.69 in. by 18 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_EXTRA_PAPER\n            => array(668.98, 912.76),    //    (236 mm by 322 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_TRANSVERSE_PAPER\n            => array(595.80, 792.00),    //    (8.275 in. by 11 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_TRANSVERSE_PAPER\n            => 'A4',                     //    (210 mm by 297 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER\n            => array(667.80, 864.00),    //    (9.275 in. by 12 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_SUPERA_SUPERA_A4_PAPER\n            => array(643.46, 1009.13),   //    (227 mm by 356 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_SUPERB_SUPERB_A3_PAPER\n            => array(864.57, 1380.47),   //    (305 mm by 487 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_PLUS_PAPER\n            => array(612.00, 913.68),    //    (8.5 in. by 12.69 in.)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_PLUS_PAPER\n            => array(595.28, 935.43),    //    (210 mm by 330 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5_TRANSVERSE_PAPER\n            => 'A5',                     //    (148 mm by 210 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_JIS_B5_TRANSVERSE_PAPER\n            => array(515.91, 728.50),    //    (182 mm by 257 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_EXTRA_PAPER\n            => array(912.76, 1261.42),   //    (322 mm by 445 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5_EXTRA_PAPER\n            => array(493.23, 666.14),    //    (174 mm by 235 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_ISO_B5_EXTRA_PAPER\n            => array(569.76, 782.36),    //    (201 mm by 276 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER\n            => 'A2',                     //    (420 mm by 594 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_TRANSVERSE_PAPER\n            => 'A3',                     //    (297 mm by 420 mm)\n        PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER\n            => array(912.76, 1261.42)    //    (322 mm by 445 mm)\n    );\n\n    /**\n     *  Create a new PHPExcel_Writer_PDF\n     *\n     *  @param     PHPExcel    $phpExcel    PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        parent::__construct($phpExcel);\n        $this->setUseInlineCss(true);\n        $this->tempDir = PHPExcel_Shared_File::sys_get_temp_dir();\n    }\n\n    /**\n     *  Get Font\n     *\n     *  @return string\n     */\n    public function getFont()\n    {\n        return $this->font;\n    }\n\n    /**\n     *  Set font. Examples:\n     *      'arialunicid0-chinese-simplified'\n     *      'arialunicid0-chinese-traditional'\n     *      'arialunicid0-korean'\n     *      'arialunicid0-japanese'\n     *\n     *  @param    string    $fontName\n     */\n    public function setFont($fontName)\n    {\n        $this->font = $fontName;\n        return $this;\n    }\n\n    /**\n     *  Get Paper Size\n     *\n     *  @return int\n     */\n    public function getPaperSize()\n    {\n        return $this->paperSize;\n    }\n\n    /**\n     *  Set Paper Size\n     *\n     *  @param  string  $pValue Paper size\n     *  @return PHPExcel_Writer_PDF\n     */\n    public function setPaperSize($pValue = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER)\n    {\n        $this->paperSize = $pValue;\n        return $this;\n    }\n\n    /**\n     *  Get Orientation\n     *\n     *  @return string\n     */\n    public function getOrientation()\n    {\n        return $this->orientation;\n    }\n\n    /**\n     *  Set Orientation\n     *\n     *  @param string $pValue  Page orientation\n     *  @return PHPExcel_Writer_PDF\n     */\n    public function setOrientation($pValue = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT)\n    {\n        $this->orientation = $pValue;\n        return $this;\n    }\n\n    /**\n     *  Get temporary storage directory\n     *\n     *  @return string\n     */\n    public function getTempDir()\n    {\n        return $this->tempDir;\n    }\n\n    /**\n     *  Set temporary storage directory\n     *\n     *  @param     string        $pValue        Temporary storage directory\n     *  @throws    PHPExcel_Writer_Exception    when directory does not exist\n     *  @return    PHPExcel_Writer_PDF\n     */\n    public function setTempDir($pValue = '')\n    {\n        if (is_dir($pValue)) {\n            $this->tempDir = $pValue;\n        } else {\n            throw new PHPExcel_Writer_Exception(\"Directory does not exist: $pValue\");\n        }\n        return $this;\n    }\n\n    /**\n     *  Save PHPExcel to PDF file, pre-save\n     *\n     *  @param     string     $pFilename   Name of the file to save as\n     *  @throws    PHPExcel_Writer_Exception\n     */\n    protected function prepareForSave($pFilename = null)\n    {\n        //  garbage collect\n        $this->phpExcel->garbageCollect();\n\n        $this->saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();\n        PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);\n\n        //  Open file\n        $fileHandle = fopen($pFilename, 'w');\n        if ($fileHandle === false) {\n            throw new PHPExcel_Writer_Exception(\"Could not open file $pFilename for writing.\");\n        }\n\n        //  Set PDF\n        $this->isPdf = true;\n        //  Build CSS\n        $this->buildCSS(true);\n\n        return $fileHandle;\n    }\n\n    /**\n     *  Save PHPExcel to PDF file, post-save\n     *\n     *  @param     resource      $fileHandle\n     *  @throws    PHPExcel_Writer_Exception\n     */\n    protected function restoreStateAfterSave($fileHandle)\n    {\n        //  Close file\n        fclose($fileHandle);\n\n        PHPExcel_Calculation::setArrayReturnType($this->saveArrayReturnType);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/PDF/DomPDF.php",
    "content": "<?php\n\n/**  Require DomPDF library */\n$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/dompdf_config.inc.php';\nif (file_exists($pdfRendererClassFile)) {\n    require_once $pdfRendererClassFile;\n} else {\n    throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library');\n}\n\n/**\n *  PHPExcel_Writer_PDF_DomPDF\n *\n *  Copyright (c) 2006 - 2015 PHPExcel\n *\n *  This library is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU Lesser General Public\n *  License as published by the Free Software Foundation; either\n *  version 2.1 of the License, or (at your option) any later version.\n *\n *  This library is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *  Lesser General Public License for more details.\n *\n *  You should have received a copy of the GNU Lesser General Public\n *  License along with this library; if not, write to the Free Software\n *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *  @category    PHPExcel\n *  @package     PHPExcel_Writer_PDF\n *  @copyright   Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *  @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *  @version     ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_PDF_DomPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter\n{\n    /**\n     *  Create a new PHPExcel_Writer_PDF\n     *\n     *  @param   PHPExcel    $phpExcel    PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        parent::__construct($phpExcel);\n    }\n\n    /**\n     *  Save PHPExcel to file\n     *\n     *  @param   string     $pFilename   Name of the file to save as\n     *  @throws  PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        $fileHandle = parent::prepareForSave($pFilename);\n\n        //  Default PDF paper size\n        $paperSize = 'LETTER';    //    Letter    (8.5 in. by 11 in.)\n\n        //  Check for paper size and page orientation\n        if (is_null($this->getSheetIndex())) {\n            $orientation = ($this->phpExcel->getSheet(0)->getPageSetup()->getOrientation()\n                == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';\n            $printPaperSize = $this->phpExcel->getSheet(0)->getPageSetup()->getPaperSize();\n            $printMargins = $this->phpExcel->getSheet(0)->getPageMargins();\n        } else {\n            $orientation = ($this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation()\n                == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';\n            $printPaperSize = $this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize();\n            $printMargins = $this->phpExcel->getSheet($this->getSheetIndex())->getPageMargins();\n        }\n        \n        $orientation = ($orientation == 'L') ? 'landscape' : 'portrait';\n\n        //  Override Page Orientation\n        if (!is_null($this->getOrientation())) {\n            $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT)\n                ? PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT\n                : $this->getOrientation();\n        }\n        //  Override Paper Size\n        if (!is_null($this->getPaperSize())) {\n            $printPaperSize = $this->getPaperSize();\n        }\n\n        if (isset(self::$paperSizes[$printPaperSize])) {\n            $paperSize = self::$paperSizes[$printPaperSize];\n        }\n\n\n        //  Create PDF\n        $pdf = new DOMPDF();\n        $pdf->set_paper(strtolower($paperSize), $orientation);\n\n        $pdf->load_html(\n            $this->generateHTMLHeader(false) .\n            $this->generateSheetData() .\n            $this->generateHTMLFooter()\n        );\n        $pdf->render();\n\n        //  Write to file\n        fwrite($fileHandle, $pdf->output());\n\n        parent::restoreStateAfterSave($fileHandle);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/PDF/mPDF.php",
    "content": "<?php\n\n/**  Require mPDF library */\n$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/mpdf.php';\nif (file_exists($pdfRendererClassFile)) {\n    require_once $pdfRendererClassFile;\n} else {\n    throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library');\n}\n\n/**\n *  PHPExcel_Writer_PDF_mPDF\n *\n *  Copyright (c) 2006 - 2015 PHPExcel\n *\n *  This library is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU Lesser General Public\n *  License as published by the Free Software Foundation; either\n *  version 2.1 of the License, or (at your option) any later version.\n *\n *  This library is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *  Lesser General Public License for more details.\n *\n *  You should have received a copy of the GNU Lesser General Public\n *  License along with this library; if not, write to the Free Software\n *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *  @category    PHPExcel\n *  @package     PHPExcel_Writer_PDF\n *  @copyright   Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *  @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *  @version     ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_PDF_mPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter\n{\n    /**\n     *  Create a new PHPExcel_Writer_PDF\n     *\n     *  @param  PHPExcel  $phpExcel  PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        parent::__construct($phpExcel);\n    }\n\n    /**\n     *  Save PHPExcel to file\n     *\n     *  @param     string     $pFilename   Name of the file to save as\n     *  @throws    PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        $fileHandle = parent::prepareForSave($pFilename);\n\n        //  Default PDF paper size\n        $paperSize = 'LETTER';    //    Letter    (8.5 in. by 11 in.)\n\n        //  Check for paper size and page orientation\n        if (is_null($this->getSheetIndex())) {\n            $orientation = ($this->phpExcel->getSheet(0)->getPageSetup()->getOrientation()\n                == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';\n            $printPaperSize = $this->phpExcel->getSheet(0)->getPageSetup()->getPaperSize();\n            $printMargins = $this->phpExcel->getSheet(0)->getPageMargins();\n        } else {\n            $orientation = ($this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation()\n                == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';\n            $printPaperSize = $this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize();\n            $printMargins = $this->phpExcel->getSheet($this->getSheetIndex())->getPageMargins();\n        }\n        $this->setOrientation($orientation);\n\n        //  Override Page Orientation\n        if (!is_null($this->getOrientation())) {\n            $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT)\n                ? PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT\n                : $this->getOrientation();\n        }\n        $orientation = strtoupper($orientation);\n\n        //  Override Paper Size\n        if (!is_null($this->getPaperSize())) {\n            $printPaperSize = $this->getPaperSize();\n        }\n\n        if (isset(self::$paperSizes[$printPaperSize])) {\n            $paperSize = self::$paperSizes[$printPaperSize];\n        }\n\n\n        //  Create PDF\n        $pdf = new mpdf();\n        $ortmp = $orientation;\n        $pdf->_setPageSize(strtoupper($paperSize), $ortmp);\n        $pdf->DefOrientation = $orientation;\n        $pdf->AddPage($orientation);\n\n        //  Document info\n        $pdf->SetTitle($this->phpExcel->getProperties()->getTitle());\n        $pdf->SetAuthor($this->phpExcel->getProperties()->getCreator());\n        $pdf->SetSubject($this->phpExcel->getProperties()->getSubject());\n        $pdf->SetKeywords($this->phpExcel->getProperties()->getKeywords());\n        $pdf->SetCreator($this->phpExcel->getProperties()->getCreator());\n\n        $pdf->WriteHTML(\n            $this->generateHTMLHeader(false) .\n            $this->generateSheetData() .\n            $this->generateHTMLFooter()\n        );\n\n        //  Write to file\n        fwrite($fileHandle, $pdf->Output('', 'S'));\n\n        parent::restoreStateAfterSave($fileHandle);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/PDF/tcPDF.php",
    "content": "<?php\n\n/**  Require tcPDF library */\n$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/tcpdf.php';\nif (file_exists($pdfRendererClassFile)) {\n    $k_path_url = PHPExcel_Settings::getPdfRendererPath();\n    require_once $pdfRendererClassFile;\n} else {\n    throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library');\n}\n\n/**\n *  PHPExcel_Writer_PDF_tcPDF\n *\n *  Copyright (c) 2006 - 2015 PHPExcel\n *\n *  This library is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU Lesser General Public\n *  License as published by the Free Software Foundation; either\n *  version 2.1 of the License, or (at your option) any later version.\n *\n *  This library is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *  Lesser General Public License for more details.\n *\n *  You should have received a copy of the GNU Lesser General Public\n *  License along with this library; if not, write to the Free Software\n *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *  @category    PHPExcel\n *  @package     PHPExcel_Writer_PDF\n *  @copyright   Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *  @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *  @version     ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_PDF_tcPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter\n{\n    /**\n     *  Create a new PHPExcel_Writer_PDF\n     *\n     *  @param  PHPExcel  $phpExcel  PHPExcel object\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        parent::__construct($phpExcel);\n    }\n\n    /**\n     *  Save PHPExcel to file\n     *\n     *  @param     string     $pFilename   Name of the file to save as\n     *  @throws    PHPExcel_Writer_Exception\n     */\n    public function save($pFilename = null)\n    {\n        $fileHandle = parent::prepareForSave($pFilename);\n\n        //  Default PDF paper size\n        $paperSize = 'LETTER';    //    Letter    (8.5 in. by 11 in.)\n\n        //  Check for paper size and page orientation\n        if (is_null($this->getSheetIndex())) {\n            $orientation = ($this->phpExcel->getSheet(0)->getPageSetup()->getOrientation()\n                == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';\n            $printPaperSize = $this->phpExcel->getSheet(0)->getPageSetup()->getPaperSize();\n            $printMargins = $this->phpExcel->getSheet(0)->getPageMargins();\n        } else {\n            $orientation = ($this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation()\n                == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';\n            $printPaperSize = $this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize();\n            $printMargins = $this->phpExcel->getSheet($this->getSheetIndex())->getPageMargins();\n        }\n\n        //  Override Page Orientation\n        if (!is_null($this->getOrientation())) {\n            $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE)\n                ? 'L'\n                : 'P';\n        }\n        //  Override Paper Size\n        if (!is_null($this->getPaperSize())) {\n            $printPaperSize = $this->getPaperSize();\n        }\n\n        if (isset(self::$paperSizes[$printPaperSize])) {\n            $paperSize = self::$paperSizes[$printPaperSize];\n        }\n\n\n        //  Create PDF\n        $pdf = new TCPDF($orientation, 'pt', $paperSize);\n        $pdf->setFontSubsetting(false);\n        //    Set margins, converting inches to points (using 72 dpi)\n        $pdf->SetMargins($printMargins->getLeft() * 72, $printMargins->getTop() * 72, $printMargins->getRight() * 72);\n        $pdf->SetAutoPageBreak(true, $printMargins->getBottom() * 72);\n\n        $pdf->setPrintHeader(false);\n        $pdf->setPrintFooter(false);\n\n        $pdf->AddPage();\n\n        //  Set the appropriate font\n        $pdf->SetFont($this->getFont());\n        $pdf->writeHTML(\n            $this->generateHTMLHeader(false) .\n            $this->generateSheetData() .\n            $this->generateHTMLFooter()\n        );\n\n        //  Document info\n        $pdf->SetTitle($this->phpExcel->getProperties()->getTitle());\n        $pdf->SetAuthor($this->phpExcel->getProperties()->getCreator());\n        $pdf->SetSubject($this->phpExcel->getProperties()->getSubject());\n        $pdf->SetKeywords($this->phpExcel->getProperties()->getKeywords());\n        $pdf->SetCreator($this->phpExcel->getProperties()->getCreator());\n\n        //  Write to file\n        fwrite($fileHandle, $pdf->output($pFilename, 'S'));\n\n        parent::restoreStateAfterSave($fileHandle);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/Writer/PDF.php",
    "content": "<?php\n\n/**\n *  PHPExcel_Writer_PDF\n *\n *  Copyright (c) 2006 - 2015 PHPExcel\n *\n *  This library is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU Lesser General Public\n *  License as published by the Free Software Foundation; either\n *  version 2.1 of the License, or (at your option) any later version.\n *\n *  This library is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n *  Lesser General Public License for more details.\n *\n *  You should have received a copy of the GNU Lesser General Public\n *  License along with this library; if not, write to the Free Software\n *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n *  @category    PHPExcel\n *  @package     PHPExcel_Writer_PDF\n *  @copyright   Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n *  @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n *  @version     ##VERSION##, ##DATE##\n */\nclass PHPExcel_Writer_PDF implements PHPExcel_Writer_IWriter\n{\n\n    /**\n     * The wrapper for the requested PDF rendering engine\n     *\n     * @var PHPExcel_Writer_PDF_Core\n     */\n    private $renderer = null;\n\n    /**\n     *  Instantiate a new renderer of the configured type within this container class\n     *\n     *  @param  PHPExcel   $phpExcel         PHPExcel object\n     *  @throws PHPExcel_Writer_Exception    when PDF library is not configured\n     */\n    public function __construct(PHPExcel $phpExcel)\n    {\n        $pdfLibraryName = PHPExcel_Settings::getPdfRendererName();\n        if (is_null($pdfLibraryName)) {\n            throw new PHPExcel_Writer_Exception(\"PDF Rendering library has not been defined.\");\n        }\n\n        $pdfLibraryPath = PHPExcel_Settings::getPdfRendererPath();\n        if (is_null($pdfLibraryName)) {\n            throw new PHPExcel_Writer_Exception(\"PDF Rendering library path has not been defined.\");\n        }\n        $includePath = str_replace('\\\\', '/', get_include_path());\n        $rendererPath = str_replace('\\\\', '/', $pdfLibraryPath);\n        if (strpos($rendererPath, $includePath) === false) {\n            set_include_path(get_include_path() . PATH_SEPARATOR . $pdfLibraryPath);\n        }\n\n        $rendererName = 'PHPExcel_Writer_PDF_' . $pdfLibraryName;\n        $this->renderer = new $rendererName($phpExcel);\n    }\n\n\n    /**\n     *  Magic method to handle direct calls to the configured PDF renderer wrapper class.\n     *\n     *  @param   string   $name        Renderer library method name\n     *  @param   mixed[]  $arguments   Array of arguments to pass to the renderer method\n     *  @return  mixed    Returned data from the PDF renderer wrapper method\n     */\n    public function __call($name, $arguments)\n    {\n        if ($this->renderer === null) {\n            throw new PHPExcel_Writer_Exception(\"PDF Rendering library has not been defined.\");\n        }\n\n        return call_user_func_array(array($this->renderer, $name), $arguments);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function save($pFilename = null)\n    {\n        $this->renderer->save($pFilename);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/bg/config",
    "content": "##\n## PHPExcel\n##\n\n## Copyright (c) 2006 - 2013 PHPExcel\n##\n## This library is free software; you can redistribute it and/or\n## modify it under the terms of the GNU Lesser General Public\n## License as published by the Free Software Foundation; either\n## version 2.1 of the License, or (at your option) any later version.\n##\n## This library is distributed in the hope that it will be useful,\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n## Lesser General Public License for more details.\n##\n## You should have received a copy of the GNU Lesser General Public\n## License along with this library; if not, write to the Free Software\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n##\n## @category   PHPExcel\n## @package    PHPExcel_Settings\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt  LGPL\n## @version    ##VERSION##, ##DATE##\n##\n##\n\n\nArgumentSeparator\t= ;\n\n\n##\n##\t(For future use)\n##\ncurrencySymbol\t= лв\n\n\n##\n##\tExcel Error Codes\t(For future use)\n\n##\nNULL\t= #ПРАЗНО!\nDIV0\t= #ДЕЛ/0!\nVALUE\t= #СТОЙНОСТ!\nREF\t= #РЕФ!\nNAME\t= #ИМЕ?\nNUM\t= #ЧИСЛО!\nNA\t= #Н/Д\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/cs/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= Kč\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\n##\r\nNULL\t= #NULL!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #HODNOTA!\r\nREF\t= #REF!\r\nNAME\t= #NÁZEV?\r\nNUM\t= #NUM!\r\nNA\t= #N/A\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/cs/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\tFunkce doplňků a automatizace\r\n##\r\nGETPIVOTDATA\t\t= ZÍSKATKONTDATA\t##\tVrátí data uložená v kontingenční tabulce. Pomocí funkce ZÍSKATKONTDATA můžete načíst souhrnná data z kontingenční tabulky, pokud jsou tato data v kontingenční sestavě zobrazena.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\tFunkce pro práci s krychlemi\r\n##\r\nCUBEKPIMEMBER\t\t= CUBEKPIMEMBER\t\t##\tVrátí název, vlastnost a velikost klíčového ukazatele výkonu (KUV) a zobrazí v buňce název a vlastnost. Klíčový ukazatel výkonu je kvantifikovatelná veličina, například hrubý měsíční zisk nebo čtvrtletní obrat na zaměstnance, která se používá pro sledování výkonnosti organizace.\r\nCUBEMEMBER\t\t= CUBEMEMBER\t\t##\tVrátí člen nebo n-tici v hierarchii krychle. Slouží k ověření, zda v krychli existuje člen nebo n-tice.\r\nCUBEMEMBERPROPERTY\t= CUBEMEMBERPROPERTY\t##\tVrátí hodnotu vlastnosti člena v krychli. Slouží k ověření, zda v krychli existuje člen s daným názvem, a k vrácení konkrétní vlastnosti tohoto člena.\r\nCUBERANKEDMEMBER\t= CUBERANKEDMEMBER\t##\tVrátí n-tý nebo pořadový člen sady. Použijte ji pro vrácení jednoho nebo více prvků sady, například obchodníka s nejvyšším obratem nebo deseti nejlepších studentů.\r\nCUBESET\t\t\t= CUBESET\t\t##\tDefinuje vypočtenou sadu členů nebo n-tic odesláním výrazu sady do krychle na serveru, který vytvoří sadu a potom ji vrátí do aplikace Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= CUBESETCOUNT\t\t##\tVrátí počet položek v množině\r\nCUBEVALUE\t\t= CUBEVALUE\t\t##\tVrátí úhrnnou hodnotu z krychle.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\tFunkce databáze\r\n##\r\nDAVERAGE\t\t= DPRŮMĚR\t\t##\tVrátí průměr vybraných položek databáze.\r\nDCOUNT\t\t\t= DPOČET\t\t##\tSpočítá buňky databáze obsahující čísla.\r\nDCOUNTA\t\t\t= DPOČET2\t\t##\tSpočítá buňky databáze, které nejsou prázdné.\r\nDGET\t\t\t= DZÍSKAT\t\t##\tExtrahuje z databáze jeden záznam splňující zadaná kritéria.\r\nDMAX\t\t\t= DMAX\t\t\t##\tVrátí maximální hodnotu z vybraných položek databáze.\r\nDMIN\t\t\t= DMIN\t\t\t##\tVrátí minimální hodnotu z vybraných položek databáze.\r\nDPRODUCT\t\t= DSOUČIN\t\t##\tVynásobí hodnoty určitého pole záznamů v databázi, které splňují daná kritéria.\r\nDSTDEV\t\t\t= DSMODCH.VÝBĚR\t\t##\tOdhadne směrodatnou odchylku výběru vybraných položek databáze.\r\nDSTDEVP\t\t\t= DSMODCH\t\t##\tVypočte směrodatnou odchylku základního souboru vybraných položek databáze.\r\nDSUM\t\t\t= DSUMA\t\t\t##\tSečte čísla ve sloupcovém poli záznamů databáze, která splňují daná kritéria.\r\nDVAR\t\t\t= DVAR.VÝBĚR\t\t##\tOdhadne rozptyl výběru vybraných položek databáze.\r\nDVARP\t\t\t= DVAR\t\t\t##\tVypočte rozptyl základního souboru vybraných položek databáze.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\tFunkce data a času\r\n##\r\nDATE\t\t\t= DATUM\t\t\t##\tVrátí pořadové číslo určitého data.\r\nDATEVALUE\t\t= DATUMHODN\t\t##\tPřevede datum ve formě textu na pořadové číslo.\r\nDAY\t\t\t= DEN\t\t\t##\tPřevede pořadové číslo na den v měsíci.\r\nDAYS360\t\t\t= ROK360\t\t##\tVrátí počet dní mezi dvěma daty na základě roku s 360 dny.\r\nEDATE\t\t\t= EDATE\t\t\t##\tVrátí pořadové číslo data, které označuje určený počet měsíců před nebo po počátečním datu.\r\nEOMONTH\t\t\t= EOMONTH\t\t##\tVrátí pořadové číslo posledního dne měsíce před nebo po zadaném počtu měsíců.\r\nHOUR\t\t\t= HODINA\t\t##\tPřevede pořadové číslo na hodinu.\r\nMINUTE\t\t\t= MINUTA\t\t##\tPřevede pořadové číslo na minutu.\r\nMONTH\t\t\t= MĚSÍC\t\t\t##\tPřevede pořadové číslo na měsíc.\r\nNETWORKDAYS\t\t= NETWORKDAYS\t\t##\tVrátí počet celých pracovních dní mezi dvěma daty.\r\nNOW\t\t\t= NYNÍ\t\t\t##\tVrátí pořadové číslo aktuálního data a času.\r\nSECOND\t\t\t= SEKUNDA\t\t##\tPřevede pořadové číslo na sekundu.\r\nTIME\t\t\t= ČAS\t\t\t##\tVrátí pořadové číslo určitého času.\r\nTIMEVALUE\t\t= ČASHODN\t\t##\tPřevede čas ve formě textu na pořadové číslo.\r\nTODAY\t\t\t= DNES\t\t\t##\tVrátí pořadové číslo dnešního data.\r\nWEEKDAY\t\t\t= DENTÝDNE\t\t##\tPřevede pořadové číslo na den v týdnu.\r\nWEEKNUM\t\t\t= WEEKNUM\t\t##\tPřevede pořadové číslo na číslo představující číselnou pozici týdne v roce.\r\nWORKDAY\t\t\t= WORKDAY\t\t##\tVrátí pořadové číslo data před nebo po zadaném počtu pracovních dní.\r\nYEAR\t\t\t= ROK\t\t\t##\tPřevede pořadové číslo na rok.\r\nYEARFRAC\t\t= YEARFRAC\t\t##\tVrátí část roku vyjádřenou zlomkem a představující počet celých dní mezi počátečním a koncovým datem.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\tInženýrské funkce (Technické funkce)\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t##\tVrátí modifikovanou Besselovu funkci In(x).\r\nBESSELJ\t\t\t= BESSELJ\t\t##\tVrátí modifikovanou Besselovu funkci Jn(x).\r\nBESSELK\t\t\t= BESSELK\t\t##\tVrátí modifikovanou Besselovu funkci Kn(x).\r\nBESSELY\t\t\t= BESSELY\t\t##\tVrátí Besselovu funkci Yn(x).\r\nBIN2DEC\t\t\t= BIN2DEC\t\t##\tPřevede binární číslo na desítkové.\r\nBIN2HEX\t\t\t= BIN2HEX\t\t##\tPřevede binární číslo na šestnáctkové.\r\nBIN2OCT\t\t\t= BIN2OCT\t\t##\tPřevede binární číslo na osmičkové.\r\nCOMPLEX\t\t\t= COMPLEX\t\t##\tPřevede reálnou a imaginární část na komplexní číslo.\r\nCONVERT\t\t\t= CONVERT\t\t##\tPřevede číslo do jiného jednotkového měrného systému.\r\nDEC2BIN\t\t\t= DEC2BIN\t\t##\tPřevede desítkového čísla na dvojkové\r\nDEC2HEX\t\t\t= DEC2HEX\t\t##\tPřevede desítkové číslo na šestnáctkové.\r\nDEC2OCT\t\t\t= DEC2OCT\t\t##\tPřevede desítkové číslo na osmičkové.\r\nDELTA\t\t\t= DELTA\t\t\t##\tTestuje rovnost dvou hodnot.\r\nERF\t\t\t= ERF\t\t\t##\tVrátí chybovou funkci.\r\nERFC\t\t\t= ERFC\t\t\t##\tVrátí doplňkovou chybovou funkci.\r\nGESTEP\t\t\t= GESTEP\t\t##\tTestuje, zda je číslo větší než mezní hodnota.\r\nHEX2BIN\t\t\t= HEX2BIN\t\t##\tPřevede šestnáctkové číslo na binární.\r\nHEX2DEC\t\t\t= HEX2DEC\t\t##\tPřevede šestnáctkové číslo na desítkové.\r\nHEX2OCT\t\t\t= HEX2OCT\t\t##\tPřevede šestnáctkové číslo na osmičkové.\r\nIMABS\t\t\t= IMABS\t\t\t##\tVrátí absolutní hodnotu (modul) komplexního čísla.\r\nIMAGINARY\t\t= IMAGINARY\t\t##\tVrátí imaginární část komplexního čísla.\r\nIMARGUMENT\t\t= IMARGUMENT\t\t##\tVrátí argument théta, úhel vyjádřený v radiánech.\r\nIMCONJUGATE\t\t= IMCONJUGATE\t\t##\tVrátí komplexně sdružené číslo ke komplexnímu číslu.\r\nIMCOS\t\t\t= IMCOS\t\t\t##\tVrátí kosinus komplexního čísla.\r\nIMDIV\t\t\t= IMDIV\t\t\t##\tVrátí podíl dvou komplexních čísel.\r\nIMEXP\t\t\t= IMEXP\t\t\t##\tVrátí exponenciální tvar komplexního čísla.\r\nIMLN\t\t\t= IMLN\t\t\t##\tVrátí přirozený logaritmus komplexního čísla.\r\nIMLOG10\t\t\t= IMLOG10\t\t##\tVrátí dekadický logaritmus komplexního čísla.\r\nIMLOG2\t\t\t= IMLOG2\t\t##\tVrátí logaritmus komplexního čísla při základu 2.\r\nIMPOWER\t\t\t= IMPOWER\t\t##\tVrátí komplexní číslo umocněné na celé číslo.\r\nIMPRODUCT\t\t= IMPRODUCT\t\t##\tVrátí součin komplexních čísel.\r\nIMREAL\t\t\t= IMREAL\t\t##\tVrátí reálnou část komplexního čísla.\r\nIMSIN\t\t\t= IMSIN\t\t\t##\tVrátí sinus komplexního čísla.\r\nIMSQRT\t\t\t= IMSQRT\t\t##\tVrátí druhou odmocninu komplexního čísla.\r\nIMSUB\t\t\t= IMSUB\t\t\t##\tVrátí rozdíl mezi dvěma komplexními čísly.\r\nIMSUM\t\t\t= IMSUM\t\t\t##\tVrátí součet dvou komplexních čísel.\r\nOCT2BIN\t\t\t= OCT2BIN\t\t##\tPřevede osmičkové číslo na binární.\r\nOCT2DEC\t\t\t= OCT2DEC\t\t##\tPřevede osmičkové číslo na desítkové.\r\nOCT2HEX\t\t\t= OCT2HEX\t\t##\tPřevede osmičkové číslo na šestnáctkové.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\tFinanční funkce\r\n##\r\nACCRINT\t\t\t= ACCRINT\t\t##\tVrátí nahromaděný úrok z cenného papíru, ze kterého je úrok placen v pravidelných termínech.\r\nACCRINTM\t\t= ACCRINTM\t\t##\tVrátí nahromaděný úrok z cenného papíru, ze kterého je úrok placen k datu splatnosti.\r\nAMORDEGRC\t\t= AMORDEGRC\t\t##\tVrátí lineární amortizaci v každém účetním období pomocí koeficientu amortizace.\r\nAMORLINC\t\t= AMORLINC\t\t##\tVrátí lineární amortizaci v každém účetním období.\r\nCOUPDAYBS\t\t= COUPDAYBS\t\t##\tVrátí počet dnů od začátku období placení kupónů do data splatnosti.\r\nCOUPDAYS\t\t= COUPDAYS\t\t##\tVrátí počet dnů v období placení kupónů, které obsahuje den zúčtování.\r\nCOUPDAYSNC\t\t= COUPDAYSNC\t\t##\tVrátí počet dnů od data zúčtování do následujícího data placení kupónu.\r\nCOUPNCD\t\t\t= COUPNCD\t\t##\tVrátí následující datum placení kupónu po datu zúčtování.\r\nCOUPNUM\t\t\t= COUPNUM\t\t##\tVrátí počet kupónů splatných mezi datem zúčtování a datem splatnosti.\r\nCOUPPCD\t\t\t= COUPPCD\t\t##\tVrátí předchozí datum placení kupónu před datem zúčtování.\r\nCUMIPMT\t\t\t= CUMIPMT\t\t##\tVrátí kumulativní úrok splacený mezi dvěma obdobími.\r\nCUMPRINC\t\t= CUMPRINC\t\t##\tVrátí kumulativní jistinu splacenou mezi dvěma obdobími půjčky.\r\nDB\t\t\t= ODPIS.ZRYCH\t\t##\tVrátí odpis aktiva za určité období pomocí degresivní metody odpisu s pevným zůstatkem.\r\nDDB\t\t\t= ODPIS.ZRYCH2\t\t##\tVrátí odpis aktiva za určité období pomocí dvojité degresivní metody odpisu nebo jiné metody, kterou zadáte.\r\nDISC\t\t\t= DISC\t\t\t##\tVrátí diskontní sazbu cenného papíru.\r\nDOLLARDE\t\t= DOLLARDE\t\t##\tPřevede částku v korunách vyjádřenou zlomkem na částku v korunách vyjádřenou desetinným číslem.\r\nDOLLARFR\t\t= DOLLARFR\t\t##\tPřevede částku v korunách vyjádřenou desetinným číslem na částku v korunách vyjádřenou zlomkem.\r\nDURATION\t\t= DURATION\t\t##\tVrátí roční dobu cenného papíru s pravidelnými úrokovými sazbami.\r\nEFFECT\t\t\t= EFFECT\t\t##\tVrátí efektivní roční úrokovou sazbu.\r\nFV\t\t\t= BUDHODNOTA\t\t##\tVrátí budoucí hodnotu investice.\r\nFVSCHEDULE\t\t= FVSCHEDULE\t\t##\tVrátí budoucí hodnotu počáteční jistiny po použití série sazeb složitého úroku.\r\nINTRATE\t\t\t= INTRATE\t\t##\tVrátí úrokovou sazbu plně investovaného cenného papíru.\r\nIPMT\t\t\t= PLATBA.ÚROK\t\t##\tVrátí výšku úroku investice za dané období.\r\nIRR\t\t\t= MÍRA.VÝNOSNOSTI\t##\tVrátí vnitřní výnosové procento série peněžních toků.\r\nISPMT\t\t\t= ISPMT\t\t\t##\tVypočte výši úroku z investice zaplaceného během určitého období.\r\nMDURATION\t\t= MDURATION\t\t##\tVrátí Macauleyho modifikovanou dobu cenného papíru o nominální hodnotě 100 Kč.\r\nMIRR\t\t\t= MOD.MÍRA.VÝNOSNOSTI\t##\tVrátí vnitřní sazbu výnosu, přičemž kladné a záporné hodnoty peněžních prostředků jsou financovány podle různých sazeb.\r\nNOMINAL\t\t\t= NOMINAL\t\t##\tVrátí nominální roční úrokovou sazbu.\r\nNPER\t\t\t= POČET.OBDOBÍ\t\t##\tVrátí počet období pro investici.\r\nNPV\t\t\t= ČISTÁ.SOUČHODNOTA\t##\tVrátí čistou současnou hodnotu investice vypočítanou na základě série pravidelných peněžních toků a diskontní sazby.\r\nODDFPRICE\t\t= ODDFPRICE\t\t##\tVrátí cenu cenného papíru o nominální hodnotě 100 Kč s odlišným prvním obdobím.\r\nODDFYIELD\t\t= ODDFYIELD\t\t##\tVrátí výnos cenného papíru s odlišným prvním obdobím.\r\nODDLPRICE\t\t= ODDLPRICE\t\t##\tVrátí cenu cenného papíru o nominální hodnotě 100 Kč s odlišným posledním obdobím.\r\nODDLYIELD\t\t= ODDLYIELD\t\t##\tVrátí výnos cenného papíru s odlišným posledním obdobím.\r\nPMT\t\t\t= PLATBA\t\t##\tVrátí hodnotu pravidelné splátky anuity.\r\nPPMT\t\t\t= PLATBA.ZÁKLAD\t\t##\tVrátí hodnotu splátky jistiny pro zadanou investici za dané období.\r\nPRICE\t\t\t= PRICE\t\t\t##\tVrátí cenu cenného papíru o nominální hodnotě 100 Kč, ze kterého je úrok placen v pravidelných termínech.\r\nPRICEDISC\t\t= PRICEDISC\t\t##\tVrátí cenu diskontního cenného papíru o nominální hodnotě 100 Kč.\r\nPRICEMAT\t\t= PRICEMAT\t\t##\tVrátí cenu cenného papíru o nominální hodnotě 100 Kč, ze kterého je úrok placen k datu splatnosti.\r\nPV\t\t\t= SOUČHODNOTA\t\t##\tVrátí současnou hodnotu investice.\r\nRATE\t\t\t= ÚROKOVÁ.MÍRA\t\t##\tVrátí úrokovou sazbu vztaženou na období anuity.\r\nRECEIVED\t\t= RECEIVED\t\t##\tVrátí částku obdrženou k datu splatnosti plně investovaného cenného papíru.\r\nSLN\t\t\t= ODPIS.LIN\t\t##\tVrátí přímé odpisy aktiva pro jedno období.\r\nSYD\t\t\t= ODPIS.NELIN\t\t##\tVrátí směrné číslo ročních odpisů aktiva pro zadané období.\r\nTBILLEQ\t\t\t= TBILLEQ\t\t##\tVrátí výnos směnky státní pokladny ekvivalentní výnosu obligace.\r\nTBILLPRICE\t\t= TBILLPRICE\t\t##\tVrátí cenu směnky státní pokladny o nominální hodnotě 100 Kč.\r\nTBILLYIELD\t\t= TBILLYIELD\t\t##\tVrátí výnos směnky státní pokladny.\r\nVDB\t\t\t= ODPIS.ZA.INT\t\t##\tVrátí odpis aktiva pro určité období nebo část období pomocí degresivní metody odpisu.\r\nXIRR\t\t\t= XIRR\t\t\t##\tVrátí vnitřní výnosnost pro harmonogram peněžních toků, který nemusí být nutně periodický.\r\nXNPV\t\t\t= XNPV\t\t\t##\tVrátí čistou současnou hodnotu pro harmonogram peněžních toků, který nemusí být nutně periodický.\r\nYIELD\t\t\t= YIELD\t\t\t##\tVrátí výnos cenného papíru, ze kterého je úrok placen v pravidelných termínech.\r\nYIELDDISC\t\t= YIELDDISC\t\t##\tVrátí roční výnos diskontního cenného papíru, například směnky státní pokladny.\r\nYIELDMAT\t\t= YIELDMAT\t\t##\tVrátí roční výnos cenného papíru, ze kterého je úrok placen k datu splatnosti.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\tInformační funkce\r\n##\r\nCELL\t\t\t= POLÍČKO\t\t##\tVrátí informace o formátování, umístění nebo obsahu buňky.\r\nERROR.TYPE\t\t= CHYBA.TYP\t\t##\tVrátí číslo odpovídající typu chyby.\r\nINFO\t\t\t= O.PROSTŘEDÍ\t\t##\tVrátí informace o aktuálním pracovním prostředí.\r\nISBLANK\t\t\t= JE.PRÁZDNÉ\t\t##\tVrátí hodnotu PRAVDA, pokud se argument hodnota odkazuje na prázdnou buňku.\r\nISERR\t\t\t= JE.CHYBA\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota libovolná chybová hodnota (kromě #N/A).\r\nISERROR\t\t\t= JE.CHYBHODN\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota libovolná chybová hodnota.\r\nISEVEN\t\t\t= ISEVEN\t\t##\tVrátí hodnotu PRAVDA, pokud je číslo sudé.\r\nISLOGICAL\t\t= JE.LOGHODN\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota logická hodnota.\r\nISNA\t\t\t= JE.NEDEF\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota chybová hodnota #N/A.\r\nISNONTEXT\t\t= JE.NETEXT\t\t##\tVrátí hodnotu PRAVDA, pokud argument hodnota není text.\r\nISNUMBER\t\t= JE.ČÍSLO\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota číslo.\r\nISODD\t\t\t= ISODD\t\t\t##\tVrátí hodnotu PRAVDA, pokud je číslo liché.\r\nISREF\t\t\t= JE.ODKAZ\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota odkaz.\r\nISTEXT\t\t\t= JE.TEXT\t\t##\tVrátí hodnotu PRAVDA, pokud je argument hodnota text.\r\nN\t\t\t= N\t\t\t##\tVrátí hodnotu převedenou na číslo.\r\nNA\t\t\t= NEDEF\t\t\t##\tVrátí chybovou hodnotu #N/A.\r\nTYPE\t\t\t= TYP\t\t\t##\tVrátí číslo označující datový typ hodnoty.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\tLogické funkce\r\n##\r\nAND\t\t\t= A\t\t\t##\tVrátí hodnotu PRAVDA, mají-li všechny argumenty hodnotu PRAVDA.\r\nFALSE\t\t\t= NEPRAVDA\t\t##\tVrátí logickou hodnotu NEPRAVDA.\r\nIF\t\t\t= KDYŽ\t\t\t##\tUrčí, který logický test má proběhnout.\r\nIFERROR\t\t\t= IFERROR\t\t##\tPokud je vzorec vyhodnocen jako chyba, vrátí zadanou hodnotu. V opačném případě vrátí výsledek vzorce.\r\nNOT\t\t\t= NE\t\t\t##\tProvede logickou negaci argumentu funkce.\r\nOR\t\t\t= NEBO\t\t\t##\tVrátí hodnotu PRAVDA, je-li alespoň jeden argument roven hodnotě PRAVDA.\r\nTRUE\t\t\t= PRAVDA\t\t##\tVrátí logickou hodnotu PRAVDA.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\tVyhledávací funkce\r\n##\r\nADDRESS\t\t\t= ODKAZ\t\t\t##\tVrátí textový odkaz na jednu buňku listu.\r\nAREAS\t\t\t= POČET.BLOKŮ\t\t##\tVrátí počet oblastí v odkazu.\r\nCHOOSE\t\t\t= ZVOLIT\t\t##\tZvolí hodnotu ze seznamu hodnot.\r\nCOLUMN\t\t\t= SLOUPEC\t\t##\tVrátí číslo sloupce odkazu.\r\nCOLUMNS\t\t\t= SLOUPCE\t\t##\tVrátí počet sloupců v odkazu.\r\nHLOOKUP\t\t\t= VVYHLEDAT\t\t##\tProhledá horní řádek matice a vrátí hodnotu určené buňky.\r\nHYPERLINK\t\t= HYPERTEXTOVÝ.ODKAZ\t##\tVytvoří zástupce nebo odkaz, který otevře dokument uložený na síťovém serveru, v síti intranet nebo Internet.\r\nINDEX\t\t\t= INDEX\t\t\t##\tPomocí rejstříku zvolí hodnotu z odkazu nebo matice.\r\nINDIRECT\t\t= NEPŘÍMÝ.ODKAZ\t\t##\tVrátí odkaz určený textovou hodnotou.\r\nLOOKUP\t\t\t= VYHLEDAT\t\t##\tVyhledá hodnoty ve vektoru nebo matici.\r\nMATCH\t\t\t= POZVYHLEDAT\t\t##\tVyhledá hodnoty v odkazu nebo matici.\r\nOFFSET\t\t\t= POSUN\t\t\t##\tVrátí posun odkazu od zadaného odkazu.\r\nROW\t\t\t= ŘÁDEK\t\t\t##\tVrátí číslo řádku odkazu.\r\nROWS\t\t\t= ŘÁDKY\t\t\t##\tVrátí počet řádků v odkazu.\r\nRTD\t\t\t= RTD\t\t\t##\tNačte data reálného času z programu, který podporuje automatizaci modelu COM (Automatizace: Způsob práce s objekty určité aplikace z jiné aplikace nebo nástroje pro vývoj. Automatizace (dříve nazývaná automatizace OLE) je počítačovým standardem a je funkcí modelu COM (Component Object Model).).\r\nTRANSPOSE\t\t= TRANSPOZICE\t\t##\tVrátí transponovanou matici.\r\nVLOOKUP\t\t\t= SVYHLEDAT\t\t##\tProhledá první sloupec matice, přesune kurzor v řádku a vrátí hodnotu buňky.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\tMatematické a trigonometrické funkce\r\n##\r\nABS\t\t\t= ABS\t\t\t##\tVrátí absolutní hodnotu čísla.\r\nACOS\t\t\t= ARCCOS\t\t##\tVrátí arkuskosinus čísla.\r\nACOSH\t\t\t= ARCCOSH\t\t##\tVrátí hyperbolický arkuskosinus čísla.\r\nASIN\t\t\t= ARCSIN\t\t##\tVrátí arkussinus čísla.\r\nASINH\t\t\t= ARCSINH\t\t##\tVrátí hyperbolický arkussinus čísla.\r\nATAN\t\t\t= ARCTG\t\t\t##\tVrátí arkustangens čísla.\r\nATAN2\t\t\t= ARCTG2\t\t##\tVrátí arkustangens x-ové a y-ové souřadnice.\r\nATANH\t\t\t= ARCTGH\t\t##\tVrátí hyperbolický arkustangens čísla.\r\nCEILING\t\t\t= ZAOKR.NAHORU\t\t##\tZaokrouhlí číslo na nejbližší celé číslo nebo na nejbližší násobek zadané hodnoty.\r\nCOMBIN\t\t\t= KOMBINACE\t\t##\tVrátí počet kombinací pro daný počet položek.\r\nCOS\t\t\t= COS\t\t\t##\tVrátí kosinus čísla.\r\nCOSH\t\t\t= COSH\t\t\t##\tVrátí hyperbolický kosinus čísla.\r\nDEGREES\t\t\t= DEGREES\t\t##\tPřevede radiány na stupně.\r\nEVEN\t\t\t= ZAOKROUHLIT.NA.SUDÉ\t##\tZaokrouhlí číslo nahoru na nejbližší celé sudé číslo.\r\nEXP\t\t\t= EXP\t\t\t##\tVrátí základ přirozeného logaritmu e umocněný na zadané číslo.\r\nFACT\t\t\t= FAKTORIÁL\t\t##\tVrátí faktoriál čísla.\r\nFACTDOUBLE\t\t= FACTDOUBLE\t\t##\tVrátí dvojitý faktoriál čísla.\r\nFLOOR\t\t\t= ZAOKR.DOLŮ\t\t##\tZaokrouhlí číslo dolů, směrem k nule.\r\nGCD\t\t\t= GCD\t\t\t##\tVrátí největší společný dělitel.\r\nINT\t\t\t= CELÁ.ČÁST\t\t##\tZaokrouhlí číslo dolů na nejbližší celé číslo.\r\nLCM\t\t\t= LCM\t\t\t##\tVrátí nejmenší společný násobek.\r\nLN\t\t\t= LN\t\t\t##\tVrátí přirozený logaritmus čísla.\r\nLOG\t\t\t= LOGZ\t\t\t##\tVrátí logaritmus čísla při zadaném základu.\r\nLOG10\t\t\t= LOG\t\t\t##\tVrátí dekadický logaritmus čísla.\r\nMDETERM\t\t\t= DETERMINANT\t\t##\tVrátí determinant matice.\r\nMINVERSE\t\t= INVERZE\t\t##\tVrátí inverzní matici.\r\nMMULT\t\t\t= SOUČIN.MATIC\t\t##\tVrátí součin dvou matic.\r\nMOD\t\t\t= MOD\t\t\t##\tVrátí zbytek po dělení.\r\nMROUND\t\t\t= MROUND\t\t##\tVrátí číslo zaokrouhlené na požadovaný násobek.\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t##\tVrátí mnohočlen z množiny čísel.\r\nODD\t\t\t= ZAOKROUHLIT.NA.LICHÉ\t##\tZaokrouhlí číslo nahoru na nejbližší celé liché číslo.\r\nPI\t\t\t= PI\t\t\t##\tVrátí hodnotu čísla pí.\r\nPOWER\t\t\t= POWER\t\t\t##\tUmocní číslo na zadanou mocninu.\r\nPRODUCT\t\t\t= SOUČIN\t\t##\tVynásobí argumenty funkce.\r\nQUOTIENT\t\t= QUOTIENT\t\t##\tVrátí celou část dělení.\r\nRADIANS\t\t\t= RADIANS\t\t##\tPřevede stupně na radiány.\r\nRAND\t\t\t= NÁHČÍSLO\t\t##\tVrátí náhodné číslo mezi 0 a 1.\r\nRANDBETWEEN\t\t= RANDBETWEEN\t\t##\tVrátí náhodné číslo mezi zadanými čísly.\r\nROMAN\t\t\t= ROMAN\t\t\t##\tPřevede arabskou číslici na římskou ve formátu textu.\r\nROUND\t\t\t= ZAOKROUHLIT\t\t##\tZaokrouhlí číslo na zadaný počet číslic.\r\nROUNDDOWN\t\t= ROUNDDOWN\t\t##\tZaokrouhlí číslo dolů, směrem k nule.\r\nROUNDUP\t\t\t= ROUNDUP\t\t##\tZaokrouhlí číslo nahoru, směrem od nuly.\r\nSERIESSUM\t\t= SERIESSUM\t\t##\tVrátí součet mocninné řady určené podle vzorce.\r\nSIGN\t\t\t= SIGN\t\t\t##\tVrátí znaménko čísla.\r\nSIN\t\t\t= SIN\t\t\t##\tVrátí sinus daného úhlu.\r\nSINH\t\t\t= SINH\t\t\t##\tVrátí hyperbolický sinus čísla.\r\nSQRT\t\t\t= ODMOCNINA\t\t##\tVrátí kladnou druhou odmocninu.\r\nSQRTPI\t\t\t= SQRTPI\t\t##\tVrátí druhou odmocninu výrazu (číslo * pí).\r\nSUBTOTAL\t\t= SUBTOTAL\t\t##\tVrátí souhrn v seznamu nebo databázi.\r\nSUM\t\t\t= SUMA\t\t\t##\tSečte argumenty funkce.\r\nSUMIF\t\t\t= SUMIF\t\t\t##\tSečte buňky vybrané podle zadaných kritérií.\r\nSUMIFS\t\t\t= SUMIFS\t\t##\tSečte buňky určené více zadanými podmínkami.\r\nSUMPRODUCT\t\t= SOUČIN.SKALÁRNÍ\t##\tVrátí součet součinů odpovídajících prvků matic.\r\nSUMSQ\t\t\t= SUMA.ČTVERCŮ\t\t##\tVrátí součet čtverců argumentů.\r\nSUMX2MY2\t\t= SUMX2MY2\t\t##\tVrátí součet rozdílu čtverců odpovídajících hodnot ve dvou maticích.\r\nSUMX2PY2\t\t= SUMX2PY2\t\t##\tVrátí součet součtu čtverců odpovídajících hodnot ve dvou maticích.\r\nSUMXMY2\t\t\t= SUMXMY2\t\t##\tVrátí součet čtverců rozdílů odpovídajících hodnot ve dvou maticích.\r\nTAN\t\t\t= TGTG\t\t\t##\tVrátí tangens čísla.\r\nTANH\t\t\t= TGH\t\t\t##\tVrátí hyperbolický tangens čísla.\r\nTRUNC\t\t\t= USEKNOUT\t\t##\tZkrátí číslo na celé číslo.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\tStatistické funkce\r\n##\r\nAVEDEV\t\t\t= PRŮMODCHYLKA\t\t##\tVrátí průměrnou hodnotu absolutních odchylek datových bodů od jejich střední hodnoty.\r\nAVERAGE\t\t\t= PRŮMĚR\t\t##\tVrátí průměrnou hodnotu argumentů.\r\nAVERAGEA\t\t= AVERAGEA\t\t##\tVrátí průměrnou hodnotu argumentů včetně čísel, textu a logických hodnot.\r\nAVERAGEIF\t\t= AVERAGEIF\t\t##\tVrátí průměrnou hodnotu (aritmetický průměr) všech buněk v oblasti, které vyhovují příslušné podmínce.\r\nAVERAGEIFS\t\t= AVERAGEIFS\t\t##\tVrátí průměrnou hodnotu (aritmetický průměr) všech buněk vyhovujících několika podmínkám.\r\nBETADIST\t\t= BETADIST\t\t##\tVrátí hodnotu součtového rozdělení beta.\r\nBETAINV\t\t\t= BETAINV\t\t##\tVrátí inverzní hodnotu součtového rozdělení pro zadané rozdělení beta.\r\nBINOMDIST\t\t= BINOMDIST\t\t##\tVrátí hodnotu binomického rozdělení pravděpodobnosti jednotlivých veličin.\r\nCHIDIST\t\t\t= CHIDIST\t\t##\tVrátí jednostrannou pravděpodobnost rozdělení chí-kvadrát.\r\nCHIINV\t\t\t= CHIINV\t\t##\tVrátí hodnotu funkce inverzní k distribuční funkci jednostranné pravděpodobnosti rozdělení chí-kvadrát.\r\nCHITEST\t\t\t= CHITEST\t\t##\tVrátí test nezávislosti.\r\nCONFIDENCE\t\t= CONFIDENCE\t\t##\tVrátí interval spolehlivosti pro střední hodnotu základního souboru.\r\nCORREL\t\t\t= CORREL\t\t##\tVrátí korelační koeficient mezi dvěma množinami dat.\r\nCOUNT\t\t\t= POČET\t\t\t##\tVrátí počet čísel v seznamu argumentů.\r\nCOUNTA\t\t\t= POČET2\t\t##\tVrátí počet hodnot v seznamu argumentů.\r\nCOUNTBLANK\t\t= COUNTBLANK\t\t##\tSpočítá počet prázdných buněk v oblasti.\r\nCOUNTIF\t\t\t= COUNTIF\t\t##\tSpočítá buňky v oblasti, které odpovídají zadaným kritériím.\r\nCOUNTIFS\t\t= COUNTIFS\t\t##\tSpočítá buňky v oblasti, které odpovídají více kritériím.\r\nCOVAR\t\t\t= COVAR\t\t\t##\tVrátí hodnotu kovariance, průměrnou hodnotu součinů párových odchylek\r\nCRITBINOM\t\t= CRITBINOM\t\t##\tVrátí nejmenší hodnotu, pro kterou má součtové binomické rozdělení hodnotu větší nebo rovnu hodnotě kritéria.\r\nDEVSQ\t\t\t= DEVSQ\t\t\t##\tVrátí součet čtverců odchylek.\r\nEXPONDIST\t\t= EXPONDIST\t\t##\tVrátí hodnotu exponenciálního rozdělení.\r\nFDIST\t\t\t= FDIST\t\t\t##\tVrátí hodnotu rozdělení pravděpodobnosti F.\r\nFINV\t\t\t= FINV\t\t\t##\tVrátí hodnotu inverzní funkce k distribuční funkci rozdělení F.\r\nFISHER\t\t\t= FISHER\t\t##\tVrátí hodnotu Fisherovy transformace.\r\nFISHERINV\t\t= FISHERINV\t\t##\tVrátí hodnotu inverzní funkce k Fisherově transformaci.\r\nFORECAST\t\t= FORECAST\t\t##\tVrátí hodnotu lineárního trendu.\r\nFREQUENCY\t\t= ČETNOSTI\t\t##\tVrátí četnost rozdělení jako svislou matici.\r\nFTEST\t\t\t= FTEST\t\t\t##\tVrátí výsledek F-testu.\r\nGAMMADIST\t\t= GAMMADIST\t\t##\tVrátí hodnotu rozdělení gama.\r\nGAMMAINV\t\t= GAMMAINV\t\t##\tVrátí hodnotu inverzní funkce k distribuční funkci součtového rozdělení gama.\r\nGAMMALN\t\t\t= GAMMALN\t\t##\tVrátí přirozený logaritmus funkce gama, Γ(x).\r\nGEOMEAN\t\t\t= GEOMEAN\t\t##\tVrátí geometrický průměr.\r\nGROWTH\t\t\t= LOGLINTREND\t\t##\tVrátí hodnoty exponenciálního trendu.\r\nHARMEAN\t\t\t= HARMEAN\t\t##\tVrátí harmonický průměr.\r\nHYPGEOMDIST\t\t= HYPGEOMDIST\t\t##\tVrátí hodnotu hypergeometrického rozdělení.\r\nINTERCEPT\t\t= INTERCEPT\t\t##\tVrátí úsek lineární regresní čáry.\r\nKURT\t\t\t= KURT\t\t\t##\tVrátí hodnotu excesu množiny dat.\r\nLARGE\t\t\t= LARGE\t\t\t##\tVrátí k-tou největší hodnotu množiny dat.\r\nLINEST\t\t\t= LINREGRESE\t\t##\tVrátí parametry lineárního trendu.\r\nLOGEST\t\t\t= LOGLINREGRESE\t\t##\tVrátí parametry exponenciálního trendu.\r\nLOGINV\t\t\t= LOGINV\t\t##\tVrátí inverzní funkci k distribuční funkci logaritmicko-normálního rozdělení.\r\nLOGNORMDIST\t\t= LOGNORMDIST\t\t##\tVrátí hodnotu součtového logaritmicko-normálního rozdělení.\r\nMAX\t\t\t= MAX\t\t\t##\tVrátí maximální hodnotu seznamu argumentů.\r\nMAXA\t\t\t= MAXA\t\t\t##\tVrátí maximální hodnotu seznamu argumentů včetně čísel, textu a logických hodnot.\r\nMEDIAN\t\t\t= MEDIAN\t\t##\tVrátí střední hodnotu zadaných čísel.\r\nMIN\t\t\t= MIN\t\t\t##\tVrátí minimální hodnotu seznamu argumentů.\r\nMINA\t\t\t= MINA\t\t\t##\tVrátí nejmenší hodnotu v seznamu argumentů včetně čísel, textu a logických hodnot.\r\nMODE\t\t\t= MODE\t\t\t##\tVrátí hodnotu, která se v množině dat vyskytuje nejčastěji.\r\nNEGBINOMDIST\t\t= NEGBINOMDIST\t\t##\tVrátí hodnotu negativního binomického rozdělení.\r\nNORMDIST\t\t= NORMDIST\t\t##\tVrátí hodnotu normálního součtového rozdělení.\r\nNORMINV\t\t\t= NORMINV\t\t##\tVrátí inverzní funkci k funkci normálního součtového rozdělení.\r\nNORMSDIST\t\t= NORMSDIST\t\t##\tVrátí hodnotu standardního normálního součtového rozdělení.\r\nNORMSINV\t\t= NORMSINV\t\t##\tVrátí inverzní funkci k funkci standardního normálního součtového rozdělení.\r\nPEARSON\t\t\t= PEARSON\t\t##\tVrátí Pearsonův výsledný momentový korelační koeficient.\r\nPERCENTILE\t\t= PERCENTIL\t\t##\tVrátí hodnotu k-tého percentilu hodnot v oblasti.\r\nPERCENTRANK\t\t= PERCENTRANK\t\t##\tVrátí pořadí hodnoty v množině dat vyjádřené procentuální částí množiny dat.\r\nPERMUT\t\t\t= PERMUTACE\t\t##\tVrátí počet permutací pro zadaný počet objektů.\r\nPOISSON\t\t\t= POISSON\t\t##\tVrátí hodnotu distribuční funkce Poissonova rozdělení.\r\nPROB\t\t\t= PROB\t\t\t##\tVrátí pravděpodobnost výskytu hodnot v oblasti mezi dvěma mezními hodnotami.\r\nQUARTILE\t\t= QUARTIL\t\t##\tVrátí hodnotu kvartilu množiny dat.\r\nRANK\t\t\t= RANK\t\t\t##\tVrátí pořadí čísla v seznamu čísel.\r\nRSQ\t\t\t= RKQ\t\t\t##\tVrátí druhou mocninu Pearsonova výsledného momentového korelačního koeficientu.\r\nSKEW\t\t\t= SKEW\t\t\t##\tVrátí zešikmení rozdělení.\r\nSLOPE\t\t\t= SLOPE\t\t\t##\tVrátí směrnici lineární regresní čáry.\r\nSMALL\t\t\t= SMALL\t\t\t##\tVrátí k-tou nejmenší hodnotu množiny dat.\r\nSTANDARDIZE\t\t= STANDARDIZE\t\t##\tVrátí normalizovanou hodnotu.\r\nSTDEV\t\t\t= SMODCH.VÝBĚR\t\t##\tVypočte směrodatnou odchylku výběru.\r\nSTDEVA\t\t\t= STDEVA\t\t##\tVypočte směrodatnou odchylku výběru včetně čísel, textu a logických hodnot.\r\nSTDEVP\t\t\t= SMODCH\t\t##\tVypočte směrodatnou odchylku základního souboru.\r\nSTDEVPA\t\t\t= STDEVPA\t\t##\tVypočte směrodatnou odchylku základního souboru včetně čísel, textu a logických hodnot.\r\nSTEYX\t\t\t= STEYX\t\t\t##\tVrátí standardní chybu předpovězené hodnoty y pro každou hodnotu x v regresi.\r\nTDIST\t\t\t= TDIST\t\t\t##\tVrátí hodnotu Studentova t-rozdělení.\r\nTINV\t\t\t= TINV\t\t\t##\tVrátí inverzní funkci k distribuční funkci Studentova t-rozdělení.\r\nTREND\t\t\t= LINTREND\t\t##\tVrátí hodnoty lineárního trendu.\r\nTRIMMEAN\t\t= TRIMMEAN\t\t##\tVrátí střední hodnotu vnitřní části množiny dat.\r\nTTEST\t\t\t= TTEST\t\t\t##\tVrátí pravděpodobnost spojenou se Studentovým t-testem.\r\nVAR\t\t\t= VAR.VÝBĚR\t\t##\tVypočte rozptyl výběru.\r\nVARA\t\t\t= VARA\t\t\t##\tVypočte rozptyl výběru včetně čísel, textu a logických hodnot.\r\nVARP\t\t\t= VAR\t\t\t##\tVypočte rozptyl základního souboru.\r\nVARPA\t\t\t= VARPA\t\t\t##\tVypočte rozptyl základního souboru včetně čísel, textu a logických hodnot.\r\nWEIBULL\t\t\t= WEIBULL\t\t##\tVrátí hodnotu Weibullova rozdělení.\r\nZTEST\t\t\t= ZTEST\t\t\t##\tVrátí jednostrannou P-hodnotu z-testu.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\tTextové funkce\r\n##\r\nASC\t\t\t= ASC\t\t\t##\tZmění znaky s plnou šířkou (dvoubajtové)v řetězci znaků na znaky s poloviční šířkou (jednobajtové).\r\nBAHTTEXT\t\t= BAHTTEXT\t\t##\tPřevede číslo na text ve formátu, měny ß (baht).\r\nCHAR\t\t\t= ZNAK\t\t\t##\tVrátí znak určený číslem kódu.\r\nCLEAN\t\t\t= VYČISTIT\t\t##\tOdebere z textu všechny netisknutelné znaky.\r\nCODE\t\t\t= KÓD\t\t\t##\tVrátí číselný kód prvního znaku zadaného textového řetězce.\r\nCONCATENATE\t\t= CONCATENATE\t\t##\tSpojí několik textových položek do jedné.\r\nDOLLAR\t\t\t= KČ\t\t\t##\tPřevede číslo na text ve formátu měny Kč (česká koruna).\r\nEXACT\t\t\t= STEJNÉ\t\t##\tZkontroluje, zda jsou dvě textové hodnoty shodné.\r\nFIND\t\t\t= NAJÍT\t\t\t##\tNalezne textovou hodnotu uvnitř jiné (rozlišuje malá a velká písmena).\r\nFINDB\t\t\t= FINDB\t\t\t##\tNalezne textovou hodnotu uvnitř jiné (rozlišuje malá a velká písmena).\r\nFIXED\t\t\t= ZAOKROUHLIT.NA.TEXT\t##\tZformátuje číslo jako text s pevným počtem desetinných míst.\r\nJIS\t\t\t= JIS\t\t\t##\tZmění znaky s poloviční šířkou (jednobajtové) v řetězci znaků na znaky s plnou šířkou (dvoubajtové).\r\nLEFT\t\t\t= ZLEVA\t\t\t##\tVrátí první znaky textové hodnoty umístěné nejvíce vlevo.\r\nLEFTB\t\t\t= LEFTB\t\t\t##\tVrátí první znaky textové hodnoty umístěné nejvíce vlevo.\r\nLEN\t\t\t= DÉLKA\t\t\t##\tVrátí počet znaků textového řetězce.\r\nLENB\t\t\t= LENB\t\t\t##\tVrátí počet znaků textového řetězce.\r\nLOWER\t\t\t= MALÁ\t\t\t##\tPřevede text na malá písmena.\r\nMID\t\t\t= ČÁST\t\t\t##\tVrátí určitý počet znaků textového řetězce počínaje zadaným místem.\r\nMIDB\t\t\t= MIDB\t\t\t##\tVrátí určitý počet znaků textového řetězce počínaje zadaným místem.\r\nPHONETIC\t\t= ZVUKOVÉ\t\t##\tExtrahuje fonetické znaky (furigana) z textového řetězce.\r\nPROPER\t\t\t= VELKÁ2\t\t##\tPřevede první písmeno každého slova textové hodnoty na velké.\r\nREPLACE\t\t\t= NAHRADIT\t\t##\tNahradí znaky uvnitř textu.\r\nREPLACEB\t\t= NAHRADITB\t\t##\tNahradí znaky uvnitř textu.\r\nREPT\t\t\t= OPAKOVAT\t\t##\tZopakuje text podle zadaného počtu opakování.\r\nRIGHT\t\t\t= ZPRAVA\t\t##\tVrátí první znaky textové hodnoty umístěné nejvíce vpravo.\r\nRIGHTB\t\t\t= RIGHTB\t\t##\tVrátí první znaky textové hodnoty umístěné nejvíce vpravo.\r\nSEARCH\t\t\t= HLEDAT\t\t##\tNalezne textovou hodnotu uvnitř jiné (malá a velká písmena nejsou rozlišována).\r\nSEARCHB\t\t\t= SEARCHB\t\t##\tNalezne textovou hodnotu uvnitř jiné (malá a velká písmena nejsou rozlišována).\r\nSUBSTITUTE\t\t= DOSADIT\t\t##\tV textovém řetězci nahradí starý text novým.\r\nT\t\t\t= T\t\t\t##\tPřevede argumenty na text.\r\nTEXT\t\t\t= HODNOTA.NA.TEXT\t##\tZformátuje číslo a převede ho na text.\r\nTRIM\t\t\t= PROČISTIT\t\t##\tOdstraní z textu mezery.\r\nUPPER\t\t\t= VELKÁ\t\t\t##\tPřevede text na velká písmena.\r\nVALUE\t\t\t= HODNOTA\t\t##\tPřevede textový argument na číslo.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/da/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= kr\n\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NUL!\r\nDIV0\t= #DIVISION/0!\r\nVALUE\t= #VÆRDI!\r\nREF\t= #REFERENCE!\r\nNAME\t= #NAVN?\r\nNUM\t= #NUM!\r\nNA\t= #I/T\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/da/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tTilføjelsesprogram- og automatiseringsfunktioner\r\n##\r\nGETPIVOTDATA\t\t= HENTPIVOTDATA\t\t\t##\tReturnerer data, der er lagret i en pivottabelrapport\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tKubefunktioner\r\n##\r\nCUBEKPIMEMBER\t\t= KUBE.KPI.MEDLEM\t\t##\tReturnerer navn, egenskab og mål for en KPI-indikator og viser navnet og egenskaben i cellen. En KPI-indikator er en målbar størrelse, f.eks. bruttooverskud pr. måned eller personaleudskiftning pr. kvartal, der bruges til at overvåge en organisations præstationer.\r\nCUBEMEMBER\t\t= KUBE.MEDLEM\t\t\t##\tReturnerer et medlem eller en tupel fra kubehierarkiet. Bruges til at validere, om et medlem eller en tupel findes i kuben.\r\nCUBEMEMBERPROPERTY\t= KUBEMEDLEM.EGENSKAB\t\t##\tReturnerer værdien af en egenskab for et medlem i kuben. Bruges til at validere, om et medlemsnavn findes i kuben, og returnere den angivne egenskab for medlemmet.\r\nCUBERANKEDMEMBER\t= KUBEMEDLEM.RANG\t\t##\tReturnerer det n'te eller rangordnede medlem i et sæt. Bruges til at returnere et eller flere elementer i et sæt, f.eks. topsælgere eller de 10 bedste elever.\r\nCUBESET\t\t\t= KUBESÆT\t\t\t##\tDefinerer et beregnet sæt medlemmer eller tupler ved at sende et sætudtryk til kuben på serveren, som opretter sættet og returnerer det til Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= KUBESÆT.TÆL\t\t\t##\tReturnerer antallet af elementer i et sæt.\r\nCUBEVALUE\t\t= KUBEVÆRDI\t\t\t##\tReturnerer en sammenlagt (aggregeret) værdi fra en kube.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tDatabasefunktioner\r\n##\r\nDAVERAGE\t\t= DMIDDEL\t\t\t##\tReturnerer gennemsnittet af markerede databaseposter\r\nDCOUNT\t\t\t= DTÆL\t\t\t\t##\tTæller de celler, der indeholder tal, i en database\r\nDCOUNTA\t\t\t= DTÆLV\t\t\t\t##\tTæller udfyldte celler i en database\r\nDGET\t\t\t= DHENT\t\t\t\t##\tUddrager en enkelt post, der opfylder de angivne kriterier, fra en database\r\nDMAX\t\t\t= DMAKS\t\t\t\t##\tReturnerer den største værdi blandt markerede databaseposter\r\nDMIN\t\t\t= DMIN\t\t\t\t##\tReturnerer den mindste værdi blandt markerede databaseposter\r\nDPRODUCT\t\t= DPRODUKT\t\t\t##\tGanger værdierne i et bestemt felt med poster, der opfylder kriterierne i en database\r\nDSTDEV\t\t\t= DSTDAFV\t\t\t##\tBeregner et skøn over standardafvigelsen baseret på en stikprøve af markerede databaseposter\r\nDSTDEVP\t\t\t= DSTDAFVP\t\t\t##\tBeregner standardafvigelsen baseret på hele populationen af markerede databaseposter\r\nDSUM\t\t\t= DSUM\t\t\t\t##\tSammenlægger de tal i feltkolonnen i databasen, der opfylder kriterierne\r\nDVAR\t\t\t= DVARIANS\t\t\t##\tBeregner varians baseret på en stikprøve af markerede databaseposter\r\nDVARP\t\t\t= DVARIANSP\t\t\t##\tBeregner varians baseret på hele populationen af markerede databaseposter\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tDato- og klokkeslætsfunktioner\r\n##\r\nDATE\t\t\t= DATO\t\t\t\t##\tReturnerer serienummeret for en bestemt dato\r\nDATEVALUE\t\t= DATOVÆRDI\t\t\t##\tKonverterer en dato i form af tekst til et serienummer\r\nDAY\t\t\t= DAG\t\t\t\t##\tKonverterer et serienummer til en dag i måneden\r\nDAYS360\t\t\t= DAGE360\t\t\t##\tBeregner antallet af dage mellem to datoer på grundlag af et år med 360 dage\r\nEDATE\t\t\t= EDATO\t\t\t\t##\tReturnerer serienummeret for den dato, der ligger det angivne antal måneder før eller efter startdatoen\r\nEOMONTH\t\t\t= SLUT.PÅ.MÅNED\t\t\t##\tReturnerer serienummeret på den sidste dag i måneden før eller efter et angivet antal måneder\r\nHOUR\t\t\t= TIME\t\t\t\t##\tKonverterer et serienummer til en time\r\nMINUTE\t\t\t= MINUT\t\t\t\t##\tKonverterer et serienummer til et minut\r\nMONTH\t\t\t= MÅNED\t\t\t\t##\tKonverterer et serienummer til en måned\r\nNETWORKDAYS\t\t= ANTAL.ARBEJDSDAGE\t\t##\tReturnerer antallet af hele arbejdsdage mellem to datoer\r\nNOW\t\t\t= NU\t\t\t\t##\tReturnerer serienummeret for den aktuelle dato eller det aktuelle klokkeslæt\r\nSECOND\t\t\t= SEKUND\t\t\t##\tKonverterer et serienummer til et sekund\r\nTIME\t\t\t= KLOKKESLÆT\t\t\t##\tReturnerer serienummeret for et bestemt klokkeslæt\r\nTIMEVALUE\t\t= TIDSVÆRDI\t\t\t##\tKonverterer et klokkeslæt i form af tekst til et serienummer\r\nTODAY\t\t\t= IDAG\t\t\t\t##\tReturnerer serienummeret for dags dato\r\nWEEKDAY\t\t\t= UGEDAG\t\t\t##\tKonverterer et serienummer til en ugedag\r\nWEEKNUM\t\t\t= UGE.NR\t\t\t##\tKonverterer et serienummer til et tal, der angiver ugenummeret i året\r\nWORKDAY\t\t\t= ARBEJDSDAG\t\t\t##\tReturnerer serienummeret for dagen før eller efter det angivne antal arbejdsdage\r\nYEAR\t\t\t= ÅR\t\t\t\t##\tKonverterer et serienummer til et år\r\nYEARFRAC\t\t= ÅR.BRØK\t\t\t##\tReturnerer årsbrøken, der repræsenterer antallet af hele dage mellem startdato og slutdato\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tTekniske funktioner\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tReturnerer den modificerede Bessel-funktion In(x)\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tReturnerer Bessel-funktionen Jn(x)\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tReturnerer den modificerede Bessel-funktion Kn(x)\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tReturnerer Bessel-funktionen Yn(x)\r\nBIN2DEC\t\t\t= BIN.TIL.DEC\t\t\t##\tKonverterer et binært tal til et decimaltal\r\nBIN2HEX\t\t\t= BIN.TIL.HEX\t\t\t##\tKonverterer et binært tal til et heksadecimalt tal\r\nBIN2OCT\t\t\t= BIN.TIL.OKT\t\t\t##\tKonverterer et binært tal til et oktaltal.\r\nCOMPLEX\t\t\t= KOMPLEKS\t\t\t##\tKonverterer reelle og imaginære koefficienter til et komplekst tal\r\nCONVERT\t\t\t= KONVERTER\t\t\t##\tKonverterer et tal fra én måleenhed til en anden\r\nDEC2BIN\t\t\t= DEC.TIL.BIN\t\t\t##\tKonverterer et decimaltal til et binært tal\r\nDEC2HEX\t\t\t= DEC.TIL.HEX\t\t\t##\tKonverterer et decimaltal til et heksadecimalt tal\r\nDEC2OCT\t\t\t= DEC.TIL.OKT\t\t\t##\tKonverterer et decimaltal til et oktaltal\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tTester, om to værdier er ens\r\nERF\t\t\t= FEJLFUNK\t\t\t##\tReturner fejlfunktionen\r\nERFC\t\t\t= FEJLFUNK.KOMP\t\t\t##\tReturnerer den komplementære fejlfunktion\r\nGESTEP\t\t\t= GETRIN\t\t\t##\tTester, om et tal er større end en grænseværdi\r\nHEX2BIN\t\t\t= HEX.TIL.BIN\t\t\t##\tKonverterer et heksadecimalt tal til et binært tal\r\nHEX2DEC\t\t\t= HEX.TIL.DEC\t\t\t##\tKonverterer et decimaltal til et heksadecimalt tal\r\nHEX2OCT\t\t\t= HEX.TIL.OKT\t\t\t##\tKonverterer et heksadecimalt tal til et oktaltal\r\nIMABS\t\t\t= IMAGABS\t\t\t##\tReturnerer den absolutte værdi (modulus) for et komplekst tal\r\nIMAGINARY\t\t= IMAGINÆR\t\t\t##\tReturnerer den imaginære koefficient for et komplekst tal\r\nIMARGUMENT\t\t= IMAGARGUMENT\t\t\t##\tReturnerer argumentet theta, en vinkel udtrykt i radianer\r\nIMCONJUGATE\t\t= IMAGKONJUGERE\t\t\t##\tReturnerer den komplekse konjugation af et komplekst tal\r\nIMCOS\t\t\t= IMAGCOS\t\t\t##\tReturnerer et komplekst tals cosinus\r\nIMDIV\t\t\t= IMAGDIV\t\t\t##\tReturnerer kvotienten for to komplekse tal\r\nIMEXP\t\t\t= IMAGEKSP\t\t\t##\tReturnerer et komplekst tals eksponentialfunktion\r\nIMLN\t\t\t= IMAGLN\t\t\t##\tReturnerer et komplekst tals naturlige logaritme\r\nIMLOG10\t\t\t= IMAGLOG10\t\t\t##\tReturnerer et komplekst tals sædvanlige logaritme (titalslogaritme)\r\nIMLOG2\t\t\t= IMAGLOG2\t\t\t##\tReturnerer et komplekst tals sædvanlige logaritme (totalslogaritme)\r\nIMPOWER\t\t\t= IMAGPOTENS\t\t\t##\tReturnerer et komplekst tal opløftet i en heltalspotens\r\nIMPRODUCT\t\t= IMAGPRODUKT\t\t\t##\tReturnerer produktet af komplekse tal\r\nIMREAL\t\t\t= IMAGREELT\t\t\t##\tReturnerer den reelle koefficient for et komplekst tal\r\nIMSIN\t\t\t= IMAGSIN\t\t\t##\tReturnerer et komplekst tals sinus\r\nIMSQRT\t\t\t= IMAGKVROD\t\t\t##\tReturnerer et komplekst tals kvadratrod\r\nIMSUB\t\t\t= IMAGSUB\t\t\t##\tReturnerer forskellen mellem to komplekse tal\r\nIMSUM\t\t\t= IMAGSUM\t\t\t##\tReturnerer summen af komplekse tal\r\nOCT2BIN\t\t\t= OKT.TIL.BIN\t\t\t##\tKonverterer et oktaltal til et binært tal\r\nOCT2DEC\t\t\t= OKT.TIL.DEC\t\t\t##\tKonverterer et oktaltal til et decimaltal\r\nOCT2HEX\t\t\t= OKT.TIL.HEX\t\t\t##\tKonverterer et oktaltal til et heksadecimalt tal\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFinansielle funktioner\r\n##\r\nACCRINT\t\t\t= PÅLØBRENTE\t\t\t##\tReturnerer den påløbne rente for et værdipapir med periodiske renteudbetalinger\r\nACCRINTM\t\t= PÅLØBRENTE.UDLØB\t\t##\tReturnerer den påløbne rente for et værdipapir, hvor renteudbetalingen finder sted ved papirets udløb\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tReturnerer afskrivningsbeløbet for hver regnskabsperiode ved hjælp af en afskrivningskoefficient\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tReturnerer afskrivningsbeløbet for hver regnskabsperiode\r\nCOUPDAYBS\t\t= KUPONDAGE.SA\t\t\t##\tReturnerer antallet af dage fra starten af kuponperioden til afregningsdatoen\r\nCOUPDAYS\t\t= KUPONDAGE.A\t\t\t##\tReturnerer antallet af dage fra begyndelsen af kuponperioden til afregningsdatoen\r\nCOUPDAYSNC\t\t= KUPONDAGE.ANK\t\t\t##\tReturnerer antallet af dage i den kuponperiode, der indeholder afregningsdatoen\r\nCOUPNCD\t\t\t= KUPONDAG.NÆSTE\t\t##\tReturnerer den næste kupondato efter afregningsdatoen\r\nCOUPNUM\t\t\t= KUPONBETALINGER\t\t##\tReturnerer antallet af kuponudbetalinger mellem afregnings- og udløbsdatoen\r\nCOUPPCD\t\t\t= KUPONDAG.FORRIGE\t\t##\tReturnerer den forrige kupondato før afregningsdatoen\r\nCUMIPMT\t\t\t= AKKUM.RENTE\t\t\t##\tReturnerer den akkumulerede rente, der betales på et lån mellem to perioder\r\nCUMPRINC\t\t= AKKUM.HOVEDSTOL\t\t##\tReturnerer den akkumulerede nedbringelse af hovedstol mellem to perioder\r\nDB\t\t\t= DB\t\t\t\t##\tReturnerer afskrivningen på et aktiv i en angivet periode ved anvendelse af saldometoden\r\nDDB\t\t\t= DSA\t\t\t\t##\tReturnerer afskrivningsbeløbet for et aktiv over en bestemt periode ved anvendelse af dobbeltsaldometoden eller en anden afskrivningsmetode, som du angiver\r\nDISC\t\t\t= DISKONTO\t\t\t##\tReturnerer et værdipapirs diskonto\r\nDOLLARDE\t\t= KR.DECIMAL\t\t\t##\tKonverterer en kronepris udtrykt som brøk til en kronepris udtrykt som decimaltal\r\nDOLLARFR\t\t= KR.BRØK\t\t\t##\tKonverterer en kronepris udtrykt som decimaltal til en kronepris udtrykt som brøk\r\nDURATION\t\t= VARIGHED\t\t\t##\tReturnerer den årlige løbetid for et værdipapir med periodiske renteudbetalinger\r\nEFFECT\t\t\t= EFFEKTIV.RENTE\t\t##\tReturnerer den årlige effektive rente\r\nFV\t\t\t= FV\t\t\t\t##\tReturnerer fremtidsværdien af en investering\r\nFVSCHEDULE\t\t= FVTABEL\t\t\t##\tReturnerer den fremtidige værdi af en hovedstol, når der er tilskrevet rente og rentes rente efter forskellige rentesatser\r\nINTRATE\t\t\t= RENTEFOD\t\t\t##\tReturnerer renten på et fuldt ud investeret værdipapir\r\nIPMT\t\t\t= R.YDELSE\t\t\t##\tReturnerer renten fra en investering for en given periode\r\nIRR\t\t\t= IA\t\t\t\t##\tReturnerer den interne rente for en række pengestrømme\r\nISPMT\t\t\t= ISPMT\t\t\t\t##\tBeregner den betalte rente i løbet af en bestemt investeringsperiode\r\nMDURATION\t\t= MVARIGHED\t\t\t##\tReturnerer Macauleys modificerede løbetid for et værdipapir med en formodet pari på kr. 100\r\nMIRR\t\t\t= MIA\t\t\t\t##\tReturnerer den interne forrentning, hvor positive og negative pengestrømme finansieres til forskellig rente\r\nNOMINAL\t\t\t= NOMINEL\t\t\t##\tReturnerer den årlige nominelle rente\r\nNPER\t\t\t= NPER\t\t\t\t##\tReturnerer antallet af perioder for en investering\r\nNPV\t\t\t= NUTIDSVÆRDI\t\t\t##\tReturnerer nettonutidsværdien for en investering baseret på en række periodiske pengestrømme og en diskonteringssats\r\nODDFPRICE\t\t= ULIGE.KURS.PÅLYDENDE\t\t##\tReturnerer kursen pr. kr. 100 nominel værdi for et værdipapir med en ulige (kort eller lang) første periode\r\nODDFYIELD\t\t= ULIGE.FØRSTE.AFKAST\t\t##\tReturnerer afkastet for et værdipapir med ulige første periode\r\nODDLPRICE\t\t= ULIGE.SIDSTE.KURS\t\t##\tReturnerer kursen pr. kr. 100 nominel værdi for et værdipapir med ulige sidste periode\r\nODDLYIELD\t\t= ULIGE.SIDSTE.AFKAST\t\t##\tReturnerer afkastet for et værdipapir med ulige sidste periode\r\nPMT\t\t\t= YDELSE\t\t\t##\tReturnerer renten fra en investering for en given periode\r\nPPMT\t\t\t= H.YDELSE\t\t\t##\tReturnerer ydelsen på hovedstolen for en investering i en given periode\r\nPRICE\t\t\t= KURS\t\t\t\t##\tReturnerer kursen pr. kr 100 nominel værdi for et værdipapir med periodiske renteudbetalinger\r\nPRICEDISC\t\t= KURS.DISKONTO\t\t\t##\tReturnerer kursen pr. kr 100 nominel værdi for et diskonteret værdipapir\r\nPRICEMAT\t\t= KURS.UDLØB\t\t\t##\tReturnerer kursen pr. kr 100 nominel værdi for et værdipapir, hvor renten udbetales ved papirets udløb\r\nPV\t\t\t= NV\t\t\t\t##\tReturnerer den nuværende værdi af en investering\r\nRATE\t\t\t= RENTE\t\t\t\t##\tReturnerer renten i hver periode for en annuitet\r\nRECEIVED\t\t= MODTAGET.VED.UDLØB\t\t##\tReturnerer det beløb, der modtages ved udløbet af et fuldt ud investeret værdipapir\r\nSLN\t\t\t= LA\t\t\t\t##\tReturnerer den lineære afskrivning for et aktiv i en enkelt periode\r\nSYD\t\t\t= ÅRSAFSKRIVNING\t\t##\tReturnerer den årlige afskrivning på et aktiv i en bestemt periode\r\nTBILLEQ\t\t\t= STATSOBLIGATION\t\t##\tReturnerer det obligationsækvivalente afkast for en statsobligation\r\nTBILLPRICE\t\t= STATSOBLIGATION.KURS\t\t##\tReturnerer kursen pr. kr 100 nominel værdi for en statsobligation\r\nTBILLYIELD\t\t= STATSOBLIGATION.AFKAST\t##\tReturnerer en afkastet på en statsobligation\r\nVDB\t\t\t= VSA\t\t\t\t##\tReturnerer afskrivningen på et aktiv i en angivet periode, herunder delperioder, ved brug af dobbeltsaldometoden\r\nXIRR\t\t\t= INTERN.RENTE\t\t\t##\tReturnerer den interne rente for en plan over pengestrømme, der ikke behøver at være periodiske\r\nXNPV\t\t\t= NETTO.NUTIDSVÆRDI\t\t##\tReturnerer nutidsværdien for en plan over pengestrømme, der ikke behøver at være periodiske\r\nYIELD\t\t\t= AFKAST\t\t\t##\tReturnerer afkastet for et værdipapir med periodiske renteudbetalinger\r\nYIELDDISC\t\t= AFKAST.DISKONTO\t\t##\tReturnerer det årlige afkast for et diskonteret værdipapir, f.eks. en statsobligation\r\nYIELDMAT\t\t= AFKAST.UDLØBSDATO\t\t##\tReturnerer det årlige afkast for et værdipapir, hvor renten udbetales ved papirets udløb\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tInformationsfunktioner\r\n##\r\nCELL\t\t\t= CELLE\t\t\t\t##\tReturnerer oplysninger om formatering, placering eller indhold af en celle\r\nERROR.TYPE\t\t= FEJLTYPE\t\t\t##\tReturnerer et tal, der svarer til en fejltype\r\nINFO\t\t\t= INFO\t\t\t\t##\tReturnerer oplysninger om det aktuelle operativmiljø\r\nISBLANK\t\t\t= ER.TOM\t\t\t##\tReturnerer SAND, hvis værdien er tom\r\nISERR\t\t\t= ER.FJL\t\t\t##\tReturnerer SAND, hvis værdien er en fejlværdi undtagen #I/T\r\nISERROR\t\t\t= ER.FEJL\t\t\t##\tReturnerer SAND, hvis værdien er en fejlværdi\r\nISEVEN\t\t\t= ER.LIGE\t\t\t##\tReturnerer SAND, hvis tallet er lige\r\nISLOGICAL\t\t= ER.LOGISK\t\t\t##\tReturnerer SAND, hvis værdien er en logisk værdi\r\nISNA\t\t\t= ER.IKKE.TILGÆNGELIG\t\t##\tReturnerer SAND, hvis værdien er fejlværdien #I/T\r\nISNONTEXT\t\t= ER.IKKE.TEKST\t\t\t##\tReturnerer SAND, hvis værdien ikke er tekst\r\nISNUMBER\t\t= ER.TAL\t\t\t##\tReturnerer SAND, hvis værdien er et tal\r\nISODD\t\t\t= ER.ULIGE\t\t\t##\tReturnerer SAND, hvis tallet er ulige\r\nISREF\t\t\t= ER.REFERENCE\t\t\t##\tReturnerer SAND, hvis værdien er en reference\r\nISTEXT\t\t\t= ER.TEKST\t\t\t##\tReturnerer SAND, hvis værdien er tekst\r\nN\t\t\t= TAL\t\t\t\t##\tReturnerer en værdi konverteret til et tal\r\nNA\t\t\t= IKKE.TILGÆNGELIG\t\t##\tReturnerer fejlværdien #I/T\r\nTYPE\t\t\t= VÆRDITYPE\t\t\t##\tReturnerer et tal, der angiver datatypen for en værdi\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tLogiske funktioner\r\n##\r\nAND\t\t\t= OG\t\t\t\t##\tReturnerer SAND, hvis alle argumenterne er sande\r\nFALSE\t\t\t= FALSK\t\t\t\t##\tReturnerer den logiske værdi FALSK\r\nIF\t\t\t= HVIS\t\t\t\t##\tAngiver en logisk test, der skal udføres\r\nIFERROR\t\t\t= HVIS.FEJL\t\t\t##\tReturnerer en værdi, du angiver, hvis en formel evauleres som en fejl. Returnerer i modsat fald resultatet af formlen\r\nNOT\t\t\t= IKKE\t\t\t\t##\tVender argumentets logik om\r\nOR\t\t\t= ELLER\t\t\t\t##\tReturneret værdien SAND, hvis mindst ét argument er sandt\r\nTRUE\t\t\t= SAND\t\t\t\t##\tReturnerer den logiske værdi SAND\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tOpslags- og referencefunktioner\r\n##\r\nADDRESS\t\t\t= ADRESSE\t\t\t##\tReturnerer en reference som tekst til en enkelt celle i et regneark\r\nAREAS\t\t\t= OMRÅDER\t\t\t##\tReturnerer antallet af områder i en reference\r\nCHOOSE\t\t\t= VÆLG\t\t\t\t##\tVælger en værdi på en liste med værdier\r\nCOLUMN\t\t\t= KOLONNE\t\t\t##\tReturnerer kolonnenummeret i en reference\r\nCOLUMNS\t\t\t= KOLONNER\t\t\t##\tReturnerer antallet af kolonner i en reference\r\nHLOOKUP\t\t\t= VOPSLAG\t\t\t##\tSøger i den øverste række af en matrix og returnerer værdien af den angivne celle\r\nHYPERLINK\t\t= HYPERLINK\t\t\t##\tOpretter en genvej kaldet et hyperlink, der åbner et dokument, som er lagret på en netværksserver, på et intranet eller på internettet\r\nINDEX\t\t\t= INDEKS\t\t\t##\tAnvender et indeks til at vælge en værdi fra en reference eller en matrix\r\nINDIRECT\t\t= INDIREKTE\t\t\t##\tReturnerer en reference, der er angivet af en tekstværdi\r\nLOOKUP\t\t\t= SLÅ.OP\t\t\t##\tSøger værdier i en vektor eller en matrix\r\nMATCH\t\t\t= SAMMENLIGN\t\t\t##\tSøger værdier i en reference eller en matrix\r\nOFFSET\t\t\t= FORSKYDNING\t\t\t##\tReturnerer en reference forskudt i forhold til en given reference\r\nROW\t\t\t= RÆKKE\t\t\t\t##\tReturnerer rækkenummeret for en reference\r\nROWS\t\t\t= RÆKKER\t\t\t##\tReturnerer antallet af rækker i en reference\r\nRTD\t\t\t= RTD\t\t\t\t##\tHenter realtidsdata fra et program, der understøtter COM-automatisering (Automation: En metode til at arbejde med objekter fra et andet program eller udviklingsværktøj. Automation, som tidligere blev kaldt OLE Automation, er en industristandard og en funktion i COM (Component Object Model).)\r\nTRANSPOSE\t\t= TRANSPONER\t\t\t##\tReturnerer en transponeret matrix\r\nVLOOKUP\t\t\t= LOPSLAG\t\t\t##\tSøger i øverste række af en matrix og flytter på tværs af rækken for at returnere en celleværdi\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tMatematiske og trigonometriske funktioner\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tReturnerer den absolutte værdi af et tal\r\nACOS\t\t\t= ARCCOS\t\t\t##\tReturnerer et tals arcus cosinus\r\nACOSH\t\t\t= ARCCOSH\t\t\t##\tReturnerer den inverse hyperbolske cosinus af tal\r\nASIN\t\t\t= ARCSIN\t\t\t##\tReturnerer et tals arcus sinus\r\nASINH\t\t\t= ARCSINH\t\t\t##\tReturnerer den inverse hyperbolske sinus for tal\r\nATAN\t\t\t= ARCTAN\t\t\t##\tReturnerer et tals arcus tangens\r\nATAN2\t\t\t= ARCTAN2\t\t\t##\tReturnerer de angivne x- og y-koordinaters arcus tangens\r\nATANH\t\t\t= ARCTANH\t\t\t##\tReturnerer et tals inverse hyperbolske tangens\r\nCEILING\t\t\t= AFRUND.LOFT\t\t\t##\tAfrunder et tal til nærmeste heltal eller til nærmeste multiplum af betydning\r\nCOMBIN\t\t\t= KOMBIN\t\t\t##\tReturnerer antallet af kombinationer for et givet antal objekter\r\nCOS\t\t\t= COS\t\t\t\t##\tReturnerer et tals cosinus\r\nCOSH\t\t\t= COSH\t\t\t\t##\tReturnerer den inverse hyperbolske cosinus af et tal\r\nDEGREES\t\t\t= GRADER\t\t\t##\tKonverterer radianer til grader\r\nEVEN\t\t\t= LIGE\t\t\t\t##\tRunder et tal op til nærmeste lige heltal\r\nEXP\t\t\t= EKSP\t\t\t\t##\tReturnerer e opløftet til en potens af et angivet tal\r\nFACT\t\t\t= FAKULTET\t\t\t##\tReturnerer et tals fakultet\r\nFACTDOUBLE\t\t= DOBBELT.FAKULTET\t\t##\tReturnerer et tals dobbelte fakultet\r\nFLOOR\t\t\t= AFRUND.GULV\t\t\t##\tRunder et tal ned mod nul\r\nGCD\t\t\t= STØRSTE.FÆLLES.DIVISOR\t##\tReturnerer den største fælles divisor\r\nINT\t\t\t= HELTAL\t\t\t##\tNedrunder et tal til det nærmeste heltal\r\nLCM\t\t\t= MINDSTE.FÆLLES.MULTIPLUM\t##\tReturnerer det mindste fælles multiplum\r\nLN\t\t\t= LN\t\t\t\t##\tReturnerer et tals naturlige logaritme\r\nLOG\t\t\t= LOG\t\t\t\t##\tReturnerer logaritmen for et tal på grundlag af et angivet grundtal\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tReturnerer titalslogaritmen af et tal\r\nMDETERM\t\t\t= MDETERM\t\t\t##\tReturnerer determinanten for en matrix\r\nMINVERSE\t\t= MINVERT\t\t\t##\tReturnerer den inverse matrix for en matrix\r\nMMULT\t\t\t= MPRODUKT\t\t\t##\tReturnerer matrixproduktet af to matrixer\r\nMOD\t\t\t= REST\t\t\t\t##\tReturnerer restværdien fra division\r\nMROUND\t\t\t= MAFRUND\t\t\t##\tReturnerer et tal afrundet til det ønskede multiplum\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t\t##\tReturnerer et multinomialt talsæt\r\nODD\t\t\t= ULIGE\t\t\t\t##\tRunder et tal op til nærmeste ulige heltal\r\nPI\t\t\t= PI\t\t\t\t##\tReturnerer værdien af pi\r\nPOWER\t\t\t= POTENS\t\t\t##\tReturnerer resultatet af et tal opløftet til en potens\r\nPRODUCT\t\t\t= PRODUKT\t\t\t##\tMultiplicerer argumenterne\r\nQUOTIENT\t\t= KVOTIENT\t\t\t##\tReturnerer heltalsdelen ved division\r\nRADIANS\t\t\t= RADIANER\t\t\t##\tKonverterer grader til radianer\r\nRAND\t\t\t= SLUMP\t\t\t\t##\tReturnerer et tilfældigt tal mellem 0 og 1\r\nRANDBETWEEN\t\t= SLUMP.MELLEM\t\t\t##\tReturnerer et tilfældigt tal mellem de tal, der angives\r\nROMAN\t\t\t= ROMERTAL\t\t\t##\tKonverterer et arabertal til romertal som tekst\r\nROUND\t\t\t= AFRUND\t\t\t##\tAfrunder et tal til et angivet antal decimaler\r\nROUNDDOWN\t\t= RUND.NED\t\t\t##\tRunder et tal ned mod nul\r\nROUNDUP\t\t\t= RUND.OP\t\t\t##\tRunder et tal op, væk fra 0 (nul)\r\nSERIESSUM\t\t= SERIESUM\t\t\t##\tReturnerer summen af en potensserie baseret på en formel\r\nSIGN\t\t\t= FORTEGN\t\t\t##\tReturnerer et tals fortegn\r\nSIN\t\t\t= SIN\t\t\t\t##\tReturnerer en given vinkels sinusværdi\r\nSINH\t\t\t= SINH\t\t\t\t##\tReturnerer den hyperbolske sinus af et tal\r\nSQRT\t\t\t= KVROD\t\t\t\t##\tReturnerer en positiv kvadratrod\r\nSQRTPI\t\t\t= KVRODPI\t\t\t##\tReturnerer kvadratroden af (tal * pi;)\r\nSUBTOTAL\t\t= SUBTOTAL\t\t\t##\tReturnerer en subtotal på en liste eller i en database\r\nSUM\t\t\t= SUM\t\t\t\t##\tLægger argumenterne sammen\r\nSUMIF\t\t\t= SUM.HVIS\t\t\t##\tLægger de celler sammen, der er specificeret af et givet kriterium.\r\nSUMIFS\t\t\t= SUM.HVISER\t\t\t##\tLægger de celler i et område sammen, der opfylder flere kriterier.\r\nSUMPRODUCT\t\t= SUMPRODUKT\t\t\t##\tReturnerer summen af produkter af ens matrixkomponenter\r\nSUMSQ\t\t\t= SUMKV\t\t\t\t##\tReturnerer summen af argumenternes kvadrater\r\nSUMX2MY2\t\t= SUMX2MY2\t\t\t##\tReturnerer summen af differensen mellem kvadrater af ens værdier i to matrixer\r\nSUMX2PY2\t\t= SUMX2PY2\t\t\t##\tReturnerer summen af summen af kvadrater af tilsvarende værdier i to matrixer\r\nSUMXMY2\t\t\t= SUMXMY2\t\t\t##\tReturnerer summen af kvadrater af differenser mellem ens værdier i to matrixer\r\nTAN\t\t\t= TAN\t\t\t\t##\tReturnerer et tals tangens\r\nTANH\t\t\t= TANH\t\t\t\t##\tReturnerer et tals hyperbolske tangens\r\nTRUNC\t\t\t= AFKORT\t\t\t##\tAfkorter et tal til et heltal\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tStatistiske funktioner\r\n##\r\nAVEDEV\t\t\t= MAD\t\t\t\t##\tReturnerer den gennemsnitlige numeriske afvigelse fra stikprøvens middelværdi\r\nAVERAGE\t\t\t= MIDDEL\t\t\t##\tReturnerer middelværdien af argumenterne\r\nAVERAGEA\t\t= MIDDELV\t\t\t##\tReturnerer middelværdien af argumenterne og medtager tal, tekst og logiske værdier\r\nAVERAGEIF\t\t= MIDDEL.HVIS\t\t\t##\tReturnerer gennemsnittet (den aritmetiske middelværdi) af alle de celler, der opfylder et givet kriterium, i et område\r\nAVERAGEIFS\t\t= MIDDEL.HVISER\t\t\t##\tReturnerer gennemsnittet (den aritmetiske middelværdi) af alle de celler, der opfylder flere kriterier.\r\nBETADIST\t\t= BETAFORDELING\t\t\t##\tReturnerer den kumulative betafordelingsfunktion\r\nBETAINV\t\t\t= BETAINV\t\t\t##\tReturnerer den inverse kumulative fordelingsfunktion for en angivet betafordeling\r\nBINOMDIST\t\t= BINOMIALFORDELING\t\t##\tReturnerer punktsandsynligheden for binomialfordelingen\r\nCHIDIST\t\t\t= CHIFORDELING\t\t\t##\tReturnerer fraktilsandsynligheden for en chi2-fordeling\r\nCHIINV\t\t\t= CHIINV\t\t\t##\tReturnerer den inverse fraktilsandsynlighed for en chi2-fordeling\r\nCHITEST\t\t\t= CHITEST\t\t\t##\tForetager en test for uafhængighed\r\nCONFIDENCE\t\t= KONFIDENSINTERVAL\t\t##\tReturnerer et konfidensinterval for en population\r\nCORREL\t\t\t= KORRELATION\t\t\t##\tReturnerer korrelationskoefficienten mellem to datasæt\r\nCOUNT\t\t\t= TÆL\t\t\t\t##\tTæller antallet af tal på en liste med argumenter\r\nCOUNTA\t\t\t= TÆLV\t\t\t\t##\tTæller antallet af værdier på en liste med argumenter\r\nCOUNTBLANK\t\t= ANTAL.BLANKE\t\t\t##\tTæller antallet af tomme celler i et område\r\nCOUNTIF\t\t\t= TÆLHVIS\t\t\t##\tTæller antallet af celler, som opfylder de givne kriterier, i et område\r\nCOUNTIFS\t\t= TÆL.HVISER\t\t\t##\tTæller antallet af de celler, som opfylder flere kriterier, i et område\r\nCOVAR\t\t\t= KOVARIANS\t\t\t##\tBeregner kovariansen mellem to stokastiske variabler\r\nCRITBINOM\t\t= KRITBINOM\t\t\t##\tReturnerer den mindste værdi for x, for hvilken det gælder, at fordelingsfunktionen er mindre end eller lig med kriterieværdien.\r\nDEVSQ\t\t\t= SAK\t\t\t\t##\tReturnerer summen af de kvadrerede afvigelser fra middelværdien\r\nEXPONDIST\t\t= EKSPFORDELING\t\t\t##\tReturnerer eksponentialfordelingen\r\nFDIST\t\t\t= FFORDELING\t\t\t##\tReturnerer fraktilsandsynligheden for F-fordelingen\r\nFINV\t\t\t= FINV\t\t\t\t##\tReturnerer den inverse fraktilsandsynlighed for F-fordelingen\r\nFISHER\t\t\t= FISHER\t\t\t##\tReturnerer Fisher-transformationen\r\nFISHERINV\t\t= FISHERINV\t\t\t##\tReturnerer den inverse Fisher-transformation\r\nFORECAST\t\t= PROGNOSE\t\t\t##\tReturnerer en prognoseværdi baseret på lineær tendens\r\nFREQUENCY\t\t= FREKVENS\t\t\t##\tReturnerer en frekvensfordeling i en søjlevektor\r\nFTEST\t\t\t= FTEST\t\t\t\t##\tReturnerer resultatet af en F-test til sammenligning af varians\r\nGAMMADIST\t\t= GAMMAFORDELING\t\t##\tReturnerer fordelingsfunktionen for gammafordelingen\r\nGAMMAINV\t\t= GAMMAINV\t\t\t##\tReturnerer den inverse fordelingsfunktion for gammafordelingen\r\nGAMMALN\t\t\t= GAMMALN\t\t\t##\tReturnerer den naturlige logaritme til gammafordelingen, G(x)\r\nGEOMEAN\t\t\t= GEOMIDDELVÆRDI\t\t##\tReturnerer det geometriske gennemsnit\r\nGROWTH\t\t\t= FORØGELSE\t\t\t##\tReturnerer værdier langs en eksponentiel tendens\r\nHARMEAN\t\t\t= HARMIDDELVÆRDI\t\t##\tReturnerer det harmoniske gennemsnit\r\nHYPGEOMDIST\t\t= HYPGEOFORDELING\t\t##\tReturnerer punktsandsynligheden i en hypergeometrisk fordeling\r\nINTERCEPT\t\t= SKÆRING\t\t\t##\tReturnerer afskæringsværdien på y-aksen i en lineær regression\r\nKURT\t\t\t= TOPSTEJL\t\t\t##\tReturnerer kurtosisværdien for en stokastisk variabel\r\nLARGE\t\t\t= STOR\t\t\t\t##\tReturnerer den k'te største værdi i et datasæt\r\nLINEST\t\t\t= LINREGR\t\t\t##\tReturnerer parameterestimaterne for en lineær tendens\r\nLOGEST\t\t\t= LOGREGR\t\t\t##\tReturnerer parameterestimaterne for en eksponentiel tendens\r\nLOGINV\t\t\t= LOGINV\t\t\t##\tReturnerer den inverse fordelingsfunktion for lognormalfordelingen\r\nLOGNORMDIST\t\t= LOGNORMFORDELING\t\t##\tReturnerer fordelingsfunktionen for lognormalfordelingen\r\nMAX\t\t\t= MAKS\t\t\t\t##\tReturnerer den maksimale værdi på en liste med argumenter.\r\nMAXA\t\t\t= MAKSV\t\t\t\t##\tReturnerer den maksimale værdi på en liste med argumenter og medtager tal, tekst og logiske værdier\r\nMEDIAN\t\t\t= MEDIAN\t\t\t##\tReturnerer medianen for de angivne tal\r\nMIN\t\t\t= MIN\t\t\t\t##\tReturnerer den mindste værdi på en liste med argumenter.\r\nMINA\t\t\t= MINV\t\t\t\t##\tReturnerer den mindste værdi på en liste med argumenter og medtager tal, tekst og logiske værdier\r\nMODE\t\t\t= HYPPIGST\t\t\t##\tReturnerer den hyppigste værdi i et datasæt\r\nNEGBINOMDIST\t\t= NEGBINOMFORDELING\t\t##\tReturnerer den negative binomialfordeling\r\nNORMDIST\t\t= NORMFORDELING\t\t\t##\tReturnerer fordelingsfunktionen for normalfordelingen\r\nNORMINV\t\t\t= NORMINV\t\t\t##\tReturnerer den inverse fordelingsfunktion for normalfordelingen\r\nNORMSDIST\t\t= STANDARDNORMFORDELING\t\t##\tReturnerer fordelingsfunktionen for standardnormalfordelingen\r\nNORMSINV\t\t= STANDARDNORMINV\t\t##\tReturnerer den inverse fordelingsfunktion for standardnormalfordelingen\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tReturnerer Pearsons korrelationskoefficient\r\nPERCENTILE\t\t= FRAKTIL\t\t\t##\tReturnerer den k'te fraktil for datasættet\r\nPERCENTRANK\t\t= PROCENTPLADS\t\t\t##\tReturnerer den procentuelle rang for en given værdi i et datasæt\r\nPERMUT\t\t\t= PERMUT\t\t\t##\tReturnerer antallet af permutationer for et givet sæt objekter\r\nPOISSON\t\t\t= POISSON\t\t\t##\tReturnerer fordelingsfunktionen for en Poisson-fordeling\r\nPROB\t\t\t= SANDSYNLIGHED\t\t\t##\tReturnerer intervalsandsynligheden\r\nQUARTILE\t\t= KVARTIL\t\t\t##\tReturnerer kvartilen i et givet datasæt\r\nRANK\t\t\t= PLADS\t\t\t\t##\tReturnerer rangen for et tal på en liste med tal\r\nRSQ\t\t\t= FORKLARINGSGRAD\t\t##\tReturnerer R2-værdien fra en simpel lineær regression\r\nSKEW\t\t\t= SKÆVHED\t\t\t##\tReturnerer skævheden for en stokastisk variabel\r\nSLOPE\t\t\t= HÆLDNING\t\t\t##\tReturnerer estimatet på hældningen fra en simpel lineær regression\r\nSMALL\t\t\t= MINDSTE\t\t\t##\tReturnerer den k'te mindste værdi i datasættet\r\nSTANDARDIZE\t\t= STANDARDISER\t\t\t##\tReturnerer en standardiseret værdi\r\nSTDEV\t\t\t= STDAFV\t\t\t##\tEstimerer standardafvigelsen på basis af en stikprøve\r\nSTDEVA\t\t\t= STDAFVV\t\t\t##\tBeregner standardafvigelsen på basis af en prøve og medtager tal, tekst og logiske værdier\r\nSTDEVP\t\t\t= STDAFVP\t\t\t##\tBeregner standardafvigelsen på basis af en hel population\r\nSTDEVPA\t\t\t= STDAFVPV\t\t\t##\tBeregner standardafvigelsen på basis af en hel population og medtager tal, tekst og logiske værdier\r\nSTEYX\t\t\t= STFYX\t\t\t\t##\tReturnerer standardafvigelsen for de estimerede y-værdier i den simple lineære regression\r\nTDIST\t\t\t= TFORDELING\t\t\t##\tReturnerer fordelingsfunktionen for Student's t-fordeling\r\nTINV\t\t\t= TINV\t\t\t\t##\tReturnerer den inverse fordelingsfunktion for Student's t-fordeling\r\nTREND\t\t\t= TENDENS\t\t\t##\tReturnerer værdi under antagelse af en lineær tendens\r\nTRIMMEAN\t\t= TRIMMIDDELVÆRDI\t\t##\tReturnerer den trimmede middelværdi for datasættet\r\nTTEST\t\t\t= TTEST\t\t\t\t##\tReturnerer den sandsynlighed, der er forbundet med Student's t-test\r\nVAR\t\t\t= VARIANS\t\t\t##\tBeregner variansen på basis af en prøve\r\nVARA\t\t\t= VARIANSV\t\t\t##\tBeregner variansen på basis af en prøve og medtager tal, tekst og logiske værdier\r\nVARP\t\t\t= VARIANSP\t\t\t##\tBeregner variansen på basis af hele populationen\r\nVARPA\t\t\t= VARIANSPV\t\t\t##\tBeregner variansen på basis af hele populationen og medtager tal, tekst og logiske værdier\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tReturnerer fordelingsfunktionen for Weibull-fordelingen\r\nZTEST\t\t\t= ZTEST\t\t\t\t##\tReturnerer sandsynlighedsværdien ved en en-sidet z-test\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tTekstfunktioner\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tÆndrer engelske tegn i fuld bredde (dobbelt-byte) eller katakana i en tegnstreng til tegn i halv bredde (enkelt-byte)\r\nBAHTTEXT\t\t= BAHTTEKST\t\t\t##\tKonverterer et tal til tekst ved hjælp af valutaformatet ß (baht)\r\nCHAR\t\t\t= TEGN\t\t\t\t##\tReturnerer det tegn, der svarer til kodenummeret\r\nCLEAN\t\t\t= RENS\t\t\t\t##\tFjerner alle tegn, der ikke kan udskrives, fra tekst\r\nCODE\t\t\t= KODE\t\t\t\t##\tReturnerer en numerisk kode for det første tegn i en tekststreng\r\nCONCATENATE\t\t= SAMMENKÆDNING\t\t\t##\tSammenkæder adskillige tekstelementer til ét tekstelement\r\nDOLLAR\t\t\t= KR\t\t\t\t##\tKonverterer et tal til tekst ved hjælp af valutaformatet kr. (kroner)\r\nEXACT\t\t\t= EKSAKT\t\t\t##\tKontrollerer, om to tekstværdier er identiske\r\nFIND\t\t\t= FIND\t\t\t\t##\tSøger efter en tekstværdi i en anden tekstværdi (der skelnes mellem store og små bogstaver)\r\nFINDB\t\t\t= FINDB\t\t\t\t##\tSøger efter en tekstværdi i en anden tekstværdi (der skelnes mellem store og små bogstaver)\r\nFIXED\t\t\t= FAST\t\t\t\t##\tFormaterer et tal som tekst med et fast antal decimaler\r\nJIS\t\t\t= JIS\t\t\t\t##\tÆndrer engelske tegn i halv bredde (enkelt-byte) eller katakana i en tegnstreng til tegn i fuld bredde (dobbelt-byte)\r\nLEFT\t\t\t= VENSTRE\t\t\t##\tReturnerer tegnet længst til venstre i en tekstværdi\r\nLEFTB\t\t\t= VENSTREB\t\t\t##\tReturnerer tegnet længst til venstre i en tekstværdi\r\nLEN\t\t\t= LÆNGDE\t\t\t##\tReturnerer antallet af tegn i en tekststreng\r\nLENB\t\t\t= LÆNGDEB\t\t\t##\tReturnerer antallet af tegn i en tekststreng\r\nLOWER\t\t\t= SMÅ.BOGSTAVER\t\t\t##\tKonverterer tekst til små bogstaver\r\nMID\t\t\t= MIDT\t\t\t\t##\tReturnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition\r\nMIDB\t\t\t= MIDTB\t\t\t\t##\tReturnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition\r\nPHONETIC\t\t= FONETISK\t\t\t##\tUddrager de fonetiske (furigana) tegn fra en tekststreng\r\nPROPER\t\t\t= STORT.FORBOGSTAV\t\t##\tKonverterer første bogstav i hvert ord i teksten til stort bogstav\r\nREPLACE\t\t\t= ERSTAT\t\t\t##\tErstatter tegn i tekst\r\nREPLACEB\t\t= ERSTATB\t\t\t##\tErstatter tegn i tekst\r\nREPT\t\t\t= GENTAG\t\t\t##\tGentager tekst et givet antal gange\r\nRIGHT\t\t\t= HØJRE\t\t\t\t##\tReturnerer tegnet længste til højre i en tekstværdi\r\nRIGHTB\t\t\t= HØJREB\t\t\t##\tReturnerer tegnet længste til højre i en tekstværdi\r\nSEARCH\t\t\t= SØG\t\t\t\t##\tSøger efter en tekstværdi i en anden tekstværdi (der skelnes ikke mellem store og små bogstaver)\r\nSEARCHB\t\t\t= SØGB\t\t\t\t##\tSøger efter en tekstværdi i en anden tekstværdi (der skelnes ikke mellem store og små bogstaver)\r\nSUBSTITUTE\t\t= UDSKIFT\t\t\t##\tUdskifter gammel tekst med ny tekst i en tekststreng\r\nT\t\t\t= T\t\t\t\t##\tKonverterer argumenterne til tekst\r\nTEXT\t\t\t= TEKST\t\t\t\t##\tFormaterer et tal og konverterer det til tekst\r\nTRIM\t\t\t= FJERN.OVERFLØDIGE.BLANKE\t##\tFjerner mellemrum fra tekst\r\nUPPER\t\t\t= STORE.BOGSTAVER\t\t##\tKonverterer tekst til store bogstaver\r\nVALUE\t\t\t= VÆRDI\t\t\t\t##\tKonverterer et tekstargument til et tal\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/de/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= €\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NULL!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #WERT!\r\nREF\t= #BEZUG!\r\nNAME\t= #NAME?\r\nNUM\t= #ZAHL!\r\nNA\t= #NV\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/de/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tAdd-In- und Automatisierungsfunktionen\r\n##\r\nGETPIVOTDATA\t= PIVOTDATENZUORDNEN\t\t\t##\tIn einem PivotTable-Bericht gespeicherte Daten werden zurückgegeben.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tCubefunktionen\r\n##\r\nCUBEKPIMEMBER\t\t= CUBEKPIELEMENT\t\t##\tGibt Name, Eigenschaft und Measure eines Key Performance Indicators (KPI) zurück und zeigt den Namen und die Eigenschaft in der Zelle an. Ein KPI ist ein quantifizierbares Maß, wie z. B. der monatliche Bruttogewinn oder die vierteljährliche Mitarbeiterfluktuation, mit dessen Hilfe das Leistungsverhalten eines Unternehmens überwacht werden kann.\r\nCUBEMEMBER\t\t= CUBEELEMENT\t\t\t##\tGibt ein Element oder ein Tuple in einer Cubehierarchie zurück. Wird verwendet, um zu überprüfen, ob das Element oder Tuple im Cube vorhanden ist.\r\nCUBEMEMBERPROPERTY\t= CUBEELEMENTEIGENSCHAFT\t##\tGibt den Wert einer Elementeigenschaft im Cube zurück. Wird verwendet, um zu überprüfen, ob ein Elementname im Cube vorhanden ist, und um die für dieses Element angegebene Eigenschaft zurückzugeben.\r\nCUBERANKEDMEMBER\t= CUBERANGELEMENT\t\t##\tGibt das n-te oder n-rangige Element in einer Menge zurück. Wird verwendet, um mindestens ein Element in einer Menge zurückzugeben, wie z. B. bester Vertriebsmitarbeiter oder 10 beste Kursteilnehmer.\r\nCUBESET\t\t\t= CUBEMENGE\t\t\t##\tDefiniert eine berechnete Menge Elemente oder Tuples durch Senden eines Mengenausdrucks an den Cube auf dem Server, der die Menge erstellt und an Microsoft Office Excel zurückgibt.\r\nCUBESETCOUNT\t\t= CUBEMENGENANZAHL\t\t##\tGibt die Anzahl der Elemente in einer Menge zurück.\r\nCUBEVALUE\t\t= CUBEWERT\t\t\t##\tGibt einen Aggregatwert aus einem Cube zurück.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tDatenbankfunktionen\r\n##\r\nDAVERAGE\t\t= DBMITTELWERT\t\t\t##\tGibt den Mittelwert der ausgewählten Datenbankeinträge zurück\r\nDCOUNT\t\t\t= DBANZAHL\t\t\t##\tZählt die Zellen mit Zahlen in einer Datenbank\r\nDCOUNTA\t\t\t= DBANZAHL2\t\t\t##\tZählt nicht leere Zellen in einer Datenbank\r\nDGET\t\t\t= DBAUSZUG\t\t\t##\tExtrahiert aus einer Datenbank einen einzelnen Datensatz, der den angegebenen Kriterien entspricht\r\nDMAX\t\t\t= DBMAX\t\t\t\t##\tGibt den größten Wert aus ausgewählten Datenbankeinträgen zurück\r\nDMIN\t\t\t= DBMIN\t\t\t\t##\tGibt den kleinsten Wert aus ausgewählten Datenbankeinträgen zurück\r\nDPRODUCT\t\t= DBPRODUKT\t\t\t##\tMultipliziert die Werte in einem bestimmten Feld mit Datensätzen, die den Kriterien in einer Datenbank entsprechen\r\nDSTDEV\t\t\t= DBSTDABW\t\t\t##\tSchätzt die Standardabweichung auf der Grundlage einer Stichprobe aus ausgewählten Datenbankeinträgen\r\nDSTDEVP\t\t\t= DBSTDABWN\t\t\t##\tBerechnet die Standardabweichung auf der Grundlage der Grundgesamtheit ausgewählter Datenbankeinträge\r\nDSUM\t\t\t= DBSUMME\t\t\t##\tAddiert die Zahlen in der Feldspalte mit Datensätzen in der Datenbank, die den Kriterien entsprechen\r\nDVAR\t\t\t= DBVARIANZ\t\t\t##\tSchätzt die Varianz auf der Grundlage ausgewählter Datenbankeinträge\r\nDVARP\t\t\t= DBVARIANZEN\t\t\t##\tBerechnet die Varianz auf der Grundlage der Grundgesamtheit ausgewählter Datenbankeinträge\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tDatums- und Zeitfunktionen\r\n##\r\nDATE\t\t\t= DATUM\t\t\t\t##\tGibt die fortlaufende Zahl eines bestimmten Datums zurück\r\nDATEVALUE\t\t= DATWERT\t\t\t##\tWandelt ein Datum in Form von Text in eine fortlaufende Zahl um\r\nDAY\t\t\t= TAG\t\t\t\t##\tWandelt eine fortlaufende Zahl in den Tag des Monats um\r\nDAYS360\t\t\t= TAGE360\t\t\t##\tBerechnet die Anzahl der Tage zwischen zwei Datumsangaben ausgehend von einem Jahr, das 360 Tage hat\r\nEDATE\t\t\t= EDATUM\t\t\t##\tGibt die fortlaufende Zahl des Datums zurück, bei dem es sich um die angegebene Anzahl von Monaten vor oder nach dem Anfangstermin handelt\r\nEOMONTH\t\t\t= MONATSENDE\t\t\t##\tGibt die fortlaufende Zahl des letzten Tags des Monats vor oder nach einer festgelegten Anzahl von Monaten zurück\r\nHOUR\t\t\t= STUNDE\t\t\t##\tWandelt eine fortlaufende Zahl in eine Stunde um\r\nMINUTE\t\t\t= MINUTE\t\t\t##\tWandelt eine fortlaufende Zahl in eine Minute um\r\nMONTH\t\t\t= MONAT\t\t\t\t##\tWandelt eine fortlaufende Zahl in einen Monat um\r\nNETWORKDAYS\t\t= NETTOARBEITSTAGE\t\t##\tGibt die Anzahl von ganzen Arbeitstagen zwischen zwei Datumswerten zurück\r\nNOW\t\t\t= JETZT\t\t\t\t##\tGibt die fortlaufende Zahl des aktuellen Datums und der aktuellen Uhrzeit zurück\r\nSECOND\t\t\t= SEKUNDE\t\t\t##\tWandelt eine fortlaufende Zahl in eine Sekunde um\r\nTIME\t\t\t= ZEIT\t\t\t\t##\tGibt die fortlaufende Zahl einer bestimmten Uhrzeit zurück\r\nTIMEVALUE\t\t= ZEITWERT\t\t\t##\tWandelt eine Uhrzeit in Form von Text in eine fortlaufende Zahl um\r\nTODAY\t\t\t= HEUTE\t\t\t\t##\tGibt die fortlaufende Zahl des heutigen Datums zurück\r\nWEEKDAY\t\t\t= WOCHENTAG\t\t\t##\tWandelt eine fortlaufende Zahl in den Wochentag um\r\nWEEKNUM\t\t\t= KALENDERWOCHE\t\t\t##\tWandelt eine fortlaufende Zahl in eine Zahl um, die angibt, in welche Woche eines Jahres das angegebene Datum fällt\r\nWORKDAY\t\t\t= ARBEITSTAG\t\t\t##\tGibt die fortlaufende Zahl des Datums vor oder nach einer bestimmten Anzahl von Arbeitstagen zurück\r\nYEAR\t\t\t= JAHR\t\t\t\t##\tWandelt eine fortlaufende Zahl in ein Jahr um\r\nYEARFRAC\t\t= BRTEILJAHRE\t\t\t##\tGibt die Anzahl der ganzen Tage zwischen Ausgangsdatum und Enddatum in Bruchteilen von Jahren zurück\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tKonstruktionsfunktionen\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tGibt die geänderte Besselfunktion In(x) zurück\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tGibt die Besselfunktion Jn(x) zurück\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tGibt die geänderte Besselfunktion Kn(x) zurück\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tGibt die Besselfunktion Yn(x) zurück\r\nBIN2DEC\t\t\t= BININDEZ\t\t\t##\tWandelt eine binäre Zahl (Dualzahl) in eine dezimale Zahl um\r\nBIN2HEX\t\t\t= BININHEX\t\t\t##\tWandelt eine binäre Zahl (Dualzahl) in eine hexadezimale Zahl um\r\nBIN2OCT\t\t\t= BININOKT\t\t\t##\tWandelt eine binäre Zahl (Dualzahl) in eine oktale Zahl um\r\nCOMPLEX\t\t\t= KOMPLEXE\t\t\t##\tWandelt den Real- und Imaginärteil in eine komplexe Zahl um\r\nCONVERT\t\t\t= UMWANDELN\t\t\t##\tWandelt eine Zahl von einem Maßsystem in ein anderes um\r\nDEC2BIN\t\t\t= DEZINBIN\t\t\t##\tWandelt eine dezimale Zahl in eine binäre Zahl (Dualzahl) um\r\nDEC2HEX\t\t\t= DEZINHEX\t\t\t##\tWandelt eine dezimale Zahl in eine hexadezimale Zahl um\r\nDEC2OCT\t\t\t= DEZINOKT\t\t\t##\tWandelt eine dezimale Zahl in eine oktale Zahl um\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tÜberprüft, ob zwei Werte gleich sind\r\nERF\t\t\t= GAUSSFEHLER\t\t\t##\tGibt die Gauss'sche Fehlerfunktion zurück\r\nERFC\t\t\t= GAUSSFKOMPL\t\t\t##\tGibt das Komplement zur Gauss'schen Fehlerfunktion zurück\r\nGESTEP\t\t\t= GGANZZAHL\t\t\t##\tÜberprüft, ob eine Zahl größer als ein gegebener Schwellenwert ist\r\nHEX2BIN\t\t\t= HEXINBIN\t\t\t##\tWandelt eine hexadezimale Zahl in eine Binärzahl um\r\nHEX2DEC\t\t\t= HEXINDEZ\t\t\t##\tWandelt eine hexadezimale Zahl in eine dezimale Zahl um\r\nHEX2OCT\t\t\t= HEXINOKT\t\t\t##\tWandelt eine hexadezimale Zahl in eine Oktalzahl um\r\nIMABS\t\t\t= IMABS\t\t\t\t##\tGibt den Absolutbetrag (Modulo) einer komplexen Zahl zurück\r\nIMAGINARY\t\t= IMAGINÄRTEIL\t\t\t##\tGibt den Imaginärteil einer komplexen Zahl zurück\r\nIMARGUMENT\t\t= IMARGUMENT\t\t\t##\tGibt das Argument Theta zurück, einen Winkel, der als Bogenmaß ausgedrückt wird\r\nIMCONJUGATE\t\t= IMKONJUGIERTE\t\t\t##\tGibt die konjugierte komplexe Zahl zu einer komplexen Zahl zurück\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tGibt den Kosinus einer komplexen Zahl zurück\r\nIMDIV\t\t\t= IMDIV\t\t\t\t##\tGibt den Quotienten zweier komplexer Zahlen zurück\r\nIMEXP\t\t\t= IMEXP\t\t\t\t##\tGibt die algebraische Form einer in exponentieller Schreibweise vorliegenden komplexen Zahl zurück\r\nIMLN\t\t\t= IMLN\t\t\t\t##\tGibt den natürlichen Logarithmus einer komplexen Zahl zurück\r\nIMLOG10\t\t\t= IMLOG10\t\t\t##\tGibt den Logarithmus einer komplexen Zahl zur Basis 10 zurück\r\nIMLOG2\t\t\t= IMLOG2\t\t\t##\tGibt den Logarithmus einer komplexen Zahl zur Basis 2 zurück\r\nIMPOWER\t\t\t= IMAPOTENZ\t\t\t##\tPotenziert eine komplexe Zahl mit einer ganzen Zahl\r\nIMPRODUCT\t\t= IMPRODUKT\t\t\t##\tGibt das Produkt von komplexen Zahlen zurück\r\nIMREAL\t\t\t= IMREALTEIL\t\t\t##\tGibt den Realteil einer komplexen Zahl zurück\r\nIMSIN\t\t\t= IMSIN\t\t\t\t##\tGibt den Sinus einer komplexen Zahl zurück\r\nIMSQRT\t\t\t= IMWURZEL\t\t\t##\tGibt die Quadratwurzel einer komplexen Zahl zurück\r\nIMSUB\t\t\t= IMSUB\t\t\t\t##\tGibt die Differenz zwischen zwei komplexen Zahlen zurück\r\nIMSUM\t\t\t= IMSUMME\t\t\t##\tGibt die Summe von komplexen Zahlen zurück\r\nOCT2BIN\t\t\t= OKTINBIN\t\t\t##\tWandelt eine oktale Zahl in eine binäre Zahl (Dualzahl) um\r\nOCT2DEC\t\t\t= OKTINDEZ\t\t\t##\tWandelt eine oktale Zahl in eine dezimale Zahl um\r\nOCT2HEX\t\t\t= OKTINHEX\t\t\t##\tWandelt eine oktale Zahl in eine hexadezimale Zahl um\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFinanzmathematische Funktionen\r\n##\r\nACCRINT\t\t\t= AUFGELZINS\t\t\t##\tGibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers mit periodischen Zinszahlungen zurück\r\nACCRINTM\t\t= AUFGELZINSF\t\t\t##\tGibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers zurück, die bei Fälligkeit ausgezahlt werden\r\nAMORDEGRC\t\t= AMORDEGRK\t\t\t##\tGibt die Abschreibung für die einzelnen Abschreibungszeiträume mithilfe eines Abschreibungskoeffizienten zurück\r\nAMORLINC\t\t= AMORLINEARK\t\t\t##\tGibt die Abschreibung für die einzelnen Abschreibungszeiträume zurück\r\nCOUPDAYBS\t\t= ZINSTERMTAGVA\t\t\t##\tGibt die Anzahl der Tage vom Anfang des Zinstermins bis zum Abrechnungstermin zurück\r\nCOUPDAYS\t\t= ZINSTERMTAGE\t\t\t##\tGibt die Anzahl der Tage der Zinsperiode zurück, die den Abrechnungstermin einschließt\r\nCOUPDAYSNC\t\t= ZINSTERMTAGNZ\t\t\t##\tGibt die Anzahl der Tage vom Abrechnungstermin bis zum nächsten Zinstermin zurück\r\nCOUPNCD\t\t\t= ZINSTERMNZ\t\t\t##\tGibt das Datum des ersten Zinstermins nach dem Abrechnungstermin zurück\r\nCOUPNUM\t\t\t= ZINSTERMZAHL\t\t\t##\tGibt die Anzahl der Zinstermine zwischen Abrechnungs- und Fälligkeitsdatum zurück\r\nCOUPPCD\t\t\t= ZINSTERMVZ\t\t\t##\tGibt das Datum des letzten Zinstermins vor dem Abrechnungstermin zurück\r\nCUMIPMT\t\t\t= KUMZINSZ\t\t\t##\tBerechnet die kumulierten Zinsen, die zwischen zwei Perioden zu zahlen sind\r\nCUMPRINC\t\t= KUMKAPITAL\t\t\t##\tBerechnet die aufgelaufene Tilgung eines Darlehens, die zwischen zwei Perioden zu zahlen ist\r\nDB\t\t\t= GDA2\t\t\t\t##\tGibt die geometrisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück\r\nDDB\t\t\t= GDA\t\t\t\t##\tGibt die Abschreibung eines Anlageguts für einen angegebenen Zeitraum unter Verwendung der degressiven Doppelraten-Abschreibung oder eines anderen von Ihnen angegebenen Abschreibungsverfahrens zurück\r\nDISC\t\t\t= DISAGIO\t\t\t##\tGibt den in Prozent ausgedrückten Abzinsungssatz eines Wertpapiers zurück\r\nDOLLARDE\t\t= NOTIERUNGDEZ\t\t\t##\tWandelt eine Notierung, die als Dezimalbruch ausgedrückt wurde, in eine Dezimalzahl um\r\nDOLLARFR\t\t= NOTIERUNGBRU\t\t\t##\tWandelt eine Notierung, die als Dezimalzahl ausgedrückt wurde, in einen Dezimalbruch um\r\nDURATION\t\t= DURATION\t\t\t##\tGibt die jährliche Duration eines Wertpapiers mit periodischen Zinszahlungen zurück\r\nEFFECT\t\t\t= EFFEKTIV\t\t\t##\tGibt die jährliche Effektivverzinsung zurück\r\nFV\t\t\t= ZW\t\t\t\t##\tGibt den zukünftigen Wert (Endwert) einer Investition zurück\r\nFVSCHEDULE\t\t= ZW2\t\t\t\t##\tGibt den aufgezinsten Wert des Anfangskapitals für eine Reihe periodisch unterschiedlicher Zinssätze zurück\r\nINTRATE\t\t\t= ZINSSATZ\t\t\t##\tGibt den Zinssatz eines voll investierten Wertpapiers zurück\r\nIPMT\t\t\t= ZINSZ\t\t\t\t##\tGibt die Zinszahlung einer Investition für die angegebene Periode zurück\r\nIRR\t\t\t= IKV\t\t\t\t##\tGibt den internen Zinsfuß einer Investition ohne Finanzierungskosten oder Reinvestitionsgewinne zurück\r\nISPMT\t\t\t= ISPMT\t\t\t\t##\tBerechnet die während eines bestimmten Zeitraums für eine Investition gezahlten Zinsen\r\nMDURATION\t\t= MDURATION\t\t\t##\tGibt die geänderte Dauer für ein Wertpapier mit einem angenommenen Nennwert von 100 € zurück\r\nMIRR\t\t\t= QIKV\t\t\t\t##\tGibt den internen Zinsfuß zurück, wobei positive und negative Zahlungen zu unterschiedlichen Sätzen finanziert werden\r\nNOMINAL\t\t\t= NOMINAL\t\t\t##\tGibt die jährliche Nominalverzinsung zurück\r\nNPER\t\t\t= ZZR\t\t\t\t##\tGibt die Anzahl der Zahlungsperioden einer Investition zurück\r\nNPV\t\t\t= NBW\t\t\t\t##\tGibt den Nettobarwert einer Investition auf Basis periodisch anfallender Zahlungen und eines Abzinsungsfaktors zurück\r\nODDFPRICE\t\t= UNREGER.KURS\t\t\t##\tGibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück\r\nODDFYIELD\t\t= UNREGER.REND\t\t\t##\tGibt die Rendite eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück\r\nODDLPRICE\t\t= UNREGLE.KURS\t\t\t##\tGibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück\r\nODDLYIELD\t\t= UNREGLE.REND\t\t\t##\tGibt die Rendite eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück\r\nPMT\t\t\t= RMZ\t\t\t\t##\tGibt die periodische Zahlung für eine Annuität zurück\r\nPPMT\t\t\t= KAPZ\t\t\t\t##\tGibt die Kapitalrückzahlung einer Investition für eine angegebene Periode zurück\r\nPRICE\t\t\t= KURS\t\t\t\t##\tGibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das periodisch Zinsen auszahlt\r\nPRICEDISC\t\t= KURSDISAGIO\t\t\t##\tGibt den Kurs pro 100 € Nennwert eines unverzinslichen Wertpapiers zurück\r\nPRICEMAT\t\t= KURSFÄLLIG\t\t\t##\tGibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das Zinsen am Fälligkeitsdatum auszahlt\r\nPV\t\t\t= BW\t\t\t\t##\tGibt den Barwert einer Investition zurück\r\nRATE\t\t\t= ZINS\t\t\t\t##\tGibt den Zinssatz pro Zeitraum einer Annuität zurück\r\nRECEIVED\t\t= AUSZAHLUNG\t\t\t##\tGibt den Auszahlungsbetrag eines voll investierten Wertpapiers am Fälligkeitstermin zurück\r\nSLN\t\t\t= LIA\t\t\t\t##\tGibt die lineare Abschreibung eines Wirtschaftsguts pro Periode zurück\r\nSYD\t\t\t= DIA\t\t\t\t##\tGibt die arithmetisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück\r\nTBILLEQ\t\t\t= TBILLÄQUIV\t\t\t##\tGibt die Rendite für ein Wertpapier zurück\r\nTBILLPRICE\t\t= TBILLKURS\t\t\t##\tGibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück\r\nTBILLYIELD\t\t= TBILLRENDITE\t\t\t##\tGibt die Rendite für ein Wertpapier zurück\r\nVDB\t\t\t= VDB\t\t\t\t##\tGibt die degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode oder Teilperiode zurück\r\nXIRR\t\t\t= XINTZINSFUSS\t\t\t##\tGibt den internen Zinsfuß einer Reihe nicht periodisch anfallender Zahlungen zurück\r\nXNPV\t\t\t= XKAPITALWERT\t\t\t##\tGibt den Nettobarwert (Kapitalwert) einer Reihe nicht periodisch anfallender Zahlungen zurück\r\nYIELD\t\t\t= RENDITE\t\t\t##\tGibt die Rendite eines Wertpapiers zurück, das periodisch Zinsen auszahlt\r\nYIELDDISC\t\t= RENDITEDIS\t\t\t##\tGibt die jährliche Rendite eines unverzinslichen Wertpapiers zurück\r\nYIELDMAT\t\t= RENDITEFÄLL\t\t\t##\tGibt die jährliche Rendite eines Wertpapiers zurück, das Zinsen am Fälligkeitsdatum auszahlt\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tInformationsfunktionen\r\n##\r\nCELL\t\t\t= ZELLE\t\t\t\t##\tGibt Informationen zu Formatierung, Position oder Inhalt einer Zelle zurück\r\nERROR.TYPE\t\t= FEHLER.TYP\t\t\t##\tGibt eine Zahl zurück, die einem Fehlertyp entspricht\r\nINFO\t\t\t= INFO\t\t\t\t##\tGibt Informationen zur aktuellen Betriebssystemumgebung zurück\r\nISBLANK\t\t\t= ISTLEER\t\t\t##\tGibt WAHR zurück, wenn der Wert leer ist\r\nISERR\t\t\t= ISTFEHL\t\t\t##\tGibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert außer #N/V ist\r\nISERROR\t\t\t= ISTFEHLER\t\t\t##\tGibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert ist\r\nISEVEN\t\t\t= ISTGERADE\t\t\t##\tGibt WAHR zurück, wenn es sich um eine gerade Zahl handelt\r\nISLOGICAL\t\t= ISTLOG\t\t\t##\tGibt WAHR zurück, wenn der Wert ein Wahrheitswert ist\r\nISNA\t\t\t= ISTNV\t\t\t\t##\tGibt WAHR zurück, wenn der Wert der Fehlerwert #N/V ist\r\nISNONTEXT\t\t= ISTKTEXT\t\t\t##\tGibt WAHR zurück, wenn der Wert ein Element ist, das keinen Text enthält\r\nISNUMBER\t\t= ISTZAHL\t\t\t##\tGibt WAHR zurück, wenn der Wert eine Zahl ist\r\nISODD\t\t\t= ISTUNGERADE\t\t\t##\tGibt WAHR zurück, wenn es sich um eine ungerade Zahl handelt\r\nISREF\t\t\t= ISTBEZUG\t\t\t##\tGibt WAHR zurück, wenn der Wert ein Bezug ist\r\nISTEXT\t\t\t= ISTTEXT\t\t\t##\tGibt WAHR zurück, wenn der Wert ein Element ist, das Text enthält\r\nN\t\t\t= N\t\t\t\t##\tGibt den in eine Zahl umgewandelten Wert zurück\r\nNA\t\t\t= NV\t\t\t\t##\tGibt den Fehlerwert #NV zurück\r\nTYPE\t\t\t= TYP\t\t\t\t##\tGibt eine Zahl zurück, die den Datentyp des angegebenen Werts anzeigt\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tLogische Funktionen\r\n##\r\nAND\t\t\t= UND\t\t\t\t##\tGibt WAHR zurück, wenn alle zugehörigen Argumente WAHR sind\r\nFALSE\t\t\t= FALSCH\t\t\t##\tGibt den Wahrheitswert FALSCH zurück\r\nIF\t\t\t= WENN\t\t\t\t##\tGibt einen logischen Test zum Ausführen an\r\nIFERROR\t\t\t= WENNFEHLER\t\t\t##\tGibt einen von Ihnen festgelegten Wert zurück, wenn die Auswertung der Formel zu einem Fehler führt; andernfalls wird das Ergebnis der Formel zurückgegeben\r\nNOT\t\t\t= NICHT\t\t\t\t##\tKehrt den Wahrheitswert der zugehörigen Argumente um\r\nOR\t\t\t= ODER\t\t\t\t##\tGibt WAHR zurück, wenn ein Argument WAHR ist\r\nTRUE\t\t\t= WAHR\t\t\t\t##\tGibt den Wahrheitswert WAHR zurück\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tNachschlage- und Verweisfunktionen\r\n##\r\nADDRESS\t\t\t= ADRESSE\t\t\t##\tGibt einen Bezug auf eine einzelne Zelle in einem Tabellenblatt als Text zurück\r\nAREAS\t\t\t= BEREICHE\t\t\t##\tGibt die Anzahl der innerhalb eines Bezugs aufgeführten Bereiche zurück\r\nCHOOSE\t\t\t= WAHL\t\t\t\t##\tWählt einen Wert aus eine Liste mit Werten aus\r\nCOLUMN\t\t\t= SPALTE\t\t\t##\tGibt die Spaltennummer eines Bezugs zurück\r\nCOLUMNS\t\t\t= SPALTEN\t\t\t##\tGibt die Anzahl der Spalten in einem Bezug zurück\r\nHLOOKUP\t\t\t= HVERWEIS\t\t\t##\tSucht in der obersten Zeile einer Matrix und gibt den Wert der angegebenen Zelle zurück\r\nHYPERLINK\t\t= HYPERLINK\t\t\t##\tErstellt eine Verknüpfung, über die ein auf einem Netzwerkserver, in einem Intranet oder im Internet gespeichertes Dokument geöffnet wird\r\nINDEX\t\t\t= INDEX\t\t\t\t##\tVerwendet einen Index, um einen Wert aus einem Bezug oder einer Matrix auszuwählen\r\nINDIRECT\t\t= INDIREKT\t\t\t##\tGibt einen Bezug zurück, der von einem Textwert angegeben wird\r\nLOOKUP\t\t\t= LOOKUP\t\t\t##\tSucht Werte in einem Vektor oder einer Matrix\r\nMATCH\t\t\t= VERGLEICH\t\t\t##\tSucht Werte in einem Bezug oder einer Matrix\r\nOFFSET\t\t\t= BEREICH.VERSCHIEBEN\t\t##\tGibt einen Bezugoffset aus einem gegebenen Bezug zurück\r\nROW\t\t\t= ZEILE\t\t\t\t##\tGibt die Zeilennummer eines Bezugs zurück\r\nROWS\t\t\t= ZEILEN\t\t\t##\tGibt die Anzahl der Zeilen in einem Bezug zurück\r\nRTD\t\t\t= RTD\t\t\t\t##\tRuft Echtzeitdaten von einem Programm ab, das die COM-Automatisierung (Automatisierung: Ein Verfahren, bei dem aus einer Anwendung oder einem Entwicklungstool heraus mit den Objekten einer anderen Anwendung gearbeitet wird. Die früher als OLE-Automatisierung bezeichnete Automatisierung ist ein Industriestandard und eine Funktion von COM (Component Object Model).) unterstützt\r\nTRANSPOSE\t\t= MTRANS\t\t\t##\tGibt die transponierte Matrix einer Matrix zurück\r\nVLOOKUP\t\t\t= SVERWEIS\t\t\t##\tSucht in der ersten Spalte einer Matrix und arbeitet sich durch die Zeile, um den Wert einer Zelle zurückzugeben\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tMathematische und trigonometrische Funktionen\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tGibt den Absolutwert einer Zahl zurück\r\nACOS\t\t\t= ARCCOS\t\t\t##\tGibt den Arkuskosinus einer Zahl zurück\r\nACOSH\t\t\t= ARCCOSHYP\t\t\t##\tGibt den umgekehrten hyperbolischen Kosinus einer Zahl zurück\r\nASIN\t\t\t= ARCSIN\t\t\t##\tGibt den Arkussinus einer Zahl zurück\r\nASINH\t\t\t= ARCSINHYP\t\t\t##\tGibt den umgekehrten hyperbolischen Sinus einer Zahl zurück\r\nATAN\t\t\t= ARCTAN\t\t\t##\tGibt den Arkustangens einer Zahl zurück\r\nATAN2\t\t\t= ARCTAN2\t\t\t##\tGibt den Arkustangens einer x- und einer y-Koordinate zurück\r\nATANH\t\t\t= ARCTANHYP\t\t\t##\tGibt den umgekehrten hyperbolischen Tangens einer Zahl zurück\r\nCEILING\t\t\t= OBERGRENZE\t\t\t##\tRundet eine Zahl auf die nächste ganze Zahl oder das nächste Vielfache von Schritt\r\nCOMBIN\t\t\t= KOMBINATIONEN\t\t\t##\tGibt die Anzahl der Kombinationen für eine bestimmte Anzahl von Objekten zurück\r\nCOS\t\t\t= COS\t\t\t\t##\tGibt den Kosinus einer Zahl zurück\r\nCOSH\t\t\t= COSHYP\t\t\t##\tGibt den hyperbolischen Kosinus einer Zahl zurück\r\nDEGREES\t\t\t= GRAD\t\t\t\t##\tWandelt Bogenmaß (Radiant) in Grad um\r\nEVEN\t\t\t= GERADE\t\t\t##\tRundet eine Zahl auf die nächste gerade ganze Zahl auf\r\nEXP\t\t\t= EXP\t\t\t\t##\tPotenziert die Basis e mit der als Argument angegebenen Zahl\r\nFACT\t\t\t= FAKULTÄT\t\t\t##\tGibt die Fakultät einer Zahl zurück\r\nFACTDOUBLE\t\t= ZWEIFAKULTÄT\t\t\t##\tGibt die Fakultät zu Zahl mit Schrittlänge 2 zurück\r\nFLOOR\t\t\t= UNTERGRENZE\t\t\t##\tRundet die Zahl auf Anzahl_Stellen ab\r\nGCD\t\t\t= GGT\t\t\t\t##\tGibt den größten gemeinsamen Teiler zurück\r\nINT\t\t\t= GANZZAHL\t\t\t##\tRundet eine Zahl auf die nächstkleinere ganze Zahl ab\r\nLCM\t\t\t= KGV\t\t\t\t##\tGibt das kleinste gemeinsame Vielfache zurück\r\nLN\t\t\t= LN\t\t\t\t##\tGibt den natürlichen Logarithmus einer Zahl zurück\r\nLOG\t\t\t= LOG\t\t\t\t##\tGibt den Logarithmus einer Zahl zu der angegebenen Basis zurück\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tGibt den Logarithmus einer Zahl zur Basis 10 zurück\r\nMDETERM\t\t\t= MDET\t\t\t\t##\tGibt die Determinante einer Matrix zurück\r\nMINVERSE\t\t= MINV\t\t\t\t##\tGibt die inverse Matrix einer Matrix zurück\r\nMMULT\t\t\t= MMULT\t\t\t\t##\tGibt das Produkt zweier Matrizen zurück\r\nMOD\t\t\t= REST\t\t\t\t##\tGibt den Rest einer Division zurück\r\nMROUND\t\t\t= VRUNDEN\t\t\t##\tGibt eine auf das gewünschte Vielfache gerundete Zahl zurück\r\nMULTINOMIAL\t\t= POLYNOMIAL\t\t\t##\tGibt den Polynomialkoeffizienten einer Gruppe von Zahlen zurück\r\nODD\t\t\t= UNGERADE\t\t\t##\tRundet eine Zahl auf die nächste ungerade ganze Zahl auf\r\nPI\t\t\t= PI\t\t\t\t##\tGibt den Wert Pi zurück\r\nPOWER\t\t\t= POTENZ\t\t\t##\tGibt als Ergebnis eine potenzierte Zahl zurück\r\nPRODUCT\t\t\t= PRODUKT\t\t\t##\tMultipliziert die zugehörigen Argumente\r\nQUOTIENT\t\t= QUOTIENT\t\t\t##\tGibt den ganzzahligen Anteil einer Division zurück\r\nRADIANS\t\t\t= BOGENMASS\t\t\t##\tWandelt Grad in Bogenmaß (Radiant) um\r\nRAND\t\t\t= ZUFALLSZAHL\t\t\t##\tGibt eine Zufallszahl zwischen 0 und 1 zurück\r\nRANDBETWEEN\t\t= ZUFALLSBEREICH\t\t##\tGibt eine Zufallszahl aus dem festgelegten Bereich zurück\r\nROMAN\t\t\t= RÖMISCH\t\t\t##\tWandelt eine arabische Zahl in eine römische Zahl als Text um\r\nROUND\t\t\t= RUNDEN\t\t\t##\tRundet eine Zahl auf eine bestimmte Anzahl von Dezimalstellen\r\nROUNDDOWN\t\t= ABRUNDEN\t\t\t##\tRundet die Zahl auf Anzahl_Stellen ab\r\nROUNDUP\t\t\t= AUFRUNDEN\t\t\t##\tRundet die Zahl auf Anzahl_Stellen auf\r\nSERIESSUM\t\t= POTENZREIHE\t\t\t##\tGibt die Summe von Potenzen (zur Berechnung von Potenzreihen und dichotomen Wahrscheinlichkeiten) zurück\r\nSIGN\t\t\t= VORZEICHEN\t\t\t##\tGibt das Vorzeichen einer Zahl zurück\r\nSIN\t\t\t= SIN\t\t\t\t##\tGibt den Sinus einer Zahl zurück\r\nSINH\t\t\t= SINHYP\t\t\t##\tGibt den hyperbolischen Sinus einer Zahl zurück\r\nSQRT\t\t\t= WURZEL\t\t\t##\tGibt die Quadratwurzel einer Zahl zurück\r\nSQRTPI\t\t\t= WURZELPI\t\t\t##\tGibt die Wurzel aus der mit Pi (pi) multiplizierten Zahl zurück\r\nSUBTOTAL\t\t= TEILERGEBNIS\t\t\t##\tGibt ein Teilergebnis in einer Liste oder Datenbank zurück\r\nSUM\t\t\t= SUMME\t\t\t\t##\tAddiert die zugehörigen Argumente\r\nSUMIF\t\t\t= SUMMEWENN\t\t\t##\tAddiert Zahlen, die mit den Suchkriterien übereinstimmen\r\nSUMIFS\t\t\t= SUMMEWENNS\t\t\t##\tDie Zellen, die mehrere Kriterien erfüllen, werden in einem Bereich hinzugefügt\r\nSUMPRODUCT\t\t= SUMMENPRODUKT\t\t\t##\tGibt die Summe der Produkte zusammengehöriger Matrixkomponenten zurück\r\nSUMSQ\t\t\t= QUADRATESUMME\t\t\t##\tGibt die Summe der quadrierten Argumente zurück\r\nSUMX2MY2\t\t= SUMMEX2MY2\t\t\t##\tGibt die Summe der Differenzen der Quadrate für zusammengehörige Komponenten zweier Matrizen zurück\r\nSUMX2PY2\t\t= SUMMEX2PY2\t\t\t##\tGibt die Summe der Quadrate für zusammengehörige Komponenten zweier Matrizen zurück\r\nSUMXMY2\t\t\t= SUMMEXMY2\t\t\t##\tGibt die Summe der quadrierten Differenzen für zusammengehörige Komponenten zweier Matrizen zurück\r\nTAN\t\t\t= TAN\t\t\t\t##\tGibt den Tangens einer Zahl zurück\r\nTANH\t\t\t= TANHYP\t\t\t##\tGibt den hyperbolischen Tangens einer Zahl zurück\r\nTRUNC\t\t\t= KÜRZEN\t\t\t##\tSchneidet die Kommastellen einer Zahl ab und gibt als Ergebnis eine ganze Zahl zurück\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tStatistische Funktionen\r\n##\r\nAVEDEV\t\t\t= MITTELABW\t\t\t##\tGibt die durchschnittliche absolute Abweichung einer Reihe von Merkmalsausprägungen und ihrem Mittelwert zurück\r\nAVERAGE\t\t\t= MITTELWERT\t\t\t##\tGibt den Mittelwert der zugehörigen Argumente zurück\r\nAVERAGEA\t\t= MITTELWERTA\t\t\t##\tGibt den Mittelwert der zugehörigen Argumente, die Zahlen, Text und Wahrheitswerte enthalten, zurück\r\nAVERAGEIF\t\t= MITTELWERTWENN\t\t##\tDer Durchschnittswert (arithmetisches Mittel) für alle Zellen in einem Bereich, die einem angegebenen Kriterium entsprechen, wird zurückgegeben\r\nAVERAGEIFS\t\t= MITTELWERTWENNS\t\t##\tGibt den Durchschnittswert (arithmetisches Mittel) aller Zellen zurück, die mehreren Kriterien entsprechen\r\nBETADIST\t\t= BETAVERT\t\t\t##\tGibt die Werte der kumulierten Betaverteilungsfunktion zurück\r\nBETAINV\t\t\t= BETAINV\t\t\t##\tGibt das Quantil der angegebenen Betaverteilung zurück\r\nBINOMDIST\t\t= BINOMVERT\t\t\t##\tGibt Wahrscheinlichkeiten einer binomialverteilten Zufallsvariablen zurück\r\nCHIDIST\t\t\t= CHIVERT\t\t\t##\tGibt Werte der Verteilungsfunktion (1-Alpha) einer Chi-Quadrat-verteilten Zufallsgröße zurück\r\nCHIINV\t\t\t= CHIINV\t\t\t##\tGibt Quantile der Verteilungsfunktion (1-Alpha) der Chi-Quadrat-Verteilung zurück\r\nCHITEST\t\t\t= CHITEST\t\t\t##\tGibt die Teststatistik eines Unabhängigkeitstests zurück\r\nCONFIDENCE\t\t= KONFIDENZ\t\t\t##\tErmöglicht die Berechnung des 1-Alpha Konfidenzintervalls für den Erwartungswert einer Zufallsvariablen\r\nCORREL\t\t\t= KORREL\t\t\t##\tGibt den Korrelationskoeffizienten zweier Reihen von Merkmalsausprägungen zurück\r\nCOUNT\t\t\t= ANZAHL\t\t\t##\tGibt die Anzahl der Zahlen in der Liste mit Argumenten an\r\nCOUNTA\t\t\t= ANZAHL2\t\t\t##\tGibt die Anzahl der Werte in der Liste mit Argumenten an\r\nCOUNTBLANK\t\t= ANZAHLLEEREZELLEN\t\t##\tGibt die Anzahl der leeren Zellen in einem Bereich an\r\nCOUNTIF\t\t\t= ZÄHLENWENN\t\t\t##\tGibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit den Suchkriterien übereinstimmen\r\nCOUNTIFS\t\t= ZÄHLENWENNS\t\t\t##\tGibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit mehreren Suchkriterien übereinstimmen\r\nCOVAR\t\t\t= KOVAR\t\t\t\t##\tGibt die Kovarianz zurück, den Mittelwert der für alle Datenpunktpaare gebildeten Produkte der Abweichungen\r\nCRITBINOM\t\t= KRITBINOM\t\t\t##\tGibt den kleinsten Wert zurück, für den die kumulierten Wahrscheinlichkeiten der Binomialverteilung kleiner oder gleich einer Grenzwahrscheinlichkeit sind\r\nDEVSQ\t\t\t= SUMQUADABW\t\t\t##\tGibt die Summe der quadrierten Abweichungen der Datenpunkte von ihrem Stichprobenmittelwert zurück\r\nEXPONDIST\t\t= EXPONVERT\t\t\t##\tGibt Wahrscheinlichkeiten einer exponential verteilten Zufallsvariablen zurück\r\nFDIST\t\t\t= FVERT\t\t\t\t##\tGibt Werte der Verteilungsfunktion (1-Alpha) einer F-verteilten Zufallsvariablen zurück\r\nFINV\t\t\t= FINV\t\t\t\t##\tGibt Quantile der F-Verteilung zurück\r\nFISHER\t\t\t= FISHER\t\t\t##\tGibt die Fisher-Transformation zurück\r\nFISHERINV\t\t= FISHERINV\t\t\t##\tGibt die Umkehrung der Fisher-Transformation zurück\r\nFORECAST\t\t= PROGNOSE\t\t\t##\tGibt einen Wert zurück, der sich aus einem linearen Trend ergibt\r\nFREQUENCY\t\t= HÄUFIGKEIT\t\t\t##\tGibt eine Häufigkeitsverteilung als vertikale Matrix zurück\r\nFTEST\t\t\t= FTEST\t\t\t\t##\tGibt die Teststatistik eines F-Tests zurück\r\nGAMMADIST\t\t= GAMMAVERT\t\t\t##\tGibt Wahrscheinlichkeiten einer gammaverteilten Zufallsvariablen zurück\r\nGAMMAINV\t\t= GAMMAINV\t\t\t##\tGibt Quantile der Gammaverteilung zurück\r\nGAMMALN\t\t\t= GAMMALN\t\t\t##\tGibt den natürlichen Logarithmus der Gammafunktion zurück, Γ(x)\r\nGEOMEAN\t\t\t= GEOMITTEL\t\t\t##\tGibt das geometrische Mittel zurück\r\nGROWTH\t\t\t= VARIATION\t\t\t##\tGibt Werte zurück, die sich aus einem exponentiellen Trend ergeben\r\nHARMEAN\t\t\t= HARMITTEL\t\t\t##\tGibt das harmonische Mittel zurück\r\nHYPGEOMDIST\t\t= HYPGEOMVERT\t\t\t##\tGibt Wahrscheinlichkeiten einer hypergeometrisch-verteilten Zufallsvariablen zurück\r\nINTERCEPT\t\t= ACHSENABSCHNITT\t\t##\tGibt den Schnittpunkt der Regressionsgeraden zurück\r\nKURT\t\t\t= KURT\t\t\t\t##\tGibt die Kurtosis (Exzess) einer Datengruppe zurück\r\nLARGE\t\t\t= KGRÖSSTE\t\t\t##\tGibt den k-größten Wert einer Datengruppe zurück\r\nLINEST\t\t\t= RGP\t\t\t\t##\tGibt die Parameter eines linearen Trends zurück\r\nLOGEST\t\t\t= RKP\t\t\t\t##\tGibt die Parameter eines exponentiellen Trends zurück\r\nLOGINV\t\t\t= LOGINV\t\t\t##\tGibt Quantile der Lognormalverteilung zurück\r\nLOGNORMDIST\t\t= LOGNORMVERT\t\t\t##\tGibt Werte der Verteilungsfunktion einer lognormalverteilten Zufallsvariablen zurück\r\nMAX\t\t\t= MAX\t\t\t\t##\tGibt den Maximalwert einer Liste mit Argumenten zurück\r\nMAXA\t\t\t= MAXA\t\t\t\t##\tGibt den Maximalwert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten\r\nMEDIAN\t\t\t= MEDIAN\t\t\t##\tGibt den Median der angegebenen Zahlen zurück\r\nMIN\t\t\t= MIN\t\t\t\t##\tGibt den Minimalwert einer Liste mit Argumenten zurück\r\nMINA\t\t\t= MINA\t\t\t\t##\tGibt den kleinsten Wert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten\r\nMODE\t\t\t= MODALWERT\t\t\t##\tGibt den am häufigsten vorkommenden Wert in einer Datengruppe zurück\r\nNEGBINOMDIST\t\t= NEGBINOMVERT\t\t\t##\tGibt Wahrscheinlichkeiten einer negativen, binominal verteilten Zufallsvariablen zurück\r\nNORMDIST\t\t= NORMVERT\t\t\t##\tGibt Wahrscheinlichkeiten einer normal verteilten Zufallsvariablen zurück\r\nNORMINV\t\t\t= NORMINV\t\t\t##\tGibt Quantile der Normalverteilung zurück\r\nNORMSDIST\t\t= STANDNORMVERT\t\t\t##\tGibt Werte der Verteilungsfunktion einer standardnormalverteilten Zufallsvariablen zurück\r\nNORMSINV\t\t= STANDNORMINV\t\t\t##\tGibt Quantile der Standardnormalverteilung zurück\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tGibt den Pearsonschen Korrelationskoeffizienten zurück\r\nPERCENTILE\t\t= QUANTIL\t\t\t##\tGibt das Alpha-Quantil einer Gruppe von Daten zurück\r\nPERCENTRANK\t\t= QUANTILSRANG\t\t\t##\tGibt den prozentualen Rang (Alpha) eines Werts in einer Datengruppe zurück\r\nPERMUT\t\t\t= VARIATIONEN\t\t\t##\tGibt die Anzahl der Möglichkeiten zurück, um k Elemente aus einer Menge von n Elementen ohne Zurücklegen zu ziehen\r\nPOISSON\t\t\t= POISSON\t\t\t##\tGibt Wahrscheinlichkeiten einer poissonverteilten Zufallsvariablen zurück\r\nPROB\t\t\t= WAHRSCHBEREICH\t\t##\tGibt die Wahrscheinlichkeit für ein von zwei Werten eingeschlossenes Intervall zurück\r\nQUARTILE\t\t= QUARTILE\t\t\t##\tGibt die Quartile der Datengruppe zurück\r\nRANK\t\t\t= RANG\t\t\t\t##\tGibt den Rang zurück, den eine Zahl innerhalb einer Liste von Zahlen einnimmt\r\nRSQ\t\t\t= BESTIMMTHEITSMASS\t\t##\tGibt das Quadrat des Pearsonschen Korrelationskoeffizienten zurück\r\nSKEW\t\t\t= SCHIEFE\t\t\t##\tGibt die Schiefe einer Verteilung zurück\r\nSLOPE\t\t\t= STEIGUNG\t\t\t##\tGibt die Steigung der Regressionsgeraden zurück\r\nSMALL\t\t\t= KKLEINSTE\t\t\t##\tGibt den k-kleinsten Wert einer Datengruppe zurück\r\nSTANDARDIZE\t\t= STANDARDISIERUNG\t\t##\tGibt den standardisierten Wert zurück\r\nSTDEV\t\t\t= STABW\t\t\t\t##\tSchätzt die Standardabweichung ausgehend von einer Stichprobe\r\nSTDEVA\t\t\t= STABWA\t\t\t##\tSchätzt die Standardabweichung ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthält\r\nSTDEVP\t\t\t= STABWN\t\t\t##\tBerechnet die Standardabweichung ausgehend von der Grundgesamtheit\r\nSTDEVPA\t\t\t= STABWNA\t\t\t##\tBerechnet die Standardabweichung ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthält\r\nSTEYX\t\t\t= STFEHLERYX\t\t\t##\tGibt den Standardfehler der geschätzten y-Werte für alle x-Werte der Regression zurück\r\nTDIST\t\t\t= TVERT\t\t\t\t##\tGibt Werte der Verteilungsfunktion (1-Alpha) einer (Student) t-verteilten Zufallsvariablen zurück\r\nTINV\t\t\t= TINV\t\t\t\t##\tGibt Quantile der t-Verteilung zurück\r\nTREND\t\t\t= TREND\t\t\t\t##\tGibt Werte zurück, die sich aus einem linearen Trend ergeben\r\nTRIMMEAN\t\t= GESTUTZTMITTEL\t\t##\tGibt den Mittelwert einer Datengruppe zurück, ohne die Randwerte zu berücksichtigen\r\nTTEST\t\t\t= TTEST\t\t\t\t##\tGibt die Teststatistik eines Student'schen t-Tests zurück\r\nVAR\t\t\t= VARIANZ\t\t\t##\tSchätzt die Varianz ausgehend von einer Stichprobe\r\nVARA\t\t\t= VARIANZA\t\t\t##\tSchätzt die Varianz ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthält\r\nVARP\t\t\t= VARIANZEN\t\t\t##\tBerechnet die Varianz ausgehend von der Grundgesamtheit\r\nVARPA\t\t\t= VARIANZENA\t\t\t##\tBerechnet die Varianz ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthält\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tGibt Wahrscheinlichkeiten einer weibullverteilten Zufallsvariablen zurück\r\nZTEST\t\t\t= GTEST\t\t\t\t##\tGibt den einseitigen Wahrscheinlichkeitswert für einen Gausstest (Normalverteilung) zurück\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tTextfunktionen\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tKonvertiert DB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in SB-Text\r\nBAHTTEXT\t\t= BAHTTEXT\t\t\t##\tWandelt eine Zahl in Text im Währungsformat ß (Baht) um\r\nCHAR\t\t\t= ZEICHEN\t\t\t##\tGibt das der Codezahl entsprechende Zeichen zurück\r\nCLEAN\t\t\t= SÄUBERN\t\t\t##\tLöscht alle nicht druckbaren Zeichen aus einem Text\r\nCODE\t\t\t= CODE\t\t\t\t##\tGibt die Codezahl des ersten Zeichens in einem Text zurück\r\nCONCATENATE\t\t= VERKETTEN\t\t\t##\tVerknüpft mehrere Textelemente zu einem Textelement\r\nDOLLAR\t\t\t= DM\t\t\t\t##\tWandelt eine Zahl in Text im Währungsformat € (Euro) um\r\nEXACT\t\t\t= IDENTISCH\t\t\t##\tPrüft, ob zwei Textwerte identisch sind\r\nFIND\t\t\t= FINDEN\t\t\t##\tSucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden)\r\nFINDB\t\t\t= FINDENB\t\t\t##\tSucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden)\r\nFIXED\t\t\t= FEST\t\t\t\t##\tFormatiert eine Zahl als Text mit einer festen Anzahl von Dezimalstellen\r\nJIS\t\t\t= JIS\t\t\t\t##\tKonvertiert SB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in DB-Text\r\nLEFT\t\t\t= LINKS\t\t\t\t##\tGibt die Zeichen ganz links in einem Textwert zurück\r\nLEFTB\t\t\t= LINKSB\t\t\t##\tGibt die Zeichen ganz links in einem Textwert zurück\r\nLEN\t\t\t= LÄNGE\t\t\t\t##\tGibt die Anzahl der Zeichen in einer Zeichenfolge zurück\r\nLENB\t\t\t= LÄNGEB\t\t\t##\tGibt die Anzahl der Zeichen in einer Zeichenfolge zurück\r\nLOWER\t\t\t= KLEIN\t\t\t\t##\tWandelt Text in Kleinbuchstaben um\r\nMID\t\t\t= TEIL\t\t\t\t##\tGibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück\r\nMIDB\t\t\t= TEILB\t\t\t\t##\tGibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück\r\nPHONETIC\t\t= PHONETIC\t\t\t##\tExtrahiert die phonetischen (Furigana-)Zeichen aus einer Textzeichenfolge\r\nPROPER\t\t\t= GROSS2\t\t\t##\tWandelt den ersten Buchstaben aller Wörter eines Textwerts in Großbuchstaben um\r\nREPLACE\t\t\t= ERSETZEN\t\t\t##\tErsetzt Zeichen in Text\r\nREPLACEB\t\t= ERSETZENB\t\t\t##\tErsetzt Zeichen in Text\r\nREPT\t\t\t= WIEDERHOLEN\t\t\t##\tWiederholt einen Text so oft wie angegeben\r\nRIGHT\t\t\t= RECHTS\t\t\t##\tGibt die Zeichen ganz rechts in einem Textwert zurück\r\nRIGHTB\t\t\t= RECHTSB\t\t\t##\tGibt die Zeichen ganz rechts in einem Textwert zurück\r\nSEARCH\t\t\t= SUCHEN\t\t\t##\tSucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden)\r\nSEARCHB\t\t\t= SUCHENB\t\t\t##\tSucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden)\r\nSUBSTITUTE\t\t= WECHSELN\t\t\t##\tErsetzt in einer Zeichenfolge neuen Text gegen alten\r\nT\t\t\t= T\t\t\t\t##\tWandelt die zugehörigen Argumente in Text um\r\nTEXT\t\t\t= TEXT\t\t\t\t##\tFormatiert eine Zahl und wandelt sie in Text um\r\nTRIM\t\t\t= GLÄTTEN\t\t\t##\tEntfernt Leerzeichen aus Text\r\nUPPER\t\t\t= GROSS\t\t\t\t##\tWandelt Text in Großbuchstaben um\r\nVALUE\t\t\t= WERT\t\t\t\t##\tWandelt ein Textargument in eine Zahl um\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/en/uk/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= £\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/es/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= $\t##\tI'm surprised that the Excel Documentation suggests $ rather than €\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #¡NULO!\r\nDIV0\t= #¡DIV/0!\r\nVALUE\t= #¡VALOR!\r\nREF\t= #¡REF!\r\nNAME\t= #¿NOMBRE?\r\nNUM\t= #¡NÚM!\r\nNA\t= #N/A\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/es/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\t\tFunciones de complementos y automatización\r\n##\r\nGETPIVOTDATA\t\t= IMPORTARDATOSDINAMICOS\t\t##\tDevuelve los datos almacenados en un informe de tabla dinámica.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\t\tFunciones de cubo\r\n##\r\nCUBEKPIMEMBER\t\t= MIEMBROKPICUBO\t\t\t##\tDevuelve un nombre, propiedad y medida de indicador de rendimiento clave (KPI) y muestra el nombre y la propiedad en la celda. Un KPI es una medida cuantificable, como los beneficios brutos mensuales o la facturación trimestral por empleado, que se usa para supervisar el rendimiento de una organización.\r\nCUBEMEMBER\t\t= MIEMBROCUBO\t\t\t\t##\tDevuelve un miembro o tupla en una jerarquía de cubo. Se usa para validar la existencia del miembro o la tupla en el cubo.\r\nCUBEMEMBERPROPERTY\t= PROPIEDADMIEMBROCUBO\t\t\t##\tDevuelve el valor de una propiedad de miembro del cubo Se usa para validar la existencia de un nombre de miembro en el cubo y para devolver la propiedad especificada para este miembro.\r\nCUBERANKEDMEMBER\t= MIEMBRORANGOCUBO\t\t\t##\tDevuelve el miembro n, o clasificado, de un conjunto. Se usa para devolver uno o más elementos de un conjunto, por ejemplo, el representante con mejores ventas o los diez mejores alumnos.\r\nCUBESET\t\t\t= CONJUNTOCUBO\t\t\t\t##\tDefine un conjunto calculado de miembros o tuplas mediante el envío de una expresión de conjunto al cubo en el servidor, lo que crea el conjunto y, después, devuelve dicho conjunto a Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= RECUENTOCONJUNTOCUBO\t\t\t##\tDevuelve el número de elementos de un conjunto.\r\nCUBEVALUE\t\t= VALORCUBO\t\t\t\t##\tDevuelve un valor agregado de un cubo.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\t\tFunciones de base de datos\r\n##\r\nDAVERAGE\t\t= BDPROMEDIO\t\t\t\t##\tDevuelve el promedio de las entradas seleccionadas en la base de datos.\r\nDCOUNT\t\t\t= BDCONTAR\t\t\t\t##\tCuenta el número de celdas que contienen números en una base de datos.\r\nDCOUNTA\t\t\t= BDCONTARA\t\t\t\t##\tCuenta el número de celdas no vacías en una base de datos.\r\nDGET\t\t\t= BDEXTRAER\t\t\t\t##\tExtrae de una base de datos un único registro que cumple los criterios especificados.\r\nDMAX\t\t\t= BDMAX\t\t\t\t\t##\tDevuelve el valor máximo de las entradas seleccionadas de la base de datos.\r\nDMIN\t\t\t= BDMIN\t\t\t\t\t##\tDevuelve el valor mínimo de las entradas seleccionadas de la base de datos.\r\nDPRODUCT\t\t= BDPRODUCTO\t\t\t\t##\tMultiplica los valores de un campo concreto de registros de una base de datos que cumplen los criterios especificados.\r\nDSTDEV\t\t\t= BDDESVEST\t\t\t\t##\tCalcula la desviación estándar a partir de una muestra de entradas seleccionadas en la base de datos.\r\nDSTDEVP\t\t\t= BDDESVESTP\t\t\t\t##\tCalcula la desviación estándar en función de la población total de las entradas seleccionadas de la base de datos.\r\nDSUM\t\t\t= BDSUMA\t\t\t\t##\tSuma los números de la columna de campo de los registros de la base de datos que cumplen los criterios.\r\nDVAR\t\t\t= BDVAR\t\t\t\t\t##\tCalcula la varianza a partir de una muestra de entradas seleccionadas de la base de datos.\r\nDVARP\t\t\t= BDVARP\t\t\t\t##\tCalcula la varianza a partir de la población total de entradas seleccionadas de la base de datos.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\t\tFunciones de fecha y hora\r\n##\r\nDATE\t\t\t= FECHA\t\t\t\t\t##\tDevuelve el número de serie correspondiente a una fecha determinada.\r\nDATEVALUE\t\t= FECHANUMERO\t\t\t\t##\tConvierte una fecha con formato de texto en un valor de número de serie.\r\nDAY\t\t\t= DIA\t\t\t\t\t##\tConvierte un número de serie en un valor de día del mes.\r\nDAYS360\t\t\t= DIAS360\t\t\t\t##\tCalcula el número de días entre dos fechas a partir de un año de 360 días.\r\nEDATE\t\t\t= FECHA.MES\t\t\t\t##\tDevuelve el número de serie de la fecha equivalente al número indicado de meses anteriores o posteriores a la fecha inicial.\r\nEOMONTH\t\t\t= FIN.MES\t\t\t\t##\tDevuelve el número de serie correspondiente al último día del mes anterior o posterior a un número de meses especificado.\r\nHOUR\t\t\t= HORA\t\t\t\t\t##\tConvierte un número de serie en un valor de hora.\r\nMINUTE\t\t\t= MINUTO\t\t\t\t##\tConvierte un número de serie en un valor de minuto.\r\nMONTH\t\t\t= MES\t\t\t\t\t##\tConvierte un número de serie en un valor de mes.\r\nNETWORKDAYS\t\t= DIAS.LAB\t\t\t\t##\tDevuelve el número de todos los días laborables existentes entre dos fechas.\r\nNOW\t\t\t= AHORA\t\t\t\t\t##\tDevuelve el número de serie correspondiente a la fecha y hora actuales.\r\nSECOND\t\t\t= SEGUNDO\t\t\t\t##\tConvierte un número de serie en un valor de segundo.\r\nTIME\t\t\t= HORA\t\t\t\t\t##\tDevuelve el número de serie correspondiente a una hora determinada.\r\nTIMEVALUE\t\t= HORANUMERO\t\t\t\t##\tConvierte una hora con formato de texto en un valor de número de serie.\r\nTODAY\t\t\t= HOY\t\t\t\t\t##\tDevuelve el número de serie correspondiente al día actual.\r\nWEEKDAY\t\t\t= DIASEM\t\t\t\t##\tConvierte un número de serie en un valor de día de la semana.\r\nWEEKNUM\t\t\t= NUM.DE.SEMANA\t\t\t\t##\tConvierte un número de serie en un número que representa el lugar numérico correspondiente a una semana de un año.\r\nWORKDAY\t\t\t= DIA.LAB\t\t\t\t##\tDevuelve el número de serie de la fecha que tiene lugar antes o después de un número determinado de días laborables.\r\nYEAR\t\t\t= AÑO\t\t\t\t\t##\tConvierte un número de serie en un valor de año.\r\nYEARFRAC\t\t= FRAC.AÑO\t\t\t\t##\tDevuelve la fracción de año que representa el número total de días existentes entre el valor de fecha_inicial y el de fecha_final.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\t\tFunciones de ingeniería\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t\t##\tDevuelve la función Bessel In(x) modificada.\r\nBESSELJ\t\t\t= BESSELJ\t\t\t\t##\tDevuelve la función Bessel Jn(x).\r\nBESSELK\t\t\t= BESSELK\t\t\t\t##\tDevuelve la función Bessel Kn(x) modificada.\r\nBESSELY\t\t\t= BESSELY\t\t\t\t##\tDevuelve la función Bessel Yn(x).\r\nBIN2DEC\t\t\t= BIN.A.DEC\t\t\t\t##\tConvierte un número binario en decimal.\r\nBIN2HEX\t\t\t= BIN.A.HEX\t\t\t\t##\tConvierte un número binario en hexadecimal.\r\nBIN2OCT\t\t\t= BIN.A.OCT\t\t\t\t##\tConvierte un número binario en octal.\r\nCOMPLEX\t\t\t= COMPLEJO\t\t\t\t##\tConvierte coeficientes reales e imaginarios en un número complejo.\r\nCONVERT\t\t\t= CONVERTIR\t\t\t\t##\tConvierte un número de un sistema de medida a otro.\r\nDEC2BIN\t\t\t= DEC.A.BIN\t\t\t\t##\tConvierte un número decimal en binario.\r\nDEC2HEX\t\t\t= DEC.A.HEX\t\t\t\t##\tConvierte un número decimal en hexadecimal.\r\nDEC2OCT\t\t\t= DEC.A.OCT\t\t\t\t##\tConvierte un número decimal en octal.\r\nDELTA\t\t\t= DELTA\t\t\t\t\t##\tComprueba si dos valores son iguales.\r\nERF\t\t\t= FUN.ERROR\t\t\t\t##\tDevuelve la función de error.\r\nERFC\t\t\t= FUN.ERROR.COMPL\t\t\t##\tDevuelve la función de error complementario.\r\nGESTEP\t\t\t= MAYOR.O.IGUAL\t\t\t\t##\tComprueba si un número es mayor que un valor de umbral.\r\nHEX2BIN\t\t\t= HEX.A.BIN\t\t\t\t##\tConvierte un número hexadecimal en binario.\r\nHEX2DEC\t\t\t= HEX.A.DEC\t\t\t\t##\tConvierte un número hexadecimal en decimal.\r\nHEX2OCT\t\t\t= HEX.A.OCT\t\t\t\t##\tConvierte un número hexadecimal en octal.\r\nIMABS\t\t\t= IM.ABS\t\t\t\t##\tDevuelve el valor absoluto (módulo) de un número complejo.\r\nIMAGINARY\t\t= IMAGINARIO\t\t\t\t##\tDevuelve el coeficiente imaginario de un número complejo.\r\nIMARGUMENT\t\t= IM.ANGULO\t\t\t\t##\tDevuelve el argumento theta, un ángulo expresado en radianes.\r\nIMCONJUGATE\t\t= IM.CONJUGADA\t\t\t\t##\tDevuelve la conjugada compleja de un número complejo.\r\nIMCOS\t\t\t= IM.COS\t\t\t\t##\tDevuelve el coseno de un número complejo.\r\nIMDIV\t\t\t= IM.DIV\t\t\t\t##\tDevuelve el cociente de dos números complejos.\r\nIMEXP\t\t\t= IM.EXP\t\t\t\t##\tDevuelve el valor exponencial de un número complejo.\r\nIMLN\t\t\t= IM.LN\t\t\t\t\t##\tDevuelve el logaritmo natural (neperiano) de un número complejo.\r\nIMLOG10\t\t\t= IM.LOG10\t\t\t\t##\tDevuelve el logaritmo en base 10 de un número complejo.\r\nIMLOG2\t\t\t= IM.LOG2\t\t\t\t##\tDevuelve el logaritmo en base 2 de un número complejo.\r\nIMPOWER\t\t\t= IM.POT\t\t\t\t##\tDevuelve un número complejo elevado a una potencia entera.\r\nIMPRODUCT\t\t= IM.PRODUCT\t\t\t\t##\tDevuelve el producto de números complejos.\r\nIMREAL\t\t\t= IM.REAL\t\t\t\t##\tDevuelve el coeficiente real de un número complejo.\r\nIMSIN\t\t\t= IM.SENO\t\t\t\t##\tDevuelve el seno de un número complejo.\r\nIMSQRT\t\t\t= IM.RAIZ2\t\t\t\t##\tDevuelve la raíz cuadrada de un número complejo.\r\nIMSUB\t\t\t= IM.SUSTR\t\t\t\t##\tDevuelve la diferencia entre dos números complejos.\r\nIMSUM\t\t\t= IM.SUM\t\t\t\t##\tDevuelve la suma de números complejos.\r\nOCT2BIN\t\t\t= OCT.A.BIN\t\t\t\t##\tConvierte un número octal en binario.\r\nOCT2DEC\t\t\t= OCT.A.DEC\t\t\t\t##\tConvierte un número octal en decimal.\r\nOCT2HEX\t\t\t= OCT.A.HEX\t\t\t\t##\tConvierte un número octal en hexadecimal.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\t\tFunciones financieras\r\n##\r\nACCRINT\t\t\t= INT.ACUM\t\t\t\t##\tDevuelve el interés acumulado de un valor bursátil con pagos de interés periódicos.\r\nACCRINTM\t\t= INT.ACUM.V\t\t\t\t##\tDevuelve el interés acumulado de un valor bursátil con pagos de interés al vencimiento.\r\nAMORDEGRC\t\t= AMORTIZ.PROGRE\t\t\t##\tDevuelve la amortización de cada período contable mediante el uso de un coeficiente de amortización.\r\nAMORLINC\t\t= AMORTIZ.LIN\t\t\t\t##\tDevuelve la amortización de cada uno de los períodos contables.\r\nCOUPDAYBS\t\t= CUPON.DIAS.L1\t\t\t\t##\tDevuelve el número de días desde el principio del período de un cupón hasta la fecha de liquidación.\r\nCOUPDAYS\t\t= CUPON.DIAS\t\t\t\t##\tDevuelve el número de días del período (entre dos cupones) donde se encuentra la fecha de liquidación.\r\nCOUPDAYSNC\t\t= CUPON.DIAS.L2\t\t\t\t##\tDevuelve el número de días desde la fecha de liquidación hasta la fecha del próximo cupón.\r\nCOUPNCD\t\t\t= CUPON.FECHA.L2\t\t\t##\tDevuelve la fecha del próximo cupón después de la fecha de liquidación.\r\nCOUPNUM\t\t\t= CUPON.NUM\t\t\t\t##\tDevuelve el número de pagos de cupón entre la fecha de liquidación y la fecha de vencimiento.\r\nCOUPPCD\t\t\t= CUPON.FECHA.L1\t\t\t##\tDevuelve la fecha de cupón anterior a la fecha de liquidación.\r\nCUMIPMT\t\t\t= PAGO.INT.ENTRE\t\t\t##\tDevuelve el interés acumulado pagado entre dos períodos.\r\nCUMPRINC\t\t= PAGO.PRINC.ENTRE\t\t\t##\tDevuelve el capital acumulado pagado de un préstamo entre dos períodos.\r\nDB\t\t\t= DB\t\t\t\t\t##\tDevuelve la amortización de un bien durante un período específico a través del método de amortización de saldo fijo.\r\nDDB\t\t\t= DDB\t\t\t\t\t##\tDevuelve la amortización de un bien durante un período específico a través del método de amortización por doble disminución de saldo u otro método que se especifique.\r\nDISC\t\t\t= TASA.DESC\t\t\t\t##\tDevuelve la tasa de descuento de un valor bursátil.\r\nDOLLARDE\t\t= MONEDA.DEC\t\t\t\t##\tConvierte una cotización de un valor bursátil expresada en forma fraccionaria en una cotización de un valor bursátil expresada en forma decimal.\r\nDOLLARFR\t\t= MONEDA.FRAC\t\t\t\t##\tConvierte una cotización de un valor bursátil expresada en forma decimal en una cotización de un valor bursátil expresada en forma fraccionaria.\r\nDURATION\t\t= DURACION\t\t\t\t##\tDevuelve la duración anual de un valor bursátil con pagos de interés periódico.\r\nEFFECT\t\t\t= INT.EFECTIVO\t\t\t\t##\tDevuelve la tasa de interés anual efectiva.\r\nFV\t\t\t= VF\t\t\t\t\t##\tDevuelve el valor futuro de una inversión.\r\nFVSCHEDULE\t\t= VF.PLAN\t\t\t\t##\tDevuelve el valor futuro de un capital inicial después de aplicar una serie de tasas de interés compuesto.\r\nINTRATE\t\t\t= TASA.INT\t\t\t\t##\tDevuelve la tasa de interés para la inversión total de un valor bursátil.\r\nIPMT\t\t\t= PAGOINT\t\t\t\t##\tDevuelve el pago de intereses de una inversión durante un período determinado.\r\nIRR\t\t\t= TIR\t\t\t\t\t##\tDevuelve la tasa interna de retorno para una serie de flujos de efectivo periódicos.\r\nISPMT\t\t\t= INT.PAGO.DIR\t\t\t\t##\tCalcula el interés pagado durante un período específico de una inversión.\r\nMDURATION\t\t= DURACION.MODIF\t\t\t##\tDevuelve la duración de Macauley modificada de un valor bursátil con un valor nominal supuesto de 100 $.\r\nMIRR\t\t\t= TIRM\t\t\t\t\t##\tDevuelve la tasa interna de retorno donde se financian flujos de efectivo positivos y negativos a tasas diferentes.\r\nNOMINAL\t\t\t= TASA.NOMINAL\t\t\t\t##\tDevuelve la tasa nominal de interés anual.\r\nNPER\t\t\t= NPER\t\t\t\t\t##\tDevuelve el número de períodos de una inversión.\r\nNPV\t\t\t= VNA\t\t\t\t\t##\tDevuelve el valor neto actual de una inversión en función de una serie de flujos periódicos de efectivo y una tasa de descuento.\r\nODDFPRICE\t\t= PRECIO.PER.IRREGULAR.1\t\t##\tDevuelve el precio por un valor nominal de 100 $ de un valor bursátil con un primer período impar.\r\nODDFYIELD\t\t= RENDTO.PER.IRREGULAR.1\t\t##\tDevuelve el rendimiento de un valor bursátil con un primer período impar.\r\nODDLPRICE\t\t= PRECIO.PER.IRREGULAR.2\t\t##\tDevuelve el precio por un valor nominal de 100 $ de un valor bursátil con un último período impar.\r\nODDLYIELD\t\t= RENDTO.PER.IRREGULAR.2\t\t##\tDevuelve el rendimiento de un valor bursátil con un último período impar.\r\nPMT\t\t\t= PAGO\t\t\t\t\t##\tDevuelve el pago periódico de una anualidad.\r\nPPMT\t\t\t= PAGOPRIN\t\t\t\t##\tDevuelve el pago de capital de una inversión durante un período determinado.\r\nPRICE\t\t\t= PRECIO\t\t\t\t##\tDevuelve el precio por un valor nominal de 100 $ de un valor bursátil que paga una tasa de interés periódico.\r\nPRICEDISC\t\t= PRECIO.DESCUENTO\t\t\t##\tDevuelve el precio por un valor nominal de 100 $ de un valor bursátil con descuento.\r\nPRICEMAT\t\t= PRECIO.VENCIMIENTO\t\t\t##\tDevuelve el precio por un valor nominal de 100 $ de un valor bursátil que paga interés a su vencimiento.\r\nPV\t\t\t= VALACT\t\t\t\t##\tDevuelve el valor actual de una inversión.\r\nRATE\t\t\t= TASA\t\t\t\t\t##\tDevuelve la tasa de interés por período de una anualidad.\r\nRECEIVED\t\t= CANTIDAD.RECIBIDA\t\t\t##\tDevuelve la cantidad recibida al vencimiento de un valor bursátil completamente invertido.\r\nSLN\t\t\t= SLN\t\t\t\t\t##\tDevuelve la amortización por método directo de un bien en un período dado.\r\nSYD\t\t\t= SYD\t\t\t\t\t##\tDevuelve la amortización por suma de dígitos de los años de un bien durante un período especificado.\r\nTBILLEQ\t\t\t= LETRA.DE.TES.EQV.A.BONO\t\t##\tDevuelve el rendimiento de un bono equivalente a una letra del Tesoro (de EE.UU.)\r\nTBILLPRICE\t\t= LETRA.DE.TES.PRECIO\t\t\t##\tDevuelve el precio por un valor nominal de 100 $ de una letra del Tesoro (de EE.UU.)\r\nTBILLYIELD\t\t= LETRA.DE.TES.RENDTO\t\t\t##\tDevuelve el rendimiento de una letra del Tesoro (de EE.UU.)\r\nVDB\t\t\t= DVS\t\t\t\t\t##\tDevuelve la amortización de un bien durante un período específico o parcial a través del método de cálculo del saldo en disminución.\r\nXIRR\t\t\t= TIR.NO.PER\t\t\t\t##\tDevuelve la tasa interna de retorno para un flujo de efectivo que no es necesariamente periódico.\r\nXNPV\t\t\t= VNA.NO.PER\t\t\t\t##\tDevuelve el valor neto actual para un flujo de efectivo que no es necesariamente periódico.\r\nYIELD\t\t\t= RENDTO\t\t\t\t##\tDevuelve el rendimiento de un valor bursátil que paga intereses periódicos.\r\nYIELDDISC\t\t= RENDTO.DESC\t\t\t\t##\tDevuelve el rendimiento anual de un valor bursátil con descuento; por ejemplo, una letra del Tesoro (de EE.UU.)\r\nYIELDMAT\t\t= RENDTO.VENCTO\t\t\t\t##\tDevuelve el rendimiento anual de un valor bursátil que paga intereses al vencimiento.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\t\tFunciones de información\r\n##\r\nCELL\t\t\t= CELDA\t\t\t\t\t##\tDevuelve información acerca del formato, la ubicación o el contenido de una celda.\r\nERROR.TYPE\t\t= TIPO.DE.ERROR\t\t\t\t##\tDevuelve un número que corresponde a un tipo de error.\r\nINFO\t\t\t= INFO\t\t\t\t\t##\tDevuelve información acerca del entorno operativo en uso.\r\nISBLANK\t\t\t= ESBLANCO\t\t\t\t##\tDevuelve VERDADERO si el valor está en blanco.\r\nISERR\t\t\t= ESERR\t\t\t\t\t##\tDevuelve VERDADERO si el valor es cualquier valor de error excepto #N/A.\r\nISERROR\t\t\t= ESERROR\t\t\t\t##\tDevuelve VERDADERO si el valor es cualquier valor de error.\r\nISEVEN\t\t\t= ES.PAR\t\t\t\t##\tDevuelve VERDADERO si el número es par.\r\nISLOGICAL\t\t= ESLOGICO\t\t\t\t##\tDevuelve VERDADERO si el valor es un valor lógico.\r\nISNA\t\t\t= ESNOD\t\t\t\t\t##\tDevuelve VERDADERO si el valor es el valor de error #N/A.\r\nISNONTEXT\t\t= ESNOTEXTO\t\t\t\t##\tDevuelve VERDADERO si el valor no es texto.\r\nISNUMBER\t\t= ESNUMERO\t\t\t\t##\tDevuelve VERDADERO si el valor es un número.\r\nISODD\t\t\t= ES.IMPAR\t\t\t\t##\tDevuelve VERDADERO si el número es impar.\r\nISREF\t\t\t= ESREF\t\t\t\t\t##\tDevuelve VERDADERO si el valor es una referencia.\r\nISTEXT\t\t\t= ESTEXTO\t\t\t\t##\tDevuelve VERDADERO si el valor es texto.\r\nN\t\t\t= N\t\t\t\t\t##\tDevuelve un valor convertido en un número.\r\nNA\t\t\t= ND\t\t\t\t\t##\tDevuelve el valor de error #N/A.\r\nTYPE\t\t\t= TIPO\t\t\t\t\t##\tDevuelve un número que indica el tipo de datos de un valor.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\t\tFunciones lógicas\r\n##\r\nAND\t\t\t= Y\t\t\t\t\t##\tDevuelve VERDADERO si todos sus argumentos son VERDADERO.\r\nFALSE\t\t\t= FALSO\t\t\t\t\t##\tDevuelve el valor lógico FALSO.\r\nIF\t\t\t= SI\t\t\t\t\t##\tEspecifica una prueba lógica que realizar.\r\nIFERROR\t\t\t= SI.ERROR\t\t\t\t##\tDevuelve un valor que se especifica si una fórmula lo evalúa como un error; de lo contrario, devuelve el resultado de la fórmula.\r\nNOT\t\t\t= NO\t\t\t\t\t##\tInvierte el valor lógico del argumento.\r\nOR\t\t\t= O\t\t\t\t\t##\tDevuelve VERDADERO si cualquier argumento es VERDADERO.\r\nTRUE\t\t\t= VERDADERO\t\t\t\t##\tDevuelve el valor lógico VERDADERO.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\t\tFunciones de búsqueda y referencia\r\n##\r\nADDRESS\t\t\t= DIRECCION\t\t\t\t##\tDevuelve una referencia como texto a una sola celda de una hoja de cálculo.\r\nAREAS\t\t\t= AREAS\t\t\t\t\t##\tDevuelve el número de áreas de una referencia.\r\nCHOOSE\t\t\t= ELEGIR\t\t\t\t##\tElige un valor de una lista de valores.\r\nCOLUMN\t\t\t= COLUMNA\t\t\t\t##\tDevuelve el número de columna de una referencia.\r\nCOLUMNS\t\t\t= COLUMNAS\t\t\t\t##\tDevuelve el número de columnas de una referencia.\r\nHLOOKUP\t\t\t= BUSCARH\t\t\t\t##\tBusca en la fila superior de una matriz y devuelve el valor de la celda indicada.\r\nHYPERLINK\t\t= HIPERVINCULO\t\t\t\t##\tCrea un acceso directo o un salto que abre un documento almacenado en un servidor de red, en una intranet o en Internet.\r\nINDEX\t\t\t= INDICE\t\t\t\t##\tUsa un índice para elegir un valor de una referencia o matriz.\r\nINDIRECT\t\t= INDIRECTO\t\t\t\t##\tDevuelve una referencia indicada por un valor de texto.\r\nLOOKUP\t\t\t= BUSCAR\t\t\t\t##\tBusca valores de un vector o una matriz.\r\nMATCH\t\t\t= COINCIDIR\t\t\t\t##\tBusca valores de una referencia o matriz.\r\nOFFSET\t\t\t= DESREF\t\t\t\t##\tDevuelve un desplazamiento de referencia respecto a una referencia dada.\r\nROW\t\t\t= FILA\t\t\t\t\t##\tDevuelve el número de fila de una referencia.\r\nROWS\t\t\t= FILAS\t\t\t\t\t##\tDevuelve el número de filas de una referencia.\r\nRTD\t\t\t= RDTR\t\t\t\t\t##\tRecupera datos en tiempo real desde un programa compatible con la automatización COM (automatización: modo de trabajar con los objetos de una aplicación desde otra aplicación o herramienta de entorno. La automatización, antes denominada automatización OLE, es un estándar de la industria y una función del Modelo de objetos componentes (COM).).\r\nTRANSPOSE\t\t= TRANSPONER\t\t\t\t##\tDevuelve la transposición de una matriz.\r\nVLOOKUP\t\t\t= BUSCARV\t\t\t\t##\tBusca en la primera columna de una matriz y se mueve en horizontal por la fila para devolver el valor de una celda.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\t\tFunciones matemáticas y trigonométricas\r\n##\r\nABS\t\t\t= ABS\t\t\t\t\t##\tDevuelve el valor absoluto de un número.\r\nACOS\t\t\t= ACOS\t\t\t\t\t##\tDevuelve el arcocoseno de un número.\r\nACOSH\t\t\t= ACOSH\t\t\t\t\t##\tDevuelve el coseno hiperbólico inverso de un número.\r\nASIN\t\t\t= ASENO\t\t\t\t\t##\tDevuelve el arcoseno de un número.\r\nASINH\t\t\t= ASENOH\t\t\t\t##\tDevuelve el seno hiperbólico inverso de un número.\r\nATAN\t\t\t= ATAN\t\t\t\t\t##\tDevuelve la arcotangente de un número.\r\nATAN2\t\t\t= ATAN2\t\t\t\t\t##\tDevuelve la arcotangente de las coordenadas \"x\" e \"y\".\r\nATANH\t\t\t= ATANH\t\t\t\t\t##\tDevuelve la tangente hiperbólica inversa de un número.\r\nCEILING\t\t\t= MULTIPLO.SUPERIOR\t\t\t##\tRedondea un número al entero más próximo o al múltiplo significativo más cercano.\r\nCOMBIN\t\t\t= COMBINAT\t\t\t\t##\tDevuelve el número de combinaciones para un número determinado de objetos.\r\nCOS\t\t\t= COS\t\t\t\t\t##\tDevuelve el coseno de un número.\r\nCOSH\t\t\t= COSH\t\t\t\t\t##\tDevuelve el coseno hiperbólico de un número.\r\nDEGREES\t\t\t= GRADOS\t\t\t\t##\tConvierte radianes en grados.\r\nEVEN\t\t\t= REDONDEA.PAR\t\t\t\t##\tRedondea un número hasta el entero par más próximo.\r\nEXP\t\t\t= EXP\t\t\t\t\t##\tDevuelve e elevado a la potencia de un número dado.\r\nFACT\t\t\t= FACT\t\t\t\t\t##\tDevuelve el factorial de un número.\r\nFACTDOUBLE\t\t= FACT.DOBLE\t\t\t\t##\tDevuelve el factorial doble de un número.\r\nFLOOR\t\t\t= MULTIPLO.INFERIOR\t\t\t##\tRedondea un número hacia abajo, en dirección hacia cero.\r\nGCD\t\t\t= M.C.D\t\t\t\t\t##\tDevuelve el máximo común divisor.\r\nINT\t\t\t= ENTERO\t\t\t\t##\tRedondea un número hacia abajo hasta el entero más próximo.\r\nLCM\t\t\t= M.C.M\t\t\t\t\t##\tDevuelve el mínimo común múltiplo.\r\nLN\t\t\t= LN\t\t\t\t\t##\tDevuelve el logaritmo natural (neperiano) de un número.\r\nLOG\t\t\t= LOG\t\t\t\t\t##\tDevuelve el logaritmo de un número en una base especificada.\r\nLOG10\t\t\t= LOG10\t\t\t\t\t##\tDevuelve el logaritmo en base 10 de un número.\r\nMDETERM\t\t\t= MDETERM\t\t\t\t##\tDevuelve la determinante matricial de una matriz.\r\nMINVERSE\t\t= MINVERSA\t\t\t\t##\tDevuelve la matriz inversa de una matriz.\r\nMMULT\t\t\t= MMULT\t\t\t\t\t##\tDevuelve el producto de matriz de dos matrices.\r\nMOD\t\t\t= RESIDUO\t\t\t\t##\tDevuelve el resto de la división.\r\nMROUND\t\t\t= REDOND.MULT\t\t\t\t##\tDevuelve un número redondeado al múltiplo deseado.\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t\t\t##\tDevuelve el polinomio de un conjunto de números.\r\nODD\t\t\t= REDONDEA.IMPAR\t\t\t##\tRedondea un número hacia arriba hasta el entero impar más próximo.\r\nPI\t\t\t= PI\t\t\t\t\t##\tDevuelve el valor de pi.\r\nPOWER\t\t\t= POTENCIA\t\t\t\t##\tDevuelve el resultado de elevar un número a una potencia.\r\nPRODUCT\t\t\t= PRODUCTO\t\t\t\t##\tMultiplica sus argumentos.\r\nQUOTIENT\t\t= COCIENTE\t\t\t\t##\tDevuelve la parte entera de una división.\r\nRADIANS\t\t\t= RADIANES\t\t\t\t##\tConvierte grados en radianes.\r\nRAND\t\t\t= ALEATORIO\t\t\t\t##\tDevuelve un número aleatorio entre 0 y 1.\r\nRANDBETWEEN\t\t= ALEATORIO.ENTRE\t\t\t##\tDevuelve un número aleatorio entre los números que especifique.\r\nROMAN\t\t\t= NUMERO.ROMANO\t\t\t\t##\tConvierte un número arábigo en número romano, con formato de texto.\r\nROUND\t\t\t= REDONDEAR\t\t\t\t##\tRedondea un número al número de decimales especificado.\r\nROUNDDOWN\t\t= REDONDEAR.MENOS\t\t\t##\tRedondea un número hacia abajo, en dirección hacia cero.\r\nROUNDUP\t\t\t= REDONDEAR.MAS\t\t\t\t##\tRedondea un número hacia arriba, en dirección contraria a cero.\r\nSERIESSUM\t\t= SUMA.SERIES\t\t\t\t##\tDevuelve la suma de una serie de potencias en función de la fórmula.\r\nSIGN\t\t\t= SIGNO\t\t\t\t\t##\tDevuelve el signo de un número.\r\nSIN\t\t\t= SENO\t\t\t\t\t##\tDevuelve el seno de un ángulo determinado.\r\nSINH\t\t\t= SENOH\t\t\t\t\t##\tDevuelve el seno hiperbólico de un número.\r\nSQRT\t\t\t= RAIZ\t\t\t\t\t##\tDevuelve la raíz cuadrada positiva de un número.\r\nSQRTPI\t\t\t= RAIZ2PI\t\t\t\t##\tDevuelve la raíz cuadrada de un número multiplicado por PI (número * pi).\r\nSUBTOTAL\t\t= SUBTOTALES\t\t\t\t##\tDevuelve un subtotal en una lista o base de datos.\r\nSUM\t\t\t= SUMA\t\t\t\t\t##\tSuma sus argumentos.\r\nSUMIF\t\t\t= SUMAR.SI\t\t\t\t##\tSuma las celdas especificadas que cumplen unos criterios determinados.\r\nSUMIFS\t\t\t= SUMAR.SI.CONJUNTO\t\t\t##\tSuma las celdas de un rango que cumplen varios criterios.\r\nSUMPRODUCT\t\t= SUMAPRODUCTO\t\t\t\t##\tDevuelve la suma de los productos de los correspondientes componentes de matriz.\r\nSUMSQ\t\t\t= SUMA.CUADRADOS\t\t\t##\tDevuelve la suma de los cuadrados de los argumentos.\r\nSUMX2MY2\t\t= SUMAX2MENOSY2\t\t\t\t##\tDevuelve la suma de la diferencia de los cuadrados de los valores correspondientes de dos matrices.\r\nSUMX2PY2\t\t= SUMAX2MASY2\t\t\t\t##\tDevuelve la suma de la suma de los cuadrados de los valores correspondientes de dos matrices.\r\nSUMXMY2\t\t\t= SUMAXMENOSY2\t\t\t\t##\tDevuelve la suma de los cuadrados de las diferencias de los valores correspondientes de dos matrices.\r\nTAN\t\t\t= TAN\t\t\t\t\t##\tDevuelve la tangente de un número.\r\nTANH\t\t\t= TANH\t\t\t\t\t##\tDevuelve la tangente hiperbólica de un número.\r\nTRUNC\t\t\t= TRUNCAR\t\t\t\t##\tTrunca un número a un entero.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\t\tFunciones estadísticas\r\n##\r\nAVEDEV\t\t\t= DESVPROM\t\t\t\t##\tDevuelve el promedio de las desviaciones absolutas de la media de los puntos de datos.\r\nAVERAGE\t\t\t= PROMEDIO\t\t\t\t##\tDevuelve el promedio de sus argumentos.\r\nAVERAGEA\t\t= PROMEDIOA\t\t\t\t##\tDevuelve el promedio de sus argumentos, incluidos números, texto y valores lógicos.\r\nAVERAGEIF\t\t= PROMEDIO.SI\t\t\t\t##\tDevuelve el promedio (media aritmética) de todas las celdas de un rango que cumplen unos criterios determinados.\r\nAVERAGEIFS\t\t= PROMEDIO.SI.CONJUNTO\t\t\t##\tDevuelve el promedio (media aritmética) de todas las celdas que cumplen múltiples criterios.\r\nBETADIST\t\t= DISTR.BETA\t\t\t\t##\tDevuelve la función de distribución beta acumulativa.\r\nBETAINV\t\t\t= DISTR.BETA.INV\t\t\t##\tDevuelve la función inversa de la función de distribución acumulativa de una distribución beta especificada.\r\nBINOMDIST\t\t= DISTR.BINOM\t\t\t\t##\tDevuelve la probabilidad de una variable aleatoria discreta siguiendo una distribución binomial.\r\nCHIDIST\t\t\t= DISTR.CHI\t\t\t\t##\tDevuelve la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola.\r\nCHIINV\t\t\t= PRUEBA.CHI.INV\t\t\t##\tDevuelve la función inversa de la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola.\r\nCHITEST\t\t\t= PRUEBA.CHI\t\t\t\t##\tDevuelve la prueba de independencia.\r\nCONFIDENCE\t\t= INTERVALO.CONFIANZA\t\t\t##\tDevuelve el intervalo de confianza de la media de una población.\r\nCORREL\t\t\t= COEF.DE.CORREL\t\t\t##\tDevuelve el coeficiente de correlación entre dos conjuntos de datos.\r\nCOUNT\t\t\t= CONTAR\t\t\t\t##\tCuenta cuántos números hay en la lista de argumentos.\r\nCOUNTA\t\t\t= CONTARA\t\t\t\t##\tCuenta cuántos valores hay en la lista de argumentos.\r\nCOUNTBLANK\t\t= CONTAR.BLANCO\t\t\t\t##\tCuenta el número de celdas en blanco de un rango.\r\nCOUNTIF\t\t\t= CONTAR.SI\t\t\t\t##\tCuenta el número de celdas, dentro del rango, que cumplen el criterio especificado.\r\nCOUNTIFS\t\t= CONTAR.SI.CONJUNTO\t\t\t##\tCuenta el número de celdas, dentro del rango, que cumplen varios criterios.\r\nCOVAR\t\t\t= COVAR\t\t\t\t\t##\tDevuelve la covarianza, que es el promedio de los productos de las desviaciones para cada pareja de puntos de datos.\r\nCRITBINOM\t\t= BINOM.CRIT\t\t\t\t##\tDevuelve el menor valor cuya distribución binomial acumulativa es menor o igual a un valor de criterio.\r\nDEVSQ\t\t\t= DESVIA2\t\t\t\t##\tDevuelve la suma de los cuadrados de las desviaciones.\r\nEXPONDIST\t\t= DISTR.EXP\t\t\t\t##\tDevuelve la distribución exponencial.\r\nFDIST\t\t\t= DISTR.F\t\t\t\t##\tDevuelve la distribución de probabilidad F.\r\nFINV\t\t\t= DISTR.F.INV\t\t\t\t##\tDevuelve la función inversa de la distribución de probabilidad F.\r\nFISHER\t\t\t= FISHER\t\t\t\t##\tDevuelve la transformación Fisher.\r\nFISHERINV\t\t= PRUEBA.FISHER.INV\t\t\t##\tDevuelve la función inversa de la transformación Fisher.\r\nFORECAST\t\t= PRONOSTICO\t\t\t\t##\tDevuelve un valor en una tendencia lineal.\r\nFREQUENCY\t\t= FRECUENCIA\t\t\t\t##\tDevuelve una distribución de frecuencia como una matriz vertical.\r\nFTEST\t\t\t= PRUEBA.F\t\t\t\t##\tDevuelve el resultado de una prueba F.\r\nGAMMADIST\t\t= DISTR.GAMMA\t\t\t\t##\tDevuelve la distribución gamma.\r\nGAMMAINV\t\t= DISTR.GAMMA.INV\t\t\t##\tDevuelve la función inversa de la distribución gamma acumulativa.\r\nGAMMALN\t\t\t= GAMMA.LN\t\t\t\t##\tDevuelve el logaritmo natural de la función gamma, G(x).\r\nGEOMEAN\t\t\t= MEDIA.GEOM\t\t\t\t##\tDevuelve la media geométrica.\r\nGROWTH\t\t\t= CRECIMIENTO\t\t\t\t##\tDevuelve valores en una tendencia exponencial.\r\nHARMEAN\t\t\t= MEDIA.ARMO\t\t\t\t##\tDevuelve la media armónica.\r\nHYPGEOMDIST\t\t= DISTR.HIPERGEOM\t\t\t##\tDevuelve la distribución hipergeométrica.\r\nINTERCEPT\t\t= INTERSECCION.EJE\t\t\t##\tDevuelve la intersección de la línea de regresión lineal.\r\nKURT\t\t\t= CURTOSIS\t\t\t\t##\tDevuelve la curtosis de un conjunto de datos.\r\nLARGE\t\t\t= K.ESIMO.MAYOR\t\t\t\t##\tDevuelve el k-ésimo mayor valor de un conjunto de datos.\r\nLINEST\t\t\t= ESTIMACION.LINEAL\t\t\t##\tDevuelve los parámetros de una tendencia lineal.\r\nLOGEST\t\t\t= ESTIMACION.LOGARITMICA\t\t##\tDevuelve los parámetros de una tendencia exponencial.\r\nLOGINV\t\t\t= DISTR.LOG.INV\t\t\t\t##\tDevuelve la función inversa de la distribución logarítmico-normal.\r\nLOGNORMDIST\t\t= DISTR.LOG.NORM\t\t\t##\tDevuelve la distribución logarítmico-normal acumulativa.\r\nMAX\t\t\t= MAX\t\t\t\t\t##\tDevuelve el valor máximo de una lista de argumentos.\r\nMAXA\t\t\t= MAXA\t\t\t\t\t##\tDevuelve el valor máximo de una lista de argumentos, incluidos números, texto y valores lógicos.\r\nMEDIAN\t\t\t= MEDIANA\t\t\t\t##\tDevuelve la mediana de los números dados.\r\nMIN\t\t\t= MIN\t\t\t\t\t##\tDevuelve el valor mínimo de una lista de argumentos.\r\nMINA\t\t\t= MINA\t\t\t\t\t##\tDevuelve el valor mínimo de una lista de argumentos, incluidos números, texto y valores lógicos.\r\nMODE\t\t\t= MODA\t\t\t\t\t##\tDevuelve el valor más común de un conjunto de datos.\r\nNEGBINOMDIST\t\t= NEGBINOMDIST\t\t\t\t##\tDevuelve la distribución binomial negativa.\r\nNORMDIST\t\t= DISTR.NORM\t\t\t\t##\tDevuelve la distribución normal acumulativa.\r\nNORMINV\t\t\t= DISTR.NORM.INV\t\t\t##\tDevuelve la función inversa de la distribución normal acumulativa.\r\nNORMSDIST\t\t= DISTR.NORM.ESTAND\t\t\t##\tDevuelve la distribución normal estándar acumulativa.\r\nNORMSINV\t\t= DISTR.NORM.ESTAND.INV\t\t\t##\tDevuelve la función inversa de la distribución normal estándar acumulativa.\r\nPEARSON\t\t\t= PEARSON\t\t\t\t##\tDevuelve el coeficiente de momento de correlación de producto Pearson.\r\nPERCENTILE\t\t= PERCENTIL\t\t\t\t##\tDevuelve el k-ésimo percentil de los valores de un rango.\r\nPERCENTRANK\t\t= RANGO.PERCENTIL\t\t\t##\tDevuelve el rango porcentual de un valor de un conjunto de datos.\r\nPERMUT\t\t\t= PERMUTACIONES\t\t\t\t##\tDevuelve el número de permutaciones de un número determinado de objetos.\r\nPOISSON\t\t\t= POISSON\t\t\t\t##\tDevuelve la distribución de Poisson.\r\nPROB\t\t\t= PROBABILIDAD\t\t\t\t##\tDevuelve la probabilidad de que los valores de un rango se encuentren entre dos límites.\r\nQUARTILE\t\t= CUARTIL\t\t\t\t##\tDevuelve el cuartil de un conjunto de datos.\r\nRANK\t\t\t= JERARQUIA\t\t\t\t##\tDevuelve la jerarquía de un número en una lista de números.\r\nRSQ\t\t\t= COEFICIENTE.R2\t\t\t##\tDevuelve el cuadrado del coeficiente de momento de correlación de producto Pearson.\r\nSKEW\t\t\t= COEFICIENTE.ASIMETRIA\t\t\t##\tDevuelve la asimetría de una distribución.\r\nSLOPE\t\t\t= PENDIENTE\t\t\t\t##\tDevuelve la pendiente de la línea de regresión lineal.\r\nSMALL\t\t\t= K.ESIMO.MENOR\t\t\t\t##\tDevuelve el k-ésimo menor valor de un conjunto de datos.\r\nSTANDARDIZE\t\t= NORMALIZACION\t\t\t\t##\tDevuelve un valor normalizado.\r\nSTDEV\t\t\t= DESVEST\t\t\t\t##\tCalcula la desviación estándar a partir de una muestra.\r\nSTDEVA\t\t\t= DESVESTA\t\t\t\t##\tCalcula la desviación estándar a partir de una muestra, incluidos números, texto y valores lógicos.\r\nSTDEVP\t\t\t= DESVESTP\t\t\t\t##\tCalcula la desviación estándar en función de toda la población.\r\nSTDEVPA\t\t\t= DESVESTPA\t\t\t\t##\tCalcula la desviación estándar en función de toda la población, incluidos números, texto y valores lógicos.\r\nSTEYX\t\t\t= ERROR.TIPICO.XY\t\t\t##\tDevuelve el error estándar del valor de \"y\" previsto para cada \"x\" de la regresión.\r\nTDIST\t\t\t= DISTR.T\t\t\t\t##\tDevuelve la distribución de t de Student.\r\nTINV\t\t\t= DISTR.T.INV\t\t\t\t##\tDevuelve la función inversa de la distribución de t de Student.\r\nTREND\t\t\t= TENDENCIA\t\t\t\t##\tDevuelve valores en una tendencia lineal.\r\nTRIMMEAN\t\t= MEDIA.ACOTADA\t\t\t\t##\tDevuelve la media del interior de un conjunto de datos.\r\nTTEST\t\t\t= PRUEBA.T\t\t\t\t##\tDevuelve la probabilidad asociada a una prueba t de Student.\r\nVAR\t\t\t= VAR\t\t\t\t\t##\tCalcula la varianza en función de una muestra.\r\nVARA\t\t\t= VARA\t\t\t\t\t##\tCalcula la varianza en función de una muestra, incluidos números, texto y valores lógicos.\r\nVARP\t\t\t= VARP\t\t\t\t\t##\tCalcula la varianza en función de toda la población.\r\nVARPA\t\t\t= VARPA\t\t\t\t\t##\tCalcula la varianza en función de toda la población, incluidos números, texto y valores lógicos.\r\nWEIBULL\t\t\t= DIST.WEIBULL\t\t\t\t##\tDevuelve la distribución de Weibull.\r\nZTEST\t\t\t= PRUEBA.Z\t\t\t\t##\tDevuelve el valor de una probabilidad de una cola de una prueba z.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\t\tFunciones de texto\r\n##\r\nASC\t\t\t= ASC\t\t\t\t\t##\tConvierte las letras inglesas o katakana de ancho completo (de dos bytes) dentro de una cadena de caracteres en caracteres de ancho medio (de un byte).\r\nBAHTTEXT\t\t= TEXTOBAHT\t\t\t\t##\tConvierte un número en texto, con el formato de moneda ß (Baht).\r\nCHAR\t\t\t= CARACTER\t\t\t\t##\tDevuelve el carácter especificado por el número de código.\r\nCLEAN\t\t\t= LIMPIAR\t\t\t\t##\tQuita del texto todos los caracteres no imprimibles.\r\nCODE\t\t\t= CODIGO\t\t\t\t##\tDevuelve un código numérico del primer carácter de una cadena de texto.\r\nCONCATENATE\t\t= CONCATENAR\t\t\t\t##\tConcatena varios elementos de texto en uno solo.\r\nDOLLAR\t\t\t= MONEDA\t\t\t\t##\tConvierte un número en texto, con el formato de moneda $ (dólar).\r\nEXACT\t\t\t= IGUAL\t\t\t\t\t##\tComprueba si dos valores de texto son idénticos.\r\nFIND\t\t\t= ENCONTRAR\t\t\t\t##\tBusca un valor de texto dentro de otro (distingue mayúsculas de minúsculas).\r\nFINDB\t\t\t= ENCONTRARB\t\t\t\t##\tBusca un valor de texto dentro de otro (distingue mayúsculas de minúsculas).\r\nFIXED\t\t\t= DECIMAL\t\t\t\t##\tDa formato a un número como texto con un número fijo de decimales.\r\nJIS\t\t\t= JIS\t\t\t\t\t##\tConvierte las letras inglesas o katakana de ancho medio (de un byte) dentro de una cadena de caracteres en caracteres de ancho completo (de dos bytes).\r\nLEFT\t\t\t= IZQUIERDA\t\t\t\t##\tDevuelve los caracteres del lado izquierdo de un valor de texto.\r\nLEFTB\t\t\t= IZQUIERDAB\t\t\t\t##\tDevuelve los caracteres del lado izquierdo de un valor de texto.\r\nLEN\t\t\t= LARGO\t\t\t\t\t##\tDevuelve el número de caracteres de una cadena de texto.\r\nLENB\t\t\t= LARGOB\t\t\t\t##\tDevuelve el número de caracteres de una cadena de texto.\r\nLOWER\t\t\t= MINUSC\t\t\t\t##\tPone el texto en minúsculas.\r\nMID\t\t\t= EXTRAE\t\t\t\t##\tDevuelve un número específico de caracteres de una cadena de texto que comienza en la posición que se especifique.\r\nMIDB\t\t\t= EXTRAEB\t\t\t\t##\tDevuelve un número específico de caracteres de una cadena de texto que comienza en la posición que se especifique.\r\nPHONETIC\t\t= FONETICO\t\t\t\t##\tExtrae los caracteres fonéticos (furigana) de una cadena de texto.\r\nPROPER\t\t\t= NOMPROPIO\t\t\t\t##\tPone en mayúscula la primera letra de cada palabra de un valor de texto.\r\nREPLACE\t\t\t= REEMPLAZAR\t\t\t\t##\tReemplaza caracteres de texto.\r\nREPLACEB\t\t= REEMPLAZARB\t\t\t\t##\tReemplaza caracteres de texto.\r\nREPT\t\t\t= REPETIR\t\t\t\t##\tRepite el texto un número determinado de veces.\r\nRIGHT\t\t\t= DERECHA\t\t\t\t##\tDevuelve los caracteres del lado derecho de un valor de texto.\r\nRIGHTB\t\t\t= DERECHAB\t\t\t\t##\tDevuelve los caracteres del lado derecho de un valor de texto.\r\nSEARCH\t\t\t= HALLAR\t\t\t\t##\tBusca un valor de texto dentro de otro (no distingue mayúsculas de minúsculas).\r\nSEARCHB\t\t\t= HALLARB\t\t\t\t##\tBusca un valor de texto dentro de otro (no distingue mayúsculas de minúsculas).\r\nSUBSTITUTE\t\t= SUSTITUIR\t\t\t\t##\tSustituye texto nuevo por texto antiguo en una cadena de texto.\r\nT\t\t\t= T\t\t\t\t\t##\tConvierte sus argumentos a texto.\r\nTEXT\t\t\t= TEXTO\t\t\t\t\t##\tDa formato a un número y lo convierte en texto.\r\nTRIM\t\t\t= ESPACIOS\t\t\t\t##\tQuita los espacios del texto.\r\nUPPER\t\t\t= MAYUSC\t\t\t\t##\tPone el texto en mayúsculas.\r\nVALUE\t\t\t= VALOR\t\t\t\t\t##\tConvierte un argumento de texto en un número.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/fi/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= $\t#\tSymbol not known, should it be a € (Euro)?\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #TYHJÄ!\r\nDIV0\t= #JAKO/0!\r\nVALUE\t= #ARVO!\r\nREF\t= #VIITTAUS!\r\nNAME\t= #NIMI?\r\nNUM\t= #LUKU!\r\nNA\t= #PUUTTUU\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/fi/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tApuohjelma- ja automaatiofunktiot\r\n##\r\nGETPIVOTDATA\t\t= NOUDA.PIVOT.TIEDOT\t\t##\tPalauttaa pivot-taulukkoraporttiin tallennettuja tietoja.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tKuutiofunktiot\r\n##\r\nCUBEKPIMEMBER\t\t= KUUTIOKPIJÄSEN\t\t##\tPalauttaa suorituskykyilmaisimen (KPI) nimen, ominaisuuden sekä mitan ja näyttää nimen sekä ominaisuuden solussa. KPI on mitattavissa oleva suure, kuten kuukauden bruttotuotto tai vuosineljänneksen työntekijäkohtainen liikevaihto, joiden avulla tarkkaillaan organisaation suorituskykyä.\r\nCUBEMEMBER\t\t= KUUTIONJÄSEN\t\t\t##\tPalauttaa kuutiohierarkian jäsenen tai monikon. Tällä funktiolla voit tarkistaa, että jäsen tai monikko on olemassa kuutiossa.\r\nCUBEMEMBERPROPERTY\t= KUUTIONJÄSENENOMINAISUUS\t##\tPalauttaa kuution jäsenominaisuuden arvon. Tällä funktiolla voit tarkistaa, että nimi on olemassa kuutiossa, ja palauttaa tämän jäsenen määritetyn ominaisuuden.\r\nCUBERANKEDMEMBER\t= KUUTIONLUOKITELTUJÄSEN\t##\tPalauttaa joukon n:nnen jäsenen. Tällä funktiolla voit palauttaa joukosta elementtejä, kuten parhaan myyjän tai 10 parasta opiskelijaa.\r\nCUBESET\t\t\t= KUUTIOJOUKKO\t\t\t##\tMäärittää lasketun jäsen- tai monikkojoukon lähettämällä joukon lausekkeita palvelimessa olevalle kuutiolle. Palvelin luo joukon ja palauttaa sen Microsoft Office Excelille.\r\nCUBESETCOUNT\t\t= KUUTIOJOUKKOJENMÄÄRÄ\t\t##\tPalauttaa joukon kohteiden määrän.\r\nCUBEVALUE\t\t= KUUTIONARVO\t\t\t##\tPalauttaa koostetun arvon kuutiosta.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tTietokantafunktiot\r\n##\r\nDAVERAGE\t\t= TKESKIARVO\t\t\t##\tPalauttaa valittujen tietokantamerkintöjen keskiarvon.\r\nDCOUNT\t\t\t= TLASKE\t\t\t##\tLaskee tietokannan lukuja sisältävien solujen määrän.\r\nDCOUNTA\t\t\t= TLASKEA\t\t\t##\tLaskee tietokannan tietoja sisältävien solujen määrän.\r\nDGET\t\t\t= TNOUDA\t\t\t##\tHakee määritettyjä ehtoja vastaavan tietueen tietokannasta.\r\nDMAX\t\t\t= TMAKS\t\t\t\t##\tPalauttaa suurimman arvon tietokannasta valittujen arvojen joukosta.\r\nDMIN\t\t\t= TMIN\t\t\t\t##\tPalauttaa pienimmän arvon tietokannasta valittujen arvojen joukosta.\r\nDPRODUCT\t\t= TTULO\t\t\t\t##\tKertoo määritetyn ehdon täyttävien tietokannan tietueiden tietyssä kentässä olevat arvot.\r\nDSTDEV\t\t\t= TKESKIHAJONTA\t\t\t##\tLaskee keskihajonnan tietokannasta valituista arvoista muodostuvan otoksen perusteella.\r\nDSTDEVP\t\t\t= TKESKIHAJONTAP\t\t##\tLaskee keskihajonnan tietokannasta valittujen arvojen koko populaation perusteella.\r\nDSUM\t\t\t= TSUMMA\t\t\t##\tLisää luvut määritetyn ehdon täyttävien tietokannan tietueiden kenttäsarakkeeseen.\r\nDVAR\t\t\t= TVARIANSSI\t\t\t##\tLaskee varianssin tietokannasta valittujen arvojen otoksen perusteella.\r\nDVARP\t\t\t= TVARIANSSIP\t\t\t##\tLaskee varianssin tietokannasta valittujen arvojen koko populaation perusteella.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tPäivämäärä- ja aikafunktiot\r\n##\r\nDATE\t\t\t= PÄIVÄYS\t\t\t##\tPalauttaa annetun päivämäärän järjestysluvun.\r\nDATEVALUE\t\t= PÄIVÄYSARVO\t\t\t##\tMuuntaa tekstimuodossa olevan päivämäärän järjestysluvuksi.\r\nDAY\t\t\t= PÄIVÄ\t\t\t\t##\tMuuntaa järjestysluvun kuukauden päiväksi.\r\nDAYS360\t\t\t= PÄIVÄT360\t\t\t##\tLaskee kahden päivämäärän välisten päivien määrän käyttäen perustana 360-päiväistä vuotta.\r\nEDATE\t\t\t= PÄIVÄ.KUUKAUSI\t\t##\tPalauttaa järjestyslukuna päivämäärän, joka poikkeaa aloituspäivän päivämäärästä annetun kuukausimäärän verran joko eteen- tai taaksepäin.\r\nEOMONTH\t\t\t= KUUKAUSI.LOPPU\t\t##\tPalauttaa järjestyslukuna sen kuukauden viimeisen päivämäärän, joka poikkeaa annetun kuukausimäärän verran eteen- tai taaksepäin.\r\nHOUR\t\t\t= TUNNIT\t\t\t##\tMuuntaa järjestysluvun tunneiksi.\r\nMINUTE\t\t\t= MINUUTIT\t\t\t##\tMuuntaa järjestysluvun minuuteiksi.\r\nMONTH\t\t\t= KUUKAUSI\t\t\t##\tMuuntaa järjestysluvun kuukausiksi.\r\nNETWORKDAYS\t\t= TYÖPÄIVÄT\t\t\t##\tPalauttaa kahden päivämäärän välissä olevien täysien työpäivien määrän.\r\nNOW\t\t\t= NYT\t\t\t\t##\tPalauttaa kuluvan päivämäärän ja ajan järjestysnumeron.\r\nSECOND\t\t\t= SEKUNNIT\t\t\t##\tMuuntaa järjestysluvun sekunneiksi.\r\nTIME\t\t\t= AIKA\t\t\t\t##\tPalauttaa annetun kellonajan järjestysluvun.\r\nTIMEVALUE\t\t= AIKA_ARVO\t\t\t##\tMuuntaa tekstimuodossa olevan kellonajan järjestysluvuksi.\r\nTODAY\t\t\t= TÄMÄ.PÄIVÄ\t\t\t##\tPalauttaa kuluvan päivän päivämäärän järjestysluvun.\r\nWEEKDAY\t\t\t= VIIKONPÄIVÄ\t\t\t##\tMuuntaa järjestysluvun viikonpäiväksi.\r\nWEEKNUM\t\t\t= VIIKKO.NRO\t\t\t##\tMuuntaa järjestysluvun luvuksi, joka ilmaisee viikon järjestysluvun vuoden alusta laskettuna.\r\nWORKDAY\t\t\t= TYÖPÄIVÄ\t\t\t##\tPalauttaa järjestysluvun päivämäärälle, joka sijaitsee annettujen työpäivien verran eteen tai taaksepäin.\r\nYEAR\t\t\t= VUOSI\t\t\t\t##\tMuuntaa järjestysluvun vuosiksi.\r\nYEARFRAC\t\t= VUOSI.OSA\t\t\t##\tPalauttaa määritettyjen päivämäärien (aloituspäivä ja lopetuspäivä) välisen osan vuodesta.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tTekniset funktiot\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tPalauttaa muunnetun Bessel-funktion In(x).\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tPalauttaa Bessel-funktion Jn(x).\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tPalauttaa muunnetun Bessel-funktion Kn(x).\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tPalauttaa Bessel-funktion Yn(x).\r\nBIN2DEC\t\t\t= BINDES\t\t\t##\tMuuntaa binaariluvun desimaaliluvuksi.\r\nBIN2HEX\t\t\t= BINHEKSA\t\t\t##\tMuuntaa binaariluvun heksadesimaaliluvuksi.\r\nBIN2OCT\t\t\t= BINOKT\t\t\t##\tMuuntaa binaariluvun oktaaliluvuksi.\r\nCOMPLEX\t\t\t= KOMPLEKSI\t\t\t##\tMuuntaa reaali- ja imaginaariosien kertoimet kompleksiluvuksi.\r\nCONVERT\t\t\t= MUUNNA\t\t\t##\tMuuntaa luvun toisen mittajärjestelmän mukaiseksi.\r\nDEC2BIN\t\t\t= DESBIN\t\t\t##\tMuuntaa desimaaliluvun binaariluvuksi.\r\nDEC2HEX\t\t\t= DESHEKSA\t\t\t##\tMuuntaa kymmenjärjestelmän luvun heksadesimaaliluvuksi.\r\nDEC2OCT\t\t\t= DESOKT\t\t\t##\tMuuntaa kymmenjärjestelmän luvun oktaaliluvuksi.\r\nDELTA\t\t\t= SAMA.ARVO\t\t\t##\tTarkistaa, ovatko kaksi arvoa yhtä suuria.\r\nERF\t\t\t= VIRHEFUNKTIO\t\t\t##\tPalauttaa virhefunktion.\r\nERFC\t\t\t= VIRHEFUNKTIO.KOMPLEMENTTI\t##\tPalauttaa komplementtivirhefunktion.\r\nGESTEP\t\t\t= RAJA\t\t\t\t##\tTestaa, onko luku suurempi kuin kynnysarvo.\r\nHEX2BIN\t\t\t= HEKSABIN\t\t\t##\tMuuntaa heksadesimaaliluvun binaariluvuksi.\r\nHEX2DEC\t\t\t= HEKSADES\t\t\t##\tMuuntaa heksadesimaaliluvun desimaaliluvuksi.\r\nHEX2OCT\t\t\t= HEKSAOKT\t\t\t##\tMuuntaa heksadesimaaliluvun oktaaliluvuksi.\r\nIMABS\t\t\t= KOMPLEKSI.ITSEISARVO\t\t##\tPalauttaa kompleksiluvun itseisarvon (moduluksen).\r\nIMAGINARY\t\t= KOMPLEKSI.IMAG\t\t##\tPalauttaa kompleksiluvun imaginaariosan kertoimen.\r\nIMARGUMENT\t\t= KOMPLEKSI.ARG\t\t\t##\tPalauttaa theeta-argumentin, joka on radiaaneina annettu kulma.\r\nIMCONJUGATE\t\t= KOMPLEKSI.KONJ\t\t##\tPalauttaa kompleksiluvun konjugaattiluvun.\r\nIMCOS\t\t\t= KOMPLEKSI.COS\t\t\t##\tPalauttaa kompleksiluvun kosinin.\r\nIMDIV\t\t\t= KOMPLEKSI.OSAM\t\t##\tPalauttaa kahden kompleksiluvun osamäärän.\r\nIMEXP\t\t\t= KOMPLEKSI.EKSP\t\t##\tPalauttaa kompleksiluvun eksponentin.\r\nIMLN\t\t\t= KOMPLEKSI.LN\t\t\t##\tPalauttaa kompleksiluvun luonnollisen logaritmin.\r\nIMLOG10\t\t\t= KOMPLEKSI.LOG10\t\t##\tPalauttaa kompleksiluvun kymmenkantaisen logaritmin.\r\nIMLOG2\t\t\t= KOMPLEKSI.LOG2\t\t##\tPalauttaa kompleksiluvun kaksikantaisen logaritmin.\r\nIMPOWER\t\t\t= KOMPLEKSI.POT\t\t\t##\tPalauttaa kokonaislukupotenssiin korotetun kompleksiluvun.\r\nIMPRODUCT\t\t= KOMPLEKSI.TULO\t\t##\tPalauttaa kompleksilukujen tulon.\r\nIMREAL\t\t\t= KOMPLEKSI.REAALI\t\t##\tPalauttaa kompleksiluvun reaaliosan kertoimen.\r\nIMSIN\t\t\t= KOMPLEKSI.SIN\t\t\t##\tPalauttaa kompleksiluvun sinin.\r\nIMSQRT\t\t\t= KOMPLEKSI.NELIÖJ\t\t##\tPalauttaa kompleksiluvun neliöjuuren.\r\nIMSUB\t\t\t= KOMPLEKSI.EROTUS\t\t##\tPalauttaa kahden kompleksiluvun erotuksen.\r\nIMSUM\t\t\t= KOMPLEKSI.SUM\t\t\t##\tPalauttaa kompleksilukujen summan.\r\nOCT2BIN\t\t\t= OKTBIN\t\t\t##\tMuuntaa oktaaliluvun binaariluvuksi.\r\nOCT2DEC\t\t\t= OKTDES\t\t\t##\tMuuntaa oktaaliluvun desimaaliluvuksi.\r\nOCT2HEX\t\t\t= OKTHEKSA\t\t\t##\tMuuntaa oktaaliluvun heksadesimaaliluvuksi.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tRahoitusfunktiot   \r\n##\r\nACCRINT\t\t\t= KERTYNYT.KORKO\t\t##\tLaskee arvopaperille kertyneen koron, kun korko kertyy säännöllisin väliajoin.\r\nACCRINTM\t\t= KERTYNYT.KORKO.LOPUSSA\t##\tLaskee arvopaperille kertyneen koron, kun korko maksetaan eräpäivänä.\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tLaskee kunkin laskentakauden poiston poistokerrointa käyttämällä.\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tPalauttaa kunkin laskentakauden poiston.\r\nCOUPDAYBS\t\t= KORKOPÄIVÄT.ALUSTA\t\t##\tPalauttaa koronmaksukauden aloituspäivän ja tilityspäivän välisen ajanjakson päivien määrän.\r\nCOUPDAYS\t\t= KORKOPÄIVÄT\t\t\t##\tPalauttaa päivien määrän koronmaksukaudelta, johon tilityspäivä kuuluu.\r\nCOUPDAYSNC\t\t= KORKOPÄIVÄT.SEURAAVA\t\t##\tPalauttaa tilityspäivän ja seuraavan koronmaksupäivän välisen ajanjakson päivien määrän.\r\nCOUPNCD\t\t\t= KORKOMAKSU.SEURAAVA\t\t##\tPalauttaa tilityspäivän jälkeisen seuraavan koronmaksupäivän.\r\nCOUPNUM\t\t\t= KORKOPÄIVÄJAKSOT\t\t##\tPalauttaa arvopaperin ostopäivän ja erääntymispäivän välisten koronmaksupäivien määrän.\r\nCOUPPCD\t\t\t= KORKOPÄIVÄ.EDELLINEN\t\t##\tPalauttaa tilityspäivää edeltävän koronmaksupäivän.\r\nCUMIPMT\t\t\t= MAKSETTU.KORKO\t\t##\tPalauttaa kahden jakson välisenä aikana kertyneen koron.\r\nCUMPRINC\t\t= MAKSETTU.LYHENNYS\t\t##\tPalauttaa lainalle kahden jakson välisenä aikana kertyneen lyhennyksen.\r\nDB\t\t\t= DB\t\t\t\t##\tPalauttaa kauden kirjanpidollisen poiston amerikkalaisen DB-menetelmän (Fixed-declining balance) mukaan.\r\nDDB\t\t\t= DDB\t\t\t\t##\tPalauttaa kauden kirjanpidollisen poiston amerikkalaisen DDB-menetelmän (Double-Declining Balance) tai jonkin muun määrittämäsi menetelmän mukaan.\r\nDISC\t\t\t= DISKONTTOKORKO\t\t##\tPalauttaa arvopaperin diskonttokoron.\r\nDOLLARDE\t\t= VALUUTTA.DES\t\t\t##\tMuuntaa murtolukuna ilmoitetun valuuttamäärän desimaaliluvuksi.\r\nDOLLARFR\t\t= VALUUTTA.MURTO\t\t##\tMuuntaa desimaalilukuna ilmaistun valuuttamäärän murtoluvuksi.\r\nDURATION\t\t= KESTO\t\t\t\t##\tPalauttaa keston arvopaperille, jonka koronmaksu tapahtuu säännöllisesti.\r\nEFFECT\t\t\t= KORKO.EFEKT\t\t\t##\tPalauttaa todellisen vuosikoron.\r\nFV\t\t\t= TULEVA.ARVO\t\t\t##\tPalauttaa sijoituksen tulevan arvon.\r\nFVSCHEDULE\t\t= TULEVA.ARVO.ERIKORKO\t\t##\tPalauttaa pääoman tulevan arvon, kun pääomalle on kertynyt korkoa vaihtelevasti.\r\nINTRATE\t\t\t= KORKO.ARVOPAPERI\t\t##\tPalauttaa arvopaperin korkokannan täysin sijoitetulle arvopaperille.\r\nIPMT\t\t\t= IPMT\t\t\t\t##\tLaskee sijoitukselle tai lainalle tiettynä ajanjaksona kertyvän koron.\r\nIRR\t\t\t= SISÄINEN.KORKO\t\t##\tLaskee sisäisen korkokannan kassavirrasta muodostuvalle sarjalle.\r\nISPMT\t\t\t= ONMAKSU\t\t\t##\tLaskee sijoituksen maksetun koron tietyllä jaksolla.\r\nMDURATION\t\t= KESTO.MUUNN\t\t\t##\tPalauttaa muunnetun Macauley-keston arvopaperille, jonka oletettu nimellisarvo on 100 euroa.\r\nMIRR\t\t\t= MSISÄINEN\t\t\t##\tPalauttaa sisäisen korkokannan, kun positiivisten ja negatiivisten kassavirtojen rahoituskorko on erilainen.\r\nNOMINAL\t\t\t= KORKO.VUOSI\t\t\t##\tPalauttaa vuosittaisen nimelliskoron.\r\nNPER\t\t\t= NJAKSO\t\t\t##\tPalauttaa sijoituksen jaksojen määrän.\r\nNPV\t\t\t= NNA\t\t\t\t##\tPalauttaa sijoituksen nykyarvon toistuvista kassavirroista muodostuvan sarjan ja diskonttokoron perusteella.\r\nODDFPRICE\t\t= PARITON.ENS.NIMELLISARVO\t##\tPalauttaa arvopaperin hinnan tilanteessa, jossa ensimmäinen jakso on pariton.\r\nODDFYIELD\t\t= PARITON.ENS.TUOTTO\t\t##\tPalauttaa arvopaperin tuoton tilanteessa, jossa ensimmäinen jakso on pariton.\r\nODDLPRICE\t\t= PARITON.VIIM.NIMELLISARVO\t##\tPalauttaa arvopaperin hinnan tilanteessa, jossa viimeinen jakso on pariton.\r\nODDLYIELD\t\t= PARITON.VIIM.TUOTTO\t\t##\tPalauttaa arvopaperin tuoton tilanteessa, jossa viimeinen jakso on pariton.\r\nPMT\t\t\t= MAKSU\t\t\t\t##\tPalauttaa annuiteetin kausittaisen maksuerän.\r\nPPMT\t\t\t= PPMT\t\t\t\t##\tLaskee sijoitukselle tai lainalle tiettynä ajanjaksona maksettavan lyhennyksen.\r\nPRICE\t\t\t= HINTA\t\t\t\t##\tPalauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan säännöllisin väliajoin.\r\nPRICEDISC\t\t= HINTA.DISK\t\t\t##\tPalauttaa diskontatun arvopaperin hinnan 100 euron nimellisarvoa kohden.\r\nPRICEMAT\t\t= HINTA.LUNASTUS\t\t##\tPalauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan erääntymispäivänä.\r\nPV\t\t\t= NA\t\t\t\t##\tPalauttaa sijoituksen nykyarvon.\r\nRATE\t\t\t= KORKO\t\t\t\t##\tPalauttaa annuiteetin kausittaisen korkokannan.\r\nRECEIVED\t\t= SAATU.HINTA\t\t\t##\tPalauttaa arvopaperin tuoton erääntymispäivänä kokonaan maksetulle sijoitukselle.\r\nSLN\t\t\t= STP\t\t\t\t##\tPalauttaa sijoituksen tasapoiston yhdeltä jaksolta.\r\nSYD\t\t\t= VUOSIPOISTO\t\t\t##\tPalauttaa sijoituksen vuosipoiston annettuna kautena amerikkalaisen SYD-menetelmän (Sum-of-Year's Digits) avulla.\r\nTBILLEQ\t\t\t= OBLIG.TUOTTOPROS\t\t##\tPalauttaa valtion obligaation tuoton vastaavana joukkovelkakirjan tuottona.\r\nTBILLPRICE\t\t= OBLIG.HINTA\t\t\t##\tPalauttaa obligaation hinnan 100 euron nimellisarvoa kohden.\r\nTBILLYIELD\t\t= OBLIG.TUOTTO\t\t\t##\tPalauttaa obligaation tuoton.\r\nVDB\t\t\t= VDB\t\t\t\t##\tPalauttaa annetun kauden tai kauden osan kirjanpidollisen poiston amerikkalaisen DB-menetelmän (Fixed-declining balance) mukaan.\r\nXIRR\t\t\t= SISÄINEN.KORKO.JAKSOTON\t##\tPalauttaa sisäisen korkokannan kassavirtojen sarjoille, jotka eivät välttämättä ole säännöllisiä.\r\nXNPV\t\t\t= NNA.JAKSOTON\t\t\t##\tPalauttaa nettonykyarvon kassavirtasarjalle, joka ei välttämättä ole kausittainen.\r\nYIELD\t\t\t= TUOTTO\t\t\t##\tPalauttaa tuoton arvopaperille, jonka korko maksetaan säännöllisin väliajoin.\r\nYIELDDISC\t\t= TUOTTO.DISK\t\t\t##\tPalauttaa diskontatun arvopaperin, kuten obligaation, vuosittaisen tuoton.\r\nYIELDMAT\t\t= TUOTTO.ERÄP\t\t\t##\tPalauttaa erääntymispäivänään korkoa tuottavan arvopaperin vuosittaisen tuoton.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tErikoisfunktiot\r\n##\r\nCELL\t\t\t= SOLU\t\t\t\t##\tPalauttaa tietoja solun muotoilusta, sijainnista ja sisällöstä.\r\nERROR.TYPE\t\t= VIRHEEN.LAJI\t\t\t##\tPalauttaa virhetyyppiä vastaavan luvun.\r\nINFO\t\t\t= KUVAUS\t\t\t##\tPalauttaa tietoja nykyisestä käyttöympäristöstä.\r\nISBLANK\t\t\t= ONTYHJÄ\t\t\t##\tPalauttaa arvon TOSI, jos arvo on tyhjä.\r\nISERR\t\t\t= ONVIRH\t\t\t##\tPalauttaa arvon TOSI, jos arvo on mikä tahansa virhearvo paitsi arvo #PUUTTUU!.\r\nISERROR\t\t\t= ONVIRHE\t\t\t##\tPalauttaa arvon TOSI, jos arvo on mikä tahansa virhearvo.\r\nISEVEN\t\t\t= ONPARILLINEN\t\t\t##\tPalauttaa arvon TOSI, jos arvo on parillinen.\r\nISLOGICAL\t\t= ONTOTUUS\t\t\t##\tPalauttaa arvon TOSI, jos arvo on mikä tahansa looginen arvo.\r\nISNA\t\t\t= ONPUUTTUU\t\t\t##\tPalauttaa arvon TOSI, jos virhearvo on #PUUTTUU!.\r\nISNONTEXT\t\t= ONEI_TEKSTI\t\t\t##\tPalauttaa arvon TOSI, jos arvo ei ole teksti.\r\nISNUMBER\t\t= ONLUKU\t\t\t##\tPalauttaa arvon TOSI, jos arvo on luku.\r\nISODD\t\t\t= ONPARITON\t\t\t##\tPalauttaa arvon TOSI, jos arvo on pariton.\r\nISREF\t\t\t= ONVIITT\t\t\t##\tPalauttaa arvon TOSI, jos arvo on viittaus.\r\nISTEXT\t\t\t= ONTEKSTI\t\t\t##\tPalauttaa arvon TOSI, jos arvo on teksti.\r\nN\t\t\t= N\t\t\t\t##\tPalauttaa arvon luvuksi muunnettuna.\r\nNA\t\t\t= PUUTTUU\t\t\t##\tPalauttaa virhearvon #PUUTTUU!.\r\nTYPE\t\t\t= TYYPPI\t\t\t##\tPalauttaa luvun, joka ilmaisee arvon tietotyypin.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tLoogiset funktiot\r\n##\r\nAND\t\t\t= JA\t\t\t\t##\tPalauttaa arvon TOSI, jos kaikkien argumenttien arvo on TOSI.\r\nFALSE\t\t\t= EPÄTOSI\t\t\t##\tPalauttaa totuusarvon EPÄTOSI.\r\nIF\t\t\t= JOS\t\t\t\t##\tMäärittää suoritettavan loogisen testin.\r\nIFERROR\t\t\t= JOSVIRHE\t\t\t##\tPalauttaa määrittämäsi arvon, jos kaavan tulos on virhe; muussa tapauksessa palauttaa kaavan tuloksen.\r\nNOT\t\t\t= EI\t\t\t\t##\tKääntää argumentin loogisen arvon.\r\nOR\t\t\t= TAI\t\t\t\t##\tPalauttaa arvon TOSI, jos minkä tahansa argumentin arvo on TOSI.\r\nTRUE\t\t\t= TOSI\t\t\t\t##\tPalauttaa totuusarvon TOSI.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tHaku- ja viitefunktiot\r\n##\r\nADDRESS\t\t\t= OSOITE\t\t\t##\tPalauttaa laskentataulukon soluun osoittavan viittauksen tekstinä.\r\nAREAS\t\t\t= ALUEET\t\t\t##\tPalauttaa viittauksessa olevien alueiden määrän.\r\nCHOOSE\t\t\t= VALITSE.INDEKSI\t\t##\tValitsee arvon arvoluettelosta.\r\nCOLUMN\t\t\t= SARAKE\t\t\t##\tPalauttaa viittauksen sarakenumeron.\r\nCOLUMNS\t\t\t= SARAKKEET\t\t\t##\tPalauttaa viittauksessa olevien sarakkeiden määrän.\r\nHLOOKUP\t\t\t= VHAKU\t\t\t\t##\tSuorittaa haun matriisin ylimmältä riviltä ja palauttaa määritetyn solun arvon.\r\nHYPERLINK\t\t= HYPERLINKKI\t\t\t##\tLuo pikakuvakkeen tai tekstin, joka avaa verkkopalvelimeen, intranetiin tai Internetiin tallennetun tiedoston.\r\nINDEX\t\t\t= INDEKSI\t\t\t##\tValitsee arvon viittauksesta tai matriisista indeksin mukaan.\r\nINDIRECT\t\t= EPÄSUORA\t\t\t##\tPalauttaa tekstiarvona ilmaistun viittauksen.\r\nLOOKUP\t\t\t= HAKU\t\t\t\t##\tEtsii arvoja vektorista tai matriisista.\r\nMATCH\t\t\t= VASTINE\t\t\t##\tEtsii arvoja viittauksesta tai matriisista.\r\nOFFSET\t\t\t= SIIRTYMÄ\t\t\t##\tPalauttaa annetun viittauksen siirtymän.\r\nROW\t\t\t= RIVI\t\t\t\t##\tPalauttaa viittauksen rivinumeron.\r\nROWS\t\t\t= RIVIT\t\t\t\t##\tPalauttaa viittauksessa olevien rivien määrän.\r\nRTD\t\t\t= RTD\t\t\t\t##\tNoutaa COM-automaatiota (automaatio: Tapa käsitellä sovelluksen objekteja toisesta sovelluksesta tai kehitystyökalusta. Automaatio, jota aiemmin kutsuttiin OLE-automaatioksi, on teollisuusstandardi ja COM-mallin (Component Object Model) ominaisuus.) tukevasta ohjelmasta reaaliaikaisia tietoja.\r\nTRANSPOSE\t\t= TRANSPONOI\t\t\t##\tPalauttaa matriisin käänteismatriisin.\r\nVLOOKUP\t\t\t= PHAKU\t\t\t\t##\tSuorittaa haun matriisin ensimmäisestä sarakkeesta ja palauttaa rivillä olevan solun arvon.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tMatemaattiset ja trigonometriset funktiot\r\n##\r\nABS\t\t\t= ITSEISARVO\t\t\t##\tPalauttaa luvun itseisarvon.\r\nACOS\t\t\t= ACOS\t\t\t\t##\tPalauttaa luvun arkuskosinin.\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tPalauttaa luvun käänteisen hyperbolisen kosinin.\r\nASIN\t\t\t= ASIN\t\t\t\t##\tPalauttaa luvun arkussinin.\r\nASINH\t\t\t= ASINH\t\t\t\t##\tPalauttaa luvun käänteisen hyperbolisen sinin.\r\nATAN\t\t\t= ATAN\t\t\t\t##\tPalauttaa luvun arkustangentin.\r\nATAN2\t\t\t= ATAN2\t\t\t\t##\tPalauttaa arkustangentin x- ja y-koordinaatin perusteella.\r\nATANH\t\t\t= ATANH\t\t\t\t##\tPalauttaa luvun käänteisen hyperbolisen tangentin.\r\nCEILING\t\t\t= PYÖRISTÄ.KERR.YLÖS\t\t##\tPyöristää luvun lähimpään kokonaislukuun tai tarkkuusargumentin lähimpään kerrannaiseen.\r\nCOMBIN\t\t\t= KOMBINAATIO\t\t\t##\tPalauttaa mahdollisten kombinaatioiden määrän annetulle objektien määrälle.\r\nCOS\t\t\t= COS\t\t\t\t##\tPalauttaa luvun kosinin.\r\nCOSH\t\t\t= COSH\t\t\t\t##\tPalauttaa luvun hyperbolisen kosinin.\r\nDEGREES\t\t\t= ASTEET\t\t\t##\tMuuntaa radiaanit asteiksi.\r\nEVEN\t\t\t= PARILLINEN\t\t\t##\tPyöristää luvun ylöspäin lähimpään parilliseen kokonaislukuun.\r\nEXP\t\t\t= EKSPONENTTI\t\t\t##\tPalauttaa e:n korotettuna annetun luvun osoittamaan potenssiin.\r\nFACT\t\t\t= KERTOMA\t\t\t##\tPalauttaa luvun kertoman.\r\nFACTDOUBLE\t\t= KERTOMA.OSA\t\t\t##\tPalauttaa luvun osakertoman.\r\nFLOOR\t\t\t= PYÖRISTÄ.KERR.ALAS\t\t##\tPyöristää luvun alaspäin (nollaa kohti).\r\nGCD\t\t\t= SUURIN.YHT.TEKIJÄ\t\t##\tPalauttaa suurimman yhteisen tekijän.\r\nINT\t\t\t= KOKONAISLUKU\t\t\t##\tPyöristää luvun alaspäin lähimpään kokonaislukuun.\r\nLCM\t\t\t= PIENIN.YHT.JAETTAVA\t\t##\tPalauttaa pienimmän yhteisen tekijän.\r\nLN\t\t\t= LUONNLOG\t\t\t##\tPalauttaa luvun luonnollisen logaritmin.\r\nLOG\t\t\t= LOG\t\t\t\t##\tLaskee luvun logaritmin käyttämällä annettua kantalukua.\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tPalauttaa luvun kymmenkantaisen logaritmin.\r\nMDETERM\t\t\t= MDETERM\t\t\t##\tPalauttaa matriisin matriisideterminantin.\r\nMINVERSE\t\t= MKÄÄNTEINEN\t\t\t##\tPalauttaa matriisin käänteismatriisin.\r\nMMULT\t\t\t= MKERRO\t\t\t##\tPalauttaa kahden matriisin tulon.\r\nMOD\t\t\t= JAKOJ\t\t\t\t##\tPalauttaa jakolaskun jäännöksen.\r\nMROUND\t\t\t= PYÖRISTÄ.KERR\t\t\t##\tPalauttaa luvun pyöristettynä annetun luvun kerrannaiseen.\r\nMULTINOMIAL\t\t= MULTINOMI\t\t\t##\tPalauttaa lukujoukon multinomin.\r\nODD\t\t\t= PARITON\t\t\t##\tPyöristää luvun ylöspäin lähimpään parittomaan kokonaislukuun.\r\nPI\t\t\t= PII\t\t\t\t##\tPalauttaa piin arvon.\r\nPOWER\t\t\t= POTENSSI\t\t\t##\tPalauttaa luvun korotettuna haluttuun potenssiin.\r\nPRODUCT\t\t\t= TULO\t\t\t\t##\tKertoo annetut argumentit.\r\nQUOTIENT\t\t= OSAMÄÄRÄ\t\t\t##\tPalauttaa osamäärän kokonaislukuosan.\r\nRADIANS\t\t\t= RADIAANIT\t\t\t##\tMuuntaa asteet radiaaneiksi.\r\nRAND\t\t\t= SATUNNAISLUKU\t\t\t##\tPalauttaa satunnaisluvun väliltä 0–1.\r\nRANDBETWEEN\t\t= SATUNNAISLUKU.VÄLILTÄ\t\t##\tPalauttaa satunnaisluvun määritettyjen lukujen väliltä.\r\nROMAN\t\t\t= ROMAN\t\t\t\t##\tMuuntaa arabialaisen numeron tekstimuotoiseksi roomalaiseksi numeroksi.\r\nROUND\t\t\t= PYÖRISTÄ\t\t\t##\tPyöristää luvun annettuun määrään desimaaleja.\r\nROUNDDOWN\t\t= PYÖRISTÄ.DES.ALAS\t\t##\tPyöristää luvun alaspäin (nollaa kohti).\r\nROUNDUP\t\t\t= PYÖRISTÄ.DES.YLÖS\t\t##\tPyöristää luvun ylöspäin (poispäin nollasta).\r\nSERIESSUM\t\t= SARJA.SUMMA\t\t\t##\tPalauttaa kaavaan perustuvan potenssisarjan arvon.\r\nSIGN\t\t\t= ETUMERKKI\t\t\t##\tPalauttaa luvun etumerkin.\r\nSIN\t\t\t= SIN\t\t\t\t##\tPalauttaa annetun kulman sinin.\r\nSINH\t\t\t= SINH\t\t\t\t##\tPalauttaa luvun hyperbolisen sinin.\r\nSQRT\t\t\t= NELIÖJUURI\t\t\t##\tPalauttaa positiivisen neliöjuuren.\r\nSQRTPI\t\t\t= NELIÖJUURI.PII\t\t##\tPalauttaa tulon (luku * pii) neliöjuuren.\r\nSUBTOTAL\t\t= VÄLISUMMA\t\t\t##\tPalauttaa luettelon tai tietokannan välisumman.\r\nSUM\t\t\t= SUMMA\t\t\t\t##\tLaskee yhteen annetut argumentit.\r\nSUMIF\t\t\t= SUMMA.JOS\t\t\t##\tLaskee ehdot täyttävien solujen summan.\r\nSUMIFS\t\t\t= SUMMA.JOS.JOUKKO\t\t##\tLaskee yhteen solualueen useita ehtoja vastaavat solut.\r\nSUMPRODUCT\t\t= TULOJEN.SUMMA\t\t\t##\tPalauttaa matriisin toisiaan vastaavien osien tulojen summan.\r\nSUMSQ\t\t\t= NELIÖSUMMA\t\t\t##\tPalauttaa argumenttien neliöiden summan.\r\nSUMX2MY2\t\t= NELIÖSUMMIEN.EROTUS\t\t##\tPalauttaa kahden matriisin toisiaan vastaavien arvojen laskettujen neliösummien erotuksen.\r\nSUMX2PY2\t\t= NELIÖSUMMIEN.SUMMA\t\t##\tPalauttaa kahden matriisin toisiaan vastaavien arvojen neliösummien summan.\r\nSUMXMY2\t\t\t= EROTUSTEN.NELIÖSUMMA\t\t##\tPalauttaa kahden matriisin toisiaan vastaavien arvojen erotusten neliösumman.\r\nTAN\t\t\t= TAN\t\t\t\t##\tPalauttaa luvun tangentin.\r\nTANH\t\t\t= TANH\t\t\t\t##\tPalauttaa luvun hyperbolisen tangentin.\r\nTRUNC\t\t\t= KATKAISE\t\t\t##\tKatkaisee luvun kokonaisluvuksi.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tTilastolliset funktiot\r\n##\r\nAVEDEV\t\t\t= KESKIPOIKKEAMA\t\t##\tPalauttaa hajontojen itseisarvojen keskiarvon.\r\nAVERAGE\t\t\t= KESKIARVO\t\t\t##\tPalauttaa argumenttien keskiarvon.\r\nAVERAGEA\t\t= KESKIARVOA\t\t\t##\tPalauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, keskiarvon.\r\nAVERAGEIF\t\t= KESKIARVO.JOS\t\t\t##\tPalauttaa alueen niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka täyttävät annetut ehdot.\r\nAVERAGEIFS\t\t= KESKIARVO.JOS.JOUKKO\t\t##\tPalauttaa niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka vastaavat useita ehtoja.\r\nBETADIST\t\t= BEETAJAKAUMA\t\t\t##\tPalauttaa kumulatiivisen beetajakaumafunktion arvon.\r\nBETAINV\t\t\t= BEETAJAKAUMA.KÄÄNT\t\t##\tPalauttaa määritetyn beetajakauman käänteisen kumulatiivisen jakaumafunktion arvon.\r\nBINOMDIST\t\t= BINOMIJAKAUMA\t\t\t##\tPalauttaa yksittäisen termin binomijakaumatodennäköisyyden.\r\nCHIDIST\t\t\t= CHIJAKAUMA\t\t\t##\tPalauttaa yksisuuntaisen chi-neliön jakauman todennäköisyyden.\r\nCHIINV\t\t\t= CHIJAKAUMA.KÄÄNT\t\t##\tPalauttaa yksisuuntaisen chi-neliön jakauman todennäköisyyden käänteisarvon.\r\nCHITEST\t\t\t= CHITESTI\t\t\t##\tPalauttaa riippumattomuustestin tuloksen.\r\nCONFIDENCE\t\t= LUOTTAMUSVÄLI\t\t\t##\tPalauttaa luottamusvälin populaation keskiarvolle.\r\nCORREL\t\t\t= KORRELAATIO\t\t\t##\tPalauttaa kahden arvojoukon korrelaatiokertoimen.\r\nCOUNT\t\t\t= LASKE\t\t\t\t##\tLaskee argumenttiluettelossa olevien lukujen määrän.\r\nCOUNTA\t\t\t= LASKE.A\t\t\t##\tLaskee argumenttiluettelossa olevien arvojen määrän.\r\nCOUNTBLANK\t\t= LASKE.TYHJÄT\t\t\t##\tLaskee alueella olevien tyhjien solujen määrän.\r\nCOUNTIF\t\t\t= LASKE.JOS\t\t\t##\tLaskee alueella olevien sellaisten solujen määrän, joiden sisältö vastaa annettuja ehtoja.\r\nCOUNTIFS\t\t= LASKE.JOS.JOUKKO\t\t##\tLaskee alueella olevien sellaisten solujen määrän, joiden sisältö vastaa useita ehtoja.\r\nCOVAR\t\t\t= KOVARIANSSI\t\t\t##\tPalauttaa kovarianssin, joka on keskiarvo havaintoaineiston kunkin pisteparin poikkeamien tuloista.\r\nCRITBINOM\t\t= BINOMIJAKAUMA.KRIT\t\t##\tPalauttaa pienimmän arvon, jossa binomijakauman kertymäfunktion arvo on pienempi tai yhtä suuri kuin vertailuarvo.\r\nDEVSQ\t\t\t= OIKAISTU.NELIÖSUMMA\t\t##\tPalauttaa keskipoikkeamien neliösumman.\r\nEXPONDIST\t\t= EKSPONENTIAALIJAKAUMA\t\t##\tPalauttaa eksponentiaalijakauman.\r\nFDIST\t\t\t= FJAKAUMA\t\t\t##\tPalauttaa F-todennäköisyysjakauman.\r\nFINV\t\t\t= FJAKAUMA.KÄÄNT\t\t##\tPalauttaa F-todennäköisyysjakauman käänteisfunktion.\r\nFISHER\t\t\t= FISHER\t\t\t##\tPalauttaa Fisher-muunnoksen.\r\nFISHERINV\t\t= FISHER.KÄÄNT\t\t\t##\tPalauttaa käänteisen Fisher-muunnoksen.\r\nFORECAST\t\t= ENNUSTE\t\t\t##\tPalauttaa lineaarisen trendin arvon.\r\nFREQUENCY\t\t= TAAJUUS\t\t\t##\tPalauttaa frekvenssijakautuman pystysuuntaisena matriisina.\r\nFTEST\t\t\t= FTESTI\t\t\t##\tPalauttaa F-testin tuloksen.\r\nGAMMADIST\t\t= GAMMAJAKAUMA\t\t\t##\tPalauttaa gammajakauman.\r\nGAMMAINV\t\t= GAMMAJAKAUMA.KÄÄNT\t\t##\tPalauttaa käänteisen gammajakauman kertymäfunktion.\r\nGAMMALN\t\t\t= GAMMALN\t\t\t##\tPalauttaa gammafunktion luonnollisen logaritmin G(x).\r\nGEOMEAN\t\t\t= KESKIARVO.GEOM\t\t##\tPalauttaa geometrisen keskiarvon.\r\nGROWTH\t\t\t= KASVU\t\t\t\t##\tPalauttaa eksponentiaalisen trendin arvon.\r\nHARMEAN\t\t\t= KESKIARVO.HARM\t\t##\tPalauttaa harmonisen keskiarvon.\r\nHYPGEOMDIST\t\t= HYPERGEOM.JAKAUMA\t\t##\tPalauttaa hypergeometrisen jakauman.\r\nINTERCEPT\t\t= LEIKKAUSPISTE\t\t\t##\tPalauttaa lineaarisen regressiosuoran leikkauspisteen.\r\nKURT\t\t\t= KURT\t\t\t\t##\tPalauttaa tietoalueen vinous-arvon eli huipukkuuden.\r\nLARGE\t\t\t= SUURI\t\t\t\t##\tPalauttaa tietojoukon k:nneksi suurimman arvon.\r\nLINEST\t\t\t= LINREGR\t\t\t##\tPalauttaa lineaarisen trendin parametrit.\r\nLOGEST\t\t\t= LOGREGR\t\t\t##\tPalauttaa eksponentiaalisen trendin parametrit.\r\nLOGINV\t\t\t= LOGNORM.JAKAUMA.KÄÄNT\t\t##\tPalauttaa lognormeeratun jakauman käänteisfunktion.\r\nLOGNORMDIST\t\t= LOGNORM.JAKAUMA\t\t##\tPalauttaa lognormaalisen jakauman kertymäfunktion.\r\nMAX\t\t\t= MAKS\t\t\t\t##\tPalauttaa suurimman arvon argumenttiluettelosta.\r\nMAXA\t\t\t= MAKSA\t\t\t\t##\tPalauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, suurimman arvon.\r\nMEDIAN\t\t\t= MEDIAANI\t\t\t##\tPalauttaa annettujen lukujen mediaanin.\r\nMIN\t\t\t= MIN\t\t\t\t##\tPalauttaa pienimmän arvon argumenttiluettelosta.\r\nMINA\t\t\t= MINA\t\t\t\t##\tPalauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, pienimmän arvon.\r\nMODE\t\t\t= MOODI\t\t\t\t##\tPalauttaa tietojoukossa useimmin esiintyvän arvon.\r\nNEGBINOMDIST\t\t= BINOMIJAKAUMA.NEG\t\t##\tPalauttaa negatiivisen binomijakauman.\r\nNORMDIST\t\t= NORM.JAKAUMA\t\t\t##\tPalauttaa normaalijakauman kertymäfunktion.\r\nNORMINV\t\t\t= NORM.JAKAUMA.KÄÄNT\t\t##\tPalauttaa käänteisen normaalijakauman kertymäfunktion.\r\nNORMSDIST\t\t= NORM.JAKAUMA.NORMIT\t\t##\tPalauttaa normitetun normaalijakauman kertymäfunktion.\r\nNORMSINV\t\t= NORM.JAKAUMA.NORMIT.KÄÄNT\t##\tPalauttaa normitetun normaalijakauman kertymäfunktion käänteisarvon.\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tPalauttaa Pearsonin tulomomenttikorrelaatiokertoimen.\r\nPERCENTILE\t\t= PROSENTTIPISTE\t\t##\tPalauttaa alueen arvojen k:nnen prosenttipisteen.\r\nPERCENTRANK\t\t= PROSENTTIJÄRJESTYS\t\t##\tPalauttaa tietojoukon arvon prosentuaalisen järjestysluvun.\r\nPERMUT\t\t\t= PERMUTAATIO\t\t\t##\tPalauttaa mahdollisten permutaatioiden määrän annetulle objektien määrälle.\r\nPOISSON\t\t\t= POISSON\t\t\t##\tPalauttaa Poissonin todennäköisyysjakauman.\r\nPROB\t\t\t= TODENNÄKÖISYYS\t\t##\tPalauttaa todennäköisyyden sille, että arvot ovat tietyltä väliltä.\r\nQUARTILE\t\t= NELJÄNNES\t\t\t##\tPalauttaa tietoalueen neljänneksen.\r\nRANK\t\t\t= ARVON.MUKAAN\t\t\t##\tPalauttaa luvun paikan lukuarvoluettelossa.\r\nRSQ\t\t\t= PEARSON.NELIÖ\t\t\t##\tPalauttaa Pearsonin tulomomenttikorrelaatiokertoimen neliön.\r\nSKEW\t\t\t= JAKAUMAN.VINOUS\t\t##\tPalauttaa jakauman vinouden.\r\nSLOPE\t\t\t= KULMAKERROIN\t\t\t##\tPalauttaa lineaarisen regressiosuoran kulmakertoimen.\r\nSMALL\t\t\t= PIENI\t\t\t\t##\tPalauttaa tietojoukon k:nneksi pienimmän arvon.\r\nSTANDARDIZE\t\t= NORMITA\t\t\t##\tPalauttaa normitetun arvon.\r\nSTDEV\t\t\t= KESKIHAJONTA\t\t\t##\tLaskee populaation keskihajonnan otoksen perusteella.\r\nSTDEVA\t\t\t= KESKIHAJONTAA\t\t\t##\tLaskee populaation keskihajonnan otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot.\r\nSTDEVP\t\t\t= KESKIHAJONTAP\t\t\t##\tLaskee normaalijakautuman koko populaation perusteella.\r\nSTDEVPA\t\t\t= KESKIHAJONTAPA\t\t##\tLaskee populaation keskihajonnan koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot.\r\nSTEYX\t\t\t= KESKIVIRHE\t\t\t##\tPalauttaa regression kutakin x-arvoa vastaavan ennustetun y-arvon keskivirheen.\r\nTDIST\t\t\t= TJAKAUMA\t\t\t##\tPalauttaa t-jakautuman.\r\nTINV\t\t\t= TJAKAUMA.KÄÄNT\t\t##\tPalauttaa käänteisen t-jakauman.\r\nTREND\t\t\t= SUUNTAUS\t\t\t##\tPalauttaa lineaarisen trendin arvoja.\r\nTRIMMEAN\t\t= KESKIARVO.TASATTU\t\t##\tPalauttaa tietojoukon tasatun keskiarvon.\r\nTTEST\t\t\t= TTESTI\t\t\t##\tPalauttaa t-testiin liittyvän todennäköisyyden.\r\nVAR\t\t\t= VAR\t\t\t\t##\tArvioi populaation varianssia otoksen perusteella.\r\nVARA\t\t\t= VARA\t\t\t\t##\tLaskee populaation varianssin otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot.\r\nVARP\t\t\t= VARP\t\t\t\t##\tLaskee varianssin koko populaation perusteella.\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tLaskee populaation varianssin koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot.\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tPalauttaa Weibullin jakauman.\r\nZTEST\t\t\t= ZTESTI\t\t\t##\tPalauttaa z-testin yksisuuntaisen todennäköisyysarvon.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tTekstifunktiot\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tMuuntaa merkkijonossa olevat englanninkieliset DBCS- tai katakana-merkit SBCS-merkeiksi.\r\nBAHTTEXT\t\t= BAHTTEKSTI\t\t\t##\tMuuntaa luvun tekstiksi ß (baht) -valuuttamuotoa käyttämällä.\r\nCHAR\t\t\t= MERKKI\t\t\t##\tPalauttaa koodin lukua vastaavan merkin.\r\nCLEAN\t\t\t= SIIVOA\t\t\t##\tPoistaa tekstistä kaikki tulostumattomat merkit.\r\nCODE\t\t\t= KOODI\t\t\t\t##\tPalauttaa tekstimerkkijonon ensimmäisen merkin numerokoodin.\r\nCONCATENATE\t\t= KETJUTA\t\t\t##\tYhdistää useat merkkijonot yhdeksi merkkijonoksi.\r\nDOLLAR\t\t\t= VALUUTTA\t\t\t##\tMuuntaa luvun tekstiksi $ (dollari) -valuuttamuotoa käyttämällä.\r\nEXACT\t\t\t= VERTAA\t\t\t##\tTarkistaa, ovatko kaksi tekstiarvoa samanlaiset.\r\nFIND\t\t\t= ETSI\t\t\t\t##\tEtsii tekstiarvon toisen tekstin sisältä (tunnistaa isot ja pienet kirjaimet).\r\nFINDB\t\t\t= ETSIB\t\t\t\t##\tEtsii tekstiarvon toisen tekstin sisältä (tunnistaa isot ja pienet kirjaimet).\r\nFIXED\t\t\t= KIINTEÄ\t\t\t##\tMuotoilee luvun tekstiksi, jossa on kiinteä määrä desimaaleja.\r\nJIS\t\t\t= JIS\t\t\t\t##\tMuuntaa merkkijonossa olevat englanninkieliset SBCS- tai katakana-merkit DBCS-merkeiksi.\r\nLEFT\t\t\t= VASEN\t\t\t\t##\tPalauttaa tekstiarvon vasemmanpuoliset merkit.\r\nLEFTB\t\t\t= VASENB\t\t\t##\tPalauttaa tekstiarvon vasemmanpuoliset merkit.\r\nLEN\t\t\t= PITUUS\t\t\t##\tPalauttaa tekstimerkkijonon merkkien määrän.\r\nLENB\t\t\t= PITUUSB\t\t\t##\tPalauttaa tekstimerkkijonon merkkien määrän.\r\nLOWER\t\t\t= PIENET\t\t\t##\tMuuntaa tekstin pieniksi kirjaimiksi.\r\nMID\t\t\t= POIMI.TEKSTI\t\t\t##\tPalauttaa määritetyn määrän merkkejä merkkijonosta alkaen annetusta kohdasta.\r\nMIDB\t\t\t= POIMI.TEKSTIB\t\t\t##\tPalauttaa määritetyn määrän merkkejä merkkijonosta alkaen annetusta kohdasta.\r\nPHONETIC\t\t= FONEETTINEN\t\t\t##\tHakee foneettiset (furigana) merkit merkkijonosta.\r\nPROPER\t\t\t= ERISNIMI\t\t\t##\tMuuttaa merkkijonon kunkin sanan ensimmäisen kirjaimen isoksi.\r\nREPLACE\t\t\t= KORVAA\t\t\t##\tKorvaa tekstissä olevat merkit.\r\nREPLACEB\t\t= KORVAAB\t\t\t##\tKorvaa tekstissä olevat merkit.\r\nREPT\t\t\t= TOISTA\t\t\t##\tToistaa tekstin annetun määrän kertoja.\r\nRIGHT\t\t\t= OIKEA\t\t\t\t##\tPalauttaa tekstiarvon oikeanpuoliset merkit.\r\nRIGHTB\t\t\t= OIKEAB\t\t\t##\tPalauttaa tekstiarvon oikeanpuoliset merkit.\r\nSEARCH\t\t\t= KÄY.LÄPI\t\t\t##\tEtsii tekstiarvon toisen tekstin sisältä (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi).\r\nSEARCHB\t\t\t= KÄY.LÄPIB\t\t\t##\tEtsii tekstiarvon toisen tekstin sisältä (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi).\r\nSUBSTITUTE\t\t= VAIHDA\t\t\t##\tKorvaa merkkijonossa olevan tekstin toisella.\r\nT\t\t\t= T\t\t\t\t##\tMuuntaa argumentit tekstiksi.\r\nTEXT\t\t\t= TEKSTI\t\t\t##\tMuotoilee luvun ja muuntaa sen tekstiksi.\r\nTRIM\t\t\t= POISTA.VÄLIT\t\t\t##\tPoistaa välilyönnit tekstistä.\r\nUPPER\t\t\t= ISOT\t\t\t\t##\tMuuntaa tekstin isoiksi kirjaimiksi.\r\nVALUE\t\t\t= ARVO\t\t\t\t##\tMuuntaa tekstiargumentin luvuksi.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/fr/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= €\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NUL!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #VALEUR!\r\nREF\t= #REF!\r\nNAME\t= #NOM?\r\nNUM\t= #NOMBRE!\r\nNA\t= #N/A\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/fr/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tFonctions de complément et d’automatisation\r\n##\r\nGETPIVOTDATA\t\t= LIREDONNEESTABCROISDYNAMIQUE\t##\tRenvoie les données stockées dans un rapport de tableau croisé dynamique.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tFonctions Cube\r\n##\r\nCUBEKPIMEMBER\t\t= MEMBREKPICUBE\t\t\t##\tRenvoie un nom, une propriété et une mesure d’indicateur de performance clé et affiche le nom et la propriété dans la cellule. Un indicateur de performance clé est une mesure quantifiable, telle que la marge bénéficiaire brute mensuelle ou la rotation trimestrielle du personnel, utilisée pour évaluer les performances d’une entreprise.\r\nCUBEMEMBER\t\t= MEMBRECUBE\t\t\t##\tRenvoie un membre ou un uplet dans une hiérarchie de cubes. Utilisez cette fonction pour valider l’existence du membre ou de l’uplet dans le cube.\r\nCUBEMEMBERPROPERTY\t= PROPRIETEMEMBRECUBE\t\t##\tRenvoie la valeur d’une propriété de membre du cube. Utilisez cette fonction pour valider l’existence d’un nom de membre dans le cube et pour renvoyer la propriété spécifiée pour ce membre.\r\nCUBERANKEDMEMBER\t= RANGMEMBRECUBE\t\t##\tRenvoie le nième membre ou le membre placé à un certain rang dans un ensemble. Utilisez cette fonction pour renvoyer un ou plusieurs éléments d’un ensemble, tels que les meilleurs vendeurs ou les 10 meilleurs étudiants.\r\nCUBESET\t\t\t= JEUCUBE\t\t\t##\tDéfinit un ensemble calculé de membres ou d’uplets en envoyant une expression définie au cube sur le serveur qui crée l’ensemble et le renvoie à Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= NBJEUCUBE\t\t\t##\tRenvoie le nombre d’éléments dans un jeu.\r\nCUBEVALUE\t\t= VALEURCUBE\t\t\t##\tRenvoie une valeur d’agrégation issue d’un cube.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tFonctions de base de données\r\n##\r\nDAVERAGE\t\t= BDMOYENNE\t\t\t##\tRenvoie la moyenne des entrées de base de données sélectionnées.\r\nDCOUNT\t\t\t= BCOMPTE\t\t\t##\tCompte le nombre de cellules d’une base de données qui contiennent des nombres.\r\nDCOUNTA\t\t\t= BDNBVAL\t\t\t##\tCompte les cellules non vides d’une base de données.\r\nDGET\t\t\t= BDLIRE\t\t\t##\tExtrait d’une base de données un enregistrement unique répondant aux critères spécifiés.\r\nDMAX\t\t\t= BDMAX\t\t\t\t##\tRenvoie la valeur maximale des entrées de base de données sélectionnées.\r\nDMIN\t\t\t= BDMIN\t\t\t\t##\tRenvoie la valeur minimale des entrées de base de données sélectionnées.\r\nDPRODUCT\t\t= BDPRODUIT\t\t\t##\tMultiplie les valeurs d’un champ particulier des enregistrements d’une base de données, qui répondent aux critères spécifiés.\r\nDSTDEV\t\t\t= BDECARTYPE\t\t\t##\tCalcule l’écart type pour un échantillon d’entrées de base de données sélectionnées.\r\nDSTDEVP\t\t\t= BDECARTYPEP\t\t\t##\tCalcule l’écart type pour l’ensemble d’une population d’entrées de base de données sélectionnées.\r\nDSUM\t\t\t= BDSOMME\t\t\t##\tAjoute les nombres dans la colonne de champ des enregistrements de la base de données, qui répondent aux critères.\r\nDVAR\t\t\t= BDVAR\t\t\t\t##\tCalcule la variance pour un échantillon d’entrées de base de données sélectionnées.\r\nDVARP\t\t\t= BDVARP\t\t\t##\tCalcule la variance pour l’ensemble d’une population d’entrées de base de données sélectionnées.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tFonctions de date et d’heure\r\n##\r\nDATE\t\t\t= DATE\t\t\t\t##\tRenvoie le numéro de série d’une date précise.\r\nDATEVALUE\t\t= DATEVAL\t\t\t##\tConvertit une date représentée sous forme de texte en numéro de série.\r\nDAY\t\t\t= JOUR\t\t\t\t##\tConvertit un numéro de série en jour du mois.\r\nDAYS360\t\t\t= JOURS360\t\t\t##\tCalcule le nombre de jours qui séparent deux dates sur la base d’une année de 360 jours.\r\nEDATE\t\t\t= MOIS.DECALER\t\t\t##\tRenvoie le numéro séquentiel de la date qui représente une date spécifiée (l’argument date_départ), corrigée en plus ou en moins du nombre de mois indiqué.\r\nEOMONTH\t\t\t= FIN.MOIS\t\t\t##\tRenvoie le numéro séquentiel de la date du dernier jour du mois précédant ou suivant la date_départ du nombre de mois indiqué.\r\nHOUR\t\t\t= HEURE\t\t\t\t##\tConvertit un numéro de série en heure.\r\nMINUTE\t\t\t= MINUTE\t\t\t##\tConvertit un numéro de série en minute.\r\nMONTH\t\t\t= MOIS\t\t\t\t##\tConvertit un numéro de série en mois.\r\nNETWORKDAYS\t\t= NB.JOURS.OUVRES\t\t##\tRenvoie le nombre de jours ouvrés entiers compris entre deux dates.\r\nNOW\t\t\t= MAINTENANT\t\t\t##\tRenvoie le numéro de série de la date et de l’heure du jour.\r\nSECOND\t\t\t= SECONDE\t\t\t##\tConvertit un numéro de série en seconde.\r\nTIME\t\t\t= TEMPS\t\t\t\t##\tRenvoie le numéro de série d’une heure précise.\r\nTIMEVALUE\t\t= TEMPSVAL\t\t\t##\tConvertit une date représentée sous forme de texte en numéro de série.\r\nTODAY\t\t\t= AUJOURDHUI\t\t\t##\tRenvoie le numéro de série de la date du jour.\r\nWEEKDAY\t\t\t= JOURSEM\t\t\t##\tConvertit un numéro de série en jour de la semaine.\r\nWEEKNUM\t\t\t= NO.SEMAINE\t\t\t##\tConvertit un numéro de série en un numéro représentant l’ordre de la semaine dans l’année.\r\nWORKDAY\t\t\t= SERIE.JOUR.OUVRE\t\t##\tRenvoie le numéro de série de la date avant ou après le nombre de jours ouvrés spécifiés.\r\nYEAR\t\t\t= ANNEE\t\t\t\t##\tConvertit un numéro de série en année.\r\nYEARFRAC\t\t= FRACTION.ANNEE\t\t##\tRenvoie la fraction de l’année représentant le nombre de jours entre la date de début et la date de fin.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tFonctions d’ingénierie\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tRenvoie la fonction Bessel modifiée In(x).\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tRenvoie la fonction Bessel Jn(x).\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tRenvoie la fonction Bessel modifiée Kn(x).\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tRenvoie la fonction Bessel Yn(x).\r\nBIN2DEC\t\t\t= BINDEC\t\t\t##\tConvertit un nombre binaire en nombre décimal.\r\nBIN2HEX\t\t\t= BINHEX\t\t\t##\tConvertit un nombre binaire en nombre hexadécimal.\r\nBIN2OCT\t\t\t= BINOCT\t\t\t##\tConvertit un nombre binaire en nombre octal.\r\nCOMPLEX\t\t\t= COMPLEXE\t\t\t##\tConvertit des coefficients réel et imaginaire en un nombre complexe.\r\nCONVERT\t\t\t= CONVERT\t\t\t##\tConvertit un nombre d’une unité de mesure à une autre.\r\nDEC2BIN\t\t\t= DECBIN\t\t\t##\tConvertit un nombre décimal en nombre binaire.\r\nDEC2HEX\t\t\t= DECHEX\t\t\t##\tConvertit un nombre décimal en nombre hexadécimal.\r\nDEC2OCT\t\t\t= DECOCT\t\t\t##\tConvertit un nombre décimal en nombre octal.\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tTeste l’égalité de deux nombres.\r\nERF\t\t\t= ERF\t\t\t\t##\tRenvoie la valeur de la fonction d’erreur.\r\nERFC\t\t\t= ERFC\t\t\t\t##\tRenvoie la valeur de la fonction d’erreur complémentaire.\r\nGESTEP\t\t\t= SUP.SEUIL\t\t\t##\tTeste si un nombre est supérieur à une valeur de seuil.\r\nHEX2BIN\t\t\t= HEXBIN\t\t\t##\tConvertit un nombre hexadécimal en nombre binaire.\r\nHEX2DEC\t\t\t= HEXDEC\t\t\t##\tConvertit un nombre hexadécimal en nombre décimal.\r\nHEX2OCT\t\t\t= HEXOCT\t\t\t##\tConvertit un nombre hexadécimal en nombre octal.\r\nIMABS\t\t\t= COMPLEXE.MODULE\t\t##\tRenvoie la valeur absolue (module) d’un nombre complexe.\r\nIMAGINARY\t\t= COMPLEXE.IMAGINAIRE\t\t##\tRenvoie le coefficient imaginaire d’un nombre complexe.\r\nIMARGUMENT\t\t= COMPLEXE.ARGUMENT\t\t##\tRenvoie l’argument thêta, un angle exprimé en radians.\r\nIMCONJUGATE\t\t= COMPLEXE.CONJUGUE\t\t##\tRenvoie le nombre complexe conjugué d’un nombre complexe.\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tRenvoie le cosinus d’un nombre complexe.\r\nIMDIV\t\t\t= COMPLEXE.DIV\t\t\t##\tRenvoie le quotient de deux nombres complexes.\r\nIMEXP\t\t\t= COMPLEXE.EXP\t\t\t##\tRenvoie la fonction exponentielle d’un nombre complexe.\r\nIMLN\t\t\t= COMPLEXE.LN\t\t\t##\tRenvoie le logarithme népérien d’un nombre complexe.\r\nIMLOG10\t\t\t= COMPLEXE.LOG10\t\t##\tCalcule le logarithme en base 10 d’un nombre complexe.\r\nIMLOG2\t\t\t= COMPLEXE.LOG2\t\t\t##\tCalcule le logarithme en base 2 d’un nombre complexe.\r\nIMPOWER\t\t\t= COMPLEXE.PUISSANCE\t\t##\tRenvoie un nombre complexe élevé à une puissance entière.\r\nIMPRODUCT\t\t= COMPLEXE.PRODUIT\t\t##\tRenvoie le produit de plusieurs nombres complexes.\r\nIMREAL\t\t\t= COMPLEXE.REEL\t\t\t##\tRenvoie le coefficient réel d’un nombre complexe.\r\nIMSIN\t\t\t= COMPLEXE.SIN\t\t\t##\tRenvoie le sinus d’un nombre complexe.\r\nIMSQRT\t\t\t= COMPLEXE.RACINE\t\t##\tRenvoie la racine carrée d’un nombre complexe.\r\nIMSUB\t\t\t= COMPLEXE.DIFFERENCE\t\t##\tRenvoie la différence entre deux nombres complexes.\r\nIMSUM\t\t\t= COMPLEXE.SOMME\t\t##\tRenvoie la somme de plusieurs nombres complexes.\r\nOCT2BIN\t\t\t= OCTBIN\t\t\t##\tConvertit un nombre octal en nombre binaire.\r\nOCT2DEC\t\t\t= OCTDEC\t\t\t##\tConvertit un nombre octal en nombre décimal.\r\nOCT2HEX\t\t\t= OCTHEX\t\t\t##\tConvertit un nombre octal en nombre hexadécimal.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFonctions financières\r\n##\r\nACCRINT\t\t\t= INTERET.ACC\t\t\t##\tRenvoie l’intérêt couru non échu d’un titre dont l’intérêt est perçu périodiquement.\r\nACCRINTM\t\t= INTERET.ACC.MAT\t\t##\tRenvoie l’intérêt couru non échu d’un titre dont l’intérêt est perçu à l’échéance.\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tRenvoie l’amortissement correspondant à chaque période comptable en utilisant un coefficient d’amortissement.\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tRenvoie l’amortissement d’un bien à la fin d’une période fiscale donnée.\r\nCOUPDAYBS\t\t= NB.JOURS.COUPON.PREC\t\t##\tRenvoie le nombre de jours entre le début de la période de coupon et la date de liquidation.\r\nCOUPDAYS\t\t= NB.JOURS.COUPONS\t\t##\tRenvoie le nombre de jours pour la période du coupon contenant la date de liquidation.\r\nCOUPDAYSNC\t\t= NB.JOURS.COUPON.SUIV\t\t##\tRenvoie le nombre de jours entre la date de liquidation et la date du coupon suivant la date de liquidation.\r\nCOUPNCD\t\t\t= DATE.COUPON.SUIV\t\t##\tRenvoie la première date de coupon ultérieure à la date de règlement.\r\nCOUPNUM\t\t\t= NB.COUPONS\t\t\t##\tRenvoie le nombre de coupons dus entre la date de règlement et la date d’échéance.\r\nCOUPPCD\t\t\t= DATE.COUPON.PREC\t\t##\tRenvoie la date de coupon précédant la date de règlement.\r\nCUMIPMT\t\t\t= CUMUL.INTER\t\t\t##\tRenvoie l’intérêt cumulé payé sur un emprunt entre deux périodes.\r\nCUMPRINC\t\t= CUMUL.PRINCPER\t\t##\tRenvoie le montant cumulé des remboursements du capital d’un emprunt effectués entre deux périodes.\r\nDB\t\t\t= DB\t\t\t\t##\tRenvoie l’amortissement d’un bien pour une période spécifiée en utilisant la méthode de l’amortissement dégressif à taux fixe.\r\nDDB\t\t\t= DDB\t\t\t\t##\tRenvoie l’amortissement d’un bien pour toute période spécifiée, en utilisant la méthode de l’amortissement dégressif à taux double ou selon un coefficient à spécifier.\r\nDISC\t\t\t= TAUX.ESCOMPTE\t\t\t##\tCalcule le taux d’escompte d’une transaction.\r\nDOLLARDE\t\t= PRIX.DEC\t\t\t##\tConvertit un prix en euros, exprimé sous forme de fraction, en un prix en euros exprimé sous forme de nombre décimal.\r\nDOLLARFR\t\t= PRIX.FRAC\t\t\t##\tConvertit un prix en euros, exprimé sous forme de nombre décimal, en un prix en euros exprimé sous forme de fraction.\r\nDURATION\t\t= DUREE\t\t\t\t##\tRenvoie la durée, en années, d’un titre dont l’intérêt est perçu périodiquement.\r\nEFFECT\t\t\t= TAUX.EFFECTIF\t\t\t##\tRenvoie le taux d’intérêt annuel effectif.\r\nFV\t\t\t= VC\t\t\t\t##\tRenvoie la valeur future d’un investissement.\r\nFVSCHEDULE\t\t= VC.PAIEMENTS\t\t\t##\tCalcule la valeur future d’un investissement en appliquant une série de taux d’intérêt composites.\r\nINTRATE\t\t\t= TAUX.INTERET\t\t\t##\tAffiche le taux d’intérêt d’un titre totalement investi.\r\nIPMT\t\t\t= INTPER\t\t\t##\tCalcule le montant des intérêts d’un investissement pour une période donnée.\r\nIRR\t\t\t= TRI\t\t\t\t##\tCalcule le taux de rentabilité interne d’un investissement pour une succession de trésoreries.\r\nISPMT\t\t\t= ISPMT\t\t\t\t##\tCalcule le montant des intérêts d’un investissement pour une période donnée.\r\nMDURATION\t\t= DUREE.MODIFIEE\t\t##\tRenvoie la durée de Macauley modifiée pour un titre ayant une valeur nominale hypothétique de 100_euros.\r\nMIRR\t\t\t= TRIM\t\t\t\t##\tCalcule le taux de rentabilité interne lorsque les paiements positifs et négatifs sont financés à des taux différents.\r\nNOMINAL\t\t\t= TAUX.NOMINAL\t\t\t##\tCalcule le taux d’intérêt nominal annuel.\r\nNPER\t\t\t= NPM\t\t\t\t##\tRenvoie le nombre de versements nécessaires pour rembourser un emprunt.\r\nNPV\t\t\t= VAN\t\t\t\t##\tCalcule la valeur actuelle nette d’un investissement basé sur une série de décaissements et un taux d’escompte.\r\nODDFPRICE\t\t= PRIX.PCOUPON.IRREG\t\t##\tRenvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la première période de coupon est irrégulière.\r\nODDFYIELD\t\t= REND.PCOUPON.IRREG\t\t##\tRenvoie le taux de rendement d’un titre dont la première période de coupon est irrégulière.\r\nODDLPRICE\t\t= PRIX.DCOUPON.IRREG\t\t##\tRenvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la première période de coupon est irrégulière.\r\nODDLYIELD\t\t= REND.DCOUPON.IRREG\t\t##\tRenvoie le taux de rendement d’un titre dont la dernière période de coupon est irrégulière.\r\nPMT\t\t\t= VPM\t\t\t\t##\tCalcule le paiement périodique d’un investissement donné.\r\nPPMT\t\t\t= PRINCPER\t\t\t##\tCalcule, pour une période donnée, la part de remboursement du principal d’un investissement.\r\nPRICE\t\t\t= PRIX.TITRE\t\t\t##\tRenvoie le prix d’un titre rapportant des intérêts périodiques, pour une valeur nominale de 100 euros.\r\nPRICEDISC\t\t= VALEUR.ENCAISSEMENT\t\t##\tRenvoie la valeur d’encaissement d’un escompte commercial, pour une valeur nominale de 100 euros.\r\nPRICEMAT\t\t= PRIX.TITRE.ECHEANCE\t\t##\tRenvoie le prix d’un titre dont la valeur nominale est 100 euros et qui rapporte des intérêts à l’échéance.\r\nPV\t\t\t= PV\t\t\t\t##\tCalcule la valeur actuelle d’un investissement.\r\nRATE\t\t\t= TAUX\t\t\t\t##\tCalcule le taux d’intérêt par période pour une annuité.\r\nRECEIVED\t\t= VALEUR.NOMINALE\t\t##\tRenvoie la valeur nominale à échéance d’un effet de commerce.\r\nSLN\t\t\t= AMORLIN\t\t\t##\tCalcule l’amortissement linéaire d’un bien pour une période donnée.\r\nSYD\t\t\t= SYD\t\t\t\t##\tCalcule l’amortissement d’un bien pour une période donnée sur la base de la méthode américaine Sum-of-Years Digits (amortissement dégressif à taux décroissant appliqué à une valeur constante).\r\nTBILLEQ\t\t\t= TAUX.ESCOMPTE.R\t\t##\tRenvoie le taux d’escompte rationnel d’un bon du Trésor.\r\nTBILLPRICE\t\t= PRIX.BON.TRESOR\t\t##\tRenvoie le prix d’un bon du Trésor d’une valeur nominale de 100 euros.\r\nTBILLYIELD\t\t= RENDEMENT.BON.TRESOR\t\t##\tCalcule le taux de rendement d’un bon du Trésor.\r\nVDB\t\t\t= VDB\t\t\t\t##\tRenvoie l’amortissement d’un bien pour une période spécifiée ou partielle en utilisant une méthode de l’amortissement dégressif à taux fixe.\r\nXIRR\t\t\t= TRI.PAIEMENTS\t\t\t##\tCalcule le taux de rentabilité interne d’un ensemble de paiements non périodiques.\r\nXNPV\t\t\t= VAN.PAIEMENTS\t\t\t##\tRenvoie la valeur actuelle nette d’un ensemble de paiements non périodiques.\r\nYIELD\t\t\t= RENDEMENT.TITRE\t\t##\tCalcule le rendement d’un titre rapportant des intérêts périodiquement.\r\nYIELDDISC\t\t= RENDEMENT.SIMPLE\t\t##\tCalcule le taux de rendement d’un emprunt à intérêt simple (par exemple, un bon du Trésor).\r\nYIELDMAT\t\t= RENDEMENT.TITRE.ECHEANCE\t##\tRenvoie le rendement annuel d’un titre qui rapporte des intérêts à l’échéance.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tFonctions d’information\r\n##\r\nCELL\t\t\t= CELLULE\t\t\t##\tRenvoie des informations sur la mise en forme, l’emplacement et le contenu d’une cellule.\r\nERROR.TYPE\t\t= TYPE.ERREUR\t\t\t##\tRenvoie un nombre correspondant à un type d’erreur.\r\nINFO\t\t\t= INFORMATIONS\t\t\t##\tRenvoie des informations sur l’environnement d’exploitation actuel.\r\nISBLANK\t\t\t= ESTVIDE\t\t\t##\tRenvoie VRAI si l’argument valeur est vide.\r\nISERR\t\t\t= ESTERR\t\t\t##\tRenvoie VRAI si l’argument valeur fait référence à une valeur d’erreur, sauf #N/A.\r\nISERROR\t\t\t= ESTERREUR\t\t\t##\tRenvoie VRAI si l’argument valeur fait référence à une valeur d’erreur.\r\nISEVEN\t\t\t= EST.PAIR\t\t\t##\tRenvoie VRAI si le chiffre est pair.\r\nISLOGICAL\t\t= ESTLOGIQUE\t\t\t##\tRenvoie VRAI si l’argument valeur fait référence à une valeur logique.\r\nISNA\t\t\t= ESTNA\t\t\t\t##\tRenvoie VRAI si l’argument valeur fait référence à la valeur d’erreur #N/A.\r\nISNONTEXT\t\t= ESTNONTEXTE\t\t\t##\tRenvoie VRAI si l’argument valeur ne se présente pas sous forme de texte.\r\nISNUMBER\t\t= ESTNUM\t\t\t##\tRenvoie VRAI si l’argument valeur représente un nombre.\r\nISODD\t\t\t= EST.IMPAIR\t\t\t##\tRenvoie VRAI si le chiffre est impair.\r\nISREF\t\t\t= ESTREF\t\t\t##\tRenvoie VRAI si l’argument valeur est une référence.\r\nISTEXT\t\t\t= ESTTEXTE\t\t\t##\tRenvoie VRAI si l’argument valeur se présente sous forme de texte.\r\nN\t\t\t= N\t\t\t\t##\tRenvoie une valeur convertie en nombre.\r\nNA\t\t\t= NA\t\t\t\t##\tRenvoie la valeur d’erreur #N/A.\r\nTYPE\t\t\t= TYPE\t\t\t\t##\tRenvoie un nombre indiquant le type de données d’une valeur.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tFonctions logiques\r\n##\r\nAND\t\t\t= ET\t\t\t\t##\tRenvoie VRAI si tous ses arguments sont VRAI.\r\nFALSE\t\t\t= FAUX\t\t\t\t##\tRenvoie la valeur logique FAUX.\r\nIF\t\t\t= SI\t\t\t\t##\tSpécifie un test logique à effectuer.\r\nIFERROR\t\t\t= SIERREUR\t\t\t##\tRenvoie une valeur que vous spécifiez si une formule génère une erreur ; sinon, elle renvoie le résultat de la formule.\r\nNOT\t\t\t= NON\t\t\t\t##\tInverse la logique de cet argument.\r\nOR\t\t\t= OU\t\t\t\t##\tRenvoie VRAI si un des arguments est VRAI.\r\nTRUE\t\t\t= VRAI\t\t\t\t##\tRenvoie la valeur logique VRAI.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tFonctions de recherche et de référence\r\n##\r\nADDRESS\t\t\t= ADRESSE\t\t\t##\tRenvoie une référence sous forme de texte à une seule cellule d’une feuille de calcul.\r\nAREAS\t\t\t= ZONES\t\t\t\t##\tRenvoie le nombre de zones dans une référence.\r\nCHOOSE\t\t\t= CHOISIR\t\t\t##\tChoisit une valeur dans une liste.\r\nCOLUMN\t\t\t= COLONNE\t\t\t##\tRenvoie le numéro de colonne d’une référence.\r\nCOLUMNS\t\t\t= COLONNES\t\t\t##\tRenvoie le nombre de colonnes dans une référence.\r\nHLOOKUP\t\t\t= RECHERCHEH\t\t\t##\tEffectue une recherche dans la première ligne d’une matrice et renvoie la valeur de la cellule indiquée.\r\nHYPERLINK\t\t= LIEN_HYPERTEXTE\t\t##\tCrée un raccourci ou un renvoi qui ouvre un document stocké sur un serveur réseau, sur un réseau Intranet ou sur Internet.\r\nINDEX\t\t\t= INDEX\t\t\t\t##\tUtilise un index pour choisir une valeur provenant d’une référence ou d’une matrice.\r\nINDIRECT\t\t= INDIRECT\t\t\t##\tRenvoie une référence indiquée par une valeur de texte.\r\nLOOKUP\t\t\t= RECHERCHE\t\t\t##\tRecherche des valeurs dans un vecteur ou une matrice.\r\nMATCH\t\t\t= EQUIV\t\t\t\t##\tRecherche des valeurs dans une référence ou une matrice.\r\nOFFSET\t\t\t= DECALER\t\t\t##\tRenvoie une référence décalée par rapport à une référence donnée.\r\nROW\t\t\t= LIGNE\t\t\t\t##\tRenvoie le numéro de ligne d’une référence.\r\nROWS\t\t\t= LIGNES\t\t\t##\tRenvoie le nombre de lignes dans une référence.\r\nRTD\t\t\t= RTD\t\t\t\t##\tExtrait les données en temps réel à partir d’un programme prenant en charge l’automation COM (Automation : utilisation des objets d'une application à partir d'une autre application ou d'un autre outil de développement. Autrefois appelée OLE Automation, Automation est une norme industrielle et une fonctionnalité du modèle d'objet COM (Component Object Model).).\r\nTRANSPOSE\t\t= TRANSPOSE\t\t\t##\tRenvoie la transposition d’une matrice.\r\nVLOOKUP\t\t\t= RECHERCHEV\t\t\t##\tEffectue une recherche dans la première colonne d’une matrice et se déplace sur la ligne pour renvoyer la valeur d’une cellule.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tFonctions mathématiques et trigonométriques\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tRenvoie la valeur absolue d’un nombre.\r\nACOS\t\t\t= ACOS\t\t\t\t##\tRenvoie l’arccosinus d’un nombre.\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tRenvoie le cosinus hyperbolique inverse d’un nombre.\r\nASIN\t\t\t= ASIN\t\t\t\t##\tRenvoie l’arcsinus d’un nombre.\r\nASINH\t\t\t= ASINH\t\t\t\t##\tRenvoie le sinus hyperbolique inverse d’un nombre.\r\nATAN\t\t\t= ATAN\t\t\t\t##\tRenvoie l’arctangente d’un nombre.\r\nATAN2\t\t\t= ATAN2\t\t\t\t##\tRenvoie l’arctangente des coordonnées x et y.\r\nATANH\t\t\t= ATANH\t\t\t\t##\tRenvoie la tangente hyperbolique inverse d’un nombre.\r\nCEILING\t\t\t= PLAFOND\t\t\t##\tArrondit un nombre au nombre entier le plus proche ou au multiple le plus proche de l’argument précision en s’éloignant de zéro.\r\nCOMBIN\t\t\t= COMBIN\t\t\t##\tRenvoie le nombre de combinaisons que l’on peut former avec un nombre donné d’objets.\r\nCOS\t\t\t= COS\t\t\t\t##\tRenvoie le cosinus d’un nombre.\r\nCOSH\t\t\t= COSH\t\t\t\t##\tRenvoie le cosinus hyperbolique d’un nombre.\r\nDEGREES\t\t\t= DEGRES\t\t\t##\tConvertit des radians en degrés.\r\nEVEN\t\t\t= PAIR\t\t\t\t##\tArrondit un nombre au nombre entier pair le plus proche en s’éloignant de zéro.\r\nEXP\t\t\t= EXP\t\t\t\t##\tRenvoie e élevé à la puissance d’un nombre donné.\r\nFACT\t\t\t= FACT\t\t\t\t##\tRenvoie la factorielle d’un nombre.\r\nFACTDOUBLE\t\t= FACTDOUBLE\t\t\t##\tRenvoie la factorielle double d’un nombre.\r\nFLOOR\t\t\t= PLANCHER\t\t\t##\tArrondit un nombre en tendant vers 0 (zéro).\r\nGCD\t\t\t= PGCD\t\t\t\t##\tRenvoie le plus grand commun diviseur.\r\nINT\t\t\t= ENT\t\t\t\t##\tArrondit un nombre à l’entier immédiatement inférieur.\r\nLCM\t\t\t= PPCM\t\t\t\t##\tRenvoie le plus petit commun multiple.\r\nLN\t\t\t= LN\t\t\t\t##\tRenvoie le logarithme népérien d’un nombre.\r\nLOG\t\t\t= LOG\t\t\t\t##\tRenvoie le logarithme d’un nombre dans la base spécifiée.\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tCalcule le logarithme en base 10 d’un nombre.\r\nMDETERM\t\t\t= DETERMAT\t\t\t##\tRenvoie le déterminant d’une matrice.\r\nMINVERSE\t\t= INVERSEMAT\t\t\t##\tRenvoie la matrice inverse d’une matrice.\r\nMMULT\t\t\t= PRODUITMAT\t\t\t##\tRenvoie le produit de deux matrices.\r\nMOD\t\t\t= MOD\t\t\t\t##\tRenvoie le reste d’une division.\r\nMROUND\t\t\t= ARRONDI.AU.MULTIPLE\t\t##\tDonne l’arrondi d’un nombre au multiple spécifié.\r\nMULTINOMIAL\t\t= MULTINOMIALE\t\t\t##\tCalcule la multinomiale d’un ensemble de nombres.\r\nODD\t\t\t= IMPAIR\t\t\t##\tRenvoie le nombre, arrondi à la valeur du nombre entier impair le plus proche en s’éloignant de zéro.\r\nPI\t\t\t= PI\t\t\t\t##\tRenvoie la valeur de pi.\r\nPOWER\t\t\t= PUISSANCE\t\t\t##\tRenvoie la valeur du nombre élevé à une puissance.\r\nPRODUCT\t\t\t= PRODUIT\t\t\t##\tMultiplie ses arguments.\r\nQUOTIENT\t\t= QUOTIENT\t\t\t##\tRenvoie la partie entière du résultat d’une division.\r\nRADIANS\t\t\t= RADIANS\t\t\t##\tConvertit des degrés en radians.\r\nRAND\t\t\t= ALEA\t\t\t\t##\tRenvoie un nombre aléatoire compris entre 0 et 1.\r\nRANDBETWEEN\t\t= ALEA.ENTRE.BORNES\t\t##\tRenvoie un nombre aléatoire entre les nombres que vous spécifiez.\r\nROMAN\t\t\t= ROMAIN\t\t\t##\tConvertit des chiffres arabes en chiffres romains, sous forme de texte.\r\nROUND\t\t\t= ARRONDI\t\t\t##\tArrondit un nombre au nombre de chiffres indiqué.\r\nROUNDDOWN\t\t= ARRONDI.INF\t\t\t##\tArrondit un nombre en tendant vers 0 (zéro).\r\nROUNDUP\t\t\t= ARRONDI.SUP\t\t\t##\tArrondit un nombre à l’entier supérieur, en s’éloignant de zéro.\r\nSERIESSUM\t\t= SOMME.SERIES\t\t\t##\tRenvoie la somme d’une série géométrique en s’appuyant sur la formule suivante :\r\nSIGN\t\t\t= SIGNE\t\t\t\t##\tRenvoie le signe d’un nombre.\r\nSIN\t\t\t= SIN\t\t\t\t##\tRenvoie le sinus d’un angle donné.\r\nSINH\t\t\t= SINH\t\t\t\t##\tRenvoie le sinus hyperbolique d’un nombre.\r\nSQRT\t\t\t= RACINE\t\t\t##\tRenvoie la racine carrée d’un nombre.\r\nSQRTPI\t\t\t= RACINE.PI\t\t\t##\tRenvoie la racine carrée de (nombre * pi).\r\nSUBTOTAL\t\t= SOUS.TOTAL\t\t\t##\tRenvoie un sous-total dans une liste ou une base de données.\r\nSUM\t\t\t= SOMME\t\t\t\t##\tCalcule la somme de ses arguments.\r\nSUMIF\t\t\t= SOMME.SI\t\t\t##\tAdditionne les cellules spécifiées si elles répondent à un critère donné.\r\nSUMIFS\t\t\t= SOMME.SI.ENS\t\t\t##\tAjoute les cellules d’une plage qui répondent à plusieurs critères.\r\nSUMPRODUCT\t\t= SOMMEPROD\t\t\t##\tMultiplie les valeurs correspondantes des matrices spécifiées et calcule la somme de ces produits.\r\nSUMSQ\t\t\t= SOMME.CARRES\t\t\t##\tRenvoie la somme des carrés des arguments.\r\nSUMX2MY2\t\t= SOMME.X2MY2\t\t\t##\tRenvoie la somme de la différence des carrés des valeurs correspondantes de deux matrices.\r\nSUMX2PY2\t\t= SOMME.X2PY2\t\t\t##\tRenvoie la somme de la somme des carrés des valeurs correspondantes de deux matrices.\r\nSUMXMY2\t\t\t= SOMME.XMY2\t\t\t##\tRenvoie la somme des carrés des différences entre les valeurs correspondantes de deux matrices.\r\nTAN\t\t\t= TAN\t\t\t\t##\tRenvoie la tangente d’un nombre.\r\nTANH\t\t\t= TANH\t\t\t\t##\tRenvoie la tangente hyperbolique d’un nombre.\r\nTRUNC\t\t\t= TRONQUE\t\t\t##\tRenvoie la partie entière d’un nombre.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tFonctions statistiques\r\n##\r\nAVEDEV\t\t\t= ECART.MOYEN\t\t\t##\tRenvoie la moyenne des écarts absolus observés dans la moyenne des points de données.\r\nAVERAGE\t\t\t= MOYENNE\t\t\t##\tRenvoie la moyenne de ses arguments.\r\nAVERAGEA\t\t= AVERAGEA\t\t\t##\tRenvoie la moyenne de ses arguments, nombres, texte et valeurs logiques inclus.\r\nAVERAGEIF\t\t= MOYENNE.SI\t\t\t##\tRenvoie la moyenne (arithmétique) de toutes les cellules d’une plage qui répondent à des critères donnés.\r\nAVERAGEIFS\t\t= MOYENNE.SI.ENS\t\t##\tRenvoie la moyenne (arithmétique) de toutes les cellules qui répondent à plusieurs critères.\r\nBETADIST\t\t= LOI.BETA\t\t\t##\tRenvoie la fonction de distribution cumulée.\r\nBETAINV\t\t\t= BETA.INVERSE\t\t\t##\tRenvoie l’inverse de la fonction de distribution cumulée pour une distribution bêta spécifiée.\r\nBINOMDIST\t\t= LOI.BINOMIALE\t\t\t##\tRenvoie la probabilité d’une variable aléatoire discrète suivant la loi binomiale.\r\nCHIDIST\t\t\t= LOI.KHIDEUX\t\t\t##\tRenvoie la probabilité unilatérale de la distribution khi-deux.\r\nCHIINV\t\t\t= KHIDEUX.INVERSE\t\t##\tRenvoie l’inverse de la probabilité unilatérale de la distribution khi-deux.\r\nCHITEST\t\t\t= TEST.KHIDEUX\t\t\t##\tRenvoie le test d’indépendance.\r\nCONFIDENCE\t\t= INTERVALLE.CONFIANCE\t\t##\tRenvoie l’intervalle de confiance pour une moyenne de population.\r\nCORREL\t\t\t= COEFFICIENT.CORRELATION\t##\tRenvoie le coefficient de corrélation entre deux séries de données.\r\nCOUNT\t\t\t= NB\t\t\t\t##\tDétermine les nombres compris dans la liste des arguments.\r\nCOUNTA\t\t\t= NBVAL\t\t\t\t##\tDétermine le nombre de valeurs comprises dans la liste des arguments.\r\nCOUNTBLANK\t\t= NB.VIDE\t\t\t##\tCompte le nombre de cellules vides dans une plage.\r\nCOUNTIF\t\t\t= NB.SI\t\t\t\t##\tCompte le nombre de cellules qui répondent à un critère donné dans une plage.\r\nCOUNTIFS\t\t= NB.SI.ENS\t\t\t##\tCompte le nombre de cellules à l’intérieur d’une plage qui répondent à plusieurs critères.\r\nCOVAR\t\t\t= COVARIANCE\t\t\t##\tRenvoie la covariance, moyenne des produits des écarts pour chaque série d’observations.\r\nCRITBINOM\t\t= CRITERE.LOI.BINOMIALE\t\t##\tRenvoie la plus petite valeur pour laquelle la distribution binomiale cumulée est inférieure ou égale à une valeur de critère.\r\nDEVSQ\t\t\t= SOMME.CARRES.ECARTS\t\t##\tRenvoie la somme des carrés des écarts.\r\nEXPONDIST\t\t= LOI.EXPONENTIELLE\t\t##\tRenvoie la distribution exponentielle.\r\nFDIST\t\t\t= LOI.F\t\t\t\t##\tRenvoie la distribution de probabilité F.\r\nFINV\t\t\t= INVERSE.LOI.F\t\t\t##\tRenvoie l’inverse de la distribution de probabilité F.\r\nFISHER\t\t\t= FISHER\t\t\t##\tRenvoie la transformation de Fisher.\r\nFISHERINV\t\t= FISHER.INVERSE\t\t##\tRenvoie l’inverse de la transformation de Fisher.\r\nFORECAST\t\t= PREVISION\t\t\t##\tCalcule une valeur par rapport à une tendance linéaire.\r\nFREQUENCY\t\t= FREQUENCE\t\t\t##\tCalcule la fréquence d’apparition des valeurs dans une plage de valeurs, puis renvoie des nombres sous forme de matrice verticale.\r\nFTEST\t\t\t= TEST.F\t\t\t##\tRenvoie le résultat d’un test F.\r\nGAMMADIST\t\t= LOI.GAMMA\t\t\t##\tRenvoie la probabilité d’une variable aléatoire suivant une loi Gamma.\r\nGAMMAINV\t\t= LOI.GAMMA.INVERSE\t\t##\tRenvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi Gamma.\r\nGAMMALN\t\t\t= LNGAMMA\t\t\t##\tRenvoie le logarithme népérien de la fonction Gamma, G(x)\r\nGEOMEAN\t\t\t= MOYENNE.GEOMETRIQUE\t\t##\tRenvoie la moyenne géométrique.\r\nGROWTH\t\t\t= CROISSANCE\t\t\t##\tCalcule des valeurs par rapport à une tendance exponentielle.\r\nHARMEAN\t\t\t= MOYENNE.HARMONIQUE\t\t##\tRenvoie la moyenne harmonique.\r\nHYPGEOMDIST\t\t= LOI.HYPERGEOMETRIQUE\t\t##\tRenvoie la probabilité d’une variable aléatoire discrète suivant une loi hypergéométrique.\r\nINTERCEPT\t\t= ORDONNEE.ORIGINE\t\t##\tRenvoie l’ordonnée à l’origine d’une droite de régression linéaire.\r\nKURT\t\t\t= KURTOSIS\t\t\t##\tRenvoie le kurtosis d’une série de données.\r\nLARGE\t\t\t= GRANDE.VALEUR\t\t\t##\tRenvoie la k-ième plus grande valeur d’une série de données.\r\nLINEST\t\t\t= DROITEREG\t\t\t##\tRenvoie les paramètres d’une tendance linéaire.\r\nLOGEST\t\t\t= LOGREG\t\t\t##\tRenvoie les paramètres d’une tendance exponentielle.\r\nLOGINV\t\t\t= LOI.LOGNORMALE.INVERSE\t##\tRenvoie l’inverse de la probabilité pour une variable aléatoire suivant la loi lognormale.\r\nLOGNORMDIST\t\t= LOI.LOGNORMALE\t\t##\tRenvoie la probabilité d’une variable aléatoire continue suivant une loi lognormale.\r\nMAX\t\t\t= MAX\t\t\t\t##\tRenvoie la valeur maximale contenue dans une liste d’arguments.\r\nMAXA\t\t\t= MAXA\t\t\t\t##\tRenvoie la valeur maximale d’une liste d’arguments, nombres, texte et valeurs logiques inclus.\r\nMEDIAN\t\t\t= MEDIANE\t\t\t##\tRenvoie la valeur médiane des nombres donnés.\r\nMIN\t\t\t= MIN\t\t\t\t##\tRenvoie la valeur minimale contenue dans une liste d’arguments.\r\nMINA\t\t\t= MINA\t\t\t\t##\tRenvoie la plus petite valeur d’une liste d’arguments, nombres, texte et valeurs logiques inclus.\r\nMODE\t\t\t= MODE\t\t\t\t##\tRenvoie la valeur la plus courante d’une série de données.\r\nNEGBINOMDIST\t\t= LOI.BINOMIALE.NEG\t\t##\tRenvoie la probabilité d’une variable aléatoire discrète suivant une loi binomiale négative.\r\nNORMDIST\t\t= LOI.NORMALE\t\t\t##\tRenvoie la probabilité d’une variable aléatoire continue suivant une loi normale.\r\nNORMINV\t\t\t= LOI.NORMALE.INVERSE\t\t##\tRenvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi normale standard.\r\nNORMSDIST\t\t= LOI.NORMALE.STANDARD\t\t##\tRenvoie la probabilité d’une variable aléatoire continue suivant une loi normale standard.\r\nNORMSINV\t\t= LOI.NORMALE.STANDARD.INVERSE\t##\tRenvoie l’inverse de la distribution cumulée normale standard.\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tRenvoie le coefficient de corrélation d’échantillonnage de Pearson.\r\nPERCENTILE\t\t= CENTILE\t\t\t##\tRenvoie le k-ième centile des valeurs d’une plage.\r\nPERCENTRANK\t\t= RANG.POURCENTAGE\t\t##\tRenvoie le rang en pourcentage d’une valeur d’une série de données.\r\nPERMUT\t\t\t= PERMUTATION\t\t\t##\tRenvoie le nombre de permutations pour un nombre donné d’objets.\r\nPOISSON\t\t\t= LOI.POISSON\t\t\t##\tRenvoie la probabilité d’une variable aléatoire suivant une loi de Poisson.\r\nPROB\t\t\t= PROBABILITE\t\t\t##\tRenvoie la probabilité que des valeurs d’une plage soient comprises entre deux limites.\r\nQUARTILE\t\t= QUARTILE\t\t\t##\tRenvoie le quartile d’une série de données.\r\nRANK\t\t\t= RANG\t\t\t\t##\tRenvoie le rang d’un nombre contenu dans une liste.\r\nRSQ\t\t\t= COEFFICIENT.DETERMINATION\t##\tRenvoie la valeur du coefficient de détermination R^2 d’une régression linéaire.\r\nSKEW\t\t\t= COEFFICIENT.ASYMETRIE\t\t##\tRenvoie l’asymétrie d’une distribution.\r\nSLOPE\t\t\t= PENTE\t\t\t\t##\tRenvoie la pente d’une droite de régression linéaire.\r\nSMALL\t\t\t= PETITE.VALEUR\t\t\t##\tRenvoie la k-ième plus petite valeur d’une série de données.\r\nSTANDARDIZE\t\t= CENTREE.REDUITE\t\t##\tRenvoie une valeur centrée réduite.\r\nSTDEV\t\t\t= ECARTYPE\t\t\t##\tÉvalue l’écart type d’une population en se basant sur un échantillon de cette population.\r\nSTDEVA\t\t\t= STDEVA\t\t\t##\tÉvalue l’écart type d’une population en se basant sur un échantillon de cette population, nombres, texte et valeurs logiques inclus.\r\nSTDEVP\t\t\t= ECARTYPEP\t\t\t##\tCalcule l’écart type d’une population à partir de la population entière.\r\nSTDEVPA\t\t\t= STDEVPA\t\t\t##\tCalcule l’écart type d’une population à partir de l’ensemble de la population, nombres, texte et valeurs logiques inclus.\r\nSTEYX\t\t\t= ERREUR.TYPE.XY\t\t##\tRenvoie l’erreur type de la valeur y prévue pour chaque x de la régression.\r\nTDIST\t\t\t= LOI.STUDENT\t\t\t##\tRenvoie la probabilité d’une variable aléatoire suivant une loi T de Student.\r\nTINV\t\t\t= LOI.STUDENT.INVERSE\t\t##\tRenvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi T de Student.\r\nTREND\t\t\t= TENDANCE\t\t\t##\tRenvoie des valeurs par rapport à une tendance linéaire.\r\nTRIMMEAN\t\t= MOYENNE.REDUITE\t\t##\tRenvoie la moyenne de l’intérieur d’une série de données.\r\nTTEST\t\t\t= TEST.STUDENT\t\t\t##\tRenvoie la probabilité associée à un test T de Student.\r\nVAR\t\t\t= VAR\t\t\t\t##\tCalcule la variance sur la base d’un échantillon.\r\nVARA\t\t\t= VARA\t\t\t\t##\tEstime la variance d’une population en se basant sur un échantillon de cette population, nombres, texte et valeurs logiques incluses.\r\nVARP\t\t\t= VAR.P\t\t\t\t##\tCalcule la variance sur la base de l’ensemble de la population.\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tCalcule la variance d’une population en se basant sur la population entière, nombres, texte et valeurs logiques inclus.\r\nWEIBULL\t\t\t= LOI.WEIBULL\t\t\t##\tRenvoie la probabilité d’une variable aléatoire suivant une loi de Weibull.\r\nZTEST\t\t\t= TEST.Z\t\t\t##\tRenvoie la valeur de probabilité unilatérale d’un test z.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tFonctions de texte\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tChange les caractères anglais ou katakana à pleine chasse (codés sur deux octets) à l’intérieur d’une chaîne de caractères en caractères à demi-chasse (codés sur un octet).\r\nBAHTTEXT\t\t= BAHTTEXT\t\t\t##\tConvertit un nombre en texte en utilisant le format monétaire ß (baht).\r\nCHAR\t\t\t= CAR\t\t\t\t##\tRenvoie le caractère spécifié par le code numérique.\r\nCLEAN\t\t\t= EPURAGE\t\t\t##\tSupprime tous les caractères de contrôle du texte.\r\nCODE\t\t\t= CODE\t\t\t\t##\tRenvoie le numéro de code du premier caractère du texte.\r\nCONCATENATE\t\t= CONCATENER\t\t\t##\tAssemble plusieurs éléments textuels de façon à n’en former qu’un seul.\r\nDOLLAR\t\t\t= EURO\t\t\t\t##\tConvertit un nombre en texte en utilisant le format monétaire € (euro).\r\nEXACT\t\t\t= EXACT\t\t\t\t##\tVérifie si deux valeurs de texte sont identiques.\r\nFIND\t\t\t= TROUVE\t\t\t##\tTrouve un valeur textuelle dans une autre, en respectant la casse.\r\nFINDB\t\t\t= TROUVERB\t\t\t##\tTrouve un valeur textuelle dans une autre, en respectant la casse.\r\nFIXED\t\t\t= CTXT\t\t\t\t##\tConvertit un nombre au format texte avec un nombre de décimales spécifié.\r\nJIS\t\t\t= JIS\t\t\t\t##\tChange les caractères anglais ou katakana à demi-chasse (codés sur un octet) à l’intérieur d’une chaîne de caractères en caractères à à pleine chasse (codés sur deux octets).\r\nLEFT\t\t\t= GAUCHE\t\t\t##\tRenvoie des caractères situés à l’extrême gauche d’une chaîne de caractères.\r\nLEFTB\t\t\t= GAUCHEB\t\t\t##\tRenvoie des caractères situés à l’extrême gauche d’une chaîne de caractères.\r\nLEN\t\t\t= NBCAR\t\t\t\t##\tRenvoie le nombre de caractères contenus dans une chaîne de texte.\r\nLENB\t\t\t= LENB\t\t\t\t##\tRenvoie le nombre de caractères contenus dans une chaîne de texte.\r\nLOWER\t\t\t= MINUSCULE\t\t\t##\tConvertit le texte en minuscules.\r\nMID\t\t\t= STXT\t\t\t\t##\tRenvoie un nombre déterminé de caractères d’une chaîne de texte à partir de la position que vous indiquez.\r\nMIDB\t\t\t= STXTB\t\t\t\t##\tRenvoie un nombre déterminé de caractères d’une chaîne de texte à partir de la position que vous indiquez.\r\nPHONETIC\t\t= PHONETIQUE\t\t\t##\tExtrait les caractères phonétiques (furigana) d’une chaîne de texte.\r\nPROPER\t\t\t= NOMPROPRE\t\t\t##\tMet en majuscules la première lettre de chaque mot dans une chaîne textuelle.\r\nREPLACE\t\t\t= REMPLACER\t\t\t##\tRemplace des caractères dans un texte.\r\nREPLACEB\t\t= REMPLACERB\t\t\t##\tRemplace des caractères dans un texte.\r\nREPT\t\t\t= REPT\t\t\t\t##\tRépète un texte un certain nombre de fois.\r\nRIGHT\t\t\t= DROITE\t\t\t##\tRenvoie des caractères situés à l’extrême droite d’une chaîne de caractères.\r\nRIGHTB\t\t\t= DROITEB\t\t\t##\tRenvoie des caractères situés à l’extrême droite d’une chaîne de caractères.\r\nSEARCH\t\t\t= CHERCHE\t\t\t##\tTrouve un texte dans un autre texte (sans respecter la casse).\r\nSEARCHB\t\t\t= CHERCHERB\t\t\t##\tTrouve un texte dans un autre texte (sans respecter la casse).\r\nSUBSTITUTE\t\t= SUBSTITUE\t\t\t##\tRemplace l’ancien texte d’une chaîne de caractères par un nouveau.\r\nT\t\t\t= T\t\t\t\t##\tConvertit ses arguments en texte.\r\nTEXT\t\t\t= TEXTE\t\t\t\t##\tConvertit un nombre au format texte.\r\nTRIM\t\t\t= SUPPRESPACE\t\t\t##\tSupprime les espaces du texte.\r\nUPPER\t\t\t= MAJUSCULE\t\t\t##\tConvertit le texte en majuscules.\r\nVALUE\t\t\t= CNUM\t\t\t\t##\tConvertit un argument textuel en nombre\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/hu/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= Ft\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\n##\r\nNULL\t= #NULLA!\r\nDIV0\t= #ZÉRÓOSZTÓ!\r\nVALUE\t= #ÉRTÉK!\r\nREF\t= #HIV!\r\nNAME\t= #NÉV?\r\nNUM\t= #SZÁM!\r\nNA\t= #HIÁNYZIK\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/hu/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tBővítmények és automatizálási függvények\r\n##\r\nGETPIVOTDATA\t\t= KIMUTATÁSADATOT.VESZ\t\t##\tA kimutatásokban tárolt adatok visszaadására használható.\r\n\r\n\r\n##\r\n##\tCube functions Kockafüggvények   \r\n##\r\nCUBEKPIMEMBER\t\t= KOCKA.FŐTELJMUT\t\t##\tEgy fő teljesítménymutató (KPI) nevét, tulajdonságát és mértékegységét adja eredményül, a nevet és a tulajdonságot megjeleníti a cellában. A KPI-k számszerűsíthető mérési lehetőséget jelentenek – ilyen mutató például a havi bruttó nyereség vagy az egy alkalmazottra jutó negyedéves forgalom –, egy szervezet teljesítményének nyomonkövetésére használhatók.\r\nCUBEMEMBER\t\t= KOCKA.TAG\t\t\t##\tKockahierachia tagját vagy rekordját adja eredményül. Ellenőrizhető vele, hogy szerepel-e a kockában az adott tag vagy rekord.\r\nCUBEMEMBERPROPERTY\t= KOCKA.TAG.TUL\t\t\t##\tA kocka egyik tagtulajdonságának értékét adja eredményül. Használatával ellenőrizhető, hogy szerepel-e egy tagnév a kockában, eredménye pedig az erre a tagra vonatkozó, megadott tulajdonság.\r\nCUBERANKEDMEMBER\t= KOCKA.HALM.ELEM\t\t##\tEgy halmaz rangsor szerinti n-edik tagját adja eredményül. Használatával egy halmaz egy vagy több elemét kaphatja meg, például a legnagyobb teljesítményű üzletkötőt vagy a 10 legjobb tanulót.\r\nCUBESET\t\t\t= KOCKA.HALM\t\t\t##\tSzámított tagok vagy rekordok halmazát adja eredményül, ehhez egy beállított kifejezést elküld a kiszolgálón található kockának, majd ezt a halmazt adja vissza a Microsoft Office Excel alkalmazásnak.\r\nCUBESETCOUNT\t\t= KOCKA.HALM.DB\t\t\t##\tEgy halmaz elemszámát adja eredményül.\r\nCUBEVALUE\t\t= KOCKA.ÉRTÉK\t\t\t##\tKockából összesített értéket ad eredményül.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tAdatbázis-kezelő függvények\r\n##\r\nDAVERAGE\t\t= AB.ÁTLAG\t\t\t##\tA kijelölt adatbáziselemek átlagát számítja ki.\r\nDCOUNT\t\t\t= AB.DARAB\t\t\t##\tMegszámolja, hogy az adatbázisban hány cella tartalmaz számokat.\r\nDCOUNTA\t\t\t= AB.DARAB2\t\t\t##\tMegszámolja az adatbázisban lévő nem üres cellákat.\r\nDGET\t\t\t= AB.MEZŐ\t\t\t##\tEgy adatbázisból egyetlen olyan rekordot ad vissza, amely megfelel a megadott feltételeknek.\r\nDMAX\t\t\t= AB.MAX\t\t\t##\tA kiválasztott adatbáziselemek közül a legnagyobb értéket adja eredményül.\r\nDMIN\t\t\t= AB.MIN\t\t\t##\tA kijelölt adatbáziselemek közül a legkisebb értéket adja eredményül.\r\nDPRODUCT\t\t= AB.SZORZAT\t\t\t##\tAz adatbázis megadott feltételeknek eleget tevő rekordjaira összeszorozza a megadott mezőben található számértékeket, és eredményül ezt a szorzatot adja.\r\nDSTDEV\t\t\t= AB.SZÓRÁS\t\t\t##\tA kijelölt adatbáziselemek egy mintája alapján megbecsüli a szórást.\r\nDSTDEVP\t\t\t= AB.SZÓRÁS2\t\t\t##\tA kijelölt adatbáziselemek teljes sokasága alapján kiszámítja a szórást.\r\nDSUM\t\t\t= AB.SZUM\t\t\t##\tÖsszeadja a feltételnek megfelelő adatbázisrekordok mezőoszlopában a számokat.\r\nDVAR\t\t\t= AB.VAR\t\t\t##\tA kijelölt adatbáziselemek mintája alapján becslést ad a szórásnégyzetre.\r\nDVARP\t\t\t= AB.VAR2\t\t\t##\tA kijelölt adatbáziselemek teljes sokasága alapján kiszámítja a szórásnégyzetet.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tDátumfüggvények\r\n##\r\nDATE\t\t\t= DÁTUM\t\t\t\t##\tAdott dátum dátumértékét adja eredményül.\r\nDATEVALUE\t\t= DÁTUMÉRTÉK\t\t\t##\tSzövegként megadott dátumot dátumértékké alakít át.\r\nDAY\t\t\t= NAP\t\t\t\t##\tDátumértéket a hónap egy napjává (0-31) alakít.\r\nDAYS360\t\t\t= NAP360\t\t\t##\tKét dátum közé eső napok számát számítja ki a 360 napos év alapján.\r\nEDATE\t\t\t= EDATE\t\t\t\t##\tAdott dátumnál adott számú hónappal korábbi vagy későbbi dátum dátumértékét adja eredményül.\r\nEOMONTH\t\t\t= EOMONTH\t\t\t##\tAdott dátumnál adott számú hónappal korábbi vagy későbbi hónap utolsó napjának dátumértékét adja eredményül.\r\nHOUR\t\t\t= ÓRA\t\t\t\t##\tIdőértéket órákká alakít.\r\nMINUTE\t\t\t= PERC\t\t\t\t##\tIdőértéket percekké alakít.\r\nMONTH\t\t\t= HÓNAP\t\t\t\t##\tIdőértéket hónapokká alakít.\r\nNETWORKDAYS\t\t= NETWORKDAYS\t\t\t##\tKét dátum között a teljes munkanapok számát adja meg.\r\nNOW\t\t\t= MOST\t\t\t\t##\tA napi dátum dátumértékét és a pontos idő időértékét adja eredményül.\r\nSECOND\t\t\t= MPERC\t\t\t\t##\tIdőértéket másodpercekké alakít át.\r\nTIME\t\t\t= IDŐ\t\t\t\t##\tAdott időpont időértékét adja meg.\r\nTIMEVALUE\t\t= IDŐÉRTÉK\t\t\t##\tSzövegként megadott időpontot időértékké alakít át.\r\nTODAY\t\t\t= MA\t\t\t\t##\tA napi dátum dátumértékét adja eredményül.\r\nWEEKDAY\t\t\t= HÉT.NAPJA\t\t\t##\tDátumértéket a hét napjává alakítja át.\r\nWEEKNUM\t\t\t= WEEKNUM\t\t\t##\tVisszatérési értéke egy szám, amely azt mutatja meg, hogy a megadott dátum az év hányadik hetére esik.\r\nWORKDAY\t\t\t= WORKDAY\t\t\t##\tAdott dátumnál adott munkanappal korábbi vagy későbbi dátum dátumértékét adja eredményül.\r\nYEAR\t\t\t= ÉV\t\t\t\t##\tSorszámot évvé alakít át.\r\nYEARFRAC\t\t= YEARFRAC\t\t\t##\tAz adott dátumok közötti teljes napok számát törtévként adja meg.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tMérnöki függvények\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tAz In(x) módosított Bessel-függvény értékét adja eredményül.\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tA Jn(x) Bessel-függvény értékét adja eredményül.\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tA Kn(x) módosított Bessel-függvény értékét adja eredményül.\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tAz Yn(x) módosított Bessel-függvény értékét adja eredményül.\r\nBIN2DEC\t\t\t= BIN2DEC\t\t\t##\tBináris számot decimálissá alakít át.\r\nBIN2HEX\t\t\t= BIN2HEX\t\t\t##\tBináris számot hexadecimálissá alakít át.\r\nBIN2OCT\t\t\t= BIN2OCT\t\t\t##\tBináris számot oktálissá alakít át.\r\nCOMPLEX\t\t\t= COMPLEX\t\t\t##\tValós és képzetes részből komplex számot képez.\r\nCONVERT\t\t\t= CONVERT\t\t\t##\tMértékegységeket vált át.\r\nDEC2BIN\t\t\t= DEC2BIN\t\t\t##\tDecimális számot binárissá alakít át.\r\nDEC2HEX\t\t\t= DEC2HEX\t\t\t##\tDecimális számot hexadecimálissá alakít át.\r\nDEC2OCT\t\t\t= DEC2OCT\t\t\t##\tDecimális számot oktálissá alakít át.\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tAzt vizsgálja, hogy két érték egyenlő-e.\r\nERF\t\t\t= ERF\t\t\t\t##\tA hibafüggvény értékét adja eredményül.\r\nERFC\t\t\t= ERFC\t\t\t\t##\tA kiegészített hibafüggvény értékét adja eredményül.\r\nGESTEP\t\t\t= GESTEP\t\t\t##\tAzt vizsgálja, hogy egy szám nagyobb-e adott küszöbértéknél.\r\nHEX2BIN\t\t\t= HEX2BIN\t\t\t##\tHexadecimális számot binárissá alakít át.\r\nHEX2DEC\t\t\t= HEX2DEC\t\t\t##\tHexadecimális számot decimálissá alakít át.\r\nHEX2OCT\t\t\t= HEX2OCT\t\t\t##\tHexadecimális számot oktálissá alakít át.\r\nIMABS\t\t\t= IMABS\t\t\t\t##\tKomplex szám abszolút értékét (modulusát) adja eredményül.\r\nIMAGINARY\t\t= IMAGINARY\t\t\t##\tKomplex szám képzetes részét adja eredményül.\r\nIMARGUMENT\t\t= IMARGUMENT\t\t\t##\tA komplex szám radiánban kifejezett théta argumentumát adja eredményül.\r\nIMCONJUGATE\t\t= IMCONJUGATE\t\t\t##\tKomplex szám komplex konjugáltját adja eredményül.\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tKomplex szám koszinuszát adja eredményül.\r\nIMDIV\t\t\t= IMDIV\t\t\t\t##\tKét komplex szám hányadosát adja eredményül.\r\nIMEXP\t\t\t= IMEXP\t\t\t\t##\tAz e szám komplex kitevőjű hatványát adja eredményül.\r\nIMLN\t\t\t= IMLN\t\t\t\t##\tKomplex szám természetes logaritmusát adja eredményül.\r\nIMLOG10\t\t\t= IMLOG10\t\t\t##\tKomplex szám tízes alapú logaritmusát adja eredményül.\r\nIMLOG2\t\t\t= IMLOG2\t\t\t##\tKomplex szám kettes alapú logaritmusát adja eredményül.\r\nIMPOWER\t\t\t= IMPOWER\t\t\t##\tKomplex szám hatványát adja eredményül.\r\nIMPRODUCT\t\t= IMPRODUCT\t\t\t##\tKomplex számok szorzatát adja eredményül.\r\nIMREAL\t\t\t= IMREAL\t\t\t##\tKomplex szám valós részét adja eredményül.\r\nIMSIN\t\t\t= IMSIN\t\t\t\t##\tKomplex szám szinuszát adja eredményül.\r\nIMSQRT\t\t\t= IMSQRT\t\t\t##\tKomplex szám négyzetgyökét adja eredményül.\r\nIMSUB\t\t\t= IMSUB\t\t\t\t##\tKét komplex szám különbségét adja eredményül.\r\nIMSUM\t\t\t= IMSUM\t\t\t\t##\tKomplex számok összegét adja eredményül.\r\nOCT2BIN\t\t\t= OCT2BIN\t\t\t##\tOktális számot binárissá alakít át.\r\nOCT2DEC\t\t\t= OCT2DEC\t\t\t##\tOktális számot decimálissá alakít át.\r\nOCT2HEX\t\t\t= OCT2HEX\t\t\t##\tOktális számot hexadecimálissá alakít át.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tPénzügyi függvények\r\n##\r\nACCRINT\t\t\t= ACCRINT\t\t\t##\tPeriodikusan kamatozó értékpapír felszaporodott kamatát adja eredményül.\r\nACCRINTM\t\t= ACCRINTM\t\t\t##\tLejáratkor kamatozó értékpapír felszaporodott kamatát adja eredményül.\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tÁllóeszköz lineáris értékcsökkenését adja meg az egyes könyvelési időszakokra vonatkozóan.\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tAz egyes könyvelési időszakokban az értékcsökkenést adja meg.\r\nCOUPDAYBS\t\t= COUPDAYBS\t\t\t##\tA szelvényidőszak kezdetétől a kifizetés időpontjáig eltelt napokat adja vissza.\r\nCOUPDAYS\t\t= COUPDAYS\t\t\t##\tA kifizetés időpontját magában foglaló szelvényperiódus hosszát adja meg napokban.\r\nCOUPDAYSNC\t\t= COUPDAYSNC\t\t\t##\tA kifizetés időpontja és a legközelebbi szelvénydátum közötti napok számát adja meg.\r\nCOUPNCD\t\t\t= COUPNCD\t\t\t##\tA kifizetést követő legelső szelvénydátumot adja eredményül.\r\nCOUPNUM\t\t\t= COUPNUM\t\t\t##\tA kifizetés és a lejárat időpontja között kifizetendő szelvények számát adja eredményül.\r\nCOUPPCD\t\t\t= COUPPCD\t\t\t##\tA kifizetés előtti utolsó szelvénydátumot adja eredményül.\r\nCUMIPMT\t\t\t= CUMIPMT\t\t\t##\tKét fizetési időszak között kifizetett kamat halmozott értékét adja eredményül.\r\nCUMPRINC\t\t= CUMPRINC\t\t\t##\tKét fizetési időszak között kifizetett részletek halmozott (kamatot nem tartalmazó) értékét adja eredményül.\r\nDB\t\t\t= KCS2\t\t\t\t##\tEszköz adott időszak alatti értékcsökkenését számítja ki a lineáris leírási modell alkalmazásával.\r\nDDB\t\t\t= KCSA\t\t\t\t##\tEszköz értékcsökkenését számítja ki adott időszakra vonatkozóan a progresszív vagy egyéb megadott leírási modell alkalmazásával.\r\nDISC\t\t\t= DISC\t\t\t\t##\tÉrtékpapír leszámítolási kamatlábát adja eredményül.\r\nDOLLARDE\t\t= DOLLARDE\t\t\t##\tEgy közönséges törtként megadott számot tizedes törtté alakít át.\r\nDOLLARFR\t\t= DOLLARFR\t\t\t##\tTizedes törtként megadott számot közönséges törtté alakít át.\r\nDURATION\t\t= DURATION\t\t\t##\tPeriodikus kamatfizetésű értékpapír éves kamatérzékenységét adja eredményül.\r\nEFFECT\t\t\t= EFFECT\t\t\t##\tAz éves tényleges kamatláb értékét adja eredményül.\r\nFV\t\t\t= JBÉ\t\t\t\t##\tBefektetés jövőbeli értékét számítja ki.\r\nFVSCHEDULE\t\t= FVSCHEDULE\t\t\t##\tA kezdőtőke adott kamatlábak szerint megnövelt jövőbeli értékét adja eredményül.\r\nINTRATE\t\t\t= INTRATE\t\t\t##\tA lejáratig teljesen lekötött értékpapír kamatrátáját adja eredményül.\r\nIPMT\t\t\t= RRÉSZLET\t\t\t##\tHiteltörlesztésen belül a tőketörlesztés nagyságát számítja ki adott időszakra.\r\nIRR\t\t\t= BMR\t\t\t\t##\tA befektetés belső megtérülési rátáját számítja ki pénzáramláshoz.\r\nISPMT\t\t\t= LRÉSZLETKAMAT\t\t\t##\tA befektetés adott időszakára fizetett kamatot számítja ki.\r\nMDURATION\t\t= MDURATION\t\t\t##\tEgy 100 Ft névértékű értékpapír Macauley-féle módosított kamatérzékenységét adja eredményül.\r\nMIRR\t\t\t= MEGTÉRÜLÉS\t\t\t##\tA befektetés belső megtérülési rátáját számítja ki a költségek és a bevételek különböző kamatlába mellett.\r\nNOMINAL\t\t\t= NOMINAL\t\t\t##\tAz éves névleges kamatláb értékét adja eredményül.\r\nNPER\t\t\t= PER.SZÁM\t\t\t##\tA törlesztési időszakok számát adja meg.\r\nNPV\t\t\t= NMÉ\t\t\t\t##\tBefektetéshez kapcsolódó pénzáramlás nettó jelenértékét számítja ki ismert pénzáramlás és kamatláb mellett.\r\nODDFPRICE\t\t= ODDFPRICE\t\t\t##\tEgy 100 Ft névértékű, a futamidő elején töredék-időszakos értékpapír árát adja eredményül.\r\nODDFYIELD\t\t= ODDFYIELD\t\t\t##\tA futamidő elején töredék-időszakos értékpapír hozamát adja eredményül.\r\nODDLPRICE\t\t= ODDLPRICE\t\t\t##\tEgy 100 Ft névértékű, a futamidő végén töredék-időszakos értékpapír árát adja eredményül.\r\nODDLYIELD\t\t= ODDLYIELD\t\t\t##\tA futamidő végén töredék-időszakos értékpapír hozamát adja eredményül.\r\nPMT\t\t\t= RÉSZLET\t\t\t##\tA törlesztési időszakra vonatkozó törlesztési összeget számítja ki.\r\nPPMT\t\t\t= PRÉSZLET\t\t\t##\tHiteltörlesztésen belül a tőketörlesztés nagyságát számítja ki adott időszakra.\r\nPRICE\t\t\t= PRICE\t\t\t\t##\tEgy 100 Ft névértékű, periodikusan kamatozó értékpapír árát adja eredményül.\r\nPRICEDISC\t\t= PRICEDISC\t\t\t##\tEgy 100 Ft névértékű leszámítolt értékpapír árát adja eredményül.\r\nPRICEMAT\t\t= PRICEMAT\t\t\t##\tEgy 100 Ft névértékű, a lejáratkor kamatozó értékpapír árát adja eredményül.\r\nPV\t\t\t= MÉ\t\t\t\t##\tBefektetés jelenlegi értékét számítja ki.\r\nRATE\t\t\t= RÁTA\t\t\t\t##\tEgy törlesztési időszakban az egy időszakra eső kamatláb nagyságát számítja ki.\r\nRECEIVED\t\t= RECEIVED\t\t\t##\tA lejáratig teljesen lekötött értékpapír lejáratakor kapott összegét adja eredményül.\r\nSLN\t\t\t= LCSA\t\t\t\t##\tTárgyi eszköz egy időszakra eső amortizációját adja meg bruttó érték szerinti lineáris leírási kulcsot alkalmazva.\r\nSYD\t\t\t= SYD\t\t\t\t##\tTárgyi eszköz értékcsökkenését számítja ki adott időszakra az évek számjegyösszegével dolgozó módszer alapján.\r\nTBILLEQ\t\t\t= TBILLEQ\t\t\t##\tKincstárjegy kötvény-egyenértékű hozamát adja eredményül.\r\nTBILLPRICE\t\t= TBILLPRICE\t\t\t##\tEgy 100 Ft névértékű kincstárjegy árát adja eredményül.\r\nTBILLYIELD\t\t= TBILLYIELD\t\t\t##\tKincstárjegy hozamát adja eredményül.\r\nVDB\t\t\t= ÉCSRI\t\t\t\t##\tTárgyi eszköz amortizációját számítja ki megadott vagy részidőszakra a csökkenő egyenleg módszerének alkalmazásával.\r\nXIRR\t\t\t= XIRR\t\t\t\t##\tÜtemezett készpénzforgalom (cash flow) belső megtérülési kamatrátáját adja eredményül.\r\nXNPV\t\t\t= XNPV\t\t\t\t##\tÜtemezett készpénzforgalom (cash flow) nettó jelenlegi értékét adja eredményül.\r\nYIELD\t\t\t= YIELD\t\t\t\t##\tPeriodikusan kamatozó értékpapír hozamát adja eredményül.\r\nYIELDDISC\t\t= YIELDDISC\t\t\t##\tLeszámítolt értékpapír (például kincstárjegy) éves hozamát adja eredményül.\r\nYIELDMAT\t\t= YIELDMAT\t\t\t##\tLejáratkor kamatozó értékpapír éves hozamát adja eredményül.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tInformációs függvények\r\n##\r\nCELL\t\t\t= CELLA\t\t\t\t##\tEgy cella formátumára, elhelyezkedésére vagy tartalmára vonatkozó adatokat ad eredményül.\r\nERROR.TYPE\t\t= HIBA.TÍPUS\t\t\t##\tEgy hibatípushoz tartozó számot ad eredményül.\r\nINFO\t\t\t= INFÓ\t\t\t\t##\tA rendszer- és munkakörnyezet pillanatnyi állapotáról ad felvilágosítást.\r\nISBLANK\t\t\t= ÜRES\t\t\t\t##\tEredménye IGAZ, ha az érték üres.\r\nISERR\t\t\t= HIBA\t\t\t\t##\tEredménye IGAZ, ha az érték valamelyik hibaérték a #HIÁNYZIK kivételével.\r\nISERROR\t\t\t= HIBÁS\t\t\t\t##\tEredménye IGAZ, ha az érték valamelyik hibaérték.\r\nISEVEN\t\t\t= ISEVEN\t\t\t##\tEredménye IGAZ, ha argumentuma páros szám.\r\nISLOGICAL\t\t= LOGIKAI\t\t\t##\tEredménye IGAZ, ha az érték logikai érték.\r\nISNA\t\t\t= NINCS\t\t\t\t##\tEredménye IGAZ, ha az érték a #HIÁNYZIK hibaérték.\r\nISNONTEXT\t\t= NEM.SZÖVEG\t\t\t##\tEredménye IGAZ, ha az érték nem szöveg.\r\nISNUMBER\t\t= SZÁM\t\t\t\t##\tEredménye IGAZ, ha az érték szám.\r\nISODD\t\t\t= ISODD\t\t\t\t##\tEredménye IGAZ, ha argumentuma páratlan szám.\r\nISREF\t\t\t= HIVATKOZÁS\t\t\t##\tEredménye IGAZ, ha az érték hivatkozás.\r\nISTEXT\t\t\t= SZÖVEG.E\t\t\t##\tEredménye IGAZ, ha az érték szöveg.\r\nN\t\t\t= N\t\t\t\t##\tArgumentumának értékét számmá alakítja.\r\nNA\t\t\t= HIÁNYZIK\t\t\t##\tEredménye a #HIÁNYZIK hibaérték.\r\nTYPE\t\t\t= TÍPUS\t\t\t\t##\tÉrték adattípusának azonosítószámát adja eredményül.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tLogikai függvények\r\n##\r\nAND\t\t\t= ÉS\t\t\t\t##\tEredménye IGAZ, ha minden argumentuma IGAZ.\r\nFALSE\t\t\t= HAMIS\t\t\t\t##\tA HAMIS logikai értéket adja eredményül.\r\nIF\t\t\t= HA\t\t\t\t##\tLogikai vizsgálatot hajt végre.\r\nIFERROR\t\t\t= HAHIBA\t\t\t##\tA megadott értéket adja vissza, ha egy képlet hibához vezet; más esetben a képlet értékét adja eredményül.\r\nNOT\t\t\t= NEM\t\t\t\t##\tArgumentuma értékének ellentettjét adja eredményül.\r\nOR\t\t\t= VAGY\t\t\t\t##\tEredménye IGAZ, ha bármely argumentuma IGAZ.\r\nTRUE\t\t\t= IGAZ\t\t\t\t##\tAz IGAZ logikai értéket adja eredményül.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tKeresési és hivatkozási függvények\r\n##\r\nADDRESS\t\t\t= CÍM\t\t\t\t##\tA munkalap egy cellájára való hivatkozást adja szövegként eredményül.\r\nAREAS\t\t\t= TERÜLET\t\t\t##\tHivatkozásban a területek számát adja eredményül.\r\nCHOOSE\t\t\t= VÁLASZT\t\t\t##\tÉrtékek listájából választ ki egy elemet.\r\nCOLUMN\t\t\t= OSZLOP\t\t\t##\tEgy hivatkozás oszlopszámát adja eredményül.\r\nCOLUMNS\t\t\t= OSZLOPOK\t\t\t##\tA hivatkozásban található oszlopok számát adja eredményül.\r\nHLOOKUP\t\t\t= VKERES\t\t\t##\tA megadott tömb felső sorában adott értékű elemet keres, és a megtalált elem oszlopából adott sorban elhelyezkedő értékkel tér vissza.\r\nHYPERLINK\t\t= HIPERHIVATKOZÁS\t\t##\tHálózati kiszolgálón, intraneten vagy az interneten tárolt dokumentumot megnyitó parancsikont vagy hivatkozást hoz létre.\r\nINDEX\t\t\t= INDEX\t\t\t\t##\tTömb- vagy hivatkozás indexszel megadott értékét adja vissza.\r\nINDIRECT\t\t= INDIREKT\t\t\t##\tSzöveg megadott hivatkozást ad eredményül.\r\nLOOKUP\t\t\t= KERES\t\t\t\t##\tVektorban vagy tömbben keres meg értékeket.\r\nMATCH\t\t\t= HOL.VAN\t\t\t##\tHivatkozásban vagy tömbben értékeket keres.\r\nOFFSET\t\t\t= OFSZET\t\t\t##\tHivatkozás egy másik hivatkozástól számított távolságát adja meg.\r\nROW\t\t\t= SOR\t\t\t\t##\tEgy hivatkozás sorának számát adja meg.\r\nROWS\t\t\t= SOROK\t\t\t\t##\tEgy hivatkozás sorainak számát adja meg.\r\nRTD\t\t\t= RTD\t\t\t\t##\tValós idejű adatokat keres vissza a COM automatizmust (automatizálás: Egy alkalmazás objektumaival való munka másik alkalmazásból vagy fejlesztőeszközből. A korábban OLE automatizmusnak nevezett automatizálás iparági szabvány, a Component Object Model (COM) szolgáltatása.) támogató programból.\r\nTRANSPOSE\t\t= TRANSZPONÁLÁS\t\t\t##\tEgy tömb transzponáltját adja eredményül.\r\nVLOOKUP\t\t\t= FKERES\t\t\t##\tA megadott tömb bal szélső oszlopában megkeres egy értéket, majd annak sora és a megadott oszlop metszéspontjában levő értéked adja eredményül.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tMatematikai és trigonometrikus függvények\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tEgy szám abszolút értékét adja eredményül.\r\nACOS\t\t\t= ARCCOS\t\t\t##\tEgy szám arkusz koszinuszát számítja ki.\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tEgy szám inverz koszinusz hiperbolikuszát számítja ki.\r\nASIN\t\t\t= ARCSIN\t\t\t##\tEgy szám arkusz szinuszát számítja ki.\r\nASINH\t\t\t= ASINH\t\t\t\t##\tEgy szám inverz szinusz hiperbolikuszát számítja ki.\r\nATAN\t\t\t= ARCTAN\t\t\t##\tEgy szám arkusz tangensét számítja ki.\r\nATAN2\t\t\t= ARCTAN2\t\t\t##\tX és y koordináták alapján számítja ki az arkusz tangens értéket.\r\nATANH\t\t\t= ATANH\t\t\t\t##\tA szám inverz tangens hiperbolikuszát számítja ki.\r\nCEILING\t\t\t= PLAFON\t\t\t##\tEgy számot a legközelebbi egészre vagy a pontosságként megadott érték legközelebb eső többszörösére kerekít.\r\nCOMBIN\t\t\t= KOMBINÁCIÓK\t\t\t##\tAdott számú objektum összes lehetséges kombinációinak számát számítja ki.\r\nCOS\t\t\t= COS\t\t\t\t##\tEgy szám koszinuszát számítja ki.\r\nCOSH\t\t\t= COSH\t\t\t\t##\tEgy szám koszinusz hiperbolikuszát számítja ki.\r\nDEGREES\t\t\t= FOK\t\t\t\t##\tRadiánt fokká alakít át.\r\nEVEN\t\t\t= PÁROS\t\t\t\t##\tEgy számot a legközelebbi páros egész számra kerekít.\r\nEXP\t\t\t= KITEVŐ\t\t\t##\tAz e adott kitevőjű hatványát adja eredményül.\r\nFACT\t\t\t= FAKT\t\t\t\t##\tEgy szám faktoriálisát számítja ki.\r\nFACTDOUBLE\t\t= FACTDOUBLE\t\t\t##\tEgy szám dupla faktoriálisát adja eredményül.\r\nFLOOR\t\t\t= PADLÓ\t\t\t\t##\tEgy számot lefelé, a nulla felé kerekít.\r\nGCD\t\t\t= GCD\t\t\t\t##\tA legnagyobb közös osztót adja eredményül.\r\nINT\t\t\t= INT\t\t\t\t##\tEgy számot lefelé kerekít a legközelebbi egészre.\r\nLCM\t\t\t= LCM\t\t\t\t##\tA legkisebb közös többszöröst adja eredményül.\r\nLN\t\t\t= LN\t\t\t\t##\tEgy szám természetes logaritmusát számítja ki.\r\nLOG\t\t\t= LOG\t\t\t\t##\tEgy szám adott alapú logaritmusát számítja ki.\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tEgy szám 10-es alapú logaritmusát számítja ki.\r\nMDETERM\t\t\t= MDETERM\t\t\t##\tEgy tömb mátrix-determinánsát számítja ki.\r\nMINVERSE\t\t= INVERZ.MÁTRIX\t\t\t##\tEgy tömb mátrix inverzét adja eredményül.\r\nMMULT\t\t\t= MSZORZAT\t\t\t##\tKét tömb mátrix-szorzatát adja meg.\r\nMOD\t\t\t= MARADÉK\t\t\t##\tEgy szám osztási maradékát adja eredményül.\r\nMROUND\t\t\t= MROUND\t\t\t##\tA kívánt többszörösére kerekített értéket ad eredményül.\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t\t##\tSzámhalmaz multinomiálisát adja eredményül.\r\nODD\t\t\t= PÁRATLAN\t\t\t##\tEgy számot a legközelebbi páratlan számra kerekít.\r\nPI\t\t\t= PI\t\t\t\t##\tA pi matematikai állandót adja vissza.\r\nPOWER\t\t\t= HATVÁNY\t\t\t##\tEgy szám adott kitevőjű hatványát számítja ki.\r\nPRODUCT\t\t\t= SZORZAT\t\t\t##\tArgumentumai szorzatát számítja ki.\r\nQUOTIENT\t\t= QUOTIENT\t\t\t##\tEgy hányados egész részét adja eredményül.\r\nRADIANS\t\t\t= RADIÁN\t\t\t##\tFokot radiánná alakít át.\r\nRAND\t\t\t= VÉL\t\t\t\t##\tEgy 0 és 1 közötti véletlen számot ad eredményül.\r\nRANDBETWEEN\t\t= RANDBETWEEN\t\t\t##\tMegadott számok közé eső véletlen számot állít elő.\r\nROMAN\t\t\t= RÓMAI\t\t\t\t##\tEgy számot római számokkal kifejezve szövegként ad eredményül.\r\nROUND\t\t\t= KEREKÍTÉS\t\t\t##\tEgy számot adott számú számjegyre kerekít.\r\nROUNDDOWN\t\t= KEREKÍTÉS.LE\t\t\t##\tEgy számot lefelé, a nulla felé kerekít.\r\nROUNDUP\t\t\t= KEREKÍTÉS.FEL\t\t\t##\tEgy számot felfelé, a nullától távolabbra kerekít.\r\nSERIESSUM\t\t= SERIESSUM\t\t\t##\tHatványsor összegét adja eredményül.\r\nSIGN\t\t\t= ELŐJEL\t\t\t##\tEgy szám előjelét adja meg.\r\nSIN\t\t\t= SIN\t\t\t\t##\tEgy szög szinuszát számítja ki.\r\nSINH\t\t\t= SINH\t\t\t\t##\tEgy szám szinusz hiperbolikuszát számítja ki.\r\nSQRT\t\t\t= GYÖK\t\t\t\t##\tEgy szám pozitív négyzetgyökét számítja ki.\r\nSQRTPI\t\t\t= SQRTPI\t\t\t##\tA (szám*pi) négyzetgyökét adja eredményül.\r\nSUBTOTAL\t\t= RÉSZÖSSZEG\t\t\t##\tLista vagy adatbázis részösszegét adja eredményül.\r\nSUM\t\t\t= SZUM\t\t\t\t##\tÖsszeadja az argumentumlistájában lévő számokat.\r\nSUMIF\t\t\t= SZUMHA\t\t\t##\tA megadott feltételeknek eleget tevő cellákban található értékeket adja össze.\r\nSUMIFS\t\t\t= SZUMHATÖBB\t\t\t##\tTöbb megadott feltételnek eleget tévő tartománycellák összegét adja eredményül.\r\nSUMPRODUCT\t\t= SZORZATÖSSZEG\t\t\t##\tA megfelelő tömbelemek szorzatának összegét számítja ki.\r\nSUMSQ\t\t\t= NÉGYZETÖSSZEG\t\t\t##\tArgumentumai négyzetének összegét számítja ki.\r\nSUMX2MY2\t\t= SZUMX2BŐLY2\t\t\t##\tKét tömb megfelelő elemei négyzetének különbségét összegzi.\r\nSUMX2PY2\t\t= SZUMX2MEGY2\t\t\t##\tKét tömb megfelelő elemei négyzetének összegét összegzi.\r\nSUMXMY2\t\t\t= SZUMXBŐLY2\t\t\t##\tKét tömb megfelelő elemei különbségének négyzetösszegét számítja ki.\r\nTAN\t\t\t= TAN\t\t\t\t##\tEgy szám tangensét számítja ki.\r\nTANH\t\t\t= TANH\t\t\t\t##\tEgy szám tangens hiperbolikuszát számítja ki.\r\nTRUNC\t\t\t= CSONK\t\t\t\t##\tEgy számot egésszé csonkít.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tStatisztikai függvények\r\n##\r\nAVEDEV\t\t\t= ÁTL.ELTÉRÉS\t\t\t##\tAz adatpontoknak átlaguktól való átlagos abszolút eltérését számítja ki.\r\nAVERAGE\t\t\t= ÁTLAG\t\t\t\t##\tArgumentumai átlagát számítja ki.\r\nAVERAGEA\t\t= ÁTLAGA\t\t\t##\tArgumentumai átlagát számítja ki (beleértve a számokat, szöveget és logikai értékeket).\r\nAVERAGEIF\t\t= ÁTLAGHA\t\t\t##\tA megadott feltételnek eleget tévő tartomány celláinak átlagát (számtani közepét) adja eredményül.\r\nAVERAGEIFS\t\t= ÁTLAGHATÖBB\t\t\t##\tA megadott feltételeknek eleget tévő cellák átlagát (számtani közepét) adja eredményül.\r\nBETADIST\t\t= BÉTA.ELOSZLÁS\t\t\t##\tA béta-eloszlás függvényt számítja ki.\r\nBETAINV\t\t\t= INVERZ.BÉTA\t\t\t##\tAdott béta-eloszláshoz kiszámítja a béta eloszlásfüggvény inverzét.\r\nBINOMDIST\t\t= BINOM.ELOSZLÁS\t\t##\tA diszkrét binomiális eloszlás valószínűségértékét számítja ki.\r\nCHIDIST\t\t\t= KHI.ELOSZLÁS\t\t\t##\tA khi-négyzet-eloszlás egyszélű valószínűségértékét számítja ki.\r\nCHIINV\t\t\t= INVERZ.KHI\t\t\t##\tA khi-négyzet-eloszlás egyszélű valószínűségértékének inverzét számítja ki.\r\nCHITEST\t\t\t= KHI.PRÓBA\t\t\t##\tFüggetlenségvizsgálatot hajt végre.\r\nCONFIDENCE\t\t= MEGBÍZHATÓSÁG\t\t\t##\tEgy statisztikai sokaság várható értékének megbízhatósági intervallumát adja eredményül.\r\nCORREL\t\t\t= KORREL\t\t\t##\tKét adathalmaz korrelációs együtthatóját számítja ki.\r\nCOUNT\t\t\t= DARAB\t\t\t\t##\tMegszámolja, hogy argumentumlistájában hány szám található.\r\nCOUNTA\t\t\t= DARAB2\t\t\t##\tMegszámolja, hogy argumentumlistájában hány érték található.\r\nCOUNTBLANK\t\t= DARABÜRES\t\t\t##\tEgy tartományban összeszámolja az üres cellákat.\r\nCOUNTIF\t\t\t= DARABTELI\t\t\t##\tEgy tartományban összeszámolja azokat a cellákat, amelyek eleget tesznek a megadott feltételnek.\r\nCOUNTIFS\t\t= DARABHATÖBB\t\t\t##\tEgy tartományban összeszámolja azokat a cellákat, amelyek eleget tesznek több feltételnek.\r\nCOVAR\t\t\t= KOVAR\t\t\t\t##\tA kovarianciát, azaz a páronkénti eltérések szorzatának átlagát számítja ki.\r\nCRITBINOM\t\t= KRITBINOM\t\t\t##\tAzt a legkisebb számot adja eredményül, amelyre a binomiális eloszlásfüggvény értéke nem kisebb egy adott határértéknél.\r\nDEVSQ\t\t\t= SQ\t\t\t\t##\tAz átlagtól való eltérések négyzetének összegét számítja ki.\r\nEXPONDIST\t\t= EXP.ELOSZLÁS\t\t\t##\tAz exponenciális eloszlás értékét számítja ki.\r\nFDIST\t\t\t= F.ELOSZLÁS\t\t\t##\tAz F-eloszlás értékét számítja ki.\r\nFINV\t\t\t= INVERZ.F\t\t\t##\tAz F-eloszlás inverzének értékét számítja ki.\r\nFISHER\t\t\t= FISHER\t\t\t##\tFisher-transzformációt hajt végre.\r\nFISHERINV\t\t= INVERZ.FISHER\t\t\t##\tA Fisher-transzformáció inverzét hajtja végre.\r\nFORECAST\t\t= ELŐREJELZÉS\t\t\t##\tAz ismert értékek alapján lineáris regresszióval becsült értéket ad eredményül.\r\nFREQUENCY\t\t= GYAKORISÁG\t\t\t##\tA gyakorisági vagy empirikus eloszlás értékét függőleges tömbként adja eredményül.\r\nFTEST\t\t\t= F.PRÓBA\t\t\t##\tAz F-próba értékét adja eredményül.\r\nGAMMADIST\t\t= GAMMA.ELOSZLÁS\t\t##\tA gamma-eloszlás értékét számítja ki.\r\nGAMMAINV\t\t= INVERZ.GAMMA\t\t\t##\tA gamma-eloszlás eloszlásfüggvénye inverzének értékét számítja ki.\r\nGAMMALN\t\t\t= GAMMALN\t\t\t##\tA gamma-függvény természetes logaritmusát számítja ki.\r\nGEOMEAN\t\t\t= MÉRTANI.KÖZÉP\t\t\t##\tArgumentumai mértani középértékét számítja ki.\r\nGROWTH\t\t\t= NÖV\t\t\t\t##\tExponenciális regresszió alapján ad becslést.\r\nHARMEAN\t\t\t= HARM.KÖZÉP\t\t\t##\tArgumentumai harmonikus átlagát számítja ki.\r\nHYPGEOMDIST\t\t= HIPERGEOM.ELOSZLÁS\t\t##\tA hipergeometriai eloszlás értékét számítja ki.\r\nINTERCEPT\t\t= METSZ\t\t\t\t##\tA regressziós egyenes y tengellyel való metszéspontját határozza meg.\r\nKURT\t\t\t= CSÚCSOSSÁG\t\t\t##\tEgy adathalmaz csúcsosságát számítja ki.\r\nLARGE\t\t\t= NAGY\t\t\t\t##\tEgy adathalmaz k-adik legnagyobb elemét adja eredményül.\r\nLINEST\t\t\t= LIN.ILL\t\t\t##\tA legkisebb négyzetek módszerével az adatokra illesztett egyenes paramétereit határozza meg.\r\nLOGEST\t\t\t= LOG.ILL\t\t\t##\tAz adatokra illesztett exponenciális görbe paramétereit határozza meg.\r\nLOGINV\t\t\t= INVERZ.LOG.ELOSZLÁS\t\t##\tA lognormális eloszlás inverzét számítja ki.\r\nLOGNORMDIST\t\t= LOG.ELOSZLÁS\t\t\t##\tA lognormális eloszlásfüggvény értékét számítja ki.\r\nMAX\t\t\t= MAX\t\t\t\t##\tAz argumentumai között szereplő legnagyobb számot adja meg.\r\nMAXA\t\t\t= MAX2\t\t\t\t##\tAz argumentumai között szereplő legnagyobb számot adja meg (beleértve a számokat, szöveget és logikai értékeket).\r\nMEDIAN\t\t\t= MEDIÁN\t\t\t##\tAdott számhalmaz mediánját számítja ki.\r\nMIN\t\t\t= MIN\t\t\t\t##\tAz argumentumai között szereplő legkisebb számot adja meg.\r\nMINA\t\t\t= MIN2\t\t\t\t##\tAz argumentumai között szereplő legkisebb számot adja meg, beleértve a számokat, szöveget és logikai értékeket.\r\nMODE\t\t\t= MÓDUSZ\t\t\t##\tEgy adathalmazból kiválasztja a leggyakrabban előforduló számot.\r\nNEGBINOMDIST\t\t= NEGBINOM.ELOSZL\t\t##\tA negatív binomiális eloszlás értékét számítja ki.\r\nNORMDIST\t\t= NORM.ELOSZL\t\t\t##\tA normális eloszlás értékét számítja ki.\r\nNORMINV\t\t\t= INVERZ.NORM\t\t\t##\tA normális eloszlás eloszlásfüggvénye inverzének értékét számítja ki.\r\nNORMSDIST\t\t= STNORMELOSZL\t\t\t##\tA standard normális eloszlás eloszlásfüggvényének értékét számítja ki.\r\nNORMSINV\t\t= INVERZ.STNORM\t\t\t##\tA standard normális eloszlás eloszlásfüggvénye inverzének értékét számítja ki.\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tA Pearson-féle korrelációs együtthatót számítja ki.\r\nPERCENTILE\t\t= PERCENTILIS\t\t\t##\tEgy tartományban található értékek k-adik percentilisét, azaz százalékosztályát adja eredményül.\r\nPERCENTRANK\t\t= SZÁZALÉKRANG\t\t\t##\tEgy értéknek egy adathalmazon belül vett százalékos rangját (elhelyezkedését) számítja ki.\r\nPERMUT\t\t\t= VARIÁCIÓK\t\t\t##\tAdott számú objektum k-ad osztályú ismétlés nélküli variációinak számát számítja ki.\r\nPOISSON\t\t\t= POISSON\t\t\t##\tA Poisson-eloszlás értékét számítja ki.\r\nPROB\t\t\t= VALÓSZÍNŰSÉG\t\t\t##\tAnnak valószínűségét számítja ki, hogy adott értékek két határérték közé esnek.\r\nQUARTILE\t\t= KVARTILIS\t\t\t##\tEgy adathalmaz kvartilisét (negyedszintjét) számítja ki.\r\nRANK\t\t\t= SORSZÁM\t\t\t##\tKiszámítja, hogy egy szám hányadik egy számsorozatban.\r\nRSQ\t\t\t= RNÉGYZET\t\t\t##\tKiszámítja a Pearson-féle szorzatmomentum korrelációs együtthatójának négyzetét.\r\nSKEW\t\t\t= FERDESÉG\t\t\t##\tEgy eloszlás ferdeségét határozza meg.\r\nSLOPE\t\t\t= MEREDEKSÉG\t\t\t##\tEgy lineáris regressziós egyenes meredekségét számítja ki.\r\nSMALL\t\t\t= KICSI\t\t\t\t##\tEgy adathalmaz k-adik legkisebb elemét adja meg.\r\nSTANDARDIZE\t\t= NORMALIZÁLÁS\t\t\t##\tNormalizált értéket ad eredményül.\r\nSTDEV\t\t\t= SZÓRÁS\t\t\t##\tEgy statisztikai sokaság mintájából kiszámítja annak szórását.\r\nSTDEVA\t\t\t= SZÓRÁSA\t\t\t##\tEgy statisztikai sokaság mintájából kiszámítja annak szórását (beleértve a számokat, szöveget és logikai értékeket).\r\nSTDEVP\t\t\t= SZÓRÁSP\t\t\t##\tEgy statisztikai sokaság egészéből kiszámítja annak szórását.\r\nSTDEVPA\t\t\t= SZÓRÁSPA\t\t\t##\tEgy statisztikai sokaság egészéből kiszámítja annak szórását (beleértve számokat, szöveget és logikai értékeket).\r\nSTEYX\t\t\t= STHIBAYX\t\t\t##\tEgy regresszió esetén az egyes x-értékek alapján meghatározott y-értékek standard hibáját számítja ki.\r\nTDIST\t\t\t= T.ELOSZLÁS\t\t\t##\tA Student-féle t-eloszlás értékét számítja ki.\r\nTINV\t\t\t= INVERZ.T\t\t\t##\tA Student-féle t-eloszlás inverzét számítja ki.\r\nTREND\t\t\t= TREND\t\t\t\t##\tLineáris trend értékeit számítja ki.\r\nTRIMMEAN\t\t= RÉSZÁTLAG\t\t\t##\tEgy adathalmaz középső részének átlagát számítja ki.\r\nTTEST\t\t\t= T.PRÓBA\t\t\t##\tA Student-féle t-próbához tartozó valószínűséget számítja ki.\r\nVAR\t\t\t= VAR\t\t\t\t##\tMinta alapján becslést ad a varianciára.\r\nVARA\t\t\t= VARA\t\t\t\t##\tMinta alapján becslést ad a varianciára (beleértve számokat, szöveget és logikai értékeket).\r\nVARP\t\t\t= VARP\t\t\t\t##\tEgy statisztikai sokaság varianciáját számítja ki.\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tEgy statisztikai sokaság varianciáját számítja ki (beleértve számokat, szöveget és logikai értékeket).\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tA Weibull-féle eloszlás értékét számítja ki.\r\nZTEST\t\t\t= Z.PRÓBA\t\t\t##\tAz egyszélű z-próbával kapott valószínűségértéket számítja ki.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tSzövegműveletekhez használható függvények\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tSzöveg teljes szélességű (kétbájtos) latin és katakana karaktereit félszélességű (egybájtos) karakterekké alakítja.\r\nBAHTTEXT\t\t= BAHTSZÖVEG\t\t\t##\tSzámot szöveggé alakít a ß (baht) pénznemformátum használatával.\r\nCHAR\t\t\t= KARAKTER\t\t\t##\tA kódszámmal meghatározott karaktert adja eredményül.\r\nCLEAN\t\t\t= TISZTÍT\t\t\t##\tA szövegből eltávolítja az összes nem nyomtatható karaktert.\r\nCODE\t\t\t= KÓD\t\t\t\t##\tKaraktersorozat első karakterének numerikus kódját adja eredményül.\r\nCONCATENATE\t\t= ÖSSZEFŰZ\t\t\t##\tTöbb szövegelemet egyetlen szöveges elemmé fűz össze.\r\nDOLLAR\t\t\t= FORINT\t\t\t##\tSzámot pénznem formátumú szöveggé alakít át.\r\nEXACT\t\t\t= AZONOS\t\t\t##\tMegvizsgálja, hogy két érték azonos-e.\r\nFIND\t\t\t= SZÖVEG.TALÁL\t\t\t##\tKaraktersorozatot keres egy másikban (a kis- és nagybetűk megkülönböztetésével).\r\nFINDB\t\t\t= SZÖVEG.TALÁL2\t\t\t##\tKaraktersorozatot keres egy másikban (a kis- és nagybetűk megkülönböztetésével).\r\nFIXED\t\t\t= FIX\t\t\t\t##\tSzámot szöveges formátumúra alakít adott számú tizedesjegyre kerekítve.\r\nJIS\t\t\t= JIS\t\t\t\t##\tA félszélességű (egybájtos) latin és a katakana karaktereket teljes szélességű (kétbájtos) karakterekké alakítja.\r\nLEFT\t\t\t= BAL\t\t\t\t##\tSzöveg bal szélső karaktereit adja eredményül.\r\nLEFTB\t\t\t= BAL2\t\t\t\t##\tSzöveg bal szélső karaktereit adja eredményül.\r\nLEN\t\t\t= HOSSZ\t\t\t\t##\tSzöveg karakterekben mért hosszát adja eredményül.\r\nLENB\t\t\t= HOSSZ2\t\t\t##\tSzöveg karakterekben mért hosszát adja eredményül.\r\nLOWER\t\t\t= KISBETŰ\t\t\t##\tSzöveget kisbetűssé alakít át.\r\nMID\t\t\t= KÖZÉP\t\t\t\t##\tA szöveg adott pozíciójától kezdve megadott számú karaktert ad vissza eredményként.\r\nMIDB\t\t\t= KÖZÉP2\t\t\t##\tA szöveg adott pozíciójától kezdve megadott számú karaktert ad vissza eredményként.\r\nPHONETIC\t\t= PHONETIC\t\t\t##\tSzöveg furigana (fonetikus) karaktereit adja vissza.\r\nPROPER\t\t\t= TNÉV\t\t\t\t##\tSzöveg minden szavának kezdőbetűjét nagybetűsre cseréli.\r\nREPLACE\t\t\t= CSERE\t\t\t\t##\tA szövegen belül karaktereket cserél.\r\nREPLACEB\t\t= CSERE2\t\t\t##\tA szövegen belül karaktereket cserél.\r\nREPT\t\t\t= SOKSZOR\t\t\t##\tMegadott számú alkalommal megismétel egy szövegrészt.\r\nRIGHT\t\t\t= JOBB\t\t\t\t##\tSzövegrész jobb szélső karaktereit adja eredményül.\r\nRIGHTB\t\t\t= JOBB2\t\t\t\t##\tSzövegrész jobb szélső karaktereit adja eredményül.\r\nSEARCH\t\t\t= SZÖVEG.KERES\t\t\t##\tKaraktersorozatot keres egy másikban (a kis- és nagybetűk között nem tesz különbséget).\r\nSEARCHB\t\t\t= SZÖVEG.KERES2\t\t\t##\tKaraktersorozatot keres egy másikban (a kis- és nagybetűk között nem tesz különbséget).\r\nSUBSTITUTE\t\t= HELYETTE\t\t\t##\tSzövegben adott karaktereket másikra cserél.\r\nT\t\t\t= T\t\t\t\t##\tArgumentumát szöveggé alakítja át.\r\nTEXT\t\t\t= SZÖVEG\t\t\t##\tSzámértéket alakít át adott számformátumú szöveggé.\r\nTRIM\t\t\t= TRIM\t\t\t\t##\tA szövegből eltávolítja a szóközöket.\r\nUPPER\t\t\t= NAGYBETŰS\t\t\t##\tSzöveget nagybetűssé alakít át.\r\nVALUE\t\t\t= ÉRTÉK\t\t\t\t##\tSzöveget számmá alakít át.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/it/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= €\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NULLO!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #VALORE!\r\nREF\t= #RIF!\r\nNAME\t= #NOME?\r\nNUM\t= #NUM!\r\nNA\t= #N/D\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/it/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tFunzioni di automazione e dei componenti aggiuntivi\r\n##\r\nGETPIVOTDATA\t\t= INFO.DATI.TAB.PIVOT\t\t##\tRestituisce i dati memorizzati in un rapporto di tabella pivot\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tFunzioni cubo\r\n##\r\nCUBEKPIMEMBER\t\t= MEMBRO.KPI.CUBO\t\t##\tRestituisce il nome, la proprietà e la misura di un indicatore di prestazioni chiave (KPI) e visualizza il nome e la proprietà nella cella. Un KPI è una misura quantificabile, ad esempio l'utile lordo mensile o il fatturato trimestrale dei dipendenti, utilizzata per il monitoraggio delle prestazioni di un'organizzazione.\r\nCUBEMEMBER\t\t= MEMBRO.CUBO\t\t\t##\tRestituisce un membro o una tupla in una gerarchia di cubi. Consente di verificare l'esistenza del membro o della tupla nel cubo.\r\nCUBEMEMBERPROPERTY\t= PROPRIETÀ.MEMBRO.CUBO\t\t##\tRestituisce il valore di una proprietà di un membro del cubo. Consente di verificare l'esistenza di un nome di membro all'interno del cubo e di restituire la proprietà specificata per tale membro.\r\nCUBERANKEDMEMBER\t= MEMBRO.CUBO.CON.RANGO\t\t##\tRestituisce l'n-esimo membro o il membro ordinato di un insieme. Consente di restituire uno o più elementi in un insieme, ad esempio l'agente di vendita migliore o i primi 10 studenti.\r\nCUBESET\t\t\t= SET.CUBO\t\t\t##\tDefinisce un insieme di tuple o membri calcolati mediante l'invio di un'espressione di insieme al cubo sul server. In questo modo l'insieme viene creato e restituito a Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= CONTA.SET.CUBO\t\t##\tRestituisce il numero di elementi di un insieme.\r\nCUBEVALUE\t\t= VALORE.CUBO\t\t\t##\tRestituisce un valore aggregato da un cubo.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tFunzioni di database\r\n##\r\nDAVERAGE\t\t= DB.MEDIA\t\t\t##\tRestituisce la media di voci del database selezionate\r\nDCOUNT\t\t\t= DB.CONTA.NUMERI\t\t##\tConta le celle di un database contenenti numeri\r\nDCOUNTA\t\t\t= DB.CONTA.VALORI\t\t##\tConta le celle non vuote in un database\r\nDGET\t\t\t= DB.VALORI\t\t\t##\tEstrae da un database un singolo record che soddisfa i criteri specificati\r\nDMAX\t\t\t= DB.MAX\t\t\t##\tRestituisce il valore massimo dalle voci selezionate in un database\r\nDMIN\t\t\t= DB.MIN\t\t\t##\tRestituisce il valore minimo dalle voci di un database selezionate\r\nDPRODUCT\t\t= DB.PRODOTTO\t\t\t##\tMoltiplica i valori in un determinato campo di record che soddisfano i criteri del database\r\nDSTDEV\t\t\t= DB.DEV.ST\t\t\t##\tRestituisce una stima della deviazione standard sulla base di un campione di voci di un database selezionate\r\nDSTDEVP\t\t\t= DB.DEV.ST.POP\t\t\t##\tCalcola la deviazione standard sulla base di tutte le voci di un database selezionate\r\nDSUM\t\t\t= DB.SOMMA\t\t\t##\tAggiunge i numeri nel campo colonna di record del database che soddisfa determinati criteri\r\nDVAR\t\t\t= DB.VAR\t\t\t##\tRestituisce una stima della varianza sulla base di un campione da voci di un database selezionate\r\nDVARP\t\t\t= DB.VAR.POP\t\t\t##\tCalcola la varianza sulla base di tutte le voci di un database selezionate\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tFunzioni data e ora\r\n##\r\nDATE\t\t\t= DATA\t\t\t\t##\tRestituisce il numero seriale di una determinata data\r\nDATEVALUE\t\t= DATA.VALORE\t\t\t##\tConverte una data sotto forma di testo in un numero seriale\r\nDAY\t\t\t= GIORNO\t\t\t##\tConverte un numero seriale in un giorno del mese\r\nDAYS360\t\t\t= GIORNO360\t\t\t##\tCalcola il numero di giorni compreso tra due date basandosi su un anno di 360 giorni\r\nEDATE\t\t\t= DATA.MESE\t\t\t##\tRestituisce il numero seriale della data che rappresenta il numero di mesi prima o dopo la data di inizio\r\nEOMONTH\t\t\t= FINE.MESE\t\t\t##\tRestituisce il numero seriale dell'ultimo giorno del mese, prima o dopo un determinato numero di mesi\r\nHOUR\t\t\t= ORA\t\t\t\t##\tConverte un numero seriale in un'ora\r\nMINUTE\t\t\t= MINUTO\t\t\t##\tConverte un numero seriale in un minuto\r\nMONTH\t\t\t= MESE\t\t\t\t##\tConverte un numero seriale in un mese\r\nNETWORKDAYS\t\t= GIORNI.LAVORATIVI.TOT\t\t##\tRestituisce il numero di tutti i giorni lavorativi compresi fra due date\r\nNOW\t\t\t= ADESSO\t\t\t##\tRestituisce il numero seriale della data e dell'ora corrente\r\nSECOND\t\t\t= SECONDO\t\t\t##\tConverte un numero seriale in un secondo\r\nTIME\t\t\t= ORARIO\t\t\t##\tRestituisce il numero seriale di una determinata ora\r\nTIMEVALUE\t\t= ORARIO.VALORE\t\t\t##\tConverte un orario in forma di testo in un numero seriale\r\nTODAY\t\t\t= OGGI\t\t\t\t##\tRestituisce il numero seriale relativo alla data odierna\r\nWEEKDAY\t\t\t= GIORNO.SETTIMANA\t\t##\tConverte un numero seriale in un giorno della settimana\r\nWEEKNUM\t\t\t= NUM.SETTIMANA\t\t\t##\tConverte un numero seriale in un numero che rappresenta la posizione numerica di una settimana nell'anno\r\nWORKDAY\t\t\t= GIORNO.LAVORATIVO\t\t##\tRestituisce il numero della data prima o dopo un determinato numero di giorni lavorativi\r\nYEAR\t\t\t= ANNO\t\t\t\t##\tConverte un numero seriale in un anno\r\nYEARFRAC\t\t= FRAZIONE.ANNO\t\t\t##\tRestituisce la frazione dell'anno che rappresenta il numero dei giorni compresi tra una data_ iniziale e una data_finale\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tFunzioni ingegneristiche\r\n##\r\nBESSELI\t\t\t= BESSEL.I\t\t\t##\tRestituisce la funzione di Bessel modificata In(x)\r\nBESSELJ\t\t\t= BESSEL.J\t\t\t##\tRestituisce la funzione di Bessel Jn(x)\r\nBESSELK\t\t\t= BESSEL.K\t\t\t##\tRestituisce la funzione di Bessel modificata Kn(x)\r\nBESSELY\t\t\t= BESSEL.Y\t\t\t##\tRestituisce la funzione di Bessel Yn(x)\r\nBIN2DEC\t\t\t= BINARIO.DECIMALE\t\t##\tConverte un numero binario in decimale\r\nBIN2HEX\t\t\t= BINARIO.HEX\t\t\t##\tConverte un numero binario in esadecimale\r\nBIN2OCT\t\t\t= BINARIO.OCT\t\t\t##\tConverte un numero binario in ottale\r\nCOMPLEX\t\t\t= COMPLESSO\t\t\t##\tConverte i coefficienti reali e immaginari in numeri complessi\r\nCONVERT\t\t\t= CONVERTI\t\t\t##\tConverte un numero da un sistema di misura in un altro\r\nDEC2BIN\t\t\t= DECIMALE.BINARIO\t\t##\tConverte un numero decimale in binario\r\nDEC2HEX\t\t\t= DECIMALE.HEX\t\t\t##\tConverte un numero decimale in esadecimale\r\nDEC2OCT\t\t\t= DECIMALE.OCT\t\t\t##\tConverte un numero decimale in ottale\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tVerifica se due valori sono uguali\r\nERF\t\t\t= FUNZ.ERRORE\t\t\t##\tRestituisce la funzione di errore\r\nERFC\t\t\t= FUNZ.ERRORE.COMP\t\t##\tRestituisce la funzione di errore complementare\r\nGESTEP\t\t\t= SOGLIA\t\t\t##\tVerifica se un numero è maggiore del valore di soglia\r\nHEX2BIN\t\t\t= HEX.BINARIO\t\t\t##\tConverte un numero esadecimale in binario\r\nHEX2DEC\t\t\t= HEX.DECIMALE\t\t\t##\tConverte un numero esadecimale in decimale\r\nHEX2OCT\t\t\t= HEX.OCT\t\t\t##\tConverte un numero esadecimale in ottale\r\nIMABS\t\t\t= COMP.MODULO\t\t\t##\tRestituisce il valore assoluto (modulo) di un numero complesso\r\nIMAGINARY\t\t= COMP.IMMAGINARIO\t\t##\tRestituisce il coefficiente immaginario di un numero complesso\r\nIMARGUMENT\t\t= COMP.ARGOMENTO\t\t##\tRestituisce l'argomento theta, un angolo espresso in radianti\r\nIMCONJUGATE\t\t= COMP.CONIUGATO\t\t##\tRestituisce il complesso coniugato del numero complesso\r\nIMCOS\t\t\t= COMP.COS\t\t\t##\tRestituisce il coseno di un numero complesso\r\nIMDIV\t\t\t= COMP.DIV\t\t\t##\tRestituisce il quoziente di due numeri complessi\r\nIMEXP\t\t\t= COMP.EXP\t\t\t##\tRestituisce il valore esponenziale di un numero complesso\r\nIMLN\t\t\t= COMP.LN\t\t\t##\tRestituisce il logaritmo naturale di un numero complesso\r\nIMLOG10\t\t\t= COMP.LOG10\t\t\t##\tRestituisce il logaritmo in base 10 di un numero complesso\r\nIMLOG2\t\t\t= COMP.LOG2\t\t\t##\tRestituisce un logaritmo in base 2 di un numero complesso\r\nIMPOWER\t\t\t= COMP.POTENZA\t\t\t##\tRestituisce il numero complesso elevato a una potenza intera\r\nIMPRODUCT\t\t= COMP.PRODOTTO\t\t\t##\tRestituisce il prodotto di numeri complessi compresi tra 2 e 29\r\nIMREAL\t\t\t= COMP.PARTE.REALE\t\t##\tRestituisce il coefficiente reale di un numero complesso\r\nIMSIN\t\t\t= COMP.SEN\t\t\t##\tRestituisce il seno di un numero complesso\r\nIMSQRT\t\t\t= COMP.RADQ\t\t\t##\tRestituisce la radice quadrata di un numero complesso\r\nIMSUB\t\t\t= COMP.DIFF\t\t\t##\tRestituisce la differenza fra due numeri complessi\r\nIMSUM\t\t\t= COMP.SOMMA\t\t\t##\tRestituisce la somma di numeri complessi\r\nOCT2BIN\t\t\t= OCT.BINARIO\t\t\t##\tConverte un numero ottale in binario\r\nOCT2DEC\t\t\t= OCT.DECIMALE\t\t\t##\tConverte un numero ottale in decimale\r\nOCT2HEX\t\t\t= OCT.HEX\t\t\t##\tConverte un numero ottale in esadecimale\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFunzioni finanziarie\r\n##\r\nACCRINT\t\t\t= INT.MATURATO.PER\t\t##\tRestituisce l'interesse maturato di un titolo che paga interessi periodici\r\nACCRINTM\t\t= INT.MATURATO.SCAD\t\t##\tRestituisce l'interesse maturato di un titolo che paga interessi alla scadenza\r\nAMORDEGRC\t\t= AMMORT.DEGR\t\t\t##\tRestituisce l'ammortamento per ogni periodo contabile utilizzando un coefficiente di ammortamento\r\nAMORLINC\t\t= AMMORT.PER\t\t\t##\tRestituisce l'ammortamento per ogni periodo contabile\r\nCOUPDAYBS\t\t= GIORNI.CED.INIZ.LIQ\t\t##\tRestituisce il numero dei giorni che vanno dall'inizio del periodo di durata della cedola alla data di liquidazione\r\nCOUPDAYS\t\t= GIORNI.CED\t\t\t##\tRestituisce il numero dei giorni relativi al periodo della cedola che contiene la data di liquidazione\r\nCOUPDAYSNC\t\t= GIORNI.CED.NUOVA\t\t##\tRestituisce il numero di giorni che vanno dalla data di liquidazione alla data della cedola successiva\r\nCOUPNCD\t\t\t= DATA.CED.SUCC\t\t\t##\tRestituisce un numero che rappresenta la data della cedola successiva alla data di liquidazione\r\nCOUPNUM\t\t\t= NUM.CED\t\t\t##\tRestituisce il numero di cedole pagabili fra la data di liquidazione e la data di scadenza\r\nCOUPPCD\t\t\t= DATA.CED.PREC\t\t\t##\tRestituisce un numero che rappresenta la data della cedola precedente alla data di liquidazione\r\nCUMIPMT\t\t\t= INT.CUMUL\t\t\t##\tRestituisce l'interesse cumulativo pagato fra due periodi\r\nCUMPRINC\t\t= CAP.CUM\t\t\t##\tRestituisce il capitale cumulativo pagato per estinguere un debito fra due periodi\r\nDB\t\t\t= DB\t\t\t\t##\tRestituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a quote fisse decrescenti\r\nDDB\t\t\t= AMMORT\t\t\t##\tRestituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a doppie quote decrescenti o altri metodi specificati\r\nDISC\t\t\t= TASSO.SCONTO\t\t\t##\tRestituisce il tasso di sconto per un titolo\r\nDOLLARDE\t\t= VALUTA.DEC\t\t\t##\tConverte un prezzo valuta, espresso come frazione, in prezzo valuta, espresso come numero decimale\r\nDOLLARFR\t\t= VALUTA.FRAZ\t\t\t##\tConverte un prezzo valuta, espresso come numero decimale, in prezzo valuta, espresso come frazione\r\nDURATION\t\t= DURATA\t\t\t##\tRestituisce la durata annuale di un titolo con i pagamenti di interesse periodico\r\nEFFECT\t\t\t= EFFETTIVO\t\t\t##\tRestituisce l'effettivo tasso di interesse annuo\r\nFV\t\t\t= VAL.FUT\t\t\t##\tRestituisce il valore futuro di un investimento\r\nFVSCHEDULE\t\t= VAL.FUT.CAPITALE\t\t##\tRestituisce il valore futuro di un capitale iniziale dopo aver applicato una serie di tassi di interesse composti\r\nINTRATE\t\t\t= TASSO.INT\t\t\t##\tRestituisce il tasso di interesse per un titolo interamente investito\r\nIPMT\t\t\t= INTERESSI\t\t\t##\tRestituisce il valore degli interessi per un investimento relativo a un periodo specifico\r\nIRR\t\t\t= TIR.COST\t\t\t##\tRestituisce il tasso di rendimento interno per una serie di flussi di cassa\r\nISPMT\t\t\t= INTERESSE.RATA\t\t##\tCalcola l'interesse di un investimento pagato durante un periodo specifico\r\nMDURATION\t\t= DURATA.M\t\t\t##\tRestituisce la durata Macauley modificata per un titolo con un valore presunto di € 100\r\nMIRR\t\t\t= TIR.VAR\t\t\t##\tRestituisce il tasso di rendimento interno in cui i flussi di cassa positivi e negativi sono finanziati a tassi differenti\r\nNOMINAL\t\t\t= NOMINALE\t\t\t##\tRestituisce il tasso di interesse nominale annuale\r\nNPER\t\t\t= NUM.RATE\t\t\t##\tRestituisce un numero di periodi relativi a un investimento\r\nNPV\t\t\t= VAN\t\t\t\t##\tRestituisce il valore attuale netto di un investimento basato su una serie di flussi di cassa periodici e sul tasso di sconto\r\nODDFPRICE\t\t= PREZZO.PRIMO.IRR\t\t##\tRestituisce il prezzo di un titolo dal valore nominale di € 100 avente il primo periodo di durata irregolare\r\nODDFYIELD\t\t= REND.PRIMO.IRR\t\t##\tRestituisce il rendimento di un titolo avente il primo periodo di durata irregolare\r\nODDLPRICE\t\t= PREZZO.ULTIMO.IRR\t\t##\tRestituisce il prezzo di un titolo dal valore nominale di € 100 avente l'ultimo periodo di durata irregolare\r\nODDLYIELD\t\t= REND.ULTIMO.IRR\t\t##\tRestituisce il rendimento di un titolo avente l'ultimo periodo di durata irregolare\r\nPMT\t\t\t= RATA\t\t\t\t##\tRestituisce il pagamento periodico di una rendita annua\r\nPPMT\t\t\t= P.RATA\t\t\t##\tRestituisce il pagamento sul capitale di un investimento per un dato periodo\r\nPRICE\t\t\t= PREZZO\t\t\t##\tRestituisce il prezzo di un titolo dal valore nominale di € 100 che paga interessi periodici\r\nPRICEDISC\t\t= PREZZO.SCONT\t\t\t##\tRestituisce il prezzo di un titolo scontato dal valore nominale di € 100\r\nPRICEMAT\t\t= PREZZO.SCAD\t\t\t##\tRestituisce il prezzo di un titolo dal valore nominale di € 100 che paga gli interessi alla scadenza\r\nPV\t\t\t= VA\t\t\t\t##\tRestituisce il valore attuale di un investimento\r\nRATE\t\t\t= TASSO\t\t\t\t##\tRestituisce il tasso di interesse per un periodo di un'annualità\r\nRECEIVED\t\t= RICEV.SCAD\t\t\t##\tRestituisce l'ammontare ricevuto alla scadenza di un titolo interamente investito\r\nSLN\t\t\t= AMMORT.COST\t\t\t##\tRestituisce l'ammortamento a quote costanti di un bene per un singolo periodo\r\nSYD\t\t\t= AMMORT.ANNUO\t\t\t##\tRestituisce l'ammortamento a somma degli anni di un bene per un periodo specificato\r\nTBILLEQ\t\t\t= BOT.EQUIV\t\t\t##\tRestituisce il rendimento equivalente ad un'obbligazione per un Buono ordinario del Tesoro\r\nTBILLPRICE\t\t= BOT.PREZZO\t\t\t##\tRestituisce il prezzo di un Buono del Tesoro dal valore nominale di € 100\r\nTBILLYIELD\t\t= BOT.REND\t\t\t##\tRestituisce il rendimento di un Buono del Tesoro\r\nVDB\t\t\t= AMMORT.VAR\t\t\t##\tRestituisce l'ammortamento di un bene per un periodo specificato o parziale utilizzando il metodo a doppie quote proporzionali ai valori residui\r\nXIRR\t\t\t= TIR.X\t\t\t\t##\tRestituisce il tasso di rendimento interno di un impiego di flussi di cassa\r\nXNPV\t\t\t= VAN.X\t\t\t\t##\tRestituisce il valore attuale netto di un impiego di flussi di cassa non necessariamente periodici\r\nYIELD\t\t\t= REND\t\t\t\t##\tRestituisce il rendimento di un titolo che frutta interessi periodici\r\nYIELDDISC\t\t= REND.TITOLI.SCONT\t\t##\tRestituisce il rendimento annuale di un titolo scontato, ad esempio un Buono del Tesoro\r\nYIELDMAT\t\t= REND.SCAD\t\t\t##\tRestituisce il rendimento annuo di un titolo che paga interessi alla scadenza\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tFunzioni relative alle informazioni\r\n##\r\nCELL\t\t\t= CELLA\t\t\t\t##\tRestituisce le informazioni sulla formattazione, la posizione o i contenuti di una cella\r\nERROR.TYPE\t\t= ERRORE.TIPO\t\t\t##\tRestituisce un numero che corrisponde a un tipo di errore\r\nINFO\t\t\t= INFO\t\t\t\t##\tRestituisce le informazioni sull'ambiente operativo corrente\r\nISBLANK\t\t\t= VAL.VUOTO\t\t\t##\tRestituisce VERO se il valore è vuoto\r\nISERR\t\t\t= VAL.ERR\t\t\t##\tRestituisce VERO se il valore è un valore di errore qualsiasi tranne #N/D\r\nISERROR\t\t\t= VAL.ERRORE\t\t\t##\tRestituisce VERO se il valore è un valore di errore qualsiasi\r\nISEVEN\t\t\t= VAL.PARI\t\t\t##\tRestituisce VERO se il numero è pari\r\nISLOGICAL\t\t= VAL.LOGICO\t\t\t##\tRestituisce VERO se il valore è un valore logico\r\nISNA\t\t\t= VAL.NON.DISP\t\t\t##\tRestituisce VERO se il valore è un valore di errore #N/D\r\nISNONTEXT\t\t= VAL.NON.TESTO\t\t\t##\tRestituisce VERO se il valore non è in formato testo\r\nISNUMBER\t\t= VAL.NUMERO\t\t\t##\tRestituisce VERO se il valore è un numero\r\nISODD\t\t\t= VAL.DISPARI\t\t\t##\tRestituisce VERO se il numero è dispari\r\nISREF\t\t\t= VAL.RIF\t\t\t##\tRestituisce VERO se il valore è un riferimento\r\nISTEXT\t\t\t= VAL.TESTO\t\t\t##\tRestituisce VERO se il valore è in formato testo\r\nN\t\t\t= NUM\t\t\t\t##\tRestituisce un valore convertito in numero\r\nNA\t\t\t= NON.DISP\t\t\t##\tRestituisce il valore di errore #N/D\r\nTYPE\t\t\t= TIPO\t\t\t\t##\tRestituisce un numero che indica il tipo di dati relativi a un valore\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tFunzioni logiche\r\n##\r\nAND\t\t\t= E\t\t\t\t##\tRestituisce VERO se tutti gli argomenti sono VERO\r\nFALSE\t\t\t= FALSO\t\t\t\t##\tRestituisce il valore logico FALSO\r\nIF\t\t\t= SE\t\t\t\t##\tSpecifica un test logico da eseguire\r\nIFERROR\t\t\t= SE.ERRORE\t\t\t##\tRestituisce un valore specificato se una formula fornisce un errore come risultato; in caso contrario, restituisce il risultato della formula\r\nNOT\t\t\t= NON\t\t\t\t##\tInverte la logica degli argomenti\r\nOR\t\t\t= O\t\t\t\t##\tRestituisce VERO se un argomento qualsiasi è VERO\r\nTRUE\t\t\t= VERO\t\t\t\t##\tRestituisce il valore logico VERO\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tFunzioni di ricerca e di riferimento\r\n##\r\nADDRESS\t\t\t= INDIRIZZO\t\t\t##\tRestituisce un riferimento come testo in una singola cella di un foglio di lavoro\r\nAREAS\t\t\t= AREE\t\t\t\t##\tRestituisce il numero di aree in un riferimento\r\nCHOOSE\t\t\t= SCEGLI\t\t\t##\tSceglie un valore da un elenco di valori\r\nCOLUMN\t\t\t= RIF.COLONNA\t\t\t##\tRestituisce il numero di colonna di un riferimento\r\nCOLUMNS\t\t\t= COLONNE\t\t\t##\tRestituisce il numero di colonne in un riferimento\r\nHLOOKUP\t\t\t= CERCA.ORIZZ\t\t\t##\tEffettua una ricerca nella riga superiore di una matrice e restituisce il valore della cella specificata\r\nHYPERLINK\t\t= COLLEG.IPERTESTUALE\t\t##\tCrea un collegamento che apre un documento memorizzato in un server di rete, una rete Intranet o Internet\r\nINDEX\t\t\t= INDICE\t\t\t##\tUtilizza un indice per scegliere un valore da un riferimento o da una matrice\r\nINDIRECT\t\t= INDIRETTO\t\t\t##\tRestituisce un riferimento specificato da un valore testo\r\nLOOKUP\t\t\t= CERCA\t\t\t\t##\tRicerca i valori in un vettore o in una matrice\r\nMATCH\t\t\t= CONFRONTA\t\t\t##\tRicerca i valori in un riferimento o in una matrice\r\nOFFSET\t\t\t= SCARTO\t\t\t##\tRestituisce uno scarto di riferimento da un riferimento dato\r\nROW\t\t\t= RIF.RIGA\t\t\t##\tRestituisce il numero di riga di un riferimento\r\nROWS\t\t\t= RIGHE\t\t\t\t##\tRestituisce il numero delle righe in un riferimento\r\nRTD\t\t\t= DATITEMPOREALE\t\t##\tRecupera dati in tempo reale da un programma che supporta l'automazione COM (automazione: Metodo per utilizzare gli oggetti di un'applicazione da un'altra applicazione o da un altro strumento di sviluppo. Precedentemente nota come automazione OLE, l'automazione è uno standard del settore e una caratteristica del modello COM (Component Object Model).)\r\nTRANSPOSE\t\t= MATR.TRASPOSTA\t\t##\tRestituisce la trasposizione di una matrice\r\nVLOOKUP\t\t\t= CERCA.VERT\t\t\t##\tEffettua una ricerca nella prima colonna di una matrice e si sposta attraverso la riga per restituire il valore di una cella\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tFunzioni matematiche e trigonometriche\r\n##\r\nABS\t\t\t= ASS\t\t\t\t##\tRestituisce il valore assoluto di un numero.\r\nACOS\t\t\t= ARCCOS\t\t\t##\tRestituisce l'arcocoseno di un numero\r\nACOSH\t\t\t= ARCCOSH\t\t\t##\tRestituisce l'inverso del coseno iperbolico di un numero\r\nASIN\t\t\t= ARCSEN\t\t\t##\tRestituisce l'arcoseno di un numero\r\nASINH\t\t\t= ARCSENH\t\t\t##\tRestituisce l'inverso del seno iperbolico di un numero\r\nATAN\t\t\t= ARCTAN\t\t\t##\tRestituisce l'arcotangente di un numero\r\nATAN2\t\t\t= ARCTAN.2\t\t\t##\tRestituisce l'arcotangente delle coordinate x e y specificate\r\nATANH\t\t\t= ARCTANH\t\t\t##\tRestituisce l'inverso della tangente iperbolica di un numero\r\nCEILING\t\t\t= ARROTONDA.ECCESSO\t\t##\tArrotonda un numero per eccesso all'intero più vicino o al multiplo più vicino a peso\r\nCOMBIN\t\t\t= COMBINAZIONE\t\t\t##\tRestituisce il numero di combinazioni possibili per un numero assegnato di elementi\r\nCOS\t\t\t= COS\t\t\t\t##\tRestituisce il coseno dell'angolo specificato\r\nCOSH\t\t\t= COSH\t\t\t\t##\tRestituisce il coseno iperbolico di un numero\r\nDEGREES\t\t\t= GRADI\t\t\t\t##\tConverte i radianti in gradi\r\nEVEN\t\t\t= PARI\t\t\t\t##\tArrotonda il valore assoluto di un numero per eccesso al più vicino intero pari\r\nEXP\t\t\t= ESP\t\t\t\t##\tRestituisce il numero e elevato alla potenza di num\r\nFACT\t\t\t= FATTORIALE\t\t\t##\tRestituisce il fattoriale di un numero\r\nFACTDOUBLE\t\t= FATT.DOPPIO\t\t\t##\tRestituisce il fattoriale doppio di un numero\r\nFLOOR\t\t\t= ARROTONDA.DIFETTO\t\t##\tArrotonda un numero per difetto al multiplo più vicino a zero\r\nGCD\t\t\t= MCD\t\t\t\t##\tRestituisce il massimo comune divisore\r\nINT\t\t\t= INT\t\t\t\t##\tArrotonda un numero per difetto al numero intero più vicino\r\nLCM\t\t\t= MCM\t\t\t\t##\tRestituisce il minimo comune multiplo\r\nLN\t\t\t= LN\t\t\t\t##\tRestituisce il logaritmo naturale di un numero\r\nLOG\t\t\t= LOG\t\t\t\t##\tRestituisce il logaritmo di un numero in una specificata base\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tRestituisce il logaritmo in base 10 di un numero\r\nMDETERM\t\t\t= MATR.DETERM\t\t\t##\tRestituisce il determinante di una matrice\r\nMINVERSE\t\t= MATR.INVERSA\t\t\t##\tRestituisce l'inverso di una matrice\r\nMMULT\t\t\t= MATR.PRODOTTO\t\t\t##\tRestituisce il prodotto di due matrici\r\nMOD\t\t\t= RESTO\t\t\t\t##\tRestituisce il resto della divisione\r\nMROUND\t\t\t= ARROTONDA.MULTIPLO\t\t##\tRestituisce un numero arrotondato al multiplo desiderato\r\nMULTINOMIAL\t\t= MULTINOMIALE\t\t\t##\tRestituisce il multinomiale di un insieme di numeri\r\nODD\t\t\t= DISPARI\t\t\t##\tArrotonda un numero per eccesso al più vicino intero dispari\r\nPI\t\t\t= PI.GRECO\t\t\t##\tRestituisce il valore di pi greco\r\nPOWER\t\t\t= POTENZA\t\t\t##\tRestituisce il risultato di un numero elevato a potenza\r\nPRODUCT\t\t\t= PRODOTTO\t\t\t##\tMoltiplica i suoi argomenti\r\nQUOTIENT\t\t= QUOZIENTE\t\t\t##\tRestituisce la parte intera di una divisione\r\nRADIANS\t\t\t= RADIANTI\t\t\t##\tConverte i gradi in radianti\r\nRAND\t\t\t= CASUALE\t\t\t##\tRestituisce un numero casuale compreso tra 0 e 1\r\nRANDBETWEEN\t\t= CASUALE.TRA\t\t\t##\tRestituisce un numero casuale compreso tra i numeri specificati\r\nROMAN\t\t\t= ROMANO\t\t\t##\tRestituisce il numero come numero romano sotto forma di testo\r\nROUND\t\t\t= ARROTONDA\t\t\t##\tArrotonda il numero al numero di cifre specificato\r\nROUNDDOWN\t\t= ARROTONDA.PER.DIF\t\t##\tArrotonda il valore assoluto di un numero per difetto\r\nROUNDUP\t\t\t= ARROTONDA.PER.ECC\t\t##\tArrotonda il valore assoluto di un numero per eccesso\r\nSERIESSUM\t\t= SOMMA.SERIE\t\t\t##\tRestituisce la somma di una serie di potenze in base alla formula\r\nSIGN\t\t\t= SEGNO\t\t\t\t##\tRestituisce il segno di un numero\r\nSIN\t\t\t= SEN\t\t\t\t##\tRestituisce il seno di un dato angolo\r\nSINH\t\t\t= SENH\t\t\t\t##\tRestituisce il seno iperbolico di un numero\r\nSQRT\t\t\t= RADQ\t\t\t\t##\tRestituisce una radice quadrata\r\nSQRTPI\t\t\t= RADQ.PI.GRECO\t\t\t##\tRestituisce la radice quadrata di un numero (numero * pi greco)\r\nSUBTOTAL\t\t= SUBTOTALE\t\t\t##\tRestituisce un subtotale in un elenco o in un database\r\nSUM\t\t\t= SOMMA\t\t\t\t##\tSomma i suoi argomenti\r\nSUMIF\t\t\t= SOMMA.SE\t\t\t##\tSomma le celle specificate da un dato criterio\r\nSUMIFS\t\t\t= SOMMA.PIÙ.SE\t\t\t##\tSomma le celle in un intervallo che soddisfano più criteri\r\nSUMPRODUCT\t\t= MATR.SOMMA.PRODOTTO\t\t##\tRestituisce la somma dei prodotti dei componenti corrispondenti della matrice\r\nSUMSQ\t\t\t= SOMMA.Q\t\t\t##\tRestituisce la somma dei quadrati degli argomenti\r\nSUMX2MY2\t\t= SOMMA.DIFF.Q\t\t\t##\tRestituisce la somma della differenza dei quadrati dei corrispondenti elementi in due matrici\r\nSUMX2PY2\t\t= SOMMA.SOMMA.Q\t\t\t##\tRestituisce la somma della somma dei quadrati dei corrispondenti elementi in due matrici\r\nSUMXMY2\t\t\t= SOMMA.Q.DIFF\t\t\t##\tRestituisce la somma dei quadrati delle differenze dei corrispondenti elementi in due matrici\r\nTAN\t\t\t= TAN\t\t\t\t##\tRestituisce la tangente di un numero\r\nTANH\t\t\t= TANH\t\t\t\t##\tRestituisce la tangente iperbolica di un numero\r\nTRUNC\t\t\t= TRONCA\t\t\t##\tTronca la parte decimale di un numero\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tFunzioni statistiche\r\n##\r\nAVEDEV\t\t\t= MEDIA.DEV\t\t\t##\tRestituisce la media delle deviazioni assolute delle coordinate rispetto alla loro media\r\nAVERAGE\t\t\t= MEDIA\t\t\t\t##\tRestituisce la media degli argomenti\r\nAVERAGEA\t\t= MEDIA.VALORI\t\t\t##\tRestituisce la media degli argomenti, inclusi i numeri, il testo e i valori logici\r\nAVERAGEIF\t\t= MEDIA.SE\t\t\t##\tRestituisce la media aritmetica di tutte le celle in un intervallo che soddisfano un determinato criterio\r\nAVERAGEIFS\t\t= MEDIA.PIÙ.SE\t\t\t##\tRestituisce la media aritmetica di tutte le celle che soddisfano più criteri\r\nBETADIST\t\t= DISTRIB.BETA\t\t\t##\tRestituisce la funzione di distribuzione cumulativa beta\r\nBETAINV\t\t\t= INV.BETA\t\t\t##\tRestituisce l'inverso della funzione di distribuzione cumulativa per una distribuzione beta specificata\r\nBINOMDIST\t\t= DISTRIB.BINOM\t\t\t##\tRestituisce la distribuzione binomiale per il termine individuale\r\nCHIDIST\t\t\t= DISTRIB.CHI\t\t\t##\tRestituisce la probabilità a una coda per la distribuzione del chi quadrato\r\nCHIINV\t\t\t= INV.CHI\t\t\t##\tRestituisce l'inverso della probabilità ad una coda per la distribuzione del chi quadrato\r\nCHITEST\t\t\t= TEST.CHI\t\t\t##\tRestituisce il test per l'indipendenza\r\nCONFIDENCE\t\t= CONFIDENZA\t\t\t##\tRestituisce l'intervallo di confidenza per una popolazione\r\nCORREL\t\t\t= CORRELAZIONE\t\t\t##\tRestituisce il coefficiente di correlazione tra due insiemi di dati\r\nCOUNT\t\t\t= CONTA.NUMERI\t\t\t##\tConta la quantità di numeri nell'elenco di argomenti\r\nCOUNTA\t\t\t= CONTA.VALORI\t\t\t##\tConta il numero di valori nell'elenco di argomenti\r\nCOUNTBLANK\t\t= CONTA.VUOTE\t\t\t##\tConta il numero di celle vuote all'interno di un intervallo\r\nCOUNTIF\t\t\t= CONTA.SE\t\t\t##\tConta il numero di celle all'interno di un intervallo che soddisfa i criteri specificati\r\nCOUNTIFS\t\t= CONTA.PIÙ.SE\t\t\t##\tConta il numero di celle in un intervallo che soddisfano più criteri.\r\nCOVAR\t\t\t= COVARIANZA\t\t\t##\tCalcola la covarianza, la media dei prodotti delle deviazioni accoppiate\r\nCRITBINOM\t\t= CRIT.BINOM\t\t\t##\tRestituisce il più piccolo valore per il quale la distribuzione cumulativa binomiale risulta maggiore o uguale ad un valore di criterio\r\nDEVSQ\t\t\t= DEV.Q\t\t\t\t##\tRestituisce la somma dei quadrati delle deviazioni\r\nEXPONDIST\t\t= DISTRIB.EXP\t\t\t##\tRestituisce la distribuzione esponenziale\r\nFDIST\t\t\t= DISTRIB.F\t\t\t##\tRestituisce la distribuzione di probabilità F\r\nFINV\t\t\t= INV.F\t\t\t\t##\tRestituisce l'inverso della distribuzione della probabilità F\r\nFISHER\t\t\t= FISHER\t\t\t##\tRestituisce la trasformazione di Fisher\r\nFISHERINV\t\t= INV.FISHER\t\t\t##\tRestituisce l'inverso della trasformazione di Fisher\r\nFORECAST\t\t= PREVISIONE\t\t\t##\tRestituisce i valori lungo una tendenza lineare\r\nFREQUENCY\t\t= FREQUENZA\t\t\t##\tRestituisce la distribuzione di frequenza come matrice verticale\r\nFTEST\t\t\t= TEST.F\t\t\t##\tRestituisce il risultato di un test F\r\nGAMMADIST\t\t= DISTRIB.GAMMA\t\t\t##\tRestituisce la distribuzione gamma\r\nGAMMAINV\t\t= INV.GAMMA\t\t\t##\tRestituisce l'inverso della distribuzione cumulativa gamma\r\nGAMMALN\t\t\t= LN.GAMMA\t\t\t##\tRestituisce il logaritmo naturale della funzione gamma, G(x)\r\nGEOMEAN\t\t\t= MEDIA.GEOMETRICA\t\t##\tRestituisce la media geometrica\r\nGROWTH\t\t\t= CRESCITA\t\t\t##\tRestituisce i valori lungo una linea di tendenza esponenziale\r\nHARMEAN\t\t\t= MEDIA.ARMONICA\t\t##\tRestituisce la media armonica\r\nHYPGEOMDIST\t\t= DISTRIB.IPERGEOM\t\t##\tRestituisce la distribuzione ipergeometrica\r\nINTERCEPT\t\t= INTERCETTA\t\t\t##\tRestituisce l'intercetta della retta di regressione lineare\r\nKURT\t\t\t= CURTOSI\t\t\t##\tRestituisce la curtosi di un insieme di dati\r\nLARGE\t\t\t= GRANDE\t\t\t##\tRestituisce il k-esimo valore più grande in un insieme di dati\r\nLINEST\t\t\t= REGR.LIN\t\t\t##\tRestituisce i parametri di una tendenza lineare\r\nLOGEST\t\t\t= REGR.LOG\t\t\t##\tRestituisce i parametri di una linea di tendenza esponenziale\r\nLOGINV\t\t\t= INV.LOGNORM\t\t\t##\tRestituisce l'inverso di una distribuzione lognormale\r\nLOGNORMDIST\t\t= DISTRIB.LOGNORM\t\t##\tRestituisce la distribuzione lognormale cumulativa\r\nMAX\t\t\t= MAX\t\t\t\t##\tRestituisce il valore massimo in un elenco di argomenti\r\nMAXA\t\t\t= MAX.VALORI\t\t\t##\tRestituisce il valore massimo in un elenco di argomenti, inclusi i numeri, il testo e i valori logici\r\nMEDIAN\t\t\t= MEDIANA\t\t\t##\tRestituisce la mediana dei numeri specificati\r\nMIN\t\t\t= MIN\t\t\t\t##\tRestituisce il valore minimo in un elenco di argomenti\r\nMINA\t\t\t= MIN.VALORI\t\t\t##\tRestituisce il più piccolo valore in un elenco di argomenti, inclusi i numeri, il testo e i valori logici\r\nMODE\t\t\t= MODA\t\t\t\t##\tRestituisce il valore più comune in un insieme di dati\r\nNEGBINOMDIST\t\t= DISTRIB.BINOM.NEG\t\t##\tRestituisce la distribuzione binomiale negativa\r\nNORMDIST\t\t= DISTRIB.NORM\t\t\t##\tRestituisce la distribuzione cumulativa normale\r\nNORMINV\t\t\t= INV.NORM\t\t\t##\tRestituisce l'inverso della distribuzione cumulativa normale standard\r\nNORMSDIST\t\t= DISTRIB.NORM.ST\t\t##\tRestituisce la distribuzione cumulativa normale standard\r\nNORMSINV\t\t= INV.NORM.ST\t\t\t##\tRestituisce l'inverso della distribuzione cumulativa normale\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tRestituisce il coefficiente del momento di correlazione di Pearson\r\nPERCENTILE\t\t= PERCENTILE\t\t\t##\tRestituisce il k-esimo dato percentile di valori in un intervallo\r\nPERCENTRANK\t\t= PERCENT.RANGO\t\t\t##\tRestituisce il rango di un valore in un insieme di dati come percentuale\r\nPERMUT\t\t\t= PERMUTAZIONE\t\t\t##\tRestituisce il numero delle permutazioni per un determinato numero di oggetti\r\nPOISSON\t\t\t= POISSON\t\t\t##\tRestituisce la distribuzione di Poisson\r\nPROB\t\t\t= PROBABILITÀ\t\t\t##\tCalcola la probabilità che dei valori in un intervallo siano compresi tra due limiti\r\nQUARTILE\t\t= QUARTILE\t\t\t##\tRestituisce il quartile di un insieme di dati\r\nRANK\t\t\t= RANGO\t\t\t\t##\tRestituisce il rango di un numero in un elenco di numeri\r\nRSQ\t\t\t= RQ\t\t\t\t##\tRestituisce la radice quadrata del coefficiente di momento di correlazione di Pearson\r\nSKEW\t\t\t= ASIMMETRIA\t\t\t##\tRestituisce il grado di asimmetria di una distribuzione\r\nSLOPE\t\t\t= PENDENZA\t\t\t##\tRestituisce la pendenza di una retta di regressione lineare\r\nSMALL\t\t\t= PICCOLO\t\t\t##\tRestituisce il k-esimo valore più piccolo in un insieme di dati\r\nSTANDARDIZE\t\t= NORMALIZZA\t\t\t##\tRestituisce un valore normalizzato\r\nSTDEV\t\t\t= DEV.ST\t\t\t##\tRestituisce una stima della deviazione standard sulla base di un campione\r\nSTDEVA\t\t\t= DEV.ST.VALORI\t\t\t##\tRestituisce una stima della deviazione standard sulla base di un campione, inclusi i numeri, il testo e i valori logici\r\nSTDEVP\t\t\t= DEV.ST.POP\t\t\t##\tCalcola la deviazione standard sulla base di un'intera popolazione\r\nSTDEVPA\t\t\t= DEV.ST.POP.VALORI\t\t##\tCalcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici\r\nSTEYX\t\t\t= ERR.STD.YX\t\t\t##\tRestituisce l'errore standard del valore previsto per y per ogni valore x nella regressione\r\nTDIST\t\t\t= DISTRIB.T\t\t\t##\tRestituisce la distribuzione t di Student\r\nTINV\t\t\t= INV.T\t\t\t\t##\tRestituisce l'inversa della distribuzione t di Student\r\nTREND\t\t\t= TENDENZA\t\t\t##\tRestituisce i valori lungo una linea di tendenza lineare\r\nTRIMMEAN\t\t= MEDIA.TRONCATA\t\t##\tRestituisce la media della parte interna di un insieme di dati\r\nTTEST\t\t\t= TEST.T\t\t\t##\tRestituisce la probabilità associata ad un test t di Student\r\nVAR\t\t\t= VAR\t\t\t\t##\tStima la varianza sulla base di un campione\r\nVARA\t\t\t= VAR.VALORI\t\t\t##\tStima la varianza sulla base di un campione, inclusi i numeri, il testo e i valori logici\r\nVARP\t\t\t= VAR.POP\t\t\t##\tCalcola la varianza sulla base dell'intera popolazione\r\nVARPA\t\t\t= VAR.POP.VALORI\t\t##\tCalcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tRestituisce la distribuzione di Weibull\r\nZTEST\t\t\t= TEST.Z\t\t\t##\tRestituisce il valore di probabilità a una coda per un test z\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tFunzioni di testo\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tModifica le lettere inglesi o il katakana a doppio byte all'interno di una stringa di caratteri in caratteri a singolo byte\r\nBAHTTEXT\t\t= BAHTTESTO\t\t\t##\tConverte un numero in testo, utilizzando il formato valuta ß (baht)\r\nCHAR\t\t\t= CODICE.CARATT\t\t\t##\tRestituisce il carattere specificato dal numero di codice\r\nCLEAN\t\t\t= LIBERA\t\t\t##\tElimina dal testo tutti i caratteri che non è possibile stampare\r\nCODE\t\t\t= CODICE\t\t\t##\tRestituisce il codice numerico del primo carattere di una stringa di testo\r\nCONCATENATE\t\t= CONCATENA\t\t\t##\tUnisce diversi elementi di testo in un unico elemento di testo\r\nDOLLAR\t\t\t= VALUTA\t\t\t##\tConverte un numero in testo, utilizzando il formato valuta € (euro)\r\nEXACT\t\t\t= IDENTICO\t\t\t##\tVerifica se due valori di testo sono uguali\r\nFIND\t\t\t= TROVA\t\t\t\t##\tRileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole)\r\nFINDB\t\t\t= TROVA.B\t\t\t##\tRileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole)\r\nFIXED\t\t\t= FISSO\t\t\t\t##\tFormatta un numero come testo con un numero fisso di decimali\r\nJIS\t\t\t= ORDINAMENTO.JIS\t\t##\tModifica le lettere inglesi o i caratteri katakana a byte singolo all'interno di una stringa di caratteri in caratteri a byte doppio.\r\nLEFT\t\t\t= SINISTRA\t\t\t##\tRestituisce il carattere più a sinistra di un valore di testo\r\nLEFTB\t\t\t= SINISTRA.B\t\t\t##\tRestituisce il carattere più a sinistra di un valore di testo\r\nLEN\t\t\t= LUNGHEZZA\t\t\t##\tRestituisce il numero di caratteri di una stringa di testo\r\nLENB\t\t\t= LUNB\t\t\t\t##\tRestituisce il numero di caratteri di una stringa di testo\r\nLOWER\t\t\t= MINUSC\t\t\t##\tConverte il testo in lettere minuscole\r\nMID\t\t\t= MEDIA\t\t\t\t##\tRestituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata\r\nMIDB\t\t\t= MEDIA.B\t\t\t##\tRestituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata\r\nPHONETIC\t\t= FURIGANA\t\t\t##\tEstrae i caratteri fonetici (furigana) da una stringa di testo.\r\nPROPER\t\t\t= MAIUSC.INIZ\t\t\t##\tConverte in maiuscolo la prima lettera di ogni parola di un valore di testo\r\nREPLACE\t\t\t= RIMPIAZZA\t\t\t##\tSostituisce i caratteri all'interno di un testo\r\nREPLACEB\t\t= SOSTITUISCI.B\t\t\t##\tSostituisce i caratteri all'interno di un testo\r\nREPT\t\t\t= RIPETI\t\t\t##\tRipete un testo per un dato numero di volte\r\nRIGHT\t\t\t= DESTRA\t\t\t##\tRestituisce il carattere più a destra di un valore di testo\r\nRIGHTB\t\t\t= DESTRA.B\t\t\t##\tRestituisce il carattere più a destra di un valore di testo\r\nSEARCH\t\t\t= RICERCA\t\t\t##\tRileva un valore di testo all'interno di un altro (non è sensibile alle maiuscole e minuscole)\r\nSEARCHB\t\t\t= CERCA.B\t\t\t##\tRileva un valore di testo all'interno di un altro (non è sensibile alle maiuscole e minuscole)\r\nSUBSTITUTE\t\t= SOSTITUISCI\t\t\t##\tSostituisce il nuovo testo al testo contenuto in una stringa\r\nT\t\t\t= T\t\t\t\t##\tConverte gli argomenti in testo\r\nTEXT\t\t\t= TESTO\t\t\t\t##\tFormatta un numero e lo converte in testo\r\nTRIM\t\t\t= ANNULLA.SPAZI\t\t\t##\tElimina gli spazi dal testo\r\nUPPER\t\t\t= MAIUSC\t\t\t##\tConverte il testo in lettere maiuscole\r\nVALUE\t\t\t= VALORE\t\t\t##\tConverte un argomento di testo in numero\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/nl/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= €\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #LEEG!\r\nDIV0\t= #DEEL/0!\r\nVALUE\t= #WAARDE!\r\nREF\t= #VERW!\r\nNAME\t= #NAAM?\r\nNUM\t= #GETAL!\r\nNA\t= #N/B\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/nl/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tAutomatiseringsfuncties en functies in invoegtoepassingen\r\n##\r\nGETPIVOTDATA\t\t= DRAAITABEL.OPHALEN\t\t##\tGeeft gegevens uit een draaitabelrapport als resultaat\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tKubusfuncties\r\n##\r\nCUBEKPIMEMBER\t\t= KUBUSKPILID\t\t\t##\tRetourneert de naam, eigenschap en waarde van een KPI (prestatie-indicator) en geeft de naam en de eigenschap in de cel weer. Een KPI is een meetbare waarde, zoals de maandelijkse brutowinst of de omzet per kwartaal per werknemer, die wordt gebruikt om de prestaties van een organisatie te bewaken\r\nCUBEMEMBER\t\t= KUBUSLID\t\t\t##\tRetourneert een lid of tupel in een kubushiërarchie. Wordt gebruikt om te controleren of het lid of de tupel in de kubus aanwezig is\r\nCUBEMEMBERPROPERTY\t= KUBUSLIDEIGENSCHAP\t\t##\tRetourneert de waarde van een lideigenschap in de kubus. Wordt gebruikt om te controleren of de lidnaam in de kubus bestaat en retourneert de opgegeven eigenschap voor dit lid\r\nCUBERANKEDMEMBER\t= KUBUSGERANGCHIKTLID\t\t##\tRetourneert het zoveelste, gerangschikte lid in een set. Wordt gebruikt om een of meer elementen in een set te retourneren, zoals de tien beste verkopers of de tien beste studenten\r\nCUBESET\t\t\t= KUBUSSET\t\t\t##\tDefinieert een berekende set leden of tupels door een ingestelde expressie naar de kubus op de server te sturen, alwaar de set wordt gemaakt en vervolgens wordt geretourneerd naar Microsoft Office Excel\r\nCUBESETCOUNT\t\t= KUBUSSETAANTAL\t\t##\tRetourneert het aantal onderdelen in een set\r\nCUBEVALUE\t\t= KUBUSWAARDE\t\t\t##\tRetourneert een samengestelde waarde van een kubus\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tDatabasefuncties\r\n##\r\nDAVERAGE\t\t= DBGEMIDDELDE\t\t\t##\tBerekent de gemiddelde waarde in geselecteerde databasegegevens\r\nDCOUNT\t\t\t= DBAANTAL\t\t\t##\tTelt de cellen met getallen in een database\r\nDCOUNTA\t\t\t= DBAANTALC\t\t\t##\tTelt de niet-lege cellen in een database\r\nDGET\t\t\t= DBLEZEN\t\t\t##\tRetourneert één record dat voldoet aan de opgegeven criteria uit een database\r\nDMAX\t\t\t= DBMAX\t\t\t\t##\tRetourneert de maximumwaarde in de geselecteerde databasegegevens\r\nDMIN\t\t\t= DBMIN\t\t\t\t##\tRetourneert de minimumwaarde in de geselecteerde databasegegevens\r\nDPRODUCT\t\t= DBPRODUCT\t\t\t##\tVermenigvuldigt de waarden in een bepaald veld van de records die voldoen aan de criteria in een database\r\nDSTDEV\t\t\t= DBSTDEV\t\t\t##\tMaakt een schatting van de standaarddeviatie op basis van een steekproef uit geselecteerde databasegegevens\r\nDSTDEVP\t\t\t= DBSTDEVP\t\t\t##\tBerekent de standaarddeviatie op basis van de volledige populatie van geselecteerde databasegegevens\r\nDSUM\t\t\t= DBSOM\t\t\t\t##\tTelt de getallen uit een kolom records in de database op die voldoen aan de criteria\r\nDVAR\t\t\t= DBVAR\t\t\t\t##\tMaakt een schatting van de variantie op basis van een steekproef uit geselecteerde databasegegevens\r\nDVARP\t\t\t= DBVARP\t\t\t##\tBerekent de variantie op basis van de volledige populatie van geselecteerde databasegegevens\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tDatum- en tijdfuncties\r\n##\r\nDATE\t\t\t= DATUM\t\t\t\t##\tGeeft als resultaat het seriële getal van een opgegeven datum\r\nDATEVALUE\t\t= DATUMWAARDE\t\t\t##\tConverteert een datum in de vorm van tekst naar een serieel getal\r\nDAY\t\t\t= DAG\t\t\t\t##\tConverteert een serieel getal naar een dag van de maand\r\nDAYS360\t\t\t= DAGEN360\t\t\t##\tBerekent het aantal dagen tussen twee datums op basis van een jaar met 360 dagen\r\nEDATE\t\t\t= ZELFDE.DAG\t\t\t##\tGeeft als resultaat het seriële getal van een datum die het opgegeven aantal maanden voor of na de begindatum ligt\r\nEOMONTH\t\t\t= LAATSTE.DAG\t\t\t##\tGeeft als resultaat het seriële getal van de laatste dag van de maand voor of na het opgegeven aantal maanden\r\nHOUR\t\t\t= UUR\t\t\t\t##\tConverteert een serieel getal naar uren\r\nMINUTE\t\t\t= MINUUT\t\t\t##\tConverteert een serieel naar getal minuten\r\nMONTH\t\t\t= MAAND\t\t\t\t##\tConverteert een serieel getal naar een maand\r\nNETWORKDAYS\t\t= NETTO.WERKDAGEN\t\t##\tGeeft als resultaat het aantal hele werkdagen tussen twee datums\r\nNOW\t\t\t= NU\t\t\t\t##\tGeeft als resultaat het seriële getal van de huidige datum en tijd\r\nSECOND\t\t\t= SECONDE\t\t\t##\tConverteert een serieel getal naar seconden\r\nTIME\t\t\t= TIJD\t\t\t\t##\tGeeft als resultaat het seriële getal van een bepaald tijdstip\r\nTIMEVALUE\t\t= TIJDWAARDE\t\t\t##\tConverteert de tijd in de vorm van tekst naar een serieel getal\r\nTODAY\t\t\t= VANDAAG\t\t\t##\tGeeft als resultaat het seriële getal van de huidige datum\r\nWEEKDAY\t\t\t= WEEKDAG\t\t\t##\tConverteert een serieel getal naar een weekdag\r\nWEEKNUM\t\t\t= WEEKNUMMER\t\t\t##\tConverteert een serieel getal naar een weeknummer\r\nWORKDAY\t\t\t= WERKDAG\t\t\t##\tGeeft als resultaat het seriële getal van de datum voor of na een bepaald aantal werkdagen\r\nYEAR\t\t\t= JAAR\t\t\t\t##\tConverteert een serieel getal naar een jaar\r\nYEARFRAC\t\t= JAAR.DEEL\t\t\t##\tGeeft als resultaat het gedeelte van het jaar, uitgedrukt in het aantal hele dagen tussen begindatum en einddatum\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tTechnische functies\r\n##\r\nBESSELI\t\t\t= BESSEL.Y\t\t\t##\tGeeft als resultaat de gewijzigde Bessel-functie In(x)\r\nBESSELJ\t\t\t= BESSEL.J\t\t\t##\tGeeft als resultaat de Bessel-functie Jn(x)\r\nBESSELK\t\t\t= BESSEL.K\t\t\t##\tGeeft als resultaat de gewijzigde Bessel-functie Kn(x)\r\nBESSELY\t\t\t= BESSEL.Y\t\t\t##\tGeeft als resultaat de gewijzigde Bessel-functie Yn(x)\r\nBIN2DEC\t\t\t= BIN.N.DEC\t\t\t##\tConverteert een binair getal naar een decimaal getal\r\nBIN2HEX\t\t\t= BIN.N.HEX\t\t\t##\tConverteert een binair getal naar een hexadecimaal getal\r\nBIN2OCT\t\t\t= BIN.N.OCT\t\t\t##\tConverteert een binair getal naar een octaal getal\r\nCOMPLEX\t\t\t= COMPLEX\t\t\t##\tConverteert reële en imaginaire coëfficiënten naar een complex getal\r\nCONVERT\t\t\t= CONVERTEREN\t\t\t##\tConverteert een getal in de ene maateenheid naar een getal in een andere maateenheid\r\nDEC2BIN\t\t\t= DEC.N.BIN\t\t\t##\tConverteert een decimaal getal naar een binair getal\r\nDEC2HEX\t\t\t= DEC.N.HEX\t\t\t##\tConverteert een decimaal getal naar een hexadecimaal getal\r\nDEC2OCT\t\t\t= DEC.N.OCT\t\t\t##\tConverteert een decimaal getal naar een octaal getal\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tTest of twee waarden gelijk zijn\r\nERF\t\t\t= FOUTFUNCTIE\t\t\t##\tGeeft als resultaat de foutfunctie\r\nERFC\t\t\t= FOUT.COMPLEMENT\t\t##\tGeeft als resultaat de complementaire foutfunctie\r\nGESTEP\t\t\t= GROTER.DAN\t\t\t##\tTest of een getal groter is dan de drempelwaarde\r\nHEX2BIN\t\t\t= HEX.N.BIN\t\t\t##\tConverteert een hexadecimaal getal naar een binair getal\r\nHEX2DEC\t\t\t= HEX.N.DEC\t\t\t##\tConverteert een hexadecimaal getal naar een decimaal getal\r\nHEX2OCT\t\t\t= HEX.N.OCT\t\t\t##\tConverteert een hexadecimaal getal naar een octaal getal\r\nIMABS\t\t\t= C.ABS\t\t\t\t##\tGeeft als resultaat de absolute waarde (modulus) van een complex getal\r\nIMAGINARY\t\t= C.IM.DEEL\t\t\t##\tGeeft als resultaat de imaginaire coëfficiënt van een complex getal\r\nIMARGUMENT\t\t= C.ARGUMENT\t\t\t##\tGeeft als resultaat het argument thèta, een hoek uitgedrukt in radialen\r\nIMCONJUGATE\t\t= C.TOEGEVOEGD\t\t\t##\tGeeft als resultaat het complexe toegevoegde getal van een complex getal\r\nIMCOS\t\t\t= C.COS\t\t\t\t##\tGeeft als resultaat de cosinus van een complex getal\r\nIMDIV\t\t\t= C.QUOTIENT\t\t\t##\tGeeft als resultaat het quotiënt van twee complexe getallen\r\nIMEXP\t\t\t= C.EXP\t\t\t\t##\tGeeft als resultaat de exponent van een complex getal\r\nIMLN\t\t\t= C.LN\t\t\t\t##\tGeeft als resultaat de natuurlijke logaritme van een complex getal\r\nIMLOG10\t\t\t= C.LOG10\t\t\t##\tGeeft als resultaat de logaritme met grondtal 10 van een complex getal\r\nIMLOG2\t\t\t= C.LOG2\t\t\t##\tGeeft als resultaat de logaritme met grondtal 2 van een complex getal\r\nIMPOWER\t\t\t= C.MACHT\t\t\t##\tGeeft als resultaat een complex getal dat is verheven tot de macht van een geheel getal\r\nIMPRODUCT\t\t= C.PRODUCT\t\t\t##\tGeeft als resultaat het product van complexe getallen\r\nIMREAL\t\t\t= C.REEEL.DEEL\t\t\t##\tGeeft als resultaat de reële coëfficiënt van een complex getal\r\nIMSIN\t\t\t= C.SIN\t\t\t\t##\tGeeft als resultaat de sinus van een complex getal\r\nIMSQRT\t\t\t= C.WORTEL\t\t\t##\tGeeft als resultaat de vierkantswortel van een complex getal\r\nIMSUB\t\t\t= C.VERSCHIL\t\t\t##\tGeeft als resultaat het verschil tussen twee complexe getallen\r\nIMSUM\t\t\t= C.SOM\t\t\t\t##\tGeeft als resultaat de som van complexe getallen\r\nOCT2BIN\t\t\t= OCT.N.BIN\t\t\t##\tConverteert een octaal getal naar een binair getal\r\nOCT2DEC\t\t\t= OCT.N.DEC\t\t\t##\tConverteert een octaal getal naar een decimaal getal\r\nOCT2HEX\t\t\t= OCT.N.HEX\t\t\t##\tConverteert een octaal getal naar een hexadecimaal getal\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFinanciële functies\r\n##\r\nACCRINT\t\t\t= SAMENG.RENTE\t\t\t##\tBerekent de opgelopen rente voor een waardepapier waarvan de rente periodiek wordt uitgekeerd\r\nACCRINTM\t\t= SAMENG.RENTE.V\t\t##\tBerekent de opgelopen rente voor een waardepapier waarvan de rente op de vervaldatum wordt uitgekeerd\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tGeeft als resultaat de afschrijving voor elke boekingsperiode door een afschrijvingscoëfficiënt toe te passen\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tBerekent de afschrijving voor elke boekingsperiode\r\nCOUPDAYBS\t\t= COUP.DAGEN.BB\t\t\t##\tBerekent het aantal dagen vanaf het begin van de coupontermijn tot de stortingsdatum\r\nCOUPDAYS\t\t= COUP.DAGEN\t\t\t##\tGeeft als resultaat het aantal dagen in de coupontermijn waarin de stortingsdatum valt\r\nCOUPDAYSNC\t\t= COUP.DAGEN.VV\t\t\t##\tGeeft als resultaat het aantal dagen vanaf de stortingsdatum tot de volgende couponvervaldatum\r\nCOUPNCD\t\t\t= COUP.DATUM.NB\t\t\t##\tGeeft als resultaat de volgende coupondatum na de stortingsdatum\r\nCOUPNUM\t\t\t= COUP.AANTAL\t\t\t##\tGeeft als resultaat het aantal coupons dat nog moet worden uitbetaald tussen de stortingsdatum en de vervaldatum\r\nCOUPPCD\t\t\t= COUP.DATUM.VB\t\t\t##\tGeeft als resultaat de vorige couponvervaldatum vóór de stortingsdatum\r\nCUMIPMT\t\t\t= CUM.RENTE\t\t\t##\tGeeft als resultaat de cumulatieve rente die tussen twee termijnen is uitgekeerd\r\nCUMPRINC\t\t= CUM.HOOFDSOM\t\t\t##\tGeeft als resultaat de cumulatieve hoofdsom van een lening die tussen twee termijnen is terugbetaald\r\nDB\t\t\t= DB\t\t\t\t##\tGeeft als resultaat de afschrijving van activa voor een bepaalde periode met behulp van de 'fixed declining balance'-methode\r\nDDB\t\t\t= DDB\t\t\t\t##\tGeeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'double declining balance'-methode of een andere methode die u opgeeft\r\nDISC\t\t\t= DISCONTO\t\t\t##\tGeeft als resultaat het discontopercentage voor een waardepapier\r\nDOLLARDE\t\t= EURO.DE\t\t\t##\tConverteert een prijs in euro's, uitgedrukt in een breuk, naar een prijs in euro's, uitgedrukt in een decimaal getal\r\nDOLLARFR\t\t= EURO.BR\t\t\t##\tConverteert een prijs in euro's, uitgedrukt in een decimaal getal, naar een prijs in euro's, uitgedrukt in een breuk\r\nDURATION\t\t= DUUR\t\t\t\t##\tGeeft als resultaat de gewogen gemiddelde looptijd voor een waardepapier met periodieke rentebetalingen\r\nEFFECT\t\t\t= EFFECT.RENTE\t\t\t##\tGeeft als resultaat het effectieve jaarlijkse rentepercentage\r\nFV\t\t\t= TW\t\t\t\t##\tGeeft als resultaat de toekomstige waarde van een investering\r\nFVSCHEDULE\t\t= TOEK.WAARDE2\t\t\t##\tGeeft als resultaat de toekomstige waarde van een bepaalde hoofdsom na het toepassen van een reeks samengestelde rentepercentages\r\nINTRATE\t\t\t= RENTEPERCENTAGE\t\t##\tGeeft als resultaat het rentepercentage voor een volgestort waardepapier\r\nIPMT\t\t\t= IBET\t\t\t\t##\tGeeft als resultaat de te betalen rente voor een investering over een bepaalde termijn\r\nIRR\t\t\t= IR\t\t\t\t##\tGeeft als resultaat de interne rentabiliteit voor een reeks cashflows\r\nISPMT\t\t\t= ISBET\t\t\t\t##\tGeeft als resultaat de rente die is betaald tijdens een bepaalde termijn van een investering\r\nMDURATION\t\t= AANG.DUUR\t\t\t##\tGeeft als resultaat de aangepaste Macauley-looptijd voor een waardepapier, aangenomen dat de nominale waarde € 100 bedraagt\r\nMIRR\t\t\t= GIR\t\t\t\t##\tGeeft als resultaat de interne rentabiliteit voor een serie cashflows, waarbij voor betalingen een ander rentepercentage geldt dan voor inkomsten\r\nNOMINAL\t\t\t= NOMINALE.RENTE\t\t##\tGeeft als resultaat het nominale jaarlijkse rentepercentage\r\nNPER\t\t\t= NPER\t\t\t\t##\tGeeft als resultaat het aantal termijnen van een investering\r\nNPV\t\t\t= NHW\t\t\t\t##\tGeeft als resultaat de netto huidige waarde van een investering op basis van een reeks periodieke cashflows en een discontopercentage\r\nODDFPRICE\t\t= AFW.ET.PRIJS\t\t\t##\tGeeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende eerste termijn\r\nODDFYIELD\t\t= AFW.ET.REND\t\t\t##\tGeeft als resultaat het rendement voor een waardepapier met een afwijkende eerste termijn\r\nODDLPRICE\t\t= AFW.LT.PRIJS\t\t\t##\tGeeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende laatste termijn\r\nODDLYIELD\t\t= AFW.LT.REND\t\t\t##\tGeeft als resultaat het rendement voor een waardepapier met een afwijkende laatste termijn\r\nPMT\t\t\t= BET\t\t\t\t##\tGeeft als resultaat de periodieke betaling voor een annuïteit\r\nPPMT\t\t\t= PBET\t\t\t\t##\tGeeft als resultaat de afbetaling op de hoofdsom voor een bepaalde termijn\r\nPRICE\t\t\t= PRIJS.NOM\t\t\t##\tGeeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente periodiek wordt uitgekeerd\r\nPRICEDISC\t\t= PRIJS.DISCONTO\t\t##\tGeeft als resultaat de prijs per € 100 nominale waarde voor een verdisconteerd waardepapier\r\nPRICEMAT\t\t= PRIJS.VERVALDAG\t\t##\tGeeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum\r\nPV\t\t\t= HW\t\t\t\t##\tGeeft als resultaat de huidige waarde van een investering\r\nRATE\t\t\t= RENTE\t\t\t\t##\tGeeft als resultaat het periodieke rentepercentage voor een annuïteit\r\nRECEIVED\t\t= OPBRENGST\t\t\t##\tGeeft als resultaat het bedrag dat op de vervaldatum wordt uitgekeerd voor een volgestort waardepapier\r\nSLN\t\t\t= LIN.AFSCHR\t\t\t##\tGeeft als resultaat de lineaire afschrijving van activa over één termijn\r\nSYD\t\t\t= SYD\t\t\t\t##\tGeeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'Sum-Of-Years-Digits'-methode\r\nTBILLEQ\t\t\t= SCHATK.OBL\t\t\t##\tGeeft als resultaat het rendement op schatkistpapier, dat op dezelfde manier wordt berekend als het rendement op obligaties\r\nTBILLPRICE\t\t= SCHATK.PRIJS\t\t\t##\tBepaalt de prijs per € 100 nominale waarde voor schatkistpapier\r\nTBILLYIELD\t\t= SCHATK.REND\t\t\t##\tBerekent het rendement voor schatkistpapier\r\nVDB\t\t\t= VDB\t\t\t\t##\tGeeft als resultaat de afschrijving van activa over een gehele of gedeeltelijke termijn met behulp van de 'declining balance'-methode\r\nXIRR\t\t\t= IR.SCHEMA\t\t\t##\tBerekent de interne rentabiliteit voor een betalingsschema van cashflows\r\nXNPV\t\t\t= NHW2\t\t\t\t##\tBerekent de huidige nettowaarde voor een betalingsschema van cashflows\r\nYIELD\t\t\t= RENDEMENT\t\t\t##\tGeeft als resultaat het rendement voor een waardepapier waarvan de rente periodiek wordt uitgekeerd\r\nYIELDDISC\t\t= REND.DISCONTO\t\t\t##\tGeeft als resultaat het jaarlijkse rendement voor een verdisconteerd waardepapier, bijvoorbeeld schatkistpapier\r\nYIELDMAT\t\t= REND.VERVAL\t\t\t##\tGeeft als resultaat het jaarlijkse rendement voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tInformatiefuncties\r\n##\r\nCELL\t\t\t= CEL\t\t\t\t##\tGeeft als resultaat informatie over de opmaak, locatie of inhoud van een cel\r\nERROR.TYPE\t\t= TYPE.FOUT\t\t\t##\tGeeft als resultaat een getal dat overeenkomt met een van de foutwaarden van Microsoft Excel\r\nINFO\t\t\t= INFO\t\t\t\t##\tGeeft als resultaat informatie over de huidige besturingsomgeving\r\nISBLANK\t\t\t= ISLEEG\t\t\t##\tGeeft als resultaat WAAR als de waarde leeg is\r\nISERR\t\t\t= ISFOUT2\t\t\t##\tGeeft als resultaat WAAR als de waarde een foutwaarde is, met uitzondering van #N/B\r\nISERROR\t\t\t= ISFOUT\t\t\t##\tGeeft als resultaat WAAR als de waarde een foutwaarde is\r\nISEVEN\t\t\t= IS.EVEN\t\t\t##\tGeeft als resultaat WAAR als het getal even is\r\nISLOGICAL\t\t= ISLOGISCH\t\t\t##\tGeeft als resultaat WAAR als de waarde een logische waarde is\r\nISNA\t\t\t= ISNB\t\t\t\t##\tGeeft als resultaat WAAR als de waarde de foutwaarde #N/B is\r\nISNONTEXT\t\t= ISGEENTEKST\t\t\t##\tGeeft als resultaat WAAR als de waarde geen tekst is\r\nISNUMBER\t\t= ISGETAL\t\t\t##\tGeeft als resultaat WAAR als de waarde een getal is\r\nISODD\t\t\t= IS.ONEVEN\t\t\t##\tGeeft als resultaat WAAR als het getal oneven is\r\nISREF\t\t\t= ISVERWIJZING\t\t\t##\tGeeft als resultaat WAAR als de waarde een verwijzing is\r\nISTEXT\t\t\t= ISTEKST\t\t\t##\tGeeft als resultaat WAAR als de waarde tekst is\r\nN\t\t\t= N\t\t\t\t##\tGeeft als resultaat een waarde die is geconverteerd naar een getal\r\nNA\t\t\t= NB\t\t\t\t##\tGeeft als resultaat de foutwaarde #N/B\r\nTYPE\t\t\t= TYPE\t\t\t\t##\tGeeft als resultaat een getal dat het gegevenstype van een waarde aangeeft\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tLogische functies\r\n##\r\nAND\t\t\t= EN\t\t\t\t##\tGeeft als resultaat WAAR als alle argumenten WAAR zijn\r\nFALSE\t\t\t= ONWAAR\t\t\t##\tGeeft als resultaat de logische waarde ONWAAR\r\nIF\t\t\t= ALS\t\t\t\t##\tGeeft een logische test aan\r\nIFERROR\t\t\t= ALS.FOUT\t\t\t##\tRetourneert een waarde die u opgeeft als een formule een fout oplevert, anders wordt het resultaat van de formule geretourneerd\r\nNOT\t\t\t= NIET\t\t\t\t##\tKeert de logische waarde van het argument om\r\nOR\t\t\t= OF\t\t\t\t##\tGeeft als resultaat WAAR als minimaal een van de argumenten WAAR is\r\nTRUE\t\t\t= WAAR\t\t\t\t##\tGeeft als resultaat de logische waarde WAAR\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tZoek- en verwijzingsfuncties\r\n##\r\nADDRESS\t\t\t= ADRES\t\t\t\t##\tGeeft als resultaat een verwijzing, in de vorm van tekst, naar één bepaalde cel in een werkblad\r\nAREAS\t\t\t= BEREIKEN\t\t\t##\tGeeft als resultaat het aantal bereiken in een verwijzing\r\nCHOOSE\t\t\t= KIEZEN\t\t\t##\tKiest een waarde uit een lijst met waarden\r\nCOLUMN\t\t\t= KOLOM\t\t\t\t##\tGeeft als resultaat het kolomnummer van een verwijzing\r\nCOLUMNS\t\t\t= KOLOMMEN\t\t\t##\tGeeft als resultaat het aantal kolommen in een verwijzing\r\nHLOOKUP\t\t\t= HORIZ.ZOEKEN\t\t\t##\tZoekt in de bovenste rij van een matrix naar een bepaalde waarde en geeft als resultaat de gevonden waarde in de opgegeven cel\r\nHYPERLINK\t\t= HYPERLINK\t\t\t##\tMaakt een snelkoppeling of een sprong waarmee een document wordt geopend dat is opgeslagen op een netwerkserver, een intranet of op internet\r\nINDEX\t\t\t= INDEX\t\t\t\t##\tKiest met een index een waarde uit een verwijzing of een matrix\r\nINDIRECT\t\t= INDIRECT\t\t\t##\tGeeft als resultaat een verwijzing die wordt aangegeven met een tekstwaarde\r\nLOOKUP\t\t\t= ZOEKEN\t\t\t##\tZoekt naar bepaalde waarden in een vector of een matrix\r\nMATCH\t\t\t= VERGELIJKEN\t\t\t##\tZoekt naar bepaalde waarden in een verwijzing of een matrix\r\nOFFSET\t\t\t= VERSCHUIVING\t\t\t##\tGeeft als resultaat een nieuwe verwijzing die is verschoven ten opzichte van een bepaalde verwijzing\r\nROW\t\t\t= RIJ\t\t\t\t##\tGeeft als resultaat het rijnummer van een verwijzing\r\nROWS\t\t\t= RIJEN\t\t\t\t##\tGeeft als resultaat het aantal rijen in een verwijzing\r\nRTD\t\t\t= RTG\t\t\t\t##\tHaalt realtimegegevens op uit een programma dat COM-automatisering (automatisering: een methode waarmee de ene toepassing objecten van een andere toepassing of ontwikkelprogramma kan besturen. Automatisering werd vroeger OLE-automatisering genoemd. Automatisering is een industrienorm die deel uitmaakt van het Component Object Model (COM).) ondersteunt\r\nTRANSPOSE\t\t= TRANSPONEREN\t\t\t##\tGeeft als resultaat de getransponeerde van een matrix\r\nVLOOKUP\t\t\t= VERT.ZOEKEN\t\t\t##\tZoekt in de meest linkse kolom van een matrix naar een bepaalde waarde en geeft als resultaat de waarde in de opgegeven cel\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tWiskundige en trigonometrische functies\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tGeeft als resultaat de absolute waarde van een getal\r\nACOS\t\t\t= BOOGCOS\t\t\t##\tGeeft als resultaat de boogcosinus van een getal\r\nACOSH\t\t\t= BOOGCOSH\t\t\t##\tGeeft als resultaat de inverse cosinus hyperbolicus van een getal\r\nASIN\t\t\t= BOOGSIN\t\t\t##\tGeeft als resultaat de boogsinus van een getal\r\nASINH\t\t\t= BOOGSINH\t\t\t##\tGeeft als resultaat de inverse sinus hyperbolicus van een getal\r\nATAN\t\t\t= BOOGTAN\t\t\t##\tGeeft als resultaat de boogtangens van een getal\r\nATAN2\t\t\t= BOOGTAN2\t\t\t##\tGeeft als resultaat de boogtangens van de x- en y-coördinaten\r\nATANH\t\t\t= BOOGTANH\t\t\t##\tGeeft als resultaat de inverse tangens hyperbolicus van een getal\r\nCEILING\t\t\t= AFRONDEN.BOVEN\t\t##\tRondt de absolute waarde van een getal naar boven af op het dichtstbijzijnde gehele getal of het dichtstbijzijnde significante veelvoud\r\nCOMBIN\t\t\t= COMBINATIES\t\t\t##\tGeeft als resultaat het aantal combinaties voor een bepaald aantal objecten\r\nCOS\t\t\t= COS\t\t\t\t##\tGeeft als resultaat de cosinus van een getal\r\nCOSH\t\t\t= COSH\t\t\t\t##\tGeeft als resultaat de cosinus hyperbolicus van een getal\r\nDEGREES\t\t\t= GRADEN\t\t\t##\tConverteert radialen naar graden\r\nEVEN\t\t\t= EVEN\t\t\t\t##\tRondt het getal af op het dichtstbijzijnde gehele even getal\r\nEXP\t\t\t= EXP\t\t\t\t##\tVerheft e tot de macht van een bepaald getal\r\nFACT\t\t\t= FACULTEIT\t\t\t##\tGeeft als resultaat de faculteit van een getal\r\nFACTDOUBLE\t\t= DUBBELE.FACULTEIT\t\t##\tGeeft als resultaat de dubbele faculteit van een getal\r\nFLOOR\t\t\t= AFRONDEN.BENEDEN\t\t##\tRondt de absolute waarde van een getal naar beneden af\r\nGCD\t\t\t= GGD\t\t\t\t##\tGeeft als resultaat de grootste gemene deler\r\nINT\t\t\t= INTEGER\t\t\t##\tRondt een getal naar beneden af op het dichtstbijzijnde gehele getal\r\nLCM\t\t\t= KGV\t\t\t\t##\tGeeft als resultaat het kleinste gemene veelvoud\r\nLN\t\t\t= LN\t\t\t\t##\tGeeft als resultaat de natuurlijke logaritme van een getal\r\nLOG\t\t\t= LOG\t\t\t\t##\tGeeft als resultaat de logaritme met het opgegeven grondtal van een getal\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tGeeft als resultaat de logaritme met grondtal 10 van een getal\r\nMDETERM\t\t\t= DETERMINANTMAT\t\t##\tGeeft als resultaat de determinant van een matrix\r\nMINVERSE\t\t= INVERSEMAT\t\t\t##\tGeeft als resultaat de inverse van een matrix\r\nMMULT\t\t\t= PRODUCTMAT\t\t\t##\tGeeft als resultaat het product van twee matrices\r\nMOD\t\t\t= REST\t\t\t\t##\tGeeft als resultaat het restgetal van een deling\r\nMROUND\t\t\t= AFRONDEN.N.VEELVOUD\t\t##\tGeeft als resultaat een getal afgerond op het gewenste veelvoud\r\nMULTINOMIAL\t\t= MULTINOMIAAL\t\t\t##\tGeeft als resultaat de multinomiaalcoëfficiënt van een reeks getallen\r\nODD\t\t\t= ONEVEN\t\t\t##\tRondt de absolute waarde van het getal naar boven af op het dichtstbijzijnde gehele oneven getal\r\nPI\t\t\t= PI\t\t\t\t##\tGeeft als resultaat de waarde van pi\r\nPOWER\t\t\t= MACHT\t\t\t\t##\tVerheft een getal tot een macht\r\nPRODUCT\t\t\t= PRODUCT\t\t\t##\tVermenigvuldigt de argumenten met elkaar\r\nQUOTIENT\t\t= QUOTIENT\t\t\t##\tGeeft als resultaat de uitkomst van een deling als geheel getal\r\nRADIANS\t\t\t= RADIALEN\t\t\t##\tConverteert graden naar radialen\r\nRAND\t\t\t= ASELECT\t\t\t##\tGeeft als resultaat een willekeurig getal tussen 0 en 1\r\nRANDBETWEEN\t\t= ASELECTTUSSEN\t\t\t##\tGeeft een willekeurig getal tussen de getallen die u hebt opgegeven\r\nROMAN\t\t\t= ROMEINS\t\t\t##\tConverteert een Arabisch getal naar een Romeins getal en geeft het resultaat weer in de vorm van tekst\r\nROUND\t\t\t= AFRONDEN\t\t\t##\tRondt een getal af op het opgegeven aantal decimalen\r\nROUNDDOWN\t\t= AFRONDEN.NAAR.BENEDEN\t\t##\tRondt de absolute waarde van een getal naar beneden af\r\nROUNDUP\t\t\t= AFRONDEN.NAAR.BOVEN\t\t##\tRondt de absolute waarde van een getal naar boven af\r\nSERIESSUM\t\t= SOM.MACHTREEKS\t\t##\tGeeft als resultaat de som van een machtreeks die is gebaseerd op de formule\r\nSIGN\t\t\t= POS.NEG\t\t\t##\tGeeft als resultaat het teken van een getal\r\nSIN\t\t\t= SIN\t\t\t\t##\tGeeft als resultaat de sinus van de opgegeven hoek\r\nSINH\t\t\t= SINH\t\t\t\t##\tGeeft als resultaat de sinus hyperbolicus van een getal\r\nSQRT\t\t\t= WORTEL\t\t\t##\tGeeft als resultaat de positieve vierkantswortel van een getal\r\nSQRTPI\t\t\t= WORTEL.PI\t\t\t##\tGeeft als resultaat de vierkantswortel van (getal * pi)\r\nSUBTOTAL\t\t= SUBTOTAAL\t\t\t##\tGeeft als resultaat een subtotaal voor een bereik\r\nSUM\t\t\t= SOM\t\t\t\t##\tTelt de argumenten op\r\nSUMIF\t\t\t= SOM.ALS\t\t\t##\tTelt de getallen bij elkaar op die voldoen aan een bepaald criterium\r\nSUMIFS\t\t\t= SOMMEN.ALS\t\t\t##\tTelt de cellen in een bereik op die aan meerdere criteria voldoen\r\nSUMPRODUCT\t\t= SOMPRODUCT\t\t\t##\tGeeft als resultaat de som van de producten van de corresponderende matrixelementen\r\nSUMSQ\t\t\t= KWADRATENSOM\t\t\t##\tGeeft als resultaat de som van de kwadraten van de argumenten\r\nSUMX2MY2\t\t= SOM.X2MINY2\t\t\t##\tGeeft als resultaat de som van het verschil tussen de kwadraten van corresponderende waarden in twee matrices\r\nSUMX2PY2\t\t= SOM.X2PLUSY2\t\t\t##\tGeeft als resultaat de som van de kwadratensom van corresponderende waarden in twee matrices\r\nSUMXMY2\t\t\t= SOM.XMINY.2\t\t\t##\tGeeft als resultaat de som van de kwadraten van de verschillen tussen de corresponderende waarden in twee matrices\r\nTAN\t\t\t= TAN\t\t\t\t##\tGeeft als resultaat de tangens van een getal\r\nTANH\t\t\t= TANH\t\t\t\t##\tGeeft als resultaat de tangens hyperbolicus van een getal\r\nTRUNC\t\t\t= GEHEEL\t\t\t##\tKapt een getal af tot een geheel getal\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tStatistische functies\r\n##\r\nAVEDEV\t\t\t= GEM.DEVIATIE\t\t\t##\tGeeft als resultaat het gemiddelde van de absolute deviaties van gegevenspunten ten opzichte van hun gemiddelde waarde\r\nAVERAGE\t\t\t= GEMIDDELDE\t\t\t##\tGeeft als resultaat het gemiddelde van de argumenten\r\nAVERAGEA\t\t= GEMIDDELDEA\t\t\t##\tGeeft als resultaat het gemiddelde van de argumenten, inclusief getallen, tekst en logische waarden\r\nAVERAGEIF\t\t= GEMIDDELDE.ALS\t\t##\tGeeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen in een bereik die voldoen aan de opgegeven criteria\r\nAVERAGEIFS\t\t= GEMIDDELDEN.ALS\t\t##\tGeeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen die aan meerdere criteria voldoen\r\nBETADIST\t\t= BETA.VERD\t\t\t##\tGeeft als resultaat de cumulatieve bèta-verdelingsfunctie\r\nBETAINV\t\t\t= BETA.INV\t\t\t##\tGeeft als resultaat de inverse van de cumulatieve verdelingsfunctie voor een gegeven bèta-verdeling\r\nBINOMDIST\t\t= BINOMIALE.VERD\t\t##\tGeeft als resultaat de binomiale verdeling\r\nCHIDIST\t\t\t= CHI.KWADRAAT\t\t\t##\tGeeft als resultaat de eenzijdige kans van de chi-kwadraatverdeling\r\nCHIINV\t\t\t= CHI.KWADRAAT.INV\t\t##\tGeeft als resultaat de inverse van een eenzijdige kans van de chi-kwadraatverdeling\r\nCHITEST\t\t\t= CHI.TOETS\t\t\t##\tGeeft als resultaat de onafhankelijkheidstoets\r\nCONFIDENCE\t\t= BETROUWBAARHEID\t\t##\tGeeft als resultaat het betrouwbaarheidsinterval van een gemiddelde waarde voor de elementen van een populatie\r\nCORREL\t\t\t= CORRELATIE\t\t\t##\tGeeft als resultaat de correlatiecoëfficiënt van twee gegevensverzamelingen\r\nCOUNT\t\t\t= AANTAL\t\t\t##\tTelt het aantal getallen in de argumentenlijst\r\nCOUNTA\t\t\t= AANTALARG\t\t\t##\tTelt het aantal waarden in de argumentenlijst\r\nCOUNTBLANK\t\t= AANTAL.LEGE.CELLEN\t\t##\tTelt het aantal lege cellen in een bereik\r\nCOUNTIF\t\t\t= AANTAL.ALS\t\t\t##\tTelt in een bereik het aantal cellen die voldoen aan een bepaald criterium\r\nCOUNTIFS\t\t= AANTALLEN.ALS\t\t\t##\tTelt in een bereik het aantal cellen die voldoen aan meerdere criteria\r\nCOVAR\t\t\t= COVARIANTIE\t\t\t##\tGeeft als resultaat de covariantie, het gemiddelde van de producten van de gepaarde deviaties\r\nCRITBINOM\t\t= CRIT.BINOM\t\t\t##\tGeeft als resultaat de kleinste waarde waarvoor de binomiale verdeling kleiner is dan of gelijk is aan het criterium\r\nDEVSQ\t\t\t= DEV.KWAD\t\t\t##\tGeeft als resultaat de som van de deviaties in het kwadraat\r\nEXPONDIST\t\t= EXPON.VERD\t\t\t##\tGeeft als resultaat de exponentiële verdeling\r\nFDIST\t\t\t= F.VERDELING\t\t\t##\tGeeft als resultaat de F-verdeling\r\nFINV\t\t\t= F.INVERSE\t\t\t##\tGeeft als resultaat de inverse van de F-verdeling\r\nFISHER\t\t\t= FISHER\t\t\t##\tGeeft als resultaat de Fisher-transformatie\r\nFISHERINV\t\t= FISHER.INV\t\t\t##\tGeeft als resultaat de inverse van de Fisher-transformatie\r\nFORECAST\t\t= VOORSPELLEN\t\t\t##\tGeeft als resultaat een waarde op basis van een lineaire trend\r\nFREQUENCY\t\t= FREQUENTIE\t\t\t##\tGeeft als resultaat een frequentieverdeling in de vorm van een verticale matrix\r\nFTEST\t\t\t= F.TOETS\t\t\t##\tGeeft als resultaat een F-toets\r\nGAMMADIST\t\t= GAMMA.VERD\t\t\t##\tGeeft als resultaat de gamma-verdeling\r\nGAMMAINV\t\t= GAMMA.INV\t\t\t##\tGeeft als resultaat de inverse van de cumulatieve gamma-verdeling\r\nGAMMALN\t\t\t= GAMMA.LN\t\t\t##\tGeeft als resultaat de natuurlijke logaritme van de gamma-functie, G(x)\r\nGEOMEAN\t\t\t= MEETK.GEM\t\t\t##\tGeeft als resultaat het meetkundige gemiddelde\r\nGROWTH\t\t\t= GROEI\t\t\t\t##\tGeeft als resultaat de waarden voor een exponentiële trend\r\nHARMEAN\t\t\t= HARM.GEM\t\t\t##\tGeeft als resultaat het harmonische gemiddelde\r\nHYPGEOMDIST\t\t= HYPERGEO.VERD\t\t\t##\tGeeft als resultaat de hypergeometrische verdeling\r\nINTERCEPT\t\t= SNIJPUNT\t\t\t##\tGeeft als resultaat het snijpunt van de lineaire regressielijn met de y-as\r\nKURT\t\t\t= KURTOSIS\t\t\t##\tGeeft als resultaat de kurtosis van een gegevensverzameling\r\nLARGE\t\t\t= GROOTSTE\t\t\t##\tGeeft als resultaat de op k-1 na grootste waarde in een gegevensverzameling\r\nLINEST\t\t\t= LIJNSCH\t\t\t##\tGeeft als resultaat de parameters van een lineaire trend\r\nLOGEST\t\t\t= LOGSCH\t\t\t##\tGeeft als resultaat de parameters van een exponentiële trend\r\nLOGINV\t\t\t= LOG.NORM.INV\t\t\t##\tGeeft als resultaat de inverse van de logaritmische normale verdeling\r\nLOGNORMDIST\t\t= LOG.NORM.VERD\t\t\t##\tGeeft als resultaat de cumulatieve logaritmische normale verdeling\r\nMAX\t\t\t= MAX\t\t\t\t##\tGeeft als resultaat de maximumwaarde in een lijst met argumenten\r\nMAXA\t\t\t= MAXA\t\t\t\t##\tGeeft als resultaat de maximumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden\r\nMEDIAN\t\t\t= MEDIAAN\t\t\t##\tGeeft als resultaat de mediaan van de opgegeven getallen\r\nMIN\t\t\t= MIN\t\t\t\t##\tGeeft als resultaat de minimumwaarde in een lijst met argumenten\r\nMINA\t\t\t= MINA\t\t\t\t##\tGeeft als resultaat de minimumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden\r\nMODE\t\t\t= MODUS\t\t\t\t##\tGeeft als resultaat de meest voorkomende waarde in een gegevensverzameling\r\nNEGBINOMDIST\t\t= NEG.BINOM.VERD\t\t##\tGeeft als resultaat de negatieve binomiaalverdeling\r\nNORMDIST\t\t= NORM.VERD\t\t\t##\tGeeft als resultaat de cumulatieve normale verdeling\r\nNORMINV\t\t\t= NORM.INV\t\t\t##\tGeeft als resultaat de inverse van de cumulatieve standaardnormale verdeling\r\nNORMSDIST\t\t= STAND.NORM.VERD\t\t##\tGeeft als resultaat de cumulatieve standaardnormale verdeling\r\nNORMSINV\t\t= STAND.NORM.INV\t\t##\tGeeft als resultaat de inverse van de cumulatieve normale verdeling\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tGeeft als resultaat de correlatiecoëfficiënt van Pearson\r\nPERCENTILE\t\t= PERCENTIEL\t\t\t##\tGeeft als resultaat het k-de percentiel van waarden in een bereik\r\nPERCENTRANK\t\t= PERCENT.RANG\t\t\t##\tGeeft als resultaat de positie, in procenten uitgedrukt, van een waarde in de rangorde van een gegevensverzameling\r\nPERMUT\t\t\t= PERMUTATIES\t\t\t##\tGeeft als resultaat het aantal permutaties voor een gegeven aantal objecten\r\nPOISSON\t\t\t= POISSON\t\t\t##\tGeeft als resultaat de Poisson-verdeling\r\nPROB\t\t\t= KANS\t\t\t\t##\tGeeft als resultaat de kans dat waarden zich tussen twee grenzen bevinden\r\nQUARTILE\t\t= KWARTIEL\t\t\t##\tGeeft als resultaat het kwartiel van een gegevensverzameling\r\nRANK\t\t\t= RANG\t\t\t\t##\tGeeft als resultaat het rangnummer van een getal in een lijst getallen\r\nRSQ\t\t\t= R.KWADRAAT\t\t\t##\tGeeft als resultaat het kwadraat van de Pearson-correlatiecoëfficiënt\r\nSKEW\t\t\t= SCHEEFHEID\t\t\t##\tGeeft als resultaat de mate van asymmetrie van een verdeling\r\nSLOPE\t\t\t= RICHTING\t\t\t##\tGeeft als resultaat de richtingscoëfficiënt van een lineaire regressielijn\r\nSMALL\t\t\t= KLEINSTE\t\t\t##\tGeeft als resultaat de op k-1 na kleinste waarde in een gegevensverzameling\r\nSTANDARDIZE\t\t= NORMALISEREN\t\t\t##\tGeeft als resultaat een genormaliseerde waarde\r\nSTDEV\t\t\t= STDEV\t\t\t\t##\tMaakt een schatting van de standaarddeviatie op basis van een steekproef\r\nSTDEVA\t\t\t= STDEVA\t\t\t##\tMaakt een schatting van de standaarddeviatie op basis van een steekproef, inclusief getallen, tekst en logische waarden\r\nSTDEVP\t\t\t= STDEVP\t\t\t##\tBerekent de standaarddeviatie op basis van de volledige populatie\r\nSTDEVPA\t\t\t= STDEVPA\t\t\t##\tBerekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden\r\nSTEYX\t\t\t= STAND.FOUT.YX\t\t\t##\tGeeft als resultaat de standaardfout in de voorspelde y-waarde voor elke x in een regressie\r\nTDIST\t\t\t= T.VERD\t\t\t##\tGeeft als resultaat de Student T-verdeling\r\nTINV\t\t\t= T.INV\t\t\t\t##\tGeeft als resultaat de inverse van de Student T-verdeling\r\nTREND\t\t\t= TREND\t\t\t\t##\tGeeft als resultaat de waarden voor een lineaire trend\r\nTRIMMEAN\t\t= GETRIMD.GEM\t\t\t##\tGeeft als resultaat het gemiddelde van waarden in een gegevensverzameling\r\nTTEST\t\t\t= T.TOETS\t\t\t##\tGeeft als resultaat de kans met behulp van de Student T-toets\r\nVAR\t\t\t= VAR\t\t\t\t##\tMaakt een schatting van de variantie op basis van een steekproef\r\nVARA\t\t\t= VARA\t\t\t\t##\tMaakt een schatting van de variantie op basis van een steekproef, inclusief getallen, tekst en logische waarden\r\nVARP\t\t\t= VARP\t\t\t\t##\tBerekent de variantie op basis van de volledige populatie\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tBerekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tGeeft als resultaat de Weibull-verdeling\r\nZTEST\t\t\t= Z.TOETS\t\t\t##\tGeeft als resultaat de eenzijdige kanswaarde van een Z-toets\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tTekstfuncties\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tWijzigt Nederlandse letters of katakanatekens over de volle breedte (dubbel-bytetekens) binnen een tekenreeks in tekens over de halve breedte (enkel-bytetekens)\r\nBAHTTEXT\t\t= BAHT.TEKST\t\t\t##\tConverteert een getal naar tekst met de valutanotatie ß (baht)\r\nCHAR\t\t\t= TEKEN\t\t\t\t##\tGeeft als resultaat het teken dat hoort bij de opgegeven code\r\nCLEAN\t\t\t= WISSEN.CONTROL\t\t##\tVerwijdert alle niet-afdrukbare tekens uit een tekst\r\nCODE\t\t\t= CODE\t\t\t\t##\tGeeft als resultaat de numerieke code voor het eerste teken in een tekenreeks\r\nCONCATENATE\t\t= TEKST.SAMENVOEGEN\t\t##\tVoegt verschillende tekstfragmenten samen tot één tekstfragment\r\nDOLLAR\t\t\t= EURO\t\t\t\t##\tConverteert een getal naar tekst met de valutanotatie € (euro)\r\nEXACT\t\t\t= GELIJK\t\t\t##\tControleert of twee tekenreeksen identiek zijn\r\nFIND\t\t\t= VIND.ALLES\t\t\t##\tZoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters)\r\nFINDB\t\t\t= VIND.ALLES.B\t\t\t##\tZoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters)\r\nFIXED\t\t\t= VAST\t\t\t\t##\tMaakt een getal als tekst met een vast aantal decimalen op\r\nJIS\t\t\t= JIS\t\t\t\t##\tWijzigt Nederlandse letters of katakanatekens over de halve breedte (enkel-bytetekens) binnen een tekenreeks in tekens over de volle breedte (dubbel-bytetekens)\r\nLEFT\t\t\t= LINKS\t\t\t\t##\tGeeft als resultaat de meest linkse tekens in een tekenreeks\r\nLEFTB\t\t\t= LINKSB\t\t\t##\tGeeft als resultaat de meest linkse tekens in een tekenreeks\r\nLEN\t\t\t= LENGTE\t\t\t##\tGeeft als resultaat het aantal tekens in een tekenreeks\r\nLENB\t\t\t= LENGTEB\t\t\t##\tGeeft als resultaat het aantal tekens in een tekenreeks\r\nLOWER\t\t\t= KLEINE.LETTERS\t\t##\tZet tekst om in kleine letters\r\nMID\t\t\t= MIDDEN\t\t\t##\tGeeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft\r\nMIDB\t\t\t= DEELB\t\t\t\t##\tGeeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft\r\nPHONETIC\t\t= FONETISCH\t\t\t##\tHaalt de fonetische tekens (furigana) uit een tekenreeks op\r\nPROPER\t\t\t= BEGINLETTERS\t\t\t##\tZet de eerste letter van elk woord in een tekst om in een hoofdletter\r\nREPLACE\t\t\t= VERVANG\t\t\t##\tVervangt tekens binnen een tekst\r\nREPLACEB\t\t= VERVANGENB\t\t\t##\tVervangt tekens binnen een tekst\r\nREPT\t\t\t= HERHALING\t\t\t##\tHerhaalt een tekst een aantal malen\r\nRIGHT\t\t\t= RECHTS\t\t\t##\tGeeft als resultaat de meest rechtse tekens in een tekenreeks\r\nRIGHTB\t\t\t= RECHTSB\t\t\t##\tGeeft als resultaat de meest rechtse tekens in een tekenreeks\r\nSEARCH\t\t\t= VIND.SPEC\t\t\t##\tZoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters)\r\nSEARCHB\t\t\t= VIND.SPEC.B\t\t\t##\tZoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters)\r\nSUBSTITUTE\t\t= SUBSTITUEREN\t\t\t##\tVervangt oude tekst door nieuwe tekst in een tekenreeks\r\nT\t\t\t= T\t\t\t\t##\tConverteert de argumenten naar tekst\r\nTEXT\t\t\t= TEKST\t\t\t\t##\tMaakt een getal op en converteert het getal naar tekst\r\nTRIM\t\t\t= SPATIES.WISSEN\t\t##\tVerwijdert de spaties uit een tekst\r\nUPPER\t\t\t= HOOFDLETTERS\t\t\t##\tZet tekst om in hoofdletters\r\nVALUE\t\t\t= WAARDE\t\t\t##\tConverteert tekst naar een getal\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/no/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= kr\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NULL!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #VERDI!\r\nREF\t= #REF!\r\nNAME\t= #NAVN?\r\nNUM\t= #NUM!\r\nNA\t= #I/T\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/no/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\t\tFunksjonene Tillegg og Automatisering\r\n##\r\nGETPIVOTDATA\t\t= HENTPIVOTDATA\t\t\t\t##\tReturnerer data som er lagret i en pivottabellrapport\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\t\tKubefunksjoner\r\n##\r\nCUBEKPIMEMBER\t\t= KUBEKPIMEDLEM\t\t\t\t##\tReturnerer navnet, egenskapen og målet for en viktig ytelsesindikator (KPI), og viser navnet og egenskapen i cellen. En KPI er en målbar enhet, for eksempel månedlig bruttoinntjening eller kvartalsvis inntjening per ansatt, og brukes til å overvåke ytelsen i en organisasjon.\r\nCUBEMEMBER\t\t= KUBEMEDLEM\t\t\t\t##\tReturnerer et medlem eller en tuppel i et kubehierarki. Brukes til å validere at medlemmet eller tuppelen finnes i kuben.\r\nCUBEMEMBERPROPERTY\t= KUBEMEDLEMEGENSKAP\t\t\t##\tReturnerer verdien til en medlemsegenskap i kuben. Brukes til å validere at et medlemsnavn finnes i kuben, og til å returnere den angitte egenskapen for dette medlemmet.\r\nCUBERANKEDMEMBER\t= KUBERANGERTMEDLEM\t\t\t##\tReturnerer det n-te, eller rangerte, medlemmet i et sett. Brukes til å returnere ett eller flere elementer i et sett, for eksempel de 10 beste studentene.\r\nCUBESET\t\t\t= KUBESETT\t\t\t\t##\tDefinerer et beregnet sett av medlemmer eller tuppeler ved å sende et settuttrykk til kuben på serveren, noe som oppretter settet og deretter returnerer dette settet til Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= KUBESETTANTALL\t\t\t##\tReturnerer antallet elementer i et sett.\r\nCUBEVALUE\t\t= KUBEVERDI\t\t\t\t##\tReturnerer en aggregert verdi fra en kube.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\t\tDatabasefunksjoner\r\n##\r\nDAVERAGE\t\t= DGJENNOMSNITT\t\t\t\t##\tReturnerer gjennomsnittet av merkede databaseposter\r\nDCOUNT\t\t\t= DANTALL\t\t\t\t##\tTeller celler som inneholder tall i en database\r\nDCOUNTA\t\t\t= DANTALLA\t\t\t\t##\tTeller celler som ikke er tomme i en database\r\nDGET\t\t\t= DHENT\t\t\t\t\t##\tTrekker ut fra en database en post som oppfyller angitte vilkår\r\nDMAX\t\t\t= DMAKS\t\t\t\t\t##\tReturnerer maksimumsverdien fra merkede databaseposter\r\nDMIN\t\t\t= DMIN\t\t\t\t\t##\tReturnerer minimumsverdien fra merkede databaseposter\r\nDPRODUCT\t\t= DPRODUKT\t\t\t\t##\tMultipliserer verdiene i et bestemt felt med poster som oppfyller vilkårene i en database\r\nDSTDEV\t\t\t= DSTDAV\t\t\t\t##\tEstimerer standardavviket basert på et utvalg av merkede databaseposter\r\nDSTDEVP\t\t\t= DSTAVP\t\t\t\t##\tBeregner standardavviket basert på at merkede databaseposter utgjør hele populasjonen\r\nDSUM\t\t\t= DSUMMER\t\t\t\t##\tLegger til tallene i feltkolonnen med poster, i databasen som oppfyller vilkårene\r\nDVAR\t\t\t= DVARIANS\t\t\t\t##\tEstimerer variansen basert på et utvalg av merkede databaseposter\r\nDVARP\t\t\t= DVARIANSP\t\t\t\t##\tBeregner variansen basert på at merkede databaseposter utgjør hele populasjonen\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\t\tDato- og tidsfunksjoner\r\n##\r\nDATE\t\t\t= DATO\t\t\t\t\t##\tReturnerer serienummeret som svarer til en bestemt dato\r\nDATEVALUE\t\t= DATOVERDI\t\t\t\t##\tKonverterer en dato med tekstformat til et serienummer\r\nDAY\t\t\t= DAG\t\t\t\t\t##\tKonverterer et serienummer til en dag i måneden\r\nDAYS360\t\t\t= DAGER360\t\t\t\t##\tBeregner antall dager mellom to datoer basert på et år med 360 dager\r\nEDATE\t\t\t= DAG.ETTER\t\t\t\t##\tReturnerer serienummeret som svarer til datoen som er det indikerte antall måneder før eller etter startdatoen\r\nEOMONTH\t\t\t= MÅNEDSSLUTT\t\t\t\t##\tReturnerer serienummeret som svarer til siste dag i måneden, før eller etter et angitt antall måneder\r\nHOUR\t\t\t= TIME\t\t\t\t\t##\tKonverterer et serienummer til en time\r\nMINUTE\t\t\t= MINUTT\t\t\t\t##\tKonverterer et serienummer til et minutt\r\nMONTH\t\t\t= MÅNED\t\t\t\t\t##\tKonverterer et serienummer til en måned\r\nNETWORKDAYS\t\t= NETT.ARBEIDSDAGER\t\t\t##\tReturnerer antall hele arbeidsdager mellom to datoer\r\nNOW\t\t\t= NÅ\t\t\t\t\t##\tReturnerer serienummeret som svarer til gjeldende dato og klokkeslett\r\nSECOND\t\t\t= SEKUND\t\t\t\t##\tKonverterer et serienummer til et sekund\r\nTIME\t\t\t= TID\t\t\t\t\t##\tReturnerer serienummeret som svarer til et bestemt klokkeslett\r\nTIMEVALUE\t\t= TIDSVERDI\t\t\t\t##\tKonverterer et klokkeslett i tekstformat til et serienummer\r\nTODAY\t\t\t= IDAG\t\t\t\t\t##\tReturnerer serienummeret som svarer til dagens dato\r\nWEEKDAY\t\t\t= UKEDAG\t\t\t\t##\tKonverterer et serienummer til en ukedag\r\nWEEKNUM\t\t\t= UKENR\t\t\t\t\t##\tKonverterer et serienummer til et tall som representerer hvilket nummer uken har i et år\r\nWORKDAY\t\t\t= ARBEIDSDAG\t\t\t\t##\tReturnerer serienummeret som svarer til datoen før eller etter et angitt antall arbeidsdager\r\nYEAR\t\t\t= ÅR\t\t\t\t\t##\tKonverterer et serienummer til et år\r\nYEARFRAC\t\t= ÅRDEL\t\t\t\t\t##\tReturnerer brøkdelen for året, som svarer til antall hele dager mellom startdato og sluttdato\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\t\tTekniske funksjoner\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t\t##\tReturnerer den endrede Bessel-funksjonen In(x)\r\nBESSELJ\t\t\t= BESSELJ\t\t\t\t##\tReturnerer Bessel-funksjonen Jn(x)\r\nBESSELK\t\t\t= BESSELK\t\t\t\t##\tReturnerer den endrede Bessel-funksjonen Kn(x)\r\nBESSELY\t\t\t= BESSELY\t\t\t\t##\tReturnerer Bessel-funksjonen Yn(x)\r\nBIN2DEC\t\t\t= BINTILDES\t\t\t\t##\tKonverterer et binært tall til et desimaltall\r\nBIN2HEX\t\t\t= BINTILHEKS\t\t\t\t##\tKonverterer et binært tall til et heksadesimaltall\r\nBIN2OCT\t\t\t= BINTILOKT\t\t\t\t##\tKonverterer et binært tall til et oktaltall\r\nCOMPLEX\t\t\t= KOMPLEKS\t\t\t\t##\tKonverterer reelle og imaginære koeffisienter til et komplekst tall\r\nCONVERT\t\t\t= KONVERTER\t\t\t\t##\tKonverterer et tall fra ett målsystem til et annet\r\nDEC2BIN\t\t\t= DESTILBIN\t\t\t\t##\tKonverterer et desimaltall til et binærtall\r\nDEC2HEX\t\t\t= DESTILHEKS\t\t\t\t##\tKonverterer et heltall i 10-tallsystemet til et heksadesimalt tall\r\nDEC2OCT\t\t\t= DESTILOKT\t\t\t\t##\tKonverterer et heltall i 10-tallsystemet til et oktaltall\r\nDELTA\t\t\t= DELTA\t\t\t\t\t##\tUndersøker om to verdier er like\r\nERF\t\t\t= FEILF\t\t\t\t\t##\tReturnerer feilfunksjonen\r\nERFC\t\t\t= FEILFK\t\t\t\t##\tReturnerer den komplementære feilfunksjonen\r\nGESTEP\t\t\t= GRENSEVERDI\t\t\t\t##\tTester om et tall er større enn en terskelverdi\r\nHEX2BIN\t\t\t= HEKSTILBIN\t\t\t\t##\tKonverterer et heksadesimaltall til et binært tall\r\nHEX2DEC\t\t\t= HEKSTILDES\t\t\t\t##\tKonverterer et heksadesimalt tall til et heltall i 10-tallsystemet\r\nHEX2OCT\t\t\t= HEKSTILOKT\t\t\t\t##\tKonverterer et heksadesimalt tall til et oktaltall\r\nIMABS\t\t\t= IMABS\t\t\t\t\t##\tReturnerer absoluttverdien (koeffisienten) til et komplekst tall\r\nIMAGINARY\t\t= IMAGINÆR\t\t\t\t##\tReturnerer den imaginære koeffisienten til et komplekst tall\r\nIMARGUMENT\t\t= IMARGUMENT\t\t\t\t##\tReturnerer argumentet theta, som er en vinkel uttrykt i radianer\r\nIMCONJUGATE\t\t= IMKONJUGERT\t\t\t\t##\tReturnerer den komplekse konjugaten til et komplekst tall\r\nIMCOS\t\t\t= IMCOS\t\t\t\t\t##\tReturnerer cosinus til et komplekst tall\r\nIMDIV\t\t\t= IMDIV\t\t\t\t\t##\tReturnerer kvotienten til to komplekse tall\r\nIMEXP\t\t\t= IMEKSP\t\t\t\t##\tReturnerer eksponenten til et komplekst tall\r\nIMLN\t\t\t= IMLN\t\t\t\t\t##\tReturnerer den naturlige logaritmen for et komplekst tall\r\nIMLOG10\t\t\t= IMLOG10\t\t\t\t##\tReturnerer logaritmen med grunntall 10 for et komplekst tall\r\nIMLOG2\t\t\t= IMLOG2\t\t\t\t##\tReturnerer logaritmen med grunntall 2 for et komplekst tall\r\nIMPOWER\t\t\t= IMOPPHØY\t\t\t\t##\tReturnerer et komplekst tall opphøyd til en heltallspotens\r\nIMPRODUCT\t\t= IMPRODUKT\t\t\t\t##\tReturnerer produktet av komplekse tall\r\nIMREAL\t\t\t= IMREELL\t\t\t\t##\tReturnerer den reelle koeffisienten til et komplekst tall\r\nIMSIN\t\t\t= IMSIN\t\t\t\t\t##\tReturnerer sinus til et komplekst tall\r\nIMSQRT\t\t\t= IMROT\t\t\t\t\t##\tReturnerer kvadratroten av et komplekst tall\r\nIMSUB\t\t\t= IMSUB\t\t\t\t\t##\tReturnerer differansen mellom to komplekse tall\r\nIMSUM\t\t\t= IMSUMMER\t\t\t\t##\tReturnerer summen av komplekse tall\r\nOCT2BIN\t\t\t= OKTTILBIN\t\t\t\t##\tKonverterer et oktaltall til et binært tall\r\nOCT2DEC\t\t\t= OKTTILDES\t\t\t\t##\tKonverterer et oktaltall til et desimaltall\r\nOCT2HEX\t\t\t= OKTTILHEKS\t\t\t\t##\tKonverterer et oktaltall til et heksadesimaltall\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\t\tØkonomiske funksjoner\r\n##\r\nACCRINT\t\t\t= PÅLØPT.PERIODISK.RENTE\t\t##\tReturnerer påløpte renter for et verdipapir som betaler periodisk rente\r\nACCRINTM\t\t= PÅLØPT.FORFALLSRENTE\t\t\t##\tReturnerer den påløpte renten for et verdipapir som betaler rente ved forfall\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t\t##\tReturnerer avskrivningen for hver regnskapsperiode ved hjelp av en avskrivingskoeffisient\r\nAMORLINC\t\t= AMORLINC\t\t\t\t##\tReturnerer avskrivingen for hver regnskapsperiode\r\nCOUPDAYBS\t\t= OBLIG.DAGER.FF\t\t\t##\tReturnerer antall dager fra begynnelsen av den rentebærende perioden til innløsningsdatoen\r\nCOUPDAYS\t\t= OBLIG.DAGER\t\t\t\t##\tReturnerer antall dager i den rentebærende perioden som inneholder innløsningsdatoen\r\nCOUPDAYSNC\t\t= OBLIG.DAGER.NF\t\t\t##\tReturnerer antall dager fra betalingsdato til neste renteinnbetalingsdato\r\nCOUPNCD\t\t\t= OBLIG.DAGER.EF\t\t\t##\tReturnerer obligasjonsdatoen som kommer etter oppgjørsdatoen\r\nCOUPNUM\t\t\t= OBLIG.ANTALL\t\t\t\t##\tReturnerer antall obligasjoner som skal betales mellom oppgjørsdatoen og forfallsdatoen\r\nCOUPPCD\t\t\t= OBLIG.DAG.FORRIGE\t\t\t##\tReturnerer obligasjonsdatoen som kommer før oppgjørsdatoen\r\nCUMIPMT\t\t\t= SAMLET.RENTE\t\t\t\t##\tReturnerer den kumulative renten som er betalt mellom to perioder\r\nCUMPRINC\t\t= SAMLET.HOVEDSTOL\t\t\t##\tReturnerer den kumulative hovedstolen som er betalt for et lån mellom to perioder\r\nDB\t\t\t= DAVSKR\t\t\t\t##\tReturnerer avskrivningen for et aktivum i en angitt periode, foretatt med fast degressiv avskrivning\r\nDDB\t\t\t= DEGRAVS\t\t\t\t##\tReturnerer avskrivningen for et aktivum for en gitt periode, ved hjelp av dobbel degressiv avskrivning eller en metode som du selv angir\r\nDISC\t\t\t= DISKONTERT\t\t\t\t##\tReturnerer diskonteringsraten for et verdipapir\r\nDOLLARDE\t\t= DOLLARDE\t\t\t\t##\tKonverterer en valutapris uttrykt som en brøk, til en valutapris uttrykt som et desimaltall\r\nDOLLARFR\t\t= DOLLARBR\t\t\t\t##\tKonverterer en valutapris uttrykt som et desimaltall, til en valutapris uttrykt som en brøk\r\nDURATION\t\t= VARIGHET\t\t\t\t##\tReturnerer årlig varighet for et verdipapir med renter som betales periodisk\r\nEFFECT\t\t\t= EFFEKTIV.RENTE\t\t\t##\tReturnerer den effektive årlige rentesatsen\r\nFV\t\t\t= SLUTTVERDI\t\t\t\t##\tReturnerer fremtidig verdi for en investering\r\nFVSCHEDULE\t\t= SVPLAN\t\t\t\t##\tReturnerer den fremtidige verdien av en inngående hovedstol etter å ha anvendt en serie med sammensatte rentesatser\r\nINTRATE\t\t\t= RENTESATS\t\t\t\t##\tReturnerer rentefoten av et fullfinansiert verdipapir\r\nIPMT\t\t\t= RAVDRAG\t\t\t\t##\tReturnerer betalte renter på en investering for en gitt periode\r\nIRR\t\t\t= IR\t\t\t\t\t##\tReturnerer internrenten for en serie kontantstrømmer\r\nISPMT\t\t\t= ER.AVDRAG\t\t\t\t##\tBeregner renten som er betalt for en investering i løpet av en bestemt periode\r\nMDURATION\t\t= MVARIGHET\t\t\t\t##\tReturnerer Macauleys modifiserte varighet for et verdipapir med en antatt pålydende verdi på kr 100,00\r\nMIRR\t\t\t= MODIR\t\t\t\t\t##\tReturnerer internrenten der positive og negative kontantstrømmer finansieres med forskjellige satser\r\nNOMINAL\t\t\t= NOMINELL\t\t\t\t##\tReturnerer årlig nominell rentesats\r\nNPER\t\t\t= PERIODER\t\t\t\t##\tReturnerer antall perioder for en investering\r\nNPV\t\t\t= NNV\t\t\t\t\t##\tReturnerer netto nåverdi for en investering, basert på en serie periodiske kontantstrømmer og en rentesats\r\nODDFPRICE\t\t= AVVIKFP.PRIS\t\t\t\t##\tReturnerer pris pålydende kr 100 for et verdipapir med en odde første periode\r\nODDFYIELD\t\t= AVVIKFP.AVKASTNING\t\t\t##\tReturnerer avkastingen for et verdipapir med en odde første periode\r\nODDLPRICE\t\t= AVVIKSP.PRIS\t\t\t\t##\tReturnerer pris pålydende kr 100 for et verdipapir med en odde siste periode\r\nODDLYIELD\t\t= AVVIKSP.AVKASTNING\t\t\t##\tReturnerer avkastingen for et verdipapir med en odde siste periode\r\nPMT\t\t\t= AVDRAG\t\t\t\t##\tReturnerer periodisk betaling for en annuitet\r\nPPMT\t\t\t= AMORT\t\t\t\t\t##\tReturnerer betalingen på hovedstolen for en investering i en gitt periode\r\nPRICE\t\t\t= PRIS\t\t\t\t\t##\tReturnerer prisen per pålydende kr 100 for et verdipapir som gir periodisk avkastning\r\nPRICEDISC\t\t= PRIS.DISKONTERT\t\t\t##\tReturnerer prisen per pålydende kr 100 for et diskontert verdipapir\r\nPRICEMAT\t\t= PRIS.FORFALL\t\t\t\t##\tReturnerer prisen per pålydende kr 100 av et verdipapir som betaler rente ved forfall\r\nPV\t\t\t= NÅVERDI\t\t\t\t##\tReturnerer nåverdien av en investering\r\nRATE\t\t\t= RENTE\t\t\t\t\t##\tReturnerer rentesatsen per periode for en annuitet\r\nRECEIVED\t\t= MOTTATT.AVKAST\t\t\t##\tReturnerer summen som mottas ved forfallsdato for et fullinvestert verdipapir\r\nSLN\t\t\t= LINAVS\t\t\t\t##\tReturnerer den lineære avskrivningen for et aktivum i én periode\r\nSYD\t\t\t= ÅRSAVS\t\t\t\t##\tReturnerer årsavskrivningen for et aktivum i en angitt periode\r\nTBILLEQ\t\t\t= TBILLEKV\t\t\t\t##\tReturnerer den obligasjonsekvivalente avkastningen for en statsobligasjon\r\nTBILLPRICE\t\t= TBILLPRIS\t\t\t\t##\tReturnerer prisen per pålydende kr 100 for en statsobligasjon\r\nTBILLYIELD\t\t= TBILLAVKASTNING\t\t\t##\tReturnerer avkastningen til en statsobligasjon\r\nVDB\t\t\t= VERDIAVS\t\t\t\t##\tReturnerer avskrivningen for et aktivum i en angitt periode eller delperiode, ved hjelp av degressiv avskrivning\r\nXIRR\t\t\t= XIR\t\t\t\t\t##\tReturnerer internrenten for en serie kontantstrømmer som ikke nødvendigvis er periodiske\r\nXNPV\t\t\t= XNNV\t\t\t\t\t##\tReturnerer netto nåverdi for en serie kontantstrømmer som ikke nødvendigvis er periodiske\r\nYIELD\t\t\t= AVKAST\t\t\t\t##\tReturnerer avkastningen på et verdipapir som betaler periodisk rente\r\nYIELDDISC\t\t= AVKAST.DISKONTERT\t\t\t##\tReturnerer årlig avkastning for et diskontert verdipapir, for eksempel en statskasseveksel\r\nYIELDMAT\t\t= AVKAST.FORFALL\t\t\t##\tReturnerer den årlige avkastningen for et verdipapir som betaler rente ved forfallsdato\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\t\tInformasjonsfunksjoner\r\n##\r\nCELL\t\t\t= CELLE\t\t\t\t\t##\tReturnerer informasjon om formatering, plassering eller innholdet til en celle\r\nERROR.TYPE\t\t= FEIL.TYPE\t\t\t\t##\tReturnerer et tall som svarer til en feiltype\r\nINFO\t\t\t= INFO\t\t\t\t\t##\tReturnerer informasjon om gjeldende operativmiljø\r\nISBLANK\t\t\t= ERTOM\t\t\t\t\t##\tReturnerer SANN hvis verdien er tom\r\nISERR\t\t\t= ERFEIL\t\t\t\t##\tReturnerer SANN hvis verdien er en hvilken som helst annen feilverdi enn #I/T\r\nISERROR\t\t\t= ERFEIL\t\t\t\t##\tReturnerer SANN hvis verdien er en hvilken som helst feilverdi\r\nISEVEN\t\t\t= ERPARTALL\t\t\t\t##\tReturnerer SANN hvis tallet er et partall\r\nISLOGICAL\t\t= ERLOGISK\t\t\t\t##\tReturnerer SANN hvis verdien er en logisk verdi\r\nISNA\t\t\t= ERIT\t\t\t\t\t##\tReturnerer SANN hvis verdien er feilverdien #I/T\r\nISNONTEXT\t\t= ERIKKETEKST\t\t\t\t##\tReturnerer SANN hvis verdien ikke er tekst\r\nISNUMBER\t\t= ERTALL\t\t\t\t##\tReturnerer SANN hvis verdien er et tall\r\nISODD\t\t\t= ERODDETALL\t\t\t\t##\tReturnerer SANN hvis tallet er et oddetall\r\nISREF\t\t\t= ERREF\t\t\t\t\t##\tReturnerer SANN hvis verdien er en referanse\r\nISTEXT\t\t\t= ERTEKST\t\t\t\t##\tReturnerer SANN hvis verdien er tekst\r\nN\t\t\t= N\t\t\t\t\t##\tReturnerer en verdi som er konvertert til et tall\r\nNA\t\t\t= IT\t\t\t\t\t##\tReturnerer feilverdien #I/T\r\nTYPE\t\t\t= VERDITYPE\t\t\t\t##\tReturnerer et tall som indikerer datatypen til en verdi\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\t\tLogiske funksjoner\r\n##\r\nAND\t\t\t= OG\t\t\t\t\t##\tReturnerer SANN hvis alle argumentene er lik SANN\r\nFALSE\t\t\t= USANN\t\t\t\t\t##\tReturnerer den logiske verdien USANN\r\nIF\t\t\t= HVIS\t\t\t\t\t##\tAngir en logisk test som skal utføres\r\nIFERROR\t\t\t= HVISFEIL\t\t\t\t##\tReturnerer en verdi du angir hvis en formel evaluerer til en feil. Ellers returnerer den resultatet av formelen.\r\nNOT\t\t\t= IKKE\t\t\t\t\t##\tReverserer logikken til argumentet\r\nOR\t\t\t= ELLER\t\t\t\t\t##\tReturnerer SANN hvis ett eller flere argumenter er lik SANN\r\nTRUE\t\t\t= SANN\t\t\t\t\t##\tReturnerer den logiske verdien SANN\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\t\tOppslag- og referansefunksjoner\r\n##\r\nADDRESS\t\t\t= ADRESSE\t\t\t\t##\tReturnerer en referanse som tekst til en enkelt celle i et regneark\r\nAREAS\t\t\t= OMRÅDER\t\t\t\t##\tReturnerer antall områder i en referanse\r\nCHOOSE\t\t\t= VELG\t\t\t\t\t##\tVelger en verdi fra en liste med verdier\r\nCOLUMN\t\t\t= KOLONNE\t\t\t\t##\tReturnerer kolonnenummeret for en referanse\r\nCOLUMNS\t\t\t= KOLONNER\t\t\t\t##\tReturnerer antall kolonner i en referanse\r\nHLOOKUP\t\t\t= FINN.KOLONNE\t\t\t\t##\tLeter i den øverste raden i en matrise og returnerer verdien for den angitte cellen\r\nHYPERLINK\t\t= HYPERKOBLING\t\t\t\t##\tOppretter en snarvei eller et hopp som åpner et dokument som er lagret på en nettverksserver, et intranett eller Internett\r\nINDEX\t\t\t= INDEKS\t\t\t\t##\tBruker en indeks til å velge en verdi fra en referanse eller matrise\r\nINDIRECT\t\t= INDIREKTE\t\t\t\t##\tReturnerer en referanse angitt av en tekstverdi\r\nLOOKUP\t\t\t= SLÅ.OPP\t\t\t\t##\tSlår opp verdier i en vektor eller matrise\r\nMATCH\t\t\t= SAMMENLIGNE\t\t\t\t##\tSlår opp verdier i en referanse eller matrise\r\nOFFSET\t\t\t= FORSKYVNING\t\t\t\t##\tReturnerer en referanseforskyvning fra en gitt referanse\r\nROW\t\t\t= RAD\t\t\t\t\t##\tReturnerer radnummeret for en referanse\r\nROWS\t\t\t= RADER\t\t\t\t\t##\tReturnerer antall rader i en referanse\r\nRTD\t\t\t= RTD\t\t\t\t\t##\tHenter sanntidsdata fra et program som støtter COM-automatisering (automatisering: En måte å arbeide på med programobjekter fra et annet program- eller utviklingsverktøy. Tidligere kalt OLE-automatisering. Automatisering er en bransjestandard og en funksjon i Component Object Model (COM).)\r\nTRANSPOSE\t\t= TRANSPONER\t\t\t\t##\tReturnerer transponeringen av en matrise\r\nVLOOKUP\t\t\t= FINN.RAD\t\t\t\t##\tLeter i den første kolonnen i en matrise og flytter bortover raden for å returnere verdien til en celle\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\t\tMatematikk- og trigonometrifunksjoner\r\n##\r\nABS\t\t\t= ABS\t\t\t\t\t##\tReturnerer absoluttverdien til et tall\r\nACOS\t\t\t= ARCCOS\t\t\t\t##\tReturnerer arcus cosinus til et tall\r\nACOSH\t\t\t= ARCCOSH\t\t\t\t##\tReturnerer den inverse hyperbolske cosinus til et tall\r\nASIN\t\t\t= ARCSIN\t\t\t\t##\tReturnerer arcus sinus til et tall\r\nASINH\t\t\t= ARCSINH\t\t\t\t##\tReturnerer den inverse hyperbolske sinus til et tall\r\nATAN\t\t\t= ARCTAN\t\t\t\t##\tReturnerer arcus tangens til et tall\r\nATAN2\t\t\t= ARCTAN2\t\t\t\t##\tReturnerer arcus tangens fra x- og y-koordinater\r\nATANH\t\t\t= ARCTANH\t\t\t\t##\tReturnerer den inverse hyperbolske tangens til et tall\r\nCEILING\t\t\t= AVRUND.GJELDENDE.MULTIPLUM\t\t##\tRunder av et tall til nærmeste heltall eller til nærmeste signifikante multiplum\r\nCOMBIN\t\t\t= KOMBINASJON\t\t\t\t##\tReturnerer antall kombinasjoner for ett gitt antall objekter\r\nCOS\t\t\t= COS\t\t\t\t\t##\tReturnerer cosinus til et tall\r\nCOSH\t\t\t= COSH\t\t\t\t\t##\tReturnerer den hyperbolske cosinus til et tall\r\nDEGREES\t\t\t= GRADER\t\t\t\t##\tKonverterer radianer til grader\r\nEVEN\t\t\t= AVRUND.TIL.PARTALL\t\t\t##\tRunder av et tall oppover til nærmeste heltall som er et partall\r\nEXP\t\t\t= EKSP\t\t\t\t\t##\tReturnerer e opphøyd i en angitt potens\r\nFACT\t\t\t= FAKULTET\t\t\t\t##\tReturnerer fakultet til et tall\r\nFACTDOUBLE\t\t= DOBBELFAKT\t\t\t\t##\tReturnerer et talls doble fakultet\r\nFLOOR\t\t\t= AVRUND.GJELDENDE.MULTIPLUM.NED\t##\tAvrunder et tall nedover, mot null\r\nGCD\t\t\t= SFF\t\t\t\t\t##\tReturnerer høyeste felles divisor\r\nINT\t\t\t= HELTALL\t\t\t\t##\tAvrunder et tall nedover til nærmeste heltall\r\nLCM\t\t\t= MFM\t\t\t\t\t##\tReturnerer minste felles multiplum\r\nLN\t\t\t= LN\t\t\t\t\t##\tReturnerer den naturlige logaritmen til et tall\r\nLOG\t\t\t= LOG\t\t\t\t\t##\tReturnerer logaritmen for et tall til et angitt grunntall\r\nLOG10\t\t\t= LOG10\t\t\t\t\t##\tReturnerer logaritmen med grunntall 10 for et tall\r\nMDETERM\t\t\t= MDETERM\t\t\t\t##\tReturnerer matrisedeterminanten til en matrise\r\nMINVERSE\t\t= MINVERS\t\t\t\t##\tReturnerer den inverse matrisen til en matrise\r\nMMULT\t\t\t= MMULT\t\t\t\t\t##\tReturnerer matriseproduktet av to matriser\r\nMOD\t\t\t= REST\t\t\t\t\t##\tReturnerer resten fra en divisjon\r\nMROUND\t\t\t= MRUND\t\t\t\t\t##\tReturnerer et tall avrundet til det ønskede multiplum\r\nMULTINOMIAL\t\t= MULTINOMINELL\t\t\t\t##\tReturnerer det multinominelle for et sett med tall\r\nODD\t\t\t= AVRUND.TIL.ODDETALL\t\t\t##\tRunder av et tall oppover til nærmeste heltall som er et oddetall\r\nPI\t\t\t= PI\t\t\t\t\t##\tReturnerer verdien av pi\r\nPOWER\t\t\t= OPPHØYD.I\t\t\t\t##\tReturnerer resultatet av et tall opphøyd i en potens\r\nPRODUCT\t\t\t= PRODUKT\t\t\t\t##\tMultipliserer argumentene\r\nQUOTIENT\t\t= KVOTIENT\t\t\t\t##\tReturnerer heltallsdelen av en divisjon\r\nRADIANS\t\t\t= RADIANER\t\t\t\t##\tKonverterer grader til radianer\r\nRAND\t\t\t= TILFELDIG\t\t\t\t##\tReturnerer et tilfeldig tall mellom 0 og 1\r\nRANDBETWEEN\t\t= TILFELDIGMELLOM\t\t\t##\tReturnerer et tilfeldig tall innenfor et angitt område\r\nROMAN\t\t\t= ROMERTALL\t\t\t\t##\tKonverterer vanlige tall til romertall, som tekst\r\nROUND\t\t\t= AVRUND\t\t\t\t##\tAvrunder et tall til et angitt antall sifre\r\nROUNDDOWN\t\t= AVRUND.NED\t\t\t\t##\tAvrunder et tall nedover, mot null\r\nROUNDUP\t\t\t= AVRUND.OPP\t\t\t\t##\tRunder av et tall oppover, bort fra null\r\nSERIESSUM\t\t= SUMMER.REKKE\t\t\t\t##\tReturnerer summen av en geometrisk rekke, basert på formelen\r\nSIGN\t\t\t= FORTEGN\t\t\t\t##\tReturnerer fortegnet for et tall\r\nSIN\t\t\t= SIN\t\t\t\t\t##\tReturnerer sinus til en gitt vinkel\r\nSINH\t\t\t= SINH\t\t\t\t\t##\tReturnerer den hyperbolske sinus til et tall\r\nSQRT\t\t\t= ROT\t\t\t\t\t##\tReturnerer en positiv kvadratrot\r\nSQRTPI\t\t\t= ROTPI\t\t\t\t\t##\tReturnerer kvadratroten av (tall * pi)\r\nSUBTOTAL\t\t= DELSUM\t\t\t\t##\tReturnerer en delsum i en liste eller database\r\nSUM\t\t\t= SUMMER\t\t\t\t##\tLegger sammen argumentene\r\nSUMIF\t\t\t= SUMMERHVIS\t\t\t\t##\tLegger sammen cellene angitt ved et gitt vilkår\r\nSUMIFS\t\t\t= SUMMER.HVIS.SETT\t\t\t##\tLegger sammen cellene i et område som oppfyller flere vilkår\r\nSUMPRODUCT\t\t= SUMMERPRODUKT\t\t\t\t##\tReturnerer summen av produktene av tilsvarende matrisekomponenter\r\nSUMSQ\t\t\t= SUMMERKVADRAT\t\t\t\t##\tReturnerer kvadratsummen av argumentene\r\nSUMX2MY2\t\t= SUMMERX2MY2\t\t\t\t##\tReturnerer summen av differansen av kvadratene for tilsvarende verdier i to matriser\r\nSUMX2PY2\t\t= SUMMERX2PY2\t\t\t\t##\tReturnerer summen av kvadratsummene for tilsvarende verdier i to matriser\r\nSUMXMY2\t\t\t= SUMMERXMY2\t\t\t\t##\tReturnerer summen av kvadratene av differansen for tilsvarende verdier i to matriser\r\nTAN\t\t\t= TAN\t\t\t\t\t##\tReturnerer tangens for et tall\r\nTANH\t\t\t= TANH\t\t\t\t\t##\tReturnerer den hyperbolske tangens for et tall\r\nTRUNC\t\t\t= AVKORT\t\t\t\t##\tKorter av et tall til et heltall\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\t\tStatistiske funksjoner\r\n##\r\nAVEDEV\t\t\t= GJENNOMSNITTSAVVIK\t\t\t##\tReturnerer datapunktenes gjennomsnittlige absoluttavvik fra middelverdien\r\nAVERAGE\t\t\t= GJENNOMSNITT\t\t\t\t##\tReturnerer gjennomsnittet for argumentene\r\nAVERAGEA\t\t= GJENNOMSNITTA\t\t\t\t##\tReturnerer gjennomsnittet for argumentene, inkludert tall, tekst og logiske verdier\r\nAVERAGEIF\t\t= GJENNOMSNITTHVIS\t\t\t##\tReturnerer gjennomsnittet (aritmetisk gjennomsnitt) av alle cellene i et område som oppfyller et bestemt vilkår\r\nAVERAGEIFS\t\t= GJENNOMSNITT.HVIS.SETT\t\t##\tReturnerer gjennomsnittet (aritmetisk middelverdi) av alle celler som oppfyller flere vilkår.\r\nBETADIST\t\t= BETA.FORDELING\t\t\t##\tReturnerer den kumulative betafordelingsfunksjonen\r\nBETAINV\t\t\t= INVERS.BETA.FORDELING\t\t\t##\tReturnerer den inverse verdien til fordelingsfunksjonen for en angitt betafordeling\r\nBINOMDIST\t\t= BINOM.FORDELING\t\t\t##\tReturnerer den individuelle binomiske sannsynlighetsfordelingen\r\nCHIDIST\t\t\t= KJI.FORDELING\t\t\t\t##\tReturnerer den ensidige sannsynligheten for en kjikvadrert fordeling\r\nCHIINV\t\t\t= INVERS.KJI.FORDELING\t\t\t##\tReturnerer den inverse av den ensidige sannsynligheten for den kjikvadrerte fordelingen\r\nCHITEST\t\t\t= KJI.TEST\t\t\t\t##\tUtfører testen for uavhengighet\r\nCONFIDENCE\t\t= KONFIDENS\t\t\t\t##\tReturnerer konfidensintervallet til gjennomsnittet for en populasjon\r\nCORREL\t\t\t= KORRELASJON\t\t\t\t##\tReturnerer korrelasjonskoeffisienten mellom to datasett\r\nCOUNT\t\t\t= ANTALL\t\t\t\t##\tTeller hvor mange tall som er i argumentlisten\r\nCOUNTA\t\t\t= ANTALLA\t\t\t\t##\tTeller hvor mange verdier som er i argumentlisten\r\nCOUNTBLANK\t\t= TELLBLANKE\t\t\t\t##\tTeller antall tomme celler i et område.\r\nCOUNTIF\t\t\t= ANTALL.HVIS\t\t\t\t##\tTeller antall celler i et område som oppfyller gitte vilkår\r\nCOUNTIFS\t\t= ANTALL.HVIS.SETT\t\t\t##\tTeller antallet ikke-tomme celler i et område som oppfyller flere vilkår\r\nCOVAR\t\t\t= KOVARIANS\t\t\t\t##\tReturnerer kovariansen, gjennomsnittet av produktene av parvise avvik\r\nCRITBINOM\t\t= GRENSE.BINOM\t\t\t\t##\tReturnerer den minste verdien der den kumulative binomiske fordelingen er mindre enn eller lik en vilkårsverdi\r\nDEVSQ\t\t\t= AVVIK.KVADRERT\t\t\t##\tReturnerer summen av kvadrerte avvik\r\nEXPONDIST\t\t= EKSP.FORDELING\t\t\t##\tReturnerer eksponentialfordelingen\r\nFDIST\t\t\t= FFORDELING\t\t\t\t##\tReturnerer F-sannsynlighetsfordelingen\r\nFINV\t\t\t= FFORDELING.INVERS\t\t\t##\tReturnerer den inverse av den sannsynlige F-fordelingen\r\nFISHER\t\t\t= FISHER\t\t\t\t##\tReturnerer Fisher-transformasjonen\r\nFISHERINV\t\t= FISHERINV\t\t\t\t##\tReturnerer den inverse av Fisher-transformasjonen\r\nFORECAST\t\t= PROGNOSE\t\t\t\t##\tReturnerer en verdi langs en lineær trend\r\nFREQUENCY\t\t= FREKVENS\t\t\t\t##\tReturnerer en frekvensdistribusjon som en loddrett matrise\r\nFTEST\t\t\t= FTEST\t\t\t\t\t##\tReturnerer resultatet av en F-test\r\nGAMMADIST\t\t= GAMMAFORDELING\t\t\t##\tReturnerer gammafordelingen\r\nGAMMAINV\t\t= GAMMAINV\t\t\t\t##\tReturnerer den inverse av den gammakumulative fordelingen\r\nGAMMALN\t\t\t= GAMMALN\t\t\t\t##\tReturnerer den naturlige logaritmen til gammafunksjonen G(x)\r\nGEOMEAN\t\t\t= GJENNOMSNITT.GEOMETRISK\t\t##\tReturnerer den geometriske middelverdien\r\nGROWTH\t\t\t= VEKST\t\t\t\t\t##\tReturnerer verdier langs en eksponentiell trend\r\nHARMEAN\t\t\t= GJENNOMSNITT.HARMONISK\t\t##\tReturnerer den harmoniske middelverdien\r\nHYPGEOMDIST\t\t= HYPGEOM.FORDELING\t\t\t##\tReturnerer den hypergeometriske fordelingen\r\nINTERCEPT\t\t= SKJÆRINGSPUNKT\t\t\t##\tReturnerer skjæringspunktet til den lineære regresjonslinjen\r\nKURT\t\t\t= KURT\t\t\t\t\t##\tReturnerer kurtosen til et datasett\r\nLARGE\t\t\t= N.STØRST\t\t\t\t##\tReturnerer den n-te største verdien i et datasett\r\nLINEST\t\t\t= RETTLINJE\t\t\t\t##\tReturnerer parameterne til en lineær trend\r\nLOGEST\t\t\t= KURVE\t\t\t\t\t##\tReturnerer parameterne til en eksponentiell trend\r\nLOGINV\t\t\t= LOGINV\t\t\t\t##\tReturnerer den inverse lognormale fordelingen\r\nLOGNORMDIST\t\t= LOGNORMFORD\t\t\t\t##\tReturnerer den kumulative lognormale fordelingen\r\nMAX\t\t\t= STØRST\t\t\t\t##\tReturnerer maksimumsverdien i en argumentliste\r\nMAXA\t\t\t= MAKSA\t\t\t\t\t##\tReturnerer maksimumsverdien i en argumentliste, inkludert tall, tekst og logiske verdier\r\nMEDIAN\t\t\t= MEDIAN\t\t\t\t##\tReturnerer medianen til tallene som er gitt\r\nMIN\t\t\t= MIN\t\t\t\t\t##\tReturnerer minimumsverdien i en argumentliste\r\nMINA\t\t\t= MINA\t\t\t\t\t##\tReturnerer den minste verdien i en argumentliste, inkludert tall, tekst og logiske verdier\r\nMODE\t\t\t= MODUS\t\t\t\t\t##\tReturnerer den vanligste verdien i et datasett\r\nNEGBINOMDIST\t\t= NEGBINOM.FORDELING\t\t\t##\tReturnerer den negative binomiske fordelingen\r\nNORMDIST\t\t= NORMALFORDELING\t\t\t##\tReturnerer den kumulative normalfordelingen\r\nNORMINV\t\t\t= NORMINV\t\t\t\t##\tReturnerer den inverse kumulative normalfordelingen\r\nNORMSDIST\t\t= NORMSFORDELING\t\t\t##\tReturnerer standard kumulativ normalfordeling\r\nNORMSINV\t\t= NORMSINV\t\t\t\t##\tReturnerer den inverse av den den kumulative standard normalfordelingen\r\nPEARSON\t\t\t= PEARSON\t\t\t\t##\tReturnerer produktmomentkorrelasjonskoeffisienten, Pearson\r\nPERCENTILE\t\t= PERSENTIL\t\t\t\t##\tReturnerer den n-te persentil av verdiene i et område\r\nPERCENTRANK\t\t= PROSENTDEL\t\t\t\t##\tReturnerer prosentrangeringen av en verdi i et datasett\r\nPERMUT\t\t\t= PERMUTER\t\t\t\t##\tReturnerer antall permutasjoner for et gitt antall objekter\r\nPOISSON\t\t\t= POISSON\t\t\t\t##\tReturnerer Poissons sannsynlighetsfordeling\r\nPROB\t\t\t= SANNSYNLIG\t\t\t\t##\tReturnerer sannsynligheten for at verdier i et område ligger mellom to grenser\r\nQUARTILE\t\t= KVARTIL\t\t\t\t##\tReturnerer kvartilen til et datasett\r\nRANK\t\t\t= RANG\t\t\t\t\t##\tReturnerer rangeringen av et tall, eller plassen tallet har i en rekke\r\nRSQ\t\t\t= RKVADRAT\t\t\t\t##\tReturnerer kvadratet av produktmomentkorrelasjonskoeffisienten (Pearsons r)\r\nSKEW\t\t\t= SKJEVFORDELING\t\t\t##\tReturnerer skjevheten i en fordeling\r\nSLOPE\t\t\t= STIGNINGSTALL\t\t\t\t##\tReturnerer stigningtallet for den lineære regresjonslinjen\r\nSMALL\t\t\t= N.MINST\t\t\t\t##\tReturnerer den n-te minste verdien i et datasett\r\nSTANDARDIZE\t\t= NORMALISER\t\t\t\t##\tReturnerer en normalisert verdi\r\nSTDEV\t\t\t= STDAV\t\t\t\t\t##\tEstimere standardavvik på grunnlag av et utvalg\r\nSTDEVA\t\t\t= STDAVVIKA\t\t\t\t##\tEstimerer standardavvik basert på et utvalg, inkludert tall, tekst og logiske verdier\r\nSTDEVP\t\t\t= STDAVP\t\t\t\t##\tBeregner standardavvik basert på hele populasjonen\r\nSTDEVPA\t\t\t= STDAVVIKPA\t\t\t\t##\tBeregner standardavvik basert på hele populasjonen, inkludert tall, tekst og logiske verdier\r\nSTEYX\t\t\t= STANDARDFEIL\t\t\t\t##\tReturnerer standardfeilen for den predikerte y-verdien for hver x i regresjonen\r\nTDIST\t\t\t= TFORDELING\t\t\t\t##\tReturnerer en Student t-fordeling\r\nTINV\t\t\t= TINV\t\t\t\t\t##\tReturnerer den inverse Student t-fordelingen\r\nTREND\t\t\t= TREND\t\t\t\t\t##\tReturnerer verdier langs en lineær trend\r\nTRIMMEAN\t\t= TRIMMET.GJENNOMSNITT\t\t\t##\tReturnerer den interne middelverdien til et datasett\r\nTTEST\t\t\t= TTEST\t\t\t\t\t##\tReturnerer sannsynligheten assosiert med en Student t-test\r\nVAR\t\t\t= VARIANS\t\t\t\t##\tEstimerer varians basert på et utvalg\r\nVARA\t\t\t= VARIANSA\t\t\t\t##\tEstimerer varians basert på et utvalg, inkludert tall, tekst og logiske verdier\r\nVARP\t\t\t= VARIANSP\t\t\t\t##\tBeregner varians basert på hele populasjonen\r\nVARPA\t\t\t= VARIANSPA\t\t\t\t##\tBeregner varians basert på hele populasjonen, inkludert tall, tekst og logiske verdier\r\nWEIBULL\t\t\t= WEIBULL.FORDELING\t\t\t##\tReturnerer Weibull-fordelingen\r\nZTEST\t\t\t= ZTEST\t\t\t\t\t##\tReturnerer den ensidige sannsynlighetsverdien for en z-test\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\t\tTekstfunksjoner\r\n##\r\nASC\t\t\t= STIGENDE\t\t\t\t##\tEndrer fullbreddes (dobbeltbyte) engelske bokstaver eller katakana i en tegnstreng, til halvbreddes (enkeltbyte) tegn\r\nBAHTTEXT\t\t= BAHTTEKST\t\t\t\t##\tKonverterer et tall til tekst, og bruker valutaformatet ß (baht)\r\nCHAR\t\t\t= TEGNKODE\t\t\t\t##\tReturnerer tegnet som svarer til kodenummeret\r\nCLEAN\t\t\t= RENSK\t\t\t\t\t##\tFjerner alle tegn som ikke kan skrives ut, fra teksten\r\nCODE\t\t\t= KODE\t\t\t\t\t##\tReturnerer en numerisk kode for det første tegnet i en tekststreng\r\nCONCATENATE\t\t= KJEDE.SAMMEN\t\t\t\t##\tSlår sammen flere tekstelementer til ett tekstelement\r\nDOLLAR\t\t\t= VALUTA\t\t\t\t##\tKonverterer et tall til tekst, og bruker valutaformatet $ (dollar)\r\nEXACT\t\t\t= EKSAKT\t\t\t\t##\tKontrollerer om to tekstverdier er like\r\nFIND\t\t\t= FINN\t\t\t\t\t##\tFinner en tekstverdi inne i en annen (skiller mellom store og små bokstaver)\r\nFINDB\t\t\t= FINNB\t\t\t\t\t##\tFinner en tekstverdi inne i en annen (skiller mellom store og små bokstaver)\r\nFIXED\t\t\t= FASTSATT\t\t\t\t##\tFormaterer et tall som tekst med et bestemt antall desimaler\r\nJIS\t\t\t= JIS\t\t\t\t\t##\tEndrer halvbreddes (enkeltbyte) engelske bokstaver eller katakana i en tegnstreng, til fullbreddes (dobbeltbyte) tegn\r\nLEFT\t\t\t= VENSTRE\t\t\t\t##\tReturnerer tegnene lengst til venstre i en tekstverdi\r\nLEFTB\t\t\t= VENSTREB\t\t\t\t##\tReturnerer tegnene lengst til venstre i en tekstverdi\r\nLEN\t\t\t= LENGDE\t\t\t\t##\tReturnerer antall tegn i en tekststreng\r\nLENB\t\t\t= LENGDEB\t\t\t\t##\tReturnerer antall tegn i en tekststreng\r\nLOWER\t\t\t= SMÅ\t\t\t\t\t##\tKonverterer tekst til små bokstaver\r\nMID\t\t\t= DELTEKST\t\t\t\t##\tReturnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir\r\nMIDB\t\t\t= DELTEKSTB\t\t\t\t##\tReturnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir\r\nPHONETIC\t\t= FURIGANA\t\t\t\t##\tTrekker ut fonetiske tegn (furigana) fra en tekststreng\r\nPROPER\t\t\t= STOR.FORBOKSTAV\t\t\t##\tGir den første bokstaven i hvert ord i en tekstverdi stor forbokstav\r\nREPLACE\t\t\t= ERSTATT\t\t\t\t##\tErstatter tegn i en tekst\r\nREPLACEB\t\t= ERSTATTB\t\t\t\t##\tErstatter tegn i en tekst\r\nREPT\t\t\t= GJENTA\t\t\t\t##\tGjentar tekst et gitt antall ganger\r\nRIGHT\t\t\t= HØYRE\t\t\t\t\t##\tReturnerer tegnene lengst til høyre i en tekstverdi\r\nRIGHTB\t\t\t= HØYREB\t\t\t\t##\tReturnerer tegnene lengst til høyre i en tekstverdi\r\nSEARCH\t\t\t= SØK\t\t\t\t\t##\tFinner en tekstverdi inne i en annen (skiller ikke mellom store og små bokstaver)\r\nSEARCHB\t\t\t= SØKB\t\t\t\t\t##\tFinner en tekstverdi inne i en annen (skiller ikke mellom store og små bokstaver)\r\nSUBSTITUTE\t\t= BYTT.UT\t\t\t\t##\tBytter ut gammel tekst med ny tekst i en tekststreng\r\nT\t\t\t= T\t\t\t\t\t##\tKonverterer argumentene til tekst\r\nTEXT\t\t\t= TEKST\t\t\t\t\t##\tFormaterer et tall og konverterer det til tekst\r\nTRIM\t\t\t= TRIMME\t\t\t\t##\tFjerner mellomrom fra tekst\r\nUPPER\t\t\t= STORE\t\t\t\t\t##\tKonverterer tekst til store bokstaver\r\nVALUE\t\t\t= VERDI\t\t\t\t\t##\tKonverterer et tekstargument til et tall\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/pl/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= zł\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #ZERO!\r\nDIV0\t= #DZIEL/0!\r\nVALUE\t= #ARG!\r\nREF\t= #ADR!\r\nNAME\t= #NAZWA?\r\nNUM\t= #LICZBA!\r\nNA\t= #N/D!\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/pl/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tFunkcje dodatków i automatyzacji\r\n##\r\nGETPIVOTDATA\t\t= WEŹDANETABELI\t\t\t##\tZwraca dane przechowywane w raporcie tabeli przestawnej.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tFunkcje modułów\r\n##\r\nCUBEKPIMEMBER\t\t= ELEMENT.KPI.MODUŁU\t\t##\tZwraca nazwę, właściwość i miarę kluczowego wskaźnika wydajności (KPI) oraz wyświetla nazwę i właściwość w komórce. Wskaźnik KPI jest miarą ilościową, taką jak miesięczny zysk brutto lub kwartalna fluktuacja pracowników, używaną do monitorowania wydajności organizacji.\r\nCUBEMEMBER\t\t= ELEMENT.MODUŁU\t\t##\tZwraca element lub krotkę z hierarchii modułu. Służy do sprawdzania, czy element lub krotka istnieje w module.\r\nCUBEMEMBERPROPERTY\t= WŁAŚCIWOŚĆ.ELEMENTU.MODUŁU\t##\tZwraca wartość właściwości elementu w module. Służy do sprawdzania, czy nazwa elementu istnieje w module, i zwracania określonej właściwości dla tego elementu.\r\nCUBERANKEDMEMBER\t= USZEREGOWANY.ELEMENT.MODUŁU\t##\tZwraca n-ty (albo uszeregowany) element zestawu. Służy do zwracania elementu lub elementów zestawu, na przykład najlepszego sprzedawcy lub 10 najlepszych studentów.\r\nCUBESET\t\t\t= ZESTAW.MODUŁÓW\t\t##\tDefiniuje obliczony zestaw elementów lub krotek, wysyłając wyrażenie zestawu do serwera modułu, który tworzy zestaw i zwraca go do programu Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= LICZNIK.MODUŁÓW.ZESTAWU\t##\tZwraca liczbę elementów zestawu.\r\nCUBEVALUE\t\t= WARTOŚĆ.MODUŁU\t\t##\tZwraca zagregowaną wartość z modułu.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tFunkcje baz danych\r\n##\r\nDAVERAGE\t\t= BD.ŚREDNIA\t\t\t##\tZwraca wartość średniej wybranych wpisów bazy danych.\r\nDCOUNT\t\t\t= BD.ILE.REKORDÓW\t\t##\tZlicza komórki zawierające liczby w bazie danych.\r\nDCOUNTA\t\t\t= BD.ILE.REKORDÓW.A\t\t##\tZlicza niepuste komórki w bazie danych.\r\nDGET\t\t\t= BD.POLE\t\t\t##\tWyodrębnia z bazy danych jeden rekord spełniający określone kryteria.\r\nDMAX\t\t\t= BD.MAX\t\t\t##\tZwraca wartość maksymalną z wybranych wpisów bazy danych.\r\nDMIN\t\t\t= BD.MIN\t\t\t##\tZwraca wartość minimalną z wybranych wpisów bazy danych.\r\nDPRODUCT\t\t= BD.ILOCZYN\t\t\t##\tMnoży wartości w konkretnym, spełniającym kryteria polu rekordów bazy danych.\r\nDSTDEV\t\t\t= BD.ODCH.STANDARD\t\t##\tSzacuje odchylenie standardowe na podstawie próbki z wybranych wpisów bazy danych.\r\nDSTDEVP\t\t\t= BD.ODCH.STANDARD.POPUL\t##\tOblicza odchylenie standardowe na podstawie całej populacji wybranych wpisów bazy danych.\r\nDSUM\t\t\t= BD.SUMA\t\t\t##\tDodaje liczby w kolumnie pól rekordów bazy danych, które spełniają kryteria.\r\nDVAR\t\t\t= BD.WARIANCJA\t\t\t##\tSzacuje wariancję na podstawie próbki z wybranych wpisów bazy danych.\r\nDVARP\t\t\t= BD.WARIANCJA.POPUL\t\t##\tOblicza wariancję na podstawie całej populacji wybranych wpisów bazy danych.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tFunkcje dat, godzin i czasu\r\n##\r\nDATE\t\t\t= DATA\t\t\t\t##\tZwraca liczbę seryjną dla wybranej daty.\r\nDATEVALUE\t\t= DATA.WARTOŚĆ\t\t\t##\tKonwertuje datę w formie tekstu na liczbę seryjną.\r\nDAY\t\t\t= DZIEŃ\t\t\t\t##\tKonwertuje liczbę seryjną na dzień miesiąca.\r\nDAYS360\t\t\t= DNI.360\t\t\t##\tOblicza liczbę dni między dwiema datami na podstawie roku 360-dniowego.\r\nEDATE\t\t\t= UPŁDNI\t\t\t##\tZwraca liczbę seryjną daty jako wskazaną liczbę miesięcy przed określoną datą początkową lub po niej.\r\nEOMONTH\t\t\t= EOMONTH\t\t\t##\tZwraca liczbę seryjną ostatniego dnia miesiąca przed określoną liczbą miesięcy lub po niej.\r\nHOUR\t\t\t= GODZINA\t\t\t##\tKonwertuje liczbę seryjną na godzinę.\r\nMINUTE\t\t\t= MINUTA\t\t\t##\tKonwertuje liczbę seryjną na minutę.\r\nMONTH\t\t\t= MIESIĄC\t\t\t##\tKonwertuje liczbę seryjną na miesiąc.\r\nNETWORKDAYS\t\t= NETWORKDAYS\t\t\t##\tZwraca liczbę pełnych dni roboczych między dwiema datami.\r\nNOW\t\t\t= TERAZ\t\t\t\t##\tZwraca liczbę seryjną bieżącej daty i godziny.\r\nSECOND\t\t\t= SEKUNDA\t\t\t##\tKonwertuje liczbę seryjną na sekundę.\r\nTIME\t\t\t= CZAS\t\t\t\t##\tZwraca liczbę seryjną określonego czasu.\r\nTIMEVALUE\t\t= CZAS.WARTOŚĆ\t\t\t##\tKonwertuje czas w formie tekstu na liczbę seryjną.\r\nTODAY\t\t\t= DZIŚ\t\t\t\t##\tZwraca liczbę seryjną dla daty bieżącej.\r\nWEEKDAY\t\t\t= DZIEŃ.TYG\t\t\t##\tKonwertuje liczbę seryjną na dzień tygodnia.\r\nWEEKNUM\t\t\t= WEEKNUM\t\t\t##\tKonwertuje liczbę seryjną na liczbę reprezentującą numer tygodnia w roku.\r\nWORKDAY\t\t\t= WORKDAY\t\t\t##\tZwraca liczbę seryjną dla daty przed określoną liczbą dni roboczych lub po niej.\r\nYEAR\t\t\t= ROK\t\t\t\t##\tKonwertuje liczbę seryjną na rok.\r\nYEARFRAC\t\t= YEARFRAC\t\t\t##\tZwraca część roku reprezentowaną przez pełną liczbę dni między datą początkową a datą końcową.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tFunkcje inżynierskie\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tZwraca wartość zmodyfikowanej funkcji Bessela In(x).\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tZwraca wartość funkcji Bessela Jn(x).\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tZwraca wartość zmodyfikowanej funkcji Bessela Kn(x).\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tZwraca wartość funkcji Bessela Yn(x).\r\nBIN2DEC\t\t\t= BIN2DEC\t\t\t##\tKonwertuje liczbę w postaci dwójkowej na liczbę w postaci dziesiętnej.\r\nBIN2HEX\t\t\t= BIN2HEX\t\t\t##\tKonwertuje liczbę w postaci dwójkowej na liczbę w postaci szesnastkowej.\r\nBIN2OCT\t\t\t= BIN2OCT\t\t\t##\tKonwertuje liczbę w postaci dwójkowej na liczbę w postaci ósemkowej.\r\nCOMPLEX\t\t\t= COMPLEX\t\t\t##\tKonwertuje część rzeczywistą i urojoną na liczbę zespoloną.\r\nCONVERT\t\t\t= CONVERT\t\t\t##\tKonwertuje liczbę z jednego systemu miar na inny.\r\nDEC2BIN\t\t\t= DEC2BIN\t\t\t##\tKonwertuje liczbę w postaci dziesiętnej na postać dwójkową.\r\nDEC2HEX\t\t\t= DEC2HEX\t\t\t##\tKonwertuje liczbę w postaci dziesiętnej na liczbę w postaci szesnastkowej.\r\nDEC2OCT\t\t\t= DEC2OCT\t\t\t##\tKonwertuje liczbę w postaci dziesiętnej na liczbę w postaci ósemkowej.\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tSprawdza, czy dwie wartości są równe.\r\nERF\t\t\t= ERF\t\t\t\t##\tZwraca wartość funkcji błędu.\r\nERFC\t\t\t= ERFC\t\t\t\t##\tZwraca wartość komplementarnej funkcji błędu.\r\nGESTEP\t\t\t= GESTEP\t\t\t##\tSprawdza, czy liczba jest większa niż wartość progowa.\r\nHEX2BIN\t\t\t= HEX2BIN\t\t\t##\tKonwertuje liczbę w postaci szesnastkowej na liczbę w postaci dwójkowej.\r\nHEX2DEC\t\t\t= HEX2DEC\t\t\t##\tKonwertuje liczbę w postaci szesnastkowej na liczbę w postaci dziesiętnej.\r\nHEX2OCT\t\t\t= HEX2OCT\t\t\t##\tKonwertuje liczbę w postaci szesnastkowej na liczbę w postaci ósemkowej.\r\nIMABS\t\t\t= IMABS\t\t\t\t##\tZwraca wartość bezwzględną (moduł) liczby zespolonej.\r\nIMAGINARY\t\t= IMAGINARY\t\t\t##\tZwraca wartość części urojonej liczby zespolonej.\r\nIMARGUMENT\t\t= IMARGUMENT\t\t\t##\tZwraca wartość argumentu liczby zespolonej, przy czym kąt wyrażony jest w radianach.\r\nIMCONJUGATE\t\t= IMCONJUGATE\t\t\t##\tZwraca wartość liczby sprzężonej danej liczby zespolonej.\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tZwraca wartość cosinusa liczby zespolonej.\r\nIMDIV\t\t\t= IMDIV\t\t\t\t##\tZwraca wartość ilorazu dwóch liczb zespolonych.\r\nIMEXP\t\t\t= IMEXP\t\t\t\t##\tZwraca postać wykładniczą liczby zespolonej.\r\nIMLN\t\t\t= IMLN\t\t\t\t##\tZwraca wartość logarytmu naturalnego liczby zespolonej.\r\nIMLOG10\t\t\t= IMLOG10\t\t\t##\tZwraca wartość logarytmu dziesiętnego liczby zespolonej.\r\nIMLOG2\t\t\t= IMLOG2\t\t\t##\tZwraca wartość logarytmu liczby zespolonej przy podstawie 2.\r\nIMPOWER\t\t\t= IMPOWER\t\t\t##\tZwraca wartość liczby zespolonej podniesionej do potęgi całkowitej.\r\nIMPRODUCT\t\t= IMPRODUCT\t\t\t##\tZwraca wartość iloczynu liczb zespolonych.\r\nIMREAL\t\t\t= IMREAL\t\t\t##\tZwraca wartość części rzeczywistej liczby zespolonej.\r\nIMSIN\t\t\t= IMSIN\t\t\t\t##\tZwraca wartość sinusa liczby zespolonej.\r\nIMSQRT\t\t\t= IMSQRT\t\t\t##\tZwraca wartość pierwiastka kwadratowego z liczby zespolonej.\r\nIMSUB\t\t\t= IMSUB\t\t\t\t##\tZwraca wartość różnicy dwóch liczb zespolonych.\r\nIMSUM\t\t\t= IMSUM\t\t\t\t##\tZwraca wartość sumy liczb zespolonych.\r\nOCT2BIN\t\t\t= OCT2BIN\t\t\t##\tKonwertuje liczbę w postaci ósemkowej na liczbę w postaci dwójkowej.\r\nOCT2DEC\t\t\t= OCT2DEC\t\t\t##\tKonwertuje liczbę w postaci ósemkowej na liczbę w postaci dziesiętnej.\r\nOCT2HEX\t\t\t= OCT2HEX\t\t\t##\tKonwertuje liczbę w postaci ósemkowej na liczbę w postaci szesnastkowej.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFunkcje finansowe\r\n##\r\nACCRINT\t\t\t= ACCRINT\t\t\t##\tZwraca narosłe odsetki dla papieru wartościowego z oprocentowaniem okresowym.\r\nACCRINTM\t\t= ACCRINTM\t\t\t##\tZwraca narosłe odsetki dla papieru wartościowego z oprocentowaniem w terminie wykupu.\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tZwraca amortyzację dla każdego okresu rozliczeniowego z wykorzystaniem współczynnika amortyzacji.\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tZwraca amortyzację dla każdego okresu rozliczeniowego.\r\nCOUPDAYBS\t\t= COUPDAYBS\t\t\t##\tZwraca liczbę dni od początku okresu dywidendy do dnia rozliczeniowego.\r\nCOUPDAYS\t\t= COUPDAYS\t\t\t##\tZwraca liczbę dni w okresie dywidendy, z uwzględnieniem dnia rozliczeniowego.\r\nCOUPDAYSNC\t\t= COUPDAYSNC\t\t\t##\tZwraca liczbę dni od dnia rozliczeniowego do daty następnego dnia dywidendy.\r\nCOUPNCD\t\t\t= COUPNCD\t\t\t##\tZwraca dzień następnej dywidendy po dniu rozliczeniowym.\r\nCOUPNUM\t\t\t= COUPNUM\t\t\t##\tZwraca liczbę dywidend płatnych między dniem rozliczeniowym a dniem wykupu.\r\nCOUPPCD\t\t\t= COUPPCD\t\t\t##\tZwraca dzień poprzedniej dywidendy przed dniem rozliczeniowym.\r\nCUMIPMT\t\t\t= CUMIPMT\t\t\t##\tZwraca wartość procentu składanego płatnego między dwoma okresami.\r\nCUMPRINC\t\t= CUMPRINC\t\t\t##\tZwraca wartość kapitału skumulowanego spłaty pożyczki między dwoma okresami.\r\nDB\t\t\t= DB\t\t\t\t##\tZwraca amortyzację środka trwałego w danym okresie metodą degresywną z zastosowaniem stałej bazowej.\r\nDDB\t\t\t= DDB\t\t\t\t##\tZwraca amortyzację środka trwałego za podany okres metodą degresywną z zastosowaniem podwójnej bazowej lub metodą określoną przez użytkownika.\r\nDISC\t\t\t= DISC\t\t\t\t##\tZwraca wartość stopy dyskontowej papieru wartościowego.\r\nDOLLARDE\t\t= DOLLARDE\t\t\t##\tKonwertuje cenę w postaci ułamkowej na cenę wyrażoną w postaci dziesiętnej.\r\nDOLLARFR\t\t= DOLLARFR\t\t\t##\tKonwertuje cenę wyrażoną w postaci dziesiętnej na cenę wyrażoną w postaci ułamkowej.\r\nDURATION\t\t= DURATION\t\t\t##\tZwraca wartość rocznego przychodu z papieru wartościowego o okresowych wypłatach oprocentowania.\r\nEFFECT\t\t\t= EFFECT\t\t\t##\tZwraca wartość efektywnej rocznej stopy procentowej.\r\nFV\t\t\t= FV\t\t\t\t##\tZwraca przyszłą wartość lokaty.\r\nFVSCHEDULE\t\t= FVSCHEDULE\t\t\t##\tZwraca przyszłą wartość kapitału początkowego wraz z szeregiem procentów składanych.\r\nINTRATE\t\t\t= INTRATE\t\t\t##\tZwraca wartość stopy procentowej papieru wartościowego całkowicie ulokowanego.\r\nIPMT\t\t\t= IPMT\t\t\t\t##\tZwraca wysokość spłaty oprocentowania lokaty za dany okres.\r\nIRR\t\t\t= IRR\t\t\t\t##\tZwraca wartość wewnętrznej stopy zwrotu dla serii przepływów gotówkowych.\r\nISPMT\t\t\t= ISPMT\t\t\t\t##\tOblicza wysokość spłaty oprocentowania za dany okres lokaty.\r\nMDURATION\t\t= MDURATION\t\t\t##\tZwraca wartość zmodyfikowanego okresu Macauleya dla papieru wartościowego o założonej wartości nominalnej 100 zł.\r\nMIRR\t\t\t= MIRR\t\t\t\t##\tZwraca wartość wewnętrznej stopy zwrotu dla przypadku, gdy dodatnie i ujemne przepływy gotówkowe mają różne stopy.\r\nNOMINAL\t\t\t= NOMINAL\t\t\t##\tZwraca wysokość nominalnej rocznej stopy procentowej.\r\nNPER\t\t\t= NPER\t\t\t\t##\tZwraca liczbę okresów dla lokaty.\r\nNPV\t\t\t= NPV\t\t\t\t##\tZwraca wartość bieżącą netto lokaty na podstawie szeregu okresowych przepływów gotówkowych i stopy dyskontowej.\r\nODDFPRICE\t\t= ODDFPRICE\t\t\t##\tZwraca cenę za 100 zł wartości nominalnej papieru wartościowego z nietypowym pierwszym okresem.\r\nODDFYIELD\t\t= ODDFYIELD\t\t\t##\tZwraca rentowność papieru wartościowego z nietypowym pierwszym okresem.\r\nODDLPRICE\t\t= ODDLPRICE\t\t\t##\tZwraca cenę za 100 zł wartości nominalnej papieru wartościowego z nietypowym ostatnim okresem.\r\nODDLYIELD\t\t= ODDLYIELD\t\t\t##\tZwraca rentowność papieru wartościowego z nietypowym ostatnim okresem.\r\nPMT\t\t\t= PMT\t\t\t\t##\tZwraca wartość okresowej płatności raty rocznej.\r\nPPMT\t\t\t= PPMT\t\t\t\t##\tZwraca wysokość spłaty kapitału w przypadku lokaty dla danego okresu.\r\nPRICE\t\t\t= PRICE\t\t\t\t##\tZwraca cenę za 100 zł wartości nominalnej papieru wartościowego z oprocentowaniem okresowym.\r\nPRICEDISC\t\t= PRICEDISC\t\t\t##\tZwraca cenę za 100 zł wartości nominalnej papieru wartościowego zdyskontowanego.\r\nPRICEMAT\t\t= PRICEMAT\t\t\t##\tZwraca cenę za 100 zł wartości nominalnej papieru wartościowego z oprocentowaniem w terminie wykupu.\r\nPV\t\t\t= PV\t\t\t\t##\tZwraca wartość bieżącą lokaty.\r\nRATE\t\t\t= RATE\t\t\t\t##\tZwraca wysokość stopy procentowej w okresie raty rocznej.\r\nRECEIVED\t\t= RECEIVED\t\t\t##\tZwraca wartość kapitału otrzymanego przy wykupie papieru wartościowego całkowicie ulokowanego.\r\nSLN\t\t\t= SLN\t\t\t\t##\tZwraca amortyzację środka trwałego za jeden okres metodą liniową.\r\nSYD\t\t\t= SYD\t\t\t\t##\tZwraca amortyzację środka trwałego za dany okres metodą sumy cyfr lat amortyzacji.\r\nTBILLEQ\t\t\t= TBILLEQ\t\t\t##\tZwraca rentowność ekwiwalentu obligacji dla bonu skarbowego.\r\nTBILLPRICE\t\t= TBILLPRICE\t\t\t##\tZwraca cenę za 100 zł wartości nominalnej bonu skarbowego.\r\nTBILLYIELD\t\t= TBILLYIELD\t\t\t##\tZwraca rentowność bonu skarbowego.\r\nVDB\t\t\t= VDB\t\t\t\t##\tOblicza amortyzację środka trwałego w danym okresie lub jego części metodą degresywną.\r\nXIRR\t\t\t= XIRR\t\t\t\t##\tZwraca wartość wewnętrznej stopy zwrotu dla serii rozłożonych w czasie przepływów gotówkowych, niekoniecznie okresowych.\r\nXNPV\t\t\t= XNPV\t\t\t\t##\tZwraca wartość bieżącą netto dla serii rozłożonych w czasie przepływów gotówkowych, niekoniecznie okresowych.\r\nYIELD\t\t\t= YIELD\t\t\t\t##\tZwraca rentowność papieru wartościowego z oprocentowaniem okresowym.\r\nYIELDDISC\t\t= YIELDDISC\t\t\t##\tZwraca roczną rentowność zdyskontowanego papieru wartościowego, na przykład bonu skarbowego.\r\nYIELDMAT\t\t= YIELDMAT\t\t\t##\tZwraca roczną rentowność papieru wartościowego oprocentowanego przy wykupie.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tFunkcje informacyjne\r\n##\r\nCELL\t\t\t= KOMÓRKA\t\t\t##\tZwraca informacje o formacie, położeniu lub zawartości komórki.\r\nERROR.TYPE\t\t= NR.BŁĘDU\t\t\t##\tZwraca liczbę odpowiadającą typowi błędu.\r\nINFO\t\t\t= INFO\t\t\t\t##\tZwraca informację o aktualnym środowisku pracy.\r\nISBLANK\t\t\t= CZY.PUSTA\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest pusta.\r\nISERR\t\t\t= CZY.BŁ\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest dowolną wartością błędu, z wyjątkiem #N/D!.\r\nISERROR\t\t\t= CZY.BŁĄD\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest dowolną wartością błędu.\r\nISEVEN\t\t\t= ISEVEN\t\t\t##\tZwraca wartość PRAWDA, jeśli liczba jest parzysta.\r\nISLOGICAL\t\t= CZY.LOGICZNA\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest wartością logiczną.\r\nISNA\t\t\t= CZY.BRAK\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest wartością błędu #N/D!.\r\nISNONTEXT\t\t= CZY.NIE.TEKST\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość nie jest tekstem.\r\nISNUMBER\t\t= CZY.LICZBA\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest liczbą.\r\nISODD\t\t\t= ISODD\t\t\t\t##\tZwraca wartość PRAWDA, jeśli liczba jest nieparzysta.\r\nISREF\t\t\t= CZY.ADR\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest odwołaniem.\r\nISTEXT\t\t\t= CZY.TEKST\t\t\t##\tZwraca wartość PRAWDA, jeśli wartość jest tekstem.\r\nN\t\t\t= L\t\t\t\t##\tZwraca wartość przekonwertowaną na postać liczbową.\r\nNA\t\t\t= BRAK\t\t\t\t##\tZwraca wartość błędu #N/D!.\r\nTYPE\t\t\t= TYP\t\t\t\t##\tZwraca liczbę wskazującą typ danych wartości.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tFunkcje logiczne\r\n##\r\nAND\t\t\t= ORAZ\t\t\t\t##\tZwraca wartość PRAWDA, jeśli wszystkie argumenty mają wartość PRAWDA.\r\nFALSE\t\t\t= FAŁSZ\t\t\t\t##\tZwraca wartość logiczną FAŁSZ.\r\nIF\t\t\t= JEŻELI\t\t\t##\tOkreśla warunek logiczny do sprawdzenia.\r\nIFERROR\t\t\t= JEŻELI.BŁĄD\t\t\t##\tZwraca określoną wartość, jeśli wynikiem obliczenia formuły jest błąd; w przeciwnym przypadku zwraca wynik formuły.\r\nNOT\t\t\t= NIE\t\t\t\t##\tOdwraca wartość logiczną argumentu.\r\nOR\t\t\t= LUB\t\t\t\t##\tZwraca wartość PRAWDA, jeśli co najmniej jeden z argumentów ma wartość PRAWDA.\r\nTRUE\t\t\t= PRAWDA\t\t\t##\tZwraca wartość logiczną PRAWDA.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tFunkcje wyszukiwania i odwołań\r\n##\r\nADDRESS\t\t\t= ADRES\t\t\t\t##\tZwraca odwołanie do jednej komórki w arkuszu jako wartość tekstową.\r\nAREAS\t\t\t= OBSZARY\t\t\t##\tZwraca liczbę obszarów występujących w odwołaniu.\r\nCHOOSE\t\t\t= WYBIERZ\t\t\t##\tWybiera wartość z listy wartości.\r\nCOLUMN\t\t\t= NR.KOLUMNY\t\t\t##\tZwraca numer kolumny z odwołania.\r\nCOLUMNS\t\t\t= LICZBA.KOLUMN\t\t\t##\tZwraca liczbę kolumn dla danego odwołania.\r\nHLOOKUP\t\t\t= WYSZUKAJ.POZIOMO\t\t##\tPrzegląda górny wiersz tablicy i zwraca wartość wskazanej komórki.\r\nHYPERLINK\t\t= HIPERŁĄCZE\t\t\t##\tTworzy skrót lub skok, który pozwala otwierać dokument przechowywany na serwerze sieciowym, w sieci intranet lub w Internecie.\r\nINDEX\t\t\t= INDEKS\t\t\t##\tUżywa indeksu do wybierania wartości z odwołania lub tablicy.\r\nINDIRECT\t\t= ADR.POŚR\t\t\t##\tZwraca odwołanie określone przez wartość tekstową.\r\nLOOKUP\t\t\t= WYSZUKAJ\t\t\t##\tWyszukuje wartości w wektorze lub tablicy.\r\nMATCH\t\t\t= PODAJ.POZYCJĘ\t\t\t##\tWyszukuje wartości w odwołaniu lub w tablicy.\r\nOFFSET\t\t\t= PRZESUNIĘCIE\t\t\t##\tZwraca adres przesunięty od danego odwołania.\r\nROW\t\t\t= WIERSZ\t\t\t##\tZwraca numer wiersza odwołania.\r\nROWS\t\t\t= ILE.WIERSZY\t\t\t##\tZwraca liczbę wierszy dla danego odwołania.\r\nRTD\t\t\t= RTD\t\t\t\t##\tPobiera dane w czasie rzeczywistym z programu obsługującego automatyzację COM (Automatyzacja: Sposób pracy z obiektami aplikacji pochodzącymi z innej aplikacji lub narzędzia projektowania. Nazywana wcześniej Automatyzacją OLE, Automatyzacja jest standardem przemysłowym i funkcją obiektowego modelu składników (COM, Component Object Model).).\r\nTRANSPOSE\t\t= TRANSPONUJ\t\t\t##\tZwraca transponowaną tablicę.\r\nVLOOKUP\t\t\t= WYSZUKAJ.PIONOWO\t\t##\tPrzeszukuje pierwszą kolumnę tablicy i przechodzi wzdłuż wiersza, aby zwrócić wartość komórki.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tFunkcje matematyczne i trygonometryczne\r\n##\r\nABS\t\t\t= MODUŁ.LICZBY\t\t\t##\tZwraca wartość absolutną liczby.\r\nACOS\t\t\t= ACOS\t\t\t\t##\tZwraca arcus cosinus liczby.\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tZwraca arcus cosinus hiperboliczny liczby.\r\nASIN\t\t\t= ASIN\t\t\t\t##\tZwraca arcus sinus liczby.\r\nASINH\t\t\t= ASINH\t\t\t\t##\tZwraca arcus sinus hiperboliczny liczby.\r\nATAN\t\t\t= ATAN\t\t\t\t##\tZwraca arcus tangens liczby.\r\nATAN2\t\t\t= ATAN2\t\t\t\t##\tZwraca arcus tangens liczby na podstawie współrzędnych x i y.\r\nATANH\t\t\t= ATANH\t\t\t\t##\tZwraca arcus tangens hiperboliczny liczby.\r\nCEILING\t\t\t= ZAOKR.W.GÓRĘ\t\t\t##\tZaokrągla liczbę do najbliższej liczby całkowitej lub do najbliższej wielokrotności dokładności.\r\nCOMBIN\t\t\t= KOMBINACJE\t\t\t##\tZwraca liczbę kombinacji dla danej liczby obiektów.\r\nCOS\t\t\t= COS\t\t\t\t##\tZwraca cosinus liczby.\r\nCOSH\t\t\t= COSH\t\t\t\t##\tZwraca cosinus hiperboliczny liczby.\r\nDEGREES\t\t\t= STOPNIE\t\t\t##\tKonwertuje radiany na stopnie.\r\nEVEN\t\t\t= ZAOKR.DO.PARZ\t\t\t##\tZaokrągla liczbę w górę do najbliższej liczby parzystej.\r\nEXP\t\t\t= EXP\t\t\t\t##\tZwraca wartość liczby e podniesionej do potęgi określonej przez podaną liczbę.\r\nFACT\t\t\t= SILNIA\t\t\t##\tZwraca silnię liczby.\r\nFACTDOUBLE\t\t= FACTDOUBLE\t\t\t##\tZwraca podwójną silnię liczby.\r\nFLOOR\t\t\t= ZAOKR.W.DÓŁ\t\t\t##\tZaokrągla liczbę w dół, w kierunku zera.\r\nGCD\t\t\t= GCD\t\t\t\t##\tZwraca największy wspólny dzielnik.\r\nINT\t\t\t= ZAOKR.DO.CAŁK\t\t\t##\tZaokrągla liczbę w dół do najbliższej liczby całkowitej.\r\nLCM\t\t\t= LCM\t\t\t\t##\tZwraca najmniejszą wspólną wielokrotność.\r\nLN\t\t\t= LN\t\t\t\t##\tZwraca logarytm naturalny podanej liczby.\r\nLOG\t\t\t= LOG\t\t\t\t##\tZwraca logarytm danej liczby przy zadanej podstawie.\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tZwraca logarytm dziesiętny liczby.\r\nMDETERM\t\t\t= WYZNACZNIK.MACIERZY\t\t##\tZwraca wyznacznik macierzy tablicy.\r\nMINVERSE\t\t= MACIERZ.ODW\t\t\t##\tZwraca odwrotność macierzy tablicy.\r\nMMULT\t\t\t= MACIERZ.ILOCZYN\t\t##\tZwraca iloczyn macierzy dwóch tablic.\r\nMOD\t\t\t= MOD\t\t\t\t##\tZwraca resztę z dzielenia.\r\nMROUND\t\t\t= MROUND\t\t\t##\tZwraca liczbę zaokrągloną do żądanej wielokrotności.\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t\t##\tZwraca wielomian dla zbioru liczb.\r\nODD\t\t\t= ZAOKR.DO.NPARZ\t\t##\tZaokrągla liczbę w górę do najbliższej liczby nieparzystej.\r\nPI\t\t\t= PI\t\t\t\t##\tZwraca wartość liczby Pi.\r\nPOWER\t\t\t= POTĘGA\t\t\t##\tZwraca liczbę podniesioną do potęgi.\r\nPRODUCT\t\t\t= ILOCZYN\t\t\t##\tMnoży argumenty.\r\nQUOTIENT\t\t= QUOTIENT\t\t\t##\tZwraca iloraz (całkowity).\r\nRADIANS\t\t\t= RADIANY\t\t\t##\tKonwertuje stopnie na radiany.\r\nRAND\t\t\t= LOS\t\t\t\t##\tZwraca liczbę pseudolosową z zakresu od 0 do 1.\r\nRANDBETWEEN\t\t= RANDBETWEEN\t\t\t##\tZwraca liczbę pseudolosową z zakresu określonego przez podane argumenty.\r\nROMAN\t\t\t= RZYMSKIE\t\t\t##\tKonwertuje liczbę arabską na rzymską jako tekst.\r\nROUND\t\t\t= ZAOKR\t\t\t\t##\tZaokrągla liczbę do określonej liczby cyfr.\r\nROUNDDOWN\t\t= ZAOKR.DÓŁ\t\t\t##\tZaokrągla liczbę w dół, w kierunku zera.\r\nROUNDUP\t\t\t= ZAOKR.GÓRA\t\t\t##\tZaokrągla liczbę w górę, w kierunku od zera.\r\nSERIESSUM\t\t= SERIESSUM\t\t\t##\tZwraca sumę szeregu potęgowego na podstawie wzoru.\r\nSIGN\t\t\t= ZNAK.LICZBY\t\t\t##\tZwraca znak liczby.\r\nSIN\t\t\t= SIN\t\t\t\t##\tZwraca sinus danego kąta.\r\nSINH\t\t\t= SINH\t\t\t\t##\tZwraca sinus hiperboliczny liczby.\r\nSQRT\t\t\t= PIERWIASTEK\t\t\t##\tZwraca dodatni pierwiastek kwadratowy.\r\nSQRTPI\t\t\t= SQRTPI\t\t\t##\tZwraca pierwiastek kwadratowy iloczynu (liczba * Pi).\r\nSUBTOTAL\t\t= SUMY.POŚREDNIE\t\t##\tZwraca sumę częściową listy lub bazy danych.\r\nSUM\t\t\t= SUMA\t\t\t\t##\tDodaje argumenty.\r\nSUMIF\t\t\t= SUMA.JEŻELI\t\t\t##\tDodaje komórki określone przez podane kryterium.\r\nSUMIFS\t\t\t= SUMA.WARUNKÓW\t\t\t##\tDodaje komórki w zakresie, które spełniają wiele kryteriów.\r\nSUMPRODUCT\t\t= SUMA.ILOCZYNÓW\t\t##\tZwraca sumę iloczynów odpowiednich elementów tablicy.\r\nSUMSQ\t\t\t= SUMA.KWADRATÓW\t\t##\tZwraca sumę kwadratów argumentów.\r\nSUMX2MY2\t\t= SUMA.X2.M.Y2\t\t\t##\tZwraca sumę różnic kwadratów odpowiednich wartości w dwóch tablicach.\r\nSUMX2PY2\t\t= SUMA.X2.P.Y2\t\t\t##\tZwraca sumę sum kwadratów odpowiednich wartości w dwóch tablicach.\r\nSUMXMY2\t\t\t= SUMA.XMY.2\t\t\t##\tZwraca sumę kwadratów różnic odpowiednich wartości w dwóch tablicach.\r\nTAN\t\t\t= TAN\t\t\t\t##\tZwraca tangens liczby.\r\nTANH\t\t\t= TANH\t\t\t\t##\tZwraca tangens hiperboliczny liczby.\r\nTRUNC\t\t\t= LICZBA.CAŁK\t\t\t##\tPrzycina liczbę do wartości całkowitej.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tFunkcje statystyczne\r\n##\r\nAVEDEV\t\t\t= ODCH.ŚREDNIE\t\t\t##\tZwraca średnią wartość odchyleń absolutnych punktów danych od ich wartości średniej.\r\nAVERAGE\t\t\t= ŚREDNIA\t\t\t##\tZwraca wartość średnią argumentów.\r\nAVERAGEA\t\t= ŚREDNIA.A\t\t\t##\tZwraca wartość średnią argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych.\r\nAVERAGEIF\t\t= ŚREDNIA.JEŻELI\t\t##\tZwraca średnią (średnią arytmetyczną) wszystkich komórek w zakresie, które spełniają podane kryteria.\r\nAVERAGEIFS\t\t= ŚREDNIA.WARUNKÓW\t\t##\tZwraca średnią (średnią arytmetyczną) wszystkich komórek, które spełniają jedno lub więcej kryteriów.\r\nBETADIST\t\t= ROZKŁAD.BETA\t\t\t##\tZwraca skumulowaną funkcję gęstości prawdopodobieństwa beta.\r\nBETAINV\t\t\t= ROZKŁAD.BETA.ODW\t\t##\tZwraca odwrotność skumulowanej funkcji gęstości prawdopodobieństwa beta.\r\nBINOMDIST\t\t= ROZKŁAD.DWUM\t\t\t##\tZwraca pojedynczy składnik dwumianowego rozkładu prawdopodobieństwa.\r\nCHIDIST\t\t\t= ROZKŁAD.CHI\t\t\t##\tZwraca wartość jednostronnego prawdopodobieństwa rozkładu chi-kwadrat.\r\nCHIINV\t\t\t= ROZKŁAD.CHI.ODW\t\t##\tZwraca odwrotność wartości jednostronnego prawdopodobieństwa rozkładu chi-kwadrat.\r\nCHITEST\t\t\t= TEST.CHI\t\t\t##\tZwraca test niezależności.\r\nCONFIDENCE\t\t= UFNOŚĆ\t\t\t##\tZwraca interwał ufności dla średniej populacji.\r\nCORREL\t\t\t= WSP.KORELACJI\t\t\t##\tZwraca współczynnik korelacji dwóch zbiorów danych.\r\nCOUNT\t\t\t= ILE.LICZB\t\t\t##\tZlicza liczby znajdujące się na liście argumentów.\r\nCOUNTA\t\t\t= ILE.NIEPUSTYCH\t\t##\tZlicza wartości znajdujące się na liście argumentów.\r\nCOUNTBLANK\t\t= LICZ.PUSTE\t\t\t##\tZwraca liczbę pustych komórek w pewnym zakresie.\r\nCOUNTIF\t\t\t= LICZ.JEŻELI\t\t\t##\tZlicza komórki wewnątrz zakresu, które spełniają podane kryteria.\r\nCOUNTIFS\t\t= LICZ.WARUNKI\t\t\t##\tZlicza komórki wewnątrz zakresu, które spełniają wiele kryteriów.\r\nCOVAR\t\t\t= KOWARIANCJA\t\t\t##\tZwraca kowariancję, czyli średnią wartość iloczynów odpowiednich odchyleń.\r\nCRITBINOM\t\t= PRÓG.ROZKŁAD.DWUM\t\t##\tZwraca najmniejszą wartość, dla której skumulowany rozkład dwumianowy jest mniejszy niż wartość kryterium lub równy jej.\r\nDEVSQ\t\t\t= ODCH.KWADRATOWE\t\t##\tZwraca sumę kwadratów odchyleń.\r\nEXPONDIST\t\t= ROZKŁAD.EXP\t\t\t##\tZwraca rozkład wykładniczy.\r\nFDIST\t\t\t= ROZKŁAD.F\t\t\t##\tZwraca rozkład prawdopodobieństwa F.\r\nFINV\t\t\t= ROZKŁAD.F.ODW\t\t\t##\tZwraca odwrotność rozkładu prawdopodobieństwa F.\r\nFISHER\t\t\t= ROZKŁAD.FISHER\t\t##\tZwraca transformację Fishera.\r\nFISHERINV\t\t= ROZKŁAD.FISHER.ODW\t\t##\tZwraca odwrotność transformacji Fishera.\r\nFORECAST\t\t= REGLINX\t\t\t##\tZwraca wartość trendu liniowego.\r\nFREQUENCY\t\t= CZĘSTOŚĆ\t\t\t##\tZwraca rozkład częstotliwości jako tablicę pionową.\r\nFTEST\t\t\t= TEST.F\t\t\t##\tZwraca wynik testu F.\r\nGAMMADIST\t\t= ROZKŁAD.GAMMA\t\t\t##\tZwraca rozkład gamma.\r\nGAMMAINV\t\t= ROZKŁAD.GAMMA.ODW\t\t##\tZwraca odwrotność skumulowanego rozkładu gamma.\r\nGAMMALN\t\t\t= ROZKŁAD.LIN.GAMMA\t\t##\tZwraca logarytm naturalny funkcji gamma, Γ(x).\r\nGEOMEAN\t\t\t= ŚREDNIA.GEOMETRYCZNA\t\t##\tZwraca średnią geometryczną.\r\nGROWTH\t\t\t= REGEXPW\t\t\t##\tZwraca wartości trendu wykładniczego.\r\nHARMEAN\t\t\t= ŚREDNIA.HARMONICZNA\t\t##\tZwraca średnią harmoniczną.\r\nHYPGEOMDIST\t\t= ROZKŁAD.HIPERGEOM\t\t##\tZwraca rozkład hipergeometryczny.\r\nINTERCEPT\t\t= ODCIĘTA\t\t\t##\tZwraca punkt przecięcia osi pionowej z linią regresji liniowej.\r\nKURT\t\t\t= KURTOZA\t\t\t##\tZwraca kurtozę zbioru danych.\r\nLARGE\t\t\t= MAX.K\t\t\t\t##\tZwraca k-tą największą wartość ze zbioru danych.\r\nLINEST\t\t\t= REGLINP\t\t\t##\tZwraca parametry trendu liniowego.\r\nLOGEST\t\t\t= REGEXPP\t\t\t##\tZwraca parametry trendu wykładniczego.\r\nLOGINV\t\t\t= ROZKŁAD.LOG.ODW\t\t##\tZwraca odwrotność rozkładu logarytmu naturalnego.\r\nLOGNORMDIST\t\t= ROZKŁAD.LOG\t\t\t##\tZwraca skumulowany rozkład logarytmu naturalnego.\r\nMAX\t\t\t= MAX\t\t\t\t##\tZwraca maksymalną wartość listy argumentów.\r\nMAXA\t\t\t= MAX.A\t\t\t\t##\tZwraca maksymalną wartość listy argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych.\r\nMEDIAN\t\t\t= MEDIANA\t\t\t##\tZwraca medianę podanych liczb.\r\nMIN\t\t\t= MIN\t\t\t\t##\tZwraca minimalną wartość listy argumentów.\r\nMINA\t\t\t= MIN.A\t\t\t\t##\tZwraca najmniejszą wartość listy argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych.\r\nMODE\t\t\t= WYST.NAJCZĘŚCIEJ\t\t##\tZwraca wartość najczęściej występującą w zbiorze danych.\r\nNEGBINOMDIST\t\t= ROZKŁAD.DWUM.PRZEC\t\t##\tZwraca ujemny rozkład dwumianowy.\r\nNORMDIST\t\t= ROZKŁAD.NORMALNY\t\t##\tZwraca rozkład normalny skumulowany.\r\nNORMINV\t\t\t= ROZKŁAD.NORMALNY.ODW\t\t##\tZwraca odwrotność rozkładu normalnego skumulowanego.\r\nNORMSDIST\t\t= ROZKŁAD.NORMALNY.S\t\t##\tZwraca standardowy rozkład normalny skumulowany.\r\nNORMSINV\t\t= ROZKŁAD.NORMALNY.S.ODW\t##\tZwraca odwrotność standardowego rozkładu normalnego skumulowanego.\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tZwraca współczynnik korelacji momentu iloczynu Pearsona.\r\nPERCENTILE\t\t= PERCENTYL\t\t\t##\tWyznacza k-ty percentyl wartości w zakresie.\r\nPERCENTRANK\t\t= PROCENT.POZYCJA\t\t##\tZwraca procentową pozycję wartości w zbiorze danych.\r\nPERMUT\t\t\t= PERMUTACJE\t\t\t##\tZwraca liczbę permutacji dla danej liczby obiektów.\r\nPOISSON\t\t\t= ROZKŁAD.POISSON\t\t##\tZwraca rozkład Poissona.\r\nPROB\t\t\t= PRAWDPD\t\t\t##\tZwraca prawdopodobieństwo, że wartości w zakresie leżą pomiędzy dwiema granicami.\r\nQUARTILE\t\t= KWARTYL\t\t\t##\tWyznacza kwartyl zbioru danych.\r\nRANK\t\t\t= POZYCJA\t\t\t##\tZwraca pozycję liczby na liście liczb.\r\nRSQ\t\t\t= R.KWADRAT\t\t\t##\tZwraca kwadrat współczynnika korelacji momentu iloczynu Pearsona.\r\nSKEW\t\t\t= SKOŚNOŚĆ\t\t\t##\tZwraca skośność rozkładu.\r\nSLOPE\t\t\t= NACHYLENIE\t\t\t##\tZwraca nachylenie linii regresji liniowej.\r\nSMALL\t\t\t= MIN.K\t\t\t\t##\tZwraca k-tą najmniejszą wartość ze zbioru danych.\r\nSTANDARDIZE\t\t= NORMALIZUJ\t\t\t##\tZwraca wartość znormalizowaną.\r\nSTDEV\t\t\t= ODCH.STANDARDOWE\t\t##\tSzacuje odchylenie standardowe na podstawie próbki.\r\nSTDEVA\t\t\t= ODCH.STANDARDOWE.A\t\t##\tSzacuje odchylenie standardowe na podstawie próbki, z uwzględnieniem liczb, tekstów i wartości logicznych.\r\nSTDEVP\t\t\t= ODCH.STANDARD.POPUL\t\t##\tOblicza odchylenie standardowe na podstawie całej populacji.\r\nSTDEVPA\t\t\t= ODCH.STANDARD.POPUL.A\t\t##\tOblicza odchylenie standardowe na podstawie całej populacji, z uwzględnieniem liczb, teksów i wartości logicznych.\r\nSTEYX\t\t\t= REGBŁSTD\t\t\t##\tZwraca błąd standardowy przewidzianej wartości y dla każdej wartości x w regresji.\r\nTDIST\t\t\t= ROZKŁAD.T\t\t\t##\tZwraca rozkład t-Studenta.\r\nTINV\t\t\t= ROZKŁAD.T.ODW\t\t\t##\tZwraca odwrotność rozkładu t-Studenta.\r\nTREND\t\t\t= REGLINW\t\t\t##\tZwraca wartości trendu liniowego.\r\nTRIMMEAN\t\t= ŚREDNIA.WEWN\t\t\t##\tZwraca średnią wartość dla wnętrza zbioru danych.\r\nTTEST\t\t\t= TEST.T\t\t\t##\tZwraca prawdopodobieństwo związane z testem t-Studenta.\r\nVAR\t\t\t= WARIANCJA\t\t\t##\tSzacuje wariancję na podstawie próbki.\r\nVARA\t\t\t= WARIANCJA.A\t\t\t##\tSzacuje wariancję na podstawie próbki, z uwzględnieniem liczb, tekstów i wartości logicznych.\r\nVARP\t\t\t= WARIANCJA.POPUL\t\t##\tOblicza wariancję na podstawie całej populacji.\r\nVARPA\t\t\t= WARIANCJA.POPUL.A\t\t##\tOblicza wariancję na podstawie całej populacji, z uwzględnieniem liczb, tekstów i wartości logicznych.\r\nWEIBULL\t\t\t= ROZKŁAD.WEIBULL\t\t##\tZwraca rozkład Weibulla.\r\nZTEST\t\t\t= TEST.Z\t\t\t##\tZwraca wartość jednostronnego prawdopodobieństwa testu z.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tFunkcje tekstowe\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tZamienia litery angielskie lub katakana o pełnej szerokości (dwubajtowe) w ciągu znaków na znaki o szerokości połówkowej (jednobajtowe).\r\nBAHTTEXT\t\t= BAHTTEXT\t\t\t##\tKonwertuje liczbę na tekst, stosując format walutowy ß (baht).\r\nCHAR\t\t\t= ZNAK\t\t\t\t##\tZwraca znak o podanym numerze kodu.\r\nCLEAN\t\t\t= OCZYŚĆ\t\t\t##\tUsuwa z tekstu wszystkie znaki, które nie mogą być drukowane.\r\nCODE\t\t\t= KOD\t\t\t\t##\tZwraca kod numeryczny pierwszego znaku w ciągu tekstowym.\r\nCONCATENATE\t\t= ZŁĄCZ.TEKSTY\t\t\t##\tŁączy kilka oddzielnych tekstów w jeden tekst.\r\nDOLLAR\t\t\t= KWOTA\t\t\t\t##\tKonwertuje liczbę na tekst, stosując format walutowy $ (dolar).\r\nEXACT\t\t\t= PORÓWNAJ\t\t\t##\tSprawdza identyczność dwóch wartości tekstowych.\r\nFIND\t\t\t= ZNAJDŹ\t\t\t##\tZnajduje jedną wartość tekstową wewnątrz innej (z uwzględnieniem wielkich i małych liter).\r\nFINDB\t\t\t= ZNAJDŹB\t\t\t##\tZnajduje jedną wartość tekstową wewnątrz innej (z uwzględnieniem wielkich i małych liter).\r\nFIXED\t\t\t= ZAOKR.DO.TEKST\t\t##\tFormatuje liczbę jako tekst przy stałej liczbie miejsc dziesiętnych.\r\nJIS\t\t\t= JIS\t\t\t\t##\tZmienia litery angielskie lub katakana o szerokości połówkowej (jednobajtowe) w ciągu znaków na znaki o pełnej szerokości (dwubajtowe).\r\nLEFT\t\t\t= LEWY\t\t\t\t##\tZwraca skrajne lewe znaki z wartości tekstowej.\r\nLEFTB\t\t\t= LEWYB\t\t\t\t##\tZwraca skrajne lewe znaki z wartości tekstowej.\r\nLEN\t\t\t= DŁ\t\t\t\t##\tZwraca liczbę znaków ciągu tekstowego.\r\nLENB\t\t\t= DŁ.B\t\t\t\t##\tZwraca liczbę znaków ciągu tekstowego.\r\nLOWER\t\t\t= LITERY.MAŁE\t\t\t##\tKonwertuje wielkie litery tekstu na małe litery.\r\nMID\t\t\t= FRAGMENT.TEKSTU\t\t##\tZwraca określoną liczbę znaków z ciągu tekstowego, zaczynając od zadanej pozycji.\r\nMIDB\t\t\t= FRAGMENT.TEKSTU.B\t\t##\tZwraca określoną liczbę znaków z ciągu tekstowego, zaczynając od zadanej pozycji.\r\nPHONETIC\t\t= PHONETIC\t\t\t##\tWybiera znaki fonetyczne (furigana) z ciągu tekstowego.\r\nPROPER\t\t\t= Z.WIELKIEJ.LITERY\t\t##\tZastępuje pierwszą literę każdego wyrazu tekstu wielką literą.\r\nREPLACE\t\t\t= ZASTĄP\t\t\t##\tZastępuje znaki w tekście.\r\nREPLACEB\t\t= ZASTĄP.B\t\t\t##\tZastępuje znaki w tekście.\r\nREPT\t\t\t= POWT\t\t\t\t##\tPowiela tekst daną liczbę razy.\r\nRIGHT\t\t\t= PRAWY\t\t\t\t##\tZwraca skrajne prawe znaki z wartości tekstowej.\r\nRIGHTB\t\t\t= PRAWYB\t\t\t##\tZwraca skrajne prawe znaki z wartości tekstowej.\r\nSEARCH\t\t\t= SZUKAJ.TEKST\t\t\t##\tWyszukuje jedną wartość tekstową wewnątrz innej (bez uwzględniania wielkości liter).\r\nSEARCHB\t\t\t= SZUKAJ.TEKST.B\t\t##\tWyszukuje jedną wartość tekstową wewnątrz innej (bez uwzględniania wielkości liter).\r\nSUBSTITUTE\t\t= PODSTAW\t\t\t##\tPodstawia nowy tekst w miejsce poprzedniego tekstu w ciągu tekstowym.\r\nT\t\t\t= T\t\t\t\t##\tKonwertuje argumenty na tekst.\r\nTEXT\t\t\t= TEKST\t\t\t\t##\tFormatuje liczbę i konwertuje ją na tekst.\r\nTRIM\t\t\t= USUŃ.ZBĘDNE.ODSTĘPY\t\t##\tUsuwa spacje z tekstu.\r\nUPPER\t\t\t= LITERY.WIELKIE\t\t##\tKonwertuje znaki tekstu na wielkie litery.\r\nVALUE\t\t\t= WARTOŚĆ\t\t\t##\tKonwertuje argument tekstowy na liczbę.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/pt/br/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= R$\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NULO!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #VALOR!\r\nREF\t= #REF!\r\nNAME\t= #NOME?\r\nNUM\t= #NÚM!\r\nNA\t= #N/D\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/pt/br/functions",
    "content": "##\r\n##\tAdd-in and Automation functions\t\t\tFunções Suplemento e Automação\r\n##\r\nGETPIVOTDATA\t\t= INFODADOSTABELADINÂMICA\t##\tRetorna os dados armazenados em um relatório de tabela dinâmica\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tFunções de Cubo\r\n##\r\nCUBEKPIMEMBER\t\t= MEMBROKPICUBO\t\t\t##\tRetorna o nome de um KPI (indicador de desempenho-chave), uma propriedade e uma medida e exibe o nome e a propriedade na célula. Um KPI é uma medida quantificável, como o lucro bruto mensal ou a rotatividade trimestral dos funcionários, usada para monitorar o desempenho de uma organização.\r\nCUBEMEMBER\t\t= MEMBROCUBO\t\t\t##\tRetorna um membro ou tupla em uma hierarquia de cubo. Use para validar se o membro ou tupla existe no cubo.\r\nCUBEMEMBERPROPERTY\t= PROPRIEDADEMEMBROCUBO\t\t##\tRetorna o valor da propriedade de um membro no cubo. Usada para validar a existência do nome do membro no cubo e para retornar a propriedade especificada para esse membro.\r\nCUBERANKEDMEMBER\t= MEMBROCLASSIFICADOCUBO\t##\tRetorna o enésimo membro, ou o membro ordenado, em um conjunto. Use para retornar um ou mais elementos em um conjunto, assim como o melhor vendedor ou os dez melhores alunos.\r\nCUBESET\t\t\t= CONJUNTOCUBO\t\t\t##\tDefine um conjunto calculado de membros ou tuplas enviando uma expressão do conjunto para o cubo no servidor, que cria o conjunto e o retorna para o Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= CONTAGEMCONJUNTOCUBO\t\t##\tRetorna o número de itens em um conjunto.\r\nCUBEVALUE\t\t= VALORCUBO\t\t\t##\tRetorna um valor agregado de um cubo.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tFunções de banco de dados\r\n##\r\nDAVERAGE\t\t= BDMÉDIA\t\t\t##\tRetorna a média das entradas selecionadas de um banco de dados\r\nDCOUNT\t\t\t= BDCONTAR\t\t\t##\tConta as células que contêm números em um banco de dados\r\nDCOUNTA\t\t\t= BDCONTARA\t\t\t##\tConta células não vazias em um banco de dados\r\nDGET\t\t\t= BDEXTRAIR\t\t\t##\tExtrai de um banco de dados um único registro que corresponde a um critério específico\r\nDMAX\t\t\t= BDMÁX\t\t\t\t##\tRetorna o valor máximo de entradas selecionadas de um banco de dados\r\nDMIN\t\t\t= BDMÍN\t\t\t\t##\tRetorna o valor mínimo de entradas selecionadas de um banco de dados\r\nDPRODUCT\t\t= BDMULTIPL\t\t\t##\tMultiplica os valores em um campo específico de registros que correspondem ao critério em um banco de dados\r\nDSTDEV\t\t\t= BDEST\t\t\t\t##\tEstima o desvio padrão com base em uma amostra de entradas selecionadas de um banco de dados\r\nDSTDEVP\t\t\t= BDDESVPA\t\t\t##\tCalcula o desvio padrão com base na população inteira de entradas selecionadas de um banco de dados\r\nDSUM\t\t\t= BDSOMA\t\t\t##\tAdiciona os números à coluna de campos de registros do banco de dados que correspondem ao critério\r\nDVAR\t\t\t= BDVAREST\t\t\t##\tEstima a variância com base em uma amostra de entradas selecionadas de um banco de dados\r\nDVARP\t\t\t= BDVARP\t\t\t##\tCalcula a variância com base na população inteira de entradas selecionadas de um banco de dados\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tFunções de data e hora\r\n##\r\nDATE\t\t\t= DATA\t\t\t\t##\tRetorna o número de série de uma data específica\r\nDATEVALUE\t\t= DATA.VALOR\t\t\t##\tConverte uma data na forma de texto para um número de série\r\nDAY\t\t\t= DIA\t\t\t\t##\tConverte um número de série em um dia do mês\r\nDAYS360\t\t\t= DIAS360\t\t\t##\tCalcula o número de dias entre duas datas com base em um ano de 360 dias\r\nEDATE\t\t\t= DATAM\t\t\t\t##\tRetorna o número de série da data que é o número indicado de meses antes ou depois da data inicial\r\nEOMONTH\t\t\t= FIMMÊS\t\t\t##\tRetorna o número de série do último dia do mês antes ou depois de um número especificado de meses\r\nHOUR\t\t\t= HORA\t\t\t\t##\tConverte um número de série em uma hora\r\nMINUTE\t\t\t= MINUTO\t\t\t##\tConverte um número de série em um minuto\r\nMONTH\t\t\t= MÊS\t\t\t\t##\tConverte um número de série em um mês\r\nNETWORKDAYS\t\t= DIATRABALHOTOTAL\t\t##\tRetorna o número de dias úteis inteiros entre duas datas\r\nNOW\t\t\t= AGORA\t\t\t\t##\tRetorna o número de série seqüencial da data e hora atuais\r\nSECOND\t\t\t= SEGUNDO\t\t\t##\tConverte um número de série em um segundo\r\nTIME\t\t\t= HORA\t\t\t\t##\tRetorna o número de série de uma hora específica\r\nTIMEVALUE\t\t= VALOR.TEMPO\t\t\t##\tConverte um horário na forma de texto para um número de série\r\nTODAY\t\t\t= HOJE\t\t\t\t##\tRetorna o número de série da data de hoje\r\nWEEKDAY\t\t\t= DIA.DA.SEMANA\t\t\t##\tConverte um número de série em um dia da semana\r\nWEEKNUM\t\t\t= NÚMSEMANA\t\t\t##\tConverte um número de série em um número que representa onde a semana cai numericamente em um ano\r\nWORKDAY\t\t\t= DIATRABALHO\t\t\t##\tRetorna o número de série da data antes ou depois de um número específico de dias úteis\r\nYEAR\t\t\t= ANO\t\t\t\t##\tConverte um número de série em um ano\r\nYEARFRAC\t\t= FRAÇÃOANO\t\t\t##\tRetorna a fração do ano que representa o número de dias entre data_inicial e data_final\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tFunções de engenharia\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tRetorna a função de Bessel In(x) modificada\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tRetorna a função de Bessel Jn(x)\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tRetorna a função de Bessel Kn(x) modificada\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tRetorna a função de Bessel Yn(x)\r\nBIN2DEC\t\t\t= BIN2DEC\t\t\t##\tConverte um número binário em decimal\r\nBIN2HEX\t\t\t= BIN2HEX\t\t\t##\tConverte um número binário em hexadecimal\r\nBIN2OCT\t\t\t= BIN2OCT\t\t\t##\tConverte um número binário em octal\r\nCOMPLEX\t\t\t= COMPLEX\t\t\t##\tConverte coeficientes reais e imaginários e um número complexo\r\nCONVERT\t\t\t= CONVERTER\t\t\t##\tConverte um número de um sistema de medida para outro\r\nDEC2BIN\t\t\t= DECABIN\t\t\t##\tConverte um número decimal em binário\r\nDEC2HEX\t\t\t= DECAHEX\t\t\t##\tConverte um número decimal em hexadecimal\r\nDEC2OCT\t\t\t= DECAOCT\t\t\t##\tConverte um número decimal em octal\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tTesta se dois valores são iguais\r\nERF\t\t\t= FUNERRO\t\t\t##\tRetorna a função de erro\r\nERFC\t\t\t= FUNERROCOMPL\t\t\t##\tRetorna a função de erro complementar\r\nGESTEP\t\t\t= DEGRAU\t\t\t##\tTesta se um número é maior do que um valor limite\r\nHEX2BIN\t\t\t= HEXABIN\t\t\t##\tConverte um número hexadecimal em binário\r\nHEX2DEC\t\t\t= HEXADEC\t\t\t##\tConverte um número hexadecimal em decimal\r\nHEX2OCT\t\t\t= HEXAOCT\t\t\t##\tConverte um número hexadecimal em octal\r\nIMABS\t\t\t= IMABS\t\t\t\t##\tRetorna o valor absoluto (módulo) de um número complexo\r\nIMAGINARY\t\t= IMAGINÁRIO\t\t\t##\tRetorna o coeficiente imaginário de um número complexo\r\nIMARGUMENT\t\t= IMARG\t\t\t\t##\tRetorna o argumento teta, um ângulo expresso em radianos\r\nIMCONJUGATE\t\t= IMCONJ\t\t\t##\tRetorna o conjugado complexo de um número complexo\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tRetorna o cosseno de um número complexo\r\nIMDIV\t\t\t= IMDIV\t\t\t\t##\tRetorna o quociente de dois números complexos\r\nIMEXP\t\t\t= IMEXP\t\t\t\t##\tRetorna o exponencial de um número complexo\r\nIMLN\t\t\t= IMLN\t\t\t\t##\tRetorna o logaritmo natural de um número complexo\r\nIMLOG10\t\t\t= IMLOG10\t\t\t##\tRetorna o logaritmo de base 10 de um número complexo\r\nIMLOG2\t\t\t= IMLOG2\t\t\t##\tRetorna o logaritmo de base 2 de um número complexo\r\nIMPOWER\t\t\t= IMPOT\t\t\t\t##\tRetorna um número complexo elevado a uma potência inteira\r\nIMPRODUCT\t\t= IMPROD\t\t\t##\tRetorna o produto de números complexos\r\nIMREAL\t\t\t= IMREAL\t\t\t##\tRetorna o coeficiente real de um número complexo\r\nIMSIN\t\t\t= IMSENO\t\t\t##\tRetorna o seno de um número complexo\r\nIMSQRT\t\t\t= IMRAIZ\t\t\t##\tRetorna a raiz quadrada de um número complexo\r\nIMSUB\t\t\t= IMSUBTR\t\t\t##\tRetorna a diferença entre dois números complexos\r\nIMSUM\t\t\t= IMSOMA\t\t\t##\tRetorna a soma de números complexos\r\nOCT2BIN\t\t\t= OCTABIN\t\t\t##\tConverte um número octal em binário\r\nOCT2DEC\t\t\t= OCTADEC\t\t\t##\tConverte um número octal em decimal\r\nOCT2HEX\t\t\t= OCTAHEX\t\t\t##\tConverte um número octal em hexadecimal\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFunções financeiras\r\n##\r\nACCRINT\t\t\t= JUROSACUM\t\t\t##\tRetorna a taxa de juros acumulados de um título que paga uma taxa periódica de juros\r\nACCRINTM\t\t= JUROSACUMV\t\t\t##\tRetorna os juros acumulados de um título que paga juros no vencimento\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tRetorna a depreciação para cada período contábil usando o coeficiente de depreciação\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tRetorna a depreciação para cada período contábil\r\nCOUPDAYBS\t\t= CUPDIASINLIQ\t\t\t##\tRetorna o número de dias do início do período de cupom até a data de liquidação\r\nCOUPDAYS\t\t= CUPDIAS\t\t\t##\tRetorna o número de dias no período de cupom que contém a data de quitação\r\nCOUPDAYSNC\t\t= CUPDIASPRÓX\t\t\t##\tRetorna o número de dias da data de liquidação até a data do próximo cupom\r\nCOUPNCD\t\t\t= CUPDATAPRÓX\t\t\t##\tRetorna a próxima data de cupom após a data de quitação\r\nCOUPNUM\t\t\t= CUPNÚM\t\t\t##\tRetorna o número de cupons pagáveis entre as datas de quitação e vencimento\r\nCOUPPCD\t\t\t= CUPDATAANT\t\t\t##\tRetorna a data de cupom anterior à data de quitação\r\nCUMIPMT\t\t\t= PGTOJURACUM\t\t\t##\tRetorna os juros acumulados pagos entre dois períodos\r\nCUMPRINC\t\t= PGTOCAPACUM\t\t\t##\tRetorna o capital acumulado pago sobre um empréstimo entre dois períodos\r\nDB\t\t\t= BD\t\t\t\t##\tRetorna a depreciação de um ativo para um período especificado, usando o método de balanço de declínio fixo\r\nDDB\t\t\t= BDD\t\t\t\t##\tRetorna a depreciação de um ativo com relação a um período especificado usando o método de saldos decrescentes duplos ou qualquer outro método especificado por você\r\nDISC\t\t\t= DESC\t\t\t\t##\tRetorna a taxa de desconto de um título\r\nDOLLARDE\t\t= MOEDADEC\t\t\t##\tConverte um preço em formato de moeda, na forma fracionária, em um preço na forma decimal\r\nDOLLARFR\t\t= MOEDAFRA\t\t\t##\tConverte um preço, apresentado na forma decimal, em um preço apresentado na forma fracionária\r\nDURATION\t\t= DURAÇÃO\t\t\t##\tRetorna a duração anual de um título com pagamentos de juros periódicos\r\nEFFECT\t\t\t= EFETIVA\t\t\t##\tRetorna a taxa de juros anual efetiva\r\nFV\t\t\t= VF\t\t\t\t##\tRetorna o valor futuro de um investimento\r\nFVSCHEDULE\t\t= VFPLANO\t\t\t##\tRetorna o valor futuro de um capital inicial após a aplicação de uma série de taxas de juros compostas\r\nINTRATE\t\t\t= TAXAJUROS\t\t\t##\tRetorna a taxa de juros de um título totalmente investido\r\nIPMT\t\t\t= IPGTO\t\t\t\t##\tRetorna o pagamento de juros para um investimento em um determinado período\r\nIRR\t\t\t= TIR\t\t\t\t##\tRetorna a taxa interna de retorno de uma série de fluxos de caixa\r\nISPMT\t\t\t= ÉPGTO\t\t\t\t##\tCalcula os juros pagos durante um período específico de um investimento\r\nMDURATION\t\t= MDURAÇÃO\t\t\t##\tRetorna a duração de Macauley modificada para um título com um valor de paridade equivalente a R$ 100\r\nMIRR\t\t\t= MTIR\t\t\t\t##\tCalcula a taxa interna de retorno em que fluxos de caixa positivos e negativos são financiados com diferentes taxas\r\nNOMINAL\t\t\t= NOMINAL\t\t\t##\tRetorna a taxa de juros nominal anual\r\nNPER\t\t\t= NPER\t\t\t\t##\tRetorna o número de períodos de um investimento\r\nNPV\t\t\t= VPL\t\t\t\t##\tRetorna o valor líquido atual de um investimento com base em uma série de fluxos de caixa periódicos e em uma taxa de desconto\r\nODDFPRICE\t\t= PREÇOPRIMINC\t\t\t##\tRetorna o preço por R$ 100 de valor nominal de um título com um primeiro período indefinido\r\nODDFYIELD\t\t= LUCROPRIMINC\t\t\t##\tRetorna o rendimento de um título com um primeiro período indefinido\r\nODDLPRICE\t\t= PREÇOÚLTINC\t\t\t##\tRetorna o preço por R$ 100 de valor nominal de um título com um último período de cupom indefinido\r\nODDLYIELD\t\t= LUCROÚLTINC\t\t\t##\tRetorna o rendimento de um título com um último período indefinido\r\nPMT\t\t\t= PGTO\t\t\t\t##\tRetorna o pagamento periódico de uma anuidade\r\nPPMT\t\t\t= PPGTO\t\t\t\t##\tRetorna o pagamento de capital para determinado período de investimento\r\nPRICE\t\t\t= PREÇO\t\t\t\t##\tRetorna a preço por R$ 100,00 de valor nominal de um título que paga juros periódicos\r\nPRICEDISC\t\t= PREÇODESC\t\t\t##\tRetorna o preço por R$ 100,00 de valor nominal de um título descontado\r\nPRICEMAT\t\t= PREÇOVENC\t\t\t##\tRetorna o preço por R$ 100,00 de valor nominal de um título que paga juros no vencimento\r\nPV\t\t\t= VP\t\t\t\t##\tRetorna o valor presente de um investimento\r\nRATE\t\t\t= TAXA\t\t\t\t##\tRetorna a taxa de juros por período de uma anuidade\r\nRECEIVED\t\t= RECEBER\t\t\t##\tRetorna a quantia recebida no vencimento de um título totalmente investido\r\nSLN\t\t\t= DPD\t\t\t\t##\tRetorna a depreciação em linha reta de um ativo durante um período\r\nSYD\t\t\t= SDA\t\t\t\t##\tRetorna a depreciação dos dígitos da soma dos anos de um ativo para um período especificado\r\nTBILLEQ\t\t\t= OTN\t\t\t\t##\tRetorna o rendimento de um título equivalente a uma obrigação do Tesouro\r\nTBILLPRICE\t\t= OTNVALOR\t\t\t##\tRetorna o preço por R$ 100,00 de valor nominal de uma obrigação do Tesouro\r\nTBILLYIELD\t\t= OTNLUCRO\t\t\t##\tRetorna o rendimento de uma obrigação do Tesouro\r\nVDB\t\t\t= BDV\t\t\t\t##\tRetorna a depreciação de um ativo para um período especificado ou parcial usando um método de balanço declinante\r\nXIRR\t\t\t= XTIR\t\t\t\t##\tFornece a taxa interna de retorno para um programa de fluxos de caixa que não é necessariamente periódico\r\nXNPV\t\t\t= XVPL\t\t\t\t##\tRetorna o valor presente líquido de um programa de fluxos de caixa que não é necessariamente periódico\r\nYIELD\t\t\t= LUCRO\t\t\t\t##\tRetorna o lucro de um título que paga juros periódicos\r\nYIELDDISC\t\t= LUCRODESC\t\t\t##\tRetorna o rendimento anual de um título descontado. Por exemplo, uma obrigação do Tesouro\r\nYIELDMAT\t\t= LUCROVENC\t\t\t##\tRetorna o lucro anual de um título que paga juros no vencimento\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tFunções de informação\r\n##\r\nCELL\t\t\t= CÉL\t\t\t\t##\tRetorna informações sobre formatação, localização ou conteúdo de uma célula\r\nERROR.TYPE\t\t= TIPO.ERRO\t\t\t##\tRetorna um número correspondente a um tipo de erro\r\nINFO\t\t\t= INFORMAÇÃO\t\t\t##\tRetorna informações sobre o ambiente operacional atual\r\nISBLANK\t\t\t= ÉCÉL.VAZIA\t\t\t##\tRetorna VERDADEIRO se o valor for vazio\r\nISERR\t\t\t= ÉERRO\t\t\t\t##\tRetorna VERDADEIRO se o valor for um valor de erro diferente de #N/D\r\nISERROR\t\t\t= ÉERROS\t\t\t##\tRetorna VERDADEIRO se o valor for um valor de erro\r\nISEVEN\t\t\t= ÉPAR\t\t\t\t##\tRetorna VERDADEIRO se o número for par\r\nISLOGICAL\t\t= ÉLÓGICO\t\t\t##\tRetorna VERDADEIRO se o valor for um valor lógico\r\nISNA\t\t\t= É.NÃO.DISP\t\t\t##\tRetorna VERDADEIRO se o valor for o valor de erro #N/D\r\nISNONTEXT\t\t= É.NÃO.TEXTO\t\t\t##\tRetorna VERDADEIRO se o valor for diferente de texto\r\nISNUMBER\t\t= ÉNÚM\t\t\t\t##\tRetorna VERDADEIRO se o valor for um número\r\nISODD\t\t\t= ÉIMPAR\t\t\t##\tRetorna VERDADEIRO se o número for ímpar\r\nISREF\t\t\t= ÉREF\t\t\t\t##\tRetorna VERDADEIRO se o valor for uma referência\r\nISTEXT\t\t\t= ÉTEXTO\t\t\t##\tRetorna VERDADEIRO se o valor for texto\r\nN\t\t\t= N\t\t\t\t##\tRetorna um valor convertido em um número\r\nNA\t\t\t= NÃO.DISP\t\t\t##\tRetorna o valor de erro #N/D\r\nTYPE\t\t\t= TIPO\t\t\t\t##\tRetorna um número indicando o tipo de dados de um valor\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tFunções lógicas\r\n##\r\nAND\t\t\t= E\t\t\t\t##\tRetorna VERDADEIRO se todos os seus argumentos forem VERDADEIROS\r\nFALSE\t\t\t= FALSO\t\t\t\t##\tRetorna o valor lógico FALSO\r\nIF\t\t\t= SE\t\t\t\t##\tEspecifica um teste lógico a ser executado\r\nIFERROR\t\t\t= SEERRO\t\t\t##\tRetornará um valor que você especifica se uma fórmula for avaliada para um erro; do contrário, retornará o resultado da fórmula\r\nNOT\t\t\t= NÃO\t\t\t\t##\tInverte o valor lógico do argumento\r\nOR\t\t\t= OU\t\t\t\t##\tRetorna VERDADEIRO se um dos argumentos for VERDADEIRO\r\nTRUE\t\t\t= VERDADEIRO\t\t\t##\tRetorna o valor lógico VERDADEIRO\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tFunções de pesquisa e referência\r\n##\r\nADDRESS\t\t\t= ENDEREÇO\t\t\t##\tRetorna uma referência como texto para uma única célula em uma planilha\r\nAREAS\t\t\t= ÁREAS\t\t\t\t##\tRetorna o número de áreas em uma referência\r\nCHOOSE\t\t\t= ESCOLHER\t\t\t##\tEscolhe um valor a partir de uma lista de valores\r\nCOLUMN\t\t\t= COL\t\t\t\t##\tRetorna o número da coluna de uma referência\r\nCOLUMNS\t\t\t= COLS\t\t\t\t##\tRetorna o número de colunas em uma referência\r\nHLOOKUP\t\t\t= PROCH\t\t\t\t##\tProcura na linha superior de uma matriz e retorna o valor da célula especificada\r\nHYPERLINK\t\t= HYPERLINK\t\t\t##\tCria um atalho ou salto que abre um documento armazenado em um servidor de rede, uma intranet ou na Internet\r\nINDEX\t\t\t= ÍNDICE\t\t\t##\tUsa um índice para escolher um valor de uma referência ou matriz\r\nINDIRECT\t\t= INDIRETO\t\t\t##\tRetorna uma referência indicada por um valor de texto\r\nLOOKUP\t\t\t= PROC\t\t\t\t##\tProcura valores em um vetor ou em uma matriz\r\nMATCH\t\t\t= CORRESP\t\t\t##\tProcura valores em uma referência ou em uma matriz\r\nOFFSET\t\t\t= DESLOC\t\t\t##\tRetorna um deslocamento de referência com base em uma determinada referência\r\nROW\t\t\t= LIN\t\t\t\t##\tRetorna o número da linha de uma referência\r\nROWS\t\t\t= LINS\t\t\t\t##\tRetorna o número de linhas em uma referência\r\nRTD\t\t\t= RTD\t\t\t\t##\tRecupera dados em tempo real de um programa que ofereça suporte a automação COM (automação: uma forma de trabalhar com objetos de um aplicativo a partir de outro aplicativo ou ferramenta de desenvolvimento. Chamada inicialmente de automação OLE, a automação é um padrão industrial e um recurso do modelo de objeto componente (COM).)\r\nTRANSPOSE\t\t= TRANSPOR\t\t\t##\tRetorna a transposição de uma matriz\r\nVLOOKUP\t\t\t= PROCV\t\t\t\t##\tProcura na primeira coluna de uma matriz e move ao longo da linha para retornar o valor de uma célula\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tFunções matemáticas e trigonométricas\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tRetorna o valor absoluto de um número\r\nACOS\t\t\t= ACOS\t\t\t\t##\tRetorna o arco cosseno de um número\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tRetorna o cosseno hiperbólico inverso de um número\r\nASIN\t\t\t= ASEN\t\t\t\t##\tRetorna o arco seno de um número\r\nASINH\t\t\t= ASENH\t\t\t\t##\tRetorna o seno hiperbólico inverso de um número\r\nATAN\t\t\t= ATAN\t\t\t\t##\tRetorna o arco tangente de um número\r\nATAN2\t\t\t= ATAN2\t\t\t\t##\tRetorna o arco tangente das coordenadas x e y especificadas\r\nATANH\t\t\t= ATANH\t\t\t\t##\tRetorna a tangente hiperbólica inversa de um número\r\nCEILING\t\t\t= TETO\t\t\t\t##\tArredonda um número para o inteiro mais próximo ou para o múltiplo mais próximo de significância\r\nCOMBIN\t\t\t= COMBIN\t\t\t##\tRetorna o número de combinações de um determinado número de objetos\r\nCOS\t\t\t= COS\t\t\t\t##\tRetorna o cosseno de um número\r\nCOSH\t\t\t= COSH\t\t\t\t##\tRetorna o cosseno hiperbólico de um número\r\nDEGREES\t\t\t= GRAUS\t\t\t\t##\tConverte radianos em graus\r\nEVEN\t\t\t= PAR\t\t\t\t##\tArredonda um número para cima até o inteiro par mais próximo\r\nEXP\t\t\t= EXP\t\t\t\t##\tRetorna e elevado à potência de um número especificado\r\nFACT\t\t\t= FATORIAL\t\t\t##\tRetorna o fatorial de um número\r\nFACTDOUBLE\t\t= FATDUPLO\t\t\t##\tRetorna o fatorial duplo de um número\r\nFLOOR\t\t\t= ARREDMULTB\t\t\t##\tArredonda um número para baixo até zero\r\nGCD\t\t\t= MDC\t\t\t\t##\tRetorna o máximo divisor comum\r\nINT\t\t\t= INT\t\t\t\t##\tArredonda um número para baixo até o número inteiro mais próximo\r\nLCM\t\t\t= MMC\t\t\t\t##\tRetorna o mínimo múltiplo comum\r\nLN\t\t\t= LN\t\t\t\t##\tRetorna o logaritmo natural de um número\r\nLOG\t\t\t= LOG\t\t\t\t##\tRetorna o logaritmo de um número de uma base especificada\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tRetorna o logaritmo de base 10 de um número\r\nMDETERM\t\t\t= MATRIZ.DETERM\t\t\t##\tRetorna o determinante de uma matriz de uma variável do tipo matriz\r\nMINVERSE\t\t= MATRIZ.INVERSO\t\t##\tRetorna a matriz inversa de uma matriz\r\nMMULT\t\t\t= MATRIZ.MULT\t\t\t##\tRetorna o produto de duas matrizes\r\nMOD\t\t\t= RESTO\t\t\t\t##\tRetorna o resto da divisão\r\nMROUND\t\t\t= MARRED\t\t\t##\tRetorna um número arredondado ao múltiplo desejado\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t\t##\tRetorna o multinomial de um conjunto de números\r\nODD\t\t\t= ÍMPAR\t\t\t\t##\tArredonda um número para cima até o inteiro ímpar mais próximo\r\nPI\t\t\t= PI\t\t\t\t##\tRetorna o valor de Pi\r\nPOWER\t\t\t= POTÊNCIA\t\t\t##\tFornece o resultado de um número elevado a uma potência\r\nPRODUCT\t\t\t= MULT\t\t\t\t##\tMultiplica seus argumentos\r\nQUOTIENT\t\t= QUOCIENTE\t\t\t##\tRetorna a parte inteira de uma divisão\r\nRADIANS\t\t\t= RADIANOS\t\t\t##\tConverte graus em radianos\r\nRAND\t\t\t= ALEATÓRIO\t\t\t##\tRetorna um número aleatório entre 0 e 1\r\nRANDBETWEEN\t\t= ALEATÓRIOENTRE\t\t##\tRetorna um número aleatório entre os números especificados\r\nROMAN\t\t\t= ROMANO\t\t\t##\tConverte um algarismo arábico em romano, como texto\r\nROUND\t\t\t= ARRED\t\t\t\t##\tArredonda um número até uma quantidade especificada de dígitos\r\nROUNDDOWN\t\t= ARREDONDAR.PARA.BAIXO\t\t##\tArredonda um número para baixo até zero\r\nROUNDUP\t\t\t= ARREDONDAR.PARA.CIMA\t\t##\tArredonda um número para cima, afastando-o de zero\r\nSERIESSUM\t\t= SOMASEQÜÊNCIA\t\t\t##\tRetorna a soma de uma série polinomial baseada na fórmula\r\nSIGN\t\t\t= SINAL\t\t\t\t##\tRetorna o sinal de um número\r\nSIN\t\t\t= SEN\t\t\t\t##\tRetorna o seno de um ângulo dado\r\nSINH\t\t\t= SENH\t\t\t\t##\tRetorna o seno hiperbólico de um número\r\nSQRT\t\t\t= RAIZ\t\t\t\t##\tRetorna uma raiz quadrada positiva\r\nSQRTPI\t\t\t= RAIZPI\t\t\t##\tRetorna a raiz quadrada de (núm* pi)\r\nSUBTOTAL\t\t= SUBTOTAL\t\t\t##\tRetorna um subtotal em uma lista ou em um banco de dados\r\nSUM\t\t\t= SOMA\t\t\t\t##\tSoma seus argumentos\r\nSUMIF\t\t\t= SOMASE\t\t\t##\tAdiciona as células especificadas por um determinado critério\r\nSUMIFS\t\t\t= SOMASE\t\t\t##\tAdiciona as células em um intervalo que atende a vários critérios\r\nSUMPRODUCT\t\t= SOMARPRODUTO\t\t\t##\tRetorna a soma dos produtos de componentes correspondentes de matrizes\r\nSUMSQ\t\t\t= SOMAQUAD\t\t\t##\tRetorna a soma dos quadrados dos argumentos\r\nSUMX2MY2\t\t= SOMAX2DY2\t\t\t##\tRetorna a soma da diferença dos quadrados dos valores correspondentes em duas matrizes\r\nSUMX2PY2\t\t= SOMAX2SY2\t\t\t##\tRetorna a soma da soma dos quadrados dos valores correspondentes em duas matrizes\r\nSUMXMY2\t\t\t= SOMAXMY2\t\t\t##\tRetorna a soma dos quadrados das diferenças dos valores correspondentes em duas matrizes\r\nTAN\t\t\t= TAN\t\t\t\t##\tRetorna a tangente de um número\r\nTANH\t\t\t= TANH\t\t\t\t##\tRetorna a tangente hiperbólica de um número\r\nTRUNC\t\t\t= TRUNCAR\t\t\t##\tTrunca um número para um inteiro\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tFunções estatísticas\r\n##\r\nAVEDEV\t\t\t= DESV.MÉDIO\t\t\t##\tRetorna a média aritmética dos desvios médios dos pontos de dados a partir de sua média\r\nAVERAGE\t\t\t= MÉDIA\t\t\t\t##\tRetorna a média dos argumentos\r\nAVERAGEA\t\t= MÉDIAA\t\t\t##\tRetorna a média dos argumentos, inclusive números, texto e valores lógicos\r\nAVERAGEIF\t\t= MÉDIASE\t\t\t##\tRetorna a média (média aritmética) de todas as células em um intervalo que atendem a um determinado critério\r\nAVERAGEIFS\t\t= MÉDIASES\t\t\t##\tRetorna a média (média aritmética) de todas as células que atendem a múltiplos critérios.\r\nBETADIST\t\t= DISTBETA\t\t\t##\tRetorna a função de distribuição cumulativa beta\r\nBETAINV\t\t\t= BETA.ACUM.INV\t\t\t##\tRetorna o inverso da função de distribuição cumulativa para uma distribuição beta especificada\r\nBINOMDIST\t\t= DISTRBINOM\t\t\t##\tRetorna a probabilidade de distribuição binomial do termo individual\r\nCHIDIST\t\t\t= DIST.QUI\t\t\t##\tRetorna a probabilidade unicaudal da distribuição qui-quadrada\r\nCHIINV\t\t\t= INV.QUI\t\t\t##\tRetorna o inverso da probabilidade uni-caudal da distribuição qui-quadrada\r\nCHITEST\t\t\t= TESTE.QUI\t\t\t##\tRetorna o teste para independência\r\nCONFIDENCE\t\t= INT.CONFIANÇA\t\t\t##\tRetorna o intervalo de confiança para uma média da população\r\nCORREL\t\t\t= CORREL\t\t\t##\tRetorna o coeficiente de correlação entre dois conjuntos de dados\r\nCOUNT\t\t\t= CONT.NÚM\t\t\t##\tCalcula quantos números há na lista de argumentos\r\nCOUNTA\t\t\t= CONT.VALORES\t\t\t##\tCalcula quantos valores há na lista de argumentos\r\nCOUNTBLANK\t\t= CONTAR.VAZIO\t\t\t##\tConta o número de células vazias no intervalo especificado\r\nCOUNTIF\t\t\t= CONT.SE\t\t\t##\tCalcula o número de células não vazias em um intervalo que corresponde a determinados critérios\r\nCOUNTIFS\t\t= CONT.SES\t\t\t##\tConta o número de células dentro de um intervalo que atende a múltiplos critérios\r\nCOVAR\t\t\t= COVAR\t\t\t\t##\tRetorna a covariância, a média dos produtos dos desvios pares\r\nCRITBINOM\t\t= CRIT.BINOM\t\t\t##\tRetorna o menor valor para o qual a distribuição binomial cumulativa é menor ou igual ao valor padrão\r\nDEVSQ\t\t\t= DESVQ\t\t\t\t##\tRetorna a soma dos quadrados dos desvios\r\nEXPONDIST\t\t= DISTEXPON\t\t\t##\tRetorna a distribuição exponencial\r\nFDIST\t\t\t= DISTF\t\t\t\t##\tRetorna a distribuição de probabilidade F\r\nFINV\t\t\t= INVF\t\t\t\t##\tRetorna o inverso da distribuição de probabilidades F\r\nFISHER\t\t\t= FISHER\t\t\t##\tRetorna a transformação Fisher\r\nFISHERINV\t\t= FISHERINV\t\t\t##\tRetorna o inverso da transformação Fisher\r\nFORECAST\t\t= PREVISÃO\t\t\t##\tRetorna um valor ao longo de uma linha reta\r\nFREQUENCY\t\t= FREQÜÊNCIA\t\t\t##\tRetorna uma distribuição de freqüência como uma matriz vertical\r\nFTEST\t\t\t= TESTEF\t\t\t##\tRetorna o resultado de um teste F\r\nGAMMADIST\t\t= DISTGAMA\t\t\t##\tRetorna a distribuição gama\r\nGAMMAINV\t\t= INVGAMA\t\t\t##\tRetorna o inverso da distribuição cumulativa gama\r\nGAMMALN\t\t\t= LNGAMA\t\t\t##\tRetorna o logaritmo natural da função gama, G(x)\r\nGEOMEAN\t\t\t= MÉDIA.GEOMÉTRICA\t\t##\tRetorna a média geométrica\r\nGROWTH\t\t\t= CRESCIMENTO\t\t\t##\tRetorna valores ao longo de uma tendência exponencial\r\nHARMEAN\t\t\t= MÉDIA.HARMÔNICA\t\t##\tRetorna a média harmônica\r\nHYPGEOMDIST\t\t= DIST.HIPERGEOM\t\t##\tRetorna a distribuição hipergeométrica\r\nINTERCEPT\t\t= INTERCEPÇÃO\t\t\t##\tRetorna a intercepção da linha de regressão linear\r\nKURT\t\t\t= CURT\t\t\t\t##\tRetorna a curtose de um conjunto de dados\r\nLARGE\t\t\t= MAIOR\t\t\t\t##\tRetorna o maior valor k-ésimo de um conjunto de dados\r\nLINEST\t\t\t= PROJ.LIN\t\t\t##\tRetorna os parâmetros de uma tendência linear\r\nLOGEST\t\t\t= PROJ.LOG\t\t\t##\tRetorna os parâmetros de uma tendência exponencial\r\nLOGINV\t\t\t= INVLOG\t\t\t##\tRetorna o inverso da distribuição lognormal\r\nLOGNORMDIST\t\t= DIST.LOGNORMAL\t\t##\tRetorna a distribuição lognormal cumulativa\r\nMAX\t\t\t= MÁXIMO\t\t\t##\tRetorna o valor máximo em uma lista de argumentos\r\nMAXA\t\t\t= MÁXIMOA\t\t\t##\tRetorna o maior valor em uma lista de argumentos, inclusive números, texto e valores lógicos\r\nMEDIAN\t\t\t= MED\t\t\t\t##\tRetorna a mediana dos números indicados\r\nMIN\t\t\t= MÍNIMO\t\t\t##\tRetorna o valor mínimo em uma lista de argumentos\r\nMINA\t\t\t= MÍNIMOA\t\t\t##\tRetorna o menor valor em uma lista de argumentos, inclusive números, texto e valores lógicos\r\nMODE\t\t\t= MODO\t\t\t\t##\tRetorna o valor mais comum em um conjunto de dados\r\nNEGBINOMDIST\t\t= DIST.BIN.NEG\t\t\t##\tRetorna a distribuição binomial negativa\r\nNORMDIST\t\t= DIST.NORM\t\t\t##\tRetorna a distribuição cumulativa normal\r\nNORMINV\t\t\t= INV.NORM\t\t\t##\tRetorna o inverso da distribuição cumulativa normal\r\nNORMSDIST\t\t= DIST.NORMP\t\t\t##\tRetorna a distribuição cumulativa normal padrão\r\nNORMSINV\t\t= INV.NORMP\t\t\t##\tRetorna o inverso da distribuição cumulativa normal padrão\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tRetorna o coeficiente de correlação do momento do produto Pearson\r\nPERCENTILE\t\t= PERCENTIL\t\t\t##\tRetorna o k-ésimo percentil de valores em um intervalo\r\nPERCENTRANK\t\t= ORDEM.PORCENTUAL\t\t##\tRetorna a ordem percentual de um valor em um conjunto de dados\r\nPERMUT\t\t\t= PERMUT\t\t\t##\tRetorna o número de permutações de um determinado número de objetos\r\nPOISSON\t\t\t= POISSON\t\t\t##\tRetorna a distribuição Poisson\r\nPROB\t\t\t= PROB\t\t\t\t##\tRetorna a probabilidade de valores em um intervalo estarem entre dois limites\r\nQUARTILE\t\t= QUARTIL\t\t\t##\tRetorna o quartil do conjunto de dados\r\nRANK\t\t\t= ORDEM\t\t\t\t##\tRetorna a posição de um número em uma lista de números\r\nRSQ\t\t\t= RQUAD\t\t\t\t##\tRetorna o quadrado do coeficiente de correlação do momento do produto de Pearson\r\nSKEW\t\t\t= DISTORÇÃO\t\t\t##\tRetorna a distorção de uma distribuição\r\nSLOPE\t\t\t= INCLINAÇÃO\t\t\t##\tRetorna a inclinação da linha de regressão linear\r\nSMALL\t\t\t= MENOR\t\t\t\t##\tRetorna o menor valor k-ésimo do conjunto de dados\r\nSTANDARDIZE\t\t= PADRONIZAR\t\t\t##\tRetorna um valor normalizado\r\nSTDEV\t\t\t= DESVPAD\t\t\t##\tEstima o desvio padrão com base em uma amostra\r\nSTDEVA\t\t\t= DESVPADA\t\t\t##\tEstima o desvio padrão com base em uma amostra, inclusive números, texto e valores lógicos\r\nSTDEVP\t\t\t= DESVPADP\t\t\t##\tCalcula o desvio padrão com base na população total\r\nSTDEVPA\t\t\t= DESVPADPA\t\t\t##\tCalcula o desvio padrão com base na população total, inclusive números, texto e valores lógicos\r\nSTEYX\t\t\t= EPADYX\t\t\t##\tRetorna o erro padrão do valor-y previsto para cada x da regressão\r\nTDIST\t\t\t= DISTT\t\t\t\t##\tRetorna a distribuição t de Student\r\nTINV\t\t\t= INVT\t\t\t\t##\tRetorna o inverso da distribuição t de Student\r\nTREND\t\t\t= TENDÊNCIA\t\t\t##\tRetorna valores ao longo de uma tendência linear\r\nTRIMMEAN\t\t= MÉDIA.INTERNA\t\t\t##\tRetorna a média do interior de um conjunto de dados\r\nTTEST\t\t\t= TESTET\t\t\t##\tRetorna a probabilidade associada ao teste t de Student\r\nVAR\t\t\t= VAR\t\t\t\t##\tEstima a variância com base em uma amostra\r\nVARA\t\t\t= VARA\t\t\t\t##\tEstima a variância com base em uma amostra, inclusive números, texto e valores lógicos\r\nVARP\t\t\t= VARP\t\t\t\t##\tCalcula a variância com base na população inteira\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tCalcula a variância com base na população total, inclusive números, texto e valores lógicos\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tRetorna a distribuição Weibull\r\nZTEST\t\t\t= TESTEZ\t\t\t##\tRetorna o valor de probabilidade uni-caudal de um teste-z\r\n\r\n\r\n##\r\n##\tText functions\t\t\tFunções de texto\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tAltera letras do inglês ou katakana de largura total (bytes duplos) dentro de uma seqüência de caracteres para caracteres de meia largura (byte único)\r\nBAHTTEXT\t\t= BAHTTEXT\t\t\t##\tConverte um número em um texto, usando o formato de moeda ß (baht)\r\nCHAR\t\t\t= CARACT\t\t\t##\tRetorna o caractere especificado pelo número de código\r\nCLEAN\t\t\t= TIRAR\t\t\t\t##\tRemove todos os caracteres do texto que não podem ser impressos\r\nCODE\t\t\t= CÓDIGO\t\t\t##\tRetorna um código numérico para o primeiro caractere de uma seqüência de caracteres de texto\r\nCONCATENATE\t\t= CONCATENAR\t\t\t##\tAgrupa vários itens de texto em um único item de texto\r\nDOLLAR\t\t\t= MOEDA\t\t\t\t##\tConverte um número em texto, usando o formato de moeda $ (dólar)\r\nEXACT\t\t\t= EXATO\t\t\t\t##\tVerifica se dois valores de texto são idênticos\r\nFIND\t\t\t= PROCURAR\t\t\t##\tProcura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas)\r\nFINDB\t\t\t= PROCURARB\t\t\t##\tProcura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas)\r\nFIXED\t\t\t= DEF.NÚM.DEC\t\t\t##\tFormata um número como texto com um número fixo de decimais\r\nJIS\t\t\t= JIS\t\t\t\t##\tAltera letras do inglês ou katakana de meia largura (byte único) dentro de uma seqüência de caracteres para caracteres de largura total (bytes duplos)\r\nLEFT\t\t\t= ESQUERDA\t\t\t##\tRetorna os caracteres mais à esquerda de um valor de texto\r\nLEFTB\t\t\t= ESQUERDAB\t\t\t##\tRetorna os caracteres mais à esquerda de um valor de texto\r\nLEN\t\t\t= NÚM.CARACT\t\t\t##\tRetorna o número de caracteres em uma seqüência de texto\r\nLENB\t\t\t= NÚM.CARACTB\t\t\t##\tRetorna o número de caracteres em uma seqüência de texto\r\nLOWER\t\t\t= MINÚSCULA\t\t\t##\tConverte texto para minúsculas\r\nMID\t\t\t= EXT.TEXTO\t\t\t##\tRetorna um número específico de caracteres de uma seqüência de texto começando na posição especificada\r\nMIDB\t\t\t= EXT.TEXTOB\t\t\t##\tRetorna um número específico de caracteres de uma seqüência de texto começando na posição especificada\r\nPHONETIC\t\t= FONÉTICA\t\t\t##\tExtrai os caracteres fonéticos (furigana) de uma seqüência de caracteres de texto\r\nPROPER\t\t\t= PRI.MAIÚSCULA\t\t\t##\tColoca a primeira letra de cada palavra em maiúscula em um valor de texto\r\nREPLACE\t\t\t= MUDAR\t\t\t\t##\tMuda os caracteres dentro do texto\r\nREPLACEB\t\t= MUDARB\t\t\t##\tMuda os caracteres dentro do texto\r\nREPT\t\t\t= REPT\t\t\t\t##\tRepete o texto um determinado número de vezes\r\nRIGHT\t\t\t= DIREITA\t\t\t##\tRetorna os caracteres mais à direita de um valor de texto\r\nRIGHTB\t\t\t= DIREITAB\t\t\t##\tRetorna os caracteres mais à direita de um valor de texto\r\nSEARCH\t\t\t= LOCALIZAR\t\t\t##\tLocaliza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas)\r\nSEARCHB\t\t\t= LOCALIZARB\t\t\t##\tLocaliza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas)\r\nSUBSTITUTE\t\t= SUBSTITUIR\t\t\t##\tSubstitui um novo texto por um texto antigo em uma seqüência de texto\r\nT\t\t\t= T\t\t\t\t##\tConverte os argumentos em texto\r\nTEXT\t\t\t= TEXTO\t\t\t\t##\tFormata um número e o converte em texto\r\nTRIM\t\t\t= ARRUMAR\t\t\t##\tRemove espaços do texto\r\nUPPER\t\t\t= MAIÚSCULA\t\t\t##\tConverte o texto em maiúsculas\r\nVALUE\t\t\t= VALOR\t\t\t\t##\tConverte um argumento de texto em um número\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/pt/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= €\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #NULO!\r\nDIV0\t= #DIV/0!\r\nVALUE\t= #VALOR!\r\nREF\t= #REF!\r\nNAME\t= #NOME?\r\nNUM\t= #NÚM!\r\nNA\t= #N/D\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/pt/functions",
    "content": "##\r\n##\tAdd-in and Automation functions\t\t\tFunções de Suplemento e Automatização\r\n##\r\nGETPIVOTDATA\t\t= OBTERDADOSDIN\t\t\t##\tDevolve dados armazenados num relatório de Tabela Dinâmica\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tFunções de cubo\r\n##\r\nCUBEKPIMEMBER\t\t= MEMBROKPICUBO\t\t\t##\tDevolve o nome, propriedade e medição de um KPI (key performance indicator) e apresenta o nome e a propriedade na célula. Um KPI é uma medida quantificável, como, por exemplo, o lucro mensal bruto ou a rotatividade trimestral de pessoal, utilizada para monitorizar o desempenho de uma organização.\r\nCUBEMEMBER\t\t= MEMBROCUBO\t\t\t##\tDevolve um membro ou cadeia de identificação numa hierarquia de cubo. Utilizada para validar a existência do membro ou cadeia de identificação no cubo.\r\nCUBEMEMBERPROPERTY\t= PROPRIEDADEMEMBROCUBO\t\t##\tDevolve o valor de uma propriedade de membro no cubo. Utilizada para validar a existência de um nome de membro no cubo e para devolver a propriedade especificada para esse membro.\r\nCUBERANKEDMEMBER\t= MEMBROCLASSIFICADOCUBO\t##\tDevolve o enésimo ou a classificação mais alta num conjunto. Utilizada para devolver um ou mais elementos num conjunto, tal como o melhor vendedor ou os 10 melhores alunos.\r\nCUBESET\t\t\t= CONJUNTOCUBO\t\t\t##\tDefine um conjunto calculado de membros ou cadeias de identificação enviando uma expressão de conjunto para o cubo no servidor, que cria o conjunto e, em seguida, devolve o conjunto ao Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= CONTARCONJUNTOCUBO\t\t##\tDevolve o número de itens num conjunto.\r\nCUBEVALUE\t\t= VALORCUBO\t\t\t##\tDevolve um valor agregado do cubo.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tFunções de base de dados\r\n##\r\nDAVERAGE\t\t= BDMÉDIA\t\t\t##\tDevolve a média das entradas da base de dados seleccionadas\r\nDCOUNT\t\t\t= BDCONTAR\t\t\t##\tConta as células que contêm números numa base de dados\r\nDCOUNTA\t\t\t= BDCONTAR.VAL\t\t\t##\tConta as células que não estejam em branco numa base de dados\r\nDGET\t\t\t= BDOBTER\t\t\t##\tExtrai de uma base de dados um único registo que corresponde aos critérios especificados\r\nDMAX\t\t\t= BDMÁX\t\t\t\t##\tDevolve o valor máximo das entradas da base de dados seleccionadas\r\nDMIN\t\t\t= BDMÍN\t\t\t\t##\tDevolve o valor mínimo das entradas da base de dados seleccionadas\r\nDPRODUCT\t\t= BDMULTIPL\t\t\t##\tMultiplica os valores de um determinado campo de registos que correspondem aos critérios numa base de dados\r\nDSTDEV\t\t\t= BDDESVPAD\t\t\t##\tCalcula o desvio-padrão com base numa amostra de entradas da base de dados seleccionadas\r\nDSTDEVP\t\t\t= BDDESVPADP\t\t\t##\tCalcula o desvio-padrão com base na população total das entradas da base de dados seleccionadas\r\nDSUM\t\t\t= BDSOMA\t\t\t##\tAdiciona os números na coluna de campo dos registos de base de dados que correspondem aos critérios\r\nDVAR\t\t\t= BDVAR\t\t\t\t##\tCalcula a variância com base numa amostra das entradas de base de dados seleccionadas\r\nDVARP\t\t\t= BDVARP\t\t\t##\tCalcula a variância com base na população total das entradas de base de dados seleccionadas\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tFunções de data e hora\r\n##\r\nDATE\t\t\t= DATA\t\t\t\t##\tDevolve o número de série de uma determinada data\r\nDATEVALUE\t\t= DATA.VALOR\t\t\t##\tConverte uma data em forma de texto num número de série\r\nDAY\t\t\t= DIA\t\t\t\t##\tConverte um número de série num dia do mês\r\nDAYS360\t\t\t= DIAS360\t\t\t##\tCalcula o número de dias entre duas datas com base num ano com 360 dias\r\nEDATE\t\t\t= DATAM\t\t\t\t##\tDevolve um número de série de data que corresponde ao número de meses indicado antes ou depois da data de início\r\nEOMONTH\t\t\t= FIMMÊS\t\t\t##\tDevolve o número de série do último dia do mês antes ou depois de um número de meses especificado\r\nHOUR\t\t\t= HORA\t\t\t\t##\tConverte um número de série numa hora\r\nMINUTE\t\t\t= MINUTO\t\t\t##\tConverte um número de série num minuto\r\nMONTH\t\t\t= MÊS\t\t\t\t##\tConverte um número de série num mês\r\nNETWORKDAYS\t\t= DIATRABALHOTOTAL\t\t##\tDevolve o número total de dias úteis entre duas datas\r\nNOW\t\t\t= AGORA\t\t\t\t##\tDevolve o número de série da data e hora actuais\r\nSECOND\t\t\t= SEGUNDO\t\t\t##\tConverte um número de série num segundo\r\nTIME\t\t\t= TEMPO\t\t\t\t##\tDevolve o número de série de um determinado tempo\r\nTIMEVALUE\t\t= VALOR.TEMPO\t\t\t##\tConverte um tempo em forma de texto num número de série\r\nTODAY\t\t\t= HOJE\t\t\t\t##\tDevolve o número de série da data actual\r\nWEEKDAY\t\t\t= DIA.SEMANA\t\t\t##\tConverte um número de série num dia da semana\r\nWEEKNUM\t\t\t= NÚMSEMANA\t\t\t##\tConverte um número de série num número que representa o número da semana num determinado ano\r\nWORKDAY\t\t\t= DIA.TRABALHO\t\t\t##\tDevolve o número de série da data antes ou depois de um número de dias úteis especificado\r\nYEAR\t\t\t= ANO\t\t\t\t##\tConverte um número de série num ano\r\nYEARFRAC\t\t= FRACÇÃOANO\t\t\t##\tDevolve a fracção de ano que representa o número de dias inteiros entre a data_de_início e a data_de_fim\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tFunções de engenharia\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tDevolve a função de Bessel modificada In(x)\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tDevolve a função de Bessel Jn(x)\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tDevolve a função de Bessel modificada Kn(x)\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tDevolve a função de Bessel Yn(x)\r\nBIN2DEC\t\t\t= BINADEC\t\t\t##\tConverte um número binário em decimal\r\nBIN2HEX\t\t\t= BINAHEX\t\t\t##\tConverte um número binário em hexadecimal\r\nBIN2OCT\t\t\t= BINAOCT\t\t\t##\tConverte um número binário em octal\r\nCOMPLEX\t\t\t= COMPLEXO\t\t\t##\tConverte coeficientes reais e imaginários num número complexo\r\nCONVERT\t\t\t= CONVERTER\t\t\t##\tConverte um número de um sistema de medida noutro\r\nDEC2BIN\t\t\t= DECABIN\t\t\t##\tConverte um número decimal em binário\r\nDEC2HEX\t\t\t= DECAHEX\t\t\t##\tConverte um número decimal em hexadecimal\r\nDEC2OCT\t\t\t= DECAOCT\t\t\t##\tConverte um número decimal em octal\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tTesta se dois valores são iguais\r\nERF\t\t\t= FUNCERRO\t\t\t##\tDevolve a função de erro\r\nERFC\t\t\t= FUNCERROCOMPL\t\t\t##\tDevolve a função de erro complementar\r\nGESTEP\t\t\t= DEGRAU\t\t\t##\tTesta se um número é maior do que um valor limite\r\nHEX2BIN\t\t\t= HEXABIN\t\t\t##\tConverte um número hexadecimal em binário\r\nHEX2DEC\t\t\t= HEXADEC\t\t\t##\tConverte um número hexadecimal em decimal\r\nHEX2OCT\t\t\t= HEXAOCT\t\t\t##\tConverte um número hexadecimal em octal\r\nIMABS\t\t\t= IMABS\t\t\t\t##\tDevolve o valor absoluto (módulo) de um número complexo\r\nIMAGINARY\t\t= IMAGINÁRIO\t\t\t##\tDevolve o coeficiente imaginário de um número complexo\r\nIMARGUMENT\t\t= IMARG\t\t\t\t##\tDevolve o argumento Teta, um ângulo expresso em radianos\r\nIMCONJUGATE\t\t= IMCONJ\t\t\t##\tDevolve o conjugado complexo de um número complexo\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tDevolve o co-seno de um número complexo\r\nIMDIV\t\t\t= IMDIV\t\t\t\t##\tDevolve o quociente de dois números complexos\r\nIMEXP\t\t\t= IMEXP\t\t\t\t##\tDevolve o exponencial de um número complexo\r\nIMLN\t\t\t= IMLN\t\t\t\t##\tDevolve o logaritmo natural de um número complexo\r\nIMLOG10\t\t\t= IMLOG10\t\t\t##\tDevolve o logaritmo de base 10 de um número complexo\r\nIMLOG2\t\t\t= IMLOG2\t\t\t##\tDevolve o logaritmo de base 2 de um número complexo\r\nIMPOWER\t\t\t= IMPOT\t\t\t\t##\tDevolve um número complexo elevado a uma potência inteira\r\nIMPRODUCT\t\t= IMPROD\t\t\t##\tDevolve o produto de números complexos\r\nIMREAL\t\t\t= IMREAL\t\t\t##\tDevolve o coeficiente real de um número complexo\r\nIMSIN\t\t\t= IMSENO\t\t\t##\tDevolve o seno de um número complexo\r\nIMSQRT\t\t\t= IMRAIZ\t\t\t##\tDevolve a raiz quadrada de um número complexo\r\nIMSUB\t\t\t= IMSUBTR\t\t\t##\tDevolve a diferença entre dois números complexos\r\nIMSUM\t\t\t= IMSOMA\t\t\t##\tDevolve a soma de números complexos\r\nOCT2BIN\t\t\t= OCTABIN\t\t\t##\tConverte um número octal em binário\r\nOCT2DEC\t\t\t= OCTADEC\t\t\t##\tConverte um número octal em decimal\r\nOCT2HEX\t\t\t= OCTAHEX\t\t\t##\tConverte um número octal em hexadecimal\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFunções financeiras\r\n##\r\nACCRINT\t\t\t= JUROSACUM\t\t\t##\tDevolve os juros acumulados de um título que paga juros periódicos\r\nACCRINTM\t\t= JUROSACUMV\t\t\t##\tDevolve os juros acumulados de um título que paga juros no vencimento\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tDevolve a depreciação correspondente a cada período contabilístico utilizando um coeficiente de depreciação\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tDevolve a depreciação correspondente a cada período contabilístico\r\nCOUPDAYBS\t\t= CUPDIASINLIQ\t\t\t##\tDevolve o número de dias entre o início do período do cupão e a data de regularização\r\nCOUPDAYS\t\t= CUPDIAS\t\t\t##\tDevolve o número de dias no período do cupão que contém a data de regularização\r\nCOUPDAYSNC\t\t= CUPDIASPRÓX\t\t\t##\tDevolve o número de dias entre a data de regularização e a data do cupão seguinte\r\nCOUPNCD\t\t\t= CUPDATAPRÓX\t\t\t##\tDevolve a data do cupão seguinte após a data de regularização\r\nCOUPNUM\t\t\t= CUPNÚM\t\t\t##\tDevolve o número de cupões a serem pagos entre a data de regularização e a data de vencimento\r\nCOUPPCD\t\t\t= CUPDATAANT\t\t\t##\tDevolve a data do cupão anterior antes da data de regularização\r\nCUMIPMT\t\t\t= PGTOJURACUM\t\t\t##\tDevolve os juros cumulativos pagos entre dois períodos\r\nCUMPRINC\t\t= PGTOCAPACUM\t\t\t##\tDevolve o capital cumulativo pago a título de empréstimo entre dois períodos\r\nDB\t\t\t= BD\t\t\t\t##\tDevolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas fixas\r\nDDB\t\t\t= BDD\t\t\t\t##\tDevolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas duplas ou qualquer outro método especificado\r\nDISC\t\t\t= DESC\t\t\t\t##\tDevolve a taxa de desconto de um título\r\nDOLLARDE\t\t= MOEDADEC\t\t\t##\tConverte um preço em unidade monetária, expresso como uma fracção, num preço em unidade monetária, expresso como um número decimal\r\nDOLLARFR\t\t= MOEDAFRA\t\t\t##\tConverte um preço em unidade monetária, expresso como um número decimal, num preço em unidade monetária, expresso como uma fracção\r\nDURATION\t\t= DURAÇÃO\t\t\t##\tDevolve a duração anual de um título com pagamentos de juros periódicos\r\nEFFECT\t\t\t= EFECTIVA\t\t\t##\tDevolve a taxa de juros anual efectiva\r\nFV\t\t\t= VF\t\t\t\t##\tDevolve o valor futuro de um investimento\r\nFVSCHEDULE\t\t= VFPLANO\t\t\t##\tDevolve o valor futuro de um capital inicial após a aplicação de uma série de taxas de juro compostas\r\nINTRATE\t\t\t= TAXAJUROS\t\t\t##\tDevolve a taxa de juros de um título investido na totalidade\r\nIPMT\t\t\t= IPGTO\t\t\t\t##\tDevolve o pagamento dos juros de um investimento durante um determinado período\r\nIRR\t\t\t= TIR\t\t\t\t##\tDevolve a taxa de rentabilidade interna para uma série de fluxos monetários\r\nISPMT\t\t\t= É.PGTO\t\t\t##\tCalcula os juros pagos durante um período específico de um investimento\r\nMDURATION\t\t= MDURAÇÃO\t\t\t##\tDevolve a duração modificada de Macauley de um título com um valor de paridade equivalente a € 100\r\nMIRR\t\t\t= MTIR\t\t\t\t##\tDevolve a taxa interna de rentabilidade em que os fluxos monetários positivos e negativos são financiados com taxas diferentes\r\nNOMINAL\t\t\t= NOMINAL\t\t\t##\tDevolve a taxa de juros nominal anual\r\nNPER\t\t\t= NPER\t\t\t\t##\tDevolve o número de períodos de um investimento\r\nNPV\t\t\t= VAL\t\t\t\t##\tDevolve o valor actual líquido de um investimento com base numa série de fluxos monetários periódicos e numa taxa de desconto\r\nODDFPRICE\t\t= PREÇOPRIMINC\t\t\t##\tDevolve o preço por € 100 do valor nominal de um título com um período inicial incompleto\r\nODDFYIELD\t\t= LUCROPRIMINC\t\t\t##\tDevolve o lucro de um título com um período inicial incompleto\r\nODDLPRICE\t\t= PREÇOÚLTINC\t\t\t##\tDevolve o preço por € 100 do valor nominal de um título com um período final incompleto\r\nODDLYIELD\t\t= LUCROÚLTINC\t\t\t##\tDevolve o lucro de um título com um período final incompleto\r\nPMT\t\t\t= PGTO\t\t\t\t##\tDevolve o pagamento periódico de uma anuidade\r\nPPMT\t\t\t= PPGTO\t\t\t\t##\tDevolve o pagamento sobre o capital de um investimento num determinado período\r\nPRICE\t\t\t= PREÇO\t\t\t\t##\tDevolve o preço por € 100 do valor nominal de um título que paga juros periódicos\r\nPRICEDISC\t\t= PREÇODESC\t\t\t##\tDevolve o preço por € 100 do valor nominal de um título descontado\r\nPRICEMAT\t\t= PREÇOVENC\t\t\t##\tDevolve o preço por € 100 do valor nominal de um título que paga juros no vencimento\r\nPV\t\t\t= VA\t\t\t\t##\tDevolve o valor actual de um investimento\r\nRATE\t\t\t= TAXA\t\t\t\t##\tDevolve a taxa de juros por período de uma anuidade\r\nRECEIVED\t\t= RECEBER\t\t\t##\tDevolve o montante recebido no vencimento de um título investido na totalidade\r\nSLN\t\t\t= AMORT\t\t\t\t##\tDevolve uma depreciação linear de um activo durante um período\r\nSYD\t\t\t= AMORTD\t\t\t##\tDevolve a depreciação por algarismos da soma dos anos de um activo durante um período especificado\r\nTBILLEQ\t\t\t= OTN\t\t\t\t##\tDevolve o lucro de um título equivalente a uma Obrigação do Tesouro\r\nTBILLPRICE\t\t= OTNVALOR\t\t\t##\tDevolve o preço por € 100 de valor nominal de uma Obrigação do Tesouro\r\nTBILLYIELD\t\t= OTNLUCRO\t\t\t##\tDevolve o lucro de uma Obrigação do Tesouro\r\nVDB\t\t\t= BDV\t\t\t\t##\tDevolve a depreciação de um activo relativo a um período específico ou parcial utilizando um método de quotas degressivas\r\nXIRR\t\t\t= XTIR\t\t\t\t##\tDevolve a taxa interna de rentabilidade de um plano de fluxos monetários que não seja necessariamente periódica\r\nXNPV\t\t\t= XVAL\t\t\t\t##\tDevolve o valor actual líquido de um plano de fluxos monetários que não seja necessariamente periódico\r\nYIELD\t\t\t= LUCRO\t\t\t\t##\tDevolve o lucro de um título que paga juros periódicos\r\nYIELDDISC\t\t= LUCRODESC\t\t\t##\tDevolve o lucro anual de um título emitido abaixo do valor nominal, por exemplo, uma Obrigação do Tesouro\r\nYIELDMAT\t\t= LUCROVENC\t\t\t##\tDevolve o lucro anual de um título que paga juros na data de vencimento\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tFunções de informação\r\n##\r\nCELL\t\t\t= CÉL\t\t\t\t##\tDevolve informações sobre a formatação, localização ou conteúdo de uma célula\r\nERROR.TYPE\t\t= TIPO.ERRO\t\t\t##\tDevolve um número correspondente a um tipo de erro\r\nINFO\t\t\t= INFORMAÇÃO\t\t\t##\tDevolve informações sobre o ambiente de funcionamento actual\r\nISBLANK\t\t\t= É.CÉL.VAZIA\t\t\t##\tDevolve VERDADEIRO se o valor estiver em branco\r\nISERR\t\t\t= É.ERROS\t\t\t##\tDevolve VERDADEIRO se o valor for um valor de erro diferente de #N/D\r\nISERROR\t\t\t= É.ERRO\t\t\t##\tDevolve VERDADEIRO se o valor for um valor de erro\r\nISEVEN\t\t\t= ÉPAR\t\t\t\t##\tDevolve VERDADEIRO se o número for par\r\nISLOGICAL\t\t= É.LÓGICO\t\t\t##\tDevolve VERDADEIRO se o valor for lógico\r\nISNA\t\t\t= É.NÃO.DISP\t\t\t##\tDevolve VERDADEIRO se o valor for o valor de erro #N/D\r\nISNONTEXT\t\t= É.NÃO.TEXTO\t\t\t##\tDevolve VERDADEIRO se o valor não for texto\r\nISNUMBER\t\t= É.NÚM\t\t\t\t##\tDevolve VERDADEIRO se o valor for um número\r\nISODD\t\t\t= ÉÍMPAR\t\t\t##\tDevolve VERDADEIRO se o número for ímpar\r\nISREF\t\t\t= É.REF\t\t\t\t##\tDevolve VERDADEIRO se o valor for uma referência\r\nISTEXT\t\t\t= É.TEXTO\t\t\t##\tDevolve VERDADEIRO se o valor for texto\r\nN\t\t\t= N\t\t\t\t##\tDevolve um valor convertido num número\r\nNA\t\t\t= NÃO.DISP\t\t\t##\tDevolve o valor de erro #N/D\r\nTYPE\t\t\t= TIPO\t\t\t\t##\tDevolve um número que indica o tipo de dados de um valor\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tFunções lógicas\r\n##\r\nAND\t\t\t= E\t\t\t\t##\tDevolve VERDADEIRO se todos os respectivos argumentos corresponderem a VERDADEIRO\r\nFALSE\t\t\t= FALSO\t\t\t\t##\tDevolve o valor lógico FALSO\r\nIF\t\t\t= SE\t\t\t\t##\tEspecifica um teste lógico a ser executado\r\nIFERROR\t\t\t= SE.ERRO\t\t\t##\tDevolve um valor definido pelo utilizador se ocorrer um erro na fórmula, e devolve o resultado da fórmula se não ocorrer nenhum erro\r\nNOT\t\t\t= NÃO\t\t\t\t##\tInverte a lógica do respectivo argumento\r\nOR\t\t\t= OU\t\t\t\t##\tDevolve VERDADEIRO se qualquer argumento for VERDADEIRO\r\nTRUE\t\t\t= VERDADEIRO\t\t\t##\tDevolve o valor lógico VERDADEIRO\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tFunções de pesquisa e referência\r\n##\r\nADDRESS\t\t\t= ENDEREÇO\t\t\t##\tDevolve uma referência a uma única célula numa folha de cálculo como texto\r\nAREAS\t\t\t= ÁREAS\t\t\t\t##\tDevolve o número de áreas numa referência\r\nCHOOSE\t\t\t= SELECCIONAR\t\t\t##\tSelecciona um valor a partir de uma lista de valores\r\nCOLUMN\t\t\t= COL\t\t\t\t##\tDevolve o número da coluna de uma referência\r\nCOLUMNS\t\t\t= COLS\t\t\t\t##\tDevolve o número de colunas numa referência\r\nHLOOKUP\t\t\t= PROCH\t\t\t\t##\tProcura na linha superior de uma matriz e devolve o valor da célula indicada\r\nHYPERLINK\t\t= HIPERLIGAÇÃO\t\t\t##\tCria um atalho ou hiperligação que abre um documento armazenado num servidor de rede, numa intranet ou na Internet\r\nINDEX\t\t\t= ÍNDICE\t\t\t##\tUtiliza um índice para escolher um valor de uma referência ou de uma matriz\r\nINDIRECT\t\t= INDIRECTO\t\t\t##\tDevolve uma referência indicada por um valor de texto\r\nLOOKUP\t\t\t= PROC\t\t\t\t##\tProcura valores num vector ou numa matriz\r\nMATCH\t\t\t= CORRESP\t\t\t##\tProcura valores numa referência ou numa matriz\r\nOFFSET\t\t\t= DESLOCAMENTO\t\t\t##\tDevolve o deslocamento de referência de uma determinada referência\r\nROW\t\t\t= LIN\t\t\t\t##\tDevolve o número da linha de uma referência\r\nROWS\t\t\t= LINS\t\t\t\t##\tDevolve o número de linhas numa referência\r\nRTD\t\t\t= RTD\t\t\t\t##\tObtém dados em tempo real a partir de um programa que suporte automatização COM (automatização: modo de trabalhar com objectos de uma aplicação a partir de outra aplicação ou ferramenta de desenvolvimento. Anteriormente conhecida como automatização OLE, a automatização é uma norma da indústria de software e uma funcionalidade COM (Component Object Model).)\r\nTRANSPOSE\t\t= TRANSPOR\t\t\t##\tDevolve a transposição de uma matriz\r\nVLOOKUP\t\t\t= PROCV\t\t\t\t##\tProcura na primeira coluna de uma matriz e percorre a linha para devolver o valor de uma célula\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tFunções matemáticas e trigonométricas\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tDevolve o valor absoluto de um número\r\nACOS\t\t\t= ACOS\t\t\t\t##\tDevolve o arco de co-seno de um número\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tDevolve o co-seno hiperbólico inverso de um número\r\nASIN\t\t\t= ASEN\t\t\t\t##\tDevolve o arco de seno de um número\r\nASINH\t\t\t= ASENH\t\t\t\t##\tDevolve o seno hiperbólico inverso de um número\r\nATAN\t\t\t= ATAN\t\t\t\t##\tDevolve o arco de tangente de um número\r\nATAN2\t\t\t= ATAN2\t\t\t\t##\tDevolve o arco de tangente das coordenadas x e y\r\nATANH\t\t\t= ATANH\t\t\t\t##\tDevolve a tangente hiperbólica inversa de um número\r\nCEILING\t\t\t= ARRED.EXCESSO\t\t\t##\tArredonda um número para o número inteiro mais próximo ou para o múltiplo de significância mais próximo\r\nCOMBIN\t\t\t= COMBIN\t\t\t##\tDevolve o número de combinações de um determinado número de objectos\r\nCOS\t\t\t= COS\t\t\t\t##\tDevolve o co-seno de um número\r\nCOSH\t\t\t= COSH\t\t\t\t##\tDevolve o co-seno hiperbólico de um número\r\nDEGREES\t\t\t= GRAUS\t\t\t\t##\tConverte radianos em graus\r\nEVEN\t\t\t= PAR\t\t\t\t##\tArredonda um número por excesso para o número inteiro mais próximo\r\nEXP\t\t\t= EXP\t\t\t\t##\tDevolve e elevado à potência de um determinado número\r\nFACT\t\t\t= FACTORIAL\t\t\t##\tDevolve o factorial de um número\r\nFACTDOUBLE\t\t= FACTDUPLO\t\t\t##\tDevolve o factorial duplo de um número\r\nFLOOR\t\t\t= ARRED.DEFEITO\t\t\t##\tArredonda um número por defeito até zero\r\nGCD\t\t\t= MDC\t\t\t\t##\tDevolve o maior divisor comum\r\nINT\t\t\t= INT\t\t\t\t##\tArredonda um número por defeito para o número inteiro mais próximo\r\nLCM\t\t\t= MMC\t\t\t\t##\tDevolve o mínimo múltiplo comum\r\nLN\t\t\t= LN\t\t\t\t##\tDevolve o logaritmo natural de um número\r\nLOG\t\t\t= LOG\t\t\t\t##\tDevolve o logaritmo de um número com uma base especificada\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tDevolve o logaritmo de base 10 de um número\r\nMDETERM\t\t\t= MATRIZ.DETERM\t\t\t##\tDevolve o determinante matricial de uma matriz\r\nMINVERSE\t\t= MATRIZ.INVERSA\t\t##\tDevolve o inverso matricial de uma matriz\r\nMMULT\t\t\t= MATRIZ.MULT\t\t\t##\tDevolve o produto matricial de duas matrizes\r\nMOD\t\t\t= RESTO\t\t\t\t##\tDevolve o resto da divisão\r\nMROUND\t\t\t= MARRED\t\t\t##\tDevolve um número arredondado para o múltiplo pretendido\r\nMULTINOMIAL\t\t= POLINOMIAL\t\t\t##\tDevolve o polinomial de um conjunto de números\r\nODD\t\t\t= ÍMPAR\t\t\t\t##\tArredonda por excesso um número para o número inteiro ímpar mais próximo\r\nPI\t\t\t= PI\t\t\t\t##\tDevolve o valor de pi\r\nPOWER\t\t\t= POTÊNCIA\t\t\t##\tDevolve o resultado de um número elevado a uma potência\r\nPRODUCT\t\t\t= PRODUTO\t\t\t##\tMultiplica os respectivos argumentos\r\nQUOTIENT\t\t= QUOCIENTE\t\t\t##\tDevolve a parte inteira de uma divisão\r\nRADIANS\t\t\t= RADIANOS\t\t\t##\tConverte graus em radianos\r\nRAND\t\t\t= ALEATÓRIO\t\t\t##\tDevolve um número aleatório entre 0 e 1\r\nRANDBETWEEN\t\t= ALEATÓRIOENTRE\t\t##\tDevolve um número aleatório entre os números especificados\r\nROMAN\t\t\t= ROMANO\t\t\t##\tConverte um número árabe em romano, como texto\r\nROUND\t\t\t= ARRED\t\t\t\t##\tArredonda um número para um número de dígitos especificado\r\nROUNDDOWN\t\t= ARRED.PARA.BAIXO\t\t##\tArredonda um número por defeito até zero\r\nROUNDUP\t\t\t= ARRED.PARA.CIMA\t\t##\tArredonda um número por excesso, afastando-o de zero\r\nSERIESSUM\t\t= SOMASÉRIE\t\t\t##\tDevolve a soma de uma série de potências baseada na fórmula\r\nSIGN\t\t\t= SINAL\t\t\t\t##\tDevolve o sinal de um número\r\nSIN\t\t\t= SEN\t\t\t\t##\tDevolve o seno de um determinado ângulo\r\nSINH\t\t\t= SENH\t\t\t\t##\tDevolve o seno hiperbólico de um número\r\nSQRT\t\t\t= RAIZQ\t\t\t\t##\tDevolve uma raiz quadrada positiva\r\nSQRTPI\t\t\t= RAIZPI\t\t\t##\tDevolve a raiz quadrada de (núm * pi)\r\nSUBTOTAL\t\t= SUBTOTAL\t\t\t##\tDevolve um subtotal numa lista ou base de dados\r\nSUM\t\t\t= SOMA\t\t\t\t##\tAdiciona os respectivos argumentos\r\nSUMIF\t\t\t= SOMA.SE\t\t\t##\tAdiciona as células especificadas por um determinado critério\r\nSUMIFS\t\t\t= SOMA.SE.S\t\t\t##\tAdiciona as células num intervalo que cumpre vários critérios\r\nSUMPRODUCT\t\t= SOMARPRODUTO\t\t\t##\tDevolve a soma dos produtos de componentes de matrizes correspondentes\r\nSUMSQ\t\t\t= SOMARQUAD\t\t\t##\tDevolve a soma dos quadrados dos argumentos\r\nSUMX2MY2\t\t= SOMAX2DY2\t\t\t##\tDevolve a soma da diferença dos quadrados dos valores correspondentes em duas matrizes\r\nSUMX2PY2\t\t= SOMAX2SY2\t\t\t##\tDevolve a soma da soma dos quadrados dos valores correspondentes em duas matrizes\r\nSUMXMY2\t\t\t= SOMAXMY2\t\t\t##\tDevolve a soma dos quadrados da diferença dos valores correspondentes em duas matrizes\r\nTAN\t\t\t= TAN\t\t\t\t##\tDevolve a tangente de um número\r\nTANH\t\t\t= TANH\t\t\t\t##\tDevolve a tangente hiperbólica de um número\r\nTRUNC\t\t\t= TRUNCAR\t\t\t##\tTrunca um número para um número inteiro\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tFunções estatísticas\r\n##\r\nAVEDEV\t\t\t= DESV.MÉDIO\t\t\t##\tDevolve a média aritmética dos desvios absolutos à média dos pontos de dados\r\nAVERAGE\t\t\t= MÉDIA\t\t\t\t##\tDevolve a média dos respectivos argumentos\r\nAVERAGEA\t\t= MÉDIAA\t\t\t##\tDevolve uma média dos respectivos argumentos, incluindo números, texto e valores lógicos\r\nAVERAGEIF\t\t= MÉDIA.SE\t\t\t##\tDevolve a média aritmética de todas as células num intervalo que cumprem determinado critério\r\nAVERAGEIFS\t\t= MÉDIA.SE.S\t\t\t##\tDevolve a média aritmética de todas as células que cumprem múltiplos critérios\r\nBETADIST\t\t= DISTBETA\t\t\t##\tDevolve a função de distribuição cumulativa beta\r\nBETAINV\t\t\t= BETA.ACUM.INV\t\t\t##\tDevolve o inverso da função de distribuição cumulativa relativamente a uma distribuição beta específica\r\nBINOMDIST\t\t= DISTRBINOM\t\t\t##\tDevolve a probabilidade de distribuição binomial de termo individual\r\nCHIDIST\t\t\t= DIST.CHI\t\t\t##\tDevolve a probabilidade unicaudal da distribuição qui-quadrada\r\nCHIINV\t\t\t= INV.CHI\t\t\t##\tDevolve o inverso da probabilidade unicaudal da distribuição qui-quadrada\r\nCHITEST\t\t\t= TESTE.CHI\t\t\t##\tDevolve o teste para independência\r\nCONFIDENCE\t\t= INT.CONFIANÇA\t\t\t##\tDevolve o intervalo de confiança correspondente a uma média de população\r\nCORREL\t\t\t= CORREL\t\t\t##\tDevolve o coeficiente de correlação entre dois conjuntos de dados\r\nCOUNT\t\t\t= CONTAR\t\t\t##\tConta os números que existem na lista de argumentos\r\nCOUNTA\t\t\t= CONTAR.VAL\t\t\t##\tConta os valores que existem na lista de argumentos\r\nCOUNTBLANK\t\t= CONTAR.VAZIO\t\t\t##\tConta o número de células em branco num intervalo\r\nCOUNTIF\t\t\t= CONTAR.SE\t\t\t##\tCalcula o número de células num intervalo que corresponde aos critérios determinados\r\nCOUNTIFS\t\t= CONTAR.SE.S\t\t\t##\tConta o número de células num intervalo que cumprem múltiplos critérios\r\nCOVAR\t\t\t= COVAR\t\t\t\t##\tDevolve a covariância, que é a média dos produtos de desvios de pares\r\nCRITBINOM\t\t= CRIT.BINOM\t\t\t##\tDevolve o menor valor em que a distribuição binomial cumulativa é inferior ou igual a um valor de critério\r\nDEVSQ\t\t\t= DESVQ\t\t\t\t##\tDevolve a soma dos quadrados dos desvios\r\nEXPONDIST\t\t= DISTEXPON\t\t\t##\tDevolve a distribuição exponencial\r\nFDIST\t\t\t= DISTF\t\t\t\t##\tDevolve a distribuição da probabilidade F\r\nFINV\t\t\t= INVF\t\t\t\t##\tDevolve o inverso da distribuição da probabilidade F\r\nFISHER\t\t\t= FISHER\t\t\t##\tDevolve a transformação Fisher\r\nFISHERINV\t\t= FISHERINV\t\t\t##\tDevolve o inverso da transformação Fisher\r\nFORECAST\t\t= PREVISÃO\t\t\t##\tDevolve um valor ao longo de uma tendência linear\r\nFREQUENCY\t\t= FREQUÊNCIA\t\t\t##\tDevolve uma distribuição de frequência como uma matriz vertical\r\nFTEST\t\t\t= TESTEF\t\t\t##\tDevolve o resultado de um teste F\r\nGAMMADIST\t\t= DISTGAMA\t\t\t##\tDevolve a distribuição gama\r\nGAMMAINV\t\t= INVGAMA\t\t\t##\tDevolve o inverso da distribuição gama cumulativa\r\nGAMMALN\t\t\t= LNGAMA\t\t\t##\tDevolve o logaritmo natural da função gama, Γ(x)\r\nGEOMEAN\t\t\t= MÉDIA.GEOMÉTRICA\t\t##\tDevolve a média geométrica\r\nGROWTH\t\t\t= CRESCIMENTO\t\t\t##\tDevolve valores ao longo de uma tendência exponencial\r\nHARMEAN\t\t\t= MÉDIA.HARMÓNICA\t\t##\tDevolve a média harmónica\r\nHYPGEOMDIST\t\t= DIST.HIPERGEOM\t\t##\tDevolve a distribuição hipergeométrica\r\nINTERCEPT\t\t= INTERCEPTAR\t\t\t##\tDevolve a intercepção da linha de regressão linear\r\nKURT\t\t\t= CURT\t\t\t\t##\tDevolve a curtose de um conjunto de dados\r\nLARGE\t\t\t= MAIOR\t\t\t\t##\tDevolve o maior valor k-ésimo de um conjunto de dados\r\nLINEST\t\t\t= PROJ.LIN\t\t\t##\tDevolve os parâmetros de uma tendência linear\r\nLOGEST\t\t\t= PROJ.LOG\t\t\t##\tDevolve os parâmetros de uma tendência exponencial\r\nLOGINV\t\t\t= INVLOG\t\t\t##\tDevolve o inverso da distribuição normal logarítmica\r\nLOGNORMDIST\t\t= DIST.NORMALLOG\t\t##\tDevolve a distribuição normal logarítmica cumulativa\r\nMAX\t\t\t= MÁXIMO\t\t\t##\tDevolve o valor máximo numa lista de argumentos\r\nMAXA\t\t\t= MÁXIMOA\t\t\t##\tDevolve o valor máximo numa lista de argumentos, incluindo números, texto e valores lógicos\r\nMEDIAN\t\t\t= MED\t\t\t\t##\tDevolve a mediana dos números indicados\r\nMIN\t\t\t= MÍNIMO\t\t\t##\tDevolve o valor mínimo numa lista de argumentos\r\nMINA\t\t\t= MÍNIMOA\t\t\t##\tDevolve o valor mínimo numa lista de argumentos, incluindo números, texto e valores lógicos\r\nMODE\t\t\t= MODA\t\t\t\t##\tDevolve o valor mais comum num conjunto de dados\r\nNEGBINOMDIST\t\t= DIST.BIN.NEG\t\t\t##\tDevolve a distribuição binominal negativa\r\nNORMDIST\t\t= DIST.NORM\t\t\t##\tDevolve a distribuição cumulativa normal\r\nNORMINV\t\t\t= INV.NORM\t\t\t##\tDevolve o inverso da distribuição cumulativa normal\r\nNORMSDIST\t\t= DIST.NORMP\t\t\t##\tDevolve a distribuição cumulativa normal padrão\r\nNORMSINV\t\t= INV.NORMP\t\t\t##\tDevolve o inverso da distribuição cumulativa normal padrão\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tDevolve o coeficiente de correlação momento/produto de Pearson\r\nPERCENTILE\t\t= PERCENTIL\t\t\t##\tDevolve o k-ésimo percentil de valores num intervalo\r\nPERCENTRANK\t\t= ORDEM.PERCENTUAL\t\t##\tDevolve a ordem percentual de um valor num conjunto de dados\r\nPERMUT\t\t\t= PERMUTAR\t\t\t##\tDevolve o número de permutações de um determinado número de objectos\r\nPOISSON\t\t\t= POISSON\t\t\t##\tDevolve a distribuição de Poisson\r\nPROB\t\t\t= PROB\t\t\t\t##\tDevolve a probabilidade dos valores num intervalo se encontrarem entre dois limites\r\nQUARTILE\t\t= QUARTIL\t\t\t##\tDevolve o quartil de um conjunto de dados\r\nRANK\t\t\t= ORDEM\t\t\t\t##\tDevolve a ordem de um número numa lista numérica\r\nRSQ\t\t\t= RQUAD\t\t\t\t##\tDevolve o quadrado do coeficiente de correlação momento/produto de Pearson\r\nSKEW\t\t\t= DISTORÇÃO\t\t\t##\tDevolve a distorção de uma distribuição\r\nSLOPE\t\t\t= DECLIVE\t\t\t##\tDevolve o declive da linha de regressão linear\r\nSMALL\t\t\t= MENOR\t\t\t\t##\tDevolve o menor valor de k-ésimo de um conjunto de dados\r\nSTANDARDIZE\t\t= NORMALIZAR\t\t\t##\tDevolve um valor normalizado\r\nSTDEV\t\t\t= DESVPAD\t\t\t##\tCalcula o desvio-padrão com base numa amostra\r\nSTDEVA\t\t\t= DESVPADA\t\t\t##\tCalcula o desvio-padrão com base numa amostra, incluindo números, texto e valores lógicos\r\nSTDEVP\t\t\t= DESVPADP\t\t\t##\tCalcula o desvio-padrão com base na população total\r\nSTDEVPA\t\t\t= DESVPADPA\t\t\t##\tCalcula o desvio-padrão com base na população total, incluindo números, texto e valores lógicos\r\nSTEYX\t\t\t= EPADYX\t\t\t##\tDevolve o erro-padrão do valor de y previsto para cada x na regressão\r\nTDIST\t\t\t= DISTT\t\t\t\t##\tDevolve a distribuição t de Student\r\nTINV\t\t\t= INVT\t\t\t\t##\tDevolve o inverso da distribuição t de Student\r\nTREND\t\t\t= TENDÊNCIA\t\t\t##\tDevolve valores ao longo de uma tendência linear\r\nTRIMMEAN\t\t= MÉDIA.INTERNA\t\t\t##\tDevolve a média do interior de um conjunto de dados\r\nTTEST\t\t\t= TESTET\t\t\t##\tDevolve a probabilidade associada ao teste t de Student\r\nVAR\t\t\t= VAR\t\t\t\t##\tCalcula a variância com base numa amostra\r\nVARA\t\t\t= VARA\t\t\t\t##\tCalcula a variância com base numa amostra, incluindo números, texto e valores lógicos\r\nVARP\t\t\t= VARP\t\t\t\t##\tCalcula a variância com base na população total\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tCalcula a variância com base na população total, incluindo números, texto e valores lógicos\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tDevolve a distribuição Weibull\r\nZTEST\t\t\t= TESTEZ\t\t\t##\tDevolve o valor de probabilidade unicaudal de um teste-z\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tFunções de texto\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tAltera letras ou katakana de largura total (byte duplo) numa cadeia de caracteres para caracteres de largura média (byte único)\r\nBAHTTEXT\t\t= TEXTO.BAHT\t\t\t##\tConverte um número em texto, utilizando o formato monetário ß (baht)\r\nCHAR\t\t\t= CARÁCT\t\t\t##\tDevolve o carácter especificado pelo número de código\r\nCLEAN\t\t\t= LIMPAR\t\t\t##\tRemove do texto todos os caracteres não imprimíveis\r\nCODE\t\t\t= CÓDIGO\t\t\t##\tDevolve um código numérico correspondente ao primeiro carácter numa cadeia de texto\r\nCONCATENATE\t\t= CONCATENAR\t\t\t##\tAgrupa vários itens de texto num único item de texto\r\nDOLLAR\t\t\t= MOEDA\t\t\t\t##\tConverte um número em texto, utilizando o formato monetário € (Euro)\r\nEXACT\t\t\t= EXACTO\t\t\t##\tVerifica se dois valores de texto são idênticos\r\nFIND\t\t\t= LOCALIZAR\t\t\t##\tLocaliza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas)\r\nFINDB\t\t\t= LOCALIZARB\t\t\t##\tLocaliza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas)\r\nFIXED\t\t\t= FIXA\t\t\t\t##\tFormata um número como texto com um número fixo de decimais\r\nJIS\t\t\t= JIS\t\t\t\t##\tAltera letras ou katakana de largura média (byte único) numa cadeia de caracteres para caracteres de largura total (byte duplo)\r\nLEFT\t\t\t= ESQUERDA\t\t\t##\tDevolve os caracteres mais à esquerda de um valor de texto\r\nLEFTB\t\t\t= ESQUERDAB\t\t\t##\tDevolve os caracteres mais à esquerda de um valor de texto\r\nLEN\t\t\t= NÚM.CARACT\t\t\t##\tDevolve o número de caracteres de uma cadeia de texto\r\nLENB\t\t\t= NÚM.CARACTB\t\t\t##\tDevolve o número de caracteres de uma cadeia de texto\r\nLOWER\t\t\t= MINÚSCULAS\t\t\t##\tConverte o texto em minúsculas\r\nMID\t\t\t= SEG.TEXTO\t\t\t##\tDevolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada\r\nMIDB\t\t\t= SEG.TEXTOB\t\t\t##\tDevolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada\r\nPHONETIC\t\t= FONÉTICA\t\t\t##\tRetira os caracteres fonéticos (furigana) de uma cadeia de texto\r\nPROPER\t\t\t= INICIAL.MAIÚSCULA\t\t##\tColoca em maiúsculas a primeira letra de cada palavra de um valor de texto\r\nREPLACE\t\t\t= SUBSTITUIR\t\t\t##\tSubstitui caracteres no texto\r\nREPLACEB\t\t= SUBSTITUIRB\t\t\t##\tSubstitui caracteres no texto\r\nREPT\t\t\t= REPETIR\t\t\t##\tRepete texto um determinado número de vezes\r\nRIGHT\t\t\t= DIREITA\t\t\t##\tDevolve os caracteres mais à direita de um valor de texto\r\nRIGHTB\t\t\t= DIREITAB\t\t\t##\tDevolve os caracteres mais à direita de um valor de texto\r\nSEARCH\t\t\t= PROCURAR\t\t\t##\tLocaliza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas)\r\nSEARCHB\t\t\t= PROCURARB\t\t\t##\tLocaliza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas)\r\nSUBSTITUTE\t\t= SUBST\t\t\t\t##\tSubstitui texto novo por texto antigo numa cadeia de texto\r\nT\t\t\t= T\t\t\t\t##\tConverte os respectivos argumentos em texto\r\nTEXT\t\t\t= TEXTO\t\t\t\t##\tFormata um número e converte-o em texto\r\nTRIM\t\t\t= COMPACTAR\t\t\t##\tRemove espaços do texto\r\nUPPER\t\t\t= MAIÚSCULAS\t\t\t##\tConverte texto em maiúsculas\r\nVALUE\t\t\t= VALOR\t\t\t\t##\tConverte um argumento de texto num número\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/ru/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= р\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #ПУСТО!\r\nDIV0\t= #ДЕЛ/0!\r\nVALUE\t= #ЗНАЧ!\r\nREF\t= #ССЫЛ!\r\nNAME\t= #ИМЯ?\r\nNUM\t= #ЧИСЛО!\r\nNA\t= #Н/Д\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/ru/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from information provided by web-junior (http://www.web-junior.net/)\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\t\tФункции надстроек и автоматизации\r\n##\r\nGETPIVOTDATA\t\t= ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ\t##\tВозвращает данные, хранящиеся в отчете сводной таблицы.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\t\tФункции Куб\r\n##\r\nCUBEKPIMEMBER\t\t= КУБЭЛЕМЕНТКИП\t\t\t\t##\tВозвращает свойство ключевого индикатора производительности «(КИП)» и отображает имя «КИП» в ячейке. «КИП» представляет собой количественную величину, такую как ежемесячная валовая прибыль или ежеквартальная текучесть кадров, используемой для контроля эффективности работы организации.\r\nCUBEMEMBER\t\t= КУБЭЛЕМЕНТ\t\t\t\t##\tВозвращает элемент или кортеж из куба. Используется для проверки существования элемента или кортежа в кубе.\r\nCUBEMEMBERPROPERTY\t= КУБСВОЙСТВОЭЛЕМЕНТА\t\t\t##\tВозвращает значение свойства элемента из куба. Используется для проверки существования имени элемента в кубе и возвращает указанное свойство для этого элемента.\r\nCUBERANKEDMEMBER\t= КУБПОРЭЛЕМЕНТ\t\t\t\t##\tВозвращает n-ый или ранжированный элемент в множество. Используется для возвращения одного или нескольких элементов в множество, например, лучшего продавца или 10 лучших студентов.\r\nCUBESET\t\t\t= КУБМНОЖ\t\t\t\t##\tОпределяет вычислительное множество элементов или кортежей, отправляя на сервер выражение, которое создает множество, а затем возвращает его в Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= КУБЧИСЛОЭЛМНОЖ\t\t\t##\tВозвращает число элементов множества.\r\nCUBEVALUE\t\t= КУБЗНАЧЕНИЕ\t\t\t\t##\tВозвращает обобщенное значение из куба.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\t\tФункции для работы с базами данных\r\n##\r\nDAVERAGE\t\t= ДСРЗНАЧ\t\t\t\t##\tВозвращает среднее значение выбранных записей базы данных.\r\nDCOUNT\t\t\t= БСЧЁТ\t\t\t\t\t##\tПодсчитывает количество числовых ячеек в базе данных.\r\nDCOUNTA\t\t\t= БСЧЁТА\t\t\t\t##\tПодсчитывает количество непустых ячеек в базе данных.\r\nDGET\t\t\t= БИЗВЛЕЧЬ\t\t\t\t##\tИзвлекает из базы данных одну запись, удовлетворяющую заданному условию.\r\nDMAX\t\t\t= ДМАКС\t\t\t\t\t##\tВозвращает максимальное значение среди выделенных записей базы данных.\r\nDMIN\t\t\t= ДМИН\t\t\t\t\t##\tВозвращает минимальное значение среди выделенных записей базы данных.\r\nDPRODUCT\t\t= БДПРОИЗВЕД\t\t\t\t##\tПеремножает значения определенного поля в записях базы данных, удовлетворяющих условию.\r\nDSTDEV\t\t\t= ДСТАНДОТКЛ\t\t\t\t##\tОценивает стандартное отклонение по выборке для выделенных записей базы данных.\r\nDSTDEVP\t\t\t= ДСТАНДОТКЛП\t\t\t\t##\tВычисляет стандартное отклонение по генеральной совокупности для выделенных записей базы данных\r\nDSUM\t\t\t= БДСУММ\t\t\t\t##\tСуммирует числа в поле для записей базы данных, удовлетворяющих условию.\r\nDVAR\t\t\t= БДДИСП\t\t\t\t##\tОценивает дисперсию по выборке из выделенных записей базы данных\r\nDVARP\t\t\t= БДДИСПП\t\t\t\t##\tВычисляет дисперсию по генеральной совокупности для выделенных записей базы данных\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\t\tФункции даты и времени\r\n##\r\nDATE\t\t\t= ДАТА\t\t\t\t\t##\tВозвращает заданную дату в числовом формате.\r\nDATEVALUE\t\t= ДАТАЗНАЧ\t\t\t\t##\tПреобразует дату из текстового формата в числовой формат.\r\nDAY\t\t\t= ДЕНЬ\t\t\t\t\t##\tПреобразует дату в числовом формате в день месяца.\r\nDAYS360\t\t\t= ДНЕЙ360\t\t\t\t##\tВычисляет количество дней между двумя датами на основе 360-дневного года.\r\nEDATE\t\t\t= ДАТАМЕС\t\t\t\t##\tВозвращает дату в числовом формате, отстоящую на заданное число месяцев вперед или назад от начальной даты.\r\nEOMONTH\t\t\t= КОНМЕСЯЦА\t\t\t\t##\tВозвращает дату в числовом формате для последнего дня месяца, отстоящего вперед или назад на заданное число месяцев.\r\nHOUR\t\t\t= ЧАС\t\t\t\t\t##\tПреобразует дату в числовом формате в часы.\r\nMINUTE\t\t\t= МИНУТЫ\t\t\t\t##\tПреобразует дату в числовом формате в минуты.\r\nMONTH\t\t\t= МЕСЯЦ\t\t\t\t\t##\tПреобразует дату в числовом формате в месяцы.\r\nNETWORKDAYS\t\t= ЧИСТРАБДНИ\t\t\t\t##\tВозвращает количество рабочих дней между двумя датами.\r\nNOW\t\t\t= ТДАТА\t\t\t\t\t##\tВозвращает текущую дату и время в числовом формате.\r\nSECOND\t\t\t= СЕКУНДЫ\t\t\t\t##\tПреобразует дату в числовом формате в секунды.\r\nTIME\t\t\t= ВРЕМЯ\t\t\t\t\t##\tВозвращает заданное время в числовом формате.\r\nTIMEVALUE\t\t= ВРЕМЗНАЧ\t\t\t\t##\tПреобразует время из текстового формата в числовой формат.\r\nTODAY\t\t\t= СЕГОДНЯ\t\t\t\t##\tВозвращает текущую дату в числовом формате.\r\nWEEKDAY\t\t\t= ДЕНЬНЕД\t\t\t\t##\tПреобразует дату в числовом формате в день недели.\r\nWEEKNUM\t\t\t= НОМНЕДЕЛИ\t\t\t\t##\tПреобразует числовое представление в число, которое указывает, на какую неделю года приходится указанная дата.\r\nWORKDAY\t\t\t= РАБДЕНЬ\t\t\t\t##\tВозвращает дату в числовом формате, отстоящую вперед или назад на заданное количество рабочих дней.\r\nYEAR\t\t\t= ГОД\t\t\t\t\t##\tПреобразует дату в числовом формате в год.\r\nYEARFRAC\t\t= ДОЛЯГОДА\t\t\t\t##\tВозвращает долю года, которую составляет количество дней между начальной и конечной датами.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\t\tИнженерные функции\r\n##\r\nBESSELI\t\t\t= БЕССЕЛЬ.I\t \t\t\t##\tВозвращает модифицированную функцию Бесселя In(x).\r\nBESSELJ\t\t\t= БЕССЕЛЬ.J\t\t\t\t##\tВозвращает функцию Бесселя Jn(x).\r\nBESSELK\t\t\t= БЕССЕЛЬ.K\t\t\t\t##\tВозвращает модифицированную функцию Бесселя Kn(x).\r\nBESSELY\t\t\t= БЕССЕЛЬ.Y\t\t\t\t##\tВозвращает функцию Бесселя Yn(x).\r\nBIN2DEC\t\t\t= ДВ.В.ДЕС\t\t\t\t##\tПреобразует двоичное число в десятичное.\r\nBIN2HEX\t\t\t= ДВ.В.ШЕСТН\t\t\t\t##\tПреобразует двоичное число в шестнадцатеричное.\r\nBIN2OCT\t\t\t= ДВ.В.ВОСЬМ\t\t\t\t##\tПреобразует двоичное число в восьмеричное.\r\nCOMPLEX\t\t\t= КОМПЛЕКСН\t\t\t\t##\tПреобразует коэффициенты при вещественной и мнимой частях комплексного числа в комплексное число.\r\nCONVERT\t\t\t= ПРЕОБР\t\t\t\t##\tПреобразует число из одной системы единиц измерения в другую.\r\nDEC2BIN\t\t\t= ДЕС.В.ДВ\t\t\t\t##\tПреобразует десятичное число в двоичное.\r\nDEC2HEX\t\t\t= ДЕС.В.ШЕСТН\t\t\t\t##\tПреобразует десятичное число в шестнадцатеричное.\r\nDEC2OCT\t\t\t= ДЕС.В.ВОСЬМ\t\t\t\t##\tПреобразует десятичное число в восьмеричное.\r\nDELTA\t\t\t= ДЕЛЬТА\t\t\t\t##\tПроверяет равенство двух значений.\r\nERF\t\t\t= ФОШ\t\t\t\t\t##\tВозвращает функцию ошибки.\r\nERFC\t\t\t= ДФОШ\t\t\t\t\t##\tВозвращает дополнительную функцию ошибки.\r\nGESTEP\t\t\t= ПОРОГ\t\t\t\t\t##\tПроверяет, не превышает ли данное число порогового значения.\r\nHEX2BIN\t\t\t= ШЕСТН.В.ДВ\t\t\t\t##\tПреобразует шестнадцатеричное число в двоичное.\r\nHEX2DEC\t\t\t= ШЕСТН.В.ДЕС\t\t\t\t##\tПреобразует шестнадцатеричное число в десятичное.\r\nHEX2OCT\t\t\t= ШЕСТН.В.ВОСЬМ\t\t\t\t##\tПреобразует шестнадцатеричное число в восьмеричное.\r\nIMABS\t\t\t= МНИМ.ABS\t\t\t\t##\tВозвращает абсолютную величину (модуль) комплексного числа.\r\nIMAGINARY\t\t= МНИМ.ЧАСТЬ\t\t\t\t##\tВозвращает коэффициент при мнимой части комплексного числа.\r\nIMARGUMENT\t\t= МНИМ.АРГУМЕНТ\t\t\t\t##\tВозвращает значение аргумента комплексного числа (тета) — угол, выраженный в радианах.\r\nIMCONJUGATE\t\t= МНИМ.СОПРЯЖ\t\t\t\t##\tВозвращает комплексно-сопряженное комплексное число.\r\nIMCOS\t\t\t= МНИМ.COS\t\t\t\t##\tВозвращает косинус комплексного числа.\r\nIMDIV\t\t\t= МНИМ.ДЕЛ\t\t\t\t##\tВозвращает частное от деления двух комплексных чисел.\r\nIMEXP\t\t\t= МНИМ.EXP\t\t\t\t##\tВозвращает экспоненту комплексного числа.\r\nIMLN\t\t\t= МНИМ.LN\t\t\t\t##\tВозвращает натуральный логарифм комплексного числа.\r\nIMLOG10\t\t\t= МНИМ.LOG10\t\t\t\t##\tВозвращает обычный (десятичный) логарифм комплексного числа.\r\nIMLOG2\t\t\t= МНИМ.LOG2\t\t\t\t##\tВозвращает двоичный логарифм комплексного числа.\r\nIMPOWER\t\t\t= МНИМ.СТЕПЕНЬ\t\t\t\t##\tВозвращает комплексное число, возведенное в целую степень.\r\nIMPRODUCT\t\t= МНИМ.ПРОИЗВЕД\t\t\t\t##\tВозвращает произведение от 2 до 29 комплексных чисел.\r\nIMREAL\t\t\t= МНИМ.ВЕЩ\t\t\t\t##\tВозвращает коэффициент при вещественной части комплексного числа.\r\nIMSIN\t\t\t= МНИМ.SIN\t\t\t\t##\tВозвращает синус комплексного числа.\r\nIMSQRT\t\t\t= МНИМ.КОРЕНЬ\t\t\t\t##\tВозвращает значение квадратного корня из комплексного числа.\r\nIMSUB\t\t\t= МНИМ.РАЗН\t\t\t\t##\tВозвращает разность двух комплексных чисел.\r\nIMSUM\t\t\t= МНИМ.СУММ\t\t\t\t##\tВозвращает сумму комплексных чисел.\r\nOCT2BIN\t\t\t= ВОСЬМ.В.ДВ\t\t\t\t##\tПреобразует восьмеричное число в двоичное.\r\nOCT2DEC\t\t\t= ВОСЬМ.В.ДЕС\t\t\t\t##\tПреобразует восьмеричное число в десятичное.\r\nOCT2HEX\t\t\t= ВОСЬМ.В.ШЕСТН\t\t\t\t##\tПреобразует восьмеричное число в шестнадцатеричное.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\t\tФинансовые функции\r\n##\r\nACCRINT\t\t\t= НАКОПДОХОД\t\t\t\t##\tВозвращает накопленный процент по ценным бумагам с периодической выплатой процентов.\r\nACCRINTM\t\t= НАКОПДОХОДПОГАШ\t\t\t##\tВозвращает накопленный процент по ценным бумагам, проценты по которым выплачиваются в срок погашения.\r\nAMORDEGRC\t\t= АМОРУМ\t\t\t\t##\tВозвращает величину амортизации для каждого периода, используя коэффициент амортизации.\r\nAMORLINC\t\t= АМОРУВ\t\t\t\t##\tВозвращает величину амортизации для каждого периода.\r\nCOUPDAYBS\t\t= ДНЕЙКУПОНДО\t\t\t\t##\tВозвращает количество дней от начала действия купона до даты соглашения.\r\nCOUPDAYS\t\t= ДНЕЙКУПОН\t\t\t\t##\tВозвращает число дней в периоде купона, содержащем дату соглашения.\r\nCOUPDAYSNC\t\t= ДНЕЙКУПОНПОСЛЕ\t\t\t##\tВозвращает число дней от даты соглашения до срока следующего купона.\r\nCOUPNCD\t\t\t= ДАТАКУПОНПОСЛЕ\t\t\t##\tВозвращает следующую дату купона после даты соглашения.\r\nCOUPNUM\t\t\t= ЧИСЛКУПОН\t\t\t\t##\tВозвращает количество купонов, которые могут быть оплачены между датой соглашения и сроком вступления в силу.\r\nCOUPPCD\t\t\t= ДАТАКУПОНДО\t\t\t\t##\tВозвращает предыдущую дату купона перед датой соглашения.\r\nCUMIPMT\t\t\t= ОБЩПЛАТ\t\t\t\t##\tВозвращает общую выплату, произведенную между двумя периодическими выплатами.\r\nCUMPRINC\t\t= ОБЩДОХОД\t\t\t\t##\tВозвращает общую выплату по займу между двумя периодами.\r\nDB\t\t\t= ФУО\t\t\t\t\t##\tВозвращает величину амортизации актива для заданного периода, рассчитанную методом фиксированного уменьшения остатка.\r\nDDB\t\t\t= ДДОБ\t\t\t\t\t##\tВозвращает величину амортизации актива за данный период, используя метод двойного уменьшения остатка или иной явно указанный метод.\r\nDISC\t\t\t= СКИДКА\t\t\t\t##\tВозвращает норму скидки для ценных бумаг.\r\nDOLLARDE\t\t= РУБЛЬ.ДЕС\t\t\t\t##\tПреобразует цену в рублях, выраженную в виде дроби, в цену в рублях, выраженную десятичным числом.\r\nDOLLARFR\t\t= РУБЛЬ.ДРОБЬ\t\t\t\t##\tПреобразует цену в рублях, выраженную десятичным числом, в цену в рублях, выраженную в виде дроби.\r\nDURATION\t\t= ДЛИТ\t\t\t\t\t##\tВозвращает ежегодную продолжительность действия ценных бумаг с периодическими выплатами по процентам.\r\nEFFECT\t\t\t= ЭФФЕКТ\t\t\t\t##\tВозвращает действующие ежегодные процентные ставки.\r\nFV\t\t\t= БС\t\t\t\t\t##\tВозвращает будущую стоимость инвестиции.\r\nFVSCHEDULE\t\t= БЗРАСПИС\t\t\t\t##\tВозвращает будущую стоимость первоначальной основной суммы после начисления ряда сложных процентов.\r\nINTRATE\t\t\t= ИНОРМА\t\t\t\t##\tВозвращает процентную ставку для полностью инвестированных ценных бумаг.\r\nIPMT\t\t\t= ПРПЛТ\t\t\t\t\t##\tВозвращает величину выплаты прибыли на вложения за данный период.\r\nIRR\t\t\t= ВСД\t\t\t\t\t##\tВозвращает внутреннюю ставку доходности для ряда потоков денежных средств.\r\nISPMT\t\t\t= ПРОЦПЛАТ\t\t\t\t##\tВычисляет выплаты за указанный период инвестиции.\r\nMDURATION\t\t= МДЛИТ\t\t\t\t\t##\tВозвращает модифицированную длительность Маколея для ценных бумаг с предполагаемой номинальной стоимостью 100 рублей.\r\nMIRR\t\t\t= МВСД\t\t\t\t\t##\tВозвращает внутреннюю ставку доходности, при которой положительные и отрицательные денежные потоки имеют разные значения ставки.\r\nNOMINAL\t\t\t= НОМИНАЛ\t\t\t\t##\tВозвращает номинальную годовую процентную ставку.\r\nNPER\t\t\t= КПЕР\t\t\t\t\t##\tВозвращает общее количество периодов выплаты для данного вклада.\r\nNPV\t\t\t= ЧПС\t\t\t\t\t##\tВозвращает чистую приведенную стоимость инвестиции, основанной на серии периодических денежных потоков и ставке дисконтирования.\r\nODDFPRICE\t\t= ЦЕНАПЕРВНЕРЕГ\t\t\t\t##\tВозвращает цену за 100 рублей нарицательной стоимости ценных бумаг с нерегулярным первым периодом.\r\nODDFYIELD\t\t= ДОХОДПЕРВНЕРЕГ\t\t\t##\tВозвращает доход по ценным бумагам с нерегулярным первым периодом.\r\nODDLPRICE\t\t= ЦЕНАПОСЛНЕРЕГ\t\t\t\t##\tВозвращает цену за 100 рублей нарицательной стоимости ценных бумаг с нерегулярным последним периодом.\r\nODDLYIELD\t\t= ДОХОДПОСЛНЕРЕГ\t\t\t##\tВозвращает доход по ценным бумагам с нерегулярным последним периодом.\r\nPMT\t\t\t= ПЛТ\t\t\t\t\t##\tВозвращает величину выплаты за один период аннуитета.\r\nPPMT\t\t\t= ОСПЛТ\t\t\t\t\t##\tВозвращает величину выплат в погашение основной суммы по инвестиции за заданный период.\r\nPRICE\t\t\t= ЦЕНА\t\t\t\t\t##\tВозвращает цену за 100 рублей нарицательной стоимости ценных бумаг, по которым производится периодическая выплата процентов.\r\nPRICEDISC\t\t= ЦЕНАСКИДКА\t\t\t\t##\tВозвращает цену за 100 рублей номинальной стоимости ценных бумаг, на которые сделана скидка.\r\nPRICEMAT\t\t= ЦЕНАПОГАШ\t\t\t\t##\tВозвращает цену за 100 рублей номинальной стоимости ценных бумаг, проценты по которым выплачиваются в срок погашения.\r\nPV\t\t\t= ПС\t\t\t\t\t##\tВозвращает приведенную (к текущему моменту) стоимость инвестиции.\r\nRATE\t\t\t= СТАВКА\t\t\t\t##\tВозвращает процентную ставку по аннуитету за один период.\r\nRECEIVED\t\t= ПОЛУЧЕНО\t\t\t\t##\tВозвращает сумму, полученную к сроку погашения полностью обеспеченных ценных бумаг.\r\nSLN\t\t\t= АПЛ\t\t\t\t\t##\tВозвращает величину линейной амортизации актива за один период.\r\nSYD\t\t\t= АСЧ\t\t\t\t\t##\tВозвращает величину амортизации актива за данный период, рассчитанную методом суммы годовых чисел.\r\nTBILLEQ\t\t\t= РАВНОКЧЕК\t\t\t\t##\tВозвращает эквивалентный облигации доход по казначейскому чеку.\r\nTBILLPRICE\t\t= ЦЕНАКЧЕК\t\t\t\t##\tВозвращает цену за 100 рублей нарицательной стоимости для казначейского чека.\r\nTBILLYIELD\t\t= ДОХОДКЧЕК\t\t\t\t##\tВозвращает доход по казначейскому чеку.\r\nVDB\t\t\t= ПУО\t\t\t\t\t##\tВозвращает величину амортизации актива для указанного или частичного периода при использовании метода сокращающегося баланса.\r\nXIRR\t\t\t= ЧИСТВНДОХ\t\t\t\t##\tВозвращает внутреннюю ставку доходности для графика денежных потоков, которые не обязательно носят периодический характер.\r\nXNPV\t\t\t= ЧИСТНЗ\t\t\t\t##\tВозвращает чистую приведенную стоимость для денежных потоков, которые не обязательно являются периодическими.\r\nYIELD\t\t\t= ДОХОД\t\t\t\t\t##\tВозвращает доход от ценных бумаг, по которым производятся периодические выплаты процентов.\r\nYIELDDISC\t\t= ДОХОДСКИДКА\t\t\t\t##\tВозвращает годовой доход по ценным бумагам, на которые сделана скидка (пример — казначейские чеки).\r\nYIELDMAT\t\t= ДОХОДПОГАШ\t\t\t\t##\tВозвращает годовой доход от ценных бумаг, проценты по которым выплачиваются в срок погашения.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\t\tИнформационные функции\r\n##\r\nCELL\t\t\t= ЯЧЕЙКА\t\t\t\t##\tВозвращает информацию о формате, расположении или содержимом ячейки.\r\nERROR.TYPE\t\t= ТИП.ОШИБКИ\t\t\t\t##\tВозвращает числовой код, соответствующий типу ошибки.\r\nINFO\t\t\t= ИНФОРМ\t\t\t\t##\tВозвращает информацию о текущей операционной среде.\r\nISBLANK\t\t\t= ЕПУСТО\t\t\t\t##\tВозвращает значение ИСТИНА, если аргумент является ссылкой на пустую ячейку.\r\nISERR\t\t\t= ЕОШ\t\t\t\t\t##\tВозвращает значение ИСТИНА, если аргумент ссылается на любое значение ошибки, кроме #Н/Д.\r\nISERROR\t\t\t= ЕОШИБКА\t\t\t\t##\tВозвращает значение ИСТИНА, если аргумент ссылается на любое значение ошибки.\r\nISEVEN\t\t\t= ЕЧЁТН\t\t\t\t\t##\tВозвращает значение ИСТИНА, если значение аргумента является четным числом.\r\nISLOGICAL\t\t= ЕЛОГИЧ\t\t\t\t##\tВозвращает значение ИСТИНА, если аргумент ссылается на логическое значение.\r\nISNA\t\t\t= ЕНД\t\t\t\t\t##\tВозвращает значение ИСТИНА, если аргумент ссылается на значение ошибки #Н/Д.\r\nISNONTEXT\t\t= ЕНЕТЕКСТ\t\t\t\t##\tВозвращает значение ИСТИНА, если значение аргумента не является текстом.\r\nISNUMBER\t\t= ЕЧИСЛО\t\t\t\t##\tВозвращает значение ИСТИНА, если аргумент ссылается на число.\r\nISODD\t\t\t= ЕНЕЧЁТ\t\t\t\t##\tВозвращает значение ИСТИНА, если значение аргумента является нечетным числом.\r\nISREF\t\t\t= ЕССЫЛКА\t\t\t\t##\tВозвращает значение ИСТИНА, если значение аргумента является ссылкой.\r\nISTEXT\t\t\t= ЕТЕКСТ\t\t\t\t##\tВозвращает значение ИСТИНА, если значение аргумента является текстом.\r\nN\t\t\t= Ч\t\t\t\t\t##\tВозвращает значение, преобразованное в число.\r\nNA\t\t\t= НД\t\t\t\t\t##\tВозвращает значение ошибки #Н/Д.\r\nTYPE\t\t\t= ТИП\t\t\t\t\t##\tВозвращает число, обозначающее тип данных значения.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\t\tЛогические функции\r\n##\r\nAND\t\t\t= И\t\t\t\t\t##\tRenvoie VRAI si tous ses arguments sont VRAI.\r\nFALSE\t\t\t= ЛОЖЬ\t\t\t\t\t##\tВозвращает логическое значение ЛОЖЬ.\r\nIF\t\t\t= ЕСЛИ\t\t\t\t\t##\tВыполняет проверку условия.\r\nIFERROR\t\t\t= ЕСЛИОШИБКА\t\t\t\t##\tВозвращает введённое значение, если вычисление по формуле вызывает ошибку; в противном случае функция возвращает результат вычисления.\r\nNOT\t\t\t= НЕ\t\t\t\t\t##\tМеняет логическое значение своего аргумента на противоположное.\r\nOR\t\t\t= ИЛИ\t\t\t\t\t##\tВозвращает значение ИСТИНА, если хотя бы один аргумент имеет значение ИСТИНА.\r\nTRUE\t\t\t= ИСТИНА\t\t\t\t##\tВозвращает логическое значение ИСТИНА.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\t\tФункции ссылки и поиска\r\n##\r\nADDRESS\t\t\t= АДРЕС\t\t\t\t\t##\tВозвращает ссылку на отдельную ячейку листа в виде текста.\r\nAREAS\t\t\t= ОБЛАСТИ\t\t\t\t##\tВозвращает количество областей в ссылке.\r\nCHOOSE\t\t\t= ВЫБОР\t\t\t\t\t##\tВыбирает значение из списка значений по индексу.\r\nCOLUMN\t\t\t= СТОЛБЕЦ\t\t\t\t##\tВозвращает номер столбца, на который указывает ссылка.\r\nCOLUMNS\t\t\t= ЧИСЛСТОЛБ\t\t\t\t##\tВозвращает количество столбцов в ссылке.\r\nHLOOKUP\t\t\t= ГПР\t\t\t\t\t##\tИщет в первой строке массива и возвращает значение отмеченной ячейки\r\nHYPERLINK\t\t= ГИПЕРССЫЛКА\t\t\t\t##\tСоздает ссылку, открывающую документ, который находится на сервере сети, в интрасети или в Интернете.\r\nINDEX\t\t\t= ИНДЕКС\t\t\t\t##\tИспользует индекс для выбора значения из ссылки или массива.\r\nINDIRECT\t\t= ДВССЫЛ\t\t\t\t##\tВозвращает ссылку, заданную текстовым значением.\r\nLOOKUP\t\t\t= ПРОСМОТР\t\t\t\t##\tИщет значения в векторе или массиве.\r\nMATCH\t\t\t= ПОИСКПОЗ\t\t\t\t##\tИщет значения в ссылке или массиве.\r\nOFFSET\t\t\t= СМЕЩ\t\t\t\t\t##\tВозвращает смещение ссылки относительно заданной ссылки.\r\nROW\t\t\t= СТРОКА\t\t\t\t##\tВозвращает номер строки, определяемой ссылкой.\r\nROWS\t\t\t= ЧСТРОК\t\t\t\t##\tВозвращает количество строк в ссылке.\r\nRTD\t\t\t= ДРВ\t\t\t\t\t##\tИзвлекает данные реального времени из программ, поддерживающих автоматизацию COM (Программирование объектов. Стандартное средство для работы с объектами некоторого приложения из другого приложения или средства разработки. Программирование объектов (ранее называемое программированием OLE) является функцией модели COM (Component Object Model, модель компонентных объектов).).\r\nTRANSPOSE\t\t= ТРАНСП\t\t\t\t##\tВозвращает транспонированный массив.\r\nVLOOKUP\t\t\t= ВПР\t\t\t\t\t##\tИщет значение в первом столбце массива и возвращает значение из ячейки в найденной строке и указанном столбце.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\t\tМатематические и тригонометрические функции\r\n##\r\nABS\t\t\t= ABS\t\t\t\t\t##\tВозвращает модуль (абсолютную величину) числа.\r\nACOS\t\t\t= ACOS\t\t\t\t\t##\tВозвращает арккосинус числа.\r\nACOSH\t\t\t= ACOSH\t\t\t\t\t##\tВозвращает гиперболический арккосинус числа.\r\nASIN\t\t\t= ASIN\t\t\t\t\t##\tВозвращает арксинус числа.\r\nASINH\t\t\t= ASINH\t\t\t\t\t##\tВозвращает гиперболический арксинус числа.\r\nATAN\t\t\t= ATAN\t\t\t\t\t##\tВозвращает арктангенс числа.\r\nATAN2\t\t\t= ATAN2\t\t\t\t\t##\tВозвращает арктангенс для заданных координат x и y.\r\nATANH\t\t\t= ATANH\t\t\t\t\t##\tВозвращает гиперболический арктангенс числа.\r\nCEILING\t\t\t= ОКРВВЕРХ\t\t\t\t##\tОкругляет число до ближайшего целого или до ближайшего кратного указанному значению.\r\nCOMBIN\t\t\t= ЧИСЛКОМБ\t\t\t\t##\tВозвращает количество комбинаций для заданного числа объектов.\r\nCOS\t\t\t= COS\t\t\t\t\t##\tВозвращает косинус числа.\r\nCOSH\t\t\t= COSH\t\t\t\t\t##\tВозвращает гиперболический косинус числа.\r\nDEGREES\t\t\t= ГРАДУСЫ\t\t\t\t##\tПреобразует радианы в градусы.\r\nEVEN\t\t\t= ЧЁТН\t\t\t\t\t##\tОкругляет число до ближайшего четного целого.\r\nEXP\t\t\t= EXP\t\t\t\t\t##\tВозвращает число e, возведенное в указанную степень.\r\nFACT\t\t\t= ФАКТР\t\t\t\t\t##\tВозвращает факториал числа.\r\nFACTDOUBLE\t\t= ДВФАКТР\t\t\t\t##\tВозвращает двойной факториал числа.\r\nFLOOR\t\t\t= ОКРВНИЗ\t\t\t\t##\tОкругляет число до ближайшего меньшего по модулю значения.\r\nGCD\t\t\t= НОД\t\t\t\t\t##\tВозвращает наибольший общий делитель.\r\nINT\t\t\t= ЦЕЛОЕ\t\t\t\t\t##\tОкругляет число до ближайшего меньшего целого.\r\nLCM\t\t\t= НОК\t\t\t\t\t##\tВозвращает наименьшее общее кратное.\r\nLN\t\t\t= LN\t\t\t\t\t##\tВозвращает натуральный логарифм числа.\r\nLOG\t\t\t= LOG\t\t\t\t\t##\tВозвращает логарифм числа по заданному основанию.\r\nLOG10\t\t\t= LOG10\t\t\t\t\t##\tВозвращает десятичный логарифм числа.\r\nMDETERM\t\t\t= МОПРЕД\t\t\t\t##\tВозвращает определитель матрицы массива.\r\nMINVERSE\t\t= МОБР\t\t\t\t\t##\tВозвращает обратную матрицу массива.\r\nMMULT\t\t\t= МУМНОЖ\t\t\t\t##\tВозвращает произведение матриц двух массивов.\r\nMOD\t\t\t= ОСТАТ\t\t\t\t\t##\tВозвращает остаток от деления.\r\nMROUND\t\t\t= ОКРУГЛТ\t\t\t\t##\tВозвращает число, округленное с требуемой точностью.\r\nMULTINOMIAL\t\t= МУЛЬТИНОМ\t\t\t\t##\tВозвращает мультиномиальный коэффициент множества чисел.\r\nODD\t\t\t= НЕЧЁТ\t\t\t\t\t##\tОкругляет число до ближайшего нечетного целого.\r\nPI\t\t\t= ПИ\t\t\t\t\t##\tВозвращает число пи.\r\nPOWER\t\t\t= СТЕПЕНЬ\t\t\t\t##\tВозвращает результат возведения числа в степень.\r\nPRODUCT\t\t\t= ПРОИЗВЕД\t\t\t\t##\tВозвращает произведение аргументов.\r\nQUOTIENT\t\t= ЧАСТНОЕ\t\t\t\t##\tВозвращает целую часть частного при делении.\r\nRADIANS\t\t\t= РАДИАНЫ\t\t\t\t##\tПреобразует градусы в радианы.\r\nRAND\t\t\t= СЛЧИС\t\t\t\t\t##\tВозвращает случайное число в интервале от 0 до 1.\r\nRANDBETWEEN\t\t= СЛУЧМЕЖДУ\t\t\t\t##\tВозвращает случайное число в интервале между двумя заданными числами.\r\nROMAN\t\t\t= РИМСКОЕ\t\t\t\t##\tПреобразует арабские цифры в римские в виде текста.\r\nROUND\t\t\t= ОКРУГЛ\t\t\t\t##\tОкругляет число до указанного количества десятичных разрядов.\r\nROUNDDOWN\t\t= ОКРУГЛВНИЗ\t\t\t\t##\tОкругляет число до ближайшего меньшего по модулю значения.\r\nROUNDUP\t\t\t= ОКРУГЛВВЕРХ\t\t\t\t##\tОкругляет число до ближайшего большего по модулю значения.\r\nSERIESSUM\t\t= РЯД.СУММ\t\t\t\t##\tВозвращает сумму степенного ряда, вычисленную по формуле.\r\nSIGN\t\t\t= ЗНАК\t\t\t\t\t##\tВозвращает знак числа.\r\nSIN\t\t\t= SIN\t\t\t\t\t##\tВозвращает синус заданного угла.\r\nSINH\t\t\t= SINH\t\t\t\t\t##\tВозвращает гиперболический синус числа.\r\nSQRT\t\t\t= КОРЕНЬ\t\t\t\t##\tВозвращает положительное значение квадратного корня.\r\nSQRTPI\t\t\t= КОРЕНЬПИ\t\t\t\t##\tВозвращает квадратный корень из значения выражения (число * ПИ).\r\nSUBTOTAL\t\t= ПРОМЕЖУТОЧНЫЕ.ИТОГИ\t\t\t##\tВозвращает промежуточный итог в списке или базе данных.\r\nSUM\t\t\t= СУММ\t\t\t\t\t##\tСуммирует аргументы.\r\nSUMIF\t\t\t= СУММЕСЛИ\t\t\t\t##\tСуммирует ячейки, удовлетворяющие заданному условию.\r\nSUMIFS\t\t\t= СУММЕСЛИМН\t\t\t\t##\tСуммирует диапазон ячеек, удовлетворяющих нескольким условиям. \r\nSUMPRODUCT\t\t= СУММПРОИЗВ\t\t\t\t##\tВозвращает сумму произведений соответствующих элементов массивов.\r\nSUMSQ\t\t\t= СУММКВ\t\t\t\t##\tВозвращает сумму квадратов аргументов.\r\nSUMX2MY2\t\t= СУММРАЗНКВ\t\t\t\t##\tВозвращает сумму разностей квадратов соответствующих значений в двух массивах.\r\nSUMX2PY2\t\t= СУММСУММКВ\t\t\t\t##\tВозвращает сумму сумм квадратов соответствующих элементов двух массивов.\r\nSUMXMY2\t\t\t= СУММКВРАЗН\t\t\t\t##\tВозвращает сумму квадратов разностей соответствующих значений в двух массивах.\r\nTAN\t\t\t= TAN\t\t\t\t\t##\tВозвращает тангенс числа.\r\nTANH\t\t\t= TANH\t\t\t\t\t##\tВозвращает гиперболический тангенс числа.\r\nTRUNC\t\t\t= ОТБР\t\t\t\t\t##\tОтбрасывает дробную часть числа.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\t\tСтатистические функции\r\n##\r\nAVEDEV\t\t\t= СРОТКЛ\t\t\t\t##\tВозвращает среднее арифметическое абсолютных значений отклонений точек данных от среднего.\r\nAVERAGE\t\t\t= СРЗНАЧ\t\t\t\t##\tВозвращает среднее арифметическое аргументов.\r\nAVERAGEA\t\t= СРЗНАЧА\t\t\t\t##\tВозвращает среднее арифметическое аргументов, включая числа, текст и логические значения.\r\nAVERAGEIF\t\t= СРЗНАЧЕСЛИ \t\t\t\t##\tВозвращает среднее значение (среднее арифметическое) всех ячеек в диапазоне, которые удовлетворяют данному условию.\r\nAVERAGEIFS\t\t= СРЗНАЧЕСЛИМН \t\t\t\t##\tВозвращает среднее значение (среднее арифметическое) всех ячеек, которые удовлетворяют нескольким условиям. \r\nBETADIST\t\t= БЕТАРАСП\t\t\t\t##\tВозвращает интегральную функцию бета-распределения.\r\nBETAINV\t\t\t= БЕТАОБР\t\t\t\t##\tВозвращает обратную интегральную функцию указанного бета-распределения.\r\nBINOMDIST\t\t= БИНОМРАСП\t\t\t\t##\tВозвращает отдельное значение биномиального распределения.\r\nCHIDIST\t\t\t= ХИ2РАСП\t\t\t\t##\tВозвращает одностороннюю вероятность распределения хи-квадрат.\r\nCHIINV\t\t\t= ХИ2ОБР\t\t\t\t##\tВозвращает обратное значение односторонней вероятности распределения хи-квадрат.\r\nCHITEST\t\t\t= ХИ2ТЕСТ\t\t\t\t##\tВозвращает тест на независимость.\r\nCONFIDENCE\t\t= ДОВЕРИТ\t\t\t\t##\tВозвращает доверительный интервал для среднего значения по генеральной совокупности.\r\nCORREL\t\t\t= КОРРЕЛ\t\t\t\t##\tВозвращает коэффициент корреляции между двумя множествами данных.\r\nCOUNT\t\t\t= СЧЁТ\t\t\t\t\t##\tПодсчитывает количество чисел в списке аргументов.\r\nCOUNTA\t\t\t= СЧЁТЗ\t\t\t\t\t##\tПодсчитывает количество значений в списке аргументов.\r\nCOUNTBLANK\t\t= СЧИТАТЬПУСТОТЫ\t\t\t##\tПодсчитывает количество пустых ячеек в диапазоне\r\nCOUNTIF\t\t\t= СЧЁТЕСЛИ \t\t\t\t##\tПодсчитывает количество ячеек в диапазоне, удовлетворяющих заданному условию\r\nCOUNTIFS\t\t= СЧЁТЕСЛИМН\t\t\t\t##\tПодсчитывает количество ячеек внутри диапазона, удовлетворяющих нескольким условиям.\r\nCOVAR\t\t\t= КОВАР\t\t\t\t\t##\tВозвращает ковариацию, среднее произведений парных отклонений\r\nCRITBINOM\t\t= КРИТБИНОМ\t\t\t\t##\tВозвращает наименьшее значение, для которого интегральное биномиальное распределение меньше или равно заданному критерию.\r\nDEVSQ\t\t\t= КВАДРОТКЛ\t\t\t\t##\tВозвращает сумму квадратов отклонений.\r\nEXPONDIST\t\t= ЭКСПРАСП\t\t\t\t##\tВозвращает экспоненциальное распределение.\r\nFDIST\t\t\t= FРАСП\t\t\t\t\t##\tВозвращает F-распределение вероятности.\r\nFINV\t\t\t= FРАСПОБР\t\t\t\t##\tВозвращает обратное значение для F-распределения вероятности.\r\nFISHER\t\t\t= ФИШЕР\t\t\t\t\t##\tВозвращает преобразование Фишера.\r\nFISHERINV\t\t= ФИШЕРОБР\t\t\t\t##\tВозвращает обратное преобразование Фишера.\r\nFORECAST\t\t= ПРЕДСКАЗ\t\t\t\t##\tВозвращает значение линейного тренда.\r\nFREQUENCY\t\t= ЧАСТОТА\t\t\t\t##\tВозвращает распределение частот в виде вертикального массива.\r\nFTEST\t\t\t= ФТЕСТ\t\t\t\t\t##\tВозвращает результат F-теста.\r\nGAMMADIST\t\t= ГАММАРАСП\t\t\t\t##\tВозвращает гамма-распределение.\r\nGAMMAINV\t\t= ГАММАОБР\t\t\t\t##\tВозвращает обратное гамма-распределение.\r\nGAMMALN\t\t\t= ГАММАНЛОГ\t\t\t\t##\tВозвращает натуральный логарифм гамма функции, Γ(x).\r\nGEOMEAN\t\t\t= СРГЕОМ\t\t\t\t##\tВозвращает среднее геометрическое.\r\nGROWTH\t\t\t= РОСТ\t\t\t\t\t##\tВозвращает значения в соответствии с экспоненциальным трендом.\r\nHARMEAN\t\t\t= СРГАРМ\t\t\t\t##\tВозвращает среднее гармоническое.\r\nHYPGEOMDIST\t\t= ГИПЕРГЕОМЕТ\t\t\t\t##\tВозвращает гипергеометрическое распределение.\r\nINTERCEPT\t\t= ОТРЕЗОК\t\t\t\t##\tВозвращает отрезок, отсекаемый на оси линией линейной регрессии.\r\nKURT\t\t\t= ЭКСЦЕСС\t\t\t\t##\tВозвращает эксцесс множества данных.\r\nLARGE\t\t\t= НАИБОЛЬШИЙ\t\t\t\t##\tВозвращает k-ое наибольшее значение в множестве данных.\r\nLINEST\t\t\t= ЛИНЕЙН\t\t\t\t##\tВозвращает параметры линейного тренда.\r\nLOGEST\t\t\t= ЛГРФПРИБЛ\t\t\t\t##\tВозвращает параметры экспоненциального тренда.\r\nLOGINV\t\t\t= ЛОГНОРМОБР\t\t\t\t##\tВозвращает обратное логарифмическое нормальное распределение.\r\nLOGNORMDIST\t\t= ЛОГНОРМРАСП\t\t\t\t##\tВозвращает интегральное логарифмическое нормальное распределение.\r\nMAX\t\t\t= МАКС\t\t\t\t\t##\tВозвращает наибольшее значение в списке аргументов.\r\nMAXA\t\t\t= МАКСА\t\t\t\t\t##\tВозвращает наибольшее значение в списке аргументов, включая числа, текст и логические значения.\r\nMEDIAN\t\t\t= МЕДИАНА\t\t\t\t##\tВозвращает медиану заданных чисел.\r\nMIN\t\t\t= МИН\t\t\t\t\t##\tВозвращает наименьшее значение в списке аргументов.\r\nMINA\t\t\t= МИНА\t\t\t\t\t##\tВозвращает наименьшее значение в списке аргументов, включая числа, текст и логические значения.\r\nMODE\t\t\t= МОДА\t\t\t\t\t##\tВозвращает значение моды множества данных.\r\nNEGBINOMDIST\t\t= ОТРБИНОМРАСП\t\t\t\t##\tВозвращает отрицательное биномиальное распределение.\r\nNORMDIST\t\t= НОРМРАСП\t\t\t\t##\tВозвращает нормальную функцию распределения.\r\nNORMINV\t\t\t= НОРМОБР\t\t\t\t##\tВозвращает обратное нормальное распределение.\r\nNORMSDIST\t\t= НОРМСТРАСП\t\t\t\t##\tВозвращает стандартное нормальное интегральное распределение.\r\nNORMSINV\t\t= НОРМСТОБР\t\t\t\t##\tВозвращает обратное значение стандартного нормального распределения.\r\nPEARSON\t\t\t= ПИРСОН\t\t\t\t##\tВозвращает коэффициент корреляции Пирсона.\r\nPERCENTILE\t\t= ПЕРСЕНТИЛЬ\t\t\t\t##\tВозвращает k-ую персентиль для значений диапазона.\r\nPERCENTRANK\t\t= ПРОЦЕНТРАНГ\t\t\t\t##\tВозвращает процентную норму значения в множестве данных.\r\nPERMUT\t\t\t= ПЕРЕСТ\t\t\t\t##\tВозвращает количество перестановок для заданного числа объектов.\r\nPOISSON\t\t\t= ПУАССОН\t\t\t\t##\tВозвращает распределение Пуассона.\r\nPROB\t\t\t= ВЕРОЯТНОСТЬ\t\t\t\t##\tВозвращает вероятность того, что значение из диапазона находится внутри заданных пределов.\r\nQUARTILE\t\t= КВАРТИЛЬ\t\t\t\t##\tВозвращает квартиль множества данных.\r\nRANK\t\t\t= РАНГ\t\t\t\t\t##\tВозвращает ранг числа в списке чисел.\r\nRSQ\t\t\t= КВПИРСОН\t\t\t\t##\tВозвращает квадрат коэффициента корреляции Пирсона.\r\nSKEW\t\t\t= СКОС\t\t\t\t\t##\tВозвращает асимметрию распределения.\r\nSLOPE\t\t\t= НАКЛОН\t\t\t\t##\tВозвращает наклон линии линейной регрессии.\r\nSMALL\t\t\t= НАИМЕНЬШИЙ\t\t\t\t##\tВозвращает k-ое наименьшее значение в множестве данных.\r\nSTANDARDIZE\t\t= НОРМАЛИЗАЦИЯ\t\t\t\t##\tВозвращает нормализованное значение.\r\nSTDEV\t\t\t= СТАНДОТКЛОН\t\t\t\t##\tОценивает стандартное отклонение по выборке.\r\nSTDEVA\t\t\t= СТАНДОТКЛОНА\t\t\t\t##\tОценивает стандартное отклонение по выборке, включая числа, текст и логические значения.\r\nSTDEVP\t\t\t= СТАНДОТКЛОНП\t\t\t\t##\tВычисляет стандартное отклонение по генеральной совокупности.\r\nSTDEVPA\t\t\t= СТАНДОТКЛОНПА\t\t\t\t##\tВычисляет стандартное отклонение по генеральной совокупности, включая числа, текст и логические значения.\r\nSTEYX\t\t\t= СТОШYX\t\t\t\t##\tВозвращает стандартную ошибку предсказанных значений y для каждого значения x в регрессии.\r\nTDIST\t\t\t= СТЬЮДРАСП\t\t\t\t##\tВозвращает t-распределение Стьюдента.\r\nTINV\t\t\t= СТЬЮДРАСПОБР\t\t\t\t##\tВозвращает обратное t-распределение Стьюдента.\r\nTREND\t\t\t= ТЕНДЕНЦИЯ\t\t\t\t##\tВозвращает значения в соответствии с линейным трендом.\r\nTRIMMEAN\t\t= УРЕЗСРЕДНЕЕ\t\t\t\t##\tВозвращает среднее внутренности множества данных.\r\nTTEST\t\t\t= ТТЕСТ\t\t\t\t\t##\tВозвращает вероятность, соответствующую критерию Стьюдента.\r\nVAR\t\t\t= ДИСП\t\t\t\t\t##\tОценивает дисперсию по выборке.\r\nVARA\t\t\t= ДИСПА\t\t\t\t\t##\tОценивает дисперсию по выборке, включая числа, текст и логические значения.\r\nVARP\t\t\t= ДИСПР\t\t\t\t\t##\tВычисляет дисперсию для генеральной совокупности.\r\nVARPA\t\t\t= ДИСПРА\t\t\t\t##\tВычисляет дисперсию для генеральной совокупности, включая числа, текст и логические значения.\r\nWEIBULL\t\t\t= ВЕЙБУЛЛ\t\t\t\t##\tВозвращает распределение Вейбулла.\r\nZTEST\t\t\t= ZТЕСТ\t\t\t\t\t##\tВозвращает двустороннее P-значение z-теста.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\t\tТекстовые функции\r\n##\r\nASC\t\t\t= ASC\t\t\t\t\t##\tДля языков с двухбайтовыми наборами знаков (например, катакана) преобразует полноширинные (двухбайтовые) знаки в полуширинные (однобайтовые).\r\nBAHTTEXT\t\t= БАТТЕКСТ\t\t\t\t##\tПреобразует число в текст, используя денежный формат ß (БАТ).\r\nCHAR\t\t\t= СИМВОЛ\t\t\t\t##\tВозвращает знак с заданным кодом.\r\nCLEAN\t\t\t= ПЕЧСИМВ\t\t\t\t##\tУдаляет все непечатаемые знаки из текста.\r\nCODE\t\t\t= КОДСИМВ\t\t\t\t##\tВозвращает числовой код первого знака в текстовой строке.\r\nCONCATENATE\t\t= СЦЕПИТЬ\t\t\t\t##\tОбъединяет несколько текстовых элементов в один.\r\nDOLLAR\t\t\t= РУБЛЬ\t\t\t\t\t##\tПреобразует число в текст, используя денежный формат.\r\nEXACT\t\t\t= СОВПАД\t\t\t\t##\tПроверяет идентичность двух текстовых значений.\r\nFIND\t\t\t= НАЙТИ\t\t\t\t\t##\tИщет вхождения одного текстового значения в другом (с учетом регистра).\r\nFINDB\t\t\t= НАЙТИБ\t\t\t\t##\tИщет вхождения одного текстового значения в другом (с учетом регистра).\r\nFIXED\t\t\t= ФИКСИРОВАННЫЙ\t\t\t\t##\tФорматирует число и преобразует его в текст с заданным числом десятичных знаков.\r\nJIS\t\t\t= JIS\t\t\t\t\t##\tДля языков с двухбайтовыми наборами знаков (например, катакана) преобразует полуширинные (однобайтовые) знаки в текстовой строке в полноширинные (двухбайтовые).\r\nLEFT\t\t\t= ЛЕВСИМВ\t\t\t\t##\tВозвращает крайние слева знаки текстового значения.\r\nLEFTB\t\t\t= ЛЕВБ\t\t\t\t\t##\tВозвращает крайние слева знаки текстового значения.\r\nLEN\t\t\t= ДЛСТР\t\t\t\t\t##\tВозвращает количество знаков в текстовой строке.\r\nLENB\t\t\t= ДЛИНБ\t\t\t\t\t##\tВозвращает количество знаков в текстовой строке.\r\nLOWER\t\t\t= СТРОЧН\t\t\t\t##\tПреобразует все буквы текста в строчные.\r\nMID\t\t\t= ПСТР\t\t\t\t\t##\tВозвращает заданное число знаков из строки текста, начиная с указанной позиции.\r\nMIDB\t\t\t= ПСТРБ\t\t\t\t\t##\tВозвращает заданное число знаков из строки текста, начиная с указанной позиции.\r\nPHONETIC\t\t= PHONETIC\t\t\t\t##\tИзвлекает фонетические (фуригана) знаки из текстовой строки.\r\nPROPER\t\t\t= ПРОПНАЧ\t\t\t\t##\tПреобразует первую букву в каждом слове текста в прописную.\r\nREPLACE\t\t\t= ЗАМЕНИТЬ\t\t\t\t##\tЗаменяет знаки в тексте.\r\nREPLACEB\t\t= ЗАМЕНИТЬБ\t\t\t\t##\tЗаменяет знаки в тексте.\r\nREPT\t\t\t= ПОВТОР\t\t\t\t##\tПовторяет текст заданное число раз.\r\nRIGHT\t\t\t= ПРАВСИМВ\t\t\t\t##\tВозвращает крайние справа знаки текстовой строки.\r\nRIGHTB\t\t\t= ПРАВБ\t\t\t\t\t##\tВозвращает крайние справа знаки текстовой строки.\r\nSEARCH\t\t\t= ПОИСК\t\t\t\t\t##\tИщет вхождения одного текстового значения в другом (без учета регистра).\r\nSEARCHB\t\t\t= ПОИСКБ\t\t\t\t##\tИщет вхождения одного текстового значения в другом (без учета регистра).\r\nSUBSTITUTE\t\t= ПОДСТАВИТЬ\t\t\t\t##\tЗаменяет в текстовой строке старый текст новым.\r\nT\t\t\t= Т\t\t\t\t\t##\tПреобразует аргументы в текст.\r\nTEXT\t\t\t= ТЕКСТ\t\t\t\t\t##\tФорматирует число и преобразует его в текст.\r\nTRIM\t\t\t= СЖПРОБЕЛЫ\t\t\t\t##\tУдаляет из текста пробелы.\r\nUPPER\t\t\t= ПРОПИСН\t\t\t\t##\tПреобразует все буквы текста в прописные.\r\nVALUE\t\t\t= ЗНАЧЕН\t\t\t\t##\tПреобразует текстовый аргумент в число.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/sv/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= kr\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #Skärning!\r\nDIV0\t= #Division/0!\r\nVALUE\t= #Värdefel!\r\nREF\t= #Referens!\r\nNAME\t= #Namn?\r\nNUM\t= #Ogiltigt!\r\nNA\t= #Saknas!\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/sv/functions",
    "content": "##\r\n##\tAdd-in and Automation functions\t\t\tTilläggs- och automatiseringsfunktioner\r\n##\r\nGETPIVOTDATA\t\t= HÄMTA.PIVOTDATA\t\t##\tReturnerar data som lagrats i en pivottabellrapport\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tKubfunktioner\r\n##\r\nCUBEKPIMEMBER\t\t= KUBKPIMEDLEM\t\t\t##\tReturnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat.\r\nCUBEMEMBER\t\t= KUBMEDLEM\t\t\t##\tReturnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben.\r\nCUBEMEMBERPROPERTY\t= KUBMEDLEMSEGENSKAP\t\t##\tReturnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen.\r\nCUBERANKEDMEMBER\t= KUBRANGORDNADMEDLEM\t\t##\tReturnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna.\r\nCUBESET\t\t\t= KUBINSTÄLLNING\t\t##\tDefinierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel.\r\nCUBESETCOUNT\t\t= KUBINSTÄLLNINGANTAL\t\t##\tReturnerar antalet objekt i en uppsättning.\r\nCUBEVALUE\t\t= KUBVÄRDE\t\t\t##\tReturnerar ett mängdvärde från en kub.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tDatabasfunktioner\r\n##\r\nDAVERAGE\t\t= DMEDEL\t\t\t##\tReturnerar medelvärdet av databasposterna\r\nDCOUNT\t\t\t= DANTAL\t\t\t##\tRäknar antalet celler som innehåller tal i en databas\r\nDCOUNTA\t\t\t= DANTALV\t\t\t##\tRäknar ifyllda celler i en databas\r\nDGET\t\t\t= DHÄMTA\t\t\t##\tHämtar en enstaka post från en databas som uppfyller de angivna villkoren\r\nDMAX\t\t\t= DMAX\t\t\t\t##\tReturnerar det största värdet från databasposterna\r\nDMIN\t\t\t= DMIN\t\t\t\t##\tReturnerar det minsta värdet från databasposterna\r\nDPRODUCT\t\t= DPRODUKT\t\t\t##\tMultiplicerar värdena i ett visst fält i poster som uppfyller villkoret\r\nDSTDEV\t\t\t= DSTDAV\t\t\t##\tUppskattar standardavvikelsen baserat på ett urval av databasposterna\r\nDSTDEVP\t\t\t= DSTDAVP\t\t\t##\tBeräknar standardavvikelsen utifrån hela populationen av valda databasposter\r\nDSUM\t\t\t= DSUMMA\t\t\t##\tSummerar talen i kolumnfält i databasposter som uppfyller villkoret\r\nDVAR\t\t\t= DVARIANS\t\t\t##\tUppskattar variansen baserat på ett urval av databasposterna\r\nDVARP\t\t\t= DVARIANSP\t\t\t##\tBeräknar variansen utifrån hela populationen av valda databasposter\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tTid- och datumfunktioner\r\n##\r\nDATE\t\t\t= DATUM\t\t\t\t##\tReturnerar ett serienummer för ett visst datum\r\nDATEVALUE\t\t= DATUMVÄRDE\t\t\t##\tKonverterar ett datum i textformat till ett serienummer\r\nDAY\t\t\t= DAG\t\t\t\t##\tKonverterar ett serienummer till dag i månaden\r\nDAYS360\t\t\t= DAGAR360\t\t\t##\tBeräknar antalet dagar mellan två datum baserat på ett 360-dagarsår\r\nEDATE\t\t\t= EDATUM\t\t\t##\tReturnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet\r\nEOMONTH\t\t\t= SLUTMÅNAD\t\t\t##\tReturnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare\r\nHOUR\t\t\t= TIMME\t\t\t\t##\tKonverterar ett serienummer till en timme\r\nMINUTE\t\t\t= MINUT\t\t\t\t##\tKonverterar ett serienummer till en minut\r\nMONTH\t\t\t= MÅNAD\t\t\t\t##\tKonverterar ett serienummer till en månad\r\nNETWORKDAYS\t\t= NETTOARBETSDAGAR\t\t##\tReturnerar antalet hela arbetsdagar mellan två datum\r\nNOW\t\t\t= NU\t\t\t\t##\tReturnerar serienumret för dagens datum och aktuell tid\r\nSECOND\t\t\t= SEKUND\t\t\t##\tKonverterar ett serienummer till en sekund\r\nTIME\t\t\t= KLOCKSLAG\t\t\t##\tReturnerar serienumret för en viss tid\r\nTIMEVALUE\t\t= TIDVÄRDE\t\t\t##\tKonverterar en tid i textformat till ett serienummer\r\nTODAY\t\t\t= IDAG\t\t\t\t##\tReturnerar serienumret för dagens datum\r\nWEEKDAY\t\t\t= VECKODAG\t\t\t##\tKonverterar ett serienummer till en dag i veckan\r\nWEEKNUM\t\t\t= VECKONR\t\t\t##\tKonverterar ett serienummer till ett veckonummer\r\nWORKDAY\t\t\t= ARBETSDAGAR\t\t\t##\tReturnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare\r\nYEAR\t\t\t= ÅR\t\t\t\t##\tKonverterar ett serienummer till ett år\r\nYEARFRAC\t\t= ÅRDEL\t\t\t\t##\tReturnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tTekniska funktioner\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tReturnerar den modifierade Bessel-funktionen In(x)\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tReturnerar Bessel-funktionen Jn(x)\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tReturnerar den modifierade Bessel-funktionen Kn(x)\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tReturnerar Bessel-funktionen Yn(x)\r\nBIN2DEC\t\t\t= BIN.TILL.DEC\t\t\t##\tOmvandlar ett binärt tal till decimalt\r\nBIN2HEX\t\t\t= BIN.TILL.HEX\t\t\t##\tOmvandlar ett binärt tal till hexadecimalt\r\nBIN2OCT\t\t\t= BIN.TILL.OKT\t\t\t##\tOmvandlar ett binärt tal till oktalt\r\nCOMPLEX\t\t\t= KOMPLEX\t\t\t##\tOmvandlar reella och imaginära koefficienter till ett komplext tal\r\nCONVERT\t\t\t= KONVERTERA\t\t\t##\tOmvandlar ett tal från ett måttsystem till ett annat\r\nDEC2BIN\t\t\t= DEC.TILL.BIN\t\t\t##\tOmvandlar ett decimalt tal till binärt\r\nDEC2HEX\t\t\t= DEC.TILL.HEX\t\t\t##\tOmvandlar ett decimalt tal till hexadecimalt\r\nDEC2OCT\t\t\t= DEC.TILL.OKT\t\t\t##\tOmvandlar ett decimalt tal till oktalt\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tTestar om två värden är lika\r\nERF\t\t\t= FELF\t\t\t\t##\tReturnerar felfunktionen\r\nERFC\t\t\t= FELFK\t\t\t\t##\tReturnerar den komplementära felfunktionen\r\nGESTEP\t\t\t= SLSTEG\t\t\t##\tTestar om ett tal är större än ett tröskelvärde\r\nHEX2BIN\t\t\t= HEX.TILL.BIN\t\t\t##\tOmvandlar ett hexadecimalt tal till binärt\r\nHEX2DEC\t\t\t= HEX.TILL.DEC\t\t\t##\tOmvandlar ett hexadecimalt tal till decimalt\r\nHEX2OCT\t\t\t= HEX.TILL.OKT\t\t\t##\tOmvandlar ett hexadecimalt tal till oktalt\r\nIMABS\t\t\t= IMABS\t\t\t\t##\tReturnerar absolutvärdet (modulus) för ett komplext tal\r\nIMAGINARY\t\t= IMAGINÄR\t\t\t##\tReturnerar den imaginära koefficienten för ett komplext tal\r\nIMARGUMENT\t\t= IMARGUMENT\t\t\t##\tReturnerar det komplexa talets argument, en vinkel uttryckt i radianer\r\nIMCONJUGATE\t\t= IMKONJUGAT\t\t\t##\tReturnerar det komplexa talets konjugat\r\nIMCOS\t\t\t= IMCOS\t\t\t\t##\tReturnerar cosinus för ett komplext tal\r\nIMDIV\t\t\t= IMDIV\t\t\t\t##\tReturnerar kvoten för två komplexa tal\r\nIMEXP\t\t\t= IMEUPPHÖJT\t\t\t##\tReturnerar exponenten för ett komplext tal\r\nIMLN\t\t\t= IMLN\t\t\t\t##\tReturnerar den naturliga logaritmen för ett komplext tal\r\nIMLOG10\t\t\t= IMLOG10\t\t\t##\tReturnerar 10-logaritmen för ett komplext tal\r\nIMLOG2\t\t\t= IMLOG2\t\t\t##\tReturnerar 2-logaritmen för ett komplext tal\r\nIMPOWER\t\t\t= IMUPPHÖJT\t\t\t##\tReturnerar ett komplext tal upphöjt till en exponent\r\nIMPRODUCT\t\t= IMPRODUKT\t\t\t##\tReturnerar produkten av komplexa tal\r\nIMREAL\t\t\t= IMREAL\t\t\t##\tReturnerar den reella koefficienten för ett komplext tal\r\nIMSIN\t\t\t= IMSIN\t\t\t\t##\tReturnerar sinus för ett komplext tal\r\nIMSQRT\t\t\t= IMROT\t\t\t\t##\tReturnerar kvadratroten av ett komplext tal\r\nIMSUB\t\t\t= IMDIFF\t\t\t##\tReturnerar differensen mellan två komplexa tal\r\nIMSUM\t\t\t= IMSUM\t\t\t\t##\tReturnerar summan av komplexa tal\r\nOCT2BIN\t\t\t= OKT.TILL.BIN\t\t\t##\tOmvandlar ett oktalt tal till binärt\r\nOCT2DEC\t\t\t= OKT.TILL.DEC\t\t\t##\tOmvandlar ett oktalt tal till decimalt\r\nOCT2HEX\t\t\t= OKT.TILL.HEX\t\t\t##\tOmvandlar ett oktalt tal till hexadecimalt\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFinansiella funktioner\r\n##\r\nACCRINT\t\t\t= UPPLRÄNTA\t\t\t##\tReturnerar den upplupna räntan för värdepapper med periodisk ränta\r\nACCRINTM\t\t= UPPLOBLRÄNTA\t\t\t##\tReturnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tReturnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tReturnerar avskrivningen för varje redovisningsperiod\r\nCOUPDAYBS\t\t= KUPDAGBB\t\t\t##\tReturnerar antal dagar från början av kupongperioden till likviddagen\r\nCOUPDAYS\t\t= KUPDAGARS\t\t\t##\tReturnerar antalet dagar i kupongperioden som innehåller betalningsdatumet\r\nCOUPDAYSNC\t\t= KUPDAGNK\t\t\t##\tReturnerar antalet dagar från betalningsdatumet till nästa kupongdatum\r\nCOUPNCD\t\t\t= KUPNKD\t\t\t##\tReturnerar nästa kupongdatum efter likviddagen\r\nCOUPNUM\t\t\t= KUPANT\t\t\t##\tReturnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen\r\nCOUPPCD\t\t\t= KUPFKD\t\t\t##\tReturnerar föregående kupongdatum före likviddagen\r\nCUMIPMT\t\t\t= KUMRÄNTA\t\t\t##\tReturnerar den ackumulerade räntan som betalats mellan två perioder\r\nCUMPRINC\t\t= KUMPRIS\t\t\t##\tReturnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder\r\nDB\t\t\t= DB\t\t\t\t##\tReturnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning\r\nDDB\t\t\t= DEGAVSKR\t\t\t##\tReturnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger\r\nDISC\t\t\t= DISK\t\t\t\t##\tReturnerar diskonteringsräntan för ett värdepapper\r\nDOLLARDE\t\t= DECTAL\t\t\t##\tOmvandlar ett pris uttryckt som ett bråk till ett decimaltal\r\nDOLLARFR\t\t= BRÅK\t\t\t\t##\tOmvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk\r\nDURATION\t\t= LÖPTID\t\t\t##\tReturnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar\r\nEFFECT\t\t\t= EFFRÄNTA\t\t\t##\tReturnerar den årliga effektiva räntesatsen\r\nFV\t\t\t= SLUTVÄRDE\t\t\t##\tReturnerar det framtida värdet på en investering\r\nFVSCHEDULE\t\t= FÖRRÄNTNING\t\t\t##\tReturnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer\r\nINTRATE\t\t\t= ÅRSRÄNTA\t\t\t##\tReturnerar räntesatsen för ett betalt värdepapper\r\nIPMT\t\t\t= RBETALNING\t\t\t##\tReturnerar räntedelen av en betalning för en given period\r\nIRR\t\t\t= IR\t\t\t\t##\tReturnerar internräntan för en serie betalningar\r\nISPMT\t\t\t= RALÅN\t\t\t\t##\tBeräknar räntan som har betalats under en specifik betalningsperiod\r\nMDURATION\t\t= MLÖPTID\t\t\t##\tReturnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr\r\nMIRR\t\t\t= MODIR\t\t\t\t##\tReturnerar internräntan där positiva och negativa betalningar finansieras med olika räntor\r\nNOMINAL\t\t\t= NOMRÄNTA\t\t\t##\tReturnerar den årliga nominella räntesatsen\r\nNPER\t\t\t= PERIODER\t\t\t##\tReturnerar antalet perioder för en investering\r\nNPV\t\t\t= NETNUVÄRDE\t\t\t##\tReturnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta\r\nODDFPRICE\t\t= UDDAFPRIS\t\t\t##\tReturnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period\r\nODDFYIELD\t\t= UDDAFAVKASTNING\t\t##\tReturnerar avkastningen för en säkerhet med en udda första period\r\nODDLPRICE\t\t= UDDASPRIS\t\t\t##\tReturnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period\r\nODDLYIELD\t\t= UDDASAVKASTNING\t\t##\tReturnerar avkastningen för en säkerhet med en udda sista period\r\nPMT\t\t\t= BETALNING\t\t\t##\tReturnerar den periodiska betalningen för en annuitet\r\nPPMT\t\t\t= AMORT\t\t\t\t##\tReturnerar amorteringsdelen av en annuitetsbetalning för en given period\r\nPRICE\t\t\t= PRIS\t\t\t\t##\tReturnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta\r\nPRICEDISC\t\t= PRISDISK\t\t\t##\tReturnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper\r\nPRICEMAT\t\t= PRISFÖRF\t\t\t##\tReturnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen\r\nPV\t\t\t= PV\t\t\t\t##\tReturnerar nuvärdet av en serie lika stora periodiska betalningar\r\nRATE\t\t\t= RÄNTA\t\t\t\t##\tReturnerar räntesatsen per period i en annuitet\r\nRECEIVED\t\t= BELOPP\t\t\t##\tReturnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper\r\nSLN\t\t\t= LINAVSKR\t\t\t##\tReturnerar den linjära avskrivningen för en tillgång under en period\r\nSYD\t\t\t= ÅRSAVSKR\t\t\t##\tReturnerar den årliga avskrivningssumman för en tillgång under en angiven period\r\nTBILLEQ\t\t\t= SSVXEKV\t\t\t##\tReturnerar avkastningen motsvarande en obligation för en statsskuldväxel\r\nTBILLPRICE\t\t= SSVXPRIS\t\t\t##\tReturnerar priset per 100 kr nominellt värde för en statsskuldväxel\r\nTBILLYIELD\t\t= SSVXRÄNTA\t\t\t##\tReturnerar avkastningen för en statsskuldväxel\r\nVDB\t\t\t= VDEGRAVSKR\t\t\t##\tReturnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning)\r\nXIRR\t\t\t= XIRR\t\t\t\t##\tReturnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska\r\nXNPV\t\t\t= XNUVÄRDE\t\t\t##\tReturnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska\r\nYIELD\t\t\t= NOMAVK\t\t\t##\tReturnerar avkastningen för ett värdepapper som ger periodisk ränta\r\nYIELDDISC\t\t= NOMAVKDISK\t\t\t##\tReturnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel\r\nYIELDMAT\t\t= NOMAVKFÖRF\t\t\t##\tReturnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tInformationsfunktioner\r\n##\r\nCELL\t\t\t= CELL\t\t\t\t##\tReturnerar information om formatering, plats och innehåll i en cell\r\nERROR.TYPE\t\t= FEL.TYP\t\t\t##\tReturnerar ett tal som motsvarar ett felvärde\r\nINFO\t\t\t= INFO\t\t\t\t##\tReturnerar information om operativsystemet\r\nISBLANK\t\t\t= ÄRREF\t\t\t\t##\tReturnerar SANT om värdet är tomt\r\nISERR\t\t\t= Ä\t\t\t\t##\tReturnerar SANT om värdet är ett felvärde annat än #SAKNAS!\r\nISERROR\t\t\t= ÄRFEL\t\t\t\t##\tReturnerar SANT om värdet är ett felvärde\r\nISEVEN\t\t\t= ÄRJÄMN\t\t\t##\tReturnerar SANT om talet är jämnt\r\nISLOGICAL\t\t= ÄREJTEXT\t\t\t##\tReturnerar SANT om värdet är ett logiskt värde\r\nISNA\t\t\t= ÄRLOGISK\t\t\t##\tReturnerar SANT om värdet är felvärdet #SAKNAS!\r\nISNONTEXT\t\t= ÄRSAKNAD\t\t\t##\tReturnerar SANT om värdet inte är text\r\nISNUMBER\t\t= ÄRTAL\t\t\t\t##\tReturnerar SANT om värdet är ett tal\r\nISODD\t\t\t= ÄRUDDA\t\t\t##\tReturnerar SANT om talet är udda\r\nISREF\t\t\t= ÄRTOM\t\t\t\t##\tReturnerar SANT om värdet är en referens\r\nISTEXT\t\t\t= ÄRTEXT\t\t\t##\tReturnerar SANT om värdet är text\r\nN\t\t\t= N\t\t\t\t##\tReturnerar ett värde omvandlat till ett tal\r\nNA\t\t\t= SAKNAS\t\t\t##\tReturnerar felvärdet #SAKNAS!\r\nTYPE\t\t\t= VÄRDETYP\t\t\t##\tReturnerar ett tal som anger värdets datatyp\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tLogiska funktioner\r\n##\r\nAND\t\t\t= OCH\t\t\t\t##\tReturnerar SANT om alla argument är sanna\r\nFALSE\t\t\t= FALSKT\t\t\t##\tReturnerar det logiska värdet FALSKT\r\nIF\t\t\t= OM\t\t\t\t##\tAnger vilket logiskt test som ska utföras\r\nIFERROR\t\t\t= OMFEL\t\t\t\t##\tReturnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln\r\nNOT\t\t\t= ICKE\t\t\t\t##\tInverterar logiken för argumenten\r\nOR\t\t\t= ELLER\t\t\t\t##\tReturnerar SANT om något argument är SANT\r\nTRUE\t\t\t= SANT\t\t\t\t##\tReturnerar det logiska värdet SANT\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tSök- och referensfunktioner\r\n##\r\nADDRESS\t\t\t= ADRESS\t\t\t##\tReturnerar en referens som text till en enstaka cell i ett kalkylblad\r\nAREAS\t\t\t= OMRÅDEN\t\t\t##\tReturnerar antalet områden i en referens\r\nCHOOSE\t\t\t= VÄLJ\t\t\t\t##\tVäljer ett värde i en lista över värden\r\nCOLUMN\t\t\t= KOLUMN\t\t\t##\tReturnerar kolumnnumret för en referens\r\nCOLUMNS\t\t\t= KOLUMNER\t\t\t##\tReturnerar antalet kolumner i en referens\r\nHLOOKUP\t\t\t= LETAKOLUMN\t\t\t##\tSöker i den översta raden i en matris och returnerar värdet för angiven cell\r\nHYPERLINK\t\t= HYPERLÄNK\t\t\t##\tSkapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet\r\nINDEX\t\t\t= INDEX\t\t\t\t##\tAnvänder ett index för ett välja ett värde i en referens eller matris\r\nINDIRECT\t\t= INDIREKT\t\t\t##\tReturnerar en referens som anges av ett textvärde\r\nLOOKUP\t\t\t= LETAUPP\t\t\t##\tLetar upp värden i en vektor eller matris\r\nMATCH\t\t\t= PASSA\t\t\t\t##\tLetar upp värden i en referens eller matris\r\nOFFSET\t\t\t= FÖRSKJUTNING\t\t\t##\tReturnerar en referens förskjuten i förhållande till en given referens\r\nROW\t\t\t= RAD\t\t\t\t##\tReturnerar radnumret för en referens\r\nROWS\t\t\t= RADER\t\t\t\t##\tReturnerar antalet rader i en referens\r\nRTD\t\t\t= RTD\t\t\t\t##\tHämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).)\r\nTRANSPOSE\t\t= TRANSPONERA\t\t\t##\tTransponerar en matris\r\nVLOOKUP\t\t\t= LETARAD\t\t\t##\tLetar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tMatematiska och trigonometriska funktioner\r\n##\r\nABS\t\t\t= ABS\t\t\t\t##\tReturnerar absolutvärdet av ett tal\r\nACOS\t\t\t= ARCCOS\t\t\t##\tReturnerar arcus cosinus för ett tal\r\nACOSH\t\t\t= ARCCOSH\t\t\t##\tReturnerar inverterad hyperbolisk cosinus för ett tal\r\nASIN\t\t\t= ARCSIN\t\t\t##\tReturnerar arcus cosinus för ett tal\r\nASINH\t\t\t= ARCSINH\t\t\t##\tReturnerar hyperbolisk arcus sinus för ett tal\r\nATAN\t\t\t= ARCTAN\t\t\t##\tReturnerar arcus tangens för ett tal\r\nATAN2\t\t\t= ARCTAN2\t\t\t##\tReturnerar arcus tangens för en x- och en y- koordinat\r\nATANH\t\t\t= ARCTANH\t\t\t##\tReturnerar hyperbolisk arcus tangens för ett tal\r\nCEILING\t\t\t= RUNDA.UPP\t\t\t##\tAvrundar ett tal till närmaste heltal eller närmaste signifikanta multipel\r\nCOMBIN\t\t\t= KOMBIN\t\t\t##\tReturnerar antalet kombinationer för ett givet antal objekt\r\nCOS\t\t\t= COS\t\t\t\t##\tReturnerar cosinus för ett tal\r\nCOSH\t\t\t= COSH\t\t\t\t##\tReturnerar hyperboliskt cosinus för ett tal\r\nDEGREES\t\t\t= GRADER\t\t\t##\tOmvandlar radianer till grader\r\nEVEN\t\t\t= JÄMN\t\t\t\t##\tAvrundar ett tal uppåt till närmaste heltal\r\nEXP\t\t\t= EXP\t\t\t\t##\tReturnerar e upphöjt till ett givet tal\r\nFACT\t\t\t= FAKULTET\t\t\t##\tReturnerar fakulteten för ett tal\r\nFACTDOUBLE\t\t= DUBBELFAKULTET\t\t##\tReturnerar dubbelfakulteten för ett tal\r\nFLOOR\t\t\t= RUNDA.NED\t\t\t##\tAvrundar ett tal nedåt mot noll\r\nGCD\t\t\t= SGD\t\t\t\t##\tReturnerar den största gemensamma nämnaren\r\nINT\t\t\t= HELTAL\t\t\t##\tAvrundar ett tal nedåt till närmaste heltal\r\nLCM\t\t\t= MGM\t\t\t\t##\tReturnerar den minsta gemensamma multipeln\r\nLN\t\t\t= LN\t\t\t\t##\tReturnerar den naturliga logaritmen för ett tal\r\nLOG\t\t\t= LOG\t\t\t\t##\tReturnerar logaritmen för ett tal för en given bas\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tReturnerar 10-logaritmen för ett tal\r\nMDETERM\t\t\t= MDETERM\t\t\t##\tReturnerar matrisen som är avgörandet av en matris\r\nMINVERSE\t\t= MINVERT\t\t\t##\tReturnerar matrisinversen av en matris\r\nMMULT\t\t\t= MMULT\t\t\t\t##\tReturnerar matrisprodukten av två matriser\r\nMOD\t\t\t= REST\t\t\t\t##\tReturnerar resten vid en division\r\nMROUND\t\t\t= MAVRUNDA\t\t\t##\tReturnerar ett tal avrundat till en given multipel\r\nMULTINOMIAL\t\t= MULTINOMIAL\t\t\t##\tReturnerar multinomialen för en uppsättning tal\r\nODD\t\t\t= UDDA\t\t\t\t##\tAvrundar ett tal uppåt till närmaste udda heltal\r\nPI\t\t\t= PI\t\t\t\t##\tReturnerar värdet pi\r\nPOWER\t\t\t= UPPHÖJT.TILL\t\t\t##\tReturnerar resultatet av ett tal upphöjt till en exponent\r\nPRODUCT\t\t\t= PRODUKT\t\t\t##\tMultiplicerar argumenten\r\nQUOTIENT\t\t= KVOT\t\t\t\t##\tReturnerar heltalsdelen av en division\r\nRADIANS\t\t\t= RADIANER\t\t\t##\tOmvandlar grader till radianer\r\nRAND\t\t\t= SLUMP\t\t\t\t##\tReturnerar ett slumptal mellan 0 och 1\r\nRANDBETWEEN\t\t= SLUMP.MELLAN\t\t\t##\tReturnerar ett slumptal mellan de tal som du anger\r\nROMAN\t\t\t= ROMERSK\t\t\t##\tOmvandlar vanliga (arabiska) siffror till romerska som text\r\nROUND\t\t\t= AVRUNDA\t\t\t##\tAvrundar ett tal till ett angivet antal siffror\r\nROUNDDOWN\t\t= AVRUNDA.NEDÅT\t\t\t##\tAvrundar ett tal nedåt mot noll\r\nROUNDUP\t\t\t= AVRUNDA.UPPÅT\t\t\t##\tAvrundar ett tal uppåt, från noll\r\nSERIESSUM\t\t= SERIESUMMA\t\t\t##\tReturnerar summan av en potensserie baserat på formeln\r\nSIGN\t\t\t= TECKEN\t\t\t##\tReturnerar tecknet för ett tal\r\nSIN\t\t\t= SIN\t\t\t\t##\tReturnerar sinus för en given vinkel\r\nSINH\t\t\t= SINH\t\t\t\t##\tReturnerar hyperbolisk sinus för ett tal\r\nSQRT\t\t\t= ROT\t\t\t\t##\tReturnerar den positiva kvadratroten\r\nSQRTPI\t\t\t= ROTPI\t\t\t\t##\tReturnerar kvadratroten för (tal * pi)\r\nSUBTOTAL\t\t= DELSUMMA\t\t\t##\tReturnerar en delsumma i en lista eller databas\r\nSUM\t\t\t= SUMMA\t\t\t\t##\tSummerar argumenten\r\nSUMIF\t\t\t= SUMMA.OM\t\t\t##\tSummerar celler enligt ett angivet villkor\r\nSUMIFS\t\t\t= SUMMA.OMF\t\t\t##\tLägger till cellerna i ett område som uppfyller flera kriterier\r\nSUMPRODUCT\t\t= PRODUKTSUMMA\t\t\t##\tReturnerar summan av produkterna i motsvarande matriskomponenter\r\nSUMSQ\t\t\t= KVADRATSUMMA\t\t\t##\tReturnerar summan av argumentens kvadrater\r\nSUMX2MY2\t\t= SUMMAX2MY2\t\t\t##\tReturnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser\r\nSUMX2PY2\t\t= SUMMAX2PY2\t\t\t##\tReturnerar summan av summan av kvadraterna av motsvarande värden i två matriser\r\nSUMXMY2\t\t\t= SUMMAXMY2\t\t\t##\tReturnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser\r\nTAN\t\t\t= TAN\t\t\t\t##\tReturnerar tangens för ett tal\r\nTANH\t\t\t= TANH\t\t\t\t##\tReturnerar hyperbolisk tangens för ett tal\r\nTRUNC\t\t\t= AVKORTA\t\t\t##\tAvkortar ett tal till ett heltal\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tStatistiska funktioner\r\n##\r\nAVEDEV\t\t\t= MEDELAVV\t\t\t##\tReturnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde\r\nAVERAGE\t\t\t= MEDEL\t\t\t\t##\tReturnerar medelvärdet av argumenten\r\nAVERAGEA\t\t= AVERAGEA\t\t\t##\tReturnerar medelvärdet av argumenten, inklusive tal, text och logiska värden\r\nAVERAGEIF\t\t= MEDELOM\t\t\t##\tReturnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium\r\nAVERAGEIFS\t\t= MEDELOMF\t\t\t##\tReturnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor.\r\nBETADIST\t\t= BETAFÖRD\t\t\t##\tReturnerar den kumulativa betafördelningsfunktionen\r\nBETAINV\t\t\t= BETAINV\t\t\t##\tReturnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning\r\nBINOMDIST\t\t= BINOMFÖRD\t\t\t##\tReturnerar den individuella binomialfördelningen\r\nCHIDIST\t\t\t= CHI2FÖRD\t\t\t##\tReturnerar den ensidiga sannolikheten av c2-fördelningen\r\nCHIINV\t\t\t= CHI2INV\t\t\t##\tReturnerar inversen av chi2-fördelningen\r\nCHITEST\t\t\t= CHI2TEST\t\t\t##\tReturnerar oberoendetesten\r\nCONFIDENCE\t\t= KONFIDENS\t\t\t##\tReturnerar konfidensintervallet för en populations medelvärde\r\nCORREL\t\t\t= KORREL\t\t\t##\tReturnerar korrelationskoefficienten mellan två datamängder\r\nCOUNT\t\t\t= ANTAL\t\t\t\t##\tRäknar hur många tal som finns bland argumenten\r\nCOUNTA\t\t\t= ANTALV\t\t\t##\tRäknar hur många värden som finns bland argumenten\r\nCOUNTBLANK\t\t= ANTAL.TOMMA\t\t\t##\tRäknar antalet tomma celler i ett område\r\nCOUNTIF\t\t\t= ANTAL.OM\t\t\t##\tRäknar antalet celler i ett område som uppfyller angivna villkor.\r\nCOUNTIFS\t\t= ANTAL.OMF\t\t\t##\tRäknar antalet celler i ett område som uppfyller flera villkor.\r\nCOVAR\t\t\t= KOVAR\t\t\t\t##\tReturnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser\r\nCRITBINOM\t\t= KRITBINOM\t\t\t##\tReturnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde\r\nDEVSQ\t\t\t= KVADAVV\t\t\t##\tReturnerar summan av kvadrater på avvikelser\r\nEXPONDIST\t\t= EXPONFÖRD\t\t\t##\tReturnerar exponentialfördelningen\r\nFDIST\t\t\t= FFÖRD\t\t\t\t##\tReturnerar F-sannolikhetsfördelningen\r\nFINV\t\t\t= FINV\t\t\t\t##\tReturnerar inversen till F-sannolikhetsfördelningen\r\nFISHER\t\t\t= FISHER\t\t\t##\tReturnerar Fisher-transformationen\r\nFISHERINV\t\t= FISHERINV\t\t\t##\tReturnerar inversen till Fisher-transformationen\r\nFORECAST\t\t= PREDIKTION\t\t\t##\tReturnerar ett värde längs en linjär trendlinje\r\nFREQUENCY\t\t= FREKVENS\t\t\t##\tReturnerar en frekvensfördelning som en lodrät matris\r\nFTEST\t\t\t= FTEST\t\t\t\t##\tReturnerar resultatet av en F-test\r\nGAMMADIST\t\t= GAMMAFÖRD\t\t\t##\tReturnerar gammafördelningen\r\nGAMMAINV\t\t= GAMMAINV\t\t\t##\tReturnerar inversen till den kumulativa gammafördelningen\r\nGAMMALN\t\t\t= GAMMALN\t\t\t##\tReturnerar den naturliga logaritmen för gammafunktionen, G(x)\r\nGEOMEAN\t\t\t= GEOMEDEL\t\t\t##\tReturnerar det geometriska medelvärdet\r\nGROWTH\t\t\t= EXPTREND\t\t\t##\tReturnerar värden längs en exponentiell trend\r\nHARMEAN\t\t\t= HARMMEDEL\t\t\t##\tReturnerar det harmoniska medelvärdet\r\nHYPGEOMDIST\t\t= HYPGEOMFÖRD\t\t\t##\tReturnerar den hypergeometriska fördelningen\r\nINTERCEPT\t\t= SKÄRNINGSPUNKT\t\t##\tReturnerar skärningspunkten för en linjär regressionslinje\r\nKURT\t\t\t= TOPPIGHET\t\t\t##\tReturnerar toppigheten av en mängd data\r\nLARGE\t\t\t= STÖRSTA\t\t\t##\tReturnerar det n:te största värdet i en mängd data\r\nLINEST\t\t\t= REGR\t\t\t\t##\tReturnerar parametrar till en linjär trendlinje\r\nLOGEST\t\t\t= EXPREGR\t\t\t##\tReturnerar parametrarna i en exponentiell trend\r\nLOGINV\t\t\t= LOGINV\t\t\t##\tReturnerar inversen till den lognormala fördelningen\r\nLOGNORMDIST\t\t= LOGNORMFÖRD\t\t\t##\tReturnerar den kumulativa lognormala fördelningen\r\nMAX\t\t\t= MAX\t\t\t\t##\tReturnerar det största värdet i en lista av argument\r\nMAXA\t\t\t= MAXA\t\t\t\t##\tReturnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden\r\nMEDIAN\t\t\t= MEDIAN\t\t\t##\tReturnerar medianen för angivna tal\r\nMIN\t\t\t= MIN\t\t\t\t##\tReturnerar det minsta värdet i en lista med argument\r\nMINA\t\t\t= MINA\t\t\t\t##\tReturnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden\r\nMODE\t\t\t= TYPVÄRDE\t\t\t##\tReturnerar det vanligaste värdet i en datamängd\r\nNEGBINOMDIST\t\t= NEGBINOMFÖRD\t\t\t##\tReturnerar den negativa binomialfördelningen\r\nNORMDIST\t\t= NORMFÖRD\t\t\t##\tReturnerar den kumulativa normalfördelningen\r\nNORMINV\t\t\t= NORMINV\t\t\t##\tReturnerar inversen till den kumulativa normalfördelningen\r\nNORMSDIST\t\t= NORMSFÖRD\t\t\t##\tReturnerar den kumulativa standardnormalfördelningen\r\nNORMSINV\t\t= NORMSINV\t\t\t##\tReturnerar inversen till den kumulativa standardnormalfördelningen\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tReturnerar korrelationskoefficienten till Pearsons momentprodukt\r\nPERCENTILE\t\t= PERCENTIL\t\t\t##\tReturnerar den n:te percentilen av värden i ett område\r\nPERCENTRANK\t\t= PROCENTRANG\t\t\t##\tReturnerar procentrangen för ett värde i en datamängd\r\nPERMUT\t\t\t= PERMUT\t\t\t##\tReturnerar antal permutationer för ett givet antal objekt\r\nPOISSON\t\t\t= POISSON\t\t\t##\tReturnerar Poisson-fördelningen\r\nPROB\t\t\t= SANNOLIKHET\t\t\t##\tReturnerar sannolikheten att värden i ett område ligger mellan två gränser\r\nQUARTILE\t\t= KVARTIL\t\t\t##\tReturnerar kvartilen av en mängd data\r\nRANK\t\t\t= RANG\t\t\t\t##\tReturnerar rangordningen för ett tal i en lista med tal\r\nRSQ\t\t\t= RKV\t\t\t\t##\tReturnerar kvadraten av Pearsons produktmomentkorrelationskoefficient\r\nSKEW\t\t\t= SNEDHET\t\t\t##\tReturnerar snedheten för en fördelning\r\nSLOPE\t\t\t= LUTNING\t\t\t##\tReturnerar lutningen på en linjär regressionslinje\r\nSMALL\t\t\t= MINSTA\t\t\t##\tReturnerar det n:te minsta värdet i en mängd data\r\nSTANDARDIZE\t\t= STANDARDISERA\t\t\t##\tReturnerar ett normaliserat värde\r\nSTDEV\t\t\t= STDAV\t\t\t\t##\tUppskattar standardavvikelsen baserat på ett urval\r\nSTDEVA\t\t\t= STDEVA\t\t\t##\tUppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden\r\nSTDEVP\t\t\t= STDAVP\t\t\t##\tBeräknar standardavvikelsen baserat på hela populationen\r\nSTDEVPA\t\t\t= STDEVPA\t\t\t##\tBeräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden\r\nSTEYX\t\t\t= STDFELYX\t\t\t##\tReturnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen\r\nTDIST\t\t\t= TFÖRD\t\t\t\t##\tReturnerar Students t-fördelning\r\nTINV\t\t\t= TINV\t\t\t\t##\tReturnerar inversen till Students t-fördelning\r\nTREND\t\t\t= TREND\t\t\t\t##\tReturnerar värden längs en linjär trend\r\nTRIMMEAN\t\t= TRIMMEDEL\t\t\t##\tReturnerar medelvärdet av mittpunkterna i en datamängd\r\nTTEST\t\t\t= TTEST\t\t\t\t##\tReturnerar sannolikheten beräknad ur Students t-test\r\nVAR\t\t\t= VARIANS\t\t\t##\tUppskattar variansen baserat på ett urval\r\nVARA\t\t\t= VARA\t\t\t\t##\tUppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden\r\nVARP\t\t\t= VARIANSP\t\t\t##\tBeräknar variansen baserat på hela populationen\r\nVARPA\t\t\t= VARPA\t\t\t\t##\tBeräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tReturnerar Weibull-fördelningen\r\nZTEST\t\t\t= ZTEST\t\t\t\t##\tReturnerar det ensidiga sannolikhetsvärdet av ett z-test\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tTextfunktioner\r\n##\r\nASC\t\t\t= ASC\t\t\t\t##\tÄndrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte)\r\nBAHTTEXT\t\t= BAHTTEXT\t\t\t##\tOmvandlar ett tal till text med valutaformatet ß (baht)\r\nCHAR\t\t\t= TECKENKOD\t\t\t##\tReturnerar tecknet som anges av kod\r\nCLEAN\t\t\t= STÄDA\t\t\t\t##\tTar bort alla icke utskrivbara tecken i en text\r\nCODE\t\t\t= KOD\t\t\t\t##\tReturnerar en numerisk kod för det första tecknet i en textsträng\r\nCONCATENATE\t\t= SAMMANFOGA\t\t\t##\tSammanfogar flera textdelar till en textsträng\r\nDOLLAR\t\t\t= VALUTA\t\t\t##\tOmvandlar ett tal till text med valutaformat\r\nEXACT\t\t\t= EXAKT\t\t\t\t##\tKontrollerar om två textvärden är identiska\r\nFIND\t\t\t= HITTA\t\t\t\t##\tHittar en text i en annan (skiljer på gemener och versaler)\r\nFINDB\t\t\t= HITTAB\t\t\t##\tHittar en text i en annan (skiljer på gemener och versaler)\r\nFIXED\t\t\t= FASTTAL\t\t\t##\tFormaterar ett tal som text med ett fast antal decimaler\r\nJIS\t\t\t= JIS\t\t\t\t##\tÄndrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte)\r\nLEFT\t\t\t= VÄNSTER\t\t\t##\tReturnerar tecken längst till vänster i en sträng\r\nLEFTB\t\t\t= VÄNSTERB\t\t\t##\tReturnerar tecken längst till vänster i en sträng\r\nLEN\t\t\t= LÄNGD\t\t\t\t##\tReturnerar antalet tecken i en textsträng\r\nLENB\t\t\t= LÄNGDB\t\t\t##\tReturnerar antalet tecken i en textsträng\r\nLOWER\t\t\t= GEMENER\t\t\t##\tOmvandlar text till gemener\r\nMID\t\t\t= EXTEXT\t\t\t##\tReturnerar angivet antal tecken från en text med början vid den position som du anger\r\nMIDB\t\t\t= EXTEXTB\t\t\t##\tReturnerar angivet antal tecken från en text med början vid den position som du anger\r\nPHONETIC\t\t= PHONETIC\t\t\t##\tReturnerar de fonetiska (furigana) tecknen i en textsträng\r\nPROPER\t\t\t= INITIAL\t\t\t##\tÄndrar första bokstaven i varje ord i ett textvärde till versal\r\nREPLACE\t\t\t= ERSÄTT\t\t\t##\tErsätter tecken i text\r\nREPLACEB\t\t= ERSÄTTB\t\t\t##\tErsätter tecken i text\r\nREPT\t\t\t= REP\t\t\t\t##\tUpprepar en text ett bestämt antal gånger\r\nRIGHT\t\t\t= HÖGER\t\t\t\t##\tReturnerar tecken längst till höger i en sträng\r\nRIGHTB\t\t\t= HÖGERB\t\t\t##\tReturnerar tecken längst till höger i en sträng\r\nSEARCH\t\t\t= SÖK\t\t\t\t##\tHittar ett textvärde i ett annat (skiljer inte på gemener och versaler)\r\nSEARCHB\t\t\t= SÖKB\t\t\t\t##\tHittar ett textvärde i ett annat (skiljer inte på gemener och versaler)\r\nSUBSTITUTE\t\t= BYT.UT\t\t\t##\tErsätter gammal text med ny text i en textsträng\r\nT\t\t\t= T\t\t\t\t##\tOmvandlar argumenten till text\r\nTEXT\t\t\t= TEXT\t\t\t\t##\tFormaterar ett tal och omvandlar det till text\r\nTRIM\t\t\t= RENSA\t\t\t\t##\tTar bort blanksteg från text\r\nUPPER\t\t\t= VERSALER\t\t\t##\tOmvandlar text till versaler\r\nVALUE\t\t\t= TEXTNUM\t\t\t##\tOmvandlar ett textargument till ett tal\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/tr/config",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Settings\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n##\r\n\r\n\r\nArgumentSeparator\t= ;\r\n\r\n\r\n##\r\n##\t(For future use)\r\n##\r\ncurrencySymbol\t= YTL\r\n\r\n\r\n##\r\n##\tExcel Error Codes\t(For future use)\r\r\n##\r\nNULL\t= #BOŞ!\r\nDIV0\t= #SAYI/0!\r\nVALUE\t= #DEĞER!\r\nREF\t= #BAŞV!\r\nNAME\t= #AD?\r\nNUM\t= #SAYI!\r\nNA\t= #YOK\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel/locale/tr/functions",
    "content": "##\r\n## PHPExcel\r\n##\r\r\n## Copyright (c) 2006 - 2013 PHPExcel\r\n##\r\n## This library is free software; you can redistribute it and/or\r\n## modify it under the terms of the GNU Lesser General Public\r\n## License as published by the Free Software Foundation; either\r\n## version 2.1 of the License, or (at your option) any later version.\r\n##\r\n## This library is distributed in the hope that it will be useful,\r\n## but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n## Lesser General Public License for more details.\r\n##\r\n## You should have received a copy of the GNU Lesser General Public\r\n## License along with this library; if not, write to the Free Software\r\n## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n##\r\n## @category   PHPExcel\r\n## @package    PHPExcel_Calculation\r\n## @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)\r\n## @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt\tLGPL\r\n## @version    ##VERSION##, ##DATE##\r\n##\r\n## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/\r\n##\r\n##\r\n\r\n\r\n##\r\n##\tAdd-in and Automation functions\t\t\tEklenti ve Otomasyon fonksiyonları\r\n##\r\nGETPIVOTDATA\t\t= ÖZETVERİAL\t##\tBir Özet Tablo raporunda saklanan verileri verir.\r\n\r\n\r\n##\r\n##\tCube functions\t\t\t\t\tKüp işlevleri\r\n##\r\nCUBEKPIMEMBER\t\t= KÜPKPIÜYE\t\t\t##\tKilit performans göstergesi (KPI-Key Performance Indicator) adını, özelliğini ve ölçüsünü verir ve hücredeki ad ve özelliği gösterir. KPI, bir kurumun performansını izlemek için kullanılan aylık brüt kâr ya da üç aylık çalışan giriş çıkışları gibi ölçülebilen bir birimdir.\r\nCUBEMEMBER\t\t\t= KÜPÜYE\t\t\t##\tBir küp hiyerarşisinde bir üyeyi veya kaydı verir. Üye veya kaydın küpte varolduğunu doğrulamak için kullanılır.\r\nCUBEMEMBERPROPERTY\t= KÜPÜYEÖZELLİĞİ\t##\tBir küpte bir üyenin özelliğinin değerini verir. Küp içinde üye adının varlığını doğrulamak ve bu üyenin belli özelliklerini getirmek için kullanılır.\r\nCUBERANKEDMEMBER\t= KÜPÜYESIRASI \t\t##\tBir küme içindeki üyenin derecesini veya kaçıncı olduğunu verir. En iyi satış elemanı, veya en iyi on öğrenci gibi bir kümedeki bir veya daha fazla öğeyi getirmek için kullanılır.\r\nCUBESET\t\t\t\t= KÜPKÜME\t\t\t##\tKümeyi oluşturan ve ardından bu kümeyi Microsoft Office Excel'e getiren sunucudaki küpe küme ifadelerini göndererek hesaplanan üye veya kayıt kümesini tanımlar.\r\nCUBESETCOUNT\t\t= KÜPKÜMESAY\t\t##\tBir kümedeki öğelerin sayısını getirir.\r\nCUBEVALUE\t\t\t= KÜPDEĞER \t\t\t##\tBir küpten toplam değeri getirir.\r\n\r\n\r\n##\r\n##\tDatabase functions\t\t\t\tVeritabanı işlevleri\r\n##\r\nDAVERAGE\t\t= VSEÇORT\t\t\t##\tSeçili veritabanı girdilerinin ortalamasını verir.\r\nDCOUNT\t\t\t= VSEÇSAY\t\t\t##\tVeritabanında sayı içeren hücre sayısını hesaplar.\r\nDCOUNTA\t\t\t= VSEÇSAYDOLU\t\t##\tVeritabanındaki boş olmayan hücreleri sayar.\r\nDGET\t\t\t= VAL\t\t\t\t##\tVeritabanından, belirtilen ölçütlerle eşleşen tek bir rapor çıkarır.\r\nDMAX\t\t\t= VSEÇMAK\t\t\t##\tSeçili veritabanı girişlerinin en yüksek değerini verir.\r\nDMIN\t\t\t= VSEÇMİN\t\t\t##\tSeçili veritabanı girişlerinin en düşük değerini verir.\r\nDPRODUCT\t\t= VSEÇÇARP\t\t\t##\tKayıtların belli bir alanında bulunan, bir veritabanındaki ölçütlerle eşleşen değerleri çarpar.\r\nDSTDEV\t\t\t= VSEÇSTDSAPMA\t\t##\tSeçili veritabanı girişlerinden oluşan bir örneğe dayanarak, standart sapmayı tahmin eder.\r\nDSTDEVP\t\t\t= VSEÇSTDSAPMAS\t\t##\tStandart sapmayı, seçili veritabanı girişlerinin tüm popülasyonunu esas alarak hesaplar.\r\nDSUM\t\t\t= VSEÇTOPLA\t\t\t##\tKayıtların alan sütununda bulunan, ölçütle eşleşen sayıları toplar.\r\nDVAR\t\t\t= VSEÇVAR\t\t\t##\tSeçili veritabanı girişlerinden oluşan bir örneği esas alarak farkı tahmin eder.\r\nDVARP\t\t\t= VSEÇVARS\t\t\t##\tSeçili veritabanı girişlerinin tüm popülasyonunu esas alarak farkı hesaplar.\r\n\r\n\r\n##\r\n##\tDate and time functions\t\t\t\tTarih ve saat işlevleri\r\n##\r\nDATE\t\t\t= TARİH\t\t\t\t##\tBelirli bir tarihin seri numarasını verir.\r\nDATEVALUE\t\t= TARİHSAYISI\t\t##\tMetin biçimindeki bir tarihi seri numarasına dönüştürür.\r\nDAY\t\t\t\t= GÜN\t\t\t\t##\tSeri numarasını, ayın bir gününe dönüştürür.\r\nDAYS360\t\t\t= GÜN360\t\t\t##\tİki tarih arasındaki gün sayısını, 360 günlük yılı esas alarak hesaplar.\r\nEDATE\t\t\t= SERİTARİH\t\t\t##\tBaşlangıç tarihinden itibaren, belirtilen ay sayısından önce veya sonraki tarihin seri numarasını verir.\r\nEOMONTH\t\t\t= SERİAY\t\t\t##\tBelirtilen sayıda ay önce veya sonraki ayın son gününün seri numarasını verir.\r\nHOUR\t\t\t= SAAT\t\t\t\t##\tBir seri numarasını saate dönüştürür.\r\nMINUTE\t\t\t= DAKİKA\t\t\t##\tBir seri numarasını dakikaya dönüştürür.\r\nMONTH\t\t\t= AY\t\t\t\t##\tBir seri numarasını aya dönüştürür.\r\nNETWORKDAYS\t\t= TAMİŞGÜNÜ\t\t\t##\tİki tarih arasındaki tam çalışma günlerinin sayısını verir.\r\nNOW\t\t\t\t= ŞİMDİ\t\t\t\t##\tGeçerli tarihin ve saatin seri numarasını verir.\r\nSECOND\t\t\t= SANİYE\t\t\t##\tBir seri numarasını saniyeye dönüştürür.\r\nTIME\t\t\t= ZAMAN\t\t\t\t##\tBelirli bir zamanın seri numarasını verir.\r\nTIMEVALUE\t\t= ZAMANSAYISI\t\t##\tMetin biçimindeki zamanı seri numarasına dönüştürür.\r\nTODAY\t\t\t= BUGÜN\t\t\t\t##\tBugünün tarihini seri numarasına dönüştürür.\r\nWEEKDAY\t\t\t= HAFTANINGÜNÜ\t\t##\tBir seri numarasını, haftanın gününe dönüştürür.\r\nWEEKNUM\t\t\t= HAFTASAY\t\t\t##\tDizisel değerini, haftanın yıl içinde bulunduğu konumu sayısal olarak gösteren sayıya dönüştürür.\r\nWORKDAY\t\t\t= İŞGÜNÜ\t\t\t##\tBelirtilen sayıda çalışma günü öncesinin ya da sonrasının tarihinin seri numarasını verir.\r\nYEAR\t\t\t= YIL\t\t\t\t##\tBir seri numarasını yıla dönüştürür.\r\nYEARFRAC\t\t= YILORAN\t\t\t##\tBaşlangıç_tarihi ve bitiş_tarihi arasındaki tam günleri gösteren yıl kesrini verir.\r\n\r\n\r\n##\r\n##\tEngineering functions\t\t\t\tMühendislik işlevleri\r\n##\r\nBESSELI\t\t\t= BESSELI\t\t\t##\tDeğiştirilmiş Bessel fonksiyonu In(x)'i verir.\r\nBESSELJ\t\t\t= BESSELJ\t\t\t##\tBessel fonksiyonu Jn(x)'i verir.\r\nBESSELK\t\t\t= BESSELK\t\t\t##\tDeğiştirilmiş Bessel fonksiyonu Kn(x)'i verir.\r\nBESSELY\t\t\t= BESSELY\t\t\t##\tBessel fonksiyonu Yn(x)'i verir.\r\nBIN2DEC\t\t\t= BIN2DEC\t\t\t##\tİkili bir sayıyı, ondalık sayıya dönüştürür.\r\nBIN2HEX\t\t\t= BIN2HEX\t\t\t##\tİkili bir sayıyı, onaltılıya dönüştürür.\r\nBIN2OCT\t\t\t= BIN2OCT\t\t\t##\tİkili bir sayıyı, sekizliye dönüştürür.\r\nCOMPLEX\t\t\t= KARMAŞIK\t\t\t##\tGerçek ve sanal katsayıları, karmaşık sayıya dönüştürür.\r\nCONVERT\t\t\t= ÇEVİR\t\t\t\t##\tBir sayıyı, bir ölçüm sisteminden bir başka ölçüm sistemine dönüştürür.\r\nDEC2BIN\t\t\t= DEC2BIN\t\t\t##\tOndalık bir sayıyı, ikiliye dönüştürür.\r\nDEC2HEX\t\t\t= DEC2HEX\t\t\t##\tOndalık bir sayıyı, onaltılıya dönüştürür.\r\nDEC2OCT\t\t\t= DEC2OCT\t\t\t##\tOndalık bir sayıyı sekizliğe dönüştürür.\r\nDELTA\t\t\t= DELTA\t\t\t\t##\tİki değerin eşit olup olmadığını sınar.\r\nERF\t\t\t\t= HATAİŞLEV\t\t\t##\tHata işlevini verir.\r\nERFC\t\t\t= TÜMHATAİŞLEV\t\t##\tTümleyici hata işlevini verir.\r\nGESTEP\t\t\t= BESINIR\t\t\t##\tBir sayının eşik değerinden büyük olup olmadığını sınar.\r\nHEX2BIN\t\t\t= HEX2BIN\t\t\t##\tOnaltılı bir sayıyı ikiliye dönüştürür.\r\nHEX2DEC\t\t\t= HEX2DEC\t\t\t##\tOnaltılı bir sayıyı ondalığa dönüştürür.\r\nHEX2OCT\t\t\t= HEX2OCT\t\t\t##\tOnaltılı bir sayıyı sekizliğe dönüştürür.\r\nIMABS\t\t\t= SANMUTLAK\t\t\t##\tKarmaşık bir sayının mutlak değerini (modül) verir.\r\nIMAGINARY\t\t= SANAL\t\t\t\t##\tKarmaşık bir sayının sanal katsayısını verir.\r\nIMARGUMENT\t\t= SANBAĞ_DEĞİŞKEN\t##\tRadyanlarla belirtilen bir açı olan teta bağımsız değişkenini verir.\r\nIMCONJUGATE\t\t= SANEŞLENEK\t\t##\tKarmaşık bir sayının karmaşık eşleniğini verir.\r\nIMCOS\t\t\t= SANCOS\t\t\t##\tKarmaşık bir sayının kosinüsünü verir.\r\nIMDIV\t\t\t= SANBÖL\t\t\t##\tİki karmaşık sayının bölümünü verir.\r\nIMEXP\t\t\t= SANÜS\t\t\t\t##\tKarmaşık bir sayının üssünü verir.\r\nIMLN\t\t\t= SANLN\t\t\t\t##\tKarmaşık bir sayının doğal logaritmasını verir.\r\nIMLOG10\t\t\t= SANLOG10\t\t\t##\tKarmaşık bir sayının, 10 tabanında logaritmasını verir.\r\nIMLOG2\t\t\t= SANLOG2\t\t\t##\tKarmaşık bir sayının 2 tabanında logaritmasını verir.\r\nIMPOWER\t\t\t= SANÜSSÜ\t\t\t##\tKarmaşık bir sayıyı, bir tamsayı üssüne yükseltilmiş olarak verir.\r\nIMPRODUCT\t\t= SANÇARP\t\t\t##\tKarmaşık sayıların çarpımını verir.\r\nIMREAL\t\t\t= SANGERÇEK\t\t\t##\tKarmaşık bir sayının, gerçek katsayısını verir.\r\nIMSIN\t\t\t= SANSIN\t\t\t##\tKarmaşık bir sayının sinüsünü verir.\r\nIMSQRT\t\t\t= SANKAREKÖK\t\t##\tKarmaşık bir sayının karekökünü verir.\r\nIMSUB\t\t\t= SANÇIKAR\t\t\t##\tİki karmaşık sayının farkını verir.\r\nIMSUM\t\t\t= SANTOPLA\t\t\t##\tKarmaşık sayıların toplamını verir.\r\nOCT2BIN\t\t\t= OCT2BIN\t\t\t##\tSekizli bir sayıyı ikiliye dönüştürür.\r\nOCT2DEC\t\t\t= OCT2DEC\t\t\t##\tSekizli bir sayıyı ondalığa dönüştürür.\r\nOCT2HEX\t\t\t= OCT2HEX\t\t\t##\tSekizli bir sayıyı onaltılıya dönüştürür.\r\n\r\n\r\n##\r\n##\tFinancial functions\t\t\t\tFinansal fonksiyonlar\r\n##\r\nACCRINT\t\t\t= GERÇEKFAİZ\t\t##\tDönemsel faiz ödeyen hisse senedine ilişkin tahakkuk eden faizi getirir.\r\nACCRINTM\t\t= GERÇEKFAİZV\t\t##\tVadesinde ödeme yapan bir tahvilin tahakkuk etmiş faizini verir.\r\nAMORDEGRC\t\t= AMORDEGRC\t\t\t##\tYıpranma katsayısı kullanarak her hesap döneminin değer kaybını verir.\r\nAMORLINC\t\t= AMORLINC\t\t\t##\tHer hesap dönemi içindeki yıpranmayı verir.\r\nCOUPDAYBS\t\t= KUPONGÜNBD\t\t##\tKupon süresinin başlangıcından alış tarihine kadar olan süredeki gün sayısını verir.\r\nCOUPDAYS\t\t= KUPONGÜN\t\t\t##\tKupon süresindeki, gün sayısını, alış tarihini de içermek üzere, verir.\r\nCOUPDAYSNC\t\t= KUPONGÜNDSK\t\t##\tAlış tarihinden bir sonraki kupon tarihine kadar olan gün sayısını verir.\r\nCOUPNCD\t\t\t= KUPONGÜNSKT\t\t##\tAlış tarihinden bir sonraki kupon tarihini verir.\r\nCOUPNUM\t\t\t= KUPONSAYI\t\t\t##\tAlış tarihiyle vade tarihi arasında ödenecek kuponların sayısını verir.\r\nCOUPPCD\t\t\t= KUPONGÜNÖKT\t\t##\tAlış tarihinden bir önceki kupon tarihini verir.\r\nCUMIPMT\t\t\t= AİÇVERİMORANI\t\t##\tİki dönem arasında ödenen kümülatif faizi verir.\r\nCUMPRINC\t\t= ANA_PARA_ÖDEMESİ\t##\tİki dönem arasında bir borç üzerine ödenen birikimli temeli verir.\r\nDB\t\t\t\t= AZALANBAKİYE\t\t##\tBir malın belirtilen bir süre içindeki yıpranmasını, sabit azalan bakiye yöntemini kullanarak verir.\r\nDDB\t\t\t\t= ÇİFTAZALANBAKİYE\t##\tBir malın belirtilen bir süre içindeki yıpranmasını, çift azalan bakiye yöntemi ya da sizin belirttiğiniz başka bir yöntemi kullanarak verir.\r\nDISC\t\t\t= İNDİRİM\t\t\t##\tBir tahvilin indirim oranını verir.\r\nDOLLARDE\t\t= LİRAON\t\t\t##\tKesir olarak tanımlanmış lira fiyatını, ondalık sayı olarak tanımlanmış lira fiyatına dönüştürür.\r\nDOLLARFR\t\t= LİRAKES\t\t\t##\tOndalık sayı olarak tanımlanmış lira fiyatını, kesir olarak tanımlanmış lira fiyatına dönüştürür.\r\nDURATION\t\t= SÜRE\t\t\t\t##\tBelli aralıklarla faiz ödemesi yapan bir tahvilin yıllık süresini verir.\r\nEFFECT\t\t\t= ETKİN\t\t\t\t##\tEfektif yıllık faiz oranını verir.\r\nFV\t\t\t\t= ANBD\t\t\t\t##\tBir yatırımın gelecekteki değerini verir.\r\nFVSCHEDULE\t\t= GDPROGRAM\t\t\t##\tBir seri birleşik faiz oranı uyguladıktan sonra, bir başlangıçtaki anaparanın gelecekteki değerini verir.\r\nINTRATE\t\t\t= FAİZORANI\t\t\t##\tTam olarak yatırım yapılmış bir tahvilin faiz oranını verir.\r\nIPMT\t\t\t= FAİZTUTARI\t\t##\tBir yatırımın verilen bir süre için faiz ödemesini verir.\r\nIRR\t\t\t\t= İÇ_VERİM_ORANI\t##\tBir para akışı serisi için, iç verim oranını verir.\r\nISPMT\t\t\t= ISPMT\t\t\t\t##\tYatırımın belirli bir dönemi boyunca ödenen faizi hesaplar.\r\nMDURATION\t\t= MSÜRE\t\t\t\t##\tVarsayılan par değeri 10.000.000 lira olan bir tahvil için Macauley değiştirilmiş süreyi verir.\r\nMIRR\t\t\t= D_İÇ_VERİM_ORANI\t##\tPozitif ve negatif para akışlarının farklı oranlarda finanse edildiği durumlarda, iç verim oranını verir.\r\nNOMINAL\t\t\t= NOMİNAL\t\t\t##\tYıllık nominal faiz oranını verir.\r\nNPER\t\t\t= DÖNEM_SAYISI\t\t##\tBir yatırımın dönem sayısını verir.\r\nNPV\t\t\t\t= NBD\t\t\t\t##\tBir yatırımın bugünkü net değerini, bir dönemsel para akışları serisine ve bir indirim oranına bağlı olarak verir.\r\nODDFPRICE\t\t= TEKYDEĞER\t\t\t##\tTek bir ilk dönemi olan bir tahvilin değerini, her 100.000.000 lirada bir verir.\r\nODDFYIELD\t\t= TEKYÖDEME\t\t\t##\tTek bir ilk dönemi olan bir tahvilin ödemesini verir.\r\nODDLPRICE\t\t= TEKSDEĞER\t\t\t##\tTek bir son dönemi olan bir tahvilin fiyatını her 10.000.000 lirada bir verir.\r\nODDLYIELD\t\t= TEKSÖDEME\t\t\t##\tTek bir son dönemi olan bir tahvilin ödemesini verir.\r\nPMT\t\t\t\t= DEVRESEL_ÖDEME\t##\tBir yıllık dönemsel ödemeyi verir.\r\nPPMT\t\t\t= ANA_PARA_ÖDEMESİ\t##\tVerilen bir süre için, bir yatırımın anaparasına dayanan ödemeyi verir.\r\nPRICE\t\t\t= DEĞER\t\t\t\t##\tDönemsel faiz ödeyen bir tahvilin fiyatını 10.000.00 liralık değer başına verir.\r\nPRICEDISC\t\t= DEĞERİND\t\t\t##\tİndirimli bir tahvilin fiyatını 10.000.000 liralık nominal değer başına verir.\r\nPRICEMAT\t\t= DEĞERVADE\t\t\t##\tFaizini vade sonunda ödeyen bir tahvilin fiyatını 10.000.000 nominal değer başına verir.\r\nPV\t\t\t\t= BD\t\t\t\t##\tBir yatırımın bugünkü değerini verir.\r\nRATE\t\t\t= FAİZ_ORANI\t\t##\tBir yıllık dönem başına düşen faiz oranını verir.\r\nRECEIVED\t\t= GETİRİ\t\t\t##\tTam olarak yatırılmış bir tahvilin vadesinin bitiminde alınan miktarı verir.\r\nSLN\t\t\t\t= DA\t\t\t\t##\tBir malın bir dönem içindeki doğrusal yıpranmasını verir.\r\nSYD\t\t\t\t= YAT\t\t\t\t##\tBir malın belirli bir dönem için olan amortismanını verir.\r\nTBILLEQ\t\t\t= HTAHEŞ\t\t\t##\tBir Hazine bonosunun bono eşdeğeri ödemesini verir.\r\nTBILLPRICE\t\t= HTAHDEĞER\t\t\t##\tBir Hazine bonosunun değerini, 10.000.000 liralık nominal değer başına verir.\r\nTBILLYIELD\t\t= HTAHÖDEME\t\t\t##\tBir Hazine bonosunun ödemesini verir.\r\nVDB\t\t\t\t= DAB\t\t\t\t##\tBir malın amortismanını, belirlenmiş ya da kısmi bir dönem için, bir azalan bakiye yöntemi kullanarak verir.\r\nXIRR\t\t\t= AİÇVERİMORANI\t\t##\tDönemsel olması gerekmeyen bir para akışları programı için, iç verim oranını verir.\r\nXNPV\t\t\t= ANBD\t\t\t\t##\tDönemsel olması gerekmeyen bir para akışları programı için, bugünkü net değeri verir.\r\nYIELD\t\t\t= ÖDEME\t\t\t\t##\tBelirli aralıklarla faiz ödeyen bir tahvilin ödemesini verir.\r\nYIELDDISC\t\t= ÖDEMEİND\t\t\t##\tİndirimli bir tahvilin yıllık ödemesini verir; örneğin, bir Hazine bonosunun.\r\nYIELDMAT\t\t= ÖDEMEVADE\t\t\t##\tVadesinin bitiminde faiz ödeyen bir tahvilin yıllık ödemesini verir.\r\n\r\n\r\n##\r\n##\tInformation functions\t\t\t\tBilgi fonksiyonları\r\n##\r\nCELL\t\t\t= HÜCRE\t\t\t##\tBir hücrenin biçimlendirmesi, konumu ya da içeriği hakkında bilgi verir.\r\nERROR.TYPE\t\t= HATA.TİPİ\t\t##\tBir hata türüne ilişkin sayıları verir.\r\nINFO\t\t\t= BİLGİ\t\t\t##\tGeçerli işletim ortamı hakkında bilgi verir.\r\nISBLANK\t\t\t= EBOŞSA\t\t##\tDeğer boşsa, DOĞRU verir.\r\nISERR\t\t\t= EHATA\t\t\t##\tDeğer, #YOK dışındaki bir hata değeriyse, DOĞRU verir.\r\nISERROR\t\t\t= EHATALIYSA\t##\tDeğer, herhangi bir hata değeriyse, DOĞRU verir.\r\nISEVEN\t\t\t= ÇİFTTİR\t\t##\tSayı çiftse, DOĞRU verir.\r\nISLOGICAL\t\t= EMANTIKSALSA\t##\tDeğer, mantıksal bir değerse, DOĞRU verir.\r\nISNA\t\t\t= EYOKSA\t\t##\tDeğer, #YOK hata değeriyse, DOĞRU verir.\r\nISNONTEXT\t\t= EMETİNDEĞİLSE\t##\tDeğer, metin değilse, DOĞRU verir.\r\nISNUMBER\t\t= ESAYIYSA\t\t##\tDeğer, bir sayıysa, DOĞRU verir.\r\nISODD\t\t\t= TEKTİR\t\t##\tSayı tekse, DOĞRU verir.\r\nISREF\t\t\t= EREFSE\t\t##\tDeğer bir başvuruysa, DOĞRU verir.\r\nISTEXT\t\t\t= EMETİNSE\t\t##\tDeğer bir metinse DOĞRU verir.\r\nN\t\t\t\t= N\t\t\t\t##\tSayıya dönüştürülmüş bir değer verir.\r\nNA\t\t\t\t= YOKSAY\t\t##\t#YOK hata değerini verir.\r\nTYPE\t\t\t= TİP\t\t\t##\tBir değerin veri türünü belirten bir sayı verir.\r\n\r\n\r\n##\r\n##\tLogical functions\t\t\t\tMantıksal fonksiyonlar\r\n##\r\nAND\t\t\t\t= VE\t\t\t##\tBütün bağımsız değişkenleri DOĞRU ise, DOĞRU verir.\r\nFALSE\t\t\t= YANLIŞ\t\t##\tYANLIŞ mantıksal değerini verir.\r\nIF\t\t\t\t= EĞER\t\t\t##\tGerçekleştirilecek bir mantıksal sınama belirtir.\r\nIFERROR\t\t\t= EĞERHATA\t\t##\tFormül hatalıysa belirttiğiniz değeri verir; bunun dışındaki durumlarda formülün sonucunu verir.\r\nNOT\t\t\t\t= DEĞİL\t\t\t##\tBağımsız değişkeninin mantığını tersine çevirir.\r\nOR\t\t\t\t= YADA\t\t\t##\tBağımsız değişkenlerden herhangi birisi DOĞRU ise, DOĞRU verir.\r\nTRUE\t\t\t= DOĞRU\t\t\t##\tDOĞRU mantıksal değerini verir.\r\n\r\n\r\n##\r\n##\tLookup and reference functions\t\t\tArama ve Başvuru fonksiyonları\r\n##\r\nADDRESS\t\t\t= ADRES\t\t\t\t##\tBir başvuruyu, çalışma sayfasındaki tek bir hücreye metin olarak verir.\r\nAREAS\t\t\t= ALANSAY\t\t\t##\tRenvoie le nombre de zones dans une référence.\r\nCHOOSE\t\t\t= ELEMAN\t\t\t##\tDeğerler listesinden bir değer seçer.\r\nCOLUMN\t\t\t= SÜTUN\t\t\t\t##\tBir başvurunun sütun sayısını verir.\r\nCOLUMNS\t\t\t= SÜTUNSAY\t\t\t##\tBir başvurudaki sütunların sayısını verir.\r\nHLOOKUP\t\t\t= YATAYARA\t\t\t##\tBir dizinin en üst satırına bakar ve belirtilen hücrenin değerini verir.\r\nHYPERLINK\t\t= KÖPRÜ\t\t\t\t##\tBir ağ sunucusunda, bir intranette ya da Internet'te depolanan bir belgeyi açan bir kısayol ya da atlama oluşturur.\r\nINDEX\t\t\t= İNDİS\t\t\t\t##\tBaşvurudan veya diziden bir değer seçmek için, bir dizin kullanır.\r\nINDIRECT\t\t= DOLAYLI\t\t\t##\tMetin değeriyle belirtilen bir başvuru verir.\r\nLOOKUP\t\t\t= ARA\t\t\t\t##\tBir vektördeki veya dizideki değerleri arar.\r\nMATCH\t\t\t= KAÇINCI\t\t\t##\tBir başvurudaki veya dizideki değerleri arar.\r\nOFFSET\t\t\t= KAYDIR\t\t\t##\tVerilen bir başvurudan, bir başvuru kaydırmayı verir.\r\nROW\t\t\t\t= SATIR\t\t\t\t##\tBir başvurunun satır sayısını verir.\r\nROWS\t\t\t= SATIRSAY\t\t\t##\tBir başvurudaki satırların sayısını verir.\r\nRTD\t\t\t\t= RTD\t\t\t\t##\tCOM otomasyonunu destekleyen programdan gerçek zaman verileri alır.\r\nTRANSPOSE\t\t= DEVRİK_DÖNÜŞÜM\t##\tBir dizinin devrik dönüşümünü verir.\r\nVLOOKUP\t\t\t= DÜŞEYARA\t\t\t##\tBir dizinin ilk sütununa bakar ve bir hücrenin değerini vermek için satır boyunca hareket eder.\r\n\r\n\r\n##\r\n##\tMath and trigonometry functions\t\t\tMatematik ve trigonometri fonksiyonları\r\n##\r\nABS\t\t\t\t= MUTLAK\t\t\t##\tBir sayının mutlak değerini verir.\r\nACOS\t\t\t= ACOS\t\t\t\t##\tBir sayının ark kosinüsünü verir.\r\nACOSH\t\t\t= ACOSH\t\t\t\t##\tBir sayının ters hiperbolik kosinüsünü verir.\r\nASIN\t\t\t= ASİN\t\t\t\t##\tBir sayının ark sinüsünü verir.\r\nASINH\t\t\t= ASİNH\t\t\t\t##\tBir sayının ters hiperbolik sinüsünü verir.\r\nATAN\t\t\t= ATAN\t\t\t\t##\tBir sayının ark tanjantını verir.\r\nATAN2\t\t\t= ATAN2\t\t\t\t##\tArk tanjantı, x- ve y- koordinatlarından verir.\r\nATANH\t\t\t= ATANH\t\t\t\t##\tBir sayının ters hiperbolik tanjantını verir.\r\nCEILING\t\t\t= TAVANAYUVARLA\t\t##\tBir sayıyı, en yakın tamsayıya ya da en yakın katına yuvarlar.\r\nCOMBIN\t\t\t= KOMBİNASYON\t\t##\tVerilen sayıda öğenin kombinasyon sayısını verir.\r\nCOS\t\t\t\t= COS\t\t\t\t##\tBir sayının kosinüsünü verir.\r\nCOSH\t\t\t= COSH\t\t\t\t##\tBir sayının hiperbolik kosinüsünü verir.\r\nDEGREES\t\t\t= DERECE\t\t\t##\tRadyanları dereceye dönüştürür.\r\nEVEN\t\t\t= ÇİFT\t\t\t\t##\tBir sayıyı, en yakın daha büyük çift tamsayıya yuvarlar.\r\nEXP\t\t\t\t= ÜS\t\t\t\t##\te'yi, verilen bir sayının üssüne yükseltilmiş olarak verir.\r\nFACT\t\t\t= ÇARPINIM\t\t\t##\tBir sayının faktörünü verir.\r\nFACTDOUBLE\t\t= ÇİFTFAKTÖR\t\t##\tBir sayının çift çarpınımını verir.\r\nFLOOR\t\t\t= TABANAYUVARLA\t\t##\tBir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar.\r\nGCD\t\t\t\t= OBEB\t\t\t\t##\tEn büyük ortak böleni verir.\r\nINT\t\t\t\t= TAMSAYI\t\t\t##\tBir sayıyı aşağıya doğru en yakın tamsayıya yuvarlar.\r\nLCM\t\t\t\t= OKEK\t\t\t\t##\tEn küçük ortak katı verir.\r\nLN\t\t\t\t= LN\t\t\t\t##\tBir sayının doğal logaritmasını verir.\r\nLOG\t\t\t\t= LOG\t\t\t\t##\tBir sayının, belirtilen bir tabandaki logaritmasını verir.\r\nLOG10\t\t\t= LOG10\t\t\t\t##\tBir sayının 10 tabanında logaritmasını verir.\r\nMDETERM\t\t\t= DETERMİNANT\t\t##\tBir dizinin dizey determinantını verir.\r\nMINVERSE\t\t= DİZEY_TERS\t\t##\tBir dizinin dizey tersini verir.\r\nMMULT\t\t\t= DÇARP\t\t\t\t##\tİki dizinin dizey çarpımını verir.\r\nMOD\t\t\t\t= MODÜLO\t\t\t##\tBölmeden kalanı verir.\r\nMROUND\t\t\t= KYUVARLA\t\t\t##\tİstenen kata yuvarlanmış bir sayı verir.\r\nMULTINOMIAL\t\t= ÇOKTERİMLİ\t\t##\tBir sayılar kümesinin çok terimlisini verir.\r\nODD\t\t\t\t= TEK\t\t\t\t##\tBir sayıyı en yakın daha büyük tek sayıya yuvarlar.\r\nPI\t\t\t\t= Pİ\t\t\t\t##\tPi değerini verir.\r\nPOWER\t\t\t= KUVVET\t\t\t##\tBir üsse yükseltilmiş sayının sonucunu verir.\r\nPRODUCT\t\t\t= ÇARPIM\t\t\t##\tBağımsız değişkenlerini çarpar.\r\nQUOTIENT\t\t= BÖLÜM\t\t\t\t##\tBir bölme işleminin tamsayı kısmını verir.\r\nRADIANS\t\t\t= RADYAN\t\t\t##\tDereceleri radyanlara dönüştürür.\r\nRAND\t\t\t= S_SAYI_ÜRET\t\t##\t0 ile 1 arasında rastgele bir sayı verir.\r\nRANDBETWEEN\t\t= RASTGELEARALIK\t##\tBelirttiğiniz sayılar arasında rastgele bir sayı verir.\r\nROMAN\t\t\t= ROMEN\t\t\t\t##\tBir normal rakamı, metin olarak, romen rakamına çevirir.\r\nROUND\t\t\t= YUVARLA\t\t\t##\tBir sayıyı, belirtilen basamak sayısına yuvarlar.\r\nROUNDDOWN\t\t= AŞAĞIYUVARLA\t\t##\tBir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar.\r\nROUNDUP\t\t\t= YUKARIYUVARLA\t\t##\tBir sayıyı daha büyük sayıya, sıfırdan ıraksayarak yuvarlar.\r\nSERIESSUM\t\t= SERİTOPLA\t\t\t##\tBir üs serisinin toplamını, formüle bağlı olarak verir.\r\nSIGN\t\t\t= İŞARET\t\t\t##\tBir sayının işaretini verir.\r\nSIN\t\t\t\t= SİN\t\t\t\t##\tVerilen bir açının sinüsünü verir.\r\nSINH\t\t\t= SİNH\t\t\t\t##\tBir sayının hiperbolik sinüsünü verir.\r\nSQRT\t\t\t= KAREKÖK\t\t\t##\tPozitif bir karekök verir.\r\nSQRTPI\t\t\t= KAREKÖKPİ\t\t\t##\t(* Pi sayısının) kare kökünü verir.\r\nSUBTOTAL\t\t= ALTTOPLAM\t\t\t##\tBir listedeki ya da veritabanındaki bir alt toplamı verir.\r\nSUM\t\t\t\t= TOPLA\t\t\t\t##\tBağımsız değişkenlerini toplar.\r\nSUMIF\t\t\t= ETOPLA\t\t\t##\tVerilen ölçütle belirlenen hücreleri toplar.\r\nSUMIFS\t\t\t= SUMIFS\t\t\t##\tBir aralıktaki, birden fazla ölçüte uyan hücreleri ekler.\r\nSUMPRODUCT\t\t= TOPLA.ÇARPIM\t\t##\tİlişkili dizi bileşenlerinin çarpımlarının toplamını verir.\r\nSUMSQ\t\t\t= TOPKARE\t\t\t##\tBağımsız değişkenlerin karelerinin toplamını verir.\r\nSUMX2MY2\t\t= TOPX2EY2\t\t\t##\tİki dizideki ilişkili değerlerin farkının toplamını verir.\r\nSUMX2PY2\t\t= TOPX2AY2\t\t\t##\tİki dizideki ilişkili değerlerin karelerinin toplamının toplamını verir.\r\nSUMXMY2\t\t\t= TOPXEY2\t\t\t##\tİki dizideki ilişkili değerlerin farklarının karelerinin toplamını verir.\r\nTAN\t\t\t\t= TAN\t\t\t\t##\tBir sayının tanjantını verir.\r\nTANH\t\t\t= TANH\t\t\t\t##\tBir sayının hiperbolik tanjantını verir.\r\nTRUNC\t\t\t= NSAT\t\t\t\t##\tBir sayının, tamsayı durumuna gelecek şekilde, fazlalıklarını atar.\r\n\r\n\r\n##\r\n##\tStatistical functions\t\t\t\tİstatistiksel fonksiyonlar\r\n##\r\nAVEDEV\t\t\t= ORTSAP\t\t\t##\tVeri noktalarının ortalamalarından mutlak sapmalarının ortalamasını verir.\r\nAVERAGE\t\t\t= ORTALAMA\t\t\t##\tBağımsız değişkenlerinin ortalamasını verir.\r\nAVERAGEA\t\t= ORTALAMAA\t\t\t##\tBağımsız değişkenlerinin, sayılar, metin ve mantıksal değerleri içermek üzere ortalamasını verir.\r\nAVERAGEIF\t\t= EĞERORTALAMA \t\t##\tVerili ölçütü karşılayan bir aralıktaki bütün hücrelerin ortalamasını (aritmetik ortalama) hesaplar.\r\nAVERAGEIFS\t\t= EĞERLERORTALAMA \t##\tBirden çok ölçüte uyan tüm hücrelerin ortalamasını (aritmetik ortalama) hesaplar.\r\nBETADIST\t\t= BETADAĞ\t\t\t##\tBeta birikimli dağılım fonksiyonunu verir.\r\nBETAINV\t\t\t= BETATERS\t\t\t##\tBelirli bir beta dağılımı için birikimli dağılım fonksiyonunun tersini verir.\r\nBINOMDIST\t\t= BİNOMDAĞ\t\t\t##\tTek terimli binom dağılımı olasılığını verir.\r\nCHIDIST\t\t\t= KİKAREDAĞ\t\t\t##\tKikare dağılımın tek kuyruklu olasılığını verir.\r\nCHIINV\t\t\t= KİKARETERS\t\t##\tKikare dağılımın kuyruklu olasılığının tersini verir.\r\nCHITEST\t\t\t= KİKARETEST\t\t##\tBağımsızlık sınamalarını verir.\r\nCONFIDENCE\t\t= GÜVENİRLİK\t\t##\tBir popülasyon ortalaması için güvenirlik aralığını verir.\r\nCORREL\t\t\t= KORELASYON\t\t##\tİki veri kümesi arasındaki bağlantı katsayısını verir.\r\nCOUNT\t\t\t= BAĞ_DEĞ_SAY\t\t##\tBağımsız değişkenler listesinde kaç tane sayı bulunduğunu sayar.\r\nCOUNTA\t\t\t= BAĞ_DEĞ_DOLU_SAY\t##\tBağımsız değişkenler listesinde kaç tane değer bulunduğunu sayar.\r\nCOUNTBLANK\t\t= BOŞLUKSAY \t\t##\tAralıktaki boş hücre sayısını hesaplar.\r\nCOUNTIF\t\t\t= EĞERSAY \t\t\t##\tVerilen ölçütlere uyan bir aralık içindeki hücreleri sayar.\r\nCOUNTIFS\t\t= ÇOKEĞERSAY \t\t##\tBirden çok ölçüte uyan bir aralık içindeki hücreleri sayar.\r\nCOVAR\t\t\t= KOVARYANS \t\t##\tEşleştirilmiş sapmaların ortalaması olan kovaryansı verir.\r\nCRITBINOM\t\t= KRİTİKBİNOM\t\t##\tBirikimli binom dağılımının bir ölçüt değerinden küçük veya ölçüt değerine eşit olduğu en küçük değeri verir.\r\nDEVSQ\t\t\t= SAPKARE\t\t\t##\tSapmaların karelerinin toplamını verir.\r\nEXPONDIST\t\t= ÜSTELDAĞ\t\t\t##\tÜstel dağılımı verir.\r\nFDIST\t\t\t= FDAĞ\t\t\t\t##\tF olasılık dağılımını verir.\r\nFINV\t\t\t= FTERS\t\t\t\t##\tF olasılık dağılımının tersini verir.\r\nFISHER\t\t\t= FISHER\t\t\t##\tFisher dönüşümünü verir.\r\nFISHERINV\t\t= FISHERTERS\t\t##\tFisher dönüşümünün tersini verir.\r\nFORECAST\t\t= TAHMİN\t\t\t##\tBir doğrusal eğilim boyunca bir değer verir.\r\nFREQUENCY\t\t= SIKLIK\t\t\t##\tBir sıklık dağılımını, dikey bir dizi olarak verir.\r\nFTEST\t\t\t= FTEST\t\t\t\t##\tBir F-test'in sonucunu verir.\r\nGAMMADIST\t\t= GAMADAĞ\t\t\t##\tGama dağılımını verir.\r\nGAMMAINV\t\t= GAMATERS\t\t\t##\tGama kümülatif dağılımının tersini verir.\r\nGAMMALN\t\t\t= GAMALN\t\t\t##\tGama fonksiyonunun (?(x)) doğal logaritmasını verir.\r\nGEOMEAN\t\t\t= GEOORT\t\t\t##\tGeometrik ortayı verir.\r\nGROWTH\t\t\t= BÜYÜME\t\t\t##\tÜstel bir eğilim boyunca değerler verir.\r\nHARMEAN\t\t\t= HARORT\t\t\t##\tHarmonik ortayı verir.\r\nHYPGEOMDIST\t\t= HİPERGEOMDAĞ\t\t##\tHipergeometrik dağılımı verir.\r\nINTERCEPT\t\t= KESMENOKTASI\t\t##\tDoğrusal çakıştırma çizgisinin kesişme noktasını verir.\r\nKURT\t\t\t= BASIKLIK\t\t\t##\tBir veri kümesinin basıklığını verir.\r\nLARGE\t\t\t= BÜYÜK\t\t\t\t##\tBir veri kümesinde k. en büyük değeri verir.\r\nLINEST\t\t\t= DOT\t\t\t\t##\tDoğrusal bir eğilimin parametrelerini verir.\r\nLOGEST\t\t\t= LOT\t\t\t\t##\tÜstel bir eğilimin parametrelerini verir.\r\nLOGINV\t\t\t= LOGTERS\t\t\t##\tBir lognormal dağılımının tersini verir.\r\nLOGNORMDIST\t\t= LOGNORMDAĞ\t\t##\tBirikimli lognormal dağılımını verir.\r\nMAX\t\t\t\t= MAK\t\t\t\t##\tBir bağımsız değişkenler listesindeki en büyük değeri verir.\r\nMAXA\t\t\t= MAKA\t\t\t\t##\tBir bağımsız değişkenler listesindeki, sayılar, metin ve mantıksal değerleri içermek üzere, en büyük değeri verir.\r\nMEDIAN\t\t\t= ORTANCA\t\t\t##\tBelirtilen sayıların orta değerini verir.\r\nMIN\t\t\t\t= MİN\t\t\t\t##\tBir bağımsız değişkenler listesindeki en küçük değeri verir.\r\nMINA\t\t\t= MİNA\t\t\t\t##\tBir bağımsız değişkenler listesindeki, sayılar, metin ve mantıksal değerleri de içermek üzere, en küçük değeri verir.\r\nMODE\t\t\t= ENÇOK_OLAN\t\t##\tBir veri kümesindeki en sık rastlanan değeri verir.\r\nNEGBINOMDIST\t= NEGBİNOMDAĞ\t\t##\tNegatif binom dağılımını verir.\r\nNORMDIST\t\t= NORMDAĞ\t\t\t##\tNormal birikimli dağılımı verir.\r\nNORMINV\t\t\t= NORMTERS\t\t\t##\tNormal kümülatif dağılımın tersini verir.\r\nNORMSDIST\t\t= NORMSDAĞ\t\t\t##\tStandart normal birikimli dağılımı verir.\r\nNORMSINV\t\t= NORMSTERS\t\t\t##\tStandart normal birikimli dağılımın tersini verir.\r\nPEARSON\t\t\t= PEARSON\t\t\t##\tPearson çarpım moment korelasyon katsayısını verir.\r\nPERCENTILE\t\t= YÜZDEBİRLİK\t\t##\tBir aralık içerisinde bulunan değerlerin k. frekans toplamını verir.\r\nPERCENTRANK\t\t= YÜZDERANK\t\t\t##\tBir veri kümesindeki bir değerin yüzde mertebesini verir.\r\nPERMUT\t\t\t= PERMÜTASYON\t\t##\tVerilen sayıda nesne için permütasyon sayısını verir.\r\nPOISSON\t\t\t= POISSON\t\t\t##\tPoisson dağılımını verir.\r\nPROB\t\t\t= OLASILIK\t\t\t##\tBir aralıktaki değerlerin iki sınır arasında olması olasılığını verir.\r\nQUARTILE\t\t= DÖRTTEBİRLİK\t\t##\tBir veri kümesinin dörtte birliğini verir.\r\nRANK\t\t\t= RANK\t\t\t\t##\tBir sayılar listesinde bir sayının mertebesini verir.\r\nRSQ\t\t\t\t= RKARE\t\t\t\t##\tPearson çarpım moment korelasyon katsayısının karesini verir.\r\nSKEW\t\t\t= ÇARPIKLIK\t\t\t##\tBir dağılımın çarpıklığını verir.\r\nSLOPE\t\t\t= EĞİM\t\t\t\t##\tDoğrusal çakışma çizgisinin eğimini verir.\r\nSMALL\t\t\t= KÜÇÜK\t\t\t\t##\tBir veri kümesinde k. en küçük değeri verir.\r\nSTANDARDIZE\t\t= STANDARTLAŞTIRMA\t##\tNormalleştirilmiş bir değer verir.\r\nSTDEV\t\t\t= STDSAPMA\t\t\t##\tBir örneğe dayanarak standart sapmayı tahmin eder.\r\nSTDEVA\t\t\t= STDSAPMAA\t\t\t##\tStandart sapmayı, sayılar, metin ve mantıksal değerleri içermek üzere, bir örneğe bağlı olarak tahmin eder.\r\nSTDEVP\t\t\t= STDSAPMAS\t\t\t##\tStandart sapmayı, tüm popülasyona bağlı olarak hesaplar.\r\nSTDEVPA\t\t\t= STDSAPMASA\t\t##\tStandart sapmayı, sayılar, metin ve mantıksal değerleri içermek üzere, tüm popülasyona bağlı olarak hesaplar.\r\nSTEYX\t\t\t= STHYX\t\t\t\t##\tRegresyondaki her x için tahmini y değerinin standart hatasını verir.\r\nTDIST\t\t\t= TDAĞ\t\t\t\t##\tT-dağılımını verir.\r\nTINV\t\t\t= TTERS\t\t\t\t##\tT-dağılımının tersini verir.\r\nTREND\t\t\t= EĞİLİM\t\t\t##\tDoğrusal bir eğilim boyunca değerler verir.\r\nTRIMMEAN\t\t= KIRPORTALAMA\t\t##\tBir veri kümesinin içinin ortalamasını verir.\r\nTTEST\t\t\t= TTEST\t\t\t\t##\tT-test'le ilişkilendirilmiş olasılığı verir.\r\nVAR\t\t\t\t= VAR\t\t\t\t##\tVaryansı, bir örneğe bağlı olarak tahmin eder.\r\nVARA\t\t\t= VARA\t\t\t\t##\tVaryansı, sayılar, metin ve mantıksal değerleri içermek üzere, bir örneğe bağlı olarak tahmin eder.\r\nVARP\t\t\t= VARS\t\t\t\t##\tVaryansı, tüm popülasyona dayanarak hesaplar.\r\nVARPA\t\t\t= VARSA\t\t\t\t##\tVaryansı, sayılar, metin ve mantıksal değerleri içermek üzere, tüm popülasyona bağlı olarak hesaplar.\r\nWEIBULL\t\t\t= WEIBULL\t\t\t##\tWeibull dağılımını hesaplar.\r\nZTEST\t\t\t= ZTEST\t\t\t\t##\tZ-testinin tek kuyruklu olasılık değerini hesaplar.\r\n\r\n\r\n##\r\n##\tText functions\t\t\t\t\tMetin fonksiyonları\r\n##\r\nASC\t\t\t\t= ASC \t\t\t\t##\tBir karakter dizesindeki çift enli (iki bayt) İngilizce harfleri veya katakanayı yarım enli (tek bayt) karakterlerle değiştirir.\r\nBAHTTEXT\t\t= BAHTTEXT \t\t\t##\tSayıyı, ß (baht) para birimi biçimini kullanarak metne dönüştürür.\r\nCHAR\t\t\t= DAMGA \t\t\t##\tKod sayısıyla belirtilen karakteri verir.\r\nCLEAN\t\t\t= TEMİZ\t\t\t\t##\tMetindeki bütün yazdırılamaz karakterleri kaldırır.\r\nCODE\t\t\t= KOD\t\t\t\t##\tBir metin dizesindeki ilk karakter için sayısal bir kod verir.\r\nCONCATENATE\t\t= BİRLEŞTİR\t\t\t##\tPek çok metin öğesini bir metin öğesi olarak birleştirir.\r\nDOLLAR\t\t\t= LİRA\t\t\t\t##\tBir sayıyı YTL (yeni Türk lirası) para birimi biçimini kullanarak metne dönüştürür.\r\nEXACT\t\t\t= ÖZDEŞ\t\t\t\t##\tİki metin değerinin özdeş olup olmadığını anlamak için, değerleri denetler.\r\nFIND\t\t\t= BUL\t\t\t\t##\tBir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlıdır).\r\nFINDB\t\t\t= BULB\t\t\t\t##\tBir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlıdır).\r\nFIXED\t\t\t= SAYIDÜZENLE\t\t##\tBir sayıyı, sabit sayıda ondalıkla, metin olarak biçimlendirir.\r\nJIS\t\t\t\t= JIS\t\t\t\t##\tBir karakter dizesindeki tek enli (tek bayt) İngilizce harfleri veya katakanayı çift enli (iki bayt) karakterlerle değiştirir.\r\nLEFT\t\t\t= SOL\t\t\t\t##\tBir metin değerinden en soldaki karakterleri verir.\r\nLEFTB\t\t\t= SOLB\t\t\t\t##\tBir metin değerinden en soldaki karakterleri verir.\r\nLEN\t\t\t\t= UZUNLUK\t\t\t##\tBir metin dizesindeki karakter sayısını verir.\r\nLENB\t\t\t= UZUNLUKB\t\t\t##\tBir metin dizesindeki karakter sayısını verir.\r\nLOWER\t\t\t= KÜÇÜKHARF\t\t\t##\tMetni küçük harfe çevirir.\r\nMID\t\t\t\t= ORTA\t\t\t\t##\tBir metin dizesinden belirli sayıda karakteri, belirttiğiniz konumdan başlamak üzere verir.\r\nMIDB\t\t\t= ORTAB\t\t\t\t##\tBir metin dizesinden belirli sayıda karakteri, belirttiğiniz konumdan başlamak üzere verir.\r\nPHONETIC\t\t= SES\t\t\t\t##\tMetin dizesinden ses (furigana) karakterlerini ayıklar.\r\nPROPER\t\t\t= YAZIM.DÜZENİ\t\t##\tBir metin değerinin her bir sözcüğünün ilk harfini büyük harfe çevirir.\r\nREPLACE\t\t\t= DEĞİŞTİR\t\t\t##\tMetnin içindeki karakterleri değiştirir.\r\nREPLACEB\t\t= DEĞİŞTİRB\t\t\t##\tMetnin içindeki karakterleri değiştirir.\r\nREPT\t\t\t= YİNELE\t\t\t##\tMetni belirtilen sayıda yineler.\r\nRIGHT\t\t\t= SAĞ\t\t\t\t##\tBir metin değerinden en sağdaki karakterleri verir.\r\nRIGHTB\t\t\t= SAĞB\t\t\t\t##\tBir metin değerinden en sağdaki karakterleri verir.\r\nSEARCH\t\t\t= BUL\t\t\t\t##\tBir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlı değildir).\r\nSEARCHB\t\t\t= BULB\t\t\t\t##\tBir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlı değildir).\r\nSUBSTITUTE\t\t= YERİNEKOY\t\t\t##\tBir metin dizesinde, eski metnin yerine yeni metin koyar.\r\nT\t\t\t\t= M\t\t\t\t\t##\tBağımsız değerlerini metne dönüştürür.\r\nTEXT\t\t\t= METNEÇEVİR\t\t##\tBir sayıyı biçimlendirir ve metne dönüştürür.\r\nTRIM\t\t\t= KIRP\t\t\t\t##\tMetindeki boşlukları kaldırır.\r\nUPPER\t\t\t= BÜYÜKHARF\t\t\t##\tMetni büyük harfe çevirir.\r\nVALUE\t\t\t= SAYIYAÇEVİR\t\t##\tBir metin bağımsız değişkenini sayıya dönüştürür.\r\n"
  },
  {
    "path": "application/libraries/PHPExcel/PHPExcel.php",
    "content": "<?php\n\n/** PHPExcel root directory */\nif (!defined('PHPEXCEL_ROOT')) {\n    define('PHPEXCEL_ROOT', dirname(__FILE__) . '/');\n    require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');\n}\n\n/**\n * PHPExcel\n *\n * Copyright (c) 2006 - 2015 PHPExcel\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * @category   PHPExcel\n * @package    PHPExcel\n * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)\n * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL\n * @version    ##VERSION##, ##DATE##\n */\nclass PHPExcel\n{\n    /**\n     * Unique ID\n     *\n     * @var string\n     */\n    private $uniqueID;\n\n    /**\n     * Document properties\n     *\n     * @var PHPExcel_DocumentProperties\n     */\n    private $properties;\n\n    /**\n     * Document security\n     *\n     * @var PHPExcel_DocumentSecurity\n     */\n    private $security;\n\n    /**\n     * Collection of Worksheet objects\n     *\n     * @var PHPExcel_Worksheet[]\n     */\n    private $workSheetCollection = array();\n\n    /**\n     * Calculation Engine\n     *\n     * @var PHPExcel_Calculation\n     */\n    private $calculationEngine;\n\n    /**\n     * Active sheet index\n     *\n     * @var integer\n     */\n    private $activeSheetIndex = 0;\n\n    /**\n     * Named ranges\n     *\n     * @var PHPExcel_NamedRange[]\n     */\n    private $namedRanges = array();\n\n    /**\n     * CellXf supervisor\n     *\n     * @var PHPExcel_Style\n     */\n    private $cellXfSupervisor;\n\n    /**\n     * CellXf collection\n     *\n     * @var PHPExcel_Style[]\n     */\n    private $cellXfCollection = array();\n\n    /**\n     * CellStyleXf collection\n     *\n     * @var PHPExcel_Style[]\n     */\n    private $cellStyleXfCollection = array();\n\n    /**\n    * hasMacros : this workbook have macros ?\n    *\n    * @var bool\n    */\n    private $hasMacros = false;\n\n    /**\n    * macrosCode : all macros code (the vbaProject.bin file, this include form, code,  etc.), null if no macro\n    *\n    * @var binary\n    */\n    private $macrosCode;\n    /**\n    * macrosCertificate : if macros are signed, contains vbaProjectSignature.bin file, null if not signed\n    *\n    * @var binary\n    */\n    private $macrosCertificate;\n\n    /**\n    * ribbonXMLData : null if workbook is'nt Excel 2007 or not contain a customized UI\n    *\n    * @var null|string\n    */\n    private $ribbonXMLData;\n\n    /**\n    * ribbonBinObjects : null if workbook is'nt Excel 2007 or not contain embedded objects (picture(s)) for Ribbon Elements\n    * ignored if $ribbonXMLData is null\n    *\n    * @var null|array\n    */\n    private $ribbonBinObjects;\n\n    /**\n    * The workbook has macros ?\n    *\n    * @return boolean true if workbook has macros, false if not\n    */\n    public function hasMacros()\n    {\n        return $this->hasMacros;\n    }\n\n    /**\n    * Define if a workbook has macros\n    *\n    * @param boolean $hasMacros true|false\n    */\n    public function setHasMacros($hasMacros = false)\n    {\n        $this->hasMacros = (bool) $hasMacros;\n    }\n\n    /**\n    * Set the macros code\n    *\n    * @param string $MacrosCode string|null\n    */\n    public function setMacrosCode($MacrosCode = null)\n    {\n        $this->macrosCode=$MacrosCode;\n        $this->setHasMacros(!is_null($MacrosCode));\n    }\n\n    /**\n    * Return the macros code\n    *\n    * @return string|null\n    */\n    public function getMacrosCode()\n    {\n        return $this->macrosCode;\n    }\n\n    /**\n    * Set the macros certificate\n    *\n    * @param string|null $Certificate\n    */\n    public function setMacrosCertificate($Certificate = null)\n    {\n        $this->macrosCertificate=$Certificate;\n    }\n\n    /**\n    * Is the project signed ?\n    *\n    * @return boolean true|false\n    */\n    public function hasMacrosCertificate()\n    {\n        return !is_null($this->macrosCertificate);\n    }\n\n    /**\n    * Return the macros certificate\n    *\n    * @return string|null\n    */\n    public function getMacrosCertificate()\n    {\n        return $this->macrosCertificate;\n    }\n\n    /**\n    * Remove all macros, certificate from spreadsheet\n    *\n    */\n    public function discardMacros()\n    {\n        $this->hasMacros=false;\n        $this->macrosCode=null;\n        $this->macrosCertificate=null;\n    }\n\n    /**\n    * set ribbon XML data\n    *\n    */\n    public function setRibbonXMLData($Target = null, $XMLData = null)\n    {\n        if (!is_null($Target) && !is_null($XMLData)) {\n            $this->ribbonXMLData = array('target' => $Target, 'data' => $XMLData);\n        } else {\n            $this->ribbonXMLData = null;\n        }\n    }\n\n    /**\n    * retrieve ribbon XML Data\n    *\n    * return string|null|array\n    */\n    public function getRibbonXMLData($What = 'all') //we need some constants here...\n    {\n        $ReturnData = null;\n        $What = strtolower($What);\n        switch ($What){\n            case 'all':\n                $ReturnData = $this->ribbonXMLData;\n                break;\n            case 'target':\n            case 'data':\n                if (is_array($this->ribbonXMLData) && array_key_exists($What, $this->ribbonXMLData)) {\n                    $ReturnData = $this->ribbonXMLData[$What];\n                }\n                break;\n        }\n\n        return $ReturnData;\n    }\n\n    /**\n    * store binaries ribbon objects (pictures)\n    *\n    */\n    public function setRibbonBinObjects($BinObjectsNames = null, $BinObjectsData = null)\n    {\n        if (!is_null($BinObjectsNames) && !is_null($BinObjectsData)) {\n            $this->ribbonBinObjects = array('names' => $BinObjectsNames, 'data' => $BinObjectsData);\n        } else {\n            $this->ribbonBinObjects = null;\n        }\n    }\n    /**\n    * return the extension of a filename. Internal use for a array_map callback (php<5.3 don't like lambda function)\n    *\n    */\n    private function getExtensionOnly($ThePath)\n    {\n        return pathinfo($ThePath, PATHINFO_EXTENSION);\n    }\n\n    /**\n    * retrieve Binaries Ribbon Objects\n    *\n    */\n    public function getRibbonBinObjects($What = 'all')\n    {\n        $ReturnData = null;\n        $What = strtolower($What);\n        switch($What) {\n            case 'all':\n                return $this->ribbonBinObjects;\n                break;\n            case 'names':\n            case 'data':\n                if (is_array($this->ribbonBinObjects) && array_key_exists($What, $this->ribbonBinObjects)) {\n                    $ReturnData=$this->ribbonBinObjects[$What];\n                }\n                break;\n            case 'types':\n                if (is_array($this->ribbonBinObjects) &&\n                    array_key_exists('data', $this->ribbonBinObjects) && is_array($this->ribbonBinObjects['data'])) {\n                    $tmpTypes=array_keys($this->ribbonBinObjects['data']);\n                    $ReturnData = array_unique(array_map(array($this, 'getExtensionOnly'), $tmpTypes));\n                } else {\n                    $ReturnData=array(); // the caller want an array... not null if empty\n                }\n                break;\n        }\n        return $ReturnData;\n    }\n\n    /**\n    * This workbook have a custom UI ?\n    *\n    * @return boolean true|false\n    */\n    public function hasRibbon()\n    {\n        return !is_null($this->ribbonXMLData);\n    }\n\n    /**\n    * This workbook have additionnal object for the ribbon ?\n    *\n    * @return boolean true|false\n    */\n    public function hasRibbonBinObjects()\n    {\n        return !is_null($this->ribbonBinObjects);\n    }\n\n    /**\n     * Check if a sheet with a specified code name already exists\n     *\n     * @param string $pSheetCodeName  Name of the worksheet to check\n     * @return boolean\n     */\n    public function sheetCodeNameExists($pSheetCodeName)\n    {\n        return ($this->getSheetByCodeName($pSheetCodeName) !== null);\n    }\n\n    /**\n     * Get sheet by code name. Warning : sheet don't have always a code name !\n     *\n     * @param string $pName Sheet name\n     * @return PHPExcel_Worksheet\n     */\n    public function getSheetByCodeName($pName = '')\n    {\n        $worksheetCount = count($this->workSheetCollection);\n        for ($i = 0; $i < $worksheetCount; ++$i) {\n            if ($this->workSheetCollection[$i]->getCodeName() == $pName) {\n                return $this->workSheetCollection[$i];\n            }\n        }\n\n        return null;\n    }\n\n     /**\n     * Create a new PHPExcel with one Worksheet\n     */\n    public function __construct()\n    {\n        $this->uniqueID = uniqid();\n        $this->calculationEngine = new PHPExcel_Calculation($this);\n\n        // Initialise worksheet collection and add one worksheet\n        $this->workSheetCollection = array();\n        $this->workSheetCollection[] = new PHPExcel_Worksheet($this);\n        $this->activeSheetIndex = 0;\n\n        // Create document properties\n        $this->properties = new PHPExcel_DocumentProperties();\n\n        // Create document security\n        $this->security = new PHPExcel_DocumentSecurity();\n\n        // Set named ranges\n        $this->namedRanges = array();\n\n        // Create the cellXf supervisor\n        $this->cellXfSupervisor = new PHPExcel_Style(true);\n        $this->cellXfSupervisor->bindParent($this);\n\n        // Create the default style\n        $this->addCellXf(new PHPExcel_Style);\n        $this->addCellStyleXf(new PHPExcel_Style);\n    }\n\n    /**\n     * Code to execute when this worksheet is unset()\n     *\n     */\n    public function __destruct()\n    {\n        $this->calculationEngine = null;\n        $this->disconnectWorksheets();\n    }\n\n    /**\n     * Disconnect all worksheets from this PHPExcel workbook object,\n     *    typically so that the PHPExcel object can be unset\n     *\n     */\n    public function disconnectWorksheets()\n    {\n        $worksheet = null;\n        foreach ($this->workSheetCollection as $k => &$worksheet) {\n            $worksheet->disconnectCells();\n            $this->workSheetCollection[$k] = null;\n        }\n        unset($worksheet);\n        $this->workSheetCollection = array();\n    }\n\n    /**\n     * Return the calculation engine for this worksheet\n     *\n     * @return PHPExcel_Calculation\n     */\n    public function getCalculationEngine()\n    {\n        return $this->calculationEngine;\n    }    //    function getCellCacheController()\n\n    /**\n     * Get properties\n     *\n     * @return PHPExcel_DocumentProperties\n     */\n    public function getProperties()\n    {\n        return $this->properties;\n    }\n\n    /**\n     * Set properties\n     *\n     * @param PHPExcel_DocumentProperties    $pValue\n     */\n    public function setProperties(PHPExcel_DocumentProperties $pValue)\n    {\n        $this->properties = $pValue;\n    }\n\n    /**\n     * Get security\n     *\n     * @return PHPExcel_DocumentSecurity\n     */\n    public function getSecurity()\n    {\n        return $this->security;\n    }\n\n    /**\n     * Set security\n     *\n     * @param PHPExcel_DocumentSecurity    $pValue\n     */\n    public function setSecurity(PHPExcel_DocumentSecurity $pValue)\n    {\n        $this->security = $pValue;\n    }\n\n    /**\n     * Get active sheet\n     *\n     * @return PHPExcel_Worksheet\n     *\n     * @throws PHPExcel_Exception\n     */\n    public function getActiveSheet()\n    {\n        return $this->getSheet($this->activeSheetIndex);\n    }\n\n    /**\n     * Create sheet and add it to this workbook\n     *\n     * @param  int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last)\n     * @return PHPExcel_Worksheet\n     * @throws PHPExcel_Exception\n     */\n    public function createSheet($iSheetIndex = null)\n    {\n        $newSheet = new PHPExcel_Worksheet($this);\n        $this->addSheet($newSheet, $iSheetIndex);\n        return $newSheet;\n    }\n\n    /**\n     * Check if a sheet with a specified name already exists\n     *\n     * @param  string $pSheetName  Name of the worksheet to check\n     * @return boolean\n     */\n    public function sheetNameExists($pSheetName)\n    {\n        return ($this->getSheetByName($pSheetName) !== null);\n    }\n\n    /**\n     * Add sheet\n     *\n     * @param  PHPExcel_Worksheet $pSheet\n     * @param  int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last)\n     * @return PHPExcel_Worksheet\n     * @throws PHPExcel_Exception\n     */\n    public function addSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null)\n    {\n        if ($this->sheetNameExists($pSheet->getTitle())) {\n            throw new PHPExcel_Exception(\n                \"Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename this worksheet first.\"\n            );\n        }\n\n        if ($iSheetIndex === null) {\n            if ($this->activeSheetIndex < 0) {\n                $this->activeSheetIndex = 0;\n            }\n            $this->workSheetCollection[] = $pSheet;\n        } else {\n            // Insert the sheet at the requested index\n            array_splice(\n                $this->workSheetCollection,\n                $iSheetIndex,\n                0,\n                array($pSheet)\n            );\n\n            // Adjust active sheet index if necessary\n            if ($this->activeSheetIndex >= $iSheetIndex) {\n                ++$this->activeSheetIndex;\n            }\n        }\n\n        if ($pSheet->getParent() === null) {\n            $pSheet->rebindParent($this);\n        }\n\n        return $pSheet;\n    }\n\n    /**\n     * Remove sheet by index\n     *\n     * @param  int $pIndex Active sheet index\n     * @throws PHPExcel_Exception\n     */\n    public function removeSheetByIndex($pIndex = 0)\n    {\n\n        $numSheets = count($this->workSheetCollection);\n        if ($pIndex > $numSheets - 1) {\n            throw new PHPExcel_Exception(\n                \"You tried to remove a sheet by the out of bounds index: {$pIndex}. The actual number of sheets is {$numSheets}.\"\n            );\n        } else {\n            array_splice($this->workSheetCollection, $pIndex, 1);\n        }\n        // Adjust active sheet index if necessary\n        if (($this->activeSheetIndex >= $pIndex) &&\n            ($pIndex > count($this->workSheetCollection) - 1)) {\n            --$this->activeSheetIndex;\n        }\n\n    }\n\n    /**\n     * Get sheet by index\n     *\n     * @param  int $pIndex Sheet index\n     * @return PHPExcel_Worksheet\n     * @throws PHPExcel_Exception\n     */\n    public function getSheet($pIndex = 0)\n    {\n        if (!isset($this->workSheetCollection[$pIndex])) {\n            $numSheets = $this->getSheetCount();\n            throw new PHPExcel_Exception(\n                \"Your requested sheet index: {$pIndex} is out of bounds. The actual number of sheets is {$numSheets}.\"\n            );\n        }\n\n        return $this->workSheetCollection[$pIndex];\n    }\n\n    /**\n     * Get all sheets\n     *\n     * @return PHPExcel_Worksheet[]\n     */\n    public function getAllSheets()\n    {\n        return $this->workSheetCollection;\n    }\n\n    /**\n     * Get sheet by name\n     *\n     * @param  string $pName Sheet name\n     * @return PHPExcel_Worksheet\n     */\n    public function getSheetByName($pName = '')\n    {\n        $worksheetCount = count($this->workSheetCollection);\n        for ($i = 0; $i < $worksheetCount; ++$i) {\n            if ($this->workSheetCollection[$i]->getTitle() === $pName) {\n                return $this->workSheetCollection[$i];\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Get index for sheet\n     *\n     * @param  PHPExcel_Worksheet $pSheet\n     * @return int Sheet index\n     * @throws PHPExcel_Exception\n     */\n    public function getIndex(PHPExcel_Worksheet $pSheet)\n    {\n        foreach ($this->workSheetCollection as $key => $value) {\n            if ($value->getHashCode() == $pSheet->getHashCode()) {\n                return $key;\n            }\n        }\n\n        throw new PHPExcel_Exception(\"Sheet does not exist.\");\n    }\n\n    /**\n     * Set index for sheet by sheet name.\n     *\n     * @param  string $sheetName Sheet name to modify index for\n     * @param  int $newIndex New index for the sheet\n     * @return int New sheet index\n     * @throws PHPExcel_Exception\n     */\n    public function setIndexByName($sheetName, $newIndex)\n    {\n        $oldIndex = $this->getIndex($this->getSheetByName($sheetName));\n        $pSheet = array_splice(\n            $this->workSheetCollection,\n            $oldIndex,\n            1\n        );\n        array_splice(\n            $this->workSheetCollection,\n            $newIndex,\n            0,\n            $pSheet\n        );\n        return $newIndex;\n    }\n\n    /**\n     * Get sheet count\n     *\n     * @return int\n     */\n    public function getSheetCount()\n    {\n        return count($this->workSheetCollection);\n    }\n\n    /**\n     * Get active sheet index\n     *\n     * @return int Active sheet index\n     */\n    public function getActiveSheetIndex()\n    {\n        return $this->activeSheetIndex;\n    }\n\n    /**\n     * Set active sheet index\n     *\n     * @param  int $pIndex Active sheet index\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function setActiveSheetIndex($pIndex = 0)\n    {\n        $numSheets = count($this->workSheetCollection);\n\n        if ($pIndex > $numSheets - 1) {\n            throw new PHPExcel_Exception(\n                \"You tried to set a sheet active by the out of bounds index: {$pIndex}. The actual number of sheets is {$numSheets}.\"\n            );\n        } else {\n            $this->activeSheetIndex = $pIndex;\n        }\n        return $this->getActiveSheet();\n    }\n\n    /**\n     * Set active sheet index by name\n     *\n     * @param  string $pValue Sheet title\n     * @return PHPExcel_Worksheet\n     * @throws PHPExcel_Exception\n     */\n    public function setActiveSheetIndexByName($pValue = '')\n    {\n        if (($worksheet = $this->getSheetByName($pValue)) instanceof PHPExcel_Worksheet) {\n            $this->setActiveSheetIndex($this->getIndex($worksheet));\n            return $worksheet;\n        }\n\n        throw new PHPExcel_Exception('Workbook does not contain sheet:' . $pValue);\n    }\n\n    /**\n     * Get sheet names\n     *\n     * @return string[]\n     */\n    public function getSheetNames()\n    {\n        $returnValue = array();\n        $worksheetCount = $this->getSheetCount();\n        for ($i = 0; $i < $worksheetCount; ++$i) {\n            $returnValue[] = $this->getSheet($i)->getTitle();\n        }\n\n        return $returnValue;\n    }\n\n    /**\n     * Add external sheet\n     *\n     * @param  PHPExcel_Worksheet $pSheet External sheet to add\n     * @param  int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last)\n     * @throws PHPExcel_Exception\n     * @return PHPExcel_Worksheet\n     */\n    public function addExternalSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null)\n    {\n        if ($this->sheetNameExists($pSheet->getTitle())) {\n            throw new PHPExcel_Exception(\"Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename the external sheet first.\");\n        }\n\n        // count how many cellXfs there are in this workbook currently, we will need this below\n        $countCellXfs = count($this->cellXfCollection);\n\n        // copy all the shared cellXfs from the external workbook and append them to the current\n        foreach ($pSheet->getParent()->getCellXfCollection() as $cellXf) {\n            $this->addCellXf(clone $cellXf);\n        }\n\n        // move sheet to this workbook\n        $pSheet->rebindParent($this);\n\n        // update the cellXfs\n        foreach ($pSheet->getCellCollection(false) as $cellID) {\n            $cell = $pSheet->getCell($cellID);\n            $cell->setXfIndex($cell->getXfIndex() + $countCellXfs);\n        }\n\n        return $this->addSheet($pSheet, $iSheetIndex);\n    }\n\n    /**\n     * Get named ranges\n     *\n     * @return PHPExcel_NamedRange[]\n     */\n    public function getNamedRanges()\n    {\n        return $this->namedRanges;\n    }\n\n    /**\n     * Add named range\n     *\n     * @param  PHPExcel_NamedRange $namedRange\n     * @return boolean\n     */\n    public function addNamedRange(PHPExcel_NamedRange $namedRange)\n    {\n        if ($namedRange->getScope() == null) {\n            // global scope\n            $this->namedRanges[$namedRange->getName()] = $namedRange;\n        } else {\n            // local scope\n            $this->namedRanges[$namedRange->getScope()->getTitle().'!'.$namedRange->getName()] = $namedRange;\n        }\n        return true;\n    }\n\n    /**\n     * Get named range\n     *\n     * @param  string $namedRange\n     * @param  PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope\n     * @return PHPExcel_NamedRange|null\n     */\n    public function getNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null)\n    {\n        $returnValue = null;\n\n        if ($namedRange != '' && ($namedRange !== null)) {\n            // first look for global defined name\n            if (isset($this->namedRanges[$namedRange])) {\n                $returnValue = $this->namedRanges[$namedRange];\n            }\n\n            // then look for local defined name (has priority over global defined name if both names exist)\n            if (($pSheet !== null) && isset($this->namedRanges[$pSheet->getTitle() . '!' . $namedRange])) {\n                $returnValue = $this->namedRanges[$pSheet->getTitle() . '!' . $namedRange];\n            }\n        }\n\n        return $returnValue;\n    }\n\n    /**\n     * Remove named range\n     *\n     * @param  string  $namedRange\n     * @param  PHPExcel_Worksheet|null  $pSheet  Scope: use null for global scope.\n     * @return PHPExcel\n     */\n    public function removeNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null)\n    {\n        if ($pSheet === null) {\n            if (isset($this->namedRanges[$namedRange])) {\n                unset($this->namedRanges[$namedRange]);\n            }\n        } else {\n            if (isset($this->namedRanges[$pSheet->getTitle() . '!' . $namedRange])) {\n                unset($this->namedRanges[$pSheet->getTitle() . '!' . $namedRange]);\n            }\n        }\n        return $this;\n    }\n\n    /**\n     * Get worksheet iterator\n     *\n     * @return PHPExcel_WorksheetIterator\n     */\n    public function getWorksheetIterator()\n    {\n        return new PHPExcel_WorksheetIterator($this);\n    }\n\n    /**\n     * Copy workbook (!= clone!)\n     *\n     * @return PHPExcel\n     */\n    public function copy()\n    {\n        $copied = clone $this;\n\n        $worksheetCount = count($this->workSheetCollection);\n        for ($i = 0; $i < $worksheetCount; ++$i) {\n            $this->workSheetCollection[$i] = $this->workSheetCollection[$i]->copy();\n            $this->workSheetCollection[$i]->rebindParent($this);\n        }\n\n        return $copied;\n    }\n\n    /**\n     * Implement PHP __clone to create a deep clone, not just a shallow copy.\n     */\n    public function __clone()\n    {\n        foreach ($this as $key => $val) {\n            if (is_object($val) || (is_array($val))) {\n                $this->{$key} = unserialize(serialize($val));\n            }\n        }\n    }\n\n    /**\n     * Get the workbook collection of cellXfs\n     *\n     * @return PHPExcel_Style[]\n     */\n    public function getCellXfCollection()\n    {\n        return $this->cellXfCollection;\n    }\n\n    /**\n     * Get cellXf by index\n     *\n     * @param  int $pIndex\n     * @return PHPExcel_Style\n     */\n    public function getCellXfByIndex($pIndex = 0)\n    {\n        return $this->cellXfCollection[$pIndex];\n    }\n\n    /**\n     * Get cellXf by hash code\n     *\n     * @param  string $pValue\n     * @return PHPExcel_Style|boolean False if no match found\n     */\n    public function getCellXfByHashCode($pValue = '')\n    {\n        foreach ($this->cellXfCollection as $cellXf) {\n            if ($cellXf->getHashCode() == $pValue) {\n                return $cellXf;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if style exists in style collection\n     *\n     * @param  PHPExcel_Style $pCellStyle\n     * @return boolean\n     */\n    public function cellXfExists($pCellStyle = null)\n    {\n        return in_array($pCellStyle, $this->cellXfCollection, true);\n    }\n\n    /**\n     * Get default style\n     *\n     * @return PHPExcel_Style\n     * @throws PHPExcel_Exception\n     */\n    public function getDefaultStyle()\n    {\n        if (isset($this->cellXfCollection[0])) {\n            return $this->cellXfCollection[0];\n        }\n        throw new PHPExcel_Exception('No default style found for this workbook');\n    }\n\n    /**\n     * Add a cellXf to the workbook\n     *\n     * @param PHPExcel_Style $style\n     */\n    public function addCellXf(PHPExcel_Style $style)\n    {\n        $this->cellXfCollection[] = $style;\n        $style->setIndex(count($this->cellXfCollection) - 1);\n    }\n\n    /**\n     * Remove cellXf by index. It is ensured that all cells get their xf index updated.\n     *\n     * @param integer $pIndex Index to cellXf\n     * @throws PHPExcel_Exception\n     */\n    public function removeCellXfByIndex($pIndex = 0)\n    {\n        if ($pIndex > count($this->cellXfCollection) - 1) {\n            throw new PHPExcel_Exception(\"CellXf index is out of bounds.\");\n        } else {\n            // first remove the cellXf\n            array_splice($this->cellXfCollection, $pIndex, 1);\n\n            // then update cellXf indexes for cells\n            foreach ($this->workSheetCollection as $worksheet) {\n                foreach ($worksheet->getCellCollection(false) as $cellID) {\n                    $cell = $worksheet->getCell($cellID);\n                    $xfIndex = $cell->getXfIndex();\n                    if ($xfIndex > $pIndex) {\n                        // decrease xf index by 1\n                        $cell->setXfIndex($xfIndex - 1);\n                    } elseif ($xfIndex == $pIndex) {\n                        // set to default xf index 0\n                        $cell->setXfIndex(0);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Get the cellXf supervisor\n     *\n     * @return PHPExcel_Style\n     */\n    public function getCellXfSupervisor()\n    {\n        return $this->cellXfSupervisor;\n    }\n\n    /**\n     * Get the workbook collection of cellStyleXfs\n     *\n     * @return PHPExcel_Style[]\n     */\n    public function getCellStyleXfCollection()\n    {\n        return $this->cellStyleXfCollection;\n    }\n\n    /**\n     * Get cellStyleXf by index\n     *\n     * @param integer $pIndex Index to cellXf\n     * @return PHPExcel_Style\n     */\n    public function getCellStyleXfByIndex($pIndex = 0)\n    {\n        return $this->cellStyleXfCollection[$pIndex];\n    }\n\n    /**\n     * Get cellStyleXf by hash code\n     *\n     * @param  string $pValue\n     * @return PHPExcel_Style|boolean False if no match found\n     */\n    public function getCellStyleXfByHashCode($pValue = '')\n    {\n        foreach ($this->cellStyleXfCollection as $cellStyleXf) {\n            if ($cellStyleXf->getHashCode() == $pValue) {\n                return $cellStyleXf;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Add a cellStyleXf to the workbook\n     *\n     * @param PHPExcel_Style $pStyle\n     */\n    public function addCellStyleXf(PHPExcel_Style $pStyle)\n    {\n        $this->cellStyleXfCollection[] = $pStyle;\n        $pStyle->setIndex(count($this->cellStyleXfCollection) - 1);\n    }\n\n    /**\n     * Remove cellStyleXf by index\n     *\n     * @param integer $pIndex Index to cellXf\n     * @throws PHPExcel_Exception\n     */\n    public function removeCellStyleXfByIndex($pIndex = 0)\n    {\n        if ($pIndex > count($this->cellStyleXfCollection) - 1) {\n            throw new PHPExcel_Exception(\"CellStyleXf index is out of bounds.\");\n        } else {\n            array_splice($this->cellStyleXfCollection, $pIndex, 1);\n        }\n    }\n\n    /**\n     * Eliminate all unneeded cellXf and afterwards update the xfIndex for all cells\n     * and columns in the workbook\n     */\n    public function garbageCollect()\n    {\n        // how many references are there to each cellXf ?\n        $countReferencesCellXf = array();\n        foreach ($this->cellXfCollection as $index => $cellXf) {\n            $countReferencesCellXf[$index] = 0;\n        }\n\n        foreach ($this->getWorksheetIterator() as $sheet) {\n            // from cells\n            foreach ($sheet->getCellCollection(false) as $cellID) {\n                $cell = $sheet->getCell($cellID);\n                ++$countReferencesCellXf[$cell->getXfIndex()];\n            }\n\n            // from row dimensions\n            foreach ($sheet->getRowDimensions() as $rowDimension) {\n                if ($rowDimension->getXfIndex() !== null) {\n                    ++$countReferencesCellXf[$rowDimension->getXfIndex()];\n                }\n            }\n\n            // from column dimensions\n            foreach ($sheet->getColumnDimensions() as $columnDimension) {\n                ++$countReferencesCellXf[$columnDimension->getXfIndex()];\n            }\n        }\n\n        // remove cellXfs without references and create mapping so we can update xfIndex\n        // for all cells and columns\n        $countNeededCellXfs = 0;\n        $map = array();\n        foreach ($this->cellXfCollection as $index => $cellXf) {\n            if ($countReferencesCellXf[$index] > 0 || $index == 0) { // we must never remove the first cellXf\n                ++$countNeededCellXfs;\n            } else {\n                unset($this->cellXfCollection[$index]);\n            }\n            $map[$index] = $countNeededCellXfs - 1;\n        }\n        $this->cellXfCollection = array_values($this->cellXfCollection);\n\n        // update the index for all cellXfs\n        foreach ($this->cellXfCollection as $i => $cellXf) {\n            $cellXf->setIndex($i);\n        }\n\n        // make sure there is always at least one cellXf (there should be)\n        if (empty($this->cellXfCollection)) {\n            $this->cellXfCollection[] = new PHPExcel_Style();\n        }\n\n        // update the xfIndex for all cells, row dimensions, column dimensions\n        foreach ($this->getWorksheetIterator() as $sheet) {\n            // for all cells\n            foreach ($sheet->getCellCollection(false) as $cellID) {\n                $cell = $sheet->getCell($cellID);\n                $cell->setXfIndex($map[$cell->getXfIndex()]);\n            }\n\n            // for all row dimensions\n            foreach ($sheet->getRowDimensions() as $rowDimension) {\n                if ($rowDimension->getXfIndex() !== null) {\n                    $rowDimension->setXfIndex($map[$rowDimension->getXfIndex()]);\n                }\n            }\n\n            // for all column dimensions\n            foreach ($sheet->getColumnDimensions() as $columnDimension) {\n                $columnDimension->setXfIndex($map[$columnDimension->getXfIndex()]);\n            }\n\n            // also do garbage collection for all the sheets\n            $sheet->garbageCollect();\n        }\n    }\n\n    /**\n     * Return the unique ID value assigned to this spreadsheet workbook\n     *\n     * @return string\n     */\n    public function getID()\n    {\n        return $this->uniqueID;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/LICENSE",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "application/libraries/PHPMailer/PHPMailerAutoload.php",
    "content": "<?php\n/**\n * PHPMailer SPL autoloader.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer SPL autoloader.\n * @param string $classname The name of the class to load\n */\nfunction PHPMailerAutoload($classname)\n{\n    //Can't use __DIR__ as it's only in PHP 5.3+\n    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';\n    if (is_readable($filename)) {\n        require $filename;\n    }\n}\n\nif (version_compare(PHP_VERSION, '5.1.2', '>=')) {\n    //SPL autoloading was introduced in PHP 5.1.2\n    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {\n        spl_autoload_register('PHPMailerAutoload', true, true);\n    } else {\n        spl_autoload_register('PHPMailerAutoload');\n    }\n} else {\n    /**\n     * Fall back to traditional autoload for old PHP versions\n     * @param string $classname The name of the class to load\n     */\n    function __spl_autoload_register($classname)\n    {\n        PHPMailerAutoload($classname);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/VERSION",
    "content": "5.2.24\n"
  },
  {
    "path": "application/libraries/PHPMailer/class.phpmailer.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * @package PHPMailer\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n */\nclass PHPMailer\n{\n    /**\n     * The PHPMailer Version number.\n     * @var string\n     */\n    public $Version = '5.2.24';\n\n    /**\n     * Email priority.\n     * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n     * When null, the header is not set at all.\n     * @var integer\n     */\n    public $Priority = null;\n\n    /**\n     * The character set of the message.\n     * @var string\n     */\n    public $CharSet = 'iso-8859-1';\n\n    /**\n     * The MIME Content-type of the message.\n     * @var string\n     */\n    public $ContentType = 'text/plain';\n\n    /**\n     * The message encoding.\n     * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n     * @var string\n     */\n    public $Encoding = '8bit';\n\n    /**\n     * Holds the most recent mailer error message.\n     * @var string\n     */\n    public $ErrorInfo = '';\n\n    /**\n     * The From email address for the message.\n     * @var string\n     */\n    public $From = 'root@localhost';\n\n    /**\n     * The From name of the message.\n     * @var string\n     */\n    public $FromName = 'Root User';\n\n    /**\n     * The Sender email (Return-Path) of the message.\n     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n     * @var string\n     */\n    public $Sender = '';\n\n    /**\n     * The Return-Path of the message.\n     * If empty, it will be set to either From or Sender.\n     * @var string\n     * @deprecated Email senders should never set a return-path header;\n     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference\n     */\n    public $ReturnPath = '';\n\n    /**\n     * The Subject of the message.\n     * @var string\n     */\n    public $Subject = '';\n\n    /**\n     * An HTML or plain text message body.\n     * If HTML then call isHTML(true).\n     * @var string\n     */\n    public $Body = '';\n\n    /**\n     * The plain-text message body.\n     * This body can be read by mail clients that do not have HTML email\n     * capability such as mutt & Eudora.\n     * Clients that can read HTML will view the normal Body.\n     * @var string\n     */\n    public $AltBody = '';\n\n    /**\n     * An iCal message part body.\n     * Only supported in simple alt or alt_inline message types\n     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator\n     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/\n     * @link http://kigkonsult.se/iCalcreator/\n     * @var string\n     */\n    public $Ical = '';\n\n    /**\n     * The complete compiled MIME message body.\n     * @access protected\n     * @var string\n     */\n    protected $MIMEBody = '';\n\n    /**\n     * The complete compiled MIME message headers.\n     * @var string\n     * @access protected\n     */\n    protected $MIMEHeader = '';\n\n    /**\n     * Extra headers that createHeader() doesn't fold in.\n     * @var string\n     * @access protected\n     */\n    protected $mailHeader = '';\n\n    /**\n     * Word-wrap the message body to this number of chars.\n     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n     * @var integer\n     */\n    public $WordWrap = 0;\n\n    /**\n     * Which method to use to send mail.\n     * Options: \"mail\", \"sendmail\", or \"smtp\".\n     * @var string\n     */\n    public $Mailer = 'mail';\n\n    /**\n     * The path to the sendmail program.\n     * @var string\n     */\n    public $Sendmail = '/usr/sbin/sendmail';\n\n    /**\n     * Whether mail() uses a fully sendmail-compatible MTA.\n     * One which supports sendmail's \"-oi -f\" options.\n     * @var boolean\n     */\n    public $UseSendmailOptions = true;\n\n    /**\n     * Path to PHPMailer plugins.\n     * Useful if the SMTP class is not in the PHP include path.\n     * @var string\n     * @deprecated Should not be needed now there is an autoloader.\n     */\n    public $PluginDir = '';\n\n    /**\n     * The email address that a reading confirmation should be sent to, also known as read receipt.\n     * @var string\n     */\n    public $ConfirmReadingTo = '';\n\n    /**\n     * The hostname to use in the Message-ID header and as default HELO string.\n     * If empty, PHPMailer attempts to find one with, in order,\n     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n     * 'localhost.localdomain'.\n     * @var string\n     */\n    public $Hostname = '';\n\n    /**\n     * An ID to be used in the Message-ID header.\n     * If empty, a unique id will be generated.\n     * You can set your own, but it must be in the format \"<id@domain>\",\n     * as defined in RFC5322 section 3.6.4 or it will be ignored.\n     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4\n     * @var string\n     */\n    public $MessageID = '';\n\n    /**\n     * The message Date to be used in the Date header.\n     * If empty, the current date will be added.\n     * @var string\n     */\n    public $MessageDate = '';\n\n    /**\n     * SMTP hosts.\n     * Either a single hostname or multiple semicolon-delimited hostnames.\n     * You can also specify a different port\n     * for each host by using this format: [hostname:port]\n     * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n     * You can also specify encryption type, for example:\n     * (e.g. \"tls://smtp1.example.com:587;ssl://smtp2.example.com:465\").\n     * Hosts will be tried in order.\n     * @var string\n     */\n    public $Host = 'localhost';\n\n    /**\n     * The default SMTP server port.\n     * @var integer\n     * @TODO Why is this needed when the SMTP class takes care of it?\n     */\n    public $Port = 25;\n\n    /**\n     * The SMTP HELO of the message.\n     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n     * one with the same method described above for $Hostname.\n     * @var string\n     * @see PHPMailer::$Hostname\n     */\n    public $Helo = '';\n\n    /**\n     * What kind of encryption to use on the SMTP connection.\n     * Options: '', 'ssl' or 'tls'\n     * @var string\n     */\n    public $SMTPSecure = '';\n\n    /**\n     * Whether to enable TLS encryption automatically if a server supports it,\n     * even if `SMTPSecure` is not set to 'tls'.\n     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n     * @var boolean\n     */\n    public $SMTPAutoTLS = true;\n\n    /**\n     * Whether to use SMTP authentication.\n     * Uses the Username and Password properties.\n     * @var boolean\n     * @see PHPMailer::$Username\n     * @see PHPMailer::$Password\n     */\n    public $SMTPAuth = false;\n\n    /**\n     * Options array passed to stream_context_create when connecting via SMTP.\n     * @var array\n     */\n    public $SMTPOptions = array();\n\n    /**\n     * SMTP username.\n     * @var string\n     */\n    public $Username = '';\n\n    /**\n     * SMTP password.\n     * @var string\n     */\n    public $Password = '';\n\n    /**\n     * SMTP auth type.\n     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n     * @var string\n     */\n    public $AuthType = '';\n\n    /**\n     * SMTP realm.\n     * Used for NTLM auth\n     * @var string\n     */\n    public $Realm = '';\n\n    /**\n     * SMTP workstation.\n     * Used for NTLM auth\n     * @var string\n     */\n    public $Workstation = '';\n\n    /**\n     * The SMTP server timeout in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * @var integer\n     */\n    public $Timeout = 300;\n\n    /**\n     * SMTP class debug output mode.\n     * Debug output level.\n     * Options:\n     * * `0` No output\n     * * `1` Commands\n     * * `2` Data and commands\n     * * `3` As 2 plus connection status\n     * * `4` Low-level data output\n     * @var integer\n     * @see SMTP::$do_debug\n     */\n    public $SMTPDebug = 0;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     *\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     * <code>\n     * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * </code>\n     * @var string|callable\n     * @see SMTP::$Debugoutput\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to keep SMTP connection open after each message.\n     * If this is set to true then to close the connection\n     * requires an explicit call to smtpClose().\n     * @var boolean\n     */\n    public $SMTPKeepAlive = false;\n\n    /**\n     * Whether to split multiple to addresses into multiple messages\n     * or send them all in one message.\n     * Only supported in `mail` and `sendmail` transports, not in SMTP.\n     * @var boolean\n     */\n    public $SingleTo = false;\n\n    /**\n     * Storage for addresses when SingleTo is enabled.\n     * @var array\n     * @TODO This should really not be public\n     */\n    public $SingleToArray = array();\n\n    /**\n     * Whether to generate VERP addresses on send.\n     * Only applicable when sending via SMTP.\n     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @link http://www.postfix.org/VERP_README.html Postfix VERP info\n     * @var boolean\n     */\n    public $do_verp = false;\n\n    /**\n     * Whether to allow sending messages with an empty body.\n     * @var boolean\n     */\n    public $AllowEmpty = false;\n\n    /**\n     * The default line ending.\n     * @note The default remains \"\\n\". We force CRLF where we know\n     *        it must be used via self::CRLF.\n     * @var string\n     */\n    public $LE = \"\\n\";\n\n    /**\n     * DKIM selector.\n     * @var string\n     */\n    public $DKIM_selector = '';\n\n    /**\n     * DKIM Identity.\n     * Usually the email address used as the source of the email.\n     * @var string\n     */\n    public $DKIM_identity = '';\n\n    /**\n     * DKIM passphrase.\n     * Used if your key is encrypted.\n     * @var string\n     */\n    public $DKIM_passphrase = '';\n\n    /**\n     * DKIM signing domain name.\n     * @example 'example.com'\n     * @var string\n     */\n    public $DKIM_domain = '';\n\n    /**\n     * DKIM private key file path.\n     * @var string\n     */\n    public $DKIM_private = '';\n\n    /**\n     * DKIM private key string.\n     * If set, takes precedence over `$DKIM_private`.\n     * @var string\n     */\n    public $DKIM_private_string = '';\n\n    /**\n     * Callback Action function name.\n     *\n     * The function that handles the result of the send email action.\n     * It is called out by send() for each email sent.\n     *\n     * Value can be any php callable: http://www.php.net/is_callable\n     *\n     * Parameters:\n     *   boolean $result        result of the send action\n     *   array   $to            email addresses of the recipients\n     *   array   $cc            cc email addresses\n     *   array   $bcc           bcc email addresses\n     *   string  $subject       the subject\n     *   string  $body          the email body\n     *   string  $from          email address of sender\n     * @var string\n     */\n    public $action_function = '';\n\n    /**\n     * What to put in the X-Mailer header.\n     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n     * @var string\n     */\n    public $XMailer = '';\n\n    /**\n     * Which validator to use by default when validating email addresses.\n     * May be a callable to inject your own validator, but there are several built-in validators.\n     * @see PHPMailer::validateAddress()\n     * @var string|callable\n     * @static\n     */\n    public static $validator = 'auto';\n\n    /**\n     * An instance of the SMTP sender class.\n     * @var SMTP\n     * @access protected\n     */\n    protected $smtp = null;\n\n    /**\n     * The array of 'to' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $to = array();\n\n    /**\n     * The array of 'cc' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $cc = array();\n\n    /**\n     * The array of 'bcc' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $bcc = array();\n\n    /**\n     * The array of reply-to names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $ReplyTo = array();\n\n    /**\n     * An array of all kinds of addresses.\n     * Includes all of $to, $cc, $bcc\n     * @var array\n     * @access protected\n     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n     */\n    protected $all_recipients = array();\n\n    /**\n     * An array of names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $all_recipients\n     * and one of $to, $cc, or $bcc.\n     * This array is used only for addresses with IDN.\n     * @var array\n     * @access protected\n     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n     * @see PHPMailer::$all_recipients\n     */\n    protected $RecipientsQueue = array();\n\n    /**\n     * An array of reply-to names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $ReplyTo.\n     * This array is used only for addresses with IDN.\n     * @var array\n     * @access protected\n     * @see PHPMailer::$ReplyTo\n     */\n    protected $ReplyToQueue = array();\n\n    /**\n     * The array of attachments.\n     * @var array\n     * @access protected\n     */\n    protected $attachment = array();\n\n    /**\n     * The array of custom headers.\n     * @var array\n     * @access protected\n     */\n    protected $CustomHeader = array();\n\n    /**\n     * The most recent Message-ID (including angular brackets).\n     * @var string\n     * @access protected\n     */\n    protected $lastMessageID = '';\n\n    /**\n     * The message's MIME type.\n     * @var string\n     * @access protected\n     */\n    protected $message_type = '';\n\n    /**\n     * The array of MIME boundary strings.\n     * @var array\n     * @access protected\n     */\n    protected $boundary = array();\n\n    /**\n     * The array of available languages.\n     * @var array\n     * @access protected\n     */\n    protected $language = array();\n\n    /**\n     * The number of errors encountered.\n     * @var integer\n     * @access protected\n     */\n    protected $error_count = 0;\n\n    /**\n     * The S/MIME certificate file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_cert_file = '';\n\n    /**\n     * The S/MIME key file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_key_file = '';\n\n    /**\n     * The optional S/MIME extra certificates (\"CA Chain\") file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_extracerts_file = '';\n\n    /**\n     * The S/MIME password for the key.\n     * Used only if the key is encrypted.\n     * @var string\n     * @access protected\n     */\n    protected $sign_key_pass = '';\n\n    /**\n     * Whether to throw exceptions for errors.\n     * @var boolean\n     * @access protected\n     */\n    protected $exceptions = false;\n\n    /**\n     * Unique ID used for message ID and boundaries.\n     * @var string\n     * @access protected\n     */\n    protected $uniqueid = '';\n\n    /**\n     * Error severity: message only, continue processing.\n     */\n    const STOP_MESSAGE = 0;\n\n    /**\n     * Error severity: message, likely ok to continue processing.\n     */\n    const STOP_CONTINUE = 1;\n\n    /**\n     * Error severity: message, plus full stop, critical error reached.\n     */\n    const STOP_CRITICAL = 2;\n\n    /**\n     * SMTP RFC standard line ending.\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1\n     * @var integer\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * Constructor.\n     * @param boolean $exceptions Should we throw external exceptions?\n     */\n    public function __construct($exceptions = null)\n    {\n        if ($exceptions !== null) {\n            $this->exceptions = (boolean)$exceptions;\n        }\n    }\n\n    /**\n     * Destructor.\n     */\n    public function __destruct()\n    {\n        //Close any open SMTP connection nicely\n        $this->smtpClose();\n    }\n\n    /**\n     * Call mail() in a safe_mode-aware fashion.\n     * Also, unless sendmail_path points to sendmail (or something that\n     * claims to be sendmail), don't pass params (not a perfect fix,\n     * but it will do)\n     * @param string $to To\n     * @param string $subject Subject\n     * @param string $body Message Body\n     * @param string $header Additional Header(s)\n     * @param string $params Params\n     * @access private\n     * @return boolean\n     */\n    private function mailPassthru($to, $subject, $body, $header, $params)\n    {\n        //Check overloading of mail function to avoid double-encoding\n        if (ini_get('mbstring.func_overload') & 1) {\n            $subject = $this->secureHeader($subject);\n        } else {\n            $subject = $this->encodeHeader($this->secureHeader($subject));\n        }\n\n        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n        //@link http://php.net/manual/en/function.mail.php\n        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n            $result = @mail($to, $subject, $body, $header);\n        } else {\n            $result = @mail($to, $subject, $body, $header, $params);\n        }\n        return $result;\n    }\n    /**\n     * Output debugging info via user-defined method.\n     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n     * @see PHPMailer::$Debugoutput\n     * @see PHPMailer::$SMTPDebug\n     * @param string $str\n     */\n    protected function edebug($str)\n    {\n        if ($this->SMTPDebug <= 0) {\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                )\n                . \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/\\r\\n?/ms', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n                    \"\\n\",\n                    \"\\n                   \\t                  \",\n                    trim($str)\n                ) . \"\\n\";\n        }\n    }\n\n    /**\n     * Sets message type to HTML or plain.\n     * @param boolean $isHtml True for HTML mode.\n     * @return void\n     */\n    public function isHTML($isHtml = true)\n    {\n        if ($isHtml) {\n            $this->ContentType = 'text/html';\n        } else {\n            $this->ContentType = 'text/plain';\n        }\n    }\n\n    /**\n     * Send messages using SMTP.\n     * @return void\n     */\n    public function isSMTP()\n    {\n        $this->Mailer = 'smtp';\n    }\n\n    /**\n     * Send messages using PHP's mail() function.\n     * @return void\n     */\n    public function isMail()\n    {\n        $this->Mailer = 'mail';\n    }\n\n    /**\n     * Send messages using $Sendmail.\n     * @return void\n     */\n    public function isSendmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (!stristr($ini_sendmail_path, 'sendmail')) {\n            $this->Sendmail = '/usr/sbin/sendmail';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'sendmail';\n    }\n\n    /**\n     * Send messages using qmail.\n     * @return void\n     */\n    public function isQmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (!stristr($ini_sendmail_path, 'qmail')) {\n            $this->Sendmail = '/var/qmail/bin/qmail-inject';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'qmail';\n    }\n\n    /**\n     * Add a \"To\" address.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addAddress($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('to', $address, $name);\n    }\n\n    /**\n     * Add a \"CC\" address.\n     * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('cc', $address, $name);\n    }\n\n    /**\n     * Add a \"BCC\" address.\n     * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addBCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n    }\n\n    /**\n     * Add a \"Reply-To\" address.\n     * @param string $address The email address to reply to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addReplyTo($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n     * be modified after calling this function), addition of such addresses is delayed until send().\n     * Addresses that have been added already return false, but do not throw exceptions.\n     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     * @throws phpmailerException\n     * @return boolean true on success, false if address already used or invalid in some way\n     * @access protected\n     */\n    protected function addOrEnqueueAnAddress($kind, $address, $name)\n    {\n        $address = trim($address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        if (($pos = strrpos($address, '@')) === false) {\n            // At-sign is misssing.\n            $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        $params = array($kind, $address, $name);\n        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n            if ($kind != 'Reply-To') {\n                if (!array_key_exists($address, $this->RecipientsQueue)) {\n                    $this->RecipientsQueue[$address] = $params;\n                    return true;\n                }\n            } else {\n                if (!array_key_exists($address, $this->ReplyToQueue)) {\n                    $this->ReplyToQueue[$address] = $params;\n                    return true;\n                }\n            }\n            return false;\n        }\n        // Immediately add standard addresses without IDN.\n        return call_user_func_array(array($this, 'addAnAddress'), $params);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array.\n     * Addresses that have been added already return false, but do not throw exceptions.\n     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     * @throws phpmailerException\n     * @return boolean true on success, false if address already used or invalid in some way\n     * @access protected\n     */\n    protected function addAnAddress($kind, $address, $name = '')\n    {\n        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n            $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        if (!$this->validateAddress($address)) {\n            $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        if ($kind != 'Reply-To') {\n            if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n                array_push($this->$kind, array($address, $name));\n                $this->all_recipients[strtolower($address)] = true;\n                return true;\n            }\n        } else {\n            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n                $this->ReplyTo[strtolower($address)] = array($address, $name);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n     * of the form \"display name <address>\" into an array of name/address pairs.\n     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n     * Note that quotes in the name part are removed.\n     * @param string $addrstr The address list string\n     * @param bool $useimap Whether to use the IMAP extension to parse the list\n     * @return array\n     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation\n     */\n    public function parseAddresses($addrstr, $useimap = true)\n    {\n        $addresses = array();\n        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n            //Use this built-in parser if it's available\n            $list = imap_rfc822_parse_adrlist($addrstr, '');\n            foreach ($list as $address) {\n                if ($address->host != '.SYNTAX-ERROR.') {\n                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n                        $addresses[] = array(\n                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n                            'address' => $address->mailbox . '@' . $address->host\n                        );\n                    }\n                }\n            }\n        } else {\n            //Use this simpler parser\n            $list = explode(',', $addrstr);\n            foreach ($list as $address) {\n                $address = trim($address);\n                //Is there a separate name part?\n                if (strpos($address, '<') === false) {\n                    //No separate name, just use the whole thing\n                    if ($this->validateAddress($address)) {\n                        $addresses[] = array(\n                            'name' => '',\n                            'address' => $address\n                        );\n                    }\n                } else {\n                    list($name, $email) = explode('<', $address);\n                    $email = trim(str_replace('>', '', $email));\n                    if ($this->validateAddress($email)) {\n                        $addresses[] = array(\n                            'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n                            'address' => $email\n                        );\n                    }\n                }\n            }\n        }\n        return $addresses;\n    }\n\n    /**\n     * Set the From and FromName properties.\n     * @param string $address\n     * @param string $name\n     * @param boolean $auto Whether to also set the Sender address, defaults to true\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function setFrom($address, $name = '', $auto = true)\n    {\n        $address = trim($address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        // Don't validate now addresses with IDN. Will be done in send().\n        if (($pos = strrpos($address, '@')) === false or\n            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n            !$this->validateAddress($address)) {\n            $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        $this->From = $address;\n        $this->FromName = $name;\n        if ($auto) {\n            if (empty($this->Sender)) {\n                $this->Sender = $address;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Return the Message-ID header of the last email.\n     * Technically this is the value from the last time the headers were created,\n     * but it's also the message ID of the last sent message except in\n     * pathological cases.\n     * @return string\n     */\n    public function getLastMessageID()\n    {\n        return $this->lastMessageID;\n    }\n\n    /**\n     * Check that a string looks like an email address.\n     * @param string $address The email address to check\n     * @param string|callable $patternselect A selector for the validation pattern to use :\n     * * `auto` Pick best pattern automatically;\n     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n     * * `pcre` Use old PCRE implementation;\n     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n     * * `noregex` Don't use a regex: super fast, really dumb.\n     * Alternatively you may pass in a callable to inject your own validator, for example:\n     * PHPMailer::validateAddress('user@example.com', function($address) {\n     *     return (strpos($address, '@') !== false);\n     * });\n     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n     * @return boolean\n     * @static\n     * @access public\n     */\n    public static function validateAddress($address, $patternselect = null)\n    {\n        if (is_null($patternselect)) {\n            $patternselect = self::$validator;\n        }\n        if (is_callable($patternselect)) {\n            return call_user_func($patternselect, $address);\n        }\n        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n        if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n            return false;\n        }\n        if (!$patternselect or $patternselect == 'auto') {\n            //Check this constant first so it works when extension_loaded() is disabled by safe mode\n            //Constant was added in PHP 5.2.4\n            if (defined('PCRE_VERSION')) {\n                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n                    $patternselect = 'pcre8';\n                } else {\n                    $patternselect = 'pcre';\n                }\n            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n                //Fall back to older PCRE\n                $patternselect = 'pcre';\n            } else {\n                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n                    $patternselect = 'php';\n                } else {\n                    $patternselect = 'noregex';\n                }\n            }\n        }\n        switch ($patternselect) {\n            case 'pcre8':\n                /**\n                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n                 * @link http://squiloople.com/2009/12/20/email-address-validation/\n                 * @copyright 2009-2010 Michael Rushton\n                 * Feel free to use and redistribute this code. But please keep this copyright notice.\n                 */\n                return (boolean)preg_match(\n                    '/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n                    '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n                    '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n                    '([!#-\\'*+\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n                    '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n                    '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n                    '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$/isD',\n                    $address\n                );\n            case 'pcre':\n                //An older regex that doesn't need a recent PCRE\n                return (boolean)preg_match(\n                    '/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n                    '[!#-\\'*+\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n                    '(?>\\.(?>[!#-\\'*+\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$/isD',\n                    $address\n                );\n            case 'html5':\n                /**\n                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)\n                 */\n                return (boolean)preg_match(\n                    '/^[a-zA-Z0-9.!#$%&\\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n                    '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',\n                    $address\n                );\n            case 'noregex':\n                //No PCRE! Do something _very_ approximate!\n                //Check the address is 3 chars or longer and contains an @ that's not the first or last char\n                return (strlen($address) >= 3\n                    and strpos($address, '@') >= 1\n                    and strpos($address, '@') != strlen($address) - 1);\n            case 'php':\n            default:\n                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n        }\n    }\n\n    /**\n     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n     * \"intl\" and \"mbstring\" PHP extensions.\n     * @return bool \"true\" if required functions for IDN support are present\n     */\n    public function idnSupported()\n    {\n        // @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n    }\n\n    /**\n     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n     * This function silently returns unmodified address if:\n     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)\n     * @see PHPMailer::$CharSet\n     * @param string $address The email address to convert\n     * @return string The encoded address in ASCII form\n     */\n    public function punyencodeAddress($address)\n    {\n        // Verify we have required functions, CharSet, and at-sign.\n        if ($this->idnSupported() and\n            !empty($this->CharSet) and\n            ($pos = strrpos($address, '@')) !== false) {\n            $domain = substr($address, ++$pos);\n            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n                    idn_to_ascii($domain)) !== false) {\n                    return substr($address, 0, $pos) . $punycode;\n                }\n            }\n        }\n        return $address;\n    }\n\n    /**\n     * Create a message and send it.\n     * Uses the sending method specified by $Mailer.\n     * @throws phpmailerException\n     * @return boolean false on error - See the ErrorInfo property for details of the error.\n     */\n    public function send()\n    {\n        try {\n            if (!$this->preSend()) {\n                return false;\n            }\n            return $this->postSend();\n        } catch (phpmailerException $exc) {\n            $this->mailHeader = '';\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Prepare a message for sending.\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function preSend()\n    {\n        try {\n            $this->error_count = 0; // Reset errors\n            $this->mailHeader = '';\n\n            // Dequeue recipient and Reply-To addresses with IDN\n            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n                $params[1] = $this->punyencodeAddress($params[1]);\n                call_user_func_array(array($this, 'addAnAddress'), $params);\n            }\n            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n            }\n\n            // Validate From, Sender, and ConfirmReadingTo addresses\n            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n                $this->$address_kind = trim($this->$address_kind);\n                if (empty($this->$address_kind)) {\n                    continue;\n                }\n                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n                if (!$this->validateAddress($this->$address_kind)) {\n                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n                    $this->setError($error_message);\n                    $this->edebug($error_message);\n                    if ($this->exceptions) {\n                        throw new phpmailerException($error_message);\n                    }\n                    return false;\n                }\n            }\n\n            // Set whether the message is multipart/alternative\n            if ($this->alternativeExists()) {\n                $this->ContentType = 'multipart/alternative';\n            }\n\n            $this->setMessageType();\n            // Refuse to send an empty message unless we are specifically allowing it\n            if (!$this->AllowEmpty and empty($this->Body)) {\n                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n            }\n\n            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n            $this->MIMEHeader = '';\n            $this->MIMEBody = $this->createBody();\n            // createBody may have added some headers, so retain them\n            $tempheaders = $this->MIMEHeader;\n            $this->MIMEHeader = $this->createHeader();\n            $this->MIMEHeader .= $tempheaders;\n\n            // To capture the complete message when using mail(), create\n            // an extra header list which createHeader() doesn't fold in\n            if ($this->Mailer == 'mail') {\n                if (count($this->to) > 0) {\n                    $this->mailHeader .= $this->addrAppend('To', $this->to);\n                } else {\n                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n                }\n                $this->mailHeader .= $this->headerLine(\n                    'Subject',\n                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n                );\n            }\n\n            // Sign with DKIM if enabled\n            if (!empty($this->DKIM_domain)\n                && !empty($this->DKIM_selector)\n                && (!empty($this->DKIM_private_string)\n                   || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))\n                )\n            ) {\n                $header_dkim = $this->DKIM_Add(\n                    $this->MIMEHeader . $this->mailHeader,\n                    $this->encodeHeader($this->secureHeader($this->Subject)),\n                    $this->MIMEBody\n                );\n                $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n                    str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n            }\n            return true;\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Actually send a message.\n     * Send the email via the selected mechanism\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function postSend()\n    {\n        try {\n            // Choose the mailer and send through it\n            switch ($this->Mailer) {\n                case 'sendmail':\n                case 'qmail':\n                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n                case 'smtp':\n                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n                case 'mail':\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n                default:\n                    $sendMethod = $this->Mailer.'Send';\n                    if (method_exists($this, $sendMethod)) {\n                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n                    }\n\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n            }\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Send mail using the $Sendmail program.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @see PHPMailer::$Sendmail\n     * @throws phpmailerException\n     * @access protected\n     * @return boolean\n     */\n    protected function sendmailSend($header, $body)\n    {\n        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n            if ($this->Mailer == 'qmail') {\n                $sendmailFmt = '%s -f%s';\n            } else {\n                $sendmailFmt = '%s -oi -f%s -t';\n            }\n        } else {\n            if ($this->Mailer == 'qmail') {\n                $sendmailFmt = '%s';\n            } else {\n                $sendmailFmt = '%s -oi -t';\n            }\n        }\n\n        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.\n        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n        if ($this->SingleTo) {\n            foreach ($this->SingleToArray as $toAddr) {\n                if (!@$mail = popen($sendmail, 'w')) {\n                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n                fputs($mail, 'To: ' . $toAddr . \"\\n\");\n                fputs($mail, $header);\n                fputs($mail, $body);\n                $result = pclose($mail);\n                $this->doCallback(\n                    ($result == 0),\n                    array($toAddr),\n                    $this->cc,\n                    $this->bcc,\n                    $this->Subject,\n                    $body,\n                    $this->From\n                );\n                if ($result != 0) {\n                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n            }\n        } else {\n            if (!@$mail = popen($sendmail, 'w')) {\n                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n            fputs($mail, $header);\n            fputs($mail, $body);\n            $result = pclose($mail);\n            $this->doCallback(\n                ($result == 0),\n                $this->to,\n                $this->cc,\n                $this->bcc,\n                $this->Subject,\n                $body,\n                $this->From\n            );\n            if ($result != 0) {\n                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n     *\n     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n     * @param string $string The string to be validated\n     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report\n     * @access protected\n     * @return boolean\n     */\n    protected static function isShellSafe($string)\n    {\n        // Future-proof\n        if (escapeshellcmd($string) !== $string\n            or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n        ) {\n            return false;\n        }\n\n        $length = strlen($string);\n\n        for ($i = 0; $i < $length; $i++) {\n            $c = $string[$i];\n\n            // All other characters have a special meaning in at least one common shell, including = and +.\n            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n            // Note that this does permit non-Latin alphanumeric characters based on the current locale.\n            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Send mail using the PHP mail() function.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @link http://www.php.net/manual/en/book.mail.php\n     * @throws phpmailerException\n     * @access protected\n     * @return boolean\n     */\n    protected function mailSend($header, $body)\n    {\n        $toArr = array();\n        foreach ($this->to as $toaddr) {\n            $toArr[] = $this->addrFormat($toaddr);\n        }\n        $to = implode(', ', $toArr);\n\n        $params = null;\n        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n            if (self::isShellSafe($this->Sender)) {\n                $params = sprintf('-f%s', $this->Sender);\n            }\n        }\n        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n            $old_from = ini_get('sendmail_from');\n            ini_set('sendmail_from', $this->Sender);\n        }\n        $result = false;\n        if ($this->SingleTo and count($toArr) > 1) {\n            foreach ($toArr as $toAddr) {\n                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n            }\n        } else {\n            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n        }\n        if (isset($old_from)) {\n            ini_set('sendmail_from', $old_from);\n        }\n        if (!$result) {\n            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n        }\n        return true;\n    }\n\n    /**\n     * Get an instance to use for SMTP operations.\n     * Override this function to load your own SMTP implementation\n     * @return SMTP\n     */\n    public function getSMTPInstance()\n    {\n        if (!is_object($this->smtp)) {\n            $this->smtp = new SMTP;\n        }\n        return $this->smtp;\n    }\n\n    /**\n     * Send mail via SMTP.\n     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n     * Uses the PHPMailerSMTP class by default.\n     * @see PHPMailer::getSMTPInstance() to use a different class.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @throws phpmailerException\n     * @uses SMTP\n     * @access protected\n     * @return boolean\n     */\n    protected function smtpSend($header, $body)\n    {\n        $bad_rcpt = array();\n        if (!$this->smtpConnect($this->SMTPOptions)) {\n            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n        }\n        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n            $smtp_from = $this->Sender;\n        } else {\n            $smtp_from = $this->From;\n        }\n        if (!$this->smtp->mail($smtp_from)) {\n            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n        }\n\n        // Attempt to send to all recipients\n        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n            foreach ($togroup as $to) {\n                if (!$this->smtp->recipient($to[0])) {\n                    $error = $this->smtp->getError();\n                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n                    $isSent = false;\n                } else {\n                    $isSent = true;\n                }\n                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n            }\n        }\n\n        // Only send the DATA command if we have viable recipients\n        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n        }\n        if ($this->SMTPKeepAlive) {\n            $this->smtp->reset();\n        } else {\n            $this->smtp->quit();\n            $this->smtp->close();\n        }\n        //Create error message for any bad addresses\n        if (count($bad_rcpt) > 0) {\n            $errstr = '';\n            foreach ($bad_rcpt as $bad) {\n                $errstr .= $bad['to'] . ': ' . $bad['error'];\n            }\n            throw new phpmailerException(\n                $this->lang('recipients_failed') . $errstr,\n                self::STOP_CONTINUE\n            );\n        }\n        return true;\n    }\n\n    /**\n     * Initiate a connection to an SMTP server.\n     * Returns false if the operation failed.\n     * @param array $options An array of options compatible with stream_context_create()\n     * @uses SMTP\n     * @access public\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function smtpConnect($options = null)\n    {\n        if (is_null($this->smtp)) {\n            $this->smtp = $this->getSMTPInstance();\n        }\n\n        //If no options are provided, use whatever is set in the instance\n        if (is_null($options)) {\n            $options = $this->SMTPOptions;\n        }\n\n        // Already connected?\n        if ($this->smtp->connected()) {\n            return true;\n        }\n\n        $this->smtp->setTimeout($this->Timeout);\n        $this->smtp->setDebugLevel($this->SMTPDebug);\n        $this->smtp->setDebugOutput($this->Debugoutput);\n        $this->smtp->setVerp($this->do_verp);\n        $hosts = explode(';', $this->Host);\n        $lastexception = null;\n\n        foreach ($hosts as $hostentry) {\n            $hostinfo = array();\n            if (!preg_match(\n                '/^((ssl|tls):\\/\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$/',\n                trim($hostentry),\n                $hostinfo\n            )) {\n                // Not a valid host entry\n                $this->edebug('Ignoring invalid host: ' . $hostentry);\n                continue;\n            }\n            // $hostinfo[2]: optional ssl or tls prefix\n            // $hostinfo[3]: the hostname\n            // $hostinfo[4]: optional port number\n            // The host string prefix can temporarily override the current setting for SMTPSecure\n            // If it's not specified, the default value is used\n            $prefix = '';\n            $secure = $this->SMTPSecure;\n            $tls = ($this->SMTPSecure == 'tls');\n            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n                $prefix = 'ssl://';\n                $tls = false; // Can't have SSL and TLS at the same time\n                $secure = 'ssl';\n            } elseif ($hostinfo[2] == 'tls') {\n                $tls = true;\n                // tls doesn't use a prefix\n                $secure = 'tls';\n            }\n            //Do we need the OpenSSL extension?\n            $sslext = defined('OPENSSL_ALGO_SHA1');\n            if ('tls' === $secure or 'ssl' === $secure) {\n                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n                if (!$sslext) {\n                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n                }\n            }\n            $host = $hostinfo[3];\n            $port = $this->Port;\n            $tport = (integer)$hostinfo[4];\n            if ($tport > 0 and $tport < 65536) {\n                $port = $tport;\n            }\n            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n                try {\n                    if ($this->Helo) {\n                        $hello = $this->Helo;\n                    } else {\n                        $hello = $this->serverHostname();\n                    }\n                    $this->smtp->hello($hello);\n                    //Automatically enable TLS encryption if:\n                    // * it's not disabled\n                    // * we have openssl extension\n                    // * we are not already using SSL\n                    // * the server offers STARTTLS\n                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n                        $tls = true;\n                    }\n                    if ($tls) {\n                        if (!$this->smtp->startTLS()) {\n                            throw new phpmailerException($this->lang('connect_host'));\n                        }\n                        // We must resend EHLO after TLS negotiation\n                        $this->smtp->hello($hello);\n                    }\n                    if ($this->SMTPAuth) {\n                        if (!$this->smtp->authenticate(\n                            $this->Username,\n                            $this->Password,\n                            $this->AuthType,\n                            $this->Realm,\n                            $this->Workstation\n                        )\n                        ) {\n                            throw new phpmailerException($this->lang('authenticate'));\n                        }\n                    }\n                    return true;\n                } catch (phpmailerException $exc) {\n                    $lastexception = $exc;\n                    $this->edebug($exc->getMessage());\n                    // We must have connected, but then failed TLS or Auth, so close connection nicely\n                    $this->smtp->quit();\n                }\n            }\n        }\n        // If we get here, all connection attempts have failed, so close connection hard\n        $this->smtp->close();\n        // As we've caught all exceptions, just report whatever the last one was\n        if ($this->exceptions and !is_null($lastexception)) {\n            throw $lastexception;\n        }\n        return false;\n    }\n\n    /**\n     * Close the active SMTP session if one exists.\n     * @return void\n     */\n    public function smtpClose()\n    {\n        if (is_a($this->smtp, 'SMTP')) {\n            if ($this->smtp->connected()) {\n                $this->smtp->quit();\n                $this->smtp->close();\n            }\n        }\n    }\n\n    /**\n     * Set the language for error messages.\n     * Returns false if it cannot load the language file.\n     * The default language is English.\n     * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n     * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n     * @return boolean\n     * @access public\n     */\n    public function setLanguage($langcode = 'en', $lang_path = '')\n    {\n        // Backwards compatibility for renamed language codes\n        $renamed_langcodes = array(\n            'br' => 'pt_br',\n            'cz' => 'cs',\n            'dk' => 'da',\n            'no' => 'nb',\n            'se' => 'sv',\n            'sr' => 'rs'\n        );\n\n        if (isset($renamed_langcodes[$langcode])) {\n            $langcode = $renamed_langcodes[$langcode];\n        }\n\n        // Define full set of translatable strings in English\n        $PHPMAILER_LANG = array(\n            'authenticate' => 'SMTP Error: Could not authenticate.',\n            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n            'data_not_accepted' => 'SMTP Error: data not accepted.',\n            'empty_message' => 'Message body empty',\n            'encoding' => 'Unknown encoding: ',\n            'execute' => 'Could not execute: ',\n            'file_access' => 'Could not access file: ',\n            'file_open' => 'File Error: Could not open file: ',\n            'from_failed' => 'The following From address failed: ',\n            'instantiate' => 'Could not instantiate mail function.',\n            'invalid_address' => 'Invalid address: ',\n            'mailer_not_supported' => ' mailer is not supported.',\n            'provide_address' => 'You must provide at least one recipient email address.',\n            'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n            'signing' => 'Signing Error: ',\n            'smtp_connect_failed' => 'SMTP connect() failed.',\n            'smtp_error' => 'SMTP server error: ',\n            'variable_set' => 'Cannot set or reset variable: ',\n            'extension_missing' => 'Extension missing: '\n        );\n        if (empty($lang_path)) {\n            // Calculate an absolute path so it can work if CWD is not here\n            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n        }\n        //Validate $langcode\n        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {\n            $langcode = 'en';\n        }\n        $foundlang = true;\n        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n        // There is no English translation file\n        if ($langcode != 'en') {\n            // Make sure language file path is readable\n            if (!is_readable($lang_file)) {\n                $foundlang = false;\n            } else {\n                // Overwrite language-specific strings.\n                // This way we'll never have missing translation keys.\n                $foundlang = include $lang_file;\n            }\n        }\n        $this->language = $PHPMAILER_LANG;\n        return (boolean)$foundlang; // Returns false if language not found\n    }\n\n    /**\n     * Get the array of strings for the current language.\n     * @return array\n     */\n    public function getTranslations()\n    {\n        return $this->language;\n    }\n\n    /**\n     * Create recipient headers.\n     * @access public\n     * @param string $type\n     * @param array $addr An array of recipient,\n     * where each recipient is a 2-element indexed array with element 0 containing an address\n     * and element 1 containing a name, like:\n     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n     * @return string\n     */\n    public function addrAppend($type, $addr)\n    {\n        $addresses = array();\n        foreach ($addr as $address) {\n            $addresses[] = $this->addrFormat($address);\n        }\n        return $type . ': ' . implode(', ', $addresses) . $this->LE;\n    }\n\n    /**\n     * Format an address for use in a message header.\n     * @access public\n     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n     *      like array('joe@example.com', 'Joe User')\n     * @return string\n     */\n    public function addrFormat($addr)\n    {\n        if (empty($addr[1])) { // No name provided\n            return $this->secureHeader($addr[0]);\n        } else {\n            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n                $addr[0]\n            ) . '>';\n        }\n    }\n\n    /**\n     * Word-wrap message.\n     * For use with mailers that do not automatically perform wrapping\n     * and for quoted-printable encoded messages.\n     * Original written by philippe.\n     * @param string $message The message to wrap\n     * @param integer $length The line length to wrap to\n     * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n     * @access public\n     * @return string\n     */\n    public function wrapText($message, $length, $qp_mode = false)\n    {\n        if ($qp_mode) {\n            $soft_break = sprintf(' =%s', $this->LE);\n        } else {\n            $soft_break = $this->LE;\n        }\n        // If utf-8 encoding is used, we will need to make sure we don't\n        // split multibyte characters when we wrap\n        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n        $lelen = strlen($this->LE);\n        $crlflen = strlen(self::CRLF);\n\n        $message = $this->fixEOL($message);\n        //Remove a trailing line break\n        if (substr($message, -$lelen) == $this->LE) {\n            $message = substr($message, 0, -$lelen);\n        }\n\n        //Split message into lines\n        $lines = explode($this->LE, $message);\n        //Message will be rebuilt in here\n        $message = '';\n        foreach ($lines as $line) {\n            $words = explode(' ', $line);\n            $buf = '';\n            $firstword = true;\n            foreach ($words as $word) {\n                if ($qp_mode and (strlen($word) > $length)) {\n                    $space_left = $length - strlen($buf) - $crlflen;\n                    if (!$firstword) {\n                        if ($space_left > 20) {\n                            $len = $space_left;\n                            if ($is_utf8) {\n                                $len = $this->utf8CharBoundary($word, $len);\n                            } elseif (substr($word, $len - 1, 1) == '=') {\n                                $len--;\n                            } elseif (substr($word, $len - 2, 1) == '=') {\n                                $len -= 2;\n                            }\n                            $part = substr($word, 0, $len);\n                            $word = substr($word, $len);\n                            $buf .= ' ' . $part;\n                            $message .= $buf . sprintf('=%s', self::CRLF);\n                        } else {\n                            $message .= $buf . $soft_break;\n                        }\n                        $buf = '';\n                    }\n                    while (strlen($word) > 0) {\n                        if ($length <= 0) {\n                            break;\n                        }\n                        $len = $length;\n                        if ($is_utf8) {\n                            $len = $this->utf8CharBoundary($word, $len);\n                        } elseif (substr($word, $len - 1, 1) == '=') {\n                            $len--;\n                        } elseif (substr($word, $len - 2, 1) == '=') {\n                            $len -= 2;\n                        }\n                        $part = substr($word, 0, $len);\n                        $word = substr($word, $len);\n\n                        if (strlen($word) > 0) {\n                            $message .= $part . sprintf('=%s', self::CRLF);\n                        } else {\n                            $buf = $part;\n                        }\n                    }\n                } else {\n                    $buf_o = $buf;\n                    if (!$firstword) {\n                        $buf .= ' ';\n                    }\n                    $buf .= $word;\n\n                    if (strlen($buf) > $length and $buf_o != '') {\n                        $message .= $buf_o . $soft_break;\n                        $buf = $word;\n                    }\n                }\n                $firstword = false;\n            }\n            $message .= $buf . self::CRLF;\n        }\n\n        return $message;\n    }\n\n    /**\n     * Find the last character boundary prior to $maxLength in a utf-8\n     * quoted-printable encoded string.\n     * Original written by Colin Brown.\n     * @access public\n     * @param string $encodedText utf-8 QP text\n     * @param integer $maxLength Find the last character boundary prior to this length\n     * @return integer\n     */\n    public function utf8CharBoundary($encodedText, $maxLength)\n    {\n        $foundSplitPos = false;\n        $lookBack = 3;\n        while (!$foundSplitPos) {\n            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n            $encodedCharPos = strpos($lastChunk, '=');\n            if (false !== $encodedCharPos) {\n                // Found start of encoded character byte within $lookBack block.\n                // Check the encoded byte value (the 2 chars after the '=')\n                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n                $dec = hexdec($hex);\n                if ($dec < 128) {\n                    // Single byte character.\n                    // If the encoded char was found at pos 0, it will fit\n                    // otherwise reduce maxLength to start of the encoded char\n                    if ($encodedCharPos > 0) {\n                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n                    }\n                    $foundSplitPos = true;\n                } elseif ($dec >= 192) {\n                    // First byte of a multi byte character\n                    // Reduce maxLength to split at start of character\n                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n                    $foundSplitPos = true;\n                } elseif ($dec < 192) {\n                    // Middle byte of a multi byte character, look further back\n                    $lookBack += 3;\n                }\n            } else {\n                // No encoded character found\n                $foundSplitPos = true;\n            }\n        }\n        return $maxLength;\n    }\n\n    /**\n     * Apply word wrapping to the message body.\n     * Wraps the message body to the number of chars set in the WordWrap property.\n     * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n     * This is called automatically by createBody(), so you don't need to call it yourself.\n     * @access public\n     * @return void\n     */\n    public function setWordWrap()\n    {\n        if ($this->WordWrap < 1) {\n            return;\n        }\n\n        switch ($this->message_type) {\n            case 'alt':\n            case 'alt_inline':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n                break;\n            default:\n                $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n                break;\n        }\n    }\n\n    /**\n     * Assemble message headers.\n     * @access public\n     * @return string The assembled headers\n     */\n    public function createHeader()\n    {\n        $result = '';\n\n        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n        // To be created automatically by mail()\n        if ($this->SingleTo) {\n            if ($this->Mailer != 'mail') {\n                foreach ($this->to as $toaddr) {\n                    $this->SingleToArray[] = $this->addrFormat($toaddr);\n                }\n            }\n        } else {\n            if (count($this->to) > 0) {\n                if ($this->Mailer != 'mail') {\n                    $result .= $this->addrAppend('To', $this->to);\n                }\n            } elseif (count($this->cc) == 0) {\n                $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n            }\n        }\n\n        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n        // sendmail and mail() extract Cc from the header before sending\n        if (count($this->cc) > 0) {\n            $result .= $this->addrAppend('Cc', $this->cc);\n        }\n\n        // sendmail and mail() extract Bcc from the header before sending\n        if ((\n                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n            )\n            and count($this->bcc) > 0\n        ) {\n            $result .= $this->addrAppend('Bcc', $this->bcc);\n        }\n\n        if (count($this->ReplyTo) > 0) {\n            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n        }\n\n        // mail() sets the subject itself\n        if ($this->Mailer != 'mail') {\n            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n        }\n\n        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n        // https://tools.ietf.org/html/rfc5322#section-3.6.4\n        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {\n            $this->lastMessageID = $this->MessageID;\n        } else {\n            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n        }\n        $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n        if (!is_null($this->Priority)) {\n            $result .= $this->headerLine('X-Priority', $this->Priority);\n        }\n        if ($this->XMailer == '') {\n            $result .= $this->headerLine(\n                'X-Mailer',\n                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'\n            );\n        } else {\n            $myXmailer = trim($this->XMailer);\n            if ($myXmailer) {\n                $result .= $this->headerLine('X-Mailer', $myXmailer);\n            }\n        }\n\n        if ($this->ConfirmReadingTo != '') {\n            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n        }\n\n        // Add custom headers\n        foreach ($this->CustomHeader as $header) {\n            $result .= $this->headerLine(\n                trim($header[0]),\n                $this->encodeHeader(trim($header[1]))\n            );\n        }\n        if (!$this->sign_key_file) {\n            $result .= $this->headerLine('MIME-Version', '1.0');\n            $result .= $this->getMailMIME();\n        }\n\n        return $result;\n    }\n\n    /**\n     * Get the message MIME type headers.\n     * @access public\n     * @return string\n     */\n    public function getMailMIME()\n    {\n        $result = '';\n        $ismultipart = true;\n        switch ($this->message_type) {\n            case 'inline':\n                $result .= $this->headerLine('Content-Type', 'multipart/related;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            case 'attach':\n            case 'inline_attach':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            case 'alt':\n            case 'alt_inline':\n                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            default:\n                // Catches case 'plain': and case '':\n                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n                $ismultipart = false;\n                break;\n        }\n        // RFC1341 part 5 says 7bit is assumed if not specified\n        if ($this->Encoding != '7bit') {\n            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n            if ($ismultipart) {\n                if ($this->Encoding == '8bit') {\n                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n                }\n                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n            } else {\n                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n            }\n        }\n\n        if ($this->Mailer != 'mail') {\n            $result .= $this->LE;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Returns the whole MIME message.\n     * Includes complete headers and body.\n     * Only valid post preSend().\n     * @see PHPMailer::preSend()\n     * @access public\n     * @return string\n     */\n    public function getSentMIMEMessage()\n    {\n        return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n    }\n\n    /**\n     * Create unique ID\n     * @return string\n     */\n    protected function generateId() {\n        return md5(uniqid(time()));\n    }\n\n    /**\n     * Assemble the message body.\n     * Returns an empty string on failure.\n     * @access public\n     * @throws phpmailerException\n     * @return string The assembled message body\n     */\n    public function createBody()\n    {\n        $body = '';\n        //Create unique IDs and preset boundaries\n        $this->uniqueid = $this->generateId();\n        $this->boundary[1] = 'b1_' . $this->uniqueid;\n        $this->boundary[2] = 'b2_' . $this->uniqueid;\n        $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n        if ($this->sign_key_file) {\n            $body .= $this->getMailMIME() . $this->LE;\n        }\n\n        $this->setWordWrap();\n\n        $bodyEncoding = $this->Encoding;\n        $bodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n            $bodyEncoding = '7bit';\n            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n            $bodyCharSet = 'us-ascii';\n        }\n        //If lines are too long, and we're not already using an encoding that will shorten them,\n        //change to quoted-printable transfer encoding for the body part only\n        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n            $bodyEncoding = 'quoted-printable';\n        }\n\n        $altBodyEncoding = $this->Encoding;\n        $altBodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n            $altBodyEncoding = '7bit';\n            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n            $altBodyCharSet = 'us-ascii';\n        }\n        //If lines are too long, and we're not already using an encoding that will shorten them,\n        //change to quoted-printable transfer encoding for the alt body part only\n        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n            $altBodyEncoding = 'quoted-printable';\n        }\n        //Use this as a preamble in all multipart message types\n        $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n        switch ($this->message_type) {\n            case 'inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[1]);\n                break;\n            case 'attach':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                if (!empty($this->Ical)) {\n                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');\n                    $body .= $this->encodeString($this->Ical, $this->Encoding);\n                    $body .= $this->LE . $this->LE;\n                }\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt_inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->textLine('--' . $this->boundary[2]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[3]);\n                $body .= $this->LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            default:\n                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types\n                //Reset the `Encoding` property in case we changed it for line length reasons\n                $this->Encoding = $bodyEncoding;\n                $body .= $this->encodeString($this->Body, $this->Encoding);\n                break;\n        }\n\n        if ($this->isError()) {\n            $body = '';\n        } elseif ($this->sign_key_file) {\n            try {\n                if (!defined('PKCS7_TEXT')) {\n                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n                }\n                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1\n                $file = tempnam(sys_get_temp_dir(), 'mail');\n                if (false === file_put_contents($file, $body)) {\n                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n                }\n                $signed = tempnam(sys_get_temp_dir(), 'signed');\n                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197\n                if (empty($this->sign_extracerts_file)) {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),\n                        null\n                    );\n                } else {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),\n                        null,\n                        PKCS7_DETACHED,\n                        $this->sign_extracerts_file\n                    );\n                }\n                if ($sign) {\n                    @unlink($file);\n                    $body = file_get_contents($signed);\n                    @unlink($signed);\n                    //The message returned by openssl contains both headers and body, so need to split them up\n                    $parts = explode(\"\\n\\n\", $body, 2);\n                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n                    $body = $parts[1];\n                } else {\n                    @unlink($file);\n                    @unlink($signed);\n                    throw new phpmailerException($this->lang('signing') . openssl_error_string());\n                }\n            } catch (phpmailerException $exc) {\n                $body = '';\n                if ($this->exceptions) {\n                    throw $exc;\n                }\n            }\n        }\n        return $body;\n    }\n\n    /**\n     * Return the start of a message boundary.\n     * @access protected\n     * @param string $boundary\n     * @param string $charSet\n     * @param string $contentType\n     * @param string $encoding\n     * @return string\n     */\n    protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n    {\n        $result = '';\n        if ($charSet == '') {\n            $charSet = $this->CharSet;\n        }\n        if ($contentType == '') {\n            $contentType = $this->ContentType;\n        }\n        if ($encoding == '') {\n            $encoding = $this->Encoding;\n        }\n        $result .= $this->textLine('--' . $boundary);\n        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n        $result .= $this->LE;\n        // RFC1341 part 5 says 7bit is assumed if not specified\n        if ($encoding != '7bit') {\n            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n        }\n        $result .= $this->LE;\n\n        return $result;\n    }\n\n    /**\n     * Return the end of a message boundary.\n     * @access protected\n     * @param string $boundary\n     * @return string\n     */\n    protected function endBoundary($boundary)\n    {\n        return $this->LE . '--' . $boundary . '--' . $this->LE;\n    }\n\n    /**\n     * Set the message type.\n     * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n     * @access protected\n     * @return void\n     */\n    protected function setMessageType()\n    {\n        $type = array();\n        if ($this->alternativeExists()) {\n            $type[] = 'alt';\n        }\n        if ($this->inlineImageExists()) {\n            $type[] = 'inline';\n        }\n        if ($this->attachmentExists()) {\n            $type[] = 'attach';\n        }\n        $this->message_type = implode('_', $type);\n        if ($this->message_type == '') {\n            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n            $this->message_type = 'plain';\n        }\n    }\n\n    /**\n     * Format a header line.\n     * @access public\n     * @param string $name\n     * @param string $value\n     * @return string\n     */\n    public function headerLine($name, $value)\n    {\n        return $name . ': ' . $value . $this->LE;\n    }\n\n    /**\n     * Return a formatted mail line.\n     * @access public\n     * @param string $value\n     * @return string\n     */\n    public function textLine($value)\n    {\n        return $value . $this->LE;\n    }\n\n    /**\n     * Add an attachment from a path on the filesystem.\n     * Never use a user-supplied path to a file!\n     * Returns false if the file could not be found or read.\n     * @param string $path Path to the attachment.\n     * @param string $name Overrides the attachment name.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File extension (MIME) type.\n     * @param string $disposition Disposition to use\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n    {\n        try {\n            if (!@is_file($path)) {\n                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n            }\n\n            // If a MIME type is not specified, try to work it out from the file name\n            if ($type == '') {\n                $type = self::filenameToType($path);\n            }\n\n            $filename = basename($path);\n            if ($name == '') {\n                $name = $filename;\n            }\n\n            $this->attachment[] = array(\n                0 => $path,\n                1 => $filename,\n                2 => $name,\n                3 => $encoding,\n                4 => $type,\n                5 => false, // isStringAttachment\n                6 => $disposition,\n                7 => 0\n            );\n\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Return the array of attachments.\n     * @return array\n     */\n    public function getAttachments()\n    {\n        return $this->attachment;\n    }\n\n    /**\n     * Attach all file, string, and binary attachments to the message.\n     * Returns an empty string on failure.\n     * @access protected\n     * @param string $disposition_type\n     * @param string $boundary\n     * @return string\n     */\n    protected function attachAll($disposition_type, $boundary)\n    {\n        // Return text of body\n        $mime = array();\n        $cidUniq = array();\n        $incl = array();\n\n        // Add all attachments\n        foreach ($this->attachment as $attachment) {\n            // Check if it is a valid disposition_filter\n            if ($attachment[6] == $disposition_type) {\n                // Check for string attachment\n                $string = '';\n                $path = '';\n                $bString = $attachment[5];\n                if ($bString) {\n                    $string = $attachment[0];\n                } else {\n                    $path = $attachment[0];\n                }\n\n                $inclhash = md5(serialize($attachment));\n                if (in_array($inclhash, $incl)) {\n                    continue;\n                }\n                $incl[] = $inclhash;\n                $name = $attachment[2];\n                $encoding = $attachment[3];\n                $type = $attachment[4];\n                $disposition = $attachment[6];\n                $cid = $attachment[7];\n                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n                    continue;\n                }\n                $cidUniq[$cid] = true;\n\n                $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n                //Only include a filename property if we have one\n                if (!empty($name)) {\n                    $mime[] = sprintf(\n                        'Content-Type: %s; name=\"%s\"%s',\n                        $type,\n                        $this->encodeHeader($this->secureHeader($name)),\n                        $this->LE\n                    );\n                } else {\n                    $mime[] = sprintf(\n                        'Content-Type: %s%s',\n                        $type,\n                        $this->LE\n                    );\n                }\n                // RFC1341 part 5 says 7bit is assumed if not specified\n                if ($encoding != '7bit') {\n                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n                }\n\n                if ($disposition == 'inline') {\n                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n                }\n\n                // If a filename contains any of these chars, it should be quoted,\n                // but not otherwise: RFC2183 & RFC2045 5.1\n                // Fixes a warning in IETF's msglint MIME checker\n                // Allow for bypassing the Content-Disposition header totally\n                if (!(empty($disposition))) {\n                    $encoded_name = $this->encodeHeader($this->secureHeader($name));\n                    if (preg_match('/[ \\(\\)<>@,;:\\\\\"\\/\\[\\]\\?=]/', $encoded_name)) {\n                        $mime[] = sprintf(\n                            'Content-Disposition: %s; filename=\"%s\"%s',\n                            $disposition,\n                            $encoded_name,\n                            $this->LE . $this->LE\n                        );\n                    } else {\n                        if (!empty($encoded_name)) {\n                            $mime[] = sprintf(\n                                'Content-Disposition: %s; filename=%s%s',\n                                $disposition,\n                                $encoded_name,\n                                $this->LE . $this->LE\n                            );\n                        } else {\n                            $mime[] = sprintf(\n                                'Content-Disposition: %s%s',\n                                $disposition,\n                                $this->LE . $this->LE\n                            );\n                        }\n                    }\n                } else {\n                    $mime[] = $this->LE;\n                }\n\n                // Encode as string attachment\n                if ($bString) {\n                    $mime[] = $this->encodeString($string, $encoding);\n                    if ($this->isError()) {\n                        return '';\n                    }\n                    $mime[] = $this->LE . $this->LE;\n                } else {\n                    $mime[] = $this->encodeFile($path, $encoding);\n                    if ($this->isError()) {\n                        return '';\n                    }\n                    $mime[] = $this->LE . $this->LE;\n                }\n            }\n        }\n\n        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n        return implode('', $mime);\n    }\n\n    /**\n     * Encode a file attachment in requested format.\n     * Returns an empty string on failure.\n     * @param string $path The full path to the file\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     * @throws phpmailerException\n     * @access protected\n     * @return string\n     */\n    protected function encodeFile($path, $encoding = 'base64')\n    {\n        try {\n            if (!is_readable($path)) {\n                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n            }\n            $magic_quotes = get_magic_quotes_runtime();\n            if ($magic_quotes) {\n                if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n                    set_magic_quotes_runtime(false);\n                } else {\n                    //Doesn't exist in PHP 5.4, but we don't need to check because\n                    //get_magic_quotes_runtime always returns false in 5.4+\n                    //so it will never get here\n                    ini_set('magic_quotes_runtime', false);\n                }\n            }\n            $file_buffer = file_get_contents($path);\n            $file_buffer = $this->encodeString($file_buffer, $encoding);\n            if ($magic_quotes) {\n                if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n                    set_magic_quotes_runtime($magic_quotes);\n                } else {\n                    ini_set('magic_quotes_runtime', $magic_quotes);\n                }\n            }\n            return $file_buffer;\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            return '';\n        }\n    }\n\n    /**\n     * Encode a string in requested format.\n     * Returns an empty string on failure.\n     * @param string $str The text to encode\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     * @access public\n     * @return string\n     */\n    public function encodeString($str, $encoding = 'base64')\n    {\n        $encoded = '';\n        switch (strtolower($encoding)) {\n            case 'base64':\n                $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n                break;\n            case '7bit':\n            case '8bit':\n                $encoded = $this->fixEOL($str);\n                // Make sure it ends with a line break\n                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n                    $encoded .= $this->LE;\n                }\n                break;\n            case 'binary':\n                $encoded = $str;\n                break;\n            case 'quoted-printable':\n                $encoded = $this->encodeQP($str);\n                break;\n            default:\n                $this->setError($this->lang('encoding') . $encoding);\n                break;\n        }\n        return $encoded;\n    }\n\n    /**\n     * Encode a header string optimally.\n     * Picks shortest of Q, B, quoted-printable or none.\n     * @access public\n     * @param string $str\n     * @param string $position\n     * @return string\n     */\n    public function encodeHeader($str, $position = 'text')\n    {\n        $matchcount = 0;\n        switch (strtolower($position)) {\n            case 'phrase':\n                if (!preg_match('/[\\200-\\377]/', $str)) {\n                    // Can't use addslashes as we don't know the value of magic_quotes_sybase\n                    $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\\'*+\\/=?^_`{|}~ -]/', $str)) {\n                        return ($encoded);\n                    } else {\n                        return (\"\\\"$encoded\\\"\");\n                    }\n                }\n                $matchcount = preg_match_all('/[^\\040\\041\\043-\\133\\135-\\176]/', $str, $matches);\n                break;\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                $matchcount = preg_match_all('/[()\"]/', $str, $matches);\n                // Intentional fall-through\n            case 'text':\n            default:\n                $matchcount += preg_match_all('/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]/', $str, $matches);\n                break;\n        }\n\n        //There are no chars that need encoding\n        if ($matchcount == 0) {\n            return ($str);\n        }\n\n        $maxlen = 75 - 7 - strlen($this->CharSet);\n        // Try to select the encoding which should produce the shortest output\n        if ($matchcount > strlen($str) / 3) {\n            // More than a third of the content will need encoding, so B encoding will be most efficient\n            $encoding = 'B';\n            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n                // Use a custom function which correctly encodes and wraps long\n                // multibyte strings without breaking lines within a character\n                $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n            } else {\n                $encoded = base64_encode($str);\n                $maxlen -= $maxlen % 4;\n                $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n            }\n        } else {\n            $encoding = 'Q';\n            $encoded = $this->encodeQ($str, $position);\n            $encoded = $this->wrapText($encoded, $maxlen, true);\n            $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n        }\n\n        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n        $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n        return $encoded;\n    }\n\n    /**\n     * Check if a string contains multi-byte characters.\n     * @access public\n     * @param string $str multi-byte text to wrap encode\n     * @return boolean\n     */\n    public function hasMultiBytes($str)\n    {\n        if (function_exists('mb_strlen')) {\n            return (strlen($str) > mb_strlen($str, $this->CharSet));\n        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)\n            return false;\n        }\n    }\n\n    /**\n     * Does a string contain any 8-bit chars (in any charset)?\n     * @param string $text\n     * @return boolean\n     */\n    public function has8bitChars($text)\n    {\n        return (boolean)preg_match('/[\\x80-\\xFF]/', $text);\n    }\n\n    /**\n     * Encode and wrap long multibyte strings for mail headers\n     * without breaking lines within a character.\n     * Adapted from a function by paravoid\n     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283\n     * @access public\n     * @param string $str multi-byte text to wrap encode\n     * @param string $linebreak string to use as linefeed/end-of-line\n     * @return string\n     */\n    public function base64EncodeWrapMB($str, $linebreak = null)\n    {\n        $start = '=?' . $this->CharSet . '?B?';\n        $end = '?=';\n        $encoded = '';\n        if ($linebreak === null) {\n            $linebreak = $this->LE;\n        }\n\n        $mb_length = mb_strlen($str, $this->CharSet);\n        // Each line must have length <= 75, including $start and $end\n        $length = 75 - strlen($start) - strlen($end);\n        // Average multi-byte ratio\n        $ratio = $mb_length / strlen($str);\n        // Base64 has a 4:3 ratio\n        $avgLength = floor($length * $ratio * .75);\n\n        for ($i = 0; $i < $mb_length; $i += $offset) {\n            $lookBack = 0;\n            do {\n                $offset = $avgLength - $lookBack;\n                $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n                $chunk = base64_encode($chunk);\n                $lookBack++;\n            } while (strlen($chunk) > $length);\n            $encoded .= $chunk . $linebreak;\n        }\n\n        // Chomp the last linefeed\n        $encoded = substr($encoded, 0, -strlen($linebreak));\n        return $encoded;\n    }\n\n    /**\n     * Encode a string in quoted-printable format.\n     * According to RFC2045 section 6.7.\n     * @access public\n     * @param string $string The text to encode\n     * @param integer $line_max Number of chars allowed on a line before wrapping\n     * @return string\n     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment\n     */\n    public function encodeQP($string, $line_max = 76)\n    {\n        // Use native function if it's available (>= PHP5.3)\n        if (function_exists('quoted_printable_encode')) {\n            return quoted_printable_encode($string);\n        }\n        // Fall back to a pure PHP implementation\n        $string = str_replace(\n            array('%20', '%0D%0A.', '%0D%0A', '%'),\n            array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n            rawurlencode($string)\n        );\n        return preg_replace('/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}/', \"$0=\\r\\n\", $string);\n    }\n\n    /**\n     * Backward compatibility wrapper for an old QP encoding function that was removed.\n     * @see PHPMailer::encodeQP()\n     * @access public\n     * @param string $string\n     * @param integer $line_max\n     * @param boolean $space_conv\n     * @return string\n     * @deprecated Use encodeQP instead.\n     */\n    public function encodeQPphp(\n        $string,\n        $line_max = 76,\n        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false\n    ) {\n        return $this->encodeQP($string, $line_max);\n    }\n\n    /**\n     * Encode a string using Q encoding.\n     * @link http://tools.ietf.org/html/rfc2047\n     * @param string $str the text to encode\n     * @param string $position Where the text is going to be used, see the RFC for what that means\n     * @access public\n     * @return string\n     */\n    public function encodeQ($str, $position = 'text')\n    {\n        // There should not be any EOL in the string\n        $pattern = '';\n        $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n        switch (strtolower($position)) {\n            case 'phrase':\n                // RFC 2047 section 5.3\n                $pattern = '^A-Za-z0-9!*+\\/ -';\n                break;\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                // RFC 2047 section 5.2\n                $pattern = '\\(\\)\"';\n                // intentional fall-through\n                // for this reason we build the $pattern without including delimiters and []\n            case 'text':\n            default:\n                // RFC 2047 section 5.1\n                // Replace every high ascii, control, =, ? and _ characters\n                $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n                break;\n        }\n        $matches = array();\n        if (preg_match_all(\"/[{$pattern}]/\", $encoded, $matches)) {\n            // If the string contains an '=', make sure it's the first thing we replace\n            // so as to avoid double-encoding\n            $eqkey = array_search('=', $matches[0]);\n            if (false !== $eqkey) {\n                unset($matches[0][$eqkey]);\n                array_unshift($matches[0], '=');\n            }\n            foreach (array_unique($matches[0]) as $char) {\n                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n            }\n        }\n        // Replace every spaces to _ (more readable than =20)\n        return str_replace(' ', '_', $encoded);\n    }\n\n    /**\n     * Add a string or binary attachment (non-filesystem).\n     * This method can be used to attach ascii or binary data,\n     * such as a BLOB record from a database.\n     * @param string $string String attachment data.\n     * @param string $filename Name of the attachment.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File extension (MIME) type.\n     * @param string $disposition Disposition to use\n     * @return void\n     */\n    public function addStringAttachment(\n        $string,\n        $filename,\n        $encoding = 'base64',\n        $type = '',\n        $disposition = 'attachment'\n    ) {\n        // If a MIME type is not specified, try to work it out from the file name\n        if ($type == '') {\n            $type = self::filenameToType($filename);\n        }\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $string,\n            1 => $filename,\n            2 => basename($filename),\n            3 => $encoding,\n            4 => $type,\n            5 => true, // isStringAttachment\n            6 => $disposition,\n            7 => 0\n        );\n    }\n\n    /**\n     * Add an embedded (inline) attachment from a file.\n     * This can include images, sounds, and just about any other document type.\n     * These differ from 'regular' attachments in that they are intended to be\n     * displayed inline with the message, not just attached for download.\n     * This is used in HTML messages that embed the images\n     * the HTML refers to using the $cid value.\n     * Never use a user-supplied path to a file!\n     * @param string $path Path to the attachment.\n     * @param string $cid Content ID of the attachment; Use this to reference\n     *        the content when using an embedded image in HTML.\n     * @param string $name Overrides the attachment name.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File MIME type.\n     * @param string $disposition Disposition to use\n     * @return boolean True on successfully adding an attachment\n     */\n    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n    {\n        if (!@is_file($path)) {\n            $this->setError($this->lang('file_access') . $path);\n            return false;\n        }\n\n        // If a MIME type is not specified, try to work it out from the file name\n        if ($type == '') {\n            $type = self::filenameToType($path);\n        }\n\n        $filename = basename($path);\n        if ($name == '') {\n            $name = $filename;\n        }\n\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $path,\n            1 => $filename,\n            2 => $name,\n            3 => $encoding,\n            4 => $type,\n            5 => false, // isStringAttachment\n            6 => $disposition,\n            7 => $cid\n        );\n        return true;\n    }\n\n    /**\n     * Add an embedded stringified attachment.\n     * This can include images, sounds, and just about any other document type.\n     * Be sure to set the $type to an image type for images:\n     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.\n     * @param string $string The attachment binary data.\n     * @param string $cid Content ID of the attachment; Use this to reference\n     *        the content when using an embedded image in HTML.\n     * @param string $name\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type MIME type.\n     * @param string $disposition Disposition to use\n     * @return boolean True on successfully adding an attachment\n     */\n    public function addStringEmbeddedImage(\n        $string,\n        $cid,\n        $name = '',\n        $encoding = 'base64',\n        $type = '',\n        $disposition = 'inline'\n    ) {\n        // If a MIME type is not specified, try to work it out from the name\n        if ($type == '' and !empty($name)) {\n            $type = self::filenameToType($name);\n        }\n\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $string,\n            1 => $name,\n            2 => $name,\n            3 => $encoding,\n            4 => $type,\n            5 => true, // isStringAttachment\n            6 => $disposition,\n            7 => $cid\n        );\n        return true;\n    }\n\n    /**\n     * Check if an inline attachment is present.\n     * @access public\n     * @return boolean\n     */\n    public function inlineImageExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ($attachment[6] == 'inline') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if an attachment (non-inline) is present.\n     * @return boolean\n     */\n    public function attachmentExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ($attachment[6] == 'attachment') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if this message has an alternative body set.\n     * @return boolean\n     */\n    public function alternativeExists()\n    {\n        return !empty($this->AltBody);\n    }\n\n    /**\n     * Clear queued addresses of given kind.\n     * @access protected\n     * @param string $kind 'to', 'cc', or 'bcc'\n     * @return void\n     */\n    public function clearQueuedAddresses($kind)\n    {\n        $RecipientsQueue = $this->RecipientsQueue;\n        foreach ($RecipientsQueue as $address => $params) {\n            if ($params[0] == $kind) {\n                unset($this->RecipientsQueue[$address]);\n            }\n        }\n    }\n\n    /**\n     * Clear all To recipients.\n     * @return void\n     */\n    public function clearAddresses()\n    {\n        foreach ($this->to as $to) {\n            unset($this->all_recipients[strtolower($to[0])]);\n        }\n        $this->to = array();\n        $this->clearQueuedAddresses('to');\n    }\n\n    /**\n     * Clear all CC recipients.\n     * @return void\n     */\n    public function clearCCs()\n    {\n        foreach ($this->cc as $cc) {\n            unset($this->all_recipients[strtolower($cc[0])]);\n        }\n        $this->cc = array();\n        $this->clearQueuedAddresses('cc');\n    }\n\n    /**\n     * Clear all BCC recipients.\n     * @return void\n     */\n    public function clearBCCs()\n    {\n        foreach ($this->bcc as $bcc) {\n            unset($this->all_recipients[strtolower($bcc[0])]);\n        }\n        $this->bcc = array();\n        $this->clearQueuedAddresses('bcc');\n    }\n\n    /**\n     * Clear all ReplyTo recipients.\n     * @return void\n     */\n    public function clearReplyTos()\n    {\n        $this->ReplyTo = array();\n        $this->ReplyToQueue = array();\n    }\n\n    /**\n     * Clear all recipient types.\n     * @return void\n     */\n    public function clearAllRecipients()\n    {\n        $this->to = array();\n        $this->cc = array();\n        $this->bcc = array();\n        $this->all_recipients = array();\n        $this->RecipientsQueue = array();\n    }\n\n    /**\n     * Clear all filesystem, string, and binary attachments.\n     * @return void\n     */\n    public function clearAttachments()\n    {\n        $this->attachment = array();\n    }\n\n    /**\n     * Clear all custom headers.\n     * @return void\n     */\n    public function clearCustomHeaders()\n    {\n        $this->CustomHeader = array();\n    }\n\n    /**\n     * Add an error message to the error container.\n     * @access protected\n     * @param string $msg\n     * @return void\n     */\n    protected function setError($msg)\n    {\n        $this->error_count++;\n        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n            $lasterror = $this->smtp->getError();\n            if (!empty($lasterror['error'])) {\n                $msg .= $this->lang('smtp_error') . $lasterror['error'];\n                if (!empty($lasterror['detail'])) {\n                    $msg .= ' Detail: '. $lasterror['detail'];\n                }\n                if (!empty($lasterror['smtp_code'])) {\n                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n                }\n                if (!empty($lasterror['smtp_code_ex'])) {\n                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n                }\n            }\n        }\n        $this->ErrorInfo = $msg;\n    }\n\n    /**\n     * Return an RFC 822 formatted date.\n     * @access public\n     * @return string\n     * @static\n     */\n    public static function rfcDate()\n    {\n        // Set the time zone to whatever the default is to avoid 500 errors\n        // Will default to UTC if it's not set properly in php.ini\n        date_default_timezone_set(@date_default_timezone_get());\n        return date('D, j M Y H:i:s O');\n    }\n\n    /**\n     * Get the server hostname.\n     * Returns 'localhost.localdomain' if unknown.\n     * @access protected\n     * @return string\n     */\n    protected function serverHostname()\n    {\n        $result = 'localhost.localdomain';\n        if (!empty($this->Hostname)) {\n            $result = $this->Hostname;\n        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n            $result = $_SERVER['SERVER_NAME'];\n        } elseif (function_exists('gethostname') && gethostname() !== false) {\n            $result = gethostname();\n        } elseif (php_uname('n') !== false) {\n            $result = php_uname('n');\n        }\n        return $result;\n    }\n\n    /**\n     * Get an error message in the current language.\n     * @access protected\n     * @param string $key\n     * @return string\n     */\n    protected function lang($key)\n    {\n        if (count($this->language) < 1) {\n            $this->setLanguage('en'); // set the default language\n        }\n\n        if (array_key_exists($key, $this->language)) {\n            if ($key == 'smtp_connect_failed') {\n                //Include a link to troubleshooting docs on SMTP connection failure\n                //this is by far the biggest cause of support questions\n                //but it's usually not PHPMailer's fault.\n                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';\n            }\n            return $this->language[$key];\n        } else {\n            //Return the key as a fallback\n            return $key;\n        }\n    }\n\n    /**\n     * Check if an error occurred.\n     * @access public\n     * @return boolean True if an error did occur.\n     */\n    public function isError()\n    {\n        return ($this->error_count > 0);\n    }\n\n    /**\n     * Ensure consistent line endings in a string.\n     * Changes every end of line from CRLF, CR or LF to $this->LE.\n     * @access public\n     * @param string $str String to fixEOL\n     * @return string\n     */\n    public function fixEOL($str)\n    {\n        // Normalise to \\n\n        $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n        // Now convert LE as needed\n        if ($this->LE !== \"\\n\") {\n            $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n        }\n        return $nstr;\n    }\n\n    /**\n     * Add a custom header.\n     * $name value can be overloaded to contain\n     * both header name and value (name:value)\n     * @access public\n     * @param string $name Custom header name\n     * @param string $value Header value\n     * @return void\n     */\n    public function addCustomHeader($name, $value = null)\n    {\n        if ($value === null) {\n            // Value passed in as name:value\n            $this->CustomHeader[] = explode(':', $name, 2);\n        } else {\n            $this->CustomHeader[] = array($name, $value);\n        }\n    }\n\n    /**\n     * Returns all custom headers.\n     * @return array\n     */\n    public function getCustomHeaders()\n    {\n        return $this->CustomHeader;\n    }\n\n    /**\n     * Create a message body from an HTML string.\n     * Automatically inlines images and creates a plain-text version by converting the HTML,\n     * overwriting any existing values in Body and AltBody.\n     * Do not source $message content from user input!\n     * $basedir is prepended when handling relative URLs, e.g. <img src=\"/images/a.png\"> and must not be empty\n     * will look for an image file in $basedir/images/a.png and convert it to inline.\n     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n     * @access public\n     * @param string $message HTML message string\n     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n     * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n     *    or your own custom converter @see PHPMailer::html2text()\n     * @return string $message The transformed message Body\n     */\n    public function msgHTML($message, $basedir = '', $advanced = false)\n    {\n        preg_match_all('/(src|background)=[\"\\'](.*)[\"\\']/Ui', $message, $images);\n        if (array_key_exists(2, $images)) {\n            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {\n                // Ensure $basedir has a trailing /\n                $basedir .= '/';\n            }\n            foreach ($images[2] as $imgindex => $url) {\n                // Convert data URIs into embedded images\n                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n                    $data = substr($url, strpos($url, ','));\n                    if ($match[2]) {\n                        $data = base64_decode($data);\n                    } else {\n                        $data = rawurldecode($data);\n                    }\n                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2\n                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n                        $message = str_replace(\n                            $images[0][$imgindex],\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                    continue;\n                }\n                if (\n                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n                    !empty($basedir)\n                    // Ignore URLs containing parent dir traversal (..)\n                    && (strpos($url, '..') === false)\n                    // Do not change urls that are already inline images\n                    && substr($url, 0, 4) !== 'cid:'\n                    // Do not change absolute URLs, including anonymous protocol\n                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)\n                ) {\n                    $filename = basename($url);\n                    $directory = dirname($url);\n                    if ($directory == '.') {\n                        $directory = '';\n                    }\n                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2\n                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {\n                        $directory .= '/';\n                    }\n                    if ($this->addEmbeddedImage(\n                        $basedir . $directory . $filename,\n                        $cid,\n                        $filename,\n                        'base64',\n                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n                    )\n                    ) {\n                        $message = preg_replace(\n                            '/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '/') . '[\"\\']/Ui',\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                }\n            }\n        }\n        $this->isHTML(true);\n        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n        $this->Body = $this->normalizeBreaks($message);\n        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n        if (!$this->alternativeExists()) {\n            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n                self::CRLF . self::CRLF;\n        }\n        return $this->Body;\n    }\n\n    /**\n     * Convert an HTML string into plain text.\n     * This is used by msgHTML().\n     * Note - older versions of this function used a bundled advanced converter\n     * which was been removed for license reasons in #232.\n     * Example usage:\n     * <code>\n     * // Use default conversion\n     * $plain = $mail->html2text($html);\n     * // Use your own custom converter\n     * $plain = $mail->html2text($html, function($html) {\n     *     $converter = new MyHtml2text($html);\n     *     return $converter->get_text();\n     * });\n     * </code>\n     * @param string $html The HTML text to convert\n     * @param boolean|callable $advanced Any boolean value to use the internal converter,\n     *   or provide your own callable for custom conversion.\n     * @return string\n     */\n    public function html2text($html, $advanced = false)\n    {\n        if (is_callable($advanced)) {\n            return call_user_func($advanced, $html);\n        }\n        return html_entity_decode(\n            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\\/\\\\1>/si', '', $html))),\n            ENT_QUOTES,\n            $this->CharSet\n        );\n    }\n\n    /**\n     * Get the MIME type for a file extension.\n     * @param string $ext File extension\n     * @access public\n     * @return string MIME type of file.\n     * @static\n     */\n    public static function _mime_types($ext = '')\n    {\n        $mimes = array(\n            'xl'    => 'application/excel',\n            'js'    => 'application/javascript',\n            'hqx'   => 'application/mac-binhex40',\n            'cpt'   => 'application/mac-compactpro',\n            'bin'   => 'application/macbinary',\n            'doc'   => 'application/msword',\n            'word'  => 'application/msword',\n            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',\n            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n            'class' => 'application/octet-stream',\n            'dll'   => 'application/octet-stream',\n            'dms'   => 'application/octet-stream',\n            'exe'   => 'application/octet-stream',\n            'lha'   => 'application/octet-stream',\n            'lzh'   => 'application/octet-stream',\n            'psd'   => 'application/octet-stream',\n            'sea'   => 'application/octet-stream',\n            'so'    => 'application/octet-stream',\n            'oda'   => 'application/oda',\n            'pdf'   => 'application/pdf',\n            'ai'    => 'application/postscript',\n            'eps'   => 'application/postscript',\n            'ps'    => 'application/postscript',\n            'smi'   => 'application/smil',\n            'smil'  => 'application/smil',\n            'mif'   => 'application/vnd.mif',\n            'xls'   => 'application/vnd.ms-excel',\n            'ppt'   => 'application/vnd.ms-powerpoint',\n            'wbxml' => 'application/vnd.wap.wbxml',\n            'wmlc'  => 'application/vnd.wap.wmlc',\n            'dcr'   => 'application/x-director',\n            'dir'   => 'application/x-director',\n            'dxr'   => 'application/x-director',\n            'dvi'   => 'application/x-dvi',\n            'gtar'  => 'application/x-gtar',\n            'php3'  => 'application/x-httpd-php',\n            'php4'  => 'application/x-httpd-php',\n            'php'   => 'application/x-httpd-php',\n            'phtml' => 'application/x-httpd-php',\n            'phps'  => 'application/x-httpd-php-source',\n            'swf'   => 'application/x-shockwave-flash',\n            'sit'   => 'application/x-stuffit',\n            'tar'   => 'application/x-tar',\n            'tgz'   => 'application/x-tar',\n            'xht'   => 'application/xhtml+xml',\n            'xhtml' => 'application/xhtml+xml',\n            'zip'   => 'application/zip',\n            'mid'   => 'audio/midi',\n            'midi'  => 'audio/midi',\n            'mp2'   => 'audio/mpeg',\n            'mp3'   => 'audio/mpeg',\n            'mpga'  => 'audio/mpeg',\n            'aif'   => 'audio/x-aiff',\n            'aifc'  => 'audio/x-aiff',\n            'aiff'  => 'audio/x-aiff',\n            'ram'   => 'audio/x-pn-realaudio',\n            'rm'    => 'audio/x-pn-realaudio',\n            'rpm'   => 'audio/x-pn-realaudio-plugin',\n            'ra'    => 'audio/x-realaudio',\n            'wav'   => 'audio/x-wav',\n            'bmp'   => 'image/bmp',\n            'gif'   => 'image/gif',\n            'jpeg'  => 'image/jpeg',\n            'jpe'   => 'image/jpeg',\n            'jpg'   => 'image/jpeg',\n            'png'   => 'image/png',\n            'tiff'  => 'image/tiff',\n            'tif'   => 'image/tiff',\n            'eml'   => 'message/rfc822',\n            'css'   => 'text/css',\n            'html'  => 'text/html',\n            'htm'   => 'text/html',\n            'shtml' => 'text/html',\n            'log'   => 'text/plain',\n            'text'  => 'text/plain',\n            'txt'   => 'text/plain',\n            'rtx'   => 'text/richtext',\n            'rtf'   => 'text/rtf',\n            'vcf'   => 'text/vcard',\n            'vcard' => 'text/vcard',\n            'xml'   => 'text/xml',\n            'xsl'   => 'text/xml',\n            'mpeg'  => 'video/mpeg',\n            'mpe'   => 'video/mpeg',\n            'mpg'   => 'video/mpeg',\n            'mov'   => 'video/quicktime',\n            'qt'    => 'video/quicktime',\n            'rv'    => 'video/vnd.rn-realvideo',\n            'avi'   => 'video/x-msvideo',\n            'movie' => 'video/x-sgi-movie'\n        );\n        if (array_key_exists(strtolower($ext), $mimes)) {\n            return $mimes[strtolower($ext)];\n        }\n        return 'application/octet-stream';\n    }\n\n    /**\n     * Map a file name to a MIME type.\n     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.\n     * @param string $filename A file name or full path, does not need to exist as a file\n     * @return string\n     * @static\n     */\n    public static function filenameToType($filename)\n    {\n        // In case the path is a URL, strip any query string before getting extension\n        $qpos = strpos($filename, '?');\n        if (false !== $qpos) {\n            $filename = substr($filename, 0, $qpos);\n        }\n        $pathinfo = self::mb_pathinfo($filename);\n        return self::_mime_types($pathinfo['extension']);\n    }\n\n    /**\n     * Multi-byte-safe pathinfo replacement.\n     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n     * Works similarly to the one in PHP >= 5.2.0\n     * @link http://www.php.net/manual/en/function.pathinfo.php#107461\n     * @param string $path A filename or path, does not need to exist as a file\n     * @param integer|string $options Either a PATHINFO_* constant,\n     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n     * @return string|array\n     * @static\n     */\n    public static function mb_pathinfo($path, $options = null)\n    {\n        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n        $pathinfo = array();\n        if (preg_match('%^(.*?)[\\\\\\\\/]*(([^/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\/]+?)|))[\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n            if (array_key_exists(1, $pathinfo)) {\n                $ret['dirname'] = $pathinfo[1];\n            }\n            if (array_key_exists(2, $pathinfo)) {\n                $ret['basename'] = $pathinfo[2];\n            }\n            if (array_key_exists(5, $pathinfo)) {\n                $ret['extension'] = $pathinfo[5];\n            }\n            if (array_key_exists(3, $pathinfo)) {\n                $ret['filename'] = $pathinfo[3];\n            }\n        }\n        switch ($options) {\n            case PATHINFO_DIRNAME:\n            case 'dirname':\n                return $ret['dirname'];\n            case PATHINFO_BASENAME:\n            case 'basename':\n                return $ret['basename'];\n            case PATHINFO_EXTENSION:\n            case 'extension':\n                return $ret['extension'];\n            case PATHINFO_FILENAME:\n            case 'filename':\n                return $ret['filename'];\n            default:\n                return $ret;\n        }\n    }\n\n    /**\n     * Set or reset instance properties.\n     * You should avoid this function - it's more verbose, less efficient, more error-prone and\n     * harder to debug than setting properties directly.\n     * Usage Example:\n     * `$mail->set('SMTPSecure', 'tls');`\n     *   is the same as:\n     * `$mail->SMTPSecure = 'tls';`\n     * @access public\n     * @param string $name The property name to set\n     * @param mixed $value The value to set the property to\n     * @return boolean\n     * @TODO Should this not be using the __set() magic function?\n     */\n    public function set($name, $value = '')\n    {\n        if (property_exists($this, $name)) {\n            $this->$name = $value;\n            return true;\n        } else {\n            $this->setError($this->lang('variable_set') . $name);\n            return false;\n        }\n    }\n\n    /**\n     * Strip newlines to prevent header injection.\n     * @access public\n     * @param string $str\n     * @return string\n     */\n    public function secureHeader($str)\n    {\n        return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n    }\n\n    /**\n     * Normalize line breaks in a string.\n     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n     * @param string $text\n     * @param string $breaktype What kind of line break to use, defaults to CRLF\n     * @return string\n     * @access public\n     * @static\n     */\n    public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n    {\n        return preg_replace('/(\\r\\n|\\r|\\n)/ms', $breaktype, $text);\n    }\n\n    /**\n     * Set the public and private key files and password for S/MIME signing.\n     * @access public\n     * @param string $cert_filename\n     * @param string $key_filename\n     * @param string $key_pass Password for private key\n     * @param string $extracerts_filename Optional path to chain certificate\n     */\n    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n    {\n        $this->sign_cert_file = $cert_filename;\n        $this->sign_key_file = $key_filename;\n        $this->sign_key_pass = $key_pass;\n        $this->sign_extracerts_file = $extracerts_filename;\n    }\n\n    /**\n     * Quoted-Printable-encode a DKIM header.\n     * @access public\n     * @param string $txt\n     * @return string\n     */\n    public function DKIM_QP($txt)\n    {\n        $line = '';\n        for ($i = 0; $i < strlen($txt); $i++) {\n            $ord = ord($txt[$i]);\n            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n                $line .= $txt[$i];\n            } else {\n                $line .= '=' . sprintf('%02X', $ord);\n            }\n        }\n        return $line;\n    }\n\n    /**\n     * Generate a DKIM signature.\n     * @access public\n     * @param string $signHeader\n     * @throws phpmailerException\n     * @return string The DKIM signature value\n     */\n    public function DKIM_Sign($signHeader)\n    {\n        if (!defined('PKCS7_TEXT')) {\n            if ($this->exceptions) {\n                throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n            }\n            return '';\n        }\n        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n        if ('' != $this->DKIM_passphrase) {\n            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n        } else {\n            $privKey = openssl_pkey_get_private($privKeyStr);\n        }\n        //Workaround for missing digest algorithms in old PHP & OpenSSL versions\n        //@link http://stackoverflow.com/a/11117338/333340\n        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n                openssl_pkey_free($privKey);\n                return base64_encode($signature);\n            }\n        } else {\n            $pinfo = openssl_pkey_get_details($privKey);\n            $hash = hash('sha256', $signHeader);\n            //'Magic' constant for SHA256 from RFC3447\n            //@link https://tools.ietf.org/html/rfc3447#page-43\n            $t = '3031300d060960864801650304020105000420' . $hash;\n            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);\n            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n                openssl_pkey_free($privKey);\n                return base64_encode($signature);\n            }\n        }\n        openssl_pkey_free($privKey);\n        return '';\n    }\n\n    /**\n     * Generate a DKIM canonicalization header.\n     * @access public\n     * @param string $signHeader Header\n     * @return string\n     */\n    public function DKIM_HeaderC($signHeader)\n    {\n        $signHeader = preg_replace('/\\r\\n\\s+/', ' ', $signHeader);\n        $lines = explode(\"\\r\\n\", $signHeader);\n        foreach ($lines as $key => $line) {\n            list($heading, $value) = explode(':', $line, 2);\n            $heading = strtolower($heading);\n            $value = preg_replace('/\\s{2,}/', ' ', $value); // Compress useless spaces\n            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value\n        }\n        $signHeader = implode(\"\\r\\n\", $lines);\n        return $signHeader;\n    }\n\n    /**\n     * Generate a DKIM canonicalization body.\n     * @access public\n     * @param string $body Message Body\n     * @return string\n     */\n    public function DKIM_BodyC($body)\n    {\n        if ($body == '') {\n            return \"\\r\\n\";\n        }\n        // stabilize line endings\n        $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n        $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n        // END stabilize line endings\n        while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n            $body = substr($body, 0, strlen($body) - 2);\n        }\n        return $body;\n    }\n\n    /**\n     * Create the DKIM header and body in a new message header.\n     * @access public\n     * @param string $headers_line Header lines\n     * @param string $subject Subject\n     * @param string $body Body\n     * @return string\n     */\n    public function DKIM_Add($headers_line, $subject, $body)\n    {\n        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms\n        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body\n        $DKIMquery = 'dns/txt'; // Query method\n        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n        $subject_header = \"Subject: $subject\";\n        $headers = explode($this->LE, $headers_line);\n        $from_header = '';\n        $to_header = '';\n        $date_header = '';\n        $current = '';\n        foreach ($headers as $header) {\n            if (strpos($header, 'From:') === 0) {\n                $from_header = $header;\n                $current = 'from_header';\n            } elseif (strpos($header, 'To:') === 0) {\n                $to_header = $header;\n                $current = 'to_header';\n            } elseif (strpos($header, 'Date:') === 0) {\n                $date_header = $header;\n                $current = 'date_header';\n            } else {\n                if (!empty($$current) && strpos($header, ' =?') === 0) {\n                    $$current .= $header;\n                } else {\n                    $current = '';\n                }\n            }\n        }\n        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n        $subject = str_replace(\n            '|',\n            '=7C',\n            $this->DKIM_QP($subject_header)\n        ); // Copied header fields (dkim-quoted-printable)\n        $body = $this->DKIM_BodyC($body);\n        $DKIMlen = strlen($body); // Length of body\n        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body\n        if ('' == $this->DKIM_identity) {\n            $ident = '';\n        } else {\n            $ident = ' i=' . $this->DKIM_identity . ';';\n        }\n        $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n            $DKIMsignatureType . '; q=' .\n            $DKIMquery . '; l=' .\n            $DKIMlen . '; s=' .\n            $this->DKIM_selector .\n            \";\\r\\n\" .\n            \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n            \"\\th=From:To:Date:Subject;\\r\\n\" .\n            \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n            \"\\tz=$from\\r\\n\" .\n            \"\\t|$to\\r\\n\" .\n            \"\\t|$date\\r\\n\" .\n            \"\\t|$subject;\\r\\n\" .\n            \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n            \"\\tb=\";\n        $toSign = $this->DKIM_HeaderC(\n            $from_header . \"\\r\\n\" .\n            $to_header . \"\\r\\n\" .\n            $date_header . \"\\r\\n\" .\n            $subject_header . \"\\r\\n\" .\n            $dkimhdrs\n        );\n        $signed = $this->DKIM_Sign($toSign);\n        return $dkimhdrs . $signed . \"\\r\\n\";\n    }\n\n    /**\n     * Detect if a string contains a line longer than the maximum line length allowed.\n     * @param string $str\n     * @return boolean\n     * @static\n     */\n    public static function hasLineLongerThanMax($str)\n    {\n        //+2 to include CRLF line break for a 1000 total\n        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);\n    }\n\n    /**\n     * Allows for public read access to 'to' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getToAddresses()\n    {\n        return $this->to;\n    }\n\n    /**\n     * Allows for public read access to 'cc' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getCcAddresses()\n    {\n        return $this->cc;\n    }\n\n    /**\n     * Allows for public read access to 'bcc' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getBccAddresses()\n    {\n        return $this->bcc;\n    }\n\n    /**\n     * Allows for public read access to 'ReplyTo' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getReplyToAddresses()\n    {\n        return $this->ReplyTo;\n    }\n\n    /**\n     * Allows for public read access to 'all_recipients' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getAllRecipientAddresses()\n    {\n        return $this->all_recipients;\n    }\n\n    /**\n     * Perform a callback.\n     * @param boolean $isSent\n     * @param array $to\n     * @param array $cc\n     * @param array $bcc\n     * @param string $subject\n     * @param string $body\n     * @param string $from\n     */\n    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n    {\n        if (!empty($this->action_function) && is_callable($this->action_function)) {\n            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n            call_user_func_array($this->action_function, $params);\n        }\n    }\n}\n\n/**\n * PHPMailer exception handler\n * @package PHPMailer\n */\nclass phpmailerException extends Exception\n{\n    /**\n     * Prettify error message output\n     * @return string\n     */\n    public function errorMessage()\n    {\n        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"</strong><br />\\n\";\n        return $errorMsg;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/class.phpmaileroauth.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.4\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailerOAuth - PHPMailer subclass adding OAuth support.\n * @package PHPMailer\n * @author @sherryl4george\n * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>\n */\nclass PHPMailerOAuth extends PHPMailer\n{\n    /**\n     * The OAuth user's email address\n     * @var string\n     */\n    public $oauthUserEmail = '';\n\n    /**\n     * The OAuth refresh token\n     * @var string\n     */\n    public $oauthRefreshToken = '';\n\n    /**\n     * The OAuth client ID\n     * @var string\n     */\n    public $oauthClientId = '';\n\n    /**\n     * The OAuth client secret\n     * @var string\n     */\n    public $oauthClientSecret = '';\n\n    /**\n     * An instance of the PHPMailerOAuthGoogle class.\n     * @var PHPMailerOAuthGoogle\n     * @access protected\n     */\n    protected $oauth = null;\n\n    /**\n     * Get a PHPMailerOAuthGoogle instance to use.\n     * @return PHPMailerOAuthGoogle\n     */\n    public function getOAUTHInstance()\n    {\n        if (!is_object($this->oauth)) {\n            $this->oauth = new PHPMailerOAuthGoogle(\n                $this->oauthUserEmail,\n                $this->oauthClientSecret,\n                $this->oauthClientId,\n                $this->oauthRefreshToken\n            );\n        }\n        return $this->oauth;\n    }\n\n    /**\n     * Initiate a connection to an SMTP server.\n     * Overrides the original smtpConnect method to add support for OAuth.\n     * @param array $options An array of options compatible with stream_context_create()\n     * @uses SMTP\n     * @access public\n     * @return bool\n     * @throws phpmailerException\n     */\n    public function smtpConnect($options = array())\n    {\n        if (is_null($this->smtp)) {\n            $this->smtp = $this->getSMTPInstance();\n        }\n\n        if (is_null($this->oauth)) {\n            $this->oauth = $this->getOAUTHInstance();\n        }\n\n        // Already connected?\n        if ($this->smtp->connected()) {\n            return true;\n        }\n\n        $this->smtp->setTimeout($this->Timeout);\n        $this->smtp->setDebugLevel($this->SMTPDebug);\n        $this->smtp->setDebugOutput($this->Debugoutput);\n        $this->smtp->setVerp($this->do_verp);\n        $hosts = explode(';', $this->Host);\n        $lastexception = null;\n\n        foreach ($hosts as $hostentry) {\n            $hostinfo = array();\n            if (!preg_match('/^((ssl|tls):\\/\\/)*([a-zA-Z0-9\\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {\n                // Not a valid host entry\n                continue;\n            }\n            // $hostinfo[2]: optional ssl or tls prefix\n            // $hostinfo[3]: the hostname\n            // $hostinfo[4]: optional port number\n            // The host string prefix can temporarily override the current setting for SMTPSecure\n            // If it's not specified, the default value is used\n            $prefix = '';\n            $secure = $this->SMTPSecure;\n            $tls = ($this->SMTPSecure == 'tls');\n            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n                $prefix = 'ssl://';\n                $tls = false; // Can't have SSL and TLS at the same time\n                $secure = 'ssl';\n            } elseif ($hostinfo[2] == 'tls') {\n                $tls = true;\n                // tls doesn't use a prefix\n                $secure = 'tls';\n            }\n            //Do we need the OpenSSL extension?\n            $sslext = defined('OPENSSL_ALGO_SHA1');\n            if ('tls' === $secure or 'ssl' === $secure) {\n                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n                if (!$sslext) {\n                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n                }\n            }\n            $host = $hostinfo[3];\n            $port = $this->Port;\n            $tport = (integer)$hostinfo[4];\n            if ($tport > 0 and $tport < 65536) {\n                $port = $tport;\n            }\n            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n                try {\n                    if ($this->Helo) {\n                        $hello = $this->Helo;\n                    } else {\n                        $hello = $this->serverHostname();\n                    }\n                    $this->smtp->hello($hello);\n                    //Automatically enable TLS encryption if:\n                    // * it's not disabled\n                    // * we have openssl extension\n                    // * we are not already using SSL\n                    // * the server offers STARTTLS\n                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n                        $tls = true;\n                    }\n                    if ($tls) {\n                        if (!$this->smtp->startTLS()) {\n                            throw new phpmailerException($this->lang('connect_host'));\n                        }\n                        // We must resend HELO after tls negotiation\n                        $this->smtp->hello($hello);\n                    }\n                    if ($this->SMTPAuth) {\n                        if (!$this->smtp->authenticate(\n                            $this->Username,\n                            $this->Password,\n                            $this->AuthType,\n                            $this->Realm,\n                            $this->Workstation,\n                            $this->oauth\n                        )\n                        ) {\n                            throw new phpmailerException($this->lang('authenticate'));\n                        }\n                    }\n                    return true;\n                } catch (phpmailerException $exc) {\n                    $lastexception = $exc;\n                    $this->edebug($exc->getMessage());\n                    // We must have connected, but then failed TLS or Auth, so close connection nicely\n                    $this->smtp->quit();\n                }\n            }\n        }\n        // If we get here, all connection attempts have failed, so close connection hard\n        $this->smtp->close();\n        // As we've caught all exceptions, just report whatever the last one was\n        if ($this->exceptions and !is_null($lastexception)) {\n            throw $lastexception;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/class.phpmaileroauthgoogle.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.4\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailerOAuthGoogle - Wrapper for League OAuth2 Google provider.\n * @package PHPMailer\n * @author @sherryl4george\n * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>\n * @link https://github.com/thephpleague/oauth2-client\n */\nclass PHPMailerOAuthGoogle\n{\n    private $oauthUserEmail = '';\n    private $oauthRefreshToken = '';\n    private $oauthClientId = '';\n    private $oauthClientSecret = '';\n\n    /**\n     * @param string $UserEmail\n     * @param string $ClientSecret\n     * @param string $ClientId\n     * @param string $RefreshToken\n     */\n    public function __construct(\n        $UserEmail,\n        $ClientSecret,\n        $ClientId,\n        $RefreshToken\n    ) {\n        $this->oauthClientId = $ClientId;\n        $this->oauthClientSecret = $ClientSecret;\n        $this->oauthRefreshToken = $RefreshToken;\n        $this->oauthUserEmail = $UserEmail;\n    }\n\n    private function getProvider()\n    {\n        return new League\\OAuth2\\Client\\Provider\\Google([\n            'clientId' => $this->oauthClientId,\n            'clientSecret' => $this->oauthClientSecret\n        ]);\n    }\n\n    private function getGrant()\n    {\n        return new \\League\\OAuth2\\Client\\Grant\\RefreshToken();\n    }\n\n    private function getToken()\n    {\n        $provider = $this->getProvider();\n        $grant = $this->getGrant();\n        return $provider->getAccessToken($grant, ['refresh_token' => $this->oauthRefreshToken]);\n    }\n\n    public function getOauth64()\n    {\n        $token = $this->getToken();\n        return base64_encode(\"user=\" . $this->oauthUserEmail . \"\\001auth=Bearer \" . $token . \"\\001\\001\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/class.pop3.php",
    "content": "<?php\n/**\n * PHPMailer POP-Before-SMTP Authentication Class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer POP-Before-SMTP Authentication Class.\n * Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication.\n * Does not support APOP.\n * @package PHPMailer\n * @author Richard Davey (original author) <rich@corephp.co.uk>\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n */\nclass POP3\n{\n    /**\n     * The POP3 PHPMailer Version number.\n     * @var string\n     * @access public\n     */\n    public $Version = '5.2.24';\n\n    /**\n     * Default POP3 port number.\n     * @var integer\n     * @access public\n     */\n    public $POP3_PORT = 110;\n\n    /**\n     * Default timeout in seconds.\n     * @var integer\n     * @access public\n     */\n    public $POP3_TIMEOUT = 30;\n\n    /**\n     * POP3 Carriage Return + Line Feed.\n     * @var string\n     * @access public\n     * @deprecated Use the constant instead\n     */\n    public $CRLF = \"\\r\\n\";\n\n    /**\n     * Debug display level.\n     * Options: 0 = no, 1+ = yes\n     * @var integer\n     * @access public\n     */\n    public $do_debug = 0;\n\n    /**\n     * POP3 mail server hostname.\n     * @var string\n     * @access public\n     */\n    public $host;\n\n    /**\n     * POP3 port number.\n     * @var integer\n     * @access public\n     */\n    public $port;\n\n    /**\n     * POP3 Timeout Value in seconds.\n     * @var integer\n     * @access public\n     */\n    public $tval;\n\n    /**\n     * POP3 username\n     * @var string\n     * @access public\n     */\n    public $username;\n\n    /**\n     * POP3 password.\n     * @var string\n     * @access public\n     */\n    public $password;\n\n    /**\n     * Resource handle for the POP3 connection socket.\n     * @var resource\n     * @access protected\n     */\n    protected $pop_conn;\n\n    /**\n     * Are we connected?\n     * @var boolean\n     * @access protected\n     */\n    protected $connected = false;\n\n    /**\n     * Error container.\n     * @var array\n     * @access protected\n     */\n    protected $errors = array();\n\n    /**\n     * Line break constant\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * Simple static wrapper for all-in-one POP before SMTP\n     * @param $host\n     * @param integer|boolean $port The port number to connect to\n     * @param integer|boolean $timeout The timeout value\n     * @param string $username\n     * @param string $password\n     * @param integer $debug_level\n     * @return boolean\n     */\n    public static function popBeforeSmtp(\n        $host,\n        $port = false,\n        $timeout = false,\n        $username = '',\n        $password = '',\n        $debug_level = 0\n    ) {\n        $pop = new POP3;\n        return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);\n    }\n\n    /**\n     * Authenticate with a POP3 server.\n     * A connect, login, disconnect sequence\n     * appropriate for POP-before SMTP authorisation.\n     * @access public\n     * @param string $host The hostname to connect to\n     * @param integer|boolean $port The port number to connect to\n     * @param integer|boolean $timeout The timeout value\n     * @param string $username\n     * @param string $password\n     * @param integer $debug_level\n     * @return boolean\n     */\n    public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)\n    {\n        $this->host = $host;\n        // If no port value provided, use default\n        if (false === $port) {\n            $this->port = $this->POP3_PORT;\n        } else {\n            $this->port = (integer)$port;\n        }\n        // If no timeout value provided, use default\n        if (false === $timeout) {\n            $this->tval = $this->POP3_TIMEOUT;\n        } else {\n            $this->tval = (integer)$timeout;\n        }\n        $this->do_debug = $debug_level;\n        $this->username = $username;\n        $this->password = $password;\n        //  Reset the error log\n        $this->errors = array();\n        //  connect\n        $result = $this->connect($this->host, $this->port, $this->tval);\n        if ($result) {\n            $login_result = $this->login($this->username, $this->password);\n            if ($login_result) {\n                $this->disconnect();\n                return true;\n            }\n        }\n        // We need to disconnect regardless of whether the login succeeded\n        $this->disconnect();\n        return false;\n    }\n\n    /**\n     * Connect to a POP3 server.\n     * @access public\n     * @param string $host\n     * @param integer|boolean $port\n     * @param integer $tval\n     * @return boolean\n     */\n    public function connect($host, $port = false, $tval = 30)\n    {\n        //  Are we already connected?\n        if ($this->connected) {\n            return true;\n        }\n\n        //On Windows this will raise a PHP Warning error if the hostname doesn't exist.\n        //Rather than suppress it with @fsockopen, capture it cleanly instead\n        set_error_handler(array($this, 'catchWarning'));\n\n        if (false === $port) {\n            $port = $this->POP3_PORT;\n        }\n\n        //  connect to the POP3 server\n        $this->pop_conn = fsockopen(\n            $host, //  POP3 Host\n            $port, //  Port #\n            $errno, //  Error Number\n            $errstr, //  Error Message\n            $tval\n        ); //  Timeout (seconds)\n        //  Restore the error handler\n        restore_error_handler();\n\n        //  Did we connect?\n        if (false === $this->pop_conn) {\n            //  It would appear not...\n            $this->setError(array(\n                'error' => \"Failed to connect to server $host on port $port\",\n                'errno' => $errno,\n                'errstr' => $errstr\n            ));\n            return false;\n        }\n\n        //  Increase the stream time-out\n        stream_set_timeout($this->pop_conn, $tval, 0);\n\n        //  Get the POP3 server response\n        $pop3_response = $this->getResponse();\n        //  Check for the +OK\n        if ($this->checkResponse($pop3_response)) {\n            //  The connection is established and the POP3 server is talking\n            $this->connected = true;\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Log in to the POP3 server.\n     * Does not support APOP (RFC 2828, 4949).\n     * @access public\n     * @param string $username\n     * @param string $password\n     * @return boolean\n     */\n    public function login($username = '', $password = '')\n    {\n        if (!$this->connected) {\n            $this->setError('Not connected to POP3 server');\n        }\n        if (empty($username)) {\n            $username = $this->username;\n        }\n        if (empty($password)) {\n            $password = $this->password;\n        }\n\n        // Send the Username\n        $this->sendString(\"USER $username\" . self::CRLF);\n        $pop3_response = $this->getResponse();\n        if ($this->checkResponse($pop3_response)) {\n            // Send the Password\n            $this->sendString(\"PASS $password\" . self::CRLF);\n            $pop3_response = $this->getResponse();\n            if ($this->checkResponse($pop3_response)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Disconnect from the POP3 server.\n     * @access public\n     */\n    public function disconnect()\n    {\n        $this->sendString('QUIT');\n        //The QUIT command may cause the daemon to exit, which will kill our connection\n        //So ignore errors here\n        try {\n            @fclose($this->pop_conn);\n        } catch (Exception $e) {\n            //Do nothing\n        };\n    }\n\n    /**\n     * Get a response from the POP3 server.\n     * $size is the maximum number of bytes to retrieve\n     * @param integer $size\n     * @return string\n     * @access protected\n     */\n    protected function getResponse($size = 128)\n    {\n        $response = fgets($this->pop_conn, $size);\n        if ($this->do_debug >= 1) {\n            echo \"Server -> Client: $response\";\n        }\n        return $response;\n    }\n\n    /**\n     * Send raw data to the POP3 server.\n     * @param string $string\n     * @return integer\n     * @access protected\n     */\n    protected function sendString($string)\n    {\n        if ($this->pop_conn) {\n            if ($this->do_debug >= 2) { //Show client messages when debug >= 2\n                echo \"Client -> Server: $string\";\n            }\n            return fwrite($this->pop_conn, $string, strlen($string));\n        }\n        return 0;\n    }\n\n    /**\n     * Checks the POP3 server response.\n     * Looks for for +OK or -ERR.\n     * @param string $string\n     * @return boolean\n     * @access protected\n     */\n    protected function checkResponse($string)\n    {\n        if (substr($string, 0, 3) !== '+OK') {\n            $this->setError(array(\n                'error' => \"Server reported an error: $string\",\n                'errno' => 0,\n                'errstr' => ''\n            ));\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    /**\n     * Add an error to the internal error store.\n     * Also display debug output if it's enabled.\n     * @param $error\n     * @access protected\n     */\n    protected function setError($error)\n    {\n        $this->errors[] = $error;\n        if ($this->do_debug >= 1) {\n            echo '<pre>';\n            foreach ($this->errors as $error) {\n                print_r($error);\n            }\n            echo '</pre>';\n        }\n    }\n\n    /**\n     * Get an array of error messages, if any.\n     * @return array\n     */\n    public function getErrors()\n    {\n        return $this->errors;\n    }\n\n    /**\n     * POP3 connection error handler.\n     * @param integer $errno\n     * @param string $errstr\n     * @param string $errfile\n     * @param integer $errline\n     * @access protected\n     */\n    protected function catchWarning($errno, $errstr, $errfile, $errline)\n    {\n        $this->setError(array(\n            'error' => \"Connecting to the POP3 server raised a PHP warning: \",\n            'errno' => $errno,\n            'errstr' => $errstr,\n            'errfile' => $errfile,\n            'errline' => $errline\n        ));\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/class.smtp.php",
    "content": "<?php\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.\n * @package PHPMailer\n * @author Chris Ryan\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n */\nclass SMTP\n{\n    /**\n     * The PHPMailer SMTP version number.\n     * @var string\n     */\n    const VERSION = '5.2.24';\n\n    /**\n     * SMTP line break constant.\n     * @var string\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * The SMTP port to use if one is not specified.\n     * @var integer\n     */\n    const DEFAULT_SMTP_PORT = 25;\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1\n     * @var integer\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * Debug level for no output\n     */\n    const DEBUG_OFF = 0;\n\n    /**\n     * Debug level to show client -> server messages\n     */\n    const DEBUG_CLIENT = 1;\n\n    /**\n     * Debug level to show client -> server and server -> client messages\n     */\n    const DEBUG_SERVER = 2;\n\n    /**\n     * Debug level to show connection status, client -> server and server -> client messages\n     */\n    const DEBUG_CONNECTION = 3;\n\n    /**\n     * Debug level to show all messages\n     */\n    const DEBUG_LOWLEVEL = 4;\n\n    /**\n     * The PHPMailer SMTP Version number.\n     * @var string\n     * @deprecated Use the `VERSION` constant instead\n     * @see SMTP::VERSION\n     */\n    public $Version = '5.2.24';\n\n    /**\n     * SMTP server port number.\n     * @var integer\n     * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead\n     * @see SMTP::DEFAULT_SMTP_PORT\n     */\n    public $SMTP_PORT = 25;\n\n    /**\n     * SMTP reply line ending.\n     * @var string\n     * @deprecated Use the `CRLF` constant instead\n     * @see SMTP::CRLF\n     */\n    public $CRLF = \"\\r\\n\";\n\n    /**\n     * Debug output level.\n     * Options:\n     * * self::DEBUG_OFF (`0`) No debug output, default\n     * * self::DEBUG_CLIENT (`1`) Client commands\n     * * self::DEBUG_SERVER (`2`) Client commands and server responses\n     * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status\n     * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages\n     * @var integer\n     */\n    public $do_debug = self::DEBUG_OFF;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     *\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     * <code>\n     * $smtp->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * </code>\n     * @var string|callable\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to use VERP.\n     * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @link http://www.postfix.org/VERP_README.html Info on VERP\n     * @var boolean\n     */\n    public $do_verp = false;\n\n    /**\n     * The timeout value for connection, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.\n     * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2\n     * @var integer\n     */\n    public $Timeout = 300;\n\n    /**\n     * How long to wait for commands to complete, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * @var integer\n     */\n    public $Timelimit = 300;\n\n    /**\n     * @var array patterns to extract smtp transaction id from smtp reply\n     * Only first capture group will be use, use non-capturing group to deal with it\n     * Extend this class to override this property to fulfil your needs.\n     */\n    protected $smtp_transaction_id_patterns = array(\n        'exim' => '/[0-9]{3} OK id=(.*)/',\n        'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',\n        'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'\n    );\n\n    /**\n     * The socket for the server connection.\n     * @var resource\n     */\n    protected $smtp_conn;\n\n    /**\n     * Error information, if any, for the last SMTP command.\n     * @var array\n     */\n    protected $error = array(\n        'error' => '',\n        'detail' => '',\n        'smtp_code' => '',\n        'smtp_code_ex' => ''\n    );\n\n    /**\n     * The reply the server sent to us for HELO.\n     * If null, no HELO string has yet been received.\n     * @var string|null\n     */\n    protected $helo_rply = null;\n\n    /**\n     * The set of SMTP extensions sent in reply to EHLO command.\n     * Indexes of the array are extension names.\n     * Value at index 'HELO' or 'EHLO' (according to command that was sent)\n     * represents the server name. In case of HELO it is the only element of the array.\n     * Other values can be boolean TRUE or an array containing extension options.\n     * If null, no HELO/EHLO string has yet been received.\n     * @var array|null\n     */\n    protected $server_caps = null;\n\n    /**\n     * The most recent reply received from the server.\n     * @var string\n     */\n    protected $last_reply = '';\n\n    /**\n     * Output debugging info via a user-selected method.\n     * @see SMTP::$Debugoutput\n     * @see SMTP::$do_debug\n     * @param string $str Debug string to output\n     * @param integer $level The debug level of this message; see DEBUG_* constants\n     * @return void\n     */\n    protected function edebug($str, $level = 0)\n    {\n        if ($level > $this->do_debug) {\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n            call_user_func($this->Debugoutput, $str, $level);\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo gmdate('Y-m-d H:i:s') . ' ' . htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                ) . \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/(\\r\\n|\\r|\\n)/ms', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n                    \"\\n\",\n                    \"\\n                   \\t                  \",\n                    trim($str)\n                ) . \"\\n\";\n        }\n    }\n\n    /**\n     * Connect to an SMTP server.\n     * @param string $host SMTP server IP or host name\n     * @param integer $port The port number to connect to\n     * @param integer $timeout How long to wait for the connection to open\n     * @param array $options An array of options for stream_context_create()\n     * @access public\n     * @return boolean\n     */\n    public function connect($host, $port = null, $timeout = 30, $options = array())\n    {\n        static $streamok;\n        //This is enabled by default since 5.0.0 but some providers disable it\n        //Check this once and cache the result\n        if (is_null($streamok)) {\n            $streamok = function_exists('stream_socket_client');\n        }\n        // Clear errors to avoid confusion\n        $this->setError('');\n        // Make sure we are __not__ connected\n        if ($this->connected()) {\n            // Already connected, generate error\n            $this->setError('Already connected to a server');\n            return false;\n        }\n        if (empty($port)) {\n            $port = self::DEFAULT_SMTP_PORT;\n        }\n        // Connect to the SMTP server\n        $this->edebug(\n            \"Connection: opening to $host:$port, timeout=$timeout, options=\" .\n            var_export($options, true),\n            self::DEBUG_CONNECTION\n        );\n        $errno = 0;\n        $errstr = '';\n        if ($streamok) {\n            $socket_context = stream_context_create($options);\n            set_error_handler(array($this, 'errorHandler'));\n            $this->smtp_conn = stream_socket_client(\n                $host . \":\" . $port,\n                $errno,\n                $errstr,\n                $timeout,\n                STREAM_CLIENT_CONNECT,\n                $socket_context\n            );\n            restore_error_handler();\n        } else {\n            //Fall back to fsockopen which should work in more places, but is missing some features\n            $this->edebug(\n                \"Connection: stream_socket_client not available, falling back to fsockopen\",\n                self::DEBUG_CONNECTION\n            );\n            set_error_handler(array($this, 'errorHandler'));\n            $this->smtp_conn = fsockopen(\n                $host,\n                $port,\n                $errno,\n                $errstr,\n                $timeout\n            );\n            restore_error_handler();\n        }\n        // Verify we connected properly\n        if (!is_resource($this->smtp_conn)) {\n            $this->setError(\n                'Failed to connect to server',\n                $errno,\n                $errstr\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error']\n                . \": $errstr ($errno)\",\n                self::DEBUG_CLIENT\n            );\n            return false;\n        }\n        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);\n        // SMTP server can take longer to respond, give longer timeout for first read\n        // Windows does not have support for this timeout function\n        if (substr(PHP_OS, 0, 3) != 'WIN') {\n            $max = ini_get('max_execution_time');\n            // Don't bother if unlimited\n            if ($max != 0 && $timeout > $max) {\n                @set_time_limit($timeout);\n            }\n            stream_set_timeout($this->smtp_conn, $timeout, 0);\n        }\n        // Get any announcement\n        $announce = $this->get_lines();\n        $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);\n        return true;\n    }\n\n    /**\n     * Initiate a TLS (encrypted) session.\n     * @access public\n     * @return boolean\n     */\n    public function startTLS()\n    {\n        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {\n            return false;\n        }\n\n        //Allow the best TLS version(s) we can\n        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;\n\n        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT\n        //so add them back in manually if we can\n        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {\n            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;\n            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;\n        }\n\n        // Begin encrypted connection\n        set_error_handler(array($this, 'errorHandler'));\n        $crypto_ok = stream_socket_enable_crypto(\n            $this->smtp_conn,\n            true,\n            $crypto_method\n        );\n        restore_error_handler();\n        return $crypto_ok;\n    }\n\n    /**\n     * Perform SMTP authentication.\n     * Must be run after hello().\n     * @see hello()\n     * @param string $username The user name\n     * @param string $password The password\n     * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)\n     * @param string $realm The auth realm for NTLM\n     * @param string $workstation The auth workstation for NTLM\n     * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)\n     * @return bool True if successfully authenticated.* @access public\n     */\n    public function authenticate(\n        $username,\n        $password,\n        $authtype = null,\n        $realm = '',\n        $workstation = '',\n        $OAuth = null\n    ) {\n        if (!$this->server_caps) {\n            $this->setError('Authentication is not allowed before HELO/EHLO');\n            return false;\n        }\n\n        if (array_key_exists('EHLO', $this->server_caps)) {\n            // SMTP extensions are available; try to find a proper authentication method\n            if (!array_key_exists('AUTH', $this->server_caps)) {\n                $this->setError('Authentication is not allowed at this stage');\n                // 'at this stage' means that auth may be allowed after the stage changes\n                // e.g. after STARTTLS\n                return false;\n            }\n\n            self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);\n            self::edebug(\n                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),\n                self::DEBUG_LOWLEVEL\n            );\n\n            if (empty($authtype)) {\n                foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM', 'XOAUTH2') as $method) {\n                    if (in_array($method, $this->server_caps['AUTH'])) {\n                        $authtype = $method;\n                        break;\n                    }\n                }\n                if (empty($authtype)) {\n                    $this->setError('No supported authentication methods found');\n                    return false;\n                }\n                self::edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL);\n            }\n\n            if (!in_array($authtype, $this->server_caps['AUTH'])) {\n                $this->setError(\"The requested authentication method \\\"$authtype\\\" is not supported by the server\");\n                return false;\n            }\n        } elseif (empty($authtype)) {\n            $authtype = 'LOGIN';\n        }\n        switch ($authtype) {\n            case 'PLAIN':\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {\n                    return false;\n                }\n                // Send encoded username and password\n                if (!$this->sendCommand(\n                    'User & Password',\n                    base64_encode(\"\\0\" . $username . \"\\0\" . $password),\n                    235\n                )\n                ) {\n                    return false;\n                }\n                break;\n            case 'LOGIN':\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand(\"Username\", base64_encode($username), 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand(\"Password\", base64_encode($password), 235)) {\n                    return false;\n                }\n                break;\n            case 'XOAUTH2':\n                //If the OAuth Instance is not set. Can be a case when PHPMailer is used\n                //instead of PHPMailerOAuth\n                if (is_null($OAuth)) {\n                    return false;\n                }\n                $oauth = $OAuth->getOauth64();\n\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {\n                    return false;\n                }\n                break;\n            case 'NTLM':\n                /*\n                 * ntlm_sasl_client.php\n                 * Bundled with Permission\n                 *\n                 * How to telnet in windows:\n                 * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx\n                 * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication\n                 */\n                require_once 'extras/ntlm_sasl_client.php';\n                $temp = new stdClass;\n                $ntlm_client = new ntlm_sasl_client_class;\n                //Check that functions are available\n                if (!$ntlm_client->initialize($temp)) {\n                    $this->setError($temp->error);\n                    $this->edebug(\n                        'You need to enable some modules in your php.ini file: '\n                        . $this->error['error'],\n                        self::DEBUG_CLIENT\n                    );\n                    return false;\n                }\n                //msg1\n                $msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1\n\n                if (!$this->sendCommand(\n                    'AUTH NTLM',\n                    'AUTH NTLM ' . base64_encode($msg1),\n                    334\n                )\n                ) {\n                    return false;\n                }\n                //Though 0 based, there is a white space after the 3 digit number\n                //msg2\n                $challenge = substr($this->last_reply, 3);\n                $challenge = base64_decode($challenge);\n                $ntlm_res = $ntlm_client->NTLMResponse(\n                    substr($challenge, 24, 8),\n                    $password\n                );\n                //msg3\n                $msg3 = $ntlm_client->typeMsg3(\n                    $ntlm_res,\n                    $username,\n                    $realm,\n                    $workstation\n                );\n                // send encoded username\n                return $this->sendCommand('Username', base64_encode($msg3), 235);\n            case 'CRAM-MD5':\n                // Start authentication\n                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {\n                    return false;\n                }\n                // Get the challenge\n                $challenge = base64_decode(substr($this->last_reply, 4));\n\n                // Build the response\n                $response = $username . ' ' . $this->hmac($challenge, $password);\n\n                // send encoded credentials\n                return $this->sendCommand('Username', base64_encode($response), 235);\n            default:\n                $this->setError(\"Authentication method \\\"$authtype\\\" is not supported\");\n                return false;\n        }\n        return true;\n    }\n\n    /**\n     * Calculate an MD5 HMAC hash.\n     * Works like hash_hmac('md5', $data, $key)\n     * in case that function is not available\n     * @param string $data The data to hash\n     * @param string $key The key to hash with\n     * @access protected\n     * @return string\n     */\n    protected function hmac($data, $key)\n    {\n        if (function_exists('hash_hmac')) {\n            return hash_hmac('md5', $data, $key);\n        }\n\n        // The following borrowed from\n        // http://php.net/manual/en/function.mhash.php#27225\n\n        // RFC 2104 HMAC implementation for php.\n        // Creates an md5 HMAC.\n        // Eliminates the need to install mhash to compute a HMAC\n        // by Lance Rushing\n\n        $bytelen = 64; // byte length for md5\n        if (strlen($key) > $bytelen) {\n            $key = pack('H*', md5($key));\n        }\n        $key = str_pad($key, $bytelen, chr(0x00));\n        $ipad = str_pad('', $bytelen, chr(0x36));\n        $opad = str_pad('', $bytelen, chr(0x5c));\n        $k_ipad = $key ^ $ipad;\n        $k_opad = $key ^ $opad;\n\n        return md5($k_opad . pack('H*', md5($k_ipad . $data)));\n    }\n\n    /**\n     * Check connection state.\n     * @access public\n     * @return boolean True if connected.\n     */\n    public function connected()\n    {\n        if (is_resource($this->smtp_conn)) {\n            $sock_status = stream_get_meta_data($this->smtp_conn);\n            if ($sock_status['eof']) {\n                // The socket is valid but we are not connected\n                $this->edebug(\n                    'SMTP NOTICE: EOF caught while checking if connected',\n                    self::DEBUG_CLIENT\n                );\n                $this->close();\n                return false;\n            }\n            return true; // everything looks good\n        }\n        return false;\n    }\n\n    /**\n     * Close the socket and clean up the state of the class.\n     * Don't use this function without first trying to use QUIT.\n     * @see quit()\n     * @access public\n     * @return void\n     */\n    public function close()\n    {\n        $this->setError('');\n        $this->server_caps = null;\n        $this->helo_rply = null;\n        if (is_resource($this->smtp_conn)) {\n            // close the connection and cleanup\n            fclose($this->smtp_conn);\n            $this->smtp_conn = null; //Makes for cleaner serialization\n            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);\n        }\n    }\n\n    /**\n     * Send an SMTP DATA command.\n     * Issues a data command and sends the msg_data to the server,\n     * finializing the mail transaction. $msg_data is the message\n     * that is to be send with the headers. Each header needs to be\n     * on a single line followed by a <CRLF> with the message headers\n     * and the message body being separated by and additional <CRLF>.\n     * Implements rfc 821: DATA <CRLF>\n     * @param string $msg_data Message data to send\n     * @access public\n     * @return boolean\n     */\n    public function data($msg_data)\n    {\n        //This will use the standard timelimit\n        if (!$this->sendCommand('DATA', 'DATA', 354)) {\n            return false;\n        }\n\n        /* The server is ready to accept data!\n         * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)\n         * so we will break the data up into lines by \\r and/or \\n then if needed we will break each of those into\n         * smaller lines to fit within the limit.\n         * We will also look for lines that start with a '.' and prepend an additional '.'.\n         * NOTE: this does not count towards line-length limit.\n         */\n\n        // Normalize line breaks before exploding\n        $lines = explode(\"\\n\", str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $msg_data));\n\n        /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field\n         * of the first line (':' separated) does not contain a space then it _should_ be a header and we will\n         * process all lines before a blank line as headers.\n         */\n\n        $field = substr($lines[0], 0, strpos($lines[0], ':'));\n        $in_headers = false;\n        if (!empty($field) && strpos($field, ' ') === false) {\n            $in_headers = true;\n        }\n\n        foreach ($lines as $line) {\n            $lines_out = array();\n            if ($in_headers and $line == '') {\n                $in_headers = false;\n            }\n            //Break this line up into several smaller lines if it's too long\n            //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),\n            while (isset($line[self::MAX_LINE_LENGTH])) {\n                //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on\n                //so as to avoid breaking in the middle of a word\n                $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');\n                //Deliberately matches both false and 0\n                if (!$pos) {\n                    //No nice break found, add a hard break\n                    $pos = self::MAX_LINE_LENGTH - 1;\n                    $lines_out[] = substr($line, 0, $pos);\n                    $line = substr($line, $pos);\n                } else {\n                    //Break at the found point\n                    $lines_out[] = substr($line, 0, $pos);\n                    //Move along by the amount we dealt with\n                    $line = substr($line, $pos + 1);\n                }\n                //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1\n                if ($in_headers) {\n                    $line = \"\\t\" . $line;\n                }\n            }\n            $lines_out[] = $line;\n\n            //Send the lines to the server\n            foreach ($lines_out as $line_out) {\n                //RFC2821 section 4.5.2\n                if (!empty($line_out) and $line_out[0] == '.') {\n                    $line_out = '.' . $line_out;\n                }\n                $this->client_send($line_out . self::CRLF);\n            }\n        }\n\n        //Message data has been sent, complete the command\n        //Increase timelimit for end of DATA command\n        $savetimelimit = $this->Timelimit;\n        $this->Timelimit = $this->Timelimit * 2;\n        $result = $this->sendCommand('DATA END', '.', 250);\n        //Restore timelimit\n        $this->Timelimit = $savetimelimit;\n        return $result;\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Used to identify the sending server to the receiving server.\n     * This makes sure that client and server are in a known state.\n     * Implements RFC 821: HELO <SP> <domain> <CRLF>\n     * and RFC 2821 EHLO.\n     * @param string $host The host name or IP to connect to\n     * @access public\n     * @return boolean\n     */\n    public function hello($host = '')\n    {\n        //Try extended hello first (RFC 2821)\n        return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Low-level implementation used by hello()\n     * @see hello()\n     * @param string $hello The HELO string\n     * @param string $host The hostname to say we are\n     * @access protected\n     * @return boolean\n     */\n    protected function sendHello($hello, $host)\n    {\n        $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);\n        $this->helo_rply = $this->last_reply;\n        if ($noerror) {\n            $this->parseHelloFields($hello);\n        } else {\n            $this->server_caps = null;\n        }\n        return $noerror;\n    }\n\n    /**\n     * Parse a reply to HELO/EHLO command to discover server extensions.\n     * In case of HELO, the only parameter that can be discovered is a server name.\n     * @access protected\n     * @param string $type - 'HELO' or 'EHLO'\n     */\n    protected function parseHelloFields($type)\n    {\n        $this->server_caps = array();\n        $lines = explode(\"\\n\", $this->helo_rply);\n\n        foreach ($lines as $n => $s) {\n            //First 4 chars contain response code followed by - or space\n            $s = trim(substr($s, 4));\n            if (empty($s)) {\n                continue;\n            }\n            $fields = explode(' ', $s);\n            if (!empty($fields)) {\n                if (!$n) {\n                    $name = $type;\n                    $fields = $fields[0];\n                } else {\n                    $name = array_shift($fields);\n                    switch ($name) {\n                        case 'SIZE':\n                            $fields = ($fields ? $fields[0] : 0);\n                            break;\n                        case 'AUTH':\n                            if (!is_array($fields)) {\n                                $fields = array();\n                            }\n                            break;\n                        default:\n                            $fields = true;\n                    }\n                }\n                $this->server_caps[$name] = $fields;\n            }\n        }\n    }\n\n    /**\n     * Send an SMTP MAIL command.\n     * Starts a mail transaction from the email address specified in\n     * $from. Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command.\n     * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>\n     * @param string $from Source address of this message\n     * @access public\n     * @return boolean\n     */\n    public function mail($from)\n    {\n        $useVerp = ($this->do_verp ? ' XVERP' : '');\n        return $this->sendCommand(\n            'MAIL FROM',\n            'MAIL FROM:<' . $from . '>' . $useVerp,\n            250\n        );\n    }\n\n    /**\n     * Send an SMTP QUIT command.\n     * Closes the socket if there is no error or the $close_on_error argument is true.\n     * Implements from rfc 821: QUIT <CRLF>\n     * @param boolean $close_on_error Should the connection close if an error occurs?\n     * @access public\n     * @return boolean\n     */\n    public function quit($close_on_error = true)\n    {\n        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);\n        $err = $this->error; //Save any error\n        if ($noerror or $close_on_error) {\n            $this->close();\n            $this->error = $err; //Restore any error from the quit command\n        }\n        return $noerror;\n    }\n\n    /**\n     * Send an SMTP RCPT command.\n     * Sets the TO argument to $toaddr.\n     * Returns true if the recipient was accepted false if it was rejected.\n     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>\n     * @param string $address The address the message is being sent to\n     * @access public\n     * @return boolean\n     */\n    public function recipient($address)\n    {\n        return $this->sendCommand(\n            'RCPT TO',\n            'RCPT TO:<' . $address . '>',\n            array(250, 251)\n        );\n    }\n\n    /**\n     * Send an SMTP RSET command.\n     * Abort any transaction that is currently in progress.\n     * Implements rfc 821: RSET <CRLF>\n     * @access public\n     * @return boolean True on success.\n     */\n    public function reset()\n    {\n        return $this->sendCommand('RSET', 'RSET', 250);\n    }\n\n    /**\n     * Send a command to an SMTP server and check its return code.\n     * @param string $command The command name - not sent to the server\n     * @param string $commandstring The actual command to send\n     * @param integer|array $expect One or more expected integer success codes\n     * @access protected\n     * @return boolean True on success.\n     */\n    protected function sendCommand($command, $commandstring, $expect)\n    {\n        if (!$this->connected()) {\n            $this->setError(\"Called $command without being connected\");\n            return false;\n        }\n        //Reject line breaks in all commands\n        if (strpos($commandstring, \"\\n\") !== false or strpos($commandstring, \"\\r\") !== false) {\n            $this->setError(\"Command '$command' contained line breaks\");\n            return false;\n        }\n        $this->client_send($commandstring . self::CRLF);\n\n        $this->last_reply = $this->get_lines();\n        // Fetch SMTP code and possible error code explanation\n        $matches = array();\n        if (preg_match(\"/^([0-9]{3})[ -](?:([0-9]\\\\.[0-9]\\\\.[0-9]) )?/\", $this->last_reply, $matches)) {\n            $code = $matches[1];\n            $code_ex = (count($matches) > 2 ? $matches[2] : null);\n            // Cut off error code from each response line\n            $detail = preg_replace(\n                \"/{$code}[ -]\" .\n                ($code_ex ? str_replace('.', '\\\\.', $code_ex) . ' ' : '') . \"/m\",\n                '',\n                $this->last_reply\n            );\n        } else {\n            // Fall back to simple parsing if regex fails\n            $code = substr($this->last_reply, 0, 3);\n            $code_ex = null;\n            $detail = substr($this->last_reply, 4);\n        }\n\n        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);\n\n        if (!in_array($code, (array)$expect)) {\n            $this->setError(\n                \"$command command failed\",\n                $detail,\n                $code,\n                $code_ex\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,\n                self::DEBUG_CLIENT\n            );\n            return false;\n        }\n\n        $this->setError('');\n        return true;\n    }\n\n    /**\n     * Send an SMTP SAML command.\n     * Starts a mail transaction from the email address specified in $from.\n     * Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command. This command\n     * will send the message to the users terminal if they are logged\n     * in and send them an email.\n     * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>\n     * @param string $from The address the message is from\n     * @access public\n     * @return boolean\n     */\n    public function sendAndMail($from)\n    {\n        return $this->sendCommand('SAML', \"SAML FROM:$from\", 250);\n    }\n\n    /**\n     * Send an SMTP VRFY command.\n     * @param string $name The name to verify\n     * @access public\n     * @return boolean\n     */\n    public function verify($name)\n    {\n        return $this->sendCommand('VRFY', \"VRFY $name\", array(250, 251));\n    }\n\n    /**\n     * Send an SMTP NOOP command.\n     * Used to keep keep-alives alive, doesn't actually do anything\n     * @access public\n     * @return boolean\n     */\n    public function noop()\n    {\n        return $this->sendCommand('NOOP', 'NOOP', 250);\n    }\n\n    /**\n     * Send an SMTP TURN command.\n     * This is an optional command for SMTP that this class does not support.\n     * This method is here to make the RFC821 Definition complete for this class\n     * and _may_ be implemented in future\n     * Implements from rfc 821: TURN <CRLF>\n     * @access public\n     * @return boolean\n     */\n    public function turn()\n    {\n        $this->setError('The SMTP TURN command is not implemented');\n        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);\n        return false;\n    }\n\n    /**\n     * Send raw data to the server.\n     * @param string $data The data to send\n     * @access public\n     * @return integer|boolean The number of bytes sent to the server or false on error\n     */\n    public function client_send($data)\n    {\n        $this->edebug(\"CLIENT -> SERVER: $data\", self::DEBUG_CLIENT);\n        set_error_handler(array($this, 'errorHandler'));\n        $result = fwrite($this->smtp_conn, $data);\n        restore_error_handler();\n        return $result;\n    }\n\n    /**\n     * Get the latest error.\n     * @access public\n     * @return array\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * Get SMTP extensions available on the server\n     * @access public\n     * @return array|null\n     */\n    public function getServerExtList()\n    {\n        return $this->server_caps;\n    }\n\n    /**\n     * A multipurpose method\n     * The method works in three ways, dependent on argument value and current state\n     *   1. HELO/EHLO was not sent - returns null and set up $this->error\n     *   2. HELO was sent\n     *     $name = 'HELO': returns server name\n     *     $name = 'EHLO': returns boolean false\n     *     $name = any string: returns null and set up $this->error\n     *   3. EHLO was sent\n     *     $name = 'HELO'|'EHLO': returns server name\n     *     $name = any string: if extension $name exists, returns boolean True\n     *       or its options. Otherwise returns boolean False\n     * In other words, one can use this method to detect 3 conditions:\n     *  - null returned: handshake was not or we don't know about ext (refer to $this->error)\n     *  - false returned: the requested feature exactly not exists\n     *  - positive value returned: the requested feature exists\n     * @param string $name Name of SMTP extension or 'HELO'|'EHLO'\n     * @return mixed\n     */\n    public function getServerExt($name)\n    {\n        if (!$this->server_caps) {\n            $this->setError('No HELO/EHLO was sent');\n            return null;\n        }\n\n        // the tight logic knot ;)\n        if (!array_key_exists($name, $this->server_caps)) {\n            if ($name == 'HELO') {\n                return $this->server_caps['EHLO'];\n            }\n            if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {\n                return false;\n            }\n            $this->setError('HELO handshake was used. Client knows nothing about server extensions');\n            return null;\n        }\n\n        return $this->server_caps[$name];\n    }\n\n    /**\n     * Get the last reply from the server.\n     * @access public\n     * @return string\n     */\n    public function getLastReply()\n    {\n        return $this->last_reply;\n    }\n\n    /**\n     * Read the SMTP server's response.\n     * Either before eof or socket timeout occurs on the operation.\n     * With SMTP we can tell if we have more lines to read if the\n     * 4th character is '-' symbol. If it is a space then we don't\n     * need to read anything else.\n     * @access protected\n     * @return string\n     */\n    protected function get_lines()\n    {\n        // If the connection is bad, give up straight away\n        if (!is_resource($this->smtp_conn)) {\n            return '';\n        }\n        $data = '';\n        $endtime = 0;\n        stream_set_timeout($this->smtp_conn, $this->Timeout);\n        if ($this->Timelimit > 0) {\n            $endtime = time() + $this->Timelimit;\n        }\n        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {\n            $str = @fgets($this->smtp_conn, 515);\n            $this->edebug(\"SMTP -> get_lines(): \\$data is \\\"$data\\\"\", self::DEBUG_LOWLEVEL);\n            $this->edebug(\"SMTP -> get_lines(): \\$str is  \\\"$str\\\"\", self::DEBUG_LOWLEVEL);\n            $data .= $str;\n            // If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),\n            // or 4th character is a space, we are done reading, break the loop,\n            // string array access is a micro-optimisation over strlen\n            if (!isset($str[3]) or (isset($str[3]) and $str[3] == ' ')) {\n                break;\n            }\n            // Timed-out? Log and break\n            $info = stream_get_meta_data($this->smtp_conn);\n            if ($info['timed_out']) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n            // Now check if reads took too long\n            if ($endtime and time() > $endtime) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timelimit reached (' .\n                    $this->Timelimit . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n        }\n        return $data;\n    }\n\n    /**\n     * Enable or disable VERP address generation.\n     * @param boolean $enabled\n     */\n    public function setVerp($enabled = false)\n    {\n        $this->do_verp = $enabled;\n    }\n\n    /**\n     * Get VERP address generation mode.\n     * @return boolean\n     */\n    public function getVerp()\n    {\n        return $this->do_verp;\n    }\n\n    /**\n     * Set error messages and codes.\n     * @param string $message The error message\n     * @param string $detail Further detail on the error\n     * @param string $smtp_code An associated SMTP error code\n     * @param string $smtp_code_ex Extended SMTP code\n     */\n    protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')\n    {\n        $this->error = array(\n            'error' => $message,\n            'detail' => $detail,\n            'smtp_code' => $smtp_code,\n            'smtp_code_ex' => $smtp_code_ex\n        );\n    }\n\n    /**\n     * Set debug output method.\n     * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.\n     */\n    public function setDebugOutput($method = 'echo')\n    {\n        $this->Debugoutput = $method;\n    }\n\n    /**\n     * Get debug output method.\n     * @return string\n     */\n    public function getDebugOutput()\n    {\n        return $this->Debugoutput;\n    }\n\n    /**\n     * Set debug output level.\n     * @param integer $level\n     */\n    public function setDebugLevel($level = 0)\n    {\n        $this->do_debug = $level;\n    }\n\n    /**\n     * Get debug output level.\n     * @return integer\n     */\n    public function getDebugLevel()\n    {\n        return $this->do_debug;\n    }\n\n    /**\n     * Set SMTP timeout.\n     * @param integer $timeout\n     */\n    public function setTimeout($timeout = 0)\n    {\n        $this->Timeout = $timeout;\n    }\n\n    /**\n     * Get SMTP timeout.\n     * @return integer\n     */\n    public function getTimeout()\n    {\n        return $this->Timeout;\n    }\n\n    /**\n     * Reports an error number and string.\n     * @param integer $errno The error number returned by PHP.\n     * @param string $errmsg The error message returned by PHP.\n     * @param string $errfile The file the error occurred in\n     * @param integer $errline The line number the error occurred on\n     */\n    protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0)\n    {\n        $notice = 'Connection failed.';\n        $this->setError(\n            $notice,\n            $errno,\n            $errmsg\n        );\n        $this->edebug(\n            $notice . ' Error #' . $errno . ': ' . $errmsg . \" [$errfile line $errline]\",\n            self::DEBUG_CONNECTION\n        );\n    }\n\n    /**\n     * Will return the ID of the last smtp transaction based on a list of patterns provided\n     * in SMTP::$smtp_transaction_id_patterns.\n     * If no reply has been received yet, it will return null.\n     * If no pattern has been matched, it will return false.\n     * @return bool|null|string\n     */\n    public function getLastTransactionID()\n    {\n        $reply = $this->getLastReply();\n\n        if (empty($reply)) {\n            return null;\n        }\n\n        foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {\n            if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) {\n                return $matches[1];\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/composer.json",
    "content": "{\n    \"name\": \"phpmailer/phpmailer\",\n    \"type\": \"library\",\n    \"description\": \"PHPMailer is a full-featured email creation and transfer class for PHP\",\n    \"authors\": [\n        {\n            \"name\": \"Marcus Bointon\",\n            \"email\": \"phpmailer@synchromedia.co.uk\"\n        },\n        {\n            \"name\": \"Jim Jagielski\",\n            \"email\": \"jimjag@gmail.com\"\n        },\n        {\n            \"name\": \"Andy Prevost\",\n            \"email\": \"codeworxtech@users.sourceforge.net\"\n        },\n        {\n            \"name\": \"Brent R. Matzelle\"\n        }\n    ],\n    \"require\": {\n        \"ext-ctype\": \"*\",\n        \"php\": \">=5.0.0\"\n    },\n    \"require-dev\": {\n        \"doctrine/annotations\": \"1.2.*\",\n        \"jms/serializer\": \"0.16.*\",\n        \"phpdocumentor/phpdocumentor\": \"2.*\",\n        \"phpunit/phpunit\": \"4.8.*\",\n        \"symfony/debug\": \"2.8.*\",\n        \"symfony/filesystem\": \"2.8.*\",\n        \"symfony/translation\": \"2.8.*\",\n        \"symfony/yaml\": \"2.8.*\",\n        \"zendframework/zend-cache\": \"2.5.1\",\n        \"zendframework/zend-config\": \"2.5.1\",\n        \"zendframework/zend-eventmanager\": \"2.5.1\",\n        \"zendframework/zend-filter\": \"2.5.1\",\n        \"zendframework/zend-i18n\": \"2.5.1\",\n        \"zendframework/zend-json\": \"2.5.1\",\n        \"zendframework/zend-math\": \"2.5.1\",\n        \"zendframework/zend-serializer\": \"2.5.*\",\n        \"zendframework/zend-servicemanager\": \"2.5.*\",\n        \"zendframework/zend-stdlib\": \"2.5.1\"\n    },\n    \"suggest\": {\n        \"league/oauth2-google\": \"Needed for Google XOAUTH2 authentication\"\n    },\n    \"autoload\": {\n        \"classmap\": [\n            \"class.phpmailer.php\",\n            \"class.phpmaileroauth.php\",\n            \"class.phpmaileroauthgoogle.php\",\n            \"class.smtp.php\",\n            \"class.pop3.php\",\n            \"extras/EasyPeasyICS.php\",\n            \"extras/ntlm_sasl_client.php\"\n        ]\n    },\n    \"license\": \"LGPL-2.1\"\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/DKIM.phps",
    "content": "<?php\n/**\n * This example shows how to use DKIM message authentication with PHPMailer.\n * There's more to using DKIM than just this code - check out this article:\n * @link https://yomotherboard.com/how-to-setup-email-server-dkim-keys/\n * See also the DKIM code in the PHPMailer unit tests,\n * which shows how to make a key pair from PHP.\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer DKIM test';\n//This should be the same as the domain of your From address\n$mail->DKIM_domain = 'example.com';\n//Path to your private key file\n$mail->DKIM_private = 'dkim_private.pem';\n//Set this to your own selector\n$mail->DKIM_selector = 'phpmailer';\n//If your private key has a passphrase, set it here\n$mail->DKIM_passphrase = '';\n//The identity you're signing as - usually your From address\n$mail->DKIM_identity = $mail->From;\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/code_generator.phps",
    "content": "<?php\n/*\n * A web form that both generates and uses PHPMailer code.\n * revised, updated and corrected 27/02/2013\n * by matt.sturdy@gmail.com\n */\nrequire '../PHPMailerAutoload.php';\n\n$CFG['smtp_debug'] = 2; //0 == off, 1 for client output, 2 for client and server\n$CFG['smtp_debugoutput'] = 'html';\n$CFG['smtp_server'] = 'localhost';\n$CFG['smtp_port'] = '25';\n$CFG['smtp_authenticate'] = false;\n$CFG['smtp_username'] = 'name@example.com';\n$CFG['smtp_password'] = 'yourpassword';\n$CFG['smtp_secure'] = 'None';\n\n$from_name = (isset($_POST['From_Name'])) ? $_POST['From_Name'] : '';\n$from_email = (isset($_POST['From_Email'])) ? $_POST['From_Email'] : '';\n$to_name = (isset($_POST['To_Name'])) ? $_POST['To_Name'] : '';\n$to_email = (isset($_POST['To_Email'])) ? $_POST['To_Email'] : '';\n$cc_email = (isset($_POST['cc_Email'])) ? $_POST['cc_Email'] : '';\n$bcc_email = (isset($_POST['bcc_Email'])) ? $_POST['bcc_Email'] : '';\n$subject = (isset($_POST['Subject'])) ? $_POST['Subject'] : '';\n$message = (isset($_POST['Message'])) ? $_POST['Message'] : '';\n$test_type = (isset($_POST['test_type'])) ? $_POST['test_type'] : 'smtp';\n$smtp_debug = (isset($_POST['smtp_debug'])) ? $_POST['smtp_debug'] : $CFG['smtp_debug'];\n$smtp_server = (isset($_POST['smtp_server'])) ? $_POST['smtp_server'] : $CFG['smtp_server'];\n$smtp_port = (isset($_POST['smtp_port'])) ? $_POST['smtp_port'] : $CFG['smtp_port'];\n$smtp_secure = strtolower((isset($_POST['smtp_secure'])) ? $_POST['smtp_secure'] : $CFG['smtp_secure']);\n$smtp_authenticate = (isset($_POST['smtp_authenticate'])) ?\n    $_POST['smtp_authenticate'] : $CFG['smtp_authenticate'];\n$authenticate_password = (isset($_POST['authenticate_password'])) ?\n    $_POST['authenticate_password'] : $CFG['smtp_password'];\n$authenticate_username = (isset($_POST['authenticate_username'])) ?\n    $_POST['authenticate_username'] : $CFG['smtp_username'];\n\n// storing all status output from the script to be shown to the user later\n$results_messages = array();\n\n// $example_code represents the \"final code\" that we're using, and will\n// be shown to the user at the end.\n$example_code = \"\\nrequire_once '../PHPMailerAutoload.php';\";\n$example_code .= \"\\n\\n\\$results_messages = array();\";\n\n$mail = new PHPMailer(true);  //PHPMailer instance with exceptions enabled\n$mail->CharSet = 'utf-8';\nini_set('default_charset', 'UTF-8');\n$mail->Debugoutput = $CFG['smtp_debugoutput'];\n$example_code .= \"\\n\\n\\$mail = new PHPMailer(true);\";\n$example_code .= \"\\n\\$mail->CharSet = 'utf-8';\";\n$example_code .= \"\\nini_set('default_charset', 'UTF-8');\";\n\nclass phpmailerAppException extends phpmailerException\n{\n}\n\n$example_code .= \"\\n\\nclass phpmailerAppException extends phpmailerException {}\";\n$example_code .= \"\\n\\ntry {\";\n\n// Convert a string to its JavaScript representation.\nfunction JSString($s) {\n  static $from = array(\"\\\\\", \"/\", \"\\n\", \"\\t\", \"\\r\", \"\\b\", \"\\f\", '\"');\n  static $to = array('\\\\\\\\', '\\\\/', '\\\\n', '\\\\t', '\\\\r', '\\\\b', '\\\\f', '\\\\\"');\n  return is_null($s)? 'null': '\"' . str_replace($from, $to, \"$s\") . '\"';\n}\n\ntry {\n    if (isset($_POST[\"submit\"]) && $_POST['submit'] == \"Submit\") {\n        $to = $to_email;\n        if (!PHPMailer::validateAddress($to)) {\n            throw new phpmailerAppException(\"Email address \" . $to . \" is invalid -- aborting!\");\n        }\n\n        $example_code .= \"\\n\\$to = '\" . addslashes($to_email) . \"';\";\n        $example_code .= \"\\nif(!PHPMailer::validateAddress(\\$to)) {\";\n        $example_code .= \"\\n  throw new phpmailerAppException(\\\"Email address \\\" . \" .\n            \"\\$to . \\\" is invalid -- aborting!\\\");\";\n        $example_code .= \"\\n}\";\n\n        switch ($test_type) {\n            case 'smtp':\n                $mail->isSMTP(); // telling the class to use SMTP\n                $mail->SMTPDebug = (integer)$smtp_debug;\n                $mail->Host = $smtp_server; // SMTP server\n                $mail->Port = (integer)$smtp_port; // set the SMTP port\n                if ($smtp_secure) {\n                    $mail->SMTPSecure = strtolower($smtp_secure);\n                }\n                $mail->SMTPAuth = array_key_exists('smtp_authenticate', $_POST); // enable SMTP authentication?\n                if (array_key_exists('smtp_authenticate', $_POST)) {\n                    $mail->Username = $authenticate_username; // SMTP account username\n                    $mail->Password = $authenticate_password; // SMTP account password\n                }\n\n                $example_code .= \"\\n\\$mail->isSMTP();\";\n                $example_code .= \"\\n\\$mail->SMTPDebug  = \" . (integer) $smtp_debug . \";\";\n                $example_code .= \"\\n\\$mail->Host       = \\\"\" . addslashes($smtp_server) . \"\\\";\";\n                $example_code .= \"\\n\\$mail->Port       = \\\"\" . addslashes($smtp_port) . \"\\\";\";\n                $example_code .= \"\\n\\$mail->SMTPSecure = \\\"\" . addslashes(strtolower($smtp_secure)) . \"\\\";\";\n                $example_code .= \"\\n\\$mail->SMTPAuth   = \" . (array_key_exists(\n                    'smtp_authenticate',\n                    $_POST\n                ) ? 'true' : 'false') . \";\";\n                if (array_key_exists('smtp_authenticate', $_POST)) {\n                    $example_code .= \"\\n\\$mail->Username   = \\\"\" . addslashes($authenticate_username) . \"\\\";\";\n                    $example_code .= \"\\n\\$mail->Password   = \\\"\" . addslashes($authenticate_password) . \"\\\";\";\n                }\n                break;\n            case 'mail':\n                $mail->isMail(); // telling the class to use PHP's mail()\n                $example_code .= \"\\n\\$mail->isMail();\";\n                break;\n            case 'sendmail':\n                $mail->isSendmail(); // telling the class to use Sendmail\n                $example_code .= \"\\n\\$mail->isSendmail();\";\n                break;\n            case 'qmail':\n                $mail->isQmail(); // telling the class to use Qmail\n                $example_code .= \"\\n\\$mail->isQmail();\";\n                break;\n            default:\n                throw new phpmailerAppException('Invalid test_type provided');\n        }\n\n        try {\n            if ($_POST['From_Name'] != '') {\n                $mail->addReplyTo($from_email, $from_name);\n                $mail->setFrom($from_email, $from_name);\n\n                $example_code .= \"\\n\\$mail->addReplyTo(\\\"\" .\n                    addslashes($from_email) . \"\\\", \\\"\" . addslashes($from_name) . \"\\\");\";\n                $example_code .= \"\\n\\$mail->setFrom(\\\"\" .\n                    addslashes($from_email) . \"\\\", \\\"\" . addslashes($from_name) . \"\\\");\";\n            } else {\n                $mail->addReplyTo($from_email);\n                $mail->setFrom($from_email, $from_email);\n\n                $example_code .= \"\\n\\$mail->addReplyTo(\\\"\" . addslashes($from_email) . \"\\\");\";\n                $example_code .= \"\\n\\$mail->setFrom(\\\"\" .\n                    addslashes($from_email) . \"\\\", \\\"\" . addslashes($from_email) . \"\\\");\";\n            }\n\n            if ($_POST['To_Name'] != '') {\n                $mail->addAddress($to, $to_name);\n                $example_code .= \"\\n\\$mail->addAddress(\\\"$to\\\", \\\"\" . addslashes($to_name) . \"\\\");\";\n            } else {\n                $mail->addAddress($to);\n                $example_code .= \"\\n\\$mail->addAddress(\\\"$to\\\");\";\n            }\n\n            if ($_POST['bcc_Email'] != '') {\n                $indiBCC = explode(\" \", $bcc_email);\n                foreach ($indiBCC as $key => $value) {\n                    $mail->addBCC($value);\n                    $example_code .= \"\\n\\$mail->addBCC(\\\"\" . addslashes($value) . \"\\\");\";\n                }\n            }\n\n            if ($_POST['cc_Email'] != '') {\n                $indiCC = explode(\" \", $cc_Email);\n                foreach ($indiCC as $key => $value) {\n                    $mail->addCC($value);\n                    $example_code .= \"\\n\\$mail->addCC(\\\"\" . addslashes($value) . \"\\\");\";\n                }\n            }\n        } catch (phpmailerException $e) { //Catch all kinds of bad addressing\n            throw new phpmailerAppException($e->getMessage());\n        }\n        $mail->Subject = $subject . ' (PHPMailer test using ' . strtoupper($test_type) . ')';\n        $example_code .= \"\\n\\$mail->Subject  = \\\"\" . addslashes($subject) .\n            ' (PHPMailer test using ' . addslashes(strtoupper($test_type)) . ')\";';\n\n        if ($_POST['Message'] == '') {\n            $body = file_get_contents('contents.html');\n        } else {\n            $body = $message;\n        }\n\n        $example_code .= \"\\n\\$body = <<<'EOT'\\n$body\\nEOT;\";\n\n        $mail->WordWrap = 78; // set word wrap to the RFC2822 limit\n        $mail->msgHTML($body, dirname(__FILE__), true); //Create message bodies and embed images\n\n        $example_code .= \"\\n\\$mail->WordWrap = 78;\";\n        $example_code .= \"\\n\\$mail->msgHTML(\\$body, dirname(__FILE__), true); //Create message bodies and embed images\";\n\n        $mail->addAttachment('images/phpmailer_mini.png', 'phpmailer_mini.png'); // optional name\n        $mail->addAttachment('images/phpmailer.png', 'phpmailer.png'); // optional name\n        $example_code .= \"\\n\\$mail->addAttachment('images/phpmailer_mini.png',\" .\n            \"'phpmailer_mini.png');  // optional name\";\n        $example_code .= \"\\n\\$mail->addAttachment('images/phpmailer.png', 'phpmailer.png');  // optional name\";\n\n        $example_code .= \"\\n\\ntry {\";\n        $example_code .= \"\\n  \\$mail->send();\";\n        $example_code .= \"\\n  \\$results_messages[] = \\\"Message has been sent using \" .\n            addslashes(strtoupper($test_type)) . \"\\\";\";\n        $example_code .= \"\\n}\";\n        $example_code .= \"\\ncatch (phpmailerException \\$e) {\";\n        $example_code .= \"\\n  throw new phpmailerAppException('Unable to send to: ' . \\$to. ': '.\\$e->getMessage());\";\n        $example_code .= \"\\n}\";\n\n        try {\n            $mail->send();\n            $results_messages[] = \"Message has been sent using \" . strtoupper($test_type);\n        } catch (phpmailerException $e) {\n            throw new phpmailerAppException(\"Unable to send to: \" . $to . ': ' . $e->getMessage());\n        }\n    }\n} catch (phpmailerAppException $e) {\n    $results_messages[] = $e->errorMessage();\n}\n$example_code .= \"\\n}\";\n$example_code .= \"\\ncatch (phpmailerAppException \\$e) {\";\n$example_code .= \"\\n  \\$results_messages[] = \\$e->errorMessage();\";\n$example_code .= \"\\n}\";\n$example_code .= \"\\n\\nif (count(\\$results_messages) > 0) {\";\n$example_code .= \"\\n  echo \\\"<h2>Run results</h2>\\\\n\\\";\";\n$example_code .= \"\\n  echo \\\"<ul>\\\\n\\\";\";\n$example_code .= \"\\nforeach (\\$results_messages as \\$result) {\";\n$example_code .= \"\\n  echo \\\"<li>\\$result</li>\\\\n\\\";\";\n$example_code .= \"\\n}\";\n$example_code .= \"\\necho \\\"</ul>\\\\n\\\";\";\n$example_code .= \"\\n}\";\n?><!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <title>PHPMailer Test Page</title>\n    <script type=\"text/javascript\" src=\"scripts/shCore.js\"></script>\n    <script type=\"text/javascript\" src=\"scripts/shBrushPhp.js\"></script>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"styles/shCore.css\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"styles/shThemeDefault.css\">\n    <style>\n        body {\n            font-family: Arial, Helvetica, sans-serif;\n            font-size: 1em;\n            padding: 1em;\n        }\n\n        table {\n            margin: 0 auto;\n            border-spacing: 0;\n            border-collapse: collapse;\n        }\n\n        table.column {\n            border-collapse: collapse;\n            background-color: #FFFFFF;\n            padding: 0.5em;\n            width: 35em;\n        }\n\n        td {\n            font-size: 1em;\n            padding: 0.1em 0.25em;\n            -moz-border-radius: 1em;\n            -webkit-border-radius: 1em;\n            border-radius: 1em;\n        }\n\n        td.colleft {\n            text-align: right;\n            width: 35%;\n        }\n\n        td.colrite {\n            text-align: left;\n            width: 65%;\n        }\n\n        fieldset {\n            padding: 1em 1em 1em 1em;\n            margin: 0 2em;\n            border-radius: 1.5em;\n            -webkit-border-radius: 1em;\n            -moz-border-radius: 1em;\n        }\n\n        fieldset.inner {\n            width: 40%;\n        }\n\n        fieldset:hover, tr:hover {\n            background-color: #fafafa;\n        }\n\n        legend {\n            font-weight: bold;\n            font-size: 1.1em;\n        }\n\n        div.column-left {\n            float: left;\n            width: 45em;\n            height: 31em;\n        }\n\n        div.column-right {\n            display: inline;\n            width: 45em;\n            max-height: 31em;\n        }\n\n        input.radio {\n            float: left;\n        }\n\n        div.radio {\n            padding: 0.2em;\n        }\n    </style>\n    <script>\n        SyntaxHighlighter.config.clipboardSwf = 'scripts/clipboard.swf';\n        SyntaxHighlighter.all();\n\n        function startAgain() {\n            var post_params = {\n                \"From_Name\": <?php echo JSString($from_name); ?>,\n                \"From_Email\": <?php echo JSString($from_email); ?>,\n                \"To_Name\": <?php echo JSString($to_name); ?>,\n                \"To_Email\": <?php echo JSString($to_email); ?>,\n                \"cc_Email\": <?php echo JSString($cc_email); ?>,\n                \"bcc_Email\": <?php echo JSString($bcc_email); ?>,\n                \"Subject\": <?php echo JSString($subject); ?>,\n                \"Message\": <?php echo JSString($message); ?>,\n                \"test_type\": <?php echo JSString($test_type); ?>,\n                \"smtp_debug\": <?php echo JSString($smtp_debug); ?>,\n                \"smtp_server\": <?php echo JSString($smtp_server); ?>,\n                \"smtp_port\": <?php echo JSString($smtp_port); ?>,\n                \"smtp_secure\": <?php echo JSString($smtp_secure); ?>,\n                \"smtp_authenticate\": <?php echo JSString($smtp_authenticate); ?>,\n                \"authenticate_username\": <?php echo JSString($authenticate_username); ?>,\n                \"authenticate_password\": <?php echo JSString($authenticate_password); ?>\n            };\n\n            var resetForm = document.createElement(\"form\");\n            resetForm.setAttribute(\"method\", \"POST\");\n            resetForm.setAttribute(\"path\", \"index.php\");\n\n            for (var k in post_params) {\n                var h = document.createElement(\"input\");\n                h.setAttribute(\"type\", \"hidden\");\n                h.setAttribute(\"name\", k);\n                h.setAttribute(\"value\", post_params[k]);\n                resetForm.appendChild(h);\n            }\n\n            document.body.appendChild(resetForm);\n            resetForm.submit();\n        }\n\n        function showHideDiv(test, element_id) {\n            var ops = {\"smtp-options-table\": \"smtp\"};\n\n            if (test == ops[element_id]) {\n                document.getElementById(element_id).style.display = \"block\";\n            } else {\n                document.getElementById(element_id).style.display = \"none\";\n            }\n        }\n    </script>\n</head>\n<body>\n<?php\nif (version_compare(PHP_VERSION, '5.0.0', '<')) {\n    echo 'Current PHP version: ' . phpversion() . \"<br>\";\n    echo exit(\"ERROR: Wrong PHP version. Must be PHP 5 or above.\");\n}\n\nif (count($results_messages) > 0) {\n    echo '<h2>Run results</h2>';\n    echo '<ul>';\n    foreach ($results_messages as $result) {\n        echo \"<li>$result</li>\";\n    }\n    echo '</ul>';\n}\n\nif (isset($_POST[\"submit\"]) && $_POST[\"submit\"] == \"Submit\") {\n    echo \"<button type=\\\"submit\\\" onclick=\\\"startAgain();\\\">Start Over</button><br>\\n\";\n    echo \"<br><span>Script:</span>\\n\";\n    echo \"<pre class=\\\"brush: php;\\\">\\n\";\n    echo htmlentities($example_code);\n    echo \"\\n</pre>\\n\";\n    echo \"\\n<hr style=\\\"margin: 3em;\\\">\\n\";\n}\n?>\n<form method=\"POST\" enctype=\"multipart/form-data\">\n    <div>\n        <div class=\"column-left\">\n            <fieldset>\n                <legend>Mail Details</legend>\n                <table border=\"1\" class=\"column\">\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"From_Name\"><strong>From</strong> Name</label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" id=\"From_Name\" name=\"From_Name\" value=\"<?php echo htmlentities($from_name); ?>\"\n                                   style=\"width:95%;\" autofocus placeholder=\"Your Name\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"From_Email\"><strong>From</strong> Email Address</label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" id=\"From_Email\" name=\"From_Email\" value=\"<?php echo htmlentities($from_email); ?>\"\n                                   style=\"width:95%;\" required placeholder=\"Your.Email@example.com\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"To_Name\"><strong>To</strong> Name</label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" id=\"To_Name\" name=\"To_Name\" value=\"<?php echo htmlentities($to_name); ?>\"\n                                   style=\"width:95%;\" placeholder=\"Recipient's Name\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"To_Email\"><strong>To</strong> Email Address</label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" id=\"To_Email\" name=\"To_Email\" value=\"<?php echo htmlentities($to_email); ?>\"\n                                   style=\"width:95%;\" required placeholder=\"Recipients.Email@example.com\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"cc_Email\"><strong>CC Recipients</strong><br>\n                                <small>(separate with commas)</small>\n                            </label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" id=\"cc_Email\" name=\"cc_Email\" value=\"<?php echo htmlentities($cc_email); ?>\"\n                                   style=\"width:95%;\" placeholder=\"cc1@example.com, cc2@example.com\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"bcc_Email\"><strong>BCC Recipients</strong><br>\n                                <small>(separate with commas)</small>\n                            </label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" id=\"bcc_Email\" name=\"bcc_Email\" value=\"<?php echo htmlentities($bcc_email); ?>\"\n                                   style=\"width:95%;\" placeholder=\"bcc1@example.com, bcc2@example.com\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"Subject\"><strong>Subject</strong></label>\n                        </td>\n                        <td class=\"colrite\">\n                            <input type=\"text\" name=\"Subject\" id=\"Subject\" value=\"<?php echo htmlentities($subject); ?>\"\n                                   style=\"width:95%;\" placeholder=\"Email Subject\">\n                        </td>\n                    </tr>\n                    <tr>\n                        <td class=\"colleft\">\n                            <label for=\"Message\"><strong>Message</strong><br>\n                                <small>If blank, will use content.html</small>\n                            </label>\n                        </td>\n                        <td class=\"colrite\">\n                            <textarea name=\"Message\" id=\"Message\" style=\"width:95%;height:5em;\"\n                                      placeholder=\"Body of your email\"><?php echo htmlentities($message); ?></textarea>\n                        </td>\n                    </tr>\n                </table>\n                <div style=\"margin:1em 0;\">Test will include two attachments.</div>\n            </fieldset>\n        </div>\n        <div class=\"column-right\">\n            <fieldset class=\"inner\"> <!-- SELECT TYPE OF MAIL -->\n                <legend>Mail Test Specs</legend>\n                <table border=\"1\" class=\"column\">\n                    <tr>\n                        <td class=\"colleft\">Test Type</td>\n                        <td class=\"colrite\">\n                            <div class=\"radio\">\n                                <label for=\"radio-mail\">Mail()</label>\n                                <input class=\"radio\" type=\"radio\" name=\"test_type\" value=\"mail\" id=\"radio-mail\"\n                                       onclick=\"showHideDiv(this.value, 'smtp-options-table');\"\n                                       <?php echo ($test_type == 'mail') ? 'checked' : ''; ?>\n                                       required>\n                            </div>\n                            <div class=\"radio\">\n                                <label for=\"radio-sendmail\">Sendmail</label>\n                                <input class=\"radio\" type=\"radio\" name=\"test_type\" value=\"sendmail\" id=\"radio-sendmail\"\n                                       onclick=\"showHideDiv(this.value, 'smtp-options-table');\"\n                                       <?php echo ($test_type == 'sendmail') ? 'checked' : ''; ?>\n                                       required>\n                            </div>\n                            <div class=\"radio\">\n                                <label for=\"radio-qmail\">Qmail</label>\n                                <input class=\"radio\" type=\"radio\" name=\"test_type\" value=\"qmail\" id=\"radio-qmail\"\n                                       onclick=\"showHideDiv(this.value, 'smtp-options-table');\"\n                                       <?php echo ($test_type == 'qmail') ? 'checked' : ''; ?>\n                                       required>\n                            </div>\n                            <div class=\"radio\">\n                                <label for=\"radio-smtp\">SMTP</label>\n                                <input class=\"radio\" type=\"radio\" name=\"test_type\" value=\"smtp\" id=\"radio-smtp\"\n                                       onclick=\"showHideDiv(this.value, 'smtp-options-table');\"\n                                       <?php echo ($test_type == 'smtp') ? 'checked' : ''; ?>\n                                       required>\n                            </div>\n                        </td>\n                    </tr>\n                </table>\n                <div id=\"smtp-options-table\" style=\"margin:1em 0 0 0;\n<?php if ($test_type != 'smtp') {\n    echo \"display: none;\";\n} ?>\">\n                    <span style=\"margin:1.25em 0; display:block;\"><strong>SMTP Specific Options:</strong></span>\n                    <table border=\"1\" class=\"column\">\n                        <tr>\n                            <td class=\"colleft\"><label for=\"smtp_debug\">SMTP Debug ?</label></td>\n                            <td class=\"colrite\">\n                                <select size=\"1\" id=\"smtp_debug\" name=\"smtp_debug\">\n                                    <option <?php echo ($smtp_debug == '0') ? 'selected' : ''; ?> value=\"0\">\n                                        0 - Disabled\n                                    </option>\n                                    <option <?php echo ($smtp_debug == '1') ? 'selected' : ''; ?> value=\"1\">\n                                        1 - Client messages\n                                    </option>\n                                    <option <?php echo ($smtp_debug == '2') ? 'selected' : ''; ?> value=\"2\">\n                                        2 - Client and server messages\n                                    </option>\n                                </select>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"colleft\"><label for=\"smtp_server\">SMTP Server</label></td>\n                            <td class=\"colrite\">\n                                <input type=\"text\" id=\"smtp_server\" name=\"smtp_server\"\n                                       value=\"<?php echo htmlentities($smtp_server); ?>\" style=\"width:95%;\"\n                                       placeholder=\"smtp.server.com\">\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"colleft\" style=\"width: 5em;\"><label for=\"smtp_port\">SMTP Port</label></td>\n                            <td class=\"colrite\">\n                                <input type=\"text\" name=\"smtp_port\" id=\"smtp_port\" size=\"3\"\n                                       value=\"<?php echo htmlentities($smtp_port); ?>\" placeholder=\"Port\">\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"colleft\"><label for=\"smtp_secure\">SMTP Security</label></td>\n                            <td>\n                                <select size=\"1\" name=\"smtp_secure\" id=\"smtp_secure\">\n                                    <option <?php echo ($smtp_secure == 'none') ? 'selected' : '' ?>>None</option>\n                                    <option <?php echo ($smtp_secure == 'tls') ? 'selected' : '' ?>>TLS</option>\n                                    <option <?php echo ($smtp_secure == 'ssl') ? 'selected' : '' ?>>SSL</option>\n                                </select>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"colleft\"><label for=\"smtp-authenticate\">SMTP Authenticate?</label></td>\n                            <td class=\"colrite\">\n                                <input type=\"checkbox\" id=\"smtp-authenticate\"\n                                       name=\"smtp_authenticate\"\n<?php if ($smtp_authenticate != '') {\n    echo \"checked\";\n} ?>\n                                       value=\"true\">\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"colleft\"><label for=\"authenticate_username\">Authenticate Username</label></td>\n                            <td class=\"colrite\">\n                                <input type=\"text\" id=\"authenticate_username\" name=\"authenticate_username\"\n                                       value=\"<?php echo htmlentities($authenticate_username); ?>\" style=\"width:95%;\"\n                                       placeholder=\"SMTP Server Username\">\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"colleft\"><label for=\"authenticate_password\">Authenticate Password</label></td>\n                            <td class=\"colrite\">\n                                <input type=\"password\" name=\"authenticate_password\" id=\"authenticate_password\"\n                                       value=\"<?php echo htmlentities($authenticate_password); ?>\" style=\"width:95%;\"\n                                       placeholder=\"SMTP Server Password\">\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n            </fieldset>\n        </div>\n        <br style=\"clear:both;\">\n\n        <div style=\"margin-left:2em; margin-bottom:5em; float:left;\">\n            <div style=\"margin-bottom: 1em; \">\n                <input type=\"submit\" value=\"Submit\" name=\"submit\">\n            </div>\n            <?php echo 'Current PHP version: ' . phpversion(); ?>\n        </div>\n    </div>\n</form>\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/contactform.phps",
    "content": "<?php\n/**\n * This example shows how to handle a simple contact form.\n */\n\n$msg = '';\n//Don't run this unless we're handling a form submission\nif (array_key_exists('email', $_POST)) {\n    date_default_timezone_set('Etc/UTC');\n\n    require '../PHPMailerAutoload.php';\n\n    //Create a new PHPMailer instance\n    $mail = new PHPMailer;\n    //Tell PHPMailer to use SMTP - requires a local mail server\n    //Faster and safer than using mail()\n    $mail->isSMTP();\n    $mail->Host = 'localhost';\n    $mail->Port = 25;\n\n    //Use a fixed address in your own domain as the from address\n    //**DO NOT** use the submitter's address here as it will be forgery\n    //and will cause your messages to fail SPF checks\n    $mail->setFrom('from@example.com', 'First Last');\n    //Send the message to yourself, or whoever should receive contact for submissions\n    $mail->addAddress('whoto@example.com', 'John Doe');\n    //Put the submitter's address in a reply-to header\n    //This will fail if the address provided is invalid,\n    //in which case we should ignore the whole request\n    if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {\n        $mail->Subject = 'PHPMailer contact form';\n        //Keep it simple - don't use HTML\n        $mail->isHTML(false);\n        //Build a simple message body\n        $mail->Body = <<<EOT\nEmail: {$_POST['email']}\nName: {$_POST['name']}\nMessage: {$_POST['message']}\nEOT;\n        //Send the message, check for errors\n        if (!$mail->send()) {\n            //The reason for failing to send will be in $mail->ErrorInfo\n            //but you shouldn't display errors to users - process the error, log it on your server.\n            $msg = 'Sorry, something went wrong. Please try again later.';\n        } else {\n            $msg = 'Message sent! Thanks for contacting us.';\n        }\n    } else {\n        $msg = 'Invalid email address, message ignored.';\n    }\n}\n?>\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Contact form</title>\n</head>\n<body>\n<h1>Contact us</h1>\n<?php if (!empty($msg)) {\n    echo \"<h2>$msg</h2>\";\n} ?>\n<form method=\"POST\">\n    <label for=\"name\">Name: <input type=\"text\" name=\"name\" id=\"name\"></label><br>\n    <label for=\"email\">Email address: <input type=\"email\" name=\"email\" id=\"email\"></label><br>\n    <label for=\"message\">Message: <textarea name=\"message\" id=\"message\" rows=\"8\" cols=\"20\"></textarea></label><br>\n    <input type=\"submit\" value=\"Send\">\n</form>\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/contents.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n  <title>PHPMailer Test</title>\n</head>\n<body>\n<div style=\"width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;\">\n  <h1>This is a test of PHPMailer.</h1>\n  <div align=\"center\">\n    <a href=\"https://github.com/PHPMailer/PHPMailer/\"><img src=\"images/phpmailer.png\" height=\"90\" width=\"340\" alt=\"PHPMailer rocks\"></a>\n  </div>\n  <p>This example uses <strong>HTML</strong>.</p>\n  <p>ISO-8859-1 text: </p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/contentsutf8.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n  <title>PHPMailer Test</title>\n</head>\n<body>\n<div style=\"width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;\">\n  <h1>This is a test of PHPMailer.</h1>\n  <div align=\"center\">\n    <a href=\"https://github.com/PHPMailer/PHPMailer/\"><img src=\"images/phpmailer.png\" height=\"90\" width=\"340\" alt=\"PHPMailer rocks\"></a>\n  </div>\n  <p>This example uses <strong>HTML</strong>.</p>\n  <p>Chinese text: 郵件內容為空</p>\n  <p>Russian text: Пустое тело сообщения</p>\n  <p>Armenian text: Հաղորդագրությունը դատարկ է</p>\n  <p>Czech text: Prázdné tělo zprávy</p>\n  <p>Emoji: <span style=\"font-size: 48px\">😂 🦄 💥 📤 📧</span></p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/exceptions.phps",
    "content": "<?php\n/**\n * This example shows how to make use of PHPMailer's exceptions for error handling.\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n//Passing true to the constructor enables the use of exceptions for error handling\n$mail = new PHPMailer(true);\ntry {\n    //Set who the message is to be sent from\n    $mail->setFrom('from@example.com', 'First Last');\n    //Set an alternative reply-to address\n    $mail->addReplyTo('replyto@example.com', 'First Last');\n    //Set who the message is to be sent to\n    $mail->addAddress('whoto@example.com', 'John Doe');\n    //Set the subject line\n    $mail->Subject = 'PHPMailer Exceptions test';\n    //Read an HTML message body from an external file, convert referenced images to embedded,\n    //and convert the HTML into a basic plain-text alternative body\n    $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n    //Replace the plain text body with one created manually\n    $mail->AltBody = 'This is a plain-text message body';\n    //Attach an image file\n    $mail->addAttachment('images/phpmailer_mini.png');\n    //send the message\n    //Note that we don't need check the response from this because it will throw an exception if it has trouble\n    $mail->send();\n    echo \"Message sent!\";\n} catch (phpmailerException $e) {\n    echo $e->errorMessage(); //Pretty error messages from PHPMailer\n} catch (Exception $e) {\n    echo $e->getMessage(); //Boring error messages from anything else!\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/gmail.phps",
    "content": "<?php\n/**\n * This example shows settings to use when sending via Google's Gmail servers.\n * The IMAP section shows how to save this message to the 'Sent Mail' folder using IMAP commands.\n */\n\n//SMTP needs accurate times, and the PHP time zone MUST be set\n//This should be done in your php.ini, but this is how to do it if you don't have access to that\ndate_default_timezone_set('Etc/UTC');\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n\n//Tell PHPMailer to use SMTP\n$mail->isSMTP();\n\n//Enable SMTP debugging\n// 0 = off (for production use)\n// 1 = client messages\n// 2 = client and server messages\n$mail->SMTPDebug = 2;\n\n//Ask for HTML-friendly debug output\n$mail->Debugoutput = 'html';\n\n//Set the hostname of the mail server\n$mail->Host = 'smtp.gmail.com';\n// use\n// $mail->Host = gethostbyname('smtp.gmail.com');\n// if your network does not support SMTP over IPv6\n\n//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission\n$mail->Port = 587;\n\n//Set the encryption system to use - ssl (deprecated) or tls\n$mail->SMTPSecure = 'tls';\n\n//Whether to use SMTP authentication\n$mail->SMTPAuth = true;\n\n//Username to use for SMTP authentication - use full email address for gmail\n$mail->Username = \"username@gmail.com\";\n\n//Password to use for SMTP authentication\n$mail->Password = \"yourpassword\";\n\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n\n//Set the subject line\n$mail->Subject = 'PHPMailer GMail SMTP test';\n\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n    //Section 2: IMAP\n    //Uncomment these to save your message in the 'Sent Mail' folder.\n    #if (save_mail($mail)) {\n    #    echo \"Message saved!\";\n    #}\n}\n\n//Section 2: IMAP\n//IMAP commands requires the PHP IMAP Extension, found at: https://php.net/manual/en/imap.setup.php\n//Function to call which uses the PHP imap_*() functions to save messages: https://php.net/manual/en/book.imap.php\n//You can use imap_getmailboxes($imapStream, '/imap/ssl') to get a list of available folders or labels, this can\n//be useful if you are trying to get this working on a non-Gmail IMAP server.\nfunction save_mail($mail) {\n    //You can change 'Sent Mail' to any other folder or tag\n    $path = \"{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail\";\n\n    //Tell your server to open an IMAP connection using the same username and password as you used for SMTP\n    $imapStream = imap_open($path, $mail->Username, $mail->Password);\n\n    $result = imap_append($imapStream, $path, $mail->getSentMIMEMessage());\n    imap_close($imapStream);\n\n    return $result;\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/gmail_xoauth.phps",
    "content": "<?php\n/**\n * This example shows settings to use when sending via Google's Gmail servers.\n */\n\n//SMTP needs accurate times, and the PHP time zone MUST be set\n//This should be done in your php.ini, but this is how to do it if you don't have access to that\ndate_default_timezone_set('Etc/UTC');\n\nrequire '../PHPMailerAutoload.php';\n\n//Load dependencies from composer\n//If this causes an error, run 'composer install'\nrequire '../vendor/autoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailerOAuth;\n\n//Tell PHPMailer to use SMTP\n$mail->isSMTP();\n\n//Enable SMTP debugging\n// 0 = off (for production use)\n// 1 = client messages\n// 2 = client and server messages\n$mail->SMTPDebug = 0;\n\n//Ask for HTML-friendly debug output\n$mail->Debugoutput = 'html';\n\n//Set the hostname of the mail server\n$mail->Host = 'smtp.gmail.com';\n\n//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission\n$mail->Port = 587;\n\n//Set the encryption system to use - ssl (deprecated) or tls\n$mail->SMTPSecure = 'tls';\n\n//Whether to use SMTP authentication\n$mail->SMTPAuth = true;\n\n//Set AuthType\n$mail->AuthType = 'XOAUTH2';\n\n//User Email to use for SMTP authentication - user who gave consent to our app\n$mail->oauthUserEmail = \"from@gmail.com\";\n\n//Obtained From Google Developer Console\n$mail->oauthClientId = \"RANDOMCHARS-----duv1n2.apps.googleusercontent.com\";\n\n//Obtained From Google Developer Console\n$mail->oauthClientSecret = \"RANDOMCHARS-----lGyjPcRtvP\";\n\n//Obtained By running get_oauth_token.php after setting up APP in Google Developer Console.\n//Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php\n// eg: http://localhost/phpmail/get_oauth_token.php\n$mail->oauthRefreshToken = \"RANDOMCHARS-----DWxgOvPT003r-yFUV49TQYag7_Aod7y0\";\n\n//Set who the message is to be sent from\n//For gmail, this generally needs to be the same as the user you logged in as\n$mail->setFrom('from@example.com', 'First Last');\n\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n\n//Set the subject line\n$mail->Subject = 'PHPMailer GMail SMTP test';\n\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"UTF-8\">\n\t<title>PHPMailer Examples</title>\n</head>\n<body>\n<h1>PHPMailer code examples<a href=\"https://github.com/PHPMailer/PHPMailer\"><img src=\"images/phpmailer.png\" style=\"float:right; border:0;\" alt=\"PHPMailer logo\"></a></h1>\n<p>This folder contains a collection of examples of using <a href=\"https://github.com/PHPMailer/PHPMailer\">PHPMailer</a>.</p>\n<h2>About testing email sending</h2>\n<p>When working on email sending code you'll find yourself worrying about what might happen if all these test emails got sent to your mailing list. The solution is to use a fake mail server, one that acts just like the real thing, but just doesn't actually send anything out. Some offer web interfaces, feedback, logging, the ability to return specific error codes, all things that are useful for testing error handling, authentication etc. Here's a selection of mail testing tools you might like to try:</p>\n<ul>\n  <li><a href=\"https://github.com/Nilhcem/FakeSMTP\">FakeSMTP</a>, a Java desktop app with the ability to show an SMTP log and save messages to a folder. </li>\n  <li><a href=\"https://github.com/isotoma/FakeEmail\">FakeEmail</a>, a Python-based fake mail server with a web interface.</li>\n  <li><a href=\"http://www.postfix.org/smtp-sink.1.html\">smtp-sink</a>, part of the Postfix mail server, so you probably already have this installed. This is used in the Travis-CI configuration to run PHPMailer's unit tests.</li>\n  <li><a href=\"http://smtp4dev.codeplex.com\">smtp4dev</a>, a dummy SMTP server for Windows.</li>\n  <li><a href=\"https://github.com/PHPMailer/PHPMailer/blob/master/test/fakesendmail.sh\">fakesendmail.sh</a>, part of PHPMailer's test setup, this is a shell script that emulates sendmail for testing 'mail' or 'sendmail' methods in PHPMailer.</li>\n  <li><a href=\"http://tools.ietf.org/tools/msglint/\">msglint</a>, not a mail server, the IETF's MIME structure analyser checks the formatting of your messages.</li>\n</ul>\n<div style=\"padding: 8px; color: #333333; background-color: #dc8b92\">\n<h2>Security note</h2>\n<p>Before running these examples you'll need to rename them with '.php' extensions. They are supplied as '.phps' files which will usually be displayed with syntax highlighting by PHP instead of running them. This prevents potential security issues with running potential spam-gateway code if you happen to deploy these code examples on a live site - <em>please don't do that!</em> Similarly, don't leave your passwords in these files as they will be visible to the world!</p>\n</div>\n<h2><a href=\"code_generator.phps\">code_generator.phps</a></h2>\n<p>This script is a simple code generator - fill in the form and hit submit, and it will use when you entered to email you a message, and will also generate PHP code using your settings that you can copy and paste to use in your own apps. If you need to get going quickly, this is probably the best place to start.</p>\n<h2><a href=\"mail.phps\">mail.phps</a></h2>\n<p>This script is a basic example which creates an email message from an external HTML file, creates a plain text body, sets various addresses, adds an attachment and sends the message. It uses PHP's built-in mail() function which is the simplest to use, but relies on the presence of a local mail server, something which is not usually available on Windows. If you find yourself in that situation, either install a local mail server, or use a remote one and send using SMTP instead.</p>\n<h2><a href=\"exceptions.phps\">exceptions.phps</a></h2>\n<p>The same as the mail example, but shows how to use PHPMailer's optional exceptions for error handling.</p>\n<h2><a href=\"smtp.phps\">smtp.phps</a></h2>\n<p>A simple example sending using SMTP with authentication.</p>\n<h2><a href=\"smtp_no_auth.phps\">smtp_no_auth.phps</a></h2>\n<p>A simple example sending using SMTP without authentication.</p>\n<h2><a href=\"sendmail.phps\">sendmail.phps</a></h2>\n<p>A simple example using sendmail. Sendmail is a program (usually found on Linux/BSD, OS X and other UNIX-alikes) that can be used to submit messages to a local mail server without a lengthy SMTP conversation. It's probably the fastest sending mechanism, but lacks some error reporting features. There are sendmail emulators for most popular mail servers including postfix, qmail, exim etc.</p>\n<h2><a href=\"gmail.phps\">gmail.phps</a></h2>\n<p>Submitting email via Google's Gmail service is a popular use of PHPMailer. It's much the same as normal SMTP sending, just with some specific settings, namely using TLS encryption, authentication is enabled, and it connects to the SMTP submission port 587 on the smtp.gmail.com host. This example does all that.</p>\n<h2><a href=\"pop_before_smtp.phps\">pop_before_smtp.phps</a></h2>\n<p>Before effective SMTP authentication mechanisms were available, it was common for ISPs to use POP-before-SMTP authentication. As it implies, you authenticate using the POP3 protocol (an older protocol now mostly replaced by the far superior IMAP), and then the SMTP server will allow send access from your IP address for a short while, usually 5-15 minutes. PHPMailer includes a POP3 protocol client, so it can carry out this sequence - it's just like a normal SMTP conversation (without authentication), but connects via POP first.</p>\n<h2><a href=\"mailing_list.phps\">mailing_list.phps</a></h2>\n<p>This is a somewhat naïve example of sending similar emails to a list of different addresses. It sets up a PHPMailer instance using SMTP, then connects to a MySQL database to retrieve a list of recipients. The code loops over this list, sending email to each person using their info and marks them as sent in the database. It makes use of SMTP keepalive which saves reconnecting and re-authenticating between each message.</p>\n<hr>\n<h2><a href=\"smtp_check.phps\">smtp_check.phps</a></h2>\n<p>This is an example showing how to use the SMTP class by itself (without PHPMailer) to check an SMTP connection.</p>\n<hr>\n<p>Most of these examples use the 'example.com' domain. This domain is reserved by IANA for illustrative purposes, as documented in <a href=\"http://tools.ietf.org/html/rfc2606\">RFC 2606</a>. Don't use made-up domains like 'mydomain.com' or 'somedomain.com' in examples as someone, somewhere, probably owns them!</p>\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/mail.phps",
    "content": "<?php\n/**\n * This example shows sending a message using PHP's mail() function.\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer mail() test';\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/mailing_list.phps",
    "content": "<?php\n\nerror_reporting(E_STRICT | E_ALL);\n\ndate_default_timezone_set('Etc/UTC');\n\nrequire '../PHPMailerAutoload.php';\n\n$mail = new PHPMailer;\n\n$body = file_get_contents('contents.html');\n\n$mail->isSMTP();\n$mail->Host = 'smtp.example.com';\n$mail->SMTPAuth = true;\n$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead\n$mail->Port = 25;\n$mail->Username = 'yourname@example.com';\n$mail->Password = 'yourpassword';\n$mail->setFrom('list@example.com', 'List manager');\n$mail->addReplyTo('list@example.com', 'List manager');\n\n$mail->Subject = \"PHPMailer Simple database mailing list test\";\n\n//Same body for all messages, so set this before the sending loop\n//If you generate a different body for each recipient (e.g. you're using a templating system),\n//set it inside the loop\n$mail->msgHTML($body);\n//msgHTML also sets AltBody, but if you want a custom one, set it afterwards\n$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';\n\n//Connect to the database and select the recipients from your mailing list that have not yet been sent to\n//You'll need to alter this to match your database\n$mysql = mysqli_connect('localhost', 'username', 'password');\nmysqli_select_db($mysql, 'mydb');\n$result = mysqli_query($mysql, 'SELECT full_name, email, photo FROM mailinglist WHERE sent = false');\n\nforeach ($result as $row) { //This iterator syntax only works in PHP 5.4+\n    $mail->addAddress($row['email'], $row['full_name']);\n    if (!empty($row['photo'])) {\n        $mail->addStringAttachment($row['photo'], 'YourPhoto.jpg'); //Assumes the image data is stored in the DB\n    }\n\n    if (!$mail->send()) {\n        echo \"Mailer Error (\" . str_replace(\"@\", \"&#64;\", $row[\"email\"]) . ') ' . $mail->ErrorInfo . '<br />';\n        break; //Abandon sending\n    } else {\n        echo \"Message sent to :\" . $row['full_name'] . ' (' . str_replace(\"@\", \"&#64;\", $row['email']) . ')<br />';\n        //Mark it as sent in the DB\n        mysqli_query(\n            $mysql,\n            \"UPDATE mailinglist SET sent = true WHERE email = '\" .\n            mysqli_real_escape_string($mysql, $row['email']) . \"'\"\n        );\n    }\n    // Clear all addresses and attachments for next loop\n    $mail->clearAddresses();\n    $mail->clearAttachments();\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/pop_before_smtp.phps",
    "content": "<?php\n/**\n * This example shows how to use POP-before-SMTP for authentication.\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Authenticate via POP3.\n//After this you should be allowed to submit messages over SMTP for a while.\n//Only applies if your host supports POP-before-SMTP.\n$pop = POP3::popBeforeSmtp('pop3.example.com', 110, 30, 'username', 'password', 1);\n\n//Create a new PHPMailer instance\n//Passing true to the constructor enables the use of exceptions for error handling\n$mail = new PHPMailer(true);\ntry {\n    $mail->isSMTP();\n    //Enable SMTP debugging\n    // 0 = off (for production use)\n    // 1 = client messages\n    // 2 = client and server messages\n    $mail->SMTPDebug = 2;\n    //Ask for HTML-friendly debug output\n    $mail->Debugoutput = 'html';\n    //Set the hostname of the mail server\n    $mail->Host = \"mail.example.com\";\n    //Set the SMTP port number - likely to be 25, 465 or 587\n    $mail->Port = 25;\n    //Whether to use SMTP authentication\n    $mail->SMTPAuth = false;\n    //Set who the message is to be sent from\n    $mail->setFrom('from@example.com', 'First Last');\n    //Set an alternative reply-to address\n    $mail->addReplyTo('replyto@example.com', 'First Last');\n    //Set who the message is to be sent to\n    $mail->addAddress('whoto@example.com', 'John Doe');\n    //Set the subject line\n    $mail->Subject = 'PHPMailer POP-before-SMTP test';\n    //Read an HTML message body from an external file, convert referenced images to embedded,\n    //and convert the HTML into a basic plain-text alternative body\n    $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n    //Replace the plain text body with one created manually\n    $mail->AltBody = 'This is a plain-text message body';\n    //Attach an image file\n    $mail->addAttachment('images/phpmailer_mini.png');\n    //send the message\n    //Note that we don't need check the response from this because it will throw an exception if it has trouble\n    $mail->send();\n    echo \"Message sent!\";\n} catch (phpmailerException $e) {\n    echo $e->errorMessage(); //Pretty error messages from PHPMailer\n} catch (Exception $e) {\n    echo $e->getMessage(); //Boring error messages from anything else!\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/scripts/XRegExp.js",
    "content": "// XRegExp 1.5.1\n// (c) 2007-2012 Steven Levithan\n// MIT License\n// <http://xregexp.com>\n// Provides an augmented, extensible, cross-browser implementation of regular expressions,\n// including support for additional syntax, flags, and methods\n\nvar XRegExp;\n\nif (XRegExp) {\n    // Avoid running twice, since that would break references to native globals\n    throw Error(\"can't load XRegExp twice in the same frame\");\n}\n\n// Run within an anonymous function to protect variables and avoid new globals\n(function (undefined) {\n\n    //---------------------------------\n    //  Constructor\n    //---------------------------------\n\n    // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native\n    // regular expression in that additional syntax and flags are supported and cross-browser\n    // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and\n    // converts to type XRegExp\n    XRegExp = function (pattern, flags) {\n        var output = [],\n            currScope = XRegExp.OUTSIDE_CLASS,\n            pos = 0,\n            context, tokenResult, match, chr, regex;\n\n        if (XRegExp.isRegExp(pattern)) {\n            if (flags !== undefined)\n                throw TypeError(\"can't supply flags when constructing one RegExp from another\");\n            return clone(pattern);\n        }\n        // Tokens become part of the regex construction process, so protect against infinite\n        // recursion when an XRegExp is constructed within a token handler or trigger\n        if (isInsideConstructor)\n            throw Error(\"can't call the XRegExp constructor within token definition functions\");\n\n        flags = flags || \"\";\n        context = { // `this` object for custom tokens\n            hasNamedCapture: false,\n            captureNames: [],\n            hasFlag: function (flag) {return flags.indexOf(flag) > -1;},\n            setFlag: function (flag) {flags += flag;}\n        };\n\n        while (pos < pattern.length) {\n            // Check for custom tokens at the current position\n            tokenResult = runTokens(pattern, pos, currScope, context);\n\n            if (tokenResult) {\n                output.push(tokenResult.output);\n                pos += (tokenResult.match[0].length || 1);\n            } else {\n                // Check for native multicharacter metasequences (excluding character classes) at\n                // the current position\n                if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) {\n                    output.push(match[0]);\n                    pos += match[0].length;\n                } else {\n                    chr = pattern.charAt(pos);\n                    if (chr === \"[\")\n                        currScope = XRegExp.INSIDE_CLASS;\n                    else if (chr === \"]\")\n                        currScope = XRegExp.OUTSIDE_CLASS;\n                    // Advance position one character\n                    output.push(chr);\n                    pos++;\n                }\n            }\n        }\n\n        regex = RegExp(output.join(\"\"), nativ.replace.call(flags, flagClip, \"\"));\n        regex._xregexp = {\n            source: pattern,\n            captureNames: context.hasNamedCapture ? context.captureNames : null\n        };\n        return regex;\n    };\n\n\n    //---------------------------------\n    //  Public properties\n    //---------------------------------\n\n    XRegExp.version = \"1.5.1\";\n\n    // Token scope bitflags\n    XRegExp.INSIDE_CLASS = 1;\n    XRegExp.OUTSIDE_CLASS = 2;\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var replacementToken = /\\$(?:(\\d\\d?|[$&`'])|{([$\\w]+)})/g,\n        flagClip = /[^gimy]+|([\\s\\S])(?=[\\s\\S]*\\1)/g, // Nonnative and duplicate flags\n        quantifier = /^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,\n        isInsideConstructor = false,\n        tokens = [],\n        // Copy native globals for reference (\"native\" is an ES3 reserved keyword)\n        nativ = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = nativ.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            nativ.test.call(x, \"\");\n            return !x.lastIndex;\n        }(),\n        hasNativeY = RegExp.prototype.sticky !== undefined,\n        nativeTokens = {};\n\n    // `nativeTokens` match native multicharacter metasequences only (including deprecated octals,\n    // excluding character classes)\n    nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u[\\dA-Fa-f]{4}|c[A-Za-z]|[\\s\\S]))/;\n    nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u[\\dA-Fa-f]{4}|c[A-Za-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/;\n\n\n    //---------------------------------\n    //  Public methods\n    //---------------------------------\n\n    // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by\n    // the XRegExp library and can be used to create XRegExp plugins. This function is intended for\n    // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can\n    // be disabled by `XRegExp.freezeTokens`\n    XRegExp.addToken = function (regex, handler, scope, trigger) {\n        tokens.push({\n            pattern: clone(regex, \"g\" + (hasNativeY ? \"y\" : \"\")),\n            handler: handler,\n            scope: scope || XRegExp.OUTSIDE_CLASS,\n            trigger: trigger || null\n        });\n    };\n\n    // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag\n    // combination has previously been cached, the cached copy is returned; otherwise the newly\n    // created regex is cached\n    XRegExp.cache = function (pattern, flags) {\n        var key = pattern + \"/\" + (flags || \"\");\n        return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags));\n    };\n\n    // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh\n    // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global`\n    // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve\n    // special properties required for named capture\n    XRegExp.copyAsGlobal = function (regex) {\n        return clone(regex, \"g\");\n    };\n\n    // Accepts a string; returns the string with regex metacharacters escaped. The returned string\n    // can safely be used at any point within a regex to match the provided literal string. Escaped\n    // characters are [ ] { } ( ) * + ? - . , \\ ^ $ | # and whitespace\n    XRegExp.escape = function (str) {\n        return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n    };\n\n    // Accepts a string to search, regex to search with, position to start the search within the\n    // string (default: 0), and an optional Boolean indicating whether matches must start at-or-\n    // after the position or at the specified position only. This function ignores the `lastIndex`\n    // of the provided regex in its own handling, but updates the property for compatibility\n    XRegExp.execAt = function (str, regex, pos, anchored) {\n        var r2 = clone(regex, \"g\" + ((anchored && hasNativeY) ? \"y\" : \"\")),\n            match;\n        r2.lastIndex = pos = pos || 0;\n        match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.)\n        if (anchored && match && match.index !== pos)\n            match = null;\n        if (regex.global)\n            regex.lastIndex = match ? r2.lastIndex : 0;\n        return match;\n    };\n\n    // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing\n    // syntax and flag changes. Should be run after XRegExp and any plugins are loaded\n    XRegExp.freezeTokens = function () {\n        XRegExp.addToken = function () {\n            throw Error(\"can't run addToken after freezeTokens\");\n        };\n    };\n\n    // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object.\n    // Note that this is also `true` for regex literals and regexes created by the `XRegExp`\n    // constructor. This works correctly for variables created in another frame, when `instanceof`\n    // and `constructor` checks would fail to work as intended\n    XRegExp.isRegExp = function (o) {\n        return Object.prototype.toString.call(o) === \"[object RegExp]\";\n    };\n\n    // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to\n    // iterate over regex matches compared to the traditional approaches of subverting\n    // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop\n    XRegExp.iterate = function (str, regex, callback, context) {\n        var r2 = clone(regex, \"g\"),\n            i = -1, match;\n        while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)\n            if (regex.global)\n                regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback`\n            callback.call(context, match, ++i, str, regex);\n            if (r2.lastIndex === match.index)\n                r2.lastIndex++;\n        }\n        if (regex.global)\n            regex.lastIndex = 0;\n    };\n\n    // Accepts a string and an array of regexes; returns the result of using each successive regex\n    // to search within the matches of the previous regex. The array of regexes can also contain\n    // objects with `regex` and `backref` properties, in which case the named or numbered back-\n    // references specified are passed forward to the next regex or returned. E.g.:\n    // var xregexpImgFileNames = XRegExp.matchChain(html, [\n    //     {regex: /<img\\b([^>]+)>/i, backref: 1}, // <img> tag attributes\n    //     {regex: XRegExp('(?ix) \\\\s src=\" (?<src> [^\"]+ )'), backref: \"src\"}, // src attribute values\n    //     {regex: XRegExp(\"^http://xregexp\\\\.com(/[^#?]+)\", \"i\"), backref: 1}, // xregexp.com paths\n    //     /[^\\/]+$/ // filenames (strip directory paths)\n    // ]);\n    XRegExp.matchChain = function (str, chain) {\n        return function recurseChain (values, level) {\n            var item = chain[level].regex ? chain[level] : {regex: chain[level]},\n                regex = clone(item.regex, \"g\"),\n                matches = [], i;\n            for (i = 0; i < values.length; i++) {\n                XRegExp.iterate(values[i], regex, function (match) {\n                    matches.push(item.backref ? (match[item.backref] || \"\") : match[0]);\n                });\n            }\n            return ((level === chain.length - 1) || !matches.length) ?\n                matches : recurseChain(matches, level + 1);\n        }([str], 0);\n    };\n\n\n    //---------------------------------\n    //  New RegExp prototype methods\n    //---------------------------------\n\n    // Accepts a context object and arguments array; returns the result of calling `exec` with the\n    // first value in the arguments array. the context is ignored but is accepted for congruity\n    // with `Function.prototype.apply`\n    RegExp.prototype.apply = function (context, args) {\n        return this.exec(args[0]);\n    };\n\n    // Accepts a context object and string; returns the result of calling `exec` with the provided\n    // string. the context is ignored but is accepted for congruity with `Function.prototype.call`\n    RegExp.prototype.call = function (context, str) {\n        return this.exec(str);\n    };\n\n\n    //---------------------------------\n    //  Overridden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match, name, r2, origLastIndex;\n        if (!this.global)\n            origLastIndex = this.lastIndex;\n        match = nativ.exec.apply(this, arguments);\n        if (match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                nativ.replace.call((str + \"\").slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        if (!this.global)\n            this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)\n        return match;\n    };\n\n    // Fix browser bugs in native method\n    RegExp.prototype.test = function (str) {\n        // Use the native `exec` to skip some processing overhead, even though the altered\n        // `exec` would take care of the `lastIndex` fixes\n        var match, origLastIndex;\n        if (!this.global)\n            origLastIndex = this.lastIndex;\n        match = nativ.exec.call(this, str);\n        // Fix browsers that increment `lastIndex` after zero-length matches\n        if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n            this.lastIndex--;\n        if (!this.global)\n            this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)\n        return !!match;\n    };\n\n    // Adds named capture support and fixes browser bugs in native method\n    String.prototype.match = function (regex) {\n        if (!XRegExp.isRegExp(regex))\n            regex = RegExp(regex); // Native `RegExp`\n        if (regex.global) {\n            var result = nativ.match.apply(this, arguments);\n            regex.lastIndex = 0; // Fix IE bug\n            return result;\n        }\n        return regex.exec(this); // Run the altered `exec`\n    };\n\n    // Adds support for `${n}` tokens for named and numbered backreferences in replacement text,\n    // and provides named backreferences to replacement functions as `arguments[0].name`. Also\n    // fixes cross-browser differences in replacement text syntax when performing a replacement\n    // using a nonregex search value, and the value of replacement regexes' `lastIndex` property\n    // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary\n    // third (`flags`) parameter\n    String.prototype.replace = function (search, replacement) {\n        var isRegex = XRegExp.isRegExp(search),\n            captureNames, result, str, origLastIndex;\n\n        // There are too many combinations of search/replacement types/values and browser bugs that\n        // preclude passing to native `replace`, so don't try\n        //if (...)\n        //    return nativ.replace.apply(this, arguments);\n\n        if (isRegex) {\n            if (search._xregexp)\n                captureNames = search._xregexp.captureNames; // Array or `null`\n            if (!search.global)\n                origLastIndex = search.lastIndex;\n        } else {\n            search = search + \"\"; // Type conversion\n        }\n\n        if (Object.prototype.toString.call(replacement) === \"[object Function]\") {\n            result = nativ.replace.call(this + \"\", search, function () {\n                if (captureNames) {\n                    // Change the `arguments[0]` string primitive to a String object which can store properties\n                    arguments[0] = new String(arguments[0]);\n                    // Store named backreferences on `arguments[0]`\n                    for (var i = 0; i < captureNames.length; i++) {\n                        if (captureNames[i])\n                            arguments[0][captureNames[i]] = arguments[i + 1];\n                    }\n                }\n                // Update `lastIndex` before calling `replacement` (fix browsers)\n                if (isRegex && search.global)\n                    search.lastIndex = arguments[arguments.length - 2] + arguments[0].length;\n                return replacement.apply(null, arguments);\n            });\n        } else {\n            str = this + \"\"; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`)\n            result = nativ.replace.call(str, search, function () {\n                var args = arguments; // Keep this function's `arguments` available through closure\n                return nativ.replace.call(replacement + \"\", replacementToken, function ($0, $1, $2) {\n                    // Numbered backreference (without delimiters) or special variable\n                    if ($1) {\n                        switch ($1) {\n                            case \"$\": return \"$\";\n                            case \"&\": return args[0];\n                            case \"`\": return args[args.length - 1].slice(0, args[args.length - 2]);\n                            case \"'\": return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                            // Numbered backreference\n                            default:\n                                // What does \"$10\" mean?\n                                // - Backreference 10, if 10 or more capturing groups exist\n                                // - Backreference 1 followed by \"0\", if 1-9 capturing groups exist\n                                // - Otherwise, it's the string \"$10\"\n                                // Also note:\n                                // - Backreferences cannot be more than two digits (enforced by `replacementToken`)\n                                // - \"$01\" is equivalent to \"$1\" if a capturing group exists, otherwise it's the string \"$01\"\n                                // - There is no \"$0\" token (\"$&\" is the entire match)\n                                var literalNumbers = \"\";\n                                $1 = +$1; // Type conversion; drop leading zero\n                                if (!$1) // `$1` was \"0\" or \"00\"\n                                    return $0;\n                                while ($1 > args.length - 3) {\n                                    literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers;\n                                    $1 = Math.floor($1 / 10); // Drop the last digit\n                                }\n                                return ($1 ? args[$1] || \"\" : \"$\") + literalNumbers;\n                        }\n                    // Named backreference or delimited numbered backreference\n                    } else {\n                        // What does \"${n}\" mean?\n                        // - Backreference to numbered capture n. Two differences from \"$n\":\n                        //   - n can be more than two digits\n                        //   - Backreference 0 is allowed, and is the entire match\n                        // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture\n                        // - Otherwise, it's the string \"${n}\"\n                        var n = +$2; // Type conversion; drop leading zeros\n                        if (n <= args.length - 3)\n                            return args[n];\n                        n = captureNames ? indexOf(captureNames, $2) : -1;\n                        return n > -1 ? args[n + 1] : $0;\n                    }\n                });\n            });\n        }\n\n        if (isRegex) {\n            if (search.global)\n                search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows)\n            else\n                search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)\n        }\n\n        return result;\n    };\n\n    // A consistent cross-browser, ES3 compliant `split`\n    String.prototype.split = function (s /* separator */, limit) {\n        // If separator `s` is not a regex, use the native `split`\n        if (!XRegExp.isRegExp(s))\n            return nativ.split.apply(this, arguments);\n\n        var str = this + \"\", // Type conversion\n            output = [],\n            lastLastIndex = 0,\n            match, lastLength;\n\n        // Behavior for `limit`: if it's...\n        // - `undefined`: No limit\n        // - `NaN` or zero: Return an empty array\n        // - A positive number: Use `Math.floor(limit)`\n        // - A negative number: No limit\n        // - Other: Type-convert, then use the above rules\n        if (limit === undefined || +limit < 0) {\n            limit = Infinity;\n        } else {\n            limit = Math.floor(+limit);\n            if (!limit)\n                return [];\n        }\n\n        // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero\n        // and restore it to its original value when we're done using the regex\n        s = XRegExp.copyAsGlobal(s);\n\n        while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)\n            if (s.lastIndex > lastLastIndex) {\n                output.push(str.slice(lastLastIndex, match.index));\n\n                if (match.length > 1 && match.index < str.length)\n                    Array.prototype.push.apply(output, match.slice(1));\n\n                lastLength = match[0].length;\n                lastLastIndex = s.lastIndex;\n\n                if (output.length >= limit)\n                    break;\n            }\n\n            if (s.lastIndex === match.index)\n                s.lastIndex++;\n        }\n\n        if (lastLastIndex === str.length) {\n            if (!nativ.test.call(s, \"\") || lastLength)\n                output.push(\"\");\n        } else {\n            output.push(str.slice(lastLastIndex));\n        }\n\n        return output.length > limit ? output.slice(0, limit) : output;\n    };\n\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp`\n    // instance with a fresh `lastIndex` (set to zero), preserving properties required for named\n    // capture. Also allows adding new flags in the process of copying the regex\n    function clone (regex, additionalFlags) {\n        if (!XRegExp.isRegExp(regex))\n            throw TypeError(\"type RegExp expected\");\n        var x = regex._xregexp;\n        regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || \"\"));\n        if (x) {\n            regex._xregexp = {\n                source: x.source,\n                captureNames: x.captureNames ? x.captureNames.slice(0) : null\n            };\n        }\n        return regex;\n    }\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function runTokens (pattern, index, scope, context) {\n        var i = tokens.length,\n            result, match, t;\n        // Protect against constructing XRegExps within token handler and trigger functions\n        isInsideConstructor = true;\n        // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws\n        try {\n            while (i--) { // Run in reverse order\n                t = tokens[i];\n                if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) {\n                    t.pattern.lastIndex = index;\n                    match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc.\n                    if (match && match.index === index) {\n                        result = {\n                            output: t.handler.call(context, match, scope),\n                            match: match\n                        };\n                        break;\n                    }\n                }\n            }\n        } catch (err) {\n            throw err;\n        } finally {\n            isInsideConstructor = false;\n        }\n        return result;\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n\n    //---------------------------------\n    //  Built-in tokens\n    //---------------------------------\n\n    // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the\n    // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS`\n\n    // Comment pattern: (?# )\n    XRegExp.addToken(\n        /\\(\\?#[^)]*\\)/,\n        function (match) {\n            // Keep tokens separated unless the following token is a quantifier\n            return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? \"\" : \"(?:)\";\n        }\n    );\n\n    // Capturing group (match the opening parenthesis only).\n    // Required for support of named capturing groups\n    XRegExp.addToken(\n        /\\((?!\\?)/,\n        function () {\n            this.captureNames.push(null);\n            return \"(\";\n        }\n    );\n\n    // Named capturing group (match the opening delimiter only): (?<name>\n    XRegExp.addToken(\n        /\\(\\?<([$\\w]+)>/,\n        function (match) {\n            this.captureNames.push(match[1]);\n            this.hasNamedCapture = true;\n            return \"(\";\n        }\n    );\n\n    // Named backreference: \\k<name>\n    XRegExp.addToken(\n        /\\\\k<([\\w$]+)>/,\n        function (match) {\n            var index = indexOf(this.captureNames, match[1]);\n            // Keep backreferences separate from subsequent literal numbers. Preserve back-\n            // references to named groups that are undefined at this point as literal strings\n            return index > -1 ?\n                \"\\\\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? \"\" : \"(?:)\") :\n                match[0];\n        }\n    );\n\n    // Empty character class: [] or [^]\n    XRegExp.addToken(\n        /\\[\\^?]/,\n        function (match) {\n            // For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n            // (?!) should work like \\b\\B, but is unreliable in Firefox\n            return match[0] === \"[]\" ? \"\\\\b\\\\B\" : \"[\\\\s\\\\S]\";\n        }\n    );\n\n    // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx)\n    // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc.\n    XRegExp.addToken(\n        /^\\(\\?([imsx]+)\\)/,\n        function (match) {\n            this.setFlag(match[1]);\n            return \"\";\n        }\n    );\n\n    // Whitespace and comments, in free-spacing (aka extended) mode only\n    XRegExp.addToken(\n        /(?:\\s+|#.*)+/,\n        function (match) {\n            // Keep tokens separated unless the following token is a quantifier\n            return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? \"\" : \"(?:)\";\n        },\n        XRegExp.OUTSIDE_CLASS,\n        function () {return this.hasFlag(\"x\");}\n    );\n\n    // Dot, in dotall (aka singleline) mode only\n    XRegExp.addToken(\n        /\\./,\n        function () {return \"[\\\\s\\\\S]\";},\n        XRegExp.OUTSIDE_CLASS,\n        function () {return this.hasFlag(\"s\");}\n    );\n\n\n    //---------------------------------\n    //  Backward compatibility\n    //---------------------------------\n\n    // Uncomment the following block for compatibility with XRegExp 1.0-1.2:\n    /*\n    XRegExp.matchWithinChain = XRegExp.matchChain;\n    RegExp.prototype.addFlags = function (s) {return clone(this, s);};\n    RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;};\n    RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);};\n    RegExp.prototype.validate = function (s) {var r = RegExp(\"^(?:\" + this.source + \")$(?!\\\\s)\", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;};\n    */\n\n})();\n\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/scripts/shAutoloader.js",
    "content": "(function() {\n\nvar sh = SyntaxHighlighter;\n\n/**\n * Provides functionality to dynamically load only the brushes that a needed to render the current page.\n *\n * There are two syntaxes that autoload understands. For example:\n *\n * SyntaxHighlighter.autoloader(\n *     [ 'applescript',          'Scripts/shBrushAppleScript.js' ],\n *     [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ]\n * );\n *\n * or a more easily comprehendable one:\n *\n * SyntaxHighlighter.autoloader(\n *     'applescript       Scripts/shBrushAppleScript.js',\n *     'actionscript3 as3 Scripts/shBrushAS3.js'\n * );\n */\nsh.autoloader = function()\n{\n\tvar list = arguments,\n\t\telements = sh.findElements(),\n\t\tbrushes = {},\n\t\tscripts = {},\n\t\tall = SyntaxHighlighter.all,\n\t\tallCalled = false,\n\t\tallParams = null,\n\t\ti\n\t\t;\n\n\tSyntaxHighlighter.all = function(params)\n\t{\n\t\tallParams = params;\n\t\tallCalled = true;\n\t};\n\n\tfunction addBrush(aliases, url)\n\t{\n\t\tfor (var i = 0; i < aliases.length; i++)\n\t\t\tbrushes[aliases[i]] = url;\n\t};\n\n\tfunction getAliases(item)\n\t{\n\t\treturn item.pop\n\t\t\t? item\n\t\t\t: item.split(/\\s+/)\n\t\t\t;\n\t}\n\n\t// create table of aliases and script urls\n\tfor (i = 0; i < list.length; i++)\n\t{\n\t\tvar aliases = getAliases(list[i]),\n\t\t\turl = aliases.pop()\n\t\t\t;\n\n\t\taddBrush(aliases, url);\n\t}\n\n\t// dynamically add <script /> tags to the document body\n\tfor (i = 0; i < elements.length; i++)\n\t{\n\t\tvar url = brushes[elements[i].params.brush];\n\n\t\tif(url && scripts[url] === undefined)\n\t\t{\n\t\t\tif(elements[i].params['html-script'] === 'true')\n\t\t\t{\n\t\t\t\tif(scripts[brushes['xml']] === undefined) {\n\t\t\t\t\tloadScript(brushes['xml']);\n\t\t\t\t\tscripts[url] = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tscripts[url] = false;\n\t\t\tloadScript(url);\n\t\t}\n\t}\n\n\tfunction loadScript(url)\n\t{\n\t\tvar script = document.createElement('script'),\n\t\t\tdone = false\n\t\t\t;\n\n\t\tscript.src = url;\n\t\tscript.type = 'text/javascript';\n\t\tscript.language = 'javascript';\n\t\tscript.onload = script.onreadystatechange = function()\n\t\t{\n\t\t\tif (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete'))\n\t\t\t{\n\t\t\t\tdone = true;\n\t\t\t\tscripts[url] = true;\n\t\t\t\tcheckAll();\n\n\t\t\t\t// Handle memory leak in IE\n\t\t\t\tscript.onload = script.onreadystatechange = null;\n\t\t\t\tscript.parentNode.removeChild(script);\n\t\t\t}\n\t\t};\n\n\t\t// sync way of adding script tags to the page\n\t\tdocument.body.appendChild(script);\n\t};\n\n\tfunction checkAll()\n\t{\n\t\tfor(var url in scripts)\n\t\t\tif (scripts[url] == false)\n\t\t\t\treturn;\n\n\t\tif (allCalled)\n\t\t\tSyntaxHighlighter.highlight(allParams);\n\t};\n};\n\n})();\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/scripts/shBrushPhp.js",
    "content": ";(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar funcs\t=\t'abs acos acosh addcslashes addslashes ' +\n\t\t\t\t\t\t'array_change_key_case array_chunk array_combine array_count_values array_diff '+\n\t\t\t\t\t\t'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+\n\t\t\t\t\t\t'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+\n\t\t\t\t\t\t'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+\n\t\t\t\t\t\t'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+\n\t\t\t\t\t\t'array_push array_rand array_reduce array_reverse array_search array_shift '+\n\t\t\t\t\t\t'array_slice array_splice array_sum array_udiff array_udiff_assoc '+\n\t\t\t\t\t\t'array_udiff_uassoc array_uintersect array_uintersect_assoc '+\n\t\t\t\t\t\t'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+\n\t\t\t\t\t\t'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+\n\t\t\t\t\t\t'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+\n\t\t\t\t\t\t'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+\n\t\t\t\t\t\t'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+\n\t\t\t\t\t\t'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+\n\t\t\t\t\t\t'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+\n\t\t\t\t\t\t'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+\n\t\t\t\t\t\t'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+\n\t\t\t\t\t\t'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+\n\t\t\t\t\t\t'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+\n\t\t\t\t\t\t'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+\n\t\t\t\t\t\t'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+\n\t\t\t\t\t\t'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+\n\t\t\t\t\t\t'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+\n\t\t\t\t\t\t'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+\n\t\t\t\t\t\t'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+\n\t\t\t\t\t\t'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+\n\t\t\t\t\t\t'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+\n\t\t\t\t\t\t'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+\n\t\t\t\t\t\t'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+\n\t\t\t\t\t\t'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+\n\t\t\t\t\t\t'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+\n\t\t\t\t\t\t'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+\n\t\t\t\t\t\t'strtoupper strtr strval substr substr_compare';\n\n\t\tvar keywords =\t'abstract and array as break case catch cfunction class clone const continue declare default die do ' +\n\t\t\t\t\t\t'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' +\n\t\t\t\t\t\t'function global goto if implements include include_once interface instanceof insteadof namespace new ' +\n\t\t\t\t\t\t'old_function or private protected public return require require_once static switch ' +\n\t\t\t\t\t\t'trait throw try use var while xor ';\n\t\t\n\t\tvar constants\t= '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },\t\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\t\t\t// multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t\t// double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t\t// single quoted strings\n\t\t\t{ regex: /\\$\\w+/g,\t\t\t\t\t\t\t\t\t\t\tcss: 'variable' },\t\t\t// variables\n\t\t\t{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),\t\tcss: 'functions' },\t\t\t// common functions\n\t\t\t{ regex: new RegExp(this.getKeywords(constants), 'gmi'),\tcss: 'constants' },\t\t\t// constants\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' }\t\t\t// keyword\n\t\t\t];\n\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['php'];\n\n\tSyntaxHighlighter.brushes.Php = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/scripts/shCore.js",
    "content": "var XRegExp;if(XRegExp)throw Error(\"can't load XRegExp twice in the same frame\");(function(e){function c(e,t){if(!XRegExp.isRegExp(e))throw TypeError(\"type RegExp expected\");var n=e._xregexp;return e=XRegExp(e.source,h(e)+(t||\"\")),n&&(e._xregexp={source:n.source,captureNames:n.captureNames?n.captureNames.slice(0):null}),e}function h(e){return(e.global?\"g\":\"\")+(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.extended?\"x\":\"\")+(e.sticky?\"y\":\"\")}function p(e,t,n,r){var o=s.length,u,a,f;i=!0;try{while(o--){f=s[o];if(n&f.scope&&(!f.trigger||f.trigger.call(r))){f.pattern.lastIndex=t,a=f.pattern.exec(e);if(a&&a.index===t){u={output:f.handler.call(r,a,n),match:a};break}}}}catch(l){throw l}finally{i=!1}return u}function d(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}XRegExp=function(t,r){var s=[],u=XRegExp.OUTSIDE_CLASS,a=0,f,h,d,v,m;if(XRegExp.isRegExp(t)){if(r!==e)throw TypeError(\"can't supply flags when constructing one RegExp from another\");return c(t)}if(i)throw Error(\"can't call the XRegExp constructor within token definition functions\");r=r||\"\",f={hasNamedCapture:!1,captureNames:[],hasFlag:function(e){return r.indexOf(e)>-1},setFlag:function(e){r+=e}};while(a<t.length)h=p(t,a,u,f),h?(s.push(h.output),a+=h.match[0].length||1):(d=o.exec.call(l[u],t.slice(a)))?(s.push(d[0]),a+=d[0].length):(v=t.charAt(a),v===\"[\"?u=XRegExp.INSIDE_CLASS:v===\"]\"&&(u=XRegExp.OUTSIDE_CLASS),s.push(v),a++);return m=RegExp(s.join(\"\"),o.replace.call(r,n,\"\")),m._xregexp={source:t,captureNames:f.hasNamedCapture?f.captureNames:null},m},XRegExp.version=\"1.5.1\",XRegExp.INSIDE_CLASS=1,XRegExp.OUTSIDE_CLASS=2;var t=/\\$(?:(\\d\\d?|[$&`'])|{([$\\w]+)})/g,n=/[^gimy]+|([\\s\\S])(?=[\\s\\S]*\\1)/g,r=/^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,i=!1,s=[],o={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},u=o.exec.call(/()??/,\"\")[1]===e,a=function(){var e=/^/g;return o.test.call(e,\"\"),!e.lastIndex}(),f=RegExp.prototype.sticky!==e,l={};l[XRegExp.INSIDE_CLASS]=/^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u[\\dA-Fa-f]{4}|c[A-Za-z]|[\\s\\S]))/,l[XRegExp.OUTSIDE_CLASS]=/^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u[\\dA-Fa-f]{4}|c[A-Za-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/,XRegExp.addToken=function(e,t,n,r){s.push({pattern:c(e,\"g\"+(f?\"y\":\"\")),handler:t,scope:n||XRegExp.OUTSIDE_CLASS,trigger:r||null})},XRegExp.cache=function(e,t){var n=e+\"/\"+(t||\"\");return XRegExp.cache[n]||(XRegExp.cache[n]=XRegExp(e,t))},XRegExp.copyAsGlobal=function(e){return c(e,\"g\")},XRegExp.escape=function(e){return e.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\")},XRegExp.execAt=function(e,t,n,r){var i=c(t,\"g\"+(r&&f?\"y\":\"\")),s;return i.lastIndex=n=n||0,s=i.exec(e),r&&s&&s.index!==n&&(s=null),t.global&&(t.lastIndex=s?i.lastIndex:0),s},XRegExp.freezeTokens=function(){XRegExp.addToken=function(){throw Error(\"can't run addToken after freezeTokens\")}},XRegExp.isRegExp=function(e){return Object.prototype.toString.call(e)===\"[object RegExp]\"},XRegExp.iterate=function(e,t,n,r){var i=c(t,\"g\"),s=-1,o;while(o=i.exec(e))t.global&&(t.lastIndex=i.lastIndex),n.call(r,o,++s,e,t),i.lastIndex===o.index&&i.lastIndex++;t.global&&(t.lastIndex=0)},XRegExp.matchChain=function(e,t){return function n(e,r){var i=t[r].regex?t[r]:{regex:t[r]},s=c(i.regex,\"g\"),o=[],u;for(u=0;u<e.length;u++)XRegExp.iterate(e[u],s,function(e){o.push(i.backref?e[i.backref]||\"\":e[0])});return r===t.length-1||!o.length?o:n(o,r+1)}([e],0)},RegExp.prototype.apply=function(e,t){return this.exec(t[0])},RegExp.prototype.call=function(e,t){return this.exec(t)},RegExp.prototype.exec=function(t){var n,r,i,s;this.global||(s=this.lastIndex),n=o.exec.apply(this,arguments);if(n){!u&&n.length>1&&d(n,\"\")>-1&&(i=RegExp(this.source,o.replace.call(h(this),\"g\",\"\")),o.replace.call((t+\"\").slice(n.index),i,function(){for(var t=1;t<arguments.length-2;t++)arguments[t]===e&&(n[t]=e)}));if(this._xregexp&&this._xregexp.captureNames)for(var f=1;f<n.length;f++)r=this._xregexp.captureNames[f-1],r&&(n[r]=n[f]);!a&&this.global&&!n[0].length&&this.lastIndex>n.index&&this.lastIndex--}return this.global||(this.lastIndex=s),n},RegExp.prototype.test=function(e){var t,n;return this.global||(n=this.lastIndex),t=o.exec.call(this,e),t&&!a&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,this.global||(this.lastIndex=n),!!t},String.prototype.match=function(e){XRegExp.isRegExp(e)||(e=RegExp(e));if(e.global){var t=o.match.apply(this,arguments);return e.lastIndex=0,t}return e.exec(this)},String.prototype.replace=function(e,n){var r=XRegExp.isRegExp(e),i,s,u,a;return r?(e._xregexp&&(i=e._xregexp.captureNames),e.global||(a=e.lastIndex)):e+=\"\",Object.prototype.toString.call(n)===\"[object Function]\"?s=o.replace.call(this+\"\",e,function(){if(i){arguments[0]=new String(arguments[0]);for(var t=0;t<i.length;t++)i[t]&&(arguments[0][i[t]]=arguments[t+1])}return r&&e.global&&(e.lastIndex=arguments[arguments.length-2]+arguments[0].length),n.apply(null,arguments)}):(u=this+\"\",s=o.replace.call(u,e,function(){var e=arguments;return o.replace.call(n+\"\",t,function(t,n,r){if(!n){var o=+r;return o<=e.length-3?e[o]:(o=i?d(i,r):-1,o>-1?e[o+1]:t)}switch(n){case\"$\":return\"$\";case\"&\":return e[0];case\"`\":return e[e.length-1].slice(0,e[e.length-2]);case\"'\":return e[e.length-1].slice(e[e.length-2]+e[0].length);default:var s=\"\";n=+n;if(!n)return t;while(n>e.length-3)s=String.prototype.slice.call(n,-1)+s,n=Math.floor(n/10);return(n?e[n]||\"\":\"$\")+s}})})),r&&(e.global?e.lastIndex=0:e.lastIndex=a),s},String.prototype.split=function(t,n){if(!XRegExp.isRegExp(t))return o.split.apply(this,arguments);var r=this+\"\",i=[],s=0,u,a;if(n===e||+n<0)n=Infinity;else{n=Math.floor(+n);if(!n)return[]}t=XRegExp.copyAsGlobal(t);while(u=t.exec(r)){if(t.lastIndex>s){i.push(r.slice(s,u.index)),u.length>1&&u.index<r.length&&Array.prototype.push.apply(i,u.slice(1)),a=u[0].length,s=t.lastIndex;if(i.length>=n)break}t.lastIndex===u.index&&t.lastIndex++}return s===r.length?(!o.test.call(t,\"\")||a)&&i.push(\"\"):i.push(r.slice(s)),i.length>n?i.slice(0,n):i},XRegExp.addToken(/\\(\\?#[^)]*\\)/,function(e){return o.test.call(r,e.input.slice(e.index+e[0].length))?\"\":\"(?:)\"}),XRegExp.addToken(/\\((?!\\?)/,function(){return this.captureNames.push(null),\"(\"}),XRegExp.addToken(/\\(\\?<([$\\w]+)>/,function(e){return this.captureNames.push(e[1]),this.hasNamedCapture=!0,\"(\"}),XRegExp.addToken(/\\\\k<([\\w$]+)>/,function(e){var t=d(this.captureNames,e[1]);return t>-1?\"\\\\\"+(t+1)+(isNaN(e.input.charAt(e.index+e[0].length))?\"\":\"(?:)\"):e[0]}),XRegExp.addToken(/\\[\\^?]/,function(e){return e[0]===\"[]\"?\"\\\\b\\\\B\":\"[\\\\s\\\\S]\"}),XRegExp.addToken(/^\\(\\?([imsx]+)\\)/,function(e){return this.setFlag(e[1]),\"\"}),XRegExp.addToken(/(?:\\s+|#.*)+/,function(e){return o.test.call(r,e.input.slice(e.index+e[0].length))?\"\":\"(?:)\"},XRegExp.OUTSIDE_CLASS,function(){return this.hasFlag(\"x\")}),XRegExp.addToken(/\\./,function(){return\"[\\\\s\\\\S]\"},XRegExp.OUTSIDE_CLASS,function(){return this.hasFlag(\"s\")})})();if(typeof SyntaxHighlighter==\"undefined\")var SyntaxHighlighter=function(){function t(e,t){return e.className.indexOf(t)!=-1}function n(e,n){t(e,n)||(e.className+=\" \"+n)}function r(e,t){e.className=e.className.replace(t,\"\")}function i(e){var t=[];for(var n=0;n<e.length;n++)t.push(e[n]);return t}function s(e){return e.split(/\\r?\\n/)}function o(e){var t=\"highlighter_\";return e.indexOf(t)==0?e:t+e}function u(t){return e.vars.highlighters[o(t)]}function a(e){return document.getElementById(o(e))}function f(t){e.vars.highlighters[o(t.id)]=t}function l(e,t,n){if(e==null)return null;var r=n!=1?e.childNodes:[e.parentNode],i={\"#\":\"id\",\".\":\"className\"}[t.substr(0,1)]||\"nodeName\",s,o;s=i!=\"nodeName\"?t.substr(1):t.toUpperCase();if((e[i]||\"\").indexOf(s)!=-1)return e;for(var u=0;r&&u<r.length&&o==null;u++)o=l(r[u],t,n);return o}function c(e,t){return l(e,t,!0)}function h(e,t,n){n=Math.max(n||0,0);for(var r=n;r<e.length;r++)if(e[r]==t)return r;return-1}function p(e){return(e||\"\")+Math.round(Math.random()*1e6).toString()}function d(e,t){var n={},r;for(r in e)n[r]=e[r];for(r in t)n[r]=t[r];return n}function v(e){var t={\"true\":!0,\"false\":!1}[e];return t==null?e:t}function m(e,t,n,r,i){var s=(screen.width-n)/2,o=(screen.height-r)/2;i+=\", left=\"+s+\", top=\"+o+\", width=\"+n+\", height=\"+r,i=i.replace(/^,/,\"\");var u=window.open(e,t,i);return u.focus(),u}function g(e,t,n,r){function i(e){e=e||window.event,e.target||(e.target=e.srcElement,e.preventDefault=function(){this.returnValue=!1}),n.call(r||window,e)}e.attachEvent?e.attachEvent(\"on\"+t,i):e.addEventListener(t,i,!1)}function y(t){window.alert(e.config.strings.alert+t)}function b(t,n){var r=e.vars.discoveredBrushes,i=null;if(r==null){r={};for(var s in e.brushes){var o=e.brushes[s],u=o.aliases;if(u==null)continue;o.brushName=s.toLowerCase();for(var a=0;a<u.length;a++)r[u[a]]=s}e.vars.discoveredBrushes=r}return i=e.brushes[r[t]],i==null&&n&&y(e.config.strings.noBrush+t),i}function w(e,t){var n=s(e);for(var r=0;r<n.length;r++)n[r]=t(n[r],r);return n.join(\"\\r\\n\")}function E(e){return e.replace(/^[ ]*[\\n]+|[\\n]*[ ]*$/g,\"\")}function S(e){var t,n={},r=new XRegExp(\"^\\\\[(?<values>(.*?))\\\\]$\"),i=new XRegExp(\"(?<name>[\\\\w-]+)\\\\s*:\\\\s*(?<value>[\\\\w-%#]+|\\\\[.*?\\\\]|\\\".*?\\\"|'.*?')\\\\s*;?\",\"g\");while((t=i.exec(e))!=null){var s=t.value.replace(/^['\"]|['\"]$/g,\"\");if(s!=null&&r.test(s)){var o=r.exec(s);s=o.values.length>0?o.values.split(/\\s*,\\s*/):[]}n[t.name]=s}return n}function x(t,n){return t==null||t.length==0||t==\"\\n\"?t:(t=t.replace(/</g,\"&lt;\"),t=t.replace(/ {2,}/g,function(t){var n=\"\";for(var r=0;r<t.length-1;r++)n+=e.config.space;return n+\" \"}),n!=null&&(t=w(t,function(e){if(e.length==0)return\"\";var t=\"\";return e=e.replace(/^(&nbsp;| )+/,function(e){return t=e,\"\"}),e.length==0?t:t+'<code class=\"'+n+'\">'+e+\"</code>\"})),t)}function T(e,t){var n=e.toString();while(n.length<t)n=\"0\"+n;return n}function N(e,t){var n=\"\";for(var r=0;r<t;r++)n+=\" \";return e.replace(/\\t/g,n)}function C(e,t){function u(e,t,n){return e.substr(0,t)+i.substr(0,n)+e.substr(t+1,e.length)}var n=s(e),r=\"\t\",i=\"\";for(var o=0;o<50;o++)i+=\"                    \";return e=w(e,function(e){if(e.indexOf(r)==-1)return e;var n=0;while((n=e.indexOf(r))!=-1){var i=t-n%t;e=u(e,n,i)}return e}),e}function k(t){var n=/<br\\s*\\/?>|&lt;br\\s*\\/?&gt;/gi;return e.config.bloggerMode==1&&(t=t.replace(n,\"\\n\")),e.config.stripBrs==1&&(t=t.replace(n,\"\")),t}function L(e){return e.replace(/^\\s+|\\s+$/g,\"\")}function A(e){var t=s(k(e)),n=new Array,r=/^\\s*/,i=1e3;for(var o=0;o<t.length&&i>0;o++){var u=t[o];if(L(u).length==0)continue;var a=r.exec(u);if(a==null)return e;i=Math.min(a[0].length,i)}if(i>0)for(var o=0;o<t.length;o++)t[o]=t[o].substr(i);return t.join(\"\\n\")}function O(e,t){return e.index<t.index?-1:e.index>t.index?1:e.length<t.length?-1:e.length>t.length?1:0}function M(t,n){function r(e,t){return e[0]}var i=0,s=null,o=[],u=n.func?n.func:r;while((s=n.regex.exec(t))!=null){var a=u(s,n);typeof a==\"string\"&&(a=[new e.Match(a,s.index,n.css)]),o=o.concat(a)}return o}function _(t){var n=/(.*)((&gt;|&lt;).*)/;return t.replace(e.regexLib.url,function(e){var t=\"\",r=null;if(r=n.exec(e))e=r[1],t=r[2];return'<a href=\"'+e+'\">'+e+\"</a>\"+t})}function D(){var e=document.getElementsByTagName(\"script\"),t=[];for(var n=0;n<e.length;n++)e[n].type==\"syntaxhighlighter\"&&t.push(e[n]);return t}function P(e){var t=\"<![CDATA[\",n=\"]]>\",r=L(e),i=!1,s=t.length,o=n.length;r.indexOf(t)==0&&(r=r.substring(s),i=!0);var u=r.length;return r.indexOf(n)==u-o&&(r=r.substring(0,u-o),i=!0),i?r:e}function H(e){var t=e.target,i=c(t,\".syntaxhighlighter\"),s=c(t,\".container\"),o=document.createElement(\"textarea\"),a;if(!s||!i||l(s,\"textarea\"))return;a=u(i.id),n(i,\"source\");var f=s.childNodes,h=[];for(var p=0;p<f.length;p++)h.push(f[p].innerText||f[p].textContent);h=h.join(\"\\r\"),h=h.replace(/\\u00a0/g,\" \"),o.appendChild(document.createTextNode(h)),s.appendChild(o),o.focus(),o.select(),g(o,\"blur\",function(e){o.parentNode.removeChild(o),r(i,\"source\")})}typeof require!=\"undefined\"&&typeof XRegExp==\"undefined\"&&(XRegExp=require(\"XRegExp\").XRegExp);var e={defaults:{\"class-name\":\"\",\"first-line\":1,\"pad-line-numbers\":!1,highlight:null,title:null,\"smart-tabs\":!0,\"tab-size\":4,gutter:!0,toolbar:!0,\"quick-code\":!0,collapse:!1,\"auto-links\":!0,light:!1,unindent:!0,\"html-script\":!1},config:{space:\"&nbsp;\",useScriptTags:!0,bloggerMode:!1,stripBrs:!1,tagName:\"pre\",strings:{expandSource:\"expand source\",help:\"?\",alert:\"SyntaxHighlighter\\n\\n\",noBrush:\"Can't find brush for: \",brushNotHtmlScript:\"Brush wasn't configured for html-script option: \",aboutDialog:\"@ABOUT@\"}},vars:{discoveredBrushes:null,highlighters:{}},brushes:{},regexLib:{multiLineCComments:/\\/\\*[\\s\\S]*?\\*\\//gm,singleLineCComments:/\\/\\/.*$/gm,singleLinePerlComments:/#.*$/gm,doubleQuotedString:/\"([^\\\\\"\\n]|\\\\.)*\"/g,singleQuotedString:/'([^\\\\'\\n]|\\\\.)*'/g,multiLineDoubleQuotedString:new XRegExp('\"([^\\\\\\\\\"]|\\\\\\\\.)*\"',\"gs\"),multiLineSingleQuotedString:new XRegExp(\"'([^\\\\\\\\']|\\\\\\\\.)*'\",\"gs\"),xmlComments:/(&lt;|<)!--[\\s\\S]*?--(&gt;|>)/gm,url:/\\w+:\\/\\/[\\w-.\\/?%&=:@;#]*/g,phpScriptTags:{left:/(&lt;|<)\\?(?:=|php)?/g,right:/\\?(&gt;|>)/g,eof:!0},aspScriptTags:{left:/(&lt;|<)%=?/g,right:/%(&gt;|>)/g},scriptScriptTags:{left:/(&lt;|<)\\s*script.*?(&gt;|>)/gi,right:/(&lt;|<)\\/\\s*script\\s*(&gt;|>)/gi}},toolbar:{getHtml:function(t){function s(t,n){return e.toolbar.getButtonHtml(t,n,e.config.strings[n])}var n='<div class=\"toolbar\">',r=e.toolbar.items,i=r.list;for(var o=0;o<i.length;o++)n+=(r[i[o]].getHtml||s)(t,i[o]);return n+=\"</div>\",n},getButtonHtml:function(e,t,n){return'<span><a href=\"#\" class=\"toolbar_item command_'+t+\" \"+t+'\">'+n+\"</a></span>\"},handler:function(t){function i(e){var t=new RegExp(e+\"_(\\\\w+)\"),n=t.exec(r);return n?n[1]:null}var n=t.target,r=n.className||\"\",s=u(c(n,\".syntaxhighlighter\").id),o=i(\"command\");s&&o&&e.toolbar.items[o].execute(s),t.preventDefault()},items:{list:[\"expandSource\",\"help\"],expandSource:{getHtml:function(t){if(t.getParam(\"collapse\")!=1)return\"\";var n=t.getParam(\"title\");return e.toolbar.getButtonHtml(t,\"expandSource\",n?n:e.config.strings.expandSource)},execute:function(e){var t=a(e.id);r(t,\"collapsed\")}},help:{execute:function(t){var n=m(\"\",\"_blank\",500,250,\"scrollbars=0\"),r=n.document;r.write(e.config.strings.aboutDialog),r.close(),n.focus()}}}},findElements:function(t,n){var r=n?[n]:i(document.getElementsByTagName(e.config.tagName)),s=e.config,o=[];s.useScriptTags&&(r=r.concat(D()));if(r.length===0)return o;for(var u=0;u<r.length;u++){var a={target:r[u],params:d(t,S(r[u].className))};if(a.params[\"brush\"]==null)continue;o.push(a)}return o},highlight:function(t,n){var r=this.findElements(t,n),i=\"innerHTML\",s=null,o=e.config;if(r.length===0)return;for(var u=0;u<r.length;u++){var n=r[u],a=n.target,f=n.params,l=f.brush,c;if(l==null)continue;if(f[\"html-script\"]==\"true\"||e.defaults[\"html-script\"]==1)s=new e.HtmlScript(l),l=\"htmlscript\";else{var h=b(l);if(!h)continue;s=new h}c=a[i],o.useScriptTags&&(c=P(c)),(a.title||\"\")!=\"\"&&(f.title=a.title),f.brush=l,s.init(f),n=s.getDiv(c),(a.id||\"\")!=\"\"&&(n.id=a.id),a.parentNode.replaceChild(n,a)}},all:function(t){g(window,\"load\",function(){e.highlight(t)})}};return e.Match=function(e,t,n){this.value=e,this.index=t,this.length=e.length,this.css=n,this.brushName=null},e.Match.prototype.toString=function(){return this.value},e.HtmlScript=function(t){function f(e,t){for(var n=0;n<e.length;n++)e[n].index+=t}function l(e,t){var i=e.code,s=[],o=r.regexList,u=e.index+e.left.length,a=r.htmlScript,l;for(var c=0;c<o.length;c++)l=M(i,o[c]),f(l,u),s=s.concat(l);a.left!=null&&e.left!=null&&(l=M(e.left,a.left),f(l,e.index),s=s.concat(l)),a.right!=null&&e.right!=null&&(l=M(e.right,a.right),f(l,e.index+e[0].lastIndexOf(e.right)),s=s.concat(l));for(var h=0;h<s.length;h++)s[h].brushName=n.brushName;return s}var n=b(t),r,i=new e.brushes.Xml,s=null,o=this,u=\"getDiv getHtml init\".split(\" \");if(n==null)return;r=new n;for(var a=0;a<u.length;a++)(function(){var e=u[a];o[e]=function(){return i[e].apply(i,arguments)}})();if(r.htmlScript==null){y(e.config.strings.brushNotHtmlScript+t);return}i.regexList.push({regex:r.htmlScript.code,func:l})},e.Highlighter=function(){},e.Highlighter.prototype={getParam:function(e,t){var n=this.params[e];return v(n==null?t:n)},create:function(e){return document.createElement(e)},findMatches:function(e,t){var n=[];if(e!=null)for(var r=0;r<e.length;r++)typeof e[r]==\"object\"&&(n=n.concat(M(t,e[r])));return this.removeNestedMatches(n.sort(O))},removeNestedMatches:function(e){for(var t=0;t<e.length;t++){if(e[t]===null)continue;var n=e[t],r=n.index+n.length;for(var i=t+1;i<e.length&&e[t]!==null;i++){var s=e[i];if(s===null)continue;if(s.index>r)break;s.index==n.index&&s.length>n.length?e[t]=null:s.index>=n.index&&s.index<r&&(e[i]=null)}}return e},figureOutLineNumbers:function(e){var t=[],n=parseInt(this.getParam(\"first-line\"));return w(e,function(e,r){t.push(r+n)}),t},isLineHighlighted:function(e){var t=this.getParam(\"highlight\",[]);return typeof t!=\"object\"&&t.push==null&&(t=[t]),h(t,e.toString())!=-1},getLineHtml:function(e,t,n){var r=[\"line\",\"number\"+t,\"index\"+e,\"alt\"+(t%2==0?1:2).toString()];return this.isLineHighlighted(t)&&r.push(\"highlighted\"),t==0&&r.push(\"break\"),'<div class=\"'+r.join(\" \")+'\">'+n+\"</div>\"},getLineNumbersHtml:function(t,n){var r=\"\",i=s(t).length,o=parseInt(this.getParam(\"first-line\")),u=this.getParam(\"pad-line-numbers\");u==1?u=(o+i-1).toString().length:isNaN(u)==1&&(u=0);for(var a=0;a<i;a++){var f=n?n[a]:o+a,t=f==0?e.config.space:T(f,u);r+=this.getLineHtml(a,f,t)}return r},getCodeLinesHtml:function(t,n){t=L(t);var r=s(t),i=this.getParam(\"pad-line-numbers\"),o=parseInt(this.getParam(\"first-line\")),t=\"\",u=this.getParam(\"brush\");for(var a=0;a<r.length;a++){var f=r[a],l=/^(&nbsp;|\\s)+/.exec(f),c=null,h=n?n[a]:o+a;l!=null&&(c=l[0].toString(),f=f.substr(c.length),c=c.replace(\" \",e.config.space)),f=L(f),f.length==0&&(f=e.config.space),t+=this.getLineHtml(a,h,(c!=null?'<code class=\"'+u+' spaces\">'+c+\"</code>\":\"\")+f)}return t},getTitleHtml:function(e){return e?\"<caption>\"+e+\"</caption>\":\"\"},getMatchesHtml:function(e,t){function s(e){var t=e?e.brushName||i:i;return t?t+\" \":\"\"}var n=0,r=\"\",i=this.getParam(\"brush\",\"\");for(var o=0;o<t.length;o++){var u=t[o],a;if(u===null||u.length===0)continue;a=s(u),r+=x(e.substr(n,u.index-n),a+\"plain\")+x(u.value,a+u.css),n=u.index+u.length+(u.offset||0)}return r+=x(e.substr(n),s()+\"plain\"),r},getHtml:function(t){var n=\"\",r=[\"syntaxhighlighter\"],i,s,u;return this.getParam(\"light\")==1&&(this.params.toolbar=this.params.gutter=!1),className=\"syntaxhighlighter\",this.getParam(\"collapse\")==1&&r.push(\"collapsed\"),(gutter=this.getParam(\"gutter\"))==0&&r.push(\"nogutter\"),r.push(this.getParam(\"class-name\")),r.push(this.getParam(\"brush\")),t=E(t).replace(/\\r/g,\" \"),i=this.getParam(\"tab-size\"),t=this.getParam(\"smart-tabs\")==1?C(t,i):N(t,i),this.getParam(\"unindent\")&&(t=A(t)),gutter&&(u=this.figureOutLineNumbers(t)),s=this.findMatches(this.regexList,t),n=this.getMatchesHtml(t,s),n=this.getCodeLinesHtml(n,u),this.getParam(\"auto-links\")&&(n=_(n)),typeof navigator!=\"undefined\"&&navigator.userAgent&&navigator.userAgent.match(/MSIE/)&&r.push(\"ie\"),n='<div id=\"'+o(this.id)+'\" class=\"'+r.join(\" \")+'\">'+(this.getParam(\"toolbar\")?e.toolbar.getHtml(this):\"\")+'<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">'+this.getTitleHtml(this.getParam(\"title\"))+\"<tbody>\"+\"<tr>\"+(gutter?'<td class=\"gutter\">'+this.getLineNumbersHtml(t)+\"</td>\":\"\")+'<td class=\"code\">'+'<div class=\"container\">'+n+\"</div>\"+\"</td>\"+\"</tr>\"+\"</tbody>\"+\"</table>\"+\"</div>\",n},getDiv:function(t){t===null&&(t=\"\"),this.code=t;var n=this.create(\"div\");return n.innerHTML=this.getHtml(t),this.getParam(\"toolbar\")&&g(l(n,\".toolbar\"),\"click\",e.toolbar.handler),this.getParam(\"quick-code\")&&g(l(n,\".code\"),\"dblclick\",H),n},init:function(t){this.id=p(),f(this),this.params=d(e.defaults,t||{}),this.getParam(\"light\")==1&&(this.params.toolbar=this.params.gutter=!1)},getKeywords:function(e){return e=e.replace(/^\\s+|\\s+$/g,\"\").replace(/\\s+/g,\"|\"),\"\\\\b(?:\"+e+\")\\\\b\"},forHtmlScript:function(e){var t={end:e.right.source};e.eof&&(t.end=\"(?:(?:\"+t.end+\")|$)\"),this.htmlScript={left:{regex:e.left,css:\"script\"},right:{regex:e.right,css:\"script\"},code:new XRegExp(\"(?<left>\"+e.left.source+\")\"+\"(?<code>.*?)\"+\"(?<right>\"+t.end+\")\",\"sgi\")}}},e}();typeof exports!=\"undefined\"?exports.SyntaxHighlighter=SyntaxHighlighter:null"
  },
  {
    "path": "application/libraries/PHPMailer/examples/scripts/shLegacy.js",
    "content": "var dp = {\n\tSyntaxHighlighter : {}\n};\n\ndp.SyntaxHighlighter = {\n\tparseParams: function(\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\tshowGutter, \n\t\t\t\t\t\tshowControls, \n\t\t\t\t\t\tcollapseAll, \n\t\t\t\t\t\tfirstLine, \n\t\t\t\t\t\tshowColumns\n\t\t\t\t\t\t)\n\t{\n\t\tfunction getValue(list, name)\n\t\t{\n\t\t\tvar regex = new XRegExp('^' + name + '\\\\[(?<value>\\\\w+)\\\\]$', 'gi'),\n\t\t\t\tmatch = null\n\t\t\t\t;\n\t\t\t\n\t\t\tfor (var i = 0; i < list.length; i++) \n\t\t\t\tif ((match = regex.exec(list[i])) != null)\n\t\t\t\t\treturn match.value;\n\t\t\t\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tfunction defaultValue(value, def)\n\t\t{\n\t\t\treturn value != null ? value : def;\n\t\t}\n\t\t\n\t\tfunction asString(value)\n\t\t{\n\t\t\treturn value != null ? value.toString() : null;\n\t\t}\n\n\t\tvar parts = input.split(':'),\n\t\t\tbrushName = parts[0],\n\t\t\toptions = {},\n\t\t\tstraight = { 'true' : true },\n\t\t\treverse = { 'true' : false },\n\t\t\tdefaults = SyntaxHighlighter.defaults\n\t\t\t;\n\t\t\n\t\tfor (var i in parts)\n\t\t\toptions[parts[i]] = 'true';\n\n\t\tshowGutter = asString(defaultValue(showGutter, defaults.gutter));\n\t\tshowControls = asString(defaultValue(showControls, defaults.toolbar));\n\t\tcollapseAll = asString(defaultValue(collapseAll, defaults.collapse)); \n\t\tshowColumns = asString(defaultValue(showColumns, defaults.ruler));\n\t\tfirstLine = asString(defaultValue(firstLine, defaults['first-line'])); \n\n\t\treturn {\n\t\t\tbrush\t\t\t: brushName,\n\t\t\tgutter\t\t\t: defaultValue(reverse[options.nogutter], showGutter),\n\t\t\ttoolbar\t\t\t: defaultValue(reverse[options.nocontrols], showControls),\n\t\t\tcollapse\t\t: defaultValue(straight[options.collapse], collapseAll),\n\t\t\t// ruler\t\t\t: defaultValue(straight[options.showcolumns], showColumns),\n\t\t\t'first-line'\t: defaultValue(getValue(parts, 'firstline'), firstLine)\n\t\t};\n\t},\n\t\n\tHighlightAll: function(\n\t\t\t\t\t\tname, \n\t\t\t\t\t\tshowGutter /* optional */, \n\t\t\t\t\t\tshowControls /* optional */, \n\t\t\t\t\t\tcollapseAll /* optional */, \n\t\t\t\t\t\tfirstLine /* optional */, \n\t\t\t\t\t\tshowColumns /* optional */\n\t\t\t\t\t\t)\n\t{\n\t\tfunction findValue()\n\t\t{\n\t\t\tvar a = arguments;\n\t\t\t\n\t\t\tfor (var i = 0; i < a.length; i++) \n\t\t\t{\n\t\t\t\tif (a[i] === null) \n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tif (typeof(a[i]) == 'string' && a[i] != '') \n\t\t\t\t\treturn a[i] + '';\n\t\t\t\t\n\t\t\t\tif (typeof(a[i]) == 'object' && a[i].value != '') \n\t\t\t\t\treturn a[i].value + '';\n\t\t\t}\n\t\t\t\n\t\t\treturn null;\n\t\t}\n\n\t\tfunction findTagsByName(list, name, tagName)\n\t\t{\n\t\t\tvar tags = document.getElementsByTagName(tagName);\n\t\t\t\n\t\t\tfor (var i = 0; i < tags.length; i++) \n\t\t\t\tif (tags[i].getAttribute('name') == name) \n\t\t\t\t\tlist.push(tags[i]);\n\t\t}\n\t\t\n\t\tvar elements = [],\n\t\t\thighlighter = null,\n\t\t\tregistered = {},\n\t\t\tpropertyName = 'innerHTML'\n\t\t\t;\n\t\t\n\t\t// for some reason IE doesn't find <pre/> by name, however it does see them just fine by tag name... \n\t\tfindTagsByName(elements, name, 'pre');\n\t\tfindTagsByName(elements, name, 'textarea');\n\n\t\tif (elements.length === 0)\n\t\t\treturn;\n\t\t\n\t\tfor (var i = 0; i < elements.length; i++)\n\t\t{\n\t\t\tvar element = elements[i],\n\t\t\t\tparams = findValue(\n\t\t\t\t\telement.attributes['class'], element.className, \n\t\t\t\t\telement.attributes['language'], element.language\n\t\t\t\t\t),\n\t\t\t\tlanguage = ''\n\t\t\t\t;\n\t\t\t\n\t\t\tif (params === null) \n\t\t\t\tcontinue;\n\n\t\t\tparams = dp.SyntaxHighlighter.parseParams(\n\t\t\t\tparams,\n\t\t\t\tshowGutter, \n\t\t\t\tshowControls, \n\t\t\t\tcollapseAll, \n\t\t\t\tfirstLine, \n\t\t\t\tshowColumns\n\t\t\t\t);\n\n\t\t\tSyntaxHighlighter.highlight(params, element);\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/send_file_upload.phps",
    "content": "<?php\n/**\n * PHPMailer simple file upload and send example\n */\n$msg = '';\nif (array_key_exists('userfile', $_FILES)) {\n    // First handle the upload\n    // Don't trust provided filename - same goes for MIME types\n    // See http://php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation\n    $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['userfile']['name']));\n    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {\n        // Upload handled successfully\n        // Now create a message\n        // This should be somewhere in your include_path\n        require '../PHPMailerAutoload.php';\n        $mail = new PHPMailer;\n        $mail->setFrom('from@example.com', 'First Last');\n        $mail->addAddress('whoto@example.com', 'John Doe');\n        $mail->Subject = 'PHPMailer file sender';\n        $mail->Body = 'My message body';\n        // Attach the uploaded file\n        $mail->addAttachment($uploadfile, 'My uploaded file');\n        if (!$mail->send()) {\n            $msg .= \"Mailer Error: \" . $mail->ErrorInfo;\n        } else {\n            $msg .= \"Message sent!\";\n        }\n    } else {\n        $msg .= 'Failed to move file to ' . $uploadfile;\n    }\n}\n?>\n<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <title>PHPMailer Upload</title>\n</head>\n<body>\n<?php if (empty($msg)) { ?>\n    <form method=\"post\" enctype=\"multipart/form-data\">\n        <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"100000\"> Send this file: <input name=\"userfile\" type=\"file\">\n        <input type=\"submit\" value=\"Send File\">\n    </form>\n<?php } else {\n    echo $msg;\n} ?>\n</body>\n</html>"
  },
  {
    "path": "application/libraries/PHPMailer/examples/send_multiple_file_upload.phps",
    "content": "<?php\n/**\n * PHPMailer multiple files upload and send example\n */\n$msg = '';\nif (array_key_exists('userfile', $_FILES)) {\n\n    // Create a message\n    // This should be somewhere in your include_path\n    require '../PHPMailerAutoload.php';\n    $mail = new PHPMailer;\n    $mail->setFrom('from@example.com', 'First Last');\n    $mail->addAddress('whoto@example.com', 'John Doe');\n    $mail->Subject = 'PHPMailer file sender';\n    $mail->Body = 'My message body';\n    //Attach multiple files one by one\n    for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {\n        $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['userfile']['name'][$ct]));\n        $filename = $_FILES['userfile']['name'][$ct];\n        if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {\n            $mail->addAttachment($uploadfile, $filename);\n        } else {\n            $msg .= 'Failed to move file to ' . $uploadfile;\n        }\n    }\n    if (!$mail->send()) {\n        $msg .= \"Mailer Error: \" . $mail->ErrorInfo;\n    } else {\n        $msg .= \"Message sent!\";\n    }\n}\n?>\n<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <title>PHPMailer Upload</title>\n</head>\n<body>\n<?php if (empty($msg)) { ?>\n    <form method=\"post\" enctype=\"multipart/form-data\">\n        <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"100000\">\n        Select one or more files:\n        <input name=\"userfile[]\" type=\"file\" multiple=\"multiple\">\n        <input type=\"submit\" value=\"Send Files\">\n    </form>\n<?php } else {\n    echo $msg;\n} ?>\n</body>\n</html>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/sendmail.phps",
    "content": "<?php\n/**\n * This example shows sending a message using a local sendmail binary.\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n// Set PHPMailer to use the sendmail transport\n$mail->isSendmail();\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer sendmail test';\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/signed-mail.phps",
    "content": "<?php\n/**\n * This example shows signing a message and then sending it via the mail() function of PHP.\n * \n * Before you can sign the mail certificates are needed.\n *\n *\n * STEP 1 - Creating a certificate:\n * You can either use a self signed certificate, pay for a signed one or use free alternatives such as StartSSL/Comodo etc.\n * Check out this link for more providers: http://kb.mozillazine.org/Getting_an_SMIME_certificate\n * In this example I am using Comodo.\n * The form is directly available via https://secure.comodo.com/products/frontpage?area=SecureEmailCertificate\n * Fill it out and you'll get an email with a link to download your certificate.\n * Usually the certificate will be directly installed into your browser (FireFox/Chrome).\n * \n *\n * STEP 2 - Exporting the certificate\n * This is specific to your browser, however, most browsers will give you the option to export your recently added certificate in PKCS12 (.pfx)\n * Include your private key if you are asked for it.\n * Set up a password to protect your exported file.\n * \n * STEP 3 - Splitting the .pfx into a private key and the certificate.\n * I use openssl for this. You only need two commands. In my case the certificate file is called 'exported-cert.pfx'\n * To create the private key do the following:\n *\n * openssl pkcs12 -in exported-cert.pfx -nocerts -out cert.key\n * \n * Of course the way you name your file (-out) is up to you.\n * You will be asked for a password for the Import password. This is the password you just set while exporting the certificate into the pfx file.\n * Afterwards, you can password protect your private key (recommended)\n * Also make sure to set the permissions to a minimum level and suitable for your application.\n * To create the certificate file use the following command:\n * \n * openssl pkcs12 -in exported-cert.pfx -clcerts -nokeys -out cert.crt\n *\n * Again, the way you name your certificate is up to you. You will be also asked for the Import Password.\n * To create the certificate-chain file use the following command:\n *\n * openssl pkcs12 -in exported-cert.pfx -cacerts -out certchain.pem\n *\n * Again, the way you name your chain file is up to you. You will be also asked for the Import Password.\n *\n *\n * STEP 3 - Code\n */\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer();\n//Set who the message is to be sent from\n//IMPORTANT: This must match the email address of your certificate.\n//Although the certificate will be valid, an error will be thrown since it cannot be verified that the sender and the signer are the same person.\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer mail() test';\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//Convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//Configure message signing (the actual signing does not occur until sending)\n$mail->sign(\n    '/path/to/cert.crt', //The location of your certificate file\n    '/path/to/cert.key', //The location of your private key file\n    'yourSecretPrivateKeyPassword', //The password you protected your private key with (not the Import Password! may be empty but parameter must not be omitted!)\n    '/path/to/certchain.pem' //The location of your chain file\n);\n\n//Send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n\n/**\n * REMARKS:\n * If your email client does not support S/MIME it will most likely just show an attachment smime.p7s which is the signature contained in the email.\n * Other clients, such as Thunderbird support S/MIME natively and will validate the signature automatically and report the result in some way.\n */\n?>\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/smtp.phps",
    "content": "<?php\n/**\n * This example shows making an SMTP connection with authentication.\n */\n\n//SMTP needs accurate times, and the PHP time zone MUST be set\n//This should be done in your php.ini, but this is how to do it if you don't have access to that\ndate_default_timezone_set('Etc/UTC');\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n//Tell PHPMailer to use SMTP\n$mail->isSMTP();\n//Enable SMTP debugging\n// 0 = off (for production use)\n// 1 = client messages\n// 2 = client and server messages\n$mail->SMTPDebug = 2;\n//Ask for HTML-friendly debug output\n$mail->Debugoutput = 'html';\n//Set the hostname of the mail server\n$mail->Host = \"mail.example.com\";\n//Set the SMTP port number - likely to be 25, 465 or 587\n$mail->Port = 25;\n//Whether to use SMTP authentication\n$mail->SMTPAuth = true;\n//Username to use for SMTP authentication\n$mail->Username = \"yourname@example.com\";\n//Password to use for SMTP authentication\n$mail->Password = \"yourpassword\";\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer SMTP test';\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/smtp_check.phps",
    "content": "<?php\n/**\n * This uses the SMTP class alone to check that a connection can be made to an SMTP server,\n * authenticate, then disconnect\n */\n\n//SMTP needs accurate times, and the PHP time zone MUST be set\n//This should be done in your php.ini, but this is how to do it if you don't have access to that\ndate_default_timezone_set('Etc/UTC');\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new SMTP instance\n$smtp = new SMTP;\n\n//Enable connection-level debug output\n$smtp->do_debug = SMTP::DEBUG_CONNECTION;\n\ntry {\n    //Connect to an SMTP server\n    if (!$smtp->connect('mail.example.com', 25)) {\n        throw new Exception('Connect failed');\n    }\n    //Say hello\n    if (!$smtp->hello(gethostname())) {\n        throw new Exception('EHLO failed: ' . $smtp->getError()['error']);\n    }\n    //Get the list of ESMTP services the server offers\n    $e = $smtp->getServerExtList();\n    //If server can do TLS encryption, use it\n    if (is_array($e) && array_key_exists('STARTTLS', $e)) {\n        $tlsok = $smtp->startTLS();\n        if (!$tlsok) {\n            throw new Exception('Failed to start encryption: ' . $smtp->getError()['error']);\n        }\n        //Repeat EHLO after STARTTLS\n        if (!$smtp->hello(gethostname())) {\n            throw new Exception('EHLO (2) failed: ' . $smtp->getError()['error']);\n        }\n        //Get new capabilities list, which will usually now include AUTH if it didn't before\n        $e = $smtp->getServerExtList();\n    }\n    //If server supports authentication, do it (even if no encryption)\n    if (is_array($e) && array_key_exists('AUTH', $e)) {\n        if ($smtp->authenticate('username', 'password')) {\n            echo \"Connected ok!\";\n        } else {\n            throw new Exception('Authentication failed: ' . $smtp->getError()['error']);\n        }\n    }\n} catch (Exception $e) {\n    echo 'SMTP error: ' . $e->getMessage(), \"\\n\";\n}\n//Whatever happened, close the connection.\n$smtp->quit(true);\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/smtp_no_auth.phps",
    "content": "<?php\n/**\n * This example shows making an SMTP connection without using authentication.\n */\n\n//SMTP needs accurate times, and the PHP time zone MUST be set\n//This should be done in your php.ini, but this is how to do it if you don't have access to that\ndate_default_timezone_set('Etc/UTC');\n\nrequire_once '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n//Tell PHPMailer to use SMTP\n$mail->isSMTP();\n//Enable SMTP debugging\n// 0 = off (for production use)\n// 1 = client messages\n// 2 = client and server messages\n$mail->SMTPDebug = 2;\n//Ask for HTML-friendly debug output\n$mail->Debugoutput = 'html';\n//Set the hostname of the mail server\n$mail->Host = \"mail.example.com\";\n//Set the SMTP port number - likely to be 25, 465 or 587\n$mail->Port = 25;\n//Whether to use SMTP authentication\n$mail->SMTPAuth = false;\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n//Set an alternative reply-to address\n$mail->addReplyTo('replyto@example.com', 'First Last');\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n//Set the subject line\n$mail->Subject = 'PHPMailer SMTP without auth test';\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n//Replace the plain text body with one created manually\n$mail->AltBody = 'This is a plain-text message body';\n//Attach an image file\n$mail->addAttachment('images/phpmailer_mini.png');\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/ssl_options.phps",
    "content": "<?php\n/**\n * This example shows settings to use when sending over SMTP with TLS and custom connection options.\n */\n\n//SMTP needs accurate times, and the PHP time zone MUST be set\n//This should be done in your php.ini, but this is how to do it if you don't have access to that\ndate_default_timezone_set('Etc/UTC');\n\nrequire '../PHPMailerAutoload.php';\n\n//Create a new PHPMailer instance\n$mail = new PHPMailer;\n\n//Tell PHPMailer to use SMTP\n$mail->isSMTP();\n\n//Enable SMTP debugging\n// 0 = off (for production use)\n// 1 = client messages\n// 2 = client and server messages\n$mail->SMTPDebug = 2;\n\n//Ask for HTML-friendly debug output\n$mail->Debugoutput = 'html';\n\n//Set the hostname of the mail server\n$mail->Host = 'smtp.example.com';\n\n//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission\n$mail->Port = 587;\n\n//Set the encryption system to use - ssl (deprecated) or tls\n$mail->SMTPSecure = 'tls';\n\n//Custom connection options\n$mail->SMTPOptions = array (\n    'ssl' => array(\n        'verify_peer'  => true,\n        'verify_depth' => 3,\n        'allow_self_signed' => true,\n        'peer_name' => 'smtp.example.com',\n        'cafile' => '/etc/ssl/ca_cert.pem',\n    )\n);\n\n//Whether to use SMTP authentication\n$mail->SMTPAuth = true;\n\n//Username to use for SMTP authentication - use full email address for gmail\n$mail->Username = \"username@example.com\";\n\n//Password to use for SMTP authentication\n$mail->Password = \"yourpassword\";\n\n//Set who the message is to be sent from\n$mail->setFrom('from@example.com', 'First Last');\n\n//Set who the message is to be sent to\n$mail->addAddress('whoto@example.com', 'John Doe');\n\n//Set the subject line\n$mail->Subject = 'PHPMailer SMTP options test';\n\n//Read an HTML message body from an external file, convert referenced images to embedded,\n//convert HTML into a basic plain-text alternative body\n$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));\n\n//send the message, check for errors\nif (!$mail->send()) {\n    echo \"Mailer Error: \" . $mail->ErrorInfo;\n} else {\n    echo \"Message sent!\";\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCore.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreDefault.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:white !important;}\n.syntaxhighlighter .line.alt1{background-color:white !important;}\n.syntaxhighlighter .line.alt2{background-color:white !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0 !important;}\n.syntaxhighlighter .line.highlighted.number{color:black !important;}\n.syntaxhighlighter table caption{color:black !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c !important;color:white !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:blue !important;background:white !important;border:1px solid #6ce26c !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:blue !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:red !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#6ce26c !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:black !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue !important;}\n.syntaxhighlighter .keyword{color:#006699 !important;}\n.syntaxhighlighter .preprocessor{color:gray !important;}\n.syntaxhighlighter .variable{color:#aa7700 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ff1493 !important;}\n.syntaxhighlighter .constants{color:#0066cc !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#006699 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreDjango.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:#0a2b1d !important;}\n.syntaxhighlighter .line.alt1{background-color:#0a2b1d !important;}\n.syntaxhighlighter .line.alt2{background-color:#0a2b1d !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#233729 !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:#f8f8f8 !important;}\n.syntaxhighlighter .gutter{color:#497958 !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #41a83e !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#41a83e !important;color:#0a2b1d !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#96dd3b !important;background:black !important;border:1px solid #41a83e !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#96dd3b !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:white !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#41a83e !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#ffe862 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#f8f8f8 !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#336442 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#9df39f !important;}\n.syntaxhighlighter .keyword{color:#96dd3b !important;}\n.syntaxhighlighter .preprocessor{color:#91bb9e !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#f7e741 !important;}\n.syntaxhighlighter .functions{color:#ffaa3e !important;}\n.syntaxhighlighter .constants{color:#e0e8ff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#96dd3b !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#eb939a !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#91bb9e !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#edef7d !important;}\n.syntaxhighlighter .comments{font-style:italic !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreEclipse.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:white !important;}\n.syntaxhighlighter .line.alt1{background-color:white !important;}\n.syntaxhighlighter .line.alt2{background-color:white !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#c3defe !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:black !important;}\n.syntaxhighlighter .gutter{color:#787878 !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #d4d0c8 !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#d4d0c8 !important;color:white !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#3f5fbf !important;background:white !important;border:1px solid #d4d0c8 !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#3f5fbf !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#aa7700 !important;}\n.syntaxhighlighter .toolbar{color:#a0a0a0 !important;background:#d4d0c8 !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:#a0a0a0 !important;}\n.syntaxhighlighter .toolbar a:hover{color:red !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#3f5fbf !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#2a00ff !important;}\n.syntaxhighlighter .keyword{color:#7f0055 !important;}\n.syntaxhighlighter .preprocessor{color:#646464 !important;}\n.syntaxhighlighter .variable{color:#aa7700 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ff1493 !important;}\n.syntaxhighlighter .constants{color:#0066cc !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#7f0055 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n.syntaxhighlighter .xml .keyword{color:#3f7f7f !important;font-weight:normal !important;}\n.syntaxhighlighter .xml .color1,.syntaxhighlighter .xml .color1 a{color:#7f007f !important;}\n.syntaxhighlighter .xml .string{font-style:italic !important;color:#2a00ff !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreEmacs.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:black !important;}\n.syntaxhighlighter .line.alt1{background-color:black !important;}\n.syntaxhighlighter .line.alt2{background-color:black !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#2a3133 !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:#d3d3d3 !important;}\n.syntaxhighlighter .gutter{color:#d3d3d3 !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #990000 !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#990000 !important;color:black !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#ebdb8d !important;background:black !important;border:1px solid #990000 !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#ebdb8d !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#ff7d27 !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#990000 !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#9ccff4 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#d3d3d3 !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#ff7d27 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#ff9e7b !important;}\n.syntaxhighlighter .keyword{color:aqua !important;}\n.syntaxhighlighter .preprocessor{color:#aec4de !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#81cef9 !important;}\n.syntaxhighlighter .constants{color:#ff9e7b !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:aqua !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#ebdb8d !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff7d27 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#aec4de !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreFadeToGrey.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:#121212 !important;}\n.syntaxhighlighter .line.alt1{background-color:#121212 !important;}\n.syntaxhighlighter .line.alt2{background-color:#121212 !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#2c2c29 !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:white !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #3185b9 !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#3185b9 !important;color:#121212 !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#3185b9 !important;background:black !important;border:1px solid #3185b9 !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#3185b9 !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#d01d33 !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#3185b9 !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#96daff !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:white !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#696854 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#e3e658 !important;}\n.syntaxhighlighter .keyword{color:#d01d33 !important;}\n.syntaxhighlighter .preprocessor{color:#435a5f !important;}\n.syntaxhighlighter .variable{color:#898989 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#aaaaaa !important;}\n.syntaxhighlighter .constants{color:#96daff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#d01d33 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#ffc074 !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#4a8cdb !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#96daff !important;}\n.syntaxhighlighter .functions{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreMDUltra.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:#222222 !important;}\n.syntaxhighlighter .line.alt1{background-color:#222222 !important;}\n.syntaxhighlighter .line.alt2{background-color:#222222 !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#253e5a !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:lime !important;}\n.syntaxhighlighter .gutter{color:#38566f !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #435a5f !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#435a5f !important;color:#222222 !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#428bdd !important;background:black !important;border:1px solid #435a5f !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#428bdd !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:lime !important;}\n.syntaxhighlighter .toolbar{color:#aaaaff !important;background:#435a5f !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:#aaaaff !important;}\n.syntaxhighlighter .toolbar a:hover{color:#9ccff4 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:lime !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#428bdd !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:lime !important;}\n.syntaxhighlighter .keyword{color:#aaaaff !important;}\n.syntaxhighlighter .preprocessor{color:#8aa6c1 !important;}\n.syntaxhighlighter .variable{color:aqua !important;}\n.syntaxhighlighter .value{color:#f7e741 !important;}\n.syntaxhighlighter .functions{color:#ff8000 !important;}\n.syntaxhighlighter .constants{color:yellow !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#aaaaff !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:red !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:yellow !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#ffaa3e !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreMidnight.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:#0f192a !important;}\n.syntaxhighlighter .line.alt1{background-color:#0f192a !important;}\n.syntaxhighlighter .line.alt2{background-color:#0f192a !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#253e5a !important;}\n.syntaxhighlighter .line.highlighted.number{color:#38566f !important;}\n.syntaxhighlighter table caption{color:#d1edff !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #435a5f !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#435a5f !important;color:#0f192a !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#428bdd !important;background:black !important;border:1px solid #435a5f !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#428bdd !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#1dc116 !important;}\n.syntaxhighlighter .toolbar{color:#d1edff !important;background:#435a5f !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:#d1edff !important;}\n.syntaxhighlighter .toolbar a:hover{color:#8aa6c1 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#d1edff !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#428bdd !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#1dc116 !important;}\n.syntaxhighlighter .keyword{color:#b43d3d !important;}\n.syntaxhighlighter .preprocessor{color:#8aa6c1 !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#f7e741 !important;}\n.syntaxhighlighter .functions{color:#ffaa3e !important;}\n.syntaxhighlighter .constants{color:#e0e8ff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#b43d3d !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#f8bb00 !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:white !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#ffaa3e !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shCoreRDark.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:\"Consolas\",\"Bitstream Vera Sans Mono\",\"Courier New\",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}\n.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}\n.syntaxhighlighter.source{overflow:hidden !important;}\n.syntaxhighlighter .bold{font-weight:bold !important;}\n.syntaxhighlighter .italic{font-style:italic !important;}\n.syntaxhighlighter .line{white-space:pre !important;}\n.syntaxhighlighter table{width:100% !important;}\n.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}\n.syntaxhighlighter table td.code{width:100% !important;}\n.syntaxhighlighter table td.code .container{position:relative !important;}\n.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}\n.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}\n.syntaxhighlighter table td.code .line{padding:0 1em !important;}\n.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}\n.syntaxhighlighter.show{display:block !important;}\n.syntaxhighlighter.collapsed table{display:none !important;}\n.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}\n.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}\n.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}\n.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}\n.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}\n.syntaxhighlighter .toolbar span.title{display:inline !important;}\n.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}\n.syntaxhighlighter .toolbar a.expandSource{display:none !important;}\n.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}\n.syntaxhighlighter.ie .toolbar{line-height:8px !important;}\n.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}\n.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}\n.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}\n.syntaxhighlighter.printing .line .content{color:black !important;}\n.syntaxhighlighter.printing .toolbar{display:none !important;}\n.syntaxhighlighter.printing a{text-decoration:none !important;}\n.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}\n.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}\n.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}\n.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}\n.syntaxhighlighter.printing .preprocessor{color:gray !important;}\n.syntaxhighlighter.printing .variable{color:#aa7700 !important;}\n.syntaxhighlighter.printing .value{color:#009900 !important;}\n.syntaxhighlighter.printing .functions{color:#ff1493 !important;}\n.syntaxhighlighter.printing .constants{color:#0066cc !important;}\n.syntaxhighlighter.printing .script{font-weight:bold !important;}\n.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}\n.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}\n.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}\n.syntaxhighlighter{background-color:#1b2426 !important;}\n.syntaxhighlighter .line.alt1{background-color:#1b2426 !important;}\n.syntaxhighlighter .line.alt2{background-color:#1b2426 !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#323e41 !important;}\n.syntaxhighlighter .line.highlighted.number{color:#b9bdb6 !important;}\n.syntaxhighlighter table caption{color:#b9bdb6 !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #435a5f !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#435a5f !important;color:#1b2426 !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#5ba1cf !important;background:black !important;border:1px solid #435a5f !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#5ba1cf !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#5ce638 !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#435a5f !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#e0e8ff !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#b9bdb6 !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#878a85 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#5ce638 !important;}\n.syntaxhighlighter .keyword{color:#5ba1cf !important;}\n.syntaxhighlighter .preprocessor{color:#435a5f !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ffaa3e !important;}\n.syntaxhighlighter .constants{color:#e0e8ff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#5ba1cf !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#e0e8ff !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:white !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#ffaa3e !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeAppleScript.css",
    "content": ".syntaxhighlighter.applescript{background:white;font-size:1em;color:black;}\n.syntaxhighlighter.applescript div,.syntaxhighlighter.applescript code{font:1em/1.25 Verdana,sans-serif !important;}\n.syntaxhighlighter.applescript .code .line{overflow:hidden !important;}\n.syntaxhighlighter.applescript .code .line.highlighted{background:#b5d5ff !important;}\n.syntaxhighlighter.applescript .color1{color:#000000 !important;}\n.syntaxhighlighter.applescript .color2{color:#000000 !important;}\n.syntaxhighlighter.applescript .color3{color:#000000 !important;font-weight:bold !important;}\n.syntaxhighlighter.applescript .keyword{color:#000000 !important;font-weight:bold !important;}\n.syntaxhighlighter.applescript .color4{color:#0000ff !important;font-style:italic !important;}\n.syntaxhighlighter.applescript .comments{color:#4c4d4d !important;}\n.syntaxhighlighter.applescript .plain{color:#408000 !important;}\n.syntaxhighlighter.applescript .string{color:#000000 !important;}\n.syntaxhighlighter.applescript .commandNames{color:#0000ff !important;font-weight:bold !important;}\n.syntaxhighlighter.applescript .parameterNames{color:#0000ff !important;}\n.syntaxhighlighter.applescript .classes{color:#0000ff !important;font-style:italic !important;}\n.syntaxhighlighter.applescript .properties{color:#6c04d4 !important;}\n.syntaxhighlighter.applescript .enumeratedValues{color:#4a1e7f !important;}\n.syntaxhighlighter.applescript .additionCommandNames{color:#0016b0 !important;font-weight:bold !important;}\n.syntaxhighlighter.applescript .additionParameterNames{color:#0016b0 !important;}\n.syntaxhighlighter.applescript .additionClasses{color:#0016b0 !important;font-style:italic !important;}\n.syntaxhighlighter.applescript .spaces{display:inline-block;height:0 !important;font-size:1.75em !important;line-height:0 !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeDefault.css",
    "content": ".syntaxhighlighter{background-color:white !important;}\n.syntaxhighlighter .line.alt1{background-color:white !important;}\n.syntaxhighlighter .line.alt2{background-color:white !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0 !important;}\n.syntaxhighlighter .line.highlighted.number{color:black !important;}\n.syntaxhighlighter table caption{color:black !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c !important;color:white !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:blue !important;background:white !important;border:1px solid #6ce26c !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:blue !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:red !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#6ce26c !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:black !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue !important;}\n.syntaxhighlighter .keyword{color:#006699 !important;}\n.syntaxhighlighter .preprocessor{color:gray !important;}\n.syntaxhighlighter .variable{color:#aa7700 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ff1493 !important;}\n.syntaxhighlighter .constants{color:#0066cc !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#006699 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeDjango.css",
    "content": ".syntaxhighlighter{background-color:#0a2b1d !important;}\n.syntaxhighlighter .line.alt1{background-color:#0a2b1d !important;}\n.syntaxhighlighter .line.alt2{background-color:#0a2b1d !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#233729 !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:#f8f8f8 !important;}\n.syntaxhighlighter .gutter{color:#497958 !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #41a83e !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#41a83e !important;color:#0a2b1d !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#96dd3b !important;background:black !important;border:1px solid #41a83e !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#96dd3b !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:white !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#41a83e !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#ffe862 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#f8f8f8 !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#336442 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#9df39f !important;}\n.syntaxhighlighter .keyword{color:#96dd3b !important;}\n.syntaxhighlighter .preprocessor{color:#91bb9e !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#f7e741 !important;}\n.syntaxhighlighter .functions{color:#ffaa3e !important;}\n.syntaxhighlighter .constants{color:#e0e8ff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#96dd3b !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#eb939a !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#91bb9e !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#edef7d !important;}\n.syntaxhighlighter .comments{font-style:italic !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeEclipse.css",
    "content": ".syntaxhighlighter{background-color:white !important;}\n.syntaxhighlighter .line.alt1{background-color:white !important;}\n.syntaxhighlighter .line.alt2{background-color:white !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#c3defe !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:black !important;}\n.syntaxhighlighter .gutter{color:#787878 !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #d4d0c8 !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#d4d0c8 !important;color:white !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#3f5fbf !important;background:white !important;border:1px solid #d4d0c8 !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#3f5fbf !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#aa7700 !important;}\n.syntaxhighlighter .toolbar{color:#a0a0a0 !important;background:#d4d0c8 !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:#a0a0a0 !important;}\n.syntaxhighlighter .toolbar a:hover{color:red !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#3f5fbf !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#2a00ff !important;}\n.syntaxhighlighter .keyword{color:#7f0055 !important;}\n.syntaxhighlighter .preprocessor{color:#646464 !important;}\n.syntaxhighlighter .variable{color:#aa7700 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ff1493 !important;}\n.syntaxhighlighter .constants{color:#0066cc !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#7f0055 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n.syntaxhighlighter .xml .keyword{color:#3f7f7f !important;font-weight:normal !important;}\n.syntaxhighlighter .xml .color1,.syntaxhighlighter .xml .color1 a{color:#7f007f !important;}\n.syntaxhighlighter .xml .string{font-style:italic !important;color:#2a00ff !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeEmacs.css",
    "content": ".syntaxhighlighter{background-color:black !important;}\n.syntaxhighlighter .line.alt1{background-color:black !important;}\n.syntaxhighlighter .line.alt2{background-color:black !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#2a3133 !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:#d3d3d3 !important;}\n.syntaxhighlighter .gutter{color:#d3d3d3 !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #990000 !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#990000 !important;color:black !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#ebdb8d !important;background:black !important;border:1px solid #990000 !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#ebdb8d !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#ff7d27 !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#990000 !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#9ccff4 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#d3d3d3 !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#ff7d27 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#ff9e7b !important;}\n.syntaxhighlighter .keyword{color:aqua !important;}\n.syntaxhighlighter .preprocessor{color:#aec4de !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#81cef9 !important;}\n.syntaxhighlighter .constants{color:#ff9e7b !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:aqua !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#ebdb8d !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff7d27 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#aec4de !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeFadeToGrey.css",
    "content": ".syntaxhighlighter{background-color:#121212 !important;}\n.syntaxhighlighter .line.alt1{background-color:#121212 !important;}\n.syntaxhighlighter .line.alt2{background-color:#121212 !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#2c2c29 !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:white !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #3185b9 !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#3185b9 !important;color:#121212 !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#3185b9 !important;background:black !important;border:1px solid #3185b9 !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#3185b9 !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#d01d33 !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#3185b9 !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#96daff !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:white !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#696854 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#e3e658 !important;}\n.syntaxhighlighter .keyword{color:#d01d33 !important;}\n.syntaxhighlighter .preprocessor{color:#435a5f !important;}\n.syntaxhighlighter .variable{color:#898989 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#aaaaaa !important;}\n.syntaxhighlighter .constants{color:#96daff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#d01d33 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#ffc074 !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#4a8cdb !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#96daff !important;}\n.syntaxhighlighter .functions{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeMDUltra.css",
    "content": ".syntaxhighlighter{background-color:#222222 !important;}\n.syntaxhighlighter .line.alt1{background-color:#222222 !important;}\n.syntaxhighlighter .line.alt2{background-color:#222222 !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#253e5a !important;}\n.syntaxhighlighter .line.highlighted.number{color:white !important;}\n.syntaxhighlighter table caption{color:lime !important;}\n.syntaxhighlighter .gutter{color:#38566f !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #435a5f !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#435a5f !important;color:#222222 !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#428bdd !important;background:black !important;border:1px solid #435a5f !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#428bdd !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:lime !important;}\n.syntaxhighlighter .toolbar{color:#aaaaff !important;background:#435a5f !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:#aaaaff !important;}\n.syntaxhighlighter .toolbar a:hover{color:#9ccff4 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:lime !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#428bdd !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:lime !important;}\n.syntaxhighlighter .keyword{color:#aaaaff !important;}\n.syntaxhighlighter .preprocessor{color:#8aa6c1 !important;}\n.syntaxhighlighter .variable{color:aqua !important;}\n.syntaxhighlighter .value{color:#f7e741 !important;}\n.syntaxhighlighter .functions{color:#ff8000 !important;}\n.syntaxhighlighter .constants{color:yellow !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#aaaaff !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:red !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:yellow !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#ffaa3e !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeMidnight.css",
    "content": ".syntaxhighlighter{background-color:#0f192a !important;}\n.syntaxhighlighter .line.alt1{background-color:#0f192a !important;}\n.syntaxhighlighter .line.alt2{background-color:#0f192a !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#253e5a !important;}\n.syntaxhighlighter .line.highlighted.number{color:#38566f !important;}\n.syntaxhighlighter table caption{color:#d1edff !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #435a5f !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#435a5f !important;color:#0f192a !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#428bdd !important;background:black !important;border:1px solid #435a5f !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#428bdd !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#1dc116 !important;}\n.syntaxhighlighter .toolbar{color:#d1edff !important;background:#435a5f !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:#d1edff !important;}\n.syntaxhighlighter .toolbar a:hover{color:#8aa6c1 !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#d1edff !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#428bdd !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#1dc116 !important;}\n.syntaxhighlighter .keyword{color:#b43d3d !important;}\n.syntaxhighlighter .preprocessor{color:#8aa6c1 !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#f7e741 !important;}\n.syntaxhighlighter .functions{color:#ffaa3e !important;}\n.syntaxhighlighter .constants{color:#e0e8ff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#b43d3d !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#f8bb00 !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:white !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#ffaa3e !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeRDark.css",
    "content": ".syntaxhighlighter{background-color:#1b2426 !important;}\n.syntaxhighlighter .line.alt1{background-color:#1b2426 !important;}\n.syntaxhighlighter .line.alt2{background-color:#1b2426 !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#323e41 !important;}\n.syntaxhighlighter .line.highlighted.number{color:#b9bdb6 !important;}\n.syntaxhighlighter table caption{color:#b9bdb6 !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #435a5f !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#435a5f !important;color:#1b2426 !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:#5ba1cf !important;background:black !important;border:1px solid #435a5f !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:#5ba1cf !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:#5ce638 !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#435a5f !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:#e0e8ff !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:#b9bdb6 !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#878a85 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#5ce638 !important;}\n.syntaxhighlighter .keyword{color:#5ba1cf !important;}\n.syntaxhighlighter .preprocessor{color:#435a5f !important;}\n.syntaxhighlighter .variable{color:#ffaa3e !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ffaa3e !important;}\n.syntaxhighlighter .constants{color:#e0e8ff !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#5ba1cf !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:#e0e8ff !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:white !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:#ffaa3e !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/examples/styles/shThemeVisualStudio.css",
    "content": ".syntaxhighlighter{background-color:white !important;}\n.syntaxhighlighter .line.alt1{background-color:white !important;}\n.syntaxhighlighter .line.alt2{background-color:white !important;}\n.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0 !important;}\n.syntaxhighlighter .line.highlighted.number{color:black !important;}\n.syntaxhighlighter table caption{color:black !important;}\n.syntaxhighlighter .gutter{color:#afafaf !important;}\n.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c !important;}\n.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c !important;color:white !important;}\n.syntaxhighlighter.printing .line .content{border:none !important;}\n.syntaxhighlighter.collapsed{overflow:visible !important;}\n.syntaxhighlighter.collapsed .toolbar{color:blue !important;background:white !important;border:1px solid #6ce26c !important;}\n.syntaxhighlighter.collapsed .toolbar a{color:blue !important;}\n.syntaxhighlighter.collapsed .toolbar a:hover{color:red !important;}\n.syntaxhighlighter .toolbar{color:white !important;background:#6ce26c !important;border:none !important;}\n.syntaxhighlighter .toolbar a{color:white !important;}\n.syntaxhighlighter .toolbar a:hover{color:black !important;}\n.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black !important;}\n.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200 !important;}\n.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#d11010 !important;}\n.syntaxhighlighter .keyword{color:#006699 !important;}\n.syntaxhighlighter .preprocessor{color:gray !important;}\n.syntaxhighlighter .variable{color:#aa7700 !important;}\n.syntaxhighlighter .value{color:#009900 !important;}\n.syntaxhighlighter .functions{color:#ff1493 !important;}\n.syntaxhighlighter .constants{color:#0066cc !important;}\n.syntaxhighlighter .script{font-weight:bold !important;color:#006699 !important;background-color:none !important;}\n.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray !important;}\n.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493 !important;}\n.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red !important;}\n.syntaxhighlighter .keyword{font-weight:bold !important;}\n"
  },
  {
    "path": "application/libraries/PHPMailer/extras/EasyPeasyICS.php",
    "content": "<?php\n/**\n * EasyPeasyICS Simple ICS/vCal data generator.\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n * @author Manuel Reinhard <manu@sprain.ch>\n *\n * Built with inspiration from\n * http://stackoverflow.com/questions/1463480/how-can-i-use-php-to-dynamically-publish-an-ical-file-to-be-read-by-google-calend/1464355#1464355\n * History:\n * 2010/12/17 - Manuel Reinhard - when it all started\n * 2014 PHPMailer project becomes maintainer\n */\n\n/**\n * Class EasyPeasyICS.\n * Simple ICS data generator\n * @package phpmailer\n * @subpackage easypeasyics\n */\nclass EasyPeasyICS\n{\n    /**\n     * The name of the calendar\n     * @var string\n     */\n    protected $calendarName;\n    /**\n     * The array of events to add to this calendar\n     * @var array\n     */\n    protected $events = array();\n\n    /**\n     * Constructor\n     * @param string $calendarName\n     */\n    public function __construct($calendarName = \"\")\n    {\n        $this->calendarName = $calendarName;\n    }\n\n    /**\n     * Add an event to this calendar.\n     * @param string $start The start date and time as a unix timestamp\n     * @param string $end The end date and time as a unix timestamp\n     * @param string $summary A summary or title for the event\n     * @param string $description A description of the event\n     * @param string $url A URL for the event\n     * @param string $uid A unique identifier for the event - generated automatically if not provided\n     * @return array An array of event details, including any generated UID\n     */\n    public function addEvent($start, $end, $summary = '', $description = '', $url = '', $uid = '')\n    {\n        if (empty($uid)) {\n            $uid = md5(uniqid(mt_rand(), true)) . '@EasyPeasyICS';\n        }\n        $event = array(\n            'start' => gmdate('Ymd', $start) . 'T' . gmdate('His', $start) . 'Z',\n            'end' => gmdate('Ymd', $end) . 'T' . gmdate('His', $end) . 'Z',\n            'summary' => $summary,\n            'description' => $description,\n            'url' => $url,\n            'uid' => $uid\n        );\n        $this->events[] = $event;\n        return $event;\n    }\n\n    /**\n     * @return array Get the array of events.\n     */\n    public function getEvents()\n    {\n        return $this->events;\n    }\n\n    /**\n     * Clear all events.\n     */\n    public function clearEvents()\n    {\n        $this->events = array();\n    }\n\n    /**\n     * Get the name of the calendar.\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->calendarName;\n    }\n\n    /**\n     * Set the name of the calendar.\n     * @param $name\n     */\n    public function setName($name)\n    {\n        $this->calendarName = $name;\n    }\n\n    /**\n     * Render and optionally output a vcal string.\n     * @param bool $output Whether to output the calendar data directly (the default).\n     * @return string The complete rendered vlal\n     */\n    public function render($output = true)\n    {\n        //Add header\n        $ics = 'BEGIN:VCALENDAR\nMETHOD:PUBLISH\nVERSION:2.0\nX-WR-CALNAME:' . $this->calendarName . '\nPRODID:-//hacksw/handcal//NONSGML v1.0//EN';\n\n        //Add events\n        foreach ($this->events as $event) {\n            $ics .= '\nBEGIN:VEVENT\nUID:' . $event['uid'] . '\nDTSTAMP:' . gmdate('Ymd') . 'T' . gmdate('His') . 'Z\nDTSTART:' . $event['start'] . '\nDTEND:' . $event['end'] . '\nSUMMARY:' . str_replace(\"\\n\", \"\\\\n\", $event['summary']) . '\nDESCRIPTION:' . str_replace(\"\\n\", \"\\\\n\", $event['description']) . '\nURL;VALUE=URI:' . $event['url'] . '\nEND:VEVENT';\n        }\n\n        //Add footer\n        $ics .= '\nEND:VCALENDAR';\n\n        if ($output) {\n            //Output\n            $filename = $this->calendarName;\n            //Filename needs quoting if it contains spaces\n            if (strpos($filename, ' ') !== false) {\n                $filename = '\"'.$filename.'\"';\n            }\n            header('Content-type: text/calendar; charset=utf-8');\n            header('Content-Disposition: inline; filename=' . $filename . '.ics');\n            echo $ics;\n        }\n        return $ics;\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/extras/README.md",
    "content": "# PHPMailer Extras\n\nThese classes provide optional additional functions to PHPMailer.\n\nThese are not loaded by the PHPMailer autoloader, so in some cases you may need to `require` them yourself before using them.\n\n## EasyPeasyICS\n\nThis class was originally written by Manuel Reinhard and provides a simple means of generating ICS/vCal files that are used in sending calendar events. PHPMailer does not use it directly, but you can use it to generate content appropriate for placing in the `Ical` property of PHPMailer. The PHPMailer project is now its official home as Manuel has given permission for that and is no longer maintaining it himself.\n\n## htmlfilter\n\nThis class by Konstantin Riabitsev and Jim Jagielski implements HTML filtering to remove potentially malicious tags, such as `<script>` or `onclick=` attributes that can result in XSS attacks. This is a simple filter and is not as comprehensive as [HTMLawed](http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/) or [HTMLPurifier](http://htmlpurifier.org), but it's easier to use and considerably better than nothing! PHPMailer does not use it directly, but you may want to apply it to user-supplied HTML before using it as a message body.\n\n## NTLM_SASL_client\n\nThis class by Manuel Lemos (bundled with permission) adds the ability to authenticate with Microsoft Windows mail servers that use NTLM-based authentication. It is used by PHPMailer if you send via SMTP and set the `AuthType` property to `NTLM`; you will also need to use the `Realm` and `Workstation` properties. The original source is [here](http://www.phpclasses.org/browse/file/7495.html).\n"
  },
  {
    "path": "application/libraries/PHPMailer/extras/htmlfilter.php",
    "content": "<?php\n/**\n * htmlfilter.inc\n * ---------------\n * This set of functions allows you to filter html in order to remove\n * any malicious tags from it. Useful in cases when you need to filter\n * user input for any cross-site-scripting attempts.\n *\n * Copyright (C) 2002-2004 by Duke University\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\t See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301  USA\n *\n * @Author\tKonstantin Riabitsev <icon@linux.duke.edu>\n * @Author  Jim Jagielski <jim@jaguNET.com / jimjag@gmail.com>\n * @Version 1.1 ($Date$)\n */\n\n/**\n * This function returns the final tag out of the tag name, an array\n * of attributes, and the type of the tag. This function is called by\n * tln_sanitize internally.\n *\n * @param string $tagname the name of the tag.\n * @param array $attary the array of attributes and their values\n * @param integer $tagtype The type of the tag (see in comments).\n * @return string A string with the final tag representation.\n */\nfunction tln_tagprint($tagname, $attary, $tagtype)\n{\n    if ($tagtype == 2) {\n        $fulltag = '</' . $tagname . '>';\n    } else {\n        $fulltag = '<' . $tagname;\n        if (is_array($attary) && sizeof($attary)) {\n            $atts = array();\n            foreach($attary as $attname => $attvalue) {\n                array_push($atts, \"$attname=$attvalue\");\n            }\n            $fulltag .= ' ' . join(' ', $atts);\n        }\n        if ($tagtype == 3) {\n            $fulltag .= ' /';\n        }\n        $fulltag .= '>';\n    }\n    return $fulltag;\n}\n\n/**\n * A small helper function to use with array_walk. Modifies a by-ref\n * value and makes it lowercase.\n *\n * @param string $val a value passed by-ref.\n * @return\t\tvoid since it modifies a by-ref value.\n */\nfunction tln_casenormalize(&$val)\n{\n    $val = strtolower($val);\n}\n\n/**\n * This function skips any whitespace from the current position within\n * a string and to the next non-whitespace value.\n *\n * @param string $body the string\n * @param integer $offset the offset within the string where we should start\n *\t\t\t\t   looking for the next non-whitespace character.\n * @return integer          the location within the $body where the next\n *\t\t\t\t   non-whitespace char is located.\n */\nfunction tln_skipspace($body, $offset)\n{\n    preg_match('/^(\\s*)/s', substr($body, $offset), $matches);\n    if (sizeof($matches[1])) {\n        $count = strlen($matches[1]);\n        $offset += $count;\n    }\n    return $offset;\n}\n\n/**\n * This function looks for the next character within a string.\tIt's\n * really just a glorified \"strpos\", except it catches the failures\n * nicely.\n *\n * @param string $body   The string to look for needle in.\n * @param integer $offset Start looking from this position.\n * @param string $needle The character/string to look for.\n * @return integer           location of the next occurrence of the needle, or\n *\t\t\t\t   strlen($body) if needle wasn't found.\n */\nfunction tln_findnxstr($body, $offset, $needle)\n{\n    $pos = strpos($body, $needle, $offset);\n    if ($pos === false) {\n        $pos = strlen($body);\n    }\n    return $pos;\n}\n\n/**\n * This function takes a PCRE-style regexp and tries to match it\n * within the string.\n *\n * @param string $body   The string to look for needle in.\n * @param integer $offset Start looking from here.\n * @param string $reg       A PCRE-style regex to match.\n * @return array|boolean  Returns a false if no matches found, or an array\n *\t\t\t\t   with the following members:\n *\t\t\t\t   - integer with the location of the match within $body\n *\t\t\t\t   - string with whatever content between offset and the match\n *\t\t\t\t   - string with whatever it is we matched\n */\nfunction tln_findnxreg($body, $offset, $reg)\n{\n    $matches = array();\n    $retarr = array();\n    $preg_rule = '%^(.*?)(' . $reg . ')%s';\n    preg_match($preg_rule, substr($body, $offset), $matches);\n    if (!isset($matches[0]) || !$matches[0]) {\n        $retarr = false;\n    } else {\n        $retarr[0] = $offset + strlen($matches[1]);\n        $retarr[1] = $matches[1];\n        $retarr[2] = $matches[2];\n    }\n    return $retarr;\n}\n\n/**\n * This function looks for the next tag.\n *\n * @param string $body   String where to look for the next tag.\n * @param integer $offset Start looking from here.\n * @return array|boolean false if no more tags exist in the body, or\n *\t\t\t\t   an array with the following members:\n *\t\t\t\t   - string with the name of the tag\n *\t\t\t\t   - array with attributes and their values\n *\t\t\t\t   - integer with tag type (1, 2, or 3)\n *\t\t\t\t   - integer where the tag starts (starting \"<\")\n *\t\t\t\t   - integer where the tag ends (ending \">\")\n *\t\t\t\t   first three members will be false, if the tag is invalid.\n */\nfunction tln_getnxtag($body, $offset)\n{\n    if ($offset > strlen($body)) {\n        return false;\n    }\n    $lt = tln_findnxstr($body, $offset, '<');\n    if ($lt == strlen($body)) {\n        return false;\n    }\n    /**\n     * We are here:\n     * blah blah <tag attribute=\"value\">\n     * \\---------^\n     */\n    $pos = tln_skipspace($body, $lt + 1);\n    if ($pos >= strlen($body)) {\n        return array(false, false, false, $lt, strlen($body));\n    }\n    /**\n     * There are 3 kinds of tags:\n     * 1. Opening tag, e.g.:\n     *\t  <a href=\"blah\">\n     * 2. Closing tag, e.g.:\n     *\t  </a>\n     * 3. XHTML-style content-less tag, e.g.:\n     *\t  <img src=\"blah\"/>\n     */\n    switch (substr($body, $pos, 1)) {\n    case '/':\n        $tagtype = 2;\n        $pos++;\n        break;\n    case '!':\n        /**\n         * A comment or an SGML declaration.\n         */\n            if (substr($body, $pos + 1, 2) == '--') {\n            $gt = strpos($body, '-->', $pos);\n            if ($gt === false) {\n                $gt = strlen($body);\n            } else {\n                $gt += 2;\n            }\n            return array(false, false, false, $lt, $gt);\n        } else {\n            $gt = tln_findnxstr($body, $pos, '>');\n            return array(false, false, false, $lt, $gt);\n        }\n        break;\n    default:\n        /**\n         * Assume tagtype 1 for now. If it's type 3, we'll switch values\n         * later.\n         */\n        $tagtype = 1;\n        break;\n    }\n\n    /**\n     * Look for next [\\W-_], which will indicate the end of the tag name.\n     */\n    $regary = tln_findnxreg($body, $pos, '[^\\w\\-_]');\n    if ($regary == false) {\n        return array(false, false, false, $lt, strlen($body));\n    }\n    list($pos, $tagname, $match) = $regary;\n    $tagname = strtolower($tagname);\n\n    /**\n     * $match can be either of these:\n     * '>'\tindicating the end of the tag entirely.\n     * '\\s' indicating the end of the tag name.\n     * '/'\tindicating that this is type-3 xhtml tag.\n     *\n     * Whatever else we find there indicates an invalid tag.\n     */\n    switch ($match) {\n    case '/':\n        /**\n         * This is an xhtml-style tag with a closing / at the\n         * end, like so: <img src=\"blah\"/>. Check if it's followed\n         * by the closing bracket. If not, then this tag is invalid\n         */\n        if (substr($body, $pos, 2) == '/>') {\n            $pos++;\n            $tagtype = 3;\n        } else {\n            $gt = tln_findnxstr($body, $pos, '>');\n            $retary = array(false, false, false, $lt, $gt);\n            return $retary;\n        }\n            //intentional fall-through\n    case '>':\n        return array($tagname, false, $tagtype, $lt, $pos);\n        break;\n    default:\n        /**\n         * Check if it's whitespace\n         */\n        if (!preg_match('/\\s/', $match)) {\n            /**\n             * This is an invalid tag! Look for the next closing \">\".\n             */\n            $gt = tln_findnxstr($body, $lt, '>');\n            return array(false, false, false, $lt, $gt);\n        }\n        break;\n    }\n\n    /**\n     * At this point we're here:\n     * <tagname\t attribute='blah'>\n     * \\-------^\n     *\n     * At this point we loop in order to find all attributes.\n     */\n    $attary = array();\n\n    while ($pos <= strlen($body)) {\n        $pos = tln_skipspace($body, $pos);\n        if ($pos == strlen($body)) {\n            /**\n             * Non-closed tag.\n             */\n            return array(false, false, false, $lt, $pos);\n        }\n        /**\n         * See if we arrived at a \">\" or \"/>\", which means that we reached\n         * the end of the tag.\n         */\n        $matches = array();\n        if (preg_match('%^(\\s*)(>|/>)%s', substr($body, $pos), $matches)) {\n            /**\n             * Yep. So we did.\n             */\n            $pos += strlen($matches[1]);\n            if ($matches[2] == '/>') {\n                $tagtype = 3;\n                $pos++;\n            }\n            return array($tagname, $attary, $tagtype, $lt, $pos);\n        }\n\n        /**\n         * There are several types of attributes, with optional\n         * [:space:] between members.\n         * Type 1:\n         *\t attrname[:space:]=[:space:]'CDATA'\n         * Type 2:\n         *\t attrname[:space:]=[:space:]\"CDATA\"\n         * Type 3:\n         *\t attr[:space:]=[:space:]CDATA\n         * Type 4:\n         *\t attrname\n         *\n         * We leave types 1 and 2 the same, type 3 we check for\n         * '\"' and convert to \"&quot\" if needed, then wrap in\n         * double quotes. Type 4 we convert into:\n         * attrname=\"yes\".\n         */\n        $regary = tln_findnxreg($body, $pos, '[^\\w\\-_]');\n        if ($regary == false) {\n            /**\n             * Looks like body ended before the end of tag.\n             */\n            return array(false, false, false, $lt, strlen($body));\n        }\n        list($pos, $attname, $match) = $regary;\n        $attname = strtolower($attname);\n        /**\n         * We arrived at the end of attribute name. Several things possible\n         * here:\n         * '>'\tmeans the end of the tag and this is attribute type 4\n         * '/'\tif followed by '>' means the same thing as above\n         * '\\s' means a lot of things -- look what it's followed by.\n         *\t\tanything else means the attribute is invalid.\n         */\n        switch ($match) {\n        case '/':\n            /**\n             * This is an xhtml-style tag with a closing / at the\n             * end, like so: <img src=\"blah\"/>. Check if it's followed\n             * by the closing bracket. If not, then this tag is invalid\n             */\n            if (substr($body, $pos, 2) == '/>') {\n                $pos++;\n                $tagtype = 3;\n            } else {\n                $gt = tln_findnxstr($body, $pos, '>');\n                $retary = array(false, false, false, $lt, $gt);\n                return $retary;\n            }\n                //intentional fall-through\n        case '>':\n            $attary{$attname} = '\"yes\"';\n            return array($tagname, $attary, $tagtype, $lt, $pos);\n            break;\n        default:\n            /**\n             * Skip whitespace and see what we arrive at.\n             */\n            $pos = tln_skipspace($body, $pos);\n            $char = substr($body, $pos, 1);\n            /**\n             * Two things are valid here:\n             * '=' means this is attribute type 1 2 or 3.\n             * \\w means this was attribute type 4.\n             * anything else we ignore and re-loop. End of tag and\n             * invalid stuff will be caught by our checks at the beginning\n             * of the loop.\n             */\n            if ($char == '=') {\n                $pos++;\n                $pos = tln_skipspace($body, $pos);\n                /**\n                 * Here are 3 possibilities:\n                 * \"'\"\tattribute type 1\n                 * '\"'\tattribute type 2\n                 * everything else is the content of tag type 3\n                 */\n                $quot = substr($body, $pos, 1);\n                if ($quot == '\\'') {\n                        $regary = tln_findnxreg($body, $pos + 1, '\\'');\n                    if ($regary == false) {\n                        return array(false, false, false, $lt, strlen($body));\n                    }\n                    list($pos, $attval, $match) = $regary;\n                    $pos++;\n                    $attary{$attname} = '\\'' . $attval . '\\'';\n                } elseif ($quot == '\"') {\n                    $regary = tln_findnxreg($body, $pos + 1, '\\\"');\n                    if ($regary == false) {\n                        return array(false, false, false, $lt, strlen($body));\n                    }\n                    list($pos, $attval, $match) = $regary;\n                    $pos++;\n                            $attary{$attname} = '\"' . $attval . '\"';\n                } else {\n                    /**\n                     * These are hateful. Look for \\s, or >.\n                     */\n                    $regary = tln_findnxreg($body, $pos, '[\\s>]');\n                    if ($regary == false) {\n                        return array(false, false, false, $lt, strlen($body));\n                    }\n                    list($pos, $attval, $match) = $regary;\n                    /**\n                     * If it's \">\" it will be caught at the top.\n                     */\n                    $attval = preg_replace('/\\\"/s', '&quot;', $attval);\n                    $attary{$attname} = '\"' . $attval . '\"';\n                }\n            } elseif (preg_match('|[\\w/>]|', $char)) {\n                /**\n                 * That was attribute type 4.\n                 */\n                $attary{$attname} = '\"yes\"';\n            } else {\n                /**\n                 * An illegal character. Find next '>' and return.\n                 */\n                $gt = tln_findnxstr($body, $pos, '>');\n                return array(false, false, false, $lt, $gt);\n            }\n            break;\n        }\n    }\n    /**\n     * The fact that we got here indicates that the tag end was never\n     * found. Return invalid tag indication so it gets stripped.\n     */\n    return array(false, false, false, $lt, strlen($body));\n}\n\n/**\n * Translates entities into literal values so they can be checked.\n *\n * @param string $attvalue the by-ref value to check.\n * @param string $regex    the regular expression to check against.\n * @param boolean $hex        whether the entities are hexadecimal.\n * @return boolean            True or False depending on whether there were matches.\n */\nfunction tln_deent(&$attvalue, $regex, $hex = false)\n{\n    preg_match_all($regex, $attvalue, $matches);\n    if (is_array($matches) && sizeof($matches[0]) > 0) {\n        $repl = array();\n        for ($i = 0; $i < sizeof($matches[0]); $i++) {\n            $numval = $matches[1][$i];\n            if ($hex) {\n                $numval = hexdec($numval);\n            }\n            $repl{$matches[0][$i]} = chr($numval);\n        }\n        $attvalue = strtr($attvalue, $repl);\n        return true;\n    } else {\n        return false;\n    }\n}\n\n/**\n * This function checks attribute values for entity-encoded values\n * and returns them translated into 8-bit strings so we can run\n * checks on them.\n *\n * @param string $attvalue A string to run entity check against.\n */\nfunction tln_defang(&$attvalue)\n{\n    /**\n     * Skip this if there aren't ampersands or backslashes.\n     */\n    if (strpos($attvalue, '&') === false\n        && strpos($attvalue, '\\\\') === false\n    ) {\n        return;\n    }\n    do {\n        $m = false;\n        $m = $m || tln_deent($attvalue, '/\\&#0*(\\d+);*/s');\n        $m = $m || tln_deent($attvalue, '/\\&#x0*((\\d|[a-f])+);*/si', true);\n        $m = $m || tln_deent($attvalue, '/\\\\\\\\(\\d+)/s', true);\n    } while ($m == true);\n    $attvalue = stripslashes($attvalue);\n}\n\n/**\n * Kill any tabs, newlines, or carriage returns. Our friends the\n * makers of the browser with 95% market value decided that it'd\n * be funny to make \"java[tab]script\" be just as good as \"javascript\".\n *\n * @param string $attvalue     The attribute value before extraneous spaces removed.\n */\nfunction tln_unspace(&$attvalue)\n{\n    if (strcspn($attvalue, \"\\t\\r\\n\\0 \") != strlen($attvalue)) {\n        $attvalue = str_replace(\n            array(\"\\t\", \"\\r\", \"\\n\", \"\\0\", \" \"),\n            array('', '', '', '', ''),\n            $attvalue\n        );\n    }\n}\n\n/**\n * This function runs various checks against the attributes.\n *\n * @param string $tagname            String with the name of the tag.\n * @param array $attary            Array with all tag attributes.\n * @param array $rm_attnames        See description for tln_sanitize\n * @param array $bad_attvals        See description for tln_sanitize\n * @param array $add_attr_to_tag See description for tln_sanitize\n * @param string $trans_image_path\n * @param boolean $block_external_images\n * @return array with modified attributes.\n */\nfunction tln_fixatts(\n    $tagname,\n    $attary,\n    $rm_attnames,\n    $bad_attvals,\n    $add_attr_to_tag,\n    $trans_image_path,\n    $block_external_images\n) {\n    foreach($attary as $attname => $attvalue) {\n        /**\n         * See if this attribute should be removed.\n         */\n        foreach ($rm_attnames as $matchtag => $matchattrs) {\n            if (preg_match($matchtag, $tagname)) {\n                foreach ($matchattrs as $matchattr) {\n                    if (preg_match($matchattr, $attname)) {\n                        unset($attary{$attname});\n                        continue;\n                    }\n                }\n            }\n        }\n        /**\n         * Remove any backslashes, entities, or extraneous whitespace.\n         */\n        $oldattvalue = $attvalue;\n        tln_defang($attvalue);\n        if ($attname == 'style' && $attvalue !== $oldattvalue) {\n            $attvalue = \"idiocy\";\n            $attary{$attname} = $attvalue;\n        }\n        tln_unspace($attvalue);\n\n        /**\n         * Now let's run checks on the attvalues.\n         * I don't expect anyone to comprehend this. If you do,\n         * get in touch with me so I can drive to where you live and\n         * shake your hand personally. :)\n         */\n        foreach ($bad_attvals as $matchtag => $matchattrs) {\n            if (preg_match($matchtag, $tagname)) {\n                foreach ($matchattrs as $matchattr => $valary) {\n                    if (preg_match($matchattr, $attname)) {\n                        /**\n                         * There are two arrays in valary.\n                         * First is matches.\n                         * Second one is replacements\n                         */\n                        list($valmatch, $valrepl) = $valary;\n                        $newvalue = preg_replace($valmatch, $valrepl, $attvalue);\n                        if ($newvalue != $attvalue) {\n                            $attary{$attname} = $newvalue;\n                            $attvalue = $newvalue;\n                        }\n                    }\n                }\n            }\n        }\n        if ($attname == 'style') {\n            if (preg_match('/[\\0-\\37\\200-\\377]+/', $attvalue)) {\n                $attary{$attname} = '\"disallowed character\"';\n            }\n            preg_match_all(\"/url\\s*\\((.+)\\)/si\", $attvalue, $aMatch);\n            if (count($aMatch)) {\n                foreach($aMatch[1] as $sMatch) {\n                    $urlvalue = $sMatch;\n                    tln_fixurl($attname, $urlvalue, $trans_image_path, $block_external_images);\n                    $attary{$attname} = str_replace($sMatch, $urlvalue, $attvalue);\n                }\n            }\n        }\n     }\n    /**\n     * See if we need to append any attributes to this tag.\n     */\n    foreach ($add_attr_to_tag as $matchtag => $addattary) {\n        if (preg_match($matchtag, $tagname)) {\n            $attary = array_merge($attary, $addattary);\n        }\n    }\n    return $attary;\n}\n\nfunction tln_fixurl($attname, &$attvalue, $trans_image_path, $block_external_images)\n{\n    $sQuote = '\"';\n    $attvalue = trim($attvalue);\n    if ($attvalue && ($attvalue[0] =='\"'|| $attvalue[0] == \"'\")) {\n        // remove the double quotes\n        $sQuote = $attvalue[0];\n        $attvalue = trim(substr($attvalue,1,-1));\n    }\n\n    /**\n     * Replace empty src tags with the blank image.  src is only used\n     * for frames, images, and image inputs.  Doing a replace should\n     * not affect them working as should be, however it will stop\n     * IE from being kicked off when src for img tags are not set\n     */\n    if ($attvalue == '') {\n        $attvalue = $sQuote . $trans_image_path . $sQuote;\n    } else {\n        // first, disallow 8 bit characters and control characters\n        if (preg_match('/[\\0-\\37\\200-\\377]+/',$attvalue)) {\n            switch ($attname) {\n                case 'href':\n                    $attvalue = $sQuote . 'http://invalid-stuff-detected.example.com' . $sQuote;\n                    break;\n                default:\n                    $attvalue = $sQuote . $trans_image_path . $sQuote;\n                    break;\n            }\n        } else {\n            $aUrl = parse_url($attvalue);\n            if (isset($aUrl['scheme'])) {\n                switch(strtolower($aUrl['scheme'])) {\n                    case 'mailto':\n                    case 'http':\n                    case 'https':\n                    case 'ftp':\n                        if ($attname != 'href') {\n                            if ($block_external_images == true) {\n                                $attvalue = $sQuote . $trans_image_path . $sQuote;\n                            } else {\n                                if (!isset($aUrl['path'])) {\n                                    $attvalue = $sQuote . $trans_image_path . $sQuote;\n                                }\n                            }\n                        } else {\n                            $attvalue = $sQuote . $attvalue . $sQuote;\n                        }\n                        break;\n                    case 'outbind':\n                        $attvalue = $sQuote . $attvalue . $sQuote;\n                        break;\n                    case 'cid':\n                        $attvalue = $sQuote . $attvalue . $sQuote;\n                        break;\n                    default:\n                        $attvalue = $sQuote . $trans_image_path . $sQuote;\n                        break;\n                }\n            } else {\n                if (!isset($aUrl['path']) || $aUrl['path'] != $trans_image_path) {\n                    $$attvalue = $sQuote . $trans_image_path . $sQuote;\n                }\n            }\n        }\n    }\n}\n\nfunction tln_fixstyle($body, $pos, $trans_image_path, $block_external_images)\n{\n    // workaround for </style> in between comments\n    $content = '';\n    $sToken = '';\n    $bSucces = false;\n    $bEndTag = false;\n    for ($i=$pos,$iCount=strlen($body);$i<$iCount;++$i) {\n        $char = $body{$i};\n        switch ($char) {\n            case '<':\n                $sToken = $char;\n                break;\n            case '/':\n                 if ($sToken == '<') {\n                    $sToken .= $char;\n                    $bEndTag = true;\n                 } else {\n                    $content .= $char;\n                 }\n                 break;\n            case '>':\n                 if ($bEndTag) {\n                    $sToken .= $char;\n                    if (preg_match('/\\<\\/\\s*style\\s*\\>/i',$sToken,$aMatch)) {\n                        $newpos = $i + 1;\n                        $bSucces = true;\n                        break 2;\n                    } else {\n                        $content .= $sToken;\n                    }\n                    $bEndTag = false;\n                 } else {\n                    $content .= $char;\n                 }\n                 break;\n            case '!':\n                if ($sToken == '<') {\n                    // possible comment\n                    if (isset($body{$i+2}) && substr($body,$i,3) == '!--') {\n                        $i = strpos($body,'-->',$i+3);\n                        if ($i === false) { // no end comment\n                            $i = strlen($body);\n                        }\n                        $sToken = '';\n                    }\n                } else {\n                    $content .= $char;\n                }\n                break;\n            default:\n                if ($bEndTag) {\n                    $sToken .= $char;\n                } else {\n                    $content .= $char;\n                }\n                break;\n        }\n    }\n    if ($bSucces == FALSE){\n        return array(FALSE, strlen($body));\n    }\n\n\n\n    /**\n     * First look for general BODY style declaration, which would be\n     * like so:\n     * body {background: blah-blah}\n     * and change it to .bodyclass so we can just assign it to a <div>\n     */\n    $content = preg_replace(\"|body(\\s*\\{.*?\\})|si\", \".bodyclass\\\\1\", $content);\n\n    /**\n    * Fix url('blah') declarations.\n    */\n    //   $content = preg_replace(\"|url\\s*\\(\\s*([\\'\\\"])\\s*\\S+script\\s*:.*?([\\'\\\"])\\s*\\)|si\",\n    //                           \"url(\\\\1$trans_image_path\\\\2)\", $content);\n\n    // first check for 8bit sequences and disallowed control characters\n    if (preg_match('/[\\16-\\37\\200-\\377]+/',$content)) {\n        $content = '<!-- style block removed by html filter due to presence of 8bit characters -->';\n        return array($content, $newpos);\n    }\n\n    // remove @import line\n    $content = preg_replace(\"/^\\s*(@import.*)$/mi\",\"\\n<!-- @import rules forbidden -->\\n\",$content);\n\n    $content = preg_replace(\"/(\\\\\\\\)?u(\\\\\\\\)?r(\\\\\\\\)?l(\\\\\\\\)?/i\", 'url', $content);\n    preg_match_all(\"/url\\s*\\((.+)\\)/si\",$content,$aMatch);\n    if (count($aMatch)) {\n        $aValue = $aReplace = array();\n        foreach($aMatch[1] as $sMatch) {\n            // url value\n            $urlvalue = $sMatch;\n            tln_fixurl('style',$urlvalue, $trans_image_path, $block_external_images);\n            $aValue[] = $sMatch;\n            $aReplace[] = $urlvalue;\n        }\n        $content = str_replace($aValue,$aReplace,$content);\n    }\n\n    /**\n     * Remove any backslashes, entities, and extraneous whitespace.\n     */\n    $contentTemp = $content;\n    tln_defang($contentTemp);\n    tln_unspace($contentTemp);\n\n    $match   = array('/\\/\\*.*\\*\\//',\n                    '/expression/i',\n                    '/behaviou*r/i',\n                    '/binding/i',\n                    '/include-source/i',\n                    '/javascript/i',\n                    '/script/i',\n                    '/position/i');\n    $replace = array('','idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', '');\n    $contentNew = preg_replace($match, $replace, $contentTemp);\n    if ($contentNew !== $contentTemp) {\n        $content = $contentNew;\n    }\n    return array($content, $newpos);\n}\n\nfunction tln_body2div($attary, $trans_image_path)\n{\n    $divattary = array('class' => \"'bodyclass'\");\n    $text = '#000000';\n    $has_bgc_stl = $has_txt_stl = false;\n    $styledef = '';\n    if (is_array($attary) && sizeof($attary) > 0){\n        foreach ($attary as $attname=>$attvalue){\n            $quotchar = substr($attvalue, 0, 1);\n            $attvalue = str_replace($quotchar, \"\", $attvalue);\n            switch ($attname){\n                case 'background':\n                    $styledef .= \"background-image: url('$trans_image_path'); \";\n                    break;\n                case 'bgcolor':\n                    $has_bgc_stl = true;\n                    $styledef .= \"background-color: $attvalue; \";\n                    break;\n                case 'text':\n                    $has_txt_stl = true;\n                    $styledef .= \"color: $attvalue; \";\n                    break;\n            }\n        }\n        // Outlook defines a white bgcolor and no text color. This can lead to\n        // white text on a white bg with certain themes.\n        if ($has_bgc_stl && !$has_txt_stl) {\n            $styledef .= \"color: $text; \";\n        }\n        if (strlen($styledef) > 0){\n            $divattary{\"style\"} = \"\\\"$styledef\\\"\";\n        }\n    }\n    return $divattary;\n}\n\n/**\n *\n * @param string $body                    The HTML you wish to filter\n * @param array $tag_list                see description above\n * @param array $rm_tags_with_content see description above\n * @param array $self_closing_tags    see description above\n * @param boolean $force_tag_closing    see description above\n * @param array $rm_attnames            see description above\n * @param array $bad_attvals            see description above\n * @param array $add_attr_to_tag        see description above\n * @param string $trans_image_path\n * @param boolean $block_external_images\n\n * @return string                       Sanitized html safe to show on your pages.\n */\nfunction tln_sanitize(\n    $body,\n    $tag_list,\n    $rm_tags_with_content,\n    $self_closing_tags,\n    $force_tag_closing,\n    $rm_attnames,\n    $bad_attvals,\n    $add_attr_to_tag,\n    $trans_image_path,\n    $block_external_images\n) {\n    /**\n     * Normalize rm_tags and rm_tags_with_content.\n     */\n    $rm_tags = array_shift($tag_list);\n    @array_walk($tag_list, 'tln_casenormalize');\n    @array_walk($rm_tags_with_content, 'tln_casenormalize');\n    @array_walk($self_closing_tags, 'tln_casenormalize');\n    /**\n     * See if tag_list is of tags to remove or tags to allow.\n     * false  means remove these tags\n     * true\t  means allow these tags\n     */\n    $curpos = 0;\n    $open_tags = array();\n    $trusted = \"<!-- begin tln_sanitized html -->\\n\";\n    $skip_content = false;\n    /**\n     * Take care of netscape's stupid javascript entities like\n     * &{alert('boo')};\n     */\n    $body = preg_replace('/&(\\{.*?\\};)/si', '&amp;\\\\1', $body);\n    while (($curtag = tln_getnxtag($body, $curpos)) != false) {\n        list($tagname, $attary, $tagtype, $lt, $gt) = $curtag;\n        $free_content = substr($body, $curpos, $lt-$curpos);\n        /**\n         * Take care of <style>\n         */\n        if ($tagname == \"style\" && $tagtype == 1){\n            list($free_content, $curpos) =\n                tln_fixstyle($body, $gt+1, $trans_image_path, $block_external_images);\n            if ($free_content != FALSE){\n                if ( !empty($attary) ) {\n                    $attary = tln_fixatts($tagname,\n                                         $attary,\n                                         $rm_attnames,\n                                         $bad_attvals,\n                                         $add_attr_to_tag,\n                                         $trans_image_path,\n                                         $block_external_images\n                                         );\n                }\n                $trusted .= tln_tagprint($tagname, $attary, $tagtype);\n                $trusted .= $free_content;\n                $trusted .= tln_tagprint($tagname, null, 2);\n            }\n            continue;\n        }\n        if ($skip_content == false){\n            $trusted .= $free_content;\n        }\n        if ($tagname != false) {\n            if ($tagtype == 2) {\n                if ($skip_content == $tagname) {\n                    /**\n                     * Got to the end of tag we needed to remove.\n                     */\n                    $tagname = false;\n                    $skip_content = false;\n                } else {\n                    if ($skip_content == false) {\n                        if ($tagname == \"body\") {\n                            $tagname = \"div\";\n                        }\n                        if (isset($open_tags{$tagname}) &&\n                            $open_tags{$tagname} > 0\n                        ) {\n                            $open_tags{$tagname}--;\n                        } else {\n                            $tagname = false;\n                        }\n                    }\n                }\n            } else {\n                /**\n                 * $rm_tags_with_content\n                 */\n                if ($skip_content == false) {\n                    /**\n                     * See if this is a self-closing type and change\n                     * tagtype appropriately.\n                     */\n                    if ($tagtype == 1\n                        && in_array($tagname, $self_closing_tags)\n                    ) {\n                        $tagtype = 3;\n                    }\n                    /**\n                     * See if we should skip this tag and any content\n                     * inside it.\n                     */\n                    if ($tagtype == 1\n                        && in_array($tagname, $rm_tags_with_content)\n                    ) {\n                        $skip_content = $tagname;\n                    } else {\n                        if (($rm_tags == false\n                             && in_array($tagname, $tag_list)) ||\n                            ($rm_tags == true\n                                && !in_array($tagname, $tag_list))\n                        ) {\n                            $tagname = false;\n                        } else {\n                            /**\n                             * Convert body into div.\n                             */\n                            if ($tagname == \"body\"){\n                                $tagname = \"div\";\n                                $attary = tln_body2div($attary, $trans_image_path);\n                            }\n                            if ($tagtype == 1) {\n                                if (isset($open_tags{$tagname})) {\n                                    $open_tags{$tagname}++;\n                                } else {\n                                    $open_tags{$tagname} = 1;\n                                }\n                            }\n                            /**\n                             * This is where we run other checks.\n                             */\n                            if (is_array($attary) && sizeof($attary) > 0) {\n                                $attary = tln_fixatts(\n                                    $tagname,\n                                    $attary,\n                                    $rm_attnames,\n                                    $bad_attvals,\n                                    $add_attr_to_tag,\n                                    $trans_image_path,\n                                    $block_external_images\n                                );\n                            }\n                        }\n                    }\n                }\n            }\n            if ($tagname != false && $skip_content == false) {\n                $trusted .= tln_tagprint($tagname, $attary, $tagtype);\n            }\n        }\n        $curpos = $gt + 1;\n    }\n    $trusted .= substr($body, $curpos, strlen($body) - $curpos);\n    if ($force_tag_closing == true) {\n        foreach ($open_tags as $tagname => $opentimes) {\n            while ($opentimes > 0) {\n                $trusted .= '</' . $tagname . '>';\n                $opentimes--;\n            }\n        }\n        $trusted .= \"\\n\";\n    }\n    $trusted .= \"<!-- end tln_sanitized html -->\\n\";\n    return $trusted;\n}\n\n//\n// Use the nifty htmlfilter library\n//\n\n\nfunction HTMLFilter($body, $trans_image_path, $block_external_images = false)\n{\n\n    $tag_list = array(\n        false,\n        \"object\",\n        \"meta\",\n        \"html\",\n        \"head\",\n        \"base\",\n        \"link\",\n        \"frame\",\n        \"iframe\",\n        \"plaintext\",\n        \"marquee\"\n    );\n\n    $rm_tags_with_content = array(\n        \"script\",\n        \"applet\",\n        \"embed\",\n        \"title\",\n        \"frameset\",\n        \"xmp\",\n        \"xml\"\n    );\n\n    $self_closing_tags =  array(\n        \"img\",\n        \"br\",\n        \"hr\",\n        \"input\",\n        \"outbind\"\n    );\n\n    $force_tag_closing = true;\n\n    $rm_attnames = array(\n        \"/.*/\" =>\n            array(\n                // \"/target/i\",\n                \"/^on.*/i\",\n                \"/^dynsrc/i\",\n                \"/^data.*/i\",\n                \"/^lowsrc.*/i\"\n            )\n    );\n\n    $bad_attvals = array(\n        \"/.*/\" =>\n        array(\n            \"/^src|background/i\" =>\n            array(\n                array(\n                    '/^([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*mocha\\s*:*.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*about\\s*:.*([\\'\"])/si'\n                ),\n                array(\n                    \"\\\\1$trans_image_path\\\\2\",\n                    \"\\\\1$trans_image_path\\\\2\",\n                    \"\\\\1$trans_image_path\\\\2\"\n                )\n            ),\n            \"/^href|action/i\" =>\n            array(\n                array(\n                    '/^([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*mocha\\s*:*.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*about\\s*:.*([\\'\"])/si'\n                ),\n                array(\n                    \"\\\\1#\\\\1\",\n                    \"\\\\1#\\\\1\",\n                    \"\\\\1#\\\\1\"\n                )\n            ),\n            \"/^style/i\" =>\n            array(\n                array(\n                    \"/\\/\\*.*\\*\\//\",\n                    \"/expression/i\",\n                    \"/binding/i\",\n                    \"/behaviou*r/i\",\n                    \"/include-source/i\",\n                    '/position\\s*:/i',\n                    '/(\\\\\\\\)?u(\\\\\\\\)?r(\\\\\\\\)?l(\\\\\\\\)?/i',\n                    '/url\\s*\\(\\s*([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])\\s*\\)/si',\n                    '/url\\s*\\(\\s*([\\'\"])\\s*mocha\\s*:.*([\\'\"])\\s*\\)/si',\n                    '/url\\s*\\(\\s*([\\'\"])\\s*about\\s*:.*([\\'\"])\\s*\\)/si',\n                    '/(.*)\\s*:\\s*url\\s*\\(\\s*([\\'\"]*)\\s*\\S+script\\s*:.*([\\'\"]*)\\s*\\)/si'\n                ),\n                array(\n                    \"\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"url\",\n                    \"url(\\\\1#\\\\1)\",\n                    \"url(\\\\1#\\\\1)\",\n                    \"url(\\\\1#\\\\1)\",\n                    \"\\\\1:url(\\\\2#\\\\3)\"\n                )\n            )\n        )\n    );\n\n    if ($block_external_images) {\n        array_push(\n            $bad_attvals{'/.*/'}{'/^src|background/i'}[0],\n            '/^([\\'\\\"])\\s*https*:.*([\\'\\\"])/si'\n        );\n        array_push(\n            $bad_attvals{'/.*/'}{'/^src|background/i'}[1],\n            \"\\\\1$trans_image_path\\\\1\"\n        );\n        array_push(\n            $bad_attvals{'/.*/'}{'/^style/i'}[0],\n            '/url\\(([\\'\\\"])\\s*https*:.*([\\'\\\"])\\)/si'\n        );\n        array_push(\n            $bad_attvals{'/.*/'}{'/^style/i'}[1],\n            \"url(\\\\1$trans_image_path\\\\1)\"\n        );\n    }\n\n    $add_attr_to_tag = array(\n        \"/^a$/i\" =>\n            array('target' => '\"_blank\"')\n    );\n\n    $trusted = tln_sanitize(\n        $body,\n        $tag_list,\n        $rm_tags_with_content,\n        $self_closing_tags,\n        $force_tag_closing,\n        $rm_attnames,\n        $bad_attvals,\n        $add_attr_to_tag,\n        $trans_image_path,\n        $block_external_images\n    );\n    return $trusted;\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/extras/ntlm_sasl_client.php",
    "content": "<?php\n/*\n * ntlm_sasl_client.php\n *\n * @(#) $Id: ntlm_sasl_client.php,v 1.3 2004/11/17 08:00:37 mlemos Exp $\n *\n */\n\ndefine(\"SASL_NTLM_STATE_START\", 0);\ndefine(\"SASL_NTLM_STATE_IDENTIFY_DOMAIN\", 1);\ndefine(\"SASL_NTLM_STATE_RESPOND_CHALLENGE\", 2);\ndefine(\"SASL_NTLM_STATE_DONE\", 3);\ndefine(\"SASL_FAIL\", -1);\ndefine(\"SASL_CONTINUE\", 1);\n\nclass ntlm_sasl_client_class\n{\n    public $credentials = array();\n    public $state = SASL_NTLM_STATE_START;\n\n    public function initialize(&$client)\n    {\n        if (!function_exists($function = \"mcrypt_encrypt\")\n            || !function_exists($function = \"mhash\")\n        ) {\n            $extensions = array(\n                \"mcrypt_encrypt\" => \"mcrypt\",\n                \"mhash\" => \"mhash\"\n            );\n            $client->error = \"the extension \" . $extensions[$function] .\n                \" required by the NTLM SASL client class is not available in this PHP configuration\";\n            return (0);\n        }\n        return (1);\n    }\n\n    public function ASCIIToUnicode($ascii)\n    {\n        for ($unicode = \"\", $a = 0; $a < strlen($ascii); $a++) {\n            $unicode .= substr($ascii, $a, 1) . chr(0);\n        }\n        return ($unicode);\n    }\n\n    public function typeMsg1($domain, $workstation)\n    {\n        $domain_length = strlen($domain);\n        $workstation_length = strlen($workstation);\n        $workstation_offset = 32;\n        $domain_offset = $workstation_offset + $workstation_length;\n        return (\n            \"NTLMSSP\\0\" .\n            \"\\x01\\x00\\x00\\x00\" .\n            \"\\x07\\x32\\x00\\x00\" .\n            pack(\"v\", $domain_length) .\n            pack(\"v\", $domain_length) .\n            pack(\"V\", $domain_offset) .\n            pack(\"v\", $workstation_length) .\n            pack(\"v\", $workstation_length) .\n            pack(\"V\", $workstation_offset) .\n            $workstation .\n            $domain\n        );\n    }\n\n    public function NTLMResponse($challenge, $password)\n    {\n        $unicode = $this->ASCIIToUnicode($password);\n        $md4 = mhash(MHASH_MD4, $unicode);\n        $padded = $md4 . str_repeat(chr(0), 21 - strlen($md4));\n        $iv_size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);\n        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);\n        for ($response = \"\", $third = 0; $third < 21; $third += 7) {\n            for ($packed = \"\", $p = $third; $p < $third + 7; $p++) {\n                $packed .= str_pad(decbin(ord(substr($padded, $p, 1))), 8, \"0\", STR_PAD_LEFT);\n            }\n            for ($key = \"\", $p = 0; $p < strlen($packed); $p += 7) {\n                $s = substr($packed, $p, 7);\n                $b = $s . ((substr_count($s, \"1\") % 2) ? \"0\" : \"1\");\n                $key .= chr(bindec($b));\n            }\n            $ciphertext = mcrypt_encrypt(MCRYPT_DES, $key, $challenge, MCRYPT_MODE_ECB, $iv);\n            $response .= $ciphertext;\n        }\n        return $response;\n    }\n\n    public function typeMsg3($ntlm_response, $user, $domain, $workstation)\n    {\n        $domain_unicode = $this->ASCIIToUnicode($domain);\n        $domain_length = strlen($domain_unicode);\n        $domain_offset = 64;\n        $user_unicode = $this->ASCIIToUnicode($user);\n        $user_length = strlen($user_unicode);\n        $user_offset = $domain_offset + $domain_length;\n        $workstation_unicode = $this->ASCIIToUnicode($workstation);\n        $workstation_length = strlen($workstation_unicode);\n        $workstation_offset = $user_offset + $user_length;\n        $lm = \"\";\n        $lm_length = strlen($lm);\n        $lm_offset = $workstation_offset + $workstation_length;\n        $ntlm = $ntlm_response;\n        $ntlm_length = strlen($ntlm);\n        $ntlm_offset = $lm_offset + $lm_length;\n        $session = \"\";\n        $session_length = strlen($session);\n        $session_offset = $ntlm_offset + $ntlm_length;\n        return (\n            \"NTLMSSP\\0\" .\n            \"\\x03\\x00\\x00\\x00\" .\n            pack(\"v\", $lm_length) .\n            pack(\"v\", $lm_length) .\n            pack(\"V\", $lm_offset) .\n            pack(\"v\", $ntlm_length) .\n            pack(\"v\", $ntlm_length) .\n            pack(\"V\", $ntlm_offset) .\n            pack(\"v\", $domain_length) .\n            pack(\"v\", $domain_length) .\n            pack(\"V\", $domain_offset) .\n            pack(\"v\", $user_length) .\n            pack(\"v\", $user_length) .\n            pack(\"V\", $user_offset) .\n            pack(\"v\", $workstation_length) .\n            pack(\"v\", $workstation_length) .\n            pack(\"V\", $workstation_offset) .\n            pack(\"v\", $session_length) .\n            pack(\"v\", $session_length) .\n            pack(\"V\", $session_offset) .\n            \"\\x01\\x02\\x00\\x00\" .\n            $domain_unicode .\n            $user_unicode .\n            $workstation_unicode .\n            $lm .\n            $ntlm\n        );\n    }\n\n    public function start(&$client, &$message, &$interactions)\n    {\n        if ($this->state != SASL_NTLM_STATE_START) {\n            $client->error = \"NTLM authentication state is not at the start\";\n            return (SASL_FAIL);\n        }\n        $this->credentials = array(\n            \"user\" => \"\",\n            \"password\" => \"\",\n            \"realm\" => \"\",\n            \"workstation\" => \"\"\n        );\n        $defaults = array();\n        $status = $client->GetCredentials($this->credentials, $defaults, $interactions);\n        if ($status == SASL_CONTINUE) {\n            $this->state = SASL_NTLM_STATE_IDENTIFY_DOMAIN;\n        }\n        unset($message);\n        return ($status);\n    }\n\n    public function step(&$client, $response, &$message, &$interactions)\n    {\n        switch ($this->state) {\n            case SASL_NTLM_STATE_IDENTIFY_DOMAIN:\n                $message = $this->typeMsg1($this->credentials[\"realm\"], $this->credentials[\"workstation\"]);\n                $this->state = SASL_NTLM_STATE_RESPOND_CHALLENGE;\n                break;\n            case SASL_NTLM_STATE_RESPOND_CHALLENGE:\n                $ntlm_response = $this->NTLMResponse(substr($response, 24, 8), $this->credentials[\"password\"]);\n                $message = $this->typeMsg3(\n                    $ntlm_response,\n                    $this->credentials[\"user\"],\n                    $this->credentials[\"realm\"],\n                    $this->credentials[\"workstation\"]\n                );\n                $this->state = SASL_NTLM_STATE_DONE;\n                break;\n            case SASL_NTLM_STATE_DONE:\n                $client->error = \"NTLM authentication was finished without success\";\n                return (SASL_FAIL);\n            default:\n                $client->error = \"invalid NTLM authentication step state\";\n                return (SASL_FAIL);\n        }\n        return (SASL_CONTINUE);\n    }\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/get_oauth_token.php",
    "content": "<?php\n/**\n * Get an OAuth2 token from Google.\n * * Install this script on your server so that it's accessible\n * as [https/http]://<yourdomain>/<folder>/get_oauth_token.php\n * e.g.: http://localhost/phpmail/get_oauth_token.php\n * * Ensure dependencies are installed with 'composer install'\n * * Set up an app in your Google developer console\n * * Set the script address as the app's redirect URL\n * If no refresh token is obtained when running this file, revoke access to your app\n * using link: https://accounts.google.com/b/0/IssuedAuthSubTokens and run the script again.\n * This script requires PHP 5.4 or later\n * PHP Version 5.4\n */\n\nnamespace League\\OAuth2\\Client\\Provider;\n\nrequire 'vendor/autoload.php';\n\nuse League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nsession_start();\n\n//If this automatic URL doesn't work, set it yourself manually\n$redirectUri = isset($_SERVER['HTTPS']) ? 'https://' : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];\n//$redirectUri = 'http://localhost/phpmailer/get_oauth_token.php';\n\n//These details obtained are by setting up app in Google developer console.\n$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';\n$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';\n\nclass Google extends AbstractProvider\n{\n    use BearerAuthorizationTrait;\n\n    const ACCESS_TOKEN_RESOURCE_OWNER_ID = 'id';\n\n    /**\n     * @var string If set, this will be sent to google as the \"access_type\" parameter.\n     * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline\n     */\n    protected $accessType;\n\n    /**\n     * @var string If set, this will be sent to google as the \"hd\" parameter.\n     * @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param\n     */\n    protected $hostedDomain;\n\n    /**\n     * @var string If set, this will be sent to google as the \"scope\" parameter.\n     * @link https://developers.google.com/gmail/api/auth/scopes\n     */\n    protected $scope;\n\n    public function getBaseAuthorizationUrl()\n    {\n        return 'https://accounts.google.com/o/oauth2/auth';\n    }\n\n    public function getBaseAccessTokenUrl(array $params)\n    {\n        return 'https://accounts.google.com/o/oauth2/token';\n    }\n\n    public function getResourceOwnerDetailsUrl(AccessToken $token)\n    {\n\treturn ' ';\n    }\n\n    protected function getAuthorizationParameters(array $options)\n    {\n\tif (is_array($this->scope)) {\n            $separator = $this->getScopeSeparator();\n            $this->scope = implode($separator, $this->scope);\n        }\n\n        $params = array_merge(\n            parent::getAuthorizationParameters($options),\n            array_filter([\n                'hd'          => $this->hostedDomain,\n                'access_type' => $this->accessType,\n\t\t'scope'       => $this->scope,\n                // if the user is logged in with more than one account ask which one to use for the login!\n                'authuser'    => '-1'\n            ])\n        );\n        return $params;\n    }\n\n    protected function getDefaultScopes()\n    {\n        return [\n            'email',\n            'openid',\n            'profile',\n        ];\n    }\n\n    protected function getScopeSeparator()\n    {\n        return ' ';\n    }\n\n    protected function checkResponse(ResponseInterface $response, $data)\n    {\n        if (!empty($data['error'])) {\n            $code  = 0;\n            $error = $data['error'];\n\n            if (is_array($error)) {\n                $code  = $error['code'];\n                $error = $error['message'];\n            }\n\n            throw new IdentityProviderException($error, $code, $data);\n        }\n    }\n\n    protected function createResourceOwner(array $response, AccessToken $token)\n    {\n        return new GoogleUser($response);\n    }\n}\n\n\n//Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php\n$provider = new Google(\n    array(\n        'clientId' => $clientId,\n        'clientSecret' => $clientSecret,\n        'redirectUri' => $redirectUri,\n        'scope' => array('https://mail.google.com/'),\n\t'accessType' => 'offline'\n    )\n);\n\nif (!isset($_GET['code'])) {\n    // If we don't have an authorization code then get one\n    $authUrl = $provider->getAuthorizationUrl();\n    $_SESSION['oauth2state'] = $provider->getState();\n    header('Location: ' . $authUrl);\n    exit;\n// Check given state against previously stored one to mitigate CSRF attack\n} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n    unset($_SESSION['oauth2state']);\n    exit('Invalid state');\n} else {\n    // Try to get an access token (using the authorization code grant)\n    $token = $provider->getAccessToken(\n        'authorization_code',\n        array(\n            'code' => $_GET['code']\n        )\n    );\n\n    // Use this to get a new access token if the old one expires\n    echo 'Refresh Token: ' . $token->getRefreshToken();\n}\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-am.php",
    "content": "<?php\n/**\n * Armenian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Hrayr Grigoryan <hrayr@bits.am>\n */\n \n$PHPMAILER_LANG['authenticate']         = 'SMTP -ի սխալ: չհաջողվեց ստուգել իսկությունը.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP -ի սխալ: չհաջողվեց կապ հաստատել SMTP սերվերի հետ.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP -ի սխալ: տվյալները ընդունված չեն.';\n$PHPMAILER_LANG['empty_message']        = 'Հաղորդագրությունը դատարկ է';\n$PHPMAILER_LANG['encoding']             = 'Կոդավորման անհայտ տեսակ: ';\n$PHPMAILER_LANG['execute']              = 'Չհաջողվեց իրականացնել հրամանը: ';\n$PHPMAILER_LANG['file_access']          = 'Ֆայլը հասանելի չէ: ';\n$PHPMAILER_LANG['file_open']            = 'Ֆայլի սխալ: ֆայլը չհաջողվեց բացել: ';\n$PHPMAILER_LANG['from_failed']          = 'Ուղարկողի հետևյալ հասցեն սխալ է: ';\n$PHPMAILER_LANG['instantiate']          = 'Հնարավոր չէ կանչել mail ֆունկցիան.';\n$PHPMAILER_LANG['invalid_address']      = 'Հասցեն սխալ է: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' փոստային սերվերի հետ չի աշխատում.';\n$PHPMAILER_LANG['provide_address']      = 'Անհրաժեշտ է տրամադրել գոնե մեկ ստացողի e-mail հասցե.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP -ի սխալ: չի հաջողվել ուղարկել հետևյալ ստացողների հասցեներին: ';\n$PHPMAILER_LANG['signing']              = 'Ստորագրման սխալ: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP -ի connect() ֆունկցիան չի հաջողվել';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP սերվերի սխալ: ';\n$PHPMAILER_LANG['variable_set']         = 'Չի հաջողվում ստեղծել կամ վերափոխել փոփոխականը: ';\n$PHPMAILER_LANG['extension_missing']    = 'Հավելվածը բացակայում է: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ar.php",
    "content": "<?php\n/**\n * Arabic PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author bahjat al mostafa <bahjat983@hotmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'خطأ SMTP : لا يمكن تأكيد الهوية.';\n$PHPMAILER_LANG['connect_host']         = 'خطأ SMTP: لا يمكن الاتصال بالخادم SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'خطأ SMTP: لم يتم قبول المعلومات .';\n$PHPMAILER_LANG['empty_message']        = 'نص الرسالة فارغ';\n$PHPMAILER_LANG['encoding']             = 'ترميز غير معروف: ';\n$PHPMAILER_LANG['execute']              = 'لا يمكن تنفيذ : ';\n$PHPMAILER_LANG['file_access']          = 'لا يمكن الوصول للملف: ';\n$PHPMAILER_LANG['file_open']            = 'خطأ في الملف: لا يمكن فتحه: ';\n$PHPMAILER_LANG['from_failed']          = 'خطأ على مستوى عنوان المرسل : ';\n$PHPMAILER_LANG['instantiate']          = 'لا يمكن توفير خدمة البريد.';\n$PHPMAILER_LANG['invalid_address']      = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.';\n$PHPMAILER_LANG['provide_address']      = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.';\n$PHPMAILER_LANG['recipients_failed']    = 'خطأ SMTP: الأخطاء التالية ' .\n                                          'فشل في الارسال لكل من : ';\n$PHPMAILER_LANG['signing']              = 'خطأ في التوقيع: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() غير ممكن.';\n$PHPMAILER_LANG['smtp_error']           = 'خطأ على مستوى الخادم SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'لا يمكن تعيين أو إعادة تعيين متغير: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-az.php",
    "content": "<?php\n/**\n * Azerbaijani PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author @mirjalal\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP xətası: Giriş uğursuz oldu.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP xətası: SMTP serverinə qoşulma uğursuz oldu.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP xətası: Verilənlər qəbul edilməyib.';\n$PHPMAILER_LANG['empty_message']        = 'Boş mesaj göndərilə bilməz.';\n$PHPMAILER_LANG['encoding']             = 'Qeyri-müəyyən kodlaşdırma: ';\n$PHPMAILER_LANG['execute']              = 'Əmr yerinə yetirilmədi: ';\n$PHPMAILER_LANG['file_access']          = 'Fayla giriş yoxdur: ';\n$PHPMAILER_LANG['file_open']            = 'Fayl xətası: Fayl açıla bilmədi: ';\n$PHPMAILER_LANG['from_failed']          = 'Göstərilən poçtlara göndərmə uğursuz oldu: ';\n$PHPMAILER_LANG['instantiate']          = 'Mail funksiyası işə salına bilmədi.';\n$PHPMAILER_LANG['invalid_address']      = 'Düzgün olmayan e-mail adresi: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' - e-mail kitabxanası dəstəklənmir.';\n$PHPMAILER_LANG['provide_address']      = 'Ən azı bir e-mail adresi daxil edilməlidir.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP xətası: Aşağıdakı ünvanlar üzrə alıcılara göndərmə uğursuzdur: ';\n$PHPMAILER_LANG['signing']              = 'İmzalama xətası: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP serverinə qoşulma uğursuz oldu.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP serveri xətası: ';\n$PHPMAILER_LANG['variable_set']         = 'Dəyişənin quraşdırılması uğursuz oldu: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-be.php",
    "content": "<?php\n/**\n * Belarusian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Aleksander Maksymiuk <info@setpro.pl>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Памылка SMTP: памылка ідэнтыфікацыі.';\n$PHPMAILER_LANG['connect_host']         = 'Памылка SMTP: нельга ўстанавіць сувязь з SMTP-серверам.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Памылка SMTP: звесткі непрынятыя.';\n$PHPMAILER_LANG['empty_message']        = 'Пустое паведамленне.';\n$PHPMAILER_LANG['encoding']             = 'Невядомая кадыроўка тэксту: ';\n$PHPMAILER_LANG['execute']              = 'Нельга выканаць каманду: ';\n$PHPMAILER_LANG['file_access']          = 'Няма доступу да файла: ';\n$PHPMAILER_LANG['file_open']            = 'Нельга адкрыць файл: ';\n$PHPMAILER_LANG['from_failed']          = 'Няправільны адрас адпраўніка: ';\n$PHPMAILER_LANG['instantiate']          = 'Нельга прымяніць функцыю mail().';\n$PHPMAILER_LANG['invalid_address']      = 'Нельга даслаць паведамленне, няправільны email атрымальніка: ';\n$PHPMAILER_LANG['provide_address']      = 'Запоўніце, калі ласка, правільны email атрымальніка.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' - паштовы сервер не падтрымліваецца.';\n$PHPMAILER_LANG['recipients_failed']    = 'Памылка SMTP: няправільныя атрымальнікі: ';\n$PHPMAILER_LANG['signing']              = 'Памылка подпісу паведамлення: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Памылка сувязі з SMTP-серверам.';\n$PHPMAILER_LANG['smtp_error']           = 'Памылка SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Нельга ўстанавіць або перамяніць значэнне пераменнай: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-bg.php",
    "content": "<?php\n/**\n * Bulgarian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Mikhail Kyosev <mialygk@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP грешка: Не може да се удостовери пред сървъра.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP грешка: Не може да се свърже с SMTP хоста.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP грешка: данните не са приети.';\n$PHPMAILER_LANG['empty_message']        = 'Съдържанието на съобщението е празно';\n$PHPMAILER_LANG['encoding']             = 'Неизвестно кодиране: ';\n$PHPMAILER_LANG['execute']              = 'Не може да се изпълни: ';\n$PHPMAILER_LANG['file_access']          = 'Няма достъп до файл: ';\n$PHPMAILER_LANG['file_open']            = 'Файлова грешка: Не може да се отвори файл: ';\n$PHPMAILER_LANG['from_failed']          = 'Следните адреси за подател са невалидни: ';\n$PHPMAILER_LANG['instantiate']          = 'Не може да се инстанцира функцията mail.';\n$PHPMAILER_LANG['invalid_address']      = 'Невалиден адрес: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' - пощенски сървър не се поддържа.';\n$PHPMAILER_LANG['provide_address']      = 'Трябва да предоставите поне един email адрес за получател.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP грешка: Следните адреси за Получател са невалидни: ';\n$PHPMAILER_LANG['signing']              = 'Грешка при подписване: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP провален connect().';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP сървърна грешка: ';\n$PHPMAILER_LANG['variable_set']         = 'Не може да се установи или възстанови променлива: ';\n$PHPMAILER_LANG['extension_missing']    = 'Липсва разширение: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ca.php",
    "content": "<?php\n/**\n * Catalan PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Ivan <web AT microstudi DOT com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Error SMTP: No s’ha pogut autenticar.';\n$PHPMAILER_LANG['connect_host']         = 'Error SMTP: No es pot connectar al servidor SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Error SMTP: Dades no acceptades.';\n$PHPMAILER_LANG['empty_message']        = 'El cos del missatge està buit.';\n$PHPMAILER_LANG['encoding']             = 'Codificació desconeguda: ';\n$PHPMAILER_LANG['execute']              = 'No es pot executar: ';\n$PHPMAILER_LANG['file_access']          = 'No es pot accedir a l’arxiu: ';\n$PHPMAILER_LANG['file_open']            = 'Error d’Arxiu: No es pot obrir l’arxiu: ';\n$PHPMAILER_LANG['from_failed']          = 'La(s) següent(s) adreces de remitent han fallat: ';\n$PHPMAILER_LANG['instantiate']          = 'No s’ha pogut crear una instància de la funció Mail.';\n$PHPMAILER_LANG['invalid_address']      = 'Adreça d’email invalida: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no està suportat';\n$PHPMAILER_LANG['provide_address']      = 'S’ha de proveir almenys una adreça d’email com a destinatari.';\n$PHPMAILER_LANG['recipients_failed']    = 'Error SMTP: Els següents destinataris han fallat: ';\n$PHPMAILER_LANG['signing']              = 'Error al signar: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Ha fallat el SMTP Connect().';\n$PHPMAILER_LANG['smtp_error']           = 'Error del servidor SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'No s’ha pogut establir o restablir la variable: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ch.php",
    "content": "<?php\n/**\n * Chinese PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author LiuXin <http://www.80x86.cn/blog/>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP 错误：身份验证失败。';\n$PHPMAILER_LANG['connect_host']         = 'SMTP 错误: 不能连接SMTP主机。';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 错误: 数据不可接受。';\n//$PHPMAILER_LANG['empty_message']        = 'Message body empty';\n$PHPMAILER_LANG['encoding']             = '未知编码：';\n$PHPMAILER_LANG['execute']              = '不能执行: ';\n$PHPMAILER_LANG['file_access']          = '不能访问文件：';\n$PHPMAILER_LANG['file_open']            = '文件错误：不能打开文件：';\n$PHPMAILER_LANG['from_failed']          = '下面的发送地址邮件发送失败了： ';\n$PHPMAILER_LANG['instantiate']          = '不能实现mail方法。';\n//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' 您所选择的发送邮件的方法并不支持。';\n$PHPMAILER_LANG['provide_address']      = '您必须提供至少一个 收信人的email地址。';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP 错误： 下面的 收件人失败了： ';\n//$PHPMAILER_LANG['signing']              = 'Signing Error: ';\n//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';\n//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';\n//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-cs.php",
    "content": "<?php\n/**\n * Czech PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Chyba SMTP: Autentizace selhala.';\n$PHPMAILER_LANG['connect_host']         = 'Chyba SMTP: Nelze navázat spojení se SMTP serverem.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Chyba SMTP: Data nebyla přijata.';\n$PHPMAILER_LANG['empty_message']        = 'Prázdné tělo zprávy';\n$PHPMAILER_LANG['encoding']             = 'Neznámé kódování: ';\n$PHPMAILER_LANG['execute']              = 'Nelze provést: ';\n$PHPMAILER_LANG['file_access']          = 'Nelze získat přístup k souboru: ';\n$PHPMAILER_LANG['file_open']            = 'Chyba souboru: Nelze otevřít soubor pro čtení: ';\n$PHPMAILER_LANG['from_failed']          = 'Následující adresa odesílatele je nesprávná: ';\n$PHPMAILER_LANG['instantiate']          = 'Nelze vytvořit instanci emailové funkce.';\n$PHPMAILER_LANG['invalid_address']      = 'Neplatná adresa: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer není podporován.';\n$PHPMAILER_LANG['provide_address']      = 'Musíte zadat alespoň jednu emailovou adresu příjemce.';\n$PHPMAILER_LANG['recipients_failed']    = 'Chyba SMTP: Následující adresy příjemců nejsou správně: ';\n$PHPMAILER_LANG['signing']              = 'Chyba přihlašování: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() selhal.';\n$PHPMAILER_LANG['smtp_error']           = 'Chyba SMTP serveru: ';\n$PHPMAILER_LANG['variable_set']         = 'Nelze nastavit nebo změnit proměnnou: ';\n$PHPMAILER_LANG['extension_missing']    = 'Chybí rozšíření: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-da.php",
    "content": "<?php\n/**\n * Danish PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Mikael Stokkebro <info@stokkebro.dk>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP fejl: Kunne ikke logge på.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP fejl: Data kunne ikke accepteres.';\n//$PHPMAILER_LANG['empty_message']        = 'Message body empty';\n$PHPMAILER_LANG['encoding']             = 'Ukendt encode-format: ';\n$PHPMAILER_LANG['execute']              = 'Kunne ikke køre: ';\n$PHPMAILER_LANG['file_access']          = 'Ingen adgang til fil: ';\n$PHPMAILER_LANG['file_open']            = 'Fil fejl: Kunne ikke åbne filen: ';\n$PHPMAILER_LANG['from_failed']          = 'Følgende afsenderadresse er forkert: ';\n$PHPMAILER_LANG['instantiate']          = 'Kunne ikke initialisere email funktionen.';\n//$PHPMAILER_LANG['invalid_address']        = 'Invalid address: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.';\n$PHPMAILER_LANG['provide_address']      = 'Du skal indtaste mindst en modtagers emailadresse.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP fejl: Følgende modtagere er forkerte: ';\n//$PHPMAILER_LANG['signing']              = 'Signing Error: ';\n//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';\n//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';\n//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-de.php",
    "content": "<?php\n/**\n * German PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP-Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP-Fehler: Daten werden nicht akzeptiert.';\n$PHPMAILER_LANG['empty_message']        = 'E-Mail-Inhalt ist leer.';\n$PHPMAILER_LANG['encoding']             = 'Unbekannte Kodierung: ';\n$PHPMAILER_LANG['execute']              = 'Konnte folgenden Befehl nicht ausführen: ';\n$PHPMAILER_LANG['file_access']          = 'Zugriff auf folgende Datei fehlgeschlagen: ';\n$PHPMAILER_LANG['file_open']            = 'Dateifehler: Konnte folgende Datei nicht öffnen: ';\n$PHPMAILER_LANG['from_failed']          = 'Die folgende Absenderadresse ist nicht korrekt: ';\n$PHPMAILER_LANG['instantiate']          = 'Mail-Funktion konnte nicht initialisiert werden.';\n$PHPMAILER_LANG['invalid_address']      = 'Die Adresse ist ungültig: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';\n$PHPMAILER_LANG['provide_address']      = 'Bitte geben Sie mindestens eine Empfängeradresse an.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: ';\n$PHPMAILER_LANG['signing']              = 'Fehler beim Signieren: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Verbindung zum SMTP-Server fehlgeschlagen.';\n$PHPMAILER_LANG['smtp_error']           = 'Fehler vom SMTP-Server: ';\n$PHPMAILER_LANG['variable_set']         = 'Kann Variable nicht setzen oder zurücksetzen: ';\n$PHPMAILER_LANG['extension_missing']    = 'Fehlende Erweiterung: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-el.php",
    "content": "<?php\n/**\n * Greek PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Σφάλμα: Αδυναμία πιστοποίησης (authentication).';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Σφάλμα: Αδυναμία σύνδεσης στον SMTP-Host.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Σφάλμα: Τα δεδομένα δεν έγιναν αποδεκτά.';\n$PHPMAILER_LANG['empty_message']        = 'Το E-Mail δεν έχει περιεχόμενο .';\n$PHPMAILER_LANG['encoding']             = 'Αγνωστο Encoding-Format: ';\n$PHPMAILER_LANG['execute']              = 'Αδυναμία εκτέλεσης ακόλουθης εντολής: ';\n$PHPMAILER_LANG['file_access']          = 'Αδυναμία προσπέλασης του αρχείου: ';\n$PHPMAILER_LANG['file_open']            = 'Σφάλμα Αρχείου: Δεν είναι δυνατό το άνοιγμα του ακόλουθου αρχείου: ';\n$PHPMAILER_LANG['from_failed']          = 'Η παρακάτω διεύθυνση αποστολέα δεν είναι σωστή: ';\n$PHPMAILER_LANG['instantiate']          = 'Αδυναμία εκκίνησης Mail function.';\n$PHPMAILER_LANG['invalid_address']      = 'Το μήνυμα δεν εστάλη, η διεύθυνση δεν είναι έγκυρη: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.';\n$PHPMAILER_LANG['provide_address']      = 'Παρακαλούμε δώστε τουλάχιστον μια e-mail διεύθυνση παραλήπτη.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Σφάλμα: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';\n$PHPMAILER_LANG['signing']              = 'Σφάλμα υπογραφής: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Αποτυχία σύνδεσης στον SMTP Server.';\n$PHPMAILER_LANG['smtp_error']           = 'Σφάλμα από τον SMTP Server: ';\n$PHPMAILER_LANG['variable_set']         = 'Αδυναμία ορισμού ή αρχικοποίησης μεταβλητής: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-eo.php",
    "content": "<?php\n/**\n * Esperanto PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Eraro de servilo SMTP : aŭtentigo malsukcesis.';\n$PHPMAILER_LANG['connect_host']         = 'Eraro de servilo SMTP : konektado al servilo malsukcesis.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Eraro de servilo SMTP : neĝustaj datumoj.';\n$PHPMAILER_LANG['empty_message']        = 'Teksto de mesaĝo mankas.';\n$PHPMAILER_LANG['encoding']             = 'Nekonata kodoprezento: ';\n$PHPMAILER_LANG['execute']              = 'Lanĉi rulumadon ne eblis: ';\n$PHPMAILER_LANG['file_access']          = 'Aliro al dosiero ne sukcesis: ';\n$PHPMAILER_LANG['file_open']            = 'Eraro de dosiero: malfermo neeblas: ';\n$PHPMAILER_LANG['from_failed']          = 'Jena adreso de sendinto malsukcesis: ';\n$PHPMAILER_LANG['instantiate']          = 'Genero de retmesaĝa funkcio neeblis.';\n$PHPMAILER_LANG['invalid_address']      = 'Retadreso ne validas: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mesaĝilo ne subtenata.';\n$PHPMAILER_LANG['provide_address']      = 'Vi devas tajpi almenaŭ unu recevontan retadreson.';\n$PHPMAILER_LANG['recipients_failed']    = 'Eraro de servilo SMTP : la jenaj poŝtrecivuloj kaŭzis eraron: ';\n$PHPMAILER_LANG['signing']              = 'Eraro de subskribo: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP konektado malsukcesis.';\n$PHPMAILER_LANG['smtp_error']           = 'Eraro de servilo SMTP : ';\n$PHPMAILER_LANG['variable_set']         = 'Variablo ne pravalorizeblas aŭ ne repravalorizeblas: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-es.php",
    "content": "<?php\n/**\n * Spanish PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Matt Sturdy <matt.sturdy@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Error SMTP: Imposible autentificar.';\n$PHPMAILER_LANG['connect_host']         = 'Error SMTP: Imposible conectar al servidor SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Error SMTP: Datos no aceptados.';\n$PHPMAILER_LANG['empty_message']        = 'El cuerpo del mensaje está vacío';\n$PHPMAILER_LANG['encoding']             = 'Codificación desconocida: ';\n$PHPMAILER_LANG['execute']              = 'Imposible ejecutar: ';\n$PHPMAILER_LANG['file_access']          = 'Imposible acceder al archivo: ';\n$PHPMAILER_LANG['file_open']            = 'Error de Archivo: Imposible abrir el archivo: ';\n$PHPMAILER_LANG['from_failed']          = 'La(s) siguiente(s) direcciones de remitente fallaron: ';\n$PHPMAILER_LANG['instantiate']          = 'Imposible crear una instancia de la función Mail.';\n$PHPMAILER_LANG['invalid_address']      = 'Imposible enviar: dirección de email inválido: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.';\n$PHPMAILER_LANG['provide_address']      = 'Debe proporcionar al menos una dirección de email de destino.';\n$PHPMAILER_LANG['recipients_failed']    = 'Error SMTP: Los siguientes destinos fallaron: ';\n$PHPMAILER_LANG['signing']              = 'Error al firmar: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falló.';\n$PHPMAILER_LANG['smtp_error']           = 'Error del servidor SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'No se pudo configurar la variable: ';\n$PHPMAILER_LANG['extension_missing']    = 'Extensión faltante: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-et.php",
    "content": "<?php\n/**\n * Estonian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Indrek Päri\n * @author Elan Ruusamäe <glen@delfi.ee>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Viga: Autoriseerimise viga.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Viga: Ei õnnestunud luua ühendust SMTP serveriga.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Viga: Vigased andmed.';\n$PHPMAILER_LANG['empty_message']        = 'Tühi kirja sisu';\n$PHPMAILER_LANG[\"encoding\"]             = 'Tundmatu kodeering: ';\n$PHPMAILER_LANG['execute']              = 'Tegevus ebaõnnestus: ';\n$PHPMAILER_LANG['file_access']          = 'Pole piisavalt õiguseid järgneva faili avamiseks: ';\n$PHPMAILER_LANG['file_open']            = 'Faili Viga: Faili avamine ebaõnnestus: ';\n$PHPMAILER_LANG['from_failed']          = 'Järgnev saatja e-posti aadress on vigane: ';\n$PHPMAILER_LANG['instantiate']          = 'mail funktiooni käivitamine ebaõnnestus.';\n$PHPMAILER_LANG['invalid_address']      = 'Saatmine peatatud, e-posti address vigane: ';\n$PHPMAILER_LANG['provide_address']      = 'Te peate määrama vähemalt ühe saaja e-posti aadressi.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' maileri tugi puudub.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Viga: Järgnevate saajate e-posti aadressid on vigased: ';\n$PHPMAILER_LANG[\"signing\"]              = 'Viga allkirjastamisel: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() ebaõnnestus.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP serveri viga: ';\n$PHPMAILER_LANG['variable_set']         = 'Ei õnnestunud määrata või lähtestada muutujat: ';\n$PHPMAILER_LANG['extension_missing']    = 'Nõutud laiendus on puudu: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-fa.php",
    "content": "<?php\n/**\n * Persian/Farsi PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Ali Jazayeri <jaza.ali@gmail.com>\n * @author Mohammad Hossein Mojtahedi <mhm5000@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'خطای SMTP: احراز هویت با شکست مواجه شد.';\n$PHPMAILER_LANG['connect_host']         = 'خطای SMTP: اتصال به سرور SMTP برقرار نشد.';\n$PHPMAILER_LANG['data_not_accepted']    = 'خطای SMTP: داده‌ها نا‌درست هستند.';\n$PHPMAILER_LANG['empty_message']        = 'بخش متن پیام خالی است.';\n$PHPMAILER_LANG['encoding']             = 'کد‌گذاری نا‌شناخته: ';\n$PHPMAILER_LANG['execute']              = 'امکان اجرا وجود ندارد: ';\n$PHPMAILER_LANG['file_access']          = 'امکان دسترسی به فایل وجود ندارد: ';\n$PHPMAILER_LANG['file_open']            = 'خطای File: امکان بازکردن فایل وجود ندارد: ';\n$PHPMAILER_LANG['from_failed']          = 'آدرس فرستنده اشتباه است: ';\n$PHPMAILER_LANG['instantiate']          = 'امکان معرفی تابع ایمیل وجود ندارد.';\n$PHPMAILER_LANG['invalid_address']      = 'آدرس ایمیل معتبر نیست: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer پشتیبانی نمی‌شود.';\n$PHPMAILER_LANG['provide_address']      = 'باید حداقل یک آدرس گیرنده وارد کنید.';\n$PHPMAILER_LANG['recipients_failed']    = 'خطای SMTP: ارسال به آدرس گیرنده با خطا مواجه شد: ';\n$PHPMAILER_LANG['signing']              = 'خطا در امضا: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'خطا در اتصال به SMTP.';\n$PHPMAILER_LANG['smtp_error']           = 'خطا در SMTP Server: ';\n$PHPMAILER_LANG['variable_set']         = 'امکان ارسال یا ارسال مجدد متغیر‌ها وجود ندارد: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-fi.php",
    "content": "<?php\n/**\n * Finnish PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Jyry Kuukanen\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP-virhe: käyttäjätunnistus epäonnistui.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP-virhe: yhteys palvelimeen ei onnistu.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP-virhe: data on virheellinen.';\n//$PHPMAILER_LANG['empty_message']        = 'Message body empty';\n$PHPMAILER_LANG['encoding']             = 'Tuntematon koodaustyyppi: ';\n$PHPMAILER_LANG['execute']              = 'Suoritus epäonnistui: ';\n$PHPMAILER_LANG['file_access']          = 'Seuraavaan tiedostoon ei ole oikeuksia: ';\n$PHPMAILER_LANG['file_open']            = 'Tiedostovirhe: Ei voida avata tiedostoa: ';\n$PHPMAILER_LANG['from_failed']          = 'Seuraava lähettäjän osoite on virheellinen: ';\n$PHPMAILER_LANG['instantiate']          = 'mail-funktion luonti epäonnistui.';\n//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';\n$PHPMAILER_LANG['mailer_not_supported'] = 'postivälitintyyppiä ei tueta.';\n$PHPMAILER_LANG['provide_address']      = 'Aseta vähintään yksi vastaanottajan sähk&ouml;postiosoite.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP-virhe: seuraava vastaanottaja osoite on virheellinen.';\n$PHPMAILER_LANG['encoding']             = 'Tuntematon koodaustyyppi: ';\n//$PHPMAILER_LANG['signing']              = 'Signing Error: ';\n//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';\n//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';\n//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-fo.php",
    "content": "<?php\n/**\n * Faroese PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Dávur Sørensen <http://www.profo-webdesign.dk>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP feilur: Kundi ikki góðkenna.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP feilur: Data ikki góðkent.';\n//$PHPMAILER_LANG['empty_message']        = 'Message body empty';\n$PHPMAILER_LANG['encoding']             = 'Ókend encoding: ';\n$PHPMAILER_LANG['execute']              = 'Kundi ikki útføra: ';\n$PHPMAILER_LANG['file_access']          = 'Kundi ikki tilganga fílu: ';\n$PHPMAILER_LANG['file_open']            = 'Fílu feilur: Kundi ikki opna fílu: ';\n$PHPMAILER_LANG['from_failed']          = 'fylgjandi Frá/From adressa miseydnaðist: ';\n$PHPMAILER_LANG['instantiate']          = 'Kuni ikki instantiera mail funktión.';\n//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' er ikki supporterað.';\n$PHPMAILER_LANG['provide_address']      = 'Tú skal uppgeva minst móttakara-emailadressu(r).';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Feilur: Fylgjandi móttakarar miseydnaðust: ';\n//$PHPMAILER_LANG['signing']              = 'Signing Error: ';\n//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';\n//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';\n//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-fr.php",
    "content": "<?php\n/**\n * French PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * Some French punctuation requires a thin non-breaking space (U+202F) character before it,\n * for example before a colon or exclamation mark.\n * There is one of these characters between these quotes: \" \"\n * @link http://unicode.org/udhr/n/notes_fra.html\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Erreur SMTP : échec de l\\'authentification.';\n$PHPMAILER_LANG['connect_host']         = 'Erreur SMTP : impossible de se connecter au serveur SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Erreur SMTP : données incorrectes.';\n$PHPMAILER_LANG['empty_message']        = 'Corps du message vide.';\n$PHPMAILER_LANG['encoding']             = 'Encodage inconnu : ';\n$PHPMAILER_LANG['execute']              = 'Impossible de lancer l\\'exécution : ';\n$PHPMAILER_LANG['file_access']          = 'Impossible d\\'accéder au fichier : ';\n$PHPMAILER_LANG['file_open']            = 'Ouverture du fichier impossible : ';\n$PHPMAILER_LANG['from_failed']          = 'L\\'adresse d\\'expéditeur suivante a échoué : ';\n$PHPMAILER_LANG['instantiate']          = 'Impossible d\\'instancier la fonction mail.';\n$PHPMAILER_LANG['invalid_address']      = 'L\\'adresse courriel n\\'est pas valide : ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' client de messagerie non supporté.';\n$PHPMAILER_LANG['provide_address']      = 'Vous devez fournir au moins une adresse de destinataire.';\n$PHPMAILER_LANG['recipients_failed']    = 'Erreur SMTP : les destinataires suivants sont en erreur : ';\n$PHPMAILER_LANG['signing']              = 'Erreur de signature : ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Échec de la connexion SMTP.';\n$PHPMAILER_LANG['smtp_error']           = 'Erreur du serveur SMTP : ';\n$PHPMAILER_LANG['variable_set']         = 'Impossible d\\'initialiser ou de réinitialiser une variable : ';\n$PHPMAILER_LANG['extension_missing']    = 'Extension manquante : ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-gl.php",
    "content": "<?php\n/**\n * Galician PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author by Donato Rouco <donatorouco@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Erro SMTP: Non puido ser autentificado.';\n$PHPMAILER_LANG['connect_host']         = 'Erro SMTP: Non puido conectar co servidor SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Erro SMTP: Datos non aceptados.';\n$PHPMAILER_LANG['empty_message']        = 'Corpo da mensaxe vacía';\n$PHPMAILER_LANG['encoding']             = 'Codificación descoñecida: ';\n$PHPMAILER_LANG['execute']              = 'Non puido ser executado: ';\n$PHPMAILER_LANG['file_access']          = 'Nob puido acceder ó arquivo: ';\n$PHPMAILER_LANG['file_open']            = 'Erro de Arquivo: No puido abrir o arquivo: ';\n$PHPMAILER_LANG['from_failed']          = 'A(s) seguinte(s) dirección(s) de remitente(s) deron erro: ';\n$PHPMAILER_LANG['instantiate']          = 'Non puido crear unha instancia da función Mail.';\n$PHPMAILER_LANG['invalid_address']      = 'Non puido envia-lo correo: dirección de email inválida: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer non está soportado.';\n$PHPMAILER_LANG['provide_address']      = 'Debe engadir polo menos unha dirección de email coma destino.';\n$PHPMAILER_LANG['recipients_failed']    = 'Erro SMTP: Os seguintes destinos fallaron: ';\n$PHPMAILER_LANG['signing']              = 'Erro ó firmar: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() fallou.';\n$PHPMAILER_LANG['smtp_error']           = 'Erro do servidor SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Non puidemos axustar ou reaxustar a variábel: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-he.php",
    "content": "<?php\n/**\n * Hebrew PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Ronny Sherer <ronny@hoojima.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'שגיאת SMTP: פעולת האימות נכשלה.';\n$PHPMAILER_LANG['connect_host']         = 'שגיאת SMTP: לא הצלחתי להתחבר לשרת SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'שגיאת SMTP: מידע לא התקבל.';\n$PHPMAILER_LANG['empty_message']        = 'גוף ההודעה ריק';\n$PHPMAILER_LANG['invalid_address']      = 'כתובת שגויה: ';\n$PHPMAILER_LANG['encoding']             = 'קידוד לא מוכר: ';\n$PHPMAILER_LANG['execute']              = 'לא הצלחתי להפעיל את: ';\n$PHPMAILER_LANG['file_access']          = 'לא ניתן לגשת לקובץ: ';\n$PHPMAILER_LANG['file_open']            = 'שגיאת קובץ: לא ניתן לגשת לקובץ: ';\n$PHPMAILER_LANG['from_failed']          = 'כתובות הנמענים הבאות נכשלו: ';\n$PHPMAILER_LANG['instantiate']          = 'לא הצלחתי להפעיל את פונקציית המייל.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' אינה נתמכת.';\n$PHPMAILER_LANG['provide_address']      = 'חובה לספק לפחות כתובת אחת של מקבל המייל.';\n$PHPMAILER_LANG['recipients_failed']    = 'שגיאת SMTP: הנמענים הבאים נכשלו: ';\n$PHPMAILER_LANG['signing']              = 'שגיאת חתימה: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';\n$PHPMAILER_LANG['smtp_error']           = 'שגיאת שרת SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'לא ניתן לקבוע או לשנות את המשתנה: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-hr.php",
    "content": "<?php\n/**\n * Croatian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Hrvoj3e <hrvoj3e@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Greška: Neuspjela autentikacija.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Greška: Ne mogu se spojiti na SMTP poslužitelj.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Greška: Podatci nisu prihvaćeni.';\n$PHPMAILER_LANG['empty_message']        = 'Sadržaj poruke je prazan.';\n$PHPMAILER_LANG['encoding']             = 'Nepoznati encoding: ';\n$PHPMAILER_LANG['execute']              = 'Nije moguće izvršiti naredbu: ';\n$PHPMAILER_LANG['file_access']          = 'Nije moguće pristupiti datoteci: ';\n$PHPMAILER_LANG['file_open']            = 'Nije moguće otvoriti datoteku: ';\n$PHPMAILER_LANG['from_failed']          = 'SMTP Greška: Slanje s navedenih e-mail adresa nije uspjelo: ';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Greška: Slanje na navedenih e-mail adresa nije uspjelo: ';\n$PHPMAILER_LANG['instantiate']          = 'Ne mogu pokrenuti mail funkcionalnost.';\n$PHPMAILER_LANG['invalid_address']      = 'E-mail nije poslan. Neispravna e-mail adresa: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.';\n$PHPMAILER_LANG['provide_address']      = 'Definirajte barem jednu adresu primatelja.';\n$PHPMAILER_LANG['signing']              = 'Greška prilikom prijave: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Spajanje na SMTP poslužitelj nije uspjelo.';\n$PHPMAILER_LANG['smtp_error']           = 'Greška SMTP poslužitelja: ';\n$PHPMAILER_LANG['variable_set']         = 'Ne mogu postaviti varijablu niti ju vratiti nazad: ';\n$PHPMAILER_LANG['extension_missing']    = 'Nedostaje proširenje: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-hu.php",
    "content": "<?php\n/**\n * Hungarian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author @dominicus-75\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP hiba: az azonosítás sikertelen.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP hiba: nem lehet kapcsolódni az SMTP-szerverhez.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP hiba: adatok visszautasítva.';\n$PHPMAILER_LANG['empty_message']        = 'Üres az üzenettörzs.';\n$PHPMAILER_LANG['encoding']             = 'Ismeretlen kódolás: ';\n$PHPMAILER_LANG['execute']              = 'Nem lehet végrehajtani: ';\n$PHPMAILER_LANG['file_access']          = 'A következő fájl nem elérhető: ';\n$PHPMAILER_LANG['file_open']            = 'Fájl hiba: a következő fájlt nem lehet megnyitni: ';\n$PHPMAILER_LANG['from_failed']          = 'A feladóként megadott következő cím hibás: ';\n$PHPMAILER_LANG['instantiate']          = 'A PHP mail() függvényt nem sikerült végrehajtani.';\n$PHPMAILER_LANG['invalid_address']      = 'Érvénytelen cím: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' a mailer-osztály nem támogatott.';\n$PHPMAILER_LANG['provide_address']      = 'Legalább egy címzettet fel kell tüntetni.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP hiba: a címzettként megadott következő címek hibásak: ';\n$PHPMAILER_LANG['signing']              = 'Hibás aláírás: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Hiba az SMTP-kapcsolatban.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP-szerver hiba: ';\n$PHPMAILER_LANG['variable_set']         = 'A következő változók beállítása nem sikerült: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-id.php",
    "content": "<?php\n/**\n * Indonesian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Cecep Prawiro <cecep.prawiro@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Kesalahan SMTP: Tidak dapat mengautentikasi.';\n$PHPMAILER_LANG['connect_host']         = 'Kesalahan SMTP: Tidak dapat terhubung ke host SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Kesalahan SMTP: Data tidak diterima peladen.';\n$PHPMAILER_LANG['empty_message']        = 'Isi pesan kosong';\n$PHPMAILER_LANG['encoding']             = 'Pengkodean karakter tidak dikenali: ';\n$PHPMAILER_LANG['execute']              = 'Tidak dapat menjalankan proses : ';\n$PHPMAILER_LANG['file_access']          = 'Tidak dapat mengakses berkas : ';\n$PHPMAILER_LANG['file_open']            = 'Kesalahan File: Berkas tidak bisa dibuka : ';\n$PHPMAILER_LANG['from_failed']          = 'Alamat pengirim berikut mengakibatkan error : ';\n$PHPMAILER_LANG['instantiate']          = 'Tidak dapat menginisialisasi fungsi email';\n$PHPMAILER_LANG['invalid_address']      = 'Gagal terkirim, alamat email tidak valid : ';\n$PHPMAILER_LANG['provide_address']      = 'Harus disediakan minimal satu alamat tujuan';\n$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer tidak didukung';\n$PHPMAILER_LANG['recipients_failed']    = 'Kesalahan SMTP: Alamat tujuan berikut menghasilkan error : ';\n$PHPMAILER_LANG['signing']              = 'Kesalahan dalam tanda tangan : ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() gagal.';\n$PHPMAILER_LANG['smtp_error']           = 'Kesalahan peladen SMTP : ';\n$PHPMAILER_LANG['variable_set']         = 'Tidak berhasil mengatur atau mengatur ulang variable : ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-it.php",
    "content": "<?php\n/**\n * Italian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Ilias Bartolini <brain79@inwind.it>\n * @author Stefano Sabatini <sabas88@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Error: Impossibile autenticarsi.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Error: Impossibile connettersi all\\'host SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Error: Dati non accettati dal server.';\n$PHPMAILER_LANG['empty_message']        = 'Il corpo del messaggio è vuoto';\n$PHPMAILER_LANG['encoding']             = 'Codifica dei caratteri sconosciuta: ';\n$PHPMAILER_LANG['execute']              = 'Impossibile eseguire l\\'operazione: ';\n$PHPMAILER_LANG['file_access']          = 'Impossibile accedere al file: ';\n$PHPMAILER_LANG['file_open']            = 'File Error: Impossibile aprire il file: ';\n$PHPMAILER_LANG['from_failed']          = 'I seguenti indirizzi mittenti hanno generato errore: ';\n$PHPMAILER_LANG['instantiate']          = 'Impossibile istanziare la funzione mail';\n$PHPMAILER_LANG['invalid_address']      = 'Impossibile inviare, l\\'indirizzo email non è valido: ';\n$PHPMAILER_LANG['provide_address']      = 'Deve essere fornito almeno un indirizzo ricevente';\n$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: ';\n$PHPMAILER_LANG['signing']              = 'Errore nella firma: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() fallita.';\n$PHPMAILER_LANG['smtp_error']           = 'Errore del server SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Impossibile impostare o resettare la variabile: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ja.php",
    "content": "<?php\n/**\n * Japanese PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Mitsuhiro Yoshida <http://mitstek.com/>\n * @author Yoshi Sakai <http://bluemooninc.jp/>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTPエラー: 認証できませんでした。';\n$PHPMAILER_LANG['connect_host']         = 'SMTPエラー: SMTPホストに接続できませんでした。';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTPエラー: データが受け付けられませんでした。';\n//$PHPMAILER_LANG['empty_message']        = 'Message body empty';\n$PHPMAILER_LANG['encoding']             = '不明なエンコーディング: ';\n$PHPMAILER_LANG['execute']              = '実行できませんでした: ';\n$PHPMAILER_LANG['file_access']          = 'ファイルにアクセスできません: ';\n$PHPMAILER_LANG['file_open']            = 'ファイルエラー: ファイルを開けません: ';\n$PHPMAILER_LANG['from_failed']          = 'Fromアドレスを登録する際にエラーが発生しました: ';\n$PHPMAILER_LANG['instantiate']          = 'メール関数が正常に動作しませんでした。';\n//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';\n$PHPMAILER_LANG['provide_address']      = '少なくとも1つメールアドレスを 指定する必要があります。';\n$PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: ';\n//$PHPMAILER_LANG['signing']              = 'Signing Error: ';\n//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';\n//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';\n//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ka.php",
    "content": "<?php\n/**\n * Georgian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP შეცდომა: ავტორიზაცია შეუძლებელია.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP შეცდომა: SMTP სერვერთან დაკავშირება შეუძლებელია.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP შეცდომა: მონაცემები არ იქნა მიღებული.';\n$PHPMAILER_LANG['encoding']             = 'კოდირების უცნობი ტიპი: ';\n$PHPMAILER_LANG['execute']              = 'შეუძლებელია შემდეგი ბრძანების შესრულება: ';\n$PHPMAILER_LANG['file_access']          = 'შეუძლებელია წვდომა ფაილთან: ';\n$PHPMAILER_LANG['file_open']            = 'ფაილური სისტემის შეცდომა: არ იხსნება ფაილი: ';\n$PHPMAILER_LANG['from_failed']          = 'გამგზავნის არასწორი მისამართი: ';\n$PHPMAILER_LANG['instantiate']          = 'mail ფუნქციის გაშვება ვერ ხერხდება.';\n$PHPMAILER_LANG['provide_address']      = 'გთხოვთ მიუთითოთ ერთი ადრესატის e-mail მისამართი მაინც.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' - საფოსტო სერვერის მხარდაჭერა არ არის.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP შეცდომა: შემდეგ მისამართებზე გაგზავნა ვერ მოხერხდა: ';\n$PHPMAILER_LANG['empty_message']        = 'შეტყობინება ცარიელია';\n$PHPMAILER_LANG['invalid_address']      = 'არ გაიგზავნა, e-mail მისამართის არასწორი ფორმატი: ';\n$PHPMAILER_LANG['signing']              = 'ხელმოწერის შეცდომა: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'შეცდომა SMTP სერვერთან დაკავშირებისას';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP სერვერის შეცდომა: ';\n$PHPMAILER_LANG['variable_set']         = 'შეუძლებელია შემდეგი ცვლადის შექმნა ან შეცვლა: ';\n$PHPMAILER_LANG['extension_missing']    = 'ბიბლიოთეკა არ არსებობს: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ko.php",
    "content": "<?php\n/**\n * Korean PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author ChalkPE <amato0617@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP 오류: 인증할 수 없습니다.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP 오류: SMTP 호스트에 접속할 수 없습니다.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 오류: 데이터가 받아들여지지 않았습니다.';\n$PHPMAILER_LANG['empty_message']        = '메세지 내용이 없습니다';\n$PHPMAILER_LANG['encoding']             = '알 수 없는 인코딩: ';\n$PHPMAILER_LANG['execute']              = '실행 불가: ';\n$PHPMAILER_LANG['file_access']          = '파일 접근 불가: ';\n$PHPMAILER_LANG['file_open']            = '파일 오류: 파일을 열 수 없습니다: ';\n$PHPMAILER_LANG['from_failed']          = '다음 From 주소에서 오류가 발생했습니다: ';\n$PHPMAILER_LANG['instantiate']          = 'mail 함수를 인스턴스화할 수 없습니다';\n$PHPMAILER_LANG['invalid_address']      = '잘못된 주소: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' 메일러는 지원되지 않습니다.';\n$PHPMAILER_LANG['provide_address']      = '적어도 한 개 이상의 수신자 메일 주소를 제공해야 합니다.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP 오류: 다음 수신자에서 오류가 발생했습니다: ';\n$PHPMAILER_LANG['signing']              = '서명 오류: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP 연결을 실패하였습니다.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP 서버 오류: ';\n$PHPMAILER_LANG['variable_set']         = '변수 설정 및 초기화 불가: ';\n$PHPMAILER_LANG['extension_missing']    = '확장자 없음: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-lt.php",
    "content": "<?php\n/**\n * Lithuanian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Dainius Kaupaitis <dk@sum.lt>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP klaida: autentifikacija nepavyko.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP klaida: nepavyksta prisijungti prie SMTP stoties.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP klaida: duomenys nepriimti.';\n$PHPMAILER_LANG['empty_message']        = 'Laiško turinys tuščias';\n$PHPMAILER_LANG['encoding']             = 'Neatpažinta koduotė: ';\n$PHPMAILER_LANG['execute']              = 'Nepavyko įvykdyti komandos: ';\n$PHPMAILER_LANG['file_access']          = 'Byla nepasiekiama: ';\n$PHPMAILER_LANG['file_open']            = 'Bylos klaida: Nepavyksta atidaryti: ';\n$PHPMAILER_LANG['from_failed']          = 'Neteisingas siuntėjo adresas: ';\n$PHPMAILER_LANG['instantiate']          = 'Nepavyko paleisti mail funkcijos.';\n$PHPMAILER_LANG['invalid_address']      = 'Neteisingas adresas: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' pašto stotis nepalaikoma.';\n$PHPMAILER_LANG['provide_address']      = 'Nurodykite bent vieną gavėjo adresą.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP klaida: nepavyko išsiųsti šiems gavėjams: ';\n$PHPMAILER_LANG['signing']              = 'Prisijungimo klaida: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP susijungimo klaida';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP stoties klaida: ';\n$PHPMAILER_LANG['variable_set']         = 'Nepavyko priskirti reikšmės kintamajam: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-lv.php",
    "content": "<?php\n/**\n * Latvian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Eduards M. <e@npd.lv>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP kļūda: Autorizācija neizdevās.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Kļūda: Nevar izveidot savienojumu ar SMTP serveri.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Kļūda: Nepieņem informāciju.';\n$PHPMAILER_LANG['empty_message']        = 'Ziņojuma teksts ir tukšs';\n$PHPMAILER_LANG['encoding']             = 'Neatpazīts kodējums: ';\n$PHPMAILER_LANG['execute']              = 'Neizdevās izpildīt komandu: ';\n$PHPMAILER_LANG['file_access']          = 'Fails nav pieejams: ';\n$PHPMAILER_LANG['file_open']            = 'Faila kļūda: Nevar atvērt failu: ';\n$PHPMAILER_LANG['from_failed']          = 'Nepareiza sūtītāja adrese: ';\n$PHPMAILER_LANG['instantiate']          = 'Nevar palaist sūtīšanas funkciju.';\n$PHPMAILER_LANG['invalid_address']      = 'Nepareiza adrese: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' sūtītājs netiek atbalstīts.';\n$PHPMAILER_LANG['provide_address']      = 'Lūdzu, norādiet vismaz vienu adresātu.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP kļūda: neizdevās nosūtīt šādiem saņēmējiem: ';\n$PHPMAILER_LANG['signing']              = 'Autorizācijas kļūda: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP savienojuma kļūda';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP servera kļūda: ';\n$PHPMAILER_LANG['variable_set']         = 'Nevar piešķirt mainīgā vērtību: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ms.php",
    "content": "<?php\n/**\n * Malaysian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Nawawi Jamili <nawawi@rutweb.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Ralat SMTP: Tidak dapat pengesahan.';\n$PHPMAILER_LANG['connect_host']         = 'Ralat SMTP: Tidak dapat menghubungi hos pelayan SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Ralat SMTP: Data tidak diterima oleh pelayan.';\n$PHPMAILER_LANG['empty_message']        = 'Tiada isi untuk mesej';\n$PHPMAILER_LANG['encoding']             = 'Pengekodan tidak diketahui: ';\n$PHPMAILER_LANG['execute']              = 'Tidak dapat melaksanakan: ';\n$PHPMAILER_LANG['file_access']          = 'Tidak dapat mengakses fail: ';\n$PHPMAILER_LANG['file_open']            = 'Ralat Fail: Tidak dapat membuka fail: ';\n$PHPMAILER_LANG['from_failed']          = 'Berikut merupakan ralat dari alamat e-mel: ';\n$PHPMAILER_LANG['instantiate']          = 'Tidak dapat memberi contoh fungsi e-mel.';\n$PHPMAILER_LANG['invalid_address']      = 'Alamat emel tidak sah: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' jenis penghantar emel tidak disokong.';\n$PHPMAILER_LANG['provide_address']      = 'Anda perlu menyediakan sekurang-kurangnya satu alamat e-mel penerima.';\n$PHPMAILER_LANG['recipients_failed']    = 'Ralat SMTP: Penerima e-mel berikut telah gagal: ';\n$PHPMAILER_LANG['signing']              = 'Ralat pada tanda tangan: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() telah gagal.';\n$PHPMAILER_LANG['smtp_error']           = 'Ralat pada pelayan SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Tidak boleh menetapkan atau menetapkan semula pembolehubah: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-nb.php",
    "content": "<?php\n/**\n * Norwegian Bokmål PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Feil: Kunne ikke autentisere.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Feil: Kunne ikke koble til SMTP tjener.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Feil: Datainnhold ikke akseptert.';\n$PHPMAILER_LANG['empty_message']        = 'Melding kropp tomt';\n$PHPMAILER_LANG['encoding']             = 'Ukjent koding: ';\n$PHPMAILER_LANG['execute']              = 'Kunne ikke utføre: ';\n$PHPMAILER_LANG['file_access']          = 'Får ikke tilgang til filen: ';\n$PHPMAILER_LANG['file_open']            = 'Fil Feil: Kunne ikke åpne filen: ';\n$PHPMAILER_LANG['from_failed']          = 'Følgende Frå adresse feilet: ';\n$PHPMAILER_LANG['instantiate']          = 'Kunne ikke initialisere post funksjon.';\n$PHPMAILER_LANG['invalid_address']      = 'Ugyldig adresse: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' sender er ikke støttet.';\n$PHPMAILER_LANG['provide_address']      = 'Du må opppgi minst en mottakeradresse.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Feil: Følgende mottakeradresse feilet: ';\n$PHPMAILER_LANG['signing']              = 'Signering Feil: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP connect() feilet.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP server feil: ';\n$PHPMAILER_LANG['variable_set']         = 'Kan ikke skrive eller omskrive variabel: ';\n$PHPMAILER_LANG['extension_missing']    = 'Utvidelse mangler: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-nl.php",
    "content": "<?php\n/**\n * Dutch PHPMailer language file: refer to class.phpmailer.php for definitive list.\n * @package PHPMailer\n * @author Tuxion <team@tuxion.nl>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP-fout: authenticatie mislukt.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP-fout: kon niet verbinden met SMTP-host.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP-fout: data niet geaccepteerd.';\n$PHPMAILER_LANG['empty_message']        = 'Berichttekst is leeg';\n$PHPMAILER_LANG['encoding']             = 'Onbekende codering: ';\n$PHPMAILER_LANG['execute']              = 'Kon niet uitvoeren: ';\n$PHPMAILER_LANG['file_access']          = 'Kreeg geen toegang tot bestand: ';\n$PHPMAILER_LANG['file_open']            = 'Bestandsfout: kon bestand niet openen: ';\n$PHPMAILER_LANG['from_failed']          = 'Het volgende afzendersadres is mislukt: ';\n$PHPMAILER_LANG['instantiate']          = 'Kon mailfunctie niet initialiseren.';\n$PHPMAILER_LANG['invalid_address']      = 'Ongeldig adres: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wordt niet ondersteund.';\n$PHPMAILER_LANG['provide_address']      = 'Er moet minstens één ontvanger worden opgegeven.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP-fout: de volgende ontvangers zijn mislukt: ';\n$PHPMAILER_LANG['signing']              = 'Signeerfout: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Verbinding mislukt.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP-serverfout: ';\n$PHPMAILER_LANG['variable_set']         = 'Kan de volgende variabele niet instellen of resetten: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-pl.php",
    "content": "<?php\n/**\n * Polish PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Błąd SMTP: Nie można przeprowadzić uwierzytelnienia.';\n$PHPMAILER_LANG['connect_host']         = 'Błąd SMTP: Nie można połączyć się z wybranym hostem.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Błąd SMTP: Dane nie zostały przyjęte.';\n$PHPMAILER_LANG['empty_message']        = 'Wiadomość jest pusta.';\n$PHPMAILER_LANG['encoding']             = 'Nieznany sposób kodowania znaków: ';\n$PHPMAILER_LANG['execute']              = 'Nie można uruchomić: ';\n$PHPMAILER_LANG['file_access']          = 'Brak dostępu do pliku: ';\n$PHPMAILER_LANG['file_open']            = 'Nie można otworzyć pliku: ';\n$PHPMAILER_LANG['from_failed']          = 'Następujący adres Nadawcy jest nieprawidłowy: ';\n$PHPMAILER_LANG['instantiate']          = 'Nie można wywołać funkcji mail(). Sprawdź konfigurację serwera.';\n$PHPMAILER_LANG['invalid_address']      = 'Nie można wysłać wiadomości, '.\n    'następujący adres Odbiorcy jest nieprawidłowy: ';\n$PHPMAILER_LANG['provide_address']      = 'Należy podać prawidłowy adres email Odbiorcy.';\n$PHPMAILER_LANG['mailer_not_supported'] = 'Wybrana metoda wysyłki wiadomości nie jest obsługiwana.';\n$PHPMAILER_LANG['recipients_failed']    = 'Błąd SMTP: Następujący odbiorcy są nieprawidłowi: ';\n$PHPMAILER_LANG['signing']              = 'Błąd podpisywania wiadomości: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() zakończone niepowodzeniem.';\n$PHPMAILER_LANG['smtp_error']           = 'Błąd SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Nie można ustawić lub zmodyfikować zmiennej: ';\n$PHPMAILER_LANG['extension_missing']    = 'Brakujące rozszerzenie: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-pt.php",
    "content": "<?php\n/**\n * Portuguese (European) PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Jonadabe <jonadabe@hotmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Erro do SMTP: Não foi possível realizar a autenticação.';\n$PHPMAILER_LANG['connect_host']         = 'Erro do SMTP: Não foi possível realizar ligação com o servidor SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Erro do SMTP: Os dados foram rejeitados.';\n$PHPMAILER_LANG['empty_message']        = 'A mensagem no e-mail está vazia.';\n$PHPMAILER_LANG['encoding']             = 'Codificação desconhecida: ';\n$PHPMAILER_LANG['execute']              = 'Não foi possível executar: ';\n$PHPMAILER_LANG['file_access']          = 'Não foi possível aceder o ficheiro: ';\n$PHPMAILER_LANG['file_open']            = 'Abertura do ficheiro: Não foi possível abrir o ficheiro: ';\n$PHPMAILER_LANG['from_failed']          = 'Ocorreram falhas nos endereços dos seguintes remententes: ';\n$PHPMAILER_LANG['instantiate']          = 'Não foi possível iniciar uma instância da função mail.';\n$PHPMAILER_LANG['invalid_address']      = 'Não foi enviado nenhum e-mail para o endereço de e-mail inválido: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';\n$PHPMAILER_LANG['provide_address']      = 'Tem de fornecer pelo menos um endereço como destinatário do e-mail.';\n$PHPMAILER_LANG['recipients_failed']    = 'Erro do SMTP: O endereço do seguinte destinatário falhou: ';\n$PHPMAILER_LANG['signing']              = 'Erro ao assinar: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falhou.';\n$PHPMAILER_LANG['smtp_error']           = 'Erro de servidor SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Não foi possível definir ou redefinir a variável: ';\n$PHPMAILER_LANG['extension_missing']    = 'Extensão em falta: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-pt_br.php",
    "content": "<?php\n/**\n * Brazilian Portuguese PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Paulo Henrique Garcia <paulo@controllerweb.com.br>\n * @author Lucas Guimarães <lucas@lucasguimaraes.com>\n * @author Phelipe Alves <phelipealvesdesouza@gmail.com>\n * @author Fabio Beneditto <fabiobeneditto@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Erro de SMTP: Não foi possível autenticar.';\n$PHPMAILER_LANG['connect_host']         = 'Erro de SMTP: Não foi possível conectar ao servidor SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Erro de SMTP: Dados rejeitados.';\n$PHPMAILER_LANG['empty_message']        = 'Mensagem vazia';\n$PHPMAILER_LANG['encoding']             = 'Codificação desconhecida: ';\n$PHPMAILER_LANG['execute']              = 'Não foi possível executar: ';\n$PHPMAILER_LANG['file_access']          = 'Não foi possível acessar o arquivo: ';\n$PHPMAILER_LANG['file_open']            = 'Erro de Arquivo: Não foi possível abrir o arquivo: ';\n$PHPMAILER_LANG['from_failed']          = 'Os seguintes remetentes falharam: ';\n$PHPMAILER_LANG['instantiate']          = 'Não foi possível instanciar a função mail.';\n$PHPMAILER_LANG['invalid_address']      = 'Endereço de e-mail inválido: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';\n$PHPMAILER_LANG['provide_address']      = 'Você deve informar pelo menos um destinatário.';\n$PHPMAILER_LANG['recipients_failed']    = 'Erro de SMTP: Os seguintes destinatários falharam: ';\n$PHPMAILER_LANG['signing']              = 'Erro de Assinatura: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falhou.';\n$PHPMAILER_LANG['smtp_error']           = 'Erro de servidor SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Não foi possível definir ou redefinir a variável: ';\n$PHPMAILER_LANG['extension_missing']    = 'Extensão ausente: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ro.php",
    "content": "<?php\n/**\n * Romanian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Alex Florea <alecz.fia@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Eroare SMTP: Autentificarea a eșuat.';\n$PHPMAILER_LANG['connect_host']         = 'Eroare SMTP: Conectarea la serverul SMTP a eșuat.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Eroare SMTP: Datele nu au fost acceptate.';\n$PHPMAILER_LANG['empty_message']        = 'Mesajul este gol.';\n$PHPMAILER_LANG['encoding']             = 'Encodare necunoscută: ';\n$PHPMAILER_LANG['execute']              = 'Nu se poate executa următoarea comandă:  ';\n$PHPMAILER_LANG['file_access']          = 'Nu se poate accesa următorul fișier: ';\n$PHPMAILER_LANG['file_open']            = 'Eroare fișier: Nu se poate deschide următorul fișier: ';\n$PHPMAILER_LANG['from_failed']          = 'Următoarele adrese From au dat eroare: ';\n$PHPMAILER_LANG['instantiate']          = 'Funcția mail nu a putut fi inițializată.';\n$PHPMAILER_LANG['invalid_address']      = 'Adresa de email nu este validă: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.';\n$PHPMAILER_LANG['provide_address']      = 'Trebuie să adăugați cel puțin o adresă de email.';\n$PHPMAILER_LANG['recipients_failed']    = 'Eroare SMTP: Următoarele adrese de email au eșuat: ';\n$PHPMAILER_LANG['signing']              = 'A aparut o problemă la semnarea emailului. ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Conectarea la serverul SMTP a eșuat.';\n$PHPMAILER_LANG['smtp_error']           = 'Eroare server SMTP: ';\n$PHPMAILER_LANG['variable_set']         = 'Nu se poate seta/reseta variabila. ';\n$PHPMAILER_LANG['extension_missing']    = 'Lipsește extensia: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-rs.php",
    "content": "<?php\n/**\n * Serbian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Александар Јевремовић <ajevremovic@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP грешка: аутентификација није успела.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP грешка: није могуће повезивање са SMTP сервером.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP грешка: подаци нису прихваћени.';\n$PHPMAILER_LANG['empty_message']        = 'Садржај поруке је празан.';\n$PHPMAILER_LANG['encoding']             = 'Непознато кодовање: ';\n$PHPMAILER_LANG['execute']              = 'Није могуће извршити наредбу: ';\n$PHPMAILER_LANG['file_access']          = 'Није могуће приступити датотеци: ';\n$PHPMAILER_LANG['file_open']            = 'Није могуће отворити датотеку: ';\n$PHPMAILER_LANG['from_failed']          = 'SMTP грешка: слање са следећих адреса није успело: ';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP грешка: слање на следеће адресе није успело: ';\n$PHPMAILER_LANG['instantiate']          = 'Није могуће покренути mail функцију.';\n$PHPMAILER_LANG['invalid_address']      = 'Порука није послата због неисправне адресе: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' мејлер није подржан.';\n$PHPMAILER_LANG['provide_address']      = 'Потребно је задати најмање једну адресу.';\n$PHPMAILER_LANG['signing']              = 'Грешка приликом пријављивања: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Повезивање са SMTP сервером није успело.';\n$PHPMAILER_LANG['smtp_error']           = 'Грешка SMTP сервера: ';\n$PHPMAILER_LANG['variable_set']         = 'Није могуће задати променљиву, нити је вратити уназад: ';\n$PHPMAILER_LANG['extension_missing']    = 'Недостаје проширење: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-ru.php",
    "content": "<?php\n/**\n * Russian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Alexey Chumakov <alex@chumakov.ru>\n * @author Foster Snowhill <i18n@forstwoof.ru>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Ошибка SMTP: ошибка авторизации.';\n$PHPMAILER_LANG['connect_host']         = 'Ошибка SMTP: не удается подключиться к серверу SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Ошибка SMTP: данные не приняты.';\n$PHPMAILER_LANG['encoding']             = 'Неизвестный вид кодировки: ';\n$PHPMAILER_LANG['execute']              = 'Невозможно выполнить команду: ';\n$PHPMAILER_LANG['file_access']          = 'Нет доступа к файлу: ';\n$PHPMAILER_LANG['file_open']            = 'Файловая ошибка: не удается открыть файл: ';\n$PHPMAILER_LANG['from_failed']          = 'Неверный адрес отправителя: ';\n$PHPMAILER_LANG['instantiate']          = 'Невозможно запустить функцию mail.';\n$PHPMAILER_LANG['provide_address']      = 'Пожалуйста, введите хотя бы один адрес e-mail получателя.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.';\n$PHPMAILER_LANG['recipients_failed']    = 'Ошибка SMTP: отправка по следующим адресам получателей не удалась: ';\n$PHPMAILER_LANG['empty_message']        = 'Пустое сообщение';\n$PHPMAILER_LANG['invalid_address']      = 'Не отослано, неправильный формат email адреса: ';\n$PHPMAILER_LANG['signing']              = 'Ошибка подписи: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Ошибка соединения с SMTP-сервером';\n$PHPMAILER_LANG['smtp_error']           = 'Ошибка SMTP-сервера: ';\n$PHPMAILER_LANG['variable_set']         = 'Невозможно установить или переустановить переменную: ';\n$PHPMAILER_LANG['extension_missing']    = 'Расширение отсутствует: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-sk.php",
    "content": "<?php\n/**\n * Slovak PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Michal Tinka <michaltinka@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Error: Chyba autentifikácie.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Error: Nebolo možné nadviazať spojenie so SMTP serverom.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Error: Dáta neboli prijaté';\n$PHPMAILER_LANG['empty_message']        = 'Prázdne telo správy.';\n$PHPMAILER_LANG['encoding']             = 'Neznáme kódovanie: ';\n$PHPMAILER_LANG['execute']              = 'Nedá sa vykonať: ';\n$PHPMAILER_LANG['file_access']          = 'Súbor nebol nájdený: ';\n$PHPMAILER_LANG['file_open']            = 'File Error: Súbor sa otvoriť pre čítanie: ';\n$PHPMAILER_LANG['from_failed']          = 'Následujúca adresa From je nesprávna: ';\n$PHPMAILER_LANG['instantiate']          = 'Nedá sa vytvoriť inštancia emailovej funkcie.';\n$PHPMAILER_LANG['invalid_address']      = 'Neodoslané, emailová adresa je nesprávna: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' emailový klient nieje podporovaný.';\n$PHPMAILER_LANG['provide_address']      = 'Musíte zadať aspoň jednu emailovú adresu príjemcu.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Error: Adresy príjemcov niesu správne ';\n$PHPMAILER_LANG['signing']              = 'Chyba prihlasovania: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() zlyhalo.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP chyba serveru: ';\n$PHPMAILER_LANG['variable_set']         = 'Nemožno nastaviť alebo resetovať premennú: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-sl.php",
    "content": "<?php\n/**\n * Slovene PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Klemen Tušar <techouse@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP napaka: Avtentikacija ni uspela.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP napaka: Ne morem vzpostaviti povezave s SMTP gostiteljem.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP napaka: Strežnik zavrača podatke.';\n$PHPMAILER_LANG['empty_message']        = 'E-poštno sporočilo nima vsebine.';\n$PHPMAILER_LANG['encoding']             = 'Nepoznan tip kodiranja: ';\n$PHPMAILER_LANG['execute']              = 'Operacija ni uspela: ';\n$PHPMAILER_LANG['file_access']          = 'Nimam dostopa do datoteke: ';\n$PHPMAILER_LANG['file_open']            = 'Ne morem odpreti datoteke: ';\n$PHPMAILER_LANG['from_failed']          = 'Neveljaven e-naslov pošiljatelja: ';\n$PHPMAILER_LANG['instantiate']          = 'Ne morem inicializirati mail funkcije.';\n$PHPMAILER_LANG['invalid_address']      = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.';\n$PHPMAILER_LANG['provide_address']      = 'Prosim vnesite vsaj enega naslovnika.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP napaka: Sledeči naslovniki so neveljavni: ';\n$PHPMAILER_LANG['signing']              = 'Napaka pri podpisovanju: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Ne morem vzpostaviti povezave s SMTP strežnikom.';\n$PHPMAILER_LANG['smtp_error']           = 'Napaka SMTP strežnika: ';\n$PHPMAILER_LANG['variable_set']         = 'Ne morem nastaviti oz. ponastaviti spremenljivke: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-sv.php",
    "content": "<?php\n/**\n * Swedish PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Johan Linnér <johan@linner.biz>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP fel: Kunde inte autentisera.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP fel: Kunde inte ansluta till SMTP-server.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP fel: Data accepterades inte.';\n//$PHPMAILER_LANG['empty_message']        = 'Message body empty';\n$PHPMAILER_LANG['encoding']             = 'Okänt encode-format: ';\n$PHPMAILER_LANG['execute']              = 'Kunde inte köra: ';\n$PHPMAILER_LANG['file_access']          = 'Ingen åtkomst till fil: ';\n$PHPMAILER_LANG['file_open']            = 'Fil fel: Kunde inte öppna fil: ';\n$PHPMAILER_LANG['from_failed']          = 'Följande avsändaradress är felaktig: ';\n$PHPMAILER_LANG['instantiate']          = 'Kunde inte initiera e-postfunktion.';\n$PHPMAILER_LANG['invalid_address']      = 'Felaktig adress: ';\n$PHPMAILER_LANG['provide_address']      = 'Du måste ange minst en mottagares e-postadress.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stöds inte.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP fel: Följande mottagare är felaktig: ';\n$PHPMAILER_LANG['signing']              = 'Signerings fel: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() misslyckades.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP server fel: ';\n$PHPMAILER_LANG['variable_set']         = 'Kunde inte definiera eller återställa variabel: ';\n$PHPMAILER_LANG['extension_missing']    = 'Tillägg ej tillgängligt: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-tr.php",
    "content": "<?php\n/**\n * Turkish PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Elçin Özel\n * @author Can Yılmaz\n * @author Mehmet Benlioğlu\n * @author @yasinaydin\n * @author Ogün Karakuş\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP Hatası: Oturum açılamadı.';\n$PHPMAILER_LANG['connect_host']         = 'SMTP Hatası: SMTP sunucusuna bağlanılamadı.';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Hatası: Veri kabul edilmedi.';\n$PHPMAILER_LANG['empty_message']        = 'Mesajın içeriği boş';\n$PHPMAILER_LANG['encoding']             = 'Bilinmeyen karakter kodlama: ';\n$PHPMAILER_LANG['execute']              = 'Çalıştırılamadı: ';\n$PHPMAILER_LANG['file_access']          = 'Dosyaya erişilemedi: ';\n$PHPMAILER_LANG['file_open']            = 'Dosya Hatası: Dosya açılamadı: ';\n$PHPMAILER_LANG['from_failed']          = 'Belirtilen adreslere gönderme başarısız: ';\n$PHPMAILER_LANG['instantiate']          = 'Örnek e-posta fonksiyonu oluşturulamadı.';\n$PHPMAILER_LANG['invalid_address']      = 'Geçersiz e-posta adresi: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' e-posta kütüphanesi desteklenmiyor.';\n$PHPMAILER_LANG['provide_address']      = 'En az bir alıcı e-posta adresi belirtmelisiniz.';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP Hatası: Belirtilen alıcılara ulaşılamadı: ';\n$PHPMAILER_LANG['signing']              = 'İmzalama hatası: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP connect() fonksiyonu başarısız.';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP sunucu hatası: ';\n$PHPMAILER_LANG['variable_set']         = 'Değişken ayarlanamadı ya da sıfırlanamadı: ';\n$PHPMAILER_LANG['extension_missing']    = 'Eklenti bulunamadı: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-uk.php",
    "content": "<?php\n/**\n * Ukrainian PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author Yuriy Rudyy <yrudyy@prs.net.ua>\n * @fixed by Boris Yurchenko <boris@yurchenko.pp.ua>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Помилка SMTP: помилка авторизації.';\n$PHPMAILER_LANG['connect_host']         = 'Помилка SMTP: не вдається під\\'єднатися до серверу SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Помилка SMTP: дані не прийняті.';\n$PHPMAILER_LANG['encoding']             = 'Невідомий тип кодування: ';\n$PHPMAILER_LANG['execute']              = 'Неможливо виконати команду: ';\n$PHPMAILER_LANG['file_access']          = 'Немає доступу до файлу: ';\n$PHPMAILER_LANG['file_open']            = 'Помилка файлової системи: не вдається відкрити файл: ';\n$PHPMAILER_LANG['from_failed']          = 'Невірна адреса відправника: ';\n$PHPMAILER_LANG['instantiate']          = 'Неможливо запустити функцію mail.';\n$PHPMAILER_LANG['provide_address']      = 'Будь-ласка, введіть хоча б одну адресу e-mail отримувача.';\n$PHPMAILER_LANG['mailer_not_supported'] = ' - поштовий сервер не підтримується.';\n$PHPMAILER_LANG['recipients_failed']    = 'Помилка SMTP: відправлення наступним отримувачам не вдалося: ';\n$PHPMAILER_LANG['empty_message']        = 'Пусте тіло повідомлення';\n$PHPMAILER_LANG['invalid_address']      = 'Не відправлено, невірний формат адреси e-mail: ';\n$PHPMAILER_LANG['signing']              = 'Помилка підпису: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Помилка з\\'єднання із SMTP-сервером';\n$PHPMAILER_LANG['smtp_error']           = 'Помилка SMTP-сервера: ';\n$PHPMAILER_LANG['variable_set']         = 'Неможливо встановити або перевстановити змінну: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-vi.php",
    "content": "<?php\n/**\n * Vietnamese (Tiếng Việt) PHPMailer language file: refer to English translation for definitive list.\n * @package PHPMailer\n * @author VINADES.,JSC <contact@vinades.vn>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'Lỗi SMTP: Không thể xác thực.';\n$PHPMAILER_LANG['connect_host']         = 'Lỗi SMTP: Không thể kết nối máy chủ SMTP.';\n$PHPMAILER_LANG['data_not_accepted']    = 'Lỗi SMTP: Dữ liệu không được chấp nhận.';\n$PHPMAILER_LANG['empty_message']        = 'Không có nội dung';\n$PHPMAILER_LANG['encoding']             = 'Mã hóa không xác định: ';\n$PHPMAILER_LANG['execute']              = 'Không thực hiện được: ';\n$PHPMAILER_LANG['file_access']          = 'Không thể truy cập tệp tin ';\n$PHPMAILER_LANG['file_open']            = 'Lỗi Tập tin: Không thể mở tệp tin: ';\n$PHPMAILER_LANG['from_failed']          = 'Lỗi địa chỉ gửi đi: ';\n$PHPMAILER_LANG['instantiate']          = 'Không dùng được các hàm gửi thư.';\n$PHPMAILER_LANG['invalid_address']      = 'Đại chỉ emai không đúng: ';\n$PHPMAILER_LANG['mailer_not_supported'] = ' trình gửi thư không được hỗ trợ.';\n$PHPMAILER_LANG['provide_address']      = 'Bạn phải cung cấp ít nhất một địa chỉ người nhận.';\n$PHPMAILER_LANG['recipients_failed']    = 'Lỗi SMTP: lỗi địa chỉ người nhận: ';\n$PHPMAILER_LANG['signing']              = 'Lỗi đăng nhập: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'Lỗi kết nối với SMTP';\n$PHPMAILER_LANG['smtp_error']           = 'Lỗi máy chủ smtp ';\n$PHPMAILER_LANG['variable_set']         = 'Không thể thiết lập hoặc thiết lập lại biến: ';\n//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-zh.php",
    "content": "<?php\n/**\n * Traditional Chinese PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author liqwei <liqwei@liqwei.com>\n * @author Peter Dave Hello <@PeterDaveHello/>\n * @author Jason Chiang <xcojad@gmail.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP 錯誤：登入失敗。';\n$PHPMAILER_LANG['connect_host']         = 'SMTP 錯誤：無法連線到 SMTP 主機。';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 錯誤：無法接受的資料。';\n$PHPMAILER_LANG['empty_message']        = '郵件內容為空';\n$PHPMAILER_LANG['encoding']             = '未知編碼: ';\n$PHPMAILER_LANG['execute']              = '無法執行：';\n$PHPMAILER_LANG['file_access']          = '無法存取檔案：';\n$PHPMAILER_LANG['file_open']            = '檔案錯誤：無法開啟檔案：';\n$PHPMAILER_LANG['from_failed']          = '發送地址錯誤：';\n$PHPMAILER_LANG['instantiate']          = '未知函數呼叫。';\n$PHPMAILER_LANG['invalid_address']      = '因為電子郵件地址無效，無法傳送: ';\n$PHPMAILER_LANG['mailer_not_supported'] = '不支援的發信客戶端。';\n$PHPMAILER_LANG['provide_address']      = '必須提供至少一個收件人地址。';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP 錯誤：以下收件人地址錯誤：';\n$PHPMAILER_LANG['signing']              = '電子簽章錯誤: ';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP 連線失敗';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP 伺服器錯誤: ';\n$PHPMAILER_LANG['variable_set']         = '無法設定或重設變數: ';\n$PHPMAILER_LANG['extension_missing']    = '遺失模組 Extension: ';\n"
  },
  {
    "path": "application/libraries/PHPMailer/language/phpmailer.lang-zh_cn.php",
    "content": "<?php\n/**\n * Simplified Chinese PHPMailer language file: refer to English translation for definitive list\n * @package PHPMailer\n * @author liqwei <liqwei@liqwei.com>\n * @author young <masxy@foxmail.com>\n * @author Teddysun <i@teddysun.com>\n */\n\n$PHPMAILER_LANG['authenticate']         = 'SMTP 错误：登录失败。';\n$PHPMAILER_LANG['connect_host']         = 'SMTP 错误：无法连接到 SMTP 主机。';\n$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 错误：数据不被接受。';\n$PHPMAILER_LANG['empty_message']        = '邮件正文为空。';\n$PHPMAILER_LANG['encoding']             = '未知编码：';\n$PHPMAILER_LANG['execute']              = '无法执行：';\n$PHPMAILER_LANG['file_access']          = '无法访问文件：';\n$PHPMAILER_LANG['file_open']            = '文件错误：无法打开文件：';\n$PHPMAILER_LANG['from_failed']          = '发送地址错误：';\n$PHPMAILER_LANG['instantiate']          = '未知函数调用。';\n$PHPMAILER_LANG['invalid_address']      = '发送失败，电子邮箱地址是无效的：';\n$PHPMAILER_LANG['mailer_not_supported'] = '发信客户端不被支持。';\n$PHPMAILER_LANG['provide_address']      = '必须提供至少一个收件人地址。';\n$PHPMAILER_LANG['recipients_failed']    = 'SMTP 错误：收件人地址错误：';\n$PHPMAILER_LANG['signing']              = '登录失败：';\n$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP服务器连接失败。';\n$PHPMAILER_LANG['smtp_error']           = 'SMTP服务器出错：';\n$PHPMAILER_LANG['variable_set']         = '无法设置或重置变量：';\n$PHPMAILER_LANG['extension_missing']    = '丢失模块 Extension：';\n"
  },
  {
    "path": "application/libraries/Permissions.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n * This class loads permissions\n * if is logged like employee will get permissions from db\n * if is logged like user will get default permissions array = full rights\n */\n\nclass Permissions\n{\n\n    private $permissions;\n\n    public function __construct($permissions = null)\n    {\n        $this->permissions = array();\n        if (defined('EMPLOYEE_ID')) {\n            foreach ($permissions as $row) {\n                $this->permissions[$row[\"perm\"]] = $row[\"role\"];\n            }\n        }\n    }\n\n    // check if a permission is set\n    public function hasPerm($permission)\n    {\n        /*\n         * if not defined is user\n         * give him full rules\n         */\n        if (!defined('EMPLOYEE_ID')) {\n            return true;\n        }\n        return $this->permissions[$permission] == 1 ? true : false;\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/Plans.php",
    "content": "<?php\r\n\r\ndefined('BASEPATH') OR exit('No direct script access allowed');\r\n/*\r\n * This class loads users plans\r\n */\r\n\r\nclass Plans\r\n{\r\n\r\n    private $CI;\r\n\r\n    public function __construct()\r\n    {\r\n        $this->CI = & get_instance();\r\n        $this->CI->load->model('PlansModel');\r\n    }\r\n\r\n    /*\r\n     * The system wait for constant number firms\r\n     * number of invoces are decrease when create\r\n     */\r\n\r\n    public function getMyCurrentPlanUnits()\r\n    {\r\n        $myPlanUnits = $this->CI->PlansModel->getMyPlanUnits();\r\n\r\n        /*\r\n         * If both are null, there is not plan to this account\r\n         * Lets calculate free plan units\r\n         */\r\n        if ($myPlanUnits['num_invoices'] == null && $myPlanUnits['num_firms'] == null) {\r\n            $myPlanUnits['num_invoices'] = $this->calculateFreePlanLeftNumInvoices();\r\n            $myPlanUnits['num_firms'] = 1;\r\n        }\r\n        return $myPlanUnits;\r\n    }\r\n\r\n    /*\r\n     * Caluculate left invoices for free plan work when from 5 we remove\r\n     * number of all issued invoices for one month back\r\n     * when we are not in payed plan\r\n     */\r\n\r\n    private function calculateFreePlanLeftNumInvoices()\r\n    {\r\n        $numArr = $this->CI->PlansModel->getNumInvoicesIssuedForOneMonth();\r\n        $num = $numArr['num'];\r\n        return 5 - $num;\r\n    }\r\n\r\n    public function myCurrentPlanType()\r\n    {\r\n        $myPlanType = $this->CI->PlansModel->getMyPlanType();\r\n        return $myPlanType['plan_type'];\r\n    }\r\n\r\n    public function checkHaveIRequest()\r\n    {\r\n        $myRequest = $this->CI->PlansModel->getMyRequest();\r\n        if ($myRequest == null) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "application/libraries/dompdf/.travis.yml",
    "content": "language: php\n\nphp:\n  - 7.1\n  - 7.2\n  - 7.3\n  - 7.4\n  - 8.0\n  - nightly\n  - hhvm\n\ninstall: travis_retry composer install --no-interaction --prefer-source\n\nbefore_script:\n  - composer require php-coveralls/php-coveralls --no-interaction\n\nscript:\n  - vendor/bin/phpunit --coverage-clover build/logs/clover.xml\n  - vendor/bin/phpcs --standard=phpcs.xml src tests\n\nmatrix:\n  allow_failures:\n    - php: nightly\n    - php: hhvm\n\n  fast_finish: true\n\nafter_success:\n  - travis_retry php vendor/bin/php-coveralls\n"
  },
  {
    "path": "application/libraries/dompdf/CONTRIBUTING.md",
    "content": "# How to contribute\n\n- [Getting help](#getting-help)\n- [Submitting bug reports](#submitting-bug-reports)\n- [Contributing code](#contributing-code)\n\n## Getting help\n\nCommunity discussion, questions, and informal bug reporting is done on the\n[dompdf Google group](http://groups.google.com/group/dompdf). You may also \nseek help on\n[StackOverflow](http://stackoverflow.com/questions/tagged/dompdf).\n\n## Submitting bug reports\n\nThe preferred way to report bugs is to use the\n[GitHub issue tracker](http://github.com/dompdf/dompdf/issues). Before \nreporting a bug, read these pointers.\n\n**Please search inside the bug tracker to see if the bug you found is not already reported.**\n\n**Note:** The issue tracker is for *bugs* and *feature requests*, not requests for help.\nQuestions should be asked on the\n[dompdf Google group](http://groups.google.com/group/dompdf) instead.\n\n### Reporting bugs effectively\n\n- dompdf is maintained by volunteers. They don't owe you anything, so be\n  polite. Reports with an indignant or belligerent tone tend to be moved to the\n  bottom of the pile.\n\n- Include information about **the PHP version on which the problem occurred**. Even\n  if you tested several PHP version on different servers, and the problem occurred\n  in all of them, mention this fact in the bug report.\n  Also include the operating system it's installed on. PHP configuration can also help,\n  and server error logs (like Apache logs)\n\n- Mention which release of dompdf you're using (the zip, the master branch, etc).\n  Preferably, try also with the current development snapshot, to ensure the\n  problem has not already been fixed.\n\n- Mention very precisely what went wrong. \"X is broken\" is not a good bug\n  report. What did you expect to happen? What happened instead? Describe the\n  exact steps a maintainer has to take to make the problem occur. We can not\n  fix something that we can not observe.\n\n- If the problem can not be reproduced in any of the demos included in the\n  dompdf distribution, please provide an HTML document that demonstrates\n  the problem. There are a few options to show us your code:\n   - [JS Fiddle](http://jsfiddle.net/)\n   - [dompdf debug helper](http://eclecticgeek.com/dompdf/debug.php) (provided by @bsweeney)\n   - Include the HTML/CSS inside the bug report, with\n   [code highlighting](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#wiki-code).\n\n## Contributing code\n\n- Make sure you have a [GitHub Account](https://github.com/signup/free)\n- Fork [dompdf](https://github.com/dompdf/dompdf/)\n  ([how to fork a repo](https://help.github.com/articles/fork-a-repo))\n- *Make your changes on the `develop` branch* or the most appropriate feature branch. Please only patch \n  the master branch if you are attempting to address an urgent bug in the released code.\n- Add a simple test file in `www/test/`, with a comprehensive name.\n- Add a unit test in the ``test/Dompdf/Tests/`` directory.\n- Submit a pull request\n([how to create a pull request](https://help.github.com/articles/fork-a-repo))\n"
  },
  {
    "path": "application/libraries/dompdf/LICENSE.LGPL",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES."
  },
  {
    "path": "application/libraries/dompdf/README.md",
    "content": "Dompdf\n======\n\n[![Build Status](https://travis-ci.org/dompdf/dompdf.png?branch=master)](https://travis-ci.org/dompdf/dompdf)\n[![Latest Stable Version](https://poser.pugx.org/dompdf/dompdf/v/stable.png)](https://packagist.org/packages/dompdf/dompdf)\n[![Total Downloads](https://poser.pugx.org/dompdf/dompdf/downloads.png)](https://packagist.org/packages/dompdf/dompdf)\n[![Latest Unstable Version](https://poser.pugx.org/dompdf/dompdf/v/unstable.png)](https://packagist.org/packages/dompdf/dompdf)\n[![License](https://poser.pugx.org/dompdf/dompdf/license.png)](https://packagist.org/packages/dompdf/dompdf)\n \n**Dompdf is an HTML to PDF converter**\n\nAt its heart, dompdf is (mostly) a [CSS 2.1](http://www.w3.org/TR/CSS2/) compliant\nHTML layout and rendering engine written in PHP. It is a style-driven renderer:\nit will download and read external stylesheets, inline style tags, and the style\nattributes of individual HTML elements. It also supports most presentational\nHTML attributes.\n\n*This document applies to the latest stable code which may not reflect the current \nrelease. For released code please\n[navigate to the appropriate tag](https://github.com/dompdf/dompdf/tags).*\n\n----\n\n**Check out the [demo](https://dompdf.net/examples.php) and ask any\nquestion on [StackOverflow](http://stackoverflow.com/questions/tagged/dompdf) or\non the [Google Groups](http://groups.google.com/group/dompdf).**\n\nFollow us on [![Twitter](http://twitter-badges.s3.amazonaws.com/twitter-a.png)](http://www.twitter.com/dompdf).\n\n---\n\n\n\n## Features\n\n * Handles most CSS 2.1 and a few CSS3 properties, including @import, @media &\n   @page rules\n * Supports most presentational HTML 4.0 attributes\n * Supports external stylesheets, either local or through http/ftp (via\n   fopen-wrappers)\n * Supports complex tables, including row & column spans, separate & collapsed\n   border models, individual cell styling\n * Image support (gif, png (8, 24 and 32 bit with alpha channel), bmp & jpeg)\n * No dependencies on external PDF libraries, thanks to the R&OS PDF class\n * Inline PHP support\n * Basic SVG support (see \"Limitations\" below)\n \n## Requirements\n\n * PHP version 7.1 or higher\n * DOM extension\n * MBString extension\n * php-font-lib\n * php-svg-lib\n \nNote that some required dependencies may have further dependencies \n(notably php-svg-lib requires sabberworm/php-css-parser).\n\n### Recommendations\n\n * OPcache (OPcache, XCache, APC, etc.): improves performance\n * GD (for image processing)\n * IMagick or GMagick extension: improves image processing performance\n\nVisit the wiki for more information:\nhttps://github.com/dompdf/dompdf/wiki/Requirements\n\n## About Fonts & Character Encoding\n\nPDF documents internally support the following fonts: Helvetica, Times-Roman,\nCourier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI\nencoding. In order for a PDF to display characters that are not available in\nWindows ANSI, you must supply an external font. Dompdf will embed any referenced\nfont in the PDF so long as it has been pre-loaded or is accessible to dompdf and\nreference in CSS @font-face rules. See the\n[font overview](https://github.com/dompdf/dompdf/wiki/About-Fonts-and-Character-Encoding)\nfor more information on how to use fonts.\n\nThe [DejaVu TrueType fonts](https://dejavu-fonts.github.io/) have been pre-installed\nto give dompdf decent Unicode character coverage by default. To use the DejaVu\nfonts reference the font in your stylesheet, e.g. `body { font-family: DejaVu\nSans; }` (for DejaVu Sans). The following DejaVu 2.34 fonts are available:\nDejaVu Sans, DejaVu Serif, and DejaVu Sans Mono.\n\n## Easy Installation\n\n### Install with composer\n\nTo install with [Composer](https://getcomposer.org/), simply require the\nlatest version of this package.\n\n```bash\ncomposer require dompdf/dompdf\n```\n\nMake sure that the autoload file from Composer is loaded.\n\n```php\n// somewhere early in your project's loading, require the Composer autoloader\n// see: http://getcomposer.org/doc/00-intro.md\nrequire 'vendor/autoload.php';\n\n```\n\n### Download and install\n\nDownload a packaged archive of dompdf and extract it into the \ndirectory where dompdf will reside\n\n * You can download stable copies of dompdf from\n   https://github.com/dompdf/dompdf/releases\n * Or download a nightly (the latest, unreleased code) from\n   http://eclecticgeek.com/dompdf\n\nUse the packaged release autoloader to load dompdf, libraries,\nand helper functions in your PHP:\n\n```php\n// include autoloader\nrequire_once 'dompdf/autoload.inc.php';\n```\n\nNote: packaged releases are named according using semantic\nversioning (_dompdf_MAJOR-MINOR-PATCH.zip_). So the 1.0.0 \nrelease would be dompdf_1-0-0.zip. This is the only download\nthat includes the autoloader for Dompdf and all its dependencies.\n\n### Install with git\n\nFrom the command line, switch to the directory where dompdf will\nreside and run the following commands:\n\n```sh\ngit clone https://github.com/dompdf/dompdf.git\ncd dompdf/lib\n\ngit clone https://github.com/PhenX/php-font-lib.git php-font-lib\ncd php-font-lib\ngit checkout 0.5.1\ncd ..\n\ngit clone https://github.com/PhenX/php-svg-lib.git php-svg-lib\ncd php-svg-lib\ngit checkout v0.3.2\ncd ..\n\ngit clone https://github.com/sabberworm/PHP-CSS-Parser.git php-css-parser\ncd php-css-parser\ngit checkout 8.1.0\n```\n\nRequire dompdf and it's dependencies in your PHP.\nFor details see the [autoloader in the utils project](https://github.com/dompdf/utils/blob/master/autoload.inc.php).\n\n## Quick Start\n\nJust pass your HTML in to dompdf and stream the output:\n\n```php\n// reference the Dompdf namespace\nuse Dompdf\\Dompdf;\n\n// instantiate and use the dompdf class\n$dompdf = new Dompdf();\n$dompdf->loadHtml('hello world');\n\n// (Optional) Setup the paper size and orientation\n$dompdf->setPaper('A4', 'landscape');\n\n// Render the HTML as PDF\n$dompdf->render();\n\n// Output the generated PDF to Browser\n$dompdf->stream();\n```\n\n### Setting Options\n\nSet options during dompdf instantiation:\n\n```php\nuse Dompdf\\Dompdf;\nuse Dompdf\\Options;\n\n$options = new Options();\n$options->set('defaultFont', 'Courier');\n$dompdf = new Dompdf($options);\n```\n\nor at run time\n\n```php\nuse Dompdf\\Dompdf;\n\n$dompdf = new Dompdf();\n$options = $dompdf->getOptions();\n$options->setDefaultFont('Courier');\n$dompdf->setOptions($options);\n```\n\nSee [Dompdf\\Options](src/Options.php) for a list of available options.\n\n### Resource Reference Requirements\n\nIn order to protect potentially sensitive information Dompdf imposes \nrestrictions on files referenced from the local file system or the web. \n\nFiles accessed through web-based protocols have the following requirements:\n * The Dompdf option \"isRemoteEnabled\" must be set to \"true\"\n * PHP must either have the curl extension enabled or the \n   allow_url_fopen setting set to true\n   \nFiles accessed through the local file system have the following requirement:\n * The file must fall within the path(s) specified for the Dompdf \"chroot\" option\n\n## Limitations (Known Issues)\n\n * Dompdf is not particularly tolerant to poorly-formed HTML input. To avoid\n   any unexpected rendering issues you should either enable the built-in HTML5\n   parser at runtime (`$options->setIsHtml5ParserEnabled(true);`) \n   or run your HTML through a HTML validator/cleaner (such as\n   [Tidy](http://tidy.sourceforge.net) or the\n   [W3C Markup Validation Service](http://validator.w3.org)).\n * Table cells are not pageable, meaning a table row must fit on a single page.\n * Elements are rendered on the active page when they are parsed.\n * Embedding \"raw\" SVG's (`<svg><path...></svg>`) isn't working yet, you need to\n   either link to an external SVG file, or use a DataURI like this:\n     ```php\n     $html = '<img src=\"data:image/svg+xml;base64,' . base64_encode($svg) . '\" ...>';\n     ```\n     Watch https://github.com/dompdf/dompdf/issues/320 for progress\n\n---\n\n[![Donate button](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](http://goo.gl/DSvWf)\n\n*If you find this project useful, please consider making a donation.\nAny funds donated will be used to help further development on this project.)*\n"
  },
  {
    "path": "application/libraries/dompdf/VERSION",
    "content": "$Format:<%h>$\n"
  },
  {
    "path": "application/libraries/dompdf/autoload.inc.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\n// HMLT5 Parser\nrequire_once __DIR__ . '/lib/html5lib/Parser.php';\n\n// Sabberworm\nspl_autoload_register(function($class)\n{\n    if (strpos($class, 'Sabberworm') !== false) {\n        $file = str_replace('\\\\', DIRECTORY_SEPARATOR, $class);\n        $file = realpath(__DIR__ . '/lib/php-css-parser/lib/' . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php');\n        if (file_exists($file)) {\n            require_once $file;\n            return true;\n        }\n    }\n    return false;\n});\n\n// php-font-lib\nrequire_once __DIR__ . '/lib/php-font-lib/src/FontLib/Autoloader.php';\n\n//php-svg-lib\nrequire_once __DIR__ . '/lib/php-svg-lib/src/autoload.php';\n\n\n/*\n * New PHP 5.3.0 namespaced autoloader\n */\nrequire_once __DIR__ . '/src/Autoloader.php';\n\nDompdf\\Autoloader::register();\n"
  },
  {
    "path": "application/libraries/dompdf/composer.json",
    "content": "{\n    \"name\": \"dompdf/dompdf\",\n    \"type\": \"library\",\n    \"description\": \"DOMPDF is a CSS 2.1 compliant HTML to PDF converter\",\n    \"homepage\": \"https://github.com/dompdf/dompdf\",\n    \"license\": \"LGPL-2.1\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Ménager\",\n            \"email\": \"fabien.menager@gmail.com\"\n        },\n        {\n            \"name\": \"Brian Sweeney\",\n            \"email\": \"eclecticgeek@gmail.com\"\n        },\n        {\n            \"name\": \"Gabriel Bull\",\n            \"email\": \"me@gabrielbull.com\"\n        }\n    ],\n    \"autoload\": {\n        \"psr-4\": {\n            \"Dompdf\\\\\": \"src/\"\n        },\n        \"classmap\": [\n            \"lib/\"\n        ]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Dompdf\\\\Tests\\\\\": \"tests/\"\n        }\n    },\n    \"require\": {\n        \"php\": \"^7.1 || ^8.0\",\n        \"ext-dom\": \"*\",\n        \"ext-mbstring\": \"*\",\n        \"phenx/php-font-lib\": \"^0.5.2\",\n        \"phenx/php-svg-lib\": \"^0.3.3\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^7.5 || ^8 || ^9\",\n        \"squizlabs/php_codesniffer\": \"^3.5\",\n        \"mockery/mockery\": \"^1.3\"\n    },\n    \"suggest\": {\n        \"ext-gd\": \"Needed to process images\",\n        \"ext-imagick\": \"Improves image processing performance\",\n        \"ext-gmagick\": \"Improves image processing performance\",\n        \"ext-zlib\": \"Needed for pdf stream compression\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-develop\": \"0.7-dev\"\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/Cpdf.php",
    "content": "<?php\n/**\n * A PHP class to provide the basic functionality to create a pdf document without\n * any requirement for additional modules.\n *\n * Extended by Orion Richardson to support Unicode / UTF-8 characters using\n * TCPDF and others as a guide.\n *\n * @author  Wayne Munro <pdf@ros.co.nz>\n * @author  Orion Richardson <orionr@yahoo.com>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Ryan H. Masten <ryan.masten@gmail.com>\n * @author  Brian Sweeney <eclecticgeek@gmail.com>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license Public Domain http://creativecommons.org/licenses/publicdomain/\n * @package Cpdf\n */\n\nnamespace Dompdf;\n\nuse FontLib\\Exception\\FontNotFoundException;\nuse FontLib\\Font;\nuse FontLib\\BinaryStream;\n\nclass Cpdf\n{\n    const PDF_VERSION = '1.7';\n\n    const ACROFORM_SIG_SIGNATURESEXISTS = 0x0001;\n    const ACROFORM_SIG_APPENDONLY =       0x0002;\n\n    const ACROFORM_FIELD_BUTTON =   'Btn';\n    const ACROFORM_FIELD_TEXT =     'Tx';\n    const ACROFORM_FIELD_CHOICE =   'Ch';\n    const ACROFORM_FIELD_SIG =      'Sig';\n\n    const ACROFORM_FIELD_READONLY =               0x0001;\n    const ACROFORM_FIELD_REQUIRED =               0x0002;\n\n    const ACROFORM_FIELD_TEXT_MULTILINE =         0x1000;\n    const ACROFORM_FIELD_TEXT_PASSWORD =          0x2000;\n    const ACROFORM_FIELD_TEXT_RICHTEXT =         0x10000;\n\n    const ACROFORM_FIELD_CHOICE_COMBO =          0x20000;\n    const ACROFORM_FIELD_CHOICE_EDIT =           0x40000;\n    const ACROFORM_FIELD_CHOICE_SORT =           0x80000;\n    const ACROFORM_FIELD_CHOICE_MULTISELECT =   0x200000;\n\n    const XOBJECT_SUBTYPE_FORM = 'Form';\n\n    /**\n     * @var integer The current number of pdf objects in the document\n     */\n    public $numObj = 0;\n\n    /**\n     * @var array This array contains all of the pdf objects, ready for final assembly\n     */\n    public $objects = [];\n\n    /**\n     * @var integer The objectId (number within the objects array) of the document catalog\n     */\n    public $catalogId;\n\n    /**\n     * @var integer The objectId (number within the objects array) of indirect references (Javascript EmbeddedFiles)\n     */\n    protected $indirectReferenceId = 0;\n\n    /**\n     * @var integer The objectId (number within the objects array)\n     */\n    protected $embeddedFilesId = 0;\n\n    /**\n     * AcroForm objectId\n     *\n     * @var integer\n     */\n    public $acroFormId;\n\n    /**\n     * @var int\n     */\n    public $signatureMaxLen = 5000;\n\n    /**\n     * @var array Array carrying information about the fonts that the system currently knows about\n     * Used to ensure that a font is not loaded twice, among other things\n     */\n    public $fonts = [];\n\n    /**\n     * @var string The default font metrics file to use if no other font has been loaded.\n     * The path to the directory containing the font metrics should be included\n     */\n    public $defaultFont = './fonts/Helvetica.afm';\n\n    /**\n     * @string A record of the current font\n     */\n    public $currentFont = '';\n\n    /**\n     * @var string The current base font\n     */\n    public $currentBaseFont = '';\n\n    /**\n     * @var integer The number of the current font within the font array\n     */\n    public $currentFontNum = 0;\n\n    /**\n     * @var integer\n     */\n    public $currentNode;\n\n    /**\n     * @var integer Object number of the current page\n     */\n    public $currentPage;\n\n    /**\n     * @var integer Object number of the currently active contents block\n     */\n    public $currentContents;\n\n    /**\n     * @var integer Number of fonts within the system\n     */\n    public $numFonts = 0;\n\n    /**\n     * @var integer Number of graphic state resources used\n     */\n    private $numStates = 0;\n\n    /**\n     * @var array Number of graphic state resources used\n     */\n    private $gstates = [];\n\n    /**\n     * @var array Current color for fill operations, defaults to inactive value,\n     * all three components should be between 0 and 1 inclusive when active\n     */\n    public $currentColor = null;\n\n    /**\n     * @var array Current color for stroke operations (lines etc.)\n     */\n    public $currentStrokeColor = null;\n\n    /**\n     * @var string Fill rule (nonzero or evenodd)\n     */\n    public $fillRule = \"nonzero\";\n\n    /**\n     * @var string Current style that lines are drawn in\n     */\n    public $currentLineStyle = '';\n\n    /**\n     * @var array Current line transparency (partial graphics state)\n     */\n    public $currentLineTransparency = [\"mode\" => \"Normal\", \"opacity\" => 1.0];\n\n    /**\n     * array Current fill transparency (partial graphics state)\n     */\n    public $currentFillTransparency = [\"mode\" => \"Normal\", \"opacity\" => 1.0];\n\n    /**\n     * @var array An array which is used to save the state of the document, mainly the colors and styles\n     * it is used to temporarily change to another state, then change back to what it was before\n     */\n    public $stateStack = [];\n\n    /**\n     * @var integer Number of elements within the state stack\n     */\n    public $nStateStack = 0;\n\n    /**\n     * @var integer Number of page objects within the document\n     */\n    public $numPages = 0;\n\n    /**\n     * @var array Object Id storage stack\n     */\n    public $stack = [];\n\n    /**\n     * @var integer Number of elements within the object Id storage stack\n     */\n    public $nStack = 0;\n\n    /**\n     * an array which contains information about the objects which are not firmly attached to pages\n     * these have been added with the addObject function\n     */\n    public $looseObjects = [];\n\n    /**\n     * array contains information about how the loose objects are to be added to the document\n     */\n    public $addLooseObjects = [];\n\n    /**\n     * @var integer The objectId of the information object for the document\n     * this contains authorship, title etc.\n     */\n    public $infoObject = 0;\n\n    /**\n     * @var integer Number of images being tracked within the document\n     */\n    public $numImages = 0;\n\n    /**\n     * @var array An array containing options about the document\n     * it defaults to turning on the compression of the objects\n     */\n    public $options = ['compression' => true];\n\n    /**\n     * @var integer The objectId of the first page of the document\n     */\n    public $firstPageId;\n\n    /**\n     * @var integer The object Id of the procset object\n     */\n    public $procsetObjectId;\n\n    /**\n     * @var array Store the information about the relationship between font families\n     * this used so that the code knows which font is the bold version of another font, etc.\n     * the value of this array is initialised in the constructor function.\n     */\n    public $fontFamilies = [];\n\n    /**\n     * @var string Folder for php serialized formats of font metrics files.\n     * If empty string, use same folder as original metrics files.\n     * This can be passed in from class creator.\n     * If this folder does not exist or is not writable, Cpdf will be **much** slower.\n     * Because of potential trouble with php safe mode, folder cannot be created at runtime.\n     */\n    public $fontcache = '';\n\n    /**\n     * @var integer The version of the font metrics cache file.\n     * This value must be manually incremented whenever the internal font data structure is modified.\n     */\n    public $fontcacheVersion = 6;\n\n    /**\n     * @var string Temporary folder.\n     * If empty string, will attempt system tmp folder.\n     * This can be passed in from class creator.\n     */\n    public $tmp = '';\n\n    /**\n     * @var string Track if the current font is bolded or italicised\n     */\n    public $currentTextState = '';\n\n    /**\n     * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information\n     */\n    public $messages = '';\n\n    /**\n     * @var string The encryption array for the document encryption is stored here\n     */\n    public $arc4 = '';\n\n    /**\n     * @var integer The object Id of the encryption information\n     */\n    public $arc4_objnum = 0;\n\n    /**\n     * @var string The file identifier, used to uniquely identify a pdf document\n     */\n    public $fileIdentifier = '';\n\n    /**\n     * @var boolean A flag to say if a document is to be encrypted or not\n     */\n    public $encrypted = false;\n\n    /**\n     * @var string The encryption key for the encryption of all the document content (structure is not encrypted)\n     */\n    public $encryptionKey = '';\n\n    /**\n     * @var array Array which forms a stack to keep track of nested callback functions\n     */\n    public $callback = [];\n\n    /**\n     * @var integer The number of callback functions in the callback array\n     */\n    public $nCallback = 0;\n\n    /**\n     * @var array Store label->id pairs for named destinations, these will be used to replace internal links\n     * done this way so that destinations can be defined after the location that links to them\n     */\n    public $destinations = [];\n\n    /**\n     * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the\n     * publiciables within the class, so that the user can rollback at will (from each 'start' command)\n     * note that this includes the objects array, so these can be large.\n     */\n    public $checkpoint = '';\n\n    /**\n     * @var array Table of Image origin filenames and image labels which were already added with o_image().\n     * Allows to merge identical images\n     */\n    public $imagelist = [];\n\n    /**\n     * @var boolean Whether the text passed in should be treated as Unicode or just local character set.\n     */\n    public $isUnicode = false;\n\n    /**\n     * @var string the JavaScript code of the document\n     */\n    public $javascript = '';\n\n    /**\n     * @var boolean whether the compression is possible\n     */\n    protected $compressionReady = false;\n\n    /**\n     * @var array Current page size\n     */\n    protected $currentPageSize = [\"width\" => 0, \"height\" => 0];\n\n    /**\n     * @var array All the chars that will be required in the font subsets\n     */\n    protected $stringSubsets = [];\n\n    /**\n     * @var string The target internal encoding\n     */\n    protected static $targetEncoding = 'Windows-1252';\n\n    /**\n     * @var array\n     */\n    protected $byteRange = array();\n\n    /**\n     * @var array The list of the core fonts\n     */\n    protected static $coreFonts = [\n        'courier',\n        'courier-bold',\n        'courier-oblique',\n        'courier-boldoblique',\n        'helvetica',\n        'helvetica-bold',\n        'helvetica-oblique',\n        'helvetica-boldoblique',\n        'times-roman',\n        'times-bold',\n        'times-italic',\n        'times-bolditalic',\n        'symbol',\n        'zapfdingbats'\n    ];\n\n    /**\n     * Class constructor\n     * This will start a new document\n     *\n     * @param array   $pageSize  Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero.\n     * @param boolean $isUnicode Whether text will be treated as Unicode or not.\n     * @param string  $fontcache The font cache folder\n     * @param string  $tmp       The temporary folder\n     */\n    function __construct($pageSize = [0, 0, 612, 792], $isUnicode = false, $fontcache = '', $tmp = '')\n    {\n        $this->isUnicode = $isUnicode;\n        $this->fontcache = rtrim($fontcache, DIRECTORY_SEPARATOR.\"/\\\\\");\n        $this->tmp = ($tmp !== '' ? $tmp : sys_get_temp_dir());\n        $this->newDocument($pageSize);\n\n        $this->compressionReady = function_exists('gzcompress');\n\n        if (in_array('Windows-1252', mb_list_encodings())) {\n            self::$targetEncoding = 'Windows-1252';\n        }\n\n        // also initialize the font families that are known about already\n        $this->setFontFamily('init');\n    }\n\n    /**\n     * Document object methods (internal use only)\n     *\n     * There is about one object method for each type of object in the pdf document\n     * Each function has the same call list ($id,$action,$options).\n     * $id = the object ID of the object, or what it is to be if it is being created\n     * $action = a string specifying the action to be performed, though ALL must support:\n     *           'new' - create the object with the id $id\n     *           'out' - produce the output for the pdf object\n     * $options = optional, a string or array containing the various parameters for the object\n     *\n     * These, in conjunction with the output function are the ONLY way for output to be produced\n     * within the pdf 'file'.\n     */\n\n    /**\n     * Destination object, used to specify the location for the user to jump to, presently on opening\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return string|null\n     */\n    protected function o_destination($id, $action, $options = '')\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'destination', 'info' => []];\n                $tmp = '';\n                switch ($options['type']) {\n                    case 'XYZ':\n                    /** @noinspection PhpMissingBreakStatementInspection */\n                    case 'FitR':\n                        $tmp = ' ' . $options['p3'] . $tmp;\n                    case 'FitH':\n                    case 'FitV':\n                    case 'FitBH':\n                    /** @noinspection PhpMissingBreakStatementInspection */\n                    case 'FitBV':\n                        $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp;\n                    case 'Fit':\n                    case 'FitB':\n                        $tmp = $options['type'] . $tmp;\n                        $this->objects[$id]['info']['string'] = $tmp;\n                        $this->objects[$id]['info']['page'] = $options['page'];\n                }\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n\n                $tmp = $o['info'];\n                $res = \"\\n$id 0 obj\\n\" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . \"]\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * set the viewer preferences\n     *\n     * @param $id\n     * @param $action\n     * @param string|array $options\n     * @return string|null\n     */\n    protected function o_viewerPreferences($id, $action, $options = '')\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'viewerPreferences', 'info' => []];\n                break;\n\n            case 'add':\n                $o = &$this->objects[$id];\n\n                foreach ($options as $k => $v) {\n                    switch ($k) {\n                        // Boolean keys\n                        case 'HideToolbar':\n                        case 'HideMenubar':\n                        case 'HideWindowUI':\n                        case 'FitWindow':\n                        case 'CenterWindow':\n                        case 'DisplayDocTitle':\n                        case 'PickTrayByPDFSize':\n                            $o['info'][$k] = (bool)$v;\n                            break;\n\n                        // Integer keys\n                        case 'NumCopies':\n                            $o['info'][$k] = (int)$v;\n                            break;\n\n                        // Name keys\n                        case 'ViewArea':\n                        case 'ViewClip':\n                        case 'PrintClip':\n                        case 'PrintArea':\n                            $o['info'][$k] = (string)$v;\n                            break;\n\n                        // Named with limited valid values\n                        case 'NonFullScreenPageMode':\n                            if (!in_array($v, ['UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'])) {\n                                break;\n                            }\n                            $o['info'][$k] = $v;\n                            break;\n\n                        case 'Direction':\n                            if (!in_array($v, ['L2R', 'R2L'])) {\n                                break;\n                            }\n                            $o['info'][$k] = $v;\n                            break;\n\n                        case 'PrintScaling':\n                            if (!in_array($v, ['None', 'AppDefault'])) {\n                                break;\n                            }\n                            $o['info'][$k] = $v;\n                            break;\n\n                        case 'Duplex':\n                            if (!in_array($v, ['None', 'Simplex', 'DuplexFlipShortEdge', 'DuplexFlipLongEdge'])) {\n                                break;\n                            }\n                            $o['info'][$k] = $v;\n                            break;\n\n                        // Integer array\n                        case 'PrintPageRange':\n                            // Cast to integer array\n                            foreach ($v as $vK => $vV) {\n                                $v[$vK] = (int)$vV;\n                            }\n                            $o['info'][$k] = array_values($v);\n                            break;\n                    }\n                }\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<< \";\n\n                foreach ($o['info'] as $k => $v) {\n                    if (is_string($v)) {\n                        $v = '/' . $v;\n                    } elseif (is_int($v)) {\n                        $v = (string) $v;\n                    } elseif (is_bool($v)) {\n                        $v = ($v ? 'true' : 'false');\n                    } elseif (is_array($v)) {\n                        $v = '[' . implode(' ', $v) . ']';\n                    }\n                    $res .= \"\\n/$k $v\";\n                }\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * define the document catalog, the overall controller for the document\n     *\n     * @param $id\n     * @param $action\n     * @param string|array $options\n     * @return string|null\n     */\n    protected function o_catalog($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'catalog', 'info' => []];\n                $this->catalogId = $id;\n                break;\n\n            case 'acroform':\n            case 'outlines':\n            case 'pages':\n            case 'openHere':\n            case 'names':\n                $o['info'][$action] = $options;\n                break;\n\n            case 'viewerPreferences':\n                if (!isset($o['info']['viewerPreferences'])) {\n                    $this->numObj++;\n                    $this->o_viewerPreferences($this->numObj, 'new');\n                    $o['info']['viewerPreferences'] = $this->numObj;\n                }\n\n                $vp = $o['info']['viewerPreferences'];\n                $this->o_viewerPreferences($vp, 'add', $options);\n\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Catalog\";\n\n                foreach ($o['info'] as $k => $v) {\n                    switch ($k) {\n                        case 'outlines':\n                            $res .= \"\\n/Outlines $v 0 R\";\n                            break;\n\n                        case 'pages':\n                            $res .= \"\\n/Pages $v 0 R\";\n                            break;\n\n                        case 'viewerPreferences':\n                            $res .= \"\\n/ViewerPreferences $v 0 R\";\n                            break;\n\n                        case 'openHere':\n                            $res .= \"\\n/OpenAction $v 0 R\";\n                            break;\n\n                        case 'names':\n                            $res .= \"\\n/Names $v 0 R\";\n                            break;\n\n                        case 'acroform':\n                            $res .= \"\\n/AcroForm $v 0 R\";\n                            break;\n                    }\n                }\n\n                $res .= \" >>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * object which is a parent to the pages in the document\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return string|null\n     */\n    protected function o_pages($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'pages', 'info' => []];\n                $this->o_catalog($this->catalogId, 'pages', $id);\n                break;\n\n            case 'page':\n                if (!is_array($options)) {\n                    // then it will just be the id of the new page\n                    $o['info']['pages'][] = $options;\n                } else {\n                    // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative\n                    // and pos is either 'before' or 'after', saying where this page will fit.\n                    if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) {\n                        $i = array_search($options['rid'], $o['info']['pages']);\n                        if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) {\n\n                            // then there is a match\n                            // make a space\n                            switch ($options['pos']) {\n                                case 'before':\n                                    $k = $i;\n                                    break;\n\n                                case 'after':\n                                    $k = $i + 1;\n                                    break;\n\n                                default:\n                                    $k = -1;\n                                    break;\n                            }\n\n                            if ($k >= 0) {\n                                for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) {\n                                    $o['info']['pages'][$j + 1] = $o['info']['pages'][$j];\n                                }\n\n                                $o['info']['pages'][$k] = $options['id'];\n                            }\n                        }\n                    }\n                }\n                break;\n\n            case 'procset':\n                $o['info']['procset'] = $options;\n                break;\n\n            case 'mediaBox':\n                $o['info']['mediaBox'] = $options;\n                // which should be an array of 4 numbers\n                $this->currentPageSize = ['width' => $options[2], 'height' => $options[3]];\n                break;\n\n            case 'font':\n                $o['info']['fonts'][] = ['objNum' => $options['objNum'], 'fontNum' => $options['fontNum']];\n                break;\n\n            case 'extGState':\n                $o['info']['extGStates'][] = ['objNum' => $options['objNum'], 'stateNum' => $options['stateNum']];\n                break;\n\n            case 'xObject':\n                $o['info']['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']];\n                break;\n\n            case 'out':\n                if (count($o['info']['pages'])) {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Pages\\n/Kids [\";\n                    foreach ($o['info']['pages'] as $v) {\n                        $res .= \"$v 0 R\\n\";\n                    }\n\n                    $res .= \"]\\n/Count \" . count($this->objects[$id]['info']['pages']);\n\n                    if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) ||\n                        isset($o['info']['procset']) ||\n                        (isset($o['info']['extGStates']) && count($o['info']['extGStates']))\n                    ) {\n                        $res .= \"\\n/Resources <<\";\n\n                        if (isset($o['info']['procset'])) {\n                            $res .= \"\\n/ProcSet \" . $o['info']['procset'] . \" 0 R\";\n                        }\n\n                        if (isset($o['info']['fonts']) && count($o['info']['fonts'])) {\n                            $res .= \"\\n/Font << \";\n                            foreach ($o['info']['fonts'] as $finfo) {\n                                $res .= \"\\n/F\" . $finfo['fontNum'] . \" \" . $finfo['objNum'] . \" 0 R\";\n                            }\n                            $res .= \"\\n>>\";\n                        }\n\n                        if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) {\n                            $res .= \"\\n/XObject << \";\n                            foreach ($o['info']['xObjects'] as $finfo) {\n                                $res .= \"\\n/\" . $finfo['label'] . \" \" . $finfo['objNum'] . \" 0 R\";\n                            }\n                            $res .= \"\\n>>\";\n                        }\n\n                        if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) {\n                            $res .= \"\\n/ExtGState << \";\n                            foreach ($o['info']['extGStates'] as $gstate) {\n                                $res .= \"\\n/GS\" . $gstate['stateNum'] . \" \" . $gstate['objNum'] . \" 0 R\";\n                            }\n                            $res .= \"\\n>>\";\n                        }\n\n                        $res .= \"\\n>>\";\n                        if (isset($o['info']['mediaBox'])) {\n                            $tmp = $o['info']['mediaBox'];\n                            $res .= \"\\n/MediaBox [\" . sprintf(\n                                    '%.3F %.3F %.3F %.3F',\n                                    $tmp[0],\n                                    $tmp[1],\n                                    $tmp[2],\n                                    $tmp[3]\n                                ) . ']';\n                        }\n                    }\n\n                    $res .= \"\\n >>\\nendobj\";\n                } else {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Pages\\n/Count 0\\n>>\\nendobj\";\n                }\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * define the outlines in the doc, empty for now\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return string|null\n     */\n    protected function o_outlines($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'outlines', 'info' => ['outlines' => []]];\n                $this->o_catalog($this->catalogId, 'outlines', $id);\n                break;\n\n            case 'outline':\n                $o['info']['outlines'][] = $options;\n                break;\n\n            case 'out':\n                if (count($o['info']['outlines'])) {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Outlines /Kids [\";\n                    foreach ($o['info']['outlines'] as $v) {\n                        $res .= \"$v 0 R \";\n                    }\n\n                    $res .= \"] /Count \" . count($o['info']['outlines']) . \" >>\\nendobj\";\n                } else {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Outlines /Count 0 >>\\nendobj\";\n                }\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * an object to hold the font description\n     *\n     * @param $id\n     * @param $action\n     * @param string|array $options\n     * @return string|null\n     * @throws FontNotFoundException\n     */\n    protected function o_font($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = [\n                    't'    => 'font',\n                    'info' => [\n                        'name'         => $options['name'],\n                        'fontFileName' => $options['fontFileName'],\n                        'SubType'      => 'Type1',\n                        'isSubsetting'   => $options['isSubsetting']\n                    ]\n                ];\n                $fontNum = $this->numFonts;\n                $this->objects[$id]['info']['fontNum'] = $fontNum;\n\n                // deal with the encoding and the differences\n                if (isset($options['differences'])) {\n                    // then we'll need an encoding dictionary\n                    $this->numObj++;\n                    $this->o_fontEncoding($this->numObj, 'new', $options);\n                    $this->objects[$id]['info']['encodingDictionary'] = $this->numObj;\n                } else {\n                    if (isset($options['encoding'])) {\n                        // we can specify encoding here\n                        switch ($options['encoding']) {\n                            case 'WinAnsiEncoding':\n                            case 'MacRomanEncoding':\n                            case 'MacExpertEncoding':\n                                $this->objects[$id]['info']['encoding'] = $options['encoding'];\n                                break;\n\n                            case 'none':\n                                break;\n\n                            default:\n                                $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';\n                                break;\n                        }\n                    } else {\n                        $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';\n                    }\n                }\n\n                if ($this->fonts[$options['fontFileName']]['isUnicode']) {\n                    // For Unicode fonts, we need to incorporate font data into\n                    // sub-sections that are linked from the primary font section.\n                    // Look at o_fontGIDtoCID and o_fontDescendentCID functions\n                    // for more information.\n                    //\n                    // All of this code is adapted from the excellent changes made to\n                    // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)\n\n                    $toUnicodeId = ++$this->numObj;\n                    $this->o_toUnicode($toUnicodeId, 'new');\n                    $this->objects[$id]['info']['toUnicode'] = $toUnicodeId;\n\n                    $cidFontId = ++$this->numObj;\n                    $this->o_fontDescendentCID($cidFontId, 'new', $options);\n                    $this->objects[$id]['info']['cidFont'] = $cidFontId;\n                }\n\n                // also tell the pages node about the new font\n                $this->o_pages($this->currentNode, 'font', ['fontNum' => $fontNum, 'objNum' => $id]);\n                break;\n\n            case 'add':\n                $font_options = $this->processFont($id, $o['info']);\n\n                if ($font_options !== false) {\n                    foreach ($font_options as $k => $v) {\n                        switch ($k) {\n                            case 'BaseFont':\n                                $o['info']['name'] = $v;\n                                break;\n                            case 'FirstChar':\n                            case 'LastChar':\n                            case 'Widths':\n                            case 'FontDescriptor':\n                            case 'SubType':\n                                $this->addMessage('o_font ' . $k . \" : \" . $v);\n                                $o['info'][$k] = $v;\n                                break;\n                        }\n                    }\n\n                    // pass values down to descendent font\n                    if (isset($o['info']['cidFont'])) {\n                        $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $font_options);\n                    }\n                }\n                break;\n\n            case 'out':\n                if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) {\n                    // For Unicode fonts, we need to incorporate font data into\n                    // sub-sections that are linked from the primary font section.\n                    // Look at o_fontGIDtoCID and o_fontDescendentCID functions\n                    // for more information.\n                    //\n                    // All of this code is adapted from the excellent changes made to\n                    // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)\n\n                    $res = \"\\n$id 0 obj\\n<</Type /Font\\n/Subtype /Type0\\n\";\n                    $res .= \"/BaseFont /\" . $o['info']['name'] . \"\\n\";\n\n                    // The horizontal identity mapping for 2-byte CIDs; may be used\n                    // with CIDFonts using any Registry, Ordering, and Supplement values.\n                    $res .= \"/Encoding /Identity-H\\n\";\n                    $res .= \"/DescendantFonts [\" . $o['info']['cidFont'] . \" 0 R]\\n\";\n                    $res .= \"/ToUnicode \" . $o['info']['toUnicode'] . \" 0 R\\n\";\n                    $res .= \">>\\n\";\n                    $res .= \"endobj\";\n                } else {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Font\\n/Subtype /\" . $o['info']['SubType'] . \"\\n\";\n                    $res .= \"/Name /F\" . $o['info']['fontNum'] . \"\\n\";\n                    $res .= \"/BaseFont /\" . $o['info']['name'] . \"\\n\";\n\n                    if (isset($o['info']['encodingDictionary'])) {\n                        // then place a reference to the dictionary\n                        $res .= \"/Encoding \" . $o['info']['encodingDictionary'] . \" 0 R\\n\";\n                    } else {\n                        if (isset($o['info']['encoding'])) {\n                            // use the specified encoding\n                            $res .= \"/Encoding /\" . $o['info']['encoding'] . \"\\n\";\n                        }\n                    }\n\n                    if (isset($o['info']['FirstChar'])) {\n                        $res .= \"/FirstChar \" . $o['info']['FirstChar'] . \"\\n\";\n                    }\n\n                    if (isset($o['info']['LastChar'])) {\n                        $res .= \"/LastChar \" . $o['info']['LastChar'] . \"\\n\";\n                    }\n\n                    if (isset($o['info']['Widths'])) {\n                        $res .= \"/Widths \" . $o['info']['Widths'] . \" 0 R\\n\";\n                    }\n\n                    if (isset($o['info']['FontDescriptor'])) {\n                        $res .= \"/FontDescriptor \" . $o['info']['FontDescriptor'] . \" 0 R\\n\";\n                    }\n\n                    $res .= \">>\\n\";\n                    $res .= \"endobj\";\n                }\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    protected function getFontSubsettingTag(array $font): string\n    {\n        // convert font num to hexavigesimal numeral system letters A - Z only\n        $base_26 = strtoupper(base_convert($font['fontNum'], 10, 26));\n        for ($i = 0; $i < strlen($base_26); $i++) {\n            $char = $base_26[$i];\n            if ($char <= \"9\") {\n                $base_26[$i] = chr(65 + intval($char));\n            } else {\n                $base_26[$i] = chr(ord($char) + 10);\n            }\n        }\n\n        return 'SUB' . str_pad($base_26, 3 , 'A', STR_PAD_LEFT);\n    }\n\n    /**\n     * @param int $fontObjId\n     * @param array $object_info\n     * @return array|false\n     * @throws FontNotFoundException\n     */\n    private function processFont(int $fontObjId, array $object_info)\n    {\n        $fontFileName = $object_info['fontFileName'];\n        if (!isset($this->fonts[$fontFileName])) {\n            return false;\n        }\n\n        $font = &$this->fonts[$fontFileName];\n\n        $fileSuffix = $font['fileSuffix'];\n        $fileSuffixLower = strtolower($font['fileSuffix']);\n        $fbfile = \"$fontFileName.$fileSuffix\";\n        $isTtfFont = $fileSuffixLower === 'ttf';\n        $isPfbFont = $fileSuffixLower === 'pfb';\n\n        $this->addMessage('selectFont: checking for - ' . $fbfile);\n\n        if (!$fileSuffix) {\n            $this->addMessage(\n                'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts'\n            );\n\n            return false;\n        } else {\n            $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName'];\n            //        $fontObj = $this->numObj;\n            $this->addMessage(\"selectFont: adding font file - $fbfile - $adobeFontName\");\n\n            // find the array of font widths, and put that into an object.\n            $firstChar = -1;\n            $lastChar = 0;\n            $widths = [];\n            $cid_widths = [];\n\n            foreach ($font['C'] as $num => $d) {\n                if (intval($num) > 0 || $num == '0') {\n                    if (!$font['isUnicode']) {\n                        // With Unicode, widths array isn't used\n                        if ($lastChar > 0 && $num > $lastChar + 1) {\n                            for ($i = $lastChar + 1; $i < $num; $i++) {\n                                $widths[] = 0;\n                            }\n                        }\n                    }\n\n                    $widths[] = $d;\n\n                    if ($font['isUnicode']) {\n                        $cid_widths[$num] = $d;\n                    }\n\n                    if ($firstChar == -1) {\n                        $firstChar = $num;\n                    }\n\n                    $lastChar = $num;\n                }\n            }\n\n            // also need to adjust the widths for the differences array\n            if (isset($object['differences'])) {\n                foreach ($object['differences'] as $charNum => $charName) {\n                    if ($charNum > $lastChar) {\n                        if (!$object['isUnicode']) {\n                            // With Unicode, widths array isn't used\n                            for ($i = $lastChar + 1; $i <= $charNum; $i++) {\n                                $widths[] = 0;\n                            }\n                        }\n\n                        $lastChar = $charNum;\n                    }\n\n                    if (isset($font['C'][$charName])) {\n                        $widths[$charNum - $firstChar] = $font['C'][$charName];\n                        if ($font['isUnicode']) {\n                            $cid_widths[$charName] = $font['C'][$charName];\n                        }\n                    }\n                }\n            }\n\n            if ($font['isUnicode']) {\n                $font['CIDWidths'] = $cid_widths;\n            }\n\n            $this->addMessage('selectFont: FirstChar = ' . $firstChar);\n            $this->addMessage('selectFont: LastChar = ' . $lastChar);\n\n            $widthid = -1;\n\n            if (!$font['isUnicode']) {\n                // With Unicode, widths array isn't used\n\n                $this->numObj++;\n                $this->o_contents($this->numObj, 'new', 'raw');\n                $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']';\n                $widthid = $this->numObj;\n            }\n\n            $missing_width = 500;\n            $stemV = 70;\n\n            if (isset($font['MissingWidth'])) {\n                $missing_width = $font['MissingWidth'];\n            }\n            if (isset($font['StdVW'])) {\n                $stemV = $font['StdVW'];\n            } else {\n                if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) {\n                    $stemV = 120;\n                }\n            }\n\n            // load the pfb file, and put that into an object too.\n            // note that pdf supports only binary format type 1 font files, though there is a\n            // simple utility to convert them from pfa to pfb.\n            if (!$font['isSubsetting']) {\n                $data = file_get_contents($fbfile);\n            } else {\n                $adobeFontName = $this->getFontSubsettingTag($font) . '+' . $adobeFontName;\n                $this->stringSubsets[$fontFileName][] = 32; // Force space if not in yet\n\n                $subset = $this->stringSubsets[$fontFileName];\n                sort($subset);\n\n                // Load font\n                $font_obj = Font::load($fbfile);\n                $font_obj->parse();\n\n                // Define subset\n                $font_obj->setSubset($subset);\n                $font_obj->reduce();\n\n                // Write new font\n                $tmp_name = $this->tmp . \"/\" . basename($fbfile) . \".tmp.\" . uniqid();\n                touch($tmp_name);\n                $font_obj->open($tmp_name, BinaryStream::modeReadWrite);\n                $font_obj->encode([\"OS/2\"]);\n                $font_obj->close();\n\n                // Parse the new font to get cid2gid and widths\n                $font_obj = Font::load($tmp_name);\n\n                // Find Unicode char map table\n                $subtable = null;\n                foreach ($font_obj->getData(\"cmap\", \"subtables\") as $_subtable) {\n                    if ($_subtable[\"platformID\"] == 0 || $_subtable[\"platformID\"] == 3 && $_subtable[\"platformSpecificID\"] == 1) {\n                        $subtable = $_subtable;\n                        break;\n                    }\n                }\n\n                if ($subtable) {\n                    $glyphIndexArray = $subtable[\"glyphIndexArray\"];\n                    $hmtx = $font_obj->getData(\"hmtx\");\n\n                    unset($glyphIndexArray[0xFFFF]);\n\n                    $cidtogid = str_pad('', max(array_keys($glyphIndexArray)) * 2 + 1, \"\\x00\");\n                    $font['CIDWidths'] = [];\n                    foreach ($glyphIndexArray as $cid => $gid) {\n                        if ($cid >= 0 && $cid < 0xFFFF && $gid) {\n                            $cidtogid[$cid * 2] = chr($gid >> 8);\n                            $cidtogid[$cid * 2 + 1] = chr($gid & 0xFF);\n                        }\n\n                        $width = $font_obj->normalizeFUnit(isset($hmtx[$gid]) ? $hmtx[$gid][0] : $hmtx[0][0]);\n                        $font['CIDWidths'][$cid] = $width;\n                    }\n\n                    $font['CIDtoGID'] = base64_encode(gzcompress($cidtogid));\n                    $font['CIDtoGID_Compressed'] = true;\n\n                    $data = file_get_contents($tmp_name);\n                } else {\n                    $data = file_get_contents($fbfile);\n                }\n\n                $font_obj->close();\n                unlink($tmp_name);\n            }\n\n            // create the font descriptor\n            $this->numObj++;\n            $fontDescriptorId = $this->numObj;\n\n            $this->numObj++;\n            $pfbid = $this->numObj;\n\n            // determine flags (more than a little flakey, hopefully will not matter much)\n            $flags = 0;\n\n            if ($font['ItalicAngle'] != 0) {\n                $flags += pow(2, 6);\n            }\n\n            if ($font['IsFixedPitch'] === 'true') {\n                $flags += 1;\n            }\n\n            $flags += pow(2, 5); // assume non-sybolic\n            $list = [\n                'Ascent'       => 'Ascender',\n                'CapHeight'    => 'Ascender', //FIXME: php-font-lib is not grabbing this value, so we'll fake it and use the Ascender value // 'CapHeight'\n                'MissingWidth' => 'MissingWidth',\n                'Descent'      => 'Descender',\n                'FontBBox'     => 'FontBBox',\n                'ItalicAngle'  => 'ItalicAngle'\n            ];\n            $fdopt = [\n                'Flags'    => $flags,\n                'FontName' => $adobeFontName,\n                'StemV'    => $stemV\n            ];\n\n            foreach ($list as $k => $v) {\n                if (isset($font[$v])) {\n                    $fdopt[$k] = $font[$v];\n                }\n            }\n\n            if ($isPfbFont) {\n                $fdopt['FontFile'] = $pfbid;\n            } elseif ($isTtfFont) {\n                $fdopt['FontFile2'] = $pfbid;\n            }\n\n            $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt);\n\n            // embed the font program\n            $this->o_contents($this->numObj, 'new');\n            $this->objects[$pfbid]['c'] .= $data;\n\n            // determine the cruicial lengths within this file\n            if ($isPfbFont) {\n                $l1 = strpos($data, 'eexec') + 6;\n                $l2 = strpos($data, '00000000') - $l1;\n                $l3 = mb_strlen($data, '8bit') - $l2 - $l1;\n                $this->o_contents(\n                    $this->numObj,\n                    'add',\n                    ['Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3]\n                );\n            } elseif ($isTtfFont) {\n                $l1 = mb_strlen($data, '8bit');\n                $this->o_contents($this->numObj, 'add', ['Length1' => $l1]);\n            }\n\n            // tell the font object about all this new stuff\n            $options = [\n                'BaseFont'       => $adobeFontName,\n                'MissingWidth'   => $missing_width,\n                'Widths'         => $widthid,\n                'FirstChar'      => $firstChar,\n                'LastChar'       => $lastChar,\n                'FontDescriptor' => $fontDescriptorId\n            ];\n\n            if ($isTtfFont) {\n                $options['SubType'] = 'TrueType';\n            }\n\n            $this->addMessage(\"adding extra info to font.($fontObjId)\");\n\n            foreach ($options as $fk => $fv) {\n                $this->addMessage(\"$fk : $fv\");\n            }\n        }\n\n        return $options;\n    }\n\n    /**\n     * A toUnicode section, needed for unicode fonts\n     *\n     * @param $id\n     * @param $action\n     * @return null|string\n     */\n    protected function o_toUnicode($id, $action)\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = [\n                    't'    => 'toUnicode'\n                ];\n                break;\n            case 'add':\n                break;\n            case 'out':\n                $ordering = 'UCS';\n                $registry = 'Adobe';\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $ordering = $this->ARC4($ordering);\n                    $registry = $this->filterText($this->ARC4($registry), false, false);\n                }\n\n                $stream = <<<EOT\n/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo\n<</Registry ($registry)\n/Ordering ($ordering)\n/Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000> <FFFF>\nendcodespacerange\n1 beginbfrange\n<0000> <FFFF> <0000>\nendbfrange\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend\nEOT;\n\n                $res = \"\\n$id 0 obj\\n\";\n                $res .= \"<</Length \" . mb_strlen($stream, '8bit') . \" >>\\n\";\n                $res .= \"stream\\n\" . $stream . \"\\nendstream\" . \"\\nendobj\";;\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * a font descriptor, needed for including additional fonts\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_fontDescriptor($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'fontDescriptor', 'info' => $options];\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /FontDescriptor\\n\";\n                foreach ($o['info'] as $label => $value) {\n                    switch ($label) {\n                        case 'Ascent':\n                        case 'CapHeight':\n                        case 'Descent':\n                        case 'Flags':\n                        case 'ItalicAngle':\n                        case 'StemV':\n                        case 'AvgWidth':\n                        case 'Leading':\n                        case 'MaxWidth':\n                        case 'MissingWidth':\n                        case 'StemH':\n                        case 'XHeight':\n                        case 'CharSet':\n                            if (mb_strlen($value, '8bit')) {\n                                $res .= \"/$label $value\\n\";\n                            }\n\n                            break;\n                        case 'FontFile':\n                        case 'FontFile2':\n                        case 'FontFile3':\n                            $res .= \"/$label $value 0 R\\n\";\n                            break;\n\n                        case 'FontBBox':\n                            $res .= \"/$label [$value[0] $value[1] $value[2] $value[3]]\\n\";\n                            break;\n\n                        case 'FontName':\n                            $res .= \"/$label /$value\\n\";\n                            break;\n                    }\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * the font encoding\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_fontEncoding($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                // the options array should contain 'differences' and maybe 'encoding'\n                $this->objects[$id] = ['t' => 'fontEncoding', 'info' => $options];\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Encoding\\n\";\n                if (!isset($o['info']['encoding'])) {\n                    $o['info']['encoding'] = 'WinAnsiEncoding';\n                }\n\n                if ($o['info']['encoding'] !== 'none') {\n                    $res .= \"/BaseEncoding /\" . $o['info']['encoding'] . \"\\n\";\n                }\n\n                $res .= \"/Differences \\n[\";\n\n                $onum = -100;\n\n                foreach ($o['info']['differences'] as $num => $label) {\n                    if ($num != $onum + 1) {\n                        // we cannot make use of consecutive numbering\n                        $res .= \"\\n$num /$label\";\n                    } else {\n                        $res .= \" /$label\";\n                    }\n\n                    $onum = $num;\n                }\n\n                $res .= \"\\n]\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * a descendent cid font, needed for unicode fonts\n     *\n     * @param $id\n     * @param $action\n     * @param string|array $options\n     * @return null|string\n     */\n    protected function o_fontDescendentCID($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'fontDescendentCID', 'info' => $options];\n\n                // we need a CID system info section\n                $cidSystemInfoId = ++$this->numObj;\n                $this->o_cidSystemInfo($cidSystemInfoId, 'new');\n                $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId;\n\n                // and a CID to GID map\n                $cidToGidMapId = ++$this->numObj;\n                $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options);\n                $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId;\n                break;\n\n            case 'add':\n                foreach ($options as $k => $v) {\n                    switch ($k) {\n                        case 'BaseFont':\n                            $o['info']['name'] = $v;\n                            break;\n\n                        case 'FirstChar':\n                        case 'LastChar':\n                        case 'MissingWidth':\n                        case 'FontDescriptor':\n                        case 'SubType':\n                            $this->addMessage(\"o_fontDescendentCID $k : $v\");\n                            $o['info'][$k] = $v;\n                            break;\n                    }\n                }\n\n                // pass values down to cid to gid map\n                $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options);\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n\";\n                $res .= \"<</Type /Font\\n\";\n                $res .= \"/Subtype /CIDFontType2\\n\";\n                $res .= \"/BaseFont /\" . $o['info']['name'] . \"\\n\";\n                $res .= \"/CIDSystemInfo \" . $o['info']['cidSystemInfo'] . \" 0 R\\n\";\n                //      if (isset($o['info']['FirstChar'])) {\n                //        $res.= \"/FirstChar \".$o['info']['FirstChar'].\"\\n\";\n                //      }\n\n                //      if (isset($o['info']['LastChar'])) {\n                //        $res.= \"/LastChar \".$o['info']['LastChar'].\"\\n\";\n                //      }\n                if (isset($o['info']['FontDescriptor'])) {\n                    $res .= \"/FontDescriptor \" . $o['info']['FontDescriptor'] . \" 0 R\\n\";\n                }\n\n                if (isset($o['info']['MissingWidth'])) {\n                    $res .= \"/DW \" . $o['info']['MissingWidth'] . \"\\n\";\n                }\n\n                if (isset($o['info']['fontFileName']) && isset($this->fonts[$o['info']['fontFileName']]['CIDWidths'])) {\n                    $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths'];\n                    $w = '';\n                    foreach ($cid_widths as $cid => $width) {\n                        $w .= \"$cid [$width] \";\n                    }\n                    $res .= \"/W [$w]\\n\";\n                }\n\n                $res .= \"/CIDToGIDMap \" . $o['info']['cidToGidMap'] . \" 0 R\\n\";\n                $res .= \">>\\n\";\n                $res .= \"endobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * CID system info section, needed for unicode fonts\n     *\n     * @param $id\n     * @param $action\n     * @return null|string\n     */\n    protected function o_cidSystemInfo($id, $action)\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = [\n                    't' => 'cidSystemInfo'\n                ];\n                break;\n            case 'add':\n                break;\n            case 'out':\n                $ordering = 'UCS';\n                $registry = 'Adobe';\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $ordering = $this->ARC4($ordering);\n                    $registry = $this->ARC4($registry);\n                }\n\n\n                $res = \"\\n$id 0 obj\\n\";\n\n                $res .= '<</Registry (' . $registry . \")\\n\"; // A string identifying an issuer of character collections\n                $res .= '/Ordering (' . $ordering . \")\\n\"; // A string that uniquely names a character collection issued by a specific registry\n                $res .= \"/Supplement 0\\n\"; // The supplement number of the character collection.\n                $res .= \">>\";\n\n                $res .= \"\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * a font glyph to character map, needed for unicode fonts\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_fontGIDtoCIDMap($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'fontGIDtoCIDMap', 'info' => $options];\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n\";\n                $fontFileName = $o['info']['fontFileName'];\n                $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']);\n\n                $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) &&\n                    $this->fonts[$fontFileName]['CIDtoGID_Compressed'];\n\n                if (!$compressed && isset($o['raw'])) {\n                    $res .= $tmp;\n                } else {\n                    $res .= \"<<\";\n\n                    if (!$compressed && $this->compressionReady && $this->options['compression']) {\n                        // then implement ZLIB based compression on this content stream\n                        $compressed = true;\n                        $tmp = gzcompress($tmp, 6);\n                    }\n                    if ($compressed) {\n                        $res .= \"\\n/Filter /FlateDecode\";\n                    }\n\n                    if ($this->encrypted) {\n                        $this->encryptInit($id);\n                        $tmp = $this->ARC4($tmp);\n                    }\n\n                    $res .= \"\\n/Length \" . mb_strlen($tmp, '8bit') . \">>\\nstream\\n$tmp\\nendstream\";\n                }\n\n                $res .= \"\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * the document procset, solves some problems with printing to old PS printers\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_procset($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'procset', 'info' => ['PDF' => 1, 'Text' => 1]];\n                $this->o_pages($this->currentNode, 'procset', $id);\n                $this->procsetObjectId = $id;\n                break;\n\n            case 'add':\n                // this is to add new items to the procset list, despite the fact that this is considered\n                // obsolete, the items are required for printing to some postscript printers\n                switch ($options) {\n                    case 'ImageB':\n                    case 'ImageC':\n                    case 'ImageI':\n                        $o['info'][$options] = 1;\n                        break;\n                }\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n[\";\n                foreach ($o['info'] as $label => $val) {\n                    $res .= \"/$label \";\n                }\n                $res .= \"]\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * define the document information\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_info($id, $action, $options = '')\n    {\n        switch ($action) {\n            case 'new':\n                $this->infoObject = $id;\n                $date = 'D:' . @date('Ymd');\n                $this->objects[$id] = [\n                    't'    => 'info',\n                    'info' => [\n                        'Producer'      => 'CPDF (dompdf)',\n                        'CreationDate' => $date\n                    ]\n                ];\n                break;\n            case 'Title':\n            case 'Author':\n            case 'Subject':\n            case 'Keywords':\n            case 'Creator':\n            case 'Producer':\n            case 'CreationDate':\n            case 'ModDate':\n            case 'Trapped':\n                $this->objects[$id]['info'][$action] = $options;\n                break;\n\n            case 'out':\n                $encrypted = $this->encrypted;\n                if ($encrypted) {\n                    $this->encryptInit($id);\n                }\n\n                $res = \"\\n$id 0 obj\\n<<\\n\";\n                $o = &$this->objects[$id];\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"/$k (\";\n\n                    // dates must be outputted as-is, without Unicode transformations\n                    if ($k !== 'CreationDate' && $k !== 'ModDate') {\n                        $v = $this->filterText($v, true, false);\n                    }\n\n                    if ($encrypted) {\n                        $v = $this->ARC4($v);\n                    }\n\n                    $res .= $v;\n                    $res .= \")\\n\";\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * an action object, used to link to URLS initially\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_action($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                if (is_array($options)) {\n                    $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => $options['type']];\n                } else {\n                    // then assume a URI action\n                    $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => 'URI'];\n                }\n                break;\n\n            case 'out':\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                }\n\n                $res = \"\\n$id 0 obj\\n<< /Type /Action\";\n                switch ($o['type']) {\n                    case 'ilink':\n                        if (!isset($this->destinations[(string)$o['info']['label']])) {\n                            break;\n                        }\n\n                        // there will be an 'label' setting, this is the name of the destination\n                        $res .= \"\\n/S /GoTo\\n/D \" . $this->destinations[(string)$o['info']['label']] . \" 0 R\";\n                        break;\n\n                    case 'URI':\n                        $res .= \"\\n/S /URI\\n/URI (\";\n                        if ($this->encrypted) {\n                            $res .= $this->filterText($this->ARC4($o['info']), false, false);\n                        } else {\n                            $res .= $this->filterText($o['info'], false, false);\n                        }\n\n                        $res .= \")\";\n                        break;\n                }\n\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * an annotation object, this will add an annotation to the current page.\n     * initially will support just link annotations\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_annotation($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                // add the annotation to the current page\n                $pageId = $this->currentPage;\n                $this->o_page($pageId, 'annot', $id);\n\n                // and add the action object which is going to be required\n                switch ($options['type']) {\n                    case 'link':\n                        $this->objects[$id] = ['t' => 'annotation', 'info' => $options];\n                        $this->numObj++;\n                        $this->o_action($this->numObj, 'new', $options['url']);\n                        $this->objects[$id]['info']['actionId'] = $this->numObj;\n                        break;\n\n                    case 'ilink':\n                        // this is to a named internal link\n                        $label = $options['label'];\n                        $this->objects[$id] = ['t' => 'annotation', 'info' => $options];\n                        $this->numObj++;\n                        $this->o_action($this->numObj, 'new', ['type' => 'ilink', 'label' => $label]);\n                        $this->objects[$id]['info']['actionId'] = $this->numObj;\n                        break;\n                }\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Annot\";\n                switch ($o['info']['type']) {\n                    case 'link':\n                    case 'ilink':\n                        $res .= \"\\n/Subtype /Link\";\n                        break;\n                }\n                $res .= \"\\n/A \" . $o['info']['actionId'] . \" 0 R\";\n                $res .= \"\\n/Border [0 0 0]\";\n                $res .= \"\\n/H /I\";\n                $res .= \"\\n/Rect [ \";\n\n                foreach ($o['info']['rect'] as $v) {\n                    $res .= sprintf(\"%.4F \", $v);\n                }\n\n                $res .= \"]\";\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * a page object, it also creates a contents object to hold its contents\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_page($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->numPages++;\n                $this->objects[$id] = [\n                    't'    => 'page',\n                    'info' => [\n                        'parent'  => $this->currentNode,\n                        'pageNum' => $this->numPages,\n                        'mediaBox' => $this->objects[$this->currentNode]['info']['mediaBox']\n                    ]\n                ];\n\n                if (is_array($options)) {\n                    // then this must be a page insertion, array should contain 'rid','pos'=[before|after]\n                    $options['id'] = $id;\n                    $this->o_pages($this->currentNode, 'page', $options);\n                } else {\n                    $this->o_pages($this->currentNode, 'page', $id);\n                }\n\n                $this->currentPage = $id;\n                //make a contents object to go with this page\n                $this->numObj++;\n                $this->o_contents($this->numObj, 'new', $id);\n                $this->currentContents = $this->numObj;\n                $this->objects[$id]['info']['contents'] = [];\n                $this->objects[$id]['info']['contents'][] = $this->numObj;\n\n                $match = ($this->numPages % 2 ? 'odd' : 'even');\n                foreach ($this->addLooseObjects as $oId => $target) {\n                    if ($target === 'all' || $match === $target) {\n                        $this->objects[$id]['info']['contents'][] = $oId;\n                    }\n                }\n                break;\n\n            case 'content':\n                $o['info']['contents'][] = $options;\n                break;\n\n            case 'annot':\n                // add an annotation to this page\n                if (!isset($o['info']['annot'])) {\n                    $o['info']['annot'] = [];\n                }\n\n                // $options should contain the id of the annotation dictionary\n                $o['info']['annot'][] = $options;\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Page\";\n                if (isset($o['info']['mediaBox'])) {\n                    $tmp = $o['info']['mediaBox'];\n                    $res .= \"\\n/MediaBox [\" . sprintf(\n                            '%.3F %.3F %.3F %.3F',\n                            $tmp[0],\n                            $tmp[1],\n                            $tmp[2],\n                            $tmp[3]\n                        ) . ']';\n                }\n                $res .= \"\\n/Parent \" . $o['info']['parent'] . \" 0 R\";\n\n                if (isset($o['info']['annot'])) {\n                    $res .= \"\\n/Annots [\";\n                    foreach ($o['info']['annot'] as $aId) {\n                        $res .= \" $aId 0 R\";\n                    }\n                    $res .= \" ]\";\n                }\n\n                $count = count($o['info']['contents']);\n                if ($count == 1) {\n                    $res .= \"\\n/Contents \" . $o['info']['contents'][0] . \" 0 R\";\n                } else {\n                    if ($count > 1) {\n                        $res .= \"\\n/Contents [\\n\";\n\n                        // reverse the page contents so added objects are below normal content\n                        //foreach (array_reverse($o['info']['contents']) as $cId) {\n                        // Back to normal now that I've got transparency working --Benj\n                        foreach ($o['info']['contents'] as $cId) {\n                            $res .= \"$cId 0 R\\n\";\n                        }\n                        $res .= \"]\";\n                    }\n                }\n\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * the contents objects hold all of the content which appears on pages\n     *\n     * @param $id\n     * @param $action\n     * @param string|array $options\n     * @return null|string\n     */\n    protected function o_contents($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'contents', 'c' => '', 'info' => []];\n                if (mb_strlen($options, '8bit') && intval($options)) {\n                    // then this contents is the primary for a page\n                    $this->objects[$id]['onPage'] = $options;\n                } else {\n                    if ($options === 'raw') {\n                        // then this page contains some other type of system object\n                        $this->objects[$id]['raw'] = 1;\n                    }\n                }\n                break;\n\n            case 'add':\n                // add more options to the declaration\n                foreach ($options as $k => $v) {\n                    $o['info'][$k] = $v;\n                }\n\n            case 'out':\n                $tmp = $o['c'];\n                $res = \"\\n$id 0 obj\\n\";\n\n                if (isset($this->objects[$id]['raw'])) {\n                    $res .= $tmp;\n                } else {\n                    $res .= \"<<\";\n                    if ($this->compressionReady && $this->options['compression']) {\n                        // then implement ZLIB based compression on this content stream\n                        $res .= \" /Filter /FlateDecode\";\n                        $tmp = gzcompress($tmp, 6);\n                    }\n\n                    if ($this->encrypted) {\n                        $this->encryptInit($id);\n                        $tmp = $this->ARC4($tmp);\n                    }\n\n                    foreach ($o['info'] as $k => $v) {\n                        $res .= \"\\n/$k $v\";\n                    }\n\n                    $res .= \"\\n/Length \" . mb_strlen($tmp, '8bit') . \" >>\\nstream\\n$tmp\\nendstream\";\n                }\n\n                $res .= \"\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $id\n     * @param $action\n     * @return string|null\n     */\n    protected function o_embedjs($id, $action)\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = [\n                    't'    => 'embedjs',\n                    'info' => [\n                        'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]'\n                    ]\n                ];\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<< \";\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $id\n     * @param $action\n     * @param string $code\n     * @return null|string\n     */\n    protected function o_javascript($id, $action, $code = '')\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = [\n                    't'    => 'javascript',\n                    'info' => [\n                        'S'  => '/JavaScript',\n                        'JS' => '(' . $this->filterText($code, true, false) . ')',\n                    ]\n                ];\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<< \";\n\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * an image object, will be an XObject in the document, includes description and data\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_image($id, $action, $options = '')\n    {\n        switch ($action) {\n            case 'new':\n                // make the new object\n                $this->objects[$id] = ['t' => 'image', 'data' => &$options['data'], 'info' => []];\n\n                $info =& $this->objects[$id]['info'];\n\n                $info['Type'] = '/XObject';\n                $info['Subtype'] = '/Image';\n                $info['Width'] = $options['iw'];\n                $info['Height'] = $options['ih'];\n\n                if (isset($options['masked']) && $options['masked']) {\n                    $info['SMask'] = ($this->numObj - 1) . ' 0 R';\n                }\n\n                if (!isset($options['type']) || $options['type'] === 'jpg') {\n                    if (!isset($options['channels'])) {\n                        $options['channels'] = 3;\n                    }\n\n                    switch ($options['channels']) {\n                        case 1:\n                            $info['ColorSpace'] = '/DeviceGray';\n                            break;\n                        case 4:\n                            $info['ColorSpace'] = '/DeviceCMYK';\n                            break;\n                        default:\n                            $info['ColorSpace'] = '/DeviceRGB';\n                            break;\n                    }\n\n                    if ($info['ColorSpace'] === '/DeviceCMYK') {\n                        $info['Decode'] = '[1 0 1 0 1 0 1 0]';\n                    }\n\n                    $info['Filter'] = '/DCTDecode';\n                    $info['BitsPerComponent'] = 8;\n                } else {\n                    if ($options['type'] === 'png') {\n                        $info['Filter'] = '/FlateDecode';\n                        $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>';\n\n                        if ($options['isMask']) {\n                            $info['ColorSpace'] = '/DeviceGray';\n                        } else {\n                            if (mb_strlen($options['pdata'], '8bit')) {\n                                $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' ';\n                                $this->numObj++;\n                                $this->o_contents($this->numObj, 'new');\n                                $this->objects[$this->numObj]['c'] = $options['pdata'];\n                                $tmp .= $this->numObj . ' 0 R';\n                                $tmp .= ' ]';\n                                $info['ColorSpace'] = $tmp;\n\n                                if (isset($options['transparency'])) {\n                                    $transparency = $options['transparency'];\n                                    switch ($transparency['type']) {\n                                        case 'indexed':\n                                            $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n\n                                        case 'color-key':\n                                            $tmp = ' [ ' .\n                                                $transparency['r'] . ' ' . $transparency['r'] .\n                                                $transparency['g'] . ' ' . $transparency['g'] .\n                                                $transparency['b'] . ' ' . $transparency['b'] .\n                                                ' ] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n                                    }\n                                }\n                            } else {\n                                if (isset($options['transparency'])) {\n                                    $transparency = $options['transparency'];\n\n                                    switch ($transparency['type']) {\n                                        case 'indexed':\n                                            $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n\n                                        case 'color-key':\n                                            $tmp = ' [ ' .\n                                                $transparency['r'] . ' ' . $transparency['r'] . ' ' .\n                                                $transparency['g'] . ' ' . $transparency['g'] . ' ' .\n                                                $transparency['b'] . ' ' . $transparency['b'] .\n                                                ' ] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n                                    }\n                                }\n                                $info['ColorSpace'] = '/' . $options['color'];\n                            }\n                        }\n\n                        $info['BitsPerComponent'] = $options['bitsPerComponent'];\n                    }\n                }\n\n                // assign it a place in the named resource dictionary as an external object, according to\n                // the label passed in with it.\n                $this->o_pages($this->currentNode, 'xObject', ['label' => $options['label'], 'objNum' => $id]);\n\n                // also make sure that we have the right procset object for it.\n                $this->o_procset($this->procsetObjectId, 'add', 'ImageC');\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n                $tmp = &$o['data'];\n                $res = \"\\n$id 0 obj\\n<<\";\n\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $tmp = $this->ARC4($tmp);\n                }\n\n                $res .= \"\\n/Length \" . mb_strlen($tmp, '8bit') . \">>\\nstream\\n$tmp\\nendstream\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * graphics state object\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_extGState($id, $action, $options = \"\")\n    {\n        static $valid_params = [\n            \"LW\",\n            \"LC\",\n            \"LC\",\n            \"LJ\",\n            \"ML\",\n            \"D\",\n            \"RI\",\n            \"OP\",\n            \"op\",\n            \"OPM\",\n            \"Font\",\n            \"BG\",\n            \"BG2\",\n            \"UCR\",\n            \"TR\",\n            \"TR2\",\n            \"HT\",\n            \"FL\",\n            \"SM\",\n            \"SA\",\n            \"BM\",\n            \"SMask\",\n            \"CA\",\n            \"ca\",\n            \"AIS\",\n            \"TK\"\n        ];\n\n        switch ($action) {\n            case \"new\":\n                $this->objects[$id] = ['t' => 'extGState', 'info' => $options];\n\n                // Tell the pages about the new resource\n                $this->numStates++;\n                $this->o_pages($this->currentNode, 'extGState', [\"objNum\" => $id, \"stateNum\" => $this->numStates]);\n                break;\n\n            case \"out\":\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<< /Type /ExtGState\\n\";\n\n                foreach ($o[\"info\"] as $k => $v) {\n                    if (!in_array($k, $valid_params)) {\n                        continue;\n                    }\n                    $res .= \"/$k $v\\n\";\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param integer $id\n     * @param string $action\n     * @param mixed $options\n     * @return string\n     */\n    protected function o_xobject($id, $action, $options = '')\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'xobject', 'info' => $options, 'c' => ''];\n                break;\n\n            case 'procset':\n                $this->objects[$id]['procset'] = $options;\n                break;\n\n            case 'font':\n                $this->objects[$id]['fonts'][$options['fontNum']] = [\n                  'objNum' => $options['objNum'],\n                  'fontNum' => $options['fontNum']\n                ];\n                break;\n\n            case 'xObject':\n                $this->objects[$id]['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']];\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<< /Type /XObject\\n\";\n\n                foreach ($o[\"info\"] as $k => $v) {\n                    switch($k)\n                    {\n                        case 'Subtype':\n                            $res .= \"/Subtype /$v\\n\";\n                            break;\n                        case 'bbox':\n                            $res .= \"/BBox [\";\n                            foreach ($v as $value) {\n                                $res .= sprintf(\"%.4F \", $value);\n                            }\n                            $res .= \"]\\n\";\n                            break;\n                        default:\n                            $res .= \"/$k $v\\n\";\n                            break;\n                    }\n                }\n                $res .= \"/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]\\n\";\n\n                $res .= \"/Resources <<\";\n                if (isset($o['procset'])) {\n                    $res .= \"\\n/ProcSet \" . $o['procset'] . \" 0 R\";\n                } else {\n                    $res .= \"\\n/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]\";\n                }\n                if (isset($o['fonts']) && count($o['fonts'])) {\n                    $res .= \"\\n/Font << \";\n                    foreach ($o['fonts'] as $finfo) {\n                        $res .= \"\\n/F\" . $finfo['fontNum'] . \" \" . $finfo['objNum'] . \" 0 R\";\n                    }\n                    $res .= \"\\n>>\";\n                }\n                if (isset($o['xObjects']) && count($o['xObjects'])) {\n                    $res .= \"\\n/XObject << \";\n                    foreach ($o['xObjects'] as $finfo) {\n                        $res .= \"\\n/\" . $finfo['label'] . \" \" . $finfo['objNum'] . \" 0 R\";\n                    }\n                    $res .= \"\\n>>\";\n                }\n                $res .= \"\\n>>\\n\";\n\n                $tmp = $o[\"c\"];\n                if ($this->compressionReady && $this->options['compression']) {\n                    // then implement ZLIB based compression on this content stream\n                    $res .= \" /Filter /FlateDecode\\n\";\n                    $tmp = gzcompress($tmp, 6);\n                }\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $tmp = $this->ARC4($tmp);\n                }\n\n                $res .= \"/Length \" . mb_strlen($tmp, '8bit') . \" >>\\n\";\n                $res .= \"stream\\n\" . $tmp . \"\\nendstream\" . \"\\nendobj\";;\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_acroform($id, $action, $options = '')\n    {\n        switch ($action) {\n            case \"new\":\n                $this->o_catalog($this->catalogId, 'acroform', $id);\n                $this->objects[$id] = array('t' => 'acroform', 'info' => $options);\n                break;\n\n            case 'addfield':\n                $this->objects[$id]['info']['Fields'][] = $options;\n                break;\n\n            case 'font':\n                $this->objects[$id]['fonts'][$options['fontNum']] = [\n                  'objNum' => $options['objNum'],\n                  'fontNum' => $options['fontNum']\n                ];\n                break;\n\n            case \"out\":\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<<\";\n\n                foreach ($o[\"info\"] as $k => $v) {\n                    switch($k) {\n                        case 'Fields':\n                            $res .= \" /Fields [\";\n                            foreach ($v as $i) {\n                                $res .= \"$i 0 R \";\n                            }\n                            $res .= \"]\\n\";\n                            break;\n                        default:\n                            $res .= \"/$k $v\\n\";\n                    }\n                }\n\n                $res .= \"/DR <<\\n\";\n                if (isset($o['fonts']) && count($o['fonts'])) {\n                    $res .= \"/Font << \\n\";\n                    foreach ($o['fonts'] as $finfo) {\n                        $res .= \"/F\" . $finfo['fontNum'] . \" \" . $finfo['objNum'] . \" 0 R\\n\";\n                    }\n                    $res .= \">>\\n\";\n                }\n                $res .= \">>\\n\";\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $id\n     * @param $action\n     * @param mixed $options\n     * @return null|string\n     */\n    protected function o_field($id, $action, $options = '')\n    {\n        switch ($action) {\n            case \"new\":\n                $this->o_page($options['pageid'], 'annot', $id);\n                $this->o_acroform($this->acroFormId, 'addfield', $id);\n                $this->objects[$id] = ['t' => 'field', 'info' => $options];\n                break;\n\n            case 'set':\n                $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options);\n                break;\n\n            case \"out\":\n                $o = &$this->objects[$id];\n                $res = \"\\n$id 0 obj\\n<< /Type /Annot /Subtype /Widget \\n\";\n\n                $encrypted = $this->encrypted;\n                if ($encrypted) {\n                    $this->encryptInit($id);\n                }\n\n                foreach ($o[\"info\"] as $k => $v) {\n                    switch ($k) {\n                        case 'pageid':\n                            $res .= \"/P $v 0 R\\n\";\n                            break;\n                        case 'value':\n                            if ($encrypted) {\n                                $v = $this->filterText($this->ARC4($v), false, false);\n                            }\n                            $res .= \"/V ($v)\\n\";\n                            break;\n                        case 'refvalue':\n                            $res .= \"/V $v 0 R\\n\";\n                            break;\n                        case 'da':\n                            if ($encrypted) {\n                                $v = $this->filterText($this->ARC4($v), false, false);\n                            }\n                            $res .= \"/DA ($v)\\n\";\n                            break;\n                        case 'options':\n                            $res .= \"/Opt [\\n\";\n                            foreach ($v as $opt) {\n                                if ($encrypted) {\n                                    $opt = $this->filterText($this->ARC4($opt), false, false);\n                                }\n                                $res .= \"($opt)\\n\";\n                            }\n                            $res .= \"]\\n\";\n                            break;\n                        case 'rect':\n                            $res .= \"/Rect [\";\n                            foreach ($v as $value) {\n                                $res .= sprintf(\"%.4F \", $value);\n                            }\n                            $res .= \"]\\n\";\n                            break;\n                        case 'appearance':\n                            $res .= \"/AP << \";\n                            foreach ($v as $a => $ref) {\n                                $res .= \"/$a $ref 0 R \";\n                            }\n                            $res .= \">>\\n\";\n                            break;\n                        case 'T':\n                            if($encrypted) {\n                                $v = $this->filterText($this->ARC4($v), false, false);\n                            }\n                            $res .= \"/T ($v)\\n\";\n                            break;\n                        default:\n                            $res .= \"/$k $v\\n\";\n                    }\n\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return null|string\n     */\n    protected function o_sig($id, $action, $options = '')\n    {\n        $sign_maxlen = $this->signatureMaxLen;\n\n        switch ($action) {\n            case \"new\":\n                $this->objects[$id] = array('t' => 'sig', 'info' => $options);\n                $this->byteRange[$id] = ['t' => 'sig'];\n                break;\n\n            case 'byterange':\n                $o = &$this->objects[$id];\n                $content =& $options['content'];\n                $content_len = strlen($content);\n                $pos = strpos($content, sprintf(\"/ByteRange [ %'.010d\", $id));\n                $len = strlen('/ByteRange [ ********** ********** ********** ********** ]');\n                $rangeStartPos = $pos + $len + 1 + 10; // before '<'\n                $content = substr_replace($content, str_pad(sprintf('/ByteRange [ 0 %u %u %u ]', $rangeStartPos, $rangeStartPos + $sign_maxlen + 2, $content_len - 2 - $sign_maxlen - $rangeStartPos ), $len, ' ', STR_PAD_RIGHT), $pos, $len);\n\n                $fuid = uniqid();\n                $tmpInput = $this->tmp . \"/pkcs7.tmp.\" . $fuid . '.in';\n                $tmpOutput = $this->tmp . \"/pkcs7.tmp.\" . $fuid . '.out';\n\n                if (file_put_contents($tmpInput, substr($content, 0, $rangeStartPos)) === false) {\n                    throw new \\Exception(\"Unable to write temporary file for signing.\");\n                }\n                if (file_put_contents($tmpInput, substr($content, $rangeStartPos + 2 + $sign_maxlen),\n                    FILE_APPEND) === false) {\n                    throw new \\Exception(\"Unable to write temporary file for signing.\");\n                }\n\n                if (openssl_pkcs7_sign($tmpInput, $tmpOutput,\n                    $o['info']['SignCert'],\n                    array($o['info']['PrivKey'], $o['info']['Password']),\n                    array(), PKCS7_BINARY | PKCS7_DETACHED) === false) {\n                    throw new \\Exception(\"Failed to prepare signature.\");\n                }\n\n                $signature = file_get_contents($tmpOutput);\n\n                unlink($tmpInput);\n                unlink($tmpOutput);\n\n                $sign = substr($signature, (strpos($signature, \"%%EOF\\n\\n------\") + 13));\n                list($head, $signature) = explode(\"\\n\\n\", $sign);\n\n                $signature = base64_decode(trim($signature));\n\n                $signature = current(unpack('H*', $signature));\n                $signature = str_pad($signature, $sign_maxlen, '0');\n                $siglen = strlen($signature);\n                if (strlen($signature) > $sign_maxlen) {\n                    throw new \\Exception(\"Signature length ($siglen) exceeds the $sign_maxlen limit.\");\n                }\n\n                $content = substr_replace($content, $signature, $rangeStartPos + 1, $sign_maxlen);\n                break;\n\n            case \"out\":\n                $res = \"\\n$id 0 obj\\n<<\\n\";\n\n                $encrypted = $this->encrypted;\n                if ($encrypted) {\n                    $this->encryptInit($id);\n                }\n\n                $res .= \"/ByteRange \" .sprintf(\"[ %'.010d ********** ********** ********** ]\\n\", $id);\n                $res .= \"/Contents <\" . str_pad('', $sign_maxlen, '0') . \">\\n\";\n                $res .= \"/Filter/Adobe.PPKLite\\n\"; //PPKMS \\n\";\n                $res .= \"/Type/Sig/SubFilter/adbe.pkcs7.detached \\n\";\n\n                $date = \"D:\" . substr_replace(date('YmdHisO'), '\\'', -2, 0) . '\\'';\n                if ($encrypted) {\n                    $date = $this->ARC4($date);\n                }\n\n                $res .= \"/M ($date)\\n\";\n                $res .= \"/Prop_Build << /App << /Name /DomPDF >> /Filter << /Name /Adobe.PPKLite >> >>\\n\";\n\n                $o = &$this->objects[$id];\n                foreach ($o['info'] as $k => $v) {\n                    switch($k) {\n                        case 'Name':\n                        case 'Location':\n                        case 'Reason':\n                        case 'ContactInfo':\n                            if ($v !== null && $v !== '') {\n                                $res .= \"/$k (\" .\n                                  ($encrypted ? $this->filterText($this->ARC4($v), false, false) : $v) . \") \\n\";\n                            }\n                            break;\n                    }\n                }\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * encryption object.\n     *\n     * @param $id\n     * @param $action\n     * @param string $options\n     * @return string|null\n     */\n    protected function o_encryption($id, $action, $options = '')\n    {\n        switch ($action) {\n            case 'new':\n                // make the new object\n                $this->objects[$id] = ['t' => 'encryption', 'info' => $options];\n                $this->arc4_objnum = $id;\n                break;\n\n            case 'keys':\n                // figure out the additional parameters required\n                $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41)\n                    . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08)\n                    . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80)\n                    . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A);\n\n                $info = $this->objects[$id]['info'];\n\n                $len = mb_strlen($info['owner'], '8bit');\n\n                if ($len > 32) {\n                    $owner = substr($info['owner'], 0, 32);\n                } else {\n                    if ($len < 32) {\n                        $owner = $info['owner'] . substr($pad, 0, 32 - $len);\n                    } else {\n                        $owner = $info['owner'];\n                    }\n                }\n\n                $len = mb_strlen($info['user'], '8bit');\n                if ($len > 32) {\n                    $user = substr($info['user'], 0, 32);\n                } else {\n                    if ($len < 32) {\n                        $user = $info['user'] . substr($pad, 0, 32 - $len);\n                    } else {\n                        $user = $info['user'];\n                    }\n                }\n\n                $tmp = $this->md5_16($owner);\n                $okey = substr($tmp, 0, 5);\n                $this->ARC4_init($okey);\n                $ovalue = $this->ARC4($user);\n                $this->objects[$id]['info']['O'] = $ovalue;\n\n                // now make the u value, phew.\n                $tmp = $this->md5_16(\n                    $user . $ovalue . chr($info['p']) . chr(255) . chr(255) . chr(255) . hex2bin($this->fileIdentifier)\n                );\n\n                $ukey = substr($tmp, 0, 5);\n                $this->ARC4_init($ukey);\n                $this->encryptionKey = $ukey;\n                $this->encrypted = true;\n                $uvalue = $this->ARC4($pad);\n                $this->objects[$id]['info']['U'] = $uvalue;\n                // initialize the arc4 array\n                break;\n\n            case 'out':\n                $o = &$this->objects[$id];\n\n                $res = \"\\n$id 0 obj\\n<<\";\n                $res .= \"\\n/Filter /Standard\";\n                $res .= \"\\n/V 1\";\n                $res .= \"\\n/R 2\";\n                $res .= \"\\n/O (\" . $this->filterText($o['info']['O'], false, false) . ')';\n                $res .= \"\\n/U (\" . $this->filterText($o['info']['U'], false, false) . ')';\n                // and the p-value needs to be converted to account for the twos-complement approach\n                $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1;\n                $res .= \"\\n/P \" . ($o['info']['p']);\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    protected function o_indirect_references($id, $action, $options = null)\n    {\n        switch ($action) {\n            case 'new':\n            case 'add':\n                if ($id === 0) {\n                    $id = ++$this->numObj;\n                    $this->o_catalog($this->catalogId, 'names', $id);\n                    $this->objects[$id] = ['t' => 'indirect_references', 'info' => $options];\n                    $this->indirectReferenceId = $id;\n                } else {\n                    $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options);\n                }\n                break;\n            case 'out':\n                $res = \"\\n$id 0 obj << \";\n\n                foreach($this->objects[$id]['info'] as $referenceObjName => $referenceObjId) {\n                    $res .= \"/$referenceObjName $referenceObjId 0 R \";\n                }\n\n                $res .= \">> endobj\";\n                return $res;\n        }\n\n        return null;\n    }\n\n    protected function o_names($id, $action, $options = null)\n    {\n        switch ($action) {\n            case 'new':\n            case 'add':\n                if ($id === 0) {\n                    $id = ++$this->numObj;\n                    $this->objects[$id] = ['t' => 'names', 'info' => [$options]];\n                    $this->o_indirect_references($this->indirectReferenceId, 'add', ['EmbeddedFiles' => $id]);\n                    $this->embeddedFilesId = $id;\n                } else {\n                    $this->objects[$id]['info'][] = $options;\n                }\n                break;\n            case 'out':\n                $info = &$this->objects[$id]['info'];\n                $res = '';\n                if (count($info) > 0) {\n                    $res = \"\\n$id 0 obj << /Names [ \";\n\n                    if ($this->encrypted) {\n                        $this->encryptInit($id);\n                    }\n\n                    foreach ($info as $entry) {\n                        if ($this->encrypted) {\n                            $filename = $this->ARC4($entry['filename']);\n                        } else {\n                            $filename = $entry['filename'];\n                        }\n\n                        $res .= \"($filename) \" . $entry['dict_reference'] . \" 0 R \";\n                    }\n\n                    $res .= \"] >> endobj\";\n                }\n                return $res;\n        }\n\n        return null;\n    }\n\n    protected function o_embedded_file_dictionary($id, $action, $options = null)\n    {\n        switch ($action) {\n            case 'new':\n                $embeddedFileId = ++$this->numObj;\n                $options['embedded_reference'] = $embeddedFileId;\n                $this->objects[$id] = ['t' => 'embedded_file_dictionary', 'info' => $options];\n                $this->o_embedded_file($embeddedFileId, 'new', $options);\n                $options['dict_reference'] = $id;\n                $this->o_names($this->embeddedFilesId, 'add', $options);\n                break;\n            case 'out':\n                $info = &$this->objects[$id]['info'];\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $filename = $this->ARC4($info['filename']);\n                    $description = $this->ARC4($info['description']);\n                } else {\n                    $filename = $info['filename'];\n                    $description = $info['description'];\n                }\n\n                $res = \"\\n$id 0 obj <</Type /Filespec /EF\";\n                $res .= \" <</F \" . $info['embedded_reference'] . \" 0 R >>\";\n                $res .= \" /F ($filename) /UF ($filename) /Desc ($description)\";\n                $res .= \" >> endobj\";\n                return $res;\n        }\n\n        return null;\n    }\n\n    protected function o_embedded_file($id, $action, $options = null): ?string\n    {\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = ['t' => 'embedded_file', 'info' => $options];\n                break;\n            case 'out':\n                $info = &$this->objects[$id]['info'];\n\n                if ($this->compressionReady) {\n                    $filepath = $info['filepath'];\n                    $checksum = md5_file($filepath);\n                    $f = fopen($filepath, \"rb\");\n\n                    $file_content_compressed = '';\n                    $deflateContext = deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => 6]);\n                    while (($block = fread($f, 8192))) {\n                        $file_content_compressed .= deflate_add($deflateContext, $block, ZLIB_NO_FLUSH);\n                    }\n                    $file_content_compressed .= deflate_add($deflateContext, '', ZLIB_FINISH);\n                    $file_size_uncompressed = ftell($f);\n                    fclose($f);\n                } else {\n                    $file_content = file_get_contents($info['filepath']);\n                    $file_size_uncompressed = mb_strlen($file_content, '8bit');\n                    $checksum = md5($file_content);\n                }\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $checksum = $this->ARC4($checksum);\n                    $file_content_compressed = $this->ARC4($file_content_compressed);\n                }\n                $file_size_compressed = mb_strlen($file_content_compressed, '8bit');\n\n                $res = \"\\n$id 0 obj <</Params <</Size $file_size_uncompressed /CheckSum ($checksum) >>\" .\n                    \" /Type/EmbeddedFile /Filter/FlateDecode\" .\n                    \" /Length $file_size_compressed >> stream\\n$file_content_compressed\\nendstream\\nendobj\";\n\n                return $res;\n        }\n\n        return null;\n    }\n\n    /**\n     * ARC4 functions\n     * A series of function to implement ARC4 encoding in PHP\n     */\n\n    /**\n     * calculate the 16 byte version of the 128 bit md5 digest of the string\n     *\n     * @param $string\n     * @return string\n     */\n    function md5_16($string)\n    {\n        $tmp = md5($string);\n        $out = '';\n        for ($i = 0; $i <= 30; $i = $i + 2) {\n            $out .= chr(hexdec(substr($tmp, $i, 2)));\n        }\n\n        return $out;\n    }\n\n    /**\n     * initialize the encryption for processing a particular object\n     *\n     * @param $id\n     */\n    function encryptInit($id)\n    {\n        $tmp = $this->encryptionKey;\n        $hex = dechex($id);\n        if (mb_strlen($hex, '8bit') < 6) {\n            $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex;\n        }\n        $tmp .= chr(hexdec(substr($hex, 4, 2)))\n            . chr(hexdec(substr($hex, 2, 2)))\n            . chr(hexdec(substr($hex, 0, 2)))\n            . chr(0)\n            . chr(0)\n        ;\n        $key = $this->md5_16($tmp);\n        $this->ARC4_init(substr($key, 0, 10));\n    }\n\n    /**\n     * initialize the ARC4 encryption\n     *\n     * @param string $key\n     */\n    function ARC4_init($key = '')\n    {\n        $this->arc4 = '';\n\n        // setup the control array\n        if (mb_strlen($key, '8bit') == 0) {\n            return;\n        }\n\n        $k = '';\n        while (mb_strlen($k, '8bit') < 256) {\n            $k .= $key;\n        }\n\n        $k = substr($k, 0, 256);\n        for ($i = 0; $i < 256; $i++) {\n            $this->arc4 .= chr($i);\n        }\n\n        $j = 0;\n\n        for ($i = 0; $i < 256; $i++) {\n            $t = $this->arc4[$i];\n            $j = ($j + ord($t) + ord($k[$i])) % 256;\n            $this->arc4[$i] = $this->arc4[$j];\n            $this->arc4[$j] = $t;\n        }\n    }\n\n    /**\n     * ARC4 encrypt a text string\n     *\n     * @param $text\n     * @return string\n     */\n    function ARC4($text)\n    {\n        $len = mb_strlen($text, '8bit');\n        $a = 0;\n        $b = 0;\n        $c = $this->arc4;\n        $out = '';\n        for ($i = 0; $i < $len; $i++) {\n            $a = ($a + 1) % 256;\n            $t = $c[$a];\n            $b = ($b + ord($t)) % 256;\n            $c[$a] = $c[$b];\n            $c[$b] = $t;\n            $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]);\n            $out .= chr(ord($text[$i]) ^ $k);\n        }\n\n        return $out;\n    }\n\n    /**\n     * functions which can be called to adjust or add to the document\n     */\n\n    /**\n     * add a link in the document to an external URL\n     *\n     * @param $url\n     * @param $x0\n     * @param $y0\n     * @param $x1\n     * @param $y1\n     */\n    function addLink($url, $x0, $y0, $x1, $y1)\n    {\n        $this->numObj++;\n        $info = ['type' => 'link', 'url' => $url, 'rect' => [$x0, $y0, $x1, $y1]];\n        $this->o_annotation($this->numObj, 'new', $info);\n    }\n\n    /**\n     * add a link in the document to an internal destination (ie. within the document)\n     *\n     * @param $label\n     * @param $x0\n     * @param $y0\n     * @param $x1\n     * @param $y1\n     */\n    function addInternalLink($label, $x0, $y0, $x1, $y1)\n    {\n        $this->numObj++;\n        $info = ['type' => 'ilink', 'label' => $label, 'rect' => [$x0, $y0, $x1, $y1]];\n        $this->o_annotation($this->numObj, 'new', $info);\n    }\n\n    /**\n     * set the encryption of the document\n     * can be used to turn it on and/or set the passwords which it will have.\n     * also the functions that the user will have are set here, such as print, modify, add\n     *\n     * @param string $userPass\n     * @param string $ownerPass\n     * @param array $pc\n     */\n    function setEncryption($userPass = '', $ownerPass = '', $pc = [])\n    {\n        $p = bindec(\"11000000\");\n\n        $options = ['print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32];\n\n        foreach ($pc as $k => $v) {\n            if ($v && isset($options[$k])) {\n                $p += $options[$k];\n            } else {\n                if (isset($options[$v])) {\n                    $p += $options[$v];\n                }\n            }\n        }\n\n        // implement encryption on the document\n        if ($this->arc4_objnum == 0) {\n            // then the block does not exist already, add it.\n            $this->numObj++;\n            if (mb_strlen($ownerPass) == 0) {\n                $ownerPass = $userPass;\n            }\n\n            $this->o_encryption($this->numObj, 'new', ['user' => $userPass, 'owner' => $ownerPass, 'p' => $p]);\n        }\n    }\n\n    /**\n     * should be used for internal checks, not implemented as yet\n     */\n    function checkAllHere()\n    {\n    }\n\n    /**\n     * return the pdf stream as a string returned from the function\n     *\n     * @param bool $debug\n     * @return string\n     */\n    function output($debug = false)\n    {\n        if ($debug) {\n            // turn compression off\n            $this->options['compression'] = false;\n        }\n\n        if ($this->javascript) {\n            $this->numObj++;\n\n            $js_id = $this->numObj;\n            $this->o_embedjs($js_id, 'new');\n            $this->o_javascript(++$this->numObj, 'new', $this->javascript);\n\n            $id = $this->catalogId;\n\n            $this->o_indirect_references($this->indirectReferenceId, 'add', ['JavaScript' => $js_id]);\n        }\n\n        if ($this->fileIdentifier === '') {\n            $tmp = implode('', $this->objects[$this->infoObject]['info']);\n            $this->fileIdentifier = md5('DOMPDF' . __FILE__ . $tmp . microtime() . mt_rand());\n        }\n\n        if ($this->arc4_objnum) {\n            $this->o_encryption($this->arc4_objnum, 'keys');\n            $this->ARC4_init($this->encryptionKey);\n        }\n\n        $this->checkAllHere();\n\n        $xref = [];\n        $content = '%PDF-' . self::PDF_VERSION;\n        $pos = mb_strlen($content, '8bit');\n\n        // pre-process o_font objects before output of all objects\n        foreach ($this->objects as $k => $v) {\n            if ($v['t'] === 'font') {\n                $this->o_font($k, 'add');\n            }\n        }\n\n        foreach ($this->objects as $k => $v) {\n            $tmp = 'o_' . $v['t'];\n            $cont = $this->$tmp($k, 'out');\n            $content .= $cont;\n            $xref[] = $pos + 1; //+1 to account for \\n at the start of each object\n            $pos += mb_strlen($cont, '8bit');\n        }\n\n        $content .= \"\\nxref\\n0 \" . (count($xref) + 1) . \"\\n0000000000 65535 f \\n\";\n\n        foreach ($xref as $p) {\n            $content .= str_pad($p, 10, \"0\", STR_PAD_LEFT) . \" 00000 n \\n\";\n        }\n\n        $content .= \"trailer\\n<<\\n\" .\n            '/Size ' . (count($xref) + 1) . \"\\n\" .\n            '/Root 1 0 R' . \"\\n\" .\n            '/Info ' . $this->infoObject . \" 0 R\\n\"\n        ;\n\n        // if encryption has been applied to this document then add the marker for this dictionary\n        if ($this->arc4_objnum > 0) {\n            $content .= '/Encrypt ' . $this->arc4_objnum . \" 0 R\\n\";\n        }\n\n        $content .= '/ID[<' . $this->fileIdentifier . '><' . $this->fileIdentifier . \">]\\n\";\n\n        // account for \\n added at start of xref table\n        $pos++;\n\n        $content .= \">>\\nstartxref\\n$pos\\n%%EOF\\n\";\n\n        if (count($this->byteRange) > 0) {\n            foreach ($this->byteRange as $k => $v) {\n                $tmp = 'o_' . $v['t'];\n                $this->$tmp($k, 'byterange', ['content' => &$content]);\n            }\n        }\n\n        return $content;\n    }\n\n    /**\n     * initialize a new document\n     * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum\n     * this function is called automatically by the constructor function\n     *\n     * @param array $pageSize\n     */\n    private function newDocument($pageSize = [0, 0, 612, 792])\n    {\n        $this->numObj = 0;\n        $this->objects = [];\n\n        $this->numObj++;\n        $this->o_catalog($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_outlines($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_pages($this->numObj, 'new');\n\n        $this->o_pages($this->numObj, 'mediaBox', $pageSize);\n        $this->currentNode = 3;\n\n        $this->numObj++;\n        $this->o_procset($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_info($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_page($this->numObj, 'new');\n\n        // need to store the first page id as there is no way to get it to the user during\n        // startup\n        $this->firstPageId = $this->currentContents;\n    }\n\n    /**\n     * open the font file and return a php structure containing it.\n     * first check if this one has been done before and saved in a form more suited to php\n     * note that if a php serialized version does not exist it will try and make one, but will\n     * require write access to the directory to do it... it is MUCH faster to have these serialized\n     * files.\n     *\n     * @param $font\n     */\n    private function openFont($font)\n    {\n        // assume that $font contains the path and file but not the extension\n        $name = basename($font);\n        $dir = dirname($font) . '/';\n\n        $fontcache = $this->fontcache;\n        if ($fontcache == '') {\n            $fontcache = rtrim($dir, DIRECTORY_SEPARATOR.\"/\\\\\");\n        }\n\n        //$name       filename without folder and extension of font metrics\n        //$dir        folder of font metrics\n        //$fontcache  folder of runtime created php serialized version of font metrics.\n        //            If this is not given, the same folder as the font metrics will be used.\n        //            Storing and reusing serialized versions improves speed much\n\n        $this->addMessage(\"openFont: $font - $name\");\n\n        if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) {\n            $metrics_name = \"$name.afm\";\n        } else {\n            $metrics_name = \"$name.ufm\";\n        }\n\n        $cache_name = \"$metrics_name.php\";\n        $this->addMessage(\"metrics: $metrics_name, cache: $cache_name\");\n\n        if (file_exists($fontcache . '/' . $cache_name)) {\n            $this->addMessage(\"openFont: php file exists $fontcache/$cache_name\");\n            $this->fonts[$font] = require($fontcache . '/' . $cache_name);\n\n            if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) {\n                // if the font file is old, then clear it out and prepare for re-creation\n                $this->addMessage('openFont: clear out, make way for new version.');\n                $this->fonts[$font] = null;\n                unset($this->fonts[$font]);\n            }\n        } else {\n            $old_cache_name = \"php_$metrics_name\";\n            if (file_exists($fontcache . '/' . $old_cache_name)) {\n                $this->addMessage(\n                    \"openFont: php file doesn't exist $fontcache/$cache_name, creating it from the old format\"\n                );\n                $old_cache = file_get_contents($fontcache . '/' . $old_cache_name);\n                file_put_contents($fontcache . '/' . $cache_name, '<?php return ' . $old_cache . ';');\n\n                $this->openFont($font);\n                return;\n            }\n        }\n\n        if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) {\n            // then rebuild the php_<font>.afm file from the <font>.afm file\n            $this->addMessage(\"openFont: build php file from $dir$metrics_name\");\n            $data = [];\n\n            // 20 => 'space'\n            $data['codeToName'] = [];\n\n            // Since we're not going to enable Unicode for the core fonts we need to use a font-based\n            // setting for Unicode support rather than a global setting.\n            $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm');\n\n            $cidtogid = '';\n            if ($data['isUnicode']) {\n                $cidtogid = str_pad('', 256 * 256 * 2, \"\\x00\");\n            }\n\n            $file = file($dir . $metrics_name);\n\n            foreach ($file as $rowA) {\n                $row = trim($rowA);\n                $pos = strpos($row, ' ');\n\n                if ($pos) {\n                    // then there must be some keyword\n                    $key = substr($row, 0, $pos);\n                    switch ($key) {\n                        case 'FontName':\n                        case 'FullName':\n                        case 'FamilyName':\n                        case 'PostScriptName':\n                        case 'Weight':\n                        case 'ItalicAngle':\n                        case 'IsFixedPitch':\n                        case 'CharacterSet':\n                        case 'UnderlinePosition':\n                        case 'UnderlineThickness':\n                        case 'Version':\n                        case 'EncodingScheme':\n                        case 'CapHeight':\n                        case 'XHeight':\n                        case 'Ascender':\n                        case 'Descender':\n                        case 'StdHW':\n                        case 'StdVW':\n                        case 'StartCharMetrics':\n                        case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font.  Otherwise it's too big.\n                            $data[$key] = trim(substr($row, $pos));\n                            break;\n\n                        case 'FontBBox':\n                            $data[$key] = explode(' ', trim(substr($row, $pos)));\n                            break;\n\n                        //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;\n                        case 'C': // Found in AFM files\n                            $bits = explode(';', trim($row));\n                            $dtmp = ['C' => null, 'N' => null, 'WX' => null, 'B' => []];\n\n                            foreach ($bits as $bit) {\n                                $bits2 = explode(' ', trim($bit));\n                                if (mb_strlen($bits2[0], '8bit') == 0) {\n                                    continue;\n                                }\n\n                                if (count($bits2) > 2) {\n                                    $dtmp[$bits2[0]] = [];\n                                    for ($i = 1; $i < count($bits2); $i++) {\n                                        $dtmp[$bits2[0]][] = $bits2[$i];\n                                    }\n                                } else {\n                                    if (count($bits2) == 2) {\n                                        $dtmp[$bits2[0]] = $bits2[1];\n                                    }\n                                }\n                            }\n\n                            $c = (int)$dtmp['C'];\n                            $n = $dtmp['N'];\n                            $width = floatval($dtmp['WX']);\n\n                            if ($c >= 0) {\n                                if (!ctype_xdigit($n) || $c != hexdec($n)) {\n                                    $data['codeToName'][$c] = $n;\n                                }\n                                $data['C'][$c] = $width;\n                            } elseif (isset($n)) {\n                                $data['C'][$n] = $width;\n                            }\n\n                            if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') {\n                                $data['MissingWidth'] = $width;\n                            }\n\n                            break;\n\n                        // U 827 ; WX 0 ; N squaresubnosp ; G 675 ;\n                        case 'U': // Found in UFM files\n                            if (!$data['isUnicode']) {\n                                break;\n                            }\n\n                            $bits = explode(';', trim($row));\n                            $dtmp = ['G' => null, 'N' => null, 'U' => null, 'WX' => null];\n\n                            foreach ($bits as $bit) {\n                                $bits2 = explode(' ', trim($bit));\n                                if (mb_strlen($bits2[0], '8bit') === 0) {\n                                    continue;\n                                }\n\n                                if (count($bits2) > 2) {\n                                    $dtmp[$bits2[0]] = [];\n                                    for ($i = 1; $i < count($bits2); $i++) {\n                                        $dtmp[$bits2[0]][] = $bits2[$i];\n                                    }\n                                } else {\n                                    if (count($bits2) == 2) {\n                                        $dtmp[$bits2[0]] = $bits2[1];\n                                    }\n                                }\n                            }\n\n                            $c = (int)$dtmp['U'];\n                            $n = $dtmp['N'];\n                            $glyph = $dtmp['G'];\n                            $width = floatval($dtmp['WX']);\n\n                            if ($c >= 0) {\n                                // Set values in CID to GID map\n                                if ($c >= 0 && $c < 0xFFFF && $glyph) {\n                                    $cidtogid[$c * 2] = chr($glyph >> 8);\n                                    $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF);\n                                }\n\n                                if (!ctype_xdigit($n) || $c != hexdec($n)) {\n                                    $data['codeToName'][$c] = $n;\n                                }\n                                $data['C'][$c] = $width;\n                            } elseif (isset($n)) {\n                                $data['C'][$n] = $width;\n                            }\n\n                            if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') {\n                                $data['MissingWidth'] = $width;\n                            }\n\n                            break;\n\n                        case 'KPX':\n                            break; // don't include them as they are not used yet\n                            //KPX Adieresis yacute -40\n                            /*$bits = explode(' ', trim($row));\n                            $data['KPX'][$bits[1]][$bits[2]] = $bits[3];\n                            break;*/\n                    }\n                }\n            }\n\n            if ($this->compressionReady && $this->options['compression']) {\n                // then implement ZLIB based compression on CIDtoGID string\n                $data['CIDtoGID_Compressed'] = true;\n                $cidtogid = gzcompress($cidtogid, 6);\n            }\n            $data['CIDtoGID'] = base64_encode($cidtogid);\n            $data['_version_'] = $this->fontcacheVersion;\n            $this->fonts[$font] = $data;\n\n            //Because of potential trouble with php safe mode, expect that the folder already exists.\n            //If not existing, this will hit performance because of missing cached results.\n            if (is_dir($fontcache) && is_writable($fontcache)) {\n                file_put_contents($fontcache . '/' . $cache_name, '<?php return ' . var_export($data, true) . ';');\n            }\n            $data = null;\n        }\n\n        if (!isset($this->fonts[$font])) {\n            $this->addMessage(\"openFont: no font file found for $font. Do you need to run load_font.php?\");\n        }\n\n        //pre_r($this->messages);\n    }\n\n    /**\n     * if the font is not loaded then load it and make the required object\n     * else just make it the current font\n     * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding'\n     * note that encoding='none' will need to be used for symbolic fonts\n     * and 'differences' => an array of mappings between numbers 0->255 and character names.\n     *\n     * @param $fontName\n     * @param string $encoding\n     * @param bool $set\n     * @param bool $isSubsetting\n     * @return int\n     * @throws FontNotFoundException\n     */\n    function selectFont($fontName, $encoding = '', $set = true, $isSubsetting = true)\n    {\n        if ($fontName === null || $fontName === '') {\n            return $this->currentFontNum;\n        }\n\n        $ext = substr($fontName, -4);\n        if ($ext === '.afm' || $ext === '.ufm') {\n            $fontName = substr($fontName, 0, mb_strlen($fontName) - 4);\n        }\n\n        if (!isset($this->fonts[$fontName])) {\n            $this->addMessage(\"selectFont: selecting - $fontName - $encoding, $set\");\n\n            // load the file\n            $this->openFont($fontName);\n\n            if (isset($this->fonts[$fontName])) {\n                $this->numObj++;\n                $this->numFonts++;\n\n                $font = &$this->fonts[$fontName];\n\n                $name = basename($fontName);\n                $options = ['name' => $name, 'fontFileName' => $fontName, 'isSubsetting' => $isSubsetting];\n\n                if (is_array($encoding)) {\n                    // then encoding and differences might be set\n                    if (isset($encoding['encoding'])) {\n                        $options['encoding'] = $encoding['encoding'];\n                    }\n\n                    if (isset($encoding['differences'])) {\n                        $options['differences'] = $encoding['differences'];\n                    }\n                } else {\n                    if (mb_strlen($encoding, '8bit')) {\n                        // then perhaps only the encoding has been set\n                        $options['encoding'] = $encoding;\n                    }\n                }\n\n                $this->o_font($this->numObj, 'new', $options);\n\n                if (file_exists(\"$fontName.ttf\")) {\n                    $fileSuffix = 'ttf';\n                } elseif (file_exists(\"$fontName.TTF\")) {\n                    $fileSuffix = 'TTF';\n                } elseif (file_exists(\"$fontName.pfb\")) {\n                    $fileSuffix = 'pfb';\n                } elseif (file_exists(\"$fontName.PFB\")) {\n                    $fileSuffix = 'PFB';\n                } else {\n                    $fileSuffix = '';\n                }\n\n                $font['fileSuffix'] = $fileSuffix;\n\n                $font['fontNum'] = $this->numFonts;\n                $font['isSubsetting'] = $isSubsetting && $font['isUnicode'] && strtolower($fileSuffix) === 'ttf';\n\n                // also set the differences here, note that this means that these will take effect only the\n                //first time that a font is selected, else they are ignored\n                if (isset($options['differences'])) {\n                    $font['differences'] = $options['differences'];\n                }\n            }\n        }\n\n        if ($set && isset($this->fonts[$fontName])) {\n            // so if for some reason the font was not set in the last one then it will not be selected\n            $this->currentBaseFont = $fontName;\n\n            // the next lines mean that if a new font is selected, then the current text state will be\n            // applied to it as well.\n            $this->currentFont = $this->currentBaseFont;\n            $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];\n        }\n\n        return $this->currentFontNum;\n    }\n\n    /**\n     * sets up the current font, based on the font families, and the current text state\n     * note that this system is quite flexible, a bold-italic font can be completely different to a\n     * italic-bold font, and even bold-bold will have to be defined within the family to have meaning\n     * This function is to be called whenever the currentTextState is changed, it will update\n     * the currentFont setting to whatever the appropriate family one is.\n     * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont\n     * This function will change the currentFont to whatever it should be, but will not change the\n     * currentBaseFont.\n     */\n    private function setCurrentFont()\n    {\n        //   if (strlen($this->currentBaseFont) == 0){\n        //     // then assume an initial font\n        //     $this->selectFont($this->defaultFont);\n        //   }\n        //   $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1);\n        //   if (strlen($this->currentTextState)\n        //     && isset($this->fontFamilies[$cf])\n        //       && isset($this->fontFamilies[$cf][$this->currentTextState])){\n        //     // then we are in some state or another\n        //     // and this font has a family, and the current setting exists within it\n        //     // select the font, then return it\n        //     $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState];\n        //     $this->selectFont($nf,'',0);\n        //     $this->currentFont = $nf;\n        //     $this->currentFontNum = $this->fonts[$nf]['fontNum'];\n        //   } else {\n        //     // the this font must not have the right family member for the current state\n        //     // simply assume the base font\n        $this->currentFont = $this->currentBaseFont;\n        $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];\n        //  }\n    }\n\n    /**\n     * function for the user to find out what the ID is of the first page that was created during\n     * startup - useful if they wish to add something to it later.\n     *\n     * @return int\n     */\n    function getFirstPageId()\n    {\n        return $this->firstPageId;\n    }\n\n    /**\n     * add content to the currently active object\n     *\n     * @param $content\n     */\n    private function addContent($content)\n    {\n        $this->objects[$this->currentContents]['c'] .= $content;\n    }\n\n    /**\n     * sets the color for fill operations\n     *\n     * @param $color\n     * @param bool $force\n     */\n    function setColor($color, $force = false)\n    {\n        $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null];\n\n        if (!$force && $this->currentColor == $new_color) {\n            return;\n        }\n\n        if (isset($new_color[3])) {\n            $this->currentColor = $new_color;\n            $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F %.3F k\", $this->currentColor));\n        } else {\n            if (isset($new_color[2])) {\n                $this->currentColor = $new_color;\n                $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F rg\", $this->currentColor));\n            }\n        }\n    }\n\n    /**\n     * sets the color for fill operations\n     *\n     * @param $fillRule\n     */\n    function setFillRule($fillRule)\n    {\n        if (!in_array($fillRule, [\"nonzero\", \"evenodd\"])) {\n            return;\n        }\n\n        $this->fillRule = $fillRule;\n    }\n\n    /**\n     * sets the color for stroke operations\n     *\n     * @param $color\n     * @param bool $force\n     */\n    function setStrokeColor($color, $force = false)\n    {\n        $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null];\n\n        if (!$force && $this->currentStrokeColor == $new_color) {\n            return;\n        }\n\n        if (isset($new_color[3])) {\n            $this->currentStrokeColor = $new_color;\n            $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F %.3F K\", $this->currentStrokeColor));\n        } else {\n            if (isset($new_color[2])) {\n                $this->currentStrokeColor = $new_color;\n                $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F RG\", $this->currentStrokeColor));\n            }\n        }\n    }\n\n    /**\n     * Set the graphics state for compositions\n     *\n     * @param $parameters\n     */\n    function setGraphicsState($parameters)\n    {\n        // Create a new graphics state object if necessary\n        if (($gstate = array_search($parameters, $this->gstates)) === false) {\n            $this->numObj++;\n            $this->o_extGState($this->numObj, 'new', $parameters);\n            $gstate = $this->numStates;\n            $this->gstates[$gstate] = $parameters;\n        }\n        $this->addContent(\"\\n/GS$gstate gs\");\n    }\n\n    /**\n     * Set current blend mode & opacity for lines.\n     *\n     * Valid blend modes are:\n     *\n     * Normal, Multiply, Screen, Overlay, Darken, Lighten,\n     * ColorDogde, ColorBurn, HardLight, SoftLight, Difference,\n     * Exclusion\n     *\n     * @param string $mode    the blend mode to use\n     * @param float  $opacity 0.0 fully transparent, 1.0 fully opaque\n     */\n    function setLineTransparency($mode, $opacity)\n    {\n        static $blend_modes = [\n            \"Normal\",\n            \"Multiply\",\n            \"Screen\",\n            \"Overlay\",\n            \"Darken\",\n            \"Lighten\",\n            \"ColorDogde\",\n            \"ColorBurn\",\n            \"HardLight\",\n            \"SoftLight\",\n            \"Difference\",\n            \"Exclusion\"\n        ];\n\n        if (!in_array($mode, $blend_modes)) {\n            $mode = \"Normal\";\n        }\n\n        if (is_null($this->currentLineTransparency)) {\n            $this->currentLineTransparency = [];\n        }\n\n        if ($mode === (key_exists('mode', $this->currentLineTransparency) ?\n            $this->currentLineTransparency['mode'] : '') &&\n            $opacity === (key_exists('opacity', $this->currentLineTransparency) ?\n            $this->currentLineTransparency[\"opacity\"] : '')) {\n            return;\n        }\n\n        $this->currentLineTransparency[\"mode\"] = $mode;\n        $this->currentLineTransparency[\"opacity\"] = $opacity;\n\n        $options = [\n            \"BM\" => \"/$mode\",\n            \"CA\" => (float)$opacity\n        ];\n\n        $this->setGraphicsState($options);\n    }\n\n    /**\n     * Set current blend mode & opacity for filled objects.\n     *\n     * Valid blend modes are:\n     *\n     * Normal, Multiply, Screen, Overlay, Darken, Lighten,\n     * ColorDogde, ColorBurn, HardLight, SoftLight, Difference,\n     * Exclusion\n     *\n     * @param string $mode    the blend mode to use\n     * @param float  $opacity 0.0 fully transparent, 1.0 fully opaque\n     */\n    function setFillTransparency($mode, $opacity)\n    {\n        static $blend_modes = [\n            \"Normal\",\n            \"Multiply\",\n            \"Screen\",\n            \"Overlay\",\n            \"Darken\",\n            \"Lighten\",\n            \"ColorDogde\",\n            \"ColorBurn\",\n            \"HardLight\",\n            \"SoftLight\",\n            \"Difference\",\n            \"Exclusion\"\n        ];\n\n        if (!in_array($mode, $blend_modes)) {\n            $mode = \"Normal\";\n        }\n\n        if (is_null($this->currentFillTransparency)) {\n            $this->currentFillTransparency = [];\n        }\n\n        if ($mode === (key_exists('mode', $this->currentFillTransparency) ?\n            $this->currentFillTransparency['mode'] : '') &&\n            $opacity === (key_exists('opacity', $this->currentFillTransparency) ?\n            $this->currentFillTransparency[\"opacity\"] : '')) {\n            return;\n        }\n\n        $this->currentFillTransparency[\"mode\"] = $mode;\n        $this->currentFillTransparency[\"opacity\"] = $opacity;\n\n        $options = [\n            \"BM\" => \"/$mode\",\n            \"ca\" => (float)$opacity,\n        ];\n\n        $this->setGraphicsState($options);\n    }\n\n    /**\n     * draw a line from one set of coordinates to another\n     *\n     * @param $x1\n     * @param $y1\n     * @param $x2\n     * @param $y2\n     * @param bool $stroke\n     */\n    function line($x1, $y1, $x2, $y2, $stroke = true)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F m %.3F %.3F l\", $x1, $y1, $x2, $y2));\n\n        if ($stroke) {\n            $this->addContent(' S');\n        }\n    }\n\n    /**\n     * draw a bezier curve based on 4 control points\n     *\n     * @param $x0\n     * @param $y0\n     * @param $x1\n     * @param $y1\n     * @param $x2\n     * @param $y2\n     * @param $x3\n     * @param $y3\n     */\n    function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3)\n    {\n        // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points\n        // as the control points for the curve.\n        $this->addContent(\n            sprintf(\"\\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S\", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3)\n        );\n    }\n\n    /**\n     * draw a part of an ellipse\n     *\n     * @param $x0\n     * @param $y0\n     * @param $astart\n     * @param $afinish\n     * @param $r1\n     * @param int $r2\n     * @param int $angle\n     * @param int $nSeg\n     */\n    function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8)\n    {\n        $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false);\n    }\n\n    /**\n     * draw a filled ellipse\n     *\n     * @param $x0\n     * @param $y0\n     * @param $r1\n     * @param int $r2\n     * @param int $angle\n     * @param int $nSeg\n     * @param int $astart\n     * @param int $afinish\n     */\n    function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360)\n    {\n        $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true);\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     */\n    function lineTo($x, $y)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F l\", $x, $y));\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     */\n    function moveTo($x, $y)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F m\", $x, $y));\n    }\n\n    /**\n     * draw a bezier curve based on 4 control points\n     *\n     * @param $x1\n     * @param $y1\n     * @param $x2\n     * @param $y2\n     * @param $x3\n     * @param $y3\n     */\n    function curveTo($x1, $y1, $x2, $y2, $x3, $y3)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F %.3F %.3F c\", $x1, $y1, $x2, $y2, $x3, $y3));\n    }\n\n    /**\n     * draw a bezier curve based on 4 control points\n     */\n    function quadTo($cpx, $cpy, $x, $y)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F v\", $cpx, $cpy, $x, $y));\n    }\n\n    function closePath()\n    {\n        $this->addContent(' h');\n    }\n\n    function endPath()\n    {\n        $this->addContent(' n');\n    }\n\n    /**\n     * draw an ellipse\n     * note that the part and filled ellipse are just special cases of this function\n     *\n     * draws an ellipse in the current line style\n     * centered at $x0,$y0, radii $r1,$r2\n     * if $r2 is not set, then a circle is drawn\n     * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse.\n     * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a\n     * pretty crappy shape at 2, as we are approximating with bezier curves.\n     *\n     * @param $x0\n     * @param $y0\n     * @param $r1\n     * @param int $r2\n     * @param int $angle\n     * @param int $nSeg\n     * @param int $astart\n     * @param int $afinish\n     * @param bool $close\n     * @param bool $fill\n     * @param bool $stroke\n     * @param bool $incomplete\n     */\n    function ellipse(\n        $x0,\n        $y0,\n        $r1,\n        $r2 = 0,\n        $angle = 0,\n        $nSeg = 8,\n        $astart = 0,\n        $afinish = 360,\n        $close = true,\n        $fill = false,\n        $stroke = true,\n        $incomplete = false\n    ) {\n        if ($r1 == 0) {\n            return;\n        }\n\n        if ($r2 == 0) {\n            $r2 = $r1;\n        }\n\n        if ($nSeg < 2) {\n            $nSeg = 2;\n        }\n\n        $astart = deg2rad((float)$astart);\n        $afinish = deg2rad((float)$afinish);\n        $totalAngle = $afinish - $astart;\n\n        $dt = $totalAngle / $nSeg;\n        $dtm = $dt / 3;\n\n        if ($angle != 0) {\n            $a = -1 * deg2rad((float)$angle);\n\n            $this->addContent(\n                sprintf(\"\\n q %.3F %.3F %.3F %.3F %.3F %.3F cm\", cos($a), -sin($a), sin($a), cos($a), $x0, $y0)\n            );\n\n            $x0 = 0;\n            $y0 = 0;\n        }\n\n        $t1 = $astart;\n        $a0 = $x0 + $r1 * cos($t1);\n        $b0 = $y0 + $r2 * sin($t1);\n        $c0 = -$r1 * sin($t1);\n        $d0 = $r2 * cos($t1);\n\n        if (!$incomplete) {\n            $this->addContent(sprintf(\"\\n%.3F %.3F m \", $a0, $b0));\n        }\n\n        for ($i = 1; $i <= $nSeg; $i++) {\n            // draw this bit of the total curve\n            $t1 = $i * $dt + $astart;\n            $a1 = $x0 + $r1 * cos($t1);\n            $b1 = $y0 + $r2 * sin($t1);\n            $c1 = -$r1 * sin($t1);\n            $d1 = $r2 * cos($t1);\n\n            $this->addContent(\n                sprintf(\n                    \"\\n%.3F %.3F %.3F %.3F %.3F %.3F c\",\n                    ($a0 + $c0 * $dtm),\n                    ($b0 + $d0 * $dtm),\n                    ($a1 - $c1 * $dtm),\n                    ($b1 - $d1 * $dtm),\n                    $a1,\n                    $b1\n                )\n            );\n\n            $a0 = $a1;\n            $b0 = $b1;\n            $c0 = $c1;\n            $d0 = $d1;\n        }\n\n        if (!$incomplete) {\n            if ($fill) {\n                $this->addContent(' f');\n            }\n\n            if ($stroke) {\n                if ($close) {\n                    $this->addContent(' s'); // small 's' signifies closing the path as well\n                } else {\n                    $this->addContent(' S');\n                }\n            }\n        }\n\n        if ($angle != 0) {\n            $this->addContent(' Q');\n        }\n    }\n\n    /**\n     * this sets the line drawing style.\n     * width, is the thickness of the line in user units\n     * cap is the type of cap to put on the line, values can be 'butt','round','square'\n     *    where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the\n     *    end of the line.\n     * join can be 'miter', 'round', 'bevel'\n     * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the\n     *   on and off dashes.\n     *   (2) represents 2 on, 2 off, 2 on , 2 off ...\n     *   (2,1) is 2 on, 1 off, 2 on, 1 off.. etc\n     * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts.\n     *\n     * @param int $width\n     * @param string $cap\n     * @param string $join\n     * @param string $dash\n     * @param int $phase\n     */\n    function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0)\n    {\n        // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day\n        $string = '';\n\n        if ($width > 0) {\n            $string .= \"$width w\";\n        }\n\n        $ca = ['butt' => 0, 'round' => 1, 'square' => 2];\n\n        if (isset($ca[$cap])) {\n            $string .= \" $ca[$cap] J\";\n        }\n\n        $ja = ['miter' => 0, 'round' => 1, 'bevel' => 2];\n\n        if (isset($ja[$join])) {\n            $string .= \" $ja[$join] j\";\n        }\n\n        if (is_array($dash)) {\n            $string .= ' [ ' . implode(' ', $dash) . \" ] $phase d\";\n        }\n\n        $this->currentLineStyle = $string;\n        $this->addContent(\"\\n$string\");\n    }\n\n    /**\n     * draw a polygon, the syntax for this is similar to the GD polygon command\n     *\n     * @param $p\n     * @param $np\n     * @param bool $f\n     */\n    function polygon($p, $np, $f = false)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F m \", $p[0], $p[1]));\n\n        for ($i = 2; $i < $np * 2; $i = $i + 2) {\n            $this->addContent(sprintf(\"%.3F %.3F l \", $p[$i], $p[$i + 1]));\n        }\n\n        if ($f) {\n            $this->addContent(' f');\n        } else {\n            $this->addContent(' S');\n        }\n    }\n\n    /**\n     * a filled rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not\n     * the coordinates of the upper-right corner\n     *\n     * @param $x1\n     * @param $y1\n     * @param $width\n     * @param $height\n     */\n    function filledRectangle($x1, $y1, $width, $height)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F re f\", $x1, $y1, $width, $height));\n    }\n\n    /**\n     * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not\n     * the coordinates of the upper-right corner\n     *\n     * @param $x1\n     * @param $y1\n     * @param $width\n     * @param $height\n     */\n    function rectangle($x1, $y1, $width, $height)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F re S\", $x1, $y1, $width, $height));\n    }\n\n    /**\n     * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not\n     * the coordinates of the upper-right corner\n     *\n     * @param $x1\n     * @param $y1\n     * @param $width\n     * @param $height\n     */\n    function rect($x1, $y1, $width, $height)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F re\", $x1, $y1, $width, $height));\n    }\n\n    function stroke()\n    {\n        $this->addContent(\"\\nS\");\n    }\n\n    function fill()\n    {\n        $this->addContent(\"\\nf\" . ($this->fillRule === \"evenodd\" ? \"*\" : \"\"));\n    }\n\n    function fillStroke()\n    {\n        $this->addContent(\"\\nb\" . ($this->fillRule === \"evenodd\" ? \"*\" : \"\"));\n    }\n\n    /**\n     * @param string $subtype\n     * @param integer $x\n     * @param integer $y\n     * @param integer $w\n     * @param integer $h\n     * @return int\n     */\n    function addXObject($subtype, $x, $y, $w, $h)\n    {\n        $id = ++$this->numObj;\n        $this->o_xobject($id, 'new', ['Subtype' => $subtype, 'bbox' => [$x, $y, $w, $h]]);\n        return $id;\n    }\n\n    /**\n     * @param integer $numXObject\n     * @param string $type\n     * @param array $options\n     */\n    function setXObjectResource($numXObject, $type, $options)\n    {\n        if (in_array($type, ['procset', 'font', 'xObject'])) {\n            $this->o_xobject($numXObject, $type, $options);\n        }\n    }\n\n    /**\n     * add signature\n     *\n     * $fieldSigId = $cpdf->addFormField(Cpdf::ACROFORM_FIELD_SIG, 'Signature1', 0, 0, 0, 0, 0);\n     *\n     * $signatureId = $cpdf->addSignature([\n     *   'signcert' => file_get_contents('dompdf.crt'),\n     *   'privkey' => file_get_contents('dompdf.key'),\n     *   'password' => 'password',\n     *   'name' => 'DomPDF DEMO',\n     *   'location' => 'Home',\n     *   'reason' => 'First Form',\n     *   'contactinfo' => 'info'\n     * ]);\n     * $cpdf->setFormFieldValue($fieldSigId, \"$signatureId 0 R\");\n     *\n     * @param string $signcert\n     * @param string $privkey\n     * @param string $password\n     * @param string|null $name\n     * @param string|null $location\n     * @param string|null $reason\n     * @param string|null $contactinfo\n     * @return int\n     */\n    function addSignature($signcert, $privkey, $password = '', $name = null, $location = null, $reason = null, $contactinfo = null) {\n        $sigId = ++$this->numObj;\n        $this->o_sig($sigId, 'new', [\n          'SignCert' => $signcert,\n          'PrivKey' => $privkey,\n          'Password' => $password,\n          'Name' => $name,\n          'Location' => $location,\n          'Reason' => $reason,\n          'ContactInfo' => $contactinfo\n        ]);\n\n        return $sigId;\n    }\n\n    /**\n     * add field to form\n     *\n     * @param string $type ACROFORM_FIELD_*\n     * @param string $name\n     * @param $x0\n     * @param $y0\n     * @param $x1\n     * @param $y1\n     * @param integer $ff Field Flag ACROFORM_FIELD_*_*\n     * @param float $size\n     * @param array $color\n     * @return int\n     */\n    public function addFormField($type, $name, $x0, $y0, $x1, $y1, $ff = 0, $size = 10.0, $color = [0, 0, 0])\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $color = implode(' ', $color) . ' rg';\n\n        $currentFontNum = $this->currentFontNum;\n        $font = array_filter($this->objects[$this->currentNode]['info']['fonts'],\n          function($item) use ($currentFontNum) { return $item['fontNum'] == $currentFontNum; });\n\n        $this->o_acroform($this->acroFormId, 'font',\n          ['objNum' => $font[0]['objNum'], 'fontNum' => $font[0]['fontNum']]);\n\n        $fieldId = ++$this->numObj;\n        $this->o_field($fieldId, 'new', [\n          'rect' => [$x0, $y0, $x1, $y1],\n          'F' => 4,\n          'FT' => \"/$type\",\n          'T' => $name,\n          'Ff' => $ff,\n          'pageid' => $this->currentPage,\n          'da' => \"$color /F$this->currentFontNum \" . sprintf('%.1F Tf ', $size)\n        ]);\n\n        return $fieldId;\n    }\n\n    /**\n     * set Field value\n     *\n     * @param integer $numFieldObj\n     * @param string $value\n     */\n    public function setFormFieldValue($numFieldObj, $value)\n    {\n        $this->o_field($numFieldObj, 'set', ['value' => $value]);\n    }\n\n    /**\n     * set Field value (reference)\n     *\n     * @param integer $numFieldObj\n     * @param integer $numObj Object number\n     */\n    public function setFormFieldRefValue($numFieldObj, $numObj)\n    {\n        $this->o_field($numFieldObj, 'set', ['refvalue' => $numObj]);\n    }\n\n    /**\n     * set Field Appearanc (reference)\n     *\n     * @param integer $numFieldObj\n     * @param integer $normalNumObj\n     * @param integer|null $rolloverNumObj\n     * @param integer|null $downNumObj\n     */\n    public function setFormFieldAppearance($numFieldObj, $normalNumObj, $rolloverNumObj = null, $downNumObj = null)\n    {\n        $appearance['N'] = $normalNumObj;\n\n        if ($rolloverNumObj !== null) {\n            $appearance['R'] = $rolloverNumObj;\n        }\n\n        if ($downNumObj !== null) {\n            $appearance['D'] = $downNumObj;\n        }\n\n        $this->o_field($numFieldObj, 'set', ['appearance' => $appearance]);\n    }\n\n    /**\n     * set Choice Field option values\n     *\n     * @param integer $numFieldObj\n     * @param array $value\n     */\n    public function setFormFieldOpt($numFieldObj, $value)\n    {\n        $this->o_field($numFieldObj, 'set', ['options' => $value]);\n    }\n\n    /**\n     * add form to document\n     *\n     * @param integer $sigFlags\n     * @param boolean $needAppearances\n     */\n    public function addForm($sigFlags = 0, $needAppearances = false)\n    {\n        $this->acroFormId = ++$this->numObj;\n        $this->o_acroform($this->acroFormId, 'new', [\n          'NeedAppearances' => $needAppearances ? 'true' : 'false',\n          'SigFlags' => $sigFlags\n        ]);\n    }\n\n    /**\n     * save the current graphic state\n     */\n    function save()\n    {\n        // we must reset the color cache or it will keep bad colors after clipping\n        $this->currentColor = null;\n        $this->currentStrokeColor = null;\n        $this->addContent(\"\\nq\");\n    }\n\n    /**\n     * restore the last graphic state\n     */\n    function restore()\n    {\n        // we must reset the color cache or it will keep bad colors after clipping\n        $this->currentColor = null;\n        $this->currentStrokeColor = null;\n        $this->addContent(\"\\nQ\");\n    }\n\n    /**\n     * draw a clipping rectangle, all the elements added after this will be clipped\n     *\n     * @param $x1\n     * @param $y1\n     * @param $width\n     * @param $height\n     */\n    function clippingRectangle($x1, $y1, $width, $height)\n    {\n        $this->save();\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F re W n\", $x1, $y1, $width, $height));\n    }\n\n    /**\n     * draw a clipping rounded rectangle, all the elements added after this will be clipped\n     *\n     * @param $x1\n     * @param $y1\n     * @param $w\n     * @param $h\n     * @param $rTL\n     * @param $rTR\n     * @param $rBR\n     * @param $rBL\n     */\n    function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)\n    {\n        $this->save();\n\n        // start: top edge, left end\n        $this->addContent(sprintf(\"\\n%.3F %.3F m \", $x1, $y1 - $rTL + $h));\n\n        // line: bottom edge, left end\n        $this->addContent(sprintf(\"\\n%.3F %.3F l \", $x1, $y1 + $rBL));\n\n        // curve: bottom-left corner\n        $this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true);\n\n        // line: right edge, bottom end\n        $this->addContent(sprintf(\"\\n%.3F %.3F l \", $x1 + $w - $rBR, $y1));\n\n        // curve: bottom-right corner\n        $this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true);\n\n        // line: right edge, top end\n        $this->addContent(sprintf(\"\\n%.3F %.3F l \", $x1 + $w, $y1 + $h - $rTR));\n\n        // curve: bottom-right corner\n        $this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true);\n\n        // line: bottom edge, right end\n        $this->addContent(sprintf(\"\\n%.3F %.3F l \", $x1 + $rTL, $y1 + $h));\n\n        // curve: top-right corner\n        $this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true);\n\n        // line: top edge, left end\n        $this->addContent(sprintf(\"\\n%.3F %.3F l \", $x1 + $rBL, $y1));\n\n        // Close & clip\n        $this->addContent(\" W n\");\n    }\n\n    /**\n     * ends the last clipping shape\n     */\n    function clippingEnd()\n    {\n        $this->restore();\n    }\n\n    /**\n     * scale\n     *\n     * @param float $s_x scaling factor for width as percent\n     * @param float $s_y scaling factor for height as percent\n     * @param float $x   Origin abscissa\n     * @param float $y   Origin ordinate\n     */\n    function scale($s_x, $s_y, $x, $y)\n    {\n        $y = $this->currentPageSize[\"height\"] - $y;\n\n        $tm = [\n            $s_x,\n            0,\n            0,\n            $s_y,\n            $x * (1 - $s_x),\n            $y * (1 - $s_y)\n        ];\n\n        $this->transform($tm);\n    }\n\n    /**\n     * translate\n     *\n     * @param float $t_x movement to the right\n     * @param float $t_y movement to the bottom\n     */\n    function translate($t_x, $t_y)\n    {\n        $tm = [\n            1,\n            0,\n            0,\n            1,\n            $t_x,\n            -$t_y\n        ];\n\n        $this->transform($tm);\n    }\n\n    /**\n     * rotate\n     *\n     * @param float $angle angle in degrees for counter-clockwise rotation\n     * @param float $x     Origin abscissa\n     * @param float $y     Origin ordinate\n     */\n    function rotate($angle, $x, $y)\n    {\n        $y = $this->currentPageSize[\"height\"] - $y;\n\n        $a = deg2rad($angle);\n        $cos_a = cos($a);\n        $sin_a = sin($a);\n\n        $tm = [\n            $cos_a,\n            -$sin_a,\n            $sin_a,\n            $cos_a,\n            $x - $sin_a * $y - $cos_a * $x,\n            $y - $cos_a * $y + $sin_a * $x,\n        ];\n\n        $this->transform($tm);\n    }\n\n    /**\n     * skew\n     *\n     * @param float $angle_x\n     * @param float $angle_y\n     * @param float $x Origin abscissa\n     * @param float $y Origin ordinate\n     */\n    function skew($angle_x, $angle_y, $x, $y)\n    {\n        $y = $this->currentPageSize[\"height\"] - $y;\n\n        $tan_x = tan(deg2rad($angle_x));\n        $tan_y = tan(deg2rad($angle_y));\n\n        $tm = [\n            1,\n            -$tan_y,\n            -$tan_x,\n            1,\n            $tan_x * $y,\n            $tan_y * $x,\n        ];\n\n        $this->transform($tm);\n    }\n\n    /**\n     * apply graphic transformations\n     *\n     * @param array $tm transformation matrix\n     */\n    function transform($tm)\n    {\n        $this->addContent(vsprintf(\"\\n %.3F %.3F %.3F %.3F %.3F %.3F cm\", $tm));\n    }\n\n    /**\n     * add a new page to the document\n     * this also makes the new page the current active object\n     *\n     * @param int $insert\n     * @param int $id\n     * @param string $pos\n     * @return int\n     */\n    function newPage($insert = 0, $id = 0, $pos = 'after')\n    {\n        // if there is a state saved, then go up the stack closing them\n        // then on the new page, re-open them with the right setings\n\n        if ($this->nStateStack) {\n            for ($i = $this->nStateStack; $i >= 1; $i--) {\n                $this->restoreState($i);\n            }\n        }\n\n        $this->numObj++;\n\n        if ($insert) {\n            // the id from the ezPdf class is the id of the contents of the page, not the page object itself\n            // query that object to find the parent\n            $rid = $this->objects[$id]['onPage'];\n            $opt = ['rid' => $rid, 'pos' => $pos];\n            $this->o_page($this->numObj, 'new', $opt);\n        } else {\n            $this->o_page($this->numObj, 'new');\n        }\n\n        // if there is a stack saved, then put that onto the page\n        if ($this->nStateStack) {\n            for ($i = 1; $i <= $this->nStateStack; $i++) {\n                $this->saveState($i);\n            }\n        }\n\n        // and if there has been a stroke or fill color set, then transfer them\n        if (isset($this->currentColor)) {\n            $this->setColor($this->currentColor, true);\n        }\n\n        if (isset($this->currentStrokeColor)) {\n            $this->setStrokeColor($this->currentStrokeColor, true);\n        }\n\n        // if there is a line style set, then put this in too\n        if (mb_strlen($this->currentLineStyle, '8bit')) {\n            $this->addContent(\"\\n$this->currentLineStyle\");\n        }\n\n        // the call to the o_page object set currentContents to the present page, so this can be returned as the page id\n        return $this->currentContents;\n    }\n\n    /**\n     * Streams the PDF to the client.\n     *\n     * @param string $filename The filename to present to the client.\n     * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).\n     */\n    function stream($filename = \"document.pdf\", $options = [])\n    {\n        if (headers_sent()) {\n            die(\"Unable to stream pdf: headers already sent\");\n        }\n\n        if (!isset($options[\"compress\"])) $options[\"compress\"] = true;\n        if (!isset($options[\"Attachment\"])) $options[\"Attachment\"] = true;\n\n        $debug = !$options['compress'];\n        $tmp = ltrim($this->output($debug));\n\n        header(\"Cache-Control: private\");\n        header(\"Content-Type: application/pdf\");\n        header(\"Content-Length: \" . mb_strlen($tmp, \"8bit\"));\n\n        $filename = str_replace([\"\\n\", \"'\"], \"\", basename($filename, \".pdf\")) . \".pdf\";\n        $attachment = $options[\"Attachment\"] ? \"attachment\" : \"inline\";\n\n        $encoding = mb_detect_encoding($filename);\n        $fallbackfilename = mb_convert_encoding($filename, \"ISO-8859-1\", $encoding);\n        $fallbackfilename = str_replace(\"\\\"\", \"\", $fallbackfilename);\n        $encodedfilename = rawurlencode($filename);\n\n        $contentDisposition = \"Content-Disposition: $attachment; filename=\\\"$fallbackfilename\\\"\";\n        if ($fallbackfilename !== $filename) {\n            $contentDisposition .= \"; filename*=UTF-8''$encodedfilename\";\n        }\n        header($contentDisposition);\n\n        echo $tmp;\n        flush();\n    }\n\n    /**\n     * return the height in units of the current font in the given size\n     *\n     * @param $size\n     * @return float|int\n     */\n    function getFontHeight($size)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $font = $this->fonts[$this->currentFont];\n\n        // for the current font, and the given size, what is the height of the font in user units\n        if (isset($font['Ascender']) && isset($font['Descender'])) {\n            $h = $font['Ascender'] - $font['Descender'];\n        } else {\n            $h = $font['FontBBox'][3] - $font['FontBBox'][1];\n        }\n\n        // have to adjust by a font offset for Windows fonts.  unfortunately it looks like\n        // the bounding box calculations are wrong and I don't know why.\n        if (isset($font['FontHeightOffset'])) {\n            // For CourierNew from Windows this needs to be -646 to match the\n            // Adobe native Courier font.\n            //\n            // For FreeMono from GNU this needs to be -337 to match the\n            // Courier font.\n            //\n            // Both have been added manually to the .afm and .ufm files.\n            $h += (int)$font['FontHeightOffset'];\n        }\n\n        return $size * $h / 1000;\n    }\n\n    /**\n     * @param $size\n     * @return float|int\n     */\n    function getFontXHeight($size)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $font = $this->fonts[$this->currentFont];\n\n        // for the current font, and the given size, what is the height of the font in user units\n        if (isset($font['XHeight'])) {\n            $xh = $font['Ascender'] - $font['Descender'];\n        } else {\n            $xh = $this->getFontHeight($size) / 2;\n        }\n\n        return $size * $xh / 1000;\n    }\n\n    /**\n     * return the font descender, this will normally return a negative number\n     * if you add this number to the baseline, you get the level of the bottom of the font\n     * it is in the pdf user units\n     *\n     * @param $size\n     * @return float|int\n     */\n    function getFontDescender($size)\n    {\n        // note that this will most likely return a negative value\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        //$h = $this->fonts[$this->currentFont]['FontBBox'][1];\n        $h = $this->fonts[$this->currentFont]['Descender'];\n\n        return $size * $h / 1000;\n    }\n\n    /**\n     * filter the text, this is applied to all text just before being inserted into the pdf document\n     * it escapes the various things that need to be escaped, and so on\n     *\n     * @access private\n     *\n     * @param $text\n     * @param bool $bom\n     * @param bool $convert_encoding\n     * @return string\n     */\n    function filterText($text, $bom = true, $convert_encoding = true)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        if ($convert_encoding) {\n            $cf = $this->currentFont;\n            if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) {\n                $text = $this->utf8toUtf16BE($text, $bom);\n            } else {\n                //$text = html_entity_decode($text, ENT_QUOTES);\n                $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8');\n            }\n        } else if ($bom) {\n            $text = $this->utf8toUtf16BE($text, $bom);\n        }\n\n        // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290)\n        return strtr($text, [')' => '\\\\)', '(' => '\\\\(', '\\\\' => '\\\\\\\\', chr(13) => '\\r']);\n    }\n\n    /**\n     * return array containing codepoints (UTF-8 character values) for the\n     * string passed in.\n     *\n     * based on the excellent TCPDF code by Nicola Asuni and the\n     * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html\n     *\n     * @access private\n     * @author Orion Richardson\n     * @since  January 5, 2008\n     *\n     * @param string $text UTF-8 string to process\n     *\n     * @return array UTF-8 codepoints array for the string\n     */\n    function utf8toCodePointsArray(&$text)\n    {\n        $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040\n        $unicode = []; // array containing unicode values\n        $bytes = []; // array containing single character byte sequences\n        $numbytes = 1; // number of octets needed to represent the UTF-8 character\n\n        for ($i = 0; $i < $length; $i++) {\n            $c = ord($text[$i]); // get one string character at time\n            if (count($bytes) === 0) { // get starting octect\n                if ($c <= 0x7F) {\n                    $unicode[] = $c; // use the character \"as is\" because is ASCII\n                    $numbytes = 1;\n                } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN)\n                    $bytes[] = ($c - 0xC0) << 0x06;\n                    $numbytes = 2;\n                } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN)\n                    $bytes[] = ($c - 0xE0) << 0x0C;\n                    $numbytes = 3;\n                } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN)\n                    $bytes[] = ($c - 0xF0) << 0x12;\n                    $numbytes = 4;\n                } else {\n                    // use replacement character for other invalid sequences\n                    $unicode[] = 0xFFFD;\n                    $bytes = [];\n                    $numbytes = 1;\n                }\n            } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN\n                $bytes[] = $c - 0x80;\n                if (count($bytes) === $numbytes) {\n                    // compose UTF-8 bytes to a single unicode value\n                    $c = $bytes[0];\n                    for ($j = 1; $j < $numbytes; $j++) {\n                        $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06));\n                    }\n                    if ((($c >= 0xD800) and ($c <= 0xDFFF)) or ($c >= 0x10FFFF)) {\n                        // The definition of UTF-8 prohibits encoding character numbers between\n                        // U+D800 and U+DFFF, which are reserved for use with the UTF-16\n                        // encoding form (as surrogate pairs) and do not directly represent\n                        // characters.\n                        $unicode[] = 0xFFFD; // use replacement character\n                    } else {\n                        $unicode[] = $c; // add char to array\n                    }\n                    // reset data for next char\n                    $bytes = [];\n                    $numbytes = 1;\n                }\n            } else {\n                // use replacement character for other invalid sequences\n                $unicode[] = 0xFFFD;\n                $bytes = [];\n                $numbytes = 1;\n            }\n        }\n\n        return $unicode;\n    }\n\n    /**\n     * convert UTF-8 to UTF-16 with an additional byte order marker\n     * at the front if required.\n     *\n     * based on the excellent TCPDF code by Nicola Asuni and the\n     * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html\n     *\n     * @access private\n     * @author Orion Richardson\n     * @since  January 5, 2008\n     *\n     * @param string  $text UTF-8 string to process\n     * @param boolean $bom  whether to add the byte order marker\n     *\n     * @return string UTF-16 result string\n     */\n    function utf8toUtf16BE(&$text, $bom = true)\n    {\n        $out = $bom ? \"\\xFE\\xFF\" : '';\n\n        $unicode = $this->utf8toCodePointsArray($text);\n        foreach ($unicode as $c) {\n            if ($c === 0xFFFD) {\n                $out .= \"\\xFF\\xFD\"; // replacement character\n            } elseif ($c < 0x10000) {\n                $out .= chr($c >> 0x08) . chr($c & 0xFF);\n            } else {\n                $c -= 0x10000;\n                $w1 = 0xD800 | ($c >> 0x10);\n                $w2 = 0xDC00 | ($c & 0x3FF);\n                $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF);\n            }\n        }\n\n        return $out;\n    }\n\n    /**\n     * given a start position and information about how text is to be laid out, calculate where\n     * on the page the text will end\n     *\n     * @param $x\n     * @param $y\n     * @param $angle\n     * @param $size\n     * @param $wa\n     * @param $text\n     * @return array\n     */\n    private function getTextPosition($x, $y, $angle, $size, $wa, $text)\n    {\n        // given this information return an array containing x and y for the end position as elements 0 and 1\n        $w = $this->getTextWidth($size, $text);\n\n        // need to adjust for the number of spaces in this text\n        $words = explode(' ', $text);\n        $nspaces = count($words) - 1;\n        $w += $wa * $nspaces;\n        $a = deg2rad((float)$angle);\n\n        return [cos($a) * $w + $x, -sin($a) * $w + $y];\n    }\n\n    /**\n     * Callback method used by smallCaps\n     *\n     * @param array $matches\n     *\n     * @return string\n     */\n    function toUpper($matches)\n    {\n        return mb_strtoupper($matches[0]);\n    }\n\n    function concatMatches($matches)\n    {\n        $str = \"\";\n        foreach ($matches as $match) {\n            $str .= $match[0];\n        }\n\n        return $str;\n    }\n\n    /**\n     * register text for font subsetting\n     *\n     * @param $font\n     * @param $text\n     */\n    function registerText($font, $text)\n    {\n        if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) {\n            return;\n        }\n\n        if (!isset($this->stringSubsets[$font])) {\n            $this->stringSubsets[$font] = [];\n        }\n\n        $this->stringSubsets[$font] = array_unique(\n            array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text))\n        );\n    }\n\n    /**\n     * add text to the document, at a specified location, size and angle on the page\n     *\n     * @param $x\n     * @param $y\n     * @param $size\n     * @param $text\n     * @param int $angle\n     * @param int $wordSpaceAdjust\n     * @param int $charSpaceAdjust\n     * @param bool $smallCaps\n     */\n    function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $text = str_replace([\"\\r\", \"\\n\"], \"\", $text);\n\n        if ($smallCaps) {\n            preg_match_all(\"/(\\P{Ll}+)/u\", $text, $matches, PREG_SET_ORDER);\n            $lower = $this->concatMatches($matches);\n            d($lower);\n\n            preg_match_all(\"/(\\p{Ll}+)/u\", $text, $matches, PREG_SET_ORDER);\n            $other = $this->concatMatches($matches);\n            d($other);\n\n            //$text = preg_replace_callback(\"/\\p{Ll}/u\", array($this, \"toUpper\"), $text);\n        }\n\n        // if there are any open callbacks, then they should be called, to show the start of the line\n        if ($this->nCallback > 0) {\n            for ($i = $this->nCallback; $i > 0; $i--) {\n                // call each function\n                $info = [\n                    'x'         => $x,\n                    'y'         => $y,\n                    'angle'     => $angle,\n                    'status'    => 'sol',\n                    'p'         => $this->callback[$i]['p'],\n                    'nCallback' => $this->callback[$i]['nCallback'],\n                    'height'    => $this->callback[$i]['height'],\n                    'descender' => $this->callback[$i]['descender']\n                ];\n\n                $func = $this->callback[$i]['f'];\n                $this->$func($info);\n            }\n        }\n\n        if ($angle == 0) {\n            $this->addContent(sprintf(\"\\nBT %.3F %.3F Td\", $x, $y));\n        } else {\n            $a = deg2rad((float)$angle);\n            $this->addContent(\n                sprintf(\"\\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm\", cos($a), -sin($a), sin($a), cos($a), $x, $y)\n            );\n        }\n\n        if ($wordSpaceAdjust != 0) {\n            $this->addContent(sprintf(\" %.3F Tw\", $wordSpaceAdjust));\n        }\n\n        if ($charSpaceAdjust != 0) {\n            $this->addContent(sprintf(\" %.3F Tc\", $charSpaceAdjust));\n        }\n\n        $len = mb_strlen($text);\n        $start = 0;\n\n        if ($start < $len) {\n            $part = $text; // OAR - Don't need this anymore, given that $start always equals zero.  substr($text, $start);\n            $place_text = $this->filterText($part, false);\n            // modify unicode text so that extra word spacing is manually implemented (bug #)\n            if ($this->fonts[$this->currentFont]['isUnicode'] && $wordSpaceAdjust != 0) {\n                $space_scale = 1000 / $size;\n                $place_text = str_replace(\"\\x00\\x20\", \"\\x00\\x20)\\x00\\x20\" . (-round($space_scale * $wordSpaceAdjust)) . \"\\x00\\x20(\", $place_text);\n            }\n            $this->addContent(\" /F$this->currentFontNum \" . sprintf('%.1F Tf ', $size));\n            $this->addContent(\" [($place_text)] TJ\");\n        }\n\n        if ($wordSpaceAdjust != 0) {\n            $this->addContent(sprintf(\" %.3F Tw\", 0));\n        }\n\n        if ($charSpaceAdjust != 0) {\n            $this->addContent(sprintf(\" %.3F Tc\", 0));\n        }\n\n        $this->addContent(' ET');\n\n        // if there are any open callbacks, then they should be called, to show the end of the line\n        if ($this->nCallback > 0) {\n            for ($i = $this->nCallback; $i > 0; $i--) {\n                // call each function\n                $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text);\n                $info = [\n                    'x'         => $tmp[0],\n                    'y'         => $tmp[1],\n                    'angle'     => $angle,\n                    'status'    => 'eol',\n                    'p'         => $this->callback[$i]['p'],\n                    'nCallback' => $this->callback[$i]['nCallback'],\n                    'height'    => $this->callback[$i]['height'],\n                    'descender' => $this->callback[$i]['descender']\n                ];\n                $func = $this->callback[$i]['f'];\n                $this->$func($info);\n            }\n        }\n\n        if ($this->fonts[$this->currentFont]['isSubsetting']) {\n            $this->registerText($this->currentFont, $text);\n        }\n    }\n\n    /**\n     * calculate how wide a given text string will be on a page, at a given size.\n     * this can be called externally, but is also used by the other class functions\n     *\n     * @param float $size\n     * @param string $text\n     * @param float $word_spacing\n     * @param float $char_spacing\n     * @return float\n     */\n    function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0)\n    {\n        static $ord_cache = [];\n\n        // this function should not change any of the settings, though it will need to\n        // track any directives which change during calculation, so copy them at the start\n        // and put them back at the end.\n        $store_currentTextState = $this->currentTextState;\n\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $text = str_replace([\"\\r\", \"\\n\"], \"\", $text);\n\n        // converts a number or a float to a string so it can get the width\n        $text = \"$text\";\n\n        // hmm, this is where it all starts to get tricky - use the font information to\n        // calculate the width of each character, add them up and convert to user units\n        $w = 0;\n        $cf = $this->currentFont;\n        $current_font = $this->fonts[$cf];\n        $space_scale = 1000 / ($size > 0 ? $size : 1);\n\n        if ($current_font['isUnicode']) {\n            // for Unicode, use the code points array to calculate width rather\n            // than just the string itself\n            $unicode = $this->utf8toCodePointsArray($text);\n\n            foreach ($unicode as $char) {\n                // check if we have to replace character\n                if (isset($current_font['differences'][$char])) {\n                    $char = $current_font['differences'][$char];\n                }\n\n                if (isset($current_font['C'][$char])) {\n                    $char_width = $current_font['C'][$char];\n\n                    // add the character width\n                    $w += $char_width;\n\n                    // add additional padding for space\n                    if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') {  // Space\n                        $w += $word_spacing * $space_scale;\n                    }\n                }\n            }\n\n            // add additional char spacing\n            if ($char_spacing != 0) {\n                $w += $char_spacing * $space_scale * count($unicode);\n            }\n\n        } else {\n            // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252\n            if ($this->isUnicode) {\n                $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8');\n            }\n\n            $len = mb_strlen($text, 'Windows-1252');\n\n            for ($i = 0; $i < $len; $i++) {\n                $c = $text[$i];\n                $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c));\n\n                // check if we have to replace character\n                if (isset($current_font['differences'][$char])) {\n                    $char = $current_font['differences'][$char];\n                }\n\n                if (isset($current_font['C'][$char])) {\n                    $char_width = $current_font['C'][$char];\n\n                    // add the character width\n                    $w += $char_width;\n\n                    // add additional padding for space\n                    if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') {  // Space\n                        $w += $word_spacing * $space_scale;\n                    }\n                }\n            }\n\n            // add additional char spacing\n            if ($char_spacing != 0) {\n                $w += $char_spacing * $space_scale * $len;\n            }\n        }\n\n        $this->currentTextState = $store_currentTextState;\n        $this->setCurrentFont();\n\n        return $w * $size / 1000;\n    }\n\n    /**\n     * this will be called at a new page to return the state to what it was on the\n     * end of the previous page, before the stack was closed down\n     * This is to get around not being able to have open 'q' across pages\n     *\n     * @param int $pageEnd\n     */\n    function saveState($pageEnd = 0)\n    {\n        if ($pageEnd) {\n            // this will be called at a new page to return the state to what it was on the\n            // end of the previous page, before the stack was closed down\n            // This is to get around not being able to have open 'q' across pages\n            $opt = $this->stateStack[$pageEnd];\n            // ok to use this as stack starts numbering at 1\n            $this->setColor($opt['col'], true);\n            $this->setStrokeColor($opt['str'], true);\n            $this->addContent(\"\\n\" . $opt['lin']);\n            //    $this->currentLineStyle = $opt['lin'];\n        } else {\n            $this->nStateStack++;\n            $this->stateStack[$this->nStateStack] = [\n                'col' => $this->currentColor,\n                'str' => $this->currentStrokeColor,\n                'lin' => $this->currentLineStyle\n            ];\n        }\n\n        $this->save();\n    }\n\n    /**\n     * restore a previously saved state\n     *\n     * @param int $pageEnd\n     */\n    function restoreState($pageEnd = 0)\n    {\n        if (!$pageEnd) {\n            $n = $this->nStateStack;\n            $this->currentColor = $this->stateStack[$n]['col'];\n            $this->currentStrokeColor = $this->stateStack[$n]['str'];\n            $this->addContent(\"\\n\" . $this->stateStack[$n]['lin']);\n            $this->currentLineStyle = $this->stateStack[$n]['lin'];\n            $this->stateStack[$n] = null;\n            unset($this->stateStack[$n]);\n            $this->nStateStack--;\n        }\n\n        $this->restore();\n    }\n\n    /**\n     * make a loose object, the output will go into this object, until it is closed, then will revert to\n     * the current one.\n     * this object will not appear until it is included within a page.\n     * the function will return the object number\n     *\n     * @return int\n     */\n    function openObject()\n    {\n        $this->nStack++;\n        $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage];\n        // add a new object of the content type, to hold the data flow\n        $this->numObj++;\n        $this->o_contents($this->numObj, 'new');\n        $this->currentContents = $this->numObj;\n        $this->looseObjects[$this->numObj] = 1;\n\n        return $this->numObj;\n    }\n\n    /**\n     * open an existing object for editing\n     *\n     * @param $id\n     */\n    function reopenObject($id)\n    {\n        $this->nStack++;\n        $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage];\n        $this->currentContents = $id;\n\n        // also if this object is the primary contents for a page, then set the current page to its parent\n        if (isset($this->objects[$id]['onPage'])) {\n            $this->currentPage = $this->objects[$id]['onPage'];\n        }\n    }\n\n    /**\n     * close an object\n     */\n    function closeObject()\n    {\n        // close the object, as long as there was one open in the first place, which will be indicated by\n        // an objectId on the stack.\n        if ($this->nStack > 0) {\n            $this->currentContents = $this->stack[$this->nStack]['c'];\n            $this->currentPage = $this->stack[$this->nStack]['p'];\n            $this->nStack--;\n            // easier to probably not worry about removing the old entries, they will be overwritten\n            // if there are new ones.\n        }\n    }\n\n    /**\n     * stop an object from appearing on pages from this point on\n     *\n     * @param $id\n     */\n    function stopObject($id)\n    {\n        // if an object has been appearing on pages up to now, then stop it, this page will\n        // be the last one that could contain it.\n        if (isset($this->addLooseObjects[$id])) {\n            $this->addLooseObjects[$id] = '';\n        }\n    }\n\n    /**\n     * after an object has been created, it wil only show if it has been added, using this function.\n     *\n     * @param $id\n     * @param string $options\n     */\n    function addObject($id, $options = 'add')\n    {\n        // add the specified object to the page\n        if (isset($this->looseObjects[$id]) && $this->currentContents != $id) {\n            // then it is a valid object, and it is not being added to itself\n            switch ($options) {\n                case 'all':\n                    // then this object is to be added to this page (done in the next block) and\n                    // all future new pages.\n                    $this->addLooseObjects[$id] = 'all';\n\n                case 'add':\n                    if (isset($this->objects[$this->currentContents]['onPage'])) {\n                        // then the destination contents is the primary for the page\n                        // (though this object is actually added to that page)\n                        $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id);\n                    }\n                    break;\n\n                case 'even':\n                    $this->addLooseObjects[$id] = 'even';\n                    $pageObjectId = $this->objects[$this->currentContents]['onPage'];\n                    if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) {\n                        $this->addObject($id);\n                        // hacky huh :)\n                    }\n                    break;\n\n                case 'odd':\n                    $this->addLooseObjects[$id] = 'odd';\n                    $pageObjectId = $this->objects[$this->currentContents]['onPage'];\n                    if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) {\n                        $this->addObject($id);\n                        // hacky huh :)\n                    }\n                    break;\n\n                case 'next':\n                    $this->addLooseObjects[$id] = 'all';\n                    break;\n\n                case 'nexteven':\n                    $this->addLooseObjects[$id] = 'even';\n                    break;\n\n                case 'nextodd':\n                    $this->addLooseObjects[$id] = 'odd';\n                    break;\n            }\n        }\n    }\n\n    /**\n     * return a storable representation of a specific object\n     *\n     * @param $id\n     * @return string|null\n     */\n    function serializeObject($id)\n    {\n        if (array_key_exists($id, $this->objects)) {\n            return serialize($this->objects[$id]);\n        }\n\n        return null;\n    }\n\n    /**\n     * restore an object from its stored representation. Returns its new object id.\n     *\n     * @param $obj\n     * @return int\n     */\n    function restoreSerializedObject($obj)\n    {\n        $obj_id = $this->openObject();\n        $this->objects[$obj_id] = unserialize($obj);\n        $this->closeObject();\n\n        return $obj_id;\n    }\n\n    /**\n     * Embeds a file inside the PDF\n     *\n     * @param string $filepath path to the file to store inside the PDF\n     * @param string $embeddedFilename the filename displayed in the list of embedded files\n     * @param string $description a description in the list of embedded files\n     */\n    public function addEmbeddedFile(string $filepath, string $embeddedFilename, string $description): void\n    {\n        $this->numObj++;\n        $this->o_embedded_file_dictionary(\n            $this->numObj,\n            'new',\n            [\n                'filepath' => $filepath,\n                'filename' => $embeddedFilename,\n                'description' => $description\n            ]\n        );\n    }\n\n    /**\n     * add content to the documents info object\n     *\n     * @param $label\n     * @param int $value\n     */\n    function addInfo($label, $value = 0)\n    {\n        // this will only work if the label is one of the valid ones.\n        // modify this so that arrays can be passed as well.\n        // if $label is an array then assume that it is key => value pairs\n        // else assume that they are both scalar, anything else will probably error\n        if (is_array($label)) {\n            foreach ($label as $l => $v) {\n                $this->o_info($this->infoObject, $l, $v);\n            }\n        } else {\n            $this->o_info($this->infoObject, $label, $value);\n        }\n    }\n\n    /**\n     * set the viewer preferences of the document, it is up to the browser to obey these.\n     *\n     * @param $label\n     * @param int $value\n     */\n    function setPreferences($label, $value = 0)\n    {\n        // this will only work if the label is one of the valid ones.\n        if (is_array($label)) {\n            foreach ($label as $l => $v) {\n                $this->o_catalog($this->catalogId, 'viewerPreferences', [$l => $v]);\n            }\n        } else {\n            $this->o_catalog($this->catalogId, 'viewerPreferences', [$label => $value]);\n        }\n    }\n\n    /**\n     * extract an integer from a position in a byte stream\n     *\n     * @param $data\n     * @param $pos\n     * @param $num\n     * @return int\n     */\n    private function getBytes(&$data, $pos, $num)\n    {\n        // return the integer represented by $num bytes from $pos within $data\n        $ret = 0;\n        for ($i = 0; $i < $num; $i++) {\n            $ret *= 256;\n            $ret += ord($data[$pos + $i]);\n        }\n\n        return $ret;\n    }\n\n    /**\n     * Check if image already added to pdf image directory.\n     * If yes, need not to create again (pass empty data)\n     *\n     * @param $imgname\n     * @return bool\n     */\n    function image_iscached($imgname)\n    {\n        return isset($this->imagelist[$imgname]);\n    }\n\n    /**\n     * add a PNG image into the document, from a GD object\n     * this should work with remote files\n     *\n     * @param resource $img A GD resource\n     * @param string $file The PNG file\n     * @param float $x X position\n     * @param float $y Y position\n     * @param float $w Width\n     * @param float $h Height\n     * @param bool $is_mask true if the image is a mask\n     * @param bool $mask true if the image is masked\n     * @throws Exception\n     */\n    function addImagePng(&$img, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null)\n    {\n        if (!function_exists(\"imagepng\")) {\n            throw new \\Exception(\"The PHP GD extension is required, but is not installed.\");\n        }\n\n        //if already cached, need not to read again\n        if (isset($this->imagelist[$file])) {\n            $data = null;\n        } else {\n            // Example for transparency handling on new image. Retain for current image\n            // $tIndex = imagecolortransparent($img);\n            // if ($tIndex > 0) {\n            //   $tColor    = imagecolorsforindex($img, $tIndex);\n            //   $new_tIndex    = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']);\n            //   imagefill($new_img, 0, 0, $new_tIndex);\n            //   imagecolortransparent($new_img, $new_tIndex);\n            // }\n            // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn\n            //imagealphablending($img, true);\n\n            //default, but explicitely set to ensure pdf compatibility\n            imagesavealpha($img, false/*!$is_mask && !$mask*/);\n\n            $error = 0;\n            //DEBUG_IMG_TEMP\n            //debugpng\n            if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                print '[addImagePng ' . $file . ']';\n            }\n\n            ob_start();\n            @imagepng($img);\n            $data = ob_get_clean();\n\n            if ($data == '') {\n                $error = 1;\n                $errormsg = 'trouble writing file from GD';\n                //DEBUG_IMG_TEMP\n                //debugpng\n                if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                    print 'trouble writing file from GD';\n                }\n            }\n\n            if ($error) {\n                $this->addMessage('PNG error - (' . $file . ') ' . $errormsg);\n\n                return;\n            }\n        }  //End isset($this->imagelist[$file]) (png Duplicate removal)\n\n        $this->addPngFromBuf($data, $file, $x, $y, $w, $h, $is_mask, $mask);\n    }\n\n    /**\n     * @param $file\n     * @param $x\n     * @param $y\n     * @param $w\n     * @param $h\n     * @param $byte\n     */\n    protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte)\n    {\n        // generate images\n        $img = imagecreatefrompng($file);\n\n        if ($img === false) {\n            return;\n        }\n\n        // FIXME The pixel transformation doesn't work well with 8bit PNGs\n        $eight_bit = ($byte & 4) !== 4;\n\n        $wpx = imagesx($img);\n        $hpx = imagesy($img);\n\n        imagesavealpha($img, false);\n\n        // create temp alpha file\n        $tempfile_alpha = @tempnam($this->tmp, \"cpdf_img_\");\n        @unlink($tempfile_alpha);\n        $tempfile_alpha = \"$tempfile_alpha.png\";\n\n        // create temp plain file\n        $tempfile_plain = @tempnam($this->tmp, \"cpdf_img_\");\n        @unlink($tempfile_plain);\n        $tempfile_plain = \"$tempfile_plain.png\";\n\n        $imgalpha = imagecreate($wpx, $hpx);\n        imagesavealpha($imgalpha, false);\n\n        // generate gray scale palette (0 -> 255)\n        for ($c = 0; $c < 256; ++$c) {\n            imagecolorallocate($imgalpha, $c, $c, $c);\n        }\n\n        // Use PECL gmagick + Graphics Magic to process transparent PNG images\n        if (extension_loaded(\"gmagick\")) {\n            $gmagick = new \\Gmagick($file);\n            $gmagick->setimageformat('png');\n\n            // Get opacity channel (negative of alpha channel)\n            $alpha_channel_neg = clone $gmagick;\n            $alpha_channel_neg->separateimagechannel(\\Gmagick::CHANNEL_OPACITY);\n\n            // Negate opacity channel\n            $alpha_channel = new \\Gmagick();\n            $alpha_channel->newimage($wpx, $hpx, \"#FFFFFF\", \"png\");\n            $alpha_channel->compositeimage($alpha_channel_neg, \\Gmagick::COMPOSITE_DIFFERENCE, 0, 0);\n            $alpha_channel->separateimagechannel(\\Gmagick::CHANNEL_RED);\n            $alpha_channel->writeimage($tempfile_alpha);\n\n            // Cast to 8bit+palette\n            $imgalpha_ = imagecreatefrompng($tempfile_alpha);\n            imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx);\n            imagedestroy($imgalpha_);\n            imagepng($imgalpha, $tempfile_alpha);\n\n            // Make opaque image\n            $color_channels = new \\Gmagick();\n            $color_channels->newimage($wpx, $hpx, \"#FFFFFF\", \"png\");\n            $color_channels->compositeimage($gmagick, \\Gmagick::COMPOSITE_COPYRED, 0, 0);\n            $color_channels->compositeimage($gmagick, \\Gmagick::COMPOSITE_COPYGREEN, 0, 0);\n            $color_channels->compositeimage($gmagick, \\Gmagick::COMPOSITE_COPYBLUE, 0, 0);\n            $color_channels->writeimage($tempfile_plain);\n\n            $imgplain = imagecreatefrompng($tempfile_plain);\n        }\n        // Use PECL imagick + ImageMagic to process transparent PNG images\n        elseif (extension_loaded(\"imagick\")) {\n            // Native cloning was added to pecl-imagick in svn commit 263814\n            // the first version containing it was 3.0.1RC1\n            static $imagickClonable = null;\n            if ($imagickClonable === null) {\n                $imagickClonable = true;\n                if (defined('Imagick::IMAGICK_EXTVER')) {\n                    $imagickVersion = \\Imagick::IMAGICK_EXTVER;\n                } else {\n                    $imagickVersion = '0';\n                }\n                if (version_compare($imagickVersion, '0.0.1', '>=')) {\n                    $imagickClonable = version_compare($imagickVersion, '3.0.1rc1', '>=');\n                }\n            }\n\n            $imagick = new \\Imagick($file);\n            $imagick->setFormat('png');\n\n            // Get opacity channel (negative of alpha channel)\n            if ($imagick->getImageAlphaChannel() !== 0) {\n                $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone();\n                $alpha_channel->separateImageChannel(\\Imagick::CHANNEL_ALPHA);\n                // Since ImageMagick7 negate invert transparency as default\n                if (\\Imagick::getVersion()['versionNumber'] < 1800) {\n                    $alpha_channel->negateImage(true);\n                }\n                $alpha_channel->writeImage($tempfile_alpha);\n\n                // Cast to 8bit+palette\n                $imgalpha_ = imagecreatefrompng($tempfile_alpha);\n                imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx);\n                imagedestroy($imgalpha_);\n                imagepng($imgalpha, $tempfile_alpha);\n            } else {\n                $tempfile_alpha = null;\n            }\n\n            // Make opaque image\n            $color_channels = new \\Imagick();\n            $color_channels->newImage($wpx, $hpx, \"#FFFFFF\", \"png\");\n            $color_channels->compositeImage($imagick, \\Imagick::COMPOSITE_COPYRED, 0, 0);\n            $color_channels->compositeImage($imagick, \\Imagick::COMPOSITE_COPYGREEN, 0, 0);\n            $color_channels->compositeImage($imagick, \\Imagick::COMPOSITE_COPYBLUE, 0, 0);\n            $color_channels->writeImage($tempfile_plain);\n\n            $imgplain = imagecreatefrompng($tempfile_plain);\n        } else {\n            // allocated colors cache\n            $allocated_colors = [];\n\n            // extract alpha channel\n            for ($xpx = 0; $xpx < $wpx; ++$xpx) {\n                for ($ypx = 0; $ypx < $hpx; ++$ypx) {\n                    $color = imagecolorat($img, $xpx, $ypx);\n                    $col = imagecolorsforindex($img, $color);\n                    $alpha = $col['alpha'];\n\n                    if ($eight_bit) {\n                        // with gamma correction\n                        $gammacorr = 2.2;\n                        $pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255;\n                    } else {\n                        // without gamma correction\n                        $pixel = (127 - $alpha) * 2;\n\n                        $key = $col['red'] . $col['green'] . $col['blue'];\n\n                        if (!isset($allocated_colors[$key])) {\n                            $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']);\n                            $allocated_colors[$key] = $pixel_img;\n                        } else {\n                            $pixel_img = $allocated_colors[$key];\n                        }\n\n                        imagesetpixel($img, $xpx, $ypx, $pixel_img);\n                    }\n\n                    imagesetpixel($imgalpha, $xpx, $ypx, $pixel);\n                }\n            }\n\n            // extract image without alpha channel\n            $imgplain = imagecreatetruecolor($wpx, $hpx);\n            imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx);\n            imagedestroy($img);\n\n            imagepng($imgalpha, $tempfile_alpha);\n            imagepng($imgplain, $tempfile_plain);\n        }\n\n        // embed mask image\n        if ($tempfile_alpha) {\n            $this->addImagePng($imgalpha, $tempfile_alpha, $x, $y, $w, $h, true);\n            imagedestroy($imgalpha);\n        }\n\n        // embed image, masked with previously embedded mask\n        $this->addImagePng($imgplain, $tempfile_plain, $x, $y, $w, $h, false, ($tempfile_alpha !== null));\n        imagedestroy($imgplain);\n\n        // remove temp files\n        if ($tempfile_alpha) {\n            unlink($tempfile_alpha);\n        }\n        unlink($tempfile_plain);\n    }\n\n    /**\n     * add a PNG image into the document, from a file\n     * this should work with remote files\n     *\n     * @param $file\n     * @param $x\n     * @param $y\n     * @param int $w\n     * @param int $h\n     * @throws Exception\n     */\n    function addPngFromFile($file, $x, $y, $w = 0, $h = 0)\n    {\n        if (!function_exists(\"imagecreatefrompng\")) {\n            throw new \\Exception(\"The PHP GD extension is required, but is not installed.\");\n        }\n\n        //if already cached, need not to read again\n        if (isset($this->imagelist[$file])) {\n            $img = null;\n        } else {\n            $info = file_get_contents($file, false, null, 24, 5);\n            $meta = unpack(\"CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod\", $info);\n            $bit_depth = $meta[\"bitDepth\"];\n            $color_type = $meta[\"colorType\"];\n\n            // http://www.w3.org/TR/PNG/#11IHDR\n            // 3 => indexed\n            // 4 => greyscale with alpha\n            // 6 => fullcolor with alpha\n            $is_alpha = in_array($color_type, [4, 6]) || ($color_type == 3 && $bit_depth != 4);\n\n            if ($is_alpha) { // exclude grayscale alpha\n                $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type);\n                return;\n            }\n\n            //png files typically contain an alpha channel.\n            //pdf file format or class.pdf does not support alpha blending.\n            //on alpha blended images, more transparent areas have a color near black.\n            //This appears in the result on not storing the alpha channel.\n            //Correct would be the box background image or its parent when transparent.\n            //But this would make the image dependent on the background.\n            //Therefore create an image with white background and copy in\n            //A more natural background than black is white.\n            //Therefore create an empty image with white background and merge the\n            //image in with alpha blending.\n            $imgtmp = @imagecreatefrompng($file);\n            if (!$imgtmp) {\n                return;\n            }\n            $sx = imagesx($imgtmp);\n            $sy = imagesy($imgtmp);\n            $img = imagecreatetruecolor($sx, $sy);\n            imagealphablending($img, true);\n\n            // @todo is it still needed ??\n            $ti = imagecolortransparent($imgtmp);\n            if ($ti >= 0) {\n                $tc = imagecolorsforindex($imgtmp, $ti);\n                $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']);\n                imagefill($img, 0, 0, $ti);\n                imagecolortransparent($img, $ti);\n            } else {\n                imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255));\n            }\n\n            imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy);\n            imagedestroy($imgtmp);\n        }\n        $this->addImagePng($img, $file, $x, $y, $w, $h);\n\n        if ($img) {\n            imagedestroy($img);\n        }\n    }\n\n    /**\n     * add a PNG image into the document, from a file\n     * this should work with remote files\n     *\n     * @param $file\n     * @param $x\n     * @param $y\n     * @param int $w\n     * @param int $h\n     */\n    function addSvgFromFile($file, $x, $y, $w = 0, $h = 0)\n    {\n        $doc = new \\Svg\\Document();\n        $doc->loadFile($file);\n        $dimensions = $doc->getDimensions();\n\n        $this->save();\n\n        $this->transform([$w / $dimensions[\"width\"], 0, 0, $h / $dimensions[\"height\"], $x, $y]);\n\n        $surface = new \\Svg\\Surface\\SurfaceCpdf($doc, $this);\n        $doc->render($surface);\n\n        $this->restore();\n    }\n\n    /**\n     * add a PNG image into the document, from a memory buffer of the file\n     *\n     * @param $data\n     * @param $file\n     * @param $x\n     * @param $y\n     * @param float $w\n     * @param float $h\n     * @param bool $is_mask\n     * @param null $mask\n     */\n    function addPngFromBuf(&$data, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null)\n    {\n        if (isset($this->imagelist[$file])) {\n            $data = null;\n            $info['width'] = $this->imagelist[$file]['w'];\n            $info['height'] = $this->imagelist[$file]['h'];\n            $label = $this->imagelist[$file]['label'];\n        } else {\n            if ($data == null) {\n                $this->addMessage('addPngFromBuf error - data not present!');\n\n                return;\n            }\n\n            $error = 0;\n\n            if (!$error) {\n                $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10);\n\n                if (mb_substr($data, 0, 8, '8bit') != $header) {\n                    $error = 1;\n\n                    if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                        print '[addPngFromFile this file does not have a valid header ' . $file . ']';\n                    }\n\n                    $errormsg = 'this file does not have a valid header';\n                }\n            }\n\n            if (!$error) {\n                // set pointer\n                $p = 8;\n                $len = mb_strlen($data, '8bit');\n\n                // cycle through the file, identifying chunks\n                $haveHeader = 0;\n                $info = [];\n                $idata = '';\n                $pdata = '';\n\n                while ($p < $len) {\n                    $chunkLen = $this->getBytes($data, $p, 4);\n                    $chunkType = mb_substr($data, $p + 4, 4, '8bit');\n\n                    switch ($chunkType) {\n                        case 'IHDR':\n                            // this is where all the file information comes from\n                            $info['width'] = $this->getBytes($data, $p + 8, 4);\n                            $info['height'] = $this->getBytes($data, $p + 12, 4);\n                            $info['bitDepth'] = ord($data[$p + 16]);\n                            $info['colorType'] = ord($data[$p + 17]);\n                            $info['compressionMethod'] = ord($data[$p + 18]);\n                            $info['filterMethod'] = ord($data[$p + 19]);\n                            $info['interlaceMethod'] = ord($data[$p + 20]);\n\n                            //print_r($info);\n                            $haveHeader = 1;\n                            if ($info['compressionMethod'] != 0) {\n                                $error = 1;\n\n                                //debugpng\n                                if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                                    print '[addPngFromFile unsupported compression method ' . $file . ']';\n                                }\n\n                                $errormsg = 'unsupported compression method';\n                            }\n\n                            if ($info['filterMethod'] != 0) {\n                                $error = 1;\n\n                                //debugpng\n                                if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                                    print '[addPngFromFile unsupported filter method ' . $file . ']';\n                                }\n\n                                $errormsg = 'unsupported filter method';\n                            }\n                            break;\n\n                        case 'PLTE':\n                            $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit');\n                            break;\n\n                        case 'IDAT':\n                            $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit');\n                            break;\n\n                        case 'tRNS':\n                            //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk\n                            //print \"tRNS found, color type = \".$info['colorType'].\"\\n\";\n                            $transparency = [];\n\n                            switch ($info['colorType']) {\n                                // indexed color, rbg\n                                case 3:\n                                    /* corresponding to entries in the plte chunk\n                                     Alpha for palette index 0: 1 byte\n                                     Alpha for palette index 1: 1 byte\n                                     ...etc...\n                                    */\n                                    // there will be one entry for each palette entry. up until the last non-opaque entry.\n                                    // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent)\n                                    $transparency['type'] = 'indexed';\n                                    $trans = 0;\n\n                                    for ($i = $chunkLen; $i >= 0; $i--) {\n                                        if (ord($data[$p + 8 + $i]) == 0) {\n                                            $trans = $i;\n                                        }\n                                    }\n\n                                    $transparency['data'] = $trans;\n                                    break;\n\n                                // grayscale\n                                case 0:\n                                    /* corresponding to entries in the plte chunk\n                                     Gray: 2 bytes, range 0 .. (2^bitdepth)-1\n                                    */\n                                    //            $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale\n                                    $transparency['type'] = 'indexed';\n                                    $transparency['data'] = ord($data[$p + 8 + 1]);\n                                    break;\n\n                                // truecolor\n                                case 2:\n                                    /* corresponding to entries in the plte chunk\n                                     Red: 2 bytes, range 0 .. (2^bitdepth)-1\n                                     Green: 2 bytes, range 0 .. (2^bitdepth)-1\n                                     Blue: 2 bytes, range 0 .. (2^bitdepth)-1\n                                    */\n                                    $transparency['r'] = $this->getBytes($data, $p + 8, 2);\n                                    // r from truecolor\n                                    $transparency['g'] = $this->getBytes($data, $p + 10, 2);\n                                    // g from truecolor\n                                    $transparency['b'] = $this->getBytes($data, $p + 12, 2);\n                                    // b from truecolor\n\n                                    $transparency['type'] = 'color-key';\n                                    break;\n\n                                //unsupported transparency type\n                                default:\n                                    if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                                        print '[addPngFromFile unsupported transparency type ' . $file . ']';\n                                    }\n                                    break;\n                            }\n\n                            // KS End new code\n                            break;\n\n                        default:\n                            break;\n                    }\n\n                    $p += $chunkLen + 12;\n                }\n\n                if (!$haveHeader) {\n                    $error = 1;\n\n                    //debugpng\n                    if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                        print '[addPngFromFile information header is missing ' . $file . ']';\n                    }\n\n                    $errormsg = 'information header is missing';\n                }\n\n                if (isset($info['interlaceMethod']) && $info['interlaceMethod']) {\n                    $error = 1;\n\n                    //debugpng\n                    if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                        print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']';\n                    }\n\n                    $errormsg = 'There appears to be no support for interlaced images in pdf.';\n                }\n            }\n\n            if (!$error && $info['bitDepth'] > 8) {\n                $error = 1;\n\n                //debugpng\n                if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                    print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']';\n                }\n\n                $errormsg = 'only bit depth of 8 or less is supported';\n            }\n\n            if (!$error) {\n                switch ($info['colorType']) {\n                    case 3:\n                        $color = 'DeviceRGB';\n                        $ncolor = 1;\n                        break;\n\n                    case 2:\n                        $color = 'DeviceRGB';\n                        $ncolor = 3;\n                        break;\n\n                    case 0:\n                        $color = 'DeviceGray';\n                        $ncolor = 1;\n                        break;\n\n                    default:\n                        $error = 1;\n\n                        //debugpng\n                        if (defined(\"DEBUGPNG\") && DEBUGPNG) {\n                            print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']';\n                        }\n\n                        $errormsg = 'transparency alpha channel not supported, transparency only supported for palette images.';\n                }\n            }\n\n            if ($error) {\n                $this->addMessage('PNG error - (' . $file . ') ' . $errormsg);\n\n                return;\n            }\n\n            //print_r($info);\n            // so this image is ok... add it in.\n            $this->numImages++;\n            $im = $this->numImages;\n            $label = \"I$im\";\n            $this->numObj++;\n\n            //  $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width']));\n            $options = [\n                'label'            => $label,\n                'data'             => $idata,\n                'bitsPerComponent' => $info['bitDepth'],\n                'pdata'            => $pdata,\n                'iw'               => $info['width'],\n                'ih'               => $info['height'],\n                'type'             => 'png',\n                'color'            => $color,\n                'ncolor'           => $ncolor,\n                'masked'           => $mask,\n                'isMask'           => $is_mask\n            ];\n\n            if (isset($transparency)) {\n                $options['transparency'] = $transparency;\n            }\n\n            $this->o_image($this->numObj, 'new', $options);\n            $this->imagelist[$file] = ['label' => $label, 'w' => $info['width'], 'h' => $info['height']];\n        }\n\n        if ($is_mask) {\n            return;\n        }\n\n        if ($w <= 0 && $h <= 0) {\n            $w = $info['width'];\n            $h = $info['height'];\n        }\n\n        if ($w <= 0) {\n            $w = $h / $info['height'] * $info['width'];\n        }\n\n        if ($h <= 0) {\n            $h = $w * $info['height'] / $info['width'];\n        }\n\n        $this->addContent(sprintf(\"\\nq\\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\\nQ\", $w, $h, $x, $y, $label));\n    }\n\n    /**\n     * add a JPEG image into the document, from a file\n     *\n     * @param $img\n     * @param $x\n     * @param $y\n     * @param int $w\n     * @param int $h\n     */\n    function addJpegFromFile($img, $x, $y, $w = 0, $h = 0)\n    {\n        // attempt to add a jpeg image straight from a file, using no GD commands\n        // note that this function is unable to operate on a remote file.\n\n        if (!file_exists($img)) {\n            return;\n        }\n\n        if ($this->image_iscached($img)) {\n            $data = null;\n            $imageWidth = $this->imagelist[$img]['w'];\n            $imageHeight = $this->imagelist[$img]['h'];\n            $channels = $this->imagelist[$img]['c'];\n        } else {\n            $tmp = getimagesize($img);\n            $imageWidth = $tmp[0];\n            $imageHeight = $tmp[1];\n\n            if (isset($tmp['channels'])) {\n                $channels = $tmp['channels'];\n            } else {\n                $channels = 3;\n            }\n\n            $data = file_get_contents($img);\n        }\n\n        if ($w <= 0 && $h <= 0) {\n            $w = $imageWidth;\n        }\n\n        if ($w == 0) {\n            $w = $h / $imageHeight * $imageWidth;\n        }\n\n        if ($h == 0) {\n            $h = $w * $imageHeight / $imageWidth;\n        }\n\n        $this->addJpegImage_common($data, $img, $imageWidth, $imageHeight, $x, $y, $w, $h, $channels);\n    }\n\n    /**\n     * common code used by the two JPEG adding functions\n     * @param $data\n     * @param $imgname\n     * @param $imageWidth\n     * @param $imageHeight\n     * @param $x\n     * @param $y\n     * @param int $w\n     * @param int $h\n     * @param int $channels\n     */\n    private function addJpegImage_common(\n        &$data,\n        $imgname,\n        $imageWidth,\n        $imageHeight,\n        $x,\n        $y,\n        $w = 0,\n        $h = 0,\n        $channels = 3\n    ) {\n        if ($this->image_iscached($imgname)) {\n            $label = $this->imagelist[$imgname]['label'];\n            //debugpng\n            //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']';\n\n        } else {\n            if ($data == null) {\n                $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!');\n\n                return;\n            }\n\n            // note that this function is not to be called externally\n            // it is just the common code between the GD and the file options\n            $this->numImages++;\n            $im = $this->numImages;\n            $label = \"I$im\";\n            $this->numObj++;\n\n            $this->o_image(\n                $this->numObj,\n                'new',\n                [\n                    'label'    => $label,\n                    'data'     => &$data,\n                    'iw'       => $imageWidth,\n                    'ih'       => $imageHeight,\n                    'channels' => $channels\n                ]\n            );\n\n            $this->imagelist[$imgname] = [\n                'label' => $label,\n                'w'     => $imageWidth,\n                'h'     => $imageHeight,\n                'c'     => $channels\n            ];\n        }\n\n        $this->addContent(sprintf(\"\\nq\\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\\nQ \", $w, $h, $x, $y, $label));\n    }\n\n    /**\n     * specify where the document should open when it first starts\n     *\n     * @param $style\n     * @param int $a\n     * @param int $b\n     * @param int $c\n     */\n    function openHere($style, $a = 0, $b = 0, $c = 0)\n    {\n        // this function will open the document at a specified page, in a specified style\n        // the values for style, and the required parameters are:\n        // 'XYZ'  left, top, zoom\n        // 'Fit'\n        // 'FitH' top\n        // 'FitV' left\n        // 'FitR' left,bottom,right\n        // 'FitB'\n        // 'FitBH' top\n        // 'FitBV' left\n        $this->numObj++;\n        $this->o_destination(\n            $this->numObj,\n            'new',\n            ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c]\n        );\n        $id = $this->catalogId;\n        $this->o_catalog($id, 'openHere', $this->numObj);\n    }\n\n    /**\n     * Add JavaScript code to the PDF document\n     *\n     * @param string $code\n     */\n    function addJavascript($code)\n    {\n        $this->javascript .= $code;\n    }\n\n    /**\n     * create a labelled destination within the document\n     *\n     * @param $label\n     * @param $style\n     * @param int $a\n     * @param int $b\n     * @param int $c\n     */\n    function addDestination($label, $style, $a = 0, $b = 0, $c = 0)\n    {\n        // associates the given label with the destination, it is done this way so that a destination can be specified after\n        // it has been linked to\n        // styles are the same as the 'openHere' function\n        $this->numObj++;\n        $this->o_destination(\n            $this->numObj,\n            'new',\n            ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c]\n        );\n        $id = $this->numObj;\n\n        // store the label->idf relationship, note that this means that labels can be used only once\n        $this->destinations[\"$label\"] = $id;\n    }\n\n    /**\n     * define font families, this is used to initialize the font families for the default fonts\n     * and for the user to add new ones for their fonts. The default bahavious can be overridden should\n     * that be desired.\n     *\n     * @param $family\n     * @param string $options\n     */\n    function setFontFamily($family, $options = '')\n    {\n        if (!is_array($options)) {\n            if ($family === 'init') {\n                // set the known family groups\n                // these font families will be used to enable bold and italic markers to be included\n                // within text streams. html forms will be used... <b></b> <i></i>\n                $this->fontFamilies['Helvetica.afm'] =\n                    [\n                        'b'  => 'Helvetica-Bold.afm',\n                        'i'  => 'Helvetica-Oblique.afm',\n                        'bi' => 'Helvetica-BoldOblique.afm',\n                        'ib' => 'Helvetica-BoldOblique.afm'\n                    ];\n\n                $this->fontFamilies['Courier.afm'] =\n                    [\n                        'b'  => 'Courier-Bold.afm',\n                        'i'  => 'Courier-Oblique.afm',\n                        'bi' => 'Courier-BoldOblique.afm',\n                        'ib' => 'Courier-BoldOblique.afm'\n                    ];\n\n                $this->fontFamilies['Times-Roman.afm'] =\n                    [\n                        'b'  => 'Times-Bold.afm',\n                        'i'  => 'Times-Italic.afm',\n                        'bi' => 'Times-BoldItalic.afm',\n                        'ib' => 'Times-BoldItalic.afm'\n                    ];\n            }\n        } else {\n\n            // the user is trying to set a font family\n            // note that this can also be used to set the base ones to something else\n            if (mb_strlen($family)) {\n                $this->fontFamilies[$family] = $options;\n            }\n        }\n    }\n\n    /**\n     * used to add messages for use in debugging\n     *\n     * @param $message\n     */\n    function addMessage($message)\n    {\n        $this->messages .= $message . \"\\n\";\n    }\n\n    /**\n     * a few functions which should allow the document to be treated transactionally.\n     *\n     * @param $action\n     */\n    function transaction($action)\n    {\n        switch ($action) {\n            case 'start':\n                // store all the data away into the checkpoint variable\n                $data = get_object_vars($this);\n                $this->checkpoint = $data;\n                unset($data);\n                break;\n\n            case 'commit':\n                if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) {\n                    $tmp = $this->checkpoint['checkpoint'];\n                    $this->checkpoint = $tmp;\n                    unset($tmp);\n                } else {\n                    $this->checkpoint = '';\n                }\n                break;\n\n            case 'rewind':\n                // do not destroy the current checkpoint, but move us back to the state then, so that we can try again\n                if (is_array($this->checkpoint)) {\n                    // can only abort if were inside a checkpoint\n                    $tmp = $this->checkpoint;\n\n                    foreach ($tmp as $k => $v) {\n                        if ($k !== 'checkpoint') {\n                            $this->$k = $v;\n                        }\n                    }\n                    unset($tmp);\n                }\n                break;\n\n            case 'abort':\n                if (is_array($this->checkpoint)) {\n                    // can only abort if were inside a checkpoint\n                    $tmp = $this->checkpoint;\n                    foreach ($tmp as $k => $v) {\n                        $this->$k = $v;\n                    }\n                    unset($tmp);\n                }\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSans-Bold.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Bold\nUniqueID DejaVu Sans Bold\nFullName DejaVu Sans Bold\nVersion Version 2.37\nPostScriptName DejaVuSans-Bold\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Bold\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1069 -415 1975 1174\nStartCharMetrics 6196\nU 32 ; WX 348 ; N space ; G 3\nU 33 ; WX 456 ; N exclam ; G 4\nU 34 ; WX 521 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 696 ; N dollar ; G 7\nU 37 ; WX 1002 ; N percent ; G 8\nU 38 ; WX 872 ; N ampersand ; G 9\nU 39 ; WX 306 ; N quotesingle ; G 10\nU 40 ; WX 457 ; N parenleft ; G 11\nU 41 ; WX 457 ; N parenright ; G 12\nU 42 ; WX 523 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 380 ; N comma ; G 15\nU 45 ; WX 415 ; N hyphen ; G 16\nU 46 ; WX 380 ; N period ; G 17\nU 47 ; WX 365 ; N slash ; G 18\nU 48 ; WX 696 ; N zero ; G 19\nU 49 ; WX 696 ; N one ; G 20\nU 50 ; WX 696 ; N two ; G 21\nU 51 ; WX 696 ; N three ; G 22\nU 52 ; WX 696 ; N four ; G 23\nU 53 ; WX 696 ; N five ; G 24\nU 54 ; WX 696 ; N six ; G 25\nU 55 ; WX 696 ; N seven ; G 26\nU 56 ; WX 696 ; N eight ; G 27\nU 57 ; WX 696 ; N nine ; G 28\nU 58 ; WX 400 ; N colon ; G 29\nU 59 ; WX 400 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 580 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 774 ; N A ; G 36\nU 66 ; WX 762 ; N B ; G 37\nU 67 ; WX 734 ; N C ; G 38\nU 68 ; WX 830 ; N D ; G 39\nU 69 ; WX 683 ; N E ; G 40\nU 70 ; WX 683 ; N F ; G 41\nU 71 ; WX 821 ; N G ; G 42\nU 72 ; WX 837 ; N H ; G 43\nU 73 ; WX 372 ; N I ; G 44\nU 74 ; WX 372 ; N J ; G 45\nU 75 ; WX 775 ; N K ; G 46\nU 76 ; WX 637 ; N L ; G 47\nU 77 ; WX 995 ; N M ; G 48\nU 78 ; WX 837 ; N N ; G 49\nU 79 ; WX 850 ; N O ; G 50\nU 80 ; WX 733 ; N P ; G 51\nU 81 ; WX 850 ; N Q ; G 52\nU 82 ; WX 770 ; N R ; G 53\nU 83 ; WX 720 ; N S ; G 54\nU 84 ; WX 682 ; N T ; G 55\nU 85 ; WX 812 ; N U ; G 56\nU 86 ; WX 774 ; N V ; G 57\nU 87 ; WX 1103 ; N W ; G 58\nU 88 ; WX 771 ; N X ; G 59\nU 89 ; WX 724 ; N Y ; G 60\nU 90 ; WX 725 ; N Z ; G 61\nU 91 ; WX 457 ; N bracketleft ; G 62\nU 92 ; WX 365 ; N backslash ; G 63\nU 93 ; WX 457 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 675 ; N a ; G 68\nU 98 ; WX 716 ; N b ; G 69\nU 99 ; WX 593 ; N c ; G 70\nU 100 ; WX 716 ; N d ; G 71\nU 101 ; WX 678 ; N e ; G 72\nU 102 ; WX 435 ; N f ; G 73\nU 103 ; WX 716 ; N g ; G 74\nU 104 ; WX 712 ; N h ; G 75\nU 105 ; WX 343 ; N i ; G 76\nU 106 ; WX 343 ; N j ; G 77\nU 107 ; WX 665 ; N k ; G 78\nU 108 ; WX 343 ; N l ; G 79\nU 109 ; WX 1042 ; N m ; G 80\nU 110 ; WX 712 ; N n ; G 81\nU 111 ; WX 687 ; N o ; G 82\nU 112 ; WX 716 ; N p ; G 83\nU 113 ; WX 716 ; N q ; G 84\nU 114 ; WX 493 ; N r ; G 85\nU 115 ; WX 595 ; N s ; G 86\nU 116 ; WX 478 ; N t ; G 87\nU 117 ; WX 712 ; N u ; G 88\nU 118 ; WX 652 ; N v ; G 89\nU 119 ; WX 924 ; N w ; G 90\nU 120 ; WX 645 ; N x ; G 91\nU 121 ; WX 652 ; N y ; G 92\nU 122 ; WX 582 ; N z ; G 93\nU 123 ; WX 712 ; N braceleft ; G 94\nU 124 ; WX 365 ; N bar ; G 95\nU 125 ; WX 712 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 348 ; N nbspace ; G 98\nU 161 ; WX 456 ; N exclamdown ; G 99\nU 162 ; WX 696 ; N cent ; G 100\nU 163 ; WX 696 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 696 ; N yen ; G 103\nU 166 ; WX 365 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 564 ; N ordfeminine ; G 108\nU 171 ; WX 646 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 415 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 438 ; N twosuperior ; G 116\nU 179 ; WX 438 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 736 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 380 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 438 ; N onesuperior ; G 123\nU 186 ; WX 564 ; N ordmasculine ; G 124\nU 187 ; WX 646 ; N guillemotright ; G 125\nU 188 ; WX 1035 ; N onequarter ; G 126\nU 189 ; WX 1035 ; N onehalf ; G 127\nU 190 ; WX 1035 ; N threequarters ; G 128\nU 191 ; WX 580 ; N questiondown ; G 129\nU 192 ; WX 774 ; N Agrave ; G 130\nU 193 ; WX 774 ; N Aacute ; G 131\nU 194 ; WX 774 ; N Acircumflex ; G 132\nU 195 ; WX 774 ; N Atilde ; G 133\nU 196 ; WX 774 ; N Adieresis ; G 134\nU 197 ; WX 774 ; N Aring ; G 135\nU 198 ; WX 1085 ; N AE ; G 136\nU 199 ; WX 734 ; N Ccedilla ; G 137\nU 200 ; WX 683 ; N Egrave ; G 138\nU 201 ; WX 683 ; N Eacute ; G 139\nU 202 ; WX 683 ; N Ecircumflex ; G 140\nU 203 ; WX 683 ; N Edieresis ; G 141\nU 204 ; WX 372 ; N Igrave ; G 142\nU 205 ; WX 372 ; N Iacute ; G 143\nU 206 ; WX 372 ; N Icircumflex ; G 144\nU 207 ; WX 372 ; N Idieresis ; G 145\nU 208 ; WX 838 ; N Eth ; G 146\nU 209 ; WX 837 ; N Ntilde ; G 147\nU 210 ; WX 850 ; N Ograve ; G 148\nU 211 ; WX 850 ; N Oacute ; G 149\nU 212 ; WX 850 ; N Ocircumflex ; G 150\nU 213 ; WX 850 ; N Otilde ; G 151\nU 214 ; WX 850 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 850 ; N Oslash ; G 154\nU 217 ; WX 812 ; N Ugrave ; G 155\nU 218 ; WX 812 ; N Uacute ; G 156\nU 219 ; WX 812 ; N Ucircumflex ; G 157\nU 220 ; WX 812 ; N Udieresis ; G 158\nU 221 ; WX 724 ; N Yacute ; G 159\nU 222 ; WX 738 ; N Thorn ; G 160\nU 223 ; WX 719 ; N germandbls ; G 161\nU 224 ; WX 675 ; N agrave ; G 162\nU 225 ; WX 675 ; N aacute ; G 163\nU 226 ; WX 675 ; N acircumflex ; G 164\nU 227 ; WX 675 ; N atilde ; G 165\nU 228 ; WX 675 ; N adieresis ; G 166\nU 229 ; WX 675 ; N aring ; G 167\nU 230 ; WX 1048 ; N ae ; G 168\nU 231 ; WX 593 ; N ccedilla ; G 169\nU 232 ; WX 678 ; N egrave ; G 170\nU 233 ; WX 678 ; N eacute ; G 171\nU 234 ; WX 678 ; N ecircumflex ; G 172\nU 235 ; WX 678 ; N edieresis ; G 173\nU 236 ; WX 343 ; N igrave ; G 174\nU 237 ; WX 343 ; N iacute ; G 175\nU 238 ; WX 343 ; N icircumflex ; G 176\nU 239 ; WX 343 ; N idieresis ; G 177\nU 240 ; WX 687 ; N eth ; G 178\nU 241 ; WX 712 ; N ntilde ; G 179\nU 242 ; WX 687 ; N ograve ; G 180\nU 243 ; WX 687 ; N oacute ; G 181\nU 244 ; WX 687 ; N ocircumflex ; G 182\nU 245 ; WX 687 ; N otilde ; G 183\nU 246 ; WX 687 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 687 ; N oslash ; G 186\nU 249 ; WX 712 ; N ugrave ; G 187\nU 250 ; WX 712 ; N uacute ; G 188\nU 251 ; WX 712 ; N ucircumflex ; G 189\nU 252 ; WX 712 ; N udieresis ; G 190\nU 253 ; WX 652 ; N yacute ; G 191\nU 254 ; WX 716 ; N thorn ; G 192\nU 255 ; WX 652 ; N ydieresis ; G 193\nU 256 ; WX 774 ; N Amacron ; G 194\nU 257 ; WX 675 ; N amacron ; G 195\nU 258 ; WX 774 ; N Abreve ; G 196\nU 259 ; WX 675 ; N abreve ; G 197\nU 260 ; WX 774 ; N Aogonek ; G 198\nU 261 ; WX 675 ; N aogonek ; G 199\nU 262 ; WX 734 ; N Cacute ; G 200\nU 263 ; WX 593 ; N cacute ; G 201\nU 264 ; WX 734 ; N Ccircumflex ; G 202\nU 265 ; WX 593 ; N ccircumflex ; G 203\nU 266 ; WX 734 ; N Cdotaccent ; G 204\nU 267 ; WX 593 ; N cdotaccent ; G 205\nU 268 ; WX 734 ; N Ccaron ; G 206\nU 269 ; WX 593 ; N ccaron ; G 207\nU 270 ; WX 830 ; N Dcaron ; G 208\nU 271 ; WX 716 ; N dcaron ; G 209\nU 272 ; WX 838 ; N Dcroat ; G 210\nU 273 ; WX 716 ; N dmacron ; G 211\nU 274 ; WX 683 ; N Emacron ; G 212\nU 275 ; WX 678 ; N emacron ; G 213\nU 276 ; WX 683 ; N Ebreve ; G 214\nU 277 ; WX 678 ; N ebreve ; G 215\nU 278 ; WX 683 ; N Edotaccent ; G 216\nU 279 ; WX 678 ; N edotaccent ; G 217\nU 280 ; WX 683 ; N Eogonek ; G 218\nU 281 ; WX 678 ; N eogonek ; G 219\nU 282 ; WX 683 ; N Ecaron ; G 220\nU 283 ; WX 678 ; N ecaron ; G 221\nU 284 ; WX 821 ; N Gcircumflex ; G 222\nU 285 ; WX 716 ; N gcircumflex ; G 223\nU 286 ; WX 821 ; N Gbreve ; G 224\nU 287 ; WX 716 ; N gbreve ; G 225\nU 288 ; WX 821 ; N Gdotaccent ; G 226\nU 289 ; WX 716 ; N gdotaccent ; G 227\nU 290 ; WX 821 ; N Gcommaaccent ; G 228\nU 291 ; WX 716 ; N gcommaaccent ; G 229\nU 292 ; WX 837 ; N Hcircumflex ; G 230\nU 293 ; WX 712 ; N hcircumflex ; G 231\nU 294 ; WX 974 ; N Hbar ; G 232\nU 295 ; WX 790 ; N hbar ; G 233\nU 296 ; WX 372 ; N Itilde ; G 234\nU 297 ; WX 343 ; N itilde ; G 235\nU 298 ; WX 372 ; N Imacron ; G 236\nU 299 ; WX 343 ; N imacron ; G 237\nU 300 ; WX 372 ; N Ibreve ; G 238\nU 301 ; WX 343 ; N ibreve ; G 239\nU 302 ; WX 372 ; N Iogonek ; G 240\nU 303 ; WX 343 ; N iogonek ; G 241\nU 304 ; WX 372 ; N Idot ; G 242\nU 305 ; WX 343 ; N dotlessi ; G 243\nU 306 ; WX 744 ; N IJ ; G 244\nU 307 ; WX 686 ; N ij ; G 245\nU 308 ; WX 372 ; N Jcircumflex ; G 246\nU 309 ; WX 343 ; N jcircumflex ; G 247\nU 310 ; WX 775 ; N Kcommaaccent ; G 248\nU 311 ; WX 665 ; N kcommaaccent ; G 249\nU 312 ; WX 665 ; N kgreenlandic ; G 250\nU 313 ; WX 637 ; N Lacute ; G 251\nU 314 ; WX 343 ; N lacute ; G 252\nU 315 ; WX 637 ; N Lcommaaccent ; G 253\nU 316 ; WX 343 ; N lcommaaccent ; G 254\nU 317 ; WX 637 ; N Lcaron ; G 255\nU 318 ; WX 479 ; N lcaron ; G 256\nU 319 ; WX 637 ; N Ldot ; G 257\nU 320 ; WX 557 ; N ldot ; G 258\nU 321 ; WX 642 ; N Lslash ; G 259\nU 322 ; WX 371 ; N lslash ; G 260\nU 323 ; WX 837 ; N Nacute ; G 261\nU 324 ; WX 712 ; N nacute ; G 262\nU 325 ; WX 837 ; N Ncommaaccent ; G 263\nU 326 ; WX 712 ; N ncommaaccent ; G 264\nU 327 ; WX 837 ; N Ncaron ; G 265\nU 328 ; WX 712 ; N ncaron ; G 266\nU 329 ; WX 983 ; N napostrophe ; G 267\nU 330 ; WX 837 ; N Eng ; G 268\nU 331 ; WX 712 ; N eng ; G 269\nU 332 ; WX 850 ; N Omacron ; G 270\nU 333 ; WX 687 ; N omacron ; G 271\nU 334 ; WX 850 ; N Obreve ; G 272\nU 335 ; WX 687 ; N obreve ; G 273\nU 336 ; WX 850 ; N Ohungarumlaut ; G 274\nU 337 ; WX 687 ; N ohungarumlaut ; G 275\nU 338 ; WX 1167 ; N OE ; G 276\nU 339 ; WX 1094 ; N oe ; G 277\nU 340 ; WX 770 ; N Racute ; G 278\nU 341 ; WX 493 ; N racute ; G 279\nU 342 ; WX 770 ; N Rcommaaccent ; G 280\nU 343 ; WX 493 ; N rcommaaccent ; G 281\nU 344 ; WX 770 ; N Rcaron ; G 282\nU 345 ; WX 493 ; N rcaron ; G 283\nU 346 ; WX 720 ; N Sacute ; G 284\nU 347 ; WX 595 ; N sacute ; G 285\nU 348 ; WX 720 ; N Scircumflex ; G 286\nU 349 ; WX 595 ; N scircumflex ; G 287\nU 350 ; WX 720 ; N Scedilla ; G 288\nU 351 ; WX 595 ; N scedilla ; G 289\nU 352 ; WX 720 ; N Scaron ; G 290\nU 353 ; WX 595 ; N scaron ; G 291\nU 354 ; WX 682 ; N Tcommaaccent ; G 292\nU 355 ; WX 478 ; N tcommaaccent ; G 293\nU 356 ; WX 682 ; N Tcaron ; G 294\nU 357 ; WX 478 ; N tcaron ; G 295\nU 358 ; WX 682 ; N Tbar ; G 296\nU 359 ; WX 478 ; N tbar ; G 297\nU 360 ; WX 812 ; N Utilde ; G 298\nU 361 ; WX 712 ; N utilde ; G 299\nU 362 ; WX 812 ; N Umacron ; G 300\nU 363 ; WX 712 ; N umacron ; G 301\nU 364 ; WX 812 ; N Ubreve ; G 302\nU 365 ; WX 712 ; N ubreve ; G 303\nU 366 ; WX 812 ; N Uring ; G 304\nU 367 ; WX 712 ; N uring ; G 305\nU 368 ; WX 812 ; N Uhungarumlaut ; G 306\nU 369 ; WX 712 ; N uhungarumlaut ; G 307\nU 370 ; WX 812 ; N Uogonek ; G 308\nU 371 ; WX 712 ; N uogonek ; G 309\nU 372 ; WX 1103 ; N Wcircumflex ; G 310\nU 373 ; WX 924 ; N wcircumflex ; G 311\nU 374 ; WX 724 ; N Ycircumflex ; G 312\nU 375 ; WX 652 ; N ycircumflex ; G 313\nU 376 ; WX 724 ; N Ydieresis ; G 314\nU 377 ; WX 725 ; N Zacute ; G 315\nU 378 ; WX 582 ; N zacute ; G 316\nU 379 ; WX 725 ; N Zdotaccent ; G 317\nU 380 ; WX 582 ; N zdotaccent ; G 318\nU 381 ; WX 725 ; N Zcaron ; G 319\nU 382 ; WX 582 ; N zcaron ; G 320\nU 383 ; WX 435 ; N longs ; G 321\nU 384 ; WX 716 ; N uni0180 ; G 322\nU 385 ; WX 811 ; N uni0181 ; G 323\nU 386 ; WX 762 ; N uni0182 ; G 324\nU 387 ; WX 716 ; N uni0183 ; G 325\nU 388 ; WX 762 ; N uni0184 ; G 326\nU 389 ; WX 716 ; N uni0185 ; G 327\nU 390 ; WX 734 ; N uni0186 ; G 328\nU 391 ; WX 734 ; N uni0187 ; G 329\nU 392 ; WX 593 ; N uni0188 ; G 330\nU 393 ; WX 838 ; N uni0189 ; G 331\nU 394 ; WX 879 ; N uni018A ; G 332\nU 395 ; WX 757 ; N uni018B ; G 333\nU 396 ; WX 716 ; N uni018C ; G 334\nU 397 ; WX 688 ; N uni018D ; G 335\nU 398 ; WX 683 ; N uni018E ; G 336\nU 399 ; WX 849 ; N uni018F ; G 337\nU 400 ; WX 696 ; N uni0190 ; G 338\nU 401 ; WX 683 ; N uni0191 ; G 339\nU 402 ; WX 435 ; N florin ; G 340\nU 403 ; WX 821 ; N uni0193 ; G 341\nU 404 ; WX 793 ; N uni0194 ; G 342\nU 405 ; WX 1045 ; N uni0195 ; G 343\nU 406 ; WX 436 ; N uni0196 ; G 344\nU 407 ; WX 389 ; N uni0197 ; G 345\nU 408 ; WX 775 ; N uni0198 ; G 346\nU 409 ; WX 665 ; N uni0199 ; G 347\nU 410 ; WX 360 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 1042 ; N uni019C ; G 350\nU 413 ; WX 837 ; N uni019D ; G 351\nU 414 ; WX 712 ; N uni019E ; G 352\nU 415 ; WX 850 ; N uni019F ; G 353\nU 416 ; WX 874 ; N Ohorn ; G 354\nU 417 ; WX 687 ; N ohorn ; G 355\nU 418 ; WX 1083 ; N uni01A2 ; G 356\nU 419 ; WX 912 ; N uni01A3 ; G 357\nU 420 ; WX 782 ; N uni01A4 ; G 358\nU 421 ; WX 716 ; N uni01A5 ; G 359\nU 422 ; WX 770 ; N uni01A6 ; G 360\nU 423 ; WX 720 ; N uni01A7 ; G 361\nU 424 ; WX 595 ; N uni01A8 ; G 362\nU 425 ; WX 683 ; N uni01A9 ; G 363\nU 426 ; WX 552 ; N uni01AA ; G 364\nU 427 ; WX 478 ; N uni01AB ; G 365\nU 428 ; WX 707 ; N uni01AC ; G 366\nU 429 ; WX 478 ; N uni01AD ; G 367\nU 430 ; WX 682 ; N uni01AE ; G 368\nU 431 ; WX 835 ; N Uhorn ; G 369\nU 432 ; WX 712 ; N uhorn ; G 370\nU 433 ; WX 850 ; N uni01B1 ; G 371\nU 434 ; WX 813 ; N uni01B2 ; G 372\nU 435 ; WX 797 ; N uni01B3 ; G 373\nU 436 ; WX 778 ; N uni01B4 ; G 374\nU 437 ; WX 725 ; N uni01B5 ; G 375\nU 438 ; WX 582 ; N uni01B6 ; G 376\nU 439 ; WX 772 ; N uni01B7 ; G 377\nU 440 ; WX 772 ; N uni01B8 ; G 378\nU 441 ; WX 641 ; N uni01B9 ; G 379\nU 442 ; WX 582 ; N uni01BA ; G 380\nU 443 ; WX 696 ; N uni01BB ; G 381\nU 444 ; WX 772 ; N uni01BC ; G 382\nU 445 ; WX 641 ; N uni01BD ; G 383\nU 446 ; WX 573 ; N uni01BE ; G 384\nU 447 ; WX 716 ; N uni01BF ; G 385\nU 448 ; WX 372 ; N uni01C0 ; G 386\nU 449 ; WX 659 ; N uni01C1 ; G 387\nU 450 ; WX 544 ; N uni01C2 ; G 388\nU 451 ; WX 372 ; N uni01C3 ; G 389\nU 452 ; WX 1555 ; N uni01C4 ; G 390\nU 453 ; WX 1412 ; N uni01C5 ; G 391\nU 454 ; WX 1298 ; N uni01C6 ; G 392\nU 455 ; WX 1009 ; N uni01C7 ; G 393\nU 456 ; WX 980 ; N uni01C8 ; G 394\nU 457 ; WX 686 ; N uni01C9 ; G 395\nU 458 ; WX 1209 ; N uni01CA ; G 396\nU 459 ; WX 1180 ; N uni01CB ; G 397\nU 460 ; WX 1055 ; N uni01CC ; G 398\nU 461 ; WX 774 ; N uni01CD ; G 399\nU 462 ; WX 675 ; N uni01CE ; G 400\nU 463 ; WX 372 ; N uni01CF ; G 401\nU 464 ; WX 343 ; N uni01D0 ; G 402\nU 465 ; WX 850 ; N uni01D1 ; G 403\nU 466 ; WX 687 ; N uni01D2 ; G 404\nU 467 ; WX 812 ; N uni01D3 ; G 405\nU 468 ; WX 712 ; N uni01D4 ; G 406\nU 469 ; WX 812 ; N uni01D5 ; G 407\nU 470 ; WX 712 ; N uni01D6 ; G 408\nU 471 ; WX 812 ; N uni01D7 ; G 409\nU 472 ; WX 712 ; N uni01D8 ; G 410\nU 473 ; WX 812 ; N uni01D9 ; G 411\nU 474 ; WX 712 ; N uni01DA ; G 412\nU 475 ; WX 812 ; N uni01DB ; G 413\nU 476 ; WX 712 ; N uni01DC ; G 414\nU 477 ; WX 678 ; N uni01DD ; G 415\nU 478 ; WX 774 ; N uni01DE ; G 416\nU 479 ; WX 675 ; N uni01DF ; G 417\nU 480 ; WX 774 ; N uni01E0 ; G 418\nU 481 ; WX 675 ; N uni01E1 ; G 419\nU 482 ; WX 1085 ; N uni01E2 ; G 420\nU 483 ; WX 1048 ; N uni01E3 ; G 421\nU 484 ; WX 821 ; N uni01E4 ; G 422\nU 485 ; WX 716 ; N uni01E5 ; G 423\nU 486 ; WX 821 ; N Gcaron ; G 424\nU 487 ; WX 716 ; N gcaron ; G 425\nU 488 ; WX 775 ; N uni01E8 ; G 426\nU 489 ; WX 665 ; N uni01E9 ; G 427\nU 490 ; WX 850 ; N uni01EA ; G 428\nU 491 ; WX 687 ; N uni01EB ; G 429\nU 492 ; WX 850 ; N uni01EC ; G 430\nU 493 ; WX 687 ; N uni01ED ; G 431\nU 494 ; WX 772 ; N uni01EE ; G 432\nU 495 ; WX 582 ; N uni01EF ; G 433\nU 496 ; WX 343 ; N uni01F0 ; G 434\nU 497 ; WX 1555 ; N uni01F1 ; G 435\nU 498 ; WX 1412 ; N uni01F2 ; G 436\nU 499 ; WX 1298 ; N uni01F3 ; G 437\nU 500 ; WX 821 ; N uni01F4 ; G 438\nU 501 ; WX 716 ; N uni01F5 ; G 439\nU 502 ; WX 1289 ; N uni01F6 ; G 440\nU 503 ; WX 787 ; N uni01F7 ; G 441\nU 504 ; WX 837 ; N uni01F8 ; G 442\nU 505 ; WX 712 ; N uni01F9 ; G 443\nU 506 ; WX 774 ; N Aringacute ; G 444\nU 507 ; WX 675 ; N aringacute ; G 445\nU 508 ; WX 1085 ; N AEacute ; G 446\nU 509 ; WX 1048 ; N aeacute ; G 447\nU 510 ; WX 850 ; N Oslashacute ; G 448\nU 511 ; WX 687 ; N oslashacute ; G 449\nU 512 ; WX 774 ; N uni0200 ; G 450\nU 513 ; WX 675 ; N uni0201 ; G 451\nU 514 ; WX 774 ; N uni0202 ; G 452\nU 515 ; WX 675 ; N uni0203 ; G 453\nU 516 ; WX 683 ; N uni0204 ; G 454\nU 517 ; WX 678 ; N uni0205 ; G 455\nU 518 ; WX 683 ; N uni0206 ; G 456\nU 519 ; WX 678 ; N uni0207 ; G 457\nU 520 ; WX 372 ; N uni0208 ; G 458\nU 521 ; WX 343 ; N uni0209 ; G 459\nU 522 ; WX 372 ; N uni020A ; G 460\nU 523 ; WX 343 ; N uni020B ; G 461\nU 524 ; WX 850 ; N uni020C ; G 462\nU 525 ; WX 687 ; N uni020D ; G 463\nU 526 ; WX 850 ; N uni020E ; G 464\nU 527 ; WX 687 ; N uni020F ; G 465\nU 528 ; WX 770 ; N uni0210 ; G 466\nU 529 ; WX 493 ; N uni0211 ; G 467\nU 530 ; WX 770 ; N uni0212 ; G 468\nU 531 ; WX 493 ; N uni0213 ; G 469\nU 532 ; WX 812 ; N uni0214 ; G 470\nU 533 ; WX 712 ; N uni0215 ; G 471\nU 534 ; WX 812 ; N uni0216 ; G 472\nU 535 ; WX 712 ; N uni0217 ; G 473\nU 536 ; WX 720 ; N Scommaaccent ; G 474\nU 537 ; WX 595 ; N scommaaccent ; G 475\nU 538 ; WX 682 ; N uni021A ; G 476\nU 539 ; WX 478 ; N uni021B ; G 477\nU 540 ; WX 690 ; N uni021C ; G 478\nU 541 ; WX 607 ; N uni021D ; G 479\nU 542 ; WX 837 ; N uni021E ; G 480\nU 543 ; WX 712 ; N uni021F ; G 481\nU 544 ; WX 837 ; N uni0220 ; G 482\nU 545 ; WX 865 ; N uni0221 ; G 483\nU 546 ; WX 809 ; N uni0222 ; G 484\nU 547 ; WX 659 ; N uni0223 ; G 485\nU 548 ; WX 725 ; N uni0224 ; G 486\nU 549 ; WX 582 ; N uni0225 ; G 487\nU 550 ; WX 774 ; N uni0226 ; G 488\nU 551 ; WX 675 ; N uni0227 ; G 489\nU 552 ; WX 683 ; N uni0228 ; G 490\nU 553 ; WX 678 ; N uni0229 ; G 491\nU 554 ; WX 850 ; N uni022A ; G 492\nU 555 ; WX 687 ; N uni022B ; G 493\nU 556 ; WX 850 ; N uni022C ; G 494\nU 557 ; WX 687 ; N uni022D ; G 495\nU 558 ; WX 850 ; N uni022E ; G 496\nU 559 ; WX 687 ; N uni022F ; G 497\nU 560 ; WX 850 ; N uni0230 ; G 498\nU 561 ; WX 687 ; N uni0231 ; G 499\nU 562 ; WX 724 ; N uni0232 ; G 500\nU 563 ; WX 652 ; N uni0233 ; G 501\nU 564 ; WX 492 ; N uni0234 ; G 502\nU 565 ; WX 867 ; N uni0235 ; G 503\nU 566 ; WX 512 ; N uni0236 ; G 504\nU 567 ; WX 343 ; N dotlessj ; G 505\nU 568 ; WX 1088 ; N uni0238 ; G 506\nU 569 ; WX 1088 ; N uni0239 ; G 507\nU 570 ; WX 774 ; N uni023A ; G 508\nU 571 ; WX 734 ; N uni023B ; G 509\nU 572 ; WX 593 ; N uni023C ; G 510\nU 573 ; WX 637 ; N uni023D ; G 511\nU 574 ; WX 682 ; N uni023E ; G 512\nU 575 ; WX 595 ; N uni023F ; G 513\nU 576 ; WX 582 ; N uni0240 ; G 514\nU 577 ; WX 782 ; N uni0241 ; G 515\nU 578 ; WX 614 ; N uni0242 ; G 516\nU 579 ; WX 762 ; N uni0243 ; G 517\nU 580 ; WX 812 ; N uni0244 ; G 518\nU 581 ; WX 774 ; N uni0245 ; G 519\nU 582 ; WX 683 ; N uni0246 ; G 520\nU 583 ; WX 678 ; N uni0247 ; G 521\nU 584 ; WX 372 ; N uni0248 ; G 522\nU 585 ; WX 343 ; N uni0249 ; G 523\nU 586 ; WX 860 ; N uni024A ; G 524\nU 587 ; WX 791 ; N uni024B ; G 525\nU 588 ; WX 770 ; N uni024C ; G 526\nU 589 ; WX 493 ; N uni024D ; G 527\nU 590 ; WX 724 ; N uni024E ; G 528\nU 591 ; WX 652 ; N uni024F ; G 529\nU 592 ; WX 675 ; N uni0250 ; G 530\nU 593 ; WX 716 ; N uni0251 ; G 531\nU 594 ; WX 716 ; N uni0252 ; G 532\nU 595 ; WX 716 ; N uni0253 ; G 533\nU 596 ; WX 593 ; N uni0254 ; G 534\nU 597 ; WX 593 ; N uni0255 ; G 535\nU 598 ; WX 717 ; N uni0256 ; G 536\nU 599 ; WX 792 ; N uni0257 ; G 537\nU 600 ; WX 678 ; N uni0258 ; G 538\nU 601 ; WX 678 ; N uni0259 ; G 539\nU 602 ; WX 876 ; N uni025A ; G 540\nU 603 ; WX 557 ; N uni025B ; G 541\nU 604 ; WX 545 ; N uni025C ; G 542\nU 605 ; WX 815 ; N uni025D ; G 543\nU 606 ; WX 731 ; N uni025E ; G 544\nU 607 ; WX 343 ; N uni025F ; G 545\nU 608 ; WX 792 ; N uni0260 ; G 546\nU 609 ; WX 716 ; N uni0261 ; G 547\nU 610 ; WX 627 ; N uni0262 ; G 548\nU 611 ; WX 644 ; N uni0263 ; G 549\nU 612 ; WX 635 ; N uni0264 ; G 550\nU 613 ; WX 712 ; N uni0265 ; G 551\nU 614 ; WX 712 ; N uni0266 ; G 552\nU 615 ; WX 712 ; N uni0267 ; G 553\nU 616 ; WX 545 ; N uni0268 ; G 554\nU 617 ; WX 440 ; N uni0269 ; G 555\nU 618 ; WX 545 ; N uni026A ; G 556\nU 619 ; WX 559 ; N uni026B ; G 557\nU 620 ; WX 693 ; N uni026C ; G 558\nU 621 ; WX 343 ; N uni026D ; G 559\nU 622 ; WX 841 ; N uni026E ; G 560\nU 623 ; WX 1042 ; N uni026F ; G 561\nU 624 ; WX 1042 ; N uni0270 ; G 562\nU 625 ; WX 1042 ; N uni0271 ; G 563\nU 626 ; WX 712 ; N uni0272 ; G 564\nU 627 ; WX 793 ; N uni0273 ; G 565\nU 628 ; WX 707 ; N uni0274 ; G 566\nU 629 ; WX 687 ; N uni0275 ; G 567\nU 630 ; WX 909 ; N uni0276 ; G 568\nU 631 ; WX 681 ; N uni0277 ; G 569\nU 632 ; WX 796 ; N uni0278 ; G 570\nU 633 ; WX 538 ; N uni0279 ; G 571\nU 634 ; WX 538 ; N uni027A ; G 572\nU 635 ; WX 650 ; N uni027B ; G 573\nU 636 ; WX 493 ; N uni027C ; G 574\nU 637 ; WX 493 ; N uni027D ; G 575\nU 638 ; WX 596 ; N uni027E ; G 576\nU 639 ; WX 596 ; N uni027F ; G 577\nU 640 ; WX 642 ; N uni0280 ; G 578\nU 641 ; WX 642 ; N uni0281 ; G 579\nU 642 ; WX 595 ; N uni0282 ; G 580\nU 643 ; WX 415 ; N uni0283 ; G 581\nU 644 ; WX 435 ; N uni0284 ; G 582\nU 645 ; WX 605 ; N uni0285 ; G 583\nU 646 ; WX 552 ; N uni0286 ; G 584\nU 647 ; WX 478 ; N uni0287 ; G 585\nU 648 ; WX 478 ; N uni0288 ; G 586\nU 649 ; WX 920 ; N uni0289 ; G 587\nU 650 ; WX 772 ; N uni028A ; G 588\nU 651 ; WX 670 ; N uni028B ; G 589\nU 652 ; WX 652 ; N uni028C ; G 590\nU 653 ; WX 924 ; N uni028D ; G 591\nU 654 ; WX 652 ; N uni028E ; G 592\nU 655 ; WX 724 ; N uni028F ; G 593\nU 656 ; WX 694 ; N uni0290 ; G 594\nU 657 ; WX 684 ; N uni0291 ; G 595\nU 658 ; WX 641 ; N uni0292 ; G 596\nU 659 ; WX 641 ; N uni0293 ; G 597\nU 660 ; WX 573 ; N uni0294 ; G 598\nU 661 ; WX 573 ; N uni0295 ; G 599\nU 662 ; WX 573 ; N uni0296 ; G 600\nU 663 ; WX 573 ; N uni0297 ; G 601\nU 664 ; WX 850 ; N uni0298 ; G 602\nU 665 ; WX 633 ; N uni0299 ; G 603\nU 666 ; WX 731 ; N uni029A ; G 604\nU 667 ; WX 685 ; N uni029B ; G 605\nU 668 ; WX 691 ; N uni029C ; G 606\nU 669 ; WX 343 ; N uni029D ; G 607\nU 670 ; WX 732 ; N uni029E ; G 608\nU 671 ; WX 539 ; N uni029F ; G 609\nU 672 ; WX 792 ; N uni02A0 ; G 610\nU 673 ; WX 573 ; N uni02A1 ; G 611\nU 674 ; WX 573 ; N uni02A2 ; G 612\nU 675 ; WX 1156 ; N uni02A3 ; G 613\nU 676 ; WX 1214 ; N uni02A4 ; G 614\nU 677 ; WX 1155 ; N uni02A5 ; G 615\nU 678 ; WX 975 ; N uni02A6 ; G 616\nU 679 ; WX 769 ; N uni02A7 ; G 617\nU 680 ; WX 929 ; N uni02A8 ; G 618\nU 681 ; WX 1026 ; N uni02A9 ; G 619\nU 682 ; WX 862 ; N uni02AA ; G 620\nU 683 ; WX 780 ; N uni02AB ; G 621\nU 684 ; WX 591 ; N uni02AC ; G 622\nU 685 ; WX 415 ; N uni02AD ; G 623\nU 686 ; WX 677 ; N uni02AE ; G 624\nU 687 ; WX 789 ; N uni02AF ; G 625\nU 688 ; WX 456 ; N uni02B0 ; G 626\nU 689 ; WX 456 ; N uni02B1 ; G 627\nU 690 ; WX 219 ; N uni02B2 ; G 628\nU 691 ; WX 315 ; N uni02B3 ; G 629\nU 692 ; WX 315 ; N uni02B4 ; G 630\nU 693 ; WX 315 ; N uni02B5 ; G 631\nU 694 ; WX 411 ; N uni02B6 ; G 632\nU 695 ; WX 591 ; N uni02B7 ; G 633\nU 696 ; WX 417 ; N uni02B8 ; G 634\nU 697 ; WX 302 ; N uni02B9 ; G 635\nU 698 ; WX 521 ; N uni02BA ; G 636\nU 699 ; WX 380 ; N uni02BB ; G 637\nU 700 ; WX 380 ; N uni02BC ; G 638\nU 701 ; WX 380 ; N uni02BD ; G 639\nU 702 ; WX 366 ; N uni02BE ; G 640\nU 703 ; WX 366 ; N uni02BF ; G 641\nU 704 ; WX 326 ; N uni02C0 ; G 642\nU 705 ; WX 326 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 306 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 306 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 366 ; N uni02D2 ; G 660\nU 723 ; WX 366 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 416 ; N uni02D6 ; G 664\nU 727 ; WX 328 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 351 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 412 ; N uni02E0 ; G 674\nU 737 ; WX 219 ; N uni02E1 ; G 675\nU 738 ; WX 381 ; N uni02E2 ; G 676\nU 739 ; WX 413 ; N uni02E3 ; G 677\nU 740 ; WX 326 ; N uni02E4 ; G 678\nU 741 ; WX 500 ; N uni02E5 ; G 679\nU 742 ; WX 500 ; N uni02E6 ; G 680\nU 743 ; WX 500 ; N uni02E7 ; G 681\nU 744 ; WX 500 ; N uni02E8 ; G 682\nU 745 ; WX 500 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 657 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 698 ; N uni0370 ; G 782\nU 881 ; WX 565 ; N uni0371 ; G 783\nU 882 ; WX 1022 ; N uni0372 ; G 784\nU 883 ; WX 836 ; N uni0373 ; G 785\nU 884 ; WX 302 ; N uni0374 ; G 786\nU 885 ; WX 302 ; N uni0375 ; G 787\nU 886 ; WX 837 ; N uni0376 ; G 788\nU 887 ; WX 701 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 593 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 400 ; N uni037E ; G 794\nU 895 ; WX 372 ; N uni037F ; G 795\nU 900 ; WX 441 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 797 ; N Alphatonos ; G 798\nU 903 ; WX 380 ; N anoteleia ; G 799\nU 904 ; WX 846 ; N Epsilontonos ; G 800\nU 905 ; WX 1009 ; N Etatonos ; G 801\nU 906 ; WX 563 ; N Iotatonos ; G 802\nU 908 ; WX 891 ; N Omicrontonos ; G 803\nU 910 ; WX 980 ; N Upsilontonos ; G 804\nU 911 ; WX 894 ; N Omegatonos ; G 805\nU 912 ; WX 390 ; N iotadieresistonos ; G 806\nU 913 ; WX 774 ; N Alpha ; G 807\nU 914 ; WX 762 ; N Beta ; G 808\nU 915 ; WX 637 ; N Gamma ; G 809\nU 916 ; WX 774 ; N uni0394 ; G 810\nU 917 ; WX 683 ; N Epsilon ; G 811\nU 918 ; WX 725 ; N Zeta ; G 812\nU 919 ; WX 837 ; N Eta ; G 813\nU 920 ; WX 850 ; N Theta ; G 814\nU 921 ; WX 372 ; N Iota ; G 815\nU 922 ; WX 775 ; N Kappa ; G 816\nU 923 ; WX 774 ; N Lambda ; G 817\nU 924 ; WX 995 ; N Mu ; G 818\nU 925 ; WX 837 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 850 ; N Omicron ; G 821\nU 928 ; WX 837 ; N Pi ; G 822\nU 929 ; WX 733 ; N Rho ; G 823\nU 931 ; WX 683 ; N Sigma ; G 824\nU 932 ; WX 682 ; N Tau ; G 825\nU 933 ; WX 724 ; N Upsilon ; G 826\nU 934 ; WX 850 ; N Phi ; G 827\nU 935 ; WX 771 ; N Chi ; G 828\nU 936 ; WX 850 ; N Psi ; G 829\nU 937 ; WX 850 ; N Omega ; G 830\nU 938 ; WX 372 ; N Iotadieresis ; G 831\nU 939 ; WX 724 ; N Upsilondieresis ; G 832\nU 940 ; WX 687 ; N alphatonos ; G 833\nU 941 ; WX 557 ; N epsilontonos ; G 834\nU 942 ; WX 712 ; N etatonos ; G 835\nU 943 ; WX 390 ; N iotatonos ; G 836\nU 944 ; WX 675 ; N upsilondieresistonos ; G 837\nU 945 ; WX 687 ; N alpha ; G 838\nU 946 ; WX 716 ; N beta ; G 839\nU 947 ; WX 681 ; N gamma ; G 840\nU 948 ; WX 687 ; N delta ; G 841\nU 949 ; WX 557 ; N epsilon ; G 842\nU 950 ; WX 591 ; N zeta ; G 843\nU 951 ; WX 712 ; N eta ; G 844\nU 952 ; WX 687 ; N theta ; G 845\nU 953 ; WX 390 ; N iota ; G 846\nU 954 ; WX 710 ; N kappa ; G 847\nU 955 ; WX 633 ; N lambda ; G 848\nU 956 ; WX 736 ; N uni03BC ; G 849\nU 957 ; WX 681 ; N nu ; G 850\nU 958 ; WX 591 ; N xi ; G 851\nU 959 ; WX 687 ; N omicron ; G 852\nU 960 ; WX 791 ; N pi ; G 853\nU 961 ; WX 716 ; N rho ; G 854\nU 962 ; WX 593 ; N sigma1 ; G 855\nU 963 ; WX 779 ; N sigma ; G 856\nU 964 ; WX 638 ; N tau ; G 857\nU 965 ; WX 675 ; N upsilon ; G 858\nU 966 ; WX 782 ; N phi ; G 859\nU 967 ; WX 645 ; N chi ; G 860\nU 968 ; WX 794 ; N psi ; G 861\nU 969 ; WX 869 ; N omega ; G 862\nU 970 ; WX 390 ; N iotadieresis ; G 863\nU 971 ; WX 675 ; N upsilondieresis ; G 864\nU 972 ; WX 687 ; N omicrontonos ; G 865\nU 973 ; WX 675 ; N upsilontonos ; G 866\nU 974 ; WX 869 ; N omegatonos ; G 867\nU 975 ; WX 775 ; N uni03CF ; G 868\nU 976 ; WX 651 ; N uni03D0 ; G 869\nU 977 ; WX 661 ; N theta1 ; G 870\nU 978 ; WX 746 ; N Upsilon1 ; G 871\nU 979 ; WX 981 ; N uni03D3 ; G 872\nU 980 ; WX 746 ; N uni03D4 ; G 873\nU 981 ; WX 796 ; N phi1 ; G 874\nU 982 ; WX 869 ; N omega1 ; G 875\nU 983 ; WX 744 ; N uni03D7 ; G 876\nU 984 ; WX 850 ; N uni03D8 ; G 877\nU 985 ; WX 687 ; N uni03D9 ; G 878\nU 986 ; WX 734 ; N uni03DA ; G 879\nU 987 ; WX 593 ; N uni03DB ; G 880\nU 988 ; WX 683 ; N uni03DC ; G 881\nU 989 ; WX 494 ; N uni03DD ; G 882\nU 990 ; WX 702 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 919 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 1093 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 832 ; N uni03E4 ; G 889\nU 997 ; WX 716 ; N uni03E5 ; G 890\nU 998 ; WX 928 ; N uni03E6 ; G 891\nU 999 ; WX 744 ; N uni03E7 ; G 892\nU 1000 ; WX 733 ; N uni03E8 ; G 893\nU 1001 ; WX 650 ; N uni03E9 ; G 894\nU 1002 ; WX 789 ; N uni03EA ; G 895\nU 1003 ; WX 671 ; N uni03EB ; G 896\nU 1004 ; WX 752 ; N uni03EC ; G 897\nU 1005 ; WX 716 ; N uni03ED ; G 898\nU 1006 ; WX 682 ; N uni03EE ; G 899\nU 1007 ; WX 590 ; N uni03EF ; G 900\nU 1008 ; WX 744 ; N uni03F0 ; G 901\nU 1009 ; WX 716 ; N uni03F1 ; G 902\nU 1010 ; WX 593 ; N uni03F2 ; G 903\nU 1011 ; WX 343 ; N uni03F3 ; G 904\nU 1012 ; WX 850 ; N uni03F4 ; G 905\nU 1013 ; WX 645 ; N uni03F5 ; G 906\nU 1014 ; WX 644 ; N uni03F6 ; G 907\nU 1015 ; WX 738 ; N uni03F7 ; G 908\nU 1016 ; WX 716 ; N uni03F8 ; G 909\nU 1017 ; WX 734 ; N uni03F9 ; G 910\nU 1018 ; WX 995 ; N uni03FA ; G 911\nU 1019 ; WX 732 ; N uni03FB ; G 912\nU 1020 ; WX 716 ; N uni03FC ; G 913\nU 1021 ; WX 698 ; N uni03FD ; G 914\nU 1022 ; WX 734 ; N uni03FE ; G 915\nU 1023 ; WX 698 ; N uni03FF ; G 916\nU 1024 ; WX 683 ; N uni0400 ; G 917\nU 1025 ; WX 683 ; N uni0401 ; G 918\nU 1026 ; WX 878 ; N uni0402 ; G 919\nU 1027 ; WX 637 ; N uni0403 ; G 920\nU 1028 ; WX 734 ; N uni0404 ; G 921\nU 1029 ; WX 720 ; N uni0405 ; G 922\nU 1030 ; WX 372 ; N uni0406 ; G 923\nU 1031 ; WX 372 ; N uni0407 ; G 924\nU 1032 ; WX 372 ; N uni0408 ; G 925\nU 1033 ; WX 1154 ; N uni0409 ; G 926\nU 1034 ; WX 1130 ; N uni040A ; G 927\nU 1035 ; WX 878 ; N uni040B ; G 928\nU 1036 ; WX 817 ; N uni040C ; G 929\nU 1037 ; WX 837 ; N uni040D ; G 930\nU 1038 ; WX 771 ; N uni040E ; G 931\nU 1039 ; WX 837 ; N uni040F ; G 932\nU 1040 ; WX 774 ; N uni0410 ; G 933\nU 1041 ; WX 762 ; N uni0411 ; G 934\nU 1042 ; WX 762 ; N uni0412 ; G 935\nU 1043 ; WX 637 ; N uni0413 ; G 936\nU 1044 ; WX 891 ; N uni0414 ; G 937\nU 1045 ; WX 683 ; N uni0415 ; G 938\nU 1046 ; WX 1224 ; N uni0416 ; G 939\nU 1047 ; WX 710 ; N uni0417 ; G 940\nU 1048 ; WX 837 ; N uni0418 ; G 941\nU 1049 ; WX 837 ; N uni0419 ; G 942\nU 1050 ; WX 817 ; N uni041A ; G 943\nU 1051 ; WX 831 ; N uni041B ; G 944\nU 1052 ; WX 995 ; N uni041C ; G 945\nU 1053 ; WX 837 ; N uni041D ; G 946\nU 1054 ; WX 850 ; N uni041E ; G 947\nU 1055 ; WX 837 ; N uni041F ; G 948\nU 1056 ; WX 733 ; N uni0420 ; G 949\nU 1057 ; WX 734 ; N uni0421 ; G 950\nU 1058 ; WX 682 ; N uni0422 ; G 951\nU 1059 ; WX 771 ; N uni0423 ; G 952\nU 1060 ; WX 992 ; N uni0424 ; G 953\nU 1061 ; WX 771 ; N uni0425 ; G 954\nU 1062 ; WX 928 ; N uni0426 ; G 955\nU 1063 ; WX 808 ; N uni0427 ; G 956\nU 1064 ; WX 1235 ; N uni0428 ; G 957\nU 1065 ; WX 1326 ; N uni0429 ; G 958\nU 1066 ; WX 939 ; N uni042A ; G 959\nU 1067 ; WX 1036 ; N uni042B ; G 960\nU 1068 ; WX 762 ; N uni042C ; G 961\nU 1069 ; WX 734 ; N uni042D ; G 962\nU 1070 ; WX 1174 ; N uni042E ; G 963\nU 1071 ; WX 770 ; N uni042F ; G 964\nU 1072 ; WX 675 ; N uni0430 ; G 965\nU 1073 ; WX 698 ; N uni0431 ; G 966\nU 1074 ; WX 633 ; N uni0432 ; G 967\nU 1075 ; WX 522 ; N uni0433 ; G 968\nU 1076 ; WX 808 ; N uni0434 ; G 969\nU 1077 ; WX 678 ; N uni0435 ; G 970\nU 1078 ; WX 995 ; N uni0436 ; G 971\nU 1079 ; WX 581 ; N uni0437 ; G 972\nU 1080 ; WX 701 ; N uni0438 ; G 973\nU 1081 ; WX 701 ; N uni0439 ; G 974\nU 1082 ; WX 679 ; N uni043A ; G 975\nU 1083 ; WX 732 ; N uni043B ; G 976\nU 1084 ; WX 817 ; N uni043C ; G 977\nU 1085 ; WX 691 ; N uni043D ; G 978\nU 1086 ; WX 687 ; N uni043E ; G 979\nU 1087 ; WX 691 ; N uni043F ; G 980\nU 1088 ; WX 716 ; N uni0440 ; G 981\nU 1089 ; WX 593 ; N uni0441 ; G 982\nU 1090 ; WX 580 ; N uni0442 ; G 983\nU 1091 ; WX 652 ; N uni0443 ; G 984\nU 1092 ; WX 992 ; N uni0444 ; G 985\nU 1093 ; WX 645 ; N uni0445 ; G 986\nU 1094 ; WX 741 ; N uni0446 ; G 987\nU 1095 ; WX 687 ; N uni0447 ; G 988\nU 1096 ; WX 1062 ; N uni0448 ; G 989\nU 1097 ; WX 1105 ; N uni0449 ; G 990\nU 1098 ; WX 751 ; N uni044A ; G 991\nU 1099 ; WX 904 ; N uni044B ; G 992\nU 1100 ; WX 632 ; N uni044C ; G 993\nU 1101 ; WX 593 ; N uni044D ; G 994\nU 1102 ; WX 972 ; N uni044E ; G 995\nU 1103 ; WX 642 ; N uni044F ; G 996\nU 1104 ; WX 678 ; N uni0450 ; G 997\nU 1105 ; WX 678 ; N uni0451 ; G 998\nU 1106 ; WX 714 ; N uni0452 ; G 999\nU 1107 ; WX 522 ; N uni0453 ; G 1000\nU 1108 ; WX 593 ; N uni0454 ; G 1001\nU 1109 ; WX 595 ; N uni0455 ; G 1002\nU 1110 ; WX 343 ; N uni0456 ; G 1003\nU 1111 ; WX 343 ; N uni0457 ; G 1004\nU 1112 ; WX 343 ; N uni0458 ; G 1005\nU 1113 ; WX 991 ; N uni0459 ; G 1006\nU 1114 ; WX 956 ; N uni045A ; G 1007\nU 1115 ; WX 734 ; N uni045B ; G 1008\nU 1116 ; WX 679 ; N uni045C ; G 1009\nU 1117 ; WX 701 ; N uni045D ; G 1010\nU 1118 ; WX 652 ; N uni045E ; G 1011\nU 1119 ; WX 691 ; N uni045F ; G 1012\nU 1120 ; WX 1093 ; N uni0460 ; G 1013\nU 1121 ; WX 869 ; N uni0461 ; G 1014\nU 1122 ; WX 840 ; N uni0462 ; G 1015\nU 1123 ; WX 736 ; N uni0463 ; G 1016\nU 1124 ; WX 1012 ; N uni0464 ; G 1017\nU 1125 ; WX 839 ; N uni0465 ; G 1018\nU 1126 ; WX 992 ; N uni0466 ; G 1019\nU 1127 ; WX 832 ; N uni0467 ; G 1020\nU 1128 ; WX 1358 ; N uni0468 ; G 1021\nU 1129 ; WX 1121 ; N uni0469 ; G 1022\nU 1130 ; WX 850 ; N uni046A ; G 1023\nU 1131 ; WX 687 ; N uni046B ; G 1024\nU 1132 ; WX 1236 ; N uni046C ; G 1025\nU 1133 ; WX 1007 ; N uni046D ; G 1026\nU 1134 ; WX 696 ; N uni046E ; G 1027\nU 1135 ; WX 557 ; N uni046F ; G 1028\nU 1136 ; WX 1075 ; N uni0470 ; G 1029\nU 1137 ; WX 1061 ; N uni0471 ; G 1030\nU 1138 ; WX 850 ; N uni0472 ; G 1031\nU 1139 ; WX 687 ; N uni0473 ; G 1032\nU 1140 ; WX 850 ; N uni0474 ; G 1033\nU 1141 ; WX 695 ; N uni0475 ; G 1034\nU 1142 ; WX 850 ; N uni0476 ; G 1035\nU 1143 ; WX 695 ; N uni0477 ; G 1036\nU 1144 ; WX 1148 ; N uni0478 ; G 1037\nU 1145 ; WX 1043 ; N uni0479 ; G 1038\nU 1146 ; WX 1074 ; N uni047A ; G 1039\nU 1147 ; WX 863 ; N uni047B ; G 1040\nU 1148 ; WX 1405 ; N uni047C ; G 1041\nU 1149 ; WX 1173 ; N uni047D ; G 1042\nU 1150 ; WX 1093 ; N uni047E ; G 1043\nU 1151 ; WX 869 ; N uni047F ; G 1044\nU 1152 ; WX 734 ; N uni0480 ; G 1045\nU 1153 ; WX 593 ; N uni0481 ; G 1046\nU 1154 ; WX 652 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 957 ; N uni048A ; G 1055\nU 1163 ; WX 807 ; N uni048B ; G 1056\nU 1164 ; WX 762 ; N uni048C ; G 1057\nU 1165 ; WX 611 ; N uni048D ; G 1058\nU 1166 ; WX 733 ; N uni048E ; G 1059\nU 1167 ; WX 716 ; N uni048F ; G 1060\nU 1168 ; WX 637 ; N uni0490 ; G 1061\nU 1169 ; WX 522 ; N uni0491 ; G 1062\nU 1170 ; WX 666 ; N uni0492 ; G 1063\nU 1171 ; WX 543 ; N uni0493 ; G 1064\nU 1172 ; WX 808 ; N uni0494 ; G 1065\nU 1173 ; WX 669 ; N uni0495 ; G 1066\nU 1174 ; WX 1224 ; N uni0496 ; G 1067\nU 1175 ; WX 995 ; N uni0497 ; G 1068\nU 1176 ; WX 710 ; N uni0498 ; G 1069\nU 1177 ; WX 581 ; N uni0499 ; G 1070\nU 1178 ; WX 775 ; N uni049A ; G 1071\nU 1179 ; WX 679 ; N uni049B ; G 1072\nU 1180 ; WX 817 ; N uni049C ; G 1073\nU 1181 ; WX 679 ; N uni049D ; G 1074\nU 1182 ; WX 817 ; N uni049E ; G 1075\nU 1183 ; WX 679 ; N uni049F ; G 1076\nU 1184 ; WX 1015 ; N uni04A0 ; G 1077\nU 1185 ; WX 826 ; N uni04A1 ; G 1078\nU 1186 ; WX 956 ; N uni04A2 ; G 1079\nU 1187 ; WX 808 ; N uni04A3 ; G 1080\nU 1188 ; WX 1103 ; N uni04A4 ; G 1081\nU 1189 ; WX 874 ; N uni04A5 ; G 1082\nU 1190 ; WX 1273 ; N uni04A6 ; G 1083\nU 1191 ; WX 1017 ; N uni04A7 ; G 1084\nU 1192 ; WX 952 ; N uni04A8 ; G 1085\nU 1193 ; WX 858 ; N uni04A9 ; G 1086\nU 1194 ; WX 734 ; N uni04AA ; G 1087\nU 1195 ; WX 593 ; N uni04AB ; G 1088\nU 1196 ; WX 682 ; N uni04AC ; G 1089\nU 1197 ; WX 580 ; N uni04AD ; G 1090\nU 1198 ; WX 724 ; N uni04AE ; G 1091\nU 1199 ; WX 652 ; N uni04AF ; G 1092\nU 1200 ; WX 724 ; N uni04B0 ; G 1093\nU 1201 ; WX 652 ; N uni04B1 ; G 1094\nU 1202 ; WX 771 ; N uni04B2 ; G 1095\nU 1203 ; WX 645 ; N uni04B3 ; G 1096\nU 1204 ; WX 1112 ; N uni04B4 ; G 1097\nU 1205 ; WX 1000 ; N uni04B5 ; G 1098\nU 1206 ; WX 808 ; N uni04B6 ; G 1099\nU 1207 ; WX 687 ; N uni04B7 ; G 1100\nU 1208 ; WX 808 ; N uni04B8 ; G 1101\nU 1209 ; WX 687 ; N uni04B9 ; G 1102\nU 1210 ; WX 808 ; N uni04BA ; G 1103\nU 1211 ; WX 712 ; N uni04BB ; G 1104\nU 1212 ; WX 1026 ; N uni04BC ; G 1105\nU 1213 ; WX 810 ; N uni04BD ; G 1106\nU 1214 ; WX 1026 ; N uni04BE ; G 1107\nU 1215 ; WX 810 ; N uni04BF ; G 1108\nU 1216 ; WX 372 ; N uni04C0 ; G 1109\nU 1217 ; WX 1224 ; N uni04C1 ; G 1110\nU 1218 ; WX 995 ; N uni04C2 ; G 1111\nU 1219 ; WX 775 ; N uni04C3 ; G 1112\nU 1220 ; WX 630 ; N uni04C4 ; G 1113\nU 1221 ; WX 951 ; N uni04C5 ; G 1114\nU 1222 ; WX 805 ; N uni04C6 ; G 1115\nU 1223 ; WX 837 ; N uni04C7 ; G 1116\nU 1224 ; WX 691 ; N uni04C8 ; G 1117\nU 1225 ; WX 957 ; N uni04C9 ; G 1118\nU 1226 ; WX 807 ; N uni04CA ; G 1119\nU 1227 ; WX 808 ; N uni04CB ; G 1120\nU 1228 ; WX 687 ; N uni04CC ; G 1121\nU 1229 ; WX 1115 ; N uni04CD ; G 1122\nU 1230 ; WX 933 ; N uni04CE ; G 1123\nU 1231 ; WX 343 ; N uni04CF ; G 1124\nU 1232 ; WX 774 ; N uni04D0 ; G 1125\nU 1233 ; WX 675 ; N uni04D1 ; G 1126\nU 1234 ; WX 774 ; N uni04D2 ; G 1127\nU 1235 ; WX 675 ; N uni04D3 ; G 1128\nU 1236 ; WX 1085 ; N uni04D4 ; G 1129\nU 1237 ; WX 1048 ; N uni04D5 ; G 1130\nU 1238 ; WX 683 ; N uni04D6 ; G 1131\nU 1239 ; WX 678 ; N uni04D7 ; G 1132\nU 1240 ; WX 849 ; N uni04D8 ; G 1133\nU 1241 ; WX 678 ; N uni04D9 ; G 1134\nU 1242 ; WX 849 ; N uni04DA ; G 1135\nU 1243 ; WX 678 ; N uni04DB ; G 1136\nU 1244 ; WX 1224 ; N uni04DC ; G 1137\nU 1245 ; WX 995 ; N uni04DD ; G 1138\nU 1246 ; WX 710 ; N uni04DE ; G 1139\nU 1247 ; WX 581 ; N uni04DF ; G 1140\nU 1248 ; WX 772 ; N uni04E0 ; G 1141\nU 1249 ; WX 641 ; N uni04E1 ; G 1142\nU 1250 ; WX 837 ; N uni04E2 ; G 1143\nU 1251 ; WX 701 ; N uni04E3 ; G 1144\nU 1252 ; WX 837 ; N uni04E4 ; G 1145\nU 1253 ; WX 701 ; N uni04E5 ; G 1146\nU 1254 ; WX 850 ; N uni04E6 ; G 1147\nU 1255 ; WX 687 ; N uni04E7 ; G 1148\nU 1256 ; WX 850 ; N uni04E8 ; G 1149\nU 1257 ; WX 687 ; N uni04E9 ; G 1150\nU 1258 ; WX 850 ; N uni04EA ; G 1151\nU 1259 ; WX 687 ; N uni04EB ; G 1152\nU 1260 ; WX 734 ; N uni04EC ; G 1153\nU 1261 ; WX 593 ; N uni04ED ; G 1154\nU 1262 ; WX 771 ; N uni04EE ; G 1155\nU 1263 ; WX 652 ; N uni04EF ; G 1156\nU 1264 ; WX 771 ; N uni04F0 ; G 1157\nU 1265 ; WX 652 ; N uni04F1 ; G 1158\nU 1266 ; WX 771 ; N uni04F2 ; G 1159\nU 1267 ; WX 652 ; N uni04F3 ; G 1160\nU 1268 ; WX 808 ; N uni04F4 ; G 1161\nU 1269 ; WX 687 ; N uni04F5 ; G 1162\nU 1270 ; WX 637 ; N uni04F6 ; G 1163\nU 1271 ; WX 522 ; N uni04F7 ; G 1164\nU 1272 ; WX 1036 ; N uni04F8 ; G 1165\nU 1273 ; WX 904 ; N uni04F9 ; G 1166\nU 1274 ; WX 666 ; N uni04FA ; G 1167\nU 1275 ; WX 543 ; N uni04FB ; G 1168\nU 1276 ; WX 771 ; N uni04FC ; G 1169\nU 1277 ; WX 645 ; N uni04FD ; G 1170\nU 1278 ; WX 771 ; N uni04FE ; G 1171\nU 1279 ; WX 645 ; N uni04FF ; G 1172\nU 1280 ; WX 762 ; N uni0500 ; G 1173\nU 1281 ; WX 608 ; N uni0501 ; G 1174\nU 1282 ; WX 1159 ; N uni0502 ; G 1175\nU 1283 ; WX 893 ; N uni0503 ; G 1176\nU 1284 ; WX 1119 ; N uni0504 ; G 1177\nU 1285 ; WX 920 ; N uni0505 ; G 1178\nU 1286 ; WX 828 ; N uni0506 ; G 1179\nU 1287 ; WX 693 ; N uni0507 ; G 1180\nU 1288 ; WX 1242 ; N uni0508 ; G 1181\nU 1289 ; WX 1017 ; N uni0509 ; G 1182\nU 1290 ; WX 1289 ; N uni050A ; G 1183\nU 1291 ; WX 1013 ; N uni050B ; G 1184\nU 1292 ; WX 839 ; N uni050C ; G 1185\nU 1293 ; WX 638 ; N uni050D ; G 1186\nU 1294 ; WX 938 ; N uni050E ; G 1187\nU 1295 ; WX 803 ; N uni050F ; G 1188\nU 1296 ; WX 696 ; N uni0510 ; G 1189\nU 1297 ; WX 557 ; N uni0511 ; G 1190\nU 1298 ; WX 831 ; N uni0512 ; G 1191\nU 1299 ; WX 732 ; N uni0513 ; G 1192\nU 1300 ; WX 1286 ; N uni0514 ; G 1193\nU 1301 ; WX 1068 ; N uni0515 ; G 1194\nU 1302 ; WX 1065 ; N uni0516 ; G 1195\nU 1303 ; WX 979 ; N uni0517 ; G 1196\nU 1304 ; WX 1082 ; N uni0518 ; G 1197\nU 1305 ; WX 1013 ; N uni0519 ; G 1198\nU 1306 ; WX 850 ; N uni051A ; G 1199\nU 1307 ; WX 716 ; N uni051B ; G 1200\nU 1308 ; WX 1103 ; N uni051C ; G 1201\nU 1309 ; WX 924 ; N uni051D ; G 1202\nU 1310 ; WX 817 ; N uni051E ; G 1203\nU 1311 ; WX 679 ; N uni051F ; G 1204\nU 1312 ; WX 1267 ; N uni0520 ; G 1205\nU 1313 ; WX 1059 ; N uni0521 ; G 1206\nU 1314 ; WX 1273 ; N uni0522 ; G 1207\nU 1315 ; WX 1017 ; N uni0523 ; G 1208\nU 1316 ; WX 957 ; N uni0524 ; G 1209\nU 1317 ; WX 807 ; N uni0525 ; G 1210\nU 1329 ; WX 813 ; N uni0531 ; G 1211\nU 1330 ; WX 729 ; N uni0532 ; G 1212\nU 1331 ; WX 728 ; N uni0533 ; G 1213\nU 1332 ; WX 731 ; N uni0534 ; G 1214\nU 1333 ; WX 729 ; N uni0535 ; G 1215\nU 1334 ; WX 733 ; N uni0536 ; G 1216\nU 1335 ; WX 652 ; N uni0537 ; G 1217\nU 1336 ; WX 720 ; N uni0538 ; G 1218\nU 1337 ; WX 903 ; N uni0539 ; G 1219\nU 1338 ; WX 728 ; N uni053A ; G 1220\nU 1339 ; WX 666 ; N uni053B ; G 1221\nU 1340 ; WX 558 ; N uni053C ; G 1222\nU 1341 ; WX 961 ; N uni053D ; G 1223\nU 1342 ; WX 788 ; N uni053E ; G 1224\nU 1343 ; WX 713 ; N uni053F ; G 1225\nU 1344 ; WX 651 ; N uni0540 ; G 1226\nU 1345 ; WX 730 ; N uni0541 ; G 1227\nU 1346 ; WX 715 ; N uni0542 ; G 1228\nU 1347 ; WX 704 ; N uni0543 ; G 1229\nU 1348 ; WX 780 ; N uni0544 ; G 1230\nU 1349 ; WX 689 ; N uni0545 ; G 1231\nU 1350 ; WX 715 ; N uni0546 ; G 1232\nU 1351 ; WX 708 ; N uni0547 ; G 1233\nU 1352 ; WX 731 ; N uni0548 ; G 1234\nU 1353 ; WX 677 ; N uni0549 ; G 1235\nU 1354 ; WX 867 ; N uni054A ; G 1236\nU 1355 ; WX 711 ; N uni054B ; G 1237\nU 1356 ; WX 780 ; N uni054C ; G 1238\nU 1357 ; WX 731 ; N uni054D ; G 1239\nU 1358 ; WX 715 ; N uni054E ; G 1240\nU 1359 ; WX 693 ; N uni054F ; G 1241\nU 1360 ; WX 666 ; N uni0550 ; G 1242\nU 1361 ; WX 698 ; N uni0551 ; G 1243\nU 1362 ; WX 576 ; N uni0552 ; G 1244\nU 1363 ; WX 833 ; N uni0553 ; G 1245\nU 1364 ; WX 698 ; N uni0554 ; G 1246\nU 1365 ; WX 763 ; N uni0555 ; G 1247\nU 1366 ; WX 855 ; N uni0556 ; G 1248\nU 1369 ; WX 330 ; N uni0559 ; G 1249\nU 1370 ; WX 342 ; N uni055A ; G 1250\nU 1371 ; WX 308 ; N uni055B ; G 1251\nU 1372 ; WX 374 ; N uni055C ; G 1252\nU 1373 ; WX 313 ; N uni055D ; G 1253\nU 1374 ; WX 461 ; N uni055E ; G 1254\nU 1375 ; WX 468 ; N uni055F ; G 1255\nU 1377 ; WX 938 ; N uni0561 ; G 1256\nU 1378 ; WX 642 ; N uni0562 ; G 1257\nU 1379 ; WX 704 ; N uni0563 ; G 1258\nU 1380 ; WX 708 ; N uni0564 ; G 1259\nU 1381 ; WX 642 ; N uni0565 ; G 1260\nU 1382 ; WX 644 ; N uni0566 ; G 1261\nU 1383 ; WX 565 ; N uni0567 ; G 1262\nU 1384 ; WX 642 ; N uni0568 ; G 1263\nU 1385 ; WX 756 ; N uni0569 ; G 1264\nU 1386 ; WX 704 ; N uni056A ; G 1265\nU 1387 ; WX 643 ; N uni056B ; G 1266\nU 1388 ; WX 310 ; N uni056C ; G 1267\nU 1389 ; WX 984 ; N uni056D ; G 1268\nU 1390 ; WX 638 ; N uni056E ; G 1269\nU 1391 ; WX 643 ; N uni056F ; G 1270\nU 1392 ; WX 643 ; N uni0570 ; G 1271\nU 1393 ; WX 603 ; N uni0571 ; G 1272\nU 1394 ; WX 643 ; N uni0572 ; G 1273\nU 1395 ; WX 642 ; N uni0573 ; G 1274\nU 1396 ; WX 643 ; N uni0574 ; G 1275\nU 1397 ; WX 309 ; N uni0575 ; G 1276\nU 1398 ; WX 643 ; N uni0576 ; G 1277\nU 1399 ; WX 486 ; N uni0577 ; G 1278\nU 1400 ; WX 643 ; N uni0578 ; G 1279\nU 1401 ; WX 366 ; N uni0579 ; G 1280\nU 1402 ; WX 938 ; N uni057A ; G 1281\nU 1403 ; WX 573 ; N uni057B ; G 1282\nU 1404 ; WX 666 ; N uni057C ; G 1283\nU 1405 ; WX 643 ; N uni057D ; G 1284\nU 1406 ; WX 643 ; N uni057E ; G 1285\nU 1407 ; WX 934 ; N uni057F ; G 1286\nU 1408 ; WX 643 ; N uni0580 ; G 1287\nU 1409 ; WX 643 ; N uni0581 ; G 1288\nU 1410 ; WX 479 ; N uni0582 ; G 1289\nU 1411 ; WX 934 ; N uni0583 ; G 1290\nU 1412 ; WX 648 ; N uni0584 ; G 1291\nU 1413 ; WX 620 ; N uni0585 ; G 1292\nU 1414 ; WX 813 ; N uni0586 ; G 1293\nU 1415 ; WX 812 ; N uni0587 ; G 1294\nU 1417 ; WX 360 ; N uni0589 ; G 1295\nU 1418 ; WX 374 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 415 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 372 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 372 ; N uni05C3 ; G 1316\nU 1478 ; WX 497 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 728 ; N uni05D0 ; G 1319\nU 1489 ; WX 610 ; N uni05D1 ; G 1320\nU 1490 ; WX 447 ; N uni05D2 ; G 1321\nU 1491 ; WX 588 ; N uni05D3 ; G 1322\nU 1492 ; WX 687 ; N uni05D4 ; G 1323\nU 1493 ; WX 343 ; N uni05D5 ; G 1324\nU 1494 ; WX 400 ; N uni05D6 ; G 1325\nU 1495 ; WX 687 ; N uni05D7 ; G 1326\nU 1496 ; WX 679 ; N uni05D8 ; G 1327\nU 1497 ; WX 294 ; N uni05D9 ; G 1328\nU 1498 ; WX 578 ; N uni05DA ; G 1329\nU 1499 ; WX 566 ; N uni05DB ; G 1330\nU 1500 ; WX 605 ; N uni05DC ; G 1331\nU 1501 ; WX 696 ; N uni05DD ; G 1332\nU 1502 ; WX 724 ; N uni05DE ; G 1333\nU 1503 ; WX 343 ; N uni05DF ; G 1334\nU 1504 ; WX 453 ; N uni05E0 ; G 1335\nU 1505 ; WX 680 ; N uni05E1 ; G 1336\nU 1506 ; WX 666 ; N uni05E2 ; G 1337\nU 1507 ; WX 675 ; N uni05E3 ; G 1338\nU 1508 ; WX 658 ; N uni05E4 ; G 1339\nU 1509 ; WX 661 ; N uni05E5 ; G 1340\nU 1510 ; WX 653 ; N uni05E6 ; G 1341\nU 1511 ; WX 736 ; N uni05E7 ; G 1342\nU 1512 ; WX 602 ; N uni05E8 ; G 1343\nU 1513 ; WX 758 ; N uni05E9 ; G 1344\nU 1514 ; WX 683 ; N uni05EA ; G 1345\nU 1520 ; WX 664 ; N uni05F0 ; G 1346\nU 1521 ; WX 567 ; N uni05F1 ; G 1347\nU 1522 ; WX 519 ; N uni05F2 ; G 1348\nU 1523 ; WX 444 ; N uni05F3 ; G 1349\nU 1524 ; WX 710 ; N uni05F4 ; G 1350\nU 1542 ; WX 667 ; N uni0606 ; G 1351\nU 1543 ; WX 667 ; N uni0607 ; G 1352\nU 1545 ; WX 884 ; N uni0609 ; G 1353\nU 1546 ; WX 1157 ; N uni060A ; G 1354\nU 1548 ; WX 380 ; N uni060C ; G 1355\nU 1557 ; WX 0 ; N uni0615 ; G 1356\nU 1563 ; WX 400 ; N uni061B ; G 1357\nU 1567 ; WX 580 ; N uni061F ; G 1358\nU 1569 ; WX 511 ; N uni0621 ; G 1359\nU 1570 ; WX 343 ; N uni0622 ; G 1360\nU 1571 ; WX 343 ; N uni0623 ; G 1361\nU 1572 ; WX 622 ; N uni0624 ; G 1362\nU 1573 ; WX 343 ; N uni0625 ; G 1363\nU 1574 ; WX 917 ; N uni0626 ; G 1364\nU 1575 ; WX 343 ; N uni0627 ; G 1365\nU 1576 ; WX 1005 ; N uni0628 ; G 1366\nU 1577 ; WX 590 ; N uni0629 ; G 1367\nU 1578 ; WX 1005 ; N uni062A ; G 1368\nU 1579 ; WX 1005 ; N uni062B ; G 1369\nU 1580 ; WX 721 ; N uni062C ; G 1370\nU 1581 ; WX 721 ; N uni062D ; G 1371\nU 1582 ; WX 721 ; N uni062E ; G 1372\nU 1583 ; WX 513 ; N uni062F ; G 1373\nU 1584 ; WX 513 ; N uni0630 ; G 1374\nU 1585 ; WX 576 ; N uni0631 ; G 1375\nU 1586 ; WX 576 ; N uni0632 ; G 1376\nU 1587 ; WX 1380 ; N uni0633 ; G 1377\nU 1588 ; WX 1380 ; N uni0634 ; G 1378\nU 1589 ; WX 1345 ; N uni0635 ; G 1379\nU 1590 ; WX 1345 ; N uni0636 ; G 1380\nU 1591 ; WX 1039 ; N uni0637 ; G 1381\nU 1592 ; WX 1039 ; N uni0638 ; G 1382\nU 1593 ; WX 683 ; N uni0639 ; G 1383\nU 1594 ; WX 683 ; N uni063A ; G 1384\nU 1600 ; WX 342 ; N uni0640 ; G 1385\nU 1601 ; WX 1162 ; N uni0641 ; G 1386\nU 1602 ; WX 894 ; N uni0642 ; G 1387\nU 1603 ; WX 917 ; N uni0643 ; G 1388\nU 1604 ; WX 868 ; N uni0644 ; G 1389\nU 1605 ; WX 733 ; N uni0645 ; G 1390\nU 1606 ; WX 854 ; N uni0646 ; G 1391\nU 1607 ; WX 590 ; N uni0647 ; G 1392\nU 1608 ; WX 622 ; N uni0648 ; G 1393\nU 1609 ; WX 917 ; N uni0649 ; G 1394\nU 1610 ; WX 917 ; N uni064A ; G 1395\nU 1611 ; WX 0 ; N uni064B ; G 1396\nU 1612 ; WX 0 ; N uni064C ; G 1397\nU 1613 ; WX 0 ; N uni064D ; G 1398\nU 1614 ; WX 0 ; N uni064E ; G 1399\nU 1615 ; WX 0 ; N uni064F ; G 1400\nU 1616 ; WX 0 ; N uni0650 ; G 1401\nU 1617 ; WX 0 ; N uni0651 ; G 1402\nU 1618 ; WX 0 ; N uni0652 ; G 1403\nU 1619 ; WX 0 ; N uni0653 ; G 1404\nU 1620 ; WX 0 ; N uni0654 ; G 1405\nU 1621 ; WX 0 ; N uni0655 ; G 1406\nU 1623 ; WX 0 ; N uni0657 ; G 1407\nU 1626 ; WX 500 ; N uni065A ; G 1408\nU 1632 ; WX 610 ; N uni0660 ; G 1409\nU 1633 ; WX 610 ; N uni0661 ; G 1410\nU 1634 ; WX 610 ; N uni0662 ; G 1411\nU 1635 ; WX 610 ; N uni0663 ; G 1412\nU 1636 ; WX 610 ; N uni0664 ; G 1413\nU 1637 ; WX 610 ; N uni0665 ; G 1414\nU 1638 ; WX 610 ; N uni0666 ; G 1415\nU 1639 ; WX 610 ; N uni0667 ; G 1416\nU 1640 ; WX 610 ; N uni0668 ; G 1417\nU 1641 ; WX 610 ; N uni0669 ; G 1418\nU 1642 ; WX 610 ; N uni066A ; G 1419\nU 1643 ; WX 374 ; N uni066B ; G 1420\nU 1644 ; WX 380 ; N uni066C ; G 1421\nU 1645 ; WX 545 ; N uni066D ; G 1422\nU 1646 ; WX 1005 ; N uni066E ; G 1423\nU 1647 ; WX 894 ; N uni066F ; G 1424\nU 1648 ; WX 0 ; N uni0670 ; G 1425\nU 1652 ; WX 292 ; N uni0674 ; G 1426\nU 1657 ; WX 1005 ; N uni0679 ; G 1427\nU 1658 ; WX 1005 ; N uni067A ; G 1428\nU 1659 ; WX 1005 ; N uni067B ; G 1429\nU 1660 ; WX 1005 ; N uni067C ; G 1430\nU 1661 ; WX 1005 ; N uni067D ; G 1431\nU 1662 ; WX 1005 ; N uni067E ; G 1432\nU 1663 ; WX 1005 ; N uni067F ; G 1433\nU 1664 ; WX 1005 ; N uni0680 ; G 1434\nU 1665 ; WX 721 ; N uni0681 ; G 1435\nU 1666 ; WX 721 ; N uni0682 ; G 1436\nU 1667 ; WX 721 ; N uni0683 ; G 1437\nU 1668 ; WX 721 ; N uni0684 ; G 1438\nU 1669 ; WX 721 ; N uni0685 ; G 1439\nU 1670 ; WX 721 ; N uni0686 ; G 1440\nU 1671 ; WX 721 ; N uni0687 ; G 1441\nU 1672 ; WX 445 ; N uni0688 ; G 1442\nU 1673 ; WX 445 ; N uni0689 ; G 1443\nU 1674 ; WX 445 ; N uni068A ; G 1444\nU 1675 ; WX 445 ; N uni068B ; G 1445\nU 1676 ; WX 445 ; N uni068C ; G 1446\nU 1677 ; WX 445 ; N uni068D ; G 1447\nU 1678 ; WX 445 ; N uni068E ; G 1448\nU 1679 ; WX 445 ; N uni068F ; G 1449\nU 1680 ; WX 445 ; N uni0690 ; G 1450\nU 1681 ; WX 576 ; N uni0691 ; G 1451\nU 1682 ; WX 576 ; N uni0692 ; G 1452\nU 1683 ; WX 576 ; N uni0693 ; G 1453\nU 1684 ; WX 576 ; N uni0694 ; G 1454\nU 1685 ; WX 681 ; N uni0695 ; G 1455\nU 1686 ; WX 576 ; N uni0696 ; G 1456\nU 1687 ; WX 576 ; N uni0697 ; G 1457\nU 1688 ; WX 576 ; N uni0698 ; G 1458\nU 1689 ; WX 576 ; N uni0699 ; G 1459\nU 1690 ; WX 1380 ; N uni069A ; G 1460\nU 1691 ; WX 1380 ; N uni069B ; G 1461\nU 1692 ; WX 1380 ; N uni069C ; G 1462\nU 1693 ; WX 1345 ; N uni069D ; G 1463\nU 1694 ; WX 1345 ; N uni069E ; G 1464\nU 1695 ; WX 1039 ; N uni069F ; G 1465\nU 1696 ; WX 683 ; N uni06A0 ; G 1466\nU 1697 ; WX 1162 ; N uni06A1 ; G 1467\nU 1698 ; WX 1162 ; N uni06A2 ; G 1468\nU 1699 ; WX 1162 ; N uni06A3 ; G 1469\nU 1700 ; WX 1162 ; N uni06A4 ; G 1470\nU 1701 ; WX 1162 ; N uni06A5 ; G 1471\nU 1702 ; WX 1162 ; N uni06A6 ; G 1472\nU 1703 ; WX 894 ; N uni06A7 ; G 1473\nU 1704 ; WX 894 ; N uni06A8 ; G 1474\nU 1705 ; WX 1024 ; N uni06A9 ; G 1475\nU 1706 ; WX 1271 ; N uni06AA ; G 1476\nU 1707 ; WX 1024 ; N uni06AB ; G 1477\nU 1708 ; WX 917 ; N uni06AC ; G 1478\nU 1709 ; WX 917 ; N uni06AD ; G 1479\nU 1710 ; WX 917 ; N uni06AE ; G 1480\nU 1711 ; WX 1024 ; N uni06AF ; G 1481\nU 1712 ; WX 1024 ; N uni06B0 ; G 1482\nU 1713 ; WX 1024 ; N uni06B1 ; G 1483\nU 1714 ; WX 1024 ; N uni06B2 ; G 1484\nU 1715 ; WX 1024 ; N uni06B3 ; G 1485\nU 1716 ; WX 1024 ; N uni06B4 ; G 1486\nU 1717 ; WX 868 ; N uni06B5 ; G 1487\nU 1718 ; WX 868 ; N uni06B6 ; G 1488\nU 1719 ; WX 868 ; N uni06B7 ; G 1489\nU 1720 ; WX 868 ; N uni06B8 ; G 1490\nU 1721 ; WX 854 ; N uni06B9 ; G 1491\nU 1722 ; WX 854 ; N uni06BA ; G 1492\nU 1723 ; WX 854 ; N uni06BB ; G 1493\nU 1724 ; WX 854 ; N uni06BC ; G 1494\nU 1725 ; WX 854 ; N uni06BD ; G 1495\nU 1726 ; WX 938 ; N uni06BE ; G 1496\nU 1727 ; WX 721 ; N uni06BF ; G 1497\nU 1734 ; WX 622 ; N uni06C6 ; G 1498\nU 1735 ; WX 622 ; N uni06C7 ; G 1499\nU 1736 ; WX 622 ; N uni06C8 ; G 1500\nU 1739 ; WX 622 ; N uni06CB ; G 1501\nU 1740 ; WX 917 ; N uni06CC ; G 1502\nU 1742 ; WX 917 ; N uni06CE ; G 1503\nU 1744 ; WX 917 ; N uni06D0 ; G 1504\nU 1749 ; WX 590 ; N uni06D5 ; G 1505\nU 1776 ; WX 610 ; N uni06F0 ; G 1506\nU 1777 ; WX 610 ; N uni06F1 ; G 1507\nU 1778 ; WX 610 ; N uni06F2 ; G 1508\nU 1779 ; WX 610 ; N uni06F3 ; G 1509\nU 1780 ; WX 610 ; N uni06F4 ; G 1510\nU 1781 ; WX 610 ; N uni06F5 ; G 1511\nU 1782 ; WX 610 ; N uni06F6 ; G 1512\nU 1783 ; WX 610 ; N uni06F7 ; G 1513\nU 1784 ; WX 610 ; N uni06F8 ; G 1514\nU 1785 ; WX 610 ; N uni06F9 ; G 1515\nU 1984 ; WX 696 ; N uni07C0 ; G 1516\nU 1985 ; WX 696 ; N uni07C1 ; G 1517\nU 1986 ; WX 696 ; N uni07C2 ; G 1518\nU 1987 ; WX 696 ; N uni07C3 ; G 1519\nU 1988 ; WX 696 ; N uni07C4 ; G 1520\nU 1989 ; WX 696 ; N uni07C5 ; G 1521\nU 1990 ; WX 696 ; N uni07C6 ; G 1522\nU 1991 ; WX 696 ; N uni07C7 ; G 1523\nU 1992 ; WX 696 ; N uni07C8 ; G 1524\nU 1993 ; WX 696 ; N uni07C9 ; G 1525\nU 1994 ; WX 343 ; N uni07CA ; G 1526\nU 1995 ; WX 547 ; N uni07CB ; G 1527\nU 1996 ; WX 543 ; N uni07CC ; G 1528\nU 1997 ; WX 652 ; N uni07CD ; G 1529\nU 1998 ; WX 691 ; N uni07CE ; G 1530\nU 1999 ; WX 691 ; N uni07CF ; G 1531\nU 2000 ; WX 594 ; N uni07D0 ; G 1532\nU 2001 ; WX 691 ; N uni07D1 ; G 1533\nU 2002 ; WX 904 ; N uni07D2 ; G 1534\nU 2003 ; WX 551 ; N uni07D3 ; G 1535\nU 2004 ; WX 551 ; N uni07D4 ; G 1536\nU 2005 ; WX 627 ; N uni07D5 ; G 1537\nU 2006 ; WX 688 ; N uni07D6 ; G 1538\nU 2007 ; WX 444 ; N uni07D7 ; G 1539\nU 2008 ; WX 1022 ; N uni07D8 ; G 1540\nU 2009 ; WX 506 ; N uni07D9 ; G 1541\nU 2010 ; WX 826 ; N uni07DA ; G 1542\nU 2011 ; WX 691 ; N uni07DB ; G 1543\nU 2012 ; WX 652 ; N uni07DC ; G 1544\nU 2013 ; WX 912 ; N uni07DD ; G 1545\nU 2014 ; WX 627 ; N uni07DE ; G 1546\nU 2015 ; WX 707 ; N uni07DF ; G 1547\nU 2016 ; WX 506 ; N uni07E0 ; G 1548\nU 2017 ; WX 652 ; N uni07E1 ; G 1549\nU 2018 ; WX 574 ; N uni07E2 ; G 1550\nU 2019 ; WX 627 ; N uni07E3 ; G 1551\nU 2020 ; WX 627 ; N uni07E4 ; G 1552\nU 2021 ; WX 627 ; N uni07E5 ; G 1553\nU 2022 ; WX 574 ; N uni07E6 ; G 1554\nU 2023 ; WX 574 ; N uni07E7 ; G 1555\nU 2027 ; WX 0 ; N uni07EB ; G 1556\nU 2028 ; WX 0 ; N uni07EC ; G 1557\nU 2029 ; WX 0 ; N uni07ED ; G 1558\nU 2030 ; WX 0 ; N uni07EE ; G 1559\nU 2031 ; WX 0 ; N uni07EF ; G 1560\nU 2032 ; WX 0 ; N uni07F0 ; G 1561\nU 2033 ; WX 0 ; N uni07F1 ; G 1562\nU 2034 ; WX 0 ; N uni07F2 ; G 1563\nU 2035 ; WX 0 ; N uni07F3 ; G 1564\nU 2036 ; WX 380 ; N uni07F4 ; G 1565\nU 2037 ; WX 380 ; N uni07F5 ; G 1566\nU 2040 ; WX 691 ; N uni07F8 ; G 1567\nU 2041 ; WX 691 ; N uni07F9 ; G 1568\nU 2042 ; WX 415 ; N uni07FA ; G 1569\nU 3647 ; WX 696 ; N uni0E3F ; G 1570\nU 3713 ; WX 790 ; N uni0E81 ; G 1571\nU 3714 ; WX 748 ; N uni0E82 ; G 1572\nU 3716 ; WX 749 ; N uni0E84 ; G 1573\nU 3719 ; WX 569 ; N uni0E87 ; G 1574\nU 3720 ; WX 742 ; N uni0E88 ; G 1575\nU 3722 ; WX 744 ; N uni0E8A ; G 1576\nU 3725 ; WX 761 ; N uni0E8D ; G 1577\nU 3732 ; WX 706 ; N uni0E94 ; G 1578\nU 3733 ; WX 704 ; N uni0E95 ; G 1579\nU 3734 ; WX 747 ; N uni0E96 ; G 1580\nU 3735 ; WX 819 ; N uni0E97 ; G 1581\nU 3737 ; WX 730 ; N uni0E99 ; G 1582\nU 3738 ; WX 727 ; N uni0E9A ; G 1583\nU 3739 ; WX 727 ; N uni0E9B ; G 1584\nU 3740 ; WX 922 ; N uni0E9C ; G 1585\nU 3741 ; WX 827 ; N uni0E9D ; G 1586\nU 3742 ; WX 866 ; N uni0E9E ; G 1587\nU 3743 ; WX 866 ; N uni0E9F ; G 1588\nU 3745 ; WX 836 ; N uni0EA1 ; G 1589\nU 3746 ; WX 761 ; N uni0EA2 ; G 1590\nU 3747 ; WX 770 ; N uni0EA3 ; G 1591\nU 3749 ; WX 769 ; N uni0EA5 ; G 1592\nU 3751 ; WX 713 ; N uni0EA7 ; G 1593\nU 3754 ; WX 827 ; N uni0EAA ; G 1594\nU 3755 ; WX 1031 ; N uni0EAB ; G 1595\nU 3757 ; WX 724 ; N uni0EAD ; G 1596\nU 3758 ; WX 784 ; N uni0EAE ; G 1597\nU 3759 ; WX 934 ; N uni0EAF ; G 1598\nU 3760 ; WX 688 ; N uni0EB0 ; G 1599\nU 3761 ; WX 0 ; N uni0EB1 ; G 1600\nU 3762 ; WX 610 ; N uni0EB2 ; G 1601\nU 3763 ; WX 610 ; N uni0EB3 ; G 1602\nU 3764 ; WX 0 ; N uni0EB4 ; G 1603\nU 3765 ; WX 0 ; N uni0EB5 ; G 1604\nU 3766 ; WX 0 ; N uni0EB6 ; G 1605\nU 3767 ; WX 0 ; N uni0EB7 ; G 1606\nU 3768 ; WX 0 ; N uni0EB8 ; G 1607\nU 3769 ; WX 0 ; N uni0EB9 ; G 1608\nU 3771 ; WX 0 ; N uni0EBB ; G 1609\nU 3772 ; WX 0 ; N uni0EBC ; G 1610\nU 3773 ; WX 670 ; N uni0EBD ; G 1611\nU 3776 ; WX 516 ; N uni0EC0 ; G 1612\nU 3777 ; WX 860 ; N uni0EC1 ; G 1613\nU 3778 ; WX 516 ; N uni0EC2 ; G 1614\nU 3779 ; WX 650 ; N uni0EC3 ; G 1615\nU 3780 ; WX 632 ; N uni0EC4 ; G 1616\nU 3782 ; WX 759 ; N uni0EC6 ; G 1617\nU 3784 ; WX 0 ; N uni0EC8 ; G 1618\nU 3785 ; WX 0 ; N uni0EC9 ; G 1619\nU 3786 ; WX 0 ; N uni0ECA ; G 1620\nU 3787 ; WX 0 ; N uni0ECB ; G 1621\nU 3788 ; WX 0 ; N uni0ECC ; G 1622\nU 3789 ; WX 0 ; N uni0ECD ; G 1623\nU 3792 ; WX 771 ; N uni0ED0 ; G 1624\nU 3793 ; WX 771 ; N uni0ED1 ; G 1625\nU 3794 ; WX 693 ; N uni0ED2 ; G 1626\nU 3795 ; WX 836 ; N uni0ED3 ; G 1627\nU 3796 ; WX 729 ; N uni0ED4 ; G 1628\nU 3797 ; WX 729 ; N uni0ED5 ; G 1629\nU 3798 ; WX 849 ; N uni0ED6 ; G 1630\nU 3799 ; WX 790 ; N uni0ED7 ; G 1631\nU 3800 ; WX 759 ; N uni0ED8 ; G 1632\nU 3801 ; WX 910 ; N uni0ED9 ; G 1633\nU 3804 ; WX 1363 ; N uni0EDC ; G 1634\nU 3805 ; WX 1363 ; N uni0EDD ; G 1635\nU 4256 ; WX 874 ; N uni10A0 ; G 1636\nU 4257 ; WX 733 ; N uni10A1 ; G 1637\nU 4258 ; WX 679 ; N uni10A2 ; G 1638\nU 4259 ; WX 834 ; N uni10A3 ; G 1639\nU 4260 ; WX 615 ; N uni10A4 ; G 1640\nU 4261 ; WX 768 ; N uni10A5 ; G 1641\nU 4262 ; WX 753 ; N uni10A6 ; G 1642\nU 4263 ; WX 914 ; N uni10A7 ; G 1643\nU 4264 ; WX 453 ; N uni10A8 ; G 1644\nU 4265 ; WX 620 ; N uni10A9 ; G 1645\nU 4266 ; WX 843 ; N uni10AA ; G 1646\nU 4267 ; WX 882 ; N uni10AB ; G 1647\nU 4268 ; WX 625 ; N uni10AC ; G 1648\nU 4269 ; WX 854 ; N uni10AD ; G 1649\nU 4270 ; WX 781 ; N uni10AE ; G 1650\nU 4271 ; WX 629 ; N uni10AF ; G 1651\nU 4272 ; WX 912 ; N uni10B0 ; G 1652\nU 4273 ; WX 621 ; N uni10B1 ; G 1653\nU 4274 ; WX 620 ; N uni10B2 ; G 1654\nU 4275 ; WX 854 ; N uni10B3 ; G 1655\nU 4276 ; WX 866 ; N uni10B4 ; G 1656\nU 4277 ; WX 724 ; N uni10B5 ; G 1657\nU 4278 ; WX 630 ; N uni10B6 ; G 1658\nU 4279 ; WX 621 ; N uni10B7 ; G 1659\nU 4280 ; WX 625 ; N uni10B8 ; G 1660\nU 4281 ; WX 620 ; N uni10B9 ; G 1661\nU 4282 ; WX 818 ; N uni10BA ; G 1662\nU 4283 ; WX 874 ; N uni10BB ; G 1663\nU 4284 ; WX 615 ; N uni10BC ; G 1664\nU 4285 ; WX 623 ; N uni10BD ; G 1665\nU 4286 ; WX 625 ; N uni10BE ; G 1666\nU 4287 ; WX 725 ; N uni10BF ; G 1667\nU 4288 ; WX 844 ; N uni10C0 ; G 1668\nU 4289 ; WX 596 ; N uni10C1 ; G 1669\nU 4290 ; WX 688 ; N uni10C2 ; G 1670\nU 4291 ; WX 596 ; N uni10C3 ; G 1671\nU 4292 ; WX 594 ; N uni10C4 ; G 1672\nU 4293 ; WX 738 ; N uni10C5 ; G 1673\nU 4304 ; WX 554 ; N uni10D0 ; G 1674\nU 4305 ; WX 563 ; N uni10D1 ; G 1675\nU 4306 ; WX 622 ; N uni10D2 ; G 1676\nU 4307 ; WX 834 ; N uni10D3 ; G 1677\nU 4308 ; WX 555 ; N uni10D4 ; G 1678\nU 4309 ; WX 564 ; N uni10D5 ; G 1679\nU 4310 ; WX 551 ; N uni10D6 ; G 1680\nU 4311 ; WX 828 ; N uni10D7 ; G 1681\nU 4312 ; WX 563 ; N uni10D8 ; G 1682\nU 4313 ; WX 556 ; N uni10D9 ; G 1683\nU 4314 ; WX 1074 ; N uni10DA ; G 1684\nU 4315 ; WX 568 ; N uni10DB ; G 1685\nU 4316 ; WX 568 ; N uni10DC ; G 1686\nU 4317 ; WX 814 ; N uni10DD ; G 1687\nU 4318 ; WX 554 ; N uni10DE ; G 1688\nU 4319 ; WX 563 ; N uni10DF ; G 1689\nU 4320 ; WX 823 ; N uni10E0 ; G 1690\nU 4321 ; WX 568 ; N uni10E1 ; G 1691\nU 4322 ; WX 700 ; N uni10E2 ; G 1692\nU 4323 ; WX 591 ; N uni10E3 ; G 1693\nU 4324 ; WX 852 ; N uni10E4 ; G 1694\nU 4325 ; WX 560 ; N uni10E5 ; G 1695\nU 4326 ; WX 814 ; N uni10E6 ; G 1696\nU 4327 ; WX 563 ; N uni10E7 ; G 1697\nU 4328 ; WX 553 ; N uni10E8 ; G 1698\nU 4329 ; WX 568 ; N uni10E9 ; G 1699\nU 4330 ; WX 622 ; N uni10EA ; G 1700\nU 4331 ; WX 568 ; N uni10EB ; G 1701\nU 4332 ; WX 553 ; N uni10EC ; G 1702\nU 4333 ; WX 566 ; N uni10ED ; G 1703\nU 4334 ; WX 568 ; N uni10EE ; G 1704\nU 4335 ; WX 540 ; N uni10EF ; G 1705\nU 4336 ; WX 554 ; N uni10F0 ; G 1706\nU 4337 ; WX 559 ; N uni10F1 ; G 1707\nU 4338 ; WX 553 ; N uni10F2 ; G 1708\nU 4339 ; WX 554 ; N uni10F3 ; G 1709\nU 4340 ; WX 553 ; N uni10F4 ; G 1710\nU 4341 ; WX 587 ; N uni10F5 ; G 1711\nU 4342 ; WX 853 ; N uni10F6 ; G 1712\nU 4343 ; WX 604 ; N uni10F7 ; G 1713\nU 4344 ; WX 563 ; N uni10F8 ; G 1714\nU 4345 ; WX 622 ; N uni10F9 ; G 1715\nU 4346 ; WX 554 ; N uni10FA ; G 1716\nU 4347 ; WX 448 ; N uni10FB ; G 1717\nU 4348 ; WX 324 ; N uni10FC ; G 1718\nU 5121 ; WX 774 ; N uni1401 ; G 1719\nU 5122 ; WX 774 ; N uni1402 ; G 1720\nU 5123 ; WX 774 ; N uni1403 ; G 1721\nU 5124 ; WX 774 ; N uni1404 ; G 1722\nU 5125 ; WX 905 ; N uni1405 ; G 1723\nU 5126 ; WX 905 ; N uni1406 ; G 1724\nU 5127 ; WX 905 ; N uni1407 ; G 1725\nU 5129 ; WX 905 ; N uni1409 ; G 1726\nU 5130 ; WX 905 ; N uni140A ; G 1727\nU 5131 ; WX 905 ; N uni140B ; G 1728\nU 5132 ; WX 1018 ; N uni140C ; G 1729\nU 5133 ; WX 1009 ; N uni140D ; G 1730\nU 5134 ; WX 1018 ; N uni140E ; G 1731\nU 5135 ; WX 1009 ; N uni140F ; G 1732\nU 5136 ; WX 1018 ; N uni1410 ; G 1733\nU 5137 ; WX 1009 ; N uni1411 ; G 1734\nU 5138 ; WX 1149 ; N uni1412 ; G 1735\nU 5139 ; WX 1140 ; N uni1413 ; G 1736\nU 5140 ; WX 1149 ; N uni1414 ; G 1737\nU 5141 ; WX 1140 ; N uni1415 ; G 1738\nU 5142 ; WX 905 ; N uni1416 ; G 1739\nU 5143 ; WX 1149 ; N uni1417 ; G 1740\nU 5144 ; WX 1142 ; N uni1418 ; G 1741\nU 5145 ; WX 1149 ; N uni1419 ; G 1742\nU 5146 ; WX 1142 ; N uni141A ; G 1743\nU 5147 ; WX 905 ; N uni141B ; G 1744\nU 5149 ; WX 310 ; N uni141D ; G 1745\nU 5150 ; WX 529 ; N uni141E ; G 1746\nU 5151 ; WX 425 ; N uni141F ; G 1747\nU 5152 ; WX 425 ; N uni1420 ; G 1748\nU 5153 ; WX 395 ; N uni1421 ; G 1749\nU 5154 ; WX 395 ; N uni1422 ; G 1750\nU 5155 ; WX 395 ; N uni1423 ; G 1751\nU 5156 ; WX 395 ; N uni1424 ; G 1752\nU 5157 ; WX 564 ; N uni1425 ; G 1753\nU 5158 ; WX 470 ; N uni1426 ; G 1754\nU 5159 ; WX 310 ; N uni1427 ; G 1755\nU 5160 ; WX 395 ; N uni1428 ; G 1756\nU 5161 ; WX 395 ; N uni1429 ; G 1757\nU 5162 ; WX 395 ; N uni142A ; G 1758\nU 5163 ; WX 1213 ; N uni142B ; G 1759\nU 5164 ; WX 986 ; N uni142C ; G 1760\nU 5165 ; WX 1216 ; N uni142D ; G 1761\nU 5166 ; WX 1297 ; N uni142E ; G 1762\nU 5167 ; WX 774 ; N uni142F ; G 1763\nU 5168 ; WX 774 ; N uni1430 ; G 1764\nU 5169 ; WX 774 ; N uni1431 ; G 1765\nU 5170 ; WX 774 ; N uni1432 ; G 1766\nU 5171 ; WX 886 ; N uni1433 ; G 1767\nU 5172 ; WX 886 ; N uni1434 ; G 1768\nU 5173 ; WX 886 ; N uni1435 ; G 1769\nU 5175 ; WX 886 ; N uni1437 ; G 1770\nU 5176 ; WX 886 ; N uni1438 ; G 1771\nU 5177 ; WX 886 ; N uni1439 ; G 1772\nU 5178 ; WX 1018 ; N uni143A ; G 1773\nU 5179 ; WX 1009 ; N uni143B ; G 1774\nU 5180 ; WX 1018 ; N uni143C ; G 1775\nU 5181 ; WX 1009 ; N uni143D ; G 1776\nU 5182 ; WX 1018 ; N uni143E ; G 1777\nU 5183 ; WX 1009 ; N uni143F ; G 1778\nU 5184 ; WX 1149 ; N uni1440 ; G 1779\nU 5185 ; WX 1140 ; N uni1441 ; G 1780\nU 5186 ; WX 1149 ; N uni1442 ; G 1781\nU 5187 ; WX 1140 ; N uni1443 ; G 1782\nU 5188 ; WX 1149 ; N uni1444 ; G 1783\nU 5189 ; WX 1142 ; N uni1445 ; G 1784\nU 5190 ; WX 1149 ; N uni1446 ; G 1785\nU 5191 ; WX 1142 ; N uni1447 ; G 1786\nU 5192 ; WX 886 ; N uni1448 ; G 1787\nU 5193 ; WX 576 ; N uni1449 ; G 1788\nU 5194 ; WX 229 ; N uni144A ; G 1789\nU 5196 ; WX 812 ; N uni144C ; G 1790\nU 5197 ; WX 812 ; N uni144D ; G 1791\nU 5198 ; WX 812 ; N uni144E ; G 1792\nU 5199 ; WX 812 ; N uni144F ; G 1793\nU 5200 ; WX 815 ; N uni1450 ; G 1794\nU 5201 ; WX 815 ; N uni1451 ; G 1795\nU 5202 ; WX 815 ; N uni1452 ; G 1796\nU 5204 ; WX 815 ; N uni1454 ; G 1797\nU 5205 ; WX 815 ; N uni1455 ; G 1798\nU 5206 ; WX 815 ; N uni1456 ; G 1799\nU 5207 ; WX 1056 ; N uni1457 ; G 1800\nU 5208 ; WX 1048 ; N uni1458 ; G 1801\nU 5209 ; WX 1056 ; N uni1459 ; G 1802\nU 5210 ; WX 1048 ; N uni145A ; G 1803\nU 5211 ; WX 1056 ; N uni145B ; G 1804\nU 5212 ; WX 1048 ; N uni145C ; G 1805\nU 5213 ; WX 1060 ; N uni145D ; G 1806\nU 5214 ; WX 1054 ; N uni145E ; G 1807\nU 5215 ; WX 1060 ; N uni145F ; G 1808\nU 5216 ; WX 1054 ; N uni1460 ; G 1809\nU 5217 ; WX 1060 ; N uni1461 ; G 1810\nU 5218 ; WX 1052 ; N uni1462 ; G 1811\nU 5219 ; WX 1060 ; N uni1463 ; G 1812\nU 5220 ; WX 1052 ; N uni1464 ; G 1813\nU 5221 ; WX 1060 ; N uni1465 ; G 1814\nU 5222 ; WX 483 ; N uni1466 ; G 1815\nU 5223 ; WX 1005 ; N uni1467 ; G 1816\nU 5224 ; WX 1005 ; N uni1468 ; G 1817\nU 5225 ; WX 1023 ; N uni1469 ; G 1818\nU 5226 ; WX 1017 ; N uni146A ; G 1819\nU 5227 ; WX 743 ; N uni146B ; G 1820\nU 5228 ; WX 743 ; N uni146C ; G 1821\nU 5229 ; WX 743 ; N uni146D ; G 1822\nU 5230 ; WX 743 ; N uni146E ; G 1823\nU 5231 ; WX 743 ; N uni146F ; G 1824\nU 5232 ; WX 743 ; N uni1470 ; G 1825\nU 5233 ; WX 743 ; N uni1471 ; G 1826\nU 5234 ; WX 743 ; N uni1472 ; G 1827\nU 5235 ; WX 743 ; N uni1473 ; G 1828\nU 5236 ; WX 1029 ; N uni1474 ; G 1829\nU 5237 ; WX 975 ; N uni1475 ; G 1830\nU 5238 ; WX 980 ; N uni1476 ; G 1831\nU 5239 ; WX 975 ; N uni1477 ; G 1832\nU 5240 ; WX 980 ; N uni1478 ; G 1833\nU 5241 ; WX 975 ; N uni1479 ; G 1834\nU 5242 ; WX 1029 ; N uni147A ; G 1835\nU 5243 ; WX 975 ; N uni147B ; G 1836\nU 5244 ; WX 1029 ; N uni147C ; G 1837\nU 5245 ; WX 975 ; N uni147D ; G 1838\nU 5246 ; WX 980 ; N uni147E ; G 1839\nU 5247 ; WX 975 ; N uni147F ; G 1840\nU 5248 ; WX 980 ; N uni1480 ; G 1841\nU 5249 ; WX 975 ; N uni1481 ; G 1842\nU 5250 ; WX 980 ; N uni1482 ; G 1843\nU 5251 ; WX 501 ; N uni1483 ; G 1844\nU 5252 ; WX 501 ; N uni1484 ; G 1845\nU 5253 ; WX 938 ; N uni1485 ; G 1846\nU 5254 ; WX 938 ; N uni1486 ; G 1847\nU 5255 ; WX 938 ; N uni1487 ; G 1848\nU 5256 ; WX 938 ; N uni1488 ; G 1849\nU 5257 ; WX 743 ; N uni1489 ; G 1850\nU 5258 ; WX 743 ; N uni148A ; G 1851\nU 5259 ; WX 743 ; N uni148B ; G 1852\nU 5260 ; WX 743 ; N uni148C ; G 1853\nU 5261 ; WX 743 ; N uni148D ; G 1854\nU 5262 ; WX 743 ; N uni148E ; G 1855\nU 5263 ; WX 743 ; N uni148F ; G 1856\nU 5264 ; WX 743 ; N uni1490 ; G 1857\nU 5265 ; WX 743 ; N uni1491 ; G 1858\nU 5266 ; WX 1029 ; N uni1492 ; G 1859\nU 5267 ; WX 975 ; N uni1493 ; G 1860\nU 5268 ; WX 1029 ; N uni1494 ; G 1861\nU 5269 ; WX 975 ; N uni1495 ; G 1862\nU 5270 ; WX 1029 ; N uni1496 ; G 1863\nU 5271 ; WX 975 ; N uni1497 ; G 1864\nU 5272 ; WX 1029 ; N uni1498 ; G 1865\nU 5273 ; WX 975 ; N uni1499 ; G 1866\nU 5274 ; WX 1029 ; N uni149A ; G 1867\nU 5275 ; WX 975 ; N uni149B ; G 1868\nU 5276 ; WX 1029 ; N uni149C ; G 1869\nU 5277 ; WX 975 ; N uni149D ; G 1870\nU 5278 ; WX 1029 ; N uni149E ; G 1871\nU 5279 ; WX 975 ; N uni149F ; G 1872\nU 5280 ; WX 1029 ; N uni14A0 ; G 1873\nU 5281 ; WX 501 ; N uni14A1 ; G 1874\nU 5282 ; WX 501 ; N uni14A2 ; G 1875\nU 5283 ; WX 626 ; N uni14A3 ; G 1876\nU 5284 ; WX 626 ; N uni14A4 ; G 1877\nU 5285 ; WX 626 ; N uni14A5 ; G 1878\nU 5286 ; WX 626 ; N uni14A6 ; G 1879\nU 5287 ; WX 626 ; N uni14A7 ; G 1880\nU 5288 ; WX 626 ; N uni14A8 ; G 1881\nU 5289 ; WX 626 ; N uni14A9 ; G 1882\nU 5290 ; WX 626 ; N uni14AA ; G 1883\nU 5291 ; WX 626 ; N uni14AB ; G 1884\nU 5292 ; WX 881 ; N uni14AC ; G 1885\nU 5293 ; WX 854 ; N uni14AD ; G 1886\nU 5294 ; WX 863 ; N uni14AE ; G 1887\nU 5295 ; WX 874 ; N uni14AF ; G 1888\nU 5296 ; WX 863 ; N uni14B0 ; G 1889\nU 5297 ; WX 874 ; N uni14B1 ; G 1890\nU 5298 ; WX 881 ; N uni14B2 ; G 1891\nU 5299 ; WX 874 ; N uni14B3 ; G 1892\nU 5300 ; WX 881 ; N uni14B4 ; G 1893\nU 5301 ; WX 874 ; N uni14B5 ; G 1894\nU 5302 ; WX 863 ; N uni14B6 ; G 1895\nU 5303 ; WX 874 ; N uni14B7 ; G 1896\nU 5304 ; WX 863 ; N uni14B8 ; G 1897\nU 5305 ; WX 874 ; N uni14B9 ; G 1898\nU 5306 ; WX 863 ; N uni14BA ; G 1899\nU 5307 ; WX 436 ; N uni14BB ; G 1900\nU 5308 ; WX 548 ; N uni14BC ; G 1901\nU 5309 ; WX 436 ; N uni14BD ; G 1902\nU 5312 ; WX 988 ; N uni14C0 ; G 1903\nU 5313 ; WX 988 ; N uni14C1 ; G 1904\nU 5314 ; WX 988 ; N uni14C2 ; G 1905\nU 5315 ; WX 988 ; N uni14C3 ; G 1906\nU 5316 ; WX 931 ; N uni14C4 ; G 1907\nU 5317 ; WX 931 ; N uni14C5 ; G 1908\nU 5318 ; WX 931 ; N uni14C6 ; G 1909\nU 5319 ; WX 931 ; N uni14C7 ; G 1910\nU 5320 ; WX 931 ; N uni14C8 ; G 1911\nU 5321 ; WX 1238 ; N uni14C9 ; G 1912\nU 5322 ; WX 1247 ; N uni14CA ; G 1913\nU 5323 ; WX 1200 ; N uni14CB ; G 1914\nU 5324 ; WX 1228 ; N uni14CC ; G 1915\nU 5325 ; WX 1200 ; N uni14CD ; G 1916\nU 5326 ; WX 1228 ; N uni14CE ; G 1917\nU 5327 ; WX 931 ; N uni14CF ; G 1918\nU 5328 ; WX 660 ; N uni14D0 ; G 1919\nU 5329 ; WX 497 ; N uni14D1 ; G 1920\nU 5330 ; WX 660 ; N uni14D2 ; G 1921\nU 5331 ; WX 988 ; N uni14D3 ; G 1922\nU 5332 ; WX 988 ; N uni14D4 ; G 1923\nU 5333 ; WX 988 ; N uni14D5 ; G 1924\nU 5334 ; WX 988 ; N uni14D6 ; G 1925\nU 5335 ; WX 931 ; N uni14D7 ; G 1926\nU 5336 ; WX 931 ; N uni14D8 ; G 1927\nU 5337 ; WX 931 ; N uni14D9 ; G 1928\nU 5338 ; WX 931 ; N uni14DA ; G 1929\nU 5339 ; WX 931 ; N uni14DB ; G 1930\nU 5340 ; WX 1231 ; N uni14DC ; G 1931\nU 5341 ; WX 1247 ; N uni14DD ; G 1932\nU 5342 ; WX 1283 ; N uni14DE ; G 1933\nU 5343 ; WX 1228 ; N uni14DF ; G 1934\nU 5344 ; WX 1283 ; N uni14E0 ; G 1935\nU 5345 ; WX 1228 ; N uni14E1 ; G 1936\nU 5346 ; WX 1228 ; N uni14E2 ; G 1937\nU 5347 ; WX 1214 ; N uni14E3 ; G 1938\nU 5348 ; WX 1228 ; N uni14E4 ; G 1939\nU 5349 ; WX 1214 ; N uni14E5 ; G 1940\nU 5350 ; WX 1283 ; N uni14E6 ; G 1941\nU 5351 ; WX 1228 ; N uni14E7 ; G 1942\nU 5352 ; WX 1283 ; N uni14E8 ; G 1943\nU 5353 ; WX 1228 ; N uni14E9 ; G 1944\nU 5354 ; WX 660 ; N uni14EA ; G 1945\nU 5356 ; WX 886 ; N uni14EC ; G 1946\nU 5357 ; WX 730 ; N uni14ED ; G 1947\nU 5358 ; WX 730 ; N uni14EE ; G 1948\nU 5359 ; WX 730 ; N uni14EF ; G 1949\nU 5360 ; WX 730 ; N uni14F0 ; G 1950\nU 5361 ; WX 730 ; N uni14F1 ; G 1951\nU 5362 ; WX 730 ; N uni14F2 ; G 1952\nU 5363 ; WX 730 ; N uni14F3 ; G 1953\nU 5364 ; WX 730 ; N uni14F4 ; G 1954\nU 5365 ; WX 730 ; N uni14F5 ; G 1955\nU 5366 ; WX 998 ; N uni14F6 ; G 1956\nU 5367 ; WX 958 ; N uni14F7 ; G 1957\nU 5368 ; WX 967 ; N uni14F8 ; G 1958\nU 5369 ; WX 989 ; N uni14F9 ; G 1959\nU 5370 ; WX 967 ; N uni14FA ; G 1960\nU 5371 ; WX 989 ; N uni14FB ; G 1961\nU 5372 ; WX 998 ; N uni14FC ; G 1962\nU 5373 ; WX 958 ; N uni14FD ; G 1963\nU 5374 ; WX 998 ; N uni14FE ; G 1964\nU 5375 ; WX 958 ; N uni14FF ; G 1965\nU 5376 ; WX 967 ; N uni1500 ; G 1966\nU 5377 ; WX 989 ; N uni1501 ; G 1967\nU 5378 ; WX 967 ; N uni1502 ; G 1968\nU 5379 ; WX 989 ; N uni1503 ; G 1969\nU 5380 ; WX 967 ; N uni1504 ; G 1970\nU 5381 ; WX 493 ; N uni1505 ; G 1971\nU 5382 ; WX 460 ; N uni1506 ; G 1972\nU 5383 ; WX 493 ; N uni1507 ; G 1973\nU 5392 ; WX 923 ; N uni1510 ; G 1974\nU 5393 ; WX 923 ; N uni1511 ; G 1975\nU 5394 ; WX 923 ; N uni1512 ; G 1976\nU 5395 ; WX 1136 ; N uni1513 ; G 1977\nU 5396 ; WX 1136 ; N uni1514 ; G 1978\nU 5397 ; WX 1136 ; N uni1515 ; G 1979\nU 5398 ; WX 1136 ; N uni1516 ; G 1980\nU 5399 ; WX 1209 ; N uni1517 ; G 1981\nU 5400 ; WX 1202 ; N uni1518 ; G 1982\nU 5401 ; WX 1209 ; N uni1519 ; G 1983\nU 5402 ; WX 1202 ; N uni151A ; G 1984\nU 5403 ; WX 1209 ; N uni151B ; G 1985\nU 5404 ; WX 1202 ; N uni151C ; G 1986\nU 5405 ; WX 1431 ; N uni151D ; G 1987\nU 5406 ; WX 1420 ; N uni151E ; G 1988\nU 5407 ; WX 1431 ; N uni151F ; G 1989\nU 5408 ; WX 1420 ; N uni1520 ; G 1990\nU 5409 ; WX 1431 ; N uni1521 ; G 1991\nU 5410 ; WX 1420 ; N uni1522 ; G 1992\nU 5411 ; WX 1431 ; N uni1523 ; G 1993\nU 5412 ; WX 1420 ; N uni1524 ; G 1994\nU 5413 ; WX 746 ; N uni1525 ; G 1995\nU 5414 ; WX 776 ; N uni1526 ; G 1996\nU 5415 ; WX 776 ; N uni1527 ; G 1997\nU 5416 ; WX 776 ; N uni1528 ; G 1998\nU 5417 ; WX 776 ; N uni1529 ; G 1999\nU 5418 ; WX 776 ; N uni152A ; G 2000\nU 5419 ; WX 776 ; N uni152B ; G 2001\nU 5420 ; WX 776 ; N uni152C ; G 2002\nU 5421 ; WX 776 ; N uni152D ; G 2003\nU 5422 ; WX 776 ; N uni152E ; G 2004\nU 5423 ; WX 1003 ; N uni152F ; G 2005\nU 5424 ; WX 1003 ; N uni1530 ; G 2006\nU 5425 ; WX 1013 ; N uni1531 ; G 2007\nU 5426 ; WX 996 ; N uni1532 ; G 2008\nU 5427 ; WX 1013 ; N uni1533 ; G 2009\nU 5428 ; WX 996 ; N uni1534 ; G 2010\nU 5429 ; WX 1003 ; N uni1535 ; G 2011\nU 5430 ; WX 1003 ; N uni1536 ; G 2012\nU 5431 ; WX 1003 ; N uni1537 ; G 2013\nU 5432 ; WX 1003 ; N uni1538 ; G 2014\nU 5433 ; WX 1013 ; N uni1539 ; G 2015\nU 5434 ; WX 996 ; N uni153A ; G 2016\nU 5435 ; WX 1013 ; N uni153B ; G 2017\nU 5436 ; WX 996 ; N uni153C ; G 2018\nU 5437 ; WX 1013 ; N uni153D ; G 2019\nU 5438 ; WX 495 ; N uni153E ; G 2020\nU 5440 ; WX 395 ; N uni1540 ; G 2021\nU 5441 ; WX 510 ; N uni1541 ; G 2022\nU 5442 ; WX 1033 ; N uni1542 ; G 2023\nU 5443 ; WX 1033 ; N uni1543 ; G 2024\nU 5444 ; WX 976 ; N uni1544 ; G 2025\nU 5445 ; WX 976 ; N uni1545 ; G 2026\nU 5446 ; WX 976 ; N uni1546 ; G 2027\nU 5447 ; WX 976 ; N uni1547 ; G 2028\nU 5448 ; WX 733 ; N uni1548 ; G 2029\nU 5449 ; WX 733 ; N uni1549 ; G 2030\nU 5450 ; WX 733 ; N uni154A ; G 2031\nU 5451 ; WX 733 ; N uni154B ; G 2032\nU 5452 ; WX 733 ; N uni154C ; G 2033\nU 5453 ; WX 733 ; N uni154D ; G 2034\nU 5454 ; WX 1003 ; N uni154E ; G 2035\nU 5455 ; WX 959 ; N uni154F ; G 2036\nU 5456 ; WX 495 ; N uni1550 ; G 2037\nU 5458 ; WX 886 ; N uni1552 ; G 2038\nU 5459 ; WX 774 ; N uni1553 ; G 2039\nU 5460 ; WX 774 ; N uni1554 ; G 2040\nU 5461 ; WX 774 ; N uni1555 ; G 2041\nU 5462 ; WX 774 ; N uni1556 ; G 2042\nU 5463 ; WX 928 ; N uni1557 ; G 2043\nU 5464 ; WX 928 ; N uni1558 ; G 2044\nU 5465 ; WX 928 ; N uni1559 ; G 2045\nU 5466 ; WX 928 ; N uni155A ; G 2046\nU 5467 ; WX 1172 ; N uni155B ; G 2047\nU 5468 ; WX 1142 ; N uni155C ; G 2048\nU 5469 ; WX 602 ; N uni155D ; G 2049\nU 5470 ; WX 812 ; N uni155E ; G 2050\nU 5471 ; WX 812 ; N uni155F ; G 2051\nU 5472 ; WX 812 ; N uni1560 ; G 2052\nU 5473 ; WX 812 ; N uni1561 ; G 2053\nU 5474 ; WX 812 ; N uni1562 ; G 2054\nU 5475 ; WX 812 ; N uni1563 ; G 2055\nU 5476 ; WX 815 ; N uni1564 ; G 2056\nU 5477 ; WX 815 ; N uni1565 ; G 2057\nU 5478 ; WX 815 ; N uni1566 ; G 2058\nU 5479 ; WX 815 ; N uni1567 ; G 2059\nU 5480 ; WX 1060 ; N uni1568 ; G 2060\nU 5481 ; WX 1052 ; N uni1569 ; G 2061\nU 5482 ; WX 548 ; N uni156A ; G 2062\nU 5492 ; WX 977 ; N uni1574 ; G 2063\nU 5493 ; WX 977 ; N uni1575 ; G 2064\nU 5494 ; WX 977 ; N uni1576 ; G 2065\nU 5495 ; WX 977 ; N uni1577 ; G 2066\nU 5496 ; WX 977 ; N uni1578 ; G 2067\nU 5497 ; WX 977 ; N uni1579 ; G 2068\nU 5498 ; WX 977 ; N uni157A ; G 2069\nU 5499 ; WX 618 ; N uni157B ; G 2070\nU 5500 ; WX 837 ; N uni157C ; G 2071\nU 5501 ; WX 510 ; N uni157D ; G 2072\nU 5502 ; WX 1238 ; N uni157E ; G 2073\nU 5503 ; WX 1238 ; N uni157F ; G 2074\nU 5504 ; WX 1238 ; N uni1580 ; G 2075\nU 5505 ; WX 1238 ; N uni1581 ; G 2076\nU 5506 ; WX 1238 ; N uni1582 ; G 2077\nU 5507 ; WX 1238 ; N uni1583 ; G 2078\nU 5508 ; WX 1238 ; N uni1584 ; G 2079\nU 5509 ; WX 989 ; N uni1585 ; G 2080\nU 5514 ; WX 977 ; N uni158A ; G 2081\nU 5515 ; WX 977 ; N uni158B ; G 2082\nU 5516 ; WX 977 ; N uni158C ; G 2083\nU 5517 ; WX 977 ; N uni158D ; G 2084\nU 5518 ; WX 1591 ; N uni158E ; G 2085\nU 5519 ; WX 1591 ; N uni158F ; G 2086\nU 5520 ; WX 1591 ; N uni1590 ; G 2087\nU 5521 ; WX 1295 ; N uni1591 ; G 2088\nU 5522 ; WX 1295 ; N uni1592 ; G 2089\nU 5523 ; WX 1591 ; N uni1593 ; G 2090\nU 5524 ; WX 1591 ; N uni1594 ; G 2091\nU 5525 ; WX 848 ; N uni1595 ; G 2092\nU 5526 ; WX 1273 ; N uni1596 ; G 2093\nU 5536 ; WX 988 ; N uni15A0 ; G 2094\nU 5537 ; WX 988 ; N uni15A1 ; G 2095\nU 5538 ; WX 931 ; N uni15A2 ; G 2096\nU 5539 ; WX 931 ; N uni15A3 ; G 2097\nU 5540 ; WX 931 ; N uni15A4 ; G 2098\nU 5541 ; WX 931 ; N uni15A5 ; G 2099\nU 5542 ; WX 660 ; N uni15A6 ; G 2100\nU 5543 ; WX 776 ; N uni15A7 ; G 2101\nU 5544 ; WX 776 ; N uni15A8 ; G 2102\nU 5545 ; WX 776 ; N uni15A9 ; G 2103\nU 5546 ; WX 776 ; N uni15AA ; G 2104\nU 5547 ; WX 776 ; N uni15AB ; G 2105\nU 5548 ; WX 776 ; N uni15AC ; G 2106\nU 5549 ; WX 776 ; N uni15AD ; G 2107\nU 5550 ; WX 495 ; N uni15AE ; G 2108\nU 5551 ; WX 743 ; N uni15AF ; G 2109\nU 5598 ; WX 830 ; N uni15DE ; G 2110\nU 5601 ; WX 830 ; N uni15E1 ; G 2111\nU 5702 ; WX 496 ; N uni1646 ; G 2112\nU 5703 ; WX 496 ; N uni1647 ; G 2113\nU 5742 ; WX 413 ; N uni166E ; G 2114\nU 5743 ; WX 1238 ; N uni166F ; G 2115\nU 5744 ; WX 1591 ; N uni1670 ; G 2116\nU 5745 ; WX 2016 ; N uni1671 ; G 2117\nU 5746 ; WX 2016 ; N uni1672 ; G 2118\nU 5747 ; WX 1720 ; N uni1673 ; G 2119\nU 5748 ; WX 1678 ; N uni1674 ; G 2120\nU 5749 ; WX 2016 ; N uni1675 ; G 2121\nU 5750 ; WX 2016 ; N uni1676 ; G 2122\nU 5760 ; WX 543 ; N uni1680 ; G 2123\nU 5761 ; WX 637 ; N uni1681 ; G 2124\nU 5762 ; WX 945 ; N uni1682 ; G 2125\nU 5763 ; WX 1254 ; N uni1683 ; G 2126\nU 5764 ; WX 1563 ; N uni1684 ; G 2127\nU 5765 ; WX 1871 ; N uni1685 ; G 2128\nU 5766 ; WX 627 ; N uni1686 ; G 2129\nU 5767 ; WX 936 ; N uni1687 ; G 2130\nU 5768 ; WX 1254 ; N uni1688 ; G 2131\nU 5769 ; WX 1559 ; N uni1689 ; G 2132\nU 5770 ; WX 1871 ; N uni168A ; G 2133\nU 5771 ; WX 569 ; N uni168B ; G 2134\nU 5772 ; WX 877 ; N uni168C ; G 2135\nU 5773 ; WX 1187 ; N uni168D ; G 2136\nU 5774 ; WX 1497 ; N uni168E ; G 2137\nU 5775 ; WX 1807 ; N uni168F ; G 2138\nU 5776 ; WX 637 ; N uni1690 ; G 2139\nU 5777 ; WX 945 ; N uni1691 ; G 2140\nU 5778 ; WX 1240 ; N uni1692 ; G 2141\nU 5779 ; WX 1555 ; N uni1693 ; G 2142\nU 5780 ; WX 1871 ; N uni1694 ; G 2143\nU 5781 ; WX 569 ; N uni1695 ; G 2144\nU 5782 ; WX 569 ; N uni1696 ; G 2145\nU 5783 ; WX 789 ; N uni1697 ; G 2146\nU 5784 ; WX 1234 ; N uni1698 ; G 2147\nU 5785 ; WX 1559 ; N uni1699 ; G 2148\nU 5786 ; WX 740 ; N uni169A ; G 2149\nU 5787 ; WX 638 ; N uni169B ; G 2150\nU 5788 ; WX 638 ; N uni169C ; G 2151\nU 7424 ; WX 652 ; N uni1D00 ; G 2152\nU 7425 ; WX 833 ; N uni1D01 ; G 2153\nU 7426 ; WX 1048 ; N uni1D02 ; G 2154\nU 7427 ; WX 608 ; N uni1D03 ; G 2155\nU 7428 ; WX 593 ; N uni1D04 ; G 2156\nU 7429 ; WX 676 ; N uni1D05 ; G 2157\nU 7430 ; WX 676 ; N uni1D06 ; G 2158\nU 7431 ; WX 559 ; N uni1D07 ; G 2159\nU 7432 ; WX 557 ; N uni1D08 ; G 2160\nU 7433 ; WX 343 ; N uni1D09 ; G 2161\nU 7434 ; WX 494 ; N uni1D0A ; G 2162\nU 7435 ; WX 665 ; N uni1D0B ; G 2163\nU 7436 ; WX 539 ; N uni1D0C ; G 2164\nU 7437 ; WX 817 ; N uni1D0D ; G 2165\nU 7438 ; WX 701 ; N uni1D0E ; G 2166\nU 7439 ; WX 687 ; N uni1D0F ; G 2167\nU 7440 ; WX 593 ; N uni1D10 ; G 2168\nU 7441 ; WX 660 ; N uni1D11 ; G 2169\nU 7442 ; WX 660 ; N uni1D12 ; G 2170\nU 7443 ; WX 660 ; N uni1D13 ; G 2171\nU 7444 ; WX 1094 ; N uni1D14 ; G 2172\nU 7446 ; WX 687 ; N uni1D16 ; G 2173\nU 7447 ; WX 687 ; N uni1D17 ; G 2174\nU 7448 ; WX 556 ; N uni1D18 ; G 2175\nU 7449 ; WX 642 ; N uni1D19 ; G 2176\nU 7450 ; WX 642 ; N uni1D1A ; G 2177\nU 7451 ; WX 580 ; N uni1D1B ; G 2178\nU 7452 ; WX 634 ; N uni1D1C ; G 2179\nU 7453 ; WX 737 ; N uni1D1D ; G 2180\nU 7454 ; WX 948 ; N uni1D1E ; G 2181\nU 7455 ; WX 695 ; N uni1D1F ; G 2182\nU 7456 ; WX 652 ; N uni1D20 ; G 2183\nU 7457 ; WX 924 ; N uni1D21 ; G 2184\nU 7458 ; WX 582 ; N uni1D22 ; G 2185\nU 7459 ; WX 646 ; N uni1D23 ; G 2186\nU 7462 ; WX 539 ; N uni1D26 ; G 2187\nU 7463 ; WX 652 ; N uni1D27 ; G 2188\nU 7464 ; WX 691 ; N uni1D28 ; G 2189\nU 7465 ; WX 556 ; N uni1D29 ; G 2190\nU 7466 ; WX 781 ; N uni1D2A ; G 2191\nU 7467 ; WX 732 ; N uni1D2B ; G 2192\nU 7468 ; WX 487 ; N uni1D2C ; G 2193\nU 7469 ; WX 683 ; N uni1D2D ; G 2194\nU 7470 ; WX 480 ; N uni1D2E ; G 2195\nU 7472 ; WX 523 ; N uni1D30 ; G 2196\nU 7473 ; WX 430 ; N uni1D31 ; G 2197\nU 7474 ; WX 430 ; N uni1D32 ; G 2198\nU 7475 ; WX 517 ; N uni1D33 ; G 2199\nU 7476 ; WX 527 ; N uni1D34 ; G 2200\nU 7477 ; WX 234 ; N uni1D35 ; G 2201\nU 7478 ; WX 234 ; N uni1D36 ; G 2202\nU 7479 ; WX 488 ; N uni1D37 ; G 2203\nU 7480 ; WX 401 ; N uni1D38 ; G 2204\nU 7481 ; WX 626 ; N uni1D39 ; G 2205\nU 7482 ; WX 527 ; N uni1D3A ; G 2206\nU 7483 ; WX 527 ; N uni1D3B ; G 2207\nU 7484 ; WX 535 ; N uni1D3C ; G 2208\nU 7485 ; WX 509 ; N uni1D3D ; G 2209\nU 7486 ; WX 461 ; N uni1D3E ; G 2210\nU 7487 ; WX 485 ; N uni1D3F ; G 2211\nU 7488 ; WX 430 ; N uni1D40 ; G 2212\nU 7489 ; WX 511 ; N uni1D41 ; G 2213\nU 7490 ; WX 695 ; N uni1D42 ; G 2214\nU 7491 ; WX 458 ; N uni1D43 ; G 2215\nU 7492 ; WX 458 ; N uni1D44 ; G 2216\nU 7493 ; WX 479 ; N uni1D45 ; G 2217\nU 7494 ; WX 712 ; N uni1D46 ; G 2218\nU 7495 ; WX 479 ; N uni1D47 ; G 2219\nU 7496 ; WX 479 ; N uni1D48 ; G 2220\nU 7497 ; WX 479 ; N uni1D49 ; G 2221\nU 7498 ; WX 479 ; N uni1D4A ; G 2222\nU 7499 ; WX 386 ; N uni1D4B ; G 2223\nU 7500 ; WX 386 ; N uni1D4C ; G 2224\nU 7501 ; WX 479 ; N uni1D4D ; G 2225\nU 7502 ; WX 219 ; N uni1D4E ; G 2226\nU 7503 ; WX 487 ; N uni1D4F ; G 2227\nU 7504 ; WX 664 ; N uni1D50 ; G 2228\nU 7505 ; WX 456 ; N uni1D51 ; G 2229\nU 7506 ; WX 488 ; N uni1D52 ; G 2230\nU 7507 ; WX 414 ; N uni1D53 ; G 2231\nU 7508 ; WX 488 ; N uni1D54 ; G 2232\nU 7509 ; WX 488 ; N uni1D55 ; G 2233\nU 7510 ; WX 479 ; N uni1D56 ; G 2234\nU 7511 ; WX 388 ; N uni1D57 ; G 2235\nU 7512 ; WX 456 ; N uni1D58 ; G 2236\nU 7513 ; WX 462 ; N uni1D59 ; G 2237\nU 7514 ; WX 664 ; N uni1D5A ; G 2238\nU 7515 ; WX 501 ; N uni1D5B ; G 2239\nU 7517 ; WX 451 ; N uni1D5D ; G 2240\nU 7518 ; WX 429 ; N uni1D5E ; G 2241\nU 7519 ; WX 433 ; N uni1D5F ; G 2242\nU 7520 ; WX 493 ; N uni1D60 ; G 2243\nU 7521 ; WX 406 ; N uni1D61 ; G 2244\nU 7522 ; WX 219 ; N uni1D62 ; G 2245\nU 7523 ; WX 315 ; N uni1D63 ; G 2246\nU 7524 ; WX 456 ; N uni1D64 ; G 2247\nU 7525 ; WX 501 ; N uni1D65 ; G 2248\nU 7526 ; WX 451 ; N uni1D66 ; G 2249\nU 7527 ; WX 429 ; N uni1D67 ; G 2250\nU 7528 ; WX 451 ; N uni1D68 ; G 2251\nU 7529 ; WX 493 ; N uni1D69 ; G 2252\nU 7530 ; WX 406 ; N uni1D6A ; G 2253\nU 7543 ; WX 716 ; N uni1D77 ; G 2254\nU 7544 ; WX 527 ; N uni1D78 ; G 2255\nU 7547 ; WX 545 ; N uni1D7B ; G 2256\nU 7549 ; WX 747 ; N uni1D7D ; G 2257\nU 7557 ; WX 514 ; N uni1D85 ; G 2258\nU 7579 ; WX 479 ; N uni1D9B ; G 2259\nU 7580 ; WX 414 ; N uni1D9C ; G 2260\nU 7581 ; WX 414 ; N uni1D9D ; G 2261\nU 7582 ; WX 488 ; N uni1D9E ; G 2262\nU 7583 ; WX 386 ; N uni1D9F ; G 2263\nU 7584 ; WX 377 ; N uni1DA0 ; G 2264\nU 7585 ; WX 348 ; N uni1DA1 ; G 2265\nU 7586 ; WX 479 ; N uni1DA2 ; G 2266\nU 7587 ; WX 456 ; N uni1DA3 ; G 2267\nU 7588 ; WX 347 ; N uni1DA4 ; G 2268\nU 7589 ; WX 281 ; N uni1DA5 ; G 2269\nU 7590 ; WX 347 ; N uni1DA6 ; G 2270\nU 7591 ; WX 347 ; N uni1DA7 ; G 2271\nU 7592 ; WX 431 ; N uni1DA8 ; G 2272\nU 7593 ; WX 326 ; N uni1DA9 ; G 2273\nU 7594 ; WX 330 ; N uni1DAA ; G 2274\nU 7595 ; WX 370 ; N uni1DAB ; G 2275\nU 7596 ; WX 664 ; N uni1DAC ; G 2276\nU 7597 ; WX 664 ; N uni1DAD ; G 2277\nU 7598 ; WX 562 ; N uni1DAE ; G 2278\nU 7599 ; WX 562 ; N uni1DAF ; G 2279\nU 7600 ; WX 448 ; N uni1DB0 ; G 2280\nU 7601 ; WX 488 ; N uni1DB1 ; G 2281\nU 7602 ; WX 542 ; N uni1DB2 ; G 2282\nU 7603 ; WX 422 ; N uni1DB3 ; G 2283\nU 7604 ; WX 396 ; N uni1DB4 ; G 2284\nU 7605 ; WX 388 ; N uni1DB5 ; G 2285\nU 7606 ; WX 583 ; N uni1DB6 ; G 2286\nU 7607 ; WX 494 ; N uni1DB7 ; G 2287\nU 7608 ; WX 399 ; N uni1DB8 ; G 2288\nU 7609 ; WX 451 ; N uni1DB9 ; G 2289\nU 7610 ; WX 501 ; N uni1DBA ; G 2290\nU 7611 ; WX 417 ; N uni1DBB ; G 2291\nU 7612 ; WX 523 ; N uni1DBC ; G 2292\nU 7613 ; WX 470 ; N uni1DBD ; G 2293\nU 7614 ; WX 455 ; N uni1DBE ; G 2294\nU 7615 ; WX 425 ; N uni1DBF ; G 2295\nU 7620 ; WX 0 ; N uni1DC4 ; G 2296\nU 7621 ; WX 0 ; N uni1DC5 ; G 2297\nU 7622 ; WX 0 ; N uni1DC6 ; G 2298\nU 7623 ; WX 0 ; N uni1DC7 ; G 2299\nU 7624 ; WX 0 ; N uni1DC8 ; G 2300\nU 7625 ; WX 0 ; N uni1DC9 ; G 2301\nU 7680 ; WX 774 ; N uni1E00 ; G 2302\nU 7681 ; WX 675 ; N uni1E01 ; G 2303\nU 7682 ; WX 762 ; N uni1E02 ; G 2304\nU 7683 ; WX 716 ; N uni1E03 ; G 2305\nU 7684 ; WX 762 ; N uni1E04 ; G 2306\nU 7685 ; WX 716 ; N uni1E05 ; G 2307\nU 7686 ; WX 762 ; N uni1E06 ; G 2308\nU 7687 ; WX 716 ; N uni1E07 ; G 2309\nU 7688 ; WX 734 ; N uni1E08 ; G 2310\nU 7689 ; WX 593 ; N uni1E09 ; G 2311\nU 7690 ; WX 830 ; N uni1E0A ; G 2312\nU 7691 ; WX 716 ; N uni1E0B ; G 2313\nU 7692 ; WX 830 ; N uni1E0C ; G 2314\nU 7693 ; WX 716 ; N uni1E0D ; G 2315\nU 7694 ; WX 830 ; N uni1E0E ; G 2316\nU 7695 ; WX 716 ; N uni1E0F ; G 2317\nU 7696 ; WX 830 ; N uni1E10 ; G 2318\nU 7697 ; WX 716 ; N uni1E11 ; G 2319\nU 7698 ; WX 830 ; N uni1E12 ; G 2320\nU 7699 ; WX 716 ; N uni1E13 ; G 2321\nU 7700 ; WX 683 ; N uni1E14 ; G 2322\nU 7701 ; WX 678 ; N uni1E15 ; G 2323\nU 7702 ; WX 683 ; N uni1E16 ; G 2324\nU 7703 ; WX 678 ; N uni1E17 ; G 2325\nU 7704 ; WX 683 ; N uni1E18 ; G 2326\nU 7705 ; WX 678 ; N uni1E19 ; G 2327\nU 7706 ; WX 683 ; N uni1E1A ; G 2328\nU 7707 ; WX 678 ; N uni1E1B ; G 2329\nU 7708 ; WX 683 ; N uni1E1C ; G 2330\nU 7709 ; WX 678 ; N uni1E1D ; G 2331\nU 7710 ; WX 683 ; N uni1E1E ; G 2332\nU 7711 ; WX 435 ; N uni1E1F ; G 2333\nU 7712 ; WX 821 ; N uni1E20 ; G 2334\nU 7713 ; WX 716 ; N uni1E21 ; G 2335\nU 7714 ; WX 837 ; N uni1E22 ; G 2336\nU 7715 ; WX 712 ; N uni1E23 ; G 2337\nU 7716 ; WX 837 ; N uni1E24 ; G 2338\nU 7717 ; WX 712 ; N uni1E25 ; G 2339\nU 7718 ; WX 837 ; N uni1E26 ; G 2340\nU 7719 ; WX 712 ; N uni1E27 ; G 2341\nU 7720 ; WX 837 ; N uni1E28 ; G 2342\nU 7721 ; WX 712 ; N uni1E29 ; G 2343\nU 7722 ; WX 837 ; N uni1E2A ; G 2344\nU 7723 ; WX 712 ; N uni1E2B ; G 2345\nU 7724 ; WX 372 ; N uni1E2C ; G 2346\nU 7725 ; WX 343 ; N uni1E2D ; G 2347\nU 7726 ; WX 372 ; N uni1E2E ; G 2348\nU 7727 ; WX 343 ; N uni1E2F ; G 2349\nU 7728 ; WX 775 ; N uni1E30 ; G 2350\nU 7729 ; WX 665 ; N uni1E31 ; G 2351\nU 7730 ; WX 775 ; N uni1E32 ; G 2352\nU 7731 ; WX 665 ; N uni1E33 ; G 2353\nU 7732 ; WX 775 ; N uni1E34 ; G 2354\nU 7733 ; WX 665 ; N uni1E35 ; G 2355\nU 7734 ; WX 637 ; N uni1E36 ; G 2356\nU 7735 ; WX 343 ; N uni1E37 ; G 2357\nU 7736 ; WX 637 ; N uni1E38 ; G 2358\nU 7737 ; WX 343 ; N uni1E39 ; G 2359\nU 7738 ; WX 637 ; N uni1E3A ; G 2360\nU 7739 ; WX 343 ; N uni1E3B ; G 2361\nU 7740 ; WX 637 ; N uni1E3C ; G 2362\nU 7741 ; WX 343 ; N uni1E3D ; G 2363\nU 7742 ; WX 995 ; N uni1E3E ; G 2364\nU 7743 ; WX 1042 ; N uni1E3F ; G 2365\nU 7744 ; WX 995 ; N uni1E40 ; G 2366\nU 7745 ; WX 1042 ; N uni1E41 ; G 2367\nU 7746 ; WX 995 ; N uni1E42 ; G 2368\nU 7747 ; WX 1042 ; N uni1E43 ; G 2369\nU 7748 ; WX 837 ; N uni1E44 ; G 2370\nU 7749 ; WX 712 ; N uni1E45 ; G 2371\nU 7750 ; WX 837 ; N uni1E46 ; G 2372\nU 7751 ; WX 712 ; N uni1E47 ; G 2373\nU 7752 ; WX 837 ; N uni1E48 ; G 2374\nU 7753 ; WX 712 ; N uni1E49 ; G 2375\nU 7754 ; WX 837 ; N uni1E4A ; G 2376\nU 7755 ; WX 712 ; N uni1E4B ; G 2377\nU 7756 ; WX 850 ; N uni1E4C ; G 2378\nU 7757 ; WX 687 ; N uni1E4D ; G 2379\nU 7758 ; WX 850 ; N uni1E4E ; G 2380\nU 7759 ; WX 687 ; N uni1E4F ; G 2381\nU 7760 ; WX 850 ; N uni1E50 ; G 2382\nU 7761 ; WX 687 ; N uni1E51 ; G 2383\nU 7762 ; WX 850 ; N uni1E52 ; G 2384\nU 7763 ; WX 687 ; N uni1E53 ; G 2385\nU 7764 ; WX 733 ; N uni1E54 ; G 2386\nU 7765 ; WX 716 ; N uni1E55 ; G 2387\nU 7766 ; WX 733 ; N uni1E56 ; G 2388\nU 7767 ; WX 716 ; N uni1E57 ; G 2389\nU 7768 ; WX 770 ; N uni1E58 ; G 2390\nU 7769 ; WX 493 ; N uni1E59 ; G 2391\nU 7770 ; WX 770 ; N uni1E5A ; G 2392\nU 7771 ; WX 493 ; N uni1E5B ; G 2393\nU 7772 ; WX 770 ; N uni1E5C ; G 2394\nU 7773 ; WX 493 ; N uni1E5D ; G 2395\nU 7774 ; WX 770 ; N uni1E5E ; G 2396\nU 7775 ; WX 493 ; N uni1E5F ; G 2397\nU 7776 ; WX 720 ; N uni1E60 ; G 2398\nU 7777 ; WX 595 ; N uni1E61 ; G 2399\nU 7778 ; WX 720 ; N uni1E62 ; G 2400\nU 7779 ; WX 595 ; N uni1E63 ; G 2401\nU 7780 ; WX 720 ; N uni1E64 ; G 2402\nU 7781 ; WX 595 ; N uni1E65 ; G 2403\nU 7782 ; WX 720 ; N uni1E66 ; G 2404\nU 7783 ; WX 595 ; N uni1E67 ; G 2405\nU 7784 ; WX 720 ; N uni1E68 ; G 2406\nU 7785 ; WX 595 ; N uni1E69 ; G 2407\nU 7786 ; WX 682 ; N uni1E6A ; G 2408\nU 7787 ; WX 478 ; N uni1E6B ; G 2409\nU 7788 ; WX 682 ; N uni1E6C ; G 2410\nU 7789 ; WX 478 ; N uni1E6D ; G 2411\nU 7790 ; WX 682 ; N uni1E6E ; G 2412\nU 7791 ; WX 478 ; N uni1E6F ; G 2413\nU 7792 ; WX 682 ; N uni1E70 ; G 2414\nU 7793 ; WX 478 ; N uni1E71 ; G 2415\nU 7794 ; WX 812 ; N uni1E72 ; G 2416\nU 7795 ; WX 712 ; N uni1E73 ; G 2417\nU 7796 ; WX 812 ; N uni1E74 ; G 2418\nU 7797 ; WX 712 ; N uni1E75 ; G 2419\nU 7798 ; WX 812 ; N uni1E76 ; G 2420\nU 7799 ; WX 712 ; N uni1E77 ; G 2421\nU 7800 ; WX 812 ; N uni1E78 ; G 2422\nU 7801 ; WX 712 ; N uni1E79 ; G 2423\nU 7802 ; WX 812 ; N uni1E7A ; G 2424\nU 7803 ; WX 712 ; N uni1E7B ; G 2425\nU 7804 ; WX 774 ; N uni1E7C ; G 2426\nU 7805 ; WX 652 ; N uni1E7D ; G 2427\nU 7806 ; WX 774 ; N uni1E7E ; G 2428\nU 7807 ; WX 652 ; N uni1E7F ; G 2429\nU 7808 ; WX 1103 ; N Wgrave ; G 2430\nU 7809 ; WX 924 ; N wgrave ; G 2431\nU 7810 ; WX 1103 ; N Wacute ; G 2432\nU 7811 ; WX 924 ; N wacute ; G 2433\nU 7812 ; WX 1103 ; N Wdieresis ; G 2434\nU 7813 ; WX 924 ; N wdieresis ; G 2435\nU 7814 ; WX 1103 ; N uni1E86 ; G 2436\nU 7815 ; WX 924 ; N uni1E87 ; G 2437\nU 7816 ; WX 1103 ; N uni1E88 ; G 2438\nU 7817 ; WX 924 ; N uni1E89 ; G 2439\nU 7818 ; WX 771 ; N uni1E8A ; G 2440\nU 7819 ; WX 645 ; N uni1E8B ; G 2441\nU 7820 ; WX 771 ; N uni1E8C ; G 2442\nU 7821 ; WX 645 ; N uni1E8D ; G 2443\nU 7822 ; WX 724 ; N uni1E8E ; G 2444\nU 7823 ; WX 652 ; N uni1E8F ; G 2445\nU 7824 ; WX 725 ; N uni1E90 ; G 2446\nU 7825 ; WX 582 ; N uni1E91 ; G 2447\nU 7826 ; WX 725 ; N uni1E92 ; G 2448\nU 7827 ; WX 582 ; N uni1E93 ; G 2449\nU 7828 ; WX 725 ; N uni1E94 ; G 2450\nU 7829 ; WX 582 ; N uni1E95 ; G 2451\nU 7830 ; WX 712 ; N uni1E96 ; G 2452\nU 7831 ; WX 478 ; N uni1E97 ; G 2453\nU 7832 ; WX 924 ; N uni1E98 ; G 2454\nU 7833 ; WX 652 ; N uni1E99 ; G 2455\nU 7834 ; WX 675 ; N uni1E9A ; G 2456\nU 7835 ; WX 435 ; N uni1E9B ; G 2457\nU 7836 ; WX 435 ; N uni1E9C ; G 2458\nU 7837 ; WX 435 ; N uni1E9D ; G 2459\nU 7838 ; WX 896 ; N uni1E9E ; G 2460\nU 7839 ; WX 687 ; N uni1E9F ; G 2461\nU 7840 ; WX 774 ; N uni1EA0 ; G 2462\nU 7841 ; WX 675 ; N uni1EA1 ; G 2463\nU 7842 ; WX 774 ; N uni1EA2 ; G 2464\nU 7843 ; WX 675 ; N uni1EA3 ; G 2465\nU 7844 ; WX 774 ; N uni1EA4 ; G 2466\nU 7845 ; WX 675 ; N uni1EA5 ; G 2467\nU 7846 ; WX 774 ; N uni1EA6 ; G 2468\nU 7847 ; WX 675 ; N uni1EA7 ; G 2469\nU 7848 ; WX 774 ; N uni1EA8 ; G 2470\nU 7849 ; WX 675 ; N uni1EA9 ; G 2471\nU 7850 ; WX 774 ; N uni1EAA ; G 2472\nU 7851 ; WX 675 ; N uni1EAB ; G 2473\nU 7852 ; WX 774 ; N uni1EAC ; G 2474\nU 7853 ; WX 675 ; N uni1EAD ; G 2475\nU 7854 ; WX 774 ; N uni1EAE ; G 2476\nU 7855 ; WX 675 ; N uni1EAF ; G 2477\nU 7856 ; WX 774 ; N uni1EB0 ; G 2478\nU 7857 ; WX 675 ; N uni1EB1 ; G 2479\nU 7858 ; WX 774 ; N uni1EB2 ; G 2480\nU 7859 ; WX 675 ; N uni1EB3 ; G 2481\nU 7860 ; WX 774 ; N uni1EB4 ; G 2482\nU 7861 ; WX 675 ; N uni1EB5 ; G 2483\nU 7862 ; WX 774 ; N uni1EB6 ; G 2484\nU 7863 ; WX 675 ; N uni1EB7 ; G 2485\nU 7864 ; WX 683 ; N uni1EB8 ; G 2486\nU 7865 ; WX 678 ; N uni1EB9 ; G 2487\nU 7866 ; WX 683 ; N uni1EBA ; G 2488\nU 7867 ; WX 678 ; N uni1EBB ; G 2489\nU 7868 ; WX 683 ; N uni1EBC ; G 2490\nU 7869 ; WX 678 ; N uni1EBD ; G 2491\nU 7870 ; WX 683 ; N uni1EBE ; G 2492\nU 7871 ; WX 678 ; N uni1EBF ; G 2493\nU 7872 ; WX 683 ; N uni1EC0 ; G 2494\nU 7873 ; WX 678 ; N uni1EC1 ; G 2495\nU 7874 ; WX 683 ; N uni1EC2 ; G 2496\nU 7875 ; WX 678 ; N uni1EC3 ; G 2497\nU 7876 ; WX 683 ; N uni1EC4 ; G 2498\nU 7877 ; WX 678 ; N uni1EC5 ; G 2499\nU 7878 ; WX 683 ; N uni1EC6 ; G 2500\nU 7879 ; WX 678 ; N uni1EC7 ; G 2501\nU 7880 ; WX 372 ; N uni1EC8 ; G 2502\nU 7881 ; WX 343 ; N uni1EC9 ; G 2503\nU 7882 ; WX 372 ; N uni1ECA ; G 2504\nU 7883 ; WX 343 ; N uni1ECB ; G 2505\nU 7884 ; WX 850 ; N uni1ECC ; G 2506\nU 7885 ; WX 687 ; N uni1ECD ; G 2507\nU 7886 ; WX 850 ; N uni1ECE ; G 2508\nU 7887 ; WX 687 ; N uni1ECF ; G 2509\nU 7888 ; WX 850 ; N uni1ED0 ; G 2510\nU 7889 ; WX 687 ; N uni1ED1 ; G 2511\nU 7890 ; WX 850 ; N uni1ED2 ; G 2512\nU 7891 ; WX 687 ; N uni1ED3 ; G 2513\nU 7892 ; WX 850 ; N uni1ED4 ; G 2514\nU 7893 ; WX 687 ; N uni1ED5 ; G 2515\nU 7894 ; WX 850 ; N uni1ED6 ; G 2516\nU 7895 ; WX 687 ; N uni1ED7 ; G 2517\nU 7896 ; WX 850 ; N uni1ED8 ; G 2518\nU 7897 ; WX 687 ; N uni1ED9 ; G 2519\nU 7898 ; WX 874 ; N uni1EDA ; G 2520\nU 7899 ; WX 687 ; N uni1EDB ; G 2521\nU 7900 ; WX 874 ; N uni1EDC ; G 2522\nU 7901 ; WX 687 ; N uni1EDD ; G 2523\nU 7902 ; WX 874 ; N uni1EDE ; G 2524\nU 7903 ; WX 687 ; N uni1EDF ; G 2525\nU 7904 ; WX 874 ; N uni1EE0 ; G 2526\nU 7905 ; WX 687 ; N uni1EE1 ; G 2527\nU 7906 ; WX 874 ; N uni1EE2 ; G 2528\nU 7907 ; WX 687 ; N uni1EE3 ; G 2529\nU 7908 ; WX 812 ; N uni1EE4 ; G 2530\nU 7909 ; WX 712 ; N uni1EE5 ; G 2531\nU 7910 ; WX 812 ; N uni1EE6 ; G 2532\nU 7911 ; WX 712 ; N uni1EE7 ; G 2533\nU 7912 ; WX 835 ; N uni1EE8 ; G 2534\nU 7913 ; WX 712 ; N uni1EE9 ; G 2535\nU 7914 ; WX 835 ; N uni1EEA ; G 2536\nU 7915 ; WX 712 ; N uni1EEB ; G 2537\nU 7916 ; WX 835 ; N uni1EEC ; G 2538\nU 7917 ; WX 712 ; N uni1EED ; G 2539\nU 7918 ; WX 835 ; N uni1EEE ; G 2540\nU 7919 ; WX 712 ; N uni1EEF ; G 2541\nU 7920 ; WX 835 ; N uni1EF0 ; G 2542\nU 7921 ; WX 712 ; N uni1EF1 ; G 2543\nU 7922 ; WX 724 ; N Ygrave ; G 2544\nU 7923 ; WX 652 ; N ygrave ; G 2545\nU 7924 ; WX 724 ; N uni1EF4 ; G 2546\nU 7925 ; WX 652 ; N uni1EF5 ; G 2547\nU 7926 ; WX 724 ; N uni1EF6 ; G 2548\nU 7927 ; WX 652 ; N uni1EF7 ; G 2549\nU 7928 ; WX 724 ; N uni1EF8 ; G 2550\nU 7929 ; WX 652 ; N uni1EF9 ; G 2551\nU 7930 ; WX 953 ; N uni1EFA ; G 2552\nU 7931 ; WX 644 ; N uni1EFB ; G 2553\nU 7936 ; WX 687 ; N uni1F00 ; G 2554\nU 7937 ; WX 687 ; N uni1F01 ; G 2555\nU 7938 ; WX 687 ; N uni1F02 ; G 2556\nU 7939 ; WX 687 ; N uni1F03 ; G 2557\nU 7940 ; WX 687 ; N uni1F04 ; G 2558\nU 7941 ; WX 687 ; N uni1F05 ; G 2559\nU 7942 ; WX 687 ; N uni1F06 ; G 2560\nU 7943 ; WX 687 ; N uni1F07 ; G 2561\nU 7944 ; WX 774 ; N uni1F08 ; G 2562\nU 7945 ; WX 774 ; N uni1F09 ; G 2563\nU 7946 ; WX 1041 ; N uni1F0A ; G 2564\nU 7947 ; WX 1043 ; N uni1F0B ; G 2565\nU 7948 ; WX 935 ; N uni1F0C ; G 2566\nU 7949 ; WX 963 ; N uni1F0D ; G 2567\nU 7950 ; WX 835 ; N uni1F0E ; G 2568\nU 7951 ; WX 859 ; N uni1F0F ; G 2569\nU 7952 ; WX 557 ; N uni1F10 ; G 2570\nU 7953 ; WX 557 ; N uni1F11 ; G 2571\nU 7954 ; WX 557 ; N uni1F12 ; G 2572\nU 7955 ; WX 557 ; N uni1F13 ; G 2573\nU 7956 ; WX 557 ; N uni1F14 ; G 2574\nU 7957 ; WX 557 ; N uni1F15 ; G 2575\nU 7960 ; WX 792 ; N uni1F18 ; G 2576\nU 7961 ; WX 794 ; N uni1F19 ; G 2577\nU 7962 ; WX 1100 ; N uni1F1A ; G 2578\nU 7963 ; WX 1096 ; N uni1F1B ; G 2579\nU 7964 ; WX 1023 ; N uni1F1C ; G 2580\nU 7965 ; WX 1052 ; N uni1F1D ; G 2581\nU 7968 ; WX 712 ; N uni1F20 ; G 2582\nU 7969 ; WX 712 ; N uni1F21 ; G 2583\nU 7970 ; WX 712 ; N uni1F22 ; G 2584\nU 7971 ; WX 712 ; N uni1F23 ; G 2585\nU 7972 ; WX 712 ; N uni1F24 ; G 2586\nU 7973 ; WX 712 ; N uni1F25 ; G 2587\nU 7974 ; WX 712 ; N uni1F26 ; G 2588\nU 7975 ; WX 712 ; N uni1F27 ; G 2589\nU 7976 ; WX 945 ; N uni1F28 ; G 2590\nU 7977 ; WX 951 ; N uni1F29 ; G 2591\nU 7978 ; WX 1250 ; N uni1F2A ; G 2592\nU 7979 ; WX 1250 ; N uni1F2B ; G 2593\nU 7980 ; WX 1180 ; N uni1F2C ; G 2594\nU 7981 ; WX 1206 ; N uni1F2D ; G 2595\nU 7982 ; WX 1054 ; N uni1F2E ; G 2596\nU 7983 ; WX 1063 ; N uni1F2F ; G 2597\nU 7984 ; WX 390 ; N uni1F30 ; G 2598\nU 7985 ; WX 390 ; N uni1F31 ; G 2599\nU 7986 ; WX 390 ; N uni1F32 ; G 2600\nU 7987 ; WX 390 ; N uni1F33 ; G 2601\nU 7988 ; WX 390 ; N uni1F34 ; G 2602\nU 7989 ; WX 390 ; N uni1F35 ; G 2603\nU 7990 ; WX 390 ; N uni1F36 ; G 2604\nU 7991 ; WX 390 ; N uni1F37 ; G 2605\nU 7992 ; WX 483 ; N uni1F38 ; G 2606\nU 7993 ; WX 489 ; N uni1F39 ; G 2607\nU 7994 ; WX 777 ; N uni1F3A ; G 2608\nU 7995 ; WX 785 ; N uni1F3B ; G 2609\nU 7996 ; WX 712 ; N uni1F3C ; G 2610\nU 7997 ; WX 738 ; N uni1F3D ; G 2611\nU 7998 ; WX 604 ; N uni1F3E ; G 2612\nU 7999 ; WX 604 ; N uni1F3F ; G 2613\nU 8000 ; WX 687 ; N uni1F40 ; G 2614\nU 8001 ; WX 687 ; N uni1F41 ; G 2615\nU 8002 ; WX 687 ; N uni1F42 ; G 2616\nU 8003 ; WX 687 ; N uni1F43 ; G 2617\nU 8004 ; WX 687 ; N uni1F44 ; G 2618\nU 8005 ; WX 687 ; N uni1F45 ; G 2619\nU 8008 ; WX 892 ; N uni1F48 ; G 2620\nU 8009 ; WX 933 ; N uni1F49 ; G 2621\nU 8010 ; WX 1221 ; N uni1F4A ; G 2622\nU 8011 ; WX 1224 ; N uni1F4B ; G 2623\nU 8012 ; WX 1053 ; N uni1F4C ; G 2624\nU 8013 ; WX 1082 ; N uni1F4D ; G 2625\nU 8016 ; WX 675 ; N uni1F50 ; G 2626\nU 8017 ; WX 675 ; N uni1F51 ; G 2627\nU 8018 ; WX 675 ; N uni1F52 ; G 2628\nU 8019 ; WX 675 ; N uni1F53 ; G 2629\nU 8020 ; WX 675 ; N uni1F54 ; G 2630\nU 8021 ; WX 675 ; N uni1F55 ; G 2631\nU 8022 ; WX 675 ; N uni1F56 ; G 2632\nU 8023 ; WX 675 ; N uni1F57 ; G 2633\nU 8025 ; WX 930 ; N uni1F59 ; G 2634\nU 8027 ; WX 1184 ; N uni1F5B ; G 2635\nU 8029 ; WX 1199 ; N uni1F5D ; G 2636\nU 8031 ; WX 1049 ; N uni1F5F ; G 2637\nU 8032 ; WX 869 ; N uni1F60 ; G 2638\nU 8033 ; WX 869 ; N uni1F61 ; G 2639\nU 8034 ; WX 869 ; N uni1F62 ; G 2640\nU 8035 ; WX 869 ; N uni1F63 ; G 2641\nU 8036 ; WX 869 ; N uni1F64 ; G 2642\nU 8037 ; WX 869 ; N uni1F65 ; G 2643\nU 8038 ; WX 869 ; N uni1F66 ; G 2644\nU 8039 ; WX 869 ; N uni1F67 ; G 2645\nU 8040 ; WX 909 ; N uni1F68 ; G 2646\nU 8041 ; WX 958 ; N uni1F69 ; G 2647\nU 8042 ; WX 1246 ; N uni1F6A ; G 2648\nU 8043 ; WX 1251 ; N uni1F6B ; G 2649\nU 8044 ; WX 1076 ; N uni1F6C ; G 2650\nU 8045 ; WX 1105 ; N uni1F6D ; G 2651\nU 8046 ; WX 1028 ; N uni1F6E ; G 2652\nU 8047 ; WX 1076 ; N uni1F6F ; G 2653\nU 8048 ; WX 687 ; N uni1F70 ; G 2654\nU 8049 ; WX 687 ; N uni1F71 ; G 2655\nU 8050 ; WX 557 ; N uni1F72 ; G 2656\nU 8051 ; WX 557 ; N uni1F73 ; G 2657\nU 8052 ; WX 712 ; N uni1F74 ; G 2658\nU 8053 ; WX 712 ; N uni1F75 ; G 2659\nU 8054 ; WX 390 ; N uni1F76 ; G 2660\nU 8055 ; WX 390 ; N uni1F77 ; G 2661\nU 8056 ; WX 687 ; N uni1F78 ; G 2662\nU 8057 ; WX 687 ; N uni1F79 ; G 2663\nU 8058 ; WX 675 ; N uni1F7A ; G 2664\nU 8059 ; WX 675 ; N uni1F7B ; G 2665\nU 8060 ; WX 869 ; N uni1F7C ; G 2666\nU 8061 ; WX 869 ; N uni1F7D ; G 2667\nU 8064 ; WX 687 ; N uni1F80 ; G 2668\nU 8065 ; WX 687 ; N uni1F81 ; G 2669\nU 8066 ; WX 687 ; N uni1F82 ; G 2670\nU 8067 ; WX 687 ; N uni1F83 ; G 2671\nU 8068 ; WX 687 ; N uni1F84 ; G 2672\nU 8069 ; WX 687 ; N uni1F85 ; G 2673\nU 8070 ; WX 687 ; N uni1F86 ; G 2674\nU 8071 ; WX 687 ; N uni1F87 ; G 2675\nU 8072 ; WX 774 ; N uni1F88 ; G 2676\nU 8073 ; WX 774 ; N uni1F89 ; G 2677\nU 8074 ; WX 1041 ; N uni1F8A ; G 2678\nU 8075 ; WX 1043 ; N uni1F8B ; G 2679\nU 8076 ; WX 935 ; N uni1F8C ; G 2680\nU 8077 ; WX 963 ; N uni1F8D ; G 2681\nU 8078 ; WX 835 ; N uni1F8E ; G 2682\nU 8079 ; WX 859 ; N uni1F8F ; G 2683\nU 8080 ; WX 712 ; N uni1F90 ; G 2684\nU 8081 ; WX 712 ; N uni1F91 ; G 2685\nU 8082 ; WX 712 ; N uni1F92 ; G 2686\nU 8083 ; WX 712 ; N uni1F93 ; G 2687\nU 8084 ; WX 712 ; N uni1F94 ; G 2688\nU 8085 ; WX 712 ; N uni1F95 ; G 2689\nU 8086 ; WX 712 ; N uni1F96 ; G 2690\nU 8087 ; WX 712 ; N uni1F97 ; G 2691\nU 8088 ; WX 945 ; N uni1F98 ; G 2692\nU 8089 ; WX 951 ; N uni1F99 ; G 2693\nU 8090 ; WX 1250 ; N uni1F9A ; G 2694\nU 8091 ; WX 1250 ; N uni1F9B ; G 2695\nU 8092 ; WX 1180 ; N uni1F9C ; G 2696\nU 8093 ; WX 1206 ; N uni1F9D ; G 2697\nU 8094 ; WX 1054 ; N uni1F9E ; G 2698\nU 8095 ; WX 1063 ; N uni1F9F ; G 2699\nU 8096 ; WX 869 ; N uni1FA0 ; G 2700\nU 8097 ; WX 869 ; N uni1FA1 ; G 2701\nU 8098 ; WX 869 ; N uni1FA2 ; G 2702\nU 8099 ; WX 869 ; N uni1FA3 ; G 2703\nU 8100 ; WX 869 ; N uni1FA4 ; G 2704\nU 8101 ; WX 869 ; N uni1FA5 ; G 2705\nU 8102 ; WX 869 ; N uni1FA6 ; G 2706\nU 8103 ; WX 869 ; N uni1FA7 ; G 2707\nU 8104 ; WX 909 ; N uni1FA8 ; G 2708\nU 8105 ; WX 958 ; N uni1FA9 ; G 2709\nU 8106 ; WX 1246 ; N uni1FAA ; G 2710\nU 8107 ; WX 1251 ; N uni1FAB ; G 2711\nU 8108 ; WX 1076 ; N uni1FAC ; G 2712\nU 8109 ; WX 1105 ; N uni1FAD ; G 2713\nU 8110 ; WX 1028 ; N uni1FAE ; G 2714\nU 8111 ; WX 1076 ; N uni1FAF ; G 2715\nU 8112 ; WX 687 ; N uni1FB0 ; G 2716\nU 8113 ; WX 687 ; N uni1FB1 ; G 2717\nU 8114 ; WX 687 ; N uni1FB2 ; G 2718\nU 8115 ; WX 687 ; N uni1FB3 ; G 2719\nU 8116 ; WX 687 ; N uni1FB4 ; G 2720\nU 8118 ; WX 687 ; N uni1FB6 ; G 2721\nU 8119 ; WX 687 ; N uni1FB7 ; G 2722\nU 8120 ; WX 774 ; N uni1FB8 ; G 2723\nU 8121 ; WX 774 ; N uni1FB9 ; G 2724\nU 8122 ; WX 876 ; N uni1FBA ; G 2725\nU 8123 ; WX 797 ; N uni1FBB ; G 2726\nU 8124 ; WX 774 ; N uni1FBC ; G 2727\nU 8125 ; WX 500 ; N uni1FBD ; G 2728\nU 8126 ; WX 500 ; N uni1FBE ; G 2729\nU 8127 ; WX 500 ; N uni1FBF ; G 2730\nU 8128 ; WX 500 ; N uni1FC0 ; G 2731\nU 8129 ; WX 500 ; N uni1FC1 ; G 2732\nU 8130 ; WX 712 ; N uni1FC2 ; G 2733\nU 8131 ; WX 712 ; N uni1FC3 ; G 2734\nU 8132 ; WX 712 ; N uni1FC4 ; G 2735\nU 8134 ; WX 712 ; N uni1FC6 ; G 2736\nU 8135 ; WX 712 ; N uni1FC7 ; G 2737\nU 8136 ; WX 929 ; N uni1FC8 ; G 2738\nU 8137 ; WX 846 ; N uni1FC9 ; G 2739\nU 8138 ; WX 1080 ; N uni1FCA ; G 2740\nU 8139 ; WX 1009 ; N uni1FCB ; G 2741\nU 8140 ; WX 837 ; N uni1FCC ; G 2742\nU 8141 ; WX 500 ; N uni1FCD ; G 2743\nU 8142 ; WX 500 ; N uni1FCE ; G 2744\nU 8143 ; WX 500 ; N uni1FCF ; G 2745\nU 8144 ; WX 390 ; N uni1FD0 ; G 2746\nU 8145 ; WX 390 ; N uni1FD1 ; G 2747\nU 8146 ; WX 390 ; N uni1FD2 ; G 2748\nU 8147 ; WX 390 ; N uni1FD3 ; G 2749\nU 8150 ; WX 390 ; N uni1FD6 ; G 2750\nU 8151 ; WX 390 ; N uni1FD7 ; G 2751\nU 8152 ; WX 372 ; N uni1FD8 ; G 2752\nU 8153 ; WX 372 ; N uni1FD9 ; G 2753\nU 8154 ; WX 621 ; N uni1FDA ; G 2754\nU 8155 ; WX 563 ; N uni1FDB ; G 2755\nU 8157 ; WX 500 ; N uni1FDD ; G 2756\nU 8158 ; WX 500 ; N uni1FDE ; G 2757\nU 8159 ; WX 500 ; N uni1FDF ; G 2758\nU 8160 ; WX 675 ; N uni1FE0 ; G 2759\nU 8161 ; WX 675 ; N uni1FE1 ; G 2760\nU 8162 ; WX 675 ; N uni1FE2 ; G 2761\nU 8163 ; WX 675 ; N uni1FE3 ; G 2762\nU 8164 ; WX 716 ; N uni1FE4 ; G 2763\nU 8165 ; WX 716 ; N uni1FE5 ; G 2764\nU 8166 ; WX 675 ; N uni1FE6 ; G 2765\nU 8167 ; WX 675 ; N uni1FE7 ; G 2766\nU 8168 ; WX 724 ; N uni1FE8 ; G 2767\nU 8169 ; WX 724 ; N uni1FE9 ; G 2768\nU 8170 ; WX 1020 ; N uni1FEA ; G 2769\nU 8171 ; WX 980 ; N uni1FEB ; G 2770\nU 8172 ; WX 838 ; N uni1FEC ; G 2771\nU 8173 ; WX 500 ; N uni1FED ; G 2772\nU 8174 ; WX 500 ; N uni1FEE ; G 2773\nU 8175 ; WX 500 ; N uni1FEF ; G 2774\nU 8178 ; WX 869 ; N uni1FF2 ; G 2775\nU 8179 ; WX 869 ; N uni1FF3 ; G 2776\nU 8180 ; WX 869 ; N uni1FF4 ; G 2777\nU 8182 ; WX 869 ; N uni1FF6 ; G 2778\nU 8183 ; WX 869 ; N uni1FF7 ; G 2779\nU 8184 ; WX 1065 ; N uni1FF8 ; G 2780\nU 8185 ; WX 891 ; N uni1FF9 ; G 2781\nU 8186 ; WX 1084 ; N uni1FFA ; G 2782\nU 8187 ; WX 894 ; N uni1FFB ; G 2783\nU 8188 ; WX 850 ; N uni1FFC ; G 2784\nU 8189 ; WX 500 ; N uni1FFD ; G 2785\nU 8190 ; WX 500 ; N uni1FFE ; G 2786\nU 8192 ; WX 500 ; N uni2000 ; G 2787\nU 8193 ; WX 1000 ; N uni2001 ; G 2788\nU 8194 ; WX 500 ; N uni2002 ; G 2789\nU 8195 ; WX 1000 ; N uni2003 ; G 2790\nU 8196 ; WX 330 ; N uni2004 ; G 2791\nU 8197 ; WX 250 ; N uni2005 ; G 2792\nU 8198 ; WX 167 ; N uni2006 ; G 2793\nU 8199 ; WX 696 ; N uni2007 ; G 2794\nU 8200 ; WX 380 ; N uni2008 ; G 2795\nU 8201 ; WX 200 ; N uni2009 ; G 2796\nU 8202 ; WX 100 ; N uni200A ; G 2797\nU 8203 ; WX 0 ; N uni200B ; G 2798\nU 8204 ; WX 0 ; N uni200C ; G 2799\nU 8205 ; WX 0 ; N uni200D ; G 2800\nU 8206 ; WX 0 ; N uni200E ; G 2801\nU 8207 ; WX 0 ; N uni200F ; G 2802\nU 8208 ; WX 415 ; N uni2010 ; G 2803\nU 8209 ; WX 415 ; N uni2011 ; G 2804\nU 8210 ; WX 696 ; N figuredash ; G 2805\nU 8211 ; WX 500 ; N endash ; G 2806\nU 8212 ; WX 1000 ; N emdash ; G 2807\nU 8213 ; WX 1000 ; N uni2015 ; G 2808\nU 8214 ; WX 500 ; N uni2016 ; G 2809\nU 8215 ; WX 500 ; N underscoredbl ; G 2810\nU 8216 ; WX 380 ; N quoteleft ; G 2811\nU 8217 ; WX 380 ; N quoteright ; G 2812\nU 8218 ; WX 380 ; N quotesinglbase ; G 2813\nU 8219 ; WX 380 ; N quotereversed ; G 2814\nU 8220 ; WX 657 ; N quotedblleft ; G 2815\nU 8221 ; WX 657 ; N quotedblright ; G 2816\nU 8222 ; WX 657 ; N quotedblbase ; G 2817\nU 8223 ; WX 657 ; N uni201F ; G 2818\nU 8224 ; WX 500 ; N dagger ; G 2819\nU 8225 ; WX 500 ; N daggerdbl ; G 2820\nU 8226 ; WX 639 ; N bullet ; G 2821\nU 8227 ; WX 639 ; N uni2023 ; G 2822\nU 8228 ; WX 333 ; N onedotenleader ; G 2823\nU 8229 ; WX 667 ; N twodotenleader ; G 2824\nU 8230 ; WX 1000 ; N ellipsis ; G 2825\nU 8231 ; WX 348 ; N uni2027 ; G 2826\nU 8232 ; WX 0 ; N uni2028 ; G 2827\nU 8233 ; WX 0 ; N uni2029 ; G 2828\nU 8234 ; WX 0 ; N uni202A ; G 2829\nU 8235 ; WX 0 ; N uni202B ; G 2830\nU 8236 ; WX 0 ; N uni202C ; G 2831\nU 8237 ; WX 0 ; N uni202D ; G 2832\nU 8238 ; WX 0 ; N uni202E ; G 2833\nU 8239 ; WX 200 ; N uni202F ; G 2834\nU 8240 ; WX 1440 ; N perthousand ; G 2835\nU 8241 ; WX 1887 ; N uni2031 ; G 2836\nU 8242 ; WX 264 ; N minute ; G 2837\nU 8243 ; WX 447 ; N second ; G 2838\nU 8244 ; WX 630 ; N uni2034 ; G 2839\nU 8245 ; WX 264 ; N uni2035 ; G 2840\nU 8246 ; WX 447 ; N uni2036 ; G 2841\nU 8247 ; WX 630 ; N uni2037 ; G 2842\nU 8248 ; WX 733 ; N uni2038 ; G 2843\nU 8249 ; WX 412 ; N guilsinglleft ; G 2844\nU 8250 ; WX 412 ; N guilsinglright ; G 2845\nU 8251 ; WX 972 ; N uni203B ; G 2846\nU 8252 ; WX 627 ; N exclamdbl ; G 2847\nU 8253 ; WX 580 ; N uni203D ; G 2848\nU 8254 ; WX 500 ; N uni203E ; G 2849\nU 8255 ; WX 828 ; N uni203F ; G 2850\nU 8256 ; WX 828 ; N uni2040 ; G 2851\nU 8257 ; WX 329 ; N uni2041 ; G 2852\nU 8258 ; WX 1023 ; N uni2042 ; G 2853\nU 8259 ; WX 500 ; N uni2043 ; G 2854\nU 8260 ; WX 167 ; N fraction ; G 2855\nU 8261 ; WX 457 ; N uni2045 ; G 2856\nU 8262 ; WX 457 ; N uni2046 ; G 2857\nU 8263 ; WX 1030 ; N uni2047 ; G 2858\nU 8264 ; WX 829 ; N uni2048 ; G 2859\nU 8265 ; WX 829 ; N uni2049 ; G 2860\nU 8266 ; WX 513 ; N uni204A ; G 2861\nU 8267 ; WX 636 ; N uni204B ; G 2862\nU 8268 ; WX 500 ; N uni204C ; G 2863\nU 8269 ; WX 500 ; N uni204D ; G 2864\nU 8270 ; WX 523 ; N uni204E ; G 2865\nU 8271 ; WX 400 ; N uni204F ; G 2866\nU 8272 ; WX 828 ; N uni2050 ; G 2867\nU 8273 ; WX 523 ; N uni2051 ; G 2868\nU 8274 ; WX 556 ; N uni2052 ; G 2869\nU 8275 ; WX 1000 ; N uni2053 ; G 2870\nU 8276 ; WX 828 ; N uni2054 ; G 2871\nU 8277 ; WX 838 ; N uni2055 ; G 2872\nU 8278 ; WX 684 ; N uni2056 ; G 2873\nU 8279 ; WX 813 ; N uni2057 ; G 2874\nU 8280 ; WX 838 ; N uni2058 ; G 2875\nU 8281 ; WX 838 ; N uni2059 ; G 2876\nU 8282 ; WX 380 ; N uni205A ; G 2877\nU 8283 ; WX 872 ; N uni205B ; G 2878\nU 8284 ; WX 838 ; N uni205C ; G 2879\nU 8285 ; WX 380 ; N uni205D ; G 2880\nU 8286 ; WX 380 ; N uni205E ; G 2881\nU 8287 ; WX 222 ; N uni205F ; G 2882\nU 8288 ; WX 0 ; N uni2060 ; G 2883\nU 8289 ; WX 0 ; N uni2061 ; G 2884\nU 8290 ; WX 0 ; N uni2062 ; G 2885\nU 8291 ; WX 0 ; N uni2063 ; G 2886\nU 8292 ; WX 0 ; N uni2064 ; G 2887\nU 8298 ; WX 0 ; N uni206A ; G 2888\nU 8299 ; WX 0 ; N uni206B ; G 2889\nU 8300 ; WX 0 ; N uni206C ; G 2890\nU 8301 ; WX 0 ; N uni206D ; G 2891\nU 8302 ; WX 0 ; N uni206E ; G 2892\nU 8303 ; WX 0 ; N uni206F ; G 2893\nU 8304 ; WX 438 ; N uni2070 ; G 2894\nU 8305 ; WX 219 ; N uni2071 ; G 2895\nU 8308 ; WX 438 ; N uni2074 ; G 2896\nU 8309 ; WX 438 ; N uni2075 ; G 2897\nU 8310 ; WX 438 ; N uni2076 ; G 2898\nU 8311 ; WX 438 ; N uni2077 ; G 2899\nU 8312 ; WX 438 ; N uni2078 ; G 2900\nU 8313 ; WX 438 ; N uni2079 ; G 2901\nU 8314 ; WX 528 ; N uni207A ; G 2902\nU 8315 ; WX 528 ; N uni207B ; G 2903\nU 8316 ; WX 528 ; N uni207C ; G 2904\nU 8317 ; WX 288 ; N uni207D ; G 2905\nU 8318 ; WX 288 ; N uni207E ; G 2906\nU 8319 ; WX 456 ; N uni207F ; G 2907\nU 8320 ; WX 438 ; N uni2080 ; G 2908\nU 8321 ; WX 438 ; N uni2081 ; G 2909\nU 8322 ; WX 438 ; N uni2082 ; G 2910\nU 8323 ; WX 438 ; N uni2083 ; G 2911\nU 8324 ; WX 438 ; N uni2084 ; G 2912\nU 8325 ; WX 438 ; N uni2085 ; G 2913\nU 8326 ; WX 438 ; N uni2086 ; G 2914\nU 8327 ; WX 438 ; N uni2087 ; G 2915\nU 8328 ; WX 438 ; N uni2088 ; G 2916\nU 8329 ; WX 438 ; N uni2089 ; G 2917\nU 8330 ; WX 528 ; N uni208A ; G 2918\nU 8331 ; WX 528 ; N uni208B ; G 2919\nU 8332 ; WX 528 ; N uni208C ; G 2920\nU 8333 ; WX 288 ; N uni208D ; G 2921\nU 8334 ; WX 288 ; N uni208E ; G 2922\nU 8336 ; WX 458 ; N uni2090 ; G 2923\nU 8337 ; WX 479 ; N uni2091 ; G 2924\nU 8338 ; WX 488 ; N uni2092 ; G 2925\nU 8339 ; WX 413 ; N uni2093 ; G 2926\nU 8340 ; WX 479 ; N uni2094 ; G 2927\nU 8341 ; WX 456 ; N uni2095 ; G 2928\nU 8342 ; WX 487 ; N uni2096 ; G 2929\nU 8343 ; WX 219 ; N uni2097 ; G 2930\nU 8344 ; WX 664 ; N uni2098 ; G 2931\nU 8345 ; WX 456 ; N uni2099 ; G 2932\nU 8346 ; WX 479 ; N uni209A ; G 2933\nU 8347 ; WX 381 ; N uni209B ; G 2934\nU 8348 ; WX 388 ; N uni209C ; G 2935\nU 8352 ; WX 929 ; N uni20A0 ; G 2936\nU 8353 ; WX 696 ; N colonmonetary ; G 2937\nU 8354 ; WX 696 ; N uni20A2 ; G 2938\nU 8355 ; WX 696 ; N franc ; G 2939\nU 8356 ; WX 696 ; N lira ; G 2940\nU 8357 ; WX 1042 ; N uni20A5 ; G 2941\nU 8358 ; WX 696 ; N uni20A6 ; G 2942\nU 8359 ; WX 1518 ; N peseta ; G 2943\nU 8360 ; WX 1205 ; N uni20A8 ; G 2944\nU 8361 ; WX 1103 ; N uni20A9 ; G 2945\nU 8362 ; WX 904 ; N uni20AA ; G 2946\nU 8363 ; WX 696 ; N dong ; G 2947\nU 8364 ; WX 696 ; N Euro ; G 2948\nU 8365 ; WX 696 ; N uni20AD ; G 2949\nU 8366 ; WX 696 ; N uni20AE ; G 2950\nU 8367 ; WX 1392 ; N uni20AF ; G 2951\nU 8368 ; WX 696 ; N uni20B0 ; G 2952\nU 8369 ; WX 696 ; N uni20B1 ; G 2953\nU 8370 ; WX 696 ; N uni20B2 ; G 2954\nU 8371 ; WX 696 ; N uni20B3 ; G 2955\nU 8372 ; WX 859 ; N uni20B4 ; G 2956\nU 8373 ; WX 696 ; N uni20B5 ; G 2957\nU 8376 ; WX 696 ; N uni20B8 ; G 2958\nU 8377 ; WX 696 ; N uni20B9 ; G 2959\nU 8378 ; WX 696 ; N uni20BA ; G 2960\nU 8381 ; WX 696 ; N uni20BD ; G 2961\nU 8400 ; WX 0 ; N uni20D0 ; G 2962\nU 8401 ; WX 0 ; N uni20D1 ; G 2963\nU 8406 ; WX 0 ; N uni20D6 ; G 2964\nU 8407 ; WX 0 ; N uni20D7 ; G 2965\nU 8411 ; WX 0 ; N uni20DB ; G 2966\nU 8412 ; WX 0 ; N uni20DC ; G 2967\nU 8417 ; WX 0 ; N uni20E1 ; G 2968\nU 8448 ; WX 1120 ; N uni2100 ; G 2969\nU 8449 ; WX 1170 ; N uni2101 ; G 2970\nU 8450 ; WX 734 ; N uni2102 ; G 2971\nU 8451 ; WX 1211 ; N uni2103 ; G 2972\nU 8452 ; WX 896 ; N uni2104 ; G 2973\nU 8453 ; WX 1091 ; N uni2105 ; G 2974\nU 8454 ; WX 1144 ; N uni2106 ; G 2975\nU 8455 ; WX 614 ; N uni2107 ; G 2976\nU 8456 ; WX 698 ; N uni2108 ; G 2977\nU 8457 ; WX 1086 ; N uni2109 ; G 2978\nU 8459 ; WX 1073 ; N uni210B ; G 2979\nU 8460 ; WX 913 ; N uni210C ; G 2980\nU 8461 ; WX 888 ; N uni210D ; G 2981\nU 8462 ; WX 712 ; N uni210E ; G 2982\nU 8463 ; WX 712 ; N uni210F ; G 2983\nU 8464 ; WX 597 ; N uni2110 ; G 2984\nU 8465 ; WX 697 ; N Ifraktur ; G 2985\nU 8466 ; WX 856 ; N uni2112 ; G 2986\nU 8467 ; WX 472 ; N uni2113 ; G 2987\nU 8468 ; WX 974 ; N uni2114 ; G 2988\nU 8469 ; WX 837 ; N uni2115 ; G 2989\nU 8470 ; WX 1203 ; N uni2116 ; G 2990\nU 8471 ; WX 1000 ; N uni2117 ; G 2991\nU 8472 ; WX 697 ; N weierstrass ; G 2992\nU 8473 ; WX 750 ; N uni2119 ; G 2993\nU 8474 ; WX 850 ; N uni211A ; G 2994\nU 8475 ; WX 938 ; N uni211B ; G 2995\nU 8476 ; WX 814 ; N Rfraktur ; G 2996\nU 8477 ; WX 801 ; N uni211D ; G 2997\nU 8478 ; WX 896 ; N prescription ; G 2998\nU 8479 ; WX 710 ; N uni211F ; G 2999\nU 8480 ; WX 1020 ; N uni2120 ; G 3000\nU 8481 ; WX 1281 ; N uni2121 ; G 3001\nU 8482 ; WX 1000 ; N trademark ; G 3002\nU 8483 ; WX 755 ; N uni2123 ; G 3003\nU 8484 ; WX 754 ; N uni2124 ; G 3004\nU 8485 ; WX 578 ; N uni2125 ; G 3005\nU 8486 ; WX 850 ; N uni2126 ; G 3006\nU 8487 ; WX 850 ; N uni2127 ; G 3007\nU 8488 ; WX 763 ; N uni2128 ; G 3008\nU 8489 ; WX 338 ; N uni2129 ; G 3009\nU 8490 ; WX 775 ; N uni212A ; G 3010\nU 8491 ; WX 774 ; N uni212B ; G 3011\nU 8492 ; WX 928 ; N uni212C ; G 3012\nU 8493 ; WX 818 ; N uni212D ; G 3013\nU 8494 ; WX 854 ; N estimated ; G 3014\nU 8495 ; WX 636 ; N uni212F ; G 3015\nU 8496 ; WX 729 ; N uni2130 ; G 3016\nU 8497 ; WX 808 ; N uni2131 ; G 3017\nU 8498 ; WX 683 ; N uni2132 ; G 3018\nU 8499 ; WX 1184 ; N uni2133 ; G 3019\nU 8500 ; WX 465 ; N uni2134 ; G 3020\nU 8501 ; WX 794 ; N aleph ; G 3021\nU 8502 ; WX 731 ; N uni2136 ; G 3022\nU 8503 ; WX 494 ; N uni2137 ; G 3023\nU 8504 ; WX 684 ; N uni2138 ; G 3024\nU 8505 ; WX 380 ; N uni2139 ; G 3025\nU 8506 ; WX 945 ; N uni213A ; G 3026\nU 8507 ; WX 1348 ; N uni213B ; G 3027\nU 8508 ; WX 790 ; N uni213C ; G 3028\nU 8509 ; WX 737 ; N uni213D ; G 3029\nU 8510 ; WX 654 ; N uni213E ; G 3030\nU 8511 ; WX 863 ; N uni213F ; G 3031\nU 8512 ; WX 840 ; N uni2140 ; G 3032\nU 8513 ; WX 775 ; N uni2141 ; G 3033\nU 8514 ; WX 557 ; N uni2142 ; G 3034\nU 8515 ; WX 637 ; N uni2143 ; G 3035\nU 8516 ; WX 760 ; N uni2144 ; G 3036\nU 8517 ; WX 830 ; N uni2145 ; G 3037\nU 8518 ; WX 716 ; N uni2146 ; G 3038\nU 8519 ; WX 678 ; N uni2147 ; G 3039\nU 8520 ; WX 343 ; N uni2148 ; G 3040\nU 8521 ; WX 343 ; N uni2149 ; G 3041\nU 8523 ; WX 872 ; N uni214B ; G 3042\nU 8526 ; WX 547 ; N uni214E ; G 3043\nU 8528 ; WX 1035 ; N uni2150 ; G 3044\nU 8529 ; WX 1035 ; N uni2151 ; G 3045\nU 8530 ; WX 1483 ; N uni2152 ; G 3046\nU 8531 ; WX 1035 ; N onethird ; G 3047\nU 8532 ; WX 1035 ; N twothirds ; G 3048\nU 8533 ; WX 1035 ; N uni2155 ; G 3049\nU 8534 ; WX 1035 ; N uni2156 ; G 3050\nU 8535 ; WX 1035 ; N uni2157 ; G 3051\nU 8536 ; WX 1035 ; N uni2158 ; G 3052\nU 8537 ; WX 1035 ; N uni2159 ; G 3053\nU 8538 ; WX 1035 ; N uni215A ; G 3054\nU 8539 ; WX 1035 ; N oneeighth ; G 3055\nU 8540 ; WX 1035 ; N threeeighths ; G 3056\nU 8541 ; WX 1035 ; N fiveeighths ; G 3057\nU 8542 ; WX 1035 ; N seveneighths ; G 3058\nU 8543 ; WX 615 ; N uni215F ; G 3059\nU 8544 ; WX 372 ; N uni2160 ; G 3060\nU 8545 ; WX 659 ; N uni2161 ; G 3061\nU 8546 ; WX 945 ; N uni2162 ; G 3062\nU 8547 ; WX 1099 ; N uni2163 ; G 3063\nU 8548 ; WX 774 ; N uni2164 ; G 3064\nU 8549 ; WX 1099 ; N uni2165 ; G 3065\nU 8550 ; WX 1386 ; N uni2166 ; G 3066\nU 8551 ; WX 1672 ; N uni2167 ; G 3067\nU 8552 ; WX 1121 ; N uni2168 ; G 3068\nU 8553 ; WX 771 ; N uni2169 ; G 3069\nU 8554 ; WX 1120 ; N uni216A ; G 3070\nU 8555 ; WX 1407 ; N uni216B ; G 3071\nU 8556 ; WX 637 ; N uni216C ; G 3072\nU 8557 ; WX 734 ; N uni216D ; G 3073\nU 8558 ; WX 830 ; N uni216E ; G 3074\nU 8559 ; WX 995 ; N uni216F ; G 3075\nU 8560 ; WX 343 ; N uni2170 ; G 3076\nU 8561 ; WX 607 ; N uni2171 ; G 3077\nU 8562 ; WX 872 ; N uni2172 ; G 3078\nU 8563 ; WX 984 ; N uni2173 ; G 3079\nU 8564 ; WX 652 ; N uni2174 ; G 3080\nU 8565 ; WX 962 ; N uni2175 ; G 3081\nU 8566 ; WX 1227 ; N uni2176 ; G 3082\nU 8567 ; WX 1491 ; N uni2177 ; G 3083\nU 8568 ; WX 969 ; N uni2178 ; G 3084\nU 8569 ; WX 645 ; N uni2179 ; G 3085\nU 8570 ; WX 969 ; N uni217A ; G 3086\nU 8571 ; WX 1233 ; N uni217B ; G 3087\nU 8572 ; WX 343 ; N uni217C ; G 3088\nU 8573 ; WX 593 ; N uni217D ; G 3089\nU 8574 ; WX 716 ; N uni217E ; G 3090\nU 8575 ; WX 1042 ; N uni217F ; G 3091\nU 8576 ; WX 1289 ; N uni2180 ; G 3092\nU 8577 ; WX 830 ; N uni2181 ; G 3093\nU 8578 ; WX 1289 ; N uni2182 ; G 3094\nU 8579 ; WX 734 ; N uni2183 ; G 3095\nU 8580 ; WX 593 ; N uni2184 ; G 3096\nU 8581 ; WX 734 ; N uni2185 ; G 3097\nU 8585 ; WX 1035 ; N uni2189 ; G 3098\nU 8592 ; WX 838 ; N arrowleft ; G 3099\nU 8593 ; WX 838 ; N arrowup ; G 3100\nU 8594 ; WX 838 ; N arrowright ; G 3101\nU 8595 ; WX 838 ; N arrowdown ; G 3102\nU 8596 ; WX 838 ; N arrowboth ; G 3103\nU 8597 ; WX 838 ; N arrowupdn ; G 3104\nU 8598 ; WX 838 ; N uni2196 ; G 3105\nU 8599 ; WX 838 ; N uni2197 ; G 3106\nU 8600 ; WX 838 ; N uni2198 ; G 3107\nU 8601 ; WX 838 ; N uni2199 ; G 3108\nU 8602 ; WX 838 ; N uni219A ; G 3109\nU 8603 ; WX 838 ; N uni219B ; G 3110\nU 8604 ; WX 838 ; N uni219C ; G 3111\nU 8605 ; WX 838 ; N uni219D ; G 3112\nU 8606 ; WX 838 ; N uni219E ; G 3113\nU 8607 ; WX 838 ; N uni219F ; G 3114\nU 8608 ; WX 838 ; N uni21A0 ; G 3115\nU 8609 ; WX 838 ; N uni21A1 ; G 3116\nU 8610 ; WX 838 ; N uni21A2 ; G 3117\nU 8611 ; WX 838 ; N uni21A3 ; G 3118\nU 8612 ; WX 838 ; N uni21A4 ; G 3119\nU 8613 ; WX 838 ; N uni21A5 ; G 3120\nU 8614 ; WX 838 ; N uni21A6 ; G 3121\nU 8615 ; WX 838 ; N uni21A7 ; G 3122\nU 8616 ; WX 838 ; N arrowupdnbse ; G 3123\nU 8617 ; WX 838 ; N uni21A9 ; G 3124\nU 8618 ; WX 838 ; N uni21AA ; G 3125\nU 8619 ; WX 838 ; N uni21AB ; G 3126\nU 8620 ; WX 838 ; N uni21AC ; G 3127\nU 8621 ; WX 838 ; N uni21AD ; G 3128\nU 8622 ; WX 838 ; N uni21AE ; G 3129\nU 8623 ; WX 838 ; N uni21AF ; G 3130\nU 8624 ; WX 838 ; N uni21B0 ; G 3131\nU 8625 ; WX 838 ; N uni21B1 ; G 3132\nU 8626 ; WX 838 ; N uni21B2 ; G 3133\nU 8627 ; WX 838 ; N uni21B3 ; G 3134\nU 8628 ; WX 838 ; N uni21B4 ; G 3135\nU 8629 ; WX 838 ; N carriagereturn ; G 3136\nU 8630 ; WX 838 ; N uni21B6 ; G 3137\nU 8631 ; WX 838 ; N uni21B7 ; G 3138\nU 8632 ; WX 838 ; N uni21B8 ; G 3139\nU 8633 ; WX 838 ; N uni21B9 ; G 3140\nU 8634 ; WX 838 ; N uni21BA ; G 3141\nU 8635 ; WX 838 ; N uni21BB ; G 3142\nU 8636 ; WX 838 ; N uni21BC ; G 3143\nU 8637 ; WX 838 ; N uni21BD ; G 3144\nU 8638 ; WX 838 ; N uni21BE ; G 3145\nU 8639 ; WX 838 ; N uni21BF ; G 3146\nU 8640 ; WX 838 ; N uni21C0 ; G 3147\nU 8641 ; WX 838 ; N uni21C1 ; G 3148\nU 8642 ; WX 838 ; N uni21C2 ; G 3149\nU 8643 ; WX 838 ; N uni21C3 ; G 3150\nU 8644 ; WX 838 ; N uni21C4 ; G 3151\nU 8645 ; WX 838 ; N uni21C5 ; G 3152\nU 8646 ; WX 838 ; N uni21C6 ; G 3153\nU 8647 ; WX 838 ; N uni21C7 ; G 3154\nU 8648 ; WX 838 ; N uni21C8 ; G 3155\nU 8649 ; WX 838 ; N uni21C9 ; G 3156\nU 8650 ; WX 838 ; N uni21CA ; G 3157\nU 8651 ; WX 838 ; N uni21CB ; G 3158\nU 8652 ; WX 838 ; N uni21CC ; G 3159\nU 8653 ; WX 838 ; N uni21CD ; G 3160\nU 8654 ; WX 838 ; N uni21CE ; G 3161\nU 8655 ; WX 838 ; N uni21CF ; G 3162\nU 8656 ; WX 838 ; N arrowdblleft ; G 3163\nU 8657 ; WX 838 ; N arrowdblup ; G 3164\nU 8658 ; WX 838 ; N arrowdblright ; G 3165\nU 8659 ; WX 838 ; N arrowdbldown ; G 3166\nU 8660 ; WX 838 ; N arrowdblboth ; G 3167\nU 8661 ; WX 838 ; N uni21D5 ; G 3168\nU 8662 ; WX 838 ; N uni21D6 ; G 3169\nU 8663 ; WX 838 ; N uni21D7 ; G 3170\nU 8664 ; WX 838 ; N uni21D8 ; G 3171\nU 8665 ; WX 838 ; N uni21D9 ; G 3172\nU 8666 ; WX 838 ; N uni21DA ; G 3173\nU 8667 ; WX 838 ; N uni21DB ; G 3174\nU 8668 ; WX 838 ; N uni21DC ; G 3175\nU 8669 ; WX 838 ; N uni21DD ; G 3176\nU 8670 ; WX 838 ; N uni21DE ; G 3177\nU 8671 ; WX 838 ; N uni21DF ; G 3178\nU 8672 ; WX 838 ; N uni21E0 ; G 3179\nU 8673 ; WX 838 ; N uni21E1 ; G 3180\nU 8674 ; WX 838 ; N uni21E2 ; G 3181\nU 8675 ; WX 838 ; N uni21E3 ; G 3182\nU 8676 ; WX 838 ; N uni21E4 ; G 3183\nU 8677 ; WX 838 ; N uni21E5 ; G 3184\nU 8678 ; WX 838 ; N uni21E6 ; G 3185\nU 8679 ; WX 838 ; N uni21E7 ; G 3186\nU 8680 ; WX 838 ; N uni21E8 ; G 3187\nU 8681 ; WX 838 ; N uni21E9 ; G 3188\nU 8682 ; WX 838 ; N uni21EA ; G 3189\nU 8683 ; WX 838 ; N uni21EB ; G 3190\nU 8684 ; WX 838 ; N uni21EC ; G 3191\nU 8685 ; WX 838 ; N uni21ED ; G 3192\nU 8686 ; WX 838 ; N uni21EE ; G 3193\nU 8687 ; WX 838 ; N uni21EF ; G 3194\nU 8688 ; WX 838 ; N uni21F0 ; G 3195\nU 8689 ; WX 838 ; N uni21F1 ; G 3196\nU 8690 ; WX 838 ; N uni21F2 ; G 3197\nU 8691 ; WX 838 ; N uni21F3 ; G 3198\nU 8692 ; WX 838 ; N uni21F4 ; G 3199\nU 8693 ; WX 838 ; N uni21F5 ; G 3200\nU 8694 ; WX 838 ; N uni21F6 ; G 3201\nU 8695 ; WX 838 ; N uni21F7 ; G 3202\nU 8696 ; WX 838 ; N uni21F8 ; G 3203\nU 8697 ; WX 838 ; N uni21F9 ; G 3204\nU 8698 ; WX 838 ; N uni21FA ; G 3205\nU 8699 ; WX 838 ; N uni21FB ; G 3206\nU 8700 ; WX 838 ; N uni21FC ; G 3207\nU 8701 ; WX 838 ; N uni21FD ; G 3208\nU 8702 ; WX 838 ; N uni21FE ; G 3209\nU 8703 ; WX 838 ; N uni21FF ; G 3210\nU 8704 ; WX 774 ; N universal ; G 3211\nU 8705 ; WX 696 ; N uni2201 ; G 3212\nU 8706 ; WX 544 ; N partialdiff ; G 3213\nU 8707 ; WX 683 ; N existential ; G 3214\nU 8708 ; WX 683 ; N uni2204 ; G 3215\nU 8709 ; WX 856 ; N emptyset ; G 3216\nU 8710 ; WX 697 ; N increment ; G 3217\nU 8711 ; WX 697 ; N gradient ; G 3218\nU 8712 ; WX 896 ; N element ; G 3219\nU 8713 ; WX 896 ; N notelement ; G 3220\nU 8714 ; WX 750 ; N uni220A ; G 3221\nU 8715 ; WX 896 ; N suchthat ; G 3222\nU 8716 ; WX 896 ; N uni220C ; G 3223\nU 8717 ; WX 750 ; N uni220D ; G 3224\nU 8718 ; WX 636 ; N uni220E ; G 3225\nU 8719 ; WX 787 ; N product ; G 3226\nU 8720 ; WX 787 ; N uni2210 ; G 3227\nU 8721 ; WX 718 ; N summation ; G 3228\nU 8722 ; WX 838 ; N minus ; G 3229\nU 8723 ; WX 838 ; N uni2213 ; G 3230\nU 8724 ; WX 696 ; N uni2214 ; G 3231\nU 8725 ; WX 365 ; N uni2215 ; G 3232\nU 8726 ; WX 696 ; N uni2216 ; G 3233\nU 8727 ; WX 838 ; N asteriskmath ; G 3234\nU 8728 ; WX 626 ; N uni2218 ; G 3235\nU 8729 ; WX 380 ; N uni2219 ; G 3236\nU 8730 ; WX 667 ; N radical ; G 3237\nU 8731 ; WX 667 ; N uni221B ; G 3238\nU 8732 ; WX 667 ; N uni221C ; G 3239\nU 8733 ; WX 712 ; N proportional ; G 3240\nU 8734 ; WX 833 ; N infinity ; G 3241\nU 8735 ; WX 838 ; N orthogonal ; G 3242\nU 8736 ; WX 896 ; N angle ; G 3243\nU 8737 ; WX 896 ; N uni2221 ; G 3244\nU 8738 ; WX 838 ; N uni2222 ; G 3245\nU 8739 ; WX 500 ; N uni2223 ; G 3246\nU 8740 ; WX 500 ; N uni2224 ; G 3247\nU 8741 ; WX 500 ; N uni2225 ; G 3248\nU 8742 ; WX 500 ; N uni2226 ; G 3249\nU 8743 ; WX 812 ; N logicaland ; G 3250\nU 8744 ; WX 812 ; N logicalor ; G 3251\nU 8745 ; WX 812 ; N intersection ; G 3252\nU 8746 ; WX 812 ; N union ; G 3253\nU 8747 ; WX 610 ; N integral ; G 3254\nU 8748 ; WX 929 ; N uni222C ; G 3255\nU 8749 ; WX 1295 ; N uni222D ; G 3256\nU 8750 ; WX 563 ; N uni222E ; G 3257\nU 8751 ; WX 977 ; N uni222F ; G 3258\nU 8752 ; WX 1313 ; N uni2230 ; G 3259\nU 8753 ; WX 563 ; N uni2231 ; G 3260\nU 8754 ; WX 563 ; N uni2232 ; G 3261\nU 8755 ; WX 563 ; N uni2233 ; G 3262\nU 8756 ; WX 696 ; N therefore ; G 3263\nU 8757 ; WX 696 ; N uni2235 ; G 3264\nU 8758 ; WX 294 ; N uni2236 ; G 3265\nU 8759 ; WX 696 ; N uni2237 ; G 3266\nU 8760 ; WX 838 ; N uni2238 ; G 3267\nU 8761 ; WX 838 ; N uni2239 ; G 3268\nU 8762 ; WX 838 ; N uni223A ; G 3269\nU 8763 ; WX 838 ; N uni223B ; G 3270\nU 8764 ; WX 838 ; N similar ; G 3271\nU 8765 ; WX 838 ; N uni223D ; G 3272\nU 8766 ; WX 838 ; N uni223E ; G 3273\nU 8767 ; WX 838 ; N uni223F ; G 3274\nU 8768 ; WX 375 ; N uni2240 ; G 3275\nU 8769 ; WX 838 ; N uni2241 ; G 3276\nU 8770 ; WX 838 ; N uni2242 ; G 3277\nU 8771 ; WX 838 ; N uni2243 ; G 3278\nU 8772 ; WX 838 ; N uni2244 ; G 3279\nU 8773 ; WX 838 ; N congruent ; G 3280\nU 8774 ; WX 838 ; N uni2246 ; G 3281\nU 8775 ; WX 838 ; N uni2247 ; G 3282\nU 8776 ; WX 838 ; N approxequal ; G 3283\nU 8777 ; WX 838 ; N uni2249 ; G 3284\nU 8778 ; WX 838 ; N uni224A ; G 3285\nU 8779 ; WX 838 ; N uni224B ; G 3286\nU 8780 ; WX 838 ; N uni224C ; G 3287\nU 8781 ; WX 838 ; N uni224D ; G 3288\nU 8782 ; WX 838 ; N uni224E ; G 3289\nU 8783 ; WX 838 ; N uni224F ; G 3290\nU 8784 ; WX 838 ; N uni2250 ; G 3291\nU 8785 ; WX 838 ; N uni2251 ; G 3292\nU 8786 ; WX 838 ; N uni2252 ; G 3293\nU 8787 ; WX 838 ; N uni2253 ; G 3294\nU 8788 ; WX 1063 ; N uni2254 ; G 3295\nU 8789 ; WX 1063 ; N uni2255 ; G 3296\nU 8790 ; WX 838 ; N uni2256 ; G 3297\nU 8791 ; WX 838 ; N uni2257 ; G 3298\nU 8792 ; WX 838 ; N uni2258 ; G 3299\nU 8793 ; WX 838 ; N uni2259 ; G 3300\nU 8794 ; WX 838 ; N uni225A ; G 3301\nU 8795 ; WX 838 ; N uni225B ; G 3302\nU 8796 ; WX 838 ; N uni225C ; G 3303\nU 8797 ; WX 838 ; N uni225D ; G 3304\nU 8798 ; WX 838 ; N uni225E ; G 3305\nU 8799 ; WX 838 ; N uni225F ; G 3306\nU 8800 ; WX 838 ; N notequal ; G 3307\nU 8801 ; WX 838 ; N equivalence ; G 3308\nU 8802 ; WX 838 ; N uni2262 ; G 3309\nU 8803 ; WX 838 ; N uni2263 ; G 3310\nU 8804 ; WX 838 ; N lessequal ; G 3311\nU 8805 ; WX 838 ; N greaterequal ; G 3312\nU 8806 ; WX 838 ; N uni2266 ; G 3313\nU 8807 ; WX 838 ; N uni2267 ; G 3314\nU 8808 ; WX 841 ; N uni2268 ; G 3315\nU 8809 ; WX 841 ; N uni2269 ; G 3316\nU 8810 ; WX 1047 ; N uni226A ; G 3317\nU 8811 ; WX 1047 ; N uni226B ; G 3318\nU 8812 ; WX 500 ; N uni226C ; G 3319\nU 8813 ; WX 838 ; N uni226D ; G 3320\nU 8814 ; WX 838 ; N uni226E ; G 3321\nU 8815 ; WX 838 ; N uni226F ; G 3322\nU 8816 ; WX 838 ; N uni2270 ; G 3323\nU 8817 ; WX 838 ; N uni2271 ; G 3324\nU 8818 ; WX 838 ; N uni2272 ; G 3325\nU 8819 ; WX 838 ; N uni2273 ; G 3326\nU 8820 ; WX 838 ; N uni2274 ; G 3327\nU 8821 ; WX 838 ; N uni2275 ; G 3328\nU 8822 ; WX 838 ; N uni2276 ; G 3329\nU 8823 ; WX 838 ; N uni2277 ; G 3330\nU 8824 ; WX 838 ; N uni2278 ; G 3331\nU 8825 ; WX 838 ; N uni2279 ; G 3332\nU 8826 ; WX 838 ; N uni227A ; G 3333\nU 8827 ; WX 838 ; N uni227B ; G 3334\nU 8828 ; WX 838 ; N uni227C ; G 3335\nU 8829 ; WX 838 ; N uni227D ; G 3336\nU 8830 ; WX 838 ; N uni227E ; G 3337\nU 8831 ; WX 838 ; N uni227F ; G 3338\nU 8832 ; WX 838 ; N uni2280 ; G 3339\nU 8833 ; WX 838 ; N uni2281 ; G 3340\nU 8834 ; WX 838 ; N propersubset ; G 3341\nU 8835 ; WX 838 ; N propersuperset ; G 3342\nU 8836 ; WX 838 ; N notsubset ; G 3343\nU 8837 ; WX 838 ; N uni2285 ; G 3344\nU 8838 ; WX 838 ; N reflexsubset ; G 3345\nU 8839 ; WX 838 ; N reflexsuperset ; G 3346\nU 8840 ; WX 838 ; N uni2288 ; G 3347\nU 8841 ; WX 838 ; N uni2289 ; G 3348\nU 8842 ; WX 838 ; N uni228A ; G 3349\nU 8843 ; WX 838 ; N uni228B ; G 3350\nU 8844 ; WX 812 ; N uni228C ; G 3351\nU 8845 ; WX 812 ; N uni228D ; G 3352\nU 8846 ; WX 812 ; N uni228E ; G 3353\nU 8847 ; WX 838 ; N uni228F ; G 3354\nU 8848 ; WX 838 ; N uni2290 ; G 3355\nU 8849 ; WX 838 ; N uni2291 ; G 3356\nU 8850 ; WX 838 ; N uni2292 ; G 3357\nU 8851 ; WX 796 ; N uni2293 ; G 3358\nU 8852 ; WX 796 ; N uni2294 ; G 3359\nU 8853 ; WX 838 ; N circleplus ; G 3360\nU 8854 ; WX 838 ; N uni2296 ; G 3361\nU 8855 ; WX 838 ; N circlemultiply ; G 3362\nU 8856 ; WX 838 ; N uni2298 ; G 3363\nU 8857 ; WX 838 ; N uni2299 ; G 3364\nU 8858 ; WX 838 ; N uni229A ; G 3365\nU 8859 ; WX 838 ; N uni229B ; G 3366\nU 8860 ; WX 838 ; N uni229C ; G 3367\nU 8861 ; WX 838 ; N uni229D ; G 3368\nU 8862 ; WX 838 ; N uni229E ; G 3369\nU 8863 ; WX 838 ; N uni229F ; G 3370\nU 8864 ; WX 838 ; N uni22A0 ; G 3371\nU 8865 ; WX 838 ; N uni22A1 ; G 3372\nU 8866 ; WX 914 ; N uni22A2 ; G 3373\nU 8867 ; WX 914 ; N uni22A3 ; G 3374\nU 8868 ; WX 914 ; N uni22A4 ; G 3375\nU 8869 ; WX 914 ; N perpendicular ; G 3376\nU 8870 ; WX 542 ; N uni22A6 ; G 3377\nU 8871 ; WX 542 ; N uni22A7 ; G 3378\nU 8872 ; WX 914 ; N uni22A8 ; G 3379\nU 8873 ; WX 914 ; N uni22A9 ; G 3380\nU 8874 ; WX 914 ; N uni22AA ; G 3381\nU 8875 ; WX 914 ; N uni22AB ; G 3382\nU 8876 ; WX 914 ; N uni22AC ; G 3383\nU 8877 ; WX 914 ; N uni22AD ; G 3384\nU 8878 ; WX 914 ; N uni22AE ; G 3385\nU 8879 ; WX 914 ; N uni22AF ; G 3386\nU 8880 ; WX 838 ; N uni22B0 ; G 3387\nU 8881 ; WX 838 ; N uni22B1 ; G 3388\nU 8882 ; WX 838 ; N uni22B2 ; G 3389\nU 8883 ; WX 838 ; N uni22B3 ; G 3390\nU 8884 ; WX 838 ; N uni22B4 ; G 3391\nU 8885 ; WX 838 ; N uni22B5 ; G 3392\nU 8886 ; WX 1000 ; N uni22B6 ; G 3393\nU 8887 ; WX 1000 ; N uni22B7 ; G 3394\nU 8888 ; WX 838 ; N uni22B8 ; G 3395\nU 8889 ; WX 838 ; N uni22B9 ; G 3396\nU 8890 ; WX 542 ; N uni22BA ; G 3397\nU 8891 ; WX 812 ; N uni22BB ; G 3398\nU 8892 ; WX 812 ; N uni22BC ; G 3399\nU 8893 ; WX 812 ; N uni22BD ; G 3400\nU 8894 ; WX 838 ; N uni22BE ; G 3401\nU 8895 ; WX 838 ; N uni22BF ; G 3402\nU 8896 ; WX 843 ; N uni22C0 ; G 3403\nU 8897 ; WX 843 ; N uni22C1 ; G 3404\nU 8898 ; WX 843 ; N uni22C2 ; G 3405\nU 8899 ; WX 843 ; N uni22C3 ; G 3406\nU 8900 ; WX 626 ; N uni22C4 ; G 3407\nU 8901 ; WX 380 ; N dotmath ; G 3408\nU 8902 ; WX 626 ; N uni22C6 ; G 3409\nU 8903 ; WX 838 ; N uni22C7 ; G 3410\nU 8904 ; WX 1000 ; N uni22C8 ; G 3411\nU 8905 ; WX 1000 ; N uni22C9 ; G 3412\nU 8906 ; WX 1000 ; N uni22CA ; G 3413\nU 8907 ; WX 1000 ; N uni22CB ; G 3414\nU 8908 ; WX 1000 ; N uni22CC ; G 3415\nU 8909 ; WX 838 ; N uni22CD ; G 3416\nU 8910 ; WX 812 ; N uni22CE ; G 3417\nU 8911 ; WX 812 ; N uni22CF ; G 3418\nU 8912 ; WX 838 ; N uni22D0 ; G 3419\nU 8913 ; WX 838 ; N uni22D1 ; G 3420\nU 8914 ; WX 838 ; N uni22D2 ; G 3421\nU 8915 ; WX 838 ; N uni22D3 ; G 3422\nU 8916 ; WX 838 ; N uni22D4 ; G 3423\nU 8917 ; WX 838 ; N uni22D5 ; G 3424\nU 8918 ; WX 838 ; N uni22D6 ; G 3425\nU 8919 ; WX 838 ; N uni22D7 ; G 3426\nU 8920 ; WX 1422 ; N uni22D8 ; G 3427\nU 8921 ; WX 1422 ; N uni22D9 ; G 3428\nU 8922 ; WX 838 ; N uni22DA ; G 3429\nU 8923 ; WX 838 ; N uni22DB ; G 3430\nU 8924 ; WX 838 ; N uni22DC ; G 3431\nU 8925 ; WX 838 ; N uni22DD ; G 3432\nU 8926 ; WX 838 ; N uni22DE ; G 3433\nU 8927 ; WX 838 ; N uni22DF ; G 3434\nU 8928 ; WX 838 ; N uni22E0 ; G 3435\nU 8929 ; WX 838 ; N uni22E1 ; G 3436\nU 8930 ; WX 838 ; N uni22E2 ; G 3437\nU 8931 ; WX 838 ; N uni22E3 ; G 3438\nU 8932 ; WX 838 ; N uni22E4 ; G 3439\nU 8933 ; WX 838 ; N uni22E5 ; G 3440\nU 8934 ; WX 838 ; N uni22E6 ; G 3441\nU 8935 ; WX 838 ; N uni22E7 ; G 3442\nU 8936 ; WX 838 ; N uni22E8 ; G 3443\nU 8937 ; WX 838 ; N uni22E9 ; G 3444\nU 8938 ; WX 838 ; N uni22EA ; G 3445\nU 8939 ; WX 838 ; N uni22EB ; G 3446\nU 8940 ; WX 838 ; N uni22EC ; G 3447\nU 8941 ; WX 838 ; N uni22ED ; G 3448\nU 8942 ; WX 1000 ; N uni22EE ; G 3449\nU 8943 ; WX 1000 ; N uni22EF ; G 3450\nU 8944 ; WX 1000 ; N uni22F0 ; G 3451\nU 8945 ; WX 1000 ; N uni22F1 ; G 3452\nU 8946 ; WX 1158 ; N uni22F2 ; G 3453\nU 8947 ; WX 896 ; N uni22F3 ; G 3454\nU 8948 ; WX 750 ; N uni22F4 ; G 3455\nU 8949 ; WX 896 ; N uni22F5 ; G 3456\nU 8950 ; WX 896 ; N uni22F6 ; G 3457\nU 8951 ; WX 750 ; N uni22F7 ; G 3458\nU 8952 ; WX 896 ; N uni22F8 ; G 3459\nU 8953 ; WX 896 ; N uni22F9 ; G 3460\nU 8954 ; WX 1158 ; N uni22FA ; G 3461\nU 8955 ; WX 896 ; N uni22FB ; G 3462\nU 8956 ; WX 750 ; N uni22FC ; G 3463\nU 8957 ; WX 896 ; N uni22FD ; G 3464\nU 8958 ; WX 750 ; N uni22FE ; G 3465\nU 8959 ; WX 896 ; N uni22FF ; G 3466\nU 8960 ; WX 602 ; N uni2300 ; G 3467\nU 8961 ; WX 602 ; N uni2301 ; G 3468\nU 8962 ; WX 716 ; N house ; G 3469\nU 8963 ; WX 838 ; N uni2303 ; G 3470\nU 8964 ; WX 838 ; N uni2304 ; G 3471\nU 8965 ; WX 838 ; N uni2305 ; G 3472\nU 8966 ; WX 838 ; N uni2306 ; G 3473\nU 8967 ; WX 488 ; N uni2307 ; G 3474\nU 8968 ; WX 457 ; N uni2308 ; G 3475\nU 8969 ; WX 457 ; N uni2309 ; G 3476\nU 8970 ; WX 457 ; N uni230A ; G 3477\nU 8971 ; WX 457 ; N uni230B ; G 3478\nU 8972 ; WX 809 ; N uni230C ; G 3479\nU 8973 ; WX 809 ; N uni230D ; G 3480\nU 8974 ; WX 809 ; N uni230E ; G 3481\nU 8975 ; WX 809 ; N uni230F ; G 3482\nU 8976 ; WX 838 ; N revlogicalnot ; G 3483\nU 8977 ; WX 539 ; N uni2311 ; G 3484\nU 8984 ; WX 928 ; N uni2318 ; G 3485\nU 8985 ; WX 838 ; N uni2319 ; G 3486\nU 8988 ; WX 469 ; N uni231C ; G 3487\nU 8989 ; WX 469 ; N uni231D ; G 3488\nU 8990 ; WX 469 ; N uni231E ; G 3489\nU 8991 ; WX 469 ; N uni231F ; G 3490\nU 8992 ; WX 610 ; N integraltp ; G 3491\nU 8993 ; WX 610 ; N integralbt ; G 3492\nU 8996 ; WX 1152 ; N uni2324 ; G 3493\nU 8997 ; WX 1152 ; N uni2325 ; G 3494\nU 8998 ; WX 1414 ; N uni2326 ; G 3495\nU 8999 ; WX 1152 ; N uni2327 ; G 3496\nU 9000 ; WX 1443 ; N uni2328 ; G 3497\nU 9003 ; WX 1414 ; N uni232B ; G 3498\nU 9004 ; WX 873 ; N uni232C ; G 3499\nU 9075 ; WX 390 ; N uni2373 ; G 3500\nU 9076 ; WX 716 ; N uni2374 ; G 3501\nU 9077 ; WX 869 ; N uni2375 ; G 3502\nU 9082 ; WX 687 ; N uni237A ; G 3503\nU 9085 ; WX 863 ; N uni237D ; G 3504\nU 9095 ; WX 1152 ; N uni2387 ; G 3505\nU 9108 ; WX 873 ; N uni2394 ; G 3506\nU 9115 ; WX 500 ; N uni239B ; G 3507\nU 9116 ; WX 500 ; N uni239C ; G 3508\nU 9117 ; WX 500 ; N uni239D ; G 3509\nU 9118 ; WX 500 ; N uni239E ; G 3510\nU 9119 ; WX 500 ; N uni239F ; G 3511\nU 9120 ; WX 500 ; N uni23A0 ; G 3512\nU 9121 ; WX 500 ; N uni23A1 ; G 3513\nU 9122 ; WX 500 ; N uni23A2 ; G 3514\nU 9123 ; WX 500 ; N uni23A3 ; G 3515\nU 9124 ; WX 500 ; N uni23A4 ; G 3516\nU 9125 ; WX 500 ; N uni23A5 ; G 3517\nU 9126 ; WX 500 ; N uni23A6 ; G 3518\nU 9127 ; WX 750 ; N uni23A7 ; G 3519\nU 9128 ; WX 750 ; N uni23A8 ; G 3520\nU 9129 ; WX 750 ; N uni23A9 ; G 3521\nU 9130 ; WX 750 ; N uni23AA ; G 3522\nU 9131 ; WX 750 ; N uni23AB ; G 3523\nU 9132 ; WX 750 ; N uni23AC ; G 3524\nU 9133 ; WX 750 ; N uni23AD ; G 3525\nU 9134 ; WX 610 ; N uni23AE ; G 3526\nU 9166 ; WX 838 ; N uni23CE ; G 3527\nU 9167 ; WX 945 ; N uni23CF ; G 3528\nU 9187 ; WX 873 ; N uni23E3 ; G 3529\nU 9189 ; WX 769 ; N uni23E5 ; G 3530\nU 9192 ; WX 696 ; N uni23E8 ; G 3531\nU 9250 ; WX 716 ; N uni2422 ; G 3532\nU 9251 ; WX 716 ; N uni2423 ; G 3533\nU 9312 ; WX 847 ; N uni2460 ; G 3534\nU 9313 ; WX 847 ; N uni2461 ; G 3535\nU 9314 ; WX 847 ; N uni2462 ; G 3536\nU 9315 ; WX 847 ; N uni2463 ; G 3537\nU 9316 ; WX 847 ; N uni2464 ; G 3538\nU 9317 ; WX 847 ; N uni2465 ; G 3539\nU 9318 ; WX 847 ; N uni2466 ; G 3540\nU 9319 ; WX 847 ; N uni2467 ; G 3541\nU 9320 ; WX 847 ; N uni2468 ; G 3542\nU 9321 ; WX 847 ; N uni2469 ; G 3543\nU 9472 ; WX 602 ; N SF100000 ; G 3544\nU 9473 ; WX 602 ; N uni2501 ; G 3545\nU 9474 ; WX 602 ; N SF110000 ; G 3546\nU 9475 ; WX 602 ; N uni2503 ; G 3547\nU 9476 ; WX 602 ; N uni2504 ; G 3548\nU 9477 ; WX 602 ; N uni2505 ; G 3549\nU 9478 ; WX 602 ; N uni2506 ; G 3550\nU 9479 ; WX 602 ; N uni2507 ; G 3551\nU 9480 ; WX 602 ; N uni2508 ; G 3552\nU 9481 ; WX 602 ; N uni2509 ; G 3553\nU 9482 ; WX 602 ; N uni250A ; G 3554\nU 9483 ; WX 602 ; N uni250B ; G 3555\nU 9484 ; WX 602 ; N SF010000 ; G 3556\nU 9485 ; WX 602 ; N uni250D ; G 3557\nU 9486 ; WX 602 ; N uni250E ; G 3558\nU 9487 ; WX 602 ; N uni250F ; G 3559\nU 9488 ; WX 602 ; N SF030000 ; G 3560\nU 9489 ; WX 602 ; N uni2511 ; G 3561\nU 9490 ; WX 602 ; N uni2512 ; G 3562\nU 9491 ; WX 602 ; N uni2513 ; G 3563\nU 9492 ; WX 602 ; N SF020000 ; G 3564\nU 9493 ; WX 602 ; N uni2515 ; G 3565\nU 9494 ; WX 602 ; N uni2516 ; G 3566\nU 9495 ; WX 602 ; N uni2517 ; G 3567\nU 9496 ; WX 602 ; N SF040000 ; G 3568\nU 9497 ; WX 602 ; N uni2519 ; G 3569\nU 9498 ; WX 602 ; N uni251A ; G 3570\nU 9499 ; WX 602 ; N uni251B ; G 3571\nU 9500 ; WX 602 ; N SF080000 ; G 3572\nU 9501 ; WX 602 ; N uni251D ; G 3573\nU 9502 ; WX 602 ; N uni251E ; G 3574\nU 9503 ; WX 602 ; N uni251F ; G 3575\nU 9504 ; WX 602 ; N uni2520 ; G 3576\nU 9505 ; WX 602 ; N uni2521 ; G 3577\nU 9506 ; WX 602 ; N uni2522 ; G 3578\nU 9507 ; WX 602 ; N uni2523 ; G 3579\nU 9508 ; WX 602 ; N SF090000 ; G 3580\nU 9509 ; WX 602 ; N uni2525 ; G 3581\nU 9510 ; WX 602 ; N uni2526 ; G 3582\nU 9511 ; WX 602 ; N uni2527 ; G 3583\nU 9512 ; WX 602 ; N uni2528 ; G 3584\nU 9513 ; WX 602 ; N uni2529 ; G 3585\nU 9514 ; WX 602 ; N uni252A ; G 3586\nU 9515 ; WX 602 ; N uni252B ; G 3587\nU 9516 ; WX 602 ; N SF060000 ; G 3588\nU 9517 ; WX 602 ; N uni252D ; G 3589\nU 9518 ; WX 602 ; N uni252E ; G 3590\nU 9519 ; WX 602 ; N uni252F ; G 3591\nU 9520 ; WX 602 ; N uni2530 ; G 3592\nU 9521 ; WX 602 ; N uni2531 ; G 3593\nU 9522 ; WX 602 ; N uni2532 ; G 3594\nU 9523 ; WX 602 ; N uni2533 ; G 3595\nU 9524 ; WX 602 ; N SF070000 ; G 3596\nU 9525 ; WX 602 ; N uni2535 ; G 3597\nU 9526 ; WX 602 ; N uni2536 ; G 3598\nU 9527 ; WX 602 ; N uni2537 ; G 3599\nU 9528 ; WX 602 ; N uni2538 ; G 3600\nU 9529 ; WX 602 ; N uni2539 ; G 3601\nU 9530 ; WX 602 ; N uni253A ; G 3602\nU 9531 ; WX 602 ; N uni253B ; G 3603\nU 9532 ; WX 602 ; N SF050000 ; G 3604\nU 9533 ; WX 602 ; N uni253D ; G 3605\nU 9534 ; WX 602 ; N uni253E ; G 3606\nU 9535 ; WX 602 ; N uni253F ; G 3607\nU 9536 ; WX 602 ; N uni2540 ; G 3608\nU 9537 ; WX 602 ; N uni2541 ; G 3609\nU 9538 ; WX 602 ; N uni2542 ; G 3610\nU 9539 ; WX 602 ; N uni2543 ; G 3611\nU 9540 ; WX 602 ; N uni2544 ; G 3612\nU 9541 ; WX 602 ; N uni2545 ; G 3613\nU 9542 ; WX 602 ; N uni2546 ; G 3614\nU 9543 ; WX 602 ; N uni2547 ; G 3615\nU 9544 ; WX 602 ; N uni2548 ; G 3616\nU 9545 ; WX 602 ; N uni2549 ; G 3617\nU 9546 ; WX 602 ; N uni254A ; G 3618\nU 9547 ; WX 602 ; N uni254B ; G 3619\nU 9548 ; WX 602 ; N uni254C ; G 3620\nU 9549 ; WX 602 ; N uni254D ; G 3621\nU 9550 ; WX 602 ; N uni254E ; G 3622\nU 9551 ; WX 602 ; N uni254F ; G 3623\nU 9552 ; WX 602 ; N SF430000 ; G 3624\nU 9553 ; WX 602 ; N SF240000 ; G 3625\nU 9554 ; WX 602 ; N SF510000 ; G 3626\nU 9555 ; WX 602 ; N SF520000 ; G 3627\nU 9556 ; WX 602 ; N SF390000 ; G 3628\nU 9557 ; WX 602 ; N SF220000 ; G 3629\nU 9558 ; WX 602 ; N SF210000 ; G 3630\nU 9559 ; WX 602 ; N SF250000 ; G 3631\nU 9560 ; WX 602 ; N SF500000 ; G 3632\nU 9561 ; WX 602 ; N SF490000 ; G 3633\nU 9562 ; WX 602 ; N SF380000 ; G 3634\nU 9563 ; WX 602 ; N SF280000 ; G 3635\nU 9564 ; WX 602 ; N SF270000 ; G 3636\nU 9565 ; WX 602 ; N SF260000 ; G 3637\nU 9566 ; WX 602 ; N SF360000 ; G 3638\nU 9567 ; WX 602 ; N SF370000 ; G 3639\nU 9568 ; WX 602 ; N SF420000 ; G 3640\nU 9569 ; WX 602 ; N SF190000 ; G 3641\nU 9570 ; WX 602 ; N SF200000 ; G 3642\nU 9571 ; WX 602 ; N SF230000 ; G 3643\nU 9572 ; WX 602 ; N SF470000 ; G 3644\nU 9573 ; WX 602 ; N SF480000 ; G 3645\nU 9574 ; WX 602 ; N SF410000 ; G 3646\nU 9575 ; WX 602 ; N SF450000 ; G 3647\nU 9576 ; WX 602 ; N SF460000 ; G 3648\nU 9577 ; WX 602 ; N SF400000 ; G 3649\nU 9578 ; WX 602 ; N SF540000 ; G 3650\nU 9579 ; WX 602 ; N SF530000 ; G 3651\nU 9580 ; WX 602 ; N SF440000 ; G 3652\nU 9581 ; WX 602 ; N uni256D ; G 3653\nU 9582 ; WX 602 ; N uni256E ; G 3654\nU 9583 ; WX 602 ; N uni256F ; G 3655\nU 9584 ; WX 602 ; N uni2570 ; G 3656\nU 9585 ; WX 602 ; N uni2571 ; G 3657\nU 9586 ; WX 602 ; N uni2572 ; G 3658\nU 9587 ; WX 602 ; N uni2573 ; G 3659\nU 9588 ; WX 602 ; N uni2574 ; G 3660\nU 9589 ; WX 602 ; N uni2575 ; G 3661\nU 9590 ; WX 602 ; N uni2576 ; G 3662\nU 9591 ; WX 602 ; N uni2577 ; G 3663\nU 9592 ; WX 602 ; N uni2578 ; G 3664\nU 9593 ; WX 602 ; N uni2579 ; G 3665\nU 9594 ; WX 602 ; N uni257A ; G 3666\nU 9595 ; WX 602 ; N uni257B ; G 3667\nU 9596 ; WX 602 ; N uni257C ; G 3668\nU 9597 ; WX 602 ; N uni257D ; G 3669\nU 9598 ; WX 602 ; N uni257E ; G 3670\nU 9599 ; WX 602 ; N uni257F ; G 3671\nU 9600 ; WX 769 ; N upblock ; G 3672\nU 9601 ; WX 769 ; N uni2581 ; G 3673\nU 9602 ; WX 769 ; N uni2582 ; G 3674\nU 9603 ; WX 769 ; N uni2583 ; G 3675\nU 9604 ; WX 769 ; N dnblock ; G 3676\nU 9605 ; WX 769 ; N uni2585 ; G 3677\nU 9606 ; WX 769 ; N uni2586 ; G 3678\nU 9607 ; WX 769 ; N uni2587 ; G 3679\nU 9608 ; WX 769 ; N block ; G 3680\nU 9609 ; WX 769 ; N uni2589 ; G 3681\nU 9610 ; WX 769 ; N uni258A ; G 3682\nU 9611 ; WX 769 ; N uni258B ; G 3683\nU 9612 ; WX 769 ; N lfblock ; G 3684\nU 9613 ; WX 769 ; N uni258D ; G 3685\nU 9614 ; WX 769 ; N uni258E ; G 3686\nU 9615 ; WX 769 ; N uni258F ; G 3687\nU 9616 ; WX 769 ; N rtblock ; G 3688\nU 9617 ; WX 769 ; N ltshade ; G 3689\nU 9618 ; WX 769 ; N shade ; G 3690\nU 9619 ; WX 769 ; N dkshade ; G 3691\nU 9620 ; WX 769 ; N uni2594 ; G 3692\nU 9621 ; WX 769 ; N uni2595 ; G 3693\nU 9622 ; WX 769 ; N uni2596 ; G 3694\nU 9623 ; WX 769 ; N uni2597 ; G 3695\nU 9624 ; WX 769 ; N uni2598 ; G 3696\nU 9625 ; WX 769 ; N uni2599 ; G 3697\nU 9626 ; WX 769 ; N uni259A ; G 3698\nU 9627 ; WX 769 ; N uni259B ; G 3699\nU 9628 ; WX 769 ; N uni259C ; G 3700\nU 9629 ; WX 769 ; N uni259D ; G 3701\nU 9630 ; WX 769 ; N uni259E ; G 3702\nU 9631 ; WX 769 ; N uni259F ; G 3703\nU 9632 ; WX 945 ; N filledbox ; G 3704\nU 9633 ; WX 945 ; N H22073 ; G 3705\nU 9634 ; WX 945 ; N uni25A2 ; G 3706\nU 9635 ; WX 945 ; N uni25A3 ; G 3707\nU 9636 ; WX 945 ; N uni25A4 ; G 3708\nU 9637 ; WX 945 ; N uni25A5 ; G 3709\nU 9638 ; WX 945 ; N uni25A6 ; G 3710\nU 9639 ; WX 945 ; N uni25A7 ; G 3711\nU 9640 ; WX 945 ; N uni25A8 ; G 3712\nU 9641 ; WX 945 ; N uni25A9 ; G 3713\nU 9642 ; WX 678 ; N H18543 ; G 3714\nU 9643 ; WX 678 ; N H18551 ; G 3715\nU 9644 ; WX 945 ; N filledrect ; G 3716\nU 9645 ; WX 945 ; N uni25AD ; G 3717\nU 9646 ; WX 550 ; N uni25AE ; G 3718\nU 9647 ; WX 550 ; N uni25AF ; G 3719\nU 9648 ; WX 769 ; N uni25B0 ; G 3720\nU 9649 ; WX 769 ; N uni25B1 ; G 3721\nU 9650 ; WX 769 ; N triagup ; G 3722\nU 9651 ; WX 769 ; N uni25B3 ; G 3723\nU 9652 ; WX 502 ; N uni25B4 ; G 3724\nU 9653 ; WX 502 ; N uni25B5 ; G 3725\nU 9654 ; WX 769 ; N uni25B6 ; G 3726\nU 9655 ; WX 769 ; N uni25B7 ; G 3727\nU 9656 ; WX 502 ; N uni25B8 ; G 3728\nU 9657 ; WX 502 ; N uni25B9 ; G 3729\nU 9658 ; WX 769 ; N triagrt ; G 3730\nU 9659 ; WX 769 ; N uni25BB ; G 3731\nU 9660 ; WX 769 ; N triagdn ; G 3732\nU 9661 ; WX 769 ; N uni25BD ; G 3733\nU 9662 ; WX 502 ; N uni25BE ; G 3734\nU 9663 ; WX 502 ; N uni25BF ; G 3735\nU 9664 ; WX 769 ; N uni25C0 ; G 3736\nU 9665 ; WX 769 ; N uni25C1 ; G 3737\nU 9666 ; WX 502 ; N uni25C2 ; G 3738\nU 9667 ; WX 502 ; N uni25C3 ; G 3739\nU 9668 ; WX 769 ; N triaglf ; G 3740\nU 9669 ; WX 769 ; N uni25C5 ; G 3741\nU 9670 ; WX 769 ; N uni25C6 ; G 3742\nU 9671 ; WX 769 ; N uni25C7 ; G 3743\nU 9672 ; WX 769 ; N uni25C8 ; G 3744\nU 9673 ; WX 873 ; N uni25C9 ; G 3745\nU 9674 ; WX 494 ; N lozenge ; G 3746\nU 9675 ; WX 873 ; N circle ; G 3747\nU 9676 ; WX 873 ; N uni25CC ; G 3748\nU 9677 ; WX 873 ; N uni25CD ; G 3749\nU 9678 ; WX 873 ; N uni25CE ; G 3750\nU 9679 ; WX 873 ; N H18533 ; G 3751\nU 9680 ; WX 873 ; N uni25D0 ; G 3752\nU 9681 ; WX 873 ; N uni25D1 ; G 3753\nU 9682 ; WX 873 ; N uni25D2 ; G 3754\nU 9683 ; WX 873 ; N uni25D3 ; G 3755\nU 9684 ; WX 873 ; N uni25D4 ; G 3756\nU 9685 ; WX 873 ; N uni25D5 ; G 3757\nU 9686 ; WX 527 ; N uni25D6 ; G 3758\nU 9687 ; WX 527 ; N uni25D7 ; G 3759\nU 9688 ; WX 840 ; N invbullet ; G 3760\nU 9689 ; WX 970 ; N invcircle ; G 3761\nU 9690 ; WX 970 ; N uni25DA ; G 3762\nU 9691 ; WX 970 ; N uni25DB ; G 3763\nU 9692 ; WX 387 ; N uni25DC ; G 3764\nU 9693 ; WX 387 ; N uni25DD ; G 3765\nU 9694 ; WX 387 ; N uni25DE ; G 3766\nU 9695 ; WX 387 ; N uni25DF ; G 3767\nU 9696 ; WX 769 ; N uni25E0 ; G 3768\nU 9697 ; WX 769 ; N uni25E1 ; G 3769\nU 9698 ; WX 769 ; N uni25E2 ; G 3770\nU 9699 ; WX 769 ; N uni25E3 ; G 3771\nU 9700 ; WX 769 ; N uni25E4 ; G 3772\nU 9701 ; WX 769 ; N uni25E5 ; G 3773\nU 9702 ; WX 639 ; N openbullet ; G 3774\nU 9703 ; WX 945 ; N uni25E7 ; G 3775\nU 9704 ; WX 945 ; N uni25E8 ; G 3776\nU 9705 ; WX 945 ; N uni25E9 ; G 3777\nU 9706 ; WX 945 ; N uni25EA ; G 3778\nU 9707 ; WX 945 ; N uni25EB ; G 3779\nU 9708 ; WX 769 ; N uni25EC ; G 3780\nU 9709 ; WX 769 ; N uni25ED ; G 3781\nU 9710 ; WX 769 ; N uni25EE ; G 3782\nU 9711 ; WX 1119 ; N uni25EF ; G 3783\nU 9712 ; WX 945 ; N uni25F0 ; G 3784\nU 9713 ; WX 945 ; N uni25F1 ; G 3785\nU 9714 ; WX 945 ; N uni25F2 ; G 3786\nU 9715 ; WX 945 ; N uni25F3 ; G 3787\nU 9716 ; WX 873 ; N uni25F4 ; G 3788\nU 9717 ; WX 873 ; N uni25F5 ; G 3789\nU 9718 ; WX 873 ; N uni25F6 ; G 3790\nU 9719 ; WX 873 ; N uni25F7 ; G 3791\nU 9720 ; WX 769 ; N uni25F8 ; G 3792\nU 9721 ; WX 769 ; N uni25F9 ; G 3793\nU 9722 ; WX 769 ; N uni25FA ; G 3794\nU 9723 ; WX 830 ; N uni25FB ; G 3795\nU 9724 ; WX 830 ; N uni25FC ; G 3796\nU 9725 ; WX 732 ; N uni25FD ; G 3797\nU 9726 ; WX 732 ; N uni25FE ; G 3798\nU 9727 ; WX 769 ; N uni25FF ; G 3799\nU 9728 ; WX 896 ; N uni2600 ; G 3800\nU 9729 ; WX 1000 ; N uni2601 ; G 3801\nU 9730 ; WX 896 ; N uni2602 ; G 3802\nU 9731 ; WX 896 ; N uni2603 ; G 3803\nU 9732 ; WX 896 ; N uni2604 ; G 3804\nU 9733 ; WX 896 ; N uni2605 ; G 3805\nU 9734 ; WX 896 ; N uni2606 ; G 3806\nU 9735 ; WX 573 ; N uni2607 ; G 3807\nU 9736 ; WX 896 ; N uni2608 ; G 3808\nU 9737 ; WX 896 ; N uni2609 ; G 3809\nU 9738 ; WX 888 ; N uni260A ; G 3810\nU 9739 ; WX 888 ; N uni260B ; G 3811\nU 9740 ; WX 671 ; N uni260C ; G 3812\nU 9741 ; WX 1013 ; N uni260D ; G 3813\nU 9742 ; WX 1246 ; N uni260E ; G 3814\nU 9743 ; WX 1250 ; N uni260F ; G 3815\nU 9744 ; WX 896 ; N uni2610 ; G 3816\nU 9745 ; WX 896 ; N uni2611 ; G 3817\nU 9746 ; WX 896 ; N uni2612 ; G 3818\nU 9747 ; WX 532 ; N uni2613 ; G 3819\nU 9748 ; WX 896 ; N uni2614 ; G 3820\nU 9749 ; WX 896 ; N uni2615 ; G 3821\nU 9750 ; WX 896 ; N uni2616 ; G 3822\nU 9751 ; WX 896 ; N uni2617 ; G 3823\nU 9752 ; WX 896 ; N uni2618 ; G 3824\nU 9753 ; WX 896 ; N uni2619 ; G 3825\nU 9754 ; WX 896 ; N uni261A ; G 3826\nU 9755 ; WX 896 ; N uni261B ; G 3827\nU 9756 ; WX 896 ; N uni261C ; G 3828\nU 9757 ; WX 609 ; N uni261D ; G 3829\nU 9758 ; WX 896 ; N uni261E ; G 3830\nU 9759 ; WX 609 ; N uni261F ; G 3831\nU 9760 ; WX 896 ; N uni2620 ; G 3832\nU 9761 ; WX 896 ; N uni2621 ; G 3833\nU 9762 ; WX 896 ; N uni2622 ; G 3834\nU 9763 ; WX 896 ; N uni2623 ; G 3835\nU 9764 ; WX 669 ; N uni2624 ; G 3836\nU 9765 ; WX 746 ; N uni2625 ; G 3837\nU 9766 ; WX 649 ; N uni2626 ; G 3838\nU 9767 ; WX 784 ; N uni2627 ; G 3839\nU 9768 ; WX 545 ; N uni2628 ; G 3840\nU 9769 ; WX 896 ; N uni2629 ; G 3841\nU 9770 ; WX 896 ; N uni262A ; G 3842\nU 9771 ; WX 896 ; N uni262B ; G 3843\nU 9772 ; WX 710 ; N uni262C ; G 3844\nU 9773 ; WX 896 ; N uni262D ; G 3845\nU 9774 ; WX 896 ; N uni262E ; G 3846\nU 9775 ; WX 896 ; N uni262F ; G 3847\nU 9776 ; WX 896 ; N uni2630 ; G 3848\nU 9777 ; WX 896 ; N uni2631 ; G 3849\nU 9778 ; WX 896 ; N uni2632 ; G 3850\nU 9779 ; WX 896 ; N uni2633 ; G 3851\nU 9780 ; WX 896 ; N uni2634 ; G 3852\nU 9781 ; WX 896 ; N uni2635 ; G 3853\nU 9782 ; WX 896 ; N uni2636 ; G 3854\nU 9783 ; WX 896 ; N uni2637 ; G 3855\nU 9784 ; WX 896 ; N uni2638 ; G 3856\nU 9785 ; WX 1042 ; N uni2639 ; G 3857\nU 9786 ; WX 1042 ; N smileface ; G 3858\nU 9787 ; WX 1042 ; N invsmileface ; G 3859\nU 9788 ; WX 896 ; N sun ; G 3860\nU 9789 ; WX 896 ; N uni263D ; G 3861\nU 9790 ; WX 896 ; N uni263E ; G 3862\nU 9791 ; WX 614 ; N uni263F ; G 3863\nU 9792 ; WX 732 ; N female ; G 3864\nU 9793 ; WX 732 ; N uni2641 ; G 3865\nU 9794 ; WX 896 ; N male ; G 3866\nU 9795 ; WX 896 ; N uni2643 ; G 3867\nU 9796 ; WX 896 ; N uni2644 ; G 3868\nU 9797 ; WX 896 ; N uni2645 ; G 3869\nU 9798 ; WX 896 ; N uni2646 ; G 3870\nU 9799 ; WX 896 ; N uni2647 ; G 3871\nU 9800 ; WX 896 ; N uni2648 ; G 3872\nU 9801 ; WX 896 ; N uni2649 ; G 3873\nU 9802 ; WX 896 ; N uni264A ; G 3874\nU 9803 ; WX 896 ; N uni264B ; G 3875\nU 9804 ; WX 896 ; N uni264C ; G 3876\nU 9805 ; WX 896 ; N uni264D ; G 3877\nU 9806 ; WX 896 ; N uni264E ; G 3878\nU 9807 ; WX 896 ; N uni264F ; G 3879\nU 9808 ; WX 896 ; N uni2650 ; G 3880\nU 9809 ; WX 896 ; N uni2651 ; G 3881\nU 9810 ; WX 896 ; N uni2652 ; G 3882\nU 9811 ; WX 896 ; N uni2653 ; G 3883\nU 9812 ; WX 896 ; N uni2654 ; G 3884\nU 9813 ; WX 896 ; N uni2655 ; G 3885\nU 9814 ; WX 896 ; N uni2656 ; G 3886\nU 9815 ; WX 896 ; N uni2657 ; G 3887\nU 9816 ; WX 896 ; N uni2658 ; G 3888\nU 9817 ; WX 896 ; N uni2659 ; G 3889\nU 9818 ; WX 896 ; N uni265A ; G 3890\nU 9819 ; WX 896 ; N uni265B ; G 3891\nU 9820 ; WX 896 ; N uni265C ; G 3892\nU 9821 ; WX 896 ; N uni265D ; G 3893\nU 9822 ; WX 896 ; N uni265E ; G 3894\nU 9823 ; WX 896 ; N uni265F ; G 3895\nU 9824 ; WX 896 ; N spade ; G 3896\nU 9825 ; WX 896 ; N uni2661 ; G 3897\nU 9826 ; WX 896 ; N uni2662 ; G 3898\nU 9827 ; WX 896 ; N club ; G 3899\nU 9828 ; WX 896 ; N uni2664 ; G 3900\nU 9829 ; WX 896 ; N heart ; G 3901\nU 9830 ; WX 896 ; N diamond ; G 3902\nU 9831 ; WX 896 ; N uni2667 ; G 3903\nU 9832 ; WX 896 ; N uni2668 ; G 3904\nU 9833 ; WX 472 ; N uni2669 ; G 3905\nU 9834 ; WX 638 ; N musicalnote ; G 3906\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3907\nU 9836 ; WX 896 ; N uni266C ; G 3908\nU 9837 ; WX 472 ; N uni266D ; G 3909\nU 9838 ; WX 357 ; N uni266E ; G 3910\nU 9839 ; WX 484 ; N uni266F ; G 3911\nU 9840 ; WX 748 ; N uni2670 ; G 3912\nU 9841 ; WX 766 ; N uni2671 ; G 3913\nU 9842 ; WX 896 ; N uni2672 ; G 3914\nU 9843 ; WX 896 ; N uni2673 ; G 3915\nU 9844 ; WX 896 ; N uni2674 ; G 3916\nU 9845 ; WX 896 ; N uni2675 ; G 3917\nU 9846 ; WX 896 ; N uni2676 ; G 3918\nU 9847 ; WX 896 ; N uni2677 ; G 3919\nU 9848 ; WX 896 ; N uni2678 ; G 3920\nU 9849 ; WX 896 ; N uni2679 ; G 3921\nU 9850 ; WX 896 ; N uni267A ; G 3922\nU 9851 ; WX 896 ; N uni267B ; G 3923\nU 9852 ; WX 896 ; N uni267C ; G 3924\nU 9853 ; WX 896 ; N uni267D ; G 3925\nU 9854 ; WX 896 ; N uni267E ; G 3926\nU 9855 ; WX 896 ; N uni267F ; G 3927\nU 9856 ; WX 869 ; N uni2680 ; G 3928\nU 9857 ; WX 869 ; N uni2681 ; G 3929\nU 9858 ; WX 869 ; N uni2682 ; G 3930\nU 9859 ; WX 869 ; N uni2683 ; G 3931\nU 9860 ; WX 869 ; N uni2684 ; G 3932\nU 9861 ; WX 869 ; N uni2685 ; G 3933\nU 9862 ; WX 896 ; N uni2686 ; G 3934\nU 9863 ; WX 896 ; N uni2687 ; G 3935\nU 9864 ; WX 896 ; N uni2688 ; G 3936\nU 9865 ; WX 896 ; N uni2689 ; G 3937\nU 9866 ; WX 896 ; N uni268A ; G 3938\nU 9867 ; WX 896 ; N uni268B ; G 3939\nU 9868 ; WX 896 ; N uni268C ; G 3940\nU 9869 ; WX 896 ; N uni268D ; G 3941\nU 9870 ; WX 896 ; N uni268E ; G 3942\nU 9871 ; WX 896 ; N uni268F ; G 3943\nU 9872 ; WX 896 ; N uni2690 ; G 3944\nU 9873 ; WX 896 ; N uni2691 ; G 3945\nU 9874 ; WX 896 ; N uni2692 ; G 3946\nU 9875 ; WX 896 ; N uni2693 ; G 3947\nU 9876 ; WX 896 ; N uni2694 ; G 3948\nU 9877 ; WX 541 ; N uni2695 ; G 3949\nU 9878 ; WX 896 ; N uni2696 ; G 3950\nU 9879 ; WX 896 ; N uni2697 ; G 3951\nU 9880 ; WX 896 ; N uni2698 ; G 3952\nU 9881 ; WX 896 ; N uni2699 ; G 3953\nU 9882 ; WX 896 ; N uni269A ; G 3954\nU 9883 ; WX 896 ; N uni269B ; G 3955\nU 9884 ; WX 896 ; N uni269C ; G 3956\nU 9886 ; WX 896 ; N uni269E ; G 3957\nU 9887 ; WX 896 ; N uni269F ; G 3958\nU 9888 ; WX 896 ; N uni26A0 ; G 3959\nU 9889 ; WX 702 ; N uni26A1 ; G 3960\nU 9890 ; WX 1004 ; N uni26A2 ; G 3961\nU 9891 ; WX 1089 ; N uni26A3 ; G 3962\nU 9892 ; WX 1175 ; N uni26A4 ; G 3963\nU 9893 ; WX 903 ; N uni26A5 ; G 3964\nU 9894 ; WX 838 ; N uni26A6 ; G 3965\nU 9895 ; WX 838 ; N uni26A7 ; G 3966\nU 9896 ; WX 838 ; N uni26A8 ; G 3967\nU 9897 ; WX 838 ; N uni26A9 ; G 3968\nU 9898 ; WX 838 ; N uni26AA ; G 3969\nU 9899 ; WX 838 ; N uni26AB ; G 3970\nU 9900 ; WX 838 ; N uni26AC ; G 3971\nU 9901 ; WX 838 ; N uni26AD ; G 3972\nU 9902 ; WX 838 ; N uni26AE ; G 3973\nU 9903 ; WX 838 ; N uni26AF ; G 3974\nU 9904 ; WX 844 ; N uni26B0 ; G 3975\nU 9905 ; WX 838 ; N uni26B1 ; G 3976\nU 9906 ; WX 732 ; N uni26B2 ; G 3977\nU 9907 ; WX 732 ; N uni26B3 ; G 3978\nU 9908 ; WX 732 ; N uni26B4 ; G 3979\nU 9909 ; WX 732 ; N uni26B5 ; G 3980\nU 9910 ; WX 850 ; N uni26B6 ; G 3981\nU 9911 ; WX 732 ; N uni26B7 ; G 3982\nU 9912 ; WX 732 ; N uni26B8 ; G 3983\nU 9920 ; WX 838 ; N uni26C0 ; G 3984\nU 9921 ; WX 838 ; N uni26C1 ; G 3985\nU 9922 ; WX 838 ; N uni26C2 ; G 3986\nU 9923 ; WX 838 ; N uni26C3 ; G 3987\nU 9954 ; WX 732 ; N uni26E2 ; G 3988\nU 9985 ; WX 838 ; N uni2701 ; G 3989\nU 9986 ; WX 838 ; N uni2702 ; G 3990\nU 9987 ; WX 838 ; N uni2703 ; G 3991\nU 9988 ; WX 838 ; N uni2704 ; G 3992\nU 9990 ; WX 838 ; N uni2706 ; G 3993\nU 9991 ; WX 838 ; N uni2707 ; G 3994\nU 9992 ; WX 838 ; N uni2708 ; G 3995\nU 9993 ; WX 838 ; N uni2709 ; G 3996\nU 9996 ; WX 838 ; N uni270C ; G 3997\nU 9997 ; WX 838 ; N uni270D ; G 3998\nU 9998 ; WX 838 ; N uni270E ; G 3999\nU 9999 ; WX 838 ; N uni270F ; G 4000\nU 10000 ; WX 838 ; N uni2710 ; G 4001\nU 10001 ; WX 838 ; N uni2711 ; G 4002\nU 10002 ; WX 838 ; N uni2712 ; G 4003\nU 10003 ; WX 838 ; N uni2713 ; G 4004\nU 10004 ; WX 838 ; N uni2714 ; G 4005\nU 10005 ; WX 838 ; N uni2715 ; G 4006\nU 10006 ; WX 838 ; N uni2716 ; G 4007\nU 10007 ; WX 838 ; N uni2717 ; G 4008\nU 10008 ; WX 838 ; N uni2718 ; G 4009\nU 10009 ; WX 838 ; N uni2719 ; G 4010\nU 10010 ; WX 838 ; N uni271A ; G 4011\nU 10011 ; WX 838 ; N uni271B ; G 4012\nU 10012 ; WX 838 ; N uni271C ; G 4013\nU 10013 ; WX 838 ; N uni271D ; G 4014\nU 10014 ; WX 838 ; N uni271E ; G 4015\nU 10015 ; WX 838 ; N uni271F ; G 4016\nU 10016 ; WX 838 ; N uni2720 ; G 4017\nU 10017 ; WX 838 ; N uni2721 ; G 4018\nU 10018 ; WX 838 ; N uni2722 ; G 4019\nU 10019 ; WX 838 ; N uni2723 ; G 4020\nU 10020 ; WX 838 ; N uni2724 ; G 4021\nU 10021 ; WX 838 ; N uni2725 ; G 4022\nU 10022 ; WX 838 ; N uni2726 ; G 4023\nU 10023 ; WX 838 ; N uni2727 ; G 4024\nU 10025 ; WX 838 ; N uni2729 ; G 4025\nU 10026 ; WX 838 ; N uni272A ; G 4026\nU 10027 ; WX 838 ; N uni272B ; G 4027\nU 10028 ; WX 838 ; N uni272C ; G 4028\nU 10029 ; WX 838 ; N uni272D ; G 4029\nU 10030 ; WX 838 ; N uni272E ; G 4030\nU 10031 ; WX 838 ; N uni272F ; G 4031\nU 10032 ; WX 838 ; N uni2730 ; G 4032\nU 10033 ; WX 838 ; N uni2731 ; G 4033\nU 10034 ; WX 838 ; N uni2732 ; G 4034\nU 10035 ; WX 838 ; N uni2733 ; G 4035\nU 10036 ; WX 838 ; N uni2734 ; G 4036\nU 10037 ; WX 838 ; N uni2735 ; G 4037\nU 10038 ; WX 838 ; N uni2736 ; G 4038\nU 10039 ; WX 838 ; N uni2737 ; G 4039\nU 10040 ; WX 838 ; N uni2738 ; G 4040\nU 10041 ; WX 838 ; N uni2739 ; G 4041\nU 10042 ; WX 838 ; N uni273A ; G 4042\nU 10043 ; WX 838 ; N uni273B ; G 4043\nU 10044 ; WX 838 ; N uni273C ; G 4044\nU 10045 ; WX 838 ; N uni273D ; G 4045\nU 10046 ; WX 838 ; N uni273E ; G 4046\nU 10047 ; WX 838 ; N uni273F ; G 4047\nU 10048 ; WX 838 ; N uni2740 ; G 4048\nU 10049 ; WX 838 ; N uni2741 ; G 4049\nU 10050 ; WX 838 ; N uni2742 ; G 4050\nU 10051 ; WX 838 ; N uni2743 ; G 4051\nU 10052 ; WX 838 ; N uni2744 ; G 4052\nU 10053 ; WX 838 ; N uni2745 ; G 4053\nU 10054 ; WX 838 ; N uni2746 ; G 4054\nU 10055 ; WX 838 ; N uni2747 ; G 4055\nU 10056 ; WX 838 ; N uni2748 ; G 4056\nU 10057 ; WX 838 ; N uni2749 ; G 4057\nU 10058 ; WX 838 ; N uni274A ; G 4058\nU 10059 ; WX 838 ; N uni274B ; G 4059\nU 10061 ; WX 896 ; N uni274D ; G 4060\nU 10063 ; WX 896 ; N uni274F ; G 4061\nU 10064 ; WX 896 ; N uni2750 ; G 4062\nU 10065 ; WX 896 ; N uni2751 ; G 4063\nU 10066 ; WX 896 ; N uni2752 ; G 4064\nU 10070 ; WX 896 ; N uni2756 ; G 4065\nU 10072 ; WX 838 ; N uni2758 ; G 4066\nU 10073 ; WX 838 ; N uni2759 ; G 4067\nU 10074 ; WX 838 ; N uni275A ; G 4068\nU 10075 ; WX 347 ; N uni275B ; G 4069\nU 10076 ; WX 347 ; N uni275C ; G 4070\nU 10077 ; WX 587 ; N uni275D ; G 4071\nU 10078 ; WX 587 ; N uni275E ; G 4072\nU 10081 ; WX 838 ; N uni2761 ; G 4073\nU 10082 ; WX 838 ; N uni2762 ; G 4074\nU 10083 ; WX 838 ; N uni2763 ; G 4075\nU 10084 ; WX 838 ; N uni2764 ; G 4076\nU 10085 ; WX 838 ; N uni2765 ; G 4077\nU 10086 ; WX 838 ; N uni2766 ; G 4078\nU 10087 ; WX 838 ; N uni2767 ; G 4079\nU 10088 ; WX 838 ; N uni2768 ; G 4080\nU 10089 ; WX 838 ; N uni2769 ; G 4081\nU 10090 ; WX 838 ; N uni276A ; G 4082\nU 10091 ; WX 838 ; N uni276B ; G 4083\nU 10092 ; WX 838 ; N uni276C ; G 4084\nU 10093 ; WX 838 ; N uni276D ; G 4085\nU 10094 ; WX 838 ; N uni276E ; G 4086\nU 10095 ; WX 838 ; N uni276F ; G 4087\nU 10096 ; WX 838 ; N uni2770 ; G 4088\nU 10097 ; WX 838 ; N uni2771 ; G 4089\nU 10098 ; WX 838 ; N uni2772 ; G 4090\nU 10099 ; WX 838 ; N uni2773 ; G 4091\nU 10100 ; WX 838 ; N uni2774 ; G 4092\nU 10101 ; WX 838 ; N uni2775 ; G 4093\nU 10102 ; WX 847 ; N uni2776 ; G 4094\nU 10103 ; WX 847 ; N uni2777 ; G 4095\nU 10104 ; WX 847 ; N uni2778 ; G 4096\nU 10105 ; WX 847 ; N uni2779 ; G 4097\nU 10106 ; WX 847 ; N uni277A ; G 4098\nU 10107 ; WX 847 ; N uni277B ; G 4099\nU 10108 ; WX 847 ; N uni277C ; G 4100\nU 10109 ; WX 847 ; N uni277D ; G 4101\nU 10110 ; WX 847 ; N uni277E ; G 4102\nU 10111 ; WX 847 ; N uni277F ; G 4103\nU 10112 ; WX 838 ; N uni2780 ; G 4104\nU 10113 ; WX 838 ; N uni2781 ; G 4105\nU 10114 ; WX 838 ; N uni2782 ; G 4106\nU 10115 ; WX 838 ; N uni2783 ; G 4107\nU 10116 ; WX 838 ; N uni2784 ; G 4108\nU 10117 ; WX 838 ; N uni2785 ; G 4109\nU 10118 ; WX 838 ; N uni2786 ; G 4110\nU 10119 ; WX 838 ; N uni2787 ; G 4111\nU 10120 ; WX 838 ; N uni2788 ; G 4112\nU 10121 ; WX 838 ; N uni2789 ; G 4113\nU 10122 ; WX 838 ; N uni278A ; G 4114\nU 10123 ; WX 838 ; N uni278B ; G 4115\nU 10124 ; WX 838 ; N uni278C ; G 4116\nU 10125 ; WX 838 ; N uni278D ; G 4117\nU 10126 ; WX 838 ; N uni278E ; G 4118\nU 10127 ; WX 838 ; N uni278F ; G 4119\nU 10128 ; WX 838 ; N uni2790 ; G 4120\nU 10129 ; WX 838 ; N uni2791 ; G 4121\nU 10130 ; WX 838 ; N uni2792 ; G 4122\nU 10131 ; WX 838 ; N uni2793 ; G 4123\nU 10132 ; WX 838 ; N uni2794 ; G 4124\nU 10136 ; WX 838 ; N uni2798 ; G 4125\nU 10137 ; WX 838 ; N uni2799 ; G 4126\nU 10138 ; WX 838 ; N uni279A ; G 4127\nU 10139 ; WX 838 ; N uni279B ; G 4128\nU 10140 ; WX 838 ; N uni279C ; G 4129\nU 10141 ; WX 838 ; N uni279D ; G 4130\nU 10142 ; WX 838 ; N uni279E ; G 4131\nU 10143 ; WX 838 ; N uni279F ; G 4132\nU 10144 ; WX 838 ; N uni27A0 ; G 4133\nU 10145 ; WX 838 ; N uni27A1 ; G 4134\nU 10146 ; WX 838 ; N uni27A2 ; G 4135\nU 10147 ; WX 838 ; N uni27A3 ; G 4136\nU 10148 ; WX 838 ; N uni27A4 ; G 4137\nU 10149 ; WX 838 ; N uni27A5 ; G 4138\nU 10150 ; WX 838 ; N uni27A6 ; G 4139\nU 10151 ; WX 838 ; N uni27A7 ; G 4140\nU 10152 ; WX 838 ; N uni27A8 ; G 4141\nU 10153 ; WX 838 ; N uni27A9 ; G 4142\nU 10154 ; WX 838 ; N uni27AA ; G 4143\nU 10155 ; WX 838 ; N uni27AB ; G 4144\nU 10156 ; WX 838 ; N uni27AC ; G 4145\nU 10157 ; WX 838 ; N uni27AD ; G 4146\nU 10158 ; WX 838 ; N uni27AE ; G 4147\nU 10159 ; WX 838 ; N uni27AF ; G 4148\nU 10161 ; WX 838 ; N uni27B1 ; G 4149\nU 10162 ; WX 838 ; N uni27B2 ; G 4150\nU 10163 ; WX 838 ; N uni27B3 ; G 4151\nU 10164 ; WX 838 ; N uni27B4 ; G 4152\nU 10165 ; WX 838 ; N uni27B5 ; G 4153\nU 10166 ; WX 838 ; N uni27B6 ; G 4154\nU 10167 ; WX 838 ; N uni27B7 ; G 4155\nU 10168 ; WX 838 ; N uni27B8 ; G 4156\nU 10169 ; WX 838 ; N uni27B9 ; G 4157\nU 10170 ; WX 838 ; N uni27BA ; G 4158\nU 10171 ; WX 838 ; N uni27BB ; G 4159\nU 10172 ; WX 838 ; N uni27BC ; G 4160\nU 10173 ; WX 838 ; N uni27BD ; G 4161\nU 10174 ; WX 838 ; N uni27BE ; G 4162\nU 10181 ; WX 457 ; N uni27C5 ; G 4163\nU 10182 ; WX 457 ; N uni27C6 ; G 4164\nU 10208 ; WX 494 ; N uni27E0 ; G 4165\nU 10214 ; WX 487 ; N uni27E6 ; G 4166\nU 10215 ; WX 487 ; N uni27E7 ; G 4167\nU 10216 ; WX 457 ; N uni27E8 ; G 4168\nU 10217 ; WX 457 ; N uni27E9 ; G 4169\nU 10218 ; WX 721 ; N uni27EA ; G 4170\nU 10219 ; WX 721 ; N uni27EB ; G 4171\nU 10224 ; WX 838 ; N uni27F0 ; G 4172\nU 10225 ; WX 838 ; N uni27F1 ; G 4173\nU 10226 ; WX 838 ; N uni27F2 ; G 4174\nU 10227 ; WX 838 ; N uni27F3 ; G 4175\nU 10228 ; WX 1157 ; N uni27F4 ; G 4176\nU 10229 ; WX 1434 ; N uni27F5 ; G 4177\nU 10230 ; WX 1434 ; N uni27F6 ; G 4178\nU 10231 ; WX 1434 ; N uni27F7 ; G 4179\nU 10232 ; WX 1434 ; N uni27F8 ; G 4180\nU 10233 ; WX 1434 ; N uni27F9 ; G 4181\nU 10234 ; WX 1434 ; N uni27FA ; G 4182\nU 10235 ; WX 1434 ; N uni27FB ; G 4183\nU 10236 ; WX 1434 ; N uni27FC ; G 4184\nU 10237 ; WX 1434 ; N uni27FD ; G 4185\nU 10238 ; WX 1434 ; N uni27FE ; G 4186\nU 10239 ; WX 1434 ; N uni27FF ; G 4187\nU 10240 ; WX 781 ; N uni2800 ; G 4188\nU 10241 ; WX 781 ; N uni2801 ; G 4189\nU 10242 ; WX 781 ; N uni2802 ; G 4190\nU 10243 ; WX 781 ; N uni2803 ; G 4191\nU 10244 ; WX 781 ; N uni2804 ; G 4192\nU 10245 ; WX 781 ; N uni2805 ; G 4193\nU 10246 ; WX 781 ; N uni2806 ; G 4194\nU 10247 ; WX 781 ; N uni2807 ; G 4195\nU 10248 ; WX 781 ; N uni2808 ; G 4196\nU 10249 ; WX 781 ; N uni2809 ; G 4197\nU 10250 ; WX 781 ; N uni280A ; G 4198\nU 10251 ; WX 781 ; N uni280B ; G 4199\nU 10252 ; WX 781 ; N uni280C ; G 4200\nU 10253 ; WX 781 ; N uni280D ; G 4201\nU 10254 ; WX 781 ; N uni280E ; G 4202\nU 10255 ; WX 781 ; N uni280F ; G 4203\nU 10256 ; WX 781 ; N uni2810 ; G 4204\nU 10257 ; WX 781 ; N uni2811 ; G 4205\nU 10258 ; WX 781 ; N uni2812 ; G 4206\nU 10259 ; WX 781 ; N uni2813 ; G 4207\nU 10260 ; WX 781 ; N uni2814 ; G 4208\nU 10261 ; WX 781 ; N uni2815 ; G 4209\nU 10262 ; WX 781 ; N uni2816 ; G 4210\nU 10263 ; WX 781 ; N uni2817 ; G 4211\nU 10264 ; WX 781 ; N uni2818 ; G 4212\nU 10265 ; WX 781 ; N uni2819 ; G 4213\nU 10266 ; WX 781 ; N uni281A ; G 4214\nU 10267 ; WX 781 ; N uni281B ; G 4215\nU 10268 ; WX 781 ; N uni281C ; G 4216\nU 10269 ; WX 781 ; N uni281D ; G 4217\nU 10270 ; WX 781 ; N uni281E ; G 4218\nU 10271 ; WX 781 ; N uni281F ; G 4219\nU 10272 ; WX 781 ; N uni2820 ; G 4220\nU 10273 ; WX 781 ; N uni2821 ; G 4221\nU 10274 ; WX 781 ; N uni2822 ; G 4222\nU 10275 ; WX 781 ; N uni2823 ; G 4223\nU 10276 ; WX 781 ; N uni2824 ; G 4224\nU 10277 ; WX 781 ; N uni2825 ; G 4225\nU 10278 ; WX 781 ; N uni2826 ; G 4226\nU 10279 ; WX 781 ; N uni2827 ; G 4227\nU 10280 ; WX 781 ; N uni2828 ; G 4228\nU 10281 ; WX 781 ; N uni2829 ; G 4229\nU 10282 ; WX 781 ; N uni282A ; G 4230\nU 10283 ; WX 781 ; N uni282B ; G 4231\nU 10284 ; WX 781 ; N uni282C ; G 4232\nU 10285 ; WX 781 ; N uni282D ; G 4233\nU 10286 ; WX 781 ; N uni282E ; G 4234\nU 10287 ; WX 781 ; N uni282F ; G 4235\nU 10288 ; WX 781 ; N uni2830 ; G 4236\nU 10289 ; WX 781 ; N uni2831 ; G 4237\nU 10290 ; WX 781 ; N uni2832 ; G 4238\nU 10291 ; WX 781 ; N uni2833 ; G 4239\nU 10292 ; WX 781 ; N uni2834 ; G 4240\nU 10293 ; WX 781 ; N uni2835 ; G 4241\nU 10294 ; WX 781 ; N uni2836 ; G 4242\nU 10295 ; WX 781 ; N uni2837 ; G 4243\nU 10296 ; WX 781 ; N uni2838 ; G 4244\nU 10297 ; WX 781 ; N uni2839 ; G 4245\nU 10298 ; WX 781 ; N uni283A ; G 4246\nU 10299 ; WX 781 ; N uni283B ; G 4247\nU 10300 ; WX 781 ; N uni283C ; G 4248\nU 10301 ; WX 781 ; N uni283D ; G 4249\nU 10302 ; WX 781 ; N uni283E ; G 4250\nU 10303 ; WX 781 ; N uni283F ; G 4251\nU 10304 ; WX 781 ; N uni2840 ; G 4252\nU 10305 ; WX 781 ; N uni2841 ; G 4253\nU 10306 ; WX 781 ; N uni2842 ; G 4254\nU 10307 ; WX 781 ; N uni2843 ; G 4255\nU 10308 ; WX 781 ; N uni2844 ; G 4256\nU 10309 ; WX 781 ; N uni2845 ; G 4257\nU 10310 ; WX 781 ; N uni2846 ; G 4258\nU 10311 ; WX 781 ; N uni2847 ; G 4259\nU 10312 ; WX 781 ; N uni2848 ; G 4260\nU 10313 ; WX 781 ; N uni2849 ; G 4261\nU 10314 ; WX 781 ; N uni284A ; G 4262\nU 10315 ; WX 781 ; N uni284B ; G 4263\nU 10316 ; WX 781 ; N uni284C ; G 4264\nU 10317 ; WX 781 ; N uni284D ; G 4265\nU 10318 ; WX 781 ; N uni284E ; G 4266\nU 10319 ; WX 781 ; N uni284F ; G 4267\nU 10320 ; WX 781 ; N uni2850 ; G 4268\nU 10321 ; WX 781 ; N uni2851 ; G 4269\nU 10322 ; WX 781 ; N uni2852 ; G 4270\nU 10323 ; WX 781 ; N uni2853 ; G 4271\nU 10324 ; WX 781 ; N uni2854 ; G 4272\nU 10325 ; WX 781 ; N uni2855 ; G 4273\nU 10326 ; WX 781 ; N uni2856 ; G 4274\nU 10327 ; WX 781 ; N uni2857 ; G 4275\nU 10328 ; WX 781 ; N uni2858 ; G 4276\nU 10329 ; WX 781 ; N uni2859 ; G 4277\nU 10330 ; WX 781 ; N uni285A ; G 4278\nU 10331 ; WX 781 ; N uni285B ; G 4279\nU 10332 ; WX 781 ; N uni285C ; G 4280\nU 10333 ; WX 781 ; N uni285D ; G 4281\nU 10334 ; WX 781 ; N uni285E ; G 4282\nU 10335 ; WX 781 ; N uni285F ; G 4283\nU 10336 ; WX 781 ; N uni2860 ; G 4284\nU 10337 ; WX 781 ; N uni2861 ; G 4285\nU 10338 ; WX 781 ; N uni2862 ; G 4286\nU 10339 ; WX 781 ; N uni2863 ; G 4287\nU 10340 ; WX 781 ; N uni2864 ; G 4288\nU 10341 ; WX 781 ; N uni2865 ; G 4289\nU 10342 ; WX 781 ; N uni2866 ; G 4290\nU 10343 ; WX 781 ; N uni2867 ; G 4291\nU 10344 ; WX 781 ; N uni2868 ; G 4292\nU 10345 ; WX 781 ; N uni2869 ; G 4293\nU 10346 ; WX 781 ; N uni286A ; G 4294\nU 10347 ; WX 781 ; N uni286B ; G 4295\nU 10348 ; WX 781 ; N uni286C ; G 4296\nU 10349 ; WX 781 ; N uni286D ; G 4297\nU 10350 ; WX 781 ; N uni286E ; G 4298\nU 10351 ; WX 781 ; N uni286F ; G 4299\nU 10352 ; WX 781 ; N uni2870 ; G 4300\nU 10353 ; WX 781 ; N uni2871 ; G 4301\nU 10354 ; WX 781 ; N uni2872 ; G 4302\nU 10355 ; WX 781 ; N uni2873 ; G 4303\nU 10356 ; WX 781 ; N uni2874 ; G 4304\nU 10357 ; WX 781 ; N uni2875 ; G 4305\nU 10358 ; WX 781 ; N uni2876 ; G 4306\nU 10359 ; WX 781 ; N uni2877 ; G 4307\nU 10360 ; WX 781 ; N uni2878 ; G 4308\nU 10361 ; WX 781 ; N uni2879 ; G 4309\nU 10362 ; WX 781 ; N uni287A ; G 4310\nU 10363 ; WX 781 ; N uni287B ; G 4311\nU 10364 ; WX 781 ; N uni287C ; G 4312\nU 10365 ; WX 781 ; N uni287D ; G 4313\nU 10366 ; WX 781 ; N uni287E ; G 4314\nU 10367 ; WX 781 ; N uni287F ; G 4315\nU 10368 ; WX 781 ; N uni2880 ; G 4316\nU 10369 ; WX 781 ; N uni2881 ; G 4317\nU 10370 ; WX 781 ; N uni2882 ; G 4318\nU 10371 ; WX 781 ; N uni2883 ; G 4319\nU 10372 ; WX 781 ; N uni2884 ; G 4320\nU 10373 ; WX 781 ; N uni2885 ; G 4321\nU 10374 ; WX 781 ; N uni2886 ; G 4322\nU 10375 ; WX 781 ; N uni2887 ; G 4323\nU 10376 ; WX 781 ; N uni2888 ; G 4324\nU 10377 ; WX 781 ; N uni2889 ; G 4325\nU 10378 ; WX 781 ; N uni288A ; G 4326\nU 10379 ; WX 781 ; N uni288B ; G 4327\nU 10380 ; WX 781 ; N uni288C ; G 4328\nU 10381 ; WX 781 ; N uni288D ; G 4329\nU 10382 ; WX 781 ; N uni288E ; G 4330\nU 10383 ; WX 781 ; N uni288F ; G 4331\nU 10384 ; WX 781 ; N uni2890 ; G 4332\nU 10385 ; WX 781 ; N uni2891 ; G 4333\nU 10386 ; WX 781 ; N uni2892 ; G 4334\nU 10387 ; WX 781 ; N uni2893 ; G 4335\nU 10388 ; WX 781 ; N uni2894 ; G 4336\nU 10389 ; WX 781 ; N uni2895 ; G 4337\nU 10390 ; WX 781 ; N uni2896 ; G 4338\nU 10391 ; WX 781 ; N uni2897 ; G 4339\nU 10392 ; WX 781 ; N uni2898 ; G 4340\nU 10393 ; WX 781 ; N uni2899 ; G 4341\nU 10394 ; WX 781 ; N uni289A ; G 4342\nU 10395 ; WX 781 ; N uni289B ; G 4343\nU 10396 ; WX 781 ; N uni289C ; G 4344\nU 10397 ; WX 781 ; N uni289D ; G 4345\nU 10398 ; WX 781 ; N uni289E ; G 4346\nU 10399 ; WX 781 ; N uni289F ; G 4347\nU 10400 ; WX 781 ; N uni28A0 ; G 4348\nU 10401 ; WX 781 ; N uni28A1 ; G 4349\nU 10402 ; WX 781 ; N uni28A2 ; G 4350\nU 10403 ; WX 781 ; N uni28A3 ; G 4351\nU 10404 ; WX 781 ; N uni28A4 ; G 4352\nU 10405 ; WX 781 ; N uni28A5 ; G 4353\nU 10406 ; WX 781 ; N uni28A6 ; G 4354\nU 10407 ; WX 781 ; N uni28A7 ; G 4355\nU 10408 ; WX 781 ; N uni28A8 ; G 4356\nU 10409 ; WX 781 ; N uni28A9 ; G 4357\nU 10410 ; WX 781 ; N uni28AA ; G 4358\nU 10411 ; WX 781 ; N uni28AB ; G 4359\nU 10412 ; WX 781 ; N uni28AC ; G 4360\nU 10413 ; WX 781 ; N uni28AD ; G 4361\nU 10414 ; WX 781 ; N uni28AE ; G 4362\nU 10415 ; WX 781 ; N uni28AF ; G 4363\nU 10416 ; WX 781 ; N uni28B0 ; G 4364\nU 10417 ; WX 781 ; N uni28B1 ; G 4365\nU 10418 ; WX 781 ; N uni28B2 ; G 4366\nU 10419 ; WX 781 ; N uni28B3 ; G 4367\nU 10420 ; WX 781 ; N uni28B4 ; G 4368\nU 10421 ; WX 781 ; N uni28B5 ; G 4369\nU 10422 ; WX 781 ; N uni28B6 ; G 4370\nU 10423 ; WX 781 ; N uni28B7 ; G 4371\nU 10424 ; WX 781 ; N uni28B8 ; G 4372\nU 10425 ; WX 781 ; N uni28B9 ; G 4373\nU 10426 ; WX 781 ; N uni28BA ; G 4374\nU 10427 ; WX 781 ; N uni28BB ; G 4375\nU 10428 ; WX 781 ; N uni28BC ; G 4376\nU 10429 ; WX 781 ; N uni28BD ; G 4377\nU 10430 ; WX 781 ; N uni28BE ; G 4378\nU 10431 ; WX 781 ; N uni28BF ; G 4379\nU 10432 ; WX 781 ; N uni28C0 ; G 4380\nU 10433 ; WX 781 ; N uni28C1 ; G 4381\nU 10434 ; WX 781 ; N uni28C2 ; G 4382\nU 10435 ; WX 781 ; N uni28C3 ; G 4383\nU 10436 ; WX 781 ; N uni28C4 ; G 4384\nU 10437 ; WX 781 ; N uni28C5 ; G 4385\nU 10438 ; WX 781 ; N uni28C6 ; G 4386\nU 10439 ; WX 781 ; N uni28C7 ; G 4387\nU 10440 ; WX 781 ; N uni28C8 ; G 4388\nU 10441 ; WX 781 ; N uni28C9 ; G 4389\nU 10442 ; WX 781 ; N uni28CA ; G 4390\nU 10443 ; WX 781 ; N uni28CB ; G 4391\nU 10444 ; WX 781 ; N uni28CC ; G 4392\nU 10445 ; WX 781 ; N uni28CD ; G 4393\nU 10446 ; WX 781 ; N uni28CE ; G 4394\nU 10447 ; WX 781 ; N uni28CF ; G 4395\nU 10448 ; WX 781 ; N uni28D0 ; G 4396\nU 10449 ; WX 781 ; N uni28D1 ; G 4397\nU 10450 ; WX 781 ; N uni28D2 ; G 4398\nU 10451 ; WX 781 ; N uni28D3 ; G 4399\nU 10452 ; WX 781 ; N uni28D4 ; G 4400\nU 10453 ; WX 781 ; N uni28D5 ; G 4401\nU 10454 ; WX 781 ; N uni28D6 ; G 4402\nU 10455 ; WX 781 ; N uni28D7 ; G 4403\nU 10456 ; WX 781 ; N uni28D8 ; G 4404\nU 10457 ; WX 781 ; N uni28D9 ; G 4405\nU 10458 ; WX 781 ; N uni28DA ; G 4406\nU 10459 ; WX 781 ; N uni28DB ; G 4407\nU 10460 ; WX 781 ; N uni28DC ; G 4408\nU 10461 ; WX 781 ; N uni28DD ; G 4409\nU 10462 ; WX 781 ; N uni28DE ; G 4410\nU 10463 ; WX 781 ; N uni28DF ; G 4411\nU 10464 ; WX 781 ; N uni28E0 ; G 4412\nU 10465 ; WX 781 ; N uni28E1 ; G 4413\nU 10466 ; WX 781 ; N uni28E2 ; G 4414\nU 10467 ; WX 781 ; N uni28E3 ; G 4415\nU 10468 ; WX 781 ; N uni28E4 ; G 4416\nU 10469 ; WX 781 ; N uni28E5 ; G 4417\nU 10470 ; WX 781 ; N uni28E6 ; G 4418\nU 10471 ; WX 781 ; N uni28E7 ; G 4419\nU 10472 ; WX 781 ; N uni28E8 ; G 4420\nU 10473 ; WX 781 ; N uni28E9 ; G 4421\nU 10474 ; WX 781 ; N uni28EA ; G 4422\nU 10475 ; WX 781 ; N uni28EB ; G 4423\nU 10476 ; WX 781 ; N uni28EC ; G 4424\nU 10477 ; WX 781 ; N uni28ED ; G 4425\nU 10478 ; WX 781 ; N uni28EE ; G 4426\nU 10479 ; WX 781 ; N uni28EF ; G 4427\nU 10480 ; WX 781 ; N uni28F0 ; G 4428\nU 10481 ; WX 781 ; N uni28F1 ; G 4429\nU 10482 ; WX 781 ; N uni28F2 ; G 4430\nU 10483 ; WX 781 ; N uni28F3 ; G 4431\nU 10484 ; WX 781 ; N uni28F4 ; G 4432\nU 10485 ; WX 781 ; N uni28F5 ; G 4433\nU 10486 ; WX 781 ; N uni28F6 ; G 4434\nU 10487 ; WX 781 ; N uni28F7 ; G 4435\nU 10488 ; WX 781 ; N uni28F8 ; G 4436\nU 10489 ; WX 781 ; N uni28F9 ; G 4437\nU 10490 ; WX 781 ; N uni28FA ; G 4438\nU 10491 ; WX 781 ; N uni28FB ; G 4439\nU 10492 ; WX 781 ; N uni28FC ; G 4440\nU 10493 ; WX 781 ; N uni28FD ; G 4441\nU 10494 ; WX 781 ; N uni28FE ; G 4442\nU 10495 ; WX 781 ; N uni28FF ; G 4443\nU 10502 ; WX 838 ; N uni2906 ; G 4444\nU 10503 ; WX 838 ; N uni2907 ; G 4445\nU 10506 ; WX 838 ; N uni290A ; G 4446\nU 10507 ; WX 838 ; N uni290B ; G 4447\nU 10560 ; WX 838 ; N uni2940 ; G 4448\nU 10561 ; WX 838 ; N uni2941 ; G 4449\nU 10627 ; WX 753 ; N uni2983 ; G 4450\nU 10628 ; WX 753 ; N uni2984 ; G 4451\nU 10702 ; WX 838 ; N uni29CE ; G 4452\nU 10703 ; WX 1046 ; N uni29CF ; G 4453\nU 10704 ; WX 1046 ; N uni29D0 ; G 4454\nU 10705 ; WX 1000 ; N uni29D1 ; G 4455\nU 10706 ; WX 1000 ; N uni29D2 ; G 4456\nU 10707 ; WX 1000 ; N uni29D3 ; G 4457\nU 10708 ; WX 1000 ; N uni29D4 ; G 4458\nU 10709 ; WX 1000 ; N uni29D5 ; G 4459\nU 10731 ; WX 494 ; N uni29EB ; G 4460\nU 10746 ; WX 838 ; N uni29FA ; G 4461\nU 10747 ; WX 838 ; N uni29FB ; G 4462\nU 10752 ; WX 1000 ; N uni2A00 ; G 4463\nU 10753 ; WX 1000 ; N uni2A01 ; G 4464\nU 10754 ; WX 1000 ; N uni2A02 ; G 4465\nU 10764 ; WX 1661 ; N uni2A0C ; G 4466\nU 10765 ; WX 563 ; N uni2A0D ; G 4467\nU 10766 ; WX 563 ; N uni2A0E ; G 4468\nU 10767 ; WX 563 ; N uni2A0F ; G 4469\nU 10768 ; WX 563 ; N uni2A10 ; G 4470\nU 10769 ; WX 563 ; N uni2A11 ; G 4471\nU 10770 ; WX 563 ; N uni2A12 ; G 4472\nU 10771 ; WX 563 ; N uni2A13 ; G 4473\nU 10772 ; WX 563 ; N uni2A14 ; G 4474\nU 10773 ; WX 563 ; N uni2A15 ; G 4475\nU 10774 ; WX 563 ; N uni2A16 ; G 4476\nU 10775 ; WX 563 ; N uni2A17 ; G 4477\nU 10776 ; WX 563 ; N uni2A18 ; G 4478\nU 10777 ; WX 563 ; N uni2A19 ; G 4479\nU 10778 ; WX 563 ; N uni2A1A ; G 4480\nU 10779 ; WX 563 ; N uni2A1B ; G 4481\nU 10780 ; WX 563 ; N uni2A1C ; G 4482\nU 10799 ; WX 838 ; N uni2A2F ; G 4483\nU 10858 ; WX 838 ; N uni2A6A ; G 4484\nU 10859 ; WX 838 ; N uni2A6B ; G 4485\nU 10877 ; WX 838 ; N uni2A7D ; G 4486\nU 10878 ; WX 838 ; N uni2A7E ; G 4487\nU 10879 ; WX 838 ; N uni2A7F ; G 4488\nU 10880 ; WX 838 ; N uni2A80 ; G 4489\nU 10881 ; WX 838 ; N uni2A81 ; G 4490\nU 10882 ; WX 838 ; N uni2A82 ; G 4491\nU 10883 ; WX 838 ; N uni2A83 ; G 4492\nU 10884 ; WX 838 ; N uni2A84 ; G 4493\nU 10885 ; WX 838 ; N uni2A85 ; G 4494\nU 10886 ; WX 838 ; N uni2A86 ; G 4495\nU 10887 ; WX 838 ; N uni2A87 ; G 4496\nU 10888 ; WX 838 ; N uni2A88 ; G 4497\nU 10889 ; WX 838 ; N uni2A89 ; G 4498\nU 10890 ; WX 838 ; N uni2A8A ; G 4499\nU 10891 ; WX 838 ; N uni2A8B ; G 4500\nU 10892 ; WX 838 ; N uni2A8C ; G 4501\nU 10893 ; WX 838 ; N uni2A8D ; G 4502\nU 10894 ; WX 838 ; N uni2A8E ; G 4503\nU 10895 ; WX 838 ; N uni2A8F ; G 4504\nU 10896 ; WX 838 ; N uni2A90 ; G 4505\nU 10897 ; WX 838 ; N uni2A91 ; G 4506\nU 10898 ; WX 838 ; N uni2A92 ; G 4507\nU 10899 ; WX 838 ; N uni2A93 ; G 4508\nU 10900 ; WX 838 ; N uni2A94 ; G 4509\nU 10901 ; WX 838 ; N uni2A95 ; G 4510\nU 10902 ; WX 838 ; N uni2A96 ; G 4511\nU 10903 ; WX 838 ; N uni2A97 ; G 4512\nU 10904 ; WX 838 ; N uni2A98 ; G 4513\nU 10905 ; WX 838 ; N uni2A99 ; G 4514\nU 10906 ; WX 838 ; N uni2A9A ; G 4515\nU 10907 ; WX 838 ; N uni2A9B ; G 4516\nU 10908 ; WX 838 ; N uni2A9C ; G 4517\nU 10909 ; WX 838 ; N uni2A9D ; G 4518\nU 10910 ; WX 838 ; N uni2A9E ; G 4519\nU 10911 ; WX 838 ; N uni2A9F ; G 4520\nU 10912 ; WX 838 ; N uni2AA0 ; G 4521\nU 10926 ; WX 838 ; N uni2AAE ; G 4522\nU 10927 ; WX 838 ; N uni2AAF ; G 4523\nU 10928 ; WX 838 ; N uni2AB0 ; G 4524\nU 10929 ; WX 838 ; N uni2AB1 ; G 4525\nU 10930 ; WX 838 ; N uni2AB2 ; G 4526\nU 10931 ; WX 838 ; N uni2AB3 ; G 4527\nU 10932 ; WX 838 ; N uni2AB4 ; G 4528\nU 10933 ; WX 838 ; N uni2AB5 ; G 4529\nU 10934 ; WX 838 ; N uni2AB6 ; G 4530\nU 10935 ; WX 838 ; N uni2AB7 ; G 4531\nU 10936 ; WX 838 ; N uni2AB8 ; G 4532\nU 10937 ; WX 838 ; N uni2AB9 ; G 4533\nU 10938 ; WX 838 ; N uni2ABA ; G 4534\nU 11001 ; WX 838 ; N uni2AF9 ; G 4535\nU 11002 ; WX 838 ; N uni2AFA ; G 4536\nU 11008 ; WX 838 ; N uni2B00 ; G 4537\nU 11009 ; WX 838 ; N uni2B01 ; G 4538\nU 11010 ; WX 838 ; N uni2B02 ; G 4539\nU 11011 ; WX 838 ; N uni2B03 ; G 4540\nU 11012 ; WX 838 ; N uni2B04 ; G 4541\nU 11013 ; WX 838 ; N uni2B05 ; G 4542\nU 11014 ; WX 838 ; N uni2B06 ; G 4543\nU 11015 ; WX 838 ; N uni2B07 ; G 4544\nU 11016 ; WX 838 ; N uni2B08 ; G 4545\nU 11017 ; WX 838 ; N uni2B09 ; G 4546\nU 11018 ; WX 838 ; N uni2B0A ; G 4547\nU 11019 ; WX 838 ; N uni2B0B ; G 4548\nU 11020 ; WX 838 ; N uni2B0C ; G 4549\nU 11021 ; WX 838 ; N uni2B0D ; G 4550\nU 11022 ; WX 838 ; N uni2B0E ; G 4551\nU 11023 ; WX 838 ; N uni2B0F ; G 4552\nU 11024 ; WX 838 ; N uni2B10 ; G 4553\nU 11025 ; WX 838 ; N uni2B11 ; G 4554\nU 11026 ; WX 945 ; N uni2B12 ; G 4555\nU 11027 ; WX 945 ; N uni2B13 ; G 4556\nU 11028 ; WX 945 ; N uni2B14 ; G 4557\nU 11029 ; WX 945 ; N uni2B15 ; G 4558\nU 11030 ; WX 769 ; N uni2B16 ; G 4559\nU 11031 ; WX 769 ; N uni2B17 ; G 4560\nU 11032 ; WX 769 ; N uni2B18 ; G 4561\nU 11033 ; WX 769 ; N uni2B19 ; G 4562\nU 11034 ; WX 945 ; N uni2B1A ; G 4563\nU 11039 ; WX 869 ; N uni2B1F ; G 4564\nU 11040 ; WX 869 ; N uni2B20 ; G 4565\nU 11041 ; WX 873 ; N uni2B21 ; G 4566\nU 11042 ; WX 873 ; N uni2B22 ; G 4567\nU 11043 ; WX 873 ; N uni2B23 ; G 4568\nU 11044 ; WX 1119 ; N uni2B24 ; G 4569\nU 11091 ; WX 869 ; N uni2B53 ; G 4570\nU 11092 ; WX 869 ; N uni2B54 ; G 4571\nU 11360 ; WX 637 ; N uni2C60 ; G 4572\nU 11361 ; WX 360 ; N uni2C61 ; G 4573\nU 11362 ; WX 637 ; N uni2C62 ; G 4574\nU 11363 ; WX 733 ; N uni2C63 ; G 4575\nU 11364 ; WX 770 ; N uni2C64 ; G 4576\nU 11365 ; WX 675 ; N uni2C65 ; G 4577\nU 11366 ; WX 478 ; N uni2C66 ; G 4578\nU 11367 ; WX 956 ; N uni2C67 ; G 4579\nU 11368 ; WX 712 ; N uni2C68 ; G 4580\nU 11369 ; WX 775 ; N uni2C69 ; G 4581\nU 11370 ; WX 665 ; N uni2C6A ; G 4582\nU 11371 ; WX 725 ; N uni2C6B ; G 4583\nU 11372 ; WX 582 ; N uni2C6C ; G 4584\nU 11373 ; WX 860 ; N uni2C6D ; G 4585\nU 11374 ; WX 995 ; N uni2C6E ; G 4586\nU 11375 ; WX 774 ; N uni2C6F ; G 4587\nU 11376 ; WX 860 ; N uni2C70 ; G 4588\nU 11377 ; WX 778 ; N uni2C71 ; G 4589\nU 11378 ; WX 1221 ; N uni2C72 ; G 4590\nU 11379 ; WX 1056 ; N uni2C73 ; G 4591\nU 11380 ; WX 652 ; N uni2C74 ; G 4592\nU 11381 ; WX 698 ; N uni2C75 ; G 4593\nU 11382 ; WX 565 ; N uni2C76 ; G 4594\nU 11383 ; WX 782 ; N uni2C77 ; G 4595\nU 11385 ; WX 538 ; N uni2C79 ; G 4596\nU 11386 ; WX 687 ; N uni2C7A ; G 4597\nU 11387 ; WX 559 ; N uni2C7B ; G 4598\nU 11388 ; WX 219 ; N uni2C7C ; G 4599\nU 11389 ; WX 487 ; N uni2C7D ; G 4600\nU 11390 ; WX 720 ; N uni2C7E ; G 4601\nU 11391 ; WX 725 ; N uni2C7F ; G 4602\nU 11520 ; WX 663 ; N uni2D00 ; G 4603\nU 11521 ; WX 676 ; N uni2D01 ; G 4604\nU 11522 ; WX 661 ; N uni2D02 ; G 4605\nU 11523 ; WX 629 ; N uni2D03 ; G 4606\nU 11524 ; WX 661 ; N uni2D04 ; G 4607\nU 11525 ; WX 1032 ; N uni2D05 ; G 4608\nU 11526 ; WX 718 ; N uni2D06 ; G 4609\nU 11527 ; WX 1032 ; N uni2D07 ; G 4610\nU 11528 ; WX 648 ; N uni2D08 ; G 4611\nU 11529 ; WX 667 ; N uni2D09 ; G 4612\nU 11530 ; WX 1032 ; N uni2D0A ; G 4613\nU 11531 ; WX 673 ; N uni2D0B ; G 4614\nU 11532 ; WX 677 ; N uni2D0C ; G 4615\nU 11533 ; WX 1036 ; N uni2D0D ; G 4616\nU 11534 ; WX 680 ; N uni2D0E ; G 4617\nU 11535 ; WX 886 ; N uni2D0F ; G 4618\nU 11536 ; WX 1032 ; N uni2D10 ; G 4619\nU 11537 ; WX 683 ; N uni2D11 ; G 4620\nU 11538 ; WX 674 ; N uni2D12 ; G 4621\nU 11539 ; WX 1035 ; N uni2D13 ; G 4622\nU 11540 ; WX 1033 ; N uni2D14 ; G 4623\nU 11541 ; WX 1027 ; N uni2D15 ; G 4624\nU 11542 ; WX 676 ; N uni2D16 ; G 4625\nU 11543 ; WX 673 ; N uni2D17 ; G 4626\nU 11544 ; WX 667 ; N uni2D18 ; G 4627\nU 11545 ; WX 667 ; N uni2D19 ; G 4628\nU 11546 ; WX 660 ; N uni2D1A ; G 4629\nU 11547 ; WX 671 ; N uni2D1B ; G 4630\nU 11548 ; WX 1039 ; N uni2D1C ; G 4631\nU 11549 ; WX 673 ; N uni2D1D ; G 4632\nU 11550 ; WX 692 ; N uni2D1E ; G 4633\nU 11551 ; WX 659 ; N uni2D1F ; G 4634\nU 11552 ; WX 1048 ; N uni2D20 ; G 4635\nU 11553 ; WX 660 ; N uni2D21 ; G 4636\nU 11554 ; WX 654 ; N uni2D22 ; G 4637\nU 11555 ; WX 670 ; N uni2D23 ; G 4638\nU 11556 ; WX 733 ; N uni2D24 ; G 4639\nU 11557 ; WX 1017 ; N uni2D25 ; G 4640\nU 11568 ; WX 691 ; N uni2D30 ; G 4641\nU 11569 ; WX 941 ; N uni2D31 ; G 4642\nU 11570 ; WX 941 ; N uni2D32 ; G 4643\nU 11571 ; WX 725 ; N uni2D33 ; G 4644\nU 11572 ; WX 725 ; N uni2D34 ; G 4645\nU 11573 ; WX 725 ; N uni2D35 ; G 4646\nU 11574 ; WX 676 ; N uni2D36 ; G 4647\nU 11575 ; WX 774 ; N uni2D37 ; G 4648\nU 11576 ; WX 774 ; N uni2D38 ; G 4649\nU 11577 ; WX 683 ; N uni2D39 ; G 4650\nU 11578 ; WX 683 ; N uni2D3A ; G 4651\nU 11579 ; WX 802 ; N uni2D3B ; G 4652\nU 11580 ; WX 989 ; N uni2D3C ; G 4653\nU 11581 ; WX 761 ; N uni2D3D ; G 4654\nU 11582 ; WX 623 ; N uni2D3E ; G 4655\nU 11583 ; WX 761 ; N uni2D3F ; G 4656\nU 11584 ; WX 941 ; N uni2D40 ; G 4657\nU 11585 ; WX 941 ; N uni2D41 ; G 4658\nU 11586 ; WX 373 ; N uni2D42 ; G 4659\nU 11587 ; WX 740 ; N uni2D43 ; G 4660\nU 11588 ; WX 837 ; N uni2D44 ; G 4661\nU 11589 ; WX 914 ; N uni2D45 ; G 4662\nU 11590 ; WX 672 ; N uni2D46 ; G 4663\nU 11591 ; WX 737 ; N uni2D47 ; G 4664\nU 11592 ; WX 680 ; N uni2D48 ; G 4665\nU 11593 ; WX 683 ; N uni2D49 ; G 4666\nU 11594 ; WX 602 ; N uni2D4A ; G 4667\nU 11595 ; WX 1039 ; N uni2D4B ; G 4668\nU 11596 ; WX 778 ; N uni2D4C ; G 4669\nU 11597 ; WX 837 ; N uni2D4D ; G 4670\nU 11598 ; WX 683 ; N uni2D4E ; G 4671\nU 11599 ; WX 372 ; N uni2D4F ; G 4672\nU 11600 ; WX 778 ; N uni2D50 ; G 4673\nU 11601 ; WX 373 ; N uni2D51 ; G 4674\nU 11602 ; WX 725 ; N uni2D52 ; G 4675\nU 11603 ; WX 691 ; N uni2D53 ; G 4676\nU 11604 ; WX 941 ; N uni2D54 ; G 4677\nU 11605 ; WX 941 ; N uni2D55 ; G 4678\nU 11606 ; WX 837 ; N uni2D56 ; G 4679\nU 11607 ; WX 373 ; N uni2D57 ; G 4680\nU 11608 ; WX 836 ; N uni2D58 ; G 4681\nU 11609 ; WX 941 ; N uni2D59 ; G 4682\nU 11610 ; WX 941 ; N uni2D5A ; G 4683\nU 11611 ; WX 734 ; N uni2D5B ; G 4684\nU 11612 ; WX 876 ; N uni2D5C ; G 4685\nU 11613 ; WX 771 ; N uni2D5D ; G 4686\nU 11614 ; WX 734 ; N uni2D5E ; G 4687\nU 11615 ; WX 683 ; N uni2D5F ; G 4688\nU 11616 ; WX 774 ; N uni2D60 ; G 4689\nU 11617 ; WX 837 ; N uni2D61 ; G 4690\nU 11618 ; WX 683 ; N uni2D62 ; G 4691\nU 11619 ; WX 850 ; N uni2D63 ; G 4692\nU 11620 ; WX 697 ; N uni2D64 ; G 4693\nU 11621 ; WX 850 ; N uni2D65 ; G 4694\nU 11631 ; WX 716 ; N uni2D6F ; G 4695\nU 11800 ; WX 580 ; N uni2E18 ; G 4696\nU 11807 ; WX 838 ; N uni2E1F ; G 4697\nU 11810 ; WX 457 ; N uni2E22 ; G 4698\nU 11811 ; WX 457 ; N uni2E23 ; G 4699\nU 11812 ; WX 457 ; N uni2E24 ; G 4700\nU 11813 ; WX 457 ; N uni2E25 ; G 4701\nU 11822 ; WX 580 ; N uni2E2E ; G 4702\nU 19904 ; WX 896 ; N uni4DC0 ; G 4703\nU 19905 ; WX 896 ; N uni4DC1 ; G 4704\nU 19906 ; WX 896 ; N uni4DC2 ; G 4705\nU 19907 ; WX 896 ; N uni4DC3 ; G 4706\nU 19908 ; WX 896 ; N uni4DC4 ; G 4707\nU 19909 ; WX 896 ; N uni4DC5 ; G 4708\nU 19910 ; WX 896 ; N uni4DC6 ; G 4709\nU 19911 ; WX 896 ; N uni4DC7 ; G 4710\nU 19912 ; WX 896 ; N uni4DC8 ; G 4711\nU 19913 ; WX 896 ; N uni4DC9 ; G 4712\nU 19914 ; WX 896 ; N uni4DCA ; G 4713\nU 19915 ; WX 896 ; N uni4DCB ; G 4714\nU 19916 ; WX 896 ; N uni4DCC ; G 4715\nU 19917 ; WX 896 ; N uni4DCD ; G 4716\nU 19918 ; WX 896 ; N uni4DCE ; G 4717\nU 19919 ; WX 896 ; N uni4DCF ; G 4718\nU 19920 ; WX 896 ; N uni4DD0 ; G 4719\nU 19921 ; WX 896 ; N uni4DD1 ; G 4720\nU 19922 ; WX 896 ; N uni4DD2 ; G 4721\nU 19923 ; WX 896 ; N uni4DD3 ; G 4722\nU 19924 ; WX 896 ; N uni4DD4 ; G 4723\nU 19925 ; WX 896 ; N uni4DD5 ; G 4724\nU 19926 ; WX 896 ; N uni4DD6 ; G 4725\nU 19927 ; WX 896 ; N uni4DD7 ; G 4726\nU 19928 ; WX 896 ; N uni4DD8 ; G 4727\nU 19929 ; WX 896 ; N uni4DD9 ; G 4728\nU 19930 ; WX 896 ; N uni4DDA ; G 4729\nU 19931 ; WX 896 ; N uni4DDB ; G 4730\nU 19932 ; WX 896 ; N uni4DDC ; G 4731\nU 19933 ; WX 896 ; N uni4DDD ; G 4732\nU 19934 ; WX 896 ; N uni4DDE ; G 4733\nU 19935 ; WX 896 ; N uni4DDF ; G 4734\nU 19936 ; WX 896 ; N uni4DE0 ; G 4735\nU 19937 ; WX 896 ; N uni4DE1 ; G 4736\nU 19938 ; WX 896 ; N uni4DE2 ; G 4737\nU 19939 ; WX 896 ; N uni4DE3 ; G 4738\nU 19940 ; WX 896 ; N uni4DE4 ; G 4739\nU 19941 ; WX 896 ; N uni4DE5 ; G 4740\nU 19942 ; WX 896 ; N uni4DE6 ; G 4741\nU 19943 ; WX 896 ; N uni4DE7 ; G 4742\nU 19944 ; WX 896 ; N uni4DE8 ; G 4743\nU 19945 ; WX 896 ; N uni4DE9 ; G 4744\nU 19946 ; WX 896 ; N uni4DEA ; G 4745\nU 19947 ; WX 896 ; N uni4DEB ; G 4746\nU 19948 ; WX 896 ; N uni4DEC ; G 4747\nU 19949 ; WX 896 ; N uni4DED ; G 4748\nU 19950 ; WX 896 ; N uni4DEE ; G 4749\nU 19951 ; WX 896 ; N uni4DEF ; G 4750\nU 19952 ; WX 896 ; N uni4DF0 ; G 4751\nU 19953 ; WX 896 ; N uni4DF1 ; G 4752\nU 19954 ; WX 896 ; N uni4DF2 ; G 4753\nU 19955 ; WX 896 ; N uni4DF3 ; G 4754\nU 19956 ; WX 896 ; N uni4DF4 ; G 4755\nU 19957 ; WX 896 ; N uni4DF5 ; G 4756\nU 19958 ; WX 896 ; N uni4DF6 ; G 4757\nU 19959 ; WX 896 ; N uni4DF7 ; G 4758\nU 19960 ; WX 896 ; N uni4DF8 ; G 4759\nU 19961 ; WX 896 ; N uni4DF9 ; G 4760\nU 19962 ; WX 896 ; N uni4DFA ; G 4761\nU 19963 ; WX 896 ; N uni4DFB ; G 4762\nU 19964 ; WX 896 ; N uni4DFC ; G 4763\nU 19965 ; WX 896 ; N uni4DFD ; G 4764\nU 19966 ; WX 896 ; N uni4DFE ; G 4765\nU 19967 ; WX 896 ; N uni4DFF ; G 4766\nU 42192 ; WX 762 ; N uniA4D0 ; G 4767\nU 42193 ; WX 733 ; N uniA4D1 ; G 4768\nU 42194 ; WX 733 ; N uniA4D2 ; G 4769\nU 42195 ; WX 830 ; N uniA4D3 ; G 4770\nU 42196 ; WX 682 ; N uniA4D4 ; G 4771\nU 42197 ; WX 682 ; N uniA4D5 ; G 4772\nU 42198 ; WX 821 ; N uniA4D6 ; G 4773\nU 42199 ; WX 775 ; N uniA4D7 ; G 4774\nU 42200 ; WX 775 ; N uniA4D8 ; G 4775\nU 42201 ; WX 530 ; N uniA4D9 ; G 4776\nU 42202 ; WX 734 ; N uniA4DA ; G 4777\nU 42203 ; WX 734 ; N uniA4DB ; G 4778\nU 42204 ; WX 725 ; N uniA4DC ; G 4779\nU 42205 ; WX 683 ; N uniA4DD ; G 4780\nU 42206 ; WX 683 ; N uniA4DE ; G 4781\nU 42207 ; WX 995 ; N uniA4DF ; G 4782\nU 42208 ; WX 837 ; N uniA4E0 ; G 4783\nU 42209 ; WX 637 ; N uniA4E1 ; G 4784\nU 42210 ; WX 720 ; N uniA4E2 ; G 4785\nU 42211 ; WX 770 ; N uniA4E3 ; G 4786\nU 42212 ; WX 770 ; N uniA4E4 ; G 4787\nU 42213 ; WX 774 ; N uniA4E5 ; G 4788\nU 42214 ; WX 774 ; N uniA4E6 ; G 4789\nU 42215 ; WX 837 ; N uniA4E7 ; G 4790\nU 42216 ; WX 775 ; N uniA4E8 ; G 4791\nU 42217 ; WX 530 ; N uniA4E9 ; G 4792\nU 42218 ; WX 1103 ; N uniA4EA ; G 4793\nU 42219 ; WX 771 ; N uniA4EB ; G 4794\nU 42220 ; WX 724 ; N uniA4EC ; G 4795\nU 42221 ; WX 762 ; N uniA4ED ; G 4796\nU 42222 ; WX 774 ; N uniA4EE ; G 4797\nU 42223 ; WX 774 ; N uniA4EF ; G 4798\nU 42224 ; WX 683 ; N uniA4F0 ; G 4799\nU 42225 ; WX 683 ; N uniA4F1 ; G 4800\nU 42226 ; WX 372 ; N uniA4F2 ; G 4801\nU 42227 ; WX 850 ; N uniA4F3 ; G 4802\nU 42228 ; WX 812 ; N uniA4F4 ; G 4803\nU 42229 ; WX 812 ; N uniA4F5 ; G 4804\nU 42230 ; WX 557 ; N uniA4F6 ; G 4805\nU 42231 ; WX 830 ; N uniA4F7 ; G 4806\nU 42232 ; WX 322 ; N uniA4F8 ; G 4807\nU 42233 ; WX 322 ; N uniA4F9 ; G 4808\nU 42234 ; WX 674 ; N uniA4FA ; G 4809\nU 42235 ; WX 674 ; N uniA4FB ; G 4810\nU 42236 ; WX 322 ; N uniA4FC ; G 4811\nU 42237 ; WX 322 ; N uniA4FD ; G 4812\nU 42238 ; WX 588 ; N uniA4FE ; G 4813\nU 42239 ; WX 588 ; N uniA4FF ; G 4814\nU 42564 ; WX 720 ; N uniA644 ; G 4815\nU 42565 ; WX 595 ; N uniA645 ; G 4816\nU 42566 ; WX 436 ; N uniA646 ; G 4817\nU 42567 ; WX 440 ; N uniA647 ; G 4818\nU 42572 ; WX 1405 ; N uniA64C ; G 4819\nU 42573 ; WX 1173 ; N uniA64D ; G 4820\nU 42576 ; WX 1234 ; N uniA650 ; G 4821\nU 42577 ; WX 1027 ; N uniA651 ; G 4822\nU 42580 ; WX 1174 ; N uniA654 ; G 4823\nU 42581 ; WX 972 ; N uniA655 ; G 4824\nU 42582 ; WX 1093 ; N uniA656 ; G 4825\nU 42583 ; WX 958 ; N uniA657 ; G 4826\nU 42594 ; WX 1085 ; N uniA662 ; G 4827\nU 42595 ; WX 924 ; N uniA663 ; G 4828\nU 42596 ; WX 1096 ; N uniA664 ; G 4829\nU 42597 ; WX 912 ; N uniA665 ; G 4830\nU 42598 ; WX 1260 ; N uniA666 ; G 4831\nU 42599 ; WX 997 ; N uniA667 ; G 4832\nU 42600 ; WX 850 ; N uniA668 ; G 4833\nU 42601 ; WX 687 ; N uniA669 ; G 4834\nU 42602 ; WX 1037 ; N uniA66A ; G 4835\nU 42603 ; WX 868 ; N uniA66B ; G 4836\nU 42604 ; WX 1406 ; N uniA66C ; G 4837\nU 42605 ; WX 1106 ; N uniA66D ; G 4838\nU 42606 ; WX 961 ; N uniA66E ; G 4839\nU 42634 ; WX 963 ; N uniA68A ; G 4840\nU 42635 ; WX 787 ; N uniA68B ; G 4841\nU 42636 ; WX 682 ; N uniA68C ; G 4842\nU 42637 ; WX 580 ; N uniA68D ; G 4843\nU 42644 ; WX 808 ; N uniA694 ; G 4844\nU 42645 ; WX 712 ; N uniA695 ; G 4845\nU 42648 ; WX 1406 ; N uniA698 ; G 4846\nU 42649 ; WX 1106 ; N uniA699 ; G 4847\nU 42760 ; WX 500 ; N uniA708 ; G 4848\nU 42761 ; WX 500 ; N uniA709 ; G 4849\nU 42762 ; WX 500 ; N uniA70A ; G 4850\nU 42763 ; WX 500 ; N uniA70B ; G 4851\nU 42764 ; WX 500 ; N uniA70C ; G 4852\nU 42765 ; WX 500 ; N uniA70D ; G 4853\nU 42766 ; WX 500 ; N uniA70E ; G 4854\nU 42767 ; WX 500 ; N uniA70F ; G 4855\nU 42768 ; WX 500 ; N uniA710 ; G 4856\nU 42769 ; WX 500 ; N uniA711 ; G 4857\nU 42770 ; WX 500 ; N uniA712 ; G 4858\nU 42771 ; WX 500 ; N uniA713 ; G 4859\nU 42772 ; WX 500 ; N uniA714 ; G 4860\nU 42773 ; WX 500 ; N uniA715 ; G 4861\nU 42774 ; WX 500 ; N uniA716 ; G 4862\nU 42779 ; WX 400 ; N uniA71B ; G 4863\nU 42780 ; WX 400 ; N uniA71C ; G 4864\nU 42781 ; WX 287 ; N uniA71D ; G 4865\nU 42782 ; WX 287 ; N uniA71E ; G 4866\nU 42783 ; WX 287 ; N uniA71F ; G 4867\nU 42786 ; WX 444 ; N uniA722 ; G 4868\nU 42787 ; WX 390 ; N uniA723 ; G 4869\nU 42788 ; WX 540 ; N uniA724 ; G 4870\nU 42789 ; WX 540 ; N uniA725 ; G 4871\nU 42790 ; WX 837 ; N uniA726 ; G 4872\nU 42791 ; WX 712 ; N uniA727 ; G 4873\nU 42792 ; WX 1031 ; N uniA728 ; G 4874\nU 42793 ; WX 857 ; N uniA729 ; G 4875\nU 42794 ; WX 696 ; N uniA72A ; G 4876\nU 42795 ; WX 557 ; N uniA72B ; G 4877\nU 42800 ; WX 559 ; N uniA730 ; G 4878\nU 42801 ; WX 595 ; N uniA731 ; G 4879\nU 42802 ; WX 1349 ; N uniA732 ; G 4880\nU 42803 ; WX 1052 ; N uniA733 ; G 4881\nU 42804 ; WX 1284 ; N uniA734 ; G 4882\nU 42805 ; WX 1064 ; N uniA735 ; G 4883\nU 42806 ; WX 1216 ; N uniA736 ; G 4884\nU 42807 ; WX 1054 ; N uniA737 ; G 4885\nU 42808 ; WX 1079 ; N uniA738 ; G 4886\nU 42809 ; WX 922 ; N uniA739 ; G 4887\nU 42810 ; WX 1079 ; N uniA73A ; G 4888\nU 42811 ; WX 922 ; N uniA73B ; G 4889\nU 42812 ; WX 1035 ; N uniA73C ; G 4890\nU 42813 ; WX 922 ; N uniA73D ; G 4891\nU 42814 ; WX 698 ; N uniA73E ; G 4892\nU 42815 ; WX 549 ; N uniA73F ; G 4893\nU 42816 ; WX 656 ; N uniA740 ; G 4894\nU 42817 ; WX 688 ; N uniA741 ; G 4895\nU 42822 ; WX 850 ; N uniA746 ; G 4896\nU 42823 ; WX 542 ; N uniA747 ; G 4897\nU 42824 ; WX 683 ; N uniA748 ; G 4898\nU 42825 ; WX 531 ; N uniA749 ; G 4899\nU 42826 ; WX 918 ; N uniA74A ; G 4900\nU 42827 ; WX 814 ; N uniA74B ; G 4901\nU 42830 ; WX 1406 ; N uniA74E ; G 4902\nU 42831 ; WX 1106 ; N uniA74F ; G 4903\nU 42832 ; WX 733 ; N uniA750 ; G 4904\nU 42833 ; WX 716 ; N uniA751 ; G 4905\nU 42834 ; WX 948 ; N uniA752 ; G 4906\nU 42835 ; WX 937 ; N uniA753 ; G 4907\nU 42838 ; WX 850 ; N uniA756 ; G 4908\nU 42839 ; WX 716 ; N uniA757 ; G 4909\nU 42852 ; WX 738 ; N uniA764 ; G 4910\nU 42853 ; WX 716 ; N uniA765 ; G 4911\nU 42854 ; WX 738 ; N uniA766 ; G 4912\nU 42855 ; WX 716 ; N uniA767 ; G 4913\nU 42880 ; WX 637 ; N uniA780 ; G 4914\nU 42881 ; WX 343 ; N uniA781 ; G 4915\nU 42882 ; WX 837 ; N uniA782 ; G 4916\nU 42883 ; WX 712 ; N uniA783 ; G 4917\nU 42889 ; WX 400 ; N uniA789 ; G 4918\nU 42890 ; WX 386 ; N uniA78A ; G 4919\nU 42891 ; WX 456 ; N uniA78B ; G 4920\nU 42892 ; WX 306 ; N uniA78C ; G 4921\nU 42893 ; WX 808 ; N uniA78D ; G 4922\nU 42894 ; WX 693 ; N uniA78E ; G 4923\nU 42896 ; WX 928 ; N uniA790 ; G 4924\nU 42897 ; WX 768 ; N uniA791 ; G 4925\nU 42912 ; WX 821 ; N uniA7A0 ; G 4926\nU 42913 ; WX 716 ; N uniA7A1 ; G 4927\nU 42914 ; WX 775 ; N uniA7A2 ; G 4928\nU 42915 ; WX 665 ; N uniA7A3 ; G 4929\nU 42916 ; WX 837 ; N uniA7A4 ; G 4930\nU 42917 ; WX 712 ; N uniA7A5 ; G 4931\nU 42918 ; WX 770 ; N uniA7A6 ; G 4932\nU 42919 ; WX 493 ; N uniA7A7 ; G 4933\nU 42920 ; WX 720 ; N uniA7A8 ; G 4934\nU 42921 ; WX 595 ; N uniA7A9 ; G 4935\nU 42922 ; WX 886 ; N uniA7AA ; G 4936\nU 43000 ; WX 613 ; N uniA7F8 ; G 4937\nU 43001 ; WX 689 ; N uniA7F9 ; G 4938\nU 43002 ; WX 1062 ; N uniA7FA ; G 4939\nU 43003 ; WX 683 ; N uniA7FB ; G 4940\nU 43004 ; WX 733 ; N uniA7FC ; G 4941\nU 43005 ; WX 995 ; N uniA7FD ; G 4942\nU 43006 ; WX 372 ; N uniA7FE ; G 4943\nU 43007 ; WX 1325 ; N uniA7FF ; G 4944\nU 61184 ; WX 216 ; N uni02E5.5 ; G 4945\nU 61185 ; WX 242 ; N uni02E6.5 ; G 4946\nU 61186 ; WX 267 ; N uni02E7.5 ; G 4947\nU 61187 ; WX 277 ; N uni02E8.5 ; G 4948\nU 61188 ; WX 282 ; N uni02E9.5 ; G 4949\nU 61189 ; WX 242 ; N uni02E5.4 ; G 4950\nU 61190 ; WX 216 ; N uni02E6.4 ; G 4951\nU 61191 ; WX 242 ; N uni02E7.4 ; G 4952\nU 61192 ; WX 267 ; N uni02E8.4 ; G 4953\nU 61193 ; WX 277 ; N uni02E9.4 ; G 4954\nU 61194 ; WX 267 ; N uni02E5.3 ; G 4955\nU 61195 ; WX 242 ; N uni02E6.3 ; G 4956\nU 61196 ; WX 216 ; N uni02E7.3 ; G 4957\nU 61197 ; WX 242 ; N uni02E8.3 ; G 4958\nU 61198 ; WX 267 ; N uni02E9.3 ; G 4959\nU 61199 ; WX 277 ; N uni02E5.2 ; G 4960\nU 61200 ; WX 267 ; N uni02E6.2 ; G 4961\nU 61201 ; WX 242 ; N uni02E7.2 ; G 4962\nU 61202 ; WX 216 ; N uni02E8.2 ; G 4963\nU 61203 ; WX 242 ; N uni02E9.2 ; G 4964\nU 61204 ; WX 282 ; N uni02E5.1 ; G 4965\nU 61205 ; WX 277 ; N uni02E6.1 ; G 4966\nU 61206 ; WX 267 ; N uni02E7.1 ; G 4967\nU 61207 ; WX 242 ; N uni02E8.1 ; G 4968\nU 61208 ; WX 216 ; N uni02E9.1 ; G 4969\nU 61209 ; WX 282 ; N stem ; G 4970\nU 62464 ; WX 612 ; N uniF400 ; G 4971\nU 62465 ; WX 612 ; N uniF401 ; G 4972\nU 62466 ; WX 653 ; N uniF402 ; G 4973\nU 62467 ; WX 902 ; N uniF403 ; G 4974\nU 62468 ; WX 622 ; N uniF404 ; G 4975\nU 62469 ; WX 622 ; N uniF405 ; G 4976\nU 62470 ; WX 661 ; N uniF406 ; G 4977\nU 62471 ; WX 895 ; N uniF407 ; G 4978\nU 62472 ; WX 589 ; N uniF408 ; G 4979\nU 62473 ; WX 622 ; N uniF409 ; G 4980\nU 62474 ; WX 1163 ; N uniF40A ; G 4981\nU 62475 ; WX 626 ; N uniF40B ; G 4982\nU 62476 ; WX 627 ; N uniF40C ; G 4983\nU 62477 ; WX 893 ; N uniF40D ; G 4984\nU 62478 ; WX 612 ; N uniF40E ; G 4985\nU 62479 ; WX 626 ; N uniF40F ; G 4986\nU 62480 ; WX 924 ; N uniF410 ; G 4987\nU 62481 ; WX 627 ; N uniF411 ; G 4988\nU 62482 ; WX 744 ; N uniF412 ; G 4989\nU 62483 ; WX 634 ; N uniF413 ; G 4990\nU 62484 ; WX 886 ; N uniF414 ; G 4991\nU 62485 ; WX 626 ; N uniF415 ; G 4992\nU 62486 ; WX 907 ; N uniF416 ; G 4993\nU 62487 ; WX 626 ; N uniF417 ; G 4994\nU 62488 ; WX 621 ; N uniF418 ; G 4995\nU 62489 ; WX 628 ; N uniF419 ; G 4996\nU 62490 ; WX 677 ; N uniF41A ; G 4997\nU 62491 ; WX 626 ; N uniF41B ; G 4998\nU 62492 ; WX 621 ; N uniF41C ; G 4999\nU 62493 ; WX 630 ; N uniF41D ; G 5000\nU 62494 ; WX 627 ; N uniF41E ; G 5001\nU 62495 ; WX 571 ; N uniF41F ; G 5002\nU 62496 ; WX 622 ; N uniF420 ; G 5003\nU 62497 ; WX 631 ; N uniF421 ; G 5004\nU 62498 ; WX 612 ; N uniF422 ; G 5005\nU 62499 ; WX 611 ; N uniF423 ; G 5006\nU 62500 ; WX 618 ; N uniF424 ; G 5007\nU 62501 ; WX 671 ; N uniF425 ; G 5008\nU 62502 ; WX 963 ; N uniF426 ; G 5009\nU 62504 ; WX 1023 ; N uniF428 ; G 5010\nU 62505 ; WX 844 ; N uniF429 ; G 5011\nU 62506 ; WX 563 ; N uniF42A ; G 5012\nU 62507 ; WX 563 ; N uniF42B ; G 5013\nU 62508 ; WX 563 ; N uniF42C ; G 5014\nU 62509 ; WX 563 ; N uniF42D ; G 5015\nU 62510 ; WX 563 ; N uniF42E ; G 5016\nU 62511 ; WX 563 ; N uniF42F ; G 5017\nU 62512 ; WX 555 ; N uniF430 ; G 5018\nU 62513 ; WX 555 ; N uniF431 ; G 5019\nU 62514 ; WX 555 ; N uniF432 ; G 5020\nU 62515 ; WX 555 ; N uniF433 ; G 5021\nU 62516 ; WX 573 ; N uniF434 ; G 5022\nU 62517 ; WX 573 ; N uniF435 ; G 5023\nU 62518 ; WX 573 ; N uniF436 ; G 5024\nU 62519 ; WX 824 ; N uniF437 ; G 5025\nU 62520 ; WX 824 ; N uniF438 ; G 5026\nU 62521 ; WX 824 ; N uniF439 ; G 5027\nU 62522 ; WX 824 ; N uniF43A ; G 5028\nU 62523 ; WX 824 ; N uniF43B ; G 5029\nU 62524 ; WX 611 ; N uniF43C ; G 5030\nU 62525 ; WX 611 ; N uniF43D ; G 5031\nU 62526 ; WX 611 ; N uniF43E ; G 5032\nU 62527 ; WX 611 ; N uniF43F ; G 5033\nU 62528 ; WX 611 ; N uniF440 ; G 5034\nU 62529 ; WX 611 ; N uniF441 ; G 5035\nU 63173 ; WX 687 ; N uniF6C5 ; G 5036\nU 64256 ; WX 810 ; N uniFB00 ; G 5037\nU 64257 ; WX 741 ; N fi ; G 5038\nU 64258 ; WX 741 ; N fl ; G 5039\nU 64259 ; WX 1115 ; N uniFB03 ; G 5040\nU 64260 ; WX 1116 ; N uniFB04 ; G 5041\nU 64261 ; WX 808 ; N uniFB05 ; G 5042\nU 64262 ; WX 1020 ; N uniFB06 ; G 5043\nU 64275 ; WX 1388 ; N uniFB13 ; G 5044\nU 64276 ; WX 1384 ; N uniFB14 ; G 5045\nU 64277 ; WX 1378 ; N uniFB15 ; G 5046\nU 64278 ; WX 1384 ; N uniFB16 ; G 5047\nU 64279 ; WX 1713 ; N uniFB17 ; G 5048\nU 64285 ; WX 294 ; N uniFB1D ; G 5049\nU 64286 ; WX 0 ; N uniFB1E ; G 5050\nU 64287 ; WX 519 ; N uniFB1F ; G 5051\nU 64288 ; WX 665 ; N uniFB20 ; G 5052\nU 64289 ; WX 939 ; N uniFB21 ; G 5053\nU 64290 ; WX 788 ; N uniFB22 ; G 5054\nU 64291 ; WX 920 ; N uniFB23 ; G 5055\nU 64292 ; WX 786 ; N uniFB24 ; G 5056\nU 64293 ; WX 857 ; N uniFB25 ; G 5057\nU 64294 ; WX 869 ; N uniFB26 ; G 5058\nU 64295 ; WX 821 ; N uniFB27 ; G 5059\nU 64296 ; WX 890 ; N uniFB28 ; G 5060\nU 64297 ; WX 838 ; N uniFB29 ; G 5061\nU 64298 ; WX 758 ; N uniFB2A ; G 5062\nU 64299 ; WX 758 ; N uniFB2B ; G 5063\nU 64300 ; WX 758 ; N uniFB2C ; G 5064\nU 64301 ; WX 758 ; N uniFB2D ; G 5065\nU 64302 ; WX 728 ; N uniFB2E ; G 5066\nU 64303 ; WX 728 ; N uniFB2F ; G 5067\nU 64304 ; WX 728 ; N uniFB30 ; G 5068\nU 64305 ; WX 610 ; N uniFB31 ; G 5069\nU 64306 ; WX 447 ; N uniFB32 ; G 5070\nU 64307 ; WX 588 ; N uniFB33 ; G 5071\nU 64308 ; WX 687 ; N uniFB34 ; G 5072\nU 64309 ; WX 437 ; N uniFB35 ; G 5073\nU 64310 ; WX 485 ; N uniFB36 ; G 5074\nU 64312 ; WX 679 ; N uniFB38 ; G 5075\nU 64313 ; WX 435 ; N uniFB39 ; G 5076\nU 64314 ; WX 578 ; N uniFB3A ; G 5077\nU 64315 ; WX 566 ; N uniFB3B ; G 5078\nU 64316 ; WX 605 ; N uniFB3C ; G 5079\nU 64318 ; WX 724 ; N uniFB3E ; G 5080\nU 64320 ; WX 453 ; N uniFB40 ; G 5081\nU 64321 ; WX 680 ; N uniFB41 ; G 5082\nU 64323 ; WX 675 ; N uniFB43 ; G 5083\nU 64324 ; WX 658 ; N uniFB44 ; G 5084\nU 64326 ; WX 653 ; N uniFB46 ; G 5085\nU 64327 ; WX 736 ; N uniFB47 ; G 5086\nU 64328 ; WX 602 ; N uniFB48 ; G 5087\nU 64329 ; WX 758 ; N uniFB49 ; G 5088\nU 64330 ; WX 683 ; N uniFB4A ; G 5089\nU 64331 ; WX 343 ; N uniFB4B ; G 5090\nU 64332 ; WX 610 ; N uniFB4C ; G 5091\nU 64333 ; WX 566 ; N uniFB4D ; G 5092\nU 64334 ; WX 658 ; N uniFB4E ; G 5093\nU 64335 ; WX 710 ; N uniFB4F ; G 5094\nU 64338 ; WX 1005 ; N uniFB52 ; G 5095\nU 64339 ; WX 1059 ; N uniFB53 ; G 5096\nU 64340 ; WX 375 ; N uniFB54 ; G 5097\nU 64341 ; WX 408 ; N uniFB55 ; G 5098\nU 64342 ; WX 1005 ; N uniFB56 ; G 5099\nU 64343 ; WX 1059 ; N uniFB57 ; G 5100\nU 64344 ; WX 375 ; N uniFB58 ; G 5101\nU 64345 ; WX 408 ; N uniFB59 ; G 5102\nU 64346 ; WX 1005 ; N uniFB5A ; G 5103\nU 64347 ; WX 1059 ; N uniFB5B ; G 5104\nU 64348 ; WX 375 ; N uniFB5C ; G 5105\nU 64349 ; WX 408 ; N uniFB5D ; G 5106\nU 64350 ; WX 1005 ; N uniFB5E ; G 5107\nU 64351 ; WX 1059 ; N uniFB5F ; G 5108\nU 64352 ; WX 375 ; N uniFB60 ; G 5109\nU 64353 ; WX 408 ; N uniFB61 ; G 5110\nU 64354 ; WX 1005 ; N uniFB62 ; G 5111\nU 64355 ; WX 1059 ; N uniFB63 ; G 5112\nU 64356 ; WX 375 ; N uniFB64 ; G 5113\nU 64357 ; WX 408 ; N uniFB65 ; G 5114\nU 64358 ; WX 1005 ; N uniFB66 ; G 5115\nU 64359 ; WX 1059 ; N uniFB67 ; G 5116\nU 64360 ; WX 375 ; N uniFB68 ; G 5117\nU 64361 ; WX 408 ; N uniFB69 ; G 5118\nU 64362 ; WX 1162 ; N uniFB6A ; G 5119\nU 64363 ; WX 1191 ; N uniFB6B ; G 5120\nU 64364 ; WX 655 ; N uniFB6C ; G 5121\nU 64365 ; WX 720 ; N uniFB6D ; G 5122\nU 64366 ; WX 1162 ; N uniFB6E ; G 5123\nU 64367 ; WX 1191 ; N uniFB6F ; G 5124\nU 64368 ; WX 655 ; N uniFB70 ; G 5125\nU 64369 ; WX 720 ; N uniFB71 ; G 5126\nU 64370 ; WX 721 ; N uniFB72 ; G 5127\nU 64371 ; WX 721 ; N uniFB73 ; G 5128\nU 64372 ; WX 721 ; N uniFB74 ; G 5129\nU 64373 ; WX 721 ; N uniFB75 ; G 5130\nU 64374 ; WX 721 ; N uniFB76 ; G 5131\nU 64375 ; WX 721 ; N uniFB77 ; G 5132\nU 64376 ; WX 721 ; N uniFB78 ; G 5133\nU 64377 ; WX 721 ; N uniFB79 ; G 5134\nU 64378 ; WX 721 ; N uniFB7A ; G 5135\nU 64379 ; WX 721 ; N uniFB7B ; G 5136\nU 64380 ; WX 721 ; N uniFB7C ; G 5137\nU 64381 ; WX 721 ; N uniFB7D ; G 5138\nU 64382 ; WX 721 ; N uniFB7E ; G 5139\nU 64383 ; WX 721 ; N uniFB7F ; G 5140\nU 64384 ; WX 721 ; N uniFB80 ; G 5141\nU 64385 ; WX 721 ; N uniFB81 ; G 5142\nU 64386 ; WX 513 ; N uniFB82 ; G 5143\nU 64387 ; WX 578 ; N uniFB83 ; G 5144\nU 64388 ; WX 513 ; N uniFB84 ; G 5145\nU 64389 ; WX 578 ; N uniFB85 ; G 5146\nU 64390 ; WX 513 ; N uniFB86 ; G 5147\nU 64391 ; WX 578 ; N uniFB87 ; G 5148\nU 64392 ; WX 513 ; N uniFB88 ; G 5149\nU 64393 ; WX 578 ; N uniFB89 ; G 5150\nU 64394 ; WX 576 ; N uniFB8A ; G 5151\nU 64395 ; WX 622 ; N uniFB8B ; G 5152\nU 64396 ; WX 576 ; N uniFB8C ; G 5153\nU 64397 ; WX 622 ; N uniFB8D ; G 5154\nU 64398 ; WX 1024 ; N uniFB8E ; G 5155\nU 64399 ; WX 1024 ; N uniFB8F ; G 5156\nU 64400 ; WX 582 ; N uniFB90 ; G 5157\nU 64401 ; WX 582 ; N uniFB91 ; G 5158\nU 64402 ; WX 1024 ; N uniFB92 ; G 5159\nU 64403 ; WX 1024 ; N uniFB93 ; G 5160\nU 64404 ; WX 582 ; N uniFB94 ; G 5161\nU 64405 ; WX 582 ; N uniFB95 ; G 5162\nU 64406 ; WX 1024 ; N uniFB96 ; G 5163\nU 64407 ; WX 1024 ; N uniFB97 ; G 5164\nU 64408 ; WX 582 ; N uniFB98 ; G 5165\nU 64409 ; WX 582 ; N uniFB99 ; G 5166\nU 64410 ; WX 1024 ; N uniFB9A ; G 5167\nU 64411 ; WX 1024 ; N uniFB9B ; G 5168\nU 64412 ; WX 582 ; N uniFB9C ; G 5169\nU 64413 ; WX 582 ; N uniFB9D ; G 5170\nU 64414 ; WX 854 ; N uniFB9E ; G 5171\nU 64415 ; WX 900 ; N uniFB9F ; G 5172\nU 64416 ; WX 854 ; N uniFBA0 ; G 5173\nU 64417 ; WX 900 ; N uniFBA1 ; G 5174\nU 64418 ; WX 375 ; N uniFBA2 ; G 5175\nU 64419 ; WX 408 ; N uniFBA3 ; G 5176\nU 64426 ; WX 938 ; N uniFBAA ; G 5177\nU 64427 ; WX 880 ; N uniFBAB ; G 5178\nU 64428 ; WX 693 ; N uniFBAC ; G 5179\nU 64429 ; WX 660 ; N uniFBAD ; G 5180\nU 64467 ; WX 824 ; N uniFBD3 ; G 5181\nU 64468 ; WX 843 ; N uniFBD4 ; G 5182\nU 64469 ; WX 476 ; N uniFBD5 ; G 5183\nU 64470 ; WX 552 ; N uniFBD6 ; G 5184\nU 64471 ; WX 622 ; N uniFBD7 ; G 5185\nU 64472 ; WX 627 ; N uniFBD8 ; G 5186\nU 64473 ; WX 622 ; N uniFBD9 ; G 5187\nU 64474 ; WX 627 ; N uniFBDA ; G 5188\nU 64475 ; WX 622 ; N uniFBDB ; G 5189\nU 64476 ; WX 627 ; N uniFBDC ; G 5190\nU 64478 ; WX 622 ; N uniFBDE ; G 5191\nU 64479 ; WX 627 ; N uniFBDF ; G 5192\nU 64484 ; WX 917 ; N uniFBE4 ; G 5193\nU 64485 ; WX 1012 ; N uniFBE5 ; G 5194\nU 64486 ; WX 375 ; N uniFBE6 ; G 5195\nU 64487 ; WX 408 ; N uniFBE7 ; G 5196\nU 64488 ; WX 375 ; N uniFBE8 ; G 5197\nU 64489 ; WX 408 ; N uniFBE9 ; G 5198\nU 64508 ; WX 917 ; N uniFBFC ; G 5199\nU 64509 ; WX 1012 ; N uniFBFD ; G 5200\nU 64510 ; WX 375 ; N uniFBFE ; G 5201\nU 64511 ; WX 408 ; N uniFBFF ; G 5202\nU 65024 ; WX 0 ; N uniFE00 ; G 5203\nU 65025 ; WX 0 ; N uniFE01 ; G 5204\nU 65026 ; WX 0 ; N uniFE02 ; G 5205\nU 65027 ; WX 0 ; N uniFE03 ; G 5206\nU 65028 ; WX 0 ; N uniFE04 ; G 5207\nU 65029 ; WX 0 ; N uniFE05 ; G 5208\nU 65030 ; WX 0 ; N uniFE06 ; G 5209\nU 65031 ; WX 0 ; N uniFE07 ; G 5210\nU 65032 ; WX 0 ; N uniFE08 ; G 5211\nU 65033 ; WX 0 ; N uniFE09 ; G 5212\nU 65034 ; WX 0 ; N uniFE0A ; G 5213\nU 65035 ; WX 0 ; N uniFE0B ; G 5214\nU 65036 ; WX 0 ; N uniFE0C ; G 5215\nU 65037 ; WX 0 ; N uniFE0D ; G 5216\nU 65038 ; WX 0 ; N uniFE0E ; G 5217\nU 65039 ; WX 0 ; N uniFE0F ; G 5218\nU 65056 ; WX 0 ; N uniFE20 ; G 5219\nU 65057 ; WX 0 ; N uniFE21 ; G 5220\nU 65058 ; WX 0 ; N uniFE22 ; G 5221\nU 65059 ; WX 0 ; N uniFE23 ; G 5222\nU 65136 ; WX 342 ; N uniFE70 ; G 5223\nU 65137 ; WX 342 ; N uniFE71 ; G 5224\nU 65138 ; WX 342 ; N uniFE72 ; G 5225\nU 65139 ; WX 346 ; N uniFE73 ; G 5226\nU 65140 ; WX 342 ; N uniFE74 ; G 5227\nU 65142 ; WX 342 ; N uniFE76 ; G 5228\nU 65143 ; WX 342 ; N uniFE77 ; G 5229\nU 65144 ; WX 342 ; N uniFE78 ; G 5230\nU 65145 ; WX 342 ; N uniFE79 ; G 5231\nU 65146 ; WX 342 ; N uniFE7A ; G 5232\nU 65147 ; WX 342 ; N uniFE7B ; G 5233\nU 65148 ; WX 342 ; N uniFE7C ; G 5234\nU 65149 ; WX 342 ; N uniFE7D ; G 5235\nU 65150 ; WX 342 ; N uniFE7E ; G 5236\nU 65151 ; WX 342 ; N uniFE7F ; G 5237\nU 65152 ; WX 511 ; N uniFE80 ; G 5238\nU 65153 ; WX 343 ; N uniFE81 ; G 5239\nU 65154 ; WX 375 ; N uniFE82 ; G 5240\nU 65155 ; WX 343 ; N uniFE83 ; G 5241\nU 65156 ; WX 375 ; N uniFE84 ; G 5242\nU 65157 ; WX 622 ; N uniFE85 ; G 5243\nU 65158 ; WX 627 ; N uniFE86 ; G 5244\nU 65159 ; WX 343 ; N uniFE87 ; G 5245\nU 65160 ; WX 375 ; N uniFE88 ; G 5246\nU 65161 ; WX 917 ; N uniFE89 ; G 5247\nU 65162 ; WX 917 ; N uniFE8A ; G 5248\nU 65163 ; WX 375 ; N uniFE8B ; G 5249\nU 65164 ; WX 408 ; N uniFE8C ; G 5250\nU 65165 ; WX 343 ; N uniFE8D ; G 5251\nU 65166 ; WX 375 ; N uniFE8E ; G 5252\nU 65167 ; WX 1005 ; N uniFE8F ; G 5253\nU 65168 ; WX 1059 ; N uniFE90 ; G 5254\nU 65169 ; WX 375 ; N uniFE91 ; G 5255\nU 65170 ; WX 408 ; N uniFE92 ; G 5256\nU 65171 ; WX 590 ; N uniFE93 ; G 5257\nU 65172 ; WX 606 ; N uniFE94 ; G 5258\nU 65173 ; WX 1005 ; N uniFE95 ; G 5259\nU 65174 ; WX 1059 ; N uniFE96 ; G 5260\nU 65175 ; WX 375 ; N uniFE97 ; G 5261\nU 65176 ; WX 408 ; N uniFE98 ; G 5262\nU 65177 ; WX 1005 ; N uniFE99 ; G 5263\nU 65178 ; WX 1059 ; N uniFE9A ; G 5264\nU 65179 ; WX 375 ; N uniFE9B ; G 5265\nU 65180 ; WX 408 ; N uniFE9C ; G 5266\nU 65181 ; WX 721 ; N uniFE9D ; G 5267\nU 65182 ; WX 721 ; N uniFE9E ; G 5268\nU 65183 ; WX 721 ; N uniFE9F ; G 5269\nU 65184 ; WX 721 ; N uniFEA0 ; G 5270\nU 65185 ; WX 721 ; N uniFEA1 ; G 5271\nU 65186 ; WX 721 ; N uniFEA2 ; G 5272\nU 65187 ; WX 721 ; N uniFEA3 ; G 5273\nU 65188 ; WX 721 ; N uniFEA4 ; G 5274\nU 65189 ; WX 721 ; N uniFEA5 ; G 5275\nU 65190 ; WX 721 ; N uniFEA6 ; G 5276\nU 65191 ; WX 721 ; N uniFEA7 ; G 5277\nU 65192 ; WX 721 ; N uniFEA8 ; G 5278\nU 65193 ; WX 513 ; N uniFEA9 ; G 5279\nU 65194 ; WX 578 ; N uniFEAA ; G 5280\nU 65195 ; WX 513 ; N uniFEAB ; G 5281\nU 65196 ; WX 578 ; N uniFEAC ; G 5282\nU 65197 ; WX 576 ; N uniFEAD ; G 5283\nU 65198 ; WX 622 ; N uniFEAE ; G 5284\nU 65199 ; WX 576 ; N uniFEAF ; G 5285\nU 65200 ; WX 622 ; N uniFEB0 ; G 5286\nU 65201 ; WX 1380 ; N uniFEB1 ; G 5287\nU 65202 ; WX 1414 ; N uniFEB2 ; G 5288\nU 65203 ; WX 983 ; N uniFEB3 ; G 5289\nU 65204 ; WX 1018 ; N uniFEB4 ; G 5290\nU 65205 ; WX 1380 ; N uniFEB5 ; G 5291\nU 65206 ; WX 1414 ; N uniFEB6 ; G 5292\nU 65207 ; WX 983 ; N uniFEB7 ; G 5293\nU 65208 ; WX 1018 ; N uniFEB8 ; G 5294\nU 65209 ; WX 1345 ; N uniFEB9 ; G 5295\nU 65210 ; WX 1364 ; N uniFEBA ; G 5296\nU 65211 ; WX 966 ; N uniFEBB ; G 5297\nU 65212 ; WX 985 ; N uniFEBC ; G 5298\nU 65213 ; WX 1345 ; N uniFEBD ; G 5299\nU 65214 ; WX 1364 ; N uniFEBE ; G 5300\nU 65215 ; WX 966 ; N uniFEBF ; G 5301\nU 65216 ; WX 985 ; N uniFEC0 ; G 5302\nU 65217 ; WX 1039 ; N uniFEC1 ; G 5303\nU 65218 ; WX 1071 ; N uniFEC2 ; G 5304\nU 65219 ; WX 942 ; N uniFEC3 ; G 5305\nU 65220 ; WX 974 ; N uniFEC4 ; G 5306\nU 65221 ; WX 1039 ; N uniFEC5 ; G 5307\nU 65222 ; WX 1071 ; N uniFEC6 ; G 5308\nU 65223 ; WX 942 ; N uniFEC7 ; G 5309\nU 65224 ; WX 974 ; N uniFEC8 ; G 5310\nU 65225 ; WX 683 ; N uniFEC9 ; G 5311\nU 65226 ; WX 683 ; N uniFECA ; G 5312\nU 65227 ; WX 683 ; N uniFECB ; G 5313\nU 65228 ; WX 564 ; N uniFECC ; G 5314\nU 65229 ; WX 683 ; N uniFECD ; G 5315\nU 65230 ; WX 683 ; N uniFECE ; G 5316\nU 65231 ; WX 683 ; N uniFECF ; G 5317\nU 65232 ; WX 564 ; N uniFED0 ; G 5318\nU 65233 ; WX 1162 ; N uniFED1 ; G 5319\nU 65234 ; WX 1191 ; N uniFED2 ; G 5320\nU 65235 ; WX 655 ; N uniFED3 ; G 5321\nU 65236 ; WX 720 ; N uniFED4 ; G 5322\nU 65237 ; WX 894 ; N uniFED5 ; G 5323\nU 65238 ; WX 901 ; N uniFED6 ; G 5324\nU 65239 ; WX 655 ; N uniFED7 ; G 5325\nU 65240 ; WX 720 ; N uniFED8 ; G 5326\nU 65241 ; WX 917 ; N uniFED9 ; G 5327\nU 65242 ; WX 931 ; N uniFEDA ; G 5328\nU 65243 ; WX 582 ; N uniFEDB ; G 5329\nU 65244 ; WX 582 ; N uniFEDC ; G 5330\nU 65245 ; WX 868 ; N uniFEDD ; G 5331\nU 65246 ; WX 893 ; N uniFEDE ; G 5332\nU 65247 ; WX 375 ; N uniFEDF ; G 5333\nU 65248 ; WX 408 ; N uniFEE0 ; G 5334\nU 65249 ; WX 733 ; N uniFEE1 ; G 5335\nU 65250 ; WX 784 ; N uniFEE2 ; G 5336\nU 65251 ; WX 619 ; N uniFEE3 ; G 5337\nU 65252 ; WX 670 ; N uniFEE4 ; G 5338\nU 65253 ; WX 854 ; N uniFEE5 ; G 5339\nU 65254 ; WX 900 ; N uniFEE6 ; G 5340\nU 65255 ; WX 375 ; N uniFEE7 ; G 5341\nU 65256 ; WX 408 ; N uniFEE8 ; G 5342\nU 65257 ; WX 590 ; N uniFEE9 ; G 5343\nU 65258 ; WX 606 ; N uniFEEA ; G 5344\nU 65259 ; WX 693 ; N uniFEEB ; G 5345\nU 65260 ; WX 660 ; N uniFEEC ; G 5346\nU 65261 ; WX 622 ; N uniFEED ; G 5347\nU 65262 ; WX 627 ; N uniFEEE ; G 5348\nU 65263 ; WX 917 ; N uniFEEF ; G 5349\nU 65264 ; WX 1012 ; N uniFEF0 ; G 5350\nU 65265 ; WX 917 ; N uniFEF1 ; G 5351\nU 65266 ; WX 1012 ; N uniFEF2 ; G 5352\nU 65267 ; WX 375 ; N uniFEF3 ; G 5353\nU 65268 ; WX 408 ; N uniFEF4 ; G 5354\nU 65269 ; WX 745 ; N uniFEF5 ; G 5355\nU 65270 ; WX 759 ; N uniFEF6 ; G 5356\nU 65271 ; WX 745 ; N uniFEF7 ; G 5357\nU 65272 ; WX 759 ; N uniFEF8 ; G 5358\nU 65273 ; WX 745 ; N uniFEF9 ; G 5359\nU 65274 ; WX 759 ; N uniFEFA ; G 5360\nU 65275 ; WX 745 ; N uniFEFB ; G 5361\nU 65276 ; WX 759 ; N uniFEFC ; G 5362\nU 65279 ; WX 0 ; N uniFEFF ; G 5363\nU 65529 ; WX 0 ; N uniFFF9 ; G 5364\nU 65530 ; WX 0 ; N uniFFFA ; G 5365\nU 65531 ; WX 0 ; N uniFFFB ; G 5366\nU 65532 ; WX 0 ; N uniFFFC ; G 5367\nU 65533 ; WX 1113 ; N uniFFFD ; G 5368\nEndCharMetrics\nStartKernData \nStartKernPairs 1538\n\nKPX dollar seven -159\nKPX dollar eight -63\nKPX dollar nine -139\nKPX dollar colon -92\nKPX dollar less -196\nKPX dollar Y -73\nKPX dollar backslash -73\nKPX dollar questiondown -73\nKPX dollar Aacute -73\nKPX dollar Hcircumflex -159\nKPX dollar Hbar -159\nKPX dollar Imacron -63\nKPX dollar Ibreve -63\nKPX dollar Iogonek -63\nKPX dollar Idot -63\nKPX dollar IJ -63\nKPX dollar Kcommaaccent -92\nKPX dollar kgreenlandic -196\nKPX dollar Lacute -73\nKPX dollar lacute -196\nKPX dollar uni01DC -159\nKPX dollar uni01F4 -196\nKPX dollar uni01F5 -73\n\nKPX percent nine -83\nKPX percent colon -112\nKPX percent less -112\nKPX percent Kcommaaccent -112\nKPX percent kgreenlandic -112\nKPX percent lacute -112\nKPX percent uni01F4 -112\n\nKPX ampersand six 38\nKPX ampersand Gcircumflex 38\nKPX ampersand Gbreve 38\nKPX ampersand Gdotaccent 38\nKPX ampersand Gcommaaccent 38\nKPX ampersand uni01DA 38\n\nKPX quotesingle less -149\nKPX quotesingle kgreenlandic -149\nKPX quotesingle lacute -149\nKPX quotesingle uni01F4 -149\n\nKPX parenright dollar -235\nKPX parenright D -120\nKPX parenright H -83\nKPX parenright R -83\nKPX parenright U -131\nKPX parenright X -102\nKPX parenright backslash -112\nKPX parenright cent -120\nKPX parenright sterling -120\nKPX parenright currency -120\nKPX parenright yen -120\nKPX parenright brokenbar -120\nKPX parenright section -120\nKPX parenright dieresis -120\nKPX parenright ordfeminine -83\nKPX parenright guillemotleft -83\nKPX parenright logicalnot -83\nKPX parenright sfthyphen -83\nKPX parenright acute -83\nKPX parenright mu -83\nKPX parenright paragraph -83\nKPX parenright periodcentered -83\nKPX parenright cedilla -83\nKPX parenright ordmasculine -83\nKPX parenright guillemotright -102\nKPX parenright onequarter -102\nKPX parenright onehalf -102\nKPX parenright threequarters -102\nKPX parenright questiondown -112\nKPX parenright Aacute -112\nKPX parenright Acircumflex -235\nKPX parenright Atilde -120\nKPX parenright Adieresis -235\nKPX parenright Aring -120\nKPX parenright AE -235\nKPX parenright Ccedilla -120\nKPX parenright Otilde -83\nKPX parenright multiply -83\nKPX parenright Ugrave -83\nKPX parenright Ucircumflex -83\nKPX parenright Yacute -83\nKPX parenright dcaron -83\nKPX parenright dmacron -83\nKPX parenright emacron -83\nKPX parenright ebreve -83\nKPX parenright edotaccent -131\nKPX parenright eogonek -131\nKPX parenright ecaron -131\nKPX parenright imacron -102\nKPX parenright ibreve -102\nKPX parenright iogonek -102\nKPX parenright dotlessi -102\nKPX parenright ij -102\nKPX parenright jcircumflex -102\nKPX parenright Lacute -112\nKPX parenright uni01A5 -120\nKPX parenright uni01AD -83\nKPX parenright Uhorn -83\nKPX parenright uni01F1 -83\nKPX parenright uni01F5 -112\n\nKPX asterisk seven -36\nKPX asterisk less -45\nKPX asterisk Hbar -36\nKPX asterisk lacute -45\n\nKPX period ampersand -92\nKPX period two -92\nKPX period eight -36\nKPX period H -36\nKPX period R -36\nKPX period X -36\nKPX period backslash -131\nKPX period ordfeminine -36\nKPX period guillemotleft -36\nKPX period logicalnot -36\nKPX period sfthyphen -36\nKPX period acute -36\nKPX period mu -36\nKPX period paragraph -36\nKPX period periodcentered -36\nKPX period cedilla -36\nKPX period ordmasculine -36\nKPX period guillemotright -36\nKPX period onequarter -36\nKPX period onehalf -36\nKPX period threequarters -36\nKPX period questiondown -131\nKPX period Aacute -131\nKPX period Egrave -92\nKPX period Icircumflex -92\nKPX period Yacute -36\nKPX period Ebreve -102\nKPX period ebreve -36\nKPX period Idot -36\nKPX period dotlessi -36\n\nKPX slash two -73\nKPX slash seven -339\nKPX slash eight -73\nKPX slash nine -282\nKPX slash colon -159\nKPX slash less -319\nKPX slash backslash -139\nKPX slash questiondown -139\nKPX slash Aacute -139\nKPX slash Ebreve -73\nKPX slash Hbar -339\nKPX slash Idot -73\nKPX slash lacute -319\n\nKPX two dollar -55\nKPX two nine -55\nKPX two semicolon -73\nKPX two less -73\nKPX two lacute -73\n\nKPX three dollar -188\nKPX three D -55\nKPX three V -36\nKPX three backslash 38\nKPX three cent -55\nKPX three sterling -55\nKPX three currency -55\nKPX three yen -55\nKPX three brokenbar -55\nKPX three section -55\nKPX three dieresis -55\nKPX three questiondown 38\nKPX three Aacute 38\nKPX three gdotaccent -36\nKPX three gcommaaccent -36\n\n\nKPX five seven -92\nKPX five less -112\nKPX five backslash -92\nKPX five questiondown -92\nKPX five Aacute -92\nKPX five Hbar -92\nKPX five lacute -112\n\nKPX six six -92\nKPX six Gdotaccent -92\nKPX six Gcommaaccent -92\n\nKPX seven dollar -159\nKPX seven seven 47\nKPX seven D -264\nKPX seven F -272\nKPX seven H -272\nKPX seven R -272\nKPX seven U -225\nKPX seven V -272\nKPX seven X -225\nKPX seven Z -225\nKPX seven backslash -243\nKPX seven cent -164\nKPX seven sterling -264\nKPX seven currency -164\nKPX seven yen -164\nKPX seven brokenbar -164\nKPX seven section -164\nKPX seven dieresis -196\nKPX seven copyright -272\nKPX seven ordfeminine -212\nKPX seven guillemotleft -272\nKPX seven logicalnot -212\nKPX seven sfthyphen -212\nKPX seven acute -192\nKPX seven mu -272\nKPX seven paragraph -192\nKPX seven periodcentered -192\nKPX seven cedilla -192\nKPX seven ordmasculine -159\nKPX seven guillemotright -195\nKPX seven onequarter -225\nKPX seven onehalf -195\nKPX seven threequarters -195\nKPX seven questiondown -243\nKPX seven Aacute -243\nKPX seven Eacute -272\nKPX seven Idieresis -272\nKPX seven Yacute -272\nKPX seven ebreve -159\nKPX seven edotaccent -225\nKPX seven ecaron -225\nKPX seven gdotaccent -272\nKPX seven gcommaaccent -272\nKPX seven dotlessi -225\n\nKPX eight dollar -63\n\nKPX nine dollar -139\nKPX nine two -36\nKPX nine D -112\nKPX nine H -112\nKPX nine L -36\nKPX nine R -112\nKPX nine X -73\nKPX nine cent -112\nKPX nine sterling -112\nKPX nine currency -112\nKPX nine yen -112\nKPX nine brokenbar -112\nKPX nine section -112\nKPX nine dieresis -112\nKPX nine ordfeminine -112\nKPX nine guillemotleft -112\nKPX nine logicalnot -112\nKPX nine sfthyphen -112\nKPX nine acute -112\nKPX nine mu -112\nKPX nine paragraph -112\nKPX nine periodcentered -112\nKPX nine cedilla -112\nKPX nine ordmasculine -112\nKPX nine guillemotright -73\nKPX nine onequarter -73\nKPX nine onehalf -73\nKPX nine threequarters -73\nKPX nine Yacute -112\nKPX nine Ebreve -36\nKPX nine ebreve -112\nKPX nine dotlessi -73\n\nKPX colon dollar -92\nKPX colon D -73\nKPX colon H -73\nKPX colon R -73\nKPX colon U -36\nKPX colon cent -73\nKPX colon sterling -73\nKPX colon currency -73\nKPX colon yen -73\nKPX colon brokenbar -73\nKPX colon section -73\nKPX colon dieresis -73\nKPX colon ordfeminine -73\nKPX colon guillemotleft -73\nKPX colon logicalnot -73\nKPX colon sfthyphen -73\nKPX colon acute -73\nKPX colon mu -73\nKPX colon paragraph -73\nKPX colon periodcentered -73\nKPX colon cedilla -73\nKPX colon ordmasculine -73\nKPX colon Yacute -73\nKPX colon ebreve -73\nKPX colon edotaccent -36\nKPX colon ecaron -36\n\nKPX semicolon ampersand -73\nKPX semicolon two -73\nKPX semicolon H -55\nKPX semicolon ordfeminine -55\nKPX semicolon guillemotleft -55\nKPX semicolon logicalnot -55\nKPX semicolon sfthyphen -55\nKPX semicolon Egrave -73\nKPX semicolon Icircumflex -73\nKPX semicolon Yacute -55\nKPX semicolon Ebreve -73\n\nKPX less dollar -196\nKPX less ampersand -73\nKPX less two -73\nKPX less D -188\nKPX less H -188\nKPX less R -188\nKPX less X -149\nKPX less cent -188\nKPX less sterling -188\nKPX less currency -188\nKPX less yen -188\nKPX less brokenbar -188\nKPX less section -188\nKPX less dieresis -188\nKPX less ordfeminine -188\nKPX less guillemotleft -188\nKPX less logicalnot -188\nKPX less sfthyphen -188\nKPX less acute -188\nKPX less mu -188\nKPX less paragraph -188\nKPX less periodcentered -188\nKPX less cedilla -188\nKPX less ordmasculine -188\nKPX less guillemotright -149\nKPX less onequarter -149\nKPX less onehalf -149\nKPX less threequarters -149\nKPX less Egrave -73\nKPX less Icircumflex -73\nKPX less Yacute -188\nKPX less Ebreve -92\nKPX less ebreve -188\nKPX less dotlessi -149\n\n\nKPX D backslash -63\nKPX D questiondown -63\nKPX D Aacute -63\n\n\nKPX N H -55\nKPX N R -55\nKPX N ordfeminine -55\nKPX N guillemotleft -55\nKPX N logicalnot -55\nKPX N sfthyphen -55\nKPX N acute -55\nKPX N mu -55\nKPX N paragraph -55\nKPX N periodcentered -55\nKPX N cedilla -55\nKPX N ordmasculine -45\nKPX N Yacute -55\nKPX N ebreve -55\n\n\n\n\n\nKPX cent backslash -63\nKPX cent questiondown -63\nKPX cent Aacute -63\n\nKPX sterling backslash -63\nKPX sterling questiondown -63\nKPX sterling Aacute -63\n\nKPX currency backslash -63\nKPX currency questiondown -63\nKPX currency Aacute -63\n\nKPX yen backslash -63\nKPX yen questiondown -63\nKPX yen Aacute -63\n\nKPX brokenbar backslash -63\nKPX brokenbar questiondown -63\nKPX brokenbar Aacute -63\n\nKPX section backslash -63\nKPX section questiondown -63\nKPX section Aacute -63\n\n\n\nKPX Acircumflex seven -159\nKPX Acircumflex eight -63\nKPX Acircumflex nine -139\nKPX Acircumflex colon -92\nKPX Acircumflex less -196\nKPX Acircumflex Y -73\nKPX Acircumflex backslash -73\nKPX Acircumflex questiondown -73\nKPX Acircumflex Aacute -73\nKPX Acircumflex Hcircumflex -159\nKPX Acircumflex Hbar -159\nKPX Acircumflex Imacron -63\nKPX Acircumflex Ibreve -63\nKPX Acircumflex Iogonek -63\nKPX Acircumflex Idot -63\nKPX Acircumflex IJ -63\nKPX Acircumflex Kcommaaccent -92\nKPX Acircumflex kgreenlandic -196\nKPX Acircumflex Lacute -73\nKPX Acircumflex lacute -196\nKPX Acircumflex uni01DC -159\nKPX Acircumflex uni01F4 -196\nKPX Acircumflex uni01F5 -73\n\nKPX Adieresis seven -159\nKPX Adieresis eight -63\nKPX Adieresis nine -139\nKPX Adieresis colon -92\nKPX Adieresis less -196\nKPX Adieresis Y -73\nKPX Adieresis backslash -73\nKPX Adieresis questiondown -73\nKPX Adieresis Aacute -73\nKPX Adieresis Hcircumflex -159\nKPX Adieresis Hbar -159\nKPX Adieresis Imacron -63\nKPX Adieresis Ibreve -63\nKPX Adieresis Iogonek -63\nKPX Adieresis Idot -63\nKPX Adieresis IJ -63\nKPX Adieresis Kcommaaccent -92\nKPX Adieresis kgreenlandic -196\nKPX Adieresis Lacute -73\nKPX Adieresis lacute -196\nKPX Adieresis uni01DC -159\nKPX Adieresis uni01F4 -196\nKPX Adieresis uni01F5 -73\n\nKPX AE seven -159\nKPX AE eight -63\nKPX AE nine -139\nKPX AE colon -92\nKPX AE less -196\nKPX AE Y -73\nKPX AE backslash -73\nKPX AE questiondown -73\nKPX AE Aacute -73\nKPX AE Hcircumflex -159\nKPX AE Hbar -159\nKPX AE Imacron -63\nKPX AE Ibreve -63\nKPX AE Iogonek -63\nKPX AE Idot -63\nKPX AE IJ -63\nKPX AE Kcommaaccent -92\nKPX AE kgreenlandic -196\nKPX AE Lacute -73\nKPX AE lacute -196\nKPX AE uni01DC -159\nKPX AE uni01F4 -196\nKPX AE uni01F5 -73\n\nKPX Egrave six 38\nKPX Egrave Gcircumflex 38\nKPX Egrave Gbreve 38\nKPX Egrave Gdotaccent 38\nKPX Egrave Gcommaaccent 38\nKPX Egrave uni01DA 38\n\nKPX Ecircumflex six 38\nKPX Ecircumflex Gcircumflex 38\nKPX Ecircumflex Gbreve 38\nKPX Ecircumflex Gdotaccent 38\nKPX Ecircumflex Gcommaaccent 38\nKPX Ecircumflex uni01DA 38\n\nKPX Igrave six 38\nKPX Igrave Gcircumflex 38\nKPX Igrave Gbreve 38\nKPX Igrave Gdotaccent 38\nKPX Igrave Gcommaaccent 38\nKPX Igrave uni01DA 38\n\nKPX Icircumflex six 38\nKPX Icircumflex Gcircumflex 38\nKPX Icircumflex Gbreve 38\nKPX Icircumflex Gdotaccent 38\nKPX Icircumflex Gcommaaccent 38\nKPX Icircumflex uni01DA 38\n\nKPX Eth less -149\nKPX Eth kgreenlandic -149\nKPX Eth lacute -149\nKPX Eth uni01F4 -149\n\nKPX Ograve less -149\nKPX Ograve kgreenlandic -149\nKPX Ograve lacute -149\nKPX Ograve uni01F4 -149\n\nKPX agrave seven -36\nKPX agrave less -45\nKPX agrave Hbar -36\nKPX agrave lacute -45\n\nKPX ucircumflex two -73\nKPX ucircumflex seven -339\nKPX ucircumflex eight -73\nKPX ucircumflex nine -282\nKPX ucircumflex colon -159\nKPX ucircumflex less -319\nKPX ucircumflex backslash -139\nKPX ucircumflex questiondown -139\nKPX ucircumflex Aacute -139\nKPX ucircumflex Ebreve -73\nKPX ucircumflex Hbar -339\nKPX ucircumflex Idot -73\nKPX ucircumflex lacute -319\n\nKPX ydieresis two -73\nKPX ydieresis seven -339\nKPX ydieresis eight -73\nKPX ydieresis nine -282\nKPX ydieresis colon -159\nKPX ydieresis less -319\nKPX ydieresis backslash -139\nKPX ydieresis questiondown -139\nKPX ydieresis Aacute -139\nKPX ydieresis Ebreve -73\nKPX ydieresis Hbar -339\nKPX ydieresis Idot -73\nKPX ydieresis lacute -319\n\nKPX Abreve O -246\n\nKPX abreve two -73\nKPX abreve seven -339\nKPX abreve eight -73\nKPX abreve nine -282\nKPX abreve colon -159\nKPX abreve less -319\nKPX abreve backslash -139\nKPX abreve questiondown -139\nKPX abreve Aacute -139\nKPX abreve Ebreve -73\nKPX abreve Hbar -339\nKPX abreve Idot -73\nKPX abreve lacute -319\n\nKPX Edotaccent seven -92\nKPX Edotaccent less -112\nKPX Edotaccent backslash -92\nKPX Edotaccent questiondown -92\nKPX Edotaccent Aacute -92\nKPX Edotaccent Hbar -92\nKPX Edotaccent lacute -112\n\n\nKPX Ecaron seven -92\nKPX Ecaron less -112\nKPX Ecaron backslash -92\nKPX Ecaron questiondown -92\nKPX Ecaron Aacute -92\nKPX Ecaron Hbar -92\nKPX Ecaron lacute -112\n\n\nKPX Gdotaccent six -92\nKPX Gdotaccent Gdotaccent -92\nKPX Gdotaccent Gcommaaccent -92\n\nKPX Gcommaaccent six -92\nKPX Gcommaaccent Gdotaccent -92\nKPX Gcommaaccent Gcommaaccent -92\n\nKPX Hbar dollar -159\nKPX Hbar seven 47\nKPX Hbar D -264\nKPX Hbar F -272\nKPX Hbar H -272\nKPX Hbar R -272\nKPX Hbar U -225\nKPX Hbar V -272\nKPX Hbar X -225\nKPX Hbar Z -225\nKPX Hbar backslash -243\nKPX Hbar cent -264\nKPX Hbar sterling -264\nKPX Hbar currency -264\nKPX Hbar yen -264\nKPX Hbar brokenbar -264\nKPX Hbar section -264\nKPX Hbar dieresis -196\nKPX Hbar copyright -272\nKPX Hbar ordfeminine -272\nKPX Hbar guillemotleft -272\nKPX Hbar logicalnot -272\nKPX Hbar sfthyphen -272\nKPX Hbar acute -272\nKPX Hbar mu -272\nKPX Hbar paragraph -272\nKPX Hbar periodcentered -272\nKPX Hbar cedilla -272\nKPX Hbar ordmasculine -159\nKPX Hbar guillemotright -225\nKPX Hbar onequarter -225\nKPX Hbar onehalf -225\nKPX Hbar threequarters -225\nKPX Hbar questiondown -243\nKPX Hbar Aacute -243\nKPX Hbar Eacute -272\nKPX Hbar Idieresis -272\nKPX Hbar Yacute -272\nKPX Hbar ebreve -159\nKPX Hbar edotaccent -225\nKPX Hbar ecaron -225\nKPX Hbar gdotaccent -272\nKPX Hbar gcommaaccent -272\nKPX Hbar Hbar 47\nKPX Hbar dotlessi -225\n\nKPX Idot dollar -63\n\nKPX lacute dollar -196\nKPX lacute ampersand -73\nKPX lacute two -73\nKPX lacute D -188\nKPX lacute H -188\nKPX lacute R -188\nKPX lacute X -149\nKPX lacute cent -188\nKPX lacute sterling -188\nKPX lacute currency -188\nKPX lacute yen -188\nKPX lacute brokenbar -188\nKPX lacute section -188\nKPX lacute dieresis -188\nKPX lacute ordfeminine -188\nKPX lacute guillemotleft -188\nKPX lacute logicalnot -188\nKPX lacute sfthyphen -188\nKPX lacute acute -188\nKPX lacute mu -188\nKPX lacute paragraph -188\nKPX lacute periodcentered -188\nKPX lacute cedilla -188\nKPX lacute ordmasculine -188\nKPX lacute guillemotright -149\nKPX lacute onequarter -149\nKPX lacute onehalf -149\nKPX lacute threequarters -149\nKPX lacute Egrave -73\nKPX lacute Icircumflex -73\nKPX lacute Yacute -188\nKPX lacute Ebreve -92\nKPX lacute ebreve -188\nKPX lacute dotlessi -149\n\n\nKPX uni027D dollar -235\nKPX uni027D hyphen -92\nKPX uni027D nine 38\nKPX uni027D less 75\nKPX uni027D lacute 75\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSans-Bold.ufm.php",
    "content": "<?php return array (\n  'codeToName' => \n  array (\n    32 => 'space',\n    33 => 'exclam',\n    34 => 'quotedbl',\n    35 => 'numbersign',\n    36 => 'dollar',\n    37 => 'percent',\n    38 => 'ampersand',\n    39 => 'quotesingle',\n    40 => 'parenleft',\n    41 => 'parenright',\n    42 => 'asterisk',\n    43 => 'plus',\n    44 => 'comma',\n    45 => 'hyphen',\n    46 => 'period',\n    47 => 'slash',\n    48 => 'zero',\n    49 => 'one',\n    50 => 'two',\n    51 => 'three',\n    52 => 'four',\n    53 => 'five',\n    54 => 'six',\n    55 => 'seven',\n    56 => 'eight',\n    57 => 'nine',\n    58 => 'colon',\n    59 => 'semicolon',\n    60 => 'less',\n    61 => 'equal',\n    62 => 'greater',\n    63 => 'question',\n    64 => 'at',\n    65 => 'A',\n    66 => 'B',\n    67 => 'C',\n    68 => 'D',\n    69 => 'E',\n    70 => 'F',\n    71 => 'G',\n    72 => 'H',\n    73 => 'I',\n    74 => 'J',\n    75 => 'K',\n    76 => 'L',\n    77 => 'M',\n    78 => 'N',\n    79 => 'O',\n    80 => 'P',\n    81 => 'Q',\n    82 => 'R',\n    83 => 'S',\n    84 => 'T',\n    85 => 'U',\n    86 => 'V',\n    87 => 'W',\n    88 => 'X',\n    89 => 'Y',\n    90 => 'Z',\n    91 => 'bracketleft',\n    92 => 'backslash',\n    93 => 'bracketright',\n    94 => 'asciicircum',\n    95 => 'underscore',\n    96 => 'grave',\n    97 => 'a',\n    98 => 'b',\n    99 => 'c',\n    100 => 'd',\n    101 => 'e',\n    102 => 'f',\n    103 => 'g',\n    104 => 'h',\n    105 => 'i',\n    106 => 'j',\n    107 => 'k',\n    108 => 'l',\n    109 => 'm',\n    110 => 'n',\n    111 => 'o',\n    112 => 'p',\n    113 => 'q',\n    114 => 'r',\n    115 => 's',\n    116 => 't',\n    117 => 'u',\n    118 => 'v',\n    119 => 'w',\n    120 => 'x',\n    121 => 'y',\n    122 => 'z',\n    123 => 'braceleft',\n    124 => 'bar',\n    125 => 'braceright',\n    126 => 'asciitilde',\n    160 => 'nbspace',\n    161 => 'exclamdown',\n    162 => 'cent',\n    163 => 'sterling',\n    164 => 'currency',\n    165 => 'yen',\n    166 => 'brokenbar',\n    167 => 'section',\n    168 => 'dieresis',\n    169 => 'copyright',\n    170 => 'ordfeminine',\n    171 => 'guillemotleft',\n    172 => 'logicalnot',\n    173 => 'sfthyphen',\n    174 => 'registered',\n    175 => 'macron',\n    176 => 'degree',\n    177 => 'plusminus',\n    178 => 'twosuperior',\n    179 => 'threesuperior',\n    180 => 'acute',\n    181 => 'mu',\n    182 => 'paragraph',\n    183 => 'periodcentered',\n    184 => 'cedilla',\n    185 => 'onesuperior',\n    186 => 'ordmasculine',\n    187 => 'guillemotright',\n    188 => 'onequarter',\n    189 => 'onehalf',\n    190 => 'threequarters',\n    191 => 'questiondown',\n    192 => 'Agrave',\n    193 => 'Aacute',\n    194 => 'Acircumflex',\n    195 => 'Atilde',\n    196 => 'Adieresis',\n    197 => 'Aring',\n    198 => 'AE',\n    199 => 'Ccedilla',\n    200 => 'Egrave',\n    201 => 'Eacute',\n    202 => 'Ecircumflex',\n    203 => 'Edieresis',\n    204 => 'Igrave',\n    205 => 'Iacute',\n    206 => 'Icircumflex',\n    207 => 'Idieresis',\n    208 => 'Eth',\n    209 => 'Ntilde',\n    210 => 'Ograve',\n    211 => 'Oacute',\n    212 => 'Ocircumflex',\n    213 => 'Otilde',\n    214 => 'Odieresis',\n    215 => 'multiply',\n    216 => 'Oslash',\n    217 => 'Ugrave',\n    218 => 'Uacute',\n    219 => 'Ucircumflex',\n    220 => 'Udieresis',\n    221 => 'Yacute',\n    222 => 'Thorn',\n    223 => 'germandbls',\n    224 => 'agrave',\n    225 => 'aacute',\n    226 => 'acircumflex',\n    227 => 'atilde',\n    228 => 'adieresis',\n    229 => 'aring',\n    230 => 'ae',\n    231 => 'ccedilla',\n    232 => 'egrave',\n    233 => 'eacute',\n    234 => 'ecircumflex',\n    235 => 'edieresis',\n    236 => 'igrave',\n    237 => 'iacute',\n    238 => 'icircumflex',\n    239 => 'idieresis',\n    240 => 'eth',\n    241 => 'ntilde',\n    242 => 'ograve',\n    243 => 'oacute',\n    244 => 'ocircumflex',\n    245 => 'otilde',\n    246 => 'odieresis',\n    247 => 'divide',\n    248 => 'oslash',\n    249 => 'ugrave',\n    250 => 'uacute',\n    251 => 'ucircumflex',\n    252 => 'udieresis',\n    253 => 'yacute',\n    254 => 'thorn',\n    255 => 'ydieresis',\n    256 => 'Amacron',\n    257 => 'amacron',\n    258 => 'Abreve',\n    259 => 'abreve',\n    260 => 'Aogonek',\n    261 => 'aogonek',\n    262 => 'Cacute',\n    263 => 'cacute',\n    264 => 'Ccircumflex',\n    265 => 'ccircumflex',\n    266 => 'Cdotaccent',\n    267 => 'cdotaccent',\n    268 => 'Ccaron',\n    269 => 'ccaron',\n    270 => 'Dcaron',\n    271 => 'dcaron',\n    272 => 'Dcroat',\n    273 => 'dmacron',\n    274 => 'Emacron',\n    275 => 'emacron',\n    276 => 'Ebreve',\n    277 => 'ebreve',\n    278 => 'Edotaccent',\n    279 => 'edotaccent',\n    280 => 'Eogonek',\n    281 => 'eogonek',\n    282 => 'Ecaron',\n    283 => 'ecaron',\n    284 => 'Gcircumflex',\n    285 => 'gcircumflex',\n    286 => 'Gbreve',\n    287 => 'gbreve',\n    288 => 'Gdotaccent',\n    289 => 'gdotaccent',\n    290 => 'Gcommaaccent',\n    291 => 'gcommaaccent',\n    292 => 'Hcircumflex',\n    293 => 'hcircumflex',\n    294 => 'Hbar',\n    295 => 'hbar',\n    296 => 'Itilde',\n    297 => 'itilde',\n    298 => 'Imacron',\n    299 => 'imacron',\n    300 => 'Ibreve',\n    301 => 'ibreve',\n    302 => 'Iogonek',\n    303 => 'iogonek',\n    304 => 'Idot',\n    305 => 'dotlessi',\n    306 => 'IJ',\n    307 => 'ij',\n    308 => 'Jcircumflex',\n    309 => 'jcircumflex',\n    310 => 'Kcommaaccent',\n    311 => 'kcommaaccent',\n    312 => 'kgreenlandic',\n    313 => 'Lacute',\n    314 => 'lacute',\n    315 => 'Lcommaaccent',\n    316 => 'lcommaaccent',\n    317 => 'Lcaron',\n    318 => 'lcaron',\n    319 => 'Ldot',\n    320 => 'ldot',\n    321 => 'Lslash',\n    322 => 'lslash',\n    323 => 'Nacute',\n    324 => 'nacute',\n    325 => 'Ncommaaccent',\n    326 => 'ncommaaccent',\n    327 => 'Ncaron',\n    328 => 'ncaron',\n    329 => 'napostrophe',\n    330 => 'Eng',\n    331 => 'eng',\n    332 => 'Omacron',\n    333 => 'omacron',\n    334 => 'Obreve',\n    335 => 'obreve',\n    336 => 'Ohungarumlaut',\n    337 => 'ohungarumlaut',\n    338 => 'OE',\n    339 => 'oe',\n    340 => 'Racute',\n    341 => 'racute',\n    342 => 'Rcommaaccent',\n    343 => 'rcommaaccent',\n    344 => 'Rcaron',\n    345 => 'rcaron',\n    346 => 'Sacute',\n    347 => 'sacute',\n    348 => 'Scircumflex',\n    349 => 'scircumflex',\n    350 => 'Scedilla',\n    351 => 'scedilla',\n    352 => 'Scaron',\n    353 => 'scaron',\n    354 => 'Tcommaaccent',\n    355 => 'tcommaaccent',\n    356 => 'Tcaron',\n    357 => 'tcaron',\n    358 => 'Tbar',\n    359 => 'tbar',\n    360 => 'Utilde',\n    361 => 'utilde',\n    362 => 'Umacron',\n    363 => 'umacron',\n    364 => 'Ubreve',\n    365 => 'ubreve',\n    366 => 'Uring',\n    367 => 'uring',\n    368 => 'Uhungarumlaut',\n    369 => 'uhungarumlaut',\n    370 => 'Uogonek',\n    371 => 'uogonek',\n    372 => 'Wcircumflex',\n    373 => 'wcircumflex',\n    374 => 'Ycircumflex',\n    375 => 'ycircumflex',\n    376 => 'Ydieresis',\n    377 => 'Zacute',\n    378 => 'zacute',\n    379 => 'Zdotaccent',\n    380 => 'zdotaccent',\n    381 => 'Zcaron',\n    382 => 'zcaron',\n    383 => 'longs',\n    384 => 'uni0180',\n    385 => 'uni0181',\n    386 => 'uni0182',\n    387 => 'uni0183',\n    388 => 'uni0184',\n    389 => 'uni0185',\n    390 => 'uni0186',\n    391 => 'uni0187',\n    392 => 'uni0188',\n    393 => 'uni0189',\n    394 => 'uni018A',\n    395 => 'uni018B',\n    396 => 'uni018C',\n    397 => 'uni018D',\n    398 => 'uni018E',\n    399 => 'uni018F',\n    400 => 'uni0190',\n    401 => 'uni0191',\n    402 => 'florin',\n    403 => 'uni0193',\n    404 => 'uni0194',\n    405 => 'uni0195',\n    406 => 'uni0196',\n    407 => 'uni0197',\n    408 => 'uni0198',\n    409 => 'uni0199',\n    410 => 'uni019A',\n    411 => 'uni019B',\n    412 => 'uni019C',\n    413 => 'uni019D',\n    414 => 'uni019E',\n    415 => 'uni019F',\n    416 => 'Ohorn',\n    417 => 'ohorn',\n    418 => 'uni01A2',\n    419 => 'uni01A3',\n    420 => 'uni01A4',\n    421 => 'uni01A5',\n    422 => 'uni01A6',\n    423 => 'uni01A7',\n    424 => 'uni01A8',\n    425 => 'uni01A9',\n    426 => 'uni01AA',\n    427 => 'uni01AB',\n    428 => 'uni01AC',\n    429 => 'uni01AD',\n    430 => 'uni01AE',\n    431 => 'Uhorn',\n    432 => 'uhorn',\n    433 => 'uni01B1',\n    434 => 'uni01B2',\n    435 => 'uni01B3',\n    436 => 'uni01B4',\n    437 => 'uni01B5',\n    438 => 'uni01B6',\n    439 => 'uni01B7',\n    440 => 'uni01B8',\n    441 => 'uni01B9',\n    442 => 'uni01BA',\n    443 => 'uni01BB',\n    444 => 'uni01BC',\n    445 => 'uni01BD',\n    446 => 'uni01BE',\n    447 => 'uni01BF',\n    448 => 'uni01C0',\n    449 => 'uni01C1',\n    450 => 'uni01C2',\n    451 => 'uni01C3',\n    452 => 'uni01C4',\n    453 => 'uni01C5',\n    454 => 'uni01C6',\n    455 => 'uni01C7',\n    456 => 'uni01C8',\n    457 => 'uni01C9',\n    458 => 'uni01CA',\n    459 => 'uni01CB',\n    460 => 'uni01CC',\n    461 => 'uni01CD',\n    462 => 'uni01CE',\n    463 => 'uni01CF',\n    464 => 'uni01D0',\n    465 => 'uni01D1',\n    466 => 'uni01D2',\n    467 => 'uni01D3',\n    468 => 'uni01D4',\n    469 => 'uni01D5',\n    470 => 'uni01D6',\n    471 => 'uni01D7',\n    472 => 'uni01D8',\n    473 => 'uni01D9',\n    474 => 'uni01DA',\n    475 => 'uni01DB',\n    476 => 'uni01DC',\n    477 => 'uni01DD',\n    478 => 'uni01DE',\n    479 => 'uni01DF',\n    480 => 'uni01E0',\n    481 => 'uni01E1',\n    482 => 'uni01E2',\n    483 => 'uni01E3',\n    484 => 'uni01E4',\n    485 => 'uni01E5',\n    486 => 'Gcaron',\n    487 => 'gcaron',\n    488 => 'uni01E8',\n    489 => 'uni01E9',\n    490 => 'uni01EA',\n    491 => 'uni01EB',\n    492 => 'uni01EC',\n    493 => 'uni01ED',\n    494 => 'uni01EE',\n    495 => 'uni01EF',\n    496 => 'uni01F0',\n    497 => 'uni01F1',\n    498 => 'uni01F2',\n    499 => 'uni01F3',\n    500 => 'uni01F4',\n    501 => 'uni01F5',\n    502 => 'uni01F6',\n    503 => 'uni01F7',\n    504 => 'uni01F8',\n    505 => 'uni01F9',\n    506 => 'Aringacute',\n    507 => 'aringacute',\n    508 => 'AEacute',\n    509 => 'aeacute',\n    510 => 'Oslashacute',\n    511 => 'oslashacute',\n    512 => 'uni0200',\n    513 => 'uni0201',\n    514 => 'uni0202',\n    515 => 'uni0203',\n    516 => 'uni0204',\n    517 => 'uni0205',\n    518 => 'uni0206',\n    519 => 'uni0207',\n    520 => 'uni0208',\n    521 => 'uni0209',\n    522 => 'uni020A',\n    523 => 'uni020B',\n    524 => 'uni020C',\n    525 => 'uni020D',\n    526 => 'uni020E',\n    527 => 'uni020F',\n    528 => 'uni0210',\n    529 => 'uni0211',\n    530 => 'uni0212',\n    531 => 'uni0213',\n    532 => 'uni0214',\n    533 => 'uni0215',\n    534 => 'uni0216',\n    535 => 'uni0217',\n    536 => 'Scommaaccent',\n    537 => 'scommaaccent',\n    538 => 'uni021A',\n    539 => 'uni021B',\n    540 => 'uni021C',\n    541 => 'uni021D',\n    542 => 'uni021E',\n    543 => 'uni021F',\n    544 => 'uni0220',\n    545 => 'uni0221',\n    546 => 'uni0222',\n    547 => 'uni0223',\n    548 => 'uni0224',\n    549 => 'uni0225',\n    550 => 'uni0226',\n    551 => 'uni0227',\n    552 => 'uni0228',\n    553 => 'uni0229',\n    554 => 'uni022A',\n    555 => 'uni022B',\n    556 => 'uni022C',\n    557 => 'uni022D',\n    558 => 'uni022E',\n    559 => 'uni022F',\n    560 => 'uni0230',\n    561 => 'uni0231',\n    562 => 'uni0232',\n    563 => 'uni0233',\n    564 => 'uni0234',\n    565 => 'uni0235',\n    566 => 'uni0236',\n    567 => 'dotlessj',\n    568 => 'uni0238',\n    569 => 'uni0239',\n    570 => 'uni023A',\n    571 => 'uni023B',\n    572 => 'uni023C',\n    573 => 'uni023D',\n    574 => 'uni023E',\n    575 => 'uni023F',\n    576 => 'uni0240',\n    577 => 'uni0241',\n    578 => 'uni0242',\n    579 => 'uni0243',\n    580 => 'uni0244',\n    581 => 'uni0245',\n    582 => 'uni0246',\n    583 => 'uni0247',\n    584 => 'uni0248',\n    585 => 'uni0249',\n    586 => 'uni024A',\n    587 => 'uni024B',\n    588 => 'uni024C',\n    589 => 'uni024D',\n    590 => 'uni024E',\n    591 => 'uni024F',\n    592 => 'uni0250',\n    593 => 'uni0251',\n    594 => 'uni0252',\n    595 => 'uni0253',\n    596 => 'uni0254',\n    597 => 'uni0255',\n    598 => 'uni0256',\n    599 => 'uni0257',\n    600 => 'uni0258',\n    601 => 'uni0259',\n    602 => 'uni025A',\n    603 => 'uni025B',\n    604 => 'uni025C',\n    605 => 'uni025D',\n    606 => 'uni025E',\n    607 => 'uni025F',\n    608 => 'uni0260',\n    609 => 'uni0261',\n    610 => 'uni0262',\n    611 => 'uni0263',\n    612 => 'uni0264',\n    613 => 'uni0265',\n    614 => 'uni0266',\n    615 => 'uni0267',\n    616 => 'uni0268',\n    617 => 'uni0269',\n    618 => 'uni026A',\n    619 => 'uni026B',\n    620 => 'uni026C',\n    621 => 'uni026D',\n    622 => 'uni026E',\n    623 => 'uni026F',\n    624 => 'uni0270',\n    625 => 'uni0271',\n    626 => 'uni0272',\n    627 => 'uni0273',\n    628 => 'uni0274',\n    629 => 'uni0275',\n    630 => 'uni0276',\n    631 => 'uni0277',\n    632 => 'uni0278',\n    633 => 'uni0279',\n    634 => 'uni027A',\n    635 => 'uni027B',\n    636 => 'uni027C',\n    637 => 'uni027D',\n    638 => 'uni027E',\n    639 => 'uni027F',\n    640 => 'uni0280',\n    641 => 'uni0281',\n    642 => 'uni0282',\n    643 => 'uni0283',\n    644 => 'uni0284',\n    645 => 'uni0285',\n    646 => 'uni0286',\n    647 => 'uni0287',\n    648 => 'uni0288',\n    649 => 'uni0289',\n    650 => 'uni028A',\n    651 => 'uni028B',\n    652 => 'uni028C',\n    653 => 'uni028D',\n    654 => 'uni028E',\n    655 => 'uni028F',\n    656 => 'uni0290',\n    657 => 'uni0291',\n    658 => 'uni0292',\n    659 => 'uni0293',\n    660 => 'uni0294',\n    661 => 'uni0295',\n    662 => 'uni0296',\n    663 => 'uni0297',\n    664 => 'uni0298',\n    665 => 'uni0299',\n    666 => 'uni029A',\n    667 => 'uni029B',\n    668 => 'uni029C',\n    669 => 'uni029D',\n    670 => 'uni029E',\n    671 => 'uni029F',\n    672 => 'uni02A0',\n    673 => 'uni02A1',\n    674 => 'uni02A2',\n    675 => 'uni02A3',\n    676 => 'uni02A4',\n    677 => 'uni02A5',\n    678 => 'uni02A6',\n    679 => 'uni02A7',\n    680 => 'uni02A8',\n    681 => 'uni02A9',\n    682 => 'uni02AA',\n    683 => 'uni02AB',\n    684 => 'uni02AC',\n    685 => 'uni02AD',\n    686 => 'uni02AE',\n    687 => 'uni02AF',\n    688 => 'uni02B0',\n    689 => 'uni02B1',\n    690 => 'uni02B2',\n    691 => 'uni02B3',\n    692 => 'uni02B4',\n    693 => 'uni02B5',\n    694 => 'uni02B6',\n    695 => 'uni02B7',\n    696 => 'uni02B8',\n    697 => 'uni02B9',\n    698 => 'uni02BA',\n    699 => 'uni02BB',\n    700 => 'uni02BC',\n    701 => 'uni02BD',\n    702 => 'uni02BE',\n    703 => 'uni02BF',\n    704 => 'uni02C0',\n    705 => 'uni02C1',\n    706 => 'uni02C2',\n    707 => 'uni02C3',\n    708 => 'uni02C4',\n    709 => 'uni02C5',\n    710 => 'circumflex',\n    711 => 'caron',\n    712 => 'uni02C8',\n    713 => 'uni02C9',\n    714 => 'uni02CA',\n    715 => 'uni02CB',\n    716 => 'uni02CC',\n    717 => 'uni02CD',\n    718 => 'uni02CE',\n    719 => 'uni02CF',\n    720 => 'uni02D0',\n    721 => 'uni02D1',\n    722 => 'uni02D2',\n    723 => 'uni02D3',\n    724 => 'uni02D4',\n    725 => 'uni02D5',\n    726 => 'uni02D6',\n    727 => 'uni02D7',\n    728 => 'breve',\n    729 => 'dotaccent',\n    730 => 'ring',\n    731 => 'ogonek',\n    732 => 'tilde',\n    733 => 'hungarumlaut',\n    734 => 'uni02DE',\n    735 => 'uni02DF',\n    736 => 'uni02E0',\n    737 => 'uni02E1',\n    738 => 'uni02E2',\n    739 => 'uni02E3',\n    740 => 'uni02E4',\n    741 => 'uni02E5',\n    742 => 'uni02E6',\n    743 => 'uni02E7',\n    744 => 'uni02E8',\n    745 => 'uni02E9',\n    748 => 'uni02EC',\n    749 => 'uni02ED',\n    750 => 'uni02EE',\n    755 => 'uni02F3',\n    759 => 'uni02F7',\n    768 => 'gravecomb',\n    769 => 'acutecomb',\n    770 => 'uni0302',\n    771 => 'tildecomb',\n    772 => 'uni0304',\n    773 => 'uni0305',\n    774 => 'uni0306',\n    775 => 'uni0307',\n    776 => 'uni0308',\n    777 => 'hookabovecomb',\n    778 => 'uni030A',\n    779 => 'uni030B',\n    780 => 'uni030C',\n    781 => 'uni030D',\n    782 => 'uni030E',\n    783 => 'uni030F',\n    784 => 'uni0310',\n    785 => 'uni0311',\n    786 => 'uni0312',\n    787 => 'uni0313',\n    788 => 'uni0314',\n    789 => 'uni0315',\n    790 => 'uni0316',\n    791 => 'uni0317',\n    792 => 'uni0318',\n    793 => 'uni0319',\n    794 => 'uni031A',\n    795 => 'uni031B',\n    796 => 'uni031C',\n    797 => 'uni031D',\n    798 => 'uni031E',\n    799 => 'uni031F',\n    800 => 'uni0320',\n    801 => 'uni0321',\n    802 => 'uni0322',\n    803 => 'dotbelowcomb',\n    804 => 'uni0324',\n    805 => 'uni0325',\n    806 => 'uni0326',\n    807 => 'uni0327',\n    808 => 'uni0328',\n    809 => 'uni0329',\n    810 => 'uni032A',\n    811 => 'uni032B',\n    812 => 'uni032C',\n    813 => 'uni032D',\n    814 => 'uni032E',\n    815 => 'uni032F',\n    816 => 'uni0330',\n    817 => 'uni0331',\n    818 => 'uni0332',\n    819 => 'uni0333',\n    820 => 'uni0334',\n    821 => 'uni0335',\n    822 => 'uni0336',\n    823 => 'uni0337',\n    824 => 'uni0338',\n    825 => 'uni0339',\n    826 => 'uni033A',\n    827 => 'uni033B',\n    828 => 'uni033C',\n    829 => 'uni033D',\n    830 => 'uni033E',\n    831 => 'uni033F',\n    832 => 'uni0340',\n    833 => 'uni0341',\n    834 => 'uni0342',\n    835 => 'uni0343',\n    836 => 'uni0344',\n    837 => 'uni0345',\n    838 => 'uni0346',\n    839 => 'uni0347',\n    840 => 'uni0348',\n    841 => 'uni0349',\n    842 => 'uni034A',\n    843 => 'uni034B',\n    844 => 'uni034C',\n    845 => 'uni034D',\n    846 => 'uni034E',\n    847 => 'uni034F',\n    849 => 'uni0351',\n    850 => 'uni0352',\n    851 => 'uni0353',\n    855 => 'uni0357',\n    856 => 'uni0358',\n    858 => 'uni035A',\n    860 => 'uni035C',\n    861 => 'uni035D',\n    862 => 'uni035E',\n    863 => 'uni035F',\n    864 => 'uni0360',\n    865 => 'uni0361',\n    866 => 'uni0362',\n    880 => 'uni0370',\n    881 => 'uni0371',\n    882 => 'uni0372',\n    883 => 'uni0373',\n    884 => 'uni0374',\n    885 => 'uni0375',\n    886 => 'uni0376',\n    887 => 'uni0377',\n    890 => 'uni037A',\n    891 => 'uni037B',\n    892 => 'uni037C',\n    893 => 'uni037D',\n    894 => 'uni037E',\n    895 => 'uni037F',\n    900 => 'tonos',\n    901 => 'dieresistonos',\n    902 => 'Alphatonos',\n    903 => 'anoteleia',\n    904 => 'Epsilontonos',\n    905 => 'Etatonos',\n    906 => 'Iotatonos',\n    908 => 'Omicrontonos',\n    910 => 'Upsilontonos',\n    911 => 'Omegatonos',\n    912 => 'iotadieresistonos',\n    913 => 'Alpha',\n    914 => 'Beta',\n    915 => 'Gamma',\n    916 => 'uni0394',\n    917 => 'Epsilon',\n    918 => 'Zeta',\n    919 => 'Eta',\n    920 => 'Theta',\n    921 => 'Iota',\n    922 => 'Kappa',\n    923 => 'Lambda',\n    924 => 'Mu',\n    925 => 'Nu',\n    926 => 'Xi',\n    927 => 'Omicron',\n    928 => 'Pi',\n    929 => 'Rho',\n    931 => 'Sigma',\n    932 => 'Tau',\n    933 => 'Upsilon',\n    934 => 'Phi',\n    935 => 'Chi',\n    936 => 'Psi',\n    937 => 'Omega',\n    938 => 'Iotadieresis',\n    939 => 'Upsilondieresis',\n    940 => 'alphatonos',\n    941 => 'epsilontonos',\n    942 => 'etatonos',\n    943 => 'iotatonos',\n    944 => 'upsilondieresistonos',\n    945 => 'alpha',\n    946 => 'beta',\n    947 => 'gamma',\n    948 => 'delta',\n    949 => 'epsilon',\n    950 => 'zeta',\n    951 => 'eta',\n    952 => 'theta',\n    953 => 'iota',\n    954 => 'kappa',\n    955 => 'lambda',\n    956 => 'uni03BC',\n    957 => 'nu',\n    958 => 'xi',\n    959 => 'omicron',\n    960 => 'pi',\n    961 => 'rho',\n    962 => 'sigma1',\n    963 => 'sigma',\n    964 => 'tau',\n    965 => 'upsilon',\n    966 => 'phi',\n    967 => 'chi',\n    968 => 'psi',\n    969 => 'omega',\n    970 => 'iotadieresis',\n    971 => 'upsilondieresis',\n    972 => 'omicrontonos',\n    973 => 'upsilontonos',\n    974 => 'omegatonos',\n    975 => 'uni03CF',\n    976 => 'uni03D0',\n    977 => 'theta1',\n    978 => 'Upsilon1',\n    979 => 'uni03D3',\n    980 => 'uni03D4',\n    981 => 'phi1',\n    982 => 'omega1',\n    983 => 'uni03D7',\n    984 => 'uni03D8',\n    985 => 'uni03D9',\n    986 => 'uni03DA',\n    987 => 'uni03DB',\n    988 => 'uni03DC',\n    989 => 'uni03DD',\n    990 => 'uni03DE',\n    991 => 'uni03DF',\n    992 => 'uni03E0',\n    993 => 'uni03E1',\n    994 => 'uni03E2',\n    995 => 'uni03E3',\n    996 => 'uni03E4',\n    997 => 'uni03E5',\n    998 => 'uni03E6',\n    999 => 'uni03E7',\n    1000 => 'uni03E8',\n    1001 => 'uni03E9',\n    1002 => 'uni03EA',\n    1003 => 'uni03EB',\n    1004 => 'uni03EC',\n    1005 => 'uni03ED',\n    1006 => 'uni03EE',\n    1007 => 'uni03EF',\n    1008 => 'uni03F0',\n    1009 => 'uni03F1',\n    1010 => 'uni03F2',\n    1011 => 'uni03F3',\n    1012 => 'uni03F4',\n    1013 => 'uni03F5',\n    1014 => 'uni03F6',\n    1015 => 'uni03F7',\n    1016 => 'uni03F8',\n    1017 => 'uni03F9',\n    1018 => 'uni03FA',\n    1019 => 'uni03FB',\n    1020 => 'uni03FC',\n    1021 => 'uni03FD',\n    1022 => 'uni03FE',\n    1023 => 'uni03FF',\n    1024 => 'uni0400',\n    1025 => 'uni0401',\n    1026 => 'uni0402',\n    1027 => 'uni0403',\n    1028 => 'uni0404',\n    1029 => 'uni0405',\n    1030 => 'uni0406',\n    1031 => 'uni0407',\n    1032 => 'uni0408',\n    1033 => 'uni0409',\n    1034 => 'uni040A',\n    1035 => 'uni040B',\n    1036 => 'uni040C',\n    1037 => 'uni040D',\n    1038 => 'uni040E',\n    1039 => 'uni040F',\n    1040 => 'uni0410',\n    1041 => 'uni0411',\n    1042 => 'uni0412',\n    1043 => 'uni0413',\n    1044 => 'uni0414',\n    1045 => 'uni0415',\n    1046 => 'uni0416',\n    1047 => 'uni0417',\n    1048 => 'uni0418',\n    1049 => 'uni0419',\n    1050 => 'uni041A',\n    1051 => 'uni041B',\n    1052 => 'uni041C',\n    1053 => 'uni041D',\n    1054 => 'uni041E',\n    1055 => 'uni041F',\n    1056 => 'uni0420',\n    1057 => 'uni0421',\n    1058 => 'uni0422',\n    1059 => 'uni0423',\n    1060 => 'uni0424',\n    1061 => 'uni0425',\n    1062 => 'uni0426',\n    1063 => 'uni0427',\n    1064 => 'uni0428',\n    1065 => 'uni0429',\n    1066 => 'uni042A',\n    1067 => 'uni042B',\n    1068 => 'uni042C',\n    1069 => 'uni042D',\n    1070 => 'uni042E',\n    1071 => 'uni042F',\n    1072 => 'uni0430',\n    1073 => 'uni0431',\n    1074 => 'uni0432',\n    1075 => 'uni0433',\n    1076 => 'uni0434',\n    1077 => 'uni0435',\n    1078 => 'uni0436',\n    1079 => 'uni0437',\n    1080 => 'uni0438',\n    1081 => 'uni0439',\n    1082 => 'uni043A',\n    1083 => 'uni043B',\n    1084 => 'uni043C',\n    1085 => 'uni043D',\n    1086 => 'uni043E',\n    1087 => 'uni043F',\n    1088 => 'uni0440',\n    1089 => 'uni0441',\n    1090 => 'uni0442',\n    1091 => 'uni0443',\n    1092 => 'uni0444',\n    1093 => 'uni0445',\n    1094 => 'uni0446',\n    1095 => 'uni0447',\n    1096 => 'uni0448',\n    1097 => 'uni0449',\n    1098 => 'uni044A',\n    1099 => 'uni044B',\n    1100 => 'uni044C',\n    1101 => 'uni044D',\n    1102 => 'uni044E',\n    1103 => 'uni044F',\n    1104 => 'uni0450',\n    1105 => 'uni0451',\n    1106 => 'uni0452',\n    1107 => 'uni0453',\n    1108 => 'uni0454',\n    1109 => 'uni0455',\n    1110 => 'uni0456',\n    1111 => 'uni0457',\n    1112 => 'uni0458',\n    1113 => 'uni0459',\n    1114 => 'uni045A',\n    1115 => 'uni045B',\n    1116 => 'uni045C',\n    1117 => 'uni045D',\n    1118 => 'uni045E',\n    1119 => 'uni045F',\n    1120 => 'uni0460',\n    1121 => 'uni0461',\n    1122 => 'uni0462',\n    1123 => 'uni0463',\n    1124 => 'uni0464',\n    1125 => 'uni0465',\n    1126 => 'uni0466',\n    1127 => 'uni0467',\n    1128 => 'uni0468',\n    1129 => 'uni0469',\n    1130 => 'uni046A',\n    1131 => 'uni046B',\n    1132 => 'uni046C',\n    1133 => 'uni046D',\n    1134 => 'uni046E',\n    1135 => 'uni046F',\n    1136 => 'uni0470',\n    1137 => 'uni0471',\n    1138 => 'uni0472',\n    1139 => 'uni0473',\n    1140 => 'uni0474',\n    1141 => 'uni0475',\n    1142 => 'uni0476',\n    1143 => 'uni0477',\n    1144 => 'uni0478',\n    1145 => 'uni0479',\n    1146 => 'uni047A',\n    1147 => 'uni047B',\n    1148 => 'uni047C',\n    1149 => 'uni047D',\n    1150 => 'uni047E',\n    1151 => 'uni047F',\n    1152 => 'uni0480',\n    1153 => 'uni0481',\n    1154 => 'uni0482',\n    1155 => 'uni0483',\n    1156 => 'uni0484',\n    1157 => 'uni0485',\n    1158 => 'uni0486',\n    1159 => 'uni0487',\n    1160 => 'uni0488',\n    1161 => 'uni0489',\n    1162 => 'uni048A',\n    1163 => 'uni048B',\n    1164 => 'uni048C',\n    1165 => 'uni048D',\n    1166 => 'uni048E',\n    1167 => 'uni048F',\n    1168 => 'uni0490',\n    1169 => 'uni0491',\n    1170 => 'uni0492',\n    1171 => 'uni0493',\n    1172 => 'uni0494',\n    1173 => 'uni0495',\n    1174 => 'uni0496',\n    1175 => 'uni0497',\n    1176 => 'uni0498',\n    1177 => 'uni0499',\n    1178 => 'uni049A',\n    1179 => 'uni049B',\n    1180 => 'uni049C',\n    1181 => 'uni049D',\n    1182 => 'uni049E',\n    1183 => 'uni049F',\n    1184 => 'uni04A0',\n    1185 => 'uni04A1',\n    1186 => 'uni04A2',\n    1187 => 'uni04A3',\n    1188 => 'uni04A4',\n    1189 => 'uni04A5',\n    1190 => 'uni04A6',\n    1191 => 'uni04A7',\n    1192 => 'uni04A8',\n    1193 => 'uni04A9',\n    1194 => 'uni04AA',\n    1195 => 'uni04AB',\n    1196 => 'uni04AC',\n    1197 => 'uni04AD',\n    1198 => 'uni04AE',\n    1199 => 'uni04AF',\n    1200 => 'uni04B0',\n    1201 => 'uni04B1',\n    1202 => 'uni04B2',\n    1203 => 'uni04B3',\n    1204 => 'uni04B4',\n    1205 => 'uni04B5',\n    1206 => 'uni04B6',\n    1207 => 'uni04B7',\n    1208 => 'uni04B8',\n    1209 => 'uni04B9',\n    1210 => 'uni04BA',\n    1211 => 'uni04BB',\n    1212 => 'uni04BC',\n    1213 => 'uni04BD',\n    1214 => 'uni04BE',\n    1215 => 'uni04BF',\n    1216 => 'uni04C0',\n    1217 => 'uni04C1',\n    1218 => 'uni04C2',\n    1219 => 'uni04C3',\n    1220 => 'uni04C4',\n    1221 => 'uni04C5',\n    1222 => 'uni04C6',\n    1223 => 'uni04C7',\n    1224 => 'uni04C8',\n    1225 => 'uni04C9',\n    1226 => 'uni04CA',\n    1227 => 'uni04CB',\n    1228 => 'uni04CC',\n    1229 => 'uni04CD',\n    1230 => 'uni04CE',\n    1231 => 'uni04CF',\n    1232 => 'uni04D0',\n    1233 => 'uni04D1',\n    1234 => 'uni04D2',\n    1235 => 'uni04D3',\n    1236 => 'uni04D4',\n    1237 => 'uni04D5',\n    1238 => 'uni04D6',\n    1239 => 'uni04D7',\n    1240 => 'uni04D8',\n    1241 => 'uni04D9',\n    1242 => 'uni04DA',\n    1243 => 'uni04DB',\n    1244 => 'uni04DC',\n    1245 => 'uni04DD',\n    1246 => 'uni04DE',\n    1247 => 'uni04DF',\n    1248 => 'uni04E0',\n    1249 => 'uni04E1',\n    1250 => 'uni04E2',\n    1251 => 'uni04E3',\n    1252 => 'uni04E4',\n    1253 => 'uni04E5',\n    1254 => 'uni04E6',\n    1255 => 'uni04E7',\n    1256 => 'uni04E8',\n    1257 => 'uni04E9',\n    1258 => 'uni04EA',\n    1259 => 'uni04EB',\n    1260 => 'uni04EC',\n    1261 => 'uni04ED',\n    1262 => 'uni04EE',\n    1263 => 'uni04EF',\n    1264 => 'uni04F0',\n    1265 => 'uni04F1',\n    1266 => 'uni04F2',\n    1267 => 'uni04F3',\n    1268 => 'uni04F4',\n    1269 => 'uni04F5',\n    1270 => 'uni04F6',\n    1271 => 'uni04F7',\n    1272 => 'uni04F8',\n    1273 => 'uni04F9',\n    1274 => 'uni04FA',\n    1275 => 'uni04FB',\n    1276 => 'uni04FC',\n    1277 => 'uni04FD',\n    1278 => 'uni04FE',\n    1279 => 'uni04FF',\n    1280 => 'uni0500',\n    1281 => 'uni0501',\n    1282 => 'uni0502',\n    1283 => 'uni0503',\n    1284 => 'uni0504',\n    1285 => 'uni0505',\n    1286 => 'uni0506',\n    1287 => 'uni0507',\n    1288 => 'uni0508',\n    1289 => 'uni0509',\n    1290 => 'uni050A',\n    1291 => 'uni050B',\n    1292 => 'uni050C',\n    1293 => 'uni050D',\n    1294 => 'uni050E',\n    1295 => 'uni050F',\n    1296 => 'uni0510',\n    1297 => 'uni0511',\n    1298 => 'uni0512',\n    1299 => 'uni0513',\n    1300 => 'uni0514',\n    1301 => 'uni0515',\n    1302 => 'uni0516',\n    1303 => 'uni0517',\n    1304 => 'uni0518',\n    1305 => 'uni0519',\n    1306 => 'uni051A',\n    1307 => 'uni051B',\n    1308 => 'uni051C',\n    1309 => 'uni051D',\n    1310 => 'uni051E',\n    1311 => 'uni051F',\n    1312 => 'uni0520',\n    1313 => 'uni0521',\n    1314 => 'uni0522',\n    1315 => 'uni0523',\n    1316 => 'uni0524',\n    1317 => 'uni0525',\n    1329 => 'uni0531',\n    1330 => 'uni0532',\n    1331 => 'uni0533',\n    1332 => 'uni0534',\n    1333 => 'uni0535',\n    1334 => 'uni0536',\n    1335 => 'uni0537',\n    1336 => 'uni0538',\n    1337 => 'uni0539',\n    1338 => 'uni053A',\n    1339 => 'uni053B',\n    1340 => 'uni053C',\n    1341 => 'uni053D',\n    1342 => 'uni053E',\n    1343 => 'uni053F',\n    1344 => 'uni0540',\n    1345 => 'uni0541',\n    1346 => 'uni0542',\n    1347 => 'uni0543',\n    1348 => 'uni0544',\n    1349 => 'uni0545',\n    1350 => 'uni0546',\n    1351 => 'uni0547',\n    1352 => 'uni0548',\n    1353 => 'uni0549',\n    1354 => 'uni054A',\n    1355 => 'uni054B',\n    1356 => 'uni054C',\n    1357 => 'uni054D',\n    1358 => 'uni054E',\n    1359 => 'uni054F',\n    1360 => 'uni0550',\n    1361 => 'uni0551',\n    1362 => 'uni0552',\n    1363 => 'uni0553',\n    1364 => 'uni0554',\n    1365 => 'uni0555',\n    1366 => 'uni0556',\n    1369 => 'uni0559',\n    1370 => 'uni055A',\n    1371 => 'uni055B',\n    1372 => 'uni055C',\n    1373 => 'uni055D',\n    1374 => 'uni055E',\n    1375 => 'uni055F',\n    1377 => 'uni0561',\n    1378 => 'uni0562',\n    1379 => 'uni0563',\n    1380 => 'uni0564',\n    1381 => 'uni0565',\n    1382 => 'uni0566',\n    1383 => 'uni0567',\n    1384 => 'uni0568',\n    1385 => 'uni0569',\n    1386 => 'uni056A',\n    1387 => 'uni056B',\n    1388 => 'uni056C',\n    1389 => 'uni056D',\n    1390 => 'uni056E',\n    1391 => 'uni056F',\n    1392 => 'uni0570',\n    1393 => 'uni0571',\n    1394 => 'uni0572',\n    1395 => 'uni0573',\n    1396 => 'uni0574',\n    1397 => 'uni0575',\n    1398 => 'uni0576',\n    1399 => 'uni0577',\n    1400 => 'uni0578',\n    1401 => 'uni0579',\n    1402 => 'uni057A',\n    1403 => 'uni057B',\n    1404 => 'uni057C',\n    1405 => 'uni057D',\n    1406 => 'uni057E',\n    1407 => 'uni057F',\n    1408 => 'uni0580',\n    1409 => 'uni0581',\n    1410 => 'uni0582',\n    1411 => 'uni0583',\n    1412 => 'uni0584',\n    1413 => 'uni0585',\n    1414 => 'uni0586',\n    1415 => 'uni0587',\n    1417 => 'uni0589',\n    1418 => 'uni058A',\n    1456 => 'uni05B0',\n    1457 => 'uni05B1',\n    1458 => 'uni05B2',\n    1459 => 'uni05B3',\n    1460 => 'uni05B4',\n    1461 => 'uni05B5',\n    1462 => 'uni05B6',\n    1463 => 'uni05B7',\n    1464 => 'uni05B8',\n    1465 => 'uni05B9',\n    1466 => 'uni05BA',\n    1467 => 'uni05BB',\n    1468 => 'uni05BC',\n    1469 => 'uni05BD',\n    1470 => 'uni05BE',\n    1471 => 'uni05BF',\n    1472 => 'uni05C0',\n    1473 => 'uni05C1',\n    1474 => 'uni05C2',\n    1475 => 'uni05C3',\n    1478 => 'uni05C6',\n    1479 => 'uni05C7',\n    1488 => 'uni05D0',\n    1489 => 'uni05D1',\n    1490 => 'uni05D2',\n    1491 => 'uni05D3',\n    1492 => 'uni05D4',\n    1493 => 'uni05D5',\n    1494 => 'uni05D6',\n    1495 => 'uni05D7',\n    1496 => 'uni05D8',\n    1497 => 'uni05D9',\n    1498 => 'uni05DA',\n    1499 => 'uni05DB',\n    1500 => 'uni05DC',\n    1501 => 'uni05DD',\n    1502 => 'uni05DE',\n    1503 => 'uni05DF',\n    1504 => 'uni05E0',\n    1505 => 'uni05E1',\n    1506 => 'uni05E2',\n    1507 => 'uni05E3',\n    1508 => 'uni05E4',\n    1509 => 'uni05E5',\n    1510 => 'uni05E6',\n    1511 => 'uni05E7',\n    1512 => 'uni05E8',\n    1513 => 'uni05E9',\n    1514 => 'uni05EA',\n    1520 => 'uni05F0',\n    1521 => 'uni05F1',\n    1522 => 'uni05F2',\n    1523 => 'uni05F3',\n    1524 => 'uni05F4',\n    1542 => 'uni0606',\n    1543 => 'uni0607',\n    1545 => 'uni0609',\n    1546 => 'uni060A',\n    1548 => 'uni060C',\n    1557 => 'uni0615',\n    1563 => 'uni061B',\n    1567 => 'uni061F',\n    1569 => 'uni0621',\n    1570 => 'uni0622',\n    1571 => 'uni0623',\n    1572 => 'uni0624',\n    1573 => 'uni0625',\n    1574 => 'uni0626',\n    1575 => 'uni0627',\n    1576 => 'uni0628',\n    1577 => 'uni0629',\n    1578 => 'uni062A',\n    1579 => 'uni062B',\n    1580 => 'uni062C',\n    1581 => 'uni062D',\n    1582 => 'uni062E',\n    1583 => 'uni062F',\n    1584 => 'uni0630',\n    1585 => 'uni0631',\n    1586 => 'uni0632',\n    1587 => 'uni0633',\n    1588 => 'uni0634',\n    1589 => 'uni0635',\n    1590 => 'uni0636',\n    1591 => 'uni0637',\n    1592 => 'uni0638',\n    1593 => 'uni0639',\n    1594 => 'uni063A',\n    1600 => 'uni0640',\n    1601 => 'uni0641',\n    1602 => 'uni0642',\n    1603 => 'uni0643',\n    1604 => 'uni0644',\n    1605 => 'uni0645',\n    1606 => 'uni0646',\n    1607 => 'uni0647',\n    1608 => 'uni0648',\n    1609 => 'uni0649',\n    1610 => 'uni064A',\n    1611 => 'uni064B',\n    1612 => 'uni064C',\n    1613 => 'uni064D',\n    1614 => 'uni064E',\n    1615 => 'uni064F',\n    1616 => 'uni0650',\n    1617 => 'uni0651',\n    1618 => 'uni0652',\n    1619 => 'uni0653',\n    1620 => 'uni0654',\n    1621 => 'uni0655',\n    1623 => 'uni0657',\n    1626 => 'uni065A',\n    1632 => 'uni0660',\n    1633 => 'uni0661',\n    1634 => 'uni0662',\n    1635 => 'uni0663',\n    1636 => 'uni0664',\n    1637 => 'uni0665',\n    1638 => 'uni0666',\n    1639 => 'uni0667',\n    1640 => 'uni0668',\n    1641 => 'uni0669',\n    1642 => 'uni066A',\n    1643 => 'uni066B',\n    1644 => 'uni066C',\n    1645 => 'uni066D',\n    1646 => 'uni066E',\n    1647 => 'uni066F',\n    1648 => 'uni0670',\n    1652 => 'uni0674',\n    1657 => 'uni0679',\n    1658 => 'uni067A',\n    1659 => 'uni067B',\n    1660 => 'uni067C',\n    1661 => 'uni067D',\n    1662 => 'uni067E',\n    1663 => 'uni067F',\n    1664 => 'uni0680',\n    1665 => 'uni0681',\n    1666 => 'uni0682',\n    1667 => 'uni0683',\n    1668 => 'uni0684',\n    1669 => 'uni0685',\n    1670 => 'uni0686',\n    1671 => 'uni0687',\n    1672 => 'uni0688',\n    1673 => 'uni0689',\n    1674 => 'uni068A',\n    1675 => 'uni068B',\n    1676 => 'uni068C',\n    1677 => 'uni068D',\n    1678 => 'uni068E',\n    1679 => 'uni068F',\n    1680 => 'uni0690',\n    1681 => 'uni0691',\n    1682 => 'uni0692',\n    1683 => 'uni0693',\n    1684 => 'uni0694',\n    1685 => 'uni0695',\n    1686 => 'uni0696',\n    1687 => 'uni0697',\n    1688 => 'uni0698',\n    1689 => 'uni0699',\n    1690 => 'uni069A',\n    1691 => 'uni069B',\n    1692 => 'uni069C',\n    1693 => 'uni069D',\n    1694 => 'uni069E',\n    1695 => 'uni069F',\n    1696 => 'uni06A0',\n    1697 => 'uni06A1',\n    1698 => 'uni06A2',\n    1699 => 'uni06A3',\n    1700 => 'uni06A4',\n    1701 => 'uni06A5',\n    1702 => 'uni06A6',\n    1703 => 'uni06A7',\n    1704 => 'uni06A8',\n    1705 => 'uni06A9',\n    1706 => 'uni06AA',\n    1707 => 'uni06AB',\n    1708 => 'uni06AC',\n    1709 => 'uni06AD',\n    1710 => 'uni06AE',\n    1711 => 'uni06AF',\n    1712 => 'uni06B0',\n    1713 => 'uni06B1',\n    1714 => 'uni06B2',\n    1715 => 'uni06B3',\n    1716 => 'uni06B4',\n    1717 => 'uni06B5',\n    1718 => 'uni06B6',\n    1719 => 'uni06B7',\n    1720 => 'uni06B8',\n    1721 => 'uni06B9',\n    1722 => 'uni06BA',\n    1723 => 'uni06BB',\n    1724 => 'uni06BC',\n    1725 => 'uni06BD',\n    1726 => 'uni06BE',\n    1727 => 'uni06BF',\n    1734 => 'uni06C6',\n    1735 => 'uni06C7',\n    1736 => 'uni06C8',\n    1739 => 'uni06CB',\n    1740 => 'uni06CC',\n    1742 => 'uni06CE',\n    1744 => 'uni06D0',\n    1749 => 'uni06D5',\n    1776 => 'uni06F0',\n    1777 => 'uni06F1',\n    1778 => 'uni06F2',\n    1779 => 'uni06F3',\n    1780 => 'uni06F4',\n    1781 => 'uni06F5',\n    1782 => 'uni06F6',\n    1783 => 'uni06F7',\n    1784 => 'uni06F8',\n    1785 => 'uni06F9',\n    1984 => 'uni07C0',\n    1985 => 'uni07C1',\n    1986 => 'uni07C2',\n    1987 => 'uni07C3',\n    1988 => 'uni07C4',\n    1989 => 'uni07C5',\n    1990 => 'uni07C6',\n    1991 => 'uni07C7',\n    1992 => 'uni07C8',\n    1993 => 'uni07C9',\n    1994 => 'uni07CA',\n    1995 => 'uni07CB',\n    1996 => 'uni07CC',\n    1997 => 'uni07CD',\n    1998 => 'uni07CE',\n    1999 => 'uni07CF',\n    2000 => 'uni07D0',\n    2001 => 'uni07D1',\n    2002 => 'uni07D2',\n    2003 => 'uni07D3',\n    2004 => 'uni07D4',\n    2005 => 'uni07D5',\n    2006 => 'uni07D6',\n    2007 => 'uni07D7',\n    2008 => 'uni07D8',\n    2009 => 'uni07D9',\n    2010 => 'uni07DA',\n    2011 => 'uni07DB',\n    2012 => 'uni07DC',\n    2013 => 'uni07DD',\n    2014 => 'uni07DE',\n    2015 => 'uni07DF',\n    2016 => 'uni07E0',\n    2017 => 'uni07E1',\n    2018 => 'uni07E2',\n    2019 => 'uni07E3',\n    2020 => 'uni07E4',\n    2021 => 'uni07E5',\n    2022 => 'uni07E6',\n    2023 => 'uni07E7',\n    2027 => 'uni07EB',\n    2028 => 'uni07EC',\n    2029 => 'uni07ED',\n    2030 => 'uni07EE',\n    2031 => 'uni07EF',\n    2032 => 'uni07F0',\n    2033 => 'uni07F1',\n    2034 => 'uni07F2',\n    2035 => 'uni07F3',\n    2036 => 'uni07F4',\n    2037 => 'uni07F5',\n    2040 => 'uni07F8',\n    2041 => 'uni07F9',\n    2042 => 'uni07FA',\n    3647 => 'uni0E3F',\n    3713 => 'uni0E81',\n    3714 => 'uni0E82',\n    3716 => 'uni0E84',\n    3719 => 'uni0E87',\n    3720 => 'uni0E88',\n    3722 => 'uni0E8A',\n    3725 => 'uni0E8D',\n    3732 => 'uni0E94',\n    3733 => 'uni0E95',\n    3734 => 'uni0E96',\n    3735 => 'uni0E97',\n    3737 => 'uni0E99',\n    3738 => 'uni0E9A',\n    3739 => 'uni0E9B',\n    3740 => 'uni0E9C',\n    3741 => 'uni0E9D',\n    3742 => 'uni0E9E',\n    3743 => 'uni0E9F',\n    3745 => 'uni0EA1',\n    3746 => 'uni0EA2',\n    3747 => 'uni0EA3',\n    3749 => 'uni0EA5',\n    3751 => 'uni0EA7',\n    3754 => 'uni0EAA',\n    3755 => 'uni0EAB',\n    3757 => 'uni0EAD',\n    3758 => 'uni0EAE',\n    3759 => 'uni0EAF',\n    3760 => 'uni0EB0',\n    3761 => 'uni0EB1',\n    3762 => 'uni0EB2',\n    3763 => 'uni0EB3',\n    3764 => 'uni0EB4',\n    3765 => 'uni0EB5',\n    3766 => 'uni0EB6',\n    3767 => 'uni0EB7',\n    3768 => 'uni0EB8',\n    3769 => 'uni0EB9',\n    3771 => 'uni0EBB',\n    3772 => 'uni0EBC',\n    3773 => 'uni0EBD',\n    3776 => 'uni0EC0',\n    3777 => 'uni0EC1',\n    3778 => 'uni0EC2',\n    3779 => 'uni0EC3',\n    3780 => 'uni0EC4',\n    3782 => 'uni0EC6',\n    3784 => 'uni0EC8',\n    3785 => 'uni0EC9',\n    3786 => 'uni0ECA',\n    3787 => 'uni0ECB',\n    3788 => 'uni0ECC',\n    3789 => 'uni0ECD',\n    3792 => 'uni0ED0',\n    3793 => 'uni0ED1',\n    3794 => 'uni0ED2',\n    3795 => 'uni0ED3',\n    3796 => 'uni0ED4',\n    3797 => 'uni0ED5',\n    3798 => 'uni0ED6',\n    3799 => 'uni0ED7',\n    3800 => 'uni0ED8',\n    3801 => 'uni0ED9',\n    3804 => 'uni0EDC',\n    3805 => 'uni0EDD',\n    4256 => 'uni10A0',\n    4257 => 'uni10A1',\n    4258 => 'uni10A2',\n    4259 => 'uni10A3',\n    4260 => 'uni10A4',\n    4261 => 'uni10A5',\n    4262 => 'uni10A6',\n    4263 => 'uni10A7',\n    4264 => 'uni10A8',\n    4265 => 'uni10A9',\n    4266 => 'uni10AA',\n    4267 => 'uni10AB',\n    4268 => 'uni10AC',\n    4269 => 'uni10AD',\n    4270 => 'uni10AE',\n    4271 => 'uni10AF',\n    4272 => 'uni10B0',\n    4273 => 'uni10B1',\n    4274 => 'uni10B2',\n    4275 => 'uni10B3',\n    4276 => 'uni10B4',\n    4277 => 'uni10B5',\n    4278 => 'uni10B6',\n    4279 => 'uni10B7',\n    4280 => 'uni10B8',\n    4281 => 'uni10B9',\n    4282 => 'uni10BA',\n    4283 => 'uni10BB',\n    4284 => 'uni10BC',\n    4285 => 'uni10BD',\n    4286 => 'uni10BE',\n    4287 => 'uni10BF',\n    4288 => 'uni10C0',\n    4289 => 'uni10C1',\n    4290 => 'uni10C2',\n    4291 => 'uni10C3',\n    4292 => 'uni10C4',\n    4293 => 'uni10C5',\n    4304 => 'uni10D0',\n    4305 => 'uni10D1',\n    4306 => 'uni10D2',\n    4307 => 'uni10D3',\n    4308 => 'uni10D4',\n    4309 => 'uni10D5',\n    4310 => 'uni10D6',\n    4311 => 'uni10D7',\n    4312 => 'uni10D8',\n    4313 => 'uni10D9',\n    4314 => 'uni10DA',\n    4315 => 'uni10DB',\n    4316 => 'uni10DC',\n    4317 => 'uni10DD',\n    4318 => 'uni10DE',\n    4319 => 'uni10DF',\n    4320 => 'uni10E0',\n    4321 => 'uni10E1',\n    4322 => 'uni10E2',\n    4323 => 'uni10E3',\n    4324 => 'uni10E4',\n    4325 => 'uni10E5',\n    4326 => 'uni10E6',\n    4327 => 'uni10E7',\n    4328 => 'uni10E8',\n    4329 => 'uni10E9',\n    4330 => 'uni10EA',\n    4331 => 'uni10EB',\n    4332 => 'uni10EC',\n    4333 => 'uni10ED',\n    4334 => 'uni10EE',\n    4335 => 'uni10EF',\n    4336 => 'uni10F0',\n    4337 => 'uni10F1',\n    4338 => 'uni10F2',\n    4339 => 'uni10F3',\n    4340 => 'uni10F4',\n    4341 => 'uni10F5',\n    4342 => 'uni10F6',\n    4343 => 'uni10F7',\n    4344 => 'uni10F8',\n    4345 => 'uni10F9',\n    4346 => 'uni10FA',\n    4347 => 'uni10FB',\n    4348 => 'uni10FC',\n    5121 => 'uni1401',\n    5122 => 'uni1402',\n    5123 => 'uni1403',\n    5124 => 'uni1404',\n    5125 => 'uni1405',\n    5126 => 'uni1406',\n    5127 => 'uni1407',\n    5129 => 'uni1409',\n    5130 => 'uni140A',\n    5131 => 'uni140B',\n    5132 => 'uni140C',\n    5133 => 'uni140D',\n    5134 => 'uni140E',\n    5135 => 'uni140F',\n    5136 => 'uni1410',\n    5137 => 'uni1411',\n    5138 => 'uni1412',\n    5139 => 'uni1413',\n    5140 => 'uni1414',\n    5141 => 'uni1415',\n    5142 => 'uni1416',\n    5143 => 'uni1417',\n    5144 => 'uni1418',\n    5145 => 'uni1419',\n    5146 => 'uni141A',\n    5147 => 'uni141B',\n    5149 => 'uni141D',\n    5150 => 'uni141E',\n    5151 => 'uni141F',\n    5152 => 'uni1420',\n    5153 => 'uni1421',\n    5154 => 'uni1422',\n    5155 => 'uni1423',\n    5156 => 'uni1424',\n    5157 => 'uni1425',\n    5158 => 'uni1426',\n    5159 => 'uni1427',\n    5160 => 'uni1428',\n    5161 => 'uni1429',\n    5162 => 'uni142A',\n    5163 => 'uni142B',\n    5164 => 'uni142C',\n    5165 => 'uni142D',\n    5166 => 'uni142E',\n    5167 => 'uni142F',\n    5168 => 'uni1430',\n    5169 => 'uni1431',\n    5170 => 'uni1432',\n    5171 => 'uni1433',\n    5172 => 'uni1434',\n    5173 => 'uni1435',\n    5175 => 'uni1437',\n    5176 => 'uni1438',\n    5177 => 'uni1439',\n    5178 => 'uni143A',\n    5179 => 'uni143B',\n    5180 => 'uni143C',\n    5181 => 'uni143D',\n    5182 => 'uni143E',\n    5183 => 'uni143F',\n    5184 => 'uni1440',\n    5185 => 'uni1441',\n    5186 => 'uni1442',\n    5187 => 'uni1443',\n    5188 => 'uni1444',\n    5189 => 'uni1445',\n    5190 => 'uni1446',\n    5191 => 'uni1447',\n    5192 => 'uni1448',\n    5193 => 'uni1449',\n    5194 => 'uni144A',\n    5196 => 'uni144C',\n    5197 => 'uni144D',\n    5198 => 'uni144E',\n    5199 => 'uni144F',\n    5200 => 'uni1450',\n    5201 => 'uni1451',\n    5202 => 'uni1452',\n    5204 => 'uni1454',\n    5205 => 'uni1455',\n    5206 => 'uni1456',\n    5207 => 'uni1457',\n    5208 => 'uni1458',\n    5209 => 'uni1459',\n    5210 => 'uni145A',\n    5211 => 'uni145B',\n    5212 => 'uni145C',\n    5213 => 'uni145D',\n    5214 => 'uni145E',\n    5215 => 'uni145F',\n    5216 => 'uni1460',\n    5217 => 'uni1461',\n    5218 => 'uni1462',\n    5219 => 'uni1463',\n    5220 => 'uni1464',\n    5221 => 'uni1465',\n    5222 => 'uni1466',\n    5223 => 'uni1467',\n    5224 => 'uni1468',\n    5225 => 'uni1469',\n    5226 => 'uni146A',\n    5227 => 'uni146B',\n    5228 => 'uni146C',\n    5229 => 'uni146D',\n    5230 => 'uni146E',\n    5231 => 'uni146F',\n    5232 => 'uni1470',\n    5233 => 'uni1471',\n    5234 => 'uni1472',\n    5235 => 'uni1473',\n    5236 => 'uni1474',\n    5237 => 'uni1475',\n    5238 => 'uni1476',\n    5239 => 'uni1477',\n    5240 => 'uni1478',\n    5241 => 'uni1479',\n    5242 => 'uni147A',\n    5243 => 'uni147B',\n    5244 => 'uni147C',\n    5245 => 'uni147D',\n    5246 => 'uni147E',\n    5247 => 'uni147F',\n    5248 => 'uni1480',\n    5249 => 'uni1481',\n    5250 => 'uni1482',\n    5251 => 'uni1483',\n    5252 => 'uni1484',\n    5253 => 'uni1485',\n    5254 => 'uni1486',\n    5255 => 'uni1487',\n    5256 => 'uni1488',\n    5257 => 'uni1489',\n    5258 => 'uni148A',\n    5259 => 'uni148B',\n    5260 => 'uni148C',\n    5261 => 'uni148D',\n    5262 => 'uni148E',\n    5263 => 'uni148F',\n    5264 => 'uni1490',\n    5265 => 'uni1491',\n    5266 => 'uni1492',\n    5267 => 'uni1493',\n    5268 => 'uni1494',\n    5269 => 'uni1495',\n    5270 => 'uni1496',\n    5271 => 'uni1497',\n    5272 => 'uni1498',\n    5273 => 'uni1499',\n    5274 => 'uni149A',\n    5275 => 'uni149B',\n    5276 => 'uni149C',\n    5277 => 'uni149D',\n    5278 => 'uni149E',\n    5279 => 'uni149F',\n    5280 => 'uni14A0',\n    5281 => 'uni14A1',\n    5282 => 'uni14A2',\n    5283 => 'uni14A3',\n    5284 => 'uni14A4',\n    5285 => 'uni14A5',\n    5286 => 'uni14A6',\n    5287 => 'uni14A7',\n    5288 => 'uni14A8',\n    5289 => 'uni14A9',\n    5290 => 'uni14AA',\n    5291 => 'uni14AB',\n    5292 => 'uni14AC',\n    5293 => 'uni14AD',\n    5294 => 'uni14AE',\n    5295 => 'uni14AF',\n    5296 => 'uni14B0',\n    5297 => 'uni14B1',\n    5298 => 'uni14B2',\n    5299 => 'uni14B3',\n    5300 => 'uni14B4',\n    5301 => 'uni14B5',\n    5302 => 'uni14B6',\n    5303 => 'uni14B7',\n    5304 => 'uni14B8',\n    5305 => 'uni14B9',\n    5306 => 'uni14BA',\n    5307 => 'uni14BB',\n    5308 => 'uni14BC',\n    5309 => 'uni14BD',\n    5312 => 'uni14C0',\n    5313 => 'uni14C1',\n    5314 => 'uni14C2',\n    5315 => 'uni14C3',\n    5316 => 'uni14C4',\n    5317 => 'uni14C5',\n    5318 => 'uni14C6',\n    5319 => 'uni14C7',\n    5320 => 'uni14C8',\n    5321 => 'uni14C9',\n    5322 => 'uni14CA',\n    5323 => 'uni14CB',\n    5324 => 'uni14CC',\n    5325 => 'uni14CD',\n    5326 => 'uni14CE',\n    5327 => 'uni14CF',\n    5328 => 'uni14D0',\n    5329 => 'uni14D1',\n    5330 => 'uni14D2',\n    5331 => 'uni14D3',\n    5332 => 'uni14D4',\n    5333 => 'uni14D5',\n    5334 => 'uni14D6',\n    5335 => 'uni14D7',\n    5336 => 'uni14D8',\n    5337 => 'uni14D9',\n    5338 => 'uni14DA',\n    5339 => 'uni14DB',\n    5340 => 'uni14DC',\n    5341 => 'uni14DD',\n    5342 => 'uni14DE',\n    5343 => 'uni14DF',\n    5344 => 'uni14E0',\n    5345 => 'uni14E1',\n    5346 => 'uni14E2',\n    5347 => 'uni14E3',\n    5348 => 'uni14E4',\n    5349 => 'uni14E5',\n    5350 => 'uni14E6',\n    5351 => 'uni14E7',\n    5352 => 'uni14E8',\n    5353 => 'uni14E9',\n    5354 => 'uni14EA',\n    5356 => 'uni14EC',\n    5357 => 'uni14ED',\n    5358 => 'uni14EE',\n    5359 => 'uni14EF',\n    5360 => 'uni14F0',\n    5361 => 'uni14F1',\n    5362 => 'uni14F2',\n    5363 => 'uni14F3',\n    5364 => 'uni14F4',\n    5365 => 'uni14F5',\n    5366 => 'uni14F6',\n    5367 => 'uni14F7',\n    5368 => 'uni14F8',\n    5369 => 'uni14F9',\n    5370 => 'uni14FA',\n    5371 => 'uni14FB',\n    5372 => 'uni14FC',\n    5373 => 'uni14FD',\n    5374 => 'uni14FE',\n    5375 => 'uni14FF',\n    5376 => 'uni1500',\n    5377 => 'uni1501',\n    5378 => 'uni1502',\n    5379 => 'uni1503',\n    5380 => 'uni1504',\n    5381 => 'uni1505',\n    5382 => 'uni1506',\n    5383 => 'uni1507',\n    5392 => 'uni1510',\n    5393 => 'uni1511',\n    5394 => 'uni1512',\n    5395 => 'uni1513',\n    5396 => 'uni1514',\n    5397 => 'uni1515',\n    5398 => 'uni1516',\n    5399 => 'uni1517',\n    5400 => 'uni1518',\n    5401 => 'uni1519',\n    5402 => 'uni151A',\n    5403 => 'uni151B',\n    5404 => 'uni151C',\n    5405 => 'uni151D',\n    5406 => 'uni151E',\n    5407 => 'uni151F',\n    5408 => 'uni1520',\n    5409 => 'uni1521',\n    5410 => 'uni1522',\n    5411 => 'uni1523',\n    5412 => 'uni1524',\n    5413 => 'uni1525',\n    5414 => 'uni1526',\n    5415 => 'uni1527',\n    5416 => 'uni1528',\n    5417 => 'uni1529',\n    5418 => 'uni152A',\n    5419 => 'uni152B',\n    5420 => 'uni152C',\n    5421 => 'uni152D',\n    5422 => 'uni152E',\n    5423 => 'uni152F',\n    5424 => 'uni1530',\n    5425 => 'uni1531',\n    5426 => 'uni1532',\n    5427 => 'uni1533',\n    5428 => 'uni1534',\n    5429 => 'uni1535',\n    5430 => 'uni1536',\n    5431 => 'uni1537',\n    5432 => 'uni1538',\n    5433 => 'uni1539',\n    5434 => 'uni153A',\n    5435 => 'uni153B',\n    5436 => 'uni153C',\n    5437 => 'uni153D',\n    5438 => 'uni153E',\n    5440 => 'uni1540',\n    5441 => 'uni1541',\n    5442 => 'uni1542',\n    5443 => 'uni1543',\n    5444 => 'uni1544',\n    5445 => 'uni1545',\n    5446 => 'uni1546',\n    5447 => 'uni1547',\n    5448 => 'uni1548',\n    5449 => 'uni1549',\n    5450 => 'uni154A',\n    5451 => 'uni154B',\n    5452 => 'uni154C',\n    5453 => 'uni154D',\n    5454 => 'uni154E',\n    5455 => 'uni154F',\n    5456 => 'uni1550',\n    5458 => 'uni1552',\n    5459 => 'uni1553',\n    5460 => 'uni1554',\n    5461 => 'uni1555',\n    5462 => 'uni1556',\n    5463 => 'uni1557',\n    5464 => 'uni1558',\n    5465 => 'uni1559',\n    5466 => 'uni155A',\n    5467 => 'uni155B',\n    5468 => 'uni155C',\n    5469 => 'uni155D',\n    5470 => 'uni155E',\n    5471 => 'uni155F',\n    5472 => 'uni1560',\n    5473 => 'uni1561',\n    5474 => 'uni1562',\n    5475 => 'uni1563',\n    5476 => 'uni1564',\n    5477 => 'uni1565',\n    5478 => 'uni1566',\n    5479 => 'uni1567',\n    5480 => 'uni1568',\n    5481 => 'uni1569',\n    5482 => 'uni156A',\n    5492 => 'uni1574',\n    5493 => 'uni1575',\n    5494 => 'uni1576',\n    5495 => 'uni1577',\n    5496 => 'uni1578',\n    5497 => 'uni1579',\n    5498 => 'uni157A',\n    5499 => 'uni157B',\n    5500 => 'uni157C',\n    5501 => 'uni157D',\n    5502 => 'uni157E',\n    5503 => 'uni157F',\n    5504 => 'uni1580',\n    5505 => 'uni1581',\n    5506 => 'uni1582',\n    5507 => 'uni1583',\n    5508 => 'uni1584',\n    5509 => 'uni1585',\n    5514 => 'uni158A',\n    5515 => 'uni158B',\n    5516 => 'uni158C',\n    5517 => 'uni158D',\n    5518 => 'uni158E',\n    5519 => 'uni158F',\n    5520 => 'uni1590',\n    5521 => 'uni1591',\n    5522 => 'uni1592',\n    5523 => 'uni1593',\n    5524 => 'uni1594',\n    5525 => 'uni1595',\n    5526 => 'uni1596',\n    5536 => 'uni15A0',\n    5537 => 'uni15A1',\n    5538 => 'uni15A2',\n    5539 => 'uni15A3',\n    5540 => 'uni15A4',\n    5541 => 'uni15A5',\n    5542 => 'uni15A6',\n    5543 => 'uni15A7',\n    5544 => 'uni15A8',\n    5545 => 'uni15A9',\n    5546 => 'uni15AA',\n    5547 => 'uni15AB',\n    5548 => 'uni15AC',\n    5549 => 'uni15AD',\n    5550 => 'uni15AE',\n    5551 => 'uni15AF',\n    5598 => 'uni15DE',\n    5601 => 'uni15E1',\n    5702 => 'uni1646',\n    5703 => 'uni1647',\n    5742 => 'uni166E',\n    5743 => 'uni166F',\n    5744 => 'uni1670',\n    5745 => 'uni1671',\n    5746 => 'uni1672',\n    5747 => 'uni1673',\n    5748 => 'uni1674',\n    5749 => 'uni1675',\n    5750 => 'uni1676',\n    5760 => 'uni1680',\n    5761 => 'uni1681',\n    5762 => 'uni1682',\n    5763 => 'uni1683',\n    5764 => 'uni1684',\n    5765 => 'uni1685',\n    5766 => 'uni1686',\n    5767 => 'uni1687',\n    5768 => 'uni1688',\n    5769 => 'uni1689',\n    5770 => 'uni168A',\n    5771 => 'uni168B',\n    5772 => 'uni168C',\n    5773 => 'uni168D',\n    5774 => 'uni168E',\n    5775 => 'uni168F',\n    5776 => 'uni1690',\n    5777 => 'uni1691',\n    5778 => 'uni1692',\n    5779 => 'uni1693',\n    5780 => 'uni1694',\n    5781 => 'uni1695',\n    5782 => 'uni1696',\n    5783 => 'uni1697',\n    5784 => 'uni1698',\n    5785 => 'uni1699',\n    5786 => 'uni169A',\n    5787 => 'uni169B',\n    5788 => 'uni169C',\n    7424 => 'uni1D00',\n    7425 => 'uni1D01',\n    7426 => 'uni1D02',\n    7427 => 'uni1D03',\n    7428 => 'uni1D04',\n    7429 => 'uni1D05',\n    7430 => 'uni1D06',\n    7431 => 'uni1D07',\n    7432 => 'uni1D08',\n    7433 => 'uni1D09',\n    7434 => 'uni1D0A',\n    7435 => 'uni1D0B',\n    7436 => 'uni1D0C',\n    7437 => 'uni1D0D',\n    7438 => 'uni1D0E',\n    7439 => 'uni1D0F',\n    7440 => 'uni1D10',\n    7441 => 'uni1D11',\n    7442 => 'uni1D12',\n    7443 => 'uni1D13',\n    7444 => 'uni1D14',\n    7446 => 'uni1D16',\n    7447 => 'uni1D17',\n    7448 => 'uni1D18',\n    7449 => 'uni1D19',\n    7450 => 'uni1D1A',\n    7451 => 'uni1D1B',\n    7452 => 'uni1D1C',\n    7453 => 'uni1D1D',\n    7454 => 'uni1D1E',\n    7455 => 'uni1D1F',\n    7456 => 'uni1D20',\n    7457 => 'uni1D21',\n    7458 => 'uni1D22',\n    7459 => 'uni1D23',\n    7462 => 'uni1D26',\n    7463 => 'uni1D27',\n    7464 => 'uni1D28',\n    7465 => 'uni1D29',\n    7466 => 'uni1D2A',\n    7467 => 'uni1D2B',\n    7468 => 'uni1D2C',\n    7469 => 'uni1D2D',\n    7470 => 'uni1D2E',\n    7472 => 'uni1D30',\n    7473 => 'uni1D31',\n    7474 => 'uni1D32',\n    7475 => 'uni1D33',\n    7476 => 'uni1D34',\n    7477 => 'uni1D35',\n    7478 => 'uni1D36',\n    7479 => 'uni1D37',\n    7480 => 'uni1D38',\n    7481 => 'uni1D39',\n    7482 => 'uni1D3A',\n    7483 => 'uni1D3B',\n    7484 => 'uni1D3C',\n    7485 => 'uni1D3D',\n    7486 => 'uni1D3E',\n    7487 => 'uni1D3F',\n    7488 => 'uni1D40',\n    7489 => 'uni1D41',\n    7490 => 'uni1D42',\n    7491 => 'uni1D43',\n    7492 => 'uni1D44',\n    7493 => 'uni1D45',\n    7494 => 'uni1D46',\n    7495 => 'uni1D47',\n    7496 => 'uni1D48',\n    7497 => 'uni1D49',\n    7498 => 'uni1D4A',\n    7499 => 'uni1D4B',\n    7500 => 'uni1D4C',\n    7501 => 'uni1D4D',\n    7502 => 'uni1D4E',\n    7503 => 'uni1D4F',\n    7504 => 'uni1D50',\n    7505 => 'uni1D51',\n    7506 => 'uni1D52',\n    7507 => 'uni1D53',\n    7508 => 'uni1D54',\n    7509 => 'uni1D55',\n    7510 => 'uni1D56',\n    7511 => 'uni1D57',\n    7512 => 'uni1D58',\n    7513 => 'uni1D59',\n    7514 => 'uni1D5A',\n    7515 => 'uni1D5B',\n    7517 => 'uni1D5D',\n    7518 => 'uni1D5E',\n    7519 => 'uni1D5F',\n    7520 => 'uni1D60',\n    7521 => 'uni1D61',\n    7522 => 'uni1D62',\n    7523 => 'uni1D63',\n    7524 => 'uni1D64',\n    7525 => 'uni1D65',\n    7526 => 'uni1D66',\n    7527 => 'uni1D67',\n    7528 => 'uni1D68',\n    7529 => 'uni1D69',\n    7530 => 'uni1D6A',\n    7543 => 'uni1D77',\n    7544 => 'uni1D78',\n    7547 => 'uni1D7B',\n    7549 => 'uni1D7D',\n    7557 => 'uni1D85',\n    7579 => 'uni1D9B',\n    7580 => 'uni1D9C',\n    7581 => 'uni1D9D',\n    7582 => 'uni1D9E',\n    7583 => 'uni1D9F',\n    7584 => 'uni1DA0',\n    7585 => 'uni1DA1',\n    7586 => 'uni1DA2',\n    7587 => 'uni1DA3',\n    7588 => 'uni1DA4',\n    7589 => 'uni1DA5',\n    7590 => 'uni1DA6',\n    7591 => 'uni1DA7',\n    7592 => 'uni1DA8',\n    7593 => 'uni1DA9',\n    7594 => 'uni1DAA',\n    7595 => 'uni1DAB',\n    7596 => 'uni1DAC',\n    7597 => 'uni1DAD',\n    7598 => 'uni1DAE',\n    7599 => 'uni1DAF',\n    7600 => 'uni1DB0',\n    7601 => 'uni1DB1',\n    7602 => 'uni1DB2',\n    7603 => 'uni1DB3',\n    7604 => 'uni1DB4',\n    7605 => 'uni1DB5',\n    7606 => 'uni1DB6',\n    7607 => 'uni1DB7',\n    7608 => 'uni1DB8',\n    7609 => 'uni1DB9',\n    7610 => 'uni1DBA',\n    7611 => 'uni1DBB',\n    7612 => 'uni1DBC',\n    7613 => 'uni1DBD',\n    7614 => 'uni1DBE',\n    7615 => 'uni1DBF',\n    7620 => 'uni1DC4',\n    7621 => 'uni1DC5',\n    7622 => 'uni1DC6',\n    7623 => 'uni1DC7',\n    7624 => 'uni1DC8',\n    7625 => 'uni1DC9',\n    7680 => 'uni1E00',\n    7681 => 'uni1E01',\n    7682 => 'uni1E02',\n    7683 => 'uni1E03',\n    7684 => 'uni1E04',\n    7685 => 'uni1E05',\n    7686 => 'uni1E06',\n    7687 => 'uni1E07',\n    7688 => 'uni1E08',\n    7689 => 'uni1E09',\n    7690 => 'uni1E0A',\n    7691 => 'uni1E0B',\n    7692 => 'uni1E0C',\n    7693 => 'uni1E0D',\n    7694 => 'uni1E0E',\n    7695 => 'uni1E0F',\n    7696 => 'uni1E10',\n    7697 => 'uni1E11',\n    7698 => 'uni1E12',\n    7699 => 'uni1E13',\n    7700 => 'uni1E14',\n    7701 => 'uni1E15',\n    7702 => 'uni1E16',\n    7703 => 'uni1E17',\n    7704 => 'uni1E18',\n    7705 => 'uni1E19',\n    7706 => 'uni1E1A',\n    7707 => 'uni1E1B',\n    7708 => 'uni1E1C',\n    7709 => 'uni1E1D',\n    7710 => 'uni1E1E',\n    7711 => 'uni1E1F',\n    7712 => 'uni1E20',\n    7713 => 'uni1E21',\n    7714 => 'uni1E22',\n    7715 => 'uni1E23',\n    7716 => 'uni1E24',\n    7717 => 'uni1E25',\n    7718 => 'uni1E26',\n    7719 => 'uni1E27',\n    7720 => 'uni1E28',\n    7721 => 'uni1E29',\n    7722 => 'uni1E2A',\n    7723 => 'uni1E2B',\n    7724 => 'uni1E2C',\n    7725 => 'uni1E2D',\n    7726 => 'uni1E2E',\n    7727 => 'uni1E2F',\n    7728 => 'uni1E30',\n    7729 => 'uni1E31',\n    7730 => 'uni1E32',\n    7731 => 'uni1E33',\n    7732 => 'uni1E34',\n    7733 => 'uni1E35',\n    7734 => 'uni1E36',\n    7735 => 'uni1E37',\n    7736 => 'uni1E38',\n    7737 => 'uni1E39',\n    7738 => 'uni1E3A',\n    7739 => 'uni1E3B',\n    7740 => 'uni1E3C',\n    7741 => 'uni1E3D',\n    7742 => 'uni1E3E',\n    7743 => 'uni1E3F',\n    7744 => 'uni1E40',\n    7745 => 'uni1E41',\n    7746 => 'uni1E42',\n    7747 => 'uni1E43',\n    7748 => 'uni1E44',\n    7749 => 'uni1E45',\n    7750 => 'uni1E46',\n    7751 => 'uni1E47',\n    7752 => 'uni1E48',\n    7753 => 'uni1E49',\n    7754 => 'uni1E4A',\n    7755 => 'uni1E4B',\n    7756 => 'uni1E4C',\n    7757 => 'uni1E4D',\n    7758 => 'uni1E4E',\n    7759 => 'uni1E4F',\n    7760 => 'uni1E50',\n    7761 => 'uni1E51',\n    7762 => 'uni1E52',\n    7763 => 'uni1E53',\n    7764 => 'uni1E54',\n    7765 => 'uni1E55',\n    7766 => 'uni1E56',\n    7767 => 'uni1E57',\n    7768 => 'uni1E58',\n    7769 => 'uni1E59',\n    7770 => 'uni1E5A',\n    7771 => 'uni1E5B',\n    7772 => 'uni1E5C',\n    7773 => 'uni1E5D',\n    7774 => 'uni1E5E',\n    7775 => 'uni1E5F',\n    7776 => 'uni1E60',\n    7777 => 'uni1E61',\n    7778 => 'uni1E62',\n    7779 => 'uni1E63',\n    7780 => 'uni1E64',\n    7781 => 'uni1E65',\n    7782 => 'uni1E66',\n    7783 => 'uni1E67',\n    7784 => 'uni1E68',\n    7785 => 'uni1E69',\n    7786 => 'uni1E6A',\n    7787 => 'uni1E6B',\n    7788 => 'uni1E6C',\n    7789 => 'uni1E6D',\n    7790 => 'uni1E6E',\n    7791 => 'uni1E6F',\n    7792 => 'uni1E70',\n    7793 => 'uni1E71',\n    7794 => 'uni1E72',\n    7795 => 'uni1E73',\n    7796 => 'uni1E74',\n    7797 => 'uni1E75',\n    7798 => 'uni1E76',\n    7799 => 'uni1E77',\n    7800 => 'uni1E78',\n    7801 => 'uni1E79',\n    7802 => 'uni1E7A',\n    7803 => 'uni1E7B',\n    7804 => 'uni1E7C',\n    7805 => 'uni1E7D',\n    7806 => 'uni1E7E',\n    7807 => 'uni1E7F',\n    7808 => 'Wgrave',\n    7809 => 'wgrave',\n    7810 => 'Wacute',\n    7811 => 'wacute',\n    7812 => 'Wdieresis',\n    7813 => 'wdieresis',\n    7814 => 'uni1E86',\n    7815 => 'uni1E87',\n    7816 => 'uni1E88',\n    7817 => 'uni1E89',\n    7818 => 'uni1E8A',\n    7819 => 'uni1E8B',\n    7820 => 'uni1E8C',\n    7821 => 'uni1E8D',\n    7822 => 'uni1E8E',\n    7823 => 'uni1E8F',\n    7824 => 'uni1E90',\n    7825 => 'uni1E91',\n    7826 => 'uni1E92',\n    7827 => 'uni1E93',\n    7828 => 'uni1E94',\n    7829 => 'uni1E95',\n    7830 => 'uni1E96',\n    7831 => 'uni1E97',\n    7832 => 'uni1E98',\n    7833 => 'uni1E99',\n    7834 => 'uni1E9A',\n    7835 => 'uni1E9B',\n    7836 => 'uni1E9C',\n    7837 => 'uni1E9D',\n    7838 => 'uni1E9E',\n    7839 => 'uni1E9F',\n    7840 => 'uni1EA0',\n    7841 => 'uni1EA1',\n    7842 => 'uni1EA2',\n    7843 => 'uni1EA3',\n    7844 => 'uni1EA4',\n    7845 => 'uni1EA5',\n    7846 => 'uni1EA6',\n    7847 => 'uni1EA7',\n    7848 => 'uni1EA8',\n    7849 => 'uni1EA9',\n    7850 => 'uni1EAA',\n    7851 => 'uni1EAB',\n    7852 => 'uni1EAC',\n    7853 => 'uni1EAD',\n    7854 => 'uni1EAE',\n    7855 => 'uni1EAF',\n    7856 => 'uni1EB0',\n    7857 => 'uni1EB1',\n    7858 => 'uni1EB2',\n    7859 => 'uni1EB3',\n    7860 => 'uni1EB4',\n    7861 => 'uni1EB5',\n    7862 => 'uni1EB6',\n    7863 => 'uni1EB7',\n    7864 => 'uni1EB8',\n    7865 => 'uni1EB9',\n    7866 => 'uni1EBA',\n    7867 => 'uni1EBB',\n    7868 => 'uni1EBC',\n    7869 => 'uni1EBD',\n    7870 => 'uni1EBE',\n    7871 => 'uni1EBF',\n    7872 => 'uni1EC0',\n    7873 => 'uni1EC1',\n    7874 => 'uni1EC2',\n    7875 => 'uni1EC3',\n    7876 => 'uni1EC4',\n    7877 => 'uni1EC5',\n    7878 => 'uni1EC6',\n    7879 => 'uni1EC7',\n    7880 => 'uni1EC8',\n    7881 => 'uni1EC9',\n    7882 => 'uni1ECA',\n    7883 => 'uni1ECB',\n    7884 => 'uni1ECC',\n    7885 => 'uni1ECD',\n    7886 => 'uni1ECE',\n    7887 => 'uni1ECF',\n    7888 => 'uni1ED0',\n    7889 => 'uni1ED1',\n    7890 => 'uni1ED2',\n    7891 => 'uni1ED3',\n    7892 => 'uni1ED4',\n    7893 => 'uni1ED5',\n    7894 => 'uni1ED6',\n    7895 => 'uni1ED7',\n    7896 => 'uni1ED8',\n    7897 => 'uni1ED9',\n    7898 => 'uni1EDA',\n    7899 => 'uni1EDB',\n    7900 => 'uni1EDC',\n    7901 => 'uni1EDD',\n    7902 => 'uni1EDE',\n    7903 => 'uni1EDF',\n    7904 => 'uni1EE0',\n    7905 => 'uni1EE1',\n    7906 => 'uni1EE2',\n    7907 => 'uni1EE3',\n    7908 => 'uni1EE4',\n    7909 => 'uni1EE5',\n    7910 => 'uni1EE6',\n    7911 => 'uni1EE7',\n    7912 => 'uni1EE8',\n    7913 => 'uni1EE9',\n    7914 => 'uni1EEA',\n    7915 => 'uni1EEB',\n    7916 => 'uni1EEC',\n    7917 => 'uni1EED',\n    7918 => 'uni1EEE',\n    7919 => 'uni1EEF',\n    7920 => 'uni1EF0',\n    7921 => 'uni1EF1',\n    7922 => 'Ygrave',\n    7923 => 'ygrave',\n    7924 => 'uni1EF4',\n    7925 => 'uni1EF5',\n    7926 => 'uni1EF6',\n    7927 => 'uni1EF7',\n    7928 => 'uni1EF8',\n    7929 => 'uni1EF9',\n    7930 => 'uni1EFA',\n    7931 => 'uni1EFB',\n    7936 => 'uni1F00',\n    7937 => 'uni1F01',\n    7938 => 'uni1F02',\n    7939 => 'uni1F03',\n    7940 => 'uni1F04',\n    7941 => 'uni1F05',\n    7942 => 'uni1F06',\n    7943 => 'uni1F07',\n    7944 => 'uni1F08',\n    7945 => 'uni1F09',\n    7946 => 'uni1F0A',\n    7947 => 'uni1F0B',\n    7948 => 'uni1F0C',\n    7949 => 'uni1F0D',\n    7950 => 'uni1F0E',\n    7951 => 'uni1F0F',\n    7952 => 'uni1F10',\n    7953 => 'uni1F11',\n    7954 => 'uni1F12',\n    7955 => 'uni1F13',\n    7956 => 'uni1F14',\n    7957 => 'uni1F15',\n    7960 => 'uni1F18',\n    7961 => 'uni1F19',\n    7962 => 'uni1F1A',\n    7963 => 'uni1F1B',\n    7964 => 'uni1F1C',\n    7965 => 'uni1F1D',\n    7968 => 'uni1F20',\n    7969 => 'uni1F21',\n    7970 => 'uni1F22',\n    7971 => 'uni1F23',\n    7972 => 'uni1F24',\n    7973 => 'uni1F25',\n    7974 => 'uni1F26',\n    7975 => 'uni1F27',\n    7976 => 'uni1F28',\n    7977 => 'uni1F29',\n    7978 => 'uni1F2A',\n    7979 => 'uni1F2B',\n    7980 => 'uni1F2C',\n    7981 => 'uni1F2D',\n    7982 => 'uni1F2E',\n    7983 => 'uni1F2F',\n    7984 => 'uni1F30',\n    7985 => 'uni1F31',\n    7986 => 'uni1F32',\n    7987 => 'uni1F33',\n    7988 => 'uni1F34',\n    7989 => 'uni1F35',\n    7990 => 'uni1F36',\n    7991 => 'uni1F37',\n    7992 => 'uni1F38',\n    7993 => 'uni1F39',\n    7994 => 'uni1F3A',\n    7995 => 'uni1F3B',\n    7996 => 'uni1F3C',\n    7997 => 'uni1F3D',\n    7998 => 'uni1F3E',\n    7999 => 'uni1F3F',\n    8000 => 'uni1F40',\n    8001 => 'uni1F41',\n    8002 => 'uni1F42',\n    8003 => 'uni1F43',\n    8004 => 'uni1F44',\n    8005 => 'uni1F45',\n    8008 => 'uni1F48',\n    8009 => 'uni1F49',\n    8010 => 'uni1F4A',\n    8011 => 'uni1F4B',\n    8012 => 'uni1F4C',\n    8013 => 'uni1F4D',\n    8016 => 'uni1F50',\n    8017 => 'uni1F51',\n    8018 => 'uni1F52',\n    8019 => 'uni1F53',\n    8020 => 'uni1F54',\n    8021 => 'uni1F55',\n    8022 => 'uni1F56',\n    8023 => 'uni1F57',\n    8025 => 'uni1F59',\n    8027 => 'uni1F5B',\n    8029 => 'uni1F5D',\n    8031 => 'uni1F5F',\n    8032 => 'uni1F60',\n    8033 => 'uni1F61',\n    8034 => 'uni1F62',\n    8035 => 'uni1F63',\n    8036 => 'uni1F64',\n    8037 => 'uni1F65',\n    8038 => 'uni1F66',\n    8039 => 'uni1F67',\n    8040 => 'uni1F68',\n    8041 => 'uni1F69',\n    8042 => 'uni1F6A',\n    8043 => 'uni1F6B',\n    8044 => 'uni1F6C',\n    8045 => 'uni1F6D',\n    8046 => 'uni1F6E',\n    8047 => 'uni1F6F',\n    8048 => 'uni1F70',\n    8049 => 'uni1F71',\n    8050 => 'uni1F72',\n    8051 => 'uni1F73',\n    8052 => 'uni1F74',\n    8053 => 'uni1F75',\n    8054 => 'uni1F76',\n    8055 => 'uni1F77',\n    8056 => 'uni1F78',\n    8057 => 'uni1F79',\n    8058 => 'uni1F7A',\n    8059 => 'uni1F7B',\n    8060 => 'uni1F7C',\n    8061 => 'uni1F7D',\n    8064 => 'uni1F80',\n    8065 => 'uni1F81',\n    8066 => 'uni1F82',\n    8067 => 'uni1F83',\n    8068 => 'uni1F84',\n    8069 => 'uni1F85',\n    8070 => 'uni1F86',\n    8071 => 'uni1F87',\n    8072 => 'uni1F88',\n    8073 => 'uni1F89',\n    8074 => 'uni1F8A',\n    8075 => 'uni1F8B',\n    8076 => 'uni1F8C',\n    8077 => 'uni1F8D',\n    8078 => 'uni1F8E',\n    8079 => 'uni1F8F',\n    8080 => 'uni1F90',\n    8081 => 'uni1F91',\n    8082 => 'uni1F92',\n    8083 => 'uni1F93',\n    8084 => 'uni1F94',\n    8085 => 'uni1F95',\n    8086 => 'uni1F96',\n    8087 => 'uni1F97',\n    8088 => 'uni1F98',\n    8089 => 'uni1F99',\n    8090 => 'uni1F9A',\n    8091 => 'uni1F9B',\n    8092 => 'uni1F9C',\n    8093 => 'uni1F9D',\n    8094 => 'uni1F9E',\n    8095 => 'uni1F9F',\n    8096 => 'uni1FA0',\n    8097 => 'uni1FA1',\n    8098 => 'uni1FA2',\n    8099 => 'uni1FA3',\n    8100 => 'uni1FA4',\n    8101 => 'uni1FA5',\n    8102 => 'uni1FA6',\n    8103 => 'uni1FA7',\n    8104 => 'uni1FA8',\n    8105 => 'uni1FA9',\n    8106 => 'uni1FAA',\n    8107 => 'uni1FAB',\n    8108 => 'uni1FAC',\n    8109 => 'uni1FAD',\n    8110 => 'uni1FAE',\n    8111 => 'uni1FAF',\n    8112 => 'uni1FB0',\n    8113 => 'uni1FB1',\n    8114 => 'uni1FB2',\n    8115 => 'uni1FB3',\n    8116 => 'uni1FB4',\n    8118 => 'uni1FB6',\n    8119 => 'uni1FB7',\n    8120 => 'uni1FB8',\n    8121 => 'uni1FB9',\n    8122 => 'uni1FBA',\n    8123 => 'uni1FBB',\n    8124 => 'uni1FBC',\n    8125 => 'uni1FBD',\n    8126 => 'uni1FBE',\n    8127 => 'uni1FBF',\n    8128 => 'uni1FC0',\n    8129 => 'uni1FC1',\n    8130 => 'uni1FC2',\n    8131 => 'uni1FC3',\n    8132 => 'uni1FC4',\n    8134 => 'uni1FC6',\n    8135 => 'uni1FC7',\n    8136 => 'uni1FC8',\n    8137 => 'uni1FC9',\n    8138 => 'uni1FCA',\n    8139 => 'uni1FCB',\n    8140 => 'uni1FCC',\n    8141 => 'uni1FCD',\n    8142 => 'uni1FCE',\n    8143 => 'uni1FCF',\n    8144 => 'uni1FD0',\n    8145 => 'uni1FD1',\n    8146 => 'uni1FD2',\n    8147 => 'uni1FD3',\n    8150 => 'uni1FD6',\n    8151 => 'uni1FD7',\n    8152 => 'uni1FD8',\n    8153 => 'uni1FD9',\n    8154 => 'uni1FDA',\n    8155 => 'uni1FDB',\n    8157 => 'uni1FDD',\n    8158 => 'uni1FDE',\n    8159 => 'uni1FDF',\n    8160 => 'uni1FE0',\n    8161 => 'uni1FE1',\n    8162 => 'uni1FE2',\n    8163 => 'uni1FE3',\n    8164 => 'uni1FE4',\n    8165 => 'uni1FE5',\n    8166 => 'uni1FE6',\n    8167 => 'uni1FE7',\n    8168 => 'uni1FE8',\n    8169 => 'uni1FE9',\n    8170 => 'uni1FEA',\n    8171 => 'uni1FEB',\n    8172 => 'uni1FEC',\n    8173 => 'uni1FED',\n    8174 => 'uni1FEE',\n    8175 => 'uni1FEF',\n    8178 => 'uni1FF2',\n    8179 => 'uni1FF3',\n    8180 => 'uni1FF4',\n    8182 => 'uni1FF6',\n    8183 => 'uni1FF7',\n    8184 => 'uni1FF8',\n    8185 => 'uni1FF9',\n    8186 => 'uni1FFA',\n    8187 => 'uni1FFB',\n    8188 => 'uni1FFC',\n    8189 => 'uni1FFD',\n    8190 => 'uni1FFE',\n    8192 => 'uni2000',\n    8193 => 'uni2001',\n    8194 => 'uni2002',\n    8195 => 'uni2003',\n    8196 => 'uni2004',\n    8197 => 'uni2005',\n    8198 => 'uni2006',\n    8199 => 'uni2007',\n    8200 => 'uni2008',\n    8201 => 'uni2009',\n    8202 => 'uni200A',\n    8203 => 'uni200B',\n    8204 => 'uni200C',\n    8205 => 'uni200D',\n    8206 => 'uni200E',\n    8207 => 'uni200F',\n    8208 => 'uni2010',\n    8209 => 'uni2011',\n    8210 => 'figuredash',\n    8211 => 'endash',\n    8212 => 'emdash',\n    8213 => 'uni2015',\n    8214 => 'uni2016',\n    8215 => 'underscoredbl',\n    8216 => 'quoteleft',\n    8217 => 'quoteright',\n    8218 => 'quotesinglbase',\n    8219 => 'quotereversed',\n    8220 => 'quotedblleft',\n    8221 => 'quotedblright',\n    8222 => 'quotedblbase',\n    8223 => 'uni201F',\n    8224 => 'dagger',\n    8225 => 'daggerdbl',\n    8226 => 'bullet',\n    8227 => 'uni2023',\n    8228 => 'onedotenleader',\n    8229 => 'twodotenleader',\n    8230 => 'ellipsis',\n    8231 => 'uni2027',\n    8232 => 'uni2028',\n    8233 => 'uni2029',\n    8234 => 'uni202A',\n    8235 => 'uni202B',\n    8236 => 'uni202C',\n    8237 => 'uni202D',\n    8238 => 'uni202E',\n    8239 => 'uni202F',\n    8240 => 'perthousand',\n    8241 => 'uni2031',\n    8242 => 'minute',\n    8243 => 'second',\n    8244 => 'uni2034',\n    8245 => 'uni2035',\n    8246 => 'uni2036',\n    8247 => 'uni2037',\n    8248 => 'uni2038',\n    8249 => 'guilsinglleft',\n    8250 => 'guilsinglright',\n    8251 => 'uni203B',\n    8252 => 'exclamdbl',\n    8253 => 'uni203D',\n    8254 => 'uni203E',\n    8255 => 'uni203F',\n    8256 => 'uni2040',\n    8257 => 'uni2041',\n    8258 => 'uni2042',\n    8259 => 'uni2043',\n    8260 => 'fraction',\n    8261 => 'uni2045',\n    8262 => 'uni2046',\n    8263 => 'uni2047',\n    8264 => 'uni2048',\n    8265 => 'uni2049',\n    8266 => 'uni204A',\n    8267 => 'uni204B',\n    8268 => 'uni204C',\n    8269 => 'uni204D',\n    8270 => 'uni204E',\n    8271 => 'uni204F',\n    8272 => 'uni2050',\n    8273 => 'uni2051',\n    8274 => 'uni2052',\n    8275 => 'uni2053',\n    8276 => 'uni2054',\n    8277 => 'uni2055',\n    8278 => 'uni2056',\n    8279 => 'uni2057',\n    8280 => 'uni2058',\n    8281 => 'uni2059',\n    8282 => 'uni205A',\n    8283 => 'uni205B',\n    8284 => 'uni205C',\n    8285 => 'uni205D',\n    8286 => 'uni205E',\n    8287 => 'uni205F',\n    8288 => 'uni2060',\n    8289 => 'uni2061',\n    8290 => 'uni2062',\n    8291 => 'uni2063',\n    8292 => 'uni2064',\n    8298 => 'uni206A',\n    8299 => 'uni206B',\n    8300 => 'uni206C',\n    8301 => 'uni206D',\n    8302 => 'uni206E',\n    8303 => 'uni206F',\n    8304 => 'uni2070',\n    8305 => 'uni2071',\n    8308 => 'uni2074',\n    8309 => 'uni2075',\n    8310 => 'uni2076',\n    8311 => 'uni2077',\n    8312 => 'uni2078',\n    8313 => 'uni2079',\n    8314 => 'uni207A',\n    8315 => 'uni207B',\n    8316 => 'uni207C',\n    8317 => 'uni207D',\n    8318 => 'uni207E',\n    8319 => 'uni207F',\n    8320 => 'uni2080',\n    8321 => 'uni2081',\n    8322 => 'uni2082',\n    8323 => 'uni2083',\n    8324 => 'uni2084',\n    8325 => 'uni2085',\n    8326 => 'uni2086',\n    8327 => 'uni2087',\n    8328 => 'uni2088',\n    8329 => 'uni2089',\n    8330 => 'uni208A',\n    8331 => 'uni208B',\n    8332 => 'uni208C',\n    8333 => 'uni208D',\n    8334 => 'uni208E',\n    8336 => 'uni2090',\n    8337 => 'uni2091',\n    8338 => 'uni2092',\n    8339 => 'uni2093',\n    8340 => 'uni2094',\n    8341 => 'uni2095',\n    8342 => 'uni2096',\n    8343 => 'uni2097',\n    8344 => 'uni2098',\n    8345 => 'uni2099',\n    8346 => 'uni209A',\n    8347 => 'uni209B',\n    8348 => 'uni209C',\n    8352 => 'uni20A0',\n    8353 => 'colonmonetary',\n    8354 => 'uni20A2',\n    8355 => 'franc',\n    8356 => 'lira',\n    8357 => 'uni20A5',\n    8358 => 'uni20A6',\n    8359 => 'peseta',\n    8360 => 'uni20A8',\n    8361 => 'uni20A9',\n    8362 => 'uni20AA',\n    8363 => 'dong',\n    8364 => 'Euro',\n    8365 => 'uni20AD',\n    8366 => 'uni20AE',\n    8367 => 'uni20AF',\n    8368 => 'uni20B0',\n    8369 => 'uni20B1',\n    8370 => 'uni20B2',\n    8371 => 'uni20B3',\n    8372 => 'uni20B4',\n    8373 => 'uni20B5',\n    8376 => 'uni20B8',\n    8377 => 'uni20B9',\n    8378 => 'uni20BA',\n    8381 => 'uni20BD',\n    8400 => 'uni20D0',\n    8401 => 'uni20D1',\n    8406 => 'uni20D6',\n    8407 => 'uni20D7',\n    8411 => 'uni20DB',\n    8412 => 'uni20DC',\n    8417 => 'uni20E1',\n    8448 => 'uni2100',\n    8449 => 'uni2101',\n    8450 => 'uni2102',\n    8451 => 'uni2103',\n    8452 => 'uni2104',\n    8453 => 'uni2105',\n    8454 => 'uni2106',\n    8455 => 'uni2107',\n    8456 => 'uni2108',\n    8457 => 'uni2109',\n    8459 => 'uni210B',\n    8460 => 'uni210C',\n    8461 => 'uni210D',\n    8462 => 'uni210E',\n    8463 => 'uni210F',\n    8464 => 'uni2110',\n    8465 => 'Ifraktur',\n    8466 => 'uni2112',\n    8467 => 'uni2113',\n    8468 => 'uni2114',\n    8469 => 'uni2115',\n    8470 => 'uni2116',\n    8471 => 'uni2117',\n    8472 => 'weierstrass',\n    8473 => 'uni2119',\n    8474 => 'uni211A',\n    8475 => 'uni211B',\n    8476 => 'Rfraktur',\n    8477 => 'uni211D',\n    8478 => 'prescription',\n    8479 => 'uni211F',\n    8480 => 'uni2120',\n    8481 => 'uni2121',\n    8482 => 'trademark',\n    8483 => 'uni2123',\n    8484 => 'uni2124',\n    8485 => 'uni2125',\n    8486 => 'uni2126',\n    8487 => 'uni2127',\n    8488 => 'uni2128',\n    8489 => 'uni2129',\n    8490 => 'uni212A',\n    8491 => 'uni212B',\n    8492 => 'uni212C',\n    8493 => 'uni212D',\n    8494 => 'estimated',\n    8495 => 'uni212F',\n    8496 => 'uni2130',\n    8497 => 'uni2131',\n    8498 => 'uni2132',\n    8499 => 'uni2133',\n    8500 => 'uni2134',\n    8501 => 'aleph',\n    8502 => 'uni2136',\n    8503 => 'uni2137',\n    8504 => 'uni2138',\n    8505 => 'uni2139',\n    8506 => 'uni213A',\n    8507 => 'uni213B',\n    8508 => 'uni213C',\n    8509 => 'uni213D',\n    8510 => 'uni213E',\n    8511 => 'uni213F',\n    8512 => 'uni2140',\n    8513 => 'uni2141',\n    8514 => 'uni2142',\n    8515 => 'uni2143',\n    8516 => 'uni2144',\n    8517 => 'uni2145',\n    8518 => 'uni2146',\n    8519 => 'uni2147',\n    8520 => 'uni2148',\n    8521 => 'uni2149',\n    8523 => 'uni214B',\n    8526 => 'uni214E',\n    8528 => 'uni2150',\n    8529 => 'uni2151',\n    8530 => 'uni2152',\n    8531 => 'onethird',\n    8532 => 'twothirds',\n    8533 => 'uni2155',\n    8534 => 'uni2156',\n    8535 => 'uni2157',\n    8536 => 'uni2158',\n    8537 => 'uni2159',\n    8538 => 'uni215A',\n    8539 => 'oneeighth',\n    8540 => 'threeeighths',\n    8541 => 'fiveeighths',\n    8542 => 'seveneighths',\n    8543 => 'uni215F',\n    8544 => 'uni2160',\n    8545 => 'uni2161',\n    8546 => 'uni2162',\n    8547 => 'uni2163',\n    8548 => 'uni2164',\n    8549 => 'uni2165',\n    8550 => 'uni2166',\n    8551 => 'uni2167',\n    8552 => 'uni2168',\n    8553 => 'uni2169',\n    8554 => 'uni216A',\n    8555 => 'uni216B',\n    8556 => 'uni216C',\n    8557 => 'uni216D',\n    8558 => 'uni216E',\n    8559 => 'uni216F',\n    8560 => 'uni2170',\n    8561 => 'uni2171',\n    8562 => 'uni2172',\n    8563 => 'uni2173',\n    8564 => 'uni2174',\n    8565 => 'uni2175',\n    8566 => 'uni2176',\n    8567 => 'uni2177',\n    8568 => 'uni2178',\n    8569 => 'uni2179',\n    8570 => 'uni217A',\n    8571 => 'uni217B',\n    8572 => 'uni217C',\n    8573 => 'uni217D',\n    8574 => 'uni217E',\n    8575 => 'uni217F',\n    8576 => 'uni2180',\n    8577 => 'uni2181',\n    8578 => 'uni2182',\n    8579 => 'uni2183',\n    8580 => 'uni2184',\n    8581 => 'uni2185',\n    8585 => 'uni2189',\n    8592 => 'arrowleft',\n    8593 => 'arrowup',\n    8594 => 'arrowright',\n    8595 => 'arrowdown',\n    8596 => 'arrowboth',\n    8597 => 'arrowupdn',\n    8598 => 'uni2196',\n    8599 => 'uni2197',\n    8600 => 'uni2198',\n    8601 => 'uni2199',\n    8602 => 'uni219A',\n    8603 => 'uni219B',\n    8604 => 'uni219C',\n    8605 => 'uni219D',\n    8606 => 'uni219E',\n    8607 => 'uni219F',\n    8608 => 'uni21A0',\n    8609 => 'uni21A1',\n    8610 => 'uni21A2',\n    8611 => 'uni21A3',\n    8612 => 'uni21A4',\n    8613 => 'uni21A5',\n    8614 => 'uni21A6',\n    8615 => 'uni21A7',\n    8616 => 'arrowupdnbse',\n    8617 => 'uni21A9',\n    8618 => 'uni21AA',\n    8619 => 'uni21AB',\n    8620 => 'uni21AC',\n    8621 => 'uni21AD',\n    8622 => 'uni21AE',\n    8623 => 'uni21AF',\n    8624 => 'uni21B0',\n    8625 => 'uni21B1',\n    8626 => 'uni21B2',\n    8627 => 'uni21B3',\n    8628 => 'uni21B4',\n    8629 => 'carriagereturn',\n    8630 => 'uni21B6',\n    8631 => 'uni21B7',\n    8632 => 'uni21B8',\n    8633 => 'uni21B9',\n    8634 => 'uni21BA',\n    8635 => 'uni21BB',\n    8636 => 'uni21BC',\n    8637 => 'uni21BD',\n    8638 => 'uni21BE',\n    8639 => 'uni21BF',\n    8640 => 'uni21C0',\n    8641 => 'uni21C1',\n    8642 => 'uni21C2',\n    8643 => 'uni21C3',\n    8644 => 'uni21C4',\n    8645 => 'uni21C5',\n    8646 => 'uni21C6',\n    8647 => 'uni21C7',\n    8648 => 'uni21C8',\n    8649 => 'uni21C9',\n    8650 => 'uni21CA',\n    8651 => 'uni21CB',\n    8652 => 'uni21CC',\n    8653 => 'uni21CD',\n    8654 => 'uni21CE',\n    8655 => 'uni21CF',\n    8656 => 'arrowdblleft',\n    8657 => 'arrowdblup',\n    8658 => 'arrowdblright',\n    8659 => 'arrowdbldown',\n    8660 => 'arrowdblboth',\n    8661 => 'uni21D5',\n    8662 => 'uni21D6',\n    8663 => 'uni21D7',\n    8664 => 'uni21D8',\n    8665 => 'uni21D9',\n    8666 => 'uni21DA',\n    8667 => 'uni21DB',\n    8668 => 'uni21DC',\n    8669 => 'uni21DD',\n    8670 => 'uni21DE',\n    8671 => 'uni21DF',\n    8672 => 'uni21E0',\n    8673 => 'uni21E1',\n    8674 => 'uni21E2',\n    8675 => 'uni21E3',\n    8676 => 'uni21E4',\n    8677 => 'uni21E5',\n    8678 => 'uni21E6',\n    8679 => 'uni21E7',\n    8680 => 'uni21E8',\n    8681 => 'uni21E9',\n    8682 => 'uni21EA',\n    8683 => 'uni21EB',\n    8684 => 'uni21EC',\n    8685 => 'uni21ED',\n    8686 => 'uni21EE',\n    8687 => 'uni21EF',\n    8688 => 'uni21F0',\n    8689 => 'uni21F1',\n    8690 => 'uni21F2',\n    8691 => 'uni21F3',\n    8692 => 'uni21F4',\n    8693 => 'uni21F5',\n    8694 => 'uni21F6',\n    8695 => 'uni21F7',\n    8696 => 'uni21F8',\n    8697 => 'uni21F9',\n    8698 => 'uni21FA',\n    8699 => 'uni21FB',\n    8700 => 'uni21FC',\n    8701 => 'uni21FD',\n    8702 => 'uni21FE',\n    8703 => 'uni21FF',\n    8704 => 'universal',\n    8705 => 'uni2201',\n    8706 => 'partialdiff',\n    8707 => 'existential',\n    8708 => 'uni2204',\n    8709 => 'emptyset',\n    8710 => 'increment',\n    8711 => 'gradient',\n    8712 => 'element',\n    8713 => 'notelement',\n    8714 => 'uni220A',\n    8715 => 'suchthat',\n    8716 => 'uni220C',\n    8717 => 'uni220D',\n    8718 => 'uni220E',\n    8719 => 'product',\n    8720 => 'uni2210',\n    8721 => 'summation',\n    8722 => 'minus',\n    8723 => 'uni2213',\n    8724 => 'uni2214',\n    8725 => 'uni2215',\n    8726 => 'uni2216',\n    8727 => 'asteriskmath',\n    8728 => 'uni2218',\n    8729 => 'uni2219',\n    8730 => 'radical',\n    8731 => 'uni221B',\n    8732 => 'uni221C',\n    8733 => 'proportional',\n    8734 => 'infinity',\n    8735 => 'orthogonal',\n    8736 => 'angle',\n    8737 => 'uni2221',\n    8738 => 'uni2222',\n    8739 => 'uni2223',\n    8740 => 'uni2224',\n    8741 => 'uni2225',\n    8742 => 'uni2226',\n    8743 => 'logicaland',\n    8744 => 'logicalor',\n    8745 => 'intersection',\n    8746 => 'union',\n    8747 => 'integral',\n    8748 => 'uni222C',\n    8749 => 'uni222D',\n    8750 => 'uni222E',\n    8751 => 'uni222F',\n    8752 => 'uni2230',\n    8753 => 'uni2231',\n    8754 => 'uni2232',\n    8755 => 'uni2233',\n    8756 => 'therefore',\n    8757 => 'uni2235',\n    8758 => 'uni2236',\n    8759 => 'uni2237',\n    8760 => 'uni2238',\n    8761 => 'uni2239',\n    8762 => 'uni223A',\n    8763 => 'uni223B',\n    8764 => 'similar',\n    8765 => 'uni223D',\n    8766 => 'uni223E',\n    8767 => 'uni223F',\n    8768 => 'uni2240',\n    8769 => 'uni2241',\n    8770 => 'uni2242',\n    8771 => 'uni2243',\n    8772 => 'uni2244',\n    8773 => 'congruent',\n    8774 => 'uni2246',\n    8775 => 'uni2247',\n    8776 => 'approxequal',\n    8777 => 'uni2249',\n    8778 => 'uni224A',\n    8779 => 'uni224B',\n    8780 => 'uni224C',\n    8781 => 'uni224D',\n    8782 => 'uni224E',\n    8783 => 'uni224F',\n    8784 => 'uni2250',\n    8785 => 'uni2251',\n    8786 => 'uni2252',\n    8787 => 'uni2253',\n    8788 => 'uni2254',\n    8789 => 'uni2255',\n    8790 => 'uni2256',\n    8791 => 'uni2257',\n    8792 => 'uni2258',\n    8793 => 'uni2259',\n    8794 => 'uni225A',\n    8795 => 'uni225B',\n    8796 => 'uni225C',\n    8797 => 'uni225D',\n    8798 => 'uni225E',\n    8799 => 'uni225F',\n    8800 => 'notequal',\n    8801 => 'equivalence',\n    8802 => 'uni2262',\n    8803 => 'uni2263',\n    8804 => 'lessequal',\n    8805 => 'greaterequal',\n    8806 => 'uni2266',\n    8807 => 'uni2267',\n    8808 => 'uni2268',\n    8809 => 'uni2269',\n    8810 => 'uni226A',\n    8811 => 'uni226B',\n    8812 => 'uni226C',\n    8813 => 'uni226D',\n    8814 => 'uni226E',\n    8815 => 'uni226F',\n    8816 => 'uni2270',\n    8817 => 'uni2271',\n    8818 => 'uni2272',\n    8819 => 'uni2273',\n    8820 => 'uni2274',\n    8821 => 'uni2275',\n    8822 => 'uni2276',\n    8823 => 'uni2277',\n    8824 => 'uni2278',\n    8825 => 'uni2279',\n    8826 => 'uni227A',\n    8827 => 'uni227B',\n    8828 => 'uni227C',\n    8829 => 'uni227D',\n    8830 => 'uni227E',\n    8831 => 'uni227F',\n    8832 => 'uni2280',\n    8833 => 'uni2281',\n    8834 => 'propersubset',\n    8835 => 'propersuperset',\n    8836 => 'notsubset',\n    8837 => 'uni2285',\n    8838 => 'reflexsubset',\n    8839 => 'reflexsuperset',\n    8840 => 'uni2288',\n    8841 => 'uni2289',\n    8842 => 'uni228A',\n    8843 => 'uni228B',\n    8844 => 'uni228C',\n    8845 => 'uni228D',\n    8846 => 'uni228E',\n    8847 => 'uni228F',\n    8848 => 'uni2290',\n    8849 => 'uni2291',\n    8850 => 'uni2292',\n    8851 => 'uni2293',\n    8852 => 'uni2294',\n    8853 => 'circleplus',\n    8854 => 'uni2296',\n    8855 => 'circlemultiply',\n    8856 => 'uni2298',\n    8857 => 'uni2299',\n    8858 => 'uni229A',\n    8859 => 'uni229B',\n    8860 => 'uni229C',\n    8861 => 'uni229D',\n    8862 => 'uni229E',\n    8863 => 'uni229F',\n    8864 => 'uni22A0',\n    8865 => 'uni22A1',\n    8866 => 'uni22A2',\n    8867 => 'uni22A3',\n    8868 => 'uni22A4',\n    8869 => 'perpendicular',\n    8870 => 'uni22A6',\n    8871 => 'uni22A7',\n    8872 => 'uni22A8',\n    8873 => 'uni22A9',\n    8874 => 'uni22AA',\n    8875 => 'uni22AB',\n    8876 => 'uni22AC',\n    8877 => 'uni22AD',\n    8878 => 'uni22AE',\n    8879 => 'uni22AF',\n    8880 => 'uni22B0',\n    8881 => 'uni22B1',\n    8882 => 'uni22B2',\n    8883 => 'uni22B3',\n    8884 => 'uni22B4',\n    8885 => 'uni22B5',\n    8886 => 'uni22B6',\n    8887 => 'uni22B7',\n    8888 => 'uni22B8',\n    8889 => 'uni22B9',\n    8890 => 'uni22BA',\n    8891 => 'uni22BB',\n    8892 => 'uni22BC',\n    8893 => 'uni22BD',\n    8894 => 'uni22BE',\n    8895 => 'uni22BF',\n    8896 => 'uni22C0',\n    8897 => 'uni22C1',\n    8898 => 'uni22C2',\n    8899 => 'uni22C3',\n    8900 => 'uni22C4',\n    8901 => 'dotmath',\n    8902 => 'uni22C6',\n    8903 => 'uni22C7',\n    8904 => 'uni22C8',\n    8905 => 'uni22C9',\n    8906 => 'uni22CA',\n    8907 => 'uni22CB',\n    8908 => 'uni22CC',\n    8909 => 'uni22CD',\n    8910 => 'uni22CE',\n    8911 => 'uni22CF',\n    8912 => 'uni22D0',\n    8913 => 'uni22D1',\n    8914 => 'uni22D2',\n    8915 => 'uni22D3',\n    8916 => 'uni22D4',\n    8917 => 'uni22D5',\n    8918 => 'uni22D6',\n    8919 => 'uni22D7',\n    8920 => 'uni22D8',\n    8921 => 'uni22D9',\n    8922 => 'uni22DA',\n    8923 => 'uni22DB',\n    8924 => 'uni22DC',\n    8925 => 'uni22DD',\n    8926 => 'uni22DE',\n    8927 => 'uni22DF',\n    8928 => 'uni22E0',\n    8929 => 'uni22E1',\n    8930 => 'uni22E2',\n    8931 => 'uni22E3',\n    8932 => 'uni22E4',\n    8933 => 'uni22E5',\n    8934 => 'uni22E6',\n    8935 => 'uni22E7',\n    8936 => 'uni22E8',\n    8937 => 'uni22E9',\n    8938 => 'uni22EA',\n    8939 => 'uni22EB',\n    8940 => 'uni22EC',\n    8941 => 'uni22ED',\n    8942 => 'uni22EE',\n    8943 => 'uni22EF',\n    8944 => 'uni22F0',\n    8945 => 'uni22F1',\n    8946 => 'uni22F2',\n    8947 => 'uni22F3',\n    8948 => 'uni22F4',\n    8949 => 'uni22F5',\n    8950 => 'uni22F6',\n    8951 => 'uni22F7',\n    8952 => 'uni22F8',\n    8953 => 'uni22F9',\n    8954 => 'uni22FA',\n    8955 => 'uni22FB',\n    8956 => 'uni22FC',\n    8957 => 'uni22FD',\n    8958 => 'uni22FE',\n    8959 => 'uni22FF',\n    8960 => 'uni2300',\n    8961 => 'uni2301',\n    8962 => 'house',\n    8963 => 'uni2303',\n    8964 => 'uni2304',\n    8965 => 'uni2305',\n    8966 => 'uni2306',\n    8967 => 'uni2307',\n    8968 => 'uni2308',\n    8969 => 'uni2309',\n    8970 => 'uni230A',\n    8971 => 'uni230B',\n    8972 => 'uni230C',\n    8973 => 'uni230D',\n    8974 => 'uni230E',\n    8975 => 'uni230F',\n    8976 => 'revlogicalnot',\n    8977 => 'uni2311',\n    8984 => 'uni2318',\n    8985 => 'uni2319',\n    8988 => 'uni231C',\n    8989 => 'uni231D',\n    8990 => 'uni231E',\n    8991 => 'uni231F',\n    8992 => 'integraltp',\n    8993 => 'integralbt',\n    8996 => 'uni2324',\n    8997 => 'uni2325',\n    8998 => 'uni2326',\n    8999 => 'uni2327',\n    9000 => 'uni2328',\n    9003 => 'uni232B',\n    9004 => 'uni232C',\n    9075 => 'uni2373',\n    9076 => 'uni2374',\n    9077 => 'uni2375',\n    9082 => 'uni237A',\n    9085 => 'uni237D',\n    9095 => 'uni2387',\n    9108 => 'uni2394',\n    9115 => 'uni239B',\n    9116 => 'uni239C',\n    9117 => 'uni239D',\n    9118 => 'uni239E',\n    9119 => 'uni239F',\n    9120 => 'uni23A0',\n    9121 => 'uni23A1',\n    9122 => 'uni23A2',\n    9123 => 'uni23A3',\n    9124 => 'uni23A4',\n    9125 => 'uni23A5',\n    9126 => 'uni23A6',\n    9127 => 'uni23A7',\n    9128 => 'uni23A8',\n    9129 => 'uni23A9',\n    9130 => 'uni23AA',\n    9131 => 'uni23AB',\n    9132 => 'uni23AC',\n    9133 => 'uni23AD',\n    9134 => 'uni23AE',\n    9166 => 'uni23CE',\n    9167 => 'uni23CF',\n    9187 => 'uni23E3',\n    9189 => 'uni23E5',\n    9192 => 'uni23E8',\n    9250 => 'uni2422',\n    9251 => 'uni2423',\n    9312 => 'uni2460',\n    9313 => 'uni2461',\n    9314 => 'uni2462',\n    9315 => 'uni2463',\n    9316 => 'uni2464',\n    9317 => 'uni2465',\n    9318 => 'uni2466',\n    9319 => 'uni2467',\n    9320 => 'uni2468',\n    9321 => 'uni2469',\n    9472 => 'SF100000',\n    9473 => 'uni2501',\n    9474 => 'SF110000',\n    9475 => 'uni2503',\n    9476 => 'uni2504',\n    9477 => 'uni2505',\n    9478 => 'uni2506',\n    9479 => 'uni2507',\n    9480 => 'uni2508',\n    9481 => 'uni2509',\n    9482 => 'uni250A',\n    9483 => 'uni250B',\n    9484 => 'SF010000',\n    9485 => 'uni250D',\n    9486 => 'uni250E',\n    9487 => 'uni250F',\n    9488 => 'SF030000',\n    9489 => 'uni2511',\n    9490 => 'uni2512',\n    9491 => 'uni2513',\n    9492 => 'SF020000',\n    9493 => 'uni2515',\n    9494 => 'uni2516',\n    9495 => 'uni2517',\n    9496 => 'SF040000',\n    9497 => 'uni2519',\n    9498 => 'uni251A',\n    9499 => 'uni251B',\n    9500 => 'SF080000',\n    9501 => 'uni251D',\n    9502 => 'uni251E',\n    9503 => 'uni251F',\n    9504 => 'uni2520',\n    9505 => 'uni2521',\n    9506 => 'uni2522',\n    9507 => 'uni2523',\n    9508 => 'SF090000',\n    9509 => 'uni2525',\n    9510 => 'uni2526',\n    9511 => 'uni2527',\n    9512 => 'uni2528',\n    9513 => 'uni2529',\n    9514 => 'uni252A',\n    9515 => 'uni252B',\n    9516 => 'SF060000',\n    9517 => 'uni252D',\n    9518 => 'uni252E',\n    9519 => 'uni252F',\n    9520 => 'uni2530',\n    9521 => 'uni2531',\n    9522 => 'uni2532',\n    9523 => 'uni2533',\n    9524 => 'SF070000',\n    9525 => 'uni2535',\n    9526 => 'uni2536',\n    9527 => 'uni2537',\n    9528 => 'uni2538',\n    9529 => 'uni2539',\n    9530 => 'uni253A',\n    9531 => 'uni253B',\n    9532 => 'SF050000',\n    9533 => 'uni253D',\n    9534 => 'uni253E',\n    9535 => 'uni253F',\n    9536 => 'uni2540',\n    9537 => 'uni2541',\n    9538 => 'uni2542',\n    9539 => 'uni2543',\n    9540 => 'uni2544',\n    9541 => 'uni2545',\n    9542 => 'uni2546',\n    9543 => 'uni2547',\n    9544 => 'uni2548',\n    9545 => 'uni2549',\n    9546 => 'uni254A',\n    9547 => 'uni254B',\n    9548 => 'uni254C',\n    9549 => 'uni254D',\n    9550 => 'uni254E',\n    9551 => 'uni254F',\n    9552 => 'SF430000',\n    9553 => 'SF240000',\n    9554 => 'SF510000',\n    9555 => 'SF520000',\n    9556 => 'SF390000',\n    9557 => 'SF220000',\n    9558 => 'SF210000',\n    9559 => 'SF250000',\n    9560 => 'SF500000',\n    9561 => 'SF490000',\n    9562 => 'SF380000',\n    9563 => 'SF280000',\n    9564 => 'SF270000',\n    9565 => 'SF260000',\n    9566 => 'SF360000',\n    9567 => 'SF370000',\n    9568 => 'SF420000',\n    9569 => 'SF190000',\n    9570 => 'SF200000',\n    9571 => 'SF230000',\n    9572 => 'SF470000',\n    9573 => 'SF480000',\n    9574 => 'SF410000',\n    9575 => 'SF450000',\n    9576 => 'SF460000',\n    9577 => 'SF400000',\n    9578 => 'SF540000',\n    9579 => 'SF530000',\n    9580 => 'SF440000',\n    9581 => 'uni256D',\n    9582 => 'uni256E',\n    9583 => 'uni256F',\n    9584 => 'uni2570',\n    9585 => 'uni2571',\n    9586 => 'uni2572',\n    9587 => 'uni2573',\n    9588 => 'uni2574',\n    9589 => 'uni2575',\n    9590 => 'uni2576',\n    9591 => 'uni2577',\n    9592 => 'uni2578',\n    9593 => 'uni2579',\n    9594 => 'uni257A',\n    9595 => 'uni257B',\n    9596 => 'uni257C',\n    9597 => 'uni257D',\n    9598 => 'uni257E',\n    9599 => 'uni257F',\n    9600 => 'upblock',\n    9601 => 'uni2581',\n    9602 => 'uni2582',\n    9603 => 'uni2583',\n    9604 => 'dnblock',\n    9605 => 'uni2585',\n    9606 => 'uni2586',\n    9607 => 'uni2587',\n    9608 => 'block',\n    9609 => 'uni2589',\n    9610 => 'uni258A',\n    9611 => 'uni258B',\n    9612 => 'lfblock',\n    9613 => 'uni258D',\n    9614 => 'uni258E',\n    9615 => 'uni258F',\n    9616 => 'rtblock',\n    9617 => 'ltshade',\n    9618 => 'shade',\n    9619 => 'dkshade',\n    9620 => 'uni2594',\n    9621 => 'uni2595',\n    9622 => 'uni2596',\n    9623 => 'uni2597',\n    9624 => 'uni2598',\n    9625 => 'uni2599',\n    9626 => 'uni259A',\n    9627 => 'uni259B',\n    9628 => 'uni259C',\n    9629 => 'uni259D',\n    9630 => 'uni259E',\n    9631 => 'uni259F',\n    9632 => 'filledbox',\n    9633 => 'H22073',\n    9634 => 'uni25A2',\n    9635 => 'uni25A3',\n    9636 => 'uni25A4',\n    9637 => 'uni25A5',\n    9638 => 'uni25A6',\n    9639 => 'uni25A7',\n    9640 => 'uni25A8',\n    9641 => 'uni25A9',\n    9642 => 'H18543',\n    9643 => 'H18551',\n    9644 => 'filledrect',\n    9645 => 'uni25AD',\n    9646 => 'uni25AE',\n    9647 => 'uni25AF',\n    9648 => 'uni25B0',\n    9649 => 'uni25B1',\n    9650 => 'triagup',\n    9651 => 'uni25B3',\n    9652 => 'uni25B4',\n    9653 => 'uni25B5',\n    9654 => 'uni25B6',\n    9655 => 'uni25B7',\n    9656 => 'uni25B8',\n    9657 => 'uni25B9',\n    9658 => 'triagrt',\n    9659 => 'uni25BB',\n    9660 => 'triagdn',\n    9661 => 'uni25BD',\n    9662 => 'uni25BE',\n    9663 => 'uni25BF',\n    9664 => 'uni25C0',\n    9665 => 'uni25C1',\n    9666 => 'uni25C2',\n    9667 => 'uni25C3',\n    9668 => 'triaglf',\n    9669 => 'uni25C5',\n    9670 => 'uni25C6',\n    9671 => 'uni25C7',\n    9672 => 'uni25C8',\n    9673 => 'uni25C9',\n    9674 => 'lozenge',\n    9675 => 'circle',\n    9676 => 'uni25CC',\n    9677 => 'uni25CD',\n    9678 => 'uni25CE',\n    9679 => 'H18533',\n    9680 => 'uni25D0',\n    9681 => 'uni25D1',\n    9682 => 'uni25D2',\n    9683 => 'uni25D3',\n    9684 => 'uni25D4',\n    9685 => 'uni25D5',\n    9686 => 'uni25D6',\n    9687 => 'uni25D7',\n    9688 => 'invbullet',\n    9689 => 'invcircle',\n    9690 => 'uni25DA',\n    9691 => 'uni25DB',\n    9692 => 'uni25DC',\n    9693 => 'uni25DD',\n    9694 => 'uni25DE',\n    9695 => 'uni25DF',\n    9696 => 'uni25E0',\n    9697 => 'uni25E1',\n    9698 => 'uni25E2',\n    9699 => 'uni25E3',\n    9700 => 'uni25E4',\n    9701 => 'uni25E5',\n    9702 => 'openbullet',\n    9703 => 'uni25E7',\n    9704 => 'uni25E8',\n    9705 => 'uni25E9',\n    9706 => 'uni25EA',\n    9707 => 'uni25EB',\n    9708 => 'uni25EC',\n    9709 => 'uni25ED',\n    9710 => 'uni25EE',\n    9711 => 'uni25EF',\n    9712 => 'uni25F0',\n    9713 => 'uni25F1',\n    9714 => 'uni25F2',\n    9715 => 'uni25F3',\n    9716 => 'uni25F4',\n    9717 => 'uni25F5',\n    9718 => 'uni25F6',\n    9719 => 'uni25F7',\n    9720 => 'uni25F8',\n    9721 => 'uni25F9',\n    9722 => 'uni25FA',\n    9723 => 'uni25FB',\n    9724 => 'uni25FC',\n    9725 => 'uni25FD',\n    9726 => 'uni25FE',\n    9727 => 'uni25FF',\n    9728 => 'uni2600',\n    9729 => 'uni2601',\n    9730 => 'uni2602',\n    9731 => 'uni2603',\n    9732 => 'uni2604',\n    9733 => 'uni2605',\n    9734 => 'uni2606',\n    9735 => 'uni2607',\n    9736 => 'uni2608',\n    9737 => 'uni2609',\n    9738 => 'uni260A',\n    9739 => 'uni260B',\n    9740 => 'uni260C',\n    9741 => 'uni260D',\n    9742 => 'uni260E',\n    9743 => 'uni260F',\n    9744 => 'uni2610',\n    9745 => 'uni2611',\n    9746 => 'uni2612',\n    9747 => 'uni2613',\n    9748 => 'uni2614',\n    9749 => 'uni2615',\n    9750 => 'uni2616',\n    9751 => 'uni2617',\n    9752 => 'uni2618',\n    9753 => 'uni2619',\n    9754 => 'uni261A',\n    9755 => 'uni261B',\n    9756 => 'uni261C',\n    9757 => 'uni261D',\n    9758 => 'uni261E',\n    9759 => 'uni261F',\n    9760 => 'uni2620',\n    9761 => 'uni2621',\n    9762 => 'uni2622',\n    9763 => 'uni2623',\n    9764 => 'uni2624',\n    9765 => 'uni2625',\n    9766 => 'uni2626',\n    9767 => 'uni2627',\n    9768 => 'uni2628',\n    9769 => 'uni2629',\n    9770 => 'uni262A',\n    9771 => 'uni262B',\n    9772 => 'uni262C',\n    9773 => 'uni262D',\n    9774 => 'uni262E',\n    9775 => 'uni262F',\n    9776 => 'uni2630',\n    9777 => 'uni2631',\n    9778 => 'uni2632',\n    9779 => 'uni2633',\n    9780 => 'uni2634',\n    9781 => 'uni2635',\n    9782 => 'uni2636',\n    9783 => 'uni2637',\n    9784 => 'uni2638',\n    9785 => 'uni2639',\n    9786 => 'smileface',\n    9787 => 'invsmileface',\n    9788 => 'sun',\n    9789 => 'uni263D',\n    9790 => 'uni263E',\n    9791 => 'uni263F',\n    9792 => 'female',\n    9793 => 'uni2641',\n    9794 => 'male',\n    9795 => 'uni2643',\n    9796 => 'uni2644',\n    9797 => 'uni2645',\n    9798 => 'uni2646',\n    9799 => 'uni2647',\n    9800 => 'uni2648',\n    9801 => 'uni2649',\n    9802 => 'uni264A',\n    9803 => 'uni264B',\n    9804 => 'uni264C',\n    9805 => 'uni264D',\n    9806 => 'uni264E',\n    9807 => 'uni264F',\n    9808 => 'uni2650',\n    9809 => 'uni2651',\n    9810 => 'uni2652',\n    9811 => 'uni2653',\n    9812 => 'uni2654',\n    9813 => 'uni2655',\n    9814 => 'uni2656',\n    9815 => 'uni2657',\n    9816 => 'uni2658',\n    9817 => 'uni2659',\n    9818 => 'uni265A',\n    9819 => 'uni265B',\n    9820 => 'uni265C',\n    9821 => 'uni265D',\n    9822 => 'uni265E',\n    9823 => 'uni265F',\n    9824 => 'spade',\n    9825 => 'uni2661',\n    9826 => 'uni2662',\n    9827 => 'club',\n    9828 => 'uni2664',\n    9829 => 'heart',\n    9830 => 'diamond',\n    9831 => 'uni2667',\n    9832 => 'uni2668',\n    9833 => 'uni2669',\n    9834 => 'musicalnote',\n    9835 => 'musicalnotedbl',\n    9836 => 'uni266C',\n    9837 => 'uni266D',\n    9838 => 'uni266E',\n    9839 => 'uni266F',\n    9840 => 'uni2670',\n    9841 => 'uni2671',\n    9842 => 'uni2672',\n    9843 => 'uni2673',\n    9844 => 'uni2674',\n    9845 => 'uni2675',\n    9846 => 'uni2676',\n    9847 => 'uni2677',\n    9848 => 'uni2678',\n    9849 => 'uni2679',\n    9850 => 'uni267A',\n    9851 => 'uni267B',\n    9852 => 'uni267C',\n    9853 => 'uni267D',\n    9854 => 'uni267E',\n    9855 => 'uni267F',\n    9856 => 'uni2680',\n    9857 => 'uni2681',\n    9858 => 'uni2682',\n    9859 => 'uni2683',\n    9860 => 'uni2684',\n    9861 => 'uni2685',\n    9862 => 'uni2686',\n    9863 => 'uni2687',\n    9864 => 'uni2688',\n    9865 => 'uni2689',\n    9866 => 'uni268A',\n    9867 => 'uni268B',\n    9868 => 'uni268C',\n    9869 => 'uni268D',\n    9870 => 'uni268E',\n    9871 => 'uni268F',\n    9872 => 'uni2690',\n    9873 => 'uni2691',\n    9874 => 'uni2692',\n    9875 => 'uni2693',\n    9876 => 'uni2694',\n    9877 => 'uni2695',\n    9878 => 'uni2696',\n    9879 => 'uni2697',\n    9880 => 'uni2698',\n    9881 => 'uni2699',\n    9882 => 'uni269A',\n    9883 => 'uni269B',\n    9884 => 'uni269C',\n    9886 => 'uni269E',\n    9887 => 'uni269F',\n    9888 => 'uni26A0',\n    9889 => 'uni26A1',\n    9890 => 'uni26A2',\n    9891 => 'uni26A3',\n    9892 => 'uni26A4',\n    9893 => 'uni26A5',\n    9894 => 'uni26A6',\n    9895 => 'uni26A7',\n    9896 => 'uni26A8',\n    9897 => 'uni26A9',\n    9898 => 'uni26AA',\n    9899 => 'uni26AB',\n    9900 => 'uni26AC',\n    9901 => 'uni26AD',\n    9902 => 'uni26AE',\n    9903 => 'uni26AF',\n    9904 => 'uni26B0',\n    9905 => 'uni26B1',\n    9906 => 'uni26B2',\n    9907 => 'uni26B3',\n    9908 => 'uni26B4',\n    9909 => 'uni26B5',\n    9910 => 'uni26B6',\n    9911 => 'uni26B7',\n    9912 => 'uni26B8',\n    9920 => 'uni26C0',\n    9921 => 'uni26C1',\n    9922 => 'uni26C2',\n    9923 => 'uni26C3',\n    9954 => 'uni26E2',\n    9985 => 'uni2701',\n    9986 => 'uni2702',\n    9987 => 'uni2703',\n    9988 => 'uni2704',\n    9990 => 'uni2706',\n    9991 => 'uni2707',\n    9992 => 'uni2708',\n    9993 => 'uni2709',\n    9996 => 'uni270C',\n    9997 => 'uni270D',\n    9998 => 'uni270E',\n    9999 => 'uni270F',\n    10000 => 'uni2710',\n    10001 => 'uni2711',\n    10002 => 'uni2712',\n    10003 => 'uni2713',\n    10004 => 'uni2714',\n    10005 => 'uni2715',\n    10006 => 'uni2716',\n    10007 => 'uni2717',\n    10008 => 'uni2718',\n    10009 => 'uni2719',\n    10010 => 'uni271A',\n    10011 => 'uni271B',\n    10012 => 'uni271C',\n    10013 => 'uni271D',\n    10014 => 'uni271E',\n    10015 => 'uni271F',\n    10016 => 'uni2720',\n    10017 => 'uni2721',\n    10018 => 'uni2722',\n    10019 => 'uni2723',\n    10020 => 'uni2724',\n    10021 => 'uni2725',\n    10022 => 'uni2726',\n    10023 => 'uni2727',\n    10025 => 'uni2729',\n    10026 => 'uni272A',\n    10027 => 'uni272B',\n    10028 => 'uni272C',\n    10029 => 'uni272D',\n    10030 => 'uni272E',\n    10031 => 'uni272F',\n    10032 => 'uni2730',\n    10033 => 'uni2731',\n    10034 => 'uni2732',\n    10035 => 'uni2733',\n    10036 => 'uni2734',\n    10037 => 'uni2735',\n    10038 => 'uni2736',\n    10039 => 'uni2737',\n    10040 => 'uni2738',\n    10041 => 'uni2739',\n    10042 => 'uni273A',\n    10043 => 'uni273B',\n    10044 => 'uni273C',\n    10045 => 'uni273D',\n    10046 => 'uni273E',\n    10047 => 'uni273F',\n    10048 => 'uni2740',\n    10049 => 'uni2741',\n    10050 => 'uni2742',\n    10051 => 'uni2743',\n    10052 => 'uni2744',\n    10053 => 'uni2745',\n    10054 => 'uni2746',\n    10055 => 'uni2747',\n    10056 => 'uni2748',\n    10057 => 'uni2749',\n    10058 => 'uni274A',\n    10059 => 'uni274B',\n    10061 => 'uni274D',\n    10063 => 'uni274F',\n    10064 => 'uni2750',\n    10065 => 'uni2751',\n    10066 => 'uni2752',\n    10070 => 'uni2756',\n    10072 => 'uni2758',\n    10073 => 'uni2759',\n    10074 => 'uni275A',\n    10075 => 'uni275B',\n    10076 => 'uni275C',\n    10077 => 'uni275D',\n    10078 => 'uni275E',\n    10081 => 'uni2761',\n    10082 => 'uni2762',\n    10083 => 'uni2763',\n    10084 => 'uni2764',\n    10085 => 'uni2765',\n    10086 => 'uni2766',\n    10087 => 'uni2767',\n    10088 => 'uni2768',\n    10089 => 'uni2769',\n    10090 => 'uni276A',\n    10091 => 'uni276B',\n    10092 => 'uni276C',\n    10093 => 'uni276D',\n    10094 => 'uni276E',\n    10095 => 'uni276F',\n    10096 => 'uni2770',\n    10097 => 'uni2771',\n    10098 => 'uni2772',\n    10099 => 'uni2773',\n    10100 => 'uni2774',\n    10101 => 'uni2775',\n    10102 => 'uni2776',\n    10103 => 'uni2777',\n    10104 => 'uni2778',\n    10105 => 'uni2779',\n    10106 => 'uni277A',\n    10107 => 'uni277B',\n    10108 => 'uni277C',\n    10109 => 'uni277D',\n    10110 => 'uni277E',\n    10111 => 'uni277F',\n    10112 => 'uni2780',\n    10113 => 'uni2781',\n    10114 => 'uni2782',\n    10115 => 'uni2783',\n    10116 => 'uni2784',\n    10117 => 'uni2785',\n    10118 => 'uni2786',\n    10119 => 'uni2787',\n    10120 => 'uni2788',\n    10121 => 'uni2789',\n    10122 => 'uni278A',\n    10123 => 'uni278B',\n    10124 => 'uni278C',\n    10125 => 'uni278D',\n    10126 => 'uni278E',\n    10127 => 'uni278F',\n    10128 => 'uni2790',\n    10129 => 'uni2791',\n    10130 => 'uni2792',\n    10131 => 'uni2793',\n    10132 => 'uni2794',\n    10136 => 'uni2798',\n    10137 => 'uni2799',\n    10138 => 'uni279A',\n    10139 => 'uni279B',\n    10140 => 'uni279C',\n    10141 => 'uni279D',\n    10142 => 'uni279E',\n    10143 => 'uni279F',\n    10144 => 'uni27A0',\n    10145 => 'uni27A1',\n    10146 => 'uni27A2',\n    10147 => 'uni27A3',\n    10148 => 'uni27A4',\n    10149 => 'uni27A5',\n    10150 => 'uni27A6',\n    10151 => 'uni27A7',\n    10152 => 'uni27A8',\n    10153 => 'uni27A9',\n    10154 => 'uni27AA',\n    10155 => 'uni27AB',\n    10156 => 'uni27AC',\n    10157 => 'uni27AD',\n    10158 => 'uni27AE',\n    10159 => 'uni27AF',\n    10161 => 'uni27B1',\n    10162 => 'uni27B2',\n    10163 => 'uni27B3',\n    10164 => 'uni27B4',\n    10165 => 'uni27B5',\n    10166 => 'uni27B6',\n    10167 => 'uni27B7',\n    10168 => 'uni27B8',\n    10169 => 'uni27B9',\n    10170 => 'uni27BA',\n    10171 => 'uni27BB',\n    10172 => 'uni27BC',\n    10173 => 'uni27BD',\n    10174 => 'uni27BE',\n    10181 => 'uni27C5',\n    10182 => 'uni27C6',\n    10208 => 'uni27E0',\n    10214 => 'uni27E6',\n    10215 => 'uni27E7',\n    10216 => 'uni27E8',\n    10217 => 'uni27E9',\n    10218 => 'uni27EA',\n    10219 => 'uni27EB',\n    10224 => 'uni27F0',\n    10225 => 'uni27F1',\n    10226 => 'uni27F2',\n    10227 => 'uni27F3',\n    10228 => 'uni27F4',\n    10229 => 'uni27F5',\n    10230 => 'uni27F6',\n    10231 => 'uni27F7',\n    10232 => 'uni27F8',\n    10233 => 'uni27F9',\n    10234 => 'uni27FA',\n    10235 => 'uni27FB',\n    10236 => 'uni27FC',\n    10237 => 'uni27FD',\n    10238 => 'uni27FE',\n    10239 => 'uni27FF',\n    10240 => 'uni2800',\n    10241 => 'uni2801',\n    10242 => 'uni2802',\n    10243 => 'uni2803',\n    10244 => 'uni2804',\n    10245 => 'uni2805',\n    10246 => 'uni2806',\n    10247 => 'uni2807',\n    10248 => 'uni2808',\n    10249 => 'uni2809',\n    10250 => 'uni280A',\n    10251 => 'uni280B',\n    10252 => 'uni280C',\n    10253 => 'uni280D',\n    10254 => 'uni280E',\n    10255 => 'uni280F',\n    10256 => 'uni2810',\n    10257 => 'uni2811',\n    10258 => 'uni2812',\n    10259 => 'uni2813',\n    10260 => 'uni2814',\n    10261 => 'uni2815',\n    10262 => 'uni2816',\n    10263 => 'uni2817',\n    10264 => 'uni2818',\n    10265 => 'uni2819',\n    10266 => 'uni281A',\n    10267 => 'uni281B',\n    10268 => 'uni281C',\n    10269 => 'uni281D',\n    10270 => 'uni281E',\n    10271 => 'uni281F',\n    10272 => 'uni2820',\n    10273 => 'uni2821',\n    10274 => 'uni2822',\n    10275 => 'uni2823',\n    10276 => 'uni2824',\n    10277 => 'uni2825',\n    10278 => 'uni2826',\n    10279 => 'uni2827',\n    10280 => 'uni2828',\n    10281 => 'uni2829',\n    10282 => 'uni282A',\n    10283 => 'uni282B',\n    10284 => 'uni282C',\n    10285 => 'uni282D',\n    10286 => 'uni282E',\n    10287 => 'uni282F',\n    10288 => 'uni2830',\n    10289 => 'uni2831',\n    10290 => 'uni2832',\n    10291 => 'uni2833',\n    10292 => 'uni2834',\n    10293 => 'uni2835',\n    10294 => 'uni2836',\n    10295 => 'uni2837',\n    10296 => 'uni2838',\n    10297 => 'uni2839',\n    10298 => 'uni283A',\n    10299 => 'uni283B',\n    10300 => 'uni283C',\n    10301 => 'uni283D',\n    10302 => 'uni283E',\n    10303 => 'uni283F',\n    10304 => 'uni2840',\n    10305 => 'uni2841',\n    10306 => 'uni2842',\n    10307 => 'uni2843',\n    10308 => 'uni2844',\n    10309 => 'uni2845',\n    10310 => 'uni2846',\n    10311 => 'uni2847',\n    10312 => 'uni2848',\n    10313 => 'uni2849',\n    10314 => 'uni284A',\n    10315 => 'uni284B',\n    10316 => 'uni284C',\n    10317 => 'uni284D',\n    10318 => 'uni284E',\n    10319 => 'uni284F',\n    10320 => 'uni2850',\n    10321 => 'uni2851',\n    10322 => 'uni2852',\n    10323 => 'uni2853',\n    10324 => 'uni2854',\n    10325 => 'uni2855',\n    10326 => 'uni2856',\n    10327 => 'uni2857',\n    10328 => 'uni2858',\n    10329 => 'uni2859',\n    10330 => 'uni285A',\n    10331 => 'uni285B',\n    10332 => 'uni285C',\n    10333 => 'uni285D',\n    10334 => 'uni285E',\n    10335 => 'uni285F',\n    10336 => 'uni2860',\n    10337 => 'uni2861',\n    10338 => 'uni2862',\n    10339 => 'uni2863',\n    10340 => 'uni2864',\n    10341 => 'uni2865',\n    10342 => 'uni2866',\n    10343 => 'uni2867',\n    10344 => 'uni2868',\n    10345 => 'uni2869',\n    10346 => 'uni286A',\n    10347 => 'uni286B',\n    10348 => 'uni286C',\n    10349 => 'uni286D',\n    10350 => 'uni286E',\n    10351 => 'uni286F',\n    10352 => 'uni2870',\n    10353 => 'uni2871',\n    10354 => 'uni2872',\n    10355 => 'uni2873',\n    10356 => 'uni2874',\n    10357 => 'uni2875',\n    10358 => 'uni2876',\n    10359 => 'uni2877',\n    10360 => 'uni2878',\n    10361 => 'uni2879',\n    10362 => 'uni287A',\n    10363 => 'uni287B',\n    10364 => 'uni287C',\n    10365 => 'uni287D',\n    10366 => 'uni287E',\n    10367 => 'uni287F',\n    10368 => 'uni2880',\n    10369 => 'uni2881',\n    10370 => 'uni2882',\n    10371 => 'uni2883',\n    10372 => 'uni2884',\n    10373 => 'uni2885',\n    10374 => 'uni2886',\n    10375 => 'uni2887',\n    10376 => 'uni2888',\n    10377 => 'uni2889',\n    10378 => 'uni288A',\n    10379 => 'uni288B',\n    10380 => 'uni288C',\n    10381 => 'uni288D',\n    10382 => 'uni288E',\n    10383 => 'uni288F',\n    10384 => 'uni2890',\n    10385 => 'uni2891',\n    10386 => 'uni2892',\n    10387 => 'uni2893',\n    10388 => 'uni2894',\n    10389 => 'uni2895',\n    10390 => 'uni2896',\n    10391 => 'uni2897',\n    10392 => 'uni2898',\n    10393 => 'uni2899',\n    10394 => 'uni289A',\n    10395 => 'uni289B',\n    10396 => 'uni289C',\n    10397 => 'uni289D',\n    10398 => 'uni289E',\n    10399 => 'uni289F',\n    10400 => 'uni28A0',\n    10401 => 'uni28A1',\n    10402 => 'uni28A2',\n    10403 => 'uni28A3',\n    10404 => 'uni28A4',\n    10405 => 'uni28A5',\n    10406 => 'uni28A6',\n    10407 => 'uni28A7',\n    10408 => 'uni28A8',\n    10409 => 'uni28A9',\n    10410 => 'uni28AA',\n    10411 => 'uni28AB',\n    10412 => 'uni28AC',\n    10413 => 'uni28AD',\n    10414 => 'uni28AE',\n    10415 => 'uni28AF',\n    10416 => 'uni28B0',\n    10417 => 'uni28B1',\n    10418 => 'uni28B2',\n    10419 => 'uni28B3',\n    10420 => 'uni28B4',\n    10421 => 'uni28B5',\n    10422 => 'uni28B6',\n    10423 => 'uni28B7',\n    10424 => 'uni28B8',\n    10425 => 'uni28B9',\n    10426 => 'uni28BA',\n    10427 => 'uni28BB',\n    10428 => 'uni28BC',\n    10429 => 'uni28BD',\n    10430 => 'uni28BE',\n    10431 => 'uni28BF',\n    10432 => 'uni28C0',\n    10433 => 'uni28C1',\n    10434 => 'uni28C2',\n    10435 => 'uni28C3',\n    10436 => 'uni28C4',\n    10437 => 'uni28C5',\n    10438 => 'uni28C6',\n    10439 => 'uni28C7',\n    10440 => 'uni28C8',\n    10441 => 'uni28C9',\n    10442 => 'uni28CA',\n    10443 => 'uni28CB',\n    10444 => 'uni28CC',\n    10445 => 'uni28CD',\n    10446 => 'uni28CE',\n    10447 => 'uni28CF',\n    10448 => 'uni28D0',\n    10449 => 'uni28D1',\n    10450 => 'uni28D2',\n    10451 => 'uni28D3',\n    10452 => 'uni28D4',\n    10453 => 'uni28D5',\n    10454 => 'uni28D6',\n    10455 => 'uni28D7',\n    10456 => 'uni28D8',\n    10457 => 'uni28D9',\n    10458 => 'uni28DA',\n    10459 => 'uni28DB',\n    10460 => 'uni28DC',\n    10461 => 'uni28DD',\n    10462 => 'uni28DE',\n    10463 => 'uni28DF',\n    10464 => 'uni28E0',\n    10465 => 'uni28E1',\n    10466 => 'uni28E2',\n    10467 => 'uni28E3',\n    10468 => 'uni28E4',\n    10469 => 'uni28E5',\n    10470 => 'uni28E6',\n    10471 => 'uni28E7',\n    10472 => 'uni28E8',\n    10473 => 'uni28E9',\n    10474 => 'uni28EA',\n    10475 => 'uni28EB',\n    10476 => 'uni28EC',\n    10477 => 'uni28ED',\n    10478 => 'uni28EE',\n    10479 => 'uni28EF',\n    10480 => 'uni28F0',\n    10481 => 'uni28F1',\n    10482 => 'uni28F2',\n    10483 => 'uni28F3',\n    10484 => 'uni28F4',\n    10485 => 'uni28F5',\n    10486 => 'uni28F6',\n    10487 => 'uni28F7',\n    10488 => 'uni28F8',\n    10489 => 'uni28F9',\n    10490 => 'uni28FA',\n    10491 => 'uni28FB',\n    10492 => 'uni28FC',\n    10493 => 'uni28FD',\n    10494 => 'uni28FE',\n    10495 => 'uni28FF',\n    10502 => 'uni2906',\n    10503 => 'uni2907',\n    10506 => 'uni290A',\n    10507 => 'uni290B',\n    10560 => 'uni2940',\n    10561 => 'uni2941',\n    10627 => 'uni2983',\n    10628 => 'uni2984',\n    10702 => 'uni29CE',\n    10703 => 'uni29CF',\n    10704 => 'uni29D0',\n    10705 => 'uni29D1',\n    10706 => 'uni29D2',\n    10707 => 'uni29D3',\n    10708 => 'uni29D4',\n    10709 => 'uni29D5',\n    10731 => 'uni29EB',\n    10746 => 'uni29FA',\n    10747 => 'uni29FB',\n    10752 => 'uni2A00',\n    10753 => 'uni2A01',\n    10754 => 'uni2A02',\n    10764 => 'uni2A0C',\n    10765 => 'uni2A0D',\n    10766 => 'uni2A0E',\n    10767 => 'uni2A0F',\n    10768 => 'uni2A10',\n    10769 => 'uni2A11',\n    10770 => 'uni2A12',\n    10771 => 'uni2A13',\n    10772 => 'uni2A14',\n    10773 => 'uni2A15',\n    10774 => 'uni2A16',\n    10775 => 'uni2A17',\n    10776 => 'uni2A18',\n    10777 => 'uni2A19',\n    10778 => 'uni2A1A',\n    10779 => 'uni2A1B',\n    10780 => 'uni2A1C',\n    10799 => 'uni2A2F',\n    10858 => 'uni2A6A',\n    10859 => 'uni2A6B',\n    10877 => 'uni2A7D',\n    10878 => 'uni2A7E',\n    10879 => 'uni2A7F',\n    10880 => 'uni2A80',\n    10881 => 'uni2A81',\n    10882 => 'uni2A82',\n    10883 => 'uni2A83',\n    10884 => 'uni2A84',\n    10885 => 'uni2A85',\n    10886 => 'uni2A86',\n    10887 => 'uni2A87',\n    10888 => 'uni2A88',\n    10889 => 'uni2A89',\n    10890 => 'uni2A8A',\n    10891 => 'uni2A8B',\n    10892 => 'uni2A8C',\n    10893 => 'uni2A8D',\n    10894 => 'uni2A8E',\n    10895 => 'uni2A8F',\n    10896 => 'uni2A90',\n    10897 => 'uni2A91',\n    10898 => 'uni2A92',\n    10899 => 'uni2A93',\n    10900 => 'uni2A94',\n    10901 => 'uni2A95',\n    10902 => 'uni2A96',\n    10903 => 'uni2A97',\n    10904 => 'uni2A98',\n    10905 => 'uni2A99',\n    10906 => 'uni2A9A',\n    10907 => 'uni2A9B',\n    10908 => 'uni2A9C',\n    10909 => 'uni2A9D',\n    10910 => 'uni2A9E',\n    10911 => 'uni2A9F',\n    10912 => 'uni2AA0',\n    10926 => 'uni2AAE',\n    10927 => 'uni2AAF',\n    10928 => 'uni2AB0',\n    10929 => 'uni2AB1',\n    10930 => 'uni2AB2',\n    10931 => 'uni2AB3',\n    10932 => 'uni2AB4',\n    10933 => 'uni2AB5',\n    10934 => 'uni2AB6',\n    10935 => 'uni2AB7',\n    10936 => 'uni2AB8',\n    10937 => 'uni2AB9',\n    10938 => 'uni2ABA',\n    11001 => 'uni2AF9',\n    11002 => 'uni2AFA',\n    11008 => 'uni2B00',\n    11009 => 'uni2B01',\n    11010 => 'uni2B02',\n    11011 => 'uni2B03',\n    11012 => 'uni2B04',\n    11013 => 'uni2B05',\n    11014 => 'uni2B06',\n    11015 => 'uni2B07',\n    11016 => 'uni2B08',\n    11017 => 'uni2B09',\n    11018 => 'uni2B0A',\n    11019 => 'uni2B0B',\n    11020 => 'uni2B0C',\n    11021 => 'uni2B0D',\n    11022 => 'uni2B0E',\n    11023 => 'uni2B0F',\n    11024 => 'uni2B10',\n    11025 => 'uni2B11',\n    11026 => 'uni2B12',\n    11027 => 'uni2B13',\n    11028 => 'uni2B14',\n    11029 => 'uni2B15',\n    11030 => 'uni2B16',\n    11031 => 'uni2B17',\n    11032 => 'uni2B18',\n    11033 => 'uni2B19',\n    11034 => 'uni2B1A',\n    11039 => 'uni2B1F',\n    11040 => 'uni2B20',\n    11041 => 'uni2B21',\n    11042 => 'uni2B22',\n    11043 => 'uni2B23',\n    11044 => 'uni2B24',\n    11091 => 'uni2B53',\n    11092 => 'uni2B54',\n    11360 => 'uni2C60',\n    11361 => 'uni2C61',\n    11362 => 'uni2C62',\n    11363 => 'uni2C63',\n    11364 => 'uni2C64',\n    11365 => 'uni2C65',\n    11366 => 'uni2C66',\n    11367 => 'uni2C67',\n    11368 => 'uni2C68',\n    11369 => 'uni2C69',\n    11370 => 'uni2C6A',\n    11371 => 'uni2C6B',\n    11372 => 'uni2C6C',\n    11373 => 'uni2C6D',\n    11374 => 'uni2C6E',\n    11375 => 'uni2C6F',\n    11376 => 'uni2C70',\n    11377 => 'uni2C71',\n    11378 => 'uni2C72',\n    11379 => 'uni2C73',\n    11380 => 'uni2C74',\n    11381 => 'uni2C75',\n    11382 => 'uni2C76',\n    11383 => 'uni2C77',\n    11385 => 'uni2C79',\n    11386 => 'uni2C7A',\n    11387 => 'uni2C7B',\n    11388 => 'uni2C7C',\n    11389 => 'uni2C7D',\n    11390 => 'uni2C7E',\n    11391 => 'uni2C7F',\n    11520 => 'uni2D00',\n    11521 => 'uni2D01',\n    11522 => 'uni2D02',\n    11523 => 'uni2D03',\n    11524 => 'uni2D04',\n    11525 => 'uni2D05',\n    11526 => 'uni2D06',\n    11527 => 'uni2D07',\n    11528 => 'uni2D08',\n    11529 => 'uni2D09',\n    11530 => 'uni2D0A',\n    11531 => 'uni2D0B',\n    11532 => 'uni2D0C',\n    11533 => 'uni2D0D',\n    11534 => 'uni2D0E',\n    11535 => 'uni2D0F',\n    11536 => 'uni2D10',\n    11537 => 'uni2D11',\n    11538 => 'uni2D12',\n    11539 => 'uni2D13',\n    11540 => 'uni2D14',\n    11541 => 'uni2D15',\n    11542 => 'uni2D16',\n    11543 => 'uni2D17',\n    11544 => 'uni2D18',\n    11545 => 'uni2D19',\n    11546 => 'uni2D1A',\n    11547 => 'uni2D1B',\n    11548 => 'uni2D1C',\n    11549 => 'uni2D1D',\n    11550 => 'uni2D1E',\n    11551 => 'uni2D1F',\n    11552 => 'uni2D20',\n    11553 => 'uni2D21',\n    11554 => 'uni2D22',\n    11555 => 'uni2D23',\n    11556 => 'uni2D24',\n    11557 => 'uni2D25',\n    11568 => 'uni2D30',\n    11569 => 'uni2D31',\n    11570 => 'uni2D32',\n    11571 => 'uni2D33',\n    11572 => 'uni2D34',\n    11573 => 'uni2D35',\n    11574 => 'uni2D36',\n    11575 => 'uni2D37',\n    11576 => 'uni2D38',\n    11577 => 'uni2D39',\n    11578 => 'uni2D3A',\n    11579 => 'uni2D3B',\n    11580 => 'uni2D3C',\n    11581 => 'uni2D3D',\n    11582 => 'uni2D3E',\n    11583 => 'uni2D3F',\n    11584 => 'uni2D40',\n    11585 => 'uni2D41',\n    11586 => 'uni2D42',\n    11587 => 'uni2D43',\n    11588 => 'uni2D44',\n    11589 => 'uni2D45',\n    11590 => 'uni2D46',\n    11591 => 'uni2D47',\n    11592 => 'uni2D48',\n    11593 => 'uni2D49',\n    11594 => 'uni2D4A',\n    11595 => 'uni2D4B',\n    11596 => 'uni2D4C',\n    11597 => 'uni2D4D',\n    11598 => 'uni2D4E',\n    11599 => 'uni2D4F',\n    11600 => 'uni2D50',\n    11601 => 'uni2D51',\n    11602 => 'uni2D52',\n    11603 => 'uni2D53',\n    11604 => 'uni2D54',\n    11605 => 'uni2D55',\n    11606 => 'uni2D56',\n    11607 => 'uni2D57',\n    11608 => 'uni2D58',\n    11609 => 'uni2D59',\n    11610 => 'uni2D5A',\n    11611 => 'uni2D5B',\n    11612 => 'uni2D5C',\n    11613 => 'uni2D5D',\n    11614 => 'uni2D5E',\n    11615 => 'uni2D5F',\n    11616 => 'uni2D60',\n    11617 => 'uni2D61',\n    11618 => 'uni2D62',\n    11619 => 'uni2D63',\n    11620 => 'uni2D64',\n    11621 => 'uni2D65',\n    11631 => 'uni2D6F',\n    11800 => 'uni2E18',\n    11807 => 'uni2E1F',\n    11810 => 'uni2E22',\n    11811 => 'uni2E23',\n    11812 => 'uni2E24',\n    11813 => 'uni2E25',\n    11822 => 'uni2E2E',\n    19904 => 'uni4DC0',\n    19905 => 'uni4DC1',\n    19906 => 'uni4DC2',\n    19907 => 'uni4DC3',\n    19908 => 'uni4DC4',\n    19909 => 'uni4DC5',\n    19910 => 'uni4DC6',\n    19911 => 'uni4DC7',\n    19912 => 'uni4DC8',\n    19913 => 'uni4DC9',\n    19914 => 'uni4DCA',\n    19915 => 'uni4DCB',\n    19916 => 'uni4DCC',\n    19917 => 'uni4DCD',\n    19918 => 'uni4DCE',\n    19919 => 'uni4DCF',\n    19920 => 'uni4DD0',\n    19921 => 'uni4DD1',\n    19922 => 'uni4DD2',\n    19923 => 'uni4DD3',\n    19924 => 'uni4DD4',\n    19925 => 'uni4DD5',\n    19926 => 'uni4DD6',\n    19927 => 'uni4DD7',\n    19928 => 'uni4DD8',\n    19929 => 'uni4DD9',\n    19930 => 'uni4DDA',\n    19931 => 'uni4DDB',\n    19932 => 'uni4DDC',\n    19933 => 'uni4DDD',\n    19934 => 'uni4DDE',\n    19935 => 'uni4DDF',\n    19936 => 'uni4DE0',\n    19937 => 'uni4DE1',\n    19938 => 'uni4DE2',\n    19939 => 'uni4DE3',\n    19940 => 'uni4DE4',\n    19941 => 'uni4DE5',\n    19942 => 'uni4DE6',\n    19943 => 'uni4DE7',\n    19944 => 'uni4DE8',\n    19945 => 'uni4DE9',\n    19946 => 'uni4DEA',\n    19947 => 'uni4DEB',\n    19948 => 'uni4DEC',\n    19949 => 'uni4DED',\n    19950 => 'uni4DEE',\n    19951 => 'uni4DEF',\n    19952 => 'uni4DF0',\n    19953 => 'uni4DF1',\n    19954 => 'uni4DF2',\n    19955 => 'uni4DF3',\n    19956 => 'uni4DF4',\n    19957 => 'uni4DF5',\n    19958 => 'uni4DF6',\n    19959 => 'uni4DF7',\n    19960 => 'uni4DF8',\n    19961 => 'uni4DF9',\n    19962 => 'uni4DFA',\n    19963 => 'uni4DFB',\n    19964 => 'uni4DFC',\n    19965 => 'uni4DFD',\n    19966 => 'uni4DFE',\n    19967 => 'uni4DFF',\n    42192 => 'uniA4D0',\n    42193 => 'uniA4D1',\n    42194 => 'uniA4D2',\n    42195 => 'uniA4D3',\n    42196 => 'uniA4D4',\n    42197 => 'uniA4D5',\n    42198 => 'uniA4D6',\n    42199 => 'uniA4D7',\n    42200 => 'uniA4D8',\n    42201 => 'uniA4D9',\n    42202 => 'uniA4DA',\n    42203 => 'uniA4DB',\n    42204 => 'uniA4DC',\n    42205 => 'uniA4DD',\n    42206 => 'uniA4DE',\n    42207 => 'uniA4DF',\n    42208 => 'uniA4E0',\n    42209 => 'uniA4E1',\n    42210 => 'uniA4E2',\n    42211 => 'uniA4E3',\n    42212 => 'uniA4E4',\n    42213 => 'uniA4E5',\n    42214 => 'uniA4E6',\n    42215 => 'uniA4E7',\n    42216 => 'uniA4E8',\n    42217 => 'uniA4E9',\n    42218 => 'uniA4EA',\n    42219 => 'uniA4EB',\n    42220 => 'uniA4EC',\n    42221 => 'uniA4ED',\n    42222 => 'uniA4EE',\n    42223 => 'uniA4EF',\n    42224 => 'uniA4F0',\n    42225 => 'uniA4F1',\n    42226 => 'uniA4F2',\n    42227 => 'uniA4F3',\n    42228 => 'uniA4F4',\n    42229 => 'uniA4F5',\n    42230 => 'uniA4F6',\n    42231 => 'uniA4F7',\n    42232 => 'uniA4F8',\n    42233 => 'uniA4F9',\n    42234 => 'uniA4FA',\n    42235 => 'uniA4FB',\n    42236 => 'uniA4FC',\n    42237 => 'uniA4FD',\n    42238 => 'uniA4FE',\n    42239 => 'uniA4FF',\n    42564 => 'uniA644',\n    42565 => 'uniA645',\n    42566 => 'uniA646',\n    42567 => 'uniA647',\n    42572 => 'uniA64C',\n    42573 => 'uniA64D',\n    42576 => 'uniA650',\n    42577 => 'uniA651',\n    42580 => 'uniA654',\n    42581 => 'uniA655',\n    42582 => 'uniA656',\n    42583 => 'uniA657',\n    42594 => 'uniA662',\n    42595 => 'uniA663',\n    42596 => 'uniA664',\n    42597 => 'uniA665',\n    42598 => 'uniA666',\n    42599 => 'uniA667',\n    42600 => 'uniA668',\n    42601 => 'uniA669',\n    42602 => 'uniA66A',\n    42603 => 'uniA66B',\n    42604 => 'uniA66C',\n    42605 => 'uniA66D',\n    42606 => 'uniA66E',\n    42634 => 'uniA68A',\n    42635 => 'uniA68B',\n    42636 => 'uniA68C',\n    42637 => 'uniA68D',\n    42644 => 'uniA694',\n    42645 => 'uniA695',\n    42648 => 'uniA698',\n    42649 => 'uniA699',\n    42760 => 'uniA708',\n    42761 => 'uniA709',\n    42762 => 'uniA70A',\n    42763 => 'uniA70B',\n    42764 => 'uniA70C',\n    42765 => 'uniA70D',\n    42766 => 'uniA70E',\n    42767 => 'uniA70F',\n    42768 => 'uniA710',\n    42769 => 'uniA711',\n    42770 => 'uniA712',\n    42771 => 'uniA713',\n    42772 => 'uniA714',\n    42773 => 'uniA715',\n    42774 => 'uniA716',\n    42779 => 'uniA71B',\n    42780 => 'uniA71C',\n    42781 => 'uniA71D',\n    42782 => 'uniA71E',\n    42783 => 'uniA71F',\n    42786 => 'uniA722',\n    42787 => 'uniA723',\n    42788 => 'uniA724',\n    42789 => 'uniA725',\n    42790 => 'uniA726',\n    42791 => 'uniA727',\n    42792 => 'uniA728',\n    42793 => 'uniA729',\n    42794 => 'uniA72A',\n    42795 => 'uniA72B',\n    42800 => 'uniA730',\n    42801 => 'uniA731',\n    42802 => 'uniA732',\n    42803 => 'uniA733',\n    42804 => 'uniA734',\n    42805 => 'uniA735',\n    42806 => 'uniA736',\n    42807 => 'uniA737',\n    42808 => 'uniA738',\n    42809 => 'uniA739',\n    42810 => 'uniA73A',\n    42811 => 'uniA73B',\n    42812 => 'uniA73C',\n    42813 => 'uniA73D',\n    42814 => 'uniA73E',\n    42815 => 'uniA73F',\n    42816 => 'uniA740',\n    42817 => 'uniA741',\n    42822 => 'uniA746',\n    42823 => 'uniA747',\n    42824 => 'uniA748',\n    42825 => 'uniA749',\n    42826 => 'uniA74A',\n    42827 => 'uniA74B',\n    42830 => 'uniA74E',\n    42831 => 'uniA74F',\n    42832 => 'uniA750',\n    42833 => 'uniA751',\n    42834 => 'uniA752',\n    42835 => 'uniA753',\n    42838 => 'uniA756',\n    42839 => 'uniA757',\n    42852 => 'uniA764',\n    42853 => 'uniA765',\n    42854 => 'uniA766',\n    42855 => 'uniA767',\n    42880 => 'uniA780',\n    42881 => 'uniA781',\n    42882 => 'uniA782',\n    42883 => 'uniA783',\n    42889 => 'uniA789',\n    42890 => 'uniA78A',\n    42891 => 'uniA78B',\n    42892 => 'uniA78C',\n    42893 => 'uniA78D',\n    42894 => 'uniA78E',\n    42896 => 'uniA790',\n    42897 => 'uniA791',\n    42912 => 'uniA7A0',\n    42913 => 'uniA7A1',\n    42914 => 'uniA7A2',\n    42915 => 'uniA7A3',\n    42916 => 'uniA7A4',\n    42917 => 'uniA7A5',\n    42918 => 'uniA7A6',\n    42919 => 'uniA7A7',\n    42920 => 'uniA7A8',\n    42921 => 'uniA7A9',\n    42922 => 'uniA7AA',\n    43000 => 'uniA7F8',\n    43001 => 'uniA7F9',\n    43002 => 'uniA7FA',\n    43003 => 'uniA7FB',\n    43004 => 'uniA7FC',\n    43005 => 'uniA7FD',\n    43006 => 'uniA7FE',\n    43007 => 'uniA7FF',\n    61184 => 'uni02E5.5',\n    61185 => 'uni02E6.5',\n    61186 => 'uni02E7.5',\n    61187 => 'uni02E8.5',\n    61188 => 'uni02E9.5',\n    61189 => 'uni02E5.4',\n    61190 => 'uni02E6.4',\n    61191 => 'uni02E7.4',\n    61192 => 'uni02E8.4',\n    61193 => 'uni02E9.4',\n    61194 => 'uni02E5.3',\n    61195 => 'uni02E6.3',\n    61196 => 'uni02E7.3',\n    61197 => 'uni02E8.3',\n    61198 => 'uni02E9.3',\n    61199 => 'uni02E5.2',\n    61200 => 'uni02E6.2',\n    61201 => 'uni02E7.2',\n    61202 => 'uni02E8.2',\n    61203 => 'uni02E9.2',\n    61204 => 'uni02E5.1',\n    61205 => 'uni02E6.1',\n    61206 => 'uni02E7.1',\n    61207 => 'uni02E8.1',\n    61208 => 'uni02E9.1',\n    61209 => 'stem',\n    62464 => 'uniF400',\n    62465 => 'uniF401',\n    62466 => 'uniF402',\n    62467 => 'uniF403',\n    62468 => 'uniF404',\n    62469 => 'uniF405',\n    62470 => 'uniF406',\n    62471 => 'uniF407',\n    62472 => 'uniF408',\n    62473 => 'uniF409',\n    62474 => 'uniF40A',\n    62475 => 'uniF40B',\n    62476 => 'uniF40C',\n    62477 => 'uniF40D',\n    62478 => 'uniF40E',\n    62479 => 'uniF40F',\n    62480 => 'uniF410',\n    62481 => 'uniF411',\n    62482 => 'uniF412',\n    62483 => 'uniF413',\n    62484 => 'uniF414',\n    62485 => 'uniF415',\n    62486 => 'uniF416',\n    62487 => 'uniF417',\n    62488 => 'uniF418',\n    62489 => 'uniF419',\n    62490 => 'uniF41A',\n    62491 => 'uniF41B',\n    62492 => 'uniF41C',\n    62493 => 'uniF41D',\n    62494 => 'uniF41E',\n    62495 => 'uniF41F',\n    62496 => 'uniF420',\n    62497 => 'uniF421',\n    62498 => 'uniF422',\n    62499 => 'uniF423',\n    62500 => 'uniF424',\n    62501 => 'uniF425',\n    62502 => 'uniF426',\n    62504 => 'uniF428',\n    62505 => 'uniF429',\n    62506 => 'uniF42A',\n    62507 => 'uniF42B',\n    62508 => 'uniF42C',\n    62509 => 'uniF42D',\n    62510 => 'uniF42E',\n    62511 => 'uniF42F',\n    62512 => 'uniF430',\n    62513 => 'uniF431',\n    62514 => 'uniF432',\n    62515 => 'uniF433',\n    62516 => 'uniF434',\n    62517 => 'uniF435',\n    62518 => 'uniF436',\n    62519 => 'uniF437',\n    62520 => 'uniF438',\n    62521 => 'uniF439',\n    62522 => 'uniF43A',\n    62523 => 'uniF43B',\n    62524 => 'uniF43C',\n    62525 => 'uniF43D',\n    62526 => 'uniF43E',\n    62527 => 'uniF43F',\n    62528 => 'uniF440',\n    62529 => 'uniF441',\n    63173 => 'uniF6C5',\n    64256 => 'uniFB00',\n    64257 => 'fi',\n    64258 => 'fl',\n    64259 => 'uniFB03',\n    64260 => 'uniFB04',\n    64261 => 'uniFB05',\n    64262 => 'uniFB06',\n    64275 => 'uniFB13',\n    64276 => 'uniFB14',\n    64277 => 'uniFB15',\n    64278 => 'uniFB16',\n    64279 => 'uniFB17',\n    64285 => 'uniFB1D',\n    64286 => 'uniFB1E',\n    64287 => 'uniFB1F',\n    64288 => 'uniFB20',\n    64289 => 'uniFB21',\n    64290 => 'uniFB22',\n    64291 => 'uniFB23',\n    64292 => 'uniFB24',\n    64293 => 'uniFB25',\n    64294 => 'uniFB26',\n    64295 => 'uniFB27',\n    64296 => 'uniFB28',\n    64297 => 'uniFB29',\n    64298 => 'uniFB2A',\n    64299 => 'uniFB2B',\n    64300 => 'uniFB2C',\n    64301 => 'uniFB2D',\n    64302 => 'uniFB2E',\n    64303 => 'uniFB2F',\n    64304 => 'uniFB30',\n    64305 => 'uniFB31',\n    64306 => 'uniFB32',\n    64307 => 'uniFB33',\n    64308 => 'uniFB34',\n    64309 => 'uniFB35',\n    64310 => 'uniFB36',\n    64312 => 'uniFB38',\n    64313 => 'uniFB39',\n    64314 => 'uniFB3A',\n    64315 => 'uniFB3B',\n    64316 => 'uniFB3C',\n    64318 => 'uniFB3E',\n    64320 => 'uniFB40',\n    64321 => 'uniFB41',\n    64323 => 'uniFB43',\n    64324 => 'uniFB44',\n    64326 => 'uniFB46',\n    64327 => 'uniFB47',\n    64328 => 'uniFB48',\n    64329 => 'uniFB49',\n    64330 => 'uniFB4A',\n    64331 => 'uniFB4B',\n    64332 => 'uniFB4C',\n    64333 => 'uniFB4D',\n    64334 => 'uniFB4E',\n    64335 => 'uniFB4F',\n    64338 => 'uniFB52',\n    64339 => 'uniFB53',\n    64340 => 'uniFB54',\n    64341 => 'uniFB55',\n    64342 => 'uniFB56',\n    64343 => 'uniFB57',\n    64344 => 'uniFB58',\n    64345 => 'uniFB59',\n    64346 => 'uniFB5A',\n    64347 => 'uniFB5B',\n    64348 => 'uniFB5C',\n    64349 => 'uniFB5D',\n    64350 => 'uniFB5E',\n    64351 => 'uniFB5F',\n    64352 => 'uniFB60',\n    64353 => 'uniFB61',\n    64354 => 'uniFB62',\n    64355 => 'uniFB63',\n    64356 => 'uniFB64',\n    64357 => 'uniFB65',\n    64358 => 'uniFB66',\n    64359 => 'uniFB67',\n    64360 => 'uniFB68',\n    64361 => 'uniFB69',\n    64362 => 'uniFB6A',\n    64363 => 'uniFB6B',\n    64364 => 'uniFB6C',\n    64365 => 'uniFB6D',\n    64366 => 'uniFB6E',\n    64367 => 'uniFB6F',\n    64368 => 'uniFB70',\n    64369 => 'uniFB71',\n    64370 => 'uniFB72',\n    64371 => 'uniFB73',\n    64372 => 'uniFB74',\n    64373 => 'uniFB75',\n    64374 => 'uniFB76',\n    64375 => 'uniFB77',\n    64376 => 'uniFB78',\n    64377 => 'uniFB79',\n    64378 => 'uniFB7A',\n    64379 => 'uniFB7B',\n    64380 => 'uniFB7C',\n    64381 => 'uniFB7D',\n    64382 => 'uniFB7E',\n    64383 => 'uniFB7F',\n    64384 => 'uniFB80',\n    64385 => 'uniFB81',\n    64386 => 'uniFB82',\n    64387 => 'uniFB83',\n    64388 => 'uniFB84',\n    64389 => 'uniFB85',\n    64390 => 'uniFB86',\n    64391 => 'uniFB87',\n    64392 => 'uniFB88',\n    64393 => 'uniFB89',\n    64394 => 'uniFB8A',\n    64395 => 'uniFB8B',\n    64396 => 'uniFB8C',\n    64397 => 'uniFB8D',\n    64398 => 'uniFB8E',\n    64399 => 'uniFB8F',\n    64400 => 'uniFB90',\n    64401 => 'uniFB91',\n    64402 => 'uniFB92',\n    64403 => 'uniFB93',\n    64404 => 'uniFB94',\n    64405 => 'uniFB95',\n    64406 => 'uniFB96',\n    64407 => 'uniFB97',\n    64408 => 'uniFB98',\n    64409 => 'uniFB99',\n    64410 => 'uniFB9A',\n    64411 => 'uniFB9B',\n    64412 => 'uniFB9C',\n    64413 => 'uniFB9D',\n    64414 => 'uniFB9E',\n    64415 => 'uniFB9F',\n    64416 => 'uniFBA0',\n    64417 => 'uniFBA1',\n    64418 => 'uniFBA2',\n    64419 => 'uniFBA3',\n    64426 => 'uniFBAA',\n    64427 => 'uniFBAB',\n    64428 => 'uniFBAC',\n    64429 => 'uniFBAD',\n    64467 => 'uniFBD3',\n    64468 => 'uniFBD4',\n    64469 => 'uniFBD5',\n    64470 => 'uniFBD6',\n    64471 => 'uniFBD7',\n    64472 => 'uniFBD8',\n    64473 => 'uniFBD9',\n    64474 => 'uniFBDA',\n    64475 => 'uniFBDB',\n    64476 => 'uniFBDC',\n    64478 => 'uniFBDE',\n    64479 => 'uniFBDF',\n    64484 => 'uniFBE4',\n    64485 => 'uniFBE5',\n    64486 => 'uniFBE6',\n    64487 => 'uniFBE7',\n    64488 => 'uniFBE8',\n    64489 => 'uniFBE9',\n    64508 => 'uniFBFC',\n    64509 => 'uniFBFD',\n    64510 => 'uniFBFE',\n    64511 => 'uniFBFF',\n    65024 => 'uniFE00',\n    65025 => 'uniFE01',\n    65026 => 'uniFE02',\n    65027 => 'uniFE03',\n    65028 => 'uniFE04',\n    65029 => 'uniFE05',\n    65030 => 'uniFE06',\n    65031 => 'uniFE07',\n    65032 => 'uniFE08',\n    65033 => 'uniFE09',\n    65034 => 'uniFE0A',\n    65035 => 'uniFE0B',\n    65036 => 'uniFE0C',\n    65037 => 'uniFE0D',\n    65038 => 'uniFE0E',\n    65039 => 'uniFE0F',\n    65056 => 'uniFE20',\n    65057 => 'uniFE21',\n    65058 => 'uniFE22',\n    65059 => 'uniFE23',\n    65136 => 'uniFE70',\n    65137 => 'uniFE71',\n    65138 => 'uniFE72',\n    65139 => 'uniFE73',\n    65140 => 'uniFE74',\n    65142 => 'uniFE76',\n    65143 => 'uniFE77',\n    65144 => 'uniFE78',\n    65145 => 'uniFE79',\n    65146 => 'uniFE7A',\n    65147 => 'uniFE7B',\n    65148 => 'uniFE7C',\n    65149 => 'uniFE7D',\n    65150 => 'uniFE7E',\n    65151 => 'uniFE7F',\n    65152 => 'uniFE80',\n    65153 => 'uniFE81',\n    65154 => 'uniFE82',\n    65155 => 'uniFE83',\n    65156 => 'uniFE84',\n    65157 => 'uniFE85',\n    65158 => 'uniFE86',\n    65159 => 'uniFE87',\n    65160 => 'uniFE88',\n    65161 => 'uniFE89',\n    65162 => 'uniFE8A',\n    65163 => 'uniFE8B',\n    65164 => 'uniFE8C',\n    65165 => 'uniFE8D',\n    65166 => 'uniFE8E',\n    65167 => 'uniFE8F',\n    65168 => 'uniFE90',\n    65169 => 'uniFE91',\n    65170 => 'uniFE92',\n    65171 => 'uniFE93',\n    65172 => 'uniFE94',\n    65173 => 'uniFE95',\n    65174 => 'uniFE96',\n    65175 => 'uniFE97',\n    65176 => 'uniFE98',\n    65177 => 'uniFE99',\n    65178 => 'uniFE9A',\n    65179 => 'uniFE9B',\n    65180 => 'uniFE9C',\n    65181 => 'uniFE9D',\n    65182 => 'uniFE9E',\n    65183 => 'uniFE9F',\n    65184 => 'uniFEA0',\n    65185 => 'uniFEA1',\n    65186 => 'uniFEA2',\n    65187 => 'uniFEA3',\n    65188 => 'uniFEA4',\n    65189 => 'uniFEA5',\n    65190 => 'uniFEA6',\n    65191 => 'uniFEA7',\n    65192 => 'uniFEA8',\n    65193 => 'uniFEA9',\n    65194 => 'uniFEAA',\n    65195 => 'uniFEAB',\n    65196 => 'uniFEAC',\n    65197 => 'uniFEAD',\n    65198 => 'uniFEAE',\n    65199 => 'uniFEAF',\n    65200 => 'uniFEB0',\n    65201 => 'uniFEB1',\n    65202 => 'uniFEB2',\n    65203 => 'uniFEB3',\n    65204 => 'uniFEB4',\n    65205 => 'uniFEB5',\n    65206 => 'uniFEB6',\n    65207 => 'uniFEB7',\n    65208 => 'uniFEB8',\n    65209 => 'uniFEB9',\n    65210 => 'uniFEBA',\n    65211 => 'uniFEBB',\n    65212 => 'uniFEBC',\n    65213 => 'uniFEBD',\n    65214 => 'uniFEBE',\n    65215 => 'uniFEBF',\n    65216 => 'uniFEC0',\n    65217 => 'uniFEC1',\n    65218 => 'uniFEC2',\n    65219 => 'uniFEC3',\n    65220 => 'uniFEC4',\n    65221 => 'uniFEC5',\n    65222 => 'uniFEC6',\n    65223 => 'uniFEC7',\n    65224 => 'uniFEC8',\n    65225 => 'uniFEC9',\n    65226 => 'uniFECA',\n    65227 => 'uniFECB',\n    65228 => 'uniFECC',\n    65229 => 'uniFECD',\n    65230 => 'uniFECE',\n    65231 => 'uniFECF',\n    65232 => 'uniFED0',\n    65233 => 'uniFED1',\n    65234 => 'uniFED2',\n    65235 => 'uniFED3',\n    65236 => 'uniFED4',\n    65237 => 'uniFED5',\n    65238 => 'uniFED6',\n    65239 => 'uniFED7',\n    65240 => 'uniFED8',\n    65241 => 'uniFED9',\n    65242 => 'uniFEDA',\n    65243 => 'uniFEDB',\n    65244 => 'uniFEDC',\n    65245 => 'uniFEDD',\n    65246 => 'uniFEDE',\n    65247 => 'uniFEDF',\n    65248 => 'uniFEE0',\n    65249 => 'uniFEE1',\n    65250 => 'uniFEE2',\n    65251 => 'uniFEE3',\n    65252 => 'uniFEE4',\n    65253 => 'uniFEE5',\n    65254 => 'uniFEE6',\n    65255 => 'uniFEE7',\n    65256 => 'uniFEE8',\n    65257 => 'uniFEE9',\n    65258 => 'uniFEEA',\n    65259 => 'uniFEEB',\n    65260 => 'uniFEEC',\n    65261 => 'uniFEED',\n    65262 => 'uniFEEE',\n    65263 => 'uniFEEF',\n    65264 => 'uniFEF0',\n    65265 => 'uniFEF1',\n    65266 => 'uniFEF2',\n    65267 => 'uniFEF3',\n    65268 => 'uniFEF4',\n    65269 => 'uniFEF5',\n    65270 => 'uniFEF6',\n    65271 => 'uniFEF7',\n    65272 => 'uniFEF8',\n    65273 => 'uniFEF9',\n    65274 => 'uniFEFA',\n    65275 => 'uniFEFB',\n    65276 => 'uniFEFC',\n    65279 => 'uniFEFF',\n    65529 => 'uniFFF9',\n    65530 => 'uniFFFA',\n    65531 => 'uniFFFB',\n    65532 => 'uniFFFC',\n    65533 => 'uniFFFD',\n  ),\n  'isUnicode' => true,\n  'EncodingScheme' => 'FontSpecific',\n  'FontName' => 'DejaVu Sans',\n  'FullName' => 'DejaVu Sans Bold',\n  'Version' => 'Version 2.37',\n  'PostScriptName' => 'DejaVuSans-Bold',\n  'Weight' => 'Bold',\n  'ItalicAngle' => '0',\n  'IsFixedPitch' => 'false',\n  'UnderlineThickness' => '44',\n  'UnderlinePosition' => '-63',\n  'FontHeightOffset' => '0',\n  'Ascender' => '928',\n  'Descender' => '-236',\n  'FontBBox' => \n  array (\n    0 => '-1069',\n    1 => '-415',\n    2 => '1975',\n    3 => '1174',\n  ),\n  'StartCharMetrics' => '6196',\n  'C' => \n  array (\n    32 => 348.0,\n    33 => 456.0,\n    34 => 521.0,\n    35 => 838.0,\n    36 => 696.0,\n    37 => 1002.0,\n    38 => 872.0,\n    39 => 306.0,\n    40 => 457.0,\n    41 => 457.0,\n    42 => 523.0,\n    43 => 838.0,\n    44 => 380.0,\n    45 => 415.0,\n    46 => 380.0,\n    47 => 365.0,\n    48 => 696.0,\n    49 => 696.0,\n    50 => 696.0,\n    51 => 696.0,\n    52 => 696.0,\n    53 => 696.0,\n    54 => 696.0,\n    55 => 696.0,\n    56 => 696.0,\n    57 => 696.0,\n    58 => 400.0,\n    59 => 400.0,\n    60 => 838.0,\n    61 => 838.0,\n    62 => 838.0,\n    63 => 580.0,\n    64 => 1000.0,\n    65 => 774.0,\n    66 => 762.0,\n    67 => 734.0,\n    68 => 830.0,\n    69 => 683.0,\n    70 => 683.0,\n    71 => 821.0,\n    72 => 837.0,\n    73 => 372.0,\n    74 => 372.0,\n    75 => 775.0,\n    76 => 637.0,\n    77 => 995.0,\n    78 => 837.0,\n    79 => 850.0,\n    80 => 733.0,\n    81 => 850.0,\n    82 => 770.0,\n    83 => 720.0,\n    84 => 682.0,\n    85 => 812.0,\n    86 => 774.0,\n    87 => 1103.0,\n    88 => 771.0,\n    89 => 724.0,\n    90 => 725.0,\n    91 => 457.0,\n    92 => 365.0,\n    93 => 457.0,\n    94 => 838.0,\n    95 => 500.0,\n    96 => 500.0,\n    97 => 675.0,\n    98 => 716.0,\n    99 => 593.0,\n    100 => 716.0,\n    101 => 678.0,\n    102 => 435.0,\n    103 => 716.0,\n    104 => 712.0,\n    105 => 343.0,\n    106 => 343.0,\n    107 => 665.0,\n    108 => 343.0,\n    109 => 1042.0,\n    110 => 712.0,\n    111 => 687.0,\n    112 => 716.0,\n    113 => 716.0,\n    114 => 493.0,\n    115 => 595.0,\n    116 => 478.0,\n    117 => 712.0,\n    118 => 652.0,\n    119 => 924.0,\n    120 => 645.0,\n    121 => 652.0,\n    122 => 582.0,\n    123 => 712.0,\n    124 => 365.0,\n    125 => 712.0,\n    126 => 838.0,\n    160 => 348.0,\n    161 => 456.0,\n    162 => 696.0,\n    163 => 696.0,\n    164 => 636.0,\n    165 => 696.0,\n    166 => 365.0,\n    167 => 500.0,\n    168 => 500.0,\n    169 => 1000.0,\n    170 => 564.0,\n    171 => 646.0,\n    172 => 838.0,\n    173 => 415.0,\n    174 => 1000.0,\n    175 => 500.0,\n    176 => 500.0,\n    177 => 838.0,\n    178 => 438.0,\n    179 => 438.0,\n    180 => 500.0,\n    181 => 736.0,\n    182 => 636.0,\n    183 => 380.0,\n    184 => 500.0,\n    185 => 438.0,\n    186 => 564.0,\n    187 => 646.0,\n    188 => 1035.0,\n    189 => 1035.0,\n    190 => 1035.0,\n    191 => 580.0,\n    192 => 774.0,\n    193 => 774.0,\n    194 => 774.0,\n    195 => 774.0,\n    196 => 774.0,\n    197 => 774.0,\n    198 => 1085.0,\n    199 => 734.0,\n    200 => 683.0,\n    201 => 683.0,\n    202 => 683.0,\n    203 => 683.0,\n    204 => 372.0,\n    205 => 372.0,\n    206 => 372.0,\n    207 => 372.0,\n    208 => 838.0,\n    209 => 837.0,\n    210 => 850.0,\n    211 => 850.0,\n    212 => 850.0,\n    213 => 850.0,\n    214 => 850.0,\n    215 => 838.0,\n    216 => 850.0,\n    217 => 812.0,\n    218 => 812.0,\n    219 => 812.0,\n    220 => 812.0,\n    221 => 724.0,\n    222 => 738.0,\n    223 => 719.0,\n    224 => 675.0,\n    225 => 675.0,\n    226 => 675.0,\n    227 => 675.0,\n    228 => 675.0,\n    229 => 675.0,\n    230 => 1048.0,\n    231 => 593.0,\n    232 => 678.0,\n    233 => 678.0,\n    234 => 678.0,\n    235 => 678.0,\n    236 => 343.0,\n    237 => 343.0,\n    238 => 343.0,\n    239 => 343.0,\n    240 => 687.0,\n    241 => 712.0,\n    242 => 687.0,\n    243 => 687.0,\n    244 => 687.0,\n    245 => 687.0,\n    246 => 687.0,\n    247 => 838.0,\n    248 => 687.0,\n    249 => 712.0,\n    250 => 712.0,\n    251 => 712.0,\n    252 => 712.0,\n    253 => 652.0,\n    254 => 716.0,\n    255 => 652.0,\n    256 => 774.0,\n    257 => 675.0,\n    258 => 774.0,\n    259 => 675.0,\n    260 => 774.0,\n    261 => 675.0,\n    262 => 734.0,\n    263 => 593.0,\n    264 => 734.0,\n    265 => 593.0,\n    266 => 734.0,\n    267 => 593.0,\n    268 => 734.0,\n    269 => 593.0,\n    270 => 830.0,\n    271 => 716.0,\n    272 => 838.0,\n    273 => 716.0,\n    274 => 683.0,\n    275 => 678.0,\n    276 => 683.0,\n    277 => 678.0,\n    278 => 683.0,\n    279 => 678.0,\n    280 => 683.0,\n    281 => 678.0,\n    282 => 683.0,\n    283 => 678.0,\n    284 => 821.0,\n    285 => 716.0,\n    286 => 821.0,\n    287 => 716.0,\n    288 => 821.0,\n    289 => 716.0,\n    290 => 821.0,\n    291 => 716.0,\n    292 => 837.0,\n    293 => 712.0,\n    294 => 974.0,\n    295 => 790.0,\n    296 => 372.0,\n    297 => 343.0,\n    298 => 372.0,\n    299 => 343.0,\n    300 => 372.0,\n    301 => 343.0,\n    302 => 372.0,\n    303 => 343.0,\n    304 => 372.0,\n    305 => 343.0,\n    306 => 744.0,\n    307 => 686.0,\n    308 => 372.0,\n    309 => 343.0,\n    310 => 775.0,\n    311 => 665.0,\n    312 => 665.0,\n    313 => 637.0,\n    314 => 343.0,\n    315 => 637.0,\n    316 => 343.0,\n    317 => 637.0,\n    318 => 479.0,\n    319 => 637.0,\n    320 => 557.0,\n    321 => 642.0,\n    322 => 371.0,\n    323 => 837.0,\n    324 => 712.0,\n    325 => 837.0,\n    326 => 712.0,\n    327 => 837.0,\n    328 => 712.0,\n    329 => 983.0,\n    330 => 837.0,\n    331 => 712.0,\n    332 => 850.0,\n    333 => 687.0,\n    334 => 850.0,\n    335 => 687.0,\n    336 => 850.0,\n    337 => 687.0,\n    338 => 1167.0,\n    339 => 1094.0,\n    340 => 770.0,\n    341 => 493.0,\n    342 => 770.0,\n    343 => 493.0,\n    344 => 770.0,\n    345 => 493.0,\n    346 => 720.0,\n    347 => 595.0,\n    348 => 720.0,\n    349 => 595.0,\n    350 => 720.0,\n    351 => 595.0,\n    352 => 720.0,\n    353 => 595.0,\n    354 => 682.0,\n    355 => 478.0,\n    356 => 682.0,\n    357 => 478.0,\n    358 => 682.0,\n    359 => 478.0,\n    360 => 812.0,\n    361 => 712.0,\n    362 => 812.0,\n    363 => 712.0,\n    364 => 812.0,\n    365 => 712.0,\n    366 => 812.0,\n    367 => 712.0,\n    368 => 812.0,\n    369 => 712.0,\n    370 => 812.0,\n    371 => 712.0,\n    372 => 1103.0,\n    373 => 924.0,\n    374 => 724.0,\n    375 => 652.0,\n    376 => 724.0,\n    377 => 725.0,\n    378 => 582.0,\n    379 => 725.0,\n    380 => 582.0,\n    381 => 725.0,\n    382 => 582.0,\n    383 => 435.0,\n    384 => 716.0,\n    385 => 811.0,\n    386 => 762.0,\n    387 => 716.0,\n    388 => 762.0,\n    389 => 716.0,\n    390 => 734.0,\n    391 => 734.0,\n    392 => 593.0,\n    393 => 838.0,\n    394 => 879.0,\n    395 => 757.0,\n    396 => 716.0,\n    397 => 688.0,\n    398 => 683.0,\n    399 => 849.0,\n    400 => 696.0,\n    401 => 683.0,\n    402 => 435.0,\n    403 => 821.0,\n    404 => 793.0,\n    405 => 1045.0,\n    406 => 436.0,\n    407 => 389.0,\n    408 => 775.0,\n    409 => 665.0,\n    410 => 360.0,\n    411 => 592.0,\n    412 => 1042.0,\n    413 => 837.0,\n    414 => 712.0,\n    415 => 850.0,\n    416 => 874.0,\n    417 => 687.0,\n    418 => 1083.0,\n    419 => 912.0,\n    420 => 782.0,\n    421 => 716.0,\n    422 => 770.0,\n    423 => 720.0,\n    424 => 595.0,\n    425 => 683.0,\n    426 => 552.0,\n    427 => 478.0,\n    428 => 707.0,\n    429 => 478.0,\n    430 => 682.0,\n    431 => 835.0,\n    432 => 712.0,\n    433 => 850.0,\n    434 => 813.0,\n    435 => 797.0,\n    436 => 778.0,\n    437 => 725.0,\n    438 => 582.0,\n    439 => 772.0,\n    440 => 772.0,\n    441 => 641.0,\n    442 => 582.0,\n    443 => 696.0,\n    444 => 772.0,\n    445 => 641.0,\n    446 => 573.0,\n    447 => 716.0,\n    448 => 372.0,\n    449 => 659.0,\n    450 => 544.0,\n    451 => 372.0,\n    452 => 1555.0,\n    453 => 1412.0,\n    454 => 1298.0,\n    455 => 1009.0,\n    456 => 980.0,\n    457 => 686.0,\n    458 => 1209.0,\n    459 => 1180.0,\n    460 => 1055.0,\n    461 => 774.0,\n    462 => 675.0,\n    463 => 372.0,\n    464 => 343.0,\n    465 => 850.0,\n    466 => 687.0,\n    467 => 812.0,\n    468 => 712.0,\n    469 => 812.0,\n    470 => 712.0,\n    471 => 812.0,\n    472 => 712.0,\n    473 => 812.0,\n    474 => 712.0,\n    475 => 812.0,\n    476 => 712.0,\n    477 => 678.0,\n    478 => 774.0,\n    479 => 675.0,\n    480 => 774.0,\n    481 => 675.0,\n    482 => 1085.0,\n    483 => 1048.0,\n    484 => 821.0,\n    485 => 716.0,\n    486 => 821.0,\n    487 => 716.0,\n    488 => 775.0,\n    489 => 665.0,\n    490 => 850.0,\n    491 => 687.0,\n    492 => 850.0,\n    493 => 687.0,\n    494 => 772.0,\n    495 => 582.0,\n    496 => 343.0,\n    497 => 1555.0,\n    498 => 1412.0,\n    499 => 1298.0,\n    500 => 821.0,\n    501 => 716.0,\n    502 => 1289.0,\n    503 => 787.0,\n    504 => 837.0,\n    505 => 712.0,\n    506 => 774.0,\n    507 => 675.0,\n    508 => 1085.0,\n    509 => 1048.0,\n    510 => 850.0,\n    511 => 687.0,\n    512 => 774.0,\n    513 => 675.0,\n    514 => 774.0,\n    515 => 675.0,\n    516 => 683.0,\n    517 => 678.0,\n    518 => 683.0,\n    519 => 678.0,\n    520 => 372.0,\n    521 => 343.0,\n    522 => 372.0,\n    523 => 343.0,\n    524 => 850.0,\n    525 => 687.0,\n    526 => 850.0,\n    527 => 687.0,\n    528 => 770.0,\n    529 => 493.0,\n    530 => 770.0,\n    531 => 493.0,\n    532 => 812.0,\n    533 => 712.0,\n    534 => 812.0,\n    535 => 712.0,\n    536 => 720.0,\n    537 => 595.0,\n    538 => 682.0,\n    539 => 478.0,\n    540 => 690.0,\n    541 => 607.0,\n    542 => 837.0,\n    543 => 712.0,\n    544 => 837.0,\n    545 => 865.0,\n    546 => 809.0,\n    547 => 659.0,\n    548 => 725.0,\n    549 => 582.0,\n    550 => 774.0,\n    551 => 675.0,\n    552 => 683.0,\n    553 => 678.0,\n    554 => 850.0,\n    555 => 687.0,\n    556 => 850.0,\n    557 => 687.0,\n    558 => 850.0,\n    559 => 687.0,\n    560 => 850.0,\n    561 => 687.0,\n    562 => 724.0,\n    563 => 652.0,\n    564 => 492.0,\n    565 => 867.0,\n    566 => 512.0,\n    567 => 343.0,\n    568 => 1088.0,\n    569 => 1088.0,\n    570 => 774.0,\n    571 => 734.0,\n    572 => 593.0,\n    573 => 637.0,\n    574 => 682.0,\n    575 => 595.0,\n    576 => 582.0,\n    577 => 782.0,\n    578 => 614.0,\n    579 => 762.0,\n    580 => 812.0,\n    581 => 774.0,\n    582 => 683.0,\n    583 => 678.0,\n    584 => 372.0,\n    585 => 343.0,\n    586 => 860.0,\n    587 => 791.0,\n    588 => 770.0,\n    589 => 493.0,\n    590 => 724.0,\n    591 => 652.0,\n    592 => 675.0,\n    593 => 716.0,\n    594 => 716.0,\n    595 => 716.0,\n    596 => 593.0,\n    597 => 593.0,\n    598 => 717.0,\n    599 => 792.0,\n    600 => 678.0,\n    601 => 678.0,\n    602 => 876.0,\n    603 => 557.0,\n    604 => 545.0,\n    605 => 815.0,\n    606 => 731.0,\n    607 => 343.0,\n    608 => 792.0,\n    609 => 716.0,\n    610 => 627.0,\n    611 => 644.0,\n    612 => 635.0,\n    613 => 712.0,\n    614 => 712.0,\n    615 => 712.0,\n    616 => 545.0,\n    617 => 440.0,\n    618 => 545.0,\n    619 => 559.0,\n    620 => 693.0,\n    621 => 343.0,\n    622 => 841.0,\n    623 => 1042.0,\n    624 => 1042.0,\n    625 => 1042.0,\n    626 => 712.0,\n    627 => 793.0,\n    628 => 707.0,\n    629 => 687.0,\n    630 => 909.0,\n    631 => 681.0,\n    632 => 796.0,\n    633 => 538.0,\n    634 => 538.0,\n    635 => 650.0,\n    636 => 493.0,\n    637 => 493.0,\n    638 => 596.0,\n    639 => 596.0,\n    640 => 642.0,\n    641 => 642.0,\n    642 => 595.0,\n    643 => 415.0,\n    644 => 435.0,\n    645 => 605.0,\n    646 => 552.0,\n    647 => 478.0,\n    648 => 478.0,\n    649 => 920.0,\n    650 => 772.0,\n    651 => 670.0,\n    652 => 652.0,\n    653 => 924.0,\n    654 => 652.0,\n    655 => 724.0,\n    656 => 694.0,\n    657 => 684.0,\n    658 => 641.0,\n    659 => 641.0,\n    660 => 573.0,\n    661 => 573.0,\n    662 => 573.0,\n    663 => 573.0,\n    664 => 850.0,\n    665 => 633.0,\n    666 => 731.0,\n    667 => 685.0,\n    668 => 691.0,\n    669 => 343.0,\n    670 => 732.0,\n    671 => 539.0,\n    672 => 792.0,\n    673 => 573.0,\n    674 => 573.0,\n    675 => 1156.0,\n    676 => 1214.0,\n    677 => 1155.0,\n    678 => 975.0,\n    679 => 769.0,\n    680 => 929.0,\n    681 => 1026.0,\n    682 => 862.0,\n    683 => 780.0,\n    684 => 591.0,\n    685 => 415.0,\n    686 => 677.0,\n    687 => 789.0,\n    688 => 456.0,\n    689 => 456.0,\n    690 => 219.0,\n    691 => 315.0,\n    692 => 315.0,\n    693 => 315.0,\n    694 => 411.0,\n    695 => 591.0,\n    696 => 417.0,\n    697 => 302.0,\n    698 => 521.0,\n    699 => 380.0,\n    700 => 380.0,\n    701 => 380.0,\n    702 => 366.0,\n    703 => 366.0,\n    704 => 326.0,\n    705 => 326.0,\n    706 => 500.0,\n    707 => 500.0,\n    708 => 500.0,\n    709 => 500.0,\n    710 => 500.0,\n    711 => 500.0,\n    712 => 306.0,\n    713 => 500.0,\n    714 => 500.0,\n    715 => 500.0,\n    716 => 306.0,\n    717 => 500.0,\n    718 => 500.0,\n    719 => 500.0,\n    720 => 337.0,\n    721 => 337.0,\n    722 => 366.0,\n    723 => 366.0,\n    724 => 500.0,\n    725 => 500.0,\n    726 => 416.0,\n    727 => 328.0,\n    728 => 500.0,\n    729 => 500.0,\n    730 => 500.0,\n    731 => 500.0,\n    732 => 500.0,\n    733 => 500.0,\n    734 => 351.0,\n    735 => 500.0,\n    736 => 412.0,\n    737 => 219.0,\n    738 => 381.0,\n    739 => 413.0,\n    740 => 326.0,\n    741 => 500.0,\n    742 => 500.0,\n    743 => 500.0,\n    744 => 500.0,\n    745 => 500.0,\n    748 => 500.0,\n    749 => 500.0,\n    750 => 657.0,\n    755 => 500.0,\n    759 => 500.0,\n    768 => 0.0,\n    769 => 0.0,\n    770 => 0.0,\n    771 => 0.0,\n    772 => 0.0,\n    773 => 0.0,\n    774 => 0.0,\n    775 => 0.0,\n    776 => 0.0,\n    777 => 0.0,\n    778 => 0.0,\n    779 => 0.0,\n    780 => 0.0,\n    781 => 0.0,\n    782 => 0.0,\n    783 => 0.0,\n    784 => 0.0,\n    785 => 0.0,\n    786 => 0.0,\n    787 => 0.0,\n    788 => 0.0,\n    789 => 0.0,\n    790 => 0.0,\n    791 => 0.0,\n    792 => 0.0,\n    793 => 0.0,\n    794 => 0.0,\n    795 => 0.0,\n    796 => 0.0,\n    797 => 0.0,\n    798 => 0.0,\n    799 => 0.0,\n    800 => 0.0,\n    801 => 0.0,\n    802 => 0.0,\n    803 => 0.0,\n    804 => 0.0,\n    805 => 0.0,\n    806 => 0.0,\n    807 => 0.0,\n    808 => 0.0,\n    809 => 0.0,\n    810 => 0.0,\n    811 => 0.0,\n    812 => 0.0,\n    813 => 0.0,\n    814 => 0.0,\n    815 => 0.0,\n    816 => 0.0,\n    817 => 0.0,\n    818 => 0.0,\n    819 => 0.0,\n    820 => 0.0,\n    821 => 0.0,\n    822 => 0.0,\n    823 => 0.0,\n    824 => 0.0,\n    825 => 0.0,\n    826 => 0.0,\n    827 => 0.0,\n    828 => 0.0,\n    829 => 0.0,\n    830 => 0.0,\n    831 => 0.0,\n    832 => 0.0,\n    833 => 0.0,\n    834 => 0.0,\n    835 => 0.0,\n    836 => 0.0,\n    837 => 0.0,\n    838 => 0.0,\n    839 => 0.0,\n    840 => 0.0,\n    841 => 0.0,\n    842 => 0.0,\n    843 => 0.0,\n    844 => 0.0,\n    845 => 0.0,\n    846 => 0.0,\n    847 => 0.0,\n    849 => 0.0,\n    850 => 0.0,\n    851 => 0.0,\n    855 => 0.0,\n    856 => 0.0,\n    858 => 0.0,\n    860 => 0.0,\n    861 => 0.0,\n    862 => 0.0,\n    863 => 0.0,\n    864 => 0.0,\n    865 => 0.0,\n    866 => 0.0,\n    880 => 698.0,\n    881 => 565.0,\n    882 => 1022.0,\n    883 => 836.0,\n    884 => 302.0,\n    885 => 302.0,\n    886 => 837.0,\n    887 => 701.0,\n    890 => 500.0,\n    891 => 593.0,\n    892 => 550.0,\n    893 => 549.0,\n    894 => 400.0,\n    895 => 372.0,\n    900 => 441.0,\n    901 => 500.0,\n    902 => 797.0,\n    903 => 380.0,\n    904 => 846.0,\n    905 => 1009.0,\n    906 => 563.0,\n    908 => 891.0,\n    910 => 980.0,\n    911 => 894.0,\n    912 => 390.0,\n    913 => 774.0,\n    914 => 762.0,\n    915 => 637.0,\n    916 => 774.0,\n    917 => 683.0,\n    918 => 725.0,\n    919 => 837.0,\n    920 => 850.0,\n    921 => 372.0,\n    922 => 775.0,\n    923 => 774.0,\n    924 => 995.0,\n    925 => 837.0,\n    926 => 632.0,\n    927 => 850.0,\n    928 => 837.0,\n    929 => 733.0,\n    931 => 683.0,\n    932 => 682.0,\n    933 => 724.0,\n    934 => 850.0,\n    935 => 771.0,\n    936 => 850.0,\n    937 => 850.0,\n    938 => 372.0,\n    939 => 724.0,\n    940 => 687.0,\n    941 => 557.0,\n    942 => 712.0,\n    943 => 390.0,\n    944 => 675.0,\n    945 => 687.0,\n    946 => 716.0,\n    947 => 681.0,\n    948 => 687.0,\n    949 => 557.0,\n    950 => 591.0,\n    951 => 712.0,\n    952 => 687.0,\n    953 => 390.0,\n    954 => 710.0,\n    955 => 633.0,\n    956 => 736.0,\n    957 => 681.0,\n    958 => 591.0,\n    959 => 687.0,\n    960 => 791.0,\n    961 => 716.0,\n    962 => 593.0,\n    963 => 779.0,\n    964 => 638.0,\n    965 => 675.0,\n    966 => 782.0,\n    967 => 645.0,\n    968 => 794.0,\n    969 => 869.0,\n    970 => 390.0,\n    971 => 675.0,\n    972 => 687.0,\n    973 => 675.0,\n    974 => 869.0,\n    975 => 775.0,\n    976 => 651.0,\n    977 => 661.0,\n    978 => 746.0,\n    979 => 981.0,\n    980 => 746.0,\n    981 => 796.0,\n    982 => 869.0,\n    983 => 744.0,\n    984 => 850.0,\n    985 => 687.0,\n    986 => 734.0,\n    987 => 593.0,\n    988 => 683.0,\n    989 => 494.0,\n    990 => 702.0,\n    991 => 660.0,\n    992 => 919.0,\n    993 => 627.0,\n    994 => 1093.0,\n    995 => 837.0,\n    996 => 832.0,\n    997 => 716.0,\n    998 => 928.0,\n    999 => 744.0,\n    1000 => 733.0,\n    1001 => 650.0,\n    1002 => 789.0,\n    1003 => 671.0,\n    1004 => 752.0,\n    1005 => 716.0,\n    1006 => 682.0,\n    1007 => 590.0,\n    1008 => 744.0,\n    1009 => 716.0,\n    1010 => 593.0,\n    1011 => 343.0,\n    1012 => 850.0,\n    1013 => 645.0,\n    1014 => 644.0,\n    1015 => 738.0,\n    1016 => 716.0,\n    1017 => 734.0,\n    1018 => 995.0,\n    1019 => 732.0,\n    1020 => 716.0,\n    1021 => 698.0,\n    1022 => 734.0,\n    1023 => 698.0,\n    1024 => 683.0,\n    1025 => 683.0,\n    1026 => 878.0,\n    1027 => 637.0,\n    1028 => 734.0,\n    1029 => 720.0,\n    1030 => 372.0,\n    1031 => 372.0,\n    1032 => 372.0,\n    1033 => 1154.0,\n    1034 => 1130.0,\n    1035 => 878.0,\n    1036 => 817.0,\n    1037 => 837.0,\n    1038 => 771.0,\n    1039 => 837.0,\n    1040 => 774.0,\n    1041 => 762.0,\n    1042 => 762.0,\n    1043 => 637.0,\n    1044 => 891.0,\n    1045 => 683.0,\n    1046 => 1224.0,\n    1047 => 710.0,\n    1048 => 837.0,\n    1049 => 837.0,\n    1050 => 817.0,\n    1051 => 831.0,\n    1052 => 995.0,\n    1053 => 837.0,\n    1054 => 850.0,\n    1055 => 837.0,\n    1056 => 733.0,\n    1057 => 734.0,\n    1058 => 682.0,\n    1059 => 771.0,\n    1060 => 992.0,\n    1061 => 771.0,\n    1062 => 928.0,\n    1063 => 808.0,\n    1064 => 1235.0,\n    1065 => 1326.0,\n    1066 => 939.0,\n    1067 => 1036.0,\n    1068 => 762.0,\n    1069 => 734.0,\n    1070 => 1174.0,\n    1071 => 770.0,\n    1072 => 675.0,\n    1073 => 698.0,\n    1074 => 633.0,\n    1075 => 522.0,\n    1076 => 808.0,\n    1077 => 678.0,\n    1078 => 995.0,\n    1079 => 581.0,\n    1080 => 701.0,\n    1081 => 701.0,\n    1082 => 679.0,\n    1083 => 732.0,\n    1084 => 817.0,\n    1085 => 691.0,\n    1086 => 687.0,\n    1087 => 691.0,\n    1088 => 716.0,\n    1089 => 593.0,\n    1090 => 580.0,\n    1091 => 652.0,\n    1092 => 992.0,\n    1093 => 645.0,\n    1094 => 741.0,\n    1095 => 687.0,\n    1096 => 1062.0,\n    1097 => 1105.0,\n    1098 => 751.0,\n    1099 => 904.0,\n    1100 => 632.0,\n    1101 => 593.0,\n    1102 => 972.0,\n    1103 => 642.0,\n    1104 => 678.0,\n    1105 => 678.0,\n    1106 => 714.0,\n    1107 => 522.0,\n    1108 => 593.0,\n    1109 => 595.0,\n    1110 => 343.0,\n    1111 => 343.0,\n    1112 => 343.0,\n    1113 => 991.0,\n    1114 => 956.0,\n    1115 => 734.0,\n    1116 => 679.0,\n    1117 => 701.0,\n    1118 => 652.0,\n    1119 => 691.0,\n    1120 => 1093.0,\n    1121 => 869.0,\n    1122 => 840.0,\n    1123 => 736.0,\n    1124 => 1012.0,\n    1125 => 839.0,\n    1126 => 992.0,\n    1127 => 832.0,\n    1128 => 1358.0,\n    1129 => 1121.0,\n    1130 => 850.0,\n    1131 => 687.0,\n    1132 => 1236.0,\n    1133 => 1007.0,\n    1134 => 696.0,\n    1135 => 557.0,\n    1136 => 1075.0,\n    1137 => 1061.0,\n    1138 => 850.0,\n    1139 => 687.0,\n    1140 => 850.0,\n    1141 => 695.0,\n    1142 => 850.0,\n    1143 => 695.0,\n    1144 => 1148.0,\n    1145 => 1043.0,\n    1146 => 1074.0,\n    1147 => 863.0,\n    1148 => 1405.0,\n    1149 => 1173.0,\n    1150 => 1093.0,\n    1151 => 869.0,\n    1152 => 734.0,\n    1153 => 593.0,\n    1154 => 652.0,\n    1155 => 0.0,\n    1156 => 0.0,\n    1157 => 0.0,\n    1158 => 0.0,\n    1159 => 0.0,\n    1160 => 418.0,\n    1161 => 418.0,\n    1162 => 957.0,\n    1163 => 807.0,\n    1164 => 762.0,\n    1165 => 611.0,\n    1166 => 733.0,\n    1167 => 716.0,\n    1168 => 637.0,\n    1169 => 522.0,\n    1170 => 666.0,\n    1171 => 543.0,\n    1172 => 808.0,\n    1173 => 669.0,\n    1174 => 1224.0,\n    1175 => 995.0,\n    1176 => 710.0,\n    1177 => 581.0,\n    1178 => 775.0,\n    1179 => 679.0,\n    1180 => 817.0,\n    1181 => 679.0,\n    1182 => 817.0,\n    1183 => 679.0,\n    1184 => 1015.0,\n    1185 => 826.0,\n    1186 => 956.0,\n    1187 => 808.0,\n    1188 => 1103.0,\n    1189 => 874.0,\n    1190 => 1273.0,\n    1191 => 1017.0,\n    1192 => 952.0,\n    1193 => 858.0,\n    1194 => 734.0,\n    1195 => 593.0,\n    1196 => 682.0,\n    1197 => 580.0,\n    1198 => 724.0,\n    1199 => 652.0,\n    1200 => 724.0,\n    1201 => 652.0,\n    1202 => 771.0,\n    1203 => 645.0,\n    1204 => 1112.0,\n    1205 => 1000.0,\n    1206 => 808.0,\n    1207 => 687.0,\n    1208 => 808.0,\n    1209 => 687.0,\n    1210 => 808.0,\n    1211 => 712.0,\n    1212 => 1026.0,\n    1213 => 810.0,\n    1214 => 1026.0,\n    1215 => 810.0,\n    1216 => 372.0,\n    1217 => 1224.0,\n    1218 => 995.0,\n    1219 => 775.0,\n    1220 => 630.0,\n    1221 => 951.0,\n    1222 => 805.0,\n    1223 => 837.0,\n    1224 => 691.0,\n    1225 => 957.0,\n    1226 => 807.0,\n    1227 => 808.0,\n    1228 => 687.0,\n    1229 => 1115.0,\n    1230 => 933.0,\n    1231 => 343.0,\n    1232 => 774.0,\n    1233 => 675.0,\n    1234 => 774.0,\n    1235 => 675.0,\n    1236 => 1085.0,\n    1237 => 1048.0,\n    1238 => 683.0,\n    1239 => 678.0,\n    1240 => 849.0,\n    1241 => 678.0,\n    1242 => 849.0,\n    1243 => 678.0,\n    1244 => 1224.0,\n    1245 => 995.0,\n    1246 => 710.0,\n    1247 => 581.0,\n    1248 => 772.0,\n    1249 => 641.0,\n    1250 => 837.0,\n    1251 => 701.0,\n    1252 => 837.0,\n    1253 => 701.0,\n    1254 => 850.0,\n    1255 => 687.0,\n    1256 => 850.0,\n    1257 => 687.0,\n    1258 => 850.0,\n    1259 => 687.0,\n    1260 => 734.0,\n    1261 => 593.0,\n    1262 => 771.0,\n    1263 => 652.0,\n    1264 => 771.0,\n    1265 => 652.0,\n    1266 => 771.0,\n    1267 => 652.0,\n    1268 => 808.0,\n    1269 => 687.0,\n    1270 => 637.0,\n    1271 => 522.0,\n    1272 => 1036.0,\n    1273 => 904.0,\n    1274 => 666.0,\n    1275 => 543.0,\n    1276 => 771.0,\n    1277 => 645.0,\n    1278 => 771.0,\n    1279 => 645.0,\n    1280 => 762.0,\n    1281 => 608.0,\n    1282 => 1159.0,\n    1283 => 893.0,\n    1284 => 1119.0,\n    1285 => 920.0,\n    1286 => 828.0,\n    1287 => 693.0,\n    1288 => 1242.0,\n    1289 => 1017.0,\n    1290 => 1289.0,\n    1291 => 1013.0,\n    1292 => 839.0,\n    1293 => 638.0,\n    1294 => 938.0,\n    1295 => 803.0,\n    1296 => 696.0,\n    1297 => 557.0,\n    1298 => 831.0,\n    1299 => 732.0,\n    1300 => 1286.0,\n    1301 => 1068.0,\n    1302 => 1065.0,\n    1303 => 979.0,\n    1304 => 1082.0,\n    1305 => 1013.0,\n    1306 => 850.0,\n    1307 => 716.0,\n    1308 => 1103.0,\n    1309 => 924.0,\n    1310 => 817.0,\n    1311 => 679.0,\n    1312 => 1267.0,\n    1313 => 1059.0,\n    1314 => 1273.0,\n    1315 => 1017.0,\n    1316 => 957.0,\n    1317 => 807.0,\n    1329 => 813.0,\n    1330 => 729.0,\n    1331 => 728.0,\n    1332 => 731.0,\n    1333 => 729.0,\n    1334 => 733.0,\n    1335 => 652.0,\n    1336 => 720.0,\n    1337 => 903.0,\n    1338 => 728.0,\n    1339 => 666.0,\n    1340 => 558.0,\n    1341 => 961.0,\n    1342 => 788.0,\n    1343 => 713.0,\n    1344 => 651.0,\n    1345 => 730.0,\n    1346 => 715.0,\n    1347 => 704.0,\n    1348 => 780.0,\n    1349 => 689.0,\n    1350 => 715.0,\n    1351 => 708.0,\n    1352 => 731.0,\n    1353 => 677.0,\n    1354 => 867.0,\n    1355 => 711.0,\n    1356 => 780.0,\n    1357 => 731.0,\n    1358 => 715.0,\n    1359 => 693.0,\n    1360 => 666.0,\n    1361 => 698.0,\n    1362 => 576.0,\n    1363 => 833.0,\n    1364 => 698.0,\n    1365 => 763.0,\n    1366 => 855.0,\n    1369 => 330.0,\n    1370 => 342.0,\n    1371 => 308.0,\n    1372 => 374.0,\n    1373 => 313.0,\n    1374 => 461.0,\n    1375 => 468.0,\n    1377 => 938.0,\n    1378 => 642.0,\n    1379 => 704.0,\n    1380 => 708.0,\n    1381 => 642.0,\n    1382 => 644.0,\n    1383 => 565.0,\n    1384 => 642.0,\n    1385 => 756.0,\n    1386 => 704.0,\n    1387 => 643.0,\n    1388 => 310.0,\n    1389 => 984.0,\n    1390 => 638.0,\n    1391 => 643.0,\n    1392 => 643.0,\n    1393 => 603.0,\n    1394 => 643.0,\n    1395 => 642.0,\n    1396 => 643.0,\n    1397 => 309.0,\n    1398 => 643.0,\n    1399 => 486.0,\n    1400 => 643.0,\n    1401 => 366.0,\n    1402 => 938.0,\n    1403 => 573.0,\n    1404 => 666.0,\n    1405 => 643.0,\n    1406 => 643.0,\n    1407 => 934.0,\n    1408 => 643.0,\n    1409 => 643.0,\n    1410 => 479.0,\n    1411 => 934.0,\n    1412 => 648.0,\n    1413 => 620.0,\n    1414 => 813.0,\n    1415 => 812.0,\n    1417 => 360.0,\n    1418 => 374.0,\n    1456 => 0.0,\n    1457 => 0.0,\n    1458 => 0.0,\n    1459 => 0.0,\n    1460 => 0.0,\n    1461 => 0.0,\n    1462 => 0.0,\n    1463 => 0.0,\n    1464 => 0.0,\n    1465 => 0.0,\n    1466 => 0.0,\n    1467 => 0.0,\n    1468 => 0.0,\n    1469 => 0.0,\n    1470 => 415.0,\n    1471 => 0.0,\n    1472 => 372.0,\n    1473 => 0.0,\n    1474 => 0.0,\n    1475 => 372.0,\n    1478 => 497.0,\n    1479 => 0.0,\n    1488 => 728.0,\n    1489 => 610.0,\n    1490 => 447.0,\n    1491 => 588.0,\n    1492 => 687.0,\n    1493 => 343.0,\n    1494 => 400.0,\n    1495 => 687.0,\n    1496 => 679.0,\n    1497 => 294.0,\n    1498 => 578.0,\n    1499 => 566.0,\n    1500 => 605.0,\n    1501 => 696.0,\n    1502 => 724.0,\n    1503 => 343.0,\n    1504 => 453.0,\n    1505 => 680.0,\n    1506 => 666.0,\n    1507 => 675.0,\n    1508 => 658.0,\n    1509 => 661.0,\n    1510 => 653.0,\n    1511 => 736.0,\n    1512 => 602.0,\n    1513 => 758.0,\n    1514 => 683.0,\n    1520 => 664.0,\n    1521 => 567.0,\n    1522 => 519.0,\n    1523 => 444.0,\n    1524 => 710.0,\n    1542 => 667.0,\n    1543 => 667.0,\n    1545 => 884.0,\n    1546 => 1157.0,\n    1548 => 380.0,\n    1557 => 0.0,\n    1563 => 400.0,\n    1567 => 580.0,\n    1569 => 511.0,\n    1570 => 343.0,\n    1571 => 343.0,\n    1572 => 622.0,\n    1573 => 343.0,\n    1574 => 917.0,\n    1575 => 343.0,\n    1576 => 1005.0,\n    1577 => 590.0,\n    1578 => 1005.0,\n    1579 => 1005.0,\n    1580 => 721.0,\n    1581 => 721.0,\n    1582 => 721.0,\n    1583 => 513.0,\n    1584 => 513.0,\n    1585 => 576.0,\n    1586 => 576.0,\n    1587 => 1380.0,\n    1588 => 1380.0,\n    1589 => 1345.0,\n    1590 => 1345.0,\n    1591 => 1039.0,\n    1592 => 1039.0,\n    1593 => 683.0,\n    1594 => 683.0,\n    1600 => 342.0,\n    1601 => 1162.0,\n    1602 => 894.0,\n    1603 => 917.0,\n    1604 => 868.0,\n    1605 => 733.0,\n    1606 => 854.0,\n    1607 => 590.0,\n    1608 => 622.0,\n    1609 => 917.0,\n    1610 => 917.0,\n    1611 => 0.0,\n    1612 => 0.0,\n    1613 => 0.0,\n    1614 => 0.0,\n    1615 => 0.0,\n    1616 => 0.0,\n    1617 => 0.0,\n    1618 => 0.0,\n    1619 => 0.0,\n    1620 => 0.0,\n    1621 => 0.0,\n    1623 => 0.0,\n    1626 => 500.0,\n    1632 => 610.0,\n    1633 => 610.0,\n    1634 => 610.0,\n    1635 => 610.0,\n    1636 => 610.0,\n    1637 => 610.0,\n    1638 => 610.0,\n    1639 => 610.0,\n    1640 => 610.0,\n    1641 => 610.0,\n    1642 => 610.0,\n    1643 => 374.0,\n    1644 => 380.0,\n    1645 => 545.0,\n    1646 => 1005.0,\n    1647 => 894.0,\n    1648 => 0.0,\n    1652 => 292.0,\n    1657 => 1005.0,\n    1658 => 1005.0,\n    1659 => 1005.0,\n    1660 => 1005.0,\n    1661 => 1005.0,\n    1662 => 1005.0,\n    1663 => 1005.0,\n    1664 => 1005.0,\n    1665 => 721.0,\n    1666 => 721.0,\n    1667 => 721.0,\n    1668 => 721.0,\n    1669 => 721.0,\n    1670 => 721.0,\n    1671 => 721.0,\n    1672 => 445.0,\n    1673 => 445.0,\n    1674 => 445.0,\n    1675 => 445.0,\n    1676 => 445.0,\n    1677 => 445.0,\n    1678 => 445.0,\n    1679 => 445.0,\n    1680 => 445.0,\n    1681 => 576.0,\n    1682 => 576.0,\n    1683 => 576.0,\n    1684 => 576.0,\n    1685 => 681.0,\n    1686 => 576.0,\n    1687 => 576.0,\n    1688 => 576.0,\n    1689 => 576.0,\n    1690 => 1380.0,\n    1691 => 1380.0,\n    1692 => 1380.0,\n    1693 => 1345.0,\n    1694 => 1345.0,\n    1695 => 1039.0,\n    1696 => 683.0,\n    1697 => 1162.0,\n    1698 => 1162.0,\n    1699 => 1162.0,\n    1700 => 1162.0,\n    1701 => 1162.0,\n    1702 => 1162.0,\n    1703 => 894.0,\n    1704 => 894.0,\n    1705 => 1024.0,\n    1706 => 1271.0,\n    1707 => 1024.0,\n    1708 => 917.0,\n    1709 => 917.0,\n    1710 => 917.0,\n    1711 => 1024.0,\n    1712 => 1024.0,\n    1713 => 1024.0,\n    1714 => 1024.0,\n    1715 => 1024.0,\n    1716 => 1024.0,\n    1717 => 868.0,\n    1718 => 868.0,\n    1719 => 868.0,\n    1720 => 868.0,\n    1721 => 854.0,\n    1722 => 854.0,\n    1723 => 854.0,\n    1724 => 854.0,\n    1725 => 854.0,\n    1726 => 938.0,\n    1727 => 721.0,\n    1734 => 622.0,\n    1735 => 622.0,\n    1736 => 622.0,\n    1739 => 622.0,\n    1740 => 917.0,\n    1742 => 917.0,\n    1744 => 917.0,\n    1749 => 590.0,\n    1776 => 610.0,\n    1777 => 610.0,\n    1778 => 610.0,\n    1779 => 610.0,\n    1780 => 610.0,\n    1781 => 610.0,\n    1782 => 610.0,\n    1783 => 610.0,\n    1784 => 610.0,\n    1785 => 610.0,\n    1984 => 696.0,\n    1985 => 696.0,\n    1986 => 696.0,\n    1987 => 696.0,\n    1988 => 696.0,\n    1989 => 696.0,\n    1990 => 696.0,\n    1991 => 696.0,\n    1992 => 696.0,\n    1993 => 696.0,\n    1994 => 343.0,\n    1995 => 547.0,\n    1996 => 543.0,\n    1997 => 652.0,\n    1998 => 691.0,\n    1999 => 691.0,\n    2000 => 594.0,\n    2001 => 691.0,\n    2002 => 904.0,\n    2003 => 551.0,\n    2004 => 551.0,\n    2005 => 627.0,\n    2006 => 688.0,\n    2007 => 444.0,\n    2008 => 1022.0,\n    2009 => 506.0,\n    2010 => 826.0,\n    2011 => 691.0,\n    2012 => 652.0,\n    2013 => 912.0,\n    2014 => 627.0,\n    2015 => 707.0,\n    2016 => 506.0,\n    2017 => 652.0,\n    2018 => 574.0,\n    2019 => 627.0,\n    2020 => 627.0,\n    2021 => 627.0,\n    2022 => 574.0,\n    2023 => 574.0,\n    2027 => 0.0,\n    2028 => 0.0,\n    2029 => 0.0,\n    2030 => 0.0,\n    2031 => 0.0,\n    2032 => 0.0,\n    2033 => 0.0,\n    2034 => 0.0,\n    2035 => 0.0,\n    2036 => 380.0,\n    2037 => 380.0,\n    2040 => 691.0,\n    2041 => 691.0,\n    2042 => 415.0,\n    3647 => 696.0,\n    3713 => 790.0,\n    3714 => 748.0,\n    3716 => 749.0,\n    3719 => 569.0,\n    3720 => 742.0,\n    3722 => 744.0,\n    3725 => 761.0,\n    3732 => 706.0,\n    3733 => 704.0,\n    3734 => 747.0,\n    3735 => 819.0,\n    3737 => 730.0,\n    3738 => 727.0,\n    3739 => 727.0,\n    3740 => 922.0,\n    3741 => 827.0,\n    3742 => 866.0,\n    3743 => 866.0,\n    3745 => 836.0,\n    3746 => 761.0,\n    3747 => 770.0,\n    3749 => 769.0,\n    3751 => 713.0,\n    3754 => 827.0,\n    3755 => 1031.0,\n    3757 => 724.0,\n    3758 => 784.0,\n    3759 => 934.0,\n    3760 => 688.0,\n    3761 => 0.0,\n    3762 => 610.0,\n    3763 => 610.0,\n    3764 => 0.0,\n    3765 => 0.0,\n    3766 => 0.0,\n    3767 => 0.0,\n    3768 => 0.0,\n    3769 => 0.0,\n    3771 => 0.0,\n    3772 => 0.0,\n    3773 => 670.0,\n    3776 => 516.0,\n    3777 => 860.0,\n    3778 => 516.0,\n    3779 => 650.0,\n    3780 => 632.0,\n    3782 => 759.0,\n    3784 => 0.0,\n    3785 => 0.0,\n    3786 => 0.0,\n    3787 => 0.0,\n    3788 => 0.0,\n    3789 => 0.0,\n    3792 => 771.0,\n    3793 => 771.0,\n    3794 => 693.0,\n    3795 => 836.0,\n    3796 => 729.0,\n    3797 => 729.0,\n    3798 => 849.0,\n    3799 => 790.0,\n    3800 => 759.0,\n    3801 => 910.0,\n    3804 => 1363.0,\n    3805 => 1363.0,\n    4256 => 874.0,\n    4257 => 733.0,\n    4258 => 679.0,\n    4259 => 834.0,\n    4260 => 615.0,\n    4261 => 768.0,\n    4262 => 753.0,\n    4263 => 914.0,\n    4264 => 453.0,\n    4265 => 620.0,\n    4266 => 843.0,\n    4267 => 882.0,\n    4268 => 625.0,\n    4269 => 854.0,\n    4270 => 781.0,\n    4271 => 629.0,\n    4272 => 912.0,\n    4273 => 621.0,\n    4274 => 620.0,\n    4275 => 854.0,\n    4276 => 866.0,\n    4277 => 724.0,\n    4278 => 630.0,\n    4279 => 621.0,\n    4280 => 625.0,\n    4281 => 620.0,\n    4282 => 818.0,\n    4283 => 874.0,\n    4284 => 615.0,\n    4285 => 623.0,\n    4286 => 625.0,\n    4287 => 725.0,\n    4288 => 844.0,\n    4289 => 596.0,\n    4290 => 688.0,\n    4291 => 596.0,\n    4292 => 594.0,\n    4293 => 738.0,\n    4304 => 554.0,\n    4305 => 563.0,\n    4306 => 622.0,\n    4307 => 834.0,\n    4308 => 555.0,\n    4309 => 564.0,\n    4310 => 551.0,\n    4311 => 828.0,\n    4312 => 563.0,\n    4313 => 556.0,\n    4314 => 1074.0,\n    4315 => 568.0,\n    4316 => 568.0,\n    4317 => 814.0,\n    4318 => 554.0,\n    4319 => 563.0,\n    4320 => 823.0,\n    4321 => 568.0,\n    4322 => 700.0,\n    4323 => 591.0,\n    4324 => 852.0,\n    4325 => 560.0,\n    4326 => 814.0,\n    4327 => 563.0,\n    4328 => 553.0,\n    4329 => 568.0,\n    4330 => 622.0,\n    4331 => 568.0,\n    4332 => 553.0,\n    4333 => 566.0,\n    4334 => 568.0,\n    4335 => 540.0,\n    4336 => 554.0,\n    4337 => 559.0,\n    4338 => 553.0,\n    4339 => 554.0,\n    4340 => 553.0,\n    4341 => 587.0,\n    4342 => 853.0,\n    4343 => 604.0,\n    4344 => 563.0,\n    4345 => 622.0,\n    4346 => 554.0,\n    4347 => 448.0,\n    4348 => 324.0,\n    5121 => 774.0,\n    5122 => 774.0,\n    5123 => 774.0,\n    5124 => 774.0,\n    5125 => 905.0,\n    5126 => 905.0,\n    5127 => 905.0,\n    5129 => 905.0,\n    5130 => 905.0,\n    5131 => 905.0,\n    5132 => 1018.0,\n    5133 => 1009.0,\n    5134 => 1018.0,\n    5135 => 1009.0,\n    5136 => 1018.0,\n    5137 => 1009.0,\n    5138 => 1149.0,\n    5139 => 1140.0,\n    5140 => 1149.0,\n    5141 => 1140.0,\n    5142 => 905.0,\n    5143 => 1149.0,\n    5144 => 1142.0,\n    5145 => 1149.0,\n    5146 => 1142.0,\n    5147 => 905.0,\n    5149 => 310.0,\n    5150 => 529.0,\n    5151 => 425.0,\n    5152 => 425.0,\n    5153 => 395.0,\n    5154 => 395.0,\n    5155 => 395.0,\n    5156 => 395.0,\n    5157 => 564.0,\n    5158 => 470.0,\n    5159 => 310.0,\n    5160 => 395.0,\n    5161 => 395.0,\n    5162 => 395.0,\n    5163 => 1213.0,\n    5164 => 986.0,\n    5165 => 1216.0,\n    5166 => 1297.0,\n    5167 => 774.0,\n    5168 => 774.0,\n    5169 => 774.0,\n    5170 => 774.0,\n    5171 => 886.0,\n    5172 => 886.0,\n    5173 => 886.0,\n    5175 => 886.0,\n    5176 => 886.0,\n    5177 => 886.0,\n    5178 => 1018.0,\n    5179 => 1009.0,\n    5180 => 1018.0,\n    5181 => 1009.0,\n    5182 => 1018.0,\n    5183 => 1009.0,\n    5184 => 1149.0,\n    5185 => 1140.0,\n    5186 => 1149.0,\n    5187 => 1140.0,\n    5188 => 1149.0,\n    5189 => 1142.0,\n    5190 => 1149.0,\n    5191 => 1142.0,\n    5192 => 886.0,\n    5193 => 576.0,\n    5194 => 229.0,\n    5196 => 812.0,\n    5197 => 812.0,\n    5198 => 812.0,\n    5199 => 812.0,\n    5200 => 815.0,\n    5201 => 815.0,\n    5202 => 815.0,\n    5204 => 815.0,\n    5205 => 815.0,\n    5206 => 815.0,\n    5207 => 1056.0,\n    5208 => 1048.0,\n    5209 => 1056.0,\n    5210 => 1048.0,\n    5211 => 1056.0,\n    5212 => 1048.0,\n    5213 => 1060.0,\n    5214 => 1054.0,\n    5215 => 1060.0,\n    5216 => 1054.0,\n    5217 => 1060.0,\n    5218 => 1052.0,\n    5219 => 1060.0,\n    5220 => 1052.0,\n    5221 => 1060.0,\n    5222 => 483.0,\n    5223 => 1005.0,\n    5224 => 1005.0,\n    5225 => 1023.0,\n    5226 => 1017.0,\n    5227 => 743.0,\n    5228 => 743.0,\n    5229 => 743.0,\n    5230 => 743.0,\n    5231 => 743.0,\n    5232 => 743.0,\n    5233 => 743.0,\n    5234 => 743.0,\n    5235 => 743.0,\n    5236 => 1029.0,\n    5237 => 975.0,\n    5238 => 980.0,\n    5239 => 975.0,\n    5240 => 980.0,\n    5241 => 975.0,\n    5242 => 1029.0,\n    5243 => 975.0,\n    5244 => 1029.0,\n    5245 => 975.0,\n    5246 => 980.0,\n    5247 => 975.0,\n    5248 => 980.0,\n    5249 => 975.0,\n    5250 => 980.0,\n    5251 => 501.0,\n    5252 => 501.0,\n    5253 => 938.0,\n    5254 => 938.0,\n    5255 => 938.0,\n    5256 => 938.0,\n    5257 => 743.0,\n    5258 => 743.0,\n    5259 => 743.0,\n    5260 => 743.0,\n    5261 => 743.0,\n    5262 => 743.0,\n    5263 => 743.0,\n    5264 => 743.0,\n    5265 => 743.0,\n    5266 => 1029.0,\n    5267 => 975.0,\n    5268 => 1029.0,\n    5269 => 975.0,\n    5270 => 1029.0,\n    5271 => 975.0,\n    5272 => 1029.0,\n    5273 => 975.0,\n    5274 => 1029.0,\n    5275 => 975.0,\n    5276 => 1029.0,\n    5277 => 975.0,\n    5278 => 1029.0,\n    5279 => 975.0,\n    5280 => 1029.0,\n    5281 => 501.0,\n    5282 => 501.0,\n    5283 => 626.0,\n    5284 => 626.0,\n    5285 => 626.0,\n    5286 => 626.0,\n    5287 => 626.0,\n    5288 => 626.0,\n    5289 => 626.0,\n    5290 => 626.0,\n    5291 => 626.0,\n    5292 => 881.0,\n    5293 => 854.0,\n    5294 => 863.0,\n    5295 => 874.0,\n    5296 => 863.0,\n    5297 => 874.0,\n    5298 => 881.0,\n    5299 => 874.0,\n    5300 => 881.0,\n    5301 => 874.0,\n    5302 => 863.0,\n    5303 => 874.0,\n    5304 => 863.0,\n    5305 => 874.0,\n    5306 => 863.0,\n    5307 => 436.0,\n    5308 => 548.0,\n    5309 => 436.0,\n    5312 => 988.0,\n    5313 => 988.0,\n    5314 => 988.0,\n    5315 => 988.0,\n    5316 => 931.0,\n    5317 => 931.0,\n    5318 => 931.0,\n    5319 => 931.0,\n    5320 => 931.0,\n    5321 => 1238.0,\n    5322 => 1247.0,\n    5323 => 1200.0,\n    5324 => 1228.0,\n    5325 => 1200.0,\n    5326 => 1228.0,\n    5327 => 931.0,\n    5328 => 660.0,\n    5329 => 497.0,\n    5330 => 660.0,\n    5331 => 988.0,\n    5332 => 988.0,\n    5333 => 988.0,\n    5334 => 988.0,\n    5335 => 931.0,\n    5336 => 931.0,\n    5337 => 931.0,\n    5338 => 931.0,\n    5339 => 931.0,\n    5340 => 1231.0,\n    5341 => 1247.0,\n    5342 => 1283.0,\n    5343 => 1228.0,\n    5344 => 1283.0,\n    5345 => 1228.0,\n    5346 => 1228.0,\n    5347 => 1214.0,\n    5348 => 1228.0,\n    5349 => 1214.0,\n    5350 => 1283.0,\n    5351 => 1228.0,\n    5352 => 1283.0,\n    5353 => 1228.0,\n    5354 => 660.0,\n    5356 => 886.0,\n    5357 => 730.0,\n    5358 => 730.0,\n    5359 => 730.0,\n    5360 => 730.0,\n    5361 => 730.0,\n    5362 => 730.0,\n    5363 => 730.0,\n    5364 => 730.0,\n    5365 => 730.0,\n    5366 => 998.0,\n    5367 => 958.0,\n    5368 => 967.0,\n    5369 => 989.0,\n    5370 => 967.0,\n    5371 => 989.0,\n    5372 => 998.0,\n    5373 => 958.0,\n    5374 => 998.0,\n    5375 => 958.0,\n    5376 => 967.0,\n    5377 => 989.0,\n    5378 => 967.0,\n    5379 => 989.0,\n    5380 => 967.0,\n    5381 => 493.0,\n    5382 => 460.0,\n    5383 => 493.0,\n    5392 => 923.0,\n    5393 => 923.0,\n    5394 => 923.0,\n    5395 => 1136.0,\n    5396 => 1136.0,\n    5397 => 1136.0,\n    5398 => 1136.0,\n    5399 => 1209.0,\n    5400 => 1202.0,\n    5401 => 1209.0,\n    5402 => 1202.0,\n    5403 => 1209.0,\n    5404 => 1202.0,\n    5405 => 1431.0,\n    5406 => 1420.0,\n    5407 => 1431.0,\n    5408 => 1420.0,\n    5409 => 1431.0,\n    5410 => 1420.0,\n    5411 => 1431.0,\n    5412 => 1420.0,\n    5413 => 746.0,\n    5414 => 776.0,\n    5415 => 776.0,\n    5416 => 776.0,\n    5417 => 776.0,\n    5418 => 776.0,\n    5419 => 776.0,\n    5420 => 776.0,\n    5421 => 776.0,\n    5422 => 776.0,\n    5423 => 1003.0,\n    5424 => 1003.0,\n    5425 => 1013.0,\n    5426 => 996.0,\n    5427 => 1013.0,\n    5428 => 996.0,\n    5429 => 1003.0,\n    5430 => 1003.0,\n    5431 => 1003.0,\n    5432 => 1003.0,\n    5433 => 1013.0,\n    5434 => 996.0,\n    5435 => 1013.0,\n    5436 => 996.0,\n    5437 => 1013.0,\n    5438 => 495.0,\n    5440 => 395.0,\n    5441 => 510.0,\n    5442 => 1033.0,\n    5443 => 1033.0,\n    5444 => 976.0,\n    5445 => 976.0,\n    5446 => 976.0,\n    5447 => 976.0,\n    5448 => 733.0,\n    5449 => 733.0,\n    5450 => 733.0,\n    5451 => 733.0,\n    5452 => 733.0,\n    5453 => 733.0,\n    5454 => 1003.0,\n    5455 => 959.0,\n    5456 => 495.0,\n    5458 => 886.0,\n    5459 => 774.0,\n    5460 => 774.0,\n    5461 => 774.0,\n    5462 => 774.0,\n    5463 => 928.0,\n    5464 => 928.0,\n    5465 => 928.0,\n    5466 => 928.0,\n    5467 => 1172.0,\n    5468 => 1142.0,\n    5469 => 602.0,\n    5470 => 812.0,\n    5471 => 812.0,\n    5472 => 812.0,\n    5473 => 812.0,\n    5474 => 812.0,\n    5475 => 812.0,\n    5476 => 815.0,\n    5477 => 815.0,\n    5478 => 815.0,\n    5479 => 815.0,\n    5480 => 1060.0,\n    5481 => 1052.0,\n    5482 => 548.0,\n    5492 => 977.0,\n    5493 => 977.0,\n    5494 => 977.0,\n    5495 => 977.0,\n    5496 => 977.0,\n    5497 => 977.0,\n    5498 => 977.0,\n    5499 => 618.0,\n    5500 => 837.0,\n    5501 => 510.0,\n    5502 => 1238.0,\n    5503 => 1238.0,\n    5504 => 1238.0,\n    5505 => 1238.0,\n    5506 => 1238.0,\n    5507 => 1238.0,\n    5508 => 1238.0,\n    5509 => 989.0,\n    5514 => 977.0,\n    5515 => 977.0,\n    5516 => 977.0,\n    5517 => 977.0,\n    5518 => 1591.0,\n    5519 => 1591.0,\n    5520 => 1591.0,\n    5521 => 1295.0,\n    5522 => 1295.0,\n    5523 => 1591.0,\n    5524 => 1591.0,\n    5525 => 848.0,\n    5526 => 1273.0,\n    5536 => 988.0,\n    5537 => 988.0,\n    5538 => 931.0,\n    5539 => 931.0,\n    5540 => 931.0,\n    5541 => 931.0,\n    5542 => 660.0,\n    5543 => 776.0,\n    5544 => 776.0,\n    5545 => 776.0,\n    5546 => 776.0,\n    5547 => 776.0,\n    5548 => 776.0,\n    5549 => 776.0,\n    5550 => 495.0,\n    5551 => 743.0,\n    5598 => 830.0,\n    5601 => 830.0,\n    5702 => 496.0,\n    5703 => 496.0,\n    5742 => 413.0,\n    5743 => 1238.0,\n    5744 => 1591.0,\n    5745 => 2016.0,\n    5746 => 2016.0,\n    5747 => 1720.0,\n    5748 => 1678.0,\n    5749 => 2016.0,\n    5750 => 2016.0,\n    5760 => 543.0,\n    5761 => 637.0,\n    5762 => 945.0,\n    5763 => 1254.0,\n    5764 => 1563.0,\n    5765 => 1871.0,\n    5766 => 627.0,\n    5767 => 936.0,\n    5768 => 1254.0,\n    5769 => 1559.0,\n    5770 => 1871.0,\n    5771 => 569.0,\n    5772 => 877.0,\n    5773 => 1187.0,\n    5774 => 1497.0,\n    5775 => 1807.0,\n    5776 => 637.0,\n    5777 => 945.0,\n    5778 => 1240.0,\n    5779 => 1555.0,\n    5780 => 1871.0,\n    5781 => 569.0,\n    5782 => 569.0,\n    5783 => 789.0,\n    5784 => 1234.0,\n    5785 => 1559.0,\n    5786 => 740.0,\n    5787 => 638.0,\n    5788 => 638.0,\n    7424 => 652.0,\n    7425 => 833.0,\n    7426 => 1048.0,\n    7427 => 608.0,\n    7428 => 593.0,\n    7429 => 676.0,\n    7430 => 676.0,\n    7431 => 559.0,\n    7432 => 557.0,\n    7433 => 343.0,\n    7434 => 494.0,\n    7435 => 665.0,\n    7436 => 539.0,\n    7437 => 817.0,\n    7438 => 701.0,\n    7439 => 687.0,\n    7440 => 593.0,\n    7441 => 660.0,\n    7442 => 660.0,\n    7443 => 660.0,\n    7444 => 1094.0,\n    7446 => 687.0,\n    7447 => 687.0,\n    7448 => 556.0,\n    7449 => 642.0,\n    7450 => 642.0,\n    7451 => 580.0,\n    7452 => 634.0,\n    7453 => 737.0,\n    7454 => 948.0,\n    7455 => 695.0,\n    7456 => 652.0,\n    7457 => 924.0,\n    7458 => 582.0,\n    7459 => 646.0,\n    7462 => 539.0,\n    7463 => 652.0,\n    7464 => 691.0,\n    7465 => 556.0,\n    7466 => 781.0,\n    7467 => 732.0,\n    7468 => 487.0,\n    7469 => 683.0,\n    7470 => 480.0,\n    7472 => 523.0,\n    7473 => 430.0,\n    7474 => 430.0,\n    7475 => 517.0,\n    7476 => 527.0,\n    7477 => 234.0,\n    7478 => 234.0,\n    7479 => 488.0,\n    7480 => 401.0,\n    7481 => 626.0,\n    7482 => 527.0,\n    7483 => 527.0,\n    7484 => 535.0,\n    7485 => 509.0,\n    7486 => 461.0,\n    7487 => 485.0,\n    7488 => 430.0,\n    7489 => 511.0,\n    7490 => 695.0,\n    7491 => 458.0,\n    7492 => 458.0,\n    7493 => 479.0,\n    7494 => 712.0,\n    7495 => 479.0,\n    7496 => 479.0,\n    7497 => 479.0,\n    7498 => 479.0,\n    7499 => 386.0,\n    7500 => 386.0,\n    7501 => 479.0,\n    7502 => 219.0,\n    7503 => 487.0,\n    7504 => 664.0,\n    7505 => 456.0,\n    7506 => 488.0,\n    7507 => 414.0,\n    7508 => 488.0,\n    7509 => 488.0,\n    7510 => 479.0,\n    7511 => 388.0,\n    7512 => 456.0,\n    7513 => 462.0,\n    7514 => 664.0,\n    7515 => 501.0,\n    7517 => 451.0,\n    7518 => 429.0,\n    7519 => 433.0,\n    7520 => 493.0,\n    7521 => 406.0,\n    7522 => 219.0,\n    7523 => 315.0,\n    7524 => 456.0,\n    7525 => 501.0,\n    7526 => 451.0,\n    7527 => 429.0,\n    7528 => 451.0,\n    7529 => 493.0,\n    7530 => 406.0,\n    7543 => 716.0,\n    7544 => 527.0,\n    7547 => 545.0,\n    7549 => 747.0,\n    7557 => 514.0,\n    7579 => 479.0,\n    7580 => 414.0,\n    7581 => 414.0,\n    7582 => 488.0,\n    7583 => 386.0,\n    7584 => 377.0,\n    7585 => 348.0,\n    7586 => 479.0,\n    7587 => 456.0,\n    7588 => 347.0,\n    7589 => 281.0,\n    7590 => 347.0,\n    7591 => 347.0,\n    7592 => 431.0,\n    7593 => 326.0,\n    7594 => 330.0,\n    7595 => 370.0,\n    7596 => 664.0,\n    7597 => 664.0,\n    7598 => 562.0,\n    7599 => 562.0,\n    7600 => 448.0,\n    7601 => 488.0,\n    7602 => 542.0,\n    7603 => 422.0,\n    7604 => 396.0,\n    7605 => 388.0,\n    7606 => 583.0,\n    7607 => 494.0,\n    7608 => 399.0,\n    7609 => 451.0,\n    7610 => 501.0,\n    7611 => 417.0,\n    7612 => 523.0,\n    7613 => 470.0,\n    7614 => 455.0,\n    7615 => 425.0,\n    7620 => 0.0,\n    7621 => 0.0,\n    7622 => 0.0,\n    7623 => 0.0,\n    7624 => 0.0,\n    7625 => 0.0,\n    7680 => 774.0,\n    7681 => 675.0,\n    7682 => 762.0,\n    7683 => 716.0,\n    7684 => 762.0,\n    7685 => 716.0,\n    7686 => 762.0,\n    7687 => 716.0,\n    7688 => 734.0,\n    7689 => 593.0,\n    7690 => 830.0,\n    7691 => 716.0,\n    7692 => 830.0,\n    7693 => 716.0,\n    7694 => 830.0,\n    7695 => 716.0,\n    7696 => 830.0,\n    7697 => 716.0,\n    7698 => 830.0,\n    7699 => 716.0,\n    7700 => 683.0,\n    7701 => 678.0,\n    7702 => 683.0,\n    7703 => 678.0,\n    7704 => 683.0,\n    7705 => 678.0,\n    7706 => 683.0,\n    7707 => 678.0,\n    7708 => 683.0,\n    7709 => 678.0,\n    7710 => 683.0,\n    7711 => 435.0,\n    7712 => 821.0,\n    7713 => 716.0,\n    7714 => 837.0,\n    7715 => 712.0,\n    7716 => 837.0,\n    7717 => 712.0,\n    7718 => 837.0,\n    7719 => 712.0,\n    7720 => 837.0,\n    7721 => 712.0,\n    7722 => 837.0,\n    7723 => 712.0,\n    7724 => 372.0,\n    7725 => 343.0,\n    7726 => 372.0,\n    7727 => 343.0,\n    7728 => 775.0,\n    7729 => 665.0,\n    7730 => 775.0,\n    7731 => 665.0,\n    7732 => 775.0,\n    7733 => 665.0,\n    7734 => 637.0,\n    7735 => 343.0,\n    7736 => 637.0,\n    7737 => 343.0,\n    7738 => 637.0,\n    7739 => 343.0,\n    7740 => 637.0,\n    7741 => 343.0,\n    7742 => 995.0,\n    7743 => 1042.0,\n    7744 => 995.0,\n    7745 => 1042.0,\n    7746 => 995.0,\n    7747 => 1042.0,\n    7748 => 837.0,\n    7749 => 712.0,\n    7750 => 837.0,\n    7751 => 712.0,\n    7752 => 837.0,\n    7753 => 712.0,\n    7754 => 837.0,\n    7755 => 712.0,\n    7756 => 850.0,\n    7757 => 687.0,\n    7758 => 850.0,\n    7759 => 687.0,\n    7760 => 850.0,\n    7761 => 687.0,\n    7762 => 850.0,\n    7763 => 687.0,\n    7764 => 733.0,\n    7765 => 716.0,\n    7766 => 733.0,\n    7767 => 716.0,\n    7768 => 770.0,\n    7769 => 493.0,\n    7770 => 770.0,\n    7771 => 493.0,\n    7772 => 770.0,\n    7773 => 493.0,\n    7774 => 770.0,\n    7775 => 493.0,\n    7776 => 720.0,\n    7777 => 595.0,\n    7778 => 720.0,\n    7779 => 595.0,\n    7780 => 720.0,\n    7781 => 595.0,\n    7782 => 720.0,\n    7783 => 595.0,\n    7784 => 720.0,\n    7785 => 595.0,\n    7786 => 682.0,\n    7787 => 478.0,\n    7788 => 682.0,\n    7789 => 478.0,\n    7790 => 682.0,\n    7791 => 478.0,\n    7792 => 682.0,\n    7793 => 478.0,\n    7794 => 812.0,\n    7795 => 712.0,\n    7796 => 812.0,\n    7797 => 712.0,\n    7798 => 812.0,\n    7799 => 712.0,\n    7800 => 812.0,\n    7801 => 712.0,\n    7802 => 812.0,\n    7803 => 712.0,\n    7804 => 774.0,\n    7805 => 652.0,\n    7806 => 774.0,\n    7807 => 652.0,\n    7808 => 1103.0,\n    7809 => 924.0,\n    7810 => 1103.0,\n    7811 => 924.0,\n    7812 => 1103.0,\n    7813 => 924.0,\n    7814 => 1103.0,\n    7815 => 924.0,\n    7816 => 1103.0,\n    7817 => 924.0,\n    7818 => 771.0,\n    7819 => 645.0,\n    7820 => 771.0,\n    7821 => 645.0,\n    7822 => 724.0,\n    7823 => 652.0,\n    7824 => 725.0,\n    7825 => 582.0,\n    7826 => 725.0,\n    7827 => 582.0,\n    7828 => 725.0,\n    7829 => 582.0,\n    7830 => 712.0,\n    7831 => 478.0,\n    7832 => 924.0,\n    7833 => 652.0,\n    7834 => 675.0,\n    7835 => 435.0,\n    7836 => 435.0,\n    7837 => 435.0,\n    7838 => 896.0,\n    7839 => 687.0,\n    7840 => 774.0,\n    7841 => 675.0,\n    7842 => 774.0,\n    7843 => 675.0,\n    7844 => 774.0,\n    7845 => 675.0,\n    7846 => 774.0,\n    7847 => 675.0,\n    7848 => 774.0,\n    7849 => 675.0,\n    7850 => 774.0,\n    7851 => 675.0,\n    7852 => 774.0,\n    7853 => 675.0,\n    7854 => 774.0,\n    7855 => 675.0,\n    7856 => 774.0,\n    7857 => 675.0,\n    7858 => 774.0,\n    7859 => 675.0,\n    7860 => 774.0,\n    7861 => 675.0,\n    7862 => 774.0,\n    7863 => 675.0,\n    7864 => 683.0,\n    7865 => 678.0,\n    7866 => 683.0,\n    7867 => 678.0,\n    7868 => 683.0,\n    7869 => 678.0,\n    7870 => 683.0,\n    7871 => 678.0,\n    7872 => 683.0,\n    7873 => 678.0,\n    7874 => 683.0,\n    7875 => 678.0,\n    7876 => 683.0,\n    7877 => 678.0,\n    7878 => 683.0,\n    7879 => 678.0,\n    7880 => 372.0,\n    7881 => 343.0,\n    7882 => 372.0,\n    7883 => 343.0,\n    7884 => 850.0,\n    7885 => 687.0,\n    7886 => 850.0,\n    7887 => 687.0,\n    7888 => 850.0,\n    7889 => 687.0,\n    7890 => 850.0,\n    7891 => 687.0,\n    7892 => 850.0,\n    7893 => 687.0,\n    7894 => 850.0,\n    7895 => 687.0,\n    7896 => 850.0,\n    7897 => 687.0,\n    7898 => 874.0,\n    7899 => 687.0,\n    7900 => 874.0,\n    7901 => 687.0,\n    7902 => 874.0,\n    7903 => 687.0,\n    7904 => 874.0,\n    7905 => 687.0,\n    7906 => 874.0,\n    7907 => 687.0,\n    7908 => 812.0,\n    7909 => 712.0,\n    7910 => 812.0,\n    7911 => 712.0,\n    7912 => 835.0,\n    7913 => 712.0,\n    7914 => 835.0,\n    7915 => 712.0,\n    7916 => 835.0,\n    7917 => 712.0,\n    7918 => 835.0,\n    7919 => 712.0,\n    7920 => 835.0,\n    7921 => 712.0,\n    7922 => 724.0,\n    7923 => 652.0,\n    7924 => 724.0,\n    7925 => 652.0,\n    7926 => 724.0,\n    7927 => 652.0,\n    7928 => 724.0,\n    7929 => 652.0,\n    7930 => 953.0,\n    7931 => 644.0,\n    7936 => 687.0,\n    7937 => 687.0,\n    7938 => 687.0,\n    7939 => 687.0,\n    7940 => 687.0,\n    7941 => 687.0,\n    7942 => 687.0,\n    7943 => 687.0,\n    7944 => 774.0,\n    7945 => 774.0,\n    7946 => 1041.0,\n    7947 => 1043.0,\n    7948 => 935.0,\n    7949 => 963.0,\n    7950 => 835.0,\n    7951 => 859.0,\n    7952 => 557.0,\n    7953 => 557.0,\n    7954 => 557.0,\n    7955 => 557.0,\n    7956 => 557.0,\n    7957 => 557.0,\n    7960 => 792.0,\n    7961 => 794.0,\n    7962 => 1100.0,\n    7963 => 1096.0,\n    7964 => 1023.0,\n    7965 => 1052.0,\n    7968 => 712.0,\n    7969 => 712.0,\n    7970 => 712.0,\n    7971 => 712.0,\n    7972 => 712.0,\n    7973 => 712.0,\n    7974 => 712.0,\n    7975 => 712.0,\n    7976 => 945.0,\n    7977 => 951.0,\n    7978 => 1250.0,\n    7979 => 1250.0,\n    7980 => 1180.0,\n    7981 => 1206.0,\n    7982 => 1054.0,\n    7983 => 1063.0,\n    7984 => 390.0,\n    7985 => 390.0,\n    7986 => 390.0,\n    7987 => 390.0,\n    7988 => 390.0,\n    7989 => 390.0,\n    7990 => 390.0,\n    7991 => 390.0,\n    7992 => 483.0,\n    7993 => 489.0,\n    7994 => 777.0,\n    7995 => 785.0,\n    7996 => 712.0,\n    7997 => 738.0,\n    7998 => 604.0,\n    7999 => 604.0,\n    8000 => 687.0,\n    8001 => 687.0,\n    8002 => 687.0,\n    8003 => 687.0,\n    8004 => 687.0,\n    8005 => 687.0,\n    8008 => 892.0,\n    8009 => 933.0,\n    8010 => 1221.0,\n    8011 => 1224.0,\n    8012 => 1053.0,\n    8013 => 1082.0,\n    8016 => 675.0,\n    8017 => 675.0,\n    8018 => 675.0,\n    8019 => 675.0,\n    8020 => 675.0,\n    8021 => 675.0,\n    8022 => 675.0,\n    8023 => 675.0,\n    8025 => 930.0,\n    8027 => 1184.0,\n    8029 => 1199.0,\n    8031 => 1049.0,\n    8032 => 869.0,\n    8033 => 869.0,\n    8034 => 869.0,\n    8035 => 869.0,\n    8036 => 869.0,\n    8037 => 869.0,\n    8038 => 869.0,\n    8039 => 869.0,\n    8040 => 909.0,\n    8041 => 958.0,\n    8042 => 1246.0,\n    8043 => 1251.0,\n    8044 => 1076.0,\n    8045 => 1105.0,\n    8046 => 1028.0,\n    8047 => 1076.0,\n    8048 => 687.0,\n    8049 => 687.0,\n    8050 => 557.0,\n    8051 => 557.0,\n    8052 => 712.0,\n    8053 => 712.0,\n    8054 => 390.0,\n    8055 => 390.0,\n    8056 => 687.0,\n    8057 => 687.0,\n    8058 => 675.0,\n    8059 => 675.0,\n    8060 => 869.0,\n    8061 => 869.0,\n    8064 => 687.0,\n    8065 => 687.0,\n    8066 => 687.0,\n    8067 => 687.0,\n    8068 => 687.0,\n    8069 => 687.0,\n    8070 => 687.0,\n    8071 => 687.0,\n    8072 => 774.0,\n    8073 => 774.0,\n    8074 => 1041.0,\n    8075 => 1043.0,\n    8076 => 935.0,\n    8077 => 963.0,\n    8078 => 835.0,\n    8079 => 859.0,\n    8080 => 712.0,\n    8081 => 712.0,\n    8082 => 712.0,\n    8083 => 712.0,\n    8084 => 712.0,\n    8085 => 712.0,\n    8086 => 712.0,\n    8087 => 712.0,\n    8088 => 945.0,\n    8089 => 951.0,\n    8090 => 1250.0,\n    8091 => 1250.0,\n    8092 => 1180.0,\n    8093 => 1206.0,\n    8094 => 1054.0,\n    8095 => 1063.0,\n    8096 => 869.0,\n    8097 => 869.0,\n    8098 => 869.0,\n    8099 => 869.0,\n    8100 => 869.0,\n    8101 => 869.0,\n    8102 => 869.0,\n    8103 => 869.0,\n    8104 => 909.0,\n    8105 => 958.0,\n    8106 => 1246.0,\n    8107 => 1251.0,\n    8108 => 1076.0,\n    8109 => 1105.0,\n    8110 => 1028.0,\n    8111 => 1076.0,\n    8112 => 687.0,\n    8113 => 687.0,\n    8114 => 687.0,\n    8115 => 687.0,\n    8116 => 687.0,\n    8118 => 687.0,\n    8119 => 687.0,\n    8120 => 774.0,\n    8121 => 774.0,\n    8122 => 876.0,\n    8123 => 797.0,\n    8124 => 774.0,\n    8125 => 500.0,\n    8126 => 500.0,\n    8127 => 500.0,\n    8128 => 500.0,\n    8129 => 500.0,\n    8130 => 712.0,\n    8131 => 712.0,\n    8132 => 712.0,\n    8134 => 712.0,\n    8135 => 712.0,\n    8136 => 929.0,\n    8137 => 846.0,\n    8138 => 1080.0,\n    8139 => 1009.0,\n    8140 => 837.0,\n    8141 => 500.0,\n    8142 => 500.0,\n    8143 => 500.0,\n    8144 => 390.0,\n    8145 => 390.0,\n    8146 => 390.0,\n    8147 => 390.0,\n    8150 => 390.0,\n    8151 => 390.0,\n    8152 => 372.0,\n    8153 => 372.0,\n    8154 => 621.0,\n    8155 => 563.0,\n    8157 => 500.0,\n    8158 => 500.0,\n    8159 => 500.0,\n    8160 => 675.0,\n    8161 => 675.0,\n    8162 => 675.0,\n    8163 => 675.0,\n    8164 => 716.0,\n    8165 => 716.0,\n    8166 => 675.0,\n    8167 => 675.0,\n    8168 => 724.0,\n    8169 => 724.0,\n    8170 => 1020.0,\n    8171 => 980.0,\n    8172 => 838.0,\n    8173 => 500.0,\n    8174 => 500.0,\n    8175 => 500.0,\n    8178 => 869.0,\n    8179 => 869.0,\n    8180 => 869.0,\n    8182 => 869.0,\n    8183 => 869.0,\n    8184 => 1065.0,\n    8185 => 891.0,\n    8186 => 1084.0,\n    8187 => 894.0,\n    8188 => 850.0,\n    8189 => 500.0,\n    8190 => 500.0,\n    8192 => 500.0,\n    8193 => 1000.0,\n    8194 => 500.0,\n    8195 => 1000.0,\n    8196 => 330.0,\n    8197 => 250.0,\n    8198 => 167.0,\n    8199 => 696.0,\n    8200 => 380.0,\n    8201 => 200.0,\n    8202 => 100.0,\n    8203 => 0.0,\n    8204 => 0.0,\n    8205 => 0.0,\n    8206 => 0.0,\n    8207 => 0.0,\n    8208 => 415.0,\n    8209 => 415.0,\n    8210 => 696.0,\n    8211 => 500.0,\n    8212 => 1000.0,\n    8213 => 1000.0,\n    8214 => 500.0,\n    8215 => 500.0,\n    8216 => 380.0,\n    8217 => 380.0,\n    8218 => 380.0,\n    8219 => 380.0,\n    8220 => 657.0,\n    8221 => 657.0,\n    8222 => 657.0,\n    8223 => 657.0,\n    8224 => 500.0,\n    8225 => 500.0,\n    8226 => 639.0,\n    8227 => 639.0,\n    8228 => 333.0,\n    8229 => 667.0,\n    8230 => 1000.0,\n    8231 => 348.0,\n    8232 => 0.0,\n    8233 => 0.0,\n    8234 => 0.0,\n    8235 => 0.0,\n    8236 => 0.0,\n    8237 => 0.0,\n    8238 => 0.0,\n    8239 => 200.0,\n    8240 => 1440.0,\n    8241 => 1887.0,\n    8242 => 264.0,\n    8243 => 447.0,\n    8244 => 630.0,\n    8245 => 264.0,\n    8246 => 447.0,\n    8247 => 630.0,\n    8248 => 733.0,\n    8249 => 412.0,\n    8250 => 412.0,\n    8251 => 972.0,\n    8252 => 627.0,\n    8253 => 580.0,\n    8254 => 500.0,\n    8255 => 828.0,\n    8256 => 828.0,\n    8257 => 329.0,\n    8258 => 1023.0,\n    8259 => 500.0,\n    8260 => 167.0,\n    8261 => 457.0,\n    8262 => 457.0,\n    8263 => 1030.0,\n    8264 => 829.0,\n    8265 => 829.0,\n    8266 => 513.0,\n    8267 => 636.0,\n    8268 => 500.0,\n    8269 => 500.0,\n    8270 => 523.0,\n    8271 => 400.0,\n    8272 => 828.0,\n    8273 => 523.0,\n    8274 => 556.0,\n    8275 => 1000.0,\n    8276 => 828.0,\n    8277 => 838.0,\n    8278 => 684.0,\n    8279 => 813.0,\n    8280 => 838.0,\n    8281 => 838.0,\n    8282 => 380.0,\n    8283 => 872.0,\n    8284 => 838.0,\n    8285 => 380.0,\n    8286 => 380.0,\n    8287 => 222.0,\n    8288 => 0.0,\n    8289 => 0.0,\n    8290 => 0.0,\n    8291 => 0.0,\n    8292 => 0.0,\n    8298 => 0.0,\n    8299 => 0.0,\n    8300 => 0.0,\n    8301 => 0.0,\n    8302 => 0.0,\n    8303 => 0.0,\n    8304 => 438.0,\n    8305 => 219.0,\n    8308 => 438.0,\n    8309 => 438.0,\n    8310 => 438.0,\n    8311 => 438.0,\n    8312 => 438.0,\n    8313 => 438.0,\n    8314 => 528.0,\n    8315 => 528.0,\n    8316 => 528.0,\n    8317 => 288.0,\n    8318 => 288.0,\n    8319 => 456.0,\n    8320 => 438.0,\n    8321 => 438.0,\n    8322 => 438.0,\n    8323 => 438.0,\n    8324 => 438.0,\n    8325 => 438.0,\n    8326 => 438.0,\n    8327 => 438.0,\n    8328 => 438.0,\n    8329 => 438.0,\n    8330 => 528.0,\n    8331 => 528.0,\n    8332 => 528.0,\n    8333 => 288.0,\n    8334 => 288.0,\n    8336 => 458.0,\n    8337 => 479.0,\n    8338 => 488.0,\n    8339 => 413.0,\n    8340 => 479.0,\n    8341 => 456.0,\n    8342 => 487.0,\n    8343 => 219.0,\n    8344 => 664.0,\n    8345 => 456.0,\n    8346 => 479.0,\n    8347 => 381.0,\n    8348 => 388.0,\n    8352 => 929.0,\n    8353 => 696.0,\n    8354 => 696.0,\n    8355 => 696.0,\n    8356 => 696.0,\n    8357 => 1042.0,\n    8358 => 696.0,\n    8359 => 1518.0,\n    8360 => 1205.0,\n    8361 => 1103.0,\n    8362 => 904.0,\n    8363 => 696.0,\n    8364 => 696.0,\n    8365 => 696.0,\n    8366 => 696.0,\n    8367 => 1392.0,\n    8368 => 696.0,\n    8369 => 696.0,\n    8370 => 696.0,\n    8371 => 696.0,\n    8372 => 859.0,\n    8373 => 696.0,\n    8376 => 696.0,\n    8377 => 696.0,\n    8378 => 696.0,\n    8381 => 696.0,\n    8400 => 0.0,\n    8401 => 0.0,\n    8406 => 0.0,\n    8407 => 0.0,\n    8411 => 0.0,\n    8412 => 0.0,\n    8417 => 0.0,\n    8448 => 1120.0,\n    8449 => 1170.0,\n    8450 => 734.0,\n    8451 => 1211.0,\n    8452 => 896.0,\n    8453 => 1091.0,\n    8454 => 1144.0,\n    8455 => 614.0,\n    8456 => 698.0,\n    8457 => 1086.0,\n    8459 => 1073.0,\n    8460 => 913.0,\n    8461 => 888.0,\n    8462 => 712.0,\n    8463 => 712.0,\n    8464 => 597.0,\n    8465 => 697.0,\n    8466 => 856.0,\n    8467 => 472.0,\n    8468 => 974.0,\n    8469 => 837.0,\n    8470 => 1203.0,\n    8471 => 1000.0,\n    8472 => 697.0,\n    8473 => 750.0,\n    8474 => 850.0,\n    8475 => 938.0,\n    8476 => 814.0,\n    8477 => 801.0,\n    8478 => 896.0,\n    8479 => 710.0,\n    8480 => 1020.0,\n    8481 => 1281.0,\n    8482 => 1000.0,\n    8483 => 755.0,\n    8484 => 754.0,\n    8485 => 578.0,\n    8486 => 850.0,\n    8487 => 850.0,\n    8488 => 763.0,\n    8489 => 338.0,\n    8490 => 775.0,\n    8491 => 774.0,\n    8492 => 928.0,\n    8493 => 818.0,\n    8494 => 854.0,\n    8495 => 636.0,\n    8496 => 729.0,\n    8497 => 808.0,\n    8498 => 683.0,\n    8499 => 1184.0,\n    8500 => 465.0,\n    8501 => 794.0,\n    8502 => 731.0,\n    8503 => 494.0,\n    8504 => 684.0,\n    8505 => 380.0,\n    8506 => 945.0,\n    8507 => 1348.0,\n    8508 => 790.0,\n    8509 => 737.0,\n    8510 => 654.0,\n    8511 => 863.0,\n    8512 => 840.0,\n    8513 => 775.0,\n    8514 => 557.0,\n    8515 => 637.0,\n    8516 => 760.0,\n    8517 => 830.0,\n    8518 => 716.0,\n    8519 => 678.0,\n    8520 => 343.0,\n    8521 => 343.0,\n    8523 => 872.0,\n    8526 => 547.0,\n    8528 => 1035.0,\n    8529 => 1035.0,\n    8530 => 1483.0,\n    8531 => 1035.0,\n    8532 => 1035.0,\n    8533 => 1035.0,\n    8534 => 1035.0,\n    8535 => 1035.0,\n    8536 => 1035.0,\n    8537 => 1035.0,\n    8538 => 1035.0,\n    8539 => 1035.0,\n    8540 => 1035.0,\n    8541 => 1035.0,\n    8542 => 1035.0,\n    8543 => 615.0,\n    8544 => 372.0,\n    8545 => 659.0,\n    8546 => 945.0,\n    8547 => 1099.0,\n    8548 => 774.0,\n    8549 => 1099.0,\n    8550 => 1386.0,\n    8551 => 1672.0,\n    8552 => 1121.0,\n    8553 => 771.0,\n    8554 => 1120.0,\n    8555 => 1407.0,\n    8556 => 637.0,\n    8557 => 734.0,\n    8558 => 830.0,\n    8559 => 995.0,\n    8560 => 343.0,\n    8561 => 607.0,\n    8562 => 872.0,\n    8563 => 984.0,\n    8564 => 652.0,\n    8565 => 962.0,\n    8566 => 1227.0,\n    8567 => 1491.0,\n    8568 => 969.0,\n    8569 => 645.0,\n    8570 => 969.0,\n    8571 => 1233.0,\n    8572 => 343.0,\n    8573 => 593.0,\n    8574 => 716.0,\n    8575 => 1042.0,\n    8576 => 1289.0,\n    8577 => 830.0,\n    8578 => 1289.0,\n    8579 => 734.0,\n    8580 => 593.0,\n    8581 => 734.0,\n    8585 => 1035.0,\n    8592 => 838.0,\n    8593 => 838.0,\n    8594 => 838.0,\n    8595 => 838.0,\n    8596 => 838.0,\n    8597 => 838.0,\n    8598 => 838.0,\n    8599 => 838.0,\n    8600 => 838.0,\n    8601 => 838.0,\n    8602 => 838.0,\n    8603 => 838.0,\n    8604 => 838.0,\n    8605 => 838.0,\n    8606 => 838.0,\n    8607 => 838.0,\n    8608 => 838.0,\n    8609 => 838.0,\n    8610 => 838.0,\n    8611 => 838.0,\n    8612 => 838.0,\n    8613 => 838.0,\n    8614 => 838.0,\n    8615 => 838.0,\n    8616 => 838.0,\n    8617 => 838.0,\n    8618 => 838.0,\n    8619 => 838.0,\n    8620 => 838.0,\n    8621 => 838.0,\n    8622 => 838.0,\n    8623 => 838.0,\n    8624 => 838.0,\n    8625 => 838.0,\n    8626 => 838.0,\n    8627 => 838.0,\n    8628 => 838.0,\n    8629 => 838.0,\n    8630 => 838.0,\n    8631 => 838.0,\n    8632 => 838.0,\n    8633 => 838.0,\n    8634 => 838.0,\n    8635 => 838.0,\n    8636 => 838.0,\n    8637 => 838.0,\n    8638 => 838.0,\n    8639 => 838.0,\n    8640 => 838.0,\n    8641 => 838.0,\n    8642 => 838.0,\n    8643 => 838.0,\n    8644 => 838.0,\n    8645 => 838.0,\n    8646 => 838.0,\n    8647 => 838.0,\n    8648 => 838.0,\n    8649 => 838.0,\n    8650 => 838.0,\n    8651 => 838.0,\n    8652 => 838.0,\n    8653 => 838.0,\n    8654 => 838.0,\n    8655 => 838.0,\n    8656 => 838.0,\n    8657 => 838.0,\n    8658 => 838.0,\n    8659 => 838.0,\n    8660 => 838.0,\n    8661 => 838.0,\n    8662 => 838.0,\n    8663 => 838.0,\n    8664 => 838.0,\n    8665 => 838.0,\n    8666 => 838.0,\n    8667 => 838.0,\n    8668 => 838.0,\n    8669 => 838.0,\n    8670 => 838.0,\n    8671 => 838.0,\n    8672 => 838.0,\n    8673 => 838.0,\n    8674 => 838.0,\n    8675 => 838.0,\n    8676 => 838.0,\n    8677 => 838.0,\n    8678 => 838.0,\n    8679 => 838.0,\n    8680 => 838.0,\n    8681 => 838.0,\n    8682 => 838.0,\n    8683 => 838.0,\n    8684 => 838.0,\n    8685 => 838.0,\n    8686 => 838.0,\n    8687 => 838.0,\n    8688 => 838.0,\n    8689 => 838.0,\n    8690 => 838.0,\n    8691 => 838.0,\n    8692 => 838.0,\n    8693 => 838.0,\n    8694 => 838.0,\n    8695 => 838.0,\n    8696 => 838.0,\n    8697 => 838.0,\n    8698 => 838.0,\n    8699 => 838.0,\n    8700 => 838.0,\n    8701 => 838.0,\n    8702 => 838.0,\n    8703 => 838.0,\n    8704 => 774.0,\n    8705 => 696.0,\n    8706 => 544.0,\n    8707 => 683.0,\n    8708 => 683.0,\n    8709 => 856.0,\n    8710 => 697.0,\n    8711 => 697.0,\n    8712 => 896.0,\n    8713 => 896.0,\n    8714 => 750.0,\n    8715 => 896.0,\n    8716 => 896.0,\n    8717 => 750.0,\n    8718 => 636.0,\n    8719 => 787.0,\n    8720 => 787.0,\n    8721 => 718.0,\n    8722 => 838.0,\n    8723 => 838.0,\n    8724 => 696.0,\n    8725 => 365.0,\n    8726 => 696.0,\n    8727 => 838.0,\n    8728 => 626.0,\n    8729 => 380.0,\n    8730 => 667.0,\n    8731 => 667.0,\n    8732 => 667.0,\n    8733 => 712.0,\n    8734 => 833.0,\n    8735 => 838.0,\n    8736 => 896.0,\n    8737 => 896.0,\n    8738 => 838.0,\n    8739 => 500.0,\n    8740 => 500.0,\n    8741 => 500.0,\n    8742 => 500.0,\n    8743 => 812.0,\n    8744 => 812.0,\n    8745 => 812.0,\n    8746 => 812.0,\n    8747 => 610.0,\n    8748 => 929.0,\n    8749 => 1295.0,\n    8750 => 563.0,\n    8751 => 977.0,\n    8752 => 1313.0,\n    8753 => 563.0,\n    8754 => 563.0,\n    8755 => 563.0,\n    8756 => 696.0,\n    8757 => 696.0,\n    8758 => 294.0,\n    8759 => 696.0,\n    8760 => 838.0,\n    8761 => 838.0,\n    8762 => 838.0,\n    8763 => 838.0,\n    8764 => 838.0,\n    8765 => 838.0,\n    8766 => 838.0,\n    8767 => 838.0,\n    8768 => 375.0,\n    8769 => 838.0,\n    8770 => 838.0,\n    8771 => 838.0,\n    8772 => 838.0,\n    8773 => 838.0,\n    8774 => 838.0,\n    8775 => 838.0,\n    8776 => 838.0,\n    8777 => 838.0,\n    8778 => 838.0,\n    8779 => 838.0,\n    8780 => 838.0,\n    8781 => 838.0,\n    8782 => 838.0,\n    8783 => 838.0,\n    8784 => 838.0,\n    8785 => 838.0,\n    8786 => 838.0,\n    8787 => 838.0,\n    8788 => 1063.0,\n    8789 => 1063.0,\n    8790 => 838.0,\n    8791 => 838.0,\n    8792 => 838.0,\n    8793 => 838.0,\n    8794 => 838.0,\n    8795 => 838.0,\n    8796 => 838.0,\n    8797 => 838.0,\n    8798 => 838.0,\n    8799 => 838.0,\n    8800 => 838.0,\n    8801 => 838.0,\n    8802 => 838.0,\n    8803 => 838.0,\n    8804 => 838.0,\n    8805 => 838.0,\n    8806 => 838.0,\n    8807 => 838.0,\n    8808 => 841.0,\n    8809 => 841.0,\n    8810 => 1047.0,\n    8811 => 1047.0,\n    8812 => 500.0,\n    8813 => 838.0,\n    8814 => 838.0,\n    8815 => 838.0,\n    8816 => 838.0,\n    8817 => 838.0,\n    8818 => 838.0,\n    8819 => 838.0,\n    8820 => 838.0,\n    8821 => 838.0,\n    8822 => 838.0,\n    8823 => 838.0,\n    8824 => 838.0,\n    8825 => 838.0,\n    8826 => 838.0,\n    8827 => 838.0,\n    8828 => 838.0,\n    8829 => 838.0,\n    8830 => 838.0,\n    8831 => 838.0,\n    8832 => 838.0,\n    8833 => 838.0,\n    8834 => 838.0,\n    8835 => 838.0,\n    8836 => 838.0,\n    8837 => 838.0,\n    8838 => 838.0,\n    8839 => 838.0,\n    8840 => 838.0,\n    8841 => 838.0,\n    8842 => 838.0,\n    8843 => 838.0,\n    8844 => 812.0,\n    8845 => 812.0,\n    8846 => 812.0,\n    8847 => 838.0,\n    8848 => 838.0,\n    8849 => 838.0,\n    8850 => 838.0,\n    8851 => 796.0,\n    8852 => 796.0,\n    8853 => 838.0,\n    8854 => 838.0,\n    8855 => 838.0,\n    8856 => 838.0,\n    8857 => 838.0,\n    8858 => 838.0,\n    8859 => 838.0,\n    8860 => 838.0,\n    8861 => 838.0,\n    8862 => 838.0,\n    8863 => 838.0,\n    8864 => 838.0,\n    8865 => 838.0,\n    8866 => 914.0,\n    8867 => 914.0,\n    8868 => 914.0,\n    8869 => 914.0,\n    8870 => 542.0,\n    8871 => 542.0,\n    8872 => 914.0,\n    8873 => 914.0,\n    8874 => 914.0,\n    8875 => 914.0,\n    8876 => 914.0,\n    8877 => 914.0,\n    8878 => 914.0,\n    8879 => 914.0,\n    8880 => 838.0,\n    8881 => 838.0,\n    8882 => 838.0,\n    8883 => 838.0,\n    8884 => 838.0,\n    8885 => 838.0,\n    8886 => 1000.0,\n    8887 => 1000.0,\n    8888 => 838.0,\n    8889 => 838.0,\n    8890 => 542.0,\n    8891 => 812.0,\n    8892 => 812.0,\n    8893 => 812.0,\n    8894 => 838.0,\n    8895 => 838.0,\n    8896 => 843.0,\n    8897 => 843.0,\n    8898 => 843.0,\n    8899 => 843.0,\n    8900 => 626.0,\n    8901 => 380.0,\n    8902 => 626.0,\n    8903 => 838.0,\n    8904 => 1000.0,\n    8905 => 1000.0,\n    8906 => 1000.0,\n    8907 => 1000.0,\n    8908 => 1000.0,\n    8909 => 838.0,\n    8910 => 812.0,\n    8911 => 812.0,\n    8912 => 838.0,\n    8913 => 838.0,\n    8914 => 838.0,\n    8915 => 838.0,\n    8916 => 838.0,\n    8917 => 838.0,\n    8918 => 838.0,\n    8919 => 838.0,\n    8920 => 1422.0,\n    8921 => 1422.0,\n    8922 => 838.0,\n    8923 => 838.0,\n    8924 => 838.0,\n    8925 => 838.0,\n    8926 => 838.0,\n    8927 => 838.0,\n    8928 => 838.0,\n    8929 => 838.0,\n    8930 => 838.0,\n    8931 => 838.0,\n    8932 => 838.0,\n    8933 => 838.0,\n    8934 => 838.0,\n    8935 => 838.0,\n    8936 => 838.0,\n    8937 => 838.0,\n    8938 => 838.0,\n    8939 => 838.0,\n    8940 => 838.0,\n    8941 => 838.0,\n    8942 => 1000.0,\n    8943 => 1000.0,\n    8944 => 1000.0,\n    8945 => 1000.0,\n    8946 => 1158.0,\n    8947 => 896.0,\n    8948 => 750.0,\n    8949 => 896.0,\n    8950 => 896.0,\n    8951 => 750.0,\n    8952 => 896.0,\n    8953 => 896.0,\n    8954 => 1158.0,\n    8955 => 896.0,\n    8956 => 750.0,\n    8957 => 896.0,\n    8958 => 750.0,\n    8959 => 896.0,\n    8960 => 602.0,\n    8961 => 602.0,\n    8962 => 716.0,\n    8963 => 838.0,\n    8964 => 838.0,\n    8965 => 838.0,\n    8966 => 838.0,\n    8967 => 488.0,\n    8968 => 457.0,\n    8969 => 457.0,\n    8970 => 457.0,\n    8971 => 457.0,\n    8972 => 809.0,\n    8973 => 809.0,\n    8974 => 809.0,\n    8975 => 809.0,\n    8976 => 838.0,\n    8977 => 539.0,\n    8984 => 928.0,\n    8985 => 838.0,\n    8988 => 469.0,\n    8989 => 469.0,\n    8990 => 469.0,\n    8991 => 469.0,\n    8992 => 610.0,\n    8993 => 610.0,\n    8996 => 1152.0,\n    8997 => 1152.0,\n    8998 => 1414.0,\n    8999 => 1152.0,\n    9000 => 1443.0,\n    9003 => 1414.0,\n    9004 => 873.0,\n    9075 => 390.0,\n    9076 => 716.0,\n    9077 => 869.0,\n    9082 => 687.0,\n    9085 => 863.0,\n    9095 => 1152.0,\n    9108 => 873.0,\n    9115 => 500.0,\n    9116 => 500.0,\n    9117 => 500.0,\n    9118 => 500.0,\n    9119 => 500.0,\n    9120 => 500.0,\n    9121 => 500.0,\n    9122 => 500.0,\n    9123 => 500.0,\n    9124 => 500.0,\n    9125 => 500.0,\n    9126 => 500.0,\n    9127 => 750.0,\n    9128 => 750.0,\n    9129 => 750.0,\n    9130 => 750.0,\n    9131 => 750.0,\n    9132 => 750.0,\n    9133 => 750.0,\n    9134 => 610.0,\n    9166 => 838.0,\n    9167 => 945.0,\n    9187 => 873.0,\n    9189 => 769.0,\n    9192 => 696.0,\n    9250 => 716.0,\n    9251 => 716.0,\n    9312 => 847.0,\n    9313 => 847.0,\n    9314 => 847.0,\n    9315 => 847.0,\n    9316 => 847.0,\n    9317 => 847.0,\n    9318 => 847.0,\n    9319 => 847.0,\n    9320 => 847.0,\n    9321 => 847.0,\n    9472 => 602.0,\n    9473 => 602.0,\n    9474 => 602.0,\n    9475 => 602.0,\n    9476 => 602.0,\n    9477 => 602.0,\n    9478 => 602.0,\n    9479 => 602.0,\n    9480 => 602.0,\n    9481 => 602.0,\n    9482 => 602.0,\n    9483 => 602.0,\n    9484 => 602.0,\n    9485 => 602.0,\n    9486 => 602.0,\n    9487 => 602.0,\n    9488 => 602.0,\n    9489 => 602.0,\n    9490 => 602.0,\n    9491 => 602.0,\n    9492 => 602.0,\n    9493 => 602.0,\n    9494 => 602.0,\n    9495 => 602.0,\n    9496 => 602.0,\n    9497 => 602.0,\n    9498 => 602.0,\n    9499 => 602.0,\n    9500 => 602.0,\n    9501 => 602.0,\n    9502 => 602.0,\n    9503 => 602.0,\n    9504 => 602.0,\n    9505 => 602.0,\n    9506 => 602.0,\n    9507 => 602.0,\n    9508 => 602.0,\n    9509 => 602.0,\n    9510 => 602.0,\n    9511 => 602.0,\n    9512 => 602.0,\n    9513 => 602.0,\n    9514 => 602.0,\n    9515 => 602.0,\n    9516 => 602.0,\n    9517 => 602.0,\n    9518 => 602.0,\n    9519 => 602.0,\n    9520 => 602.0,\n    9521 => 602.0,\n    9522 => 602.0,\n    9523 => 602.0,\n    9524 => 602.0,\n    9525 => 602.0,\n    9526 => 602.0,\n    9527 => 602.0,\n    9528 => 602.0,\n    9529 => 602.0,\n    9530 => 602.0,\n    9531 => 602.0,\n    9532 => 602.0,\n    9533 => 602.0,\n    9534 => 602.0,\n    9535 => 602.0,\n    9536 => 602.0,\n    9537 => 602.0,\n    9538 => 602.0,\n    9539 => 602.0,\n    9540 => 602.0,\n    9541 => 602.0,\n    9542 => 602.0,\n    9543 => 602.0,\n    9544 => 602.0,\n    9545 => 602.0,\n    9546 => 602.0,\n    9547 => 602.0,\n    9548 => 602.0,\n    9549 => 602.0,\n    9550 => 602.0,\n    9551 => 602.0,\n    9552 => 602.0,\n    9553 => 602.0,\n    9554 => 602.0,\n    9555 => 602.0,\n    9556 => 602.0,\n    9557 => 602.0,\n    9558 => 602.0,\n    9559 => 602.0,\n    9560 => 602.0,\n    9561 => 602.0,\n    9562 => 602.0,\n    9563 => 602.0,\n    9564 => 602.0,\n    9565 => 602.0,\n    9566 => 602.0,\n    9567 => 602.0,\n    9568 => 602.0,\n    9569 => 602.0,\n    9570 => 602.0,\n    9571 => 602.0,\n    9572 => 602.0,\n    9573 => 602.0,\n    9574 => 602.0,\n    9575 => 602.0,\n    9576 => 602.0,\n    9577 => 602.0,\n    9578 => 602.0,\n    9579 => 602.0,\n    9580 => 602.0,\n    9581 => 602.0,\n    9582 => 602.0,\n    9583 => 602.0,\n    9584 => 602.0,\n    9585 => 602.0,\n    9586 => 602.0,\n    9587 => 602.0,\n    9588 => 602.0,\n    9589 => 602.0,\n    9590 => 602.0,\n    9591 => 602.0,\n    9592 => 602.0,\n    9593 => 602.0,\n    9594 => 602.0,\n    9595 => 602.0,\n    9596 => 602.0,\n    9597 => 602.0,\n    9598 => 602.0,\n    9599 => 602.0,\n    9600 => 769.0,\n    9601 => 769.0,\n    9602 => 769.0,\n    9603 => 769.0,\n    9604 => 769.0,\n    9605 => 769.0,\n    9606 => 769.0,\n    9607 => 769.0,\n    9608 => 769.0,\n    9609 => 769.0,\n    9610 => 769.0,\n    9611 => 769.0,\n    9612 => 769.0,\n    9613 => 769.0,\n    9614 => 769.0,\n    9615 => 769.0,\n    9616 => 769.0,\n    9617 => 769.0,\n    9618 => 769.0,\n    9619 => 769.0,\n    9620 => 769.0,\n    9621 => 769.0,\n    9622 => 769.0,\n    9623 => 769.0,\n    9624 => 769.0,\n    9625 => 769.0,\n    9626 => 769.0,\n    9627 => 769.0,\n    9628 => 769.0,\n    9629 => 769.0,\n    9630 => 769.0,\n    9631 => 769.0,\n    9632 => 945.0,\n    9633 => 945.0,\n    9634 => 945.0,\n    9635 => 945.0,\n    9636 => 945.0,\n    9637 => 945.0,\n    9638 => 945.0,\n    9639 => 945.0,\n    9640 => 945.0,\n    9641 => 945.0,\n    9642 => 678.0,\n    9643 => 678.0,\n    9644 => 945.0,\n    9645 => 945.0,\n    9646 => 550.0,\n    9647 => 550.0,\n    9648 => 769.0,\n    9649 => 769.0,\n    9650 => 769.0,\n    9651 => 769.0,\n    9652 => 502.0,\n    9653 => 502.0,\n    9654 => 769.0,\n    9655 => 769.0,\n    9656 => 502.0,\n    9657 => 502.0,\n    9658 => 769.0,\n    9659 => 769.0,\n    9660 => 769.0,\n    9661 => 769.0,\n    9662 => 502.0,\n    9663 => 502.0,\n    9664 => 769.0,\n    9665 => 769.0,\n    9666 => 502.0,\n    9667 => 502.0,\n    9668 => 769.0,\n    9669 => 769.0,\n    9670 => 769.0,\n    9671 => 769.0,\n    9672 => 769.0,\n    9673 => 873.0,\n    9674 => 494.0,\n    9675 => 873.0,\n    9676 => 873.0,\n    9677 => 873.0,\n    9678 => 873.0,\n    9679 => 873.0,\n    9680 => 873.0,\n    9681 => 873.0,\n    9682 => 873.0,\n    9683 => 873.0,\n    9684 => 873.0,\n    9685 => 873.0,\n    9686 => 527.0,\n    9687 => 527.0,\n    9688 => 840.0,\n    9689 => 970.0,\n    9690 => 970.0,\n    9691 => 970.0,\n    9692 => 387.0,\n    9693 => 387.0,\n    9694 => 387.0,\n    9695 => 387.0,\n    9696 => 769.0,\n    9697 => 769.0,\n    9698 => 769.0,\n    9699 => 769.0,\n    9700 => 769.0,\n    9701 => 769.0,\n    9702 => 639.0,\n    9703 => 945.0,\n    9704 => 945.0,\n    9705 => 945.0,\n    9706 => 945.0,\n    9707 => 945.0,\n    9708 => 769.0,\n    9709 => 769.0,\n    9710 => 769.0,\n    9711 => 1119.0,\n    9712 => 945.0,\n    9713 => 945.0,\n    9714 => 945.0,\n    9715 => 945.0,\n    9716 => 873.0,\n    9717 => 873.0,\n    9718 => 873.0,\n    9719 => 873.0,\n    9720 => 769.0,\n    9721 => 769.0,\n    9722 => 769.0,\n    9723 => 830.0,\n    9724 => 830.0,\n    9725 => 732.0,\n    9726 => 732.0,\n    9727 => 769.0,\n    9728 => 896.0,\n    9729 => 1000.0,\n    9730 => 896.0,\n    9731 => 896.0,\n    9732 => 896.0,\n    9733 => 896.0,\n    9734 => 896.0,\n    9735 => 573.0,\n    9736 => 896.0,\n    9737 => 896.0,\n    9738 => 888.0,\n    9739 => 888.0,\n    9740 => 671.0,\n    9741 => 1013.0,\n    9742 => 1246.0,\n    9743 => 1250.0,\n    9744 => 896.0,\n    9745 => 896.0,\n    9746 => 896.0,\n    9747 => 532.0,\n    9748 => 896.0,\n    9749 => 896.0,\n    9750 => 896.0,\n    9751 => 896.0,\n    9752 => 896.0,\n    9753 => 896.0,\n    9754 => 896.0,\n    9755 => 896.0,\n    9756 => 896.0,\n    9757 => 609.0,\n    9758 => 896.0,\n    9759 => 609.0,\n    9760 => 896.0,\n    9761 => 896.0,\n    9762 => 896.0,\n    9763 => 896.0,\n    9764 => 669.0,\n    9765 => 746.0,\n    9766 => 649.0,\n    9767 => 784.0,\n    9768 => 545.0,\n    9769 => 896.0,\n    9770 => 896.0,\n    9771 => 896.0,\n    9772 => 710.0,\n    9773 => 896.0,\n    9774 => 896.0,\n    9775 => 896.0,\n    9776 => 896.0,\n    9777 => 896.0,\n    9778 => 896.0,\n    9779 => 896.0,\n    9780 => 896.0,\n    9781 => 896.0,\n    9782 => 896.0,\n    9783 => 896.0,\n    9784 => 896.0,\n    9785 => 1042.0,\n    9786 => 1042.0,\n    9787 => 1042.0,\n    9788 => 896.0,\n    9789 => 896.0,\n    9790 => 896.0,\n    9791 => 614.0,\n    9792 => 732.0,\n    9793 => 732.0,\n    9794 => 896.0,\n    9795 => 896.0,\n    9796 => 896.0,\n    9797 => 896.0,\n    9798 => 896.0,\n    9799 => 896.0,\n    9800 => 896.0,\n    9801 => 896.0,\n    9802 => 896.0,\n    9803 => 896.0,\n    9804 => 896.0,\n    9805 => 896.0,\n    9806 => 896.0,\n    9807 => 896.0,\n    9808 => 896.0,\n    9809 => 896.0,\n    9810 => 896.0,\n    9811 => 896.0,\n    9812 => 896.0,\n    9813 => 896.0,\n    9814 => 896.0,\n    9815 => 896.0,\n    9816 => 896.0,\n    9817 => 896.0,\n    9818 => 896.0,\n    9819 => 896.0,\n    9820 => 896.0,\n    9821 => 896.0,\n    9822 => 896.0,\n    9823 => 896.0,\n    9824 => 896.0,\n    9825 => 896.0,\n    9826 => 896.0,\n    9827 => 896.0,\n    9828 => 896.0,\n    9829 => 896.0,\n    9830 => 896.0,\n    9831 => 896.0,\n    9832 => 896.0,\n    9833 => 472.0,\n    9834 => 638.0,\n    9835 => 896.0,\n    9836 => 896.0,\n    9837 => 472.0,\n    9838 => 357.0,\n    9839 => 484.0,\n    9840 => 748.0,\n    9841 => 766.0,\n    9842 => 896.0,\n    9843 => 896.0,\n    9844 => 896.0,\n    9845 => 896.0,\n    9846 => 896.0,\n    9847 => 896.0,\n    9848 => 896.0,\n    9849 => 896.0,\n    9850 => 896.0,\n    9851 => 896.0,\n    9852 => 896.0,\n    9853 => 896.0,\n    9854 => 896.0,\n    9855 => 896.0,\n    9856 => 869.0,\n    9857 => 869.0,\n    9858 => 869.0,\n    9859 => 869.0,\n    9860 => 869.0,\n    9861 => 869.0,\n    9862 => 896.0,\n    9863 => 896.0,\n    9864 => 896.0,\n    9865 => 896.0,\n    9866 => 896.0,\n    9867 => 896.0,\n    9868 => 896.0,\n    9869 => 896.0,\n    9870 => 896.0,\n    9871 => 896.0,\n    9872 => 896.0,\n    9873 => 896.0,\n    9874 => 896.0,\n    9875 => 896.0,\n    9876 => 896.0,\n    9877 => 541.0,\n    9878 => 896.0,\n    9879 => 896.0,\n    9880 => 896.0,\n    9881 => 896.0,\n    9882 => 896.0,\n    9883 => 896.0,\n    9884 => 896.0,\n    9886 => 896.0,\n    9887 => 896.0,\n    9888 => 896.0,\n    9889 => 702.0,\n    9890 => 1004.0,\n    9891 => 1089.0,\n    9892 => 1175.0,\n    9893 => 903.0,\n    9894 => 838.0,\n    9895 => 838.0,\n    9896 => 838.0,\n    9897 => 838.0,\n    9898 => 838.0,\n    9899 => 838.0,\n    9900 => 838.0,\n    9901 => 838.0,\n    9902 => 838.0,\n    9903 => 838.0,\n    9904 => 844.0,\n    9905 => 838.0,\n    9906 => 732.0,\n    9907 => 732.0,\n    9908 => 732.0,\n    9909 => 732.0,\n    9910 => 850.0,\n    9911 => 732.0,\n    9912 => 732.0,\n    9920 => 838.0,\n    9921 => 838.0,\n    9922 => 838.0,\n    9923 => 838.0,\n    9954 => 732.0,\n    9985 => 838.0,\n    9986 => 838.0,\n    9987 => 838.0,\n    9988 => 838.0,\n    9990 => 838.0,\n    9991 => 838.0,\n    9992 => 838.0,\n    9993 => 838.0,\n    9996 => 838.0,\n    9997 => 838.0,\n    9998 => 838.0,\n    9999 => 838.0,\n    10000 => 838.0,\n    10001 => 838.0,\n    10002 => 838.0,\n    10003 => 838.0,\n    10004 => 838.0,\n    10005 => 838.0,\n    10006 => 838.0,\n    10007 => 838.0,\n    10008 => 838.0,\n    10009 => 838.0,\n    10010 => 838.0,\n    10011 => 838.0,\n    10012 => 838.0,\n    10013 => 838.0,\n    10014 => 838.0,\n    10015 => 838.0,\n    10016 => 838.0,\n    10017 => 838.0,\n    10018 => 838.0,\n    10019 => 838.0,\n    10020 => 838.0,\n    10021 => 838.0,\n    10022 => 838.0,\n    10023 => 838.0,\n    10025 => 838.0,\n    10026 => 838.0,\n    10027 => 838.0,\n    10028 => 838.0,\n    10029 => 838.0,\n    10030 => 838.0,\n    10031 => 838.0,\n    10032 => 838.0,\n    10033 => 838.0,\n    10034 => 838.0,\n    10035 => 838.0,\n    10036 => 838.0,\n    10037 => 838.0,\n    10038 => 838.0,\n    10039 => 838.0,\n    10040 => 838.0,\n    10041 => 838.0,\n    10042 => 838.0,\n    10043 => 838.0,\n    10044 => 838.0,\n    10045 => 838.0,\n    10046 => 838.0,\n    10047 => 838.0,\n    10048 => 838.0,\n    10049 => 838.0,\n    10050 => 838.0,\n    10051 => 838.0,\n    10052 => 838.0,\n    10053 => 838.0,\n    10054 => 838.0,\n    10055 => 838.0,\n    10056 => 838.0,\n    10057 => 838.0,\n    10058 => 838.0,\n    10059 => 838.0,\n    10061 => 896.0,\n    10063 => 896.0,\n    10064 => 896.0,\n    10065 => 896.0,\n    10066 => 896.0,\n    10070 => 896.0,\n    10072 => 838.0,\n    10073 => 838.0,\n    10074 => 838.0,\n    10075 => 347.0,\n    10076 => 347.0,\n    10077 => 587.0,\n    10078 => 587.0,\n    10081 => 838.0,\n    10082 => 838.0,\n    10083 => 838.0,\n    10084 => 838.0,\n    10085 => 838.0,\n    10086 => 838.0,\n    10087 => 838.0,\n    10088 => 838.0,\n    10089 => 838.0,\n    10090 => 838.0,\n    10091 => 838.0,\n    10092 => 838.0,\n    10093 => 838.0,\n    10094 => 838.0,\n    10095 => 838.0,\n    10096 => 838.0,\n    10097 => 838.0,\n    10098 => 838.0,\n    10099 => 838.0,\n    10100 => 838.0,\n    10101 => 838.0,\n    10102 => 847.0,\n    10103 => 847.0,\n    10104 => 847.0,\n    10105 => 847.0,\n    10106 => 847.0,\n    10107 => 847.0,\n    10108 => 847.0,\n    10109 => 847.0,\n    10110 => 847.0,\n    10111 => 847.0,\n    10112 => 838.0,\n    10113 => 838.0,\n    10114 => 838.0,\n    10115 => 838.0,\n    10116 => 838.0,\n    10117 => 838.0,\n    10118 => 838.0,\n    10119 => 838.0,\n    10120 => 838.0,\n    10121 => 838.0,\n    10122 => 838.0,\n    10123 => 838.0,\n    10124 => 838.0,\n    10125 => 838.0,\n    10126 => 838.0,\n    10127 => 838.0,\n    10128 => 838.0,\n    10129 => 838.0,\n    10130 => 838.0,\n    10131 => 838.0,\n    10132 => 838.0,\n    10136 => 838.0,\n    10137 => 838.0,\n    10138 => 838.0,\n    10139 => 838.0,\n    10140 => 838.0,\n    10141 => 838.0,\n    10142 => 838.0,\n    10143 => 838.0,\n    10144 => 838.0,\n    10145 => 838.0,\n    10146 => 838.0,\n    10147 => 838.0,\n    10148 => 838.0,\n    10149 => 838.0,\n    10150 => 838.0,\n    10151 => 838.0,\n    10152 => 838.0,\n    10153 => 838.0,\n    10154 => 838.0,\n    10155 => 838.0,\n    10156 => 838.0,\n    10157 => 838.0,\n    10158 => 838.0,\n    10159 => 838.0,\n    10161 => 838.0,\n    10162 => 838.0,\n    10163 => 838.0,\n    10164 => 838.0,\n    10165 => 838.0,\n    10166 => 838.0,\n    10167 => 838.0,\n    10168 => 838.0,\n    10169 => 838.0,\n    10170 => 838.0,\n    10171 => 838.0,\n    10172 => 838.0,\n    10173 => 838.0,\n    10174 => 838.0,\n    10181 => 457.0,\n    10182 => 457.0,\n    10208 => 494.0,\n    10214 => 487.0,\n    10215 => 487.0,\n    10216 => 457.0,\n    10217 => 457.0,\n    10218 => 721.0,\n    10219 => 721.0,\n    10224 => 838.0,\n    10225 => 838.0,\n    10226 => 838.0,\n    10227 => 838.0,\n    10228 => 1157.0,\n    10229 => 1434.0,\n    10230 => 1434.0,\n    10231 => 1434.0,\n    10232 => 1434.0,\n    10233 => 1434.0,\n    10234 => 1434.0,\n    10235 => 1434.0,\n    10236 => 1434.0,\n    10237 => 1434.0,\n    10238 => 1434.0,\n    10239 => 1434.0,\n    10240 => 781.0,\n    10241 => 781.0,\n    10242 => 781.0,\n    10243 => 781.0,\n    10244 => 781.0,\n    10245 => 781.0,\n    10246 => 781.0,\n    10247 => 781.0,\n    10248 => 781.0,\n    10249 => 781.0,\n    10250 => 781.0,\n    10251 => 781.0,\n    10252 => 781.0,\n    10253 => 781.0,\n    10254 => 781.0,\n    10255 => 781.0,\n    10256 => 781.0,\n    10257 => 781.0,\n    10258 => 781.0,\n    10259 => 781.0,\n    10260 => 781.0,\n    10261 => 781.0,\n    10262 => 781.0,\n    10263 => 781.0,\n    10264 => 781.0,\n    10265 => 781.0,\n    10266 => 781.0,\n    10267 => 781.0,\n    10268 => 781.0,\n    10269 => 781.0,\n    10270 => 781.0,\n    10271 => 781.0,\n    10272 => 781.0,\n    10273 => 781.0,\n    10274 => 781.0,\n    10275 => 781.0,\n    10276 => 781.0,\n    10277 => 781.0,\n    10278 => 781.0,\n    10279 => 781.0,\n    10280 => 781.0,\n    10281 => 781.0,\n    10282 => 781.0,\n    10283 => 781.0,\n    10284 => 781.0,\n    10285 => 781.0,\n    10286 => 781.0,\n    10287 => 781.0,\n    10288 => 781.0,\n    10289 => 781.0,\n    10290 => 781.0,\n    10291 => 781.0,\n    10292 => 781.0,\n    10293 => 781.0,\n    10294 => 781.0,\n    10295 => 781.0,\n    10296 => 781.0,\n    10297 => 781.0,\n    10298 => 781.0,\n    10299 => 781.0,\n    10300 => 781.0,\n    10301 => 781.0,\n    10302 => 781.0,\n    10303 => 781.0,\n    10304 => 781.0,\n    10305 => 781.0,\n    10306 => 781.0,\n    10307 => 781.0,\n    10308 => 781.0,\n    10309 => 781.0,\n    10310 => 781.0,\n    10311 => 781.0,\n    10312 => 781.0,\n    10313 => 781.0,\n    10314 => 781.0,\n    10315 => 781.0,\n    10316 => 781.0,\n    10317 => 781.0,\n    10318 => 781.0,\n    10319 => 781.0,\n    10320 => 781.0,\n    10321 => 781.0,\n    10322 => 781.0,\n    10323 => 781.0,\n    10324 => 781.0,\n    10325 => 781.0,\n    10326 => 781.0,\n    10327 => 781.0,\n    10328 => 781.0,\n    10329 => 781.0,\n    10330 => 781.0,\n    10331 => 781.0,\n    10332 => 781.0,\n    10333 => 781.0,\n    10334 => 781.0,\n    10335 => 781.0,\n    10336 => 781.0,\n    10337 => 781.0,\n    10338 => 781.0,\n    10339 => 781.0,\n    10340 => 781.0,\n    10341 => 781.0,\n    10342 => 781.0,\n    10343 => 781.0,\n    10344 => 781.0,\n    10345 => 781.0,\n    10346 => 781.0,\n    10347 => 781.0,\n    10348 => 781.0,\n    10349 => 781.0,\n    10350 => 781.0,\n    10351 => 781.0,\n    10352 => 781.0,\n    10353 => 781.0,\n    10354 => 781.0,\n    10355 => 781.0,\n    10356 => 781.0,\n    10357 => 781.0,\n    10358 => 781.0,\n    10359 => 781.0,\n    10360 => 781.0,\n    10361 => 781.0,\n    10362 => 781.0,\n    10363 => 781.0,\n    10364 => 781.0,\n    10365 => 781.0,\n    10366 => 781.0,\n    10367 => 781.0,\n    10368 => 781.0,\n    10369 => 781.0,\n    10370 => 781.0,\n    10371 => 781.0,\n    10372 => 781.0,\n    10373 => 781.0,\n    10374 => 781.0,\n    10375 => 781.0,\n    10376 => 781.0,\n    10377 => 781.0,\n    10378 => 781.0,\n    10379 => 781.0,\n    10380 => 781.0,\n    10381 => 781.0,\n    10382 => 781.0,\n    10383 => 781.0,\n    10384 => 781.0,\n    10385 => 781.0,\n    10386 => 781.0,\n    10387 => 781.0,\n    10388 => 781.0,\n    10389 => 781.0,\n    10390 => 781.0,\n    10391 => 781.0,\n    10392 => 781.0,\n    10393 => 781.0,\n    10394 => 781.0,\n    10395 => 781.0,\n    10396 => 781.0,\n    10397 => 781.0,\n    10398 => 781.0,\n    10399 => 781.0,\n    10400 => 781.0,\n    10401 => 781.0,\n    10402 => 781.0,\n    10403 => 781.0,\n    10404 => 781.0,\n    10405 => 781.0,\n    10406 => 781.0,\n    10407 => 781.0,\n    10408 => 781.0,\n    10409 => 781.0,\n    10410 => 781.0,\n    10411 => 781.0,\n    10412 => 781.0,\n    10413 => 781.0,\n    10414 => 781.0,\n    10415 => 781.0,\n    10416 => 781.0,\n    10417 => 781.0,\n    10418 => 781.0,\n    10419 => 781.0,\n    10420 => 781.0,\n    10421 => 781.0,\n    10422 => 781.0,\n    10423 => 781.0,\n    10424 => 781.0,\n    10425 => 781.0,\n    10426 => 781.0,\n    10427 => 781.0,\n    10428 => 781.0,\n    10429 => 781.0,\n    10430 => 781.0,\n    10431 => 781.0,\n    10432 => 781.0,\n    10433 => 781.0,\n    10434 => 781.0,\n    10435 => 781.0,\n    10436 => 781.0,\n    10437 => 781.0,\n    10438 => 781.0,\n    10439 => 781.0,\n    10440 => 781.0,\n    10441 => 781.0,\n    10442 => 781.0,\n    10443 => 781.0,\n    10444 => 781.0,\n    10445 => 781.0,\n    10446 => 781.0,\n    10447 => 781.0,\n    10448 => 781.0,\n    10449 => 781.0,\n    10450 => 781.0,\n    10451 => 781.0,\n    10452 => 781.0,\n    10453 => 781.0,\n    10454 => 781.0,\n    10455 => 781.0,\n    10456 => 781.0,\n    10457 => 781.0,\n    10458 => 781.0,\n    10459 => 781.0,\n    10460 => 781.0,\n    10461 => 781.0,\n    10462 => 781.0,\n    10463 => 781.0,\n    10464 => 781.0,\n    10465 => 781.0,\n    10466 => 781.0,\n    10467 => 781.0,\n    10468 => 781.0,\n    10469 => 781.0,\n    10470 => 781.0,\n    10471 => 781.0,\n    10472 => 781.0,\n    10473 => 781.0,\n    10474 => 781.0,\n    10475 => 781.0,\n    10476 => 781.0,\n    10477 => 781.0,\n    10478 => 781.0,\n    10479 => 781.0,\n    10480 => 781.0,\n    10481 => 781.0,\n    10482 => 781.0,\n    10483 => 781.0,\n    10484 => 781.0,\n    10485 => 781.0,\n    10486 => 781.0,\n    10487 => 781.0,\n    10488 => 781.0,\n    10489 => 781.0,\n    10490 => 781.0,\n    10491 => 781.0,\n    10492 => 781.0,\n    10493 => 781.0,\n    10494 => 781.0,\n    10495 => 781.0,\n    10502 => 838.0,\n    10503 => 838.0,\n    10506 => 838.0,\n    10507 => 838.0,\n    10560 => 838.0,\n    10561 => 838.0,\n    10627 => 753.0,\n    10628 => 753.0,\n    10702 => 838.0,\n    10703 => 1046.0,\n    10704 => 1046.0,\n    10705 => 1000.0,\n    10706 => 1000.0,\n    10707 => 1000.0,\n    10708 => 1000.0,\n    10709 => 1000.0,\n    10731 => 494.0,\n    10746 => 838.0,\n    10747 => 838.0,\n    10752 => 1000.0,\n    10753 => 1000.0,\n    10754 => 1000.0,\n    10764 => 1661.0,\n    10765 => 563.0,\n    10766 => 563.0,\n    10767 => 563.0,\n    10768 => 563.0,\n    10769 => 563.0,\n    10770 => 563.0,\n    10771 => 563.0,\n    10772 => 563.0,\n    10773 => 563.0,\n    10774 => 563.0,\n    10775 => 563.0,\n    10776 => 563.0,\n    10777 => 563.0,\n    10778 => 563.0,\n    10779 => 563.0,\n    10780 => 563.0,\n    10799 => 838.0,\n    10858 => 838.0,\n    10859 => 838.0,\n    10877 => 838.0,\n    10878 => 838.0,\n    10879 => 838.0,\n    10880 => 838.0,\n    10881 => 838.0,\n    10882 => 838.0,\n    10883 => 838.0,\n    10884 => 838.0,\n    10885 => 838.0,\n    10886 => 838.0,\n    10887 => 838.0,\n    10888 => 838.0,\n    10889 => 838.0,\n    10890 => 838.0,\n    10891 => 838.0,\n    10892 => 838.0,\n    10893 => 838.0,\n    10894 => 838.0,\n    10895 => 838.0,\n    10896 => 838.0,\n    10897 => 838.0,\n    10898 => 838.0,\n    10899 => 838.0,\n    10900 => 838.0,\n    10901 => 838.0,\n    10902 => 838.0,\n    10903 => 838.0,\n    10904 => 838.0,\n    10905 => 838.0,\n    10906 => 838.0,\n    10907 => 838.0,\n    10908 => 838.0,\n    10909 => 838.0,\n    10910 => 838.0,\n    10911 => 838.0,\n    10912 => 838.0,\n    10926 => 838.0,\n    10927 => 838.0,\n    10928 => 838.0,\n    10929 => 838.0,\n    10930 => 838.0,\n    10931 => 838.0,\n    10932 => 838.0,\n    10933 => 838.0,\n    10934 => 838.0,\n    10935 => 838.0,\n    10936 => 838.0,\n    10937 => 838.0,\n    10938 => 838.0,\n    11001 => 838.0,\n    11002 => 838.0,\n    11008 => 838.0,\n    11009 => 838.0,\n    11010 => 838.0,\n    11011 => 838.0,\n    11012 => 838.0,\n    11013 => 838.0,\n    11014 => 838.0,\n    11015 => 838.0,\n    11016 => 838.0,\n    11017 => 838.0,\n    11018 => 838.0,\n    11019 => 838.0,\n    11020 => 838.0,\n    11021 => 838.0,\n    11022 => 838.0,\n    11023 => 838.0,\n    11024 => 838.0,\n    11025 => 838.0,\n    11026 => 945.0,\n    11027 => 945.0,\n    11028 => 945.0,\n    11029 => 945.0,\n    11030 => 769.0,\n    11031 => 769.0,\n    11032 => 769.0,\n    11033 => 769.0,\n    11034 => 945.0,\n    11039 => 869.0,\n    11040 => 869.0,\n    11041 => 873.0,\n    11042 => 873.0,\n    11043 => 873.0,\n    11044 => 1119.0,\n    11091 => 869.0,\n    11092 => 869.0,\n    11360 => 637.0,\n    11361 => 360.0,\n    11362 => 637.0,\n    11363 => 733.0,\n    11364 => 770.0,\n    11365 => 675.0,\n    11366 => 478.0,\n    11367 => 956.0,\n    11368 => 712.0,\n    11369 => 775.0,\n    11370 => 665.0,\n    11371 => 725.0,\n    11372 => 582.0,\n    11373 => 860.0,\n    11374 => 995.0,\n    11375 => 774.0,\n    11376 => 860.0,\n    11377 => 778.0,\n    11378 => 1221.0,\n    11379 => 1056.0,\n    11380 => 652.0,\n    11381 => 698.0,\n    11382 => 565.0,\n    11383 => 782.0,\n    11385 => 538.0,\n    11386 => 687.0,\n    11387 => 559.0,\n    11388 => 219.0,\n    11389 => 487.0,\n    11390 => 720.0,\n    11391 => 725.0,\n    11520 => 663.0,\n    11521 => 676.0,\n    11522 => 661.0,\n    11523 => 629.0,\n    11524 => 661.0,\n    11525 => 1032.0,\n    11526 => 718.0,\n    11527 => 1032.0,\n    11528 => 648.0,\n    11529 => 667.0,\n    11530 => 1032.0,\n    11531 => 673.0,\n    11532 => 677.0,\n    11533 => 1036.0,\n    11534 => 680.0,\n    11535 => 886.0,\n    11536 => 1032.0,\n    11537 => 683.0,\n    11538 => 674.0,\n    11539 => 1035.0,\n    11540 => 1033.0,\n    11541 => 1027.0,\n    11542 => 676.0,\n    11543 => 673.0,\n    11544 => 667.0,\n    11545 => 667.0,\n    11546 => 660.0,\n    11547 => 671.0,\n    11548 => 1039.0,\n    11549 => 673.0,\n    11550 => 692.0,\n    11551 => 659.0,\n    11552 => 1048.0,\n    11553 => 660.0,\n    11554 => 654.0,\n    11555 => 670.0,\n    11556 => 733.0,\n    11557 => 1017.0,\n    11568 => 691.0,\n    11569 => 941.0,\n    11570 => 941.0,\n    11571 => 725.0,\n    11572 => 725.0,\n    11573 => 725.0,\n    11574 => 676.0,\n    11575 => 774.0,\n    11576 => 774.0,\n    11577 => 683.0,\n    11578 => 683.0,\n    11579 => 802.0,\n    11580 => 989.0,\n    11581 => 761.0,\n    11582 => 623.0,\n    11583 => 761.0,\n    11584 => 941.0,\n    11585 => 941.0,\n    11586 => 373.0,\n    11587 => 740.0,\n    11588 => 837.0,\n    11589 => 914.0,\n    11590 => 672.0,\n    11591 => 737.0,\n    11592 => 680.0,\n    11593 => 683.0,\n    11594 => 602.0,\n    11595 => 1039.0,\n    11596 => 778.0,\n    11597 => 837.0,\n    11598 => 683.0,\n    11599 => 372.0,\n    11600 => 778.0,\n    11601 => 373.0,\n    11602 => 725.0,\n    11603 => 691.0,\n    11604 => 941.0,\n    11605 => 941.0,\n    11606 => 837.0,\n    11607 => 373.0,\n    11608 => 836.0,\n    11609 => 941.0,\n    11610 => 941.0,\n    11611 => 734.0,\n    11612 => 876.0,\n    11613 => 771.0,\n    11614 => 734.0,\n    11615 => 683.0,\n    11616 => 774.0,\n    11617 => 837.0,\n    11618 => 683.0,\n    11619 => 850.0,\n    11620 => 697.0,\n    11621 => 850.0,\n    11631 => 716.0,\n    11800 => 580.0,\n    11807 => 838.0,\n    11810 => 457.0,\n    11811 => 457.0,\n    11812 => 457.0,\n    11813 => 457.0,\n    11822 => 580.0,\n    19904 => 896.0,\n    19905 => 896.0,\n    19906 => 896.0,\n    19907 => 896.0,\n    19908 => 896.0,\n    19909 => 896.0,\n    19910 => 896.0,\n    19911 => 896.0,\n    19912 => 896.0,\n    19913 => 896.0,\n    19914 => 896.0,\n    19915 => 896.0,\n    19916 => 896.0,\n    19917 => 896.0,\n    19918 => 896.0,\n    19919 => 896.0,\n    19920 => 896.0,\n    19921 => 896.0,\n    19922 => 896.0,\n    19923 => 896.0,\n    19924 => 896.0,\n    19925 => 896.0,\n    19926 => 896.0,\n    19927 => 896.0,\n    19928 => 896.0,\n    19929 => 896.0,\n    19930 => 896.0,\n    19931 => 896.0,\n    19932 => 896.0,\n    19933 => 896.0,\n    19934 => 896.0,\n    19935 => 896.0,\n    19936 => 896.0,\n    19937 => 896.0,\n    19938 => 896.0,\n    19939 => 896.0,\n    19940 => 896.0,\n    19941 => 896.0,\n    19942 => 896.0,\n    19943 => 896.0,\n    19944 => 896.0,\n    19945 => 896.0,\n    19946 => 896.0,\n    19947 => 896.0,\n    19948 => 896.0,\n    19949 => 896.0,\n    19950 => 896.0,\n    19951 => 896.0,\n    19952 => 896.0,\n    19953 => 896.0,\n    19954 => 896.0,\n    19955 => 896.0,\n    19956 => 896.0,\n    19957 => 896.0,\n    19958 => 896.0,\n    19959 => 896.0,\n    19960 => 896.0,\n    19961 => 896.0,\n    19962 => 896.0,\n    19963 => 896.0,\n    19964 => 896.0,\n    19965 => 896.0,\n    19966 => 896.0,\n    19967 => 896.0,\n    42192 => 762.0,\n    42193 => 733.0,\n    42194 => 733.0,\n    42195 => 830.0,\n    42196 => 682.0,\n    42197 => 682.0,\n    42198 => 821.0,\n    42199 => 775.0,\n    42200 => 775.0,\n    42201 => 530.0,\n    42202 => 734.0,\n    42203 => 734.0,\n    42204 => 725.0,\n    42205 => 683.0,\n    42206 => 683.0,\n    42207 => 995.0,\n    42208 => 837.0,\n    42209 => 637.0,\n    42210 => 720.0,\n    42211 => 770.0,\n    42212 => 770.0,\n    42213 => 774.0,\n    42214 => 774.0,\n    42215 => 837.0,\n    42216 => 775.0,\n    42217 => 530.0,\n    42218 => 1103.0,\n    42219 => 771.0,\n    42220 => 724.0,\n    42221 => 762.0,\n    42222 => 774.0,\n    42223 => 774.0,\n    42224 => 683.0,\n    42225 => 683.0,\n    42226 => 372.0,\n    42227 => 850.0,\n    42228 => 812.0,\n    42229 => 812.0,\n    42230 => 557.0,\n    42231 => 830.0,\n    42232 => 322.0,\n    42233 => 322.0,\n    42234 => 674.0,\n    42235 => 674.0,\n    42236 => 322.0,\n    42237 => 322.0,\n    42238 => 588.0,\n    42239 => 588.0,\n    42564 => 720.0,\n    42565 => 595.0,\n    42566 => 436.0,\n    42567 => 440.0,\n    42572 => 1405.0,\n    42573 => 1173.0,\n    42576 => 1234.0,\n    42577 => 1027.0,\n    42580 => 1174.0,\n    42581 => 972.0,\n    42582 => 1093.0,\n    42583 => 958.0,\n    42594 => 1085.0,\n    42595 => 924.0,\n    42596 => 1096.0,\n    42597 => 912.0,\n    42598 => 1260.0,\n    42599 => 997.0,\n    42600 => 850.0,\n    42601 => 687.0,\n    42602 => 1037.0,\n    42603 => 868.0,\n    42604 => 1406.0,\n    42605 => 1106.0,\n    42606 => 961.0,\n    42634 => 963.0,\n    42635 => 787.0,\n    42636 => 682.0,\n    42637 => 580.0,\n    42644 => 808.0,\n    42645 => 712.0,\n    42648 => 1406.0,\n    42649 => 1106.0,\n    42760 => 500.0,\n    42761 => 500.0,\n    42762 => 500.0,\n    42763 => 500.0,\n    42764 => 500.0,\n    42765 => 500.0,\n    42766 => 500.0,\n    42767 => 500.0,\n    42768 => 500.0,\n    42769 => 500.0,\n    42770 => 500.0,\n    42771 => 500.0,\n    42772 => 500.0,\n    42773 => 500.0,\n    42774 => 500.0,\n    42779 => 400.0,\n    42780 => 400.0,\n    42781 => 287.0,\n    42782 => 287.0,\n    42783 => 287.0,\n    42786 => 444.0,\n    42787 => 390.0,\n    42788 => 540.0,\n    42789 => 540.0,\n    42790 => 837.0,\n    42791 => 712.0,\n    42792 => 1031.0,\n    42793 => 857.0,\n    42794 => 696.0,\n    42795 => 557.0,\n    42800 => 559.0,\n    42801 => 595.0,\n    42802 => 1349.0,\n    42803 => 1052.0,\n    42804 => 1284.0,\n    42805 => 1064.0,\n    42806 => 1216.0,\n    42807 => 1054.0,\n    42808 => 1079.0,\n    42809 => 922.0,\n    42810 => 1079.0,\n    42811 => 922.0,\n    42812 => 1035.0,\n    42813 => 922.0,\n    42814 => 698.0,\n    42815 => 549.0,\n    42816 => 656.0,\n    42817 => 688.0,\n    42822 => 850.0,\n    42823 => 542.0,\n    42824 => 683.0,\n    42825 => 531.0,\n    42826 => 918.0,\n    42827 => 814.0,\n    42830 => 1406.0,\n    42831 => 1106.0,\n    42832 => 733.0,\n    42833 => 716.0,\n    42834 => 948.0,\n    42835 => 937.0,\n    42838 => 850.0,\n    42839 => 716.0,\n    42852 => 738.0,\n    42853 => 716.0,\n    42854 => 738.0,\n    42855 => 716.0,\n    42880 => 637.0,\n    42881 => 343.0,\n    42882 => 837.0,\n    42883 => 712.0,\n    42889 => 400.0,\n    42890 => 386.0,\n    42891 => 456.0,\n    42892 => 306.0,\n    42893 => 808.0,\n    42894 => 693.0,\n    42896 => 928.0,\n    42897 => 768.0,\n    42912 => 821.0,\n    42913 => 716.0,\n    42914 => 775.0,\n    42915 => 665.0,\n    42916 => 837.0,\n    42917 => 712.0,\n    42918 => 770.0,\n    42919 => 493.0,\n    42920 => 720.0,\n    42921 => 595.0,\n    42922 => 886.0,\n    43000 => 613.0,\n    43001 => 689.0,\n    43002 => 1062.0,\n    43003 => 683.0,\n    43004 => 733.0,\n    43005 => 995.0,\n    43006 => 372.0,\n    43007 => 1325.0,\n    61184 => 216.0,\n    61185 => 242.0,\n    61186 => 267.0,\n    61187 => 277.0,\n    61188 => 282.0,\n    61189 => 242.0,\n    61190 => 216.0,\n    61191 => 242.0,\n    61192 => 267.0,\n    61193 => 277.0,\n    61194 => 267.0,\n    61195 => 242.0,\n    61196 => 216.0,\n    61197 => 242.0,\n    61198 => 267.0,\n    61199 => 277.0,\n    61200 => 267.0,\n    61201 => 242.0,\n    61202 => 216.0,\n    61203 => 242.0,\n    61204 => 282.0,\n    61205 => 277.0,\n    61206 => 267.0,\n    61207 => 242.0,\n    61208 => 216.0,\n    61209 => 282.0,\n    62464 => 612.0,\n    62465 => 612.0,\n    62466 => 653.0,\n    62467 => 902.0,\n    62468 => 622.0,\n    62469 => 622.0,\n    62470 => 661.0,\n    62471 => 895.0,\n    62472 => 589.0,\n    62473 => 622.0,\n    62474 => 1163.0,\n    62475 => 626.0,\n    62476 => 627.0,\n    62477 => 893.0,\n    62478 => 612.0,\n    62479 => 626.0,\n    62480 => 924.0,\n    62481 => 627.0,\n    62482 => 744.0,\n    62483 => 634.0,\n    62484 => 886.0,\n    62485 => 626.0,\n    62486 => 907.0,\n    62487 => 626.0,\n    62488 => 621.0,\n    62489 => 628.0,\n    62490 => 677.0,\n    62491 => 626.0,\n    62492 => 621.0,\n    62493 => 630.0,\n    62494 => 627.0,\n    62495 => 571.0,\n    62496 => 622.0,\n    62497 => 631.0,\n    62498 => 612.0,\n    62499 => 611.0,\n    62500 => 618.0,\n    62501 => 671.0,\n    62502 => 963.0,\n    62504 => 1023.0,\n    62505 => 844.0,\n    62506 => 563.0,\n    62507 => 563.0,\n    62508 => 563.0,\n    62509 => 563.0,\n    62510 => 563.0,\n    62511 => 563.0,\n    62512 => 555.0,\n    62513 => 555.0,\n    62514 => 555.0,\n    62515 => 555.0,\n    62516 => 573.0,\n    62517 => 573.0,\n    62518 => 573.0,\n    62519 => 824.0,\n    62520 => 824.0,\n    62521 => 824.0,\n    62522 => 824.0,\n    62523 => 824.0,\n    62524 => 611.0,\n    62525 => 611.0,\n    62526 => 611.0,\n    62527 => 611.0,\n    62528 => 611.0,\n    62529 => 611.0,\n    63173 => 687.0,\n    64256 => 810.0,\n    64257 => 741.0,\n    64258 => 741.0,\n    64259 => 1115.0,\n    64260 => 1116.0,\n    64261 => 808.0,\n    64262 => 1020.0,\n    64275 => 1388.0,\n    64276 => 1384.0,\n    64277 => 1378.0,\n    64278 => 1384.0,\n    64279 => 1713.0,\n    64285 => 294.0,\n    64286 => 0.0,\n    64287 => 519.0,\n    64288 => 665.0,\n    64289 => 939.0,\n    64290 => 788.0,\n    64291 => 920.0,\n    64292 => 786.0,\n    64293 => 857.0,\n    64294 => 869.0,\n    64295 => 821.0,\n    64296 => 890.0,\n    64297 => 838.0,\n    64298 => 758.0,\n    64299 => 758.0,\n    64300 => 758.0,\n    64301 => 758.0,\n    64302 => 728.0,\n    64303 => 728.0,\n    64304 => 728.0,\n    64305 => 610.0,\n    64306 => 447.0,\n    64307 => 588.0,\n    64308 => 687.0,\n    64309 => 437.0,\n    64310 => 485.0,\n    64312 => 679.0,\n    64313 => 435.0,\n    64314 => 578.0,\n    64315 => 566.0,\n    64316 => 605.0,\n    64318 => 724.0,\n    64320 => 453.0,\n    64321 => 680.0,\n    64323 => 675.0,\n    64324 => 658.0,\n    64326 => 653.0,\n    64327 => 736.0,\n    64328 => 602.0,\n    64329 => 758.0,\n    64330 => 683.0,\n    64331 => 343.0,\n    64332 => 610.0,\n    64333 => 566.0,\n    64334 => 658.0,\n    64335 => 710.0,\n    64338 => 1005.0,\n    64339 => 1059.0,\n    64340 => 375.0,\n    64341 => 408.0,\n    64342 => 1005.0,\n    64343 => 1059.0,\n    64344 => 375.0,\n    64345 => 408.0,\n    64346 => 1005.0,\n    64347 => 1059.0,\n    64348 => 375.0,\n    64349 => 408.0,\n    64350 => 1005.0,\n    64351 => 1059.0,\n    64352 => 375.0,\n    64353 => 408.0,\n    64354 => 1005.0,\n    64355 => 1059.0,\n    64356 => 375.0,\n    64357 => 408.0,\n    64358 => 1005.0,\n    64359 => 1059.0,\n    64360 => 375.0,\n    64361 => 408.0,\n    64362 => 1162.0,\n    64363 => 1191.0,\n    64364 => 655.0,\n    64365 => 720.0,\n    64366 => 1162.0,\n    64367 => 1191.0,\n    64368 => 655.0,\n    64369 => 720.0,\n    64370 => 721.0,\n    64371 => 721.0,\n    64372 => 721.0,\n    64373 => 721.0,\n    64374 => 721.0,\n    64375 => 721.0,\n    64376 => 721.0,\n    64377 => 721.0,\n    64378 => 721.0,\n    64379 => 721.0,\n    64380 => 721.0,\n    64381 => 721.0,\n    64382 => 721.0,\n    64383 => 721.0,\n    64384 => 721.0,\n    64385 => 721.0,\n    64386 => 513.0,\n    64387 => 578.0,\n    64388 => 513.0,\n    64389 => 578.0,\n    64390 => 513.0,\n    64391 => 578.0,\n    64392 => 513.0,\n    64393 => 578.0,\n    64394 => 576.0,\n    64395 => 622.0,\n    64396 => 576.0,\n    64397 => 622.0,\n    64398 => 1024.0,\n    64399 => 1024.0,\n    64400 => 582.0,\n    64401 => 582.0,\n    64402 => 1024.0,\n    64403 => 1024.0,\n    64404 => 582.0,\n    64405 => 582.0,\n    64406 => 1024.0,\n    64407 => 1024.0,\n    64408 => 582.0,\n    64409 => 582.0,\n    64410 => 1024.0,\n    64411 => 1024.0,\n    64412 => 582.0,\n    64413 => 582.0,\n    64414 => 854.0,\n    64415 => 900.0,\n    64416 => 854.0,\n    64417 => 900.0,\n    64418 => 375.0,\n    64419 => 408.0,\n    64426 => 938.0,\n    64427 => 880.0,\n    64428 => 693.0,\n    64429 => 660.0,\n    64467 => 824.0,\n    64468 => 843.0,\n    64469 => 476.0,\n    64470 => 552.0,\n    64471 => 622.0,\n    64472 => 627.0,\n    64473 => 622.0,\n    64474 => 627.0,\n    64475 => 622.0,\n    64476 => 627.0,\n    64478 => 622.0,\n    64479 => 627.0,\n    64484 => 917.0,\n    64485 => 1012.0,\n    64486 => 375.0,\n    64487 => 408.0,\n    64488 => 375.0,\n    64489 => 408.0,\n    64508 => 917.0,\n    64509 => 1012.0,\n    64510 => 375.0,\n    64511 => 408.0,\n    65024 => 0.0,\n    65025 => 0.0,\n    65026 => 0.0,\n    65027 => 0.0,\n    65028 => 0.0,\n    65029 => 0.0,\n    65030 => 0.0,\n    65031 => 0.0,\n    65032 => 0.0,\n    65033 => 0.0,\n    65034 => 0.0,\n    65035 => 0.0,\n    65036 => 0.0,\n    65037 => 0.0,\n    65038 => 0.0,\n    65039 => 0.0,\n    65056 => 0.0,\n    65057 => 0.0,\n    65058 => 0.0,\n    65059 => 0.0,\n    65136 => 342.0,\n    65137 => 342.0,\n    65138 => 342.0,\n    65139 => 346.0,\n    65140 => 342.0,\n    65142 => 342.0,\n    65143 => 342.0,\n    65144 => 342.0,\n    65145 => 342.0,\n    65146 => 342.0,\n    65147 => 342.0,\n    65148 => 342.0,\n    65149 => 342.0,\n    65150 => 342.0,\n    65151 => 342.0,\n    65152 => 511.0,\n    65153 => 343.0,\n    65154 => 375.0,\n    65155 => 343.0,\n    65156 => 375.0,\n    65157 => 622.0,\n    65158 => 627.0,\n    65159 => 343.0,\n    65160 => 375.0,\n    65161 => 917.0,\n    65162 => 917.0,\n    65163 => 375.0,\n    65164 => 408.0,\n    65165 => 343.0,\n    65166 => 375.0,\n    65167 => 1005.0,\n    65168 => 1059.0,\n    65169 => 375.0,\n    65170 => 408.0,\n    65171 => 590.0,\n    65172 => 606.0,\n    65173 => 1005.0,\n    65174 => 1059.0,\n    65175 => 375.0,\n    65176 => 408.0,\n    65177 => 1005.0,\n    65178 => 1059.0,\n    65179 => 375.0,\n    65180 => 408.0,\n    65181 => 721.0,\n    65182 => 721.0,\n    65183 => 721.0,\n    65184 => 721.0,\n    65185 => 721.0,\n    65186 => 721.0,\n    65187 => 721.0,\n    65188 => 721.0,\n    65189 => 721.0,\n    65190 => 721.0,\n    65191 => 721.0,\n    65192 => 721.0,\n    65193 => 513.0,\n    65194 => 578.0,\n    65195 => 513.0,\n    65196 => 578.0,\n    65197 => 576.0,\n    65198 => 622.0,\n    65199 => 576.0,\n    65200 => 622.0,\n    65201 => 1380.0,\n    65202 => 1414.0,\n    65203 => 983.0,\n    65204 => 1018.0,\n    65205 => 1380.0,\n    65206 => 1414.0,\n    65207 => 983.0,\n    65208 => 1018.0,\n    65209 => 1345.0,\n    65210 => 1364.0,\n    65211 => 966.0,\n    65212 => 985.0,\n    65213 => 1345.0,\n    65214 => 1364.0,\n    65215 => 966.0,\n    65216 => 985.0,\n    65217 => 1039.0,\n    65218 => 1071.0,\n    65219 => 942.0,\n    65220 => 974.0,\n    65221 => 1039.0,\n    65222 => 1071.0,\n    65223 => 942.0,\n    65224 => 974.0,\n    65225 => 683.0,\n    65226 => 683.0,\n    65227 => 683.0,\n    65228 => 564.0,\n    65229 => 683.0,\n    65230 => 683.0,\n    65231 => 683.0,\n    65232 => 564.0,\n    65233 => 1162.0,\n    65234 => 1191.0,\n    65235 => 655.0,\n    65236 => 720.0,\n    65237 => 894.0,\n    65238 => 901.0,\n    65239 => 655.0,\n    65240 => 720.0,\n    65241 => 917.0,\n    65242 => 931.0,\n    65243 => 582.0,\n    65244 => 582.0,\n    65245 => 868.0,\n    65246 => 893.0,\n    65247 => 375.0,\n    65248 => 408.0,\n    65249 => 733.0,\n    65250 => 784.0,\n    65251 => 619.0,\n    65252 => 670.0,\n    65253 => 854.0,\n    65254 => 900.0,\n    65255 => 375.0,\n    65256 => 408.0,\n    65257 => 590.0,\n    65258 => 606.0,\n    65259 => 693.0,\n    65260 => 660.0,\n    65261 => 622.0,\n    65262 => 627.0,\n    65263 => 917.0,\n    65264 => 1012.0,\n    65265 => 917.0,\n    65266 => 1012.0,\n    65267 => 375.0,\n    65268 => 408.0,\n    65269 => 745.0,\n    65270 => 759.0,\n    65271 => 745.0,\n    65272 => 759.0,\n    65273 => 745.0,\n    65274 => 759.0,\n    65275 => 745.0,\n    65276 => 759.0,\n    65279 => 0.0,\n    65529 => 0.0,\n    65530 => 0.0,\n    65531 => 0.0,\n    65532 => 0.0,\n    65533 => 1113.0,\n  ),\n  'CIDtoGID_Compressed' => true,\n  'CIDtoGID' => 'eJzt3AW07LiZIGBJli3LliUZHjMzMzMzMzMzMzMzMzMzMzMzMzNv5U6mtzPpJJ10kt7s6DtHtiT/kn/bZder+04VAL+RBjDQgQEIMAEFFrABAw7gQAAJXOABHwQgHAgPIoCIIBKIDKKAqCAaiA5igJggFogN4oC4IB6IDxKAhCARSAySgKQgGUgOUoCUIBVIDdKAtCAdSA8ygIwgE8gMsoCsIBvIDnKAnCAXyA3ygLwgH8gPCoCCoBAoDIqAoqAYKA5KgJKgFCgNyoCyoBwoDyqAiqASqAyqgKqgGqgOaoCaoNZvPfiQ2qAOqAvqgfqgAWgIGoHGoAloCpqB5qAFaAlagdagDWgL2oH2oAPoCDqBzqAL6Aq6ge6gB+gJeoHeoA/oC/qB/mAAGAgGgcFgCBgKhoHhYAQYCUaB0WAMGAvGgfFgApgIJoHJYAqYCqaB6WAGmAlmgdlgDpgL5oH5YAFYCBaBxWAJWAqWgeVgBVgJVoHVYA1YC9aB9WAD2Ag2gc1gC9gKtoHtYAfYCXaB3WAP2Av2gf3gADgIDoHD4Ag4Co6B4+AEOAlOgdPgDDgLzoHz4AK4CC6By+AKuAqugevgBrgJboHb4A64C+6B++ABeAgegcfgCXgKnoHn4AV4CV6B1+ANeAvegffgA/gIPoHP4Av4Cr6B7+AHBBBCBDWIoQ4NSKAJKbSgDRl0IIcCSuhCD/owgOFgeBgBRoSRYGQYBUaF0WB0GAPGhLFgbBgHxoXxYHyYACaEiWBimAQmhclgcpgCpoSpYGqYBqaF6WB6mAFmhJlgZpgFZoXZYHaYA+aEuWBumAfmhflgflgAFoSFYGFYBBaFxWBxWAKWhKVgaVgGloXlYHlYAVaElWBlWAVWhdVgdVgD1oS1YG1YB9aF9WB92AA2hI1gY9gENoXNYHPYAraErWBr2Aa2he1ge9gBdoSdYGfYBXaF3WB32AP2hL1gb9gH9oX9YH84AA6Eg+BgOAQOhcPgcDgCjoSj4Gg4Bo6F4+B4OAFOhJPgZDgFToXT4HQ4A86Es+BsOAfOhfPgfLgALoSL4GK4BC6Fy+ByuAKuhKvgargGroXr4Hq4AW6Em+BmuAVuhdvgdrgD7oS74G64B+6F++B+eAAehIfgYXgEHoXH4HF4Ap6Ep+BpeAaehefgeXgBXoSX4GV4BV6F1+B1eAPehLfgbXgH3oX34H34AD6Ej+Bj+AQ+hc/gc/gCvoSv4Gv4Br6F7+B7+AF+hJ/gZ/gFfoXf4Hf4AwEEEUIawkhHBiLIRBRZyEYMOYgjgSRykYd8FKBwKDyKgCKiSCgyioKiomgoOoqBYqJYKDaKg+KieCg+SoASokQoMUqCkqJkKDlKgVKiVCg1SoPSonQoPcqAMqJMKDPKgrKibCg7yoFyolwoN8qD8qJ8KD8qgAqiQqgwKoKKomKoOCqBSqJSqDQqg8qicqg8qoAqokqoMqqCqqJqqDqqgWqiWqg2qoPqonqoPmqAGqJGqDFqgpqiZqg5aoFaolaoNWqD2qJ2qD3qgDqiTqgz6oK6om6oO+qBeqJeqDfqg/qifqg/GoAGokFoMBqChqJhaDgagUaiUWg0GoPGonFoPJqAJqJJaDKagqaiaWg6moFmolloNpqD5qJ5aD5agBaiRWgxWvKHxxJaipah5f/9kEIr/rhe+T8fX2gVWo3WoLVoHVqPNqCNaBPajLagrWgb2o52oJ1oF9qN9qC9aB/ajw6gg+gQOoyOoKPoGDqOTqCT6BQ6jc6gs+gcOo8uoIvoErqMrqCr6Bq6jm6gm+gWuo3uoLvoHrqPHqCH6BF6jJ6gp+gZeo5eoJfoFXqN3qC36B16jz6gj+gT+oy+oK/oG/qOfmh/eIOBGtK0P77ZYE0PLY1QIZqpUc3SbI1pzl95e+Ka0KTmap7ma4EWLqwvvBZBi6hF0iJrUX6Ki6pF06JrMbSYWiwtdqgdJ1TiavG0+FoCLaGWSEusJdGSasm05FoKLaWWSkutpdHSaum09FqGUGRGLZOWWcuiZdWyadm1HFpOLZeWW8uj5dXyafm1AlpBrZBWWCuiFdWKacW1ElpJrZRWWiujldXKaeW1ClpFrZJWWauiVdWqadW1GlpNrZZWW6uj1dXqafW1BlpDrZHWWGuiNdWaac21FlpLrZXWWmujtdXaae21DlpHrZPWWeuiddW6ad21HlpPrZfWW+uj9dX6af21AdpAbZA2WBuiDdWGacO1EdpIbZQ2WhujjdXGaeO1CdpEbZI2WZuiTdWmadO1GdpMbZY2W5ujzdXmafO1BdpCbZG2WFuiLdWWacu1FdpKbZW2WlujrdXWaeu1DdpGbZO2WduibdW2adu1HdpObZe2W9uj7dX2afu1A9pB7ZB2WDuiHdWOace1E9pJ7ZR2WjujndXOaee1C9pF7ZJ2WbuiXdWuade1G9pN7ZZ2W7uj3dXuafe1B9pD7ZH2WHuiPdWeac+1F9pL7ZX2WnujvdXeae+1D9pH7ZP2WfuifdW+ad+1HxhgiBHWMMY6NjDBJqbYwjZm2MEcCyyxiz3s4wCHw+FxBBwRR8KRcRQcFUfD0XEMHBPHwrFxHBwXx8PxcQKcECfCiXESnBQnw8lxCpwSp8KpcRqcFqfD6XEGnBFnwplxFpwVZ8PZcQ6cE+fCuXEenBfnw/lxAVwQF8KFcRFcFBfDxXEJXBKXwqVxGVwWl8PlcQVcEVfClXEVXBVXw9VxDVwT18K1cR1cF9fD9XED3BA3wo1xE9wUN8PNcQvcErfCrXEb3Ba3w+1xB9wRd8KdcRfcFXfD3XEP3BP3wr1xH9wX98P98QA8EA/Cg/EQPBQPw8PxCDwSj8Kj8Rg8Fo/D4/EEPBFPwpPxFDwVT8PT8Qw8E8/Cs/EcPBfPw/PxArwQL8KL8RK8FC/Dy/EKvBKvwqvxGrwWr8Pr8Qa8EW/Cm3/5DsRb8Fa8DW/HO/BOvAvvxnvwXrwP78cH8EF8CB/GR/BRfAwfxyfwSXwKn8Zn8Fl8Dp/HF/BFfAlfxlfwVXwNX8c38M2w+W7h2/gOvovv4fv4Qaj9ED/Cj/ET/BQ/w8/xC/wSv8Kv8Rv8Fr/D7/EH/BF/wp/xF/wVf8Pf8Q8d6FBHuqZjXdcNneimTnVLt3WmOzoHQBe6/PX//PtbdFf3dF8P9HB6eD2CHlGPpEfWo+hR9Wh6dD2GHlOPpcfW4+hxw2Lj6fH/bHwCPaGeSE+sJ9GT6sn05HoKPaWeSk+tp9HT6un09HoGPaOeSc+sZ9Gz6tn07HoOPaee62fjc+t59Lx6Pj3/r8i1gF4wtCykFw4ti/zZ1qI/qxf747p4qJTQS+ql9NJ6Gb2sXk4vr1fQK+qV9Mp6Fb2qXk2vrtfQa+q19Np6Hb2uXk+vrzfQG/5spkZ6Y72J3lRvpjfXW+gt9VZ6a72N3lZvp7fXO+gd9U56Z72L3lXvpncPRfcIG9PzZ+N76b31PnpfvZ/eXx+gD9QH6YP1IfpQfZg+XB+hj9RH/TFu9E8jxuhj9XH6eH2CPlGfpE/Wp+hT9Wn6dH2GPlOfpc/W5+hz9Xn6fH2BvlBfpC/Wl+hL9WX6cn2FvlJfpa/W1+hr9XX6en2DvlHfpG/Wt+hb9W36dn2HvlPfpe/W9+h79X36fv2AflA/pB/Wj+hH9WP6cf2EflI/pZ/Wz+hn9XP6ef2CflG/9Cdn+LJ+Rb8aVrumXw8tb4TKzZ+23vrbV/AXrult/Y5+V7+n39cf6A/1R/pj/ck/Mo/yr6E/1Z/pz/UX+kv9lf5af6O/1d/p7/UP+kf9k/5Z/6J/1b/p3/UfBjCggQzNwIZuGAYxTIMalmEbzHAMbghDGq7hGf5/zWoERjgjvBHBiGhEMiIbUYyoRjQjetiWGEZMI9bvecSKoiiKoiiKovzvZMT+vTMI5RDHiBtaxgurxzcShJYJw+qJ/iQqsZHESGokC9WSGymMlEYqI7WRxkgbaqcz0hsZQuuMoZIpLDazkSW0zGpkM7IbOYycRi4jt5HHyGvkM/IbBYyCoW2FjMJG2F9YjKJGMaO4UcIoGaqXCpXSRhmjrFHOKG9UCNte0ahkVDaqGFWNakZ1o4ZR0wj7X0ujtlHn33iSFEX5BUZdo55R32hgNDQaGY2NJkZTo5nR3GhhtDRaGa2NNkZbo53R3uhgdDQ6GZ2NLkZXo5vR3ehh9DR6Gb2NPkZfo5/R3xhgDDQG/eL8g40hxlBjmDHcGGGMNEYZo40xxlhjnDHemGBMNCYZk40pxlRjmjHdmGHMNGYZs405xlxjnjHfWGAsNBYZi40lxlJjmbHcWGGsNFYZq401xlpjnbH+332mFEVRlP+3GBuMjcYmY7OxxdhqbAu1txs7jJ3GLmO3scfYa+wz9hsHjIPGIeOwccQ4ahwzjhsnjJOhuFPGaeOMcdY4Z5w3LhgXjUvGZeOKcdW4Zlw3bhg3jVvGbeOOcde4Z9w3HhgPjUehMY+NJ8ZT45nx3HhhvDReGa+NN8Zb453x3vhgfDQ+GZ+NL8ZX41so8rvxgwACCSIawQAQnRiEEJNQYhGbMOIQTgSRxCUe8UlAwpHwJAKJSCKRyCQKiUqikegkBolJYpHYJA6JS+KR+CQBSUgSkcQkCUlKkpHkJAVJSVKR1CQNSUvSkfQkA8lIMpHMJAvJSrKR7CQHyUlykdwkD8lL8pH8pAApSAqRwqQIKUqKkeKkBClJSpHSpAwpS8qR8qQCqUgqkcqkCqlKqpHqpAapSWqR2qQOqUvqkfqkAWlIGpHGpAlpSpqR5n84+6QFaUlakdakDWlL2pH2pAPpSDqRzqQL6Uq6ke6kB+lJepHepA/pS/qR/mQAGUgGkcFkCBlKhpHhZAQZSUaR0WQMGUvGkfFkAplIJoXmnUymkKlkGplOZpCZZBaZTeaQuWQemU8WkIVkEVlMlpClZBlZTlaQlWQVWU3WkLVk3f98dZD1ZAPZSDaRzWQL2Uq2ke1kB9lJdpHdZA/ZS/aR/eQAOUgOkcPkCDlKjpHj5AQ5SU6R0+QMOUvOkfPkArlILpHL5Aq5Sq6R6+QGuUlukdvkDrkbmv8euU8ekIfkEXlMnpCn5Bl5Tl6Ql+QVeU3ekLfkXSjmPflAPpJP5DP5Qr6Sb+Q7+WECE5rI1Exs6qZhEtM0qWmZtslMx+R//io3hSlN1/RM3wzMcGZ4M4IZ0YxkRjajmFHNaGZ0M4YZ86fYWGZsM44Z14xnxjcTmAnNRGZiM4mZ1Ez2C/MmN1OYKc1UZmozjZnWTGemNzOYGc1MZmYzi5nVzPbPu09/Yd/Zw5Y5/pX7+Hcyc5q5/nbU3zFfbjOPmdfMZ+Y3C5gFzUJm4V+IKWIWNYuZxc0SZkmzlFnaLGOWNcuZ5c0KZkWzklnZrGJWNauZ1c0aZk2zllnbrGPWNeuZ9c0G/8xMFUVRFEVRFEVR/vXMhmYjs7HZxGxqNjObmy3MlmYrs7XZxmxrtjPbmx3MjmYns7PZxewaiu1mdjd7mD3NXmZvs4/Z1+xn9jcHmAPNQebgsLmGmEPNYeZwc4Q50hxljjbHhPrGmuPM8eYEc6I5yZxsTjGnmtPM6eYMc6Y5y5xtzjHnmvPM+eYCc6G5yFxsLjGXmsvM5eYKc6W5ylxtrjHXmuvM9eYGc6O5ydxsbjG3mtvM7eaO0Mw7zV3mbnOPudfcZ+43D5gHzUPmYfOIedQ89heP9rh5Imx9MlRO/Y9tp/+Os3bGPGueM8+bF8yL5iXzsnnFvGpeM6+bN8yb5i3ztnnHvGveM++bD8yH5iPzsfnEfGo+M5+bL8yX5ivztfnGfGu+M9+bH36a8aP5yfxsfjG/mt/+rgv4G5nfzR8UUEgR1SimOjUooSal1KI2ZdShnAoqqUs96tOAhqPhaQQakUaikWkUGpVGo9FpDBqTxqKxaRwal8aj8WkCmpAmoolpEpqUJqPJaQqakqaiqWkampamo+lpBpqRZqKZaRaalWaj2WkOmpPmorlpHpqX5qP5aQFakBaihWkRWpQWo8VpCVqSlqKlaRlalpaj5WkFWpFWopVpFVqVVqPVaQ1ak9aitWkdWpfWo/VpA9qQNqKNaRPalDajzWkL2pK2oq1pG9qWtqPtaQfakXainWkX2pV2o91pD9qT9qK9aR/al/aj/ekAOpAOooPpEDqUDqPD6Qg6ko6io+kYOpaOo+PpBDqRTqKT6RQ6lU6j0+kMOpPOorPpHDqXzqPz6QK6kC6ii+kSupQuo8vpCrqSrqKr6Rq6lq6j6+kGupFuopvpFrqVbqPb6Q66k+6iu+keupfuo/vpAXqQHqKH6RF6lB6jx+kJepKeoqfpGXqWnqPn6QV6kV6il+kVepVeo9fpDXqT3qK36R16l96j9+kD+pA+oo/pE/qUPqPP6Qv6kr6ir+kb+pa+o+/pB/qRfvrv608/0y/0K/1Gv9MfFrCghSzNwpZuGRaxTItalmVbzHIsbok/xFvSci3P8q3ACvsunRXeimBFtCJZka0oVlQrmhXdimHFtGJZsa04VlwrnhXfSmAltBJZia0kVlIrmZXcSmGltFJZqa00VlornZXeymBltDJZma0sYfNltbJZ2a0cVk4r7G9BVm4rj5XXymfltwpYBa1CoZ7CoVIkVIqGSjGruFXCKmmVskpbZayyVjmrvFXBqmhVsipbVayqVjWrulXDqmnVsmpbday6Vj2rvtXAamg1shpbTcLmb2o1s5pbLayWViurtdXGamu1s9pbHayOViers9XF6mp1s7pbPayeVi+rt9XH6mv1s/pbA6yB1iBrsDXEGmoNs4ZbI6yR1ihrtDXGGmuNs8ZbE6yJ1iRrsjXFmmpNs6ZbM6yZoX3NsmZbc6y51jxrvrXAWmgtshZbS6yl1jJrubUitH2ltcpaba2x1lrrrPXWBmujtcnabG2xtlrbwnLdbu2wdlq7rN3WnlBrr7XP2m8dsA5ah6zD1hHrqHXMOm6dsE5ap6zT1hnrrHXOOh827oJ10boUWl+2rlhXrWvWdeuGddO6Zd0O9d2x7lr3rPvWA+uh9ch6bD2xnlrPrOfWC+ul9cp6bb2x3lrvrPfWB+uj9cn6bH2xvlrfrO/WDxvY0Ea2ZmNbtw2b2KZNbcu2bWY7NreFLW3X9mzfDuxwdng7gh3RjmRHtqPYUe1odnQ7hh3TjmXHtuPYce14dnw7gZ3QTmQntpPYSe1kdnI7hZ3STmWnttPYae10dno7g53RzmRntrPYWe1sdnY7h53TzmXntvPYee18dn67wP99ptkF7UJ2YbuIXdQuZhe3S4T1lbRL2aXtMnZZu5xd3q5gV7Qr2ZXtKnZVu5pd3a5h17Rr2bXtOnZdu55d325gN7Qb2Y1D45rYTe1mdnO7hd3SbmW3ttvYbe12dnu7wx/31dHuZHe2u9hd7W52d7uH3dPuZfe2+9h97X52f3uAPdAeZA+2h9hD7WFh8cPtEfbIsNqoX/N8tkfbY36qj7XH/bE23p7wU+/EX/us/8X5J9mT7Sn2VHuaPd2eYc+0Z9mzQ71z7Ln2PHu+vcBeaC+yF9tL7KX2Mnu5vcJeaa+yV9tr7LX2Onu9vcHeaG+yN9tb7K32Nnu7vcPeae+yd9t77L32Pnu/fcA+aB+yD9tH7KP2Mfu4fcI+aZ+yT9tn7LP2Ofu8fcG+aF+yL9tX7Kv2Nfu6fcO+ad8K7f92WG53QuWufc++bz+wH9qP7Mf2E/up/cx+br+wX9qv7Nf2G/ut/c5+b3+wP9qf7M/2F/ur/c3+bv9ggEGGmMYw05nBCDMZZRazGWMO40wwyVzmMZ8FLBwLzyKwiCzSf50RFvnn54dFYVFZNBadxWAxWSwWm8VhcVk8Fp8lYAlZIpaYJWFJWTKWnKVgKVkqlpqlYWlZOpaeZWAZWSaWmWVhWVk2lp3lYDlZLpab5WF5WT6WnxVgBVkhVpgVYUVZMVaclWAlWSlWmpVhZVk5Vp5VYBVZJVaZVWFVWTVWndVgNVktVpvVYXVZPVafNWANWSPWmDVhTVkz1py1YC1ZK9aatWFtWTvWnnVgHVkn1pl1YV1ZN9ad9WA9WS/Wm/VhfVk/1p8NYAPZIDaYDWFD2TA2nI1gI9koNpqNYWPZODaeTWAT2SQ2mU1hU9k0Np3NYDPZLDabzWFz2Tw2ny1gC9kitpgtYUvZMracrWAr2Sq2mq1ha9k6tp5tYBvZJraZbWFb2Ta2ne1gO9kutpvtYXvZPrafHWAH2SF2mB1hR9kxdpydYCfZKXaanWFn2Tl2nl1gF9kldpldYVfZNXad3WA32S12m91hd9k9dp89YA/ZI/aYPWFP2TP2nL1gL9kr9pq9YW/ZO/aefWAf2Sf2mX1hX9k39p39cIADHeRoDnZ0x3CIYzrUsRzbYY7jcEc40nEdz/GdwAnnhHciOBGdSE5kJ4oT1YnmRHdiODGdWE5sJ44T14nnxHcSOAmdRE5iJ4mT1EnmJHdSOCmdVE5qJ42T1knnpHcyOBmdTE5mJ4uT1cnmZHdyODmdXE5uJ4+T18nn5HcKOAWdQk5hp4hT1CnmFHdKOCWdUk5pp4xT1innlHcqOBWdSk5lp4pT1anmVHdqODWdWk5tp45T16nn1HcaOA2dRk5jp4nT1GnmNHdaOC2dVk5rp43T1mnntHc6OB2dTk5np4vT1enmdHd6OD2dXk5vp4/T1+nn9HcGOAOdQc5gZ4gz1BnmDHdGOCOdUc5oZ4wz1hnnjHcmOBOdSc5kZ4oz9ef3gzPNmR62nuHMdGY5s505ztyw9jxnvrPAWegsCmstdpb8lqfSP5uz1Fnm/PRrCE7YryE4K38hbtVfnGH1n7TWOGuddc56Z4Oz0dnkbHa2OFudbc52Z4ez09nl7Hb2OHudfc7+35j1Aefgr4w8FCqHw2pHfts+/xHOUecvfuL6l+/7uHPCOemcck47Z5yzzjnnvHPh98rlP5Fz0bnkXHauOFeda85154Zz07nl3HbuOHede85954Hz0HnkPHaeOE+dZ85z54Xz0nnlvHbeOG+dd85754Pz0fnkfHa+OF+db8535wcHHHLENY65zg1OuMkpt7jNGXc454JL7nKP+zzg4Xh4HoFH5JF4ZB6FR+XReHQeg8fksXhsHofH5fF4fJ6AJ+SJeGKehCflyXhynoKn5Kl4ap6Gp+XpeHqegWfkmXhmnoVn5dl4dp6D5+S5eG6eh+fl+Xh+XoAX5IV4YV6EF+XFeHFegpfkpXhpXoaX5eV4eV6BV+SVeGVehVfl1Xh1XoPX5LV4bV6H1+X1eH3egDfkjXhj3oQ35c14c96Ct+SteGvehrfl7Xh73oF35J14Z96Fd+XdeHfeg/fkvXhv3of35f14fz6AD+SD+GA+hA/lw/hwPoKP5KP4aD6Gj+Xj+Hg+gU/kk/hkPoVP5dP4dD6Dz+Sz+Gw+h8/l8/h8voAv5Iv4Yr6EL+XL+HK+gq/kq/hqvoav5ev4er6Bb+Sb+Ga+hW/l2/h2voPv5Lv4br6H7+X7+H5+gB/kh/hhfoQf5cf4cX6Cn+Sn+Gl+hp/l5/h5foFf5Jf4ZX6FX+XX+HV+g9/kt/htfoff5ff4ff6AP+SP+GP+hD/lz/hz/oK/5K/4a/6Gv+Xv+Hv+gX/kn/hn/oV/5d/4d/5DAAEFEprAQheGIMIUVFjCFkw4ggshpHCFJ3wRiHAivIggIopIIrKIIqKKaCK6iCFiilgitogj4op4Ir5IIBKKRCKxSCKSimQiuUghUopUIrVII9KKdCK9yCAyikwis8gisopsIrvIIXKKXCK3yCPyinwivyggCopCorAoIoqKYqK4KCFKilKitCgjyopyoryoICqKSqKyqCKqimqiuqghaopaoraoI+qKeqK+aCAaikaisWgimopmorloIVqKVqK1aCPaAiDaifaig+goOonOoovoKrqJ7qKH6Cl6id6ij+gr+on+YoAYKAaJwWKIGCqGieFixJ/ef2KkGCVGizG/fHf+OmLsbxo9TowXE0ToU4SYJCaLKSLs/V5ME9PFDDFTzBKzxRwxV8wT88UCsVAsEovFErFULBPLxQqxUqwSq8UasVasE+vFBrExNHKT2Cy2iK1im9gudoidYpfYLfaIvWKf2C8OiIPikDgsjoij4pg4Lk6Ik+KUOC3OiLPinDgvLoiL4pK4LK6E5rkaKtfEdXFD3PxjpqFPBuK2uCPuinvivnggHob1PhKPxRPxVDwTz8UL8VK8Eq/FG/FWvBPvxQfxUXwSn8UX8VV8E9/FDwkklEhqEktdGpJIU1JpSVsy6UguhZTSlZ70ZSDDyfAygowoI8nIMoqM+l85yGgyuowhY8pYMraMI+PKeDK+TCATykQysUwik8pkMrlMIVPKVDK1TCPThkakk+llBplRZpKZZRaZVWaT2WUOmVPmkrl/fh1kHpn37796Mt/P6vllAVlQFpKF5U+/3iGLymKyuCwhS8pSsrQsI8vKcrK8rCArykqysqwiq8pqsrqsIWvKWrK2rCPrynqyvmwgG8pGsrFsIpvKZrK5bCFbylaytWwj28p2sr3sIDvKTrKz7CK7ym6yu+whe8pesrfsI/vKfrK/HCAHykFysBwih8phcrgcIUfKUXK0HCPHynFyvJwgJ8pJcrKcIqfKaXK6nCFnyllytpwj58p5cr5cIBfKRXKxXCKXymVyuVwhV8pVcrVcI9fKdXK93CA3yk1ys9wit8ptcrvcIXfKXXK33CP3yn1yvzwgD8pD8rA8Io/KY/K4PCFPylPytDwjz8pz8ry8IC/KS/KyvCKvymvyurwhb8pb8ra8I+/Ke/K+fCAfykfysXwin8pn8rl8IV/KV/K1fCPfynfyvfwgP8pP8rP8Ir/Kb/K7/OECF7rI1Vzs6q7hEtd0qWu5tstcx+WucKXrup7ru4Ebzg3vRnAjupHcyG4UN6obzY3uxnBjurHc2G4cN64bz43vJnATuoncxG4SN6mbzE3upnBTuqnc1G4aN62bzk3vZnAzupnczG4WN6ubzc3u5nBzurnc3G4eN6+bz83vFnALuoXcwm4Rt6hbzC3ulnBLuqXc0m4Zt6xbzi3vVnArupXcym6Vn7+W3KputbB1dbfG3/9K/Me4Nd1/xq8w/tYsarv/D36byq3r1nPruw3chm4jt7Hb5O8Y2fSvbm3mNv+p3sJt6bb6hZjWbhu3rdvObe92cDu6ndzObhe3q9vN7e72cHu6vdzevyqPPr8+538et6/b71dE9XcHuAPdQe5gd4g71B3mDndHuCPdUe5od4w71h3njncnuBPdSe5kd4o71Z3mTndnuDPdWe5sd447153nzncXuAvdRX9lD4vdJe5Sd5m73F3hrnRXuavdNe5ad537u373xt3gbvxZa5O72d3ibnW3udvdHe5Od5e7293j7nX3ufvdA+5B95B72D3iHnWPucfdE+5J95R72j3z0+iz7jn3vHvBvehe+qV9/dNyvuxe+VfOr/yncq+619zr7g33pnvLve3ece+699z77gP3ofvIfew+cZ+6z9zn7gv3pfvKfe2+CY14675z37sf3I/uJ/fz753/78394n51v7nf3R8e8KCHPM3Dnu4ZHvFMj3qWZ3vMczzuCU96rud5vhd44bzwXgQvohfJi+xF8aJ60bzoXgwv5i/N78XyYntxvLhePC++l8BL6CXyEntJvKReMi+5l8JL6aXyUntpvLReOi+9l8HL6GXyMntZvKxeNi+7l8PL6eXycnt5vLxePi+/V8Ar6BXyCntFvKJeMa+4V8Ir6ZXySntlvLJeOa/8L+y9wr/49P2v41X8k1alsGVlr4pX1av2Z7HV/11ZKYqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKMpv49Xwanq1vNpeHa+uV8+r7zXwGnqNvMZeE6+p18xr7rXwWnqtvNZeG6+t185r73XwOnqdvM5eF6+r183r7vXwenq9vN5eH6+v18/r7w3wBnqDvMHeEG+oN8wb7o3wRnqjvNHeGG+sN84b703wJnqTvMneFG+qN82b/nsfv6IoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIoiqIo///wZngzvVnebG+ON9eb5833FngLvUXeYm+Jt9Rb5i33VngrvVXeam+Nt9Zb5633NngbvU3eZm+Lt9Xb5m33dng7vV3ebm+Pt9fb5+33DngHvUPeYe+Id9Q75h3/vY9PUf7AO+Gd9E55p39qn/HOhq3PeefD1he8i94l7/Ivjr3iXfWuede9G95N75Z327vj3fXuefe9B/9gLg+9R95j78mf9D31noWtn3sv/rFZ/zN4L71X3mvvjffWe+e99z54H71P3mfvi/fV++Z9/ynqhw986CNf+0PLx77uGz7xTZ/6lm/7zHf+O9LnvvCl7/qe7/uBH84P70fwI/qR/Mh+FD+qH82P7sf4KTamH8uP7cfx4/rxwtrx/QR+Qj+Rn9hPEtZO6if7S3n7yf0Ufko/1d97vH5qP42f1k/3s570fgY/o5/Jz+xnCbWy+tn+6vjsfg4/p5/Lz+3n8fP6+fz8fgG/4N+bxb+PX8gv7Bfxi/rF/OJ+Cb/k752PoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoijKv4tfyi/tl/HL+uX88n4Fv6Jfya/sV/Gr+tX86n4Nv6Zfy6/t1/Hr+vX8+n4Dv6HfyG/8e+esKIqiKIqi/OP8Jn5Tv5nf3G/ht/Rb+a39Nn5bv53f3u/gd/Q7+Z39Ln5Xv5vf3e/h9/R7+b39Pn5fv5/f3x/gD/QH+YP9If5Qf5g/3B/hj/RHheYb7Y/xx/rj/PH+BH+iP8mf7E/xp/rT/On+DH+mP8uf7c/x5/rz/Pn+An+hv8hf7C/5vc+BoijK78tf+ntnoCiKoijK/w7+Mn+5v8Jf6a/yV/tr/mLUWn+dv97f4G/8Wd8mf7O/xd/qb/O3+zv8nf4uf7e/x9/r7/P3+wf8g/4h/7B/xD/qH/OP+yf8k/4p/3Ro1Bn/rH/OP+9fCNUvhsol/3JoecW/Glpe86/7N/yb/i3/tn/Hv+vf8++H7emB/9B/5D/2n/hP/Wf+c/+F/9J/5b/23/hv/Xf+e/+D/9H/5H/2v/hf/W/+d/9HAAIYoEALcKAHRkACM6CBFdgBC5yAByKQgRt4gR8EQbggfBAhiBhECiIHUYKoQbQgehAjiBnECmIHcYK4QbwgfpAgSBgkChIHSYKkQbIgeZAiSBmkClIHaYK0QbogfZAhyPjzsxVkCjIHWYKs/7yrFGQLsgc5gpxBriB3kCfIG+QL8od6CwQFf4ooFBQOigRFg2JB8V81Y4mgZFAqKP3Py1FRlP80QZmgbFAuKB9UCCoGlYLKQZWgalAtqB7UCGoGtYLaf3N8naBuUC+o/+/I9R8RNAgaBo2CxkGTUL1p0CxoHrQIWgatgtZBm6Bt0C5oH3QIOgadgs5Bl6Br0C3oHvQIega9gt5Bn6Bv0C/oHwwIBgaDgsHBkGBoMCwYHowIRgajgtHBmGBsMC4YH0wIJgaTgsnBlGBqMC2YHswIZgazgtnBnGBuMC+YHywIFgaLgsXBkmBpsCxYHqwIVgargtXBmmBtsC5YH2wINgabgs3BlmBrsC3YHuwIdga7gt3BnmBvsC/YHxwIDgaHgsPBkeBocCw4HpwITgangtPBmeBscC44H1wILgaXgsvBleBqcC24HtwIbga3gtvBneBucC+4HzwIHgaPgsfBk+Bp8Cx4HrwIXgavgtdhZ+fN7319lH+34G3wLngffAg+/qH1fwDZb0Cz',\n  '_version_' => 6,\n);"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Bold Oblique\nUniqueID DejaVu Sans Bold Oblique\nFullName DejaVu Sans Bold Oblique\nVersion Version 2.37\nPostScriptName DejaVuSans-BoldOblique\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Bold Oblique\nWeight Bold\nItalicAngle -11\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1067 -385 1999 1121\nStartCharMetrics 5413\nU 32 ; WX 348 ; N space ; G 3\nU 33 ; WX 456 ; N exclam ; G 4\nU 34 ; WX 521 ; N quotedbl ; G 5\nU 35 ; WX 696 ; N numbersign ; G 6\nU 36 ; WX 696 ; N dollar ; G 7\nU 37 ; WX 1002 ; N percent ; G 8\nU 38 ; WX 872 ; N ampersand ; G 9\nU 39 ; WX 306 ; N quotesingle ; G 10\nU 40 ; WX 457 ; N parenleft ; G 11\nU 41 ; WX 457 ; N parenright ; G 12\nU 42 ; WX 523 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 380 ; N comma ; G 15\nU 45 ; WX 415 ; N hyphen ; G 16\nU 46 ; WX 380 ; N period ; G 17\nU 47 ; WX 365 ; N slash ; G 18\nU 48 ; WX 696 ; N zero ; G 19\nU 49 ; WX 696 ; N one ; G 20\nU 50 ; WX 696 ; N two ; G 21\nU 51 ; WX 696 ; N three ; G 22\nU 52 ; WX 696 ; N four ; G 23\nU 53 ; WX 696 ; N five ; G 24\nU 54 ; WX 696 ; N six ; G 25\nU 55 ; WX 696 ; N seven ; G 26\nU 56 ; WX 696 ; N eight ; G 27\nU 57 ; WX 696 ; N nine ; G 28\nU 58 ; WX 400 ; N colon ; G 29\nU 59 ; WX 400 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 580 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 774 ; N A ; G 36\nU 66 ; WX 762 ; N B ; G 37\nU 67 ; WX 734 ; N C ; G 38\nU 68 ; WX 830 ; N D ; G 39\nU 69 ; WX 683 ; N E ; G 40\nU 70 ; WX 683 ; N F ; G 41\nU 71 ; WX 821 ; N G ; G 42\nU 72 ; WX 837 ; N H ; G 43\nU 73 ; WX 372 ; N I ; G 44\nU 74 ; WX 372 ; N J ; G 45\nU 75 ; WX 775 ; N K ; G 46\nU 76 ; WX 637 ; N L ; G 47\nU 77 ; WX 995 ; N M ; G 48\nU 78 ; WX 837 ; N N ; G 49\nU 79 ; WX 850 ; N O ; G 50\nU 80 ; WX 733 ; N P ; G 51\nU 81 ; WX 850 ; N Q ; G 52\nU 82 ; WX 770 ; N R ; G 53\nU 83 ; WX 720 ; N S ; G 54\nU 84 ; WX 682 ; N T ; G 55\nU 85 ; WX 812 ; N U ; G 56\nU 86 ; WX 774 ; N V ; G 57\nU 87 ; WX 1103 ; N W ; G 58\nU 88 ; WX 771 ; N X ; G 59\nU 89 ; WX 724 ; N Y ; G 60\nU 90 ; WX 725 ; N Z ; G 61\nU 91 ; WX 457 ; N bracketleft ; G 62\nU 92 ; WX 365 ; N backslash ; G 63\nU 93 ; WX 457 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 675 ; N a ; G 68\nU 98 ; WX 716 ; N b ; G 69\nU 99 ; WX 593 ; N c ; G 70\nU 100 ; WX 716 ; N d ; G 71\nU 101 ; WX 678 ; N e ; G 72\nU 102 ; WX 435 ; N f ; G 73\nU 103 ; WX 716 ; N g ; G 74\nU 104 ; WX 712 ; N h ; G 75\nU 105 ; WX 343 ; N i ; G 76\nU 106 ; WX 343 ; N j ; G 77\nU 107 ; WX 665 ; N k ; G 78\nU 108 ; WX 343 ; N l ; G 79\nU 109 ; WX 1042 ; N m ; G 80\nU 110 ; WX 712 ; N n ; G 81\nU 111 ; WX 687 ; N o ; G 82\nU 112 ; WX 716 ; N p ; G 83\nU 113 ; WX 716 ; N q ; G 84\nU 114 ; WX 493 ; N r ; G 85\nU 115 ; WX 595 ; N s ; G 86\nU 116 ; WX 478 ; N t ; G 87\nU 117 ; WX 712 ; N u ; G 88\nU 118 ; WX 652 ; N v ; G 89\nU 119 ; WX 924 ; N w ; G 90\nU 120 ; WX 645 ; N x ; G 91\nU 121 ; WX 652 ; N y ; G 92\nU 122 ; WX 582 ; N z ; G 93\nU 123 ; WX 712 ; N braceleft ; G 94\nU 124 ; WX 365 ; N bar ; G 95\nU 125 ; WX 712 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 348 ; N nbspace ; G 98\nU 161 ; WX 456 ; N exclamdown ; G 99\nU 162 ; WX 696 ; N cent ; G 100\nU 163 ; WX 696 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 696 ; N yen ; G 103\nU 166 ; WX 365 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 564 ; N ordfeminine ; G 108\nU 171 ; WX 650 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 415 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 438 ; N twosuperior ; G 116\nU 179 ; WX 438 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 736 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 380 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 438 ; N onesuperior ; G 123\nU 186 ; WX 564 ; N ordmasculine ; G 124\nU 187 ; WX 650 ; N guillemotright ; G 125\nU 188 ; WX 1035 ; N onequarter ; G 126\nU 189 ; WX 1035 ; N onehalf ; G 127\nU 190 ; WX 1035 ; N threequarters ; G 128\nU 191 ; WX 580 ; N questiondown ; G 129\nU 192 ; WX 774 ; N Agrave ; G 130\nU 193 ; WX 774 ; N Aacute ; G 131\nU 194 ; WX 774 ; N Acircumflex ; G 132\nU 195 ; WX 774 ; N Atilde ; G 133\nU 196 ; WX 774 ; N Adieresis ; G 134\nU 197 ; WX 774 ; N Aring ; G 135\nU 198 ; WX 1085 ; N AE ; G 136\nU 199 ; WX 734 ; N Ccedilla ; G 137\nU 200 ; WX 683 ; N Egrave ; G 138\nU 201 ; WX 683 ; N Eacute ; G 139\nU 202 ; WX 683 ; N Ecircumflex ; G 140\nU 203 ; WX 683 ; N Edieresis ; G 141\nU 204 ; WX 372 ; N Igrave ; G 142\nU 205 ; WX 372 ; N Iacute ; G 143\nU 206 ; WX 372 ; N Icircumflex ; G 144\nU 207 ; WX 372 ; N Idieresis ; G 145\nU 208 ; WX 845 ; N Eth ; G 146\nU 209 ; WX 837 ; N Ntilde ; G 147\nU 210 ; WX 850 ; N Ograve ; G 148\nU 211 ; WX 850 ; N Oacute ; G 149\nU 212 ; WX 850 ; N Ocircumflex ; G 150\nU 213 ; WX 850 ; N Otilde ; G 151\nU 214 ; WX 850 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 850 ; N Oslash ; G 154\nU 217 ; WX 812 ; N Ugrave ; G 155\nU 218 ; WX 812 ; N Uacute ; G 156\nU 219 ; WX 812 ; N Ucircumflex ; G 157\nU 220 ; WX 812 ; N Udieresis ; G 158\nU 221 ; WX 724 ; N Yacute ; G 159\nU 222 ; WX 742 ; N Thorn ; G 160\nU 223 ; WX 719 ; N germandbls ; G 161\nU 224 ; WX 675 ; N agrave ; G 162\nU 225 ; WX 675 ; N aacute ; G 163\nU 226 ; WX 675 ; N acircumflex ; G 164\nU 227 ; WX 675 ; N atilde ; G 165\nU 228 ; WX 675 ; N adieresis ; G 166\nU 229 ; WX 675 ; N aring ; G 167\nU 230 ; WX 1048 ; N ae ; G 168\nU 231 ; WX 593 ; N ccedilla ; G 169\nU 232 ; WX 678 ; N egrave ; G 170\nU 233 ; WX 678 ; N eacute ; G 171\nU 234 ; WX 678 ; N ecircumflex ; G 172\nU 235 ; WX 678 ; N edieresis ; G 173\nU 236 ; WX 343 ; N igrave ; G 174\nU 237 ; WX 343 ; N iacute ; G 175\nU 238 ; WX 343 ; N icircumflex ; G 176\nU 239 ; WX 343 ; N idieresis ; G 177\nU 240 ; WX 687 ; N eth ; G 178\nU 241 ; WX 712 ; N ntilde ; G 179\nU 242 ; WX 687 ; N ograve ; G 180\nU 243 ; WX 687 ; N oacute ; G 181\nU 244 ; WX 687 ; N ocircumflex ; G 182\nU 245 ; WX 687 ; N otilde ; G 183\nU 246 ; WX 687 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 687 ; N oslash ; G 186\nU 249 ; WX 712 ; N ugrave ; G 187\nU 250 ; WX 712 ; N uacute ; G 188\nU 251 ; WX 712 ; N ucircumflex ; G 189\nU 252 ; WX 712 ; N udieresis ; G 190\nU 253 ; WX 652 ; N yacute ; G 191\nU 254 ; WX 716 ; N thorn ; G 192\nU 255 ; WX 652 ; N ydieresis ; G 193\nU 256 ; WX 774 ; N Amacron ; G 194\nU 257 ; WX 675 ; N amacron ; G 195\nU 258 ; WX 774 ; N Abreve ; G 196\nU 259 ; WX 675 ; N abreve ; G 197\nU 260 ; WX 774 ; N Aogonek ; G 198\nU 261 ; WX 675 ; N aogonek ; G 199\nU 262 ; WX 734 ; N Cacute ; G 200\nU 263 ; WX 593 ; N cacute ; G 201\nU 264 ; WX 734 ; N Ccircumflex ; G 202\nU 265 ; WX 593 ; N ccircumflex ; G 203\nU 266 ; WX 734 ; N Cdotaccent ; G 204\nU 267 ; WX 593 ; N cdotaccent ; G 205\nU 268 ; WX 734 ; N Ccaron ; G 206\nU 269 ; WX 593 ; N ccaron ; G 207\nU 270 ; WX 830 ; N Dcaron ; G 208\nU 271 ; WX 716 ; N dcaron ; G 209\nU 272 ; WX 845 ; N Dcroat ; G 210\nU 273 ; WX 716 ; N dmacron ; G 211\nU 274 ; WX 683 ; N Emacron ; G 212\nU 275 ; WX 678 ; N emacron ; G 213\nU 276 ; WX 683 ; N Ebreve ; G 214\nU 277 ; WX 678 ; N ebreve ; G 215\nU 278 ; WX 683 ; N Edotaccent ; G 216\nU 279 ; WX 678 ; N edotaccent ; G 217\nU 280 ; WX 683 ; N Eogonek ; G 218\nU 281 ; WX 678 ; N eogonek ; G 219\nU 282 ; WX 683 ; N Ecaron ; G 220\nU 283 ; WX 678 ; N ecaron ; G 221\nU 284 ; WX 821 ; N Gcircumflex ; G 222\nU 285 ; WX 716 ; N gcircumflex ; G 223\nU 286 ; WX 821 ; N Gbreve ; G 224\nU 287 ; WX 716 ; N gbreve ; G 225\nU 288 ; WX 821 ; N Gdotaccent ; G 226\nU 289 ; WX 716 ; N gdotaccent ; G 227\nU 290 ; WX 821 ; N Gcommaaccent ; G 228\nU 291 ; WX 716 ; N gcommaaccent ; G 229\nU 292 ; WX 837 ; N Hcircumflex ; G 230\nU 293 ; WX 712 ; N hcircumflex ; G 231\nU 294 ; WX 974 ; N Hbar ; G 232\nU 295 ; WX 790 ; N hbar ; G 233\nU 296 ; WX 372 ; N Itilde ; G 234\nU 297 ; WX 343 ; N itilde ; G 235\nU 298 ; WX 372 ; N Imacron ; G 236\nU 299 ; WX 343 ; N imacron ; G 237\nU 300 ; WX 372 ; N Ibreve ; G 238\nU 301 ; WX 343 ; N ibreve ; G 239\nU 302 ; WX 372 ; N Iogonek ; G 240\nU 303 ; WX 343 ; N iogonek ; G 241\nU 304 ; WX 372 ; N Idot ; G 242\nU 305 ; WX 343 ; N dotlessi ; G 243\nU 306 ; WX 744 ; N IJ ; G 244\nU 307 ; WX 686 ; N ij ; G 245\nU 308 ; WX 372 ; N Jcircumflex ; G 246\nU 309 ; WX 343 ; N jcircumflex ; G 247\nU 310 ; WX 775 ; N Kcommaaccent ; G 248\nU 311 ; WX 665 ; N kcommaaccent ; G 249\nU 312 ; WX 665 ; N kgreenlandic ; G 250\nU 313 ; WX 637 ; N Lacute ; G 251\nU 314 ; WX 343 ; N lacute ; G 252\nU 315 ; WX 637 ; N Lcommaaccent ; G 253\nU 316 ; WX 343 ; N lcommaaccent ; G 254\nU 317 ; WX 637 ; N Lcaron ; G 255\nU 318 ; WX 343 ; N lcaron ; G 256\nU 319 ; WX 637 ; N Ldot ; G 257\nU 320 ; WX 343 ; N ldot ; G 258\nU 321 ; WX 660 ; N Lslash ; G 259\nU 322 ; WX 375 ; N lslash ; G 260\nU 323 ; WX 837 ; N Nacute ; G 261\nU 324 ; WX 712 ; N nacute ; G 262\nU 325 ; WX 837 ; N Ncommaaccent ; G 263\nU 326 ; WX 712 ; N ncommaaccent ; G 264\nU 327 ; WX 837 ; N Ncaron ; G 265\nU 328 ; WX 712 ; N ncaron ; G 266\nU 329 ; WX 983 ; N napostrophe ; G 267\nU 330 ; WX 837 ; N Eng ; G 268\nU 331 ; WX 712 ; N eng ; G 269\nU 332 ; WX 850 ; N Omacron ; G 270\nU 333 ; WX 687 ; N omacron ; G 271\nU 334 ; WX 850 ; N Obreve ; G 272\nU 335 ; WX 687 ; N obreve ; G 273\nU 336 ; WX 850 ; N Ohungarumlaut ; G 274\nU 337 ; WX 687 ; N ohungarumlaut ; G 275\nU 338 ; WX 1167 ; N OE ; G 276\nU 339 ; WX 1094 ; N oe ; G 277\nU 340 ; WX 770 ; N Racute ; G 278\nU 341 ; WX 493 ; N racute ; G 279\nU 342 ; WX 770 ; N Rcommaaccent ; G 280\nU 343 ; WX 493 ; N rcommaaccent ; G 281\nU 344 ; WX 770 ; N Rcaron ; G 282\nU 345 ; WX 493 ; N rcaron ; G 283\nU 346 ; WX 720 ; N Sacute ; G 284\nU 347 ; WX 595 ; N sacute ; G 285\nU 348 ; WX 720 ; N Scircumflex ; G 286\nU 349 ; WX 595 ; N scircumflex ; G 287\nU 350 ; WX 720 ; N Scedilla ; G 288\nU 351 ; WX 595 ; N scedilla ; G 289\nU 352 ; WX 720 ; N Scaron ; G 290\nU 353 ; WX 595 ; N scaron ; G 291\nU 354 ; WX 682 ; N Tcommaaccent ; G 292\nU 355 ; WX 478 ; N tcommaaccent ; G 293\nU 356 ; WX 682 ; N Tcaron ; G 294\nU 357 ; WX 478 ; N tcaron ; G 295\nU 358 ; WX 682 ; N Tbar ; G 296\nU 359 ; WX 478 ; N tbar ; G 297\nU 360 ; WX 812 ; N Utilde ; G 298\nU 361 ; WX 712 ; N utilde ; G 299\nU 362 ; WX 812 ; N Umacron ; G 300\nU 363 ; WX 712 ; N umacron ; G 301\nU 364 ; WX 812 ; N Ubreve ; G 302\nU 365 ; WX 712 ; N ubreve ; G 303\nU 366 ; WX 812 ; N Uring ; G 304\nU 367 ; WX 712 ; N uring ; G 305\nU 368 ; WX 812 ; N Uhungarumlaut ; G 306\nU 369 ; WX 712 ; N uhungarumlaut ; G 307\nU 370 ; WX 812 ; N Uogonek ; G 308\nU 371 ; WX 712 ; N uogonek ; G 309\nU 372 ; WX 1103 ; N Wcircumflex ; G 310\nU 373 ; WX 924 ; N wcircumflex ; G 311\nU 374 ; WX 724 ; N Ycircumflex ; G 312\nU 375 ; WX 652 ; N ycircumflex ; G 313\nU 376 ; WX 724 ; N Ydieresis ; G 314\nU 377 ; WX 725 ; N Zacute ; G 315\nU 378 ; WX 582 ; N zacute ; G 316\nU 379 ; WX 725 ; N Zdotaccent ; G 317\nU 380 ; WX 582 ; N zdotaccent ; G 318\nU 381 ; WX 725 ; N Zcaron ; G 319\nU 382 ; WX 582 ; N zcaron ; G 320\nU 383 ; WX 435 ; N longs ; G 321\nU 384 ; WX 716 ; N uni0180 ; G 322\nU 385 ; WX 811 ; N uni0181 ; G 323\nU 386 ; WX 762 ; N uni0182 ; G 324\nU 387 ; WX 716 ; N uni0183 ; G 325\nU 388 ; WX 762 ; N uni0184 ; G 326\nU 389 ; WX 716 ; N uni0185 ; G 327\nU 390 ; WX 734 ; N uni0186 ; G 328\nU 391 ; WX 734 ; N uni0187 ; G 329\nU 392 ; WX 593 ; N uni0188 ; G 330\nU 393 ; WX 845 ; N uni0189 ; G 331\nU 394 ; WX 879 ; N uni018A ; G 332\nU 395 ; WX 762 ; N uni018B ; G 333\nU 396 ; WX 716 ; N uni018C ; G 334\nU 397 ; WX 687 ; N uni018D ; G 335\nU 398 ; WX 683 ; N uni018E ; G 336\nU 399 ; WX 850 ; N uni018F ; G 337\nU 400 ; WX 696 ; N uni0190 ; G 338\nU 401 ; WX 683 ; N uni0191 ; G 339\nU 402 ; WX 435 ; N florin ; G 340\nU 403 ; WX 821 ; N uni0193 ; G 341\nU 404 ; WX 793 ; N uni0194 ; G 342\nU 405 ; WX 1045 ; N uni0195 ; G 343\nU 406 ; WX 436 ; N uni0196 ; G 344\nU 407 ; WX 389 ; N uni0197 ; G 345\nU 408 ; WX 775 ; N uni0198 ; G 346\nU 409 ; WX 665 ; N uni0199 ; G 347\nU 410 ; WX 360 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 1042 ; N uni019C ; G 350\nU 413 ; WX 837 ; N uni019D ; G 351\nU 414 ; WX 712 ; N uni019E ; G 352\nU 415 ; WX 850 ; N uni019F ; G 353\nU 416 ; WX 850 ; N Ohorn ; G 354\nU 417 ; WX 687 ; N ohorn ; G 355\nU 418 ; WX 1114 ; N uni01A2 ; G 356\nU 419 ; WX 962 ; N uni01A3 ; G 357\nU 420 ; WX 782 ; N uni01A4 ; G 358\nU 421 ; WX 716 ; N uni01A5 ; G 359\nU 422 ; WX 770 ; N uni01A6 ; G 360\nU 423 ; WX 720 ; N uni01A7 ; G 361\nU 424 ; WX 595 ; N uni01A8 ; G 362\nU 425 ; WX 683 ; N uni01A9 ; G 363\nU 426 ; WX 552 ; N uni01AA ; G 364\nU 427 ; WX 478 ; N uni01AB ; G 365\nU 428 ; WX 707 ; N uni01AC ; G 366\nU 429 ; WX 478 ; N uni01AD ; G 367\nU 430 ; WX 682 ; N uni01AE ; G 368\nU 431 ; WX 812 ; N Uhorn ; G 369\nU 432 ; WX 712 ; N uhorn ; G 370\nU 433 ; WX 769 ; N uni01B1 ; G 371\nU 434 ; WX 813 ; N uni01B2 ; G 372\nU 435 ; WX 797 ; N uni01B3 ; G 373\nU 436 ; WX 778 ; N uni01B4 ; G 374\nU 437 ; WX 725 ; N uni01B5 ; G 375\nU 438 ; WX 582 ; N uni01B6 ; G 376\nU 439 ; WX 772 ; N uni01B7 ; G 377\nU 440 ; WX 772 ; N uni01B8 ; G 378\nU 441 ; WX 641 ; N uni01B9 ; G 379\nU 442 ; WX 582 ; N uni01BA ; G 380\nU 443 ; WX 696 ; N uni01BB ; G 381\nU 444 ; WX 772 ; N uni01BC ; G 382\nU 445 ; WX 641 ; N uni01BD ; G 383\nU 446 ; WX 573 ; N uni01BE ; G 384\nU 447 ; WX 716 ; N uni01BF ; G 385\nU 448 ; WX 372 ; N uni01C0 ; G 386\nU 449 ; WX 659 ; N uni01C1 ; G 387\nU 450 ; WX 544 ; N uni01C2 ; G 388\nU 451 ; WX 372 ; N uni01C3 ; G 389\nU 452 ; WX 1548 ; N uni01C4 ; G 390\nU 453 ; WX 1450 ; N uni01C5 ; G 391\nU 454 ; WX 1307 ; N uni01C6 ; G 392\nU 455 ; WX 977 ; N uni01C7 ; G 393\nU 456 ; WX 979 ; N uni01C8 ; G 394\nU 457 ; WX 670 ; N uni01C9 ; G 395\nU 458 ; WX 1193 ; N uni01CA ; G 396\nU 459 ; WX 1213 ; N uni01CB ; G 397\nU 460 ; WX 1063 ; N uni01CC ; G 398\nU 461 ; WX 774 ; N uni01CD ; G 399\nU 462 ; WX 675 ; N uni01CE ; G 400\nU 463 ; WX 372 ; N uni01CF ; G 401\nU 464 ; WX 343 ; N uni01D0 ; G 402\nU 465 ; WX 850 ; N uni01D1 ; G 403\nU 466 ; WX 687 ; N uni01D2 ; G 404\nU 467 ; WX 812 ; N uni01D3 ; G 405\nU 468 ; WX 712 ; N uni01D4 ; G 406\nU 469 ; WX 812 ; N uni01D5 ; G 407\nU 470 ; WX 712 ; N uni01D6 ; G 408\nU 471 ; WX 812 ; N uni01D7 ; G 409\nU 472 ; WX 712 ; N uni01D8 ; G 410\nU 473 ; WX 812 ; N uni01D9 ; G 411\nU 474 ; WX 712 ; N uni01DA ; G 412\nU 475 ; WX 812 ; N uni01DB ; G 413\nU 476 ; WX 712 ; N uni01DC ; G 414\nU 477 ; WX 678 ; N uni01DD ; G 415\nU 478 ; WX 774 ; N uni01DE ; G 416\nU 479 ; WX 675 ; N uni01DF ; G 417\nU 480 ; WX 774 ; N uni01E0 ; G 418\nU 481 ; WX 675 ; N uni01E1 ; G 419\nU 482 ; WX 1085 ; N uni01E2 ; G 420\nU 483 ; WX 1048 ; N uni01E3 ; G 421\nU 484 ; WX 821 ; N uni01E4 ; G 422\nU 485 ; WX 716 ; N uni01E5 ; G 423\nU 486 ; WX 821 ; N Gcaron ; G 424\nU 487 ; WX 716 ; N gcaron ; G 425\nU 488 ; WX 775 ; N uni01E8 ; G 426\nU 489 ; WX 665 ; N uni01E9 ; G 427\nU 490 ; WX 850 ; N uni01EA ; G 428\nU 491 ; WX 687 ; N uni01EB ; G 429\nU 492 ; WX 850 ; N uni01EC ; G 430\nU 493 ; WX 687 ; N uni01ED ; G 431\nU 494 ; WX 772 ; N uni01EE ; G 432\nU 495 ; WX 582 ; N uni01EF ; G 433\nU 496 ; WX 343 ; N uni01F0 ; G 434\nU 497 ; WX 1548 ; N uni01F1 ; G 435\nU 498 ; WX 1450 ; N uni01F2 ; G 436\nU 499 ; WX 1307 ; N uni01F3 ; G 437\nU 500 ; WX 821 ; N uni01F4 ; G 438\nU 501 ; WX 716 ; N uni01F5 ; G 439\nU 502 ; WX 1289 ; N uni01F6 ; G 440\nU 503 ; WX 787 ; N uni01F7 ; G 441\nU 504 ; WX 837 ; N uni01F8 ; G 442\nU 505 ; WX 712 ; N uni01F9 ; G 443\nU 506 ; WX 774 ; N Aringacute ; G 444\nU 507 ; WX 675 ; N aringacute ; G 445\nU 508 ; WX 1085 ; N AEacute ; G 446\nU 509 ; WX 1048 ; N aeacute ; G 447\nU 510 ; WX 850 ; N Oslashacute ; G 448\nU 511 ; WX 687 ; N oslashacute ; G 449\nU 512 ; WX 774 ; N uni0200 ; G 450\nU 513 ; WX 675 ; N uni0201 ; G 451\nU 514 ; WX 774 ; N uni0202 ; G 452\nU 515 ; WX 675 ; N uni0203 ; G 453\nU 516 ; WX 683 ; N uni0204 ; G 454\nU 517 ; WX 678 ; N uni0205 ; G 455\nU 518 ; WX 683 ; N uni0206 ; G 456\nU 519 ; WX 678 ; N uni0207 ; G 457\nU 520 ; WX 372 ; N uni0208 ; G 458\nU 521 ; WX 343 ; N uni0209 ; G 459\nU 522 ; WX 372 ; N uni020A ; G 460\nU 523 ; WX 343 ; N uni020B ; G 461\nU 524 ; WX 850 ; N uni020C ; G 462\nU 525 ; WX 687 ; N uni020D ; G 463\nU 526 ; WX 850 ; N uni020E ; G 464\nU 527 ; WX 687 ; N uni020F ; G 465\nU 528 ; WX 770 ; N uni0210 ; G 466\nU 529 ; WX 493 ; N uni0211 ; G 467\nU 530 ; WX 770 ; N uni0212 ; G 468\nU 531 ; WX 493 ; N uni0213 ; G 469\nU 532 ; WX 812 ; N uni0214 ; G 470\nU 533 ; WX 712 ; N uni0215 ; G 471\nU 534 ; WX 812 ; N uni0216 ; G 472\nU 535 ; WX 712 ; N uni0217 ; G 473\nU 536 ; WX 720 ; N Scommaaccent ; G 474\nU 537 ; WX 595 ; N scommaaccent ; G 475\nU 538 ; WX 682 ; N uni021A ; G 476\nU 539 ; WX 478 ; N uni021B ; G 477\nU 540 ; WX 690 ; N uni021C ; G 478\nU 541 ; WX 607 ; N uni021D ; G 479\nU 542 ; WX 837 ; N uni021E ; G 480\nU 543 ; WX 712 ; N uni021F ; G 481\nU 544 ; WX 837 ; N uni0220 ; G 482\nU 545 ; WX 865 ; N uni0221 ; G 483\nU 546 ; WX 809 ; N uni0222 ; G 484\nU 547 ; WX 659 ; N uni0223 ; G 485\nU 548 ; WX 725 ; N uni0224 ; G 486\nU 549 ; WX 582 ; N uni0225 ; G 487\nU 550 ; WX 774 ; N uni0226 ; G 488\nU 551 ; WX 675 ; N uni0227 ; G 489\nU 552 ; WX 683 ; N uni0228 ; G 490\nU 553 ; WX 678 ; N uni0229 ; G 491\nU 554 ; WX 850 ; N uni022A ; G 492\nU 555 ; WX 687 ; N uni022B ; G 493\nU 556 ; WX 850 ; N uni022C ; G 494\nU 557 ; WX 687 ; N uni022D ; G 495\nU 558 ; WX 850 ; N uni022E ; G 496\nU 559 ; WX 687 ; N uni022F ; G 497\nU 560 ; WX 850 ; N uni0230 ; G 498\nU 561 ; WX 687 ; N uni0231 ; G 499\nU 562 ; WX 724 ; N uni0232 ; G 500\nU 563 ; WX 652 ; N uni0233 ; G 501\nU 564 ; WX 492 ; N uni0234 ; G 502\nU 565 ; WX 867 ; N uni0235 ; G 503\nU 566 ; WX 512 ; N uni0236 ; G 504\nU 567 ; WX 343 ; N dotlessj ; G 505\nU 568 ; WX 1088 ; N uni0238 ; G 506\nU 569 ; WX 1088 ; N uni0239 ; G 507\nU 570 ; WX 774 ; N uni023A ; G 508\nU 571 ; WX 734 ; N uni023B ; G 509\nU 572 ; WX 593 ; N uni023C ; G 510\nU 573 ; WX 637 ; N uni023D ; G 511\nU 574 ; WX 682 ; N uni023E ; G 512\nU 575 ; WX 595 ; N uni023F ; G 513\nU 576 ; WX 582 ; N uni0240 ; G 514\nU 577 ; WX 782 ; N uni0241 ; G 515\nU 578 ; WX 614 ; N uni0242 ; G 516\nU 579 ; WX 762 ; N uni0243 ; G 517\nU 580 ; WX 812 ; N uni0244 ; G 518\nU 581 ; WX 774 ; N uni0245 ; G 519\nU 582 ; WX 683 ; N uni0246 ; G 520\nU 583 ; WX 678 ; N uni0247 ; G 521\nU 584 ; WX 372 ; N uni0248 ; G 522\nU 585 ; WX 343 ; N uni0249 ; G 523\nU 586 ; WX 860 ; N uni024A ; G 524\nU 587 ; WX 791 ; N uni024B ; G 525\nU 588 ; WX 770 ; N uni024C ; G 526\nU 589 ; WX 493 ; N uni024D ; G 527\nU 590 ; WX 724 ; N uni024E ; G 528\nU 591 ; WX 652 ; N uni024F ; G 529\nU 592 ; WX 675 ; N uni0250 ; G 530\nU 593 ; WX 716 ; N uni0251 ; G 531\nU 594 ; WX 716 ; N uni0252 ; G 532\nU 595 ; WX 716 ; N uni0253 ; G 533\nU 596 ; WX 593 ; N uni0254 ; G 534\nU 597 ; WX 593 ; N uni0255 ; G 535\nU 598 ; WX 791 ; N uni0256 ; G 536\nU 599 ; WX 792 ; N uni0257 ; G 537\nU 600 ; WX 678 ; N uni0258 ; G 538\nU 601 ; WX 678 ; N uni0259 ; G 539\nU 602 ; WX 876 ; N uni025A ; G 540\nU 603 ; WX 557 ; N uni025B ; G 541\nU 604 ; WX 545 ; N uni025C ; G 542\nU 605 ; WX 774 ; N uni025D ; G 543\nU 606 ; WX 731 ; N uni025E ; G 544\nU 607 ; WX 343 ; N uni025F ; G 545\nU 608 ; WX 792 ; N uni0260 ; G 546\nU 609 ; WX 716 ; N uni0261 ; G 547\nU 610 ; WX 627 ; N uni0262 ; G 548\nU 611 ; WX 735 ; N uni0263 ; G 549\nU 612 ; WX 635 ; N uni0264 ; G 550\nU 613 ; WX 712 ; N uni0265 ; G 551\nU 614 ; WX 712 ; N uni0266 ; G 552\nU 615 ; WX 712 ; N uni0267 ; G 553\nU 616 ; WX 545 ; N uni0268 ; G 554\nU 617 ; WX 440 ; N uni0269 ; G 555\nU 618 ; WX 545 ; N uni026A ; G 556\nU 619 ; WX 559 ; N uni026B ; G 557\nU 620 ; WX 693 ; N uni026C ; G 558\nU 621 ; WX 343 ; N uni026D ; G 559\nU 622 ; WX 841 ; N uni026E ; G 560\nU 623 ; WX 1042 ; N uni026F ; G 561\nU 624 ; WX 1042 ; N uni0270 ; G 562\nU 625 ; WX 1042 ; N uni0271 ; G 563\nU 626 ; WX 712 ; N uni0272 ; G 564\nU 627 ; WX 793 ; N uni0273 ; G 565\nU 628 ; WX 642 ; N uni0274 ; G 566\nU 629 ; WX 687 ; N uni0275 ; G 567\nU 630 ; WX 909 ; N uni0276 ; G 568\nU 631 ; WX 682 ; N uni0277 ; G 569\nU 632 ; WX 796 ; N uni0278 ; G 570\nU 633 ; WX 538 ; N uni0279 ; G 571\nU 634 ; WX 538 ; N uni027A ; G 572\nU 635 ; WX 650 ; N uni027B ; G 573\nU 636 ; WX 493 ; N uni027C ; G 574\nU 637 ; WX 493 ; N uni027D ; G 575\nU 638 ; WX 596 ; N uni027E ; G 576\nU 639 ; WX 596 ; N uni027F ; G 577\nU 640 ; WX 642 ; N uni0280 ; G 578\nU 641 ; WX 642 ; N uni0281 ; G 579\nU 642 ; WX 595 ; N uni0282 ; G 580\nU 643 ; WX 415 ; N uni0283 ; G 581\nU 644 ; WX 435 ; N uni0284 ; G 582\nU 645 ; WX 605 ; N uni0285 ; G 583\nU 646 ; WX 552 ; N uni0286 ; G 584\nU 647 ; WX 478 ; N uni0287 ; G 585\nU 648 ; WX 478 ; N uni0288 ; G 586\nU 649 ; WX 920 ; N uni0289 ; G 587\nU 650 ; WX 769 ; N uni028A ; G 588\nU 651 ; WX 670 ; N uni028B ; G 589\nU 652 ; WX 652 ; N uni028C ; G 590\nU 653 ; WX 924 ; N uni028D ; G 591\nU 654 ; WX 652 ; N uni028E ; G 592\nU 655 ; WX 724 ; N uni028F ; G 593\nU 656 ; WX 694 ; N uni0290 ; G 594\nU 657 ; WX 684 ; N uni0291 ; G 595\nU 658 ; WX 641 ; N uni0292 ; G 596\nU 659 ; WX 641 ; N uni0293 ; G 597\nU 660 ; WX 573 ; N uni0294 ; G 598\nU 661 ; WX 573 ; N uni0295 ; G 599\nU 662 ; WX 573 ; N uni0296 ; G 600\nU 663 ; WX 573 ; N uni0297 ; G 601\nU 664 ; WX 850 ; N uni0298 ; G 602\nU 665 ; WX 633 ; N uni0299 ; G 603\nU 666 ; WX 731 ; N uni029A ; G 604\nU 667 ; WX 685 ; N uni029B ; G 605\nU 668 ; WX 691 ; N uni029C ; G 606\nU 669 ; WX 343 ; N uni029D ; G 607\nU 670 ; WX 732 ; N uni029E ; G 608\nU 671 ; WX 539 ; N uni029F ; G 609\nU 672 ; WX 792 ; N uni02A0 ; G 610\nU 673 ; WX 573 ; N uni02A1 ; G 611\nU 674 ; WX 573 ; N uni02A2 ; G 612\nU 675 ; WX 1156 ; N uni02A3 ; G 613\nU 676 ; WX 1214 ; N uni02A4 ; G 614\nU 677 ; WX 1155 ; N uni02A5 ; G 615\nU 678 ; WX 975 ; N uni02A6 ; G 616\nU 679 ; WX 769 ; N uni02A7 ; G 617\nU 680 ; WX 929 ; N uni02A8 ; G 618\nU 681 ; WX 1026 ; N uni02A9 ; G 619\nU 682 ; WX 862 ; N uni02AA ; G 620\nU 683 ; WX 780 ; N uni02AB ; G 621\nU 684 ; WX 591 ; N uni02AC ; G 622\nU 685 ; WX 415 ; N uni02AD ; G 623\nU 686 ; WX 677 ; N uni02AE ; G 624\nU 687 ; WX 789 ; N uni02AF ; G 625\nU 688 ; WX 456 ; N uni02B0 ; G 626\nU 689 ; WX 456 ; N uni02B1 ; G 627\nU 690 ; WX 219 ; N uni02B2 ; G 628\nU 691 ; WX 315 ; N uni02B3 ; G 629\nU 692 ; WX 315 ; N uni02B4 ; G 630\nU 693 ; WX 315 ; N uni02B5 ; G 631\nU 694 ; WX 411 ; N uni02B6 ; G 632\nU 695 ; WX 591 ; N uni02B7 ; G 633\nU 696 ; WX 417 ; N uni02B8 ; G 634\nU 697 ; WX 302 ; N uni02B9 ; G 635\nU 698 ; WX 521 ; N uni02BA ; G 636\nU 699 ; WX 380 ; N uni02BB ; G 637\nU 700 ; WX 380 ; N uni02BC ; G 638\nU 701 ; WX 380 ; N uni02BD ; G 639\nU 702 ; WX 366 ; N uni02BE ; G 640\nU 703 ; WX 366 ; N uni02BF ; G 641\nU 704 ; WX 326 ; N uni02C0 ; G 642\nU 705 ; WX 326 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 306 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 306 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 366 ; N uni02D2 ; G 660\nU 723 ; WX 366 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 416 ; N uni02D6 ; G 664\nU 727 ; WX 328 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 351 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 412 ; N uni02E0 ; G 674\nU 737 ; WX 219 ; N uni02E1 ; G 675\nU 738 ; WX 381 ; N uni02E2 ; G 676\nU 739 ; WX 413 ; N uni02E3 ; G 677\nU 740 ; WX 326 ; N uni02E4 ; G 678\nU 741 ; WX 500 ; N uni02E5 ; G 679\nU 742 ; WX 500 ; N uni02E6 ; G 680\nU 743 ; WX 500 ; N uni02E7 ; G 681\nU 744 ; WX 500 ; N uni02E8 ; G 682\nU 745 ; WX 500 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 644 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 698 ; N uni0370 ; G 782\nU 881 ; WX 565 ; N uni0371 ; G 783\nU 882 ; WX 1022 ; N uni0372 ; G 784\nU 883 ; WX 836 ; N uni0373 ; G 785\nU 884 ; WX 302 ; N uni0374 ; G 786\nU 885 ; WX 302 ; N uni0375 ; G 787\nU 886 ; WX 837 ; N uni0376 ; G 788\nU 887 ; WX 701 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 593 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 400 ; N uni037E ; G 794\nU 895 ; WX 372 ; N uni037F ; G 795\nU 900 ; WX 441 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 797 ; N Alphatonos ; G 798\nU 903 ; WX 380 ; N anoteleia ; G 799\nU 904 ; WX 846 ; N Epsilontonos ; G 800\nU 905 ; WX 1009 ; N Etatonos ; G 801\nU 906 ; WX 563 ; N Iotatonos ; G 802\nU 908 ; WX 891 ; N Omicrontonos ; G 803\nU 910 ; WX 980 ; N Upsilontonos ; G 804\nU 911 ; WX 894 ; N Omegatonos ; G 805\nU 912 ; WX 390 ; N iotadieresistonos ; G 806\nU 913 ; WX 774 ; N Alpha ; G 807\nU 914 ; WX 762 ; N Beta ; G 808\nU 915 ; WX 637 ; N Gamma ; G 809\nU 916 ; WX 774 ; N uni0394 ; G 810\nU 917 ; WX 683 ; N Epsilon ; G 811\nU 918 ; WX 725 ; N Zeta ; G 812\nU 919 ; WX 837 ; N Eta ; G 813\nU 920 ; WX 850 ; N Theta ; G 814\nU 921 ; WX 372 ; N Iota ; G 815\nU 922 ; WX 775 ; N Kappa ; G 816\nU 923 ; WX 774 ; N Lambda ; G 817\nU 924 ; WX 995 ; N Mu ; G 818\nU 925 ; WX 837 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 850 ; N Omicron ; G 821\nU 928 ; WX 837 ; N Pi ; G 822\nU 929 ; WX 733 ; N Rho ; G 823\nU 931 ; WX 683 ; N Sigma ; G 824\nU 932 ; WX 682 ; N Tau ; G 825\nU 933 ; WX 724 ; N Upsilon ; G 826\nU 934 ; WX 850 ; N Phi ; G 827\nU 935 ; WX 771 ; N Chi ; G 828\nU 936 ; WX 850 ; N Psi ; G 829\nU 937 ; WX 850 ; N Omega ; G 830\nU 938 ; WX 372 ; N Iotadieresis ; G 831\nU 939 ; WX 724 ; N Upsilondieresis ; G 832\nU 940 ; WX 687 ; N alphatonos ; G 833\nU 941 ; WX 557 ; N epsilontonos ; G 834\nU 942 ; WX 712 ; N etatonos ; G 835\nU 943 ; WX 390 ; N iotatonos ; G 836\nU 944 ; WX 675 ; N upsilondieresistonos ; G 837\nU 945 ; WX 687 ; N alpha ; G 838\nU 946 ; WX 716 ; N beta ; G 839\nU 947 ; WX 681 ; N gamma ; G 840\nU 948 ; WX 687 ; N delta ; G 841\nU 949 ; WX 557 ; N epsilon ; G 842\nU 950 ; WX 591 ; N zeta ; G 843\nU 951 ; WX 712 ; N eta ; G 844\nU 952 ; WX 687 ; N theta ; G 845\nU 953 ; WX 390 ; N iota ; G 846\nU 954 ; WX 710 ; N kappa ; G 847\nU 955 ; WX 633 ; N lambda ; G 848\nU 956 ; WX 736 ; N uni03BC ; G 849\nU 957 ; WX 681 ; N nu ; G 850\nU 958 ; WX 591 ; N xi ; G 851\nU 959 ; WX 687 ; N omicron ; G 852\nU 960 ; WX 791 ; N pi ; G 853\nU 961 ; WX 716 ; N rho ; G 854\nU 962 ; WX 593 ; N sigma1 ; G 855\nU 963 ; WX 779 ; N sigma ; G 856\nU 964 ; WX 638 ; N tau ; G 857\nU 965 ; WX 675 ; N upsilon ; G 858\nU 966 ; WX 782 ; N phi ; G 859\nU 967 ; WX 645 ; N chi ; G 860\nU 968 ; WX 794 ; N psi ; G 861\nU 969 ; WX 869 ; N omega ; G 862\nU 970 ; WX 390 ; N iotadieresis ; G 863\nU 971 ; WX 675 ; N upsilondieresis ; G 864\nU 972 ; WX 687 ; N omicrontonos ; G 865\nU 973 ; WX 675 ; N upsilontonos ; G 866\nU 974 ; WX 869 ; N omegatonos ; G 867\nU 975 ; WX 775 ; N uni03CF ; G 868\nU 976 ; WX 651 ; N uni03D0 ; G 869\nU 977 ; WX 661 ; N theta1 ; G 870\nU 978 ; WX 746 ; N Upsilon1 ; G 871\nU 979 ; WX 981 ; N uni03D3 ; G 872\nU 980 ; WX 746 ; N uni03D4 ; G 873\nU 981 ; WX 796 ; N phi1 ; G 874\nU 982 ; WX 869 ; N omega1 ; G 875\nU 983 ; WX 744 ; N uni03D7 ; G 876\nU 984 ; WX 850 ; N uni03D8 ; G 877\nU 985 ; WX 687 ; N uni03D9 ; G 878\nU 986 ; WX 734 ; N uni03DA ; G 879\nU 987 ; WX 593 ; N uni03DB ; G 880\nU 988 ; WX 683 ; N uni03DC ; G 881\nU 989 ; WX 494 ; N uni03DD ; G 882\nU 990 ; WX 702 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 919 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 1093 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 832 ; N uni03E4 ; G 889\nU 997 ; WX 716 ; N uni03E5 ; G 890\nU 998 ; WX 928 ; N uni03E6 ; G 891\nU 999 ; WX 744 ; N uni03E7 ; G 892\nU 1000 ; WX 733 ; N uni03E8 ; G 893\nU 1001 ; WX 650 ; N uni03E9 ; G 894\nU 1002 ; WX 789 ; N uni03EA ; G 895\nU 1003 ; WX 671 ; N uni03EB ; G 896\nU 1004 ; WX 752 ; N uni03EC ; G 897\nU 1005 ; WX 716 ; N uni03ED ; G 898\nU 1006 ; WX 682 ; N uni03EE ; G 899\nU 1007 ; WX 590 ; N uni03EF ; G 900\nU 1008 ; WX 744 ; N uni03F0 ; G 901\nU 1009 ; WX 716 ; N uni03F1 ; G 902\nU 1010 ; WX 593 ; N uni03F2 ; G 903\nU 1011 ; WX 343 ; N uni03F3 ; G 904\nU 1012 ; WX 850 ; N uni03F4 ; G 905\nU 1013 ; WX 645 ; N uni03F5 ; G 906\nU 1014 ; WX 645 ; N uni03F6 ; G 907\nU 1015 ; WX 742 ; N uni03F7 ; G 908\nU 1016 ; WX 716 ; N uni03F8 ; G 909\nU 1017 ; WX 734 ; N uni03F9 ; G 910\nU 1018 ; WX 995 ; N uni03FA ; G 911\nU 1019 ; WX 732 ; N uni03FB ; G 912\nU 1020 ; WX 716 ; N uni03FC ; G 913\nU 1021 ; WX 734 ; N uni03FD ; G 914\nU 1022 ; WX 734 ; N uni03FE ; G 915\nU 1023 ; WX 698 ; N uni03FF ; G 916\nU 1024 ; WX 683 ; N uni0400 ; G 917\nU 1025 ; WX 683 ; N uni0401 ; G 918\nU 1026 ; WX 878 ; N uni0402 ; G 919\nU 1027 ; WX 637 ; N uni0403 ; G 920\nU 1028 ; WX 734 ; N uni0404 ; G 921\nU 1029 ; WX 720 ; N uni0405 ; G 922\nU 1030 ; WX 372 ; N uni0406 ; G 923\nU 1031 ; WX 372 ; N uni0407 ; G 924\nU 1032 ; WX 372 ; N uni0408 ; G 925\nU 1033 ; WX 1154 ; N uni0409 ; G 926\nU 1034 ; WX 1130 ; N uni040A ; G 927\nU 1035 ; WX 878 ; N uni040B ; G 928\nU 1036 ; WX 817 ; N uni040C ; G 929\nU 1037 ; WX 837 ; N uni040D ; G 930\nU 1038 ; WX 771 ; N uni040E ; G 931\nU 1039 ; WX 837 ; N uni040F ; G 932\nU 1040 ; WX 774 ; N uni0410 ; G 933\nU 1041 ; WX 762 ; N uni0411 ; G 934\nU 1042 ; WX 762 ; N uni0412 ; G 935\nU 1043 ; WX 637 ; N uni0413 ; G 936\nU 1044 ; WX 891 ; N uni0414 ; G 937\nU 1045 ; WX 683 ; N uni0415 ; G 938\nU 1046 ; WX 1224 ; N uni0416 ; G 939\nU 1047 ; WX 710 ; N uni0417 ; G 940\nU 1048 ; WX 837 ; N uni0418 ; G 941\nU 1049 ; WX 837 ; N uni0419 ; G 942\nU 1050 ; WX 817 ; N uni041A ; G 943\nU 1051 ; WX 831 ; N uni041B ; G 944\nU 1052 ; WX 995 ; N uni041C ; G 945\nU 1053 ; WX 837 ; N uni041D ; G 946\nU 1054 ; WX 850 ; N uni041E ; G 947\nU 1055 ; WX 837 ; N uni041F ; G 948\nU 1056 ; WX 733 ; N uni0420 ; G 949\nU 1057 ; WX 734 ; N uni0421 ; G 950\nU 1058 ; WX 682 ; N uni0422 ; G 951\nU 1059 ; WX 771 ; N uni0423 ; G 952\nU 1060 ; WX 992 ; N uni0424 ; G 953\nU 1061 ; WX 771 ; N uni0425 ; G 954\nU 1062 ; WX 928 ; N uni0426 ; G 955\nU 1063 ; WX 808 ; N uni0427 ; G 956\nU 1064 ; WX 1235 ; N uni0428 ; G 957\nU 1065 ; WX 1326 ; N uni0429 ; G 958\nU 1066 ; WX 939 ; N uni042A ; G 959\nU 1067 ; WX 1036 ; N uni042B ; G 960\nU 1068 ; WX 762 ; N uni042C ; G 961\nU 1069 ; WX 734 ; N uni042D ; G 962\nU 1070 ; WX 1174 ; N uni042E ; G 963\nU 1071 ; WX 770 ; N uni042F ; G 964\nU 1072 ; WX 675 ; N uni0430 ; G 965\nU 1073 ; WX 698 ; N uni0431 ; G 966\nU 1074 ; WX 633 ; N uni0432 ; G 967\nU 1075 ; WX 522 ; N uni0433 ; G 968\nU 1076 ; WX 808 ; N uni0434 ; G 969\nU 1077 ; WX 678 ; N uni0435 ; G 970\nU 1078 ; WX 995 ; N uni0436 ; G 971\nU 1079 ; WX 581 ; N uni0437 ; G 972\nU 1080 ; WX 701 ; N uni0438 ; G 973\nU 1081 ; WX 701 ; N uni0439 ; G 974\nU 1082 ; WX 679 ; N uni043A ; G 975\nU 1083 ; WX 732 ; N uni043B ; G 976\nU 1084 ; WX 817 ; N uni043C ; G 977\nU 1085 ; WX 691 ; N uni043D ; G 978\nU 1086 ; WX 687 ; N uni043E ; G 979\nU 1087 ; WX 691 ; N uni043F ; G 980\nU 1088 ; WX 716 ; N uni0440 ; G 981\nU 1089 ; WX 593 ; N uni0441 ; G 982\nU 1090 ; WX 580 ; N uni0442 ; G 983\nU 1091 ; WX 652 ; N uni0443 ; G 984\nU 1092 ; WX 992 ; N uni0444 ; G 985\nU 1093 ; WX 645 ; N uni0445 ; G 986\nU 1094 ; WX 741 ; N uni0446 ; G 987\nU 1095 ; WX 687 ; N uni0447 ; G 988\nU 1096 ; WX 1062 ; N uni0448 ; G 989\nU 1097 ; WX 1105 ; N uni0449 ; G 990\nU 1098 ; WX 751 ; N uni044A ; G 991\nU 1099 ; WX 904 ; N uni044B ; G 992\nU 1100 ; WX 632 ; N uni044C ; G 993\nU 1101 ; WX 593 ; N uni044D ; G 994\nU 1102 ; WX 972 ; N uni044E ; G 995\nU 1103 ; WX 642 ; N uni044F ; G 996\nU 1104 ; WX 678 ; N uni0450 ; G 997\nU 1105 ; WX 678 ; N uni0451 ; G 998\nU 1106 ; WX 714 ; N uni0452 ; G 999\nU 1107 ; WX 522 ; N uni0453 ; G 1000\nU 1108 ; WX 593 ; N uni0454 ; G 1001\nU 1109 ; WX 595 ; N uni0455 ; G 1002\nU 1110 ; WX 343 ; N uni0456 ; G 1003\nU 1111 ; WX 343 ; N uni0457 ; G 1004\nU 1112 ; WX 343 ; N uni0458 ; G 1005\nU 1113 ; WX 991 ; N uni0459 ; G 1006\nU 1114 ; WX 956 ; N uni045A ; G 1007\nU 1115 ; WX 734 ; N uni045B ; G 1008\nU 1116 ; WX 679 ; N uni045C ; G 1009\nU 1117 ; WX 701 ; N uni045D ; G 1010\nU 1118 ; WX 652 ; N uni045E ; G 1011\nU 1119 ; WX 691 ; N uni045F ; G 1012\nU 1120 ; WX 1093 ; N uni0460 ; G 1013\nU 1121 ; WX 869 ; N uni0461 ; G 1014\nU 1122 ; WX 840 ; N uni0462 ; G 1015\nU 1123 ; WX 736 ; N uni0463 ; G 1016\nU 1124 ; WX 1012 ; N uni0464 ; G 1017\nU 1125 ; WX 839 ; N uni0465 ; G 1018\nU 1126 ; WX 992 ; N uni0466 ; G 1019\nU 1127 ; WX 832 ; N uni0467 ; G 1020\nU 1128 ; WX 1358 ; N uni0468 ; G 1021\nU 1129 ; WX 1121 ; N uni0469 ; G 1022\nU 1130 ; WX 850 ; N uni046A ; G 1023\nU 1131 ; WX 687 ; N uni046B ; G 1024\nU 1132 ; WX 1236 ; N uni046C ; G 1025\nU 1133 ; WX 1007 ; N uni046D ; G 1026\nU 1134 ; WX 696 ; N uni046E ; G 1027\nU 1135 ; WX 557 ; N uni046F ; G 1028\nU 1136 ; WX 1075 ; N uni0470 ; G 1029\nU 1137 ; WX 1061 ; N uni0471 ; G 1030\nU 1138 ; WX 850 ; N uni0472 ; G 1031\nU 1139 ; WX 687 ; N uni0473 ; G 1032\nU 1140 ; WX 850 ; N uni0474 ; G 1033\nU 1141 ; WX 695 ; N uni0475 ; G 1034\nU 1142 ; WX 850 ; N uni0476 ; G 1035\nU 1143 ; WX 695 ; N uni0477 ; G 1036\nU 1144 ; WX 1148 ; N uni0478 ; G 1037\nU 1145 ; WX 1043 ; N uni0479 ; G 1038\nU 1146 ; WX 1074 ; N uni047A ; G 1039\nU 1147 ; WX 863 ; N uni047B ; G 1040\nU 1148 ; WX 1405 ; N uni047C ; G 1041\nU 1149 ; WX 1173 ; N uni047D ; G 1042\nU 1150 ; WX 1093 ; N uni047E ; G 1043\nU 1151 ; WX 869 ; N uni047F ; G 1044\nU 1152 ; WX 734 ; N uni0480 ; G 1045\nU 1153 ; WX 593 ; N uni0481 ; G 1046\nU 1154 ; WX 652 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 938 ; N uni048A ; G 1055\nU 1163 ; WX 806 ; N uni048B ; G 1056\nU 1164 ; WX 762 ; N uni048C ; G 1057\nU 1165 ; WX 611 ; N uni048D ; G 1058\nU 1166 ; WX 736 ; N uni048E ; G 1059\nU 1167 ; WX 718 ; N uni048F ; G 1060\nU 1168 ; WX 637 ; N uni0490 ; G 1061\nU 1169 ; WX 522 ; N uni0491 ; G 1062\nU 1170 ; WX 666 ; N uni0492 ; G 1063\nU 1171 ; WX 543 ; N uni0493 ; G 1064\nU 1172 ; WX 789 ; N uni0494 ; G 1065\nU 1173 ; WX 522 ; N uni0495 ; G 1066\nU 1174 ; WX 1224 ; N uni0496 ; G 1067\nU 1175 ; WX 995 ; N uni0497 ; G 1068\nU 1176 ; WX 710 ; N uni0498 ; G 1069\nU 1177 ; WX 581 ; N uni0499 ; G 1070\nU 1178 ; WX 775 ; N uni049A ; G 1071\nU 1179 ; WX 679 ; N uni049B ; G 1072\nU 1180 ; WX 817 ; N uni049C ; G 1073\nU 1181 ; WX 679 ; N uni049D ; G 1074\nU 1182 ; WX 817 ; N uni049E ; G 1075\nU 1183 ; WX 679 ; N uni049F ; G 1076\nU 1184 ; WX 1015 ; N uni04A0 ; G 1077\nU 1185 ; WX 826 ; N uni04A1 ; G 1078\nU 1186 ; WX 837 ; N uni04A2 ; G 1079\nU 1187 ; WX 691 ; N uni04A3 ; G 1080\nU 1188 ; WX 1103 ; N uni04A4 ; G 1081\nU 1189 ; WX 871 ; N uni04A5 ; G 1082\nU 1190 ; WX 1254 ; N uni04A6 ; G 1083\nU 1191 ; WX 979 ; N uni04A7 ; G 1084\nU 1192 ; WX 946 ; N uni04A8 ; G 1085\nU 1193 ; WX 859 ; N uni04A9 ; G 1086\nU 1194 ; WX 734 ; N uni04AA ; G 1087\nU 1195 ; WX 593 ; N uni04AB ; G 1088\nU 1196 ; WX 682 ; N uni04AC ; G 1089\nU 1197 ; WX 580 ; N uni04AD ; G 1090\nU 1198 ; WX 724 ; N uni04AE ; G 1091\nU 1199 ; WX 652 ; N uni04AF ; G 1092\nU 1200 ; WX 724 ; N uni04B0 ; G 1093\nU 1201 ; WX 652 ; N uni04B1 ; G 1094\nU 1202 ; WX 771 ; N uni04B2 ; G 1095\nU 1203 ; WX 645 ; N uni04B3 ; G 1096\nU 1204 ; WX 1104 ; N uni04B4 ; G 1097\nU 1205 ; WX 1001 ; N uni04B5 ; G 1098\nU 1206 ; WX 808 ; N uni04B6 ; G 1099\nU 1207 ; WX 687 ; N uni04B7 ; G 1100\nU 1208 ; WX 808 ; N uni04B8 ; G 1101\nU 1209 ; WX 687 ; N uni04B9 ; G 1102\nU 1210 ; WX 808 ; N uni04BA ; G 1103\nU 1211 ; WX 712 ; N uni04BB ; G 1104\nU 1212 ; WX 1026 ; N uni04BC ; G 1105\nU 1213 ; WX 810 ; N uni04BD ; G 1106\nU 1214 ; WX 1026 ; N uni04BE ; G 1107\nU 1215 ; WX 810 ; N uni04BF ; G 1108\nU 1216 ; WX 372 ; N uni04C0 ; G 1109\nU 1217 ; WX 1224 ; N uni04C1 ; G 1110\nU 1218 ; WX 995 ; N uni04C2 ; G 1111\nU 1219 ; WX 778 ; N uni04C3 ; G 1112\nU 1220 ; WX 629 ; N uni04C4 ; G 1113\nU 1221 ; WX 933 ; N uni04C5 ; G 1114\nU 1222 ; WX 804 ; N uni04C6 ; G 1115\nU 1223 ; WX 837 ; N uni04C7 ; G 1116\nU 1224 ; WX 691 ; N uni04C8 ; G 1117\nU 1225 ; WX 938 ; N uni04C9 ; G 1118\nU 1226 ; WX 806 ; N uni04CA ; G 1119\nU 1227 ; WX 808 ; N uni04CB ; G 1120\nU 1228 ; WX 687 ; N uni04CC ; G 1121\nU 1229 ; WX 1096 ; N uni04CD ; G 1122\nU 1230 ; WX 932 ; N uni04CE ; G 1123\nU 1231 ; WX 343 ; N uni04CF ; G 1124\nU 1232 ; WX 774 ; N uni04D0 ; G 1125\nU 1233 ; WX 675 ; N uni04D1 ; G 1126\nU 1234 ; WX 774 ; N uni04D2 ; G 1127\nU 1235 ; WX 675 ; N uni04D3 ; G 1128\nU 1236 ; WX 1085 ; N uni04D4 ; G 1129\nU 1237 ; WX 1048 ; N uni04D5 ; G 1130\nU 1238 ; WX 683 ; N uni04D6 ; G 1131\nU 1239 ; WX 678 ; N uni04D7 ; G 1132\nU 1240 ; WX 850 ; N uni04D8 ; G 1133\nU 1241 ; WX 678 ; N uni04D9 ; G 1134\nU 1242 ; WX 850 ; N uni04DA ; G 1135\nU 1243 ; WX 678 ; N uni04DB ; G 1136\nU 1244 ; WX 1224 ; N uni04DC ; G 1137\nU 1245 ; WX 995 ; N uni04DD ; G 1138\nU 1246 ; WX 710 ; N uni04DE ; G 1139\nU 1247 ; WX 581 ; N uni04DF ; G 1140\nU 1248 ; WX 772 ; N uni04E0 ; G 1141\nU 1249 ; WX 641 ; N uni04E1 ; G 1142\nU 1250 ; WX 837 ; N uni04E2 ; G 1143\nU 1251 ; WX 701 ; N uni04E3 ; G 1144\nU 1252 ; WX 837 ; N uni04E4 ; G 1145\nU 1253 ; WX 701 ; N uni04E5 ; G 1146\nU 1254 ; WX 850 ; N uni04E6 ; G 1147\nU 1255 ; WX 687 ; N uni04E7 ; G 1148\nU 1256 ; WX 850 ; N uni04E8 ; G 1149\nU 1257 ; WX 687 ; N uni04E9 ; G 1150\nU 1258 ; WX 850 ; N uni04EA ; G 1151\nU 1259 ; WX 687 ; N uni04EB ; G 1152\nU 1260 ; WX 734 ; N uni04EC ; G 1153\nU 1261 ; WX 593 ; N uni04ED ; G 1154\nU 1262 ; WX 771 ; N uni04EE ; G 1155\nU 1263 ; WX 652 ; N uni04EF ; G 1156\nU 1264 ; WX 771 ; N uni04F0 ; G 1157\nU 1265 ; WX 652 ; N uni04F1 ; G 1158\nU 1266 ; WX 771 ; N uni04F2 ; G 1159\nU 1267 ; WX 652 ; N uni04F3 ; G 1160\nU 1268 ; WX 808 ; N uni04F4 ; G 1161\nU 1269 ; WX 687 ; N uni04F5 ; G 1162\nU 1270 ; WX 637 ; N uni04F6 ; G 1163\nU 1271 ; WX 522 ; N uni04F7 ; G 1164\nU 1272 ; WX 1036 ; N uni04F8 ; G 1165\nU 1273 ; WX 904 ; N uni04F9 ; G 1166\nU 1274 ; WX 666 ; N uni04FA ; G 1167\nU 1275 ; WX 543 ; N uni04FB ; G 1168\nU 1276 ; WX 771 ; N uni04FC ; G 1169\nU 1277 ; WX 645 ; N uni04FD ; G 1170\nU 1278 ; WX 771 ; N uni04FE ; G 1171\nU 1279 ; WX 645 ; N uni04FF ; G 1172\nU 1280 ; WX 762 ; N uni0500 ; G 1173\nU 1281 ; WX 608 ; N uni0501 ; G 1174\nU 1282 ; WX 1159 ; N uni0502 ; G 1175\nU 1283 ; WX 893 ; N uni0503 ; G 1176\nU 1284 ; WX 1119 ; N uni0504 ; G 1177\nU 1285 ; WX 920 ; N uni0505 ; G 1178\nU 1286 ; WX 828 ; N uni0506 ; G 1179\nU 1287 ; WX 693 ; N uni0507 ; G 1180\nU 1288 ; WX 1242 ; N uni0508 ; G 1181\nU 1289 ; WX 1017 ; N uni0509 ; G 1182\nU 1290 ; WX 1289 ; N uni050A ; G 1183\nU 1291 ; WX 1013 ; N uni050B ; G 1184\nU 1292 ; WX 839 ; N uni050C ; G 1185\nU 1293 ; WX 638 ; N uni050D ; G 1186\nU 1294 ; WX 938 ; N uni050E ; G 1187\nU 1295 ; WX 803 ; N uni050F ; G 1188\nU 1296 ; WX 696 ; N uni0510 ; G 1189\nU 1297 ; WX 557 ; N uni0511 ; G 1190\nU 1298 ; WX 831 ; N uni0512 ; G 1191\nU 1299 ; WX 732 ; N uni0513 ; G 1192\nU 1300 ; WX 1286 ; N uni0514 ; G 1193\nU 1301 ; WX 1070 ; N uni0515 ; G 1194\nU 1302 ; WX 1065 ; N uni0516 ; G 1195\nU 1303 ; WX 982 ; N uni0517 ; G 1196\nU 1304 ; WX 1082 ; N uni0518 ; G 1197\nU 1305 ; WX 960 ; N uni0519 ; G 1198\nU 1306 ; WX 850 ; N uni051A ; G 1199\nU 1307 ; WX 716 ; N uni051B ; G 1200\nU 1308 ; WX 1103 ; N uni051C ; G 1201\nU 1309 ; WX 924 ; N uni051D ; G 1202\nU 1310 ; WX 817 ; N uni051E ; G 1203\nU 1311 ; WX 679 ; N uni051F ; G 1204\nU 1312 ; WX 1248 ; N uni0520 ; G 1205\nU 1313 ; WX 1022 ; N uni0521 ; G 1206\nU 1314 ; WX 1254 ; N uni0522 ; G 1207\nU 1315 ; WX 979 ; N uni0523 ; G 1208\nU 1316 ; WX 957 ; N uni0524 ; G 1209\nU 1317 ; WX 807 ; N uni0525 ; G 1210\nU 1329 ; WX 904 ; N uni0531 ; G 1211\nU 1330 ; WX 810 ; N uni0532 ; G 1212\nU 1331 ; WX 809 ; N uni0533 ; G 1213\nU 1332 ; WX 813 ; N uni0534 ; G 1214\nU 1333 ; WX 810 ; N uni0535 ; G 1215\nU 1334 ; WX 815 ; N uni0536 ; G 1216\nU 1335 ; WX 724 ; N uni0537 ; G 1217\nU 1336 ; WX 800 ; N uni0538 ; G 1218\nU 1337 ; WX 1004 ; N uni0539 ; G 1219\nU 1338 ; WX 809 ; N uni053A ; G 1220\nU 1339 ; WX 740 ; N uni053B ; G 1221\nU 1340 ; WX 620 ; N uni053C ; G 1222\nU 1341 ; WX 1068 ; N uni053D ; G 1223\nU 1342 ; WX 875 ; N uni053E ; G 1224\nU 1343 ; WX 792 ; N uni053F ; G 1225\nU 1344 ; WX 723 ; N uni0540 ; G 1226\nU 1345 ; WX 811 ; N uni0541 ; G 1227\nU 1346 ; WX 794 ; N uni0542 ; G 1228\nU 1347 ; WX 782 ; N uni0543 ; G 1229\nU 1348 ; WX 867 ; N uni0544 ; G 1230\nU 1349 ; WX 766 ; N uni0545 ; G 1231\nU 1350 ; WX 794 ; N uni0546 ; G 1232\nU 1351 ; WX 787 ; N uni0547 ; G 1233\nU 1352 ; WX 812 ; N uni0548 ; G 1234\nU 1353 ; WX 752 ; N uni0549 ; G 1235\nU 1354 ; WX 963 ; N uni054A ; G 1236\nU 1355 ; WX 790 ; N uni054B ; G 1237\nU 1356 ; WX 867 ; N uni054C ; G 1238\nU 1357 ; WX 812 ; N uni054D ; G 1239\nU 1358 ; WX 794 ; N uni054E ; G 1240\nU 1359 ; WX 771 ; N uni054F ; G 1241\nU 1360 ; WX 740 ; N uni0550 ; G 1242\nU 1361 ; WX 775 ; N uni0551 ; G 1243\nU 1362 ; WX 640 ; N uni0552 ; G 1244\nU 1363 ; WX 926 ; N uni0553 ; G 1245\nU 1364 ; WX 775 ; N uni0554 ; G 1246\nU 1365 ; WX 848 ; N uni0555 ; G 1247\nU 1366 ; WX 951 ; N uni0556 ; G 1248\nU 1369 ; WX 366 ; N uni0559 ; G 1249\nU 1370 ; WX 380 ; N uni055A ; G 1250\nU 1371 ; WX 342 ; N uni055B ; G 1251\nU 1372 ; WX 415 ; N uni055C ; G 1252\nU 1373 ; WX 348 ; N uni055D ; G 1253\nU 1374 ; WX 513 ; N uni055E ; G 1254\nU 1375 ; WX 521 ; N uni055F ; G 1255\nU 1377 ; WX 1043 ; N uni0561 ; G 1256\nU 1378 ; WX 713 ; N uni0562 ; G 1257\nU 1379 ; WX 782 ; N uni0563 ; G 1258\nU 1380 ; WX 786 ; N uni0564 ; G 1259\nU 1381 ; WX 713 ; N uni0565 ; G 1260\nU 1382 ; WX 715 ; N uni0566 ; G 1261\nU 1383 ; WX 628 ; N uni0567 ; G 1262\nU 1384 ; WX 713 ; N uni0568 ; G 1263\nU 1385 ; WX 840 ; N uni0569 ; G 1264\nU 1386 ; WX 782 ; N uni056A ; G 1265\nU 1387 ; WX 714 ; N uni056B ; G 1266\nU 1388 ; WX 344 ; N uni056C ; G 1267\nU 1389 ; WX 1094 ; N uni056D ; G 1268\nU 1390 ; WX 708 ; N uni056E ; G 1269\nU 1391 ; WX 714 ; N uni056F ; G 1270\nU 1392 ; WX 714 ; N uni0570 ; G 1271\nU 1393 ; WX 670 ; N uni0571 ; G 1272\nU 1394 ; WX 714 ; N uni0572 ; G 1273\nU 1395 ; WX 713 ; N uni0573 ; G 1274\nU 1396 ; WX 714 ; N uni0574 ; G 1275\nU 1397 ; WX 343 ; N uni0575 ; G 1276\nU 1398 ; WX 714 ; N uni0576 ; G 1277\nU 1399 ; WX 541 ; N uni0577 ; G 1278\nU 1400 ; WX 714 ; N uni0578 ; G 1279\nU 1401 ; WX 407 ; N uni0579 ; G 1280\nU 1402 ; WX 1043 ; N uni057A ; G 1281\nU 1403 ; WX 636 ; N uni057B ; G 1282\nU 1404 ; WX 740 ; N uni057C ; G 1283\nU 1405 ; WX 714 ; N uni057D ; G 1284\nU 1406 ; WX 714 ; N uni057E ; G 1285\nU 1407 ; WX 1038 ; N uni057F ; G 1286\nU 1408 ; WX 714 ; N uni0580 ; G 1287\nU 1409 ; WX 714 ; N uni0581 ; G 1288\nU 1410 ; WX 532 ; N uni0582 ; G 1289\nU 1411 ; WX 1038 ; N uni0583 ; G 1290\nU 1412 ; WX 720 ; N uni0584 ; G 1291\nU 1413 ; WX 689 ; N uni0585 ; G 1292\nU 1414 ; WX 904 ; N uni0586 ; G 1293\nU 1415 ; WX 902 ; N uni0587 ; G 1294\nU 1417 ; WX 400 ; N uni0589 ; G 1295\nU 1418 ; WX 415 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 415 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 372 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 372 ; N uni05C3 ; G 1316\nU 1478 ; WX 497 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 728 ; N uni05D0 ; G 1319\nU 1489 ; WX 610 ; N uni05D1 ; G 1320\nU 1490 ; WX 447 ; N uni05D2 ; G 1321\nU 1491 ; WX 588 ; N uni05D3 ; G 1322\nU 1492 ; WX 687 ; N uni05D4 ; G 1323\nU 1493 ; WX 343 ; N uni05D5 ; G 1324\nU 1494 ; WX 400 ; N uni05D6 ; G 1325\nU 1495 ; WX 687 ; N uni05D7 ; G 1326\nU 1496 ; WX 679 ; N uni05D8 ; G 1327\nU 1497 ; WX 294 ; N uni05D9 ; G 1328\nU 1498 ; WX 578 ; N uni05DA ; G 1329\nU 1499 ; WX 566 ; N uni05DB ; G 1330\nU 1500 ; WX 605 ; N uni05DC ; G 1331\nU 1501 ; WX 696 ; N uni05DD ; G 1332\nU 1502 ; WX 724 ; N uni05DE ; G 1333\nU 1503 ; WX 343 ; N uni05DF ; G 1334\nU 1504 ; WX 453 ; N uni05E0 ; G 1335\nU 1505 ; WX 680 ; N uni05E1 ; G 1336\nU 1506 ; WX 666 ; N uni05E2 ; G 1337\nU 1507 ; WX 675 ; N uni05E3 ; G 1338\nU 1508 ; WX 658 ; N uni05E4 ; G 1339\nU 1509 ; WX 661 ; N uni05E5 ; G 1340\nU 1510 ; WX 653 ; N uni05E6 ; G 1341\nU 1511 ; WX 736 ; N uni05E7 ; G 1342\nU 1512 ; WX 602 ; N uni05E8 ; G 1343\nU 1513 ; WX 749 ; N uni05E9 ; G 1344\nU 1514 ; WX 683 ; N uni05EA ; G 1345\nU 1520 ; WX 664 ; N uni05F0 ; G 1346\nU 1521 ; WX 664 ; N uni05F1 ; G 1347\nU 1522 ; WX 663 ; N uni05F2 ; G 1348\nU 1523 ; WX 444 ; N uni05F3 ; G 1349\nU 1524 ; WX 710 ; N uni05F4 ; G 1350\nU 3647 ; WX 696 ; N uni0E3F ; G 1351\nU 3713 ; WX 815 ; N uni0E81 ; G 1352\nU 3714 ; WX 748 ; N uni0E82 ; G 1353\nU 3716 ; WX 749 ; N uni0E84 ; G 1354\nU 3719 ; WX 569 ; N uni0E87 ; G 1355\nU 3720 ; WX 742 ; N uni0E88 ; G 1356\nU 3722 ; WX 744 ; N uni0E8A ; G 1357\nU 3725 ; WX 761 ; N uni0E8D ; G 1358\nU 3732 ; WX 706 ; N uni0E94 ; G 1359\nU 3733 ; WX 704 ; N uni0E95 ; G 1360\nU 3734 ; WX 747 ; N uni0E96 ; G 1361\nU 3735 ; WX 819 ; N uni0E97 ; G 1362\nU 3737 ; WX 730 ; N uni0E99 ; G 1363\nU 3738 ; WX 727 ; N uni0E9A ; G 1364\nU 3739 ; WX 727 ; N uni0E9B ; G 1365\nU 3740 ; WX 922 ; N uni0E9C ; G 1366\nU 3741 ; WX 827 ; N uni0E9D ; G 1367\nU 3742 ; WX 866 ; N uni0E9E ; G 1368\nU 3743 ; WX 866 ; N uni0E9F ; G 1369\nU 3745 ; WX 836 ; N uni0EA1 ; G 1370\nU 3746 ; WX 761 ; N uni0EA2 ; G 1371\nU 3747 ; WX 770 ; N uni0EA3 ; G 1372\nU 3749 ; WX 769 ; N uni0EA5 ; G 1373\nU 3751 ; WX 713 ; N uni0EA7 ; G 1374\nU 3754 ; WX 827 ; N uni0EAA ; G 1375\nU 3755 ; WX 1031 ; N uni0EAB ; G 1376\nU 3757 ; WX 724 ; N uni0EAD ; G 1377\nU 3758 ; WX 784 ; N uni0EAE ; G 1378\nU 3759 ; WX 934 ; N uni0EAF ; G 1379\nU 3760 ; WX 688 ; N uni0EB0 ; G 1380\nU 3761 ; WX 0 ; N uni0EB1 ; G 1381\nU 3762 ; WX 610 ; N uni0EB2 ; G 1382\nU 3763 ; WX 610 ; N uni0EB3 ; G 1383\nU 3764 ; WX 0 ; N uni0EB4 ; G 1384\nU 3765 ; WX 0 ; N uni0EB5 ; G 1385\nU 3766 ; WX 0 ; N uni0EB6 ; G 1386\nU 3767 ; WX 0 ; N uni0EB7 ; G 1387\nU 3768 ; WX 0 ; N uni0EB8 ; G 1388\nU 3769 ; WX 0 ; N uni0EB9 ; G 1389\nU 3771 ; WX 0 ; N uni0EBB ; G 1390\nU 3772 ; WX 0 ; N uni0EBC ; G 1391\nU 3773 ; WX 670 ; N uni0EBD ; G 1392\nU 3776 ; WX 516 ; N uni0EC0 ; G 1393\nU 3777 ; WX 860 ; N uni0EC1 ; G 1394\nU 3778 ; WX 516 ; N uni0EC2 ; G 1395\nU 3779 ; WX 650 ; N uni0EC3 ; G 1396\nU 3780 ; WX 632 ; N uni0EC4 ; G 1397\nU 3782 ; WX 759 ; N uni0EC6 ; G 1398\nU 3784 ; WX 0 ; N uni0EC8 ; G 1399\nU 3785 ; WX 0 ; N uni0EC9 ; G 1400\nU 3786 ; WX 0 ; N uni0ECA ; G 1401\nU 3787 ; WX 0 ; N uni0ECB ; G 1402\nU 3788 ; WX 0 ; N uni0ECC ; G 1403\nU 3789 ; WX 0 ; N uni0ECD ; G 1404\nU 3792 ; WX 771 ; N uni0ED0 ; G 1405\nU 3793 ; WX 771 ; N uni0ED1 ; G 1406\nU 3794 ; WX 693 ; N uni0ED2 ; G 1407\nU 3795 ; WX 836 ; N uni0ED3 ; G 1408\nU 3796 ; WX 729 ; N uni0ED4 ; G 1409\nU 3797 ; WX 729 ; N uni0ED5 ; G 1410\nU 3798 ; WX 849 ; N uni0ED6 ; G 1411\nU 3799 ; WX 790 ; N uni0ED7 ; G 1412\nU 3800 ; WX 759 ; N uni0ED8 ; G 1413\nU 3801 ; WX 910 ; N uni0ED9 ; G 1414\nU 3804 ; WX 1363 ; N uni0EDC ; G 1415\nU 3805 ; WX 1363 ; N uni0EDD ; G 1416\nU 4256 ; WX 874 ; N uni10A0 ; G 1417\nU 4257 ; WX 733 ; N uni10A1 ; G 1418\nU 4258 ; WX 679 ; N uni10A2 ; G 1419\nU 4259 ; WX 834 ; N uni10A3 ; G 1420\nU 4260 ; WX 615 ; N uni10A4 ; G 1421\nU 4261 ; WX 768 ; N uni10A5 ; G 1422\nU 4262 ; WX 753 ; N uni10A6 ; G 1423\nU 4263 ; WX 914 ; N uni10A7 ; G 1424\nU 4264 ; WX 453 ; N uni10A8 ; G 1425\nU 4265 ; WX 620 ; N uni10A9 ; G 1426\nU 4266 ; WX 843 ; N uni10AA ; G 1427\nU 4267 ; WX 882 ; N uni10AB ; G 1428\nU 4268 ; WX 625 ; N uni10AC ; G 1429\nU 4269 ; WX 854 ; N uni10AD ; G 1430\nU 4270 ; WX 781 ; N uni10AE ; G 1431\nU 4271 ; WX 629 ; N uni10AF ; G 1432\nU 4272 ; WX 912 ; N uni10B0 ; G 1433\nU 4273 ; WX 621 ; N uni10B1 ; G 1434\nU 4274 ; WX 620 ; N uni10B2 ; G 1435\nU 4275 ; WX 854 ; N uni10B3 ; G 1436\nU 4276 ; WX 866 ; N uni10B4 ; G 1437\nU 4277 ; WX 724 ; N uni10B5 ; G 1438\nU 4278 ; WX 630 ; N uni10B6 ; G 1439\nU 4279 ; WX 621 ; N uni10B7 ; G 1440\nU 4280 ; WX 625 ; N uni10B8 ; G 1441\nU 4281 ; WX 620 ; N uni10B9 ; G 1442\nU 4282 ; WX 818 ; N uni10BA ; G 1443\nU 4283 ; WX 874 ; N uni10BB ; G 1444\nU 4284 ; WX 615 ; N uni10BC ; G 1445\nU 4285 ; WX 623 ; N uni10BD ; G 1446\nU 4286 ; WX 625 ; N uni10BE ; G 1447\nU 4287 ; WX 725 ; N uni10BF ; G 1448\nU 4288 ; WX 844 ; N uni10C0 ; G 1449\nU 4289 ; WX 596 ; N uni10C1 ; G 1450\nU 4290 ; WX 688 ; N uni10C2 ; G 1451\nU 4291 ; WX 596 ; N uni10C3 ; G 1452\nU 4292 ; WX 594 ; N uni10C4 ; G 1453\nU 4293 ; WX 738 ; N uni10C5 ; G 1454\nU 4304 ; WX 554 ; N uni10D0 ; G 1455\nU 4305 ; WX 563 ; N uni10D1 ; G 1456\nU 4306 ; WX 622 ; N uni10D2 ; G 1457\nU 4307 ; WX 834 ; N uni10D3 ; G 1458\nU 4308 ; WX 550 ; N uni10D4 ; G 1459\nU 4309 ; WX 559 ; N uni10D5 ; G 1460\nU 4310 ; WX 546 ; N uni10D6 ; G 1461\nU 4311 ; WX 828 ; N uni10D7 ; G 1462\nU 4312 ; WX 563 ; N uni10D8 ; G 1463\nU 4313 ; WX 556 ; N uni10D9 ; G 1464\nU 4314 ; WX 1074 ; N uni10DA ; G 1465\nU 4315 ; WX 563 ; N uni10DB ; G 1466\nU 4316 ; WX 563 ; N uni10DC ; G 1467\nU 4317 ; WX 814 ; N uni10DD ; G 1468\nU 4318 ; WX 554 ; N uni10DE ; G 1469\nU 4319 ; WX 559 ; N uni10DF ; G 1470\nU 4320 ; WX 823 ; N uni10E0 ; G 1471\nU 4321 ; WX 563 ; N uni10E1 ; G 1472\nU 4322 ; WX 700 ; N uni10E2 ; G 1473\nU 4323 ; WX 582 ; N uni10E3 ; G 1474\nU 4324 ; WX 847 ; N uni10E4 ; G 1475\nU 4325 ; WX 555 ; N uni10E5 ; G 1476\nU 4326 ; WX 814 ; N uni10E6 ; G 1477\nU 4327 ; WX 559 ; N uni10E7 ; G 1478\nU 4328 ; WX 543 ; N uni10E8 ; G 1479\nU 4329 ; WX 563 ; N uni10E9 ; G 1480\nU 4330 ; WX 622 ; N uni10EA ; G 1481\nU 4331 ; WX 563 ; N uni10EB ; G 1482\nU 4332 ; WX 543 ; N uni10EC ; G 1483\nU 4333 ; WX 566 ; N uni10ED ; G 1484\nU 4334 ; WX 563 ; N uni10EE ; G 1485\nU 4335 ; WX 530 ; N uni10EF ; G 1486\nU 4336 ; WX 554 ; N uni10F0 ; G 1487\nU 4337 ; WX 554 ; N uni10F1 ; G 1488\nU 4338 ; WX 553 ; N uni10F2 ; G 1489\nU 4339 ; WX 554 ; N uni10F3 ; G 1490\nU 4340 ; WX 553 ; N uni10F4 ; G 1491\nU 4341 ; WX 583 ; N uni10F5 ; G 1492\nU 4342 ; WX 853 ; N uni10F6 ; G 1493\nU 4343 ; WX 604 ; N uni10F7 ; G 1494\nU 4344 ; WX 559 ; N uni10F8 ; G 1495\nU 4345 ; WX 632 ; N uni10F9 ; G 1496\nU 4346 ; WX 554 ; N uni10FA ; G 1497\nU 4347 ; WX 448 ; N uni10FB ; G 1498\nU 4348 ; WX 324 ; N uni10FC ; G 1499\nU 5121 ; WX 774 ; N uni1401 ; G 1500\nU 5122 ; WX 774 ; N uni1402 ; G 1501\nU 5123 ; WX 774 ; N uni1403 ; G 1502\nU 5124 ; WX 774 ; N uni1404 ; G 1503\nU 5125 ; WX 905 ; N uni1405 ; G 1504\nU 5126 ; WX 905 ; N uni1406 ; G 1505\nU 5127 ; WX 905 ; N uni1407 ; G 1506\nU 5129 ; WX 905 ; N uni1409 ; G 1507\nU 5130 ; WX 905 ; N uni140A ; G 1508\nU 5131 ; WX 905 ; N uni140B ; G 1509\nU 5132 ; WX 1018 ; N uni140C ; G 1510\nU 5133 ; WX 1009 ; N uni140D ; G 1511\nU 5134 ; WX 1018 ; N uni140E ; G 1512\nU 5135 ; WX 1009 ; N uni140F ; G 1513\nU 5136 ; WX 1018 ; N uni1410 ; G 1514\nU 5137 ; WX 1009 ; N uni1411 ; G 1515\nU 5138 ; WX 1149 ; N uni1412 ; G 1516\nU 5139 ; WX 1140 ; N uni1413 ; G 1517\nU 5140 ; WX 1149 ; N uni1414 ; G 1518\nU 5141 ; WX 1140 ; N uni1415 ; G 1519\nU 5142 ; WX 905 ; N uni1416 ; G 1520\nU 5143 ; WX 1149 ; N uni1417 ; G 1521\nU 5144 ; WX 1142 ; N uni1418 ; G 1522\nU 5145 ; WX 1149 ; N uni1419 ; G 1523\nU 5146 ; WX 1142 ; N uni141A ; G 1524\nU 5147 ; WX 905 ; N uni141B ; G 1525\nU 5149 ; WX 310 ; N uni141D ; G 1526\nU 5150 ; WX 529 ; N uni141E ; G 1527\nU 5151 ; WX 425 ; N uni141F ; G 1528\nU 5152 ; WX 425 ; N uni1420 ; G 1529\nU 5153 ; WX 395 ; N uni1421 ; G 1530\nU 5154 ; WX 395 ; N uni1422 ; G 1531\nU 5155 ; WX 395 ; N uni1423 ; G 1532\nU 5156 ; WX 395 ; N uni1424 ; G 1533\nU 5157 ; WX 564 ; N uni1425 ; G 1534\nU 5158 ; WX 470 ; N uni1426 ; G 1535\nU 5159 ; WX 310 ; N uni1427 ; G 1536\nU 5160 ; WX 395 ; N uni1428 ; G 1537\nU 5161 ; WX 395 ; N uni1429 ; G 1538\nU 5162 ; WX 395 ; N uni142A ; G 1539\nU 5163 ; WX 1213 ; N uni142B ; G 1540\nU 5164 ; WX 986 ; N uni142C ; G 1541\nU 5165 ; WX 1216 ; N uni142D ; G 1542\nU 5166 ; WX 1297 ; N uni142E ; G 1543\nU 5167 ; WX 774 ; N uni142F ; G 1544\nU 5168 ; WX 774 ; N uni1430 ; G 1545\nU 5169 ; WX 774 ; N uni1431 ; G 1546\nU 5170 ; WX 774 ; N uni1432 ; G 1547\nU 5171 ; WX 886 ; N uni1433 ; G 1548\nU 5172 ; WX 886 ; N uni1434 ; G 1549\nU 5173 ; WX 886 ; N uni1435 ; G 1550\nU 5175 ; WX 886 ; N uni1437 ; G 1551\nU 5176 ; WX 886 ; N uni1438 ; G 1552\nU 5177 ; WX 886 ; N uni1439 ; G 1553\nU 5178 ; WX 1018 ; N uni143A ; G 1554\nU 5179 ; WX 1009 ; N uni143B ; G 1555\nU 5180 ; WX 1018 ; N uni143C ; G 1556\nU 5181 ; WX 1009 ; N uni143D ; G 1557\nU 5182 ; WX 1018 ; N uni143E ; G 1558\nU 5183 ; WX 1009 ; N uni143F ; G 1559\nU 5184 ; WX 1149 ; N uni1440 ; G 1560\nU 5185 ; WX 1140 ; N uni1441 ; G 1561\nU 5186 ; WX 1149 ; N uni1442 ; G 1562\nU 5187 ; WX 1140 ; N uni1443 ; G 1563\nU 5188 ; WX 1149 ; N uni1444 ; G 1564\nU 5189 ; WX 1142 ; N uni1445 ; G 1565\nU 5190 ; WX 1149 ; N uni1446 ; G 1566\nU 5191 ; WX 1142 ; N uni1447 ; G 1567\nU 5192 ; WX 886 ; N uni1448 ; G 1568\nU 5193 ; WX 576 ; N uni1449 ; G 1569\nU 5194 ; WX 229 ; N uni144A ; G 1570\nU 5196 ; WX 812 ; N uni144C ; G 1571\nU 5197 ; WX 812 ; N uni144D ; G 1572\nU 5198 ; WX 812 ; N uni144E ; G 1573\nU 5199 ; WX 812 ; N uni144F ; G 1574\nU 5200 ; WX 815 ; N uni1450 ; G 1575\nU 5201 ; WX 815 ; N uni1451 ; G 1576\nU 5202 ; WX 815 ; N uni1452 ; G 1577\nU 5204 ; WX 815 ; N uni1454 ; G 1578\nU 5205 ; WX 815 ; N uni1455 ; G 1579\nU 5206 ; WX 815 ; N uni1456 ; G 1580\nU 5207 ; WX 1056 ; N uni1457 ; G 1581\nU 5208 ; WX 1048 ; N uni1458 ; G 1582\nU 5209 ; WX 1056 ; N uni1459 ; G 1583\nU 5210 ; WX 1048 ; N uni145A ; G 1584\nU 5211 ; WX 1056 ; N uni145B ; G 1585\nU 5212 ; WX 1048 ; N uni145C ; G 1586\nU 5213 ; WX 1060 ; N uni145D ; G 1587\nU 5214 ; WX 1054 ; N uni145E ; G 1588\nU 5215 ; WX 1060 ; N uni145F ; G 1589\nU 5216 ; WX 1054 ; N uni1460 ; G 1590\nU 5217 ; WX 1060 ; N uni1461 ; G 1591\nU 5218 ; WX 1052 ; N uni1462 ; G 1592\nU 5219 ; WX 1060 ; N uni1463 ; G 1593\nU 5220 ; WX 1052 ; N uni1464 ; G 1594\nU 5221 ; WX 1060 ; N uni1465 ; G 1595\nU 5222 ; WX 483 ; N uni1466 ; G 1596\nU 5223 ; WX 1005 ; N uni1467 ; G 1597\nU 5224 ; WX 1005 ; N uni1468 ; G 1598\nU 5225 ; WX 1023 ; N uni1469 ; G 1599\nU 5226 ; WX 1017 ; N uni146A ; G 1600\nU 5227 ; WX 743 ; N uni146B ; G 1601\nU 5228 ; WX 743 ; N uni146C ; G 1602\nU 5229 ; WX 743 ; N uni146D ; G 1603\nU 5230 ; WX 743 ; N uni146E ; G 1604\nU 5231 ; WX 743 ; N uni146F ; G 1605\nU 5232 ; WX 743 ; N uni1470 ; G 1606\nU 5233 ; WX 743 ; N uni1471 ; G 1607\nU 5234 ; WX 743 ; N uni1472 ; G 1608\nU 5235 ; WX 743 ; N uni1473 ; G 1609\nU 5236 ; WX 1029 ; N uni1474 ; G 1610\nU 5237 ; WX 975 ; N uni1475 ; G 1611\nU 5238 ; WX 980 ; N uni1476 ; G 1612\nU 5239 ; WX 975 ; N uni1477 ; G 1613\nU 5240 ; WX 980 ; N uni1478 ; G 1614\nU 5241 ; WX 975 ; N uni1479 ; G 1615\nU 5242 ; WX 1029 ; N uni147A ; G 1616\nU 5243 ; WX 975 ; N uni147B ; G 1617\nU 5244 ; WX 1029 ; N uni147C ; G 1618\nU 5245 ; WX 975 ; N uni147D ; G 1619\nU 5246 ; WX 980 ; N uni147E ; G 1620\nU 5247 ; WX 975 ; N uni147F ; G 1621\nU 5248 ; WX 980 ; N uni1480 ; G 1622\nU 5249 ; WX 975 ; N uni1481 ; G 1623\nU 5250 ; WX 980 ; N uni1482 ; G 1624\nU 5251 ; WX 501 ; N uni1483 ; G 1625\nU 5252 ; WX 501 ; N uni1484 ; G 1626\nU 5253 ; WX 938 ; N uni1485 ; G 1627\nU 5254 ; WX 938 ; N uni1486 ; G 1628\nU 5255 ; WX 938 ; N uni1487 ; G 1629\nU 5256 ; WX 938 ; N uni1488 ; G 1630\nU 5257 ; WX 743 ; N uni1489 ; G 1631\nU 5258 ; WX 743 ; N uni148A ; G 1632\nU 5259 ; WX 743 ; N uni148B ; G 1633\nU 5260 ; WX 743 ; N uni148C ; G 1634\nU 5261 ; WX 743 ; N uni148D ; G 1635\nU 5262 ; WX 743 ; N uni148E ; G 1636\nU 5263 ; WX 743 ; N uni148F ; G 1637\nU 5264 ; WX 743 ; N uni1490 ; G 1638\nU 5265 ; WX 743 ; N uni1491 ; G 1639\nU 5266 ; WX 1029 ; N uni1492 ; G 1640\nU 5267 ; WX 975 ; N uni1493 ; G 1641\nU 5268 ; WX 1029 ; N uni1494 ; G 1642\nU 5269 ; WX 975 ; N uni1495 ; G 1643\nU 5270 ; WX 1029 ; N uni1496 ; G 1644\nU 5271 ; WX 975 ; N uni1497 ; G 1645\nU 5272 ; WX 1029 ; N uni1498 ; G 1646\nU 5273 ; WX 975 ; N uni1499 ; G 1647\nU 5274 ; WX 1029 ; N uni149A ; G 1648\nU 5275 ; WX 975 ; N uni149B ; G 1649\nU 5276 ; WX 1029 ; N uni149C ; G 1650\nU 5277 ; WX 975 ; N uni149D ; G 1651\nU 5278 ; WX 1029 ; N uni149E ; G 1652\nU 5279 ; WX 975 ; N uni149F ; G 1653\nU 5280 ; WX 1029 ; N uni14A0 ; G 1654\nU 5281 ; WX 501 ; N uni14A1 ; G 1655\nU 5282 ; WX 501 ; N uni14A2 ; G 1656\nU 5283 ; WX 626 ; N uni14A3 ; G 1657\nU 5284 ; WX 626 ; N uni14A4 ; G 1658\nU 5285 ; WX 626 ; N uni14A5 ; G 1659\nU 5286 ; WX 626 ; N uni14A6 ; G 1660\nU 5287 ; WX 626 ; N uni14A7 ; G 1661\nU 5288 ; WX 626 ; N uni14A8 ; G 1662\nU 5289 ; WX 626 ; N uni14A9 ; G 1663\nU 5290 ; WX 626 ; N uni14AA ; G 1664\nU 5291 ; WX 626 ; N uni14AB ; G 1665\nU 5292 ; WX 881 ; N uni14AC ; G 1666\nU 5293 ; WX 854 ; N uni14AD ; G 1667\nU 5294 ; WX 863 ; N uni14AE ; G 1668\nU 5295 ; WX 874 ; N uni14AF ; G 1669\nU 5296 ; WX 863 ; N uni14B0 ; G 1670\nU 5297 ; WX 874 ; N uni14B1 ; G 1671\nU 5298 ; WX 881 ; N uni14B2 ; G 1672\nU 5299 ; WX 874 ; N uni14B3 ; G 1673\nU 5300 ; WX 881 ; N uni14B4 ; G 1674\nU 5301 ; WX 874 ; N uni14B5 ; G 1675\nU 5302 ; WX 863 ; N uni14B6 ; G 1676\nU 5303 ; WX 874 ; N uni14B7 ; G 1677\nU 5304 ; WX 863 ; N uni14B8 ; G 1678\nU 5305 ; WX 874 ; N uni14B9 ; G 1679\nU 5306 ; WX 863 ; N uni14BA ; G 1680\nU 5307 ; WX 436 ; N uni14BB ; G 1681\nU 5308 ; WX 548 ; N uni14BC ; G 1682\nU 5309 ; WX 436 ; N uni14BD ; G 1683\nU 5312 ; WX 988 ; N uni14C0 ; G 1684\nU 5313 ; WX 988 ; N uni14C1 ; G 1685\nU 5314 ; WX 988 ; N uni14C2 ; G 1686\nU 5315 ; WX 988 ; N uni14C3 ; G 1687\nU 5316 ; WX 931 ; N uni14C4 ; G 1688\nU 5317 ; WX 931 ; N uni14C5 ; G 1689\nU 5318 ; WX 931 ; N uni14C6 ; G 1690\nU 5319 ; WX 931 ; N uni14C7 ; G 1691\nU 5320 ; WX 931 ; N uni14C8 ; G 1692\nU 5321 ; WX 1238 ; N uni14C9 ; G 1693\nU 5322 ; WX 1247 ; N uni14CA ; G 1694\nU 5323 ; WX 1200 ; N uni14CB ; G 1695\nU 5324 ; WX 1228 ; N uni14CC ; G 1696\nU 5325 ; WX 1200 ; N uni14CD ; G 1697\nU 5326 ; WX 1228 ; N uni14CE ; G 1698\nU 5327 ; WX 931 ; N uni14CF ; G 1699\nU 5328 ; WX 660 ; N uni14D0 ; G 1700\nU 5329 ; WX 497 ; N uni14D1 ; G 1701\nU 5330 ; WX 660 ; N uni14D2 ; G 1702\nU 5331 ; WX 988 ; N uni14D3 ; G 1703\nU 5332 ; WX 988 ; N uni14D4 ; G 1704\nU 5333 ; WX 988 ; N uni14D5 ; G 1705\nU 5334 ; WX 988 ; N uni14D6 ; G 1706\nU 5335 ; WX 931 ; N uni14D7 ; G 1707\nU 5336 ; WX 931 ; N uni14D8 ; G 1708\nU 5337 ; WX 931 ; N uni14D9 ; G 1709\nU 5338 ; WX 931 ; N uni14DA ; G 1710\nU 5339 ; WX 931 ; N uni14DB ; G 1711\nU 5340 ; WX 1231 ; N uni14DC ; G 1712\nU 5341 ; WX 1247 ; N uni14DD ; G 1713\nU 5342 ; WX 1283 ; N uni14DE ; G 1714\nU 5343 ; WX 1228 ; N uni14DF ; G 1715\nU 5344 ; WX 1283 ; N uni14E0 ; G 1716\nU 5345 ; WX 1228 ; N uni14E1 ; G 1717\nU 5346 ; WX 1228 ; N uni14E2 ; G 1718\nU 5347 ; WX 1214 ; N uni14E3 ; G 1719\nU 5348 ; WX 1228 ; N uni14E4 ; G 1720\nU 5349 ; WX 1214 ; N uni14E5 ; G 1721\nU 5350 ; WX 1283 ; N uni14E6 ; G 1722\nU 5351 ; WX 1228 ; N uni14E7 ; G 1723\nU 5352 ; WX 1283 ; N uni14E8 ; G 1724\nU 5353 ; WX 1228 ; N uni14E9 ; G 1725\nU 5354 ; WX 660 ; N uni14EA ; G 1726\nU 5356 ; WX 886 ; N uni14EC ; G 1727\nU 5357 ; WX 730 ; N uni14ED ; G 1728\nU 5358 ; WX 730 ; N uni14EE ; G 1729\nU 5359 ; WX 730 ; N uni14EF ; G 1730\nU 5360 ; WX 730 ; N uni14F0 ; G 1731\nU 5361 ; WX 730 ; N uni14F1 ; G 1732\nU 5362 ; WX 730 ; N uni14F2 ; G 1733\nU 5363 ; WX 730 ; N uni14F3 ; G 1734\nU 5364 ; WX 730 ; N uni14F4 ; G 1735\nU 5365 ; WX 730 ; N uni14F5 ; G 1736\nU 5366 ; WX 998 ; N uni14F6 ; G 1737\nU 5367 ; WX 958 ; N uni14F7 ; G 1738\nU 5368 ; WX 967 ; N uni14F8 ; G 1739\nU 5369 ; WX 989 ; N uni14F9 ; G 1740\nU 5370 ; WX 967 ; N uni14FA ; G 1741\nU 5371 ; WX 989 ; N uni14FB ; G 1742\nU 5372 ; WX 998 ; N uni14FC ; G 1743\nU 5373 ; WX 958 ; N uni14FD ; G 1744\nU 5374 ; WX 998 ; N uni14FE ; G 1745\nU 5375 ; WX 958 ; N uni14FF ; G 1746\nU 5376 ; WX 967 ; N uni1500 ; G 1747\nU 5377 ; WX 989 ; N uni1501 ; G 1748\nU 5378 ; WX 967 ; N uni1502 ; G 1749\nU 5379 ; WX 989 ; N uni1503 ; G 1750\nU 5380 ; WX 967 ; N uni1504 ; G 1751\nU 5381 ; WX 493 ; N uni1505 ; G 1752\nU 5382 ; WX 460 ; N uni1506 ; G 1753\nU 5383 ; WX 493 ; N uni1507 ; G 1754\nU 5392 ; WX 923 ; N uni1510 ; G 1755\nU 5393 ; WX 923 ; N uni1511 ; G 1756\nU 5394 ; WX 923 ; N uni1512 ; G 1757\nU 5395 ; WX 1136 ; N uni1513 ; G 1758\nU 5396 ; WX 1136 ; N uni1514 ; G 1759\nU 5397 ; WX 1136 ; N uni1515 ; G 1760\nU 5398 ; WX 1136 ; N uni1516 ; G 1761\nU 5399 ; WX 1209 ; N uni1517 ; G 1762\nU 5400 ; WX 1202 ; N uni1518 ; G 1763\nU 5401 ; WX 1209 ; N uni1519 ; G 1764\nU 5402 ; WX 1202 ; N uni151A ; G 1765\nU 5403 ; WX 1209 ; N uni151B ; G 1766\nU 5404 ; WX 1202 ; N uni151C ; G 1767\nU 5405 ; WX 1431 ; N uni151D ; G 1768\nU 5406 ; WX 1420 ; N uni151E ; G 1769\nU 5407 ; WX 1431 ; N uni151F ; G 1770\nU 5408 ; WX 1420 ; N uni1520 ; G 1771\nU 5409 ; WX 1431 ; N uni1521 ; G 1772\nU 5410 ; WX 1420 ; N uni1522 ; G 1773\nU 5411 ; WX 1431 ; N uni1523 ; G 1774\nU 5412 ; WX 1420 ; N uni1524 ; G 1775\nU 5413 ; WX 746 ; N uni1525 ; G 1776\nU 5414 ; WX 776 ; N uni1526 ; G 1777\nU 5415 ; WX 776 ; N uni1527 ; G 1778\nU 5416 ; WX 776 ; N uni1528 ; G 1779\nU 5417 ; WX 776 ; N uni1529 ; G 1780\nU 5418 ; WX 776 ; N uni152A ; G 1781\nU 5419 ; WX 776 ; N uni152B ; G 1782\nU 5420 ; WX 776 ; N uni152C ; G 1783\nU 5421 ; WX 776 ; N uni152D ; G 1784\nU 5422 ; WX 776 ; N uni152E ; G 1785\nU 5423 ; WX 1003 ; N uni152F ; G 1786\nU 5424 ; WX 1003 ; N uni1530 ; G 1787\nU 5425 ; WX 1013 ; N uni1531 ; G 1788\nU 5426 ; WX 996 ; N uni1532 ; G 1789\nU 5427 ; WX 1013 ; N uni1533 ; G 1790\nU 5428 ; WX 996 ; N uni1534 ; G 1791\nU 5429 ; WX 1003 ; N uni1535 ; G 1792\nU 5430 ; WX 1003 ; N uni1536 ; G 1793\nU 5431 ; WX 1003 ; N uni1537 ; G 1794\nU 5432 ; WX 1003 ; N uni1538 ; G 1795\nU 5433 ; WX 1013 ; N uni1539 ; G 1796\nU 5434 ; WX 996 ; N uni153A ; G 1797\nU 5435 ; WX 1013 ; N uni153B ; G 1798\nU 5436 ; WX 996 ; N uni153C ; G 1799\nU 5437 ; WX 1013 ; N uni153D ; G 1800\nU 5438 ; WX 495 ; N uni153E ; G 1801\nU 5440 ; WX 395 ; N uni1540 ; G 1802\nU 5441 ; WX 510 ; N uni1541 ; G 1803\nU 5442 ; WX 1033 ; N uni1542 ; G 1804\nU 5443 ; WX 1033 ; N uni1543 ; G 1805\nU 5444 ; WX 976 ; N uni1544 ; G 1806\nU 5445 ; WX 976 ; N uni1545 ; G 1807\nU 5446 ; WX 976 ; N uni1546 ; G 1808\nU 5447 ; WX 976 ; N uni1547 ; G 1809\nU 5448 ; WX 733 ; N uni1548 ; G 1810\nU 5449 ; WX 733 ; N uni1549 ; G 1811\nU 5450 ; WX 733 ; N uni154A ; G 1812\nU 5451 ; WX 733 ; N uni154B ; G 1813\nU 5452 ; WX 733 ; N uni154C ; G 1814\nU 5453 ; WX 733 ; N uni154D ; G 1815\nU 5454 ; WX 1003 ; N uni154E ; G 1816\nU 5455 ; WX 959 ; N uni154F ; G 1817\nU 5456 ; WX 495 ; N uni1550 ; G 1818\nU 5458 ; WX 886 ; N uni1552 ; G 1819\nU 5459 ; WX 774 ; N uni1553 ; G 1820\nU 5460 ; WX 774 ; N uni1554 ; G 1821\nU 5461 ; WX 774 ; N uni1555 ; G 1822\nU 5462 ; WX 774 ; N uni1556 ; G 1823\nU 5463 ; WX 928 ; N uni1557 ; G 1824\nU 5464 ; WX 928 ; N uni1558 ; G 1825\nU 5465 ; WX 928 ; N uni1559 ; G 1826\nU 5466 ; WX 928 ; N uni155A ; G 1827\nU 5467 ; WX 1172 ; N uni155B ; G 1828\nU 5468 ; WX 1142 ; N uni155C ; G 1829\nU 5469 ; WX 602 ; N uni155D ; G 1830\nU 5470 ; WX 812 ; N uni155E ; G 1831\nU 5471 ; WX 812 ; N uni155F ; G 1832\nU 5472 ; WX 812 ; N uni1560 ; G 1833\nU 5473 ; WX 812 ; N uni1561 ; G 1834\nU 5474 ; WX 812 ; N uni1562 ; G 1835\nU 5475 ; WX 812 ; N uni1563 ; G 1836\nU 5476 ; WX 815 ; N uni1564 ; G 1837\nU 5477 ; WX 815 ; N uni1565 ; G 1838\nU 5478 ; WX 815 ; N uni1566 ; G 1839\nU 5479 ; WX 815 ; N uni1567 ; G 1840\nU 5480 ; WX 1060 ; N uni1568 ; G 1841\nU 5481 ; WX 1052 ; N uni1569 ; G 1842\nU 5482 ; WX 548 ; N uni156A ; G 1843\nU 5492 ; WX 977 ; N uni1574 ; G 1844\nU 5493 ; WX 977 ; N uni1575 ; G 1845\nU 5494 ; WX 977 ; N uni1576 ; G 1846\nU 5495 ; WX 977 ; N uni1577 ; G 1847\nU 5496 ; WX 977 ; N uni1578 ; G 1848\nU 5497 ; WX 977 ; N uni1579 ; G 1849\nU 5498 ; WX 977 ; N uni157A ; G 1850\nU 5499 ; WX 618 ; N uni157B ; G 1851\nU 5500 ; WX 837 ; N uni157C ; G 1852\nU 5501 ; WX 510 ; N uni157D ; G 1853\nU 5502 ; WX 1238 ; N uni157E ; G 1854\nU 5503 ; WX 1238 ; N uni157F ; G 1855\nU 5504 ; WX 1238 ; N uni1580 ; G 1856\nU 5505 ; WX 1238 ; N uni1581 ; G 1857\nU 5506 ; WX 1238 ; N uni1582 ; G 1858\nU 5507 ; WX 1238 ; N uni1583 ; G 1859\nU 5508 ; WX 1238 ; N uni1584 ; G 1860\nU 5509 ; WX 989 ; N uni1585 ; G 1861\nU 5514 ; WX 977 ; N uni158A ; G 1862\nU 5515 ; WX 977 ; N uni158B ; G 1863\nU 5516 ; WX 977 ; N uni158C ; G 1864\nU 5517 ; WX 977 ; N uni158D ; G 1865\nU 5518 ; WX 1591 ; N uni158E ; G 1866\nU 5519 ; WX 1591 ; N uni158F ; G 1867\nU 5520 ; WX 1591 ; N uni1590 ; G 1868\nU 5521 ; WX 1295 ; N uni1591 ; G 1869\nU 5522 ; WX 1295 ; N uni1592 ; G 1870\nU 5523 ; WX 1591 ; N uni1593 ; G 1871\nU 5524 ; WX 1591 ; N uni1594 ; G 1872\nU 5525 ; WX 848 ; N uni1595 ; G 1873\nU 5526 ; WX 1273 ; N uni1596 ; G 1874\nU 5536 ; WX 988 ; N uni15A0 ; G 1875\nU 5537 ; WX 988 ; N uni15A1 ; G 1876\nU 5538 ; WX 931 ; N uni15A2 ; G 1877\nU 5539 ; WX 931 ; N uni15A3 ; G 1878\nU 5540 ; WX 931 ; N uni15A4 ; G 1879\nU 5541 ; WX 931 ; N uni15A5 ; G 1880\nU 5542 ; WX 660 ; N uni15A6 ; G 1881\nU 5543 ; WX 776 ; N uni15A7 ; G 1882\nU 5544 ; WX 776 ; N uni15A8 ; G 1883\nU 5545 ; WX 776 ; N uni15A9 ; G 1884\nU 5546 ; WX 776 ; N uni15AA ; G 1885\nU 5547 ; WX 776 ; N uni15AB ; G 1886\nU 5548 ; WX 776 ; N uni15AC ; G 1887\nU 5549 ; WX 776 ; N uni15AD ; G 1888\nU 5550 ; WX 495 ; N uni15AE ; G 1889\nU 5551 ; WX 743 ; N uni15AF ; G 1890\nU 5598 ; WX 830 ; N uni15DE ; G 1891\nU 5601 ; WX 830 ; N uni15E1 ; G 1892\nU 5702 ; WX 496 ; N uni1646 ; G 1893\nU 5703 ; WX 496 ; N uni1647 ; G 1894\nU 5742 ; WX 413 ; N uni166E ; G 1895\nU 5743 ; WX 1238 ; N uni166F ; G 1896\nU 5744 ; WX 1591 ; N uni1670 ; G 1897\nU 5745 ; WX 2016 ; N uni1671 ; G 1898\nU 5746 ; WX 2016 ; N uni1672 ; G 1899\nU 5747 ; WX 1720 ; N uni1673 ; G 1900\nU 5748 ; WX 1678 ; N uni1674 ; G 1901\nU 5749 ; WX 2016 ; N uni1675 ; G 1902\nU 5750 ; WX 2016 ; N uni1676 ; G 1903\nU 7424 ; WX 652 ; N uni1D00 ; G 1904\nU 7425 ; WX 833 ; N uni1D01 ; G 1905\nU 7426 ; WX 1048 ; N uni1D02 ; G 1906\nU 7427 ; WX 608 ; N uni1D03 ; G 1907\nU 7428 ; WX 593 ; N uni1D04 ; G 1908\nU 7429 ; WX 676 ; N uni1D05 ; G 1909\nU 7430 ; WX 676 ; N uni1D06 ; G 1910\nU 7431 ; WX 559 ; N uni1D07 ; G 1911\nU 7432 ; WX 557 ; N uni1D08 ; G 1912\nU 7433 ; WX 343 ; N uni1D09 ; G 1913\nU 7434 ; WX 494 ; N uni1D0A ; G 1914\nU 7435 ; WX 665 ; N uni1D0B ; G 1915\nU 7436 ; WX 539 ; N uni1D0C ; G 1916\nU 7437 ; WX 817 ; N uni1D0D ; G 1917\nU 7438 ; WX 701 ; N uni1D0E ; G 1918\nU 7439 ; WX 687 ; N uni1D0F ; G 1919\nU 7440 ; WX 593 ; N uni1D10 ; G 1920\nU 7441 ; WX 660 ; N uni1D11 ; G 1921\nU 7442 ; WX 660 ; N uni1D12 ; G 1922\nU 7443 ; WX 660 ; N uni1D13 ; G 1923\nU 7444 ; WX 1094 ; N uni1D14 ; G 1924\nU 7446 ; WX 687 ; N uni1D16 ; G 1925\nU 7447 ; WX 687 ; N uni1D17 ; G 1926\nU 7448 ; WX 556 ; N uni1D18 ; G 1927\nU 7449 ; WX 642 ; N uni1D19 ; G 1928\nU 7450 ; WX 642 ; N uni1D1A ; G 1929\nU 7451 ; WX 580 ; N uni1D1B ; G 1930\nU 7452 ; WX 634 ; N uni1D1C ; G 1931\nU 7453 ; WX 737 ; N uni1D1D ; G 1932\nU 7454 ; WX 948 ; N uni1D1E ; G 1933\nU 7455 ; WX 695 ; N uni1D1F ; G 1934\nU 7456 ; WX 652 ; N uni1D20 ; G 1935\nU 7457 ; WX 924 ; N uni1D21 ; G 1936\nU 7458 ; WX 582 ; N uni1D22 ; G 1937\nU 7459 ; WX 646 ; N uni1D23 ; G 1938\nU 7462 ; WX 539 ; N uni1D26 ; G 1939\nU 7463 ; WX 652 ; N uni1D27 ; G 1940\nU 7464 ; WX 691 ; N uni1D28 ; G 1941\nU 7465 ; WX 556 ; N uni1D29 ; G 1942\nU 7466 ; WX 781 ; N uni1D2A ; G 1943\nU 7467 ; WX 732 ; N uni1D2B ; G 1944\nU 7468 ; WX 487 ; N uni1D2C ; G 1945\nU 7469 ; WX 683 ; N uni1D2D ; G 1946\nU 7470 ; WX 480 ; N uni1D2E ; G 1947\nU 7472 ; WX 523 ; N uni1D30 ; G 1948\nU 7473 ; WX 430 ; N uni1D31 ; G 1949\nU 7474 ; WX 430 ; N uni1D32 ; G 1950\nU 7475 ; WX 517 ; N uni1D33 ; G 1951\nU 7476 ; WX 527 ; N uni1D34 ; G 1952\nU 7477 ; WX 234 ; N uni1D35 ; G 1953\nU 7478 ; WX 234 ; N uni1D36 ; G 1954\nU 7479 ; WX 488 ; N uni1D37 ; G 1955\nU 7480 ; WX 401 ; N uni1D38 ; G 1956\nU 7481 ; WX 626 ; N uni1D39 ; G 1957\nU 7482 ; WX 527 ; N uni1D3A ; G 1958\nU 7483 ; WX 527 ; N uni1D3B ; G 1959\nU 7484 ; WX 535 ; N uni1D3C ; G 1960\nU 7485 ; WX 509 ; N uni1D3D ; G 1961\nU 7486 ; WX 461 ; N uni1D3E ; G 1962\nU 7487 ; WX 485 ; N uni1D3F ; G 1963\nU 7488 ; WX 430 ; N uni1D40 ; G 1964\nU 7489 ; WX 511 ; N uni1D41 ; G 1965\nU 7490 ; WX 695 ; N uni1D42 ; G 1966\nU 7491 ; WX 458 ; N uni1D43 ; G 1967\nU 7492 ; WX 458 ; N uni1D44 ; G 1968\nU 7493 ; WX 479 ; N uni1D45 ; G 1969\nU 7494 ; WX 712 ; N uni1D46 ; G 1970\nU 7495 ; WX 479 ; N uni1D47 ; G 1971\nU 7496 ; WX 479 ; N uni1D48 ; G 1972\nU 7497 ; WX 479 ; N uni1D49 ; G 1973\nU 7498 ; WX 479 ; N uni1D4A ; G 1974\nU 7499 ; WX 386 ; N uni1D4B ; G 1975\nU 7500 ; WX 386 ; N uni1D4C ; G 1976\nU 7501 ; WX 479 ; N uni1D4D ; G 1977\nU 7502 ; WX 219 ; N uni1D4E ; G 1978\nU 7503 ; WX 487 ; N uni1D4F ; G 1979\nU 7504 ; WX 664 ; N uni1D50 ; G 1980\nU 7505 ; WX 456 ; N uni1D51 ; G 1981\nU 7506 ; WX 488 ; N uni1D52 ; G 1982\nU 7507 ; WX 414 ; N uni1D53 ; G 1983\nU 7508 ; WX 488 ; N uni1D54 ; G 1984\nU 7509 ; WX 488 ; N uni1D55 ; G 1985\nU 7510 ; WX 479 ; N uni1D56 ; G 1986\nU 7511 ; WX 388 ; N uni1D57 ; G 1987\nU 7512 ; WX 456 ; N uni1D58 ; G 1988\nU 7513 ; WX 462 ; N uni1D59 ; G 1989\nU 7514 ; WX 664 ; N uni1D5A ; G 1990\nU 7515 ; WX 501 ; N uni1D5B ; G 1991\nU 7517 ; WX 451 ; N uni1D5D ; G 1992\nU 7518 ; WX 429 ; N uni1D5E ; G 1993\nU 7519 ; WX 433 ; N uni1D5F ; G 1994\nU 7520 ; WX 493 ; N uni1D60 ; G 1995\nU 7521 ; WX 406 ; N uni1D61 ; G 1996\nU 7522 ; WX 219 ; N uni1D62 ; G 1997\nU 7523 ; WX 315 ; N uni1D63 ; G 1998\nU 7524 ; WX 456 ; N uni1D64 ; G 1999\nU 7525 ; WX 501 ; N uni1D65 ; G 2000\nU 7526 ; WX 451 ; N uni1D66 ; G 2001\nU 7527 ; WX 429 ; N uni1D67 ; G 2002\nU 7528 ; WX 451 ; N uni1D68 ; G 2003\nU 7529 ; WX 493 ; N uni1D69 ; G 2004\nU 7530 ; WX 406 ; N uni1D6A ; G 2005\nU 7543 ; WX 716 ; N uni1D77 ; G 2006\nU 7544 ; WX 527 ; N uni1D78 ; G 2007\nU 7547 ; WX 545 ; N uni1D7B ; G 2008\nU 7549 ; WX 747 ; N uni1D7D ; G 2009\nU 7557 ; WX 514 ; N uni1D85 ; G 2010\nU 7579 ; WX 479 ; N uni1D9B ; G 2011\nU 7580 ; WX 414 ; N uni1D9C ; G 2012\nU 7581 ; WX 414 ; N uni1D9D ; G 2013\nU 7582 ; WX 488 ; N uni1D9E ; G 2014\nU 7583 ; WX 386 ; N uni1D9F ; G 2015\nU 7584 ; WX 377 ; N uni1DA0 ; G 2016\nU 7585 ; WX 348 ; N uni1DA1 ; G 2017\nU 7586 ; WX 479 ; N uni1DA2 ; G 2018\nU 7587 ; WX 456 ; N uni1DA3 ; G 2019\nU 7588 ; WX 347 ; N uni1DA4 ; G 2020\nU 7589 ; WX 281 ; N uni1DA5 ; G 2021\nU 7590 ; WX 347 ; N uni1DA6 ; G 2022\nU 7591 ; WX 347 ; N uni1DA7 ; G 2023\nU 7592 ; WX 431 ; N uni1DA8 ; G 2024\nU 7593 ; WX 326 ; N uni1DA9 ; G 2025\nU 7594 ; WX 330 ; N uni1DAA ; G 2026\nU 7595 ; WX 370 ; N uni1DAB ; G 2027\nU 7596 ; WX 664 ; N uni1DAC ; G 2028\nU 7597 ; WX 664 ; N uni1DAD ; G 2029\nU 7598 ; WX 562 ; N uni1DAE ; G 2030\nU 7599 ; WX 562 ; N uni1DAF ; G 2031\nU 7600 ; WX 448 ; N uni1DB0 ; G 2032\nU 7601 ; WX 488 ; N uni1DB1 ; G 2033\nU 7602 ; WX 542 ; N uni1DB2 ; G 2034\nU 7603 ; WX 422 ; N uni1DB3 ; G 2035\nU 7604 ; WX 396 ; N uni1DB4 ; G 2036\nU 7605 ; WX 388 ; N uni1DB5 ; G 2037\nU 7606 ; WX 583 ; N uni1DB6 ; G 2038\nU 7607 ; WX 494 ; N uni1DB7 ; G 2039\nU 7608 ; WX 399 ; N uni1DB8 ; G 2040\nU 7609 ; WX 451 ; N uni1DB9 ; G 2041\nU 7610 ; WX 501 ; N uni1DBA ; G 2042\nU 7611 ; WX 417 ; N uni1DBB ; G 2043\nU 7612 ; WX 523 ; N uni1DBC ; G 2044\nU 7613 ; WX 470 ; N uni1DBD ; G 2045\nU 7614 ; WX 455 ; N uni1DBE ; G 2046\nU 7615 ; WX 425 ; N uni1DBF ; G 2047\nU 7620 ; WX 0 ; N uni1DC4 ; G 2048\nU 7621 ; WX 0 ; N uni1DC5 ; G 2049\nU 7622 ; WX 0 ; N uni1DC6 ; G 2050\nU 7623 ; WX 0 ; N uni1DC7 ; G 2051\nU 7624 ; WX 0 ; N uni1DC8 ; G 2052\nU 7625 ; WX 0 ; N uni1DC9 ; G 2053\nU 7680 ; WX 774 ; N uni1E00 ; G 2054\nU 7681 ; WX 675 ; N uni1E01 ; G 2055\nU 7682 ; WX 762 ; N uni1E02 ; G 2056\nU 7683 ; WX 716 ; N uni1E03 ; G 2057\nU 7684 ; WX 762 ; N uni1E04 ; G 2058\nU 7685 ; WX 716 ; N uni1E05 ; G 2059\nU 7686 ; WX 762 ; N uni1E06 ; G 2060\nU 7687 ; WX 716 ; N uni1E07 ; G 2061\nU 7688 ; WX 734 ; N uni1E08 ; G 2062\nU 7689 ; WX 593 ; N uni1E09 ; G 2063\nU 7690 ; WX 830 ; N uni1E0A ; G 2064\nU 7691 ; WX 716 ; N uni1E0B ; G 2065\nU 7692 ; WX 830 ; N uni1E0C ; G 2066\nU 7693 ; WX 716 ; N uni1E0D ; G 2067\nU 7694 ; WX 830 ; N uni1E0E ; G 2068\nU 7695 ; WX 716 ; N uni1E0F ; G 2069\nU 7696 ; WX 830 ; N uni1E10 ; G 2070\nU 7697 ; WX 716 ; N uni1E11 ; G 2071\nU 7698 ; WX 830 ; N uni1E12 ; G 2072\nU 7699 ; WX 716 ; N uni1E13 ; G 2073\nU 7700 ; WX 683 ; N uni1E14 ; G 2074\nU 7701 ; WX 678 ; N uni1E15 ; G 2075\nU 7702 ; WX 683 ; N uni1E16 ; G 2076\nU 7703 ; WX 678 ; N uni1E17 ; G 2077\nU 7704 ; WX 683 ; N uni1E18 ; G 2078\nU 7705 ; WX 678 ; N uni1E19 ; G 2079\nU 7706 ; WX 683 ; N uni1E1A ; G 2080\nU 7707 ; WX 678 ; N uni1E1B ; G 2081\nU 7708 ; WX 683 ; N uni1E1C ; G 2082\nU 7709 ; WX 678 ; N uni1E1D ; G 2083\nU 7710 ; WX 683 ; N uni1E1E ; G 2084\nU 7711 ; WX 435 ; N uni1E1F ; G 2085\nU 7712 ; WX 821 ; N uni1E20 ; G 2086\nU 7713 ; WX 716 ; N uni1E21 ; G 2087\nU 7714 ; WX 837 ; N uni1E22 ; G 2088\nU 7715 ; WX 712 ; N uni1E23 ; G 2089\nU 7716 ; WX 837 ; N uni1E24 ; G 2090\nU 7717 ; WX 712 ; N uni1E25 ; G 2091\nU 7718 ; WX 837 ; N uni1E26 ; G 2092\nU 7719 ; WX 712 ; N uni1E27 ; G 2093\nU 7720 ; WX 837 ; N uni1E28 ; G 2094\nU 7721 ; WX 712 ; N uni1E29 ; G 2095\nU 7722 ; WX 837 ; N uni1E2A ; G 2096\nU 7723 ; WX 712 ; N uni1E2B ; G 2097\nU 7724 ; WX 372 ; N uni1E2C ; G 2098\nU 7725 ; WX 343 ; N uni1E2D ; G 2099\nU 7726 ; WX 372 ; N uni1E2E ; G 2100\nU 7727 ; WX 343 ; N uni1E2F ; G 2101\nU 7728 ; WX 775 ; N uni1E30 ; G 2102\nU 7729 ; WX 665 ; N uni1E31 ; G 2103\nU 7730 ; WX 775 ; N uni1E32 ; G 2104\nU 7731 ; WX 665 ; N uni1E33 ; G 2105\nU 7732 ; WX 775 ; N uni1E34 ; G 2106\nU 7733 ; WX 665 ; N uni1E35 ; G 2107\nU 7734 ; WX 637 ; N uni1E36 ; G 2108\nU 7735 ; WX 343 ; N uni1E37 ; G 2109\nU 7736 ; WX 637 ; N uni1E38 ; G 2110\nU 7737 ; WX 343 ; N uni1E39 ; G 2111\nU 7738 ; WX 637 ; N uni1E3A ; G 2112\nU 7739 ; WX 343 ; N uni1E3B ; G 2113\nU 7740 ; WX 637 ; N uni1E3C ; G 2114\nU 7741 ; WX 343 ; N uni1E3D ; G 2115\nU 7742 ; WX 995 ; N uni1E3E ; G 2116\nU 7743 ; WX 1042 ; N uni1E3F ; G 2117\nU 7744 ; WX 995 ; N uni1E40 ; G 2118\nU 7745 ; WX 1042 ; N uni1E41 ; G 2119\nU 7746 ; WX 995 ; N uni1E42 ; G 2120\nU 7747 ; WX 1042 ; N uni1E43 ; G 2121\nU 7748 ; WX 837 ; N uni1E44 ; G 2122\nU 7749 ; WX 712 ; N uni1E45 ; G 2123\nU 7750 ; WX 837 ; N uni1E46 ; G 2124\nU 7751 ; WX 712 ; N uni1E47 ; G 2125\nU 7752 ; WX 837 ; N uni1E48 ; G 2126\nU 7753 ; WX 712 ; N uni1E49 ; G 2127\nU 7754 ; WX 837 ; N uni1E4A ; G 2128\nU 7755 ; WX 712 ; N uni1E4B ; G 2129\nU 7756 ; WX 850 ; N uni1E4C ; G 2130\nU 7757 ; WX 687 ; N uni1E4D ; G 2131\nU 7758 ; WX 850 ; N uni1E4E ; G 2132\nU 7759 ; WX 687 ; N uni1E4F ; G 2133\nU 7760 ; WX 850 ; N uni1E50 ; G 2134\nU 7761 ; WX 687 ; N uni1E51 ; G 2135\nU 7762 ; WX 850 ; N uni1E52 ; G 2136\nU 7763 ; WX 687 ; N uni1E53 ; G 2137\nU 7764 ; WX 733 ; N uni1E54 ; G 2138\nU 7765 ; WX 716 ; N uni1E55 ; G 2139\nU 7766 ; WX 733 ; N uni1E56 ; G 2140\nU 7767 ; WX 716 ; N uni1E57 ; G 2141\nU 7768 ; WX 770 ; N uni1E58 ; G 2142\nU 7769 ; WX 493 ; N uni1E59 ; G 2143\nU 7770 ; WX 770 ; N uni1E5A ; G 2144\nU 7771 ; WX 493 ; N uni1E5B ; G 2145\nU 7772 ; WX 770 ; N uni1E5C ; G 2146\nU 7773 ; WX 493 ; N uni1E5D ; G 2147\nU 7774 ; WX 770 ; N uni1E5E ; G 2148\nU 7775 ; WX 493 ; N uni1E5F ; G 2149\nU 7776 ; WX 720 ; N uni1E60 ; G 2150\nU 7777 ; WX 595 ; N uni1E61 ; G 2151\nU 7778 ; WX 720 ; N uni1E62 ; G 2152\nU 7779 ; WX 595 ; N uni1E63 ; G 2153\nU 7780 ; WX 720 ; N uni1E64 ; G 2154\nU 7781 ; WX 595 ; N uni1E65 ; G 2155\nU 7782 ; WX 720 ; N uni1E66 ; G 2156\nU 7783 ; WX 595 ; N uni1E67 ; G 2157\nU 7784 ; WX 720 ; N uni1E68 ; G 2158\nU 7785 ; WX 595 ; N uni1E69 ; G 2159\nU 7786 ; WX 682 ; N uni1E6A ; G 2160\nU 7787 ; WX 478 ; N uni1E6B ; G 2161\nU 7788 ; WX 682 ; N uni1E6C ; G 2162\nU 7789 ; WX 478 ; N uni1E6D ; G 2163\nU 7790 ; WX 682 ; N uni1E6E ; G 2164\nU 7791 ; WX 478 ; N uni1E6F ; G 2165\nU 7792 ; WX 682 ; N uni1E70 ; G 2166\nU 7793 ; WX 478 ; N uni1E71 ; G 2167\nU 7794 ; WX 812 ; N uni1E72 ; G 2168\nU 7795 ; WX 712 ; N uni1E73 ; G 2169\nU 7796 ; WX 812 ; N uni1E74 ; G 2170\nU 7797 ; WX 712 ; N uni1E75 ; G 2171\nU 7798 ; WX 812 ; N uni1E76 ; G 2172\nU 7799 ; WX 712 ; N uni1E77 ; G 2173\nU 7800 ; WX 812 ; N uni1E78 ; G 2174\nU 7801 ; WX 712 ; N uni1E79 ; G 2175\nU 7802 ; WX 812 ; N uni1E7A ; G 2176\nU 7803 ; WX 712 ; N uni1E7B ; G 2177\nU 7804 ; WX 774 ; N uni1E7C ; G 2178\nU 7805 ; WX 652 ; N uni1E7D ; G 2179\nU 7806 ; WX 774 ; N uni1E7E ; G 2180\nU 7807 ; WX 652 ; N uni1E7F ; G 2181\nU 7808 ; WX 1103 ; N Wgrave ; G 2182\nU 7809 ; WX 924 ; N wgrave ; G 2183\nU 7810 ; WX 1103 ; N Wacute ; G 2184\nU 7811 ; WX 924 ; N wacute ; G 2185\nU 7812 ; WX 1103 ; N Wdieresis ; G 2186\nU 7813 ; WX 924 ; N wdieresis ; G 2187\nU 7814 ; WX 1103 ; N uni1E86 ; G 2188\nU 7815 ; WX 924 ; N uni1E87 ; G 2189\nU 7816 ; WX 1103 ; N uni1E88 ; G 2190\nU 7817 ; WX 924 ; N uni1E89 ; G 2191\nU 7818 ; WX 771 ; N uni1E8A ; G 2192\nU 7819 ; WX 645 ; N uni1E8B ; G 2193\nU 7820 ; WX 771 ; N uni1E8C ; G 2194\nU 7821 ; WX 645 ; N uni1E8D ; G 2195\nU 7822 ; WX 724 ; N uni1E8E ; G 2196\nU 7823 ; WX 652 ; N uni1E8F ; G 2197\nU 7824 ; WX 725 ; N uni1E90 ; G 2198\nU 7825 ; WX 582 ; N uni1E91 ; G 2199\nU 7826 ; WX 725 ; N uni1E92 ; G 2200\nU 7827 ; WX 582 ; N uni1E93 ; G 2201\nU 7828 ; WX 725 ; N uni1E94 ; G 2202\nU 7829 ; WX 582 ; N uni1E95 ; G 2203\nU 7830 ; WX 712 ; N uni1E96 ; G 2204\nU 7831 ; WX 478 ; N uni1E97 ; G 2205\nU 7832 ; WX 924 ; N uni1E98 ; G 2206\nU 7833 ; WX 652 ; N uni1E99 ; G 2207\nU 7834 ; WX 675 ; N uni1E9A ; G 2208\nU 7835 ; WX 435 ; N uni1E9B ; G 2209\nU 7836 ; WX 435 ; N uni1E9C ; G 2210\nU 7837 ; WX 435 ; N uni1E9D ; G 2211\nU 7838 ; WX 896 ; N uni1E9E ; G 2212\nU 7839 ; WX 687 ; N uni1E9F ; G 2213\nU 7840 ; WX 774 ; N uni1EA0 ; G 2214\nU 7841 ; WX 675 ; N uni1EA1 ; G 2215\nU 7842 ; WX 774 ; N uni1EA2 ; G 2216\nU 7843 ; WX 675 ; N uni1EA3 ; G 2217\nU 7844 ; WX 774 ; N uni1EA4 ; G 2218\nU 7845 ; WX 675 ; N uni1EA5 ; G 2219\nU 7846 ; WX 774 ; N uni1EA6 ; G 2220\nU 7847 ; WX 675 ; N uni1EA7 ; G 2221\nU 7848 ; WX 774 ; N uni1EA8 ; G 2222\nU 7849 ; WX 675 ; N uni1EA9 ; G 2223\nU 7850 ; WX 774 ; N uni1EAA ; G 2224\nU 7851 ; WX 675 ; N uni1EAB ; G 2225\nU 7852 ; WX 774 ; N uni1EAC ; G 2226\nU 7853 ; WX 675 ; N uni1EAD ; G 2227\nU 7854 ; WX 774 ; N uni1EAE ; G 2228\nU 7855 ; WX 675 ; N uni1EAF ; G 2229\nU 7856 ; WX 774 ; N uni1EB0 ; G 2230\nU 7857 ; WX 675 ; N uni1EB1 ; G 2231\nU 7858 ; WX 774 ; N uni1EB2 ; G 2232\nU 7859 ; WX 675 ; N uni1EB3 ; G 2233\nU 7860 ; WX 774 ; N uni1EB4 ; G 2234\nU 7861 ; WX 675 ; N uni1EB5 ; G 2235\nU 7862 ; WX 774 ; N uni1EB6 ; G 2236\nU 7863 ; WX 675 ; N uni1EB7 ; G 2237\nU 7864 ; WX 683 ; N uni1EB8 ; G 2238\nU 7865 ; WX 678 ; N uni1EB9 ; G 2239\nU 7866 ; WX 683 ; N uni1EBA ; G 2240\nU 7867 ; WX 678 ; N uni1EBB ; G 2241\nU 7868 ; WX 683 ; N uni1EBC ; G 2242\nU 7869 ; WX 678 ; N uni1EBD ; G 2243\nU 7870 ; WX 683 ; N uni1EBE ; G 2244\nU 7871 ; WX 678 ; N uni1EBF ; G 2245\nU 7872 ; WX 683 ; N uni1EC0 ; G 2246\nU 7873 ; WX 678 ; N uni1EC1 ; G 2247\nU 7874 ; WX 683 ; N uni1EC2 ; G 2248\nU 7875 ; WX 678 ; N uni1EC3 ; G 2249\nU 7876 ; WX 683 ; N uni1EC4 ; G 2250\nU 7877 ; WX 678 ; N uni1EC5 ; G 2251\nU 7878 ; WX 683 ; N uni1EC6 ; G 2252\nU 7879 ; WX 678 ; N uni1EC7 ; G 2253\nU 7880 ; WX 372 ; N uni1EC8 ; G 2254\nU 7881 ; WX 343 ; N uni1EC9 ; G 2255\nU 7882 ; WX 372 ; N uni1ECA ; G 2256\nU 7883 ; WX 343 ; N uni1ECB ; G 2257\nU 7884 ; WX 850 ; N uni1ECC ; G 2258\nU 7885 ; WX 687 ; N uni1ECD ; G 2259\nU 7886 ; WX 850 ; N uni1ECE ; G 2260\nU 7887 ; WX 687 ; N uni1ECF ; G 2261\nU 7888 ; WX 850 ; N uni1ED0 ; G 2262\nU 7889 ; WX 687 ; N uni1ED1 ; G 2263\nU 7890 ; WX 850 ; N uni1ED2 ; G 2264\nU 7891 ; WX 687 ; N uni1ED3 ; G 2265\nU 7892 ; WX 850 ; N uni1ED4 ; G 2266\nU 7893 ; WX 687 ; N uni1ED5 ; G 2267\nU 7894 ; WX 850 ; N uni1ED6 ; G 2268\nU 7895 ; WX 687 ; N uni1ED7 ; G 2269\nU 7896 ; WX 850 ; N uni1ED8 ; G 2270\nU 7897 ; WX 687 ; N uni1ED9 ; G 2271\nU 7898 ; WX 850 ; N uni1EDA ; G 2272\nU 7899 ; WX 687 ; N uni1EDB ; G 2273\nU 7900 ; WX 850 ; N uni1EDC ; G 2274\nU 7901 ; WX 687 ; N uni1EDD ; G 2275\nU 7902 ; WX 850 ; N uni1EDE ; G 2276\nU 7903 ; WX 687 ; N uni1EDF ; G 2277\nU 7904 ; WX 850 ; N uni1EE0 ; G 2278\nU 7905 ; WX 687 ; N uni1EE1 ; G 2279\nU 7906 ; WX 850 ; N uni1EE2 ; G 2280\nU 7907 ; WX 687 ; N uni1EE3 ; G 2281\nU 7908 ; WX 812 ; N uni1EE4 ; G 2282\nU 7909 ; WX 712 ; N uni1EE5 ; G 2283\nU 7910 ; WX 812 ; N uni1EE6 ; G 2284\nU 7911 ; WX 712 ; N uni1EE7 ; G 2285\nU 7912 ; WX 812 ; N uni1EE8 ; G 2286\nU 7913 ; WX 712 ; N uni1EE9 ; G 2287\nU 7914 ; WX 812 ; N uni1EEA ; G 2288\nU 7915 ; WX 712 ; N uni1EEB ; G 2289\nU 7916 ; WX 812 ; N uni1EEC ; G 2290\nU 7917 ; WX 712 ; N uni1EED ; G 2291\nU 7918 ; WX 812 ; N uni1EEE ; G 2292\nU 7919 ; WX 712 ; N uni1EEF ; G 2293\nU 7920 ; WX 812 ; N uni1EF0 ; G 2294\nU 7921 ; WX 712 ; N uni1EF1 ; G 2295\nU 7922 ; WX 724 ; N Ygrave ; G 2296\nU 7923 ; WX 652 ; N ygrave ; G 2297\nU 7924 ; WX 724 ; N uni1EF4 ; G 2298\nU 7925 ; WX 652 ; N uni1EF5 ; G 2299\nU 7926 ; WX 724 ; N uni1EF6 ; G 2300\nU 7927 ; WX 652 ; N uni1EF7 ; G 2301\nU 7928 ; WX 724 ; N uni1EF8 ; G 2302\nU 7929 ; WX 652 ; N uni1EF9 ; G 2303\nU 7930 ; WX 953 ; N uni1EFA ; G 2304\nU 7931 ; WX 644 ; N uni1EFB ; G 2305\nU 7936 ; WX 687 ; N uni1F00 ; G 2306\nU 7937 ; WX 687 ; N uni1F01 ; G 2307\nU 7938 ; WX 687 ; N uni1F02 ; G 2308\nU 7939 ; WX 687 ; N uni1F03 ; G 2309\nU 7940 ; WX 687 ; N uni1F04 ; G 2310\nU 7941 ; WX 687 ; N uni1F05 ; G 2311\nU 7942 ; WX 687 ; N uni1F06 ; G 2312\nU 7943 ; WX 687 ; N uni1F07 ; G 2313\nU 7944 ; WX 774 ; N uni1F08 ; G 2314\nU 7945 ; WX 774 ; N uni1F09 ; G 2315\nU 7946 ; WX 1041 ; N uni1F0A ; G 2316\nU 7947 ; WX 1043 ; N uni1F0B ; G 2317\nU 7948 ; WX 935 ; N uni1F0C ; G 2318\nU 7949 ; WX 963 ; N uni1F0D ; G 2319\nU 7950 ; WX 835 ; N uni1F0E ; G 2320\nU 7951 ; WX 859 ; N uni1F0F ; G 2321\nU 7952 ; WX 557 ; N uni1F10 ; G 2322\nU 7953 ; WX 557 ; N uni1F11 ; G 2323\nU 7954 ; WX 557 ; N uni1F12 ; G 2324\nU 7955 ; WX 557 ; N uni1F13 ; G 2325\nU 7956 ; WX 557 ; N uni1F14 ; G 2326\nU 7957 ; WX 557 ; N uni1F15 ; G 2327\nU 7960 ; WX 792 ; N uni1F18 ; G 2328\nU 7961 ; WX 794 ; N uni1F19 ; G 2329\nU 7962 ; WX 1100 ; N uni1F1A ; G 2330\nU 7963 ; WX 1096 ; N uni1F1B ; G 2331\nU 7964 ; WX 1023 ; N uni1F1C ; G 2332\nU 7965 ; WX 1052 ; N uni1F1D ; G 2333\nU 7968 ; WX 712 ; N uni1F20 ; G 2334\nU 7969 ; WX 712 ; N uni1F21 ; G 2335\nU 7970 ; WX 712 ; N uni1F22 ; G 2336\nU 7971 ; WX 712 ; N uni1F23 ; G 2337\nU 7972 ; WX 712 ; N uni1F24 ; G 2338\nU 7973 ; WX 712 ; N uni1F25 ; G 2339\nU 7974 ; WX 712 ; N uni1F26 ; G 2340\nU 7975 ; WX 712 ; N uni1F27 ; G 2341\nU 7976 ; WX 945 ; N uni1F28 ; G 2342\nU 7977 ; WX 951 ; N uni1F29 ; G 2343\nU 7978 ; WX 1250 ; N uni1F2A ; G 2344\nU 7979 ; WX 1250 ; N uni1F2B ; G 2345\nU 7980 ; WX 1180 ; N uni1F2C ; G 2346\nU 7981 ; WX 1206 ; N uni1F2D ; G 2347\nU 7982 ; WX 1054 ; N uni1F2E ; G 2348\nU 7983 ; WX 1063 ; N uni1F2F ; G 2349\nU 7984 ; WX 390 ; N uni1F30 ; G 2350\nU 7985 ; WX 390 ; N uni1F31 ; G 2351\nU 7986 ; WX 390 ; N uni1F32 ; G 2352\nU 7987 ; WX 390 ; N uni1F33 ; G 2353\nU 7988 ; WX 390 ; N uni1F34 ; G 2354\nU 7989 ; WX 390 ; N uni1F35 ; G 2355\nU 7990 ; WX 390 ; N uni1F36 ; G 2356\nU 7991 ; WX 390 ; N uni1F37 ; G 2357\nU 7992 ; WX 483 ; N uni1F38 ; G 2358\nU 7993 ; WX 489 ; N uni1F39 ; G 2359\nU 7994 ; WX 777 ; N uni1F3A ; G 2360\nU 7995 ; WX 785 ; N uni1F3B ; G 2361\nU 7996 ; WX 712 ; N uni1F3C ; G 2362\nU 7997 ; WX 738 ; N uni1F3D ; G 2363\nU 7998 ; WX 604 ; N uni1F3E ; G 2364\nU 7999 ; WX 604 ; N uni1F3F ; G 2365\nU 8000 ; WX 687 ; N uni1F40 ; G 2366\nU 8001 ; WX 687 ; N uni1F41 ; G 2367\nU 8002 ; WX 687 ; N uni1F42 ; G 2368\nU 8003 ; WX 687 ; N uni1F43 ; G 2369\nU 8004 ; WX 687 ; N uni1F44 ; G 2370\nU 8005 ; WX 687 ; N uni1F45 ; G 2371\nU 8008 ; WX 892 ; N uni1F48 ; G 2372\nU 8009 ; WX 933 ; N uni1F49 ; G 2373\nU 8010 ; WX 1221 ; N uni1F4A ; G 2374\nU 8011 ; WX 1224 ; N uni1F4B ; G 2375\nU 8012 ; WX 1053 ; N uni1F4C ; G 2376\nU 8013 ; WX 1082 ; N uni1F4D ; G 2377\nU 8016 ; WX 675 ; N uni1F50 ; G 2378\nU 8017 ; WX 675 ; N uni1F51 ; G 2379\nU 8018 ; WX 675 ; N uni1F52 ; G 2380\nU 8019 ; WX 675 ; N uni1F53 ; G 2381\nU 8020 ; WX 675 ; N uni1F54 ; G 2382\nU 8021 ; WX 675 ; N uni1F55 ; G 2383\nU 8022 ; WX 675 ; N uni1F56 ; G 2384\nU 8023 ; WX 675 ; N uni1F57 ; G 2385\nU 8025 ; WX 930 ; N uni1F59 ; G 2386\nU 8027 ; WX 1184 ; N uni1F5B ; G 2387\nU 8029 ; WX 1199 ; N uni1F5D ; G 2388\nU 8031 ; WX 1049 ; N uni1F5F ; G 2389\nU 8032 ; WX 869 ; N uni1F60 ; G 2390\nU 8033 ; WX 869 ; N uni1F61 ; G 2391\nU 8034 ; WX 869 ; N uni1F62 ; G 2392\nU 8035 ; WX 869 ; N uni1F63 ; G 2393\nU 8036 ; WX 869 ; N uni1F64 ; G 2394\nU 8037 ; WX 869 ; N uni1F65 ; G 2395\nU 8038 ; WX 869 ; N uni1F66 ; G 2396\nU 8039 ; WX 869 ; N uni1F67 ; G 2397\nU 8040 ; WX 909 ; N uni1F68 ; G 2398\nU 8041 ; WX 958 ; N uni1F69 ; G 2399\nU 8042 ; WX 1246 ; N uni1F6A ; G 2400\nU 8043 ; WX 1251 ; N uni1F6B ; G 2401\nU 8044 ; WX 1076 ; N uni1F6C ; G 2402\nU 8045 ; WX 1105 ; N uni1F6D ; G 2403\nU 8046 ; WX 1028 ; N uni1F6E ; G 2404\nU 8047 ; WX 1076 ; N uni1F6F ; G 2405\nU 8048 ; WX 687 ; N uni1F70 ; G 2406\nU 8049 ; WX 687 ; N uni1F71 ; G 2407\nU 8050 ; WX 557 ; N uni1F72 ; G 2408\nU 8051 ; WX 557 ; N uni1F73 ; G 2409\nU 8052 ; WX 712 ; N uni1F74 ; G 2410\nU 8053 ; WX 712 ; N uni1F75 ; G 2411\nU 8054 ; WX 390 ; N uni1F76 ; G 2412\nU 8055 ; WX 390 ; N uni1F77 ; G 2413\nU 8056 ; WX 687 ; N uni1F78 ; G 2414\nU 8057 ; WX 687 ; N uni1F79 ; G 2415\nU 8058 ; WX 675 ; N uni1F7A ; G 2416\nU 8059 ; WX 675 ; N uni1F7B ; G 2417\nU 8060 ; WX 869 ; N uni1F7C ; G 2418\nU 8061 ; WX 869 ; N uni1F7D ; G 2419\nU 8064 ; WX 687 ; N uni1F80 ; G 2420\nU 8065 ; WX 687 ; N uni1F81 ; G 2421\nU 8066 ; WX 687 ; N uni1F82 ; G 2422\nU 8067 ; WX 687 ; N uni1F83 ; G 2423\nU 8068 ; WX 687 ; N uni1F84 ; G 2424\nU 8069 ; WX 687 ; N uni1F85 ; G 2425\nU 8070 ; WX 687 ; N uni1F86 ; G 2426\nU 8071 ; WX 687 ; N uni1F87 ; G 2427\nU 8072 ; WX 774 ; N uni1F88 ; G 2428\nU 8073 ; WX 774 ; N uni1F89 ; G 2429\nU 8074 ; WX 1041 ; N uni1F8A ; G 2430\nU 8075 ; WX 1043 ; N uni1F8B ; G 2431\nU 8076 ; WX 935 ; N uni1F8C ; G 2432\nU 8077 ; WX 963 ; N uni1F8D ; G 2433\nU 8078 ; WX 835 ; N uni1F8E ; G 2434\nU 8079 ; WX 859 ; N uni1F8F ; G 2435\nU 8080 ; WX 712 ; N uni1F90 ; G 2436\nU 8081 ; WX 712 ; N uni1F91 ; G 2437\nU 8082 ; WX 712 ; N uni1F92 ; G 2438\nU 8083 ; WX 712 ; N uni1F93 ; G 2439\nU 8084 ; WX 712 ; N uni1F94 ; G 2440\nU 8085 ; WX 712 ; N uni1F95 ; G 2441\nU 8086 ; WX 712 ; N uni1F96 ; G 2442\nU 8087 ; WX 712 ; N uni1F97 ; G 2443\nU 8088 ; WX 945 ; N uni1F98 ; G 2444\nU 8089 ; WX 951 ; N uni1F99 ; G 2445\nU 8090 ; WX 1250 ; N uni1F9A ; G 2446\nU 8091 ; WX 1250 ; N uni1F9B ; G 2447\nU 8092 ; WX 1180 ; N uni1F9C ; G 2448\nU 8093 ; WX 1206 ; N uni1F9D ; G 2449\nU 8094 ; WX 1054 ; N uni1F9E ; G 2450\nU 8095 ; WX 1063 ; N uni1F9F ; G 2451\nU 8096 ; WX 869 ; N uni1FA0 ; G 2452\nU 8097 ; WX 869 ; N uni1FA1 ; G 2453\nU 8098 ; WX 869 ; N uni1FA2 ; G 2454\nU 8099 ; WX 869 ; N uni1FA3 ; G 2455\nU 8100 ; WX 869 ; N uni1FA4 ; G 2456\nU 8101 ; WX 869 ; N uni1FA5 ; G 2457\nU 8102 ; WX 869 ; N uni1FA6 ; G 2458\nU 8103 ; WX 869 ; N uni1FA7 ; G 2459\nU 8104 ; WX 909 ; N uni1FA8 ; G 2460\nU 8105 ; WX 958 ; N uni1FA9 ; G 2461\nU 8106 ; WX 1246 ; N uni1FAA ; G 2462\nU 8107 ; WX 1251 ; N uni1FAB ; G 2463\nU 8108 ; WX 1076 ; N uni1FAC ; G 2464\nU 8109 ; WX 1105 ; N uni1FAD ; G 2465\nU 8110 ; WX 1028 ; N uni1FAE ; G 2466\nU 8111 ; WX 1076 ; N uni1FAF ; G 2467\nU 8112 ; WX 687 ; N uni1FB0 ; G 2468\nU 8113 ; WX 687 ; N uni1FB1 ; G 2469\nU 8114 ; WX 687 ; N uni1FB2 ; G 2470\nU 8115 ; WX 687 ; N uni1FB3 ; G 2471\nU 8116 ; WX 687 ; N uni1FB4 ; G 2472\nU 8118 ; WX 687 ; N uni1FB6 ; G 2473\nU 8119 ; WX 687 ; N uni1FB7 ; G 2474\nU 8120 ; WX 774 ; N uni1FB8 ; G 2475\nU 8121 ; WX 774 ; N uni1FB9 ; G 2476\nU 8122 ; WX 876 ; N uni1FBA ; G 2477\nU 8123 ; WX 797 ; N uni1FBB ; G 2478\nU 8124 ; WX 774 ; N uni1FBC ; G 2479\nU 8125 ; WX 500 ; N uni1FBD ; G 2480\nU 8126 ; WX 500 ; N uni1FBE ; G 2481\nU 8127 ; WX 500 ; N uni1FBF ; G 2482\nU 8128 ; WX 500 ; N uni1FC0 ; G 2483\nU 8129 ; WX 500 ; N uni1FC1 ; G 2484\nU 8130 ; WX 712 ; N uni1FC2 ; G 2485\nU 8131 ; WX 712 ; N uni1FC3 ; G 2486\nU 8132 ; WX 712 ; N uni1FC4 ; G 2487\nU 8134 ; WX 712 ; N uni1FC6 ; G 2488\nU 8135 ; WX 712 ; N uni1FC7 ; G 2489\nU 8136 ; WX 929 ; N uni1FC8 ; G 2490\nU 8137 ; WX 846 ; N uni1FC9 ; G 2491\nU 8138 ; WX 1080 ; N uni1FCA ; G 2492\nU 8139 ; WX 1009 ; N uni1FCB ; G 2493\nU 8140 ; WX 837 ; N uni1FCC ; G 2494\nU 8141 ; WX 500 ; N uni1FCD ; G 2495\nU 8142 ; WX 500 ; N uni1FCE ; G 2496\nU 8143 ; WX 500 ; N uni1FCF ; G 2497\nU 8144 ; WX 390 ; N uni1FD0 ; G 2498\nU 8145 ; WX 390 ; N uni1FD1 ; G 2499\nU 8146 ; WX 390 ; N uni1FD2 ; G 2500\nU 8147 ; WX 390 ; N uni1FD3 ; G 2501\nU 8150 ; WX 390 ; N uni1FD6 ; G 2502\nU 8151 ; WX 390 ; N uni1FD7 ; G 2503\nU 8152 ; WX 372 ; N uni1FD8 ; G 2504\nU 8153 ; WX 372 ; N uni1FD9 ; G 2505\nU 8154 ; WX 621 ; N uni1FDA ; G 2506\nU 8155 ; WX 563 ; N uni1FDB ; G 2507\nU 8157 ; WX 500 ; N uni1FDD ; G 2508\nU 8158 ; WX 500 ; N uni1FDE ; G 2509\nU 8159 ; WX 500 ; N uni1FDF ; G 2510\nU 8160 ; WX 675 ; N uni1FE0 ; G 2511\nU 8161 ; WX 675 ; N uni1FE1 ; G 2512\nU 8162 ; WX 675 ; N uni1FE2 ; G 2513\nU 8163 ; WX 675 ; N uni1FE3 ; G 2514\nU 8164 ; WX 716 ; N uni1FE4 ; G 2515\nU 8165 ; WX 716 ; N uni1FE5 ; G 2516\nU 8166 ; WX 675 ; N uni1FE6 ; G 2517\nU 8167 ; WX 675 ; N uni1FE7 ; G 2518\nU 8168 ; WX 724 ; N uni1FE8 ; G 2519\nU 8169 ; WX 724 ; N uni1FE9 ; G 2520\nU 8170 ; WX 1020 ; N uni1FEA ; G 2521\nU 8171 ; WX 980 ; N uni1FEB ; G 2522\nU 8172 ; WX 838 ; N uni1FEC ; G 2523\nU 8173 ; WX 500 ; N uni1FED ; G 2524\nU 8174 ; WX 500 ; N uni1FEE ; G 2525\nU 8175 ; WX 500 ; N uni1FEF ; G 2526\nU 8178 ; WX 869 ; N uni1FF2 ; G 2527\nU 8179 ; WX 869 ; N uni1FF3 ; G 2528\nU 8180 ; WX 869 ; N uni1FF4 ; G 2529\nU 8182 ; WX 869 ; N uni1FF6 ; G 2530\nU 8183 ; WX 869 ; N uni1FF7 ; G 2531\nU 8184 ; WX 1065 ; N uni1FF8 ; G 2532\nU 8185 ; WX 891 ; N uni1FF9 ; G 2533\nU 8186 ; WX 1084 ; N uni1FFA ; G 2534\nU 8187 ; WX 894 ; N uni1FFB ; G 2535\nU 8188 ; WX 850 ; N uni1FFC ; G 2536\nU 8189 ; WX 500 ; N uni1FFD ; G 2537\nU 8190 ; WX 500 ; N uni1FFE ; G 2538\nU 8192 ; WX 500 ; N uni2000 ; G 2539\nU 8193 ; WX 1000 ; N uni2001 ; G 2540\nU 8194 ; WX 500 ; N uni2002 ; G 2541\nU 8195 ; WX 1000 ; N uni2003 ; G 2542\nU 8196 ; WX 330 ; N uni2004 ; G 2543\nU 8197 ; WX 250 ; N uni2005 ; G 2544\nU 8198 ; WX 167 ; N uni2006 ; G 2545\nU 8199 ; WX 696 ; N uni2007 ; G 2546\nU 8200 ; WX 380 ; N uni2008 ; G 2547\nU 8201 ; WX 200 ; N uni2009 ; G 2548\nU 8202 ; WX 100 ; N uni200A ; G 2549\nU 8203 ; WX 0 ; N uni200B ; G 2550\nU 8204 ; WX 0 ; N uni200C ; G 2551\nU 8205 ; WX 0 ; N uni200D ; G 2552\nU 8206 ; WX 0 ; N uni200E ; G 2553\nU 8207 ; WX 0 ; N uni200F ; G 2554\nU 8208 ; WX 415 ; N uni2010 ; G 2555\nU 8209 ; WX 415 ; N uni2011 ; G 2556\nU 8210 ; WX 696 ; N figuredash ; G 2557\nU 8211 ; WX 500 ; N endash ; G 2558\nU 8212 ; WX 1000 ; N emdash ; G 2559\nU 8213 ; WX 1000 ; N uni2015 ; G 2560\nU 8214 ; WX 500 ; N uni2016 ; G 2561\nU 8215 ; WX 500 ; N underscoredbl ; G 2562\nU 8216 ; WX 380 ; N quoteleft ; G 2563\nU 8217 ; WX 380 ; N quoteright ; G 2564\nU 8218 ; WX 380 ; N quotesinglbase ; G 2565\nU 8219 ; WX 380 ; N quotereversed ; G 2566\nU 8220 ; WX 644 ; N quotedblleft ; G 2567\nU 8221 ; WX 644 ; N quotedblright ; G 2568\nU 8222 ; WX 644 ; N quotedblbase ; G 2569\nU 8223 ; WX 657 ; N uni201F ; G 2570\nU 8224 ; WX 500 ; N dagger ; G 2571\nU 8225 ; WX 500 ; N daggerdbl ; G 2572\nU 8226 ; WX 639 ; N bullet ; G 2573\nU 8227 ; WX 639 ; N uni2023 ; G 2574\nU 8228 ; WX 380 ; N onedotenleader ; G 2575\nU 8229 ; WX 685 ; N twodotenleader ; G 2576\nU 8230 ; WX 1000 ; N ellipsis ; G 2577\nU 8231 ; WX 348 ; N uni2027 ; G 2578\nU 8232 ; WX 0 ; N uni2028 ; G 2579\nU 8233 ; WX 0 ; N uni2029 ; G 2580\nU 8234 ; WX 0 ; N uni202A ; G 2581\nU 8235 ; WX 0 ; N uni202B ; G 2582\nU 8236 ; WX 0 ; N uni202C ; G 2583\nU 8237 ; WX 0 ; N uni202D ; G 2584\nU 8238 ; WX 0 ; N uni202E ; G 2585\nU 8239 ; WX 200 ; N uni202F ; G 2586\nU 8240 ; WX 1454 ; N perthousand ; G 2587\nU 8241 ; WX 1908 ; N uni2031 ; G 2588\nU 8242 ; WX 264 ; N minute ; G 2589\nU 8243 ; WX 447 ; N second ; G 2590\nU 8244 ; WX 630 ; N uni2034 ; G 2591\nU 8245 ; WX 264 ; N uni2035 ; G 2592\nU 8246 ; WX 447 ; N uni2036 ; G 2593\nU 8247 ; WX 630 ; N uni2037 ; G 2594\nU 8248 ; WX 733 ; N uni2038 ; G 2595\nU 8249 ; WX 412 ; N guilsinglleft ; G 2596\nU 8250 ; WX 412 ; N guilsinglright ; G 2597\nU 8251 ; WX 972 ; N uni203B ; G 2598\nU 8252 ; WX 627 ; N exclamdbl ; G 2599\nU 8253 ; WX 580 ; N uni203D ; G 2600\nU 8254 ; WX 500 ; N uni203E ; G 2601\nU 8255 ; WX 828 ; N uni203F ; G 2602\nU 8256 ; WX 828 ; N uni2040 ; G 2603\nU 8257 ; WX 329 ; N uni2041 ; G 2604\nU 8258 ; WX 1023 ; N uni2042 ; G 2605\nU 8259 ; WX 500 ; N uni2043 ; G 2606\nU 8260 ; WX 167 ; N fraction ; G 2607\nU 8261 ; WX 457 ; N uni2045 ; G 2608\nU 8262 ; WX 457 ; N uni2046 ; G 2609\nU 8263 ; WX 1030 ; N uni2047 ; G 2610\nU 8264 ; WX 829 ; N uni2048 ; G 2611\nU 8265 ; WX 829 ; N uni2049 ; G 2612\nU 8266 ; WX 513 ; N uni204A ; G 2613\nU 8267 ; WX 687 ; N uni204B ; G 2614\nU 8268 ; WX 500 ; N uni204C ; G 2615\nU 8269 ; WX 500 ; N uni204D ; G 2616\nU 8270 ; WX 523 ; N uni204E ; G 2617\nU 8271 ; WX 400 ; N uni204F ; G 2618\nU 8272 ; WX 828 ; N uni2050 ; G 2619\nU 8273 ; WX 523 ; N uni2051 ; G 2620\nU 8274 ; WX 556 ; N uni2052 ; G 2621\nU 8275 ; WX 838 ; N uni2053 ; G 2622\nU 8276 ; WX 828 ; N uni2054 ; G 2623\nU 8277 ; WX 838 ; N uni2055 ; G 2624\nU 8278 ; WX 684 ; N uni2056 ; G 2625\nU 8279 ; WX 813 ; N uni2057 ; G 2626\nU 8280 ; WX 838 ; N uni2058 ; G 2627\nU 8281 ; WX 838 ; N uni2059 ; G 2628\nU 8282 ; WX 380 ; N uni205A ; G 2629\nU 8283 ; WX 872 ; N uni205B ; G 2630\nU 8284 ; WX 838 ; N uni205C ; G 2631\nU 8285 ; WX 380 ; N uni205D ; G 2632\nU 8286 ; WX 380 ; N uni205E ; G 2633\nU 8287 ; WX 222 ; N uni205F ; G 2634\nU 8288 ; WX 0 ; N uni2060 ; G 2635\nU 8289 ; WX 0 ; N uni2061 ; G 2636\nU 8290 ; WX 0 ; N uni2062 ; G 2637\nU 8291 ; WX 0 ; N uni2063 ; G 2638\nU 8292 ; WX 0 ; N uni2064 ; G 2639\nU 8298 ; WX 0 ; N uni206A ; G 2640\nU 8299 ; WX 0 ; N uni206B ; G 2641\nU 8300 ; WX 0 ; N uni206C ; G 2642\nU 8301 ; WX 0 ; N uni206D ; G 2643\nU 8302 ; WX 0 ; N uni206E ; G 2644\nU 8303 ; WX 0 ; N uni206F ; G 2645\nU 8304 ; WX 438 ; N uni2070 ; G 2646\nU 8305 ; WX 219 ; N uni2071 ; G 2647\nU 8308 ; WX 438 ; N uni2074 ; G 2648\nU 8309 ; WX 438 ; N uni2075 ; G 2649\nU 8310 ; WX 438 ; N uni2076 ; G 2650\nU 8311 ; WX 438 ; N uni2077 ; G 2651\nU 8312 ; WX 438 ; N uni2078 ; G 2652\nU 8313 ; WX 438 ; N uni2079 ; G 2653\nU 8314 ; WX 528 ; N uni207A ; G 2654\nU 8315 ; WX 528 ; N uni207B ; G 2655\nU 8316 ; WX 528 ; N uni207C ; G 2656\nU 8317 ; WX 288 ; N uni207D ; G 2657\nU 8318 ; WX 288 ; N uni207E ; G 2658\nU 8319 ; WX 456 ; N uni207F ; G 2659\nU 8320 ; WX 438 ; N uni2080 ; G 2660\nU 8321 ; WX 438 ; N uni2081 ; G 2661\nU 8322 ; WX 438 ; N uni2082 ; G 2662\nU 8323 ; WX 438 ; N uni2083 ; G 2663\nU 8324 ; WX 438 ; N uni2084 ; G 2664\nU 8325 ; WX 438 ; N uni2085 ; G 2665\nU 8326 ; WX 438 ; N uni2086 ; G 2666\nU 8327 ; WX 438 ; N uni2087 ; G 2667\nU 8328 ; WX 438 ; N uni2088 ; G 2668\nU 8329 ; WX 438 ; N uni2089 ; G 2669\nU 8330 ; WX 528 ; N uni208A ; G 2670\nU 8331 ; WX 528 ; N uni208B ; G 2671\nU 8332 ; WX 528 ; N uni208C ; G 2672\nU 8333 ; WX 288 ; N uni208D ; G 2673\nU 8334 ; WX 288 ; N uni208E ; G 2674\nU 8336 ; WX 458 ; N uni2090 ; G 2675\nU 8337 ; WX 479 ; N uni2091 ; G 2676\nU 8338 ; WX 488 ; N uni2092 ; G 2677\nU 8339 ; WX 413 ; N uni2093 ; G 2678\nU 8340 ; WX 479 ; N uni2094 ; G 2679\nU 8341 ; WX 456 ; N uni2095 ; G 2680\nU 8342 ; WX 487 ; N uni2096 ; G 2681\nU 8343 ; WX 219 ; N uni2097 ; G 2682\nU 8344 ; WX 664 ; N uni2098 ; G 2683\nU 8345 ; WX 456 ; N uni2099 ; G 2684\nU 8346 ; WX 479 ; N uni209A ; G 2685\nU 8347 ; WX 381 ; N uni209B ; G 2686\nU 8348 ; WX 388 ; N uni209C ; G 2687\nU 8352 ; WX 929 ; N uni20A0 ; G 2688\nU 8353 ; WX 696 ; N colonmonetary ; G 2689\nU 8354 ; WX 696 ; N uni20A2 ; G 2690\nU 8355 ; WX 696 ; N franc ; G 2691\nU 8356 ; WX 696 ; N lira ; G 2692\nU 8357 ; WX 1042 ; N uni20A5 ; G 2693\nU 8358 ; WX 696 ; N uni20A6 ; G 2694\nU 8359 ; WX 1488 ; N peseta ; G 2695\nU 8360 ; WX 1205 ; N uni20A8 ; G 2696\nU 8361 ; WX 1103 ; N uni20A9 ; G 2697\nU 8362 ; WX 854 ; N uni20AA ; G 2698\nU 8363 ; WX 696 ; N dong ; G 2699\nU 8364 ; WX 696 ; N Euro ; G 2700\nU 8365 ; WX 696 ; N uni20AD ; G 2701\nU 8366 ; WX 696 ; N uni20AE ; G 2702\nU 8367 ; WX 1392 ; N uni20AF ; G 2703\nU 8368 ; WX 696 ; N uni20B0 ; G 2704\nU 8369 ; WX 696 ; N uni20B1 ; G 2705\nU 8370 ; WX 696 ; N uni20B2 ; G 2706\nU 8371 ; WX 696 ; N uni20B3 ; G 2707\nU 8372 ; WX 859 ; N uni20B4 ; G 2708\nU 8373 ; WX 696 ; N uni20B5 ; G 2709\nU 8376 ; WX 696 ; N uni20B8 ; G 2710\nU 8377 ; WX 696 ; N uni20B9 ; G 2711\nU 8378 ; WX 696 ; N uni20BA ; G 2712\nU 8381 ; WX 696 ; N uni20BD ; G 2713\nU 8400 ; WX 0 ; N uni20D0 ; G 2714\nU 8401 ; WX 0 ; N uni20D1 ; G 2715\nU 8406 ; WX 0 ; N uni20D6 ; G 2716\nU 8407 ; WX 0 ; N uni20D7 ; G 2717\nU 8411 ; WX 0 ; N uni20DB ; G 2718\nU 8412 ; WX 0 ; N uni20DC ; G 2719\nU 8417 ; WX 0 ; N uni20E1 ; G 2720\nU 8448 ; WX 1106 ; N uni2100 ; G 2721\nU 8449 ; WX 1106 ; N uni2101 ; G 2722\nU 8450 ; WX 734 ; N uni2102 ; G 2723\nU 8451 ; WX 1211 ; N uni2103 ; G 2724\nU 8452 ; WX 896 ; N uni2104 ; G 2725\nU 8453 ; WX 1114 ; N uni2105 ; G 2726\nU 8454 ; WX 1148 ; N uni2106 ; G 2727\nU 8455 ; WX 696 ; N uni2107 ; G 2728\nU 8456 ; WX 698 ; N uni2108 ; G 2729\nU 8457 ; WX 952 ; N uni2109 ; G 2730\nU 8459 ; WX 1073 ; N uni210B ; G 2731\nU 8460 ; WX 913 ; N uni210C ; G 2732\nU 8461 ; WX 888 ; N uni210D ; G 2733\nU 8462 ; WX 712 ; N uni210E ; G 2734\nU 8463 ; WX 712 ; N uni210F ; G 2735\nU 8464 ; WX 597 ; N uni2110 ; G 2736\nU 8465 ; WX 697 ; N Ifraktur ; G 2737\nU 8466 ; WX 856 ; N uni2112 ; G 2738\nU 8467 ; WX 472 ; N uni2113 ; G 2739\nU 8468 ; WX 974 ; N uni2114 ; G 2740\nU 8469 ; WX 837 ; N uni2115 ; G 2741\nU 8470 ; WX 1203 ; N uni2116 ; G 2742\nU 8471 ; WX 1000 ; N uni2117 ; G 2743\nU 8472 ; WX 697 ; N weierstrass ; G 2744\nU 8473 ; WX 750 ; N uni2119 ; G 2745\nU 8474 ; WX 850 ; N uni211A ; G 2746\nU 8475 ; WX 938 ; N uni211B ; G 2747\nU 8476 ; WX 814 ; N Rfraktur ; G 2748\nU 8477 ; WX 801 ; N uni211D ; G 2749\nU 8478 ; WX 896 ; N prescription ; G 2750\nU 8479 ; WX 710 ; N uni211F ; G 2751\nU 8480 ; WX 1020 ; N uni2120 ; G 2752\nU 8481 ; WX 1239 ; N uni2121 ; G 2753\nU 8482 ; WX 1000 ; N trademark ; G 2754\nU 8483 ; WX 834 ; N uni2123 ; G 2755\nU 8484 ; WX 754 ; N uni2124 ; G 2756\nU 8485 ; WX 622 ; N uni2125 ; G 2757\nU 8486 ; WX 850 ; N uni2126 ; G 2758\nU 8487 ; WX 769 ; N uni2127 ; G 2759\nU 8488 ; WX 763 ; N uni2128 ; G 2760\nU 8489 ; WX 303 ; N uni2129 ; G 2761\nU 8490 ; WX 775 ; N uni212A ; G 2762\nU 8491 ; WX 774 ; N uni212B ; G 2763\nU 8492 ; WX 928 ; N uni212C ; G 2764\nU 8493 ; WX 818 ; N uni212D ; G 2765\nU 8494 ; WX 854 ; N estimated ; G 2766\nU 8495 ; WX 636 ; N uni212F ; G 2767\nU 8496 ; WX 729 ; N uni2130 ; G 2768\nU 8497 ; WX 808 ; N uni2131 ; G 2769\nU 8498 ; WX 683 ; N uni2132 ; G 2770\nU 8499 ; WX 1184 ; N uni2133 ; G 2771\nU 8500 ; WX 465 ; N uni2134 ; G 2772\nU 8501 ; WX 794 ; N aleph ; G 2773\nU 8502 ; WX 731 ; N uni2136 ; G 2774\nU 8503 ; WX 494 ; N uni2137 ; G 2775\nU 8504 ; WX 684 ; N uni2138 ; G 2776\nU 8505 ; WX 380 ; N uni2139 ; G 2777\nU 8506 ; WX 945 ; N uni213A ; G 2778\nU 8507 ; WX 1370 ; N uni213B ; G 2779\nU 8508 ; WX 790 ; N uni213C ; G 2780\nU 8509 ; WX 737 ; N uni213D ; G 2781\nU 8510 ; WX 654 ; N uni213E ; G 2782\nU 8511 ; WX 863 ; N uni213F ; G 2783\nU 8512 ; WX 840 ; N uni2140 ; G 2784\nU 8513 ; WX 786 ; N uni2141 ; G 2785\nU 8514 ; WX 576 ; N uni2142 ; G 2786\nU 8515 ; WX 637 ; N uni2143 ; G 2787\nU 8516 ; WX 760 ; N uni2144 ; G 2788\nU 8517 ; WX 830 ; N uni2145 ; G 2789\nU 8518 ; WX 716 ; N uni2146 ; G 2790\nU 8519 ; WX 678 ; N uni2147 ; G 2791\nU 8520 ; WX 343 ; N uni2148 ; G 2792\nU 8521 ; WX 343 ; N uni2149 ; G 2793\nU 8523 ; WX 872 ; N uni214B ; G 2794\nU 8526 ; WX 547 ; N uni214E ; G 2795\nU 8528 ; WX 1035 ; N uni2150 ; G 2796\nU 8529 ; WX 1035 ; N uni2151 ; G 2797\nU 8530 ; WX 1483 ; N uni2152 ; G 2798\nU 8531 ; WX 1035 ; N onethird ; G 2799\nU 8532 ; WX 1035 ; N twothirds ; G 2800\nU 8533 ; WX 1035 ; N uni2155 ; G 2801\nU 8534 ; WX 1035 ; N uni2156 ; G 2802\nU 8535 ; WX 1035 ; N uni2157 ; G 2803\nU 8536 ; WX 1035 ; N uni2158 ; G 2804\nU 8537 ; WX 1035 ; N uni2159 ; G 2805\nU 8538 ; WX 1035 ; N uni215A ; G 2806\nU 8539 ; WX 1035 ; N oneeighth ; G 2807\nU 8540 ; WX 1035 ; N threeeighths ; G 2808\nU 8541 ; WX 1035 ; N fiveeighths ; G 2809\nU 8542 ; WX 1035 ; N seveneighths ; G 2810\nU 8543 ; WX 615 ; N uni215F ; G 2811\nU 8544 ; WX 372 ; N uni2160 ; G 2812\nU 8545 ; WX 659 ; N uni2161 ; G 2813\nU 8546 ; WX 945 ; N uni2162 ; G 2814\nU 8547 ; WX 1099 ; N uni2163 ; G 2815\nU 8548 ; WX 774 ; N uni2164 ; G 2816\nU 8549 ; WX 1099 ; N uni2165 ; G 2817\nU 8550 ; WX 1386 ; N uni2166 ; G 2818\nU 8551 ; WX 1672 ; N uni2167 ; G 2819\nU 8552 ; WX 1121 ; N uni2168 ; G 2820\nU 8553 ; WX 771 ; N uni2169 ; G 2821\nU 8554 ; WX 1120 ; N uni216A ; G 2822\nU 8555 ; WX 1407 ; N uni216B ; G 2823\nU 8556 ; WX 637 ; N uni216C ; G 2824\nU 8557 ; WX 734 ; N uni216D ; G 2825\nU 8558 ; WX 830 ; N uni216E ; G 2826\nU 8559 ; WX 995 ; N uni216F ; G 2827\nU 8560 ; WX 343 ; N uni2170 ; G 2828\nU 8561 ; WX 607 ; N uni2171 ; G 2829\nU 8562 ; WX 872 ; N uni2172 ; G 2830\nU 8563 ; WX 984 ; N uni2173 ; G 2831\nU 8564 ; WX 652 ; N uni2174 ; G 2832\nU 8565 ; WX 962 ; N uni2175 ; G 2833\nU 8566 ; WX 1227 ; N uni2176 ; G 2834\nU 8567 ; WX 1491 ; N uni2177 ; G 2835\nU 8568 ; WX 969 ; N uni2178 ; G 2836\nU 8569 ; WX 645 ; N uni2179 ; G 2837\nU 8570 ; WX 969 ; N uni217A ; G 2838\nU 8571 ; WX 1233 ; N uni217B ; G 2839\nU 8572 ; WX 343 ; N uni217C ; G 2840\nU 8573 ; WX 593 ; N uni217D ; G 2841\nU 8574 ; WX 716 ; N uni217E ; G 2842\nU 8575 ; WX 1042 ; N uni217F ; G 2843\nU 8576 ; WX 1289 ; N uni2180 ; G 2844\nU 8577 ; WX 830 ; N uni2181 ; G 2845\nU 8578 ; WX 1289 ; N uni2182 ; G 2846\nU 8579 ; WX 734 ; N uni2183 ; G 2847\nU 8580 ; WX 593 ; N uni2184 ; G 2848\nU 8581 ; WX 734 ; N uni2185 ; G 2849\nU 8585 ; WX 1035 ; N uni2189 ; G 2850\nU 8592 ; WX 838 ; N arrowleft ; G 2851\nU 8593 ; WX 838 ; N arrowup ; G 2852\nU 8594 ; WX 838 ; N arrowright ; G 2853\nU 8595 ; WX 838 ; N arrowdown ; G 2854\nU 8596 ; WX 838 ; N arrowboth ; G 2855\nU 8597 ; WX 838 ; N arrowupdn ; G 2856\nU 8598 ; WX 838 ; N uni2196 ; G 2857\nU 8599 ; WX 838 ; N uni2197 ; G 2858\nU 8600 ; WX 838 ; N uni2198 ; G 2859\nU 8601 ; WX 838 ; N uni2199 ; G 2860\nU 8602 ; WX 838 ; N uni219A ; G 2861\nU 8603 ; WX 838 ; N uni219B ; G 2862\nU 8604 ; WX 838 ; N uni219C ; G 2863\nU 8605 ; WX 838 ; N uni219D ; G 2864\nU 8606 ; WX 838 ; N uni219E ; G 2865\nU 8607 ; WX 838 ; N uni219F ; G 2866\nU 8608 ; WX 838 ; N uni21A0 ; G 2867\nU 8609 ; WX 838 ; N uni21A1 ; G 2868\nU 8610 ; WX 838 ; N uni21A2 ; G 2869\nU 8611 ; WX 838 ; N uni21A3 ; G 2870\nU 8612 ; WX 838 ; N uni21A4 ; G 2871\nU 8613 ; WX 838 ; N uni21A5 ; G 2872\nU 8614 ; WX 838 ; N uni21A6 ; G 2873\nU 8615 ; WX 838 ; N uni21A7 ; G 2874\nU 8616 ; WX 838 ; N arrowupdnbse ; G 2875\nU 8617 ; WX 838 ; N uni21A9 ; G 2876\nU 8618 ; WX 838 ; N uni21AA ; G 2877\nU 8619 ; WX 838 ; N uni21AB ; G 2878\nU 8620 ; WX 838 ; N uni21AC ; G 2879\nU 8621 ; WX 838 ; N uni21AD ; G 2880\nU 8622 ; WX 838 ; N uni21AE ; G 2881\nU 8623 ; WX 838 ; N uni21AF ; G 2882\nU 8624 ; WX 838 ; N uni21B0 ; G 2883\nU 8625 ; WX 838 ; N uni21B1 ; G 2884\nU 8626 ; WX 838 ; N uni21B2 ; G 2885\nU 8627 ; WX 838 ; N uni21B3 ; G 2886\nU 8628 ; WX 838 ; N uni21B4 ; G 2887\nU 8629 ; WX 838 ; N carriagereturn ; G 2888\nU 8630 ; WX 838 ; N uni21B6 ; G 2889\nU 8631 ; WX 838 ; N uni21B7 ; G 2890\nU 8632 ; WX 838 ; N uni21B8 ; G 2891\nU 8633 ; WX 838 ; N uni21B9 ; G 2892\nU 8634 ; WX 838 ; N uni21BA ; G 2893\nU 8635 ; WX 838 ; N uni21BB ; G 2894\nU 8636 ; WX 838 ; N uni21BC ; G 2895\nU 8637 ; WX 838 ; N uni21BD ; G 2896\nU 8638 ; WX 838 ; N uni21BE ; G 2897\nU 8639 ; WX 838 ; N uni21BF ; G 2898\nU 8640 ; WX 838 ; N uni21C0 ; G 2899\nU 8641 ; WX 838 ; N uni21C1 ; G 2900\nU 8642 ; WX 838 ; N uni21C2 ; G 2901\nU 8643 ; WX 838 ; N uni21C3 ; G 2902\nU 8644 ; WX 838 ; N uni21C4 ; G 2903\nU 8645 ; WX 838 ; N uni21C5 ; G 2904\nU 8646 ; WX 838 ; N uni21C6 ; G 2905\nU 8647 ; WX 838 ; N uni21C7 ; G 2906\nU 8648 ; WX 838 ; N uni21C8 ; G 2907\nU 8649 ; WX 838 ; N uni21C9 ; G 2908\nU 8650 ; WX 838 ; N uni21CA ; G 2909\nU 8651 ; WX 838 ; N uni21CB ; G 2910\nU 8652 ; WX 838 ; N uni21CC ; G 2911\nU 8653 ; WX 838 ; N uni21CD ; G 2912\nU 8654 ; WX 838 ; N uni21CE ; G 2913\nU 8655 ; WX 838 ; N uni21CF ; G 2914\nU 8656 ; WX 838 ; N arrowdblleft ; G 2915\nU 8657 ; WX 838 ; N arrowdblup ; G 2916\nU 8658 ; WX 838 ; N arrowdblright ; G 2917\nU 8659 ; WX 838 ; N arrowdbldown ; G 2918\nU 8660 ; WX 838 ; N arrowdblboth ; G 2919\nU 8661 ; WX 838 ; N uni21D5 ; G 2920\nU 8662 ; WX 838 ; N uni21D6 ; G 2921\nU 8663 ; WX 838 ; N uni21D7 ; G 2922\nU 8664 ; WX 838 ; N uni21D8 ; G 2923\nU 8665 ; WX 838 ; N uni21D9 ; G 2924\nU 8666 ; WX 838 ; N uni21DA ; G 2925\nU 8667 ; WX 838 ; N uni21DB ; G 2926\nU 8668 ; WX 838 ; N uni21DC ; G 2927\nU 8669 ; WX 838 ; N uni21DD ; G 2928\nU 8670 ; WX 838 ; N uni21DE ; G 2929\nU 8671 ; WX 838 ; N uni21DF ; G 2930\nU 8672 ; WX 838 ; N uni21E0 ; G 2931\nU 8673 ; WX 838 ; N uni21E1 ; G 2932\nU 8674 ; WX 838 ; N uni21E2 ; G 2933\nU 8675 ; WX 838 ; N uni21E3 ; G 2934\nU 8676 ; WX 838 ; N uni21E4 ; G 2935\nU 8677 ; WX 838 ; N uni21E5 ; G 2936\nU 8678 ; WX 838 ; N uni21E6 ; G 2937\nU 8679 ; WX 838 ; N uni21E7 ; G 2938\nU 8680 ; WX 838 ; N uni21E8 ; G 2939\nU 8681 ; WX 838 ; N uni21E9 ; G 2940\nU 8682 ; WX 838 ; N uni21EA ; G 2941\nU 8683 ; WX 838 ; N uni21EB ; G 2942\nU 8684 ; WX 838 ; N uni21EC ; G 2943\nU 8685 ; WX 838 ; N uni21ED ; G 2944\nU 8686 ; WX 838 ; N uni21EE ; G 2945\nU 8687 ; WX 838 ; N uni21EF ; G 2946\nU 8688 ; WX 838 ; N uni21F0 ; G 2947\nU 8689 ; WX 838 ; N uni21F1 ; G 2948\nU 8690 ; WX 838 ; N uni21F2 ; G 2949\nU 8691 ; WX 838 ; N uni21F3 ; G 2950\nU 8692 ; WX 838 ; N uni21F4 ; G 2951\nU 8693 ; WX 838 ; N uni21F5 ; G 2952\nU 8694 ; WX 838 ; N uni21F6 ; G 2953\nU 8695 ; WX 838 ; N uni21F7 ; G 2954\nU 8696 ; WX 838 ; N uni21F8 ; G 2955\nU 8697 ; WX 838 ; N uni21F9 ; G 2956\nU 8698 ; WX 838 ; N uni21FA ; G 2957\nU 8699 ; WX 838 ; N uni21FB ; G 2958\nU 8700 ; WX 838 ; N uni21FC ; G 2959\nU 8701 ; WX 838 ; N uni21FD ; G 2960\nU 8702 ; WX 838 ; N uni21FE ; G 2961\nU 8703 ; WX 838 ; N uni21FF ; G 2962\nU 8704 ; WX 774 ; N universal ; G 2963\nU 8705 ; WX 696 ; N uni2201 ; G 2964\nU 8706 ; WX 544 ; N partialdiff ; G 2965\nU 8707 ; WX 683 ; N existential ; G 2966\nU 8708 ; WX 683 ; N uni2204 ; G 2967\nU 8709 ; WX 856 ; N emptyset ; G 2968\nU 8710 ; WX 697 ; N increment ; G 2969\nU 8711 ; WX 697 ; N gradient ; G 2970\nU 8712 ; WX 896 ; N element ; G 2971\nU 8713 ; WX 896 ; N notelement ; G 2972\nU 8714 ; WX 750 ; N uni220A ; G 2973\nU 8715 ; WX 896 ; N suchthat ; G 2974\nU 8716 ; WX 896 ; N uni220C ; G 2975\nU 8717 ; WX 750 ; N uni220D ; G 2976\nU 8718 ; WX 636 ; N uni220E ; G 2977\nU 8719 ; WX 787 ; N product ; G 2978\nU 8720 ; WX 787 ; N uni2210 ; G 2979\nU 8721 ; WX 718 ; N summation ; G 2980\nU 8722 ; WX 838 ; N minus ; G 2981\nU 8723 ; WX 838 ; N uni2213 ; G 2982\nU 8724 ; WX 696 ; N uni2214 ; G 2983\nU 8725 ; WX 365 ; N uni2215 ; G 2984\nU 8726 ; WX 696 ; N uni2216 ; G 2985\nU 8727 ; WX 838 ; N asteriskmath ; G 2986\nU 8728 ; WX 626 ; N uni2218 ; G 2987\nU 8729 ; WX 380 ; N uni2219 ; G 2988\nU 8730 ; WX 667 ; N radical ; G 2989\nU 8731 ; WX 667 ; N uni221B ; G 2990\nU 8732 ; WX 667 ; N uni221C ; G 2991\nU 8733 ; WX 712 ; N proportional ; G 2992\nU 8734 ; WX 833 ; N infinity ; G 2993\nU 8735 ; WX 838 ; N orthogonal ; G 2994\nU 8736 ; WX 896 ; N angle ; G 2995\nU 8737 ; WX 896 ; N uni2221 ; G 2996\nU 8738 ; WX 838 ; N uni2222 ; G 2997\nU 8739 ; WX 500 ; N uni2223 ; G 2998\nU 8740 ; WX 500 ; N uni2224 ; G 2999\nU 8741 ; WX 500 ; N uni2225 ; G 3000\nU 8742 ; WX 500 ; N uni2226 ; G 3001\nU 8743 ; WX 812 ; N logicaland ; G 3002\nU 8744 ; WX 812 ; N logicalor ; G 3003\nU 8745 ; WX 812 ; N intersection ; G 3004\nU 8746 ; WX 812 ; N union ; G 3005\nU 8747 ; WX 610 ; N integral ; G 3006\nU 8748 ; WX 929 ; N uni222C ; G 3007\nU 8749 ; WX 1295 ; N uni222D ; G 3008\nU 8750 ; WX 563 ; N uni222E ; G 3009\nU 8751 ; WX 977 ; N uni222F ; G 3010\nU 8752 ; WX 1313 ; N uni2230 ; G 3011\nU 8753 ; WX 563 ; N uni2231 ; G 3012\nU 8754 ; WX 563 ; N uni2232 ; G 3013\nU 8755 ; WX 563 ; N uni2233 ; G 3014\nU 8756 ; WX 696 ; N therefore ; G 3015\nU 8757 ; WX 696 ; N uni2235 ; G 3016\nU 8758 ; WX 294 ; N uni2236 ; G 3017\nU 8759 ; WX 696 ; N uni2237 ; G 3018\nU 8760 ; WX 838 ; N uni2238 ; G 3019\nU 8761 ; WX 838 ; N uni2239 ; G 3020\nU 8762 ; WX 838 ; N uni223A ; G 3021\nU 8763 ; WX 838 ; N uni223B ; G 3022\nU 8764 ; WX 838 ; N similar ; G 3023\nU 8765 ; WX 838 ; N uni223D ; G 3024\nU 8766 ; WX 838 ; N uni223E ; G 3025\nU 8767 ; WX 838 ; N uni223F ; G 3026\nU 8768 ; WX 375 ; N uni2240 ; G 3027\nU 8769 ; WX 838 ; N uni2241 ; G 3028\nU 8770 ; WX 838 ; N uni2242 ; G 3029\nU 8771 ; WX 838 ; N uni2243 ; G 3030\nU 8772 ; WX 838 ; N uni2244 ; G 3031\nU 8773 ; WX 838 ; N congruent ; G 3032\nU 8774 ; WX 838 ; N uni2246 ; G 3033\nU 8775 ; WX 838 ; N uni2247 ; G 3034\nU 8776 ; WX 838 ; N approxequal ; G 3035\nU 8777 ; WX 838 ; N uni2249 ; G 3036\nU 8778 ; WX 838 ; N uni224A ; G 3037\nU 8779 ; WX 838 ; N uni224B ; G 3038\nU 8780 ; WX 838 ; N uni224C ; G 3039\nU 8781 ; WX 838 ; N uni224D ; G 3040\nU 8782 ; WX 838 ; N uni224E ; G 3041\nU 8783 ; WX 838 ; N uni224F ; G 3042\nU 8784 ; WX 838 ; N uni2250 ; G 3043\nU 8785 ; WX 838 ; N uni2251 ; G 3044\nU 8786 ; WX 838 ; N uni2252 ; G 3045\nU 8787 ; WX 838 ; N uni2253 ; G 3046\nU 8788 ; WX 1063 ; N uni2254 ; G 3047\nU 8789 ; WX 1063 ; N uni2255 ; G 3048\nU 8790 ; WX 838 ; N uni2256 ; G 3049\nU 8791 ; WX 838 ; N uni2257 ; G 3050\nU 8792 ; WX 838 ; N uni2258 ; G 3051\nU 8793 ; WX 838 ; N uni2259 ; G 3052\nU 8794 ; WX 838 ; N uni225A ; G 3053\nU 8795 ; WX 838 ; N uni225B ; G 3054\nU 8796 ; WX 838 ; N uni225C ; G 3055\nU 8797 ; WX 838 ; N uni225D ; G 3056\nU 8798 ; WX 838 ; N uni225E ; G 3057\nU 8799 ; WX 838 ; N uni225F ; G 3058\nU 8800 ; WX 838 ; N notequal ; G 3059\nU 8801 ; WX 838 ; N equivalence ; G 3060\nU 8802 ; WX 838 ; N uni2262 ; G 3061\nU 8803 ; WX 838 ; N uni2263 ; G 3062\nU 8804 ; WX 838 ; N lessequal ; G 3063\nU 8805 ; WX 838 ; N greaterequal ; G 3064\nU 8806 ; WX 838 ; N uni2266 ; G 3065\nU 8807 ; WX 838 ; N uni2267 ; G 3066\nU 8808 ; WX 841 ; N uni2268 ; G 3067\nU 8809 ; WX 841 ; N uni2269 ; G 3068\nU 8810 ; WX 1047 ; N uni226A ; G 3069\nU 8811 ; WX 1047 ; N uni226B ; G 3070\nU 8812 ; WX 500 ; N uni226C ; G 3071\nU 8813 ; WX 838 ; N uni226D ; G 3072\nU 8814 ; WX 838 ; N uni226E ; G 3073\nU 8815 ; WX 838 ; N uni226F ; G 3074\nU 8816 ; WX 838 ; N uni2270 ; G 3075\nU 8817 ; WX 838 ; N uni2271 ; G 3076\nU 8818 ; WX 838 ; N uni2272 ; G 3077\nU 8819 ; WX 838 ; N uni2273 ; G 3078\nU 8820 ; WX 838 ; N uni2274 ; G 3079\nU 8821 ; WX 838 ; N uni2275 ; G 3080\nU 8822 ; WX 838 ; N uni2276 ; G 3081\nU 8823 ; WX 838 ; N uni2277 ; G 3082\nU 8824 ; WX 838 ; N uni2278 ; G 3083\nU 8825 ; WX 838 ; N uni2279 ; G 3084\nU 8826 ; WX 838 ; N uni227A ; G 3085\nU 8827 ; WX 838 ; N uni227B ; G 3086\nU 8828 ; WX 838 ; N uni227C ; G 3087\nU 8829 ; WX 838 ; N uni227D ; G 3088\nU 8830 ; WX 838 ; N uni227E ; G 3089\nU 8831 ; WX 838 ; N uni227F ; G 3090\nU 8832 ; WX 838 ; N uni2280 ; G 3091\nU 8833 ; WX 838 ; N uni2281 ; G 3092\nU 8834 ; WX 838 ; N propersubset ; G 3093\nU 8835 ; WX 838 ; N propersuperset ; G 3094\nU 8836 ; WX 838 ; N notsubset ; G 3095\nU 8837 ; WX 838 ; N uni2285 ; G 3096\nU 8838 ; WX 838 ; N reflexsubset ; G 3097\nU 8839 ; WX 838 ; N reflexsuperset ; G 3098\nU 8840 ; WX 838 ; N uni2288 ; G 3099\nU 8841 ; WX 838 ; N uni2289 ; G 3100\nU 8842 ; WX 838 ; N uni228A ; G 3101\nU 8843 ; WX 838 ; N uni228B ; G 3102\nU 8844 ; WX 812 ; N uni228C ; G 3103\nU 8845 ; WX 812 ; N uni228D ; G 3104\nU 8846 ; WX 812 ; N uni228E ; G 3105\nU 8847 ; WX 838 ; N uni228F ; G 3106\nU 8848 ; WX 838 ; N uni2290 ; G 3107\nU 8849 ; WX 838 ; N uni2291 ; G 3108\nU 8850 ; WX 838 ; N uni2292 ; G 3109\nU 8851 ; WX 796 ; N uni2293 ; G 3110\nU 8852 ; WX 796 ; N uni2294 ; G 3111\nU 8853 ; WX 838 ; N circleplus ; G 3112\nU 8854 ; WX 838 ; N uni2296 ; G 3113\nU 8855 ; WX 838 ; N circlemultiply ; G 3114\nU 8856 ; WX 838 ; N uni2298 ; G 3115\nU 8857 ; WX 838 ; N uni2299 ; G 3116\nU 8858 ; WX 838 ; N uni229A ; G 3117\nU 8859 ; WX 838 ; N uni229B ; G 3118\nU 8860 ; WX 838 ; N uni229C ; G 3119\nU 8861 ; WX 838 ; N uni229D ; G 3120\nU 8862 ; WX 838 ; N uni229E ; G 3121\nU 8863 ; WX 838 ; N uni229F ; G 3122\nU 8864 ; WX 838 ; N uni22A0 ; G 3123\nU 8865 ; WX 838 ; N uni22A1 ; G 3124\nU 8866 ; WX 914 ; N uni22A2 ; G 3125\nU 8867 ; WX 914 ; N uni22A3 ; G 3126\nU 8868 ; WX 914 ; N uni22A4 ; G 3127\nU 8869 ; WX 914 ; N perpendicular ; G 3128\nU 8870 ; WX 542 ; N uni22A6 ; G 3129\nU 8871 ; WX 542 ; N uni22A7 ; G 3130\nU 8872 ; WX 914 ; N uni22A8 ; G 3131\nU 8873 ; WX 914 ; N uni22A9 ; G 3132\nU 8874 ; WX 914 ; N uni22AA ; G 3133\nU 8875 ; WX 914 ; N uni22AB ; G 3134\nU 8876 ; WX 914 ; N uni22AC ; G 3135\nU 8877 ; WX 914 ; N uni22AD ; G 3136\nU 8878 ; WX 914 ; N uni22AE ; G 3137\nU 8879 ; WX 914 ; N uni22AF ; G 3138\nU 8880 ; WX 838 ; N uni22B0 ; G 3139\nU 8881 ; WX 838 ; N uni22B1 ; G 3140\nU 8882 ; WX 838 ; N uni22B2 ; G 3141\nU 8883 ; WX 838 ; N uni22B3 ; G 3142\nU 8884 ; WX 838 ; N uni22B4 ; G 3143\nU 8885 ; WX 838 ; N uni22B5 ; G 3144\nU 8886 ; WX 1000 ; N uni22B6 ; G 3145\nU 8887 ; WX 1000 ; N uni22B7 ; G 3146\nU 8888 ; WX 838 ; N uni22B8 ; G 3147\nU 8889 ; WX 838 ; N uni22B9 ; G 3148\nU 8890 ; WX 542 ; N uni22BA ; G 3149\nU 8891 ; WX 812 ; N uni22BB ; G 3150\nU 8892 ; WX 812 ; N uni22BC ; G 3151\nU 8893 ; WX 812 ; N uni22BD ; G 3152\nU 8894 ; WX 838 ; N uni22BE ; G 3153\nU 8895 ; WX 838 ; N uni22BF ; G 3154\nU 8896 ; WX 843 ; N uni22C0 ; G 3155\nU 8897 ; WX 843 ; N uni22C1 ; G 3156\nU 8898 ; WX 843 ; N uni22C2 ; G 3157\nU 8899 ; WX 843 ; N uni22C3 ; G 3158\nU 8900 ; WX 626 ; N uni22C4 ; G 3159\nU 8901 ; WX 380 ; N dotmath ; G 3160\nU 8902 ; WX 626 ; N uni22C6 ; G 3161\nU 8903 ; WX 838 ; N uni22C7 ; G 3162\nU 8904 ; WX 1000 ; N uni22C8 ; G 3163\nU 8905 ; WX 1000 ; N uni22C9 ; G 3164\nU 8906 ; WX 1000 ; N uni22CA ; G 3165\nU 8907 ; WX 1000 ; N uni22CB ; G 3166\nU 8908 ; WX 1000 ; N uni22CC ; G 3167\nU 8909 ; WX 838 ; N uni22CD ; G 3168\nU 8910 ; WX 812 ; N uni22CE ; G 3169\nU 8911 ; WX 812 ; N uni22CF ; G 3170\nU 8912 ; WX 838 ; N uni22D0 ; G 3171\nU 8913 ; WX 838 ; N uni22D1 ; G 3172\nU 8914 ; WX 838 ; N uni22D2 ; G 3173\nU 8915 ; WX 838 ; N uni22D3 ; G 3174\nU 8916 ; WX 838 ; N uni22D4 ; G 3175\nU 8917 ; WX 838 ; N uni22D5 ; G 3176\nU 8918 ; WX 838 ; N uni22D6 ; G 3177\nU 8919 ; WX 838 ; N uni22D7 ; G 3178\nU 8920 ; WX 1422 ; N uni22D8 ; G 3179\nU 8921 ; WX 1422 ; N uni22D9 ; G 3180\nU 8922 ; WX 838 ; N uni22DA ; G 3181\nU 8923 ; WX 838 ; N uni22DB ; G 3182\nU 8924 ; WX 838 ; N uni22DC ; G 3183\nU 8925 ; WX 838 ; N uni22DD ; G 3184\nU 8926 ; WX 838 ; N uni22DE ; G 3185\nU 8927 ; WX 838 ; N uni22DF ; G 3186\nU 8928 ; WX 838 ; N uni22E0 ; G 3187\nU 8929 ; WX 838 ; N uni22E1 ; G 3188\nU 8930 ; WX 838 ; N uni22E2 ; G 3189\nU 8931 ; WX 838 ; N uni22E3 ; G 3190\nU 8932 ; WX 838 ; N uni22E4 ; G 3191\nU 8933 ; WX 838 ; N uni22E5 ; G 3192\nU 8934 ; WX 838 ; N uni22E6 ; G 3193\nU 8935 ; WX 838 ; N uni22E7 ; G 3194\nU 8936 ; WX 838 ; N uni22E8 ; G 3195\nU 8937 ; WX 838 ; N uni22E9 ; G 3196\nU 8938 ; WX 838 ; N uni22EA ; G 3197\nU 8939 ; WX 838 ; N uni22EB ; G 3198\nU 8940 ; WX 838 ; N uni22EC ; G 3199\nU 8941 ; WX 838 ; N uni22ED ; G 3200\nU 8942 ; WX 1000 ; N uni22EE ; G 3201\nU 8943 ; WX 1000 ; N uni22EF ; G 3202\nU 8944 ; WX 1000 ; N uni22F0 ; G 3203\nU 8945 ; WX 1000 ; N uni22F1 ; G 3204\nU 8946 ; WX 1158 ; N uni22F2 ; G 3205\nU 8947 ; WX 896 ; N uni22F3 ; G 3206\nU 8948 ; WX 750 ; N uni22F4 ; G 3207\nU 8949 ; WX 896 ; N uni22F5 ; G 3208\nU 8950 ; WX 896 ; N uni22F6 ; G 3209\nU 8951 ; WX 750 ; N uni22F7 ; G 3210\nU 8952 ; WX 896 ; N uni22F8 ; G 3211\nU 8953 ; WX 896 ; N uni22F9 ; G 3212\nU 8954 ; WX 1158 ; N uni22FA ; G 3213\nU 8955 ; WX 896 ; N uni22FB ; G 3214\nU 8956 ; WX 750 ; N uni22FC ; G 3215\nU 8957 ; WX 896 ; N uni22FD ; G 3216\nU 8958 ; WX 750 ; N uni22FE ; G 3217\nU 8959 ; WX 896 ; N uni22FF ; G 3218\nU 8960 ; WX 602 ; N uni2300 ; G 3219\nU 8961 ; WX 602 ; N uni2301 ; G 3220\nU 8962 ; WX 716 ; N house ; G 3221\nU 8963 ; WX 838 ; N uni2303 ; G 3222\nU 8964 ; WX 838 ; N uni2304 ; G 3223\nU 8965 ; WX 838 ; N uni2305 ; G 3224\nU 8966 ; WX 838 ; N uni2306 ; G 3225\nU 8967 ; WX 488 ; N uni2307 ; G 3226\nU 8968 ; WX 457 ; N uni2308 ; G 3227\nU 8969 ; WX 457 ; N uni2309 ; G 3228\nU 8970 ; WX 457 ; N uni230A ; G 3229\nU 8971 ; WX 457 ; N uni230B ; G 3230\nU 8972 ; WX 809 ; N uni230C ; G 3231\nU 8973 ; WX 809 ; N uni230D ; G 3232\nU 8974 ; WX 809 ; N uni230E ; G 3233\nU 8975 ; WX 809 ; N uni230F ; G 3234\nU 8976 ; WX 838 ; N revlogicalnot ; G 3235\nU 8977 ; WX 539 ; N uni2311 ; G 3236\nU 8984 ; WX 928 ; N uni2318 ; G 3237\nU 8985 ; WX 838 ; N uni2319 ; G 3238\nU 8988 ; WX 469 ; N uni231C ; G 3239\nU 8989 ; WX 469 ; N uni231D ; G 3240\nU 8990 ; WX 469 ; N uni231E ; G 3241\nU 8991 ; WX 469 ; N uni231F ; G 3242\nU 8992 ; WX 610 ; N integraltp ; G 3243\nU 8993 ; WX 610 ; N integralbt ; G 3244\nU 8996 ; WX 1152 ; N uni2324 ; G 3245\nU 8997 ; WX 1152 ; N uni2325 ; G 3246\nU 8998 ; WX 1414 ; N uni2326 ; G 3247\nU 8999 ; WX 1152 ; N uni2327 ; G 3248\nU 9000 ; WX 1443 ; N uni2328 ; G 3249\nU 9003 ; WX 1414 ; N uni232B ; G 3250\nU 9004 ; WX 873 ; N uni232C ; G 3251\nU 9075 ; WX 390 ; N uni2373 ; G 3252\nU 9076 ; WX 716 ; N uni2374 ; G 3253\nU 9077 ; WX 869 ; N uni2375 ; G 3254\nU 9082 ; WX 687 ; N uni237A ; G 3255\nU 9085 ; WX 863 ; N uni237D ; G 3256\nU 9095 ; WX 1152 ; N uni2387 ; G 3257\nU 9108 ; WX 873 ; N uni2394 ; G 3258\nU 9115 ; WX 500 ; N uni239B ; G 3259\nU 9116 ; WX 500 ; N uni239C ; G 3260\nU 9117 ; WX 500 ; N uni239D ; G 3261\nU 9118 ; WX 500 ; N uni239E ; G 3262\nU 9119 ; WX 500 ; N uni239F ; G 3263\nU 9120 ; WX 500 ; N uni23A0 ; G 3264\nU 9121 ; WX 500 ; N uni23A1 ; G 3265\nU 9122 ; WX 500 ; N uni23A2 ; G 3266\nU 9123 ; WX 500 ; N uni23A3 ; G 3267\nU 9124 ; WX 500 ; N uni23A4 ; G 3268\nU 9125 ; WX 500 ; N uni23A5 ; G 3269\nU 9126 ; WX 500 ; N uni23A6 ; G 3270\nU 9127 ; WX 750 ; N uni23A7 ; G 3271\nU 9128 ; WX 750 ; N uni23A8 ; G 3272\nU 9129 ; WX 750 ; N uni23A9 ; G 3273\nU 9130 ; WX 750 ; N uni23AA ; G 3274\nU 9131 ; WX 750 ; N uni23AB ; G 3275\nU 9132 ; WX 750 ; N uni23AC ; G 3276\nU 9133 ; WX 750 ; N uni23AD ; G 3277\nU 9134 ; WX 610 ; N uni23AE ; G 3278\nU 9166 ; WX 838 ; N uni23CE ; G 3279\nU 9167 ; WX 945 ; N uni23CF ; G 3280\nU 9187 ; WX 873 ; N uni23E3 ; G 3281\nU 9189 ; WX 769 ; N uni23E5 ; G 3282\nU 9192 ; WX 696 ; N uni23E8 ; G 3283\nU 9250 ; WX 716 ; N uni2422 ; G 3284\nU 9251 ; WX 716 ; N uni2423 ; G 3285\nU 9312 ; WX 847 ; N uni2460 ; G 3286\nU 9313 ; WX 847 ; N uni2461 ; G 3287\nU 9314 ; WX 847 ; N uni2462 ; G 3288\nU 9315 ; WX 847 ; N uni2463 ; G 3289\nU 9316 ; WX 847 ; N uni2464 ; G 3290\nU 9317 ; WX 847 ; N uni2465 ; G 3291\nU 9318 ; WX 847 ; N uni2466 ; G 3292\nU 9319 ; WX 847 ; N uni2467 ; G 3293\nU 9320 ; WX 847 ; N uni2468 ; G 3294\nU 9321 ; WX 847 ; N uni2469 ; G 3295\nU 9472 ; WX 602 ; N SF100000 ; G 3296\nU 9473 ; WX 602 ; N uni2501 ; G 3297\nU 9474 ; WX 602 ; N SF110000 ; G 3298\nU 9475 ; WX 602 ; N uni2503 ; G 3299\nU 9476 ; WX 602 ; N uni2504 ; G 3300\nU 9477 ; WX 602 ; N uni2505 ; G 3301\nU 9478 ; WX 602 ; N uni2506 ; G 3302\nU 9479 ; WX 602 ; N uni2507 ; G 3303\nU 9480 ; WX 602 ; N uni2508 ; G 3304\nU 9481 ; WX 602 ; N uni2509 ; G 3305\nU 9482 ; WX 602 ; N uni250A ; G 3306\nU 9483 ; WX 602 ; N uni250B ; G 3307\nU 9484 ; WX 602 ; N SF010000 ; G 3308\nU 9485 ; WX 602 ; N uni250D ; G 3309\nU 9486 ; WX 602 ; N uni250E ; G 3310\nU 9487 ; WX 602 ; N uni250F ; G 3311\nU 9488 ; WX 602 ; N SF030000 ; G 3312\nU 9489 ; WX 602 ; N uni2511 ; G 3313\nU 9490 ; WX 602 ; N uni2512 ; G 3314\nU 9491 ; WX 602 ; N uni2513 ; G 3315\nU 9492 ; WX 602 ; N SF020000 ; G 3316\nU 9493 ; WX 602 ; N uni2515 ; G 3317\nU 9494 ; WX 602 ; N uni2516 ; G 3318\nU 9495 ; WX 602 ; N uni2517 ; G 3319\nU 9496 ; WX 602 ; N SF040000 ; G 3320\nU 9497 ; WX 602 ; N uni2519 ; G 3321\nU 9498 ; WX 602 ; N uni251A ; G 3322\nU 9499 ; WX 602 ; N uni251B ; G 3323\nU 9500 ; WX 602 ; N SF080000 ; G 3324\nU 9501 ; WX 602 ; N uni251D ; G 3325\nU 9502 ; WX 602 ; N uni251E ; G 3326\nU 9503 ; WX 602 ; N uni251F ; G 3327\nU 9504 ; WX 602 ; N uni2520 ; G 3328\nU 9505 ; WX 602 ; N uni2521 ; G 3329\nU 9506 ; WX 602 ; N uni2522 ; G 3330\nU 9507 ; WX 602 ; N uni2523 ; G 3331\nU 9508 ; WX 602 ; N SF090000 ; G 3332\nU 9509 ; WX 602 ; N uni2525 ; G 3333\nU 9510 ; WX 602 ; N uni2526 ; G 3334\nU 9511 ; WX 602 ; N uni2527 ; G 3335\nU 9512 ; WX 602 ; N uni2528 ; G 3336\nU 9513 ; WX 602 ; N uni2529 ; G 3337\nU 9514 ; WX 602 ; N uni252A ; G 3338\nU 9515 ; WX 602 ; N uni252B ; G 3339\nU 9516 ; WX 602 ; N SF060000 ; G 3340\nU 9517 ; WX 602 ; N uni252D ; G 3341\nU 9518 ; WX 602 ; N uni252E ; G 3342\nU 9519 ; WX 602 ; N uni252F ; G 3343\nU 9520 ; WX 602 ; N uni2530 ; G 3344\nU 9521 ; WX 602 ; N uni2531 ; G 3345\nU 9522 ; WX 602 ; N uni2532 ; G 3346\nU 9523 ; WX 602 ; N uni2533 ; G 3347\nU 9524 ; WX 602 ; N SF070000 ; G 3348\nU 9525 ; WX 602 ; N uni2535 ; G 3349\nU 9526 ; WX 602 ; N uni2536 ; G 3350\nU 9527 ; WX 602 ; N uni2537 ; G 3351\nU 9528 ; WX 602 ; N uni2538 ; G 3352\nU 9529 ; WX 602 ; N uni2539 ; G 3353\nU 9530 ; WX 602 ; N uni253A ; G 3354\nU 9531 ; WX 602 ; N uni253B ; G 3355\nU 9532 ; WX 602 ; N SF050000 ; G 3356\nU 9533 ; WX 602 ; N uni253D ; G 3357\nU 9534 ; WX 602 ; N uni253E ; G 3358\nU 9535 ; WX 602 ; N uni253F ; G 3359\nU 9536 ; WX 602 ; N uni2540 ; G 3360\nU 9537 ; WX 602 ; N uni2541 ; G 3361\nU 9538 ; WX 602 ; N uni2542 ; G 3362\nU 9539 ; WX 602 ; N uni2543 ; G 3363\nU 9540 ; WX 602 ; N uni2544 ; G 3364\nU 9541 ; WX 602 ; N uni2545 ; G 3365\nU 9542 ; WX 602 ; N uni2546 ; G 3366\nU 9543 ; WX 602 ; N uni2547 ; G 3367\nU 9544 ; WX 602 ; N uni2548 ; G 3368\nU 9545 ; WX 602 ; N uni2549 ; G 3369\nU 9546 ; WX 602 ; N uni254A ; G 3370\nU 9547 ; WX 602 ; N uni254B ; G 3371\nU 9548 ; WX 602 ; N uni254C ; G 3372\nU 9549 ; WX 602 ; N uni254D ; G 3373\nU 9550 ; WX 602 ; N uni254E ; G 3374\nU 9551 ; WX 602 ; N uni254F ; G 3375\nU 9552 ; WX 602 ; N SF430000 ; G 3376\nU 9553 ; WX 602 ; N SF240000 ; G 3377\nU 9554 ; WX 602 ; N SF510000 ; G 3378\nU 9555 ; WX 602 ; N SF520000 ; G 3379\nU 9556 ; WX 602 ; N SF390000 ; G 3380\nU 9557 ; WX 602 ; N SF220000 ; G 3381\nU 9558 ; WX 602 ; N SF210000 ; G 3382\nU 9559 ; WX 602 ; N SF250000 ; G 3383\nU 9560 ; WX 602 ; N SF500000 ; G 3384\nU 9561 ; WX 602 ; N SF490000 ; G 3385\nU 9562 ; WX 602 ; N SF380000 ; G 3386\nU 9563 ; WX 602 ; N SF280000 ; G 3387\nU 9564 ; WX 602 ; N SF270000 ; G 3388\nU 9565 ; WX 602 ; N SF260000 ; G 3389\nU 9566 ; WX 602 ; N SF360000 ; G 3390\nU 9567 ; WX 602 ; N SF370000 ; G 3391\nU 9568 ; WX 602 ; N SF420000 ; G 3392\nU 9569 ; WX 602 ; N SF190000 ; G 3393\nU 9570 ; WX 602 ; N SF200000 ; G 3394\nU 9571 ; WX 602 ; N SF230000 ; G 3395\nU 9572 ; WX 602 ; N SF470000 ; G 3396\nU 9573 ; WX 602 ; N SF480000 ; G 3397\nU 9574 ; WX 602 ; N SF410000 ; G 3398\nU 9575 ; WX 602 ; N SF450000 ; G 3399\nU 9576 ; WX 602 ; N SF460000 ; G 3400\nU 9577 ; WX 602 ; N SF400000 ; G 3401\nU 9578 ; WX 602 ; N SF540000 ; G 3402\nU 9579 ; WX 602 ; N SF530000 ; G 3403\nU 9580 ; WX 602 ; N SF440000 ; G 3404\nU 9581 ; WX 602 ; N uni256D ; G 3405\nU 9582 ; WX 602 ; N uni256E ; G 3406\nU 9583 ; WX 602 ; N uni256F ; G 3407\nU 9584 ; WX 602 ; N uni2570 ; G 3408\nU 9585 ; WX 602 ; N uni2571 ; G 3409\nU 9586 ; WX 602 ; N uni2572 ; G 3410\nU 9587 ; WX 602 ; N uni2573 ; G 3411\nU 9588 ; WX 602 ; N uni2574 ; G 3412\nU 9589 ; WX 602 ; N uni2575 ; G 3413\nU 9590 ; WX 602 ; N uni2576 ; G 3414\nU 9591 ; WX 602 ; N uni2577 ; G 3415\nU 9592 ; WX 602 ; N uni2578 ; G 3416\nU 9593 ; WX 602 ; N uni2579 ; G 3417\nU 9594 ; WX 602 ; N uni257A ; G 3418\nU 9595 ; WX 602 ; N uni257B ; G 3419\nU 9596 ; WX 602 ; N uni257C ; G 3420\nU 9597 ; WX 602 ; N uni257D ; G 3421\nU 9598 ; WX 602 ; N uni257E ; G 3422\nU 9599 ; WX 602 ; N uni257F ; G 3423\nU 9600 ; WX 769 ; N upblock ; G 3424\nU 9601 ; WX 769 ; N uni2581 ; G 3425\nU 9602 ; WX 769 ; N uni2582 ; G 3426\nU 9603 ; WX 769 ; N uni2583 ; G 3427\nU 9604 ; WX 769 ; N dnblock ; G 3428\nU 9605 ; WX 769 ; N uni2585 ; G 3429\nU 9606 ; WX 769 ; N uni2586 ; G 3430\nU 9607 ; WX 769 ; N uni2587 ; G 3431\nU 9608 ; WX 769 ; N block ; G 3432\nU 9609 ; WX 769 ; N uni2589 ; G 3433\nU 9610 ; WX 769 ; N uni258A ; G 3434\nU 9611 ; WX 769 ; N uni258B ; G 3435\nU 9612 ; WX 769 ; N lfblock ; G 3436\nU 9613 ; WX 769 ; N uni258D ; G 3437\nU 9614 ; WX 769 ; N uni258E ; G 3438\nU 9615 ; WX 769 ; N uni258F ; G 3439\nU 9616 ; WX 769 ; N rtblock ; G 3440\nU 9617 ; WX 769 ; N ltshade ; G 3441\nU 9618 ; WX 769 ; N shade ; G 3442\nU 9619 ; WX 769 ; N dkshade ; G 3443\nU 9620 ; WX 769 ; N uni2594 ; G 3444\nU 9621 ; WX 769 ; N uni2595 ; G 3445\nU 9622 ; WX 769 ; N uni2596 ; G 3446\nU 9623 ; WX 769 ; N uni2597 ; G 3447\nU 9624 ; WX 769 ; N uni2598 ; G 3448\nU 9625 ; WX 769 ; N uni2599 ; G 3449\nU 9626 ; WX 769 ; N uni259A ; G 3450\nU 9627 ; WX 769 ; N uni259B ; G 3451\nU 9628 ; WX 769 ; N uni259C ; G 3452\nU 9629 ; WX 769 ; N uni259D ; G 3453\nU 9630 ; WX 769 ; N uni259E ; G 3454\nU 9631 ; WX 769 ; N uni259F ; G 3455\nU 9632 ; WX 945 ; N filledbox ; G 3456\nU 9633 ; WX 945 ; N H22073 ; G 3457\nU 9634 ; WX 945 ; N uni25A2 ; G 3458\nU 9635 ; WX 945 ; N uni25A3 ; G 3459\nU 9636 ; WX 945 ; N uni25A4 ; G 3460\nU 9637 ; WX 945 ; N uni25A5 ; G 3461\nU 9638 ; WX 945 ; N uni25A6 ; G 3462\nU 9639 ; WX 945 ; N uni25A7 ; G 3463\nU 9640 ; WX 945 ; N uni25A8 ; G 3464\nU 9641 ; WX 945 ; N uni25A9 ; G 3465\nU 9642 ; WX 678 ; N H18543 ; G 3466\nU 9643 ; WX 678 ; N H18551 ; G 3467\nU 9644 ; WX 945 ; N filledrect ; G 3468\nU 9645 ; WX 945 ; N uni25AD ; G 3469\nU 9646 ; WX 550 ; N uni25AE ; G 3470\nU 9647 ; WX 550 ; N uni25AF ; G 3471\nU 9648 ; WX 769 ; N uni25B0 ; G 3472\nU 9649 ; WX 769 ; N uni25B1 ; G 3473\nU 9650 ; WX 769 ; N triagup ; G 3474\nU 9651 ; WX 769 ; N uni25B3 ; G 3475\nU 9652 ; WX 502 ; N uni25B4 ; G 3476\nU 9653 ; WX 502 ; N uni25B5 ; G 3477\nU 9654 ; WX 769 ; N uni25B6 ; G 3478\nU 9655 ; WX 769 ; N uni25B7 ; G 3479\nU 9656 ; WX 502 ; N uni25B8 ; G 3480\nU 9657 ; WX 502 ; N uni25B9 ; G 3481\nU 9658 ; WX 769 ; N triagrt ; G 3482\nU 9659 ; WX 769 ; N uni25BB ; G 3483\nU 9660 ; WX 769 ; N triagdn ; G 3484\nU 9661 ; WX 769 ; N uni25BD ; G 3485\nU 9662 ; WX 502 ; N uni25BE ; G 3486\nU 9663 ; WX 502 ; N uni25BF ; G 3487\nU 9664 ; WX 769 ; N uni25C0 ; G 3488\nU 9665 ; WX 769 ; N uni25C1 ; G 3489\nU 9666 ; WX 502 ; N uni25C2 ; G 3490\nU 9667 ; WX 502 ; N uni25C3 ; G 3491\nU 9668 ; WX 769 ; N triaglf ; G 3492\nU 9669 ; WX 769 ; N uni25C5 ; G 3493\nU 9670 ; WX 769 ; N uni25C6 ; G 3494\nU 9671 ; WX 769 ; N uni25C7 ; G 3495\nU 9672 ; WX 769 ; N uni25C8 ; G 3496\nU 9673 ; WX 873 ; N uni25C9 ; G 3497\nU 9674 ; WX 494 ; N lozenge ; G 3498\nU 9675 ; WX 873 ; N circle ; G 3499\nU 9676 ; WX 873 ; N uni25CC ; G 3500\nU 9677 ; WX 873 ; N uni25CD ; G 3501\nU 9678 ; WX 873 ; N uni25CE ; G 3502\nU 9679 ; WX 873 ; N H18533 ; G 3503\nU 9680 ; WX 873 ; N uni25D0 ; G 3504\nU 9681 ; WX 873 ; N uni25D1 ; G 3505\nU 9682 ; WX 873 ; N uni25D2 ; G 3506\nU 9683 ; WX 873 ; N uni25D3 ; G 3507\nU 9684 ; WX 873 ; N uni25D4 ; G 3508\nU 9685 ; WX 873 ; N uni25D5 ; G 3509\nU 9686 ; WX 527 ; N uni25D6 ; G 3510\nU 9687 ; WX 527 ; N uni25D7 ; G 3511\nU 9688 ; WX 840 ; N invbullet ; G 3512\nU 9689 ; WX 970 ; N invcircle ; G 3513\nU 9690 ; WX 970 ; N uni25DA ; G 3514\nU 9691 ; WX 970 ; N uni25DB ; G 3515\nU 9692 ; WX 387 ; N uni25DC ; G 3516\nU 9693 ; WX 387 ; N uni25DD ; G 3517\nU 9694 ; WX 387 ; N uni25DE ; G 3518\nU 9695 ; WX 387 ; N uni25DF ; G 3519\nU 9696 ; WX 769 ; N uni25E0 ; G 3520\nU 9697 ; WX 769 ; N uni25E1 ; G 3521\nU 9698 ; WX 769 ; N uni25E2 ; G 3522\nU 9699 ; WX 769 ; N uni25E3 ; G 3523\nU 9700 ; WX 769 ; N uni25E4 ; G 3524\nU 9701 ; WX 769 ; N uni25E5 ; G 3525\nU 9702 ; WX 639 ; N openbullet ; G 3526\nU 9703 ; WX 945 ; N uni25E7 ; G 3527\nU 9704 ; WX 945 ; N uni25E8 ; G 3528\nU 9705 ; WX 945 ; N uni25E9 ; G 3529\nU 9706 ; WX 945 ; N uni25EA ; G 3530\nU 9707 ; WX 945 ; N uni25EB ; G 3531\nU 9708 ; WX 769 ; N uni25EC ; G 3532\nU 9709 ; WX 769 ; N uni25ED ; G 3533\nU 9710 ; WX 769 ; N uni25EE ; G 3534\nU 9711 ; WX 1119 ; N uni25EF ; G 3535\nU 9712 ; WX 945 ; N uni25F0 ; G 3536\nU 9713 ; WX 945 ; N uni25F1 ; G 3537\nU 9714 ; WX 945 ; N uni25F2 ; G 3538\nU 9715 ; WX 945 ; N uni25F3 ; G 3539\nU 9716 ; WX 873 ; N uni25F4 ; G 3540\nU 9717 ; WX 873 ; N uni25F5 ; G 3541\nU 9718 ; WX 873 ; N uni25F6 ; G 3542\nU 9719 ; WX 873 ; N uni25F7 ; G 3543\nU 9720 ; WX 769 ; N uni25F8 ; G 3544\nU 9721 ; WX 769 ; N uni25F9 ; G 3545\nU 9722 ; WX 769 ; N uni25FA ; G 3546\nU 9723 ; WX 830 ; N uni25FB ; G 3547\nU 9724 ; WX 830 ; N uni25FC ; G 3548\nU 9725 ; WX 732 ; N uni25FD ; G 3549\nU 9726 ; WX 732 ; N uni25FE ; G 3550\nU 9727 ; WX 769 ; N uni25FF ; G 3551\nU 9728 ; WX 896 ; N uni2600 ; G 3552\nU 9729 ; WX 1000 ; N uni2601 ; G 3553\nU 9730 ; WX 896 ; N uni2602 ; G 3554\nU 9731 ; WX 896 ; N uni2603 ; G 3555\nU 9732 ; WX 896 ; N uni2604 ; G 3556\nU 9733 ; WX 896 ; N uni2605 ; G 3557\nU 9734 ; WX 896 ; N uni2606 ; G 3558\nU 9735 ; WX 573 ; N uni2607 ; G 3559\nU 9736 ; WX 896 ; N uni2608 ; G 3560\nU 9737 ; WX 896 ; N uni2609 ; G 3561\nU 9738 ; WX 888 ; N uni260A ; G 3562\nU 9739 ; WX 888 ; N uni260B ; G 3563\nU 9740 ; WX 671 ; N uni260C ; G 3564\nU 9741 ; WX 1013 ; N uni260D ; G 3565\nU 9742 ; WX 1246 ; N uni260E ; G 3566\nU 9743 ; WX 1250 ; N uni260F ; G 3567\nU 9744 ; WX 896 ; N uni2610 ; G 3568\nU 9745 ; WX 896 ; N uni2611 ; G 3569\nU 9746 ; WX 896 ; N uni2612 ; G 3570\nU 9747 ; WX 532 ; N uni2613 ; G 3571\nU 9748 ; WX 896 ; N uni2614 ; G 3572\nU 9749 ; WX 896 ; N uni2615 ; G 3573\nU 9750 ; WX 896 ; N uni2616 ; G 3574\nU 9751 ; WX 896 ; N uni2617 ; G 3575\nU 9752 ; WX 896 ; N uni2618 ; G 3576\nU 9753 ; WX 896 ; N uni2619 ; G 3577\nU 9754 ; WX 896 ; N uni261A ; G 3578\nU 9755 ; WX 896 ; N uni261B ; G 3579\nU 9756 ; WX 896 ; N uni261C ; G 3580\nU 9757 ; WX 609 ; N uni261D ; G 3581\nU 9758 ; WX 896 ; N uni261E ; G 3582\nU 9759 ; WX 609 ; N uni261F ; G 3583\nU 9760 ; WX 896 ; N uni2620 ; G 3584\nU 9761 ; WX 896 ; N uni2621 ; G 3585\nU 9762 ; WX 896 ; N uni2622 ; G 3586\nU 9763 ; WX 896 ; N uni2623 ; G 3587\nU 9764 ; WX 669 ; N uni2624 ; G 3588\nU 9765 ; WX 746 ; N uni2625 ; G 3589\nU 9766 ; WX 649 ; N uni2626 ; G 3590\nU 9767 ; WX 784 ; N uni2627 ; G 3591\nU 9768 ; WX 545 ; N uni2628 ; G 3592\nU 9769 ; WX 896 ; N uni2629 ; G 3593\nU 9770 ; WX 896 ; N uni262A ; G 3594\nU 9771 ; WX 896 ; N uni262B ; G 3595\nU 9772 ; WX 710 ; N uni262C ; G 3596\nU 9773 ; WX 896 ; N uni262D ; G 3597\nU 9774 ; WX 896 ; N uni262E ; G 3598\nU 9775 ; WX 896 ; N uni262F ; G 3599\nU 9776 ; WX 896 ; N uni2630 ; G 3600\nU 9777 ; WX 896 ; N uni2631 ; G 3601\nU 9778 ; WX 896 ; N uni2632 ; G 3602\nU 9779 ; WX 896 ; N uni2633 ; G 3603\nU 9780 ; WX 896 ; N uni2634 ; G 3604\nU 9781 ; WX 896 ; N uni2635 ; G 3605\nU 9782 ; WX 896 ; N uni2636 ; G 3606\nU 9783 ; WX 896 ; N uni2637 ; G 3607\nU 9784 ; WX 896 ; N uni2638 ; G 3608\nU 9785 ; WX 1042 ; N uni2639 ; G 3609\nU 9786 ; WX 1042 ; N smileface ; G 3610\nU 9787 ; WX 1042 ; N invsmileface ; G 3611\nU 9788 ; WX 896 ; N sun ; G 3612\nU 9789 ; WX 896 ; N uni263D ; G 3613\nU 9790 ; WX 896 ; N uni263E ; G 3614\nU 9791 ; WX 614 ; N uni263F ; G 3615\nU 9792 ; WX 732 ; N female ; G 3616\nU 9793 ; WX 732 ; N uni2641 ; G 3617\nU 9794 ; WX 896 ; N male ; G 3618\nU 9795 ; WX 896 ; N uni2643 ; G 3619\nU 9796 ; WX 896 ; N uni2644 ; G 3620\nU 9797 ; WX 896 ; N uni2645 ; G 3621\nU 9798 ; WX 896 ; N uni2646 ; G 3622\nU 9799 ; WX 896 ; N uni2647 ; G 3623\nU 9800 ; WX 896 ; N uni2648 ; G 3624\nU 9801 ; WX 896 ; N uni2649 ; G 3625\nU 9802 ; WX 896 ; N uni264A ; G 3626\nU 9803 ; WX 896 ; N uni264B ; G 3627\nU 9804 ; WX 896 ; N uni264C ; G 3628\nU 9805 ; WX 896 ; N uni264D ; G 3629\nU 9806 ; WX 896 ; N uni264E ; G 3630\nU 9807 ; WX 896 ; N uni264F ; G 3631\nU 9808 ; WX 896 ; N uni2650 ; G 3632\nU 9809 ; WX 896 ; N uni2651 ; G 3633\nU 9810 ; WX 896 ; N uni2652 ; G 3634\nU 9811 ; WX 896 ; N uni2653 ; G 3635\nU 9812 ; WX 896 ; N uni2654 ; G 3636\nU 9813 ; WX 896 ; N uni2655 ; G 3637\nU 9814 ; WX 896 ; N uni2656 ; G 3638\nU 9815 ; WX 896 ; N uni2657 ; G 3639\nU 9816 ; WX 896 ; N uni2658 ; G 3640\nU 9817 ; WX 896 ; N uni2659 ; G 3641\nU 9818 ; WX 896 ; N uni265A ; G 3642\nU 9819 ; WX 896 ; N uni265B ; G 3643\nU 9820 ; WX 896 ; N uni265C ; G 3644\nU 9821 ; WX 896 ; N uni265D ; G 3645\nU 9822 ; WX 896 ; N uni265E ; G 3646\nU 9823 ; WX 896 ; N uni265F ; G 3647\nU 9824 ; WX 896 ; N spade ; G 3648\nU 9825 ; WX 896 ; N uni2661 ; G 3649\nU 9826 ; WX 896 ; N uni2662 ; G 3650\nU 9827 ; WX 896 ; N club ; G 3651\nU 9828 ; WX 896 ; N uni2664 ; G 3652\nU 9829 ; WX 896 ; N heart ; G 3653\nU 9830 ; WX 896 ; N diamond ; G 3654\nU 9831 ; WX 896 ; N uni2667 ; G 3655\nU 9832 ; WX 896 ; N uni2668 ; G 3656\nU 9833 ; WX 472 ; N uni2669 ; G 3657\nU 9834 ; WX 638 ; N musicalnote ; G 3658\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3659\nU 9836 ; WX 896 ; N uni266C ; G 3660\nU 9837 ; WX 472 ; N uni266D ; G 3661\nU 9838 ; WX 357 ; N uni266E ; G 3662\nU 9839 ; WX 484 ; N uni266F ; G 3663\nU 9840 ; WX 748 ; N uni2670 ; G 3664\nU 9841 ; WX 766 ; N uni2671 ; G 3665\nU 9842 ; WX 896 ; N uni2672 ; G 3666\nU 9843 ; WX 896 ; N uni2673 ; G 3667\nU 9844 ; WX 896 ; N uni2674 ; G 3668\nU 9845 ; WX 896 ; N uni2675 ; G 3669\nU 9846 ; WX 896 ; N uni2676 ; G 3670\nU 9847 ; WX 896 ; N uni2677 ; G 3671\nU 9848 ; WX 896 ; N uni2678 ; G 3672\nU 9849 ; WX 896 ; N uni2679 ; G 3673\nU 9850 ; WX 896 ; N uni267A ; G 3674\nU 9851 ; WX 896 ; N uni267B ; G 3675\nU 9852 ; WX 896 ; N uni267C ; G 3676\nU 9853 ; WX 896 ; N uni267D ; G 3677\nU 9854 ; WX 896 ; N uni267E ; G 3678\nU 9855 ; WX 896 ; N uni267F ; G 3679\nU 9856 ; WX 869 ; N uni2680 ; G 3680\nU 9857 ; WX 869 ; N uni2681 ; G 3681\nU 9858 ; WX 869 ; N uni2682 ; G 3682\nU 9859 ; WX 869 ; N uni2683 ; G 3683\nU 9860 ; WX 869 ; N uni2684 ; G 3684\nU 9861 ; WX 869 ; N uni2685 ; G 3685\nU 9862 ; WX 896 ; N uni2686 ; G 3686\nU 9863 ; WX 896 ; N uni2687 ; G 3687\nU 9864 ; WX 896 ; N uni2688 ; G 3688\nU 9865 ; WX 896 ; N uni2689 ; G 3689\nU 9866 ; WX 896 ; N uni268A ; G 3690\nU 9867 ; WX 896 ; N uni268B ; G 3691\nU 9868 ; WX 896 ; N uni268C ; G 3692\nU 9869 ; WX 896 ; N uni268D ; G 3693\nU 9870 ; WX 896 ; N uni268E ; G 3694\nU 9871 ; WX 896 ; N uni268F ; G 3695\nU 9872 ; WX 896 ; N uni2690 ; G 3696\nU 9873 ; WX 896 ; N uni2691 ; G 3697\nU 9874 ; WX 896 ; N uni2692 ; G 3698\nU 9875 ; WX 896 ; N uni2693 ; G 3699\nU 9876 ; WX 896 ; N uni2694 ; G 3700\nU 9877 ; WX 541 ; N uni2695 ; G 3701\nU 9878 ; WX 896 ; N uni2696 ; G 3702\nU 9879 ; WX 896 ; N uni2697 ; G 3703\nU 9880 ; WX 896 ; N uni2698 ; G 3704\nU 9881 ; WX 896 ; N uni2699 ; G 3705\nU 9882 ; WX 896 ; N uni269A ; G 3706\nU 9883 ; WX 896 ; N uni269B ; G 3707\nU 9884 ; WX 896 ; N uni269C ; G 3708\nU 9886 ; WX 896 ; N uni269E ; G 3709\nU 9887 ; WX 896 ; N uni269F ; G 3710\nU 9888 ; WX 896 ; N uni26A0 ; G 3711\nU 9889 ; WX 702 ; N uni26A1 ; G 3712\nU 9890 ; WX 1004 ; N uni26A2 ; G 3713\nU 9891 ; WX 1089 ; N uni26A3 ; G 3714\nU 9892 ; WX 1175 ; N uni26A4 ; G 3715\nU 9893 ; WX 903 ; N uni26A5 ; G 3716\nU 9894 ; WX 838 ; N uni26A6 ; G 3717\nU 9895 ; WX 838 ; N uni26A7 ; G 3718\nU 9896 ; WX 838 ; N uni26A8 ; G 3719\nU 9897 ; WX 838 ; N uni26A9 ; G 3720\nU 9898 ; WX 838 ; N uni26AA ; G 3721\nU 9899 ; WX 838 ; N uni26AB ; G 3722\nU 9900 ; WX 838 ; N uni26AC ; G 3723\nU 9901 ; WX 838 ; N uni26AD ; G 3724\nU 9902 ; WX 838 ; N uni26AE ; G 3725\nU 9903 ; WX 838 ; N uni26AF ; G 3726\nU 9904 ; WX 844 ; N uni26B0 ; G 3727\nU 9905 ; WX 838 ; N uni26B1 ; G 3728\nU 9906 ; WX 732 ; N uni26B2 ; G 3729\nU 9907 ; WX 732 ; N uni26B3 ; G 3730\nU 9908 ; WX 732 ; N uni26B4 ; G 3731\nU 9909 ; WX 732 ; N uni26B5 ; G 3732\nU 9910 ; WX 850 ; N uni26B6 ; G 3733\nU 9911 ; WX 732 ; N uni26B7 ; G 3734\nU 9912 ; WX 732 ; N uni26B8 ; G 3735\nU 9920 ; WX 838 ; N uni26C0 ; G 3736\nU 9921 ; WX 838 ; N uni26C1 ; G 3737\nU 9922 ; WX 838 ; N uni26C2 ; G 3738\nU 9923 ; WX 838 ; N uni26C3 ; G 3739\nU 9954 ; WX 732 ; N uni26E2 ; G 3740\nU 9985 ; WX 838 ; N uni2701 ; G 3741\nU 9986 ; WX 838 ; N uni2702 ; G 3742\nU 9987 ; WX 838 ; N uni2703 ; G 3743\nU 9988 ; WX 838 ; N uni2704 ; G 3744\nU 9990 ; WX 838 ; N uni2706 ; G 3745\nU 9991 ; WX 838 ; N uni2707 ; G 3746\nU 9992 ; WX 838 ; N uni2708 ; G 3747\nU 9993 ; WX 838 ; N uni2709 ; G 3748\nU 9996 ; WX 838 ; N uni270C ; G 3749\nU 9997 ; WX 838 ; N uni270D ; G 3750\nU 9998 ; WX 838 ; N uni270E ; G 3751\nU 9999 ; WX 838 ; N uni270F ; G 3752\nU 10000 ; WX 838 ; N uni2710 ; G 3753\nU 10001 ; WX 838 ; N uni2711 ; G 3754\nU 10002 ; WX 838 ; N uni2712 ; G 3755\nU 10003 ; WX 838 ; N uni2713 ; G 3756\nU 10004 ; WX 838 ; N uni2714 ; G 3757\nU 10005 ; WX 838 ; N uni2715 ; G 3758\nU 10006 ; WX 838 ; N uni2716 ; G 3759\nU 10007 ; WX 838 ; N uni2717 ; G 3760\nU 10008 ; WX 838 ; N uni2718 ; G 3761\nU 10009 ; WX 838 ; N uni2719 ; G 3762\nU 10010 ; WX 838 ; N uni271A ; G 3763\nU 10011 ; WX 838 ; N uni271B ; G 3764\nU 10012 ; WX 838 ; N uni271C ; G 3765\nU 10013 ; WX 838 ; N uni271D ; G 3766\nU 10014 ; WX 838 ; N uni271E ; G 3767\nU 10015 ; WX 838 ; N uni271F ; G 3768\nU 10016 ; WX 838 ; N uni2720 ; G 3769\nU 10017 ; WX 838 ; N uni2721 ; G 3770\nU 10018 ; WX 838 ; N uni2722 ; G 3771\nU 10019 ; WX 838 ; N uni2723 ; G 3772\nU 10020 ; WX 838 ; N uni2724 ; G 3773\nU 10021 ; WX 838 ; N uni2725 ; G 3774\nU 10022 ; WX 838 ; N uni2726 ; G 3775\nU 10023 ; WX 838 ; N uni2727 ; G 3776\nU 10025 ; WX 838 ; N uni2729 ; G 3777\nU 10026 ; WX 838 ; N uni272A ; G 3778\nU 10027 ; WX 838 ; N uni272B ; G 3779\nU 10028 ; WX 838 ; N uni272C ; G 3780\nU 10029 ; WX 838 ; N uni272D ; G 3781\nU 10030 ; WX 838 ; N uni272E ; G 3782\nU 10031 ; WX 838 ; N uni272F ; G 3783\nU 10032 ; WX 838 ; N uni2730 ; G 3784\nU 10033 ; WX 838 ; N uni2731 ; G 3785\nU 10034 ; WX 838 ; N uni2732 ; G 3786\nU 10035 ; WX 838 ; N uni2733 ; G 3787\nU 10036 ; WX 838 ; N uni2734 ; G 3788\nU 10037 ; WX 838 ; N uni2735 ; G 3789\nU 10038 ; WX 838 ; N uni2736 ; G 3790\nU 10039 ; WX 838 ; N uni2737 ; G 3791\nU 10040 ; WX 838 ; N uni2738 ; G 3792\nU 10041 ; WX 838 ; N uni2739 ; G 3793\nU 10042 ; WX 838 ; N uni273A ; G 3794\nU 10043 ; WX 838 ; N uni273B ; G 3795\nU 10044 ; WX 838 ; N uni273C ; G 3796\nU 10045 ; WX 838 ; N uni273D ; G 3797\nU 10046 ; WX 838 ; N uni273E ; G 3798\nU 10047 ; WX 838 ; N uni273F ; G 3799\nU 10048 ; WX 838 ; N uni2740 ; G 3800\nU 10049 ; WX 838 ; N uni2741 ; G 3801\nU 10050 ; WX 838 ; N uni2742 ; G 3802\nU 10051 ; WX 838 ; N uni2743 ; G 3803\nU 10052 ; WX 838 ; N uni2744 ; G 3804\nU 10053 ; WX 838 ; N uni2745 ; G 3805\nU 10054 ; WX 838 ; N uni2746 ; G 3806\nU 10055 ; WX 838 ; N uni2747 ; G 3807\nU 10056 ; WX 838 ; N uni2748 ; G 3808\nU 10057 ; WX 838 ; N uni2749 ; G 3809\nU 10058 ; WX 838 ; N uni274A ; G 3810\nU 10059 ; WX 838 ; N uni274B ; G 3811\nU 10061 ; WX 896 ; N uni274D ; G 3812\nU 10063 ; WX 896 ; N uni274F ; G 3813\nU 10064 ; WX 896 ; N uni2750 ; G 3814\nU 10065 ; WX 896 ; N uni2751 ; G 3815\nU 10066 ; WX 896 ; N uni2752 ; G 3816\nU 10070 ; WX 896 ; N uni2756 ; G 3817\nU 10072 ; WX 838 ; N uni2758 ; G 3818\nU 10073 ; WX 838 ; N uni2759 ; G 3819\nU 10074 ; WX 838 ; N uni275A ; G 3820\nU 10075 ; WX 322 ; N uni275B ; G 3821\nU 10076 ; WX 322 ; N uni275C ; G 3822\nU 10077 ; WX 538 ; N uni275D ; G 3823\nU 10078 ; WX 538 ; N uni275E ; G 3824\nU 10081 ; WX 838 ; N uni2761 ; G 3825\nU 10082 ; WX 838 ; N uni2762 ; G 3826\nU 10083 ; WX 838 ; N uni2763 ; G 3827\nU 10084 ; WX 838 ; N uni2764 ; G 3828\nU 10085 ; WX 838 ; N uni2765 ; G 3829\nU 10086 ; WX 838 ; N uni2766 ; G 3830\nU 10087 ; WX 838 ; N uni2767 ; G 3831\nU 10088 ; WX 838 ; N uni2768 ; G 3832\nU 10089 ; WX 838 ; N uni2769 ; G 3833\nU 10090 ; WX 838 ; N uni276A ; G 3834\nU 10091 ; WX 838 ; N uni276B ; G 3835\nU 10092 ; WX 838 ; N uni276C ; G 3836\nU 10093 ; WX 838 ; N uni276D ; G 3837\nU 10094 ; WX 838 ; N uni276E ; G 3838\nU 10095 ; WX 838 ; N uni276F ; G 3839\nU 10096 ; WX 838 ; N uni2770 ; G 3840\nU 10097 ; WX 838 ; N uni2771 ; G 3841\nU 10098 ; WX 838 ; N uni2772 ; G 3842\nU 10099 ; WX 838 ; N uni2773 ; G 3843\nU 10100 ; WX 838 ; N uni2774 ; G 3844\nU 10101 ; WX 838 ; N uni2775 ; G 3845\nU 10102 ; WX 847 ; N uni2776 ; G 3846\nU 10103 ; WX 847 ; N uni2777 ; G 3847\nU 10104 ; WX 847 ; N uni2778 ; G 3848\nU 10105 ; WX 847 ; N uni2779 ; G 3849\nU 10106 ; WX 847 ; N uni277A ; G 3850\nU 10107 ; WX 847 ; N uni277B ; G 3851\nU 10108 ; WX 847 ; N uni277C ; G 3852\nU 10109 ; WX 847 ; N uni277D ; G 3853\nU 10110 ; WX 847 ; N uni277E ; G 3854\nU 10111 ; WX 847 ; N uni277F ; G 3855\nU 10112 ; WX 838 ; N uni2780 ; G 3856\nU 10113 ; WX 838 ; N uni2781 ; G 3857\nU 10114 ; WX 838 ; N uni2782 ; G 3858\nU 10115 ; WX 838 ; N uni2783 ; G 3859\nU 10116 ; WX 838 ; N uni2784 ; G 3860\nU 10117 ; WX 838 ; N uni2785 ; G 3861\nU 10118 ; WX 838 ; N uni2786 ; G 3862\nU 10119 ; WX 838 ; N uni2787 ; G 3863\nU 10120 ; WX 838 ; N uni2788 ; G 3864\nU 10121 ; WX 838 ; N uni2789 ; G 3865\nU 10122 ; WX 838 ; N uni278A ; G 3866\nU 10123 ; WX 838 ; N uni278B ; G 3867\nU 10124 ; WX 838 ; N uni278C ; G 3868\nU 10125 ; WX 838 ; N uni278D ; G 3869\nU 10126 ; WX 838 ; N uni278E ; G 3870\nU 10127 ; WX 838 ; N uni278F ; G 3871\nU 10128 ; WX 838 ; N uni2790 ; G 3872\nU 10129 ; WX 838 ; N uni2791 ; G 3873\nU 10130 ; WX 838 ; N uni2792 ; G 3874\nU 10131 ; WX 838 ; N uni2793 ; G 3875\nU 10132 ; WX 838 ; N uni2794 ; G 3876\nU 10136 ; WX 838 ; N uni2798 ; G 3877\nU 10137 ; WX 838 ; N uni2799 ; G 3878\nU 10138 ; WX 838 ; N uni279A ; G 3879\nU 10139 ; WX 838 ; N uni279B ; G 3880\nU 10140 ; WX 838 ; N uni279C ; G 3881\nU 10141 ; WX 838 ; N uni279D ; G 3882\nU 10142 ; WX 838 ; N uni279E ; G 3883\nU 10143 ; WX 838 ; N uni279F ; G 3884\nU 10144 ; WX 838 ; N uni27A0 ; G 3885\nU 10145 ; WX 838 ; N uni27A1 ; G 3886\nU 10146 ; WX 838 ; N uni27A2 ; G 3887\nU 10147 ; WX 838 ; N uni27A3 ; G 3888\nU 10148 ; WX 838 ; N uni27A4 ; G 3889\nU 10149 ; WX 838 ; N uni27A5 ; G 3890\nU 10150 ; WX 838 ; N uni27A6 ; G 3891\nU 10151 ; WX 838 ; N uni27A7 ; G 3892\nU 10152 ; WX 838 ; N uni27A8 ; G 3893\nU 10153 ; WX 838 ; N uni27A9 ; G 3894\nU 10154 ; WX 838 ; N uni27AA ; G 3895\nU 10155 ; WX 838 ; N uni27AB ; G 3896\nU 10156 ; WX 838 ; N uni27AC ; G 3897\nU 10157 ; WX 838 ; N uni27AD ; G 3898\nU 10158 ; WX 838 ; N uni27AE ; G 3899\nU 10159 ; WX 838 ; N uni27AF ; G 3900\nU 10161 ; WX 838 ; N uni27B1 ; G 3901\nU 10162 ; WX 838 ; N uni27B2 ; G 3902\nU 10163 ; WX 838 ; N uni27B3 ; G 3903\nU 10164 ; WX 838 ; N uni27B4 ; G 3904\nU 10165 ; WX 838 ; N uni27B5 ; G 3905\nU 10166 ; WX 838 ; N uni27B6 ; G 3906\nU 10167 ; WX 838 ; N uni27B7 ; G 3907\nU 10168 ; WX 838 ; N uni27B8 ; G 3908\nU 10169 ; WX 838 ; N uni27B9 ; G 3909\nU 10170 ; WX 838 ; N uni27BA ; G 3910\nU 10171 ; WX 838 ; N uni27BB ; G 3911\nU 10172 ; WX 838 ; N uni27BC ; G 3912\nU 10173 ; WX 838 ; N uni27BD ; G 3913\nU 10174 ; WX 838 ; N uni27BE ; G 3914\nU 10181 ; WX 457 ; N uni27C5 ; G 3915\nU 10182 ; WX 457 ; N uni27C6 ; G 3916\nU 10208 ; WX 494 ; N uni27E0 ; G 3917\nU 10214 ; WX 487 ; N uni27E6 ; G 3918\nU 10215 ; WX 487 ; N uni27E7 ; G 3919\nU 10216 ; WX 457 ; N uni27E8 ; G 3920\nU 10217 ; WX 457 ; N uni27E9 ; G 3921\nU 10218 ; WX 721 ; N uni27EA ; G 3922\nU 10219 ; WX 721 ; N uni27EB ; G 3923\nU 10224 ; WX 838 ; N uni27F0 ; G 3924\nU 10225 ; WX 838 ; N uni27F1 ; G 3925\nU 10226 ; WX 838 ; N uni27F2 ; G 3926\nU 10227 ; WX 838 ; N uni27F3 ; G 3927\nU 10228 ; WX 1157 ; N uni27F4 ; G 3928\nU 10229 ; WX 1434 ; N uni27F5 ; G 3929\nU 10230 ; WX 1434 ; N uni27F6 ; G 3930\nU 10231 ; WX 1434 ; N uni27F7 ; G 3931\nU 10232 ; WX 1434 ; N uni27F8 ; G 3932\nU 10233 ; WX 1434 ; N uni27F9 ; G 3933\nU 10234 ; WX 1434 ; N uni27FA ; G 3934\nU 10235 ; WX 1434 ; N uni27FB ; G 3935\nU 10236 ; WX 1434 ; N uni27FC ; G 3936\nU 10237 ; WX 1434 ; N uni27FD ; G 3937\nU 10238 ; WX 1434 ; N uni27FE ; G 3938\nU 10239 ; WX 1434 ; N uni27FF ; G 3939\nU 10240 ; WX 781 ; N uni2800 ; G 3940\nU 10241 ; WX 781 ; N uni2801 ; G 3941\nU 10242 ; WX 781 ; N uni2802 ; G 3942\nU 10243 ; WX 781 ; N uni2803 ; G 3943\nU 10244 ; WX 781 ; N uni2804 ; G 3944\nU 10245 ; WX 781 ; N uni2805 ; G 3945\nU 10246 ; WX 781 ; N uni2806 ; G 3946\nU 10247 ; WX 781 ; N uni2807 ; G 3947\nU 10248 ; WX 781 ; N uni2808 ; G 3948\nU 10249 ; WX 781 ; N uni2809 ; G 3949\nU 10250 ; WX 781 ; N uni280A ; G 3950\nU 10251 ; WX 781 ; N uni280B ; G 3951\nU 10252 ; WX 781 ; N uni280C ; G 3952\nU 10253 ; WX 781 ; N uni280D ; G 3953\nU 10254 ; WX 781 ; N uni280E ; G 3954\nU 10255 ; WX 781 ; N uni280F ; G 3955\nU 10256 ; WX 781 ; N uni2810 ; G 3956\nU 10257 ; WX 781 ; N uni2811 ; G 3957\nU 10258 ; WX 781 ; N uni2812 ; G 3958\nU 10259 ; WX 781 ; N uni2813 ; G 3959\nU 10260 ; WX 781 ; N uni2814 ; G 3960\nU 10261 ; WX 781 ; N uni2815 ; G 3961\nU 10262 ; WX 781 ; N uni2816 ; G 3962\nU 10263 ; WX 781 ; N uni2817 ; G 3963\nU 10264 ; WX 781 ; N uni2818 ; G 3964\nU 10265 ; WX 781 ; N uni2819 ; G 3965\nU 10266 ; WX 781 ; N uni281A ; G 3966\nU 10267 ; WX 781 ; N uni281B ; G 3967\nU 10268 ; WX 781 ; N uni281C ; G 3968\nU 10269 ; WX 781 ; N uni281D ; G 3969\nU 10270 ; WX 781 ; N uni281E ; G 3970\nU 10271 ; WX 781 ; N uni281F ; G 3971\nU 10272 ; WX 781 ; N uni2820 ; G 3972\nU 10273 ; WX 781 ; N uni2821 ; G 3973\nU 10274 ; WX 781 ; N uni2822 ; G 3974\nU 10275 ; WX 781 ; N uni2823 ; G 3975\nU 10276 ; WX 781 ; N uni2824 ; G 3976\nU 10277 ; WX 781 ; N uni2825 ; G 3977\nU 10278 ; WX 781 ; N uni2826 ; G 3978\nU 10279 ; WX 781 ; N uni2827 ; G 3979\nU 10280 ; WX 781 ; N uni2828 ; G 3980\nU 10281 ; WX 781 ; N uni2829 ; G 3981\nU 10282 ; WX 781 ; N uni282A ; G 3982\nU 10283 ; WX 781 ; N uni282B ; G 3983\nU 10284 ; WX 781 ; N uni282C ; G 3984\nU 10285 ; WX 781 ; N uni282D ; G 3985\nU 10286 ; WX 781 ; N uni282E ; G 3986\nU 10287 ; WX 781 ; N uni282F ; G 3987\nU 10288 ; WX 781 ; N uni2830 ; G 3988\nU 10289 ; WX 781 ; N uni2831 ; G 3989\nU 10290 ; WX 781 ; N uni2832 ; G 3990\nU 10291 ; WX 781 ; N uni2833 ; G 3991\nU 10292 ; WX 781 ; N uni2834 ; G 3992\nU 10293 ; WX 781 ; N uni2835 ; G 3993\nU 10294 ; WX 781 ; N uni2836 ; G 3994\nU 10295 ; WX 781 ; N uni2837 ; G 3995\nU 10296 ; WX 781 ; N uni2838 ; G 3996\nU 10297 ; WX 781 ; N uni2839 ; G 3997\nU 10298 ; WX 781 ; N uni283A ; G 3998\nU 10299 ; WX 781 ; N uni283B ; G 3999\nU 10300 ; WX 781 ; N uni283C ; G 4000\nU 10301 ; WX 781 ; N uni283D ; G 4001\nU 10302 ; WX 781 ; N uni283E ; G 4002\nU 10303 ; WX 781 ; N uni283F ; G 4003\nU 10304 ; WX 781 ; N uni2840 ; G 4004\nU 10305 ; WX 781 ; N uni2841 ; G 4005\nU 10306 ; WX 781 ; N uni2842 ; G 4006\nU 10307 ; WX 781 ; N uni2843 ; G 4007\nU 10308 ; WX 781 ; N uni2844 ; G 4008\nU 10309 ; WX 781 ; N uni2845 ; G 4009\nU 10310 ; WX 781 ; N uni2846 ; G 4010\nU 10311 ; WX 781 ; N uni2847 ; G 4011\nU 10312 ; WX 781 ; N uni2848 ; G 4012\nU 10313 ; WX 781 ; N uni2849 ; G 4013\nU 10314 ; WX 781 ; N uni284A ; G 4014\nU 10315 ; WX 781 ; N uni284B ; G 4015\nU 10316 ; WX 781 ; N uni284C ; G 4016\nU 10317 ; WX 781 ; N uni284D ; G 4017\nU 10318 ; WX 781 ; N uni284E ; G 4018\nU 10319 ; WX 781 ; N uni284F ; G 4019\nU 10320 ; WX 781 ; N uni2850 ; G 4020\nU 10321 ; WX 781 ; N uni2851 ; G 4021\nU 10322 ; WX 781 ; N uni2852 ; G 4022\nU 10323 ; WX 781 ; N uni2853 ; G 4023\nU 10324 ; WX 781 ; N uni2854 ; G 4024\nU 10325 ; WX 781 ; N uni2855 ; G 4025\nU 10326 ; WX 781 ; N uni2856 ; G 4026\nU 10327 ; WX 781 ; N uni2857 ; G 4027\nU 10328 ; WX 781 ; N uni2858 ; G 4028\nU 10329 ; WX 781 ; N uni2859 ; G 4029\nU 10330 ; WX 781 ; N uni285A ; G 4030\nU 10331 ; WX 781 ; N uni285B ; G 4031\nU 10332 ; WX 781 ; N uni285C ; G 4032\nU 10333 ; WX 781 ; N uni285D ; G 4033\nU 10334 ; WX 781 ; N uni285E ; G 4034\nU 10335 ; WX 781 ; N uni285F ; G 4035\nU 10336 ; WX 781 ; N uni2860 ; G 4036\nU 10337 ; WX 781 ; N uni2861 ; G 4037\nU 10338 ; WX 781 ; N uni2862 ; G 4038\nU 10339 ; WX 781 ; N uni2863 ; G 4039\nU 10340 ; WX 781 ; N uni2864 ; G 4040\nU 10341 ; WX 781 ; N uni2865 ; G 4041\nU 10342 ; WX 781 ; N uni2866 ; G 4042\nU 10343 ; WX 781 ; N uni2867 ; G 4043\nU 10344 ; WX 781 ; N uni2868 ; G 4044\nU 10345 ; WX 781 ; N uni2869 ; G 4045\nU 10346 ; WX 781 ; N uni286A ; G 4046\nU 10347 ; WX 781 ; N uni286B ; G 4047\nU 10348 ; WX 781 ; N uni286C ; G 4048\nU 10349 ; WX 781 ; N uni286D ; G 4049\nU 10350 ; WX 781 ; N uni286E ; G 4050\nU 10351 ; WX 781 ; N uni286F ; G 4051\nU 10352 ; WX 781 ; N uni2870 ; G 4052\nU 10353 ; WX 781 ; N uni2871 ; G 4053\nU 10354 ; WX 781 ; N uni2872 ; G 4054\nU 10355 ; WX 781 ; N uni2873 ; G 4055\nU 10356 ; WX 781 ; N uni2874 ; G 4056\nU 10357 ; WX 781 ; N uni2875 ; G 4057\nU 10358 ; WX 781 ; N uni2876 ; G 4058\nU 10359 ; WX 781 ; N uni2877 ; G 4059\nU 10360 ; WX 781 ; N uni2878 ; G 4060\nU 10361 ; WX 781 ; N uni2879 ; G 4061\nU 10362 ; WX 781 ; N uni287A ; G 4062\nU 10363 ; WX 781 ; N uni287B ; G 4063\nU 10364 ; WX 781 ; N uni287C ; G 4064\nU 10365 ; WX 781 ; N uni287D ; G 4065\nU 10366 ; WX 781 ; N uni287E ; G 4066\nU 10367 ; WX 781 ; N uni287F ; G 4067\nU 10368 ; WX 781 ; N uni2880 ; G 4068\nU 10369 ; WX 781 ; N uni2881 ; G 4069\nU 10370 ; WX 781 ; N uni2882 ; G 4070\nU 10371 ; WX 781 ; N uni2883 ; G 4071\nU 10372 ; WX 781 ; N uni2884 ; G 4072\nU 10373 ; WX 781 ; N uni2885 ; G 4073\nU 10374 ; WX 781 ; N uni2886 ; G 4074\nU 10375 ; WX 781 ; N uni2887 ; G 4075\nU 10376 ; WX 781 ; N uni2888 ; G 4076\nU 10377 ; WX 781 ; N uni2889 ; G 4077\nU 10378 ; WX 781 ; N uni288A ; G 4078\nU 10379 ; WX 781 ; N uni288B ; G 4079\nU 10380 ; WX 781 ; N uni288C ; G 4080\nU 10381 ; WX 781 ; N uni288D ; G 4081\nU 10382 ; WX 781 ; N uni288E ; G 4082\nU 10383 ; WX 781 ; N uni288F ; G 4083\nU 10384 ; WX 781 ; N uni2890 ; G 4084\nU 10385 ; WX 781 ; N uni2891 ; G 4085\nU 10386 ; WX 781 ; N uni2892 ; G 4086\nU 10387 ; WX 781 ; N uni2893 ; G 4087\nU 10388 ; WX 781 ; N uni2894 ; G 4088\nU 10389 ; WX 781 ; N uni2895 ; G 4089\nU 10390 ; WX 781 ; N uni2896 ; G 4090\nU 10391 ; WX 781 ; N uni2897 ; G 4091\nU 10392 ; WX 781 ; N uni2898 ; G 4092\nU 10393 ; WX 781 ; N uni2899 ; G 4093\nU 10394 ; WX 781 ; N uni289A ; G 4094\nU 10395 ; WX 781 ; N uni289B ; G 4095\nU 10396 ; WX 781 ; N uni289C ; G 4096\nU 10397 ; WX 781 ; N uni289D ; G 4097\nU 10398 ; WX 781 ; N uni289E ; G 4098\nU 10399 ; WX 781 ; N uni289F ; G 4099\nU 10400 ; WX 781 ; N uni28A0 ; G 4100\nU 10401 ; WX 781 ; N uni28A1 ; G 4101\nU 10402 ; WX 781 ; N uni28A2 ; G 4102\nU 10403 ; WX 781 ; N uni28A3 ; G 4103\nU 10404 ; WX 781 ; N uni28A4 ; G 4104\nU 10405 ; WX 781 ; N uni28A5 ; G 4105\nU 10406 ; WX 781 ; N uni28A6 ; G 4106\nU 10407 ; WX 781 ; N uni28A7 ; G 4107\nU 10408 ; WX 781 ; N uni28A8 ; G 4108\nU 10409 ; WX 781 ; N uni28A9 ; G 4109\nU 10410 ; WX 781 ; N uni28AA ; G 4110\nU 10411 ; WX 781 ; N uni28AB ; G 4111\nU 10412 ; WX 781 ; N uni28AC ; G 4112\nU 10413 ; WX 781 ; N uni28AD ; G 4113\nU 10414 ; WX 781 ; N uni28AE ; G 4114\nU 10415 ; WX 781 ; N uni28AF ; G 4115\nU 10416 ; WX 781 ; N uni28B0 ; G 4116\nU 10417 ; WX 781 ; N uni28B1 ; G 4117\nU 10418 ; WX 781 ; N uni28B2 ; G 4118\nU 10419 ; WX 781 ; N uni28B3 ; G 4119\nU 10420 ; WX 781 ; N uni28B4 ; G 4120\nU 10421 ; WX 781 ; N uni28B5 ; G 4121\nU 10422 ; WX 781 ; N uni28B6 ; G 4122\nU 10423 ; WX 781 ; N uni28B7 ; G 4123\nU 10424 ; WX 781 ; N uni28B8 ; G 4124\nU 10425 ; WX 781 ; N uni28B9 ; G 4125\nU 10426 ; WX 781 ; N uni28BA ; G 4126\nU 10427 ; WX 781 ; N uni28BB ; G 4127\nU 10428 ; WX 781 ; N uni28BC ; G 4128\nU 10429 ; WX 781 ; N uni28BD ; G 4129\nU 10430 ; WX 781 ; N uni28BE ; G 4130\nU 10431 ; WX 781 ; N uni28BF ; G 4131\nU 10432 ; WX 781 ; N uni28C0 ; G 4132\nU 10433 ; WX 781 ; N uni28C1 ; G 4133\nU 10434 ; WX 781 ; N uni28C2 ; G 4134\nU 10435 ; WX 781 ; N uni28C3 ; G 4135\nU 10436 ; WX 781 ; N uni28C4 ; G 4136\nU 10437 ; WX 781 ; N uni28C5 ; G 4137\nU 10438 ; WX 781 ; N uni28C6 ; G 4138\nU 10439 ; WX 781 ; N uni28C7 ; G 4139\nU 10440 ; WX 781 ; N uni28C8 ; G 4140\nU 10441 ; WX 781 ; N uni28C9 ; G 4141\nU 10442 ; WX 781 ; N uni28CA ; G 4142\nU 10443 ; WX 781 ; N uni28CB ; G 4143\nU 10444 ; WX 781 ; N uni28CC ; G 4144\nU 10445 ; WX 781 ; N uni28CD ; G 4145\nU 10446 ; WX 781 ; N uni28CE ; G 4146\nU 10447 ; WX 781 ; N uni28CF ; G 4147\nU 10448 ; WX 781 ; N uni28D0 ; G 4148\nU 10449 ; WX 781 ; N uni28D1 ; G 4149\nU 10450 ; WX 781 ; N uni28D2 ; G 4150\nU 10451 ; WX 781 ; N uni28D3 ; G 4151\nU 10452 ; WX 781 ; N uni28D4 ; G 4152\nU 10453 ; WX 781 ; N uni28D5 ; G 4153\nU 10454 ; WX 781 ; N uni28D6 ; G 4154\nU 10455 ; WX 781 ; N uni28D7 ; G 4155\nU 10456 ; WX 781 ; N uni28D8 ; G 4156\nU 10457 ; WX 781 ; N uni28D9 ; G 4157\nU 10458 ; WX 781 ; N uni28DA ; G 4158\nU 10459 ; WX 781 ; N uni28DB ; G 4159\nU 10460 ; WX 781 ; N uni28DC ; G 4160\nU 10461 ; WX 781 ; N uni28DD ; G 4161\nU 10462 ; WX 781 ; N uni28DE ; G 4162\nU 10463 ; WX 781 ; N uni28DF ; G 4163\nU 10464 ; WX 781 ; N uni28E0 ; G 4164\nU 10465 ; WX 781 ; N uni28E1 ; G 4165\nU 10466 ; WX 781 ; N uni28E2 ; G 4166\nU 10467 ; WX 781 ; N uni28E3 ; G 4167\nU 10468 ; WX 781 ; N uni28E4 ; G 4168\nU 10469 ; WX 781 ; N uni28E5 ; G 4169\nU 10470 ; WX 781 ; N uni28E6 ; G 4170\nU 10471 ; WX 781 ; N uni28E7 ; G 4171\nU 10472 ; WX 781 ; N uni28E8 ; G 4172\nU 10473 ; WX 781 ; N uni28E9 ; G 4173\nU 10474 ; WX 781 ; N uni28EA ; G 4174\nU 10475 ; WX 781 ; N uni28EB ; G 4175\nU 10476 ; WX 781 ; N uni28EC ; G 4176\nU 10477 ; WX 781 ; N uni28ED ; G 4177\nU 10478 ; WX 781 ; N uni28EE ; G 4178\nU 10479 ; WX 781 ; N uni28EF ; G 4179\nU 10480 ; WX 781 ; N uni28F0 ; G 4180\nU 10481 ; WX 781 ; N uni28F1 ; G 4181\nU 10482 ; WX 781 ; N uni28F2 ; G 4182\nU 10483 ; WX 781 ; N uni28F3 ; G 4183\nU 10484 ; WX 781 ; N uni28F4 ; G 4184\nU 10485 ; WX 781 ; N uni28F5 ; G 4185\nU 10486 ; WX 781 ; N uni28F6 ; G 4186\nU 10487 ; WX 781 ; N uni28F7 ; G 4187\nU 10488 ; WX 781 ; N uni28F8 ; G 4188\nU 10489 ; WX 781 ; N uni28F9 ; G 4189\nU 10490 ; WX 781 ; N uni28FA ; G 4190\nU 10491 ; WX 781 ; N uni28FB ; G 4191\nU 10492 ; WX 781 ; N uni28FC ; G 4192\nU 10493 ; WX 781 ; N uni28FD ; G 4193\nU 10494 ; WX 781 ; N uni28FE ; G 4194\nU 10495 ; WX 781 ; N uni28FF ; G 4195\nU 10502 ; WX 838 ; N uni2906 ; G 4196\nU 10503 ; WX 838 ; N uni2907 ; G 4197\nU 10506 ; WX 838 ; N uni290A ; G 4198\nU 10507 ; WX 838 ; N uni290B ; G 4199\nU 10560 ; WX 838 ; N uni2940 ; G 4200\nU 10561 ; WX 838 ; N uni2941 ; G 4201\nU 10627 ; WX 753 ; N uni2983 ; G 4202\nU 10628 ; WX 753 ; N uni2984 ; G 4203\nU 10702 ; WX 838 ; N uni29CE ; G 4204\nU 10703 ; WX 1046 ; N uni29CF ; G 4205\nU 10704 ; WX 1046 ; N uni29D0 ; G 4206\nU 10705 ; WX 1000 ; N uni29D1 ; G 4207\nU 10706 ; WX 1000 ; N uni29D2 ; G 4208\nU 10707 ; WX 1000 ; N uni29D3 ; G 4209\nU 10708 ; WX 1000 ; N uni29D4 ; G 4210\nU 10709 ; WX 1000 ; N uni29D5 ; G 4211\nU 10731 ; WX 494 ; N uni29EB ; G 4212\nU 10746 ; WX 838 ; N uni29FA ; G 4213\nU 10747 ; WX 838 ; N uni29FB ; G 4214\nU 10752 ; WX 1000 ; N uni2A00 ; G 4215\nU 10753 ; WX 1000 ; N uni2A01 ; G 4216\nU 10754 ; WX 1000 ; N uni2A02 ; G 4217\nU 10764 ; WX 1661 ; N uni2A0C ; G 4218\nU 10765 ; WX 563 ; N uni2A0D ; G 4219\nU 10766 ; WX 563 ; N uni2A0E ; G 4220\nU 10767 ; WX 563 ; N uni2A0F ; G 4221\nU 10768 ; WX 563 ; N uni2A10 ; G 4222\nU 10769 ; WX 563 ; N uni2A11 ; G 4223\nU 10770 ; WX 563 ; N uni2A12 ; G 4224\nU 10771 ; WX 563 ; N uni2A13 ; G 4225\nU 10772 ; WX 563 ; N uni2A14 ; G 4226\nU 10773 ; WX 563 ; N uni2A15 ; G 4227\nU 10774 ; WX 563 ; N uni2A16 ; G 4228\nU 10775 ; WX 563 ; N uni2A17 ; G 4229\nU 10776 ; WX 563 ; N uni2A18 ; G 4230\nU 10777 ; WX 563 ; N uni2A19 ; G 4231\nU 10778 ; WX 563 ; N uni2A1A ; G 4232\nU 10779 ; WX 563 ; N uni2A1B ; G 4233\nU 10780 ; WX 563 ; N uni2A1C ; G 4234\nU 10799 ; WX 838 ; N uni2A2F ; G 4235\nU 10858 ; WX 838 ; N uni2A6A ; G 4236\nU 10859 ; WX 838 ; N uni2A6B ; G 4237\nU 10877 ; WX 838 ; N uni2A7D ; G 4238\nU 10878 ; WX 838 ; N uni2A7E ; G 4239\nU 10879 ; WX 838 ; N uni2A7F ; G 4240\nU 10880 ; WX 838 ; N uni2A80 ; G 4241\nU 10881 ; WX 838 ; N uni2A81 ; G 4242\nU 10882 ; WX 838 ; N uni2A82 ; G 4243\nU 10883 ; WX 838 ; N uni2A83 ; G 4244\nU 10884 ; WX 838 ; N uni2A84 ; G 4245\nU 10885 ; WX 838 ; N uni2A85 ; G 4246\nU 10886 ; WX 838 ; N uni2A86 ; G 4247\nU 10887 ; WX 838 ; N uni2A87 ; G 4248\nU 10888 ; WX 838 ; N uni2A88 ; G 4249\nU 10889 ; WX 838 ; N uni2A89 ; G 4250\nU 10890 ; WX 838 ; N uni2A8A ; G 4251\nU 10891 ; WX 838 ; N uni2A8B ; G 4252\nU 10892 ; WX 838 ; N uni2A8C ; G 4253\nU 10893 ; WX 838 ; N uni2A8D ; G 4254\nU 10894 ; WX 838 ; N uni2A8E ; G 4255\nU 10895 ; WX 838 ; N uni2A8F ; G 4256\nU 10896 ; WX 838 ; N uni2A90 ; G 4257\nU 10897 ; WX 838 ; N uni2A91 ; G 4258\nU 10898 ; WX 838 ; N uni2A92 ; G 4259\nU 10899 ; WX 838 ; N uni2A93 ; G 4260\nU 10900 ; WX 838 ; N uni2A94 ; G 4261\nU 10901 ; WX 838 ; N uni2A95 ; G 4262\nU 10902 ; WX 838 ; N uni2A96 ; G 4263\nU 10903 ; WX 838 ; N uni2A97 ; G 4264\nU 10904 ; WX 838 ; N uni2A98 ; G 4265\nU 10905 ; WX 838 ; N uni2A99 ; G 4266\nU 10906 ; WX 838 ; N uni2A9A ; G 4267\nU 10907 ; WX 838 ; N uni2A9B ; G 4268\nU 10908 ; WX 838 ; N uni2A9C ; G 4269\nU 10909 ; WX 838 ; N uni2A9D ; G 4270\nU 10910 ; WX 838 ; N uni2A9E ; G 4271\nU 10911 ; WX 838 ; N uni2A9F ; G 4272\nU 10912 ; WX 838 ; N uni2AA0 ; G 4273\nU 10926 ; WX 838 ; N uni2AAE ; G 4274\nU 10927 ; WX 838 ; N uni2AAF ; G 4275\nU 10928 ; WX 838 ; N uni2AB0 ; G 4276\nU 10929 ; WX 838 ; N uni2AB1 ; G 4277\nU 10930 ; WX 838 ; N uni2AB2 ; G 4278\nU 10931 ; WX 838 ; N uni2AB3 ; G 4279\nU 10932 ; WX 838 ; N uni2AB4 ; G 4280\nU 10933 ; WX 838 ; N uni2AB5 ; G 4281\nU 10934 ; WX 838 ; N uni2AB6 ; G 4282\nU 10935 ; WX 838 ; N uni2AB7 ; G 4283\nU 10936 ; WX 838 ; N uni2AB8 ; G 4284\nU 10937 ; WX 838 ; N uni2AB9 ; G 4285\nU 10938 ; WX 838 ; N uni2ABA ; G 4286\nU 11001 ; WX 838 ; N uni2AF9 ; G 4287\nU 11002 ; WX 838 ; N uni2AFA ; G 4288\nU 11008 ; WX 838 ; N uni2B00 ; G 4289\nU 11009 ; WX 838 ; N uni2B01 ; G 4290\nU 11010 ; WX 838 ; N uni2B02 ; G 4291\nU 11011 ; WX 838 ; N uni2B03 ; G 4292\nU 11012 ; WX 838 ; N uni2B04 ; G 4293\nU 11013 ; WX 838 ; N uni2B05 ; G 4294\nU 11014 ; WX 838 ; N uni2B06 ; G 4295\nU 11015 ; WX 838 ; N uni2B07 ; G 4296\nU 11016 ; WX 838 ; N uni2B08 ; G 4297\nU 11017 ; WX 838 ; N uni2B09 ; G 4298\nU 11018 ; WX 838 ; N uni2B0A ; G 4299\nU 11019 ; WX 838 ; N uni2B0B ; G 4300\nU 11020 ; WX 838 ; N uni2B0C ; G 4301\nU 11021 ; WX 838 ; N uni2B0D ; G 4302\nU 11022 ; WX 838 ; N uni2B0E ; G 4303\nU 11023 ; WX 838 ; N uni2B0F ; G 4304\nU 11024 ; WX 838 ; N uni2B10 ; G 4305\nU 11025 ; WX 838 ; N uni2B11 ; G 4306\nU 11026 ; WX 945 ; N uni2B12 ; G 4307\nU 11027 ; WX 945 ; N uni2B13 ; G 4308\nU 11028 ; WX 945 ; N uni2B14 ; G 4309\nU 11029 ; WX 945 ; N uni2B15 ; G 4310\nU 11030 ; WX 769 ; N uni2B16 ; G 4311\nU 11031 ; WX 769 ; N uni2B17 ; G 4312\nU 11032 ; WX 769 ; N uni2B18 ; G 4313\nU 11033 ; WX 769 ; N uni2B19 ; G 4314\nU 11034 ; WX 945 ; N uni2B1A ; G 4315\nU 11039 ; WX 869 ; N uni2B1F ; G 4316\nU 11040 ; WX 869 ; N uni2B20 ; G 4317\nU 11041 ; WX 873 ; N uni2B21 ; G 4318\nU 11042 ; WX 873 ; N uni2B22 ; G 4319\nU 11043 ; WX 873 ; N uni2B23 ; G 4320\nU 11044 ; WX 1119 ; N uni2B24 ; G 4321\nU 11091 ; WX 869 ; N uni2B53 ; G 4322\nU 11092 ; WX 869 ; N uni2B54 ; G 4323\nU 11360 ; WX 637 ; N uni2C60 ; G 4324\nU 11361 ; WX 360 ; N uni2C61 ; G 4325\nU 11362 ; WX 637 ; N uni2C62 ; G 4326\nU 11363 ; WX 733 ; N uni2C63 ; G 4327\nU 11364 ; WX 770 ; N uni2C64 ; G 4328\nU 11365 ; WX 675 ; N uni2C65 ; G 4329\nU 11366 ; WX 478 ; N uni2C66 ; G 4330\nU 11367 ; WX 956 ; N uni2C67 ; G 4331\nU 11368 ; WX 712 ; N uni2C68 ; G 4332\nU 11369 ; WX 775 ; N uni2C69 ; G 4333\nU 11370 ; WX 665 ; N uni2C6A ; G 4334\nU 11371 ; WX 725 ; N uni2C6B ; G 4335\nU 11372 ; WX 582 ; N uni2C6C ; G 4336\nU 11373 ; WX 860 ; N uni2C6D ; G 4337\nU 11374 ; WX 995 ; N uni2C6E ; G 4338\nU 11375 ; WX 774 ; N uni2C6F ; G 4339\nU 11376 ; WX 860 ; N uni2C70 ; G 4340\nU 11377 ; WX 778 ; N uni2C71 ; G 4341\nU 11378 ; WX 1221 ; N uni2C72 ; G 4342\nU 11379 ; WX 1056 ; N uni2C73 ; G 4343\nU 11380 ; WX 652 ; N uni2C74 ; G 4344\nU 11381 ; WX 698 ; N uni2C75 ; G 4345\nU 11382 ; WX 565 ; N uni2C76 ; G 4346\nU 11383 ; WX 782 ; N uni2C77 ; G 4347\nU 11385 ; WX 538 ; N uni2C79 ; G 4348\nU 11386 ; WX 687 ; N uni2C7A ; G 4349\nU 11387 ; WX 559 ; N uni2C7B ; G 4350\nU 11388 ; WX 219 ; N uni2C7C ; G 4351\nU 11389 ; WX 487 ; N uni2C7D ; G 4352\nU 11390 ; WX 720 ; N uni2C7E ; G 4353\nU 11391 ; WX 725 ; N uni2C7F ; G 4354\nU 11520 ; WX 663 ; N uni2D00 ; G 4355\nU 11521 ; WX 676 ; N uni2D01 ; G 4356\nU 11522 ; WX 661 ; N uni2D02 ; G 4357\nU 11523 ; WX 629 ; N uni2D03 ; G 4358\nU 11524 ; WX 661 ; N uni2D04 ; G 4359\nU 11525 ; WX 1032 ; N uni2D05 ; G 4360\nU 11526 ; WX 718 ; N uni2D06 ; G 4361\nU 11527 ; WX 1032 ; N uni2D07 ; G 4362\nU 11528 ; WX 648 ; N uni2D08 ; G 4363\nU 11529 ; WX 667 ; N uni2D09 ; G 4364\nU 11530 ; WX 1032 ; N uni2D0A ; G 4365\nU 11531 ; WX 673 ; N uni2D0B ; G 4366\nU 11532 ; WX 677 ; N uni2D0C ; G 4367\nU 11533 ; WX 1036 ; N uni2D0D ; G 4368\nU 11534 ; WX 680 ; N uni2D0E ; G 4369\nU 11535 ; WX 886 ; N uni2D0F ; G 4370\nU 11536 ; WX 1032 ; N uni2D10 ; G 4371\nU 11537 ; WX 683 ; N uni2D11 ; G 4372\nU 11538 ; WX 674 ; N uni2D12 ; G 4373\nU 11539 ; WX 1035 ; N uni2D13 ; G 4374\nU 11540 ; WX 1033 ; N uni2D14 ; G 4375\nU 11541 ; WX 1027 ; N uni2D15 ; G 4376\nU 11542 ; WX 676 ; N uni2D16 ; G 4377\nU 11543 ; WX 673 ; N uni2D17 ; G 4378\nU 11544 ; WX 667 ; N uni2D18 ; G 4379\nU 11545 ; WX 667 ; N uni2D19 ; G 4380\nU 11546 ; WX 660 ; N uni2D1A ; G 4381\nU 11547 ; WX 671 ; N uni2D1B ; G 4382\nU 11548 ; WX 1039 ; N uni2D1C ; G 4383\nU 11549 ; WX 673 ; N uni2D1D ; G 4384\nU 11550 ; WX 692 ; N uni2D1E ; G 4385\nU 11551 ; WX 659 ; N uni2D1F ; G 4386\nU 11552 ; WX 1048 ; N uni2D20 ; G 4387\nU 11553 ; WX 660 ; N uni2D21 ; G 4388\nU 11554 ; WX 654 ; N uni2D22 ; G 4389\nU 11555 ; WX 670 ; N uni2D23 ; G 4390\nU 11556 ; WX 733 ; N uni2D24 ; G 4391\nU 11557 ; WX 1017 ; N uni2D25 ; G 4392\nU 11800 ; WX 580 ; N uni2E18 ; G 4393\nU 11807 ; WX 838 ; N uni2E1F ; G 4394\nU 11810 ; WX 457 ; N uni2E22 ; G 4395\nU 11811 ; WX 457 ; N uni2E23 ; G 4396\nU 11812 ; WX 457 ; N uni2E24 ; G 4397\nU 11813 ; WX 457 ; N uni2E25 ; G 4398\nU 11822 ; WX 580 ; N uni2E2E ; G 4399\nU 19904 ; WX 896 ; N uni4DC0 ; G 4400\nU 19905 ; WX 896 ; N uni4DC1 ; G 4401\nU 19906 ; WX 896 ; N uni4DC2 ; G 4402\nU 19907 ; WX 896 ; N uni4DC3 ; G 4403\nU 19908 ; WX 896 ; N uni4DC4 ; G 4404\nU 19909 ; WX 896 ; N uni4DC5 ; G 4405\nU 19910 ; WX 896 ; N uni4DC6 ; G 4406\nU 19911 ; WX 896 ; N uni4DC7 ; G 4407\nU 19912 ; WX 896 ; N uni4DC8 ; G 4408\nU 19913 ; WX 896 ; N uni4DC9 ; G 4409\nU 19914 ; WX 896 ; N uni4DCA ; G 4410\nU 19915 ; WX 896 ; N uni4DCB ; G 4411\nU 19916 ; WX 896 ; N uni4DCC ; G 4412\nU 19917 ; WX 896 ; N uni4DCD ; G 4413\nU 19918 ; WX 896 ; N uni4DCE ; G 4414\nU 19919 ; WX 896 ; N uni4DCF ; G 4415\nU 19920 ; WX 896 ; N uni4DD0 ; G 4416\nU 19921 ; WX 896 ; N uni4DD1 ; G 4417\nU 19922 ; WX 896 ; N uni4DD2 ; G 4418\nU 19923 ; WX 896 ; N uni4DD3 ; G 4419\nU 19924 ; WX 896 ; N uni4DD4 ; G 4420\nU 19925 ; WX 896 ; N uni4DD5 ; G 4421\nU 19926 ; WX 896 ; N uni4DD6 ; G 4422\nU 19927 ; WX 896 ; N uni4DD7 ; G 4423\nU 19928 ; WX 896 ; N uni4DD8 ; G 4424\nU 19929 ; WX 896 ; N uni4DD9 ; G 4425\nU 19930 ; WX 896 ; N uni4DDA ; G 4426\nU 19931 ; WX 896 ; N uni4DDB ; G 4427\nU 19932 ; WX 896 ; N uni4DDC ; G 4428\nU 19933 ; WX 896 ; N uni4DDD ; G 4429\nU 19934 ; WX 896 ; N uni4DDE ; G 4430\nU 19935 ; WX 896 ; N uni4DDF ; G 4431\nU 19936 ; WX 896 ; N uni4DE0 ; G 4432\nU 19937 ; WX 896 ; N uni4DE1 ; G 4433\nU 19938 ; WX 896 ; N uni4DE2 ; G 4434\nU 19939 ; WX 896 ; N uni4DE3 ; G 4435\nU 19940 ; WX 896 ; N uni4DE4 ; G 4436\nU 19941 ; WX 896 ; N uni4DE5 ; G 4437\nU 19942 ; WX 896 ; N uni4DE6 ; G 4438\nU 19943 ; WX 896 ; N uni4DE7 ; G 4439\nU 19944 ; WX 896 ; N uni4DE8 ; G 4440\nU 19945 ; WX 896 ; N uni4DE9 ; G 4441\nU 19946 ; WX 896 ; N uni4DEA ; G 4442\nU 19947 ; WX 896 ; N uni4DEB ; G 4443\nU 19948 ; WX 896 ; N uni4DEC ; G 4444\nU 19949 ; WX 896 ; N uni4DED ; G 4445\nU 19950 ; WX 896 ; N uni4DEE ; G 4446\nU 19951 ; WX 896 ; N uni4DEF ; G 4447\nU 19952 ; WX 896 ; N uni4DF0 ; G 4448\nU 19953 ; WX 896 ; N uni4DF1 ; G 4449\nU 19954 ; WX 896 ; N uni4DF2 ; G 4450\nU 19955 ; WX 896 ; N uni4DF3 ; G 4451\nU 19956 ; WX 896 ; N uni4DF4 ; G 4452\nU 19957 ; WX 896 ; N uni4DF5 ; G 4453\nU 19958 ; WX 896 ; N uni4DF6 ; G 4454\nU 19959 ; WX 896 ; N uni4DF7 ; G 4455\nU 19960 ; WX 896 ; N uni4DF8 ; G 4456\nU 19961 ; WX 896 ; N uni4DF9 ; G 4457\nU 19962 ; WX 896 ; N uni4DFA ; G 4458\nU 19963 ; WX 896 ; N uni4DFB ; G 4459\nU 19964 ; WX 896 ; N uni4DFC ; G 4460\nU 19965 ; WX 896 ; N uni4DFD ; G 4461\nU 19966 ; WX 896 ; N uni4DFE ; G 4462\nU 19967 ; WX 896 ; N uni4DFF ; G 4463\nU 42192 ; WX 762 ; N uniA4D0 ; G 4464\nU 42193 ; WX 733 ; N uniA4D1 ; G 4465\nU 42194 ; WX 733 ; N uniA4D2 ; G 4466\nU 42195 ; WX 830 ; N uniA4D3 ; G 4467\nU 42196 ; WX 682 ; N uniA4D4 ; G 4468\nU 42197 ; WX 682 ; N uniA4D5 ; G 4469\nU 42198 ; WX 821 ; N uniA4D6 ; G 4470\nU 42199 ; WX 775 ; N uniA4D7 ; G 4471\nU 42200 ; WX 775 ; N uniA4D8 ; G 4472\nU 42201 ; WX 530 ; N uniA4D9 ; G 4473\nU 42202 ; WX 734 ; N uniA4DA ; G 4474\nU 42203 ; WX 734 ; N uniA4DB ; G 4475\nU 42204 ; WX 725 ; N uniA4DC ; G 4476\nU 42205 ; WX 683 ; N uniA4DD ; G 4477\nU 42206 ; WX 683 ; N uniA4DE ; G 4478\nU 42207 ; WX 995 ; N uniA4DF ; G 4479\nU 42208 ; WX 837 ; N uniA4E0 ; G 4480\nU 42209 ; WX 637 ; N uniA4E1 ; G 4481\nU 42210 ; WX 720 ; N uniA4E2 ; G 4482\nU 42211 ; WX 770 ; N uniA4E3 ; G 4483\nU 42212 ; WX 770 ; N uniA4E4 ; G 4484\nU 42213 ; WX 774 ; N uniA4E5 ; G 4485\nU 42214 ; WX 774 ; N uniA4E6 ; G 4486\nU 42215 ; WX 837 ; N uniA4E7 ; G 4487\nU 42216 ; WX 786 ; N uniA4E8 ; G 4488\nU 42217 ; WX 530 ; N uniA4E9 ; G 4489\nU 42218 ; WX 1103 ; N uniA4EA ; G 4490\nU 42219 ; WX 771 ; N uniA4EB ; G 4491\nU 42220 ; WX 724 ; N uniA4EC ; G 4492\nU 42221 ; WX 762 ; N uniA4ED ; G 4493\nU 42222 ; WX 774 ; N uniA4EE ; G 4494\nU 42223 ; WX 774 ; N uniA4EF ; G 4495\nU 42224 ; WX 683 ; N uniA4F0 ; G 4496\nU 42225 ; WX 683 ; N uniA4F1 ; G 4497\nU 42226 ; WX 372 ; N uniA4F2 ; G 4498\nU 42227 ; WX 850 ; N uniA4F3 ; G 4499\nU 42228 ; WX 812 ; N uniA4F4 ; G 4500\nU 42229 ; WX 812 ; N uniA4F5 ; G 4501\nU 42230 ; WX 576 ; N uniA4F6 ; G 4502\nU 42231 ; WX 830 ; N uniA4F7 ; G 4503\nU 42232 ; WX 322 ; N uniA4F8 ; G 4504\nU 42233 ; WX 322 ; N uniA4F9 ; G 4505\nU 42234 ; WX 674 ; N uniA4FA ; G 4506\nU 42235 ; WX 674 ; N uniA4FB ; G 4507\nU 42236 ; WX 322 ; N uniA4FC ; G 4508\nU 42237 ; WX 322 ; N uniA4FD ; G 4509\nU 42238 ; WX 588 ; N uniA4FE ; G 4510\nU 42239 ; WX 588 ; N uniA4FF ; G 4511\nU 42564 ; WX 720 ; N uniA644 ; G 4512\nU 42565 ; WX 595 ; N uniA645 ; G 4513\nU 42566 ; WX 436 ; N uniA646 ; G 4514\nU 42567 ; WX 440 ; N uniA647 ; G 4515\nU 42572 ; WX 1405 ; N uniA64C ; G 4516\nU 42573 ; WX 1173 ; N uniA64D ; G 4517\nU 42576 ; WX 1234 ; N uniA650 ; G 4518\nU 42577 ; WX 1027 ; N uniA651 ; G 4519\nU 42580 ; WX 1174 ; N uniA654 ; G 4520\nU 42581 ; WX 972 ; N uniA655 ; G 4521\nU 42582 ; WX 1100 ; N uniA656 ; G 4522\nU 42583 ; WX 969 ; N uniA657 ; G 4523\nU 42594 ; WX 1100 ; N uniA662 ; G 4524\nU 42595 ; WX 940 ; N uniA663 ; G 4525\nU 42596 ; WX 1096 ; N uniA664 ; G 4526\nU 42597 ; WX 915 ; N uniA665 ; G 4527\nU 42598 ; WX 1260 ; N uniA666 ; G 4528\nU 42599 ; WX 997 ; N uniA667 ; G 4529\nU 42600 ; WX 850 ; N uniA668 ; G 4530\nU 42601 ; WX 687 ; N uniA669 ; G 4531\nU 42602 ; WX 1037 ; N uniA66A ; G 4532\nU 42603 ; WX 868 ; N uniA66B ; G 4533\nU 42604 ; WX 1406 ; N uniA66C ; G 4534\nU 42605 ; WX 1106 ; N uniA66D ; G 4535\nU 42606 ; WX 961 ; N uniA66E ; G 4536\nU 42634 ; WX 944 ; N uniA68A ; G 4537\nU 42635 ; WX 749 ; N uniA68B ; G 4538\nU 42636 ; WX 682 ; N uniA68C ; G 4539\nU 42637 ; WX 580 ; N uniA68D ; G 4540\nU 42644 ; WX 808 ; N uniA694 ; G 4541\nU 42645 ; WX 712 ; N uniA695 ; G 4542\nU 42648 ; WX 1406 ; N uniA698 ; G 4543\nU 42649 ; WX 1106 ; N uniA699 ; G 4544\nU 42760 ; WX 500 ; N uniA708 ; G 4545\nU 42761 ; WX 500 ; N uniA709 ; G 4546\nU 42762 ; WX 500 ; N uniA70A ; G 4547\nU 42763 ; WX 500 ; N uniA70B ; G 4548\nU 42764 ; WX 500 ; N uniA70C ; G 4549\nU 42765 ; WX 500 ; N uniA70D ; G 4550\nU 42766 ; WX 500 ; N uniA70E ; G 4551\nU 42767 ; WX 500 ; N uniA70F ; G 4552\nU 42768 ; WX 500 ; N uniA710 ; G 4553\nU 42769 ; WX 500 ; N uniA711 ; G 4554\nU 42770 ; WX 500 ; N uniA712 ; G 4555\nU 42771 ; WX 500 ; N uniA713 ; G 4556\nU 42772 ; WX 500 ; N uniA714 ; G 4557\nU 42773 ; WX 500 ; N uniA715 ; G 4558\nU 42774 ; WX 500 ; N uniA716 ; G 4559\nU 42779 ; WX 400 ; N uniA71B ; G 4560\nU 42780 ; WX 400 ; N uniA71C ; G 4561\nU 42781 ; WX 287 ; N uniA71D ; G 4562\nU 42782 ; WX 287 ; N uniA71E ; G 4563\nU 42783 ; WX 287 ; N uniA71F ; G 4564\nU 42786 ; WX 444 ; N uniA722 ; G 4565\nU 42787 ; WX 390 ; N uniA723 ; G 4566\nU 42788 ; WX 540 ; N uniA724 ; G 4567\nU 42789 ; WX 540 ; N uniA725 ; G 4568\nU 42790 ; WX 837 ; N uniA726 ; G 4569\nU 42791 ; WX 712 ; N uniA727 ; G 4570\nU 42792 ; WX 1031 ; N uniA728 ; G 4571\nU 42793 ; WX 857 ; N uniA729 ; G 4572\nU 42794 ; WX 696 ; N uniA72A ; G 4573\nU 42795 ; WX 557 ; N uniA72B ; G 4574\nU 42800 ; WX 559 ; N uniA730 ; G 4575\nU 42801 ; WX 595 ; N uniA731 ; G 4576\nU 42802 ; WX 1349 ; N uniA732 ; G 4577\nU 42803 ; WX 1052 ; N uniA733 ; G 4578\nU 42804 ; WX 1285 ; N uniA734 ; G 4579\nU 42805 ; WX 1065 ; N uniA735 ; G 4580\nU 42806 ; WX 1245 ; N uniA736 ; G 4581\nU 42807 ; WX 1052 ; N uniA737 ; G 4582\nU 42808 ; WX 1079 ; N uniA738 ; G 4583\nU 42809 ; WX 922 ; N uniA739 ; G 4584\nU 42810 ; WX 1079 ; N uniA73A ; G 4585\nU 42811 ; WX 922 ; N uniA73B ; G 4586\nU 42812 ; WX 1035 ; N uniA73C ; G 4587\nU 42813 ; WX 922 ; N uniA73D ; G 4588\nU 42814 ; WX 698 ; N uniA73E ; G 4589\nU 42815 ; WX 549 ; N uniA73F ; G 4590\nU 42816 ; WX 656 ; N uniA740 ; G 4591\nU 42817 ; WX 579 ; N uniA741 ; G 4592\nU 42822 ; WX 850 ; N uniA746 ; G 4593\nU 42823 ; WX 542 ; N uniA747 ; G 4594\nU 42824 ; WX 683 ; N uniA748 ; G 4595\nU 42825 ; WX 531 ; N uniA749 ; G 4596\nU 42826 ; WX 918 ; N uniA74A ; G 4597\nU 42827 ; WX 814 ; N uniA74B ; G 4598\nU 42830 ; WX 1406 ; N uniA74E ; G 4599\nU 42831 ; WX 1106 ; N uniA74F ; G 4600\nU 42832 ; WX 733 ; N uniA750 ; G 4601\nU 42833 ; WX 716 ; N uniA751 ; G 4602\nU 42834 ; WX 948 ; N uniA752 ; G 4603\nU 42835 ; WX 937 ; N uniA753 ; G 4604\nU 42838 ; WX 850 ; N uniA756 ; G 4605\nU 42839 ; WX 716 ; N uniA757 ; G 4606\nU 42852 ; WX 738 ; N uniA764 ; G 4607\nU 42853 ; WX 716 ; N uniA765 ; G 4608\nU 42854 ; WX 738 ; N uniA766 ; G 4609\nU 42855 ; WX 716 ; N uniA767 ; G 4610\nU 42880 ; WX 637 ; N uniA780 ; G 4611\nU 42881 ; WX 343 ; N uniA781 ; G 4612\nU 42882 ; WX 837 ; N uniA782 ; G 4613\nU 42883 ; WX 712 ; N uniA783 ; G 4614\nU 42889 ; WX 400 ; N uniA789 ; G 4615\nU 42890 ; WX 396 ; N uniA78A ; G 4616\nU 42891 ; WX 456 ; N uniA78B ; G 4617\nU 42892 ; WX 306 ; N uniA78C ; G 4618\nU 42893 ; WX 808 ; N uniA78D ; G 4619\nU 42894 ; WX 693 ; N uniA78E ; G 4620\nU 42896 ; WX 928 ; N uniA790 ; G 4621\nU 42897 ; WX 768 ; N uniA791 ; G 4622\nU 42912 ; WX 821 ; N uniA7A0 ; G 4623\nU 42913 ; WX 716 ; N uniA7A1 ; G 4624\nU 42914 ; WX 775 ; N uniA7A2 ; G 4625\nU 42915 ; WX 665 ; N uniA7A3 ; G 4626\nU 42916 ; WX 837 ; N uniA7A4 ; G 4627\nU 42917 ; WX 712 ; N uniA7A5 ; G 4628\nU 42918 ; WX 770 ; N uniA7A6 ; G 4629\nU 42919 ; WX 493 ; N uniA7A7 ; G 4630\nU 42920 ; WX 720 ; N uniA7A8 ; G 4631\nU 42921 ; WX 595 ; N uniA7A9 ; G 4632\nU 42922 ; WX 886 ; N uniA7AA ; G 4633\nU 43000 ; WX 613 ; N uniA7F8 ; G 4634\nU 43001 ; WX 689 ; N uniA7F9 ; G 4635\nU 43002 ; WX 1062 ; N uniA7FA ; G 4636\nU 43003 ; WX 683 ; N uniA7FB ; G 4637\nU 43004 ; WX 733 ; N uniA7FC ; G 4638\nU 43005 ; WX 995 ; N uniA7FD ; G 4639\nU 43006 ; WX 372 ; N uniA7FE ; G 4640\nU 43007 ; WX 1325 ; N uniA7FF ; G 4641\nU 61184 ; WX 216 ; N uni02E5.5 ; G 4642\nU 61185 ; WX 242 ; N uni02E6.5 ; G 4643\nU 61186 ; WX 267 ; N uni02E7.5 ; G 4644\nU 61187 ; WX 277 ; N uni02E8.5 ; G 4645\nU 61188 ; WX 282 ; N uni02E9.5 ; G 4646\nU 61189 ; WX 242 ; N uni02E5.4 ; G 4647\nU 61190 ; WX 216 ; N uni02E6.4 ; G 4648\nU 61191 ; WX 242 ; N uni02E7.4 ; G 4649\nU 61192 ; WX 267 ; N uni02E8.4 ; G 4650\nU 61193 ; WX 277 ; N uni02E9.4 ; G 4651\nU 61194 ; WX 267 ; N uni02E5.3 ; G 4652\nU 61195 ; WX 242 ; N uni02E6.3 ; G 4653\nU 61196 ; WX 216 ; N uni02E7.3 ; G 4654\nU 61197 ; WX 242 ; N uni02E8.3 ; G 4655\nU 61198 ; WX 267 ; N uni02E9.3 ; G 4656\nU 61199 ; WX 277 ; N uni02E5.2 ; G 4657\nU 61200 ; WX 267 ; N uni02E6.2 ; G 4658\nU 61201 ; WX 242 ; N uni02E7.2 ; G 4659\nU 61202 ; WX 216 ; N uni02E8.2 ; G 4660\nU 61203 ; WX 242 ; N uni02E9.2 ; G 4661\nU 61204 ; WX 282 ; N uni02E5.1 ; G 4662\nU 61205 ; WX 277 ; N uni02E6.1 ; G 4663\nU 61206 ; WX 267 ; N uni02E7.1 ; G 4664\nU 61207 ; WX 242 ; N uni02E8.1 ; G 4665\nU 61208 ; WX 216 ; N uni02E9.1 ; G 4666\nU 61209 ; WX 282 ; N stem ; G 4667\nU 62464 ; WX 612 ; N uniF400 ; G 4668\nU 62465 ; WX 612 ; N uniF401 ; G 4669\nU 62466 ; WX 653 ; N uniF402 ; G 4670\nU 62467 ; WX 902 ; N uniF403 ; G 4671\nU 62468 ; WX 617 ; N uniF404 ; G 4672\nU 62469 ; WX 617 ; N uniF405 ; G 4673\nU 62470 ; WX 680 ; N uniF406 ; G 4674\nU 62471 ; WX 904 ; N uniF407 ; G 4675\nU 62472 ; WX 599 ; N uniF408 ; G 4676\nU 62473 ; WX 617 ; N uniF409 ; G 4677\nU 62474 ; WX 1163 ; N uniF40A ; G 4678\nU 62475 ; WX 621 ; N uniF40B ; G 4679\nU 62476 ; WX 622 ; N uniF40C ; G 4680\nU 62477 ; WX 893 ; N uniF40D ; G 4681\nU 62478 ; WX 612 ; N uniF40E ; G 4682\nU 62479 ; WX 622 ; N uniF40F ; G 4683\nU 62480 ; WX 924 ; N uniF410 ; G 4684\nU 62481 ; WX 622 ; N uniF411 ; G 4685\nU 62482 ; WX 754 ; N uniF412 ; G 4686\nU 62483 ; WX 624 ; N uniF413 ; G 4687\nU 62484 ; WX 886 ; N uniF414 ; G 4688\nU 62485 ; WX 622 ; N uniF415 ; G 4689\nU 62486 ; WX 907 ; N uniF416 ; G 4690\nU 62487 ; WX 621 ; N uniF417 ; G 4691\nU 62488 ; WX 611 ; N uniF418 ; G 4692\nU 62489 ; WX 624 ; N uniF419 ; G 4693\nU 62490 ; WX 677 ; N uniF41A ; G 4694\nU 62491 ; WX 621 ; N uniF41B ; G 4695\nU 62492 ; WX 611 ; N uniF41C ; G 4696\nU 62493 ; WX 630 ; N uniF41D ; G 4697\nU 62494 ; WX 622 ; N uniF41E ; G 4698\nU 62495 ; WX 561 ; N uniF41F ; G 4699\nU 62496 ; WX 612 ; N uniF420 ; G 4700\nU 62497 ; WX 626 ; N uniF421 ; G 4701\nU 62498 ; WX 612 ; N uniF422 ; G 4702\nU 62499 ; WX 611 ; N uniF423 ; G 4703\nU 62500 ; WX 618 ; N uniF424 ; G 4704\nU 62501 ; WX 667 ; N uniF425 ; G 4705\nU 62502 ; WX 963 ; N uniF426 ; G 4706\nU 62504 ; WX 1023 ; N uniF428 ; G 4707\nU 62505 ; WX 844 ; N uniF429 ; G 4708\nU 62506 ; WX 563 ; N uniF42A ; G 4709\nU 62507 ; WX 563 ; N uniF42B ; G 4710\nU 62508 ; WX 563 ; N uniF42C ; G 4711\nU 62509 ; WX 563 ; N uniF42D ; G 4712\nU 62510 ; WX 563 ; N uniF42E ; G 4713\nU 62511 ; WX 563 ; N uniF42F ; G 4714\nU 62512 ; WX 555 ; N uniF430 ; G 4715\nU 62513 ; WX 555 ; N uniF431 ; G 4716\nU 62514 ; WX 555 ; N uniF432 ; G 4717\nU 62515 ; WX 555 ; N uniF433 ; G 4718\nU 62516 ; WX 573 ; N uniF434 ; G 4719\nU 62517 ; WX 573 ; N uniF435 ; G 4720\nU 62518 ; WX 573 ; N uniF436 ; G 4721\nU 62519 ; WX 824 ; N uniF437 ; G 4722\nU 62520 ; WX 824 ; N uniF438 ; G 4723\nU 62521 ; WX 824 ; N uniF439 ; G 4724\nU 62522 ; WX 824 ; N uniF43A ; G 4725\nU 62523 ; WX 824 ; N uniF43B ; G 4726\nU 62524 ; WX 611 ; N uniF43C ; G 4727\nU 62525 ; WX 611 ; N uniF43D ; G 4728\nU 62526 ; WX 611 ; N uniF43E ; G 4729\nU 62527 ; WX 611 ; N uniF43F ; G 4730\nU 62528 ; WX 611 ; N uniF440 ; G 4731\nU 62529 ; WX 611 ; N uniF441 ; G 4732\nU 62917 ; WX 687 ; N uniF5C5 ; G 4733\nU 64256 ; WX 833 ; N uniFB00 ; G 4734\nU 64257 ; WX 787 ; N fi ; G 4735\nU 64258 ; WX 787 ; N fl ; G 4736\nU 64259 ; WX 1138 ; N uniFB03 ; G 4737\nU 64260 ; WX 1139 ; N uniFB04 ; G 4738\nU 64261 ; WX 808 ; N uniFB05 ; G 4739\nU 64262 ; WX 1020 ; N uniFB06 ; G 4740\nU 64275 ; WX 1388 ; N uniFB13 ; G 4741\nU 64276 ; WX 1384 ; N uniFB14 ; G 4742\nU 64277 ; WX 1378 ; N uniFB15 ; G 4743\nU 64278 ; WX 1384 ; N uniFB16 ; G 4744\nU 64279 ; WX 1713 ; N uniFB17 ; G 4745\nU 64285 ; WX 294 ; N uniFB1D ; G 4746\nU 64286 ; WX 0 ; N uniFB1E ; G 4747\nU 64287 ; WX 663 ; N uniFB1F ; G 4748\nU 64288 ; WX 665 ; N uniFB20 ; G 4749\nU 64289 ; WX 939 ; N uniFB21 ; G 4750\nU 64290 ; WX 788 ; N uniFB22 ; G 4751\nU 64291 ; WX 920 ; N uniFB23 ; G 4752\nU 64292 ; WX 786 ; N uniFB24 ; G 4753\nU 64293 ; WX 857 ; N uniFB25 ; G 4754\nU 64294 ; WX 869 ; N uniFB26 ; G 4755\nU 64295 ; WX 821 ; N uniFB27 ; G 4756\nU 64296 ; WX 890 ; N uniFB28 ; G 4757\nU 64297 ; WX 838 ; N uniFB29 ; G 4758\nU 64298 ; WX 749 ; N uniFB2A ; G 4759\nU 64299 ; WX 749 ; N uniFB2B ; G 4760\nU 64300 ; WX 749 ; N uniFB2C ; G 4761\nU 64301 ; WX 749 ; N uniFB2D ; G 4762\nU 64302 ; WX 728 ; N uniFB2E ; G 4763\nU 64303 ; WX 728 ; N uniFB2F ; G 4764\nU 64304 ; WX 728 ; N uniFB30 ; G 4765\nU 64305 ; WX 610 ; N uniFB31 ; G 4766\nU 64306 ; WX 447 ; N uniFB32 ; G 4767\nU 64307 ; WX 588 ; N uniFB33 ; G 4768\nU 64308 ; WX 687 ; N uniFB34 ; G 4769\nU 64309 ; WX 343 ; N uniFB35 ; G 4770\nU 64310 ; WX 400 ; N uniFB36 ; G 4771\nU 64311 ; WX 1000 ; N uniFB37 ; G 4772\nU 64312 ; WX 679 ; N uniFB38 ; G 4773\nU 64313 ; WX 436 ; N uniFB39 ; G 4774\nU 64314 ; WX 578 ; N uniFB3A ; G 4775\nU 64315 ; WX 566 ; N uniFB3B ; G 4776\nU 64316 ; WX 605 ; N uniFB3C ; G 4777\nU 64317 ; WX 1000 ; N uniFB3D ; G 4778\nU 64318 ; WX 724 ; N uniFB3E ; G 4779\nU 64319 ; WX 1000 ; N uniFB3F ; G 4780\nU 64320 ; WX 453 ; N uniFB40 ; G 4781\nU 64321 ; WX 680 ; N uniFB41 ; G 4782\nU 64322 ; WX 1000 ; N uniFB42 ; G 4783\nU 64323 ; WX 675 ; N uniFB43 ; G 4784\nU 64324 ; WX 658 ; N uniFB44 ; G 4785\nU 64325 ; WX 1000 ; N uniFB45 ; G 4786\nU 64326 ; WX 653 ; N uniFB46 ; G 4787\nU 64327 ; WX 736 ; N uniFB47 ; G 4788\nU 64328 ; WX 602 ; N uniFB48 ; G 4789\nU 64329 ; WX 749 ; N uniFB49 ; G 4790\nU 64330 ; WX 683 ; N uniFB4A ; G 4791\nU 64331 ; WX 343 ; N uniFB4B ; G 4792\nU 64332 ; WX 610 ; N uniFB4C ; G 4793\nU 64333 ; WX 566 ; N uniFB4D ; G 4794\nU 64334 ; WX 658 ; N uniFB4E ; G 4795\nU 64335 ; WX 710 ; N uniFB4F ; G 4796\nU 65024 ; WX 0 ; N uniFE00 ; G 4797\nU 65025 ; WX 0 ; N uniFE01 ; G 4798\nU 65026 ; WX 0 ; N uniFE02 ; G 4799\nU 65027 ; WX 0 ; N uniFE03 ; G 4800\nU 65028 ; WX 0 ; N uniFE04 ; G 4801\nU 65029 ; WX 0 ; N uniFE05 ; G 4802\nU 65030 ; WX 0 ; N uniFE06 ; G 4803\nU 65031 ; WX 0 ; N uniFE07 ; G 4804\nU 65032 ; WX 0 ; N uniFE08 ; G 4805\nU 65033 ; WX 0 ; N uniFE09 ; G 4806\nU 65034 ; WX 0 ; N uniFE0A ; G 4807\nU 65035 ; WX 0 ; N uniFE0B ; G 4808\nU 65036 ; WX 0 ; N uniFE0C ; G 4809\nU 65037 ; WX 0 ; N uniFE0D ; G 4810\nU 65038 ; WX 0 ; N uniFE0E ; G 4811\nU 65039 ; WX 0 ; N uniFE0F ; G 4812\nU 65056 ; WX 0 ; N uniFE20 ; G 4813\nU 65057 ; WX 0 ; N uniFE21 ; G 4814\nU 65058 ; WX 0 ; N uniFE22 ; G 4815\nU 65059 ; WX 0 ; N uniFE23 ; G 4816\nU 65529 ; WX 0 ; N uniFFF9 ; G 4817\nU 65530 ; WX 0 ; N uniFFFA ; G 4818\nU 65531 ; WX 0 ; N uniFFFB ; G 4819\nU 65532 ; WX 0 ; N uniFFFC ; G 4820\nU 65533 ; WX 1113 ; N uniFFFD ; G 4821\nEndCharMetrics\nStartKernData \nStartKernPairs 1921\n\nKPX dollar ampersand -63\nKPX dollar two -63\nKPX dollar seven -196\nKPX dollar eight -92\nKPX dollar nine -139\nKPX dollar colon -112\nKPX dollar less -235\nKPX dollar F -63\nKPX dollar G -63\nKPX dollar W -112\nKPX dollar Y -112\nKPX dollar Z -92\nKPX dollar backslash -149\nKPX dollar copyright -63\nKPX dollar questiondown -149\nKPX dollar Aacute -149\nKPX dollar Egrave -63\nKPX dollar Eacute -63\nKPX dollar Ecircumflex -63\nKPX dollar Edieresis -63\nKPX dollar Igrave -63\nKPX dollar Iacute -63\nKPX dollar Icircumflex -63\nKPX dollar Idieresis -63\nKPX dollar Ntilde -63\nKPX dollar Oacute -63\nKPX dollar Dcaron -63\nKPX dollar Dcroat -63\nKPX dollar Emacron -63\nKPX dollar Ebreve -63\nKPX dollar Hcircumflex -196\nKPX dollar hcircumflex -112\nKPX dollar Hbar -196\nKPX dollar hbar -112\nKPX dollar Imacron -92\nKPX dollar Ibreve -92\nKPX dollar Iogonek -92\nKPX dollar Idot -92\nKPX dollar IJ -92\nKPX dollar Jcircumflex -92\nKPX dollar Kcommaaccent -112\nKPX dollar kcommaaccent -92\nKPX dollar kgreenlandic -235\nKPX dollar Lacute -149\nKPX dollar lacute -235\nKPX dollar uni01AC -63\nKPX dollar uni01AE -63\nKPX dollar uni01DC -196\nKPX dollar uni01DD -112\nKPX dollar uni01F0 -63\nKPX dollar uni01F4 -235\nKPX dollar uni01F5 -149\n\nKPX percent nine -83\nKPX percent colon -112\nKPX percent less -112\nKPX percent Kcommaaccent -112\nKPX percent kgreenlandic -112\nKPX percent lacute -112\nKPX percent uni01F4 -112\n\nKPX ampersand six -73\nKPX ampersand Gcircumflex -73\nKPX ampersand Gbreve -73\nKPX ampersand Gdotaccent -73\nKPX ampersand Gcommaaccent -73\nKPX ampersand uni01DA -73\n\nKPX quotesingle less -159\nKPX quotesingle kgreenlandic -159\nKPX quotesingle lacute -159\nKPX quotesingle uni01F4 -159\n\nKPX parenright dollar -264\nKPX parenright D -235\nKPX parenright H -159\nKPX parenright R -159\nKPX parenright U -225\nKPX parenright X -196\nKPX parenright backslash -188\nKPX parenright cent -235\nKPX parenright sterling -235\nKPX parenright currency -235\nKPX parenright yen -235\nKPX parenright brokenbar -235\nKPX parenright section -235\nKPX parenright dieresis -235\nKPX parenright ordfeminine -159\nKPX parenright guillemotleft -159\nKPX parenright logicalnot -159\nKPX parenright sfthyphen -159\nKPX parenright acute -159\nKPX parenright mu -159\nKPX parenright paragraph -159\nKPX parenright periodcentered -159\nKPX parenright cedilla -159\nKPX parenright ordmasculine -159\nKPX parenright guillemotright -196\nKPX parenright onequarter -196\nKPX parenright onehalf -196\nKPX parenright threequarters -196\nKPX parenright questiondown -188\nKPX parenright Aacute -188\nKPX parenright Acircumflex -264\nKPX parenright Atilde -235\nKPX parenright Adieresis -264\nKPX parenright Aring -235\nKPX parenright AE -264\nKPX parenright Ccedilla -235\nKPX parenright Otilde -159\nKPX parenright multiply -159\nKPX parenright Ugrave -159\nKPX parenright Ucircumflex -159\nKPX parenright Yacute -159\nKPX parenright dcaron -159\nKPX parenright dmacron -159\nKPX parenright emacron -159\nKPX parenright ebreve -159\nKPX parenright edotaccent -225\nKPX parenright eogonek -225\nKPX parenright ecaron -225\nKPX parenright imacron -196\nKPX parenright ibreve -196\nKPX parenright iogonek -196\nKPX parenright dotlessi -196\nKPX parenright ij -196\nKPX parenright jcircumflex -196\nKPX parenright Lacute -188\nKPX parenright uni01A5 -235\nKPX parenright uni01AD -159\nKPX parenright Uhorn -159\nKPX parenright uni01F1 -159\nKPX parenright uni01F5 -188\n\nKPX asterisk seven -36\nKPX asterisk less -83\nKPX asterisk Hbar -36\nKPX asterisk lacute -83\n\nKPX period ampersand -131\nKPX period two -131\nKPX period eight -73\nKPX period colon -55\nKPX period H -112\nKPX period R -112\nKPX period X -112\nKPX period backslash -206\nKPX period ordfeminine -112\nKPX period guillemotleft -112\nKPX period logicalnot -112\nKPX period sfthyphen -112\nKPX period acute -112\nKPX period mu -112\nKPX period paragraph -112\nKPX period periodcentered -112\nKPX period cedilla -112\nKPX period ordmasculine -112\nKPX period guillemotright -112\nKPX period onequarter -112\nKPX period onehalf -112\nKPX period threequarters -112\nKPX period questiondown -206\nKPX period Aacute -206\nKPX period Egrave -131\nKPX period Icircumflex -131\nKPX period Yacute -112\nKPX period Ebreve -178\nKPX period ebreve -112\nKPX period Idot -73\nKPX period dotlessi -112\n\nKPX slash two -73\nKPX slash seven -339\nKPX slash eight -112\nKPX slash nine -282\nKPX slash colon -178\nKPX slash less -319\nKPX slash backslash -253\nKPX slash questiondown -253\nKPX slash Aacute -253\nKPX slash Ebreve -73\nKPX slash Hbar -339\nKPX slash Idot -112\nKPX slash lacute -319\n\nKPX two nine -73\nKPX two semicolon -73\nKPX two less -149\nKPX two lacute -149\n\nKPX three dollar -188\nKPX three D -131\nKPX three H -55\nKPX three U -63\nKPX three V -73\nKPX three X -73\nKPX three cent -131\nKPX three sterling -131\nKPX three currency -131\nKPX three yen -131\nKPX three brokenbar -131\nKPX three section -131\nKPX three dieresis -131\nKPX three ordfeminine -55\nKPX three guillemotleft -55\nKPX three logicalnot -55\nKPX three sfthyphen -55\nKPX three guillemotright -73\nKPX three onequarter -73\nKPX three onehalf -73\nKPX three threequarters -73\nKPX three Yacute -55\nKPX three edotaccent -63\nKPX three ecaron -63\nKPX three gdotaccent -73\nKPX three gcommaaccent -73\nKPX three dotlessi -73\n\n\nKPX five seven -92\nKPX five less -188\nKPX five H -102\nKPX five R -102\nKPX five X -112\nKPX five backslash -131\nKPX five ordfeminine -102\nKPX five guillemotleft -102\nKPX five logicalnot -102\nKPX five sfthyphen -102\nKPX five acute -102\nKPX five mu -102\nKPX five paragraph -102\nKPX five periodcentered -102\nKPX five cedilla -102\nKPX five ordmasculine -102\nKPX five guillemotright -112\nKPX five onequarter -112\nKPX five onehalf -112\nKPX five threequarters -112\nKPX five questiondown -131\nKPX five Aacute -131\nKPX five Yacute -102\nKPX five ebreve -102\nKPX five Hbar -92\nKPX five dotlessi -112\nKPX five lacute -188\n\nKPX six six -73\nKPX six Gdotaccent -73\nKPX six Gcommaaccent -73\n\nKPX seven dollar -159\nKPX seven seven 47\nKPX seven D -243\nKPX seven F -264\nKPX seven H -264\nKPX seven R -264\nKPX seven U -225\nKPX seven V -243\nKPX seven X -264\nKPX seven Z -282\nKPX seven backslash -339\nKPX seven cent -243\nKPX seven sterling -243\nKPX seven currency -243\nKPX seven yen -243\nKPX seven brokenbar -243\nKPX seven section -243\nKPX seven dieresis -243\nKPX seven copyright -264\nKPX seven ordfeminine -264\nKPX seven guillemotleft -264\nKPX seven logicalnot -264\nKPX seven sfthyphen -264\nKPX seven acute -264\nKPX seven mu -264\nKPX seven paragraph -264\nKPX seven periodcentered -264\nKPX seven cedilla -264\nKPX seven ordmasculine -264\nKPX seven guillemotright -264\nKPX seven onequarter -264\nKPX seven onehalf -264\nKPX seven threequarters -264\nKPX seven questiondown -339\nKPX seven Aacute -339\nKPX seven Eacute -264\nKPX seven Idieresis -264\nKPX seven Yacute -264\nKPX seven ebreve -264\nKPX seven edotaccent -225\nKPX seven ecaron -225\nKPX seven gdotaccent -243\nKPX seven gcommaaccent -243\nKPX seven Hbar 47\nKPX seven dotlessi -264\n\nKPX eight dollar -92\n\nKPX nine dollar -139\nKPX nine two -36\nKPX nine D -159\nKPX nine H -149\nKPX nine L -36\nKPX nine R -149\nKPX nine X -149\nKPX nine cent -159\nKPX nine sterling -159\nKPX nine currency -159\nKPX nine yen -159\nKPX nine brokenbar -159\nKPX nine section -159\nKPX nine dieresis -159\nKPX nine ordfeminine -149\nKPX nine guillemotleft -149\nKPX nine logicalnot -149\nKPX nine sfthyphen -149\nKPX nine acute -149\nKPX nine mu -149\nKPX nine paragraph -149\nKPX nine periodcentered -149\nKPX nine cedilla -149\nKPX nine ordmasculine -149\nKPX nine guillemotright -149\nKPX nine onequarter -149\nKPX nine onehalf -149\nKPX nine threequarters -149\nKPX nine Yacute -149\nKPX nine Ebreve -45\nKPX nine ebreve -149\nKPX nine dotlessi -149\n\nKPX colon dollar -73\nKPX colon D -139\nKPX colon H -131\nKPX colon R -112\nKPX colon U -120\nKPX colon cent -139\nKPX colon sterling -139\nKPX colon currency -139\nKPX colon yen -139\nKPX colon brokenbar -139\nKPX colon section -139\nKPX colon dieresis -139\nKPX colon ordfeminine -131\nKPX colon guillemotleft -131\nKPX colon logicalnot -131\nKPX colon sfthyphen -131\nKPX colon acute -112\nKPX colon mu -112\nKPX colon paragraph -112\nKPX colon periodcentered -112\nKPX colon cedilla -112\nKPX colon ordmasculine -112\nKPX colon Yacute -131\nKPX colon ebreve -112\nKPX colon edotaccent -120\nKPX colon ecaron -120\n\nKPX semicolon ampersand -73\nKPX semicolon two -73\nKPX semicolon H -131\nKPX semicolon ordfeminine -131\nKPX semicolon guillemotleft -131\nKPX semicolon logicalnot -131\nKPX semicolon sfthyphen -131\nKPX semicolon Egrave -73\nKPX semicolon Icircumflex -73\nKPX semicolon Yacute -131\nKPX semicolon Ebreve -112\n\nKPX less dollar -196\nKPX less ampersand -73\nKPX less two -73\nKPX less D -243\nKPX less H -264\nKPX less R -264\nKPX less X -225\nKPX less cent -243\nKPX less sterling -243\nKPX less currency -243\nKPX less yen -243\nKPX less brokenbar -243\nKPX less section -243\nKPX less dieresis -243\nKPX less ordfeminine -264\nKPX less guillemotleft -264\nKPX less logicalnot -264\nKPX less sfthyphen -264\nKPX less acute -264\nKPX less mu -264\nKPX less paragraph -264\nKPX less periodcentered -264\nKPX less cedilla -264\nKPX less ordmasculine -264\nKPX less guillemotright -225\nKPX less onequarter -225\nKPX less onehalf -225\nKPX less threequarters -225\nKPX less Egrave -73\nKPX less Icircumflex -73\nKPX less Yacute -264\nKPX less Ebreve -120\nKPX less ebreve -264\nKPX less dotlessi -225\n\n\nKPX D backslash -63\nKPX D questiondown -63\nKPX D Aacute -63\n\n\nKPX N H -73\nKPX N R -73\nKPX N ordfeminine -73\nKPX N guillemotleft -73\nKPX N logicalnot -73\nKPX N sfthyphen -73\nKPX N acute -73\nKPX N mu -73\nKPX N paragraph -73\nKPX N periodcentered -73\nKPX N cedilla -73\nKPX N ordmasculine -45\nKPX N Yacute -73\nKPX N ebreve -73\n\n\n\n\n\nKPX cent backslash -63\nKPX cent questiondown -63\nKPX cent Aacute -63\n\nKPX sterling backslash -63\nKPX sterling questiondown -63\nKPX sterling Aacute -63\n\nKPX currency backslash -63\nKPX currency questiondown -63\nKPX currency Aacute -63\n\nKPX yen backslash -63\nKPX yen questiondown -63\nKPX yen Aacute -63\n\nKPX brokenbar backslash -63\nKPX brokenbar questiondown -63\nKPX brokenbar Aacute -63\n\nKPX section backslash -63\nKPX section questiondown -63\nKPX section Aacute -63\n\n\n\nKPX Acircumflex ampersand -63\nKPX Acircumflex two -63\nKPX Acircumflex seven -196\nKPX Acircumflex eight -92\nKPX Acircumflex nine -139\nKPX Acircumflex colon -112\nKPX Acircumflex less -235\nKPX Acircumflex F -63\nKPX Acircumflex G -63\nKPX Acircumflex W -112\nKPX Acircumflex Y -112\nKPX Acircumflex Z -92\nKPX Acircumflex backslash -149\nKPX Acircumflex copyright -63\nKPX Acircumflex questiondown -149\nKPX Acircumflex Aacute -149\nKPX Acircumflex Egrave -63\nKPX Acircumflex Eacute -63\nKPX Acircumflex Ecircumflex -63\nKPX Acircumflex Edieresis -63\nKPX Acircumflex Igrave -63\nKPX Acircumflex Iacute -63\nKPX Acircumflex Icircumflex -63\nKPX Acircumflex Idieresis -63\nKPX Acircumflex Ntilde -63\nKPX Acircumflex Oacute -63\nKPX Acircumflex Dcaron -63\nKPX Acircumflex Dcroat -63\nKPX Acircumflex Emacron -63\nKPX Acircumflex Ebreve -63\nKPX Acircumflex Hcircumflex -196\nKPX Acircumflex hcircumflex -112\nKPX Acircumflex Hbar -196\nKPX Acircumflex hbar -112\nKPX Acircumflex Imacron -92\nKPX Acircumflex Ibreve -92\nKPX Acircumflex Iogonek -92\nKPX Acircumflex Idot -92\nKPX Acircumflex IJ -92\nKPX Acircumflex Jcircumflex -92\nKPX Acircumflex Kcommaaccent -112\nKPX Acircumflex kcommaaccent -92\nKPX Acircumflex kgreenlandic -235\nKPX Acircumflex Lacute -149\nKPX Acircumflex lacute -235\nKPX Acircumflex uni01AC -63\nKPX Acircumflex uni01AE -63\nKPX Acircumflex uni01DC -196\nKPX Acircumflex uni01DD -112\nKPX Acircumflex uni01F0 -63\nKPX Acircumflex uni01F4 -235\nKPX Acircumflex uni01F5 -149\n\nKPX Adieresis ampersand -63\nKPX Adieresis two -63\nKPX Adieresis seven -196\nKPX Adieresis eight -92\nKPX Adieresis nine -139\nKPX Adieresis colon -112\nKPX Adieresis less -235\nKPX Adieresis F -63\nKPX Adieresis G -63\nKPX Adieresis W -112\nKPX Adieresis Y -112\nKPX Adieresis Z -92\nKPX Adieresis backslash -149\nKPX Adieresis copyright -63\nKPX Adieresis questiondown -149\nKPX Adieresis Aacute -149\nKPX Adieresis Egrave -63\nKPX Adieresis Eacute -63\nKPX Adieresis Ecircumflex -63\nKPX Adieresis Edieresis -63\nKPX Adieresis Igrave -63\nKPX Adieresis Iacute -63\nKPX Adieresis Icircumflex -63\nKPX Adieresis Idieresis -63\nKPX Adieresis Ntilde -63\nKPX Adieresis Oacute -63\nKPX Adieresis Dcaron -63\nKPX Adieresis Dcroat -63\nKPX Adieresis Emacron -63\nKPX Adieresis Ebreve -63\nKPX Adieresis Hcircumflex -196\nKPX Adieresis hcircumflex -112\nKPX Adieresis Hbar -196\nKPX Adieresis hbar -112\nKPX Adieresis Imacron -92\nKPX Adieresis Ibreve -92\nKPX Adieresis Iogonek -92\nKPX Adieresis Idot -92\nKPX Adieresis IJ -92\nKPX Adieresis Jcircumflex -92\nKPX Adieresis Kcommaaccent -112\nKPX Adieresis kcommaaccent -92\nKPX Adieresis kgreenlandic -235\nKPX Adieresis Lacute -149\nKPX Adieresis lacute -235\nKPX Adieresis uni01AC -63\nKPX Adieresis uni01AE -63\nKPX Adieresis uni01DC -196\nKPX Adieresis uni01DD -112\nKPX Adieresis uni01F0 -63\nKPX Adieresis uni01F4 -235\nKPX Adieresis uni01F5 -149\n\nKPX AE ampersand -63\nKPX AE two -63\nKPX AE seven -196\nKPX AE eight -92\nKPX AE nine -139\nKPX AE colon -112\nKPX AE less -235\nKPX AE F -63\nKPX AE G -63\nKPX AE W -112\nKPX AE Y -112\nKPX AE Z -92\nKPX AE backslash -149\nKPX AE copyright -63\nKPX AE questiondown -149\nKPX AE Aacute -149\nKPX AE Egrave -63\nKPX AE Eacute -63\nKPX AE Ecircumflex -63\nKPX AE Edieresis -63\nKPX AE Igrave -63\nKPX AE Iacute -63\nKPX AE Icircumflex -63\nKPX AE Idieresis -63\nKPX AE Ntilde -63\nKPX AE Oacute -63\nKPX AE Dcaron -63\nKPX AE Dcroat -63\nKPX AE Emacron -63\nKPX AE Ebreve -63\nKPX AE Hcircumflex -196\nKPX AE hcircumflex -112\nKPX AE Hbar -196\nKPX AE hbar -112\nKPX AE Imacron -92\nKPX AE Ibreve -92\nKPX AE Iogonek -92\nKPX AE Idot -92\nKPX AE IJ -92\nKPX AE Jcircumflex -92\nKPX AE Kcommaaccent -112\nKPX AE kcommaaccent -92\nKPX AE kgreenlandic -235\nKPX AE Lacute -149\nKPX AE lacute -235\nKPX AE uni01AC -63\nKPX AE uni01AE -63\nKPX AE uni01DC -196\nKPX AE uni01DD -112\nKPX AE uni01F0 -63\nKPX AE uni01F4 -235\nKPX AE uni01F5 -149\n\nKPX Egrave six -73\nKPX Egrave Gcircumflex -73\nKPX Egrave Gbreve -73\nKPX Egrave Gdotaccent -73\nKPX Egrave Gcommaaccent -73\nKPX Egrave uni01DA -73\n\nKPX Ecircumflex six -73\nKPX Ecircumflex Gcircumflex -73\nKPX Ecircumflex Gbreve -73\nKPX Ecircumflex Gdotaccent -73\nKPX Ecircumflex Gcommaaccent -73\nKPX Ecircumflex uni01DA -73\n\nKPX Igrave six -73\nKPX Igrave Gcircumflex -73\nKPX Igrave Gbreve -73\nKPX Igrave Gdotaccent -73\nKPX Igrave Gcommaaccent -73\nKPX Igrave uni01DA -73\n\nKPX Icircumflex six -73\nKPX Icircumflex Gcircumflex -73\nKPX Icircumflex Gbreve -73\nKPX Icircumflex Gdotaccent -73\nKPX Icircumflex Gcommaaccent -73\nKPX Icircumflex uni01DA -73\n\nKPX Eth less -159\nKPX Eth kgreenlandic -159\nKPX Eth lacute -159\nKPX Eth uni01F4 -159\n\nKPX Ograve less -159\nKPX Ograve kgreenlandic -159\nKPX Ograve lacute -159\nKPX Ograve uni01F4 -159\n\nKPX agrave seven -36\nKPX agrave less -83\nKPX agrave Hbar -36\nKPX agrave lacute -83\n\nKPX ucircumflex two -73\nKPX ucircumflex seven -339\nKPX ucircumflex eight -112\nKPX ucircumflex nine -282\nKPX ucircumflex colon -178\nKPX ucircumflex less -319\nKPX ucircumflex backslash -253\nKPX ucircumflex questiondown -253\nKPX ucircumflex Aacute -253\nKPX ucircumflex Ebreve -73\nKPX ucircumflex Hbar -339\nKPX ucircumflex Idot -112\nKPX ucircumflex lacute -319\n\nKPX ydieresis two -73\nKPX ydieresis seven -339\nKPX ydieresis eight -112\nKPX ydieresis nine -282\nKPX ydieresis colon -178\nKPX ydieresis less -319\nKPX ydieresis backslash -253\nKPX ydieresis questiondown -253\nKPX ydieresis Aacute -253\nKPX ydieresis Ebreve -73\nKPX ydieresis Hbar -339\nKPX ydieresis Idot -112\nKPX ydieresis lacute -319\n\nKPX Abreve O -8\n\nKPX abreve two -73\nKPX abreve seven -339\nKPX abreve eight -73\nKPX abreve nine -282\nKPX abreve colon -159\nKPX abreve less -319\nKPX abreve backslash -253\nKPX abreve questiondown -253\nKPX abreve Aacute -253\nKPX abreve Ebreve -73\nKPX abreve Hbar -339\nKPX abreve Idot -73\nKPX abreve lacute -319\n\nKPX Edotaccent seven -92\nKPX Edotaccent less -188\nKPX Edotaccent H -102\nKPX Edotaccent R -102\nKPX Edotaccent X -112\nKPX Edotaccent backslash -131\nKPX Edotaccent ordfeminine -102\nKPX Edotaccent guillemotleft -102\nKPX Edotaccent logicalnot -102\nKPX Edotaccent sfthyphen -102\nKPX Edotaccent acute -102\nKPX Edotaccent mu -102\nKPX Edotaccent paragraph -102\nKPX Edotaccent periodcentered -102\nKPX Edotaccent cedilla -102\nKPX Edotaccent ordmasculine -102\nKPX Edotaccent guillemotright -112\nKPX Edotaccent onequarter -112\nKPX Edotaccent onehalf -112\nKPX Edotaccent threequarters -112\nKPX Edotaccent questiondown -131\nKPX Edotaccent Aacute -131\nKPX Edotaccent Yacute -102\nKPX Edotaccent ebreve -102\nKPX Edotaccent Hbar -92\nKPX Edotaccent dotlessi -112\nKPX Edotaccent lacute -188\n\n\nKPX Ecaron seven -92\nKPX Ecaron less -188\nKPX Ecaron H -102\nKPX Ecaron R -102\nKPX Ecaron X -112\nKPX Ecaron backslash -131\nKPX Ecaron ordfeminine -102\nKPX Ecaron guillemotleft -102\nKPX Ecaron logicalnot -102\nKPX Ecaron sfthyphen -102\nKPX Ecaron acute -102\nKPX Ecaron mu -102\nKPX Ecaron paragraph -102\nKPX Ecaron periodcentered -102\nKPX Ecaron cedilla -102\nKPX Ecaron ordmasculine -102\nKPX Ecaron guillemotright -112\nKPX Ecaron onequarter -112\nKPX Ecaron onehalf -112\nKPX Ecaron threequarters -112\nKPX Ecaron questiondown -131\nKPX Ecaron Aacute -131\nKPX Ecaron Yacute -102\nKPX Ecaron ebreve -102\nKPX Ecaron Hbar -92\nKPX Ecaron dotlessi -112\nKPX Ecaron lacute -188\n\n\nKPX Gdotaccent six -73\nKPX Gdotaccent Gdotaccent -73\nKPX Gdotaccent Gcommaaccent -73\n\nKPX Gcommaaccent six -73\nKPX Gcommaaccent Gdotaccent -73\nKPX Gcommaaccent Gcommaaccent -73\n\nKPX Hbar dollar -159\nKPX Hbar seven 47\nKPX Hbar D -243\nKPX Hbar F -264\nKPX Hbar H -264\nKPX Hbar R -264\nKPX Hbar U -225\nKPX Hbar V -243\nKPX Hbar X -264\nKPX Hbar Z -282\nKPX Hbar backslash -339\nKPX Hbar cent -243\nKPX Hbar sterling -243\nKPX Hbar currency -243\nKPX Hbar yen -243\nKPX Hbar brokenbar -243\nKPX Hbar section -243\nKPX Hbar dieresis -243\nKPX Hbar copyright -264\nKPX Hbar ordfeminine -264\nKPX Hbar guillemotleft -264\nKPX Hbar logicalnot -264\nKPX Hbar sfthyphen -264\nKPX Hbar acute -264\nKPX Hbar mu -264\nKPX Hbar paragraph -264\nKPX Hbar periodcentered -264\nKPX Hbar cedilla -264\nKPX Hbar ordmasculine -264\nKPX Hbar guillemotright -264\nKPX Hbar onequarter -264\nKPX Hbar onehalf -264\nKPX Hbar threequarters -264\nKPX Hbar questiondown -339\nKPX Hbar Aacute -339\nKPX Hbar Eacute -264\nKPX Hbar Idieresis -264\nKPX Hbar Yacute -264\nKPX Hbar ebreve -264\nKPX Hbar edotaccent -225\nKPX Hbar ecaron -225\nKPX Hbar gdotaccent -243\nKPX Hbar gcommaaccent -243\nKPX Hbar Hbar 47\nKPX Hbar dotlessi -264\n\nKPX hbar Hbar -112\n\nKPX Idot dollar -92\nKPX Idot Idot -92\n\nKPX lacute dollar -196\nKPX lacute ampersand -73\nKPX lacute two -73\nKPX lacute D -243\nKPX lacute H -264\nKPX lacute R -264\nKPX lacute X -225\nKPX lacute cent -243\nKPX lacute sterling -243\nKPX lacute currency -243\nKPX lacute yen -243\nKPX lacute brokenbar -243\nKPX lacute section -243\nKPX lacute dieresis -243\nKPX lacute ordfeminine -264\nKPX lacute guillemotleft -264\nKPX lacute logicalnot -264\nKPX lacute sfthyphen -264\nKPX lacute acute -264\nKPX lacute mu -264\nKPX lacute paragraph -264\nKPX lacute periodcentered -264\nKPX lacute cedilla -264\nKPX lacute ordmasculine -264\nKPX lacute guillemotright -225\nKPX lacute onequarter -225\nKPX lacute onehalf -225\nKPX lacute threequarters -225\nKPX lacute Egrave -73\nKPX lacute Icircumflex -73\nKPX lacute Yacute -264\nKPX lacute Ebreve -120\nKPX lacute ebreve -264\nKPX lacute dotlessi -225\n\n\nKPX uni027D dollar -272\nKPX uni027D hyphen -92\nKPX uni027D nine 38\nKPX uni027D less 75\nKPX uni027D lacute 75\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSans-Oblique.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Oblique\nUniqueID DejaVu Sans Oblique\nFullName DejaVu Sans Oblique\nVersion Version 2.37\nPostScriptName DejaVuSans-Oblique\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Oblique\nWeight Medium\nItalicAngle -11\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1016 -350 1659 1068\nStartCharMetrics 5355\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 401 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 780 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 361 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 531 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 684 ; N A ; G 36\nU 66 ; WX 686 ; N B ; G 37\nU 67 ; WX 698 ; N C ; G 38\nU 68 ; WX 770 ; N D ; G 39\nU 69 ; WX 632 ; N E ; G 40\nU 70 ; WX 575 ; N F ; G 41\nU 71 ; WX 775 ; N G ; G 42\nU 72 ; WX 752 ; N H ; G 43\nU 73 ; WX 295 ; N I ; G 44\nU 74 ; WX 295 ; N J ; G 45\nU 75 ; WX 656 ; N K ; G 46\nU 76 ; WX 557 ; N L ; G 47\nU 77 ; WX 863 ; N M ; G 48\nU 78 ; WX 748 ; N N ; G 49\nU 79 ; WX 787 ; N O ; G 50\nU 80 ; WX 603 ; N P ; G 51\nU 81 ; WX 787 ; N Q ; G 52\nU 82 ; WX 695 ; N R ; G 53\nU 83 ; WX 635 ; N S ; G 54\nU 84 ; WX 611 ; N T ; G 55\nU 85 ; WX 732 ; N U ; G 56\nU 86 ; WX 684 ; N V ; G 57\nU 87 ; WX 989 ; N W ; G 58\nU 88 ; WX 685 ; N X ; G 59\nU 89 ; WX 611 ; N Y ; G 60\nU 90 ; WX 685 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 613 ; N a ; G 68\nU 98 ; WX 635 ; N b ; G 69\nU 99 ; WX 550 ; N c ; G 70\nU 100 ; WX 635 ; N d ; G 71\nU 101 ; WX 615 ; N e ; G 72\nU 102 ; WX 352 ; N f ; G 73\nU 103 ; WX 635 ; N g ; G 74\nU 104 ; WX 634 ; N h ; G 75\nU 105 ; WX 278 ; N i ; G 76\nU 106 ; WX 278 ; N j ; G 77\nU 107 ; WX 579 ; N k ; G 78\nU 108 ; WX 278 ; N l ; G 79\nU 109 ; WX 974 ; N m ; G 80\nU 110 ; WX 634 ; N n ; G 81\nU 111 ; WX 612 ; N o ; G 82\nU 112 ; WX 635 ; N p ; G 83\nU 113 ; WX 635 ; N q ; G 84\nU 114 ; WX 411 ; N r ; G 85\nU 115 ; WX 521 ; N s ; G 86\nU 116 ; WX 392 ; N t ; G 87\nU 117 ; WX 634 ; N u ; G 88\nU 118 ; WX 592 ; N v ; G 89\nU 119 ; WX 818 ; N w ; G 90\nU 120 ; WX 592 ; N x ; G 91\nU 121 ; WX 592 ; N y ; G 92\nU 122 ; WX 525 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 401 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 471 ; N ordfeminine ; G 108\nU 171 ; WX 617 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 361 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 636 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 471 ; N ordmasculine ; G 124\nU 187 ; WX 617 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 531 ; N questiondown ; G 129\nU 192 ; WX 684 ; N Agrave ; G 130\nU 193 ; WX 684 ; N Aacute ; G 131\nU 194 ; WX 684 ; N Acircumflex ; G 132\nU 195 ; WX 684 ; N Atilde ; G 133\nU 196 ; WX 684 ; N Adieresis ; G 134\nU 197 ; WX 684 ; N Aring ; G 135\nU 198 ; WX 974 ; N AE ; G 136\nU 199 ; WX 698 ; N Ccedilla ; G 137\nU 200 ; WX 632 ; N Egrave ; G 138\nU 201 ; WX 632 ; N Eacute ; G 139\nU 202 ; WX 632 ; N Ecircumflex ; G 140\nU 203 ; WX 632 ; N Edieresis ; G 141\nU 204 ; WX 295 ; N Igrave ; G 142\nU 205 ; WX 295 ; N Iacute ; G 143\nU 206 ; WX 295 ; N Icircumflex ; G 144\nU 207 ; WX 295 ; N Idieresis ; G 145\nU 208 ; WX 775 ; N Eth ; G 146\nU 209 ; WX 748 ; N Ntilde ; G 147\nU 210 ; WX 787 ; N Ograve ; G 148\nU 211 ; WX 787 ; N Oacute ; G 149\nU 212 ; WX 787 ; N Ocircumflex ; G 150\nU 213 ; WX 787 ; N Otilde ; G 151\nU 214 ; WX 787 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 787 ; N Oslash ; G 154\nU 217 ; WX 732 ; N Ugrave ; G 155\nU 218 ; WX 732 ; N Uacute ; G 156\nU 219 ; WX 732 ; N Ucircumflex ; G 157\nU 220 ; WX 732 ; N Udieresis ; G 158\nU 221 ; WX 611 ; N Yacute ; G 159\nU 222 ; WX 608 ; N Thorn ; G 160\nU 223 ; WX 630 ; N germandbls ; G 161\nU 224 ; WX 613 ; N agrave ; G 162\nU 225 ; WX 613 ; N aacute ; G 163\nU 226 ; WX 613 ; N acircumflex ; G 164\nU 227 ; WX 613 ; N atilde ; G 165\nU 228 ; WX 613 ; N adieresis ; G 166\nU 229 ; WX 613 ; N aring ; G 167\nU 230 ; WX 995 ; N ae ; G 168\nU 231 ; WX 550 ; N ccedilla ; G 169\nU 232 ; WX 615 ; N egrave ; G 170\nU 233 ; WX 615 ; N eacute ; G 171\nU 234 ; WX 615 ; N ecircumflex ; G 172\nU 235 ; WX 615 ; N edieresis ; G 173\nU 236 ; WX 278 ; N igrave ; G 174\nU 237 ; WX 278 ; N iacute ; G 175\nU 238 ; WX 278 ; N icircumflex ; G 176\nU 239 ; WX 278 ; N idieresis ; G 177\nU 240 ; WX 612 ; N eth ; G 178\nU 241 ; WX 634 ; N ntilde ; G 179\nU 242 ; WX 612 ; N ograve ; G 180\nU 243 ; WX 612 ; N oacute ; G 181\nU 244 ; WX 612 ; N ocircumflex ; G 182\nU 245 ; WX 612 ; N otilde ; G 183\nU 246 ; WX 612 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 612 ; N oslash ; G 186\nU 249 ; WX 634 ; N ugrave ; G 187\nU 250 ; WX 634 ; N uacute ; G 188\nU 251 ; WX 634 ; N ucircumflex ; G 189\nU 252 ; WX 634 ; N udieresis ; G 190\nU 253 ; WX 592 ; N yacute ; G 191\nU 254 ; WX 635 ; N thorn ; G 192\nU 255 ; WX 592 ; N ydieresis ; G 193\nU 256 ; WX 684 ; N Amacron ; G 194\nU 257 ; WX 613 ; N amacron ; G 195\nU 258 ; WX 684 ; N Abreve ; G 196\nU 259 ; WX 613 ; N abreve ; G 197\nU 260 ; WX 684 ; N Aogonek ; G 198\nU 261 ; WX 613 ; N aogonek ; G 199\nU 262 ; WX 698 ; N Cacute ; G 200\nU 263 ; WX 550 ; N cacute ; G 201\nU 264 ; WX 698 ; N Ccircumflex ; G 202\nU 265 ; WX 550 ; N ccircumflex ; G 203\nU 266 ; WX 698 ; N Cdotaccent ; G 204\nU 267 ; WX 550 ; N cdotaccent ; G 205\nU 268 ; WX 698 ; N Ccaron ; G 206\nU 269 ; WX 550 ; N ccaron ; G 207\nU 270 ; WX 770 ; N Dcaron ; G 208\nU 271 ; WX 635 ; N dcaron ; G 209\nU 272 ; WX 775 ; N Dcroat ; G 210\nU 273 ; WX 635 ; N dmacron ; G 211\nU 274 ; WX 632 ; N Emacron ; G 212\nU 275 ; WX 615 ; N emacron ; G 213\nU 276 ; WX 632 ; N Ebreve ; G 214\nU 277 ; WX 615 ; N ebreve ; G 215\nU 278 ; WX 632 ; N Edotaccent ; G 216\nU 279 ; WX 615 ; N edotaccent ; G 217\nU 280 ; WX 632 ; N Eogonek ; G 218\nU 281 ; WX 615 ; N eogonek ; G 219\nU 282 ; WX 632 ; N Ecaron ; G 220\nU 283 ; WX 615 ; N ecaron ; G 221\nU 284 ; WX 775 ; N Gcircumflex ; G 222\nU 285 ; WX 635 ; N gcircumflex ; G 223\nU 286 ; WX 775 ; N Gbreve ; G 224\nU 287 ; WX 635 ; N gbreve ; G 225\nU 288 ; WX 775 ; N Gdotaccent ; G 226\nU 289 ; WX 635 ; N gdotaccent ; G 227\nU 290 ; WX 775 ; N Gcommaaccent ; G 228\nU 291 ; WX 635 ; N gcommaaccent ; G 229\nU 292 ; WX 752 ; N Hcircumflex ; G 230\nU 293 ; WX 634 ; N hcircumflex ; G 231\nU 294 ; WX 916 ; N Hbar ; G 232\nU 295 ; WX 695 ; N hbar ; G 233\nU 296 ; WX 295 ; N Itilde ; G 234\nU 297 ; WX 278 ; N itilde ; G 235\nU 298 ; WX 295 ; N Imacron ; G 236\nU 299 ; WX 278 ; N imacron ; G 237\nU 300 ; WX 295 ; N Ibreve ; G 238\nU 301 ; WX 278 ; N ibreve ; G 239\nU 302 ; WX 295 ; N Iogonek ; G 240\nU 303 ; WX 278 ; N iogonek ; G 241\nU 304 ; WX 295 ; N Idot ; G 242\nU 305 ; WX 278 ; N dotlessi ; G 243\nU 306 ; WX 590 ; N IJ ; G 244\nU 307 ; WX 556 ; N ij ; G 245\nU 308 ; WX 295 ; N Jcircumflex ; G 246\nU 309 ; WX 278 ; N jcircumflex ; G 247\nU 310 ; WX 656 ; N Kcommaaccent ; G 248\nU 311 ; WX 579 ; N kcommaaccent ; G 249\nU 312 ; WX 579 ; N kgreenlandic ; G 250\nU 313 ; WX 557 ; N Lacute ; G 251\nU 314 ; WX 278 ; N lacute ; G 252\nU 315 ; WX 557 ; N Lcommaaccent ; G 253\nU 316 ; WX 278 ; N lcommaaccent ; G 254\nU 317 ; WX 557 ; N Lcaron ; G 255\nU 318 ; WX 278 ; N lcaron ; G 256\nU 319 ; WX 557 ; N Ldot ; G 257\nU 320 ; WX 278 ; N ldot ; G 258\nU 321 ; WX 562 ; N Lslash ; G 259\nU 322 ; WX 287 ; N lslash ; G 260\nU 323 ; WX 748 ; N Nacute ; G 261\nU 324 ; WX 634 ; N nacute ; G 262\nU 325 ; WX 748 ; N Ncommaaccent ; G 263\nU 326 ; WX 634 ; N ncommaaccent ; G 264\nU 327 ; WX 748 ; N Ncaron ; G 265\nU 328 ; WX 634 ; N ncaron ; G 266\nU 329 ; WX 813 ; N napostrophe ; G 267\nU 330 ; WX 748 ; N Eng ; G 268\nU 331 ; WX 634 ; N eng ; G 269\nU 332 ; WX 787 ; N Omacron ; G 270\nU 333 ; WX 612 ; N omacron ; G 271\nU 334 ; WX 787 ; N Obreve ; G 272\nU 335 ; WX 612 ; N obreve ; G 273\nU 336 ; WX 787 ; N Ohungarumlaut ; G 274\nU 337 ; WX 612 ; N ohungarumlaut ; G 275\nU 338 ; WX 1070 ; N OE ; G 276\nU 339 ; WX 1028 ; N oe ; G 277\nU 340 ; WX 695 ; N Racute ; G 278\nU 341 ; WX 411 ; N racute ; G 279\nU 342 ; WX 695 ; N Rcommaaccent ; G 280\nU 343 ; WX 411 ; N rcommaaccent ; G 281\nU 344 ; WX 695 ; N Rcaron ; G 282\nU 345 ; WX 411 ; N rcaron ; G 283\nU 346 ; WX 635 ; N Sacute ; G 284\nU 347 ; WX 521 ; N sacute ; G 285\nU 348 ; WX 635 ; N Scircumflex ; G 286\nU 349 ; WX 521 ; N scircumflex ; G 287\nU 350 ; WX 635 ; N Scedilla ; G 288\nU 351 ; WX 521 ; N scedilla ; G 289\nU 352 ; WX 635 ; N Scaron ; G 290\nU 353 ; WX 521 ; N scaron ; G 291\nU 354 ; WX 611 ; N Tcommaaccent ; G 292\nU 355 ; WX 392 ; N tcommaaccent ; G 293\nU 356 ; WX 611 ; N Tcaron ; G 294\nU 357 ; WX 392 ; N tcaron ; G 295\nU 358 ; WX 611 ; N Tbar ; G 296\nU 359 ; WX 392 ; N tbar ; G 297\nU 360 ; WX 732 ; N Utilde ; G 298\nU 361 ; WX 634 ; N utilde ; G 299\nU 362 ; WX 732 ; N Umacron ; G 300\nU 363 ; WX 634 ; N umacron ; G 301\nU 364 ; WX 732 ; N Ubreve ; G 302\nU 365 ; WX 634 ; N ubreve ; G 303\nU 366 ; WX 732 ; N Uring ; G 304\nU 367 ; WX 634 ; N uring ; G 305\nU 368 ; WX 732 ; N Uhungarumlaut ; G 306\nU 369 ; WX 634 ; N uhungarumlaut ; G 307\nU 370 ; WX 732 ; N Uogonek ; G 308\nU 371 ; WX 634 ; N uogonek ; G 309\nU 372 ; WX 989 ; N Wcircumflex ; G 310\nU 373 ; WX 818 ; N wcircumflex ; G 311\nU 374 ; WX 611 ; N Ycircumflex ; G 312\nU 375 ; WX 592 ; N ycircumflex ; G 313\nU 376 ; WX 611 ; N Ydieresis ; G 314\nU 377 ; WX 685 ; N Zacute ; G 315\nU 378 ; WX 525 ; N zacute ; G 316\nU 379 ; WX 685 ; N Zdotaccent ; G 317\nU 380 ; WX 525 ; N zdotaccent ; G 318\nU 381 ; WX 685 ; N Zcaron ; G 319\nU 382 ; WX 525 ; N zcaron ; G 320\nU 383 ; WX 352 ; N longs ; G 321\nU 384 ; WX 635 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 686 ; N uni0182 ; G 324\nU 387 ; WX 635 ; N uni0183 ; G 325\nU 388 ; WX 686 ; N uni0184 ; G 326\nU 389 ; WX 635 ; N uni0185 ; G 327\nU 390 ; WX 703 ; N uni0186 ; G 328\nU 391 ; WX 698 ; N uni0187 ; G 329\nU 392 ; WX 550 ; N uni0188 ; G 330\nU 393 ; WX 775 ; N uni0189 ; G 331\nU 394 ; WX 819 ; N uni018A ; G 332\nU 395 ; WX 686 ; N uni018B ; G 333\nU 396 ; WX 635 ; N uni018C ; G 334\nU 397 ; WX 612 ; N uni018D ; G 335\nU 398 ; WX 632 ; N uni018E ; G 336\nU 399 ; WX 787 ; N uni018F ; G 337\nU 400 ; WX 614 ; N uni0190 ; G 338\nU 401 ; WX 575 ; N uni0191 ; G 339\nU 402 ; WX 352 ; N florin ; G 340\nU 403 ; WX 775 ; N uni0193 ; G 341\nU 404 ; WX 687 ; N uni0194 ; G 342\nU 405 ; WX 984 ; N uni0195 ; G 343\nU 406 ; WX 354 ; N uni0196 ; G 344\nU 407 ; WX 295 ; N uni0197 ; G 345\nU 408 ; WX 746 ; N uni0198 ; G 346\nU 409 ; WX 579 ; N uni0199 ; G 347\nU 410 ; WX 278 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 974 ; N uni019C ; G 350\nU 413 ; WX 748 ; N uni019D ; G 351\nU 414 ; WX 634 ; N uni019E ; G 352\nU 415 ; WX 787 ; N uni019F ; G 353\nU 416 ; WX 913 ; N Ohorn ; G 354\nU 417 ; WX 612 ; N ohorn ; G 355\nU 418 ; WX 938 ; N uni01A2 ; G 356\nU 419 ; WX 737 ; N uni01A3 ; G 357\nU 420 ; WX 652 ; N uni01A4 ; G 358\nU 421 ; WX 635 ; N uni01A5 ; G 359\nU 422 ; WX 695 ; N uni01A6 ; G 360\nU 423 ; WX 635 ; N uni01A7 ; G 361\nU 424 ; WX 521 ; N uni01A8 ; G 362\nU 425 ; WX 632 ; N uni01A9 ; G 363\nU 426 ; WX 336 ; N uni01AA ; G 364\nU 427 ; WX 392 ; N uni01AB ; G 365\nU 428 ; WX 611 ; N uni01AC ; G 366\nU 429 ; WX 392 ; N uni01AD ; G 367\nU 430 ; WX 611 ; N uni01AE ; G 368\nU 431 ; WX 838 ; N Uhorn ; G 369\nU 432 ; WX 634 ; N uhorn ; G 370\nU 433 ; WX 764 ; N uni01B1 ; G 371\nU 434 ; WX 721 ; N uni01B2 ; G 372\nU 435 ; WX 744 ; N uni01B3 ; G 373\nU 436 ; WX 730 ; N uni01B4 ; G 374\nU 437 ; WX 685 ; N uni01B5 ; G 375\nU 438 ; WX 525 ; N uni01B6 ; G 376\nU 439 ; WX 666 ; N uni01B7 ; G 377\nU 440 ; WX 666 ; N uni01B8 ; G 378\nU 441 ; WX 578 ; N uni01B9 ; G 379\nU 442 ; WX 525 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 666 ; N uni01BC ; G 382\nU 445 ; WX 578 ; N uni01BD ; G 383\nU 446 ; WX 510 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1455 ; N uni01C4 ; G 390\nU 453 ; WX 1295 ; N uni01C5 ; G 391\nU 454 ; WX 1160 ; N uni01C6 ; G 392\nU 455 ; WX 852 ; N uni01C7 ; G 393\nU 456 ; WX 835 ; N uni01C8 ; G 394\nU 457 ; WX 556 ; N uni01C9 ; G 395\nU 458 ; WX 1043 ; N uni01CA ; G 396\nU 459 ; WX 1026 ; N uni01CB ; G 397\nU 460 ; WX 912 ; N uni01CC ; G 398\nU 461 ; WX 684 ; N uni01CD ; G 399\nU 462 ; WX 613 ; N uni01CE ; G 400\nU 463 ; WX 295 ; N uni01CF ; G 401\nU 464 ; WX 278 ; N uni01D0 ; G 402\nU 465 ; WX 787 ; N uni01D1 ; G 403\nU 466 ; WX 612 ; N uni01D2 ; G 404\nU 467 ; WX 732 ; N uni01D3 ; G 405\nU 468 ; WX 634 ; N uni01D4 ; G 406\nU 469 ; WX 732 ; N uni01D5 ; G 407\nU 470 ; WX 634 ; N uni01D6 ; G 408\nU 471 ; WX 732 ; N uni01D7 ; G 409\nU 472 ; WX 634 ; N uni01D8 ; G 410\nU 473 ; WX 732 ; N uni01D9 ; G 411\nU 474 ; WX 634 ; N uni01DA ; G 412\nU 475 ; WX 732 ; N uni01DB ; G 413\nU 476 ; WX 634 ; N uni01DC ; G 414\nU 477 ; WX 615 ; N uni01DD ; G 415\nU 478 ; WX 684 ; N uni01DE ; G 416\nU 479 ; WX 613 ; N uni01DF ; G 417\nU 480 ; WX 684 ; N uni01E0 ; G 418\nU 481 ; WX 613 ; N uni01E1 ; G 419\nU 482 ; WX 974 ; N uni01E2 ; G 420\nU 483 ; WX 995 ; N uni01E3 ; G 421\nU 484 ; WX 775 ; N uni01E4 ; G 422\nU 485 ; WX 635 ; N uni01E5 ; G 423\nU 486 ; WX 775 ; N Gcaron ; G 424\nU 487 ; WX 635 ; N gcaron ; G 425\nU 488 ; WX 656 ; N uni01E8 ; G 426\nU 489 ; WX 579 ; N uni01E9 ; G 427\nU 490 ; WX 787 ; N uni01EA ; G 428\nU 491 ; WX 612 ; N uni01EB ; G 429\nU 492 ; WX 787 ; N uni01EC ; G 430\nU 493 ; WX 612 ; N uni01ED ; G 431\nU 494 ; WX 666 ; N uni01EE ; G 432\nU 495 ; WX 525 ; N uni01EF ; G 433\nU 496 ; WX 278 ; N uni01F0 ; G 434\nU 497 ; WX 1455 ; N uni01F1 ; G 435\nU 498 ; WX 1295 ; N uni01F2 ; G 436\nU 499 ; WX 1160 ; N uni01F3 ; G 437\nU 500 ; WX 775 ; N uni01F4 ; G 438\nU 501 ; WX 635 ; N uni01F5 ; G 439\nU 502 ; WX 1113 ; N uni01F6 ; G 440\nU 503 ; WX 682 ; N uni01F7 ; G 441\nU 504 ; WX 748 ; N uni01F8 ; G 442\nU 505 ; WX 634 ; N uni01F9 ; G 443\nU 506 ; WX 684 ; N Aringacute ; G 444\nU 507 ; WX 613 ; N aringacute ; G 445\nU 508 ; WX 974 ; N AEacute ; G 446\nU 509 ; WX 995 ; N aeacute ; G 447\nU 510 ; WX 787 ; N Oslashacute ; G 448\nU 511 ; WX 612 ; N oslashacute ; G 449\nU 512 ; WX 684 ; N uni0200 ; G 450\nU 513 ; WX 613 ; N uni0201 ; G 451\nU 514 ; WX 684 ; N uni0202 ; G 452\nU 515 ; WX 613 ; N uni0203 ; G 453\nU 516 ; WX 632 ; N uni0204 ; G 454\nU 517 ; WX 615 ; N uni0205 ; G 455\nU 518 ; WX 632 ; N uni0206 ; G 456\nU 519 ; WX 615 ; N uni0207 ; G 457\nU 520 ; WX 295 ; N uni0208 ; G 458\nU 521 ; WX 278 ; N uni0209 ; G 459\nU 522 ; WX 295 ; N uni020A ; G 460\nU 523 ; WX 278 ; N uni020B ; G 461\nU 524 ; WX 787 ; N uni020C ; G 462\nU 525 ; WX 612 ; N uni020D ; G 463\nU 526 ; WX 787 ; N uni020E ; G 464\nU 527 ; WX 612 ; N uni020F ; G 465\nU 528 ; WX 695 ; N uni0210 ; G 466\nU 529 ; WX 411 ; N uni0211 ; G 467\nU 530 ; WX 695 ; N uni0212 ; G 468\nU 531 ; WX 411 ; N uni0213 ; G 469\nU 532 ; WX 732 ; N uni0214 ; G 470\nU 533 ; WX 634 ; N uni0215 ; G 471\nU 534 ; WX 732 ; N uni0216 ; G 472\nU 535 ; WX 634 ; N uni0217 ; G 473\nU 536 ; WX 635 ; N Scommaaccent ; G 474\nU 537 ; WX 521 ; N scommaaccent ; G 475\nU 538 ; WX 611 ; N uni021A ; G 476\nU 539 ; WX 392 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 752 ; N uni021E ; G 480\nU 543 ; WX 634 ; N uni021F ; G 481\nU 544 ; WX 735 ; N uni0220 ; G 482\nU 545 ; WX 838 ; N uni0221 ; G 483\nU 546 ; WX 698 ; N uni0222 ; G 484\nU 547 ; WX 610 ; N uni0223 ; G 485\nU 548 ; WX 685 ; N uni0224 ; G 486\nU 549 ; WX 525 ; N uni0225 ; G 487\nU 550 ; WX 684 ; N uni0226 ; G 488\nU 551 ; WX 613 ; N uni0227 ; G 489\nU 552 ; WX 632 ; N uni0228 ; G 490\nU 553 ; WX 615 ; N uni0229 ; G 491\nU 554 ; WX 787 ; N uni022A ; G 492\nU 555 ; WX 612 ; N uni022B ; G 493\nU 556 ; WX 787 ; N uni022C ; G 494\nU 557 ; WX 612 ; N uni022D ; G 495\nU 558 ; WX 787 ; N uni022E ; G 496\nU 559 ; WX 612 ; N uni022F ; G 497\nU 560 ; WX 787 ; N uni0230 ; G 498\nU 561 ; WX 612 ; N uni0231 ; G 499\nU 562 ; WX 611 ; N uni0232 ; G 500\nU 563 ; WX 592 ; N uni0233 ; G 501\nU 564 ; WX 475 ; N uni0234 ; G 502\nU 565 ; WX 843 ; N uni0235 ; G 503\nU 566 ; WX 477 ; N uni0236 ; G 504\nU 567 ; WX 278 ; N dotlessj ; G 505\nU 568 ; WX 998 ; N uni0238 ; G 506\nU 569 ; WX 998 ; N uni0239 ; G 507\nU 570 ; WX 684 ; N uni023A ; G 508\nU 571 ; WX 698 ; N uni023B ; G 509\nU 572 ; WX 550 ; N uni023C ; G 510\nU 573 ; WX 557 ; N uni023D ; G 511\nU 574 ; WX 611 ; N uni023E ; G 512\nU 575 ; WX 521 ; N uni023F ; G 513\nU 576 ; WX 525 ; N uni0240 ; G 514\nU 577 ; WX 603 ; N uni0241 ; G 515\nU 578 ; WX 479 ; N uni0242 ; G 516\nU 579 ; WX 686 ; N uni0243 ; G 517\nU 580 ; WX 732 ; N uni0244 ; G 518\nU 581 ; WX 684 ; N uni0245 ; G 519\nU 582 ; WX 632 ; N uni0246 ; G 520\nU 583 ; WX 615 ; N uni0247 ; G 521\nU 584 ; WX 295 ; N uni0248 ; G 522\nU 585 ; WX 278 ; N uni0249 ; G 523\nU 586 ; WX 781 ; N uni024A ; G 524\nU 587 ; WX 635 ; N uni024B ; G 525\nU 588 ; WX 695 ; N uni024C ; G 526\nU 589 ; WX 411 ; N uni024D ; G 527\nU 590 ; WX 611 ; N uni024E ; G 528\nU 591 ; WX 592 ; N uni024F ; G 529\nU 592 ; WX 613 ; N uni0250 ; G 530\nU 593 ; WX 635 ; N uni0251 ; G 531\nU 594 ; WX 635 ; N uni0252 ; G 532\nU 595 ; WX 635 ; N uni0253 ; G 533\nU 596 ; WX 550 ; N uni0254 ; G 534\nU 597 ; WX 550 ; N uni0255 ; G 535\nU 598 ; WX 635 ; N uni0256 ; G 536\nU 599 ; WX 727 ; N uni0257 ; G 537\nU 600 ; WX 615 ; N uni0258 ; G 538\nU 601 ; WX 615 ; N uni0259 ; G 539\nU 602 ; WX 844 ; N uni025A ; G 540\nU 603 ; WX 545 ; N uni025B ; G 541\nU 604 ; WX 545 ; N uni025C ; G 542\nU 605 ; WX 775 ; N uni025D ; G 543\nU 606 ; WX 664 ; N uni025E ; G 544\nU 607 ; WX 326 ; N uni025F ; G 545\nU 608 ; WX 696 ; N uni0260 ; G 546\nU 609 ; WX 635 ; N uni0261 ; G 547\nU 610 ; WX 629 ; N uni0262 ; G 548\nU 611 ; WX 596 ; N uni0263 ; G 549\nU 612 ; WX 596 ; N uni0264 ; G 550\nU 613 ; WX 634 ; N uni0265 ; G 551\nU 614 ; WX 634 ; N uni0266 ; G 552\nU 615 ; WX 634 ; N uni0267 ; G 553\nU 616 ; WX 372 ; N uni0268 ; G 554\nU 617 ; WX 387 ; N uni0269 ; G 555\nU 618 ; WX 372 ; N uni026A ; G 556\nU 619 ; WX 396 ; N uni026B ; G 557\nU 620 ; WX 487 ; N uni026C ; G 558\nU 621 ; WX 278 ; N uni026D ; G 559\nU 622 ; WX 706 ; N uni026E ; G 560\nU 623 ; WX 974 ; N uni026F ; G 561\nU 624 ; WX 974 ; N uni0270 ; G 562\nU 625 ; WX 974 ; N uni0271 ; G 563\nU 626 ; WX 646 ; N uni0272 ; G 564\nU 627 ; WX 642 ; N uni0273 ; G 565\nU 628 ; WX 634 ; N uni0274 ; G 566\nU 629 ; WX 612 ; N uni0275 ; G 567\nU 630 ; WX 858 ; N uni0276 ; G 568\nU 631 ; WX 728 ; N uni0277 ; G 569\nU 632 ; WX 660 ; N uni0278 ; G 570\nU 633 ; WX 469 ; N uni0279 ; G 571\nU 634 ; WX 469 ; N uni027A ; G 572\nU 635 ; WX 469 ; N uni027B ; G 573\nU 636 ; WX 469 ; N uni027C ; G 574\nU 637 ; WX 469 ; N uni027D ; G 575\nU 638 ; WX 530 ; N uni027E ; G 576\nU 639 ; WX 530 ; N uni027F ; G 577\nU 640 ; WX 602 ; N uni0280 ; G 578\nU 641 ; WX 602 ; N uni0281 ; G 579\nU 642 ; WX 521 ; N uni0282 ; G 580\nU 643 ; WX 336 ; N uni0283 ; G 581\nU 644 ; WX 336 ; N uni0284 ; G 582\nU 645 ; WX 461 ; N uni0285 ; G 583\nU 646 ; WX 336 ; N uni0286 ; G 584\nU 647 ; WX 392 ; N uni0287 ; G 585\nU 648 ; WX 392 ; N uni0288 ; G 586\nU 649 ; WX 634 ; N uni0289 ; G 587\nU 650 ; WX 618 ; N uni028A ; G 588\nU 651 ; WX 598 ; N uni028B ; G 589\nU 652 ; WX 592 ; N uni028C ; G 590\nU 653 ; WX 818 ; N uni028D ; G 591\nU 654 ; WX 592 ; N uni028E ; G 592\nU 655 ; WX 611 ; N uni028F ; G 593\nU 656 ; WX 525 ; N uni0290 ; G 594\nU 657 ; WX 525 ; N uni0291 ; G 595\nU 658 ; WX 578 ; N uni0292 ; G 596\nU 659 ; WX 578 ; N uni0293 ; G 597\nU 660 ; WX 510 ; N uni0294 ; G 598\nU 661 ; WX 510 ; N uni0295 ; G 599\nU 662 ; WX 510 ; N uni0296 ; G 600\nU 663 ; WX 510 ; N uni0297 ; G 601\nU 664 ; WX 787 ; N uni0298 ; G 602\nU 665 ; WX 580 ; N uni0299 ; G 603\nU 666 ; WX 664 ; N uni029A ; G 604\nU 667 ; WX 708 ; N uni029B ; G 605\nU 668 ; WX 654 ; N uni029C ; G 606\nU 669 ; WX 292 ; N uni029D ; G 607\nU 670 ; WX 667 ; N uni029E ; G 608\nU 671 ; WX 507 ; N uni029F ; G 609\nU 672 ; WX 727 ; N uni02A0 ; G 610\nU 673 ; WX 510 ; N uni02A1 ; G 611\nU 674 ; WX 510 ; N uni02A2 ; G 612\nU 675 ; WX 1014 ; N uni02A3 ; G 613\nU 676 ; WX 1058 ; N uni02A4 ; G 614\nU 677 ; WX 1013 ; N uni02A5 ; G 615\nU 678 ; WX 830 ; N uni02A6 ; G 616\nU 679 ; WX 610 ; N uni02A7 ; G 617\nU 680 ; WX 778 ; N uni02A8 ; G 618\nU 681 ; WX 848 ; N uni02A9 ; G 619\nU 682 ; WX 706 ; N uni02AA ; G 620\nU 683 ; WX 654 ; N uni02AB ; G 621\nU 684 ; WX 515 ; N uni02AC ; G 622\nU 685 ; WX 515 ; N uni02AD ; G 623\nU 686 ; WX 570 ; N uni02AE ; G 624\nU 687 ; WX 664 ; N uni02AF ; G 625\nU 688 ; WX 399 ; N uni02B0 ; G 626\nU 689 ; WX 399 ; N uni02B1 ; G 627\nU 690 ; WX 175 ; N uni02B2 ; G 628\nU 691 ; WX 259 ; N uni02B3 ; G 629\nU 692 ; WX 295 ; N uni02B4 ; G 630\nU 693 ; WX 296 ; N uni02B5 ; G 631\nU 694 ; WX 379 ; N uni02B6 ; G 632\nU 695 ; WX 515 ; N uni02B7 ; G 633\nU 696 ; WX 373 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 370 ; N uni02C0 ; G 642\nU 705 ; WX 370 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 275 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 275 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 307 ; N uni02D2 ; G 660\nU 723 ; WX 307 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 390 ; N uni02D6 ; G 664\nU 727 ; WX 317 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 315 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 426 ; N uni02E0 ; G 674\nU 737 ; WX 166 ; N uni02E1 ; G 675\nU 738 ; WX 373 ; N uni02E2 ; G 676\nU 739 ; WX 444 ; N uni02E3 ; G 677\nU 740 ; WX 370 ; N uni02E4 ; G 678\nU 741 ; WX 493 ; N uni02E5 ; G 679\nU 742 ; WX 493 ; N uni02E6 ; G 680\nU 743 ; WX 493 ; N uni02E7 ; G 681\nU 744 ; WX 493 ; N uni02E8 ; G 682\nU 745 ; WX 493 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 518 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 654 ; N uni0370 ; G 782\nU 881 ; WX 568 ; N uni0371 ; G 783\nU 882 ; WX 862 ; N uni0372 ; G 784\nU 883 ; WX 647 ; N uni0373 ; G 785\nU 884 ; WX 278 ; N uni0374 ; G 786\nU 885 ; WX 278 ; N uni0375 ; G 787\nU 886 ; WX 748 ; N uni0376 ; G 788\nU 887 ; WX 650 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 549 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 337 ; N uni037E ; G 794\nU 895 ; WX 295 ; N uni037F ; G 795\nU 900 ; WX 500 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 684 ; N Alphatonos ; G 798\nU 903 ; WX 318 ; N anoteleia ; G 799\nU 904 ; WX 767 ; N Epsilontonos ; G 800\nU 905 ; WX 903 ; N Etatonos ; G 801\nU 906 ; WX 435 ; N Iotatonos ; G 802\nU 908 ; WX 839 ; N Omicrontonos ; G 803\nU 910 ; WX 860 ; N Upsilontonos ; G 804\nU 911 ; WX 905 ; N Omegatonos ; G 805\nU 912 ; WX 338 ; N iotadieresistonos ; G 806\nU 913 ; WX 684 ; N Alpha ; G 807\nU 914 ; WX 686 ; N Beta ; G 808\nU 915 ; WX 557 ; N Gamma ; G 809\nU 916 ; WX 684 ; N uni0394 ; G 810\nU 917 ; WX 632 ; N Epsilon ; G 811\nU 918 ; WX 685 ; N Zeta ; G 812\nU 919 ; WX 752 ; N Eta ; G 813\nU 920 ; WX 787 ; N Theta ; G 814\nU 921 ; WX 295 ; N Iota ; G 815\nU 922 ; WX 656 ; N Kappa ; G 816\nU 923 ; WX 684 ; N Lambda ; G 817\nU 924 ; WX 863 ; N Mu ; G 818\nU 925 ; WX 748 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 787 ; N Omicron ; G 821\nU 928 ; WX 752 ; N Pi ; G 822\nU 929 ; WX 603 ; N Rho ; G 823\nU 931 ; WX 632 ; N Sigma ; G 824\nU 932 ; WX 611 ; N Tau ; G 825\nU 933 ; WX 611 ; N Upsilon ; G 826\nU 934 ; WX 787 ; N Phi ; G 827\nU 935 ; WX 685 ; N Chi ; G 828\nU 936 ; WX 787 ; N Psi ; G 829\nU 937 ; WX 764 ; N Omega ; G 830\nU 938 ; WX 295 ; N Iotadieresis ; G 831\nU 939 ; WX 611 ; N Upsilondieresis ; G 832\nU 940 ; WX 659 ; N alphatonos ; G 833\nU 941 ; WX 541 ; N epsilontonos ; G 834\nU 942 ; WX 634 ; N etatonos ; G 835\nU 943 ; WX 338 ; N iotatonos ; G 836\nU 944 ; WX 579 ; N upsilondieresistonos ; G 837\nU 945 ; WX 659 ; N alpha ; G 838\nU 946 ; WX 638 ; N beta ; G 839\nU 947 ; WX 592 ; N gamma ; G 840\nU 948 ; WX 612 ; N delta ; G 841\nU 949 ; WX 541 ; N epsilon ; G 842\nU 950 ; WX 544 ; N zeta ; G 843\nU 951 ; WX 634 ; N eta ; G 844\nU 952 ; WX 612 ; N theta ; G 845\nU 953 ; WX 338 ; N iota ; G 846\nU 954 ; WX 589 ; N kappa ; G 847\nU 955 ; WX 592 ; N lambda ; G 848\nU 956 ; WX 636 ; N uni03BC ; G 849\nU 957 ; WX 559 ; N nu ; G 850\nU 958 ; WX 558 ; N xi ; G 851\nU 959 ; WX 612 ; N omicron ; G 852\nU 960 ; WX 602 ; N pi ; G 853\nU 961 ; WX 635 ; N rho ; G 854\nU 962 ; WX 587 ; N sigma1 ; G 855\nU 963 ; WX 634 ; N sigma ; G 856\nU 964 ; WX 602 ; N tau ; G 857\nU 965 ; WX 579 ; N upsilon ; G 858\nU 966 ; WX 660 ; N phi ; G 859\nU 967 ; WX 592 ; N chi ; G 860\nU 968 ; WX 660 ; N psi ; G 861\nU 969 ; WX 837 ; N omega ; G 862\nU 970 ; WX 338 ; N iotadieresis ; G 863\nU 971 ; WX 579 ; N upsilondieresis ; G 864\nU 972 ; WX 612 ; N omicrontonos ; G 865\nU 973 ; WX 579 ; N upsilontonos ; G 866\nU 974 ; WX 837 ; N omegatonos ; G 867\nU 975 ; WX 656 ; N uni03CF ; G 868\nU 976 ; WX 614 ; N uni03D0 ; G 869\nU 977 ; WX 619 ; N theta1 ; G 870\nU 978 ; WX 699 ; N Upsilon1 ; G 871\nU 979 ; WX 842 ; N uni03D3 ; G 872\nU 980 ; WX 699 ; N uni03D4 ; G 873\nU 981 ; WX 660 ; N phi1 ; G 874\nU 982 ; WX 837 ; N omega1 ; G 875\nU 983 ; WX 664 ; N uni03D7 ; G 876\nU 984 ; WX 787 ; N uni03D8 ; G 877\nU 985 ; WX 612 ; N uni03D9 ; G 878\nU 986 ; WX 648 ; N uni03DA ; G 879\nU 987 ; WX 587 ; N uni03DB ; G 880\nU 988 ; WX 575 ; N uni03DC ; G 881\nU 989 ; WX 458 ; N uni03DD ; G 882\nU 990 ; WX 660 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 865 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 934 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 758 ; N uni03E4 ; G 889\nU 997 ; WX 659 ; N uni03E5 ; G 890\nU 998 ; WX 792 ; N uni03E6 ; G 891\nU 999 ; WX 615 ; N uni03E7 ; G 892\nU 1000 ; WX 687 ; N uni03E8 ; G 893\nU 1001 ; WX 607 ; N uni03E9 ; G 894\nU 1002 ; WX 768 ; N uni03EA ; G 895\nU 1003 ; WX 625 ; N uni03EB ; G 896\nU 1004 ; WX 699 ; N uni03EC ; G 897\nU 1005 ; WX 612 ; N uni03ED ; G 898\nU 1006 ; WX 611 ; N uni03EE ; G 899\nU 1007 ; WX 536 ; N uni03EF ; G 900\nU 1008 ; WX 664 ; N uni03F0 ; G 901\nU 1009 ; WX 635 ; N uni03F1 ; G 902\nU 1010 ; WX 550 ; N uni03F2 ; G 903\nU 1011 ; WX 278 ; N uni03F3 ; G 904\nU 1012 ; WX 787 ; N uni03F4 ; G 905\nU 1013 ; WX 615 ; N uni03F5 ; G 906\nU 1014 ; WX 615 ; N uni03F6 ; G 907\nU 1015 ; WX 608 ; N uni03F7 ; G 908\nU 1016 ; WX 635 ; N uni03F8 ; G 909\nU 1017 ; WX 698 ; N uni03F9 ; G 910\nU 1018 ; WX 863 ; N uni03FA ; G 911\nU 1019 ; WX 651 ; N uni03FB ; G 912\nU 1020 ; WX 635 ; N uni03FC ; G 913\nU 1021 ; WX 703 ; N uni03FD ; G 914\nU 1022 ; WX 698 ; N uni03FE ; G 915\nU 1023 ; WX 703 ; N uni03FF ; G 916\nU 1024 ; WX 632 ; N uni0400 ; G 917\nU 1025 ; WX 632 ; N uni0401 ; G 918\nU 1026 ; WX 786 ; N uni0402 ; G 919\nU 1027 ; WX 557 ; N uni0403 ; G 920\nU 1028 ; WX 698 ; N uni0404 ; G 921\nU 1029 ; WX 635 ; N uni0405 ; G 922\nU 1030 ; WX 295 ; N uni0406 ; G 923\nU 1031 ; WX 295 ; N uni0407 ; G 924\nU 1032 ; WX 295 ; N uni0408 ; G 925\nU 1033 ; WX 1094 ; N uni0409 ; G 926\nU 1034 ; WX 1045 ; N uni040A ; G 927\nU 1035 ; WX 786 ; N uni040B ; G 928\nU 1036 ; WX 710 ; N uni040C ; G 929\nU 1037 ; WX 748 ; N uni040D ; G 930\nU 1038 ; WX 609 ; N uni040E ; G 931\nU 1039 ; WX 752 ; N uni040F ; G 932\nU 1040 ; WX 684 ; N uni0410 ; G 933\nU 1041 ; WX 686 ; N uni0411 ; G 934\nU 1042 ; WX 686 ; N uni0412 ; G 935\nU 1043 ; WX 557 ; N uni0413 ; G 936\nU 1044 ; WX 781 ; N uni0414 ; G 937\nU 1045 ; WX 632 ; N uni0415 ; G 938\nU 1046 ; WX 1077 ; N uni0416 ; G 939\nU 1047 ; WX 641 ; N uni0417 ; G 940\nU 1048 ; WX 748 ; N uni0418 ; G 941\nU 1049 ; WX 748 ; N uni0419 ; G 942\nU 1050 ; WX 710 ; N uni041A ; G 943\nU 1051 ; WX 752 ; N uni041B ; G 944\nU 1052 ; WX 863 ; N uni041C ; G 945\nU 1053 ; WX 752 ; N uni041D ; G 946\nU 1054 ; WX 787 ; N uni041E ; G 947\nU 1055 ; WX 752 ; N uni041F ; G 948\nU 1056 ; WX 603 ; N uni0420 ; G 949\nU 1057 ; WX 698 ; N uni0421 ; G 950\nU 1058 ; WX 611 ; N uni0422 ; G 951\nU 1059 ; WX 609 ; N uni0423 ; G 952\nU 1060 ; WX 861 ; N uni0424 ; G 953\nU 1061 ; WX 685 ; N uni0425 ; G 954\nU 1062 ; WX 776 ; N uni0426 ; G 955\nU 1063 ; WX 686 ; N uni0427 ; G 956\nU 1064 ; WX 1069 ; N uni0428 ; G 957\nU 1065 ; WX 1094 ; N uni0429 ; G 958\nU 1066 ; WX 833 ; N uni042A ; G 959\nU 1067 ; WX 818 ; N uni042B ; G 960\nU 1068 ; WX 686 ; N uni042C ; G 961\nU 1069 ; WX 698 ; N uni042D ; G 962\nU 1070 ; WX 1080 ; N uni042E ; G 963\nU 1071 ; WX 695 ; N uni042F ; G 964\nU 1072 ; WX 613 ; N uni0430 ; G 965\nU 1073 ; WX 617 ; N uni0431 ; G 966\nU 1074 ; WX 589 ; N uni0432 ; G 967\nU 1075 ; WX 525 ; N uni0433 ; G 968\nU 1076 ; WX 691 ; N uni0434 ; G 969\nU 1077 ; WX 615 ; N uni0435 ; G 970\nU 1078 ; WX 901 ; N uni0436 ; G 971\nU 1079 ; WX 532 ; N uni0437 ; G 972\nU 1080 ; WX 650 ; N uni0438 ; G 973\nU 1081 ; WX 650 ; N uni0439 ; G 974\nU 1082 ; WX 604 ; N uni043A ; G 975\nU 1083 ; WX 639 ; N uni043B ; G 976\nU 1084 ; WX 754 ; N uni043C ; G 977\nU 1085 ; WX 654 ; N uni043D ; G 978\nU 1086 ; WX 612 ; N uni043E ; G 979\nU 1087 ; WX 654 ; N uni043F ; G 980\nU 1088 ; WX 635 ; N uni0440 ; G 981\nU 1089 ; WX 550 ; N uni0441 ; G 982\nU 1090 ; WX 583 ; N uni0442 ; G 983\nU 1091 ; WX 592 ; N uni0443 ; G 984\nU 1092 ; WX 855 ; N uni0444 ; G 985\nU 1093 ; WX 592 ; N uni0445 ; G 986\nU 1094 ; WX 681 ; N uni0446 ; G 987\nU 1095 ; WX 591 ; N uni0447 ; G 988\nU 1096 ; WX 915 ; N uni0448 ; G 989\nU 1097 ; WX 942 ; N uni0449 ; G 990\nU 1098 ; WX 707 ; N uni044A ; G 991\nU 1099 ; WX 790 ; N uni044B ; G 992\nU 1100 ; WX 589 ; N uni044C ; G 993\nU 1101 ; WX 549 ; N uni044D ; G 994\nU 1102 ; WX 842 ; N uni044E ; G 995\nU 1103 ; WX 602 ; N uni044F ; G 996\nU 1104 ; WX 615 ; N uni0450 ; G 997\nU 1105 ; WX 615 ; N uni0451 ; G 998\nU 1106 ; WX 625 ; N uni0452 ; G 999\nU 1107 ; WX 525 ; N uni0453 ; G 1000\nU 1108 ; WX 549 ; N uni0454 ; G 1001\nU 1109 ; WX 521 ; N uni0455 ; G 1002\nU 1110 ; WX 278 ; N uni0456 ; G 1003\nU 1111 ; WX 278 ; N uni0457 ; G 1004\nU 1112 ; WX 278 ; N uni0458 ; G 1005\nU 1113 ; WX 902 ; N uni0459 ; G 1006\nU 1114 ; WX 898 ; N uni045A ; G 1007\nU 1115 ; WX 652 ; N uni045B ; G 1008\nU 1116 ; WX 604 ; N uni045C ; G 1009\nU 1117 ; WX 650 ; N uni045D ; G 1010\nU 1118 ; WX 592 ; N uni045E ; G 1011\nU 1119 ; WX 654 ; N uni045F ; G 1012\nU 1120 ; WX 934 ; N uni0460 ; G 1013\nU 1121 ; WX 837 ; N uni0461 ; G 1014\nU 1122 ; WX 771 ; N uni0462 ; G 1015\nU 1123 ; WX 672 ; N uni0463 ; G 1016\nU 1124 ; WX 942 ; N uni0464 ; G 1017\nU 1125 ; WX 749 ; N uni0465 ; G 1018\nU 1126 ; WX 879 ; N uni0466 ; G 1019\nU 1127 ; WX 783 ; N uni0467 ; G 1020\nU 1128 ; WX 1160 ; N uni0468 ; G 1021\nU 1129 ; WX 1001 ; N uni0469 ; G 1022\nU 1130 ; WX 787 ; N uni046A ; G 1023\nU 1131 ; WX 612 ; N uni046B ; G 1024\nU 1132 ; WX 1027 ; N uni046C ; G 1025\nU 1133 ; WX 824 ; N uni046D ; G 1026\nU 1134 ; WX 636 ; N uni046E ; G 1027\nU 1135 ; WX 541 ; N uni046F ; G 1028\nU 1136 ; WX 856 ; N uni0470 ; G 1029\nU 1137 ; WX 876 ; N uni0471 ; G 1030\nU 1138 ; WX 787 ; N uni0472 ; G 1031\nU 1139 ; WX 612 ; N uni0473 ; G 1032\nU 1140 ; WX 781 ; N uni0474 ; G 1033\nU 1141 ; WX 665 ; N uni0475 ; G 1034\nU 1142 ; WX 781 ; N uni0476 ; G 1035\nU 1143 ; WX 665 ; N uni0477 ; G 1036\nU 1144 ; WX 992 ; N uni0478 ; G 1037\nU 1145 ; WX 904 ; N uni0479 ; G 1038\nU 1146 ; WX 953 ; N uni047A ; G 1039\nU 1147 ; WX 758 ; N uni047B ; G 1040\nU 1148 ; WX 1180 ; N uni047C ; G 1041\nU 1149 ; WX 1028 ; N uni047D ; G 1042\nU 1150 ; WX 934 ; N uni047E ; G 1043\nU 1151 ; WX 837 ; N uni047F ; G 1044\nU 1152 ; WX 698 ; N uni0480 ; G 1045\nU 1153 ; WX 550 ; N uni0481 ; G 1046\nU 1154 ; WX 502 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 748 ; N uni048A ; G 1055\nU 1163 ; WX 657 ; N uni048B ; G 1056\nU 1164 ; WX 686 ; N uni048C ; G 1057\nU 1165 ; WX 589 ; N uni048D ; G 1058\nU 1166 ; WX 603 ; N uni048E ; G 1059\nU 1167 ; WX 635 ; N uni048F ; G 1060\nU 1168 ; WX 610 ; N uni0490 ; G 1061\nU 1169 ; WX 525 ; N uni0491 ; G 1062\nU 1170 ; WX 675 ; N uni0492 ; G 1063\nU 1171 ; WX 556 ; N uni0493 ; G 1064\nU 1172 ; WX 557 ; N uni0494 ; G 1065\nU 1173 ; WX 491 ; N uni0495 ; G 1066\nU 1174 ; WX 1077 ; N uni0496 ; G 1067\nU 1175 ; WX 901 ; N uni0497 ; G 1068\nU 1176 ; WX 641 ; N uni0498 ; G 1069\nU 1177 ; WX 532 ; N uni0499 ; G 1070\nU 1178 ; WX 710 ; N uni049A ; G 1071\nU 1179 ; WX 604 ; N uni049B ; G 1072\nU 1180 ; WX 710 ; N uni049C ; G 1073\nU 1181 ; WX 604 ; N uni049D ; G 1074\nU 1182 ; WX 710 ; N uni049E ; G 1075\nU 1183 ; WX 604 ; N uni049F ; G 1076\nU 1184 ; WX 856 ; N uni04A0 ; G 1077\nU 1185 ; WX 832 ; N uni04A1 ; G 1078\nU 1186 ; WX 752 ; N uni04A2 ; G 1079\nU 1187 ; WX 661 ; N uni04A3 ; G 1080\nU 1188 ; WX 1014 ; N uni04A4 ; G 1081\nU 1189 ; WX 877 ; N uni04A5 ; G 1082\nU 1190 ; WX 1113 ; N uni04A6 ; G 1083\nU 1191 ; WX 950 ; N uni04A7 ; G 1084\nU 1192 ; WX 890 ; N uni04A8 ; G 1085\nU 1193 ; WX 707 ; N uni04A9 ; G 1086\nU 1194 ; WX 698 ; N uni04AA ; G 1087\nU 1195 ; WX 550 ; N uni04AB ; G 1088\nU 1196 ; WX 611 ; N uni04AC ; G 1089\nU 1197 ; WX 529 ; N uni04AD ; G 1090\nU 1198 ; WX 611 ; N uni04AE ; G 1091\nU 1199 ; WX 592 ; N uni04AF ; G 1092\nU 1200 ; WX 611 ; N uni04B0 ; G 1093\nU 1201 ; WX 592 ; N uni04B1 ; G 1094\nU 1202 ; WX 685 ; N uni04B2 ; G 1095\nU 1203 ; WX 592 ; N uni04B3 ; G 1096\nU 1204 ; WX 934 ; N uni04B4 ; G 1097\nU 1205 ; WX 807 ; N uni04B5 ; G 1098\nU 1206 ; WX 686 ; N uni04B6 ; G 1099\nU 1207 ; WX 591 ; N uni04B7 ; G 1100\nU 1208 ; WX 686 ; N uni04B8 ; G 1101\nU 1209 ; WX 591 ; N uni04B9 ; G 1102\nU 1210 ; WX 686 ; N uni04BA ; G 1103\nU 1211 ; WX 634 ; N uni04BB ; G 1104\nU 1212 ; WX 929 ; N uni04BC ; G 1105\nU 1213 ; WX 731 ; N uni04BD ; G 1106\nU 1214 ; WX 929 ; N uni04BE ; G 1107\nU 1215 ; WX 731 ; N uni04BF ; G 1108\nU 1216 ; WX 295 ; N uni04C0 ; G 1109\nU 1217 ; WX 1077 ; N uni04C1 ; G 1110\nU 1218 ; WX 901 ; N uni04C2 ; G 1111\nU 1219 ; WX 655 ; N uni04C3 ; G 1112\nU 1220 ; WX 604 ; N uni04C4 ; G 1113\nU 1221 ; WX 752 ; N uni04C5 ; G 1114\nU 1222 ; WX 639 ; N uni04C6 ; G 1115\nU 1223 ; WX 752 ; N uni04C7 ; G 1116\nU 1224 ; WX 661 ; N uni04C8 ; G 1117\nU 1225 ; WX 752 ; N uni04C9 ; G 1118\nU 1226 ; WX 661 ; N uni04CA ; G 1119\nU 1227 ; WX 686 ; N uni04CB ; G 1120\nU 1228 ; WX 591 ; N uni04CC ; G 1121\nU 1229 ; WX 863 ; N uni04CD ; G 1122\nU 1230 ; WX 754 ; N uni04CE ; G 1123\nU 1231 ; WX 278 ; N uni04CF ; G 1124\nU 1232 ; WX 684 ; N uni04D0 ; G 1125\nU 1233 ; WX 613 ; N uni04D1 ; G 1126\nU 1234 ; WX 684 ; N uni04D2 ; G 1127\nU 1235 ; WX 613 ; N uni04D3 ; G 1128\nU 1236 ; WX 974 ; N uni04D4 ; G 1129\nU 1237 ; WX 995 ; N uni04D5 ; G 1130\nU 1238 ; WX 632 ; N uni04D6 ; G 1131\nU 1239 ; WX 615 ; N uni04D7 ; G 1132\nU 1240 ; WX 787 ; N uni04D8 ; G 1133\nU 1241 ; WX 615 ; N uni04D9 ; G 1134\nU 1242 ; WX 787 ; N uni04DA ; G 1135\nU 1243 ; WX 615 ; N uni04DB ; G 1136\nU 1244 ; WX 1077 ; N uni04DC ; G 1137\nU 1245 ; WX 901 ; N uni04DD ; G 1138\nU 1246 ; WX 641 ; N uni04DE ; G 1139\nU 1247 ; WX 532 ; N uni04DF ; G 1140\nU 1248 ; WX 666 ; N uni04E0 ; G 1141\nU 1249 ; WX 578 ; N uni04E1 ; G 1142\nU 1250 ; WX 748 ; N uni04E2 ; G 1143\nU 1251 ; WX 650 ; N uni04E3 ; G 1144\nU 1252 ; WX 748 ; N uni04E4 ; G 1145\nU 1253 ; WX 650 ; N uni04E5 ; G 1146\nU 1254 ; WX 787 ; N uni04E6 ; G 1147\nU 1255 ; WX 612 ; N uni04E7 ; G 1148\nU 1256 ; WX 787 ; N uni04E8 ; G 1149\nU 1257 ; WX 612 ; N uni04E9 ; G 1150\nU 1258 ; WX 787 ; N uni04EA ; G 1151\nU 1259 ; WX 612 ; N uni04EB ; G 1152\nU 1260 ; WX 698 ; N uni04EC ; G 1153\nU 1261 ; WX 549 ; N uni04ED ; G 1154\nU 1262 ; WX 609 ; N uni04EE ; G 1155\nU 1263 ; WX 592 ; N uni04EF ; G 1156\nU 1264 ; WX 609 ; N uni04F0 ; G 1157\nU 1265 ; WX 592 ; N uni04F1 ; G 1158\nU 1266 ; WX 609 ; N uni04F2 ; G 1159\nU 1267 ; WX 592 ; N uni04F3 ; G 1160\nU 1268 ; WX 686 ; N uni04F4 ; G 1161\nU 1269 ; WX 591 ; N uni04F5 ; G 1162\nU 1270 ; WX 557 ; N uni04F6 ; G 1163\nU 1271 ; WX 491 ; N uni04F7 ; G 1164\nU 1272 ; WX 818 ; N uni04F8 ; G 1165\nU 1273 ; WX 790 ; N uni04F9 ; G 1166\nU 1274 ; WX 675 ; N uni04FA ; G 1167\nU 1275 ; WX 556 ; N uni04FB ; G 1168\nU 1276 ; WX 685 ; N uni04FC ; G 1169\nU 1277 ; WX 592 ; N uni04FD ; G 1170\nU 1278 ; WX 685 ; N uni04FE ; G 1171\nU 1279 ; WX 592 ; N uni04FF ; G 1172\nU 1280 ; WX 686 ; N uni0500 ; G 1173\nU 1281 ; WX 589 ; N uni0501 ; G 1174\nU 1282 ; WX 1006 ; N uni0502 ; G 1175\nU 1283 ; WX 897 ; N uni0503 ; G 1176\nU 1284 ; WX 975 ; N uni0504 ; G 1177\nU 1285 ; WX 869 ; N uni0505 ; G 1178\nU 1286 ; WX 679 ; N uni0506 ; G 1179\nU 1287 ; WX 588 ; N uni0507 ; G 1180\nU 1288 ; WX 1072 ; N uni0508 ; G 1181\nU 1289 ; WX 957 ; N uni0509 ; G 1182\nU 1290 ; WX 1113 ; N uni050A ; G 1183\nU 1291 ; WX 967 ; N uni050B ; G 1184\nU 1292 ; WX 775 ; N uni050C ; G 1185\nU 1293 ; WX 660 ; N uni050D ; G 1186\nU 1294 ; WX 773 ; N uni050E ; G 1187\nU 1295 ; WX 711 ; N uni050F ; G 1188\nU 1296 ; WX 614 ; N uni0510 ; G 1189\nU 1297 ; WX 541 ; N uni0511 ; G 1190\nU 1298 ; WX 752 ; N uni0512 ; G 1191\nU 1299 ; WX 639 ; N uni0513 ; G 1192\nU 1300 ; WX 1195 ; N uni0514 ; G 1193\nU 1301 ; WX 997 ; N uni0515 ; G 1194\nU 1302 ; WX 900 ; N uni0516 ; G 1195\nU 1303 ; WX 867 ; N uni0517 ; G 1196\nU 1304 ; WX 1031 ; N uni0518 ; G 1197\nU 1305 ; WX 989 ; N uni0519 ; G 1198\nU 1306 ; WX 787 ; N uni051A ; G 1199\nU 1307 ; WX 635 ; N uni051B ; G 1200\nU 1308 ; WX 989 ; N uni051C ; G 1201\nU 1309 ; WX 818 ; N uni051D ; G 1202\nU 1310 ; WX 710 ; N uni051E ; G 1203\nU 1311 ; WX 604 ; N uni051F ; G 1204\nU 1312 ; WX 1113 ; N uni0520 ; G 1205\nU 1313 ; WX 942 ; N uni0521 ; G 1206\nU 1314 ; WX 1113 ; N uni0522 ; G 1207\nU 1315 ; WX 949 ; N uni0523 ; G 1208\nU 1316 ; WX 793 ; N uni0524 ; G 1209\nU 1317 ; WX 683 ; N uni0525 ; G 1210\nU 1329 ; WX 766 ; N uni0531 ; G 1211\nU 1330 ; WX 732 ; N uni0532 ; G 1212\nU 1331 ; WX 753 ; N uni0533 ; G 1213\nU 1332 ; WX 753 ; N uni0534 ; G 1214\nU 1333 ; WX 732 ; N uni0535 ; G 1215\nU 1334 ; WX 772 ; N uni0536 ; G 1216\nU 1335 ; WX 640 ; N uni0537 ; G 1217\nU 1336 ; WX 732 ; N uni0538 ; G 1218\nU 1337 ; WX 859 ; N uni0539 ; G 1219\nU 1338 ; WX 753 ; N uni053A ; G 1220\nU 1339 ; WX 691 ; N uni053B ; G 1221\nU 1340 ; WX 533 ; N uni053C ; G 1222\nU 1341 ; WX 922 ; N uni053D ; G 1223\nU 1342 ; WX 863 ; N uni053E ; G 1224\nU 1343 ; WX 732 ; N uni053F ; G 1225\nU 1344 ; WX 716 ; N uni0540 ; G 1226\nU 1345 ; WX 766 ; N uni0541 ; G 1227\nU 1346 ; WX 753 ; N uni0542 ; G 1228\nU 1347 ; WX 767 ; N uni0543 ; G 1229\nU 1348 ; WX 792 ; N uni0544 ; G 1230\nU 1349 ; WX 728 ; N uni0545 ; G 1231\nU 1350 ; WX 729 ; N uni0546 ; G 1232\nU 1351 ; WX 757 ; N uni0547 ; G 1233\nU 1352 ; WX 732 ; N uni0548 ; G 1234\nU 1353 ; WX 713 ; N uni0549 ; G 1235\nU 1354 ; WX 800 ; N uni054A ; G 1236\nU 1355 ; WX 768 ; N uni054B ; G 1237\nU 1356 ; WX 792 ; N uni054C ; G 1238\nU 1357 ; WX 732 ; N uni054D ; G 1239\nU 1358 ; WX 753 ; N uni054E ; G 1240\nU 1359 ; WX 705 ; N uni054F ; G 1241\nU 1360 ; WX 694 ; N uni0550 ; G 1242\nU 1361 ; WX 744 ; N uni0551 ; G 1243\nU 1362 ; WX 538 ; N uni0552 ; G 1244\nU 1363 ; WX 811 ; N uni0553 ; G 1245\nU 1364 ; WX 757 ; N uni0554 ; G 1246\nU 1365 ; WX 787 ; N uni0555 ; G 1247\nU 1366 ; WX 790 ; N uni0556 ; G 1248\nU 1369 ; WX 307 ; N uni0559 ; G 1249\nU 1370 ; WX 318 ; N uni055A ; G 1250\nU 1371 ; WX 234 ; N uni055B ; G 1251\nU 1372 ; WX 361 ; N uni055C ; G 1252\nU 1373 ; WX 238 ; N uni055D ; G 1253\nU 1374 ; WX 405 ; N uni055E ; G 1254\nU 1375 ; WX 500 ; N uni055F ; G 1255\nU 1377 ; WX 974 ; N uni0561 ; G 1256\nU 1378 ; WX 634 ; N uni0562 ; G 1257\nU 1379 ; WX 658 ; N uni0563 ; G 1258\nU 1380 ; WX 663 ; N uni0564 ; G 1259\nU 1381 ; WX 634 ; N uni0565 ; G 1260\nU 1382 ; WX 635 ; N uni0566 ; G 1261\nU 1383 ; WX 515 ; N uni0567 ; G 1262\nU 1384 ; WX 634 ; N uni0568 ; G 1263\nU 1385 ; WX 738 ; N uni0569 ; G 1264\nU 1386 ; WX 658 ; N uni056A ; G 1265\nU 1387 ; WX 634 ; N uni056B ; G 1266\nU 1388 ; WX 271 ; N uni056C ; G 1267\nU 1389 ; WX 980 ; N uni056D ; G 1268\nU 1390 ; WX 623 ; N uni056E ; G 1269\nU 1391 ; WX 634 ; N uni056F ; G 1270\nU 1392 ; WX 634 ; N uni0570 ; G 1271\nU 1393 ; WX 608 ; N uni0571 ; G 1272\nU 1394 ; WX 634 ; N uni0572 ; G 1273\nU 1395 ; WX 629 ; N uni0573 ; G 1274\nU 1396 ; WX 634 ; N uni0574 ; G 1275\nU 1397 ; WX 278 ; N uni0575 ; G 1276\nU 1398 ; WX 634 ; N uni0576 ; G 1277\nU 1399 ; WX 499 ; N uni0577 ; G 1278\nU 1400 ; WX 634 ; N uni0578 ; G 1279\nU 1401 ; WX 404 ; N uni0579 ; G 1280\nU 1402 ; WX 974 ; N uni057A ; G 1281\nU 1403 ; WX 560 ; N uni057B ; G 1282\nU 1404 ; WX 648 ; N uni057C ; G 1283\nU 1405 ; WX 634 ; N uni057D ; G 1284\nU 1406 ; WX 634 ; N uni057E ; G 1285\nU 1407 ; WX 974 ; N uni057F ; G 1286\nU 1408 ; WX 634 ; N uni0580 ; G 1287\nU 1409 ; WX 635 ; N uni0581 ; G 1288\nU 1410 ; WX 435 ; N uni0582 ; G 1289\nU 1411 ; WX 974 ; N uni0583 ; G 1290\nU 1412 ; WX 636 ; N uni0584 ; G 1291\nU 1413 ; WX 612 ; N uni0585 ; G 1292\nU 1414 ; WX 805 ; N uni0586 ; G 1293\nU 1415 ; WX 812 ; N uni0587 ; G 1294\nU 1417 ; WX 337 ; N uni0589 ; G 1295\nU 1418 ; WX 361 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 361 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 295 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 295 ; N uni05C3 ; G 1316\nU 1478 ; WX 456 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 668 ; N uni05D0 ; G 1319\nU 1489 ; WX 578 ; N uni05D1 ; G 1320\nU 1490 ; WX 412 ; N uni05D2 ; G 1321\nU 1491 ; WX 546 ; N uni05D3 ; G 1322\nU 1492 ; WX 653 ; N uni05D4 ; G 1323\nU 1493 ; WX 272 ; N uni05D5 ; G 1324\nU 1494 ; WX 346 ; N uni05D6 ; G 1325\nU 1495 ; WX 653 ; N uni05D7 ; G 1326\nU 1496 ; WX 648 ; N uni05D8 ; G 1327\nU 1497 ; WX 224 ; N uni05D9 ; G 1328\nU 1498 ; WX 537 ; N uni05DA ; G 1329\nU 1499 ; WX 529 ; N uni05DB ; G 1330\nU 1500 ; WX 568 ; N uni05DC ; G 1331\nU 1501 ; WX 664 ; N uni05DD ; G 1332\nU 1502 ; WX 679 ; N uni05DE ; G 1333\nU 1503 ; WX 272 ; N uni05DF ; G 1334\nU 1504 ; WX 400 ; N uni05E0 ; G 1335\nU 1505 ; WX 649 ; N uni05E1 ; G 1336\nU 1506 ; WX 626 ; N uni05E2 ; G 1337\nU 1507 ; WX 640 ; N uni05E3 ; G 1338\nU 1508 ; WX 625 ; N uni05E4 ; G 1339\nU 1509 ; WX 540 ; N uni05E5 ; G 1340\nU 1510 ; WX 593 ; N uni05E6 ; G 1341\nU 1511 ; WX 709 ; N uni05E7 ; G 1342\nU 1512 ; WX 564 ; N uni05E8 ; G 1343\nU 1513 ; WX 708 ; N uni05E9 ; G 1344\nU 1514 ; WX 657 ; N uni05EA ; G 1345\nU 1520 ; WX 471 ; N uni05F0 ; G 1346\nU 1521 ; WX 454 ; N uni05F1 ; G 1347\nU 1522 ; WX 471 ; N uni05F2 ; G 1348\nU 1523 ; WX 416 ; N uni05F3 ; G 1349\nU 1524 ; WX 645 ; N uni05F4 ; G 1350\nU 3647 ; WX 636 ; N uni0E3F ; G 1351\nU 3713 ; WX 670 ; N uni0E81 ; G 1352\nU 3714 ; WX 684 ; N uni0E82 ; G 1353\nU 3716 ; WX 688 ; N uni0E84 ; G 1354\nU 3719 ; WX 482 ; N uni0E87 ; G 1355\nU 3720 ; WX 628 ; N uni0E88 ; G 1356\nU 3722 ; WX 684 ; N uni0E8A ; G 1357\nU 3725 ; WX 688 ; N uni0E8D ; G 1358\nU 3732 ; WX 642 ; N uni0E94 ; G 1359\nU 3733 ; WX 642 ; N uni0E95 ; G 1360\nU 3734 ; WX 672 ; N uni0E96 ; G 1361\nU 3735 ; WX 655 ; N uni0E97 ; G 1362\nU 3737 ; WX 641 ; N uni0E99 ; G 1363\nU 3738 ; WX 592 ; N uni0E9A ; G 1364\nU 3739 ; WX 592 ; N uni0E9B ; G 1365\nU 3740 ; WX 745 ; N uni0E9C ; G 1366\nU 3741 ; WX 767 ; N uni0E9D ; G 1367\nU 3742 ; WX 687 ; N uni0E9E ; G 1368\nU 3743 ; WX 687 ; N uni0E9F ; G 1369\nU 3745 ; WX 702 ; N uni0EA1 ; G 1370\nU 3746 ; WX 688 ; N uni0EA2 ; G 1371\nU 3747 ; WX 684 ; N uni0EA3 ; G 1372\nU 3749 ; WX 649 ; N uni0EA5 ; G 1373\nU 3751 ; WX 632 ; N uni0EA7 ; G 1374\nU 3754 ; WX 703 ; N uni0EAA ; G 1375\nU 3755 ; WX 819 ; N uni0EAB ; G 1376\nU 3757 ; WX 633 ; N uni0EAD ; G 1377\nU 3758 ; WX 684 ; N uni0EAE ; G 1378\nU 3759 ; WX 788 ; N uni0EAF ; G 1379\nU 3760 ; WX 632 ; N uni0EB0 ; G 1380\nU 3761 ; WX 0 ; N uni0EB1 ; G 1381\nU 3762 ; WX 539 ; N uni0EB2 ; G 1382\nU 3763 ; WX 539 ; N uni0EB3 ; G 1383\nU 3764 ; WX 0 ; N uni0EB4 ; G 1384\nU 3765 ; WX 0 ; N uni0EB5 ; G 1385\nU 3766 ; WX 0 ; N uni0EB6 ; G 1386\nU 3767 ; WX 0 ; N uni0EB7 ; G 1387\nU 3768 ; WX 0 ; N uni0EB8 ; G 1388\nU 3769 ; WX 0 ; N uni0EB9 ; G 1389\nU 3771 ; WX 0 ; N uni0EBB ; G 1390\nU 3772 ; WX 0 ; N uni0EBC ; G 1391\nU 3773 ; WX 663 ; N uni0EBD ; G 1392\nU 3776 ; WX 360 ; N uni0EC0 ; G 1393\nU 3777 ; WX 679 ; N uni0EC1 ; G 1394\nU 3778 ; WX 460 ; N uni0EC2 ; G 1395\nU 3779 ; WX 547 ; N uni0EC3 ; G 1396\nU 3780 ; WX 491 ; N uni0EC4 ; G 1397\nU 3782 ; WX 674 ; N uni0EC6 ; G 1398\nU 3784 ; WX 0 ; N uni0EC8 ; G 1399\nU 3785 ; WX 0 ; N uni0EC9 ; G 1400\nU 3786 ; WX 0 ; N uni0ECA ; G 1401\nU 3787 ; WX 0 ; N uni0ECB ; G 1402\nU 3788 ; WX 0 ; N uni0ECC ; G 1403\nU 3789 ; WX 0 ; N uni0ECD ; G 1404\nU 3792 ; WX 636 ; N uni0ED0 ; G 1405\nU 3793 ; WX 641 ; N uni0ED1 ; G 1406\nU 3794 ; WX 641 ; N uni0ED2 ; G 1407\nU 3795 ; WX 670 ; N uni0ED3 ; G 1408\nU 3796 ; WX 625 ; N uni0ED4 ; G 1409\nU 3797 ; WX 625 ; N uni0ED5 ; G 1410\nU 3798 ; WX 703 ; N uni0ED6 ; G 1411\nU 3799 ; WX 670 ; N uni0ED7 ; G 1412\nU 3800 ; WX 674 ; N uni0ED8 ; G 1413\nU 3801 ; WX 677 ; N uni0ED9 ; G 1414\nU 3804 ; WX 1028 ; N uni0EDC ; G 1415\nU 3805 ; WX 1028 ; N uni0EDD ; G 1416\nU 4256 ; WX 874 ; N uni10A0 ; G 1417\nU 4257 ; WX 733 ; N uni10A1 ; G 1418\nU 4258 ; WX 679 ; N uni10A2 ; G 1419\nU 4259 ; WX 834 ; N uni10A3 ; G 1420\nU 4260 ; WX 615 ; N uni10A4 ; G 1421\nU 4261 ; WX 768 ; N uni10A5 ; G 1422\nU 4262 ; WX 753 ; N uni10A6 ; G 1423\nU 4263 ; WX 914 ; N uni10A7 ; G 1424\nU 4264 ; WX 453 ; N uni10A8 ; G 1425\nU 4265 ; WX 620 ; N uni10A9 ; G 1426\nU 4266 ; WX 843 ; N uni10AA ; G 1427\nU 4267 ; WX 882 ; N uni10AB ; G 1428\nU 4268 ; WX 625 ; N uni10AC ; G 1429\nU 4269 ; WX 854 ; N uni10AD ; G 1430\nU 4270 ; WX 781 ; N uni10AE ; G 1431\nU 4271 ; WX 629 ; N uni10AF ; G 1432\nU 4272 ; WX 912 ; N uni10B0 ; G 1433\nU 4273 ; WX 621 ; N uni10B1 ; G 1434\nU 4274 ; WX 620 ; N uni10B2 ; G 1435\nU 4275 ; WX 854 ; N uni10B3 ; G 1436\nU 4276 ; WX 866 ; N uni10B4 ; G 1437\nU 4277 ; WX 724 ; N uni10B5 ; G 1438\nU 4278 ; WX 630 ; N uni10B6 ; G 1439\nU 4279 ; WX 621 ; N uni10B7 ; G 1440\nU 4280 ; WX 625 ; N uni10B8 ; G 1441\nU 4281 ; WX 620 ; N uni10B9 ; G 1442\nU 4282 ; WX 818 ; N uni10BA ; G 1443\nU 4283 ; WX 874 ; N uni10BB ; G 1444\nU 4284 ; WX 615 ; N uni10BC ; G 1445\nU 4285 ; WX 623 ; N uni10BD ; G 1446\nU 4286 ; WX 625 ; N uni10BE ; G 1447\nU 4287 ; WX 725 ; N uni10BF ; G 1448\nU 4288 ; WX 844 ; N uni10C0 ; G 1449\nU 4289 ; WX 596 ; N uni10C1 ; G 1450\nU 4290 ; WX 688 ; N uni10C2 ; G 1451\nU 4291 ; WX 596 ; N uni10C3 ; G 1452\nU 4292 ; WX 594 ; N uni10C4 ; G 1453\nU 4293 ; WX 738 ; N uni10C5 ; G 1454\nU 4304 ; WX 508 ; N uni10D0 ; G 1455\nU 4305 ; WX 518 ; N uni10D1 ; G 1456\nU 4306 ; WX 581 ; N uni10D2 ; G 1457\nU 4307 ; WX 818 ; N uni10D3 ; G 1458\nU 4308 ; WX 508 ; N uni10D4 ; G 1459\nU 4309 ; WX 513 ; N uni10D5 ; G 1460\nU 4310 ; WX 500 ; N uni10D6 ; G 1461\nU 4311 ; WX 801 ; N uni10D7 ; G 1462\nU 4312 ; WX 518 ; N uni10D8 ; G 1463\nU 4313 ; WX 510 ; N uni10D9 ; G 1464\nU 4314 ; WX 1064 ; N uni10DA ; G 1465\nU 4315 ; WX 522 ; N uni10DB ; G 1466\nU 4316 ; WX 522 ; N uni10DC ; G 1467\nU 4317 ; WX 786 ; N uni10DD ; G 1468\nU 4318 ; WX 508 ; N uni10DE ; G 1469\nU 4319 ; WX 518 ; N uni10DF ; G 1470\nU 4320 ; WX 796 ; N uni10E0 ; G 1471\nU 4321 ; WX 522 ; N uni10E1 ; G 1472\nU 4322 ; WX 654 ; N uni10E2 ; G 1473\nU 4323 ; WX 522 ; N uni10E3 ; G 1474\nU 4324 ; WX 825 ; N uni10E4 ; G 1475\nU 4325 ; WX 513 ; N uni10E5 ; G 1476\nU 4326 ; WX 786 ; N uni10E6 ; G 1477\nU 4327 ; WX 518 ; N uni10E7 ; G 1478\nU 4328 ; WX 518 ; N uni10E8 ; G 1479\nU 4329 ; WX 522 ; N uni10E9 ; G 1480\nU 4330 ; WX 571 ; N uni10EA ; G 1481\nU 4331 ; WX 522 ; N uni10EB ; G 1482\nU 4332 ; WX 518 ; N uni10EC ; G 1483\nU 4333 ; WX 520 ; N uni10ED ; G 1484\nU 4334 ; WX 522 ; N uni10EE ; G 1485\nU 4335 ; WX 454 ; N uni10EF ; G 1486\nU 4336 ; WX 508 ; N uni10F0 ; G 1487\nU 4337 ; WX 518 ; N uni10F1 ; G 1488\nU 4338 ; WX 508 ; N uni10F2 ; G 1489\nU 4339 ; WX 508 ; N uni10F3 ; G 1490\nU 4340 ; WX 518 ; N uni10F4 ; G 1491\nU 4341 ; WX 554 ; N uni10F5 ; G 1492\nU 4342 ; WX 828 ; N uni10F6 ; G 1493\nU 4343 ; WX 552 ; N uni10F7 ; G 1494\nU 4344 ; WX 508 ; N uni10F8 ; G 1495\nU 4345 ; WX 571 ; N uni10F9 ; G 1496\nU 4346 ; WX 508 ; N uni10FA ; G 1497\nU 4347 ; WX 448 ; N uni10FB ; G 1498\nU 4348 ; WX 324 ; N uni10FC ; G 1499\nU 5121 ; WX 684 ; N uni1401 ; G 1500\nU 5122 ; WX 684 ; N uni1402 ; G 1501\nU 5123 ; WX 684 ; N uni1403 ; G 1502\nU 5124 ; WX 684 ; N uni1404 ; G 1503\nU 5125 ; WX 769 ; N uni1405 ; G 1504\nU 5126 ; WX 769 ; N uni1406 ; G 1505\nU 5127 ; WX 769 ; N uni1407 ; G 1506\nU 5129 ; WX 769 ; N uni1409 ; G 1507\nU 5130 ; WX 769 ; N uni140A ; G 1508\nU 5131 ; WX 769 ; N uni140B ; G 1509\nU 5132 ; WX 835 ; N uni140C ; G 1510\nU 5133 ; WX 834 ; N uni140D ; G 1511\nU 5134 ; WX 835 ; N uni140E ; G 1512\nU 5135 ; WX 834 ; N uni140F ; G 1513\nU 5136 ; WX 835 ; N uni1410 ; G 1514\nU 5137 ; WX 834 ; N uni1411 ; G 1515\nU 5138 ; WX 967 ; N uni1412 ; G 1516\nU 5139 ; WX 1007 ; N uni1413 ; G 1517\nU 5140 ; WX 967 ; N uni1414 ; G 1518\nU 5141 ; WX 1007 ; N uni1415 ; G 1519\nU 5142 ; WX 769 ; N uni1416 ; G 1520\nU 5143 ; WX 967 ; N uni1417 ; G 1521\nU 5144 ; WX 1007 ; N uni1418 ; G 1522\nU 5145 ; WX 967 ; N uni1419 ; G 1523\nU 5146 ; WX 1007 ; N uni141A ; G 1524\nU 5147 ; WX 769 ; N uni141B ; G 1525\nU 5149 ; WX 256 ; N uni141D ; G 1526\nU 5150 ; WX 543 ; N uni141E ; G 1527\nU 5151 ; WX 423 ; N uni141F ; G 1528\nU 5152 ; WX 423 ; N uni1420 ; G 1529\nU 5153 ; WX 389 ; N uni1421 ; G 1530\nU 5154 ; WX 389 ; N uni1422 ; G 1531\nU 5155 ; WX 393 ; N uni1423 ; G 1532\nU 5156 ; WX 389 ; N uni1424 ; G 1533\nU 5157 ; WX 466 ; N uni1425 ; G 1534\nU 5158 ; WX 385 ; N uni1426 ; G 1535\nU 5159 ; WX 256 ; N uni1427 ; G 1536\nU 5160 ; WX 389 ; N uni1428 ; G 1537\nU 5161 ; WX 389 ; N uni1429 ; G 1538\nU 5162 ; WX 389 ; N uni142A ; G 1539\nU 5163 ; WX 1090 ; N uni142B ; G 1540\nU 5164 ; WX 909 ; N uni142C ; G 1541\nU 5165 ; WX 953 ; N uni142D ; G 1542\nU 5166 ; WX 1117 ; N uni142E ; G 1543\nU 5167 ; WX 684 ; N uni142F ; G 1544\nU 5168 ; WX 684 ; N uni1430 ; G 1545\nU 5169 ; WX 684 ; N uni1431 ; G 1546\nU 5170 ; WX 684 ; N uni1432 ; G 1547\nU 5171 ; WX 729 ; N uni1433 ; G 1548\nU 5172 ; WX 729 ; N uni1434 ; G 1549\nU 5173 ; WX 729 ; N uni1435 ; G 1550\nU 5175 ; WX 729 ; N uni1437 ; G 1551\nU 5176 ; WX 729 ; N uni1438 ; G 1552\nU 5177 ; WX 729 ; N uni1439 ; G 1553\nU 5178 ; WX 835 ; N uni143A ; G 1554\nU 5179 ; WX 684 ; N uni143B ; G 1555\nU 5180 ; WX 835 ; N uni143C ; G 1556\nU 5181 ; WX 834 ; N uni143D ; G 1557\nU 5182 ; WX 835 ; N uni143E ; G 1558\nU 5183 ; WX 834 ; N uni143F ; G 1559\nU 5184 ; WX 967 ; N uni1440 ; G 1560\nU 5185 ; WX 1007 ; N uni1441 ; G 1561\nU 5186 ; WX 967 ; N uni1442 ; G 1562\nU 5187 ; WX 1007 ; N uni1443 ; G 1563\nU 5188 ; WX 967 ; N uni1444 ; G 1564\nU 5189 ; WX 1007 ; N uni1445 ; G 1565\nU 5190 ; WX 967 ; N uni1446 ; G 1566\nU 5191 ; WX 1007 ; N uni1447 ; G 1567\nU 5192 ; WX 729 ; N uni1448 ; G 1568\nU 5193 ; WX 508 ; N uni1449 ; G 1569\nU 5194 ; WX 192 ; N uni144A ; G 1570\nU 5196 ; WX 732 ; N uni144C ; G 1571\nU 5197 ; WX 732 ; N uni144D ; G 1572\nU 5198 ; WX 732 ; N uni144E ; G 1573\nU 5199 ; WX 732 ; N uni144F ; G 1574\nU 5200 ; WX 730 ; N uni1450 ; G 1575\nU 5201 ; WX 730 ; N uni1451 ; G 1576\nU 5202 ; WX 730 ; N uni1452 ; G 1577\nU 5204 ; WX 730 ; N uni1454 ; G 1578\nU 5205 ; WX 730 ; N uni1455 ; G 1579\nU 5206 ; WX 730 ; N uni1456 ; G 1580\nU 5207 ; WX 921 ; N uni1457 ; G 1581\nU 5208 ; WX 889 ; N uni1458 ; G 1582\nU 5209 ; WX 921 ; N uni1459 ; G 1583\nU 5210 ; WX 889 ; N uni145A ; G 1584\nU 5211 ; WX 921 ; N uni145B ; G 1585\nU 5212 ; WX 889 ; N uni145C ; G 1586\nU 5213 ; WX 928 ; N uni145D ; G 1587\nU 5214 ; WX 900 ; N uni145E ; G 1588\nU 5215 ; WX 928 ; N uni145F ; G 1589\nU 5216 ; WX 900 ; N uni1460 ; G 1590\nU 5217 ; WX 947 ; N uni1461 ; G 1591\nU 5218 ; WX 900 ; N uni1462 ; G 1592\nU 5219 ; WX 947 ; N uni1463 ; G 1593\nU 5220 ; WX 900 ; N uni1464 ; G 1594\nU 5221 ; WX 947 ; N uni1465 ; G 1595\nU 5222 ; WX 434 ; N uni1466 ; G 1596\nU 5223 ; WX 877 ; N uni1467 ; G 1597\nU 5224 ; WX 877 ; N uni1468 ; G 1598\nU 5225 ; WX 866 ; N uni1469 ; G 1599\nU 5226 ; WX 890 ; N uni146A ; G 1600\nU 5227 ; WX 628 ; N uni146B ; G 1601\nU 5228 ; WX 628 ; N uni146C ; G 1602\nU 5229 ; WX 628 ; N uni146D ; G 1603\nU 5230 ; WX 628 ; N uni146E ; G 1604\nU 5231 ; WX 628 ; N uni146F ; G 1605\nU 5232 ; WX 628 ; N uni1470 ; G 1606\nU 5233 ; WX 628 ; N uni1471 ; G 1607\nU 5234 ; WX 628 ; N uni1472 ; G 1608\nU 5235 ; WX 628 ; N uni1473 ; G 1609\nU 5236 ; WX 860 ; N uni1474 ; G 1610\nU 5237 ; WX 771 ; N uni1475 ; G 1611\nU 5238 ; WX 815 ; N uni1476 ; G 1612\nU 5239 ; WX 816 ; N uni1477 ; G 1613\nU 5240 ; WX 815 ; N uni1478 ; G 1614\nU 5241 ; WX 816 ; N uni1479 ; G 1615\nU 5242 ; WX 860 ; N uni147A ; G 1616\nU 5243 ; WX 771 ; N uni147B ; G 1617\nU 5244 ; WX 860 ; N uni147C ; G 1618\nU 5245 ; WX 771 ; N uni147D ; G 1619\nU 5246 ; WX 815 ; N uni147E ; G 1620\nU 5247 ; WX 816 ; N uni147F ; G 1621\nU 5248 ; WX 815 ; N uni1480 ; G 1622\nU 5249 ; WX 816 ; N uni1481 ; G 1623\nU 5250 ; WX 815 ; N uni1482 ; G 1624\nU 5251 ; WX 407 ; N uni1483 ; G 1625\nU 5252 ; WX 407 ; N uni1484 ; G 1626\nU 5253 ; WX 750 ; N uni1485 ; G 1627\nU 5254 ; WX 775 ; N uni1486 ; G 1628\nU 5255 ; WX 750 ; N uni1487 ; G 1629\nU 5256 ; WX 775 ; N uni1488 ; G 1630\nU 5257 ; WX 628 ; N uni1489 ; G 1631\nU 5258 ; WX 628 ; N uni148A ; G 1632\nU 5259 ; WX 628 ; N uni148B ; G 1633\nU 5260 ; WX 628 ; N uni148C ; G 1634\nU 5261 ; WX 628 ; N uni148D ; G 1635\nU 5262 ; WX 628 ; N uni148E ; G 1636\nU 5263 ; WX 628 ; N uni148F ; G 1637\nU 5264 ; WX 628 ; N uni1490 ; G 1638\nU 5265 ; WX 628 ; N uni1491 ; G 1639\nU 5266 ; WX 860 ; N uni1492 ; G 1640\nU 5267 ; WX 771 ; N uni1493 ; G 1641\nU 5268 ; WX 815 ; N uni1494 ; G 1642\nU 5269 ; WX 816 ; N uni1495 ; G 1643\nU 5270 ; WX 815 ; N uni1496 ; G 1644\nU 5271 ; WX 816 ; N uni1497 ; G 1645\nU 5272 ; WX 860 ; N uni1498 ; G 1646\nU 5273 ; WX 771 ; N uni1499 ; G 1647\nU 5274 ; WX 860 ; N uni149A ; G 1648\nU 5275 ; WX 771 ; N uni149B ; G 1649\nU 5276 ; WX 815 ; N uni149C ; G 1650\nU 5277 ; WX 816 ; N uni149D ; G 1651\nU 5278 ; WX 815 ; N uni149E ; G 1652\nU 5279 ; WX 816 ; N uni149F ; G 1653\nU 5280 ; WX 815 ; N uni14A0 ; G 1654\nU 5281 ; WX 435 ; N uni14A1 ; G 1655\nU 5282 ; WX 435 ; N uni14A2 ; G 1656\nU 5283 ; WX 610 ; N uni14A3 ; G 1657\nU 5284 ; WX 557 ; N uni14A4 ; G 1658\nU 5285 ; WX 557 ; N uni14A5 ; G 1659\nU 5286 ; WX 557 ; N uni14A6 ; G 1660\nU 5287 ; WX 610 ; N uni14A7 ; G 1661\nU 5288 ; WX 610 ; N uni14A8 ; G 1662\nU 5289 ; WX 610 ; N uni14A9 ; G 1663\nU 5290 ; WX 557 ; N uni14AA ; G 1664\nU 5291 ; WX 557 ; N uni14AB ; G 1665\nU 5292 ; WX 749 ; N uni14AC ; G 1666\nU 5293 ; WX 769 ; N uni14AD ; G 1667\nU 5294 ; WX 746 ; N uni14AE ; G 1668\nU 5295 ; WX 764 ; N uni14AF ; G 1669\nU 5296 ; WX 746 ; N uni14B0 ; G 1670\nU 5297 ; WX 764 ; N uni14B1 ; G 1671\nU 5298 ; WX 749 ; N uni14B2 ; G 1672\nU 5299 ; WX 769 ; N uni14B3 ; G 1673\nU 5300 ; WX 749 ; N uni14B4 ; G 1674\nU 5301 ; WX 769 ; N uni14B5 ; G 1675\nU 5302 ; WX 746 ; N uni14B6 ; G 1676\nU 5303 ; WX 764 ; N uni14B7 ; G 1677\nU 5304 ; WX 746 ; N uni14B8 ; G 1678\nU 5305 ; WX 764 ; N uni14B9 ; G 1679\nU 5306 ; WX 746 ; N uni14BA ; G 1680\nU 5307 ; WX 386 ; N uni14BB ; G 1681\nU 5308 ; WX 508 ; N uni14BC ; G 1682\nU 5309 ; WX 386 ; N uni14BD ; G 1683\nU 5312 ; WX 852 ; N uni14C0 ; G 1684\nU 5313 ; WX 852 ; N uni14C1 ; G 1685\nU 5314 ; WX 852 ; N uni14C2 ; G 1686\nU 5315 ; WX 852 ; N uni14C3 ; G 1687\nU 5316 ; WX 852 ; N uni14C4 ; G 1688\nU 5317 ; WX 852 ; N uni14C5 ; G 1689\nU 5318 ; WX 852 ; N uni14C6 ; G 1690\nU 5319 ; WX 852 ; N uni14C7 ; G 1691\nU 5320 ; WX 852 ; N uni14C8 ; G 1692\nU 5321 ; WX 1069 ; N uni14C9 ; G 1693\nU 5322 ; WX 1035 ; N uni14CA ; G 1694\nU 5323 ; WX 1059 ; N uni14CB ; G 1695\nU 5324 ; WX 852 ; N uni14CC ; G 1696\nU 5325 ; WX 1059 ; N uni14CD ; G 1697\nU 5326 ; WX 852 ; N uni14CE ; G 1698\nU 5327 ; WX 852 ; N uni14CF ; G 1699\nU 5328 ; WX 600 ; N uni14D0 ; G 1700\nU 5329 ; WX 453 ; N uni14D1 ; G 1701\nU 5330 ; WX 600 ; N uni14D2 ; G 1702\nU 5331 ; WX 852 ; N uni14D3 ; G 1703\nU 5332 ; WX 852 ; N uni14D4 ; G 1704\nU 5333 ; WX 852 ; N uni14D5 ; G 1705\nU 5334 ; WX 852 ; N uni14D6 ; G 1706\nU 5335 ; WX 852 ; N uni14D7 ; G 1707\nU 5336 ; WX 852 ; N uni14D8 ; G 1708\nU 5337 ; WX 852 ; N uni14D9 ; G 1709\nU 5338 ; WX 852 ; N uni14DA ; G 1710\nU 5339 ; WX 852 ; N uni14DB ; G 1711\nU 5340 ; WX 1069 ; N uni14DC ; G 1712\nU 5341 ; WX 1035 ; N uni14DD ; G 1713\nU 5342 ; WX 1059 ; N uni14DE ; G 1714\nU 5343 ; WX 1030 ; N uni14DF ; G 1715\nU 5344 ; WX 1059 ; N uni14E0 ; G 1716\nU 5345 ; WX 1030 ; N uni14E1 ; G 1717\nU 5346 ; WX 1069 ; N uni14E2 ; G 1718\nU 5347 ; WX 1035 ; N uni14E3 ; G 1719\nU 5348 ; WX 1069 ; N uni14E4 ; G 1720\nU 5349 ; WX 1035 ; N uni14E5 ; G 1721\nU 5350 ; WX 1083 ; N uni14E6 ; G 1722\nU 5351 ; WX 1030 ; N uni14E7 ; G 1723\nU 5352 ; WX 1083 ; N uni14E8 ; G 1724\nU 5353 ; WX 1030 ; N uni14E9 ; G 1725\nU 5354 ; WX 600 ; N uni14EA ; G 1726\nU 5356 ; WX 729 ; N uni14EC ; G 1727\nU 5357 ; WX 603 ; N uni14ED ; G 1728\nU 5358 ; WX 603 ; N uni14EE ; G 1729\nU 5359 ; WX 603 ; N uni14EF ; G 1730\nU 5360 ; WX 603 ; N uni14F0 ; G 1731\nU 5361 ; WX 603 ; N uni14F1 ; G 1732\nU 5362 ; WX 603 ; N uni14F2 ; G 1733\nU 5363 ; WX 603 ; N uni14F3 ; G 1734\nU 5364 ; WX 603 ; N uni14F4 ; G 1735\nU 5365 ; WX 603 ; N uni14F5 ; G 1736\nU 5366 ; WX 834 ; N uni14F6 ; G 1737\nU 5367 ; WX 754 ; N uni14F7 ; G 1738\nU 5368 ; WX 792 ; N uni14F8 ; G 1739\nU 5369 ; WX 771 ; N uni14F9 ; G 1740\nU 5370 ; WX 792 ; N uni14FA ; G 1741\nU 5371 ; WX 771 ; N uni14FB ; G 1742\nU 5372 ; WX 834 ; N uni14FC ; G 1743\nU 5373 ; WX 754 ; N uni14FD ; G 1744\nU 5374 ; WX 834 ; N uni14FE ; G 1745\nU 5375 ; WX 754 ; N uni14FF ; G 1746\nU 5376 ; WX 792 ; N uni1500 ; G 1747\nU 5377 ; WX 771 ; N uni1501 ; G 1748\nU 5378 ; WX 792 ; N uni1502 ; G 1749\nU 5379 ; WX 771 ; N uni1503 ; G 1750\nU 5380 ; WX 792 ; N uni1504 ; G 1751\nU 5381 ; WX 418 ; N uni1505 ; G 1752\nU 5382 ; WX 420 ; N uni1506 ; G 1753\nU 5383 ; WX 418 ; N uni1507 ; G 1754\nU 5392 ; WX 712 ; N uni1510 ; G 1755\nU 5393 ; WX 712 ; N uni1511 ; G 1756\nU 5394 ; WX 712 ; N uni1512 ; G 1757\nU 5395 ; WX 892 ; N uni1513 ; G 1758\nU 5396 ; WX 892 ; N uni1514 ; G 1759\nU 5397 ; WX 892 ; N uni1515 ; G 1760\nU 5398 ; WX 892 ; N uni1516 ; G 1761\nU 5399 ; WX 910 ; N uni1517 ; G 1762\nU 5400 ; WX 872 ; N uni1518 ; G 1763\nU 5401 ; WX 910 ; N uni1519 ; G 1764\nU 5402 ; WX 872 ; N uni151A ; G 1765\nU 5403 ; WX 910 ; N uni151B ; G 1766\nU 5404 ; WX 872 ; N uni151C ; G 1767\nU 5405 ; WX 1140 ; N uni151D ; G 1768\nU 5406 ; WX 1100 ; N uni151E ; G 1769\nU 5407 ; WX 1140 ; N uni151F ; G 1770\nU 5408 ; WX 1100 ; N uni1520 ; G 1771\nU 5409 ; WX 1140 ; N uni1521 ; G 1772\nU 5410 ; WX 1100 ; N uni1522 ; G 1773\nU 5411 ; WX 1140 ; N uni1523 ; G 1774\nU 5412 ; WX 1100 ; N uni1524 ; G 1775\nU 5413 ; WX 641 ; N uni1525 ; G 1776\nU 5414 ; WX 627 ; N uni1526 ; G 1777\nU 5415 ; WX 627 ; N uni1527 ; G 1778\nU 5416 ; WX 627 ; N uni1528 ; G 1779\nU 5417 ; WX 627 ; N uni1529 ; G 1780\nU 5418 ; WX 627 ; N uni152A ; G 1781\nU 5419 ; WX 627 ; N uni152B ; G 1782\nU 5420 ; WX 627 ; N uni152C ; G 1783\nU 5421 ; WX 627 ; N uni152D ; G 1784\nU 5422 ; WX 627 ; N uni152E ; G 1785\nU 5423 ; WX 844 ; N uni152F ; G 1786\nU 5424 ; WX 781 ; N uni1530 ; G 1787\nU 5425 ; WX 816 ; N uni1531 ; G 1788\nU 5426 ; WX 818 ; N uni1532 ; G 1789\nU 5427 ; WX 816 ; N uni1533 ; G 1790\nU 5428 ; WX 818 ; N uni1534 ; G 1791\nU 5429 ; WX 844 ; N uni1535 ; G 1792\nU 5430 ; WX 781 ; N uni1536 ; G 1793\nU 5431 ; WX 844 ; N uni1537 ; G 1794\nU 5432 ; WX 781 ; N uni1538 ; G 1795\nU 5433 ; WX 816 ; N uni1539 ; G 1796\nU 5434 ; WX 818 ; N uni153A ; G 1797\nU 5435 ; WX 816 ; N uni153B ; G 1798\nU 5436 ; WX 818 ; N uni153C ; G 1799\nU 5437 ; WX 816 ; N uni153D ; G 1800\nU 5438 ; WX 418 ; N uni153E ; G 1801\nU 5440 ; WX 389 ; N uni1540 ; G 1802\nU 5441 ; WX 484 ; N uni1541 ; G 1803\nU 5442 ; WX 916 ; N uni1542 ; G 1804\nU 5443 ; WX 916 ; N uni1543 ; G 1805\nU 5444 ; WX 863 ; N uni1544 ; G 1806\nU 5445 ; WX 916 ; N uni1545 ; G 1807\nU 5446 ; WX 863 ; N uni1546 ; G 1808\nU 5447 ; WX 863 ; N uni1547 ; G 1809\nU 5448 ; WX 603 ; N uni1548 ; G 1810\nU 5449 ; WX 603 ; N uni1549 ; G 1811\nU 5450 ; WX 603 ; N uni154A ; G 1812\nU 5451 ; WX 603 ; N uni154B ; G 1813\nU 5452 ; WX 603 ; N uni154C ; G 1814\nU 5453 ; WX 603 ; N uni154D ; G 1815\nU 5454 ; WX 834 ; N uni154E ; G 1816\nU 5455 ; WX 754 ; N uni154F ; G 1817\nU 5456 ; WX 418 ; N uni1550 ; G 1818\nU 5458 ; WX 729 ; N uni1552 ; G 1819\nU 5459 ; WX 684 ; N uni1553 ; G 1820\nU 5460 ; WX 684 ; N uni1554 ; G 1821\nU 5461 ; WX 684 ; N uni1555 ; G 1822\nU 5462 ; WX 684 ; N uni1556 ; G 1823\nU 5463 ; WX 726 ; N uni1557 ; G 1824\nU 5464 ; WX 726 ; N uni1558 ; G 1825\nU 5465 ; WX 726 ; N uni1559 ; G 1826\nU 5466 ; WX 726 ; N uni155A ; G 1827\nU 5467 ; WX 924 ; N uni155B ; G 1828\nU 5468 ; WX 1007 ; N uni155C ; G 1829\nU 5469 ; WX 508 ; N uni155D ; G 1830\nU 5470 ; WX 732 ; N uni155E ; G 1831\nU 5471 ; WX 732 ; N uni155F ; G 1832\nU 5472 ; WX 732 ; N uni1560 ; G 1833\nU 5473 ; WX 732 ; N uni1561 ; G 1834\nU 5474 ; WX 732 ; N uni1562 ; G 1835\nU 5475 ; WX 732 ; N uni1563 ; G 1836\nU 5476 ; WX 730 ; N uni1564 ; G 1837\nU 5477 ; WX 730 ; N uni1565 ; G 1838\nU 5478 ; WX 730 ; N uni1566 ; G 1839\nU 5479 ; WX 730 ; N uni1567 ; G 1840\nU 5480 ; WX 947 ; N uni1568 ; G 1841\nU 5481 ; WX 900 ; N uni1569 ; G 1842\nU 5482 ; WX 508 ; N uni156A ; G 1843\nU 5492 ; WX 831 ; N uni1574 ; G 1844\nU 5493 ; WX 831 ; N uni1575 ; G 1845\nU 5494 ; WX 831 ; N uni1576 ; G 1846\nU 5495 ; WX 831 ; N uni1577 ; G 1847\nU 5496 ; WX 831 ; N uni1578 ; G 1848\nU 5497 ; WX 831 ; N uni1579 ; G 1849\nU 5498 ; WX 831 ; N uni157A ; G 1850\nU 5499 ; WX 563 ; N uni157B ; G 1851\nU 5500 ; WX 752 ; N uni157C ; G 1852\nU 5501 ; WX 484 ; N uni157D ; G 1853\nU 5502 ; WX 1047 ; N uni157E ; G 1854\nU 5503 ; WX 1047 ; N uni157F ; G 1855\nU 5504 ; WX 1047 ; N uni1580 ; G 1856\nU 5505 ; WX 1047 ; N uni1581 ; G 1857\nU 5506 ; WX 1047 ; N uni1582 ; G 1858\nU 5507 ; WX 1047 ; N uni1583 ; G 1859\nU 5508 ; WX 1047 ; N uni1584 ; G 1860\nU 5509 ; WX 825 ; N uni1585 ; G 1861\nU 5514 ; WX 831 ; N uni158A ; G 1862\nU 5515 ; WX 831 ; N uni158B ; G 1863\nU 5516 ; WX 831 ; N uni158C ; G 1864\nU 5517 ; WX 831 ; N uni158D ; G 1865\nU 5518 ; WX 1259 ; N uni158E ; G 1866\nU 5519 ; WX 1259 ; N uni158F ; G 1867\nU 5520 ; WX 1259 ; N uni1590 ; G 1868\nU 5521 ; WX 1002 ; N uni1591 ; G 1869\nU 5522 ; WX 1002 ; N uni1592 ; G 1870\nU 5523 ; WX 1259 ; N uni1593 ; G 1871\nU 5524 ; WX 1259 ; N uni1594 ; G 1872\nU 5525 ; WX 700 ; N uni1595 ; G 1873\nU 5526 ; WX 1073 ; N uni1596 ; G 1874\nU 5536 ; WX 852 ; N uni15A0 ; G 1875\nU 5537 ; WX 852 ; N uni15A1 ; G 1876\nU 5538 ; WX 799 ; N uni15A2 ; G 1877\nU 5539 ; WX 799 ; N uni15A3 ; G 1878\nU 5540 ; WX 799 ; N uni15A4 ; G 1879\nU 5541 ; WX 799 ; N uni15A5 ; G 1880\nU 5542 ; WX 600 ; N uni15A6 ; G 1881\nU 5543 ; WX 643 ; N uni15A7 ; G 1882\nU 5544 ; WX 643 ; N uni15A8 ; G 1883\nU 5545 ; WX 643 ; N uni15A9 ; G 1884\nU 5546 ; WX 643 ; N uni15AA ; G 1885\nU 5547 ; WX 643 ; N uni15AB ; G 1886\nU 5548 ; WX 643 ; N uni15AC ; G 1887\nU 5549 ; WX 643 ; N uni15AD ; G 1888\nU 5550 ; WX 418 ; N uni15AE ; G 1889\nU 5551 ; WX 628 ; N uni15AF ; G 1890\nU 5598 ; WX 770 ; N uni15DE ; G 1891\nU 5601 ; WX 770 ; N uni15E1 ; G 1892\nU 5702 ; WX 468 ; N uni1646 ; G 1893\nU 5703 ; WX 468 ; N uni1647 ; G 1894\nU 5742 ; WX 444 ; N uni166E ; G 1895\nU 5743 ; WX 1047 ; N uni166F ; G 1896\nU 5744 ; WX 1310 ; N uni1670 ; G 1897\nU 5745 ; WX 1632 ; N uni1671 ; G 1898\nU 5746 ; WX 1632 ; N uni1672 ; G 1899\nU 5747 ; WX 1375 ; N uni1673 ; G 1900\nU 5748 ; WX 1375 ; N uni1674 ; G 1901\nU 5749 ; WX 1632 ; N uni1675 ; G 1902\nU 5750 ; WX 1632 ; N uni1676 ; G 1903\nU 7424 ; WX 592 ; N uni1D00 ; G 1904\nU 7425 ; WX 717 ; N uni1D01 ; G 1905\nU 7426 ; WX 982 ; N uni1D02 ; G 1906\nU 7427 ; WX 586 ; N uni1D03 ; G 1907\nU 7428 ; WX 550 ; N uni1D04 ; G 1908\nU 7429 ; WX 605 ; N uni1D05 ; G 1909\nU 7430 ; WX 605 ; N uni1D06 ; G 1910\nU 7431 ; WX 491 ; N uni1D07 ; G 1911\nU 7432 ; WX 541 ; N uni1D08 ; G 1912\nU 7433 ; WX 278 ; N uni1D09 ; G 1913\nU 7434 ; WX 395 ; N uni1D0A ; G 1914\nU 7435 ; WX 579 ; N uni1D0B ; G 1915\nU 7436 ; WX 583 ; N uni1D0C ; G 1916\nU 7437 ; WX 754 ; N uni1D0D ; G 1917\nU 7438 ; WX 650 ; N uni1D0E ; G 1918\nU 7439 ; WX 612 ; N uni1D0F ; G 1919\nU 7440 ; WX 550 ; N uni1D10 ; G 1920\nU 7441 ; WX 684 ; N uni1D11 ; G 1921\nU 7442 ; WX 684 ; N uni1D12 ; G 1922\nU 7443 ; WX 684 ; N uni1D13 ; G 1923\nU 7444 ; WX 1023 ; N uni1D14 ; G 1924\nU 7446 ; WX 612 ; N uni1D16 ; G 1925\nU 7447 ; WX 612 ; N uni1D17 ; G 1926\nU 7448 ; WX 524 ; N uni1D18 ; G 1927\nU 7449 ; WX 602 ; N uni1D19 ; G 1928\nU 7450 ; WX 602 ; N uni1D1A ; G 1929\nU 7451 ; WX 583 ; N uni1D1B ; G 1930\nU 7452 ; WX 574 ; N uni1D1C ; G 1931\nU 7453 ; WX 737 ; N uni1D1D ; G 1932\nU 7454 ; WX 948 ; N uni1D1E ; G 1933\nU 7455 ; WX 638 ; N uni1D1F ; G 1934\nU 7456 ; WX 592 ; N uni1D20 ; G 1935\nU 7457 ; WX 818 ; N uni1D21 ; G 1936\nU 7458 ; WX 525 ; N uni1D22 ; G 1937\nU 7459 ; WX 526 ; N uni1D23 ; G 1938\nU 7462 ; WX 583 ; N uni1D26 ; G 1939\nU 7463 ; WX 592 ; N uni1D27 ; G 1940\nU 7464 ; WX 564 ; N uni1D28 ; G 1941\nU 7465 ; WX 524 ; N uni1D29 ; G 1942\nU 7466 ; WX 590 ; N uni1D2A ; G 1943\nU 7467 ; WX 639 ; N uni1D2B ; G 1944\nU 7468 ; WX 431 ; N uni1D2C ; G 1945\nU 7469 ; WX 613 ; N uni1D2D ; G 1946\nU 7470 ; WX 432 ; N uni1D2E ; G 1947\nU 7472 ; WX 485 ; N uni1D30 ; G 1948\nU 7473 ; WX 398 ; N uni1D31 ; G 1949\nU 7474 ; WX 398 ; N uni1D32 ; G 1950\nU 7475 ; WX 488 ; N uni1D33 ; G 1951\nU 7476 ; WX 474 ; N uni1D34 ; G 1952\nU 7477 ; WX 186 ; N uni1D35 ; G 1953\nU 7478 ; WX 186 ; N uni1D36 ; G 1954\nU 7479 ; WX 413 ; N uni1D37 ; G 1955\nU 7480 ; WX 351 ; N uni1D38 ; G 1956\nU 7481 ; WX 543 ; N uni1D39 ; G 1957\nU 7482 ; WX 471 ; N uni1D3A ; G 1958\nU 7483 ; WX 471 ; N uni1D3B ; G 1959\nU 7484 ; WX 496 ; N uni1D3C ; G 1960\nU 7485 ; WX 439 ; N uni1D3D ; G 1961\nU 7486 ; WX 380 ; N uni1D3E ; G 1962\nU 7487 ; WX 438 ; N uni1D3F ; G 1963\nU 7488 ; WX 385 ; N uni1D40 ; G 1964\nU 7489 ; WX 461 ; N uni1D41 ; G 1965\nU 7490 ; WX 623 ; N uni1D42 ; G 1966\nU 7491 ; WX 392 ; N uni1D43 ; G 1967\nU 7492 ; WX 392 ; N uni1D44 ; G 1968\nU 7493 ; WX 405 ; N uni1D45 ; G 1969\nU 7494 ; WX 648 ; N uni1D46 ; G 1970\nU 7495 ; WX 428 ; N uni1D47 ; G 1971\nU 7496 ; WX 405 ; N uni1D48 ; G 1972\nU 7497 ; WX 417 ; N uni1D49 ; G 1973\nU 7498 ; WX 417 ; N uni1D4A ; G 1974\nU 7499 ; WX 360 ; N uni1D4B ; G 1975\nU 7500 ; WX 359 ; N uni1D4C ; G 1976\nU 7501 ; WX 405 ; N uni1D4D ; G 1977\nU 7502 ; WX 179 ; N uni1D4E ; G 1978\nU 7503 ; WX 426 ; N uni1D4F ; G 1979\nU 7504 ; WX 623 ; N uni1D50 ; G 1980\nU 7505 ; WX 409 ; N uni1D51 ; G 1981\nU 7506 ; WX 414 ; N uni1D52 ; G 1982\nU 7507 ; WX 370 ; N uni1D53 ; G 1983\nU 7508 ; WX 414 ; N uni1D54 ; G 1984\nU 7509 ; WX 414 ; N uni1D55 ; G 1985\nU 7510 ; WX 428 ; N uni1D56 ; G 1986\nU 7511 ; WX 295 ; N uni1D57 ; G 1987\nU 7512 ; WX 405 ; N uni1D58 ; G 1988\nU 7513 ; WX 470 ; N uni1D59 ; G 1989\nU 7514 ; WX 623 ; N uni1D5A ; G 1990\nU 7515 ; WX 417 ; N uni1D5B ; G 1991\nU 7517 ; WX 402 ; N uni1D5D ; G 1992\nU 7518 ; WX 373 ; N uni1D5E ; G 1993\nU 7519 ; WX 385 ; N uni1D5F ; G 1994\nU 7520 ; WX 416 ; N uni1D60 ; G 1995\nU 7521 ; WX 364 ; N uni1D61 ; G 1996\nU 7522 ; WX 179 ; N uni1D62 ; G 1997\nU 7523 ; WX 259 ; N uni1D63 ; G 1998\nU 7524 ; WX 405 ; N uni1D64 ; G 1999\nU 7525 ; WX 417 ; N uni1D65 ; G 2000\nU 7526 ; WX 402 ; N uni1D66 ; G 2001\nU 7527 ; WX 373 ; N uni1D67 ; G 2002\nU 7528 ; WX 412 ; N uni1D68 ; G 2003\nU 7529 ; WX 416 ; N uni1D69 ; G 2004\nU 7530 ; WX 364 ; N uni1D6A ; G 2005\nU 7543 ; WX 635 ; N uni1D77 ; G 2006\nU 7544 ; WX 474 ; N uni1D78 ; G 2007\nU 7547 ; WX 372 ; N uni1D7B ; G 2008\nU 7549 ; WX 667 ; N uni1D7D ; G 2009\nU 7557 ; WX 278 ; N uni1D85 ; G 2010\nU 7579 ; WX 405 ; N uni1D9B ; G 2011\nU 7580 ; WX 370 ; N uni1D9C ; G 2012\nU 7581 ; WX 370 ; N uni1D9D ; G 2013\nU 7582 ; WX 414 ; N uni1D9E ; G 2014\nU 7583 ; WX 360 ; N uni1D9F ; G 2015\nU 7584 ; WX 296 ; N uni1DA0 ; G 2016\nU 7585 ; WX 233 ; N uni1DA1 ; G 2017\nU 7586 ; WX 405 ; N uni1DA2 ; G 2018\nU 7587 ; WX 405 ; N uni1DA3 ; G 2019\nU 7588 ; WX 261 ; N uni1DA4 ; G 2020\nU 7589 ; WX 250 ; N uni1DA5 ; G 2021\nU 7590 ; WX 261 ; N uni1DA6 ; G 2022\nU 7591 ; WX 261 ; N uni1DA7 ; G 2023\nU 7592 ; WX 234 ; N uni1DA8 ; G 2024\nU 7593 ; WX 250 ; N uni1DA9 ; G 2025\nU 7594 ; WX 235 ; N uni1DAA ; G 2026\nU 7595 ; WX 376 ; N uni1DAB ; G 2027\nU 7596 ; WX 623 ; N uni1DAC ; G 2028\nU 7597 ; WX 623 ; N uni1DAD ; G 2029\nU 7598 ; WX 411 ; N uni1DAE ; G 2030\nU 7599 ; WX 479 ; N uni1DAF ; G 2031\nU 7600 ; WX 409 ; N uni1DB0 ; G 2032\nU 7601 ; WX 414 ; N uni1DB1 ; G 2033\nU 7602 ; WX 414 ; N uni1DB2 ; G 2034\nU 7603 ; WX 360 ; N uni1DB3 ; G 2035\nU 7604 ; WX 287 ; N uni1DB4 ; G 2036\nU 7605 ; WX 295 ; N uni1DB5 ; G 2037\nU 7606 ; WX 508 ; N uni1DB6 ; G 2038\nU 7607 ; WX 418 ; N uni1DB7 ; G 2039\nU 7608 ; WX 361 ; N uni1DB8 ; G 2040\nU 7609 ; WX 406 ; N uni1DB9 ; G 2041\nU 7610 ; WX 417 ; N uni1DBA ; G 2042\nU 7611 ; WX 366 ; N uni1DBB ; G 2043\nU 7612 ; WX 437 ; N uni1DBC ; G 2044\nU 7613 ; WX 366 ; N uni1DBD ; G 2045\nU 7614 ; WX 392 ; N uni1DBE ; G 2046\nU 7615 ; WX 414 ; N uni1DBF ; G 2047\nU 7620 ; WX 0 ; N uni1DC4 ; G 2048\nU 7621 ; WX 0 ; N uni1DC5 ; G 2049\nU 7622 ; WX 0 ; N uni1DC6 ; G 2050\nU 7623 ; WX 0 ; N uni1DC7 ; G 2051\nU 7624 ; WX 0 ; N uni1DC8 ; G 2052\nU 7625 ; WX 0 ; N uni1DC9 ; G 2053\nU 7680 ; WX 684 ; N uni1E00 ; G 2054\nU 7681 ; WX 613 ; N uni1E01 ; G 2055\nU 7682 ; WX 686 ; N uni1E02 ; G 2056\nU 7683 ; WX 635 ; N uni1E03 ; G 2057\nU 7684 ; WX 686 ; N uni1E04 ; G 2058\nU 7685 ; WX 635 ; N uni1E05 ; G 2059\nU 7686 ; WX 686 ; N uni1E06 ; G 2060\nU 7687 ; WX 635 ; N uni1E07 ; G 2061\nU 7688 ; WX 698 ; N uni1E08 ; G 2062\nU 7689 ; WX 550 ; N uni1E09 ; G 2063\nU 7690 ; WX 770 ; N uni1E0A ; G 2064\nU 7691 ; WX 635 ; N uni1E0B ; G 2065\nU 7692 ; WX 770 ; N uni1E0C ; G 2066\nU 7693 ; WX 635 ; N uni1E0D ; G 2067\nU 7694 ; WX 770 ; N uni1E0E ; G 2068\nU 7695 ; WX 635 ; N uni1E0F ; G 2069\nU 7696 ; WX 770 ; N uni1E10 ; G 2070\nU 7697 ; WX 635 ; N uni1E11 ; G 2071\nU 7698 ; WX 770 ; N uni1E12 ; G 2072\nU 7699 ; WX 635 ; N uni1E13 ; G 2073\nU 7700 ; WX 632 ; N uni1E14 ; G 2074\nU 7701 ; WX 615 ; N uni1E15 ; G 2075\nU 7702 ; WX 632 ; N uni1E16 ; G 2076\nU 7703 ; WX 615 ; N uni1E17 ; G 2077\nU 7704 ; WX 632 ; N uni1E18 ; G 2078\nU 7705 ; WX 615 ; N uni1E19 ; G 2079\nU 7706 ; WX 632 ; N uni1E1A ; G 2080\nU 7707 ; WX 615 ; N uni1E1B ; G 2081\nU 7708 ; WX 632 ; N uni1E1C ; G 2082\nU 7709 ; WX 615 ; N uni1E1D ; G 2083\nU 7710 ; WX 575 ; N uni1E1E ; G 2084\nU 7711 ; WX 352 ; N uni1E1F ; G 2085\nU 7712 ; WX 775 ; N uni1E20 ; G 2086\nU 7713 ; WX 635 ; N uni1E21 ; G 2087\nU 7714 ; WX 752 ; N uni1E22 ; G 2088\nU 7715 ; WX 634 ; N uni1E23 ; G 2089\nU 7716 ; WX 752 ; N uni1E24 ; G 2090\nU 7717 ; WX 634 ; N uni1E25 ; G 2091\nU 7718 ; WX 752 ; N uni1E26 ; G 2092\nU 7719 ; WX 634 ; N uni1E27 ; G 2093\nU 7720 ; WX 752 ; N uni1E28 ; G 2094\nU 7721 ; WX 634 ; N uni1E29 ; G 2095\nU 7722 ; WX 752 ; N uni1E2A ; G 2096\nU 7723 ; WX 634 ; N uni1E2B ; G 2097\nU 7724 ; WX 295 ; N uni1E2C ; G 2098\nU 7725 ; WX 278 ; N uni1E2D ; G 2099\nU 7726 ; WX 295 ; N uni1E2E ; G 2100\nU 7727 ; WX 278 ; N uni1E2F ; G 2101\nU 7728 ; WX 656 ; N uni1E30 ; G 2102\nU 7729 ; WX 579 ; N uni1E31 ; G 2103\nU 7730 ; WX 656 ; N uni1E32 ; G 2104\nU 7731 ; WX 579 ; N uni1E33 ; G 2105\nU 7732 ; WX 656 ; N uni1E34 ; G 2106\nU 7733 ; WX 579 ; N uni1E35 ; G 2107\nU 7734 ; WX 557 ; N uni1E36 ; G 2108\nU 7735 ; WX 278 ; N uni1E37 ; G 2109\nU 7736 ; WX 557 ; N uni1E38 ; G 2110\nU 7737 ; WX 278 ; N uni1E39 ; G 2111\nU 7738 ; WX 557 ; N uni1E3A ; G 2112\nU 7739 ; WX 278 ; N uni1E3B ; G 2113\nU 7740 ; WX 557 ; N uni1E3C ; G 2114\nU 7741 ; WX 278 ; N uni1E3D ; G 2115\nU 7742 ; WX 863 ; N uni1E3E ; G 2116\nU 7743 ; WX 974 ; N uni1E3F ; G 2117\nU 7744 ; WX 863 ; N uni1E40 ; G 2118\nU 7745 ; WX 974 ; N uni1E41 ; G 2119\nU 7746 ; WX 863 ; N uni1E42 ; G 2120\nU 7747 ; WX 974 ; N uni1E43 ; G 2121\nU 7748 ; WX 748 ; N uni1E44 ; G 2122\nU 7749 ; WX 634 ; N uni1E45 ; G 2123\nU 7750 ; WX 748 ; N uni1E46 ; G 2124\nU 7751 ; WX 634 ; N uni1E47 ; G 2125\nU 7752 ; WX 748 ; N uni1E48 ; G 2126\nU 7753 ; WX 634 ; N uni1E49 ; G 2127\nU 7754 ; WX 748 ; N uni1E4A ; G 2128\nU 7755 ; WX 634 ; N uni1E4B ; G 2129\nU 7756 ; WX 787 ; N uni1E4C ; G 2130\nU 7757 ; WX 612 ; N uni1E4D ; G 2131\nU 7758 ; WX 787 ; N uni1E4E ; G 2132\nU 7759 ; WX 612 ; N uni1E4F ; G 2133\nU 7760 ; WX 787 ; N uni1E50 ; G 2134\nU 7761 ; WX 612 ; N uni1E51 ; G 2135\nU 7762 ; WX 787 ; N uni1E52 ; G 2136\nU 7763 ; WX 612 ; N uni1E53 ; G 2137\nU 7764 ; WX 603 ; N uni1E54 ; G 2138\nU 7765 ; WX 635 ; N uni1E55 ; G 2139\nU 7766 ; WX 603 ; N uni1E56 ; G 2140\nU 7767 ; WX 635 ; N uni1E57 ; G 2141\nU 7768 ; WX 695 ; N uni1E58 ; G 2142\nU 7769 ; WX 411 ; N uni1E59 ; G 2143\nU 7770 ; WX 695 ; N uni1E5A ; G 2144\nU 7771 ; WX 411 ; N uni1E5B ; G 2145\nU 7772 ; WX 695 ; N uni1E5C ; G 2146\nU 7773 ; WX 411 ; N uni1E5D ; G 2147\nU 7774 ; WX 695 ; N uni1E5E ; G 2148\nU 7775 ; WX 411 ; N uni1E5F ; G 2149\nU 7776 ; WX 635 ; N uni1E60 ; G 2150\nU 7777 ; WX 521 ; N uni1E61 ; G 2151\nU 7778 ; WX 635 ; N uni1E62 ; G 2152\nU 7779 ; WX 521 ; N uni1E63 ; G 2153\nU 7780 ; WX 635 ; N uni1E64 ; G 2154\nU 7781 ; WX 521 ; N uni1E65 ; G 2155\nU 7782 ; WX 635 ; N uni1E66 ; G 2156\nU 7783 ; WX 521 ; N uni1E67 ; G 2157\nU 7784 ; WX 635 ; N uni1E68 ; G 2158\nU 7785 ; WX 521 ; N uni1E69 ; G 2159\nU 7786 ; WX 611 ; N uni1E6A ; G 2160\nU 7787 ; WX 392 ; N uni1E6B ; G 2161\nU 7788 ; WX 611 ; N uni1E6C ; G 2162\nU 7789 ; WX 392 ; N uni1E6D ; G 2163\nU 7790 ; WX 611 ; N uni1E6E ; G 2164\nU 7791 ; WX 392 ; N uni1E6F ; G 2165\nU 7792 ; WX 611 ; N uni1E70 ; G 2166\nU 7793 ; WX 392 ; N uni1E71 ; G 2167\nU 7794 ; WX 732 ; N uni1E72 ; G 2168\nU 7795 ; WX 634 ; N uni1E73 ; G 2169\nU 7796 ; WX 732 ; N uni1E74 ; G 2170\nU 7797 ; WX 634 ; N uni1E75 ; G 2171\nU 7798 ; WX 732 ; N uni1E76 ; G 2172\nU 7799 ; WX 634 ; N uni1E77 ; G 2173\nU 7800 ; WX 732 ; N uni1E78 ; G 2174\nU 7801 ; WX 634 ; N uni1E79 ; G 2175\nU 7802 ; WX 732 ; N uni1E7A ; G 2176\nU 7803 ; WX 634 ; N uni1E7B ; G 2177\nU 7804 ; WX 684 ; N uni1E7C ; G 2178\nU 7805 ; WX 592 ; N uni1E7D ; G 2179\nU 7806 ; WX 684 ; N uni1E7E ; G 2180\nU 7807 ; WX 592 ; N uni1E7F ; G 2181\nU 7808 ; WX 989 ; N Wgrave ; G 2182\nU 7809 ; WX 818 ; N wgrave ; G 2183\nU 7810 ; WX 989 ; N Wacute ; G 2184\nU 7811 ; WX 818 ; N wacute ; G 2185\nU 7812 ; WX 989 ; N Wdieresis ; G 2186\nU 7813 ; WX 818 ; N wdieresis ; G 2187\nU 7814 ; WX 989 ; N uni1E86 ; G 2188\nU 7815 ; WX 818 ; N uni1E87 ; G 2189\nU 7816 ; WX 989 ; N uni1E88 ; G 2190\nU 7817 ; WX 818 ; N uni1E89 ; G 2191\nU 7818 ; WX 685 ; N uni1E8A ; G 2192\nU 7819 ; WX 592 ; N uni1E8B ; G 2193\nU 7820 ; WX 685 ; N uni1E8C ; G 2194\nU 7821 ; WX 592 ; N uni1E8D ; G 2195\nU 7822 ; WX 611 ; N uni1E8E ; G 2196\nU 7823 ; WX 592 ; N uni1E8F ; G 2197\nU 7824 ; WX 685 ; N uni1E90 ; G 2198\nU 7825 ; WX 525 ; N uni1E91 ; G 2199\nU 7826 ; WX 685 ; N uni1E92 ; G 2200\nU 7827 ; WX 525 ; N uni1E93 ; G 2201\nU 7828 ; WX 685 ; N uni1E94 ; G 2202\nU 7829 ; WX 525 ; N uni1E95 ; G 2203\nU 7830 ; WX 634 ; N uni1E96 ; G 2204\nU 7831 ; WX 392 ; N uni1E97 ; G 2205\nU 7832 ; WX 818 ; N uni1E98 ; G 2206\nU 7833 ; WX 592 ; N uni1E99 ; G 2207\nU 7834 ; WX 613 ; N uni1E9A ; G 2208\nU 7835 ; WX 352 ; N uni1E9B ; G 2209\nU 7836 ; WX 352 ; N uni1E9C ; G 2210\nU 7837 ; WX 352 ; N uni1E9D ; G 2211\nU 7838 ; WX 769 ; N uni1E9E ; G 2212\nU 7839 ; WX 612 ; N uni1E9F ; G 2213\nU 7840 ; WX 684 ; N uni1EA0 ; G 2214\nU 7841 ; WX 613 ; N uni1EA1 ; G 2215\nU 7842 ; WX 684 ; N uni1EA2 ; G 2216\nU 7843 ; WX 613 ; N uni1EA3 ; G 2217\nU 7844 ; WX 684 ; N uni1EA4 ; G 2218\nU 7845 ; WX 613 ; N uni1EA5 ; G 2219\nU 7846 ; WX 684 ; N uni1EA6 ; G 2220\nU 7847 ; WX 613 ; N uni1EA7 ; G 2221\nU 7848 ; WX 684 ; N uni1EA8 ; G 2222\nU 7849 ; WX 613 ; N uni1EA9 ; G 2223\nU 7850 ; WX 684 ; N uni1EAA ; G 2224\nU 7851 ; WX 613 ; N uni1EAB ; G 2225\nU 7852 ; WX 684 ; N uni1EAC ; G 2226\nU 7853 ; WX 613 ; N uni1EAD ; G 2227\nU 7854 ; WX 684 ; N uni1EAE ; G 2228\nU 7855 ; WX 613 ; N uni1EAF ; G 2229\nU 7856 ; WX 684 ; N uni1EB0 ; G 2230\nU 7857 ; WX 613 ; N uni1EB1 ; G 2231\nU 7858 ; WX 684 ; N uni1EB2 ; G 2232\nU 7859 ; WX 613 ; N uni1EB3 ; G 2233\nU 7860 ; WX 684 ; N uni1EB4 ; G 2234\nU 7861 ; WX 613 ; N uni1EB5 ; G 2235\nU 7862 ; WX 684 ; N uni1EB6 ; G 2236\nU 7863 ; WX 613 ; N uni1EB7 ; G 2237\nU 7864 ; WX 632 ; N uni1EB8 ; G 2238\nU 7865 ; WX 615 ; N uni1EB9 ; G 2239\nU 7866 ; WX 632 ; N uni1EBA ; G 2240\nU 7867 ; WX 615 ; N uni1EBB ; G 2241\nU 7868 ; WX 632 ; N uni1EBC ; G 2242\nU 7869 ; WX 615 ; N uni1EBD ; G 2243\nU 7870 ; WX 632 ; N uni1EBE ; G 2244\nU 7871 ; WX 615 ; N uni1EBF ; G 2245\nU 7872 ; WX 632 ; N uni1EC0 ; G 2246\nU 7873 ; WX 615 ; N uni1EC1 ; G 2247\nU 7874 ; WX 632 ; N uni1EC2 ; G 2248\nU 7875 ; WX 615 ; N uni1EC3 ; G 2249\nU 7876 ; WX 632 ; N uni1EC4 ; G 2250\nU 7877 ; WX 615 ; N uni1EC5 ; G 2251\nU 7878 ; WX 632 ; N uni1EC6 ; G 2252\nU 7879 ; WX 615 ; N uni1EC7 ; G 2253\nU 7880 ; WX 295 ; N uni1EC8 ; G 2254\nU 7881 ; WX 278 ; N uni1EC9 ; G 2255\nU 7882 ; WX 295 ; N uni1ECA ; G 2256\nU 7883 ; WX 278 ; N uni1ECB ; G 2257\nU 7884 ; WX 787 ; N uni1ECC ; G 2258\nU 7885 ; WX 612 ; N uni1ECD ; G 2259\nU 7886 ; WX 787 ; N uni1ECE ; G 2260\nU 7887 ; WX 612 ; N uni1ECF ; G 2261\nU 7888 ; WX 787 ; N uni1ED0 ; G 2262\nU 7889 ; WX 612 ; N uni1ED1 ; G 2263\nU 7890 ; WX 787 ; N uni1ED2 ; G 2264\nU 7891 ; WX 612 ; N uni1ED3 ; G 2265\nU 7892 ; WX 787 ; N uni1ED4 ; G 2266\nU 7893 ; WX 612 ; N uni1ED5 ; G 2267\nU 7894 ; WX 787 ; N uni1ED6 ; G 2268\nU 7895 ; WX 612 ; N uni1ED7 ; G 2269\nU 7896 ; WX 787 ; N uni1ED8 ; G 2270\nU 7897 ; WX 612 ; N uni1ED9 ; G 2271\nU 7898 ; WX 913 ; N uni1EDA ; G 2272\nU 7899 ; WX 612 ; N uni1EDB ; G 2273\nU 7900 ; WX 913 ; N uni1EDC ; G 2274\nU 7901 ; WX 612 ; N uni1EDD ; G 2275\nU 7902 ; WX 913 ; N uni1EDE ; G 2276\nU 7903 ; WX 612 ; N uni1EDF ; G 2277\nU 7904 ; WX 913 ; N uni1EE0 ; G 2278\nU 7905 ; WX 612 ; N uni1EE1 ; G 2279\nU 7906 ; WX 913 ; N uni1EE2 ; G 2280\nU 7907 ; WX 612 ; N uni1EE3 ; G 2281\nU 7908 ; WX 732 ; N uni1EE4 ; G 2282\nU 7909 ; WX 634 ; N uni1EE5 ; G 2283\nU 7910 ; WX 732 ; N uni1EE6 ; G 2284\nU 7911 ; WX 634 ; N uni1EE7 ; G 2285\nU 7912 ; WX 838 ; N uni1EE8 ; G 2286\nU 7913 ; WX 634 ; N uni1EE9 ; G 2287\nU 7914 ; WX 838 ; N uni1EEA ; G 2288\nU 7915 ; WX 634 ; N uni1EEB ; G 2289\nU 7916 ; WX 838 ; N uni1EEC ; G 2290\nU 7917 ; WX 634 ; N uni1EED ; G 2291\nU 7918 ; WX 838 ; N uni1EEE ; G 2292\nU 7919 ; WX 634 ; N uni1EEF ; G 2293\nU 7920 ; WX 838 ; N uni1EF0 ; G 2294\nU 7921 ; WX 634 ; N uni1EF1 ; G 2295\nU 7922 ; WX 611 ; N Ygrave ; G 2296\nU 7923 ; WX 592 ; N ygrave ; G 2297\nU 7924 ; WX 611 ; N uni1EF4 ; G 2298\nU 7925 ; WX 592 ; N uni1EF5 ; G 2299\nU 7926 ; WX 611 ; N uni1EF6 ; G 2300\nU 7927 ; WX 592 ; N uni1EF7 ; G 2301\nU 7928 ; WX 611 ; N uni1EF8 ; G 2302\nU 7929 ; WX 592 ; N uni1EF9 ; G 2303\nU 7930 ; WX 769 ; N uni1EFA ; G 2304\nU 7931 ; WX 477 ; N uni1EFB ; G 2305\nU 7936 ; WX 659 ; N uni1F00 ; G 2306\nU 7937 ; WX 659 ; N uni1F01 ; G 2307\nU 7938 ; WX 659 ; N uni1F02 ; G 2308\nU 7939 ; WX 659 ; N uni1F03 ; G 2309\nU 7940 ; WX 659 ; N uni1F04 ; G 2310\nU 7941 ; WX 659 ; N uni1F05 ; G 2311\nU 7942 ; WX 659 ; N uni1F06 ; G 2312\nU 7943 ; WX 659 ; N uni1F07 ; G 2313\nU 7944 ; WX 684 ; N uni1F08 ; G 2314\nU 7945 ; WX 684 ; N uni1F09 ; G 2315\nU 7946 ; WX 877 ; N uni1F0A ; G 2316\nU 7947 ; WX 877 ; N uni1F0B ; G 2317\nU 7948 ; WX 769 ; N uni1F0C ; G 2318\nU 7949 ; WX 801 ; N uni1F0D ; G 2319\nU 7950 ; WX 708 ; N uni1F0E ; G 2320\nU 7951 ; WX 743 ; N uni1F0F ; G 2321\nU 7952 ; WX 541 ; N uni1F10 ; G 2322\nU 7953 ; WX 541 ; N uni1F11 ; G 2323\nU 7954 ; WX 541 ; N uni1F12 ; G 2324\nU 7955 ; WX 541 ; N uni1F13 ; G 2325\nU 7956 ; WX 541 ; N uni1F14 ; G 2326\nU 7957 ; WX 541 ; N uni1F15 ; G 2327\nU 7960 ; WX 711 ; N uni1F18 ; G 2328\nU 7961 ; WX 711 ; N uni1F19 ; G 2329\nU 7962 ; WX 966 ; N uni1F1A ; G 2330\nU 7963 ; WX 975 ; N uni1F1B ; G 2331\nU 7964 ; WX 898 ; N uni1F1C ; G 2332\nU 7965 ; WX 928 ; N uni1F1D ; G 2333\nU 7968 ; WX 634 ; N uni1F20 ; G 2334\nU 7969 ; WX 634 ; N uni1F21 ; G 2335\nU 7970 ; WX 634 ; N uni1F22 ; G 2336\nU 7971 ; WX 634 ; N uni1F23 ; G 2337\nU 7972 ; WX 634 ; N uni1F24 ; G 2338\nU 7973 ; WX 634 ; N uni1F25 ; G 2339\nU 7974 ; WX 634 ; N uni1F26 ; G 2340\nU 7975 ; WX 634 ; N uni1F27 ; G 2341\nU 7976 ; WX 837 ; N uni1F28 ; G 2342\nU 7977 ; WX 835 ; N uni1F29 ; G 2343\nU 7978 ; WX 1086 ; N uni1F2A ; G 2344\nU 7979 ; WX 1089 ; N uni1F2B ; G 2345\nU 7980 ; WX 1027 ; N uni1F2C ; G 2346\nU 7981 ; WX 1051 ; N uni1F2D ; G 2347\nU 7982 ; WX 934 ; N uni1F2E ; G 2348\nU 7983 ; WX 947 ; N uni1F2F ; G 2349\nU 7984 ; WX 338 ; N uni1F30 ; G 2350\nU 7985 ; WX 338 ; N uni1F31 ; G 2351\nU 7986 ; WX 338 ; N uni1F32 ; G 2352\nU 7987 ; WX 338 ; N uni1F33 ; G 2353\nU 7988 ; WX 338 ; N uni1F34 ; G 2354\nU 7989 ; WX 338 ; N uni1F35 ; G 2355\nU 7990 ; WX 338 ; N uni1F36 ; G 2356\nU 7991 ; WX 338 ; N uni1F37 ; G 2357\nU 7992 ; WX 380 ; N uni1F38 ; G 2358\nU 7993 ; WX 374 ; N uni1F39 ; G 2359\nU 7994 ; WX 635 ; N uni1F3A ; G 2360\nU 7995 ; WX 635 ; N uni1F3B ; G 2361\nU 7996 ; WX 570 ; N uni1F3C ; G 2362\nU 7997 ; WX 600 ; N uni1F3D ; G 2363\nU 7998 ; WX 489 ; N uni1F3E ; G 2364\nU 7999 ; WX 493 ; N uni1F3F ; G 2365\nU 8000 ; WX 612 ; N uni1F40 ; G 2366\nU 8001 ; WX 612 ; N uni1F41 ; G 2367\nU 8002 ; WX 612 ; N uni1F42 ; G 2368\nU 8003 ; WX 612 ; N uni1F43 ; G 2369\nU 8004 ; WX 612 ; N uni1F44 ; G 2370\nU 8005 ; WX 612 ; N uni1F45 ; G 2371\nU 8008 ; WX 804 ; N uni1F48 ; G 2372\nU 8009 ; WX 848 ; N uni1F49 ; G 2373\nU 8010 ; WX 1095 ; N uni1F4A ; G 2374\nU 8011 ; WX 1100 ; N uni1F4B ; G 2375\nU 8012 ; WX 938 ; N uni1F4C ; G 2376\nU 8013 ; WX 970 ; N uni1F4D ; G 2377\nU 8016 ; WX 579 ; N uni1F50 ; G 2378\nU 8017 ; WX 579 ; N uni1F51 ; G 2379\nU 8018 ; WX 579 ; N uni1F52 ; G 2380\nU 8019 ; WX 579 ; N uni1F53 ; G 2381\nU 8020 ; WX 579 ; N uni1F54 ; G 2382\nU 8021 ; WX 579 ; N uni1F55 ; G 2383\nU 8022 ; WX 579 ; N uni1F56 ; G 2384\nU 8023 ; WX 579 ; N uni1F57 ; G 2385\nU 8025 ; WX 784 ; N uni1F59 ; G 2386\nU 8027 ; WX 998 ; N uni1F5B ; G 2387\nU 8029 ; WX 1012 ; N uni1F5D ; G 2388\nU 8031 ; WX 897 ; N uni1F5F ; G 2389\nU 8032 ; WX 837 ; N uni1F60 ; G 2390\nU 8033 ; WX 837 ; N uni1F61 ; G 2391\nU 8034 ; WX 837 ; N uni1F62 ; G 2392\nU 8035 ; WX 837 ; N uni1F63 ; G 2393\nU 8036 ; WX 837 ; N uni1F64 ; G 2394\nU 8037 ; WX 837 ; N uni1F65 ; G 2395\nU 8038 ; WX 837 ; N uni1F66 ; G 2396\nU 8039 ; WX 837 ; N uni1F67 ; G 2397\nU 8040 ; WX 802 ; N uni1F68 ; G 2398\nU 8041 ; WX 843 ; N uni1F69 ; G 2399\nU 8042 ; WX 1089 ; N uni1F6A ; G 2400\nU 8043 ; WX 1095 ; N uni1F6B ; G 2401\nU 8044 ; WX 946 ; N uni1F6C ; G 2402\nU 8045 ; WX 972 ; N uni1F6D ; G 2403\nU 8046 ; WX 921 ; N uni1F6E ; G 2404\nU 8047 ; WX 952 ; N uni1F6F ; G 2405\nU 8048 ; WX 659 ; N uni1F70 ; G 2406\nU 8049 ; WX 659 ; N uni1F71 ; G 2407\nU 8050 ; WX 541 ; N uni1F72 ; G 2408\nU 8051 ; WX 548 ; N uni1F73 ; G 2409\nU 8052 ; WX 634 ; N uni1F74 ; G 2410\nU 8053 ; WX 654 ; N uni1F75 ; G 2411\nU 8054 ; WX 338 ; N uni1F76 ; G 2412\nU 8055 ; WX 338 ; N uni1F77 ; G 2413\nU 8056 ; WX 612 ; N uni1F78 ; G 2414\nU 8057 ; WX 612 ; N uni1F79 ; G 2415\nU 8058 ; WX 579 ; N uni1F7A ; G 2416\nU 8059 ; WX 579 ; N uni1F7B ; G 2417\nU 8060 ; WX 837 ; N uni1F7C ; G 2418\nU 8061 ; WX 837 ; N uni1F7D ; G 2419\nU 8064 ; WX 659 ; N uni1F80 ; G 2420\nU 8065 ; WX 659 ; N uni1F81 ; G 2421\nU 8066 ; WX 659 ; N uni1F82 ; G 2422\nU 8067 ; WX 659 ; N uni1F83 ; G 2423\nU 8068 ; WX 659 ; N uni1F84 ; G 2424\nU 8069 ; WX 659 ; N uni1F85 ; G 2425\nU 8070 ; WX 659 ; N uni1F86 ; G 2426\nU 8071 ; WX 659 ; N uni1F87 ; G 2427\nU 8072 ; WX 684 ; N uni1F88 ; G 2428\nU 8073 ; WX 684 ; N uni1F89 ; G 2429\nU 8074 ; WX 877 ; N uni1F8A ; G 2430\nU 8075 ; WX 877 ; N uni1F8B ; G 2431\nU 8076 ; WX 769 ; N uni1F8C ; G 2432\nU 8077 ; WX 801 ; N uni1F8D ; G 2433\nU 8078 ; WX 708 ; N uni1F8E ; G 2434\nU 8079 ; WX 743 ; N uni1F8F ; G 2435\nU 8080 ; WX 634 ; N uni1F90 ; G 2436\nU 8081 ; WX 634 ; N uni1F91 ; G 2437\nU 8082 ; WX 634 ; N uni1F92 ; G 2438\nU 8083 ; WX 634 ; N uni1F93 ; G 2439\nU 8084 ; WX 634 ; N uni1F94 ; G 2440\nU 8085 ; WX 634 ; N uni1F95 ; G 2441\nU 8086 ; WX 634 ; N uni1F96 ; G 2442\nU 8087 ; WX 634 ; N uni1F97 ; G 2443\nU 8088 ; WX 837 ; N uni1F98 ; G 2444\nU 8089 ; WX 835 ; N uni1F99 ; G 2445\nU 8090 ; WX 1086 ; N uni1F9A ; G 2446\nU 8091 ; WX 1089 ; N uni1F9B ; G 2447\nU 8092 ; WX 1027 ; N uni1F9C ; G 2448\nU 8093 ; WX 1051 ; N uni1F9D ; G 2449\nU 8094 ; WX 934 ; N uni1F9E ; G 2450\nU 8095 ; WX 947 ; N uni1F9F ; G 2451\nU 8096 ; WX 837 ; N uni1FA0 ; G 2452\nU 8097 ; WX 837 ; N uni1FA1 ; G 2453\nU 8098 ; WX 837 ; N uni1FA2 ; G 2454\nU 8099 ; WX 837 ; N uni1FA3 ; G 2455\nU 8100 ; WX 837 ; N uni1FA4 ; G 2456\nU 8101 ; WX 837 ; N uni1FA5 ; G 2457\nU 8102 ; WX 837 ; N uni1FA6 ; G 2458\nU 8103 ; WX 837 ; N uni1FA7 ; G 2459\nU 8104 ; WX 802 ; N uni1FA8 ; G 2460\nU 8105 ; WX 843 ; N uni1FA9 ; G 2461\nU 8106 ; WX 1089 ; N uni1FAA ; G 2462\nU 8107 ; WX 1095 ; N uni1FAB ; G 2463\nU 8108 ; WX 946 ; N uni1FAC ; G 2464\nU 8109 ; WX 972 ; N uni1FAD ; G 2465\nU 8110 ; WX 921 ; N uni1FAE ; G 2466\nU 8111 ; WX 952 ; N uni1FAF ; G 2467\nU 8112 ; WX 659 ; N uni1FB0 ; G 2468\nU 8113 ; WX 659 ; N uni1FB1 ; G 2469\nU 8114 ; WX 659 ; N uni1FB2 ; G 2470\nU 8115 ; WX 659 ; N uni1FB3 ; G 2471\nU 8116 ; WX 659 ; N uni1FB4 ; G 2472\nU 8118 ; WX 659 ; N uni1FB6 ; G 2473\nU 8119 ; WX 659 ; N uni1FB7 ; G 2474\nU 8120 ; WX 684 ; N uni1FB8 ; G 2475\nU 8121 ; WX 684 ; N uni1FB9 ; G 2476\nU 8122 ; WX 716 ; N uni1FBA ; G 2477\nU 8123 ; WX 692 ; N uni1FBB ; G 2478\nU 8124 ; WX 684 ; N uni1FBC ; G 2479\nU 8125 ; WX 500 ; N uni1FBD ; G 2480\nU 8126 ; WX 500 ; N uni1FBE ; G 2481\nU 8127 ; WX 500 ; N uni1FBF ; G 2482\nU 8128 ; WX 500 ; N uni1FC0 ; G 2483\nU 8129 ; WX 500 ; N uni1FC1 ; G 2484\nU 8130 ; WX 634 ; N uni1FC2 ; G 2485\nU 8131 ; WX 634 ; N uni1FC3 ; G 2486\nU 8132 ; WX 654 ; N uni1FC4 ; G 2487\nU 8134 ; WX 634 ; N uni1FC6 ; G 2488\nU 8135 ; WX 634 ; N uni1FC7 ; G 2489\nU 8136 ; WX 805 ; N uni1FC8 ; G 2490\nU 8137 ; WX 746 ; N uni1FC9 ; G 2491\nU 8138 ; WX 931 ; N uni1FCA ; G 2492\nU 8139 ; WX 871 ; N uni1FCB ; G 2493\nU 8140 ; WX 752 ; N uni1FCC ; G 2494\nU 8141 ; WX 500 ; N uni1FCD ; G 2495\nU 8142 ; WX 500 ; N uni1FCE ; G 2496\nU 8143 ; WX 500 ; N uni1FCF ; G 2497\nU 8144 ; WX 338 ; N uni1FD0 ; G 2498\nU 8145 ; WX 338 ; N uni1FD1 ; G 2499\nU 8146 ; WX 338 ; N uni1FD2 ; G 2500\nU 8147 ; WX 338 ; N uni1FD3 ; G 2501\nU 8150 ; WX 338 ; N uni1FD6 ; G 2502\nU 8151 ; WX 338 ; N uni1FD7 ; G 2503\nU 8152 ; WX 295 ; N uni1FD8 ; G 2504\nU 8153 ; WX 295 ; N uni1FD9 ; G 2505\nU 8154 ; WX 475 ; N uni1FDA ; G 2506\nU 8155 ; WX 408 ; N uni1FDB ; G 2507\nU 8157 ; WX 500 ; N uni1FDD ; G 2508\nU 8158 ; WX 500 ; N uni1FDE ; G 2509\nU 8159 ; WX 500 ; N uni1FDF ; G 2510\nU 8160 ; WX 579 ; N uni1FE0 ; G 2511\nU 8161 ; WX 579 ; N uni1FE1 ; G 2512\nU 8162 ; WX 579 ; N uni1FE2 ; G 2513\nU 8163 ; WX 579 ; N uni1FE3 ; G 2514\nU 8164 ; WX 635 ; N uni1FE4 ; G 2515\nU 8165 ; WX 635 ; N uni1FE5 ; G 2516\nU 8166 ; WX 579 ; N uni1FE6 ; G 2517\nU 8167 ; WX 579 ; N uni1FE7 ; G 2518\nU 8168 ; WX 611 ; N uni1FE8 ; G 2519\nU 8169 ; WX 611 ; N uni1FE9 ; G 2520\nU 8170 ; WX 845 ; N uni1FEA ; G 2521\nU 8171 ; WX 825 ; N uni1FEB ; G 2522\nU 8172 ; WX 685 ; N uni1FEC ; G 2523\nU 8173 ; WX 500 ; N uni1FED ; G 2524\nU 8174 ; WX 500 ; N uni1FEE ; G 2525\nU 8175 ; WX 500 ; N uni1FEF ; G 2526\nU 8178 ; WX 837 ; N uni1FF2 ; G 2527\nU 8179 ; WX 837 ; N uni1FF3 ; G 2528\nU 8180 ; WX 837 ; N uni1FF4 ; G 2529\nU 8182 ; WX 837 ; N uni1FF6 ; G 2530\nU 8183 ; WX 837 ; N uni1FF7 ; G 2531\nU 8184 ; WX 941 ; N uni1FF8 ; G 2532\nU 8185 ; WX 813 ; N uni1FF9 ; G 2533\nU 8186 ; WX 922 ; N uni1FFA ; G 2534\nU 8187 ; WX 826 ; N uni1FFB ; G 2535\nU 8188 ; WX 764 ; N uni1FFC ; G 2536\nU 8189 ; WX 500 ; N uni1FFD ; G 2537\nU 8190 ; WX 500 ; N uni1FFE ; G 2538\nU 8192 ; WX 500 ; N uni2000 ; G 2539\nU 8193 ; WX 1000 ; N uni2001 ; G 2540\nU 8194 ; WX 500 ; N uni2002 ; G 2541\nU 8195 ; WX 1000 ; N uni2003 ; G 2542\nU 8196 ; WX 330 ; N uni2004 ; G 2543\nU 8197 ; WX 250 ; N uni2005 ; G 2544\nU 8198 ; WX 167 ; N uni2006 ; G 2545\nU 8199 ; WX 636 ; N uni2007 ; G 2546\nU 8200 ; WX 318 ; N uni2008 ; G 2547\nU 8201 ; WX 200 ; N uni2009 ; G 2548\nU 8202 ; WX 100 ; N uni200A ; G 2549\nU 8203 ; WX 0 ; N uni200B ; G 2550\nU 8204 ; WX 0 ; N uni200C ; G 2551\nU 8205 ; WX 0 ; N uni200D ; G 2552\nU 8206 ; WX 0 ; N uni200E ; G 2553\nU 8207 ; WX 0 ; N uni200F ; G 2554\nU 8208 ; WX 361 ; N uni2010 ; G 2555\nU 8209 ; WX 361 ; N uni2011 ; G 2556\nU 8210 ; WX 636 ; N figuredash ; G 2557\nU 8211 ; WX 500 ; N endash ; G 2558\nU 8212 ; WX 1000 ; N emdash ; G 2559\nU 8213 ; WX 1000 ; N uni2015 ; G 2560\nU 8214 ; WX 500 ; N uni2016 ; G 2561\nU 8215 ; WX 500 ; N underscoredbl ; G 2562\nU 8216 ; WX 318 ; N quoteleft ; G 2563\nU 8217 ; WX 318 ; N quoteright ; G 2564\nU 8218 ; WX 318 ; N quotesinglbase ; G 2565\nU 8219 ; WX 318 ; N quotereversed ; G 2566\nU 8220 ; WX 518 ; N quotedblleft ; G 2567\nU 8221 ; WX 518 ; N quotedblright ; G 2568\nU 8222 ; WX 518 ; N quotedblbase ; G 2569\nU 8223 ; WX 518 ; N uni201F ; G 2570\nU 8224 ; WX 500 ; N dagger ; G 2571\nU 8225 ; WX 500 ; N daggerdbl ; G 2572\nU 8226 ; WX 590 ; N bullet ; G 2573\nU 8227 ; WX 590 ; N uni2023 ; G 2574\nU 8228 ; WX 333 ; N onedotenleader ; G 2575\nU 8229 ; WX 667 ; N twodotenleader ; G 2576\nU 8230 ; WX 1000 ; N ellipsis ; G 2577\nU 8231 ; WX 318 ; N uni2027 ; G 2578\nU 8232 ; WX 0 ; N uni2028 ; G 2579\nU 8233 ; WX 0 ; N uni2029 ; G 2580\nU 8234 ; WX 0 ; N uni202A ; G 2581\nU 8235 ; WX 0 ; N uni202B ; G 2582\nU 8236 ; WX 0 ; N uni202C ; G 2583\nU 8237 ; WX 0 ; N uni202D ; G 2584\nU 8238 ; WX 0 ; N uni202E ; G 2585\nU 8239 ; WX 200 ; N uni202F ; G 2586\nU 8240 ; WX 1350 ; N perthousand ; G 2587\nU 8241 ; WX 1690 ; N uni2031 ; G 2588\nU 8242 ; WX 227 ; N minute ; G 2589\nU 8243 ; WX 374 ; N second ; G 2590\nU 8244 ; WX 520 ; N uni2034 ; G 2591\nU 8245 ; WX 227 ; N uni2035 ; G 2592\nU 8246 ; WX 374 ; N uni2036 ; G 2593\nU 8247 ; WX 520 ; N uni2037 ; G 2594\nU 8248 ; WX 339 ; N uni2038 ; G 2595\nU 8249 ; WX 400 ; N guilsinglleft ; G 2596\nU 8250 ; WX 400 ; N guilsinglright ; G 2597\nU 8251 ; WX 838 ; N uni203B ; G 2598\nU 8252 ; WX 485 ; N exclamdbl ; G 2599\nU 8253 ; WX 531 ; N uni203D ; G 2600\nU 8254 ; WX 500 ; N uni203E ; G 2601\nU 8255 ; WX 804 ; N uni203F ; G 2602\nU 8256 ; WX 804 ; N uni2040 ; G 2603\nU 8257 ; WX 250 ; N uni2041 ; G 2604\nU 8258 ; WX 1000 ; N uni2042 ; G 2605\nU 8259 ; WX 500 ; N uni2043 ; G 2606\nU 8260 ; WX 167 ; N fraction ; G 2607\nU 8261 ; WX 390 ; N uni2045 ; G 2608\nU 8262 ; WX 390 ; N uni2046 ; G 2609\nU 8263 ; WX 922 ; N uni2047 ; G 2610\nU 8264 ; WX 733 ; N uni2048 ; G 2611\nU 8265 ; WX 733 ; N uni2049 ; G 2612\nU 8266 ; WX 497 ; N uni204A ; G 2613\nU 8267 ; WX 636 ; N uni204B ; G 2614\nU 8268 ; WX 500 ; N uni204C ; G 2615\nU 8269 ; WX 500 ; N uni204D ; G 2616\nU 8270 ; WX 500 ; N uni204E ; G 2617\nU 8271 ; WX 337 ; N uni204F ; G 2618\nU 8272 ; WX 804 ; N uni2050 ; G 2619\nU 8273 ; WX 500 ; N uni2051 ; G 2620\nU 8274 ; WX 450 ; N uni2052 ; G 2621\nU 8275 ; WX 1000 ; N uni2053 ; G 2622\nU 8276 ; WX 804 ; N uni2054 ; G 2623\nU 8277 ; WX 838 ; N uni2055 ; G 2624\nU 8278 ; WX 586 ; N uni2056 ; G 2625\nU 8279 ; WX 663 ; N uni2057 ; G 2626\nU 8280 ; WX 838 ; N uni2058 ; G 2627\nU 8281 ; WX 838 ; N uni2059 ; G 2628\nU 8282 ; WX 318 ; N uni205A ; G 2629\nU 8283 ; WX 797 ; N uni205B ; G 2630\nU 8284 ; WX 838 ; N uni205C ; G 2631\nU 8285 ; WX 318 ; N uni205D ; G 2632\nU 8286 ; WX 318 ; N uni205E ; G 2633\nU 8287 ; WX 222 ; N uni205F ; G 2634\nU 8288 ; WX 0 ; N uni2060 ; G 2635\nU 8289 ; WX 0 ; N uni2061 ; G 2636\nU 8290 ; WX 0 ; N uni2062 ; G 2637\nU 8291 ; WX 0 ; N uni2063 ; G 2638\nU 8292 ; WX 0 ; N uni2064 ; G 2639\nU 8298 ; WX 0 ; N uni206A ; G 2640\nU 8299 ; WX 0 ; N uni206B ; G 2641\nU 8300 ; WX 0 ; N uni206C ; G 2642\nU 8301 ; WX 0 ; N uni206D ; G 2643\nU 8302 ; WX 0 ; N uni206E ; G 2644\nU 8303 ; WX 0 ; N uni206F ; G 2645\nU 8304 ; WX 401 ; N uni2070 ; G 2646\nU 8305 ; WX 179 ; N uni2071 ; G 2647\nU 8308 ; WX 401 ; N uni2074 ; G 2648\nU 8309 ; WX 401 ; N uni2075 ; G 2649\nU 8310 ; WX 401 ; N uni2076 ; G 2650\nU 8311 ; WX 401 ; N uni2077 ; G 2651\nU 8312 ; WX 401 ; N uni2078 ; G 2652\nU 8313 ; WX 401 ; N uni2079 ; G 2653\nU 8314 ; WX 528 ; N uni207A ; G 2654\nU 8315 ; WX 528 ; N uni207B ; G 2655\nU 8316 ; WX 528 ; N uni207C ; G 2656\nU 8317 ; WX 246 ; N uni207D ; G 2657\nU 8318 ; WX 246 ; N uni207E ; G 2658\nU 8319 ; WX 399 ; N uni207F ; G 2659\nU 8320 ; WX 401 ; N uni2080 ; G 2660\nU 8321 ; WX 401 ; N uni2081 ; G 2661\nU 8322 ; WX 401 ; N uni2082 ; G 2662\nU 8323 ; WX 401 ; N uni2083 ; G 2663\nU 8324 ; WX 401 ; N uni2084 ; G 2664\nU 8325 ; WX 401 ; N uni2085 ; G 2665\nU 8326 ; WX 401 ; N uni2086 ; G 2666\nU 8327 ; WX 401 ; N uni2087 ; G 2667\nU 8328 ; WX 401 ; N uni2088 ; G 2668\nU 8329 ; WX 401 ; N uni2089 ; G 2669\nU 8330 ; WX 528 ; N uni208A ; G 2670\nU 8331 ; WX 528 ; N uni208B ; G 2671\nU 8332 ; WX 528 ; N uni208C ; G 2672\nU 8333 ; WX 246 ; N uni208D ; G 2673\nU 8334 ; WX 246 ; N uni208E ; G 2674\nU 8336 ; WX 392 ; N uni2090 ; G 2675\nU 8337 ; WX 417 ; N uni2091 ; G 2676\nU 8338 ; WX 414 ; N uni2092 ; G 2677\nU 8339 ; WX 444 ; N uni2093 ; G 2678\nU 8340 ; WX 417 ; N uni2094 ; G 2679\nU 8341 ; WX 399 ; N uni2095 ; G 2680\nU 8342 ; WX 426 ; N uni2096 ; G 2681\nU 8343 ; WX 166 ; N uni2097 ; G 2682\nU 8344 ; WX 623 ; N uni2098 ; G 2683\nU 8345 ; WX 399 ; N uni2099 ; G 2684\nU 8346 ; WX 428 ; N uni209A ; G 2685\nU 8347 ; WX 373 ; N uni209B ; G 2686\nU 8348 ; WX 295 ; N uni209C ; G 2687\nU 8352 ; WX 877 ; N uni20A0 ; G 2688\nU 8353 ; WX 636 ; N colonmonetary ; G 2689\nU 8354 ; WX 636 ; N uni20A2 ; G 2690\nU 8355 ; WX 636 ; N franc ; G 2691\nU 8356 ; WX 636 ; N lira ; G 2692\nU 8357 ; WX 974 ; N uni20A5 ; G 2693\nU 8358 ; WX 636 ; N uni20A6 ; G 2694\nU 8359 ; WX 1271 ; N peseta ; G 2695\nU 8360 ; WX 1074 ; N uni20A8 ; G 2696\nU 8361 ; WX 989 ; N uni20A9 ; G 2697\nU 8362 ; WX 838 ; N uni20AA ; G 2698\nU 8363 ; WX 636 ; N dong ; G 2699\nU 8364 ; WX 636 ; N Euro ; G 2700\nU 8365 ; WX 636 ; N uni20AD ; G 2701\nU 8366 ; WX 636 ; N uni20AE ; G 2702\nU 8367 ; WX 1272 ; N uni20AF ; G 2703\nU 8368 ; WX 636 ; N uni20B0 ; G 2704\nU 8369 ; WX 636 ; N uni20B1 ; G 2705\nU 8370 ; WX 636 ; N uni20B2 ; G 2706\nU 8371 ; WX 636 ; N uni20B3 ; G 2707\nU 8372 ; WX 774 ; N uni20B4 ; G 2708\nU 8373 ; WX 636 ; N uni20B5 ; G 2709\nU 8376 ; WX 636 ; N uni20B8 ; G 2710\nU 8377 ; WX 636 ; N uni20B9 ; G 2711\nU 8378 ; WX 636 ; N uni20BA ; G 2712\nU 8381 ; WX 636 ; N uni20BD ; G 2713\nU 8400 ; WX 0 ; N uni20D0 ; G 2714\nU 8401 ; WX 0 ; N uni20D1 ; G 2715\nU 8406 ; WX 0 ; N uni20D6 ; G 2716\nU 8407 ; WX 0 ; N uni20D7 ; G 2717\nU 8411 ; WX 0 ; N uni20DB ; G 2718\nU 8412 ; WX 0 ; N uni20DC ; G 2719\nU 8417 ; WX 0 ; N uni20E1 ; G 2720\nU 8448 ; WX 970 ; N uni2100 ; G 2721\nU 8449 ; WX 970 ; N uni2101 ; G 2722\nU 8450 ; WX 698 ; N uni2102 ; G 2723\nU 8451 ; WX 1123 ; N uni2103 ; G 2724\nU 8452 ; WX 896 ; N uni2104 ; G 2725\nU 8453 ; WX 969 ; N uni2105 ; G 2726\nU 8454 ; WX 1032 ; N uni2106 ; G 2727\nU 8455 ; WX 614 ; N uni2107 ; G 2728\nU 8456 ; WX 698 ; N uni2108 ; G 2729\nU 8457 ; WX 952 ; N uni2109 ; G 2730\nU 8459 ; WX 988 ; N uni210B ; G 2731\nU 8460 ; WX 754 ; N uni210C ; G 2732\nU 8461 ; WX 850 ; N uni210D ; G 2733\nU 8462 ; WX 634 ; N uni210E ; G 2734\nU 8463 ; WX 634 ; N uni210F ; G 2735\nU 8464 ; WX 470 ; N uni2110 ; G 2736\nU 8465 ; WX 697 ; N Ifraktur ; G 2737\nU 8466 ; WX 720 ; N uni2112 ; G 2738\nU 8467 ; WX 413 ; N uni2113 ; G 2739\nU 8468 ; WX 818 ; N uni2114 ; G 2740\nU 8469 ; WX 801 ; N uni2115 ; G 2741\nU 8470 ; WX 1040 ; N uni2116 ; G 2742\nU 8471 ; WX 1000 ; N uni2117 ; G 2743\nU 8472 ; WX 697 ; N weierstrass ; G 2744\nU 8473 ; WX 701 ; N uni2119 ; G 2745\nU 8474 ; WX 787 ; N uni211A ; G 2746\nU 8475 ; WX 798 ; N uni211B ; G 2747\nU 8476 ; WX 814 ; N Rfraktur ; G 2748\nU 8477 ; WX 792 ; N uni211D ; G 2749\nU 8478 ; WX 896 ; N prescription ; G 2750\nU 8479 ; WX 684 ; N uni211F ; G 2751\nU 8480 ; WX 1020 ; N uni2120 ; G 2752\nU 8481 ; WX 1014 ; N uni2121 ; G 2753\nU 8482 ; WX 1000 ; N trademark ; G 2754\nU 8483 ; WX 684 ; N uni2123 ; G 2755\nU 8484 ; WX 745 ; N uni2124 ; G 2756\nU 8485 ; WX 578 ; N uni2125 ; G 2757\nU 8486 ; WX 764 ; N uni2126 ; G 2758\nU 8487 ; WX 764 ; N uni2127 ; G 2759\nU 8488 ; WX 616 ; N uni2128 ; G 2760\nU 8489 ; WX 338 ; N uni2129 ; G 2761\nU 8490 ; WX 656 ; N uni212A ; G 2762\nU 8491 ; WX 684 ; N uni212B ; G 2763\nU 8492 ; WX 786 ; N uni212C ; G 2764\nU 8493 ; WX 703 ; N uni212D ; G 2765\nU 8494 ; WX 854 ; N estimated ; G 2766\nU 8495 ; WX 592 ; N uni212F ; G 2767\nU 8496 ; WX 605 ; N uni2130 ; G 2768\nU 8497 ; WX 786 ; N uni2131 ; G 2769\nU 8498 ; WX 575 ; N uni2132 ; G 2770\nU 8499 ; WX 1069 ; N uni2133 ; G 2771\nU 8500 ; WX 462 ; N uni2134 ; G 2772\nU 8501 ; WX 745 ; N aleph ; G 2773\nU 8502 ; WX 674 ; N uni2136 ; G 2774\nU 8503 ; WX 466 ; N uni2137 ; G 2775\nU 8504 ; WX 645 ; N uni2138 ; G 2776\nU 8505 ; WX 380 ; N uni2139 ; G 2777\nU 8506 ; WX 926 ; N uni213A ; G 2778\nU 8507 ; WX 1157 ; N uni213B ; G 2779\nU 8508 ; WX 702 ; N uni213C ; G 2780\nU 8509 ; WX 728 ; N uni213D ; G 2781\nU 8510 ; WX 654 ; N uni213E ; G 2782\nU 8511 ; WX 849 ; N uni213F ; G 2783\nU 8512 ; WX 811 ; N uni2140 ; G 2784\nU 8513 ; WX 775 ; N uni2141 ; G 2785\nU 8514 ; WX 557 ; N uni2142 ; G 2786\nU 8515 ; WX 557 ; N uni2143 ; G 2787\nU 8516 ; WX 611 ; N uni2144 ; G 2788\nU 8517 ; WX 819 ; N uni2145 ; G 2789\nU 8518 ; WX 708 ; N uni2146 ; G 2790\nU 8519 ; WX 615 ; N uni2147 ; G 2791\nU 8520 ; WX 351 ; N uni2148 ; G 2792\nU 8521 ; WX 351 ; N uni2149 ; G 2793\nU 8523 ; WX 780 ; N uni214B ; G 2794\nU 8526 ; WX 526 ; N uni214E ; G 2795\nU 8528 ; WX 969 ; N uni2150 ; G 2796\nU 8529 ; WX 969 ; N uni2151 ; G 2797\nU 8530 ; WX 1370 ; N uni2152 ; G 2798\nU 8531 ; WX 969 ; N onethird ; G 2799\nU 8532 ; WX 969 ; N twothirds ; G 2800\nU 8533 ; WX 969 ; N uni2155 ; G 2801\nU 8534 ; WX 969 ; N uni2156 ; G 2802\nU 8535 ; WX 969 ; N uni2157 ; G 2803\nU 8536 ; WX 969 ; N uni2158 ; G 2804\nU 8537 ; WX 969 ; N uni2159 ; G 2805\nU 8538 ; WX 969 ; N uni215A ; G 2806\nU 8539 ; WX 969 ; N oneeighth ; G 2807\nU 8540 ; WX 969 ; N threeeighths ; G 2808\nU 8541 ; WX 969 ; N fiveeighths ; G 2809\nU 8542 ; WX 969 ; N seveneighths ; G 2810\nU 8543 ; WX 568 ; N uni215F ; G 2811\nU 8544 ; WX 295 ; N uni2160 ; G 2812\nU 8545 ; WX 492 ; N uni2161 ; G 2813\nU 8546 ; WX 689 ; N uni2162 ; G 2814\nU 8547 ; WX 923 ; N uni2163 ; G 2815\nU 8548 ; WX 684 ; N uni2164 ; G 2816\nU 8549 ; WX 922 ; N uni2165 ; G 2817\nU 8550 ; WX 1120 ; N uni2166 ; G 2818\nU 8551 ; WX 1317 ; N uni2167 ; G 2819\nU 8552 ; WX 917 ; N uni2168 ; G 2820\nU 8553 ; WX 685 ; N uni2169 ; G 2821\nU 8554 ; WX 933 ; N uni216A ; G 2822\nU 8555 ; WX 1131 ; N uni216B ; G 2823\nU 8556 ; WX 557 ; N uni216C ; G 2824\nU 8557 ; WX 698 ; N uni216D ; G 2825\nU 8558 ; WX 770 ; N uni216E ; G 2826\nU 8559 ; WX 863 ; N uni216F ; G 2827\nU 8560 ; WX 278 ; N uni2170 ; G 2828\nU 8561 ; WX 458 ; N uni2171 ; G 2829\nU 8562 ; WX 637 ; N uni2172 ; G 2830\nU 8563 ; WX 812 ; N uni2173 ; G 2831\nU 8564 ; WX 592 ; N uni2174 ; G 2832\nU 8565 ; WX 811 ; N uni2175 ; G 2833\nU 8566 ; WX 991 ; N uni2176 ; G 2834\nU 8567 ; WX 1170 ; N uni2177 ; G 2835\nU 8568 ; WX 819 ; N uni2178 ; G 2836\nU 8569 ; WX 592 ; N uni2179 ; G 2837\nU 8570 ; WX 822 ; N uni217A ; G 2838\nU 8571 ; WX 1002 ; N uni217B ; G 2839\nU 8572 ; WX 278 ; N uni217C ; G 2840\nU 8573 ; WX 550 ; N uni217D ; G 2841\nU 8574 ; WX 635 ; N uni217E ; G 2842\nU 8575 ; WX 974 ; N uni217F ; G 2843\nU 8576 ; WX 1245 ; N uni2180 ; G 2844\nU 8577 ; WX 770 ; N uni2181 ; G 2845\nU 8578 ; WX 1245 ; N uni2182 ; G 2846\nU 8579 ; WX 703 ; N uni2183 ; G 2847\nU 8580 ; WX 549 ; N uni2184 ; G 2848\nU 8581 ; WX 698 ; N uni2185 ; G 2849\nU 8585 ; WX 969 ; N uni2189 ; G 2850\nU 8592 ; WX 838 ; N arrowleft ; G 2851\nU 8593 ; WX 838 ; N arrowup ; G 2852\nU 8594 ; WX 838 ; N arrowright ; G 2853\nU 8595 ; WX 838 ; N arrowdown ; G 2854\nU 8596 ; WX 838 ; N arrowboth ; G 2855\nU 8597 ; WX 838 ; N arrowupdn ; G 2856\nU 8598 ; WX 838 ; N uni2196 ; G 2857\nU 8599 ; WX 838 ; N uni2197 ; G 2858\nU 8600 ; WX 838 ; N uni2198 ; G 2859\nU 8601 ; WX 838 ; N uni2199 ; G 2860\nU 8602 ; WX 838 ; N uni219A ; G 2861\nU 8603 ; WX 838 ; N uni219B ; G 2862\nU 8604 ; WX 838 ; N uni219C ; G 2863\nU 8605 ; WX 838 ; N uni219D ; G 2864\nU 8606 ; WX 838 ; N uni219E ; G 2865\nU 8607 ; WX 838 ; N uni219F ; G 2866\nU 8608 ; WX 838 ; N uni21A0 ; G 2867\nU 8609 ; WX 838 ; N uni21A1 ; G 2868\nU 8610 ; WX 838 ; N uni21A2 ; G 2869\nU 8611 ; WX 838 ; N uni21A3 ; G 2870\nU 8612 ; WX 838 ; N uni21A4 ; G 2871\nU 8613 ; WX 838 ; N uni21A5 ; G 2872\nU 8614 ; WX 838 ; N uni21A6 ; G 2873\nU 8615 ; WX 838 ; N uni21A7 ; G 2874\nU 8616 ; WX 838 ; N arrowupdnbse ; G 2875\nU 8617 ; WX 838 ; N uni21A9 ; G 2876\nU 8618 ; WX 838 ; N uni21AA ; G 2877\nU 8619 ; WX 838 ; N uni21AB ; G 2878\nU 8620 ; WX 838 ; N uni21AC ; G 2879\nU 8621 ; WX 838 ; N uni21AD ; G 2880\nU 8622 ; WX 838 ; N uni21AE ; G 2881\nU 8623 ; WX 838 ; N uni21AF ; G 2882\nU 8624 ; WX 838 ; N uni21B0 ; G 2883\nU 8625 ; WX 838 ; N uni21B1 ; G 2884\nU 8626 ; WX 838 ; N uni21B2 ; G 2885\nU 8627 ; WX 838 ; N uni21B3 ; G 2886\nU 8628 ; WX 838 ; N uni21B4 ; G 2887\nU 8629 ; WX 838 ; N carriagereturn ; G 2888\nU 8630 ; WX 838 ; N uni21B6 ; G 2889\nU 8631 ; WX 838 ; N uni21B7 ; G 2890\nU 8632 ; WX 838 ; N uni21B8 ; G 2891\nU 8633 ; WX 838 ; N uni21B9 ; G 2892\nU 8634 ; WX 838 ; N uni21BA ; G 2893\nU 8635 ; WX 838 ; N uni21BB ; G 2894\nU 8636 ; WX 838 ; N uni21BC ; G 2895\nU 8637 ; WX 838 ; N uni21BD ; G 2896\nU 8638 ; WX 838 ; N uni21BE ; G 2897\nU 8639 ; WX 838 ; N uni21BF ; G 2898\nU 8640 ; WX 838 ; N uni21C0 ; G 2899\nU 8641 ; WX 838 ; N uni21C1 ; G 2900\nU 8642 ; WX 838 ; N uni21C2 ; G 2901\nU 8643 ; WX 838 ; N uni21C3 ; G 2902\nU 8644 ; WX 838 ; N uni21C4 ; G 2903\nU 8645 ; WX 838 ; N uni21C5 ; G 2904\nU 8646 ; WX 838 ; N uni21C6 ; G 2905\nU 8647 ; WX 838 ; N uni21C7 ; G 2906\nU 8648 ; WX 838 ; N uni21C8 ; G 2907\nU 8649 ; WX 838 ; N uni21C9 ; G 2908\nU 8650 ; WX 838 ; N uni21CA ; G 2909\nU 8651 ; WX 838 ; N uni21CB ; G 2910\nU 8652 ; WX 838 ; N uni21CC ; G 2911\nU 8653 ; WX 838 ; N uni21CD ; G 2912\nU 8654 ; WX 838 ; N uni21CE ; G 2913\nU 8655 ; WX 838 ; N uni21CF ; G 2914\nU 8656 ; WX 838 ; N arrowdblleft ; G 2915\nU 8657 ; WX 838 ; N arrowdblup ; G 2916\nU 8658 ; WX 838 ; N arrowdblright ; G 2917\nU 8659 ; WX 838 ; N arrowdbldown ; G 2918\nU 8660 ; WX 838 ; N arrowdblboth ; G 2919\nU 8661 ; WX 838 ; N uni21D5 ; G 2920\nU 8662 ; WX 838 ; N uni21D6 ; G 2921\nU 8663 ; WX 838 ; N uni21D7 ; G 2922\nU 8664 ; WX 838 ; N uni21D8 ; G 2923\nU 8665 ; WX 838 ; N uni21D9 ; G 2924\nU 8666 ; WX 838 ; N uni21DA ; G 2925\nU 8667 ; WX 838 ; N uni21DB ; G 2926\nU 8668 ; WX 838 ; N uni21DC ; G 2927\nU 8669 ; WX 838 ; N uni21DD ; G 2928\nU 8670 ; WX 838 ; N uni21DE ; G 2929\nU 8671 ; WX 838 ; N uni21DF ; G 2930\nU 8672 ; WX 838 ; N uni21E0 ; G 2931\nU 8673 ; WX 838 ; N uni21E1 ; G 2932\nU 8674 ; WX 838 ; N uni21E2 ; G 2933\nU 8675 ; WX 838 ; N uni21E3 ; G 2934\nU 8676 ; WX 838 ; N uni21E4 ; G 2935\nU 8677 ; WX 838 ; N uni21E5 ; G 2936\nU 8678 ; WX 838 ; N uni21E6 ; G 2937\nU 8679 ; WX 838 ; N uni21E7 ; G 2938\nU 8680 ; WX 838 ; N uni21E8 ; G 2939\nU 8681 ; WX 838 ; N uni21E9 ; G 2940\nU 8682 ; WX 838 ; N uni21EA ; G 2941\nU 8683 ; WX 838 ; N uni21EB ; G 2942\nU 8684 ; WX 838 ; N uni21EC ; G 2943\nU 8685 ; WX 838 ; N uni21ED ; G 2944\nU 8686 ; WX 838 ; N uni21EE ; G 2945\nU 8687 ; WX 838 ; N uni21EF ; G 2946\nU 8688 ; WX 838 ; N uni21F0 ; G 2947\nU 8689 ; WX 838 ; N uni21F1 ; G 2948\nU 8690 ; WX 838 ; N uni21F2 ; G 2949\nU 8691 ; WX 838 ; N uni21F3 ; G 2950\nU 8692 ; WX 838 ; N uni21F4 ; G 2951\nU 8693 ; WX 838 ; N uni21F5 ; G 2952\nU 8694 ; WX 838 ; N uni21F6 ; G 2953\nU 8695 ; WX 838 ; N uni21F7 ; G 2954\nU 8696 ; WX 838 ; N uni21F8 ; G 2955\nU 8697 ; WX 838 ; N uni21F9 ; G 2956\nU 8698 ; WX 838 ; N uni21FA ; G 2957\nU 8699 ; WX 838 ; N uni21FB ; G 2958\nU 8700 ; WX 838 ; N uni21FC ; G 2959\nU 8701 ; WX 838 ; N uni21FD ; G 2960\nU 8702 ; WX 838 ; N uni21FE ; G 2961\nU 8703 ; WX 838 ; N uni21FF ; G 2962\nU 8704 ; WX 684 ; N universal ; G 2963\nU 8705 ; WX 636 ; N uni2201 ; G 2964\nU 8706 ; WX 517 ; N partialdiff ; G 2965\nU 8707 ; WX 632 ; N existential ; G 2966\nU 8708 ; WX 632 ; N uni2204 ; G 2967\nU 8709 ; WX 871 ; N emptyset ; G 2968\nU 8710 ; WX 669 ; N increment ; G 2969\nU 8711 ; WX 669 ; N gradient ; G 2970\nU 8712 ; WX 871 ; N element ; G 2971\nU 8713 ; WX 871 ; N notelement ; G 2972\nU 8714 ; WX 718 ; N uni220A ; G 2973\nU 8715 ; WX 871 ; N suchthat ; G 2974\nU 8716 ; WX 871 ; N uni220C ; G 2975\nU 8717 ; WX 718 ; N uni220D ; G 2976\nU 8718 ; WX 636 ; N uni220E ; G 2977\nU 8719 ; WX 757 ; N product ; G 2978\nU 8720 ; WX 757 ; N uni2210 ; G 2979\nU 8721 ; WX 674 ; N summation ; G 2980\nU 8722 ; WX 838 ; N minus ; G 2981\nU 8723 ; WX 838 ; N uni2213 ; G 2982\nU 8724 ; WX 838 ; N uni2214 ; G 2983\nU 8725 ; WX 337 ; N uni2215 ; G 2984\nU 8726 ; WX 637 ; N uni2216 ; G 2985\nU 8727 ; WX 838 ; N asteriskmath ; G 2986\nU 8728 ; WX 626 ; N uni2218 ; G 2987\nU 8729 ; WX 626 ; N uni2219 ; G 2988\nU 8730 ; WX 637 ; N radical ; G 2989\nU 8731 ; WX 637 ; N uni221B ; G 2990\nU 8732 ; WX 637 ; N uni221C ; G 2991\nU 8733 ; WX 714 ; N proportional ; G 2992\nU 8734 ; WX 833 ; N infinity ; G 2993\nU 8735 ; WX 838 ; N orthogonal ; G 2994\nU 8736 ; WX 896 ; N angle ; G 2995\nU 8737 ; WX 896 ; N uni2221 ; G 2996\nU 8738 ; WX 838 ; N uni2222 ; G 2997\nU 8739 ; WX 500 ; N uni2223 ; G 2998\nU 8740 ; WX 500 ; N uni2224 ; G 2999\nU 8741 ; WX 500 ; N uni2225 ; G 3000\nU 8742 ; WX 500 ; N uni2226 ; G 3001\nU 8743 ; WX 732 ; N logicaland ; G 3002\nU 8744 ; WX 732 ; N logicalor ; G 3003\nU 8745 ; WX 732 ; N intersection ; G 3004\nU 8746 ; WX 732 ; N union ; G 3005\nU 8747 ; WX 521 ; N integral ; G 3006\nU 8748 ; WX 789 ; N uni222C ; G 3007\nU 8749 ; WX 1057 ; N uni222D ; G 3008\nU 8750 ; WX 521 ; N uni222E ; G 3009\nU 8751 ; WX 789 ; N uni222F ; G 3010\nU 8752 ; WX 1057 ; N uni2230 ; G 3011\nU 8753 ; WX 521 ; N uni2231 ; G 3012\nU 8754 ; WX 521 ; N uni2232 ; G 3013\nU 8755 ; WX 521 ; N uni2233 ; G 3014\nU 8756 ; WX 636 ; N therefore ; G 3015\nU 8757 ; WX 636 ; N uni2235 ; G 3016\nU 8758 ; WX 260 ; N uni2236 ; G 3017\nU 8759 ; WX 636 ; N uni2237 ; G 3018\nU 8760 ; WX 838 ; N uni2238 ; G 3019\nU 8761 ; WX 838 ; N uni2239 ; G 3020\nU 8762 ; WX 838 ; N uni223A ; G 3021\nU 8763 ; WX 838 ; N uni223B ; G 3022\nU 8764 ; WX 838 ; N similar ; G 3023\nU 8765 ; WX 838 ; N uni223D ; G 3024\nU 8766 ; WX 838 ; N uni223E ; G 3025\nU 8767 ; WX 838 ; N uni223F ; G 3026\nU 8768 ; WX 375 ; N uni2240 ; G 3027\nU 8769 ; WX 838 ; N uni2241 ; G 3028\nU 8770 ; WX 838 ; N uni2242 ; G 3029\nU 8771 ; WX 838 ; N uni2243 ; G 3030\nU 8772 ; WX 838 ; N uni2244 ; G 3031\nU 8773 ; WX 838 ; N congruent ; G 3032\nU 8774 ; WX 838 ; N uni2246 ; G 3033\nU 8775 ; WX 838 ; N uni2247 ; G 3034\nU 8776 ; WX 838 ; N approxequal ; G 3035\nU 8777 ; WX 838 ; N uni2249 ; G 3036\nU 8778 ; WX 838 ; N uni224A ; G 3037\nU 8779 ; WX 838 ; N uni224B ; G 3038\nU 8780 ; WX 838 ; N uni224C ; G 3039\nU 8781 ; WX 838 ; N uni224D ; G 3040\nU 8782 ; WX 838 ; N uni224E ; G 3041\nU 8783 ; WX 838 ; N uni224F ; G 3042\nU 8784 ; WX 838 ; N uni2250 ; G 3043\nU 8785 ; WX 838 ; N uni2251 ; G 3044\nU 8786 ; WX 838 ; N uni2252 ; G 3045\nU 8787 ; WX 838 ; N uni2253 ; G 3046\nU 8788 ; WX 1000 ; N uni2254 ; G 3047\nU 8789 ; WX 1000 ; N uni2255 ; G 3048\nU 8790 ; WX 838 ; N uni2256 ; G 3049\nU 8791 ; WX 838 ; N uni2257 ; G 3050\nU 8792 ; WX 838 ; N uni2258 ; G 3051\nU 8793 ; WX 838 ; N uni2259 ; G 3052\nU 8794 ; WX 838 ; N uni225A ; G 3053\nU 8795 ; WX 838 ; N uni225B ; G 3054\nU 8796 ; WX 838 ; N uni225C ; G 3055\nU 8797 ; WX 838 ; N uni225D ; G 3056\nU 8798 ; WX 838 ; N uni225E ; G 3057\nU 8799 ; WX 838 ; N uni225F ; G 3058\nU 8800 ; WX 838 ; N notequal ; G 3059\nU 8801 ; WX 838 ; N equivalence ; G 3060\nU 8802 ; WX 838 ; N uni2262 ; G 3061\nU 8803 ; WX 838 ; N uni2263 ; G 3062\nU 8804 ; WX 838 ; N lessequal ; G 3063\nU 8805 ; WX 838 ; N greaterequal ; G 3064\nU 8806 ; WX 838 ; N uni2266 ; G 3065\nU 8807 ; WX 838 ; N uni2267 ; G 3066\nU 8808 ; WX 838 ; N uni2268 ; G 3067\nU 8809 ; WX 838 ; N uni2269 ; G 3068\nU 8810 ; WX 1047 ; N uni226A ; G 3069\nU 8811 ; WX 1047 ; N uni226B ; G 3070\nU 8812 ; WX 464 ; N uni226C ; G 3071\nU 8813 ; WX 838 ; N uni226D ; G 3072\nU 8814 ; WX 838 ; N uni226E ; G 3073\nU 8815 ; WX 838 ; N uni226F ; G 3074\nU 8816 ; WX 838 ; N uni2270 ; G 3075\nU 8817 ; WX 838 ; N uni2271 ; G 3076\nU 8818 ; WX 838 ; N uni2272 ; G 3077\nU 8819 ; WX 838 ; N uni2273 ; G 3078\nU 8820 ; WX 838 ; N uni2274 ; G 3079\nU 8821 ; WX 838 ; N uni2275 ; G 3080\nU 8822 ; WX 838 ; N uni2276 ; G 3081\nU 8823 ; WX 838 ; N uni2277 ; G 3082\nU 8824 ; WX 838 ; N uni2278 ; G 3083\nU 8825 ; WX 838 ; N uni2279 ; G 3084\nU 8826 ; WX 838 ; N uni227A ; G 3085\nU 8827 ; WX 838 ; N uni227B ; G 3086\nU 8828 ; WX 838 ; N uni227C ; G 3087\nU 8829 ; WX 838 ; N uni227D ; G 3088\nU 8830 ; WX 838 ; N uni227E ; G 3089\nU 8831 ; WX 838 ; N uni227F ; G 3090\nU 8832 ; WX 838 ; N uni2280 ; G 3091\nU 8833 ; WX 838 ; N uni2281 ; G 3092\nU 8834 ; WX 838 ; N propersubset ; G 3093\nU 8835 ; WX 838 ; N propersuperset ; G 3094\nU 8836 ; WX 838 ; N notsubset ; G 3095\nU 8837 ; WX 838 ; N uni2285 ; G 3096\nU 8838 ; WX 838 ; N reflexsubset ; G 3097\nU 8839 ; WX 838 ; N reflexsuperset ; G 3098\nU 8840 ; WX 838 ; N uni2288 ; G 3099\nU 8841 ; WX 838 ; N uni2289 ; G 3100\nU 8842 ; WX 838 ; N uni228A ; G 3101\nU 8843 ; WX 838 ; N uni228B ; G 3102\nU 8844 ; WX 732 ; N uni228C ; G 3103\nU 8845 ; WX 732 ; N uni228D ; G 3104\nU 8846 ; WX 732 ; N uni228E ; G 3105\nU 8847 ; WX 838 ; N uni228F ; G 3106\nU 8848 ; WX 838 ; N uni2290 ; G 3107\nU 8849 ; WX 838 ; N uni2291 ; G 3108\nU 8850 ; WX 838 ; N uni2292 ; G 3109\nU 8851 ; WX 780 ; N uni2293 ; G 3110\nU 8852 ; WX 780 ; N uni2294 ; G 3111\nU 8853 ; WX 838 ; N circleplus ; G 3112\nU 8854 ; WX 838 ; N uni2296 ; G 3113\nU 8855 ; WX 838 ; N circlemultiply ; G 3114\nU 8856 ; WX 838 ; N uni2298 ; G 3115\nU 8857 ; WX 838 ; N uni2299 ; G 3116\nU 8858 ; WX 838 ; N uni229A ; G 3117\nU 8859 ; WX 838 ; N uni229B ; G 3118\nU 8860 ; WX 838 ; N uni229C ; G 3119\nU 8861 ; WX 838 ; N uni229D ; G 3120\nU 8862 ; WX 838 ; N uni229E ; G 3121\nU 8863 ; WX 838 ; N uni229F ; G 3122\nU 8864 ; WX 838 ; N uni22A0 ; G 3123\nU 8865 ; WX 838 ; N uni22A1 ; G 3124\nU 8866 ; WX 871 ; N uni22A2 ; G 3125\nU 8867 ; WX 871 ; N uni22A3 ; G 3126\nU 8868 ; WX 871 ; N uni22A4 ; G 3127\nU 8869 ; WX 871 ; N perpendicular ; G 3128\nU 8870 ; WX 521 ; N uni22A6 ; G 3129\nU 8871 ; WX 521 ; N uni22A7 ; G 3130\nU 8872 ; WX 871 ; N uni22A8 ; G 3131\nU 8873 ; WX 871 ; N uni22A9 ; G 3132\nU 8874 ; WX 871 ; N uni22AA ; G 3133\nU 8875 ; WX 871 ; N uni22AB ; G 3134\nU 8876 ; WX 871 ; N uni22AC ; G 3135\nU 8877 ; WX 871 ; N uni22AD ; G 3136\nU 8878 ; WX 871 ; N uni22AE ; G 3137\nU 8879 ; WX 871 ; N uni22AF ; G 3138\nU 8880 ; WX 838 ; N uni22B0 ; G 3139\nU 8881 ; WX 838 ; N uni22B1 ; G 3140\nU 8882 ; WX 838 ; N uni22B2 ; G 3141\nU 8883 ; WX 838 ; N uni22B3 ; G 3142\nU 8884 ; WX 838 ; N uni22B4 ; G 3143\nU 8885 ; WX 838 ; N uni22B5 ; G 3144\nU 8886 ; WX 1000 ; N uni22B6 ; G 3145\nU 8887 ; WX 1000 ; N uni22B7 ; G 3146\nU 8888 ; WX 838 ; N uni22B8 ; G 3147\nU 8889 ; WX 838 ; N uni22B9 ; G 3148\nU 8890 ; WX 521 ; N uni22BA ; G 3149\nU 8891 ; WX 732 ; N uni22BB ; G 3150\nU 8892 ; WX 732 ; N uni22BC ; G 3151\nU 8893 ; WX 732 ; N uni22BD ; G 3152\nU 8894 ; WX 838 ; N uni22BE ; G 3153\nU 8895 ; WX 838 ; N uni22BF ; G 3154\nU 8896 ; WX 820 ; N uni22C0 ; G 3155\nU 8897 ; WX 820 ; N uni22C1 ; G 3156\nU 8898 ; WX 820 ; N uni22C2 ; G 3157\nU 8899 ; WX 820 ; N uni22C3 ; G 3158\nU 8900 ; WX 626 ; N uni22C4 ; G 3159\nU 8901 ; WX 318 ; N dotmath ; G 3160\nU 8902 ; WX 626 ; N uni22C6 ; G 3161\nU 8903 ; WX 838 ; N uni22C7 ; G 3162\nU 8904 ; WX 1000 ; N uni22C8 ; G 3163\nU 8905 ; WX 1000 ; N uni22C9 ; G 3164\nU 8906 ; WX 1000 ; N uni22CA ; G 3165\nU 8907 ; WX 1000 ; N uni22CB ; G 3166\nU 8908 ; WX 1000 ; N uni22CC ; G 3167\nU 8909 ; WX 838 ; N uni22CD ; G 3168\nU 8910 ; WX 732 ; N uni22CE ; G 3169\nU 8911 ; WX 732 ; N uni22CF ; G 3170\nU 8912 ; WX 838 ; N uni22D0 ; G 3171\nU 8913 ; WX 838 ; N uni22D1 ; G 3172\nU 8914 ; WX 838 ; N uni22D2 ; G 3173\nU 8915 ; WX 838 ; N uni22D3 ; G 3174\nU 8916 ; WX 838 ; N uni22D4 ; G 3175\nU 8917 ; WX 838 ; N uni22D5 ; G 3176\nU 8918 ; WX 838 ; N uni22D6 ; G 3177\nU 8919 ; WX 838 ; N uni22D7 ; G 3178\nU 8920 ; WX 1422 ; N uni22D8 ; G 3179\nU 8921 ; WX 1422 ; N uni22D9 ; G 3180\nU 8922 ; WX 838 ; N uni22DA ; G 3181\nU 8923 ; WX 838 ; N uni22DB ; G 3182\nU 8924 ; WX 838 ; N uni22DC ; G 3183\nU 8925 ; WX 838 ; N uni22DD ; G 3184\nU 8926 ; WX 838 ; N uni22DE ; G 3185\nU 8927 ; WX 838 ; N uni22DF ; G 3186\nU 8928 ; WX 838 ; N uni22E0 ; G 3187\nU 8929 ; WX 838 ; N uni22E1 ; G 3188\nU 8930 ; WX 838 ; N uni22E2 ; G 3189\nU 8931 ; WX 838 ; N uni22E3 ; G 3190\nU 8932 ; WX 838 ; N uni22E4 ; G 3191\nU 8933 ; WX 838 ; N uni22E5 ; G 3192\nU 8934 ; WX 838 ; N uni22E6 ; G 3193\nU 8935 ; WX 838 ; N uni22E7 ; G 3194\nU 8936 ; WX 838 ; N uni22E8 ; G 3195\nU 8937 ; WX 838 ; N uni22E9 ; G 3196\nU 8938 ; WX 838 ; N uni22EA ; G 3197\nU 8939 ; WX 838 ; N uni22EB ; G 3198\nU 8940 ; WX 838 ; N uni22EC ; G 3199\nU 8941 ; WX 838 ; N uni22ED ; G 3200\nU 8942 ; WX 1000 ; N uni22EE ; G 3201\nU 8943 ; WX 1000 ; N uni22EF ; G 3202\nU 8944 ; WX 1000 ; N uni22F0 ; G 3203\nU 8945 ; WX 1000 ; N uni22F1 ; G 3204\nU 8946 ; WX 1000 ; N uni22F2 ; G 3205\nU 8947 ; WX 871 ; N uni22F3 ; G 3206\nU 8948 ; WX 718 ; N uni22F4 ; G 3207\nU 8949 ; WX 871 ; N uni22F5 ; G 3208\nU 8950 ; WX 871 ; N uni22F6 ; G 3209\nU 8951 ; WX 718 ; N uni22F7 ; G 3210\nU 8952 ; WX 871 ; N uni22F8 ; G 3211\nU 8953 ; WX 871 ; N uni22F9 ; G 3212\nU 8954 ; WX 1000 ; N uni22FA ; G 3213\nU 8955 ; WX 871 ; N uni22FB ; G 3214\nU 8956 ; WX 718 ; N uni22FC ; G 3215\nU 8957 ; WX 871 ; N uni22FD ; G 3216\nU 8958 ; WX 718 ; N uni22FE ; G 3217\nU 8959 ; WX 871 ; N uni22FF ; G 3218\nU 8960 ; WX 602 ; N uni2300 ; G 3219\nU 8961 ; WX 602 ; N uni2301 ; G 3220\nU 8962 ; WX 635 ; N house ; G 3221\nU 8963 ; WX 838 ; N uni2303 ; G 3222\nU 8964 ; WX 838 ; N uni2304 ; G 3223\nU 8965 ; WX 838 ; N uni2305 ; G 3224\nU 8966 ; WX 838 ; N uni2306 ; G 3225\nU 8967 ; WX 488 ; N uni2307 ; G 3226\nU 8968 ; WX 390 ; N uni2308 ; G 3227\nU 8969 ; WX 390 ; N uni2309 ; G 3228\nU 8970 ; WX 390 ; N uni230A ; G 3229\nU 8971 ; WX 390 ; N uni230B ; G 3230\nU 8972 ; WX 809 ; N uni230C ; G 3231\nU 8973 ; WX 809 ; N uni230D ; G 3232\nU 8974 ; WX 809 ; N uni230E ; G 3233\nU 8975 ; WX 809 ; N uni230F ; G 3234\nU 8976 ; WX 838 ; N revlogicalnot ; G 3235\nU 8977 ; WX 513 ; N uni2311 ; G 3236\nU 8984 ; WX 1000 ; N uni2318 ; G 3237\nU 8985 ; WX 838 ; N uni2319 ; G 3238\nU 8988 ; WX 469 ; N uni231C ; G 3239\nU 8989 ; WX 469 ; N uni231D ; G 3240\nU 8990 ; WX 469 ; N uni231E ; G 3241\nU 8991 ; WX 469 ; N uni231F ; G 3242\nU 8992 ; WX 521 ; N integraltp ; G 3243\nU 8993 ; WX 521 ; N integralbt ; G 3244\nU 8996 ; WX 1152 ; N uni2324 ; G 3245\nU 8997 ; WX 1152 ; N uni2325 ; G 3246\nU 8998 ; WX 1414 ; N uni2326 ; G 3247\nU 8999 ; WX 1152 ; N uni2327 ; G 3248\nU 9000 ; WX 1443 ; N uni2328 ; G 3249\nU 9003 ; WX 1414 ; N uni232B ; G 3250\nU 9004 ; WX 873 ; N uni232C ; G 3251\nU 9075 ; WX 338 ; N uni2373 ; G 3252\nU 9076 ; WX 635 ; N uni2374 ; G 3253\nU 9077 ; WX 837 ; N uni2375 ; G 3254\nU 9082 ; WX 659 ; N uni237A ; G 3255\nU 9085 ; WX 757 ; N uni237D ; G 3256\nU 9095 ; WX 1152 ; N uni2387 ; G 3257\nU 9108 ; WX 873 ; N uni2394 ; G 3258\nU 9115 ; WX 500 ; N uni239B ; G 3259\nU 9116 ; WX 500 ; N uni239C ; G 3260\nU 9117 ; WX 500 ; N uni239D ; G 3261\nU 9118 ; WX 500 ; N uni239E ; G 3262\nU 9119 ; WX 500 ; N uni239F ; G 3263\nU 9120 ; WX 500 ; N uni23A0 ; G 3264\nU 9121 ; WX 500 ; N uni23A1 ; G 3265\nU 9122 ; WX 500 ; N uni23A2 ; G 3266\nU 9123 ; WX 500 ; N uni23A3 ; G 3267\nU 9124 ; WX 500 ; N uni23A4 ; G 3268\nU 9125 ; WX 500 ; N uni23A5 ; G 3269\nU 9126 ; WX 500 ; N uni23A6 ; G 3270\nU 9127 ; WX 750 ; N uni23A7 ; G 3271\nU 9128 ; WX 750 ; N uni23A8 ; G 3272\nU 9129 ; WX 750 ; N uni23A9 ; G 3273\nU 9130 ; WX 750 ; N uni23AA ; G 3274\nU 9131 ; WX 750 ; N uni23AB ; G 3275\nU 9132 ; WX 750 ; N uni23AC ; G 3276\nU 9133 ; WX 750 ; N uni23AD ; G 3277\nU 9134 ; WX 521 ; N uni23AE ; G 3278\nU 9166 ; WX 838 ; N uni23CE ; G 3279\nU 9167 ; WX 945 ; N uni23CF ; G 3280\nU 9187 ; WX 873 ; N uni23E3 ; G 3281\nU 9189 ; WX 769 ; N uni23E5 ; G 3282\nU 9192 ; WX 636 ; N uni23E8 ; G 3283\nU 9250 ; WX 635 ; N uni2422 ; G 3284\nU 9251 ; WX 635 ; N uni2423 ; G 3285\nU 9312 ; WX 896 ; N uni2460 ; G 3286\nU 9313 ; WX 896 ; N uni2461 ; G 3287\nU 9314 ; WX 896 ; N uni2462 ; G 3288\nU 9315 ; WX 896 ; N uni2463 ; G 3289\nU 9316 ; WX 896 ; N uni2464 ; G 3290\nU 9317 ; WX 896 ; N uni2465 ; G 3291\nU 9318 ; WX 896 ; N uni2466 ; G 3292\nU 9319 ; WX 896 ; N uni2467 ; G 3293\nU 9320 ; WX 896 ; N uni2468 ; G 3294\nU 9321 ; WX 896 ; N uni2469 ; G 3295\nU 9472 ; WX 602 ; N SF100000 ; G 3296\nU 9473 ; WX 602 ; N uni2501 ; G 3297\nU 9474 ; WX 602 ; N SF110000 ; G 3298\nU 9475 ; WX 602 ; N uni2503 ; G 3299\nU 9476 ; WX 602 ; N uni2504 ; G 3300\nU 9477 ; WX 602 ; N uni2505 ; G 3301\nU 9478 ; WX 602 ; N uni2506 ; G 3302\nU 9479 ; WX 602 ; N uni2507 ; G 3303\nU 9480 ; WX 602 ; N uni2508 ; G 3304\nU 9481 ; WX 602 ; N uni2509 ; G 3305\nU 9482 ; WX 602 ; N uni250A ; G 3306\nU 9483 ; WX 602 ; N uni250B ; G 3307\nU 9484 ; WX 602 ; N SF010000 ; G 3308\nU 9485 ; WX 602 ; N uni250D ; G 3309\nU 9486 ; WX 602 ; N uni250E ; G 3310\nU 9487 ; WX 602 ; N uni250F ; G 3311\nU 9488 ; WX 602 ; N SF030000 ; G 3312\nU 9489 ; WX 602 ; N uni2511 ; G 3313\nU 9490 ; WX 602 ; N uni2512 ; G 3314\nU 9491 ; WX 602 ; N uni2513 ; G 3315\nU 9492 ; WX 602 ; N SF020000 ; G 3316\nU 9493 ; WX 602 ; N uni2515 ; G 3317\nU 9494 ; WX 602 ; N uni2516 ; G 3318\nU 9495 ; WX 602 ; N uni2517 ; G 3319\nU 9496 ; WX 602 ; N SF040000 ; G 3320\nU 9497 ; WX 602 ; N uni2519 ; G 3321\nU 9498 ; WX 602 ; N uni251A ; G 3322\nU 9499 ; WX 602 ; N uni251B ; G 3323\nU 9500 ; WX 602 ; N SF080000 ; G 3324\nU 9501 ; WX 602 ; N uni251D ; G 3325\nU 9502 ; WX 602 ; N uni251E ; G 3326\nU 9503 ; WX 602 ; N uni251F ; G 3327\nU 9504 ; WX 602 ; N uni2520 ; G 3328\nU 9505 ; WX 602 ; N uni2521 ; G 3329\nU 9506 ; WX 602 ; N uni2522 ; G 3330\nU 9507 ; WX 602 ; N uni2523 ; G 3331\nU 9508 ; WX 602 ; N SF090000 ; G 3332\nU 9509 ; WX 602 ; N uni2525 ; G 3333\nU 9510 ; WX 602 ; N uni2526 ; G 3334\nU 9511 ; WX 602 ; N uni2527 ; G 3335\nU 9512 ; WX 602 ; N uni2528 ; G 3336\nU 9513 ; WX 602 ; N uni2529 ; G 3337\nU 9514 ; WX 602 ; N uni252A ; G 3338\nU 9515 ; WX 602 ; N uni252B ; G 3339\nU 9516 ; WX 602 ; N SF060000 ; G 3340\nU 9517 ; WX 602 ; N uni252D ; G 3341\nU 9518 ; WX 602 ; N uni252E ; G 3342\nU 9519 ; WX 602 ; N uni252F ; G 3343\nU 9520 ; WX 602 ; N uni2530 ; G 3344\nU 9521 ; WX 602 ; N uni2531 ; G 3345\nU 9522 ; WX 602 ; N uni2532 ; G 3346\nU 9523 ; WX 602 ; N uni2533 ; G 3347\nU 9524 ; WX 602 ; N SF070000 ; G 3348\nU 9525 ; WX 602 ; N uni2535 ; G 3349\nU 9526 ; WX 602 ; N uni2536 ; G 3350\nU 9527 ; WX 602 ; N uni2537 ; G 3351\nU 9528 ; WX 602 ; N uni2538 ; G 3352\nU 9529 ; WX 602 ; N uni2539 ; G 3353\nU 9530 ; WX 602 ; N uni253A ; G 3354\nU 9531 ; WX 602 ; N uni253B ; G 3355\nU 9532 ; WX 602 ; N SF050000 ; G 3356\nU 9533 ; WX 602 ; N uni253D ; G 3357\nU 9534 ; WX 602 ; N uni253E ; G 3358\nU 9535 ; WX 602 ; N uni253F ; G 3359\nU 9536 ; WX 602 ; N uni2540 ; G 3360\nU 9537 ; WX 602 ; N uni2541 ; G 3361\nU 9538 ; WX 602 ; N uni2542 ; G 3362\nU 9539 ; WX 602 ; N uni2543 ; G 3363\nU 9540 ; WX 602 ; N uni2544 ; G 3364\nU 9541 ; WX 602 ; N uni2545 ; G 3365\nU 9542 ; WX 602 ; N uni2546 ; G 3366\nU 9543 ; WX 602 ; N uni2547 ; G 3367\nU 9544 ; WX 602 ; N uni2548 ; G 3368\nU 9545 ; WX 602 ; N uni2549 ; G 3369\nU 9546 ; WX 602 ; N uni254A ; G 3370\nU 9547 ; WX 602 ; N uni254B ; G 3371\nU 9548 ; WX 602 ; N uni254C ; G 3372\nU 9549 ; WX 602 ; N uni254D ; G 3373\nU 9550 ; WX 602 ; N uni254E ; G 3374\nU 9551 ; WX 602 ; N uni254F ; G 3375\nU 9552 ; WX 602 ; N SF430000 ; G 3376\nU 9553 ; WX 602 ; N SF240000 ; G 3377\nU 9554 ; WX 602 ; N SF510000 ; G 3378\nU 9555 ; WX 602 ; N SF520000 ; G 3379\nU 9556 ; WX 602 ; N SF390000 ; G 3380\nU 9557 ; WX 602 ; N SF220000 ; G 3381\nU 9558 ; WX 602 ; N SF210000 ; G 3382\nU 9559 ; WX 602 ; N SF250000 ; G 3383\nU 9560 ; WX 602 ; N SF500000 ; G 3384\nU 9561 ; WX 602 ; N SF490000 ; G 3385\nU 9562 ; WX 602 ; N SF380000 ; G 3386\nU 9563 ; WX 602 ; N SF280000 ; G 3387\nU 9564 ; WX 602 ; N SF270000 ; G 3388\nU 9565 ; WX 602 ; N SF260000 ; G 3389\nU 9566 ; WX 602 ; N SF360000 ; G 3390\nU 9567 ; WX 602 ; N SF370000 ; G 3391\nU 9568 ; WX 602 ; N SF420000 ; G 3392\nU 9569 ; WX 602 ; N SF190000 ; G 3393\nU 9570 ; WX 602 ; N SF200000 ; G 3394\nU 9571 ; WX 602 ; N SF230000 ; G 3395\nU 9572 ; WX 602 ; N SF470000 ; G 3396\nU 9573 ; WX 602 ; N SF480000 ; G 3397\nU 9574 ; WX 602 ; N SF410000 ; G 3398\nU 9575 ; WX 602 ; N SF450000 ; G 3399\nU 9576 ; WX 602 ; N SF460000 ; G 3400\nU 9577 ; WX 602 ; N SF400000 ; G 3401\nU 9578 ; WX 602 ; N SF540000 ; G 3402\nU 9579 ; WX 602 ; N SF530000 ; G 3403\nU 9580 ; WX 602 ; N SF440000 ; G 3404\nU 9581 ; WX 602 ; N uni256D ; G 3405\nU 9582 ; WX 602 ; N uni256E ; G 3406\nU 9583 ; WX 602 ; N uni256F ; G 3407\nU 9584 ; WX 602 ; N uni2570 ; G 3408\nU 9585 ; WX 602 ; N uni2571 ; G 3409\nU 9586 ; WX 602 ; N uni2572 ; G 3410\nU 9587 ; WX 602 ; N uni2573 ; G 3411\nU 9588 ; WX 602 ; N uni2574 ; G 3412\nU 9589 ; WX 602 ; N uni2575 ; G 3413\nU 9590 ; WX 602 ; N uni2576 ; G 3414\nU 9591 ; WX 602 ; N uni2577 ; G 3415\nU 9592 ; WX 602 ; N uni2578 ; G 3416\nU 9593 ; WX 602 ; N uni2579 ; G 3417\nU 9594 ; WX 602 ; N uni257A ; G 3418\nU 9595 ; WX 602 ; N uni257B ; G 3419\nU 9596 ; WX 602 ; N uni257C ; G 3420\nU 9597 ; WX 602 ; N uni257D ; G 3421\nU 9598 ; WX 602 ; N uni257E ; G 3422\nU 9599 ; WX 602 ; N uni257F ; G 3423\nU 9600 ; WX 769 ; N upblock ; G 3424\nU 9601 ; WX 769 ; N uni2581 ; G 3425\nU 9602 ; WX 769 ; N uni2582 ; G 3426\nU 9603 ; WX 769 ; N uni2583 ; G 3427\nU 9604 ; WX 769 ; N dnblock ; G 3428\nU 9605 ; WX 769 ; N uni2585 ; G 3429\nU 9606 ; WX 769 ; N uni2586 ; G 3430\nU 9607 ; WX 769 ; N uni2587 ; G 3431\nU 9608 ; WX 769 ; N block ; G 3432\nU 9609 ; WX 769 ; N uni2589 ; G 3433\nU 9610 ; WX 769 ; N uni258A ; G 3434\nU 9611 ; WX 769 ; N uni258B ; G 3435\nU 9612 ; WX 769 ; N lfblock ; G 3436\nU 9613 ; WX 769 ; N uni258D ; G 3437\nU 9614 ; WX 769 ; N uni258E ; G 3438\nU 9615 ; WX 769 ; N uni258F ; G 3439\nU 9616 ; WX 769 ; N rtblock ; G 3440\nU 9617 ; WX 769 ; N ltshade ; G 3441\nU 9618 ; WX 769 ; N shade ; G 3442\nU 9619 ; WX 769 ; N dkshade ; G 3443\nU 9620 ; WX 769 ; N uni2594 ; G 3444\nU 9621 ; WX 769 ; N uni2595 ; G 3445\nU 9622 ; WX 769 ; N uni2596 ; G 3446\nU 9623 ; WX 769 ; N uni2597 ; G 3447\nU 9624 ; WX 769 ; N uni2598 ; G 3448\nU 9625 ; WX 769 ; N uni2599 ; G 3449\nU 9626 ; WX 769 ; N uni259A ; G 3450\nU 9627 ; WX 769 ; N uni259B ; G 3451\nU 9628 ; WX 769 ; N uni259C ; G 3452\nU 9629 ; WX 769 ; N uni259D ; G 3453\nU 9630 ; WX 769 ; N uni259E ; G 3454\nU 9631 ; WX 769 ; N uni259F ; G 3455\nU 9632 ; WX 945 ; N filledbox ; G 3456\nU 9633 ; WX 945 ; N H22073 ; G 3457\nU 9634 ; WX 945 ; N uni25A2 ; G 3458\nU 9635 ; WX 945 ; N uni25A3 ; G 3459\nU 9636 ; WX 945 ; N uni25A4 ; G 3460\nU 9637 ; WX 945 ; N uni25A5 ; G 3461\nU 9638 ; WX 945 ; N uni25A6 ; G 3462\nU 9639 ; WX 945 ; N uni25A7 ; G 3463\nU 9640 ; WX 945 ; N uni25A8 ; G 3464\nU 9641 ; WX 945 ; N uni25A9 ; G 3465\nU 9642 ; WX 678 ; N H18543 ; G 3466\nU 9643 ; WX 678 ; N H18551 ; G 3467\nU 9644 ; WX 945 ; N filledrect ; G 3468\nU 9645 ; WX 945 ; N uni25AD ; G 3469\nU 9646 ; WX 550 ; N uni25AE ; G 3470\nU 9647 ; WX 550 ; N uni25AF ; G 3471\nU 9648 ; WX 769 ; N uni25B0 ; G 3472\nU 9649 ; WX 769 ; N uni25B1 ; G 3473\nU 9650 ; WX 769 ; N triagup ; G 3474\nU 9651 ; WX 769 ; N uni25B3 ; G 3475\nU 9652 ; WX 502 ; N uni25B4 ; G 3476\nU 9653 ; WX 502 ; N uni25B5 ; G 3477\nU 9654 ; WX 769 ; N uni25B6 ; G 3478\nU 9655 ; WX 769 ; N uni25B7 ; G 3479\nU 9656 ; WX 502 ; N uni25B8 ; G 3480\nU 9657 ; WX 502 ; N uni25B9 ; G 3481\nU 9658 ; WX 769 ; N triagrt ; G 3482\nU 9659 ; WX 769 ; N uni25BB ; G 3483\nU 9660 ; WX 769 ; N triagdn ; G 3484\nU 9661 ; WX 769 ; N uni25BD ; G 3485\nU 9662 ; WX 502 ; N uni25BE ; G 3486\nU 9663 ; WX 502 ; N uni25BF ; G 3487\nU 9664 ; WX 769 ; N uni25C0 ; G 3488\nU 9665 ; WX 769 ; N uni25C1 ; G 3489\nU 9666 ; WX 502 ; N uni25C2 ; G 3490\nU 9667 ; WX 502 ; N uni25C3 ; G 3491\nU 9668 ; WX 769 ; N triaglf ; G 3492\nU 9669 ; WX 769 ; N uni25C5 ; G 3493\nU 9670 ; WX 769 ; N uni25C6 ; G 3494\nU 9671 ; WX 769 ; N uni25C7 ; G 3495\nU 9672 ; WX 769 ; N uni25C8 ; G 3496\nU 9673 ; WX 873 ; N uni25C9 ; G 3497\nU 9674 ; WX 494 ; N lozenge ; G 3498\nU 9675 ; WX 873 ; N circle ; G 3499\nU 9676 ; WX 873 ; N uni25CC ; G 3500\nU 9677 ; WX 873 ; N uni25CD ; G 3501\nU 9678 ; WX 873 ; N uni25CE ; G 3502\nU 9679 ; WX 873 ; N H18533 ; G 3503\nU 9680 ; WX 873 ; N uni25D0 ; G 3504\nU 9681 ; WX 873 ; N uni25D1 ; G 3505\nU 9682 ; WX 873 ; N uni25D2 ; G 3506\nU 9683 ; WX 873 ; N uni25D3 ; G 3507\nU 9684 ; WX 873 ; N uni25D4 ; G 3508\nU 9685 ; WX 873 ; N uni25D5 ; G 3509\nU 9686 ; WX 527 ; N uni25D6 ; G 3510\nU 9687 ; WX 527 ; N uni25D7 ; G 3511\nU 9688 ; WX 791 ; N invbullet ; G 3512\nU 9689 ; WX 970 ; N invcircle ; G 3513\nU 9690 ; WX 970 ; N uni25DA ; G 3514\nU 9691 ; WX 970 ; N uni25DB ; G 3515\nU 9692 ; WX 387 ; N uni25DC ; G 3516\nU 9693 ; WX 387 ; N uni25DD ; G 3517\nU 9694 ; WX 387 ; N uni25DE ; G 3518\nU 9695 ; WX 387 ; N uni25DF ; G 3519\nU 9696 ; WX 769 ; N uni25E0 ; G 3520\nU 9697 ; WX 769 ; N uni25E1 ; G 3521\nU 9698 ; WX 769 ; N uni25E2 ; G 3522\nU 9699 ; WX 769 ; N uni25E3 ; G 3523\nU 9700 ; WX 769 ; N uni25E4 ; G 3524\nU 9701 ; WX 769 ; N uni25E5 ; G 3525\nU 9702 ; WX 590 ; N openbullet ; G 3526\nU 9703 ; WX 945 ; N uni25E7 ; G 3527\nU 9704 ; WX 945 ; N uni25E8 ; G 3528\nU 9705 ; WX 945 ; N uni25E9 ; G 3529\nU 9706 ; WX 945 ; N uni25EA ; G 3530\nU 9707 ; WX 945 ; N uni25EB ; G 3531\nU 9708 ; WX 769 ; N uni25EC ; G 3532\nU 9709 ; WX 769 ; N uni25ED ; G 3533\nU 9710 ; WX 769 ; N uni25EE ; G 3534\nU 9711 ; WX 1119 ; N uni25EF ; G 3535\nU 9712 ; WX 945 ; N uni25F0 ; G 3536\nU 9713 ; WX 945 ; N uni25F1 ; G 3537\nU 9714 ; WX 945 ; N uni25F2 ; G 3538\nU 9715 ; WX 945 ; N uni25F3 ; G 3539\nU 9716 ; WX 873 ; N uni25F4 ; G 3540\nU 9717 ; WX 873 ; N uni25F5 ; G 3541\nU 9718 ; WX 873 ; N uni25F6 ; G 3542\nU 9719 ; WX 873 ; N uni25F7 ; G 3543\nU 9720 ; WX 769 ; N uni25F8 ; G 3544\nU 9721 ; WX 769 ; N uni25F9 ; G 3545\nU 9722 ; WX 769 ; N uni25FA ; G 3546\nU 9723 ; WX 830 ; N uni25FB ; G 3547\nU 9724 ; WX 830 ; N uni25FC ; G 3548\nU 9725 ; WX 732 ; N uni25FD ; G 3549\nU 9726 ; WX 732 ; N uni25FE ; G 3550\nU 9727 ; WX 769 ; N uni25FF ; G 3551\nU 9728 ; WX 896 ; N uni2600 ; G 3552\nU 9729 ; WX 1000 ; N uni2601 ; G 3553\nU 9730 ; WX 896 ; N uni2602 ; G 3554\nU 9731 ; WX 896 ; N uni2603 ; G 3555\nU 9732 ; WX 896 ; N uni2604 ; G 3556\nU 9733 ; WX 896 ; N uni2605 ; G 3557\nU 9734 ; WX 896 ; N uni2606 ; G 3558\nU 9735 ; WX 573 ; N uni2607 ; G 3559\nU 9736 ; WX 896 ; N uni2608 ; G 3560\nU 9737 ; WX 896 ; N uni2609 ; G 3561\nU 9738 ; WX 888 ; N uni260A ; G 3562\nU 9739 ; WX 888 ; N uni260B ; G 3563\nU 9740 ; WX 671 ; N uni260C ; G 3564\nU 9741 ; WX 1013 ; N uni260D ; G 3565\nU 9742 ; WX 1246 ; N uni260E ; G 3566\nU 9743 ; WX 1250 ; N uni260F ; G 3567\nU 9744 ; WX 896 ; N uni2610 ; G 3568\nU 9745 ; WX 896 ; N uni2611 ; G 3569\nU 9746 ; WX 896 ; N uni2612 ; G 3570\nU 9747 ; WX 532 ; N uni2613 ; G 3571\nU 9748 ; WX 896 ; N uni2614 ; G 3572\nU 9749 ; WX 896 ; N uni2615 ; G 3573\nU 9750 ; WX 896 ; N uni2616 ; G 3574\nU 9751 ; WX 896 ; N uni2617 ; G 3575\nU 9752 ; WX 896 ; N uni2618 ; G 3576\nU 9753 ; WX 896 ; N uni2619 ; G 3577\nU 9754 ; WX 896 ; N uni261A ; G 3578\nU 9755 ; WX 896 ; N uni261B ; G 3579\nU 9756 ; WX 896 ; N uni261C ; G 3580\nU 9757 ; WX 609 ; N uni261D ; G 3581\nU 9758 ; WX 896 ; N uni261E ; G 3582\nU 9759 ; WX 609 ; N uni261F ; G 3583\nU 9760 ; WX 896 ; N uni2620 ; G 3584\nU 9761 ; WX 896 ; N uni2621 ; G 3585\nU 9762 ; WX 896 ; N uni2622 ; G 3586\nU 9763 ; WX 896 ; N uni2623 ; G 3587\nU 9764 ; WX 669 ; N uni2624 ; G 3588\nU 9765 ; WX 746 ; N uni2625 ; G 3589\nU 9766 ; WX 649 ; N uni2626 ; G 3590\nU 9767 ; WX 784 ; N uni2627 ; G 3591\nU 9768 ; WX 545 ; N uni2628 ; G 3592\nU 9769 ; WX 896 ; N uni2629 ; G 3593\nU 9770 ; WX 896 ; N uni262A ; G 3594\nU 9771 ; WX 896 ; N uni262B ; G 3595\nU 9772 ; WX 710 ; N uni262C ; G 3596\nU 9773 ; WX 896 ; N uni262D ; G 3597\nU 9774 ; WX 896 ; N uni262E ; G 3598\nU 9775 ; WX 896 ; N uni262F ; G 3599\nU 9776 ; WX 890 ; N uni2630 ; G 3600\nU 9777 ; WX 890 ; N uni2631 ; G 3601\nU 9778 ; WX 890 ; N uni2632 ; G 3602\nU 9779 ; WX 890 ; N uni2633 ; G 3603\nU 9780 ; WX 890 ; N uni2634 ; G 3604\nU 9781 ; WX 890 ; N uni2635 ; G 3605\nU 9782 ; WX 890 ; N uni2636 ; G 3606\nU 9783 ; WX 890 ; N uni2637 ; G 3607\nU 9784 ; WX 896 ; N uni2638 ; G 3608\nU 9785 ; WX 1042 ; N uni2639 ; G 3609\nU 9786 ; WX 1042 ; N smileface ; G 3610\nU 9787 ; WX 1042 ; N invsmileface ; G 3611\nU 9788 ; WX 896 ; N sun ; G 3612\nU 9789 ; WX 896 ; N uni263D ; G 3613\nU 9790 ; WX 896 ; N uni263E ; G 3614\nU 9791 ; WX 614 ; N uni263F ; G 3615\nU 9792 ; WX 732 ; N female ; G 3616\nU 9793 ; WX 732 ; N uni2641 ; G 3617\nU 9794 ; WX 896 ; N male ; G 3618\nU 9795 ; WX 896 ; N uni2643 ; G 3619\nU 9796 ; WX 896 ; N uni2644 ; G 3620\nU 9797 ; WX 896 ; N uni2645 ; G 3621\nU 9798 ; WX 896 ; N uni2646 ; G 3622\nU 9799 ; WX 896 ; N uni2647 ; G 3623\nU 9800 ; WX 896 ; N uni2648 ; G 3624\nU 9801 ; WX 896 ; N uni2649 ; G 3625\nU 9802 ; WX 896 ; N uni264A ; G 3626\nU 9803 ; WX 896 ; N uni264B ; G 3627\nU 9804 ; WX 896 ; N uni264C ; G 3628\nU 9805 ; WX 896 ; N uni264D ; G 3629\nU 9806 ; WX 896 ; N uni264E ; G 3630\nU 9807 ; WX 896 ; N uni264F ; G 3631\nU 9808 ; WX 896 ; N uni2650 ; G 3632\nU 9809 ; WX 896 ; N uni2651 ; G 3633\nU 9810 ; WX 896 ; N uni2652 ; G 3634\nU 9811 ; WX 896 ; N uni2653 ; G 3635\nU 9812 ; WX 896 ; N uni2654 ; G 3636\nU 9813 ; WX 896 ; N uni2655 ; G 3637\nU 9814 ; WX 896 ; N uni2656 ; G 3638\nU 9815 ; WX 896 ; N uni2657 ; G 3639\nU 9816 ; WX 896 ; N uni2658 ; G 3640\nU 9817 ; WX 896 ; N uni2659 ; G 3641\nU 9818 ; WX 896 ; N uni265A ; G 3642\nU 9819 ; WX 896 ; N uni265B ; G 3643\nU 9820 ; WX 896 ; N uni265C ; G 3644\nU 9821 ; WX 896 ; N uni265D ; G 3645\nU 9822 ; WX 896 ; N uni265E ; G 3646\nU 9823 ; WX 896 ; N uni265F ; G 3647\nU 9824 ; WX 896 ; N spade ; G 3648\nU 9825 ; WX 896 ; N uni2661 ; G 3649\nU 9826 ; WX 896 ; N uni2662 ; G 3650\nU 9827 ; WX 896 ; N club ; G 3651\nU 9828 ; WX 896 ; N uni2664 ; G 3652\nU 9829 ; WX 896 ; N heart ; G 3653\nU 9830 ; WX 896 ; N diamond ; G 3654\nU 9831 ; WX 896 ; N uni2667 ; G 3655\nU 9832 ; WX 896 ; N uni2668 ; G 3656\nU 9833 ; WX 472 ; N uni2669 ; G 3657\nU 9834 ; WX 638 ; N musicalnote ; G 3658\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3659\nU 9836 ; WX 896 ; N uni266C ; G 3660\nU 9837 ; WX 472 ; N uni266D ; G 3661\nU 9838 ; WX 357 ; N uni266E ; G 3662\nU 9839 ; WX 484 ; N uni266F ; G 3663\nU 9840 ; WX 748 ; N uni2670 ; G 3664\nU 9841 ; WX 766 ; N uni2671 ; G 3665\nU 9842 ; WX 896 ; N uni2672 ; G 3666\nU 9843 ; WX 896 ; N uni2673 ; G 3667\nU 9844 ; WX 896 ; N uni2674 ; G 3668\nU 9845 ; WX 896 ; N uni2675 ; G 3669\nU 9846 ; WX 896 ; N uni2676 ; G 3670\nU 9847 ; WX 896 ; N uni2677 ; G 3671\nU 9848 ; WX 896 ; N uni2678 ; G 3672\nU 9849 ; WX 896 ; N uni2679 ; G 3673\nU 9850 ; WX 896 ; N uni267A ; G 3674\nU 9851 ; WX 896 ; N uni267B ; G 3675\nU 9852 ; WX 896 ; N uni267C ; G 3676\nU 9853 ; WX 896 ; N uni267D ; G 3677\nU 9854 ; WX 896 ; N uni267E ; G 3678\nU 9855 ; WX 896 ; N uni267F ; G 3679\nU 9856 ; WX 869 ; N uni2680 ; G 3680\nU 9857 ; WX 869 ; N uni2681 ; G 3681\nU 9858 ; WX 869 ; N uni2682 ; G 3682\nU 9859 ; WX 869 ; N uni2683 ; G 3683\nU 9860 ; WX 869 ; N uni2684 ; G 3684\nU 9861 ; WX 869 ; N uni2685 ; G 3685\nU 9862 ; WX 890 ; N uni2686 ; G 3686\nU 9863 ; WX 890 ; N uni2687 ; G 3687\nU 9864 ; WX 890 ; N uni2688 ; G 3688\nU 9865 ; WX 890 ; N uni2689 ; G 3689\nU 9866 ; WX 890 ; N uni268A ; G 3690\nU 9867 ; WX 890 ; N uni268B ; G 3691\nU 9868 ; WX 890 ; N uni268C ; G 3692\nU 9869 ; WX 890 ; N uni268D ; G 3693\nU 9870 ; WX 890 ; N uni268E ; G 3694\nU 9871 ; WX 890 ; N uni268F ; G 3695\nU 9872 ; WX 750 ; N uni2690 ; G 3696\nU 9873 ; WX 750 ; N uni2691 ; G 3697\nU 9874 ; WX 890 ; N uni2692 ; G 3698\nU 9875 ; WX 816 ; N uni2693 ; G 3699\nU 9876 ; WX 716 ; N uni2694 ; G 3700\nU 9877 ; WX 537 ; N uni2695 ; G 3701\nU 9878 ; WX 852 ; N uni2696 ; G 3702\nU 9879 ; WX 890 ; N uni2697 ; G 3703\nU 9880 ; WX 684 ; N uni2698 ; G 3704\nU 9881 ; WX 896 ; N uni2699 ; G 3705\nU 9882 ; WX 708 ; N uni269A ; G 3706\nU 9883 ; WX 890 ; N uni269B ; G 3707\nU 9884 ; WX 890 ; N uni269C ; G 3708\nU 9886 ; WX 896 ; N uni269E ; G 3709\nU 9887 ; WX 896 ; N uni269F ; G 3710\nU 9888 ; WX 890 ; N uni26A0 ; G 3711\nU 9889 ; WX 702 ; N uni26A1 ; G 3712\nU 9890 ; WX 1004 ; N uni26A2 ; G 3713\nU 9891 ; WX 1089 ; N uni26A3 ; G 3714\nU 9892 ; WX 1175 ; N uni26A4 ; G 3715\nU 9893 ; WX 903 ; N uni26A5 ; G 3716\nU 9894 ; WX 838 ; N uni26A6 ; G 3717\nU 9895 ; WX 838 ; N uni26A7 ; G 3718\nU 9896 ; WX 838 ; N uni26A8 ; G 3719\nU 9897 ; WX 838 ; N uni26A9 ; G 3720\nU 9898 ; WX 838 ; N uni26AA ; G 3721\nU 9899 ; WX 838 ; N uni26AB ; G 3722\nU 9900 ; WX 838 ; N uni26AC ; G 3723\nU 9901 ; WX 838 ; N uni26AD ; G 3724\nU 9902 ; WX 838 ; N uni26AE ; G 3725\nU 9903 ; WX 838 ; N uni26AF ; G 3726\nU 9904 ; WX 844 ; N uni26B0 ; G 3727\nU 9905 ; WX 838 ; N uni26B1 ; G 3728\nU 9906 ; WX 732 ; N uni26B2 ; G 3729\nU 9907 ; WX 732 ; N uni26B3 ; G 3730\nU 9908 ; WX 732 ; N uni26B4 ; G 3731\nU 9909 ; WX 732 ; N uni26B5 ; G 3732\nU 9910 ; WX 850 ; N uni26B6 ; G 3733\nU 9911 ; WX 732 ; N uni26B7 ; G 3734\nU 9912 ; WX 732 ; N uni26B8 ; G 3735\nU 9920 ; WX 838 ; N uni26C0 ; G 3736\nU 9921 ; WX 838 ; N uni26C1 ; G 3737\nU 9922 ; WX 838 ; N uni26C2 ; G 3738\nU 9923 ; WX 838 ; N uni26C3 ; G 3739\nU 9954 ; WX 732 ; N uni26E2 ; G 3740\nU 9985 ; WX 838 ; N uni2701 ; G 3741\nU 9986 ; WX 838 ; N uni2702 ; G 3742\nU 9987 ; WX 838 ; N uni2703 ; G 3743\nU 9988 ; WX 838 ; N uni2704 ; G 3744\nU 9990 ; WX 838 ; N uni2706 ; G 3745\nU 9991 ; WX 838 ; N uni2707 ; G 3746\nU 9992 ; WX 838 ; N uni2708 ; G 3747\nU 9993 ; WX 838 ; N uni2709 ; G 3748\nU 9996 ; WX 838 ; N uni270C ; G 3749\nU 9997 ; WX 838 ; N uni270D ; G 3750\nU 9998 ; WX 838 ; N uni270E ; G 3751\nU 9999 ; WX 838 ; N uni270F ; G 3752\nU 10000 ; WX 838 ; N uni2710 ; G 3753\nU 10001 ; WX 838 ; N uni2711 ; G 3754\nU 10002 ; WX 838 ; N uni2712 ; G 3755\nU 10003 ; WX 838 ; N uni2713 ; G 3756\nU 10004 ; WX 838 ; N uni2714 ; G 3757\nU 10005 ; WX 838 ; N uni2715 ; G 3758\nU 10006 ; WX 838 ; N uni2716 ; G 3759\nU 10007 ; WX 838 ; N uni2717 ; G 3760\nU 10008 ; WX 838 ; N uni2718 ; G 3761\nU 10009 ; WX 838 ; N uni2719 ; G 3762\nU 10010 ; WX 838 ; N uni271A ; G 3763\nU 10011 ; WX 838 ; N uni271B ; G 3764\nU 10012 ; WX 838 ; N uni271C ; G 3765\nU 10013 ; WX 838 ; N uni271D ; G 3766\nU 10014 ; WX 838 ; N uni271E ; G 3767\nU 10015 ; WX 838 ; N uni271F ; G 3768\nU 10016 ; WX 838 ; N uni2720 ; G 3769\nU 10017 ; WX 838 ; N uni2721 ; G 3770\nU 10018 ; WX 838 ; N uni2722 ; G 3771\nU 10019 ; WX 838 ; N uni2723 ; G 3772\nU 10020 ; WX 838 ; N uni2724 ; G 3773\nU 10021 ; WX 838 ; N uni2725 ; G 3774\nU 10022 ; WX 838 ; N uni2726 ; G 3775\nU 10023 ; WX 838 ; N uni2727 ; G 3776\nU 10025 ; WX 838 ; N uni2729 ; G 3777\nU 10026 ; WX 838 ; N uni272A ; G 3778\nU 10027 ; WX 838 ; N uni272B ; G 3779\nU 10028 ; WX 838 ; N uni272C ; G 3780\nU 10029 ; WX 838 ; N uni272D ; G 3781\nU 10030 ; WX 838 ; N uni272E ; G 3782\nU 10031 ; WX 838 ; N uni272F ; G 3783\nU 10032 ; WX 838 ; N uni2730 ; G 3784\nU 10033 ; WX 838 ; N uni2731 ; G 3785\nU 10034 ; WX 838 ; N uni2732 ; G 3786\nU 10035 ; WX 838 ; N uni2733 ; G 3787\nU 10036 ; WX 838 ; N uni2734 ; G 3788\nU 10037 ; WX 838 ; N uni2735 ; G 3789\nU 10038 ; WX 838 ; N uni2736 ; G 3790\nU 10039 ; WX 838 ; N uni2737 ; G 3791\nU 10040 ; WX 838 ; N uni2738 ; G 3792\nU 10041 ; WX 838 ; N uni2739 ; G 3793\nU 10042 ; WX 838 ; N uni273A ; G 3794\nU 10043 ; WX 838 ; N uni273B ; G 3795\nU 10044 ; WX 838 ; N uni273C ; G 3796\nU 10045 ; WX 838 ; N uni273D ; G 3797\nU 10046 ; WX 838 ; N uni273E ; G 3798\nU 10047 ; WX 838 ; N uni273F ; G 3799\nU 10048 ; WX 838 ; N uni2740 ; G 3800\nU 10049 ; WX 838 ; N uni2741 ; G 3801\nU 10050 ; WX 838 ; N uni2742 ; G 3802\nU 10051 ; WX 838 ; N uni2743 ; G 3803\nU 10052 ; WX 838 ; N uni2744 ; G 3804\nU 10053 ; WX 838 ; N uni2745 ; G 3805\nU 10054 ; WX 838 ; N uni2746 ; G 3806\nU 10055 ; WX 838 ; N uni2747 ; G 3807\nU 10056 ; WX 838 ; N uni2748 ; G 3808\nU 10057 ; WX 838 ; N uni2749 ; G 3809\nU 10058 ; WX 838 ; N uni274A ; G 3810\nU 10059 ; WX 838 ; N uni274B ; G 3811\nU 10061 ; WX 896 ; N uni274D ; G 3812\nU 10063 ; WX 896 ; N uni274F ; G 3813\nU 10064 ; WX 896 ; N uni2750 ; G 3814\nU 10065 ; WX 896 ; N uni2751 ; G 3815\nU 10066 ; WX 896 ; N uni2752 ; G 3816\nU 10070 ; WX 896 ; N uni2756 ; G 3817\nU 10072 ; WX 838 ; N uni2758 ; G 3818\nU 10073 ; WX 838 ; N uni2759 ; G 3819\nU 10074 ; WX 838 ; N uni275A ; G 3820\nU 10075 ; WX 322 ; N uni275B ; G 3821\nU 10076 ; WX 322 ; N uni275C ; G 3822\nU 10077 ; WX 538 ; N uni275D ; G 3823\nU 10078 ; WX 538 ; N uni275E ; G 3824\nU 10081 ; WX 838 ; N uni2761 ; G 3825\nU 10082 ; WX 838 ; N uni2762 ; G 3826\nU 10083 ; WX 838 ; N uni2763 ; G 3827\nU 10084 ; WX 838 ; N uni2764 ; G 3828\nU 10085 ; WX 838 ; N uni2765 ; G 3829\nU 10086 ; WX 838 ; N uni2766 ; G 3830\nU 10087 ; WX 838 ; N uni2767 ; G 3831\nU 10088 ; WX 838 ; N uni2768 ; G 3832\nU 10089 ; WX 838 ; N uni2769 ; G 3833\nU 10090 ; WX 838 ; N uni276A ; G 3834\nU 10091 ; WX 838 ; N uni276B ; G 3835\nU 10092 ; WX 838 ; N uni276C ; G 3836\nU 10093 ; WX 838 ; N uni276D ; G 3837\nU 10094 ; WX 838 ; N uni276E ; G 3838\nU 10095 ; WX 838 ; N uni276F ; G 3839\nU 10096 ; WX 838 ; N uni2770 ; G 3840\nU 10097 ; WX 838 ; N uni2771 ; G 3841\nU 10098 ; WX 838 ; N uni2772 ; G 3842\nU 10099 ; WX 838 ; N uni2773 ; G 3843\nU 10100 ; WX 838 ; N uni2774 ; G 3844\nU 10101 ; WX 838 ; N uni2775 ; G 3845\nU 10102 ; WX 896 ; N uni2776 ; G 3846\nU 10103 ; WX 896 ; N uni2777 ; G 3847\nU 10104 ; WX 896 ; N uni2778 ; G 3848\nU 10105 ; WX 896 ; N uni2779 ; G 3849\nU 10106 ; WX 896 ; N uni277A ; G 3850\nU 10107 ; WX 896 ; N uni277B ; G 3851\nU 10108 ; WX 896 ; N uni277C ; G 3852\nU 10109 ; WX 896 ; N uni277D ; G 3853\nU 10110 ; WX 896 ; N uni277E ; G 3854\nU 10111 ; WX 896 ; N uni277F ; G 3855\nU 10112 ; WX 838 ; N uni2780 ; G 3856\nU 10113 ; WX 838 ; N uni2781 ; G 3857\nU 10114 ; WX 838 ; N uni2782 ; G 3858\nU 10115 ; WX 838 ; N uni2783 ; G 3859\nU 10116 ; WX 838 ; N uni2784 ; G 3860\nU 10117 ; WX 838 ; N uni2785 ; G 3861\nU 10118 ; WX 838 ; N uni2786 ; G 3862\nU 10119 ; WX 838 ; N uni2787 ; G 3863\nU 10120 ; WX 838 ; N uni2788 ; G 3864\nU 10121 ; WX 838 ; N uni2789 ; G 3865\nU 10122 ; WX 838 ; N uni278A ; G 3866\nU 10123 ; WX 838 ; N uni278B ; G 3867\nU 10124 ; WX 838 ; N uni278C ; G 3868\nU 10125 ; WX 838 ; N uni278D ; G 3869\nU 10126 ; WX 838 ; N uni278E ; G 3870\nU 10127 ; WX 838 ; N uni278F ; G 3871\nU 10128 ; WX 838 ; N uni2790 ; G 3872\nU 10129 ; WX 838 ; N uni2791 ; G 3873\nU 10130 ; WX 838 ; N uni2792 ; G 3874\nU 10131 ; WX 838 ; N uni2793 ; G 3875\nU 10132 ; WX 838 ; N uni2794 ; G 3876\nU 10136 ; WX 838 ; N uni2798 ; G 3877\nU 10137 ; WX 838 ; N uni2799 ; G 3878\nU 10138 ; WX 838 ; N uni279A ; G 3879\nU 10139 ; WX 838 ; N uni279B ; G 3880\nU 10140 ; WX 838 ; N uni279C ; G 3881\nU 10141 ; WX 838 ; N uni279D ; G 3882\nU 10142 ; WX 838 ; N uni279E ; G 3883\nU 10143 ; WX 838 ; N uni279F ; G 3884\nU 10144 ; WX 838 ; N uni27A0 ; G 3885\nU 10145 ; WX 838 ; N uni27A1 ; G 3886\nU 10146 ; WX 838 ; N uni27A2 ; G 3887\nU 10147 ; WX 838 ; N uni27A3 ; G 3888\nU 10148 ; WX 838 ; N uni27A4 ; G 3889\nU 10149 ; WX 838 ; N uni27A5 ; G 3890\nU 10150 ; WX 838 ; N uni27A6 ; G 3891\nU 10151 ; WX 838 ; N uni27A7 ; G 3892\nU 10152 ; WX 838 ; N uni27A8 ; G 3893\nU 10153 ; WX 838 ; N uni27A9 ; G 3894\nU 10154 ; WX 838 ; N uni27AA ; G 3895\nU 10155 ; WX 838 ; N uni27AB ; G 3896\nU 10156 ; WX 838 ; N uni27AC ; G 3897\nU 10157 ; WX 838 ; N uni27AD ; G 3898\nU 10158 ; WX 838 ; N uni27AE ; G 3899\nU 10159 ; WX 838 ; N uni27AF ; G 3900\nU 10161 ; WX 838 ; N uni27B1 ; G 3901\nU 10162 ; WX 838 ; N uni27B2 ; G 3902\nU 10163 ; WX 838 ; N uni27B3 ; G 3903\nU 10164 ; WX 838 ; N uni27B4 ; G 3904\nU 10165 ; WX 838 ; N uni27B5 ; G 3905\nU 10166 ; WX 838 ; N uni27B6 ; G 3906\nU 10167 ; WX 838 ; N uni27B7 ; G 3907\nU 10168 ; WX 838 ; N uni27B8 ; G 3908\nU 10169 ; WX 838 ; N uni27B9 ; G 3909\nU 10170 ; WX 838 ; N uni27BA ; G 3910\nU 10171 ; WX 838 ; N uni27BB ; G 3911\nU 10172 ; WX 838 ; N uni27BC ; G 3912\nU 10173 ; WX 838 ; N uni27BD ; G 3913\nU 10174 ; WX 838 ; N uni27BE ; G 3914\nU 10181 ; WX 390 ; N uni27C5 ; G 3915\nU 10182 ; WX 390 ; N uni27C6 ; G 3916\nU 10208 ; WX 494 ; N uni27E0 ; G 3917\nU 10214 ; WX 495 ; N uni27E6 ; G 3918\nU 10215 ; WX 495 ; N uni27E7 ; G 3919\nU 10216 ; WX 390 ; N uni27E8 ; G 3920\nU 10217 ; WX 390 ; N uni27E9 ; G 3921\nU 10218 ; WX 556 ; N uni27EA ; G 3922\nU 10219 ; WX 556 ; N uni27EB ; G 3923\nU 10224 ; WX 838 ; N uni27F0 ; G 3924\nU 10225 ; WX 838 ; N uni27F1 ; G 3925\nU 10226 ; WX 838 ; N uni27F2 ; G 3926\nU 10227 ; WX 838 ; N uni27F3 ; G 3927\nU 10228 ; WX 1157 ; N uni27F4 ; G 3928\nU 10229 ; WX 1434 ; N uni27F5 ; G 3929\nU 10230 ; WX 1434 ; N uni27F6 ; G 3930\nU 10231 ; WX 1434 ; N uni27F7 ; G 3931\nU 10232 ; WX 1434 ; N uni27F8 ; G 3932\nU 10233 ; WX 1434 ; N uni27F9 ; G 3933\nU 10234 ; WX 1434 ; N uni27FA ; G 3934\nU 10235 ; WX 1434 ; N uni27FB ; G 3935\nU 10236 ; WX 1434 ; N uni27FC ; G 3936\nU 10237 ; WX 1434 ; N uni27FD ; G 3937\nU 10238 ; WX 1434 ; N uni27FE ; G 3938\nU 10239 ; WX 1434 ; N uni27FF ; G 3939\nU 10240 ; WX 732 ; N uni2800 ; G 3940\nU 10241 ; WX 732 ; N uni2801 ; G 3941\nU 10242 ; WX 732 ; N uni2802 ; G 3942\nU 10243 ; WX 732 ; N uni2803 ; G 3943\nU 10244 ; WX 732 ; N uni2804 ; G 3944\nU 10245 ; WX 732 ; N uni2805 ; G 3945\nU 10246 ; WX 732 ; N uni2806 ; G 3946\nU 10247 ; WX 732 ; N uni2807 ; G 3947\nU 10248 ; WX 732 ; N uni2808 ; G 3948\nU 10249 ; WX 732 ; N uni2809 ; G 3949\nU 10250 ; WX 732 ; N uni280A ; G 3950\nU 10251 ; WX 732 ; N uni280B ; G 3951\nU 10252 ; WX 732 ; N uni280C ; G 3952\nU 10253 ; WX 732 ; N uni280D ; G 3953\nU 10254 ; WX 732 ; N uni280E ; G 3954\nU 10255 ; WX 732 ; N uni280F ; G 3955\nU 10256 ; WX 732 ; N uni2810 ; G 3956\nU 10257 ; WX 732 ; N uni2811 ; G 3957\nU 10258 ; WX 732 ; N uni2812 ; G 3958\nU 10259 ; WX 732 ; N uni2813 ; G 3959\nU 10260 ; WX 732 ; N uni2814 ; G 3960\nU 10261 ; WX 732 ; N uni2815 ; G 3961\nU 10262 ; WX 732 ; N uni2816 ; G 3962\nU 10263 ; WX 732 ; N uni2817 ; G 3963\nU 10264 ; WX 732 ; N uni2818 ; G 3964\nU 10265 ; WX 732 ; N uni2819 ; G 3965\nU 10266 ; WX 732 ; N uni281A ; G 3966\nU 10267 ; WX 732 ; N uni281B ; G 3967\nU 10268 ; WX 732 ; N uni281C ; G 3968\nU 10269 ; WX 732 ; N uni281D ; G 3969\nU 10270 ; WX 732 ; N uni281E ; G 3970\nU 10271 ; WX 732 ; N uni281F ; G 3971\nU 10272 ; WX 732 ; N uni2820 ; G 3972\nU 10273 ; WX 732 ; N uni2821 ; G 3973\nU 10274 ; WX 732 ; N uni2822 ; G 3974\nU 10275 ; WX 732 ; N uni2823 ; G 3975\nU 10276 ; WX 732 ; N uni2824 ; G 3976\nU 10277 ; WX 732 ; N uni2825 ; G 3977\nU 10278 ; WX 732 ; N uni2826 ; G 3978\nU 10279 ; WX 732 ; N uni2827 ; G 3979\nU 10280 ; WX 732 ; N uni2828 ; G 3980\nU 10281 ; WX 732 ; N uni2829 ; G 3981\nU 10282 ; WX 732 ; N uni282A ; G 3982\nU 10283 ; WX 732 ; N uni282B ; G 3983\nU 10284 ; WX 732 ; N uni282C ; G 3984\nU 10285 ; WX 732 ; N uni282D ; G 3985\nU 10286 ; WX 732 ; N uni282E ; G 3986\nU 10287 ; WX 732 ; N uni282F ; G 3987\nU 10288 ; WX 732 ; N uni2830 ; G 3988\nU 10289 ; WX 732 ; N uni2831 ; G 3989\nU 10290 ; WX 732 ; N uni2832 ; G 3990\nU 10291 ; WX 732 ; N uni2833 ; G 3991\nU 10292 ; WX 732 ; N uni2834 ; G 3992\nU 10293 ; WX 732 ; N uni2835 ; G 3993\nU 10294 ; WX 732 ; N uni2836 ; G 3994\nU 10295 ; WX 732 ; N uni2837 ; G 3995\nU 10296 ; WX 732 ; N uni2838 ; G 3996\nU 10297 ; WX 732 ; N uni2839 ; G 3997\nU 10298 ; WX 732 ; N uni283A ; G 3998\nU 10299 ; WX 732 ; N uni283B ; G 3999\nU 10300 ; WX 732 ; N uni283C ; G 4000\nU 10301 ; WX 732 ; N uni283D ; G 4001\nU 10302 ; WX 732 ; N uni283E ; G 4002\nU 10303 ; WX 732 ; N uni283F ; G 4003\nU 10304 ; WX 732 ; N uni2840 ; G 4004\nU 10305 ; WX 732 ; N uni2841 ; G 4005\nU 10306 ; WX 732 ; N uni2842 ; G 4006\nU 10307 ; WX 732 ; N uni2843 ; G 4007\nU 10308 ; WX 732 ; N uni2844 ; G 4008\nU 10309 ; WX 732 ; N uni2845 ; G 4009\nU 10310 ; WX 732 ; N uni2846 ; G 4010\nU 10311 ; WX 732 ; N uni2847 ; G 4011\nU 10312 ; WX 732 ; N uni2848 ; G 4012\nU 10313 ; WX 732 ; N uni2849 ; G 4013\nU 10314 ; WX 732 ; N uni284A ; G 4014\nU 10315 ; WX 732 ; N uni284B ; G 4015\nU 10316 ; WX 732 ; N uni284C ; G 4016\nU 10317 ; WX 732 ; N uni284D ; G 4017\nU 10318 ; WX 732 ; N uni284E ; G 4018\nU 10319 ; WX 732 ; N uni284F ; G 4019\nU 10320 ; WX 732 ; N uni2850 ; G 4020\nU 10321 ; WX 732 ; N uni2851 ; G 4021\nU 10322 ; WX 732 ; N uni2852 ; G 4022\nU 10323 ; WX 732 ; N uni2853 ; G 4023\nU 10324 ; WX 732 ; N uni2854 ; G 4024\nU 10325 ; WX 732 ; N uni2855 ; G 4025\nU 10326 ; WX 732 ; N uni2856 ; G 4026\nU 10327 ; WX 732 ; N uni2857 ; G 4027\nU 10328 ; WX 732 ; N uni2858 ; G 4028\nU 10329 ; WX 732 ; N uni2859 ; G 4029\nU 10330 ; WX 732 ; N uni285A ; G 4030\nU 10331 ; WX 732 ; N uni285B ; G 4031\nU 10332 ; WX 732 ; N uni285C ; G 4032\nU 10333 ; WX 732 ; N uni285D ; G 4033\nU 10334 ; WX 732 ; N uni285E ; G 4034\nU 10335 ; WX 732 ; N uni285F ; G 4035\nU 10336 ; WX 732 ; N uni2860 ; G 4036\nU 10337 ; WX 732 ; N uni2861 ; G 4037\nU 10338 ; WX 732 ; N uni2862 ; G 4038\nU 10339 ; WX 732 ; N uni2863 ; G 4039\nU 10340 ; WX 732 ; N uni2864 ; G 4040\nU 10341 ; WX 732 ; N uni2865 ; G 4041\nU 10342 ; WX 732 ; N uni2866 ; G 4042\nU 10343 ; WX 732 ; N uni2867 ; G 4043\nU 10344 ; WX 732 ; N uni2868 ; G 4044\nU 10345 ; WX 732 ; N uni2869 ; G 4045\nU 10346 ; WX 732 ; N uni286A ; G 4046\nU 10347 ; WX 732 ; N uni286B ; G 4047\nU 10348 ; WX 732 ; N uni286C ; G 4048\nU 10349 ; WX 732 ; N uni286D ; G 4049\nU 10350 ; WX 732 ; N uni286E ; G 4050\nU 10351 ; WX 732 ; N uni286F ; G 4051\nU 10352 ; WX 732 ; N uni2870 ; G 4052\nU 10353 ; WX 732 ; N uni2871 ; G 4053\nU 10354 ; WX 732 ; N uni2872 ; G 4054\nU 10355 ; WX 732 ; N uni2873 ; G 4055\nU 10356 ; WX 732 ; N uni2874 ; G 4056\nU 10357 ; WX 732 ; N uni2875 ; G 4057\nU 10358 ; WX 732 ; N uni2876 ; G 4058\nU 10359 ; WX 732 ; N uni2877 ; G 4059\nU 10360 ; WX 732 ; N uni2878 ; G 4060\nU 10361 ; WX 732 ; N uni2879 ; G 4061\nU 10362 ; WX 732 ; N uni287A ; G 4062\nU 10363 ; WX 732 ; N uni287B ; G 4063\nU 10364 ; WX 732 ; N uni287C ; G 4064\nU 10365 ; WX 732 ; N uni287D ; G 4065\nU 10366 ; WX 732 ; N uni287E ; G 4066\nU 10367 ; WX 732 ; N uni287F ; G 4067\nU 10368 ; WX 732 ; N uni2880 ; G 4068\nU 10369 ; WX 732 ; N uni2881 ; G 4069\nU 10370 ; WX 732 ; N uni2882 ; G 4070\nU 10371 ; WX 732 ; N uni2883 ; G 4071\nU 10372 ; WX 732 ; N uni2884 ; G 4072\nU 10373 ; WX 732 ; N uni2885 ; G 4073\nU 10374 ; WX 732 ; N uni2886 ; G 4074\nU 10375 ; WX 732 ; N uni2887 ; G 4075\nU 10376 ; WX 732 ; N uni2888 ; G 4076\nU 10377 ; WX 732 ; N uni2889 ; G 4077\nU 10378 ; WX 732 ; N uni288A ; G 4078\nU 10379 ; WX 732 ; N uni288B ; G 4079\nU 10380 ; WX 732 ; N uni288C ; G 4080\nU 10381 ; WX 732 ; N uni288D ; G 4081\nU 10382 ; WX 732 ; N uni288E ; G 4082\nU 10383 ; WX 732 ; N uni288F ; G 4083\nU 10384 ; WX 732 ; N uni2890 ; G 4084\nU 10385 ; WX 732 ; N uni2891 ; G 4085\nU 10386 ; WX 732 ; N uni2892 ; G 4086\nU 10387 ; WX 732 ; N uni2893 ; G 4087\nU 10388 ; WX 732 ; N uni2894 ; G 4088\nU 10389 ; WX 732 ; N uni2895 ; G 4089\nU 10390 ; WX 732 ; N uni2896 ; G 4090\nU 10391 ; WX 732 ; N uni2897 ; G 4091\nU 10392 ; WX 732 ; N uni2898 ; G 4092\nU 10393 ; WX 732 ; N uni2899 ; G 4093\nU 10394 ; WX 732 ; N uni289A ; G 4094\nU 10395 ; WX 732 ; N uni289B ; G 4095\nU 10396 ; WX 732 ; N uni289C ; G 4096\nU 10397 ; WX 732 ; N uni289D ; G 4097\nU 10398 ; WX 732 ; N uni289E ; G 4098\nU 10399 ; WX 732 ; N uni289F ; G 4099\nU 10400 ; WX 732 ; N uni28A0 ; G 4100\nU 10401 ; WX 732 ; N uni28A1 ; G 4101\nU 10402 ; WX 732 ; N uni28A2 ; G 4102\nU 10403 ; WX 732 ; N uni28A3 ; G 4103\nU 10404 ; WX 732 ; N uni28A4 ; G 4104\nU 10405 ; WX 732 ; N uni28A5 ; G 4105\nU 10406 ; WX 732 ; N uni28A6 ; G 4106\nU 10407 ; WX 732 ; N uni28A7 ; G 4107\nU 10408 ; WX 732 ; N uni28A8 ; G 4108\nU 10409 ; WX 732 ; N uni28A9 ; G 4109\nU 10410 ; WX 732 ; N uni28AA ; G 4110\nU 10411 ; WX 732 ; N uni28AB ; G 4111\nU 10412 ; WX 732 ; N uni28AC ; G 4112\nU 10413 ; WX 732 ; N uni28AD ; G 4113\nU 10414 ; WX 732 ; N uni28AE ; G 4114\nU 10415 ; WX 732 ; N uni28AF ; G 4115\nU 10416 ; WX 732 ; N uni28B0 ; G 4116\nU 10417 ; WX 732 ; N uni28B1 ; G 4117\nU 10418 ; WX 732 ; N uni28B2 ; G 4118\nU 10419 ; WX 732 ; N uni28B3 ; G 4119\nU 10420 ; WX 732 ; N uni28B4 ; G 4120\nU 10421 ; WX 732 ; N uni28B5 ; G 4121\nU 10422 ; WX 732 ; N uni28B6 ; G 4122\nU 10423 ; WX 732 ; N uni28B7 ; G 4123\nU 10424 ; WX 732 ; N uni28B8 ; G 4124\nU 10425 ; WX 732 ; N uni28B9 ; G 4125\nU 10426 ; WX 732 ; N uni28BA ; G 4126\nU 10427 ; WX 732 ; N uni28BB ; G 4127\nU 10428 ; WX 732 ; N uni28BC ; G 4128\nU 10429 ; WX 732 ; N uni28BD ; G 4129\nU 10430 ; WX 732 ; N uni28BE ; G 4130\nU 10431 ; WX 732 ; N uni28BF ; G 4131\nU 10432 ; WX 732 ; N uni28C0 ; G 4132\nU 10433 ; WX 732 ; N uni28C1 ; G 4133\nU 10434 ; WX 732 ; N uni28C2 ; G 4134\nU 10435 ; WX 732 ; N uni28C3 ; G 4135\nU 10436 ; WX 732 ; N uni28C4 ; G 4136\nU 10437 ; WX 732 ; N uni28C5 ; G 4137\nU 10438 ; WX 732 ; N uni28C6 ; G 4138\nU 10439 ; WX 732 ; N uni28C7 ; G 4139\nU 10440 ; WX 732 ; N uni28C8 ; G 4140\nU 10441 ; WX 732 ; N uni28C9 ; G 4141\nU 10442 ; WX 732 ; N uni28CA ; G 4142\nU 10443 ; WX 732 ; N uni28CB ; G 4143\nU 10444 ; WX 732 ; N uni28CC ; G 4144\nU 10445 ; WX 732 ; N uni28CD ; G 4145\nU 10446 ; WX 732 ; N uni28CE ; G 4146\nU 10447 ; WX 732 ; N uni28CF ; G 4147\nU 10448 ; WX 732 ; N uni28D0 ; G 4148\nU 10449 ; WX 732 ; N uni28D1 ; G 4149\nU 10450 ; WX 732 ; N uni28D2 ; G 4150\nU 10451 ; WX 732 ; N uni28D3 ; G 4151\nU 10452 ; WX 732 ; N uni28D4 ; G 4152\nU 10453 ; WX 732 ; N uni28D5 ; G 4153\nU 10454 ; WX 732 ; N uni28D6 ; G 4154\nU 10455 ; WX 732 ; N uni28D7 ; G 4155\nU 10456 ; WX 732 ; N uni28D8 ; G 4156\nU 10457 ; WX 732 ; N uni28D9 ; G 4157\nU 10458 ; WX 732 ; N uni28DA ; G 4158\nU 10459 ; WX 732 ; N uni28DB ; G 4159\nU 10460 ; WX 732 ; N uni28DC ; G 4160\nU 10461 ; WX 732 ; N uni28DD ; G 4161\nU 10462 ; WX 732 ; N uni28DE ; G 4162\nU 10463 ; WX 732 ; N uni28DF ; G 4163\nU 10464 ; WX 732 ; N uni28E0 ; G 4164\nU 10465 ; WX 732 ; N uni28E1 ; G 4165\nU 10466 ; WX 732 ; N uni28E2 ; G 4166\nU 10467 ; WX 732 ; N uni28E3 ; G 4167\nU 10468 ; WX 732 ; N uni28E4 ; G 4168\nU 10469 ; WX 732 ; N uni28E5 ; G 4169\nU 10470 ; WX 732 ; N uni28E6 ; G 4170\nU 10471 ; WX 732 ; N uni28E7 ; G 4171\nU 10472 ; WX 732 ; N uni28E8 ; G 4172\nU 10473 ; WX 732 ; N uni28E9 ; G 4173\nU 10474 ; WX 732 ; N uni28EA ; G 4174\nU 10475 ; WX 732 ; N uni28EB ; G 4175\nU 10476 ; WX 732 ; N uni28EC ; G 4176\nU 10477 ; WX 732 ; N uni28ED ; G 4177\nU 10478 ; WX 732 ; N uni28EE ; G 4178\nU 10479 ; WX 732 ; N uni28EF ; G 4179\nU 10480 ; WX 732 ; N uni28F0 ; G 4180\nU 10481 ; WX 732 ; N uni28F1 ; G 4181\nU 10482 ; WX 732 ; N uni28F2 ; G 4182\nU 10483 ; WX 732 ; N uni28F3 ; G 4183\nU 10484 ; WX 732 ; N uni28F4 ; G 4184\nU 10485 ; WX 732 ; N uni28F5 ; G 4185\nU 10486 ; WX 732 ; N uni28F6 ; G 4186\nU 10487 ; WX 732 ; N uni28F7 ; G 4187\nU 10488 ; WX 732 ; N uni28F8 ; G 4188\nU 10489 ; WX 732 ; N uni28F9 ; G 4189\nU 10490 ; WX 732 ; N uni28FA ; G 4190\nU 10491 ; WX 732 ; N uni28FB ; G 4191\nU 10492 ; WX 732 ; N uni28FC ; G 4192\nU 10493 ; WX 732 ; N uni28FD ; G 4193\nU 10494 ; WX 732 ; N uni28FE ; G 4194\nU 10495 ; WX 732 ; N uni28FF ; G 4195\nU 10502 ; WX 838 ; N uni2906 ; G 4196\nU 10503 ; WX 838 ; N uni2907 ; G 4197\nU 10506 ; WX 838 ; N uni290A ; G 4198\nU 10507 ; WX 838 ; N uni290B ; G 4199\nU 10560 ; WX 683 ; N uni2940 ; G 4200\nU 10561 ; WX 683 ; N uni2941 ; G 4201\nU 10627 ; WX 734 ; N uni2983 ; G 4202\nU 10628 ; WX 734 ; N uni2984 ; G 4203\nU 10702 ; WX 838 ; N uni29CE ; G 4204\nU 10703 ; WX 1000 ; N uni29CF ; G 4205\nU 10704 ; WX 1000 ; N uni29D0 ; G 4206\nU 10705 ; WX 1000 ; N uni29D1 ; G 4207\nU 10706 ; WX 1000 ; N uni29D2 ; G 4208\nU 10707 ; WX 1000 ; N uni29D3 ; G 4209\nU 10708 ; WX 1000 ; N uni29D4 ; G 4210\nU 10709 ; WX 1000 ; N uni29D5 ; G 4211\nU 10731 ; WX 494 ; N uni29EB ; G 4212\nU 10746 ; WX 838 ; N uni29FA ; G 4213\nU 10747 ; WX 838 ; N uni29FB ; G 4214\nU 10752 ; WX 1000 ; N uni2A00 ; G 4215\nU 10753 ; WX 1000 ; N uni2A01 ; G 4216\nU 10754 ; WX 1000 ; N uni2A02 ; G 4217\nU 10764 ; WX 1325 ; N uni2A0C ; G 4218\nU 10765 ; WX 521 ; N uni2A0D ; G 4219\nU 10766 ; WX 521 ; N uni2A0E ; G 4220\nU 10767 ; WX 521 ; N uni2A0F ; G 4221\nU 10768 ; WX 521 ; N uni2A10 ; G 4222\nU 10769 ; WX 521 ; N uni2A11 ; G 4223\nU 10770 ; WX 521 ; N uni2A12 ; G 4224\nU 10771 ; WX 521 ; N uni2A13 ; G 4225\nU 10772 ; WX 521 ; N uni2A14 ; G 4226\nU 10773 ; WX 521 ; N uni2A15 ; G 4227\nU 10774 ; WX 521 ; N uni2A16 ; G 4228\nU 10775 ; WX 521 ; N uni2A17 ; G 4229\nU 10776 ; WX 521 ; N uni2A18 ; G 4230\nU 10777 ; WX 521 ; N uni2A19 ; G 4231\nU 10778 ; WX 521 ; N uni2A1A ; G 4232\nU 10779 ; WX 521 ; N uni2A1B ; G 4233\nU 10780 ; WX 521 ; N uni2A1C ; G 4234\nU 10799 ; WX 838 ; N uni2A2F ; G 4235\nU 10858 ; WX 838 ; N uni2A6A ; G 4236\nU 10859 ; WX 838 ; N uni2A6B ; G 4237\nU 10877 ; WX 838 ; N uni2A7D ; G 4238\nU 10878 ; WX 838 ; N uni2A7E ; G 4239\nU 10879 ; WX 838 ; N uni2A7F ; G 4240\nU 10880 ; WX 838 ; N uni2A80 ; G 4241\nU 10881 ; WX 838 ; N uni2A81 ; G 4242\nU 10882 ; WX 838 ; N uni2A82 ; G 4243\nU 10883 ; WX 838 ; N uni2A83 ; G 4244\nU 10884 ; WX 838 ; N uni2A84 ; G 4245\nU 10885 ; WX 838 ; N uni2A85 ; G 4246\nU 10886 ; WX 838 ; N uni2A86 ; G 4247\nU 10887 ; WX 838 ; N uni2A87 ; G 4248\nU 10888 ; WX 838 ; N uni2A88 ; G 4249\nU 10889 ; WX 838 ; N uni2A89 ; G 4250\nU 10890 ; WX 838 ; N uni2A8A ; G 4251\nU 10891 ; WX 838 ; N uni2A8B ; G 4252\nU 10892 ; WX 838 ; N uni2A8C ; G 4253\nU 10893 ; WX 838 ; N uni2A8D ; G 4254\nU 10894 ; WX 838 ; N uni2A8E ; G 4255\nU 10895 ; WX 838 ; N uni2A8F ; G 4256\nU 10896 ; WX 838 ; N uni2A90 ; G 4257\nU 10897 ; WX 838 ; N uni2A91 ; G 4258\nU 10898 ; WX 838 ; N uni2A92 ; G 4259\nU 10899 ; WX 838 ; N uni2A93 ; G 4260\nU 10900 ; WX 838 ; N uni2A94 ; G 4261\nU 10901 ; WX 838 ; N uni2A95 ; G 4262\nU 10902 ; WX 838 ; N uni2A96 ; G 4263\nU 10903 ; WX 838 ; N uni2A97 ; G 4264\nU 10904 ; WX 838 ; N uni2A98 ; G 4265\nU 10905 ; WX 838 ; N uni2A99 ; G 4266\nU 10906 ; WX 838 ; N uni2A9A ; G 4267\nU 10907 ; WX 838 ; N uni2A9B ; G 4268\nU 10908 ; WX 838 ; N uni2A9C ; G 4269\nU 10909 ; WX 838 ; N uni2A9D ; G 4270\nU 10910 ; WX 838 ; N uni2A9E ; G 4271\nU 10911 ; WX 838 ; N uni2A9F ; G 4272\nU 10912 ; WX 838 ; N uni2AA0 ; G 4273\nU 10926 ; WX 838 ; N uni2AAE ; G 4274\nU 10927 ; WX 838 ; N uni2AAF ; G 4275\nU 10928 ; WX 838 ; N uni2AB0 ; G 4276\nU 10929 ; WX 838 ; N uni2AB1 ; G 4277\nU 10930 ; WX 838 ; N uni2AB2 ; G 4278\nU 10931 ; WX 838 ; N uni2AB3 ; G 4279\nU 10932 ; WX 838 ; N uni2AB4 ; G 4280\nU 10933 ; WX 838 ; N uni2AB5 ; G 4281\nU 10934 ; WX 838 ; N uni2AB6 ; G 4282\nU 10935 ; WX 838 ; N uni2AB7 ; G 4283\nU 10936 ; WX 838 ; N uni2AB8 ; G 4284\nU 10937 ; WX 838 ; N uni2AB9 ; G 4285\nU 10938 ; WX 838 ; N uni2ABA ; G 4286\nU 11001 ; WX 838 ; N uni2AF9 ; G 4287\nU 11002 ; WX 838 ; N uni2AFA ; G 4288\nU 11008 ; WX 838 ; N uni2B00 ; G 4289\nU 11009 ; WX 838 ; N uni2B01 ; G 4290\nU 11010 ; WX 838 ; N uni2B02 ; G 4291\nU 11011 ; WX 838 ; N uni2B03 ; G 4292\nU 11012 ; WX 838 ; N uni2B04 ; G 4293\nU 11013 ; WX 838 ; N uni2B05 ; G 4294\nU 11014 ; WX 838 ; N uni2B06 ; G 4295\nU 11015 ; WX 838 ; N uni2B07 ; G 4296\nU 11016 ; WX 838 ; N uni2B08 ; G 4297\nU 11017 ; WX 838 ; N uni2B09 ; G 4298\nU 11018 ; WX 838 ; N uni2B0A ; G 4299\nU 11019 ; WX 838 ; N uni2B0B ; G 4300\nU 11020 ; WX 838 ; N uni2B0C ; G 4301\nU 11021 ; WX 838 ; N uni2B0D ; G 4302\nU 11022 ; WX 836 ; N uni2B0E ; G 4303\nU 11023 ; WX 836 ; N uni2B0F ; G 4304\nU 11024 ; WX 836 ; N uni2B10 ; G 4305\nU 11025 ; WX 836 ; N uni2B11 ; G 4306\nU 11026 ; WX 945 ; N uni2B12 ; G 4307\nU 11027 ; WX 945 ; N uni2B13 ; G 4308\nU 11028 ; WX 945 ; N uni2B14 ; G 4309\nU 11029 ; WX 945 ; N uni2B15 ; G 4310\nU 11030 ; WX 769 ; N uni2B16 ; G 4311\nU 11031 ; WX 769 ; N uni2B17 ; G 4312\nU 11032 ; WX 769 ; N uni2B18 ; G 4313\nU 11033 ; WX 769 ; N uni2B19 ; G 4314\nU 11034 ; WX 945 ; N uni2B1A ; G 4315\nU 11039 ; WX 869 ; N uni2B1F ; G 4316\nU 11040 ; WX 869 ; N uni2B20 ; G 4317\nU 11041 ; WX 873 ; N uni2B21 ; G 4318\nU 11042 ; WX 873 ; N uni2B22 ; G 4319\nU 11043 ; WX 873 ; N uni2B23 ; G 4320\nU 11044 ; WX 1119 ; N uni2B24 ; G 4321\nU 11091 ; WX 869 ; N uni2B53 ; G 4322\nU 11092 ; WX 869 ; N uni2B54 ; G 4323\nU 11360 ; WX 557 ; N uni2C60 ; G 4324\nU 11361 ; WX 278 ; N uni2C61 ; G 4325\nU 11362 ; WX 557 ; N uni2C62 ; G 4326\nU 11363 ; WX 603 ; N uni2C63 ; G 4327\nU 11364 ; WX 695 ; N uni2C64 ; G 4328\nU 11365 ; WX 613 ; N uni2C65 ; G 4329\nU 11366 ; WX 392 ; N uni2C66 ; G 4330\nU 11367 ; WX 752 ; N uni2C67 ; G 4331\nU 11368 ; WX 634 ; N uni2C68 ; G 4332\nU 11369 ; WX 656 ; N uni2C69 ; G 4333\nU 11370 ; WX 579 ; N uni2C6A ; G 4334\nU 11371 ; WX 685 ; N uni2C6B ; G 4335\nU 11372 ; WX 525 ; N uni2C6C ; G 4336\nU 11373 ; WX 781 ; N uni2C6D ; G 4337\nU 11374 ; WX 863 ; N uni2C6E ; G 4338\nU 11375 ; WX 684 ; N uni2C6F ; G 4339\nU 11376 ; WX 781 ; N uni2C70 ; G 4340\nU 11377 ; WX 734 ; N uni2C71 ; G 4341\nU 11378 ; WX 1128 ; N uni2C72 ; G 4342\nU 11379 ; WX 961 ; N uni2C73 ; G 4343\nU 11380 ; WX 592 ; N uni2C74 ; G 4344\nU 11381 ; WX 654 ; N uni2C75 ; G 4345\nU 11382 ; WX 568 ; N uni2C76 ; G 4346\nU 11383 ; WX 660 ; N uni2C77 ; G 4347\nU 11385 ; WX 414 ; N uni2C79 ; G 4348\nU 11386 ; WX 612 ; N uni2C7A ; G 4349\nU 11387 ; WX 491 ; N uni2C7B ; G 4350\nU 11388 ; WX 175 ; N uni2C7C ; G 4351\nU 11389 ; WX 431 ; N uni2C7D ; G 4352\nU 11390 ; WX 635 ; N uni2C7E ; G 4353\nU 11391 ; WX 685 ; N uni2C7F ; G 4354\nU 11520 ; WX 591 ; N uni2D00 ; G 4355\nU 11521 ; WX 595 ; N uni2D01 ; G 4356\nU 11522 ; WX 564 ; N uni2D02 ; G 4357\nU 11523 ; WX 602 ; N uni2D03 ; G 4358\nU 11524 ; WX 587 ; N uni2D04 ; G 4359\nU 11525 ; WX 911 ; N uni2D05 ; G 4360\nU 11526 ; WX 626 ; N uni2D06 ; G 4361\nU 11527 ; WX 952 ; N uni2D07 ; G 4362\nU 11528 ; WX 595 ; N uni2D08 ; G 4363\nU 11529 ; WX 607 ; N uni2D09 ; G 4364\nU 11530 ; WX 954 ; N uni2D0A ; G 4365\nU 11531 ; WX 620 ; N uni2D0B ; G 4366\nU 11532 ; WX 595 ; N uni2D0C ; G 4367\nU 11533 ; WX 926 ; N uni2D0D ; G 4368\nU 11534 ; WX 595 ; N uni2D0E ; G 4369\nU 11535 ; WX 806 ; N uni2D0F ; G 4370\nU 11536 ; WX 931 ; N uni2D10 ; G 4371\nU 11537 ; WX 584 ; N uni2D11 ; G 4372\nU 11538 ; WX 592 ; N uni2D12 ; G 4373\nU 11539 ; WX 923 ; N uni2D13 ; G 4374\nU 11540 ; WX 953 ; N uni2D14 ; G 4375\nU 11541 ; WX 828 ; N uni2D15 ; G 4376\nU 11542 ; WX 596 ; N uni2D16 ; G 4377\nU 11543 ; WX 595 ; N uni2D17 ; G 4378\nU 11544 ; WX 590 ; N uni2D18 ; G 4379\nU 11545 ; WX 592 ; N uni2D19 ; G 4380\nU 11546 ; WX 592 ; N uni2D1A ; G 4381\nU 11547 ; WX 621 ; N uni2D1B ; G 4382\nU 11548 ; WX 920 ; N uni2D1C ; G 4383\nU 11549 ; WX 589 ; N uni2D1D ; G 4384\nU 11550 ; WX 586 ; N uni2D1E ; G 4385\nU 11551 ; WX 581 ; N uni2D1F ; G 4386\nU 11552 ; WX 914 ; N uni2D20 ; G 4387\nU 11553 ; WX 596 ; N uni2D21 ; G 4388\nU 11554 ; WX 595 ; N uni2D22 ; G 4389\nU 11555 ; WX 592 ; N uni2D23 ; G 4390\nU 11556 ; WX 642 ; N uni2D24 ; G 4391\nU 11557 ; WX 901 ; N uni2D25 ; G 4392\nU 11800 ; WX 531 ; N uni2E18 ; G 4393\nU 11807 ; WX 838 ; N uni2E1F ; G 4394\nU 11810 ; WX 390 ; N uni2E22 ; G 4395\nU 11811 ; WX 390 ; N uni2E23 ; G 4396\nU 11812 ; WX 390 ; N uni2E24 ; G 4397\nU 11813 ; WX 390 ; N uni2E25 ; G 4398\nU 11822 ; WX 531 ; N uni2E2E ; G 4399\nU 19904 ; WX 896 ; N uni4DC0 ; G 4400\nU 19905 ; WX 896 ; N uni4DC1 ; G 4401\nU 19906 ; WX 896 ; N uni4DC2 ; G 4402\nU 19907 ; WX 896 ; N uni4DC3 ; G 4403\nU 19908 ; WX 896 ; N uni4DC4 ; G 4404\nU 19909 ; WX 896 ; N uni4DC5 ; G 4405\nU 19910 ; WX 896 ; N uni4DC6 ; G 4406\nU 19911 ; WX 896 ; N uni4DC7 ; G 4407\nU 19912 ; WX 896 ; N uni4DC8 ; G 4408\nU 19913 ; WX 896 ; N uni4DC9 ; G 4409\nU 19914 ; WX 896 ; N uni4DCA ; G 4410\nU 19915 ; WX 896 ; N uni4DCB ; G 4411\nU 19916 ; WX 896 ; N uni4DCC ; G 4412\nU 19917 ; WX 896 ; N uni4DCD ; G 4413\nU 19918 ; WX 896 ; N uni4DCE ; G 4414\nU 19919 ; WX 896 ; N uni4DCF ; G 4415\nU 19920 ; WX 896 ; N uni4DD0 ; G 4416\nU 19921 ; WX 896 ; N uni4DD1 ; G 4417\nU 19922 ; WX 896 ; N uni4DD2 ; G 4418\nU 19923 ; WX 896 ; N uni4DD3 ; G 4419\nU 19924 ; WX 896 ; N uni4DD4 ; G 4420\nU 19925 ; WX 896 ; N uni4DD5 ; G 4421\nU 19926 ; WX 896 ; N uni4DD6 ; G 4422\nU 19927 ; WX 896 ; N uni4DD7 ; G 4423\nU 19928 ; WX 896 ; N uni4DD8 ; G 4424\nU 19929 ; WX 896 ; N uni4DD9 ; G 4425\nU 19930 ; WX 896 ; N uni4DDA ; G 4426\nU 19931 ; WX 896 ; N uni4DDB ; G 4427\nU 19932 ; WX 896 ; N uni4DDC ; G 4428\nU 19933 ; WX 896 ; N uni4DDD ; G 4429\nU 19934 ; WX 896 ; N uni4DDE ; G 4430\nU 19935 ; WX 896 ; N uni4DDF ; G 4431\nU 19936 ; WX 896 ; N uni4DE0 ; G 4432\nU 19937 ; WX 896 ; N uni4DE1 ; G 4433\nU 19938 ; WX 896 ; N uni4DE2 ; G 4434\nU 19939 ; WX 896 ; N uni4DE3 ; G 4435\nU 19940 ; WX 896 ; N uni4DE4 ; G 4436\nU 19941 ; WX 896 ; N uni4DE5 ; G 4437\nU 19942 ; WX 896 ; N uni4DE6 ; G 4438\nU 19943 ; WX 896 ; N uni4DE7 ; G 4439\nU 19944 ; WX 896 ; N uni4DE8 ; G 4440\nU 19945 ; WX 896 ; N uni4DE9 ; G 4441\nU 19946 ; WX 896 ; N uni4DEA ; G 4442\nU 19947 ; WX 896 ; N uni4DEB ; G 4443\nU 19948 ; WX 896 ; N uni4DEC ; G 4444\nU 19949 ; WX 896 ; N uni4DED ; G 4445\nU 19950 ; WX 896 ; N uni4DEE ; G 4446\nU 19951 ; WX 896 ; N uni4DEF ; G 4447\nU 19952 ; WX 896 ; N uni4DF0 ; G 4448\nU 19953 ; WX 896 ; N uni4DF1 ; G 4449\nU 19954 ; WX 896 ; N uni4DF2 ; G 4450\nU 19955 ; WX 896 ; N uni4DF3 ; G 4451\nU 19956 ; WX 896 ; N uni4DF4 ; G 4452\nU 19957 ; WX 896 ; N uni4DF5 ; G 4453\nU 19958 ; WX 896 ; N uni4DF6 ; G 4454\nU 19959 ; WX 896 ; N uni4DF7 ; G 4455\nU 19960 ; WX 896 ; N uni4DF8 ; G 4456\nU 19961 ; WX 896 ; N uni4DF9 ; G 4457\nU 19962 ; WX 896 ; N uni4DFA ; G 4458\nU 19963 ; WX 896 ; N uni4DFB ; G 4459\nU 19964 ; WX 896 ; N uni4DFC ; G 4460\nU 19965 ; WX 896 ; N uni4DFD ; G 4461\nU 19966 ; WX 896 ; N uni4DFE ; G 4462\nU 19967 ; WX 896 ; N uni4DFF ; G 4463\nU 42192 ; WX 686 ; N uniA4D0 ; G 4464\nU 42193 ; WX 603 ; N uniA4D1 ; G 4465\nU 42194 ; WX 603 ; N uniA4D2 ; G 4466\nU 42195 ; WX 770 ; N uniA4D3 ; G 4467\nU 42196 ; WX 611 ; N uniA4D4 ; G 4468\nU 42197 ; WX 611 ; N uniA4D5 ; G 4469\nU 42198 ; WX 775 ; N uniA4D6 ; G 4470\nU 42199 ; WX 656 ; N uniA4D7 ; G 4471\nU 42200 ; WX 656 ; N uniA4D8 ; G 4472\nU 42201 ; WX 512 ; N uniA4D9 ; G 4473\nU 42202 ; WX 698 ; N uniA4DA ; G 4474\nU 42203 ; WX 703 ; N uniA4DB ; G 4475\nU 42204 ; WX 685 ; N uniA4DC ; G 4476\nU 42205 ; WX 575 ; N uniA4DD ; G 4477\nU 42206 ; WX 575 ; N uniA4DE ; G 4478\nU 42207 ; WX 863 ; N uniA4DF ; G 4479\nU 42208 ; WX 748 ; N uniA4E0 ; G 4480\nU 42209 ; WX 557 ; N uniA4E1 ; G 4481\nU 42210 ; WX 635 ; N uniA4E2 ; G 4482\nU 42211 ; WX 695 ; N uniA4E3 ; G 4483\nU 42212 ; WX 695 ; N uniA4E4 ; G 4484\nU 42213 ; WX 684 ; N uniA4E5 ; G 4485\nU 42214 ; WX 684 ; N uniA4E6 ; G 4486\nU 42215 ; WX 752 ; N uniA4E7 ; G 4487\nU 42216 ; WX 775 ; N uniA4E8 ; G 4488\nU 42217 ; WX 512 ; N uniA4E9 ; G 4489\nU 42218 ; WX 989 ; N uniA4EA ; G 4490\nU 42219 ; WX 685 ; N uniA4EB ; G 4491\nU 42220 ; WX 611 ; N uniA4EC ; G 4492\nU 42221 ; WX 686 ; N uniA4ED ; G 4493\nU 42222 ; WX 684 ; N uniA4EE ; G 4494\nU 42223 ; WX 684 ; N uniA4EF ; G 4495\nU 42224 ; WX 632 ; N uniA4F0 ; G 4496\nU 42225 ; WX 632 ; N uniA4F1 ; G 4497\nU 42226 ; WX 295 ; N uniA4F2 ; G 4498\nU 42227 ; WX 787 ; N uniA4F3 ; G 4499\nU 42228 ; WX 732 ; N uniA4F4 ; G 4500\nU 42229 ; WX 732 ; N uniA4F5 ; G 4501\nU 42230 ; WX 557 ; N uniA4F6 ; G 4502\nU 42231 ; WX 767 ; N uniA4F7 ; G 4503\nU 42232 ; WX 300 ; N uniA4F8 ; G 4504\nU 42233 ; WX 300 ; N uniA4F9 ; G 4505\nU 42234 ; WX 596 ; N uniA4FA ; G 4506\nU 42235 ; WX 596 ; N uniA4FB ; G 4507\nU 42236 ; WX 300 ; N uniA4FC ; G 4508\nU 42237 ; WX 300 ; N uniA4FD ; G 4509\nU 42238 ; WX 588 ; N uniA4FE ; G 4510\nU 42239 ; WX 588 ; N uniA4FF ; G 4511\nU 42564 ; WX 635 ; N uniA644 ; G 4512\nU 42565 ; WX 521 ; N uniA645 ; G 4513\nU 42566 ; WX 354 ; N uniA646 ; G 4514\nU 42567 ; WX 338 ; N uniA647 ; G 4515\nU 42572 ; WX 1180 ; N uniA64C ; G 4516\nU 42573 ; WX 1028 ; N uniA64D ; G 4517\nU 42576 ; WX 1029 ; N uniA650 ; G 4518\nU 42577 ; WX 906 ; N uniA651 ; G 4519\nU 42580 ; WX 1080 ; N uniA654 ; G 4520\nU 42581 ; WX 842 ; N uniA655 ; G 4521\nU 42582 ; WX 985 ; N uniA656 ; G 4522\nU 42583 ; WX 847 ; N uniA657 ; G 4523\nU 42594 ; WX 1024 ; N uniA662 ; G 4524\nU 42595 ; WX 925 ; N uniA663 ; G 4525\nU 42596 ; WX 1014 ; N uniA664 ; G 4526\nU 42597 ; WX 900 ; N uniA665 ; G 4527\nU 42598 ; WX 863 ; N uniA666 ; G 4528\nU 42599 ; WX 1008 ; N uniA667 ; G 4529\nU 42600 ; WX 787 ; N uniA668 ; G 4530\nU 42601 ; WX 612 ; N uniA669 ; G 4531\nU 42602 ; WX 855 ; N uniA66A ; G 4532\nU 42603 ; WX 712 ; N uniA66B ; G 4533\nU 42604 ; WX 1358 ; N uniA66C ; G 4534\nU 42605 ; WX 1019 ; N uniA66D ; G 4535\nU 42606 ; WX 879 ; N uniA66E ; G 4536\nU 42634 ; WX 805 ; N uniA68A ; G 4537\nU 42635 ; WX 722 ; N uniA68B ; G 4538\nU 42636 ; WX 611 ; N uniA68C ; G 4539\nU 42637 ; WX 583 ; N uniA68D ; G 4540\nU 42644 ; WX 686 ; N uniA694 ; G 4541\nU 42645 ; WX 634 ; N uniA695 ; G 4542\nU 42648 ; WX 1358 ; N uniA698 ; G 4543\nU 42649 ; WX 1019 ; N uniA699 ; G 4544\nU 42760 ; WX 493 ; N uniA708 ; G 4545\nU 42761 ; WX 493 ; N uniA709 ; G 4546\nU 42762 ; WX 493 ; N uniA70A ; G 4547\nU 42763 ; WX 493 ; N uniA70B ; G 4548\nU 42764 ; WX 493 ; N uniA70C ; G 4549\nU 42765 ; WX 493 ; N uniA70D ; G 4550\nU 42766 ; WX 493 ; N uniA70E ; G 4551\nU 42767 ; WX 493 ; N uniA70F ; G 4552\nU 42768 ; WX 493 ; N uniA710 ; G 4553\nU 42769 ; WX 493 ; N uniA711 ; G 4554\nU 42770 ; WX 493 ; N uniA712 ; G 4555\nU 42771 ; WX 493 ; N uniA713 ; G 4556\nU 42772 ; WX 493 ; N uniA714 ; G 4557\nU 42773 ; WX 493 ; N uniA715 ; G 4558\nU 42774 ; WX 493 ; N uniA716 ; G 4559\nU 42779 ; WX 369 ; N uniA71B ; G 4560\nU 42780 ; WX 369 ; N uniA71C ; G 4561\nU 42781 ; WX 252 ; N uniA71D ; G 4562\nU 42782 ; WX 252 ; N uniA71E ; G 4563\nU 42783 ; WX 252 ; N uniA71F ; G 4564\nU 42786 ; WX 385 ; N uniA722 ; G 4565\nU 42787 ; WX 356 ; N uniA723 ; G 4566\nU 42788 ; WX 472 ; N uniA724 ; G 4567\nU 42789 ; WX 472 ; N uniA725 ; G 4568\nU 42790 ; WX 752 ; N uniA726 ; G 4569\nU 42791 ; WX 634 ; N uniA727 ; G 4570\nU 42792 ; WX 878 ; N uniA728 ; G 4571\nU 42793 ; WX 709 ; N uniA729 ; G 4572\nU 42794 ; WX 614 ; N uniA72A ; G 4573\nU 42795 ; WX 541 ; N uniA72B ; G 4574\nU 42800 ; WX 491 ; N uniA730 ; G 4575\nU 42801 ; WX 521 ; N uniA731 ; G 4576\nU 42802 ; WX 1250 ; N uniA732 ; G 4577\nU 42803 ; WX 985 ; N uniA733 ; G 4578\nU 42804 ; WX 1219 ; N uniA734 ; G 4579\nU 42805 ; WX 1000 ; N uniA735 ; G 4580\nU 42806 ; WX 1155 ; N uniA736 ; G 4581\nU 42807 ; WX 996 ; N uniA737 ; G 4582\nU 42808 ; WX 971 ; N uniA738 ; G 4583\nU 42809 ; WX 818 ; N uniA739 ; G 4584\nU 42810 ; WX 971 ; N uniA73A ; G 4585\nU 42811 ; WX 818 ; N uniA73B ; G 4586\nU 42812 ; WX 959 ; N uniA73C ; G 4587\nU 42813 ; WX 818 ; N uniA73D ; G 4588\nU 42814 ; WX 698 ; N uniA73E ; G 4589\nU 42815 ; WX 549 ; N uniA73F ; G 4590\nU 42816 ; WX 656 ; N uniA740 ; G 4591\nU 42817 ; WX 579 ; N uniA741 ; G 4592\nU 42822 ; WX 680 ; N uniA746 ; G 4593\nU 42823 ; WX 392 ; N uniA747 ; G 4594\nU 42824 ; WX 582 ; N uniA748 ; G 4595\nU 42825 ; WX 427 ; N uniA749 ; G 4596\nU 42826 ; WX 807 ; N uniA74A ; G 4597\nU 42827 ; WX 704 ; N uniA74B ; G 4598\nU 42830 ; WX 1358 ; N uniA74E ; G 4599\nU 42831 ; WX 1019 ; N uniA74F ; G 4600\nU 42832 ; WX 603 ; N uniA750 ; G 4601\nU 42833 ; WX 635 ; N uniA751 ; G 4602\nU 42834 ; WX 734 ; N uniA752 ; G 4603\nU 42835 ; WX 774 ; N uniA753 ; G 4604\nU 42838 ; WX 787 ; N uniA756 ; G 4605\nU 42839 ; WX 635 ; N uniA757 ; G 4606\nU 42852 ; WX 605 ; N uniA764 ; G 4607\nU 42853 ; WX 635 ; N uniA765 ; G 4608\nU 42854 ; WX 605 ; N uniA766 ; G 4609\nU 42855 ; WX 635 ; N uniA767 ; G 4610\nU 42880 ; WX 557 ; N uniA780 ; G 4611\nU 42881 ; WX 278 ; N uniA781 ; G 4612\nU 42882 ; WX 735 ; N uniA782 ; G 4613\nU 42883 ; WX 634 ; N uniA783 ; G 4614\nU 42889 ; WX 337 ; N uniA789 ; G 4615\nU 42890 ; WX 376 ; N uniA78A ; G 4616\nU 42891 ; WX 401 ; N uniA78B ; G 4617\nU 42892 ; WX 275 ; N uniA78C ; G 4618\nU 42893 ; WX 686 ; N uniA78D ; G 4619\nU 42894 ; WX 487 ; N uniA78E ; G 4620\nU 42896 ; WX 772 ; N uniA790 ; G 4621\nU 42897 ; WX 667 ; N uniA791 ; G 4622\nU 42912 ; WX 775 ; N uniA7A0 ; G 4623\nU 42913 ; WX 635 ; N uniA7A1 ; G 4624\nU 42914 ; WX 656 ; N uniA7A2 ; G 4625\nU 42915 ; WX 579 ; N uniA7A3 ; G 4626\nU 42916 ; WX 748 ; N uniA7A4 ; G 4627\nU 42917 ; WX 634 ; N uniA7A5 ; G 4628\nU 42918 ; WX 695 ; N uniA7A6 ; G 4629\nU 42919 ; WX 411 ; N uniA7A7 ; G 4630\nU 42920 ; WX 635 ; N uniA7A8 ; G 4631\nU 42921 ; WX 521 ; N uniA7A9 ; G 4632\nU 42922 ; WX 872 ; N uniA7AA ; G 4633\nU 43000 ; WX 577 ; N uniA7F8 ; G 4634\nU 43001 ; WX 644 ; N uniA7F9 ; G 4635\nU 43002 ; WX 915 ; N uniA7FA ; G 4636\nU 43003 ; WX 575 ; N uniA7FB ; G 4637\nU 43004 ; WX 603 ; N uniA7FC ; G 4638\nU 43005 ; WX 863 ; N uniA7FD ; G 4639\nU 43006 ; WX 295 ; N uniA7FE ; G 4640\nU 43007 ; WX 1199 ; N uniA7FF ; G 4641\nU 61184 ; WX 213 ; N uni02E5.5 ; G 4642\nU 61185 ; WX 238 ; N uni02E6.5 ; G 4643\nU 61186 ; WX 257 ; N uni02E7.5 ; G 4644\nU 61187 ; WX 264 ; N uni02E8.5 ; G 4645\nU 61188 ; WX 267 ; N uni02E9.5 ; G 4646\nU 61189 ; WX 238 ; N uni02E5.4 ; G 4647\nU 61190 ; WX 213 ; N uni02E6.4 ; G 4648\nU 61191 ; WX 238 ; N uni02E7.4 ; G 4649\nU 61192 ; WX 257 ; N uni02E8.4 ; G 4650\nU 61193 ; WX 264 ; N uni02E9.4 ; G 4651\nU 61194 ; WX 257 ; N uni02E5.3 ; G 4652\nU 61195 ; WX 238 ; N uni02E6.3 ; G 4653\nU 61196 ; WX 213 ; N uni02E7.3 ; G 4654\nU 61197 ; WX 238 ; N uni02E8.3 ; G 4655\nU 61198 ; WX 257 ; N uni02E9.3 ; G 4656\nU 61199 ; WX 264 ; N uni02E5.2 ; G 4657\nU 61200 ; WX 257 ; N uni02E6.2 ; G 4658\nU 61201 ; WX 238 ; N uni02E7.2 ; G 4659\nU 61202 ; WX 213 ; N uni02E8.2 ; G 4660\nU 61203 ; WX 238 ; N uni02E9.2 ; G 4661\nU 61204 ; WX 267 ; N uni02E5.1 ; G 4662\nU 61205 ; WX 264 ; N uni02E6.1 ; G 4663\nU 61206 ; WX 257 ; N uni02E7.1 ; G 4664\nU 61207 ; WX 238 ; N uni02E8.1 ; G 4665\nU 61208 ; WX 213 ; N uni02E9.1 ; G 4666\nU 61209 ; WX 275 ; N stem ; G 4667\nU 62464 ; WX 580 ; N uniF400 ; G 4668\nU 62465 ; WX 580 ; N uniF401 ; G 4669\nU 62466 ; WX 624 ; N uniF402 ; G 4670\nU 62467 ; WX 889 ; N uniF403 ; G 4671\nU 62468 ; WX 585 ; N uniF404 ; G 4672\nU 62469 ; WX 580 ; N uniF405 ; G 4673\nU 62470 ; WX 653 ; N uniF406 ; G 4674\nU 62471 ; WX 882 ; N uniF407 ; G 4675\nU 62472 ; WX 555 ; N uniF408 ; G 4676\nU 62473 ; WX 580 ; N uniF409 ; G 4677\nU 62474 ; WX 1168 ; N uniF40A ; G 4678\nU 62475 ; WX 589 ; N uniF40B ; G 4679\nU 62476 ; WX 590 ; N uniF40C ; G 4680\nU 62477 ; WX 869 ; N uniF40D ; G 4681\nU 62478 ; WX 580 ; N uniF40E ; G 4682\nU 62479 ; WX 589 ; N uniF40F ; G 4683\nU 62480 ; WX 914 ; N uniF410 ; G 4684\nU 62481 ; WX 590 ; N uniF411 ; G 4685\nU 62482 ; WX 731 ; N uniF412 ; G 4686\nU 62483 ; WX 583 ; N uniF413 ; G 4687\nU 62484 ; WX 872 ; N uniF414 ; G 4688\nU 62485 ; WX 589 ; N uniF415 ; G 4689\nU 62486 ; WX 895 ; N uniF416 ; G 4690\nU 62487 ; WX 589 ; N uniF417 ; G 4691\nU 62488 ; WX 589 ; N uniF418 ; G 4692\nU 62489 ; WX 590 ; N uniF419 ; G 4693\nU 62490 ; WX 649 ; N uniF41A ; G 4694\nU 62491 ; WX 589 ; N uniF41B ; G 4695\nU 62492 ; WX 589 ; N uniF41C ; G 4696\nU 62493 ; WX 599 ; N uniF41D ; G 4697\nU 62494 ; WX 590 ; N uniF41E ; G 4698\nU 62495 ; WX 516 ; N uniF41F ; G 4699\nU 62496 ; WX 580 ; N uniF420 ; G 4700\nU 62497 ; WX 584 ; N uniF421 ; G 4701\nU 62498 ; WX 580 ; N uniF422 ; G 4702\nU 62499 ; WX 580 ; N uniF423 ; G 4703\nU 62500 ; WX 581 ; N uniF424 ; G 4704\nU 62501 ; WX 638 ; N uniF425 ; G 4705\nU 62502 ; WX 955 ; N uniF426 ; G 4706\nU 62504 ; WX 931 ; N uniF428 ; G 4707\nU 62505 ; WX 808 ; N uniF429 ; G 4708\nU 62506 ; WX 508 ; N uniF42A ; G 4709\nU 62507 ; WX 508 ; N uniF42B ; G 4710\nU 62508 ; WX 508 ; N uniF42C ; G 4711\nU 62509 ; WX 508 ; N uniF42D ; G 4712\nU 62510 ; WX 508 ; N uniF42E ; G 4713\nU 62511 ; WX 508 ; N uniF42F ; G 4714\nU 62512 ; WX 508 ; N uniF430 ; G 4715\nU 62513 ; WX 508 ; N uniF431 ; G 4716\nU 62514 ; WX 508 ; N uniF432 ; G 4717\nU 62515 ; WX 508 ; N uniF433 ; G 4718\nU 62516 ; WX 518 ; N uniF434 ; G 4719\nU 62517 ; WX 518 ; N uniF435 ; G 4720\nU 62518 ; WX 518 ; N uniF436 ; G 4721\nU 62519 ; WX 787 ; N uniF437 ; G 4722\nU 62520 ; WX 787 ; N uniF438 ; G 4723\nU 62521 ; WX 787 ; N uniF439 ; G 4724\nU 62522 ; WX 787 ; N uniF43A ; G 4725\nU 62523 ; WX 787 ; N uniF43B ; G 4726\nU 62524 ; WX 546 ; N uniF43C ; G 4727\nU 62525 ; WX 546 ; N uniF43D ; G 4728\nU 62526 ; WX 546 ; N uniF43E ; G 4729\nU 62527 ; WX 546 ; N uniF43F ; G 4730\nU 62528 ; WX 546 ; N uniF440 ; G 4731\nU 62529 ; WX 546 ; N uniF441 ; G 4732\nU 63173 ; WX 612 ; N uniF6C5 ; G 4733\nU 64256 ; WX 722 ; N uniFB00 ; G 4734\nU 64257 ; WX 646 ; N fi ; G 4735\nU 64258 ; WX 646 ; N fl ; G 4736\nU 64259 ; WX 1000 ; N uniFB03 ; G 4737\nU 64260 ; WX 1000 ; N uniFB04 ; G 4738\nU 64261 ; WX 686 ; N uniFB05 ; G 4739\nU 64262 ; WX 861 ; N uniFB06 ; G 4740\nU 64275 ; WX 1202 ; N uniFB13 ; G 4741\nU 64276 ; WX 1202 ; N uniFB14 ; G 4742\nU 64277 ; WX 1196 ; N uniFB15 ; G 4743\nU 64278 ; WX 1186 ; N uniFB16 ; G 4744\nU 64279 ; WX 1529 ; N uniFB17 ; G 4745\nU 64285 ; WX 224 ; N uniFB1D ; G 4746\nU 64286 ; WX 0 ; N uniFB1E ; G 4747\nU 64287 ; WX 471 ; N uniFB1F ; G 4748\nU 64288 ; WX 636 ; N uniFB20 ; G 4749\nU 64289 ; WX 856 ; N uniFB21 ; G 4750\nU 64290 ; WX 774 ; N uniFB22 ; G 4751\nU 64291 ; WX 906 ; N uniFB23 ; G 4752\nU 64292 ; WX 771 ; N uniFB24 ; G 4753\nU 64293 ; WX 843 ; N uniFB25 ; G 4754\nU 64294 ; WX 855 ; N uniFB26 ; G 4755\nU 64295 ; WX 807 ; N uniFB27 ; G 4756\nU 64296 ; WX 875 ; N uniFB28 ; G 4757\nU 64297 ; WX 838 ; N uniFB29 ; G 4758\nU 64298 ; WX 708 ; N uniFB2A ; G 4759\nU 64299 ; WX 708 ; N uniFB2B ; G 4760\nU 64300 ; WX 708 ; N uniFB2C ; G 4761\nU 64301 ; WX 708 ; N uniFB2D ; G 4762\nU 64302 ; WX 668 ; N uniFB2E ; G 4763\nU 64303 ; WX 668 ; N uniFB2F ; G 4764\nU 64304 ; WX 668 ; N uniFB30 ; G 4765\nU 64305 ; WX 578 ; N uniFB31 ; G 4766\nU 64306 ; WX 412 ; N uniFB32 ; G 4767\nU 64307 ; WX 546 ; N uniFB33 ; G 4768\nU 64308 ; WX 653 ; N uniFB34 ; G 4769\nU 64309 ; WX 272 ; N uniFB35 ; G 4770\nU 64310 ; WX 346 ; N uniFB36 ; G 4771\nU 64311 ; WX 1000 ; N uniFB37 ; G 4772\nU 64312 ; WX 648 ; N uniFB38 ; G 4773\nU 64313 ; WX 307 ; N uniFB39 ; G 4774\nU 64314 ; WX 537 ; N uniFB3A ; G 4775\nU 64315 ; WX 529 ; N uniFB3B ; G 4776\nU 64316 ; WX 568 ; N uniFB3C ; G 4777\nU 64317 ; WX 1000 ; N uniFB3D ; G 4778\nU 64318 ; WX 679 ; N uniFB3E ; G 4779\nU 64319 ; WX 1000 ; N uniFB3F ; G 4780\nU 64320 ; WX 400 ; N uniFB40 ; G 4781\nU 64321 ; WX 649 ; N uniFB41 ; G 4782\nU 64322 ; WX 1000 ; N uniFB42 ; G 4783\nU 64323 ; WX 640 ; N uniFB43 ; G 4784\nU 64324 ; WX 625 ; N uniFB44 ; G 4785\nU 64325 ; WX 1000 ; N uniFB45 ; G 4786\nU 64326 ; WX 593 ; N uniFB46 ; G 4787\nU 64327 ; WX 709 ; N uniFB47 ; G 4788\nU 64328 ; WX 564 ; N uniFB48 ; G 4789\nU 64329 ; WX 708 ; N uniFB49 ; G 4790\nU 64330 ; WX 657 ; N uniFB4A ; G 4791\nU 64331 ; WX 272 ; N uniFB4B ; G 4792\nU 64332 ; WX 578 ; N uniFB4C ; G 4793\nU 64333 ; WX 529 ; N uniFB4D ; G 4794\nU 64334 ; WX 625 ; N uniFB4E ; G 4795\nU 64335 ; WX 629 ; N uniFB4F ; G 4796\nU 65024 ; WX 0 ; N uniFE00 ; G 4797\nU 65025 ; WX 0 ; N uniFE01 ; G 4798\nU 65026 ; WX 0 ; N uniFE02 ; G 4799\nU 65027 ; WX 0 ; N uniFE03 ; G 4800\nU 65028 ; WX 0 ; N uniFE04 ; G 4801\nU 65029 ; WX 0 ; N uniFE05 ; G 4802\nU 65030 ; WX 0 ; N uniFE06 ; G 4803\nU 65031 ; WX 0 ; N uniFE07 ; G 4804\nU 65032 ; WX 0 ; N uniFE08 ; G 4805\nU 65033 ; WX 0 ; N uniFE09 ; G 4806\nU 65034 ; WX 0 ; N uniFE0A ; G 4807\nU 65035 ; WX 0 ; N uniFE0B ; G 4808\nU 65036 ; WX 0 ; N uniFE0C ; G 4809\nU 65037 ; WX 0 ; N uniFE0D ; G 4810\nU 65038 ; WX 0 ; N uniFE0E ; G 4811\nU 65039 ; WX 0 ; N uniFE0F ; G 4812\nU 65056 ; WX 0 ; N uniFE20 ; G 4813\nU 65057 ; WX 0 ; N uniFE21 ; G 4814\nU 65058 ; WX 0 ; N uniFE22 ; G 4815\nU 65059 ; WX 0 ; N uniFE23 ; G 4816\nU 65529 ; WX 0 ; N uniFFF9 ; G 4817\nU 65530 ; WX 0 ; N uniFFFA ; G 4818\nU 65531 ; WX 0 ; N uniFFFB ; G 4819\nU 65532 ; WX 0 ; N uniFFFC ; G 4820\nU 65533 ; WX 1025 ; N uniFFFD ; G 4821\nEndCharMetrics\nStartKernData \nStartKernPairs 1029\n\nKPX dollar seven -149\nKPX dollar nine -102\nKPX dollar colon -36\nKPX dollar Hcircumflex -149\nKPX dollar Hbar -149\nKPX dollar Kcommaaccent -36\nKPX dollar uni01DC -149\n\nKPX percent less -36\nKPX percent kgreenlandic -36\nKPX percent lacute -36\nKPX percent uni01F4 -36\n\nKPX ampersand six 38\nKPX ampersand Gcircumflex 38\nKPX ampersand Gbreve 38\nKPX ampersand Gdotaccent 38\nKPX ampersand Gcommaaccent 38\nKPX ampersand uni01DA 38\n\nKPX parenright dollar -120\nKPX parenright X -83\nKPX parenright guillemotright -83\nKPX parenright onequarter -83\nKPX parenright onehalf -83\nKPX parenright threequarters -83\nKPX parenright Acircumflex -120\nKPX parenright Adieresis -120\nKPX parenright AE -120\nKPX parenright imacron -83\nKPX parenright ibreve -83\nKPX parenright iogonek -83\nKPX parenright dotlessi -83\nKPX parenright ij -83\nKPX parenright jcircumflex -83\n\nKPX period ampersand -55\nKPX period two -55\nKPX period eight -36\nKPX period D -73\nKPX period H -73\nKPX period R -73\nKPX period X -55\nKPX period backslash -55\nKPX period cent -73\nKPX period sterling -73\nKPX period currency -73\nKPX period yen -73\nKPX period brokenbar -73\nKPX period section -73\nKPX period dieresis -36\nKPX period ordfeminine -73\nKPX period guillemotleft -73\nKPX period logicalnot -73\nKPX period sfthyphen -73\nKPX period acute -73\nKPX period mu -73\nKPX period paragraph -73\nKPX period periodcentered -73\nKPX period cedilla -73\nKPX period ordmasculine -92\nKPX period guillemotright -55\nKPX period onequarter -55\nKPX period onehalf -55\nKPX period threequarters -55\nKPX period questiondown -55\nKPX period Aacute -55\nKPX period Egrave -55\nKPX period Icircumflex -55\nKPX period Yacute -73\nKPX period Ebreve -55\nKPX period ebreve -92\nKPX period Idot -36\nKPX period dotlessi -55\n\nKPX slash two -63\nKPX slash seven -139\nKPX slash nine -149\nKPX slash colon -83\nKPX slash less -196\nKPX slash backslash -73\nKPX slash questiondown -73\nKPX slash Aacute -73\nKPX slash Ebreve -63\nKPX slash Hbar -139\nKPX slash lacute -196\n\nKPX two semicolon -55\n\nKPX three dollar -102\n\n\nKPX six six -73\nKPX six Gdotaccent -73\nKPX six Gcommaaccent -73\n\nKPX seven dollar -188\nKPX seven D -215\nKPX seven F -253\nKPX seven H -253\nKPX seven R -253\nKPX seven U -159\nKPX seven V -243\nKPX seven X -206\nKPX seven Z -167\nKPX seven backslash -178\nKPX seven cent -215\nKPX seven sterling -215\nKPX seven currency -215\nKPX seven yen -215\nKPX seven brokenbar -215\nKPX seven section -215\nKPX seven dieresis -253\nKPX seven copyright -253\nKPX seven ordfeminine -253\nKPX seven guillemotleft -253\nKPX seven logicalnot -253\nKPX seven sfthyphen -253\nKPX seven acute -253\nKPX seven mu -253\nKPX seven paragraph -253\nKPX seven periodcentered -253\nKPX seven cedilla -253\nKPX seven ordmasculine -253\nKPX seven guillemotright -206\nKPX seven onequarter -206\nKPX seven onehalf -206\nKPX seven threequarters -206\nKPX seven questiondown -178\nKPX seven Aacute -178\nKPX seven Eacute -253\nKPX seven Idieresis -253\nKPX seven Yacute -253\nKPX seven ebreve -253\nKPX seven edotaccent -159\nKPX seven ecaron -159\nKPX seven gdotaccent -243\nKPX seven gcommaaccent -243\nKPX seven dotlessi -206\n\nKPX nine dollar -139\nKPX nine D -131\nKPX nine H -120\nKPX nine R -120\nKPX nine X -36\nKPX nine cent -131\nKPX nine sterling -131\nKPX nine currency -131\nKPX nine yen -131\nKPX nine brokenbar -131\nKPX nine section -131\nKPX nine dieresis -149\nKPX nine ordfeminine -120\nKPX nine guillemotleft -120\nKPX nine logicalnot -120\nKPX nine sfthyphen -120\nKPX nine acute -120\nKPX nine mu -120\nKPX nine paragraph -120\nKPX nine periodcentered -120\nKPX nine cedilla -120\nKPX nine ordmasculine -120\nKPX nine guillemotright -36\nKPX nine onequarter -36\nKPX nine onehalf -36\nKPX nine threequarters -36\nKPX nine Yacute -120\nKPX nine ebreve -120\nKPX nine dotlessi -36\n\nKPX colon dollar -102\nKPX colon D -112\nKPX colon U -36\nKPX colon cent -112\nKPX colon sterling -112\nKPX colon currency -112\nKPX colon yen -112\nKPX colon brokenbar -112\nKPX colon section -112\nKPX colon dieresis -112\nKPX colon edotaccent -36\nKPX colon ecaron -36\n\nKPX semicolon ampersand -36\nKPX semicolon two -73\nKPX semicolon Egrave -36\nKPX semicolon Icircumflex -36\nKPX semicolon Ebreve -55\n\nKPX less dollar -159\nKPX less ampersand -36\nKPX less two -36\nKPX less D -188\nKPX less H -225\nKPX less L -36\nKPX less R -225\nKPX less X -188\nKPX less cent -188\nKPX less sterling -188\nKPX less currency -188\nKPX less yen -188\nKPX less brokenbar -188\nKPX less section -188\nKPX less dieresis -188\nKPX less ordfeminine -225\nKPX less guillemotleft -225\nKPX less logicalnot -225\nKPX less sfthyphen -225\nKPX less acute -225\nKPX less mu -225\nKPX less paragraph -225\nKPX less periodcentered -225\nKPX less cedilla -225\nKPX less ordmasculine -225\nKPX less guillemotright -188\nKPX less onequarter -188\nKPX less onehalf -188\nKPX less threequarters -188\nKPX less Egrave -36\nKPX less Icircumflex -36\nKPX less Yacute -225\nKPX less Ebreve -36\nKPX less ebreve -225\nKPX less dotlessi -188\n\n\n\n\n\n\n\n\n\n\nKPX Acircumflex seven -149\nKPX Acircumflex nine -102\nKPX Acircumflex colon -36\nKPX Acircumflex Hcircumflex -149\nKPX Acircumflex Hbar -149\nKPX Acircumflex Kcommaaccent -36\nKPX Acircumflex uni01DC -149\n\nKPX Adieresis seven -149\nKPX Adieresis nine -102\nKPX Adieresis colon -36\nKPX Adieresis Hcircumflex -149\nKPX Adieresis Hbar -149\nKPX Adieresis Kcommaaccent -36\nKPX Adieresis uni01DC -149\n\nKPX AE seven -149\nKPX AE nine -102\nKPX AE colon -36\nKPX AE Hcircumflex -149\nKPX AE Hbar -149\nKPX AE Kcommaaccent -36\nKPX AE uni01DC -149\n\nKPX Egrave six 38\nKPX Egrave Gcircumflex 38\nKPX Egrave Gbreve 38\nKPX Egrave Gdotaccent 38\nKPX Egrave Gcommaaccent 38\nKPX Egrave uni01DA 38\n\nKPX Ecircumflex six 38\nKPX Ecircumflex Gcircumflex 38\nKPX Ecircumflex Gbreve 38\nKPX Ecircumflex Gdotaccent 38\nKPX Ecircumflex Gcommaaccent 38\nKPX Ecircumflex uni01DA 38\n\nKPX Igrave six 38\nKPX Igrave Gcircumflex 38\nKPX Igrave Gbreve 38\nKPX Igrave Gdotaccent 38\nKPX Igrave Gcommaaccent 38\nKPX Igrave uni01DA 38\n\nKPX Icircumflex six 38\nKPX Icircumflex Gcircumflex 38\nKPX Icircumflex Gbreve 38\nKPX Icircumflex Gdotaccent 38\nKPX Icircumflex Gcommaaccent 38\nKPX Icircumflex uni01DA 38\n\nKPX ucircumflex two -63\nKPX ucircumflex seven -139\nKPX ucircumflex nine -149\nKPX ucircumflex colon -83\nKPX ucircumflex less -196\nKPX ucircumflex backslash -73\nKPX ucircumflex questiondown -73\nKPX ucircumflex Aacute -73\nKPX ucircumflex Ebreve -63\nKPX ucircumflex Hbar -139\nKPX ucircumflex lacute -196\n\nKPX ydieresis two -63\nKPX ydieresis seven -139\nKPX ydieresis nine -149\nKPX ydieresis colon -83\nKPX ydieresis less -196\nKPX ydieresis backslash -73\nKPX ydieresis questiondown -73\nKPX ydieresis Aacute -73\nKPX ydieresis Ebreve -63\nKPX ydieresis Hbar -139\nKPX ydieresis lacute -196\n\nKPX abreve two -63\nKPX abreve seven -139\nKPX abreve nine -149\nKPX abreve colon -83\nKPX abreve less -196\nKPX abreve backslash -73\nKPX abreve questiondown -73\nKPX abreve Aacute -73\nKPX abreve Ebreve -63\nKPX abreve Hbar -139\nKPX abreve lacute -196\n\n\n\nKPX Gdotaccent six -73\nKPX Gdotaccent Gdotaccent -73\nKPX Gdotaccent Gcommaaccent -73\n\nKPX Gcommaaccent six -73\nKPX Gcommaaccent Gdotaccent -73\nKPX Gcommaaccent Gcommaaccent -73\n\nKPX Hbar dollar -188\nKPX Hbar D -215\nKPX Hbar F -253\nKPX Hbar H -253\nKPX Hbar R -253\nKPX Hbar U -159\nKPX Hbar V -243\nKPX Hbar X -206\nKPX Hbar Z -167\nKPX Hbar backslash -178\nKPX Hbar cent -215\nKPX Hbar sterling -215\nKPX Hbar currency -215\nKPX Hbar yen -215\nKPX Hbar brokenbar -215\nKPX Hbar section -215\nKPX Hbar dieresis -253\nKPX Hbar copyright -253\nKPX Hbar ordfeminine -253\nKPX Hbar guillemotleft -253\nKPX Hbar logicalnot -253\nKPX Hbar sfthyphen -253\nKPX Hbar acute -253\nKPX Hbar mu -253\nKPX Hbar paragraph -253\nKPX Hbar periodcentered -253\nKPX Hbar cedilla -253\nKPX Hbar ordmasculine -253\nKPX Hbar guillemotright -206\nKPX Hbar onequarter -206\nKPX Hbar onehalf -206\nKPX Hbar threequarters -206\nKPX Hbar questiondown -178\nKPX Hbar Aacute -178\nKPX Hbar Eacute -253\nKPX Hbar Idieresis -253\nKPX Hbar Yacute -253\nKPX Hbar ebreve -253\nKPX Hbar edotaccent -159\nKPX Hbar ecaron -159\nKPX Hbar gdotaccent -243\nKPX Hbar gcommaaccent -243\nKPX Hbar dotlessi -206\n\nKPX lacute dollar -159\nKPX lacute ampersand -36\nKPX lacute two -36\nKPX lacute D -188\nKPX lacute H -225\nKPX lacute L -36\nKPX lacute R -225\nKPX lacute X -188\nKPX lacute cent -188\nKPX lacute sterling -188\nKPX lacute currency -188\nKPX lacute yen -188\nKPX lacute brokenbar -188\nKPX lacute section -188\nKPX lacute dieresis -188\nKPX lacute ordfeminine -225\nKPX lacute guillemotleft -225\nKPX lacute logicalnot -225\nKPX lacute sfthyphen -225\nKPX lacute acute -225\nKPX lacute mu -225\nKPX lacute paragraph -225\nKPX lacute periodcentered -225\nKPX lacute cedilla -225\nKPX lacute ordmasculine -225\nKPX lacute guillemotright -188\nKPX lacute onequarter -188\nKPX lacute onehalf -188\nKPX lacute threequarters -188\nKPX lacute Egrave -36\nKPX lacute Icircumflex -36\nKPX lacute Yacute -225\nKPX lacute Ebreve -36\nKPX lacute ebreve -225\nKPX lacute dotlessi -188\n\n\nKPX uni027D dollar -243\nKPX uni027D nine 75\nKPX uni027D less 47\nKPX uni027D lacute 47\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSans.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Book\nUniqueID DejaVu Sans\nFullName DejaVu Sans\nVersion Version 2.37\nPostScriptName DejaVuSans\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Book\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1021 -463 1793 1232\nStartCharMetrics 6253\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 401 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 780 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 361 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 531 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 684 ; N A ; G 36\nU 66 ; WX 686 ; N B ; G 37\nU 67 ; WX 698 ; N C ; G 38\nU 68 ; WX 770 ; N D ; G 39\nU 69 ; WX 632 ; N E ; G 40\nU 70 ; WX 575 ; N F ; G 41\nU 71 ; WX 775 ; N G ; G 42\nU 72 ; WX 752 ; N H ; G 43\nU 73 ; WX 295 ; N I ; G 44\nU 74 ; WX 295 ; N J ; G 45\nU 75 ; WX 656 ; N K ; G 46\nU 76 ; WX 557 ; N L ; G 47\nU 77 ; WX 863 ; N M ; G 48\nU 78 ; WX 748 ; N N ; G 49\nU 79 ; WX 787 ; N O ; G 50\nU 80 ; WX 603 ; N P ; G 51\nU 81 ; WX 787 ; N Q ; G 52\nU 82 ; WX 695 ; N R ; G 53\nU 83 ; WX 635 ; N S ; G 54\nU 84 ; WX 611 ; N T ; G 55\nU 85 ; WX 732 ; N U ; G 56\nU 86 ; WX 684 ; N V ; G 57\nU 87 ; WX 989 ; N W ; G 58\nU 88 ; WX 685 ; N X ; G 59\nU 89 ; WX 611 ; N Y ; G 60\nU 90 ; WX 685 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 613 ; N a ; G 68\nU 98 ; WX 635 ; N b ; G 69\nU 99 ; WX 550 ; N c ; G 70\nU 100 ; WX 635 ; N d ; G 71\nU 101 ; WX 615 ; N e ; G 72\nU 102 ; WX 352 ; N f ; G 73\nU 103 ; WX 635 ; N g ; G 74\nU 104 ; WX 634 ; N h ; G 75\nU 105 ; WX 278 ; N i ; G 76\nU 106 ; WX 278 ; N j ; G 77\nU 107 ; WX 579 ; N k ; G 78\nU 108 ; WX 278 ; N l ; G 79\nU 109 ; WX 974 ; N m ; G 80\nU 110 ; WX 634 ; N n ; G 81\nU 111 ; WX 612 ; N o ; G 82\nU 112 ; WX 635 ; N p ; G 83\nU 113 ; WX 635 ; N q ; G 84\nU 114 ; WX 411 ; N r ; G 85\nU 115 ; WX 521 ; N s ; G 86\nU 116 ; WX 392 ; N t ; G 87\nU 117 ; WX 634 ; N u ; G 88\nU 118 ; WX 592 ; N v ; G 89\nU 119 ; WX 818 ; N w ; G 90\nU 120 ; WX 592 ; N x ; G 91\nU 121 ; WX 592 ; N y ; G 92\nU 122 ; WX 525 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 401 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 471 ; N ordfeminine ; G 108\nU 171 ; WX 612 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 361 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 636 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 471 ; N ordmasculine ; G 124\nU 187 ; WX 612 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 531 ; N questiondown ; G 129\nU 192 ; WX 684 ; N Agrave ; G 130\nU 193 ; WX 684 ; N Aacute ; G 131\nU 194 ; WX 684 ; N Acircumflex ; G 132\nU 195 ; WX 684 ; N Atilde ; G 133\nU 196 ; WX 684 ; N Adieresis ; G 134\nU 197 ; WX 684 ; N Aring ; G 135\nU 198 ; WX 974 ; N AE ; G 136\nU 199 ; WX 698 ; N Ccedilla ; G 137\nU 200 ; WX 632 ; N Egrave ; G 138\nU 201 ; WX 632 ; N Eacute ; G 139\nU 202 ; WX 632 ; N Ecircumflex ; G 140\nU 203 ; WX 632 ; N Edieresis ; G 141\nU 204 ; WX 295 ; N Igrave ; G 142\nU 205 ; WX 295 ; N Iacute ; G 143\nU 206 ; WX 295 ; N Icircumflex ; G 144\nU 207 ; WX 295 ; N Idieresis ; G 145\nU 208 ; WX 775 ; N Eth ; G 146\nU 209 ; WX 748 ; N Ntilde ; G 147\nU 210 ; WX 787 ; N Ograve ; G 148\nU 211 ; WX 787 ; N Oacute ; G 149\nU 212 ; WX 787 ; N Ocircumflex ; G 150\nU 213 ; WX 787 ; N Otilde ; G 151\nU 214 ; WX 787 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 787 ; N Oslash ; G 154\nU 217 ; WX 732 ; N Ugrave ; G 155\nU 218 ; WX 732 ; N Uacute ; G 156\nU 219 ; WX 732 ; N Ucircumflex ; G 157\nU 220 ; WX 732 ; N Udieresis ; G 158\nU 221 ; WX 611 ; N Yacute ; G 159\nU 222 ; WX 605 ; N Thorn ; G 160\nU 223 ; WX 630 ; N germandbls ; G 161\nU 224 ; WX 613 ; N agrave ; G 162\nU 225 ; WX 613 ; N aacute ; G 163\nU 226 ; WX 613 ; N acircumflex ; G 164\nU 227 ; WX 613 ; N atilde ; G 165\nU 228 ; WX 613 ; N adieresis ; G 166\nU 229 ; WX 613 ; N aring ; G 167\nU 230 ; WX 982 ; N ae ; G 168\nU 231 ; WX 550 ; N ccedilla ; G 169\nU 232 ; WX 615 ; N egrave ; G 170\nU 233 ; WX 615 ; N eacute ; G 171\nU 234 ; WX 615 ; N ecircumflex ; G 172\nU 235 ; WX 615 ; N edieresis ; G 173\nU 236 ; WX 278 ; N igrave ; G 174\nU 237 ; WX 278 ; N iacute ; G 175\nU 238 ; WX 278 ; N icircumflex ; G 176\nU 239 ; WX 278 ; N idieresis ; G 177\nU 240 ; WX 612 ; N eth ; G 178\nU 241 ; WX 634 ; N ntilde ; G 179\nU 242 ; WX 612 ; N ograve ; G 180\nU 243 ; WX 612 ; N oacute ; G 181\nU 244 ; WX 612 ; N ocircumflex ; G 182\nU 245 ; WX 612 ; N otilde ; G 183\nU 246 ; WX 612 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 612 ; N oslash ; G 186\nU 249 ; WX 634 ; N ugrave ; G 187\nU 250 ; WX 634 ; N uacute ; G 188\nU 251 ; WX 634 ; N ucircumflex ; G 189\nU 252 ; WX 634 ; N udieresis ; G 190\nU 253 ; WX 592 ; N yacute ; G 191\nU 254 ; WX 635 ; N thorn ; G 192\nU 255 ; WX 592 ; N ydieresis ; G 193\nU 256 ; WX 684 ; N Amacron ; G 194\nU 257 ; WX 613 ; N amacron ; G 195\nU 258 ; WX 684 ; N Abreve ; G 196\nU 259 ; WX 613 ; N abreve ; G 197\nU 260 ; WX 684 ; N Aogonek ; G 198\nU 261 ; WX 613 ; N aogonek ; G 199\nU 262 ; WX 698 ; N Cacute ; G 200\nU 263 ; WX 550 ; N cacute ; G 201\nU 264 ; WX 698 ; N Ccircumflex ; G 202\nU 265 ; WX 550 ; N ccircumflex ; G 203\nU 266 ; WX 698 ; N Cdotaccent ; G 204\nU 267 ; WX 550 ; N cdotaccent ; G 205\nU 268 ; WX 698 ; N Ccaron ; G 206\nU 269 ; WX 550 ; N ccaron ; G 207\nU 270 ; WX 770 ; N Dcaron ; G 208\nU 271 ; WX 635 ; N dcaron ; G 209\nU 272 ; WX 775 ; N Dcroat ; G 210\nU 273 ; WX 635 ; N dmacron ; G 211\nU 274 ; WX 632 ; N Emacron ; G 212\nU 275 ; WX 615 ; N emacron ; G 213\nU 276 ; WX 632 ; N Ebreve ; G 214\nU 277 ; WX 615 ; N ebreve ; G 215\nU 278 ; WX 632 ; N Edotaccent ; G 216\nU 279 ; WX 615 ; N edotaccent ; G 217\nU 280 ; WX 632 ; N Eogonek ; G 218\nU 281 ; WX 615 ; N eogonek ; G 219\nU 282 ; WX 632 ; N Ecaron ; G 220\nU 283 ; WX 615 ; N ecaron ; G 221\nU 284 ; WX 775 ; N Gcircumflex ; G 222\nU 285 ; WX 635 ; N gcircumflex ; G 223\nU 286 ; WX 775 ; N Gbreve ; G 224\nU 287 ; WX 635 ; N gbreve ; G 225\nU 288 ; WX 775 ; N Gdotaccent ; G 226\nU 289 ; WX 635 ; N gdotaccent ; G 227\nU 290 ; WX 775 ; N Gcommaaccent ; G 228\nU 291 ; WX 635 ; N gcommaaccent ; G 229\nU 292 ; WX 752 ; N Hcircumflex ; G 230\nU 293 ; WX 634 ; N hcircumflex ; G 231\nU 294 ; WX 916 ; N Hbar ; G 232\nU 295 ; WX 695 ; N hbar ; G 233\nU 296 ; WX 295 ; N Itilde ; G 234\nU 297 ; WX 278 ; N itilde ; G 235\nU 298 ; WX 295 ; N Imacron ; G 236\nU 299 ; WX 278 ; N imacron ; G 237\nU 300 ; WX 295 ; N Ibreve ; G 238\nU 301 ; WX 278 ; N ibreve ; G 239\nU 302 ; WX 295 ; N Iogonek ; G 240\nU 303 ; WX 278 ; N iogonek ; G 241\nU 304 ; WX 295 ; N Idot ; G 242\nU 305 ; WX 278 ; N dotlessi ; G 243\nU 306 ; WX 590 ; N IJ ; G 244\nU 307 ; WX 556 ; N ij ; G 245\nU 308 ; WX 295 ; N Jcircumflex ; G 246\nU 309 ; WX 278 ; N jcircumflex ; G 247\nU 310 ; WX 656 ; N Kcommaaccent ; G 248\nU 311 ; WX 579 ; N kcommaaccent ; G 249\nU 312 ; WX 579 ; N kgreenlandic ; G 250\nU 313 ; WX 557 ; N Lacute ; G 251\nU 314 ; WX 278 ; N lacute ; G 252\nU 315 ; WX 557 ; N Lcommaaccent ; G 253\nU 316 ; WX 278 ; N lcommaaccent ; G 254\nU 317 ; WX 557 ; N Lcaron ; G 255\nU 318 ; WX 375 ; N lcaron ; G 256\nU 319 ; WX 557 ; N Ldot ; G 257\nU 320 ; WX 342 ; N ldot ; G 258\nU 321 ; WX 562 ; N Lslash ; G 259\nU 322 ; WX 284 ; N lslash ; G 260\nU 323 ; WX 748 ; N Nacute ; G 261\nU 324 ; WX 634 ; N nacute ; G 262\nU 325 ; WX 748 ; N Ncommaaccent ; G 263\nU 326 ; WX 634 ; N ncommaaccent ; G 264\nU 327 ; WX 748 ; N Ncaron ; G 265\nU 328 ; WX 634 ; N ncaron ; G 266\nU 329 ; WX 813 ; N napostrophe ; G 267\nU 330 ; WX 748 ; N Eng ; G 268\nU 331 ; WX 634 ; N eng ; G 269\nU 332 ; WX 787 ; N Omacron ; G 270\nU 333 ; WX 612 ; N omacron ; G 271\nU 334 ; WX 787 ; N Obreve ; G 272\nU 335 ; WX 612 ; N obreve ; G 273\nU 336 ; WX 787 ; N Ohungarumlaut ; G 274\nU 337 ; WX 612 ; N ohungarumlaut ; G 275\nU 338 ; WX 1070 ; N OE ; G 276\nU 339 ; WX 1023 ; N oe ; G 277\nU 340 ; WX 695 ; N Racute ; G 278\nU 341 ; WX 411 ; N racute ; G 279\nU 342 ; WX 695 ; N Rcommaaccent ; G 280\nU 343 ; WX 411 ; N rcommaaccent ; G 281\nU 344 ; WX 695 ; N Rcaron ; G 282\nU 345 ; WX 411 ; N rcaron ; G 283\nU 346 ; WX 635 ; N Sacute ; G 284\nU 347 ; WX 521 ; N sacute ; G 285\nU 348 ; WX 635 ; N Scircumflex ; G 286\nU 349 ; WX 521 ; N scircumflex ; G 287\nU 350 ; WX 635 ; N Scedilla ; G 288\nU 351 ; WX 521 ; N scedilla ; G 289\nU 352 ; WX 635 ; N Scaron ; G 290\nU 353 ; WX 521 ; N scaron ; G 291\nU 354 ; WX 611 ; N Tcommaaccent ; G 292\nU 355 ; WX 392 ; N tcommaaccent ; G 293\nU 356 ; WX 611 ; N Tcaron ; G 294\nU 357 ; WX 392 ; N tcaron ; G 295\nU 358 ; WX 611 ; N Tbar ; G 296\nU 359 ; WX 392 ; N tbar ; G 297\nU 360 ; WX 732 ; N Utilde ; G 298\nU 361 ; WX 634 ; N utilde ; G 299\nU 362 ; WX 732 ; N Umacron ; G 300\nU 363 ; WX 634 ; N umacron ; G 301\nU 364 ; WX 732 ; N Ubreve ; G 302\nU 365 ; WX 634 ; N ubreve ; G 303\nU 366 ; WX 732 ; N Uring ; G 304\nU 367 ; WX 634 ; N uring ; G 305\nU 368 ; WX 732 ; N Uhungarumlaut ; G 306\nU 369 ; WX 634 ; N uhungarumlaut ; G 307\nU 370 ; WX 732 ; N Uogonek ; G 308\nU 371 ; WX 634 ; N uogonek ; G 309\nU 372 ; WX 989 ; N Wcircumflex ; G 310\nU 373 ; WX 818 ; N wcircumflex ; G 311\nU 374 ; WX 611 ; N Ycircumflex ; G 312\nU 375 ; WX 592 ; N ycircumflex ; G 313\nU 376 ; WX 611 ; N Ydieresis ; G 314\nU 377 ; WX 685 ; N Zacute ; G 315\nU 378 ; WX 525 ; N zacute ; G 316\nU 379 ; WX 685 ; N Zdotaccent ; G 317\nU 380 ; WX 525 ; N zdotaccent ; G 318\nU 381 ; WX 685 ; N Zcaron ; G 319\nU 382 ; WX 525 ; N zcaron ; G 320\nU 383 ; WX 352 ; N longs ; G 321\nU 384 ; WX 635 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 686 ; N uni0182 ; G 324\nU 387 ; WX 635 ; N uni0183 ; G 325\nU 388 ; WX 686 ; N uni0184 ; G 326\nU 389 ; WX 635 ; N uni0185 ; G 327\nU 390 ; WX 703 ; N uni0186 ; G 328\nU 391 ; WX 698 ; N uni0187 ; G 329\nU 392 ; WX 550 ; N uni0188 ; G 330\nU 393 ; WX 775 ; N uni0189 ; G 331\nU 394 ; WX 819 ; N uni018A ; G 332\nU 395 ; WX 686 ; N uni018B ; G 333\nU 396 ; WX 635 ; N uni018C ; G 334\nU 397 ; WX 612 ; N uni018D ; G 335\nU 398 ; WX 632 ; N uni018E ; G 336\nU 399 ; WX 787 ; N uni018F ; G 337\nU 400 ; WX 614 ; N uni0190 ; G 338\nU 401 ; WX 575 ; N uni0191 ; G 339\nU 402 ; WX 352 ; N florin ; G 340\nU 403 ; WX 775 ; N uni0193 ; G 341\nU 404 ; WX 687 ; N uni0194 ; G 342\nU 405 ; WX 984 ; N uni0195 ; G 343\nU 406 ; WX 354 ; N uni0196 ; G 344\nU 407 ; WX 295 ; N uni0197 ; G 345\nU 408 ; WX 746 ; N uni0198 ; G 346\nU 409 ; WX 579 ; N uni0199 ; G 347\nU 410 ; WX 278 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 974 ; N uni019C ; G 350\nU 413 ; WX 748 ; N uni019D ; G 351\nU 414 ; WX 634 ; N uni019E ; G 352\nU 415 ; WX 787 ; N uni019F ; G 353\nU 416 ; WX 913 ; N Ohorn ; G 354\nU 417 ; WX 612 ; N ohorn ; G 355\nU 418 ; WX 949 ; N uni01A2 ; G 356\nU 419 ; WX 759 ; N uni01A3 ; G 357\nU 420 ; WX 652 ; N uni01A4 ; G 358\nU 421 ; WX 635 ; N uni01A5 ; G 359\nU 422 ; WX 695 ; N uni01A6 ; G 360\nU 423 ; WX 635 ; N uni01A7 ; G 361\nU 424 ; WX 521 ; N uni01A8 ; G 362\nU 425 ; WX 632 ; N uni01A9 ; G 363\nU 426 ; WX 336 ; N uni01AA ; G 364\nU 427 ; WX 392 ; N uni01AB ; G 365\nU 428 ; WX 611 ; N uni01AC ; G 366\nU 429 ; WX 392 ; N uni01AD ; G 367\nU 430 ; WX 611 ; N uni01AE ; G 368\nU 431 ; WX 858 ; N Uhorn ; G 369\nU 432 ; WX 634 ; N uhorn ; G 370\nU 433 ; WX 764 ; N uni01B1 ; G 371\nU 434 ; WX 721 ; N uni01B2 ; G 372\nU 435 ; WX 744 ; N uni01B3 ; G 373\nU 436 ; WX 730 ; N uni01B4 ; G 374\nU 437 ; WX 685 ; N uni01B5 ; G 375\nU 438 ; WX 525 ; N uni01B6 ; G 376\nU 439 ; WX 666 ; N uni01B7 ; G 377\nU 440 ; WX 666 ; N uni01B8 ; G 378\nU 441 ; WX 578 ; N uni01B9 ; G 379\nU 442 ; WX 525 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 666 ; N uni01BC ; G 382\nU 445 ; WX 578 ; N uni01BD ; G 383\nU 446 ; WX 510 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1422 ; N uni01C4 ; G 390\nU 453 ; WX 1299 ; N uni01C5 ; G 391\nU 454 ; WX 1154 ; N uni01C6 ; G 392\nU 455 ; WX 835 ; N uni01C7 ; G 393\nU 456 ; WX 787 ; N uni01C8 ; G 394\nU 457 ; WX 457 ; N uni01C9 ; G 395\nU 458 ; WX 931 ; N uni01CA ; G 396\nU 459 ; WX 924 ; N uni01CB ; G 397\nU 460 ; WX 797 ; N uni01CC ; G 398\nU 461 ; WX 684 ; N uni01CD ; G 399\nU 462 ; WX 613 ; N uni01CE ; G 400\nU 463 ; WX 295 ; N uni01CF ; G 401\nU 464 ; WX 278 ; N uni01D0 ; G 402\nU 465 ; WX 787 ; N uni01D1 ; G 403\nU 466 ; WX 612 ; N uni01D2 ; G 404\nU 467 ; WX 732 ; N uni01D3 ; G 405\nU 468 ; WX 634 ; N uni01D4 ; G 406\nU 469 ; WX 732 ; N uni01D5 ; G 407\nU 470 ; WX 634 ; N uni01D6 ; G 408\nU 471 ; WX 732 ; N uni01D7 ; G 409\nU 472 ; WX 634 ; N uni01D8 ; G 410\nU 473 ; WX 732 ; N uni01D9 ; G 411\nU 474 ; WX 634 ; N uni01DA ; G 412\nU 475 ; WX 732 ; N uni01DB ; G 413\nU 476 ; WX 634 ; N uni01DC ; G 414\nU 477 ; WX 615 ; N uni01DD ; G 415\nU 478 ; WX 684 ; N uni01DE ; G 416\nU 479 ; WX 613 ; N uni01DF ; G 417\nU 480 ; WX 684 ; N uni01E0 ; G 418\nU 481 ; WX 613 ; N uni01E1 ; G 419\nU 482 ; WX 974 ; N uni01E2 ; G 420\nU 483 ; WX 982 ; N uni01E3 ; G 421\nU 484 ; WX 775 ; N uni01E4 ; G 422\nU 485 ; WX 635 ; N uni01E5 ; G 423\nU 486 ; WX 775 ; N Gcaron ; G 424\nU 487 ; WX 635 ; N gcaron ; G 425\nU 488 ; WX 656 ; N uni01E8 ; G 426\nU 489 ; WX 579 ; N uni01E9 ; G 427\nU 490 ; WX 787 ; N uni01EA ; G 428\nU 491 ; WX 612 ; N uni01EB ; G 429\nU 492 ; WX 787 ; N uni01EC ; G 430\nU 493 ; WX 612 ; N uni01ED ; G 431\nU 494 ; WX 666 ; N uni01EE ; G 432\nU 495 ; WX 578 ; N uni01EF ; G 433\nU 496 ; WX 278 ; N uni01F0 ; G 434\nU 497 ; WX 1422 ; N uni01F1 ; G 435\nU 498 ; WX 1299 ; N uni01F2 ; G 436\nU 499 ; WX 1154 ; N uni01F3 ; G 437\nU 500 ; WX 775 ; N uni01F4 ; G 438\nU 501 ; WX 635 ; N uni01F5 ; G 439\nU 502 ; WX 1113 ; N uni01F6 ; G 440\nU 503 ; WX 682 ; N uni01F7 ; G 441\nU 504 ; WX 748 ; N uni01F8 ; G 442\nU 505 ; WX 634 ; N uni01F9 ; G 443\nU 506 ; WX 684 ; N Aringacute ; G 444\nU 507 ; WX 613 ; N aringacute ; G 445\nU 508 ; WX 974 ; N AEacute ; G 446\nU 509 ; WX 982 ; N aeacute ; G 447\nU 510 ; WX 787 ; N Oslashacute ; G 448\nU 511 ; WX 612 ; N oslashacute ; G 449\nU 512 ; WX 684 ; N uni0200 ; G 450\nU 513 ; WX 613 ; N uni0201 ; G 451\nU 514 ; WX 684 ; N uni0202 ; G 452\nU 515 ; WX 613 ; N uni0203 ; G 453\nU 516 ; WX 632 ; N uni0204 ; G 454\nU 517 ; WX 615 ; N uni0205 ; G 455\nU 518 ; WX 632 ; N uni0206 ; G 456\nU 519 ; WX 615 ; N uni0207 ; G 457\nU 520 ; WX 295 ; N uni0208 ; G 458\nU 521 ; WX 278 ; N uni0209 ; G 459\nU 522 ; WX 295 ; N uni020A ; G 460\nU 523 ; WX 278 ; N uni020B ; G 461\nU 524 ; WX 787 ; N uni020C ; G 462\nU 525 ; WX 612 ; N uni020D ; G 463\nU 526 ; WX 787 ; N uni020E ; G 464\nU 527 ; WX 612 ; N uni020F ; G 465\nU 528 ; WX 695 ; N uni0210 ; G 466\nU 529 ; WX 411 ; N uni0211 ; G 467\nU 530 ; WX 695 ; N uni0212 ; G 468\nU 531 ; WX 411 ; N uni0213 ; G 469\nU 532 ; WX 732 ; N uni0214 ; G 470\nU 533 ; WX 634 ; N uni0215 ; G 471\nU 534 ; WX 732 ; N uni0216 ; G 472\nU 535 ; WX 634 ; N uni0217 ; G 473\nU 536 ; WX 635 ; N Scommaaccent ; G 474\nU 537 ; WX 521 ; N scommaaccent ; G 475\nU 538 ; WX 611 ; N uni021A ; G 476\nU 539 ; WX 392 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 752 ; N uni021E ; G 480\nU 543 ; WX 634 ; N uni021F ; G 481\nU 544 ; WX 735 ; N uni0220 ; G 482\nU 545 ; WX 838 ; N uni0221 ; G 483\nU 546 ; WX 698 ; N uni0222 ; G 484\nU 547 ; WX 610 ; N uni0223 ; G 485\nU 548 ; WX 685 ; N uni0224 ; G 486\nU 549 ; WX 525 ; N uni0225 ; G 487\nU 550 ; WX 684 ; N uni0226 ; G 488\nU 551 ; WX 613 ; N uni0227 ; G 489\nU 552 ; WX 632 ; N uni0228 ; G 490\nU 553 ; WX 615 ; N uni0229 ; G 491\nU 554 ; WX 787 ; N uni022A ; G 492\nU 555 ; WX 612 ; N uni022B ; G 493\nU 556 ; WX 787 ; N uni022C ; G 494\nU 557 ; WX 612 ; N uni022D ; G 495\nU 558 ; WX 787 ; N uni022E ; G 496\nU 559 ; WX 612 ; N uni022F ; G 497\nU 560 ; WX 787 ; N uni0230 ; G 498\nU 561 ; WX 612 ; N uni0231 ; G 499\nU 562 ; WX 611 ; N uni0232 ; G 500\nU 563 ; WX 592 ; N uni0233 ; G 501\nU 564 ; WX 475 ; N uni0234 ; G 502\nU 565 ; WX 843 ; N uni0235 ; G 503\nU 566 ; WX 477 ; N uni0236 ; G 504\nU 567 ; WX 278 ; N dotlessj ; G 505\nU 568 ; WX 998 ; N uni0238 ; G 506\nU 569 ; WX 998 ; N uni0239 ; G 507\nU 570 ; WX 684 ; N uni023A ; G 508\nU 571 ; WX 698 ; N uni023B ; G 509\nU 572 ; WX 550 ; N uni023C ; G 510\nU 573 ; WX 557 ; N uni023D ; G 511\nU 574 ; WX 611 ; N uni023E ; G 512\nU 575 ; WX 521 ; N uni023F ; G 513\nU 576 ; WX 525 ; N uni0240 ; G 514\nU 577 ; WX 603 ; N uni0241 ; G 515\nU 578 ; WX 479 ; N uni0242 ; G 516\nU 579 ; WX 686 ; N uni0243 ; G 517\nU 580 ; WX 732 ; N uni0244 ; G 518\nU 581 ; WX 684 ; N uni0245 ; G 519\nU 582 ; WX 632 ; N uni0246 ; G 520\nU 583 ; WX 615 ; N uni0247 ; G 521\nU 584 ; WX 295 ; N uni0248 ; G 522\nU 585 ; WX 278 ; N uni0249 ; G 523\nU 586 ; WX 781 ; N uni024A ; G 524\nU 587 ; WX 635 ; N uni024B ; G 525\nU 588 ; WX 695 ; N uni024C ; G 526\nU 589 ; WX 411 ; N uni024D ; G 527\nU 590 ; WX 611 ; N uni024E ; G 528\nU 591 ; WX 592 ; N uni024F ; G 529\nU 592 ; WX 600 ; N uni0250 ; G 530\nU 593 ; WX 635 ; N uni0251 ; G 531\nU 594 ; WX 635 ; N uni0252 ; G 532\nU 595 ; WX 635 ; N uni0253 ; G 533\nU 596 ; WX 549 ; N uni0254 ; G 534\nU 597 ; WX 550 ; N uni0255 ; G 535\nU 598 ; WX 635 ; N uni0256 ; G 536\nU 599 ; WX 696 ; N uni0257 ; G 537\nU 600 ; WX 615 ; N uni0258 ; G 538\nU 601 ; WX 615 ; N uni0259 ; G 539\nU 602 ; WX 819 ; N uni025A ; G 540\nU 603 ; WX 541 ; N uni025B ; G 541\nU 604 ; WX 532 ; N uni025C ; G 542\nU 605 ; WX 775 ; N uni025D ; G 543\nU 606 ; WX 664 ; N uni025E ; G 544\nU 607 ; WX 278 ; N uni025F ; G 545\nU 608 ; WX 696 ; N uni0260 ; G 546\nU 609 ; WX 635 ; N uni0261 ; G 547\nU 610 ; WX 629 ; N uni0262 ; G 548\nU 611 ; WX 596 ; N uni0263 ; G 549\nU 612 ; WX 596 ; N uni0264 ; G 550\nU 613 ; WX 634 ; N uni0265 ; G 551\nU 614 ; WX 634 ; N uni0266 ; G 552\nU 615 ; WX 634 ; N uni0267 ; G 553\nU 616 ; WX 278 ; N uni0268 ; G 554\nU 617 ; WX 338 ; N uni0269 ; G 555\nU 618 ; WX 372 ; N uni026A ; G 556\nU 619 ; WX 396 ; N uni026B ; G 557\nU 620 ; WX 487 ; N uni026C ; G 558\nU 621 ; WX 278 ; N uni026D ; G 559\nU 622 ; WX 706 ; N uni026E ; G 560\nU 623 ; WX 974 ; N uni026F ; G 561\nU 624 ; WX 974 ; N uni0270 ; G 562\nU 625 ; WX 974 ; N uni0271 ; G 563\nU 626 ; WX 646 ; N uni0272 ; G 564\nU 627 ; WX 642 ; N uni0273 ; G 565\nU 628 ; WX 634 ; N uni0274 ; G 566\nU 629 ; WX 612 ; N uni0275 ; G 567\nU 630 ; WX 858 ; N uni0276 ; G 568\nU 631 ; WX 728 ; N uni0277 ; G 569\nU 632 ; WX 660 ; N uni0278 ; G 570\nU 633 ; WX 414 ; N uni0279 ; G 571\nU 634 ; WX 414 ; N uni027A ; G 572\nU 635 ; WX 414 ; N uni027B ; G 573\nU 636 ; WX 411 ; N uni027C ; G 574\nU 637 ; WX 411 ; N uni027D ; G 575\nU 638 ; WX 530 ; N uni027E ; G 576\nU 639 ; WX 530 ; N uni027F ; G 577\nU 640 ; WX 604 ; N uni0280 ; G 578\nU 641 ; WX 604 ; N uni0281 ; G 579\nU 642 ; WX 521 ; N uni0282 ; G 580\nU 643 ; WX 336 ; N uni0283 ; G 581\nU 644 ; WX 336 ; N uni0284 ; G 582\nU 645 ; WX 461 ; N uni0285 ; G 583\nU 646 ; WX 336 ; N uni0286 ; G 584\nU 647 ; WX 392 ; N uni0287 ; G 585\nU 648 ; WX 392 ; N uni0288 ; G 586\nU 649 ; WX 634 ; N uni0289 ; G 587\nU 650 ; WX 618 ; N uni028A ; G 588\nU 651 ; WX 598 ; N uni028B ; G 589\nU 652 ; WX 592 ; N uni028C ; G 590\nU 653 ; WX 818 ; N uni028D ; G 591\nU 654 ; WX 592 ; N uni028E ; G 592\nU 655 ; WX 611 ; N uni028F ; G 593\nU 656 ; WX 525 ; N uni0290 ; G 594\nU 657 ; WX 525 ; N uni0291 ; G 595\nU 658 ; WX 578 ; N uni0292 ; G 596\nU 659 ; WX 578 ; N uni0293 ; G 597\nU 660 ; WX 510 ; N uni0294 ; G 598\nU 661 ; WX 510 ; N uni0295 ; G 599\nU 662 ; WX 510 ; N uni0296 ; G 600\nU 663 ; WX 510 ; N uni0297 ; G 601\nU 664 ; WX 787 ; N uni0298 ; G 602\nU 665 ; WX 580 ; N uni0299 ; G 603\nU 666 ; WX 664 ; N uni029A ; G 604\nU 667 ; WX 708 ; N uni029B ; G 605\nU 668 ; WX 654 ; N uni029C ; G 606\nU 669 ; WX 292 ; N uni029D ; G 607\nU 670 ; WX 667 ; N uni029E ; G 608\nU 671 ; WX 507 ; N uni029F ; G 609\nU 672 ; WX 727 ; N uni02A0 ; G 610\nU 673 ; WX 510 ; N uni02A1 ; G 611\nU 674 ; WX 510 ; N uni02A2 ; G 612\nU 675 ; WX 1014 ; N uni02A3 ; G 613\nU 676 ; WX 1058 ; N uni02A4 ; G 614\nU 677 ; WX 1013 ; N uni02A5 ; G 615\nU 678 ; WX 830 ; N uni02A6 ; G 616\nU 679 ; WX 610 ; N uni02A7 ; G 617\nU 680 ; WX 778 ; N uni02A8 ; G 618\nU 681 ; WX 848 ; N uni02A9 ; G 619\nU 682 ; WX 706 ; N uni02AA ; G 620\nU 683 ; WX 654 ; N uni02AB ; G 621\nU 684 ; WX 515 ; N uni02AC ; G 622\nU 685 ; WX 515 ; N uni02AD ; G 623\nU 686 ; WX 661 ; N uni02AE ; G 624\nU 687 ; WX 664 ; N uni02AF ; G 625\nU 688 ; WX 404 ; N uni02B0 ; G 626\nU 689 ; WX 399 ; N uni02B1 ; G 627\nU 690 ; WX 175 ; N uni02B2 ; G 628\nU 691 ; WX 259 ; N uni02B3 ; G 629\nU 692 ; WX 295 ; N uni02B4 ; G 630\nU 693 ; WX 296 ; N uni02B5 ; G 631\nU 694 ; WX 379 ; N uni02B6 ; G 632\nU 695 ; WX 515 ; N uni02B7 ; G 633\nU 696 ; WX 373 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 370 ; N uni02C0 ; G 642\nU 705 ; WX 370 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 275 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 275 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 307 ; N uni02D2 ; G 660\nU 723 ; WX 307 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 390 ; N uni02D6 ; G 664\nU 727 ; WX 317 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 315 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 426 ; N uni02E0 ; G 674\nU 737 ; WX 166 ; N uni02E1 ; G 675\nU 738 ; WX 373 ; N uni02E2 ; G 676\nU 739 ; WX 444 ; N uni02E3 ; G 677\nU 740 ; WX 370 ; N uni02E4 ; G 678\nU 741 ; WX 493 ; N uni02E5 ; G 679\nU 742 ; WX 493 ; N uni02E6 ; G 680\nU 743 ; WX 493 ; N uni02E7 ; G 681\nU 744 ; WX 493 ; N uni02E8 ; G 682\nU 745 ; WX 493 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 518 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 654 ; N uni0370 ; G 782\nU 881 ; WX 568 ; N uni0371 ; G 783\nU 882 ; WX 862 ; N uni0372 ; G 784\nU 883 ; WX 647 ; N uni0373 ; G 785\nU 884 ; WX 278 ; N uni0374 ; G 786\nU 885 ; WX 278 ; N uni0375 ; G 787\nU 886 ; WX 748 ; N uni0376 ; G 788\nU 887 ; WX 650 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 549 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 337 ; N uni037E ; G 794\nU 895 ; WX 295 ; N uni037F ; G 795\nU 900 ; WX 500 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 692 ; N Alphatonos ; G 798\nU 903 ; WX 318 ; N anoteleia ; G 799\nU 904 ; WX 746 ; N Epsilontonos ; G 800\nU 905 ; WX 871 ; N Etatonos ; G 801\nU 906 ; WX 408 ; N Iotatonos ; G 802\nU 908 ; WX 813 ; N Omicrontonos ; G 803\nU 910 ; WX 825 ; N Upsilontonos ; G 804\nU 911 ; WX 826 ; N Omegatonos ; G 805\nU 912 ; WX 338 ; N iotadieresistonos ; G 806\nU 913 ; WX 684 ; N Alpha ; G 807\nU 914 ; WX 686 ; N Beta ; G 808\nU 915 ; WX 557 ; N Gamma ; G 809\nU 916 ; WX 684 ; N uni0394 ; G 810\nU 917 ; WX 632 ; N Epsilon ; G 811\nU 918 ; WX 685 ; N Zeta ; G 812\nU 919 ; WX 752 ; N Eta ; G 813\nU 920 ; WX 787 ; N Theta ; G 814\nU 921 ; WX 295 ; N Iota ; G 815\nU 922 ; WX 656 ; N Kappa ; G 816\nU 923 ; WX 684 ; N Lambda ; G 817\nU 924 ; WX 863 ; N Mu ; G 818\nU 925 ; WX 748 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 787 ; N Omicron ; G 821\nU 928 ; WX 752 ; N Pi ; G 822\nU 929 ; WX 603 ; N Rho ; G 823\nU 931 ; WX 632 ; N Sigma ; G 824\nU 932 ; WX 611 ; N Tau ; G 825\nU 933 ; WX 611 ; N Upsilon ; G 826\nU 934 ; WX 787 ; N Phi ; G 827\nU 935 ; WX 685 ; N Chi ; G 828\nU 936 ; WX 787 ; N Psi ; G 829\nU 937 ; WX 764 ; N Omega ; G 830\nU 938 ; WX 295 ; N Iotadieresis ; G 831\nU 939 ; WX 611 ; N Upsilondieresis ; G 832\nU 940 ; WX 659 ; N alphatonos ; G 833\nU 941 ; WX 541 ; N epsilontonos ; G 834\nU 942 ; WX 634 ; N etatonos ; G 835\nU 943 ; WX 338 ; N iotatonos ; G 836\nU 944 ; WX 579 ; N upsilondieresistonos ; G 837\nU 945 ; WX 659 ; N alpha ; G 838\nU 946 ; WX 638 ; N beta ; G 839\nU 947 ; WX 592 ; N gamma ; G 840\nU 948 ; WX 612 ; N delta ; G 841\nU 949 ; WX 541 ; N epsilon ; G 842\nU 950 ; WX 544 ; N zeta ; G 843\nU 951 ; WX 634 ; N eta ; G 844\nU 952 ; WX 612 ; N theta ; G 845\nU 953 ; WX 338 ; N iota ; G 846\nU 954 ; WX 589 ; N kappa ; G 847\nU 955 ; WX 592 ; N lambda ; G 848\nU 956 ; WX 636 ; N uni03BC ; G 849\nU 957 ; WX 559 ; N nu ; G 850\nU 958 ; WX 558 ; N xi ; G 851\nU 959 ; WX 612 ; N omicron ; G 852\nU 960 ; WX 602 ; N pi ; G 853\nU 961 ; WX 635 ; N rho ; G 854\nU 962 ; WX 587 ; N sigma1 ; G 855\nU 963 ; WX 634 ; N sigma ; G 856\nU 964 ; WX 602 ; N tau ; G 857\nU 965 ; WX 579 ; N upsilon ; G 858\nU 966 ; WX 660 ; N phi ; G 859\nU 967 ; WX 578 ; N chi ; G 860\nU 968 ; WX 660 ; N psi ; G 861\nU 969 ; WX 837 ; N omega ; G 862\nU 970 ; WX 338 ; N iotadieresis ; G 863\nU 971 ; WX 579 ; N upsilondieresis ; G 864\nU 972 ; WX 612 ; N omicrontonos ; G 865\nU 973 ; WX 579 ; N upsilontonos ; G 866\nU 974 ; WX 837 ; N omegatonos ; G 867\nU 975 ; WX 656 ; N uni03CF ; G 868\nU 976 ; WX 614 ; N uni03D0 ; G 869\nU 977 ; WX 619 ; N theta1 ; G 870\nU 978 ; WX 699 ; N Upsilon1 ; G 871\nU 979 ; WX 842 ; N uni03D3 ; G 872\nU 980 ; WX 699 ; N uni03D4 ; G 873\nU 981 ; WX 660 ; N phi1 ; G 874\nU 982 ; WX 837 ; N omega1 ; G 875\nU 983 ; WX 664 ; N uni03D7 ; G 876\nU 984 ; WX 787 ; N uni03D8 ; G 877\nU 985 ; WX 612 ; N uni03D9 ; G 878\nU 986 ; WX 648 ; N uni03DA ; G 879\nU 987 ; WX 587 ; N uni03DB ; G 880\nU 988 ; WX 575 ; N uni03DC ; G 881\nU 989 ; WX 458 ; N uni03DD ; G 882\nU 990 ; WX 660 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 865 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 934 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 758 ; N uni03E4 ; G 889\nU 997 ; WX 659 ; N uni03E5 ; G 890\nU 998 ; WX 792 ; N uni03E6 ; G 891\nU 999 ; WX 615 ; N uni03E7 ; G 892\nU 1000 ; WX 687 ; N uni03E8 ; G 893\nU 1001 ; WX 607 ; N uni03E9 ; G 894\nU 1002 ; WX 768 ; N uni03EA ; G 895\nU 1003 ; WX 625 ; N uni03EB ; G 896\nU 1004 ; WX 699 ; N uni03EC ; G 897\nU 1005 ; WX 612 ; N uni03ED ; G 898\nU 1006 ; WX 611 ; N uni03EE ; G 899\nU 1007 ; WX 536 ; N uni03EF ; G 900\nU 1008 ; WX 664 ; N uni03F0 ; G 901\nU 1009 ; WX 635 ; N uni03F1 ; G 902\nU 1010 ; WX 550 ; N uni03F2 ; G 903\nU 1011 ; WX 278 ; N uni03F3 ; G 904\nU 1012 ; WX 787 ; N uni03F4 ; G 905\nU 1013 ; WX 615 ; N uni03F5 ; G 906\nU 1014 ; WX 615 ; N uni03F6 ; G 907\nU 1015 ; WX 605 ; N uni03F7 ; G 908\nU 1016 ; WX 635 ; N uni03F8 ; G 909\nU 1017 ; WX 698 ; N uni03F9 ; G 910\nU 1018 ; WX 863 ; N uni03FA ; G 911\nU 1019 ; WX 651 ; N uni03FB ; G 912\nU 1020 ; WX 635 ; N uni03FC ; G 913\nU 1021 ; WX 703 ; N uni03FD ; G 914\nU 1022 ; WX 698 ; N uni03FE ; G 915\nU 1023 ; WX 703 ; N uni03FF ; G 916\nU 1024 ; WX 632 ; N uni0400 ; G 917\nU 1025 ; WX 632 ; N uni0401 ; G 918\nU 1026 ; WX 786 ; N uni0402 ; G 919\nU 1027 ; WX 610 ; N uni0403 ; G 920\nU 1028 ; WX 698 ; N uni0404 ; G 921\nU 1029 ; WX 635 ; N uni0405 ; G 922\nU 1030 ; WX 295 ; N uni0406 ; G 923\nU 1031 ; WX 295 ; N uni0407 ; G 924\nU 1032 ; WX 295 ; N uni0408 ; G 925\nU 1033 ; WX 1094 ; N uni0409 ; G 926\nU 1034 ; WX 1045 ; N uni040A ; G 927\nU 1035 ; WX 786 ; N uni040B ; G 928\nU 1036 ; WX 710 ; N uni040C ; G 929\nU 1037 ; WX 748 ; N uni040D ; G 930\nU 1038 ; WX 609 ; N uni040E ; G 931\nU 1039 ; WX 752 ; N uni040F ; G 932\nU 1040 ; WX 684 ; N uni0410 ; G 933\nU 1041 ; WX 686 ; N uni0411 ; G 934\nU 1042 ; WX 686 ; N uni0412 ; G 935\nU 1043 ; WX 610 ; N uni0413 ; G 936\nU 1044 ; WX 781 ; N uni0414 ; G 937\nU 1045 ; WX 632 ; N uni0415 ; G 938\nU 1046 ; WX 1077 ; N uni0416 ; G 939\nU 1047 ; WX 641 ; N uni0417 ; G 940\nU 1048 ; WX 748 ; N uni0418 ; G 941\nU 1049 ; WX 748 ; N uni0419 ; G 942\nU 1050 ; WX 710 ; N uni041A ; G 943\nU 1051 ; WX 752 ; N uni041B ; G 944\nU 1052 ; WX 863 ; N uni041C ; G 945\nU 1053 ; WX 752 ; N uni041D ; G 946\nU 1054 ; WX 787 ; N uni041E ; G 947\nU 1055 ; WX 752 ; N uni041F ; G 948\nU 1056 ; WX 603 ; N uni0420 ; G 949\nU 1057 ; WX 698 ; N uni0421 ; G 950\nU 1058 ; WX 611 ; N uni0422 ; G 951\nU 1059 ; WX 609 ; N uni0423 ; G 952\nU 1060 ; WX 861 ; N uni0424 ; G 953\nU 1061 ; WX 685 ; N uni0425 ; G 954\nU 1062 ; WX 776 ; N uni0426 ; G 955\nU 1063 ; WX 686 ; N uni0427 ; G 956\nU 1064 ; WX 1069 ; N uni0428 ; G 957\nU 1065 ; WX 1094 ; N uni0429 ; G 958\nU 1066 ; WX 833 ; N uni042A ; G 959\nU 1067 ; WX 882 ; N uni042B ; G 960\nU 1068 ; WX 686 ; N uni042C ; G 961\nU 1069 ; WX 698 ; N uni042D ; G 962\nU 1070 ; WX 1080 ; N uni042E ; G 963\nU 1071 ; WX 695 ; N uni042F ; G 964\nU 1072 ; WX 613 ; N uni0430 ; G 965\nU 1073 ; WX 617 ; N uni0431 ; G 966\nU 1074 ; WX 589 ; N uni0432 ; G 967\nU 1075 ; WX 525 ; N uni0433 ; G 968\nU 1076 ; WX 691 ; N uni0434 ; G 969\nU 1077 ; WX 615 ; N uni0435 ; G 970\nU 1078 ; WX 901 ; N uni0436 ; G 971\nU 1079 ; WX 532 ; N uni0437 ; G 972\nU 1080 ; WX 650 ; N uni0438 ; G 973\nU 1081 ; WX 650 ; N uni0439 ; G 974\nU 1082 ; WX 604 ; N uni043A ; G 975\nU 1083 ; WX 639 ; N uni043B ; G 976\nU 1084 ; WX 754 ; N uni043C ; G 977\nU 1085 ; WX 654 ; N uni043D ; G 978\nU 1086 ; WX 612 ; N uni043E ; G 979\nU 1087 ; WX 654 ; N uni043F ; G 980\nU 1088 ; WX 635 ; N uni0440 ; G 981\nU 1089 ; WX 550 ; N uni0441 ; G 982\nU 1090 ; WX 583 ; N uni0442 ; G 983\nU 1091 ; WX 592 ; N uni0443 ; G 984\nU 1092 ; WX 855 ; N uni0444 ; G 985\nU 1093 ; WX 592 ; N uni0445 ; G 986\nU 1094 ; WX 681 ; N uni0446 ; G 987\nU 1095 ; WX 591 ; N uni0447 ; G 988\nU 1096 ; WX 915 ; N uni0448 ; G 989\nU 1097 ; WX 942 ; N uni0449 ; G 990\nU 1098 ; WX 707 ; N uni044A ; G 991\nU 1099 ; WX 790 ; N uni044B ; G 992\nU 1100 ; WX 589 ; N uni044C ; G 993\nU 1101 ; WX 549 ; N uni044D ; G 994\nU 1102 ; WX 842 ; N uni044E ; G 995\nU 1103 ; WX 602 ; N uni044F ; G 996\nU 1104 ; WX 615 ; N uni0450 ; G 997\nU 1105 ; WX 615 ; N uni0451 ; G 998\nU 1106 ; WX 625 ; N uni0452 ; G 999\nU 1107 ; WX 525 ; N uni0453 ; G 1000\nU 1108 ; WX 549 ; N uni0454 ; G 1001\nU 1109 ; WX 521 ; N uni0455 ; G 1002\nU 1110 ; WX 278 ; N uni0456 ; G 1003\nU 1111 ; WX 278 ; N uni0457 ; G 1004\nU 1112 ; WX 278 ; N uni0458 ; G 1005\nU 1113 ; WX 902 ; N uni0459 ; G 1006\nU 1114 ; WX 898 ; N uni045A ; G 1007\nU 1115 ; WX 652 ; N uni045B ; G 1008\nU 1116 ; WX 604 ; N uni045C ; G 1009\nU 1117 ; WX 650 ; N uni045D ; G 1010\nU 1118 ; WX 592 ; N uni045E ; G 1011\nU 1119 ; WX 654 ; N uni045F ; G 1012\nU 1120 ; WX 934 ; N uni0460 ; G 1013\nU 1121 ; WX 837 ; N uni0461 ; G 1014\nU 1122 ; WX 771 ; N uni0462 ; G 1015\nU 1123 ; WX 672 ; N uni0463 ; G 1016\nU 1124 ; WX 942 ; N uni0464 ; G 1017\nU 1125 ; WX 749 ; N uni0465 ; G 1018\nU 1126 ; WX 879 ; N uni0466 ; G 1019\nU 1127 ; WX 783 ; N uni0467 ; G 1020\nU 1128 ; WX 1160 ; N uni0468 ; G 1021\nU 1129 ; WX 1001 ; N uni0469 ; G 1022\nU 1130 ; WX 787 ; N uni046A ; G 1023\nU 1131 ; WX 612 ; N uni046B ; G 1024\nU 1132 ; WX 1027 ; N uni046C ; G 1025\nU 1133 ; WX 824 ; N uni046D ; G 1026\nU 1134 ; WX 636 ; N uni046E ; G 1027\nU 1135 ; WX 541 ; N uni046F ; G 1028\nU 1136 ; WX 856 ; N uni0470 ; G 1029\nU 1137 ; WX 876 ; N uni0471 ; G 1030\nU 1138 ; WX 787 ; N uni0472 ; G 1031\nU 1139 ; WX 612 ; N uni0473 ; G 1032\nU 1140 ; WX 781 ; N uni0474 ; G 1033\nU 1141 ; WX 665 ; N uni0475 ; G 1034\nU 1142 ; WX 781 ; N uni0476 ; G 1035\nU 1143 ; WX 665 ; N uni0477 ; G 1036\nU 1144 ; WX 992 ; N uni0478 ; G 1037\nU 1145 ; WX 904 ; N uni0479 ; G 1038\nU 1146 ; WX 953 ; N uni047A ; G 1039\nU 1147 ; WX 758 ; N uni047B ; G 1040\nU 1148 ; WX 1180 ; N uni047C ; G 1041\nU 1149 ; WX 1028 ; N uni047D ; G 1042\nU 1150 ; WX 934 ; N uni047E ; G 1043\nU 1151 ; WX 837 ; N uni047F ; G 1044\nU 1152 ; WX 698 ; N uni0480 ; G 1045\nU 1153 ; WX 550 ; N uni0481 ; G 1046\nU 1154 ; WX 502 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 772 ; N uni048A ; G 1055\nU 1163 ; WX 677 ; N uni048B ; G 1056\nU 1164 ; WX 686 ; N uni048C ; G 1057\nU 1165 ; WX 589 ; N uni048D ; G 1058\nU 1166 ; WX 603 ; N uni048E ; G 1059\nU 1167 ; WX 635 ; N uni048F ; G 1060\nU 1168 ; WX 610 ; N uni0490 ; G 1061\nU 1169 ; WX 525 ; N uni0491 ; G 1062\nU 1170 ; WX 675 ; N uni0492 ; G 1063\nU 1171 ; WX 590 ; N uni0493 ; G 1064\nU 1172 ; WX 624 ; N uni0494 ; G 1065\nU 1173 ; WX 530 ; N uni0495 ; G 1066\nU 1174 ; WX 1077 ; N uni0496 ; G 1067\nU 1175 ; WX 901 ; N uni0497 ; G 1068\nU 1176 ; WX 641 ; N uni0498 ; G 1069\nU 1177 ; WX 532 ; N uni0499 ; G 1070\nU 1178 ; WX 710 ; N uni049A ; G 1071\nU 1179 ; WX 604 ; N uni049B ; G 1072\nU 1180 ; WX 710 ; N uni049C ; G 1073\nU 1181 ; WX 604 ; N uni049D ; G 1074\nU 1182 ; WX 710 ; N uni049E ; G 1075\nU 1183 ; WX 604 ; N uni049F ; G 1076\nU 1184 ; WX 856 ; N uni04A0 ; G 1077\nU 1185 ; WX 832 ; N uni04A1 ; G 1078\nU 1186 ; WX 752 ; N uni04A2 ; G 1079\nU 1187 ; WX 661 ; N uni04A3 ; G 1080\nU 1188 ; WX 1014 ; N uni04A4 ; G 1081\nU 1189 ; WX 877 ; N uni04A5 ; G 1082\nU 1190 ; WX 1081 ; N uni04A6 ; G 1083\nU 1191 ; WX 916 ; N uni04A7 ; G 1084\nU 1192 ; WX 878 ; N uni04A8 ; G 1085\nU 1193 ; WX 693 ; N uni04A9 ; G 1086\nU 1194 ; WX 698 ; N uni04AA ; G 1087\nU 1195 ; WX 550 ; N uni04AB ; G 1088\nU 1196 ; WX 611 ; N uni04AC ; G 1089\nU 1197 ; WX 583 ; N uni04AD ; G 1090\nU 1198 ; WX 611 ; N uni04AE ; G 1091\nU 1199 ; WX 592 ; N uni04AF ; G 1092\nU 1200 ; WX 611 ; N uni04B0 ; G 1093\nU 1201 ; WX 592 ; N uni04B1 ; G 1094\nU 1202 ; WX 685 ; N uni04B2 ; G 1095\nU 1203 ; WX 592 ; N uni04B3 ; G 1096\nU 1204 ; WX 934 ; N uni04B4 ; G 1097\nU 1205 ; WX 807 ; N uni04B5 ; G 1098\nU 1206 ; WX 686 ; N uni04B6 ; G 1099\nU 1207 ; WX 591 ; N uni04B7 ; G 1100\nU 1208 ; WX 686 ; N uni04B8 ; G 1101\nU 1209 ; WX 591 ; N uni04B9 ; G 1102\nU 1210 ; WX 686 ; N uni04BA ; G 1103\nU 1211 ; WX 634 ; N uni04BB ; G 1104\nU 1212 ; WX 941 ; N uni04BC ; G 1105\nU 1213 ; WX 728 ; N uni04BD ; G 1106\nU 1214 ; WX 941 ; N uni04BE ; G 1107\nU 1215 ; WX 728 ; N uni04BF ; G 1108\nU 1216 ; WX 295 ; N uni04C0 ; G 1109\nU 1217 ; WX 1077 ; N uni04C1 ; G 1110\nU 1218 ; WX 901 ; N uni04C2 ; G 1111\nU 1219 ; WX 656 ; N uni04C3 ; G 1112\nU 1220 ; WX 604 ; N uni04C4 ; G 1113\nU 1221 ; WX 776 ; N uni04C5 ; G 1114\nU 1222 ; WX 670 ; N uni04C6 ; G 1115\nU 1223 ; WX 752 ; N uni04C7 ; G 1116\nU 1224 ; WX 661 ; N uni04C8 ; G 1117\nU 1225 ; WX 776 ; N uni04C9 ; G 1118\nU 1226 ; WX 681 ; N uni04CA ; G 1119\nU 1227 ; WX 686 ; N uni04CB ; G 1120\nU 1228 ; WX 591 ; N uni04CC ; G 1121\nU 1229 ; WX 888 ; N uni04CD ; G 1122\nU 1230 ; WX 774 ; N uni04CE ; G 1123\nU 1231 ; WX 278 ; N uni04CF ; G 1124\nU 1232 ; WX 684 ; N uni04D0 ; G 1125\nU 1233 ; WX 613 ; N uni04D1 ; G 1126\nU 1234 ; WX 684 ; N uni04D2 ; G 1127\nU 1235 ; WX 613 ; N uni04D3 ; G 1128\nU 1236 ; WX 974 ; N uni04D4 ; G 1129\nU 1237 ; WX 982 ; N uni04D5 ; G 1130\nU 1238 ; WX 632 ; N uni04D6 ; G 1131\nU 1239 ; WX 615 ; N uni04D7 ; G 1132\nU 1240 ; WX 787 ; N uni04D8 ; G 1133\nU 1241 ; WX 615 ; N uni04D9 ; G 1134\nU 1242 ; WX 787 ; N uni04DA ; G 1135\nU 1243 ; WX 615 ; N uni04DB ; G 1136\nU 1244 ; WX 1077 ; N uni04DC ; G 1137\nU 1245 ; WX 901 ; N uni04DD ; G 1138\nU 1246 ; WX 641 ; N uni04DE ; G 1139\nU 1247 ; WX 532 ; N uni04DF ; G 1140\nU 1248 ; WX 666 ; N uni04E0 ; G 1141\nU 1249 ; WX 578 ; N uni04E1 ; G 1142\nU 1250 ; WX 748 ; N uni04E2 ; G 1143\nU 1251 ; WX 650 ; N uni04E3 ; G 1144\nU 1252 ; WX 748 ; N uni04E4 ; G 1145\nU 1253 ; WX 650 ; N uni04E5 ; G 1146\nU 1254 ; WX 787 ; N uni04E6 ; G 1147\nU 1255 ; WX 612 ; N uni04E7 ; G 1148\nU 1256 ; WX 787 ; N uni04E8 ; G 1149\nU 1257 ; WX 612 ; N uni04E9 ; G 1150\nU 1258 ; WX 787 ; N uni04EA ; G 1151\nU 1259 ; WX 612 ; N uni04EB ; G 1152\nU 1260 ; WX 698 ; N uni04EC ; G 1153\nU 1261 ; WX 549 ; N uni04ED ; G 1154\nU 1262 ; WX 609 ; N uni04EE ; G 1155\nU 1263 ; WX 592 ; N uni04EF ; G 1156\nU 1264 ; WX 609 ; N uni04F0 ; G 1157\nU 1265 ; WX 592 ; N uni04F1 ; G 1158\nU 1266 ; WX 609 ; N uni04F2 ; G 1159\nU 1267 ; WX 592 ; N uni04F3 ; G 1160\nU 1268 ; WX 686 ; N uni04F4 ; G 1161\nU 1269 ; WX 591 ; N uni04F5 ; G 1162\nU 1270 ; WX 610 ; N uni04F6 ; G 1163\nU 1271 ; WX 525 ; N uni04F7 ; G 1164\nU 1272 ; WX 882 ; N uni04F8 ; G 1165\nU 1273 ; WX 790 ; N uni04F9 ; G 1166\nU 1274 ; WX 675 ; N uni04FA ; G 1167\nU 1275 ; WX 590 ; N uni04FB ; G 1168\nU 1276 ; WX 685 ; N uni04FC ; G 1169\nU 1277 ; WX 592 ; N uni04FD ; G 1170\nU 1278 ; WX 685 ; N uni04FE ; G 1171\nU 1279 ; WX 592 ; N uni04FF ; G 1172\nU 1280 ; WX 686 ; N uni0500 ; G 1173\nU 1281 ; WX 589 ; N uni0501 ; G 1174\nU 1282 ; WX 1006 ; N uni0502 ; G 1175\nU 1283 ; WX 897 ; N uni0503 ; G 1176\nU 1284 ; WX 975 ; N uni0504 ; G 1177\nU 1285 ; WX 869 ; N uni0505 ; G 1178\nU 1286 ; WX 679 ; N uni0506 ; G 1179\nU 1287 ; WX 588 ; N uni0507 ; G 1180\nU 1288 ; WX 1072 ; N uni0508 ; G 1181\nU 1289 ; WX 957 ; N uni0509 ; G 1182\nU 1290 ; WX 1113 ; N uni050A ; G 1183\nU 1291 ; WX 967 ; N uni050B ; G 1184\nU 1292 ; WX 775 ; N uni050C ; G 1185\nU 1293 ; WX 660 ; N uni050D ; G 1186\nU 1294 ; WX 773 ; N uni050E ; G 1187\nU 1295 ; WX 711 ; N uni050F ; G 1188\nU 1296 ; WX 614 ; N uni0510 ; G 1189\nU 1297 ; WX 541 ; N uni0511 ; G 1190\nU 1298 ; WX 752 ; N uni0512 ; G 1191\nU 1299 ; WX 639 ; N uni0513 ; G 1192\nU 1300 ; WX 1169 ; N uni0514 ; G 1193\nU 1301 ; WX 994 ; N uni0515 ; G 1194\nU 1302 ; WX 894 ; N uni0516 ; G 1195\nU 1303 ; WX 864 ; N uni0517 ; G 1196\nU 1304 ; WX 1032 ; N uni0518 ; G 1197\nU 1305 ; WX 986 ; N uni0519 ; G 1198\nU 1306 ; WX 787 ; N uni051A ; G 1199\nU 1307 ; WX 635 ; N uni051B ; G 1200\nU 1308 ; WX 989 ; N uni051C ; G 1201\nU 1309 ; WX 818 ; N uni051D ; G 1202\nU 1310 ; WX 710 ; N uni051E ; G 1203\nU 1311 ; WX 604 ; N uni051F ; G 1204\nU 1312 ; WX 1081 ; N uni0520 ; G 1205\nU 1313 ; WX 905 ; N uni0521 ; G 1206\nU 1314 ; WX 1081 ; N uni0522 ; G 1207\nU 1315 ; WX 912 ; N uni0523 ; G 1208\nU 1316 ; WX 793 ; N uni0524 ; G 1209\nU 1317 ; WX 683 ; N uni0525 ; G 1210\nU 1329 ; WX 766 ; N uni0531 ; G 1211\nU 1330 ; WX 732 ; N uni0532 ; G 1212\nU 1331 ; WX 753 ; N uni0533 ; G 1213\nU 1332 ; WX 753 ; N uni0534 ; G 1214\nU 1333 ; WX 732 ; N uni0535 ; G 1215\nU 1334 ; WX 772 ; N uni0536 ; G 1216\nU 1335 ; WX 640 ; N uni0537 ; G 1217\nU 1336 ; WX 732 ; N uni0538 ; G 1218\nU 1337 ; WX 859 ; N uni0539 ; G 1219\nU 1338 ; WX 753 ; N uni053A ; G 1220\nU 1339 ; WX 691 ; N uni053B ; G 1221\nU 1340 ; WX 533 ; N uni053C ; G 1222\nU 1341 ; WX 922 ; N uni053D ; G 1223\nU 1342 ; WX 863 ; N uni053E ; G 1224\nU 1343 ; WX 732 ; N uni053F ; G 1225\nU 1344 ; WX 716 ; N uni0540 ; G 1226\nU 1345 ; WX 766 ; N uni0541 ; G 1227\nU 1346 ; WX 753 ; N uni0542 ; G 1228\nU 1347 ; WX 767 ; N uni0543 ; G 1229\nU 1348 ; WX 792 ; N uni0544 ; G 1230\nU 1349 ; WX 728 ; N uni0545 ; G 1231\nU 1350 ; WX 729 ; N uni0546 ; G 1232\nU 1351 ; WX 757 ; N uni0547 ; G 1233\nU 1352 ; WX 732 ; N uni0548 ; G 1234\nU 1353 ; WX 713 ; N uni0549 ; G 1235\nU 1354 ; WX 800 ; N uni054A ; G 1236\nU 1355 ; WX 768 ; N uni054B ; G 1237\nU 1356 ; WX 792 ; N uni054C ; G 1238\nU 1357 ; WX 732 ; N uni054D ; G 1239\nU 1358 ; WX 753 ; N uni054E ; G 1240\nU 1359 ; WX 705 ; N uni054F ; G 1241\nU 1360 ; WX 694 ; N uni0550 ; G 1242\nU 1361 ; WX 744 ; N uni0551 ; G 1243\nU 1362 ; WX 538 ; N uni0552 ; G 1244\nU 1363 ; WX 811 ; N uni0553 ; G 1245\nU 1364 ; WX 757 ; N uni0554 ; G 1246\nU 1365 ; WX 787 ; N uni0555 ; G 1247\nU 1366 ; WX 790 ; N uni0556 ; G 1248\nU 1369 ; WX 307 ; N uni0559 ; G 1249\nU 1370 ; WX 318 ; N uni055A ; G 1250\nU 1371 ; WX 234 ; N uni055B ; G 1251\nU 1372 ; WX 361 ; N uni055C ; G 1252\nU 1373 ; WX 238 ; N uni055D ; G 1253\nU 1374 ; WX 405 ; N uni055E ; G 1254\nU 1375 ; WX 500 ; N uni055F ; G 1255\nU 1377 ; WX 974 ; N uni0561 ; G 1256\nU 1378 ; WX 634 ; N uni0562 ; G 1257\nU 1379 ; WX 658 ; N uni0563 ; G 1258\nU 1380 ; WX 663 ; N uni0564 ; G 1259\nU 1381 ; WX 634 ; N uni0565 ; G 1260\nU 1382 ; WX 635 ; N uni0566 ; G 1261\nU 1383 ; WX 515 ; N uni0567 ; G 1262\nU 1384 ; WX 634 ; N uni0568 ; G 1263\nU 1385 ; WX 738 ; N uni0569 ; G 1264\nU 1386 ; WX 658 ; N uni056A ; G 1265\nU 1387 ; WX 634 ; N uni056B ; G 1266\nU 1388 ; WX 271 ; N uni056C ; G 1267\nU 1389 ; WX 980 ; N uni056D ; G 1268\nU 1390 ; WX 623 ; N uni056E ; G 1269\nU 1391 ; WX 634 ; N uni056F ; G 1270\nU 1392 ; WX 634 ; N uni0570 ; G 1271\nU 1393 ; WX 608 ; N uni0571 ; G 1272\nU 1394 ; WX 634 ; N uni0572 ; G 1273\nU 1395 ; WX 629 ; N uni0573 ; G 1274\nU 1396 ; WX 634 ; N uni0574 ; G 1275\nU 1397 ; WX 271 ; N uni0575 ; G 1276\nU 1398 ; WX 634 ; N uni0576 ; G 1277\nU 1399 ; WX 499 ; N uni0577 ; G 1278\nU 1400 ; WX 634 ; N uni0578 ; G 1279\nU 1401 ; WX 404 ; N uni0579 ; G 1280\nU 1402 ; WX 974 ; N uni057A ; G 1281\nU 1403 ; WX 560 ; N uni057B ; G 1282\nU 1404 ; WX 648 ; N uni057C ; G 1283\nU 1405 ; WX 634 ; N uni057D ; G 1284\nU 1406 ; WX 634 ; N uni057E ; G 1285\nU 1407 ; WX 974 ; N uni057F ; G 1286\nU 1408 ; WX 634 ; N uni0580 ; G 1287\nU 1409 ; WX 633 ; N uni0581 ; G 1288\nU 1410 ; WX 435 ; N uni0582 ; G 1289\nU 1411 ; WX 974 ; N uni0583 ; G 1290\nU 1412 ; WX 636 ; N uni0584 ; G 1291\nU 1413 ; WX 609 ; N uni0585 ; G 1292\nU 1414 ; WX 805 ; N uni0586 ; G 1293\nU 1415 ; WX 812 ; N uni0587 ; G 1294\nU 1417 ; WX 337 ; N uni0589 ; G 1295\nU 1418 ; WX 361 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 361 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 295 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 295 ; N uni05C3 ; G 1316\nU 1478 ; WX 441 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 668 ; N uni05D0 ; G 1319\nU 1489 ; WX 578 ; N uni05D1 ; G 1320\nU 1490 ; WX 412 ; N uni05D2 ; G 1321\nU 1491 ; WX 546 ; N uni05D3 ; G 1322\nU 1492 ; WX 653 ; N uni05D4 ; G 1323\nU 1493 ; WX 272 ; N uni05D5 ; G 1324\nU 1494 ; WX 346 ; N uni05D6 ; G 1325\nU 1495 ; WX 653 ; N uni05D7 ; G 1326\nU 1496 ; WX 648 ; N uni05D8 ; G 1327\nU 1497 ; WX 224 ; N uni05D9 ; G 1328\nU 1498 ; WX 537 ; N uni05DA ; G 1329\nU 1499 ; WX 529 ; N uni05DB ; G 1330\nU 1500 ; WX 568 ; N uni05DC ; G 1331\nU 1501 ; WX 664 ; N uni05DD ; G 1332\nU 1502 ; WX 679 ; N uni05DE ; G 1333\nU 1503 ; WX 272 ; N uni05DF ; G 1334\nU 1504 ; WX 400 ; N uni05E0 ; G 1335\nU 1505 ; WX 649 ; N uni05E1 ; G 1336\nU 1506 ; WX 626 ; N uni05E2 ; G 1337\nU 1507 ; WX 640 ; N uni05E3 ; G 1338\nU 1508 ; WX 625 ; N uni05E4 ; G 1339\nU 1509 ; WX 540 ; N uni05E5 ; G 1340\nU 1510 ; WX 593 ; N uni05E6 ; G 1341\nU 1511 ; WX 709 ; N uni05E7 ; G 1342\nU 1512 ; WX 564 ; N uni05E8 ; G 1343\nU 1513 ; WX 708 ; N uni05E9 ; G 1344\nU 1514 ; WX 657 ; N uni05EA ; G 1345\nU 1520 ; WX 471 ; N uni05F0 ; G 1346\nU 1521 ; WX 423 ; N uni05F1 ; G 1347\nU 1522 ; WX 331 ; N uni05F2 ; G 1348\nU 1523 ; WX 416 ; N uni05F3 ; G 1349\nU 1524 ; WX 645 ; N uni05F4 ; G 1350\nU 1542 ; WX 637 ; N uni0606 ; G 1351\nU 1543 ; WX 637 ; N uni0607 ; G 1352\nU 1545 ; WX 757 ; N uni0609 ; G 1353\nU 1546 ; WX 977 ; N uni060A ; G 1354\nU 1548 ; WX 323 ; N uni060C ; G 1355\nU 1557 ; WX 0 ; N uni0615 ; G 1356\nU 1563 ; WX 318 ; N uni061B ; G 1357\nU 1567 ; WX 531 ; N uni061F ; G 1358\nU 1569 ; WX 470 ; N uni0621 ; G 1359\nU 1570 ; WX 278 ; N uni0622 ; G 1360\nU 1571 ; WX 278 ; N uni0623 ; G 1361\nU 1572 ; WX 483 ; N uni0624 ; G 1362\nU 1573 ; WX 278 ; N uni0625 ; G 1363\nU 1574 ; WX 783 ; N uni0626 ; G 1364\nU 1575 ; WX 278 ; N uni0627 ; G 1365\nU 1576 ; WX 941 ; N uni0628 ; G 1366\nU 1577 ; WX 524 ; N uni0629 ; G 1367\nU 1578 ; WX 941 ; N uni062A ; G 1368\nU 1579 ; WX 941 ; N uni062B ; G 1369\nU 1580 ; WX 646 ; N uni062C ; G 1370\nU 1581 ; WX 646 ; N uni062D ; G 1371\nU 1582 ; WX 646 ; N uni062E ; G 1372\nU 1583 ; WX 445 ; N uni062F ; G 1373\nU 1584 ; WX 445 ; N uni0630 ; G 1374\nU 1585 ; WX 483 ; N uni0631 ; G 1375\nU 1586 ; WX 483 ; N uni0632 ; G 1376\nU 1587 ; WX 1221 ; N uni0633 ; G 1377\nU 1588 ; WX 1221 ; N uni0634 ; G 1378\nU 1589 ; WX 1209 ; N uni0635 ; G 1379\nU 1590 ; WX 1209 ; N uni0636 ; G 1380\nU 1591 ; WX 925 ; N uni0637 ; G 1381\nU 1592 ; WX 925 ; N uni0638 ; G 1382\nU 1593 ; WX 597 ; N uni0639 ; G 1383\nU 1594 ; WX 597 ; N uni063A ; G 1384\nU 1600 ; WX 293 ; N uni0640 ; G 1385\nU 1601 ; WX 1037 ; N uni0641 ; G 1386\nU 1602 ; WX 776 ; N uni0642 ; G 1387\nU 1603 ; WX 824 ; N uni0643 ; G 1388\nU 1604 ; WX 727 ; N uni0644 ; G 1389\nU 1605 ; WX 619 ; N uni0645 ; G 1390\nU 1606 ; WX 734 ; N uni0646 ; G 1391\nU 1607 ; WX 524 ; N uni0647 ; G 1392\nU 1608 ; WX 483 ; N uni0648 ; G 1393\nU 1609 ; WX 783 ; N uni0649 ; G 1394\nU 1610 ; WX 783 ; N uni064A ; G 1395\nU 1611 ; WX 0 ; N uni064B ; G 1396\nU 1612 ; WX 0 ; N uni064C ; G 1397\nU 1613 ; WX 0 ; N uni064D ; G 1398\nU 1614 ; WX 0 ; N uni064E ; G 1399\nU 1615 ; WX 0 ; N uni064F ; G 1400\nU 1616 ; WX 0 ; N uni0650 ; G 1401\nU 1617 ; WX 0 ; N uni0651 ; G 1402\nU 1618 ; WX 0 ; N uni0652 ; G 1403\nU 1619 ; WX 0 ; N uni0653 ; G 1404\nU 1620 ; WX 0 ; N uni0654 ; G 1405\nU 1621 ; WX 0 ; N uni0655 ; G 1406\nU 1623 ; WX 0 ; N uni0657 ; G 1407\nU 1626 ; WX 500 ; N uni065A ; G 1408\nU 1632 ; WX 537 ; N uni0660 ; G 1409\nU 1633 ; WX 537 ; N uni0661 ; G 1410\nU 1634 ; WX 537 ; N uni0662 ; G 1411\nU 1635 ; WX 537 ; N uni0663 ; G 1412\nU 1636 ; WX 537 ; N uni0664 ; G 1413\nU 1637 ; WX 537 ; N uni0665 ; G 1414\nU 1638 ; WX 537 ; N uni0666 ; G 1415\nU 1639 ; WX 537 ; N uni0667 ; G 1416\nU 1640 ; WX 537 ; N uni0668 ; G 1417\nU 1641 ; WX 537 ; N uni0669 ; G 1418\nU 1642 ; WX 537 ; N uni066A ; G 1419\nU 1643 ; WX 325 ; N uni066B ; G 1420\nU 1644 ; WX 318 ; N uni066C ; G 1421\nU 1645 ; WX 545 ; N uni066D ; G 1422\nU 1646 ; WX 941 ; N uni066E ; G 1423\nU 1647 ; WX 776 ; N uni066F ; G 1424\nU 1648 ; WX 0 ; N uni0670 ; G 1425\nU 1652 ; WX 292 ; N uni0674 ; G 1426\nU 1657 ; WX 941 ; N uni0679 ; G 1427\nU 1658 ; WX 941 ; N uni067A ; G 1428\nU 1659 ; WX 941 ; N uni067B ; G 1429\nU 1660 ; WX 941 ; N uni067C ; G 1430\nU 1661 ; WX 941 ; N uni067D ; G 1431\nU 1662 ; WX 941 ; N uni067E ; G 1432\nU 1663 ; WX 941 ; N uni067F ; G 1433\nU 1664 ; WX 941 ; N uni0680 ; G 1434\nU 1665 ; WX 646 ; N uni0681 ; G 1435\nU 1666 ; WX 646 ; N uni0682 ; G 1436\nU 1667 ; WX 646 ; N uni0683 ; G 1437\nU 1668 ; WX 646 ; N uni0684 ; G 1438\nU 1669 ; WX 646 ; N uni0685 ; G 1439\nU 1670 ; WX 646 ; N uni0686 ; G 1440\nU 1671 ; WX 646 ; N uni0687 ; G 1441\nU 1672 ; WX 445 ; N uni0688 ; G 1442\nU 1673 ; WX 445 ; N uni0689 ; G 1443\nU 1674 ; WX 445 ; N uni068A ; G 1444\nU 1675 ; WX 445 ; N uni068B ; G 1445\nU 1676 ; WX 445 ; N uni068C ; G 1446\nU 1677 ; WX 445 ; N uni068D ; G 1447\nU 1678 ; WX 445 ; N uni068E ; G 1448\nU 1679 ; WX 445 ; N uni068F ; G 1449\nU 1680 ; WX 445 ; N uni0690 ; G 1450\nU 1681 ; WX 483 ; N uni0691 ; G 1451\nU 1682 ; WX 483 ; N uni0692 ; G 1452\nU 1683 ; WX 498 ; N uni0693 ; G 1453\nU 1684 ; WX 530 ; N uni0694 ; G 1454\nU 1685 ; WX 610 ; N uni0695 ; G 1455\nU 1686 ; WX 530 ; N uni0696 ; G 1456\nU 1687 ; WX 483 ; N uni0697 ; G 1457\nU 1688 ; WX 483 ; N uni0698 ; G 1458\nU 1689 ; WX 483 ; N uni0699 ; G 1459\nU 1690 ; WX 1221 ; N uni069A ; G 1460\nU 1691 ; WX 1221 ; N uni069B ; G 1461\nU 1692 ; WX 1221 ; N uni069C ; G 1462\nU 1693 ; WX 1209 ; N uni069D ; G 1463\nU 1694 ; WX 1209 ; N uni069E ; G 1464\nU 1695 ; WX 925 ; N uni069F ; G 1465\nU 1696 ; WX 597 ; N uni06A0 ; G 1466\nU 1697 ; WX 1037 ; N uni06A1 ; G 1467\nU 1698 ; WX 1037 ; N uni06A2 ; G 1468\nU 1699 ; WX 1037 ; N uni06A3 ; G 1469\nU 1700 ; WX 1037 ; N uni06A4 ; G 1470\nU 1701 ; WX 1037 ; N uni06A5 ; G 1471\nU 1702 ; WX 1037 ; N uni06A6 ; G 1472\nU 1703 ; WX 776 ; N uni06A7 ; G 1473\nU 1704 ; WX 776 ; N uni06A8 ; G 1474\nU 1705 ; WX 895 ; N uni06A9 ; G 1475\nU 1706 ; WX 1054 ; N uni06AA ; G 1476\nU 1707 ; WX 895 ; N uni06AB ; G 1477\nU 1708 ; WX 824 ; N uni06AC ; G 1478\nU 1709 ; WX 824 ; N uni06AD ; G 1479\nU 1710 ; WX 824 ; N uni06AE ; G 1480\nU 1711 ; WX 895 ; N uni06AF ; G 1481\nU 1712 ; WX 895 ; N uni06B0 ; G 1482\nU 1713 ; WX 895 ; N uni06B1 ; G 1483\nU 1714 ; WX 895 ; N uni06B2 ; G 1484\nU 1715 ; WX 895 ; N uni06B3 ; G 1485\nU 1716 ; WX 895 ; N uni06B4 ; G 1486\nU 1717 ; WX 727 ; N uni06B5 ; G 1487\nU 1718 ; WX 727 ; N uni06B6 ; G 1488\nU 1719 ; WX 727 ; N uni06B7 ; G 1489\nU 1720 ; WX 727 ; N uni06B8 ; G 1490\nU 1721 ; WX 734 ; N uni06B9 ; G 1491\nU 1722 ; WX 734 ; N uni06BA ; G 1492\nU 1723 ; WX 734 ; N uni06BB ; G 1493\nU 1724 ; WX 734 ; N uni06BC ; G 1494\nU 1725 ; WX 734 ; N uni06BD ; G 1495\nU 1726 ; WX 698 ; N uni06BE ; G 1496\nU 1727 ; WX 646 ; N uni06BF ; G 1497\nU 1734 ; WX 483 ; N uni06C6 ; G 1498\nU 1735 ; WX 483 ; N uni06C7 ; G 1499\nU 1736 ; WX 483 ; N uni06C8 ; G 1500\nU 1739 ; WX 483 ; N uni06CB ; G 1501\nU 1740 ; WX 783 ; N uni06CC ; G 1502\nU 1742 ; WX 783 ; N uni06CE ; G 1503\nU 1744 ; WX 783 ; N uni06D0 ; G 1504\nU 1749 ; WX 524 ; N uni06D5 ; G 1505\nU 1776 ; WX 537 ; N uni06F0 ; G 1506\nU 1777 ; WX 537 ; N uni06F1 ; G 1507\nU 1778 ; WX 537 ; N uni06F2 ; G 1508\nU 1779 ; WX 537 ; N uni06F3 ; G 1509\nU 1780 ; WX 537 ; N uni06F4 ; G 1510\nU 1781 ; WX 537 ; N uni06F5 ; G 1511\nU 1782 ; WX 537 ; N uni06F6 ; G 1512\nU 1783 ; WX 537 ; N uni06F7 ; G 1513\nU 1784 ; WX 537 ; N uni06F8 ; G 1514\nU 1785 ; WX 537 ; N uni06F9 ; G 1515\nU 1984 ; WX 636 ; N uni07C0 ; G 1516\nU 1985 ; WX 636 ; N uni07C1 ; G 1517\nU 1986 ; WX 636 ; N uni07C2 ; G 1518\nU 1987 ; WX 636 ; N uni07C3 ; G 1519\nU 1988 ; WX 636 ; N uni07C4 ; G 1520\nU 1989 ; WX 636 ; N uni07C5 ; G 1521\nU 1990 ; WX 636 ; N uni07C6 ; G 1522\nU 1991 ; WX 636 ; N uni07C7 ; G 1523\nU 1992 ; WX 636 ; N uni07C8 ; G 1524\nU 1993 ; WX 636 ; N uni07C9 ; G 1525\nU 1994 ; WX 278 ; N uni07CA ; G 1526\nU 1995 ; WX 571 ; N uni07CB ; G 1527\nU 1996 ; WX 424 ; N uni07CC ; G 1528\nU 1997 ; WX 592 ; N uni07CD ; G 1529\nU 1998 ; WX 654 ; N uni07CE ; G 1530\nU 1999 ; WX 654 ; N uni07CF ; G 1531\nU 2000 ; WX 594 ; N uni07D0 ; G 1532\nU 2001 ; WX 654 ; N uni07D1 ; G 1533\nU 2002 ; WX 829 ; N uni07D2 ; G 1534\nU 2003 ; WX 438 ; N uni07D3 ; G 1535\nU 2004 ; WX 438 ; N uni07D4 ; G 1536\nU 2005 ; WX 559 ; N uni07D5 ; G 1537\nU 2006 ; WX 612 ; N uni07D6 ; G 1538\nU 2007 ; WX 350 ; N uni07D7 ; G 1539\nU 2008 ; WX 959 ; N uni07D8 ; G 1540\nU 2009 ; WX 473 ; N uni07D9 ; G 1541\nU 2010 ; WX 783 ; N uni07DA ; G 1542\nU 2011 ; WX 654 ; N uni07DB ; G 1543\nU 2012 ; WX 625 ; N uni07DC ; G 1544\nU 2013 ; WX 734 ; N uni07DD ; G 1545\nU 2014 ; WX 530 ; N uni07DE ; G 1546\nU 2015 ; WX 724 ; N uni07DF ; G 1547\nU 2016 ; WX 473 ; N uni07E0 ; G 1548\nU 2017 ; WX 625 ; N uni07E1 ; G 1549\nU 2018 ; WX 594 ; N uni07E2 ; G 1550\nU 2019 ; WX 530 ; N uni07E3 ; G 1551\nU 2020 ; WX 530 ; N uni07E4 ; G 1552\nU 2021 ; WX 522 ; N uni07E5 ; G 1553\nU 2022 ; WX 594 ; N uni07E6 ; G 1554\nU 2023 ; WX 594 ; N uni07E7 ; G 1555\nU 2027 ; WX 0 ; N uni07EB ; G 1556\nU 2028 ; WX 0 ; N uni07EC ; G 1557\nU 2029 ; WX 0 ; N uni07ED ; G 1558\nU 2030 ; WX 0 ; N uni07EE ; G 1559\nU 2031 ; WX 0 ; N uni07EF ; G 1560\nU 2032 ; WX 0 ; N uni07F0 ; G 1561\nU 2033 ; WX 0 ; N uni07F1 ; G 1562\nU 2034 ; WX 0 ; N uni07F2 ; G 1563\nU 2035 ; WX 0 ; N uni07F3 ; G 1564\nU 2036 ; WX 313 ; N uni07F4 ; G 1565\nU 2037 ; WX 313 ; N uni07F5 ; G 1566\nU 2040 ; WX 560 ; N uni07F8 ; G 1567\nU 2041 ; WX 560 ; N uni07F9 ; G 1568\nU 2042 ; WX 361 ; N uni07FA ; G 1569\nU 3647 ; WX 636 ; N uni0E3F ; G 1570\nU 3713 ; WX 670 ; N uni0E81 ; G 1571\nU 3714 ; WX 684 ; N uni0E82 ; G 1572\nU 3716 ; WX 688 ; N uni0E84 ; G 1573\nU 3719 ; WX 482 ; N uni0E87 ; G 1574\nU 3720 ; WX 628 ; N uni0E88 ; G 1575\nU 3722 ; WX 684 ; N uni0E8A ; G 1576\nU 3725 ; WX 688 ; N uni0E8D ; G 1577\nU 3732 ; WX 669 ; N uni0E94 ; G 1578\nU 3733 ; WX 642 ; N uni0E95 ; G 1579\nU 3734 ; WX 645 ; N uni0E96 ; G 1580\nU 3735 ; WX 655 ; N uni0E97 ; G 1581\nU 3737 ; WX 659 ; N uni0E99 ; G 1582\nU 3738 ; WX 625 ; N uni0E9A ; G 1583\nU 3739 ; WX 625 ; N uni0E9B ; G 1584\nU 3740 ; WX 745 ; N uni0E9C ; G 1585\nU 3741 ; WX 767 ; N uni0E9D ; G 1586\nU 3742 ; WX 687 ; N uni0E9E ; G 1587\nU 3743 ; WX 687 ; N uni0E9F ; G 1588\nU 3745 ; WX 702 ; N uni0EA1 ; G 1589\nU 3746 ; WX 688 ; N uni0EA2 ; G 1590\nU 3747 ; WX 684 ; N uni0EA3 ; G 1591\nU 3749 ; WX 649 ; N uni0EA5 ; G 1592\nU 3751 ; WX 632 ; N uni0EA7 ; G 1593\nU 3754 ; WX 703 ; N uni0EAA ; G 1594\nU 3755 ; WX 819 ; N uni0EAB ; G 1595\nU 3757 ; WX 633 ; N uni0EAD ; G 1596\nU 3758 ; WX 684 ; N uni0EAE ; G 1597\nU 3759 ; WX 788 ; N uni0EAF ; G 1598\nU 3760 ; WX 632 ; N uni0EB0 ; G 1599\nU 3761 ; WX 0 ; N uni0EB1 ; G 1600\nU 3762 ; WX 539 ; N uni0EB2 ; G 1601\nU 3763 ; WX 539 ; N uni0EB3 ; G 1602\nU 3764 ; WX 0 ; N uni0EB4 ; G 1603\nU 3765 ; WX 0 ; N uni0EB5 ; G 1604\nU 3766 ; WX 0 ; N uni0EB6 ; G 1605\nU 3767 ; WX 0 ; N uni0EB7 ; G 1606\nU 3768 ; WX 0 ; N uni0EB8 ; G 1607\nU 3769 ; WX 0 ; N uni0EB9 ; G 1608\nU 3771 ; WX 0 ; N uni0EBB ; G 1609\nU 3772 ; WX 0 ; N uni0EBC ; G 1610\nU 3773 ; WX 663 ; N uni0EBD ; G 1611\nU 3776 ; WX 375 ; N uni0EC0 ; G 1612\nU 3777 ; WX 657 ; N uni0EC1 ; G 1613\nU 3778 ; WX 460 ; N uni0EC2 ; G 1614\nU 3779 ; WX 547 ; N uni0EC3 ; G 1615\nU 3780 ; WX 491 ; N uni0EC4 ; G 1616\nU 3782 ; WX 674 ; N uni0EC6 ; G 1617\nU 3784 ; WX 0 ; N uni0EC8 ; G 1618\nU 3785 ; WX 0 ; N uni0EC9 ; G 1619\nU 3786 ; WX 0 ; N uni0ECA ; G 1620\nU 3787 ; WX 0 ; N uni0ECB ; G 1621\nU 3788 ; WX 0 ; N uni0ECC ; G 1622\nU 3789 ; WX 0 ; N uni0ECD ; G 1623\nU 3792 ; WX 636 ; N uni0ED0 ; G 1624\nU 3793 ; WX 641 ; N uni0ED1 ; G 1625\nU 3794 ; WX 641 ; N uni0ED2 ; G 1626\nU 3795 ; WX 670 ; N uni0ED3 ; G 1627\nU 3796 ; WX 625 ; N uni0ED4 ; G 1628\nU 3797 ; WX 625 ; N uni0ED5 ; G 1629\nU 3798 ; WX 703 ; N uni0ED6 ; G 1630\nU 3799 ; WX 670 ; N uni0ED7 ; G 1631\nU 3800 ; WX 674 ; N uni0ED8 ; G 1632\nU 3801 ; WX 677 ; N uni0ED9 ; G 1633\nU 3804 ; WX 1028 ; N uni0EDC ; G 1634\nU 3805 ; WX 1028 ; N uni0EDD ; G 1635\nU 4256 ; WX 874 ; N uni10A0 ; G 1636\nU 4257 ; WX 733 ; N uni10A1 ; G 1637\nU 4258 ; WX 679 ; N uni10A2 ; G 1638\nU 4259 ; WX 834 ; N uni10A3 ; G 1639\nU 4260 ; WX 615 ; N uni10A4 ; G 1640\nU 4261 ; WX 768 ; N uni10A5 ; G 1641\nU 4262 ; WX 753 ; N uni10A6 ; G 1642\nU 4263 ; WX 914 ; N uni10A7 ; G 1643\nU 4264 ; WX 453 ; N uni10A8 ; G 1644\nU 4265 ; WX 620 ; N uni10A9 ; G 1645\nU 4266 ; WX 843 ; N uni10AA ; G 1646\nU 4267 ; WX 882 ; N uni10AB ; G 1647\nU 4268 ; WX 625 ; N uni10AC ; G 1648\nU 4269 ; WX 854 ; N uni10AD ; G 1649\nU 4270 ; WX 781 ; N uni10AE ; G 1650\nU 4271 ; WX 629 ; N uni10AF ; G 1651\nU 4272 ; WX 912 ; N uni10B0 ; G 1652\nU 4273 ; WX 621 ; N uni10B1 ; G 1653\nU 4274 ; WX 620 ; N uni10B2 ; G 1654\nU 4275 ; WX 854 ; N uni10B3 ; G 1655\nU 4276 ; WX 866 ; N uni10B4 ; G 1656\nU 4277 ; WX 724 ; N uni10B5 ; G 1657\nU 4278 ; WX 630 ; N uni10B6 ; G 1658\nU 4279 ; WX 621 ; N uni10B7 ; G 1659\nU 4280 ; WX 625 ; N uni10B8 ; G 1660\nU 4281 ; WX 620 ; N uni10B9 ; G 1661\nU 4282 ; WX 818 ; N uni10BA ; G 1662\nU 4283 ; WX 874 ; N uni10BB ; G 1663\nU 4284 ; WX 615 ; N uni10BC ; G 1664\nU 4285 ; WX 623 ; N uni10BD ; G 1665\nU 4286 ; WX 625 ; N uni10BE ; G 1666\nU 4287 ; WX 725 ; N uni10BF ; G 1667\nU 4288 ; WX 844 ; N uni10C0 ; G 1668\nU 4289 ; WX 596 ; N uni10C1 ; G 1669\nU 4290 ; WX 688 ; N uni10C2 ; G 1670\nU 4291 ; WX 596 ; N uni10C3 ; G 1671\nU 4292 ; WX 594 ; N uni10C4 ; G 1672\nU 4293 ; WX 738 ; N uni10C5 ; G 1673\nU 4304 ; WX 508 ; N uni10D0 ; G 1674\nU 4305 ; WX 518 ; N uni10D1 ; G 1675\nU 4306 ; WX 581 ; N uni10D2 ; G 1676\nU 4307 ; WX 818 ; N uni10D3 ; G 1677\nU 4308 ; WX 508 ; N uni10D4 ; G 1678\nU 4309 ; WX 513 ; N uni10D5 ; G 1679\nU 4310 ; WX 500 ; N uni10D6 ; G 1680\nU 4311 ; WX 801 ; N uni10D7 ; G 1681\nU 4312 ; WX 518 ; N uni10D8 ; G 1682\nU 4313 ; WX 510 ; N uni10D9 ; G 1683\nU 4314 ; WX 1064 ; N uni10DA ; G 1684\nU 4315 ; WX 522 ; N uni10DB ; G 1685\nU 4316 ; WX 522 ; N uni10DC ; G 1686\nU 4317 ; WX 786 ; N uni10DD ; G 1687\nU 4318 ; WX 508 ; N uni10DE ; G 1688\nU 4319 ; WX 518 ; N uni10DF ; G 1689\nU 4320 ; WX 796 ; N uni10E0 ; G 1690\nU 4321 ; WX 522 ; N uni10E1 ; G 1691\nU 4322 ; WX 654 ; N uni10E2 ; G 1692\nU 4323 ; WX 522 ; N uni10E3 ; G 1693\nU 4324 ; WX 825 ; N uni10E4 ; G 1694\nU 4325 ; WX 513 ; N uni10E5 ; G 1695\nU 4326 ; WX 786 ; N uni10E6 ; G 1696\nU 4327 ; WX 518 ; N uni10E7 ; G 1697\nU 4328 ; WX 518 ; N uni10E8 ; G 1698\nU 4329 ; WX 522 ; N uni10E9 ; G 1699\nU 4330 ; WX 571 ; N uni10EA ; G 1700\nU 4331 ; WX 522 ; N uni10EB ; G 1701\nU 4332 ; WX 518 ; N uni10EC ; G 1702\nU 4333 ; WX 520 ; N uni10ED ; G 1703\nU 4334 ; WX 522 ; N uni10EE ; G 1704\nU 4335 ; WX 454 ; N uni10EF ; G 1705\nU 4336 ; WX 508 ; N uni10F0 ; G 1706\nU 4337 ; WX 518 ; N uni10F1 ; G 1707\nU 4338 ; WX 508 ; N uni10F2 ; G 1708\nU 4339 ; WX 508 ; N uni10F3 ; G 1709\nU 4340 ; WX 518 ; N uni10F4 ; G 1710\nU 4341 ; WX 554 ; N uni10F5 ; G 1711\nU 4342 ; WX 828 ; N uni10F6 ; G 1712\nU 4343 ; WX 552 ; N uni10F7 ; G 1713\nU 4344 ; WX 508 ; N uni10F8 ; G 1714\nU 4345 ; WX 571 ; N uni10F9 ; G 1715\nU 4346 ; WX 508 ; N uni10FA ; G 1716\nU 4347 ; WX 448 ; N uni10FB ; G 1717\nU 4348 ; WX 324 ; N uni10FC ; G 1718\nU 5121 ; WX 684 ; N uni1401 ; G 1719\nU 5122 ; WX 684 ; N uni1402 ; G 1720\nU 5123 ; WX 684 ; N uni1403 ; G 1721\nU 5124 ; WX 684 ; N uni1404 ; G 1722\nU 5125 ; WX 769 ; N uni1405 ; G 1723\nU 5126 ; WX 769 ; N uni1406 ; G 1724\nU 5127 ; WX 769 ; N uni1407 ; G 1725\nU 5129 ; WX 769 ; N uni1409 ; G 1726\nU 5130 ; WX 769 ; N uni140A ; G 1727\nU 5131 ; WX 769 ; N uni140B ; G 1728\nU 5132 ; WX 835 ; N uni140C ; G 1729\nU 5133 ; WX 834 ; N uni140D ; G 1730\nU 5134 ; WX 835 ; N uni140E ; G 1731\nU 5135 ; WX 834 ; N uni140F ; G 1732\nU 5136 ; WX 835 ; N uni1410 ; G 1733\nU 5137 ; WX 834 ; N uni1411 ; G 1734\nU 5138 ; WX 967 ; N uni1412 ; G 1735\nU 5139 ; WX 1007 ; N uni1413 ; G 1736\nU 5140 ; WX 967 ; N uni1414 ; G 1737\nU 5141 ; WX 1007 ; N uni1415 ; G 1738\nU 5142 ; WX 769 ; N uni1416 ; G 1739\nU 5143 ; WX 967 ; N uni1417 ; G 1740\nU 5144 ; WX 1007 ; N uni1418 ; G 1741\nU 5145 ; WX 967 ; N uni1419 ; G 1742\nU 5146 ; WX 1007 ; N uni141A ; G 1743\nU 5147 ; WX 769 ; N uni141B ; G 1744\nU 5149 ; WX 256 ; N uni141D ; G 1745\nU 5150 ; WX 543 ; N uni141E ; G 1746\nU 5151 ; WX 423 ; N uni141F ; G 1747\nU 5152 ; WX 423 ; N uni1420 ; G 1748\nU 5153 ; WX 389 ; N uni1421 ; G 1749\nU 5154 ; WX 389 ; N uni1422 ; G 1750\nU 5155 ; WX 393 ; N uni1423 ; G 1751\nU 5156 ; WX 389 ; N uni1424 ; G 1752\nU 5157 ; WX 466 ; N uni1425 ; G 1753\nU 5158 ; WX 385 ; N uni1426 ; G 1754\nU 5159 ; WX 256 ; N uni1427 ; G 1755\nU 5160 ; WX 389 ; N uni1428 ; G 1756\nU 5161 ; WX 389 ; N uni1429 ; G 1757\nU 5162 ; WX 389 ; N uni142A ; G 1758\nU 5163 ; WX 1090 ; N uni142B ; G 1759\nU 5164 ; WX 909 ; N uni142C ; G 1760\nU 5165 ; WX 953 ; N uni142D ; G 1761\nU 5166 ; WX 1117 ; N uni142E ; G 1762\nU 5167 ; WX 684 ; N uni142F ; G 1763\nU 5168 ; WX 684 ; N uni1430 ; G 1764\nU 5169 ; WX 684 ; N uni1431 ; G 1765\nU 5170 ; WX 684 ; N uni1432 ; G 1766\nU 5171 ; WX 729 ; N uni1433 ; G 1767\nU 5172 ; WX 729 ; N uni1434 ; G 1768\nU 5173 ; WX 729 ; N uni1435 ; G 1769\nU 5175 ; WX 729 ; N uni1437 ; G 1770\nU 5176 ; WX 729 ; N uni1438 ; G 1771\nU 5177 ; WX 729 ; N uni1439 ; G 1772\nU 5178 ; WX 835 ; N uni143A ; G 1773\nU 5179 ; WX 684 ; N uni143B ; G 1774\nU 5180 ; WX 835 ; N uni143C ; G 1775\nU 5181 ; WX 834 ; N uni143D ; G 1776\nU 5182 ; WX 835 ; N uni143E ; G 1777\nU 5183 ; WX 834 ; N uni143F ; G 1778\nU 5184 ; WX 967 ; N uni1440 ; G 1779\nU 5185 ; WX 1007 ; N uni1441 ; G 1780\nU 5186 ; WX 967 ; N uni1442 ; G 1781\nU 5187 ; WX 1007 ; N uni1443 ; G 1782\nU 5188 ; WX 967 ; N uni1444 ; G 1783\nU 5189 ; WX 1007 ; N uni1445 ; G 1784\nU 5190 ; WX 967 ; N uni1446 ; G 1785\nU 5191 ; WX 1007 ; N uni1447 ; G 1786\nU 5192 ; WX 729 ; N uni1448 ; G 1787\nU 5193 ; WX 508 ; N uni1449 ; G 1788\nU 5194 ; WX 192 ; N uni144A ; G 1789\nU 5196 ; WX 732 ; N uni144C ; G 1790\nU 5197 ; WX 732 ; N uni144D ; G 1791\nU 5198 ; WX 732 ; N uni144E ; G 1792\nU 5199 ; WX 732 ; N uni144F ; G 1793\nU 5200 ; WX 730 ; N uni1450 ; G 1794\nU 5201 ; WX 730 ; N uni1451 ; G 1795\nU 5202 ; WX 730 ; N uni1452 ; G 1796\nU 5204 ; WX 730 ; N uni1454 ; G 1797\nU 5205 ; WX 730 ; N uni1455 ; G 1798\nU 5206 ; WX 730 ; N uni1456 ; G 1799\nU 5207 ; WX 921 ; N uni1457 ; G 1800\nU 5208 ; WX 889 ; N uni1458 ; G 1801\nU 5209 ; WX 921 ; N uni1459 ; G 1802\nU 5210 ; WX 889 ; N uni145A ; G 1803\nU 5211 ; WX 921 ; N uni145B ; G 1804\nU 5212 ; WX 889 ; N uni145C ; G 1805\nU 5213 ; WX 928 ; N uni145D ; G 1806\nU 5214 ; WX 900 ; N uni145E ; G 1807\nU 5215 ; WX 928 ; N uni145F ; G 1808\nU 5216 ; WX 900 ; N uni1460 ; G 1809\nU 5217 ; WX 947 ; N uni1461 ; G 1810\nU 5218 ; WX 900 ; N uni1462 ; G 1811\nU 5219 ; WX 947 ; N uni1463 ; G 1812\nU 5220 ; WX 900 ; N uni1464 ; G 1813\nU 5221 ; WX 947 ; N uni1465 ; G 1814\nU 5222 ; WX 434 ; N uni1466 ; G 1815\nU 5223 ; WX 877 ; N uni1467 ; G 1816\nU 5224 ; WX 877 ; N uni1468 ; G 1817\nU 5225 ; WX 866 ; N uni1469 ; G 1818\nU 5226 ; WX 890 ; N uni146A ; G 1819\nU 5227 ; WX 628 ; N uni146B ; G 1820\nU 5228 ; WX 628 ; N uni146C ; G 1821\nU 5229 ; WX 628 ; N uni146D ; G 1822\nU 5230 ; WX 628 ; N uni146E ; G 1823\nU 5231 ; WX 628 ; N uni146F ; G 1824\nU 5232 ; WX 628 ; N uni1470 ; G 1825\nU 5233 ; WX 628 ; N uni1471 ; G 1826\nU 5234 ; WX 628 ; N uni1472 ; G 1827\nU 5235 ; WX 628 ; N uni1473 ; G 1828\nU 5236 ; WX 860 ; N uni1474 ; G 1829\nU 5237 ; WX 771 ; N uni1475 ; G 1830\nU 5238 ; WX 815 ; N uni1476 ; G 1831\nU 5239 ; WX 816 ; N uni1477 ; G 1832\nU 5240 ; WX 815 ; N uni1478 ; G 1833\nU 5241 ; WX 816 ; N uni1479 ; G 1834\nU 5242 ; WX 860 ; N uni147A ; G 1835\nU 5243 ; WX 771 ; N uni147B ; G 1836\nU 5244 ; WX 860 ; N uni147C ; G 1837\nU 5245 ; WX 771 ; N uni147D ; G 1838\nU 5246 ; WX 815 ; N uni147E ; G 1839\nU 5247 ; WX 816 ; N uni147F ; G 1840\nU 5248 ; WX 815 ; N uni1480 ; G 1841\nU 5249 ; WX 816 ; N uni1481 ; G 1842\nU 5250 ; WX 815 ; N uni1482 ; G 1843\nU 5251 ; WX 407 ; N uni1483 ; G 1844\nU 5252 ; WX 407 ; N uni1484 ; G 1845\nU 5253 ; WX 750 ; N uni1485 ; G 1846\nU 5254 ; WX 775 ; N uni1486 ; G 1847\nU 5255 ; WX 750 ; N uni1487 ; G 1848\nU 5256 ; WX 775 ; N uni1488 ; G 1849\nU 5257 ; WX 628 ; N uni1489 ; G 1850\nU 5258 ; WX 628 ; N uni148A ; G 1851\nU 5259 ; WX 628 ; N uni148B ; G 1852\nU 5260 ; WX 628 ; N uni148C ; G 1853\nU 5261 ; WX 628 ; N uni148D ; G 1854\nU 5262 ; WX 628 ; N uni148E ; G 1855\nU 5263 ; WX 628 ; N uni148F ; G 1856\nU 5264 ; WX 628 ; N uni1490 ; G 1857\nU 5265 ; WX 628 ; N uni1491 ; G 1858\nU 5266 ; WX 860 ; N uni1492 ; G 1859\nU 5267 ; WX 771 ; N uni1493 ; G 1860\nU 5268 ; WX 815 ; N uni1494 ; G 1861\nU 5269 ; WX 816 ; N uni1495 ; G 1862\nU 5270 ; WX 815 ; N uni1496 ; G 1863\nU 5271 ; WX 816 ; N uni1497 ; G 1864\nU 5272 ; WX 860 ; N uni1498 ; G 1865\nU 5273 ; WX 771 ; N uni1499 ; G 1866\nU 5274 ; WX 860 ; N uni149A ; G 1867\nU 5275 ; WX 771 ; N uni149B ; G 1868\nU 5276 ; WX 815 ; N uni149C ; G 1869\nU 5277 ; WX 816 ; N uni149D ; G 1870\nU 5278 ; WX 815 ; N uni149E ; G 1871\nU 5279 ; WX 816 ; N uni149F ; G 1872\nU 5280 ; WX 815 ; N uni14A0 ; G 1873\nU 5281 ; WX 435 ; N uni14A1 ; G 1874\nU 5282 ; WX 435 ; N uni14A2 ; G 1875\nU 5283 ; WX 610 ; N uni14A3 ; G 1876\nU 5284 ; WX 557 ; N uni14A4 ; G 1877\nU 5285 ; WX 557 ; N uni14A5 ; G 1878\nU 5286 ; WX 557 ; N uni14A6 ; G 1879\nU 5287 ; WX 610 ; N uni14A7 ; G 1880\nU 5288 ; WX 610 ; N uni14A8 ; G 1881\nU 5289 ; WX 610 ; N uni14A9 ; G 1882\nU 5290 ; WX 557 ; N uni14AA ; G 1883\nU 5291 ; WX 557 ; N uni14AB ; G 1884\nU 5292 ; WX 749 ; N uni14AC ; G 1885\nU 5293 ; WX 769 ; N uni14AD ; G 1886\nU 5294 ; WX 746 ; N uni14AE ; G 1887\nU 5295 ; WX 764 ; N uni14AF ; G 1888\nU 5296 ; WX 746 ; N uni14B0 ; G 1889\nU 5297 ; WX 764 ; N uni14B1 ; G 1890\nU 5298 ; WX 749 ; N uni14B2 ; G 1891\nU 5299 ; WX 769 ; N uni14B3 ; G 1892\nU 5300 ; WX 749 ; N uni14B4 ; G 1893\nU 5301 ; WX 769 ; N uni14B5 ; G 1894\nU 5302 ; WX 746 ; N uni14B6 ; G 1895\nU 5303 ; WX 764 ; N uni14B7 ; G 1896\nU 5304 ; WX 746 ; N uni14B8 ; G 1897\nU 5305 ; WX 764 ; N uni14B9 ; G 1898\nU 5306 ; WX 746 ; N uni14BA ; G 1899\nU 5307 ; WX 386 ; N uni14BB ; G 1900\nU 5308 ; WX 508 ; N uni14BC ; G 1901\nU 5309 ; WX 386 ; N uni14BD ; G 1902\nU 5312 ; WX 852 ; N uni14C0 ; G 1903\nU 5313 ; WX 852 ; N uni14C1 ; G 1904\nU 5314 ; WX 852 ; N uni14C2 ; G 1905\nU 5315 ; WX 852 ; N uni14C3 ; G 1906\nU 5316 ; WX 852 ; N uni14C4 ; G 1907\nU 5317 ; WX 852 ; N uni14C5 ; G 1908\nU 5318 ; WX 852 ; N uni14C6 ; G 1909\nU 5319 ; WX 852 ; N uni14C7 ; G 1910\nU 5320 ; WX 852 ; N uni14C8 ; G 1911\nU 5321 ; WX 1069 ; N uni14C9 ; G 1912\nU 5322 ; WX 1035 ; N uni14CA ; G 1913\nU 5323 ; WX 1059 ; N uni14CB ; G 1914\nU 5324 ; WX 852 ; N uni14CC ; G 1915\nU 5325 ; WX 1059 ; N uni14CD ; G 1916\nU 5326 ; WX 852 ; N uni14CE ; G 1917\nU 5327 ; WX 852 ; N uni14CF ; G 1918\nU 5328 ; WX 600 ; N uni14D0 ; G 1919\nU 5329 ; WX 453 ; N uni14D1 ; G 1920\nU 5330 ; WX 600 ; N uni14D2 ; G 1921\nU 5331 ; WX 852 ; N uni14D3 ; G 1922\nU 5332 ; WX 852 ; N uni14D4 ; G 1923\nU 5333 ; WX 852 ; N uni14D5 ; G 1924\nU 5334 ; WX 852 ; N uni14D6 ; G 1925\nU 5335 ; WX 852 ; N uni14D7 ; G 1926\nU 5336 ; WX 852 ; N uni14D8 ; G 1927\nU 5337 ; WX 852 ; N uni14D9 ; G 1928\nU 5338 ; WX 852 ; N uni14DA ; G 1929\nU 5339 ; WX 852 ; N uni14DB ; G 1930\nU 5340 ; WX 1069 ; N uni14DC ; G 1931\nU 5341 ; WX 1035 ; N uni14DD ; G 1932\nU 5342 ; WX 1059 ; N uni14DE ; G 1933\nU 5343 ; WX 1030 ; N uni14DF ; G 1934\nU 5344 ; WX 1059 ; N uni14E0 ; G 1935\nU 5345 ; WX 1030 ; N uni14E1 ; G 1936\nU 5346 ; WX 1069 ; N uni14E2 ; G 1937\nU 5347 ; WX 1035 ; N uni14E3 ; G 1938\nU 5348 ; WX 1069 ; N uni14E4 ; G 1939\nU 5349 ; WX 1035 ; N uni14E5 ; G 1940\nU 5350 ; WX 1083 ; N uni14E6 ; G 1941\nU 5351 ; WX 1030 ; N uni14E7 ; G 1942\nU 5352 ; WX 1083 ; N uni14E8 ; G 1943\nU 5353 ; WX 1030 ; N uni14E9 ; G 1944\nU 5354 ; WX 600 ; N uni14EA ; G 1945\nU 5356 ; WX 729 ; N uni14EC ; G 1946\nU 5357 ; WX 603 ; N uni14ED ; G 1947\nU 5358 ; WX 603 ; N uni14EE ; G 1948\nU 5359 ; WX 603 ; N uni14EF ; G 1949\nU 5360 ; WX 603 ; N uni14F0 ; G 1950\nU 5361 ; WX 603 ; N uni14F1 ; G 1951\nU 5362 ; WX 603 ; N uni14F2 ; G 1952\nU 5363 ; WX 603 ; N uni14F3 ; G 1953\nU 5364 ; WX 603 ; N uni14F4 ; G 1954\nU 5365 ; WX 603 ; N uni14F5 ; G 1955\nU 5366 ; WX 834 ; N uni14F6 ; G 1956\nU 5367 ; WX 754 ; N uni14F7 ; G 1957\nU 5368 ; WX 792 ; N uni14F8 ; G 1958\nU 5369 ; WX 771 ; N uni14F9 ; G 1959\nU 5370 ; WX 792 ; N uni14FA ; G 1960\nU 5371 ; WX 771 ; N uni14FB ; G 1961\nU 5372 ; WX 834 ; N uni14FC ; G 1962\nU 5373 ; WX 754 ; N uni14FD ; G 1963\nU 5374 ; WX 834 ; N uni14FE ; G 1964\nU 5375 ; WX 754 ; N uni14FF ; G 1965\nU 5376 ; WX 792 ; N uni1500 ; G 1966\nU 5377 ; WX 771 ; N uni1501 ; G 1967\nU 5378 ; WX 792 ; N uni1502 ; G 1968\nU 5379 ; WX 771 ; N uni1503 ; G 1969\nU 5380 ; WX 792 ; N uni1504 ; G 1970\nU 5381 ; WX 418 ; N uni1505 ; G 1971\nU 5382 ; WX 420 ; N uni1506 ; G 1972\nU 5383 ; WX 418 ; N uni1507 ; G 1973\nU 5392 ; WX 712 ; N uni1510 ; G 1974\nU 5393 ; WX 712 ; N uni1511 ; G 1975\nU 5394 ; WX 712 ; N uni1512 ; G 1976\nU 5395 ; WX 892 ; N uni1513 ; G 1977\nU 5396 ; WX 892 ; N uni1514 ; G 1978\nU 5397 ; WX 892 ; N uni1515 ; G 1979\nU 5398 ; WX 892 ; N uni1516 ; G 1980\nU 5399 ; WX 910 ; N uni1517 ; G 1981\nU 5400 ; WX 872 ; N uni1518 ; G 1982\nU 5401 ; WX 910 ; N uni1519 ; G 1983\nU 5402 ; WX 872 ; N uni151A ; G 1984\nU 5403 ; WX 910 ; N uni151B ; G 1985\nU 5404 ; WX 872 ; N uni151C ; G 1986\nU 5405 ; WX 1140 ; N uni151D ; G 1987\nU 5406 ; WX 1100 ; N uni151E ; G 1988\nU 5407 ; WX 1140 ; N uni151F ; G 1989\nU 5408 ; WX 1100 ; N uni1520 ; G 1990\nU 5409 ; WX 1140 ; N uni1521 ; G 1991\nU 5410 ; WX 1100 ; N uni1522 ; G 1992\nU 5411 ; WX 1140 ; N uni1523 ; G 1993\nU 5412 ; WX 1100 ; N uni1524 ; G 1994\nU 5413 ; WX 641 ; N uni1525 ; G 1995\nU 5414 ; WX 627 ; N uni1526 ; G 1996\nU 5415 ; WX 627 ; N uni1527 ; G 1997\nU 5416 ; WX 627 ; N uni1528 ; G 1998\nU 5417 ; WX 627 ; N uni1529 ; G 1999\nU 5418 ; WX 627 ; N uni152A ; G 2000\nU 5419 ; WX 627 ; N uni152B ; G 2001\nU 5420 ; WX 627 ; N uni152C ; G 2002\nU 5421 ; WX 627 ; N uni152D ; G 2003\nU 5422 ; WX 627 ; N uni152E ; G 2004\nU 5423 ; WX 844 ; N uni152F ; G 2005\nU 5424 ; WX 781 ; N uni1530 ; G 2006\nU 5425 ; WX 816 ; N uni1531 ; G 2007\nU 5426 ; WX 818 ; N uni1532 ; G 2008\nU 5427 ; WX 816 ; N uni1533 ; G 2009\nU 5428 ; WX 818 ; N uni1534 ; G 2010\nU 5429 ; WX 844 ; N uni1535 ; G 2011\nU 5430 ; WX 781 ; N uni1536 ; G 2012\nU 5431 ; WX 844 ; N uni1537 ; G 2013\nU 5432 ; WX 781 ; N uni1538 ; G 2014\nU 5433 ; WX 816 ; N uni1539 ; G 2015\nU 5434 ; WX 818 ; N uni153A ; G 2016\nU 5435 ; WX 816 ; N uni153B ; G 2017\nU 5436 ; WX 818 ; N uni153C ; G 2018\nU 5437 ; WX 816 ; N uni153D ; G 2019\nU 5438 ; WX 418 ; N uni153E ; G 2020\nU 5440 ; WX 389 ; N uni1540 ; G 2021\nU 5441 ; WX 484 ; N uni1541 ; G 2022\nU 5442 ; WX 916 ; N uni1542 ; G 2023\nU 5443 ; WX 916 ; N uni1543 ; G 2024\nU 5444 ; WX 916 ; N uni1544 ; G 2025\nU 5445 ; WX 916 ; N uni1545 ; G 2026\nU 5446 ; WX 916 ; N uni1546 ; G 2027\nU 5447 ; WX 916 ; N uni1547 ; G 2028\nU 5448 ; WX 603 ; N uni1548 ; G 2029\nU 5449 ; WX 603 ; N uni1549 ; G 2030\nU 5450 ; WX 603 ; N uni154A ; G 2031\nU 5451 ; WX 603 ; N uni154B ; G 2032\nU 5452 ; WX 603 ; N uni154C ; G 2033\nU 5453 ; WX 603 ; N uni154D ; G 2034\nU 5454 ; WX 834 ; N uni154E ; G 2035\nU 5455 ; WX 754 ; N uni154F ; G 2036\nU 5456 ; WX 418 ; N uni1550 ; G 2037\nU 5458 ; WX 729 ; N uni1552 ; G 2038\nU 5459 ; WX 684 ; N uni1553 ; G 2039\nU 5460 ; WX 684 ; N uni1554 ; G 2040\nU 5461 ; WX 684 ; N uni1555 ; G 2041\nU 5462 ; WX 684 ; N uni1556 ; G 2042\nU 5463 ; WX 726 ; N uni1557 ; G 2043\nU 5464 ; WX 726 ; N uni1558 ; G 2044\nU 5465 ; WX 726 ; N uni1559 ; G 2045\nU 5466 ; WX 726 ; N uni155A ; G 2046\nU 5467 ; WX 924 ; N uni155B ; G 2047\nU 5468 ; WX 1007 ; N uni155C ; G 2048\nU 5469 ; WX 508 ; N uni155D ; G 2049\nU 5470 ; WX 732 ; N uni155E ; G 2050\nU 5471 ; WX 732 ; N uni155F ; G 2051\nU 5472 ; WX 732 ; N uni1560 ; G 2052\nU 5473 ; WX 732 ; N uni1561 ; G 2053\nU 5474 ; WX 732 ; N uni1562 ; G 2054\nU 5475 ; WX 732 ; N uni1563 ; G 2055\nU 5476 ; WX 730 ; N uni1564 ; G 2056\nU 5477 ; WX 730 ; N uni1565 ; G 2057\nU 5478 ; WX 730 ; N uni1566 ; G 2058\nU 5479 ; WX 730 ; N uni1567 ; G 2059\nU 5480 ; WX 947 ; N uni1568 ; G 2060\nU 5481 ; WX 900 ; N uni1569 ; G 2061\nU 5482 ; WX 508 ; N uni156A ; G 2062\nU 5492 ; WX 831 ; N uni1574 ; G 2063\nU 5493 ; WX 831 ; N uni1575 ; G 2064\nU 5494 ; WX 831 ; N uni1576 ; G 2065\nU 5495 ; WX 831 ; N uni1577 ; G 2066\nU 5496 ; WX 831 ; N uni1578 ; G 2067\nU 5497 ; WX 831 ; N uni1579 ; G 2068\nU 5498 ; WX 831 ; N uni157A ; G 2069\nU 5499 ; WX 563 ; N uni157B ; G 2070\nU 5500 ; WX 752 ; N uni157C ; G 2071\nU 5501 ; WX 484 ; N uni157D ; G 2072\nU 5502 ; WX 1047 ; N uni157E ; G 2073\nU 5503 ; WX 1047 ; N uni157F ; G 2074\nU 5504 ; WX 1047 ; N uni1580 ; G 2075\nU 5505 ; WX 1047 ; N uni1581 ; G 2076\nU 5506 ; WX 1047 ; N uni1582 ; G 2077\nU 5507 ; WX 1047 ; N uni1583 ; G 2078\nU 5508 ; WX 1047 ; N uni1584 ; G 2079\nU 5509 ; WX 825 ; N uni1585 ; G 2080\nU 5514 ; WX 831 ; N uni158A ; G 2081\nU 5515 ; WX 831 ; N uni158B ; G 2082\nU 5516 ; WX 831 ; N uni158C ; G 2083\nU 5517 ; WX 831 ; N uni158D ; G 2084\nU 5518 ; WX 1259 ; N uni158E ; G 2085\nU 5519 ; WX 1259 ; N uni158F ; G 2086\nU 5520 ; WX 1259 ; N uni1590 ; G 2087\nU 5521 ; WX 1002 ; N uni1591 ; G 2088\nU 5522 ; WX 1002 ; N uni1592 ; G 2089\nU 5523 ; WX 1259 ; N uni1593 ; G 2090\nU 5524 ; WX 1259 ; N uni1594 ; G 2091\nU 5525 ; WX 700 ; N uni1595 ; G 2092\nU 5526 ; WX 1073 ; N uni1596 ; G 2093\nU 5536 ; WX 852 ; N uni15A0 ; G 2094\nU 5537 ; WX 852 ; N uni15A1 ; G 2095\nU 5538 ; WX 852 ; N uni15A2 ; G 2096\nU 5539 ; WX 852 ; N uni15A3 ; G 2097\nU 5540 ; WX 852 ; N uni15A4 ; G 2098\nU 5541 ; WX 852 ; N uni15A5 ; G 2099\nU 5542 ; WX 600 ; N uni15A6 ; G 2100\nU 5543 ; WX 643 ; N uni15A7 ; G 2101\nU 5544 ; WX 643 ; N uni15A8 ; G 2102\nU 5545 ; WX 643 ; N uni15A9 ; G 2103\nU 5546 ; WX 643 ; N uni15AA ; G 2104\nU 5547 ; WX 643 ; N uni15AB ; G 2105\nU 5548 ; WX 643 ; N uni15AC ; G 2106\nU 5549 ; WX 643 ; N uni15AD ; G 2107\nU 5550 ; WX 418 ; N uni15AE ; G 2108\nU 5551 ; WX 628 ; N uni15AF ; G 2109\nU 5598 ; WX 770 ; N uni15DE ; G 2110\nU 5601 ; WX 767 ; N uni15E1 ; G 2111\nU 5702 ; WX 468 ; N uni1646 ; G 2112\nU 5703 ; WX 468 ; N uni1647 ; G 2113\nU 5742 ; WX 444 ; N uni166E ; G 2114\nU 5743 ; WX 1047 ; N uni166F ; G 2115\nU 5744 ; WX 1310 ; N uni1670 ; G 2116\nU 5745 ; WX 1632 ; N uni1671 ; G 2117\nU 5746 ; WX 1632 ; N uni1672 ; G 2118\nU 5747 ; WX 1375 ; N uni1673 ; G 2119\nU 5748 ; WX 1375 ; N uni1674 ; G 2120\nU 5749 ; WX 1632 ; N uni1675 ; G 2121\nU 5750 ; WX 1632 ; N uni1676 ; G 2122\nU 5760 ; WX 477 ; N uni1680 ; G 2123\nU 5761 ; WX 493 ; N uni1681 ; G 2124\nU 5762 ; WX 712 ; N uni1682 ; G 2125\nU 5763 ; WX 931 ; N uni1683 ; G 2126\nU 5764 ; WX 1150 ; N uni1684 ; G 2127\nU 5765 ; WX 1370 ; N uni1685 ; G 2128\nU 5766 ; WX 493 ; N uni1686 ; G 2129\nU 5767 ; WX 712 ; N uni1687 ; G 2130\nU 5768 ; WX 931 ; N uni1688 ; G 2131\nU 5769 ; WX 1150 ; N uni1689 ; G 2132\nU 5770 ; WX 1370 ; N uni168A ; G 2133\nU 5771 ; WX 498 ; N uni168B ; G 2134\nU 5772 ; WX 718 ; N uni168C ; G 2135\nU 5773 ; WX 938 ; N uni168D ; G 2136\nU 5774 ; WX 1159 ; N uni168E ; G 2137\nU 5775 ; WX 1379 ; N uni168F ; G 2138\nU 5776 ; WX 493 ; N uni1690 ; G 2139\nU 5777 ; WX 712 ; N uni1691 ; G 2140\nU 5778 ; WX 930 ; N uni1692 ; G 2141\nU 5779 ; WX 1149 ; N uni1693 ; G 2142\nU 5780 ; WX 1370 ; N uni1694 ; G 2143\nU 5781 ; WX 498 ; N uni1695 ; G 2144\nU 5782 ; WX 752 ; N uni1696 ; G 2145\nU 5783 ; WX 789 ; N uni1697 ; G 2146\nU 5784 ; WX 1205 ; N uni1698 ; G 2147\nU 5785 ; WX 1150 ; N uni1699 ; G 2148\nU 5786 ; WX 683 ; N uni169A ; G 2149\nU 5787 ; WX 507 ; N uni169B ; G 2150\nU 5788 ; WX 507 ; N uni169C ; G 2151\nU 7424 ; WX 592 ; N uni1D00 ; G 2152\nU 7425 ; WX 717 ; N uni1D01 ; G 2153\nU 7426 ; WX 982 ; N uni1D02 ; G 2154\nU 7427 ; WX 586 ; N uni1D03 ; G 2155\nU 7428 ; WX 550 ; N uni1D04 ; G 2156\nU 7429 ; WX 605 ; N uni1D05 ; G 2157\nU 7430 ; WX 605 ; N uni1D06 ; G 2158\nU 7431 ; WX 491 ; N uni1D07 ; G 2159\nU 7432 ; WX 541 ; N uni1D08 ; G 2160\nU 7433 ; WX 278 ; N uni1D09 ; G 2161\nU 7434 ; WX 395 ; N uni1D0A ; G 2162\nU 7435 ; WX 579 ; N uni1D0B ; G 2163\nU 7436 ; WX 583 ; N uni1D0C ; G 2164\nU 7437 ; WX 754 ; N uni1D0D ; G 2165\nU 7438 ; WX 650 ; N uni1D0E ; G 2166\nU 7439 ; WX 612 ; N uni1D0F ; G 2167\nU 7440 ; WX 550 ; N uni1D10 ; G 2168\nU 7441 ; WX 684 ; N uni1D11 ; G 2169\nU 7442 ; WX 684 ; N uni1D12 ; G 2170\nU 7443 ; WX 684 ; N uni1D13 ; G 2171\nU 7444 ; WX 1023 ; N uni1D14 ; G 2172\nU 7446 ; WX 612 ; N uni1D16 ; G 2173\nU 7447 ; WX 612 ; N uni1D17 ; G 2174\nU 7448 ; WX 524 ; N uni1D18 ; G 2175\nU 7449 ; WX 602 ; N uni1D19 ; G 2176\nU 7450 ; WX 602 ; N uni1D1A ; G 2177\nU 7451 ; WX 583 ; N uni1D1B ; G 2178\nU 7452 ; WX 574 ; N uni1D1C ; G 2179\nU 7453 ; WX 737 ; N uni1D1D ; G 2180\nU 7454 ; WX 948 ; N uni1D1E ; G 2181\nU 7455 ; WX 638 ; N uni1D1F ; G 2182\nU 7456 ; WX 592 ; N uni1D20 ; G 2183\nU 7457 ; WX 818 ; N uni1D21 ; G 2184\nU 7458 ; WX 525 ; N uni1D22 ; G 2185\nU 7459 ; WX 526 ; N uni1D23 ; G 2186\nU 7462 ; WX 583 ; N uni1D26 ; G 2187\nU 7463 ; WX 592 ; N uni1D27 ; G 2188\nU 7464 ; WX 564 ; N uni1D28 ; G 2189\nU 7465 ; WX 524 ; N uni1D29 ; G 2190\nU 7466 ; WX 590 ; N uni1D2A ; G 2191\nU 7467 ; WX 639 ; N uni1D2B ; G 2192\nU 7468 ; WX 431 ; N uni1D2C ; G 2193\nU 7469 ; WX 613 ; N uni1D2D ; G 2194\nU 7470 ; WX 432 ; N uni1D2E ; G 2195\nU 7472 ; WX 485 ; N uni1D30 ; G 2196\nU 7473 ; WX 398 ; N uni1D31 ; G 2197\nU 7474 ; WX 398 ; N uni1D32 ; G 2198\nU 7475 ; WX 488 ; N uni1D33 ; G 2199\nU 7476 ; WX 474 ; N uni1D34 ; G 2200\nU 7477 ; WX 186 ; N uni1D35 ; G 2201\nU 7478 ; WX 186 ; N uni1D36 ; G 2202\nU 7479 ; WX 413 ; N uni1D37 ; G 2203\nU 7480 ; WX 351 ; N uni1D38 ; G 2204\nU 7481 ; WX 543 ; N uni1D39 ; G 2205\nU 7482 ; WX 471 ; N uni1D3A ; G 2206\nU 7483 ; WX 471 ; N uni1D3B ; G 2207\nU 7484 ; WX 496 ; N uni1D3C ; G 2208\nU 7485 ; WX 439 ; N uni1D3D ; G 2209\nU 7486 ; WX 380 ; N uni1D3E ; G 2210\nU 7487 ; WX 438 ; N uni1D3F ; G 2211\nU 7488 ; WX 385 ; N uni1D40 ; G 2212\nU 7489 ; WX 461 ; N uni1D41 ; G 2213\nU 7490 ; WX 623 ; N uni1D42 ; G 2214\nU 7491 ; WX 392 ; N uni1D43 ; G 2215\nU 7492 ; WX 392 ; N uni1D44 ; G 2216\nU 7493 ; WX 405 ; N uni1D45 ; G 2217\nU 7494 ; WX 648 ; N uni1D46 ; G 2218\nU 7495 ; WX 428 ; N uni1D47 ; G 2219\nU 7496 ; WX 405 ; N uni1D48 ; G 2220\nU 7497 ; WX 417 ; N uni1D49 ; G 2221\nU 7498 ; WX 417 ; N uni1D4A ; G 2222\nU 7499 ; WX 360 ; N uni1D4B ; G 2223\nU 7500 ; WX 359 ; N uni1D4C ; G 2224\nU 7501 ; WX 405 ; N uni1D4D ; G 2225\nU 7502 ; WX 179 ; N uni1D4E ; G 2226\nU 7503 ; WX 426 ; N uni1D4F ; G 2227\nU 7504 ; WX 623 ; N uni1D50 ; G 2228\nU 7505 ; WX 409 ; N uni1D51 ; G 2229\nU 7506 ; WX 414 ; N uni1D52 ; G 2230\nU 7507 ; WX 370 ; N uni1D53 ; G 2231\nU 7508 ; WX 414 ; N uni1D54 ; G 2232\nU 7509 ; WX 414 ; N uni1D55 ; G 2233\nU 7510 ; WX 428 ; N uni1D56 ; G 2234\nU 7511 ; WX 295 ; N uni1D57 ; G 2235\nU 7512 ; WX 405 ; N uni1D58 ; G 2236\nU 7513 ; WX 470 ; N uni1D59 ; G 2237\nU 7514 ; WX 623 ; N uni1D5A ; G 2238\nU 7515 ; WX 417 ; N uni1D5B ; G 2239\nU 7517 ; WX 402 ; N uni1D5D ; G 2240\nU 7518 ; WX 373 ; N uni1D5E ; G 2241\nU 7519 ; WX 385 ; N uni1D5F ; G 2242\nU 7520 ; WX 416 ; N uni1D60 ; G 2243\nU 7521 ; WX 364 ; N uni1D61 ; G 2244\nU 7522 ; WX 179 ; N uni1D62 ; G 2245\nU 7523 ; WX 259 ; N uni1D63 ; G 2246\nU 7524 ; WX 405 ; N uni1D64 ; G 2247\nU 7525 ; WX 417 ; N uni1D65 ; G 2248\nU 7526 ; WX 402 ; N uni1D66 ; G 2249\nU 7527 ; WX 373 ; N uni1D67 ; G 2250\nU 7528 ; WX 412 ; N uni1D68 ; G 2251\nU 7529 ; WX 416 ; N uni1D69 ; G 2252\nU 7530 ; WX 364 ; N uni1D6A ; G 2253\nU 7543 ; WX 635 ; N uni1D77 ; G 2254\nU 7544 ; WX 474 ; N uni1D78 ; G 2255\nU 7547 ; WX 372 ; N uni1D7B ; G 2256\nU 7549 ; WX 667 ; N uni1D7D ; G 2257\nU 7557 ; WX 278 ; N uni1D85 ; G 2258\nU 7579 ; WX 405 ; N uni1D9B ; G 2259\nU 7580 ; WX 370 ; N uni1D9C ; G 2260\nU 7581 ; WX 370 ; N uni1D9D ; G 2261\nU 7582 ; WX 414 ; N uni1D9E ; G 2262\nU 7583 ; WX 360 ; N uni1D9F ; G 2263\nU 7584 ; WX 296 ; N uni1DA0 ; G 2264\nU 7585 ; WX 233 ; N uni1DA1 ; G 2265\nU 7586 ; WX 405 ; N uni1DA2 ; G 2266\nU 7587 ; WX 405 ; N uni1DA3 ; G 2267\nU 7588 ; WX 261 ; N uni1DA4 ; G 2268\nU 7589 ; WX 250 ; N uni1DA5 ; G 2269\nU 7590 ; WX 261 ; N uni1DA6 ; G 2270\nU 7591 ; WX 261 ; N uni1DA7 ; G 2271\nU 7592 ; WX 234 ; N uni1DA8 ; G 2272\nU 7593 ; WX 250 ; N uni1DA9 ; G 2273\nU 7594 ; WX 235 ; N uni1DAA ; G 2274\nU 7595 ; WX 376 ; N uni1DAB ; G 2275\nU 7596 ; WX 623 ; N uni1DAC ; G 2276\nU 7597 ; WX 623 ; N uni1DAD ; G 2277\nU 7598 ; WX 411 ; N uni1DAE ; G 2278\nU 7599 ; WX 479 ; N uni1DAF ; G 2279\nU 7600 ; WX 409 ; N uni1DB0 ; G 2280\nU 7601 ; WX 414 ; N uni1DB1 ; G 2281\nU 7602 ; WX 414 ; N uni1DB2 ; G 2282\nU 7603 ; WX 360 ; N uni1DB3 ; G 2283\nU 7604 ; WX 287 ; N uni1DB4 ; G 2284\nU 7605 ; WX 295 ; N uni1DB5 ; G 2285\nU 7606 ; WX 508 ; N uni1DB6 ; G 2286\nU 7607 ; WX 418 ; N uni1DB7 ; G 2287\nU 7608 ; WX 361 ; N uni1DB8 ; G 2288\nU 7609 ; WX 406 ; N uni1DB9 ; G 2289\nU 7610 ; WX 417 ; N uni1DBA ; G 2290\nU 7611 ; WX 366 ; N uni1DBB ; G 2291\nU 7612 ; WX 437 ; N uni1DBC ; G 2292\nU 7613 ; WX 366 ; N uni1DBD ; G 2293\nU 7614 ; WX 392 ; N uni1DBE ; G 2294\nU 7615 ; WX 414 ; N uni1DBF ; G 2295\nU 7620 ; WX 0 ; N uni1DC4 ; G 2296\nU 7621 ; WX 0 ; N uni1DC5 ; G 2297\nU 7622 ; WX 0 ; N uni1DC6 ; G 2298\nU 7623 ; WX 0 ; N uni1DC7 ; G 2299\nU 7624 ; WX 0 ; N uni1DC8 ; G 2300\nU 7625 ; WX 0 ; N uni1DC9 ; G 2301\nU 7680 ; WX 684 ; N uni1E00 ; G 2302\nU 7681 ; WX 613 ; N uni1E01 ; G 2303\nU 7682 ; WX 686 ; N uni1E02 ; G 2304\nU 7683 ; WX 635 ; N uni1E03 ; G 2305\nU 7684 ; WX 686 ; N uni1E04 ; G 2306\nU 7685 ; WX 635 ; N uni1E05 ; G 2307\nU 7686 ; WX 686 ; N uni1E06 ; G 2308\nU 7687 ; WX 635 ; N uni1E07 ; G 2309\nU 7688 ; WX 698 ; N uni1E08 ; G 2310\nU 7689 ; WX 550 ; N uni1E09 ; G 2311\nU 7690 ; WX 770 ; N uni1E0A ; G 2312\nU 7691 ; WX 635 ; N uni1E0B ; G 2313\nU 7692 ; WX 770 ; N uni1E0C ; G 2314\nU 7693 ; WX 635 ; N uni1E0D ; G 2315\nU 7694 ; WX 770 ; N uni1E0E ; G 2316\nU 7695 ; WX 635 ; N uni1E0F ; G 2317\nU 7696 ; WX 770 ; N uni1E10 ; G 2318\nU 7697 ; WX 635 ; N uni1E11 ; G 2319\nU 7698 ; WX 770 ; N uni1E12 ; G 2320\nU 7699 ; WX 635 ; N uni1E13 ; G 2321\nU 7700 ; WX 632 ; N uni1E14 ; G 2322\nU 7701 ; WX 615 ; N uni1E15 ; G 2323\nU 7702 ; WX 632 ; N uni1E16 ; G 2324\nU 7703 ; WX 615 ; N uni1E17 ; G 2325\nU 7704 ; WX 632 ; N uni1E18 ; G 2326\nU 7705 ; WX 615 ; N uni1E19 ; G 2327\nU 7706 ; WX 632 ; N uni1E1A ; G 2328\nU 7707 ; WX 615 ; N uni1E1B ; G 2329\nU 7708 ; WX 632 ; N uni1E1C ; G 2330\nU 7709 ; WX 615 ; N uni1E1D ; G 2331\nU 7710 ; WX 575 ; N uni1E1E ; G 2332\nU 7711 ; WX 352 ; N uni1E1F ; G 2333\nU 7712 ; WX 775 ; N uni1E20 ; G 2334\nU 7713 ; WX 635 ; N uni1E21 ; G 2335\nU 7714 ; WX 752 ; N uni1E22 ; G 2336\nU 7715 ; WX 634 ; N uni1E23 ; G 2337\nU 7716 ; WX 752 ; N uni1E24 ; G 2338\nU 7717 ; WX 634 ; N uni1E25 ; G 2339\nU 7718 ; WX 752 ; N uni1E26 ; G 2340\nU 7719 ; WX 634 ; N uni1E27 ; G 2341\nU 7720 ; WX 752 ; N uni1E28 ; G 2342\nU 7721 ; WX 634 ; N uni1E29 ; G 2343\nU 7722 ; WX 752 ; N uni1E2A ; G 2344\nU 7723 ; WX 634 ; N uni1E2B ; G 2345\nU 7724 ; WX 295 ; N uni1E2C ; G 2346\nU 7725 ; WX 278 ; N uni1E2D ; G 2347\nU 7726 ; WX 295 ; N uni1E2E ; G 2348\nU 7727 ; WX 278 ; N uni1E2F ; G 2349\nU 7728 ; WX 656 ; N uni1E30 ; G 2350\nU 7729 ; WX 579 ; N uni1E31 ; G 2351\nU 7730 ; WX 656 ; N uni1E32 ; G 2352\nU 7731 ; WX 579 ; N uni1E33 ; G 2353\nU 7732 ; WX 656 ; N uni1E34 ; G 2354\nU 7733 ; WX 579 ; N uni1E35 ; G 2355\nU 7734 ; WX 557 ; N uni1E36 ; G 2356\nU 7735 ; WX 288 ; N uni1E37 ; G 2357\nU 7736 ; WX 557 ; N uni1E38 ; G 2358\nU 7737 ; WX 288 ; N uni1E39 ; G 2359\nU 7738 ; WX 557 ; N uni1E3A ; G 2360\nU 7739 ; WX 278 ; N uni1E3B ; G 2361\nU 7740 ; WX 557 ; N uni1E3C ; G 2362\nU 7741 ; WX 278 ; N uni1E3D ; G 2363\nU 7742 ; WX 863 ; N uni1E3E ; G 2364\nU 7743 ; WX 974 ; N uni1E3F ; G 2365\nU 7744 ; WX 863 ; N uni1E40 ; G 2366\nU 7745 ; WX 974 ; N uni1E41 ; G 2367\nU 7746 ; WX 863 ; N uni1E42 ; G 2368\nU 7747 ; WX 974 ; N uni1E43 ; G 2369\nU 7748 ; WX 748 ; N uni1E44 ; G 2370\nU 7749 ; WX 634 ; N uni1E45 ; G 2371\nU 7750 ; WX 748 ; N uni1E46 ; G 2372\nU 7751 ; WX 634 ; N uni1E47 ; G 2373\nU 7752 ; WX 748 ; N uni1E48 ; G 2374\nU 7753 ; WX 634 ; N uni1E49 ; G 2375\nU 7754 ; WX 748 ; N uni1E4A ; G 2376\nU 7755 ; WX 634 ; N uni1E4B ; G 2377\nU 7756 ; WX 787 ; N uni1E4C ; G 2378\nU 7757 ; WX 612 ; N uni1E4D ; G 2379\nU 7758 ; WX 787 ; N uni1E4E ; G 2380\nU 7759 ; WX 612 ; N uni1E4F ; G 2381\nU 7760 ; WX 787 ; N uni1E50 ; G 2382\nU 7761 ; WX 612 ; N uni1E51 ; G 2383\nU 7762 ; WX 787 ; N uni1E52 ; G 2384\nU 7763 ; WX 612 ; N uni1E53 ; G 2385\nU 7764 ; WX 603 ; N uni1E54 ; G 2386\nU 7765 ; WX 635 ; N uni1E55 ; G 2387\nU 7766 ; WX 603 ; N uni1E56 ; G 2388\nU 7767 ; WX 635 ; N uni1E57 ; G 2389\nU 7768 ; WX 695 ; N uni1E58 ; G 2390\nU 7769 ; WX 411 ; N uni1E59 ; G 2391\nU 7770 ; WX 695 ; N uni1E5A ; G 2392\nU 7771 ; WX 411 ; N uni1E5B ; G 2393\nU 7772 ; WX 695 ; N uni1E5C ; G 2394\nU 7773 ; WX 411 ; N uni1E5D ; G 2395\nU 7774 ; WX 695 ; N uni1E5E ; G 2396\nU 7775 ; WX 411 ; N uni1E5F ; G 2397\nU 7776 ; WX 635 ; N uni1E60 ; G 2398\nU 7777 ; WX 521 ; N uni1E61 ; G 2399\nU 7778 ; WX 635 ; N uni1E62 ; G 2400\nU 7779 ; WX 521 ; N uni1E63 ; G 2401\nU 7780 ; WX 635 ; N uni1E64 ; G 2402\nU 7781 ; WX 521 ; N uni1E65 ; G 2403\nU 7782 ; WX 635 ; N uni1E66 ; G 2404\nU 7783 ; WX 521 ; N uni1E67 ; G 2405\nU 7784 ; WX 635 ; N uni1E68 ; G 2406\nU 7785 ; WX 521 ; N uni1E69 ; G 2407\nU 7786 ; WX 611 ; N uni1E6A ; G 2408\nU 7787 ; WX 392 ; N uni1E6B ; G 2409\nU 7788 ; WX 611 ; N uni1E6C ; G 2410\nU 7789 ; WX 392 ; N uni1E6D ; G 2411\nU 7790 ; WX 611 ; N uni1E6E ; G 2412\nU 7791 ; WX 392 ; N uni1E6F ; G 2413\nU 7792 ; WX 611 ; N uni1E70 ; G 2414\nU 7793 ; WX 392 ; N uni1E71 ; G 2415\nU 7794 ; WX 732 ; N uni1E72 ; G 2416\nU 7795 ; WX 634 ; N uni1E73 ; G 2417\nU 7796 ; WX 732 ; N uni1E74 ; G 2418\nU 7797 ; WX 634 ; N uni1E75 ; G 2419\nU 7798 ; WX 732 ; N uni1E76 ; G 2420\nU 7799 ; WX 634 ; N uni1E77 ; G 2421\nU 7800 ; WX 732 ; N uni1E78 ; G 2422\nU 7801 ; WX 634 ; N uni1E79 ; G 2423\nU 7802 ; WX 732 ; N uni1E7A ; G 2424\nU 7803 ; WX 634 ; N uni1E7B ; G 2425\nU 7804 ; WX 684 ; N uni1E7C ; G 2426\nU 7805 ; WX 592 ; N uni1E7D ; G 2427\nU 7806 ; WX 684 ; N uni1E7E ; G 2428\nU 7807 ; WX 592 ; N uni1E7F ; G 2429\nU 7808 ; WX 989 ; N Wgrave ; G 2430\nU 7809 ; WX 818 ; N wgrave ; G 2431\nU 7810 ; WX 989 ; N Wacute ; G 2432\nU 7811 ; WX 818 ; N wacute ; G 2433\nU 7812 ; WX 989 ; N Wdieresis ; G 2434\nU 7813 ; WX 818 ; N wdieresis ; G 2435\nU 7814 ; WX 989 ; N uni1E86 ; G 2436\nU 7815 ; WX 818 ; N uni1E87 ; G 2437\nU 7816 ; WX 989 ; N uni1E88 ; G 2438\nU 7817 ; WX 818 ; N uni1E89 ; G 2439\nU 7818 ; WX 685 ; N uni1E8A ; G 2440\nU 7819 ; WX 592 ; N uni1E8B ; G 2441\nU 7820 ; WX 685 ; N uni1E8C ; G 2442\nU 7821 ; WX 592 ; N uni1E8D ; G 2443\nU 7822 ; WX 611 ; N uni1E8E ; G 2444\nU 7823 ; WX 592 ; N uni1E8F ; G 2445\nU 7824 ; WX 685 ; N uni1E90 ; G 2446\nU 7825 ; WX 525 ; N uni1E91 ; G 2447\nU 7826 ; WX 685 ; N uni1E92 ; G 2448\nU 7827 ; WX 525 ; N uni1E93 ; G 2449\nU 7828 ; WX 685 ; N uni1E94 ; G 2450\nU 7829 ; WX 525 ; N uni1E95 ; G 2451\nU 7830 ; WX 634 ; N uni1E96 ; G 2452\nU 7831 ; WX 392 ; N uni1E97 ; G 2453\nU 7832 ; WX 818 ; N uni1E98 ; G 2454\nU 7833 ; WX 592 ; N uni1E99 ; G 2455\nU 7834 ; WX 613 ; N uni1E9A ; G 2456\nU 7835 ; WX 352 ; N uni1E9B ; G 2457\nU 7836 ; WX 352 ; N uni1E9C ; G 2458\nU 7837 ; WX 352 ; N uni1E9D ; G 2459\nU 7838 ; WX 769 ; N uni1E9E ; G 2460\nU 7839 ; WX 612 ; N uni1E9F ; G 2461\nU 7840 ; WX 684 ; N uni1EA0 ; G 2462\nU 7841 ; WX 613 ; N uni1EA1 ; G 2463\nU 7842 ; WX 684 ; N uni1EA2 ; G 2464\nU 7843 ; WX 613 ; N uni1EA3 ; G 2465\nU 7844 ; WX 684 ; N uni1EA4 ; G 2466\nU 7845 ; WX 613 ; N uni1EA5 ; G 2467\nU 7846 ; WX 684 ; N uni1EA6 ; G 2468\nU 7847 ; WX 613 ; N uni1EA7 ; G 2469\nU 7848 ; WX 684 ; N uni1EA8 ; G 2470\nU 7849 ; WX 613 ; N uni1EA9 ; G 2471\nU 7850 ; WX 684 ; N uni1EAA ; G 2472\nU 7851 ; WX 613 ; N uni1EAB ; G 2473\nU 7852 ; WX 684 ; N uni1EAC ; G 2474\nU 7853 ; WX 613 ; N uni1EAD ; G 2475\nU 7854 ; WX 684 ; N uni1EAE ; G 2476\nU 7855 ; WX 613 ; N uni1EAF ; G 2477\nU 7856 ; WX 684 ; N uni1EB0 ; G 2478\nU 7857 ; WX 613 ; N uni1EB1 ; G 2479\nU 7858 ; WX 684 ; N uni1EB2 ; G 2480\nU 7859 ; WX 613 ; N uni1EB3 ; G 2481\nU 7860 ; WX 684 ; N uni1EB4 ; G 2482\nU 7861 ; WX 613 ; N uni1EB5 ; G 2483\nU 7862 ; WX 684 ; N uni1EB6 ; G 2484\nU 7863 ; WX 613 ; N uni1EB7 ; G 2485\nU 7864 ; WX 632 ; N uni1EB8 ; G 2486\nU 7865 ; WX 615 ; N uni1EB9 ; G 2487\nU 7866 ; WX 632 ; N uni1EBA ; G 2488\nU 7867 ; WX 615 ; N uni1EBB ; G 2489\nU 7868 ; WX 632 ; N uni1EBC ; G 2490\nU 7869 ; WX 615 ; N uni1EBD ; G 2491\nU 7870 ; WX 632 ; N uni1EBE ; G 2492\nU 7871 ; WX 615 ; N uni1EBF ; G 2493\nU 7872 ; WX 632 ; N uni1EC0 ; G 2494\nU 7873 ; WX 615 ; N uni1EC1 ; G 2495\nU 7874 ; WX 632 ; N uni1EC2 ; G 2496\nU 7875 ; WX 615 ; N uni1EC3 ; G 2497\nU 7876 ; WX 632 ; N uni1EC4 ; G 2498\nU 7877 ; WX 615 ; N uni1EC5 ; G 2499\nU 7878 ; WX 632 ; N uni1EC6 ; G 2500\nU 7879 ; WX 615 ; N uni1EC7 ; G 2501\nU 7880 ; WX 295 ; N uni1EC8 ; G 2502\nU 7881 ; WX 278 ; N uni1EC9 ; G 2503\nU 7882 ; WX 295 ; N uni1ECA ; G 2504\nU 7883 ; WX 278 ; N uni1ECB ; G 2505\nU 7884 ; WX 787 ; N uni1ECC ; G 2506\nU 7885 ; WX 612 ; N uni1ECD ; G 2507\nU 7886 ; WX 787 ; N uni1ECE ; G 2508\nU 7887 ; WX 612 ; N uni1ECF ; G 2509\nU 7888 ; WX 787 ; N uni1ED0 ; G 2510\nU 7889 ; WX 612 ; N uni1ED1 ; G 2511\nU 7890 ; WX 787 ; N uni1ED2 ; G 2512\nU 7891 ; WX 612 ; N uni1ED3 ; G 2513\nU 7892 ; WX 787 ; N uni1ED4 ; G 2514\nU 7893 ; WX 612 ; N uni1ED5 ; G 2515\nU 7894 ; WX 787 ; N uni1ED6 ; G 2516\nU 7895 ; WX 612 ; N uni1ED7 ; G 2517\nU 7896 ; WX 787 ; N uni1ED8 ; G 2518\nU 7897 ; WX 612 ; N uni1ED9 ; G 2519\nU 7898 ; WX 913 ; N uni1EDA ; G 2520\nU 7899 ; WX 612 ; N uni1EDB ; G 2521\nU 7900 ; WX 913 ; N uni1EDC ; G 2522\nU 7901 ; WX 612 ; N uni1EDD ; G 2523\nU 7902 ; WX 913 ; N uni1EDE ; G 2524\nU 7903 ; WX 612 ; N uni1EDF ; G 2525\nU 7904 ; WX 913 ; N uni1EE0 ; G 2526\nU 7905 ; WX 612 ; N uni1EE1 ; G 2527\nU 7906 ; WX 913 ; N uni1EE2 ; G 2528\nU 7907 ; WX 612 ; N uni1EE3 ; G 2529\nU 7908 ; WX 732 ; N uni1EE4 ; G 2530\nU 7909 ; WX 634 ; N uni1EE5 ; G 2531\nU 7910 ; WX 732 ; N uni1EE6 ; G 2532\nU 7911 ; WX 634 ; N uni1EE7 ; G 2533\nU 7912 ; WX 858 ; N uni1EE8 ; G 2534\nU 7913 ; WX 634 ; N uni1EE9 ; G 2535\nU 7914 ; WX 858 ; N uni1EEA ; G 2536\nU 7915 ; WX 634 ; N uni1EEB ; G 2537\nU 7916 ; WX 858 ; N uni1EEC ; G 2538\nU 7917 ; WX 634 ; N uni1EED ; G 2539\nU 7918 ; WX 858 ; N uni1EEE ; G 2540\nU 7919 ; WX 634 ; N uni1EEF ; G 2541\nU 7920 ; WX 858 ; N uni1EF0 ; G 2542\nU 7921 ; WX 634 ; N uni1EF1 ; G 2543\nU 7922 ; WX 611 ; N Ygrave ; G 2544\nU 7923 ; WX 592 ; N ygrave ; G 2545\nU 7924 ; WX 611 ; N uni1EF4 ; G 2546\nU 7925 ; WX 592 ; N uni1EF5 ; G 2547\nU 7926 ; WX 611 ; N uni1EF6 ; G 2548\nU 7927 ; WX 592 ; N uni1EF7 ; G 2549\nU 7928 ; WX 611 ; N uni1EF8 ; G 2550\nU 7929 ; WX 592 ; N uni1EF9 ; G 2551\nU 7930 ; WX 769 ; N uni1EFA ; G 2552\nU 7931 ; WX 477 ; N uni1EFB ; G 2553\nU 7936 ; WX 659 ; N uni1F00 ; G 2554\nU 7937 ; WX 659 ; N uni1F01 ; G 2555\nU 7938 ; WX 659 ; N uni1F02 ; G 2556\nU 7939 ; WX 659 ; N uni1F03 ; G 2557\nU 7940 ; WX 659 ; N uni1F04 ; G 2558\nU 7941 ; WX 659 ; N uni1F05 ; G 2559\nU 7942 ; WX 659 ; N uni1F06 ; G 2560\nU 7943 ; WX 659 ; N uni1F07 ; G 2561\nU 7944 ; WX 684 ; N uni1F08 ; G 2562\nU 7945 ; WX 684 ; N uni1F09 ; G 2563\nU 7946 ; WX 877 ; N uni1F0A ; G 2564\nU 7947 ; WX 877 ; N uni1F0B ; G 2565\nU 7948 ; WX 769 ; N uni1F0C ; G 2566\nU 7949 ; WX 801 ; N uni1F0D ; G 2567\nU 7950 ; WX 708 ; N uni1F0E ; G 2568\nU 7951 ; WX 743 ; N uni1F0F ; G 2569\nU 7952 ; WX 541 ; N uni1F10 ; G 2570\nU 7953 ; WX 541 ; N uni1F11 ; G 2571\nU 7954 ; WX 541 ; N uni1F12 ; G 2572\nU 7955 ; WX 541 ; N uni1F13 ; G 2573\nU 7956 ; WX 541 ; N uni1F14 ; G 2574\nU 7957 ; WX 541 ; N uni1F15 ; G 2575\nU 7960 ; WX 711 ; N uni1F18 ; G 2576\nU 7961 ; WX 711 ; N uni1F19 ; G 2577\nU 7962 ; WX 966 ; N uni1F1A ; G 2578\nU 7963 ; WX 975 ; N uni1F1B ; G 2579\nU 7964 ; WX 898 ; N uni1F1C ; G 2580\nU 7965 ; WX 928 ; N uni1F1D ; G 2581\nU 7968 ; WX 634 ; N uni1F20 ; G 2582\nU 7969 ; WX 634 ; N uni1F21 ; G 2583\nU 7970 ; WX 634 ; N uni1F22 ; G 2584\nU 7971 ; WX 634 ; N uni1F23 ; G 2585\nU 7972 ; WX 634 ; N uni1F24 ; G 2586\nU 7973 ; WX 634 ; N uni1F25 ; G 2587\nU 7974 ; WX 634 ; N uni1F26 ; G 2588\nU 7975 ; WX 634 ; N uni1F27 ; G 2589\nU 7976 ; WX 837 ; N uni1F28 ; G 2590\nU 7977 ; WX 835 ; N uni1F29 ; G 2591\nU 7978 ; WX 1086 ; N uni1F2A ; G 2592\nU 7979 ; WX 1089 ; N uni1F2B ; G 2593\nU 7980 ; WX 1027 ; N uni1F2C ; G 2594\nU 7981 ; WX 1051 ; N uni1F2D ; G 2595\nU 7982 ; WX 934 ; N uni1F2E ; G 2596\nU 7983 ; WX 947 ; N uni1F2F ; G 2597\nU 7984 ; WX 338 ; N uni1F30 ; G 2598\nU 7985 ; WX 338 ; N uni1F31 ; G 2599\nU 7986 ; WX 338 ; N uni1F32 ; G 2600\nU 7987 ; WX 338 ; N uni1F33 ; G 2601\nU 7988 ; WX 338 ; N uni1F34 ; G 2602\nU 7989 ; WX 338 ; N uni1F35 ; G 2603\nU 7990 ; WX 338 ; N uni1F36 ; G 2604\nU 7991 ; WX 338 ; N uni1F37 ; G 2605\nU 7992 ; WX 380 ; N uni1F38 ; G 2606\nU 7993 ; WX 374 ; N uni1F39 ; G 2607\nU 7994 ; WX 635 ; N uni1F3A ; G 2608\nU 7995 ; WX 635 ; N uni1F3B ; G 2609\nU 7996 ; WX 570 ; N uni1F3C ; G 2610\nU 7997 ; WX 600 ; N uni1F3D ; G 2611\nU 7998 ; WX 489 ; N uni1F3E ; G 2612\nU 7999 ; WX 493 ; N uni1F3F ; G 2613\nU 8000 ; WX 612 ; N uni1F40 ; G 2614\nU 8001 ; WX 612 ; N uni1F41 ; G 2615\nU 8002 ; WX 612 ; N uni1F42 ; G 2616\nU 8003 ; WX 612 ; N uni1F43 ; G 2617\nU 8004 ; WX 612 ; N uni1F44 ; G 2618\nU 8005 ; WX 612 ; N uni1F45 ; G 2619\nU 8008 ; WX 804 ; N uni1F48 ; G 2620\nU 8009 ; WX 848 ; N uni1F49 ; G 2621\nU 8010 ; WX 1095 ; N uni1F4A ; G 2622\nU 8011 ; WX 1100 ; N uni1F4B ; G 2623\nU 8012 ; WX 938 ; N uni1F4C ; G 2624\nU 8013 ; WX 970 ; N uni1F4D ; G 2625\nU 8016 ; WX 579 ; N uni1F50 ; G 2626\nU 8017 ; WX 579 ; N uni1F51 ; G 2627\nU 8018 ; WX 579 ; N uni1F52 ; G 2628\nU 8019 ; WX 579 ; N uni1F53 ; G 2629\nU 8020 ; WX 579 ; N uni1F54 ; G 2630\nU 8021 ; WX 579 ; N uni1F55 ; G 2631\nU 8022 ; WX 579 ; N uni1F56 ; G 2632\nU 8023 ; WX 579 ; N uni1F57 ; G 2633\nU 8025 ; WX 784 ; N uni1F59 ; G 2634\nU 8027 ; WX 998 ; N uni1F5B ; G 2635\nU 8029 ; WX 1012 ; N uni1F5D ; G 2636\nU 8031 ; WX 897 ; N uni1F5F ; G 2637\nU 8032 ; WX 837 ; N uni1F60 ; G 2638\nU 8033 ; WX 837 ; N uni1F61 ; G 2639\nU 8034 ; WX 837 ; N uni1F62 ; G 2640\nU 8035 ; WX 837 ; N uni1F63 ; G 2641\nU 8036 ; WX 837 ; N uni1F64 ; G 2642\nU 8037 ; WX 837 ; N uni1F65 ; G 2643\nU 8038 ; WX 837 ; N uni1F66 ; G 2644\nU 8039 ; WX 837 ; N uni1F67 ; G 2645\nU 8040 ; WX 802 ; N uni1F68 ; G 2646\nU 8041 ; WX 843 ; N uni1F69 ; G 2647\nU 8042 ; WX 1089 ; N uni1F6A ; G 2648\nU 8043 ; WX 1095 ; N uni1F6B ; G 2649\nU 8044 ; WX 946 ; N uni1F6C ; G 2650\nU 8045 ; WX 972 ; N uni1F6D ; G 2651\nU 8046 ; WX 921 ; N uni1F6E ; G 2652\nU 8047 ; WX 952 ; N uni1F6F ; G 2653\nU 8048 ; WX 659 ; N uni1F70 ; G 2654\nU 8049 ; WX 659 ; N uni1F71 ; G 2655\nU 8050 ; WX 541 ; N uni1F72 ; G 2656\nU 8051 ; WX 548 ; N uni1F73 ; G 2657\nU 8052 ; WX 634 ; N uni1F74 ; G 2658\nU 8053 ; WX 654 ; N uni1F75 ; G 2659\nU 8054 ; WX 338 ; N uni1F76 ; G 2660\nU 8055 ; WX 338 ; N uni1F77 ; G 2661\nU 8056 ; WX 612 ; N uni1F78 ; G 2662\nU 8057 ; WX 612 ; N uni1F79 ; G 2663\nU 8058 ; WX 579 ; N uni1F7A ; G 2664\nU 8059 ; WX 579 ; N uni1F7B ; G 2665\nU 8060 ; WX 837 ; N uni1F7C ; G 2666\nU 8061 ; WX 837 ; N uni1F7D ; G 2667\nU 8064 ; WX 659 ; N uni1F80 ; G 2668\nU 8065 ; WX 659 ; N uni1F81 ; G 2669\nU 8066 ; WX 659 ; N uni1F82 ; G 2670\nU 8067 ; WX 659 ; N uni1F83 ; G 2671\nU 8068 ; WX 659 ; N uni1F84 ; G 2672\nU 8069 ; WX 659 ; N uni1F85 ; G 2673\nU 8070 ; WX 659 ; N uni1F86 ; G 2674\nU 8071 ; WX 659 ; N uni1F87 ; G 2675\nU 8072 ; WX 684 ; N uni1F88 ; G 2676\nU 8073 ; WX 684 ; N uni1F89 ; G 2677\nU 8074 ; WX 877 ; N uni1F8A ; G 2678\nU 8075 ; WX 877 ; N uni1F8B ; G 2679\nU 8076 ; WX 769 ; N uni1F8C ; G 2680\nU 8077 ; WX 801 ; N uni1F8D ; G 2681\nU 8078 ; WX 708 ; N uni1F8E ; G 2682\nU 8079 ; WX 743 ; N uni1F8F ; G 2683\nU 8080 ; WX 634 ; N uni1F90 ; G 2684\nU 8081 ; WX 634 ; N uni1F91 ; G 2685\nU 8082 ; WX 634 ; N uni1F92 ; G 2686\nU 8083 ; WX 634 ; N uni1F93 ; G 2687\nU 8084 ; WX 634 ; N uni1F94 ; G 2688\nU 8085 ; WX 634 ; N uni1F95 ; G 2689\nU 8086 ; WX 634 ; N uni1F96 ; G 2690\nU 8087 ; WX 634 ; N uni1F97 ; G 2691\nU 8088 ; WX 837 ; N uni1F98 ; G 2692\nU 8089 ; WX 835 ; N uni1F99 ; G 2693\nU 8090 ; WX 1086 ; N uni1F9A ; G 2694\nU 8091 ; WX 1089 ; N uni1F9B ; G 2695\nU 8092 ; WX 1027 ; N uni1F9C ; G 2696\nU 8093 ; WX 1051 ; N uni1F9D ; G 2697\nU 8094 ; WX 934 ; N uni1F9E ; G 2698\nU 8095 ; WX 947 ; N uni1F9F ; G 2699\nU 8096 ; WX 837 ; N uni1FA0 ; G 2700\nU 8097 ; WX 837 ; N uni1FA1 ; G 2701\nU 8098 ; WX 837 ; N uni1FA2 ; G 2702\nU 8099 ; WX 837 ; N uni1FA3 ; G 2703\nU 8100 ; WX 837 ; N uni1FA4 ; G 2704\nU 8101 ; WX 837 ; N uni1FA5 ; G 2705\nU 8102 ; WX 837 ; N uni1FA6 ; G 2706\nU 8103 ; WX 837 ; N uni1FA7 ; G 2707\nU 8104 ; WX 802 ; N uni1FA8 ; G 2708\nU 8105 ; WX 843 ; N uni1FA9 ; G 2709\nU 8106 ; WX 1089 ; N uni1FAA ; G 2710\nU 8107 ; WX 1095 ; N uni1FAB ; G 2711\nU 8108 ; WX 946 ; N uni1FAC ; G 2712\nU 8109 ; WX 972 ; N uni1FAD ; G 2713\nU 8110 ; WX 921 ; N uni1FAE ; G 2714\nU 8111 ; WX 952 ; N uni1FAF ; G 2715\nU 8112 ; WX 659 ; N uni1FB0 ; G 2716\nU 8113 ; WX 659 ; N uni1FB1 ; G 2717\nU 8114 ; WX 659 ; N uni1FB2 ; G 2718\nU 8115 ; WX 659 ; N uni1FB3 ; G 2719\nU 8116 ; WX 659 ; N uni1FB4 ; G 2720\nU 8118 ; WX 659 ; N uni1FB6 ; G 2721\nU 8119 ; WX 659 ; N uni1FB7 ; G 2722\nU 8120 ; WX 684 ; N uni1FB8 ; G 2723\nU 8121 ; WX 684 ; N uni1FB9 ; G 2724\nU 8122 ; WX 716 ; N uni1FBA ; G 2725\nU 8123 ; WX 692 ; N uni1FBB ; G 2726\nU 8124 ; WX 684 ; N uni1FBC ; G 2727\nU 8125 ; WX 500 ; N uni1FBD ; G 2728\nU 8126 ; WX 500 ; N uni1FBE ; G 2729\nU 8127 ; WX 500 ; N uni1FBF ; G 2730\nU 8128 ; WX 500 ; N uni1FC0 ; G 2731\nU 8129 ; WX 500 ; N uni1FC1 ; G 2732\nU 8130 ; WX 634 ; N uni1FC2 ; G 2733\nU 8131 ; WX 634 ; N uni1FC3 ; G 2734\nU 8132 ; WX 654 ; N uni1FC4 ; G 2735\nU 8134 ; WX 634 ; N uni1FC6 ; G 2736\nU 8135 ; WX 634 ; N uni1FC7 ; G 2737\nU 8136 ; WX 805 ; N uni1FC8 ; G 2738\nU 8137 ; WX 746 ; N uni1FC9 ; G 2739\nU 8138 ; WX 931 ; N uni1FCA ; G 2740\nU 8139 ; WX 871 ; N uni1FCB ; G 2741\nU 8140 ; WX 752 ; N uni1FCC ; G 2742\nU 8141 ; WX 500 ; N uni1FCD ; G 2743\nU 8142 ; WX 500 ; N uni1FCE ; G 2744\nU 8143 ; WX 500 ; N uni1FCF ; G 2745\nU 8144 ; WX 338 ; N uni1FD0 ; G 2746\nU 8145 ; WX 338 ; N uni1FD1 ; G 2747\nU 8146 ; WX 338 ; N uni1FD2 ; G 2748\nU 8147 ; WX 338 ; N uni1FD3 ; G 2749\nU 8150 ; WX 338 ; N uni1FD6 ; G 2750\nU 8151 ; WX 338 ; N uni1FD7 ; G 2751\nU 8152 ; WX 295 ; N uni1FD8 ; G 2752\nU 8153 ; WX 295 ; N uni1FD9 ; G 2753\nU 8154 ; WX 475 ; N uni1FDA ; G 2754\nU 8155 ; WX 408 ; N uni1FDB ; G 2755\nU 8157 ; WX 500 ; N uni1FDD ; G 2756\nU 8158 ; WX 500 ; N uni1FDE ; G 2757\nU 8159 ; WX 500 ; N uni1FDF ; G 2758\nU 8160 ; WX 579 ; N uni1FE0 ; G 2759\nU 8161 ; WX 579 ; N uni1FE1 ; G 2760\nU 8162 ; WX 579 ; N uni1FE2 ; G 2761\nU 8163 ; WX 579 ; N uni1FE3 ; G 2762\nU 8164 ; WX 635 ; N uni1FE4 ; G 2763\nU 8165 ; WX 635 ; N uni1FE5 ; G 2764\nU 8166 ; WX 579 ; N uni1FE6 ; G 2765\nU 8167 ; WX 579 ; N uni1FE7 ; G 2766\nU 8168 ; WX 611 ; N uni1FE8 ; G 2767\nU 8169 ; WX 611 ; N uni1FE9 ; G 2768\nU 8170 ; WX 845 ; N uni1FEA ; G 2769\nU 8171 ; WX 825 ; N uni1FEB ; G 2770\nU 8172 ; WX 685 ; N uni1FEC ; G 2771\nU 8173 ; WX 500 ; N uni1FED ; G 2772\nU 8174 ; WX 500 ; N uni1FEE ; G 2773\nU 8175 ; WX 500 ; N uni1FEF ; G 2774\nU 8178 ; WX 837 ; N uni1FF2 ; G 2775\nU 8179 ; WX 837 ; N uni1FF3 ; G 2776\nU 8180 ; WX 837 ; N uni1FF4 ; G 2777\nU 8182 ; WX 837 ; N uni1FF6 ; G 2778\nU 8183 ; WX 837 ; N uni1FF7 ; G 2779\nU 8184 ; WX 941 ; N uni1FF8 ; G 2780\nU 8185 ; WX 813 ; N uni1FF9 ; G 2781\nU 8186 ; WX 922 ; N uni1FFA ; G 2782\nU 8187 ; WX 826 ; N uni1FFB ; G 2783\nU 8188 ; WX 764 ; N uni1FFC ; G 2784\nU 8189 ; WX 500 ; N uni1FFD ; G 2785\nU 8190 ; WX 500 ; N uni1FFE ; G 2786\nU 8192 ; WX 500 ; N uni2000 ; G 2787\nU 8193 ; WX 1000 ; N uni2001 ; G 2788\nU 8194 ; WX 500 ; N uni2002 ; G 2789\nU 8195 ; WX 1000 ; N uni2003 ; G 2790\nU 8196 ; WX 330 ; N uni2004 ; G 2791\nU 8197 ; WX 250 ; N uni2005 ; G 2792\nU 8198 ; WX 167 ; N uni2006 ; G 2793\nU 8199 ; WX 636 ; N uni2007 ; G 2794\nU 8200 ; WX 318 ; N uni2008 ; G 2795\nU 8201 ; WX 200 ; N uni2009 ; G 2796\nU 8202 ; WX 100 ; N uni200A ; G 2797\nU 8203 ; WX 0 ; N uni200B ; G 2798\nU 8204 ; WX 0 ; N uni200C ; G 2799\nU 8205 ; WX 0 ; N uni200D ; G 2800\nU 8206 ; WX 0 ; N uni200E ; G 2801\nU 8207 ; WX 0 ; N uni200F ; G 2802\nU 8208 ; WX 361 ; N uni2010 ; G 2803\nU 8209 ; WX 361 ; N uni2011 ; G 2804\nU 8210 ; WX 636 ; N figuredash ; G 2805\nU 8211 ; WX 500 ; N endash ; G 2806\nU 8212 ; WX 1000 ; N emdash ; G 2807\nU 8213 ; WX 1000 ; N uni2015 ; G 2808\nU 8214 ; WX 500 ; N uni2016 ; G 2809\nU 8215 ; WX 500 ; N underscoredbl ; G 2810\nU 8216 ; WX 318 ; N quoteleft ; G 2811\nU 8217 ; WX 318 ; N quoteright ; G 2812\nU 8218 ; WX 318 ; N quotesinglbase ; G 2813\nU 8219 ; WX 318 ; N quotereversed ; G 2814\nU 8220 ; WX 518 ; N quotedblleft ; G 2815\nU 8221 ; WX 518 ; N quotedblright ; G 2816\nU 8222 ; WX 518 ; N quotedblbase ; G 2817\nU 8223 ; WX 518 ; N uni201F ; G 2818\nU 8224 ; WX 500 ; N dagger ; G 2819\nU 8225 ; WX 500 ; N daggerdbl ; G 2820\nU 8226 ; WX 590 ; N bullet ; G 2821\nU 8227 ; WX 590 ; N uni2023 ; G 2822\nU 8228 ; WX 334 ; N onedotenleader ; G 2823\nU 8229 ; WX 667 ; N twodotenleader ; G 2824\nU 8230 ; WX 1000 ; N ellipsis ; G 2825\nU 8231 ; WX 318 ; N uni2027 ; G 2826\nU 8232 ; WX 0 ; N uni2028 ; G 2827\nU 8233 ; WX 0 ; N uni2029 ; G 2828\nU 8234 ; WX 0 ; N uni202A ; G 2829\nU 8235 ; WX 0 ; N uni202B ; G 2830\nU 8236 ; WX 0 ; N uni202C ; G 2831\nU 8237 ; WX 0 ; N uni202D ; G 2832\nU 8238 ; WX 0 ; N uni202E ; G 2833\nU 8239 ; WX 200 ; N uni202F ; G 2834\nU 8240 ; WX 1342 ; N perthousand ; G 2835\nU 8241 ; WX 1735 ; N uni2031 ; G 2836\nU 8242 ; WX 227 ; N minute ; G 2837\nU 8243 ; WX 374 ; N second ; G 2838\nU 8244 ; WX 520 ; N uni2034 ; G 2839\nU 8245 ; WX 227 ; N uni2035 ; G 2840\nU 8246 ; WX 374 ; N uni2036 ; G 2841\nU 8247 ; WX 520 ; N uni2037 ; G 2842\nU 8248 ; WX 339 ; N uni2038 ; G 2843\nU 8249 ; WX 400 ; N guilsinglleft ; G 2844\nU 8250 ; WX 400 ; N guilsinglright ; G 2845\nU 8251 ; WX 838 ; N uni203B ; G 2846\nU 8252 ; WX 485 ; N exclamdbl ; G 2847\nU 8253 ; WX 531 ; N uni203D ; G 2848\nU 8254 ; WX 500 ; N uni203E ; G 2849\nU 8255 ; WX 804 ; N uni203F ; G 2850\nU 8256 ; WX 804 ; N uni2040 ; G 2851\nU 8257 ; WX 250 ; N uni2041 ; G 2852\nU 8258 ; WX 1000 ; N uni2042 ; G 2853\nU 8259 ; WX 500 ; N uni2043 ; G 2854\nU 8260 ; WX 167 ; N fraction ; G 2855\nU 8261 ; WX 390 ; N uni2045 ; G 2856\nU 8262 ; WX 390 ; N uni2046 ; G 2857\nU 8263 ; WX 922 ; N uni2047 ; G 2858\nU 8264 ; WX 733 ; N uni2048 ; G 2859\nU 8265 ; WX 733 ; N uni2049 ; G 2860\nU 8266 ; WX 497 ; N uni204A ; G 2861\nU 8267 ; WX 636 ; N uni204B ; G 2862\nU 8268 ; WX 500 ; N uni204C ; G 2863\nU 8269 ; WX 500 ; N uni204D ; G 2864\nU 8270 ; WX 500 ; N uni204E ; G 2865\nU 8271 ; WX 337 ; N uni204F ; G 2866\nU 8272 ; WX 804 ; N uni2050 ; G 2867\nU 8273 ; WX 500 ; N uni2051 ; G 2868\nU 8274 ; WX 450 ; N uni2052 ; G 2869\nU 8275 ; WX 1000 ; N uni2053 ; G 2870\nU 8276 ; WX 804 ; N uni2054 ; G 2871\nU 8277 ; WX 838 ; N uni2055 ; G 2872\nU 8278 ; WX 586 ; N uni2056 ; G 2873\nU 8279 ; WX 663 ; N uni2057 ; G 2874\nU 8280 ; WX 838 ; N uni2058 ; G 2875\nU 8281 ; WX 838 ; N uni2059 ; G 2876\nU 8282 ; WX 318 ; N uni205A ; G 2877\nU 8283 ; WX 797 ; N uni205B ; G 2878\nU 8284 ; WX 838 ; N uni205C ; G 2879\nU 8285 ; WX 318 ; N uni205D ; G 2880\nU 8286 ; WX 318 ; N uni205E ; G 2881\nU 8287 ; WX 222 ; N uni205F ; G 2882\nU 8288 ; WX 0 ; N uni2060 ; G 2883\nU 8289 ; WX 0 ; N uni2061 ; G 2884\nU 8290 ; WX 0 ; N uni2062 ; G 2885\nU 8291 ; WX 0 ; N uni2063 ; G 2886\nU 8292 ; WX 0 ; N uni2064 ; G 2887\nU 8298 ; WX 0 ; N uni206A ; G 2888\nU 8299 ; WX 0 ; N uni206B ; G 2889\nU 8300 ; WX 0 ; N uni206C ; G 2890\nU 8301 ; WX 0 ; N uni206D ; G 2891\nU 8302 ; WX 0 ; N uni206E ; G 2892\nU 8303 ; WX 0 ; N uni206F ; G 2893\nU 8304 ; WX 401 ; N uni2070 ; G 2894\nU 8305 ; WX 179 ; N uni2071 ; G 2895\nU 8308 ; WX 401 ; N uni2074 ; G 2896\nU 8309 ; WX 401 ; N uni2075 ; G 2897\nU 8310 ; WX 401 ; N uni2076 ; G 2898\nU 8311 ; WX 401 ; N uni2077 ; G 2899\nU 8312 ; WX 401 ; N uni2078 ; G 2900\nU 8313 ; WX 401 ; N uni2079 ; G 2901\nU 8314 ; WX 528 ; N uni207A ; G 2902\nU 8315 ; WX 528 ; N uni207B ; G 2903\nU 8316 ; WX 528 ; N uni207C ; G 2904\nU 8317 ; WX 246 ; N uni207D ; G 2905\nU 8318 ; WX 246 ; N uni207E ; G 2906\nU 8319 ; WX 398 ; N uni207F ; G 2907\nU 8320 ; WX 401 ; N uni2080 ; G 2908\nU 8321 ; WX 401 ; N uni2081 ; G 2909\nU 8322 ; WX 401 ; N uni2082 ; G 2910\nU 8323 ; WX 401 ; N uni2083 ; G 2911\nU 8324 ; WX 401 ; N uni2084 ; G 2912\nU 8325 ; WX 401 ; N uni2085 ; G 2913\nU 8326 ; WX 401 ; N uni2086 ; G 2914\nU 8327 ; WX 401 ; N uni2087 ; G 2915\nU 8328 ; WX 401 ; N uni2088 ; G 2916\nU 8329 ; WX 401 ; N uni2089 ; G 2917\nU 8330 ; WX 528 ; N uni208A ; G 2918\nU 8331 ; WX 528 ; N uni208B ; G 2919\nU 8332 ; WX 528 ; N uni208C ; G 2920\nU 8333 ; WX 246 ; N uni208D ; G 2921\nU 8334 ; WX 246 ; N uni208E ; G 2922\nU 8336 ; WX 392 ; N uni2090 ; G 2923\nU 8337 ; WX 417 ; N uni2091 ; G 2924\nU 8338 ; WX 414 ; N uni2092 ; G 2925\nU 8339 ; WX 444 ; N uni2093 ; G 2926\nU 8340 ; WX 417 ; N uni2094 ; G 2927\nU 8341 ; WX 404 ; N uni2095 ; G 2928\nU 8342 ; WX 426 ; N uni2096 ; G 2929\nU 8343 ; WX 166 ; N uni2097 ; G 2930\nU 8344 ; WX 623 ; N uni2098 ; G 2931\nU 8345 ; WX 398 ; N uni2099 ; G 2932\nU 8346 ; WX 428 ; N uni209A ; G 2933\nU 8347 ; WX 373 ; N uni209B ; G 2934\nU 8348 ; WX 295 ; N uni209C ; G 2935\nU 8352 ; WX 877 ; N uni20A0 ; G 2936\nU 8353 ; WX 636 ; N colonmonetary ; G 2937\nU 8354 ; WX 636 ; N uni20A2 ; G 2938\nU 8355 ; WX 636 ; N franc ; G 2939\nU 8356 ; WX 636 ; N lira ; G 2940\nU 8357 ; WX 974 ; N uni20A5 ; G 2941\nU 8358 ; WX 636 ; N uni20A6 ; G 2942\nU 8359 ; WX 1272 ; N peseta ; G 2943\nU 8360 ; WX 1074 ; N uni20A8 ; G 2944\nU 8361 ; WX 989 ; N uni20A9 ; G 2945\nU 8362 ; WX 784 ; N uni20AA ; G 2946\nU 8363 ; WX 636 ; N dong ; G 2947\nU 8364 ; WX 636 ; N Euro ; G 2948\nU 8365 ; WX 636 ; N uni20AD ; G 2949\nU 8366 ; WX 636 ; N uni20AE ; G 2950\nU 8367 ; WX 1272 ; N uni20AF ; G 2951\nU 8368 ; WX 636 ; N uni20B0 ; G 2952\nU 8369 ; WX 636 ; N uni20B1 ; G 2953\nU 8370 ; WX 636 ; N uni20B2 ; G 2954\nU 8371 ; WX 636 ; N uni20B3 ; G 2955\nU 8372 ; WX 774 ; N uni20B4 ; G 2956\nU 8373 ; WX 636 ; N uni20B5 ; G 2957\nU 8376 ; WX 636 ; N uni20B8 ; G 2958\nU 8377 ; WX 636 ; N uni20B9 ; G 2959\nU 8378 ; WX 636 ; N uni20BA ; G 2960\nU 8381 ; WX 636 ; N uni20BD ; G 2961\nU 8400 ; WX 0 ; N uni20D0 ; G 2962\nU 8401 ; WX 0 ; N uni20D1 ; G 2963\nU 8406 ; WX 0 ; N uni20D6 ; G 2964\nU 8407 ; WX 0 ; N uni20D7 ; G 2965\nU 8411 ; WX 0 ; N uni20DB ; G 2966\nU 8412 ; WX 0 ; N uni20DC ; G 2967\nU 8417 ; WX 0 ; N uni20E1 ; G 2968\nU 8448 ; WX 1019 ; N uni2100 ; G 2969\nU 8449 ; WX 1019 ; N uni2101 ; G 2970\nU 8450 ; WX 698 ; N uni2102 ; G 2971\nU 8451 ; WX 1123 ; N uni2103 ; G 2972\nU 8452 ; WX 642 ; N uni2104 ; G 2973\nU 8453 ; WX 1019 ; N uni2105 ; G 2974\nU 8454 ; WX 1067 ; N uni2106 ; G 2975\nU 8455 ; WX 614 ; N uni2107 ; G 2976\nU 8456 ; WX 698 ; N uni2108 ; G 2977\nU 8457 ; WX 952 ; N uni2109 ; G 2978\nU 8459 ; WX 988 ; N uni210B ; G 2979\nU 8460 ; WX 754 ; N uni210C ; G 2980\nU 8461 ; WX 850 ; N uni210D ; G 2981\nU 8462 ; WX 634 ; N uni210E ; G 2982\nU 8463 ; WX 634 ; N uni210F ; G 2983\nU 8464 ; WX 470 ; N uni2110 ; G 2984\nU 8465 ; WX 697 ; N Ifraktur ; G 2985\nU 8466 ; WX 720 ; N uni2112 ; G 2986\nU 8467 ; WX 413 ; N uni2113 ; G 2987\nU 8468 ; WX 818 ; N uni2114 ; G 2988\nU 8469 ; WX 801 ; N uni2115 ; G 2989\nU 8470 ; WX 1040 ; N uni2116 ; G 2990\nU 8471 ; WX 1000 ; N uni2117 ; G 2991\nU 8472 ; WX 697 ; N weierstrass ; G 2992\nU 8473 ; WX 701 ; N uni2119 ; G 2993\nU 8474 ; WX 787 ; N uni211A ; G 2994\nU 8475 ; WX 798 ; N uni211B ; G 2995\nU 8476 ; WX 814 ; N Rfraktur ; G 2996\nU 8477 ; WX 792 ; N uni211D ; G 2997\nU 8478 ; WX 896 ; N prescription ; G 2998\nU 8479 ; WX 684 ; N uni211F ; G 2999\nU 8480 ; WX 1020 ; N uni2120 ; G 3000\nU 8481 ; WX 1074 ; N uni2121 ; G 3001\nU 8482 ; WX 1000 ; N trademark ; G 3002\nU 8483 ; WX 684 ; N uni2123 ; G 3003\nU 8484 ; WX 745 ; N uni2124 ; G 3004\nU 8485 ; WX 578 ; N uni2125 ; G 3005\nU 8486 ; WX 764 ; N uni2126 ; G 3006\nU 8487 ; WX 764 ; N uni2127 ; G 3007\nU 8488 ; WX 616 ; N uni2128 ; G 3008\nU 8489 ; WX 338 ; N uni2129 ; G 3009\nU 8490 ; WX 656 ; N uni212A ; G 3010\nU 8491 ; WX 684 ; N uni212B ; G 3011\nU 8492 ; WX 786 ; N uni212C ; G 3012\nU 8493 ; WX 703 ; N uni212D ; G 3013\nU 8494 ; WX 854 ; N estimated ; G 3014\nU 8495 ; WX 592 ; N uni212F ; G 3015\nU 8496 ; WX 605 ; N uni2130 ; G 3016\nU 8497 ; WX 786 ; N uni2131 ; G 3017\nU 8498 ; WX 575 ; N uni2132 ; G 3018\nU 8499 ; WX 1069 ; N uni2133 ; G 3019\nU 8500 ; WX 462 ; N uni2134 ; G 3020\nU 8501 ; WX 745 ; N aleph ; G 3021\nU 8502 ; WX 674 ; N uni2136 ; G 3022\nU 8503 ; WX 466 ; N uni2137 ; G 3023\nU 8504 ; WX 645 ; N uni2138 ; G 3024\nU 8505 ; WX 380 ; N uni2139 ; G 3025\nU 8506 ; WX 926 ; N uni213A ; G 3026\nU 8507 ; WX 1194 ; N uni213B ; G 3027\nU 8508 ; WX 702 ; N uni213C ; G 3028\nU 8509 ; WX 728 ; N uni213D ; G 3029\nU 8510 ; WX 654 ; N uni213E ; G 3030\nU 8511 ; WX 849 ; N uni213F ; G 3031\nU 8512 ; WX 811 ; N uni2140 ; G 3032\nU 8513 ; WX 775 ; N uni2141 ; G 3033\nU 8514 ; WX 557 ; N uni2142 ; G 3034\nU 8515 ; WX 557 ; N uni2143 ; G 3035\nU 8516 ; WX 611 ; N uni2144 ; G 3036\nU 8517 ; WX 819 ; N uni2145 ; G 3037\nU 8518 ; WX 708 ; N uni2146 ; G 3038\nU 8519 ; WX 615 ; N uni2147 ; G 3039\nU 8520 ; WX 351 ; N uni2148 ; G 3040\nU 8521 ; WX 351 ; N uni2149 ; G 3041\nU 8523 ; WX 780 ; N uni214B ; G 3042\nU 8526 ; WX 526 ; N uni214E ; G 3043\nU 8528 ; WX 969 ; N uni2150 ; G 3044\nU 8529 ; WX 969 ; N uni2151 ; G 3045\nU 8530 ; WX 1370 ; N uni2152 ; G 3046\nU 8531 ; WX 969 ; N onethird ; G 3047\nU 8532 ; WX 969 ; N twothirds ; G 3048\nU 8533 ; WX 969 ; N uni2155 ; G 3049\nU 8534 ; WX 969 ; N uni2156 ; G 3050\nU 8535 ; WX 969 ; N uni2157 ; G 3051\nU 8536 ; WX 969 ; N uni2158 ; G 3052\nU 8537 ; WX 969 ; N uni2159 ; G 3053\nU 8538 ; WX 969 ; N uni215A ; G 3054\nU 8539 ; WX 969 ; N oneeighth ; G 3055\nU 8540 ; WX 969 ; N threeeighths ; G 3056\nU 8541 ; WX 969 ; N fiveeighths ; G 3057\nU 8542 ; WX 969 ; N seveneighths ; G 3058\nU 8543 ; WX 568 ; N uni215F ; G 3059\nU 8544 ; WX 295 ; N uni2160 ; G 3060\nU 8545 ; WX 492 ; N uni2161 ; G 3061\nU 8546 ; WX 689 ; N uni2162 ; G 3062\nU 8547 ; WX 923 ; N uni2163 ; G 3063\nU 8548 ; WX 684 ; N uni2164 ; G 3064\nU 8549 ; WX 922 ; N uni2165 ; G 3065\nU 8550 ; WX 1120 ; N uni2166 ; G 3066\nU 8551 ; WX 1317 ; N uni2167 ; G 3067\nU 8552 ; WX 917 ; N uni2168 ; G 3068\nU 8553 ; WX 685 ; N uni2169 ; G 3069\nU 8554 ; WX 933 ; N uni216A ; G 3070\nU 8555 ; WX 1131 ; N uni216B ; G 3071\nU 8556 ; WX 557 ; N uni216C ; G 3072\nU 8557 ; WX 698 ; N uni216D ; G 3073\nU 8558 ; WX 770 ; N uni216E ; G 3074\nU 8559 ; WX 863 ; N uni216F ; G 3075\nU 8560 ; WX 278 ; N uni2170 ; G 3076\nU 8561 ; WX 458 ; N uni2171 ; G 3077\nU 8562 ; WX 637 ; N uni2172 ; G 3078\nU 8563 ; WX 812 ; N uni2173 ; G 3079\nU 8564 ; WX 592 ; N uni2174 ; G 3080\nU 8565 ; WX 811 ; N uni2175 ; G 3081\nU 8566 ; WX 991 ; N uni2176 ; G 3082\nU 8567 ; WX 1170 ; N uni2177 ; G 3083\nU 8568 ; WX 819 ; N uni2178 ; G 3084\nU 8569 ; WX 592 ; N uni2179 ; G 3085\nU 8570 ; WX 822 ; N uni217A ; G 3086\nU 8571 ; WX 1002 ; N uni217B ; G 3087\nU 8572 ; WX 278 ; N uni217C ; G 3088\nU 8573 ; WX 550 ; N uni217D ; G 3089\nU 8574 ; WX 635 ; N uni217E ; G 3090\nU 8575 ; WX 974 ; N uni217F ; G 3091\nU 8576 ; WX 1245 ; N uni2180 ; G 3092\nU 8577 ; WX 770 ; N uni2181 ; G 3093\nU 8578 ; WX 1245 ; N uni2182 ; G 3094\nU 8579 ; WX 703 ; N uni2183 ; G 3095\nU 8580 ; WX 549 ; N uni2184 ; G 3096\nU 8581 ; WX 698 ; N uni2185 ; G 3097\nU 8585 ; WX 969 ; N uni2189 ; G 3098\nU 8592 ; WX 838 ; N arrowleft ; G 3099\nU 8593 ; WX 838 ; N arrowup ; G 3100\nU 8594 ; WX 838 ; N arrowright ; G 3101\nU 8595 ; WX 838 ; N arrowdown ; G 3102\nU 8596 ; WX 838 ; N arrowboth ; G 3103\nU 8597 ; WX 838 ; N arrowupdn ; G 3104\nU 8598 ; WX 838 ; N uni2196 ; G 3105\nU 8599 ; WX 838 ; N uni2197 ; G 3106\nU 8600 ; WX 838 ; N uni2198 ; G 3107\nU 8601 ; WX 838 ; N uni2199 ; G 3108\nU 8602 ; WX 838 ; N uni219A ; G 3109\nU 8603 ; WX 838 ; N uni219B ; G 3110\nU 8604 ; WX 838 ; N uni219C ; G 3111\nU 8605 ; WX 838 ; N uni219D ; G 3112\nU 8606 ; WX 838 ; N uni219E ; G 3113\nU 8607 ; WX 838 ; N uni219F ; G 3114\nU 8608 ; WX 838 ; N uni21A0 ; G 3115\nU 8609 ; WX 838 ; N uni21A1 ; G 3116\nU 8610 ; WX 838 ; N uni21A2 ; G 3117\nU 8611 ; WX 838 ; N uni21A3 ; G 3118\nU 8612 ; WX 838 ; N uni21A4 ; G 3119\nU 8613 ; WX 838 ; N uni21A5 ; G 3120\nU 8614 ; WX 838 ; N uni21A6 ; G 3121\nU 8615 ; WX 838 ; N uni21A7 ; G 3122\nU 8616 ; WX 838 ; N arrowupdnbse ; G 3123\nU 8617 ; WX 838 ; N uni21A9 ; G 3124\nU 8618 ; WX 838 ; N uni21AA ; G 3125\nU 8619 ; WX 838 ; N uni21AB ; G 3126\nU 8620 ; WX 838 ; N uni21AC ; G 3127\nU 8621 ; WX 838 ; N uni21AD ; G 3128\nU 8622 ; WX 838 ; N uni21AE ; G 3129\nU 8623 ; WX 838 ; N uni21AF ; G 3130\nU 8624 ; WX 838 ; N uni21B0 ; G 3131\nU 8625 ; WX 838 ; N uni21B1 ; G 3132\nU 8626 ; WX 838 ; N uni21B2 ; G 3133\nU 8627 ; WX 838 ; N uni21B3 ; G 3134\nU 8628 ; WX 838 ; N uni21B4 ; G 3135\nU 8629 ; WX 838 ; N carriagereturn ; G 3136\nU 8630 ; WX 838 ; N uni21B6 ; G 3137\nU 8631 ; WX 838 ; N uni21B7 ; G 3138\nU 8632 ; WX 838 ; N uni21B8 ; G 3139\nU 8633 ; WX 838 ; N uni21B9 ; G 3140\nU 8634 ; WX 838 ; N uni21BA ; G 3141\nU 8635 ; WX 838 ; N uni21BB ; G 3142\nU 8636 ; WX 838 ; N uni21BC ; G 3143\nU 8637 ; WX 838 ; N uni21BD ; G 3144\nU 8638 ; WX 838 ; N uni21BE ; G 3145\nU 8639 ; WX 838 ; N uni21BF ; G 3146\nU 8640 ; WX 838 ; N uni21C0 ; G 3147\nU 8641 ; WX 838 ; N uni21C1 ; G 3148\nU 8642 ; WX 838 ; N uni21C2 ; G 3149\nU 8643 ; WX 838 ; N uni21C3 ; G 3150\nU 8644 ; WX 838 ; N uni21C4 ; G 3151\nU 8645 ; WX 838 ; N uni21C5 ; G 3152\nU 8646 ; WX 838 ; N uni21C6 ; G 3153\nU 8647 ; WX 838 ; N uni21C7 ; G 3154\nU 8648 ; WX 838 ; N uni21C8 ; G 3155\nU 8649 ; WX 838 ; N uni21C9 ; G 3156\nU 8650 ; WX 838 ; N uni21CA ; G 3157\nU 8651 ; WX 838 ; N uni21CB ; G 3158\nU 8652 ; WX 838 ; N uni21CC ; G 3159\nU 8653 ; WX 838 ; N uni21CD ; G 3160\nU 8654 ; WX 838 ; N uni21CE ; G 3161\nU 8655 ; WX 838 ; N uni21CF ; G 3162\nU 8656 ; WX 838 ; N arrowdblleft ; G 3163\nU 8657 ; WX 838 ; N arrowdblup ; G 3164\nU 8658 ; WX 838 ; N arrowdblright ; G 3165\nU 8659 ; WX 838 ; N arrowdbldown ; G 3166\nU 8660 ; WX 838 ; N arrowdblboth ; G 3167\nU 8661 ; WX 838 ; N uni21D5 ; G 3168\nU 8662 ; WX 838 ; N uni21D6 ; G 3169\nU 8663 ; WX 838 ; N uni21D7 ; G 3170\nU 8664 ; WX 838 ; N uni21D8 ; G 3171\nU 8665 ; WX 838 ; N uni21D9 ; G 3172\nU 8666 ; WX 838 ; N uni21DA ; G 3173\nU 8667 ; WX 838 ; N uni21DB ; G 3174\nU 8668 ; WX 838 ; N uni21DC ; G 3175\nU 8669 ; WX 838 ; N uni21DD ; G 3176\nU 8670 ; WX 838 ; N uni21DE ; G 3177\nU 8671 ; WX 838 ; N uni21DF ; G 3178\nU 8672 ; WX 838 ; N uni21E0 ; G 3179\nU 8673 ; WX 838 ; N uni21E1 ; G 3180\nU 8674 ; WX 838 ; N uni21E2 ; G 3181\nU 8675 ; WX 838 ; N uni21E3 ; G 3182\nU 8676 ; WX 838 ; N uni21E4 ; G 3183\nU 8677 ; WX 838 ; N uni21E5 ; G 3184\nU 8678 ; WX 838 ; N uni21E6 ; G 3185\nU 8679 ; WX 838 ; N uni21E7 ; G 3186\nU 8680 ; WX 838 ; N uni21E8 ; G 3187\nU 8681 ; WX 838 ; N uni21E9 ; G 3188\nU 8682 ; WX 838 ; N uni21EA ; G 3189\nU 8683 ; WX 838 ; N uni21EB ; G 3190\nU 8684 ; WX 838 ; N uni21EC ; G 3191\nU 8685 ; WX 838 ; N uni21ED ; G 3192\nU 8686 ; WX 838 ; N uni21EE ; G 3193\nU 8687 ; WX 838 ; N uni21EF ; G 3194\nU 8688 ; WX 838 ; N uni21F0 ; G 3195\nU 8689 ; WX 838 ; N uni21F1 ; G 3196\nU 8690 ; WX 838 ; N uni21F2 ; G 3197\nU 8691 ; WX 838 ; N uni21F3 ; G 3198\nU 8692 ; WX 838 ; N uni21F4 ; G 3199\nU 8693 ; WX 838 ; N uni21F5 ; G 3200\nU 8694 ; WX 838 ; N uni21F6 ; G 3201\nU 8695 ; WX 838 ; N uni21F7 ; G 3202\nU 8696 ; WX 838 ; N uni21F8 ; G 3203\nU 8697 ; WX 838 ; N uni21F9 ; G 3204\nU 8698 ; WX 838 ; N uni21FA ; G 3205\nU 8699 ; WX 838 ; N uni21FB ; G 3206\nU 8700 ; WX 838 ; N uni21FC ; G 3207\nU 8701 ; WX 838 ; N uni21FD ; G 3208\nU 8702 ; WX 838 ; N uni21FE ; G 3209\nU 8703 ; WX 838 ; N uni21FF ; G 3210\nU 8704 ; WX 684 ; N universal ; G 3211\nU 8705 ; WX 636 ; N uni2201 ; G 3212\nU 8706 ; WX 517 ; N partialdiff ; G 3213\nU 8707 ; WX 632 ; N existential ; G 3214\nU 8708 ; WX 632 ; N uni2204 ; G 3215\nU 8709 ; WX 871 ; N emptyset ; G 3216\nU 8710 ; WX 669 ; N increment ; G 3217\nU 8711 ; WX 669 ; N gradient ; G 3218\nU 8712 ; WX 871 ; N element ; G 3219\nU 8713 ; WX 871 ; N notelement ; G 3220\nU 8714 ; WX 718 ; N uni220A ; G 3221\nU 8715 ; WX 871 ; N suchthat ; G 3222\nU 8716 ; WX 871 ; N uni220C ; G 3223\nU 8717 ; WX 718 ; N uni220D ; G 3224\nU 8718 ; WX 636 ; N uni220E ; G 3225\nU 8719 ; WX 757 ; N product ; G 3226\nU 8720 ; WX 757 ; N uni2210 ; G 3227\nU 8721 ; WX 674 ; N summation ; G 3228\nU 8722 ; WX 838 ; N minus ; G 3229\nU 8723 ; WX 838 ; N uni2213 ; G 3230\nU 8724 ; WX 838 ; N uni2214 ; G 3231\nU 8725 ; WX 337 ; N uni2215 ; G 3232\nU 8726 ; WX 637 ; N uni2216 ; G 3233\nU 8727 ; WX 838 ; N asteriskmath ; G 3234\nU 8728 ; WX 626 ; N uni2218 ; G 3235\nU 8729 ; WX 626 ; N uni2219 ; G 3236\nU 8730 ; WX 637 ; N radical ; G 3237\nU 8731 ; WX 637 ; N uni221B ; G 3238\nU 8732 ; WX 637 ; N uni221C ; G 3239\nU 8733 ; WX 714 ; N proportional ; G 3240\nU 8734 ; WX 833 ; N infinity ; G 3241\nU 8735 ; WX 838 ; N orthogonal ; G 3242\nU 8736 ; WX 896 ; N angle ; G 3243\nU 8737 ; WX 896 ; N uni2221 ; G 3244\nU 8738 ; WX 838 ; N uni2222 ; G 3245\nU 8739 ; WX 500 ; N uni2223 ; G 3246\nU 8740 ; WX 500 ; N uni2224 ; G 3247\nU 8741 ; WX 500 ; N uni2225 ; G 3248\nU 8742 ; WX 500 ; N uni2226 ; G 3249\nU 8743 ; WX 732 ; N logicaland ; G 3250\nU 8744 ; WX 732 ; N logicalor ; G 3251\nU 8745 ; WX 732 ; N intersection ; G 3252\nU 8746 ; WX 732 ; N union ; G 3253\nU 8747 ; WX 521 ; N integral ; G 3254\nU 8748 ; WX 789 ; N uni222C ; G 3255\nU 8749 ; WX 1057 ; N uni222D ; G 3256\nU 8750 ; WX 521 ; N uni222E ; G 3257\nU 8751 ; WX 789 ; N uni222F ; G 3258\nU 8752 ; WX 1057 ; N uni2230 ; G 3259\nU 8753 ; WX 521 ; N uni2231 ; G 3260\nU 8754 ; WX 521 ; N uni2232 ; G 3261\nU 8755 ; WX 521 ; N uni2233 ; G 3262\nU 8756 ; WX 636 ; N therefore ; G 3263\nU 8757 ; WX 636 ; N uni2235 ; G 3264\nU 8758 ; WX 260 ; N uni2236 ; G 3265\nU 8759 ; WX 636 ; N uni2237 ; G 3266\nU 8760 ; WX 838 ; N uni2238 ; G 3267\nU 8761 ; WX 838 ; N uni2239 ; G 3268\nU 8762 ; WX 838 ; N uni223A ; G 3269\nU 8763 ; WX 838 ; N uni223B ; G 3270\nU 8764 ; WX 838 ; N similar ; G 3271\nU 8765 ; WX 838 ; N uni223D ; G 3272\nU 8766 ; WX 838 ; N uni223E ; G 3273\nU 8767 ; WX 838 ; N uni223F ; G 3274\nU 8768 ; WX 375 ; N uni2240 ; G 3275\nU 8769 ; WX 838 ; N uni2241 ; G 3276\nU 8770 ; WX 838 ; N uni2242 ; G 3277\nU 8771 ; WX 838 ; N uni2243 ; G 3278\nU 8772 ; WX 838 ; N uni2244 ; G 3279\nU 8773 ; WX 838 ; N congruent ; G 3280\nU 8774 ; WX 838 ; N uni2246 ; G 3281\nU 8775 ; WX 838 ; N uni2247 ; G 3282\nU 8776 ; WX 838 ; N approxequal ; G 3283\nU 8777 ; WX 838 ; N uni2249 ; G 3284\nU 8778 ; WX 838 ; N uni224A ; G 3285\nU 8779 ; WX 838 ; N uni224B ; G 3286\nU 8780 ; WX 838 ; N uni224C ; G 3287\nU 8781 ; WX 838 ; N uni224D ; G 3288\nU 8782 ; WX 838 ; N uni224E ; G 3289\nU 8783 ; WX 838 ; N uni224F ; G 3290\nU 8784 ; WX 838 ; N uni2250 ; G 3291\nU 8785 ; WX 838 ; N uni2251 ; G 3292\nU 8786 ; WX 839 ; N uni2252 ; G 3293\nU 8787 ; WX 839 ; N uni2253 ; G 3294\nU 8788 ; WX 1000 ; N uni2254 ; G 3295\nU 8789 ; WX 1000 ; N uni2255 ; G 3296\nU 8790 ; WX 838 ; N uni2256 ; G 3297\nU 8791 ; WX 838 ; N uni2257 ; G 3298\nU 8792 ; WX 838 ; N uni2258 ; G 3299\nU 8793 ; WX 838 ; N uni2259 ; G 3300\nU 8794 ; WX 838 ; N uni225A ; G 3301\nU 8795 ; WX 838 ; N uni225B ; G 3302\nU 8796 ; WX 838 ; N uni225C ; G 3303\nU 8797 ; WX 838 ; N uni225D ; G 3304\nU 8798 ; WX 838 ; N uni225E ; G 3305\nU 8799 ; WX 838 ; N uni225F ; G 3306\nU 8800 ; WX 838 ; N notequal ; G 3307\nU 8801 ; WX 838 ; N equivalence ; G 3308\nU 8802 ; WX 838 ; N uni2262 ; G 3309\nU 8803 ; WX 838 ; N uni2263 ; G 3310\nU 8804 ; WX 838 ; N lessequal ; G 3311\nU 8805 ; WX 838 ; N greaterequal ; G 3312\nU 8806 ; WX 838 ; N uni2266 ; G 3313\nU 8807 ; WX 838 ; N uni2267 ; G 3314\nU 8808 ; WX 838 ; N uni2268 ; G 3315\nU 8809 ; WX 838 ; N uni2269 ; G 3316\nU 8810 ; WX 1047 ; N uni226A ; G 3317\nU 8811 ; WX 1047 ; N uni226B ; G 3318\nU 8812 ; WX 464 ; N uni226C ; G 3319\nU 8813 ; WX 838 ; N uni226D ; G 3320\nU 8814 ; WX 838 ; N uni226E ; G 3321\nU 8815 ; WX 838 ; N uni226F ; G 3322\nU 8816 ; WX 838 ; N uni2270 ; G 3323\nU 8817 ; WX 838 ; N uni2271 ; G 3324\nU 8818 ; WX 838 ; N uni2272 ; G 3325\nU 8819 ; WX 838 ; N uni2273 ; G 3326\nU 8820 ; WX 838 ; N uni2274 ; G 3327\nU 8821 ; WX 838 ; N uni2275 ; G 3328\nU 8822 ; WX 838 ; N uni2276 ; G 3329\nU 8823 ; WX 838 ; N uni2277 ; G 3330\nU 8824 ; WX 838 ; N uni2278 ; G 3331\nU 8825 ; WX 838 ; N uni2279 ; G 3332\nU 8826 ; WX 838 ; N uni227A ; G 3333\nU 8827 ; WX 838 ; N uni227B ; G 3334\nU 8828 ; WX 838 ; N uni227C ; G 3335\nU 8829 ; WX 838 ; N uni227D ; G 3336\nU 8830 ; WX 838 ; N uni227E ; G 3337\nU 8831 ; WX 838 ; N uni227F ; G 3338\nU 8832 ; WX 838 ; N uni2280 ; G 3339\nU 8833 ; WX 838 ; N uni2281 ; G 3340\nU 8834 ; WX 838 ; N propersubset ; G 3341\nU 8835 ; WX 838 ; N propersuperset ; G 3342\nU 8836 ; WX 838 ; N notsubset ; G 3343\nU 8837 ; WX 838 ; N uni2285 ; G 3344\nU 8838 ; WX 838 ; N reflexsubset ; G 3345\nU 8839 ; WX 838 ; N reflexsuperset ; G 3346\nU 8840 ; WX 838 ; N uni2288 ; G 3347\nU 8841 ; WX 838 ; N uni2289 ; G 3348\nU 8842 ; WX 838 ; N uni228A ; G 3349\nU 8843 ; WX 838 ; N uni228B ; G 3350\nU 8844 ; WX 732 ; N uni228C ; G 3351\nU 8845 ; WX 732 ; N uni228D ; G 3352\nU 8846 ; WX 732 ; N uni228E ; G 3353\nU 8847 ; WX 838 ; N uni228F ; G 3354\nU 8848 ; WX 838 ; N uni2290 ; G 3355\nU 8849 ; WX 838 ; N uni2291 ; G 3356\nU 8850 ; WX 838 ; N uni2292 ; G 3357\nU 8851 ; WX 780 ; N uni2293 ; G 3358\nU 8852 ; WX 780 ; N uni2294 ; G 3359\nU 8853 ; WX 838 ; N circleplus ; G 3360\nU 8854 ; WX 838 ; N uni2296 ; G 3361\nU 8855 ; WX 838 ; N circlemultiply ; G 3362\nU 8856 ; WX 838 ; N uni2298 ; G 3363\nU 8857 ; WX 838 ; N uni2299 ; G 3364\nU 8858 ; WX 838 ; N uni229A ; G 3365\nU 8859 ; WX 838 ; N uni229B ; G 3366\nU 8860 ; WX 838 ; N uni229C ; G 3367\nU 8861 ; WX 838 ; N uni229D ; G 3368\nU 8862 ; WX 838 ; N uni229E ; G 3369\nU 8863 ; WX 838 ; N uni229F ; G 3370\nU 8864 ; WX 838 ; N uni22A0 ; G 3371\nU 8865 ; WX 838 ; N uni22A1 ; G 3372\nU 8866 ; WX 871 ; N uni22A2 ; G 3373\nU 8867 ; WX 871 ; N uni22A3 ; G 3374\nU 8868 ; WX 871 ; N uni22A4 ; G 3375\nU 8869 ; WX 871 ; N perpendicular ; G 3376\nU 8870 ; WX 521 ; N uni22A6 ; G 3377\nU 8871 ; WX 521 ; N uni22A7 ; G 3378\nU 8872 ; WX 871 ; N uni22A8 ; G 3379\nU 8873 ; WX 871 ; N uni22A9 ; G 3380\nU 8874 ; WX 871 ; N uni22AA ; G 3381\nU 8875 ; WX 871 ; N uni22AB ; G 3382\nU 8876 ; WX 871 ; N uni22AC ; G 3383\nU 8877 ; WX 871 ; N uni22AD ; G 3384\nU 8878 ; WX 871 ; N uni22AE ; G 3385\nU 8879 ; WX 871 ; N uni22AF ; G 3386\nU 8880 ; WX 838 ; N uni22B0 ; G 3387\nU 8881 ; WX 838 ; N uni22B1 ; G 3388\nU 8882 ; WX 838 ; N uni22B2 ; G 3389\nU 8883 ; WX 838 ; N uni22B3 ; G 3390\nU 8884 ; WX 838 ; N uni22B4 ; G 3391\nU 8885 ; WX 838 ; N uni22B5 ; G 3392\nU 8886 ; WX 1000 ; N uni22B6 ; G 3393\nU 8887 ; WX 1000 ; N uni22B7 ; G 3394\nU 8888 ; WX 838 ; N uni22B8 ; G 3395\nU 8889 ; WX 838 ; N uni22B9 ; G 3396\nU 8890 ; WX 521 ; N uni22BA ; G 3397\nU 8891 ; WX 732 ; N uni22BB ; G 3398\nU 8892 ; WX 732 ; N uni22BC ; G 3399\nU 8893 ; WX 732 ; N uni22BD ; G 3400\nU 8894 ; WX 838 ; N uni22BE ; G 3401\nU 8895 ; WX 838 ; N uni22BF ; G 3402\nU 8896 ; WX 820 ; N uni22C0 ; G 3403\nU 8897 ; WX 820 ; N uni22C1 ; G 3404\nU 8898 ; WX 820 ; N uni22C2 ; G 3405\nU 8899 ; WX 820 ; N uni22C3 ; G 3406\nU 8900 ; WX 626 ; N uni22C4 ; G 3407\nU 8901 ; WX 318 ; N dotmath ; G 3408\nU 8902 ; WX 626 ; N uni22C6 ; G 3409\nU 8903 ; WX 838 ; N uni22C7 ; G 3410\nU 8904 ; WX 1000 ; N uni22C8 ; G 3411\nU 8905 ; WX 1000 ; N uni22C9 ; G 3412\nU 8906 ; WX 1000 ; N uni22CA ; G 3413\nU 8907 ; WX 1000 ; N uni22CB ; G 3414\nU 8908 ; WX 1000 ; N uni22CC ; G 3415\nU 8909 ; WX 838 ; N uni22CD ; G 3416\nU 8910 ; WX 732 ; N uni22CE ; G 3417\nU 8911 ; WX 732 ; N uni22CF ; G 3418\nU 8912 ; WX 838 ; N uni22D0 ; G 3419\nU 8913 ; WX 838 ; N uni22D1 ; G 3420\nU 8914 ; WX 838 ; N uni22D2 ; G 3421\nU 8915 ; WX 838 ; N uni22D3 ; G 3422\nU 8916 ; WX 838 ; N uni22D4 ; G 3423\nU 8917 ; WX 838 ; N uni22D5 ; G 3424\nU 8918 ; WX 838 ; N uni22D6 ; G 3425\nU 8919 ; WX 838 ; N uni22D7 ; G 3426\nU 8920 ; WX 1422 ; N uni22D8 ; G 3427\nU 8921 ; WX 1422 ; N uni22D9 ; G 3428\nU 8922 ; WX 838 ; N uni22DA ; G 3429\nU 8923 ; WX 838 ; N uni22DB ; G 3430\nU 8924 ; WX 838 ; N uni22DC ; G 3431\nU 8925 ; WX 838 ; N uni22DD ; G 3432\nU 8926 ; WX 838 ; N uni22DE ; G 3433\nU 8927 ; WX 838 ; N uni22DF ; G 3434\nU 8928 ; WX 838 ; N uni22E0 ; G 3435\nU 8929 ; WX 838 ; N uni22E1 ; G 3436\nU 8930 ; WX 838 ; N uni22E2 ; G 3437\nU 8931 ; WX 838 ; N uni22E3 ; G 3438\nU 8932 ; WX 838 ; N uni22E4 ; G 3439\nU 8933 ; WX 838 ; N uni22E5 ; G 3440\nU 8934 ; WX 838 ; N uni22E6 ; G 3441\nU 8935 ; WX 838 ; N uni22E7 ; G 3442\nU 8936 ; WX 838 ; N uni22E8 ; G 3443\nU 8937 ; WX 838 ; N uni22E9 ; G 3444\nU 8938 ; WX 838 ; N uni22EA ; G 3445\nU 8939 ; WX 838 ; N uni22EB ; G 3446\nU 8940 ; WX 838 ; N uni22EC ; G 3447\nU 8941 ; WX 838 ; N uni22ED ; G 3448\nU 8942 ; WX 1000 ; N uni22EE ; G 3449\nU 8943 ; WX 1000 ; N uni22EF ; G 3450\nU 8944 ; WX 1000 ; N uni22F0 ; G 3451\nU 8945 ; WX 1000 ; N uni22F1 ; G 3452\nU 8946 ; WX 1000 ; N uni22F2 ; G 3453\nU 8947 ; WX 871 ; N uni22F3 ; G 3454\nU 8948 ; WX 718 ; N uni22F4 ; G 3455\nU 8949 ; WX 871 ; N uni22F5 ; G 3456\nU 8950 ; WX 871 ; N uni22F6 ; G 3457\nU 8951 ; WX 718 ; N uni22F7 ; G 3458\nU 8952 ; WX 871 ; N uni22F8 ; G 3459\nU 8953 ; WX 871 ; N uni22F9 ; G 3460\nU 8954 ; WX 1000 ; N uni22FA ; G 3461\nU 8955 ; WX 871 ; N uni22FB ; G 3462\nU 8956 ; WX 718 ; N uni22FC ; G 3463\nU 8957 ; WX 871 ; N uni22FD ; G 3464\nU 8958 ; WX 718 ; N uni22FE ; G 3465\nU 8959 ; WX 871 ; N uni22FF ; G 3466\nU 8960 ; WX 602 ; N uni2300 ; G 3467\nU 8961 ; WX 602 ; N uni2301 ; G 3468\nU 8962 ; WX 635 ; N house ; G 3469\nU 8963 ; WX 838 ; N uni2303 ; G 3470\nU 8964 ; WX 838 ; N uni2304 ; G 3471\nU 8965 ; WX 838 ; N uni2305 ; G 3472\nU 8966 ; WX 838 ; N uni2306 ; G 3473\nU 8967 ; WX 488 ; N uni2307 ; G 3474\nU 8968 ; WX 390 ; N uni2308 ; G 3475\nU 8969 ; WX 390 ; N uni2309 ; G 3476\nU 8970 ; WX 390 ; N uni230A ; G 3477\nU 8971 ; WX 390 ; N uni230B ; G 3478\nU 8972 ; WX 809 ; N uni230C ; G 3479\nU 8973 ; WX 809 ; N uni230D ; G 3480\nU 8974 ; WX 809 ; N uni230E ; G 3481\nU 8975 ; WX 809 ; N uni230F ; G 3482\nU 8976 ; WX 838 ; N revlogicalnot ; G 3483\nU 8977 ; WX 513 ; N uni2311 ; G 3484\nU 8984 ; WX 1000 ; N uni2318 ; G 3485\nU 8985 ; WX 838 ; N uni2319 ; G 3486\nU 8988 ; WX 469 ; N uni231C ; G 3487\nU 8989 ; WX 469 ; N uni231D ; G 3488\nU 8990 ; WX 469 ; N uni231E ; G 3489\nU 8991 ; WX 469 ; N uni231F ; G 3490\nU 8992 ; WX 521 ; N integraltp ; G 3491\nU 8993 ; WX 521 ; N integralbt ; G 3492\nU 8996 ; WX 1152 ; N uni2324 ; G 3493\nU 8997 ; WX 1152 ; N uni2325 ; G 3494\nU 8998 ; WX 1414 ; N uni2326 ; G 3495\nU 8999 ; WX 1152 ; N uni2327 ; G 3496\nU 9000 ; WX 1443 ; N uni2328 ; G 3497\nU 9003 ; WX 1414 ; N uni232B ; G 3498\nU 9004 ; WX 873 ; N uni232C ; G 3499\nU 9075 ; WX 338 ; N uni2373 ; G 3500\nU 9076 ; WX 635 ; N uni2374 ; G 3501\nU 9077 ; WX 837 ; N uni2375 ; G 3502\nU 9082 ; WX 659 ; N uni237A ; G 3503\nU 9085 ; WX 757 ; N uni237D ; G 3504\nU 9095 ; WX 1152 ; N uni2387 ; G 3505\nU 9108 ; WX 873 ; N uni2394 ; G 3506\nU 9115 ; WX 500 ; N uni239B ; G 3507\nU 9116 ; WX 500 ; N uni239C ; G 3508\nU 9117 ; WX 500 ; N uni239D ; G 3509\nU 9118 ; WX 500 ; N uni239E ; G 3510\nU 9119 ; WX 500 ; N uni239F ; G 3511\nU 9120 ; WX 500 ; N uni23A0 ; G 3512\nU 9121 ; WX 500 ; N uni23A1 ; G 3513\nU 9122 ; WX 500 ; N uni23A2 ; G 3514\nU 9123 ; WX 500 ; N uni23A3 ; G 3515\nU 9124 ; WX 500 ; N uni23A4 ; G 3516\nU 9125 ; WX 500 ; N uni23A5 ; G 3517\nU 9126 ; WX 500 ; N uni23A6 ; G 3518\nU 9127 ; WX 750 ; N uni23A7 ; G 3519\nU 9128 ; WX 750 ; N uni23A8 ; G 3520\nU 9129 ; WX 750 ; N uni23A9 ; G 3521\nU 9130 ; WX 750 ; N uni23AA ; G 3522\nU 9131 ; WX 750 ; N uni23AB ; G 3523\nU 9132 ; WX 750 ; N uni23AC ; G 3524\nU 9133 ; WX 750 ; N uni23AD ; G 3525\nU 9134 ; WX 521 ; N uni23AE ; G 3526\nU 9166 ; WX 838 ; N uni23CE ; G 3527\nU 9167 ; WX 945 ; N uni23CF ; G 3528\nU 9187 ; WX 873 ; N uni23E3 ; G 3529\nU 9189 ; WX 769 ; N uni23E5 ; G 3530\nU 9192 ; WX 636 ; N uni23E8 ; G 3531\nU 9250 ; WX 635 ; N uni2422 ; G 3532\nU 9251 ; WX 635 ; N uni2423 ; G 3533\nU 9312 ; WX 896 ; N uni2460 ; G 3534\nU 9313 ; WX 896 ; N uni2461 ; G 3535\nU 9314 ; WX 896 ; N uni2462 ; G 3536\nU 9315 ; WX 896 ; N uni2463 ; G 3537\nU 9316 ; WX 896 ; N uni2464 ; G 3538\nU 9317 ; WX 896 ; N uni2465 ; G 3539\nU 9318 ; WX 896 ; N uni2466 ; G 3540\nU 9319 ; WX 896 ; N uni2467 ; G 3541\nU 9320 ; WX 896 ; N uni2468 ; G 3542\nU 9321 ; WX 896 ; N uni2469 ; G 3543\nU 9472 ; WX 602 ; N SF100000 ; G 3544\nU 9473 ; WX 602 ; N uni2501 ; G 3545\nU 9474 ; WX 602 ; N SF110000 ; G 3546\nU 9475 ; WX 602 ; N uni2503 ; G 3547\nU 9476 ; WX 602 ; N uni2504 ; G 3548\nU 9477 ; WX 602 ; N uni2505 ; G 3549\nU 9478 ; WX 602 ; N uni2506 ; G 3550\nU 9479 ; WX 602 ; N uni2507 ; G 3551\nU 9480 ; WX 602 ; N uni2508 ; G 3552\nU 9481 ; WX 602 ; N uni2509 ; G 3553\nU 9482 ; WX 602 ; N uni250A ; G 3554\nU 9483 ; WX 602 ; N uni250B ; G 3555\nU 9484 ; WX 602 ; N SF010000 ; G 3556\nU 9485 ; WX 602 ; N uni250D ; G 3557\nU 9486 ; WX 602 ; N uni250E ; G 3558\nU 9487 ; WX 602 ; N uni250F ; G 3559\nU 9488 ; WX 602 ; N SF030000 ; G 3560\nU 9489 ; WX 602 ; N uni2511 ; G 3561\nU 9490 ; WX 602 ; N uni2512 ; G 3562\nU 9491 ; WX 602 ; N uni2513 ; G 3563\nU 9492 ; WX 602 ; N SF020000 ; G 3564\nU 9493 ; WX 602 ; N uni2515 ; G 3565\nU 9494 ; WX 602 ; N uni2516 ; G 3566\nU 9495 ; WX 602 ; N uni2517 ; G 3567\nU 9496 ; WX 602 ; N SF040000 ; G 3568\nU 9497 ; WX 602 ; N uni2519 ; G 3569\nU 9498 ; WX 602 ; N uni251A ; G 3570\nU 9499 ; WX 602 ; N uni251B ; G 3571\nU 9500 ; WX 602 ; N SF080000 ; G 3572\nU 9501 ; WX 602 ; N uni251D ; G 3573\nU 9502 ; WX 602 ; N uni251E ; G 3574\nU 9503 ; WX 602 ; N uni251F ; G 3575\nU 9504 ; WX 602 ; N uni2520 ; G 3576\nU 9505 ; WX 602 ; N uni2521 ; G 3577\nU 9506 ; WX 602 ; N uni2522 ; G 3578\nU 9507 ; WX 602 ; N uni2523 ; G 3579\nU 9508 ; WX 602 ; N SF090000 ; G 3580\nU 9509 ; WX 602 ; N uni2525 ; G 3581\nU 9510 ; WX 602 ; N uni2526 ; G 3582\nU 9511 ; WX 602 ; N uni2527 ; G 3583\nU 9512 ; WX 602 ; N uni2528 ; G 3584\nU 9513 ; WX 602 ; N uni2529 ; G 3585\nU 9514 ; WX 602 ; N uni252A ; G 3586\nU 9515 ; WX 602 ; N uni252B ; G 3587\nU 9516 ; WX 602 ; N SF060000 ; G 3588\nU 9517 ; WX 602 ; N uni252D ; G 3589\nU 9518 ; WX 602 ; N uni252E ; G 3590\nU 9519 ; WX 602 ; N uni252F ; G 3591\nU 9520 ; WX 602 ; N uni2530 ; G 3592\nU 9521 ; WX 602 ; N uni2531 ; G 3593\nU 9522 ; WX 602 ; N uni2532 ; G 3594\nU 9523 ; WX 602 ; N uni2533 ; G 3595\nU 9524 ; WX 602 ; N SF070000 ; G 3596\nU 9525 ; WX 602 ; N uni2535 ; G 3597\nU 9526 ; WX 602 ; N uni2536 ; G 3598\nU 9527 ; WX 602 ; N uni2537 ; G 3599\nU 9528 ; WX 602 ; N uni2538 ; G 3600\nU 9529 ; WX 602 ; N uni2539 ; G 3601\nU 9530 ; WX 602 ; N uni253A ; G 3602\nU 9531 ; WX 602 ; N uni253B ; G 3603\nU 9532 ; WX 602 ; N SF050000 ; G 3604\nU 9533 ; WX 602 ; N uni253D ; G 3605\nU 9534 ; WX 602 ; N uni253E ; G 3606\nU 9535 ; WX 602 ; N uni253F ; G 3607\nU 9536 ; WX 602 ; N uni2540 ; G 3608\nU 9537 ; WX 602 ; N uni2541 ; G 3609\nU 9538 ; WX 602 ; N uni2542 ; G 3610\nU 9539 ; WX 602 ; N uni2543 ; G 3611\nU 9540 ; WX 602 ; N uni2544 ; G 3612\nU 9541 ; WX 602 ; N uni2545 ; G 3613\nU 9542 ; WX 602 ; N uni2546 ; G 3614\nU 9543 ; WX 602 ; N uni2547 ; G 3615\nU 9544 ; WX 602 ; N uni2548 ; G 3616\nU 9545 ; WX 602 ; N uni2549 ; G 3617\nU 9546 ; WX 602 ; N uni254A ; G 3618\nU 9547 ; WX 602 ; N uni254B ; G 3619\nU 9548 ; WX 602 ; N uni254C ; G 3620\nU 9549 ; WX 602 ; N uni254D ; G 3621\nU 9550 ; WX 602 ; N uni254E ; G 3622\nU 9551 ; WX 602 ; N uni254F ; G 3623\nU 9552 ; WX 602 ; N SF430000 ; G 3624\nU 9553 ; WX 602 ; N SF240000 ; G 3625\nU 9554 ; WX 602 ; N SF510000 ; G 3626\nU 9555 ; WX 602 ; N SF520000 ; G 3627\nU 9556 ; WX 602 ; N SF390000 ; G 3628\nU 9557 ; WX 602 ; N SF220000 ; G 3629\nU 9558 ; WX 602 ; N SF210000 ; G 3630\nU 9559 ; WX 602 ; N SF250000 ; G 3631\nU 9560 ; WX 602 ; N SF500000 ; G 3632\nU 9561 ; WX 602 ; N SF490000 ; G 3633\nU 9562 ; WX 602 ; N SF380000 ; G 3634\nU 9563 ; WX 602 ; N SF280000 ; G 3635\nU 9564 ; WX 602 ; N SF270000 ; G 3636\nU 9565 ; WX 602 ; N SF260000 ; G 3637\nU 9566 ; WX 602 ; N SF360000 ; G 3638\nU 9567 ; WX 602 ; N SF370000 ; G 3639\nU 9568 ; WX 602 ; N SF420000 ; G 3640\nU 9569 ; WX 602 ; N SF190000 ; G 3641\nU 9570 ; WX 602 ; N SF200000 ; G 3642\nU 9571 ; WX 602 ; N SF230000 ; G 3643\nU 9572 ; WX 602 ; N SF470000 ; G 3644\nU 9573 ; WX 602 ; N SF480000 ; G 3645\nU 9574 ; WX 602 ; N SF410000 ; G 3646\nU 9575 ; WX 602 ; N SF450000 ; G 3647\nU 9576 ; WX 602 ; N SF460000 ; G 3648\nU 9577 ; WX 602 ; N SF400000 ; G 3649\nU 9578 ; WX 602 ; N SF540000 ; G 3650\nU 9579 ; WX 602 ; N SF530000 ; G 3651\nU 9580 ; WX 602 ; N SF440000 ; G 3652\nU 9581 ; WX 602 ; N uni256D ; G 3653\nU 9582 ; WX 602 ; N uni256E ; G 3654\nU 9583 ; WX 602 ; N uni256F ; G 3655\nU 9584 ; WX 602 ; N uni2570 ; G 3656\nU 9585 ; WX 602 ; N uni2571 ; G 3657\nU 9586 ; WX 602 ; N uni2572 ; G 3658\nU 9587 ; WX 602 ; N uni2573 ; G 3659\nU 9588 ; WX 602 ; N uni2574 ; G 3660\nU 9589 ; WX 602 ; N uni2575 ; G 3661\nU 9590 ; WX 602 ; N uni2576 ; G 3662\nU 9591 ; WX 602 ; N uni2577 ; G 3663\nU 9592 ; WX 602 ; N uni2578 ; G 3664\nU 9593 ; WX 602 ; N uni2579 ; G 3665\nU 9594 ; WX 602 ; N uni257A ; G 3666\nU 9595 ; WX 602 ; N uni257B ; G 3667\nU 9596 ; WX 602 ; N uni257C ; G 3668\nU 9597 ; WX 602 ; N uni257D ; G 3669\nU 9598 ; WX 602 ; N uni257E ; G 3670\nU 9599 ; WX 602 ; N uni257F ; G 3671\nU 9600 ; WX 769 ; N upblock ; G 3672\nU 9601 ; WX 769 ; N uni2581 ; G 3673\nU 9602 ; WX 769 ; N uni2582 ; G 3674\nU 9603 ; WX 769 ; N uni2583 ; G 3675\nU 9604 ; WX 769 ; N dnblock ; G 3676\nU 9605 ; WX 769 ; N uni2585 ; G 3677\nU 9606 ; WX 769 ; N uni2586 ; G 3678\nU 9607 ; WX 769 ; N uni2587 ; G 3679\nU 9608 ; WX 769 ; N block ; G 3680\nU 9609 ; WX 769 ; N uni2589 ; G 3681\nU 9610 ; WX 769 ; N uni258A ; G 3682\nU 9611 ; WX 769 ; N uni258B ; G 3683\nU 9612 ; WX 769 ; N lfblock ; G 3684\nU 9613 ; WX 769 ; N uni258D ; G 3685\nU 9614 ; WX 769 ; N uni258E ; G 3686\nU 9615 ; WX 769 ; N uni258F ; G 3687\nU 9616 ; WX 769 ; N rtblock ; G 3688\nU 9617 ; WX 769 ; N ltshade ; G 3689\nU 9618 ; WX 769 ; N shade ; G 3690\nU 9619 ; WX 769 ; N dkshade ; G 3691\nU 9620 ; WX 769 ; N uni2594 ; G 3692\nU 9621 ; WX 769 ; N uni2595 ; G 3693\nU 9622 ; WX 769 ; N uni2596 ; G 3694\nU 9623 ; WX 769 ; N uni2597 ; G 3695\nU 9624 ; WX 769 ; N uni2598 ; G 3696\nU 9625 ; WX 769 ; N uni2599 ; G 3697\nU 9626 ; WX 769 ; N uni259A ; G 3698\nU 9627 ; WX 769 ; N uni259B ; G 3699\nU 9628 ; WX 769 ; N uni259C ; G 3700\nU 9629 ; WX 769 ; N uni259D ; G 3701\nU 9630 ; WX 769 ; N uni259E ; G 3702\nU 9631 ; WX 769 ; N uni259F ; G 3703\nU 9632 ; WX 945 ; N filledbox ; G 3704\nU 9633 ; WX 945 ; N H22073 ; G 3705\nU 9634 ; WX 945 ; N uni25A2 ; G 3706\nU 9635 ; WX 945 ; N uni25A3 ; G 3707\nU 9636 ; WX 945 ; N uni25A4 ; G 3708\nU 9637 ; WX 945 ; N uni25A5 ; G 3709\nU 9638 ; WX 945 ; N uni25A6 ; G 3710\nU 9639 ; WX 945 ; N uni25A7 ; G 3711\nU 9640 ; WX 945 ; N uni25A8 ; G 3712\nU 9641 ; WX 945 ; N uni25A9 ; G 3713\nU 9642 ; WX 678 ; N H18543 ; G 3714\nU 9643 ; WX 678 ; N H18551 ; G 3715\nU 9644 ; WX 945 ; N filledrect ; G 3716\nU 9645 ; WX 945 ; N uni25AD ; G 3717\nU 9646 ; WX 550 ; N uni25AE ; G 3718\nU 9647 ; WX 550 ; N uni25AF ; G 3719\nU 9648 ; WX 769 ; N uni25B0 ; G 3720\nU 9649 ; WX 769 ; N uni25B1 ; G 3721\nU 9650 ; WX 769 ; N triagup ; G 3722\nU 9651 ; WX 769 ; N uni25B3 ; G 3723\nU 9652 ; WX 502 ; N uni25B4 ; G 3724\nU 9653 ; WX 502 ; N uni25B5 ; G 3725\nU 9654 ; WX 769 ; N uni25B6 ; G 3726\nU 9655 ; WX 769 ; N uni25B7 ; G 3727\nU 9656 ; WX 502 ; N uni25B8 ; G 3728\nU 9657 ; WX 502 ; N uni25B9 ; G 3729\nU 9658 ; WX 769 ; N triagrt ; G 3730\nU 9659 ; WX 769 ; N uni25BB ; G 3731\nU 9660 ; WX 769 ; N triagdn ; G 3732\nU 9661 ; WX 769 ; N uni25BD ; G 3733\nU 9662 ; WX 502 ; N uni25BE ; G 3734\nU 9663 ; WX 502 ; N uni25BF ; G 3735\nU 9664 ; WX 769 ; N uni25C0 ; G 3736\nU 9665 ; WX 769 ; N uni25C1 ; G 3737\nU 9666 ; WX 502 ; N uni25C2 ; G 3738\nU 9667 ; WX 502 ; N uni25C3 ; G 3739\nU 9668 ; WX 769 ; N triaglf ; G 3740\nU 9669 ; WX 769 ; N uni25C5 ; G 3741\nU 9670 ; WX 769 ; N uni25C6 ; G 3742\nU 9671 ; WX 769 ; N uni25C7 ; G 3743\nU 9672 ; WX 769 ; N uni25C8 ; G 3744\nU 9673 ; WX 873 ; N uni25C9 ; G 3745\nU 9674 ; WX 494 ; N lozenge ; G 3746\nU 9675 ; WX 873 ; N circle ; G 3747\nU 9676 ; WX 873 ; N uni25CC ; G 3748\nU 9677 ; WX 873 ; N uni25CD ; G 3749\nU 9678 ; WX 873 ; N uni25CE ; G 3750\nU 9679 ; WX 873 ; N H18533 ; G 3751\nU 9680 ; WX 873 ; N uni25D0 ; G 3752\nU 9681 ; WX 873 ; N uni25D1 ; G 3753\nU 9682 ; WX 873 ; N uni25D2 ; G 3754\nU 9683 ; WX 873 ; N uni25D3 ; G 3755\nU 9684 ; WX 873 ; N uni25D4 ; G 3756\nU 9685 ; WX 873 ; N uni25D5 ; G 3757\nU 9686 ; WX 527 ; N uni25D6 ; G 3758\nU 9687 ; WX 527 ; N uni25D7 ; G 3759\nU 9688 ; WX 791 ; N invbullet ; G 3760\nU 9689 ; WX 970 ; N invcircle ; G 3761\nU 9690 ; WX 970 ; N uni25DA ; G 3762\nU 9691 ; WX 970 ; N uni25DB ; G 3763\nU 9692 ; WX 387 ; N uni25DC ; G 3764\nU 9693 ; WX 387 ; N uni25DD ; G 3765\nU 9694 ; WX 387 ; N uni25DE ; G 3766\nU 9695 ; WX 387 ; N uni25DF ; G 3767\nU 9696 ; WX 873 ; N uni25E0 ; G 3768\nU 9697 ; WX 873 ; N uni25E1 ; G 3769\nU 9698 ; WX 769 ; N uni25E2 ; G 3770\nU 9699 ; WX 769 ; N uni25E3 ; G 3771\nU 9700 ; WX 769 ; N uni25E4 ; G 3772\nU 9701 ; WX 769 ; N uni25E5 ; G 3773\nU 9702 ; WX 590 ; N openbullet ; G 3774\nU 9703 ; WX 945 ; N uni25E7 ; G 3775\nU 9704 ; WX 945 ; N uni25E8 ; G 3776\nU 9705 ; WX 945 ; N uni25E9 ; G 3777\nU 9706 ; WX 945 ; N uni25EA ; G 3778\nU 9707 ; WX 945 ; N uni25EB ; G 3779\nU 9708 ; WX 769 ; N uni25EC ; G 3780\nU 9709 ; WX 769 ; N uni25ED ; G 3781\nU 9710 ; WX 769 ; N uni25EE ; G 3782\nU 9711 ; WX 1119 ; N uni25EF ; G 3783\nU 9712 ; WX 945 ; N uni25F0 ; G 3784\nU 9713 ; WX 945 ; N uni25F1 ; G 3785\nU 9714 ; WX 945 ; N uni25F2 ; G 3786\nU 9715 ; WX 945 ; N uni25F3 ; G 3787\nU 9716 ; WX 873 ; N uni25F4 ; G 3788\nU 9717 ; WX 873 ; N uni25F5 ; G 3789\nU 9718 ; WX 873 ; N uni25F6 ; G 3790\nU 9719 ; WX 873 ; N uni25F7 ; G 3791\nU 9720 ; WX 769 ; N uni25F8 ; G 3792\nU 9721 ; WX 769 ; N uni25F9 ; G 3793\nU 9722 ; WX 769 ; N uni25FA ; G 3794\nU 9723 ; WX 830 ; N uni25FB ; G 3795\nU 9724 ; WX 830 ; N uni25FC ; G 3796\nU 9725 ; WX 732 ; N uni25FD ; G 3797\nU 9726 ; WX 732 ; N uni25FE ; G 3798\nU 9727 ; WX 769 ; N uni25FF ; G 3799\nU 9728 ; WX 896 ; N uni2600 ; G 3800\nU 9729 ; WX 1000 ; N uni2601 ; G 3801\nU 9730 ; WX 896 ; N uni2602 ; G 3802\nU 9731 ; WX 896 ; N uni2603 ; G 3803\nU 9732 ; WX 896 ; N uni2604 ; G 3804\nU 9733 ; WX 896 ; N uni2605 ; G 3805\nU 9734 ; WX 896 ; N uni2606 ; G 3806\nU 9735 ; WX 573 ; N uni2607 ; G 3807\nU 9736 ; WX 896 ; N uni2608 ; G 3808\nU 9737 ; WX 896 ; N uni2609 ; G 3809\nU 9738 ; WX 888 ; N uni260A ; G 3810\nU 9739 ; WX 888 ; N uni260B ; G 3811\nU 9740 ; WX 671 ; N uni260C ; G 3812\nU 9741 ; WX 1013 ; N uni260D ; G 3813\nU 9742 ; WX 1246 ; N uni260E ; G 3814\nU 9743 ; WX 1250 ; N uni260F ; G 3815\nU 9744 ; WX 896 ; N uni2610 ; G 3816\nU 9745 ; WX 896 ; N uni2611 ; G 3817\nU 9746 ; WX 896 ; N uni2612 ; G 3818\nU 9747 ; WX 532 ; N uni2613 ; G 3819\nU 9748 ; WX 896 ; N uni2614 ; G 3820\nU 9749 ; WX 896 ; N uni2615 ; G 3821\nU 9750 ; WX 896 ; N uni2616 ; G 3822\nU 9751 ; WX 896 ; N uni2617 ; G 3823\nU 9752 ; WX 896 ; N uni2618 ; G 3824\nU 9753 ; WX 896 ; N uni2619 ; G 3825\nU 9754 ; WX 896 ; N uni261A ; G 3826\nU 9755 ; WX 896 ; N uni261B ; G 3827\nU 9756 ; WX 896 ; N uni261C ; G 3828\nU 9757 ; WX 609 ; N uni261D ; G 3829\nU 9758 ; WX 896 ; N uni261E ; G 3830\nU 9759 ; WX 609 ; N uni261F ; G 3831\nU 9760 ; WX 896 ; N uni2620 ; G 3832\nU 9761 ; WX 896 ; N uni2621 ; G 3833\nU 9762 ; WX 896 ; N uni2622 ; G 3834\nU 9763 ; WX 896 ; N uni2623 ; G 3835\nU 9764 ; WX 669 ; N uni2624 ; G 3836\nU 9765 ; WX 746 ; N uni2625 ; G 3837\nU 9766 ; WX 649 ; N uni2626 ; G 3838\nU 9767 ; WX 784 ; N uni2627 ; G 3839\nU 9768 ; WX 545 ; N uni2628 ; G 3840\nU 9769 ; WX 896 ; N uni2629 ; G 3841\nU 9770 ; WX 896 ; N uni262A ; G 3842\nU 9771 ; WX 896 ; N uni262B ; G 3843\nU 9772 ; WX 710 ; N uni262C ; G 3844\nU 9773 ; WX 896 ; N uni262D ; G 3845\nU 9774 ; WX 896 ; N uni262E ; G 3846\nU 9775 ; WX 896 ; N uni262F ; G 3847\nU 9776 ; WX 896 ; N uni2630 ; G 3848\nU 9777 ; WX 896 ; N uni2631 ; G 3849\nU 9778 ; WX 896 ; N uni2632 ; G 3850\nU 9779 ; WX 896 ; N uni2633 ; G 3851\nU 9780 ; WX 896 ; N uni2634 ; G 3852\nU 9781 ; WX 896 ; N uni2635 ; G 3853\nU 9782 ; WX 896 ; N uni2636 ; G 3854\nU 9783 ; WX 896 ; N uni2637 ; G 3855\nU 9784 ; WX 896 ; N uni2638 ; G 3856\nU 9785 ; WX 1042 ; N uni2639 ; G 3857\nU 9786 ; WX 1042 ; N smileface ; G 3858\nU 9787 ; WX 1042 ; N invsmileface ; G 3859\nU 9788 ; WX 896 ; N sun ; G 3860\nU 9789 ; WX 896 ; N uni263D ; G 3861\nU 9790 ; WX 896 ; N uni263E ; G 3862\nU 9791 ; WX 614 ; N uni263F ; G 3863\nU 9792 ; WX 732 ; N female ; G 3864\nU 9793 ; WX 732 ; N uni2641 ; G 3865\nU 9794 ; WX 896 ; N male ; G 3866\nU 9795 ; WX 896 ; N uni2643 ; G 3867\nU 9796 ; WX 896 ; N uni2644 ; G 3868\nU 9797 ; WX 896 ; N uni2645 ; G 3869\nU 9798 ; WX 896 ; N uni2646 ; G 3870\nU 9799 ; WX 896 ; N uni2647 ; G 3871\nU 9800 ; WX 896 ; N uni2648 ; G 3872\nU 9801 ; WX 896 ; N uni2649 ; G 3873\nU 9802 ; WX 896 ; N uni264A ; G 3874\nU 9803 ; WX 896 ; N uni264B ; G 3875\nU 9804 ; WX 896 ; N uni264C ; G 3876\nU 9805 ; WX 896 ; N uni264D ; G 3877\nU 9806 ; WX 896 ; N uni264E ; G 3878\nU 9807 ; WX 896 ; N uni264F ; G 3879\nU 9808 ; WX 896 ; N uni2650 ; G 3880\nU 9809 ; WX 896 ; N uni2651 ; G 3881\nU 9810 ; WX 896 ; N uni2652 ; G 3882\nU 9811 ; WX 896 ; N uni2653 ; G 3883\nU 9812 ; WX 896 ; N uni2654 ; G 3884\nU 9813 ; WX 896 ; N uni2655 ; G 3885\nU 9814 ; WX 896 ; N uni2656 ; G 3886\nU 9815 ; WX 896 ; N uni2657 ; G 3887\nU 9816 ; WX 896 ; N uni2658 ; G 3888\nU 9817 ; WX 896 ; N uni2659 ; G 3889\nU 9818 ; WX 896 ; N uni265A ; G 3890\nU 9819 ; WX 896 ; N uni265B ; G 3891\nU 9820 ; WX 896 ; N uni265C ; G 3892\nU 9821 ; WX 896 ; N uni265D ; G 3893\nU 9822 ; WX 896 ; N uni265E ; G 3894\nU 9823 ; WX 896 ; N uni265F ; G 3895\nU 9824 ; WX 896 ; N spade ; G 3896\nU 9825 ; WX 896 ; N uni2661 ; G 3897\nU 9826 ; WX 896 ; N uni2662 ; G 3898\nU 9827 ; WX 896 ; N club ; G 3899\nU 9828 ; WX 896 ; N uni2664 ; G 3900\nU 9829 ; WX 896 ; N heart ; G 3901\nU 9830 ; WX 896 ; N diamond ; G 3902\nU 9831 ; WX 896 ; N uni2667 ; G 3903\nU 9832 ; WX 896 ; N uni2668 ; G 3904\nU 9833 ; WX 472 ; N uni2669 ; G 3905\nU 9834 ; WX 638 ; N musicalnote ; G 3906\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3907\nU 9836 ; WX 896 ; N uni266C ; G 3908\nU 9837 ; WX 472 ; N uni266D ; G 3909\nU 9838 ; WX 357 ; N uni266E ; G 3910\nU 9839 ; WX 484 ; N uni266F ; G 3911\nU 9840 ; WX 748 ; N uni2670 ; G 3912\nU 9841 ; WX 766 ; N uni2671 ; G 3913\nU 9842 ; WX 896 ; N uni2672 ; G 3914\nU 9843 ; WX 896 ; N uni2673 ; G 3915\nU 9844 ; WX 896 ; N uni2674 ; G 3916\nU 9845 ; WX 896 ; N uni2675 ; G 3917\nU 9846 ; WX 896 ; N uni2676 ; G 3918\nU 9847 ; WX 896 ; N uni2677 ; G 3919\nU 9848 ; WX 896 ; N uni2678 ; G 3920\nU 9849 ; WX 896 ; N uni2679 ; G 3921\nU 9850 ; WX 896 ; N uni267A ; G 3922\nU 9851 ; WX 896 ; N uni267B ; G 3923\nU 9852 ; WX 896 ; N uni267C ; G 3924\nU 9853 ; WX 896 ; N uni267D ; G 3925\nU 9854 ; WX 896 ; N uni267E ; G 3926\nU 9855 ; WX 896 ; N uni267F ; G 3927\nU 9856 ; WX 869 ; N uni2680 ; G 3928\nU 9857 ; WX 869 ; N uni2681 ; G 3929\nU 9858 ; WX 869 ; N uni2682 ; G 3930\nU 9859 ; WX 869 ; N uni2683 ; G 3931\nU 9860 ; WX 869 ; N uni2684 ; G 3932\nU 9861 ; WX 869 ; N uni2685 ; G 3933\nU 9862 ; WX 896 ; N uni2686 ; G 3934\nU 9863 ; WX 896 ; N uni2687 ; G 3935\nU 9864 ; WX 896 ; N uni2688 ; G 3936\nU 9865 ; WX 896 ; N uni2689 ; G 3937\nU 9866 ; WX 896 ; N uni268A ; G 3938\nU 9867 ; WX 896 ; N uni268B ; G 3939\nU 9868 ; WX 896 ; N uni268C ; G 3940\nU 9869 ; WX 896 ; N uni268D ; G 3941\nU 9870 ; WX 896 ; N uni268E ; G 3942\nU 9871 ; WX 896 ; N uni268F ; G 3943\nU 9872 ; WX 896 ; N uni2690 ; G 3944\nU 9873 ; WX 896 ; N uni2691 ; G 3945\nU 9874 ; WX 896 ; N uni2692 ; G 3946\nU 9875 ; WX 896 ; N uni2693 ; G 3947\nU 9876 ; WX 896 ; N uni2694 ; G 3948\nU 9877 ; WX 541 ; N uni2695 ; G 3949\nU 9878 ; WX 896 ; N uni2696 ; G 3950\nU 9879 ; WX 896 ; N uni2697 ; G 3951\nU 9880 ; WX 896 ; N uni2698 ; G 3952\nU 9881 ; WX 896 ; N uni2699 ; G 3953\nU 9882 ; WX 896 ; N uni269A ; G 3954\nU 9883 ; WX 896 ; N uni269B ; G 3955\nU 9884 ; WX 896 ; N uni269C ; G 3956\nU 9886 ; WX 896 ; N uni269E ; G 3957\nU 9887 ; WX 896 ; N uni269F ; G 3958\nU 9888 ; WX 896 ; N uni26A0 ; G 3959\nU 9889 ; WX 702 ; N uni26A1 ; G 3960\nU 9890 ; WX 1004 ; N uni26A2 ; G 3961\nU 9891 ; WX 1089 ; N uni26A3 ; G 3962\nU 9892 ; WX 1175 ; N uni26A4 ; G 3963\nU 9893 ; WX 903 ; N uni26A5 ; G 3964\nU 9894 ; WX 838 ; N uni26A6 ; G 3965\nU 9895 ; WX 838 ; N uni26A7 ; G 3966\nU 9896 ; WX 838 ; N uni26A8 ; G 3967\nU 9897 ; WX 838 ; N uni26A9 ; G 3968\nU 9898 ; WX 838 ; N uni26AA ; G 3969\nU 9899 ; WX 838 ; N uni26AB ; G 3970\nU 9900 ; WX 838 ; N uni26AC ; G 3971\nU 9901 ; WX 838 ; N uni26AD ; G 3972\nU 9902 ; WX 838 ; N uni26AE ; G 3973\nU 9903 ; WX 838 ; N uni26AF ; G 3974\nU 9904 ; WX 844 ; N uni26B0 ; G 3975\nU 9905 ; WX 838 ; N uni26B1 ; G 3976\nU 9906 ; WX 732 ; N uni26B2 ; G 3977\nU 9907 ; WX 732 ; N uni26B3 ; G 3978\nU 9908 ; WX 732 ; N uni26B4 ; G 3979\nU 9909 ; WX 732 ; N uni26B5 ; G 3980\nU 9910 ; WX 850 ; N uni26B6 ; G 3981\nU 9911 ; WX 732 ; N uni26B7 ; G 3982\nU 9912 ; WX 732 ; N uni26B8 ; G 3983\nU 9920 ; WX 838 ; N uni26C0 ; G 3984\nU 9921 ; WX 838 ; N uni26C1 ; G 3985\nU 9922 ; WX 838 ; N uni26C2 ; G 3986\nU 9923 ; WX 838 ; N uni26C3 ; G 3987\nU 9954 ; WX 732 ; N uni26E2 ; G 3988\nU 9985 ; WX 838 ; N uni2701 ; G 3989\nU 9986 ; WX 838 ; N uni2702 ; G 3990\nU 9987 ; WX 838 ; N uni2703 ; G 3991\nU 9988 ; WX 838 ; N uni2704 ; G 3992\nU 9990 ; WX 838 ; N uni2706 ; G 3993\nU 9991 ; WX 838 ; N uni2707 ; G 3994\nU 9992 ; WX 838 ; N uni2708 ; G 3995\nU 9993 ; WX 838 ; N uni2709 ; G 3996\nU 9996 ; WX 838 ; N uni270C ; G 3997\nU 9997 ; WX 838 ; N uni270D ; G 3998\nU 9998 ; WX 838 ; N uni270E ; G 3999\nU 9999 ; WX 838 ; N uni270F ; G 4000\nU 10000 ; WX 838 ; N uni2710 ; G 4001\nU 10001 ; WX 838 ; N uni2711 ; G 4002\nU 10002 ; WX 838 ; N uni2712 ; G 4003\nU 10003 ; WX 838 ; N uni2713 ; G 4004\nU 10004 ; WX 838 ; N uni2714 ; G 4005\nU 10005 ; WX 838 ; N uni2715 ; G 4006\nU 10006 ; WX 838 ; N uni2716 ; G 4007\nU 10007 ; WX 838 ; N uni2717 ; G 4008\nU 10008 ; WX 838 ; N uni2718 ; G 4009\nU 10009 ; WX 838 ; N uni2719 ; G 4010\nU 10010 ; WX 838 ; N uni271A ; G 4011\nU 10011 ; WX 838 ; N uni271B ; G 4012\nU 10012 ; WX 838 ; N uni271C ; G 4013\nU 10013 ; WX 838 ; N uni271D ; G 4014\nU 10014 ; WX 838 ; N uni271E ; G 4015\nU 10015 ; WX 838 ; N uni271F ; G 4016\nU 10016 ; WX 838 ; N uni2720 ; G 4017\nU 10017 ; WX 838 ; N uni2721 ; G 4018\nU 10018 ; WX 838 ; N uni2722 ; G 4019\nU 10019 ; WX 838 ; N uni2723 ; G 4020\nU 10020 ; WX 838 ; N uni2724 ; G 4021\nU 10021 ; WX 838 ; N uni2725 ; G 4022\nU 10022 ; WX 838 ; N uni2726 ; G 4023\nU 10023 ; WX 838 ; N uni2727 ; G 4024\nU 10025 ; WX 838 ; N uni2729 ; G 4025\nU 10026 ; WX 838 ; N uni272A ; G 4026\nU 10027 ; WX 838 ; N uni272B ; G 4027\nU 10028 ; WX 838 ; N uni272C ; G 4028\nU 10029 ; WX 838 ; N uni272D ; G 4029\nU 10030 ; WX 838 ; N uni272E ; G 4030\nU 10031 ; WX 838 ; N uni272F ; G 4031\nU 10032 ; WX 838 ; N uni2730 ; G 4032\nU 10033 ; WX 838 ; N uni2731 ; G 4033\nU 10034 ; WX 838 ; N uni2732 ; G 4034\nU 10035 ; WX 838 ; N uni2733 ; G 4035\nU 10036 ; WX 838 ; N uni2734 ; G 4036\nU 10037 ; WX 838 ; N uni2735 ; G 4037\nU 10038 ; WX 838 ; N uni2736 ; G 4038\nU 10039 ; WX 838 ; N uni2737 ; G 4039\nU 10040 ; WX 838 ; N uni2738 ; G 4040\nU 10041 ; WX 838 ; N uni2739 ; G 4041\nU 10042 ; WX 838 ; N uni273A ; G 4042\nU 10043 ; WX 838 ; N uni273B ; G 4043\nU 10044 ; WX 838 ; N uni273C ; G 4044\nU 10045 ; WX 838 ; N uni273D ; G 4045\nU 10046 ; WX 838 ; N uni273E ; G 4046\nU 10047 ; WX 838 ; N uni273F ; G 4047\nU 10048 ; WX 838 ; N uni2740 ; G 4048\nU 10049 ; WX 838 ; N uni2741 ; G 4049\nU 10050 ; WX 838 ; N uni2742 ; G 4050\nU 10051 ; WX 838 ; N uni2743 ; G 4051\nU 10052 ; WX 838 ; N uni2744 ; G 4052\nU 10053 ; WX 838 ; N uni2745 ; G 4053\nU 10054 ; WX 838 ; N uni2746 ; G 4054\nU 10055 ; WX 838 ; N uni2747 ; G 4055\nU 10056 ; WX 838 ; N uni2748 ; G 4056\nU 10057 ; WX 838 ; N uni2749 ; G 4057\nU 10058 ; WX 838 ; N uni274A ; G 4058\nU 10059 ; WX 838 ; N uni274B ; G 4059\nU 10061 ; WX 896 ; N uni274D ; G 4060\nU 10063 ; WX 896 ; N uni274F ; G 4061\nU 10064 ; WX 896 ; N uni2750 ; G 4062\nU 10065 ; WX 896 ; N uni2751 ; G 4063\nU 10066 ; WX 896 ; N uni2752 ; G 4064\nU 10070 ; WX 896 ; N uni2756 ; G 4065\nU 10072 ; WX 838 ; N uni2758 ; G 4066\nU 10073 ; WX 838 ; N uni2759 ; G 4067\nU 10074 ; WX 838 ; N uni275A ; G 4068\nU 10075 ; WX 322 ; N uni275B ; G 4069\nU 10076 ; WX 322 ; N uni275C ; G 4070\nU 10077 ; WX 538 ; N uni275D ; G 4071\nU 10078 ; WX 538 ; N uni275E ; G 4072\nU 10081 ; WX 838 ; N uni2761 ; G 4073\nU 10082 ; WX 838 ; N uni2762 ; G 4074\nU 10083 ; WX 838 ; N uni2763 ; G 4075\nU 10084 ; WX 838 ; N uni2764 ; G 4076\nU 10085 ; WX 838 ; N uni2765 ; G 4077\nU 10086 ; WX 838 ; N uni2766 ; G 4078\nU 10087 ; WX 838 ; N uni2767 ; G 4079\nU 10088 ; WX 838 ; N uni2768 ; G 4080\nU 10089 ; WX 838 ; N uni2769 ; G 4081\nU 10090 ; WX 838 ; N uni276A ; G 4082\nU 10091 ; WX 838 ; N uni276B ; G 4083\nU 10092 ; WX 838 ; N uni276C ; G 4084\nU 10093 ; WX 838 ; N uni276D ; G 4085\nU 10094 ; WX 838 ; N uni276E ; G 4086\nU 10095 ; WX 838 ; N uni276F ; G 4087\nU 10096 ; WX 838 ; N uni2770 ; G 4088\nU 10097 ; WX 838 ; N uni2771 ; G 4089\nU 10098 ; WX 838 ; N uni2772 ; G 4090\nU 10099 ; WX 838 ; N uni2773 ; G 4091\nU 10100 ; WX 838 ; N uni2774 ; G 4092\nU 10101 ; WX 838 ; N uni2775 ; G 4093\nU 10102 ; WX 896 ; N uni2776 ; G 4094\nU 10103 ; WX 896 ; N uni2777 ; G 4095\nU 10104 ; WX 896 ; N uni2778 ; G 4096\nU 10105 ; WX 896 ; N uni2779 ; G 4097\nU 10106 ; WX 896 ; N uni277A ; G 4098\nU 10107 ; WX 896 ; N uni277B ; G 4099\nU 10108 ; WX 896 ; N uni277C ; G 4100\nU 10109 ; WX 896 ; N uni277D ; G 4101\nU 10110 ; WX 896 ; N uni277E ; G 4102\nU 10111 ; WX 896 ; N uni277F ; G 4103\nU 10112 ; WX 838 ; N uni2780 ; G 4104\nU 10113 ; WX 838 ; N uni2781 ; G 4105\nU 10114 ; WX 838 ; N uni2782 ; G 4106\nU 10115 ; WX 838 ; N uni2783 ; G 4107\nU 10116 ; WX 838 ; N uni2784 ; G 4108\nU 10117 ; WX 838 ; N uni2785 ; G 4109\nU 10118 ; WX 838 ; N uni2786 ; G 4110\nU 10119 ; WX 838 ; N uni2787 ; G 4111\nU 10120 ; WX 838 ; N uni2788 ; G 4112\nU 10121 ; WX 838 ; N uni2789 ; G 4113\nU 10122 ; WX 838 ; N uni278A ; G 4114\nU 10123 ; WX 838 ; N uni278B ; G 4115\nU 10124 ; WX 838 ; N uni278C ; G 4116\nU 10125 ; WX 838 ; N uni278D ; G 4117\nU 10126 ; WX 838 ; N uni278E ; G 4118\nU 10127 ; WX 838 ; N uni278F ; G 4119\nU 10128 ; WX 838 ; N uni2790 ; G 4120\nU 10129 ; WX 838 ; N uni2791 ; G 4121\nU 10130 ; WX 838 ; N uni2792 ; G 4122\nU 10131 ; WX 838 ; N uni2793 ; G 4123\nU 10132 ; WX 838 ; N uni2794 ; G 4124\nU 10136 ; WX 838 ; N uni2798 ; G 4125\nU 10137 ; WX 838 ; N uni2799 ; G 4126\nU 10138 ; WX 838 ; N uni279A ; G 4127\nU 10139 ; WX 838 ; N uni279B ; G 4128\nU 10140 ; WX 838 ; N uni279C ; G 4129\nU 10141 ; WX 838 ; N uni279D ; G 4130\nU 10142 ; WX 838 ; N uni279E ; G 4131\nU 10143 ; WX 838 ; N uni279F ; G 4132\nU 10144 ; WX 838 ; N uni27A0 ; G 4133\nU 10145 ; WX 838 ; N uni27A1 ; G 4134\nU 10146 ; WX 838 ; N uni27A2 ; G 4135\nU 10147 ; WX 838 ; N uni27A3 ; G 4136\nU 10148 ; WX 838 ; N uni27A4 ; G 4137\nU 10149 ; WX 838 ; N uni27A5 ; G 4138\nU 10150 ; WX 838 ; N uni27A6 ; G 4139\nU 10151 ; WX 838 ; N uni27A7 ; G 4140\nU 10152 ; WX 838 ; N uni27A8 ; G 4141\nU 10153 ; WX 838 ; N uni27A9 ; G 4142\nU 10154 ; WX 838 ; N uni27AA ; G 4143\nU 10155 ; WX 838 ; N uni27AB ; G 4144\nU 10156 ; WX 838 ; N uni27AC ; G 4145\nU 10157 ; WX 838 ; N uni27AD ; G 4146\nU 10158 ; WX 838 ; N uni27AE ; G 4147\nU 10159 ; WX 838 ; N uni27AF ; G 4148\nU 10161 ; WX 838 ; N uni27B1 ; G 4149\nU 10162 ; WX 838 ; N uni27B2 ; G 4150\nU 10163 ; WX 838 ; N uni27B3 ; G 4151\nU 10164 ; WX 838 ; N uni27B4 ; G 4152\nU 10165 ; WX 838 ; N uni27B5 ; G 4153\nU 10166 ; WX 838 ; N uni27B6 ; G 4154\nU 10167 ; WX 838 ; N uni27B7 ; G 4155\nU 10168 ; WX 838 ; N uni27B8 ; G 4156\nU 10169 ; WX 838 ; N uni27B9 ; G 4157\nU 10170 ; WX 838 ; N uni27BA ; G 4158\nU 10171 ; WX 838 ; N uni27BB ; G 4159\nU 10172 ; WX 838 ; N uni27BC ; G 4160\nU 10173 ; WX 838 ; N uni27BD ; G 4161\nU 10174 ; WX 838 ; N uni27BE ; G 4162\nU 10181 ; WX 390 ; N uni27C5 ; G 4163\nU 10182 ; WX 390 ; N uni27C6 ; G 4164\nU 10208 ; WX 494 ; N uni27E0 ; G 4165\nU 10214 ; WX 495 ; N uni27E6 ; G 4166\nU 10215 ; WX 495 ; N uni27E7 ; G 4167\nU 10216 ; WX 390 ; N uni27E8 ; G 4168\nU 10217 ; WX 390 ; N uni27E9 ; G 4169\nU 10218 ; WX 556 ; N uni27EA ; G 4170\nU 10219 ; WX 556 ; N uni27EB ; G 4171\nU 10224 ; WX 838 ; N uni27F0 ; G 4172\nU 10225 ; WX 838 ; N uni27F1 ; G 4173\nU 10226 ; WX 838 ; N uni27F2 ; G 4174\nU 10227 ; WX 838 ; N uni27F3 ; G 4175\nU 10228 ; WX 1157 ; N uni27F4 ; G 4176\nU 10229 ; WX 1434 ; N uni27F5 ; G 4177\nU 10230 ; WX 1434 ; N uni27F6 ; G 4178\nU 10231 ; WX 1434 ; N uni27F7 ; G 4179\nU 10232 ; WX 1434 ; N uni27F8 ; G 4180\nU 10233 ; WX 1434 ; N uni27F9 ; G 4181\nU 10234 ; WX 1434 ; N uni27FA ; G 4182\nU 10235 ; WX 1434 ; N uni27FB ; G 4183\nU 10236 ; WX 1434 ; N uni27FC ; G 4184\nU 10237 ; WX 1434 ; N uni27FD ; G 4185\nU 10238 ; WX 1434 ; N uni27FE ; G 4186\nU 10239 ; WX 1434 ; N uni27FF ; G 4187\nU 10240 ; WX 732 ; N uni2800 ; G 4188\nU 10241 ; WX 732 ; N uni2801 ; G 4189\nU 10242 ; WX 732 ; N uni2802 ; G 4190\nU 10243 ; WX 732 ; N uni2803 ; G 4191\nU 10244 ; WX 732 ; N uni2804 ; G 4192\nU 10245 ; WX 732 ; N uni2805 ; G 4193\nU 10246 ; WX 732 ; N uni2806 ; G 4194\nU 10247 ; WX 732 ; N uni2807 ; G 4195\nU 10248 ; WX 732 ; N uni2808 ; G 4196\nU 10249 ; WX 732 ; N uni2809 ; G 4197\nU 10250 ; WX 732 ; N uni280A ; G 4198\nU 10251 ; WX 732 ; N uni280B ; G 4199\nU 10252 ; WX 732 ; N uni280C ; G 4200\nU 10253 ; WX 732 ; N uni280D ; G 4201\nU 10254 ; WX 732 ; N uni280E ; G 4202\nU 10255 ; WX 732 ; N uni280F ; G 4203\nU 10256 ; WX 732 ; N uni2810 ; G 4204\nU 10257 ; WX 732 ; N uni2811 ; G 4205\nU 10258 ; WX 732 ; N uni2812 ; G 4206\nU 10259 ; WX 732 ; N uni2813 ; G 4207\nU 10260 ; WX 732 ; N uni2814 ; G 4208\nU 10261 ; WX 732 ; N uni2815 ; G 4209\nU 10262 ; WX 732 ; N uni2816 ; G 4210\nU 10263 ; WX 732 ; N uni2817 ; G 4211\nU 10264 ; WX 732 ; N uni2818 ; G 4212\nU 10265 ; WX 732 ; N uni2819 ; G 4213\nU 10266 ; WX 732 ; N uni281A ; G 4214\nU 10267 ; WX 732 ; N uni281B ; G 4215\nU 10268 ; WX 732 ; N uni281C ; G 4216\nU 10269 ; WX 732 ; N uni281D ; G 4217\nU 10270 ; WX 732 ; N uni281E ; G 4218\nU 10271 ; WX 732 ; N uni281F ; G 4219\nU 10272 ; WX 732 ; N uni2820 ; G 4220\nU 10273 ; WX 732 ; N uni2821 ; G 4221\nU 10274 ; WX 732 ; N uni2822 ; G 4222\nU 10275 ; WX 732 ; N uni2823 ; G 4223\nU 10276 ; WX 732 ; N uni2824 ; G 4224\nU 10277 ; WX 732 ; N uni2825 ; G 4225\nU 10278 ; WX 732 ; N uni2826 ; G 4226\nU 10279 ; WX 732 ; N uni2827 ; G 4227\nU 10280 ; WX 732 ; N uni2828 ; G 4228\nU 10281 ; WX 732 ; N uni2829 ; G 4229\nU 10282 ; WX 732 ; N uni282A ; G 4230\nU 10283 ; WX 732 ; N uni282B ; G 4231\nU 10284 ; WX 732 ; N uni282C ; G 4232\nU 10285 ; WX 732 ; N uni282D ; G 4233\nU 10286 ; WX 732 ; N uni282E ; G 4234\nU 10287 ; WX 732 ; N uni282F ; G 4235\nU 10288 ; WX 732 ; N uni2830 ; G 4236\nU 10289 ; WX 732 ; N uni2831 ; G 4237\nU 10290 ; WX 732 ; N uni2832 ; G 4238\nU 10291 ; WX 732 ; N uni2833 ; G 4239\nU 10292 ; WX 732 ; N uni2834 ; G 4240\nU 10293 ; WX 732 ; N uni2835 ; G 4241\nU 10294 ; WX 732 ; N uni2836 ; G 4242\nU 10295 ; WX 732 ; N uni2837 ; G 4243\nU 10296 ; WX 732 ; N uni2838 ; G 4244\nU 10297 ; WX 732 ; N uni2839 ; G 4245\nU 10298 ; WX 732 ; N uni283A ; G 4246\nU 10299 ; WX 732 ; N uni283B ; G 4247\nU 10300 ; WX 732 ; N uni283C ; G 4248\nU 10301 ; WX 732 ; N uni283D ; G 4249\nU 10302 ; WX 732 ; N uni283E ; G 4250\nU 10303 ; WX 732 ; N uni283F ; G 4251\nU 10304 ; WX 732 ; N uni2840 ; G 4252\nU 10305 ; WX 732 ; N uni2841 ; G 4253\nU 10306 ; WX 732 ; N uni2842 ; G 4254\nU 10307 ; WX 732 ; N uni2843 ; G 4255\nU 10308 ; WX 732 ; N uni2844 ; G 4256\nU 10309 ; WX 732 ; N uni2845 ; G 4257\nU 10310 ; WX 732 ; N uni2846 ; G 4258\nU 10311 ; WX 732 ; N uni2847 ; G 4259\nU 10312 ; WX 732 ; N uni2848 ; G 4260\nU 10313 ; WX 732 ; N uni2849 ; G 4261\nU 10314 ; WX 732 ; N uni284A ; G 4262\nU 10315 ; WX 732 ; N uni284B ; G 4263\nU 10316 ; WX 732 ; N uni284C ; G 4264\nU 10317 ; WX 732 ; N uni284D ; G 4265\nU 10318 ; WX 732 ; N uni284E ; G 4266\nU 10319 ; WX 732 ; N uni284F ; G 4267\nU 10320 ; WX 732 ; N uni2850 ; G 4268\nU 10321 ; WX 732 ; N uni2851 ; G 4269\nU 10322 ; WX 732 ; N uni2852 ; G 4270\nU 10323 ; WX 732 ; N uni2853 ; G 4271\nU 10324 ; WX 732 ; N uni2854 ; G 4272\nU 10325 ; WX 732 ; N uni2855 ; G 4273\nU 10326 ; WX 732 ; N uni2856 ; G 4274\nU 10327 ; WX 732 ; N uni2857 ; G 4275\nU 10328 ; WX 732 ; N uni2858 ; G 4276\nU 10329 ; WX 732 ; N uni2859 ; G 4277\nU 10330 ; WX 732 ; N uni285A ; G 4278\nU 10331 ; WX 732 ; N uni285B ; G 4279\nU 10332 ; WX 732 ; N uni285C ; G 4280\nU 10333 ; WX 732 ; N uni285D ; G 4281\nU 10334 ; WX 732 ; N uni285E ; G 4282\nU 10335 ; WX 732 ; N uni285F ; G 4283\nU 10336 ; WX 732 ; N uni2860 ; G 4284\nU 10337 ; WX 732 ; N uni2861 ; G 4285\nU 10338 ; WX 732 ; N uni2862 ; G 4286\nU 10339 ; WX 732 ; N uni2863 ; G 4287\nU 10340 ; WX 732 ; N uni2864 ; G 4288\nU 10341 ; WX 732 ; N uni2865 ; G 4289\nU 10342 ; WX 732 ; N uni2866 ; G 4290\nU 10343 ; WX 732 ; N uni2867 ; G 4291\nU 10344 ; WX 732 ; N uni2868 ; G 4292\nU 10345 ; WX 732 ; N uni2869 ; G 4293\nU 10346 ; WX 732 ; N uni286A ; G 4294\nU 10347 ; WX 732 ; N uni286B ; G 4295\nU 10348 ; WX 732 ; N uni286C ; G 4296\nU 10349 ; WX 732 ; N uni286D ; G 4297\nU 10350 ; WX 732 ; N uni286E ; G 4298\nU 10351 ; WX 732 ; N uni286F ; G 4299\nU 10352 ; WX 732 ; N uni2870 ; G 4300\nU 10353 ; WX 732 ; N uni2871 ; G 4301\nU 10354 ; WX 732 ; N uni2872 ; G 4302\nU 10355 ; WX 732 ; N uni2873 ; G 4303\nU 10356 ; WX 732 ; N uni2874 ; G 4304\nU 10357 ; WX 732 ; N uni2875 ; G 4305\nU 10358 ; WX 732 ; N uni2876 ; G 4306\nU 10359 ; WX 732 ; N uni2877 ; G 4307\nU 10360 ; WX 732 ; N uni2878 ; G 4308\nU 10361 ; WX 732 ; N uni2879 ; G 4309\nU 10362 ; WX 732 ; N uni287A ; G 4310\nU 10363 ; WX 732 ; N uni287B ; G 4311\nU 10364 ; WX 732 ; N uni287C ; G 4312\nU 10365 ; WX 732 ; N uni287D ; G 4313\nU 10366 ; WX 732 ; N uni287E ; G 4314\nU 10367 ; WX 732 ; N uni287F ; G 4315\nU 10368 ; WX 732 ; N uni2880 ; G 4316\nU 10369 ; WX 732 ; N uni2881 ; G 4317\nU 10370 ; WX 732 ; N uni2882 ; G 4318\nU 10371 ; WX 732 ; N uni2883 ; G 4319\nU 10372 ; WX 732 ; N uni2884 ; G 4320\nU 10373 ; WX 732 ; N uni2885 ; G 4321\nU 10374 ; WX 732 ; N uni2886 ; G 4322\nU 10375 ; WX 732 ; N uni2887 ; G 4323\nU 10376 ; WX 732 ; N uni2888 ; G 4324\nU 10377 ; WX 732 ; N uni2889 ; G 4325\nU 10378 ; WX 732 ; N uni288A ; G 4326\nU 10379 ; WX 732 ; N uni288B ; G 4327\nU 10380 ; WX 732 ; N uni288C ; G 4328\nU 10381 ; WX 732 ; N uni288D ; G 4329\nU 10382 ; WX 732 ; N uni288E ; G 4330\nU 10383 ; WX 732 ; N uni288F ; G 4331\nU 10384 ; WX 732 ; N uni2890 ; G 4332\nU 10385 ; WX 732 ; N uni2891 ; G 4333\nU 10386 ; WX 732 ; N uni2892 ; G 4334\nU 10387 ; WX 732 ; N uni2893 ; G 4335\nU 10388 ; WX 732 ; N uni2894 ; G 4336\nU 10389 ; WX 732 ; N uni2895 ; G 4337\nU 10390 ; WX 732 ; N uni2896 ; G 4338\nU 10391 ; WX 732 ; N uni2897 ; G 4339\nU 10392 ; WX 732 ; N uni2898 ; G 4340\nU 10393 ; WX 732 ; N uni2899 ; G 4341\nU 10394 ; WX 732 ; N uni289A ; G 4342\nU 10395 ; WX 732 ; N uni289B ; G 4343\nU 10396 ; WX 732 ; N uni289C ; G 4344\nU 10397 ; WX 732 ; N uni289D ; G 4345\nU 10398 ; WX 732 ; N uni289E ; G 4346\nU 10399 ; WX 732 ; N uni289F ; G 4347\nU 10400 ; WX 732 ; N uni28A0 ; G 4348\nU 10401 ; WX 732 ; N uni28A1 ; G 4349\nU 10402 ; WX 732 ; N uni28A2 ; G 4350\nU 10403 ; WX 732 ; N uni28A3 ; G 4351\nU 10404 ; WX 732 ; N uni28A4 ; G 4352\nU 10405 ; WX 732 ; N uni28A5 ; G 4353\nU 10406 ; WX 732 ; N uni28A6 ; G 4354\nU 10407 ; WX 732 ; N uni28A7 ; G 4355\nU 10408 ; WX 732 ; N uni28A8 ; G 4356\nU 10409 ; WX 732 ; N uni28A9 ; G 4357\nU 10410 ; WX 732 ; N uni28AA ; G 4358\nU 10411 ; WX 732 ; N uni28AB ; G 4359\nU 10412 ; WX 732 ; N uni28AC ; G 4360\nU 10413 ; WX 732 ; N uni28AD ; G 4361\nU 10414 ; WX 732 ; N uni28AE ; G 4362\nU 10415 ; WX 732 ; N uni28AF ; G 4363\nU 10416 ; WX 732 ; N uni28B0 ; G 4364\nU 10417 ; WX 732 ; N uni28B1 ; G 4365\nU 10418 ; WX 732 ; N uni28B2 ; G 4366\nU 10419 ; WX 732 ; N uni28B3 ; G 4367\nU 10420 ; WX 732 ; N uni28B4 ; G 4368\nU 10421 ; WX 732 ; N uni28B5 ; G 4369\nU 10422 ; WX 732 ; N uni28B6 ; G 4370\nU 10423 ; WX 732 ; N uni28B7 ; G 4371\nU 10424 ; WX 732 ; N uni28B8 ; G 4372\nU 10425 ; WX 732 ; N uni28B9 ; G 4373\nU 10426 ; WX 732 ; N uni28BA ; G 4374\nU 10427 ; WX 732 ; N uni28BB ; G 4375\nU 10428 ; WX 732 ; N uni28BC ; G 4376\nU 10429 ; WX 732 ; N uni28BD ; G 4377\nU 10430 ; WX 732 ; N uni28BE ; G 4378\nU 10431 ; WX 732 ; N uni28BF ; G 4379\nU 10432 ; WX 732 ; N uni28C0 ; G 4380\nU 10433 ; WX 732 ; N uni28C1 ; G 4381\nU 10434 ; WX 732 ; N uni28C2 ; G 4382\nU 10435 ; WX 732 ; N uni28C3 ; G 4383\nU 10436 ; WX 732 ; N uni28C4 ; G 4384\nU 10437 ; WX 732 ; N uni28C5 ; G 4385\nU 10438 ; WX 732 ; N uni28C6 ; G 4386\nU 10439 ; WX 732 ; N uni28C7 ; G 4387\nU 10440 ; WX 732 ; N uni28C8 ; G 4388\nU 10441 ; WX 732 ; N uni28C9 ; G 4389\nU 10442 ; WX 732 ; N uni28CA ; G 4390\nU 10443 ; WX 732 ; N uni28CB ; G 4391\nU 10444 ; WX 732 ; N uni28CC ; G 4392\nU 10445 ; WX 732 ; N uni28CD ; G 4393\nU 10446 ; WX 732 ; N uni28CE ; G 4394\nU 10447 ; WX 732 ; N uni28CF ; G 4395\nU 10448 ; WX 732 ; N uni28D0 ; G 4396\nU 10449 ; WX 732 ; N uni28D1 ; G 4397\nU 10450 ; WX 732 ; N uni28D2 ; G 4398\nU 10451 ; WX 732 ; N uni28D3 ; G 4399\nU 10452 ; WX 732 ; N uni28D4 ; G 4400\nU 10453 ; WX 732 ; N uni28D5 ; G 4401\nU 10454 ; WX 732 ; N uni28D6 ; G 4402\nU 10455 ; WX 732 ; N uni28D7 ; G 4403\nU 10456 ; WX 732 ; N uni28D8 ; G 4404\nU 10457 ; WX 732 ; N uni28D9 ; G 4405\nU 10458 ; WX 732 ; N uni28DA ; G 4406\nU 10459 ; WX 732 ; N uni28DB ; G 4407\nU 10460 ; WX 732 ; N uni28DC ; G 4408\nU 10461 ; WX 732 ; N uni28DD ; G 4409\nU 10462 ; WX 732 ; N uni28DE ; G 4410\nU 10463 ; WX 732 ; N uni28DF ; G 4411\nU 10464 ; WX 732 ; N uni28E0 ; G 4412\nU 10465 ; WX 732 ; N uni28E1 ; G 4413\nU 10466 ; WX 732 ; N uni28E2 ; G 4414\nU 10467 ; WX 732 ; N uni28E3 ; G 4415\nU 10468 ; WX 732 ; N uni28E4 ; G 4416\nU 10469 ; WX 732 ; N uni28E5 ; G 4417\nU 10470 ; WX 732 ; N uni28E6 ; G 4418\nU 10471 ; WX 732 ; N uni28E7 ; G 4419\nU 10472 ; WX 732 ; N uni28E8 ; G 4420\nU 10473 ; WX 732 ; N uni28E9 ; G 4421\nU 10474 ; WX 732 ; N uni28EA ; G 4422\nU 10475 ; WX 732 ; N uni28EB ; G 4423\nU 10476 ; WX 732 ; N uni28EC ; G 4424\nU 10477 ; WX 732 ; N uni28ED ; G 4425\nU 10478 ; WX 732 ; N uni28EE ; G 4426\nU 10479 ; WX 732 ; N uni28EF ; G 4427\nU 10480 ; WX 732 ; N uni28F0 ; G 4428\nU 10481 ; WX 732 ; N uni28F1 ; G 4429\nU 10482 ; WX 732 ; N uni28F2 ; G 4430\nU 10483 ; WX 732 ; N uni28F3 ; G 4431\nU 10484 ; WX 732 ; N uni28F4 ; G 4432\nU 10485 ; WX 732 ; N uni28F5 ; G 4433\nU 10486 ; WX 732 ; N uni28F6 ; G 4434\nU 10487 ; WX 732 ; N uni28F7 ; G 4435\nU 10488 ; WX 732 ; N uni28F8 ; G 4436\nU 10489 ; WX 732 ; N uni28F9 ; G 4437\nU 10490 ; WX 732 ; N uni28FA ; G 4438\nU 10491 ; WX 732 ; N uni28FB ; G 4439\nU 10492 ; WX 732 ; N uni28FC ; G 4440\nU 10493 ; WX 732 ; N uni28FD ; G 4441\nU 10494 ; WX 732 ; N uni28FE ; G 4442\nU 10495 ; WX 732 ; N uni28FF ; G 4443\nU 10502 ; WX 838 ; N uni2906 ; G 4444\nU 10503 ; WX 838 ; N uni2907 ; G 4445\nU 10506 ; WX 838 ; N uni290A ; G 4446\nU 10507 ; WX 838 ; N uni290B ; G 4447\nU 10560 ; WX 683 ; N uni2940 ; G 4448\nU 10561 ; WX 683 ; N uni2941 ; G 4449\nU 10627 ; WX 734 ; N uni2983 ; G 4450\nU 10628 ; WX 734 ; N uni2984 ; G 4451\nU 10702 ; WX 838 ; N uni29CE ; G 4452\nU 10703 ; WX 1000 ; N uni29CF ; G 4453\nU 10704 ; WX 1000 ; N uni29D0 ; G 4454\nU 10705 ; WX 1000 ; N uni29D1 ; G 4455\nU 10706 ; WX 1000 ; N uni29D2 ; G 4456\nU 10707 ; WX 1000 ; N uni29D3 ; G 4457\nU 10708 ; WX 1000 ; N uni29D4 ; G 4458\nU 10709 ; WX 1000 ; N uni29D5 ; G 4459\nU 10731 ; WX 494 ; N uni29EB ; G 4460\nU 10746 ; WX 838 ; N uni29FA ; G 4461\nU 10747 ; WX 838 ; N uni29FB ; G 4462\nU 10752 ; WX 1000 ; N uni2A00 ; G 4463\nU 10753 ; WX 1000 ; N uni2A01 ; G 4464\nU 10754 ; WX 1000 ; N uni2A02 ; G 4465\nU 10764 ; WX 1325 ; N uni2A0C ; G 4466\nU 10765 ; WX 521 ; N uni2A0D ; G 4467\nU 10766 ; WX 521 ; N uni2A0E ; G 4468\nU 10767 ; WX 521 ; N uni2A0F ; G 4469\nU 10768 ; WX 521 ; N uni2A10 ; G 4470\nU 10769 ; WX 521 ; N uni2A11 ; G 4471\nU 10770 ; WX 521 ; N uni2A12 ; G 4472\nU 10771 ; WX 521 ; N uni2A13 ; G 4473\nU 10772 ; WX 521 ; N uni2A14 ; G 4474\nU 10773 ; WX 521 ; N uni2A15 ; G 4475\nU 10774 ; WX 521 ; N uni2A16 ; G 4476\nU 10775 ; WX 521 ; N uni2A17 ; G 4477\nU 10776 ; WX 521 ; N uni2A18 ; G 4478\nU 10777 ; WX 521 ; N uni2A19 ; G 4479\nU 10778 ; WX 521 ; N uni2A1A ; G 4480\nU 10779 ; WX 521 ; N uni2A1B ; G 4481\nU 10780 ; WX 521 ; N uni2A1C ; G 4482\nU 10799 ; WX 838 ; N uni2A2F ; G 4483\nU 10858 ; WX 838 ; N uni2A6A ; G 4484\nU 10859 ; WX 838 ; N uni2A6B ; G 4485\nU 10877 ; WX 838 ; N uni2A7D ; G 4486\nU 10878 ; WX 838 ; N uni2A7E ; G 4487\nU 10879 ; WX 838 ; N uni2A7F ; G 4488\nU 10880 ; WX 838 ; N uni2A80 ; G 4489\nU 10881 ; WX 838 ; N uni2A81 ; G 4490\nU 10882 ; WX 838 ; N uni2A82 ; G 4491\nU 10883 ; WX 838 ; N uni2A83 ; G 4492\nU 10884 ; WX 838 ; N uni2A84 ; G 4493\nU 10885 ; WX 838 ; N uni2A85 ; G 4494\nU 10886 ; WX 838 ; N uni2A86 ; G 4495\nU 10887 ; WX 838 ; N uni2A87 ; G 4496\nU 10888 ; WX 838 ; N uni2A88 ; G 4497\nU 10889 ; WX 838 ; N uni2A89 ; G 4498\nU 10890 ; WX 838 ; N uni2A8A ; G 4499\nU 10891 ; WX 838 ; N uni2A8B ; G 4500\nU 10892 ; WX 838 ; N uni2A8C ; G 4501\nU 10893 ; WX 838 ; N uni2A8D ; G 4502\nU 10894 ; WX 838 ; N uni2A8E ; G 4503\nU 10895 ; WX 838 ; N uni2A8F ; G 4504\nU 10896 ; WX 838 ; N uni2A90 ; G 4505\nU 10897 ; WX 838 ; N uni2A91 ; G 4506\nU 10898 ; WX 838 ; N uni2A92 ; G 4507\nU 10899 ; WX 838 ; N uni2A93 ; G 4508\nU 10900 ; WX 838 ; N uni2A94 ; G 4509\nU 10901 ; WX 838 ; N uni2A95 ; G 4510\nU 10902 ; WX 838 ; N uni2A96 ; G 4511\nU 10903 ; WX 838 ; N uni2A97 ; G 4512\nU 10904 ; WX 838 ; N uni2A98 ; G 4513\nU 10905 ; WX 838 ; N uni2A99 ; G 4514\nU 10906 ; WX 838 ; N uni2A9A ; G 4515\nU 10907 ; WX 838 ; N uni2A9B ; G 4516\nU 10908 ; WX 838 ; N uni2A9C ; G 4517\nU 10909 ; WX 838 ; N uni2A9D ; G 4518\nU 10910 ; WX 838 ; N uni2A9E ; G 4519\nU 10911 ; WX 838 ; N uni2A9F ; G 4520\nU 10912 ; WX 838 ; N uni2AA0 ; G 4521\nU 10926 ; WX 838 ; N uni2AAE ; G 4522\nU 10927 ; WX 838 ; N uni2AAF ; G 4523\nU 10928 ; WX 838 ; N uni2AB0 ; G 4524\nU 10929 ; WX 838 ; N uni2AB1 ; G 4525\nU 10930 ; WX 838 ; N uni2AB2 ; G 4526\nU 10931 ; WX 838 ; N uni2AB3 ; G 4527\nU 10932 ; WX 838 ; N uni2AB4 ; G 4528\nU 10933 ; WX 838 ; N uni2AB5 ; G 4529\nU 10934 ; WX 838 ; N uni2AB6 ; G 4530\nU 10935 ; WX 838 ; N uni2AB7 ; G 4531\nU 10936 ; WX 838 ; N uni2AB8 ; G 4532\nU 10937 ; WX 838 ; N uni2AB9 ; G 4533\nU 10938 ; WX 838 ; N uni2ABA ; G 4534\nU 11001 ; WX 838 ; N uni2AF9 ; G 4535\nU 11002 ; WX 838 ; N uni2AFA ; G 4536\nU 11008 ; WX 838 ; N uni2B00 ; G 4537\nU 11009 ; WX 838 ; N uni2B01 ; G 4538\nU 11010 ; WX 838 ; N uni2B02 ; G 4539\nU 11011 ; WX 838 ; N uni2B03 ; G 4540\nU 11012 ; WX 838 ; N uni2B04 ; G 4541\nU 11013 ; WX 838 ; N uni2B05 ; G 4542\nU 11014 ; WX 838 ; N uni2B06 ; G 4543\nU 11015 ; WX 838 ; N uni2B07 ; G 4544\nU 11016 ; WX 838 ; N uni2B08 ; G 4545\nU 11017 ; WX 838 ; N uni2B09 ; G 4546\nU 11018 ; WX 838 ; N uni2B0A ; G 4547\nU 11019 ; WX 838 ; N uni2B0B ; G 4548\nU 11020 ; WX 838 ; N uni2B0C ; G 4549\nU 11021 ; WX 838 ; N uni2B0D ; G 4550\nU 11022 ; WX 836 ; N uni2B0E ; G 4551\nU 11023 ; WX 836 ; N uni2B0F ; G 4552\nU 11024 ; WX 836 ; N uni2B10 ; G 4553\nU 11025 ; WX 836 ; N uni2B11 ; G 4554\nU 11026 ; WX 945 ; N uni2B12 ; G 4555\nU 11027 ; WX 945 ; N uni2B13 ; G 4556\nU 11028 ; WX 945 ; N uni2B14 ; G 4557\nU 11029 ; WX 945 ; N uni2B15 ; G 4558\nU 11030 ; WX 769 ; N uni2B16 ; G 4559\nU 11031 ; WX 769 ; N uni2B17 ; G 4560\nU 11032 ; WX 769 ; N uni2B18 ; G 4561\nU 11033 ; WX 769 ; N uni2B19 ; G 4562\nU 11034 ; WX 945 ; N uni2B1A ; G 4563\nU 11039 ; WX 869 ; N uni2B1F ; G 4564\nU 11040 ; WX 869 ; N uni2B20 ; G 4565\nU 11041 ; WX 873 ; N uni2B21 ; G 4566\nU 11042 ; WX 873 ; N uni2B22 ; G 4567\nU 11043 ; WX 873 ; N uni2B23 ; G 4568\nU 11044 ; WX 1119 ; N uni2B24 ; G 4569\nU 11091 ; WX 869 ; N uni2B53 ; G 4570\nU 11092 ; WX 869 ; N uni2B54 ; G 4571\nU 11360 ; WX 557 ; N uni2C60 ; G 4572\nU 11361 ; WX 278 ; N uni2C61 ; G 4573\nU 11362 ; WX 557 ; N uni2C62 ; G 4574\nU 11363 ; WX 603 ; N uni2C63 ; G 4575\nU 11364 ; WX 695 ; N uni2C64 ; G 4576\nU 11365 ; WX 613 ; N uni2C65 ; G 4577\nU 11366 ; WX 392 ; N uni2C66 ; G 4578\nU 11367 ; WX 752 ; N uni2C67 ; G 4579\nU 11368 ; WX 634 ; N uni2C68 ; G 4580\nU 11369 ; WX 656 ; N uni2C69 ; G 4581\nU 11370 ; WX 579 ; N uni2C6A ; G 4582\nU 11371 ; WX 685 ; N uni2C6B ; G 4583\nU 11372 ; WX 525 ; N uni2C6C ; G 4584\nU 11373 ; WX 781 ; N uni2C6D ; G 4585\nU 11374 ; WX 863 ; N uni2C6E ; G 4586\nU 11375 ; WX 684 ; N uni2C6F ; G 4587\nU 11376 ; WX 781 ; N uni2C70 ; G 4588\nU 11377 ; WX 734 ; N uni2C71 ; G 4589\nU 11378 ; WX 1128 ; N uni2C72 ; G 4590\nU 11379 ; WX 961 ; N uni2C73 ; G 4591\nU 11380 ; WX 592 ; N uni2C74 ; G 4592\nU 11381 ; WX 654 ; N uni2C75 ; G 4593\nU 11382 ; WX 568 ; N uni2C76 ; G 4594\nU 11383 ; WX 660 ; N uni2C77 ; G 4595\nU 11385 ; WX 414 ; N uni2C79 ; G 4596\nU 11386 ; WX 612 ; N uni2C7A ; G 4597\nU 11387 ; WX 491 ; N uni2C7B ; G 4598\nU 11388 ; WX 175 ; N uni2C7C ; G 4599\nU 11389 ; WX 431 ; N uni2C7D ; G 4600\nU 11390 ; WX 635 ; N uni2C7E ; G 4601\nU 11391 ; WX 685 ; N uni2C7F ; G 4602\nU 11520 ; WX 591 ; N uni2D00 ; G 4603\nU 11521 ; WX 595 ; N uni2D01 ; G 4604\nU 11522 ; WX 564 ; N uni2D02 ; G 4605\nU 11523 ; WX 602 ; N uni2D03 ; G 4606\nU 11524 ; WX 587 ; N uni2D04 ; G 4607\nU 11525 ; WX 911 ; N uni2D05 ; G 4608\nU 11526 ; WX 626 ; N uni2D06 ; G 4609\nU 11527 ; WX 952 ; N uni2D07 ; G 4610\nU 11528 ; WX 595 ; N uni2D08 ; G 4611\nU 11529 ; WX 607 ; N uni2D09 ; G 4612\nU 11530 ; WX 954 ; N uni2D0A ; G 4613\nU 11531 ; WX 620 ; N uni2D0B ; G 4614\nU 11532 ; WX 595 ; N uni2D0C ; G 4615\nU 11533 ; WX 926 ; N uni2D0D ; G 4616\nU 11534 ; WX 595 ; N uni2D0E ; G 4617\nU 11535 ; WX 806 ; N uni2D0F ; G 4618\nU 11536 ; WX 931 ; N uni2D10 ; G 4619\nU 11537 ; WX 584 ; N uni2D11 ; G 4620\nU 11538 ; WX 592 ; N uni2D12 ; G 4621\nU 11539 ; WX 923 ; N uni2D13 ; G 4622\nU 11540 ; WX 953 ; N uni2D14 ; G 4623\nU 11541 ; WX 828 ; N uni2D15 ; G 4624\nU 11542 ; WX 596 ; N uni2D16 ; G 4625\nU 11543 ; WX 595 ; N uni2D17 ; G 4626\nU 11544 ; WX 590 ; N uni2D18 ; G 4627\nU 11545 ; WX 592 ; N uni2D19 ; G 4628\nU 11546 ; WX 592 ; N uni2D1A ; G 4629\nU 11547 ; WX 621 ; N uni2D1B ; G 4630\nU 11548 ; WX 920 ; N uni2D1C ; G 4631\nU 11549 ; WX 589 ; N uni2D1D ; G 4632\nU 11550 ; WX 586 ; N uni2D1E ; G 4633\nU 11551 ; WX 581 ; N uni2D1F ; G 4634\nU 11552 ; WX 914 ; N uni2D20 ; G 4635\nU 11553 ; WX 596 ; N uni2D21 ; G 4636\nU 11554 ; WX 595 ; N uni2D22 ; G 4637\nU 11555 ; WX 592 ; N uni2D23 ; G 4638\nU 11556 ; WX 642 ; N uni2D24 ; G 4639\nU 11557 ; WX 901 ; N uni2D25 ; G 4640\nU 11568 ; WX 646 ; N uni2D30 ; G 4641\nU 11569 ; WX 888 ; N uni2D31 ; G 4642\nU 11570 ; WX 888 ; N uni2D32 ; G 4643\nU 11571 ; WX 682 ; N uni2D33 ; G 4644\nU 11572 ; WX 684 ; N uni2D34 ; G 4645\nU 11573 ; WX 635 ; N uni2D35 ; G 4646\nU 11574 ; WX 562 ; N uni2D36 ; G 4647\nU 11575 ; WX 684 ; N uni2D37 ; G 4648\nU 11576 ; WX 684 ; N uni2D38 ; G 4649\nU 11577 ; WX 632 ; N uni2D39 ; G 4650\nU 11578 ; WX 632 ; N uni2D3A ; G 4651\nU 11579 ; WX 683 ; N uni2D3B ; G 4652\nU 11580 ; WX 875 ; N uni2D3C ; G 4653\nU 11581 ; WX 685 ; N uni2D3D ; G 4654\nU 11582 ; WX 491 ; N uni2D3E ; G 4655\nU 11583 ; WX 685 ; N uni2D3F ; G 4656\nU 11584 ; WX 888 ; N uni2D40 ; G 4657\nU 11585 ; WX 888 ; N uni2D41 ; G 4658\nU 11586 ; WX 300 ; N uni2D42 ; G 4659\nU 11587 ; WX 627 ; N uni2D43 ; G 4660\nU 11588 ; WX 752 ; N uni2D44 ; G 4661\nU 11589 ; WX 656 ; N uni2D45 ; G 4662\nU 11590 ; WX 527 ; N uni2D46 ; G 4663\nU 11591 ; WX 685 ; N uni2D47 ; G 4664\nU 11592 ; WX 645 ; N uni2D48 ; G 4665\nU 11593 ; WX 632 ; N uni2D49 ; G 4666\nU 11594 ; WX 502 ; N uni2D4A ; G 4667\nU 11595 ; WX 953 ; N uni2D4B ; G 4668\nU 11596 ; WX 778 ; N uni2D4C ; G 4669\nU 11597 ; WX 748 ; N uni2D4D ; G 4670\nU 11598 ; WX 621 ; N uni2D4E ; G 4671\nU 11599 ; WX 295 ; N uni2D4F ; G 4672\nU 11600 ; WX 778 ; N uni2D50 ; G 4673\nU 11601 ; WX 295 ; N uni2D51 ; G 4674\nU 11602 ; WX 752 ; N uni2D52 ; G 4675\nU 11603 ; WX 633 ; N uni2D53 ; G 4676\nU 11604 ; WX 888 ; N uni2D54 ; G 4677\nU 11605 ; WX 888 ; N uni2D55 ; G 4678\nU 11606 ; WX 752 ; N uni2D56 ; G 4679\nU 11607 ; WX 320 ; N uni2D57 ; G 4680\nU 11608 ; WX 749 ; N uni2D58 ; G 4681\nU 11609 ; WX 888 ; N uni2D59 ; G 4682\nU 11610 ; WX 888 ; N uni2D5A ; G 4683\nU 11611 ; WX 698 ; N uni2D5B ; G 4684\nU 11612 ; WX 768 ; N uni2D5C ; G 4685\nU 11613 ; WX 685 ; N uni2D5D ; G 4686\nU 11614 ; WX 698 ; N uni2D5E ; G 4687\nU 11615 ; WX 622 ; N uni2D5F ; G 4688\nU 11616 ; WX 684 ; N uni2D60 ; G 4689\nU 11617 ; WX 752 ; N uni2D61 ; G 4690\nU 11618 ; WX 632 ; N uni2D62 ; G 4691\nU 11619 ; WX 788 ; N uni2D63 ; G 4692\nU 11620 ; WX 567 ; N uni2D64 ; G 4693\nU 11621 ; WX 788 ; N uni2D65 ; G 4694\nU 11631 ; WX 515 ; N uni2D6F ; G 4695\nU 11800 ; WX 531 ; N uni2E18 ; G 4696\nU 11807 ; WX 838 ; N uni2E1F ; G 4697\nU 11810 ; WX 390 ; N uni2E22 ; G 4698\nU 11811 ; WX 390 ; N uni2E23 ; G 4699\nU 11812 ; WX 390 ; N uni2E24 ; G 4700\nU 11813 ; WX 390 ; N uni2E25 ; G 4701\nU 11822 ; WX 531 ; N uni2E2E ; G 4702\nU 19904 ; WX 896 ; N uni4DC0 ; G 4703\nU 19905 ; WX 896 ; N uni4DC1 ; G 4704\nU 19906 ; WX 896 ; N uni4DC2 ; G 4705\nU 19907 ; WX 896 ; N uni4DC3 ; G 4706\nU 19908 ; WX 896 ; N uni4DC4 ; G 4707\nU 19909 ; WX 896 ; N uni4DC5 ; G 4708\nU 19910 ; WX 896 ; N uni4DC6 ; G 4709\nU 19911 ; WX 896 ; N uni4DC7 ; G 4710\nU 19912 ; WX 896 ; N uni4DC8 ; G 4711\nU 19913 ; WX 896 ; N uni4DC9 ; G 4712\nU 19914 ; WX 896 ; N uni4DCA ; G 4713\nU 19915 ; WX 896 ; N uni4DCB ; G 4714\nU 19916 ; WX 896 ; N uni4DCC ; G 4715\nU 19917 ; WX 896 ; N uni4DCD ; G 4716\nU 19918 ; WX 896 ; N uni4DCE ; G 4717\nU 19919 ; WX 896 ; N uni4DCF ; G 4718\nU 19920 ; WX 896 ; N uni4DD0 ; G 4719\nU 19921 ; WX 896 ; N uni4DD1 ; G 4720\nU 19922 ; WX 896 ; N uni4DD2 ; G 4721\nU 19923 ; WX 896 ; N uni4DD3 ; G 4722\nU 19924 ; WX 896 ; N uni4DD4 ; G 4723\nU 19925 ; WX 896 ; N uni4DD5 ; G 4724\nU 19926 ; WX 896 ; N uni4DD6 ; G 4725\nU 19927 ; WX 896 ; N uni4DD7 ; G 4726\nU 19928 ; WX 896 ; N uni4DD8 ; G 4727\nU 19929 ; WX 896 ; N uni4DD9 ; G 4728\nU 19930 ; WX 896 ; N uni4DDA ; G 4729\nU 19931 ; WX 896 ; N uni4DDB ; G 4730\nU 19932 ; WX 896 ; N uni4DDC ; G 4731\nU 19933 ; WX 896 ; N uni4DDD ; G 4732\nU 19934 ; WX 896 ; N uni4DDE ; G 4733\nU 19935 ; WX 896 ; N uni4DDF ; G 4734\nU 19936 ; WX 896 ; N uni4DE0 ; G 4735\nU 19937 ; WX 896 ; N uni4DE1 ; G 4736\nU 19938 ; WX 896 ; N uni4DE2 ; G 4737\nU 19939 ; WX 896 ; N uni4DE3 ; G 4738\nU 19940 ; WX 896 ; N uni4DE4 ; G 4739\nU 19941 ; WX 896 ; N uni4DE5 ; G 4740\nU 19942 ; WX 896 ; N uni4DE6 ; G 4741\nU 19943 ; WX 896 ; N uni4DE7 ; G 4742\nU 19944 ; WX 896 ; N uni4DE8 ; G 4743\nU 19945 ; WX 896 ; N uni4DE9 ; G 4744\nU 19946 ; WX 896 ; N uni4DEA ; G 4745\nU 19947 ; WX 896 ; N uni4DEB ; G 4746\nU 19948 ; WX 896 ; N uni4DEC ; G 4747\nU 19949 ; WX 896 ; N uni4DED ; G 4748\nU 19950 ; WX 896 ; N uni4DEE ; G 4749\nU 19951 ; WX 896 ; N uni4DEF ; G 4750\nU 19952 ; WX 896 ; N uni4DF0 ; G 4751\nU 19953 ; WX 896 ; N uni4DF1 ; G 4752\nU 19954 ; WX 896 ; N uni4DF2 ; G 4753\nU 19955 ; WX 896 ; N uni4DF3 ; G 4754\nU 19956 ; WX 896 ; N uni4DF4 ; G 4755\nU 19957 ; WX 896 ; N uni4DF5 ; G 4756\nU 19958 ; WX 896 ; N uni4DF6 ; G 4757\nU 19959 ; WX 896 ; N uni4DF7 ; G 4758\nU 19960 ; WX 896 ; N uni4DF8 ; G 4759\nU 19961 ; WX 896 ; N uni4DF9 ; G 4760\nU 19962 ; WX 896 ; N uni4DFA ; G 4761\nU 19963 ; WX 896 ; N uni4DFB ; G 4762\nU 19964 ; WX 896 ; N uni4DFC ; G 4763\nU 19965 ; WX 896 ; N uni4DFD ; G 4764\nU 19966 ; WX 896 ; N uni4DFE ; G 4765\nU 19967 ; WX 896 ; N uni4DFF ; G 4766\nU 42192 ; WX 686 ; N uniA4D0 ; G 4767\nU 42193 ; WX 603 ; N uniA4D1 ; G 4768\nU 42194 ; WX 603 ; N uniA4D2 ; G 4769\nU 42195 ; WX 770 ; N uniA4D3 ; G 4770\nU 42196 ; WX 611 ; N uniA4D4 ; G 4771\nU 42197 ; WX 611 ; N uniA4D5 ; G 4772\nU 42198 ; WX 775 ; N uniA4D6 ; G 4773\nU 42199 ; WX 656 ; N uniA4D7 ; G 4774\nU 42200 ; WX 656 ; N uniA4D8 ; G 4775\nU 42201 ; WX 512 ; N uniA4D9 ; G 4776\nU 42202 ; WX 698 ; N uniA4DA ; G 4777\nU 42203 ; WX 703 ; N uniA4DB ; G 4778\nU 42204 ; WX 685 ; N uniA4DC ; G 4779\nU 42205 ; WX 575 ; N uniA4DD ; G 4780\nU 42206 ; WX 575 ; N uniA4DE ; G 4781\nU 42207 ; WX 863 ; N uniA4DF ; G 4782\nU 42208 ; WX 748 ; N uniA4E0 ; G 4783\nU 42209 ; WX 557 ; N uniA4E1 ; G 4784\nU 42210 ; WX 635 ; N uniA4E2 ; G 4785\nU 42211 ; WX 695 ; N uniA4E3 ; G 4786\nU 42212 ; WX 695 ; N uniA4E4 ; G 4787\nU 42213 ; WX 684 ; N uniA4E5 ; G 4788\nU 42214 ; WX 684 ; N uniA4E6 ; G 4789\nU 42215 ; WX 752 ; N uniA4E7 ; G 4790\nU 42216 ; WX 775 ; N uniA4E8 ; G 4791\nU 42217 ; WX 512 ; N uniA4E9 ; G 4792\nU 42218 ; WX 989 ; N uniA4EA ; G 4793\nU 42219 ; WX 685 ; N uniA4EB ; G 4794\nU 42220 ; WX 611 ; N uniA4EC ; G 4795\nU 42221 ; WX 686 ; N uniA4ED ; G 4796\nU 42222 ; WX 684 ; N uniA4EE ; G 4797\nU 42223 ; WX 684 ; N uniA4EF ; G 4798\nU 42224 ; WX 632 ; N uniA4F0 ; G 4799\nU 42225 ; WX 632 ; N uniA4F1 ; G 4800\nU 42226 ; WX 295 ; N uniA4F2 ; G 4801\nU 42227 ; WX 787 ; N uniA4F3 ; G 4802\nU 42228 ; WX 732 ; N uniA4F4 ; G 4803\nU 42229 ; WX 732 ; N uniA4F5 ; G 4804\nU 42230 ; WX 557 ; N uniA4F6 ; G 4805\nU 42231 ; WX 767 ; N uniA4F7 ; G 4806\nU 42232 ; WX 300 ; N uniA4F8 ; G 4807\nU 42233 ; WX 300 ; N uniA4F9 ; G 4808\nU 42234 ; WX 596 ; N uniA4FA ; G 4809\nU 42235 ; WX 596 ; N uniA4FB ; G 4810\nU 42236 ; WX 300 ; N uniA4FC ; G 4811\nU 42237 ; WX 300 ; N uniA4FD ; G 4812\nU 42238 ; WX 588 ; N uniA4FE ; G 4813\nU 42239 ; WX 588 ; N uniA4FF ; G 4814\nU 42564 ; WX 635 ; N uniA644 ; G 4815\nU 42565 ; WX 521 ; N uniA645 ; G 4816\nU 42566 ; WX 354 ; N uniA646 ; G 4817\nU 42567 ; WX 338 ; N uniA647 ; G 4818\nU 42572 ; WX 1180 ; N uniA64C ; G 4819\nU 42573 ; WX 1028 ; N uniA64D ; G 4820\nU 42576 ; WX 1029 ; N uniA650 ; G 4821\nU 42577 ; WX 906 ; N uniA651 ; G 4822\nU 42580 ; WX 1080 ; N uniA654 ; G 4823\nU 42581 ; WX 842 ; N uniA655 ; G 4824\nU 42582 ; WX 977 ; N uniA656 ; G 4825\nU 42583 ; WX 843 ; N uniA657 ; G 4826\nU 42594 ; WX 1062 ; N uniA662 ; G 4827\nU 42595 ; WX 912 ; N uniA663 ; G 4828\nU 42596 ; WX 1066 ; N uniA664 ; G 4829\nU 42597 ; WX 901 ; N uniA665 ; G 4830\nU 42598 ; WX 1178 ; N uniA666 ; G 4831\nU 42599 ; WX 1008 ; N uniA667 ; G 4832\nU 42600 ; WX 787 ; N uniA668 ; G 4833\nU 42601 ; WX 612 ; N uniA669 ; G 4834\nU 42602 ; WX 855 ; N uniA66A ; G 4835\nU 42603 ; WX 712 ; N uniA66B ; G 4836\nU 42604 ; WX 1358 ; N uniA66C ; G 4837\nU 42605 ; WX 1019 ; N uniA66D ; G 4838\nU 42606 ; WX 879 ; N uniA66E ; G 4839\nU 42634 ; WX 782 ; N uniA68A ; G 4840\nU 42635 ; WX 685 ; N uniA68B ; G 4841\nU 42636 ; WX 611 ; N uniA68C ; G 4842\nU 42637 ; WX 583 ; N uniA68D ; G 4843\nU 42644 ; WX 686 ; N uniA694 ; G 4844\nU 42645 ; WX 634 ; N uniA695 ; G 4845\nU 42648 ; WX 1358 ; N uniA698 ; G 4846\nU 42649 ; WX 1019 ; N uniA699 ; G 4847\nU 42760 ; WX 493 ; N uniA708 ; G 4848\nU 42761 ; WX 493 ; N uniA709 ; G 4849\nU 42762 ; WX 493 ; N uniA70A ; G 4850\nU 42763 ; WX 493 ; N uniA70B ; G 4851\nU 42764 ; WX 493 ; N uniA70C ; G 4852\nU 42765 ; WX 493 ; N uniA70D ; G 4853\nU 42766 ; WX 493 ; N uniA70E ; G 4854\nU 42767 ; WX 493 ; N uniA70F ; G 4855\nU 42768 ; WX 493 ; N uniA710 ; G 4856\nU 42769 ; WX 493 ; N uniA711 ; G 4857\nU 42770 ; WX 493 ; N uniA712 ; G 4858\nU 42771 ; WX 493 ; N uniA713 ; G 4859\nU 42772 ; WX 493 ; N uniA714 ; G 4860\nU 42773 ; WX 493 ; N uniA715 ; G 4861\nU 42774 ; WX 493 ; N uniA716 ; G 4862\nU 42779 ; WX 369 ; N uniA71B ; G 4863\nU 42780 ; WX 369 ; N uniA71C ; G 4864\nU 42781 ; WX 252 ; N uniA71D ; G 4865\nU 42782 ; WX 252 ; N uniA71E ; G 4866\nU 42783 ; WX 252 ; N uniA71F ; G 4867\nU 42786 ; WX 385 ; N uniA722 ; G 4868\nU 42787 ; WX 356 ; N uniA723 ; G 4869\nU 42788 ; WX 472 ; N uniA724 ; G 4870\nU 42789 ; WX 472 ; N uniA725 ; G 4871\nU 42790 ; WX 752 ; N uniA726 ; G 4872\nU 42791 ; WX 634 ; N uniA727 ; G 4873\nU 42792 ; WX 878 ; N uniA728 ; G 4874\nU 42793 ; WX 709 ; N uniA729 ; G 4875\nU 42794 ; WX 614 ; N uniA72A ; G 4876\nU 42795 ; WX 541 ; N uniA72B ; G 4877\nU 42800 ; WX 491 ; N uniA730 ; G 4878\nU 42801 ; WX 521 ; N uniA731 ; G 4879\nU 42802 ; WX 1250 ; N uniA732 ; G 4880\nU 42803 ; WX 985 ; N uniA733 ; G 4881\nU 42804 ; WX 1203 ; N uniA734 ; G 4882\nU 42805 ; WX 990 ; N uniA735 ; G 4883\nU 42806 ; WX 1142 ; N uniA736 ; G 4884\nU 42807 ; WX 981 ; N uniA737 ; G 4885\nU 42808 ; WX 971 ; N uniA738 ; G 4886\nU 42809 ; WX 818 ; N uniA739 ; G 4887\nU 42810 ; WX 971 ; N uniA73A ; G 4888\nU 42811 ; WX 818 ; N uniA73B ; G 4889\nU 42812 ; WX 959 ; N uniA73C ; G 4890\nU 42813 ; WX 818 ; N uniA73D ; G 4891\nU 42814 ; WX 703 ; N uniA73E ; G 4892\nU 42815 ; WX 549 ; N uniA73F ; G 4893\nU 42816 ; WX 656 ; N uniA740 ; G 4894\nU 42817 ; WX 583 ; N uniA741 ; G 4895\nU 42822 ; WX 680 ; N uniA746 ; G 4896\nU 42823 ; WX 392 ; N uniA747 ; G 4897\nU 42824 ; WX 582 ; N uniA748 ; G 4898\nU 42825 ; WX 427 ; N uniA749 ; G 4899\nU 42826 ; WX 807 ; N uniA74A ; G 4900\nU 42827 ; WX 704 ; N uniA74B ; G 4901\nU 42830 ; WX 1358 ; N uniA74E ; G 4902\nU 42831 ; WX 1019 ; N uniA74F ; G 4903\nU 42832 ; WX 603 ; N uniA750 ; G 4904\nU 42833 ; WX 635 ; N uniA751 ; G 4905\nU 42834 ; WX 734 ; N uniA752 ; G 4906\nU 42835 ; WX 774 ; N uniA753 ; G 4907\nU 42838 ; WX 787 ; N uniA756 ; G 4908\nU 42839 ; WX 635 ; N uniA757 ; G 4909\nU 42852 ; WX 605 ; N uniA764 ; G 4910\nU 42853 ; WX 635 ; N uniA765 ; G 4911\nU 42854 ; WX 605 ; N uniA766 ; G 4912\nU 42855 ; WX 635 ; N uniA767 ; G 4913\nU 42880 ; WX 557 ; N uniA780 ; G 4914\nU 42881 ; WX 278 ; N uniA781 ; G 4915\nU 42882 ; WX 735 ; N uniA782 ; G 4916\nU 42883 ; WX 634 ; N uniA783 ; G 4917\nU 42889 ; WX 337 ; N uniA789 ; G 4918\nU 42890 ; WX 376 ; N uniA78A ; G 4919\nU 42891 ; WX 401 ; N uniA78B ; G 4920\nU 42892 ; WX 275 ; N uniA78C ; G 4921\nU 42893 ; WX 686 ; N uniA78D ; G 4922\nU 42894 ; WX 487 ; N uniA78E ; G 4923\nU 42896 ; WX 772 ; N uniA790 ; G 4924\nU 42897 ; WX 667 ; N uniA791 ; G 4925\nU 42912 ; WX 775 ; N uniA7A0 ; G 4926\nU 42913 ; WX 635 ; N uniA7A1 ; G 4927\nU 42914 ; WX 656 ; N uniA7A2 ; G 4928\nU 42915 ; WX 579 ; N uniA7A3 ; G 4929\nU 42916 ; WX 748 ; N uniA7A4 ; G 4930\nU 42917 ; WX 634 ; N uniA7A5 ; G 4931\nU 42918 ; WX 695 ; N uniA7A6 ; G 4932\nU 42919 ; WX 411 ; N uniA7A7 ; G 4933\nU 42920 ; WX 635 ; N uniA7A8 ; G 4934\nU 42921 ; WX 521 ; N uniA7A9 ; G 4935\nU 42922 ; WX 801 ; N uniA7AA ; G 4936\nU 43000 ; WX 577 ; N uniA7F8 ; G 4937\nU 43001 ; WX 644 ; N uniA7F9 ; G 4938\nU 43002 ; WX 915 ; N uniA7FA ; G 4939\nU 43003 ; WX 575 ; N uniA7FB ; G 4940\nU 43004 ; WX 603 ; N uniA7FC ; G 4941\nU 43005 ; WX 863 ; N uniA7FD ; G 4942\nU 43006 ; WX 295 ; N uniA7FE ; G 4943\nU 43007 ; WX 1199 ; N uniA7FF ; G 4944\nU 61184 ; WX 213 ; N uni02E5.5 ; G 4945\nU 61185 ; WX 238 ; N uni02E6.5 ; G 4946\nU 61186 ; WX 257 ; N uni02E7.5 ; G 4947\nU 61187 ; WX 264 ; N uni02E8.5 ; G 4948\nU 61188 ; WX 267 ; N uni02E9.5 ; G 4949\nU 61189 ; WX 238 ; N uni02E5.4 ; G 4950\nU 61190 ; WX 213 ; N uni02E6.4 ; G 4951\nU 61191 ; WX 238 ; N uni02E7.4 ; G 4952\nU 61192 ; WX 257 ; N uni02E8.4 ; G 4953\nU 61193 ; WX 264 ; N uni02E9.4 ; G 4954\nU 61194 ; WX 257 ; N uni02E5.3 ; G 4955\nU 61195 ; WX 238 ; N uni02E6.3 ; G 4956\nU 61196 ; WX 213 ; N uni02E7.3 ; G 4957\nU 61197 ; WX 238 ; N uni02E8.3 ; G 4958\nU 61198 ; WX 257 ; N uni02E9.3 ; G 4959\nU 61199 ; WX 264 ; N uni02E5.2 ; G 4960\nU 61200 ; WX 257 ; N uni02E6.2 ; G 4961\nU 61201 ; WX 238 ; N uni02E7.2 ; G 4962\nU 61202 ; WX 213 ; N uni02E8.2 ; G 4963\nU 61203 ; WX 238 ; N uni02E9.2 ; G 4964\nU 61204 ; WX 267 ; N uni02E5.1 ; G 4965\nU 61205 ; WX 264 ; N uni02E6.1 ; G 4966\nU 61206 ; WX 257 ; N uni02E7.1 ; G 4967\nU 61207 ; WX 238 ; N uni02E8.1 ; G 4968\nU 61208 ; WX 213 ; N uni02E9.1 ; G 4969\nU 61209 ; WX 275 ; N stem ; G 4970\nU 61440 ; WX 977 ; N uniF000 ; G 4971\nU 61441 ; WX 977 ; N uniF001 ; G 4972\nU 61442 ; WX 977 ; N uniF002 ; G 4973\nU 61443 ; WX 977 ; N uniF003 ; G 4974\nU 62464 ; WX 580 ; N uniF400 ; G 4975\nU 62465 ; WX 580 ; N uniF401 ; G 4976\nU 62466 ; WX 624 ; N uniF402 ; G 4977\nU 62467 ; WX 889 ; N uniF403 ; G 4978\nU 62468 ; WX 585 ; N uniF404 ; G 4979\nU 62469 ; WX 580 ; N uniF405 ; G 4980\nU 62470 ; WX 653 ; N uniF406 ; G 4981\nU 62471 ; WX 882 ; N uniF407 ; G 4982\nU 62472 ; WX 555 ; N uniF408 ; G 4983\nU 62473 ; WX 580 ; N uniF409 ; G 4984\nU 62474 ; WX 1168 ; N uniF40A ; G 4985\nU 62475 ; WX 589 ; N uniF40B ; G 4986\nU 62476 ; WX 590 ; N uniF40C ; G 4987\nU 62477 ; WX 869 ; N uniF40D ; G 4988\nU 62478 ; WX 580 ; N uniF40E ; G 4989\nU 62479 ; WX 589 ; N uniF40F ; G 4990\nU 62480 ; WX 914 ; N uniF410 ; G 4991\nU 62481 ; WX 590 ; N uniF411 ; G 4992\nU 62482 ; WX 731 ; N uniF412 ; G 4993\nU 62483 ; WX 583 ; N uniF413 ; G 4994\nU 62484 ; WX 872 ; N uniF414 ; G 4995\nU 62485 ; WX 589 ; N uniF415 ; G 4996\nU 62486 ; WX 895 ; N uniF416 ; G 4997\nU 62487 ; WX 589 ; N uniF417 ; G 4998\nU 62488 ; WX 589 ; N uniF418 ; G 4999\nU 62489 ; WX 590 ; N uniF419 ; G 5000\nU 62490 ; WX 649 ; N uniF41A ; G 5001\nU 62491 ; WX 589 ; N uniF41B ; G 5002\nU 62492 ; WX 589 ; N uniF41C ; G 5003\nU 62493 ; WX 599 ; N uniF41D ; G 5004\nU 62494 ; WX 590 ; N uniF41E ; G 5005\nU 62495 ; WX 516 ; N uniF41F ; G 5006\nU 62496 ; WX 580 ; N uniF420 ; G 5007\nU 62497 ; WX 584 ; N uniF421 ; G 5008\nU 62498 ; WX 580 ; N uniF422 ; G 5009\nU 62499 ; WX 580 ; N uniF423 ; G 5010\nU 62500 ; WX 581 ; N uniF424 ; G 5011\nU 62501 ; WX 638 ; N uniF425 ; G 5012\nU 62502 ; WX 955 ; N uniF426 ; G 5013\nU 62504 ; WX 931 ; N uniF428 ; G 5014\nU 62505 ; WX 808 ; N uniF429 ; G 5015\nU 62506 ; WX 508 ; N uniF42A ; G 5016\nU 62507 ; WX 508 ; N uniF42B ; G 5017\nU 62508 ; WX 508 ; N uniF42C ; G 5018\nU 62509 ; WX 508 ; N uniF42D ; G 5019\nU 62510 ; WX 508 ; N uniF42E ; G 5020\nU 62511 ; WX 508 ; N uniF42F ; G 5021\nU 62512 ; WX 508 ; N uniF430 ; G 5022\nU 62513 ; WX 508 ; N uniF431 ; G 5023\nU 62514 ; WX 508 ; N uniF432 ; G 5024\nU 62515 ; WX 508 ; N uniF433 ; G 5025\nU 62516 ; WX 518 ; N uniF434 ; G 5026\nU 62517 ; WX 518 ; N uniF435 ; G 5027\nU 62518 ; WX 518 ; N uniF436 ; G 5028\nU 62519 ; WX 787 ; N uniF437 ; G 5029\nU 62520 ; WX 787 ; N uniF438 ; G 5030\nU 62521 ; WX 787 ; N uniF439 ; G 5031\nU 62522 ; WX 787 ; N uniF43A ; G 5032\nU 62523 ; WX 787 ; N uniF43B ; G 5033\nU 62524 ; WX 546 ; N uniF43C ; G 5034\nU 62525 ; WX 546 ; N uniF43D ; G 5035\nU 62526 ; WX 546 ; N uniF43E ; G 5036\nU 62527 ; WX 546 ; N uniF43F ; G 5037\nU 62528 ; WX 546 ; N uniF440 ; G 5038\nU 62529 ; WX 546 ; N uniF441 ; G 5039\nU 63173 ; WX 612 ; N uniF6C5 ; G 5040\nU 64256 ; WX 689 ; N uniFB00 ; G 5041\nU 64257 ; WX 630 ; N fi ; G 5042\nU 64258 ; WX 630 ; N fl ; G 5043\nU 64259 ; WX 967 ; N uniFB03 ; G 5044\nU 64260 ; WX 967 ; N uniFB04 ; G 5045\nU 64261 ; WX 686 ; N uniFB05 ; G 5046\nU 64262 ; WX 861 ; N uniFB06 ; G 5047\nU 64275 ; WX 1202 ; N uniFB13 ; G 5048\nU 64276 ; WX 1202 ; N uniFB14 ; G 5049\nU 64277 ; WX 1196 ; N uniFB15 ; G 5050\nU 64278 ; WX 1186 ; N uniFB16 ; G 5051\nU 64279 ; WX 1529 ; N uniFB17 ; G 5052\nU 64285 ; WX 224 ; N uniFB1D ; G 5053\nU 64286 ; WX 0 ; N uniFB1E ; G 5054\nU 64287 ; WX 331 ; N uniFB1F ; G 5055\nU 64288 ; WX 636 ; N uniFB20 ; G 5056\nU 64289 ; WX 856 ; N uniFB21 ; G 5057\nU 64290 ; WX 774 ; N uniFB22 ; G 5058\nU 64291 ; WX 906 ; N uniFB23 ; G 5059\nU 64292 ; WX 771 ; N uniFB24 ; G 5060\nU 64293 ; WX 843 ; N uniFB25 ; G 5061\nU 64294 ; WX 855 ; N uniFB26 ; G 5062\nU 64295 ; WX 807 ; N uniFB27 ; G 5063\nU 64296 ; WX 875 ; N uniFB28 ; G 5064\nU 64297 ; WX 838 ; N uniFB29 ; G 5065\nU 64298 ; WX 708 ; N uniFB2A ; G 5066\nU 64299 ; WX 708 ; N uniFB2B ; G 5067\nU 64300 ; WX 708 ; N uniFB2C ; G 5068\nU 64301 ; WX 708 ; N uniFB2D ; G 5069\nU 64302 ; WX 668 ; N uniFB2E ; G 5070\nU 64303 ; WX 668 ; N uniFB2F ; G 5071\nU 64304 ; WX 668 ; N uniFB30 ; G 5072\nU 64305 ; WX 578 ; N uniFB31 ; G 5073\nU 64306 ; WX 412 ; N uniFB32 ; G 5074\nU 64307 ; WX 546 ; N uniFB33 ; G 5075\nU 64308 ; WX 653 ; N uniFB34 ; G 5076\nU 64309 ; WX 355 ; N uniFB35 ; G 5077\nU 64310 ; WX 406 ; N uniFB36 ; G 5078\nU 64312 ; WX 648 ; N uniFB38 ; G 5079\nU 64313 ; WX 330 ; N uniFB39 ; G 5080\nU 64314 ; WX 537 ; N uniFB3A ; G 5081\nU 64315 ; WX 529 ; N uniFB3B ; G 5082\nU 64316 ; WX 568 ; N uniFB3C ; G 5083\nU 64318 ; WX 679 ; N uniFB3E ; G 5084\nU 64320 ; WX 399 ; N uniFB40 ; G 5085\nU 64321 ; WX 649 ; N uniFB41 ; G 5086\nU 64323 ; WX 640 ; N uniFB43 ; G 5087\nU 64324 ; WX 625 ; N uniFB44 ; G 5088\nU 64326 ; WX 593 ; N uniFB46 ; G 5089\nU 64327 ; WX 709 ; N uniFB47 ; G 5090\nU 64328 ; WX 564 ; N uniFB48 ; G 5091\nU 64329 ; WX 708 ; N uniFB49 ; G 5092\nU 64330 ; WX 657 ; N uniFB4A ; G 5093\nU 64331 ; WX 272 ; N uniFB4B ; G 5094\nU 64332 ; WX 578 ; N uniFB4C ; G 5095\nU 64333 ; WX 529 ; N uniFB4D ; G 5096\nU 64334 ; WX 625 ; N uniFB4E ; G 5097\nU 64335 ; WX 629 ; N uniFB4F ; G 5098\nU 64338 ; WX 941 ; N uniFB52 ; G 5099\nU 64339 ; WX 982 ; N uniFB53 ; G 5100\nU 64340 ; WX 278 ; N uniFB54 ; G 5101\nU 64341 ; WX 302 ; N uniFB55 ; G 5102\nU 64342 ; WX 941 ; N uniFB56 ; G 5103\nU 64343 ; WX 982 ; N uniFB57 ; G 5104\nU 64344 ; WX 278 ; N uniFB58 ; G 5105\nU 64345 ; WX 302 ; N uniFB59 ; G 5106\nU 64346 ; WX 941 ; N uniFB5A ; G 5107\nU 64347 ; WX 982 ; N uniFB5B ; G 5108\nU 64348 ; WX 278 ; N uniFB5C ; G 5109\nU 64349 ; WX 302 ; N uniFB5D ; G 5110\nU 64350 ; WX 941 ; N uniFB5E ; G 5111\nU 64351 ; WX 982 ; N uniFB5F ; G 5112\nU 64352 ; WX 278 ; N uniFB60 ; G 5113\nU 64353 ; WX 302 ; N uniFB61 ; G 5114\nU 64354 ; WX 941 ; N uniFB62 ; G 5115\nU 64355 ; WX 982 ; N uniFB63 ; G 5116\nU 64356 ; WX 278 ; N uniFB64 ; G 5117\nU 64357 ; WX 302 ; N uniFB65 ; G 5118\nU 64358 ; WX 941 ; N uniFB66 ; G 5119\nU 64359 ; WX 982 ; N uniFB67 ; G 5120\nU 64360 ; WX 278 ; N uniFB68 ; G 5121\nU 64361 ; WX 302 ; N uniFB69 ; G 5122\nU 64362 ; WX 1037 ; N uniFB6A ; G 5123\nU 64363 ; WX 1035 ; N uniFB6B ; G 5124\nU 64364 ; WX 478 ; N uniFB6C ; G 5125\nU 64365 ; WX 506 ; N uniFB6D ; G 5126\nU 64366 ; WX 1037 ; N uniFB6E ; G 5127\nU 64367 ; WX 1035 ; N uniFB6F ; G 5128\nU 64368 ; WX 478 ; N uniFB70 ; G 5129\nU 64369 ; WX 506 ; N uniFB71 ; G 5130\nU 64370 ; WX 646 ; N uniFB72 ; G 5131\nU 64371 ; WX 646 ; N uniFB73 ; G 5132\nU 64372 ; WX 618 ; N uniFB74 ; G 5133\nU 64373 ; WX 646 ; N uniFB75 ; G 5134\nU 64374 ; WX 646 ; N uniFB76 ; G 5135\nU 64375 ; WX 646 ; N uniFB77 ; G 5136\nU 64376 ; WX 618 ; N uniFB78 ; G 5137\nU 64377 ; WX 646 ; N uniFB79 ; G 5138\nU 64378 ; WX 646 ; N uniFB7A ; G 5139\nU 64379 ; WX 646 ; N uniFB7B ; G 5140\nU 64380 ; WX 618 ; N uniFB7C ; G 5141\nU 64381 ; WX 646 ; N uniFB7D ; G 5142\nU 64382 ; WX 646 ; N uniFB7E ; G 5143\nU 64383 ; WX 646 ; N uniFB7F ; G 5144\nU 64384 ; WX 618 ; N uniFB80 ; G 5145\nU 64385 ; WX 646 ; N uniFB81 ; G 5146\nU 64386 ; WX 445 ; N uniFB82 ; G 5147\nU 64387 ; WX 525 ; N uniFB83 ; G 5148\nU 64388 ; WX 445 ; N uniFB84 ; G 5149\nU 64389 ; WX 525 ; N uniFB85 ; G 5150\nU 64390 ; WX 445 ; N uniFB86 ; G 5151\nU 64391 ; WX 525 ; N uniFB87 ; G 5152\nU 64392 ; WX 445 ; N uniFB88 ; G 5153\nU 64393 ; WX 525 ; N uniFB89 ; G 5154\nU 64394 ; WX 483 ; N uniFB8A ; G 5155\nU 64395 ; WX 552 ; N uniFB8B ; G 5156\nU 64396 ; WX 483 ; N uniFB8C ; G 5157\nU 64397 ; WX 552 ; N uniFB8D ; G 5158\nU 64398 ; WX 895 ; N uniFB8E ; G 5159\nU 64399 ; WX 895 ; N uniFB8F ; G 5160\nU 64400 ; WX 476 ; N uniFB90 ; G 5161\nU 64401 ; WX 552 ; N uniFB91 ; G 5162\nU 64402 ; WX 895 ; N uniFB92 ; G 5163\nU 64403 ; WX 895 ; N uniFB93 ; G 5164\nU 64404 ; WX 476 ; N uniFB94 ; G 5165\nU 64405 ; WX 552 ; N uniFB95 ; G 5166\nU 64406 ; WX 895 ; N uniFB96 ; G 5167\nU 64407 ; WX 895 ; N uniFB97 ; G 5168\nU 64408 ; WX 476 ; N uniFB98 ; G 5169\nU 64409 ; WX 552 ; N uniFB99 ; G 5170\nU 64410 ; WX 895 ; N uniFB9A ; G 5171\nU 64411 ; WX 895 ; N uniFB9B ; G 5172\nU 64412 ; WX 476 ; N uniFB9C ; G 5173\nU 64413 ; WX 552 ; N uniFB9D ; G 5174\nU 64414 ; WX 734 ; N uniFB9E ; G 5175\nU 64415 ; WX 761 ; N uniFB9F ; G 5176\nU 64416 ; WX 734 ; N uniFBA0 ; G 5177\nU 64417 ; WX 761 ; N uniFBA1 ; G 5178\nU 64418 ; WX 278 ; N uniFBA2 ; G 5179\nU 64419 ; WX 302 ; N uniFBA3 ; G 5180\nU 64426 ; WX 698 ; N uniFBAA ; G 5181\nU 64427 ; WX 632 ; N uniFBAB ; G 5182\nU 64428 ; WX 527 ; N uniFBAC ; G 5183\nU 64429 ; WX 461 ; N uniFBAD ; G 5184\nU 64467 ; WX 824 ; N uniFBD3 ; G 5185\nU 64468 ; WX 843 ; N uniFBD4 ; G 5186\nU 64469 ; WX 476 ; N uniFBD5 ; G 5187\nU 64470 ; WX 552 ; N uniFBD6 ; G 5188\nU 64471 ; WX 483 ; N uniFBD7 ; G 5189\nU 64472 ; WX 517 ; N uniFBD8 ; G 5190\nU 64473 ; WX 483 ; N uniFBD9 ; G 5191\nU 64474 ; WX 517 ; N uniFBDA ; G 5192\nU 64475 ; WX 483 ; N uniFBDB ; G 5193\nU 64476 ; WX 517 ; N uniFBDC ; G 5194\nU 64478 ; WX 483 ; N uniFBDE ; G 5195\nU 64479 ; WX 517 ; N uniFBDF ; G 5196\nU 64484 ; WX 783 ; N uniFBE4 ; G 5197\nU 64485 ; WX 833 ; N uniFBE5 ; G 5198\nU 64486 ; WX 278 ; N uniFBE6 ; G 5199\nU 64487 ; WX 302 ; N uniFBE7 ; G 5200\nU 64488 ; WX 278 ; N uniFBE8 ; G 5201\nU 64489 ; WX 302 ; N uniFBE9 ; G 5202\nU 64508 ; WX 783 ; N uniFBFC ; G 5203\nU 64509 ; WX 833 ; N uniFBFD ; G 5204\nU 64510 ; WX 278 ; N uniFBFE ; G 5205\nU 64511 ; WX 302 ; N uniFBFF ; G 5206\nU 65024 ; WX 0 ; N uniFE00 ; G 5207\nU 65025 ; WX 0 ; N uniFE01 ; G 5208\nU 65026 ; WX 0 ; N uniFE02 ; G 5209\nU 65027 ; WX 0 ; N uniFE03 ; G 5210\nU 65028 ; WX 0 ; N uniFE04 ; G 5211\nU 65029 ; WX 0 ; N uniFE05 ; G 5212\nU 65030 ; WX 0 ; N uniFE06 ; G 5213\nU 65031 ; WX 0 ; N uniFE07 ; G 5214\nU 65032 ; WX 0 ; N uniFE08 ; G 5215\nU 65033 ; WX 0 ; N uniFE09 ; G 5216\nU 65034 ; WX 0 ; N uniFE0A ; G 5217\nU 65035 ; WX 0 ; N uniFE0B ; G 5218\nU 65036 ; WX 0 ; N uniFE0C ; G 5219\nU 65037 ; WX 0 ; N uniFE0D ; G 5220\nU 65038 ; WX 0 ; N uniFE0E ; G 5221\nU 65039 ; WX 0 ; N uniFE0F ; G 5222\nU 65056 ; WX 0 ; N uniFE20 ; G 5223\nU 65057 ; WX 0 ; N uniFE21 ; G 5224\nU 65058 ; WX 0 ; N uniFE22 ; G 5225\nU 65059 ; WX 0 ; N uniFE23 ; G 5226\nU 65136 ; WX 293 ; N uniFE70 ; G 5227\nU 65137 ; WX 293 ; N uniFE71 ; G 5228\nU 65138 ; WX 293 ; N uniFE72 ; G 5229\nU 65139 ; WX 262 ; N uniFE73 ; G 5230\nU 65140 ; WX 293 ; N uniFE74 ; G 5231\nU 65142 ; WX 293 ; N uniFE76 ; G 5232\nU 65143 ; WX 293 ; N uniFE77 ; G 5233\nU 65144 ; WX 293 ; N uniFE78 ; G 5234\nU 65145 ; WX 293 ; N uniFE79 ; G 5235\nU 65146 ; WX 293 ; N uniFE7A ; G 5236\nU 65147 ; WX 293 ; N uniFE7B ; G 5237\nU 65148 ; WX 293 ; N uniFE7C ; G 5238\nU 65149 ; WX 293 ; N uniFE7D ; G 5239\nU 65150 ; WX 293 ; N uniFE7E ; G 5240\nU 65151 ; WX 293 ; N uniFE7F ; G 5241\nU 65152 ; WX 470 ; N uniFE80 ; G 5242\nU 65153 ; WX 278 ; N uniFE81 ; G 5243\nU 65154 ; WX 305 ; N uniFE82 ; G 5244\nU 65155 ; WX 278 ; N uniFE83 ; G 5245\nU 65156 ; WX 305 ; N uniFE84 ; G 5246\nU 65157 ; WX 483 ; N uniFE85 ; G 5247\nU 65158 ; WX 517 ; N uniFE86 ; G 5248\nU 65159 ; WX 278 ; N uniFE87 ; G 5249\nU 65160 ; WX 305 ; N uniFE88 ; G 5250\nU 65161 ; WX 783 ; N uniFE89 ; G 5251\nU 65162 ; WX 833 ; N uniFE8A ; G 5252\nU 65163 ; WX 278 ; N uniFE8B ; G 5253\nU 65164 ; WX 302 ; N uniFE8C ; G 5254\nU 65165 ; WX 278 ; N uniFE8D ; G 5255\nU 65166 ; WX 305 ; N uniFE8E ; G 5256\nU 65167 ; WX 941 ; N uniFE8F ; G 5257\nU 65168 ; WX 982 ; N uniFE90 ; G 5258\nU 65169 ; WX 278 ; N uniFE91 ; G 5259\nU 65170 ; WX 302 ; N uniFE92 ; G 5260\nU 65171 ; WX 524 ; N uniFE93 ; G 5261\nU 65172 ; WX 536 ; N uniFE94 ; G 5262\nU 65173 ; WX 941 ; N uniFE95 ; G 5263\nU 65174 ; WX 982 ; N uniFE96 ; G 5264\nU 65175 ; WX 278 ; N uniFE97 ; G 5265\nU 65176 ; WX 302 ; N uniFE98 ; G 5266\nU 65177 ; WX 941 ; N uniFE99 ; G 5267\nU 65178 ; WX 982 ; N uniFE9A ; G 5268\nU 65179 ; WX 278 ; N uniFE9B ; G 5269\nU 65180 ; WX 302 ; N uniFE9C ; G 5270\nU 65181 ; WX 646 ; N uniFE9D ; G 5271\nU 65182 ; WX 646 ; N uniFE9E ; G 5272\nU 65183 ; WX 618 ; N uniFE9F ; G 5273\nU 65184 ; WX 646 ; N uniFEA0 ; G 5274\nU 65185 ; WX 646 ; N uniFEA1 ; G 5275\nU 65186 ; WX 646 ; N uniFEA2 ; G 5276\nU 65187 ; WX 618 ; N uniFEA3 ; G 5277\nU 65188 ; WX 646 ; N uniFEA4 ; G 5278\nU 65189 ; WX 646 ; N uniFEA5 ; G 5279\nU 65190 ; WX 646 ; N uniFEA6 ; G 5280\nU 65191 ; WX 618 ; N uniFEA7 ; G 5281\nU 65192 ; WX 646 ; N uniFEA8 ; G 5282\nU 65193 ; WX 445 ; N uniFEA9 ; G 5283\nU 65194 ; WX 525 ; N uniFEAA ; G 5284\nU 65195 ; WX 445 ; N uniFEAB ; G 5285\nU 65196 ; WX 525 ; N uniFEAC ; G 5286\nU 65197 ; WX 483 ; N uniFEAD ; G 5287\nU 65198 ; WX 552 ; N uniFEAE ; G 5288\nU 65199 ; WX 483 ; N uniFEAF ; G 5289\nU 65200 ; WX 552 ; N uniFEB0 ; G 5290\nU 65201 ; WX 1221 ; N uniFEB1 ; G 5291\nU 65202 ; WX 1275 ; N uniFEB2 ; G 5292\nU 65203 ; WX 838 ; N uniFEB3 ; G 5293\nU 65204 ; WX 892 ; N uniFEB4 ; G 5294\nU 65205 ; WX 1221 ; N uniFEB5 ; G 5295\nU 65206 ; WX 1275 ; N uniFEB6 ; G 5296\nU 65207 ; WX 838 ; N uniFEB7 ; G 5297\nU 65208 ; WX 892 ; N uniFEB8 ; G 5298\nU 65209 ; WX 1209 ; N uniFEB9 ; G 5299\nU 65210 ; WX 1225 ; N uniFEBA ; G 5300\nU 65211 ; WX 849 ; N uniFEBB ; G 5301\nU 65212 ; WX 867 ; N uniFEBC ; G 5302\nU 65213 ; WX 1209 ; N uniFEBD ; G 5303\nU 65214 ; WX 1225 ; N uniFEBE ; G 5304\nU 65215 ; WX 849 ; N uniFEBF ; G 5305\nU 65216 ; WX 867 ; N uniFEC0 ; G 5306\nU 65217 ; WX 925 ; N uniFEC1 ; G 5307\nU 65218 ; WX 949 ; N uniFEC2 ; G 5308\nU 65219 ; WX 796 ; N uniFEC3 ; G 5309\nU 65220 ; WX 820 ; N uniFEC4 ; G 5310\nU 65221 ; WX 925 ; N uniFEC5 ; G 5311\nU 65222 ; WX 949 ; N uniFEC6 ; G 5312\nU 65223 ; WX 796 ; N uniFEC7 ; G 5313\nU 65224 ; WX 820 ; N uniFEC8 ; G 5314\nU 65225 ; WX 597 ; N uniFEC9 ; G 5315\nU 65226 ; WX 532 ; N uniFECA ; G 5316\nU 65227 ; WX 597 ; N uniFECB ; G 5317\nU 65228 ; WX 482 ; N uniFECC ; G 5318\nU 65229 ; WX 597 ; N uniFECD ; G 5319\nU 65230 ; WX 532 ; N uniFECE ; G 5320\nU 65231 ; WX 523 ; N uniFECF ; G 5321\nU 65232 ; WX 482 ; N uniFED0 ; G 5322\nU 65233 ; WX 1037 ; N uniFED1 ; G 5323\nU 65234 ; WX 1035 ; N uniFED2 ; G 5324\nU 65235 ; WX 478 ; N uniFED3 ; G 5325\nU 65236 ; WX 506 ; N uniFED4 ; G 5326\nU 65237 ; WX 776 ; N uniFED5 ; G 5327\nU 65238 ; WX 834 ; N uniFED6 ; G 5328\nU 65239 ; WX 478 ; N uniFED7 ; G 5329\nU 65240 ; WX 506 ; N uniFED8 ; G 5330\nU 65241 ; WX 824 ; N uniFED9 ; G 5331\nU 65242 ; WX 843 ; N uniFEDA ; G 5332\nU 65243 ; WX 476 ; N uniFEDB ; G 5333\nU 65244 ; WX 552 ; N uniFEDC ; G 5334\nU 65245 ; WX 727 ; N uniFEDD ; G 5335\nU 65246 ; WX 757 ; N uniFEDE ; G 5336\nU 65247 ; WX 305 ; N uniFEDF ; G 5337\nU 65248 ; WX 331 ; N uniFEE0 ; G 5338\nU 65249 ; WX 619 ; N uniFEE1 ; G 5339\nU 65250 ; WX 666 ; N uniFEE2 ; G 5340\nU 65251 ; WX 536 ; N uniFEE3 ; G 5341\nU 65252 ; WX 578 ; N uniFEE4 ; G 5342\nU 65253 ; WX 734 ; N uniFEE5 ; G 5343\nU 65254 ; WX 761 ; N uniFEE6 ; G 5344\nU 65255 ; WX 278 ; N uniFEE7 ; G 5345\nU 65256 ; WX 302 ; N uniFEE8 ; G 5346\nU 65257 ; WX 524 ; N uniFEE9 ; G 5347\nU 65258 ; WX 536 ; N uniFEEA ; G 5348\nU 65259 ; WX 527 ; N uniFEEB ; G 5349\nU 65260 ; WX 461 ; N uniFEEC ; G 5350\nU 65261 ; WX 483 ; N uniFEED ; G 5351\nU 65262 ; WX 517 ; N uniFEEE ; G 5352\nU 65263 ; WX 783 ; N uniFEEF ; G 5353\nU 65264 ; WX 833 ; N uniFEF0 ; G 5354\nU 65265 ; WX 783 ; N uniFEF1 ; G 5355\nU 65266 ; WX 833 ; N uniFEF2 ; G 5356\nU 65267 ; WX 278 ; N uniFEF3 ; G 5357\nU 65268 ; WX 302 ; N uniFEF4 ; G 5358\nU 65269 ; WX 570 ; N uniFEF5 ; G 5359\nU 65270 ; WX 597 ; N uniFEF6 ; G 5360\nU 65271 ; WX 570 ; N uniFEF7 ; G 5361\nU 65272 ; WX 597 ; N uniFEF8 ; G 5362\nU 65273 ; WX 570 ; N uniFEF9 ; G 5363\nU 65274 ; WX 597 ; N uniFEFA ; G 5364\nU 65275 ; WX 570 ; N uniFEFB ; G 5365\nU 65276 ; WX 597 ; N uniFEFC ; G 5366\nU 65279 ; WX 0 ; N uniFEFF ; G 5367\nU 65529 ; WX 0 ; N uniFFF9 ; G 5368\nU 65530 ; WX 0 ; N uniFFFA ; G 5369\nU 65531 ; WX 0 ; N uniFFFB ; G 5370\nU 65532 ; WX 0 ; N uniFFFC ; G 5371\nU 65533 ; WX 1025 ; N uniFFFD ; G 5372\nEndCharMetrics\nStartKernData \nStartKernPairs 2727\n\nKPX dollar dollar 57\nKPX dollar ampersand -36\nKPX dollar asterisk -36\nKPX dollar two -36\nKPX dollar four -36\nKPX dollar seven -159\nKPX dollar nine -131\nKPX dollar colon -112\nKPX dollar less -159\nKPX dollar F -36\nKPX dollar G -36\nKPX dollar H -36\nKPX dollar I -73\nKPX dollar R -36\nKPX dollar T -36\nKPX dollar W -36\nKPX dollar Y -120\nKPX dollar Z -83\nKPX dollar backslash -139\nKPX dollar m -73\nKPX dollar copyright -36\nKPX dollar ordfeminine -36\nKPX dollar guillemotleft -36\nKPX dollar logicalnot -36\nKPX dollar sfthyphen -36\nKPX dollar acute -36\nKPX dollar mu -36\nKPX dollar paragraph -36\nKPX dollar periodcentered -36\nKPX dollar cedilla -36\nKPX dollar questiondown -139\nKPX dollar Aacute -139\nKPX dollar Acircumflex 57\nKPX dollar Adieresis 57\nKPX dollar AE 57\nKPX dollar Egrave -36\nKPX dollar Eacute -36\nKPX dollar Ecircumflex -36\nKPX dollar Edieresis -36\nKPX dollar Igrave -36\nKPX dollar Iacute -36\nKPX dollar Icircumflex -36\nKPX dollar Idieresis -36\nKPX dollar Ntilde -36\nKPX dollar Oacute -36\nKPX dollar Otilde -36\nKPX dollar multiply -36\nKPX dollar Ugrave -36\nKPX dollar Ucircumflex -36\nKPX dollar Yacute -36\nKPX dollar Thorn -36\nKPX dollar agrave -36\nKPX dollar acircumflex -36\nKPX dollar Dcaron -36\nKPX dollar dcaron -36\nKPX dollar Dcroat -36\nKPX dollar dmacron -36\nKPX dollar Emacron -36\nKPX dollar emacron -36\nKPX dollar Hcircumflex -159\nKPX dollar hcircumflex -36\nKPX dollar Hbar -159\nKPX dollar hbar -36\nKPX dollar Kcommaaccent -112\nKPX dollar kcommaaccent -83\nKPX dollar kgreenlandic -159\nKPX dollar Lacute -139\nKPX dollar lacute -159\nKPX dollar uni0188 -36\nKPX dollar uni01AC -36\nKPX dollar uni01AD -36\nKPX dollar uni01AE -36\nKPX dollar Uhorn -36\nKPX dollar uni01DC -159\nKPX dollar uni01DD -36\nKPX dollar uni01F0 -36\nKPX dollar uni01F3 -36\nKPX dollar uni01F4 -159\nKPX dollar uni01F5 -139\n\nKPX percent ampersand -36\nKPX percent asterisk -36\nKPX percent two -36\nKPX percent six -36\nKPX percent nine -63\nKPX percent colon -73\nKPX percent less -112\nKPX percent m -63\nKPX percent braceright -36\nKPX percent Egrave -36\nKPX percent Ecircumflex -36\nKPX percent Igrave -36\nKPX percent Icircumflex -36\nKPX percent Thorn -36\nKPX percent agrave -36\nKPX percent acircumflex -36\nKPX percent adieresis -36\nKPX percent Dcaron -36\nKPX percent Dcroat -36\nKPX percent Emacron -36\nKPX percent Gcircumflex -36\nKPX percent Gbreve -36\nKPX percent Gdotaccent -36\nKPX percent Gcommaaccent -36\nKPX percent Kcommaaccent -73\nKPX percent kgreenlandic -112\nKPX percent lacute -112\nKPX percent uni01AC -36\nKPX percent uni01AE -36\nKPX percent uni01DA -36\nKPX percent uni01F0 -36\n\nKPX ampersand less -36\nKPX ampersand m -36\nKPX ampersand braceright -36\nKPX ampersand kgreenlandic -36\nKPX ampersand lacute -36\nKPX ampersand uni01F4 -36\n\nKPX quotesingle dollar -36\nKPX quotesingle nine -36\nKPX quotesingle less -112\nKPX quotesingle m -36\nKPX quotesingle braceright -36\nKPX quotesingle Acircumflex -36\nKPX quotesingle Adieresis -36\nKPX quotesingle AE -36\nKPX quotesingle kgreenlandic -112\nKPX quotesingle lacute -112\nKPX quotesingle uni01F4 -112\n\nKPX parenright dollar -188\nKPX parenright six -36\nKPX parenright seven -36\nKPX parenright D -188\nKPX parenright H -112\nKPX parenright L -149\nKPX parenright R -73\nKPX parenright U -149\nKPX parenright X -112\nKPX parenright backslash -188\nKPX parenright cent -188\nKPX parenright sterling -188\nKPX parenright currency -188\nKPX parenright yen -188\nKPX parenright brokenbar -188\nKPX parenright section -188\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -73\nKPX parenright mu -73\nKPX parenright paragraph -73\nKPX parenright periodcentered -73\nKPX parenright cedilla -73\nKPX parenright guillemotright -112\nKPX parenright onequarter -112\nKPX parenright onehalf -112\nKPX parenright threequarters -112\nKPX parenright questiondown -188\nKPX parenright Aacute -188\nKPX parenright Acircumflex -188\nKPX parenright Atilde -188\nKPX parenright Adieresis -188\nKPX parenright Aring -188\nKPX parenright AE -188\nKPX parenright Ccedilla -188\nKPX parenright Otilde -112\nKPX parenright multiply -112\nKPX parenright Ugrave -112\nKPX parenright Ucircumflex -112\nKPX parenright Yacute -112\nKPX parenright ntilde -149\nKPX parenright otilde -149\nKPX parenright dcaron -73\nKPX parenright dmacron -73\nKPX parenright emacron -73\nKPX parenright edotaccent -149\nKPX parenright eogonek -149\nKPX parenright ecaron -149\nKPX parenright Gcircumflex -36\nKPX parenright Gbreve -36\nKPX parenright Gdotaccent -36\nKPX parenright Gcommaaccent -36\nKPX parenright Hcircumflex -36\nKPX parenright Hbar -36\nKPX parenright Itilde -36\nKPX parenright imacron -112\nKPX parenright ibreve -112\nKPX parenright iogonek -112\nKPX parenright dotlessi -112\nKPX parenright ij -112\nKPX parenright jcircumflex -112\nKPX parenright Lacute -188\nKPX parenright uni01AD -73\nKPX parenright Uhorn -73\nKPX parenright uni01DA -36\nKPX parenright uni01DC -36\nKPX parenright uni01F1 -73\nKPX parenright uni01F5 -188\n\nKPX asterisk seven -73\nKPX asterisk less -102\nKPX asterisk m -36\nKPX asterisk braceright -36\nKPX asterisk Hbar -73\nKPX asterisk lacute -102\n\n\nKPX hyphen dollar -36\nKPX hyphen m -36\nKPX hyphen braceright -36\n\nKPX period dollar -36\nKPX period ampersand -112\nKPX period two -112\nKPX period seven -159\nKPX period eight -55\nKPX period colon -73\nKPX period less -73\nKPX period D -36\nKPX period H -102\nKPX period R -102\nKPX period X -102\nKPX period backslash -149\nKPX period m -131\nKPX period cent -36\nKPX period sterling -36\nKPX period currency -36\nKPX period yen -36\nKPX period brokenbar -36\nKPX period section -36\nKPX period ordfeminine -102\nKPX period guillemotleft -102\nKPX period logicalnot -102\nKPX period sfthyphen -102\nKPX period acute -102\nKPX period mu -102\nKPX period paragraph -102\nKPX period periodcentered -102\nKPX period cedilla -102\nKPX period guillemotright -102\nKPX period onequarter -102\nKPX period onehalf -102\nKPX period threequarters -102\nKPX period questiondown -149\nKPX period Aacute -149\nKPX period Egrave -112\nKPX period Icircumflex -112\nKPX period Yacute -102\nKPX period Hbar -159\nKPX period Idot -55\nKPX period dotlessi -102\nKPX period lacute -73\n\nKPX slash dollar 47\nKPX slash two -73\nKPX slash seven -282\nKPX slash eight -102\nKPX slash nine -225\nKPX slash colon -188\nKPX slash less -272\nKPX slash H -36\nKPX slash R -36\nKPX slash X -36\nKPX slash backslash -188\nKPX slash ordfeminine -36\nKPX slash guillemotleft -36\nKPX slash logicalnot -36\nKPX slash sfthyphen -36\nKPX slash acute -36\nKPX slash mu -36\nKPX slash paragraph -36\nKPX slash periodcentered -36\nKPX slash cedilla -36\nKPX slash guillemotright -36\nKPX slash onequarter -36\nKPX slash onehalf -36\nKPX slash threequarters -36\nKPX slash questiondown -188\nKPX slash Aacute -188\nKPX slash Yacute -36\nKPX slash Hbar -282\nKPX slash Idot -102\nKPX slash dotlessi -36\nKPX slash lacute -272\n\nKPX two dollar -36\nKPX two nine -36\nKPX two semicolon -131\nKPX two less -112\nKPX two m -36\nKPX two lacute -112\n\nKPX three dollar -131\nKPX three less -45\nKPX three D -92\nKPX three H -73\nKPX three L -45\nKPX three Q -36\nKPX three R -73\nKPX three U -36\nKPX three V -36\nKPX three X -36\nKPX three m -36\nKPX three cent -92\nKPX three sterling -92\nKPX three currency -92\nKPX three yen -92\nKPX three brokenbar -92\nKPX three section -92\nKPX three ordfeminine -73\nKPX three guillemotleft -73\nKPX three logicalnot -73\nKPX three sfthyphen -73\nKPX three threesuperior -36\nKPX three acute -73\nKPX three mu -73\nKPX three paragraph -73\nKPX three periodcentered -73\nKPX three cedilla -73\nKPX three guillemotright -36\nKPX three onequarter -36\nKPX three onehalf -36\nKPX three threequarters -36\nKPX three Yacute -73\nKPX three Cdotaccent -36\nKPX three edotaccent -36\nKPX three ecaron -36\nKPX three gdotaccent -36\nKPX three gcommaaccent -36\nKPX three dotlessi -36\nKPX three lacute -45\n\n\nKPX five dollar -83\nKPX five ampersand -102\nKPX five seven -149\nKPX five nine -112\nKPX five colon -83\nKPX five less -131\nKPX five D -45\nKPX five H -92\nKPX five R -92\nKPX five X -92\nKPX five backslash -112\nKPX five m -112\nKPX five braceright -36\nKPX five cent -45\nKPX five sterling -45\nKPX five currency -45\nKPX five yen -45\nKPX five brokenbar -45\nKPX five section -45\nKPX five ordfeminine -92\nKPX five guillemotleft -92\nKPX five logicalnot -92\nKPX five sfthyphen -92\nKPX five acute -92\nKPX five mu -92\nKPX five paragraph -92\nKPX five periodcentered -92\nKPX five cedilla -92\nKPX five guillemotright -92\nKPX five onequarter -92\nKPX five onehalf -92\nKPX five threequarters -92\nKPX five questiondown -112\nKPX five Aacute -112\nKPX five Egrave -102\nKPX five Icircumflex -102\nKPX five Yacute -92\nKPX five Hbar -149\nKPX five dotlessi -92\nKPX five lacute -131\n\nKPX six dollar 38\n\nKPX seven dollar -159\nKPX seven ampersand -120\nKPX seven seven -36\nKPX seven D -339\nKPX seven F -348\nKPX seven H -348\nKPX seven L -63\nKPX seven R -348\nKPX seven U -301\nKPX seven V -339\nKPX seven X -311\nKPX seven Z -339\nKPX seven backslash -319\nKPX seven m -188\nKPX seven braceright -112\nKPX seven cent -239\nKPX seven sterling -339\nKPX seven currency -239\nKPX seven yen -239\nKPX seven brokenbar -239\nKPX seven section -239\nKPX seven copyright -348\nKPX seven ordfeminine -288\nKPX seven guillemotleft -348\nKPX seven logicalnot -288\nKPX seven sfthyphen -288\nKPX seven acute -268\nKPX seven mu -348\nKPX seven paragraph -268\nKPX seven periodcentered -268\nKPX seven cedilla -268\nKPX seven guillemotright -281\nKPX seven onequarter -311\nKPX seven onehalf -281\nKPX seven threequarters -281\nKPX seven questiondown -319\nKPX seven Aacute -319\nKPX seven Egrave -120\nKPX seven Eacute -348\nKPX seven Icircumflex -120\nKPX seven Idieresis -348\nKPX seven Yacute -348\nKPX seven edotaccent -301\nKPX seven ecaron -301\nKPX seven gdotaccent -339\nKPX seven gcommaaccent -339\nKPX seven Hbar -36\nKPX seven dotlessi -311\n\nKPX eight equal -36\nKPX eight Ldot -36\n\nKPX nine dollar -131\nKPX nine two -36\nKPX nine D -159\nKPX nine H -159\nKPX nine L -45\nKPX nine R -159\nKPX nine X -139\nKPX nine backslash -55\nKPX nine m -178\nKPX nine braceright -112\nKPX nine cent -159\nKPX nine sterling -159\nKPX nine currency -159\nKPX nine yen -159\nKPX nine brokenbar -159\nKPX nine section -159\nKPX nine ordfeminine -159\nKPX nine guillemotleft -159\nKPX nine logicalnot -159\nKPX nine sfthyphen -159\nKPX nine acute -159\nKPX nine mu -159\nKPX nine paragraph -159\nKPX nine periodcentered -159\nKPX nine cedilla -159\nKPX nine guillemotright -139\nKPX nine onequarter -139\nKPX nine onehalf -139\nKPX nine threequarters -139\nKPX nine questiondown -55\nKPX nine Aacute -55\nKPX nine Yacute -159\nKPX nine dotlessi -139\n\nKPX colon dollar -112\nKPX colon D -131\nKPX colon H -120\nKPX colon L -45\nKPX colon R -120\nKPX colon U -92\nKPX colon X -73\nKPX colon backslash -36\nKPX colon m -112\nKPX colon braceright -36\nKPX colon cent -131\nKPX colon sterling -131\nKPX colon currency -131\nKPX colon yen -131\nKPX colon brokenbar -131\nKPX colon section -131\nKPX colon ordfeminine -120\nKPX colon guillemotleft -120\nKPX colon logicalnot -120\nKPX colon sfthyphen -120\nKPX colon acute -120\nKPX colon mu -120\nKPX colon paragraph -120\nKPX colon periodcentered -120\nKPX colon cedilla -120\nKPX colon guillemotright -73\nKPX colon onequarter -73\nKPX colon onehalf -73\nKPX colon threequarters -73\nKPX colon questiondown -36\nKPX colon Aacute -36\nKPX colon Yacute -120\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -73\n\nKPX semicolon ampersand -149\nKPX semicolon two -131\nKPX semicolon seven -36\nKPX semicolon H -92\nKPX semicolon m -112\nKPX semicolon ordfeminine -92\nKPX semicolon guillemotleft -92\nKPX semicolon logicalnot -92\nKPX semicolon sfthyphen -92\nKPX semicolon Egrave -149\nKPX semicolon Icircumflex -149\nKPX semicolon Yacute -92\nKPX semicolon Hbar -36\n\nKPX less dollar -159\nKPX less ampersand -112\nKPX less two -112\nKPX less D -282\nKPX less H -272\nKPX less L -73\nKPX less R -272\nKPX less X -235\nKPX less m -225\nKPX less braceright -149\nKPX less cent -282\nKPX less sterling -282\nKPX less currency -282\nKPX less yen -282\nKPX less brokenbar -282\nKPX less section -282\nKPX less ordfeminine -272\nKPX less guillemotleft -272\nKPX less logicalnot -272\nKPX less sfthyphen -272\nKPX less acute -272\nKPX less mu -272\nKPX less paragraph -272\nKPX less periodcentered -272\nKPX less cedilla -272\nKPX less guillemotright -235\nKPX less onequarter -235\nKPX less onehalf -235\nKPX less threequarters -235\nKPX less Egrave -112\nKPX less Icircumflex -112\nKPX less Yacute -272\nKPX less dotlessi -235\n\n\nKPX H bracketleft -36\n\nKPX I W -36\nKPX I Z -36\nKPX I backslash -36\nKPX I m -73\nKPX I braceright -36\nKPX I questiondown -36\nKPX I Aacute -36\nKPX I hbar -36\n\nKPX N D -36\nKPX N H -73\nKPX N R -73\nKPX N X -63\nKPX N backslash -73\nKPX N cent -36\nKPX N sterling -36\nKPX N currency -36\nKPX N yen -36\nKPX N brokenbar -36\nKPX N section -36\nKPX N ordfeminine -73\nKPX N guillemotleft -73\nKPX N logicalnot -73\nKPX N sfthyphen -73\nKPX N acute -73\nKPX N mu -73\nKPX N paragraph -73\nKPX N periodcentered -73\nKPX N cedilla -73\nKPX N guillemotright -63\nKPX N onequarter -63\nKPX N onehalf -63\nKPX N threequarters -63\nKPX N questiondown -73\nKPX N Aacute -73\nKPX N Yacute -73\nKPX N dotlessi -63\n\n\nKPX R bracketleft -63\n\nKPX U F -45\nKPX U G -36\nKPX U H -45\nKPX U J -36\nKPX U K -36\nKPX U P -36\nKPX U Q -36\nKPX U R -45\nKPX U T -36\nKPX U U -36\nKPX U bracketleft -55\nKPX U m -73\nKPX U copyright -45\nKPX U ordfeminine -45\nKPX U guillemotleft -45\nKPX U logicalnot -45\nKPX U sfthyphen -45\nKPX U threesuperior -36\nKPX U acute -45\nKPX U mu -45\nKPX U paragraph -45\nKPX U periodcentered -45\nKPX U cedilla -45\nKPX U Eacute -45\nKPX U Idieresis -45\nKPX U Ntilde 72\nKPX U Yacute -45\nKPX U aacute -36\nKPX U Cdotaccent -36\nKPX U edotaccent -36\nKPX U ecaron -36\n\nKPX Y m -36\nKPX Y braceright -36\n\nKPX Z m -36\nKPX Z braceright -36\n\nKPX bracketleft F -36\nKPX bracketleft H -63\nKPX bracketleft R -63\nKPX bracketleft copyright -36\nKPX bracketleft ordfeminine -63\nKPX bracketleft guillemotleft -63\nKPX bracketleft logicalnot -63\nKPX bracketleft sfthyphen -63\nKPX bracketleft acute -63\nKPX bracketleft mu -63\nKPX bracketleft paragraph -63\nKPX bracketleft periodcentered -63\nKPX bracketleft cedilla -63\nKPX bracketleft Eacute -36\nKPX bracketleft Idieresis -36\nKPX bracketleft Yacute -63\n\nKPX backslash m -36\nKPX backslash braceright -36\n\nKPX m percent -36\nKPX m ampersand -36\nKPX m quotesingle -36\nKPX m asterisk -36\nKPX m hyphen -36\nKPX m seven -112\nKPX m nine -112\nKPX m colon -36\nKPX m less -149\nKPX m Y -36\nKPX m Z -36\nKPX m backslash -36\nKPX m questiondown -36\nKPX m Aacute -36\nKPX m Egrave -36\nKPX m Icircumflex -36\nKPX m Eth -36\nKPX m agrave -36\nKPX m Hbar -112\nKPX m lacute -149\n\nKPX braceright dollar -73\nKPX braceright percent -73\nKPX braceright ampersand -36\nKPX braceright quotesingle -36\nKPX braceright hyphen -36\nKPX braceright two -36\nKPX braceright seven -188\nKPX braceright nine -178\nKPX braceright colon -112\nKPX braceright semicolon -112\nKPX braceright less -225\nKPX braceright Y -36\nKPX braceright Z -36\nKPX braceright backslash -36\nKPX braceright questiondown -36\nKPX braceright Aacute -36\nKPX braceright Egrave -36\nKPX braceright Icircumflex -36\nKPX braceright Eth -36\nKPX braceright Hbar -188\nKPX braceright lacute -225\n\n\n\nKPX ordfeminine bracketleft -36\n\nKPX guillemotleft bracketleft -36\n\nKPX logicalnot bracketleft -36\n\nKPX sfthyphen bracketleft -36\n\n\n\nKPX acute bracketleft -63\n\nKPX mu bracketleft -63\n\nKPX paragraph bracketleft -63\n\nKPX periodcentered bracketleft -63\n\nKPX cedilla bracketleft -63\n\nKPX questiondown m -36\nKPX questiondown braceright -36\n\nKPX Aacute m -36\nKPX Aacute braceright -36\n\nKPX Acircumflex dollar 57\nKPX Acircumflex ampersand -36\nKPX Acircumflex asterisk -36\nKPX Acircumflex two -36\nKPX Acircumflex four -36\nKPX Acircumflex seven -159\nKPX Acircumflex nine -131\nKPX Acircumflex colon -112\nKPX Acircumflex less -159\nKPX Acircumflex F -36\nKPX Acircumflex G -36\nKPX Acircumflex H -36\nKPX Acircumflex I -73\nKPX Acircumflex R -36\nKPX Acircumflex T -36\nKPX Acircumflex W -36\nKPX Acircumflex Y -120\nKPX Acircumflex Z -83\nKPX Acircumflex backslash -139\nKPX Acircumflex m -73\nKPX Acircumflex copyright -36\nKPX Acircumflex ordfeminine -36\nKPX Acircumflex guillemotleft -36\nKPX Acircumflex logicalnot -36\nKPX Acircumflex sfthyphen -36\nKPX Acircumflex acute -36\nKPX Acircumflex mu -36\nKPX Acircumflex paragraph -36\nKPX Acircumflex periodcentered -36\nKPX Acircumflex cedilla -36\nKPX Acircumflex questiondown -139\nKPX Acircumflex Aacute -139\nKPX Acircumflex Acircumflex 57\nKPX Acircumflex Adieresis 57\nKPX Acircumflex AE 57\nKPX Acircumflex Egrave -36\nKPX Acircumflex Ecircumflex -36\nKPX Acircumflex Igrave -36\nKPX Acircumflex Iacute -36\nKPX Acircumflex Icircumflex -36\nKPX Acircumflex Ntilde -36\nKPX Acircumflex Oacute -36\nKPX Acircumflex Otilde -36\nKPX Acircumflex multiply -36\nKPX Acircumflex Ugrave -36\nKPX Acircumflex Ucircumflex -36\nKPX Acircumflex Yacute -36\nKPX Acircumflex Thorn -36\nKPX Acircumflex acircumflex -36\nKPX Acircumflex Dcaron -36\nKPX Acircumflex dcaron -36\nKPX Acircumflex Dcroat -36\nKPX Acircumflex dmacron -36\nKPX Acircumflex Emacron -36\nKPX Acircumflex emacron -36\nKPX Acircumflex Hcircumflex -159\nKPX Acircumflex hcircumflex -36\nKPX Acircumflex Hbar -159\nKPX Acircumflex hbar -36\nKPX Acircumflex Kcommaaccent -112\nKPX Acircumflex kcommaaccent -83\nKPX Acircumflex kgreenlandic -159\nKPX Acircumflex Lacute -139\nKPX Acircumflex lacute -159\nKPX Acircumflex uni01F0 -36\nKPX Acircumflex uni01F1 -36\n\nKPX Adieresis dollar 57\nKPX Adieresis ampersand -36\nKPX Adieresis asterisk -36\nKPX Adieresis two -36\nKPX Adieresis four -36\nKPX Adieresis seven -159\nKPX Adieresis nine -131\nKPX Adieresis colon -112\nKPX Adieresis less -159\nKPX Adieresis F -36\nKPX Adieresis G -36\nKPX Adieresis H -36\nKPX Adieresis I -73\nKPX Adieresis R -36\nKPX Adieresis T -36\nKPX Adieresis W -36\nKPX Adieresis Y -120\nKPX Adieresis Z -83\nKPX Adieresis backslash -139\nKPX Adieresis m -73\nKPX Adieresis copyright -36\nKPX Adieresis ordfeminine -36\nKPX Adieresis guillemotleft -36\nKPX Adieresis logicalnot -36\nKPX Adieresis sfthyphen -36\nKPX Adieresis acute -36\nKPX Adieresis mu -36\nKPX Adieresis paragraph -36\nKPX Adieresis periodcentered -36\nKPX Adieresis cedilla -36\nKPX Adieresis questiondown -139\nKPX Adieresis Aacute -139\nKPX Adieresis Acircumflex 57\nKPX Adieresis Adieresis 57\nKPX Adieresis AE 57\nKPX Adieresis Egrave -36\nKPX Adieresis Ecircumflex -36\nKPX Adieresis Igrave -36\nKPX Adieresis Iacute -36\nKPX Adieresis Icircumflex -36\nKPX Adieresis Ntilde -36\nKPX Adieresis Oacute -36\nKPX Adieresis Otilde -36\nKPX Adieresis multiply -36\nKPX Adieresis Ugrave -36\nKPX Adieresis Ucircumflex -36\nKPX Adieresis Yacute -36\nKPX Adieresis Thorn -36\nKPX Adieresis acircumflex -36\nKPX Adieresis Dcaron -36\nKPX Adieresis dcaron -36\nKPX Adieresis Dcroat -36\nKPX Adieresis dmacron -36\nKPX Adieresis Emacron -36\nKPX Adieresis emacron -36\nKPX Adieresis Hcircumflex -159\nKPX Adieresis hcircumflex -36\nKPX Adieresis Hbar -159\nKPX Adieresis hbar -36\nKPX Adieresis Kcommaaccent -112\nKPX Adieresis kcommaaccent -83\nKPX Adieresis kgreenlandic -159\nKPX Adieresis Lacute -139\nKPX Adieresis lacute -159\nKPX Adieresis uni01F0 -36\nKPX Adieresis uni01F1 -36\n\nKPX AE dollar 57\nKPX AE ampersand -36\nKPX AE asterisk -36\nKPX AE two -36\nKPX AE four -36\nKPX AE seven -159\nKPX AE nine -131\nKPX AE colon -112\nKPX AE less -159\nKPX AE F -36\nKPX AE G -36\nKPX AE H -36\nKPX AE I -73\nKPX AE R -36\nKPX AE T -36\nKPX AE W -36\nKPX AE Y -120\nKPX AE Z -83\nKPX AE m -73\nKPX AE copyright -36\nKPX AE ordfeminine -36\nKPX AE guillemotleft -36\nKPX AE logicalnot -36\nKPX AE sfthyphen -36\nKPX AE acute -36\nKPX AE mu -36\nKPX AE paragraph -36\nKPX AE periodcentered -36\nKPX AE cedilla -36\nKPX AE Acircumflex 57\nKPX AE Adieresis 57\nKPX AE AE 57\nKPX AE Egrave -36\nKPX AE Ecircumflex -36\nKPX AE Igrave -36\nKPX AE Iacute -36\nKPX AE Icircumflex -36\nKPX AE Ntilde -36\nKPX AE Oacute -36\nKPX AE Otilde -36\nKPX AE multiply -36\nKPX AE Ugrave -36\nKPX AE Ucircumflex -36\nKPX AE Yacute -36\nKPX AE Thorn -36\nKPX AE acircumflex -36\nKPX AE Dcaron -36\nKPX AE dcaron -36\nKPX AE Dcroat -36\nKPX AE dmacron -36\nKPX AE emacron -36\nKPX AE Hcircumflex -159\nKPX AE hcircumflex -36\nKPX AE Hbar -159\nKPX AE hbar -36\nKPX AE Kcommaaccent -112\nKPX AE kcommaaccent -83\nKPX AE kgreenlandic -159\nKPX AE lacute -159\nKPX AE uni01F0 -36\nKPX AE uni01F1 -36\n\nKPX Egrave less -36\nKPX Egrave m -36\nKPX Egrave braceright -36\nKPX Egrave lacute -36\n\nKPX Icircumflex less -36\nKPX Icircumflex m -36\nKPX Icircumflex braceright -36\nKPX Icircumflex lacute -36\n\nKPX Eth dollar -36\nKPX Eth nine -36\nKPX Eth less -112\nKPX Eth m -36\nKPX Eth braceright -36\nKPX Eth Acircumflex -36\nKPX Eth Adieresis -36\nKPX Eth AE -36\nKPX Eth kgreenlandic -112\nKPX Eth lacute -112\nKPX Eth uni01F4 -112\n\nKPX Ograve dollar -36\nKPX Ograve nine -36\nKPX Ograve less -112\nKPX Ograve m -36\nKPX Ograve braceright -36\nKPX Ograve lacute -112\n\nKPX Yacute bracketleft -36\n\nKPX agrave seven -73\nKPX agrave less -102\nKPX agrave m -36\nKPX agrave braceright -36\nKPX agrave Hbar -73\nKPX agrave lacute -102\n\nKPX ucircumflex dollar 47\nKPX ucircumflex two -73\nKPX ucircumflex seven -282\nKPX ucircumflex eight -102\nKPX ucircumflex nine -225\nKPX ucircumflex colon -188\nKPX ucircumflex less -272\nKPX ucircumflex H -36\nKPX ucircumflex R -36\nKPX ucircumflex X -36\nKPX ucircumflex backslash -188\nKPX ucircumflex ordfeminine -36\nKPX ucircumflex guillemotleft -36\nKPX ucircumflex logicalnot -36\nKPX ucircumflex sfthyphen -36\nKPX ucircumflex acute -36\nKPX ucircumflex mu -36\nKPX ucircumflex paragraph -36\nKPX ucircumflex periodcentered -36\nKPX ucircumflex cedilla -36\nKPX ucircumflex guillemotright -36\nKPX ucircumflex onequarter -36\nKPX ucircumflex onehalf -36\nKPX ucircumflex threequarters -36\nKPX ucircumflex questiondown -188\nKPX ucircumflex Aacute -188\nKPX ucircumflex Yacute -36\nKPX ucircumflex Hbar -282\nKPX ucircumflex Idot -102\nKPX ucircumflex dotlessi -36\nKPX ucircumflex lacute -272\n\nKPX ydieresis dollar 47\nKPX ydieresis two -73\nKPX ydieresis seven -282\nKPX ydieresis eight -102\nKPX ydieresis nine -225\nKPX ydieresis colon -188\nKPX ydieresis less -272\nKPX ydieresis H -36\nKPX ydieresis R -36\nKPX ydieresis X -36\nKPX ydieresis backslash -188\nKPX ydieresis ordfeminine -36\nKPX ydieresis guillemotleft -36\nKPX ydieresis logicalnot -36\nKPX ydieresis sfthyphen -36\nKPX ydieresis acute -36\nKPX ydieresis mu -36\nKPX ydieresis paragraph -36\nKPX ydieresis periodcentered -36\nKPX ydieresis cedilla -36\nKPX ydieresis guillemotright -36\nKPX ydieresis onequarter -36\nKPX ydieresis onehalf -36\nKPX ydieresis threequarters -36\nKPX ydieresis questiondown -188\nKPX ydieresis Aacute -188\nKPX ydieresis Yacute -36\nKPX ydieresis Hbar -282\nKPX ydieresis Idot -102\nKPX ydieresis dotlessi -36\nKPX ydieresis lacute -272\n\nKPX Abreve O -193\n\n\nKPX Edotaccent dollar -83\nKPX Edotaccent ampersand -102\nKPX Edotaccent seven -149\nKPX Edotaccent nine -112\nKPX Edotaccent colon -83\nKPX Edotaccent less -131\nKPX Edotaccent D -45\nKPX Edotaccent H -92\nKPX Edotaccent R -92\nKPX Edotaccent X -92\nKPX Edotaccent backslash -112\nKPX Edotaccent m -112\nKPX Edotaccent braceright -36\nKPX Edotaccent cent -45\nKPX Edotaccent sterling -45\nKPX Edotaccent currency -45\nKPX Edotaccent yen -45\nKPX Edotaccent brokenbar -45\nKPX Edotaccent section -45\nKPX Edotaccent ordfeminine -92\nKPX Edotaccent guillemotleft -92\nKPX Edotaccent logicalnot -92\nKPX Edotaccent sfthyphen -92\nKPX Edotaccent acute -92\nKPX Edotaccent mu -92\nKPX Edotaccent paragraph -92\nKPX Edotaccent periodcentered -92\nKPX Edotaccent cedilla -92\nKPX Edotaccent guillemotright -92\nKPX Edotaccent onequarter -92\nKPX Edotaccent onehalf -92\nKPX Edotaccent threequarters -92\nKPX Edotaccent questiondown -112\nKPX Edotaccent Aacute -112\nKPX Edotaccent Egrave -102\nKPX Edotaccent Icircumflex -102\nKPX Edotaccent Yacute -92\nKPX Edotaccent Hbar -149\nKPX Edotaccent dotlessi -92\nKPX Edotaccent lacute -131\n\nKPX edotaccent F -45\nKPX edotaccent G -36\nKPX edotaccent H -45\nKPX edotaccent J -36\nKPX edotaccent K -36\nKPX edotaccent P -36\nKPX edotaccent Q -36\nKPX edotaccent R -45\nKPX edotaccent T -36\nKPX edotaccent U -36\nKPX edotaccent bracketleft -55\nKPX edotaccent m -73\nKPX edotaccent copyright -45\nKPX edotaccent ordfeminine -45\nKPX edotaccent guillemotleft -45\nKPX edotaccent logicalnot -45\nKPX edotaccent sfthyphen -45\nKPX edotaccent threesuperior -36\nKPX edotaccent acute -45\nKPX edotaccent mu -45\nKPX edotaccent paragraph -45\nKPX edotaccent periodcentered -45\nKPX edotaccent cedilla -45\nKPX edotaccent Eacute -45\nKPX edotaccent Idieresis -45\nKPX edotaccent Ntilde 72\nKPX edotaccent Yacute -45\nKPX edotaccent aacute -36\nKPX edotaccent Cdotaccent -36\nKPX edotaccent edotaccent -36\nKPX edotaccent ecaron -36\n\nKPX Ecaron dollar -83\nKPX Ecaron ampersand -102\nKPX Ecaron seven -149\nKPX Ecaron nine -112\nKPX Ecaron colon -83\nKPX Ecaron less -131\nKPX Ecaron D -45\nKPX Ecaron H -92\nKPX Ecaron R -92\nKPX Ecaron X -92\nKPX Ecaron backslash -112\nKPX Ecaron m -112\nKPX Ecaron braceright -36\nKPX Ecaron cent -45\nKPX Ecaron sterling -45\nKPX Ecaron currency -45\nKPX Ecaron yen -45\nKPX Ecaron brokenbar -45\nKPX Ecaron section -45\nKPX Ecaron ordfeminine -92\nKPX Ecaron guillemotleft -92\nKPX Ecaron logicalnot -92\nKPX Ecaron sfthyphen -92\nKPX Ecaron acute -92\nKPX Ecaron mu -92\nKPX Ecaron paragraph -92\nKPX Ecaron periodcentered -92\nKPX Ecaron cedilla -92\nKPX Ecaron guillemotright -92\nKPX Ecaron onequarter -92\nKPX Ecaron onehalf -92\nKPX Ecaron threequarters -92\nKPX Ecaron questiondown -112\nKPX Ecaron Aacute -112\nKPX Ecaron Egrave -102\nKPX Ecaron Icircumflex -102\nKPX Ecaron Yacute -92\nKPX Ecaron Hbar -149\nKPX Ecaron dotlessi -92\nKPX Ecaron lacute -131\n\nKPX ecaron F -45\nKPX ecaron G -36\nKPX ecaron H -45\nKPX ecaron J -36\nKPX ecaron K -36\nKPX ecaron P -36\nKPX ecaron Q -36\nKPX ecaron R -45\nKPX ecaron T -36\nKPX ecaron U -36\nKPX ecaron bracketleft -55\nKPX ecaron m -73\nKPX ecaron copyright -45\nKPX ecaron ordfeminine -45\nKPX ecaron guillemotleft -45\nKPX ecaron logicalnot -45\nKPX ecaron sfthyphen -45\nKPX ecaron threesuperior -36\nKPX ecaron acute -45\nKPX ecaron mu -45\nKPX ecaron paragraph -45\nKPX ecaron periodcentered -45\nKPX ecaron cedilla -45\nKPX ecaron Eacute -45\nKPX ecaron Idieresis -45\nKPX ecaron Ntilde -36\nKPX ecaron Yacute -45\nKPX ecaron aacute -36\nKPX ecaron Cdotaccent -36\nKPX ecaron edotaccent -36\nKPX ecaron ecaron -36\n\nKPX Gdotaccent dollar 38\n\nKPX Gcommaaccent dollar 38\n\nKPX Hbar dollar -159\nKPX Hbar ampersand -120\nKPX Hbar seven -36\nKPX Hbar D -339\nKPX Hbar F -348\nKPX Hbar H -348\nKPX Hbar L -63\nKPX Hbar R -348\nKPX Hbar U -301\nKPX Hbar V -339\nKPX Hbar X -311\nKPX Hbar Z -339\nKPX Hbar backslash -319\nKPX Hbar m -188\nKPX Hbar braceright -112\nKPX Hbar cent -339\nKPX Hbar sterling -339\nKPX Hbar currency -339\nKPX Hbar yen -339\nKPX Hbar brokenbar -339\nKPX Hbar section -339\nKPX Hbar copyright -348\nKPX Hbar ordfeminine -348\nKPX Hbar guillemotleft -348\nKPX Hbar logicalnot -348\nKPX Hbar sfthyphen -348\nKPX Hbar acute -348\nKPX Hbar mu -348\nKPX Hbar paragraph -348\nKPX Hbar periodcentered -348\nKPX Hbar cedilla -348\nKPX Hbar guillemotright -311\nKPX Hbar onequarter -311\nKPX Hbar onehalf -311\nKPX Hbar threequarters -311\nKPX Hbar questiondown -319\nKPX Hbar Aacute -319\nKPX Hbar Egrave -120\nKPX Hbar Eacute -348\nKPX Hbar Icircumflex -120\nKPX Hbar Idieresis -348\nKPX Hbar Yacute -348\nKPX Hbar edotaccent -301\nKPX Hbar ecaron -301\nKPX Hbar gdotaccent -339\nKPX Hbar gcommaaccent -339\nKPX Hbar Hbar -36\nKPX Hbar dotlessi -311\n\nKPX Idot equal -36\nKPX Idot Ldot -36\n\nKPX lacute dollar -159\nKPX lacute ampersand -112\nKPX lacute two -112\nKPX lacute D -282\nKPX lacute H -272\nKPX lacute L -73\nKPX lacute R -272\nKPX lacute X -235\nKPX lacute m -225\nKPX lacute braceright -149\nKPX lacute cent -282\nKPX lacute sterling -282\nKPX lacute currency -282\nKPX lacute yen -282\nKPX lacute brokenbar -282\nKPX lacute section -282\nKPX lacute ordfeminine -272\nKPX lacute guillemotleft -272\nKPX lacute logicalnot -272\nKPX lacute sfthyphen -272\nKPX lacute acute -272\nKPX lacute mu -272\nKPX lacute paragraph -272\nKPX lacute periodcentered -272\nKPX lacute cedilla -272\nKPX lacute guillemotright -235\nKPX lacute onequarter -235\nKPX lacute onehalf -235\nKPX lacute threequarters -235\nKPX lacute Egrave -112\nKPX lacute Icircumflex -112\nKPX lacute Yacute -272\nKPX lacute dotlessi -235\n\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSans.ufm.php",
    "content": "<?php return array (\n  'codeToName' => \n  array (\n    32 => 'space',\n    33 => 'exclam',\n    34 => 'quotedbl',\n    35 => 'numbersign',\n    36 => 'dollar',\n    37 => 'percent',\n    38 => 'ampersand',\n    39 => 'quotesingle',\n    40 => 'parenleft',\n    41 => 'parenright',\n    42 => 'asterisk',\n    43 => 'plus',\n    44 => 'comma',\n    45 => 'hyphen',\n    46 => 'period',\n    47 => 'slash',\n    48 => 'zero',\n    49 => 'one',\n    50 => 'two',\n    51 => 'three',\n    52 => 'four',\n    53 => 'five',\n    54 => 'six',\n    55 => 'seven',\n    56 => 'eight',\n    57 => 'nine',\n    58 => 'colon',\n    59 => 'semicolon',\n    60 => 'less',\n    61 => 'equal',\n    62 => 'greater',\n    63 => 'question',\n    64 => 'at',\n    65 => 'A',\n    66 => 'B',\n    67 => 'C',\n    68 => 'D',\n    69 => 'E',\n    70 => 'F',\n    71 => 'G',\n    72 => 'H',\n    73 => 'I',\n    74 => 'J',\n    75 => 'K',\n    76 => 'L',\n    77 => 'M',\n    78 => 'N',\n    79 => 'O',\n    80 => 'P',\n    81 => 'Q',\n    82 => 'R',\n    83 => 'S',\n    84 => 'T',\n    85 => 'U',\n    86 => 'V',\n    87 => 'W',\n    88 => 'X',\n    89 => 'Y',\n    90 => 'Z',\n    91 => 'bracketleft',\n    92 => 'backslash',\n    93 => 'bracketright',\n    94 => 'asciicircum',\n    95 => 'underscore',\n    96 => 'grave',\n    97 => 'a',\n    98 => 'b',\n    99 => 'c',\n    100 => 'd',\n    101 => 'e',\n    102 => 'f',\n    103 => 'g',\n    104 => 'h',\n    105 => 'i',\n    106 => 'j',\n    107 => 'k',\n    108 => 'l',\n    109 => 'm',\n    110 => 'n',\n    111 => 'o',\n    112 => 'p',\n    113 => 'q',\n    114 => 'r',\n    115 => 's',\n    116 => 't',\n    117 => 'u',\n    118 => 'v',\n    119 => 'w',\n    120 => 'x',\n    121 => 'y',\n    122 => 'z',\n    123 => 'braceleft',\n    124 => 'bar',\n    125 => 'braceright',\n    126 => 'asciitilde',\n    160 => 'nbspace',\n    161 => 'exclamdown',\n    162 => 'cent',\n    163 => 'sterling',\n    164 => 'currency',\n    165 => 'yen',\n    166 => 'brokenbar',\n    167 => 'section',\n    168 => 'dieresis',\n    169 => 'copyright',\n    170 => 'ordfeminine',\n    171 => 'guillemotleft',\n    172 => 'logicalnot',\n    173 => 'sfthyphen',\n    174 => 'registered',\n    175 => 'macron',\n    176 => 'degree',\n    177 => 'plusminus',\n    178 => 'twosuperior',\n    179 => 'threesuperior',\n    180 => 'acute',\n    181 => 'mu',\n    182 => 'paragraph',\n    183 => 'periodcentered',\n    184 => 'cedilla',\n    185 => 'onesuperior',\n    186 => 'ordmasculine',\n    187 => 'guillemotright',\n    188 => 'onequarter',\n    189 => 'onehalf',\n    190 => 'threequarters',\n    191 => 'questiondown',\n    192 => 'Agrave',\n    193 => 'Aacute',\n    194 => 'Acircumflex',\n    195 => 'Atilde',\n    196 => 'Adieresis',\n    197 => 'Aring',\n    198 => 'AE',\n    199 => 'Ccedilla',\n    200 => 'Egrave',\n    201 => 'Eacute',\n    202 => 'Ecircumflex',\n    203 => 'Edieresis',\n    204 => 'Igrave',\n    205 => 'Iacute',\n    206 => 'Icircumflex',\n    207 => 'Idieresis',\n    208 => 'Eth',\n    209 => 'Ntilde',\n    210 => 'Ograve',\n    211 => 'Oacute',\n    212 => 'Ocircumflex',\n    213 => 'Otilde',\n    214 => 'Odieresis',\n    215 => 'multiply',\n    216 => 'Oslash',\n    217 => 'Ugrave',\n    218 => 'Uacute',\n    219 => 'Ucircumflex',\n    220 => 'Udieresis',\n    221 => 'Yacute',\n    222 => 'Thorn',\n    223 => 'germandbls',\n    224 => 'agrave',\n    225 => 'aacute',\n    226 => 'acircumflex',\n    227 => 'atilde',\n    228 => 'adieresis',\n    229 => 'aring',\n    230 => 'ae',\n    231 => 'ccedilla',\n    232 => 'egrave',\n    233 => 'eacute',\n    234 => 'ecircumflex',\n    235 => 'edieresis',\n    236 => 'igrave',\n    237 => 'iacute',\n    238 => 'icircumflex',\n    239 => 'idieresis',\n    240 => 'eth',\n    241 => 'ntilde',\n    242 => 'ograve',\n    243 => 'oacute',\n    244 => 'ocircumflex',\n    245 => 'otilde',\n    246 => 'odieresis',\n    247 => 'divide',\n    248 => 'oslash',\n    249 => 'ugrave',\n    250 => 'uacute',\n    251 => 'ucircumflex',\n    252 => 'udieresis',\n    253 => 'yacute',\n    254 => 'thorn',\n    255 => 'ydieresis',\n    256 => 'Amacron',\n    257 => 'amacron',\n    258 => 'Abreve',\n    259 => 'abreve',\n    260 => 'Aogonek',\n    261 => 'aogonek',\n    262 => 'Cacute',\n    263 => 'cacute',\n    264 => 'Ccircumflex',\n    265 => 'ccircumflex',\n    266 => 'Cdotaccent',\n    267 => 'cdotaccent',\n    268 => 'Ccaron',\n    269 => 'ccaron',\n    270 => 'Dcaron',\n    271 => 'dcaron',\n    272 => 'Dcroat',\n    273 => 'dmacron',\n    274 => 'Emacron',\n    275 => 'emacron',\n    276 => 'Ebreve',\n    277 => 'ebreve',\n    278 => 'Edotaccent',\n    279 => 'edotaccent',\n    280 => 'Eogonek',\n    281 => 'eogonek',\n    282 => 'Ecaron',\n    283 => 'ecaron',\n    284 => 'Gcircumflex',\n    285 => 'gcircumflex',\n    286 => 'Gbreve',\n    287 => 'gbreve',\n    288 => 'Gdotaccent',\n    289 => 'gdotaccent',\n    290 => 'Gcommaaccent',\n    291 => 'gcommaaccent',\n    292 => 'Hcircumflex',\n    293 => 'hcircumflex',\n    294 => 'Hbar',\n    295 => 'hbar',\n    296 => 'Itilde',\n    297 => 'itilde',\n    298 => 'Imacron',\n    299 => 'imacron',\n    300 => 'Ibreve',\n    301 => 'ibreve',\n    302 => 'Iogonek',\n    303 => 'iogonek',\n    304 => 'Idot',\n    305 => 'dotlessi',\n    306 => 'IJ',\n    307 => 'ij',\n    308 => 'Jcircumflex',\n    309 => 'jcircumflex',\n    310 => 'Kcommaaccent',\n    311 => 'kcommaaccent',\n    312 => 'kgreenlandic',\n    313 => 'Lacute',\n    314 => 'lacute',\n    315 => 'Lcommaaccent',\n    316 => 'lcommaaccent',\n    317 => 'Lcaron',\n    318 => 'lcaron',\n    319 => 'Ldot',\n    320 => 'ldot',\n    321 => 'Lslash',\n    322 => 'lslash',\n    323 => 'Nacute',\n    324 => 'nacute',\n    325 => 'Ncommaaccent',\n    326 => 'ncommaaccent',\n    327 => 'Ncaron',\n    328 => 'ncaron',\n    329 => 'napostrophe',\n    330 => 'Eng',\n    331 => 'eng',\n    332 => 'Omacron',\n    333 => 'omacron',\n    334 => 'Obreve',\n    335 => 'obreve',\n    336 => 'Ohungarumlaut',\n    337 => 'ohungarumlaut',\n    338 => 'OE',\n    339 => 'oe',\n    340 => 'Racute',\n    341 => 'racute',\n    342 => 'Rcommaaccent',\n    343 => 'rcommaaccent',\n    344 => 'Rcaron',\n    345 => 'rcaron',\n    346 => 'Sacute',\n    347 => 'sacute',\n    348 => 'Scircumflex',\n    349 => 'scircumflex',\n    350 => 'Scedilla',\n    351 => 'scedilla',\n    352 => 'Scaron',\n    353 => 'scaron',\n    354 => 'Tcommaaccent',\n    355 => 'tcommaaccent',\n    356 => 'Tcaron',\n    357 => 'tcaron',\n    358 => 'Tbar',\n    359 => 'tbar',\n    360 => 'Utilde',\n    361 => 'utilde',\n    362 => 'Umacron',\n    363 => 'umacron',\n    364 => 'Ubreve',\n    365 => 'ubreve',\n    366 => 'Uring',\n    367 => 'uring',\n    368 => 'Uhungarumlaut',\n    369 => 'uhungarumlaut',\n    370 => 'Uogonek',\n    371 => 'uogonek',\n    372 => 'Wcircumflex',\n    373 => 'wcircumflex',\n    374 => 'Ycircumflex',\n    375 => 'ycircumflex',\n    376 => 'Ydieresis',\n    377 => 'Zacute',\n    378 => 'zacute',\n    379 => 'Zdotaccent',\n    380 => 'zdotaccent',\n    381 => 'Zcaron',\n    382 => 'zcaron',\n    383 => 'longs',\n    384 => 'uni0180',\n    385 => 'uni0181',\n    386 => 'uni0182',\n    387 => 'uni0183',\n    388 => 'uni0184',\n    389 => 'uni0185',\n    390 => 'uni0186',\n    391 => 'uni0187',\n    392 => 'uni0188',\n    393 => 'uni0189',\n    394 => 'uni018A',\n    395 => 'uni018B',\n    396 => 'uni018C',\n    397 => 'uni018D',\n    398 => 'uni018E',\n    399 => 'uni018F',\n    400 => 'uni0190',\n    401 => 'uni0191',\n    402 => 'florin',\n    403 => 'uni0193',\n    404 => 'uni0194',\n    405 => 'uni0195',\n    406 => 'uni0196',\n    407 => 'uni0197',\n    408 => 'uni0198',\n    409 => 'uni0199',\n    410 => 'uni019A',\n    411 => 'uni019B',\n    412 => 'uni019C',\n    413 => 'uni019D',\n    414 => 'uni019E',\n    415 => 'uni019F',\n    416 => 'Ohorn',\n    417 => 'ohorn',\n    418 => 'uni01A2',\n    419 => 'uni01A3',\n    420 => 'uni01A4',\n    421 => 'uni01A5',\n    422 => 'uni01A6',\n    423 => 'uni01A7',\n    424 => 'uni01A8',\n    425 => 'uni01A9',\n    426 => 'uni01AA',\n    427 => 'uni01AB',\n    428 => 'uni01AC',\n    429 => 'uni01AD',\n    430 => 'uni01AE',\n    431 => 'Uhorn',\n    432 => 'uhorn',\n    433 => 'uni01B1',\n    434 => 'uni01B2',\n    435 => 'uni01B3',\n    436 => 'uni01B4',\n    437 => 'uni01B5',\n    438 => 'uni01B6',\n    439 => 'uni01B7',\n    440 => 'uni01B8',\n    441 => 'uni01B9',\n    442 => 'uni01BA',\n    443 => 'uni01BB',\n    444 => 'uni01BC',\n    445 => 'uni01BD',\n    446 => 'uni01BE',\n    447 => 'uni01BF',\n    448 => 'uni01C0',\n    449 => 'uni01C1',\n    450 => 'uni01C2',\n    451 => 'uni01C3',\n    452 => 'uni01C4',\n    453 => 'uni01C5',\n    454 => 'uni01C6',\n    455 => 'uni01C7',\n    456 => 'uni01C8',\n    457 => 'uni01C9',\n    458 => 'uni01CA',\n    459 => 'uni01CB',\n    460 => 'uni01CC',\n    461 => 'uni01CD',\n    462 => 'uni01CE',\n    463 => 'uni01CF',\n    464 => 'uni01D0',\n    465 => 'uni01D1',\n    466 => 'uni01D2',\n    467 => 'uni01D3',\n    468 => 'uni01D4',\n    469 => 'uni01D5',\n    470 => 'uni01D6',\n    471 => 'uni01D7',\n    472 => 'uni01D8',\n    473 => 'uni01D9',\n    474 => 'uni01DA',\n    475 => 'uni01DB',\n    476 => 'uni01DC',\n    477 => 'uni01DD',\n    478 => 'uni01DE',\n    479 => 'uni01DF',\n    480 => 'uni01E0',\n    481 => 'uni01E1',\n    482 => 'uni01E2',\n    483 => 'uni01E3',\n    484 => 'uni01E4',\n    485 => 'uni01E5',\n    486 => 'Gcaron',\n    487 => 'gcaron',\n    488 => 'uni01E8',\n    489 => 'uni01E9',\n    490 => 'uni01EA',\n    491 => 'uni01EB',\n    492 => 'uni01EC',\n    493 => 'uni01ED',\n    494 => 'uni01EE',\n    495 => 'uni01EF',\n    496 => 'uni01F0',\n    497 => 'uni01F1',\n    498 => 'uni01F2',\n    499 => 'uni01F3',\n    500 => 'uni01F4',\n    501 => 'uni01F5',\n    502 => 'uni01F6',\n    503 => 'uni01F7',\n    504 => 'uni01F8',\n    505 => 'uni01F9',\n    506 => 'Aringacute',\n    507 => 'aringacute',\n    508 => 'AEacute',\n    509 => 'aeacute',\n    510 => 'Oslashacute',\n    511 => 'oslashacute',\n    512 => 'uni0200',\n    513 => 'uni0201',\n    514 => 'uni0202',\n    515 => 'uni0203',\n    516 => 'uni0204',\n    517 => 'uni0205',\n    518 => 'uni0206',\n    519 => 'uni0207',\n    520 => 'uni0208',\n    521 => 'uni0209',\n    522 => 'uni020A',\n    523 => 'uni020B',\n    524 => 'uni020C',\n    525 => 'uni020D',\n    526 => 'uni020E',\n    527 => 'uni020F',\n    528 => 'uni0210',\n    529 => 'uni0211',\n    530 => 'uni0212',\n    531 => 'uni0213',\n    532 => 'uni0214',\n    533 => 'uni0215',\n    534 => 'uni0216',\n    535 => 'uni0217',\n    536 => 'Scommaaccent',\n    537 => 'scommaaccent',\n    538 => 'uni021A',\n    539 => 'uni021B',\n    540 => 'uni021C',\n    541 => 'uni021D',\n    542 => 'uni021E',\n    543 => 'uni021F',\n    544 => 'uni0220',\n    545 => 'uni0221',\n    546 => 'uni0222',\n    547 => 'uni0223',\n    548 => 'uni0224',\n    549 => 'uni0225',\n    550 => 'uni0226',\n    551 => 'uni0227',\n    552 => 'uni0228',\n    553 => 'uni0229',\n    554 => 'uni022A',\n    555 => 'uni022B',\n    556 => 'uni022C',\n    557 => 'uni022D',\n    558 => 'uni022E',\n    559 => 'uni022F',\n    560 => 'uni0230',\n    561 => 'uni0231',\n    562 => 'uni0232',\n    563 => 'uni0233',\n    564 => 'uni0234',\n    565 => 'uni0235',\n    566 => 'uni0236',\n    567 => 'dotlessj',\n    568 => 'uni0238',\n    569 => 'uni0239',\n    570 => 'uni023A',\n    571 => 'uni023B',\n    572 => 'uni023C',\n    573 => 'uni023D',\n    574 => 'uni023E',\n    575 => 'uni023F',\n    576 => 'uni0240',\n    577 => 'uni0241',\n    578 => 'uni0242',\n    579 => 'uni0243',\n    580 => 'uni0244',\n    581 => 'uni0245',\n    582 => 'uni0246',\n    583 => 'uni0247',\n    584 => 'uni0248',\n    585 => 'uni0249',\n    586 => 'uni024A',\n    587 => 'uni024B',\n    588 => 'uni024C',\n    589 => 'uni024D',\n    590 => 'uni024E',\n    591 => 'uni024F',\n    592 => 'uni0250',\n    593 => 'uni0251',\n    594 => 'uni0252',\n    595 => 'uni0253',\n    596 => 'uni0254',\n    597 => 'uni0255',\n    598 => 'uni0256',\n    599 => 'uni0257',\n    600 => 'uni0258',\n    601 => 'uni0259',\n    602 => 'uni025A',\n    603 => 'uni025B',\n    604 => 'uni025C',\n    605 => 'uni025D',\n    606 => 'uni025E',\n    607 => 'uni025F',\n    608 => 'uni0260',\n    609 => 'uni0261',\n    610 => 'uni0262',\n    611 => 'uni0263',\n    612 => 'uni0264',\n    613 => 'uni0265',\n    614 => 'uni0266',\n    615 => 'uni0267',\n    616 => 'uni0268',\n    617 => 'uni0269',\n    618 => 'uni026A',\n    619 => 'uni026B',\n    620 => 'uni026C',\n    621 => 'uni026D',\n    622 => 'uni026E',\n    623 => 'uni026F',\n    624 => 'uni0270',\n    625 => 'uni0271',\n    626 => 'uni0272',\n    627 => 'uni0273',\n    628 => 'uni0274',\n    629 => 'uni0275',\n    630 => 'uni0276',\n    631 => 'uni0277',\n    632 => 'uni0278',\n    633 => 'uni0279',\n    634 => 'uni027A',\n    635 => 'uni027B',\n    636 => 'uni027C',\n    637 => 'uni027D',\n    638 => 'uni027E',\n    639 => 'uni027F',\n    640 => 'uni0280',\n    641 => 'uni0281',\n    642 => 'uni0282',\n    643 => 'uni0283',\n    644 => 'uni0284',\n    645 => 'uni0285',\n    646 => 'uni0286',\n    647 => 'uni0287',\n    648 => 'uni0288',\n    649 => 'uni0289',\n    650 => 'uni028A',\n    651 => 'uni028B',\n    652 => 'uni028C',\n    653 => 'uni028D',\n    654 => 'uni028E',\n    655 => 'uni028F',\n    656 => 'uni0290',\n    657 => 'uni0291',\n    658 => 'uni0292',\n    659 => 'uni0293',\n    660 => 'uni0294',\n    661 => 'uni0295',\n    662 => 'uni0296',\n    663 => 'uni0297',\n    664 => 'uni0298',\n    665 => 'uni0299',\n    666 => 'uni029A',\n    667 => 'uni029B',\n    668 => 'uni029C',\n    669 => 'uni029D',\n    670 => 'uni029E',\n    671 => 'uni029F',\n    672 => 'uni02A0',\n    673 => 'uni02A1',\n    674 => 'uni02A2',\n    675 => 'uni02A3',\n    676 => 'uni02A4',\n    677 => 'uni02A5',\n    678 => 'uni02A6',\n    679 => 'uni02A7',\n    680 => 'uni02A8',\n    681 => 'uni02A9',\n    682 => 'uni02AA',\n    683 => 'uni02AB',\n    684 => 'uni02AC',\n    685 => 'uni02AD',\n    686 => 'uni02AE',\n    687 => 'uni02AF',\n    688 => 'uni02B0',\n    689 => 'uni02B1',\n    690 => 'uni02B2',\n    691 => 'uni02B3',\n    692 => 'uni02B4',\n    693 => 'uni02B5',\n    694 => 'uni02B6',\n    695 => 'uni02B7',\n    696 => 'uni02B8',\n    697 => 'uni02B9',\n    698 => 'uni02BA',\n    699 => 'uni02BB',\n    700 => 'uni02BC',\n    701 => 'uni02BD',\n    702 => 'uni02BE',\n    703 => 'uni02BF',\n    704 => 'uni02C0',\n    705 => 'uni02C1',\n    706 => 'uni02C2',\n    707 => 'uni02C3',\n    708 => 'uni02C4',\n    709 => 'uni02C5',\n    710 => 'circumflex',\n    711 => 'caron',\n    712 => 'uni02C8',\n    713 => 'uni02C9',\n    714 => 'uni02CA',\n    715 => 'uni02CB',\n    716 => 'uni02CC',\n    717 => 'uni02CD',\n    718 => 'uni02CE',\n    719 => 'uni02CF',\n    720 => 'uni02D0',\n    721 => 'uni02D1',\n    722 => 'uni02D2',\n    723 => 'uni02D3',\n    724 => 'uni02D4',\n    725 => 'uni02D5',\n    726 => 'uni02D6',\n    727 => 'uni02D7',\n    728 => 'breve',\n    729 => 'dotaccent',\n    730 => 'ring',\n    731 => 'ogonek',\n    732 => 'tilde',\n    733 => 'hungarumlaut',\n    734 => 'uni02DE',\n    735 => 'uni02DF',\n    736 => 'uni02E0',\n    737 => 'uni02E1',\n    738 => 'uni02E2',\n    739 => 'uni02E3',\n    740 => 'uni02E4',\n    741 => 'uni02E5',\n    742 => 'uni02E6',\n    743 => 'uni02E7',\n    744 => 'uni02E8',\n    745 => 'uni02E9',\n    748 => 'uni02EC',\n    749 => 'uni02ED',\n    750 => 'uni02EE',\n    755 => 'uni02F3',\n    759 => 'uni02F7',\n    768 => 'gravecomb',\n    769 => 'acutecomb',\n    770 => 'uni0302',\n    771 => 'tildecomb',\n    772 => 'uni0304',\n    773 => 'uni0305',\n    774 => 'uni0306',\n    775 => 'uni0307',\n    776 => 'uni0308',\n    777 => 'hookabovecomb',\n    778 => 'uni030A',\n    779 => 'uni030B',\n    780 => 'uni030C',\n    781 => 'uni030D',\n    782 => 'uni030E',\n    783 => 'uni030F',\n    784 => 'uni0310',\n    785 => 'uni0311',\n    786 => 'uni0312',\n    787 => 'uni0313',\n    788 => 'uni0314',\n    789 => 'uni0315',\n    790 => 'uni0316',\n    791 => 'uni0317',\n    792 => 'uni0318',\n    793 => 'uni0319',\n    794 => 'uni031A',\n    795 => 'uni031B',\n    796 => 'uni031C',\n    797 => 'uni031D',\n    798 => 'uni031E',\n    799 => 'uni031F',\n    800 => 'uni0320',\n    801 => 'uni0321',\n    802 => 'uni0322',\n    803 => 'dotbelowcomb',\n    804 => 'uni0324',\n    805 => 'uni0325',\n    806 => 'uni0326',\n    807 => 'uni0327',\n    808 => 'uni0328',\n    809 => 'uni0329',\n    810 => 'uni032A',\n    811 => 'uni032B',\n    812 => 'uni032C',\n    813 => 'uni032D',\n    814 => 'uni032E',\n    815 => 'uni032F',\n    816 => 'uni0330',\n    817 => 'uni0331',\n    818 => 'uni0332',\n    819 => 'uni0333',\n    820 => 'uni0334',\n    821 => 'uni0335',\n    822 => 'uni0336',\n    823 => 'uni0337',\n    824 => 'uni0338',\n    825 => 'uni0339',\n    826 => 'uni033A',\n    827 => 'uni033B',\n    828 => 'uni033C',\n    829 => 'uni033D',\n    830 => 'uni033E',\n    831 => 'uni033F',\n    832 => 'uni0340',\n    833 => 'uni0341',\n    834 => 'uni0342',\n    835 => 'uni0343',\n    836 => 'uni0344',\n    837 => 'uni0345',\n    838 => 'uni0346',\n    839 => 'uni0347',\n    840 => 'uni0348',\n    841 => 'uni0349',\n    842 => 'uni034A',\n    843 => 'uni034B',\n    844 => 'uni034C',\n    845 => 'uni034D',\n    846 => 'uni034E',\n    847 => 'uni034F',\n    849 => 'uni0351',\n    850 => 'uni0352',\n    851 => 'uni0353',\n    855 => 'uni0357',\n    856 => 'uni0358',\n    858 => 'uni035A',\n    860 => 'uni035C',\n    861 => 'uni035D',\n    862 => 'uni035E',\n    863 => 'uni035F',\n    864 => 'uni0360',\n    865 => 'uni0361',\n    866 => 'uni0362',\n    880 => 'uni0370',\n    881 => 'uni0371',\n    882 => 'uni0372',\n    883 => 'uni0373',\n    884 => 'uni0374',\n    885 => 'uni0375',\n    886 => 'uni0376',\n    887 => 'uni0377',\n    890 => 'uni037A',\n    891 => 'uni037B',\n    892 => 'uni037C',\n    893 => 'uni037D',\n    894 => 'uni037E',\n    895 => 'uni037F',\n    900 => 'tonos',\n    901 => 'dieresistonos',\n    902 => 'Alphatonos',\n    903 => 'anoteleia',\n    904 => 'Epsilontonos',\n    905 => 'Etatonos',\n    906 => 'Iotatonos',\n    908 => 'Omicrontonos',\n    910 => 'Upsilontonos',\n    911 => 'Omegatonos',\n    912 => 'iotadieresistonos',\n    913 => 'Alpha',\n    914 => 'Beta',\n    915 => 'Gamma',\n    916 => 'uni0394',\n    917 => 'Epsilon',\n    918 => 'Zeta',\n    919 => 'Eta',\n    920 => 'Theta',\n    921 => 'Iota',\n    922 => 'Kappa',\n    923 => 'Lambda',\n    924 => 'Mu',\n    925 => 'Nu',\n    926 => 'Xi',\n    927 => 'Omicron',\n    928 => 'Pi',\n    929 => 'Rho',\n    931 => 'Sigma',\n    932 => 'Tau',\n    933 => 'Upsilon',\n    934 => 'Phi',\n    935 => 'Chi',\n    936 => 'Psi',\n    937 => 'Omega',\n    938 => 'Iotadieresis',\n    939 => 'Upsilondieresis',\n    940 => 'alphatonos',\n    941 => 'epsilontonos',\n    942 => 'etatonos',\n    943 => 'iotatonos',\n    944 => 'upsilondieresistonos',\n    945 => 'alpha',\n    946 => 'beta',\n    947 => 'gamma',\n    948 => 'delta',\n    949 => 'epsilon',\n    950 => 'zeta',\n    951 => 'eta',\n    952 => 'theta',\n    953 => 'iota',\n    954 => 'kappa',\n    955 => 'lambda',\n    956 => 'uni03BC',\n    957 => 'nu',\n    958 => 'xi',\n    959 => 'omicron',\n    960 => 'pi',\n    961 => 'rho',\n    962 => 'sigma1',\n    963 => 'sigma',\n    964 => 'tau',\n    965 => 'upsilon',\n    966 => 'phi',\n    967 => 'chi',\n    968 => 'psi',\n    969 => 'omega',\n    970 => 'iotadieresis',\n    971 => 'upsilondieresis',\n    972 => 'omicrontonos',\n    973 => 'upsilontonos',\n    974 => 'omegatonos',\n    975 => 'uni03CF',\n    976 => 'uni03D0',\n    977 => 'theta1',\n    978 => 'Upsilon1',\n    979 => 'uni03D3',\n    980 => 'uni03D4',\n    981 => 'phi1',\n    982 => 'omega1',\n    983 => 'uni03D7',\n    984 => 'uni03D8',\n    985 => 'uni03D9',\n    986 => 'uni03DA',\n    987 => 'uni03DB',\n    988 => 'uni03DC',\n    989 => 'uni03DD',\n    990 => 'uni03DE',\n    991 => 'uni03DF',\n    992 => 'uni03E0',\n    993 => 'uni03E1',\n    994 => 'uni03E2',\n    995 => 'uni03E3',\n    996 => 'uni03E4',\n    997 => 'uni03E5',\n    998 => 'uni03E6',\n    999 => 'uni03E7',\n    1000 => 'uni03E8',\n    1001 => 'uni03E9',\n    1002 => 'uni03EA',\n    1003 => 'uni03EB',\n    1004 => 'uni03EC',\n    1005 => 'uni03ED',\n    1006 => 'uni03EE',\n    1007 => 'uni03EF',\n    1008 => 'uni03F0',\n    1009 => 'uni03F1',\n    1010 => 'uni03F2',\n    1011 => 'uni03F3',\n    1012 => 'uni03F4',\n    1013 => 'uni03F5',\n    1014 => 'uni03F6',\n    1015 => 'uni03F7',\n    1016 => 'uni03F8',\n    1017 => 'uni03F9',\n    1018 => 'uni03FA',\n    1019 => 'uni03FB',\n    1020 => 'uni03FC',\n    1021 => 'uni03FD',\n    1022 => 'uni03FE',\n    1023 => 'uni03FF',\n    1024 => 'uni0400',\n    1025 => 'uni0401',\n    1026 => 'uni0402',\n    1027 => 'uni0403',\n    1028 => 'uni0404',\n    1029 => 'uni0405',\n    1030 => 'uni0406',\n    1031 => 'uni0407',\n    1032 => 'uni0408',\n    1033 => 'uni0409',\n    1034 => 'uni040A',\n    1035 => 'uni040B',\n    1036 => 'uni040C',\n    1037 => 'uni040D',\n    1038 => 'uni040E',\n    1039 => 'uni040F',\n    1040 => 'uni0410',\n    1041 => 'uni0411',\n    1042 => 'uni0412',\n    1043 => 'uni0413',\n    1044 => 'uni0414',\n    1045 => 'uni0415',\n    1046 => 'uni0416',\n    1047 => 'uni0417',\n    1048 => 'uni0418',\n    1049 => 'uni0419',\n    1050 => 'uni041A',\n    1051 => 'uni041B',\n    1052 => 'uni041C',\n    1053 => 'uni041D',\n    1054 => 'uni041E',\n    1055 => 'uni041F',\n    1056 => 'uni0420',\n    1057 => 'uni0421',\n    1058 => 'uni0422',\n    1059 => 'uni0423',\n    1060 => 'uni0424',\n    1061 => 'uni0425',\n    1062 => 'uni0426',\n    1063 => 'uni0427',\n    1064 => 'uni0428',\n    1065 => 'uni0429',\n    1066 => 'uni042A',\n    1067 => 'uni042B',\n    1068 => 'uni042C',\n    1069 => 'uni042D',\n    1070 => 'uni042E',\n    1071 => 'uni042F',\n    1072 => 'uni0430',\n    1073 => 'uni0431',\n    1074 => 'uni0432',\n    1075 => 'uni0433',\n    1076 => 'uni0434',\n    1077 => 'uni0435',\n    1078 => 'uni0436',\n    1079 => 'uni0437',\n    1080 => 'uni0438',\n    1081 => 'uni0439',\n    1082 => 'uni043A',\n    1083 => 'uni043B',\n    1084 => 'uni043C',\n    1085 => 'uni043D',\n    1086 => 'uni043E',\n    1087 => 'uni043F',\n    1088 => 'uni0440',\n    1089 => 'uni0441',\n    1090 => 'uni0442',\n    1091 => 'uni0443',\n    1092 => 'uni0444',\n    1093 => 'uni0445',\n    1094 => 'uni0446',\n    1095 => 'uni0447',\n    1096 => 'uni0448',\n    1097 => 'uni0449',\n    1098 => 'uni044A',\n    1099 => 'uni044B',\n    1100 => 'uni044C',\n    1101 => 'uni044D',\n    1102 => 'uni044E',\n    1103 => 'uni044F',\n    1104 => 'uni0450',\n    1105 => 'uni0451',\n    1106 => 'uni0452',\n    1107 => 'uni0453',\n    1108 => 'uni0454',\n    1109 => 'uni0455',\n    1110 => 'uni0456',\n    1111 => 'uni0457',\n    1112 => 'uni0458',\n    1113 => 'uni0459',\n    1114 => 'uni045A',\n    1115 => 'uni045B',\n    1116 => 'uni045C',\n    1117 => 'uni045D',\n    1118 => 'uni045E',\n    1119 => 'uni045F',\n    1120 => 'uni0460',\n    1121 => 'uni0461',\n    1122 => 'uni0462',\n    1123 => 'uni0463',\n    1124 => 'uni0464',\n    1125 => 'uni0465',\n    1126 => 'uni0466',\n    1127 => 'uni0467',\n    1128 => 'uni0468',\n    1129 => 'uni0469',\n    1130 => 'uni046A',\n    1131 => 'uni046B',\n    1132 => 'uni046C',\n    1133 => 'uni046D',\n    1134 => 'uni046E',\n    1135 => 'uni046F',\n    1136 => 'uni0470',\n    1137 => 'uni0471',\n    1138 => 'uni0472',\n    1139 => 'uni0473',\n    1140 => 'uni0474',\n    1141 => 'uni0475',\n    1142 => 'uni0476',\n    1143 => 'uni0477',\n    1144 => 'uni0478',\n    1145 => 'uni0479',\n    1146 => 'uni047A',\n    1147 => 'uni047B',\n    1148 => 'uni047C',\n    1149 => 'uni047D',\n    1150 => 'uni047E',\n    1151 => 'uni047F',\n    1152 => 'uni0480',\n    1153 => 'uni0481',\n    1154 => 'uni0482',\n    1155 => 'uni0483',\n    1156 => 'uni0484',\n    1157 => 'uni0485',\n    1158 => 'uni0486',\n    1159 => 'uni0487',\n    1160 => 'uni0488',\n    1161 => 'uni0489',\n    1162 => 'uni048A',\n    1163 => 'uni048B',\n    1164 => 'uni048C',\n    1165 => 'uni048D',\n    1166 => 'uni048E',\n    1167 => 'uni048F',\n    1168 => 'uni0490',\n    1169 => 'uni0491',\n    1170 => 'uni0492',\n    1171 => 'uni0493',\n    1172 => 'uni0494',\n    1173 => 'uni0495',\n    1174 => 'uni0496',\n    1175 => 'uni0497',\n    1176 => 'uni0498',\n    1177 => 'uni0499',\n    1178 => 'uni049A',\n    1179 => 'uni049B',\n    1180 => 'uni049C',\n    1181 => 'uni049D',\n    1182 => 'uni049E',\n    1183 => 'uni049F',\n    1184 => 'uni04A0',\n    1185 => 'uni04A1',\n    1186 => 'uni04A2',\n    1187 => 'uni04A3',\n    1188 => 'uni04A4',\n    1189 => 'uni04A5',\n    1190 => 'uni04A6',\n    1191 => 'uni04A7',\n    1192 => 'uni04A8',\n    1193 => 'uni04A9',\n    1194 => 'uni04AA',\n    1195 => 'uni04AB',\n    1196 => 'uni04AC',\n    1197 => 'uni04AD',\n    1198 => 'uni04AE',\n    1199 => 'uni04AF',\n    1200 => 'uni04B0',\n    1201 => 'uni04B1',\n    1202 => 'uni04B2',\n    1203 => 'uni04B3',\n    1204 => 'uni04B4',\n    1205 => 'uni04B5',\n    1206 => 'uni04B6',\n    1207 => 'uni04B7',\n    1208 => 'uni04B8',\n    1209 => 'uni04B9',\n    1210 => 'uni04BA',\n    1211 => 'uni04BB',\n    1212 => 'uni04BC',\n    1213 => 'uni04BD',\n    1214 => 'uni04BE',\n    1215 => 'uni04BF',\n    1216 => 'uni04C0',\n    1217 => 'uni04C1',\n    1218 => 'uni04C2',\n    1219 => 'uni04C3',\n    1220 => 'uni04C4',\n    1221 => 'uni04C5',\n    1222 => 'uni04C6',\n    1223 => 'uni04C7',\n    1224 => 'uni04C8',\n    1225 => 'uni04C9',\n    1226 => 'uni04CA',\n    1227 => 'uni04CB',\n    1228 => 'uni04CC',\n    1229 => 'uni04CD',\n    1230 => 'uni04CE',\n    1231 => 'uni04CF',\n    1232 => 'uni04D0',\n    1233 => 'uni04D1',\n    1234 => 'uni04D2',\n    1235 => 'uni04D3',\n    1236 => 'uni04D4',\n    1237 => 'uni04D5',\n    1238 => 'uni04D6',\n    1239 => 'uni04D7',\n    1240 => 'uni04D8',\n    1241 => 'uni04D9',\n    1242 => 'uni04DA',\n    1243 => 'uni04DB',\n    1244 => 'uni04DC',\n    1245 => 'uni04DD',\n    1246 => 'uni04DE',\n    1247 => 'uni04DF',\n    1248 => 'uni04E0',\n    1249 => 'uni04E1',\n    1250 => 'uni04E2',\n    1251 => 'uni04E3',\n    1252 => 'uni04E4',\n    1253 => 'uni04E5',\n    1254 => 'uni04E6',\n    1255 => 'uni04E7',\n    1256 => 'uni04E8',\n    1257 => 'uni04E9',\n    1258 => 'uni04EA',\n    1259 => 'uni04EB',\n    1260 => 'uni04EC',\n    1261 => 'uni04ED',\n    1262 => 'uni04EE',\n    1263 => 'uni04EF',\n    1264 => 'uni04F0',\n    1265 => 'uni04F1',\n    1266 => 'uni04F2',\n    1267 => 'uni04F3',\n    1268 => 'uni04F4',\n    1269 => 'uni04F5',\n    1270 => 'uni04F6',\n    1271 => 'uni04F7',\n    1272 => 'uni04F8',\n    1273 => 'uni04F9',\n    1274 => 'uni04FA',\n    1275 => 'uni04FB',\n    1276 => 'uni04FC',\n    1277 => 'uni04FD',\n    1278 => 'uni04FE',\n    1279 => 'uni04FF',\n    1280 => 'uni0500',\n    1281 => 'uni0501',\n    1282 => 'uni0502',\n    1283 => 'uni0503',\n    1284 => 'uni0504',\n    1285 => 'uni0505',\n    1286 => 'uni0506',\n    1287 => 'uni0507',\n    1288 => 'uni0508',\n    1289 => 'uni0509',\n    1290 => 'uni050A',\n    1291 => 'uni050B',\n    1292 => 'uni050C',\n    1293 => 'uni050D',\n    1294 => 'uni050E',\n    1295 => 'uni050F',\n    1296 => 'uni0510',\n    1297 => 'uni0511',\n    1298 => 'uni0512',\n    1299 => 'uni0513',\n    1300 => 'uni0514',\n    1301 => 'uni0515',\n    1302 => 'uni0516',\n    1303 => 'uni0517',\n    1304 => 'uni0518',\n    1305 => 'uni0519',\n    1306 => 'uni051A',\n    1307 => 'uni051B',\n    1308 => 'uni051C',\n    1309 => 'uni051D',\n    1310 => 'uni051E',\n    1311 => 'uni051F',\n    1312 => 'uni0520',\n    1313 => 'uni0521',\n    1314 => 'uni0522',\n    1315 => 'uni0523',\n    1316 => 'uni0524',\n    1317 => 'uni0525',\n    1329 => 'uni0531',\n    1330 => 'uni0532',\n    1331 => 'uni0533',\n    1332 => 'uni0534',\n    1333 => 'uni0535',\n    1334 => 'uni0536',\n    1335 => 'uni0537',\n    1336 => 'uni0538',\n    1337 => 'uni0539',\n    1338 => 'uni053A',\n    1339 => 'uni053B',\n    1340 => 'uni053C',\n    1341 => 'uni053D',\n    1342 => 'uni053E',\n    1343 => 'uni053F',\n    1344 => 'uni0540',\n    1345 => 'uni0541',\n    1346 => 'uni0542',\n    1347 => 'uni0543',\n    1348 => 'uni0544',\n    1349 => 'uni0545',\n    1350 => 'uni0546',\n    1351 => 'uni0547',\n    1352 => 'uni0548',\n    1353 => 'uni0549',\n    1354 => 'uni054A',\n    1355 => 'uni054B',\n    1356 => 'uni054C',\n    1357 => 'uni054D',\n    1358 => 'uni054E',\n    1359 => 'uni054F',\n    1360 => 'uni0550',\n    1361 => 'uni0551',\n    1362 => 'uni0552',\n    1363 => 'uni0553',\n    1364 => 'uni0554',\n    1365 => 'uni0555',\n    1366 => 'uni0556',\n    1369 => 'uni0559',\n    1370 => 'uni055A',\n    1371 => 'uni055B',\n    1372 => 'uni055C',\n    1373 => 'uni055D',\n    1374 => 'uni055E',\n    1375 => 'uni055F',\n    1377 => 'uni0561',\n    1378 => 'uni0562',\n    1379 => 'uni0563',\n    1380 => 'uni0564',\n    1381 => 'uni0565',\n    1382 => 'uni0566',\n    1383 => 'uni0567',\n    1384 => 'uni0568',\n    1385 => 'uni0569',\n    1386 => 'uni056A',\n    1387 => 'uni056B',\n    1388 => 'uni056C',\n    1389 => 'uni056D',\n    1390 => 'uni056E',\n    1391 => 'uni056F',\n    1392 => 'uni0570',\n    1393 => 'uni0571',\n    1394 => 'uni0572',\n    1395 => 'uni0573',\n    1396 => 'uni0574',\n    1397 => 'uni0575',\n    1398 => 'uni0576',\n    1399 => 'uni0577',\n    1400 => 'uni0578',\n    1401 => 'uni0579',\n    1402 => 'uni057A',\n    1403 => 'uni057B',\n    1404 => 'uni057C',\n    1405 => 'uni057D',\n    1406 => 'uni057E',\n    1407 => 'uni057F',\n    1408 => 'uni0580',\n    1409 => 'uni0581',\n    1410 => 'uni0582',\n    1411 => 'uni0583',\n    1412 => 'uni0584',\n    1413 => 'uni0585',\n    1414 => 'uni0586',\n    1415 => 'uni0587',\n    1417 => 'uni0589',\n    1418 => 'uni058A',\n    1456 => 'uni05B0',\n    1457 => 'uni05B1',\n    1458 => 'uni05B2',\n    1459 => 'uni05B3',\n    1460 => 'uni05B4',\n    1461 => 'uni05B5',\n    1462 => 'uni05B6',\n    1463 => 'uni05B7',\n    1464 => 'uni05B8',\n    1465 => 'uni05B9',\n    1466 => 'uni05BA',\n    1467 => 'uni05BB',\n    1468 => 'uni05BC',\n    1469 => 'uni05BD',\n    1470 => 'uni05BE',\n    1471 => 'uni05BF',\n    1472 => 'uni05C0',\n    1473 => 'uni05C1',\n    1474 => 'uni05C2',\n    1475 => 'uni05C3',\n    1478 => 'uni05C6',\n    1479 => 'uni05C7',\n    1488 => 'uni05D0',\n    1489 => 'uni05D1',\n    1490 => 'uni05D2',\n    1491 => 'uni05D3',\n    1492 => 'uni05D4',\n    1493 => 'uni05D5',\n    1494 => 'uni05D6',\n    1495 => 'uni05D7',\n    1496 => 'uni05D8',\n    1497 => 'uni05D9',\n    1498 => 'uni05DA',\n    1499 => 'uni05DB',\n    1500 => 'uni05DC',\n    1501 => 'uni05DD',\n    1502 => 'uni05DE',\n    1503 => 'uni05DF',\n    1504 => 'uni05E0',\n    1505 => 'uni05E1',\n    1506 => 'uni05E2',\n    1507 => 'uni05E3',\n    1508 => 'uni05E4',\n    1509 => 'uni05E5',\n    1510 => 'uni05E6',\n    1511 => 'uni05E7',\n    1512 => 'uni05E8',\n    1513 => 'uni05E9',\n    1514 => 'uni05EA',\n    1520 => 'uni05F0',\n    1521 => 'uni05F1',\n    1522 => 'uni05F2',\n    1523 => 'uni05F3',\n    1524 => 'uni05F4',\n    1542 => 'uni0606',\n    1543 => 'uni0607',\n    1545 => 'uni0609',\n    1546 => 'uni060A',\n    1548 => 'uni060C',\n    1557 => 'uni0615',\n    1563 => 'uni061B',\n    1567 => 'uni061F',\n    1569 => 'uni0621',\n    1570 => 'uni0622',\n    1571 => 'uni0623',\n    1572 => 'uni0624',\n    1573 => 'uni0625',\n    1574 => 'uni0626',\n    1575 => 'uni0627',\n    1576 => 'uni0628',\n    1577 => 'uni0629',\n    1578 => 'uni062A',\n    1579 => 'uni062B',\n    1580 => 'uni062C',\n    1581 => 'uni062D',\n    1582 => 'uni062E',\n    1583 => 'uni062F',\n    1584 => 'uni0630',\n    1585 => 'uni0631',\n    1586 => 'uni0632',\n    1587 => 'uni0633',\n    1588 => 'uni0634',\n    1589 => 'uni0635',\n    1590 => 'uni0636',\n    1591 => 'uni0637',\n    1592 => 'uni0638',\n    1593 => 'uni0639',\n    1594 => 'uni063A',\n    1600 => 'uni0640',\n    1601 => 'uni0641',\n    1602 => 'uni0642',\n    1603 => 'uni0643',\n    1604 => 'uni0644',\n    1605 => 'uni0645',\n    1606 => 'uni0646',\n    1607 => 'uni0647',\n    1608 => 'uni0648',\n    1609 => 'uni0649',\n    1610 => 'uni064A',\n    1611 => 'uni064B',\n    1612 => 'uni064C',\n    1613 => 'uni064D',\n    1614 => 'uni064E',\n    1615 => 'uni064F',\n    1616 => 'uni0650',\n    1617 => 'uni0651',\n    1618 => 'uni0652',\n    1619 => 'uni0653',\n    1620 => 'uni0654',\n    1621 => 'uni0655',\n    1623 => 'uni0657',\n    1626 => 'uni065A',\n    1632 => 'uni0660',\n    1633 => 'uni0661',\n    1634 => 'uni0662',\n    1635 => 'uni0663',\n    1636 => 'uni0664',\n    1637 => 'uni0665',\n    1638 => 'uni0666',\n    1639 => 'uni0667',\n    1640 => 'uni0668',\n    1641 => 'uni0669',\n    1642 => 'uni066A',\n    1643 => 'uni066B',\n    1644 => 'uni066C',\n    1645 => 'uni066D',\n    1646 => 'uni066E',\n    1647 => 'uni066F',\n    1648 => 'uni0670',\n    1652 => 'uni0674',\n    1657 => 'uni0679',\n    1658 => 'uni067A',\n    1659 => 'uni067B',\n    1660 => 'uni067C',\n    1661 => 'uni067D',\n    1662 => 'uni067E',\n    1663 => 'uni067F',\n    1664 => 'uni0680',\n    1665 => 'uni0681',\n    1666 => 'uni0682',\n    1667 => 'uni0683',\n    1668 => 'uni0684',\n    1669 => 'uni0685',\n    1670 => 'uni0686',\n    1671 => 'uni0687',\n    1672 => 'uni0688',\n    1673 => 'uni0689',\n    1674 => 'uni068A',\n    1675 => 'uni068B',\n    1676 => 'uni068C',\n    1677 => 'uni068D',\n    1678 => 'uni068E',\n    1679 => 'uni068F',\n    1680 => 'uni0690',\n    1681 => 'uni0691',\n    1682 => 'uni0692',\n    1683 => 'uni0693',\n    1684 => 'uni0694',\n    1685 => 'uni0695',\n    1686 => 'uni0696',\n    1687 => 'uni0697',\n    1688 => 'uni0698',\n    1689 => 'uni0699',\n    1690 => 'uni069A',\n    1691 => 'uni069B',\n    1692 => 'uni069C',\n    1693 => 'uni069D',\n    1694 => 'uni069E',\n    1695 => 'uni069F',\n    1696 => 'uni06A0',\n    1697 => 'uni06A1',\n    1698 => 'uni06A2',\n    1699 => 'uni06A3',\n    1700 => 'uni06A4',\n    1701 => 'uni06A5',\n    1702 => 'uni06A6',\n    1703 => 'uni06A7',\n    1704 => 'uni06A8',\n    1705 => 'uni06A9',\n    1706 => 'uni06AA',\n    1707 => 'uni06AB',\n    1708 => 'uni06AC',\n    1709 => 'uni06AD',\n    1710 => 'uni06AE',\n    1711 => 'uni06AF',\n    1712 => 'uni06B0',\n    1713 => 'uni06B1',\n    1714 => 'uni06B2',\n    1715 => 'uni06B3',\n    1716 => 'uni06B4',\n    1717 => 'uni06B5',\n    1718 => 'uni06B6',\n    1719 => 'uni06B7',\n    1720 => 'uni06B8',\n    1721 => 'uni06B9',\n    1722 => 'uni06BA',\n    1723 => 'uni06BB',\n    1724 => 'uni06BC',\n    1725 => 'uni06BD',\n    1726 => 'uni06BE',\n    1727 => 'uni06BF',\n    1734 => 'uni06C6',\n    1735 => 'uni06C7',\n    1736 => 'uni06C8',\n    1739 => 'uni06CB',\n    1740 => 'uni06CC',\n    1742 => 'uni06CE',\n    1744 => 'uni06D0',\n    1749 => 'uni06D5',\n    1776 => 'uni06F0',\n    1777 => 'uni06F1',\n    1778 => 'uni06F2',\n    1779 => 'uni06F3',\n    1780 => 'uni06F4',\n    1781 => 'uni06F5',\n    1782 => 'uni06F6',\n    1783 => 'uni06F7',\n    1784 => 'uni06F8',\n    1785 => 'uni06F9',\n    1984 => 'uni07C0',\n    1985 => 'uni07C1',\n    1986 => 'uni07C2',\n    1987 => 'uni07C3',\n    1988 => 'uni07C4',\n    1989 => 'uni07C5',\n    1990 => 'uni07C6',\n    1991 => 'uni07C7',\n    1992 => 'uni07C8',\n    1993 => 'uni07C9',\n    1994 => 'uni07CA',\n    1995 => 'uni07CB',\n    1996 => 'uni07CC',\n    1997 => 'uni07CD',\n    1998 => 'uni07CE',\n    1999 => 'uni07CF',\n    2000 => 'uni07D0',\n    2001 => 'uni07D1',\n    2002 => 'uni07D2',\n    2003 => 'uni07D3',\n    2004 => 'uni07D4',\n    2005 => 'uni07D5',\n    2006 => 'uni07D6',\n    2007 => 'uni07D7',\n    2008 => 'uni07D8',\n    2009 => 'uni07D9',\n    2010 => 'uni07DA',\n    2011 => 'uni07DB',\n    2012 => 'uni07DC',\n    2013 => 'uni07DD',\n    2014 => 'uni07DE',\n    2015 => 'uni07DF',\n    2016 => 'uni07E0',\n    2017 => 'uni07E1',\n    2018 => 'uni07E2',\n    2019 => 'uni07E3',\n    2020 => 'uni07E4',\n    2021 => 'uni07E5',\n    2022 => 'uni07E6',\n    2023 => 'uni07E7',\n    2027 => 'uni07EB',\n    2028 => 'uni07EC',\n    2029 => 'uni07ED',\n    2030 => 'uni07EE',\n    2031 => 'uni07EF',\n    2032 => 'uni07F0',\n    2033 => 'uni07F1',\n    2034 => 'uni07F2',\n    2035 => 'uni07F3',\n    2036 => 'uni07F4',\n    2037 => 'uni07F5',\n    2040 => 'uni07F8',\n    2041 => 'uni07F9',\n    2042 => 'uni07FA',\n    3647 => 'uni0E3F',\n    3713 => 'uni0E81',\n    3714 => 'uni0E82',\n    3716 => 'uni0E84',\n    3719 => 'uni0E87',\n    3720 => 'uni0E88',\n    3722 => 'uni0E8A',\n    3725 => 'uni0E8D',\n    3732 => 'uni0E94',\n    3733 => 'uni0E95',\n    3734 => 'uni0E96',\n    3735 => 'uni0E97',\n    3737 => 'uni0E99',\n    3738 => 'uni0E9A',\n    3739 => 'uni0E9B',\n    3740 => 'uni0E9C',\n    3741 => 'uni0E9D',\n    3742 => 'uni0E9E',\n    3743 => 'uni0E9F',\n    3745 => 'uni0EA1',\n    3746 => 'uni0EA2',\n    3747 => 'uni0EA3',\n    3749 => 'uni0EA5',\n    3751 => 'uni0EA7',\n    3754 => 'uni0EAA',\n    3755 => 'uni0EAB',\n    3757 => 'uni0EAD',\n    3758 => 'uni0EAE',\n    3759 => 'uni0EAF',\n    3760 => 'uni0EB0',\n    3761 => 'uni0EB1',\n    3762 => 'uni0EB2',\n    3763 => 'uni0EB3',\n    3764 => 'uni0EB4',\n    3765 => 'uni0EB5',\n    3766 => 'uni0EB6',\n    3767 => 'uni0EB7',\n    3768 => 'uni0EB8',\n    3769 => 'uni0EB9',\n    3771 => 'uni0EBB',\n    3772 => 'uni0EBC',\n    3773 => 'uni0EBD',\n    3776 => 'uni0EC0',\n    3777 => 'uni0EC1',\n    3778 => 'uni0EC2',\n    3779 => 'uni0EC3',\n    3780 => 'uni0EC4',\n    3782 => 'uni0EC6',\n    3784 => 'uni0EC8',\n    3785 => 'uni0EC9',\n    3786 => 'uni0ECA',\n    3787 => 'uni0ECB',\n    3788 => 'uni0ECC',\n    3789 => 'uni0ECD',\n    3792 => 'uni0ED0',\n    3793 => 'uni0ED1',\n    3794 => 'uni0ED2',\n    3795 => 'uni0ED3',\n    3796 => 'uni0ED4',\n    3797 => 'uni0ED5',\n    3798 => 'uni0ED6',\n    3799 => 'uni0ED7',\n    3800 => 'uni0ED8',\n    3801 => 'uni0ED9',\n    3804 => 'uni0EDC',\n    3805 => 'uni0EDD',\n    4256 => 'uni10A0',\n    4257 => 'uni10A1',\n    4258 => 'uni10A2',\n    4259 => 'uni10A3',\n    4260 => 'uni10A4',\n    4261 => 'uni10A5',\n    4262 => 'uni10A6',\n    4263 => 'uni10A7',\n    4264 => 'uni10A8',\n    4265 => 'uni10A9',\n    4266 => 'uni10AA',\n    4267 => 'uni10AB',\n    4268 => 'uni10AC',\n    4269 => 'uni10AD',\n    4270 => 'uni10AE',\n    4271 => 'uni10AF',\n    4272 => 'uni10B0',\n    4273 => 'uni10B1',\n    4274 => 'uni10B2',\n    4275 => 'uni10B3',\n    4276 => 'uni10B4',\n    4277 => 'uni10B5',\n    4278 => 'uni10B6',\n    4279 => 'uni10B7',\n    4280 => 'uni10B8',\n    4281 => 'uni10B9',\n    4282 => 'uni10BA',\n    4283 => 'uni10BB',\n    4284 => 'uni10BC',\n    4285 => 'uni10BD',\n    4286 => 'uni10BE',\n    4287 => 'uni10BF',\n    4288 => 'uni10C0',\n    4289 => 'uni10C1',\n    4290 => 'uni10C2',\n    4291 => 'uni10C3',\n    4292 => 'uni10C4',\n    4293 => 'uni10C5',\n    4304 => 'uni10D0',\n    4305 => 'uni10D1',\n    4306 => 'uni10D2',\n    4307 => 'uni10D3',\n    4308 => 'uni10D4',\n    4309 => 'uni10D5',\n    4310 => 'uni10D6',\n    4311 => 'uni10D7',\n    4312 => 'uni10D8',\n    4313 => 'uni10D9',\n    4314 => 'uni10DA',\n    4315 => 'uni10DB',\n    4316 => 'uni10DC',\n    4317 => 'uni10DD',\n    4318 => 'uni10DE',\n    4319 => 'uni10DF',\n    4320 => 'uni10E0',\n    4321 => 'uni10E1',\n    4322 => 'uni10E2',\n    4323 => 'uni10E3',\n    4324 => 'uni10E4',\n    4325 => 'uni10E5',\n    4326 => 'uni10E6',\n    4327 => 'uni10E7',\n    4328 => 'uni10E8',\n    4329 => 'uni10E9',\n    4330 => 'uni10EA',\n    4331 => 'uni10EB',\n    4332 => 'uni10EC',\n    4333 => 'uni10ED',\n    4334 => 'uni10EE',\n    4335 => 'uni10EF',\n    4336 => 'uni10F0',\n    4337 => 'uni10F1',\n    4338 => 'uni10F2',\n    4339 => 'uni10F3',\n    4340 => 'uni10F4',\n    4341 => 'uni10F5',\n    4342 => 'uni10F6',\n    4343 => 'uni10F7',\n    4344 => 'uni10F8',\n    4345 => 'uni10F9',\n    4346 => 'uni10FA',\n    4347 => 'uni10FB',\n    4348 => 'uni10FC',\n    5121 => 'uni1401',\n    5122 => 'uni1402',\n    5123 => 'uni1403',\n    5124 => 'uni1404',\n    5125 => 'uni1405',\n    5126 => 'uni1406',\n    5127 => 'uni1407',\n    5129 => 'uni1409',\n    5130 => 'uni140A',\n    5131 => 'uni140B',\n    5132 => 'uni140C',\n    5133 => 'uni140D',\n    5134 => 'uni140E',\n    5135 => 'uni140F',\n    5136 => 'uni1410',\n    5137 => 'uni1411',\n    5138 => 'uni1412',\n    5139 => 'uni1413',\n    5140 => 'uni1414',\n    5141 => 'uni1415',\n    5142 => 'uni1416',\n    5143 => 'uni1417',\n    5144 => 'uni1418',\n    5145 => 'uni1419',\n    5146 => 'uni141A',\n    5147 => 'uni141B',\n    5149 => 'uni141D',\n    5150 => 'uni141E',\n    5151 => 'uni141F',\n    5152 => 'uni1420',\n    5153 => 'uni1421',\n    5154 => 'uni1422',\n    5155 => 'uni1423',\n    5156 => 'uni1424',\n    5157 => 'uni1425',\n    5158 => 'uni1426',\n    5159 => 'uni1427',\n    5160 => 'uni1428',\n    5161 => 'uni1429',\n    5162 => 'uni142A',\n    5163 => 'uni142B',\n    5164 => 'uni142C',\n    5165 => 'uni142D',\n    5166 => 'uni142E',\n    5167 => 'uni142F',\n    5168 => 'uni1430',\n    5169 => 'uni1431',\n    5170 => 'uni1432',\n    5171 => 'uni1433',\n    5172 => 'uni1434',\n    5173 => 'uni1435',\n    5175 => 'uni1437',\n    5176 => 'uni1438',\n    5177 => 'uni1439',\n    5178 => 'uni143A',\n    5179 => 'uni143B',\n    5180 => 'uni143C',\n    5181 => 'uni143D',\n    5182 => 'uni143E',\n    5183 => 'uni143F',\n    5184 => 'uni1440',\n    5185 => 'uni1441',\n    5186 => 'uni1442',\n    5187 => 'uni1443',\n    5188 => 'uni1444',\n    5189 => 'uni1445',\n    5190 => 'uni1446',\n    5191 => 'uni1447',\n    5192 => 'uni1448',\n    5193 => 'uni1449',\n    5194 => 'uni144A',\n    5196 => 'uni144C',\n    5197 => 'uni144D',\n    5198 => 'uni144E',\n    5199 => 'uni144F',\n    5200 => 'uni1450',\n    5201 => 'uni1451',\n    5202 => 'uni1452',\n    5204 => 'uni1454',\n    5205 => 'uni1455',\n    5206 => 'uni1456',\n    5207 => 'uni1457',\n    5208 => 'uni1458',\n    5209 => 'uni1459',\n    5210 => 'uni145A',\n    5211 => 'uni145B',\n    5212 => 'uni145C',\n    5213 => 'uni145D',\n    5214 => 'uni145E',\n    5215 => 'uni145F',\n    5216 => 'uni1460',\n    5217 => 'uni1461',\n    5218 => 'uni1462',\n    5219 => 'uni1463',\n    5220 => 'uni1464',\n    5221 => 'uni1465',\n    5222 => 'uni1466',\n    5223 => 'uni1467',\n    5224 => 'uni1468',\n    5225 => 'uni1469',\n    5226 => 'uni146A',\n    5227 => 'uni146B',\n    5228 => 'uni146C',\n    5229 => 'uni146D',\n    5230 => 'uni146E',\n    5231 => 'uni146F',\n    5232 => 'uni1470',\n    5233 => 'uni1471',\n    5234 => 'uni1472',\n    5235 => 'uni1473',\n    5236 => 'uni1474',\n    5237 => 'uni1475',\n    5238 => 'uni1476',\n    5239 => 'uni1477',\n    5240 => 'uni1478',\n    5241 => 'uni1479',\n    5242 => 'uni147A',\n    5243 => 'uni147B',\n    5244 => 'uni147C',\n    5245 => 'uni147D',\n    5246 => 'uni147E',\n    5247 => 'uni147F',\n    5248 => 'uni1480',\n    5249 => 'uni1481',\n    5250 => 'uni1482',\n    5251 => 'uni1483',\n    5252 => 'uni1484',\n    5253 => 'uni1485',\n    5254 => 'uni1486',\n    5255 => 'uni1487',\n    5256 => 'uni1488',\n    5257 => 'uni1489',\n    5258 => 'uni148A',\n    5259 => 'uni148B',\n    5260 => 'uni148C',\n    5261 => 'uni148D',\n    5262 => 'uni148E',\n    5263 => 'uni148F',\n    5264 => 'uni1490',\n    5265 => 'uni1491',\n    5266 => 'uni1492',\n    5267 => 'uni1493',\n    5268 => 'uni1494',\n    5269 => 'uni1495',\n    5270 => 'uni1496',\n    5271 => 'uni1497',\n    5272 => 'uni1498',\n    5273 => 'uni1499',\n    5274 => 'uni149A',\n    5275 => 'uni149B',\n    5276 => 'uni149C',\n    5277 => 'uni149D',\n    5278 => 'uni149E',\n    5279 => 'uni149F',\n    5280 => 'uni14A0',\n    5281 => 'uni14A1',\n    5282 => 'uni14A2',\n    5283 => 'uni14A3',\n    5284 => 'uni14A4',\n    5285 => 'uni14A5',\n    5286 => 'uni14A6',\n    5287 => 'uni14A7',\n    5288 => 'uni14A8',\n    5289 => 'uni14A9',\n    5290 => 'uni14AA',\n    5291 => 'uni14AB',\n    5292 => 'uni14AC',\n    5293 => 'uni14AD',\n    5294 => 'uni14AE',\n    5295 => 'uni14AF',\n    5296 => 'uni14B0',\n    5297 => 'uni14B1',\n    5298 => 'uni14B2',\n    5299 => 'uni14B3',\n    5300 => 'uni14B4',\n    5301 => 'uni14B5',\n    5302 => 'uni14B6',\n    5303 => 'uni14B7',\n    5304 => 'uni14B8',\n    5305 => 'uni14B9',\n    5306 => 'uni14BA',\n    5307 => 'uni14BB',\n    5308 => 'uni14BC',\n    5309 => 'uni14BD',\n    5312 => 'uni14C0',\n    5313 => 'uni14C1',\n    5314 => 'uni14C2',\n    5315 => 'uni14C3',\n    5316 => 'uni14C4',\n    5317 => 'uni14C5',\n    5318 => 'uni14C6',\n    5319 => 'uni14C7',\n    5320 => 'uni14C8',\n    5321 => 'uni14C9',\n    5322 => 'uni14CA',\n    5323 => 'uni14CB',\n    5324 => 'uni14CC',\n    5325 => 'uni14CD',\n    5326 => 'uni14CE',\n    5327 => 'uni14CF',\n    5328 => 'uni14D0',\n    5329 => 'uni14D1',\n    5330 => 'uni14D2',\n    5331 => 'uni14D3',\n    5332 => 'uni14D4',\n    5333 => 'uni14D5',\n    5334 => 'uni14D6',\n    5335 => 'uni14D7',\n    5336 => 'uni14D8',\n    5337 => 'uni14D9',\n    5338 => 'uni14DA',\n    5339 => 'uni14DB',\n    5340 => 'uni14DC',\n    5341 => 'uni14DD',\n    5342 => 'uni14DE',\n    5343 => 'uni14DF',\n    5344 => 'uni14E0',\n    5345 => 'uni14E1',\n    5346 => 'uni14E2',\n    5347 => 'uni14E3',\n    5348 => 'uni14E4',\n    5349 => 'uni14E5',\n    5350 => 'uni14E6',\n    5351 => 'uni14E7',\n    5352 => 'uni14E8',\n    5353 => 'uni14E9',\n    5354 => 'uni14EA',\n    5356 => 'uni14EC',\n    5357 => 'uni14ED',\n    5358 => 'uni14EE',\n    5359 => 'uni14EF',\n    5360 => 'uni14F0',\n    5361 => 'uni14F1',\n    5362 => 'uni14F2',\n    5363 => 'uni14F3',\n    5364 => 'uni14F4',\n    5365 => 'uni14F5',\n    5366 => 'uni14F6',\n    5367 => 'uni14F7',\n    5368 => 'uni14F8',\n    5369 => 'uni14F9',\n    5370 => 'uni14FA',\n    5371 => 'uni14FB',\n    5372 => 'uni14FC',\n    5373 => 'uni14FD',\n    5374 => 'uni14FE',\n    5375 => 'uni14FF',\n    5376 => 'uni1500',\n    5377 => 'uni1501',\n    5378 => 'uni1502',\n    5379 => 'uni1503',\n    5380 => 'uni1504',\n    5381 => 'uni1505',\n    5382 => 'uni1506',\n    5383 => 'uni1507',\n    5392 => 'uni1510',\n    5393 => 'uni1511',\n    5394 => 'uni1512',\n    5395 => 'uni1513',\n    5396 => 'uni1514',\n    5397 => 'uni1515',\n    5398 => 'uni1516',\n    5399 => 'uni1517',\n    5400 => 'uni1518',\n    5401 => 'uni1519',\n    5402 => 'uni151A',\n    5403 => 'uni151B',\n    5404 => 'uni151C',\n    5405 => 'uni151D',\n    5406 => 'uni151E',\n    5407 => 'uni151F',\n    5408 => 'uni1520',\n    5409 => 'uni1521',\n    5410 => 'uni1522',\n    5411 => 'uni1523',\n    5412 => 'uni1524',\n    5413 => 'uni1525',\n    5414 => 'uni1526',\n    5415 => 'uni1527',\n    5416 => 'uni1528',\n    5417 => 'uni1529',\n    5418 => 'uni152A',\n    5419 => 'uni152B',\n    5420 => 'uni152C',\n    5421 => 'uni152D',\n    5422 => 'uni152E',\n    5423 => 'uni152F',\n    5424 => 'uni1530',\n    5425 => 'uni1531',\n    5426 => 'uni1532',\n    5427 => 'uni1533',\n    5428 => 'uni1534',\n    5429 => 'uni1535',\n    5430 => 'uni1536',\n    5431 => 'uni1537',\n    5432 => 'uni1538',\n    5433 => 'uni1539',\n    5434 => 'uni153A',\n    5435 => 'uni153B',\n    5436 => 'uni153C',\n    5437 => 'uni153D',\n    5438 => 'uni153E',\n    5440 => 'uni1540',\n    5441 => 'uni1541',\n    5442 => 'uni1542',\n    5443 => 'uni1543',\n    5444 => 'uni1544',\n    5445 => 'uni1545',\n    5446 => 'uni1546',\n    5447 => 'uni1547',\n    5448 => 'uni1548',\n    5449 => 'uni1549',\n    5450 => 'uni154A',\n    5451 => 'uni154B',\n    5452 => 'uni154C',\n    5453 => 'uni154D',\n    5454 => 'uni154E',\n    5455 => 'uni154F',\n    5456 => 'uni1550',\n    5458 => 'uni1552',\n    5459 => 'uni1553',\n    5460 => 'uni1554',\n    5461 => 'uni1555',\n    5462 => 'uni1556',\n    5463 => 'uni1557',\n    5464 => 'uni1558',\n    5465 => 'uni1559',\n    5466 => 'uni155A',\n    5467 => 'uni155B',\n    5468 => 'uni155C',\n    5469 => 'uni155D',\n    5470 => 'uni155E',\n    5471 => 'uni155F',\n    5472 => 'uni1560',\n    5473 => 'uni1561',\n    5474 => 'uni1562',\n    5475 => 'uni1563',\n    5476 => 'uni1564',\n    5477 => 'uni1565',\n    5478 => 'uni1566',\n    5479 => 'uni1567',\n    5480 => 'uni1568',\n    5481 => 'uni1569',\n    5482 => 'uni156A',\n    5492 => 'uni1574',\n    5493 => 'uni1575',\n    5494 => 'uni1576',\n    5495 => 'uni1577',\n    5496 => 'uni1578',\n    5497 => 'uni1579',\n    5498 => 'uni157A',\n    5499 => 'uni157B',\n    5500 => 'uni157C',\n    5501 => 'uni157D',\n    5502 => 'uni157E',\n    5503 => 'uni157F',\n    5504 => 'uni1580',\n    5505 => 'uni1581',\n    5506 => 'uni1582',\n    5507 => 'uni1583',\n    5508 => 'uni1584',\n    5509 => 'uni1585',\n    5514 => 'uni158A',\n    5515 => 'uni158B',\n    5516 => 'uni158C',\n    5517 => 'uni158D',\n    5518 => 'uni158E',\n    5519 => 'uni158F',\n    5520 => 'uni1590',\n    5521 => 'uni1591',\n    5522 => 'uni1592',\n    5523 => 'uni1593',\n    5524 => 'uni1594',\n    5525 => 'uni1595',\n    5526 => 'uni1596',\n    5536 => 'uni15A0',\n    5537 => 'uni15A1',\n    5538 => 'uni15A2',\n    5539 => 'uni15A3',\n    5540 => 'uni15A4',\n    5541 => 'uni15A5',\n    5542 => 'uni15A6',\n    5543 => 'uni15A7',\n    5544 => 'uni15A8',\n    5545 => 'uni15A9',\n    5546 => 'uni15AA',\n    5547 => 'uni15AB',\n    5548 => 'uni15AC',\n    5549 => 'uni15AD',\n    5550 => 'uni15AE',\n    5551 => 'uni15AF',\n    5598 => 'uni15DE',\n    5601 => 'uni15E1',\n    5702 => 'uni1646',\n    5703 => 'uni1647',\n    5742 => 'uni166E',\n    5743 => 'uni166F',\n    5744 => 'uni1670',\n    5745 => 'uni1671',\n    5746 => 'uni1672',\n    5747 => 'uni1673',\n    5748 => 'uni1674',\n    5749 => 'uni1675',\n    5750 => 'uni1676',\n    5760 => 'uni1680',\n    5761 => 'uni1681',\n    5762 => 'uni1682',\n    5763 => 'uni1683',\n    5764 => 'uni1684',\n    5765 => 'uni1685',\n    5766 => 'uni1686',\n    5767 => 'uni1687',\n    5768 => 'uni1688',\n    5769 => 'uni1689',\n    5770 => 'uni168A',\n    5771 => 'uni168B',\n    5772 => 'uni168C',\n    5773 => 'uni168D',\n    5774 => 'uni168E',\n    5775 => 'uni168F',\n    5776 => 'uni1690',\n    5777 => 'uni1691',\n    5778 => 'uni1692',\n    5779 => 'uni1693',\n    5780 => 'uni1694',\n    5781 => 'uni1695',\n    5782 => 'uni1696',\n    5783 => 'uni1697',\n    5784 => 'uni1698',\n    5785 => 'uni1699',\n    5786 => 'uni169A',\n    5787 => 'uni169B',\n    5788 => 'uni169C',\n    7424 => 'uni1D00',\n    7425 => 'uni1D01',\n    7426 => 'uni1D02',\n    7427 => 'uni1D03',\n    7428 => 'uni1D04',\n    7429 => 'uni1D05',\n    7430 => 'uni1D06',\n    7431 => 'uni1D07',\n    7432 => 'uni1D08',\n    7433 => 'uni1D09',\n    7434 => 'uni1D0A',\n    7435 => 'uni1D0B',\n    7436 => 'uni1D0C',\n    7437 => 'uni1D0D',\n    7438 => 'uni1D0E',\n    7439 => 'uni1D0F',\n    7440 => 'uni1D10',\n    7441 => 'uni1D11',\n    7442 => 'uni1D12',\n    7443 => 'uni1D13',\n    7444 => 'uni1D14',\n    7446 => 'uni1D16',\n    7447 => 'uni1D17',\n    7448 => 'uni1D18',\n    7449 => 'uni1D19',\n    7450 => 'uni1D1A',\n    7451 => 'uni1D1B',\n    7452 => 'uni1D1C',\n    7453 => 'uni1D1D',\n    7454 => 'uni1D1E',\n    7455 => 'uni1D1F',\n    7456 => 'uni1D20',\n    7457 => 'uni1D21',\n    7458 => 'uni1D22',\n    7459 => 'uni1D23',\n    7462 => 'uni1D26',\n    7463 => 'uni1D27',\n    7464 => 'uni1D28',\n    7465 => 'uni1D29',\n    7466 => 'uni1D2A',\n    7467 => 'uni1D2B',\n    7468 => 'uni1D2C',\n    7469 => 'uni1D2D',\n    7470 => 'uni1D2E',\n    7472 => 'uni1D30',\n    7473 => 'uni1D31',\n    7474 => 'uni1D32',\n    7475 => 'uni1D33',\n    7476 => 'uni1D34',\n    7477 => 'uni1D35',\n    7478 => 'uni1D36',\n    7479 => 'uni1D37',\n    7480 => 'uni1D38',\n    7481 => 'uni1D39',\n    7482 => 'uni1D3A',\n    7483 => 'uni1D3B',\n    7484 => 'uni1D3C',\n    7485 => 'uni1D3D',\n    7486 => 'uni1D3E',\n    7487 => 'uni1D3F',\n    7488 => 'uni1D40',\n    7489 => 'uni1D41',\n    7490 => 'uni1D42',\n    7491 => 'uni1D43',\n    7492 => 'uni1D44',\n    7493 => 'uni1D45',\n    7494 => 'uni1D46',\n    7495 => 'uni1D47',\n    7496 => 'uni1D48',\n    7497 => 'uni1D49',\n    7498 => 'uni1D4A',\n    7499 => 'uni1D4B',\n    7500 => 'uni1D4C',\n    7501 => 'uni1D4D',\n    7502 => 'uni1D4E',\n    7503 => 'uni1D4F',\n    7504 => 'uni1D50',\n    7505 => 'uni1D51',\n    7506 => 'uni1D52',\n    7507 => 'uni1D53',\n    7508 => 'uni1D54',\n    7509 => 'uni1D55',\n    7510 => 'uni1D56',\n    7511 => 'uni1D57',\n    7512 => 'uni1D58',\n    7513 => 'uni1D59',\n    7514 => 'uni1D5A',\n    7515 => 'uni1D5B',\n    7517 => 'uni1D5D',\n    7518 => 'uni1D5E',\n    7519 => 'uni1D5F',\n    7520 => 'uni1D60',\n    7521 => 'uni1D61',\n    7522 => 'uni1D62',\n    7523 => 'uni1D63',\n    7524 => 'uni1D64',\n    7525 => 'uni1D65',\n    7526 => 'uni1D66',\n    7527 => 'uni1D67',\n    7528 => 'uni1D68',\n    7529 => 'uni1D69',\n    7530 => 'uni1D6A',\n    7543 => 'uni1D77',\n    7544 => 'uni1D78',\n    7547 => 'uni1D7B',\n    7549 => 'uni1D7D',\n    7557 => 'uni1D85',\n    7579 => 'uni1D9B',\n    7580 => 'uni1D9C',\n    7581 => 'uni1D9D',\n    7582 => 'uni1D9E',\n    7583 => 'uni1D9F',\n    7584 => 'uni1DA0',\n    7585 => 'uni1DA1',\n    7586 => 'uni1DA2',\n    7587 => 'uni1DA3',\n    7588 => 'uni1DA4',\n    7589 => 'uni1DA5',\n    7590 => 'uni1DA6',\n    7591 => 'uni1DA7',\n    7592 => 'uni1DA8',\n    7593 => 'uni1DA9',\n    7594 => 'uni1DAA',\n    7595 => 'uni1DAB',\n    7596 => 'uni1DAC',\n    7597 => 'uni1DAD',\n    7598 => 'uni1DAE',\n    7599 => 'uni1DAF',\n    7600 => 'uni1DB0',\n    7601 => 'uni1DB1',\n    7602 => 'uni1DB2',\n    7603 => 'uni1DB3',\n    7604 => 'uni1DB4',\n    7605 => 'uni1DB5',\n    7606 => 'uni1DB6',\n    7607 => 'uni1DB7',\n    7608 => 'uni1DB8',\n    7609 => 'uni1DB9',\n    7610 => 'uni1DBA',\n    7611 => 'uni1DBB',\n    7612 => 'uni1DBC',\n    7613 => 'uni1DBD',\n    7614 => 'uni1DBE',\n    7615 => 'uni1DBF',\n    7620 => 'uni1DC4',\n    7621 => 'uni1DC5',\n    7622 => 'uni1DC6',\n    7623 => 'uni1DC7',\n    7624 => 'uni1DC8',\n    7625 => 'uni1DC9',\n    7680 => 'uni1E00',\n    7681 => 'uni1E01',\n    7682 => 'uni1E02',\n    7683 => 'uni1E03',\n    7684 => 'uni1E04',\n    7685 => 'uni1E05',\n    7686 => 'uni1E06',\n    7687 => 'uni1E07',\n    7688 => 'uni1E08',\n    7689 => 'uni1E09',\n    7690 => 'uni1E0A',\n    7691 => 'uni1E0B',\n    7692 => 'uni1E0C',\n    7693 => 'uni1E0D',\n    7694 => 'uni1E0E',\n    7695 => 'uni1E0F',\n    7696 => 'uni1E10',\n    7697 => 'uni1E11',\n    7698 => 'uni1E12',\n    7699 => 'uni1E13',\n    7700 => 'uni1E14',\n    7701 => 'uni1E15',\n    7702 => 'uni1E16',\n    7703 => 'uni1E17',\n    7704 => 'uni1E18',\n    7705 => 'uni1E19',\n    7706 => 'uni1E1A',\n    7707 => 'uni1E1B',\n    7708 => 'uni1E1C',\n    7709 => 'uni1E1D',\n    7710 => 'uni1E1E',\n    7711 => 'uni1E1F',\n    7712 => 'uni1E20',\n    7713 => 'uni1E21',\n    7714 => 'uni1E22',\n    7715 => 'uni1E23',\n    7716 => 'uni1E24',\n    7717 => 'uni1E25',\n    7718 => 'uni1E26',\n    7719 => 'uni1E27',\n    7720 => 'uni1E28',\n    7721 => 'uni1E29',\n    7722 => 'uni1E2A',\n    7723 => 'uni1E2B',\n    7724 => 'uni1E2C',\n    7725 => 'uni1E2D',\n    7726 => 'uni1E2E',\n    7727 => 'uni1E2F',\n    7728 => 'uni1E30',\n    7729 => 'uni1E31',\n    7730 => 'uni1E32',\n    7731 => 'uni1E33',\n    7732 => 'uni1E34',\n    7733 => 'uni1E35',\n    7734 => 'uni1E36',\n    7735 => 'uni1E37',\n    7736 => 'uni1E38',\n    7737 => 'uni1E39',\n    7738 => 'uni1E3A',\n    7739 => 'uni1E3B',\n    7740 => 'uni1E3C',\n    7741 => 'uni1E3D',\n    7742 => 'uni1E3E',\n    7743 => 'uni1E3F',\n    7744 => 'uni1E40',\n    7745 => 'uni1E41',\n    7746 => 'uni1E42',\n    7747 => 'uni1E43',\n    7748 => 'uni1E44',\n    7749 => 'uni1E45',\n    7750 => 'uni1E46',\n    7751 => 'uni1E47',\n    7752 => 'uni1E48',\n    7753 => 'uni1E49',\n    7754 => 'uni1E4A',\n    7755 => 'uni1E4B',\n    7756 => 'uni1E4C',\n    7757 => 'uni1E4D',\n    7758 => 'uni1E4E',\n    7759 => 'uni1E4F',\n    7760 => 'uni1E50',\n    7761 => 'uni1E51',\n    7762 => 'uni1E52',\n    7763 => 'uni1E53',\n    7764 => 'uni1E54',\n    7765 => 'uni1E55',\n    7766 => 'uni1E56',\n    7767 => 'uni1E57',\n    7768 => 'uni1E58',\n    7769 => 'uni1E59',\n    7770 => 'uni1E5A',\n    7771 => 'uni1E5B',\n    7772 => 'uni1E5C',\n    7773 => 'uni1E5D',\n    7774 => 'uni1E5E',\n    7775 => 'uni1E5F',\n    7776 => 'uni1E60',\n    7777 => 'uni1E61',\n    7778 => 'uni1E62',\n    7779 => 'uni1E63',\n    7780 => 'uni1E64',\n    7781 => 'uni1E65',\n    7782 => 'uni1E66',\n    7783 => 'uni1E67',\n    7784 => 'uni1E68',\n    7785 => 'uni1E69',\n    7786 => 'uni1E6A',\n    7787 => 'uni1E6B',\n    7788 => 'uni1E6C',\n    7789 => 'uni1E6D',\n    7790 => 'uni1E6E',\n    7791 => 'uni1E6F',\n    7792 => 'uni1E70',\n    7793 => 'uni1E71',\n    7794 => 'uni1E72',\n    7795 => 'uni1E73',\n    7796 => 'uni1E74',\n    7797 => 'uni1E75',\n    7798 => 'uni1E76',\n    7799 => 'uni1E77',\n    7800 => 'uni1E78',\n    7801 => 'uni1E79',\n    7802 => 'uni1E7A',\n    7803 => 'uni1E7B',\n    7804 => 'uni1E7C',\n    7805 => 'uni1E7D',\n    7806 => 'uni1E7E',\n    7807 => 'uni1E7F',\n    7808 => 'Wgrave',\n    7809 => 'wgrave',\n    7810 => 'Wacute',\n    7811 => 'wacute',\n    7812 => 'Wdieresis',\n    7813 => 'wdieresis',\n    7814 => 'uni1E86',\n    7815 => 'uni1E87',\n    7816 => 'uni1E88',\n    7817 => 'uni1E89',\n    7818 => 'uni1E8A',\n    7819 => 'uni1E8B',\n    7820 => 'uni1E8C',\n    7821 => 'uni1E8D',\n    7822 => 'uni1E8E',\n    7823 => 'uni1E8F',\n    7824 => 'uni1E90',\n    7825 => 'uni1E91',\n    7826 => 'uni1E92',\n    7827 => 'uni1E93',\n    7828 => 'uni1E94',\n    7829 => 'uni1E95',\n    7830 => 'uni1E96',\n    7831 => 'uni1E97',\n    7832 => 'uni1E98',\n    7833 => 'uni1E99',\n    7834 => 'uni1E9A',\n    7835 => 'uni1E9B',\n    7836 => 'uni1E9C',\n    7837 => 'uni1E9D',\n    7838 => 'uni1E9E',\n    7839 => 'uni1E9F',\n    7840 => 'uni1EA0',\n    7841 => 'uni1EA1',\n    7842 => 'uni1EA2',\n    7843 => 'uni1EA3',\n    7844 => 'uni1EA4',\n    7845 => 'uni1EA5',\n    7846 => 'uni1EA6',\n    7847 => 'uni1EA7',\n    7848 => 'uni1EA8',\n    7849 => 'uni1EA9',\n    7850 => 'uni1EAA',\n    7851 => 'uni1EAB',\n    7852 => 'uni1EAC',\n    7853 => 'uni1EAD',\n    7854 => 'uni1EAE',\n    7855 => 'uni1EAF',\n    7856 => 'uni1EB0',\n    7857 => 'uni1EB1',\n    7858 => 'uni1EB2',\n    7859 => 'uni1EB3',\n    7860 => 'uni1EB4',\n    7861 => 'uni1EB5',\n    7862 => 'uni1EB6',\n    7863 => 'uni1EB7',\n    7864 => 'uni1EB8',\n    7865 => 'uni1EB9',\n    7866 => 'uni1EBA',\n    7867 => 'uni1EBB',\n    7868 => 'uni1EBC',\n    7869 => 'uni1EBD',\n    7870 => 'uni1EBE',\n    7871 => 'uni1EBF',\n    7872 => 'uni1EC0',\n    7873 => 'uni1EC1',\n    7874 => 'uni1EC2',\n    7875 => 'uni1EC3',\n    7876 => 'uni1EC4',\n    7877 => 'uni1EC5',\n    7878 => 'uni1EC6',\n    7879 => 'uni1EC7',\n    7880 => 'uni1EC8',\n    7881 => 'uni1EC9',\n    7882 => 'uni1ECA',\n    7883 => 'uni1ECB',\n    7884 => 'uni1ECC',\n    7885 => 'uni1ECD',\n    7886 => 'uni1ECE',\n    7887 => 'uni1ECF',\n    7888 => 'uni1ED0',\n    7889 => 'uni1ED1',\n    7890 => 'uni1ED2',\n    7891 => 'uni1ED3',\n    7892 => 'uni1ED4',\n    7893 => 'uni1ED5',\n    7894 => 'uni1ED6',\n    7895 => 'uni1ED7',\n    7896 => 'uni1ED8',\n    7897 => 'uni1ED9',\n    7898 => 'uni1EDA',\n    7899 => 'uni1EDB',\n    7900 => 'uni1EDC',\n    7901 => 'uni1EDD',\n    7902 => 'uni1EDE',\n    7903 => 'uni1EDF',\n    7904 => 'uni1EE0',\n    7905 => 'uni1EE1',\n    7906 => 'uni1EE2',\n    7907 => 'uni1EE3',\n    7908 => 'uni1EE4',\n    7909 => 'uni1EE5',\n    7910 => 'uni1EE6',\n    7911 => 'uni1EE7',\n    7912 => 'uni1EE8',\n    7913 => 'uni1EE9',\n    7914 => 'uni1EEA',\n    7915 => 'uni1EEB',\n    7916 => 'uni1EEC',\n    7917 => 'uni1EED',\n    7918 => 'uni1EEE',\n    7919 => 'uni1EEF',\n    7920 => 'uni1EF0',\n    7921 => 'uni1EF1',\n    7922 => 'Ygrave',\n    7923 => 'ygrave',\n    7924 => 'uni1EF4',\n    7925 => 'uni1EF5',\n    7926 => 'uni1EF6',\n    7927 => 'uni1EF7',\n    7928 => 'uni1EF8',\n    7929 => 'uni1EF9',\n    7930 => 'uni1EFA',\n    7931 => 'uni1EFB',\n    7936 => 'uni1F00',\n    7937 => 'uni1F01',\n    7938 => 'uni1F02',\n    7939 => 'uni1F03',\n    7940 => 'uni1F04',\n    7941 => 'uni1F05',\n    7942 => 'uni1F06',\n    7943 => 'uni1F07',\n    7944 => 'uni1F08',\n    7945 => 'uni1F09',\n    7946 => 'uni1F0A',\n    7947 => 'uni1F0B',\n    7948 => 'uni1F0C',\n    7949 => 'uni1F0D',\n    7950 => 'uni1F0E',\n    7951 => 'uni1F0F',\n    7952 => 'uni1F10',\n    7953 => 'uni1F11',\n    7954 => 'uni1F12',\n    7955 => 'uni1F13',\n    7956 => 'uni1F14',\n    7957 => 'uni1F15',\n    7960 => 'uni1F18',\n    7961 => 'uni1F19',\n    7962 => 'uni1F1A',\n    7963 => 'uni1F1B',\n    7964 => 'uni1F1C',\n    7965 => 'uni1F1D',\n    7968 => 'uni1F20',\n    7969 => 'uni1F21',\n    7970 => 'uni1F22',\n    7971 => 'uni1F23',\n    7972 => 'uni1F24',\n    7973 => 'uni1F25',\n    7974 => 'uni1F26',\n    7975 => 'uni1F27',\n    7976 => 'uni1F28',\n    7977 => 'uni1F29',\n    7978 => 'uni1F2A',\n    7979 => 'uni1F2B',\n    7980 => 'uni1F2C',\n    7981 => 'uni1F2D',\n    7982 => 'uni1F2E',\n    7983 => 'uni1F2F',\n    7984 => 'uni1F30',\n    7985 => 'uni1F31',\n    7986 => 'uni1F32',\n    7987 => 'uni1F33',\n    7988 => 'uni1F34',\n    7989 => 'uni1F35',\n    7990 => 'uni1F36',\n    7991 => 'uni1F37',\n    7992 => 'uni1F38',\n    7993 => 'uni1F39',\n    7994 => 'uni1F3A',\n    7995 => 'uni1F3B',\n    7996 => 'uni1F3C',\n    7997 => 'uni1F3D',\n    7998 => 'uni1F3E',\n    7999 => 'uni1F3F',\n    8000 => 'uni1F40',\n    8001 => 'uni1F41',\n    8002 => 'uni1F42',\n    8003 => 'uni1F43',\n    8004 => 'uni1F44',\n    8005 => 'uni1F45',\n    8008 => 'uni1F48',\n    8009 => 'uni1F49',\n    8010 => 'uni1F4A',\n    8011 => 'uni1F4B',\n    8012 => 'uni1F4C',\n    8013 => 'uni1F4D',\n    8016 => 'uni1F50',\n    8017 => 'uni1F51',\n    8018 => 'uni1F52',\n    8019 => 'uni1F53',\n    8020 => 'uni1F54',\n    8021 => 'uni1F55',\n    8022 => 'uni1F56',\n    8023 => 'uni1F57',\n    8025 => 'uni1F59',\n    8027 => 'uni1F5B',\n    8029 => 'uni1F5D',\n    8031 => 'uni1F5F',\n    8032 => 'uni1F60',\n    8033 => 'uni1F61',\n    8034 => 'uni1F62',\n    8035 => 'uni1F63',\n    8036 => 'uni1F64',\n    8037 => 'uni1F65',\n    8038 => 'uni1F66',\n    8039 => 'uni1F67',\n    8040 => 'uni1F68',\n    8041 => 'uni1F69',\n    8042 => 'uni1F6A',\n    8043 => 'uni1F6B',\n    8044 => 'uni1F6C',\n    8045 => 'uni1F6D',\n    8046 => 'uni1F6E',\n    8047 => 'uni1F6F',\n    8048 => 'uni1F70',\n    8049 => 'uni1F71',\n    8050 => 'uni1F72',\n    8051 => 'uni1F73',\n    8052 => 'uni1F74',\n    8053 => 'uni1F75',\n    8054 => 'uni1F76',\n    8055 => 'uni1F77',\n    8056 => 'uni1F78',\n    8057 => 'uni1F79',\n    8058 => 'uni1F7A',\n    8059 => 'uni1F7B',\n    8060 => 'uni1F7C',\n    8061 => 'uni1F7D',\n    8064 => 'uni1F80',\n    8065 => 'uni1F81',\n    8066 => 'uni1F82',\n    8067 => 'uni1F83',\n    8068 => 'uni1F84',\n    8069 => 'uni1F85',\n    8070 => 'uni1F86',\n    8071 => 'uni1F87',\n    8072 => 'uni1F88',\n    8073 => 'uni1F89',\n    8074 => 'uni1F8A',\n    8075 => 'uni1F8B',\n    8076 => 'uni1F8C',\n    8077 => 'uni1F8D',\n    8078 => 'uni1F8E',\n    8079 => 'uni1F8F',\n    8080 => 'uni1F90',\n    8081 => 'uni1F91',\n    8082 => 'uni1F92',\n    8083 => 'uni1F93',\n    8084 => 'uni1F94',\n    8085 => 'uni1F95',\n    8086 => 'uni1F96',\n    8087 => 'uni1F97',\n    8088 => 'uni1F98',\n    8089 => 'uni1F99',\n    8090 => 'uni1F9A',\n    8091 => 'uni1F9B',\n    8092 => 'uni1F9C',\n    8093 => 'uni1F9D',\n    8094 => 'uni1F9E',\n    8095 => 'uni1F9F',\n    8096 => 'uni1FA0',\n    8097 => 'uni1FA1',\n    8098 => 'uni1FA2',\n    8099 => 'uni1FA3',\n    8100 => 'uni1FA4',\n    8101 => 'uni1FA5',\n    8102 => 'uni1FA6',\n    8103 => 'uni1FA7',\n    8104 => 'uni1FA8',\n    8105 => 'uni1FA9',\n    8106 => 'uni1FAA',\n    8107 => 'uni1FAB',\n    8108 => 'uni1FAC',\n    8109 => 'uni1FAD',\n    8110 => 'uni1FAE',\n    8111 => 'uni1FAF',\n    8112 => 'uni1FB0',\n    8113 => 'uni1FB1',\n    8114 => 'uni1FB2',\n    8115 => 'uni1FB3',\n    8116 => 'uni1FB4',\n    8118 => 'uni1FB6',\n    8119 => 'uni1FB7',\n    8120 => 'uni1FB8',\n    8121 => 'uni1FB9',\n    8122 => 'uni1FBA',\n    8123 => 'uni1FBB',\n    8124 => 'uni1FBC',\n    8125 => 'uni1FBD',\n    8126 => 'uni1FBE',\n    8127 => 'uni1FBF',\n    8128 => 'uni1FC0',\n    8129 => 'uni1FC1',\n    8130 => 'uni1FC2',\n    8131 => 'uni1FC3',\n    8132 => 'uni1FC4',\n    8134 => 'uni1FC6',\n    8135 => 'uni1FC7',\n    8136 => 'uni1FC8',\n    8137 => 'uni1FC9',\n    8138 => 'uni1FCA',\n    8139 => 'uni1FCB',\n    8140 => 'uni1FCC',\n    8141 => 'uni1FCD',\n    8142 => 'uni1FCE',\n    8143 => 'uni1FCF',\n    8144 => 'uni1FD0',\n    8145 => 'uni1FD1',\n    8146 => 'uni1FD2',\n    8147 => 'uni1FD3',\n    8150 => 'uni1FD6',\n    8151 => 'uni1FD7',\n    8152 => 'uni1FD8',\n    8153 => 'uni1FD9',\n    8154 => 'uni1FDA',\n    8155 => 'uni1FDB',\n    8157 => 'uni1FDD',\n    8158 => 'uni1FDE',\n    8159 => 'uni1FDF',\n    8160 => 'uni1FE0',\n    8161 => 'uni1FE1',\n    8162 => 'uni1FE2',\n    8163 => 'uni1FE3',\n    8164 => 'uni1FE4',\n    8165 => 'uni1FE5',\n    8166 => 'uni1FE6',\n    8167 => 'uni1FE7',\n    8168 => 'uni1FE8',\n    8169 => 'uni1FE9',\n    8170 => 'uni1FEA',\n    8171 => 'uni1FEB',\n    8172 => 'uni1FEC',\n    8173 => 'uni1FED',\n    8174 => 'uni1FEE',\n    8175 => 'uni1FEF',\n    8178 => 'uni1FF2',\n    8179 => 'uni1FF3',\n    8180 => 'uni1FF4',\n    8182 => 'uni1FF6',\n    8183 => 'uni1FF7',\n    8184 => 'uni1FF8',\n    8185 => 'uni1FF9',\n    8186 => 'uni1FFA',\n    8187 => 'uni1FFB',\n    8188 => 'uni1FFC',\n    8189 => 'uni1FFD',\n    8190 => 'uni1FFE',\n    8192 => 'uni2000',\n    8193 => 'uni2001',\n    8194 => 'uni2002',\n    8195 => 'uni2003',\n    8196 => 'uni2004',\n    8197 => 'uni2005',\n    8198 => 'uni2006',\n    8199 => 'uni2007',\n    8200 => 'uni2008',\n    8201 => 'uni2009',\n    8202 => 'uni200A',\n    8203 => 'uni200B',\n    8204 => 'uni200C',\n    8205 => 'uni200D',\n    8206 => 'uni200E',\n    8207 => 'uni200F',\n    8208 => 'uni2010',\n    8209 => 'uni2011',\n    8210 => 'figuredash',\n    8211 => 'endash',\n    8212 => 'emdash',\n    8213 => 'uni2015',\n    8214 => 'uni2016',\n    8215 => 'underscoredbl',\n    8216 => 'quoteleft',\n    8217 => 'quoteright',\n    8218 => 'quotesinglbase',\n    8219 => 'quotereversed',\n    8220 => 'quotedblleft',\n    8221 => 'quotedblright',\n    8222 => 'quotedblbase',\n    8223 => 'uni201F',\n    8224 => 'dagger',\n    8225 => 'daggerdbl',\n    8226 => 'bullet',\n    8227 => 'uni2023',\n    8228 => 'onedotenleader',\n    8229 => 'twodotenleader',\n    8230 => 'ellipsis',\n    8231 => 'uni2027',\n    8232 => 'uni2028',\n    8233 => 'uni2029',\n    8234 => 'uni202A',\n    8235 => 'uni202B',\n    8236 => 'uni202C',\n    8237 => 'uni202D',\n    8238 => 'uni202E',\n    8239 => 'uni202F',\n    8240 => 'perthousand',\n    8241 => 'uni2031',\n    8242 => 'minute',\n    8243 => 'second',\n    8244 => 'uni2034',\n    8245 => 'uni2035',\n    8246 => 'uni2036',\n    8247 => 'uni2037',\n    8248 => 'uni2038',\n    8249 => 'guilsinglleft',\n    8250 => 'guilsinglright',\n    8251 => 'uni203B',\n    8252 => 'exclamdbl',\n    8253 => 'uni203D',\n    8254 => 'uni203E',\n    8255 => 'uni203F',\n    8256 => 'uni2040',\n    8257 => 'uni2041',\n    8258 => 'uni2042',\n    8259 => 'uni2043',\n    8260 => 'fraction',\n    8261 => 'uni2045',\n    8262 => 'uni2046',\n    8263 => 'uni2047',\n    8264 => 'uni2048',\n    8265 => 'uni2049',\n    8266 => 'uni204A',\n    8267 => 'uni204B',\n    8268 => 'uni204C',\n    8269 => 'uni204D',\n    8270 => 'uni204E',\n    8271 => 'uni204F',\n    8272 => 'uni2050',\n    8273 => 'uni2051',\n    8274 => 'uni2052',\n    8275 => 'uni2053',\n    8276 => 'uni2054',\n    8277 => 'uni2055',\n    8278 => 'uni2056',\n    8279 => 'uni2057',\n    8280 => 'uni2058',\n    8281 => 'uni2059',\n    8282 => 'uni205A',\n    8283 => 'uni205B',\n    8284 => 'uni205C',\n    8285 => 'uni205D',\n    8286 => 'uni205E',\n    8287 => 'uni205F',\n    8288 => 'uni2060',\n    8289 => 'uni2061',\n    8290 => 'uni2062',\n    8291 => 'uni2063',\n    8292 => 'uni2064',\n    8298 => 'uni206A',\n    8299 => 'uni206B',\n    8300 => 'uni206C',\n    8301 => 'uni206D',\n    8302 => 'uni206E',\n    8303 => 'uni206F',\n    8304 => 'uni2070',\n    8305 => 'uni2071',\n    8308 => 'uni2074',\n    8309 => 'uni2075',\n    8310 => 'uni2076',\n    8311 => 'uni2077',\n    8312 => 'uni2078',\n    8313 => 'uni2079',\n    8314 => 'uni207A',\n    8315 => 'uni207B',\n    8316 => 'uni207C',\n    8317 => 'uni207D',\n    8318 => 'uni207E',\n    8319 => 'uni207F',\n    8320 => 'uni2080',\n    8321 => 'uni2081',\n    8322 => 'uni2082',\n    8323 => 'uni2083',\n    8324 => 'uni2084',\n    8325 => 'uni2085',\n    8326 => 'uni2086',\n    8327 => 'uni2087',\n    8328 => 'uni2088',\n    8329 => 'uni2089',\n    8330 => 'uni208A',\n    8331 => 'uni208B',\n    8332 => 'uni208C',\n    8333 => 'uni208D',\n    8334 => 'uni208E',\n    8336 => 'uni2090',\n    8337 => 'uni2091',\n    8338 => 'uni2092',\n    8339 => 'uni2093',\n    8340 => 'uni2094',\n    8341 => 'uni2095',\n    8342 => 'uni2096',\n    8343 => 'uni2097',\n    8344 => 'uni2098',\n    8345 => 'uni2099',\n    8346 => 'uni209A',\n    8347 => 'uni209B',\n    8348 => 'uni209C',\n    8352 => 'uni20A0',\n    8353 => 'colonmonetary',\n    8354 => 'uni20A2',\n    8355 => 'franc',\n    8356 => 'lira',\n    8357 => 'uni20A5',\n    8358 => 'uni20A6',\n    8359 => 'peseta',\n    8360 => 'uni20A8',\n    8361 => 'uni20A9',\n    8362 => 'uni20AA',\n    8363 => 'dong',\n    8364 => 'Euro',\n    8365 => 'uni20AD',\n    8366 => 'uni20AE',\n    8367 => 'uni20AF',\n    8368 => 'uni20B0',\n    8369 => 'uni20B1',\n    8370 => 'uni20B2',\n    8371 => 'uni20B3',\n    8372 => 'uni20B4',\n    8373 => 'uni20B5',\n    8376 => 'uni20B8',\n    8377 => 'uni20B9',\n    8378 => 'uni20BA',\n    8381 => 'uni20BD',\n    8400 => 'uni20D0',\n    8401 => 'uni20D1',\n    8406 => 'uni20D6',\n    8407 => 'uni20D7',\n    8411 => 'uni20DB',\n    8412 => 'uni20DC',\n    8417 => 'uni20E1',\n    8448 => 'uni2100',\n    8449 => 'uni2101',\n    8450 => 'uni2102',\n    8451 => 'uni2103',\n    8452 => 'uni2104',\n    8453 => 'uni2105',\n    8454 => 'uni2106',\n    8455 => 'uni2107',\n    8456 => 'uni2108',\n    8457 => 'uni2109',\n    8459 => 'uni210B',\n    8460 => 'uni210C',\n    8461 => 'uni210D',\n    8462 => 'uni210E',\n    8463 => 'uni210F',\n    8464 => 'uni2110',\n    8465 => 'Ifraktur',\n    8466 => 'uni2112',\n    8467 => 'uni2113',\n    8468 => 'uni2114',\n    8469 => 'uni2115',\n    8470 => 'uni2116',\n    8471 => 'uni2117',\n    8472 => 'weierstrass',\n    8473 => 'uni2119',\n    8474 => 'uni211A',\n    8475 => 'uni211B',\n    8476 => 'Rfraktur',\n    8477 => 'uni211D',\n    8478 => 'prescription',\n    8479 => 'uni211F',\n    8480 => 'uni2120',\n    8481 => 'uni2121',\n    8482 => 'trademark',\n    8483 => 'uni2123',\n    8484 => 'uni2124',\n    8485 => 'uni2125',\n    8486 => 'uni2126',\n    8487 => 'uni2127',\n    8488 => 'uni2128',\n    8489 => 'uni2129',\n    8490 => 'uni212A',\n    8491 => 'uni212B',\n    8492 => 'uni212C',\n    8493 => 'uni212D',\n    8494 => 'estimated',\n    8495 => 'uni212F',\n    8496 => 'uni2130',\n    8497 => 'uni2131',\n    8498 => 'uni2132',\n    8499 => 'uni2133',\n    8500 => 'uni2134',\n    8501 => 'aleph',\n    8502 => 'uni2136',\n    8503 => 'uni2137',\n    8504 => 'uni2138',\n    8505 => 'uni2139',\n    8506 => 'uni213A',\n    8507 => 'uni213B',\n    8508 => 'uni213C',\n    8509 => 'uni213D',\n    8510 => 'uni213E',\n    8511 => 'uni213F',\n    8512 => 'uni2140',\n    8513 => 'uni2141',\n    8514 => 'uni2142',\n    8515 => 'uni2143',\n    8516 => 'uni2144',\n    8517 => 'uni2145',\n    8518 => 'uni2146',\n    8519 => 'uni2147',\n    8520 => 'uni2148',\n    8521 => 'uni2149',\n    8523 => 'uni214B',\n    8526 => 'uni214E',\n    8528 => 'uni2150',\n    8529 => 'uni2151',\n    8530 => 'uni2152',\n    8531 => 'onethird',\n    8532 => 'twothirds',\n    8533 => 'uni2155',\n    8534 => 'uni2156',\n    8535 => 'uni2157',\n    8536 => 'uni2158',\n    8537 => 'uni2159',\n    8538 => 'uni215A',\n    8539 => 'oneeighth',\n    8540 => 'threeeighths',\n    8541 => 'fiveeighths',\n    8542 => 'seveneighths',\n    8543 => 'uni215F',\n    8544 => 'uni2160',\n    8545 => 'uni2161',\n    8546 => 'uni2162',\n    8547 => 'uni2163',\n    8548 => 'uni2164',\n    8549 => 'uni2165',\n    8550 => 'uni2166',\n    8551 => 'uni2167',\n    8552 => 'uni2168',\n    8553 => 'uni2169',\n    8554 => 'uni216A',\n    8555 => 'uni216B',\n    8556 => 'uni216C',\n    8557 => 'uni216D',\n    8558 => 'uni216E',\n    8559 => 'uni216F',\n    8560 => 'uni2170',\n    8561 => 'uni2171',\n    8562 => 'uni2172',\n    8563 => 'uni2173',\n    8564 => 'uni2174',\n    8565 => 'uni2175',\n    8566 => 'uni2176',\n    8567 => 'uni2177',\n    8568 => 'uni2178',\n    8569 => 'uni2179',\n    8570 => 'uni217A',\n    8571 => 'uni217B',\n    8572 => 'uni217C',\n    8573 => 'uni217D',\n    8574 => 'uni217E',\n    8575 => 'uni217F',\n    8576 => 'uni2180',\n    8577 => 'uni2181',\n    8578 => 'uni2182',\n    8579 => 'uni2183',\n    8580 => 'uni2184',\n    8581 => 'uni2185',\n    8585 => 'uni2189',\n    8592 => 'arrowleft',\n    8593 => 'arrowup',\n    8594 => 'arrowright',\n    8595 => 'arrowdown',\n    8596 => 'arrowboth',\n    8597 => 'arrowupdn',\n    8598 => 'uni2196',\n    8599 => 'uni2197',\n    8600 => 'uni2198',\n    8601 => 'uni2199',\n    8602 => 'uni219A',\n    8603 => 'uni219B',\n    8604 => 'uni219C',\n    8605 => 'uni219D',\n    8606 => 'uni219E',\n    8607 => 'uni219F',\n    8608 => 'uni21A0',\n    8609 => 'uni21A1',\n    8610 => 'uni21A2',\n    8611 => 'uni21A3',\n    8612 => 'uni21A4',\n    8613 => 'uni21A5',\n    8614 => 'uni21A6',\n    8615 => 'uni21A7',\n    8616 => 'arrowupdnbse',\n    8617 => 'uni21A9',\n    8618 => 'uni21AA',\n    8619 => 'uni21AB',\n    8620 => 'uni21AC',\n    8621 => 'uni21AD',\n    8622 => 'uni21AE',\n    8623 => 'uni21AF',\n    8624 => 'uni21B0',\n    8625 => 'uni21B1',\n    8626 => 'uni21B2',\n    8627 => 'uni21B3',\n    8628 => 'uni21B4',\n    8629 => 'carriagereturn',\n    8630 => 'uni21B6',\n    8631 => 'uni21B7',\n    8632 => 'uni21B8',\n    8633 => 'uni21B9',\n    8634 => 'uni21BA',\n    8635 => 'uni21BB',\n    8636 => 'uni21BC',\n    8637 => 'uni21BD',\n    8638 => 'uni21BE',\n    8639 => 'uni21BF',\n    8640 => 'uni21C0',\n    8641 => 'uni21C1',\n    8642 => 'uni21C2',\n    8643 => 'uni21C3',\n    8644 => 'uni21C4',\n    8645 => 'uni21C5',\n    8646 => 'uni21C6',\n    8647 => 'uni21C7',\n    8648 => 'uni21C8',\n    8649 => 'uni21C9',\n    8650 => 'uni21CA',\n    8651 => 'uni21CB',\n    8652 => 'uni21CC',\n    8653 => 'uni21CD',\n    8654 => 'uni21CE',\n    8655 => 'uni21CF',\n    8656 => 'arrowdblleft',\n    8657 => 'arrowdblup',\n    8658 => 'arrowdblright',\n    8659 => 'arrowdbldown',\n    8660 => 'arrowdblboth',\n    8661 => 'uni21D5',\n    8662 => 'uni21D6',\n    8663 => 'uni21D7',\n    8664 => 'uni21D8',\n    8665 => 'uni21D9',\n    8666 => 'uni21DA',\n    8667 => 'uni21DB',\n    8668 => 'uni21DC',\n    8669 => 'uni21DD',\n    8670 => 'uni21DE',\n    8671 => 'uni21DF',\n    8672 => 'uni21E0',\n    8673 => 'uni21E1',\n    8674 => 'uni21E2',\n    8675 => 'uni21E3',\n    8676 => 'uni21E4',\n    8677 => 'uni21E5',\n    8678 => 'uni21E6',\n    8679 => 'uni21E7',\n    8680 => 'uni21E8',\n    8681 => 'uni21E9',\n    8682 => 'uni21EA',\n    8683 => 'uni21EB',\n    8684 => 'uni21EC',\n    8685 => 'uni21ED',\n    8686 => 'uni21EE',\n    8687 => 'uni21EF',\n    8688 => 'uni21F0',\n    8689 => 'uni21F1',\n    8690 => 'uni21F2',\n    8691 => 'uni21F3',\n    8692 => 'uni21F4',\n    8693 => 'uni21F5',\n    8694 => 'uni21F6',\n    8695 => 'uni21F7',\n    8696 => 'uni21F8',\n    8697 => 'uni21F9',\n    8698 => 'uni21FA',\n    8699 => 'uni21FB',\n    8700 => 'uni21FC',\n    8701 => 'uni21FD',\n    8702 => 'uni21FE',\n    8703 => 'uni21FF',\n    8704 => 'universal',\n    8705 => 'uni2201',\n    8706 => 'partialdiff',\n    8707 => 'existential',\n    8708 => 'uni2204',\n    8709 => 'emptyset',\n    8710 => 'increment',\n    8711 => 'gradient',\n    8712 => 'element',\n    8713 => 'notelement',\n    8714 => 'uni220A',\n    8715 => 'suchthat',\n    8716 => 'uni220C',\n    8717 => 'uni220D',\n    8718 => 'uni220E',\n    8719 => 'product',\n    8720 => 'uni2210',\n    8721 => 'summation',\n    8722 => 'minus',\n    8723 => 'uni2213',\n    8724 => 'uni2214',\n    8725 => 'uni2215',\n    8726 => 'uni2216',\n    8727 => 'asteriskmath',\n    8728 => 'uni2218',\n    8729 => 'uni2219',\n    8730 => 'radical',\n    8731 => 'uni221B',\n    8732 => 'uni221C',\n    8733 => 'proportional',\n    8734 => 'infinity',\n    8735 => 'orthogonal',\n    8736 => 'angle',\n    8737 => 'uni2221',\n    8738 => 'uni2222',\n    8739 => 'uni2223',\n    8740 => 'uni2224',\n    8741 => 'uni2225',\n    8742 => 'uni2226',\n    8743 => 'logicaland',\n    8744 => 'logicalor',\n    8745 => 'intersection',\n    8746 => 'union',\n    8747 => 'integral',\n    8748 => 'uni222C',\n    8749 => 'uni222D',\n    8750 => 'uni222E',\n    8751 => 'uni222F',\n    8752 => 'uni2230',\n    8753 => 'uni2231',\n    8754 => 'uni2232',\n    8755 => 'uni2233',\n    8756 => 'therefore',\n    8757 => 'uni2235',\n    8758 => 'uni2236',\n    8759 => 'uni2237',\n    8760 => 'uni2238',\n    8761 => 'uni2239',\n    8762 => 'uni223A',\n    8763 => 'uni223B',\n    8764 => 'similar',\n    8765 => 'uni223D',\n    8766 => 'uni223E',\n    8767 => 'uni223F',\n    8768 => 'uni2240',\n    8769 => 'uni2241',\n    8770 => 'uni2242',\n    8771 => 'uni2243',\n    8772 => 'uni2244',\n    8773 => 'congruent',\n    8774 => 'uni2246',\n    8775 => 'uni2247',\n    8776 => 'approxequal',\n    8777 => 'uni2249',\n    8778 => 'uni224A',\n    8779 => 'uni224B',\n    8780 => 'uni224C',\n    8781 => 'uni224D',\n    8782 => 'uni224E',\n    8783 => 'uni224F',\n    8784 => 'uni2250',\n    8785 => 'uni2251',\n    8786 => 'uni2252',\n    8787 => 'uni2253',\n    8788 => 'uni2254',\n    8789 => 'uni2255',\n    8790 => 'uni2256',\n    8791 => 'uni2257',\n    8792 => 'uni2258',\n    8793 => 'uni2259',\n    8794 => 'uni225A',\n    8795 => 'uni225B',\n    8796 => 'uni225C',\n    8797 => 'uni225D',\n    8798 => 'uni225E',\n    8799 => 'uni225F',\n    8800 => 'notequal',\n    8801 => 'equivalence',\n    8802 => 'uni2262',\n    8803 => 'uni2263',\n    8804 => 'lessequal',\n    8805 => 'greaterequal',\n    8806 => 'uni2266',\n    8807 => 'uni2267',\n    8808 => 'uni2268',\n    8809 => 'uni2269',\n    8810 => 'uni226A',\n    8811 => 'uni226B',\n    8812 => 'uni226C',\n    8813 => 'uni226D',\n    8814 => 'uni226E',\n    8815 => 'uni226F',\n    8816 => 'uni2270',\n    8817 => 'uni2271',\n    8818 => 'uni2272',\n    8819 => 'uni2273',\n    8820 => 'uni2274',\n    8821 => 'uni2275',\n    8822 => 'uni2276',\n    8823 => 'uni2277',\n    8824 => 'uni2278',\n    8825 => 'uni2279',\n    8826 => 'uni227A',\n    8827 => 'uni227B',\n    8828 => 'uni227C',\n    8829 => 'uni227D',\n    8830 => 'uni227E',\n    8831 => 'uni227F',\n    8832 => 'uni2280',\n    8833 => 'uni2281',\n    8834 => 'propersubset',\n    8835 => 'propersuperset',\n    8836 => 'notsubset',\n    8837 => 'uni2285',\n    8838 => 'reflexsubset',\n    8839 => 'reflexsuperset',\n    8840 => 'uni2288',\n    8841 => 'uni2289',\n    8842 => 'uni228A',\n    8843 => 'uni228B',\n    8844 => 'uni228C',\n    8845 => 'uni228D',\n    8846 => 'uni228E',\n    8847 => 'uni228F',\n    8848 => 'uni2290',\n    8849 => 'uni2291',\n    8850 => 'uni2292',\n    8851 => 'uni2293',\n    8852 => 'uni2294',\n    8853 => 'circleplus',\n    8854 => 'uni2296',\n    8855 => 'circlemultiply',\n    8856 => 'uni2298',\n    8857 => 'uni2299',\n    8858 => 'uni229A',\n    8859 => 'uni229B',\n    8860 => 'uni229C',\n    8861 => 'uni229D',\n    8862 => 'uni229E',\n    8863 => 'uni229F',\n    8864 => 'uni22A0',\n    8865 => 'uni22A1',\n    8866 => 'uni22A2',\n    8867 => 'uni22A3',\n    8868 => 'uni22A4',\n    8869 => 'perpendicular',\n    8870 => 'uni22A6',\n    8871 => 'uni22A7',\n    8872 => 'uni22A8',\n    8873 => 'uni22A9',\n    8874 => 'uni22AA',\n    8875 => 'uni22AB',\n    8876 => 'uni22AC',\n    8877 => 'uni22AD',\n    8878 => 'uni22AE',\n    8879 => 'uni22AF',\n    8880 => 'uni22B0',\n    8881 => 'uni22B1',\n    8882 => 'uni22B2',\n    8883 => 'uni22B3',\n    8884 => 'uni22B4',\n    8885 => 'uni22B5',\n    8886 => 'uni22B6',\n    8887 => 'uni22B7',\n    8888 => 'uni22B8',\n    8889 => 'uni22B9',\n    8890 => 'uni22BA',\n    8891 => 'uni22BB',\n    8892 => 'uni22BC',\n    8893 => 'uni22BD',\n    8894 => 'uni22BE',\n    8895 => 'uni22BF',\n    8896 => 'uni22C0',\n    8897 => 'uni22C1',\n    8898 => 'uni22C2',\n    8899 => 'uni22C3',\n    8900 => 'uni22C4',\n    8901 => 'dotmath',\n    8902 => 'uni22C6',\n    8903 => 'uni22C7',\n    8904 => 'uni22C8',\n    8905 => 'uni22C9',\n    8906 => 'uni22CA',\n    8907 => 'uni22CB',\n    8908 => 'uni22CC',\n    8909 => 'uni22CD',\n    8910 => 'uni22CE',\n    8911 => 'uni22CF',\n    8912 => 'uni22D0',\n    8913 => 'uni22D1',\n    8914 => 'uni22D2',\n    8915 => 'uni22D3',\n    8916 => 'uni22D4',\n    8917 => 'uni22D5',\n    8918 => 'uni22D6',\n    8919 => 'uni22D7',\n    8920 => 'uni22D8',\n    8921 => 'uni22D9',\n    8922 => 'uni22DA',\n    8923 => 'uni22DB',\n    8924 => 'uni22DC',\n    8925 => 'uni22DD',\n    8926 => 'uni22DE',\n    8927 => 'uni22DF',\n    8928 => 'uni22E0',\n    8929 => 'uni22E1',\n    8930 => 'uni22E2',\n    8931 => 'uni22E3',\n    8932 => 'uni22E4',\n    8933 => 'uni22E5',\n    8934 => 'uni22E6',\n    8935 => 'uni22E7',\n    8936 => 'uni22E8',\n    8937 => 'uni22E9',\n    8938 => 'uni22EA',\n    8939 => 'uni22EB',\n    8940 => 'uni22EC',\n    8941 => 'uni22ED',\n    8942 => 'uni22EE',\n    8943 => 'uni22EF',\n    8944 => 'uni22F0',\n    8945 => 'uni22F1',\n    8946 => 'uni22F2',\n    8947 => 'uni22F3',\n    8948 => 'uni22F4',\n    8949 => 'uni22F5',\n    8950 => 'uni22F6',\n    8951 => 'uni22F7',\n    8952 => 'uni22F8',\n    8953 => 'uni22F9',\n    8954 => 'uni22FA',\n    8955 => 'uni22FB',\n    8956 => 'uni22FC',\n    8957 => 'uni22FD',\n    8958 => 'uni22FE',\n    8959 => 'uni22FF',\n    8960 => 'uni2300',\n    8961 => 'uni2301',\n    8962 => 'house',\n    8963 => 'uni2303',\n    8964 => 'uni2304',\n    8965 => 'uni2305',\n    8966 => 'uni2306',\n    8967 => 'uni2307',\n    8968 => 'uni2308',\n    8969 => 'uni2309',\n    8970 => 'uni230A',\n    8971 => 'uni230B',\n    8972 => 'uni230C',\n    8973 => 'uni230D',\n    8974 => 'uni230E',\n    8975 => 'uni230F',\n    8976 => 'revlogicalnot',\n    8977 => 'uni2311',\n    8984 => 'uni2318',\n    8985 => 'uni2319',\n    8988 => 'uni231C',\n    8989 => 'uni231D',\n    8990 => 'uni231E',\n    8991 => 'uni231F',\n    8992 => 'integraltp',\n    8993 => 'integralbt',\n    8996 => 'uni2324',\n    8997 => 'uni2325',\n    8998 => 'uni2326',\n    8999 => 'uni2327',\n    9000 => 'uni2328',\n    9003 => 'uni232B',\n    9004 => 'uni232C',\n    9075 => 'uni2373',\n    9076 => 'uni2374',\n    9077 => 'uni2375',\n    9082 => 'uni237A',\n    9085 => 'uni237D',\n    9095 => 'uni2387',\n    9108 => 'uni2394',\n    9115 => 'uni239B',\n    9116 => 'uni239C',\n    9117 => 'uni239D',\n    9118 => 'uni239E',\n    9119 => 'uni239F',\n    9120 => 'uni23A0',\n    9121 => 'uni23A1',\n    9122 => 'uni23A2',\n    9123 => 'uni23A3',\n    9124 => 'uni23A4',\n    9125 => 'uni23A5',\n    9126 => 'uni23A6',\n    9127 => 'uni23A7',\n    9128 => 'uni23A8',\n    9129 => 'uni23A9',\n    9130 => 'uni23AA',\n    9131 => 'uni23AB',\n    9132 => 'uni23AC',\n    9133 => 'uni23AD',\n    9134 => 'uni23AE',\n    9166 => 'uni23CE',\n    9167 => 'uni23CF',\n    9187 => 'uni23E3',\n    9189 => 'uni23E5',\n    9192 => 'uni23E8',\n    9250 => 'uni2422',\n    9251 => 'uni2423',\n    9312 => 'uni2460',\n    9313 => 'uni2461',\n    9314 => 'uni2462',\n    9315 => 'uni2463',\n    9316 => 'uni2464',\n    9317 => 'uni2465',\n    9318 => 'uni2466',\n    9319 => 'uni2467',\n    9320 => 'uni2468',\n    9321 => 'uni2469',\n    9472 => 'SF100000',\n    9473 => 'uni2501',\n    9474 => 'SF110000',\n    9475 => 'uni2503',\n    9476 => 'uni2504',\n    9477 => 'uni2505',\n    9478 => 'uni2506',\n    9479 => 'uni2507',\n    9480 => 'uni2508',\n    9481 => 'uni2509',\n    9482 => 'uni250A',\n    9483 => 'uni250B',\n    9484 => 'SF010000',\n    9485 => 'uni250D',\n    9486 => 'uni250E',\n    9487 => 'uni250F',\n    9488 => 'SF030000',\n    9489 => 'uni2511',\n    9490 => 'uni2512',\n    9491 => 'uni2513',\n    9492 => 'SF020000',\n    9493 => 'uni2515',\n    9494 => 'uni2516',\n    9495 => 'uni2517',\n    9496 => 'SF040000',\n    9497 => 'uni2519',\n    9498 => 'uni251A',\n    9499 => 'uni251B',\n    9500 => 'SF080000',\n    9501 => 'uni251D',\n    9502 => 'uni251E',\n    9503 => 'uni251F',\n    9504 => 'uni2520',\n    9505 => 'uni2521',\n    9506 => 'uni2522',\n    9507 => 'uni2523',\n    9508 => 'SF090000',\n    9509 => 'uni2525',\n    9510 => 'uni2526',\n    9511 => 'uni2527',\n    9512 => 'uni2528',\n    9513 => 'uni2529',\n    9514 => 'uni252A',\n    9515 => 'uni252B',\n    9516 => 'SF060000',\n    9517 => 'uni252D',\n    9518 => 'uni252E',\n    9519 => 'uni252F',\n    9520 => 'uni2530',\n    9521 => 'uni2531',\n    9522 => 'uni2532',\n    9523 => 'uni2533',\n    9524 => 'SF070000',\n    9525 => 'uni2535',\n    9526 => 'uni2536',\n    9527 => 'uni2537',\n    9528 => 'uni2538',\n    9529 => 'uni2539',\n    9530 => 'uni253A',\n    9531 => 'uni253B',\n    9532 => 'SF050000',\n    9533 => 'uni253D',\n    9534 => 'uni253E',\n    9535 => 'uni253F',\n    9536 => 'uni2540',\n    9537 => 'uni2541',\n    9538 => 'uni2542',\n    9539 => 'uni2543',\n    9540 => 'uni2544',\n    9541 => 'uni2545',\n    9542 => 'uni2546',\n    9543 => 'uni2547',\n    9544 => 'uni2548',\n    9545 => 'uni2549',\n    9546 => 'uni254A',\n    9547 => 'uni254B',\n    9548 => 'uni254C',\n    9549 => 'uni254D',\n    9550 => 'uni254E',\n    9551 => 'uni254F',\n    9552 => 'SF430000',\n    9553 => 'SF240000',\n    9554 => 'SF510000',\n    9555 => 'SF520000',\n    9556 => 'SF390000',\n    9557 => 'SF220000',\n    9558 => 'SF210000',\n    9559 => 'SF250000',\n    9560 => 'SF500000',\n    9561 => 'SF490000',\n    9562 => 'SF380000',\n    9563 => 'SF280000',\n    9564 => 'SF270000',\n    9565 => 'SF260000',\n    9566 => 'SF360000',\n    9567 => 'SF370000',\n    9568 => 'SF420000',\n    9569 => 'SF190000',\n    9570 => 'SF200000',\n    9571 => 'SF230000',\n    9572 => 'SF470000',\n    9573 => 'SF480000',\n    9574 => 'SF410000',\n    9575 => 'SF450000',\n    9576 => 'SF460000',\n    9577 => 'SF400000',\n    9578 => 'SF540000',\n    9579 => 'SF530000',\n    9580 => 'SF440000',\n    9581 => 'uni256D',\n    9582 => 'uni256E',\n    9583 => 'uni256F',\n    9584 => 'uni2570',\n    9585 => 'uni2571',\n    9586 => 'uni2572',\n    9587 => 'uni2573',\n    9588 => 'uni2574',\n    9589 => 'uni2575',\n    9590 => 'uni2576',\n    9591 => 'uni2577',\n    9592 => 'uni2578',\n    9593 => 'uni2579',\n    9594 => 'uni257A',\n    9595 => 'uni257B',\n    9596 => 'uni257C',\n    9597 => 'uni257D',\n    9598 => 'uni257E',\n    9599 => 'uni257F',\n    9600 => 'upblock',\n    9601 => 'uni2581',\n    9602 => 'uni2582',\n    9603 => 'uni2583',\n    9604 => 'dnblock',\n    9605 => 'uni2585',\n    9606 => 'uni2586',\n    9607 => 'uni2587',\n    9608 => 'block',\n    9609 => 'uni2589',\n    9610 => 'uni258A',\n    9611 => 'uni258B',\n    9612 => 'lfblock',\n    9613 => 'uni258D',\n    9614 => 'uni258E',\n    9615 => 'uni258F',\n    9616 => 'rtblock',\n    9617 => 'ltshade',\n    9618 => 'shade',\n    9619 => 'dkshade',\n    9620 => 'uni2594',\n    9621 => 'uni2595',\n    9622 => 'uni2596',\n    9623 => 'uni2597',\n    9624 => 'uni2598',\n    9625 => 'uni2599',\n    9626 => 'uni259A',\n    9627 => 'uni259B',\n    9628 => 'uni259C',\n    9629 => 'uni259D',\n    9630 => 'uni259E',\n    9631 => 'uni259F',\n    9632 => 'filledbox',\n    9633 => 'H22073',\n    9634 => 'uni25A2',\n    9635 => 'uni25A3',\n    9636 => 'uni25A4',\n    9637 => 'uni25A5',\n    9638 => 'uni25A6',\n    9639 => 'uni25A7',\n    9640 => 'uni25A8',\n    9641 => 'uni25A9',\n    9642 => 'H18543',\n    9643 => 'H18551',\n    9644 => 'filledrect',\n    9645 => 'uni25AD',\n    9646 => 'uni25AE',\n    9647 => 'uni25AF',\n    9648 => 'uni25B0',\n    9649 => 'uni25B1',\n    9650 => 'triagup',\n    9651 => 'uni25B3',\n    9652 => 'uni25B4',\n    9653 => 'uni25B5',\n    9654 => 'uni25B6',\n    9655 => 'uni25B7',\n    9656 => 'uni25B8',\n    9657 => 'uni25B9',\n    9658 => 'triagrt',\n    9659 => 'uni25BB',\n    9660 => 'triagdn',\n    9661 => 'uni25BD',\n    9662 => 'uni25BE',\n    9663 => 'uni25BF',\n    9664 => 'uni25C0',\n    9665 => 'uni25C1',\n    9666 => 'uni25C2',\n    9667 => 'uni25C3',\n    9668 => 'triaglf',\n    9669 => 'uni25C5',\n    9670 => 'uni25C6',\n    9671 => 'uni25C7',\n    9672 => 'uni25C8',\n    9673 => 'uni25C9',\n    9674 => 'lozenge',\n    9675 => 'circle',\n    9676 => 'uni25CC',\n    9677 => 'uni25CD',\n    9678 => 'uni25CE',\n    9679 => 'H18533',\n    9680 => 'uni25D0',\n    9681 => 'uni25D1',\n    9682 => 'uni25D2',\n    9683 => 'uni25D3',\n    9684 => 'uni25D4',\n    9685 => 'uni25D5',\n    9686 => 'uni25D6',\n    9687 => 'uni25D7',\n    9688 => 'invbullet',\n    9689 => 'invcircle',\n    9690 => 'uni25DA',\n    9691 => 'uni25DB',\n    9692 => 'uni25DC',\n    9693 => 'uni25DD',\n    9694 => 'uni25DE',\n    9695 => 'uni25DF',\n    9696 => 'uni25E0',\n    9697 => 'uni25E1',\n    9698 => 'uni25E2',\n    9699 => 'uni25E3',\n    9700 => 'uni25E4',\n    9701 => 'uni25E5',\n    9702 => 'openbullet',\n    9703 => 'uni25E7',\n    9704 => 'uni25E8',\n    9705 => 'uni25E9',\n    9706 => 'uni25EA',\n    9707 => 'uni25EB',\n    9708 => 'uni25EC',\n    9709 => 'uni25ED',\n    9710 => 'uni25EE',\n    9711 => 'uni25EF',\n    9712 => 'uni25F0',\n    9713 => 'uni25F1',\n    9714 => 'uni25F2',\n    9715 => 'uni25F3',\n    9716 => 'uni25F4',\n    9717 => 'uni25F5',\n    9718 => 'uni25F6',\n    9719 => 'uni25F7',\n    9720 => 'uni25F8',\n    9721 => 'uni25F9',\n    9722 => 'uni25FA',\n    9723 => 'uni25FB',\n    9724 => 'uni25FC',\n    9725 => 'uni25FD',\n    9726 => 'uni25FE',\n    9727 => 'uni25FF',\n    9728 => 'uni2600',\n    9729 => 'uni2601',\n    9730 => 'uni2602',\n    9731 => 'uni2603',\n    9732 => 'uni2604',\n    9733 => 'uni2605',\n    9734 => 'uni2606',\n    9735 => 'uni2607',\n    9736 => 'uni2608',\n    9737 => 'uni2609',\n    9738 => 'uni260A',\n    9739 => 'uni260B',\n    9740 => 'uni260C',\n    9741 => 'uni260D',\n    9742 => 'uni260E',\n    9743 => 'uni260F',\n    9744 => 'uni2610',\n    9745 => 'uni2611',\n    9746 => 'uni2612',\n    9747 => 'uni2613',\n    9748 => 'uni2614',\n    9749 => 'uni2615',\n    9750 => 'uni2616',\n    9751 => 'uni2617',\n    9752 => 'uni2618',\n    9753 => 'uni2619',\n    9754 => 'uni261A',\n    9755 => 'uni261B',\n    9756 => 'uni261C',\n    9757 => 'uni261D',\n    9758 => 'uni261E',\n    9759 => 'uni261F',\n    9760 => 'uni2620',\n    9761 => 'uni2621',\n    9762 => 'uni2622',\n    9763 => 'uni2623',\n    9764 => 'uni2624',\n    9765 => 'uni2625',\n    9766 => 'uni2626',\n    9767 => 'uni2627',\n    9768 => 'uni2628',\n    9769 => 'uni2629',\n    9770 => 'uni262A',\n    9771 => 'uni262B',\n    9772 => 'uni262C',\n    9773 => 'uni262D',\n    9774 => 'uni262E',\n    9775 => 'uni262F',\n    9776 => 'uni2630',\n    9777 => 'uni2631',\n    9778 => 'uni2632',\n    9779 => 'uni2633',\n    9780 => 'uni2634',\n    9781 => 'uni2635',\n    9782 => 'uni2636',\n    9783 => 'uni2637',\n    9784 => 'uni2638',\n    9785 => 'uni2639',\n    9786 => 'smileface',\n    9787 => 'invsmileface',\n    9788 => 'sun',\n    9789 => 'uni263D',\n    9790 => 'uni263E',\n    9791 => 'uni263F',\n    9792 => 'female',\n    9793 => 'uni2641',\n    9794 => 'male',\n    9795 => 'uni2643',\n    9796 => 'uni2644',\n    9797 => 'uni2645',\n    9798 => 'uni2646',\n    9799 => 'uni2647',\n    9800 => 'uni2648',\n    9801 => 'uni2649',\n    9802 => 'uni264A',\n    9803 => 'uni264B',\n    9804 => 'uni264C',\n    9805 => 'uni264D',\n    9806 => 'uni264E',\n    9807 => 'uni264F',\n    9808 => 'uni2650',\n    9809 => 'uni2651',\n    9810 => 'uni2652',\n    9811 => 'uni2653',\n    9812 => 'uni2654',\n    9813 => 'uni2655',\n    9814 => 'uni2656',\n    9815 => 'uni2657',\n    9816 => 'uni2658',\n    9817 => 'uni2659',\n    9818 => 'uni265A',\n    9819 => 'uni265B',\n    9820 => 'uni265C',\n    9821 => 'uni265D',\n    9822 => 'uni265E',\n    9823 => 'uni265F',\n    9824 => 'spade',\n    9825 => 'uni2661',\n    9826 => 'uni2662',\n    9827 => 'club',\n    9828 => 'uni2664',\n    9829 => 'heart',\n    9830 => 'diamond',\n    9831 => 'uni2667',\n    9832 => 'uni2668',\n    9833 => 'uni2669',\n    9834 => 'musicalnote',\n    9835 => 'musicalnotedbl',\n    9836 => 'uni266C',\n    9837 => 'uni266D',\n    9838 => 'uni266E',\n    9839 => 'uni266F',\n    9840 => 'uni2670',\n    9841 => 'uni2671',\n    9842 => 'uni2672',\n    9843 => 'uni2673',\n    9844 => 'uni2674',\n    9845 => 'uni2675',\n    9846 => 'uni2676',\n    9847 => 'uni2677',\n    9848 => 'uni2678',\n    9849 => 'uni2679',\n    9850 => 'uni267A',\n    9851 => 'uni267B',\n    9852 => 'uni267C',\n    9853 => 'uni267D',\n    9854 => 'uni267E',\n    9855 => 'uni267F',\n    9856 => 'uni2680',\n    9857 => 'uni2681',\n    9858 => 'uni2682',\n    9859 => 'uni2683',\n    9860 => 'uni2684',\n    9861 => 'uni2685',\n    9862 => 'uni2686',\n    9863 => 'uni2687',\n    9864 => 'uni2688',\n    9865 => 'uni2689',\n    9866 => 'uni268A',\n    9867 => 'uni268B',\n    9868 => 'uni268C',\n    9869 => 'uni268D',\n    9870 => 'uni268E',\n    9871 => 'uni268F',\n    9872 => 'uni2690',\n    9873 => 'uni2691',\n    9874 => 'uni2692',\n    9875 => 'uni2693',\n    9876 => 'uni2694',\n    9877 => 'uni2695',\n    9878 => 'uni2696',\n    9879 => 'uni2697',\n    9880 => 'uni2698',\n    9881 => 'uni2699',\n    9882 => 'uni269A',\n    9883 => 'uni269B',\n    9884 => 'uni269C',\n    9886 => 'uni269E',\n    9887 => 'uni269F',\n    9888 => 'uni26A0',\n    9889 => 'uni26A1',\n    9890 => 'uni26A2',\n    9891 => 'uni26A3',\n    9892 => 'uni26A4',\n    9893 => 'uni26A5',\n    9894 => 'uni26A6',\n    9895 => 'uni26A7',\n    9896 => 'uni26A8',\n    9897 => 'uni26A9',\n    9898 => 'uni26AA',\n    9899 => 'uni26AB',\n    9900 => 'uni26AC',\n    9901 => 'uni26AD',\n    9902 => 'uni26AE',\n    9903 => 'uni26AF',\n    9904 => 'uni26B0',\n    9905 => 'uni26B1',\n    9906 => 'uni26B2',\n    9907 => 'uni26B3',\n    9908 => 'uni26B4',\n    9909 => 'uni26B5',\n    9910 => 'uni26B6',\n    9911 => 'uni26B7',\n    9912 => 'uni26B8',\n    9920 => 'uni26C0',\n    9921 => 'uni26C1',\n    9922 => 'uni26C2',\n    9923 => 'uni26C3',\n    9954 => 'uni26E2',\n    9985 => 'uni2701',\n    9986 => 'uni2702',\n    9987 => 'uni2703',\n    9988 => 'uni2704',\n    9990 => 'uni2706',\n    9991 => 'uni2707',\n    9992 => 'uni2708',\n    9993 => 'uni2709',\n    9996 => 'uni270C',\n    9997 => 'uni270D',\n    9998 => 'uni270E',\n    9999 => 'uni270F',\n    10000 => 'uni2710',\n    10001 => 'uni2711',\n    10002 => 'uni2712',\n    10003 => 'uni2713',\n    10004 => 'uni2714',\n    10005 => 'uni2715',\n    10006 => 'uni2716',\n    10007 => 'uni2717',\n    10008 => 'uni2718',\n    10009 => 'uni2719',\n    10010 => 'uni271A',\n    10011 => 'uni271B',\n    10012 => 'uni271C',\n    10013 => 'uni271D',\n    10014 => 'uni271E',\n    10015 => 'uni271F',\n    10016 => 'uni2720',\n    10017 => 'uni2721',\n    10018 => 'uni2722',\n    10019 => 'uni2723',\n    10020 => 'uni2724',\n    10021 => 'uni2725',\n    10022 => 'uni2726',\n    10023 => 'uni2727',\n    10025 => 'uni2729',\n    10026 => 'uni272A',\n    10027 => 'uni272B',\n    10028 => 'uni272C',\n    10029 => 'uni272D',\n    10030 => 'uni272E',\n    10031 => 'uni272F',\n    10032 => 'uni2730',\n    10033 => 'uni2731',\n    10034 => 'uni2732',\n    10035 => 'uni2733',\n    10036 => 'uni2734',\n    10037 => 'uni2735',\n    10038 => 'uni2736',\n    10039 => 'uni2737',\n    10040 => 'uni2738',\n    10041 => 'uni2739',\n    10042 => 'uni273A',\n    10043 => 'uni273B',\n    10044 => 'uni273C',\n    10045 => 'uni273D',\n    10046 => 'uni273E',\n    10047 => 'uni273F',\n    10048 => 'uni2740',\n    10049 => 'uni2741',\n    10050 => 'uni2742',\n    10051 => 'uni2743',\n    10052 => 'uni2744',\n    10053 => 'uni2745',\n    10054 => 'uni2746',\n    10055 => 'uni2747',\n    10056 => 'uni2748',\n    10057 => 'uni2749',\n    10058 => 'uni274A',\n    10059 => 'uni274B',\n    10061 => 'uni274D',\n    10063 => 'uni274F',\n    10064 => 'uni2750',\n    10065 => 'uni2751',\n    10066 => 'uni2752',\n    10070 => 'uni2756',\n    10072 => 'uni2758',\n    10073 => 'uni2759',\n    10074 => 'uni275A',\n    10075 => 'uni275B',\n    10076 => 'uni275C',\n    10077 => 'uni275D',\n    10078 => 'uni275E',\n    10081 => 'uni2761',\n    10082 => 'uni2762',\n    10083 => 'uni2763',\n    10084 => 'uni2764',\n    10085 => 'uni2765',\n    10086 => 'uni2766',\n    10087 => 'uni2767',\n    10088 => 'uni2768',\n    10089 => 'uni2769',\n    10090 => 'uni276A',\n    10091 => 'uni276B',\n    10092 => 'uni276C',\n    10093 => 'uni276D',\n    10094 => 'uni276E',\n    10095 => 'uni276F',\n    10096 => 'uni2770',\n    10097 => 'uni2771',\n    10098 => 'uni2772',\n    10099 => 'uni2773',\n    10100 => 'uni2774',\n    10101 => 'uni2775',\n    10102 => 'uni2776',\n    10103 => 'uni2777',\n    10104 => 'uni2778',\n    10105 => 'uni2779',\n    10106 => 'uni277A',\n    10107 => 'uni277B',\n    10108 => 'uni277C',\n    10109 => 'uni277D',\n    10110 => 'uni277E',\n    10111 => 'uni277F',\n    10112 => 'uni2780',\n    10113 => 'uni2781',\n    10114 => 'uni2782',\n    10115 => 'uni2783',\n    10116 => 'uni2784',\n    10117 => 'uni2785',\n    10118 => 'uni2786',\n    10119 => 'uni2787',\n    10120 => 'uni2788',\n    10121 => 'uni2789',\n    10122 => 'uni278A',\n    10123 => 'uni278B',\n    10124 => 'uni278C',\n    10125 => 'uni278D',\n    10126 => 'uni278E',\n    10127 => 'uni278F',\n    10128 => 'uni2790',\n    10129 => 'uni2791',\n    10130 => 'uni2792',\n    10131 => 'uni2793',\n    10132 => 'uni2794',\n    10136 => 'uni2798',\n    10137 => 'uni2799',\n    10138 => 'uni279A',\n    10139 => 'uni279B',\n    10140 => 'uni279C',\n    10141 => 'uni279D',\n    10142 => 'uni279E',\n    10143 => 'uni279F',\n    10144 => 'uni27A0',\n    10145 => 'uni27A1',\n    10146 => 'uni27A2',\n    10147 => 'uni27A3',\n    10148 => 'uni27A4',\n    10149 => 'uni27A5',\n    10150 => 'uni27A6',\n    10151 => 'uni27A7',\n    10152 => 'uni27A8',\n    10153 => 'uni27A9',\n    10154 => 'uni27AA',\n    10155 => 'uni27AB',\n    10156 => 'uni27AC',\n    10157 => 'uni27AD',\n    10158 => 'uni27AE',\n    10159 => 'uni27AF',\n    10161 => 'uni27B1',\n    10162 => 'uni27B2',\n    10163 => 'uni27B3',\n    10164 => 'uni27B4',\n    10165 => 'uni27B5',\n    10166 => 'uni27B6',\n    10167 => 'uni27B7',\n    10168 => 'uni27B8',\n    10169 => 'uni27B9',\n    10170 => 'uni27BA',\n    10171 => 'uni27BB',\n    10172 => 'uni27BC',\n    10173 => 'uni27BD',\n    10174 => 'uni27BE',\n    10181 => 'uni27C5',\n    10182 => 'uni27C6',\n    10208 => 'uni27E0',\n    10214 => 'uni27E6',\n    10215 => 'uni27E7',\n    10216 => 'uni27E8',\n    10217 => 'uni27E9',\n    10218 => 'uni27EA',\n    10219 => 'uni27EB',\n    10224 => 'uni27F0',\n    10225 => 'uni27F1',\n    10226 => 'uni27F2',\n    10227 => 'uni27F3',\n    10228 => 'uni27F4',\n    10229 => 'uni27F5',\n    10230 => 'uni27F6',\n    10231 => 'uni27F7',\n    10232 => 'uni27F8',\n    10233 => 'uni27F9',\n    10234 => 'uni27FA',\n    10235 => 'uni27FB',\n    10236 => 'uni27FC',\n    10237 => 'uni27FD',\n    10238 => 'uni27FE',\n    10239 => 'uni27FF',\n    10240 => 'uni2800',\n    10241 => 'uni2801',\n    10242 => 'uni2802',\n    10243 => 'uni2803',\n    10244 => 'uni2804',\n    10245 => 'uni2805',\n    10246 => 'uni2806',\n    10247 => 'uni2807',\n    10248 => 'uni2808',\n    10249 => 'uni2809',\n    10250 => 'uni280A',\n    10251 => 'uni280B',\n    10252 => 'uni280C',\n    10253 => 'uni280D',\n    10254 => 'uni280E',\n    10255 => 'uni280F',\n    10256 => 'uni2810',\n    10257 => 'uni2811',\n    10258 => 'uni2812',\n    10259 => 'uni2813',\n    10260 => 'uni2814',\n    10261 => 'uni2815',\n    10262 => 'uni2816',\n    10263 => 'uni2817',\n    10264 => 'uni2818',\n    10265 => 'uni2819',\n    10266 => 'uni281A',\n    10267 => 'uni281B',\n    10268 => 'uni281C',\n    10269 => 'uni281D',\n    10270 => 'uni281E',\n    10271 => 'uni281F',\n    10272 => 'uni2820',\n    10273 => 'uni2821',\n    10274 => 'uni2822',\n    10275 => 'uni2823',\n    10276 => 'uni2824',\n    10277 => 'uni2825',\n    10278 => 'uni2826',\n    10279 => 'uni2827',\n    10280 => 'uni2828',\n    10281 => 'uni2829',\n    10282 => 'uni282A',\n    10283 => 'uni282B',\n    10284 => 'uni282C',\n    10285 => 'uni282D',\n    10286 => 'uni282E',\n    10287 => 'uni282F',\n    10288 => 'uni2830',\n    10289 => 'uni2831',\n    10290 => 'uni2832',\n    10291 => 'uni2833',\n    10292 => 'uni2834',\n    10293 => 'uni2835',\n    10294 => 'uni2836',\n    10295 => 'uni2837',\n    10296 => 'uni2838',\n    10297 => 'uni2839',\n    10298 => 'uni283A',\n    10299 => 'uni283B',\n    10300 => 'uni283C',\n    10301 => 'uni283D',\n    10302 => 'uni283E',\n    10303 => 'uni283F',\n    10304 => 'uni2840',\n    10305 => 'uni2841',\n    10306 => 'uni2842',\n    10307 => 'uni2843',\n    10308 => 'uni2844',\n    10309 => 'uni2845',\n    10310 => 'uni2846',\n    10311 => 'uni2847',\n    10312 => 'uni2848',\n    10313 => 'uni2849',\n    10314 => 'uni284A',\n    10315 => 'uni284B',\n    10316 => 'uni284C',\n    10317 => 'uni284D',\n    10318 => 'uni284E',\n    10319 => 'uni284F',\n    10320 => 'uni2850',\n    10321 => 'uni2851',\n    10322 => 'uni2852',\n    10323 => 'uni2853',\n    10324 => 'uni2854',\n    10325 => 'uni2855',\n    10326 => 'uni2856',\n    10327 => 'uni2857',\n    10328 => 'uni2858',\n    10329 => 'uni2859',\n    10330 => 'uni285A',\n    10331 => 'uni285B',\n    10332 => 'uni285C',\n    10333 => 'uni285D',\n    10334 => 'uni285E',\n    10335 => 'uni285F',\n    10336 => 'uni2860',\n    10337 => 'uni2861',\n    10338 => 'uni2862',\n    10339 => 'uni2863',\n    10340 => 'uni2864',\n    10341 => 'uni2865',\n    10342 => 'uni2866',\n    10343 => 'uni2867',\n    10344 => 'uni2868',\n    10345 => 'uni2869',\n    10346 => 'uni286A',\n    10347 => 'uni286B',\n    10348 => 'uni286C',\n    10349 => 'uni286D',\n    10350 => 'uni286E',\n    10351 => 'uni286F',\n    10352 => 'uni2870',\n    10353 => 'uni2871',\n    10354 => 'uni2872',\n    10355 => 'uni2873',\n    10356 => 'uni2874',\n    10357 => 'uni2875',\n    10358 => 'uni2876',\n    10359 => 'uni2877',\n    10360 => 'uni2878',\n    10361 => 'uni2879',\n    10362 => 'uni287A',\n    10363 => 'uni287B',\n    10364 => 'uni287C',\n    10365 => 'uni287D',\n    10366 => 'uni287E',\n    10367 => 'uni287F',\n    10368 => 'uni2880',\n    10369 => 'uni2881',\n    10370 => 'uni2882',\n    10371 => 'uni2883',\n    10372 => 'uni2884',\n    10373 => 'uni2885',\n    10374 => 'uni2886',\n    10375 => 'uni2887',\n    10376 => 'uni2888',\n    10377 => 'uni2889',\n    10378 => 'uni288A',\n    10379 => 'uni288B',\n    10380 => 'uni288C',\n    10381 => 'uni288D',\n    10382 => 'uni288E',\n    10383 => 'uni288F',\n    10384 => 'uni2890',\n    10385 => 'uni2891',\n    10386 => 'uni2892',\n    10387 => 'uni2893',\n    10388 => 'uni2894',\n    10389 => 'uni2895',\n    10390 => 'uni2896',\n    10391 => 'uni2897',\n    10392 => 'uni2898',\n    10393 => 'uni2899',\n    10394 => 'uni289A',\n    10395 => 'uni289B',\n    10396 => 'uni289C',\n    10397 => 'uni289D',\n    10398 => 'uni289E',\n    10399 => 'uni289F',\n    10400 => 'uni28A0',\n    10401 => 'uni28A1',\n    10402 => 'uni28A2',\n    10403 => 'uni28A3',\n    10404 => 'uni28A4',\n    10405 => 'uni28A5',\n    10406 => 'uni28A6',\n    10407 => 'uni28A7',\n    10408 => 'uni28A8',\n    10409 => 'uni28A9',\n    10410 => 'uni28AA',\n    10411 => 'uni28AB',\n    10412 => 'uni28AC',\n    10413 => 'uni28AD',\n    10414 => 'uni28AE',\n    10415 => 'uni28AF',\n    10416 => 'uni28B0',\n    10417 => 'uni28B1',\n    10418 => 'uni28B2',\n    10419 => 'uni28B3',\n    10420 => 'uni28B4',\n    10421 => 'uni28B5',\n    10422 => 'uni28B6',\n    10423 => 'uni28B7',\n    10424 => 'uni28B8',\n    10425 => 'uni28B9',\n    10426 => 'uni28BA',\n    10427 => 'uni28BB',\n    10428 => 'uni28BC',\n    10429 => 'uni28BD',\n    10430 => 'uni28BE',\n    10431 => 'uni28BF',\n    10432 => 'uni28C0',\n    10433 => 'uni28C1',\n    10434 => 'uni28C2',\n    10435 => 'uni28C3',\n    10436 => 'uni28C4',\n    10437 => 'uni28C5',\n    10438 => 'uni28C6',\n    10439 => 'uni28C7',\n    10440 => 'uni28C8',\n    10441 => 'uni28C9',\n    10442 => 'uni28CA',\n    10443 => 'uni28CB',\n    10444 => 'uni28CC',\n    10445 => 'uni28CD',\n    10446 => 'uni28CE',\n    10447 => 'uni28CF',\n    10448 => 'uni28D0',\n    10449 => 'uni28D1',\n    10450 => 'uni28D2',\n    10451 => 'uni28D3',\n    10452 => 'uni28D4',\n    10453 => 'uni28D5',\n    10454 => 'uni28D6',\n    10455 => 'uni28D7',\n    10456 => 'uni28D8',\n    10457 => 'uni28D9',\n    10458 => 'uni28DA',\n    10459 => 'uni28DB',\n    10460 => 'uni28DC',\n    10461 => 'uni28DD',\n    10462 => 'uni28DE',\n    10463 => 'uni28DF',\n    10464 => 'uni28E0',\n    10465 => 'uni28E1',\n    10466 => 'uni28E2',\n    10467 => 'uni28E3',\n    10468 => 'uni28E4',\n    10469 => 'uni28E5',\n    10470 => 'uni28E6',\n    10471 => 'uni28E7',\n    10472 => 'uni28E8',\n    10473 => 'uni28E9',\n    10474 => 'uni28EA',\n    10475 => 'uni28EB',\n    10476 => 'uni28EC',\n    10477 => 'uni28ED',\n    10478 => 'uni28EE',\n    10479 => 'uni28EF',\n    10480 => 'uni28F0',\n    10481 => 'uni28F1',\n    10482 => 'uni28F2',\n    10483 => 'uni28F3',\n    10484 => 'uni28F4',\n    10485 => 'uni28F5',\n    10486 => 'uni28F6',\n    10487 => 'uni28F7',\n    10488 => 'uni28F8',\n    10489 => 'uni28F9',\n    10490 => 'uni28FA',\n    10491 => 'uni28FB',\n    10492 => 'uni28FC',\n    10493 => 'uni28FD',\n    10494 => 'uni28FE',\n    10495 => 'uni28FF',\n    10502 => 'uni2906',\n    10503 => 'uni2907',\n    10506 => 'uni290A',\n    10507 => 'uni290B',\n    10560 => 'uni2940',\n    10561 => 'uni2941',\n    10627 => 'uni2983',\n    10628 => 'uni2984',\n    10702 => 'uni29CE',\n    10703 => 'uni29CF',\n    10704 => 'uni29D0',\n    10705 => 'uni29D1',\n    10706 => 'uni29D2',\n    10707 => 'uni29D3',\n    10708 => 'uni29D4',\n    10709 => 'uni29D5',\n    10731 => 'uni29EB',\n    10746 => 'uni29FA',\n    10747 => 'uni29FB',\n    10752 => 'uni2A00',\n    10753 => 'uni2A01',\n    10754 => 'uni2A02',\n    10764 => 'uni2A0C',\n    10765 => 'uni2A0D',\n    10766 => 'uni2A0E',\n    10767 => 'uni2A0F',\n    10768 => 'uni2A10',\n    10769 => 'uni2A11',\n    10770 => 'uni2A12',\n    10771 => 'uni2A13',\n    10772 => 'uni2A14',\n    10773 => 'uni2A15',\n    10774 => 'uni2A16',\n    10775 => 'uni2A17',\n    10776 => 'uni2A18',\n    10777 => 'uni2A19',\n    10778 => 'uni2A1A',\n    10779 => 'uni2A1B',\n    10780 => 'uni2A1C',\n    10799 => 'uni2A2F',\n    10858 => 'uni2A6A',\n    10859 => 'uni2A6B',\n    10877 => 'uni2A7D',\n    10878 => 'uni2A7E',\n    10879 => 'uni2A7F',\n    10880 => 'uni2A80',\n    10881 => 'uni2A81',\n    10882 => 'uni2A82',\n    10883 => 'uni2A83',\n    10884 => 'uni2A84',\n    10885 => 'uni2A85',\n    10886 => 'uni2A86',\n    10887 => 'uni2A87',\n    10888 => 'uni2A88',\n    10889 => 'uni2A89',\n    10890 => 'uni2A8A',\n    10891 => 'uni2A8B',\n    10892 => 'uni2A8C',\n    10893 => 'uni2A8D',\n    10894 => 'uni2A8E',\n    10895 => 'uni2A8F',\n    10896 => 'uni2A90',\n    10897 => 'uni2A91',\n    10898 => 'uni2A92',\n    10899 => 'uni2A93',\n    10900 => 'uni2A94',\n    10901 => 'uni2A95',\n    10902 => 'uni2A96',\n    10903 => 'uni2A97',\n    10904 => 'uni2A98',\n    10905 => 'uni2A99',\n    10906 => 'uni2A9A',\n    10907 => 'uni2A9B',\n    10908 => 'uni2A9C',\n    10909 => 'uni2A9D',\n    10910 => 'uni2A9E',\n    10911 => 'uni2A9F',\n    10912 => 'uni2AA0',\n    10926 => 'uni2AAE',\n    10927 => 'uni2AAF',\n    10928 => 'uni2AB0',\n    10929 => 'uni2AB1',\n    10930 => 'uni2AB2',\n    10931 => 'uni2AB3',\n    10932 => 'uni2AB4',\n    10933 => 'uni2AB5',\n    10934 => 'uni2AB6',\n    10935 => 'uni2AB7',\n    10936 => 'uni2AB8',\n    10937 => 'uni2AB9',\n    10938 => 'uni2ABA',\n    11001 => 'uni2AF9',\n    11002 => 'uni2AFA',\n    11008 => 'uni2B00',\n    11009 => 'uni2B01',\n    11010 => 'uni2B02',\n    11011 => 'uni2B03',\n    11012 => 'uni2B04',\n    11013 => 'uni2B05',\n    11014 => 'uni2B06',\n    11015 => 'uni2B07',\n    11016 => 'uni2B08',\n    11017 => 'uni2B09',\n    11018 => 'uni2B0A',\n    11019 => 'uni2B0B',\n    11020 => 'uni2B0C',\n    11021 => 'uni2B0D',\n    11022 => 'uni2B0E',\n    11023 => 'uni2B0F',\n    11024 => 'uni2B10',\n    11025 => 'uni2B11',\n    11026 => 'uni2B12',\n    11027 => 'uni2B13',\n    11028 => 'uni2B14',\n    11029 => 'uni2B15',\n    11030 => 'uni2B16',\n    11031 => 'uni2B17',\n    11032 => 'uni2B18',\n    11033 => 'uni2B19',\n    11034 => 'uni2B1A',\n    11039 => 'uni2B1F',\n    11040 => 'uni2B20',\n    11041 => 'uni2B21',\n    11042 => 'uni2B22',\n    11043 => 'uni2B23',\n    11044 => 'uni2B24',\n    11091 => 'uni2B53',\n    11092 => 'uni2B54',\n    11360 => 'uni2C60',\n    11361 => 'uni2C61',\n    11362 => 'uni2C62',\n    11363 => 'uni2C63',\n    11364 => 'uni2C64',\n    11365 => 'uni2C65',\n    11366 => 'uni2C66',\n    11367 => 'uni2C67',\n    11368 => 'uni2C68',\n    11369 => 'uni2C69',\n    11370 => 'uni2C6A',\n    11371 => 'uni2C6B',\n    11372 => 'uni2C6C',\n    11373 => 'uni2C6D',\n    11374 => 'uni2C6E',\n    11375 => 'uni2C6F',\n    11376 => 'uni2C70',\n    11377 => 'uni2C71',\n    11378 => 'uni2C72',\n    11379 => 'uni2C73',\n    11380 => 'uni2C74',\n    11381 => 'uni2C75',\n    11382 => 'uni2C76',\n    11383 => 'uni2C77',\n    11385 => 'uni2C79',\n    11386 => 'uni2C7A',\n    11387 => 'uni2C7B',\n    11388 => 'uni2C7C',\n    11389 => 'uni2C7D',\n    11390 => 'uni2C7E',\n    11391 => 'uni2C7F',\n    11520 => 'uni2D00',\n    11521 => 'uni2D01',\n    11522 => 'uni2D02',\n    11523 => 'uni2D03',\n    11524 => 'uni2D04',\n    11525 => 'uni2D05',\n    11526 => 'uni2D06',\n    11527 => 'uni2D07',\n    11528 => 'uni2D08',\n    11529 => 'uni2D09',\n    11530 => 'uni2D0A',\n    11531 => 'uni2D0B',\n    11532 => 'uni2D0C',\n    11533 => 'uni2D0D',\n    11534 => 'uni2D0E',\n    11535 => 'uni2D0F',\n    11536 => 'uni2D10',\n    11537 => 'uni2D11',\n    11538 => 'uni2D12',\n    11539 => 'uni2D13',\n    11540 => 'uni2D14',\n    11541 => 'uni2D15',\n    11542 => 'uni2D16',\n    11543 => 'uni2D17',\n    11544 => 'uni2D18',\n    11545 => 'uni2D19',\n    11546 => 'uni2D1A',\n    11547 => 'uni2D1B',\n    11548 => 'uni2D1C',\n    11549 => 'uni2D1D',\n    11550 => 'uni2D1E',\n    11551 => 'uni2D1F',\n    11552 => 'uni2D20',\n    11553 => 'uni2D21',\n    11554 => 'uni2D22',\n    11555 => 'uni2D23',\n    11556 => 'uni2D24',\n    11557 => 'uni2D25',\n    11568 => 'uni2D30',\n    11569 => 'uni2D31',\n    11570 => 'uni2D32',\n    11571 => 'uni2D33',\n    11572 => 'uni2D34',\n    11573 => 'uni2D35',\n    11574 => 'uni2D36',\n    11575 => 'uni2D37',\n    11576 => 'uni2D38',\n    11577 => 'uni2D39',\n    11578 => 'uni2D3A',\n    11579 => 'uni2D3B',\n    11580 => 'uni2D3C',\n    11581 => 'uni2D3D',\n    11582 => 'uni2D3E',\n    11583 => 'uni2D3F',\n    11584 => 'uni2D40',\n    11585 => 'uni2D41',\n    11586 => 'uni2D42',\n    11587 => 'uni2D43',\n    11588 => 'uni2D44',\n    11589 => 'uni2D45',\n    11590 => 'uni2D46',\n    11591 => 'uni2D47',\n    11592 => 'uni2D48',\n    11593 => 'uni2D49',\n    11594 => 'uni2D4A',\n    11595 => 'uni2D4B',\n    11596 => 'uni2D4C',\n    11597 => 'uni2D4D',\n    11598 => 'uni2D4E',\n    11599 => 'uni2D4F',\n    11600 => 'uni2D50',\n    11601 => 'uni2D51',\n    11602 => 'uni2D52',\n    11603 => 'uni2D53',\n    11604 => 'uni2D54',\n    11605 => 'uni2D55',\n    11606 => 'uni2D56',\n    11607 => 'uni2D57',\n    11608 => 'uni2D58',\n    11609 => 'uni2D59',\n    11610 => 'uni2D5A',\n    11611 => 'uni2D5B',\n    11612 => 'uni2D5C',\n    11613 => 'uni2D5D',\n    11614 => 'uni2D5E',\n    11615 => 'uni2D5F',\n    11616 => 'uni2D60',\n    11617 => 'uni2D61',\n    11618 => 'uni2D62',\n    11619 => 'uni2D63',\n    11620 => 'uni2D64',\n    11621 => 'uni2D65',\n    11631 => 'uni2D6F',\n    11800 => 'uni2E18',\n    11807 => 'uni2E1F',\n    11810 => 'uni2E22',\n    11811 => 'uni2E23',\n    11812 => 'uni2E24',\n    11813 => 'uni2E25',\n    11822 => 'uni2E2E',\n    19904 => 'uni4DC0',\n    19905 => 'uni4DC1',\n    19906 => 'uni4DC2',\n    19907 => 'uni4DC3',\n    19908 => 'uni4DC4',\n    19909 => 'uni4DC5',\n    19910 => 'uni4DC6',\n    19911 => 'uni4DC7',\n    19912 => 'uni4DC8',\n    19913 => 'uni4DC9',\n    19914 => 'uni4DCA',\n    19915 => 'uni4DCB',\n    19916 => 'uni4DCC',\n    19917 => 'uni4DCD',\n    19918 => 'uni4DCE',\n    19919 => 'uni4DCF',\n    19920 => 'uni4DD0',\n    19921 => 'uni4DD1',\n    19922 => 'uni4DD2',\n    19923 => 'uni4DD3',\n    19924 => 'uni4DD4',\n    19925 => 'uni4DD5',\n    19926 => 'uni4DD6',\n    19927 => 'uni4DD7',\n    19928 => 'uni4DD8',\n    19929 => 'uni4DD9',\n    19930 => 'uni4DDA',\n    19931 => 'uni4DDB',\n    19932 => 'uni4DDC',\n    19933 => 'uni4DDD',\n    19934 => 'uni4DDE',\n    19935 => 'uni4DDF',\n    19936 => 'uni4DE0',\n    19937 => 'uni4DE1',\n    19938 => 'uni4DE2',\n    19939 => 'uni4DE3',\n    19940 => 'uni4DE4',\n    19941 => 'uni4DE5',\n    19942 => 'uni4DE6',\n    19943 => 'uni4DE7',\n    19944 => 'uni4DE8',\n    19945 => 'uni4DE9',\n    19946 => 'uni4DEA',\n    19947 => 'uni4DEB',\n    19948 => 'uni4DEC',\n    19949 => 'uni4DED',\n    19950 => 'uni4DEE',\n    19951 => 'uni4DEF',\n    19952 => 'uni4DF0',\n    19953 => 'uni4DF1',\n    19954 => 'uni4DF2',\n    19955 => 'uni4DF3',\n    19956 => 'uni4DF4',\n    19957 => 'uni4DF5',\n    19958 => 'uni4DF6',\n    19959 => 'uni4DF7',\n    19960 => 'uni4DF8',\n    19961 => 'uni4DF9',\n    19962 => 'uni4DFA',\n    19963 => 'uni4DFB',\n    19964 => 'uni4DFC',\n    19965 => 'uni4DFD',\n    19966 => 'uni4DFE',\n    19967 => 'uni4DFF',\n    42192 => 'uniA4D0',\n    42193 => 'uniA4D1',\n    42194 => 'uniA4D2',\n    42195 => 'uniA4D3',\n    42196 => 'uniA4D4',\n    42197 => 'uniA4D5',\n    42198 => 'uniA4D6',\n    42199 => 'uniA4D7',\n    42200 => 'uniA4D8',\n    42201 => 'uniA4D9',\n    42202 => 'uniA4DA',\n    42203 => 'uniA4DB',\n    42204 => 'uniA4DC',\n    42205 => 'uniA4DD',\n    42206 => 'uniA4DE',\n    42207 => 'uniA4DF',\n    42208 => 'uniA4E0',\n    42209 => 'uniA4E1',\n    42210 => 'uniA4E2',\n    42211 => 'uniA4E3',\n    42212 => 'uniA4E4',\n    42213 => 'uniA4E5',\n    42214 => 'uniA4E6',\n    42215 => 'uniA4E7',\n    42216 => 'uniA4E8',\n    42217 => 'uniA4E9',\n    42218 => 'uniA4EA',\n    42219 => 'uniA4EB',\n    42220 => 'uniA4EC',\n    42221 => 'uniA4ED',\n    42222 => 'uniA4EE',\n    42223 => 'uniA4EF',\n    42224 => 'uniA4F0',\n    42225 => 'uniA4F1',\n    42226 => 'uniA4F2',\n    42227 => 'uniA4F3',\n    42228 => 'uniA4F4',\n    42229 => 'uniA4F5',\n    42230 => 'uniA4F6',\n    42231 => 'uniA4F7',\n    42232 => 'uniA4F8',\n    42233 => 'uniA4F9',\n    42234 => 'uniA4FA',\n    42235 => 'uniA4FB',\n    42236 => 'uniA4FC',\n    42237 => 'uniA4FD',\n    42238 => 'uniA4FE',\n    42239 => 'uniA4FF',\n    42564 => 'uniA644',\n    42565 => 'uniA645',\n    42566 => 'uniA646',\n    42567 => 'uniA647',\n    42572 => 'uniA64C',\n    42573 => 'uniA64D',\n    42576 => 'uniA650',\n    42577 => 'uniA651',\n    42580 => 'uniA654',\n    42581 => 'uniA655',\n    42582 => 'uniA656',\n    42583 => 'uniA657',\n    42594 => 'uniA662',\n    42595 => 'uniA663',\n    42596 => 'uniA664',\n    42597 => 'uniA665',\n    42598 => 'uniA666',\n    42599 => 'uniA667',\n    42600 => 'uniA668',\n    42601 => 'uniA669',\n    42602 => 'uniA66A',\n    42603 => 'uniA66B',\n    42604 => 'uniA66C',\n    42605 => 'uniA66D',\n    42606 => 'uniA66E',\n    42634 => 'uniA68A',\n    42635 => 'uniA68B',\n    42636 => 'uniA68C',\n    42637 => 'uniA68D',\n    42644 => 'uniA694',\n    42645 => 'uniA695',\n    42648 => 'uniA698',\n    42649 => 'uniA699',\n    42760 => 'uniA708',\n    42761 => 'uniA709',\n    42762 => 'uniA70A',\n    42763 => 'uniA70B',\n    42764 => 'uniA70C',\n    42765 => 'uniA70D',\n    42766 => 'uniA70E',\n    42767 => 'uniA70F',\n    42768 => 'uniA710',\n    42769 => 'uniA711',\n    42770 => 'uniA712',\n    42771 => 'uniA713',\n    42772 => 'uniA714',\n    42773 => 'uniA715',\n    42774 => 'uniA716',\n    42779 => 'uniA71B',\n    42780 => 'uniA71C',\n    42781 => 'uniA71D',\n    42782 => 'uniA71E',\n    42783 => 'uniA71F',\n    42786 => 'uniA722',\n    42787 => 'uniA723',\n    42788 => 'uniA724',\n    42789 => 'uniA725',\n    42790 => 'uniA726',\n    42791 => 'uniA727',\n    42792 => 'uniA728',\n    42793 => 'uniA729',\n    42794 => 'uniA72A',\n    42795 => 'uniA72B',\n    42800 => 'uniA730',\n    42801 => 'uniA731',\n    42802 => 'uniA732',\n    42803 => 'uniA733',\n    42804 => 'uniA734',\n    42805 => 'uniA735',\n    42806 => 'uniA736',\n    42807 => 'uniA737',\n    42808 => 'uniA738',\n    42809 => 'uniA739',\n    42810 => 'uniA73A',\n    42811 => 'uniA73B',\n    42812 => 'uniA73C',\n    42813 => 'uniA73D',\n    42814 => 'uniA73E',\n    42815 => 'uniA73F',\n    42816 => 'uniA740',\n    42817 => 'uniA741',\n    42822 => 'uniA746',\n    42823 => 'uniA747',\n    42824 => 'uniA748',\n    42825 => 'uniA749',\n    42826 => 'uniA74A',\n    42827 => 'uniA74B',\n    42830 => 'uniA74E',\n    42831 => 'uniA74F',\n    42832 => 'uniA750',\n    42833 => 'uniA751',\n    42834 => 'uniA752',\n    42835 => 'uniA753',\n    42838 => 'uniA756',\n    42839 => 'uniA757',\n    42852 => 'uniA764',\n    42853 => 'uniA765',\n    42854 => 'uniA766',\n    42855 => 'uniA767',\n    42880 => 'uniA780',\n    42881 => 'uniA781',\n    42882 => 'uniA782',\n    42883 => 'uniA783',\n    42889 => 'uniA789',\n    42890 => 'uniA78A',\n    42891 => 'uniA78B',\n    42892 => 'uniA78C',\n    42893 => 'uniA78D',\n    42894 => 'uniA78E',\n    42896 => 'uniA790',\n    42897 => 'uniA791',\n    42912 => 'uniA7A0',\n    42913 => 'uniA7A1',\n    42914 => 'uniA7A2',\n    42915 => 'uniA7A3',\n    42916 => 'uniA7A4',\n    42917 => 'uniA7A5',\n    42918 => 'uniA7A6',\n    42919 => 'uniA7A7',\n    42920 => 'uniA7A8',\n    42921 => 'uniA7A9',\n    42922 => 'uniA7AA',\n    43000 => 'uniA7F8',\n    43001 => 'uniA7F9',\n    43002 => 'uniA7FA',\n    43003 => 'uniA7FB',\n    43004 => 'uniA7FC',\n    43005 => 'uniA7FD',\n    43006 => 'uniA7FE',\n    43007 => 'uniA7FF',\n    61184 => 'uni02E5.5',\n    61185 => 'uni02E6.5',\n    61186 => 'uni02E7.5',\n    61187 => 'uni02E8.5',\n    61188 => 'uni02E9.5',\n    61189 => 'uni02E5.4',\n    61190 => 'uni02E6.4',\n    61191 => 'uni02E7.4',\n    61192 => 'uni02E8.4',\n    61193 => 'uni02E9.4',\n    61194 => 'uni02E5.3',\n    61195 => 'uni02E6.3',\n    61196 => 'uni02E7.3',\n    61197 => 'uni02E8.3',\n    61198 => 'uni02E9.3',\n    61199 => 'uni02E5.2',\n    61200 => 'uni02E6.2',\n    61201 => 'uni02E7.2',\n    61202 => 'uni02E8.2',\n    61203 => 'uni02E9.2',\n    61204 => 'uni02E5.1',\n    61205 => 'uni02E6.1',\n    61206 => 'uni02E7.1',\n    61207 => 'uni02E8.1',\n    61208 => 'uni02E9.1',\n    61209 => 'stem',\n    61440 => 'uniF000',\n    61441 => 'uniF001',\n    61442 => 'uniF002',\n    61443 => 'uniF003',\n    62464 => 'uniF400',\n    62465 => 'uniF401',\n    62466 => 'uniF402',\n    62467 => 'uniF403',\n    62468 => 'uniF404',\n    62469 => 'uniF405',\n    62470 => 'uniF406',\n    62471 => 'uniF407',\n    62472 => 'uniF408',\n    62473 => 'uniF409',\n    62474 => 'uniF40A',\n    62475 => 'uniF40B',\n    62476 => 'uniF40C',\n    62477 => 'uniF40D',\n    62478 => 'uniF40E',\n    62479 => 'uniF40F',\n    62480 => 'uniF410',\n    62481 => 'uniF411',\n    62482 => 'uniF412',\n    62483 => 'uniF413',\n    62484 => 'uniF414',\n    62485 => 'uniF415',\n    62486 => 'uniF416',\n    62487 => 'uniF417',\n    62488 => 'uniF418',\n    62489 => 'uniF419',\n    62490 => 'uniF41A',\n    62491 => 'uniF41B',\n    62492 => 'uniF41C',\n    62493 => 'uniF41D',\n    62494 => 'uniF41E',\n    62495 => 'uniF41F',\n    62496 => 'uniF420',\n    62497 => 'uniF421',\n    62498 => 'uniF422',\n    62499 => 'uniF423',\n    62500 => 'uniF424',\n    62501 => 'uniF425',\n    62502 => 'uniF426',\n    62504 => 'uniF428',\n    62505 => 'uniF429',\n    62506 => 'uniF42A',\n    62507 => 'uniF42B',\n    62508 => 'uniF42C',\n    62509 => 'uniF42D',\n    62510 => 'uniF42E',\n    62511 => 'uniF42F',\n    62512 => 'uniF430',\n    62513 => 'uniF431',\n    62514 => 'uniF432',\n    62515 => 'uniF433',\n    62516 => 'uniF434',\n    62517 => 'uniF435',\n    62518 => 'uniF436',\n    62519 => 'uniF437',\n    62520 => 'uniF438',\n    62521 => 'uniF439',\n    62522 => 'uniF43A',\n    62523 => 'uniF43B',\n    62524 => 'uniF43C',\n    62525 => 'uniF43D',\n    62526 => 'uniF43E',\n    62527 => 'uniF43F',\n    62528 => 'uniF440',\n    62529 => 'uniF441',\n    63173 => 'uniF6C5',\n    64256 => 'uniFB00',\n    64257 => 'fi',\n    64258 => 'fl',\n    64259 => 'uniFB03',\n    64260 => 'uniFB04',\n    64261 => 'uniFB05',\n    64262 => 'uniFB06',\n    64275 => 'uniFB13',\n    64276 => 'uniFB14',\n    64277 => 'uniFB15',\n    64278 => 'uniFB16',\n    64279 => 'uniFB17',\n    64285 => 'uniFB1D',\n    64286 => 'uniFB1E',\n    64287 => 'uniFB1F',\n    64288 => 'uniFB20',\n    64289 => 'uniFB21',\n    64290 => 'uniFB22',\n    64291 => 'uniFB23',\n    64292 => 'uniFB24',\n    64293 => 'uniFB25',\n    64294 => 'uniFB26',\n    64295 => 'uniFB27',\n    64296 => 'uniFB28',\n    64297 => 'uniFB29',\n    64298 => 'uniFB2A',\n    64299 => 'uniFB2B',\n    64300 => 'uniFB2C',\n    64301 => 'uniFB2D',\n    64302 => 'uniFB2E',\n    64303 => 'uniFB2F',\n    64304 => 'uniFB30',\n    64305 => 'uniFB31',\n    64306 => 'uniFB32',\n    64307 => 'uniFB33',\n    64308 => 'uniFB34',\n    64309 => 'uniFB35',\n    64310 => 'uniFB36',\n    64312 => 'uniFB38',\n    64313 => 'uniFB39',\n    64314 => 'uniFB3A',\n    64315 => 'uniFB3B',\n    64316 => 'uniFB3C',\n    64318 => 'uniFB3E',\n    64320 => 'uniFB40',\n    64321 => 'uniFB41',\n    64323 => 'uniFB43',\n    64324 => 'uniFB44',\n    64326 => 'uniFB46',\n    64327 => 'uniFB47',\n    64328 => 'uniFB48',\n    64329 => 'uniFB49',\n    64330 => 'uniFB4A',\n    64331 => 'uniFB4B',\n    64332 => 'uniFB4C',\n    64333 => 'uniFB4D',\n    64334 => 'uniFB4E',\n    64335 => 'uniFB4F',\n    64338 => 'uniFB52',\n    64339 => 'uniFB53',\n    64340 => 'uniFB54',\n    64341 => 'uniFB55',\n    64342 => 'uniFB56',\n    64343 => 'uniFB57',\n    64344 => 'uniFB58',\n    64345 => 'uniFB59',\n    64346 => 'uniFB5A',\n    64347 => 'uniFB5B',\n    64348 => 'uniFB5C',\n    64349 => 'uniFB5D',\n    64350 => 'uniFB5E',\n    64351 => 'uniFB5F',\n    64352 => 'uniFB60',\n    64353 => 'uniFB61',\n    64354 => 'uniFB62',\n    64355 => 'uniFB63',\n    64356 => 'uniFB64',\n    64357 => 'uniFB65',\n    64358 => 'uniFB66',\n    64359 => 'uniFB67',\n    64360 => 'uniFB68',\n    64361 => 'uniFB69',\n    64362 => 'uniFB6A',\n    64363 => 'uniFB6B',\n    64364 => 'uniFB6C',\n    64365 => 'uniFB6D',\n    64366 => 'uniFB6E',\n    64367 => 'uniFB6F',\n    64368 => 'uniFB70',\n    64369 => 'uniFB71',\n    64370 => 'uniFB72',\n    64371 => 'uniFB73',\n    64372 => 'uniFB74',\n    64373 => 'uniFB75',\n    64374 => 'uniFB76',\n    64375 => 'uniFB77',\n    64376 => 'uniFB78',\n    64377 => 'uniFB79',\n    64378 => 'uniFB7A',\n    64379 => 'uniFB7B',\n    64380 => 'uniFB7C',\n    64381 => 'uniFB7D',\n    64382 => 'uniFB7E',\n    64383 => 'uniFB7F',\n    64384 => 'uniFB80',\n    64385 => 'uniFB81',\n    64386 => 'uniFB82',\n    64387 => 'uniFB83',\n    64388 => 'uniFB84',\n    64389 => 'uniFB85',\n    64390 => 'uniFB86',\n    64391 => 'uniFB87',\n    64392 => 'uniFB88',\n    64393 => 'uniFB89',\n    64394 => 'uniFB8A',\n    64395 => 'uniFB8B',\n    64396 => 'uniFB8C',\n    64397 => 'uniFB8D',\n    64398 => 'uniFB8E',\n    64399 => 'uniFB8F',\n    64400 => 'uniFB90',\n    64401 => 'uniFB91',\n    64402 => 'uniFB92',\n    64403 => 'uniFB93',\n    64404 => 'uniFB94',\n    64405 => 'uniFB95',\n    64406 => 'uniFB96',\n    64407 => 'uniFB97',\n    64408 => 'uniFB98',\n    64409 => 'uniFB99',\n    64410 => 'uniFB9A',\n    64411 => 'uniFB9B',\n    64412 => 'uniFB9C',\n    64413 => 'uniFB9D',\n    64414 => 'uniFB9E',\n    64415 => 'uniFB9F',\n    64416 => 'uniFBA0',\n    64417 => 'uniFBA1',\n    64418 => 'uniFBA2',\n    64419 => 'uniFBA3',\n    64426 => 'uniFBAA',\n    64427 => 'uniFBAB',\n    64428 => 'uniFBAC',\n    64429 => 'uniFBAD',\n    64467 => 'uniFBD3',\n    64468 => 'uniFBD4',\n    64469 => 'uniFBD5',\n    64470 => 'uniFBD6',\n    64471 => 'uniFBD7',\n    64472 => 'uniFBD8',\n    64473 => 'uniFBD9',\n    64474 => 'uniFBDA',\n    64475 => 'uniFBDB',\n    64476 => 'uniFBDC',\n    64478 => 'uniFBDE',\n    64479 => 'uniFBDF',\n    64484 => 'uniFBE4',\n    64485 => 'uniFBE5',\n    64486 => 'uniFBE6',\n    64487 => 'uniFBE7',\n    64488 => 'uniFBE8',\n    64489 => 'uniFBE9',\n    64508 => 'uniFBFC',\n    64509 => 'uniFBFD',\n    64510 => 'uniFBFE',\n    64511 => 'uniFBFF',\n    65024 => 'uniFE00',\n    65025 => 'uniFE01',\n    65026 => 'uniFE02',\n    65027 => 'uniFE03',\n    65028 => 'uniFE04',\n    65029 => 'uniFE05',\n    65030 => 'uniFE06',\n    65031 => 'uniFE07',\n    65032 => 'uniFE08',\n    65033 => 'uniFE09',\n    65034 => 'uniFE0A',\n    65035 => 'uniFE0B',\n    65036 => 'uniFE0C',\n    65037 => 'uniFE0D',\n    65038 => 'uniFE0E',\n    65039 => 'uniFE0F',\n    65056 => 'uniFE20',\n    65057 => 'uniFE21',\n    65058 => 'uniFE22',\n    65059 => 'uniFE23',\n    65136 => 'uniFE70',\n    65137 => 'uniFE71',\n    65138 => 'uniFE72',\n    65139 => 'uniFE73',\n    65140 => 'uniFE74',\n    65142 => 'uniFE76',\n    65143 => 'uniFE77',\n    65144 => 'uniFE78',\n    65145 => 'uniFE79',\n    65146 => 'uniFE7A',\n    65147 => 'uniFE7B',\n    65148 => 'uniFE7C',\n    65149 => 'uniFE7D',\n    65150 => 'uniFE7E',\n    65151 => 'uniFE7F',\n    65152 => 'uniFE80',\n    65153 => 'uniFE81',\n    65154 => 'uniFE82',\n    65155 => 'uniFE83',\n    65156 => 'uniFE84',\n    65157 => 'uniFE85',\n    65158 => 'uniFE86',\n    65159 => 'uniFE87',\n    65160 => 'uniFE88',\n    65161 => 'uniFE89',\n    65162 => 'uniFE8A',\n    65163 => 'uniFE8B',\n    65164 => 'uniFE8C',\n    65165 => 'uniFE8D',\n    65166 => 'uniFE8E',\n    65167 => 'uniFE8F',\n    65168 => 'uniFE90',\n    65169 => 'uniFE91',\n    65170 => 'uniFE92',\n    65171 => 'uniFE93',\n    65172 => 'uniFE94',\n    65173 => 'uniFE95',\n    65174 => 'uniFE96',\n    65175 => 'uniFE97',\n    65176 => 'uniFE98',\n    65177 => 'uniFE99',\n    65178 => 'uniFE9A',\n    65179 => 'uniFE9B',\n    65180 => 'uniFE9C',\n    65181 => 'uniFE9D',\n    65182 => 'uniFE9E',\n    65183 => 'uniFE9F',\n    65184 => 'uniFEA0',\n    65185 => 'uniFEA1',\n    65186 => 'uniFEA2',\n    65187 => 'uniFEA3',\n    65188 => 'uniFEA4',\n    65189 => 'uniFEA5',\n    65190 => 'uniFEA6',\n    65191 => 'uniFEA7',\n    65192 => 'uniFEA8',\n    65193 => 'uniFEA9',\n    65194 => 'uniFEAA',\n    65195 => 'uniFEAB',\n    65196 => 'uniFEAC',\n    65197 => 'uniFEAD',\n    65198 => 'uniFEAE',\n    65199 => 'uniFEAF',\n    65200 => 'uniFEB0',\n    65201 => 'uniFEB1',\n    65202 => 'uniFEB2',\n    65203 => 'uniFEB3',\n    65204 => 'uniFEB4',\n    65205 => 'uniFEB5',\n    65206 => 'uniFEB6',\n    65207 => 'uniFEB7',\n    65208 => 'uniFEB8',\n    65209 => 'uniFEB9',\n    65210 => 'uniFEBA',\n    65211 => 'uniFEBB',\n    65212 => 'uniFEBC',\n    65213 => 'uniFEBD',\n    65214 => 'uniFEBE',\n    65215 => 'uniFEBF',\n    65216 => 'uniFEC0',\n    65217 => 'uniFEC1',\n    65218 => 'uniFEC2',\n    65219 => 'uniFEC3',\n    65220 => 'uniFEC4',\n    65221 => 'uniFEC5',\n    65222 => 'uniFEC6',\n    65223 => 'uniFEC7',\n    65224 => 'uniFEC8',\n    65225 => 'uniFEC9',\n    65226 => 'uniFECA',\n    65227 => 'uniFECB',\n    65228 => 'uniFECC',\n    65229 => 'uniFECD',\n    65230 => 'uniFECE',\n    65231 => 'uniFECF',\n    65232 => 'uniFED0',\n    65233 => 'uniFED1',\n    65234 => 'uniFED2',\n    65235 => 'uniFED3',\n    65236 => 'uniFED4',\n    65237 => 'uniFED5',\n    65238 => 'uniFED6',\n    65239 => 'uniFED7',\n    65240 => 'uniFED8',\n    65241 => 'uniFED9',\n    65242 => 'uniFEDA',\n    65243 => 'uniFEDB',\n    65244 => 'uniFEDC',\n    65245 => 'uniFEDD',\n    65246 => 'uniFEDE',\n    65247 => 'uniFEDF',\n    65248 => 'uniFEE0',\n    65249 => 'uniFEE1',\n    65250 => 'uniFEE2',\n    65251 => 'uniFEE3',\n    65252 => 'uniFEE4',\n    65253 => 'uniFEE5',\n    65254 => 'uniFEE6',\n    65255 => 'uniFEE7',\n    65256 => 'uniFEE8',\n    65257 => 'uniFEE9',\n    65258 => 'uniFEEA',\n    65259 => 'uniFEEB',\n    65260 => 'uniFEEC',\n    65261 => 'uniFEED',\n    65262 => 'uniFEEE',\n    65263 => 'uniFEEF',\n    65264 => 'uniFEF0',\n    65265 => 'uniFEF1',\n    65266 => 'uniFEF2',\n    65267 => 'uniFEF3',\n    65268 => 'uniFEF4',\n    65269 => 'uniFEF5',\n    65270 => 'uniFEF6',\n    65271 => 'uniFEF7',\n    65272 => 'uniFEF8',\n    65273 => 'uniFEF9',\n    65274 => 'uniFEFA',\n    65275 => 'uniFEFB',\n    65276 => 'uniFEFC',\n    65279 => 'uniFEFF',\n    65529 => 'uniFFF9',\n    65530 => 'uniFFFA',\n    65531 => 'uniFFFB',\n    65532 => 'uniFFFC',\n    65533 => 'uniFFFD',\n  ),\n  'isUnicode' => true,\n  'EncodingScheme' => 'FontSpecific',\n  'FontName' => 'DejaVu Sans',\n  'FullName' => 'DejaVu Sans',\n  'Version' => 'Version 2.37',\n  'PostScriptName' => 'DejaVuSans',\n  'Weight' => 'Medium',\n  'ItalicAngle' => '0',\n  'IsFixedPitch' => 'false',\n  'UnderlineThickness' => '44',\n  'UnderlinePosition' => '-63',\n  'FontHeightOffset' => '0',\n  'Ascender' => '928',\n  'Descender' => '-236',\n  'FontBBox' => \n  array (\n    0 => '-1021',\n    1 => '-463',\n    2 => '1793',\n    3 => '1232',\n  ),\n  'StartCharMetrics' => '6253',\n  'C' => \n  array (\n    32 => 318.0,\n    33 => 401.0,\n    34 => 460.0,\n    35 => 838.0,\n    36 => 636.0,\n    37 => 950.0,\n    38 => 780.0,\n    39 => 275.0,\n    40 => 390.0,\n    41 => 390.0,\n    42 => 500.0,\n    43 => 838.0,\n    44 => 318.0,\n    45 => 361.0,\n    46 => 318.0,\n    47 => 337.0,\n    48 => 636.0,\n    49 => 636.0,\n    50 => 636.0,\n    51 => 636.0,\n    52 => 636.0,\n    53 => 636.0,\n    54 => 636.0,\n    55 => 636.0,\n    56 => 636.0,\n    57 => 636.0,\n    58 => 337.0,\n    59 => 337.0,\n    60 => 838.0,\n    61 => 838.0,\n    62 => 838.0,\n    63 => 531.0,\n    64 => 1000.0,\n    65 => 684.0,\n    66 => 686.0,\n    67 => 698.0,\n    68 => 770.0,\n    69 => 632.0,\n    70 => 575.0,\n    71 => 775.0,\n    72 => 752.0,\n    73 => 295.0,\n    74 => 295.0,\n    75 => 656.0,\n    76 => 557.0,\n    77 => 863.0,\n    78 => 748.0,\n    79 => 787.0,\n    80 => 603.0,\n    81 => 787.0,\n    82 => 695.0,\n    83 => 635.0,\n    84 => 611.0,\n    85 => 732.0,\n    86 => 684.0,\n    87 => 989.0,\n    88 => 685.0,\n    89 => 611.0,\n    90 => 685.0,\n    91 => 390.0,\n    92 => 337.0,\n    93 => 390.0,\n    94 => 838.0,\n    95 => 500.0,\n    96 => 500.0,\n    97 => 613.0,\n    98 => 635.0,\n    99 => 550.0,\n    100 => 635.0,\n    101 => 615.0,\n    102 => 352.0,\n    103 => 635.0,\n    104 => 634.0,\n    105 => 278.0,\n    106 => 278.0,\n    107 => 579.0,\n    108 => 278.0,\n    109 => 974.0,\n    110 => 634.0,\n    111 => 612.0,\n    112 => 635.0,\n    113 => 635.0,\n    114 => 411.0,\n    115 => 521.0,\n    116 => 392.0,\n    117 => 634.0,\n    118 => 592.0,\n    119 => 818.0,\n    120 => 592.0,\n    121 => 592.0,\n    122 => 525.0,\n    123 => 636.0,\n    124 => 337.0,\n    125 => 636.0,\n    126 => 838.0,\n    160 => 318.0,\n    161 => 401.0,\n    162 => 636.0,\n    163 => 636.0,\n    164 => 636.0,\n    165 => 636.0,\n    166 => 337.0,\n    167 => 500.0,\n    168 => 500.0,\n    169 => 1000.0,\n    170 => 471.0,\n    171 => 612.0,\n    172 => 838.0,\n    173 => 361.0,\n    174 => 1000.0,\n    175 => 500.0,\n    176 => 500.0,\n    177 => 838.0,\n    178 => 401.0,\n    179 => 401.0,\n    180 => 500.0,\n    181 => 636.0,\n    182 => 636.0,\n    183 => 318.0,\n    184 => 500.0,\n    185 => 401.0,\n    186 => 471.0,\n    187 => 612.0,\n    188 => 969.0,\n    189 => 969.0,\n    190 => 969.0,\n    191 => 531.0,\n    192 => 684.0,\n    193 => 684.0,\n    194 => 684.0,\n    195 => 684.0,\n    196 => 684.0,\n    197 => 684.0,\n    198 => 974.0,\n    199 => 698.0,\n    200 => 632.0,\n    201 => 632.0,\n    202 => 632.0,\n    203 => 632.0,\n    204 => 295.0,\n    205 => 295.0,\n    206 => 295.0,\n    207 => 295.0,\n    208 => 775.0,\n    209 => 748.0,\n    210 => 787.0,\n    211 => 787.0,\n    212 => 787.0,\n    213 => 787.0,\n    214 => 787.0,\n    215 => 838.0,\n    216 => 787.0,\n    217 => 732.0,\n    218 => 732.0,\n    219 => 732.0,\n    220 => 732.0,\n    221 => 611.0,\n    222 => 605.0,\n    223 => 630.0,\n    224 => 613.0,\n    225 => 613.0,\n    226 => 613.0,\n    227 => 613.0,\n    228 => 613.0,\n    229 => 613.0,\n    230 => 982.0,\n    231 => 550.0,\n    232 => 615.0,\n    233 => 615.0,\n    234 => 615.0,\n    235 => 615.0,\n    236 => 278.0,\n    237 => 278.0,\n    238 => 278.0,\n    239 => 278.0,\n    240 => 612.0,\n    241 => 634.0,\n    242 => 612.0,\n    243 => 612.0,\n    244 => 612.0,\n    245 => 612.0,\n    246 => 612.0,\n    247 => 838.0,\n    248 => 612.0,\n    249 => 634.0,\n    250 => 634.0,\n    251 => 634.0,\n    252 => 634.0,\n    253 => 592.0,\n    254 => 635.0,\n    255 => 592.0,\n    256 => 684.0,\n    257 => 613.0,\n    258 => 684.0,\n    259 => 613.0,\n    260 => 684.0,\n    261 => 613.0,\n    262 => 698.0,\n    263 => 550.0,\n    264 => 698.0,\n    265 => 550.0,\n    266 => 698.0,\n    267 => 550.0,\n    268 => 698.0,\n    269 => 550.0,\n    270 => 770.0,\n    271 => 635.0,\n    272 => 775.0,\n    273 => 635.0,\n    274 => 632.0,\n    275 => 615.0,\n    276 => 632.0,\n    277 => 615.0,\n    278 => 632.0,\n    279 => 615.0,\n    280 => 632.0,\n    281 => 615.0,\n    282 => 632.0,\n    283 => 615.0,\n    284 => 775.0,\n    285 => 635.0,\n    286 => 775.0,\n    287 => 635.0,\n    288 => 775.0,\n    289 => 635.0,\n    290 => 775.0,\n    291 => 635.0,\n    292 => 752.0,\n    293 => 634.0,\n    294 => 916.0,\n    295 => 695.0,\n    296 => 295.0,\n    297 => 278.0,\n    298 => 295.0,\n    299 => 278.0,\n    300 => 295.0,\n    301 => 278.0,\n    302 => 295.0,\n    303 => 278.0,\n    304 => 295.0,\n    305 => 278.0,\n    306 => 590.0,\n    307 => 556.0,\n    308 => 295.0,\n    309 => 278.0,\n    310 => 656.0,\n    311 => 579.0,\n    312 => 579.0,\n    313 => 557.0,\n    314 => 278.0,\n    315 => 557.0,\n    316 => 278.0,\n    317 => 557.0,\n    318 => 375.0,\n    319 => 557.0,\n    320 => 342.0,\n    321 => 562.0,\n    322 => 284.0,\n    323 => 748.0,\n    324 => 634.0,\n    325 => 748.0,\n    326 => 634.0,\n    327 => 748.0,\n    328 => 634.0,\n    329 => 813.0,\n    330 => 748.0,\n    331 => 634.0,\n    332 => 787.0,\n    333 => 612.0,\n    334 => 787.0,\n    335 => 612.0,\n    336 => 787.0,\n    337 => 612.0,\n    338 => 1070.0,\n    339 => 1023.0,\n    340 => 695.0,\n    341 => 411.0,\n    342 => 695.0,\n    343 => 411.0,\n    344 => 695.0,\n    345 => 411.0,\n    346 => 635.0,\n    347 => 521.0,\n    348 => 635.0,\n    349 => 521.0,\n    350 => 635.0,\n    351 => 521.0,\n    352 => 635.0,\n    353 => 521.0,\n    354 => 611.0,\n    355 => 392.0,\n    356 => 611.0,\n    357 => 392.0,\n    358 => 611.0,\n    359 => 392.0,\n    360 => 732.0,\n    361 => 634.0,\n    362 => 732.0,\n    363 => 634.0,\n    364 => 732.0,\n    365 => 634.0,\n    366 => 732.0,\n    367 => 634.0,\n    368 => 732.0,\n    369 => 634.0,\n    370 => 732.0,\n    371 => 634.0,\n    372 => 989.0,\n    373 => 818.0,\n    374 => 611.0,\n    375 => 592.0,\n    376 => 611.0,\n    377 => 685.0,\n    378 => 525.0,\n    379 => 685.0,\n    380 => 525.0,\n    381 => 685.0,\n    382 => 525.0,\n    383 => 352.0,\n    384 => 635.0,\n    385 => 735.0,\n    386 => 686.0,\n    387 => 635.0,\n    388 => 686.0,\n    389 => 635.0,\n    390 => 703.0,\n    391 => 698.0,\n    392 => 550.0,\n    393 => 775.0,\n    394 => 819.0,\n    395 => 686.0,\n    396 => 635.0,\n    397 => 612.0,\n    398 => 632.0,\n    399 => 787.0,\n    400 => 614.0,\n    401 => 575.0,\n    402 => 352.0,\n    403 => 775.0,\n    404 => 687.0,\n    405 => 984.0,\n    406 => 354.0,\n    407 => 295.0,\n    408 => 746.0,\n    409 => 579.0,\n    410 => 278.0,\n    411 => 592.0,\n    412 => 974.0,\n    413 => 748.0,\n    414 => 634.0,\n    415 => 787.0,\n    416 => 913.0,\n    417 => 612.0,\n    418 => 949.0,\n    419 => 759.0,\n    420 => 652.0,\n    421 => 635.0,\n    422 => 695.0,\n    423 => 635.0,\n    424 => 521.0,\n    425 => 632.0,\n    426 => 336.0,\n    427 => 392.0,\n    428 => 611.0,\n    429 => 392.0,\n    430 => 611.0,\n    431 => 858.0,\n    432 => 634.0,\n    433 => 764.0,\n    434 => 721.0,\n    435 => 744.0,\n    436 => 730.0,\n    437 => 685.0,\n    438 => 525.0,\n    439 => 666.0,\n    440 => 666.0,\n    441 => 578.0,\n    442 => 525.0,\n    443 => 636.0,\n    444 => 666.0,\n    445 => 578.0,\n    446 => 510.0,\n    447 => 635.0,\n    448 => 295.0,\n    449 => 492.0,\n    450 => 459.0,\n    451 => 295.0,\n    452 => 1422.0,\n    453 => 1299.0,\n    454 => 1154.0,\n    455 => 835.0,\n    456 => 787.0,\n    457 => 457.0,\n    458 => 931.0,\n    459 => 924.0,\n    460 => 797.0,\n    461 => 684.0,\n    462 => 613.0,\n    463 => 295.0,\n    464 => 278.0,\n    465 => 787.0,\n    466 => 612.0,\n    467 => 732.0,\n    468 => 634.0,\n    469 => 732.0,\n    470 => 634.0,\n    471 => 732.0,\n    472 => 634.0,\n    473 => 732.0,\n    474 => 634.0,\n    475 => 732.0,\n    476 => 634.0,\n    477 => 615.0,\n    478 => 684.0,\n    479 => 613.0,\n    480 => 684.0,\n    481 => 613.0,\n    482 => 974.0,\n    483 => 982.0,\n    484 => 775.0,\n    485 => 635.0,\n    486 => 775.0,\n    487 => 635.0,\n    488 => 656.0,\n    489 => 579.0,\n    490 => 787.0,\n    491 => 612.0,\n    492 => 787.0,\n    493 => 612.0,\n    494 => 666.0,\n    495 => 578.0,\n    496 => 278.0,\n    497 => 1422.0,\n    498 => 1299.0,\n    499 => 1154.0,\n    500 => 775.0,\n    501 => 635.0,\n    502 => 1113.0,\n    503 => 682.0,\n    504 => 748.0,\n    505 => 634.0,\n    506 => 684.0,\n    507 => 613.0,\n    508 => 974.0,\n    509 => 982.0,\n    510 => 787.0,\n    511 => 612.0,\n    512 => 684.0,\n    513 => 613.0,\n    514 => 684.0,\n    515 => 613.0,\n    516 => 632.0,\n    517 => 615.0,\n    518 => 632.0,\n    519 => 615.0,\n    520 => 295.0,\n    521 => 278.0,\n    522 => 295.0,\n    523 => 278.0,\n    524 => 787.0,\n    525 => 612.0,\n    526 => 787.0,\n    527 => 612.0,\n    528 => 695.0,\n    529 => 411.0,\n    530 => 695.0,\n    531 => 411.0,\n    532 => 732.0,\n    533 => 634.0,\n    534 => 732.0,\n    535 => 634.0,\n    536 => 635.0,\n    537 => 521.0,\n    538 => 611.0,\n    539 => 392.0,\n    540 => 627.0,\n    541 => 521.0,\n    542 => 752.0,\n    543 => 634.0,\n    544 => 735.0,\n    545 => 838.0,\n    546 => 698.0,\n    547 => 610.0,\n    548 => 685.0,\n    549 => 525.0,\n    550 => 684.0,\n    551 => 613.0,\n    552 => 632.0,\n    553 => 615.0,\n    554 => 787.0,\n    555 => 612.0,\n    556 => 787.0,\n    557 => 612.0,\n    558 => 787.0,\n    559 => 612.0,\n    560 => 787.0,\n    561 => 612.0,\n    562 => 611.0,\n    563 => 592.0,\n    564 => 475.0,\n    565 => 843.0,\n    566 => 477.0,\n    567 => 278.0,\n    568 => 998.0,\n    569 => 998.0,\n    570 => 684.0,\n    571 => 698.0,\n    572 => 550.0,\n    573 => 557.0,\n    574 => 611.0,\n    575 => 521.0,\n    576 => 525.0,\n    577 => 603.0,\n    578 => 479.0,\n    579 => 686.0,\n    580 => 732.0,\n    581 => 684.0,\n    582 => 632.0,\n    583 => 615.0,\n    584 => 295.0,\n    585 => 278.0,\n    586 => 781.0,\n    587 => 635.0,\n    588 => 695.0,\n    589 => 411.0,\n    590 => 611.0,\n    591 => 592.0,\n    592 => 600.0,\n    593 => 635.0,\n    594 => 635.0,\n    595 => 635.0,\n    596 => 549.0,\n    597 => 550.0,\n    598 => 635.0,\n    599 => 696.0,\n    600 => 615.0,\n    601 => 615.0,\n    602 => 819.0,\n    603 => 541.0,\n    604 => 532.0,\n    605 => 775.0,\n    606 => 664.0,\n    607 => 278.0,\n    608 => 696.0,\n    609 => 635.0,\n    610 => 629.0,\n    611 => 596.0,\n    612 => 596.0,\n    613 => 634.0,\n    614 => 634.0,\n    615 => 634.0,\n    616 => 278.0,\n    617 => 338.0,\n    618 => 372.0,\n    619 => 396.0,\n    620 => 487.0,\n    621 => 278.0,\n    622 => 706.0,\n    623 => 974.0,\n    624 => 974.0,\n    625 => 974.0,\n    626 => 646.0,\n    627 => 642.0,\n    628 => 634.0,\n    629 => 612.0,\n    630 => 858.0,\n    631 => 728.0,\n    632 => 660.0,\n    633 => 414.0,\n    634 => 414.0,\n    635 => 414.0,\n    636 => 411.0,\n    637 => 411.0,\n    638 => 530.0,\n    639 => 530.0,\n    640 => 604.0,\n    641 => 604.0,\n    642 => 521.0,\n    643 => 336.0,\n    644 => 336.0,\n    645 => 461.0,\n    646 => 336.0,\n    647 => 392.0,\n    648 => 392.0,\n    649 => 634.0,\n    650 => 618.0,\n    651 => 598.0,\n    652 => 592.0,\n    653 => 818.0,\n    654 => 592.0,\n    655 => 611.0,\n    656 => 525.0,\n    657 => 525.0,\n    658 => 578.0,\n    659 => 578.0,\n    660 => 510.0,\n    661 => 510.0,\n    662 => 510.0,\n    663 => 510.0,\n    664 => 787.0,\n    665 => 580.0,\n    666 => 664.0,\n    667 => 708.0,\n    668 => 654.0,\n    669 => 292.0,\n    670 => 667.0,\n    671 => 507.0,\n    672 => 727.0,\n    673 => 510.0,\n    674 => 510.0,\n    675 => 1014.0,\n    676 => 1058.0,\n    677 => 1013.0,\n    678 => 830.0,\n    679 => 610.0,\n    680 => 778.0,\n    681 => 848.0,\n    682 => 706.0,\n    683 => 654.0,\n    684 => 515.0,\n    685 => 515.0,\n    686 => 661.0,\n    687 => 664.0,\n    688 => 404.0,\n    689 => 399.0,\n    690 => 175.0,\n    691 => 259.0,\n    692 => 295.0,\n    693 => 296.0,\n    694 => 379.0,\n    695 => 515.0,\n    696 => 373.0,\n    697 => 278.0,\n    698 => 460.0,\n    699 => 318.0,\n    700 => 318.0,\n    701 => 318.0,\n    702 => 307.0,\n    703 => 307.0,\n    704 => 370.0,\n    705 => 370.0,\n    706 => 500.0,\n    707 => 500.0,\n    708 => 500.0,\n    709 => 500.0,\n    710 => 500.0,\n    711 => 500.0,\n    712 => 275.0,\n    713 => 500.0,\n    714 => 500.0,\n    715 => 500.0,\n    716 => 275.0,\n    717 => 500.0,\n    718 => 500.0,\n    719 => 500.0,\n    720 => 337.0,\n    721 => 337.0,\n    722 => 307.0,\n    723 => 307.0,\n    724 => 500.0,\n    725 => 500.0,\n    726 => 390.0,\n    727 => 317.0,\n    728 => 500.0,\n    729 => 500.0,\n    730 => 500.0,\n    731 => 500.0,\n    732 => 500.0,\n    733 => 500.0,\n    734 => 315.0,\n    735 => 500.0,\n    736 => 426.0,\n    737 => 166.0,\n    738 => 373.0,\n    739 => 444.0,\n    740 => 370.0,\n    741 => 493.0,\n    742 => 493.0,\n    743 => 493.0,\n    744 => 493.0,\n    745 => 493.0,\n    748 => 500.0,\n    749 => 500.0,\n    750 => 518.0,\n    755 => 500.0,\n    759 => 500.0,\n    768 => 0.0,\n    769 => 0.0,\n    770 => 0.0,\n    771 => 0.0,\n    772 => 0.0,\n    773 => 0.0,\n    774 => 0.0,\n    775 => 0.0,\n    776 => 0.0,\n    777 => 0.0,\n    778 => 0.0,\n    779 => 0.0,\n    780 => 0.0,\n    781 => 0.0,\n    782 => 0.0,\n    783 => 0.0,\n    784 => 0.0,\n    785 => 0.0,\n    786 => 0.0,\n    787 => 0.0,\n    788 => 0.0,\n    789 => 0.0,\n    790 => 0.0,\n    791 => 0.0,\n    792 => 0.0,\n    793 => 0.0,\n    794 => 0.0,\n    795 => 0.0,\n    796 => 0.0,\n    797 => 0.0,\n    798 => 0.0,\n    799 => 0.0,\n    800 => 0.0,\n    801 => 0.0,\n    802 => 0.0,\n    803 => 0.0,\n    804 => 0.0,\n    805 => 0.0,\n    806 => 0.0,\n    807 => 0.0,\n    808 => 0.0,\n    809 => 0.0,\n    810 => 0.0,\n    811 => 0.0,\n    812 => 0.0,\n    813 => 0.0,\n    814 => 0.0,\n    815 => 0.0,\n    816 => 0.0,\n    817 => 0.0,\n    818 => 0.0,\n    819 => 0.0,\n    820 => 0.0,\n    821 => 0.0,\n    822 => 0.0,\n    823 => 0.0,\n    824 => 0.0,\n    825 => 0.0,\n    826 => 0.0,\n    827 => 0.0,\n    828 => 0.0,\n    829 => 0.0,\n    830 => 0.0,\n    831 => 0.0,\n    832 => 0.0,\n    833 => 0.0,\n    834 => 0.0,\n    835 => 0.0,\n    836 => 0.0,\n    837 => 0.0,\n    838 => 0.0,\n    839 => 0.0,\n    840 => 0.0,\n    841 => 0.0,\n    842 => 0.0,\n    843 => 0.0,\n    844 => 0.0,\n    845 => 0.0,\n    846 => 0.0,\n    847 => 0.0,\n    849 => 0.0,\n    850 => 0.0,\n    851 => 0.0,\n    855 => 0.0,\n    856 => 0.0,\n    858 => 0.0,\n    860 => 0.0,\n    861 => 0.0,\n    862 => 0.0,\n    863 => 0.0,\n    864 => 0.0,\n    865 => 0.0,\n    866 => 0.0,\n    880 => 654.0,\n    881 => 568.0,\n    882 => 862.0,\n    883 => 647.0,\n    884 => 278.0,\n    885 => 278.0,\n    886 => 748.0,\n    887 => 650.0,\n    890 => 500.0,\n    891 => 549.0,\n    892 => 550.0,\n    893 => 549.0,\n    894 => 337.0,\n    895 => 295.0,\n    900 => 500.0,\n    901 => 500.0,\n    902 => 692.0,\n    903 => 318.0,\n    904 => 746.0,\n    905 => 871.0,\n    906 => 408.0,\n    908 => 813.0,\n    910 => 825.0,\n    911 => 826.0,\n    912 => 338.0,\n    913 => 684.0,\n    914 => 686.0,\n    915 => 557.0,\n    916 => 684.0,\n    917 => 632.0,\n    918 => 685.0,\n    919 => 752.0,\n    920 => 787.0,\n    921 => 295.0,\n    922 => 656.0,\n    923 => 684.0,\n    924 => 863.0,\n    925 => 748.0,\n    926 => 632.0,\n    927 => 787.0,\n    928 => 752.0,\n    929 => 603.0,\n    931 => 632.0,\n    932 => 611.0,\n    933 => 611.0,\n    934 => 787.0,\n    935 => 685.0,\n    936 => 787.0,\n    937 => 764.0,\n    938 => 295.0,\n    939 => 611.0,\n    940 => 659.0,\n    941 => 541.0,\n    942 => 634.0,\n    943 => 338.0,\n    944 => 579.0,\n    945 => 659.0,\n    946 => 638.0,\n    947 => 592.0,\n    948 => 612.0,\n    949 => 541.0,\n    950 => 544.0,\n    951 => 634.0,\n    952 => 612.0,\n    953 => 338.0,\n    954 => 589.0,\n    955 => 592.0,\n    956 => 636.0,\n    957 => 559.0,\n    958 => 558.0,\n    959 => 612.0,\n    960 => 602.0,\n    961 => 635.0,\n    962 => 587.0,\n    963 => 634.0,\n    964 => 602.0,\n    965 => 579.0,\n    966 => 660.0,\n    967 => 578.0,\n    968 => 660.0,\n    969 => 837.0,\n    970 => 338.0,\n    971 => 579.0,\n    972 => 612.0,\n    973 => 579.0,\n    974 => 837.0,\n    975 => 656.0,\n    976 => 614.0,\n    977 => 619.0,\n    978 => 699.0,\n    979 => 842.0,\n    980 => 699.0,\n    981 => 660.0,\n    982 => 837.0,\n    983 => 664.0,\n    984 => 787.0,\n    985 => 612.0,\n    986 => 648.0,\n    987 => 587.0,\n    988 => 575.0,\n    989 => 458.0,\n    990 => 660.0,\n    991 => 660.0,\n    992 => 865.0,\n    993 => 627.0,\n    994 => 934.0,\n    995 => 837.0,\n    996 => 758.0,\n    997 => 659.0,\n    998 => 792.0,\n    999 => 615.0,\n    1000 => 687.0,\n    1001 => 607.0,\n    1002 => 768.0,\n    1003 => 625.0,\n    1004 => 699.0,\n    1005 => 612.0,\n    1006 => 611.0,\n    1007 => 536.0,\n    1008 => 664.0,\n    1009 => 635.0,\n    1010 => 550.0,\n    1011 => 278.0,\n    1012 => 787.0,\n    1013 => 615.0,\n    1014 => 615.0,\n    1015 => 605.0,\n    1016 => 635.0,\n    1017 => 698.0,\n    1018 => 863.0,\n    1019 => 651.0,\n    1020 => 635.0,\n    1021 => 703.0,\n    1022 => 698.0,\n    1023 => 703.0,\n    1024 => 632.0,\n    1025 => 632.0,\n    1026 => 786.0,\n    1027 => 610.0,\n    1028 => 698.0,\n    1029 => 635.0,\n    1030 => 295.0,\n    1031 => 295.0,\n    1032 => 295.0,\n    1033 => 1094.0,\n    1034 => 1045.0,\n    1035 => 786.0,\n    1036 => 710.0,\n    1037 => 748.0,\n    1038 => 609.0,\n    1039 => 752.0,\n    1040 => 684.0,\n    1041 => 686.0,\n    1042 => 686.0,\n    1043 => 610.0,\n    1044 => 781.0,\n    1045 => 632.0,\n    1046 => 1077.0,\n    1047 => 641.0,\n    1048 => 748.0,\n    1049 => 748.0,\n    1050 => 710.0,\n    1051 => 752.0,\n    1052 => 863.0,\n    1053 => 752.0,\n    1054 => 787.0,\n    1055 => 752.0,\n    1056 => 603.0,\n    1057 => 698.0,\n    1058 => 611.0,\n    1059 => 609.0,\n    1060 => 861.0,\n    1061 => 685.0,\n    1062 => 776.0,\n    1063 => 686.0,\n    1064 => 1069.0,\n    1065 => 1094.0,\n    1066 => 833.0,\n    1067 => 882.0,\n    1068 => 686.0,\n    1069 => 698.0,\n    1070 => 1080.0,\n    1071 => 695.0,\n    1072 => 613.0,\n    1073 => 617.0,\n    1074 => 589.0,\n    1075 => 525.0,\n    1076 => 691.0,\n    1077 => 615.0,\n    1078 => 901.0,\n    1079 => 532.0,\n    1080 => 650.0,\n    1081 => 650.0,\n    1082 => 604.0,\n    1083 => 639.0,\n    1084 => 754.0,\n    1085 => 654.0,\n    1086 => 612.0,\n    1087 => 654.0,\n    1088 => 635.0,\n    1089 => 550.0,\n    1090 => 583.0,\n    1091 => 592.0,\n    1092 => 855.0,\n    1093 => 592.0,\n    1094 => 681.0,\n    1095 => 591.0,\n    1096 => 915.0,\n    1097 => 942.0,\n    1098 => 707.0,\n    1099 => 790.0,\n    1100 => 589.0,\n    1101 => 549.0,\n    1102 => 842.0,\n    1103 => 602.0,\n    1104 => 615.0,\n    1105 => 615.0,\n    1106 => 625.0,\n    1107 => 525.0,\n    1108 => 549.0,\n    1109 => 521.0,\n    1110 => 278.0,\n    1111 => 278.0,\n    1112 => 278.0,\n    1113 => 902.0,\n    1114 => 898.0,\n    1115 => 652.0,\n    1116 => 604.0,\n    1117 => 650.0,\n    1118 => 592.0,\n    1119 => 654.0,\n    1120 => 934.0,\n    1121 => 837.0,\n    1122 => 771.0,\n    1123 => 672.0,\n    1124 => 942.0,\n    1125 => 749.0,\n    1126 => 879.0,\n    1127 => 783.0,\n    1128 => 1160.0,\n    1129 => 1001.0,\n    1130 => 787.0,\n    1131 => 612.0,\n    1132 => 1027.0,\n    1133 => 824.0,\n    1134 => 636.0,\n    1135 => 541.0,\n    1136 => 856.0,\n    1137 => 876.0,\n    1138 => 787.0,\n    1139 => 612.0,\n    1140 => 781.0,\n    1141 => 665.0,\n    1142 => 781.0,\n    1143 => 665.0,\n    1144 => 992.0,\n    1145 => 904.0,\n    1146 => 953.0,\n    1147 => 758.0,\n    1148 => 1180.0,\n    1149 => 1028.0,\n    1150 => 934.0,\n    1151 => 837.0,\n    1152 => 698.0,\n    1153 => 550.0,\n    1154 => 502.0,\n    1155 => 0.0,\n    1156 => 0.0,\n    1157 => 0.0,\n    1158 => 0.0,\n    1159 => 0.0,\n    1160 => 418.0,\n    1161 => 418.0,\n    1162 => 772.0,\n    1163 => 677.0,\n    1164 => 686.0,\n    1165 => 589.0,\n    1166 => 603.0,\n    1167 => 635.0,\n    1168 => 610.0,\n    1169 => 525.0,\n    1170 => 675.0,\n    1171 => 590.0,\n    1172 => 624.0,\n    1173 => 530.0,\n    1174 => 1077.0,\n    1175 => 901.0,\n    1176 => 641.0,\n    1177 => 532.0,\n    1178 => 710.0,\n    1179 => 604.0,\n    1180 => 710.0,\n    1181 => 604.0,\n    1182 => 710.0,\n    1183 => 604.0,\n    1184 => 856.0,\n    1185 => 832.0,\n    1186 => 752.0,\n    1187 => 661.0,\n    1188 => 1014.0,\n    1189 => 877.0,\n    1190 => 1081.0,\n    1191 => 916.0,\n    1192 => 878.0,\n    1193 => 693.0,\n    1194 => 698.0,\n    1195 => 550.0,\n    1196 => 611.0,\n    1197 => 583.0,\n    1198 => 611.0,\n    1199 => 592.0,\n    1200 => 611.0,\n    1201 => 592.0,\n    1202 => 685.0,\n    1203 => 592.0,\n    1204 => 934.0,\n    1205 => 807.0,\n    1206 => 686.0,\n    1207 => 591.0,\n    1208 => 686.0,\n    1209 => 591.0,\n    1210 => 686.0,\n    1211 => 634.0,\n    1212 => 941.0,\n    1213 => 728.0,\n    1214 => 941.0,\n    1215 => 728.0,\n    1216 => 295.0,\n    1217 => 1077.0,\n    1218 => 901.0,\n    1219 => 656.0,\n    1220 => 604.0,\n    1221 => 776.0,\n    1222 => 670.0,\n    1223 => 752.0,\n    1224 => 661.0,\n    1225 => 776.0,\n    1226 => 681.0,\n    1227 => 686.0,\n    1228 => 591.0,\n    1229 => 888.0,\n    1230 => 774.0,\n    1231 => 278.0,\n    1232 => 684.0,\n    1233 => 613.0,\n    1234 => 684.0,\n    1235 => 613.0,\n    1236 => 974.0,\n    1237 => 982.0,\n    1238 => 632.0,\n    1239 => 615.0,\n    1240 => 787.0,\n    1241 => 615.0,\n    1242 => 787.0,\n    1243 => 615.0,\n    1244 => 1077.0,\n    1245 => 901.0,\n    1246 => 641.0,\n    1247 => 532.0,\n    1248 => 666.0,\n    1249 => 578.0,\n    1250 => 748.0,\n    1251 => 650.0,\n    1252 => 748.0,\n    1253 => 650.0,\n    1254 => 787.0,\n    1255 => 612.0,\n    1256 => 787.0,\n    1257 => 612.0,\n    1258 => 787.0,\n    1259 => 612.0,\n    1260 => 698.0,\n    1261 => 549.0,\n    1262 => 609.0,\n    1263 => 592.0,\n    1264 => 609.0,\n    1265 => 592.0,\n    1266 => 609.0,\n    1267 => 592.0,\n    1268 => 686.0,\n    1269 => 591.0,\n    1270 => 610.0,\n    1271 => 525.0,\n    1272 => 882.0,\n    1273 => 790.0,\n    1274 => 675.0,\n    1275 => 590.0,\n    1276 => 685.0,\n    1277 => 592.0,\n    1278 => 685.0,\n    1279 => 592.0,\n    1280 => 686.0,\n    1281 => 589.0,\n    1282 => 1006.0,\n    1283 => 897.0,\n    1284 => 975.0,\n    1285 => 869.0,\n    1286 => 679.0,\n    1287 => 588.0,\n    1288 => 1072.0,\n    1289 => 957.0,\n    1290 => 1113.0,\n    1291 => 967.0,\n    1292 => 775.0,\n    1293 => 660.0,\n    1294 => 773.0,\n    1295 => 711.0,\n    1296 => 614.0,\n    1297 => 541.0,\n    1298 => 752.0,\n    1299 => 639.0,\n    1300 => 1169.0,\n    1301 => 994.0,\n    1302 => 894.0,\n    1303 => 864.0,\n    1304 => 1032.0,\n    1305 => 986.0,\n    1306 => 787.0,\n    1307 => 635.0,\n    1308 => 989.0,\n    1309 => 818.0,\n    1310 => 710.0,\n    1311 => 604.0,\n    1312 => 1081.0,\n    1313 => 905.0,\n    1314 => 1081.0,\n    1315 => 912.0,\n    1316 => 793.0,\n    1317 => 683.0,\n    1329 => 766.0,\n    1330 => 732.0,\n    1331 => 753.0,\n    1332 => 753.0,\n    1333 => 732.0,\n    1334 => 772.0,\n    1335 => 640.0,\n    1336 => 732.0,\n    1337 => 859.0,\n    1338 => 753.0,\n    1339 => 691.0,\n    1340 => 533.0,\n    1341 => 922.0,\n    1342 => 863.0,\n    1343 => 732.0,\n    1344 => 716.0,\n    1345 => 766.0,\n    1346 => 753.0,\n    1347 => 767.0,\n    1348 => 792.0,\n    1349 => 728.0,\n    1350 => 729.0,\n    1351 => 757.0,\n    1352 => 732.0,\n    1353 => 713.0,\n    1354 => 800.0,\n    1355 => 768.0,\n    1356 => 792.0,\n    1357 => 732.0,\n    1358 => 753.0,\n    1359 => 705.0,\n    1360 => 694.0,\n    1361 => 744.0,\n    1362 => 538.0,\n    1363 => 811.0,\n    1364 => 757.0,\n    1365 => 787.0,\n    1366 => 790.0,\n    1369 => 307.0,\n    1370 => 318.0,\n    1371 => 234.0,\n    1372 => 361.0,\n    1373 => 238.0,\n    1374 => 405.0,\n    1375 => 500.0,\n    1377 => 974.0,\n    1378 => 634.0,\n    1379 => 658.0,\n    1380 => 663.0,\n    1381 => 634.0,\n    1382 => 635.0,\n    1383 => 515.0,\n    1384 => 634.0,\n    1385 => 738.0,\n    1386 => 658.0,\n    1387 => 634.0,\n    1388 => 271.0,\n    1389 => 980.0,\n    1390 => 623.0,\n    1391 => 634.0,\n    1392 => 634.0,\n    1393 => 608.0,\n    1394 => 634.0,\n    1395 => 629.0,\n    1396 => 634.0,\n    1397 => 271.0,\n    1398 => 634.0,\n    1399 => 499.0,\n    1400 => 634.0,\n    1401 => 404.0,\n    1402 => 974.0,\n    1403 => 560.0,\n    1404 => 648.0,\n    1405 => 634.0,\n    1406 => 634.0,\n    1407 => 974.0,\n    1408 => 634.0,\n    1409 => 633.0,\n    1410 => 435.0,\n    1411 => 974.0,\n    1412 => 636.0,\n    1413 => 609.0,\n    1414 => 805.0,\n    1415 => 812.0,\n    1417 => 337.0,\n    1418 => 361.0,\n    1456 => 0.0,\n    1457 => 0.0,\n    1458 => 0.0,\n    1459 => 0.0,\n    1460 => 0.0,\n    1461 => 0.0,\n    1462 => 0.0,\n    1463 => 0.0,\n    1464 => 0.0,\n    1465 => 0.0,\n    1466 => 0.0,\n    1467 => 0.0,\n    1468 => 0.0,\n    1469 => 0.0,\n    1470 => 361.0,\n    1471 => 0.0,\n    1472 => 295.0,\n    1473 => 0.0,\n    1474 => 0.0,\n    1475 => 295.0,\n    1478 => 441.0,\n    1479 => 0.0,\n    1488 => 668.0,\n    1489 => 578.0,\n    1490 => 412.0,\n    1491 => 546.0,\n    1492 => 653.0,\n    1493 => 272.0,\n    1494 => 346.0,\n    1495 => 653.0,\n    1496 => 648.0,\n    1497 => 224.0,\n    1498 => 537.0,\n    1499 => 529.0,\n    1500 => 568.0,\n    1501 => 664.0,\n    1502 => 679.0,\n    1503 => 272.0,\n    1504 => 400.0,\n    1505 => 649.0,\n    1506 => 626.0,\n    1507 => 640.0,\n    1508 => 625.0,\n    1509 => 540.0,\n    1510 => 593.0,\n    1511 => 709.0,\n    1512 => 564.0,\n    1513 => 708.0,\n    1514 => 657.0,\n    1520 => 471.0,\n    1521 => 423.0,\n    1522 => 331.0,\n    1523 => 416.0,\n    1524 => 645.0,\n    1542 => 637.0,\n    1543 => 637.0,\n    1545 => 757.0,\n    1546 => 977.0,\n    1548 => 323.0,\n    1557 => 0.0,\n    1563 => 318.0,\n    1567 => 531.0,\n    1569 => 470.0,\n    1570 => 278.0,\n    1571 => 278.0,\n    1572 => 483.0,\n    1573 => 278.0,\n    1574 => 783.0,\n    1575 => 278.0,\n    1576 => 941.0,\n    1577 => 524.0,\n    1578 => 941.0,\n    1579 => 941.0,\n    1580 => 646.0,\n    1581 => 646.0,\n    1582 => 646.0,\n    1583 => 445.0,\n    1584 => 445.0,\n    1585 => 483.0,\n    1586 => 483.0,\n    1587 => 1221.0,\n    1588 => 1221.0,\n    1589 => 1209.0,\n    1590 => 1209.0,\n    1591 => 925.0,\n    1592 => 925.0,\n    1593 => 597.0,\n    1594 => 597.0,\n    1600 => 293.0,\n    1601 => 1037.0,\n    1602 => 776.0,\n    1603 => 824.0,\n    1604 => 727.0,\n    1605 => 619.0,\n    1606 => 734.0,\n    1607 => 524.0,\n    1608 => 483.0,\n    1609 => 783.0,\n    1610 => 783.0,\n    1611 => 0.0,\n    1612 => 0.0,\n    1613 => 0.0,\n    1614 => 0.0,\n    1615 => 0.0,\n    1616 => 0.0,\n    1617 => 0.0,\n    1618 => 0.0,\n    1619 => 0.0,\n    1620 => 0.0,\n    1621 => 0.0,\n    1623 => 0.0,\n    1626 => 500.0,\n    1632 => 537.0,\n    1633 => 537.0,\n    1634 => 537.0,\n    1635 => 537.0,\n    1636 => 537.0,\n    1637 => 537.0,\n    1638 => 537.0,\n    1639 => 537.0,\n    1640 => 537.0,\n    1641 => 537.0,\n    1642 => 537.0,\n    1643 => 325.0,\n    1644 => 318.0,\n    1645 => 545.0,\n    1646 => 941.0,\n    1647 => 776.0,\n    1648 => 0.0,\n    1652 => 292.0,\n    1657 => 941.0,\n    1658 => 941.0,\n    1659 => 941.0,\n    1660 => 941.0,\n    1661 => 941.0,\n    1662 => 941.0,\n    1663 => 941.0,\n    1664 => 941.0,\n    1665 => 646.0,\n    1666 => 646.0,\n    1667 => 646.0,\n    1668 => 646.0,\n    1669 => 646.0,\n    1670 => 646.0,\n    1671 => 646.0,\n    1672 => 445.0,\n    1673 => 445.0,\n    1674 => 445.0,\n    1675 => 445.0,\n    1676 => 445.0,\n    1677 => 445.0,\n    1678 => 445.0,\n    1679 => 445.0,\n    1680 => 445.0,\n    1681 => 483.0,\n    1682 => 483.0,\n    1683 => 498.0,\n    1684 => 530.0,\n    1685 => 610.0,\n    1686 => 530.0,\n    1687 => 483.0,\n    1688 => 483.0,\n    1689 => 483.0,\n    1690 => 1221.0,\n    1691 => 1221.0,\n    1692 => 1221.0,\n    1693 => 1209.0,\n    1694 => 1209.0,\n    1695 => 925.0,\n    1696 => 597.0,\n    1697 => 1037.0,\n    1698 => 1037.0,\n    1699 => 1037.0,\n    1700 => 1037.0,\n    1701 => 1037.0,\n    1702 => 1037.0,\n    1703 => 776.0,\n    1704 => 776.0,\n    1705 => 895.0,\n    1706 => 1054.0,\n    1707 => 895.0,\n    1708 => 824.0,\n    1709 => 824.0,\n    1710 => 824.0,\n    1711 => 895.0,\n    1712 => 895.0,\n    1713 => 895.0,\n    1714 => 895.0,\n    1715 => 895.0,\n    1716 => 895.0,\n    1717 => 727.0,\n    1718 => 727.0,\n    1719 => 727.0,\n    1720 => 727.0,\n    1721 => 734.0,\n    1722 => 734.0,\n    1723 => 734.0,\n    1724 => 734.0,\n    1725 => 734.0,\n    1726 => 698.0,\n    1727 => 646.0,\n    1734 => 483.0,\n    1735 => 483.0,\n    1736 => 483.0,\n    1739 => 483.0,\n    1740 => 783.0,\n    1742 => 783.0,\n    1744 => 783.0,\n    1749 => 524.0,\n    1776 => 537.0,\n    1777 => 537.0,\n    1778 => 537.0,\n    1779 => 537.0,\n    1780 => 537.0,\n    1781 => 537.0,\n    1782 => 537.0,\n    1783 => 537.0,\n    1784 => 537.0,\n    1785 => 537.0,\n    1984 => 636.0,\n    1985 => 636.0,\n    1986 => 636.0,\n    1987 => 636.0,\n    1988 => 636.0,\n    1989 => 636.0,\n    1990 => 636.0,\n    1991 => 636.0,\n    1992 => 636.0,\n    1993 => 636.0,\n    1994 => 278.0,\n    1995 => 571.0,\n    1996 => 424.0,\n    1997 => 592.0,\n    1998 => 654.0,\n    1999 => 654.0,\n    2000 => 594.0,\n    2001 => 654.0,\n    2002 => 829.0,\n    2003 => 438.0,\n    2004 => 438.0,\n    2005 => 559.0,\n    2006 => 612.0,\n    2007 => 350.0,\n    2008 => 959.0,\n    2009 => 473.0,\n    2010 => 783.0,\n    2011 => 654.0,\n    2012 => 625.0,\n    2013 => 734.0,\n    2014 => 530.0,\n    2015 => 724.0,\n    2016 => 473.0,\n    2017 => 625.0,\n    2018 => 594.0,\n    2019 => 530.0,\n    2020 => 530.0,\n    2021 => 522.0,\n    2022 => 594.0,\n    2023 => 594.0,\n    2027 => 0.0,\n    2028 => 0.0,\n    2029 => 0.0,\n    2030 => 0.0,\n    2031 => 0.0,\n    2032 => 0.0,\n    2033 => 0.0,\n    2034 => 0.0,\n    2035 => 0.0,\n    2036 => 313.0,\n    2037 => 313.0,\n    2040 => 560.0,\n    2041 => 560.0,\n    2042 => 361.0,\n    3647 => 636.0,\n    3713 => 670.0,\n    3714 => 684.0,\n    3716 => 688.0,\n    3719 => 482.0,\n    3720 => 628.0,\n    3722 => 684.0,\n    3725 => 688.0,\n    3732 => 669.0,\n    3733 => 642.0,\n    3734 => 645.0,\n    3735 => 655.0,\n    3737 => 659.0,\n    3738 => 625.0,\n    3739 => 625.0,\n    3740 => 745.0,\n    3741 => 767.0,\n    3742 => 687.0,\n    3743 => 687.0,\n    3745 => 702.0,\n    3746 => 688.0,\n    3747 => 684.0,\n    3749 => 649.0,\n    3751 => 632.0,\n    3754 => 703.0,\n    3755 => 819.0,\n    3757 => 633.0,\n    3758 => 684.0,\n    3759 => 788.0,\n    3760 => 632.0,\n    3761 => 0.0,\n    3762 => 539.0,\n    3763 => 539.0,\n    3764 => 0.0,\n    3765 => 0.0,\n    3766 => 0.0,\n    3767 => 0.0,\n    3768 => 0.0,\n    3769 => 0.0,\n    3771 => 0.0,\n    3772 => 0.0,\n    3773 => 663.0,\n    3776 => 375.0,\n    3777 => 657.0,\n    3778 => 460.0,\n    3779 => 547.0,\n    3780 => 491.0,\n    3782 => 674.0,\n    3784 => 0.0,\n    3785 => 0.0,\n    3786 => 0.0,\n    3787 => 0.0,\n    3788 => 0.0,\n    3789 => 0.0,\n    3792 => 636.0,\n    3793 => 641.0,\n    3794 => 641.0,\n    3795 => 670.0,\n    3796 => 625.0,\n    3797 => 625.0,\n    3798 => 703.0,\n    3799 => 670.0,\n    3800 => 674.0,\n    3801 => 677.0,\n    3804 => 1028.0,\n    3805 => 1028.0,\n    4256 => 874.0,\n    4257 => 733.0,\n    4258 => 679.0,\n    4259 => 834.0,\n    4260 => 615.0,\n    4261 => 768.0,\n    4262 => 753.0,\n    4263 => 914.0,\n    4264 => 453.0,\n    4265 => 620.0,\n    4266 => 843.0,\n    4267 => 882.0,\n    4268 => 625.0,\n    4269 => 854.0,\n    4270 => 781.0,\n    4271 => 629.0,\n    4272 => 912.0,\n    4273 => 621.0,\n    4274 => 620.0,\n    4275 => 854.0,\n    4276 => 866.0,\n    4277 => 724.0,\n    4278 => 630.0,\n    4279 => 621.0,\n    4280 => 625.0,\n    4281 => 620.0,\n    4282 => 818.0,\n    4283 => 874.0,\n    4284 => 615.0,\n    4285 => 623.0,\n    4286 => 625.0,\n    4287 => 725.0,\n    4288 => 844.0,\n    4289 => 596.0,\n    4290 => 688.0,\n    4291 => 596.0,\n    4292 => 594.0,\n    4293 => 738.0,\n    4304 => 508.0,\n    4305 => 518.0,\n    4306 => 581.0,\n    4307 => 818.0,\n    4308 => 508.0,\n    4309 => 513.0,\n    4310 => 500.0,\n    4311 => 801.0,\n    4312 => 518.0,\n    4313 => 510.0,\n    4314 => 1064.0,\n    4315 => 522.0,\n    4316 => 522.0,\n    4317 => 786.0,\n    4318 => 508.0,\n    4319 => 518.0,\n    4320 => 796.0,\n    4321 => 522.0,\n    4322 => 654.0,\n    4323 => 522.0,\n    4324 => 825.0,\n    4325 => 513.0,\n    4326 => 786.0,\n    4327 => 518.0,\n    4328 => 518.0,\n    4329 => 522.0,\n    4330 => 571.0,\n    4331 => 522.0,\n    4332 => 518.0,\n    4333 => 520.0,\n    4334 => 522.0,\n    4335 => 454.0,\n    4336 => 508.0,\n    4337 => 518.0,\n    4338 => 508.0,\n    4339 => 508.0,\n    4340 => 518.0,\n    4341 => 554.0,\n    4342 => 828.0,\n    4343 => 552.0,\n    4344 => 508.0,\n    4345 => 571.0,\n    4346 => 508.0,\n    4347 => 448.0,\n    4348 => 324.0,\n    5121 => 684.0,\n    5122 => 684.0,\n    5123 => 684.0,\n    5124 => 684.0,\n    5125 => 769.0,\n    5126 => 769.0,\n    5127 => 769.0,\n    5129 => 769.0,\n    5130 => 769.0,\n    5131 => 769.0,\n    5132 => 835.0,\n    5133 => 834.0,\n    5134 => 835.0,\n    5135 => 834.0,\n    5136 => 835.0,\n    5137 => 834.0,\n    5138 => 967.0,\n    5139 => 1007.0,\n    5140 => 967.0,\n    5141 => 1007.0,\n    5142 => 769.0,\n    5143 => 967.0,\n    5144 => 1007.0,\n    5145 => 967.0,\n    5146 => 1007.0,\n    5147 => 769.0,\n    5149 => 256.0,\n    5150 => 543.0,\n    5151 => 423.0,\n    5152 => 423.0,\n    5153 => 389.0,\n    5154 => 389.0,\n    5155 => 393.0,\n    5156 => 389.0,\n    5157 => 466.0,\n    5158 => 385.0,\n    5159 => 256.0,\n    5160 => 389.0,\n    5161 => 389.0,\n    5162 => 389.0,\n    5163 => 1090.0,\n    5164 => 909.0,\n    5165 => 953.0,\n    5166 => 1117.0,\n    5167 => 684.0,\n    5168 => 684.0,\n    5169 => 684.0,\n    5170 => 684.0,\n    5171 => 729.0,\n    5172 => 729.0,\n    5173 => 729.0,\n    5175 => 729.0,\n    5176 => 729.0,\n    5177 => 729.0,\n    5178 => 835.0,\n    5179 => 684.0,\n    5180 => 835.0,\n    5181 => 834.0,\n    5182 => 835.0,\n    5183 => 834.0,\n    5184 => 967.0,\n    5185 => 1007.0,\n    5186 => 967.0,\n    5187 => 1007.0,\n    5188 => 967.0,\n    5189 => 1007.0,\n    5190 => 967.0,\n    5191 => 1007.0,\n    5192 => 729.0,\n    5193 => 508.0,\n    5194 => 192.0,\n    5196 => 732.0,\n    5197 => 732.0,\n    5198 => 732.0,\n    5199 => 732.0,\n    5200 => 730.0,\n    5201 => 730.0,\n    5202 => 730.0,\n    5204 => 730.0,\n    5205 => 730.0,\n    5206 => 730.0,\n    5207 => 921.0,\n    5208 => 889.0,\n    5209 => 921.0,\n    5210 => 889.0,\n    5211 => 921.0,\n    5212 => 889.0,\n    5213 => 928.0,\n    5214 => 900.0,\n    5215 => 928.0,\n    5216 => 900.0,\n    5217 => 947.0,\n    5218 => 900.0,\n    5219 => 947.0,\n    5220 => 900.0,\n    5221 => 947.0,\n    5222 => 434.0,\n    5223 => 877.0,\n    5224 => 877.0,\n    5225 => 866.0,\n    5226 => 890.0,\n    5227 => 628.0,\n    5228 => 628.0,\n    5229 => 628.0,\n    5230 => 628.0,\n    5231 => 628.0,\n    5232 => 628.0,\n    5233 => 628.0,\n    5234 => 628.0,\n    5235 => 628.0,\n    5236 => 860.0,\n    5237 => 771.0,\n    5238 => 815.0,\n    5239 => 816.0,\n    5240 => 815.0,\n    5241 => 816.0,\n    5242 => 860.0,\n    5243 => 771.0,\n    5244 => 860.0,\n    5245 => 771.0,\n    5246 => 815.0,\n    5247 => 816.0,\n    5248 => 815.0,\n    5249 => 816.0,\n    5250 => 815.0,\n    5251 => 407.0,\n    5252 => 407.0,\n    5253 => 750.0,\n    5254 => 775.0,\n    5255 => 750.0,\n    5256 => 775.0,\n    5257 => 628.0,\n    5258 => 628.0,\n    5259 => 628.0,\n    5260 => 628.0,\n    5261 => 628.0,\n    5262 => 628.0,\n    5263 => 628.0,\n    5264 => 628.0,\n    5265 => 628.0,\n    5266 => 860.0,\n    5267 => 771.0,\n    5268 => 815.0,\n    5269 => 816.0,\n    5270 => 815.0,\n    5271 => 816.0,\n    5272 => 860.0,\n    5273 => 771.0,\n    5274 => 860.0,\n    5275 => 771.0,\n    5276 => 815.0,\n    5277 => 816.0,\n    5278 => 815.0,\n    5279 => 816.0,\n    5280 => 815.0,\n    5281 => 435.0,\n    5282 => 435.0,\n    5283 => 610.0,\n    5284 => 557.0,\n    5285 => 557.0,\n    5286 => 557.0,\n    5287 => 610.0,\n    5288 => 610.0,\n    5289 => 610.0,\n    5290 => 557.0,\n    5291 => 557.0,\n    5292 => 749.0,\n    5293 => 769.0,\n    5294 => 746.0,\n    5295 => 764.0,\n    5296 => 746.0,\n    5297 => 764.0,\n    5298 => 749.0,\n    5299 => 769.0,\n    5300 => 749.0,\n    5301 => 769.0,\n    5302 => 746.0,\n    5303 => 764.0,\n    5304 => 746.0,\n    5305 => 764.0,\n    5306 => 746.0,\n    5307 => 386.0,\n    5308 => 508.0,\n    5309 => 386.0,\n    5312 => 852.0,\n    5313 => 852.0,\n    5314 => 852.0,\n    5315 => 852.0,\n    5316 => 852.0,\n    5317 => 852.0,\n    5318 => 852.0,\n    5319 => 852.0,\n    5320 => 852.0,\n    5321 => 1069.0,\n    5322 => 1035.0,\n    5323 => 1059.0,\n    5324 => 852.0,\n    5325 => 1059.0,\n    5326 => 852.0,\n    5327 => 852.0,\n    5328 => 600.0,\n    5329 => 453.0,\n    5330 => 600.0,\n    5331 => 852.0,\n    5332 => 852.0,\n    5333 => 852.0,\n    5334 => 852.0,\n    5335 => 852.0,\n    5336 => 852.0,\n    5337 => 852.0,\n    5338 => 852.0,\n    5339 => 852.0,\n    5340 => 1069.0,\n    5341 => 1035.0,\n    5342 => 1059.0,\n    5343 => 1030.0,\n    5344 => 1059.0,\n    5345 => 1030.0,\n    5346 => 1069.0,\n    5347 => 1035.0,\n    5348 => 1069.0,\n    5349 => 1035.0,\n    5350 => 1083.0,\n    5351 => 1030.0,\n    5352 => 1083.0,\n    5353 => 1030.0,\n    5354 => 600.0,\n    5356 => 729.0,\n    5357 => 603.0,\n    5358 => 603.0,\n    5359 => 603.0,\n    5360 => 603.0,\n    5361 => 603.0,\n    5362 => 603.0,\n    5363 => 603.0,\n    5364 => 603.0,\n    5365 => 603.0,\n    5366 => 834.0,\n    5367 => 754.0,\n    5368 => 792.0,\n    5369 => 771.0,\n    5370 => 792.0,\n    5371 => 771.0,\n    5372 => 834.0,\n    5373 => 754.0,\n    5374 => 834.0,\n    5375 => 754.0,\n    5376 => 792.0,\n    5377 => 771.0,\n    5378 => 792.0,\n    5379 => 771.0,\n    5380 => 792.0,\n    5381 => 418.0,\n    5382 => 420.0,\n    5383 => 418.0,\n    5392 => 712.0,\n    5393 => 712.0,\n    5394 => 712.0,\n    5395 => 892.0,\n    5396 => 892.0,\n    5397 => 892.0,\n    5398 => 892.0,\n    5399 => 910.0,\n    5400 => 872.0,\n    5401 => 910.0,\n    5402 => 872.0,\n    5403 => 910.0,\n    5404 => 872.0,\n    5405 => 1140.0,\n    5406 => 1100.0,\n    5407 => 1140.0,\n    5408 => 1100.0,\n    5409 => 1140.0,\n    5410 => 1100.0,\n    5411 => 1140.0,\n    5412 => 1100.0,\n    5413 => 641.0,\n    5414 => 627.0,\n    5415 => 627.0,\n    5416 => 627.0,\n    5417 => 627.0,\n    5418 => 627.0,\n    5419 => 627.0,\n    5420 => 627.0,\n    5421 => 627.0,\n    5422 => 627.0,\n    5423 => 844.0,\n    5424 => 781.0,\n    5425 => 816.0,\n    5426 => 818.0,\n    5427 => 816.0,\n    5428 => 818.0,\n    5429 => 844.0,\n    5430 => 781.0,\n    5431 => 844.0,\n    5432 => 781.0,\n    5433 => 816.0,\n    5434 => 818.0,\n    5435 => 816.0,\n    5436 => 818.0,\n    5437 => 816.0,\n    5438 => 418.0,\n    5440 => 389.0,\n    5441 => 484.0,\n    5442 => 916.0,\n    5443 => 916.0,\n    5444 => 916.0,\n    5445 => 916.0,\n    5446 => 916.0,\n    5447 => 916.0,\n    5448 => 603.0,\n    5449 => 603.0,\n    5450 => 603.0,\n    5451 => 603.0,\n    5452 => 603.0,\n    5453 => 603.0,\n    5454 => 834.0,\n    5455 => 754.0,\n    5456 => 418.0,\n    5458 => 729.0,\n    5459 => 684.0,\n    5460 => 684.0,\n    5461 => 684.0,\n    5462 => 684.0,\n    5463 => 726.0,\n    5464 => 726.0,\n    5465 => 726.0,\n    5466 => 726.0,\n    5467 => 924.0,\n    5468 => 1007.0,\n    5469 => 508.0,\n    5470 => 732.0,\n    5471 => 732.0,\n    5472 => 732.0,\n    5473 => 732.0,\n    5474 => 732.0,\n    5475 => 732.0,\n    5476 => 730.0,\n    5477 => 730.0,\n    5478 => 730.0,\n    5479 => 730.0,\n    5480 => 947.0,\n    5481 => 900.0,\n    5482 => 508.0,\n    5492 => 831.0,\n    5493 => 831.0,\n    5494 => 831.0,\n    5495 => 831.0,\n    5496 => 831.0,\n    5497 => 831.0,\n    5498 => 831.0,\n    5499 => 563.0,\n    5500 => 752.0,\n    5501 => 484.0,\n    5502 => 1047.0,\n    5503 => 1047.0,\n    5504 => 1047.0,\n    5505 => 1047.0,\n    5506 => 1047.0,\n    5507 => 1047.0,\n    5508 => 1047.0,\n    5509 => 825.0,\n    5514 => 831.0,\n    5515 => 831.0,\n    5516 => 831.0,\n    5517 => 831.0,\n    5518 => 1259.0,\n    5519 => 1259.0,\n    5520 => 1259.0,\n    5521 => 1002.0,\n    5522 => 1002.0,\n    5523 => 1259.0,\n    5524 => 1259.0,\n    5525 => 700.0,\n    5526 => 1073.0,\n    5536 => 852.0,\n    5537 => 852.0,\n    5538 => 852.0,\n    5539 => 852.0,\n    5540 => 852.0,\n    5541 => 852.0,\n    5542 => 600.0,\n    5543 => 643.0,\n    5544 => 643.0,\n    5545 => 643.0,\n    5546 => 643.0,\n    5547 => 643.0,\n    5548 => 643.0,\n    5549 => 643.0,\n    5550 => 418.0,\n    5551 => 628.0,\n    5598 => 770.0,\n    5601 => 767.0,\n    5702 => 468.0,\n    5703 => 468.0,\n    5742 => 444.0,\n    5743 => 1047.0,\n    5744 => 1310.0,\n    5745 => 1632.0,\n    5746 => 1632.0,\n    5747 => 1375.0,\n    5748 => 1375.0,\n    5749 => 1632.0,\n    5750 => 1632.0,\n    5760 => 477.0,\n    5761 => 493.0,\n    5762 => 712.0,\n    5763 => 931.0,\n    5764 => 1150.0,\n    5765 => 1370.0,\n    5766 => 493.0,\n    5767 => 712.0,\n    5768 => 931.0,\n    5769 => 1150.0,\n    5770 => 1370.0,\n    5771 => 498.0,\n    5772 => 718.0,\n    5773 => 938.0,\n    5774 => 1159.0,\n    5775 => 1379.0,\n    5776 => 493.0,\n    5777 => 712.0,\n    5778 => 930.0,\n    5779 => 1149.0,\n    5780 => 1370.0,\n    5781 => 498.0,\n    5782 => 752.0,\n    5783 => 789.0,\n    5784 => 1205.0,\n    5785 => 1150.0,\n    5786 => 683.0,\n    5787 => 507.0,\n    5788 => 507.0,\n    7424 => 592.0,\n    7425 => 717.0,\n    7426 => 982.0,\n    7427 => 586.0,\n    7428 => 550.0,\n    7429 => 605.0,\n    7430 => 605.0,\n    7431 => 491.0,\n    7432 => 541.0,\n    7433 => 278.0,\n    7434 => 395.0,\n    7435 => 579.0,\n    7436 => 583.0,\n    7437 => 754.0,\n    7438 => 650.0,\n    7439 => 612.0,\n    7440 => 550.0,\n    7441 => 684.0,\n    7442 => 684.0,\n    7443 => 684.0,\n    7444 => 1023.0,\n    7446 => 612.0,\n    7447 => 612.0,\n    7448 => 524.0,\n    7449 => 602.0,\n    7450 => 602.0,\n    7451 => 583.0,\n    7452 => 574.0,\n    7453 => 737.0,\n    7454 => 948.0,\n    7455 => 638.0,\n    7456 => 592.0,\n    7457 => 818.0,\n    7458 => 525.0,\n    7459 => 526.0,\n    7462 => 583.0,\n    7463 => 592.0,\n    7464 => 564.0,\n    7465 => 524.0,\n    7466 => 590.0,\n    7467 => 639.0,\n    7468 => 431.0,\n    7469 => 613.0,\n    7470 => 432.0,\n    7472 => 485.0,\n    7473 => 398.0,\n    7474 => 398.0,\n    7475 => 488.0,\n    7476 => 474.0,\n    7477 => 186.0,\n    7478 => 186.0,\n    7479 => 413.0,\n    7480 => 351.0,\n    7481 => 543.0,\n    7482 => 471.0,\n    7483 => 471.0,\n    7484 => 496.0,\n    7485 => 439.0,\n    7486 => 380.0,\n    7487 => 438.0,\n    7488 => 385.0,\n    7489 => 461.0,\n    7490 => 623.0,\n    7491 => 392.0,\n    7492 => 392.0,\n    7493 => 405.0,\n    7494 => 648.0,\n    7495 => 428.0,\n    7496 => 405.0,\n    7497 => 417.0,\n    7498 => 417.0,\n    7499 => 360.0,\n    7500 => 359.0,\n    7501 => 405.0,\n    7502 => 179.0,\n    7503 => 426.0,\n    7504 => 623.0,\n    7505 => 409.0,\n    7506 => 414.0,\n    7507 => 370.0,\n    7508 => 414.0,\n    7509 => 414.0,\n    7510 => 428.0,\n    7511 => 295.0,\n    7512 => 405.0,\n    7513 => 470.0,\n    7514 => 623.0,\n    7515 => 417.0,\n    7517 => 402.0,\n    7518 => 373.0,\n    7519 => 385.0,\n    7520 => 416.0,\n    7521 => 364.0,\n    7522 => 179.0,\n    7523 => 259.0,\n    7524 => 405.0,\n    7525 => 417.0,\n    7526 => 402.0,\n    7527 => 373.0,\n    7528 => 412.0,\n    7529 => 416.0,\n    7530 => 364.0,\n    7543 => 635.0,\n    7544 => 474.0,\n    7547 => 372.0,\n    7549 => 667.0,\n    7557 => 278.0,\n    7579 => 405.0,\n    7580 => 370.0,\n    7581 => 370.0,\n    7582 => 414.0,\n    7583 => 360.0,\n    7584 => 296.0,\n    7585 => 233.0,\n    7586 => 405.0,\n    7587 => 405.0,\n    7588 => 261.0,\n    7589 => 250.0,\n    7590 => 261.0,\n    7591 => 261.0,\n    7592 => 234.0,\n    7593 => 250.0,\n    7594 => 235.0,\n    7595 => 376.0,\n    7596 => 623.0,\n    7597 => 623.0,\n    7598 => 411.0,\n    7599 => 479.0,\n    7600 => 409.0,\n    7601 => 414.0,\n    7602 => 414.0,\n    7603 => 360.0,\n    7604 => 287.0,\n    7605 => 295.0,\n    7606 => 508.0,\n    7607 => 418.0,\n    7608 => 361.0,\n    7609 => 406.0,\n    7610 => 417.0,\n    7611 => 366.0,\n    7612 => 437.0,\n    7613 => 366.0,\n    7614 => 392.0,\n    7615 => 414.0,\n    7620 => 0.0,\n    7621 => 0.0,\n    7622 => 0.0,\n    7623 => 0.0,\n    7624 => 0.0,\n    7625 => 0.0,\n    7680 => 684.0,\n    7681 => 613.0,\n    7682 => 686.0,\n    7683 => 635.0,\n    7684 => 686.0,\n    7685 => 635.0,\n    7686 => 686.0,\n    7687 => 635.0,\n    7688 => 698.0,\n    7689 => 550.0,\n    7690 => 770.0,\n    7691 => 635.0,\n    7692 => 770.0,\n    7693 => 635.0,\n    7694 => 770.0,\n    7695 => 635.0,\n    7696 => 770.0,\n    7697 => 635.0,\n    7698 => 770.0,\n    7699 => 635.0,\n    7700 => 632.0,\n    7701 => 615.0,\n    7702 => 632.0,\n    7703 => 615.0,\n    7704 => 632.0,\n    7705 => 615.0,\n    7706 => 632.0,\n    7707 => 615.0,\n    7708 => 632.0,\n    7709 => 615.0,\n    7710 => 575.0,\n    7711 => 352.0,\n    7712 => 775.0,\n    7713 => 635.0,\n    7714 => 752.0,\n    7715 => 634.0,\n    7716 => 752.0,\n    7717 => 634.0,\n    7718 => 752.0,\n    7719 => 634.0,\n    7720 => 752.0,\n    7721 => 634.0,\n    7722 => 752.0,\n    7723 => 634.0,\n    7724 => 295.0,\n    7725 => 278.0,\n    7726 => 295.0,\n    7727 => 278.0,\n    7728 => 656.0,\n    7729 => 579.0,\n    7730 => 656.0,\n    7731 => 579.0,\n    7732 => 656.0,\n    7733 => 579.0,\n    7734 => 557.0,\n    7735 => 288.0,\n    7736 => 557.0,\n    7737 => 288.0,\n    7738 => 557.0,\n    7739 => 278.0,\n    7740 => 557.0,\n    7741 => 278.0,\n    7742 => 863.0,\n    7743 => 974.0,\n    7744 => 863.0,\n    7745 => 974.0,\n    7746 => 863.0,\n    7747 => 974.0,\n    7748 => 748.0,\n    7749 => 634.0,\n    7750 => 748.0,\n    7751 => 634.0,\n    7752 => 748.0,\n    7753 => 634.0,\n    7754 => 748.0,\n    7755 => 634.0,\n    7756 => 787.0,\n    7757 => 612.0,\n    7758 => 787.0,\n    7759 => 612.0,\n    7760 => 787.0,\n    7761 => 612.0,\n    7762 => 787.0,\n    7763 => 612.0,\n    7764 => 603.0,\n    7765 => 635.0,\n    7766 => 603.0,\n    7767 => 635.0,\n    7768 => 695.0,\n    7769 => 411.0,\n    7770 => 695.0,\n    7771 => 411.0,\n    7772 => 695.0,\n    7773 => 411.0,\n    7774 => 695.0,\n    7775 => 411.0,\n    7776 => 635.0,\n    7777 => 521.0,\n    7778 => 635.0,\n    7779 => 521.0,\n    7780 => 635.0,\n    7781 => 521.0,\n    7782 => 635.0,\n    7783 => 521.0,\n    7784 => 635.0,\n    7785 => 521.0,\n    7786 => 611.0,\n    7787 => 392.0,\n    7788 => 611.0,\n    7789 => 392.0,\n    7790 => 611.0,\n    7791 => 392.0,\n    7792 => 611.0,\n    7793 => 392.0,\n    7794 => 732.0,\n    7795 => 634.0,\n    7796 => 732.0,\n    7797 => 634.0,\n    7798 => 732.0,\n    7799 => 634.0,\n    7800 => 732.0,\n    7801 => 634.0,\n    7802 => 732.0,\n    7803 => 634.0,\n    7804 => 684.0,\n    7805 => 592.0,\n    7806 => 684.0,\n    7807 => 592.0,\n    7808 => 989.0,\n    7809 => 818.0,\n    7810 => 989.0,\n    7811 => 818.0,\n    7812 => 989.0,\n    7813 => 818.0,\n    7814 => 989.0,\n    7815 => 818.0,\n    7816 => 989.0,\n    7817 => 818.0,\n    7818 => 685.0,\n    7819 => 592.0,\n    7820 => 685.0,\n    7821 => 592.0,\n    7822 => 611.0,\n    7823 => 592.0,\n    7824 => 685.0,\n    7825 => 525.0,\n    7826 => 685.0,\n    7827 => 525.0,\n    7828 => 685.0,\n    7829 => 525.0,\n    7830 => 634.0,\n    7831 => 392.0,\n    7832 => 818.0,\n    7833 => 592.0,\n    7834 => 613.0,\n    7835 => 352.0,\n    7836 => 352.0,\n    7837 => 352.0,\n    7838 => 769.0,\n    7839 => 612.0,\n    7840 => 684.0,\n    7841 => 613.0,\n    7842 => 684.0,\n    7843 => 613.0,\n    7844 => 684.0,\n    7845 => 613.0,\n    7846 => 684.0,\n    7847 => 613.0,\n    7848 => 684.0,\n    7849 => 613.0,\n    7850 => 684.0,\n    7851 => 613.0,\n    7852 => 684.0,\n    7853 => 613.0,\n    7854 => 684.0,\n    7855 => 613.0,\n    7856 => 684.0,\n    7857 => 613.0,\n    7858 => 684.0,\n    7859 => 613.0,\n    7860 => 684.0,\n    7861 => 613.0,\n    7862 => 684.0,\n    7863 => 613.0,\n    7864 => 632.0,\n    7865 => 615.0,\n    7866 => 632.0,\n    7867 => 615.0,\n    7868 => 632.0,\n    7869 => 615.0,\n    7870 => 632.0,\n    7871 => 615.0,\n    7872 => 632.0,\n    7873 => 615.0,\n    7874 => 632.0,\n    7875 => 615.0,\n    7876 => 632.0,\n    7877 => 615.0,\n    7878 => 632.0,\n    7879 => 615.0,\n    7880 => 295.0,\n    7881 => 278.0,\n    7882 => 295.0,\n    7883 => 278.0,\n    7884 => 787.0,\n    7885 => 612.0,\n    7886 => 787.0,\n    7887 => 612.0,\n    7888 => 787.0,\n    7889 => 612.0,\n    7890 => 787.0,\n    7891 => 612.0,\n    7892 => 787.0,\n    7893 => 612.0,\n    7894 => 787.0,\n    7895 => 612.0,\n    7896 => 787.0,\n    7897 => 612.0,\n    7898 => 913.0,\n    7899 => 612.0,\n    7900 => 913.0,\n    7901 => 612.0,\n    7902 => 913.0,\n    7903 => 612.0,\n    7904 => 913.0,\n    7905 => 612.0,\n    7906 => 913.0,\n    7907 => 612.0,\n    7908 => 732.0,\n    7909 => 634.0,\n    7910 => 732.0,\n    7911 => 634.0,\n    7912 => 858.0,\n    7913 => 634.0,\n    7914 => 858.0,\n    7915 => 634.0,\n    7916 => 858.0,\n    7917 => 634.0,\n    7918 => 858.0,\n    7919 => 634.0,\n    7920 => 858.0,\n    7921 => 634.0,\n    7922 => 611.0,\n    7923 => 592.0,\n    7924 => 611.0,\n    7925 => 592.0,\n    7926 => 611.0,\n    7927 => 592.0,\n    7928 => 611.0,\n    7929 => 592.0,\n    7930 => 769.0,\n    7931 => 477.0,\n    7936 => 659.0,\n    7937 => 659.0,\n    7938 => 659.0,\n    7939 => 659.0,\n    7940 => 659.0,\n    7941 => 659.0,\n    7942 => 659.0,\n    7943 => 659.0,\n    7944 => 684.0,\n    7945 => 684.0,\n    7946 => 877.0,\n    7947 => 877.0,\n    7948 => 769.0,\n    7949 => 801.0,\n    7950 => 708.0,\n    7951 => 743.0,\n    7952 => 541.0,\n    7953 => 541.0,\n    7954 => 541.0,\n    7955 => 541.0,\n    7956 => 541.0,\n    7957 => 541.0,\n    7960 => 711.0,\n    7961 => 711.0,\n    7962 => 966.0,\n    7963 => 975.0,\n    7964 => 898.0,\n    7965 => 928.0,\n    7968 => 634.0,\n    7969 => 634.0,\n    7970 => 634.0,\n    7971 => 634.0,\n    7972 => 634.0,\n    7973 => 634.0,\n    7974 => 634.0,\n    7975 => 634.0,\n    7976 => 837.0,\n    7977 => 835.0,\n    7978 => 1086.0,\n    7979 => 1089.0,\n    7980 => 1027.0,\n    7981 => 1051.0,\n    7982 => 934.0,\n    7983 => 947.0,\n    7984 => 338.0,\n    7985 => 338.0,\n    7986 => 338.0,\n    7987 => 338.0,\n    7988 => 338.0,\n    7989 => 338.0,\n    7990 => 338.0,\n    7991 => 338.0,\n    7992 => 380.0,\n    7993 => 374.0,\n    7994 => 635.0,\n    7995 => 635.0,\n    7996 => 570.0,\n    7997 => 600.0,\n    7998 => 489.0,\n    7999 => 493.0,\n    8000 => 612.0,\n    8001 => 612.0,\n    8002 => 612.0,\n    8003 => 612.0,\n    8004 => 612.0,\n    8005 => 612.0,\n    8008 => 804.0,\n    8009 => 848.0,\n    8010 => 1095.0,\n    8011 => 1100.0,\n    8012 => 938.0,\n    8013 => 970.0,\n    8016 => 579.0,\n    8017 => 579.0,\n    8018 => 579.0,\n    8019 => 579.0,\n    8020 => 579.0,\n    8021 => 579.0,\n    8022 => 579.0,\n    8023 => 579.0,\n    8025 => 784.0,\n    8027 => 998.0,\n    8029 => 1012.0,\n    8031 => 897.0,\n    8032 => 837.0,\n    8033 => 837.0,\n    8034 => 837.0,\n    8035 => 837.0,\n    8036 => 837.0,\n    8037 => 837.0,\n    8038 => 837.0,\n    8039 => 837.0,\n    8040 => 802.0,\n    8041 => 843.0,\n    8042 => 1089.0,\n    8043 => 1095.0,\n    8044 => 946.0,\n    8045 => 972.0,\n    8046 => 921.0,\n    8047 => 952.0,\n    8048 => 659.0,\n    8049 => 659.0,\n    8050 => 541.0,\n    8051 => 548.0,\n    8052 => 634.0,\n    8053 => 654.0,\n    8054 => 338.0,\n    8055 => 338.0,\n    8056 => 612.0,\n    8057 => 612.0,\n    8058 => 579.0,\n    8059 => 579.0,\n    8060 => 837.0,\n    8061 => 837.0,\n    8064 => 659.0,\n    8065 => 659.0,\n    8066 => 659.0,\n    8067 => 659.0,\n    8068 => 659.0,\n    8069 => 659.0,\n    8070 => 659.0,\n    8071 => 659.0,\n    8072 => 684.0,\n    8073 => 684.0,\n    8074 => 877.0,\n    8075 => 877.0,\n    8076 => 769.0,\n    8077 => 801.0,\n    8078 => 708.0,\n    8079 => 743.0,\n    8080 => 634.0,\n    8081 => 634.0,\n    8082 => 634.0,\n    8083 => 634.0,\n    8084 => 634.0,\n    8085 => 634.0,\n    8086 => 634.0,\n    8087 => 634.0,\n    8088 => 837.0,\n    8089 => 835.0,\n    8090 => 1086.0,\n    8091 => 1089.0,\n    8092 => 1027.0,\n    8093 => 1051.0,\n    8094 => 934.0,\n    8095 => 947.0,\n    8096 => 837.0,\n    8097 => 837.0,\n    8098 => 837.0,\n    8099 => 837.0,\n    8100 => 837.0,\n    8101 => 837.0,\n    8102 => 837.0,\n    8103 => 837.0,\n    8104 => 802.0,\n    8105 => 843.0,\n    8106 => 1089.0,\n    8107 => 1095.0,\n    8108 => 946.0,\n    8109 => 972.0,\n    8110 => 921.0,\n    8111 => 952.0,\n    8112 => 659.0,\n    8113 => 659.0,\n    8114 => 659.0,\n    8115 => 659.0,\n    8116 => 659.0,\n    8118 => 659.0,\n    8119 => 659.0,\n    8120 => 684.0,\n    8121 => 684.0,\n    8122 => 716.0,\n    8123 => 692.0,\n    8124 => 684.0,\n    8125 => 500.0,\n    8126 => 500.0,\n    8127 => 500.0,\n    8128 => 500.0,\n    8129 => 500.0,\n    8130 => 634.0,\n    8131 => 634.0,\n    8132 => 654.0,\n    8134 => 634.0,\n    8135 => 634.0,\n    8136 => 805.0,\n    8137 => 746.0,\n    8138 => 931.0,\n    8139 => 871.0,\n    8140 => 752.0,\n    8141 => 500.0,\n    8142 => 500.0,\n    8143 => 500.0,\n    8144 => 338.0,\n    8145 => 338.0,\n    8146 => 338.0,\n    8147 => 338.0,\n    8150 => 338.0,\n    8151 => 338.0,\n    8152 => 295.0,\n    8153 => 295.0,\n    8154 => 475.0,\n    8155 => 408.0,\n    8157 => 500.0,\n    8158 => 500.0,\n    8159 => 500.0,\n    8160 => 579.0,\n    8161 => 579.0,\n    8162 => 579.0,\n    8163 => 579.0,\n    8164 => 635.0,\n    8165 => 635.0,\n    8166 => 579.0,\n    8167 => 579.0,\n    8168 => 611.0,\n    8169 => 611.0,\n    8170 => 845.0,\n    8171 => 825.0,\n    8172 => 685.0,\n    8173 => 500.0,\n    8174 => 500.0,\n    8175 => 500.0,\n    8178 => 837.0,\n    8179 => 837.0,\n    8180 => 837.0,\n    8182 => 837.0,\n    8183 => 837.0,\n    8184 => 941.0,\n    8185 => 813.0,\n    8186 => 922.0,\n    8187 => 826.0,\n    8188 => 764.0,\n    8189 => 500.0,\n    8190 => 500.0,\n    8192 => 500.0,\n    8193 => 1000.0,\n    8194 => 500.0,\n    8195 => 1000.0,\n    8196 => 330.0,\n    8197 => 250.0,\n    8198 => 167.0,\n    8199 => 636.0,\n    8200 => 318.0,\n    8201 => 200.0,\n    8202 => 100.0,\n    8203 => 0.0,\n    8204 => 0.0,\n    8205 => 0.0,\n    8206 => 0.0,\n    8207 => 0.0,\n    8208 => 361.0,\n    8209 => 361.0,\n    8210 => 636.0,\n    8211 => 500.0,\n    8212 => 1000.0,\n    8213 => 1000.0,\n    8214 => 500.0,\n    8215 => 500.0,\n    8216 => 318.0,\n    8217 => 318.0,\n    8218 => 318.0,\n    8219 => 318.0,\n    8220 => 518.0,\n    8221 => 518.0,\n    8222 => 518.0,\n    8223 => 518.0,\n    8224 => 500.0,\n    8225 => 500.0,\n    8226 => 590.0,\n    8227 => 590.0,\n    8228 => 334.0,\n    8229 => 667.0,\n    8230 => 1000.0,\n    8231 => 318.0,\n    8232 => 0.0,\n    8233 => 0.0,\n    8234 => 0.0,\n    8235 => 0.0,\n    8236 => 0.0,\n    8237 => 0.0,\n    8238 => 0.0,\n    8239 => 200.0,\n    8240 => 1342.0,\n    8241 => 1735.0,\n    8242 => 227.0,\n    8243 => 374.0,\n    8244 => 520.0,\n    8245 => 227.0,\n    8246 => 374.0,\n    8247 => 520.0,\n    8248 => 339.0,\n    8249 => 400.0,\n    8250 => 400.0,\n    8251 => 838.0,\n    8252 => 485.0,\n    8253 => 531.0,\n    8254 => 500.0,\n    8255 => 804.0,\n    8256 => 804.0,\n    8257 => 250.0,\n    8258 => 1000.0,\n    8259 => 500.0,\n    8260 => 167.0,\n    8261 => 390.0,\n    8262 => 390.0,\n    8263 => 922.0,\n    8264 => 733.0,\n    8265 => 733.0,\n    8266 => 497.0,\n    8267 => 636.0,\n    8268 => 500.0,\n    8269 => 500.0,\n    8270 => 500.0,\n    8271 => 337.0,\n    8272 => 804.0,\n    8273 => 500.0,\n    8274 => 450.0,\n    8275 => 1000.0,\n    8276 => 804.0,\n    8277 => 838.0,\n    8278 => 586.0,\n    8279 => 663.0,\n    8280 => 838.0,\n    8281 => 838.0,\n    8282 => 318.0,\n    8283 => 797.0,\n    8284 => 838.0,\n    8285 => 318.0,\n    8286 => 318.0,\n    8287 => 222.0,\n    8288 => 0.0,\n    8289 => 0.0,\n    8290 => 0.0,\n    8291 => 0.0,\n    8292 => 0.0,\n    8298 => 0.0,\n    8299 => 0.0,\n    8300 => 0.0,\n    8301 => 0.0,\n    8302 => 0.0,\n    8303 => 0.0,\n    8304 => 401.0,\n    8305 => 179.0,\n    8308 => 401.0,\n    8309 => 401.0,\n    8310 => 401.0,\n    8311 => 401.0,\n    8312 => 401.0,\n    8313 => 401.0,\n    8314 => 528.0,\n    8315 => 528.0,\n    8316 => 528.0,\n    8317 => 246.0,\n    8318 => 246.0,\n    8319 => 398.0,\n    8320 => 401.0,\n    8321 => 401.0,\n    8322 => 401.0,\n    8323 => 401.0,\n    8324 => 401.0,\n    8325 => 401.0,\n    8326 => 401.0,\n    8327 => 401.0,\n    8328 => 401.0,\n    8329 => 401.0,\n    8330 => 528.0,\n    8331 => 528.0,\n    8332 => 528.0,\n    8333 => 246.0,\n    8334 => 246.0,\n    8336 => 392.0,\n    8337 => 417.0,\n    8338 => 414.0,\n    8339 => 444.0,\n    8340 => 417.0,\n    8341 => 404.0,\n    8342 => 426.0,\n    8343 => 166.0,\n    8344 => 623.0,\n    8345 => 398.0,\n    8346 => 428.0,\n    8347 => 373.0,\n    8348 => 295.0,\n    8352 => 877.0,\n    8353 => 636.0,\n    8354 => 636.0,\n    8355 => 636.0,\n    8356 => 636.0,\n    8357 => 974.0,\n    8358 => 636.0,\n    8359 => 1272.0,\n    8360 => 1074.0,\n    8361 => 989.0,\n    8362 => 784.0,\n    8363 => 636.0,\n    8364 => 636.0,\n    8365 => 636.0,\n    8366 => 636.0,\n    8367 => 1272.0,\n    8368 => 636.0,\n    8369 => 636.0,\n    8370 => 636.0,\n    8371 => 636.0,\n    8372 => 774.0,\n    8373 => 636.0,\n    8376 => 636.0,\n    8377 => 636.0,\n    8378 => 636.0,\n    8381 => 636.0,\n    8400 => 0.0,\n    8401 => 0.0,\n    8406 => 0.0,\n    8407 => 0.0,\n    8411 => 0.0,\n    8412 => 0.0,\n    8417 => 0.0,\n    8448 => 1019.0,\n    8449 => 1019.0,\n    8450 => 698.0,\n    8451 => 1123.0,\n    8452 => 642.0,\n    8453 => 1019.0,\n    8454 => 1067.0,\n    8455 => 614.0,\n    8456 => 698.0,\n    8457 => 952.0,\n    8459 => 988.0,\n    8460 => 754.0,\n    8461 => 850.0,\n    8462 => 634.0,\n    8463 => 634.0,\n    8464 => 470.0,\n    8465 => 697.0,\n    8466 => 720.0,\n    8467 => 413.0,\n    8468 => 818.0,\n    8469 => 801.0,\n    8470 => 1040.0,\n    8471 => 1000.0,\n    8472 => 697.0,\n    8473 => 701.0,\n    8474 => 787.0,\n    8475 => 798.0,\n    8476 => 814.0,\n    8477 => 792.0,\n    8478 => 896.0,\n    8479 => 684.0,\n    8480 => 1020.0,\n    8481 => 1074.0,\n    8482 => 1000.0,\n    8483 => 684.0,\n    8484 => 745.0,\n    8485 => 578.0,\n    8486 => 764.0,\n    8487 => 764.0,\n    8488 => 616.0,\n    8489 => 338.0,\n    8490 => 656.0,\n    8491 => 684.0,\n    8492 => 786.0,\n    8493 => 703.0,\n    8494 => 854.0,\n    8495 => 592.0,\n    8496 => 605.0,\n    8497 => 786.0,\n    8498 => 575.0,\n    8499 => 1069.0,\n    8500 => 462.0,\n    8501 => 745.0,\n    8502 => 674.0,\n    8503 => 466.0,\n    8504 => 645.0,\n    8505 => 380.0,\n    8506 => 926.0,\n    8507 => 1194.0,\n    8508 => 702.0,\n    8509 => 728.0,\n    8510 => 654.0,\n    8511 => 849.0,\n    8512 => 811.0,\n    8513 => 775.0,\n    8514 => 557.0,\n    8515 => 557.0,\n    8516 => 611.0,\n    8517 => 819.0,\n    8518 => 708.0,\n    8519 => 615.0,\n    8520 => 351.0,\n    8521 => 351.0,\n    8523 => 780.0,\n    8526 => 526.0,\n    8528 => 969.0,\n    8529 => 969.0,\n    8530 => 1370.0,\n    8531 => 969.0,\n    8532 => 969.0,\n    8533 => 969.0,\n    8534 => 969.0,\n    8535 => 969.0,\n    8536 => 969.0,\n    8537 => 969.0,\n    8538 => 969.0,\n    8539 => 969.0,\n    8540 => 969.0,\n    8541 => 969.0,\n    8542 => 969.0,\n    8543 => 568.0,\n    8544 => 295.0,\n    8545 => 492.0,\n    8546 => 689.0,\n    8547 => 923.0,\n    8548 => 684.0,\n    8549 => 922.0,\n    8550 => 1120.0,\n    8551 => 1317.0,\n    8552 => 917.0,\n    8553 => 685.0,\n    8554 => 933.0,\n    8555 => 1131.0,\n    8556 => 557.0,\n    8557 => 698.0,\n    8558 => 770.0,\n    8559 => 863.0,\n    8560 => 278.0,\n    8561 => 458.0,\n    8562 => 637.0,\n    8563 => 812.0,\n    8564 => 592.0,\n    8565 => 811.0,\n    8566 => 991.0,\n    8567 => 1170.0,\n    8568 => 819.0,\n    8569 => 592.0,\n    8570 => 822.0,\n    8571 => 1002.0,\n    8572 => 278.0,\n    8573 => 550.0,\n    8574 => 635.0,\n    8575 => 974.0,\n    8576 => 1245.0,\n    8577 => 770.0,\n    8578 => 1245.0,\n    8579 => 703.0,\n    8580 => 549.0,\n    8581 => 698.0,\n    8585 => 969.0,\n    8592 => 838.0,\n    8593 => 838.0,\n    8594 => 838.0,\n    8595 => 838.0,\n    8596 => 838.0,\n    8597 => 838.0,\n    8598 => 838.0,\n    8599 => 838.0,\n    8600 => 838.0,\n    8601 => 838.0,\n    8602 => 838.0,\n    8603 => 838.0,\n    8604 => 838.0,\n    8605 => 838.0,\n    8606 => 838.0,\n    8607 => 838.0,\n    8608 => 838.0,\n    8609 => 838.0,\n    8610 => 838.0,\n    8611 => 838.0,\n    8612 => 838.0,\n    8613 => 838.0,\n    8614 => 838.0,\n    8615 => 838.0,\n    8616 => 838.0,\n    8617 => 838.0,\n    8618 => 838.0,\n    8619 => 838.0,\n    8620 => 838.0,\n    8621 => 838.0,\n    8622 => 838.0,\n    8623 => 838.0,\n    8624 => 838.0,\n    8625 => 838.0,\n    8626 => 838.0,\n    8627 => 838.0,\n    8628 => 838.0,\n    8629 => 838.0,\n    8630 => 838.0,\n    8631 => 838.0,\n    8632 => 838.0,\n    8633 => 838.0,\n    8634 => 838.0,\n    8635 => 838.0,\n    8636 => 838.0,\n    8637 => 838.0,\n    8638 => 838.0,\n    8639 => 838.0,\n    8640 => 838.0,\n    8641 => 838.0,\n    8642 => 838.0,\n    8643 => 838.0,\n    8644 => 838.0,\n    8645 => 838.0,\n    8646 => 838.0,\n    8647 => 838.0,\n    8648 => 838.0,\n    8649 => 838.0,\n    8650 => 838.0,\n    8651 => 838.0,\n    8652 => 838.0,\n    8653 => 838.0,\n    8654 => 838.0,\n    8655 => 838.0,\n    8656 => 838.0,\n    8657 => 838.0,\n    8658 => 838.0,\n    8659 => 838.0,\n    8660 => 838.0,\n    8661 => 838.0,\n    8662 => 838.0,\n    8663 => 838.0,\n    8664 => 838.0,\n    8665 => 838.0,\n    8666 => 838.0,\n    8667 => 838.0,\n    8668 => 838.0,\n    8669 => 838.0,\n    8670 => 838.0,\n    8671 => 838.0,\n    8672 => 838.0,\n    8673 => 838.0,\n    8674 => 838.0,\n    8675 => 838.0,\n    8676 => 838.0,\n    8677 => 838.0,\n    8678 => 838.0,\n    8679 => 838.0,\n    8680 => 838.0,\n    8681 => 838.0,\n    8682 => 838.0,\n    8683 => 838.0,\n    8684 => 838.0,\n    8685 => 838.0,\n    8686 => 838.0,\n    8687 => 838.0,\n    8688 => 838.0,\n    8689 => 838.0,\n    8690 => 838.0,\n    8691 => 838.0,\n    8692 => 838.0,\n    8693 => 838.0,\n    8694 => 838.0,\n    8695 => 838.0,\n    8696 => 838.0,\n    8697 => 838.0,\n    8698 => 838.0,\n    8699 => 838.0,\n    8700 => 838.0,\n    8701 => 838.0,\n    8702 => 838.0,\n    8703 => 838.0,\n    8704 => 684.0,\n    8705 => 636.0,\n    8706 => 517.0,\n    8707 => 632.0,\n    8708 => 632.0,\n    8709 => 871.0,\n    8710 => 669.0,\n    8711 => 669.0,\n    8712 => 871.0,\n    8713 => 871.0,\n    8714 => 718.0,\n    8715 => 871.0,\n    8716 => 871.0,\n    8717 => 718.0,\n    8718 => 636.0,\n    8719 => 757.0,\n    8720 => 757.0,\n    8721 => 674.0,\n    8722 => 838.0,\n    8723 => 838.0,\n    8724 => 838.0,\n    8725 => 337.0,\n    8726 => 637.0,\n    8727 => 838.0,\n    8728 => 626.0,\n    8729 => 626.0,\n    8730 => 637.0,\n    8731 => 637.0,\n    8732 => 637.0,\n    8733 => 714.0,\n    8734 => 833.0,\n    8735 => 838.0,\n    8736 => 896.0,\n    8737 => 896.0,\n    8738 => 838.0,\n    8739 => 500.0,\n    8740 => 500.0,\n    8741 => 500.0,\n    8742 => 500.0,\n    8743 => 732.0,\n    8744 => 732.0,\n    8745 => 732.0,\n    8746 => 732.0,\n    8747 => 521.0,\n    8748 => 789.0,\n    8749 => 1057.0,\n    8750 => 521.0,\n    8751 => 789.0,\n    8752 => 1057.0,\n    8753 => 521.0,\n    8754 => 521.0,\n    8755 => 521.0,\n    8756 => 636.0,\n    8757 => 636.0,\n    8758 => 260.0,\n    8759 => 636.0,\n    8760 => 838.0,\n    8761 => 838.0,\n    8762 => 838.0,\n    8763 => 838.0,\n    8764 => 838.0,\n    8765 => 838.0,\n    8766 => 838.0,\n    8767 => 838.0,\n    8768 => 375.0,\n    8769 => 838.0,\n    8770 => 838.0,\n    8771 => 838.0,\n    8772 => 838.0,\n    8773 => 838.0,\n    8774 => 838.0,\n    8775 => 838.0,\n    8776 => 838.0,\n    8777 => 838.0,\n    8778 => 838.0,\n    8779 => 838.0,\n    8780 => 838.0,\n    8781 => 838.0,\n    8782 => 838.0,\n    8783 => 838.0,\n    8784 => 838.0,\n    8785 => 838.0,\n    8786 => 839.0,\n    8787 => 839.0,\n    8788 => 1000.0,\n    8789 => 1000.0,\n    8790 => 838.0,\n    8791 => 838.0,\n    8792 => 838.0,\n    8793 => 838.0,\n    8794 => 838.0,\n    8795 => 838.0,\n    8796 => 838.0,\n    8797 => 838.0,\n    8798 => 838.0,\n    8799 => 838.0,\n    8800 => 838.0,\n    8801 => 838.0,\n    8802 => 838.0,\n    8803 => 838.0,\n    8804 => 838.0,\n    8805 => 838.0,\n    8806 => 838.0,\n    8807 => 838.0,\n    8808 => 838.0,\n    8809 => 838.0,\n    8810 => 1047.0,\n    8811 => 1047.0,\n    8812 => 464.0,\n    8813 => 838.0,\n    8814 => 838.0,\n    8815 => 838.0,\n    8816 => 838.0,\n    8817 => 838.0,\n    8818 => 838.0,\n    8819 => 838.0,\n    8820 => 838.0,\n    8821 => 838.0,\n    8822 => 838.0,\n    8823 => 838.0,\n    8824 => 838.0,\n    8825 => 838.0,\n    8826 => 838.0,\n    8827 => 838.0,\n    8828 => 838.0,\n    8829 => 838.0,\n    8830 => 838.0,\n    8831 => 838.0,\n    8832 => 838.0,\n    8833 => 838.0,\n    8834 => 838.0,\n    8835 => 838.0,\n    8836 => 838.0,\n    8837 => 838.0,\n    8838 => 838.0,\n    8839 => 838.0,\n    8840 => 838.0,\n    8841 => 838.0,\n    8842 => 838.0,\n    8843 => 838.0,\n    8844 => 732.0,\n    8845 => 732.0,\n    8846 => 732.0,\n    8847 => 838.0,\n    8848 => 838.0,\n    8849 => 838.0,\n    8850 => 838.0,\n    8851 => 780.0,\n    8852 => 780.0,\n    8853 => 838.0,\n    8854 => 838.0,\n    8855 => 838.0,\n    8856 => 838.0,\n    8857 => 838.0,\n    8858 => 838.0,\n    8859 => 838.0,\n    8860 => 838.0,\n    8861 => 838.0,\n    8862 => 838.0,\n    8863 => 838.0,\n    8864 => 838.0,\n    8865 => 838.0,\n    8866 => 871.0,\n    8867 => 871.0,\n    8868 => 871.0,\n    8869 => 871.0,\n    8870 => 521.0,\n    8871 => 521.0,\n    8872 => 871.0,\n    8873 => 871.0,\n    8874 => 871.0,\n    8875 => 871.0,\n    8876 => 871.0,\n    8877 => 871.0,\n    8878 => 871.0,\n    8879 => 871.0,\n    8880 => 838.0,\n    8881 => 838.0,\n    8882 => 838.0,\n    8883 => 838.0,\n    8884 => 838.0,\n    8885 => 838.0,\n    8886 => 1000.0,\n    8887 => 1000.0,\n    8888 => 838.0,\n    8889 => 838.0,\n    8890 => 521.0,\n    8891 => 732.0,\n    8892 => 732.0,\n    8893 => 732.0,\n    8894 => 838.0,\n    8895 => 838.0,\n    8896 => 820.0,\n    8897 => 820.0,\n    8898 => 820.0,\n    8899 => 820.0,\n    8900 => 626.0,\n    8901 => 318.0,\n    8902 => 626.0,\n    8903 => 838.0,\n    8904 => 1000.0,\n    8905 => 1000.0,\n    8906 => 1000.0,\n    8907 => 1000.0,\n    8908 => 1000.0,\n    8909 => 838.0,\n    8910 => 732.0,\n    8911 => 732.0,\n    8912 => 838.0,\n    8913 => 838.0,\n    8914 => 838.0,\n    8915 => 838.0,\n    8916 => 838.0,\n    8917 => 838.0,\n    8918 => 838.0,\n    8919 => 838.0,\n    8920 => 1422.0,\n    8921 => 1422.0,\n    8922 => 838.0,\n    8923 => 838.0,\n    8924 => 838.0,\n    8925 => 838.0,\n    8926 => 838.0,\n    8927 => 838.0,\n    8928 => 838.0,\n    8929 => 838.0,\n    8930 => 838.0,\n    8931 => 838.0,\n    8932 => 838.0,\n    8933 => 838.0,\n    8934 => 838.0,\n    8935 => 838.0,\n    8936 => 838.0,\n    8937 => 838.0,\n    8938 => 838.0,\n    8939 => 838.0,\n    8940 => 838.0,\n    8941 => 838.0,\n    8942 => 1000.0,\n    8943 => 1000.0,\n    8944 => 1000.0,\n    8945 => 1000.0,\n    8946 => 1000.0,\n    8947 => 871.0,\n    8948 => 718.0,\n    8949 => 871.0,\n    8950 => 871.0,\n    8951 => 718.0,\n    8952 => 871.0,\n    8953 => 871.0,\n    8954 => 1000.0,\n    8955 => 871.0,\n    8956 => 718.0,\n    8957 => 871.0,\n    8958 => 718.0,\n    8959 => 871.0,\n    8960 => 602.0,\n    8961 => 602.0,\n    8962 => 635.0,\n    8963 => 838.0,\n    8964 => 838.0,\n    8965 => 838.0,\n    8966 => 838.0,\n    8967 => 488.0,\n    8968 => 390.0,\n    8969 => 390.0,\n    8970 => 390.0,\n    8971 => 390.0,\n    8972 => 809.0,\n    8973 => 809.0,\n    8974 => 809.0,\n    8975 => 809.0,\n    8976 => 838.0,\n    8977 => 513.0,\n    8984 => 1000.0,\n    8985 => 838.0,\n    8988 => 469.0,\n    8989 => 469.0,\n    8990 => 469.0,\n    8991 => 469.0,\n    8992 => 521.0,\n    8993 => 521.0,\n    8996 => 1152.0,\n    8997 => 1152.0,\n    8998 => 1414.0,\n    8999 => 1152.0,\n    9000 => 1443.0,\n    9003 => 1414.0,\n    9004 => 873.0,\n    9075 => 338.0,\n    9076 => 635.0,\n    9077 => 837.0,\n    9082 => 659.0,\n    9085 => 757.0,\n    9095 => 1152.0,\n    9108 => 873.0,\n    9115 => 500.0,\n    9116 => 500.0,\n    9117 => 500.0,\n    9118 => 500.0,\n    9119 => 500.0,\n    9120 => 500.0,\n    9121 => 500.0,\n    9122 => 500.0,\n    9123 => 500.0,\n    9124 => 500.0,\n    9125 => 500.0,\n    9126 => 500.0,\n    9127 => 750.0,\n    9128 => 750.0,\n    9129 => 750.0,\n    9130 => 750.0,\n    9131 => 750.0,\n    9132 => 750.0,\n    9133 => 750.0,\n    9134 => 521.0,\n    9166 => 838.0,\n    9167 => 945.0,\n    9187 => 873.0,\n    9189 => 769.0,\n    9192 => 636.0,\n    9250 => 635.0,\n    9251 => 635.0,\n    9312 => 896.0,\n    9313 => 896.0,\n    9314 => 896.0,\n    9315 => 896.0,\n    9316 => 896.0,\n    9317 => 896.0,\n    9318 => 896.0,\n    9319 => 896.0,\n    9320 => 896.0,\n    9321 => 896.0,\n    9472 => 602.0,\n    9473 => 602.0,\n    9474 => 602.0,\n    9475 => 602.0,\n    9476 => 602.0,\n    9477 => 602.0,\n    9478 => 602.0,\n    9479 => 602.0,\n    9480 => 602.0,\n    9481 => 602.0,\n    9482 => 602.0,\n    9483 => 602.0,\n    9484 => 602.0,\n    9485 => 602.0,\n    9486 => 602.0,\n    9487 => 602.0,\n    9488 => 602.0,\n    9489 => 602.0,\n    9490 => 602.0,\n    9491 => 602.0,\n    9492 => 602.0,\n    9493 => 602.0,\n    9494 => 602.0,\n    9495 => 602.0,\n    9496 => 602.0,\n    9497 => 602.0,\n    9498 => 602.0,\n    9499 => 602.0,\n    9500 => 602.0,\n    9501 => 602.0,\n    9502 => 602.0,\n    9503 => 602.0,\n    9504 => 602.0,\n    9505 => 602.0,\n    9506 => 602.0,\n    9507 => 602.0,\n    9508 => 602.0,\n    9509 => 602.0,\n    9510 => 602.0,\n    9511 => 602.0,\n    9512 => 602.0,\n    9513 => 602.0,\n    9514 => 602.0,\n    9515 => 602.0,\n    9516 => 602.0,\n    9517 => 602.0,\n    9518 => 602.0,\n    9519 => 602.0,\n    9520 => 602.0,\n    9521 => 602.0,\n    9522 => 602.0,\n    9523 => 602.0,\n    9524 => 602.0,\n    9525 => 602.0,\n    9526 => 602.0,\n    9527 => 602.0,\n    9528 => 602.0,\n    9529 => 602.0,\n    9530 => 602.0,\n    9531 => 602.0,\n    9532 => 602.0,\n    9533 => 602.0,\n    9534 => 602.0,\n    9535 => 602.0,\n    9536 => 602.0,\n    9537 => 602.0,\n    9538 => 602.0,\n    9539 => 602.0,\n    9540 => 602.0,\n    9541 => 602.0,\n    9542 => 602.0,\n    9543 => 602.0,\n    9544 => 602.0,\n    9545 => 602.0,\n    9546 => 602.0,\n    9547 => 602.0,\n    9548 => 602.0,\n    9549 => 602.0,\n    9550 => 602.0,\n    9551 => 602.0,\n    9552 => 602.0,\n    9553 => 602.0,\n    9554 => 602.0,\n    9555 => 602.0,\n    9556 => 602.0,\n    9557 => 602.0,\n    9558 => 602.0,\n    9559 => 602.0,\n    9560 => 602.0,\n    9561 => 602.0,\n    9562 => 602.0,\n    9563 => 602.0,\n    9564 => 602.0,\n    9565 => 602.0,\n    9566 => 602.0,\n    9567 => 602.0,\n    9568 => 602.0,\n    9569 => 602.0,\n    9570 => 602.0,\n    9571 => 602.0,\n    9572 => 602.0,\n    9573 => 602.0,\n    9574 => 602.0,\n    9575 => 602.0,\n    9576 => 602.0,\n    9577 => 602.0,\n    9578 => 602.0,\n    9579 => 602.0,\n    9580 => 602.0,\n    9581 => 602.0,\n    9582 => 602.0,\n    9583 => 602.0,\n    9584 => 602.0,\n    9585 => 602.0,\n    9586 => 602.0,\n    9587 => 602.0,\n    9588 => 602.0,\n    9589 => 602.0,\n    9590 => 602.0,\n    9591 => 602.0,\n    9592 => 602.0,\n    9593 => 602.0,\n    9594 => 602.0,\n    9595 => 602.0,\n    9596 => 602.0,\n    9597 => 602.0,\n    9598 => 602.0,\n    9599 => 602.0,\n    9600 => 769.0,\n    9601 => 769.0,\n    9602 => 769.0,\n    9603 => 769.0,\n    9604 => 769.0,\n    9605 => 769.0,\n    9606 => 769.0,\n    9607 => 769.0,\n    9608 => 769.0,\n    9609 => 769.0,\n    9610 => 769.0,\n    9611 => 769.0,\n    9612 => 769.0,\n    9613 => 769.0,\n    9614 => 769.0,\n    9615 => 769.0,\n    9616 => 769.0,\n    9617 => 769.0,\n    9618 => 769.0,\n    9619 => 769.0,\n    9620 => 769.0,\n    9621 => 769.0,\n    9622 => 769.0,\n    9623 => 769.0,\n    9624 => 769.0,\n    9625 => 769.0,\n    9626 => 769.0,\n    9627 => 769.0,\n    9628 => 769.0,\n    9629 => 769.0,\n    9630 => 769.0,\n    9631 => 769.0,\n    9632 => 945.0,\n    9633 => 945.0,\n    9634 => 945.0,\n    9635 => 945.0,\n    9636 => 945.0,\n    9637 => 945.0,\n    9638 => 945.0,\n    9639 => 945.0,\n    9640 => 945.0,\n    9641 => 945.0,\n    9642 => 678.0,\n    9643 => 678.0,\n    9644 => 945.0,\n    9645 => 945.0,\n    9646 => 550.0,\n    9647 => 550.0,\n    9648 => 769.0,\n    9649 => 769.0,\n    9650 => 769.0,\n    9651 => 769.0,\n    9652 => 502.0,\n    9653 => 502.0,\n    9654 => 769.0,\n    9655 => 769.0,\n    9656 => 502.0,\n    9657 => 502.0,\n    9658 => 769.0,\n    9659 => 769.0,\n    9660 => 769.0,\n    9661 => 769.0,\n    9662 => 502.0,\n    9663 => 502.0,\n    9664 => 769.0,\n    9665 => 769.0,\n    9666 => 502.0,\n    9667 => 502.0,\n    9668 => 769.0,\n    9669 => 769.0,\n    9670 => 769.0,\n    9671 => 769.0,\n    9672 => 769.0,\n    9673 => 873.0,\n    9674 => 494.0,\n    9675 => 873.0,\n    9676 => 873.0,\n    9677 => 873.0,\n    9678 => 873.0,\n    9679 => 873.0,\n    9680 => 873.0,\n    9681 => 873.0,\n    9682 => 873.0,\n    9683 => 873.0,\n    9684 => 873.0,\n    9685 => 873.0,\n    9686 => 527.0,\n    9687 => 527.0,\n    9688 => 791.0,\n    9689 => 970.0,\n    9690 => 970.0,\n    9691 => 970.0,\n    9692 => 387.0,\n    9693 => 387.0,\n    9694 => 387.0,\n    9695 => 387.0,\n    9696 => 873.0,\n    9697 => 873.0,\n    9698 => 769.0,\n    9699 => 769.0,\n    9700 => 769.0,\n    9701 => 769.0,\n    9702 => 590.0,\n    9703 => 945.0,\n    9704 => 945.0,\n    9705 => 945.0,\n    9706 => 945.0,\n    9707 => 945.0,\n    9708 => 769.0,\n    9709 => 769.0,\n    9710 => 769.0,\n    9711 => 1119.0,\n    9712 => 945.0,\n    9713 => 945.0,\n    9714 => 945.0,\n    9715 => 945.0,\n    9716 => 873.0,\n    9717 => 873.0,\n    9718 => 873.0,\n    9719 => 873.0,\n    9720 => 769.0,\n    9721 => 769.0,\n    9722 => 769.0,\n    9723 => 830.0,\n    9724 => 830.0,\n    9725 => 732.0,\n    9726 => 732.0,\n    9727 => 769.0,\n    9728 => 896.0,\n    9729 => 1000.0,\n    9730 => 896.0,\n    9731 => 896.0,\n    9732 => 896.0,\n    9733 => 896.0,\n    9734 => 896.0,\n    9735 => 573.0,\n    9736 => 896.0,\n    9737 => 896.0,\n    9738 => 888.0,\n    9739 => 888.0,\n    9740 => 671.0,\n    9741 => 1013.0,\n    9742 => 1246.0,\n    9743 => 1250.0,\n    9744 => 896.0,\n    9745 => 896.0,\n    9746 => 896.0,\n    9747 => 532.0,\n    9748 => 896.0,\n    9749 => 896.0,\n    9750 => 896.0,\n    9751 => 896.0,\n    9752 => 896.0,\n    9753 => 896.0,\n    9754 => 896.0,\n    9755 => 896.0,\n    9756 => 896.0,\n    9757 => 609.0,\n    9758 => 896.0,\n    9759 => 609.0,\n    9760 => 896.0,\n    9761 => 896.0,\n    9762 => 896.0,\n    9763 => 896.0,\n    9764 => 669.0,\n    9765 => 746.0,\n    9766 => 649.0,\n    9767 => 784.0,\n    9768 => 545.0,\n    9769 => 896.0,\n    9770 => 896.0,\n    9771 => 896.0,\n    9772 => 710.0,\n    9773 => 896.0,\n    9774 => 896.0,\n    9775 => 896.0,\n    9776 => 896.0,\n    9777 => 896.0,\n    9778 => 896.0,\n    9779 => 896.0,\n    9780 => 896.0,\n    9781 => 896.0,\n    9782 => 896.0,\n    9783 => 896.0,\n    9784 => 896.0,\n    9785 => 1042.0,\n    9786 => 1042.0,\n    9787 => 1042.0,\n    9788 => 896.0,\n    9789 => 896.0,\n    9790 => 896.0,\n    9791 => 614.0,\n    9792 => 732.0,\n    9793 => 732.0,\n    9794 => 896.0,\n    9795 => 896.0,\n    9796 => 896.0,\n    9797 => 896.0,\n    9798 => 896.0,\n    9799 => 896.0,\n    9800 => 896.0,\n    9801 => 896.0,\n    9802 => 896.0,\n    9803 => 896.0,\n    9804 => 896.0,\n    9805 => 896.0,\n    9806 => 896.0,\n    9807 => 896.0,\n    9808 => 896.0,\n    9809 => 896.0,\n    9810 => 896.0,\n    9811 => 896.0,\n    9812 => 896.0,\n    9813 => 896.0,\n    9814 => 896.0,\n    9815 => 896.0,\n    9816 => 896.0,\n    9817 => 896.0,\n    9818 => 896.0,\n    9819 => 896.0,\n    9820 => 896.0,\n    9821 => 896.0,\n    9822 => 896.0,\n    9823 => 896.0,\n    9824 => 896.0,\n    9825 => 896.0,\n    9826 => 896.0,\n    9827 => 896.0,\n    9828 => 896.0,\n    9829 => 896.0,\n    9830 => 896.0,\n    9831 => 896.0,\n    9832 => 896.0,\n    9833 => 472.0,\n    9834 => 638.0,\n    9835 => 896.0,\n    9836 => 896.0,\n    9837 => 472.0,\n    9838 => 357.0,\n    9839 => 484.0,\n    9840 => 748.0,\n    9841 => 766.0,\n    9842 => 896.0,\n    9843 => 896.0,\n    9844 => 896.0,\n    9845 => 896.0,\n    9846 => 896.0,\n    9847 => 896.0,\n    9848 => 896.0,\n    9849 => 896.0,\n    9850 => 896.0,\n    9851 => 896.0,\n    9852 => 896.0,\n    9853 => 896.0,\n    9854 => 896.0,\n    9855 => 896.0,\n    9856 => 869.0,\n    9857 => 869.0,\n    9858 => 869.0,\n    9859 => 869.0,\n    9860 => 869.0,\n    9861 => 869.0,\n    9862 => 896.0,\n    9863 => 896.0,\n    9864 => 896.0,\n    9865 => 896.0,\n    9866 => 896.0,\n    9867 => 896.0,\n    9868 => 896.0,\n    9869 => 896.0,\n    9870 => 896.0,\n    9871 => 896.0,\n    9872 => 896.0,\n    9873 => 896.0,\n    9874 => 896.0,\n    9875 => 896.0,\n    9876 => 896.0,\n    9877 => 541.0,\n    9878 => 896.0,\n    9879 => 896.0,\n    9880 => 896.0,\n    9881 => 896.0,\n    9882 => 896.0,\n    9883 => 896.0,\n    9884 => 896.0,\n    9886 => 896.0,\n    9887 => 896.0,\n    9888 => 896.0,\n    9889 => 702.0,\n    9890 => 1004.0,\n    9891 => 1089.0,\n    9892 => 1175.0,\n    9893 => 903.0,\n    9894 => 838.0,\n    9895 => 838.0,\n    9896 => 838.0,\n    9897 => 838.0,\n    9898 => 838.0,\n    9899 => 838.0,\n    9900 => 838.0,\n    9901 => 838.0,\n    9902 => 838.0,\n    9903 => 838.0,\n    9904 => 844.0,\n    9905 => 838.0,\n    9906 => 732.0,\n    9907 => 732.0,\n    9908 => 732.0,\n    9909 => 732.0,\n    9910 => 850.0,\n    9911 => 732.0,\n    9912 => 732.0,\n    9920 => 838.0,\n    9921 => 838.0,\n    9922 => 838.0,\n    9923 => 838.0,\n    9954 => 732.0,\n    9985 => 838.0,\n    9986 => 838.0,\n    9987 => 838.0,\n    9988 => 838.0,\n    9990 => 838.0,\n    9991 => 838.0,\n    9992 => 838.0,\n    9993 => 838.0,\n    9996 => 838.0,\n    9997 => 838.0,\n    9998 => 838.0,\n    9999 => 838.0,\n    10000 => 838.0,\n    10001 => 838.0,\n    10002 => 838.0,\n    10003 => 838.0,\n    10004 => 838.0,\n    10005 => 838.0,\n    10006 => 838.0,\n    10007 => 838.0,\n    10008 => 838.0,\n    10009 => 838.0,\n    10010 => 838.0,\n    10011 => 838.0,\n    10012 => 838.0,\n    10013 => 838.0,\n    10014 => 838.0,\n    10015 => 838.0,\n    10016 => 838.0,\n    10017 => 838.0,\n    10018 => 838.0,\n    10019 => 838.0,\n    10020 => 838.0,\n    10021 => 838.0,\n    10022 => 838.0,\n    10023 => 838.0,\n    10025 => 838.0,\n    10026 => 838.0,\n    10027 => 838.0,\n    10028 => 838.0,\n    10029 => 838.0,\n    10030 => 838.0,\n    10031 => 838.0,\n    10032 => 838.0,\n    10033 => 838.0,\n    10034 => 838.0,\n    10035 => 838.0,\n    10036 => 838.0,\n    10037 => 838.0,\n    10038 => 838.0,\n    10039 => 838.0,\n    10040 => 838.0,\n    10041 => 838.0,\n    10042 => 838.0,\n    10043 => 838.0,\n    10044 => 838.0,\n    10045 => 838.0,\n    10046 => 838.0,\n    10047 => 838.0,\n    10048 => 838.0,\n    10049 => 838.0,\n    10050 => 838.0,\n    10051 => 838.0,\n    10052 => 838.0,\n    10053 => 838.0,\n    10054 => 838.0,\n    10055 => 838.0,\n    10056 => 838.0,\n    10057 => 838.0,\n    10058 => 838.0,\n    10059 => 838.0,\n    10061 => 896.0,\n    10063 => 896.0,\n    10064 => 896.0,\n    10065 => 896.0,\n    10066 => 896.0,\n    10070 => 896.0,\n    10072 => 838.0,\n    10073 => 838.0,\n    10074 => 838.0,\n    10075 => 322.0,\n    10076 => 322.0,\n    10077 => 538.0,\n    10078 => 538.0,\n    10081 => 838.0,\n    10082 => 838.0,\n    10083 => 838.0,\n    10084 => 838.0,\n    10085 => 838.0,\n    10086 => 838.0,\n    10087 => 838.0,\n    10088 => 838.0,\n    10089 => 838.0,\n    10090 => 838.0,\n    10091 => 838.0,\n    10092 => 838.0,\n    10093 => 838.0,\n    10094 => 838.0,\n    10095 => 838.0,\n    10096 => 838.0,\n    10097 => 838.0,\n    10098 => 838.0,\n    10099 => 838.0,\n    10100 => 838.0,\n    10101 => 838.0,\n    10102 => 896.0,\n    10103 => 896.0,\n    10104 => 896.0,\n    10105 => 896.0,\n    10106 => 896.0,\n    10107 => 896.0,\n    10108 => 896.0,\n    10109 => 896.0,\n    10110 => 896.0,\n    10111 => 896.0,\n    10112 => 838.0,\n    10113 => 838.0,\n    10114 => 838.0,\n    10115 => 838.0,\n    10116 => 838.0,\n    10117 => 838.0,\n    10118 => 838.0,\n    10119 => 838.0,\n    10120 => 838.0,\n    10121 => 838.0,\n    10122 => 838.0,\n    10123 => 838.0,\n    10124 => 838.0,\n    10125 => 838.0,\n    10126 => 838.0,\n    10127 => 838.0,\n    10128 => 838.0,\n    10129 => 838.0,\n    10130 => 838.0,\n    10131 => 838.0,\n    10132 => 838.0,\n    10136 => 838.0,\n    10137 => 838.0,\n    10138 => 838.0,\n    10139 => 838.0,\n    10140 => 838.0,\n    10141 => 838.0,\n    10142 => 838.0,\n    10143 => 838.0,\n    10144 => 838.0,\n    10145 => 838.0,\n    10146 => 838.0,\n    10147 => 838.0,\n    10148 => 838.0,\n    10149 => 838.0,\n    10150 => 838.0,\n    10151 => 838.0,\n    10152 => 838.0,\n    10153 => 838.0,\n    10154 => 838.0,\n    10155 => 838.0,\n    10156 => 838.0,\n    10157 => 838.0,\n    10158 => 838.0,\n    10159 => 838.0,\n    10161 => 838.0,\n    10162 => 838.0,\n    10163 => 838.0,\n    10164 => 838.0,\n    10165 => 838.0,\n    10166 => 838.0,\n    10167 => 838.0,\n    10168 => 838.0,\n    10169 => 838.0,\n    10170 => 838.0,\n    10171 => 838.0,\n    10172 => 838.0,\n    10173 => 838.0,\n    10174 => 838.0,\n    10181 => 390.0,\n    10182 => 390.0,\n    10208 => 494.0,\n    10214 => 495.0,\n    10215 => 495.0,\n    10216 => 390.0,\n    10217 => 390.0,\n    10218 => 556.0,\n    10219 => 556.0,\n    10224 => 838.0,\n    10225 => 838.0,\n    10226 => 838.0,\n    10227 => 838.0,\n    10228 => 1157.0,\n    10229 => 1434.0,\n    10230 => 1434.0,\n    10231 => 1434.0,\n    10232 => 1434.0,\n    10233 => 1434.0,\n    10234 => 1434.0,\n    10235 => 1434.0,\n    10236 => 1434.0,\n    10237 => 1434.0,\n    10238 => 1434.0,\n    10239 => 1434.0,\n    10240 => 732.0,\n    10241 => 732.0,\n    10242 => 732.0,\n    10243 => 732.0,\n    10244 => 732.0,\n    10245 => 732.0,\n    10246 => 732.0,\n    10247 => 732.0,\n    10248 => 732.0,\n    10249 => 732.0,\n    10250 => 732.0,\n    10251 => 732.0,\n    10252 => 732.0,\n    10253 => 732.0,\n    10254 => 732.0,\n    10255 => 732.0,\n    10256 => 732.0,\n    10257 => 732.0,\n    10258 => 732.0,\n    10259 => 732.0,\n    10260 => 732.0,\n    10261 => 732.0,\n    10262 => 732.0,\n    10263 => 732.0,\n    10264 => 732.0,\n    10265 => 732.0,\n    10266 => 732.0,\n    10267 => 732.0,\n    10268 => 732.0,\n    10269 => 732.0,\n    10270 => 732.0,\n    10271 => 732.0,\n    10272 => 732.0,\n    10273 => 732.0,\n    10274 => 732.0,\n    10275 => 732.0,\n    10276 => 732.0,\n    10277 => 732.0,\n    10278 => 732.0,\n    10279 => 732.0,\n    10280 => 732.0,\n    10281 => 732.0,\n    10282 => 732.0,\n    10283 => 732.0,\n    10284 => 732.0,\n    10285 => 732.0,\n    10286 => 732.0,\n    10287 => 732.0,\n    10288 => 732.0,\n    10289 => 732.0,\n    10290 => 732.0,\n    10291 => 732.0,\n    10292 => 732.0,\n    10293 => 732.0,\n    10294 => 732.0,\n    10295 => 732.0,\n    10296 => 732.0,\n    10297 => 732.0,\n    10298 => 732.0,\n    10299 => 732.0,\n    10300 => 732.0,\n    10301 => 732.0,\n    10302 => 732.0,\n    10303 => 732.0,\n    10304 => 732.0,\n    10305 => 732.0,\n    10306 => 732.0,\n    10307 => 732.0,\n    10308 => 732.0,\n    10309 => 732.0,\n    10310 => 732.0,\n    10311 => 732.0,\n    10312 => 732.0,\n    10313 => 732.0,\n    10314 => 732.0,\n    10315 => 732.0,\n    10316 => 732.0,\n    10317 => 732.0,\n    10318 => 732.0,\n    10319 => 732.0,\n    10320 => 732.0,\n    10321 => 732.0,\n    10322 => 732.0,\n    10323 => 732.0,\n    10324 => 732.0,\n    10325 => 732.0,\n    10326 => 732.0,\n    10327 => 732.0,\n    10328 => 732.0,\n    10329 => 732.0,\n    10330 => 732.0,\n    10331 => 732.0,\n    10332 => 732.0,\n    10333 => 732.0,\n    10334 => 732.0,\n    10335 => 732.0,\n    10336 => 732.0,\n    10337 => 732.0,\n    10338 => 732.0,\n    10339 => 732.0,\n    10340 => 732.0,\n    10341 => 732.0,\n    10342 => 732.0,\n    10343 => 732.0,\n    10344 => 732.0,\n    10345 => 732.0,\n    10346 => 732.0,\n    10347 => 732.0,\n    10348 => 732.0,\n    10349 => 732.0,\n    10350 => 732.0,\n    10351 => 732.0,\n    10352 => 732.0,\n    10353 => 732.0,\n    10354 => 732.0,\n    10355 => 732.0,\n    10356 => 732.0,\n    10357 => 732.0,\n    10358 => 732.0,\n    10359 => 732.0,\n    10360 => 732.0,\n    10361 => 732.0,\n    10362 => 732.0,\n    10363 => 732.0,\n    10364 => 732.0,\n    10365 => 732.0,\n    10366 => 732.0,\n    10367 => 732.0,\n    10368 => 732.0,\n    10369 => 732.0,\n    10370 => 732.0,\n    10371 => 732.0,\n    10372 => 732.0,\n    10373 => 732.0,\n    10374 => 732.0,\n    10375 => 732.0,\n    10376 => 732.0,\n    10377 => 732.0,\n    10378 => 732.0,\n    10379 => 732.0,\n    10380 => 732.0,\n    10381 => 732.0,\n    10382 => 732.0,\n    10383 => 732.0,\n    10384 => 732.0,\n    10385 => 732.0,\n    10386 => 732.0,\n    10387 => 732.0,\n    10388 => 732.0,\n    10389 => 732.0,\n    10390 => 732.0,\n    10391 => 732.0,\n    10392 => 732.0,\n    10393 => 732.0,\n    10394 => 732.0,\n    10395 => 732.0,\n    10396 => 732.0,\n    10397 => 732.0,\n    10398 => 732.0,\n    10399 => 732.0,\n    10400 => 732.0,\n    10401 => 732.0,\n    10402 => 732.0,\n    10403 => 732.0,\n    10404 => 732.0,\n    10405 => 732.0,\n    10406 => 732.0,\n    10407 => 732.0,\n    10408 => 732.0,\n    10409 => 732.0,\n    10410 => 732.0,\n    10411 => 732.0,\n    10412 => 732.0,\n    10413 => 732.0,\n    10414 => 732.0,\n    10415 => 732.0,\n    10416 => 732.0,\n    10417 => 732.0,\n    10418 => 732.0,\n    10419 => 732.0,\n    10420 => 732.0,\n    10421 => 732.0,\n    10422 => 732.0,\n    10423 => 732.0,\n    10424 => 732.0,\n    10425 => 732.0,\n    10426 => 732.0,\n    10427 => 732.0,\n    10428 => 732.0,\n    10429 => 732.0,\n    10430 => 732.0,\n    10431 => 732.0,\n    10432 => 732.0,\n    10433 => 732.0,\n    10434 => 732.0,\n    10435 => 732.0,\n    10436 => 732.0,\n    10437 => 732.0,\n    10438 => 732.0,\n    10439 => 732.0,\n    10440 => 732.0,\n    10441 => 732.0,\n    10442 => 732.0,\n    10443 => 732.0,\n    10444 => 732.0,\n    10445 => 732.0,\n    10446 => 732.0,\n    10447 => 732.0,\n    10448 => 732.0,\n    10449 => 732.0,\n    10450 => 732.0,\n    10451 => 732.0,\n    10452 => 732.0,\n    10453 => 732.0,\n    10454 => 732.0,\n    10455 => 732.0,\n    10456 => 732.0,\n    10457 => 732.0,\n    10458 => 732.0,\n    10459 => 732.0,\n    10460 => 732.0,\n    10461 => 732.0,\n    10462 => 732.0,\n    10463 => 732.0,\n    10464 => 732.0,\n    10465 => 732.0,\n    10466 => 732.0,\n    10467 => 732.0,\n    10468 => 732.0,\n    10469 => 732.0,\n    10470 => 732.0,\n    10471 => 732.0,\n    10472 => 732.0,\n    10473 => 732.0,\n    10474 => 732.0,\n    10475 => 732.0,\n    10476 => 732.0,\n    10477 => 732.0,\n    10478 => 732.0,\n    10479 => 732.0,\n    10480 => 732.0,\n    10481 => 732.0,\n    10482 => 732.0,\n    10483 => 732.0,\n    10484 => 732.0,\n    10485 => 732.0,\n    10486 => 732.0,\n    10487 => 732.0,\n    10488 => 732.0,\n    10489 => 732.0,\n    10490 => 732.0,\n    10491 => 732.0,\n    10492 => 732.0,\n    10493 => 732.0,\n    10494 => 732.0,\n    10495 => 732.0,\n    10502 => 838.0,\n    10503 => 838.0,\n    10506 => 838.0,\n    10507 => 838.0,\n    10560 => 683.0,\n    10561 => 683.0,\n    10627 => 734.0,\n    10628 => 734.0,\n    10702 => 838.0,\n    10703 => 1000.0,\n    10704 => 1000.0,\n    10705 => 1000.0,\n    10706 => 1000.0,\n    10707 => 1000.0,\n    10708 => 1000.0,\n    10709 => 1000.0,\n    10731 => 494.0,\n    10746 => 838.0,\n    10747 => 838.0,\n    10752 => 1000.0,\n    10753 => 1000.0,\n    10754 => 1000.0,\n    10764 => 1325.0,\n    10765 => 521.0,\n    10766 => 521.0,\n    10767 => 521.0,\n    10768 => 521.0,\n    10769 => 521.0,\n    10770 => 521.0,\n    10771 => 521.0,\n    10772 => 521.0,\n    10773 => 521.0,\n    10774 => 521.0,\n    10775 => 521.0,\n    10776 => 521.0,\n    10777 => 521.0,\n    10778 => 521.0,\n    10779 => 521.0,\n    10780 => 521.0,\n    10799 => 838.0,\n    10858 => 838.0,\n    10859 => 838.0,\n    10877 => 838.0,\n    10878 => 838.0,\n    10879 => 838.0,\n    10880 => 838.0,\n    10881 => 838.0,\n    10882 => 838.0,\n    10883 => 838.0,\n    10884 => 838.0,\n    10885 => 838.0,\n    10886 => 838.0,\n    10887 => 838.0,\n    10888 => 838.0,\n    10889 => 838.0,\n    10890 => 838.0,\n    10891 => 838.0,\n    10892 => 838.0,\n    10893 => 838.0,\n    10894 => 838.0,\n    10895 => 838.0,\n    10896 => 838.0,\n    10897 => 838.0,\n    10898 => 838.0,\n    10899 => 838.0,\n    10900 => 838.0,\n    10901 => 838.0,\n    10902 => 838.0,\n    10903 => 838.0,\n    10904 => 838.0,\n    10905 => 838.0,\n    10906 => 838.0,\n    10907 => 838.0,\n    10908 => 838.0,\n    10909 => 838.0,\n    10910 => 838.0,\n    10911 => 838.0,\n    10912 => 838.0,\n    10926 => 838.0,\n    10927 => 838.0,\n    10928 => 838.0,\n    10929 => 838.0,\n    10930 => 838.0,\n    10931 => 838.0,\n    10932 => 838.0,\n    10933 => 838.0,\n    10934 => 838.0,\n    10935 => 838.0,\n    10936 => 838.0,\n    10937 => 838.0,\n    10938 => 838.0,\n    11001 => 838.0,\n    11002 => 838.0,\n    11008 => 838.0,\n    11009 => 838.0,\n    11010 => 838.0,\n    11011 => 838.0,\n    11012 => 838.0,\n    11013 => 838.0,\n    11014 => 838.0,\n    11015 => 838.0,\n    11016 => 838.0,\n    11017 => 838.0,\n    11018 => 838.0,\n    11019 => 838.0,\n    11020 => 838.0,\n    11021 => 838.0,\n    11022 => 836.0,\n    11023 => 836.0,\n    11024 => 836.0,\n    11025 => 836.0,\n    11026 => 945.0,\n    11027 => 945.0,\n    11028 => 945.0,\n    11029 => 945.0,\n    11030 => 769.0,\n    11031 => 769.0,\n    11032 => 769.0,\n    11033 => 769.0,\n    11034 => 945.0,\n    11039 => 869.0,\n    11040 => 869.0,\n    11041 => 873.0,\n    11042 => 873.0,\n    11043 => 873.0,\n    11044 => 1119.0,\n    11091 => 869.0,\n    11092 => 869.0,\n    11360 => 557.0,\n    11361 => 278.0,\n    11362 => 557.0,\n    11363 => 603.0,\n    11364 => 695.0,\n    11365 => 613.0,\n    11366 => 392.0,\n    11367 => 752.0,\n    11368 => 634.0,\n    11369 => 656.0,\n    11370 => 579.0,\n    11371 => 685.0,\n    11372 => 525.0,\n    11373 => 781.0,\n    11374 => 863.0,\n    11375 => 684.0,\n    11376 => 781.0,\n    11377 => 734.0,\n    11378 => 1128.0,\n    11379 => 961.0,\n    11380 => 592.0,\n    11381 => 654.0,\n    11382 => 568.0,\n    11383 => 660.0,\n    11385 => 414.0,\n    11386 => 612.0,\n    11387 => 491.0,\n    11388 => 175.0,\n    11389 => 431.0,\n    11390 => 635.0,\n    11391 => 685.0,\n    11520 => 591.0,\n    11521 => 595.0,\n    11522 => 564.0,\n    11523 => 602.0,\n    11524 => 587.0,\n    11525 => 911.0,\n    11526 => 626.0,\n    11527 => 952.0,\n    11528 => 595.0,\n    11529 => 607.0,\n    11530 => 954.0,\n    11531 => 620.0,\n    11532 => 595.0,\n    11533 => 926.0,\n    11534 => 595.0,\n    11535 => 806.0,\n    11536 => 931.0,\n    11537 => 584.0,\n    11538 => 592.0,\n    11539 => 923.0,\n    11540 => 953.0,\n    11541 => 828.0,\n    11542 => 596.0,\n    11543 => 595.0,\n    11544 => 590.0,\n    11545 => 592.0,\n    11546 => 592.0,\n    11547 => 621.0,\n    11548 => 920.0,\n    11549 => 589.0,\n    11550 => 586.0,\n    11551 => 581.0,\n    11552 => 914.0,\n    11553 => 596.0,\n    11554 => 595.0,\n    11555 => 592.0,\n    11556 => 642.0,\n    11557 => 901.0,\n    11568 => 646.0,\n    11569 => 888.0,\n    11570 => 888.0,\n    11571 => 682.0,\n    11572 => 684.0,\n    11573 => 635.0,\n    11574 => 562.0,\n    11575 => 684.0,\n    11576 => 684.0,\n    11577 => 632.0,\n    11578 => 632.0,\n    11579 => 683.0,\n    11580 => 875.0,\n    11581 => 685.0,\n    11582 => 491.0,\n    11583 => 685.0,\n    11584 => 888.0,\n    11585 => 888.0,\n    11586 => 300.0,\n    11587 => 627.0,\n    11588 => 752.0,\n    11589 => 656.0,\n    11590 => 527.0,\n    11591 => 685.0,\n    11592 => 645.0,\n    11593 => 632.0,\n    11594 => 502.0,\n    11595 => 953.0,\n    11596 => 778.0,\n    11597 => 748.0,\n    11598 => 621.0,\n    11599 => 295.0,\n    11600 => 778.0,\n    11601 => 295.0,\n    11602 => 752.0,\n    11603 => 633.0,\n    11604 => 888.0,\n    11605 => 888.0,\n    11606 => 752.0,\n    11607 => 320.0,\n    11608 => 749.0,\n    11609 => 888.0,\n    11610 => 888.0,\n    11611 => 698.0,\n    11612 => 768.0,\n    11613 => 685.0,\n    11614 => 698.0,\n    11615 => 622.0,\n    11616 => 684.0,\n    11617 => 752.0,\n    11618 => 632.0,\n    11619 => 788.0,\n    11620 => 567.0,\n    11621 => 788.0,\n    11631 => 515.0,\n    11800 => 531.0,\n    11807 => 838.0,\n    11810 => 390.0,\n    11811 => 390.0,\n    11812 => 390.0,\n    11813 => 390.0,\n    11822 => 531.0,\n    19904 => 896.0,\n    19905 => 896.0,\n    19906 => 896.0,\n    19907 => 896.0,\n    19908 => 896.0,\n    19909 => 896.0,\n    19910 => 896.0,\n    19911 => 896.0,\n    19912 => 896.0,\n    19913 => 896.0,\n    19914 => 896.0,\n    19915 => 896.0,\n    19916 => 896.0,\n    19917 => 896.0,\n    19918 => 896.0,\n    19919 => 896.0,\n    19920 => 896.0,\n    19921 => 896.0,\n    19922 => 896.0,\n    19923 => 896.0,\n    19924 => 896.0,\n    19925 => 896.0,\n    19926 => 896.0,\n    19927 => 896.0,\n    19928 => 896.0,\n    19929 => 896.0,\n    19930 => 896.0,\n    19931 => 896.0,\n    19932 => 896.0,\n    19933 => 896.0,\n    19934 => 896.0,\n    19935 => 896.0,\n    19936 => 896.0,\n    19937 => 896.0,\n    19938 => 896.0,\n    19939 => 896.0,\n    19940 => 896.0,\n    19941 => 896.0,\n    19942 => 896.0,\n    19943 => 896.0,\n    19944 => 896.0,\n    19945 => 896.0,\n    19946 => 896.0,\n    19947 => 896.0,\n    19948 => 896.0,\n    19949 => 896.0,\n    19950 => 896.0,\n    19951 => 896.0,\n    19952 => 896.0,\n    19953 => 896.0,\n    19954 => 896.0,\n    19955 => 896.0,\n    19956 => 896.0,\n    19957 => 896.0,\n    19958 => 896.0,\n    19959 => 896.0,\n    19960 => 896.0,\n    19961 => 896.0,\n    19962 => 896.0,\n    19963 => 896.0,\n    19964 => 896.0,\n    19965 => 896.0,\n    19966 => 896.0,\n    19967 => 896.0,\n    42192 => 686.0,\n    42193 => 603.0,\n    42194 => 603.0,\n    42195 => 770.0,\n    42196 => 611.0,\n    42197 => 611.0,\n    42198 => 775.0,\n    42199 => 656.0,\n    42200 => 656.0,\n    42201 => 512.0,\n    42202 => 698.0,\n    42203 => 703.0,\n    42204 => 685.0,\n    42205 => 575.0,\n    42206 => 575.0,\n    42207 => 863.0,\n    42208 => 748.0,\n    42209 => 557.0,\n    42210 => 635.0,\n    42211 => 695.0,\n    42212 => 695.0,\n    42213 => 684.0,\n    42214 => 684.0,\n    42215 => 752.0,\n    42216 => 775.0,\n    42217 => 512.0,\n    42218 => 989.0,\n    42219 => 685.0,\n    42220 => 611.0,\n    42221 => 686.0,\n    42222 => 684.0,\n    42223 => 684.0,\n    42224 => 632.0,\n    42225 => 632.0,\n    42226 => 295.0,\n    42227 => 787.0,\n    42228 => 732.0,\n    42229 => 732.0,\n    42230 => 557.0,\n    42231 => 767.0,\n    42232 => 300.0,\n    42233 => 300.0,\n    42234 => 596.0,\n    42235 => 596.0,\n    42236 => 300.0,\n    42237 => 300.0,\n    42238 => 588.0,\n    42239 => 588.0,\n    42564 => 635.0,\n    42565 => 521.0,\n    42566 => 354.0,\n    42567 => 338.0,\n    42572 => 1180.0,\n    42573 => 1028.0,\n    42576 => 1029.0,\n    42577 => 906.0,\n    42580 => 1080.0,\n    42581 => 842.0,\n    42582 => 977.0,\n    42583 => 843.0,\n    42594 => 1062.0,\n    42595 => 912.0,\n    42596 => 1066.0,\n    42597 => 901.0,\n    42598 => 1178.0,\n    42599 => 1008.0,\n    42600 => 787.0,\n    42601 => 612.0,\n    42602 => 855.0,\n    42603 => 712.0,\n    42604 => 1358.0,\n    42605 => 1019.0,\n    42606 => 879.0,\n    42634 => 782.0,\n    42635 => 685.0,\n    42636 => 611.0,\n    42637 => 583.0,\n    42644 => 686.0,\n    42645 => 634.0,\n    42648 => 1358.0,\n    42649 => 1019.0,\n    42760 => 493.0,\n    42761 => 493.0,\n    42762 => 493.0,\n    42763 => 493.0,\n    42764 => 493.0,\n    42765 => 493.0,\n    42766 => 493.0,\n    42767 => 493.0,\n    42768 => 493.0,\n    42769 => 493.0,\n    42770 => 493.0,\n    42771 => 493.0,\n    42772 => 493.0,\n    42773 => 493.0,\n    42774 => 493.0,\n    42779 => 369.0,\n    42780 => 369.0,\n    42781 => 252.0,\n    42782 => 252.0,\n    42783 => 252.0,\n    42786 => 385.0,\n    42787 => 356.0,\n    42788 => 472.0,\n    42789 => 472.0,\n    42790 => 752.0,\n    42791 => 634.0,\n    42792 => 878.0,\n    42793 => 709.0,\n    42794 => 614.0,\n    42795 => 541.0,\n    42800 => 491.0,\n    42801 => 521.0,\n    42802 => 1250.0,\n    42803 => 985.0,\n    42804 => 1203.0,\n    42805 => 990.0,\n    42806 => 1142.0,\n    42807 => 981.0,\n    42808 => 971.0,\n    42809 => 818.0,\n    42810 => 971.0,\n    42811 => 818.0,\n    42812 => 959.0,\n    42813 => 818.0,\n    42814 => 703.0,\n    42815 => 549.0,\n    42816 => 656.0,\n    42817 => 583.0,\n    42822 => 680.0,\n    42823 => 392.0,\n    42824 => 582.0,\n    42825 => 427.0,\n    42826 => 807.0,\n    42827 => 704.0,\n    42830 => 1358.0,\n    42831 => 1019.0,\n    42832 => 603.0,\n    42833 => 635.0,\n    42834 => 734.0,\n    42835 => 774.0,\n    42838 => 787.0,\n    42839 => 635.0,\n    42852 => 605.0,\n    42853 => 635.0,\n    42854 => 605.0,\n    42855 => 635.0,\n    42880 => 557.0,\n    42881 => 278.0,\n    42882 => 735.0,\n    42883 => 634.0,\n    42889 => 337.0,\n    42890 => 376.0,\n    42891 => 401.0,\n    42892 => 275.0,\n    42893 => 686.0,\n    42894 => 487.0,\n    42896 => 772.0,\n    42897 => 667.0,\n    42912 => 775.0,\n    42913 => 635.0,\n    42914 => 656.0,\n    42915 => 579.0,\n    42916 => 748.0,\n    42917 => 634.0,\n    42918 => 695.0,\n    42919 => 411.0,\n    42920 => 635.0,\n    42921 => 521.0,\n    42922 => 801.0,\n    43000 => 577.0,\n    43001 => 644.0,\n    43002 => 915.0,\n    43003 => 575.0,\n    43004 => 603.0,\n    43005 => 863.0,\n    43006 => 295.0,\n    43007 => 1199.0,\n    61184 => 213.0,\n    61185 => 238.0,\n    61186 => 257.0,\n    61187 => 264.0,\n    61188 => 267.0,\n    61189 => 238.0,\n    61190 => 213.0,\n    61191 => 238.0,\n    61192 => 257.0,\n    61193 => 264.0,\n    61194 => 257.0,\n    61195 => 238.0,\n    61196 => 213.0,\n    61197 => 238.0,\n    61198 => 257.0,\n    61199 => 264.0,\n    61200 => 257.0,\n    61201 => 238.0,\n    61202 => 213.0,\n    61203 => 238.0,\n    61204 => 267.0,\n    61205 => 264.0,\n    61206 => 257.0,\n    61207 => 238.0,\n    61208 => 213.0,\n    61209 => 275.0,\n    61440 => 977.0,\n    61441 => 977.0,\n    61442 => 977.0,\n    61443 => 977.0,\n    62464 => 580.0,\n    62465 => 580.0,\n    62466 => 624.0,\n    62467 => 889.0,\n    62468 => 585.0,\n    62469 => 580.0,\n    62470 => 653.0,\n    62471 => 882.0,\n    62472 => 555.0,\n    62473 => 580.0,\n    62474 => 1168.0,\n    62475 => 589.0,\n    62476 => 590.0,\n    62477 => 869.0,\n    62478 => 580.0,\n    62479 => 589.0,\n    62480 => 914.0,\n    62481 => 590.0,\n    62482 => 731.0,\n    62483 => 583.0,\n    62484 => 872.0,\n    62485 => 589.0,\n    62486 => 895.0,\n    62487 => 589.0,\n    62488 => 589.0,\n    62489 => 590.0,\n    62490 => 649.0,\n    62491 => 589.0,\n    62492 => 589.0,\n    62493 => 599.0,\n    62494 => 590.0,\n    62495 => 516.0,\n    62496 => 580.0,\n    62497 => 584.0,\n    62498 => 580.0,\n    62499 => 580.0,\n    62500 => 581.0,\n    62501 => 638.0,\n    62502 => 955.0,\n    62504 => 931.0,\n    62505 => 808.0,\n    62506 => 508.0,\n    62507 => 508.0,\n    62508 => 508.0,\n    62509 => 508.0,\n    62510 => 508.0,\n    62511 => 508.0,\n    62512 => 508.0,\n    62513 => 508.0,\n    62514 => 508.0,\n    62515 => 508.0,\n    62516 => 518.0,\n    62517 => 518.0,\n    62518 => 518.0,\n    62519 => 787.0,\n    62520 => 787.0,\n    62521 => 787.0,\n    62522 => 787.0,\n    62523 => 787.0,\n    62524 => 546.0,\n    62525 => 546.0,\n    62526 => 546.0,\n    62527 => 546.0,\n    62528 => 546.0,\n    62529 => 546.0,\n    63173 => 612.0,\n    64256 => 689.0,\n    64257 => 630.0,\n    64258 => 630.0,\n    64259 => 967.0,\n    64260 => 967.0,\n    64261 => 686.0,\n    64262 => 861.0,\n    64275 => 1202.0,\n    64276 => 1202.0,\n    64277 => 1196.0,\n    64278 => 1186.0,\n    64279 => 1529.0,\n    64285 => 224.0,\n    64286 => 0.0,\n    64287 => 331.0,\n    64288 => 636.0,\n    64289 => 856.0,\n    64290 => 774.0,\n    64291 => 906.0,\n    64292 => 771.0,\n    64293 => 843.0,\n    64294 => 855.0,\n    64295 => 807.0,\n    64296 => 875.0,\n    64297 => 838.0,\n    64298 => 708.0,\n    64299 => 708.0,\n    64300 => 708.0,\n    64301 => 708.0,\n    64302 => 668.0,\n    64303 => 668.0,\n    64304 => 668.0,\n    64305 => 578.0,\n    64306 => 412.0,\n    64307 => 546.0,\n    64308 => 653.0,\n    64309 => 355.0,\n    64310 => 406.0,\n    64312 => 648.0,\n    64313 => 330.0,\n    64314 => 537.0,\n    64315 => 529.0,\n    64316 => 568.0,\n    64318 => 679.0,\n    64320 => 399.0,\n    64321 => 649.0,\n    64323 => 640.0,\n    64324 => 625.0,\n    64326 => 593.0,\n    64327 => 709.0,\n    64328 => 564.0,\n    64329 => 708.0,\n    64330 => 657.0,\n    64331 => 272.0,\n    64332 => 578.0,\n    64333 => 529.0,\n    64334 => 625.0,\n    64335 => 629.0,\n    64338 => 941.0,\n    64339 => 982.0,\n    64340 => 278.0,\n    64341 => 302.0,\n    64342 => 941.0,\n    64343 => 982.0,\n    64344 => 278.0,\n    64345 => 302.0,\n    64346 => 941.0,\n    64347 => 982.0,\n    64348 => 278.0,\n    64349 => 302.0,\n    64350 => 941.0,\n    64351 => 982.0,\n    64352 => 278.0,\n    64353 => 302.0,\n    64354 => 941.0,\n    64355 => 982.0,\n    64356 => 278.0,\n    64357 => 302.0,\n    64358 => 941.0,\n    64359 => 982.0,\n    64360 => 278.0,\n    64361 => 302.0,\n    64362 => 1037.0,\n    64363 => 1035.0,\n    64364 => 478.0,\n    64365 => 506.0,\n    64366 => 1037.0,\n    64367 => 1035.0,\n    64368 => 478.0,\n    64369 => 506.0,\n    64370 => 646.0,\n    64371 => 646.0,\n    64372 => 618.0,\n    64373 => 646.0,\n    64374 => 646.0,\n    64375 => 646.0,\n    64376 => 618.0,\n    64377 => 646.0,\n    64378 => 646.0,\n    64379 => 646.0,\n    64380 => 618.0,\n    64381 => 646.0,\n    64382 => 646.0,\n    64383 => 646.0,\n    64384 => 618.0,\n    64385 => 646.0,\n    64386 => 445.0,\n    64387 => 525.0,\n    64388 => 445.0,\n    64389 => 525.0,\n    64390 => 445.0,\n    64391 => 525.0,\n    64392 => 445.0,\n    64393 => 525.0,\n    64394 => 483.0,\n    64395 => 552.0,\n    64396 => 483.0,\n    64397 => 552.0,\n    64398 => 895.0,\n    64399 => 895.0,\n    64400 => 476.0,\n    64401 => 552.0,\n    64402 => 895.0,\n    64403 => 895.0,\n    64404 => 476.0,\n    64405 => 552.0,\n    64406 => 895.0,\n    64407 => 895.0,\n    64408 => 476.0,\n    64409 => 552.0,\n    64410 => 895.0,\n    64411 => 895.0,\n    64412 => 476.0,\n    64413 => 552.0,\n    64414 => 734.0,\n    64415 => 761.0,\n    64416 => 734.0,\n    64417 => 761.0,\n    64418 => 278.0,\n    64419 => 302.0,\n    64426 => 698.0,\n    64427 => 632.0,\n    64428 => 527.0,\n    64429 => 461.0,\n    64467 => 824.0,\n    64468 => 843.0,\n    64469 => 476.0,\n    64470 => 552.0,\n    64471 => 483.0,\n    64472 => 517.0,\n    64473 => 483.0,\n    64474 => 517.0,\n    64475 => 483.0,\n    64476 => 517.0,\n    64478 => 483.0,\n    64479 => 517.0,\n    64484 => 783.0,\n    64485 => 833.0,\n    64486 => 278.0,\n    64487 => 302.0,\n    64488 => 278.0,\n    64489 => 302.0,\n    64508 => 783.0,\n    64509 => 833.0,\n    64510 => 278.0,\n    64511 => 302.0,\n    65024 => 0.0,\n    65025 => 0.0,\n    65026 => 0.0,\n    65027 => 0.0,\n    65028 => 0.0,\n    65029 => 0.0,\n    65030 => 0.0,\n    65031 => 0.0,\n    65032 => 0.0,\n    65033 => 0.0,\n    65034 => 0.0,\n    65035 => 0.0,\n    65036 => 0.0,\n    65037 => 0.0,\n    65038 => 0.0,\n    65039 => 0.0,\n    65056 => 0.0,\n    65057 => 0.0,\n    65058 => 0.0,\n    65059 => 0.0,\n    65136 => 293.0,\n    65137 => 293.0,\n    65138 => 293.0,\n    65139 => 262.0,\n    65140 => 293.0,\n    65142 => 293.0,\n    65143 => 293.0,\n    65144 => 293.0,\n    65145 => 293.0,\n    65146 => 293.0,\n    65147 => 293.0,\n    65148 => 293.0,\n    65149 => 293.0,\n    65150 => 293.0,\n    65151 => 293.0,\n    65152 => 470.0,\n    65153 => 278.0,\n    65154 => 305.0,\n    65155 => 278.0,\n    65156 => 305.0,\n    65157 => 483.0,\n    65158 => 517.0,\n    65159 => 278.0,\n    65160 => 305.0,\n    65161 => 783.0,\n    65162 => 833.0,\n    65163 => 278.0,\n    65164 => 302.0,\n    65165 => 278.0,\n    65166 => 305.0,\n    65167 => 941.0,\n    65168 => 982.0,\n    65169 => 278.0,\n    65170 => 302.0,\n    65171 => 524.0,\n    65172 => 536.0,\n    65173 => 941.0,\n    65174 => 982.0,\n    65175 => 278.0,\n    65176 => 302.0,\n    65177 => 941.0,\n    65178 => 982.0,\n    65179 => 278.0,\n    65180 => 302.0,\n    65181 => 646.0,\n    65182 => 646.0,\n    65183 => 618.0,\n    65184 => 646.0,\n    65185 => 646.0,\n    65186 => 646.0,\n    65187 => 618.0,\n    65188 => 646.0,\n    65189 => 646.0,\n    65190 => 646.0,\n    65191 => 618.0,\n    65192 => 646.0,\n    65193 => 445.0,\n    65194 => 525.0,\n    65195 => 445.0,\n    65196 => 525.0,\n    65197 => 483.0,\n    65198 => 552.0,\n    65199 => 483.0,\n    65200 => 552.0,\n    65201 => 1221.0,\n    65202 => 1275.0,\n    65203 => 838.0,\n    65204 => 892.0,\n    65205 => 1221.0,\n    65206 => 1275.0,\n    65207 => 838.0,\n    65208 => 892.0,\n    65209 => 1209.0,\n    65210 => 1225.0,\n    65211 => 849.0,\n    65212 => 867.0,\n    65213 => 1209.0,\n    65214 => 1225.0,\n    65215 => 849.0,\n    65216 => 867.0,\n    65217 => 925.0,\n    65218 => 949.0,\n    65219 => 796.0,\n    65220 => 820.0,\n    65221 => 925.0,\n    65222 => 949.0,\n    65223 => 796.0,\n    65224 => 820.0,\n    65225 => 597.0,\n    65226 => 532.0,\n    65227 => 597.0,\n    65228 => 482.0,\n    65229 => 597.0,\n    65230 => 532.0,\n    65231 => 523.0,\n    65232 => 482.0,\n    65233 => 1037.0,\n    65234 => 1035.0,\n    65235 => 478.0,\n    65236 => 506.0,\n    65237 => 776.0,\n    65238 => 834.0,\n    65239 => 478.0,\n    65240 => 506.0,\n    65241 => 824.0,\n    65242 => 843.0,\n    65243 => 476.0,\n    65244 => 552.0,\n    65245 => 727.0,\n    65246 => 757.0,\n    65247 => 305.0,\n    65248 => 331.0,\n    65249 => 619.0,\n    65250 => 666.0,\n    65251 => 536.0,\n    65252 => 578.0,\n    65253 => 734.0,\n    65254 => 761.0,\n    65255 => 278.0,\n    65256 => 302.0,\n    65257 => 524.0,\n    65258 => 536.0,\n    65259 => 527.0,\n    65260 => 461.0,\n    65261 => 483.0,\n    65262 => 517.0,\n    65263 => 783.0,\n    65264 => 833.0,\n    65265 => 783.0,\n    65266 => 833.0,\n    65267 => 278.0,\n    65268 => 302.0,\n    65269 => 570.0,\n    65270 => 597.0,\n    65271 => 570.0,\n    65272 => 597.0,\n    65273 => 570.0,\n    65274 => 597.0,\n    65275 => 570.0,\n    65276 => 597.0,\n    65279 => 0.0,\n    65529 => 0.0,\n    65530 => 0.0,\n    65531 => 0.0,\n    65532 => 0.0,\n    65533 => 1025.0,\n  ),\n  'CIDtoGID_Compressed' => true,\n  'CIDtoGID' => 'eJzt3AW087iZOHxJli3LliUZXmZmZmZmZmZmZmZmZmZmZmZmZmb+p3e780230+60M+3sfqvfObIl+ZH82E6cm9yTAPAbaQADHRiAABNQYAEbMOAADgSQwAUe8EEAwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CABSAgSgcQgCUgKkoHkIAVICVKB1CANSAvSgfQgA8gIMoHMIAvICrKB7CAHyAlygdwgD8gL8oH8oAAoCAqBwqAIKAqKgeKgBCgJSoHSoAwoC8qB8qACqAgqgcqgCqgKqoHqoAaoCWr91oMPqQ3qgLqgHqgPGoCGoBFoDJqApqAZaA5agJagFWgN2oC2oB1oDzqAjqAT6Ay6gK6gG+gOeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWAUGA3GgLFgHBgPJoCJYBKYDKaAqWAamA5mgJlgFpgN5oC5YB6YDxaAhWARWAyWgKVgGVgOVoCVYBVYDdaAtWAdWA82gI1gE9gMtoCtYBvYDnaAnWAX2A32gL1gH9gPDoCD4BA4DI6Ao+AYOA5OgJPgFDgNzoCz4Bw4Dy6Ai+ASuAyugKvgGrgOboCb4Ba4De6Au+AeuA8egIfgEXgMnoCn4Bl4Dl6Al+AVeA3egLfgHXgPPoCP4BP4DL6Ar+Ab+A5+QAAhRFCDGOrQgASakEIL2pBBB3IooIQu9KAPAxgOhocRYEQYCUaGUWBUGA1GhzFgTBgLxoZxYFwYD8aHCWBCmAgmhklgUpgMJocpYEqYCqaGaWBamA6mhxlgRpgJZoZZYFaYDWaHOWBOmAvmhnlgXpgP5ocFYEFYCBaGRWBRWAwWhyVgSVgKloZlYFlYDpaHFWBFWAlWhlVgVVgNVoc1YE1YC9aGdWBdWA/Whw1gQ9gINoZNYFPYDDaHLWBL2Aq2hm1gW9gOtocdYEfYCXaGXWBX2A12hz1gT9gL9oZ9YF/YD/aHA+BAOAgOhkPgUDgMDocj4Eg4Co6GY+BYOA6OhxPgRDgJToZT4FQ4DU6HM+BMOAvOhnPgXDgPzocL4EK4CC6GS+BSuAwuhyvgSrgKroZr4Fq4Dq6HG+BGuAluhlvgVrgNboc74E64C+6Ge+BeuA/uhwfgQXgIHoZH4FF4DB6HJ+BJeAqehmfgWXgOnocX4EV4CV6GV+BVeA1ehzfgTXgL3oZ34F14D96HD+BD+Ag+hk/gU/gMPocv4Ev4Cr6Gb+Bb+A6+hx/gR/gJfoZf4Ff4DX6HPxBAECGkIYx0ZCCCTESRhWzEkIM4EkgiF3nIRwEKh8KjCCgiioQioygoKoqGoqMYKCaKhWKjOCguiofiowQoIUqEEqMkKClKhpKjFCglSoVSozQoLUqH0qMMKCPKhDKjLCgryoayoxwoJ8qFcqM8KC/Kh/KjAqggKoQKoyKoKCqGiqMSqCQqhUqjMqgsKofKowqoIqqEKqMqqCqqhqqjGqgmqoVqozqoLqqH6qMGqCFqhBqjJqgpaoaaoxaoJWqFWqM2qC1qh9qjDqgj6oQ6oy6oK+qGuqMeqCfqhXqjPqgv6of6owFoIBqEBqMhaCgahoajEWgkGoVGozFoLBqHxqMJaCKahCajKWgqmoamoxloJpqFZqM5aC6ah+ajBWghWoQWoyV/ui2hpWgZWv6fNym04s/rlf/19oVWodVoDVqL1qH1aAPaiDahzWgL2oq2oe1oB9qJdqHdaA/ai/ah/egAOogOocPoCDqKjqHj6AQ6iU6h0+gMOovOofPoArqILqHL6Aq6iq6h6+gGuoluodvoDrqL7qH76AF6iB6hx+gJeoqeoefoBXqJXqHX6A16i96h9+gD+og+oc/oC/qKvqHv6If2pxcYqCFN+/OLDdb00NIIFaKZGtUszdaY5vydlyeuCU1qruZpvhZo4cL6wmsRtIhaJC2yFuWnuKhaNC26FkOLqcXSYofacUIlrhZPi68l0BJqibTEWhItqZZMS66l0FJqqbTUWhotrZZOS69lCEVm1DJpmbUsWlYtm5Zdy6Hl1HJpubU8Wl4tn5ZfK6AV1ApphbUiWlGtmFZcK6GV1EpppbUyWlmtnFZeq6BV1CpplbUqWlWtmlZdq6HV1GpptbU6Wl2tnlZfa6A11BppjbUmWlOtmdZca6G11FpprbU2WlutndZe66B11DppnbUuWletm9Zd66H11HppvbU+Wl+tn9ZfG6AN1AZpg7Uh2lBtmDZcG6GN1EZpo7Ux2lhtnDZem6BN1CZpk7Up2lRtmjZdm6HN1GZps7U52lxtnjZfW6At1BZpi7Ul2lJtmbZcW6Gt1FZpq7U12lptnbZe26Bt1DZpm7Ut2lZtm7Zd26Ht1HZpu7U92l5tn7ZfO6Ad1A5ph7Uj2lHtmHZcO6Gd1E5pp7Uz2lntnHZeu6Bd1C5pl7Ur2lXtmnZdu6Hd1G5pt7U72l3tnnZfe6A91B5pj7Un2lPtmfZce6G91F5pr7U32lvtnfZe+6B91D5pn7Uv2lftm/Zd+4EBhhhhDWOsYwMTbGKKLWxjhh3MscASu9jDPg5wOBweR8ARcSQcGUfBUXE0HB3HwDFxLBwbx8FxcTwcHyfACXEinBgnwUlxMpwcp8ApcSqcGqfBaXE6nB5nwBlxJpwZZ8FZcTacHefAOXEunBvnwXlxPpwfF8AFcSFcGBfBRXExXByXwCVxKVwal8FlcTlcHlfAFXElXBlXwVVxNVwd18A1cS1cG9fBdXE9XB83wA1xI9wYN8FNcTPcHLfALXEr3Bq3wW1xO9wed8AdcSfcGXfBXXE33B33wD1xL9wb98F9cT/cHw/AA/EgPBgPwUPxMDwcj8Aj8Sg8Go/BY/E4PB5PwBPxJDwZT8FT8TQ8Hc/AM/EsPBvPwXPxPDwfL8AL8SK8GC/BS/EyvByvwCvxKrwar8Fr8Tq8Hm/AG/EmvPmXn4F4C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br4ZNt8tfBvfwXfxPXwfPwi1H+JH+DF+gp/iZ/g5foFf4lf4NX6D3+J3+D3+gD/iT/gz/oK/4m/4O/6hAx3qSNd0rOu6oRPd1Klu6bbOdEfnAOhCl7/+z7//ju7qnu7rgR5OD69H0CPqkfTIehQ9qh5Nj67H0GPqsfTYehw9blhsPD3+X41PoCfUE+mJ9SR6Uj2ZnlxPoafUU+mp9TR6Wj2dnl7PoGfUM+mZ9Sx6Vj2bnl3PoefUc/1sfG49j55Xz6fn/xW5FtALhpaF9MKhZZG/2lr0Z/Vif14XD5USekm9lF5aL6OX1cvp5fUKekW9kl5Zr6JX1avp1fUaek29ll5br6PX1evp9fUGesOfzdRIb6w30ZvqzfTmegu9pd5Kb6230dvq7fT2ege9o95J76x30bvq3fTuoegeYWN6/mx8L7233kfvq/fT++sD9IH6IH2wPkQfqg/Th+sj9JH6qD/Hjf5pxBh9rD5OH69P0Cfqk/TJ+hR9qj5Nn67P0Gfqs/TZ+hx9rj5Pn68v0Bfqi/TF+hJ9qb5MX66v0Ffqq/TV+hp9rb5OX69v0Dfqm/TN+hZ9q75N367v0Hfqu/Td+h59r75P368f0A/qh/TD+hH9qH5MP66f0E/qp/TT+hn9rH5OP69f0C/ql/7iDF/Wr+hXw2rX9Ouh5Y1QufnT1lv//RX8hWt6W7+j39Xv6ff1B/pD/ZH+WH/yz8yj/GvoT/Vn+nP9hf5Sf6W/1t/ob/V3+nv9g/5R/6R/1r/oX/Vv+nf9hwEMaCBDM7ChG4ZBDNOghmXYBjMcgxvCkIZreIb/H7MagRHOCG9EMCIakYzIRhQjqhHNiB62JYYR04j1Rx6xoiiKoiiKoij/Nxmx/+gMQjnEMeKGlvHC6vGNBKFlwrB6or+ISmwkMZIayUK15EYKI6WRykhtpDHShtrpjPRGhtA6Y6hkCovNbGQJLbMa2YzsRg4jp5HLyG3kMfIa+Yz8RgGjYGhbIaOwEfYJi1HUKGYUN0oYJUP1UqFS2ihjlDXKGeWNCmHbKxqVjMpGFaOqUc2obtQwahph/7U0aht1/o0nSVGUX2DUNeoZ9Y0GRkOjkdHYaGI0NZoZzY0WRkujldHaaGO0NdoZ7Y0ORkejk9HZ6GJ0NboZ3Y0eRk+jl9Hb6GP0NfoZ/Y0BxkBj0C/OP9gYYgw1hhnDjRHGSGOUMdoYY4w1xhnjjQnGRGOSMdmYYkw1phnTjRnGTGOWMduYY8w15hnzjQXGQmORsdhYYiw1lhnLjRXGSmOVsdpYY6w11hnr/91nSlEURfmfxdhgbDQ2GZuNLcZWY1uovd3YYew0dhm7jT3GXmOfsd84YBw0DhmHjSPGUeOYcdw4YZwMxZ0yThtnjLPGOeO8ccG4aFwyLhtXjKvGNeO6ccO4adwybht3jLvGPeO+8cB4aDwKjXlsPDGeGs+M58YL46XxynhtvDHeGu+M98YH46PxyfhsfDG+Gt9Ckd+NHwQQSBDRCAaA6MQghJiEEovYhBGHcCKIJC7xiE8CEo6EJxFIRBKJRCZRSFQSjUQnMUhMEovEJnFIXBKPxCcJSEKSiCQmSUhSkowkJylISpKKpCZpSFqSjqQnGUhGkolkJllIVpKNZCc5SE6Si+QmeUheko/kJwVIQVKIFCZFSFFSjBQnJUhJUoqUJmVIWVKOlCcVSEVSiVQmVUhVUo1UJzVITVKL1CZ1SF1Sj9QnDUhD0og0Jk1IU9KMNP/T2SctSEvSirQmbUhb0o60Jx1IR9KJdCZdSFfSjXQnPUhP0ov0Jn1IX9KP9CcDyEAyiAwmQ8hQMowMJyPISDKKjCZjyFgyjownE8hEMik072QyhUwl08h0MoPMJLPIbDKHzCXzyHyygCwki8hisoQsJcvIcrKCrCSryGqyhqwl6/7ro4OsJxvIRrKJbCZbyFayjWwnO8hOsovsJnvIXrKP7CcHyEFyiBwmR8hRcowcJyfISXKKnCZnyFlyjpwnF8hFcolcJlfIVXKNXCc3yE1yi9wmd8jd0Pz3yH3ygDwkj8hj8oQ8Jc/Ic/KCvCSvyGvyhrwl70Ix78kH8pF8Ip/JF/KVfCPfyQ8TmNBEpmZiUzcNk5imSU3LtE1mOib/60e5KUxpuqZn+mZghjPDmxHMiGYkM7IZxYxqRjOjmzHMmD/FxjJjm3HMuGY8M76ZwExoJjITm0nMpGayX5g3uZnCTGmmMlObacy0ZjozvZnBzGhmMjObWcysZrbf73n6C/vOHrbM8a/cx7+TmdPM9d9H/QPz5TbzmHnNfGZ+s4BZ0CxkFv6FmCJmUbOYWdwsYZY0S5mlzTJmWbOcWd6sYFY0K5mVzSpmVbOaWd2sYdY0a5m1zTpmXbOeWd9s8HtmqiiKoiiKoiiK8q9nNjQbmY3NJmZTs5nZ3GxhtjRbma3NNmZbs53Z3uxgdjQ7mZ3NLmbXUGw3s7vZw+xp9jJ7m33MvmY/s785wBxoDjIHh801xBxqDjOHmyPMkeYoc7Q5JtQ31hxnjjcnmBPNSeZkc4o51ZxmTjdnmDPNWeZsc44515xnzjcXmAvNReZic4m51FxmLjdXmCvNVeZqc4251lxnrjc3mBvNTeZmc4u51dxmbjd3hGbeae4yd5t7zL3mPnO/ecA8aB4yD5tHzKPmsb95tMfNE2Hrk6Fy6r9sO/0PnLUz5lnznHnevGBeNC+Zl80r5lXzmnndvGHeNG+Zt8075l3znnnffGA+NB+Zj80n5lPzmfncfGG+NF+Zr8035lvznfne/PDTjB/NT+Zn84v51fz2D13A38j8bv6ggEKKqEYx1alBCTUppRa1KaMO5VRQSV3qUZ8GNBwNTyPQiDQSjUyj0Kg0Go1OY9CYNBaNTePQuDQejU8T0IQ0EU1Mk9CkNBlNTlPQlDQVTU3T0LQ0HU1PM9CMNBPNTLPQrDQbzU5z0Jw0F81N89C8NB/NTwvQgrQQLUyL0KK0GC1OS9CStBQtTcvQsrQcLU8r0Iq0Eq1Mq9CqtBqtTmvQmrQWrU3r0Lq0Hq1PG9CGtBFtTJvQprQZbU5b0Ja0FW1N29C2tB1tTzvQjrQT7Uy70K60G+1Oe9CetBftTfvQvrQf7U8H0IF0EB1Mh9ChdBgdTkfQkXQUHU3H0LF0HB1PJ9CJdBKdTKfQqXQanU5n0Jl0Fp1N59C5dB6dTxfQhXQRXUyX0KV0GV1OV9CVdBVdTdfQtXQdXU830I10E91Mt9CtdBvdTnfQnXQX3U330L10H91PD9CD9BA9TI/Qo/QYPU5P0JP0FD1Nz9Cz9Bw9Ty/Qi/QSvUyv0Kv0Gr1Ob9Cb9Ba9Te/Qu/QevU8f0If0EX1Mn9Cn9Bl9Tl/Ql/QVfU3f0Lf0HX1PP9CP9NN/Xn/6mX6hX+k3+p3+sIAFLWRpFrZ0y7CIZVrUsizbYpZjcUv8Kd6Slmt5lm8FVth36azwVgQrohXJimxFsaJa0azoVgwrphXLim3FseJa8az4VgIroZXISmwlsZJayazkVgorpZXKSm2lsdJa6az0VgYro5XJymxlCZsvq5XNym7lsHJaYZ8FWbmtPFZeK5+V3ypgFbQKhXoKh0qRUCkaKsWs4lYJq6RVyiptlbHKWuWs8lYFq6JVyapsVbGqWtWs6lYNq6ZVy6pt1bHqWvWs+lYDq6HVyGpsNQmbv6nVzGputbBaWq2s1lYbq63VzmpvdbA6Wp2szlYXq6vVzepu9bB6Wr2s3lYfq6/Vz+pvDbAGWoOswdYQa6g1zBpujbBGWqOs0dYYa6w1zhpvTbAmWpOsydYUa6o1zZpuzbBmhvY1y5ptzbHmWvOs+dYCa6G1yFpsLbGWWsus5daK0PaV1iprtbXGWmuts9ZbG6yN1iZrs7XF2mptC8t1u7XD2mntsnZbe0KtvdY+a791wDpoHbIOW0eso9Yx67h1wjppnbJOW2ess9Y563zYuAvWRetSaH3ZumJdta5Z160b1k3rlnU71HfHumvds+5bD6yH1iPrsfXEemo9s55bL6yX1ivrtfXGemu9s95bH6yP1ifrs/XF+mp9s75bP2xgQxvZmo1t3TZsYps2tS3btpnt2NwWtrRd27N9O7DD2eHtCHZEO5Id2Y5iR7Wj2dHtGHZMO5Yd245jx7Xj2fHtBHZCO5Gd2E5iJ7WT2cntFHZKO5Wd2k5jp7XT2entDHZGO5Od2c5iZ7Wz2dntHHZOO5ed285j57Xz2fntAv/fPc0uaBeyC9tF7KJ2Mbu4XSKsr6Rdyi5tl7HL2uXs8nYFu6Jdya5sV7Gr2tXs6nYNu6Zdy65t17Hr2vXs+nYDu6HdyG4cGtfEbmo3s5vbLeyWdiu7td3Gbmu3s9vbHf68r452J7uz3cXuanezu9s97J52L7u33cfua/ez+9sD7IH2IHuwPcQeag8Lix9uj7BHhtVG/Zr7sz3aHvNTfaw97s+18faEn3on/tp7/S/OP8mebE+xp9rT7On2DHumPcueHeqdY8+159nz7QX2QnuRvdheYi+1l9nL7RX2SnuVvdpeY6+119nr7Q32RnuTvdneYm+1t9nb7R32TnuXvdveY++199n77QP2QfuQfdg+Yh+1j9nH7RP2SfuUfdo+Y5+1z9nn7Qv2RfuSfdm+Yl+1r9nX7Rv2TftWaP+3w3K7Eyp37Xv2ffuB/dB+ZD+2n9hP7Wf2c/uF/dJ+Zb+239hv7Xf2e/uD/dH+ZH+2v9hf7W/2d/sHAwwyxDSGmc4MRpjJKLOYzRhzGGeCSeYyj/ksYOFYeBaBRWSR/uOMsMg/Pz8sCovKorHoLAaLyWKx2CwOi8visfgsAUvIErHELAlLypKx5CwFS8lSsdQsDUvL0rH0LAPLyDKxzCwLy8qysewsB8vJcrHcLA/Ly/Kx/KwAK8gKscKsCCvKirHirAQryUqx0qwMK8vKsfKsAqvIKrHKrAqryqqx6qwGq8lqsdqsDqvL6rH6rAFryBqxxqwJa8qaseasBWvJWrHWrA1ry9qx9qwD68g6sc6sC+vKurHurAfryXqx3qwP68v6sf5sABvIBrHBbAgbyoax4WwEG8lGsdFsDBvLxrHxbAKbyCaxyWwKm8qmselsBpvJZrHZbA6by+ax+WwBW8gWscVsCVvKlrHlbAVbyVax1WwNW8vWsfVsA9vINrHNbAvbyrax7WwH28l2sd1sD9vL9rH97AA7yA6xw+wIO8qOsePsBDvJTrHT7Aw7y86x8+wCu8guscvsCrvKrrHr7Aa7yW6x2+wOu8vusfvsAXvIHrHH7Al7yp6x5+wFe8lesdfsDXvL3rH37AP7yD6xz+wL+8q+se/shwMc6CBHc7CjO4ZDHNOhjuXYDnMchzvCkY7reI7vBE44J7wTwYnoRHIiO1GcqE40J7oTw4npxHJiO3GcuE48J76TwEnoJHISO0mcpE4yJ7mTwknppHJSO2mctE46J72TwcnoZHIyO1mcrE42J7uTw8np5HJyO3mcvE4+J79TwCnoFHIKO0Wcok4xp7hTwinplHJKO2Wcsk45p7xTwanoVHIqO1Wcqk41p7pTw6np1HJqO3Wcuk49p77TwGnoNHIaO02cpk4zp7nTwmnptHJaO22ctk47p73TwenodHI6O12crk43p7vTw+np9HJ6O32cvk4/p78zwBnoDHIGO0Ococ4wZ7gzwhnpjHJGO2Ocsc44Z7wzwZnoTHImO1OcqT9/PjjTnOlh6xnOTGeWM9uZ48wNa89z5jsLnIXOorDWYmfJb7kr/d6cpc4y56dfQ3DCfg3BWfkLcav+5gyr/6K1xlnrrHPWOxucjc4mZ7OzxdnqbHO2Ozucnc4uZ7ezx9nr7HP2/8asDzgHf2XkoVA5HFY78tv2+c9wjjp/8x3Xv3zfx50TzknnlHPaOeOcdc45550Lf1Qu/xs5F51LzmXninPVueZcd244N51bzm3njnPXuefcdx44D51HzmPnifPUeeY8d144L51XzmvnjfPWeee8dz44H51Pzmfni/PV+eZ8d35wwCFHXOOY69zghJuccovbnHGHcy645C73uM8DHo6H5xF4RB6JR+ZReFQejUfnMXhMHovH5nF4XB6Px+cJeEKeiCfmSXhSnown5yl4Sp6Kp+ZpeFqejqfnGXhGnoln5ll4Vp6NZ+c5eE6ei+fmeXheno/n5wV4QV6IF+ZFeFFejBfnJXhJXoqX5mV4WV6Ol+cVeEVeiVfmVXhVXo1X5zV4TV6L1+Z1eF1ej9fnDXhD3og35k14U96MN+cteEveirfmbXhb3o635x14R96Jd+ZdeFfejXfnPXhP3ov35n14X96P9+cD+EA+iA/mQ/hQPowP5yP4SD6Kj+Zj+Fg+jo/nE/hEPolP5lP4VD6NT+cz+Ew+i8/mc/hcPo/P5wv4Qr6IL+ZL+FK+jC/nK/hKvoqv5mv4Wr6Or+cb+Ea+iW/mW/hWvo1v5zv4Tr6L7+Z7+F6+j+/nB/hBfogf5kf4UX6MH+cn+El+ip/mZ/hZfo6f5xf4RX6JX+ZX+FV+jV/nN/hNfovf5nf4XX6P3+cP+EP+iD/mT/hT/ow/5y/4S/6Kv+Zv+Fv+jr/nH/hH/ol/5l/4V/6Nf+c/BBBQIKEJLHRhCCJMQYUlbMGEI7gQQgpXeMIXgQgnwosIIqKIJCKLKCKqiCaiixgipoglYos4Iq6IJ+KLBCKhSCQSiyQiqUgmkosUIqVIJVKLNCKtSCfSiwwio8gkMossIqvIJrKLHCKnyCVyizwir8gn8osCoqAoJAqLIqKoKCaKixKipCglSosyoqwoJ8qLCqKiqCQqiyqiqqgmqosaoqaoJWqLOqKuqCfqiwaioWgkGosmoqloJpqLFqKlaCVaizaiLQCinWgvOoiOopPoLLqIrqKb6C56iJ6il+gt+oi+op/oLwaIgWKQGCyGiKFimBguRvzl80+MFKPEaDHml5+dv44Y+5tGjxPjxQQRehchJonJYooIe70X08R0MUPMFLPEbDFHzBXzxHyxQCwUi8RisUQsFcvEcrFCrBSrxGqxRqwV68R6sUFsDI3cJDaLLWKr2Ca2ix1ip9gldos9Yq/YJ/aLA+KgOCQOiyPiqDgmjosT4qQ4JU6LM+KsOCfOiwviorgkLosroXmuhso1cV3cEDf/nGnonYG4Le6Iu+KeuC8eiIdhvY/EY/FEPBXPxHPxQrwUr8Rr8Ua8Fe/Ee/FBfBSfxGfxRXwV38R38UMCCSWSmsRSl4Yk0pRUWtKWTDqSSyGldKUnfRnIcDK8jCAjykgysowio/5HDjKajC5jyJgylowt48i4Mp6MLxPIhDKRTCyTyKQymUwuU8iUMpVMLdPItKER6WR6mUFmlJlkZplFZpXZZHaZQ+aUuWTun18HmUfm/cevnsz3s3p+WUAWlIVkYfnTr3fIorKYLC5LyJKylCwty8iyspwsLyvIirKSrCyryKqymqwua8iaspasLevIurKerC8byIaykWwsm8imsplsLlvIlrKVbC3byLaynWwvO8iOspPsLLvIrrKb7C57yJ6yl+wt+8i+sp/sLwfIgXKQHCyHyKFymBwuR8iRcpQcLcfIsXKcHC8nyIlykpwsp8ipcpqcLmfImXKWnC3nyLlynpwvF8iFcpFcLJfIpXKZXC5XyJVylVwt18i1cp1cLzfIjXKT3Cy3yK1ym9wud8idcpfcLffIvXKf3C8PyIPykDwsj8ij8pg8Lk/Ik/KUPC3PyLPynDwvL8iL8pK8LK/Iq/KavC5vyJvylrwt78i78p68Lx/Ih/KRfCyfyKfymXwuX8iX8pV8Ld/It/KdfC8/yI/yk/wsv8iv8pv8Ln+4wIUucjUXu7pruMQ1Xeparu0y13G5K1zpuq7n+m7ghnPDuxHciG4kN7IbxY3qRnOjuzHcmG4sN7Ybx43rxnPjuwnchG4iN7GbxE3qJnOTuynclG4qN7Wbxk3rpnPTuxncjG4mN7Obxc3qZnOzuzncnG4uN7ebx83r5nPzuwXcgm4ht7BbxC3qFnOLuyXckm4pt7Rbxi3rlnPLuxXcim4lt7Jb5eePJbeqWy1sXd2t8Y8/Ev85bk339/gVxt+aRW33f+C3qdy6bj23vtvAbeg2chu7Tf6BkU3/7tZmbvOf6i3clm6rX4hp7bZx27rt3PZuB7ej28nt7HZxu7rd3O5uD7en28vt/avy6PPrc/79uH3dfr8iqr87wB3oDnIHu0Pcoe4wd7g7wh3pjnJHu2Pcse44d7w7wZ3oTnInu1Pcqe40d7o7w53pznJnu3Pcue48d767wF3oLvo7e1jsLnGXusvc5e4Kd6W7yl3trnHXuuvcP/S7N+4Gd+PPWpvcze4Wd6u7zd3u7nB3urvc3e4ed6+7z93vHnAPuofcw+4R96h7zD3unnBPuqfc0+6Zn0afdc+5590L7kX30i/t63fL+bJ75V85v/K/lXvVveZed2+4N91b7m33jnvXvefedx+4D91H7mP3ifvUfeY+d1+4L91X7mv3TWjEW/ed+9794H50P7mf/+j8/2juF/er+8397v7wgAc95Gke9nTP8IhnetSzPNtjnuNxT3jScz3P873AC+eF9yJ4Eb1IXmQvihfVi+ZF92J4MX9pfi+WF9uL48X14nnxvQReQi+Rl9hL4iX1knnJvRReSi+Vl9pL46X10nnpvQxeRi+Tl9nL4mX1snnZvRxeTi+Xl9vL4+X18nn5vQJeQa+QV9gr4hX1innFvRJeSa+UV9or45X1ynnlf2HvFf7Fp+//HK/iX7QqhS0re1W8ql61v4qt/u/KSlEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVF+G6+GV9Or5dX26nh1vXpefa+B19Br5DX2mnhNvWZec6+F19Jr5bX22nhtvXZee6+D19Hr5HX2unhdvW5ed6+H19Pr5fX2+nh9vX5ef2+AN9Ab5A32hnhDvWHecG+EN9Ib5Y32xnhjvXHeeG+CN9Gb5E32pnhTvWne9D/6+BVFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+f8Pb4Y305vlzfbmeHO9ed58b4G30FvkLfaWeEu9Zd5yb4W30lvlrfbWeGu9dd56b4O30dvkbfa2eFu9bd52b4e309vl7fb2eHu9fd5+74B30DvkHfaOeEe9Y97xP/r4FOVPvBPeSe+Ud/qn9hnvbNj6nHc+bH3Bu+hd8i7/4tgr3lXvmnfdu+Hd9G55t7073l3vnnffe/BP5vLQe+Q99p78Rd9T71nY+rn34p+b9X8H76X3ynvtvfHeeu+8994H76P3yfvsffG+et+87z9F/fCBD33ka39q+djXfcMnvulT3/Jtn/nOf0b63Be+9F3f830/8MP54f0IfkQ/kh/Zj+JH9aP50f0YP8XG9GP5sf04flw/Xlg7vp/AT+gn8hP7ScLaSf1kfytvP7mfwk/pp/pHj9dP7afx0/rpftaT3s/gZ/Qz+Zn9LKFWVj/b3x2f3c/h5/Rz+bn9PH5eP5+f3y/gF/xHs/j38Qv5hf0iflG/mF/cL+GX/KPzURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+XfxS/ml/TJ+Wb+cX96v4Ff0K/mV/Sp+Vb+aX92v4df0a/m1/Tp+Xb+eX99v4Df0G/mN/+icld+P38Rv6jfzm//ReSiKoiiK8u/jt/Bb+q381n4bv63fzm/vd/A7+p38zn4Xv6vfze/u9/B7+r383n4fv6/fz+/vD/AH+oP8wf4Qf6g/zB/uj/BH+qP80f4Yf6w/LjTfeH+CP9Gf5E/2p/hT/Wn+dH+GP9Of5c/25/hz/Xn+fH+Bv9Bf5C/2l/hL/WX+cn/FH30OFEVR/lj+yj86A0VRFEVR/m/wV/mr/TX+Wn+dv97f8DejNvqb/M3+Fn/rz/q2+dv9Hf5Of5e/29/j7/X3+fv9A/5B/5B/2D/iH/WP+cf9E/5J/5R/2j/jn/XP+edDoy74F/1L/mX/Sqh+NVSu+ddDyxv+zdDyln/bv+Pf9e/59/0H/kP/kf84bE9P/Kf+M/+5/8J/6b/yX/tv/Lf+O/+9/8H/6H/yP/tf/K/+N/+7/yMAAQxQoAU40AMjIIEZ0MAK7IAFTsADEcjADbzAD4IgXBA+iBBEDCIFkYMoQdQgWhA9iBHEDGIFsYM4QdwgXhA/SBAkDBIFiYMkQdIgWZA8SBGkDFIFqYM0QdogXZA+yBBkDDIFmYMsQdafn60gW5A9yBHk/P2uUpAryB3kCfIG+YL8QYGgYFAoKBzqLRIU/SmiWFA8KBGUDEoFpX/VjGWCskG5oPzvl6OiKP/bBBWCikGloHJQJagaVAuqBzWCmkGtoHZQJ6gb1Avq/7fjGwQNg0bB/9j/CQdNgqZBs6B50CJUbxm0CloHbYK2QbugfdAh6Bh0CjoHXYKuQbege9Aj6Bn0CnoHfYK+Qb+gfzAgGBgMCgYHQ4KhwbBgeDAiGBmMCkYHY4KxwbhgfDAhmBhMCiYHU4KpwbRgejAjmBnMCmYHc4K5wbxgfrAgWBgsChYHS4KlwbJgebAiWBmsClYHa4K1wbpgfbAh2BhsCjYHW4KtwbZge7Aj2BnsCnYHe4K9wb5gf3AgOBgcCg4HR4KjwbHgeHAiOBmcCk4HZ4KzwbngfHAhuBhcCi4HV4KrwbXgenAjuBncCm4Hd4K7wb3gfvAgeBg8Ch4HT4KnwbPgefAieBm8Cl4Hb4K3wbvgfdjZ+fBHXx/l3y34GHwKPgdfgq9/av0/+/tE7Q==',\n  '_version_' => 6,\n);"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans Mono\nFontSubfamily Bold\nUniqueID DejaVu Sans Mono Bold\nFullName DejaVu Sans Mono Bold\nVersion Version 2.37\nPostScriptName DejaVuSansMono-Bold\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nWeight Bold\nItalicAngle 0\nIsFixedPitch true\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -447 -394 731 1041\nStartCharMetrics 3316\nU 32 ; WX 602 ; N space ; G 3\nU 33 ; WX 602 ; N exclam ; G 4\nU 34 ; WX 602 ; N quotedbl ; G 5\nU 35 ; WX 602 ; N numbersign ; G 6\nU 36 ; WX 602 ; N dollar ; G 7\nU 37 ; WX 602 ; N percent ; G 8\nU 38 ; WX 602 ; N ampersand ; G 9\nU 39 ; WX 602 ; N quotesingle ; G 10\nU 40 ; WX 602 ; N parenleft ; G 11\nU 41 ; WX 602 ; N parenright ; G 12\nU 42 ; WX 602 ; N asterisk ; G 13\nU 43 ; WX 602 ; N plus ; G 14\nU 44 ; WX 602 ; N comma ; G 15\nU 45 ; WX 602 ; N hyphen ; G 16\nU 46 ; WX 602 ; N period ; G 17\nU 47 ; WX 602 ; N slash ; G 18\nU 48 ; WX 602 ; N zero ; G 19\nU 49 ; WX 602 ; N one ; G 20\nU 50 ; WX 602 ; N two ; G 21\nU 51 ; WX 602 ; N three ; G 22\nU 52 ; WX 602 ; N four ; G 23\nU 53 ; WX 602 ; N five ; G 24\nU 54 ; WX 602 ; N six ; G 25\nU 55 ; WX 602 ; N seven ; G 26\nU 56 ; WX 602 ; N eight ; G 27\nU 57 ; WX 602 ; N nine ; G 28\nU 58 ; WX 602 ; N colon ; G 29\nU 59 ; WX 602 ; N semicolon ; G 30\nU 60 ; WX 602 ; N less ; G 31\nU 61 ; WX 602 ; N equal ; G 32\nU 62 ; WX 602 ; N greater ; G 33\nU 63 ; WX 602 ; N question ; G 34\nU 64 ; WX 602 ; N at ; G 35\nU 65 ; WX 602 ; N A ; G 36\nU 66 ; WX 602 ; N B ; G 37\nU 67 ; WX 602 ; N C ; G 38\nU 68 ; WX 602 ; N D ; G 39\nU 69 ; WX 602 ; N E ; G 40\nU 70 ; WX 602 ; N F ; G 41\nU 71 ; WX 602 ; N G ; G 42\nU 72 ; WX 602 ; N H ; G 43\nU 73 ; WX 602 ; N I ; G 44\nU 74 ; WX 602 ; N J ; G 45\nU 75 ; WX 602 ; N K ; G 46\nU 76 ; WX 602 ; N L ; G 47\nU 77 ; WX 602 ; N M ; G 48\nU 78 ; WX 602 ; N N ; G 49\nU 79 ; WX 602 ; N O ; G 50\nU 80 ; WX 602 ; N P ; G 51\nU 81 ; WX 602 ; N Q ; G 52\nU 82 ; WX 602 ; N R ; G 53\nU 83 ; WX 602 ; N S ; G 54\nU 84 ; WX 602 ; N T ; G 55\nU 85 ; WX 602 ; N U ; G 56\nU 86 ; WX 602 ; N V ; G 57\nU 87 ; WX 602 ; N W ; G 58\nU 88 ; WX 602 ; N X ; G 59\nU 89 ; WX 602 ; N Y ; G 60\nU 90 ; WX 602 ; N Z ; G 61\nU 91 ; WX 602 ; N bracketleft ; G 62\nU 92 ; WX 602 ; N backslash ; G 63\nU 93 ; WX 602 ; N bracketright ; G 64\nU 94 ; WX 602 ; N asciicircum ; G 65\nU 95 ; WX 602 ; N underscore ; G 66\nU 96 ; WX 602 ; N grave ; G 67\nU 97 ; WX 602 ; N a ; G 68\nU 98 ; WX 602 ; N b ; G 69\nU 99 ; WX 602 ; N c ; G 70\nU 100 ; WX 602 ; N d ; G 71\nU 101 ; WX 602 ; N e ; G 72\nU 102 ; WX 602 ; N f ; G 73\nU 103 ; WX 602 ; N g ; G 74\nU 104 ; WX 602 ; N h ; G 75\nU 105 ; WX 602 ; N i ; G 76\nU 106 ; WX 602 ; N j ; G 77\nU 107 ; WX 602 ; N k ; G 78\nU 108 ; WX 602 ; N l ; G 79\nU 109 ; WX 602 ; N m ; G 80\nU 110 ; WX 602 ; N n ; G 81\nU 111 ; WX 602 ; N o ; G 82\nU 112 ; WX 602 ; N p ; G 83\nU 113 ; WX 602 ; N q ; G 84\nU 114 ; WX 602 ; N r ; G 85\nU 115 ; WX 602 ; N s ; G 86\nU 116 ; WX 602 ; N t ; G 87\nU 117 ; WX 602 ; N u ; G 88\nU 118 ; WX 602 ; N v ; G 89\nU 119 ; WX 602 ; N w ; G 90\nU 120 ; WX 602 ; N x ; G 91\nU 121 ; WX 602 ; N y ; G 92\nU 122 ; WX 602 ; N z ; G 93\nU 123 ; WX 602 ; N braceleft ; G 94\nU 124 ; WX 602 ; N bar ; G 95\nU 125 ; WX 602 ; N braceright ; G 96\nU 126 ; WX 602 ; N asciitilde ; G 97\nU 160 ; WX 602 ; N nbspace ; G 98\nU 161 ; WX 602 ; N exclamdown ; G 99\nU 162 ; WX 602 ; N cent ; G 100\nU 163 ; WX 602 ; N sterling ; G 101\nU 164 ; WX 602 ; N currency ; G 102\nU 165 ; WX 602 ; N yen ; G 103\nU 166 ; WX 602 ; N brokenbar ; G 104\nU 167 ; WX 602 ; N section ; G 105\nU 168 ; WX 602 ; N dieresis ; G 106\nU 169 ; WX 602 ; N copyright ; G 107\nU 170 ; WX 602 ; N ordfeminine ; G 108\nU 171 ; WX 602 ; N guillemotleft ; G 109\nU 172 ; WX 602 ; N logicalnot ; G 110\nU 173 ; WX 602 ; N sfthyphen ; G 111\nU 174 ; WX 602 ; N registered ; G 112\nU 175 ; WX 602 ; N macron ; G 113\nU 176 ; WX 602 ; N degree ; G 114\nU 177 ; WX 602 ; N plusminus ; G 115\nU 178 ; WX 602 ; N twosuperior ; G 116\nU 179 ; WX 602 ; N threesuperior ; G 117\nU 180 ; WX 602 ; N acute ; G 118\nU 181 ; WX 602 ; N mu ; G 119\nU 182 ; WX 602 ; N paragraph ; G 120\nU 183 ; WX 602 ; N periodcentered ; G 121\nU 184 ; WX 602 ; N cedilla ; G 122\nU 185 ; WX 602 ; N onesuperior ; G 123\nU 186 ; WX 602 ; N ordmasculine ; G 124\nU 187 ; WX 602 ; N guillemotright ; G 125\nU 188 ; WX 602 ; N onequarter ; G 126\nU 189 ; WX 602 ; N onehalf ; G 127\nU 190 ; WX 602 ; N threequarters ; G 128\nU 191 ; WX 602 ; N questiondown ; G 129\nU 192 ; WX 602 ; N Agrave ; G 130\nU 193 ; WX 602 ; N Aacute ; G 131\nU 194 ; WX 602 ; N Acircumflex ; G 132\nU 195 ; WX 602 ; N Atilde ; G 133\nU 196 ; WX 602 ; N Adieresis ; G 134\nU 197 ; WX 602 ; N Aring ; G 135\nU 198 ; WX 602 ; N AE ; G 136\nU 199 ; WX 602 ; N Ccedilla ; G 137\nU 200 ; WX 602 ; N Egrave ; G 138\nU 201 ; WX 602 ; N Eacute ; G 139\nU 202 ; WX 602 ; N Ecircumflex ; G 140\nU 203 ; WX 602 ; N Edieresis ; G 141\nU 204 ; WX 602 ; N Igrave ; G 142\nU 205 ; WX 602 ; N Iacute ; G 143\nU 206 ; WX 602 ; N Icircumflex ; G 144\nU 207 ; WX 602 ; N Idieresis ; G 145\nU 208 ; WX 602 ; N Eth ; G 146\nU 209 ; WX 602 ; N Ntilde ; G 147\nU 210 ; WX 602 ; N Ograve ; G 148\nU 211 ; WX 602 ; N Oacute ; G 149\nU 212 ; WX 602 ; N Ocircumflex ; G 150\nU 213 ; WX 602 ; N Otilde ; G 151\nU 214 ; WX 602 ; N Odieresis ; G 152\nU 215 ; WX 602 ; N multiply ; G 153\nU 216 ; WX 602 ; N Oslash ; G 154\nU 217 ; WX 602 ; N Ugrave ; G 155\nU 218 ; WX 602 ; N Uacute ; G 156\nU 219 ; WX 602 ; N Ucircumflex ; G 157\nU 220 ; WX 602 ; N Udieresis ; G 158\nU 221 ; WX 602 ; N Yacute ; G 159\nU 222 ; WX 602 ; N Thorn ; G 160\nU 223 ; WX 602 ; N germandbls ; G 161\nU 224 ; WX 602 ; N agrave ; G 162\nU 225 ; WX 602 ; N aacute ; G 163\nU 226 ; WX 602 ; N acircumflex ; G 164\nU 227 ; WX 602 ; N atilde ; G 165\nU 228 ; WX 602 ; N adieresis ; G 166\nU 229 ; WX 602 ; N aring ; G 167\nU 230 ; WX 602 ; N ae ; G 168\nU 231 ; WX 602 ; N ccedilla ; G 169\nU 232 ; WX 602 ; N egrave ; G 170\nU 233 ; WX 602 ; N eacute ; G 171\nU 234 ; WX 602 ; N ecircumflex ; G 172\nU 235 ; WX 602 ; N edieresis ; G 173\nU 236 ; WX 602 ; N igrave ; G 174\nU 237 ; WX 602 ; N iacute ; G 175\nU 238 ; WX 602 ; N icircumflex ; G 176\nU 239 ; WX 602 ; N idieresis ; G 177\nU 240 ; WX 602 ; N eth ; G 178\nU 241 ; WX 602 ; N ntilde ; G 179\nU 242 ; WX 602 ; N ograve ; G 180\nU 243 ; WX 602 ; N oacute ; G 181\nU 244 ; WX 602 ; N ocircumflex ; G 182\nU 245 ; WX 602 ; N otilde ; G 183\nU 246 ; WX 602 ; N odieresis ; G 184\nU 247 ; WX 602 ; N divide ; G 185\nU 248 ; WX 602 ; N oslash ; G 186\nU 249 ; WX 602 ; N ugrave ; G 187\nU 250 ; WX 602 ; N uacute ; G 188\nU 251 ; WX 602 ; N ucircumflex ; G 189\nU 252 ; WX 602 ; N udieresis ; G 190\nU 253 ; WX 602 ; N yacute ; G 191\nU 254 ; WX 602 ; N thorn ; G 192\nU 255 ; WX 602 ; N ydieresis ; G 193\nU 256 ; WX 602 ; N Amacron ; G 194\nU 257 ; WX 602 ; N amacron ; G 195\nU 258 ; WX 602 ; N Abreve ; G 196\nU 259 ; WX 602 ; N abreve ; G 197\nU 260 ; WX 602 ; N Aogonek ; G 198\nU 261 ; WX 602 ; N aogonek ; G 199\nU 262 ; WX 602 ; N Cacute ; G 200\nU 263 ; WX 602 ; N cacute ; G 201\nU 264 ; WX 602 ; N Ccircumflex ; G 202\nU 265 ; WX 602 ; N ccircumflex ; G 203\nU 266 ; WX 602 ; N Cdotaccent ; G 204\nU 267 ; WX 602 ; N cdotaccent ; G 205\nU 268 ; WX 602 ; N Ccaron ; G 206\nU 269 ; WX 602 ; N ccaron ; G 207\nU 270 ; WX 602 ; N Dcaron ; G 208\nU 271 ; WX 602 ; N dcaron ; G 209\nU 272 ; WX 602 ; N Dcroat ; G 210\nU 273 ; WX 602 ; N dmacron ; G 211\nU 274 ; WX 602 ; N Emacron ; G 212\nU 275 ; WX 602 ; N emacron ; G 213\nU 276 ; WX 602 ; N Ebreve ; G 214\nU 277 ; WX 602 ; N ebreve ; G 215\nU 278 ; WX 602 ; N Edotaccent ; G 216\nU 279 ; WX 602 ; N edotaccent ; G 217\nU 280 ; WX 602 ; N Eogonek ; G 218\nU 281 ; WX 602 ; N eogonek ; G 219\nU 282 ; WX 602 ; N Ecaron ; G 220\nU 283 ; WX 602 ; N ecaron ; G 221\nU 284 ; WX 602 ; N Gcircumflex ; G 222\nU 285 ; WX 602 ; N gcircumflex ; G 223\nU 286 ; WX 602 ; N Gbreve ; G 224\nU 287 ; WX 602 ; N gbreve ; G 225\nU 288 ; WX 602 ; N Gdotaccent ; G 226\nU 289 ; WX 602 ; N gdotaccent ; G 227\nU 290 ; WX 602 ; N Gcommaaccent ; G 228\nU 291 ; WX 602 ; N gcommaaccent ; G 229\nU 292 ; WX 602 ; N Hcircumflex ; G 230\nU 293 ; WX 602 ; N hcircumflex ; G 231\nU 294 ; WX 602 ; N Hbar ; G 232\nU 295 ; WX 602 ; N hbar ; G 233\nU 296 ; WX 602 ; N Itilde ; G 234\nU 297 ; WX 602 ; N itilde ; G 235\nU 298 ; WX 602 ; N Imacron ; G 236\nU 299 ; WX 602 ; N imacron ; G 237\nU 300 ; WX 602 ; N Ibreve ; G 238\nU 301 ; WX 602 ; N ibreve ; G 239\nU 302 ; WX 602 ; N Iogonek ; G 240\nU 303 ; WX 602 ; N iogonek ; G 241\nU 304 ; WX 602 ; N Idot ; G 242\nU 305 ; WX 602 ; N dotlessi ; G 243\nU 306 ; WX 602 ; N IJ ; G 244\nU 307 ; WX 602 ; N ij ; G 245\nU 308 ; WX 602 ; N Jcircumflex ; G 246\nU 309 ; WX 602 ; N jcircumflex ; G 247\nU 310 ; WX 602 ; N Kcommaaccent ; G 248\nU 311 ; WX 602 ; N kcommaaccent ; G 249\nU 312 ; WX 602 ; N kgreenlandic ; G 250\nU 313 ; WX 602 ; N Lacute ; G 251\nU 314 ; WX 602 ; N lacute ; G 252\nU 315 ; WX 602 ; N Lcommaaccent ; G 253\nU 316 ; WX 602 ; N lcommaaccent ; G 254\nU 317 ; WX 602 ; N Lcaron ; G 255\nU 318 ; WX 602 ; N lcaron ; G 256\nU 319 ; WX 602 ; N Ldot ; G 257\nU 320 ; WX 602 ; N ldot ; G 258\nU 321 ; WX 602 ; N Lslash ; G 259\nU 322 ; WX 602 ; N lslash ; G 260\nU 323 ; WX 602 ; N Nacute ; G 261\nU 324 ; WX 602 ; N nacute ; G 262\nU 325 ; WX 602 ; N Ncommaaccent ; G 263\nU 326 ; WX 602 ; N ncommaaccent ; G 264\nU 327 ; WX 602 ; N Ncaron ; G 265\nU 328 ; WX 602 ; N ncaron ; G 266\nU 329 ; WX 602 ; N napostrophe ; G 267\nU 330 ; WX 602 ; N Eng ; G 268\nU 331 ; WX 602 ; N eng ; G 269\nU 332 ; WX 602 ; N Omacron ; G 270\nU 333 ; WX 602 ; N omacron ; G 271\nU 334 ; WX 602 ; N Obreve ; G 272\nU 335 ; WX 602 ; N obreve ; G 273\nU 336 ; WX 602 ; N Ohungarumlaut ; G 274\nU 337 ; WX 602 ; N ohungarumlaut ; G 275\nU 338 ; WX 602 ; N OE ; G 276\nU 339 ; WX 602 ; N oe ; G 277\nU 340 ; WX 602 ; N Racute ; G 278\nU 341 ; WX 602 ; N racute ; G 279\nU 342 ; WX 602 ; N Rcommaaccent ; G 280\nU 343 ; WX 602 ; N rcommaaccent ; G 281\nU 344 ; WX 602 ; N Rcaron ; G 282\nU 345 ; WX 602 ; N rcaron ; G 283\nU 346 ; WX 602 ; N Sacute ; G 284\nU 347 ; WX 602 ; N sacute ; G 285\nU 348 ; WX 602 ; N Scircumflex ; G 286\nU 349 ; WX 602 ; N scircumflex ; G 287\nU 350 ; WX 602 ; N Scedilla ; G 288\nU 351 ; WX 602 ; N scedilla ; G 289\nU 352 ; WX 602 ; N Scaron ; G 290\nU 353 ; WX 602 ; N scaron ; G 291\nU 354 ; WX 602 ; N Tcommaaccent ; G 292\nU 355 ; WX 602 ; N tcommaaccent ; G 293\nU 356 ; WX 602 ; N Tcaron ; G 294\nU 357 ; WX 602 ; N tcaron ; G 295\nU 358 ; WX 602 ; N Tbar ; G 296\nU 359 ; WX 602 ; N tbar ; G 297\nU 360 ; WX 602 ; N Utilde ; G 298\nU 361 ; WX 602 ; N utilde ; G 299\nU 362 ; WX 602 ; N Umacron ; G 300\nU 363 ; WX 602 ; N umacron ; G 301\nU 364 ; WX 602 ; N Ubreve ; G 302\nU 365 ; WX 602 ; N ubreve ; G 303\nU 366 ; WX 602 ; N Uring ; G 304\nU 367 ; WX 602 ; N uring ; G 305\nU 368 ; WX 602 ; N Uhungarumlaut ; G 306\nU 369 ; WX 602 ; N uhungarumlaut ; G 307\nU 370 ; WX 602 ; N Uogonek ; G 308\nU 371 ; WX 602 ; N uogonek ; G 309\nU 372 ; WX 602 ; N Wcircumflex ; G 310\nU 373 ; WX 602 ; N wcircumflex ; G 311\nU 374 ; WX 602 ; N Ycircumflex ; G 312\nU 375 ; WX 602 ; N ycircumflex ; G 313\nU 376 ; WX 602 ; N Ydieresis ; G 314\nU 377 ; WX 602 ; N Zacute ; G 315\nU 378 ; WX 602 ; N zacute ; G 316\nU 379 ; WX 602 ; N Zdotaccent ; G 317\nU 380 ; WX 602 ; N zdotaccent ; G 318\nU 381 ; WX 602 ; N Zcaron ; G 319\nU 382 ; WX 602 ; N zcaron ; G 320\nU 383 ; WX 602 ; N longs ; G 321\nU 384 ; WX 602 ; N uni0180 ; G 322\nU 385 ; WX 602 ; N uni0181 ; G 323\nU 386 ; WX 602 ; N uni0182 ; G 324\nU 387 ; WX 602 ; N uni0183 ; G 325\nU 388 ; WX 602 ; N uni0184 ; G 326\nU 389 ; WX 602 ; N uni0185 ; G 327\nU 390 ; WX 602 ; N uni0186 ; G 328\nU 391 ; WX 602 ; N uni0187 ; G 329\nU 392 ; WX 602 ; N uni0188 ; G 330\nU 393 ; WX 602 ; N uni0189 ; G 331\nU 394 ; WX 602 ; N uni018A ; G 332\nU 395 ; WX 602 ; N uni018B ; G 333\nU 396 ; WX 602 ; N uni018C ; G 334\nU 397 ; WX 602 ; N uni018D ; G 335\nU 398 ; WX 602 ; N uni018E ; G 336\nU 399 ; WX 602 ; N uni018F ; G 337\nU 400 ; WX 602 ; N uni0190 ; G 338\nU 401 ; WX 602 ; N uni0191 ; G 339\nU 402 ; WX 602 ; N florin ; G 340\nU 403 ; WX 602 ; N uni0193 ; G 341\nU 404 ; WX 602 ; N uni0194 ; G 342\nU 405 ; WX 602 ; N uni0195 ; G 343\nU 406 ; WX 602 ; N uni0196 ; G 344\nU 407 ; WX 602 ; N uni0197 ; G 345\nU 408 ; WX 602 ; N uni0198 ; G 346\nU 409 ; WX 602 ; N uni0199 ; G 347\nU 410 ; WX 602 ; N uni019A ; G 348\nU 411 ; WX 602 ; N uni019B ; G 349\nU 412 ; WX 602 ; N uni019C ; G 350\nU 413 ; WX 602 ; N uni019D ; G 351\nU 414 ; WX 602 ; N uni019E ; G 352\nU 415 ; WX 602 ; N uni019F ; G 353\nU 416 ; WX 602 ; N Ohorn ; G 354\nU 417 ; WX 602 ; N ohorn ; G 355\nU 418 ; WX 602 ; N uni01A2 ; G 356\nU 419 ; WX 602 ; N uni01A3 ; G 357\nU 420 ; WX 602 ; N uni01A4 ; G 358\nU 421 ; WX 602 ; N uni01A5 ; G 359\nU 422 ; WX 602 ; N uni01A6 ; G 360\nU 423 ; WX 602 ; N uni01A7 ; G 361\nU 424 ; WX 602 ; N uni01A8 ; G 362\nU 425 ; WX 602 ; N uni01A9 ; G 363\nU 426 ; WX 602 ; N uni01AA ; G 364\nU 427 ; WX 602 ; N uni01AB ; G 365\nU 428 ; WX 602 ; N uni01AC ; G 366\nU 429 ; WX 602 ; N uni01AD ; G 367\nU 430 ; WX 602 ; N uni01AE ; G 368\nU 431 ; WX 602 ; N Uhorn ; G 369\nU 432 ; WX 602 ; N uhorn ; G 370\nU 433 ; WX 602 ; N uni01B1 ; G 371\nU 434 ; WX 602 ; N uni01B2 ; G 372\nU 435 ; WX 602 ; N uni01B3 ; G 373\nU 436 ; WX 602 ; N uni01B4 ; G 374\nU 437 ; WX 602 ; N uni01B5 ; G 375\nU 438 ; WX 602 ; N uni01B6 ; G 376\nU 439 ; WX 602 ; N uni01B7 ; G 377\nU 440 ; WX 602 ; N uni01B8 ; G 378\nU 441 ; WX 602 ; N uni01B9 ; G 379\nU 442 ; WX 602 ; N uni01BA ; G 380\nU 443 ; WX 602 ; N uni01BB ; G 381\nU 444 ; WX 602 ; N uni01BC ; G 382\nU 445 ; WX 602 ; N uni01BD ; G 383\nU 446 ; WX 602 ; N uni01BE ; G 384\nU 447 ; WX 602 ; N uni01BF ; G 385\nU 448 ; WX 602 ; N uni01C0 ; G 386\nU 449 ; WX 602 ; N uni01C1 ; G 387\nU 450 ; WX 602 ; N uni01C2 ; G 388\nU 451 ; WX 602 ; N uni01C3 ; G 389\nU 461 ; WX 602 ; N uni01CD ; G 390\nU 462 ; WX 602 ; N uni01CE ; G 391\nU 463 ; WX 602 ; N uni01CF ; G 392\nU 464 ; WX 602 ; N uni01D0 ; G 393\nU 465 ; WX 602 ; N uni01D1 ; G 394\nU 466 ; WX 602 ; N uni01D2 ; G 395\nU 467 ; WX 602 ; N uni01D3 ; G 396\nU 468 ; WX 602 ; N uni01D4 ; G 397\nU 469 ; WX 602 ; N uni01D5 ; G 398\nU 470 ; WX 602 ; N uni01D6 ; G 399\nU 471 ; WX 602 ; N uni01D7 ; G 400\nU 472 ; WX 602 ; N uni01D8 ; G 401\nU 473 ; WX 602 ; N uni01D9 ; G 402\nU 474 ; WX 602 ; N uni01DA ; G 403\nU 475 ; WX 602 ; N uni01DB ; G 404\nU 476 ; WX 602 ; N uni01DC ; G 405\nU 477 ; WX 602 ; N uni01DD ; G 406\nU 478 ; WX 602 ; N uni01DE ; G 407\nU 479 ; WX 602 ; N uni01DF ; G 408\nU 480 ; WX 602 ; N uni01E0 ; G 409\nU 481 ; WX 602 ; N uni01E1 ; G 410\nU 482 ; WX 602 ; N uni01E2 ; G 411\nU 483 ; WX 602 ; N uni01E3 ; G 412\nU 486 ; WX 602 ; N Gcaron ; G 413\nU 487 ; WX 602 ; N gcaron ; G 414\nU 488 ; WX 602 ; N uni01E8 ; G 415\nU 489 ; WX 602 ; N uni01E9 ; G 416\nU 490 ; WX 602 ; N uni01EA ; G 417\nU 491 ; WX 602 ; N uni01EB ; G 418\nU 492 ; WX 602 ; N uni01EC ; G 419\nU 493 ; WX 602 ; N uni01ED ; G 420\nU 494 ; WX 602 ; N uni01EE ; G 421\nU 495 ; WX 602 ; N uni01EF ; G 422\nU 496 ; WX 602 ; N uni01F0 ; G 423\nU 500 ; WX 602 ; N uni01F4 ; G 424\nU 501 ; WX 602 ; N uni01F5 ; G 425\nU 502 ; WX 602 ; N uni01F6 ; G 426\nU 504 ; WX 602 ; N uni01F8 ; G 427\nU 505 ; WX 602 ; N uni01F9 ; G 428\nU 508 ; WX 602 ; N AEacute ; G 429\nU 509 ; WX 602 ; N aeacute ; G 430\nU 510 ; WX 602 ; N Oslashacute ; G 431\nU 511 ; WX 602 ; N oslashacute ; G 432\nU 512 ; WX 602 ; N uni0200 ; G 433\nU 513 ; WX 602 ; N uni0201 ; G 434\nU 514 ; WX 602 ; N uni0202 ; G 435\nU 515 ; WX 602 ; N uni0203 ; G 436\nU 516 ; WX 602 ; N uni0204 ; G 437\nU 517 ; WX 602 ; N uni0205 ; G 438\nU 518 ; WX 602 ; N uni0206 ; G 439\nU 519 ; WX 602 ; N uni0207 ; G 440\nU 520 ; WX 602 ; N uni0208 ; G 441\nU 521 ; WX 602 ; N uni0209 ; G 442\nU 522 ; WX 602 ; N uni020A ; G 443\nU 523 ; WX 602 ; N uni020B ; G 444\nU 524 ; WX 602 ; N uni020C ; G 445\nU 525 ; WX 602 ; N uni020D ; G 446\nU 526 ; WX 602 ; N uni020E ; G 447\nU 527 ; WX 602 ; N uni020F ; G 448\nU 528 ; WX 602 ; N uni0210 ; G 449\nU 529 ; WX 602 ; N uni0211 ; G 450\nU 530 ; WX 602 ; N uni0212 ; G 451\nU 531 ; WX 602 ; N uni0213 ; G 452\nU 532 ; WX 602 ; N uni0214 ; G 453\nU 533 ; WX 602 ; N uni0215 ; G 454\nU 534 ; WX 602 ; N uni0216 ; G 455\nU 535 ; WX 602 ; N uni0217 ; G 456\nU 536 ; WX 602 ; N Scommaaccent ; G 457\nU 537 ; WX 602 ; N scommaaccent ; G 458\nU 538 ; WX 602 ; N uni021A ; G 459\nU 539 ; WX 602 ; N uni021B ; G 460\nU 540 ; WX 602 ; N uni021C ; G 461\nU 541 ; WX 602 ; N uni021D ; G 462\nU 542 ; WX 602 ; N uni021E ; G 463\nU 543 ; WX 602 ; N uni021F ; G 464\nU 544 ; WX 602 ; N uni0220 ; G 465\nU 545 ; WX 602 ; N uni0221 ; G 466\nU 548 ; WX 602 ; N uni0224 ; G 467\nU 549 ; WX 602 ; N uni0225 ; G 468\nU 550 ; WX 602 ; N uni0226 ; G 469\nU 551 ; WX 602 ; N uni0227 ; G 470\nU 552 ; WX 602 ; N uni0228 ; G 471\nU 553 ; WX 602 ; N uni0229 ; G 472\nU 554 ; WX 602 ; N uni022A ; G 473\nU 555 ; WX 602 ; N uni022B ; G 474\nU 556 ; WX 602 ; N uni022C ; G 475\nU 557 ; WX 602 ; N uni022D ; G 476\nU 558 ; WX 602 ; N uni022E ; G 477\nU 559 ; WX 602 ; N uni022F ; G 478\nU 560 ; WX 602 ; N uni0230 ; G 479\nU 561 ; WX 602 ; N uni0231 ; G 480\nU 562 ; WX 602 ; N uni0232 ; G 481\nU 563 ; WX 602 ; N uni0233 ; G 482\nU 564 ; WX 602 ; N uni0234 ; G 483\nU 565 ; WX 602 ; N uni0235 ; G 484\nU 566 ; WX 602 ; N uni0236 ; G 485\nU 567 ; WX 602 ; N dotlessj ; G 486\nU 568 ; WX 602 ; N uni0238 ; G 487\nU 569 ; WX 602 ; N uni0239 ; G 488\nU 570 ; WX 602 ; N uni023A ; G 489\nU 571 ; WX 602 ; N uni023B ; G 490\nU 572 ; WX 602 ; N uni023C ; G 491\nU 573 ; WX 602 ; N uni023D ; G 492\nU 574 ; WX 602 ; N uni023E ; G 493\nU 575 ; WX 602 ; N uni023F ; G 494\nU 576 ; WX 602 ; N uni0240 ; G 495\nU 577 ; WX 602 ; N uni0241 ; G 496\nU 579 ; WX 602 ; N uni0243 ; G 497\nU 580 ; WX 602 ; N uni0244 ; G 498\nU 581 ; WX 602 ; N uni0245 ; G 499\nU 588 ; WX 602 ; N uni024C ; G 500\nU 589 ; WX 602 ; N uni024D ; G 501\nU 592 ; WX 602 ; N uni0250 ; G 502\nU 593 ; WX 602 ; N uni0251 ; G 503\nU 594 ; WX 602 ; N uni0252 ; G 504\nU 595 ; WX 602 ; N uni0253 ; G 505\nU 596 ; WX 602 ; N uni0254 ; G 506\nU 597 ; WX 602 ; N uni0255 ; G 507\nU 598 ; WX 602 ; N uni0256 ; G 508\nU 599 ; WX 602 ; N uni0257 ; G 509\nU 600 ; WX 602 ; N uni0258 ; G 510\nU 601 ; WX 602 ; N uni0259 ; G 511\nU 602 ; WX 602 ; N uni025A ; G 512\nU 603 ; WX 602 ; N uni025B ; G 513\nU 604 ; WX 602 ; N uni025C ; G 514\nU 605 ; WX 602 ; N uni025D ; G 515\nU 606 ; WX 602 ; N uni025E ; G 516\nU 607 ; WX 602 ; N uni025F ; G 517\nU 608 ; WX 602 ; N uni0260 ; G 518\nU 609 ; WX 602 ; N uni0261 ; G 519\nU 610 ; WX 602 ; N uni0262 ; G 520\nU 611 ; WX 602 ; N uni0263 ; G 521\nU 612 ; WX 602 ; N uni0264 ; G 522\nU 613 ; WX 602 ; N uni0265 ; G 523\nU 614 ; WX 602 ; N uni0266 ; G 524\nU 615 ; WX 602 ; N uni0267 ; G 525\nU 616 ; WX 602 ; N uni0268 ; G 526\nU 617 ; WX 602 ; N uni0269 ; G 527\nU 618 ; WX 602 ; N uni026A ; G 528\nU 619 ; WX 602 ; N uni026B ; G 529\nU 620 ; WX 602 ; N uni026C ; G 530\nU 621 ; WX 602 ; N uni026D ; G 531\nU 622 ; WX 602 ; N uni026E ; G 532\nU 623 ; WX 602 ; N uni026F ; G 533\nU 624 ; WX 602 ; N uni0270 ; G 534\nU 625 ; WX 602 ; N uni0271 ; G 535\nU 626 ; WX 602 ; N uni0272 ; G 536\nU 627 ; WX 602 ; N uni0273 ; G 537\nU 628 ; WX 602 ; N uni0274 ; G 538\nU 629 ; WX 602 ; N uni0275 ; G 539\nU 630 ; WX 602 ; N uni0276 ; G 540\nU 631 ; WX 602 ; N uni0277 ; G 541\nU 632 ; WX 602 ; N uni0278 ; G 542\nU 633 ; WX 602 ; N uni0279 ; G 543\nU 634 ; WX 602 ; N uni027A ; G 544\nU 635 ; WX 602 ; N uni027B ; G 545\nU 636 ; WX 602 ; N uni027C ; G 546\nU 637 ; WX 602 ; N uni027D ; G 547\nU 638 ; WX 602 ; N uni027E ; G 548\nU 639 ; WX 602 ; N uni027F ; G 549\nU 640 ; WX 602 ; N uni0280 ; G 550\nU 641 ; WX 602 ; N uni0281 ; G 551\nU 642 ; WX 602 ; N uni0282 ; G 552\nU 643 ; WX 602 ; N uni0283 ; G 553\nU 644 ; WX 602 ; N uni0284 ; G 554\nU 645 ; WX 602 ; N uni0285 ; G 555\nU 646 ; WX 602 ; N uni0286 ; G 556\nU 647 ; WX 602 ; N uni0287 ; G 557\nU 648 ; WX 602 ; N uni0288 ; G 558\nU 649 ; WX 602 ; N uni0289 ; G 559\nU 650 ; WX 602 ; N uni028A ; G 560\nU 651 ; WX 602 ; N uni028B ; G 561\nU 652 ; WX 602 ; N uni028C ; G 562\nU 653 ; WX 602 ; N uni028D ; G 563\nU 654 ; WX 602 ; N uni028E ; G 564\nU 655 ; WX 602 ; N uni028F ; G 565\nU 656 ; WX 602 ; N uni0290 ; G 566\nU 657 ; WX 602 ; N uni0291 ; G 567\nU 658 ; WX 602 ; N uni0292 ; G 568\nU 659 ; WX 602 ; N uni0293 ; G 569\nU 660 ; WX 602 ; N uni0294 ; G 570\nU 661 ; WX 602 ; N uni0295 ; G 571\nU 662 ; WX 602 ; N uni0296 ; G 572\nU 663 ; WX 602 ; N uni0297 ; G 573\nU 664 ; WX 602 ; N uni0298 ; G 574\nU 665 ; WX 602 ; N uni0299 ; G 575\nU 666 ; WX 602 ; N uni029A ; G 576\nU 667 ; WX 602 ; N uni029B ; G 577\nU 668 ; WX 602 ; N uni029C ; G 578\nU 669 ; WX 602 ; N uni029D ; G 579\nU 670 ; WX 602 ; N uni029E ; G 580\nU 671 ; WX 602 ; N uni029F ; G 581\nU 672 ; WX 602 ; N uni02A0 ; G 582\nU 673 ; WX 602 ; N uni02A1 ; G 583\nU 674 ; WX 602 ; N uni02A2 ; G 584\nU 675 ; WX 602 ; N uni02A3 ; G 585\nU 676 ; WX 602 ; N uni02A4 ; G 586\nU 677 ; WX 602 ; N uni02A5 ; G 587\nU 678 ; WX 602 ; N uni02A6 ; G 588\nU 679 ; WX 602 ; N uni02A7 ; G 589\nU 680 ; WX 602 ; N uni02A8 ; G 590\nU 681 ; WX 602 ; N uni02A9 ; G 591\nU 682 ; WX 602 ; N uni02AA ; G 592\nU 683 ; WX 602 ; N uni02AB ; G 593\nU 684 ; WX 602 ; N uni02AC ; G 594\nU 685 ; WX 602 ; N uni02AD ; G 595\nU 686 ; WX 602 ; N uni02AE ; G 596\nU 687 ; WX 602 ; N uni02AF ; G 597\nU 688 ; WX 602 ; N uni02B0 ; G 598\nU 689 ; WX 602 ; N uni02B1 ; G 599\nU 690 ; WX 602 ; N uni02B2 ; G 600\nU 691 ; WX 602 ; N uni02B3 ; G 601\nU 692 ; WX 602 ; N uni02B4 ; G 602\nU 693 ; WX 602 ; N uni02B5 ; G 603\nU 694 ; WX 602 ; N uni02B6 ; G 604\nU 695 ; WX 602 ; N uni02B7 ; G 605\nU 696 ; WX 602 ; N uni02B8 ; G 606\nU 697 ; WX 602 ; N uni02B9 ; G 607\nU 699 ; WX 602 ; N uni02BB ; G 608\nU 700 ; WX 602 ; N uni02BC ; G 609\nU 701 ; WX 602 ; N uni02BD ; G 610\nU 702 ; WX 602 ; N uni02BE ; G 611\nU 703 ; WX 602 ; N uni02BF ; G 612\nU 704 ; WX 602 ; N uni02C0 ; G 613\nU 705 ; WX 602 ; N uni02C1 ; G 614\nU 710 ; WX 602 ; N circumflex ; G 615\nU 711 ; WX 602 ; N caron ; G 616\nU 712 ; WX 602 ; N uni02C8 ; G 617\nU 713 ; WX 602 ; N uni02C9 ; G 618\nU 716 ; WX 602 ; N uni02CC ; G 619\nU 717 ; WX 602 ; N uni02CD ; G 620\nU 718 ; WX 602 ; N uni02CE ; G 621\nU 719 ; WX 602 ; N uni02CF ; G 622\nU 720 ; WX 602 ; N uni02D0 ; G 623\nU 721 ; WX 602 ; N uni02D1 ; G 624\nU 722 ; WX 602 ; N uni02D2 ; G 625\nU 723 ; WX 602 ; N uni02D3 ; G 626\nU 726 ; WX 602 ; N uni02D6 ; G 627\nU 727 ; WX 602 ; N uni02D7 ; G 628\nU 728 ; WX 602 ; N breve ; G 629\nU 729 ; WX 602 ; N dotaccent ; G 630\nU 730 ; WX 602 ; N ring ; G 631\nU 731 ; WX 602 ; N ogonek ; G 632\nU 732 ; WX 602 ; N tilde ; G 633\nU 733 ; WX 602 ; N hungarumlaut ; G 634\nU 734 ; WX 602 ; N uni02DE ; G 635\nU 736 ; WX 602 ; N uni02E0 ; G 636\nU 737 ; WX 602 ; N uni02E1 ; G 637\nU 738 ; WX 602 ; N uni02E2 ; G 638\nU 739 ; WX 602 ; N uni02E3 ; G 639\nU 740 ; WX 602 ; N uni02E4 ; G 640\nU 741 ; WX 602 ; N uni02E5 ; G 641\nU 742 ; WX 602 ; N uni02E6 ; G 642\nU 743 ; WX 602 ; N uni02E7 ; G 643\nU 744 ; WX 602 ; N uni02E8 ; G 644\nU 745 ; WX 602 ; N uni02E9 ; G 645\nU 750 ; WX 602 ; N uni02EE ; G 646\nU 755 ; WX 602 ; N uni02F3 ; G 647\nU 768 ; WX 602 ; N gravecomb ; G 648\nU 769 ; WX 602 ; N acutecomb ; G 649\nU 770 ; WX 602 ; N uni0302 ; G 650\nU 771 ; WX 602 ; N tildecomb ; G 651\nU 772 ; WX 602 ; N uni0304 ; G 652\nU 773 ; WX 602 ; N uni0305 ; G 653\nU 774 ; WX 602 ; N uni0306 ; G 654\nU 775 ; WX 602 ; N uni0307 ; G 655\nU 776 ; WX 602 ; N uni0308 ; G 656\nU 777 ; WX 602 ; N hookabovecomb ; G 657\nU 778 ; WX 602 ; N uni030A ; G 658\nU 779 ; WX 602 ; N uni030B ; G 659\nU 780 ; WX 602 ; N uni030C ; G 660\nU 781 ; WX 602 ; N uni030D ; G 661\nU 782 ; WX 602 ; N uni030E ; G 662\nU 783 ; WX 602 ; N uni030F ; G 663\nU 784 ; WX 602 ; N uni0310 ; G 664\nU 785 ; WX 602 ; N uni0311 ; G 665\nU 786 ; WX 602 ; N uni0312 ; G 666\nU 787 ; WX 602 ; N uni0313 ; G 667\nU 788 ; WX 602 ; N uni0314 ; G 668\nU 789 ; WX 602 ; N uni0315 ; G 669\nU 790 ; WX 602 ; N uni0316 ; G 670\nU 791 ; WX 602 ; N uni0317 ; G 671\nU 792 ; WX 602 ; N uni0318 ; G 672\nU 793 ; WX 602 ; N uni0319 ; G 673\nU 794 ; WX 602 ; N uni031A ; G 674\nU 795 ; WX 602 ; N uni031B ; G 675\nU 796 ; WX 602 ; N uni031C ; G 676\nU 797 ; WX 602 ; N uni031D ; G 677\nU 798 ; WX 602 ; N uni031E ; G 678\nU 799 ; WX 602 ; N uni031F ; G 679\nU 800 ; WX 602 ; N uni0320 ; G 680\nU 801 ; WX 602 ; N uni0321 ; G 681\nU 802 ; WX 602 ; N uni0322 ; G 682\nU 803 ; WX 602 ; N dotbelowcomb ; G 683\nU 804 ; WX 602 ; N uni0324 ; G 684\nU 805 ; WX 602 ; N uni0325 ; G 685\nU 806 ; WX 602 ; N uni0326 ; G 686\nU 807 ; WX 602 ; N uni0327 ; G 687\nU 808 ; WX 602 ; N uni0328 ; G 688\nU 809 ; WX 602 ; N uni0329 ; G 689\nU 810 ; WX 602 ; N uni032A ; G 690\nU 811 ; WX 602 ; N uni032B ; G 691\nU 812 ; WX 602 ; N uni032C ; G 692\nU 813 ; WX 602 ; N uni032D ; G 693\nU 814 ; WX 602 ; N uni032E ; G 694\nU 815 ; WX 602 ; N uni032F ; G 695\nU 816 ; WX 602 ; N uni0330 ; G 696\nU 817 ; WX 602 ; N uni0331 ; G 697\nU 818 ; WX 602 ; N uni0332 ; G 698\nU 819 ; WX 602 ; N uni0333 ; G 699\nU 820 ; WX 602 ; N uni0334 ; G 700\nU 821 ; WX 602 ; N uni0335 ; G 701\nU 822 ; WX 602 ; N uni0336 ; G 702\nU 823 ; WX 602 ; N uni0337 ; G 703\nU 824 ; WX 602 ; N uni0338 ; G 704\nU 825 ; WX 602 ; N uni0339 ; G 705\nU 826 ; WX 602 ; N uni033A ; G 706\nU 827 ; WX 602 ; N uni033B ; G 707\nU 828 ; WX 602 ; N uni033C ; G 708\nU 829 ; WX 602 ; N uni033D ; G 709\nU 830 ; WX 602 ; N uni033E ; G 710\nU 831 ; WX 602 ; N uni033F ; G 711\nU 835 ; WX 602 ; N uni0343 ; G 712\nU 856 ; WX 602 ; N uni0358 ; G 713\nU 865 ; WX 602 ; N uni0361 ; G 714\nU 884 ; WX 602 ; N uni0374 ; G 715\nU 885 ; WX 602 ; N uni0375 ; G 716\nU 886 ; WX 602 ; N uni0376 ; G 717\nU 887 ; WX 602 ; N uni0377 ; G 718\nU 890 ; WX 602 ; N uni037A ; G 719\nU 891 ; WX 602 ; N uni037B ; G 720\nU 892 ; WX 602 ; N uni037C ; G 721\nU 893 ; WX 602 ; N uni037D ; G 722\nU 894 ; WX 602 ; N uni037E ; G 723\nU 895 ; WX 602 ; N uni037F ; G 724\nU 900 ; WX 602 ; N tonos ; G 725\nU 901 ; WX 602 ; N dieresistonos ; G 726\nU 902 ; WX 602 ; N Alphatonos ; G 727\nU 903 ; WX 602 ; N anoteleia ; G 728\nU 904 ; WX 602 ; N Epsilontonos ; G 729\nU 905 ; WX 602 ; N Etatonos ; G 730\nU 906 ; WX 602 ; N Iotatonos ; G 731\nU 908 ; WX 602 ; N Omicrontonos ; G 732\nU 910 ; WX 602 ; N Upsilontonos ; G 733\nU 911 ; WX 602 ; N Omegatonos ; G 734\nU 912 ; WX 602 ; N iotadieresistonos ; G 735\nU 913 ; WX 602 ; N Alpha ; G 736\nU 914 ; WX 602 ; N Beta ; G 737\nU 915 ; WX 602 ; N Gamma ; G 738\nU 916 ; WX 602 ; N uni0394 ; G 739\nU 917 ; WX 602 ; N Epsilon ; G 740\nU 918 ; WX 602 ; N Zeta ; G 741\nU 919 ; WX 602 ; N Eta ; G 742\nU 920 ; WX 602 ; N Theta ; G 743\nU 921 ; WX 602 ; N Iota ; G 744\nU 922 ; WX 602 ; N Kappa ; G 745\nU 923 ; WX 602 ; N Lambda ; G 746\nU 924 ; WX 602 ; N Mu ; G 747\nU 925 ; WX 602 ; N Nu ; G 748\nU 926 ; WX 602 ; N Xi ; G 749\nU 927 ; WX 602 ; N Omicron ; G 750\nU 928 ; WX 602 ; N Pi ; G 751\nU 929 ; WX 602 ; N Rho ; G 752\nU 931 ; WX 602 ; N Sigma ; G 753\nU 932 ; WX 602 ; N Tau ; G 754\nU 933 ; WX 602 ; N Upsilon ; G 755\nU 934 ; WX 602 ; N Phi ; G 756\nU 935 ; WX 602 ; N Chi ; G 757\nU 936 ; WX 602 ; N Psi ; G 758\nU 937 ; WX 602 ; N Omega ; G 759\nU 938 ; WX 602 ; N Iotadieresis ; G 760\nU 939 ; WX 602 ; N Upsilondieresis ; G 761\nU 940 ; WX 602 ; N alphatonos ; G 762\nU 941 ; WX 602 ; N epsilontonos ; G 763\nU 942 ; WX 602 ; N etatonos ; G 764\nU 943 ; WX 602 ; N iotatonos ; G 765\nU 944 ; WX 602 ; N upsilondieresistonos ; G 766\nU 945 ; WX 602 ; N alpha ; G 767\nU 946 ; WX 602 ; N beta ; G 768\nU 947 ; WX 602 ; N gamma ; G 769\nU 948 ; WX 602 ; N delta ; G 770\nU 949 ; WX 602 ; N epsilon ; G 771\nU 950 ; WX 602 ; N zeta ; G 772\nU 951 ; WX 602 ; N eta ; G 773\nU 952 ; WX 602 ; N theta ; G 774\nU 953 ; WX 602 ; N iota ; G 775\nU 954 ; WX 602 ; N kappa ; G 776\nU 955 ; WX 602 ; N lambda ; G 777\nU 956 ; WX 602 ; N uni03BC ; G 778\nU 957 ; WX 602 ; N nu ; G 779\nU 958 ; WX 602 ; N xi ; G 780\nU 959 ; WX 602 ; N omicron ; G 781\nU 960 ; WX 602 ; N pi ; G 782\nU 961 ; WX 602 ; N rho ; G 783\nU 962 ; WX 602 ; N sigma1 ; G 784\nU 963 ; WX 602 ; N sigma ; G 785\nU 964 ; WX 602 ; N tau ; G 786\nU 965 ; WX 602 ; N upsilon ; G 787\nU 966 ; WX 602 ; N phi ; G 788\nU 967 ; WX 602 ; N chi ; G 789\nU 968 ; WX 602 ; N psi ; G 790\nU 969 ; WX 602 ; N omega ; G 791\nU 970 ; WX 602 ; N iotadieresis ; G 792\nU 971 ; WX 602 ; N upsilondieresis ; G 793\nU 972 ; WX 602 ; N omicrontonos ; G 794\nU 973 ; WX 602 ; N upsilontonos ; G 795\nU 974 ; WX 602 ; N omegatonos ; G 796\nU 976 ; WX 602 ; N uni03D0 ; G 797\nU 977 ; WX 602 ; N theta1 ; G 798\nU 978 ; WX 602 ; N Upsilon1 ; G 799\nU 979 ; WX 602 ; N uni03D3 ; G 800\nU 980 ; WX 602 ; N uni03D4 ; G 801\nU 981 ; WX 602 ; N phi1 ; G 802\nU 982 ; WX 602 ; N omega1 ; G 803\nU 983 ; WX 602 ; N uni03D7 ; G 804\nU 984 ; WX 602 ; N uni03D8 ; G 805\nU 985 ; WX 602 ; N uni03D9 ; G 806\nU 986 ; WX 602 ; N uni03DA ; G 807\nU 987 ; WX 602 ; N uni03DB ; G 808\nU 988 ; WX 602 ; N uni03DC ; G 809\nU 989 ; WX 602 ; N uni03DD ; G 810\nU 990 ; WX 602 ; N uni03DE ; G 811\nU 991 ; WX 602 ; N uni03DF ; G 812\nU 992 ; WX 602 ; N uni03E0 ; G 813\nU 993 ; WX 602 ; N uni03E1 ; G 814\nU 1008 ; WX 602 ; N uni03F0 ; G 815\nU 1009 ; WX 602 ; N uni03F1 ; G 816\nU 1010 ; WX 602 ; N uni03F2 ; G 817\nU 1011 ; WX 602 ; N uni03F3 ; G 818\nU 1012 ; WX 602 ; N uni03F4 ; G 819\nU 1013 ; WX 602 ; N uni03F5 ; G 820\nU 1014 ; WX 602 ; N uni03F6 ; G 821\nU 1015 ; WX 602 ; N uni03F7 ; G 822\nU 1016 ; WX 602 ; N uni03F8 ; G 823\nU 1017 ; WX 602 ; N uni03F9 ; G 824\nU 1018 ; WX 602 ; N uni03FA ; G 825\nU 1019 ; WX 602 ; N uni03FB ; G 826\nU 1020 ; WX 602 ; N uni03FC ; G 827\nU 1021 ; WX 602 ; N uni03FD ; G 828\nU 1022 ; WX 602 ; N uni03FE ; G 829\nU 1023 ; WX 602 ; N uni03FF ; G 830\nU 1024 ; WX 602 ; N uni0400 ; G 831\nU 1025 ; WX 602 ; N uni0401 ; G 832\nU 1026 ; WX 602 ; N uni0402 ; G 833\nU 1027 ; WX 602 ; N uni0403 ; G 834\nU 1028 ; WX 602 ; N uni0404 ; G 835\nU 1029 ; WX 602 ; N uni0405 ; G 836\nU 1030 ; WX 602 ; N uni0406 ; G 837\nU 1031 ; WX 602 ; N uni0407 ; G 838\nU 1032 ; WX 602 ; N uni0408 ; G 839\nU 1033 ; WX 602 ; N uni0409 ; G 840\nU 1034 ; WX 602 ; N uni040A ; G 841\nU 1035 ; WX 602 ; N uni040B ; G 842\nU 1036 ; WX 602 ; N uni040C ; G 843\nU 1037 ; WX 602 ; N uni040D ; G 844\nU 1038 ; WX 602 ; N uni040E ; G 845\nU 1039 ; WX 602 ; N uni040F ; G 846\nU 1040 ; WX 602 ; N uni0410 ; G 847\nU 1041 ; WX 602 ; N uni0411 ; G 848\nU 1042 ; WX 602 ; N uni0412 ; G 849\nU 1043 ; WX 602 ; N uni0413 ; G 850\nU 1044 ; WX 602 ; N uni0414 ; G 851\nU 1045 ; WX 602 ; N uni0415 ; G 852\nU 1046 ; WX 602 ; N uni0416 ; G 853\nU 1047 ; WX 602 ; N uni0417 ; G 854\nU 1048 ; WX 602 ; N uni0418 ; G 855\nU 1049 ; WX 602 ; N uni0419 ; G 856\nU 1050 ; WX 602 ; N uni041A ; G 857\nU 1051 ; WX 602 ; N uni041B ; G 858\nU 1052 ; WX 602 ; N uni041C ; G 859\nU 1053 ; WX 602 ; N uni041D ; G 860\nU 1054 ; WX 602 ; N uni041E ; G 861\nU 1055 ; WX 602 ; N uni041F ; G 862\nU 1056 ; WX 602 ; N uni0420 ; G 863\nU 1057 ; WX 602 ; N uni0421 ; G 864\nU 1058 ; WX 602 ; N uni0422 ; G 865\nU 1059 ; WX 602 ; N uni0423 ; G 866\nU 1060 ; WX 602 ; N uni0424 ; G 867\nU 1061 ; WX 602 ; N uni0425 ; G 868\nU 1062 ; WX 602 ; N uni0426 ; G 869\nU 1063 ; WX 602 ; N uni0427 ; G 870\nU 1064 ; WX 602 ; N uni0428 ; G 871\nU 1065 ; WX 602 ; N uni0429 ; G 872\nU 1066 ; WX 602 ; N uni042A ; G 873\nU 1067 ; WX 602 ; N uni042B ; G 874\nU 1068 ; WX 602 ; N uni042C ; G 875\nU 1069 ; WX 602 ; N uni042D ; G 876\nU 1070 ; WX 602 ; N uni042E ; G 877\nU 1071 ; WX 602 ; N uni042F ; G 878\nU 1072 ; WX 602 ; N uni0430 ; G 879\nU 1073 ; WX 602 ; N uni0431 ; G 880\nU 1074 ; WX 602 ; N uni0432 ; G 881\nU 1075 ; WX 602 ; N uni0433 ; G 882\nU 1076 ; WX 602 ; N uni0434 ; G 883\nU 1077 ; WX 602 ; N uni0435 ; G 884\nU 1078 ; WX 602 ; N uni0436 ; G 885\nU 1079 ; WX 602 ; N uni0437 ; G 886\nU 1080 ; WX 602 ; N uni0438 ; G 887\nU 1081 ; WX 602 ; N uni0439 ; G 888\nU 1082 ; WX 602 ; N uni043A ; G 889\nU 1083 ; WX 602 ; N uni043B ; G 890\nU 1084 ; WX 602 ; N uni043C ; G 891\nU 1085 ; WX 602 ; N uni043D ; G 892\nU 1086 ; WX 602 ; N uni043E ; G 893\nU 1087 ; WX 602 ; N uni043F ; G 894\nU 1088 ; WX 602 ; N uni0440 ; G 895\nU 1089 ; WX 602 ; N uni0441 ; G 896\nU 1090 ; WX 602 ; N uni0442 ; G 897\nU 1091 ; WX 602 ; N uni0443 ; G 898\nU 1092 ; WX 602 ; N uni0444 ; G 899\nU 1093 ; WX 602 ; N uni0445 ; G 900\nU 1094 ; WX 602 ; N uni0446 ; G 901\nU 1095 ; WX 602 ; N uni0447 ; G 902\nU 1096 ; WX 602 ; N uni0448 ; G 903\nU 1097 ; WX 602 ; N uni0449 ; G 904\nU 1098 ; WX 602 ; N uni044A ; G 905\nU 1099 ; WX 602 ; N uni044B ; G 906\nU 1100 ; WX 602 ; N uni044C ; G 907\nU 1101 ; WX 602 ; N uni044D ; G 908\nU 1102 ; WX 602 ; N uni044E ; G 909\nU 1103 ; WX 602 ; N uni044F ; G 910\nU 1104 ; WX 602 ; N uni0450 ; G 911\nU 1105 ; WX 602 ; N uni0451 ; G 912\nU 1106 ; WX 602 ; N uni0452 ; G 913\nU 1107 ; WX 602 ; N uni0453 ; G 914\nU 1108 ; WX 602 ; N uni0454 ; G 915\nU 1109 ; WX 602 ; N uni0455 ; G 916\nU 1110 ; WX 602 ; N uni0456 ; G 917\nU 1111 ; WX 602 ; N uni0457 ; G 918\nU 1112 ; WX 602 ; N uni0458 ; G 919\nU 1113 ; WX 602 ; N uni0459 ; G 920\nU 1114 ; WX 602 ; N uni045A ; G 921\nU 1115 ; WX 602 ; N uni045B ; G 922\nU 1116 ; WX 602 ; N uni045C ; G 923\nU 1117 ; WX 602 ; N uni045D ; G 924\nU 1118 ; WX 602 ; N uni045E ; G 925\nU 1119 ; WX 602 ; N uni045F ; G 926\nU 1122 ; WX 602 ; N uni0462 ; G 927\nU 1123 ; WX 602 ; N uni0463 ; G 928\nU 1138 ; WX 602 ; N uni0472 ; G 929\nU 1139 ; WX 602 ; N uni0473 ; G 930\nU 1168 ; WX 602 ; N uni0490 ; G 931\nU 1169 ; WX 602 ; N uni0491 ; G 932\nU 1170 ; WX 602 ; N uni0492 ; G 933\nU 1171 ; WX 602 ; N uni0493 ; G 934\nU 1172 ; WX 602 ; N uni0494 ; G 935\nU 1173 ; WX 602 ; N uni0495 ; G 936\nU 1174 ; WX 602 ; N uni0496 ; G 937\nU 1175 ; WX 602 ; N uni0497 ; G 938\nU 1176 ; WX 602 ; N uni0498 ; G 939\nU 1177 ; WX 602 ; N uni0499 ; G 940\nU 1178 ; WX 602 ; N uni049A ; G 941\nU 1179 ; WX 602 ; N uni049B ; G 942\nU 1186 ; WX 602 ; N uni04A2 ; G 943\nU 1187 ; WX 602 ; N uni04A3 ; G 944\nU 1188 ; WX 602 ; N uni04A4 ; G 945\nU 1189 ; WX 602 ; N uni04A5 ; G 946\nU 1194 ; WX 602 ; N uni04AA ; G 947\nU 1195 ; WX 602 ; N uni04AB ; G 948\nU 1196 ; WX 602 ; N uni04AC ; G 949\nU 1197 ; WX 602 ; N uni04AD ; G 950\nU 1198 ; WX 602 ; N uni04AE ; G 951\nU 1199 ; WX 602 ; N uni04AF ; G 952\nU 1200 ; WX 602 ; N uni04B0 ; G 953\nU 1201 ; WX 602 ; N uni04B1 ; G 954\nU 1202 ; WX 602 ; N uni04B2 ; G 955\nU 1203 ; WX 602 ; N uni04B3 ; G 956\nU 1210 ; WX 602 ; N uni04BA ; G 957\nU 1211 ; WX 602 ; N uni04BB ; G 958\nU 1216 ; WX 602 ; N uni04C0 ; G 959\nU 1217 ; WX 602 ; N uni04C1 ; G 960\nU 1218 ; WX 602 ; N uni04C2 ; G 961\nU 1219 ; WX 602 ; N uni04C3 ; G 962\nU 1220 ; WX 602 ; N uni04C4 ; G 963\nU 1223 ; WX 602 ; N uni04C7 ; G 964\nU 1224 ; WX 602 ; N uni04C8 ; G 965\nU 1227 ; WX 602 ; N uni04CB ; G 966\nU 1228 ; WX 602 ; N uni04CC ; G 967\nU 1231 ; WX 602 ; N uni04CF ; G 968\nU 1232 ; WX 602 ; N uni04D0 ; G 969\nU 1233 ; WX 602 ; N uni04D1 ; G 970\nU 1234 ; WX 602 ; N uni04D2 ; G 971\nU 1235 ; WX 602 ; N uni04D3 ; G 972\nU 1236 ; WX 602 ; N uni04D4 ; G 973\nU 1237 ; WX 602 ; N uni04D5 ; G 974\nU 1238 ; WX 602 ; N uni04D6 ; G 975\nU 1239 ; WX 602 ; N uni04D7 ; G 976\nU 1240 ; WX 602 ; N uni04D8 ; G 977\nU 1241 ; WX 602 ; N uni04D9 ; G 978\nU 1242 ; WX 602 ; N uni04DA ; G 979\nU 1243 ; WX 602 ; N uni04DB ; G 980\nU 1244 ; WX 602 ; N uni04DC ; G 981\nU 1245 ; WX 602 ; N uni04DD ; G 982\nU 1246 ; WX 602 ; N uni04DE ; G 983\nU 1247 ; WX 602 ; N uni04DF ; G 984\nU 1248 ; WX 602 ; N uni04E0 ; G 985\nU 1249 ; WX 602 ; N uni04E1 ; G 986\nU 1250 ; WX 602 ; N uni04E2 ; G 987\nU 1251 ; WX 602 ; N uni04E3 ; G 988\nU 1252 ; WX 602 ; N uni04E4 ; G 989\nU 1253 ; WX 602 ; N uni04E5 ; G 990\nU 1254 ; WX 602 ; N uni04E6 ; G 991\nU 1255 ; WX 602 ; N uni04E7 ; G 992\nU 1256 ; WX 602 ; N uni04E8 ; G 993\nU 1257 ; WX 602 ; N uni04E9 ; G 994\nU 1258 ; WX 602 ; N uni04EA ; G 995\nU 1259 ; WX 602 ; N uni04EB ; G 996\nU 1260 ; WX 602 ; N uni04EC ; G 997\nU 1261 ; WX 602 ; N uni04ED ; G 998\nU 1262 ; WX 602 ; N uni04EE ; G 999\nU 1263 ; WX 602 ; N uni04EF ; G 1000\nU 1264 ; WX 602 ; N uni04F0 ; G 1001\nU 1265 ; WX 602 ; N uni04F1 ; G 1002\nU 1266 ; WX 602 ; N uni04F2 ; G 1003\nU 1267 ; WX 602 ; N uni04F3 ; G 1004\nU 1268 ; WX 602 ; N uni04F4 ; G 1005\nU 1269 ; WX 602 ; N uni04F5 ; G 1006\nU 1270 ; WX 602 ; N uni04F6 ; G 1007\nU 1271 ; WX 602 ; N uni04F7 ; G 1008\nU 1272 ; WX 602 ; N uni04F8 ; G 1009\nU 1273 ; WX 602 ; N uni04F9 ; G 1010\nU 1296 ; WX 602 ; N uni0510 ; G 1011\nU 1297 ; WX 602 ; N uni0511 ; G 1012\nU 1306 ; WX 602 ; N uni051A ; G 1013\nU 1307 ; WX 602 ; N uni051B ; G 1014\nU 1308 ; WX 602 ; N uni051C ; G 1015\nU 1309 ; WX 602 ; N uni051D ; G 1016\nU 1329 ; WX 602 ; N uni0531 ; G 1017\nU 1330 ; WX 602 ; N uni0532 ; G 1018\nU 1331 ; WX 602 ; N uni0533 ; G 1019\nU 1332 ; WX 602 ; N uni0534 ; G 1020\nU 1333 ; WX 602 ; N uni0535 ; G 1021\nU 1334 ; WX 602 ; N uni0536 ; G 1022\nU 1335 ; WX 602 ; N uni0537 ; G 1023\nU 1336 ; WX 602 ; N uni0538 ; G 1024\nU 1337 ; WX 602 ; N uni0539 ; G 1025\nU 1338 ; WX 602 ; N uni053A ; G 1026\nU 1339 ; WX 602 ; N uni053B ; G 1027\nU 1340 ; WX 602 ; N uni053C ; G 1028\nU 1341 ; WX 602 ; N uni053D ; G 1029\nU 1342 ; WX 602 ; N uni053E ; G 1030\nU 1343 ; WX 602 ; N uni053F ; G 1031\nU 1344 ; WX 602 ; N uni0540 ; G 1032\nU 1345 ; WX 602 ; N uni0541 ; G 1033\nU 1346 ; WX 602 ; N uni0542 ; G 1034\nU 1347 ; WX 602 ; N uni0543 ; G 1035\nU 1348 ; WX 602 ; N uni0544 ; G 1036\nU 1349 ; WX 602 ; N uni0545 ; G 1037\nU 1350 ; WX 602 ; N uni0546 ; G 1038\nU 1351 ; WX 602 ; N uni0547 ; G 1039\nU 1352 ; WX 602 ; N uni0548 ; G 1040\nU 1353 ; WX 602 ; N uni0549 ; G 1041\nU 1354 ; WX 602 ; N uni054A ; G 1042\nU 1355 ; WX 602 ; N uni054B ; G 1043\nU 1356 ; WX 602 ; N uni054C ; G 1044\nU 1357 ; WX 602 ; N uni054D ; G 1045\nU 1358 ; WX 602 ; N uni054E ; G 1046\nU 1359 ; WX 602 ; N uni054F ; G 1047\nU 1360 ; WX 602 ; N uni0550 ; G 1048\nU 1361 ; WX 602 ; N uni0551 ; G 1049\nU 1362 ; WX 602 ; N uni0552 ; G 1050\nU 1363 ; WX 602 ; N uni0553 ; G 1051\nU 1364 ; WX 602 ; N uni0554 ; G 1052\nU 1365 ; WX 602 ; N uni0555 ; G 1053\nU 1366 ; WX 602 ; N uni0556 ; G 1054\nU 1369 ; WX 602 ; N uni0559 ; G 1055\nU 1370 ; WX 602 ; N uni055A ; G 1056\nU 1371 ; WX 602 ; N uni055B ; G 1057\nU 1372 ; WX 602 ; N uni055C ; G 1058\nU 1373 ; WX 602 ; N uni055D ; G 1059\nU 1374 ; WX 602 ; N uni055E ; G 1060\nU 1375 ; WX 602 ; N uni055F ; G 1061\nU 1377 ; WX 602 ; N uni0561 ; G 1062\nU 1378 ; WX 602 ; N uni0562 ; G 1063\nU 1379 ; WX 602 ; N uni0563 ; G 1064\nU 1380 ; WX 602 ; N uni0564 ; G 1065\nU 1381 ; WX 602 ; N uni0565 ; G 1066\nU 1382 ; WX 602 ; N uni0566 ; G 1067\nU 1383 ; WX 602 ; N uni0567 ; G 1068\nU 1384 ; WX 602 ; N uni0568 ; G 1069\nU 1385 ; WX 602 ; N uni0569 ; G 1070\nU 1386 ; WX 602 ; N uni056A ; G 1071\nU 1387 ; WX 602 ; N uni056B ; G 1072\nU 1388 ; WX 602 ; N uni056C ; G 1073\nU 1389 ; WX 602 ; N uni056D ; G 1074\nU 1390 ; WX 602 ; N uni056E ; G 1075\nU 1391 ; WX 602 ; N uni056F ; G 1076\nU 1392 ; WX 602 ; N uni0570 ; G 1077\nU 1393 ; WX 602 ; N uni0571 ; G 1078\nU 1394 ; WX 602 ; N uni0572 ; G 1079\nU 1395 ; WX 602 ; N uni0573 ; G 1080\nU 1396 ; WX 602 ; N uni0574 ; G 1081\nU 1397 ; WX 602 ; N uni0575 ; G 1082\nU 1398 ; WX 602 ; N uni0576 ; G 1083\nU 1399 ; WX 602 ; N uni0577 ; G 1084\nU 1400 ; WX 602 ; N uni0578 ; G 1085\nU 1401 ; WX 602 ; N uni0579 ; G 1086\nU 1402 ; WX 602 ; N uni057A ; G 1087\nU 1403 ; WX 602 ; N uni057B ; G 1088\nU 1404 ; WX 602 ; N uni057C ; G 1089\nU 1405 ; WX 602 ; N uni057D ; G 1090\nU 1406 ; WX 602 ; N uni057E ; G 1091\nU 1407 ; WX 602 ; N uni057F ; G 1092\nU 1408 ; WX 602 ; N uni0580 ; G 1093\nU 1409 ; WX 602 ; N uni0581 ; G 1094\nU 1410 ; WX 602 ; N uni0582 ; G 1095\nU 1411 ; WX 602 ; N uni0583 ; G 1096\nU 1412 ; WX 602 ; N uni0584 ; G 1097\nU 1413 ; WX 602 ; N uni0585 ; G 1098\nU 1414 ; WX 602 ; N uni0586 ; G 1099\nU 1415 ; WX 602 ; N uni0587 ; G 1100\nU 1417 ; WX 602 ; N uni0589 ; G 1101\nU 1418 ; WX 602 ; N uni058A ; G 1102\nU 1542 ; WX 602 ; N uni0606 ; G 1103\nU 1543 ; WX 602 ; N uni0607 ; G 1104\nU 1545 ; WX 602 ; N uni0609 ; G 1105\nU 1546 ; WX 602 ; N uni060A ; G 1106\nU 1548 ; WX 602 ; N uni060C ; G 1107\nU 1557 ; WX 602 ; N uni0615 ; G 1108\nU 1563 ; WX 602 ; N uni061B ; G 1109\nU 1567 ; WX 602 ; N uni061F ; G 1110\nU 1569 ; WX 602 ; N uni0621 ; G 1111\nU 1570 ; WX 602 ; N uni0622 ; G 1112\nU 1571 ; WX 602 ; N uni0623 ; G 1113\nU 1572 ; WX 602 ; N uni0624 ; G 1114\nU 1573 ; WX 602 ; N uni0625 ; G 1115\nU 1574 ; WX 602 ; N uni0626 ; G 1116\nU 1575 ; WX 602 ; N uni0627 ; G 1117\nU 1576 ; WX 602 ; N uni0628 ; G 1118\nU 1577 ; WX 602 ; N uni0629 ; G 1119\nU 1578 ; WX 602 ; N uni062A ; G 1120\nU 1579 ; WX 602 ; N uni062B ; G 1121\nU 1580 ; WX 602 ; N uni062C ; G 1122\nU 1581 ; WX 602 ; N uni062D ; G 1123\nU 1582 ; WX 602 ; N uni062E ; G 1124\nU 1583 ; WX 602 ; N uni062F ; G 1125\nU 1584 ; WX 602 ; N uni0630 ; G 1126\nU 1585 ; WX 602 ; N uni0631 ; G 1127\nU 1586 ; WX 602 ; N uni0632 ; G 1128\nU 1587 ; WX 602 ; N uni0633 ; G 1129\nU 1588 ; WX 602 ; N uni0634 ; G 1130\nU 1589 ; WX 602 ; N uni0635 ; G 1131\nU 1590 ; WX 602 ; N uni0636 ; G 1132\nU 1591 ; WX 602 ; N uni0637 ; G 1133\nU 1592 ; WX 602 ; N uni0638 ; G 1134\nU 1593 ; WX 602 ; N uni0639 ; G 1135\nU 1594 ; WX 602 ; N uni063A ; G 1136\nU 1600 ; WX 602 ; N uni0640 ; G 1137\nU 1601 ; WX 602 ; N uni0641 ; G 1138\nU 1602 ; WX 602 ; N uni0642 ; G 1139\nU 1603 ; WX 602 ; N uni0643 ; G 1140\nU 1604 ; WX 602 ; N uni0644 ; G 1141\nU 1605 ; WX 602 ; N uni0645 ; G 1142\nU 1606 ; WX 602 ; N uni0646 ; G 1143\nU 1607 ; WX 602 ; N uni0647 ; G 1144\nU 1608 ; WX 602 ; N uni0648 ; G 1145\nU 1609 ; WX 602 ; N uni0649 ; G 1146\nU 1610 ; WX 602 ; N uni064A ; G 1147\nU 1611 ; WX 602 ; N uni064B ; G 1148\nU 1612 ; WX 602 ; N uni064C ; G 1149\nU 1613 ; WX 602 ; N uni064D ; G 1150\nU 1614 ; WX 602 ; N uni064E ; G 1151\nU 1615 ; WX 602 ; N uni064F ; G 1152\nU 1616 ; WX 602 ; N uni0650 ; G 1153\nU 1617 ; WX 602 ; N uni0651 ; G 1154\nU 1618 ; WX 602 ; N uni0652 ; G 1155\nU 1619 ; WX 602 ; N uni0653 ; G 1156\nU 1620 ; WX 602 ; N uni0654 ; G 1157\nU 1621 ; WX 602 ; N uni0655 ; G 1158\nU 1626 ; WX 602 ; N uni065A ; G 1159\nU 1632 ; WX 602 ; N uni0660 ; G 1160\nU 1633 ; WX 602 ; N uni0661 ; G 1161\nU 1634 ; WX 602 ; N uni0662 ; G 1162\nU 1635 ; WX 602 ; N uni0663 ; G 1163\nU 1636 ; WX 602 ; N uni0664 ; G 1164\nU 1637 ; WX 602 ; N uni0665 ; G 1165\nU 1638 ; WX 602 ; N uni0666 ; G 1166\nU 1639 ; WX 602 ; N uni0667 ; G 1167\nU 1640 ; WX 602 ; N uni0668 ; G 1168\nU 1641 ; WX 602 ; N uni0669 ; G 1169\nU 1642 ; WX 602 ; N uni066A ; G 1170\nU 1643 ; WX 602 ; N uni066B ; G 1171\nU 1644 ; WX 602 ; N uni066C ; G 1172\nU 1645 ; WX 602 ; N uni066D ; G 1173\nU 1652 ; WX 602 ; N uni0674 ; G 1174\nU 1657 ; WX 602 ; N uni0679 ; G 1175\nU 1658 ; WX 602 ; N uni067A ; G 1176\nU 1659 ; WX 602 ; N uni067B ; G 1177\nU 1662 ; WX 602 ; N uni067E ; G 1178\nU 1663 ; WX 602 ; N uni067F ; G 1179\nU 1664 ; WX 602 ; N uni0680 ; G 1180\nU 1667 ; WX 602 ; N uni0683 ; G 1181\nU 1668 ; WX 602 ; N uni0684 ; G 1182\nU 1670 ; WX 602 ; N uni0686 ; G 1183\nU 1671 ; WX 602 ; N uni0687 ; G 1184\nU 1681 ; WX 602 ; N uni0691 ; G 1185\nU 1688 ; WX 602 ; N uni0698 ; G 1186\nU 1700 ; WX 602 ; N uni06A4 ; G 1187\nU 1705 ; WX 602 ; N uni06A9 ; G 1188\nU 1711 ; WX 602 ; N uni06AF ; G 1189\nU 1726 ; WX 602 ; N uni06BE ; G 1190\nU 1740 ; WX 602 ; N uni06CC ; G 1191\nU 1776 ; WX 602 ; N uni06F0 ; G 1192\nU 1777 ; WX 602 ; N uni06F1 ; G 1193\nU 1778 ; WX 602 ; N uni06F2 ; G 1194\nU 1779 ; WX 602 ; N uni06F3 ; G 1195\nU 1780 ; WX 602 ; N uni06F4 ; G 1196\nU 1781 ; WX 602 ; N uni06F5 ; G 1197\nU 1782 ; WX 602 ; N uni06F6 ; G 1198\nU 1783 ; WX 602 ; N uni06F7 ; G 1199\nU 1784 ; WX 602 ; N uni06F8 ; G 1200\nU 1785 ; WX 602 ; N uni06F9 ; G 1201\nU 3647 ; WX 602 ; N uni0E3F ; G 1202\nU 3713 ; WX 602 ; N uni0E81 ; G 1203\nU 3714 ; WX 602 ; N uni0E82 ; G 1204\nU 3716 ; WX 602 ; N uni0E84 ; G 1205\nU 3719 ; WX 602 ; N uni0E87 ; G 1206\nU 3720 ; WX 602 ; N uni0E88 ; G 1207\nU 3722 ; WX 602 ; N uni0E8A ; G 1208\nU 3725 ; WX 602 ; N uni0E8D ; G 1209\nU 3732 ; WX 602 ; N uni0E94 ; G 1210\nU 3733 ; WX 602 ; N uni0E95 ; G 1211\nU 3734 ; WX 602 ; N uni0E96 ; G 1212\nU 3735 ; WX 602 ; N uni0E97 ; G 1213\nU 3737 ; WX 602 ; N uni0E99 ; G 1214\nU 3738 ; WX 602 ; N uni0E9A ; G 1215\nU 3739 ; WX 602 ; N uni0E9B ; G 1216\nU 3740 ; WX 602 ; N uni0E9C ; G 1217\nU 3741 ; WX 602 ; N uni0E9D ; G 1218\nU 3742 ; WX 602 ; N uni0E9E ; G 1219\nU 3743 ; WX 602 ; N uni0E9F ; G 1220\nU 3745 ; WX 602 ; N uni0EA1 ; G 1221\nU 3746 ; WX 602 ; N uni0EA2 ; G 1222\nU 3747 ; WX 602 ; N uni0EA3 ; G 1223\nU 3749 ; WX 602 ; N uni0EA5 ; G 1224\nU 3751 ; WX 602 ; N uni0EA7 ; G 1225\nU 3754 ; WX 602 ; N uni0EAA ; G 1226\nU 3755 ; WX 602 ; N uni0EAB ; G 1227\nU 3757 ; WX 602 ; N uni0EAD ; G 1228\nU 3758 ; WX 602 ; N uni0EAE ; G 1229\nU 3759 ; WX 602 ; N uni0EAF ; G 1230\nU 3760 ; WX 602 ; N uni0EB0 ; G 1231\nU 3761 ; WX 602 ; N uni0EB1 ; G 1232\nU 3762 ; WX 602 ; N uni0EB2 ; G 1233\nU 3763 ; WX 602 ; N uni0EB3 ; G 1234\nU 3764 ; WX 602 ; N uni0EB4 ; G 1235\nU 3765 ; WX 602 ; N uni0EB5 ; G 1236\nU 3766 ; WX 602 ; N uni0EB6 ; G 1237\nU 3767 ; WX 602 ; N uni0EB7 ; G 1238\nU 3768 ; WX 602 ; N uni0EB8 ; G 1239\nU 3769 ; WX 602 ; N uni0EB9 ; G 1240\nU 3771 ; WX 602 ; N uni0EBB ; G 1241\nU 3772 ; WX 602 ; N uni0EBC ; G 1242\nU 3784 ; WX 602 ; N uni0EC8 ; G 1243\nU 3785 ; WX 602 ; N uni0EC9 ; G 1244\nU 3786 ; WX 602 ; N uni0ECA ; G 1245\nU 3787 ; WX 602 ; N uni0ECB ; G 1246\nU 3788 ; WX 602 ; N uni0ECC ; G 1247\nU 3789 ; WX 602 ; N uni0ECD ; G 1248\nU 4304 ; WX 602 ; N uni10D0 ; G 1249\nU 4305 ; WX 602 ; N uni10D1 ; G 1250\nU 4306 ; WX 602 ; N uni10D2 ; G 1251\nU 4307 ; WX 602 ; N uni10D3 ; G 1252\nU 4308 ; WX 602 ; N uni10D4 ; G 1253\nU 4309 ; WX 602 ; N uni10D5 ; G 1254\nU 4310 ; WX 602 ; N uni10D6 ; G 1255\nU 4311 ; WX 602 ; N uni10D7 ; G 1256\nU 4312 ; WX 602 ; N uni10D8 ; G 1257\nU 4313 ; WX 602 ; N uni10D9 ; G 1258\nU 4314 ; WX 602 ; N uni10DA ; G 1259\nU 4315 ; WX 602 ; N uni10DB ; G 1260\nU 4316 ; WX 602 ; N uni10DC ; G 1261\nU 4317 ; WX 602 ; N uni10DD ; G 1262\nU 4318 ; WX 602 ; N uni10DE ; G 1263\nU 4319 ; WX 602 ; N uni10DF ; G 1264\nU 4320 ; WX 602 ; N uni10E0 ; G 1265\nU 4321 ; WX 602 ; N uni10E1 ; G 1266\nU 4322 ; WX 602 ; N uni10E2 ; G 1267\nU 4323 ; WX 602 ; N uni10E3 ; G 1268\nU 4324 ; WX 602 ; N uni10E4 ; G 1269\nU 4325 ; WX 602 ; N uni10E5 ; G 1270\nU 4326 ; WX 602 ; N uni10E6 ; G 1271\nU 4327 ; WX 602 ; N uni10E7 ; G 1272\nU 4328 ; WX 602 ; N uni10E8 ; G 1273\nU 4329 ; WX 602 ; N uni10E9 ; G 1274\nU 4330 ; WX 602 ; N uni10EA ; G 1275\nU 4331 ; WX 602 ; N uni10EB ; G 1276\nU 4332 ; WX 602 ; N uni10EC ; G 1277\nU 4333 ; WX 602 ; N uni10ED ; G 1278\nU 4334 ; WX 602 ; N uni10EE ; G 1279\nU 4335 ; WX 602 ; N uni10EF ; G 1280\nU 4336 ; WX 602 ; N uni10F0 ; G 1281\nU 4337 ; WX 602 ; N uni10F1 ; G 1282\nU 4338 ; WX 602 ; N uni10F2 ; G 1283\nU 4339 ; WX 602 ; N uni10F3 ; G 1284\nU 4340 ; WX 602 ; N uni10F4 ; G 1285\nU 4341 ; WX 602 ; N uni10F5 ; G 1286\nU 4342 ; WX 602 ; N uni10F6 ; G 1287\nU 4343 ; WX 602 ; N uni10F7 ; G 1288\nU 4344 ; WX 602 ; N uni10F8 ; G 1289\nU 4345 ; WX 602 ; N uni10F9 ; G 1290\nU 4346 ; WX 602 ; N uni10FA ; G 1291\nU 4347 ; WX 602 ; N uni10FB ; G 1292\nU 4348 ; WX 602 ; N uni10FC ; G 1293\nU 7426 ; WX 602 ; N uni1D02 ; G 1294\nU 7432 ; WX 602 ; N uni1D08 ; G 1295\nU 7433 ; WX 602 ; N uni1D09 ; G 1296\nU 7444 ; WX 602 ; N uni1D14 ; G 1297\nU 7446 ; WX 602 ; N uni1D16 ; G 1298\nU 7447 ; WX 602 ; N uni1D17 ; G 1299\nU 7453 ; WX 602 ; N uni1D1D ; G 1300\nU 7454 ; WX 602 ; N uni1D1E ; G 1301\nU 7455 ; WX 602 ; N uni1D1F ; G 1302\nU 7468 ; WX 602 ; N uni1D2C ; G 1303\nU 7469 ; WX 602 ; N uni1D2D ; G 1304\nU 7470 ; WX 602 ; N uni1D2E ; G 1305\nU 7472 ; WX 602 ; N uni1D30 ; G 1306\nU 7473 ; WX 602 ; N uni1D31 ; G 1307\nU 7474 ; WX 602 ; N uni1D32 ; G 1308\nU 7475 ; WX 602 ; N uni1D33 ; G 1309\nU 7476 ; WX 602 ; N uni1D34 ; G 1310\nU 7477 ; WX 602 ; N uni1D35 ; G 1311\nU 7478 ; WX 602 ; N uni1D36 ; G 1312\nU 7479 ; WX 602 ; N uni1D37 ; G 1313\nU 7480 ; WX 602 ; N uni1D38 ; G 1314\nU 7481 ; WX 602 ; N uni1D39 ; G 1315\nU 7482 ; WX 602 ; N uni1D3A ; G 1316\nU 7483 ; WX 602 ; N uni1D3B ; G 1317\nU 7484 ; WX 602 ; N uni1D3C ; G 1318\nU 7486 ; WX 602 ; N uni1D3E ; G 1319\nU 7487 ; WX 602 ; N uni1D3F ; G 1320\nU 7488 ; WX 602 ; N uni1D40 ; G 1321\nU 7489 ; WX 602 ; N uni1D41 ; G 1322\nU 7490 ; WX 602 ; N uni1D42 ; G 1323\nU 7491 ; WX 602 ; N uni1D43 ; G 1324\nU 7492 ; WX 602 ; N uni1D44 ; G 1325\nU 7493 ; WX 602 ; N uni1D45 ; G 1326\nU 7494 ; WX 602 ; N uni1D46 ; G 1327\nU 7495 ; WX 602 ; N uni1D47 ; G 1328\nU 7496 ; WX 602 ; N uni1D48 ; G 1329\nU 7497 ; WX 602 ; N uni1D49 ; G 1330\nU 7498 ; WX 602 ; N uni1D4A ; G 1331\nU 7499 ; WX 602 ; N uni1D4B ; G 1332\nU 7500 ; WX 602 ; N uni1D4C ; G 1333\nU 7501 ; WX 602 ; N uni1D4D ; G 1334\nU 7502 ; WX 602 ; N uni1D4E ; G 1335\nU 7503 ; WX 602 ; N uni1D4F ; G 1336\nU 7504 ; WX 602 ; N uni1D50 ; G 1337\nU 7505 ; WX 602 ; N uni1D51 ; G 1338\nU 7506 ; WX 602 ; N uni1D52 ; G 1339\nU 7507 ; WX 602 ; N uni1D53 ; G 1340\nU 7508 ; WX 602 ; N uni1D54 ; G 1341\nU 7509 ; WX 602 ; N uni1D55 ; G 1342\nU 7510 ; WX 602 ; N uni1D56 ; G 1343\nU 7511 ; WX 602 ; N uni1D57 ; G 1344\nU 7512 ; WX 602 ; N uni1D58 ; G 1345\nU 7513 ; WX 602 ; N uni1D59 ; G 1346\nU 7514 ; WX 602 ; N uni1D5A ; G 1347\nU 7515 ; WX 602 ; N uni1D5B ; G 1348\nU 7522 ; WX 602 ; N uni1D62 ; G 1349\nU 7523 ; WX 602 ; N uni1D63 ; G 1350\nU 7524 ; WX 602 ; N uni1D64 ; G 1351\nU 7525 ; WX 602 ; N uni1D65 ; G 1352\nU 7543 ; WX 602 ; N uni1D77 ; G 1353\nU 7544 ; WX 602 ; N uni1D78 ; G 1354\nU 7547 ; WX 602 ; N uni1D7B ; G 1355\nU 7557 ; WX 602 ; N uni1D85 ; G 1356\nU 7579 ; WX 602 ; N uni1D9B ; G 1357\nU 7580 ; WX 602 ; N uni1D9C ; G 1358\nU 7581 ; WX 602 ; N uni1D9D ; G 1359\nU 7582 ; WX 602 ; N uni1D9E ; G 1360\nU 7583 ; WX 602 ; N uni1D9F ; G 1361\nU 7584 ; WX 602 ; N uni1DA0 ; G 1362\nU 7585 ; WX 602 ; N uni1DA1 ; G 1363\nU 7586 ; WX 602 ; N uni1DA2 ; G 1364\nU 7587 ; WX 602 ; N uni1DA3 ; G 1365\nU 7588 ; WX 602 ; N uni1DA4 ; G 1366\nU 7589 ; WX 602 ; N uni1DA5 ; G 1367\nU 7590 ; WX 602 ; N uni1DA6 ; G 1368\nU 7591 ; WX 602 ; N uni1DA7 ; G 1369\nU 7592 ; WX 602 ; N uni1DA8 ; G 1370\nU 7593 ; WX 602 ; N uni1DA9 ; G 1371\nU 7594 ; WX 602 ; N uni1DAA ; G 1372\nU 7595 ; WX 602 ; N uni1DAB ; G 1373\nU 7596 ; WX 602 ; N uni1DAC ; G 1374\nU 7597 ; WX 602 ; N uni1DAD ; G 1375\nU 7598 ; WX 602 ; N uni1DAE ; G 1376\nU 7599 ; WX 602 ; N uni1DAF ; G 1377\nU 7600 ; WX 602 ; N uni1DB0 ; G 1378\nU 7601 ; WX 602 ; N uni1DB1 ; G 1379\nU 7602 ; WX 602 ; N uni1DB2 ; G 1380\nU 7603 ; WX 602 ; N uni1DB3 ; G 1381\nU 7604 ; WX 602 ; N uni1DB4 ; G 1382\nU 7605 ; WX 602 ; N uni1DB5 ; G 1383\nU 7606 ; WX 602 ; N uni1DB6 ; G 1384\nU 7607 ; WX 602 ; N uni1DB7 ; G 1385\nU 7609 ; WX 602 ; N uni1DB9 ; G 1386\nU 7610 ; WX 602 ; N uni1DBA ; G 1387\nU 7611 ; WX 602 ; N uni1DBB ; G 1388\nU 7612 ; WX 602 ; N uni1DBC ; G 1389\nU 7613 ; WX 602 ; N uni1DBD ; G 1390\nU 7614 ; WX 602 ; N uni1DBE ; G 1391\nU 7615 ; WX 602 ; N uni1DBF ; G 1392\nU 7680 ; WX 602 ; N uni1E00 ; G 1393\nU 7681 ; WX 602 ; N uni1E01 ; G 1394\nU 7682 ; WX 602 ; N uni1E02 ; G 1395\nU 7683 ; WX 602 ; N uni1E03 ; G 1396\nU 7684 ; WX 602 ; N uni1E04 ; G 1397\nU 7685 ; WX 602 ; N uni1E05 ; G 1398\nU 7686 ; WX 602 ; N uni1E06 ; G 1399\nU 7687 ; WX 602 ; N uni1E07 ; G 1400\nU 7688 ; WX 602 ; N uni1E08 ; G 1401\nU 7689 ; WX 602 ; N uni1E09 ; G 1402\nU 7690 ; WX 602 ; N uni1E0A ; G 1403\nU 7691 ; WX 602 ; N uni1E0B ; G 1404\nU 7692 ; WX 602 ; N uni1E0C ; G 1405\nU 7693 ; WX 602 ; N uni1E0D ; G 1406\nU 7694 ; WX 602 ; N uni1E0E ; G 1407\nU 7695 ; WX 602 ; N uni1E0F ; G 1408\nU 7696 ; WX 602 ; N uni1E10 ; G 1409\nU 7697 ; WX 602 ; N uni1E11 ; G 1410\nU 7698 ; WX 602 ; N uni1E12 ; G 1411\nU 7699 ; WX 602 ; N uni1E13 ; G 1412\nU 7704 ; WX 602 ; N uni1E18 ; G 1413\nU 7705 ; WX 602 ; N uni1E19 ; G 1414\nU 7706 ; WX 602 ; N uni1E1A ; G 1415\nU 7707 ; WX 602 ; N uni1E1B ; G 1416\nU 7708 ; WX 602 ; N uni1E1C ; G 1417\nU 7709 ; WX 602 ; N uni1E1D ; G 1418\nU 7710 ; WX 602 ; N uni1E1E ; G 1419\nU 7711 ; WX 602 ; N uni1E1F ; G 1420\nU 7712 ; WX 602 ; N uni1E20 ; G 1421\nU 7713 ; WX 602 ; N uni1E21 ; G 1422\nU 7714 ; WX 602 ; N uni1E22 ; G 1423\nU 7715 ; WX 602 ; N uni1E23 ; G 1424\nU 7716 ; WX 602 ; N uni1E24 ; G 1425\nU 7717 ; WX 602 ; N uni1E25 ; G 1426\nU 7718 ; WX 602 ; N uni1E26 ; G 1427\nU 7719 ; WX 602 ; N uni1E27 ; G 1428\nU 7720 ; WX 602 ; N uni1E28 ; G 1429\nU 7721 ; WX 602 ; N uni1E29 ; G 1430\nU 7722 ; WX 602 ; N uni1E2A ; G 1431\nU 7723 ; WX 602 ; N uni1E2B ; G 1432\nU 7724 ; WX 602 ; N uni1E2C ; G 1433\nU 7725 ; WX 602 ; N uni1E2D ; G 1434\nU 7728 ; WX 602 ; N uni1E30 ; G 1435\nU 7729 ; WX 602 ; N uni1E31 ; G 1436\nU 7730 ; WX 602 ; N uni1E32 ; G 1437\nU 7731 ; WX 602 ; N uni1E33 ; G 1438\nU 7732 ; WX 602 ; N uni1E34 ; G 1439\nU 7733 ; WX 602 ; N uni1E35 ; G 1440\nU 7734 ; WX 602 ; N uni1E36 ; G 1441\nU 7735 ; WX 602 ; N uni1E37 ; G 1442\nU 7736 ; WX 602 ; N uni1E38 ; G 1443\nU 7737 ; WX 602 ; N uni1E39 ; G 1444\nU 7738 ; WX 602 ; N uni1E3A ; G 1445\nU 7739 ; WX 602 ; N uni1E3B ; G 1446\nU 7740 ; WX 602 ; N uni1E3C ; G 1447\nU 7741 ; WX 602 ; N uni1E3D ; G 1448\nU 7742 ; WX 602 ; N uni1E3E ; G 1449\nU 7743 ; WX 602 ; N uni1E3F ; G 1450\nU 7744 ; WX 602 ; N uni1E40 ; G 1451\nU 7745 ; WX 602 ; N uni1E41 ; G 1452\nU 7746 ; WX 602 ; N uni1E42 ; G 1453\nU 7747 ; WX 602 ; N uni1E43 ; G 1454\nU 7748 ; WX 602 ; N uni1E44 ; G 1455\nU 7749 ; WX 602 ; N uni1E45 ; G 1456\nU 7750 ; WX 602 ; N uni1E46 ; G 1457\nU 7751 ; WX 602 ; N uni1E47 ; G 1458\nU 7752 ; WX 602 ; N uni1E48 ; G 1459\nU 7753 ; WX 602 ; N uni1E49 ; G 1460\nU 7754 ; WX 602 ; N uni1E4A ; G 1461\nU 7755 ; WX 602 ; N uni1E4B ; G 1462\nU 7756 ; WX 602 ; N uni1E4C ; G 1463\nU 7757 ; WX 602 ; N uni1E4D ; G 1464\nU 7764 ; WX 602 ; N uni1E54 ; G 1465\nU 7765 ; WX 602 ; N uni1E55 ; G 1466\nU 7766 ; WX 602 ; N uni1E56 ; G 1467\nU 7767 ; WX 602 ; N uni1E57 ; G 1468\nU 7768 ; WX 602 ; N uni1E58 ; G 1469\nU 7769 ; WX 602 ; N uni1E59 ; G 1470\nU 7770 ; WX 602 ; N uni1E5A ; G 1471\nU 7771 ; WX 602 ; N uni1E5B ; G 1472\nU 7772 ; WX 602 ; N uni1E5C ; G 1473\nU 7773 ; WX 602 ; N uni1E5D ; G 1474\nU 7774 ; WX 602 ; N uni1E5E ; G 1475\nU 7775 ; WX 602 ; N uni1E5F ; G 1476\nU 7776 ; WX 602 ; N uni1E60 ; G 1477\nU 7777 ; WX 602 ; N uni1E61 ; G 1478\nU 7778 ; WX 602 ; N uni1E62 ; G 1479\nU 7779 ; WX 602 ; N uni1E63 ; G 1480\nU 7784 ; WX 602 ; N uni1E68 ; G 1481\nU 7785 ; WX 602 ; N uni1E69 ; G 1482\nU 7786 ; WX 602 ; N uni1E6A ; G 1483\nU 7787 ; WX 602 ; N uni1E6B ; G 1484\nU 7788 ; WX 602 ; N uni1E6C ; G 1485\nU 7789 ; WX 602 ; N uni1E6D ; G 1486\nU 7790 ; WX 602 ; N uni1E6E ; G 1487\nU 7791 ; WX 602 ; N uni1E6F ; G 1488\nU 7792 ; WX 602 ; N uni1E70 ; G 1489\nU 7793 ; WX 602 ; N uni1E71 ; G 1490\nU 7794 ; WX 602 ; N uni1E72 ; G 1491\nU 7795 ; WX 602 ; N uni1E73 ; G 1492\nU 7796 ; WX 602 ; N uni1E74 ; G 1493\nU 7797 ; WX 602 ; N uni1E75 ; G 1494\nU 7798 ; WX 602 ; N uni1E76 ; G 1495\nU 7799 ; WX 602 ; N uni1E77 ; G 1496\nU 7800 ; WX 602 ; N uni1E78 ; G 1497\nU 7801 ; WX 602 ; N uni1E79 ; G 1498\nU 7804 ; WX 602 ; N uni1E7C ; G 1499\nU 7805 ; WX 602 ; N uni1E7D ; G 1500\nU 7806 ; WX 602 ; N uni1E7E ; G 1501\nU 7807 ; WX 602 ; N uni1E7F ; G 1502\nU 7808 ; WX 602 ; N Wgrave ; G 1503\nU 7809 ; WX 602 ; N wgrave ; G 1504\nU 7810 ; WX 602 ; N Wacute ; G 1505\nU 7811 ; WX 602 ; N wacute ; G 1506\nU 7812 ; WX 602 ; N Wdieresis ; G 1507\nU 7813 ; WX 602 ; N wdieresis ; G 1508\nU 7814 ; WX 602 ; N uni1E86 ; G 1509\nU 7815 ; WX 602 ; N uni1E87 ; G 1510\nU 7816 ; WX 602 ; N uni1E88 ; G 1511\nU 7817 ; WX 602 ; N uni1E89 ; G 1512\nU 7818 ; WX 602 ; N uni1E8A ; G 1513\nU 7819 ; WX 602 ; N uni1E8B ; G 1514\nU 7820 ; WX 602 ; N uni1E8C ; G 1515\nU 7821 ; WX 602 ; N uni1E8D ; G 1516\nU 7822 ; WX 602 ; N uni1E8E ; G 1517\nU 7823 ; WX 602 ; N uni1E8F ; G 1518\nU 7824 ; WX 602 ; N uni1E90 ; G 1519\nU 7825 ; WX 602 ; N uni1E91 ; G 1520\nU 7826 ; WX 602 ; N uni1E92 ; G 1521\nU 7827 ; WX 602 ; N uni1E93 ; G 1522\nU 7828 ; WX 602 ; N uni1E94 ; G 1523\nU 7829 ; WX 602 ; N uni1E95 ; G 1524\nU 7830 ; WX 602 ; N uni1E96 ; G 1525\nU 7831 ; WX 602 ; N uni1E97 ; G 1526\nU 7832 ; WX 602 ; N uni1E98 ; G 1527\nU 7833 ; WX 602 ; N uni1E99 ; G 1528\nU 7835 ; WX 602 ; N uni1E9B ; G 1529\nU 7839 ; WX 602 ; N uni1E9F ; G 1530\nU 7840 ; WX 602 ; N uni1EA0 ; G 1531\nU 7841 ; WX 602 ; N uni1EA1 ; G 1532\nU 7852 ; WX 602 ; N uni1EAC ; G 1533\nU 7853 ; WX 602 ; N uni1EAD ; G 1534\nU 7856 ; WX 602 ; N uni1EB0 ; G 1535\nU 7857 ; WX 602 ; N uni1EB1 ; G 1536\nU 7862 ; WX 602 ; N uni1EB6 ; G 1537\nU 7863 ; WX 602 ; N uni1EB7 ; G 1538\nU 7864 ; WX 602 ; N uni1EB8 ; G 1539\nU 7865 ; WX 602 ; N uni1EB9 ; G 1540\nU 7868 ; WX 602 ; N uni1EBC ; G 1541\nU 7869 ; WX 602 ; N uni1EBD ; G 1542\nU 7878 ; WX 602 ; N uni1EC6 ; G 1543\nU 7879 ; WX 602 ; N uni1EC7 ; G 1544\nU 7882 ; WX 602 ; N uni1ECA ; G 1545\nU 7883 ; WX 602 ; N uni1ECB ; G 1546\nU 7884 ; WX 602 ; N uni1ECC ; G 1547\nU 7885 ; WX 602 ; N uni1ECD ; G 1548\nU 7896 ; WX 602 ; N uni1ED8 ; G 1549\nU 7897 ; WX 602 ; N uni1ED9 ; G 1550\nU 7898 ; WX 602 ; N uni1EDA ; G 1551\nU 7899 ; WX 602 ; N uni1EDB ; G 1552\nU 7900 ; WX 602 ; N uni1EDC ; G 1553\nU 7901 ; WX 602 ; N uni1EDD ; G 1554\nU 7904 ; WX 602 ; N uni1EE0 ; G 1555\nU 7905 ; WX 602 ; N uni1EE1 ; G 1556\nU 7906 ; WX 602 ; N uni1EE2 ; G 1557\nU 7907 ; WX 602 ; N uni1EE3 ; G 1558\nU 7908 ; WX 602 ; N uni1EE4 ; G 1559\nU 7909 ; WX 602 ; N uni1EE5 ; G 1560\nU 7912 ; WX 602 ; N uni1EE8 ; G 1561\nU 7913 ; WX 602 ; N uni1EE9 ; G 1562\nU 7914 ; WX 602 ; N uni1EEA ; G 1563\nU 7915 ; WX 602 ; N uni1EEB ; G 1564\nU 7918 ; WX 602 ; N uni1EEE ; G 1565\nU 7919 ; WX 602 ; N uni1EEF ; G 1566\nU 7920 ; WX 602 ; N uni1EF0 ; G 1567\nU 7921 ; WX 602 ; N uni1EF1 ; G 1568\nU 7922 ; WX 602 ; N Ygrave ; G 1569\nU 7923 ; WX 602 ; N ygrave ; G 1570\nU 7924 ; WX 602 ; N uni1EF4 ; G 1571\nU 7925 ; WX 602 ; N uni1EF5 ; G 1572\nU 7928 ; WX 602 ; N uni1EF8 ; G 1573\nU 7929 ; WX 602 ; N uni1EF9 ; G 1574\nU 7936 ; WX 602 ; N uni1F00 ; G 1575\nU 7937 ; WX 602 ; N uni1F01 ; G 1576\nU 7938 ; WX 602 ; N uni1F02 ; G 1577\nU 7939 ; WX 602 ; N uni1F03 ; G 1578\nU 7940 ; WX 602 ; N uni1F04 ; G 1579\nU 7941 ; WX 602 ; N uni1F05 ; G 1580\nU 7942 ; WX 602 ; N uni1F06 ; G 1581\nU 7943 ; WX 602 ; N uni1F07 ; G 1582\nU 7944 ; WX 602 ; N uni1F08 ; G 1583\nU 7945 ; WX 602 ; N uni1F09 ; G 1584\nU 7946 ; WX 602 ; N uni1F0A ; G 1585\nU 7947 ; WX 602 ; N uni1F0B ; G 1586\nU 7948 ; WX 602 ; N uni1F0C ; G 1587\nU 7949 ; WX 602 ; N uni1F0D ; G 1588\nU 7950 ; WX 602 ; N uni1F0E ; G 1589\nU 7951 ; WX 602 ; N uni1F0F ; G 1590\nU 7952 ; WX 602 ; N uni1F10 ; G 1591\nU 7953 ; WX 602 ; N uni1F11 ; G 1592\nU 7954 ; WX 602 ; N uni1F12 ; G 1593\nU 7955 ; WX 602 ; N uni1F13 ; G 1594\nU 7956 ; WX 602 ; N uni1F14 ; G 1595\nU 7957 ; WX 602 ; N uni1F15 ; G 1596\nU 7960 ; WX 602 ; N uni1F18 ; G 1597\nU 7961 ; WX 602 ; N uni1F19 ; G 1598\nU 7962 ; WX 602 ; N uni1F1A ; G 1599\nU 7963 ; WX 602 ; N uni1F1B ; G 1600\nU 7964 ; WX 602 ; N uni1F1C ; G 1601\nU 7965 ; WX 602 ; N uni1F1D ; G 1602\nU 7968 ; WX 602 ; N uni1F20 ; G 1603\nU 7969 ; WX 602 ; N uni1F21 ; G 1604\nU 7970 ; WX 602 ; N uni1F22 ; G 1605\nU 7971 ; WX 602 ; N uni1F23 ; G 1606\nU 7972 ; WX 602 ; N uni1F24 ; G 1607\nU 7973 ; WX 602 ; N uni1F25 ; G 1608\nU 7974 ; WX 602 ; N uni1F26 ; G 1609\nU 7975 ; WX 602 ; N uni1F27 ; G 1610\nU 7976 ; WX 602 ; N uni1F28 ; G 1611\nU 7977 ; WX 602 ; N uni1F29 ; G 1612\nU 7978 ; WX 602 ; N uni1F2A ; G 1613\nU 7979 ; WX 602 ; N uni1F2B ; G 1614\nU 7980 ; WX 602 ; N uni1F2C ; G 1615\nU 7981 ; WX 602 ; N uni1F2D ; G 1616\nU 7982 ; WX 602 ; N uni1F2E ; G 1617\nU 7983 ; WX 602 ; N uni1F2F ; G 1618\nU 7984 ; WX 602 ; N uni1F30 ; G 1619\nU 7985 ; WX 602 ; N uni1F31 ; G 1620\nU 7986 ; WX 602 ; N uni1F32 ; G 1621\nU 7987 ; WX 602 ; N uni1F33 ; G 1622\nU 7988 ; WX 602 ; N uni1F34 ; G 1623\nU 7989 ; WX 602 ; N uni1F35 ; G 1624\nU 7990 ; WX 602 ; N uni1F36 ; G 1625\nU 7991 ; WX 602 ; N uni1F37 ; G 1626\nU 7992 ; WX 602 ; N uni1F38 ; G 1627\nU 7993 ; WX 602 ; N uni1F39 ; G 1628\nU 7994 ; WX 602 ; N uni1F3A ; G 1629\nU 7995 ; WX 602 ; N uni1F3B ; G 1630\nU 7996 ; WX 602 ; N uni1F3C ; G 1631\nU 7997 ; WX 602 ; N uni1F3D ; G 1632\nU 7998 ; WX 602 ; N uni1F3E ; G 1633\nU 7999 ; WX 602 ; N uni1F3F ; G 1634\nU 8000 ; WX 602 ; N uni1F40 ; G 1635\nU 8001 ; WX 602 ; N uni1F41 ; G 1636\nU 8002 ; WX 602 ; N uni1F42 ; G 1637\nU 8003 ; WX 602 ; N uni1F43 ; G 1638\nU 8004 ; WX 602 ; N uni1F44 ; G 1639\nU 8005 ; WX 602 ; N uni1F45 ; G 1640\nU 8008 ; WX 602 ; N uni1F48 ; G 1641\nU 8009 ; WX 602 ; N uni1F49 ; G 1642\nU 8010 ; WX 602 ; N uni1F4A ; G 1643\nU 8011 ; WX 602 ; N uni1F4B ; G 1644\nU 8012 ; WX 602 ; N uni1F4C ; G 1645\nU 8013 ; WX 602 ; N uni1F4D ; G 1646\nU 8016 ; WX 602 ; N uni1F50 ; G 1647\nU 8017 ; WX 602 ; N uni1F51 ; G 1648\nU 8018 ; WX 602 ; N uni1F52 ; G 1649\nU 8019 ; WX 602 ; N uni1F53 ; G 1650\nU 8020 ; WX 602 ; N uni1F54 ; G 1651\nU 8021 ; WX 602 ; N uni1F55 ; G 1652\nU 8022 ; WX 602 ; N uni1F56 ; G 1653\nU 8023 ; WX 602 ; N uni1F57 ; G 1654\nU 8025 ; WX 602 ; N uni1F59 ; G 1655\nU 8027 ; WX 602 ; N uni1F5B ; G 1656\nU 8029 ; WX 602 ; N uni1F5D ; G 1657\nU 8031 ; WX 602 ; N uni1F5F ; G 1658\nU 8032 ; WX 602 ; N uni1F60 ; G 1659\nU 8033 ; WX 602 ; N uni1F61 ; G 1660\nU 8034 ; WX 602 ; N uni1F62 ; G 1661\nU 8035 ; WX 602 ; N uni1F63 ; G 1662\nU 8036 ; WX 602 ; N uni1F64 ; G 1663\nU 8037 ; WX 602 ; N uni1F65 ; G 1664\nU 8038 ; WX 602 ; N uni1F66 ; G 1665\nU 8039 ; WX 602 ; N uni1F67 ; G 1666\nU 8040 ; WX 602 ; N uni1F68 ; G 1667\nU 8041 ; WX 602 ; N uni1F69 ; G 1668\nU 8042 ; WX 602 ; N uni1F6A ; G 1669\nU 8043 ; WX 602 ; N uni1F6B ; G 1670\nU 8044 ; WX 602 ; N uni1F6C ; G 1671\nU 8045 ; WX 602 ; N uni1F6D ; G 1672\nU 8046 ; WX 602 ; N uni1F6E ; G 1673\nU 8047 ; WX 602 ; N uni1F6F ; G 1674\nU 8048 ; WX 602 ; N uni1F70 ; G 1675\nU 8049 ; WX 602 ; N uni1F71 ; G 1676\nU 8050 ; WX 602 ; N uni1F72 ; G 1677\nU 8051 ; WX 602 ; N uni1F73 ; G 1678\nU 8052 ; WX 602 ; N uni1F74 ; G 1679\nU 8053 ; WX 602 ; N uni1F75 ; G 1680\nU 8054 ; WX 602 ; N uni1F76 ; G 1681\nU 8055 ; WX 602 ; N uni1F77 ; G 1682\nU 8056 ; WX 602 ; N uni1F78 ; G 1683\nU 8057 ; WX 602 ; N uni1F79 ; G 1684\nU 8058 ; WX 602 ; N uni1F7A ; G 1685\nU 8059 ; WX 602 ; N uni1F7B ; G 1686\nU 8060 ; WX 602 ; N uni1F7C ; G 1687\nU 8061 ; WX 602 ; N uni1F7D ; G 1688\nU 8064 ; WX 602 ; N uni1F80 ; G 1689\nU 8065 ; WX 602 ; N uni1F81 ; G 1690\nU 8066 ; WX 602 ; N uni1F82 ; G 1691\nU 8067 ; WX 602 ; N uni1F83 ; G 1692\nU 8068 ; WX 602 ; N uni1F84 ; G 1693\nU 8069 ; WX 602 ; N uni1F85 ; G 1694\nU 8070 ; WX 602 ; N uni1F86 ; G 1695\nU 8071 ; WX 602 ; N uni1F87 ; G 1696\nU 8072 ; WX 602 ; N uni1F88 ; G 1697\nU 8073 ; WX 602 ; N uni1F89 ; G 1698\nU 8074 ; WX 602 ; N uni1F8A ; G 1699\nU 8075 ; WX 602 ; N uni1F8B ; G 1700\nU 8076 ; WX 602 ; N uni1F8C ; G 1701\nU 8077 ; WX 602 ; N uni1F8D ; G 1702\nU 8078 ; WX 602 ; N uni1F8E ; G 1703\nU 8079 ; WX 602 ; N uni1F8F ; G 1704\nU 8080 ; WX 602 ; N uni1F90 ; G 1705\nU 8081 ; WX 602 ; N uni1F91 ; G 1706\nU 8082 ; WX 602 ; N uni1F92 ; G 1707\nU 8083 ; WX 602 ; N uni1F93 ; G 1708\nU 8084 ; WX 602 ; N uni1F94 ; G 1709\nU 8085 ; WX 602 ; N uni1F95 ; G 1710\nU 8086 ; WX 602 ; N uni1F96 ; G 1711\nU 8087 ; WX 602 ; N uni1F97 ; G 1712\nU 8088 ; WX 602 ; N uni1F98 ; G 1713\nU 8089 ; WX 602 ; N uni1F99 ; G 1714\nU 8090 ; WX 602 ; N uni1F9A ; G 1715\nU 8091 ; WX 602 ; N uni1F9B ; G 1716\nU 8092 ; WX 602 ; N uni1F9C ; G 1717\nU 8093 ; WX 602 ; N uni1F9D ; G 1718\nU 8094 ; WX 602 ; N uni1F9E ; G 1719\nU 8095 ; WX 602 ; N uni1F9F ; G 1720\nU 8096 ; WX 602 ; N uni1FA0 ; G 1721\nU 8097 ; WX 602 ; N uni1FA1 ; G 1722\nU 8098 ; WX 602 ; N uni1FA2 ; G 1723\nU 8099 ; WX 602 ; N uni1FA3 ; G 1724\nU 8100 ; WX 602 ; N uni1FA4 ; G 1725\nU 8101 ; WX 602 ; N uni1FA5 ; G 1726\nU 8102 ; WX 602 ; N uni1FA6 ; G 1727\nU 8103 ; WX 602 ; N uni1FA7 ; G 1728\nU 8104 ; WX 602 ; N uni1FA8 ; G 1729\nU 8105 ; WX 602 ; N uni1FA9 ; G 1730\nU 8106 ; WX 602 ; N uni1FAA ; G 1731\nU 8107 ; WX 602 ; N uni1FAB ; G 1732\nU 8108 ; WX 602 ; N uni1FAC ; G 1733\nU 8109 ; WX 602 ; N uni1FAD ; G 1734\nU 8110 ; WX 602 ; N uni1FAE ; G 1735\nU 8111 ; WX 602 ; N uni1FAF ; G 1736\nU 8112 ; WX 602 ; N uni1FB0 ; G 1737\nU 8113 ; WX 602 ; N uni1FB1 ; G 1738\nU 8114 ; WX 602 ; N uni1FB2 ; G 1739\nU 8115 ; WX 602 ; N uni1FB3 ; G 1740\nU 8116 ; WX 602 ; N uni1FB4 ; G 1741\nU 8118 ; WX 602 ; N uni1FB6 ; G 1742\nU 8119 ; WX 602 ; N uni1FB7 ; G 1743\nU 8120 ; WX 602 ; N uni1FB8 ; G 1744\nU 8121 ; WX 602 ; N uni1FB9 ; G 1745\nU 8122 ; WX 602 ; N uni1FBA ; G 1746\nU 8123 ; WX 602 ; N uni1FBB ; G 1747\nU 8124 ; WX 602 ; N uni1FBC ; G 1748\nU 8125 ; WX 602 ; N uni1FBD ; G 1749\nU 8126 ; WX 602 ; N uni1FBE ; G 1750\nU 8127 ; WX 602 ; N uni1FBF ; G 1751\nU 8128 ; WX 602 ; N uni1FC0 ; G 1752\nU 8129 ; WX 602 ; N uni1FC1 ; G 1753\nU 8130 ; WX 602 ; N uni1FC2 ; G 1754\nU 8131 ; WX 602 ; N uni1FC3 ; G 1755\nU 8132 ; WX 602 ; N uni1FC4 ; G 1756\nU 8134 ; WX 602 ; N uni1FC6 ; G 1757\nU 8135 ; WX 602 ; N uni1FC7 ; G 1758\nU 8136 ; WX 602 ; N uni1FC8 ; G 1759\nU 8137 ; WX 602 ; N uni1FC9 ; G 1760\nU 8138 ; WX 602 ; N uni1FCA ; G 1761\nU 8139 ; WX 602 ; N uni1FCB ; G 1762\nU 8140 ; WX 602 ; N uni1FCC ; G 1763\nU 8141 ; WX 602 ; N uni1FCD ; G 1764\nU 8142 ; WX 602 ; N uni1FCE ; G 1765\nU 8143 ; WX 602 ; N uni1FCF ; G 1766\nU 8144 ; WX 602 ; N uni1FD0 ; G 1767\nU 8145 ; WX 602 ; N uni1FD1 ; G 1768\nU 8146 ; WX 602 ; N uni1FD2 ; G 1769\nU 8147 ; WX 602 ; N uni1FD3 ; G 1770\nU 8150 ; WX 602 ; N uni1FD6 ; G 1771\nU 8151 ; WX 602 ; N uni1FD7 ; G 1772\nU 8152 ; WX 602 ; N uni1FD8 ; G 1773\nU 8153 ; WX 602 ; N uni1FD9 ; G 1774\nU 8154 ; WX 602 ; N uni1FDA ; G 1775\nU 8155 ; WX 602 ; N uni1FDB ; G 1776\nU 8157 ; WX 602 ; N uni1FDD ; G 1777\nU 8158 ; WX 602 ; N uni1FDE ; G 1778\nU 8159 ; WX 602 ; N uni1FDF ; G 1779\nU 8160 ; WX 602 ; N uni1FE0 ; G 1780\nU 8161 ; WX 602 ; N uni1FE1 ; G 1781\nU 8162 ; WX 602 ; N uni1FE2 ; G 1782\nU 8163 ; WX 602 ; N uni1FE3 ; G 1783\nU 8164 ; WX 602 ; N uni1FE4 ; G 1784\nU 8165 ; WX 602 ; N uni1FE5 ; G 1785\nU 8166 ; WX 602 ; N uni1FE6 ; G 1786\nU 8167 ; WX 602 ; N uni1FE7 ; G 1787\nU 8168 ; WX 602 ; N uni1FE8 ; G 1788\nU 8169 ; WX 602 ; N uni1FE9 ; G 1789\nU 8170 ; WX 602 ; N uni1FEA ; G 1790\nU 8171 ; WX 602 ; N uni1FEB ; G 1791\nU 8172 ; WX 602 ; N uni1FEC ; G 1792\nU 8173 ; WX 602 ; N uni1FED ; G 1793\nU 8174 ; WX 602 ; N uni1FEE ; G 1794\nU 8175 ; WX 602 ; N uni1FEF ; G 1795\nU 8178 ; WX 602 ; N uni1FF2 ; G 1796\nU 8179 ; WX 602 ; N uni1FF3 ; G 1797\nU 8180 ; WX 602 ; N uni1FF4 ; G 1798\nU 8182 ; WX 602 ; N uni1FF6 ; G 1799\nU 8183 ; WX 602 ; N uni1FF7 ; G 1800\nU 8184 ; WX 602 ; N uni1FF8 ; G 1801\nU 8185 ; WX 602 ; N uni1FF9 ; G 1802\nU 8186 ; WX 602 ; N uni1FFA ; G 1803\nU 8187 ; WX 602 ; N uni1FFB ; G 1804\nU 8188 ; WX 602 ; N uni1FFC ; G 1805\nU 8189 ; WX 602 ; N uni1FFD ; G 1806\nU 8190 ; WX 602 ; N uni1FFE ; G 1807\nU 8192 ; WX 602 ; N uni2000 ; G 1808\nU 8193 ; WX 602 ; N uni2001 ; G 1809\nU 8194 ; WX 602 ; N uni2002 ; G 1810\nU 8195 ; WX 602 ; N uni2003 ; G 1811\nU 8196 ; WX 602 ; N uni2004 ; G 1812\nU 8197 ; WX 602 ; N uni2005 ; G 1813\nU 8198 ; WX 602 ; N uni2006 ; G 1814\nU 8199 ; WX 602 ; N uni2007 ; G 1815\nU 8200 ; WX 602 ; N uni2008 ; G 1816\nU 8201 ; WX 602 ; N uni2009 ; G 1817\nU 8202 ; WX 602 ; N uni200A ; G 1818\nU 8208 ; WX 602 ; N uni2010 ; G 1819\nU 8209 ; WX 602 ; N uni2011 ; G 1820\nU 8210 ; WX 602 ; N figuredash ; G 1821\nU 8211 ; WX 602 ; N endash ; G 1822\nU 8212 ; WX 602 ; N emdash ; G 1823\nU 8213 ; WX 602 ; N uni2015 ; G 1824\nU 8214 ; WX 602 ; N uni2016 ; G 1825\nU 8215 ; WX 602 ; N underscoredbl ; G 1826\nU 8216 ; WX 602 ; N quoteleft ; G 1827\nU 8217 ; WX 602 ; N quoteright ; G 1828\nU 8218 ; WX 602 ; N quotesinglbase ; G 1829\nU 8219 ; WX 602 ; N quotereversed ; G 1830\nU 8220 ; WX 602 ; N quotedblleft ; G 1831\nU 8221 ; WX 602 ; N quotedblright ; G 1832\nU 8222 ; WX 602 ; N quotedblbase ; G 1833\nU 8223 ; WX 602 ; N uni201F ; G 1834\nU 8224 ; WX 602 ; N dagger ; G 1835\nU 8225 ; WX 602 ; N daggerdbl ; G 1836\nU 8226 ; WX 602 ; N bullet ; G 1837\nU 8227 ; WX 602 ; N uni2023 ; G 1838\nU 8230 ; WX 602 ; N ellipsis ; G 1839\nU 8239 ; WX 602 ; N uni202F ; G 1840\nU 8240 ; WX 602 ; N perthousand ; G 1841\nU 8241 ; WX 602 ; N uni2031 ; G 1842\nU 8242 ; WX 602 ; N minute ; G 1843\nU 8243 ; WX 602 ; N second ; G 1844\nU 8244 ; WX 602 ; N uni2034 ; G 1845\nU 8245 ; WX 602 ; N uni2035 ; G 1846\nU 8246 ; WX 602 ; N uni2036 ; G 1847\nU 8247 ; WX 602 ; N uni2037 ; G 1848\nU 8249 ; WX 602 ; N guilsinglleft ; G 1849\nU 8250 ; WX 602 ; N guilsinglright ; G 1850\nU 8252 ; WX 602 ; N exclamdbl ; G 1851\nU 8253 ; WX 602 ; N uni203D ; G 1852\nU 8254 ; WX 602 ; N uni203E ; G 1853\nU 8255 ; WX 602 ; N uni203F ; G 1854\nU 8261 ; WX 602 ; N uni2045 ; G 1855\nU 8262 ; WX 602 ; N uni2046 ; G 1856\nU 8263 ; WX 602 ; N uni2047 ; G 1857\nU 8264 ; WX 602 ; N uni2048 ; G 1858\nU 8265 ; WX 602 ; N uni2049 ; G 1859\nU 8267 ; WX 602 ; N uni204B ; G 1860\nU 8287 ; WX 602 ; N uni205F ; G 1861\nU 8304 ; WX 602 ; N uni2070 ; G 1862\nU 8305 ; WX 602 ; N uni2071 ; G 1863\nU 8308 ; WX 602 ; N uni2074 ; G 1864\nU 8309 ; WX 602 ; N uni2075 ; G 1865\nU 8310 ; WX 602 ; N uni2076 ; G 1866\nU 8311 ; WX 602 ; N uni2077 ; G 1867\nU 8312 ; WX 602 ; N uni2078 ; G 1868\nU 8313 ; WX 602 ; N uni2079 ; G 1869\nU 8314 ; WX 602 ; N uni207A ; G 1870\nU 8315 ; WX 602 ; N uni207B ; G 1871\nU 8316 ; WX 602 ; N uni207C ; G 1872\nU 8317 ; WX 602 ; N uni207D ; G 1873\nU 8318 ; WX 602 ; N uni207E ; G 1874\nU 8319 ; WX 602 ; N uni207F ; G 1875\nU 8320 ; WX 602 ; N uni2080 ; G 1876\nU 8321 ; WX 602 ; N uni2081 ; G 1877\nU 8322 ; WX 602 ; N uni2082 ; G 1878\nU 8323 ; WX 602 ; N uni2083 ; G 1879\nU 8324 ; WX 602 ; N uni2084 ; G 1880\nU 8325 ; WX 602 ; N uni2085 ; G 1881\nU 8326 ; WX 602 ; N uni2086 ; G 1882\nU 8327 ; WX 602 ; N uni2087 ; G 1883\nU 8328 ; WX 602 ; N uni2088 ; G 1884\nU 8329 ; WX 602 ; N uni2089 ; G 1885\nU 8330 ; WX 602 ; N uni208A ; G 1886\nU 8331 ; WX 602 ; N uni208B ; G 1887\nU 8332 ; WX 602 ; N uni208C ; G 1888\nU 8333 ; WX 602 ; N uni208D ; G 1889\nU 8334 ; WX 602 ; N uni208E ; G 1890\nU 8336 ; WX 602 ; N uni2090 ; G 1891\nU 8337 ; WX 602 ; N uni2091 ; G 1892\nU 8338 ; WX 602 ; N uni2092 ; G 1893\nU 8339 ; WX 602 ; N uni2093 ; G 1894\nU 8340 ; WX 602 ; N uni2094 ; G 1895\nU 8341 ; WX 602 ; N uni2095 ; G 1896\nU 8342 ; WX 602 ; N uni2096 ; G 1897\nU 8343 ; WX 602 ; N uni2097 ; G 1898\nU 8344 ; WX 602 ; N uni2098 ; G 1899\nU 8345 ; WX 602 ; N uni2099 ; G 1900\nU 8346 ; WX 602 ; N uni209A ; G 1901\nU 8347 ; WX 602 ; N uni209B ; G 1902\nU 8348 ; WX 602 ; N uni209C ; G 1903\nU 8352 ; WX 602 ; N uni20A0 ; G 1904\nU 8353 ; WX 602 ; N colonmonetary ; G 1905\nU 8354 ; WX 602 ; N uni20A2 ; G 1906\nU 8355 ; WX 602 ; N franc ; G 1907\nU 8356 ; WX 602 ; N lira ; G 1908\nU 8357 ; WX 602 ; N uni20A5 ; G 1909\nU 8358 ; WX 602 ; N uni20A6 ; G 1910\nU 8359 ; WX 602 ; N peseta ; G 1911\nU 8360 ; WX 602 ; N uni20A8 ; G 1912\nU 8361 ; WX 602 ; N uni20A9 ; G 1913\nU 8362 ; WX 602 ; N uni20AA ; G 1914\nU 8363 ; WX 602 ; N dong ; G 1915\nU 8364 ; WX 602 ; N Euro ; G 1916\nU 8365 ; WX 602 ; N uni20AD ; G 1917\nU 8366 ; WX 602 ; N uni20AE ; G 1918\nU 8367 ; WX 602 ; N uni20AF ; G 1919\nU 8368 ; WX 602 ; N uni20B0 ; G 1920\nU 8369 ; WX 602 ; N uni20B1 ; G 1921\nU 8370 ; WX 602 ; N uni20B2 ; G 1922\nU 8371 ; WX 602 ; N uni20B3 ; G 1923\nU 8372 ; WX 602 ; N uni20B4 ; G 1924\nU 8373 ; WX 602 ; N uni20B5 ; G 1925\nU 8376 ; WX 602 ; N uni20B8 ; G 1926\nU 8377 ; WX 602 ; N uni20B9 ; G 1927\nU 8378 ; WX 602 ; N uni20BA ; G 1928\nU 8381 ; WX 602 ; N uni20BD ; G 1929\nU 8450 ; WX 602 ; N uni2102 ; G 1930\nU 8453 ; WX 602 ; N uni2105 ; G 1931\nU 8461 ; WX 602 ; N uni210D ; G 1932\nU 8462 ; WX 602 ; N uni210E ; G 1933\nU 8463 ; WX 602 ; N uni210F ; G 1934\nU 8469 ; WX 602 ; N uni2115 ; G 1935\nU 8470 ; WX 602 ; N uni2116 ; G 1936\nU 8471 ; WX 602 ; N uni2117 ; G 1937\nU 8473 ; WX 602 ; N uni2119 ; G 1938\nU 8474 ; WX 602 ; N uni211A ; G 1939\nU 8477 ; WX 602 ; N uni211D ; G 1940\nU 8482 ; WX 602 ; N trademark ; G 1941\nU 8484 ; WX 602 ; N uni2124 ; G 1942\nU 8486 ; WX 602 ; N uni2126 ; G 1943\nU 8490 ; WX 602 ; N uni212A ; G 1944\nU 8491 ; WX 602 ; N uni212B ; G 1945\nU 8494 ; WX 602 ; N estimated ; G 1946\nU 8520 ; WX 602 ; N uni2148 ; G 1947\nU 8528 ; WX 602 ; N uni2150 ; G 1948\nU 8529 ; WX 602 ; N uni2151 ; G 1949\nU 8531 ; WX 602 ; N onethird ; G 1950\nU 8532 ; WX 602 ; N twothirds ; G 1951\nU 8533 ; WX 602 ; N uni2155 ; G 1952\nU 8534 ; WX 602 ; N uni2156 ; G 1953\nU 8535 ; WX 602 ; N uni2157 ; G 1954\nU 8536 ; WX 602 ; N uni2158 ; G 1955\nU 8537 ; WX 602 ; N uni2159 ; G 1956\nU 8538 ; WX 602 ; N uni215A ; G 1957\nU 8539 ; WX 602 ; N oneeighth ; G 1958\nU 8540 ; WX 602 ; N threeeighths ; G 1959\nU 8541 ; WX 602 ; N fiveeighths ; G 1960\nU 8542 ; WX 602 ; N seveneighths ; G 1961\nU 8543 ; WX 602 ; N uni215F ; G 1962\nU 8585 ; WX 602 ; N uni2189 ; G 1963\nU 8592 ; WX 602 ; N arrowleft ; G 1964\nU 8593 ; WX 602 ; N arrowup ; G 1965\nU 8594 ; WX 602 ; N arrowright ; G 1966\nU 8595 ; WX 602 ; N arrowdown ; G 1967\nU 8596 ; WX 602 ; N arrowboth ; G 1968\nU 8597 ; WX 602 ; N arrowupdn ; G 1969\nU 8598 ; WX 602 ; N uni2196 ; G 1970\nU 8599 ; WX 602 ; N uni2197 ; G 1971\nU 8600 ; WX 602 ; N uni2198 ; G 1972\nU 8601 ; WX 602 ; N uni2199 ; G 1973\nU 8602 ; WX 602 ; N uni219A ; G 1974\nU 8603 ; WX 602 ; N uni219B ; G 1975\nU 8604 ; WX 602 ; N uni219C ; G 1976\nU 8605 ; WX 602 ; N uni219D ; G 1977\nU 8606 ; WX 602 ; N uni219E ; G 1978\nU 8607 ; WX 602 ; N uni219F ; G 1979\nU 8608 ; WX 602 ; N uni21A0 ; G 1980\nU 8609 ; WX 602 ; N uni21A1 ; G 1981\nU 8610 ; WX 602 ; N uni21A2 ; G 1982\nU 8611 ; WX 602 ; N uni21A3 ; G 1983\nU 8612 ; WX 602 ; N uni21A4 ; G 1984\nU 8613 ; WX 602 ; N uni21A5 ; G 1985\nU 8614 ; WX 602 ; N uni21A6 ; G 1986\nU 8615 ; WX 602 ; N uni21A7 ; G 1987\nU 8616 ; WX 602 ; N arrowupdnbse ; G 1988\nU 8617 ; WX 602 ; N uni21A9 ; G 1989\nU 8618 ; WX 602 ; N uni21AA ; G 1990\nU 8619 ; WX 602 ; N uni21AB ; G 1991\nU 8620 ; WX 602 ; N uni21AC ; G 1992\nU 8621 ; WX 602 ; N uni21AD ; G 1993\nU 8622 ; WX 602 ; N uni21AE ; G 1994\nU 8623 ; WX 602 ; N uni21AF ; G 1995\nU 8624 ; WX 602 ; N uni21B0 ; G 1996\nU 8625 ; WX 602 ; N uni21B1 ; G 1997\nU 8626 ; WX 602 ; N uni21B2 ; G 1998\nU 8627 ; WX 602 ; N uni21B3 ; G 1999\nU 8628 ; WX 602 ; N uni21B4 ; G 2000\nU 8629 ; WX 602 ; N carriagereturn ; G 2001\nU 8630 ; WX 602 ; N uni21B6 ; G 2002\nU 8631 ; WX 602 ; N uni21B7 ; G 2003\nU 8632 ; WX 602 ; N uni21B8 ; G 2004\nU 8633 ; WX 602 ; N uni21B9 ; G 2005\nU 8634 ; WX 602 ; N uni21BA ; G 2006\nU 8635 ; WX 602 ; N uni21BB ; G 2007\nU 8636 ; WX 602 ; N uni21BC ; G 2008\nU 8637 ; WX 602 ; N uni21BD ; G 2009\nU 8638 ; WX 602 ; N uni21BE ; G 2010\nU 8639 ; WX 602 ; N uni21BF ; G 2011\nU 8640 ; WX 602 ; N uni21C0 ; G 2012\nU 8641 ; WX 602 ; N uni21C1 ; G 2013\nU 8642 ; WX 602 ; N uni21C2 ; G 2014\nU 8643 ; WX 602 ; N uni21C3 ; G 2015\nU 8644 ; WX 602 ; N uni21C4 ; G 2016\nU 8645 ; WX 602 ; N uni21C5 ; G 2017\nU 8646 ; WX 602 ; N uni21C6 ; G 2018\nU 8647 ; WX 602 ; N uni21C7 ; G 2019\nU 8648 ; WX 602 ; N uni21C8 ; G 2020\nU 8649 ; WX 602 ; N uni21C9 ; G 2021\nU 8650 ; WX 602 ; N uni21CA ; G 2022\nU 8651 ; WX 602 ; N uni21CB ; G 2023\nU 8652 ; WX 602 ; N uni21CC ; G 2024\nU 8653 ; WX 602 ; N uni21CD ; G 2025\nU 8654 ; WX 602 ; N uni21CE ; G 2026\nU 8655 ; WX 602 ; N uni21CF ; G 2027\nU 8656 ; WX 602 ; N arrowdblleft ; G 2028\nU 8657 ; WX 602 ; N arrowdblup ; G 2029\nU 8658 ; WX 602 ; N arrowdblright ; G 2030\nU 8659 ; WX 602 ; N arrowdbldown ; G 2031\nU 8660 ; WX 602 ; N arrowdblboth ; G 2032\nU 8661 ; WX 602 ; N uni21D5 ; G 2033\nU 8662 ; WX 602 ; N uni21D6 ; G 2034\nU 8663 ; WX 602 ; N uni21D7 ; G 2035\nU 8664 ; WX 602 ; N uni21D8 ; G 2036\nU 8665 ; WX 602 ; N uni21D9 ; G 2037\nU 8666 ; WX 602 ; N uni21DA ; G 2038\nU 8667 ; WX 602 ; N uni21DB ; G 2039\nU 8668 ; WX 602 ; N uni21DC ; G 2040\nU 8669 ; WX 602 ; N uni21DD ; G 2041\nU 8670 ; WX 602 ; N uni21DE ; G 2042\nU 8671 ; WX 602 ; N uni21DF ; G 2043\nU 8672 ; WX 602 ; N uni21E0 ; G 2044\nU 8673 ; WX 602 ; N uni21E1 ; G 2045\nU 8674 ; WX 602 ; N uni21E2 ; G 2046\nU 8675 ; WX 602 ; N uni21E3 ; G 2047\nU 8676 ; WX 602 ; N uni21E4 ; G 2048\nU 8677 ; WX 602 ; N uni21E5 ; G 2049\nU 8678 ; WX 602 ; N uni21E6 ; G 2050\nU 8679 ; WX 602 ; N uni21E7 ; G 2051\nU 8680 ; WX 602 ; N uni21E8 ; G 2052\nU 8681 ; WX 602 ; N uni21E9 ; G 2053\nU 8682 ; WX 602 ; N uni21EA ; G 2054\nU 8683 ; WX 602 ; N uni21EB ; G 2055\nU 8684 ; WX 602 ; N uni21EC ; G 2056\nU 8685 ; WX 602 ; N uni21ED ; G 2057\nU 8686 ; WX 602 ; N uni21EE ; G 2058\nU 8687 ; WX 602 ; N uni21EF ; G 2059\nU 8688 ; WX 602 ; N uni21F0 ; G 2060\nU 8689 ; WX 602 ; N uni21F1 ; G 2061\nU 8690 ; WX 602 ; N uni21F2 ; G 2062\nU 8691 ; WX 602 ; N uni21F3 ; G 2063\nU 8692 ; WX 602 ; N uni21F4 ; G 2064\nU 8693 ; WX 602 ; N uni21F5 ; G 2065\nU 8694 ; WX 602 ; N uni21F6 ; G 2066\nU 8695 ; WX 602 ; N uni21F7 ; G 2067\nU 8696 ; WX 602 ; N uni21F8 ; G 2068\nU 8697 ; WX 602 ; N uni21F9 ; G 2069\nU 8698 ; WX 602 ; N uni21FA ; G 2070\nU 8699 ; WX 602 ; N uni21FB ; G 2071\nU 8700 ; WX 602 ; N uni21FC ; G 2072\nU 8701 ; WX 602 ; N uni21FD ; G 2073\nU 8702 ; WX 602 ; N uni21FE ; G 2074\nU 8703 ; WX 602 ; N uni21FF ; G 2075\nU 8704 ; WX 602 ; N universal ; G 2076\nU 8705 ; WX 602 ; N uni2201 ; G 2077\nU 8706 ; WX 602 ; N partialdiff ; G 2078\nU 8707 ; WX 602 ; N existential ; G 2079\nU 8708 ; WX 602 ; N uni2204 ; G 2080\nU 8709 ; WX 602 ; N emptyset ; G 2081\nU 8710 ; WX 602 ; N increment ; G 2082\nU 8711 ; WX 602 ; N gradient ; G 2083\nU 8712 ; WX 602 ; N element ; G 2084\nU 8713 ; WX 602 ; N notelement ; G 2085\nU 8714 ; WX 602 ; N uni220A ; G 2086\nU 8715 ; WX 602 ; N suchthat ; G 2087\nU 8716 ; WX 602 ; N uni220C ; G 2088\nU 8717 ; WX 602 ; N uni220D ; G 2089\nU 8718 ; WX 602 ; N uni220E ; G 2090\nU 8719 ; WX 602 ; N product ; G 2091\nU 8720 ; WX 602 ; N uni2210 ; G 2092\nU 8721 ; WX 602 ; N summation ; G 2093\nU 8722 ; WX 602 ; N minus ; G 2094\nU 8723 ; WX 602 ; N uni2213 ; G 2095\nU 8725 ; WX 602 ; N uni2215 ; G 2096\nU 8727 ; WX 602 ; N asteriskmath ; G 2097\nU 8728 ; WX 602 ; N uni2218 ; G 2098\nU 8729 ; WX 602 ; N uni2219 ; G 2099\nU 8730 ; WX 602 ; N radical ; G 2100\nU 8731 ; WX 602 ; N uni221B ; G 2101\nU 8732 ; WX 602 ; N uni221C ; G 2102\nU 8733 ; WX 602 ; N proportional ; G 2103\nU 8734 ; WX 602 ; N infinity ; G 2104\nU 8735 ; WX 602 ; N orthogonal ; G 2105\nU 8736 ; WX 602 ; N angle ; G 2106\nU 8739 ; WX 602 ; N uni2223 ; G 2107\nU 8743 ; WX 602 ; N logicaland ; G 2108\nU 8744 ; WX 602 ; N logicalor ; G 2109\nU 8745 ; WX 602 ; N intersection ; G 2110\nU 8746 ; WX 602 ; N union ; G 2111\nU 8747 ; WX 602 ; N integral ; G 2112\nU 8748 ; WX 602 ; N uni222C ; G 2113\nU 8749 ; WX 602 ; N uni222D ; G 2114\nU 8756 ; WX 602 ; N therefore ; G 2115\nU 8757 ; WX 602 ; N uni2235 ; G 2116\nU 8758 ; WX 602 ; N uni2236 ; G 2117\nU 8759 ; WX 602 ; N uni2237 ; G 2118\nU 8760 ; WX 602 ; N uni2238 ; G 2119\nU 8761 ; WX 602 ; N uni2239 ; G 2120\nU 8762 ; WX 602 ; N uni223A ; G 2121\nU 8763 ; WX 602 ; N uni223B ; G 2122\nU 8764 ; WX 602 ; N similar ; G 2123\nU 8765 ; WX 602 ; N uni223D ; G 2124\nU 8769 ; WX 602 ; N uni2241 ; G 2125\nU 8770 ; WX 602 ; N uni2242 ; G 2126\nU 8771 ; WX 602 ; N uni2243 ; G 2127\nU 8772 ; WX 602 ; N uni2244 ; G 2128\nU 8773 ; WX 602 ; N congruent ; G 2129\nU 8774 ; WX 602 ; N uni2246 ; G 2130\nU 8775 ; WX 602 ; N uni2247 ; G 2131\nU 8776 ; WX 602 ; N approxequal ; G 2132\nU 8777 ; WX 602 ; N uni2249 ; G 2133\nU 8778 ; WX 602 ; N uni224A ; G 2134\nU 8779 ; WX 602 ; N uni224B ; G 2135\nU 8780 ; WX 602 ; N uni224C ; G 2136\nU 8781 ; WX 602 ; N uni224D ; G 2137\nU 8782 ; WX 602 ; N uni224E ; G 2138\nU 8783 ; WX 602 ; N uni224F ; G 2139\nU 8784 ; WX 602 ; N uni2250 ; G 2140\nU 8785 ; WX 602 ; N uni2251 ; G 2141\nU 8786 ; WX 602 ; N uni2252 ; G 2142\nU 8787 ; WX 602 ; N uni2253 ; G 2143\nU 8788 ; WX 602 ; N uni2254 ; G 2144\nU 8789 ; WX 602 ; N uni2255 ; G 2145\nU 8790 ; WX 602 ; N uni2256 ; G 2146\nU 8791 ; WX 602 ; N uni2257 ; G 2147\nU 8792 ; WX 602 ; N uni2258 ; G 2148\nU 8793 ; WX 602 ; N uni2259 ; G 2149\nU 8794 ; WX 602 ; N uni225A ; G 2150\nU 8795 ; WX 602 ; N uni225B ; G 2151\nU 8796 ; WX 602 ; N uni225C ; G 2152\nU 8797 ; WX 602 ; N uni225D ; G 2153\nU 8798 ; WX 602 ; N uni225E ; G 2154\nU 8799 ; WX 602 ; N uni225F ; G 2155\nU 8800 ; WX 602 ; N notequal ; G 2156\nU 8801 ; WX 602 ; N equivalence ; G 2157\nU 8802 ; WX 602 ; N uni2262 ; G 2158\nU 8803 ; WX 602 ; N uni2263 ; G 2159\nU 8804 ; WX 602 ; N lessequal ; G 2160\nU 8805 ; WX 602 ; N greaterequal ; G 2161\nU 8806 ; WX 602 ; N uni2266 ; G 2162\nU 8807 ; WX 602 ; N uni2267 ; G 2163\nU 8808 ; WX 602 ; N uni2268 ; G 2164\nU 8809 ; WX 602 ; N uni2269 ; G 2165\nU 8813 ; WX 602 ; N uni226D ; G 2166\nU 8814 ; WX 602 ; N uni226E ; G 2167\nU 8815 ; WX 602 ; N uni226F ; G 2168\nU 8816 ; WX 602 ; N uni2270 ; G 2169\nU 8817 ; WX 602 ; N uni2271 ; G 2170\nU 8818 ; WX 602 ; N uni2272 ; G 2171\nU 8819 ; WX 602 ; N uni2273 ; G 2172\nU 8820 ; WX 602 ; N uni2274 ; G 2173\nU 8821 ; WX 602 ; N uni2275 ; G 2174\nU 8822 ; WX 602 ; N uni2276 ; G 2175\nU 8823 ; WX 602 ; N uni2277 ; G 2176\nU 8824 ; WX 602 ; N uni2278 ; G 2177\nU 8825 ; WX 602 ; N uni2279 ; G 2178\nU 8826 ; WX 602 ; N uni227A ; G 2179\nU 8827 ; WX 602 ; N uni227B ; G 2180\nU 8828 ; WX 602 ; N uni227C ; G 2181\nU 8829 ; WX 602 ; N uni227D ; G 2182\nU 8830 ; WX 602 ; N uni227E ; G 2183\nU 8831 ; WX 602 ; N uni227F ; G 2184\nU 8832 ; WX 602 ; N uni2280 ; G 2185\nU 8833 ; WX 602 ; N uni2281 ; G 2186\nU 8834 ; WX 602 ; N propersubset ; G 2187\nU 8835 ; WX 602 ; N propersuperset ; G 2188\nU 8836 ; WX 602 ; N notsubset ; G 2189\nU 8837 ; WX 602 ; N uni2285 ; G 2190\nU 8838 ; WX 602 ; N reflexsubset ; G 2191\nU 8839 ; WX 602 ; N reflexsuperset ; G 2192\nU 8840 ; WX 602 ; N uni2288 ; G 2193\nU 8841 ; WX 602 ; N uni2289 ; G 2194\nU 8842 ; WX 602 ; N uni228A ; G 2195\nU 8843 ; WX 602 ; N uni228B ; G 2196\nU 8845 ; WX 602 ; N uni228D ; G 2197\nU 8846 ; WX 602 ; N uni228E ; G 2198\nU 8847 ; WX 602 ; N uni228F ; G 2199\nU 8848 ; WX 602 ; N uni2290 ; G 2200\nU 8849 ; WX 602 ; N uni2291 ; G 2201\nU 8850 ; WX 602 ; N uni2292 ; G 2202\nU 8851 ; WX 602 ; N uni2293 ; G 2203\nU 8852 ; WX 602 ; N uni2294 ; G 2204\nU 8853 ; WX 602 ; N circleplus ; G 2205\nU 8854 ; WX 602 ; N uni2296 ; G 2206\nU 8855 ; WX 602 ; N circlemultiply ; G 2207\nU 8856 ; WX 602 ; N uni2298 ; G 2208\nU 8857 ; WX 602 ; N uni2299 ; G 2209\nU 8858 ; WX 602 ; N uni229A ; G 2210\nU 8859 ; WX 602 ; N uni229B ; G 2211\nU 8860 ; WX 602 ; N uni229C ; G 2212\nU 8861 ; WX 602 ; N uni229D ; G 2213\nU 8862 ; WX 602 ; N uni229E ; G 2214\nU 8863 ; WX 602 ; N uni229F ; G 2215\nU 8864 ; WX 602 ; N uni22A0 ; G 2216\nU 8865 ; WX 602 ; N uni22A1 ; G 2217\nU 8866 ; WX 602 ; N uni22A2 ; G 2218\nU 8867 ; WX 602 ; N uni22A3 ; G 2219\nU 8868 ; WX 602 ; N uni22A4 ; G 2220\nU 8869 ; WX 602 ; N perpendicular ; G 2221\nU 8882 ; WX 602 ; N uni22B2 ; G 2222\nU 8883 ; WX 602 ; N uni22B3 ; G 2223\nU 8884 ; WX 602 ; N uni22B4 ; G 2224\nU 8885 ; WX 602 ; N uni22B5 ; G 2225\nU 8888 ; WX 602 ; N uni22B8 ; G 2226\nU 8898 ; WX 602 ; N uni22C2 ; G 2227\nU 8899 ; WX 602 ; N uni22C3 ; G 2228\nU 8900 ; WX 602 ; N uni22C4 ; G 2229\nU 8901 ; WX 602 ; N dotmath ; G 2230\nU 8902 ; WX 602 ; N uni22C6 ; G 2231\nU 8909 ; WX 602 ; N uni22CD ; G 2232\nU 8910 ; WX 602 ; N uni22CE ; G 2233\nU 8911 ; WX 602 ; N uni22CF ; G 2234\nU 8912 ; WX 602 ; N uni22D0 ; G 2235\nU 8913 ; WX 602 ; N uni22D1 ; G 2236\nU 8922 ; WX 602 ; N uni22DA ; G 2237\nU 8923 ; WX 602 ; N uni22DB ; G 2238\nU 8924 ; WX 602 ; N uni22DC ; G 2239\nU 8925 ; WX 602 ; N uni22DD ; G 2240\nU 8926 ; WX 602 ; N uni22DE ; G 2241\nU 8927 ; WX 602 ; N uni22DF ; G 2242\nU 8928 ; WX 602 ; N uni22E0 ; G 2243\nU 8929 ; WX 602 ; N uni22E1 ; G 2244\nU 8930 ; WX 602 ; N uni22E2 ; G 2245\nU 8931 ; WX 602 ; N uni22E3 ; G 2246\nU 8932 ; WX 602 ; N uni22E4 ; G 2247\nU 8933 ; WX 602 ; N uni22E5 ; G 2248\nU 8934 ; WX 602 ; N uni22E6 ; G 2249\nU 8935 ; WX 602 ; N uni22E7 ; G 2250\nU 8936 ; WX 602 ; N uni22E8 ; G 2251\nU 8937 ; WX 602 ; N uni22E9 ; G 2252\nU 8943 ; WX 602 ; N uni22EF ; G 2253\nU 8960 ; WX 602 ; N uni2300 ; G 2254\nU 8961 ; WX 602 ; N uni2301 ; G 2255\nU 8962 ; WX 602 ; N house ; G 2256\nU 8963 ; WX 602 ; N uni2303 ; G 2257\nU 8964 ; WX 602 ; N uni2304 ; G 2258\nU 8965 ; WX 602 ; N uni2305 ; G 2259\nU 8966 ; WX 602 ; N uni2306 ; G 2260\nU 8968 ; WX 602 ; N uni2308 ; G 2261\nU 8969 ; WX 602 ; N uni2309 ; G 2262\nU 8970 ; WX 602 ; N uni230A ; G 2263\nU 8971 ; WX 602 ; N uni230B ; G 2264\nU 8972 ; WX 602 ; N uni230C ; G 2265\nU 8973 ; WX 602 ; N uni230D ; G 2266\nU 8974 ; WX 602 ; N uni230E ; G 2267\nU 8975 ; WX 602 ; N uni230F ; G 2268\nU 8976 ; WX 602 ; N revlogicalnot ; G 2269\nU 8977 ; WX 602 ; N uni2311 ; G 2270\nU 8978 ; WX 602 ; N uni2312 ; G 2271\nU 8979 ; WX 602 ; N uni2313 ; G 2272\nU 8980 ; WX 602 ; N uni2314 ; G 2273\nU 8981 ; WX 602 ; N uni2315 ; G 2274\nU 8984 ; WX 602 ; N uni2318 ; G 2275\nU 8985 ; WX 602 ; N uni2319 ; G 2276\nU 8988 ; WX 602 ; N uni231C ; G 2277\nU 8989 ; WX 602 ; N uni231D ; G 2278\nU 8990 ; WX 602 ; N uni231E ; G 2279\nU 8991 ; WX 602 ; N uni231F ; G 2280\nU 8992 ; WX 602 ; N integraltp ; G 2281\nU 8993 ; WX 602 ; N integralbt ; G 2282\nU 8997 ; WX 602 ; N uni2325 ; G 2283\nU 8998 ; WX 602 ; N uni2326 ; G 2284\nU 8999 ; WX 602 ; N uni2327 ; G 2285\nU 9000 ; WX 602 ; N uni2328 ; G 2286\nU 9003 ; WX 602 ; N uni232B ; G 2287\nU 9013 ; WX 602 ; N uni2335 ; G 2288\nU 9014 ; WX 602 ; N uni2336 ; G 2289\nU 9015 ; WX 602 ; N uni2337 ; G 2290\nU 9016 ; WX 602 ; N uni2338 ; G 2291\nU 9017 ; WX 602 ; N uni2339 ; G 2292\nU 9018 ; WX 602 ; N uni233A ; G 2293\nU 9019 ; WX 602 ; N uni233B ; G 2294\nU 9020 ; WX 602 ; N uni233C ; G 2295\nU 9021 ; WX 602 ; N uni233D ; G 2296\nU 9022 ; WX 602 ; N uni233E ; G 2297\nU 9023 ; WX 602 ; N uni233F ; G 2298\nU 9024 ; WX 602 ; N uni2340 ; G 2299\nU 9025 ; WX 602 ; N uni2341 ; G 2300\nU 9026 ; WX 602 ; N uni2342 ; G 2301\nU 9027 ; WX 602 ; N uni2343 ; G 2302\nU 9028 ; WX 602 ; N uni2344 ; G 2303\nU 9029 ; WX 602 ; N uni2345 ; G 2304\nU 9030 ; WX 602 ; N uni2346 ; G 2305\nU 9031 ; WX 602 ; N uni2347 ; G 2306\nU 9032 ; WX 602 ; N uni2348 ; G 2307\nU 9033 ; WX 602 ; N uni2349 ; G 2308\nU 9034 ; WX 602 ; N uni234A ; G 2309\nU 9035 ; WX 602 ; N uni234B ; G 2310\nU 9036 ; WX 602 ; N uni234C ; G 2311\nU 9037 ; WX 602 ; N uni234D ; G 2312\nU 9038 ; WX 602 ; N uni234E ; G 2313\nU 9039 ; WX 602 ; N uni234F ; G 2314\nU 9040 ; WX 602 ; N uni2350 ; G 2315\nU 9041 ; WX 602 ; N uni2351 ; G 2316\nU 9042 ; WX 602 ; N uni2352 ; G 2317\nU 9043 ; WX 602 ; N uni2353 ; G 2318\nU 9044 ; WX 602 ; N uni2354 ; G 2319\nU 9045 ; WX 602 ; N uni2355 ; G 2320\nU 9046 ; WX 602 ; N uni2356 ; G 2321\nU 9047 ; WX 602 ; N uni2357 ; G 2322\nU 9048 ; WX 602 ; N uni2358 ; G 2323\nU 9049 ; WX 602 ; N uni2359 ; G 2324\nU 9050 ; WX 602 ; N uni235A ; G 2325\nU 9051 ; WX 602 ; N uni235B ; G 2326\nU 9052 ; WX 602 ; N uni235C ; G 2327\nU 9053 ; WX 602 ; N uni235D ; G 2328\nU 9054 ; WX 602 ; N uni235E ; G 2329\nU 9055 ; WX 602 ; N uni235F ; G 2330\nU 9056 ; WX 602 ; N uni2360 ; G 2331\nU 9057 ; WX 602 ; N uni2361 ; G 2332\nU 9058 ; WX 602 ; N uni2362 ; G 2333\nU 9059 ; WX 602 ; N uni2363 ; G 2334\nU 9060 ; WX 602 ; N uni2364 ; G 2335\nU 9061 ; WX 602 ; N uni2365 ; G 2336\nU 9062 ; WX 602 ; N uni2366 ; G 2337\nU 9063 ; WX 602 ; N uni2367 ; G 2338\nU 9064 ; WX 602 ; N uni2368 ; G 2339\nU 9065 ; WX 602 ; N uni2369 ; G 2340\nU 9066 ; WX 602 ; N uni236A ; G 2341\nU 9067 ; WX 602 ; N uni236B ; G 2342\nU 9068 ; WX 602 ; N uni236C ; G 2343\nU 9069 ; WX 602 ; N uni236D ; G 2344\nU 9070 ; WX 602 ; N uni236E ; G 2345\nU 9071 ; WX 602 ; N uni236F ; G 2346\nU 9072 ; WX 602 ; N uni2370 ; G 2347\nU 9073 ; WX 602 ; N uni2371 ; G 2348\nU 9074 ; WX 602 ; N uni2372 ; G 2349\nU 9075 ; WX 602 ; N uni2373 ; G 2350\nU 9076 ; WX 602 ; N uni2374 ; G 2351\nU 9077 ; WX 602 ; N uni2375 ; G 2352\nU 9078 ; WX 602 ; N uni2376 ; G 2353\nU 9079 ; WX 602 ; N uni2377 ; G 2354\nU 9080 ; WX 602 ; N uni2378 ; G 2355\nU 9081 ; WX 602 ; N uni2379 ; G 2356\nU 9082 ; WX 602 ; N uni237A ; G 2357\nU 9085 ; WX 602 ; N uni237D ; G 2358\nU 9088 ; WX 602 ; N uni2380 ; G 2359\nU 9089 ; WX 602 ; N uni2381 ; G 2360\nU 9090 ; WX 602 ; N uni2382 ; G 2361\nU 9091 ; WX 602 ; N uni2383 ; G 2362\nU 9096 ; WX 602 ; N uni2388 ; G 2363\nU 9097 ; WX 602 ; N uni2389 ; G 2364\nU 9098 ; WX 602 ; N uni238A ; G 2365\nU 9099 ; WX 602 ; N uni238B ; G 2366\nU 9109 ; WX 602 ; N uni2395 ; G 2367\nU 9115 ; WX 602 ; N uni239B ; G 2368\nU 9116 ; WX 602 ; N uni239C ; G 2369\nU 9117 ; WX 602 ; N uni239D ; G 2370\nU 9118 ; WX 602 ; N uni239E ; G 2371\nU 9119 ; WX 602 ; N uni239F ; G 2372\nU 9120 ; WX 602 ; N uni23A0 ; G 2373\nU 9121 ; WX 602 ; N uni23A1 ; G 2374\nU 9122 ; WX 602 ; N uni23A2 ; G 2375\nU 9123 ; WX 602 ; N uni23A3 ; G 2376\nU 9124 ; WX 602 ; N uni23A4 ; G 2377\nU 9125 ; WX 602 ; N uni23A5 ; G 2378\nU 9126 ; WX 602 ; N uni23A6 ; G 2379\nU 9127 ; WX 602 ; N uni23A7 ; G 2380\nU 9128 ; WX 602 ; N uni23A8 ; G 2381\nU 9129 ; WX 602 ; N uni23A9 ; G 2382\nU 9130 ; WX 602 ; N uni23AA ; G 2383\nU 9131 ; WX 602 ; N uni23AB ; G 2384\nU 9132 ; WX 602 ; N uni23AC ; G 2385\nU 9133 ; WX 602 ; N uni23AD ; G 2386\nU 9134 ; WX 602 ; N uni23AE ; G 2387\nU 9166 ; WX 602 ; N uni23CE ; G 2388\nU 9167 ; WX 602 ; N uni23CF ; G 2389\nU 9251 ; WX 602 ; N uni2423 ; G 2390\nU 9472 ; WX 602 ; N SF100000 ; G 2391\nU 9473 ; WX 602 ; N uni2501 ; G 2392\nU 9474 ; WX 602 ; N SF110000 ; G 2393\nU 9475 ; WX 602 ; N uni2503 ; G 2394\nU 9476 ; WX 602 ; N uni2504 ; G 2395\nU 9477 ; WX 602 ; N uni2505 ; G 2396\nU 9478 ; WX 602 ; N uni2506 ; G 2397\nU 9479 ; WX 602 ; N uni2507 ; G 2398\nU 9480 ; WX 602 ; N uni2508 ; G 2399\nU 9481 ; WX 602 ; N uni2509 ; G 2400\nU 9482 ; WX 602 ; N uni250A ; G 2401\nU 9483 ; WX 602 ; N uni250B ; G 2402\nU 9484 ; WX 602 ; N SF010000 ; G 2403\nU 9485 ; WX 602 ; N uni250D ; G 2404\nU 9486 ; WX 602 ; N uni250E ; G 2405\nU 9487 ; WX 602 ; N uni250F ; G 2406\nU 9488 ; WX 602 ; N SF030000 ; G 2407\nU 9489 ; WX 602 ; N uni2511 ; G 2408\nU 9490 ; WX 602 ; N uni2512 ; G 2409\nU 9491 ; WX 602 ; N uni2513 ; G 2410\nU 9492 ; WX 602 ; N SF020000 ; G 2411\nU 9493 ; WX 602 ; N uni2515 ; G 2412\nU 9494 ; WX 602 ; N uni2516 ; G 2413\nU 9495 ; WX 602 ; N uni2517 ; G 2414\nU 9496 ; WX 602 ; N SF040000 ; G 2415\nU 9497 ; WX 602 ; N uni2519 ; G 2416\nU 9498 ; WX 602 ; N uni251A ; G 2417\nU 9499 ; WX 602 ; N uni251B ; G 2418\nU 9500 ; WX 602 ; N SF080000 ; G 2419\nU 9501 ; WX 602 ; N uni251D ; G 2420\nU 9502 ; WX 602 ; N uni251E ; G 2421\nU 9503 ; WX 602 ; N uni251F ; G 2422\nU 9504 ; WX 602 ; N uni2520 ; G 2423\nU 9505 ; WX 602 ; N uni2521 ; G 2424\nU 9506 ; WX 602 ; N uni2522 ; G 2425\nU 9507 ; WX 602 ; N uni2523 ; G 2426\nU 9508 ; WX 602 ; N SF090000 ; G 2427\nU 9509 ; WX 602 ; N uni2525 ; G 2428\nU 9510 ; WX 602 ; N uni2526 ; G 2429\nU 9511 ; WX 602 ; N uni2527 ; G 2430\nU 9512 ; WX 602 ; N uni2528 ; G 2431\nU 9513 ; WX 602 ; N uni2529 ; G 2432\nU 9514 ; WX 602 ; N uni252A ; G 2433\nU 9515 ; WX 602 ; N uni252B ; G 2434\nU 9516 ; WX 602 ; N SF060000 ; G 2435\nU 9517 ; WX 602 ; N uni252D ; G 2436\nU 9518 ; WX 602 ; N uni252E ; G 2437\nU 9519 ; WX 602 ; N uni252F ; G 2438\nU 9520 ; WX 602 ; N uni2530 ; G 2439\nU 9521 ; WX 602 ; N uni2531 ; G 2440\nU 9522 ; WX 602 ; N uni2532 ; G 2441\nU 9523 ; WX 602 ; N uni2533 ; G 2442\nU 9524 ; WX 602 ; N SF070000 ; G 2443\nU 9525 ; WX 602 ; N uni2535 ; G 2444\nU 9526 ; WX 602 ; N uni2536 ; G 2445\nU 9527 ; WX 602 ; N uni2537 ; G 2446\nU 9528 ; WX 602 ; N uni2538 ; G 2447\nU 9529 ; WX 602 ; N uni2539 ; G 2448\nU 9530 ; WX 602 ; N uni253A ; G 2449\nU 9531 ; WX 602 ; N uni253B ; G 2450\nU 9532 ; WX 602 ; N SF050000 ; G 2451\nU 9533 ; WX 602 ; N uni253D ; G 2452\nU 9534 ; WX 602 ; N uni253E ; G 2453\nU 9535 ; WX 602 ; N uni253F ; G 2454\nU 9536 ; WX 602 ; N uni2540 ; G 2455\nU 9537 ; WX 602 ; N uni2541 ; G 2456\nU 9538 ; WX 602 ; N uni2542 ; G 2457\nU 9539 ; WX 602 ; N uni2543 ; G 2458\nU 9540 ; WX 602 ; N uni2544 ; G 2459\nU 9541 ; WX 602 ; N uni2545 ; G 2460\nU 9542 ; WX 602 ; N uni2546 ; G 2461\nU 9543 ; WX 602 ; N uni2547 ; G 2462\nU 9544 ; WX 602 ; N uni2548 ; G 2463\nU 9545 ; WX 602 ; N uni2549 ; G 2464\nU 9546 ; WX 602 ; N uni254A ; G 2465\nU 9547 ; WX 602 ; N uni254B ; G 2466\nU 9548 ; WX 602 ; N uni254C ; G 2467\nU 9549 ; WX 602 ; N uni254D ; G 2468\nU 9550 ; WX 602 ; N uni254E ; G 2469\nU 9551 ; WX 602 ; N uni254F ; G 2470\nU 9552 ; WX 602 ; N SF430000 ; G 2471\nU 9553 ; WX 602 ; N SF240000 ; G 2472\nU 9554 ; WX 602 ; N SF510000 ; G 2473\nU 9555 ; WX 602 ; N SF520000 ; G 2474\nU 9556 ; WX 602 ; N SF390000 ; G 2475\nU 9557 ; WX 602 ; N SF220000 ; G 2476\nU 9558 ; WX 602 ; N SF210000 ; G 2477\nU 9559 ; WX 602 ; N SF250000 ; G 2478\nU 9560 ; WX 602 ; N SF500000 ; G 2479\nU 9561 ; WX 602 ; N SF490000 ; G 2480\nU 9562 ; WX 602 ; N SF380000 ; G 2481\nU 9563 ; WX 602 ; N SF280000 ; G 2482\nU 9564 ; WX 602 ; N SF270000 ; G 2483\nU 9565 ; WX 602 ; N SF260000 ; G 2484\nU 9566 ; WX 602 ; N SF360000 ; G 2485\nU 9567 ; WX 602 ; N SF370000 ; G 2486\nU 9568 ; WX 602 ; N SF420000 ; G 2487\nU 9569 ; WX 602 ; N SF190000 ; G 2488\nU 9570 ; WX 602 ; N SF200000 ; G 2489\nU 9571 ; WX 602 ; N SF230000 ; G 2490\nU 9572 ; WX 602 ; N SF470000 ; G 2491\nU 9573 ; WX 602 ; N SF480000 ; G 2492\nU 9574 ; WX 602 ; N SF410000 ; G 2493\nU 9575 ; WX 602 ; N SF450000 ; G 2494\nU 9576 ; WX 602 ; N SF460000 ; G 2495\nU 9577 ; WX 602 ; N SF400000 ; G 2496\nU 9578 ; WX 602 ; N SF540000 ; G 2497\nU 9579 ; WX 602 ; N SF530000 ; G 2498\nU 9580 ; WX 602 ; N SF440000 ; G 2499\nU 9581 ; WX 602 ; N uni256D ; G 2500\nU 9582 ; WX 602 ; N uni256E ; G 2501\nU 9583 ; WX 602 ; N uni256F ; G 2502\nU 9584 ; WX 602 ; N uni2570 ; G 2503\nU 9585 ; WX 602 ; N uni2571 ; G 2504\nU 9586 ; WX 602 ; N uni2572 ; G 2505\nU 9587 ; WX 602 ; N uni2573 ; G 2506\nU 9588 ; WX 602 ; N uni2574 ; G 2507\nU 9589 ; WX 602 ; N uni2575 ; G 2508\nU 9590 ; WX 602 ; N uni2576 ; G 2509\nU 9591 ; WX 602 ; N uni2577 ; G 2510\nU 9592 ; WX 602 ; N uni2578 ; G 2511\nU 9593 ; WX 602 ; N uni2579 ; G 2512\nU 9594 ; WX 602 ; N uni257A ; G 2513\nU 9595 ; WX 602 ; N uni257B ; G 2514\nU 9596 ; WX 602 ; N uni257C ; G 2515\nU 9597 ; WX 602 ; N uni257D ; G 2516\nU 9598 ; WX 602 ; N uni257E ; G 2517\nU 9599 ; WX 602 ; N uni257F ; G 2518\nU 9600 ; WX 602 ; N upblock ; G 2519\nU 9601 ; WX 602 ; N uni2581 ; G 2520\nU 9602 ; WX 602 ; N uni2582 ; G 2521\nU 9603 ; WX 602 ; N uni2583 ; G 2522\nU 9604 ; WX 602 ; N dnblock ; G 2523\nU 9605 ; WX 602 ; N uni2585 ; G 2524\nU 9606 ; WX 602 ; N uni2586 ; G 2525\nU 9607 ; WX 602 ; N uni2587 ; G 2526\nU 9608 ; WX 602 ; N block ; G 2527\nU 9609 ; WX 602 ; N uni2589 ; G 2528\nU 9610 ; WX 602 ; N uni258A ; G 2529\nU 9611 ; WX 602 ; N uni258B ; G 2530\nU 9612 ; WX 602 ; N lfblock ; G 2531\nU 9613 ; WX 602 ; N uni258D ; G 2532\nU 9614 ; WX 602 ; N uni258E ; G 2533\nU 9615 ; WX 602 ; N uni258F ; G 2534\nU 9616 ; WX 602 ; N rtblock ; G 2535\nU 9617 ; WX 602 ; N ltshade ; G 2536\nU 9618 ; WX 602 ; N shade ; G 2537\nU 9619 ; WX 602 ; N dkshade ; G 2538\nU 9620 ; WX 602 ; N uni2594 ; G 2539\nU 9621 ; WX 602 ; N uni2595 ; G 2540\nU 9622 ; WX 602 ; N uni2596 ; G 2541\nU 9623 ; WX 602 ; N uni2597 ; G 2542\nU 9624 ; WX 602 ; N uni2598 ; G 2543\nU 9625 ; WX 602 ; N uni2599 ; G 2544\nU 9626 ; WX 602 ; N uni259A ; G 2545\nU 9627 ; WX 602 ; N uni259B ; G 2546\nU 9628 ; WX 602 ; N uni259C ; G 2547\nU 9629 ; WX 602 ; N uni259D ; G 2548\nU 9630 ; WX 602 ; N uni259E ; G 2549\nU 9631 ; WX 602 ; N uni259F ; G 2550\nU 9632 ; WX 602 ; N filledbox ; G 2551\nU 9633 ; WX 602 ; N H22073 ; G 2552\nU 9634 ; WX 602 ; N uni25A2 ; G 2553\nU 9635 ; WX 602 ; N uni25A3 ; G 2554\nU 9636 ; WX 602 ; N uni25A4 ; G 2555\nU 9637 ; WX 602 ; N uni25A5 ; G 2556\nU 9638 ; WX 602 ; N uni25A6 ; G 2557\nU 9639 ; WX 602 ; N uni25A7 ; G 2558\nU 9640 ; WX 602 ; N uni25A8 ; G 2559\nU 9641 ; WX 602 ; N uni25A9 ; G 2560\nU 9642 ; WX 602 ; N H18543 ; G 2561\nU 9643 ; WX 602 ; N H18551 ; G 2562\nU 9644 ; WX 602 ; N filledrect ; G 2563\nU 9645 ; WX 602 ; N uni25AD ; G 2564\nU 9646 ; WX 602 ; N uni25AE ; G 2565\nU 9647 ; WX 602 ; N uni25AF ; G 2566\nU 9648 ; WX 602 ; N uni25B0 ; G 2567\nU 9649 ; WX 602 ; N uni25B1 ; G 2568\nU 9650 ; WX 602 ; N triagup ; G 2569\nU 9651 ; WX 602 ; N uni25B3 ; G 2570\nU 9652 ; WX 602 ; N uni25B4 ; G 2571\nU 9653 ; WX 602 ; N uni25B5 ; G 2572\nU 9654 ; WX 602 ; N uni25B6 ; G 2573\nU 9655 ; WX 602 ; N uni25B7 ; G 2574\nU 9656 ; WX 602 ; N uni25B8 ; G 2575\nU 9657 ; WX 602 ; N uni25B9 ; G 2576\nU 9658 ; WX 602 ; N triagrt ; G 2577\nU 9659 ; WX 602 ; N uni25BB ; G 2578\nU 9660 ; WX 602 ; N triagdn ; G 2579\nU 9661 ; WX 602 ; N uni25BD ; G 2580\nU 9662 ; WX 602 ; N uni25BE ; G 2581\nU 9663 ; WX 602 ; N uni25BF ; G 2582\nU 9664 ; WX 602 ; N uni25C0 ; G 2583\nU 9665 ; WX 602 ; N uni25C1 ; G 2584\nU 9666 ; WX 602 ; N uni25C2 ; G 2585\nU 9667 ; WX 602 ; N uni25C3 ; G 2586\nU 9668 ; WX 602 ; N triaglf ; G 2587\nU 9669 ; WX 602 ; N uni25C5 ; G 2588\nU 9670 ; WX 602 ; N uni25C6 ; G 2589\nU 9671 ; WX 602 ; N uni25C7 ; G 2590\nU 9672 ; WX 602 ; N uni25C8 ; G 2591\nU 9673 ; WX 602 ; N uni25C9 ; G 2592\nU 9674 ; WX 602 ; N lozenge ; G 2593\nU 9675 ; WX 602 ; N circle ; G 2594\nU 9676 ; WX 602 ; N uni25CC ; G 2595\nU 9677 ; WX 602 ; N uni25CD ; G 2596\nU 9678 ; WX 602 ; N uni25CE ; G 2597\nU 9679 ; WX 602 ; N H18533 ; G 2598\nU 9680 ; WX 602 ; N uni25D0 ; G 2599\nU 9681 ; WX 602 ; N uni25D1 ; G 2600\nU 9682 ; WX 602 ; N uni25D2 ; G 2601\nU 9683 ; WX 602 ; N uni25D3 ; G 2602\nU 9684 ; WX 602 ; N uni25D4 ; G 2603\nU 9685 ; WX 602 ; N uni25D5 ; G 2604\nU 9686 ; WX 602 ; N uni25D6 ; G 2605\nU 9687 ; WX 602 ; N uni25D7 ; G 2606\nU 9688 ; WX 602 ; N invbullet ; G 2607\nU 9689 ; WX 602 ; N invcircle ; G 2608\nU 9690 ; WX 602 ; N uni25DA ; G 2609\nU 9691 ; WX 602 ; N uni25DB ; G 2610\nU 9692 ; WX 602 ; N uni25DC ; G 2611\nU 9693 ; WX 602 ; N uni25DD ; G 2612\nU 9694 ; WX 602 ; N uni25DE ; G 2613\nU 9695 ; WX 602 ; N uni25DF ; G 2614\nU 9696 ; WX 602 ; N uni25E0 ; G 2615\nU 9697 ; WX 602 ; N uni25E1 ; G 2616\nU 9698 ; WX 602 ; N uni25E2 ; G 2617\nU 9699 ; WX 602 ; N uni25E3 ; G 2618\nU 9700 ; WX 602 ; N uni25E4 ; G 2619\nU 9701 ; WX 602 ; N uni25E5 ; G 2620\nU 9702 ; WX 602 ; N openbullet ; G 2621\nU 9703 ; WX 602 ; N uni25E7 ; G 2622\nU 9704 ; WX 602 ; N uni25E8 ; G 2623\nU 9705 ; WX 602 ; N uni25E9 ; G 2624\nU 9706 ; WX 602 ; N uni25EA ; G 2625\nU 9707 ; WX 602 ; N uni25EB ; G 2626\nU 9708 ; WX 602 ; N uni25EC ; G 2627\nU 9709 ; WX 602 ; N uni25ED ; G 2628\nU 9710 ; WX 602 ; N uni25EE ; G 2629\nU 9711 ; WX 602 ; N uni25EF ; G 2630\nU 9712 ; WX 602 ; N uni25F0 ; G 2631\nU 9713 ; WX 602 ; N uni25F1 ; G 2632\nU 9714 ; WX 602 ; N uni25F2 ; G 2633\nU 9715 ; WX 602 ; N uni25F3 ; G 2634\nU 9716 ; WX 602 ; N uni25F4 ; G 2635\nU 9717 ; WX 602 ; N uni25F5 ; G 2636\nU 9718 ; WX 602 ; N uni25F6 ; G 2637\nU 9719 ; WX 602 ; N uni25F7 ; G 2638\nU 9720 ; WX 602 ; N uni25F8 ; G 2639\nU 9721 ; WX 602 ; N uni25F9 ; G 2640\nU 9722 ; WX 602 ; N uni25FA ; G 2641\nU 9723 ; WX 602 ; N uni25FB ; G 2642\nU 9724 ; WX 602 ; N uni25FC ; G 2643\nU 9725 ; WX 602 ; N uni25FD ; G 2644\nU 9726 ; WX 602 ; N uni25FE ; G 2645\nU 9727 ; WX 602 ; N uni25FF ; G 2646\nU 9728 ; WX 602 ; N uni2600 ; G 2647\nU 9729 ; WX 602 ; N uni2601 ; G 2648\nU 9730 ; WX 602 ; N uni2602 ; G 2649\nU 9731 ; WX 602 ; N uni2603 ; G 2650\nU 9732 ; WX 602 ; N uni2604 ; G 2651\nU 9733 ; WX 602 ; N uni2605 ; G 2652\nU 9734 ; WX 602 ; N uni2606 ; G 2653\nU 9735 ; WX 602 ; N uni2607 ; G 2654\nU 9736 ; WX 602 ; N uni2608 ; G 2655\nU 9737 ; WX 602 ; N uni2609 ; G 2656\nU 9738 ; WX 602 ; N uni260A ; G 2657\nU 9739 ; WX 602 ; N uni260B ; G 2658\nU 9740 ; WX 602 ; N uni260C ; G 2659\nU 9741 ; WX 602 ; N uni260D ; G 2660\nU 9742 ; WX 602 ; N uni260E ; G 2661\nU 9743 ; WX 602 ; N uni260F ; G 2662\nU 9744 ; WX 602 ; N uni2610 ; G 2663\nU 9745 ; WX 602 ; N uni2611 ; G 2664\nU 9746 ; WX 602 ; N uni2612 ; G 2665\nU 9747 ; WX 602 ; N uni2613 ; G 2666\nU 9748 ; WX 602 ; N uni2614 ; G 2667\nU 9749 ; WX 602 ; N uni2615 ; G 2668\nU 9750 ; WX 602 ; N uni2616 ; G 2669\nU 9751 ; WX 602 ; N uni2617 ; G 2670\nU 9752 ; WX 602 ; N uni2618 ; G 2671\nU 9753 ; WX 602 ; N uni2619 ; G 2672\nU 9754 ; WX 602 ; N uni261A ; G 2673\nU 9755 ; WX 602 ; N uni261B ; G 2674\nU 9756 ; WX 602 ; N uni261C ; G 2675\nU 9757 ; WX 602 ; N uni261D ; G 2676\nU 9758 ; WX 602 ; N uni261E ; G 2677\nU 9759 ; WX 602 ; N uni261F ; G 2678\nU 9760 ; WX 602 ; N uni2620 ; G 2679\nU 9761 ; WX 602 ; N uni2621 ; G 2680\nU 9762 ; WX 602 ; N uni2622 ; G 2681\nU 9763 ; WX 602 ; N uni2623 ; G 2682\nU 9764 ; WX 602 ; N uni2624 ; G 2683\nU 9765 ; WX 602 ; N uni2625 ; G 2684\nU 9766 ; WX 602 ; N uni2626 ; G 2685\nU 9767 ; WX 602 ; N uni2627 ; G 2686\nU 9768 ; WX 602 ; N uni2628 ; G 2687\nU 9769 ; WX 602 ; N uni2629 ; G 2688\nU 9770 ; WX 602 ; N uni262A ; G 2689\nU 9771 ; WX 602 ; N uni262B ; G 2690\nU 9772 ; WX 602 ; N uni262C ; G 2691\nU 9773 ; WX 602 ; N uni262D ; G 2692\nU 9774 ; WX 602 ; N uni262E ; G 2693\nU 9775 ; WX 602 ; N uni262F ; G 2694\nU 9784 ; WX 602 ; N uni2638 ; G 2695\nU 9785 ; WX 602 ; N uni2639 ; G 2696\nU 9786 ; WX 602 ; N smileface ; G 2697\nU 9787 ; WX 602 ; N invsmileface ; G 2698\nU 9788 ; WX 602 ; N sun ; G 2699\nU 9789 ; WX 602 ; N uni263D ; G 2700\nU 9790 ; WX 602 ; N uni263E ; G 2701\nU 9791 ; WX 602 ; N uni263F ; G 2702\nU 9792 ; WX 602 ; N female ; G 2703\nU 9793 ; WX 602 ; N uni2641 ; G 2704\nU 9794 ; WX 602 ; N male ; G 2705\nU 9795 ; WX 602 ; N uni2643 ; G 2706\nU 9796 ; WX 602 ; N uni2644 ; G 2707\nU 9797 ; WX 602 ; N uni2645 ; G 2708\nU 9798 ; WX 602 ; N uni2646 ; G 2709\nU 9799 ; WX 602 ; N uni2647 ; G 2710\nU 9800 ; WX 602 ; N uni2648 ; G 2711\nU 9801 ; WX 602 ; N uni2649 ; G 2712\nU 9802 ; WX 602 ; N uni264A ; G 2713\nU 9803 ; WX 602 ; N uni264B ; G 2714\nU 9804 ; WX 602 ; N uni264C ; G 2715\nU 9805 ; WX 602 ; N uni264D ; G 2716\nU 9806 ; WX 602 ; N uni264E ; G 2717\nU 9807 ; WX 602 ; N uni264F ; G 2718\nU 9808 ; WX 602 ; N uni2650 ; G 2719\nU 9809 ; WX 602 ; N uni2651 ; G 2720\nU 9810 ; WX 602 ; N uni2652 ; G 2721\nU 9811 ; WX 602 ; N uni2653 ; G 2722\nU 9812 ; WX 602 ; N uni2654 ; G 2723\nU 9813 ; WX 602 ; N uni2655 ; G 2724\nU 9814 ; WX 602 ; N uni2656 ; G 2725\nU 9815 ; WX 602 ; N uni2657 ; G 2726\nU 9816 ; WX 602 ; N uni2658 ; G 2727\nU 9817 ; WX 602 ; N uni2659 ; G 2728\nU 9818 ; WX 602 ; N uni265A ; G 2729\nU 9819 ; WX 602 ; N uni265B ; G 2730\nU 9820 ; WX 602 ; N uni265C ; G 2731\nU 9821 ; WX 602 ; N uni265D ; G 2732\nU 9822 ; WX 602 ; N uni265E ; G 2733\nU 9823 ; WX 602 ; N uni265F ; G 2734\nU 9824 ; WX 602 ; N spade ; G 2735\nU 9825 ; WX 602 ; N uni2661 ; G 2736\nU 9826 ; WX 602 ; N uni2662 ; G 2737\nU 9827 ; WX 602 ; N club ; G 2738\nU 9828 ; WX 602 ; N uni2664 ; G 2739\nU 9829 ; WX 602 ; N heart ; G 2740\nU 9830 ; WX 602 ; N diamond ; G 2741\nU 9831 ; WX 602 ; N uni2667 ; G 2742\nU 9832 ; WX 602 ; N uni2668 ; G 2743\nU 9833 ; WX 602 ; N uni2669 ; G 2744\nU 9834 ; WX 602 ; N musicalnote ; G 2745\nU 9835 ; WX 602 ; N musicalnotedbl ; G 2746\nU 9836 ; WX 602 ; N uni266C ; G 2747\nU 9837 ; WX 602 ; N uni266D ; G 2748\nU 9838 ; WX 602 ; N uni266E ; G 2749\nU 9839 ; WX 602 ; N uni266F ; G 2750\nU 9840 ; WX 602 ; N uni2670 ; G 2751\nU 9841 ; WX 602 ; N uni2671 ; G 2752\nU 9842 ; WX 602 ; N uni2672 ; G 2753\nU 9843 ; WX 602 ; N uni2673 ; G 2754\nU 9844 ; WX 602 ; N uni2674 ; G 2755\nU 9845 ; WX 602 ; N uni2675 ; G 2756\nU 9846 ; WX 602 ; N uni2676 ; G 2757\nU 9847 ; WX 602 ; N uni2677 ; G 2758\nU 9848 ; WX 602 ; N uni2678 ; G 2759\nU 9849 ; WX 602 ; N uni2679 ; G 2760\nU 9850 ; WX 602 ; N uni267A ; G 2761\nU 9851 ; WX 602 ; N uni267B ; G 2762\nU 9852 ; WX 602 ; N uni267C ; G 2763\nU 9853 ; WX 602 ; N uni267D ; G 2764\nU 9854 ; WX 602 ; N uni267E ; G 2765\nU 9855 ; WX 602 ; N uni267F ; G 2766\nU 9856 ; WX 602 ; N uni2680 ; G 2767\nU 9857 ; WX 602 ; N uni2681 ; G 2768\nU 9858 ; WX 602 ; N uni2682 ; G 2769\nU 9859 ; WX 602 ; N uni2683 ; G 2770\nU 9860 ; WX 602 ; N uni2684 ; G 2771\nU 9861 ; WX 602 ; N uni2685 ; G 2772\nU 9862 ; WX 602 ; N uni2686 ; G 2773\nU 9863 ; WX 602 ; N uni2687 ; G 2774\nU 9864 ; WX 602 ; N uni2688 ; G 2775\nU 9865 ; WX 602 ; N uni2689 ; G 2776\nU 9866 ; WX 602 ; N uni268A ; G 2777\nU 9867 ; WX 602 ; N uni268B ; G 2778\nU 9872 ; WX 602 ; N uni2690 ; G 2779\nU 9873 ; WX 602 ; N uni2691 ; G 2780\nU 9874 ; WX 602 ; N uni2692 ; G 2781\nU 9875 ; WX 602 ; N uni2693 ; G 2782\nU 9876 ; WX 602 ; N uni2694 ; G 2783\nU 9877 ; WX 602 ; N uni2695 ; G 2784\nU 9878 ; WX 602 ; N uni2696 ; G 2785\nU 9879 ; WX 602 ; N uni2697 ; G 2786\nU 9880 ; WX 602 ; N uni2698 ; G 2787\nU 9881 ; WX 602 ; N uni2699 ; G 2788\nU 9882 ; WX 602 ; N uni269A ; G 2789\nU 9883 ; WX 602 ; N uni269B ; G 2790\nU 9884 ; WX 602 ; N uni269C ; G 2791\nU 9888 ; WX 602 ; N uni26A0 ; G 2792\nU 9889 ; WX 602 ; N uni26A1 ; G 2793\nU 9904 ; WX 602 ; N uni26B0 ; G 2794\nU 9905 ; WX 602 ; N uni26B1 ; G 2795\nU 9985 ; WX 602 ; N uni2701 ; G 2796\nU 9986 ; WX 602 ; N uni2702 ; G 2797\nU 9987 ; WX 602 ; N uni2703 ; G 2798\nU 9988 ; WX 602 ; N uni2704 ; G 2799\nU 9990 ; WX 602 ; N uni2706 ; G 2800\nU 9991 ; WX 602 ; N uni2707 ; G 2801\nU 9992 ; WX 602 ; N uni2708 ; G 2802\nU 9993 ; WX 602 ; N uni2709 ; G 2803\nU 9996 ; WX 602 ; N uni270C ; G 2804\nU 9997 ; WX 602 ; N uni270D ; G 2805\nU 9998 ; WX 602 ; N uni270E ; G 2806\nU 9999 ; WX 602 ; N uni270F ; G 2807\nU 10000 ; WX 602 ; N uni2710 ; G 2808\nU 10001 ; WX 602 ; N uni2711 ; G 2809\nU 10002 ; WX 602 ; N uni2712 ; G 2810\nU 10003 ; WX 602 ; N uni2713 ; G 2811\nU 10004 ; WX 602 ; N uni2714 ; G 2812\nU 10005 ; WX 602 ; N uni2715 ; G 2813\nU 10006 ; WX 602 ; N uni2716 ; G 2814\nU 10007 ; WX 602 ; N uni2717 ; G 2815\nU 10008 ; WX 602 ; N uni2718 ; G 2816\nU 10009 ; WX 602 ; N uni2719 ; G 2817\nU 10010 ; WX 602 ; N uni271A ; G 2818\nU 10011 ; WX 602 ; N uni271B ; G 2819\nU 10012 ; WX 602 ; N uni271C ; G 2820\nU 10013 ; WX 602 ; N uni271D ; G 2821\nU 10014 ; WX 602 ; N uni271E ; G 2822\nU 10015 ; WX 602 ; N uni271F ; G 2823\nU 10016 ; WX 602 ; N uni2720 ; G 2824\nU 10017 ; WX 602 ; N uni2721 ; G 2825\nU 10018 ; WX 602 ; N uni2722 ; G 2826\nU 10019 ; WX 602 ; N uni2723 ; G 2827\nU 10020 ; WX 602 ; N uni2724 ; G 2828\nU 10021 ; WX 602 ; N uni2725 ; G 2829\nU 10022 ; WX 602 ; N uni2726 ; G 2830\nU 10023 ; WX 602 ; N uni2727 ; G 2831\nU 10025 ; WX 602 ; N uni2729 ; G 2832\nU 10026 ; WX 602 ; N uni272A ; G 2833\nU 10027 ; WX 602 ; N uni272B ; G 2834\nU 10028 ; WX 602 ; N uni272C ; G 2835\nU 10029 ; WX 602 ; N uni272D ; G 2836\nU 10030 ; WX 602 ; N uni272E ; G 2837\nU 10031 ; WX 602 ; N uni272F ; G 2838\nU 10032 ; WX 602 ; N uni2730 ; G 2839\nU 10033 ; WX 602 ; N uni2731 ; G 2840\nU 10034 ; WX 602 ; N uni2732 ; G 2841\nU 10035 ; WX 602 ; N uni2733 ; G 2842\nU 10036 ; WX 602 ; N uni2734 ; G 2843\nU 10037 ; WX 602 ; N uni2735 ; G 2844\nU 10038 ; WX 602 ; N uni2736 ; G 2845\nU 10039 ; WX 602 ; N uni2737 ; G 2846\nU 10040 ; WX 602 ; N uni2738 ; G 2847\nU 10041 ; WX 602 ; N uni2739 ; G 2848\nU 10042 ; WX 602 ; N uni273A ; G 2849\nU 10043 ; WX 602 ; N uni273B ; G 2850\nU 10044 ; WX 602 ; N uni273C ; G 2851\nU 10045 ; WX 602 ; N uni273D ; G 2852\nU 10046 ; WX 602 ; N uni273E ; G 2853\nU 10047 ; WX 602 ; N uni273F ; G 2854\nU 10048 ; WX 602 ; N uni2740 ; G 2855\nU 10049 ; WX 602 ; N uni2741 ; G 2856\nU 10050 ; WX 602 ; N uni2742 ; G 2857\nU 10051 ; WX 602 ; N uni2743 ; G 2858\nU 10052 ; WX 602 ; N uni2744 ; G 2859\nU 10053 ; WX 602 ; N uni2745 ; G 2860\nU 10054 ; WX 602 ; N uni2746 ; G 2861\nU 10055 ; WX 602 ; N uni2747 ; G 2862\nU 10056 ; WX 602 ; N uni2748 ; G 2863\nU 10057 ; WX 602 ; N uni2749 ; G 2864\nU 10058 ; WX 602 ; N uni274A ; G 2865\nU 10059 ; WX 602 ; N uni274B ; G 2866\nU 10061 ; WX 602 ; N uni274D ; G 2867\nU 10063 ; WX 602 ; N uni274F ; G 2868\nU 10064 ; WX 602 ; N uni2750 ; G 2869\nU 10065 ; WX 602 ; N uni2751 ; G 2870\nU 10066 ; WX 602 ; N uni2752 ; G 2871\nU 10070 ; WX 602 ; N uni2756 ; G 2872\nU 10072 ; WX 602 ; N uni2758 ; G 2873\nU 10073 ; WX 602 ; N uni2759 ; G 2874\nU 10074 ; WX 602 ; N uni275A ; G 2875\nU 10075 ; WX 602 ; N uni275B ; G 2876\nU 10076 ; WX 602 ; N uni275C ; G 2877\nU 10077 ; WX 602 ; N uni275D ; G 2878\nU 10078 ; WX 602 ; N uni275E ; G 2879\nU 10081 ; WX 602 ; N uni2761 ; G 2880\nU 10082 ; WX 602 ; N uni2762 ; G 2881\nU 10083 ; WX 602 ; N uni2763 ; G 2882\nU 10084 ; WX 602 ; N uni2764 ; G 2883\nU 10085 ; WX 602 ; N uni2765 ; G 2884\nU 10086 ; WX 602 ; N uni2766 ; G 2885\nU 10087 ; WX 602 ; N uni2767 ; G 2886\nU 10088 ; WX 602 ; N uni2768 ; G 2887\nU 10089 ; WX 602 ; N uni2769 ; G 2888\nU 10090 ; WX 602 ; N uni276A ; G 2889\nU 10091 ; WX 602 ; N uni276B ; G 2890\nU 10092 ; WX 602 ; N uni276C ; G 2891\nU 10093 ; WX 602 ; N uni276D ; G 2892\nU 10094 ; WX 602 ; N uni276E ; G 2893\nU 10095 ; WX 602 ; N uni276F ; G 2894\nU 10096 ; WX 602 ; N uni2770 ; G 2895\nU 10097 ; WX 602 ; N uni2771 ; G 2896\nU 10098 ; WX 602 ; N uni2772 ; G 2897\nU 10099 ; WX 602 ; N uni2773 ; G 2898\nU 10100 ; WX 602 ; N uni2774 ; G 2899\nU 10101 ; WX 602 ; N uni2775 ; G 2900\nU 10132 ; WX 602 ; N uni2794 ; G 2901\nU 10136 ; WX 602 ; N uni2798 ; G 2902\nU 10137 ; WX 602 ; N uni2799 ; G 2903\nU 10138 ; WX 602 ; N uni279A ; G 2904\nU 10139 ; WX 602 ; N uni279B ; G 2905\nU 10140 ; WX 602 ; N uni279C ; G 2906\nU 10141 ; WX 602 ; N uni279D ; G 2907\nU 10142 ; WX 602 ; N uni279E ; G 2908\nU 10143 ; WX 602 ; N uni279F ; G 2909\nU 10144 ; WX 602 ; N uni27A0 ; G 2910\nU 10145 ; WX 602 ; N uni27A1 ; G 2911\nU 10146 ; WX 602 ; N uni27A2 ; G 2912\nU 10147 ; WX 602 ; N uni27A3 ; G 2913\nU 10148 ; WX 602 ; N uni27A4 ; G 2914\nU 10149 ; WX 602 ; N uni27A5 ; G 2915\nU 10150 ; WX 602 ; N uni27A6 ; G 2916\nU 10151 ; WX 602 ; N uni27A7 ; G 2917\nU 10152 ; WX 602 ; N uni27A8 ; G 2918\nU 10153 ; WX 602 ; N uni27A9 ; G 2919\nU 10154 ; WX 602 ; N uni27AA ; G 2920\nU 10155 ; WX 602 ; N uni27AB ; G 2921\nU 10156 ; WX 602 ; N uni27AC ; G 2922\nU 10157 ; WX 602 ; N uni27AD ; G 2923\nU 10158 ; WX 602 ; N uni27AE ; G 2924\nU 10159 ; WX 602 ; N uni27AF ; G 2925\nU 10161 ; WX 602 ; N uni27B1 ; G 2926\nU 10162 ; WX 602 ; N uni27B2 ; G 2927\nU 10163 ; WX 602 ; N uni27B3 ; G 2928\nU 10164 ; WX 602 ; N uni27B4 ; G 2929\nU 10165 ; WX 602 ; N uni27B5 ; G 2930\nU 10166 ; WX 602 ; N uni27B6 ; G 2931\nU 10167 ; WX 602 ; N uni27B7 ; G 2932\nU 10168 ; WX 602 ; N uni27B8 ; G 2933\nU 10169 ; WX 602 ; N uni27B9 ; G 2934\nU 10170 ; WX 602 ; N uni27BA ; G 2935\nU 10171 ; WX 602 ; N uni27BB ; G 2936\nU 10172 ; WX 602 ; N uni27BC ; G 2937\nU 10173 ; WX 602 ; N uni27BD ; G 2938\nU 10174 ; WX 602 ; N uni27BE ; G 2939\nU 10175 ; WX 602 ; N uni27BF ; G 2940\nU 10178 ; WX 602 ; N uni27C2 ; G 2941\nU 10181 ; WX 602 ; N uni27C5 ; G 2942\nU 10182 ; WX 602 ; N uni27C6 ; G 2943\nU 10204 ; WX 602 ; N uni27DC ; G 2944\nU 10208 ; WX 602 ; N uni27E0 ; G 2945\nU 10214 ; WX 602 ; N uni27E6 ; G 2946\nU 10215 ; WX 602 ; N uni27E7 ; G 2947\nU 10216 ; WX 602 ; N uni27E8 ; G 2948\nU 10217 ; WX 602 ; N uni27E9 ; G 2949\nU 10218 ; WX 602 ; N uni27EA ; G 2950\nU 10219 ; WX 602 ; N uni27EB ; G 2951\nU 10229 ; WX 602 ; N uni27F5 ; G 2952\nU 10230 ; WX 602 ; N uni27F6 ; G 2953\nU 10231 ; WX 602 ; N uni27F7 ; G 2954\nU 10631 ; WX 602 ; N uni2987 ; G 2955\nU 10632 ; WX 602 ; N uni2988 ; G 2956\nU 10647 ; WX 602 ; N uni2997 ; G 2957\nU 10648 ; WX 602 ; N uni2998 ; G 2958\nU 10731 ; WX 602 ; N uni29EB ; G 2959\nU 10746 ; WX 602 ; N uni29FA ; G 2960\nU 10747 ; WX 602 ; N uni29FB ; G 2961\nU 10752 ; WX 602 ; N uni2A00 ; G 2962\nU 10799 ; WX 602 ; N uni2A2F ; G 2963\nU 10858 ; WX 602 ; N uni2A6A ; G 2964\nU 10859 ; WX 602 ; N uni2A6B ; G 2965\nU 11013 ; WX 602 ; N uni2B05 ; G 2966\nU 11014 ; WX 602 ; N uni2B06 ; G 2967\nU 11015 ; WX 602 ; N uni2B07 ; G 2968\nU 11016 ; WX 602 ; N uni2B08 ; G 2969\nU 11017 ; WX 602 ; N uni2B09 ; G 2970\nU 11018 ; WX 602 ; N uni2B0A ; G 2971\nU 11019 ; WX 602 ; N uni2B0B ; G 2972\nU 11020 ; WX 602 ; N uni2B0C ; G 2973\nU 11021 ; WX 602 ; N uni2B0D ; G 2974\nU 11026 ; WX 602 ; N uni2B12 ; G 2975\nU 11027 ; WX 602 ; N uni2B13 ; G 2976\nU 11028 ; WX 602 ; N uni2B14 ; G 2977\nU 11029 ; WX 602 ; N uni2B15 ; G 2978\nU 11030 ; WX 602 ; N uni2B16 ; G 2979\nU 11031 ; WX 602 ; N uni2B17 ; G 2980\nU 11032 ; WX 602 ; N uni2B18 ; G 2981\nU 11033 ; WX 602 ; N uni2B19 ; G 2982\nU 11034 ; WX 602 ; N uni2B1A ; G 2983\nU 11364 ; WX 602 ; N uni2C64 ; G 2984\nU 11373 ; WX 602 ; N uni2C6D ; G 2985\nU 11374 ; WX 602 ; N uni2C6E ; G 2986\nU 11375 ; WX 602 ; N uni2C6F ; G 2987\nU 11376 ; WX 602 ; N uni2C70 ; G 2988\nU 11381 ; WX 602 ; N uni2C75 ; G 2989\nU 11382 ; WX 602 ; N uni2C76 ; G 2990\nU 11383 ; WX 602 ; N uni2C77 ; G 2991\nU 11385 ; WX 602 ; N uni2C79 ; G 2992\nU 11386 ; WX 602 ; N uni2C7A ; G 2993\nU 11388 ; WX 602 ; N uni2C7C ; G 2994\nU 11389 ; WX 602 ; N uni2C7D ; G 2995\nU 11390 ; WX 602 ; N uni2C7E ; G 2996\nU 11391 ; WX 602 ; N uni2C7F ; G 2997\nU 11800 ; WX 602 ; N uni2E18 ; G 2998\nU 11807 ; WX 602 ; N uni2E1F ; G 2999\nU 11810 ; WX 602 ; N uni2E22 ; G 3000\nU 11811 ; WX 602 ; N uni2E23 ; G 3001\nU 11812 ; WX 602 ; N uni2E24 ; G 3002\nU 11813 ; WX 602 ; N uni2E25 ; G 3003\nU 11822 ; WX 602 ; N uni2E2E ; G 3004\nU 42760 ; WX 602 ; N uniA708 ; G 3005\nU 42761 ; WX 602 ; N uniA709 ; G 3006\nU 42762 ; WX 602 ; N uniA70A ; G 3007\nU 42763 ; WX 602 ; N uniA70B ; G 3008\nU 42764 ; WX 602 ; N uniA70C ; G 3009\nU 42765 ; WX 602 ; N uniA70D ; G 3010\nU 42766 ; WX 602 ; N uniA70E ; G 3011\nU 42767 ; WX 602 ; N uniA70F ; G 3012\nU 42768 ; WX 602 ; N uniA710 ; G 3013\nU 42769 ; WX 602 ; N uniA711 ; G 3014\nU 42770 ; WX 602 ; N uniA712 ; G 3015\nU 42771 ; WX 602 ; N uniA713 ; G 3016\nU 42772 ; WX 602 ; N uniA714 ; G 3017\nU 42773 ; WX 602 ; N uniA715 ; G 3018\nU 42774 ; WX 602 ; N uniA716 ; G 3019\nU 42779 ; WX 602 ; N uniA71B ; G 3020\nU 42780 ; WX 602 ; N uniA71C ; G 3021\nU 42781 ; WX 602 ; N uniA71D ; G 3022\nU 42782 ; WX 602 ; N uniA71E ; G 3023\nU 42783 ; WX 602 ; N uniA71F ; G 3024\nU 42786 ; WX 602 ; N uniA722 ; G 3025\nU 42787 ; WX 602 ; N uniA723 ; G 3026\nU 42788 ; WX 602 ; N uniA724 ; G 3027\nU 42789 ; WX 602 ; N uniA725 ; G 3028\nU 42790 ; WX 602 ; N uniA726 ; G 3029\nU 42791 ; WX 602 ; N uniA727 ; G 3030\nU 42889 ; WX 602 ; N uniA789 ; G 3031\nU 42890 ; WX 602 ; N uniA78A ; G 3032\nU 42891 ; WX 602 ; N uniA78B ; G 3033\nU 42892 ; WX 602 ; N uniA78C ; G 3034\nU 42893 ; WX 602 ; N uniA78D ; G 3035\nU 42894 ; WX 602 ; N uniA78E ; G 3036\nU 42896 ; WX 602 ; N uniA790 ; G 3037\nU 42897 ; WX 602 ; N uniA791 ; G 3038\nU 42922 ; WX 602 ; N uniA7AA ; G 3039\nU 43000 ; WX 602 ; N uniA7F8 ; G 3040\nU 43001 ; WX 602 ; N uniA7F9 ; G 3041\nU 63173 ; WX 602 ; N uniF6C5 ; G 3042\nU 64257 ; WX 602 ; N fi ; G 3043\nU 64258 ; WX 602 ; N fl ; G 3044\nU 64338 ; WX 602 ; N uniFB52 ; G 3045\nU 64339 ; WX 602 ; N uniFB53 ; G 3046\nU 64340 ; WX 602 ; N uniFB54 ; G 3047\nU 64341 ; WX 602 ; N uniFB55 ; G 3048\nU 64342 ; WX 602 ; N uniFB56 ; G 3049\nU 64343 ; WX 602 ; N uniFB57 ; G 3050\nU 64344 ; WX 602 ; N uniFB58 ; G 3051\nU 64345 ; WX 602 ; N uniFB59 ; G 3052\nU 64346 ; WX 602 ; N uniFB5A ; G 3053\nU 64347 ; WX 602 ; N uniFB5B ; G 3054\nU 64348 ; WX 602 ; N uniFB5C ; G 3055\nU 64349 ; WX 602 ; N uniFB5D ; G 3056\nU 64350 ; WX 602 ; N uniFB5E ; G 3057\nU 64351 ; WX 602 ; N uniFB5F ; G 3058\nU 64352 ; WX 602 ; N uniFB60 ; G 3059\nU 64353 ; WX 602 ; N uniFB61 ; G 3060\nU 64354 ; WX 602 ; N uniFB62 ; G 3061\nU 64355 ; WX 602 ; N uniFB63 ; G 3062\nU 64356 ; WX 602 ; N uniFB64 ; G 3063\nU 64357 ; WX 602 ; N uniFB65 ; G 3064\nU 64358 ; WX 602 ; N uniFB66 ; G 3065\nU 64359 ; WX 602 ; N uniFB67 ; G 3066\nU 64360 ; WX 602 ; N uniFB68 ; G 3067\nU 64361 ; WX 602 ; N uniFB69 ; G 3068\nU 64362 ; WX 602 ; N uniFB6A ; G 3069\nU 64363 ; WX 602 ; N uniFB6B ; G 3070\nU 64364 ; WX 602 ; N uniFB6C ; G 3071\nU 64365 ; WX 602 ; N uniFB6D ; G 3072\nU 64366 ; WX 602 ; N uniFB6E ; G 3073\nU 64367 ; WX 602 ; N uniFB6F ; G 3074\nU 64368 ; WX 602 ; N uniFB70 ; G 3075\nU 64369 ; WX 602 ; N uniFB71 ; G 3076\nU 64370 ; WX 602 ; N uniFB72 ; G 3077\nU 64371 ; WX 602 ; N uniFB73 ; G 3078\nU 64372 ; WX 602 ; N uniFB74 ; G 3079\nU 64373 ; WX 602 ; N uniFB75 ; G 3080\nU 64374 ; WX 602 ; N uniFB76 ; G 3081\nU 64375 ; WX 602 ; N uniFB77 ; G 3082\nU 64376 ; WX 602 ; N uniFB78 ; G 3083\nU 64377 ; WX 602 ; N uniFB79 ; G 3084\nU 64378 ; WX 602 ; N uniFB7A ; G 3085\nU 64379 ; WX 602 ; N uniFB7B ; G 3086\nU 64380 ; WX 602 ; N uniFB7C ; G 3087\nU 64381 ; WX 602 ; N uniFB7D ; G 3088\nU 64382 ; WX 602 ; N uniFB7E ; G 3089\nU 64383 ; WX 602 ; N uniFB7F ; G 3090\nU 64384 ; WX 602 ; N uniFB80 ; G 3091\nU 64385 ; WX 602 ; N uniFB81 ; G 3092\nU 64394 ; WX 602 ; N uniFB8A ; G 3093\nU 64395 ; WX 602 ; N uniFB8B ; G 3094\nU 64396 ; WX 602 ; N uniFB8C ; G 3095\nU 64397 ; WX 602 ; N uniFB8D ; G 3096\nU 64398 ; WX 602 ; N uniFB8E ; G 3097\nU 64399 ; WX 602 ; N uniFB8F ; G 3098\nU 64400 ; WX 602 ; N uniFB90 ; G 3099\nU 64401 ; WX 602 ; N uniFB91 ; G 3100\nU 64402 ; WX 602 ; N uniFB92 ; G 3101\nU 64403 ; WX 602 ; N uniFB93 ; G 3102\nU 64404 ; WX 602 ; N uniFB94 ; G 3103\nU 64405 ; WX 602 ; N uniFB95 ; G 3104\nU 64414 ; WX 602 ; N uniFB9E ; G 3105\nU 64415 ; WX 602 ; N uniFB9F ; G 3106\nU 64426 ; WX 602 ; N uniFBAA ; G 3107\nU 64427 ; WX 602 ; N uniFBAB ; G 3108\nU 64428 ; WX 602 ; N uniFBAC ; G 3109\nU 64429 ; WX 602 ; N uniFBAD ; G 3110\nU 64488 ; WX 602 ; N uniFBE8 ; G 3111\nU 64489 ; WX 602 ; N uniFBE9 ; G 3112\nU 64508 ; WX 602 ; N uniFBFC ; G 3113\nU 64509 ; WX 602 ; N uniFBFD ; G 3114\nU 64510 ; WX 602 ; N uniFBFE ; G 3115\nU 64511 ; WX 602 ; N uniFBFF ; G 3116\nU 65136 ; WX 602 ; N uniFE70 ; G 3117\nU 65137 ; WX 602 ; N uniFE71 ; G 3118\nU 65138 ; WX 602 ; N uniFE72 ; G 3119\nU 65139 ; WX 602 ; N uniFE73 ; G 3120\nU 65140 ; WX 602 ; N uniFE74 ; G 3121\nU 65142 ; WX 602 ; N uniFE76 ; G 3122\nU 65143 ; WX 602 ; N uniFE77 ; G 3123\nU 65144 ; WX 602 ; N uniFE78 ; G 3124\nU 65145 ; WX 602 ; N uniFE79 ; G 3125\nU 65146 ; WX 602 ; N uniFE7A ; G 3126\nU 65147 ; WX 602 ; N uniFE7B ; G 3127\nU 65148 ; WX 602 ; N uniFE7C ; G 3128\nU 65149 ; WX 602 ; N uniFE7D ; G 3129\nU 65150 ; WX 602 ; N uniFE7E ; G 3130\nU 65151 ; WX 602 ; N uniFE7F ; G 3131\nU 65152 ; WX 602 ; N uniFE80 ; G 3132\nU 65153 ; WX 602 ; N uniFE81 ; G 3133\nU 65154 ; WX 602 ; N uniFE82 ; G 3134\nU 65155 ; WX 602 ; N uniFE83 ; G 3135\nU 65156 ; WX 602 ; N uniFE84 ; G 3136\nU 65157 ; WX 602 ; N uniFE85 ; G 3137\nU 65158 ; WX 602 ; N uniFE86 ; G 3138\nU 65159 ; WX 602 ; N uniFE87 ; G 3139\nU 65160 ; WX 602 ; N uniFE88 ; G 3140\nU 65161 ; WX 602 ; N uniFE89 ; G 3141\nU 65162 ; WX 602 ; N uniFE8A ; G 3142\nU 65163 ; WX 602 ; N uniFE8B ; G 3143\nU 65164 ; WX 602 ; N uniFE8C ; G 3144\nU 65165 ; WX 602 ; N uniFE8D ; G 3145\nU 65166 ; WX 602 ; N uniFE8E ; G 3146\nU 65167 ; WX 602 ; N uniFE8F ; G 3147\nU 65168 ; WX 602 ; N uniFE90 ; G 3148\nU 65169 ; WX 602 ; N uniFE91 ; G 3149\nU 65170 ; WX 602 ; N uniFE92 ; G 3150\nU 65171 ; WX 602 ; N uniFE93 ; G 3151\nU 65172 ; WX 602 ; N uniFE94 ; G 3152\nU 65173 ; WX 602 ; N uniFE95 ; G 3153\nU 65174 ; WX 602 ; N uniFE96 ; G 3154\nU 65175 ; WX 602 ; N uniFE97 ; G 3155\nU 65176 ; WX 602 ; N uniFE98 ; G 3156\nU 65177 ; WX 602 ; N uniFE99 ; G 3157\nU 65178 ; WX 602 ; N uniFE9A ; G 3158\nU 65179 ; WX 602 ; N uniFE9B ; G 3159\nU 65180 ; WX 602 ; N uniFE9C ; G 3160\nU 65181 ; WX 602 ; N uniFE9D ; G 3161\nU 65182 ; WX 602 ; N uniFE9E ; G 3162\nU 65183 ; WX 602 ; N uniFE9F ; G 3163\nU 65184 ; WX 602 ; N uniFEA0 ; G 3164\nU 65185 ; WX 602 ; N uniFEA1 ; G 3165\nU 65186 ; WX 602 ; N uniFEA2 ; G 3166\nU 65187 ; WX 602 ; N uniFEA3 ; G 3167\nU 65188 ; WX 602 ; N uniFEA4 ; G 3168\nU 65189 ; WX 602 ; N uniFEA5 ; G 3169\nU 65190 ; WX 602 ; N uniFEA6 ; G 3170\nU 65191 ; WX 602 ; N uniFEA7 ; G 3171\nU 65192 ; WX 602 ; N uniFEA8 ; G 3172\nU 65193 ; WX 602 ; N uniFEA9 ; G 3173\nU 65194 ; WX 602 ; N uniFEAA ; G 3174\nU 65195 ; WX 602 ; N uniFEAB ; G 3175\nU 65196 ; WX 602 ; N uniFEAC ; G 3176\nU 65197 ; WX 602 ; N uniFEAD ; G 3177\nU 65198 ; WX 602 ; N uniFEAE ; G 3178\nU 65199 ; WX 602 ; N uniFEAF ; G 3179\nU 65200 ; WX 602 ; N uniFEB0 ; G 3180\nU 65201 ; WX 602 ; N uniFEB1 ; G 3181\nU 65202 ; WX 602 ; N uniFEB2 ; G 3182\nU 65203 ; WX 602 ; N uniFEB3 ; G 3183\nU 65204 ; WX 602 ; N uniFEB4 ; G 3184\nU 65205 ; WX 602 ; N uniFEB5 ; G 3185\nU 65206 ; WX 602 ; N uniFEB6 ; G 3186\nU 65207 ; WX 602 ; N uniFEB7 ; G 3187\nU 65208 ; WX 602 ; N uniFEB8 ; G 3188\nU 65209 ; WX 602 ; N uniFEB9 ; G 3189\nU 65210 ; WX 602 ; N uniFEBA ; G 3190\nU 65211 ; WX 602 ; N uniFEBB ; G 3191\nU 65212 ; WX 602 ; N uniFEBC ; G 3192\nU 65213 ; WX 602 ; N uniFEBD ; G 3193\nU 65214 ; WX 602 ; N uniFEBE ; G 3194\nU 65215 ; WX 602 ; N uniFEBF ; G 3195\nU 65216 ; WX 602 ; N uniFEC0 ; G 3196\nU 65217 ; WX 602 ; N uniFEC1 ; G 3197\nU 65218 ; WX 602 ; N uniFEC2 ; G 3198\nU 65219 ; WX 602 ; N uniFEC3 ; G 3199\nU 65220 ; WX 602 ; N uniFEC4 ; G 3200\nU 65221 ; WX 602 ; N uniFEC5 ; G 3201\nU 65222 ; WX 602 ; N uniFEC6 ; G 3202\nU 65223 ; WX 602 ; N uniFEC7 ; G 3203\nU 65224 ; WX 602 ; N uniFEC8 ; G 3204\nU 65225 ; WX 602 ; N uniFEC9 ; G 3205\nU 65226 ; WX 602 ; N uniFECA ; G 3206\nU 65227 ; WX 602 ; N uniFECB ; G 3207\nU 65228 ; WX 602 ; N uniFECC ; G 3208\nU 65229 ; WX 602 ; N uniFECD ; G 3209\nU 65230 ; WX 602 ; N uniFECE ; G 3210\nU 65231 ; WX 602 ; N uniFECF ; G 3211\nU 65232 ; WX 602 ; N uniFED0 ; G 3212\nU 65233 ; WX 602 ; N uniFED1 ; G 3213\nU 65234 ; WX 602 ; N uniFED2 ; G 3214\nU 65235 ; WX 602 ; N uniFED3 ; G 3215\nU 65236 ; WX 602 ; N uniFED4 ; G 3216\nU 65237 ; WX 602 ; N uniFED5 ; G 3217\nU 65238 ; WX 602 ; N uniFED6 ; G 3218\nU 65239 ; WX 602 ; N uniFED7 ; G 3219\nU 65240 ; WX 602 ; N uniFED8 ; G 3220\nU 65241 ; WX 602 ; N uniFED9 ; G 3221\nU 65242 ; WX 602 ; N uniFEDA ; G 3222\nU 65243 ; WX 602 ; N uniFEDB ; G 3223\nU 65244 ; WX 602 ; N uniFEDC ; G 3224\nU 65245 ; WX 602 ; N uniFEDD ; G 3225\nU 65246 ; WX 602 ; N uniFEDE ; G 3226\nU 65247 ; WX 602 ; N uniFEDF ; G 3227\nU 65248 ; WX 602 ; N uniFEE0 ; G 3228\nU 65249 ; WX 602 ; N uniFEE1 ; G 3229\nU 65250 ; WX 602 ; N uniFEE2 ; G 3230\nU 65251 ; WX 602 ; N uniFEE3 ; G 3231\nU 65252 ; WX 602 ; N uniFEE4 ; G 3232\nU 65253 ; WX 602 ; N uniFEE5 ; G 3233\nU 65254 ; WX 602 ; N uniFEE6 ; G 3234\nU 65255 ; WX 602 ; N uniFEE7 ; G 3235\nU 65256 ; WX 602 ; N uniFEE8 ; G 3236\nU 65257 ; WX 602 ; N uniFEE9 ; G 3237\nU 65258 ; WX 602 ; N uniFEEA ; G 3238\nU 65259 ; WX 602 ; N uniFEEB ; G 3239\nU 65260 ; WX 602 ; N uniFEEC ; G 3240\nU 65261 ; WX 602 ; N uniFEED ; G 3241\nU 65262 ; WX 602 ; N uniFEEE ; G 3242\nU 65263 ; WX 602 ; N uniFEEF ; G 3243\nU 65264 ; WX 602 ; N uniFEF0 ; G 3244\nU 65265 ; WX 602 ; N uniFEF1 ; G 3245\nU 65266 ; WX 602 ; N uniFEF2 ; G 3246\nU 65267 ; WX 602 ; N uniFEF3 ; G 3247\nU 65268 ; WX 602 ; N uniFEF4 ; G 3248\nU 65269 ; WX 602 ; N uniFEF5 ; G 3249\nU 65270 ; WX 602 ; N uniFEF6 ; G 3250\nU 65271 ; WX 602 ; N uniFEF7 ; G 3251\nU 65272 ; WX 602 ; N uniFEF8 ; G 3252\nU 65273 ; WX 602 ; N uniFEF9 ; G 3253\nU 65274 ; WX 602 ; N uniFEFA ; G 3254\nU 65275 ; WX 602 ; N uniFEFB ; G 3255\nU 65276 ; WX 602 ; N uniFEFC ; G 3256\nU 65279 ; WX 602 ; N uniFEFF ; G 3257\nU 65529 ; WX 602 ; N uniFFF9 ; G 3258\nU 65530 ; WX 602 ; N uniFFFA ; G 3259\nU 65531 ; WX 602 ; N uniFFFB ; G 3260\nU 65532 ; WX 602 ; N uniFFFC ; G 3261\nU 65533 ; WX 602 ; N uniFFFD ; G 3262\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans Mono\nFontSubfamily Bold Oblique\nUniqueID DejaVu Sans Mono Bold Oblique\nFullName DejaVu Sans Mono Bold Oblique\nVersion Version 2.37\nPostScriptName DejaVuSansMono-BoldOblique\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nWeight Bold\nItalicAngle -11\nIsFixedPitch true\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -425 -394 808 1008\nStartCharMetrics 2711\nU 32 ; WX 602 ; N space ; G 3\nU 33 ; WX 602 ; N exclam ; G 4\nU 34 ; WX 602 ; N quotedbl ; G 5\nU 35 ; WX 602 ; N numbersign ; G 6\nU 36 ; WX 602 ; N dollar ; G 7\nU 37 ; WX 602 ; N percent ; G 8\nU 38 ; WX 602 ; N ampersand ; G 9\nU 39 ; WX 602 ; N quotesingle ; G 10\nU 40 ; WX 602 ; N parenleft ; G 11\nU 41 ; WX 602 ; N parenright ; G 12\nU 42 ; WX 602 ; N asterisk ; G 13\nU 43 ; WX 602 ; N plus ; G 14\nU 44 ; WX 602 ; N comma ; G 15\nU 45 ; WX 602 ; N hyphen ; G 16\nU 46 ; WX 602 ; N period ; G 17\nU 47 ; WX 602 ; N slash ; G 18\nU 48 ; WX 602 ; N zero ; G 19\nU 49 ; WX 602 ; N one ; G 20\nU 50 ; WX 602 ; N two ; G 21\nU 51 ; WX 602 ; N three ; G 22\nU 52 ; WX 602 ; N four ; G 23\nU 53 ; WX 602 ; N five ; G 24\nU 54 ; WX 602 ; N six ; G 25\nU 55 ; WX 602 ; N seven ; G 26\nU 56 ; WX 602 ; N eight ; G 27\nU 57 ; WX 602 ; N nine ; G 28\nU 58 ; WX 602 ; N colon ; G 29\nU 59 ; WX 602 ; N semicolon ; G 30\nU 60 ; WX 602 ; N less ; G 31\nU 61 ; WX 602 ; N equal ; G 32\nU 62 ; WX 602 ; N greater ; G 33\nU 63 ; WX 602 ; N question ; G 34\nU 64 ; WX 602 ; N at ; G 35\nU 65 ; WX 602 ; N A ; G 36\nU 66 ; WX 602 ; N B ; G 37\nU 67 ; WX 602 ; N C ; G 38\nU 68 ; WX 602 ; N D ; G 39\nU 69 ; WX 602 ; N E ; G 40\nU 70 ; WX 602 ; N F ; G 41\nU 71 ; WX 602 ; N G ; G 42\nU 72 ; WX 602 ; N H ; G 43\nU 73 ; WX 602 ; N I ; G 44\nU 74 ; WX 602 ; N J ; G 45\nU 75 ; WX 602 ; N K ; G 46\nU 76 ; WX 602 ; N L ; G 47\nU 77 ; WX 602 ; N M ; G 48\nU 78 ; WX 602 ; N N ; G 49\nU 79 ; WX 602 ; N O ; G 50\nU 80 ; WX 602 ; N P ; G 51\nU 81 ; WX 602 ; N Q ; G 52\nU 82 ; WX 602 ; N R ; G 53\nU 83 ; WX 602 ; N S ; G 54\nU 84 ; WX 602 ; N T ; G 55\nU 85 ; WX 602 ; N U ; G 56\nU 86 ; WX 602 ; N V ; G 57\nU 87 ; WX 602 ; N W ; G 58\nU 88 ; WX 602 ; N X ; G 59\nU 89 ; WX 602 ; N Y ; G 60\nU 90 ; WX 602 ; N Z ; G 61\nU 91 ; WX 602 ; N bracketleft ; G 62\nU 92 ; WX 602 ; N backslash ; G 63\nU 93 ; WX 602 ; N bracketright ; G 64\nU 94 ; WX 602 ; N asciicircum ; G 65\nU 95 ; WX 602 ; N underscore ; G 66\nU 96 ; WX 602 ; N grave ; G 67\nU 97 ; WX 602 ; N a ; G 68\nU 98 ; WX 602 ; N b ; G 69\nU 99 ; WX 602 ; N c ; G 70\nU 100 ; WX 602 ; N d ; G 71\nU 101 ; WX 602 ; N e ; G 72\nU 102 ; WX 602 ; N f ; G 73\nU 103 ; WX 602 ; N g ; G 74\nU 104 ; WX 602 ; N h ; G 75\nU 105 ; WX 602 ; N i ; G 76\nU 106 ; WX 602 ; N j ; G 77\nU 107 ; WX 602 ; N k ; G 78\nU 108 ; WX 602 ; N l ; G 79\nU 109 ; WX 602 ; N m ; G 80\nU 110 ; WX 602 ; N n ; G 81\nU 111 ; WX 602 ; N o ; G 82\nU 112 ; WX 602 ; N p ; G 83\nU 113 ; WX 602 ; N q ; G 84\nU 114 ; WX 602 ; N r ; G 85\nU 115 ; WX 602 ; N s ; G 86\nU 116 ; WX 602 ; N t ; G 87\nU 117 ; WX 602 ; N u ; G 88\nU 118 ; WX 602 ; N v ; G 89\nU 119 ; WX 602 ; N w ; G 90\nU 120 ; WX 602 ; N x ; G 91\nU 121 ; WX 602 ; N y ; G 92\nU 122 ; WX 602 ; N z ; G 93\nU 123 ; WX 602 ; N braceleft ; G 94\nU 124 ; WX 602 ; N bar ; G 95\nU 125 ; WX 602 ; N braceright ; G 96\nU 126 ; WX 602 ; N asciitilde ; G 97\nU 160 ; WX 602 ; N nbspace ; G 98\nU 161 ; WX 602 ; N exclamdown ; G 99\nU 162 ; WX 602 ; N cent ; G 100\nU 163 ; WX 602 ; N sterling ; G 101\nU 164 ; WX 602 ; N currency ; G 102\nU 165 ; WX 602 ; N yen ; G 103\nU 166 ; WX 602 ; N brokenbar ; G 104\nU 167 ; WX 602 ; N section ; G 105\nU 168 ; WX 602 ; N dieresis ; G 106\nU 169 ; WX 602 ; N copyright ; G 107\nU 170 ; WX 602 ; N ordfeminine ; G 108\nU 171 ; WX 602 ; N guillemotleft ; G 109\nU 172 ; WX 602 ; N logicalnot ; G 110\nU 173 ; WX 602 ; N sfthyphen ; G 111\nU 174 ; WX 602 ; N registered ; G 112\nU 175 ; WX 602 ; N macron ; G 113\nU 176 ; WX 602 ; N degree ; G 114\nU 177 ; WX 602 ; N plusminus ; G 115\nU 178 ; WX 602 ; N twosuperior ; G 116\nU 179 ; WX 602 ; N threesuperior ; G 117\nU 180 ; WX 602 ; N acute ; G 118\nU 181 ; WX 602 ; N mu ; G 119\nU 182 ; WX 602 ; N paragraph ; G 120\nU 183 ; WX 602 ; N periodcentered ; G 121\nU 184 ; WX 602 ; N cedilla ; G 122\nU 185 ; WX 602 ; N onesuperior ; G 123\nU 186 ; WX 602 ; N ordmasculine ; G 124\nU 187 ; WX 602 ; N guillemotright ; G 125\nU 188 ; WX 602 ; N onequarter ; G 126\nU 189 ; WX 602 ; N onehalf ; G 127\nU 190 ; WX 602 ; N threequarters ; G 128\nU 191 ; WX 602 ; N questiondown ; G 129\nU 192 ; WX 602 ; N Agrave ; G 130\nU 193 ; WX 602 ; N Aacute ; G 131\nU 194 ; WX 602 ; N Acircumflex ; G 132\nU 195 ; WX 602 ; N Atilde ; G 133\nU 196 ; WX 602 ; N Adieresis ; G 134\nU 197 ; WX 602 ; N Aring ; G 135\nU 198 ; WX 602 ; N AE ; G 136\nU 199 ; WX 602 ; N Ccedilla ; G 137\nU 200 ; WX 602 ; N Egrave ; G 138\nU 201 ; WX 602 ; N Eacute ; G 139\nU 202 ; WX 602 ; N Ecircumflex ; G 140\nU 203 ; WX 602 ; N Edieresis ; G 141\nU 204 ; WX 602 ; N Igrave ; G 142\nU 205 ; WX 602 ; N Iacute ; G 143\nU 206 ; WX 602 ; N Icircumflex ; G 144\nU 207 ; WX 602 ; N Idieresis ; G 145\nU 208 ; WX 602 ; N Eth ; G 146\nU 209 ; WX 602 ; N Ntilde ; G 147\nU 210 ; WX 602 ; N Ograve ; G 148\nU 211 ; WX 602 ; N Oacute ; G 149\nU 212 ; WX 602 ; N Ocircumflex ; G 150\nU 213 ; WX 602 ; N Otilde ; G 151\nU 214 ; WX 602 ; N Odieresis ; G 152\nU 215 ; WX 602 ; N multiply ; G 153\nU 216 ; WX 602 ; N Oslash ; G 154\nU 217 ; WX 602 ; N Ugrave ; G 155\nU 218 ; WX 602 ; N Uacute ; G 156\nU 219 ; WX 602 ; N Ucircumflex ; G 157\nU 220 ; WX 602 ; N Udieresis ; G 158\nU 221 ; WX 602 ; N Yacute ; G 159\nU 222 ; WX 602 ; N Thorn ; G 160\nU 223 ; WX 602 ; N germandbls ; G 161\nU 224 ; WX 602 ; N agrave ; G 162\nU 225 ; WX 602 ; N aacute ; G 163\nU 226 ; WX 602 ; N acircumflex ; G 164\nU 227 ; WX 602 ; N atilde ; G 165\nU 228 ; WX 602 ; N adieresis ; G 166\nU 229 ; WX 602 ; N aring ; G 167\nU 230 ; WX 602 ; N ae ; G 168\nU 231 ; WX 602 ; N ccedilla ; G 169\nU 232 ; WX 602 ; N egrave ; G 170\nU 233 ; WX 602 ; N eacute ; G 171\nU 234 ; WX 602 ; N ecircumflex ; G 172\nU 235 ; WX 602 ; N edieresis ; G 173\nU 236 ; WX 602 ; N igrave ; G 174\nU 237 ; WX 602 ; N iacute ; G 175\nU 238 ; WX 602 ; N icircumflex ; G 176\nU 239 ; WX 602 ; N idieresis ; G 177\nU 240 ; WX 602 ; N eth ; G 178\nU 241 ; WX 602 ; N ntilde ; G 179\nU 242 ; WX 602 ; N ograve ; G 180\nU 243 ; WX 602 ; N oacute ; G 181\nU 244 ; WX 602 ; N ocircumflex ; G 182\nU 245 ; WX 602 ; N otilde ; G 183\nU 246 ; WX 602 ; N odieresis ; G 184\nU 247 ; WX 602 ; N divide ; G 185\nU 248 ; WX 602 ; N oslash ; G 186\nU 249 ; WX 602 ; N ugrave ; G 187\nU 250 ; WX 602 ; N uacute ; G 188\nU 251 ; WX 602 ; N ucircumflex ; G 189\nU 252 ; WX 602 ; N udieresis ; G 190\nU 253 ; WX 602 ; N yacute ; G 191\nU 254 ; WX 602 ; N thorn ; G 192\nU 255 ; WX 602 ; N ydieresis ; G 193\nU 256 ; WX 602 ; N Amacron ; G 194\nU 257 ; WX 602 ; N amacron ; G 195\nU 258 ; WX 602 ; N Abreve ; G 196\nU 259 ; WX 602 ; N abreve ; G 197\nU 260 ; WX 602 ; N Aogonek ; G 198\nU 261 ; WX 602 ; N aogonek ; G 199\nU 262 ; WX 602 ; N Cacute ; G 200\nU 263 ; WX 602 ; N cacute ; G 201\nU 264 ; WX 602 ; N Ccircumflex ; G 202\nU 265 ; WX 602 ; N ccircumflex ; G 203\nU 266 ; WX 602 ; N Cdotaccent ; G 204\nU 267 ; WX 602 ; N cdotaccent ; G 205\nU 268 ; WX 602 ; N Ccaron ; G 206\nU 269 ; WX 602 ; N ccaron ; G 207\nU 270 ; WX 602 ; N Dcaron ; G 208\nU 271 ; WX 602 ; N dcaron ; G 209\nU 272 ; WX 602 ; N Dcroat ; G 210\nU 273 ; WX 602 ; N dmacron ; G 211\nU 274 ; WX 602 ; N Emacron ; G 212\nU 275 ; WX 602 ; N emacron ; G 213\nU 276 ; WX 602 ; N Ebreve ; G 214\nU 277 ; WX 602 ; N ebreve ; G 215\nU 278 ; WX 602 ; N Edotaccent ; G 216\nU 279 ; WX 602 ; N edotaccent ; G 217\nU 280 ; WX 602 ; N Eogonek ; G 218\nU 281 ; WX 602 ; N eogonek ; G 219\nU 282 ; WX 602 ; N Ecaron ; G 220\nU 283 ; WX 602 ; N ecaron ; G 221\nU 284 ; WX 602 ; N Gcircumflex ; G 222\nU 285 ; WX 602 ; N gcircumflex ; G 223\nU 286 ; WX 602 ; N Gbreve ; G 224\nU 287 ; WX 602 ; N gbreve ; G 225\nU 288 ; WX 602 ; N Gdotaccent ; G 226\nU 289 ; WX 602 ; N gdotaccent ; G 227\nU 290 ; WX 602 ; N Gcommaaccent ; G 228\nU 291 ; WX 602 ; N gcommaaccent ; G 229\nU 292 ; WX 602 ; N Hcircumflex ; G 230\nU 293 ; WX 602 ; N hcircumflex ; G 231\nU 294 ; WX 602 ; N Hbar ; G 232\nU 295 ; WX 602 ; N hbar ; G 233\nU 296 ; WX 602 ; N Itilde ; G 234\nU 297 ; WX 602 ; N itilde ; G 235\nU 298 ; WX 602 ; N Imacron ; G 236\nU 299 ; WX 602 ; N imacron ; G 237\nU 300 ; WX 602 ; N Ibreve ; G 238\nU 301 ; WX 602 ; N ibreve ; G 239\nU 302 ; WX 602 ; N Iogonek ; G 240\nU 303 ; WX 602 ; N iogonek ; G 241\nU 304 ; WX 602 ; N Idot ; G 242\nU 305 ; WX 602 ; N dotlessi ; G 243\nU 306 ; WX 602 ; N IJ ; G 244\nU 307 ; WX 602 ; N ij ; G 245\nU 308 ; WX 602 ; N Jcircumflex ; G 246\nU 309 ; WX 602 ; N jcircumflex ; G 247\nU 310 ; WX 602 ; N Kcommaaccent ; G 248\nU 311 ; WX 602 ; N kcommaaccent ; G 249\nU 312 ; WX 602 ; N kgreenlandic ; G 250\nU 313 ; WX 602 ; N Lacute ; G 251\nU 314 ; WX 602 ; N lacute ; G 252\nU 315 ; WX 602 ; N Lcommaaccent ; G 253\nU 316 ; WX 602 ; N lcommaaccent ; G 254\nU 317 ; WX 602 ; N Lcaron ; G 255\nU 318 ; WX 602 ; N lcaron ; G 256\nU 319 ; WX 602 ; N Ldot ; G 257\nU 320 ; WX 602 ; N ldot ; G 258\nU 321 ; WX 602 ; N Lslash ; G 259\nU 322 ; WX 602 ; N lslash ; G 260\nU 323 ; WX 602 ; N Nacute ; G 261\nU 324 ; WX 602 ; N nacute ; G 262\nU 325 ; WX 602 ; N Ncommaaccent ; G 263\nU 326 ; WX 602 ; N ncommaaccent ; G 264\nU 327 ; WX 602 ; N Ncaron ; G 265\nU 328 ; WX 602 ; N ncaron ; G 266\nU 329 ; WX 602 ; N napostrophe ; G 267\nU 330 ; WX 602 ; N Eng ; G 268\nU 331 ; WX 602 ; N eng ; G 269\nU 332 ; WX 602 ; N Omacron ; G 270\nU 333 ; WX 602 ; N omacron ; G 271\nU 334 ; WX 602 ; N Obreve ; G 272\nU 335 ; WX 602 ; N obreve ; G 273\nU 336 ; WX 602 ; N Ohungarumlaut ; G 274\nU 337 ; WX 602 ; N ohungarumlaut ; G 275\nU 338 ; WX 602 ; N OE ; G 276\nU 339 ; WX 602 ; N oe ; G 277\nU 340 ; WX 602 ; N Racute ; G 278\nU 341 ; WX 602 ; N racute ; G 279\nU 342 ; WX 602 ; N Rcommaaccent ; G 280\nU 343 ; WX 602 ; N rcommaaccent ; G 281\nU 344 ; WX 602 ; N Rcaron ; G 282\nU 345 ; WX 602 ; N rcaron ; G 283\nU 346 ; WX 602 ; N Sacute ; G 284\nU 347 ; WX 602 ; N sacute ; G 285\nU 348 ; WX 602 ; N Scircumflex ; G 286\nU 349 ; WX 602 ; N scircumflex ; G 287\nU 350 ; WX 602 ; N Scedilla ; G 288\nU 351 ; WX 602 ; N scedilla ; G 289\nU 352 ; WX 602 ; N Scaron ; G 290\nU 353 ; WX 602 ; N scaron ; G 291\nU 354 ; WX 602 ; N Tcommaaccent ; G 292\nU 355 ; WX 602 ; N tcommaaccent ; G 293\nU 356 ; WX 602 ; N Tcaron ; G 294\nU 357 ; WX 602 ; N tcaron ; G 295\nU 358 ; WX 602 ; N Tbar ; G 296\nU 359 ; WX 602 ; N tbar ; G 297\nU 360 ; WX 602 ; N Utilde ; G 298\nU 361 ; WX 602 ; N utilde ; G 299\nU 362 ; WX 602 ; N Umacron ; G 300\nU 363 ; WX 602 ; N umacron ; G 301\nU 364 ; WX 602 ; N Ubreve ; G 302\nU 365 ; WX 602 ; N ubreve ; G 303\nU 366 ; WX 602 ; N Uring ; G 304\nU 367 ; WX 602 ; N uring ; G 305\nU 368 ; WX 602 ; N Uhungarumlaut ; G 306\nU 369 ; WX 602 ; N uhungarumlaut ; G 307\nU 370 ; WX 602 ; N Uogonek ; G 308\nU 371 ; WX 602 ; N uogonek ; G 309\nU 372 ; WX 602 ; N Wcircumflex ; G 310\nU 373 ; WX 602 ; N wcircumflex ; G 311\nU 374 ; WX 602 ; N Ycircumflex ; G 312\nU 375 ; WX 602 ; N ycircumflex ; G 313\nU 376 ; WX 602 ; N Ydieresis ; G 314\nU 377 ; WX 602 ; N Zacute ; G 315\nU 378 ; WX 602 ; N zacute ; G 316\nU 379 ; WX 602 ; N Zdotaccent ; G 317\nU 380 ; WX 602 ; N zdotaccent ; G 318\nU 381 ; WX 602 ; N Zcaron ; G 319\nU 382 ; WX 602 ; N zcaron ; G 320\nU 383 ; WX 602 ; N longs ; G 321\nU 384 ; WX 602 ; N uni0180 ; G 322\nU 385 ; WX 602 ; N uni0181 ; G 323\nU 386 ; WX 602 ; N uni0182 ; G 324\nU 387 ; WX 602 ; N uni0183 ; G 325\nU 388 ; WX 602 ; N uni0184 ; G 326\nU 389 ; WX 602 ; N uni0185 ; G 327\nU 390 ; WX 602 ; N uni0186 ; G 328\nU 391 ; WX 602 ; N uni0187 ; G 329\nU 392 ; WX 602 ; N uni0188 ; G 330\nU 393 ; WX 602 ; N uni0189 ; G 331\nU 394 ; WX 602 ; N uni018A ; G 332\nU 395 ; WX 602 ; N uni018B ; G 333\nU 396 ; WX 602 ; N uni018C ; G 334\nU 397 ; WX 602 ; N uni018D ; G 335\nU 398 ; WX 602 ; N uni018E ; G 336\nU 399 ; WX 602 ; N uni018F ; G 337\nU 400 ; WX 602 ; N uni0190 ; G 338\nU 401 ; WX 602 ; N uni0191 ; G 339\nU 402 ; WX 602 ; N florin ; G 340\nU 403 ; WX 602 ; N uni0193 ; G 341\nU 404 ; WX 602 ; N uni0194 ; G 342\nU 405 ; WX 602 ; N uni0195 ; G 343\nU 406 ; WX 602 ; N uni0196 ; G 344\nU 407 ; WX 602 ; N uni0197 ; G 345\nU 408 ; WX 602 ; N uni0198 ; G 346\nU 409 ; WX 602 ; N uni0199 ; G 347\nU 410 ; WX 602 ; N uni019A ; G 348\nU 411 ; WX 602 ; N uni019B ; G 349\nU 412 ; WX 602 ; N uni019C ; G 350\nU 413 ; WX 602 ; N uni019D ; G 351\nU 414 ; WX 602 ; N uni019E ; G 352\nU 415 ; WX 602 ; N uni019F ; G 353\nU 416 ; WX 602 ; N Ohorn ; G 354\nU 417 ; WX 602 ; N ohorn ; G 355\nU 418 ; WX 602 ; N uni01A2 ; G 356\nU 419 ; WX 602 ; N uni01A3 ; G 357\nU 420 ; WX 602 ; N uni01A4 ; G 358\nU 421 ; WX 602 ; N uni01A5 ; G 359\nU 422 ; WX 602 ; N uni01A6 ; G 360\nU 423 ; WX 602 ; N uni01A7 ; G 361\nU 424 ; WX 602 ; N uni01A8 ; G 362\nU 425 ; WX 602 ; N uni01A9 ; G 363\nU 426 ; WX 602 ; N uni01AA ; G 364\nU 427 ; WX 602 ; N uni01AB ; G 365\nU 428 ; WX 602 ; N uni01AC ; G 366\nU 429 ; WX 602 ; N uni01AD ; G 367\nU 430 ; WX 602 ; N uni01AE ; G 368\nU 431 ; WX 602 ; N Uhorn ; G 369\nU 432 ; WX 602 ; N uhorn ; G 370\nU 433 ; WX 602 ; N uni01B1 ; G 371\nU 434 ; WX 602 ; N uni01B2 ; G 372\nU 435 ; WX 602 ; N uni01B3 ; G 373\nU 436 ; WX 602 ; N uni01B4 ; G 374\nU 437 ; WX 602 ; N uni01B5 ; G 375\nU 438 ; WX 602 ; N uni01B6 ; G 376\nU 439 ; WX 602 ; N uni01B7 ; G 377\nU 440 ; WX 602 ; N uni01B8 ; G 378\nU 441 ; WX 602 ; N uni01B9 ; G 379\nU 442 ; WX 602 ; N uni01BA ; G 380\nU 443 ; WX 602 ; N uni01BB ; G 381\nU 444 ; WX 602 ; N uni01BC ; G 382\nU 445 ; WX 602 ; N uni01BD ; G 383\nU 446 ; WX 602 ; N uni01BE ; G 384\nU 447 ; WX 602 ; N uni01BF ; G 385\nU 448 ; WX 602 ; N uni01C0 ; G 386\nU 449 ; WX 602 ; N uni01C1 ; G 387\nU 450 ; WX 602 ; N uni01C2 ; G 388\nU 451 ; WX 602 ; N uni01C3 ; G 389\nU 461 ; WX 602 ; N uni01CD ; G 390\nU 462 ; WX 602 ; N uni01CE ; G 391\nU 463 ; WX 602 ; N uni01CF ; G 392\nU 464 ; WX 602 ; N uni01D0 ; G 393\nU 465 ; WX 602 ; N uni01D1 ; G 394\nU 466 ; WX 602 ; N uni01D2 ; G 395\nU 467 ; WX 602 ; N uni01D3 ; G 396\nU 468 ; WX 602 ; N uni01D4 ; G 397\nU 469 ; WX 602 ; N uni01D5 ; G 398\nU 470 ; WX 602 ; N uni01D6 ; G 399\nU 471 ; WX 602 ; N uni01D7 ; G 400\nU 472 ; WX 602 ; N uni01D8 ; G 401\nU 473 ; WX 602 ; N uni01D9 ; G 402\nU 474 ; WX 602 ; N uni01DA ; G 403\nU 475 ; WX 602 ; N uni01DB ; G 404\nU 476 ; WX 602 ; N uni01DC ; G 405\nU 477 ; WX 602 ; N uni01DD ; G 406\nU 478 ; WX 602 ; N uni01DE ; G 407\nU 479 ; WX 602 ; N uni01DF ; G 408\nU 480 ; WX 602 ; N uni01E0 ; G 409\nU 481 ; WX 602 ; N uni01E1 ; G 410\nU 482 ; WX 602 ; N uni01E2 ; G 411\nU 483 ; WX 602 ; N uni01E3 ; G 412\nU 486 ; WX 602 ; N Gcaron ; G 413\nU 487 ; WX 602 ; N gcaron ; G 414\nU 488 ; WX 602 ; N uni01E8 ; G 415\nU 489 ; WX 602 ; N uni01E9 ; G 416\nU 490 ; WX 602 ; N uni01EA ; G 417\nU 491 ; WX 602 ; N uni01EB ; G 418\nU 492 ; WX 602 ; N uni01EC ; G 419\nU 493 ; WX 602 ; N uni01ED ; G 420\nU 494 ; WX 602 ; N uni01EE ; G 421\nU 495 ; WX 602 ; N uni01EF ; G 422\nU 500 ; WX 602 ; N uni01F4 ; G 423\nU 501 ; WX 602 ; N uni01F5 ; G 424\nU 502 ; WX 602 ; N uni01F6 ; G 425\nU 504 ; WX 602 ; N uni01F8 ; G 426\nU 505 ; WX 602 ; N uni01F9 ; G 427\nU 508 ; WX 602 ; N AEacute ; G 428\nU 509 ; WX 602 ; N aeacute ; G 429\nU 510 ; WX 602 ; N Oslashacute ; G 430\nU 511 ; WX 602 ; N oslashacute ; G 431\nU 512 ; WX 602 ; N uni0200 ; G 432\nU 513 ; WX 602 ; N uni0201 ; G 433\nU 514 ; WX 602 ; N uni0202 ; G 434\nU 515 ; WX 602 ; N uni0203 ; G 435\nU 516 ; WX 602 ; N uni0204 ; G 436\nU 517 ; WX 602 ; N uni0205 ; G 437\nU 518 ; WX 602 ; N uni0206 ; G 438\nU 519 ; WX 602 ; N uni0207 ; G 439\nU 520 ; WX 602 ; N uni0208 ; G 440\nU 521 ; WX 602 ; N uni0209 ; G 441\nU 522 ; WX 602 ; N uni020A ; G 442\nU 523 ; WX 602 ; N uni020B ; G 443\nU 524 ; WX 602 ; N uni020C ; G 444\nU 525 ; WX 602 ; N uni020D ; G 445\nU 526 ; WX 602 ; N uni020E ; G 446\nU 527 ; WX 602 ; N uni020F ; G 447\nU 528 ; WX 602 ; N uni0210 ; G 448\nU 529 ; WX 602 ; N uni0211 ; G 449\nU 530 ; WX 602 ; N uni0212 ; G 450\nU 531 ; WX 602 ; N uni0213 ; G 451\nU 532 ; WX 602 ; N uni0214 ; G 452\nU 533 ; WX 602 ; N uni0215 ; G 453\nU 534 ; WX 602 ; N uni0216 ; G 454\nU 535 ; WX 602 ; N uni0217 ; G 455\nU 536 ; WX 602 ; N Scommaaccent ; G 456\nU 537 ; WX 602 ; N scommaaccent ; G 457\nU 538 ; WX 602 ; N uni021A ; G 458\nU 539 ; WX 602 ; N uni021B ; G 459\nU 540 ; WX 602 ; N uni021C ; G 460\nU 541 ; WX 602 ; N uni021D ; G 461\nU 542 ; WX 602 ; N uni021E ; G 462\nU 543 ; WX 602 ; N uni021F ; G 463\nU 545 ; WX 602 ; N uni0221 ; G 464\nU 548 ; WX 602 ; N uni0224 ; G 465\nU 549 ; WX 602 ; N uni0225 ; G 466\nU 550 ; WX 602 ; N uni0226 ; G 467\nU 551 ; WX 602 ; N uni0227 ; G 468\nU 552 ; WX 602 ; N uni0228 ; G 469\nU 553 ; WX 602 ; N uni0229 ; G 470\nU 554 ; WX 602 ; N uni022A ; G 471\nU 555 ; WX 602 ; N uni022B ; G 472\nU 556 ; WX 602 ; N uni022C ; G 473\nU 557 ; WX 602 ; N uni022D ; G 474\nU 558 ; WX 602 ; N uni022E ; G 475\nU 559 ; WX 602 ; N uni022F ; G 476\nU 560 ; WX 602 ; N uni0230 ; G 477\nU 561 ; WX 602 ; N uni0231 ; G 478\nU 562 ; WX 602 ; N uni0232 ; G 479\nU 563 ; WX 602 ; N uni0233 ; G 480\nU 564 ; WX 602 ; N uni0234 ; G 481\nU 565 ; WX 602 ; N uni0235 ; G 482\nU 566 ; WX 602 ; N uni0236 ; G 483\nU 567 ; WX 602 ; N dotlessj ; G 484\nU 568 ; WX 602 ; N uni0238 ; G 485\nU 569 ; WX 602 ; N uni0239 ; G 486\nU 570 ; WX 602 ; N uni023A ; G 487\nU 571 ; WX 602 ; N uni023B ; G 488\nU 572 ; WX 602 ; N uni023C ; G 489\nU 573 ; WX 602 ; N uni023D ; G 490\nU 574 ; WX 602 ; N uni023E ; G 491\nU 575 ; WX 602 ; N uni023F ; G 492\nU 576 ; WX 602 ; N uni0240 ; G 493\nU 577 ; WX 602 ; N uni0241 ; G 494\nU 579 ; WX 602 ; N uni0243 ; G 495\nU 580 ; WX 602 ; N uni0244 ; G 496\nU 581 ; WX 602 ; N uni0245 ; G 497\nU 588 ; WX 602 ; N uni024C ; G 498\nU 589 ; WX 602 ; N uni024D ; G 499\nU 592 ; WX 602 ; N uni0250 ; G 500\nU 593 ; WX 602 ; N uni0251 ; G 501\nU 594 ; WX 602 ; N uni0252 ; G 502\nU 595 ; WX 602 ; N uni0253 ; G 503\nU 596 ; WX 602 ; N uni0254 ; G 504\nU 597 ; WX 602 ; N uni0255 ; G 505\nU 598 ; WX 602 ; N uni0256 ; G 506\nU 599 ; WX 602 ; N uni0257 ; G 507\nU 600 ; WX 602 ; N uni0258 ; G 508\nU 601 ; WX 602 ; N uni0259 ; G 509\nU 602 ; WX 602 ; N uni025A ; G 510\nU 603 ; WX 602 ; N uni025B ; G 511\nU 604 ; WX 602 ; N uni025C ; G 512\nU 605 ; WX 602 ; N uni025D ; G 513\nU 606 ; WX 602 ; N uni025E ; G 514\nU 607 ; WX 602 ; N uni025F ; G 515\nU 608 ; WX 602 ; N uni0260 ; G 516\nU 609 ; WX 602 ; N uni0261 ; G 517\nU 610 ; WX 602 ; N uni0262 ; G 518\nU 611 ; WX 602 ; N uni0263 ; G 519\nU 612 ; WX 602 ; N uni0264 ; G 520\nU 613 ; WX 602 ; N uni0265 ; G 521\nU 614 ; WX 602 ; N uni0266 ; G 522\nU 615 ; WX 602 ; N uni0267 ; G 523\nU 616 ; WX 602 ; N uni0268 ; G 524\nU 617 ; WX 602 ; N uni0269 ; G 525\nU 618 ; WX 602 ; N uni026A ; G 526\nU 619 ; WX 602 ; N uni026B ; G 527\nU 620 ; WX 602 ; N uni026C ; G 528\nU 621 ; WX 602 ; N uni026D ; G 529\nU 622 ; WX 602 ; N uni026E ; G 530\nU 623 ; WX 602 ; N uni026F ; G 531\nU 624 ; WX 602 ; N uni0270 ; G 532\nU 625 ; WX 602 ; N uni0271 ; G 533\nU 626 ; WX 602 ; N uni0272 ; G 534\nU 627 ; WX 602 ; N uni0273 ; G 535\nU 628 ; WX 602 ; N uni0274 ; G 536\nU 629 ; WX 602 ; N uni0275 ; G 537\nU 630 ; WX 602 ; N uni0276 ; G 538\nU 631 ; WX 602 ; N uni0277 ; G 539\nU 632 ; WX 602 ; N uni0278 ; G 540\nU 633 ; WX 602 ; N uni0279 ; G 541\nU 634 ; WX 602 ; N uni027A ; G 542\nU 635 ; WX 602 ; N uni027B ; G 543\nU 636 ; WX 602 ; N uni027C ; G 544\nU 637 ; WX 602 ; N uni027D ; G 545\nU 638 ; WX 602 ; N uni027E ; G 546\nU 639 ; WX 602 ; N uni027F ; G 547\nU 640 ; WX 602 ; N uni0280 ; G 548\nU 641 ; WX 602 ; N uni0281 ; G 549\nU 642 ; WX 602 ; N uni0282 ; G 550\nU 643 ; WX 602 ; N uni0283 ; G 551\nU 644 ; WX 602 ; N uni0284 ; G 552\nU 645 ; WX 602 ; N uni0285 ; G 553\nU 646 ; WX 602 ; N uni0286 ; G 554\nU 647 ; WX 602 ; N uni0287 ; G 555\nU 648 ; WX 602 ; N uni0288 ; G 556\nU 649 ; WX 602 ; N uni0289 ; G 557\nU 650 ; WX 602 ; N uni028A ; G 558\nU 651 ; WX 602 ; N uni028B ; G 559\nU 652 ; WX 602 ; N uni028C ; G 560\nU 653 ; WX 602 ; N uni028D ; G 561\nU 654 ; WX 602 ; N uni028E ; G 562\nU 655 ; WX 602 ; N uni028F ; G 563\nU 656 ; WX 602 ; N uni0290 ; G 564\nU 657 ; WX 602 ; N uni0291 ; G 565\nU 658 ; WX 602 ; N uni0292 ; G 566\nU 659 ; WX 602 ; N uni0293 ; G 567\nU 660 ; WX 602 ; N uni0294 ; G 568\nU 661 ; WX 602 ; N uni0295 ; G 569\nU 662 ; WX 602 ; N uni0296 ; G 570\nU 663 ; WX 602 ; N uni0297 ; G 571\nU 664 ; WX 602 ; N uni0298 ; G 572\nU 665 ; WX 602 ; N uni0299 ; G 573\nU 666 ; WX 602 ; N uni029A ; G 574\nU 667 ; WX 602 ; N uni029B ; G 575\nU 668 ; WX 602 ; N uni029C ; G 576\nU 669 ; WX 602 ; N uni029D ; G 577\nU 670 ; WX 602 ; N uni029E ; G 578\nU 671 ; WX 602 ; N uni029F ; G 579\nU 672 ; WX 602 ; N uni02A0 ; G 580\nU 673 ; WX 602 ; N uni02A1 ; G 581\nU 674 ; WX 602 ; N uni02A2 ; G 582\nU 675 ; WX 602 ; N uni02A3 ; G 583\nU 676 ; WX 602 ; N uni02A4 ; G 584\nU 677 ; WX 602 ; N uni02A5 ; G 585\nU 678 ; WX 602 ; N uni02A6 ; G 586\nU 679 ; WX 602 ; N uni02A7 ; G 587\nU 680 ; WX 602 ; N uni02A8 ; G 588\nU 681 ; WX 602 ; N uni02A9 ; G 589\nU 682 ; WX 602 ; N uni02AA ; G 590\nU 683 ; WX 602 ; N uni02AB ; G 591\nU 684 ; WX 602 ; N uni02AC ; G 592\nU 685 ; WX 602 ; N uni02AD ; G 593\nU 686 ; WX 602 ; N uni02AE ; G 594\nU 687 ; WX 602 ; N uni02AF ; G 595\nU 688 ; WX 602 ; N uni02B0 ; G 596\nU 689 ; WX 602 ; N uni02B1 ; G 597\nU 690 ; WX 602 ; N uni02B2 ; G 598\nU 691 ; WX 602 ; N uni02B3 ; G 599\nU 692 ; WX 602 ; N uni02B4 ; G 600\nU 693 ; WX 602 ; N uni02B5 ; G 601\nU 694 ; WX 602 ; N uni02B6 ; G 602\nU 695 ; WX 602 ; N uni02B7 ; G 603\nU 696 ; WX 602 ; N uni02B8 ; G 604\nU 697 ; WX 602 ; N uni02B9 ; G 605\nU 699 ; WX 602 ; N uni02BB ; G 606\nU 700 ; WX 602 ; N uni02BC ; G 607\nU 701 ; WX 602 ; N uni02BD ; G 608\nU 702 ; WX 602 ; N uni02BE ; G 609\nU 703 ; WX 602 ; N uni02BF ; G 610\nU 704 ; WX 602 ; N uni02C0 ; G 611\nU 705 ; WX 602 ; N uni02C1 ; G 612\nU 710 ; WX 602 ; N circumflex ; G 613\nU 711 ; WX 602 ; N caron ; G 614\nU 712 ; WX 602 ; N uni02C8 ; G 615\nU 713 ; WX 602 ; N uni02C9 ; G 616\nU 716 ; WX 602 ; N uni02CC ; G 617\nU 717 ; WX 602 ; N uni02CD ; G 618\nU 718 ; WX 602 ; N uni02CE ; G 619\nU 719 ; WX 602 ; N uni02CF ; G 620\nU 720 ; WX 602 ; N uni02D0 ; G 621\nU 721 ; WX 602 ; N uni02D1 ; G 622\nU 722 ; WX 602 ; N uni02D2 ; G 623\nU 723 ; WX 602 ; N uni02D3 ; G 624\nU 726 ; WX 602 ; N uni02D6 ; G 625\nU 727 ; WX 602 ; N uni02D7 ; G 626\nU 728 ; WX 602 ; N breve ; G 627\nU 729 ; WX 602 ; N dotaccent ; G 628\nU 730 ; WX 602 ; N ring ; G 629\nU 731 ; WX 602 ; N ogonek ; G 630\nU 732 ; WX 602 ; N tilde ; G 631\nU 733 ; WX 602 ; N hungarumlaut ; G 632\nU 734 ; WX 602 ; N uni02DE ; G 633\nU 736 ; WX 602 ; N uni02E0 ; G 634\nU 737 ; WX 602 ; N uni02E1 ; G 635\nU 738 ; WX 602 ; N uni02E2 ; G 636\nU 739 ; WX 602 ; N uni02E3 ; G 637\nU 740 ; WX 602 ; N uni02E4 ; G 638\nU 741 ; WX 602 ; N uni02E5 ; G 639\nU 742 ; WX 602 ; N uni02E6 ; G 640\nU 743 ; WX 602 ; N uni02E7 ; G 641\nU 744 ; WX 602 ; N uni02E8 ; G 642\nU 745 ; WX 602 ; N uni02E9 ; G 643\nU 750 ; WX 602 ; N uni02EE ; G 644\nU 755 ; WX 602 ; N uni02F3 ; G 645\nU 768 ; WX 602 ; N gravecomb ; G 646\nU 769 ; WX 602 ; N acutecomb ; G 647\nU 770 ; WX 602 ; N uni0302 ; G 648\nU 771 ; WX 602 ; N tildecomb ; G 649\nU 772 ; WX 602 ; N uni0304 ; G 650\nU 773 ; WX 602 ; N uni0305 ; G 651\nU 774 ; WX 602 ; N uni0306 ; G 652\nU 775 ; WX 602 ; N uni0307 ; G 653\nU 776 ; WX 602 ; N uni0308 ; G 654\nU 777 ; WX 602 ; N hookabovecomb ; G 655\nU 778 ; WX 602 ; N uni030A ; G 656\nU 779 ; WX 602 ; N uni030B ; G 657\nU 780 ; WX 602 ; N uni030C ; G 658\nU 781 ; WX 602 ; N uni030D ; G 659\nU 782 ; WX 602 ; N uni030E ; G 660\nU 783 ; WX 602 ; N uni030F ; G 661\nU 784 ; WX 602 ; N uni0310 ; G 662\nU 785 ; WX 602 ; N uni0311 ; G 663\nU 786 ; WX 602 ; N uni0312 ; G 664\nU 787 ; WX 602 ; N uni0313 ; G 665\nU 788 ; WX 602 ; N uni0314 ; G 666\nU 789 ; WX 602 ; N uni0315 ; G 667\nU 790 ; WX 602 ; N uni0316 ; G 668\nU 791 ; WX 602 ; N uni0317 ; G 669\nU 792 ; WX 602 ; N uni0318 ; G 670\nU 793 ; WX 602 ; N uni0319 ; G 671\nU 794 ; WX 602 ; N uni031A ; G 672\nU 795 ; WX 602 ; N uni031B ; G 673\nU 796 ; WX 602 ; N uni031C ; G 674\nU 797 ; WX 602 ; N uni031D ; G 675\nU 798 ; WX 602 ; N uni031E ; G 676\nU 799 ; WX 602 ; N uni031F ; G 677\nU 800 ; WX 602 ; N uni0320 ; G 678\nU 801 ; WX 602 ; N uni0321 ; G 679\nU 802 ; WX 602 ; N uni0322 ; G 680\nU 803 ; WX 602 ; N dotbelowcomb ; G 681\nU 804 ; WX 602 ; N uni0324 ; G 682\nU 805 ; WX 602 ; N uni0325 ; G 683\nU 806 ; WX 602 ; N uni0326 ; G 684\nU 807 ; WX 602 ; N uni0327 ; G 685\nU 808 ; WX 602 ; N uni0328 ; G 686\nU 809 ; WX 602 ; N uni0329 ; G 687\nU 810 ; WX 602 ; N uni032A ; G 688\nU 811 ; WX 602 ; N uni032B ; G 689\nU 812 ; WX 602 ; N uni032C ; G 690\nU 813 ; WX 602 ; N uni032D ; G 691\nU 814 ; WX 602 ; N uni032E ; G 692\nU 815 ; WX 602 ; N uni032F ; G 693\nU 816 ; WX 602 ; N uni0330 ; G 694\nU 817 ; WX 602 ; N uni0331 ; G 695\nU 818 ; WX 602 ; N uni0332 ; G 696\nU 819 ; WX 602 ; N uni0333 ; G 697\nU 820 ; WX 602 ; N uni0334 ; G 698\nU 821 ; WX 602 ; N uni0335 ; G 699\nU 822 ; WX 602 ; N uni0336 ; G 700\nU 823 ; WX 602 ; N uni0337 ; G 701\nU 824 ; WX 602 ; N uni0338 ; G 702\nU 825 ; WX 602 ; N uni0339 ; G 703\nU 826 ; WX 602 ; N uni033A ; G 704\nU 827 ; WX 602 ; N uni033B ; G 705\nU 828 ; WX 602 ; N uni033C ; G 706\nU 829 ; WX 602 ; N uni033D ; G 707\nU 830 ; WX 602 ; N uni033E ; G 708\nU 831 ; WX 602 ; N uni033F ; G 709\nU 835 ; WX 602 ; N uni0343 ; G 710\nU 856 ; WX 602 ; N uni0358 ; G 711\nU 865 ; WX 602 ; N uni0361 ; G 712\nU 884 ; WX 602 ; N uni0374 ; G 713\nU 885 ; WX 602 ; N uni0375 ; G 714\nU 886 ; WX 602 ; N uni0376 ; G 715\nU 887 ; WX 602 ; N uni0377 ; G 716\nU 890 ; WX 602 ; N uni037A ; G 717\nU 891 ; WX 602 ; N uni037B ; G 718\nU 892 ; WX 602 ; N uni037C ; G 719\nU 893 ; WX 602 ; N uni037D ; G 720\nU 894 ; WX 602 ; N uni037E ; G 721\nU 895 ; WX 602 ; N uni037F ; G 722\nU 900 ; WX 602 ; N tonos ; G 723\nU 901 ; WX 602 ; N dieresistonos ; G 724\nU 902 ; WX 602 ; N Alphatonos ; G 725\nU 903 ; WX 602 ; N anoteleia ; G 726\nU 904 ; WX 602 ; N Epsilontonos ; G 727\nU 905 ; WX 602 ; N Etatonos ; G 728\nU 906 ; WX 602 ; N Iotatonos ; G 729\nU 908 ; WX 602 ; N Omicrontonos ; G 730\nU 910 ; WX 602 ; N Upsilontonos ; G 731\nU 911 ; WX 602 ; N Omegatonos ; G 732\nU 912 ; WX 602 ; N iotadieresistonos ; G 733\nU 913 ; WX 602 ; N Alpha ; G 734\nU 914 ; WX 602 ; N Beta ; G 735\nU 915 ; WX 602 ; N Gamma ; G 736\nU 916 ; WX 602 ; N uni0394 ; G 737\nU 917 ; WX 602 ; N Epsilon ; G 738\nU 918 ; WX 602 ; N Zeta ; G 739\nU 919 ; WX 602 ; N Eta ; G 740\nU 920 ; WX 602 ; N Theta ; G 741\nU 921 ; WX 602 ; N Iota ; G 742\nU 922 ; WX 602 ; N Kappa ; G 743\nU 923 ; WX 602 ; N Lambda ; G 744\nU 924 ; WX 602 ; N Mu ; G 745\nU 925 ; WX 602 ; N Nu ; G 746\nU 926 ; WX 602 ; N Xi ; G 747\nU 927 ; WX 602 ; N Omicron ; G 748\nU 928 ; WX 602 ; N Pi ; G 749\nU 929 ; WX 602 ; N Rho ; G 750\nU 931 ; WX 602 ; N Sigma ; G 751\nU 932 ; WX 602 ; N Tau ; G 752\nU 933 ; WX 602 ; N Upsilon ; G 753\nU 934 ; WX 602 ; N Phi ; G 754\nU 935 ; WX 602 ; N Chi ; G 755\nU 936 ; WX 602 ; N Psi ; G 756\nU 937 ; WX 602 ; N Omega ; G 757\nU 938 ; WX 602 ; N Iotadieresis ; G 758\nU 939 ; WX 602 ; N Upsilondieresis ; G 759\nU 940 ; WX 602 ; N alphatonos ; G 760\nU 941 ; WX 602 ; N epsilontonos ; G 761\nU 942 ; WX 602 ; N etatonos ; G 762\nU 943 ; WX 602 ; N iotatonos ; G 763\nU 944 ; WX 602 ; N upsilondieresistonos ; G 764\nU 945 ; WX 602 ; N alpha ; G 765\nU 946 ; WX 602 ; N beta ; G 766\nU 947 ; WX 602 ; N gamma ; G 767\nU 948 ; WX 602 ; N delta ; G 768\nU 949 ; WX 602 ; N epsilon ; G 769\nU 950 ; WX 602 ; N zeta ; G 770\nU 951 ; WX 602 ; N eta ; G 771\nU 952 ; WX 602 ; N theta ; G 772\nU 953 ; WX 602 ; N iota ; G 773\nU 954 ; WX 602 ; N kappa ; G 774\nU 955 ; WX 602 ; N lambda ; G 775\nU 956 ; WX 602 ; N uni03BC ; G 776\nU 957 ; WX 602 ; N nu ; G 777\nU 958 ; WX 602 ; N xi ; G 778\nU 959 ; WX 602 ; N omicron ; G 779\nU 960 ; WX 602 ; N pi ; G 780\nU 961 ; WX 602 ; N rho ; G 781\nU 962 ; WX 602 ; N sigma1 ; G 782\nU 963 ; WX 602 ; N sigma ; G 783\nU 964 ; WX 602 ; N tau ; G 784\nU 965 ; WX 602 ; N upsilon ; G 785\nU 966 ; WX 602 ; N phi ; G 786\nU 967 ; WX 602 ; N chi ; G 787\nU 968 ; WX 602 ; N psi ; G 788\nU 969 ; WX 602 ; N omega ; G 789\nU 970 ; WX 602 ; N iotadieresis ; G 790\nU 971 ; WX 602 ; N upsilondieresis ; G 791\nU 972 ; WX 602 ; N omicrontonos ; G 792\nU 973 ; WX 602 ; N upsilontonos ; G 793\nU 974 ; WX 602 ; N omegatonos ; G 794\nU 976 ; WX 602 ; N uni03D0 ; G 795\nU 977 ; WX 602 ; N theta1 ; G 796\nU 978 ; WX 602 ; N Upsilon1 ; G 797\nU 979 ; WX 602 ; N uni03D3 ; G 798\nU 980 ; WX 602 ; N uni03D4 ; G 799\nU 981 ; WX 602 ; N phi1 ; G 800\nU 982 ; WX 602 ; N omega1 ; G 801\nU 983 ; WX 602 ; N uni03D7 ; G 802\nU 984 ; WX 602 ; N uni03D8 ; G 803\nU 985 ; WX 602 ; N uni03D9 ; G 804\nU 986 ; WX 602 ; N uni03DA ; G 805\nU 987 ; WX 602 ; N uni03DB ; G 806\nU 988 ; WX 602 ; N uni03DC ; G 807\nU 989 ; WX 602 ; N uni03DD ; G 808\nU 990 ; WX 602 ; N uni03DE ; G 809\nU 991 ; WX 602 ; N uni03DF ; G 810\nU 992 ; WX 602 ; N uni03E0 ; G 811\nU 993 ; WX 602 ; N uni03E1 ; G 812\nU 1008 ; WX 602 ; N uni03F0 ; G 813\nU 1009 ; WX 602 ; N uni03F1 ; G 814\nU 1010 ; WX 602 ; N uni03F2 ; G 815\nU 1011 ; WX 602 ; N uni03F3 ; G 816\nU 1012 ; WX 602 ; N uni03F4 ; G 817\nU 1013 ; WX 602 ; N uni03F5 ; G 818\nU 1014 ; WX 602 ; N uni03F6 ; G 819\nU 1015 ; WX 602 ; N uni03F7 ; G 820\nU 1016 ; WX 602 ; N uni03F8 ; G 821\nU 1017 ; WX 602 ; N uni03F9 ; G 822\nU 1018 ; WX 602 ; N uni03FA ; G 823\nU 1019 ; WX 602 ; N uni03FB ; G 824\nU 1020 ; WX 602 ; N uni03FC ; G 825\nU 1021 ; WX 602 ; N uni03FD ; G 826\nU 1022 ; WX 602 ; N uni03FE ; G 827\nU 1023 ; WX 602 ; N uni03FF ; G 828\nU 1024 ; WX 602 ; N uni0400 ; G 829\nU 1025 ; WX 602 ; N uni0401 ; G 830\nU 1026 ; WX 602 ; N uni0402 ; G 831\nU 1027 ; WX 602 ; N uni0403 ; G 832\nU 1028 ; WX 602 ; N uni0404 ; G 833\nU 1029 ; WX 602 ; N uni0405 ; G 834\nU 1030 ; WX 602 ; N uni0406 ; G 835\nU 1031 ; WX 602 ; N uni0407 ; G 836\nU 1032 ; WX 602 ; N uni0408 ; G 837\nU 1033 ; WX 602 ; N uni0409 ; G 838\nU 1034 ; WX 602 ; N uni040A ; G 839\nU 1035 ; WX 602 ; N uni040B ; G 840\nU 1036 ; WX 602 ; N uni040C ; G 841\nU 1037 ; WX 602 ; N uni040D ; G 842\nU 1038 ; WX 602 ; N uni040E ; G 843\nU 1039 ; WX 602 ; N uni040F ; G 844\nU 1040 ; WX 602 ; N uni0410 ; G 845\nU 1041 ; WX 602 ; N uni0411 ; G 846\nU 1042 ; WX 602 ; N uni0412 ; G 847\nU 1043 ; WX 602 ; N uni0413 ; G 848\nU 1044 ; WX 602 ; N uni0414 ; G 849\nU 1045 ; WX 602 ; N uni0415 ; G 850\nU 1046 ; WX 602 ; N uni0416 ; G 851\nU 1047 ; WX 602 ; N uni0417 ; G 852\nU 1048 ; WX 602 ; N uni0418 ; G 853\nU 1049 ; WX 602 ; N uni0419 ; G 854\nU 1050 ; WX 602 ; N uni041A ; G 855\nU 1051 ; WX 602 ; N uni041B ; G 856\nU 1052 ; WX 602 ; N uni041C ; G 857\nU 1053 ; WX 602 ; N uni041D ; G 858\nU 1054 ; WX 602 ; N uni041E ; G 859\nU 1055 ; WX 602 ; N uni041F ; G 860\nU 1056 ; WX 602 ; N uni0420 ; G 861\nU 1057 ; WX 602 ; N uni0421 ; G 862\nU 1058 ; WX 602 ; N uni0422 ; G 863\nU 1059 ; WX 602 ; N uni0423 ; G 864\nU 1060 ; WX 602 ; N uni0424 ; G 865\nU 1061 ; WX 602 ; N uni0425 ; G 866\nU 1062 ; WX 602 ; N uni0426 ; G 867\nU 1063 ; WX 602 ; N uni0427 ; G 868\nU 1064 ; WX 602 ; N uni0428 ; G 869\nU 1065 ; WX 602 ; N uni0429 ; G 870\nU 1066 ; WX 602 ; N uni042A ; G 871\nU 1067 ; WX 602 ; N uni042B ; G 872\nU 1068 ; WX 602 ; N uni042C ; G 873\nU 1069 ; WX 602 ; N uni042D ; G 874\nU 1070 ; WX 602 ; N uni042E ; G 875\nU 1071 ; WX 602 ; N uni042F ; G 876\nU 1072 ; WX 602 ; N uni0430 ; G 877\nU 1073 ; WX 602 ; N uni0431 ; G 878\nU 1074 ; WX 602 ; N uni0432 ; G 879\nU 1075 ; WX 602 ; N uni0433 ; G 880\nU 1076 ; WX 602 ; N uni0434 ; G 881\nU 1077 ; WX 602 ; N uni0435 ; G 882\nU 1078 ; WX 602 ; N uni0436 ; G 883\nU 1079 ; WX 602 ; N uni0437 ; G 884\nU 1080 ; WX 602 ; N uni0438 ; G 885\nU 1081 ; WX 602 ; N uni0439 ; G 886\nU 1082 ; WX 602 ; N uni043A ; G 887\nU 1083 ; WX 602 ; N uni043B ; G 888\nU 1084 ; WX 602 ; N uni043C ; G 889\nU 1085 ; WX 602 ; N uni043D ; G 890\nU 1086 ; WX 602 ; N uni043E ; G 891\nU 1087 ; WX 602 ; N uni043F ; G 892\nU 1088 ; WX 602 ; N uni0440 ; G 893\nU 1089 ; WX 602 ; N uni0441 ; G 894\nU 1090 ; WX 602 ; N uni0442 ; G 895\nU 1091 ; WX 602 ; N uni0443 ; G 896\nU 1092 ; WX 602 ; N uni0444 ; G 897\nU 1093 ; WX 602 ; N uni0445 ; G 898\nU 1094 ; WX 602 ; N uni0446 ; G 899\nU 1095 ; WX 602 ; N uni0447 ; G 900\nU 1096 ; WX 602 ; N uni0448 ; G 901\nU 1097 ; WX 602 ; N uni0449 ; G 902\nU 1098 ; WX 602 ; N uni044A ; G 903\nU 1099 ; WX 602 ; N uni044B ; G 904\nU 1100 ; WX 602 ; N uni044C ; G 905\nU 1101 ; WX 602 ; N uni044D ; G 906\nU 1102 ; WX 602 ; N uni044E ; G 907\nU 1103 ; WX 602 ; N uni044F ; G 908\nU 1104 ; WX 602 ; N uni0450 ; G 909\nU 1105 ; WX 602 ; N uni0451 ; G 910\nU 1106 ; WX 602 ; N uni0452 ; G 911\nU 1107 ; WX 602 ; N uni0453 ; G 912\nU 1108 ; WX 602 ; N uni0454 ; G 913\nU 1109 ; WX 602 ; N uni0455 ; G 914\nU 1110 ; WX 602 ; N uni0456 ; G 915\nU 1111 ; WX 602 ; N uni0457 ; G 916\nU 1112 ; WX 602 ; N uni0458 ; G 917\nU 1113 ; WX 602 ; N uni0459 ; G 918\nU 1114 ; WX 602 ; N uni045A ; G 919\nU 1115 ; WX 602 ; N uni045B ; G 920\nU 1116 ; WX 602 ; N uni045C ; G 921\nU 1117 ; WX 602 ; N uni045D ; G 922\nU 1118 ; WX 602 ; N uni045E ; G 923\nU 1119 ; WX 602 ; N uni045F ; G 924\nU 1122 ; WX 602 ; N uni0462 ; G 925\nU 1123 ; WX 602 ; N uni0463 ; G 926\nU 1138 ; WX 602 ; N uni0472 ; G 927\nU 1139 ; WX 602 ; N uni0473 ; G 928\nU 1168 ; WX 602 ; N uni0490 ; G 929\nU 1169 ; WX 602 ; N uni0491 ; G 930\nU 1170 ; WX 602 ; N uni0492 ; G 931\nU 1171 ; WX 602 ; N uni0493 ; G 932\nU 1172 ; WX 602 ; N uni0494 ; G 933\nU 1173 ; WX 602 ; N uni0495 ; G 934\nU 1174 ; WX 602 ; N uni0496 ; G 935\nU 1175 ; WX 602 ; N uni0497 ; G 936\nU 1176 ; WX 602 ; N uni0498 ; G 937\nU 1177 ; WX 602 ; N uni0499 ; G 938\nU 1178 ; WX 602 ; N uni049A ; G 939\nU 1179 ; WX 602 ; N uni049B ; G 940\nU 1186 ; WX 602 ; N uni04A2 ; G 941\nU 1187 ; WX 602 ; N uni04A3 ; G 942\nU 1188 ; WX 602 ; N uni04A4 ; G 943\nU 1189 ; WX 602 ; N uni04A5 ; G 944\nU 1194 ; WX 602 ; N uni04AA ; G 945\nU 1195 ; WX 602 ; N uni04AB ; G 946\nU 1196 ; WX 602 ; N uni04AC ; G 947\nU 1197 ; WX 602 ; N uni04AD ; G 948\nU 1198 ; WX 602 ; N uni04AE ; G 949\nU 1199 ; WX 602 ; N uni04AF ; G 950\nU 1200 ; WX 602 ; N uni04B0 ; G 951\nU 1201 ; WX 602 ; N uni04B1 ; G 952\nU 1202 ; WX 602 ; N uni04B2 ; G 953\nU 1203 ; WX 602 ; N uni04B3 ; G 954\nU 1210 ; WX 602 ; N uni04BA ; G 955\nU 1211 ; WX 602 ; N uni04BB ; G 956\nU 1216 ; WX 602 ; N uni04C0 ; G 957\nU 1217 ; WX 602 ; N uni04C1 ; G 958\nU 1218 ; WX 602 ; N uni04C2 ; G 959\nU 1219 ; WX 602 ; N uni04C3 ; G 960\nU 1220 ; WX 602 ; N uni04C4 ; G 961\nU 1223 ; WX 602 ; N uni04C7 ; G 962\nU 1224 ; WX 602 ; N uni04C8 ; G 963\nU 1227 ; WX 602 ; N uni04CB ; G 964\nU 1228 ; WX 602 ; N uni04CC ; G 965\nU 1231 ; WX 602 ; N uni04CF ; G 966\nU 1232 ; WX 602 ; N uni04D0 ; G 967\nU 1233 ; WX 602 ; N uni04D1 ; G 968\nU 1234 ; WX 602 ; N uni04D2 ; G 969\nU 1235 ; WX 602 ; N uni04D3 ; G 970\nU 1236 ; WX 602 ; N uni04D4 ; G 971\nU 1237 ; WX 602 ; N uni04D5 ; G 972\nU 1238 ; WX 602 ; N uni04D6 ; G 973\nU 1239 ; WX 602 ; N uni04D7 ; G 974\nU 1240 ; WX 602 ; N uni04D8 ; G 975\nU 1241 ; WX 602 ; N uni04D9 ; G 976\nU 1242 ; WX 602 ; N uni04DA ; G 977\nU 1243 ; WX 602 ; N uni04DB ; G 978\nU 1244 ; WX 602 ; N uni04DC ; G 979\nU 1245 ; WX 602 ; N uni04DD ; G 980\nU 1246 ; WX 602 ; N uni04DE ; G 981\nU 1247 ; WX 602 ; N uni04DF ; G 982\nU 1248 ; WX 602 ; N uni04E0 ; G 983\nU 1249 ; WX 602 ; N uni04E1 ; G 984\nU 1250 ; WX 602 ; N uni04E2 ; G 985\nU 1251 ; WX 602 ; N uni04E3 ; G 986\nU 1252 ; WX 602 ; N uni04E4 ; G 987\nU 1253 ; WX 602 ; N uni04E5 ; G 988\nU 1254 ; WX 602 ; N uni04E6 ; G 989\nU 1255 ; WX 602 ; N uni04E7 ; G 990\nU 1256 ; WX 602 ; N uni04E8 ; G 991\nU 1257 ; WX 602 ; N uni04E9 ; G 992\nU 1258 ; WX 602 ; N uni04EA ; G 993\nU 1259 ; WX 602 ; N uni04EB ; G 994\nU 1260 ; WX 602 ; N uni04EC ; G 995\nU 1261 ; WX 602 ; N uni04ED ; G 996\nU 1262 ; WX 602 ; N uni04EE ; G 997\nU 1263 ; WX 602 ; N uni04EF ; G 998\nU 1264 ; WX 602 ; N uni04F0 ; G 999\nU 1265 ; WX 602 ; N uni04F1 ; G 1000\nU 1266 ; WX 602 ; N uni04F2 ; G 1001\nU 1267 ; WX 602 ; N uni04F3 ; G 1002\nU 1268 ; WX 602 ; N uni04F4 ; G 1003\nU 1269 ; WX 602 ; N uni04F5 ; G 1004\nU 1270 ; WX 602 ; N uni04F6 ; G 1005\nU 1271 ; WX 602 ; N uni04F7 ; G 1006\nU 1272 ; WX 602 ; N uni04F8 ; G 1007\nU 1273 ; WX 602 ; N uni04F9 ; G 1008\nU 1296 ; WX 602 ; N uni0510 ; G 1009\nU 1297 ; WX 602 ; N uni0511 ; G 1010\nU 1306 ; WX 602 ; N uni051A ; G 1011\nU 1307 ; WX 602 ; N uni051B ; G 1012\nU 1308 ; WX 602 ; N uni051C ; G 1013\nU 1309 ; WX 602 ; N uni051D ; G 1014\nU 1329 ; WX 602 ; N uni0531 ; G 1015\nU 1330 ; WX 602 ; N uni0532 ; G 1016\nU 1331 ; WX 602 ; N uni0533 ; G 1017\nU 1332 ; WX 602 ; N uni0534 ; G 1018\nU 1333 ; WX 602 ; N uni0535 ; G 1019\nU 1334 ; WX 602 ; N uni0536 ; G 1020\nU 1335 ; WX 602 ; N uni0537 ; G 1021\nU 1336 ; WX 602 ; N uni0538 ; G 1022\nU 1337 ; WX 602 ; N uni0539 ; G 1023\nU 1338 ; WX 602 ; N uni053A ; G 1024\nU 1339 ; WX 602 ; N uni053B ; G 1025\nU 1340 ; WX 602 ; N uni053C ; G 1026\nU 1341 ; WX 602 ; N uni053D ; G 1027\nU 1342 ; WX 602 ; N uni053E ; G 1028\nU 1343 ; WX 602 ; N uni053F ; G 1029\nU 1344 ; WX 602 ; N uni0540 ; G 1030\nU 1345 ; WX 602 ; N uni0541 ; G 1031\nU 1346 ; WX 602 ; N uni0542 ; G 1032\nU 1347 ; WX 602 ; N uni0543 ; G 1033\nU 1348 ; WX 602 ; N uni0544 ; G 1034\nU 1349 ; WX 602 ; N uni0545 ; G 1035\nU 1350 ; WX 602 ; N uni0546 ; G 1036\nU 1351 ; WX 602 ; N uni0547 ; G 1037\nU 1352 ; WX 602 ; N uni0548 ; G 1038\nU 1353 ; WX 602 ; N uni0549 ; G 1039\nU 1354 ; WX 602 ; N uni054A ; G 1040\nU 1355 ; WX 602 ; N uni054B ; G 1041\nU 1356 ; WX 602 ; N uni054C ; G 1042\nU 1357 ; WX 602 ; N uni054D ; G 1043\nU 1358 ; WX 602 ; N uni054E ; G 1044\nU 1359 ; WX 602 ; N uni054F ; G 1045\nU 1360 ; WX 602 ; N uni0550 ; G 1046\nU 1361 ; WX 602 ; N uni0551 ; G 1047\nU 1362 ; WX 602 ; N uni0552 ; G 1048\nU 1363 ; WX 602 ; N uni0553 ; G 1049\nU 1364 ; WX 602 ; N uni0554 ; G 1050\nU 1365 ; WX 602 ; N uni0555 ; G 1051\nU 1366 ; WX 602 ; N uni0556 ; G 1052\nU 1369 ; WX 602 ; N uni0559 ; G 1053\nU 1370 ; WX 602 ; N uni055A ; G 1054\nU 1371 ; WX 602 ; N uni055B ; G 1055\nU 1372 ; WX 602 ; N uni055C ; G 1056\nU 1373 ; WX 602 ; N uni055D ; G 1057\nU 1374 ; WX 602 ; N uni055E ; G 1058\nU 1375 ; WX 602 ; N uni055F ; G 1059\nU 1377 ; WX 602 ; N uni0561 ; G 1060\nU 1378 ; WX 602 ; N uni0562 ; G 1061\nU 1379 ; WX 602 ; N uni0563 ; G 1062\nU 1380 ; WX 602 ; N uni0564 ; G 1063\nU 1381 ; WX 602 ; N uni0565 ; G 1064\nU 1382 ; WX 602 ; N uni0566 ; G 1065\nU 1383 ; WX 602 ; N uni0567 ; G 1066\nU 1384 ; WX 602 ; N uni0568 ; G 1067\nU 1385 ; WX 602 ; N uni0569 ; G 1068\nU 1386 ; WX 602 ; N uni056A ; G 1069\nU 1387 ; WX 602 ; N uni056B ; G 1070\nU 1388 ; WX 602 ; N uni056C ; G 1071\nU 1389 ; WX 602 ; N uni056D ; G 1072\nU 1390 ; WX 602 ; N uni056E ; G 1073\nU 1391 ; WX 602 ; N uni056F ; G 1074\nU 1392 ; WX 602 ; N uni0570 ; G 1075\nU 1393 ; WX 602 ; N uni0571 ; G 1076\nU 1394 ; WX 602 ; N uni0572 ; G 1077\nU 1395 ; WX 602 ; N uni0573 ; G 1078\nU 1396 ; WX 602 ; N uni0574 ; G 1079\nU 1397 ; WX 602 ; N uni0575 ; G 1080\nU 1398 ; WX 602 ; N uni0576 ; G 1081\nU 1399 ; WX 602 ; N uni0577 ; G 1082\nU 1400 ; WX 602 ; N uni0578 ; G 1083\nU 1401 ; WX 602 ; N uni0579 ; G 1084\nU 1402 ; WX 602 ; N uni057A ; G 1085\nU 1403 ; WX 602 ; N uni057B ; G 1086\nU 1404 ; WX 602 ; N uni057C ; G 1087\nU 1405 ; WX 602 ; N uni057D ; G 1088\nU 1406 ; WX 602 ; N uni057E ; G 1089\nU 1407 ; WX 602 ; N uni057F ; G 1090\nU 1408 ; WX 602 ; N uni0580 ; G 1091\nU 1409 ; WX 602 ; N uni0581 ; G 1092\nU 1410 ; WX 602 ; N uni0582 ; G 1093\nU 1411 ; WX 602 ; N uni0583 ; G 1094\nU 1412 ; WX 602 ; N uni0584 ; G 1095\nU 1413 ; WX 602 ; N uni0585 ; G 1096\nU 1414 ; WX 602 ; N uni0586 ; G 1097\nU 1415 ; WX 602 ; N uni0587 ; G 1098\nU 1417 ; WX 602 ; N uni0589 ; G 1099\nU 1418 ; WX 602 ; N uni058A ; G 1100\nU 3647 ; WX 602 ; N uni0E3F ; G 1101\nU 3713 ; WX 602 ; N uni0E81 ; G 1102\nU 3714 ; WX 602 ; N uni0E82 ; G 1103\nU 3716 ; WX 602 ; N uni0E84 ; G 1104\nU 3719 ; WX 602 ; N uni0E87 ; G 1105\nU 3720 ; WX 602 ; N uni0E88 ; G 1106\nU 3722 ; WX 602 ; N uni0E8A ; G 1107\nU 3725 ; WX 602 ; N uni0E8D ; G 1108\nU 3732 ; WX 602 ; N uni0E94 ; G 1109\nU 3733 ; WX 602 ; N uni0E95 ; G 1110\nU 3734 ; WX 602 ; N uni0E96 ; G 1111\nU 3735 ; WX 602 ; N uni0E97 ; G 1112\nU 3737 ; WX 602 ; N uni0E99 ; G 1113\nU 3738 ; WX 602 ; N uni0E9A ; G 1114\nU 3739 ; WX 602 ; N uni0E9B ; G 1115\nU 3740 ; WX 602 ; N uni0E9C ; G 1116\nU 3741 ; WX 602 ; N uni0E9D ; G 1117\nU 3742 ; WX 602 ; N uni0E9E ; G 1118\nU 3743 ; WX 602 ; N uni0E9F ; G 1119\nU 3745 ; WX 602 ; N uni0EA1 ; G 1120\nU 3746 ; WX 602 ; N uni0EA2 ; G 1121\nU 3747 ; WX 602 ; N uni0EA3 ; G 1122\nU 3749 ; WX 602 ; N uni0EA5 ; G 1123\nU 3751 ; WX 602 ; N uni0EA7 ; G 1124\nU 3754 ; WX 602 ; N uni0EAA ; G 1125\nU 3755 ; WX 602 ; N uni0EAB ; G 1126\nU 3757 ; WX 602 ; N uni0EAD ; G 1127\nU 3758 ; WX 602 ; N uni0EAE ; G 1128\nU 3759 ; WX 602 ; N uni0EAF ; G 1129\nU 3760 ; WX 602 ; N uni0EB0 ; G 1130\nU 3761 ; WX 602 ; N uni0EB1 ; G 1131\nU 3762 ; WX 602 ; N uni0EB2 ; G 1132\nU 3763 ; WX 602 ; N uni0EB3 ; G 1133\nU 3764 ; WX 602 ; N uni0EB4 ; G 1134\nU 3765 ; WX 602 ; N uni0EB5 ; G 1135\nU 3766 ; WX 602 ; N uni0EB6 ; G 1136\nU 3767 ; WX 602 ; N uni0EB7 ; G 1137\nU 3768 ; WX 602 ; N uni0EB8 ; G 1138\nU 3769 ; WX 602 ; N uni0EB9 ; G 1139\nU 3771 ; WX 602 ; N uni0EBB ; G 1140\nU 3772 ; WX 602 ; N uni0EBC ; G 1141\nU 3784 ; WX 602 ; N uni0EC8 ; G 1142\nU 3785 ; WX 602 ; N uni0EC9 ; G 1143\nU 3786 ; WX 602 ; N uni0ECA ; G 1144\nU 3787 ; WX 602 ; N uni0ECB ; G 1145\nU 3788 ; WX 602 ; N uni0ECC ; G 1146\nU 3789 ; WX 602 ; N uni0ECD ; G 1147\nU 4304 ; WX 602 ; N uni10D0 ; G 1148\nU 4305 ; WX 602 ; N uni10D1 ; G 1149\nU 4306 ; WX 602 ; N uni10D2 ; G 1150\nU 4307 ; WX 602 ; N uni10D3 ; G 1151\nU 4308 ; WX 602 ; N uni10D4 ; G 1152\nU 4309 ; WX 602 ; N uni10D5 ; G 1153\nU 4310 ; WX 602 ; N uni10D6 ; G 1154\nU 4311 ; WX 602 ; N uni10D7 ; G 1155\nU 4312 ; WX 602 ; N uni10D8 ; G 1156\nU 4313 ; WX 602 ; N uni10D9 ; G 1157\nU 4314 ; WX 602 ; N uni10DA ; G 1158\nU 4315 ; WX 602 ; N uni10DB ; G 1159\nU 4316 ; WX 602 ; N uni10DC ; G 1160\nU 4317 ; WX 602 ; N uni10DD ; G 1161\nU 4318 ; WX 602 ; N uni10DE ; G 1162\nU 4319 ; WX 602 ; N uni10DF ; G 1163\nU 4320 ; WX 602 ; N uni10E0 ; G 1164\nU 4321 ; WX 602 ; N uni10E1 ; G 1165\nU 4322 ; WX 602 ; N uni10E2 ; G 1166\nU 4323 ; WX 602 ; N uni10E3 ; G 1167\nU 4324 ; WX 602 ; N uni10E4 ; G 1168\nU 4325 ; WX 602 ; N uni10E5 ; G 1169\nU 4326 ; WX 602 ; N uni10E6 ; G 1170\nU 4327 ; WX 602 ; N uni10E7 ; G 1171\nU 4328 ; WX 602 ; N uni10E8 ; G 1172\nU 4329 ; WX 602 ; N uni10E9 ; G 1173\nU 4330 ; WX 602 ; N uni10EA ; G 1174\nU 4331 ; WX 602 ; N uni10EB ; G 1175\nU 4332 ; WX 602 ; N uni10EC ; G 1176\nU 4333 ; WX 602 ; N uni10ED ; G 1177\nU 4334 ; WX 602 ; N uni10EE ; G 1178\nU 4335 ; WX 602 ; N uni10EF ; G 1179\nU 4336 ; WX 602 ; N uni10F0 ; G 1180\nU 4337 ; WX 602 ; N uni10F1 ; G 1181\nU 4338 ; WX 602 ; N uni10F2 ; G 1182\nU 4339 ; WX 602 ; N uni10F3 ; G 1183\nU 4340 ; WX 602 ; N uni10F4 ; G 1184\nU 4341 ; WX 602 ; N uni10F5 ; G 1185\nU 4342 ; WX 602 ; N uni10F6 ; G 1186\nU 4343 ; WX 602 ; N uni10F7 ; G 1187\nU 4344 ; WX 602 ; N uni10F8 ; G 1188\nU 4345 ; WX 602 ; N uni10F9 ; G 1189\nU 4346 ; WX 602 ; N uni10FA ; G 1190\nU 4347 ; WX 602 ; N uni10FB ; G 1191\nU 4348 ; WX 602 ; N uni10FC ; G 1192\nU 7426 ; WX 602 ; N uni1D02 ; G 1193\nU 7432 ; WX 602 ; N uni1D08 ; G 1194\nU 7433 ; WX 602 ; N uni1D09 ; G 1195\nU 7444 ; WX 602 ; N uni1D14 ; G 1196\nU 7446 ; WX 602 ; N uni1D16 ; G 1197\nU 7447 ; WX 602 ; N uni1D17 ; G 1198\nU 7453 ; WX 602 ; N uni1D1D ; G 1199\nU 7454 ; WX 602 ; N uni1D1E ; G 1200\nU 7455 ; WX 602 ; N uni1D1F ; G 1201\nU 7468 ; WX 602 ; N uni1D2C ; G 1202\nU 7469 ; WX 602 ; N uni1D2D ; G 1203\nU 7470 ; WX 602 ; N uni1D2E ; G 1204\nU 7472 ; WX 602 ; N uni1D30 ; G 1205\nU 7473 ; WX 602 ; N uni1D31 ; G 1206\nU 7474 ; WX 602 ; N uni1D32 ; G 1207\nU 7475 ; WX 602 ; N uni1D33 ; G 1208\nU 7476 ; WX 602 ; N uni1D34 ; G 1209\nU 7477 ; WX 602 ; N uni1D35 ; G 1210\nU 7478 ; WX 602 ; N uni1D36 ; G 1211\nU 7479 ; WX 602 ; N uni1D37 ; G 1212\nU 7480 ; WX 602 ; N uni1D38 ; G 1213\nU 7481 ; WX 602 ; N uni1D39 ; G 1214\nU 7482 ; WX 602 ; N uni1D3A ; G 1215\nU 7483 ; WX 602 ; N uni1D3B ; G 1216\nU 7484 ; WX 602 ; N uni1D3C ; G 1217\nU 7486 ; WX 602 ; N uni1D3E ; G 1218\nU 7487 ; WX 602 ; N uni1D3F ; G 1219\nU 7488 ; WX 602 ; N uni1D40 ; G 1220\nU 7489 ; WX 602 ; N uni1D41 ; G 1221\nU 7490 ; WX 602 ; N uni1D42 ; G 1222\nU 7491 ; WX 602 ; N uni1D43 ; G 1223\nU 7492 ; WX 602 ; N uni1D44 ; G 1224\nU 7493 ; WX 602 ; N uni1D45 ; G 1225\nU 7494 ; WX 602 ; N uni1D46 ; G 1226\nU 7495 ; WX 602 ; N uni1D47 ; G 1227\nU 7496 ; WX 602 ; N uni1D48 ; G 1228\nU 7497 ; WX 602 ; N uni1D49 ; G 1229\nU 7498 ; WX 602 ; N uni1D4A ; G 1230\nU 7499 ; WX 602 ; N uni1D4B ; G 1231\nU 7500 ; WX 602 ; N uni1D4C ; G 1232\nU 7501 ; WX 602 ; N uni1D4D ; G 1233\nU 7502 ; WX 602 ; N uni1D4E ; G 1234\nU 7503 ; WX 602 ; N uni1D4F ; G 1235\nU 7504 ; WX 602 ; N uni1D50 ; G 1236\nU 7505 ; WX 602 ; N uni1D51 ; G 1237\nU 7506 ; WX 602 ; N uni1D52 ; G 1238\nU 7507 ; WX 602 ; N uni1D53 ; G 1239\nU 7508 ; WX 602 ; N uni1D54 ; G 1240\nU 7509 ; WX 602 ; N uni1D55 ; G 1241\nU 7510 ; WX 602 ; N uni1D56 ; G 1242\nU 7511 ; WX 602 ; N uni1D57 ; G 1243\nU 7512 ; WX 602 ; N uni1D58 ; G 1244\nU 7513 ; WX 602 ; N uni1D59 ; G 1245\nU 7514 ; WX 602 ; N uni1D5A ; G 1246\nU 7515 ; WX 602 ; N uni1D5B ; G 1247\nU 7522 ; WX 602 ; N uni1D62 ; G 1248\nU 7523 ; WX 602 ; N uni1D63 ; G 1249\nU 7524 ; WX 602 ; N uni1D64 ; G 1250\nU 7525 ; WX 602 ; N uni1D65 ; G 1251\nU 7543 ; WX 602 ; N uni1D77 ; G 1252\nU 7544 ; WX 602 ; N uni1D78 ; G 1253\nU 7547 ; WX 602 ; N uni1D7B ; G 1254\nU 7557 ; WX 602 ; N uni1D85 ; G 1255\nU 7579 ; WX 602 ; N uni1D9B ; G 1256\nU 7580 ; WX 602 ; N uni1D9C ; G 1257\nU 7581 ; WX 602 ; N uni1D9D ; G 1258\nU 7582 ; WX 602 ; N uni1D9E ; G 1259\nU 7583 ; WX 602 ; N uni1D9F ; G 1260\nU 7584 ; WX 602 ; N uni1DA0 ; G 1261\nU 7585 ; WX 602 ; N uni1DA1 ; G 1262\nU 7586 ; WX 602 ; N uni1DA2 ; G 1263\nU 7587 ; WX 602 ; N uni1DA3 ; G 1264\nU 7588 ; WX 602 ; N uni1DA4 ; G 1265\nU 7589 ; WX 602 ; N uni1DA5 ; G 1266\nU 7590 ; WX 602 ; N uni1DA6 ; G 1267\nU 7591 ; WX 602 ; N uni1DA7 ; G 1268\nU 7592 ; WX 602 ; N uni1DA8 ; G 1269\nU 7593 ; WX 602 ; N uni1DA9 ; G 1270\nU 7594 ; WX 602 ; N uni1DAA ; G 1271\nU 7595 ; WX 602 ; N uni1DAB ; G 1272\nU 7596 ; WX 602 ; N uni1DAC ; G 1273\nU 7597 ; WX 602 ; N uni1DAD ; G 1274\nU 7598 ; WX 602 ; N uni1DAE ; G 1275\nU 7599 ; WX 602 ; N uni1DAF ; G 1276\nU 7600 ; WX 602 ; N uni1DB0 ; G 1277\nU 7601 ; WX 602 ; N uni1DB1 ; G 1278\nU 7602 ; WX 602 ; N uni1DB2 ; G 1279\nU 7603 ; WX 602 ; N uni1DB3 ; G 1280\nU 7604 ; WX 602 ; N uni1DB4 ; G 1281\nU 7605 ; WX 602 ; N uni1DB5 ; G 1282\nU 7606 ; WX 602 ; N uni1DB6 ; G 1283\nU 7607 ; WX 602 ; N uni1DB7 ; G 1284\nU 7609 ; WX 602 ; N uni1DB9 ; G 1285\nU 7610 ; WX 602 ; N uni1DBA ; G 1286\nU 7611 ; WX 602 ; N uni1DBB ; G 1287\nU 7612 ; WX 602 ; N uni1DBC ; G 1288\nU 7613 ; WX 602 ; N uni1DBD ; G 1289\nU 7614 ; WX 602 ; N uni1DBE ; G 1290\nU 7615 ; WX 602 ; N uni1DBF ; G 1291\nU 7680 ; WX 602 ; N uni1E00 ; G 1292\nU 7681 ; WX 602 ; N uni1E01 ; G 1293\nU 7682 ; WX 602 ; N uni1E02 ; G 1294\nU 7683 ; WX 602 ; N uni1E03 ; G 1295\nU 7684 ; WX 602 ; N uni1E04 ; G 1296\nU 7685 ; WX 602 ; N uni1E05 ; G 1297\nU 7686 ; WX 602 ; N uni1E06 ; G 1298\nU 7687 ; WX 602 ; N uni1E07 ; G 1299\nU 7688 ; WX 602 ; N uni1E08 ; G 1300\nU 7689 ; WX 602 ; N uni1E09 ; G 1301\nU 7690 ; WX 602 ; N uni1E0A ; G 1302\nU 7691 ; WX 602 ; N uni1E0B ; G 1303\nU 7692 ; WX 602 ; N uni1E0C ; G 1304\nU 7693 ; WX 602 ; N uni1E0D ; G 1305\nU 7694 ; WX 602 ; N uni1E0E ; G 1306\nU 7695 ; WX 602 ; N uni1E0F ; G 1307\nU 7696 ; WX 602 ; N uni1E10 ; G 1308\nU 7697 ; WX 602 ; N uni1E11 ; G 1309\nU 7698 ; WX 602 ; N uni1E12 ; G 1310\nU 7699 ; WX 602 ; N uni1E13 ; G 1311\nU 7704 ; WX 602 ; N uni1E18 ; G 1312\nU 7705 ; WX 602 ; N uni1E19 ; G 1313\nU 7706 ; WX 602 ; N uni1E1A ; G 1314\nU 7707 ; WX 602 ; N uni1E1B ; G 1315\nU 7708 ; WX 602 ; N uni1E1C ; G 1316\nU 7709 ; WX 602 ; N uni1E1D ; G 1317\nU 7710 ; WX 602 ; N uni1E1E ; G 1318\nU 7711 ; WX 602 ; N uni1E1F ; G 1319\nU 7712 ; WX 602 ; N uni1E20 ; G 1320\nU 7713 ; WX 602 ; N uni1E21 ; G 1321\nU 7714 ; WX 602 ; N uni1E22 ; G 1322\nU 7715 ; WX 602 ; N uni1E23 ; G 1323\nU 7716 ; WX 602 ; N uni1E24 ; G 1324\nU 7717 ; WX 602 ; N uni1E25 ; G 1325\nU 7718 ; WX 602 ; N uni1E26 ; G 1326\nU 7719 ; WX 602 ; N uni1E27 ; G 1327\nU 7720 ; WX 602 ; N uni1E28 ; G 1328\nU 7721 ; WX 602 ; N uni1E29 ; G 1329\nU 7722 ; WX 602 ; N uni1E2A ; G 1330\nU 7723 ; WX 602 ; N uni1E2B ; G 1331\nU 7724 ; WX 602 ; N uni1E2C ; G 1332\nU 7725 ; WX 602 ; N uni1E2D ; G 1333\nU 7728 ; WX 602 ; N uni1E30 ; G 1334\nU 7729 ; WX 602 ; N uni1E31 ; G 1335\nU 7730 ; WX 602 ; N uni1E32 ; G 1336\nU 7731 ; WX 602 ; N uni1E33 ; G 1337\nU 7732 ; WX 602 ; N uni1E34 ; G 1338\nU 7733 ; WX 602 ; N uni1E35 ; G 1339\nU 7734 ; WX 602 ; N uni1E36 ; G 1340\nU 7735 ; WX 602 ; N uni1E37 ; G 1341\nU 7736 ; WX 602 ; N uni1E38 ; G 1342\nU 7737 ; WX 602 ; N uni1E39 ; G 1343\nU 7738 ; WX 602 ; N uni1E3A ; G 1344\nU 7739 ; WX 602 ; N uni1E3B ; G 1345\nU 7740 ; WX 602 ; N uni1E3C ; G 1346\nU 7741 ; WX 602 ; N uni1E3D ; G 1347\nU 7742 ; WX 602 ; N uni1E3E ; G 1348\nU 7743 ; WX 602 ; N uni1E3F ; G 1349\nU 7744 ; WX 602 ; N uni1E40 ; G 1350\nU 7745 ; WX 602 ; N uni1E41 ; G 1351\nU 7746 ; WX 602 ; N uni1E42 ; G 1352\nU 7747 ; WX 602 ; N uni1E43 ; G 1353\nU 7748 ; WX 602 ; N uni1E44 ; G 1354\nU 7749 ; WX 602 ; N uni1E45 ; G 1355\nU 7750 ; WX 602 ; N uni1E46 ; G 1356\nU 7751 ; WX 602 ; N uni1E47 ; G 1357\nU 7752 ; WX 602 ; N uni1E48 ; G 1358\nU 7753 ; WX 602 ; N uni1E49 ; G 1359\nU 7754 ; WX 602 ; N uni1E4A ; G 1360\nU 7755 ; WX 602 ; N uni1E4B ; G 1361\nU 7756 ; WX 602 ; N uni1E4C ; G 1362\nU 7757 ; WX 602 ; N uni1E4D ; G 1363\nU 7764 ; WX 602 ; N uni1E54 ; G 1364\nU 7765 ; WX 602 ; N uni1E55 ; G 1365\nU 7766 ; WX 602 ; N uni1E56 ; G 1366\nU 7767 ; WX 602 ; N uni1E57 ; G 1367\nU 7768 ; WX 602 ; N uni1E58 ; G 1368\nU 7769 ; WX 602 ; N uni1E59 ; G 1369\nU 7770 ; WX 602 ; N uni1E5A ; G 1370\nU 7771 ; WX 602 ; N uni1E5B ; G 1371\nU 7772 ; WX 602 ; N uni1E5C ; G 1372\nU 7773 ; WX 602 ; N uni1E5D ; G 1373\nU 7774 ; WX 602 ; N uni1E5E ; G 1374\nU 7775 ; WX 602 ; N uni1E5F ; G 1375\nU 7776 ; WX 602 ; N uni1E60 ; G 1376\nU 7777 ; WX 602 ; N uni1E61 ; G 1377\nU 7778 ; WX 602 ; N uni1E62 ; G 1378\nU 7779 ; WX 602 ; N uni1E63 ; G 1379\nU 7784 ; WX 602 ; N uni1E68 ; G 1380\nU 7785 ; WX 602 ; N uni1E69 ; G 1381\nU 7786 ; WX 602 ; N uni1E6A ; G 1382\nU 7787 ; WX 602 ; N uni1E6B ; G 1383\nU 7788 ; WX 602 ; N uni1E6C ; G 1384\nU 7789 ; WX 602 ; N uni1E6D ; G 1385\nU 7790 ; WX 602 ; N uni1E6E ; G 1386\nU 7791 ; WX 602 ; N uni1E6F ; G 1387\nU 7792 ; WX 602 ; N uni1E70 ; G 1388\nU 7793 ; WX 602 ; N uni1E71 ; G 1389\nU 7794 ; WX 602 ; N uni1E72 ; G 1390\nU 7795 ; WX 602 ; N uni1E73 ; G 1391\nU 7796 ; WX 602 ; N uni1E74 ; G 1392\nU 7797 ; WX 602 ; N uni1E75 ; G 1393\nU 7798 ; WX 602 ; N uni1E76 ; G 1394\nU 7799 ; WX 602 ; N uni1E77 ; G 1395\nU 7800 ; WX 602 ; N uni1E78 ; G 1396\nU 7801 ; WX 602 ; N uni1E79 ; G 1397\nU 7804 ; WX 602 ; N uni1E7C ; G 1398\nU 7805 ; WX 602 ; N uni1E7D ; G 1399\nU 7806 ; WX 602 ; N uni1E7E ; G 1400\nU 7807 ; WX 602 ; N uni1E7F ; G 1401\nU 7808 ; WX 602 ; N Wgrave ; G 1402\nU 7809 ; WX 602 ; N wgrave ; G 1403\nU 7810 ; WX 602 ; N Wacute ; G 1404\nU 7811 ; WX 602 ; N wacute ; G 1405\nU 7812 ; WX 602 ; N Wdieresis ; G 1406\nU 7813 ; WX 602 ; N wdieresis ; G 1407\nU 7814 ; WX 602 ; N uni1E86 ; G 1408\nU 7815 ; WX 602 ; N uni1E87 ; G 1409\nU 7816 ; WX 602 ; N uni1E88 ; G 1410\nU 7817 ; WX 602 ; N uni1E89 ; G 1411\nU 7818 ; WX 602 ; N uni1E8A ; G 1412\nU 7819 ; WX 602 ; N uni1E8B ; G 1413\nU 7820 ; WX 602 ; N uni1E8C ; G 1414\nU 7821 ; WX 602 ; N uni1E8D ; G 1415\nU 7822 ; WX 602 ; N uni1E8E ; G 1416\nU 7823 ; WX 602 ; N uni1E8F ; G 1417\nU 7824 ; WX 602 ; N uni1E90 ; G 1418\nU 7825 ; WX 602 ; N uni1E91 ; G 1419\nU 7826 ; WX 602 ; N uni1E92 ; G 1420\nU 7827 ; WX 602 ; N uni1E93 ; G 1421\nU 7828 ; WX 602 ; N uni1E94 ; G 1422\nU 7829 ; WX 602 ; N uni1E95 ; G 1423\nU 7830 ; WX 602 ; N uni1E96 ; G 1424\nU 7831 ; WX 602 ; N uni1E97 ; G 1425\nU 7832 ; WX 602 ; N uni1E98 ; G 1426\nU 7833 ; WX 602 ; N uni1E99 ; G 1427\nU 7835 ; WX 602 ; N uni1E9B ; G 1428\nU 7839 ; WX 602 ; N uni1E9F ; G 1429\nU 7840 ; WX 602 ; N uni1EA0 ; G 1430\nU 7841 ; WX 602 ; N uni1EA1 ; G 1431\nU 7852 ; WX 602 ; N uni1EAC ; G 1432\nU 7853 ; WX 602 ; N uni1EAD ; G 1433\nU 7856 ; WX 602 ; N uni1EB0 ; G 1434\nU 7857 ; WX 602 ; N uni1EB1 ; G 1435\nU 7862 ; WX 602 ; N uni1EB6 ; G 1436\nU 7863 ; WX 602 ; N uni1EB7 ; G 1437\nU 7864 ; WX 602 ; N uni1EB8 ; G 1438\nU 7865 ; WX 602 ; N uni1EB9 ; G 1439\nU 7868 ; WX 602 ; N uni1EBC ; G 1440\nU 7869 ; WX 602 ; N uni1EBD ; G 1441\nU 7878 ; WX 602 ; N uni1EC6 ; G 1442\nU 7879 ; WX 602 ; N uni1EC7 ; G 1443\nU 7882 ; WX 602 ; N uni1ECA ; G 1444\nU 7883 ; WX 602 ; N uni1ECB ; G 1445\nU 7884 ; WX 602 ; N uni1ECC ; G 1446\nU 7885 ; WX 602 ; N uni1ECD ; G 1447\nU 7896 ; WX 602 ; N uni1ED8 ; G 1448\nU 7897 ; WX 602 ; N uni1ED9 ; G 1449\nU 7898 ; WX 602 ; N uni1EDA ; G 1450\nU 7899 ; WX 602 ; N uni1EDB ; G 1451\nU 7900 ; WX 602 ; N uni1EDC ; G 1452\nU 7901 ; WX 602 ; N uni1EDD ; G 1453\nU 7904 ; WX 602 ; N uni1EE0 ; G 1454\nU 7905 ; WX 602 ; N uni1EE1 ; G 1455\nU 7906 ; WX 602 ; N uni1EE2 ; G 1456\nU 7907 ; WX 602 ; N uni1EE3 ; G 1457\nU 7908 ; WX 602 ; N uni1EE4 ; G 1458\nU 7909 ; WX 602 ; N uni1EE5 ; G 1459\nU 7912 ; WX 602 ; N uni1EE8 ; G 1460\nU 7913 ; WX 602 ; N uni1EE9 ; G 1461\nU 7914 ; WX 602 ; N uni1EEA ; G 1462\nU 7915 ; WX 602 ; N uni1EEB ; G 1463\nU 7918 ; WX 602 ; N uni1EEE ; G 1464\nU 7919 ; WX 602 ; N uni1EEF ; G 1465\nU 7920 ; WX 602 ; N uni1EF0 ; G 1466\nU 7921 ; WX 602 ; N uni1EF1 ; G 1467\nU 7922 ; WX 602 ; N Ygrave ; G 1468\nU 7923 ; WX 602 ; N ygrave ; G 1469\nU 7924 ; WX 602 ; N uni1EF4 ; G 1470\nU 7925 ; WX 602 ; N uni1EF5 ; G 1471\nU 7928 ; WX 602 ; N uni1EF8 ; G 1472\nU 7929 ; WX 602 ; N uni1EF9 ; G 1473\nU 7936 ; WX 602 ; N uni1F00 ; G 1474\nU 7937 ; WX 602 ; N uni1F01 ; G 1475\nU 7938 ; WX 602 ; N uni1F02 ; G 1476\nU 7939 ; WX 602 ; N uni1F03 ; G 1477\nU 7940 ; WX 602 ; N uni1F04 ; G 1478\nU 7941 ; WX 602 ; N uni1F05 ; G 1479\nU 7942 ; WX 602 ; N uni1F06 ; G 1480\nU 7943 ; WX 602 ; N uni1F07 ; G 1481\nU 7944 ; WX 602 ; N uni1F08 ; G 1482\nU 7945 ; WX 602 ; N uni1F09 ; G 1483\nU 7946 ; WX 602 ; N uni1F0A ; G 1484\nU 7947 ; WX 602 ; N uni1F0B ; G 1485\nU 7948 ; WX 602 ; N uni1F0C ; G 1486\nU 7949 ; WX 602 ; N uni1F0D ; G 1487\nU 7950 ; WX 602 ; N uni1F0E ; G 1488\nU 7951 ; WX 602 ; N uni1F0F ; G 1489\nU 7952 ; WX 602 ; N uni1F10 ; G 1490\nU 7953 ; WX 602 ; N uni1F11 ; G 1491\nU 7954 ; WX 602 ; N uni1F12 ; G 1492\nU 7955 ; WX 602 ; N uni1F13 ; G 1493\nU 7956 ; WX 602 ; N uni1F14 ; G 1494\nU 7957 ; WX 602 ; N uni1F15 ; G 1495\nU 7960 ; WX 602 ; N uni1F18 ; G 1496\nU 7961 ; WX 602 ; N uni1F19 ; G 1497\nU 7962 ; WX 602 ; N uni1F1A ; G 1498\nU 7963 ; WX 602 ; N uni1F1B ; G 1499\nU 7964 ; WX 602 ; N uni1F1C ; G 1500\nU 7965 ; WX 602 ; N uni1F1D ; G 1501\nU 7968 ; WX 602 ; N uni1F20 ; G 1502\nU 7969 ; WX 602 ; N uni1F21 ; G 1503\nU 7970 ; WX 602 ; N uni1F22 ; G 1504\nU 7971 ; WX 602 ; N uni1F23 ; G 1505\nU 7972 ; WX 602 ; N uni1F24 ; G 1506\nU 7973 ; WX 602 ; N uni1F25 ; G 1507\nU 7974 ; WX 602 ; N uni1F26 ; G 1508\nU 7975 ; WX 602 ; N uni1F27 ; G 1509\nU 7976 ; WX 602 ; N uni1F28 ; G 1510\nU 7977 ; WX 602 ; N uni1F29 ; G 1511\nU 7978 ; WX 602 ; N uni1F2A ; G 1512\nU 7979 ; WX 602 ; N uni1F2B ; G 1513\nU 7980 ; WX 602 ; N uni1F2C ; G 1514\nU 7981 ; WX 602 ; N uni1F2D ; G 1515\nU 7982 ; WX 602 ; N uni1F2E ; G 1516\nU 7983 ; WX 602 ; N uni1F2F ; G 1517\nU 7984 ; WX 602 ; N uni1F30 ; G 1518\nU 7985 ; WX 602 ; N uni1F31 ; G 1519\nU 7986 ; WX 602 ; N uni1F32 ; G 1520\nU 7987 ; WX 602 ; N uni1F33 ; G 1521\nU 7988 ; WX 602 ; N uni1F34 ; G 1522\nU 7989 ; WX 602 ; N uni1F35 ; G 1523\nU 7990 ; WX 602 ; N uni1F36 ; G 1524\nU 7991 ; WX 602 ; N uni1F37 ; G 1525\nU 7992 ; WX 602 ; N uni1F38 ; G 1526\nU 7993 ; WX 602 ; N uni1F39 ; G 1527\nU 7994 ; WX 602 ; N uni1F3A ; G 1528\nU 7995 ; WX 602 ; N uni1F3B ; G 1529\nU 7996 ; WX 602 ; N uni1F3C ; G 1530\nU 7997 ; WX 602 ; N uni1F3D ; G 1531\nU 7998 ; WX 602 ; N uni1F3E ; G 1532\nU 7999 ; WX 602 ; N uni1F3F ; G 1533\nU 8000 ; WX 602 ; N uni1F40 ; G 1534\nU 8001 ; WX 602 ; N uni1F41 ; G 1535\nU 8002 ; WX 602 ; N uni1F42 ; G 1536\nU 8003 ; WX 602 ; N uni1F43 ; G 1537\nU 8004 ; WX 602 ; N uni1F44 ; G 1538\nU 8005 ; WX 602 ; N uni1F45 ; G 1539\nU 8008 ; WX 602 ; N uni1F48 ; G 1540\nU 8009 ; WX 602 ; N uni1F49 ; G 1541\nU 8010 ; WX 602 ; N uni1F4A ; G 1542\nU 8011 ; WX 602 ; N uni1F4B ; G 1543\nU 8012 ; WX 602 ; N uni1F4C ; G 1544\nU 8013 ; WX 602 ; N uni1F4D ; G 1545\nU 8016 ; WX 602 ; N uni1F50 ; G 1546\nU 8017 ; WX 602 ; N uni1F51 ; G 1547\nU 8018 ; WX 602 ; N uni1F52 ; G 1548\nU 8019 ; WX 602 ; N uni1F53 ; G 1549\nU 8020 ; WX 602 ; N uni1F54 ; G 1550\nU 8021 ; WX 602 ; N uni1F55 ; G 1551\nU 8022 ; WX 602 ; N uni1F56 ; G 1552\nU 8023 ; WX 602 ; N uni1F57 ; G 1553\nU 8025 ; WX 602 ; N uni1F59 ; G 1554\nU 8027 ; WX 602 ; N uni1F5B ; G 1555\nU 8029 ; WX 602 ; N uni1F5D ; G 1556\nU 8031 ; WX 602 ; N uni1F5F ; G 1557\nU 8032 ; WX 602 ; N uni1F60 ; G 1558\nU 8033 ; WX 602 ; N uni1F61 ; G 1559\nU 8034 ; WX 602 ; N uni1F62 ; G 1560\nU 8035 ; WX 602 ; N uni1F63 ; G 1561\nU 8036 ; WX 602 ; N uni1F64 ; G 1562\nU 8037 ; WX 602 ; N uni1F65 ; G 1563\nU 8038 ; WX 602 ; N uni1F66 ; G 1564\nU 8039 ; WX 602 ; N uni1F67 ; G 1565\nU 8040 ; WX 602 ; N uni1F68 ; G 1566\nU 8041 ; WX 602 ; N uni1F69 ; G 1567\nU 8042 ; WX 602 ; N uni1F6A ; G 1568\nU 8043 ; WX 602 ; N uni1F6B ; G 1569\nU 8044 ; WX 602 ; N uni1F6C ; G 1570\nU 8045 ; WX 602 ; N uni1F6D ; G 1571\nU 8046 ; WX 602 ; N uni1F6E ; G 1572\nU 8047 ; WX 602 ; N uni1F6F ; G 1573\nU 8048 ; WX 602 ; N uni1F70 ; G 1574\nU 8049 ; WX 602 ; N uni1F71 ; G 1575\nU 8050 ; WX 602 ; N uni1F72 ; G 1576\nU 8051 ; WX 602 ; N uni1F73 ; G 1577\nU 8052 ; WX 602 ; N uni1F74 ; G 1578\nU 8053 ; WX 602 ; N uni1F75 ; G 1579\nU 8054 ; WX 602 ; N uni1F76 ; G 1580\nU 8055 ; WX 602 ; N uni1F77 ; G 1581\nU 8056 ; WX 602 ; N uni1F78 ; G 1582\nU 8057 ; WX 602 ; N uni1F79 ; G 1583\nU 8058 ; WX 602 ; N uni1F7A ; G 1584\nU 8059 ; WX 602 ; N uni1F7B ; G 1585\nU 8060 ; WX 602 ; N uni1F7C ; G 1586\nU 8061 ; WX 602 ; N uni1F7D ; G 1587\nU 8064 ; WX 602 ; N uni1F80 ; G 1588\nU 8065 ; WX 602 ; N uni1F81 ; G 1589\nU 8066 ; WX 602 ; N uni1F82 ; G 1590\nU 8067 ; WX 602 ; N uni1F83 ; G 1591\nU 8068 ; WX 602 ; N uni1F84 ; G 1592\nU 8069 ; WX 602 ; N uni1F85 ; G 1593\nU 8070 ; WX 602 ; N uni1F86 ; G 1594\nU 8071 ; WX 602 ; N uni1F87 ; G 1595\nU 8072 ; WX 602 ; N uni1F88 ; G 1596\nU 8073 ; WX 602 ; N uni1F89 ; G 1597\nU 8074 ; WX 602 ; N uni1F8A ; G 1598\nU 8075 ; WX 602 ; N uni1F8B ; G 1599\nU 8076 ; WX 602 ; N uni1F8C ; G 1600\nU 8077 ; WX 602 ; N uni1F8D ; G 1601\nU 8078 ; WX 602 ; N uni1F8E ; G 1602\nU 8079 ; WX 602 ; N uni1F8F ; G 1603\nU 8080 ; WX 602 ; N uni1F90 ; G 1604\nU 8081 ; WX 602 ; N uni1F91 ; G 1605\nU 8082 ; WX 602 ; N uni1F92 ; G 1606\nU 8083 ; WX 602 ; N uni1F93 ; G 1607\nU 8084 ; WX 602 ; N uni1F94 ; G 1608\nU 8085 ; WX 602 ; N uni1F95 ; G 1609\nU 8086 ; WX 602 ; N uni1F96 ; G 1610\nU 8087 ; WX 602 ; N uni1F97 ; G 1611\nU 8088 ; WX 602 ; N uni1F98 ; G 1612\nU 8089 ; WX 602 ; N uni1F99 ; G 1613\nU 8090 ; WX 602 ; N uni1F9A ; G 1614\nU 8091 ; WX 602 ; N uni1F9B ; G 1615\nU 8092 ; WX 602 ; N uni1F9C ; G 1616\nU 8093 ; WX 602 ; N uni1F9D ; G 1617\nU 8094 ; WX 602 ; N uni1F9E ; G 1618\nU 8095 ; WX 602 ; N uni1F9F ; G 1619\nU 8096 ; WX 602 ; N uni1FA0 ; G 1620\nU 8097 ; WX 602 ; N uni1FA1 ; G 1621\nU 8098 ; WX 602 ; N uni1FA2 ; G 1622\nU 8099 ; WX 602 ; N uni1FA3 ; G 1623\nU 8100 ; WX 602 ; N uni1FA4 ; G 1624\nU 8101 ; WX 602 ; N uni1FA5 ; G 1625\nU 8102 ; WX 602 ; N uni1FA6 ; G 1626\nU 8103 ; WX 602 ; N uni1FA7 ; G 1627\nU 8104 ; WX 602 ; N uni1FA8 ; G 1628\nU 8105 ; WX 602 ; N uni1FA9 ; G 1629\nU 8106 ; WX 602 ; N uni1FAA ; G 1630\nU 8107 ; WX 602 ; N uni1FAB ; G 1631\nU 8108 ; WX 602 ; N uni1FAC ; G 1632\nU 8109 ; WX 602 ; N uni1FAD ; G 1633\nU 8110 ; WX 602 ; N uni1FAE ; G 1634\nU 8111 ; WX 602 ; N uni1FAF ; G 1635\nU 8112 ; WX 602 ; N uni1FB0 ; G 1636\nU 8113 ; WX 602 ; N uni1FB1 ; G 1637\nU 8114 ; WX 602 ; N uni1FB2 ; G 1638\nU 8115 ; WX 602 ; N uni1FB3 ; G 1639\nU 8116 ; WX 602 ; N uni1FB4 ; G 1640\nU 8118 ; WX 602 ; N uni1FB6 ; G 1641\nU 8119 ; WX 602 ; N uni1FB7 ; G 1642\nU 8120 ; WX 602 ; N uni1FB8 ; G 1643\nU 8121 ; WX 602 ; N uni1FB9 ; G 1644\nU 8122 ; WX 602 ; N uni1FBA ; G 1645\nU 8123 ; WX 602 ; N uni1FBB ; G 1646\nU 8124 ; WX 602 ; N uni1FBC ; G 1647\nU 8125 ; WX 602 ; N uni1FBD ; G 1648\nU 8126 ; WX 602 ; N uni1FBE ; G 1649\nU 8127 ; WX 602 ; N uni1FBF ; G 1650\nU 8128 ; WX 602 ; N uni1FC0 ; G 1651\nU 8129 ; WX 602 ; N uni1FC1 ; G 1652\nU 8130 ; WX 602 ; N uni1FC2 ; G 1653\nU 8131 ; WX 602 ; N uni1FC3 ; G 1654\nU 8132 ; WX 602 ; N uni1FC4 ; G 1655\nU 8134 ; WX 602 ; N uni1FC6 ; G 1656\nU 8135 ; WX 602 ; N uni1FC7 ; G 1657\nU 8136 ; WX 602 ; N uni1FC8 ; G 1658\nU 8137 ; WX 602 ; N uni1FC9 ; G 1659\nU 8138 ; WX 602 ; N uni1FCA ; G 1660\nU 8139 ; WX 602 ; N uni1FCB ; G 1661\nU 8140 ; WX 602 ; N uni1FCC ; G 1662\nU 8141 ; WX 602 ; N uni1FCD ; G 1663\nU 8142 ; WX 602 ; N uni1FCE ; G 1664\nU 8143 ; WX 602 ; N uni1FCF ; G 1665\nU 8144 ; WX 602 ; N uni1FD0 ; G 1666\nU 8145 ; WX 602 ; N uni1FD1 ; G 1667\nU 8146 ; WX 602 ; N uni1FD2 ; G 1668\nU 8147 ; WX 602 ; N uni1FD3 ; G 1669\nU 8150 ; WX 602 ; N uni1FD6 ; G 1670\nU 8151 ; WX 602 ; N uni1FD7 ; G 1671\nU 8152 ; WX 602 ; N uni1FD8 ; G 1672\nU 8153 ; WX 602 ; N uni1FD9 ; G 1673\nU 8154 ; WX 602 ; N uni1FDA ; G 1674\nU 8155 ; WX 602 ; N uni1FDB ; G 1675\nU 8157 ; WX 602 ; N uni1FDD ; G 1676\nU 8158 ; WX 602 ; N uni1FDE ; G 1677\nU 8159 ; WX 602 ; N uni1FDF ; G 1678\nU 8160 ; WX 602 ; N uni1FE0 ; G 1679\nU 8161 ; WX 602 ; N uni1FE1 ; G 1680\nU 8162 ; WX 602 ; N uni1FE2 ; G 1681\nU 8163 ; WX 602 ; N uni1FE3 ; G 1682\nU 8164 ; WX 602 ; N uni1FE4 ; G 1683\nU 8165 ; WX 602 ; N uni1FE5 ; G 1684\nU 8166 ; WX 602 ; N uni1FE6 ; G 1685\nU 8167 ; WX 602 ; N uni1FE7 ; G 1686\nU 8168 ; WX 602 ; N uni1FE8 ; G 1687\nU 8169 ; WX 602 ; N uni1FE9 ; G 1688\nU 8170 ; WX 602 ; N uni1FEA ; G 1689\nU 8171 ; WX 602 ; N uni1FEB ; G 1690\nU 8172 ; WX 602 ; N uni1FEC ; G 1691\nU 8173 ; WX 602 ; N uni1FED ; G 1692\nU 8174 ; WX 602 ; N uni1FEE ; G 1693\nU 8175 ; WX 602 ; N uni1FEF ; G 1694\nU 8178 ; WX 602 ; N uni1FF2 ; G 1695\nU 8179 ; WX 602 ; N uni1FF3 ; G 1696\nU 8180 ; WX 602 ; N uni1FF4 ; G 1697\nU 8182 ; WX 602 ; N uni1FF6 ; G 1698\nU 8183 ; WX 602 ; N uni1FF7 ; G 1699\nU 8184 ; WX 602 ; N uni1FF8 ; G 1700\nU 8185 ; WX 602 ; N uni1FF9 ; G 1701\nU 8186 ; WX 602 ; N uni1FFA ; G 1702\nU 8187 ; WX 602 ; N uni1FFB ; G 1703\nU 8188 ; WX 602 ; N uni1FFC ; G 1704\nU 8189 ; WX 602 ; N uni1FFD ; G 1705\nU 8190 ; WX 602 ; N uni1FFE ; G 1706\nU 8192 ; WX 602 ; N uni2000 ; G 1707\nU 8193 ; WX 602 ; N uni2001 ; G 1708\nU 8194 ; WX 602 ; N uni2002 ; G 1709\nU 8195 ; WX 602 ; N uni2003 ; G 1710\nU 8196 ; WX 602 ; N uni2004 ; G 1711\nU 8197 ; WX 602 ; N uni2005 ; G 1712\nU 8198 ; WX 602 ; N uni2006 ; G 1713\nU 8199 ; WX 602 ; N uni2007 ; G 1714\nU 8200 ; WX 602 ; N uni2008 ; G 1715\nU 8201 ; WX 602 ; N uni2009 ; G 1716\nU 8202 ; WX 602 ; N uni200A ; G 1717\nU 8208 ; WX 602 ; N uni2010 ; G 1718\nU 8209 ; WX 602 ; N uni2011 ; G 1719\nU 8210 ; WX 602 ; N figuredash ; G 1720\nU 8211 ; WX 602 ; N endash ; G 1721\nU 8212 ; WX 602 ; N emdash ; G 1722\nU 8213 ; WX 602 ; N uni2015 ; G 1723\nU 8214 ; WX 602 ; N uni2016 ; G 1724\nU 8215 ; WX 602 ; N underscoredbl ; G 1725\nU 8216 ; WX 602 ; N quoteleft ; G 1726\nU 8217 ; WX 602 ; N quoteright ; G 1727\nU 8218 ; WX 602 ; N quotesinglbase ; G 1728\nU 8219 ; WX 602 ; N quotereversed ; G 1729\nU 8220 ; WX 602 ; N quotedblleft ; G 1730\nU 8221 ; WX 602 ; N quotedblright ; G 1731\nU 8222 ; WX 602 ; N quotedblbase ; G 1732\nU 8223 ; WX 602 ; N uni201F ; G 1733\nU 8224 ; WX 602 ; N dagger ; G 1734\nU 8225 ; WX 602 ; N daggerdbl ; G 1735\nU 8226 ; WX 602 ; N bullet ; G 1736\nU 8227 ; WX 602 ; N uni2023 ; G 1737\nU 8230 ; WX 602 ; N ellipsis ; G 1738\nU 8239 ; WX 602 ; N uni202F ; G 1739\nU 8240 ; WX 602 ; N perthousand ; G 1740\nU 8241 ; WX 602 ; N uni2031 ; G 1741\nU 8242 ; WX 602 ; N minute ; G 1742\nU 8243 ; WX 602 ; N second ; G 1743\nU 8244 ; WX 602 ; N uni2034 ; G 1744\nU 8245 ; WX 602 ; N uni2035 ; G 1745\nU 8246 ; WX 602 ; N uni2036 ; G 1746\nU 8247 ; WX 602 ; N uni2037 ; G 1747\nU 8249 ; WX 602 ; N guilsinglleft ; G 1748\nU 8250 ; WX 602 ; N guilsinglright ; G 1749\nU 8252 ; WX 602 ; N exclamdbl ; G 1750\nU 8253 ; WX 602 ; N uni203D ; G 1751\nU 8254 ; WX 602 ; N uni203E ; G 1752\nU 8255 ; WX 602 ; N uni203F ; G 1753\nU 8261 ; WX 602 ; N uni2045 ; G 1754\nU 8262 ; WX 602 ; N uni2046 ; G 1755\nU 8263 ; WX 602 ; N uni2047 ; G 1756\nU 8264 ; WX 602 ; N uni2048 ; G 1757\nU 8265 ; WX 602 ; N uni2049 ; G 1758\nU 8267 ; WX 602 ; N uni204B ; G 1759\nU 8287 ; WX 602 ; N uni205F ; G 1760\nU 8304 ; WX 602 ; N uni2070 ; G 1761\nU 8305 ; WX 602 ; N uni2071 ; G 1762\nU 8308 ; WX 602 ; N uni2074 ; G 1763\nU 8309 ; WX 602 ; N uni2075 ; G 1764\nU 8310 ; WX 602 ; N uni2076 ; G 1765\nU 8311 ; WX 602 ; N uni2077 ; G 1766\nU 8312 ; WX 602 ; N uni2078 ; G 1767\nU 8313 ; WX 602 ; N uni2079 ; G 1768\nU 8314 ; WX 602 ; N uni207A ; G 1769\nU 8315 ; WX 602 ; N uni207B ; G 1770\nU 8316 ; WX 602 ; N uni207C ; G 1771\nU 8317 ; WX 602 ; N uni207D ; G 1772\nU 8318 ; WX 602 ; N uni207E ; G 1773\nU 8319 ; WX 602 ; N uni207F ; G 1774\nU 8320 ; WX 602 ; N uni2080 ; G 1775\nU 8321 ; WX 602 ; N uni2081 ; G 1776\nU 8322 ; WX 602 ; N uni2082 ; G 1777\nU 8323 ; WX 602 ; N uni2083 ; G 1778\nU 8324 ; WX 602 ; N uni2084 ; G 1779\nU 8325 ; WX 602 ; N uni2085 ; G 1780\nU 8326 ; WX 602 ; N uni2086 ; G 1781\nU 8327 ; WX 602 ; N uni2087 ; G 1782\nU 8328 ; WX 602 ; N uni2088 ; G 1783\nU 8329 ; WX 602 ; N uni2089 ; G 1784\nU 8330 ; WX 602 ; N uni208A ; G 1785\nU 8331 ; WX 602 ; N uni208B ; G 1786\nU 8332 ; WX 602 ; N uni208C ; G 1787\nU 8333 ; WX 602 ; N uni208D ; G 1788\nU 8334 ; WX 602 ; N uni208E ; G 1789\nU 8336 ; WX 602 ; N uni2090 ; G 1790\nU 8337 ; WX 602 ; N uni2091 ; G 1791\nU 8338 ; WX 602 ; N uni2092 ; G 1792\nU 8339 ; WX 602 ; N uni2093 ; G 1793\nU 8340 ; WX 602 ; N uni2094 ; G 1794\nU 8341 ; WX 602 ; N uni2095 ; G 1795\nU 8342 ; WX 602 ; N uni2096 ; G 1796\nU 8343 ; WX 602 ; N uni2097 ; G 1797\nU 8344 ; WX 602 ; N uni2098 ; G 1798\nU 8345 ; WX 602 ; N uni2099 ; G 1799\nU 8346 ; WX 602 ; N uni209A ; G 1800\nU 8347 ; WX 602 ; N uni209B ; G 1801\nU 8348 ; WX 602 ; N uni209C ; G 1802\nU 8352 ; WX 602 ; N uni20A0 ; G 1803\nU 8353 ; WX 602 ; N colonmonetary ; G 1804\nU 8354 ; WX 602 ; N uni20A2 ; G 1805\nU 8355 ; WX 602 ; N franc ; G 1806\nU 8356 ; WX 602 ; N lira ; G 1807\nU 8357 ; WX 602 ; N uni20A5 ; G 1808\nU 8358 ; WX 602 ; N uni20A6 ; G 1809\nU 8359 ; WX 602 ; N peseta ; G 1810\nU 8360 ; WX 602 ; N uni20A8 ; G 1811\nU 8361 ; WX 602 ; N uni20A9 ; G 1812\nU 8362 ; WX 602 ; N uni20AA ; G 1813\nU 8363 ; WX 602 ; N dong ; G 1814\nU 8364 ; WX 602 ; N Euro ; G 1815\nU 8365 ; WX 602 ; N uni20AD ; G 1816\nU 8366 ; WX 602 ; N uni20AE ; G 1817\nU 8367 ; WX 602 ; N uni20AF ; G 1818\nU 8368 ; WX 602 ; N uni20B0 ; G 1819\nU 8369 ; WX 602 ; N uni20B1 ; G 1820\nU 8370 ; WX 602 ; N uni20B2 ; G 1821\nU 8371 ; WX 602 ; N uni20B3 ; G 1822\nU 8372 ; WX 602 ; N uni20B4 ; G 1823\nU 8373 ; WX 602 ; N uni20B5 ; G 1824\nU 8376 ; WX 602 ; N uni20B8 ; G 1825\nU 8377 ; WX 602 ; N uni20B9 ; G 1826\nU 8378 ; WX 602 ; N uni20BA ; G 1827\nU 8381 ; WX 602 ; N uni20BD ; G 1828\nU 8450 ; WX 602 ; N uni2102 ; G 1829\nU 8453 ; WX 602 ; N uni2105 ; G 1830\nU 8461 ; WX 602 ; N uni210D ; G 1831\nU 8462 ; WX 602 ; N uni210E ; G 1832\nU 8463 ; WX 602 ; N uni210F ; G 1833\nU 8469 ; WX 602 ; N uni2115 ; G 1834\nU 8470 ; WX 602 ; N uni2116 ; G 1835\nU 8471 ; WX 602 ; N uni2117 ; G 1836\nU 8473 ; WX 602 ; N uni2119 ; G 1837\nU 8474 ; WX 602 ; N uni211A ; G 1838\nU 8477 ; WX 602 ; N uni211D ; G 1839\nU 8482 ; WX 602 ; N trademark ; G 1840\nU 8484 ; WX 602 ; N uni2124 ; G 1841\nU 8486 ; WX 602 ; N uni2126 ; G 1842\nU 8490 ; WX 602 ; N uni212A ; G 1843\nU 8491 ; WX 602 ; N uni212B ; G 1844\nU 8494 ; WX 602 ; N estimated ; G 1845\nU 8520 ; WX 602 ; N uni2148 ; G 1846\nU 8528 ; WX 602 ; N uni2150 ; G 1847\nU 8529 ; WX 602 ; N uni2151 ; G 1848\nU 8531 ; WX 602 ; N onethird ; G 1849\nU 8532 ; WX 602 ; N twothirds ; G 1850\nU 8533 ; WX 602 ; N uni2155 ; G 1851\nU 8534 ; WX 602 ; N uni2156 ; G 1852\nU 8535 ; WX 602 ; N uni2157 ; G 1853\nU 8536 ; WX 602 ; N uni2158 ; G 1854\nU 8537 ; WX 602 ; N uni2159 ; G 1855\nU 8538 ; WX 602 ; N uni215A ; G 1856\nU 8539 ; WX 602 ; N oneeighth ; G 1857\nU 8540 ; WX 602 ; N threeeighths ; G 1858\nU 8541 ; WX 602 ; N fiveeighths ; G 1859\nU 8542 ; WX 602 ; N seveneighths ; G 1860\nU 8543 ; WX 602 ; N uni215F ; G 1861\nU 8585 ; WX 602 ; N uni2189 ; G 1862\nU 8592 ; WX 602 ; N arrowleft ; G 1863\nU 8593 ; WX 602 ; N arrowup ; G 1864\nU 8594 ; WX 602 ; N arrowright ; G 1865\nU 8595 ; WX 602 ; N arrowdown ; G 1866\nU 8596 ; WX 602 ; N arrowboth ; G 1867\nU 8597 ; WX 602 ; N arrowupdn ; G 1868\nU 8598 ; WX 602 ; N uni2196 ; G 1869\nU 8599 ; WX 602 ; N uni2197 ; G 1870\nU 8600 ; WX 602 ; N uni2198 ; G 1871\nU 8601 ; WX 602 ; N uni2199 ; G 1872\nU 8602 ; WX 602 ; N uni219A ; G 1873\nU 8603 ; WX 602 ; N uni219B ; G 1874\nU 8604 ; WX 602 ; N uni219C ; G 1875\nU 8605 ; WX 602 ; N uni219D ; G 1876\nU 8606 ; WX 602 ; N uni219E ; G 1877\nU 8607 ; WX 602 ; N uni219F ; G 1878\nU 8608 ; WX 602 ; N uni21A0 ; G 1879\nU 8609 ; WX 602 ; N uni21A1 ; G 1880\nU 8610 ; WX 602 ; N uni21A2 ; G 1881\nU 8611 ; WX 602 ; N uni21A3 ; G 1882\nU 8612 ; WX 602 ; N uni21A4 ; G 1883\nU 8613 ; WX 602 ; N uni21A5 ; G 1884\nU 8614 ; WX 602 ; N uni21A6 ; G 1885\nU 8615 ; WX 602 ; N uni21A7 ; G 1886\nU 8616 ; WX 602 ; N arrowupdnbse ; G 1887\nU 8617 ; WX 602 ; N uni21A9 ; G 1888\nU 8618 ; WX 602 ; N uni21AA ; G 1889\nU 8619 ; WX 602 ; N uni21AB ; G 1890\nU 8620 ; WX 602 ; N uni21AC ; G 1891\nU 8621 ; WX 602 ; N uni21AD ; G 1892\nU 8622 ; WX 602 ; N uni21AE ; G 1893\nU 8623 ; WX 602 ; N uni21AF ; G 1894\nU 8624 ; WX 602 ; N uni21B0 ; G 1895\nU 8625 ; WX 602 ; N uni21B1 ; G 1896\nU 8626 ; WX 602 ; N uni21B2 ; G 1897\nU 8627 ; WX 602 ; N uni21B3 ; G 1898\nU 8628 ; WX 602 ; N uni21B4 ; G 1899\nU 8629 ; WX 602 ; N carriagereturn ; G 1900\nU 8630 ; WX 602 ; N uni21B6 ; G 1901\nU 8631 ; WX 602 ; N uni21B7 ; G 1902\nU 8632 ; WX 602 ; N uni21B8 ; G 1903\nU 8633 ; WX 602 ; N uni21B9 ; G 1904\nU 8634 ; WX 602 ; N uni21BA ; G 1905\nU 8635 ; WX 602 ; N uni21BB ; G 1906\nU 8636 ; WX 602 ; N uni21BC ; G 1907\nU 8637 ; WX 602 ; N uni21BD ; G 1908\nU 8638 ; WX 602 ; N uni21BE ; G 1909\nU 8639 ; WX 602 ; N uni21BF ; G 1910\nU 8640 ; WX 602 ; N uni21C0 ; G 1911\nU 8641 ; WX 602 ; N uni21C1 ; G 1912\nU 8642 ; WX 602 ; N uni21C2 ; G 1913\nU 8643 ; WX 602 ; N uni21C3 ; G 1914\nU 8644 ; WX 602 ; N uni21C4 ; G 1915\nU 8645 ; WX 602 ; N uni21C5 ; G 1916\nU 8646 ; WX 602 ; N uni21C6 ; G 1917\nU 8647 ; WX 602 ; N uni21C7 ; G 1918\nU 8648 ; WX 602 ; N uni21C8 ; G 1919\nU 8649 ; WX 602 ; N uni21C9 ; G 1920\nU 8650 ; WX 602 ; N uni21CA ; G 1921\nU 8651 ; WX 602 ; N uni21CB ; G 1922\nU 8652 ; WX 602 ; N uni21CC ; G 1923\nU 8653 ; WX 602 ; N uni21CD ; G 1924\nU 8654 ; WX 602 ; N uni21CE ; G 1925\nU 8655 ; WX 602 ; N uni21CF ; G 1926\nU 8656 ; WX 602 ; N arrowdblleft ; G 1927\nU 8657 ; WX 602 ; N arrowdblup ; G 1928\nU 8658 ; WX 602 ; N arrowdblright ; G 1929\nU 8659 ; WX 602 ; N arrowdbldown ; G 1930\nU 8660 ; WX 602 ; N arrowdblboth ; G 1931\nU 8661 ; WX 602 ; N uni21D5 ; G 1932\nU 8662 ; WX 602 ; N uni21D6 ; G 1933\nU 8663 ; WX 602 ; N uni21D7 ; G 1934\nU 8664 ; WX 602 ; N uni21D8 ; G 1935\nU 8665 ; WX 602 ; N uni21D9 ; G 1936\nU 8666 ; WX 602 ; N uni21DA ; G 1937\nU 8667 ; WX 602 ; N uni21DB ; G 1938\nU 8668 ; WX 602 ; N uni21DC ; G 1939\nU 8669 ; WX 602 ; N uni21DD ; G 1940\nU 8670 ; WX 602 ; N uni21DE ; G 1941\nU 8671 ; WX 602 ; N uni21DF ; G 1942\nU 8672 ; WX 602 ; N uni21E0 ; G 1943\nU 8673 ; WX 602 ; N uni21E1 ; G 1944\nU 8674 ; WX 602 ; N uni21E2 ; G 1945\nU 8675 ; WX 602 ; N uni21E3 ; G 1946\nU 8676 ; WX 602 ; N uni21E4 ; G 1947\nU 8677 ; WX 602 ; N uni21E5 ; G 1948\nU 8678 ; WX 602 ; N uni21E6 ; G 1949\nU 8679 ; WX 602 ; N uni21E7 ; G 1950\nU 8680 ; WX 602 ; N uni21E8 ; G 1951\nU 8681 ; WX 602 ; N uni21E9 ; G 1952\nU 8682 ; WX 602 ; N uni21EA ; G 1953\nU 8683 ; WX 602 ; N uni21EB ; G 1954\nU 8684 ; WX 602 ; N uni21EC ; G 1955\nU 8685 ; WX 602 ; N uni21ED ; G 1956\nU 8686 ; WX 602 ; N uni21EE ; G 1957\nU 8687 ; WX 602 ; N uni21EF ; G 1958\nU 8688 ; WX 602 ; N uni21F0 ; G 1959\nU 8689 ; WX 602 ; N uni21F1 ; G 1960\nU 8690 ; WX 602 ; N uni21F2 ; G 1961\nU 8691 ; WX 602 ; N uni21F3 ; G 1962\nU 8692 ; WX 602 ; N uni21F4 ; G 1963\nU 8693 ; WX 602 ; N uni21F5 ; G 1964\nU 8694 ; WX 602 ; N uni21F6 ; G 1965\nU 8695 ; WX 602 ; N uni21F7 ; G 1966\nU 8696 ; WX 602 ; N uni21F8 ; G 1967\nU 8697 ; WX 602 ; N uni21F9 ; G 1968\nU 8698 ; WX 602 ; N uni21FA ; G 1969\nU 8699 ; WX 602 ; N uni21FB ; G 1970\nU 8700 ; WX 602 ; N uni21FC ; G 1971\nU 8701 ; WX 602 ; N uni21FD ; G 1972\nU 8702 ; WX 602 ; N uni21FE ; G 1973\nU 8703 ; WX 602 ; N uni21FF ; G 1974\nU 8704 ; WX 602 ; N universal ; G 1975\nU 8705 ; WX 602 ; N uni2201 ; G 1976\nU 8706 ; WX 602 ; N partialdiff ; G 1977\nU 8707 ; WX 602 ; N existential ; G 1978\nU 8708 ; WX 602 ; N uni2204 ; G 1979\nU 8709 ; WX 602 ; N emptyset ; G 1980\nU 8710 ; WX 602 ; N increment ; G 1981\nU 8711 ; WX 602 ; N gradient ; G 1982\nU 8712 ; WX 602 ; N element ; G 1983\nU 8713 ; WX 602 ; N notelement ; G 1984\nU 8714 ; WX 602 ; N uni220A ; G 1985\nU 8715 ; WX 602 ; N suchthat ; G 1986\nU 8716 ; WX 602 ; N uni220C ; G 1987\nU 8717 ; WX 602 ; N uni220D ; G 1988\nU 8718 ; WX 602 ; N uni220E ; G 1989\nU 8719 ; WX 602 ; N product ; G 1990\nU 8720 ; WX 602 ; N uni2210 ; G 1991\nU 8721 ; WX 602 ; N summation ; G 1992\nU 8722 ; WX 602 ; N minus ; G 1993\nU 8723 ; WX 602 ; N uni2213 ; G 1994\nU 8725 ; WX 602 ; N uni2215 ; G 1995\nU 8727 ; WX 602 ; N asteriskmath ; G 1996\nU 8728 ; WX 602 ; N uni2218 ; G 1997\nU 8729 ; WX 602 ; N uni2219 ; G 1998\nU 8730 ; WX 602 ; N radical ; G 1999\nU 8731 ; WX 602 ; N uni221B ; G 2000\nU 8732 ; WX 602 ; N uni221C ; G 2001\nU 8733 ; WX 602 ; N proportional ; G 2002\nU 8734 ; WX 602 ; N infinity ; G 2003\nU 8735 ; WX 602 ; N orthogonal ; G 2004\nU 8736 ; WX 602 ; N angle ; G 2005\nU 8739 ; WX 602 ; N uni2223 ; G 2006\nU 8743 ; WX 602 ; N logicaland ; G 2007\nU 8744 ; WX 602 ; N logicalor ; G 2008\nU 8745 ; WX 602 ; N intersection ; G 2009\nU 8746 ; WX 602 ; N union ; G 2010\nU 8747 ; WX 602 ; N integral ; G 2011\nU 8748 ; WX 602 ; N uni222C ; G 2012\nU 8749 ; WX 602 ; N uni222D ; G 2013\nU 8756 ; WX 602 ; N therefore ; G 2014\nU 8757 ; WX 602 ; N uni2235 ; G 2015\nU 8758 ; WX 602 ; N uni2236 ; G 2016\nU 8759 ; WX 602 ; N uni2237 ; G 2017\nU 8760 ; WX 602 ; N uni2238 ; G 2018\nU 8761 ; WX 602 ; N uni2239 ; G 2019\nU 8762 ; WX 602 ; N uni223A ; G 2020\nU 8763 ; WX 602 ; N uni223B ; G 2021\nU 8764 ; WX 602 ; N similar ; G 2022\nU 8765 ; WX 602 ; N uni223D ; G 2023\nU 8769 ; WX 602 ; N uni2241 ; G 2024\nU 8770 ; WX 602 ; N uni2242 ; G 2025\nU 8771 ; WX 602 ; N uni2243 ; G 2026\nU 8772 ; WX 602 ; N uni2244 ; G 2027\nU 8773 ; WX 602 ; N congruent ; G 2028\nU 8774 ; WX 602 ; N uni2246 ; G 2029\nU 8775 ; WX 602 ; N uni2247 ; G 2030\nU 8776 ; WX 602 ; N approxequal ; G 2031\nU 8777 ; WX 602 ; N uni2249 ; G 2032\nU 8778 ; WX 602 ; N uni224A ; G 2033\nU 8779 ; WX 602 ; N uni224B ; G 2034\nU 8780 ; WX 602 ; N uni224C ; G 2035\nU 8781 ; WX 602 ; N uni224D ; G 2036\nU 8782 ; WX 602 ; N uni224E ; G 2037\nU 8783 ; WX 602 ; N uni224F ; G 2038\nU 8784 ; WX 602 ; N uni2250 ; G 2039\nU 8785 ; WX 602 ; N uni2251 ; G 2040\nU 8786 ; WX 602 ; N uni2252 ; G 2041\nU 8787 ; WX 602 ; N uni2253 ; G 2042\nU 8788 ; WX 602 ; N uni2254 ; G 2043\nU 8789 ; WX 602 ; N uni2255 ; G 2044\nU 8790 ; WX 602 ; N uni2256 ; G 2045\nU 8791 ; WX 602 ; N uni2257 ; G 2046\nU 8792 ; WX 602 ; N uni2258 ; G 2047\nU 8793 ; WX 602 ; N uni2259 ; G 2048\nU 8794 ; WX 602 ; N uni225A ; G 2049\nU 8795 ; WX 602 ; N uni225B ; G 2050\nU 8796 ; WX 602 ; N uni225C ; G 2051\nU 8797 ; WX 602 ; N uni225D ; G 2052\nU 8798 ; WX 602 ; N uni225E ; G 2053\nU 8799 ; WX 602 ; N uni225F ; G 2054\nU 8800 ; WX 602 ; N notequal ; G 2055\nU 8801 ; WX 602 ; N equivalence ; G 2056\nU 8802 ; WX 602 ; N uni2262 ; G 2057\nU 8803 ; WX 602 ; N uni2263 ; G 2058\nU 8804 ; WX 602 ; N lessequal ; G 2059\nU 8805 ; WX 602 ; N greaterequal ; G 2060\nU 8806 ; WX 602 ; N uni2266 ; G 2061\nU 8807 ; WX 602 ; N uni2267 ; G 2062\nU 8808 ; WX 602 ; N uni2268 ; G 2063\nU 8809 ; WX 602 ; N uni2269 ; G 2064\nU 8813 ; WX 602 ; N uni226D ; G 2065\nU 8814 ; WX 602 ; N uni226E ; G 2066\nU 8815 ; WX 602 ; N uni226F ; G 2067\nU 8816 ; WX 602 ; N uni2270 ; G 2068\nU 8817 ; WX 602 ; N uni2271 ; G 2069\nU 8818 ; WX 602 ; N uni2272 ; G 2070\nU 8819 ; WX 602 ; N uni2273 ; G 2071\nU 8820 ; WX 602 ; N uni2274 ; G 2072\nU 8821 ; WX 602 ; N uni2275 ; G 2073\nU 8822 ; WX 602 ; N uni2276 ; G 2074\nU 8823 ; WX 602 ; N uni2277 ; G 2075\nU 8824 ; WX 602 ; N uni2278 ; G 2076\nU 8825 ; WX 602 ; N uni2279 ; G 2077\nU 8826 ; WX 602 ; N uni227A ; G 2078\nU 8827 ; WX 602 ; N uni227B ; G 2079\nU 8828 ; WX 602 ; N uni227C ; G 2080\nU 8829 ; WX 602 ; N uni227D ; G 2081\nU 8830 ; WX 602 ; N uni227E ; G 2082\nU 8831 ; WX 602 ; N uni227F ; G 2083\nU 8832 ; WX 602 ; N uni2280 ; G 2084\nU 8833 ; WX 602 ; N uni2281 ; G 2085\nU 8834 ; WX 602 ; N propersubset ; G 2086\nU 8835 ; WX 602 ; N propersuperset ; G 2087\nU 8836 ; WX 602 ; N notsubset ; G 2088\nU 8837 ; WX 602 ; N uni2285 ; G 2089\nU 8838 ; WX 602 ; N reflexsubset ; G 2090\nU 8839 ; WX 602 ; N reflexsuperset ; G 2091\nU 8840 ; WX 602 ; N uni2288 ; G 2092\nU 8841 ; WX 602 ; N uni2289 ; G 2093\nU 8842 ; WX 602 ; N uni228A ; G 2094\nU 8843 ; WX 602 ; N uni228B ; G 2095\nU 8845 ; WX 602 ; N uni228D ; G 2096\nU 8846 ; WX 602 ; N uni228E ; G 2097\nU 8847 ; WX 602 ; N uni228F ; G 2098\nU 8848 ; WX 602 ; N uni2290 ; G 2099\nU 8849 ; WX 602 ; N uni2291 ; G 2100\nU 8850 ; WX 602 ; N uni2292 ; G 2101\nU 8851 ; WX 602 ; N uni2293 ; G 2102\nU 8852 ; WX 602 ; N uni2294 ; G 2103\nU 8853 ; WX 602 ; N circleplus ; G 2104\nU 8854 ; WX 602 ; N uni2296 ; G 2105\nU 8855 ; WX 602 ; N circlemultiply ; G 2106\nU 8856 ; WX 602 ; N uni2298 ; G 2107\nU 8857 ; WX 602 ; N uni2299 ; G 2108\nU 8858 ; WX 602 ; N uni229A ; G 2109\nU 8859 ; WX 602 ; N uni229B ; G 2110\nU 8860 ; WX 602 ; N uni229C ; G 2111\nU 8861 ; WX 602 ; N uni229D ; G 2112\nU 8862 ; WX 602 ; N uni229E ; G 2113\nU 8863 ; WX 602 ; N uni229F ; G 2114\nU 8864 ; WX 602 ; N uni22A0 ; G 2115\nU 8865 ; WX 602 ; N uni22A1 ; G 2116\nU 8866 ; WX 602 ; N uni22A2 ; G 2117\nU 8867 ; WX 602 ; N uni22A3 ; G 2118\nU 8868 ; WX 602 ; N uni22A4 ; G 2119\nU 8869 ; WX 602 ; N perpendicular ; G 2120\nU 8882 ; WX 602 ; N uni22B2 ; G 2121\nU 8883 ; WX 602 ; N uni22B3 ; G 2122\nU 8884 ; WX 602 ; N uni22B4 ; G 2123\nU 8885 ; WX 602 ; N uni22B5 ; G 2124\nU 8888 ; WX 602 ; N uni22B8 ; G 2125\nU 8898 ; WX 602 ; N uni22C2 ; G 2126\nU 8899 ; WX 602 ; N uni22C3 ; G 2127\nU 8900 ; WX 602 ; N uni22C4 ; G 2128\nU 8901 ; WX 602 ; N dotmath ; G 2129\nU 8902 ; WX 602 ; N uni22C6 ; G 2130\nU 8909 ; WX 602 ; N uni22CD ; G 2131\nU 8910 ; WX 602 ; N uni22CE ; G 2132\nU 8911 ; WX 602 ; N uni22CF ; G 2133\nU 8912 ; WX 602 ; N uni22D0 ; G 2134\nU 8913 ; WX 602 ; N uni22D1 ; G 2135\nU 8922 ; WX 602 ; N uni22DA ; G 2136\nU 8923 ; WX 602 ; N uni22DB ; G 2137\nU 8924 ; WX 602 ; N uni22DC ; G 2138\nU 8925 ; WX 602 ; N uni22DD ; G 2139\nU 8926 ; WX 602 ; N uni22DE ; G 2140\nU 8927 ; WX 602 ; N uni22DF ; G 2141\nU 8928 ; WX 602 ; N uni22E0 ; G 2142\nU 8929 ; WX 602 ; N uni22E1 ; G 2143\nU 8930 ; WX 602 ; N uni22E2 ; G 2144\nU 8931 ; WX 602 ; N uni22E3 ; G 2145\nU 8932 ; WX 602 ; N uni22E4 ; G 2146\nU 8933 ; WX 602 ; N uni22E5 ; G 2147\nU 8934 ; WX 602 ; N uni22E6 ; G 2148\nU 8935 ; WX 602 ; N uni22E7 ; G 2149\nU 8936 ; WX 602 ; N uni22E8 ; G 2150\nU 8937 ; WX 602 ; N uni22E9 ; G 2151\nU 8943 ; WX 602 ; N uni22EF ; G 2152\nU 8960 ; WX 602 ; N uni2300 ; G 2153\nU 8961 ; WX 602 ; N uni2301 ; G 2154\nU 8962 ; WX 602 ; N house ; G 2155\nU 8963 ; WX 602 ; N uni2303 ; G 2156\nU 8964 ; WX 602 ; N uni2304 ; G 2157\nU 8965 ; WX 602 ; N uni2305 ; G 2158\nU 8966 ; WX 602 ; N uni2306 ; G 2159\nU 8968 ; WX 602 ; N uni2308 ; G 2160\nU 8969 ; WX 602 ; N uni2309 ; G 2161\nU 8970 ; WX 602 ; N uni230A ; G 2162\nU 8971 ; WX 602 ; N uni230B ; G 2163\nU 8972 ; WX 602 ; N uni230C ; G 2164\nU 8973 ; WX 602 ; N uni230D ; G 2165\nU 8974 ; WX 602 ; N uni230E ; G 2166\nU 8975 ; WX 602 ; N uni230F ; G 2167\nU 8976 ; WX 602 ; N revlogicalnot ; G 2168\nU 8977 ; WX 602 ; N uni2311 ; G 2169\nU 8978 ; WX 602 ; N uni2312 ; G 2170\nU 8979 ; WX 602 ; N uni2313 ; G 2171\nU 8980 ; WX 602 ; N uni2314 ; G 2172\nU 8981 ; WX 602 ; N uni2315 ; G 2173\nU 8984 ; WX 602 ; N uni2318 ; G 2174\nU 8985 ; WX 602 ; N uni2319 ; G 2175\nU 8988 ; WX 602 ; N uni231C ; G 2176\nU 8989 ; WX 602 ; N uni231D ; G 2177\nU 8990 ; WX 602 ; N uni231E ; G 2178\nU 8991 ; WX 602 ; N uni231F ; G 2179\nU 8992 ; WX 602 ; N integraltp ; G 2180\nU 8993 ; WX 602 ; N integralbt ; G 2181\nU 8997 ; WX 602 ; N uni2325 ; G 2182\nU 8998 ; WX 602 ; N uni2326 ; G 2183\nU 8999 ; WX 602 ; N uni2327 ; G 2184\nU 9000 ; WX 602 ; N uni2328 ; G 2185\nU 9003 ; WX 602 ; N uni232B ; G 2186\nU 9013 ; WX 602 ; N uni2335 ; G 2187\nU 9014 ; WX 602 ; N uni2336 ; G 2188\nU 9015 ; WX 602 ; N uni2337 ; G 2189\nU 9016 ; WX 602 ; N uni2338 ; G 2190\nU 9017 ; WX 602 ; N uni2339 ; G 2191\nU 9018 ; WX 602 ; N uni233A ; G 2192\nU 9019 ; WX 602 ; N uni233B ; G 2193\nU 9020 ; WX 602 ; N uni233C ; G 2194\nU 9021 ; WX 602 ; N uni233D ; G 2195\nU 9022 ; WX 602 ; N uni233E ; G 2196\nU 9023 ; WX 602 ; N uni233F ; G 2197\nU 9024 ; WX 602 ; N uni2340 ; G 2198\nU 9025 ; WX 602 ; N uni2341 ; G 2199\nU 9026 ; WX 602 ; N uni2342 ; G 2200\nU 9027 ; WX 602 ; N uni2343 ; G 2201\nU 9028 ; WX 602 ; N uni2344 ; G 2202\nU 9029 ; WX 602 ; N uni2345 ; G 2203\nU 9030 ; WX 602 ; N uni2346 ; G 2204\nU 9031 ; WX 602 ; N uni2347 ; G 2205\nU 9032 ; WX 602 ; N uni2348 ; G 2206\nU 9033 ; WX 602 ; N uni2349 ; G 2207\nU 9034 ; WX 602 ; N uni234A ; G 2208\nU 9035 ; WX 602 ; N uni234B ; G 2209\nU 9036 ; WX 602 ; N uni234C ; G 2210\nU 9037 ; WX 602 ; N uni234D ; G 2211\nU 9038 ; WX 602 ; N uni234E ; G 2212\nU 9039 ; WX 602 ; N uni234F ; G 2213\nU 9040 ; WX 602 ; N uni2350 ; G 2214\nU 9041 ; WX 602 ; N uni2351 ; G 2215\nU 9042 ; WX 602 ; N uni2352 ; G 2216\nU 9043 ; WX 602 ; N uni2353 ; G 2217\nU 9044 ; WX 602 ; N uni2354 ; G 2218\nU 9045 ; WX 602 ; N uni2355 ; G 2219\nU 9046 ; WX 602 ; N uni2356 ; G 2220\nU 9047 ; WX 602 ; N uni2357 ; G 2221\nU 9048 ; WX 602 ; N uni2358 ; G 2222\nU 9049 ; WX 602 ; N uni2359 ; G 2223\nU 9050 ; WX 602 ; N uni235A ; G 2224\nU 9051 ; WX 602 ; N uni235B ; G 2225\nU 9052 ; WX 602 ; N uni235C ; G 2226\nU 9053 ; WX 602 ; N uni235D ; G 2227\nU 9054 ; WX 602 ; N uni235E ; G 2228\nU 9055 ; WX 602 ; N uni235F ; G 2229\nU 9056 ; WX 602 ; N uni2360 ; G 2230\nU 9057 ; WX 602 ; N uni2361 ; G 2231\nU 9058 ; WX 602 ; N uni2362 ; G 2232\nU 9059 ; WX 602 ; N uni2363 ; G 2233\nU 9060 ; WX 602 ; N uni2364 ; G 2234\nU 9061 ; WX 602 ; N uni2365 ; G 2235\nU 9062 ; WX 602 ; N uni2366 ; G 2236\nU 9063 ; WX 602 ; N uni2367 ; G 2237\nU 9064 ; WX 602 ; N uni2368 ; G 2238\nU 9065 ; WX 602 ; N uni2369 ; G 2239\nU 9066 ; WX 602 ; N uni236A ; G 2240\nU 9067 ; WX 602 ; N uni236B ; G 2241\nU 9068 ; WX 602 ; N uni236C ; G 2242\nU 9069 ; WX 602 ; N uni236D ; G 2243\nU 9070 ; WX 602 ; N uni236E ; G 2244\nU 9071 ; WX 602 ; N uni236F ; G 2245\nU 9072 ; WX 602 ; N uni2370 ; G 2246\nU 9073 ; WX 602 ; N uni2371 ; G 2247\nU 9074 ; WX 602 ; N uni2372 ; G 2248\nU 9075 ; WX 602 ; N uni2373 ; G 2249\nU 9076 ; WX 602 ; N uni2374 ; G 2250\nU 9077 ; WX 602 ; N uni2375 ; G 2251\nU 9078 ; WX 602 ; N uni2376 ; G 2252\nU 9079 ; WX 602 ; N uni2377 ; G 2253\nU 9080 ; WX 602 ; N uni2378 ; G 2254\nU 9081 ; WX 602 ; N uni2379 ; G 2255\nU 9082 ; WX 602 ; N uni237A ; G 2256\nU 9085 ; WX 602 ; N uni237D ; G 2257\nU 9088 ; WX 602 ; N uni2380 ; G 2258\nU 9089 ; WX 602 ; N uni2381 ; G 2259\nU 9090 ; WX 602 ; N uni2382 ; G 2260\nU 9091 ; WX 602 ; N uni2383 ; G 2261\nU 9096 ; WX 602 ; N uni2388 ; G 2262\nU 9097 ; WX 602 ; N uni2389 ; G 2263\nU 9098 ; WX 602 ; N uni238A ; G 2264\nU 9099 ; WX 602 ; N uni238B ; G 2265\nU 9109 ; WX 602 ; N uni2395 ; G 2266\nU 9115 ; WX 602 ; N uni239B ; G 2267\nU 9116 ; WX 602 ; N uni239C ; G 2268\nU 9117 ; WX 602 ; N uni239D ; G 2269\nU 9118 ; WX 602 ; N uni239E ; G 2270\nU 9119 ; WX 602 ; N uni239F ; G 2271\nU 9120 ; WX 602 ; N uni23A0 ; G 2272\nU 9121 ; WX 602 ; N uni23A1 ; G 2273\nU 9122 ; WX 602 ; N uni23A2 ; G 2274\nU 9123 ; WX 602 ; N uni23A3 ; G 2275\nU 9124 ; WX 602 ; N uni23A4 ; G 2276\nU 9125 ; WX 602 ; N uni23A5 ; G 2277\nU 9126 ; WX 602 ; N uni23A6 ; G 2278\nU 9127 ; WX 602 ; N uni23A7 ; G 2279\nU 9128 ; WX 602 ; N uni23A8 ; G 2280\nU 9129 ; WX 602 ; N uni23A9 ; G 2281\nU 9130 ; WX 602 ; N uni23AA ; G 2282\nU 9131 ; WX 602 ; N uni23AB ; G 2283\nU 9132 ; WX 602 ; N uni23AC ; G 2284\nU 9133 ; WX 602 ; N uni23AD ; G 2285\nU 9134 ; WX 602 ; N uni23AE ; G 2286\nU 9166 ; WX 602 ; N uni23CE ; G 2287\nU 9167 ; WX 602 ; N uni23CF ; G 2288\nU 9251 ; WX 602 ; N uni2423 ; G 2289\nU 9472 ; WX 602 ; N SF100000 ; G 2290\nU 9473 ; WX 602 ; N uni2501 ; G 2291\nU 9474 ; WX 602 ; N SF110000 ; G 2292\nU 9475 ; WX 602 ; N uni2503 ; G 2293\nU 9476 ; WX 602 ; N uni2504 ; G 2294\nU 9477 ; WX 602 ; N uni2505 ; G 2295\nU 9478 ; WX 602 ; N uni2506 ; G 2296\nU 9479 ; WX 602 ; N uni2507 ; G 2297\nU 9480 ; WX 602 ; N uni2508 ; G 2298\nU 9481 ; WX 602 ; N uni2509 ; G 2299\nU 9482 ; WX 602 ; N uni250A ; G 2300\nU 9483 ; WX 602 ; N uni250B ; G 2301\nU 9484 ; WX 602 ; N SF010000 ; G 2302\nU 9485 ; WX 602 ; N uni250D ; G 2303\nU 9486 ; WX 602 ; N uni250E ; G 2304\nU 9487 ; WX 602 ; N uni250F ; G 2305\nU 9488 ; WX 602 ; N SF030000 ; G 2306\nU 9489 ; WX 602 ; N uni2511 ; G 2307\nU 9490 ; WX 602 ; N uni2512 ; G 2308\nU 9491 ; WX 602 ; N uni2513 ; G 2309\nU 9492 ; WX 602 ; N SF020000 ; G 2310\nU 9493 ; WX 602 ; N uni2515 ; G 2311\nU 9494 ; WX 602 ; N uni2516 ; G 2312\nU 9495 ; WX 602 ; N uni2517 ; G 2313\nU 9496 ; WX 602 ; N SF040000 ; G 2314\nU 9497 ; WX 602 ; N uni2519 ; G 2315\nU 9498 ; WX 602 ; N uni251A ; G 2316\nU 9499 ; WX 602 ; N uni251B ; G 2317\nU 9500 ; WX 602 ; N SF080000 ; G 2318\nU 9501 ; WX 602 ; N uni251D ; G 2319\nU 9502 ; WX 602 ; N uni251E ; G 2320\nU 9503 ; WX 602 ; N uni251F ; G 2321\nU 9504 ; WX 602 ; N uni2520 ; G 2322\nU 9505 ; WX 602 ; N uni2521 ; G 2323\nU 9506 ; WX 602 ; N uni2522 ; G 2324\nU 9507 ; WX 602 ; N uni2523 ; G 2325\nU 9508 ; WX 602 ; N SF090000 ; G 2326\nU 9509 ; WX 602 ; N uni2525 ; G 2327\nU 9510 ; WX 602 ; N uni2526 ; G 2328\nU 9511 ; WX 602 ; N uni2527 ; G 2329\nU 9512 ; WX 602 ; N uni2528 ; G 2330\nU 9513 ; WX 602 ; N uni2529 ; G 2331\nU 9514 ; WX 602 ; N uni252A ; G 2332\nU 9515 ; WX 602 ; N uni252B ; G 2333\nU 9516 ; WX 602 ; N SF060000 ; G 2334\nU 9517 ; WX 602 ; N uni252D ; G 2335\nU 9518 ; WX 602 ; N uni252E ; G 2336\nU 9519 ; WX 602 ; N uni252F ; G 2337\nU 9520 ; WX 602 ; N uni2530 ; G 2338\nU 9521 ; WX 602 ; N uni2531 ; G 2339\nU 9522 ; WX 602 ; N uni2532 ; G 2340\nU 9523 ; WX 602 ; N uni2533 ; G 2341\nU 9524 ; WX 602 ; N SF070000 ; G 2342\nU 9525 ; WX 602 ; N uni2535 ; G 2343\nU 9526 ; WX 602 ; N uni2536 ; G 2344\nU 9527 ; WX 602 ; N uni2537 ; G 2345\nU 9528 ; WX 602 ; N uni2538 ; G 2346\nU 9529 ; WX 602 ; N uni2539 ; G 2347\nU 9530 ; WX 602 ; N uni253A ; G 2348\nU 9531 ; WX 602 ; N uni253B ; G 2349\nU 9532 ; WX 602 ; N SF050000 ; G 2350\nU 9533 ; WX 602 ; N uni253D ; G 2351\nU 9534 ; WX 602 ; N uni253E ; G 2352\nU 9535 ; WX 602 ; N uni253F ; G 2353\nU 9536 ; WX 602 ; N uni2540 ; G 2354\nU 9537 ; WX 602 ; N uni2541 ; G 2355\nU 9538 ; WX 602 ; N uni2542 ; G 2356\nU 9539 ; WX 602 ; N uni2543 ; G 2357\nU 9540 ; WX 602 ; N uni2544 ; G 2358\nU 9541 ; WX 602 ; N uni2545 ; G 2359\nU 9542 ; WX 602 ; N uni2546 ; G 2360\nU 9543 ; WX 602 ; N uni2547 ; G 2361\nU 9544 ; WX 602 ; N uni2548 ; G 2362\nU 9545 ; WX 602 ; N uni2549 ; G 2363\nU 9546 ; WX 602 ; N uni254A ; G 2364\nU 9547 ; WX 602 ; N uni254B ; G 2365\nU 9548 ; WX 602 ; N uni254C ; G 2366\nU 9549 ; WX 602 ; N uni254D ; G 2367\nU 9550 ; WX 602 ; N uni254E ; G 2368\nU 9551 ; WX 602 ; N uni254F ; G 2369\nU 9552 ; WX 602 ; N SF430000 ; G 2370\nU 9553 ; WX 602 ; N SF240000 ; G 2371\nU 9554 ; WX 602 ; N SF510000 ; G 2372\nU 9555 ; WX 602 ; N SF520000 ; G 2373\nU 9556 ; WX 602 ; N SF390000 ; G 2374\nU 9557 ; WX 602 ; N SF220000 ; G 2375\nU 9558 ; WX 602 ; N SF210000 ; G 2376\nU 9559 ; WX 602 ; N SF250000 ; G 2377\nU 9560 ; WX 602 ; N SF500000 ; G 2378\nU 9561 ; WX 602 ; N SF490000 ; G 2379\nU 9562 ; WX 602 ; N SF380000 ; G 2380\nU 9563 ; WX 602 ; N SF280000 ; G 2381\nU 9564 ; WX 602 ; N SF270000 ; G 2382\nU 9565 ; WX 602 ; N SF260000 ; G 2383\nU 9566 ; WX 602 ; N SF360000 ; G 2384\nU 9567 ; WX 602 ; N SF370000 ; G 2385\nU 9568 ; WX 602 ; N SF420000 ; G 2386\nU 9569 ; WX 602 ; N SF190000 ; G 2387\nU 9570 ; WX 602 ; N SF200000 ; G 2388\nU 9571 ; WX 602 ; N SF230000 ; G 2389\nU 9572 ; WX 602 ; N SF470000 ; G 2390\nU 9573 ; WX 602 ; N SF480000 ; G 2391\nU 9574 ; WX 602 ; N SF410000 ; G 2392\nU 9575 ; WX 602 ; N SF450000 ; G 2393\nU 9576 ; WX 602 ; N SF460000 ; G 2394\nU 9577 ; WX 602 ; N SF400000 ; G 2395\nU 9578 ; WX 602 ; N SF540000 ; G 2396\nU 9579 ; WX 602 ; N SF530000 ; G 2397\nU 9580 ; WX 602 ; N SF440000 ; G 2398\nU 9581 ; WX 602 ; N uni256D ; G 2399\nU 9582 ; WX 602 ; N uni256E ; G 2400\nU 9583 ; WX 602 ; N uni256F ; G 2401\nU 9584 ; WX 602 ; N uni2570 ; G 2402\nU 9585 ; WX 602 ; N uni2571 ; G 2403\nU 9586 ; WX 602 ; N uni2572 ; G 2404\nU 9587 ; WX 602 ; N uni2573 ; G 2405\nU 9588 ; WX 602 ; N uni2574 ; G 2406\nU 9589 ; WX 602 ; N uni2575 ; G 2407\nU 9590 ; WX 602 ; N uni2576 ; G 2408\nU 9591 ; WX 602 ; N uni2577 ; G 2409\nU 9592 ; WX 602 ; N uni2578 ; G 2410\nU 9593 ; WX 602 ; N uni2579 ; G 2411\nU 9594 ; WX 602 ; N uni257A ; G 2412\nU 9595 ; WX 602 ; N uni257B ; G 2413\nU 9596 ; WX 602 ; N uni257C ; G 2414\nU 9597 ; WX 602 ; N uni257D ; G 2415\nU 9598 ; WX 602 ; N uni257E ; G 2416\nU 9599 ; WX 602 ; N uni257F ; G 2417\nU 9600 ; WX 602 ; N upblock ; G 2418\nU 9601 ; WX 602 ; N uni2581 ; G 2419\nU 9602 ; WX 602 ; N uni2582 ; G 2420\nU 9603 ; WX 602 ; N uni2583 ; G 2421\nU 9604 ; WX 602 ; N dnblock ; G 2422\nU 9605 ; WX 602 ; N uni2585 ; G 2423\nU 9606 ; WX 602 ; N uni2586 ; G 2424\nU 9607 ; WX 602 ; N uni2587 ; G 2425\nU 9608 ; WX 602 ; N block ; G 2426\nU 9609 ; WX 602 ; N uni2589 ; G 2427\nU 9610 ; WX 602 ; N uni258A ; G 2428\nU 9611 ; WX 602 ; N uni258B ; G 2429\nU 9612 ; WX 602 ; N lfblock ; G 2430\nU 9613 ; WX 602 ; N uni258D ; G 2431\nU 9614 ; WX 602 ; N uni258E ; G 2432\nU 9615 ; WX 602 ; N uni258F ; G 2433\nU 9616 ; WX 602 ; N rtblock ; G 2434\nU 9617 ; WX 602 ; N ltshade ; G 2435\nU 9618 ; WX 602 ; N shade ; G 2436\nU 9619 ; WX 602 ; N dkshade ; G 2437\nU 9620 ; WX 602 ; N uni2594 ; G 2438\nU 9621 ; WX 602 ; N uni2595 ; G 2439\nU 9622 ; WX 602 ; N uni2596 ; G 2440\nU 9623 ; WX 602 ; N uni2597 ; G 2441\nU 9624 ; WX 602 ; N uni2598 ; G 2442\nU 9625 ; WX 602 ; N uni2599 ; G 2443\nU 9626 ; WX 602 ; N uni259A ; G 2444\nU 9627 ; WX 602 ; N uni259B ; G 2445\nU 9628 ; WX 602 ; N uni259C ; G 2446\nU 9629 ; WX 602 ; N uni259D ; G 2447\nU 9630 ; WX 602 ; N uni259E ; G 2448\nU 9631 ; WX 602 ; N uni259F ; G 2449\nU 9632 ; WX 602 ; N filledbox ; G 2450\nU 9633 ; WX 602 ; N H22073 ; G 2451\nU 9634 ; WX 602 ; N uni25A2 ; G 2452\nU 9635 ; WX 602 ; N uni25A3 ; G 2453\nU 9636 ; WX 602 ; N uni25A4 ; G 2454\nU 9637 ; WX 602 ; N uni25A5 ; G 2455\nU 9638 ; WX 602 ; N uni25A6 ; G 2456\nU 9639 ; WX 602 ; N uni25A7 ; G 2457\nU 9640 ; WX 602 ; N uni25A8 ; G 2458\nU 9641 ; WX 602 ; N uni25A9 ; G 2459\nU 9642 ; WX 602 ; N H18543 ; G 2460\nU 9643 ; WX 602 ; N H18551 ; G 2461\nU 9644 ; WX 602 ; N filledrect ; G 2462\nU 9645 ; WX 602 ; N uni25AD ; G 2463\nU 9646 ; WX 602 ; N uni25AE ; G 2464\nU 9647 ; WX 602 ; N uni25AF ; G 2465\nU 9648 ; WX 602 ; N uni25B0 ; G 2466\nU 9649 ; WX 602 ; N uni25B1 ; G 2467\nU 9650 ; WX 602 ; N triagup ; G 2468\nU 9651 ; WX 602 ; N uni25B3 ; G 2469\nU 9652 ; WX 602 ; N uni25B4 ; G 2470\nU 9653 ; WX 602 ; N uni25B5 ; G 2471\nU 9654 ; WX 602 ; N uni25B6 ; G 2472\nU 9655 ; WX 602 ; N uni25B7 ; G 2473\nU 9656 ; WX 602 ; N uni25B8 ; G 2474\nU 9657 ; WX 602 ; N uni25B9 ; G 2475\nU 9658 ; WX 602 ; N triagrt ; G 2476\nU 9659 ; WX 602 ; N uni25BB ; G 2477\nU 9660 ; WX 602 ; N triagdn ; G 2478\nU 9661 ; WX 602 ; N uni25BD ; G 2479\nU 9662 ; WX 602 ; N uni25BE ; G 2480\nU 9663 ; WX 602 ; N uni25BF ; G 2481\nU 9664 ; WX 602 ; N uni25C0 ; G 2482\nU 9665 ; WX 602 ; N uni25C1 ; G 2483\nU 9666 ; WX 602 ; N uni25C2 ; G 2484\nU 9667 ; WX 602 ; N uni25C3 ; G 2485\nU 9668 ; WX 602 ; N triaglf ; G 2486\nU 9669 ; WX 602 ; N uni25C5 ; G 2487\nU 9670 ; WX 602 ; N uni25C6 ; G 2488\nU 9671 ; WX 602 ; N uni25C7 ; G 2489\nU 9672 ; WX 602 ; N uni25C8 ; G 2490\nU 9673 ; WX 602 ; N uni25C9 ; G 2491\nU 9674 ; WX 602 ; N lozenge ; G 2492\nU 9675 ; WX 602 ; N circle ; G 2493\nU 9676 ; WX 602 ; N uni25CC ; G 2494\nU 9677 ; WX 602 ; N uni25CD ; G 2495\nU 9678 ; WX 602 ; N uni25CE ; G 2496\nU 9679 ; WX 602 ; N H18533 ; G 2497\nU 9680 ; WX 602 ; N uni25D0 ; G 2498\nU 9681 ; WX 602 ; N uni25D1 ; G 2499\nU 9682 ; WX 602 ; N uni25D2 ; G 2500\nU 9683 ; WX 602 ; N uni25D3 ; G 2501\nU 9684 ; WX 602 ; N uni25D4 ; G 2502\nU 9685 ; WX 602 ; N uni25D5 ; G 2503\nU 9686 ; WX 602 ; N uni25D6 ; G 2504\nU 9687 ; WX 602 ; N uni25D7 ; G 2505\nU 9688 ; WX 602 ; N invbullet ; G 2506\nU 9689 ; WX 602 ; N invcircle ; G 2507\nU 9690 ; WX 602 ; N uni25DA ; G 2508\nU 9691 ; WX 602 ; N uni25DB ; G 2509\nU 9692 ; WX 602 ; N uni25DC ; G 2510\nU 9693 ; WX 602 ; N uni25DD ; G 2511\nU 9694 ; WX 602 ; N uni25DE ; G 2512\nU 9695 ; WX 602 ; N uni25DF ; G 2513\nU 9696 ; WX 602 ; N uni25E0 ; G 2514\nU 9697 ; WX 602 ; N uni25E1 ; G 2515\nU 9698 ; WX 602 ; N uni25E2 ; G 2516\nU 9699 ; WX 602 ; N uni25E3 ; G 2517\nU 9700 ; WX 602 ; N uni25E4 ; G 2518\nU 9701 ; WX 602 ; N uni25E5 ; G 2519\nU 9702 ; WX 602 ; N openbullet ; G 2520\nU 9703 ; WX 602 ; N uni25E7 ; G 2521\nU 9704 ; WX 602 ; N uni25E8 ; G 2522\nU 9705 ; WX 602 ; N uni25E9 ; G 2523\nU 9706 ; WX 602 ; N uni25EA ; G 2524\nU 9707 ; WX 602 ; N uni25EB ; G 2525\nU 9708 ; WX 602 ; N uni25EC ; G 2526\nU 9709 ; WX 602 ; N uni25ED ; G 2527\nU 9710 ; WX 602 ; N uni25EE ; G 2528\nU 9711 ; WX 602 ; N uni25EF ; G 2529\nU 9712 ; WX 602 ; N uni25F0 ; G 2530\nU 9713 ; WX 602 ; N uni25F1 ; G 2531\nU 9714 ; WX 602 ; N uni25F2 ; G 2532\nU 9715 ; WX 602 ; N uni25F3 ; G 2533\nU 9716 ; WX 602 ; N uni25F4 ; G 2534\nU 9717 ; WX 602 ; N uni25F5 ; G 2535\nU 9718 ; WX 602 ; N uni25F6 ; G 2536\nU 9719 ; WX 602 ; N uni25F7 ; G 2537\nU 9720 ; WX 602 ; N uni25F8 ; G 2538\nU 9721 ; WX 602 ; N uni25F9 ; G 2539\nU 9722 ; WX 602 ; N uni25FA ; G 2540\nU 9723 ; WX 602 ; N uni25FB ; G 2541\nU 9724 ; WX 602 ; N uni25FC ; G 2542\nU 9725 ; WX 602 ; N uni25FD ; G 2543\nU 9726 ; WX 602 ; N uni25FE ; G 2544\nU 9727 ; WX 602 ; N uni25FF ; G 2545\nU 9728 ; WX 602 ; N uni2600 ; G 2546\nU 9784 ; WX 602 ; N uni2638 ; G 2547\nU 9785 ; WX 602 ; N uni2639 ; G 2548\nU 9786 ; WX 602 ; N smileface ; G 2549\nU 9787 ; WX 602 ; N invsmileface ; G 2550\nU 9788 ; WX 602 ; N sun ; G 2551\nU 9791 ; WX 602 ; N uni263F ; G 2552\nU 9792 ; WX 602 ; N female ; G 2553\nU 9793 ; WX 602 ; N uni2641 ; G 2554\nU 9794 ; WX 602 ; N male ; G 2555\nU 9795 ; WX 602 ; N uni2643 ; G 2556\nU 9796 ; WX 602 ; N uni2644 ; G 2557\nU 9797 ; WX 602 ; N uni2645 ; G 2558\nU 9798 ; WX 602 ; N uni2646 ; G 2559\nU 9799 ; WX 602 ; N uni2647 ; G 2560\nU 9824 ; WX 602 ; N spade ; G 2561\nU 9825 ; WX 602 ; N uni2661 ; G 2562\nU 9826 ; WX 602 ; N uni2662 ; G 2563\nU 9827 ; WX 602 ; N club ; G 2564\nU 9828 ; WX 602 ; N uni2664 ; G 2565\nU 9829 ; WX 602 ; N heart ; G 2566\nU 9830 ; WX 602 ; N diamond ; G 2567\nU 9831 ; WX 602 ; N uni2667 ; G 2568\nU 9833 ; WX 602 ; N uni2669 ; G 2569\nU 9834 ; WX 602 ; N musicalnote ; G 2570\nU 9835 ; WX 602 ; N musicalnotedbl ; G 2571\nU 9836 ; WX 602 ; N uni266C ; G 2572\nU 9837 ; WX 602 ; N uni266D ; G 2573\nU 9838 ; WX 602 ; N uni266E ; G 2574\nU 9839 ; WX 602 ; N uni266F ; G 2575\nU 10178 ; WX 602 ; N uni27C2 ; G 2576\nU 10181 ; WX 602 ; N uni27C5 ; G 2577\nU 10182 ; WX 602 ; N uni27C6 ; G 2578\nU 10204 ; WX 602 ; N uni27DC ; G 2579\nU 10208 ; WX 602 ; N uni27E0 ; G 2580\nU 10214 ; WX 602 ; N uni27E6 ; G 2581\nU 10215 ; WX 602 ; N uni27E7 ; G 2582\nU 10216 ; WX 602 ; N uni27E8 ; G 2583\nU 10217 ; WX 602 ; N uni27E9 ; G 2584\nU 10218 ; WX 602 ; N uni27EA ; G 2585\nU 10219 ; WX 602 ; N uni27EB ; G 2586\nU 10229 ; WX 602 ; N uni27F5 ; G 2587\nU 10230 ; WX 602 ; N uni27F6 ; G 2588\nU 10231 ; WX 602 ; N uni27F7 ; G 2589\nU 10631 ; WX 602 ; N uni2987 ; G 2590\nU 10632 ; WX 602 ; N uni2988 ; G 2591\nU 10647 ; WX 602 ; N uni2997 ; G 2592\nU 10648 ; WX 602 ; N uni2998 ; G 2593\nU 10731 ; WX 602 ; N uni29EB ; G 2594\nU 10746 ; WX 602 ; N uni29FA ; G 2595\nU 10747 ; WX 602 ; N uni29FB ; G 2596\nU 10752 ; WX 602 ; N uni2A00 ; G 2597\nU 10799 ; WX 602 ; N uni2A2F ; G 2598\nU 10858 ; WX 602 ; N uni2A6A ; G 2599\nU 10859 ; WX 602 ; N uni2A6B ; G 2600\nU 11013 ; WX 602 ; N uni2B05 ; G 2601\nU 11014 ; WX 602 ; N uni2B06 ; G 2602\nU 11015 ; WX 602 ; N uni2B07 ; G 2603\nU 11016 ; WX 602 ; N uni2B08 ; G 2604\nU 11017 ; WX 602 ; N uni2B09 ; G 2605\nU 11018 ; WX 602 ; N uni2B0A ; G 2606\nU 11019 ; WX 602 ; N uni2B0B ; G 2607\nU 11020 ; WX 602 ; N uni2B0C ; G 2608\nU 11021 ; WX 602 ; N uni2B0D ; G 2609\nU 11026 ; WX 602 ; N uni2B12 ; G 2610\nU 11027 ; WX 602 ; N uni2B13 ; G 2611\nU 11028 ; WX 602 ; N uni2B14 ; G 2612\nU 11029 ; WX 602 ; N uni2B15 ; G 2613\nU 11030 ; WX 602 ; N uni2B16 ; G 2614\nU 11031 ; WX 602 ; N uni2B17 ; G 2615\nU 11032 ; WX 602 ; N uni2B18 ; G 2616\nU 11033 ; WX 602 ; N uni2B19 ; G 2617\nU 11034 ; WX 602 ; N uni2B1A ; G 2618\nU 11364 ; WX 602 ; N uni2C64 ; G 2619\nU 11373 ; WX 602 ; N uni2C6D ; G 2620\nU 11374 ; WX 602 ; N uni2C6E ; G 2621\nU 11375 ; WX 602 ; N uni2C6F ; G 2622\nU 11376 ; WX 602 ; N uni2C70 ; G 2623\nU 11381 ; WX 602 ; N uni2C75 ; G 2624\nU 11382 ; WX 602 ; N uni2C76 ; G 2625\nU 11383 ; WX 602 ; N uni2C77 ; G 2626\nU 11385 ; WX 602 ; N uni2C79 ; G 2627\nU 11386 ; WX 602 ; N uni2C7A ; G 2628\nU 11388 ; WX 602 ; N uni2C7C ; G 2629\nU 11389 ; WX 602 ; N uni2C7D ; G 2630\nU 11390 ; WX 602 ; N uni2C7E ; G 2631\nU 11391 ; WX 602 ; N uni2C7F ; G 2632\nU 11800 ; WX 602 ; N uni2E18 ; G 2633\nU 11807 ; WX 602 ; N uni2E1F ; G 2634\nU 11810 ; WX 602 ; N uni2E22 ; G 2635\nU 11811 ; WX 602 ; N uni2E23 ; G 2636\nU 11812 ; WX 602 ; N uni2E24 ; G 2637\nU 11813 ; WX 602 ; N uni2E25 ; G 2638\nU 11822 ; WX 602 ; N uni2E2E ; G 2639\nU 42760 ; WX 602 ; N uniA708 ; G 2640\nU 42761 ; WX 602 ; N uniA709 ; G 2641\nU 42762 ; WX 602 ; N uniA70A ; G 2642\nU 42763 ; WX 602 ; N uniA70B ; G 2643\nU 42764 ; WX 602 ; N uniA70C ; G 2644\nU 42765 ; WX 602 ; N uniA70D ; G 2645\nU 42766 ; WX 602 ; N uniA70E ; G 2646\nU 42767 ; WX 602 ; N uniA70F ; G 2647\nU 42768 ; WX 602 ; N uniA710 ; G 2648\nU 42769 ; WX 602 ; N uniA711 ; G 2649\nU 42770 ; WX 602 ; N uniA712 ; G 2650\nU 42771 ; WX 602 ; N uniA713 ; G 2651\nU 42772 ; WX 602 ; N uniA714 ; G 2652\nU 42773 ; WX 602 ; N uniA715 ; G 2653\nU 42774 ; WX 602 ; N uniA716 ; G 2654\nU 42779 ; WX 602 ; N uniA71B ; G 2655\nU 42780 ; WX 602 ; N uniA71C ; G 2656\nU 42781 ; WX 602 ; N uniA71D ; G 2657\nU 42782 ; WX 602 ; N uniA71E ; G 2658\nU 42783 ; WX 602 ; N uniA71F ; G 2659\nU 42786 ; WX 602 ; N uniA722 ; G 2660\nU 42787 ; WX 602 ; N uniA723 ; G 2661\nU 42788 ; WX 602 ; N uniA724 ; G 2662\nU 42789 ; WX 602 ; N uniA725 ; G 2663\nU 42790 ; WX 602 ; N uniA726 ; G 2664\nU 42791 ; WX 602 ; N uniA727 ; G 2665\nU 42889 ; WX 602 ; N uniA789 ; G 2666\nU 42890 ; WX 602 ; N uniA78A ; G 2667\nU 42891 ; WX 602 ; N uniA78B ; G 2668\nU 42892 ; WX 602 ; N uniA78C ; G 2669\nU 42893 ; WX 602 ; N uniA78D ; G 2670\nU 42894 ; WX 602 ; N uniA78E ; G 2671\nU 42896 ; WX 602 ; N uniA790 ; G 2672\nU 42897 ; WX 602 ; N uniA791 ; G 2673\nU 42922 ; WX 602 ; N uniA7AA ; G 2674\nU 43000 ; WX 602 ; N uniA7F8 ; G 2675\nU 43001 ; WX 602 ; N uniA7F9 ; G 2676\nU 63173 ; WX 602 ; N uniF6C5 ; G 2677\nU 64257 ; WX 602 ; N fi ; G 2678\nU 64258 ; WX 602 ; N fl ; G 2679\nU 65529 ; WX 602 ; N uniFFF9 ; G 2680\nU 65530 ; WX 602 ; N uniFFFA ; G 2681\nU 65531 ; WX 602 ; N uniFFFB ; G 2682\nU 65532 ; WX 602 ; N uniFFFC ; G 2683\nU 65533 ; WX 602 ; N uniFFFD ; G 2684\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans Mono\nFontSubfamily Oblique\nUniqueID DejaVu Sans Mono Oblique\nFullName DejaVu Sans Mono Oblique\nVersion Version 2.37\nPostScriptName DejaVuSansMono-Oblique\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nWeight Medium\nItalicAngle -11\nIsFixedPitch true\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -403 -375 746 998\nStartCharMetrics 2710\nU 32 ; WX 602 ; N space ; G 3\nU 33 ; WX 602 ; N exclam ; G 4\nU 34 ; WX 602 ; N quotedbl ; G 5\nU 35 ; WX 602 ; N numbersign ; G 6\nU 36 ; WX 602 ; N dollar ; G 7\nU 37 ; WX 602 ; N percent ; G 8\nU 38 ; WX 602 ; N ampersand ; G 9\nU 39 ; WX 602 ; N quotesingle ; G 10\nU 40 ; WX 602 ; N parenleft ; G 11\nU 41 ; WX 602 ; N parenright ; G 12\nU 42 ; WX 602 ; N asterisk ; G 13\nU 43 ; WX 602 ; N plus ; G 14\nU 44 ; WX 602 ; N comma ; G 15\nU 45 ; WX 602 ; N hyphen ; G 16\nU 46 ; WX 602 ; N period ; G 17\nU 47 ; WX 602 ; N slash ; G 18\nU 48 ; WX 602 ; N zero ; G 19\nU 49 ; WX 602 ; N one ; G 20\nU 50 ; WX 602 ; N two ; G 21\nU 51 ; WX 602 ; N three ; G 22\nU 52 ; WX 602 ; N four ; G 23\nU 53 ; WX 602 ; N five ; G 24\nU 54 ; WX 602 ; N six ; G 25\nU 55 ; WX 602 ; N seven ; G 26\nU 56 ; WX 602 ; N eight ; G 27\nU 57 ; WX 602 ; N nine ; G 28\nU 58 ; WX 602 ; N colon ; G 29\nU 59 ; WX 602 ; N semicolon ; G 30\nU 60 ; WX 602 ; N less ; G 31\nU 61 ; WX 602 ; N equal ; G 32\nU 62 ; WX 602 ; N greater ; G 33\nU 63 ; WX 602 ; N question ; G 34\nU 64 ; WX 602 ; N at ; G 35\nU 65 ; WX 602 ; N A ; G 36\nU 66 ; WX 602 ; N B ; G 37\nU 67 ; WX 602 ; N C ; G 38\nU 68 ; WX 602 ; N D ; G 39\nU 69 ; WX 602 ; N E ; G 40\nU 70 ; WX 602 ; N F ; G 41\nU 71 ; WX 602 ; N G ; G 42\nU 72 ; WX 602 ; N H ; G 43\nU 73 ; WX 602 ; N I ; G 44\nU 74 ; WX 602 ; N J ; G 45\nU 75 ; WX 602 ; N K ; G 46\nU 76 ; WX 602 ; N L ; G 47\nU 77 ; WX 602 ; N M ; G 48\nU 78 ; WX 602 ; N N ; G 49\nU 79 ; WX 602 ; N O ; G 50\nU 80 ; WX 602 ; N P ; G 51\nU 81 ; WX 602 ; N Q ; G 52\nU 82 ; WX 602 ; N R ; G 53\nU 83 ; WX 602 ; N S ; G 54\nU 84 ; WX 602 ; N T ; G 55\nU 85 ; WX 602 ; N U ; G 56\nU 86 ; WX 602 ; N V ; G 57\nU 87 ; WX 602 ; N W ; G 58\nU 88 ; WX 602 ; N X ; G 59\nU 89 ; WX 602 ; N Y ; G 60\nU 90 ; WX 602 ; N Z ; G 61\nU 91 ; WX 602 ; N bracketleft ; G 62\nU 92 ; WX 602 ; N backslash ; G 63\nU 93 ; WX 602 ; N bracketright ; G 64\nU 94 ; WX 602 ; N asciicircum ; G 65\nU 95 ; WX 602 ; N underscore ; G 66\nU 96 ; WX 602 ; N grave ; G 67\nU 97 ; WX 602 ; N a ; G 68\nU 98 ; WX 602 ; N b ; G 69\nU 99 ; WX 602 ; N c ; G 70\nU 100 ; WX 602 ; N d ; G 71\nU 101 ; WX 602 ; N e ; G 72\nU 102 ; WX 602 ; N f ; G 73\nU 103 ; WX 602 ; N g ; G 74\nU 104 ; WX 602 ; N h ; G 75\nU 105 ; WX 602 ; N i ; G 76\nU 106 ; WX 602 ; N j ; G 77\nU 107 ; WX 602 ; N k ; G 78\nU 108 ; WX 602 ; N l ; G 79\nU 109 ; WX 602 ; N m ; G 80\nU 110 ; WX 602 ; N n ; G 81\nU 111 ; WX 602 ; N o ; G 82\nU 112 ; WX 602 ; N p ; G 83\nU 113 ; WX 602 ; N q ; G 84\nU 114 ; WX 602 ; N r ; G 85\nU 115 ; WX 602 ; N s ; G 86\nU 116 ; WX 602 ; N t ; G 87\nU 117 ; WX 602 ; N u ; G 88\nU 118 ; WX 602 ; N v ; G 89\nU 119 ; WX 602 ; N w ; G 90\nU 120 ; WX 602 ; N x ; G 91\nU 121 ; WX 602 ; N y ; G 92\nU 122 ; WX 602 ; N z ; G 93\nU 123 ; WX 602 ; N braceleft ; G 94\nU 124 ; WX 602 ; N bar ; G 95\nU 125 ; WX 602 ; N braceright ; G 96\nU 126 ; WX 602 ; N asciitilde ; G 97\nU 160 ; WX 602 ; N nbspace ; G 98\nU 161 ; WX 602 ; N exclamdown ; G 99\nU 162 ; WX 602 ; N cent ; G 100\nU 163 ; WX 602 ; N sterling ; G 101\nU 164 ; WX 602 ; N currency ; G 102\nU 165 ; WX 602 ; N yen ; G 103\nU 166 ; WX 602 ; N brokenbar ; G 104\nU 167 ; WX 602 ; N section ; G 105\nU 168 ; WX 602 ; N dieresis ; G 106\nU 169 ; WX 602 ; N copyright ; G 107\nU 170 ; WX 602 ; N ordfeminine ; G 108\nU 171 ; WX 602 ; N guillemotleft ; G 109\nU 172 ; WX 602 ; N logicalnot ; G 110\nU 173 ; WX 602 ; N sfthyphen ; G 111\nU 174 ; WX 602 ; N registered ; G 112\nU 175 ; WX 602 ; N macron ; G 113\nU 176 ; WX 602 ; N degree ; G 114\nU 177 ; WX 602 ; N plusminus ; G 115\nU 178 ; WX 602 ; N twosuperior ; G 116\nU 179 ; WX 602 ; N threesuperior ; G 117\nU 180 ; WX 602 ; N acute ; G 118\nU 181 ; WX 602 ; N mu ; G 119\nU 182 ; WX 602 ; N paragraph ; G 120\nU 183 ; WX 602 ; N periodcentered ; G 121\nU 184 ; WX 602 ; N cedilla ; G 122\nU 185 ; WX 602 ; N onesuperior ; G 123\nU 186 ; WX 602 ; N ordmasculine ; G 124\nU 187 ; WX 602 ; N guillemotright ; G 125\nU 188 ; WX 602 ; N onequarter ; G 126\nU 189 ; WX 602 ; N onehalf ; G 127\nU 190 ; WX 602 ; N threequarters ; G 128\nU 191 ; WX 602 ; N questiondown ; G 129\nU 192 ; WX 602 ; N Agrave ; G 130\nU 193 ; WX 602 ; N Aacute ; G 131\nU 194 ; WX 602 ; N Acircumflex ; G 132\nU 195 ; WX 602 ; N Atilde ; G 133\nU 196 ; WX 602 ; N Adieresis ; G 134\nU 197 ; WX 602 ; N Aring ; G 135\nU 198 ; WX 602 ; N AE ; G 136\nU 199 ; WX 602 ; N Ccedilla ; G 137\nU 200 ; WX 602 ; N Egrave ; G 138\nU 201 ; WX 602 ; N Eacute ; G 139\nU 202 ; WX 602 ; N Ecircumflex ; G 140\nU 203 ; WX 602 ; N Edieresis ; G 141\nU 204 ; WX 602 ; N Igrave ; G 142\nU 205 ; WX 602 ; N Iacute ; G 143\nU 206 ; WX 602 ; N Icircumflex ; G 144\nU 207 ; WX 602 ; N Idieresis ; G 145\nU 208 ; WX 602 ; N Eth ; G 146\nU 209 ; WX 602 ; N Ntilde ; G 147\nU 210 ; WX 602 ; N Ograve ; G 148\nU 211 ; WX 602 ; N Oacute ; G 149\nU 212 ; WX 602 ; N Ocircumflex ; G 150\nU 213 ; WX 602 ; N Otilde ; G 151\nU 214 ; WX 602 ; N Odieresis ; G 152\nU 215 ; WX 602 ; N multiply ; G 153\nU 216 ; WX 602 ; N Oslash ; G 154\nU 217 ; WX 602 ; N Ugrave ; G 155\nU 218 ; WX 602 ; N Uacute ; G 156\nU 219 ; WX 602 ; N Ucircumflex ; G 157\nU 220 ; WX 602 ; N Udieresis ; G 158\nU 221 ; WX 602 ; N Yacute ; G 159\nU 222 ; WX 602 ; N Thorn ; G 160\nU 223 ; WX 602 ; N germandbls ; G 161\nU 224 ; WX 602 ; N agrave ; G 162\nU 225 ; WX 602 ; N aacute ; G 163\nU 226 ; WX 602 ; N acircumflex ; G 164\nU 227 ; WX 602 ; N atilde ; G 165\nU 228 ; WX 602 ; N adieresis ; G 166\nU 229 ; WX 602 ; N aring ; G 167\nU 230 ; WX 602 ; N ae ; G 168\nU 231 ; WX 602 ; N ccedilla ; G 169\nU 232 ; WX 602 ; N egrave ; G 170\nU 233 ; WX 602 ; N eacute ; G 171\nU 234 ; WX 602 ; N ecircumflex ; G 172\nU 235 ; WX 602 ; N edieresis ; G 173\nU 236 ; WX 602 ; N igrave ; G 174\nU 237 ; WX 602 ; N iacute ; G 175\nU 238 ; WX 602 ; N icircumflex ; G 176\nU 239 ; WX 602 ; N idieresis ; G 177\nU 240 ; WX 602 ; N eth ; G 178\nU 241 ; WX 602 ; N ntilde ; G 179\nU 242 ; WX 602 ; N ograve ; G 180\nU 243 ; WX 602 ; N oacute ; G 181\nU 244 ; WX 602 ; N ocircumflex ; G 182\nU 245 ; WX 602 ; N otilde ; G 183\nU 246 ; WX 602 ; N odieresis ; G 184\nU 247 ; WX 602 ; N divide ; G 185\nU 248 ; WX 602 ; N oslash ; G 186\nU 249 ; WX 602 ; N ugrave ; G 187\nU 250 ; WX 602 ; N uacute ; G 188\nU 251 ; WX 602 ; N ucircumflex ; G 189\nU 252 ; WX 602 ; N udieresis ; G 190\nU 253 ; WX 602 ; N yacute ; G 191\nU 254 ; WX 602 ; N thorn ; G 192\nU 255 ; WX 602 ; N ydieresis ; G 193\nU 256 ; WX 602 ; N Amacron ; G 194\nU 257 ; WX 602 ; N amacron ; G 195\nU 258 ; WX 602 ; N Abreve ; G 196\nU 259 ; WX 602 ; N abreve ; G 197\nU 260 ; WX 602 ; N Aogonek ; G 198\nU 261 ; WX 602 ; N aogonek ; G 199\nU 262 ; WX 602 ; N Cacute ; G 200\nU 263 ; WX 602 ; N cacute ; G 201\nU 264 ; WX 602 ; N Ccircumflex ; G 202\nU 265 ; WX 602 ; N ccircumflex ; G 203\nU 266 ; WX 602 ; N Cdotaccent ; G 204\nU 267 ; WX 602 ; N cdotaccent ; G 205\nU 268 ; WX 602 ; N Ccaron ; G 206\nU 269 ; WX 602 ; N ccaron ; G 207\nU 270 ; WX 602 ; N Dcaron ; G 208\nU 271 ; WX 602 ; N dcaron ; G 209\nU 272 ; WX 602 ; N Dcroat ; G 210\nU 273 ; WX 602 ; N dmacron ; G 211\nU 274 ; WX 602 ; N Emacron ; G 212\nU 275 ; WX 602 ; N emacron ; G 213\nU 276 ; WX 602 ; N Ebreve ; G 214\nU 277 ; WX 602 ; N ebreve ; G 215\nU 278 ; WX 602 ; N Edotaccent ; G 216\nU 279 ; WX 602 ; N edotaccent ; G 217\nU 280 ; WX 602 ; N Eogonek ; G 218\nU 281 ; WX 602 ; N eogonek ; G 219\nU 282 ; WX 602 ; N Ecaron ; G 220\nU 283 ; WX 602 ; N ecaron ; G 221\nU 284 ; WX 602 ; N Gcircumflex ; G 222\nU 285 ; WX 602 ; N gcircumflex ; G 223\nU 286 ; WX 602 ; N Gbreve ; G 224\nU 287 ; WX 602 ; N gbreve ; G 225\nU 288 ; WX 602 ; N Gdotaccent ; G 226\nU 289 ; WX 602 ; N gdotaccent ; G 227\nU 290 ; WX 602 ; N Gcommaaccent ; G 228\nU 291 ; WX 602 ; N gcommaaccent ; G 229\nU 292 ; WX 602 ; N Hcircumflex ; G 230\nU 293 ; WX 602 ; N hcircumflex ; G 231\nU 294 ; WX 602 ; N Hbar ; G 232\nU 295 ; WX 602 ; N hbar ; G 233\nU 296 ; WX 602 ; N Itilde ; G 234\nU 297 ; WX 602 ; N itilde ; G 235\nU 298 ; WX 602 ; N Imacron ; G 236\nU 299 ; WX 602 ; N imacron ; G 237\nU 300 ; WX 602 ; N Ibreve ; G 238\nU 301 ; WX 602 ; N ibreve ; G 239\nU 302 ; WX 602 ; N Iogonek ; G 240\nU 303 ; WX 602 ; N iogonek ; G 241\nU 304 ; WX 602 ; N Idot ; G 242\nU 305 ; WX 602 ; N dotlessi ; G 243\nU 306 ; WX 602 ; N IJ ; G 244\nU 307 ; WX 602 ; N ij ; G 245\nU 308 ; WX 602 ; N Jcircumflex ; G 246\nU 309 ; WX 602 ; N jcircumflex ; G 247\nU 310 ; WX 602 ; N Kcommaaccent ; G 248\nU 311 ; WX 602 ; N kcommaaccent ; G 249\nU 312 ; WX 602 ; N kgreenlandic ; G 250\nU 313 ; WX 602 ; N Lacute ; G 251\nU 314 ; WX 602 ; N lacute ; G 252\nU 315 ; WX 602 ; N Lcommaaccent ; G 253\nU 316 ; WX 602 ; N lcommaaccent ; G 254\nU 317 ; WX 602 ; N Lcaron ; G 255\nU 318 ; WX 602 ; N lcaron ; G 256\nU 319 ; WX 602 ; N Ldot ; G 257\nU 320 ; WX 602 ; N ldot ; G 258\nU 321 ; WX 602 ; N Lslash ; G 259\nU 322 ; WX 602 ; N lslash ; G 260\nU 323 ; WX 602 ; N Nacute ; G 261\nU 324 ; WX 602 ; N nacute ; G 262\nU 325 ; WX 602 ; N Ncommaaccent ; G 263\nU 326 ; WX 602 ; N ncommaaccent ; G 264\nU 327 ; WX 602 ; N Ncaron ; G 265\nU 328 ; WX 602 ; N ncaron ; G 266\nU 329 ; WX 602 ; N napostrophe ; G 267\nU 330 ; WX 602 ; N Eng ; G 268\nU 331 ; WX 602 ; N eng ; G 269\nU 332 ; WX 602 ; N Omacron ; G 270\nU 333 ; WX 602 ; N omacron ; G 271\nU 334 ; WX 602 ; N Obreve ; G 272\nU 335 ; WX 602 ; N obreve ; G 273\nU 336 ; WX 602 ; N Ohungarumlaut ; G 274\nU 337 ; WX 602 ; N ohungarumlaut ; G 275\nU 338 ; WX 602 ; N OE ; G 276\nU 339 ; WX 602 ; N oe ; G 277\nU 340 ; WX 602 ; N Racute ; G 278\nU 341 ; WX 602 ; N racute ; G 279\nU 342 ; WX 602 ; N Rcommaaccent ; G 280\nU 343 ; WX 602 ; N rcommaaccent ; G 281\nU 344 ; WX 602 ; N Rcaron ; G 282\nU 345 ; WX 602 ; N rcaron ; G 283\nU 346 ; WX 602 ; N Sacute ; G 284\nU 347 ; WX 602 ; N sacute ; G 285\nU 348 ; WX 602 ; N Scircumflex ; G 286\nU 349 ; WX 602 ; N scircumflex ; G 287\nU 350 ; WX 602 ; N Scedilla ; G 288\nU 351 ; WX 602 ; N scedilla ; G 289\nU 352 ; WX 602 ; N Scaron ; G 290\nU 353 ; WX 602 ; N scaron ; G 291\nU 354 ; WX 602 ; N Tcommaaccent ; G 292\nU 355 ; WX 602 ; N tcommaaccent ; G 293\nU 356 ; WX 602 ; N Tcaron ; G 294\nU 357 ; WX 602 ; N tcaron ; G 295\nU 358 ; WX 602 ; N Tbar ; G 296\nU 359 ; WX 602 ; N tbar ; G 297\nU 360 ; WX 602 ; N Utilde ; G 298\nU 361 ; WX 602 ; N utilde ; G 299\nU 362 ; WX 602 ; N Umacron ; G 300\nU 363 ; WX 602 ; N umacron ; G 301\nU 364 ; WX 602 ; N Ubreve ; G 302\nU 365 ; WX 602 ; N ubreve ; G 303\nU 366 ; WX 602 ; N Uring ; G 304\nU 367 ; WX 602 ; N uring ; G 305\nU 368 ; WX 602 ; N Uhungarumlaut ; G 306\nU 369 ; WX 602 ; N uhungarumlaut ; G 307\nU 370 ; WX 602 ; N Uogonek ; G 308\nU 371 ; WX 602 ; N uogonek ; G 309\nU 372 ; WX 602 ; N Wcircumflex ; G 310\nU 373 ; WX 602 ; N wcircumflex ; G 311\nU 374 ; WX 602 ; N Ycircumflex ; G 312\nU 375 ; WX 602 ; N ycircumflex ; G 313\nU 376 ; WX 602 ; N Ydieresis ; G 314\nU 377 ; WX 602 ; N Zacute ; G 315\nU 378 ; WX 602 ; N zacute ; G 316\nU 379 ; WX 602 ; N Zdotaccent ; G 317\nU 380 ; WX 602 ; N zdotaccent ; G 318\nU 381 ; WX 602 ; N Zcaron ; G 319\nU 382 ; WX 602 ; N zcaron ; G 320\nU 383 ; WX 602 ; N longs ; G 321\nU 384 ; WX 602 ; N uni0180 ; G 322\nU 385 ; WX 602 ; N uni0181 ; G 323\nU 386 ; WX 602 ; N uni0182 ; G 324\nU 387 ; WX 602 ; N uni0183 ; G 325\nU 388 ; WX 602 ; N uni0184 ; G 326\nU 389 ; WX 602 ; N uni0185 ; G 327\nU 390 ; WX 602 ; N uni0186 ; G 328\nU 391 ; WX 602 ; N uni0187 ; G 329\nU 392 ; WX 602 ; N uni0188 ; G 330\nU 393 ; WX 602 ; N uni0189 ; G 331\nU 394 ; WX 602 ; N uni018A ; G 332\nU 395 ; WX 602 ; N uni018B ; G 333\nU 396 ; WX 602 ; N uni018C ; G 334\nU 397 ; WX 602 ; N uni018D ; G 335\nU 398 ; WX 602 ; N uni018E ; G 336\nU 399 ; WX 602 ; N uni018F ; G 337\nU 400 ; WX 602 ; N uni0190 ; G 338\nU 401 ; WX 602 ; N uni0191 ; G 339\nU 402 ; WX 602 ; N florin ; G 340\nU 403 ; WX 602 ; N uni0193 ; G 341\nU 404 ; WX 602 ; N uni0194 ; G 342\nU 405 ; WX 602 ; N uni0195 ; G 343\nU 406 ; WX 602 ; N uni0196 ; G 344\nU 407 ; WX 602 ; N uni0197 ; G 345\nU 408 ; WX 602 ; N uni0198 ; G 346\nU 409 ; WX 602 ; N uni0199 ; G 347\nU 410 ; WX 602 ; N uni019A ; G 348\nU 411 ; WX 602 ; N uni019B ; G 349\nU 412 ; WX 602 ; N uni019C ; G 350\nU 413 ; WX 602 ; N uni019D ; G 351\nU 414 ; WX 602 ; N uni019E ; G 352\nU 415 ; WX 602 ; N uni019F ; G 353\nU 416 ; WX 602 ; N Ohorn ; G 354\nU 417 ; WX 602 ; N ohorn ; G 355\nU 418 ; WX 602 ; N uni01A2 ; G 356\nU 419 ; WX 602 ; N uni01A3 ; G 357\nU 420 ; WX 602 ; N uni01A4 ; G 358\nU 421 ; WX 602 ; N uni01A5 ; G 359\nU 422 ; WX 602 ; N uni01A6 ; G 360\nU 423 ; WX 602 ; N uni01A7 ; G 361\nU 424 ; WX 602 ; N uni01A8 ; G 362\nU 425 ; WX 602 ; N uni01A9 ; G 363\nU 426 ; WX 602 ; N uni01AA ; G 364\nU 427 ; WX 602 ; N uni01AB ; G 365\nU 428 ; WX 602 ; N uni01AC ; G 366\nU 429 ; WX 602 ; N uni01AD ; G 367\nU 430 ; WX 602 ; N uni01AE ; G 368\nU 431 ; WX 602 ; N Uhorn ; G 369\nU 432 ; WX 602 ; N uhorn ; G 370\nU 433 ; WX 602 ; N uni01B1 ; G 371\nU 434 ; WX 602 ; N uni01B2 ; G 372\nU 435 ; WX 602 ; N uni01B3 ; G 373\nU 436 ; WX 602 ; N uni01B4 ; G 374\nU 437 ; WX 602 ; N uni01B5 ; G 375\nU 438 ; WX 602 ; N uni01B6 ; G 376\nU 439 ; WX 602 ; N uni01B7 ; G 377\nU 440 ; WX 602 ; N uni01B8 ; G 378\nU 441 ; WX 602 ; N uni01B9 ; G 379\nU 442 ; WX 602 ; N uni01BA ; G 380\nU 443 ; WX 602 ; N uni01BB ; G 381\nU 444 ; WX 602 ; N uni01BC ; G 382\nU 445 ; WX 602 ; N uni01BD ; G 383\nU 446 ; WX 602 ; N uni01BE ; G 384\nU 447 ; WX 602 ; N uni01BF ; G 385\nU 448 ; WX 602 ; N uni01C0 ; G 386\nU 449 ; WX 602 ; N uni01C1 ; G 387\nU 450 ; WX 602 ; N uni01C2 ; G 388\nU 451 ; WX 602 ; N uni01C3 ; G 389\nU 461 ; WX 602 ; N uni01CD ; G 390\nU 462 ; WX 602 ; N uni01CE ; G 391\nU 463 ; WX 602 ; N uni01CF ; G 392\nU 464 ; WX 602 ; N uni01D0 ; G 393\nU 465 ; WX 602 ; N uni01D1 ; G 394\nU 466 ; WX 602 ; N uni01D2 ; G 395\nU 467 ; WX 602 ; N uni01D3 ; G 396\nU 468 ; WX 602 ; N uni01D4 ; G 397\nU 469 ; WX 602 ; N uni01D5 ; G 398\nU 470 ; WX 602 ; N uni01D6 ; G 399\nU 471 ; WX 602 ; N uni01D7 ; G 400\nU 472 ; WX 602 ; N uni01D8 ; G 401\nU 473 ; WX 602 ; N uni01D9 ; G 402\nU 474 ; WX 602 ; N uni01DA ; G 403\nU 475 ; WX 602 ; N uni01DB ; G 404\nU 476 ; WX 602 ; N uni01DC ; G 405\nU 477 ; WX 602 ; N uni01DD ; G 406\nU 479 ; WX 602 ; N uni01DF ; G 407\nU 480 ; WX 602 ; N uni01E0 ; G 408\nU 481 ; WX 602 ; N uni01E1 ; G 409\nU 482 ; WX 602 ; N uni01E2 ; G 410\nU 483 ; WX 602 ; N uni01E3 ; G 411\nU 486 ; WX 602 ; N Gcaron ; G 412\nU 487 ; WX 602 ; N gcaron ; G 413\nU 488 ; WX 602 ; N uni01E8 ; G 414\nU 489 ; WX 602 ; N uni01E9 ; G 415\nU 490 ; WX 602 ; N uni01EA ; G 416\nU 491 ; WX 602 ; N uni01EB ; G 417\nU 492 ; WX 602 ; N uni01EC ; G 418\nU 493 ; WX 602 ; N uni01ED ; G 419\nU 494 ; WX 602 ; N uni01EE ; G 420\nU 495 ; WX 602 ; N uni01EF ; G 421\nU 500 ; WX 602 ; N uni01F4 ; G 422\nU 501 ; WX 602 ; N uni01F5 ; G 423\nU 502 ; WX 602 ; N uni01F6 ; G 424\nU 504 ; WX 602 ; N uni01F8 ; G 425\nU 505 ; WX 602 ; N uni01F9 ; G 426\nU 508 ; WX 602 ; N AEacute ; G 427\nU 509 ; WX 602 ; N aeacute ; G 428\nU 510 ; WX 602 ; N Oslashacute ; G 429\nU 511 ; WX 602 ; N oslashacute ; G 430\nU 512 ; WX 602 ; N uni0200 ; G 431\nU 513 ; WX 602 ; N uni0201 ; G 432\nU 514 ; WX 602 ; N uni0202 ; G 433\nU 515 ; WX 602 ; N uni0203 ; G 434\nU 516 ; WX 602 ; N uni0204 ; G 435\nU 517 ; WX 602 ; N uni0205 ; G 436\nU 518 ; WX 602 ; N uni0206 ; G 437\nU 519 ; WX 602 ; N uni0207 ; G 438\nU 520 ; WX 602 ; N uni0208 ; G 439\nU 521 ; WX 602 ; N uni0209 ; G 440\nU 522 ; WX 602 ; N uni020A ; G 441\nU 523 ; WX 602 ; N uni020B ; G 442\nU 524 ; WX 602 ; N uni020C ; G 443\nU 525 ; WX 602 ; N uni020D ; G 444\nU 526 ; WX 602 ; N uni020E ; G 445\nU 527 ; WX 602 ; N uni020F ; G 446\nU 528 ; WX 602 ; N uni0210 ; G 447\nU 529 ; WX 602 ; N uni0211 ; G 448\nU 530 ; WX 602 ; N uni0212 ; G 449\nU 531 ; WX 602 ; N uni0213 ; G 450\nU 532 ; WX 602 ; N uni0214 ; G 451\nU 533 ; WX 602 ; N uni0215 ; G 452\nU 534 ; WX 602 ; N uni0216 ; G 453\nU 535 ; WX 602 ; N uni0217 ; G 454\nU 536 ; WX 602 ; N Scommaaccent ; G 455\nU 537 ; WX 602 ; N scommaaccent ; G 456\nU 538 ; WX 602 ; N uni021A ; G 457\nU 539 ; WX 602 ; N uni021B ; G 458\nU 540 ; WX 602 ; N uni021C ; G 459\nU 541 ; WX 602 ; N uni021D ; G 460\nU 542 ; WX 602 ; N uni021E ; G 461\nU 543 ; WX 602 ; N uni021F ; G 462\nU 545 ; WX 602 ; N uni0221 ; G 463\nU 548 ; WX 602 ; N uni0224 ; G 464\nU 549 ; WX 602 ; N uni0225 ; G 465\nU 550 ; WX 602 ; N uni0226 ; G 466\nU 551 ; WX 602 ; N uni0227 ; G 467\nU 552 ; WX 602 ; N uni0228 ; G 468\nU 553 ; WX 602 ; N uni0229 ; G 469\nU 554 ; WX 602 ; N uni022A ; G 470\nU 555 ; WX 602 ; N uni022B ; G 471\nU 556 ; WX 602 ; N uni022C ; G 472\nU 557 ; WX 602 ; N uni022D ; G 473\nU 558 ; WX 602 ; N uni022E ; G 474\nU 559 ; WX 602 ; N uni022F ; G 475\nU 560 ; WX 602 ; N uni0230 ; G 476\nU 561 ; WX 602 ; N uni0231 ; G 477\nU 562 ; WX 602 ; N uni0232 ; G 478\nU 563 ; WX 602 ; N uni0233 ; G 479\nU 564 ; WX 602 ; N uni0234 ; G 480\nU 565 ; WX 602 ; N uni0235 ; G 481\nU 566 ; WX 602 ; N uni0236 ; G 482\nU 567 ; WX 602 ; N dotlessj ; G 483\nU 568 ; WX 602 ; N uni0238 ; G 484\nU 569 ; WX 602 ; N uni0239 ; G 485\nU 570 ; WX 602 ; N uni023A ; G 486\nU 571 ; WX 602 ; N uni023B ; G 487\nU 572 ; WX 602 ; N uni023C ; G 488\nU 573 ; WX 602 ; N uni023D ; G 489\nU 574 ; WX 602 ; N uni023E ; G 490\nU 575 ; WX 602 ; N uni023F ; G 491\nU 576 ; WX 602 ; N uni0240 ; G 492\nU 577 ; WX 602 ; N uni0241 ; G 493\nU 579 ; WX 602 ; N uni0243 ; G 494\nU 580 ; WX 602 ; N uni0244 ; G 495\nU 581 ; WX 602 ; N uni0245 ; G 496\nU 588 ; WX 602 ; N uni024C ; G 497\nU 589 ; WX 602 ; N uni024D ; G 498\nU 592 ; WX 602 ; N uni0250 ; G 499\nU 593 ; WX 602 ; N uni0251 ; G 500\nU 594 ; WX 602 ; N uni0252 ; G 501\nU 595 ; WX 602 ; N uni0253 ; G 502\nU 596 ; WX 602 ; N uni0254 ; G 503\nU 597 ; WX 602 ; N uni0255 ; G 504\nU 598 ; WX 602 ; N uni0256 ; G 505\nU 599 ; WX 602 ; N uni0257 ; G 506\nU 600 ; WX 602 ; N uni0258 ; G 507\nU 601 ; WX 602 ; N uni0259 ; G 508\nU 602 ; WX 602 ; N uni025A ; G 509\nU 603 ; WX 602 ; N uni025B ; G 510\nU 604 ; WX 602 ; N uni025C ; G 511\nU 605 ; WX 602 ; N uni025D ; G 512\nU 606 ; WX 602 ; N uni025E ; G 513\nU 607 ; WX 602 ; N uni025F ; G 514\nU 608 ; WX 602 ; N uni0260 ; G 515\nU 609 ; WX 602 ; N uni0261 ; G 516\nU 610 ; WX 602 ; N uni0262 ; G 517\nU 611 ; WX 602 ; N uni0263 ; G 518\nU 612 ; WX 602 ; N uni0264 ; G 519\nU 613 ; WX 602 ; N uni0265 ; G 520\nU 614 ; WX 602 ; N uni0266 ; G 521\nU 615 ; WX 602 ; N uni0267 ; G 522\nU 616 ; WX 602 ; N uni0268 ; G 523\nU 617 ; WX 602 ; N uni0269 ; G 524\nU 618 ; WX 602 ; N uni026A ; G 525\nU 619 ; WX 602 ; N uni026B ; G 526\nU 620 ; WX 602 ; N uni026C ; G 527\nU 621 ; WX 602 ; N uni026D ; G 528\nU 622 ; WX 602 ; N uni026E ; G 529\nU 623 ; WX 602 ; N uni026F ; G 530\nU 624 ; WX 602 ; N uni0270 ; G 531\nU 625 ; WX 602 ; N uni0271 ; G 532\nU 626 ; WX 602 ; N uni0272 ; G 533\nU 627 ; WX 602 ; N uni0273 ; G 534\nU 628 ; WX 602 ; N uni0274 ; G 535\nU 629 ; WX 602 ; N uni0275 ; G 536\nU 630 ; WX 602 ; N uni0276 ; G 537\nU 631 ; WX 602 ; N uni0277 ; G 538\nU 632 ; WX 602 ; N uni0278 ; G 539\nU 633 ; WX 602 ; N uni0279 ; G 540\nU 634 ; WX 602 ; N uni027A ; G 541\nU 635 ; WX 602 ; N uni027B ; G 542\nU 636 ; WX 602 ; N uni027C ; G 543\nU 637 ; WX 602 ; N uni027D ; G 544\nU 638 ; WX 602 ; N uni027E ; G 545\nU 639 ; WX 602 ; N uni027F ; G 546\nU 640 ; WX 602 ; N uni0280 ; G 547\nU 641 ; WX 602 ; N uni0281 ; G 548\nU 642 ; WX 602 ; N uni0282 ; G 549\nU 643 ; WX 602 ; N uni0283 ; G 550\nU 644 ; WX 602 ; N uni0284 ; G 551\nU 645 ; WX 602 ; N uni0285 ; G 552\nU 646 ; WX 602 ; N uni0286 ; G 553\nU 647 ; WX 602 ; N uni0287 ; G 554\nU 648 ; WX 602 ; N uni0288 ; G 555\nU 649 ; WX 602 ; N uni0289 ; G 556\nU 650 ; WX 602 ; N uni028A ; G 557\nU 651 ; WX 602 ; N uni028B ; G 558\nU 652 ; WX 602 ; N uni028C ; G 559\nU 653 ; WX 602 ; N uni028D ; G 560\nU 654 ; WX 602 ; N uni028E ; G 561\nU 655 ; WX 602 ; N uni028F ; G 562\nU 656 ; WX 602 ; N uni0290 ; G 563\nU 657 ; WX 602 ; N uni0291 ; G 564\nU 658 ; WX 602 ; N uni0292 ; G 565\nU 659 ; WX 602 ; N uni0293 ; G 566\nU 660 ; WX 602 ; N uni0294 ; G 567\nU 661 ; WX 602 ; N uni0295 ; G 568\nU 662 ; WX 602 ; N uni0296 ; G 569\nU 663 ; WX 602 ; N uni0297 ; G 570\nU 664 ; WX 602 ; N uni0298 ; G 571\nU 665 ; WX 602 ; N uni0299 ; G 572\nU 666 ; WX 602 ; N uni029A ; G 573\nU 667 ; WX 602 ; N uni029B ; G 574\nU 668 ; WX 602 ; N uni029C ; G 575\nU 669 ; WX 602 ; N uni029D ; G 576\nU 670 ; WX 602 ; N uni029E ; G 577\nU 671 ; WX 602 ; N uni029F ; G 578\nU 672 ; WX 602 ; N uni02A0 ; G 579\nU 673 ; WX 602 ; N uni02A1 ; G 580\nU 674 ; WX 602 ; N uni02A2 ; G 581\nU 675 ; WX 602 ; N uni02A3 ; G 582\nU 676 ; WX 602 ; N uni02A4 ; G 583\nU 677 ; WX 602 ; N uni02A5 ; G 584\nU 678 ; WX 602 ; N uni02A6 ; G 585\nU 679 ; WX 602 ; N uni02A7 ; G 586\nU 680 ; WX 602 ; N uni02A8 ; G 587\nU 681 ; WX 602 ; N uni02A9 ; G 588\nU 682 ; WX 602 ; N uni02AA ; G 589\nU 683 ; WX 602 ; N uni02AB ; G 590\nU 684 ; WX 602 ; N uni02AC ; G 591\nU 685 ; WX 602 ; N uni02AD ; G 592\nU 686 ; WX 602 ; N uni02AE ; G 593\nU 687 ; WX 602 ; N uni02AF ; G 594\nU 688 ; WX 602 ; N uni02B0 ; G 595\nU 689 ; WX 602 ; N uni02B1 ; G 596\nU 690 ; WX 602 ; N uni02B2 ; G 597\nU 691 ; WX 602 ; N uni02B3 ; G 598\nU 692 ; WX 602 ; N uni02B4 ; G 599\nU 693 ; WX 602 ; N uni02B5 ; G 600\nU 694 ; WX 602 ; N uni02B6 ; G 601\nU 695 ; WX 602 ; N uni02B7 ; G 602\nU 696 ; WX 602 ; N uni02B8 ; G 603\nU 697 ; WX 602 ; N uni02B9 ; G 604\nU 699 ; WX 602 ; N uni02BB ; G 605\nU 700 ; WX 602 ; N uni02BC ; G 606\nU 701 ; WX 602 ; N uni02BD ; G 607\nU 702 ; WX 602 ; N uni02BE ; G 608\nU 703 ; WX 602 ; N uni02BF ; G 609\nU 704 ; WX 602 ; N uni02C0 ; G 610\nU 705 ; WX 602 ; N uni02C1 ; G 611\nU 710 ; WX 602 ; N circumflex ; G 612\nU 711 ; WX 602 ; N caron ; G 613\nU 712 ; WX 602 ; N uni02C8 ; G 614\nU 713 ; WX 602 ; N uni02C9 ; G 615\nU 716 ; WX 602 ; N uni02CC ; G 616\nU 717 ; WX 602 ; N uni02CD ; G 617\nU 718 ; WX 602 ; N uni02CE ; G 618\nU 719 ; WX 602 ; N uni02CF ; G 619\nU 720 ; WX 602 ; N uni02D0 ; G 620\nU 721 ; WX 602 ; N uni02D1 ; G 621\nU 722 ; WX 602 ; N uni02D2 ; G 622\nU 723 ; WX 602 ; N uni02D3 ; G 623\nU 726 ; WX 602 ; N uni02D6 ; G 624\nU 727 ; WX 602 ; N uni02D7 ; G 625\nU 728 ; WX 602 ; N breve ; G 626\nU 729 ; WX 602 ; N dotaccent ; G 627\nU 730 ; WX 602 ; N ring ; G 628\nU 731 ; WX 602 ; N ogonek ; G 629\nU 732 ; WX 602 ; N tilde ; G 630\nU 733 ; WX 602 ; N hungarumlaut ; G 631\nU 734 ; WX 602 ; N uni02DE ; G 632\nU 736 ; WX 602 ; N uni02E0 ; G 633\nU 737 ; WX 602 ; N uni02E1 ; G 634\nU 738 ; WX 602 ; N uni02E2 ; G 635\nU 739 ; WX 602 ; N uni02E3 ; G 636\nU 740 ; WX 602 ; N uni02E4 ; G 637\nU 741 ; WX 602 ; N uni02E5 ; G 638\nU 742 ; WX 602 ; N uni02E6 ; G 639\nU 743 ; WX 602 ; N uni02E7 ; G 640\nU 744 ; WX 602 ; N uni02E8 ; G 641\nU 745 ; WX 602 ; N uni02E9 ; G 642\nU 750 ; WX 602 ; N uni02EE ; G 643\nU 755 ; WX 602 ; N uni02F3 ; G 644\nU 768 ; WX 602 ; N gravecomb ; G 645\nU 769 ; WX 602 ; N acutecomb ; G 646\nU 770 ; WX 602 ; N uni0302 ; G 647\nU 771 ; WX 602 ; N tildecomb ; G 648\nU 772 ; WX 602 ; N uni0304 ; G 649\nU 773 ; WX 602 ; N uni0305 ; G 650\nU 774 ; WX 602 ; N uni0306 ; G 651\nU 775 ; WX 602 ; N uni0307 ; G 652\nU 776 ; WX 602 ; N uni0308 ; G 653\nU 777 ; WX 602 ; N hookabovecomb ; G 654\nU 778 ; WX 602 ; N uni030A ; G 655\nU 779 ; WX 602 ; N uni030B ; G 656\nU 780 ; WX 602 ; N uni030C ; G 657\nU 781 ; WX 602 ; N uni030D ; G 658\nU 782 ; WX 602 ; N uni030E ; G 659\nU 783 ; WX 602 ; N uni030F ; G 660\nU 784 ; WX 602 ; N uni0310 ; G 661\nU 785 ; WX 602 ; N uni0311 ; G 662\nU 786 ; WX 602 ; N uni0312 ; G 663\nU 787 ; WX 602 ; N uni0313 ; G 664\nU 788 ; WX 602 ; N uni0314 ; G 665\nU 789 ; WX 602 ; N uni0315 ; G 666\nU 790 ; WX 602 ; N uni0316 ; G 667\nU 791 ; WX 602 ; N uni0317 ; G 668\nU 792 ; WX 602 ; N uni0318 ; G 669\nU 793 ; WX 602 ; N uni0319 ; G 670\nU 794 ; WX 602 ; N uni031A ; G 671\nU 795 ; WX 602 ; N uni031B ; G 672\nU 796 ; WX 602 ; N uni031C ; G 673\nU 797 ; WX 602 ; N uni031D ; G 674\nU 798 ; WX 602 ; N uni031E ; G 675\nU 799 ; WX 602 ; N uni031F ; G 676\nU 800 ; WX 602 ; N uni0320 ; G 677\nU 801 ; WX 602 ; N uni0321 ; G 678\nU 802 ; WX 602 ; N uni0322 ; G 679\nU 803 ; WX 602 ; N dotbelowcomb ; G 680\nU 804 ; WX 602 ; N uni0324 ; G 681\nU 805 ; WX 602 ; N uni0325 ; G 682\nU 806 ; WX 602 ; N uni0326 ; G 683\nU 807 ; WX 602 ; N uni0327 ; G 684\nU 808 ; WX 602 ; N uni0328 ; G 685\nU 809 ; WX 602 ; N uni0329 ; G 686\nU 810 ; WX 602 ; N uni032A ; G 687\nU 811 ; WX 602 ; N uni032B ; G 688\nU 812 ; WX 602 ; N uni032C ; G 689\nU 813 ; WX 602 ; N uni032D ; G 690\nU 814 ; WX 602 ; N uni032E ; G 691\nU 815 ; WX 602 ; N uni032F ; G 692\nU 816 ; WX 602 ; N uni0330 ; G 693\nU 817 ; WX 602 ; N uni0331 ; G 694\nU 818 ; WX 602 ; N uni0332 ; G 695\nU 819 ; WX 602 ; N uni0333 ; G 696\nU 820 ; WX 602 ; N uni0334 ; G 697\nU 821 ; WX 602 ; N uni0335 ; G 698\nU 822 ; WX 602 ; N uni0336 ; G 699\nU 823 ; WX 602 ; N uni0337 ; G 700\nU 824 ; WX 602 ; N uni0338 ; G 701\nU 825 ; WX 602 ; N uni0339 ; G 702\nU 826 ; WX 602 ; N uni033A ; G 703\nU 827 ; WX 602 ; N uni033B ; G 704\nU 828 ; WX 602 ; N uni033C ; G 705\nU 829 ; WX 602 ; N uni033D ; G 706\nU 830 ; WX 602 ; N uni033E ; G 707\nU 831 ; WX 602 ; N uni033F ; G 708\nU 835 ; WX 602 ; N uni0343 ; G 709\nU 856 ; WX 602 ; N uni0358 ; G 710\nU 865 ; WX 602 ; N uni0361 ; G 711\nU 884 ; WX 602 ; N uni0374 ; G 712\nU 885 ; WX 602 ; N uni0375 ; G 713\nU 886 ; WX 602 ; N uni0376 ; G 714\nU 887 ; WX 602 ; N uni0377 ; G 715\nU 890 ; WX 602 ; N uni037A ; G 716\nU 891 ; WX 602 ; N uni037B ; G 717\nU 892 ; WX 602 ; N uni037C ; G 718\nU 893 ; WX 602 ; N uni037D ; G 719\nU 894 ; WX 602 ; N uni037E ; G 720\nU 895 ; WX 602 ; N uni037F ; G 721\nU 900 ; WX 602 ; N tonos ; G 722\nU 901 ; WX 602 ; N dieresistonos ; G 723\nU 902 ; WX 602 ; N Alphatonos ; G 724\nU 903 ; WX 602 ; N anoteleia ; G 725\nU 904 ; WX 602 ; N Epsilontonos ; G 726\nU 905 ; WX 602 ; N Etatonos ; G 727\nU 906 ; WX 602 ; N Iotatonos ; G 728\nU 908 ; WX 602 ; N Omicrontonos ; G 729\nU 910 ; WX 602 ; N Upsilontonos ; G 730\nU 911 ; WX 602 ; N Omegatonos ; G 731\nU 912 ; WX 602 ; N iotadieresistonos ; G 732\nU 913 ; WX 602 ; N Alpha ; G 733\nU 914 ; WX 602 ; N Beta ; G 734\nU 915 ; WX 602 ; N Gamma ; G 735\nU 916 ; WX 602 ; N uni0394 ; G 736\nU 917 ; WX 602 ; N Epsilon ; G 737\nU 918 ; WX 602 ; N Zeta ; G 738\nU 919 ; WX 602 ; N Eta ; G 739\nU 920 ; WX 602 ; N Theta ; G 740\nU 921 ; WX 602 ; N Iota ; G 741\nU 922 ; WX 602 ; N Kappa ; G 742\nU 923 ; WX 602 ; N Lambda ; G 743\nU 924 ; WX 602 ; N Mu ; G 744\nU 925 ; WX 602 ; N Nu ; G 745\nU 926 ; WX 602 ; N Xi ; G 746\nU 927 ; WX 602 ; N Omicron ; G 747\nU 928 ; WX 602 ; N Pi ; G 748\nU 929 ; WX 602 ; N Rho ; G 749\nU 931 ; WX 602 ; N Sigma ; G 750\nU 932 ; WX 602 ; N Tau ; G 751\nU 933 ; WX 602 ; N Upsilon ; G 752\nU 934 ; WX 602 ; N Phi ; G 753\nU 935 ; WX 602 ; N Chi ; G 754\nU 936 ; WX 602 ; N Psi ; G 755\nU 937 ; WX 602 ; N Omega ; G 756\nU 938 ; WX 602 ; N Iotadieresis ; G 757\nU 939 ; WX 602 ; N Upsilondieresis ; G 758\nU 940 ; WX 602 ; N alphatonos ; G 759\nU 941 ; WX 602 ; N epsilontonos ; G 760\nU 942 ; WX 602 ; N etatonos ; G 761\nU 943 ; WX 602 ; N iotatonos ; G 762\nU 944 ; WX 602 ; N upsilondieresistonos ; G 763\nU 945 ; WX 602 ; N alpha ; G 764\nU 946 ; WX 602 ; N beta ; G 765\nU 947 ; WX 602 ; N gamma ; G 766\nU 948 ; WX 602 ; N delta ; G 767\nU 949 ; WX 602 ; N epsilon ; G 768\nU 950 ; WX 602 ; N zeta ; G 769\nU 951 ; WX 602 ; N eta ; G 770\nU 952 ; WX 602 ; N theta ; G 771\nU 953 ; WX 602 ; N iota ; G 772\nU 954 ; WX 602 ; N kappa ; G 773\nU 955 ; WX 602 ; N lambda ; G 774\nU 956 ; WX 602 ; N uni03BC ; G 775\nU 957 ; WX 602 ; N nu ; G 776\nU 958 ; WX 602 ; N xi ; G 777\nU 959 ; WX 602 ; N omicron ; G 778\nU 960 ; WX 602 ; N pi ; G 779\nU 961 ; WX 602 ; N rho ; G 780\nU 962 ; WX 602 ; N sigma1 ; G 781\nU 963 ; WX 602 ; N sigma ; G 782\nU 964 ; WX 602 ; N tau ; G 783\nU 965 ; WX 602 ; N upsilon ; G 784\nU 966 ; WX 602 ; N phi ; G 785\nU 967 ; WX 602 ; N chi ; G 786\nU 968 ; WX 602 ; N psi ; G 787\nU 969 ; WX 602 ; N omega ; G 788\nU 970 ; WX 602 ; N iotadieresis ; G 789\nU 971 ; WX 602 ; N upsilondieresis ; G 790\nU 972 ; WX 602 ; N omicrontonos ; G 791\nU 973 ; WX 602 ; N upsilontonos ; G 792\nU 974 ; WX 602 ; N omegatonos ; G 793\nU 976 ; WX 602 ; N uni03D0 ; G 794\nU 977 ; WX 602 ; N theta1 ; G 795\nU 978 ; WX 602 ; N Upsilon1 ; G 796\nU 979 ; WX 602 ; N uni03D3 ; G 797\nU 980 ; WX 602 ; N uni03D4 ; G 798\nU 981 ; WX 602 ; N phi1 ; G 799\nU 982 ; WX 602 ; N omega1 ; G 800\nU 983 ; WX 602 ; N uni03D7 ; G 801\nU 984 ; WX 602 ; N uni03D8 ; G 802\nU 985 ; WX 602 ; N uni03D9 ; G 803\nU 986 ; WX 602 ; N uni03DA ; G 804\nU 987 ; WX 602 ; N uni03DB ; G 805\nU 988 ; WX 602 ; N uni03DC ; G 806\nU 989 ; WX 602 ; N uni03DD ; G 807\nU 990 ; WX 602 ; N uni03DE ; G 808\nU 991 ; WX 602 ; N uni03DF ; G 809\nU 992 ; WX 602 ; N uni03E0 ; G 810\nU 993 ; WX 602 ; N uni03E1 ; G 811\nU 1008 ; WX 602 ; N uni03F0 ; G 812\nU 1009 ; WX 602 ; N uni03F1 ; G 813\nU 1010 ; WX 602 ; N uni03F2 ; G 814\nU 1011 ; WX 602 ; N uni03F3 ; G 815\nU 1012 ; WX 602 ; N uni03F4 ; G 816\nU 1013 ; WX 602 ; N uni03F5 ; G 817\nU 1014 ; WX 602 ; N uni03F6 ; G 818\nU 1015 ; WX 602 ; N uni03F7 ; G 819\nU 1016 ; WX 602 ; N uni03F8 ; G 820\nU 1017 ; WX 602 ; N uni03F9 ; G 821\nU 1018 ; WX 602 ; N uni03FA ; G 822\nU 1019 ; WX 602 ; N uni03FB ; G 823\nU 1020 ; WX 602 ; N uni03FC ; G 824\nU 1021 ; WX 602 ; N uni03FD ; G 825\nU 1022 ; WX 602 ; N uni03FE ; G 826\nU 1023 ; WX 602 ; N uni03FF ; G 827\nU 1024 ; WX 602 ; N uni0400 ; G 828\nU 1025 ; WX 602 ; N uni0401 ; G 829\nU 1026 ; WX 602 ; N uni0402 ; G 830\nU 1027 ; WX 602 ; N uni0403 ; G 831\nU 1028 ; WX 602 ; N uni0404 ; G 832\nU 1029 ; WX 602 ; N uni0405 ; G 833\nU 1030 ; WX 602 ; N uni0406 ; G 834\nU 1031 ; WX 602 ; N uni0407 ; G 835\nU 1032 ; WX 602 ; N uni0408 ; G 836\nU 1033 ; WX 602 ; N uni0409 ; G 837\nU 1034 ; WX 602 ; N uni040A ; G 838\nU 1035 ; WX 602 ; N uni040B ; G 839\nU 1036 ; WX 602 ; N uni040C ; G 840\nU 1037 ; WX 602 ; N uni040D ; G 841\nU 1038 ; WX 602 ; N uni040E ; G 842\nU 1039 ; WX 602 ; N uni040F ; G 843\nU 1040 ; WX 602 ; N uni0410 ; G 844\nU 1041 ; WX 602 ; N uni0411 ; G 845\nU 1042 ; WX 602 ; N uni0412 ; G 846\nU 1043 ; WX 602 ; N uni0413 ; G 847\nU 1044 ; WX 602 ; N uni0414 ; G 848\nU 1045 ; WX 602 ; N uni0415 ; G 849\nU 1046 ; WX 602 ; N uni0416 ; G 850\nU 1047 ; WX 602 ; N uni0417 ; G 851\nU 1048 ; WX 602 ; N uni0418 ; G 852\nU 1049 ; WX 602 ; N uni0419 ; G 853\nU 1050 ; WX 602 ; N uni041A ; G 854\nU 1051 ; WX 602 ; N uni041B ; G 855\nU 1052 ; WX 602 ; N uni041C ; G 856\nU 1053 ; WX 602 ; N uni041D ; G 857\nU 1054 ; WX 602 ; N uni041E ; G 858\nU 1055 ; WX 602 ; N uni041F ; G 859\nU 1056 ; WX 602 ; N uni0420 ; G 860\nU 1057 ; WX 602 ; N uni0421 ; G 861\nU 1058 ; WX 602 ; N uni0422 ; G 862\nU 1059 ; WX 602 ; N uni0423 ; G 863\nU 1060 ; WX 602 ; N uni0424 ; G 864\nU 1061 ; WX 602 ; N uni0425 ; G 865\nU 1062 ; WX 602 ; N uni0426 ; G 866\nU 1063 ; WX 602 ; N uni0427 ; G 867\nU 1064 ; WX 602 ; N uni0428 ; G 868\nU 1065 ; WX 602 ; N uni0429 ; G 869\nU 1066 ; WX 602 ; N uni042A ; G 870\nU 1067 ; WX 602 ; N uni042B ; G 871\nU 1068 ; WX 602 ; N uni042C ; G 872\nU 1069 ; WX 602 ; N uni042D ; G 873\nU 1070 ; WX 602 ; N uni042E ; G 874\nU 1071 ; WX 602 ; N uni042F ; G 875\nU 1072 ; WX 602 ; N uni0430 ; G 876\nU 1073 ; WX 602 ; N uni0431 ; G 877\nU 1074 ; WX 602 ; N uni0432 ; G 878\nU 1075 ; WX 602 ; N uni0433 ; G 879\nU 1076 ; WX 602 ; N uni0434 ; G 880\nU 1077 ; WX 602 ; N uni0435 ; G 881\nU 1078 ; WX 602 ; N uni0436 ; G 882\nU 1079 ; WX 602 ; N uni0437 ; G 883\nU 1080 ; WX 602 ; N uni0438 ; G 884\nU 1081 ; WX 602 ; N uni0439 ; G 885\nU 1082 ; WX 602 ; N uni043A ; G 886\nU 1083 ; WX 602 ; N uni043B ; G 887\nU 1084 ; WX 602 ; N uni043C ; G 888\nU 1085 ; WX 602 ; N uni043D ; G 889\nU 1086 ; WX 602 ; N uni043E ; G 890\nU 1087 ; WX 602 ; N uni043F ; G 891\nU 1088 ; WX 602 ; N uni0440 ; G 892\nU 1089 ; WX 602 ; N uni0441 ; G 893\nU 1090 ; WX 602 ; N uni0442 ; G 894\nU 1091 ; WX 602 ; N uni0443 ; G 895\nU 1092 ; WX 602 ; N uni0444 ; G 896\nU 1093 ; WX 602 ; N uni0445 ; G 897\nU 1094 ; WX 602 ; N uni0446 ; G 898\nU 1095 ; WX 602 ; N uni0447 ; G 899\nU 1096 ; WX 602 ; N uni0448 ; G 900\nU 1097 ; WX 602 ; N uni0449 ; G 901\nU 1098 ; WX 602 ; N uni044A ; G 902\nU 1099 ; WX 602 ; N uni044B ; G 903\nU 1100 ; WX 602 ; N uni044C ; G 904\nU 1101 ; WX 602 ; N uni044D ; G 905\nU 1102 ; WX 602 ; N uni044E ; G 906\nU 1103 ; WX 602 ; N uni044F ; G 907\nU 1104 ; WX 602 ; N uni0450 ; G 908\nU 1105 ; WX 602 ; N uni0451 ; G 909\nU 1106 ; WX 602 ; N uni0452 ; G 910\nU 1107 ; WX 602 ; N uni0453 ; G 911\nU 1108 ; WX 602 ; N uni0454 ; G 912\nU 1109 ; WX 602 ; N uni0455 ; G 913\nU 1110 ; WX 602 ; N uni0456 ; G 914\nU 1111 ; WX 602 ; N uni0457 ; G 915\nU 1112 ; WX 602 ; N uni0458 ; G 916\nU 1113 ; WX 602 ; N uni0459 ; G 917\nU 1114 ; WX 602 ; N uni045A ; G 918\nU 1115 ; WX 602 ; N uni045B ; G 919\nU 1116 ; WX 602 ; N uni045C ; G 920\nU 1117 ; WX 602 ; N uni045D ; G 921\nU 1118 ; WX 602 ; N uni045E ; G 922\nU 1119 ; WX 602 ; N uni045F ; G 923\nU 1122 ; WX 602 ; N uni0462 ; G 924\nU 1123 ; WX 602 ; N uni0463 ; G 925\nU 1138 ; WX 602 ; N uni0472 ; G 926\nU 1139 ; WX 602 ; N uni0473 ; G 927\nU 1168 ; WX 602 ; N uni0490 ; G 928\nU 1169 ; WX 602 ; N uni0491 ; G 929\nU 1170 ; WX 602 ; N uni0492 ; G 930\nU 1171 ; WX 602 ; N uni0493 ; G 931\nU 1172 ; WX 602 ; N uni0494 ; G 932\nU 1173 ; WX 602 ; N uni0495 ; G 933\nU 1174 ; WX 602 ; N uni0496 ; G 934\nU 1175 ; WX 602 ; N uni0497 ; G 935\nU 1176 ; WX 602 ; N uni0498 ; G 936\nU 1177 ; WX 602 ; N uni0499 ; G 937\nU 1178 ; WX 602 ; N uni049A ; G 938\nU 1179 ; WX 602 ; N uni049B ; G 939\nU 1186 ; WX 602 ; N uni04A2 ; G 940\nU 1187 ; WX 602 ; N uni04A3 ; G 941\nU 1188 ; WX 602 ; N uni04A4 ; G 942\nU 1189 ; WX 602 ; N uni04A5 ; G 943\nU 1194 ; WX 602 ; N uni04AA ; G 944\nU 1195 ; WX 602 ; N uni04AB ; G 945\nU 1196 ; WX 602 ; N uni04AC ; G 946\nU 1197 ; WX 602 ; N uni04AD ; G 947\nU 1198 ; WX 602 ; N uni04AE ; G 948\nU 1199 ; WX 602 ; N uni04AF ; G 949\nU 1200 ; WX 602 ; N uni04B0 ; G 950\nU 1201 ; WX 602 ; N uni04B1 ; G 951\nU 1202 ; WX 602 ; N uni04B2 ; G 952\nU 1203 ; WX 602 ; N uni04B3 ; G 953\nU 1210 ; WX 602 ; N uni04BA ; G 954\nU 1211 ; WX 602 ; N uni04BB ; G 955\nU 1216 ; WX 602 ; N uni04C0 ; G 956\nU 1217 ; WX 602 ; N uni04C1 ; G 957\nU 1218 ; WX 602 ; N uni04C2 ; G 958\nU 1219 ; WX 602 ; N uni04C3 ; G 959\nU 1220 ; WX 602 ; N uni04C4 ; G 960\nU 1223 ; WX 602 ; N uni04C7 ; G 961\nU 1224 ; WX 602 ; N uni04C8 ; G 962\nU 1227 ; WX 602 ; N uni04CB ; G 963\nU 1228 ; WX 602 ; N uni04CC ; G 964\nU 1231 ; WX 602 ; N uni04CF ; G 965\nU 1232 ; WX 602 ; N uni04D0 ; G 966\nU 1233 ; WX 602 ; N uni04D1 ; G 967\nU 1234 ; WX 602 ; N uni04D2 ; G 968\nU 1235 ; WX 602 ; N uni04D3 ; G 969\nU 1236 ; WX 602 ; N uni04D4 ; G 970\nU 1237 ; WX 602 ; N uni04D5 ; G 971\nU 1238 ; WX 602 ; N uni04D6 ; G 972\nU 1239 ; WX 602 ; N uni04D7 ; G 973\nU 1240 ; WX 602 ; N uni04D8 ; G 974\nU 1241 ; WX 602 ; N uni04D9 ; G 975\nU 1242 ; WX 602 ; N uni04DA ; G 976\nU 1243 ; WX 602 ; N uni04DB ; G 977\nU 1244 ; WX 602 ; N uni04DC ; G 978\nU 1245 ; WX 602 ; N uni04DD ; G 979\nU 1246 ; WX 602 ; N uni04DE ; G 980\nU 1247 ; WX 602 ; N uni04DF ; G 981\nU 1248 ; WX 602 ; N uni04E0 ; G 982\nU 1249 ; WX 602 ; N uni04E1 ; G 983\nU 1250 ; WX 602 ; N uni04E2 ; G 984\nU 1251 ; WX 602 ; N uni04E3 ; G 985\nU 1252 ; WX 602 ; N uni04E4 ; G 986\nU 1253 ; WX 602 ; N uni04E5 ; G 987\nU 1254 ; WX 602 ; N uni04E6 ; G 988\nU 1255 ; WX 602 ; N uni04E7 ; G 989\nU 1256 ; WX 602 ; N uni04E8 ; G 990\nU 1257 ; WX 602 ; N uni04E9 ; G 991\nU 1258 ; WX 602 ; N uni04EA ; G 992\nU 1259 ; WX 602 ; N uni04EB ; G 993\nU 1260 ; WX 602 ; N uni04EC ; G 994\nU 1261 ; WX 602 ; N uni04ED ; G 995\nU 1262 ; WX 602 ; N uni04EE ; G 996\nU 1263 ; WX 602 ; N uni04EF ; G 997\nU 1264 ; WX 602 ; N uni04F0 ; G 998\nU 1265 ; WX 602 ; N uni04F1 ; G 999\nU 1266 ; WX 602 ; N uni04F2 ; G 1000\nU 1267 ; WX 602 ; N uni04F3 ; G 1001\nU 1268 ; WX 602 ; N uni04F4 ; G 1002\nU 1269 ; WX 602 ; N uni04F5 ; G 1003\nU 1270 ; WX 602 ; N uni04F6 ; G 1004\nU 1271 ; WX 602 ; N uni04F7 ; G 1005\nU 1272 ; WX 602 ; N uni04F8 ; G 1006\nU 1273 ; WX 602 ; N uni04F9 ; G 1007\nU 1296 ; WX 602 ; N uni0510 ; G 1008\nU 1297 ; WX 602 ; N uni0511 ; G 1009\nU 1306 ; WX 602 ; N uni051A ; G 1010\nU 1307 ; WX 602 ; N uni051B ; G 1011\nU 1308 ; WX 602 ; N uni051C ; G 1012\nU 1309 ; WX 602 ; N uni051D ; G 1013\nU 1329 ; WX 602 ; N uni0531 ; G 1014\nU 1330 ; WX 602 ; N uni0532 ; G 1015\nU 1331 ; WX 602 ; N uni0533 ; G 1016\nU 1332 ; WX 602 ; N uni0534 ; G 1017\nU 1333 ; WX 602 ; N uni0535 ; G 1018\nU 1334 ; WX 602 ; N uni0536 ; G 1019\nU 1335 ; WX 602 ; N uni0537 ; G 1020\nU 1336 ; WX 602 ; N uni0538 ; G 1021\nU 1337 ; WX 602 ; N uni0539 ; G 1022\nU 1338 ; WX 602 ; N uni053A ; G 1023\nU 1339 ; WX 602 ; N uni053B ; G 1024\nU 1340 ; WX 602 ; N uni053C ; G 1025\nU 1341 ; WX 602 ; N uni053D ; G 1026\nU 1342 ; WX 602 ; N uni053E ; G 1027\nU 1343 ; WX 602 ; N uni053F ; G 1028\nU 1344 ; WX 602 ; N uni0540 ; G 1029\nU 1345 ; WX 602 ; N uni0541 ; G 1030\nU 1346 ; WX 602 ; N uni0542 ; G 1031\nU 1347 ; WX 602 ; N uni0543 ; G 1032\nU 1348 ; WX 602 ; N uni0544 ; G 1033\nU 1349 ; WX 602 ; N uni0545 ; G 1034\nU 1350 ; WX 602 ; N uni0546 ; G 1035\nU 1351 ; WX 602 ; N uni0547 ; G 1036\nU 1352 ; WX 602 ; N uni0548 ; G 1037\nU 1353 ; WX 602 ; N uni0549 ; G 1038\nU 1354 ; WX 602 ; N uni054A ; G 1039\nU 1355 ; WX 602 ; N uni054B ; G 1040\nU 1356 ; WX 602 ; N uni054C ; G 1041\nU 1357 ; WX 602 ; N uni054D ; G 1042\nU 1358 ; WX 602 ; N uni054E ; G 1043\nU 1359 ; WX 602 ; N uni054F ; G 1044\nU 1360 ; WX 602 ; N uni0550 ; G 1045\nU 1361 ; WX 602 ; N uni0551 ; G 1046\nU 1362 ; WX 602 ; N uni0552 ; G 1047\nU 1363 ; WX 602 ; N uni0553 ; G 1048\nU 1364 ; WX 602 ; N uni0554 ; G 1049\nU 1365 ; WX 602 ; N uni0555 ; G 1050\nU 1366 ; WX 602 ; N uni0556 ; G 1051\nU 1369 ; WX 602 ; N uni0559 ; G 1052\nU 1370 ; WX 602 ; N uni055A ; G 1053\nU 1371 ; WX 602 ; N uni055B ; G 1054\nU 1372 ; WX 602 ; N uni055C ; G 1055\nU 1373 ; WX 602 ; N uni055D ; G 1056\nU 1374 ; WX 602 ; N uni055E ; G 1057\nU 1375 ; WX 602 ; N uni055F ; G 1058\nU 1377 ; WX 602 ; N uni0561 ; G 1059\nU 1378 ; WX 602 ; N uni0562 ; G 1060\nU 1379 ; WX 602 ; N uni0563 ; G 1061\nU 1380 ; WX 602 ; N uni0564 ; G 1062\nU 1381 ; WX 602 ; N uni0565 ; G 1063\nU 1382 ; WX 602 ; N uni0566 ; G 1064\nU 1383 ; WX 602 ; N uni0567 ; G 1065\nU 1384 ; WX 602 ; N uni0568 ; G 1066\nU 1385 ; WX 602 ; N uni0569 ; G 1067\nU 1386 ; WX 602 ; N uni056A ; G 1068\nU 1387 ; WX 602 ; N uni056B ; G 1069\nU 1388 ; WX 602 ; N uni056C ; G 1070\nU 1389 ; WX 602 ; N uni056D ; G 1071\nU 1390 ; WX 602 ; N uni056E ; G 1072\nU 1391 ; WX 602 ; N uni056F ; G 1073\nU 1392 ; WX 602 ; N uni0570 ; G 1074\nU 1393 ; WX 602 ; N uni0571 ; G 1075\nU 1394 ; WX 602 ; N uni0572 ; G 1076\nU 1395 ; WX 602 ; N uni0573 ; G 1077\nU 1396 ; WX 602 ; N uni0574 ; G 1078\nU 1397 ; WX 602 ; N uni0575 ; G 1079\nU 1398 ; WX 602 ; N uni0576 ; G 1080\nU 1399 ; WX 602 ; N uni0577 ; G 1081\nU 1400 ; WX 602 ; N uni0578 ; G 1082\nU 1401 ; WX 602 ; N uni0579 ; G 1083\nU 1402 ; WX 602 ; N uni057A ; G 1084\nU 1403 ; WX 602 ; N uni057B ; G 1085\nU 1404 ; WX 602 ; N uni057C ; G 1086\nU 1405 ; WX 602 ; N uni057D ; G 1087\nU 1406 ; WX 602 ; N uni057E ; G 1088\nU 1407 ; WX 602 ; N uni057F ; G 1089\nU 1408 ; WX 602 ; N uni0580 ; G 1090\nU 1409 ; WX 602 ; N uni0581 ; G 1091\nU 1410 ; WX 602 ; N uni0582 ; G 1092\nU 1411 ; WX 602 ; N uni0583 ; G 1093\nU 1412 ; WX 602 ; N uni0584 ; G 1094\nU 1413 ; WX 602 ; N uni0585 ; G 1095\nU 1414 ; WX 602 ; N uni0586 ; G 1096\nU 1415 ; WX 602 ; N uni0587 ; G 1097\nU 1417 ; WX 602 ; N uni0589 ; G 1098\nU 1418 ; WX 602 ; N uni058A ; G 1099\nU 3647 ; WX 602 ; N uni0E3F ; G 1100\nU 3713 ; WX 602 ; N uni0E81 ; G 1101\nU 3714 ; WX 602 ; N uni0E82 ; G 1102\nU 3716 ; WX 602 ; N uni0E84 ; G 1103\nU 3719 ; WX 602 ; N uni0E87 ; G 1104\nU 3720 ; WX 602 ; N uni0E88 ; G 1105\nU 3722 ; WX 602 ; N uni0E8A ; G 1106\nU 3725 ; WX 602 ; N uni0E8D ; G 1107\nU 3732 ; WX 602 ; N uni0E94 ; G 1108\nU 3733 ; WX 602 ; N uni0E95 ; G 1109\nU 3734 ; WX 602 ; N uni0E96 ; G 1110\nU 3735 ; WX 602 ; N uni0E97 ; G 1111\nU 3737 ; WX 602 ; N uni0E99 ; G 1112\nU 3738 ; WX 602 ; N uni0E9A ; G 1113\nU 3739 ; WX 602 ; N uni0E9B ; G 1114\nU 3740 ; WX 602 ; N uni0E9C ; G 1115\nU 3741 ; WX 602 ; N uni0E9D ; G 1116\nU 3742 ; WX 602 ; N uni0E9E ; G 1117\nU 3743 ; WX 602 ; N uni0E9F ; G 1118\nU 3745 ; WX 602 ; N uni0EA1 ; G 1119\nU 3746 ; WX 602 ; N uni0EA2 ; G 1120\nU 3747 ; WX 602 ; N uni0EA3 ; G 1121\nU 3749 ; WX 602 ; N uni0EA5 ; G 1122\nU 3751 ; WX 602 ; N uni0EA7 ; G 1123\nU 3754 ; WX 602 ; N uni0EAA ; G 1124\nU 3755 ; WX 602 ; N uni0EAB ; G 1125\nU 3757 ; WX 602 ; N uni0EAD ; G 1126\nU 3758 ; WX 602 ; N uni0EAE ; G 1127\nU 3759 ; WX 602 ; N uni0EAF ; G 1128\nU 3760 ; WX 602 ; N uni0EB0 ; G 1129\nU 3761 ; WX 602 ; N uni0EB1 ; G 1130\nU 3762 ; WX 602 ; N uni0EB2 ; G 1131\nU 3763 ; WX 602 ; N uni0EB3 ; G 1132\nU 3764 ; WX 602 ; N uni0EB4 ; G 1133\nU 3765 ; WX 602 ; N uni0EB5 ; G 1134\nU 3766 ; WX 602 ; N uni0EB6 ; G 1135\nU 3767 ; WX 602 ; N uni0EB7 ; G 1136\nU 3768 ; WX 602 ; N uni0EB8 ; G 1137\nU 3769 ; WX 602 ; N uni0EB9 ; G 1138\nU 3771 ; WX 602 ; N uni0EBB ; G 1139\nU 3772 ; WX 602 ; N uni0EBC ; G 1140\nU 3784 ; WX 602 ; N uni0EC8 ; G 1141\nU 3785 ; WX 602 ; N uni0EC9 ; G 1142\nU 3786 ; WX 602 ; N uni0ECA ; G 1143\nU 3787 ; WX 602 ; N uni0ECB ; G 1144\nU 3788 ; WX 602 ; N uni0ECC ; G 1145\nU 3789 ; WX 602 ; N uni0ECD ; G 1146\nU 4304 ; WX 602 ; N uni10D0 ; G 1147\nU 4305 ; WX 602 ; N uni10D1 ; G 1148\nU 4306 ; WX 602 ; N uni10D2 ; G 1149\nU 4307 ; WX 602 ; N uni10D3 ; G 1150\nU 4308 ; WX 602 ; N uni10D4 ; G 1151\nU 4309 ; WX 602 ; N uni10D5 ; G 1152\nU 4310 ; WX 602 ; N uni10D6 ; G 1153\nU 4311 ; WX 602 ; N uni10D7 ; G 1154\nU 4312 ; WX 602 ; N uni10D8 ; G 1155\nU 4313 ; WX 602 ; N uni10D9 ; G 1156\nU 4314 ; WX 602 ; N uni10DA ; G 1157\nU 4315 ; WX 602 ; N uni10DB ; G 1158\nU 4316 ; WX 602 ; N uni10DC ; G 1159\nU 4317 ; WX 602 ; N uni10DD ; G 1160\nU 4318 ; WX 602 ; N uni10DE ; G 1161\nU 4319 ; WX 602 ; N uni10DF ; G 1162\nU 4320 ; WX 602 ; N uni10E0 ; G 1163\nU 4321 ; WX 602 ; N uni10E1 ; G 1164\nU 4322 ; WX 602 ; N uni10E2 ; G 1165\nU 4323 ; WX 602 ; N uni10E3 ; G 1166\nU 4324 ; WX 602 ; N uni10E4 ; G 1167\nU 4325 ; WX 602 ; N uni10E5 ; G 1168\nU 4326 ; WX 602 ; N uni10E6 ; G 1169\nU 4327 ; WX 602 ; N uni10E7 ; G 1170\nU 4328 ; WX 602 ; N uni10E8 ; G 1171\nU 4329 ; WX 602 ; N uni10E9 ; G 1172\nU 4330 ; WX 602 ; N uni10EA ; G 1173\nU 4331 ; WX 602 ; N uni10EB ; G 1174\nU 4332 ; WX 602 ; N uni10EC ; G 1175\nU 4333 ; WX 602 ; N uni10ED ; G 1176\nU 4334 ; WX 602 ; N uni10EE ; G 1177\nU 4335 ; WX 602 ; N uni10EF ; G 1178\nU 4336 ; WX 602 ; N uni10F0 ; G 1179\nU 4337 ; WX 602 ; N uni10F1 ; G 1180\nU 4338 ; WX 602 ; N uni10F2 ; G 1181\nU 4339 ; WX 602 ; N uni10F3 ; G 1182\nU 4340 ; WX 602 ; N uni10F4 ; G 1183\nU 4341 ; WX 602 ; N uni10F5 ; G 1184\nU 4342 ; WX 602 ; N uni10F6 ; G 1185\nU 4343 ; WX 602 ; N uni10F7 ; G 1186\nU 4344 ; WX 602 ; N uni10F8 ; G 1187\nU 4345 ; WX 602 ; N uni10F9 ; G 1188\nU 4346 ; WX 602 ; N uni10FA ; G 1189\nU 4347 ; WX 602 ; N uni10FB ; G 1190\nU 4348 ; WX 602 ; N uni10FC ; G 1191\nU 7426 ; WX 602 ; N uni1D02 ; G 1192\nU 7432 ; WX 602 ; N uni1D08 ; G 1193\nU 7433 ; WX 602 ; N uni1D09 ; G 1194\nU 7444 ; WX 602 ; N uni1D14 ; G 1195\nU 7446 ; WX 602 ; N uni1D16 ; G 1196\nU 7447 ; WX 602 ; N uni1D17 ; G 1197\nU 7453 ; WX 602 ; N uni1D1D ; G 1198\nU 7454 ; WX 602 ; N uni1D1E ; G 1199\nU 7455 ; WX 602 ; N uni1D1F ; G 1200\nU 7468 ; WX 602 ; N uni1D2C ; G 1201\nU 7469 ; WX 602 ; N uni1D2D ; G 1202\nU 7470 ; WX 602 ; N uni1D2E ; G 1203\nU 7472 ; WX 602 ; N uni1D30 ; G 1204\nU 7473 ; WX 602 ; N uni1D31 ; G 1205\nU 7474 ; WX 602 ; N uni1D32 ; G 1206\nU 7475 ; WX 602 ; N uni1D33 ; G 1207\nU 7476 ; WX 602 ; N uni1D34 ; G 1208\nU 7477 ; WX 602 ; N uni1D35 ; G 1209\nU 7478 ; WX 602 ; N uni1D36 ; G 1210\nU 7479 ; WX 602 ; N uni1D37 ; G 1211\nU 7480 ; WX 602 ; N uni1D38 ; G 1212\nU 7481 ; WX 602 ; N uni1D39 ; G 1213\nU 7482 ; WX 602 ; N uni1D3A ; G 1214\nU 7483 ; WX 602 ; N uni1D3B ; G 1215\nU 7484 ; WX 602 ; N uni1D3C ; G 1216\nU 7485 ; WX 602 ; N uni1D3D ; G 1217\nU 7486 ; WX 602 ; N uni1D3E ; G 1218\nU 7487 ; WX 602 ; N uni1D3F ; G 1219\nU 7488 ; WX 602 ; N uni1D40 ; G 1220\nU 7489 ; WX 602 ; N uni1D41 ; G 1221\nU 7490 ; WX 602 ; N uni1D42 ; G 1222\nU 7491 ; WX 602 ; N uni1D43 ; G 1223\nU 7492 ; WX 602 ; N uni1D44 ; G 1224\nU 7493 ; WX 602 ; N uni1D45 ; G 1225\nU 7494 ; WX 602 ; N uni1D46 ; G 1226\nU 7495 ; WX 602 ; N uni1D47 ; G 1227\nU 7496 ; WX 602 ; N uni1D48 ; G 1228\nU 7497 ; WX 602 ; N uni1D49 ; G 1229\nU 7498 ; WX 602 ; N uni1D4A ; G 1230\nU 7499 ; WX 602 ; N uni1D4B ; G 1231\nU 7500 ; WX 602 ; N uni1D4C ; G 1232\nU 7501 ; WX 602 ; N uni1D4D ; G 1233\nU 7502 ; WX 602 ; N uni1D4E ; G 1234\nU 7503 ; WX 602 ; N uni1D4F ; G 1235\nU 7504 ; WX 602 ; N uni1D50 ; G 1236\nU 7505 ; WX 602 ; N uni1D51 ; G 1237\nU 7506 ; WX 602 ; N uni1D52 ; G 1238\nU 7507 ; WX 602 ; N uni1D53 ; G 1239\nU 7508 ; WX 602 ; N uni1D54 ; G 1240\nU 7509 ; WX 602 ; N uni1D55 ; G 1241\nU 7510 ; WX 602 ; N uni1D56 ; G 1242\nU 7511 ; WX 602 ; N uni1D57 ; G 1243\nU 7512 ; WX 602 ; N uni1D58 ; G 1244\nU 7513 ; WX 602 ; N uni1D59 ; G 1245\nU 7514 ; WX 602 ; N uni1D5A ; G 1246\nU 7515 ; WX 602 ; N uni1D5B ; G 1247\nU 7522 ; WX 602 ; N uni1D62 ; G 1248\nU 7523 ; WX 602 ; N uni1D63 ; G 1249\nU 7524 ; WX 602 ; N uni1D64 ; G 1250\nU 7525 ; WX 602 ; N uni1D65 ; G 1251\nU 7543 ; WX 602 ; N uni1D77 ; G 1252\nU 7544 ; WX 602 ; N uni1D78 ; G 1253\nU 7547 ; WX 602 ; N uni1D7B ; G 1254\nU 7557 ; WX 602 ; N uni1D85 ; G 1255\nU 7579 ; WX 602 ; N uni1D9B ; G 1256\nU 7580 ; WX 602 ; N uni1D9C ; G 1257\nU 7581 ; WX 602 ; N uni1D9D ; G 1258\nU 7582 ; WX 602 ; N uni1D9E ; G 1259\nU 7583 ; WX 602 ; N uni1D9F ; G 1260\nU 7584 ; WX 602 ; N uni1DA0 ; G 1261\nU 7585 ; WX 602 ; N uni1DA1 ; G 1262\nU 7586 ; WX 602 ; N uni1DA2 ; G 1263\nU 7587 ; WX 602 ; N uni1DA3 ; G 1264\nU 7588 ; WX 602 ; N uni1DA4 ; G 1265\nU 7589 ; WX 602 ; N uni1DA5 ; G 1266\nU 7590 ; WX 602 ; N uni1DA6 ; G 1267\nU 7591 ; WX 602 ; N uni1DA7 ; G 1268\nU 7592 ; WX 602 ; N uni1DA8 ; G 1269\nU 7593 ; WX 602 ; N uni1DA9 ; G 1270\nU 7594 ; WX 602 ; N uni1DAA ; G 1271\nU 7595 ; WX 602 ; N uni1DAB ; G 1272\nU 7596 ; WX 602 ; N uni1DAC ; G 1273\nU 7597 ; WX 602 ; N uni1DAD ; G 1274\nU 7598 ; WX 602 ; N uni1DAE ; G 1275\nU 7599 ; WX 602 ; N uni1DAF ; G 1276\nU 7600 ; WX 602 ; N uni1DB0 ; G 1277\nU 7601 ; WX 602 ; N uni1DB1 ; G 1278\nU 7602 ; WX 602 ; N uni1DB2 ; G 1279\nU 7603 ; WX 602 ; N uni1DB3 ; G 1280\nU 7604 ; WX 602 ; N uni1DB4 ; G 1281\nU 7605 ; WX 602 ; N uni1DB5 ; G 1282\nU 7606 ; WX 602 ; N uni1DB6 ; G 1283\nU 7607 ; WX 602 ; N uni1DB7 ; G 1284\nU 7609 ; WX 602 ; N uni1DB9 ; G 1285\nU 7610 ; WX 602 ; N uni1DBA ; G 1286\nU 7611 ; WX 602 ; N uni1DBB ; G 1287\nU 7612 ; WX 602 ; N uni1DBC ; G 1288\nU 7613 ; WX 602 ; N uni1DBD ; G 1289\nU 7614 ; WX 602 ; N uni1DBE ; G 1290\nU 7615 ; WX 602 ; N uni1DBF ; G 1291\nU 7680 ; WX 602 ; N uni1E00 ; G 1292\nU 7681 ; WX 602 ; N uni1E01 ; G 1293\nU 7682 ; WX 602 ; N uni1E02 ; G 1294\nU 7683 ; WX 602 ; N uni1E03 ; G 1295\nU 7684 ; WX 602 ; N uni1E04 ; G 1296\nU 7685 ; WX 602 ; N uni1E05 ; G 1297\nU 7686 ; WX 602 ; N uni1E06 ; G 1298\nU 7687 ; WX 602 ; N uni1E07 ; G 1299\nU 7688 ; WX 602 ; N uni1E08 ; G 1300\nU 7689 ; WX 602 ; N uni1E09 ; G 1301\nU 7690 ; WX 602 ; N uni1E0A ; G 1302\nU 7691 ; WX 602 ; N uni1E0B ; G 1303\nU 7692 ; WX 602 ; N uni1E0C ; G 1304\nU 7693 ; WX 602 ; N uni1E0D ; G 1305\nU 7694 ; WX 602 ; N uni1E0E ; G 1306\nU 7695 ; WX 602 ; N uni1E0F ; G 1307\nU 7696 ; WX 602 ; N uni1E10 ; G 1308\nU 7697 ; WX 602 ; N uni1E11 ; G 1309\nU 7698 ; WX 602 ; N uni1E12 ; G 1310\nU 7699 ; WX 602 ; N uni1E13 ; G 1311\nU 7704 ; WX 602 ; N uni1E18 ; G 1312\nU 7705 ; WX 602 ; N uni1E19 ; G 1313\nU 7706 ; WX 602 ; N uni1E1A ; G 1314\nU 7707 ; WX 602 ; N uni1E1B ; G 1315\nU 7708 ; WX 602 ; N uni1E1C ; G 1316\nU 7709 ; WX 602 ; N uni1E1D ; G 1317\nU 7710 ; WX 602 ; N uni1E1E ; G 1318\nU 7711 ; WX 602 ; N uni1E1F ; G 1319\nU 7712 ; WX 602 ; N uni1E20 ; G 1320\nU 7713 ; WX 602 ; N uni1E21 ; G 1321\nU 7714 ; WX 602 ; N uni1E22 ; G 1322\nU 7715 ; WX 602 ; N uni1E23 ; G 1323\nU 7716 ; WX 602 ; N uni1E24 ; G 1324\nU 7717 ; WX 602 ; N uni1E25 ; G 1325\nU 7718 ; WX 602 ; N uni1E26 ; G 1326\nU 7719 ; WX 602 ; N uni1E27 ; G 1327\nU 7720 ; WX 602 ; N uni1E28 ; G 1328\nU 7721 ; WX 602 ; N uni1E29 ; G 1329\nU 7722 ; WX 602 ; N uni1E2A ; G 1330\nU 7723 ; WX 602 ; N uni1E2B ; G 1331\nU 7724 ; WX 602 ; N uni1E2C ; G 1332\nU 7725 ; WX 602 ; N uni1E2D ; G 1333\nU 7728 ; WX 602 ; N uni1E30 ; G 1334\nU 7729 ; WX 602 ; N uni1E31 ; G 1335\nU 7730 ; WX 602 ; N uni1E32 ; G 1336\nU 7731 ; WX 602 ; N uni1E33 ; G 1337\nU 7732 ; WX 602 ; N uni1E34 ; G 1338\nU 7733 ; WX 602 ; N uni1E35 ; G 1339\nU 7734 ; WX 602 ; N uni1E36 ; G 1340\nU 7735 ; WX 602 ; N uni1E37 ; G 1341\nU 7736 ; WX 602 ; N uni1E38 ; G 1342\nU 7737 ; WX 602 ; N uni1E39 ; G 1343\nU 7738 ; WX 602 ; N uni1E3A ; G 1344\nU 7739 ; WX 602 ; N uni1E3B ; G 1345\nU 7740 ; WX 602 ; N uni1E3C ; G 1346\nU 7741 ; WX 602 ; N uni1E3D ; G 1347\nU 7742 ; WX 602 ; N uni1E3E ; G 1348\nU 7743 ; WX 602 ; N uni1E3F ; G 1349\nU 7744 ; WX 602 ; N uni1E40 ; G 1350\nU 7745 ; WX 602 ; N uni1E41 ; G 1351\nU 7746 ; WX 602 ; N uni1E42 ; G 1352\nU 7747 ; WX 602 ; N uni1E43 ; G 1353\nU 7748 ; WX 602 ; N uni1E44 ; G 1354\nU 7749 ; WX 602 ; N uni1E45 ; G 1355\nU 7750 ; WX 602 ; N uni1E46 ; G 1356\nU 7751 ; WX 602 ; N uni1E47 ; G 1357\nU 7752 ; WX 602 ; N uni1E48 ; G 1358\nU 7753 ; WX 602 ; N uni1E49 ; G 1359\nU 7754 ; WX 602 ; N uni1E4A ; G 1360\nU 7755 ; WX 602 ; N uni1E4B ; G 1361\nU 7756 ; WX 602 ; N uni1E4C ; G 1362\nU 7757 ; WX 602 ; N uni1E4D ; G 1363\nU 7764 ; WX 602 ; N uni1E54 ; G 1364\nU 7765 ; WX 602 ; N uni1E55 ; G 1365\nU 7766 ; WX 602 ; N uni1E56 ; G 1366\nU 7767 ; WX 602 ; N uni1E57 ; G 1367\nU 7768 ; WX 602 ; N uni1E58 ; G 1368\nU 7769 ; WX 602 ; N uni1E59 ; G 1369\nU 7770 ; WX 602 ; N uni1E5A ; G 1370\nU 7771 ; WX 602 ; N uni1E5B ; G 1371\nU 7772 ; WX 602 ; N uni1E5C ; G 1372\nU 7773 ; WX 602 ; N uni1E5D ; G 1373\nU 7774 ; WX 602 ; N uni1E5E ; G 1374\nU 7775 ; WX 602 ; N uni1E5F ; G 1375\nU 7776 ; WX 602 ; N uni1E60 ; G 1376\nU 7777 ; WX 602 ; N uni1E61 ; G 1377\nU 7778 ; WX 602 ; N uni1E62 ; G 1378\nU 7779 ; WX 602 ; N uni1E63 ; G 1379\nU 7784 ; WX 602 ; N uni1E68 ; G 1380\nU 7785 ; WX 602 ; N uni1E69 ; G 1381\nU 7786 ; WX 602 ; N uni1E6A ; G 1382\nU 7787 ; WX 602 ; N uni1E6B ; G 1383\nU 7788 ; WX 602 ; N uni1E6C ; G 1384\nU 7789 ; WX 602 ; N uni1E6D ; G 1385\nU 7790 ; WX 602 ; N uni1E6E ; G 1386\nU 7791 ; WX 602 ; N uni1E6F ; G 1387\nU 7792 ; WX 602 ; N uni1E70 ; G 1388\nU 7793 ; WX 602 ; N uni1E71 ; G 1389\nU 7794 ; WX 602 ; N uni1E72 ; G 1390\nU 7795 ; WX 602 ; N uni1E73 ; G 1391\nU 7796 ; WX 602 ; N uni1E74 ; G 1392\nU 7797 ; WX 602 ; N uni1E75 ; G 1393\nU 7798 ; WX 602 ; N uni1E76 ; G 1394\nU 7799 ; WX 602 ; N uni1E77 ; G 1395\nU 7800 ; WX 602 ; N uni1E78 ; G 1396\nU 7801 ; WX 602 ; N uni1E79 ; G 1397\nU 7804 ; WX 602 ; N uni1E7C ; G 1398\nU 7805 ; WX 602 ; N uni1E7D ; G 1399\nU 7806 ; WX 602 ; N uni1E7E ; G 1400\nU 7807 ; WX 602 ; N uni1E7F ; G 1401\nU 7808 ; WX 602 ; N Wgrave ; G 1402\nU 7809 ; WX 602 ; N wgrave ; G 1403\nU 7810 ; WX 602 ; N Wacute ; G 1404\nU 7811 ; WX 602 ; N wacute ; G 1405\nU 7812 ; WX 602 ; N Wdieresis ; G 1406\nU 7813 ; WX 602 ; N wdieresis ; G 1407\nU 7814 ; WX 602 ; N uni1E86 ; G 1408\nU 7815 ; WX 602 ; N uni1E87 ; G 1409\nU 7816 ; WX 602 ; N uni1E88 ; G 1410\nU 7817 ; WX 602 ; N uni1E89 ; G 1411\nU 7818 ; WX 602 ; N uni1E8A ; G 1412\nU 7819 ; WX 602 ; N uni1E8B ; G 1413\nU 7820 ; WX 602 ; N uni1E8C ; G 1414\nU 7821 ; WX 602 ; N uni1E8D ; G 1415\nU 7822 ; WX 602 ; N uni1E8E ; G 1416\nU 7823 ; WX 602 ; N uni1E8F ; G 1417\nU 7824 ; WX 602 ; N uni1E90 ; G 1418\nU 7825 ; WX 602 ; N uni1E91 ; G 1419\nU 7826 ; WX 602 ; N uni1E92 ; G 1420\nU 7827 ; WX 602 ; N uni1E93 ; G 1421\nU 7828 ; WX 602 ; N uni1E94 ; G 1422\nU 7829 ; WX 602 ; N uni1E95 ; G 1423\nU 7830 ; WX 602 ; N uni1E96 ; G 1424\nU 7831 ; WX 602 ; N uni1E97 ; G 1425\nU 7832 ; WX 602 ; N uni1E98 ; G 1426\nU 7833 ; WX 602 ; N uni1E99 ; G 1427\nU 7835 ; WX 602 ; N uni1E9B ; G 1428\nU 7839 ; WX 602 ; N uni1E9F ; G 1429\nU 7840 ; WX 602 ; N uni1EA0 ; G 1430\nU 7841 ; WX 602 ; N uni1EA1 ; G 1431\nU 7852 ; WX 602 ; N uni1EAC ; G 1432\nU 7853 ; WX 602 ; N uni1EAD ; G 1433\nU 7856 ; WX 602 ; N uni1EB0 ; G 1434\nU 7857 ; WX 602 ; N uni1EB1 ; G 1435\nU 7862 ; WX 602 ; N uni1EB6 ; G 1436\nU 7863 ; WX 602 ; N uni1EB7 ; G 1437\nU 7864 ; WX 602 ; N uni1EB8 ; G 1438\nU 7865 ; WX 602 ; N uni1EB9 ; G 1439\nU 7868 ; WX 602 ; N uni1EBC ; G 1440\nU 7869 ; WX 602 ; N uni1EBD ; G 1441\nU 7878 ; WX 602 ; N uni1EC6 ; G 1442\nU 7879 ; WX 602 ; N uni1EC7 ; G 1443\nU 7882 ; WX 602 ; N uni1ECA ; G 1444\nU 7883 ; WX 602 ; N uni1ECB ; G 1445\nU 7884 ; WX 602 ; N uni1ECC ; G 1446\nU 7885 ; WX 602 ; N uni1ECD ; G 1447\nU 7896 ; WX 602 ; N uni1ED8 ; G 1448\nU 7897 ; WX 602 ; N uni1ED9 ; G 1449\nU 7898 ; WX 602 ; N uni1EDA ; G 1450\nU 7899 ; WX 602 ; N uni1EDB ; G 1451\nU 7900 ; WX 602 ; N uni1EDC ; G 1452\nU 7901 ; WX 602 ; N uni1EDD ; G 1453\nU 7904 ; WX 602 ; N uni1EE0 ; G 1454\nU 7905 ; WX 602 ; N uni1EE1 ; G 1455\nU 7906 ; WX 602 ; N uni1EE2 ; G 1456\nU 7907 ; WX 602 ; N uni1EE3 ; G 1457\nU 7908 ; WX 602 ; N uni1EE4 ; G 1458\nU 7909 ; WX 602 ; N uni1EE5 ; G 1459\nU 7912 ; WX 602 ; N uni1EE8 ; G 1460\nU 7913 ; WX 602 ; N uni1EE9 ; G 1461\nU 7914 ; WX 602 ; N uni1EEA ; G 1462\nU 7915 ; WX 602 ; N uni1EEB ; G 1463\nU 7918 ; WX 602 ; N uni1EEE ; G 1464\nU 7919 ; WX 602 ; N uni1EEF ; G 1465\nU 7920 ; WX 602 ; N uni1EF0 ; G 1466\nU 7921 ; WX 602 ; N uni1EF1 ; G 1467\nU 7922 ; WX 602 ; N Ygrave ; G 1468\nU 7923 ; WX 602 ; N ygrave ; G 1469\nU 7924 ; WX 602 ; N uni1EF4 ; G 1470\nU 7925 ; WX 602 ; N uni1EF5 ; G 1471\nU 7928 ; WX 602 ; N uni1EF8 ; G 1472\nU 7929 ; WX 602 ; N uni1EF9 ; G 1473\nU 7936 ; WX 602 ; N uni1F00 ; G 1474\nU 7937 ; WX 602 ; N uni1F01 ; G 1475\nU 7938 ; WX 602 ; N uni1F02 ; G 1476\nU 7939 ; WX 602 ; N uni1F03 ; G 1477\nU 7940 ; WX 602 ; N uni1F04 ; G 1478\nU 7941 ; WX 602 ; N uni1F05 ; G 1479\nU 7942 ; WX 602 ; N uni1F06 ; G 1480\nU 7943 ; WX 602 ; N uni1F07 ; G 1481\nU 7944 ; WX 602 ; N uni1F08 ; G 1482\nU 7945 ; WX 602 ; N uni1F09 ; G 1483\nU 7946 ; WX 602 ; N uni1F0A ; G 1484\nU 7947 ; WX 602 ; N uni1F0B ; G 1485\nU 7948 ; WX 602 ; N uni1F0C ; G 1486\nU 7949 ; WX 602 ; N uni1F0D ; G 1487\nU 7950 ; WX 602 ; N uni1F0E ; G 1488\nU 7951 ; WX 602 ; N uni1F0F ; G 1489\nU 7952 ; WX 602 ; N uni1F10 ; G 1490\nU 7953 ; WX 602 ; N uni1F11 ; G 1491\nU 7954 ; WX 602 ; N uni1F12 ; G 1492\nU 7955 ; WX 602 ; N uni1F13 ; G 1493\nU 7956 ; WX 602 ; N uni1F14 ; G 1494\nU 7957 ; WX 602 ; N uni1F15 ; G 1495\nU 7960 ; WX 602 ; N uni1F18 ; G 1496\nU 7961 ; WX 602 ; N uni1F19 ; G 1497\nU 7962 ; WX 602 ; N uni1F1A ; G 1498\nU 7963 ; WX 602 ; N uni1F1B ; G 1499\nU 7964 ; WX 602 ; N uni1F1C ; G 1500\nU 7965 ; WX 602 ; N uni1F1D ; G 1501\nU 7968 ; WX 602 ; N uni1F20 ; G 1502\nU 7969 ; WX 602 ; N uni1F21 ; G 1503\nU 7970 ; WX 602 ; N uni1F22 ; G 1504\nU 7971 ; WX 602 ; N uni1F23 ; G 1505\nU 7972 ; WX 602 ; N uni1F24 ; G 1506\nU 7973 ; WX 602 ; N uni1F25 ; G 1507\nU 7974 ; WX 602 ; N uni1F26 ; G 1508\nU 7975 ; WX 602 ; N uni1F27 ; G 1509\nU 7976 ; WX 602 ; N uni1F28 ; G 1510\nU 7977 ; WX 602 ; N uni1F29 ; G 1511\nU 7978 ; WX 602 ; N uni1F2A ; G 1512\nU 7979 ; WX 602 ; N uni1F2B ; G 1513\nU 7980 ; WX 602 ; N uni1F2C ; G 1514\nU 7981 ; WX 602 ; N uni1F2D ; G 1515\nU 7982 ; WX 602 ; N uni1F2E ; G 1516\nU 7983 ; WX 602 ; N uni1F2F ; G 1517\nU 7984 ; WX 602 ; N uni1F30 ; G 1518\nU 7985 ; WX 602 ; N uni1F31 ; G 1519\nU 7986 ; WX 602 ; N uni1F32 ; G 1520\nU 7987 ; WX 602 ; N uni1F33 ; G 1521\nU 7988 ; WX 602 ; N uni1F34 ; G 1522\nU 7989 ; WX 602 ; N uni1F35 ; G 1523\nU 7990 ; WX 602 ; N uni1F36 ; G 1524\nU 7991 ; WX 602 ; N uni1F37 ; G 1525\nU 7992 ; WX 602 ; N uni1F38 ; G 1526\nU 7993 ; WX 602 ; N uni1F39 ; G 1527\nU 7994 ; WX 602 ; N uni1F3A ; G 1528\nU 7995 ; WX 602 ; N uni1F3B ; G 1529\nU 7996 ; WX 602 ; N uni1F3C ; G 1530\nU 7997 ; WX 602 ; N uni1F3D ; G 1531\nU 7998 ; WX 602 ; N uni1F3E ; G 1532\nU 7999 ; WX 602 ; N uni1F3F ; G 1533\nU 8000 ; WX 602 ; N uni1F40 ; G 1534\nU 8001 ; WX 602 ; N uni1F41 ; G 1535\nU 8002 ; WX 602 ; N uni1F42 ; G 1536\nU 8003 ; WX 602 ; N uni1F43 ; G 1537\nU 8004 ; WX 602 ; N uni1F44 ; G 1538\nU 8005 ; WX 602 ; N uni1F45 ; G 1539\nU 8008 ; WX 602 ; N uni1F48 ; G 1540\nU 8009 ; WX 602 ; N uni1F49 ; G 1541\nU 8010 ; WX 602 ; N uni1F4A ; G 1542\nU 8011 ; WX 602 ; N uni1F4B ; G 1543\nU 8012 ; WX 602 ; N uni1F4C ; G 1544\nU 8013 ; WX 602 ; N uni1F4D ; G 1545\nU 8016 ; WX 602 ; N uni1F50 ; G 1546\nU 8017 ; WX 602 ; N uni1F51 ; G 1547\nU 8018 ; WX 602 ; N uni1F52 ; G 1548\nU 8019 ; WX 602 ; N uni1F53 ; G 1549\nU 8020 ; WX 602 ; N uni1F54 ; G 1550\nU 8021 ; WX 602 ; N uni1F55 ; G 1551\nU 8022 ; WX 602 ; N uni1F56 ; G 1552\nU 8023 ; WX 602 ; N uni1F57 ; G 1553\nU 8025 ; WX 602 ; N uni1F59 ; G 1554\nU 8027 ; WX 602 ; N uni1F5B ; G 1555\nU 8029 ; WX 602 ; N uni1F5D ; G 1556\nU 8031 ; WX 602 ; N uni1F5F ; G 1557\nU 8032 ; WX 602 ; N uni1F60 ; G 1558\nU 8033 ; WX 602 ; N uni1F61 ; G 1559\nU 8034 ; WX 602 ; N uni1F62 ; G 1560\nU 8035 ; WX 602 ; N uni1F63 ; G 1561\nU 8036 ; WX 602 ; N uni1F64 ; G 1562\nU 8037 ; WX 602 ; N uni1F65 ; G 1563\nU 8038 ; WX 602 ; N uni1F66 ; G 1564\nU 8039 ; WX 602 ; N uni1F67 ; G 1565\nU 8040 ; WX 602 ; N uni1F68 ; G 1566\nU 8041 ; WX 602 ; N uni1F69 ; G 1567\nU 8042 ; WX 602 ; N uni1F6A ; G 1568\nU 8043 ; WX 602 ; N uni1F6B ; G 1569\nU 8044 ; WX 602 ; N uni1F6C ; G 1570\nU 8045 ; WX 602 ; N uni1F6D ; G 1571\nU 8046 ; WX 602 ; N uni1F6E ; G 1572\nU 8047 ; WX 602 ; N uni1F6F ; G 1573\nU 8048 ; WX 602 ; N uni1F70 ; G 1574\nU 8049 ; WX 602 ; N uni1F71 ; G 1575\nU 8050 ; WX 602 ; N uni1F72 ; G 1576\nU 8051 ; WX 602 ; N uni1F73 ; G 1577\nU 8052 ; WX 602 ; N uni1F74 ; G 1578\nU 8053 ; WX 602 ; N uni1F75 ; G 1579\nU 8054 ; WX 602 ; N uni1F76 ; G 1580\nU 8055 ; WX 602 ; N uni1F77 ; G 1581\nU 8056 ; WX 602 ; N uni1F78 ; G 1582\nU 8057 ; WX 602 ; N uni1F79 ; G 1583\nU 8058 ; WX 602 ; N uni1F7A ; G 1584\nU 8059 ; WX 602 ; N uni1F7B ; G 1585\nU 8060 ; WX 602 ; N uni1F7C ; G 1586\nU 8061 ; WX 602 ; N uni1F7D ; G 1587\nU 8064 ; WX 602 ; N uni1F80 ; G 1588\nU 8065 ; WX 602 ; N uni1F81 ; G 1589\nU 8066 ; WX 602 ; N uni1F82 ; G 1590\nU 8067 ; WX 602 ; N uni1F83 ; G 1591\nU 8068 ; WX 602 ; N uni1F84 ; G 1592\nU 8069 ; WX 602 ; N uni1F85 ; G 1593\nU 8070 ; WX 602 ; N uni1F86 ; G 1594\nU 8071 ; WX 602 ; N uni1F87 ; G 1595\nU 8072 ; WX 602 ; N uni1F88 ; G 1596\nU 8073 ; WX 602 ; N uni1F89 ; G 1597\nU 8074 ; WX 602 ; N uni1F8A ; G 1598\nU 8075 ; WX 602 ; N uni1F8B ; G 1599\nU 8076 ; WX 602 ; N uni1F8C ; G 1600\nU 8077 ; WX 602 ; N uni1F8D ; G 1601\nU 8078 ; WX 602 ; N uni1F8E ; G 1602\nU 8079 ; WX 602 ; N uni1F8F ; G 1603\nU 8080 ; WX 602 ; N uni1F90 ; G 1604\nU 8081 ; WX 602 ; N uni1F91 ; G 1605\nU 8082 ; WX 602 ; N uni1F92 ; G 1606\nU 8083 ; WX 602 ; N uni1F93 ; G 1607\nU 8084 ; WX 602 ; N uni1F94 ; G 1608\nU 8085 ; WX 602 ; N uni1F95 ; G 1609\nU 8086 ; WX 602 ; N uni1F96 ; G 1610\nU 8087 ; WX 602 ; N uni1F97 ; G 1611\nU 8088 ; WX 602 ; N uni1F98 ; G 1612\nU 8089 ; WX 602 ; N uni1F99 ; G 1613\nU 8090 ; WX 602 ; N uni1F9A ; G 1614\nU 8091 ; WX 602 ; N uni1F9B ; G 1615\nU 8092 ; WX 602 ; N uni1F9C ; G 1616\nU 8093 ; WX 602 ; N uni1F9D ; G 1617\nU 8094 ; WX 602 ; N uni1F9E ; G 1618\nU 8095 ; WX 602 ; N uni1F9F ; G 1619\nU 8096 ; WX 602 ; N uni1FA0 ; G 1620\nU 8097 ; WX 602 ; N uni1FA1 ; G 1621\nU 8098 ; WX 602 ; N uni1FA2 ; G 1622\nU 8099 ; WX 602 ; N uni1FA3 ; G 1623\nU 8100 ; WX 602 ; N uni1FA4 ; G 1624\nU 8101 ; WX 602 ; N uni1FA5 ; G 1625\nU 8102 ; WX 602 ; N uni1FA6 ; G 1626\nU 8103 ; WX 602 ; N uni1FA7 ; G 1627\nU 8104 ; WX 602 ; N uni1FA8 ; G 1628\nU 8105 ; WX 602 ; N uni1FA9 ; G 1629\nU 8106 ; WX 602 ; N uni1FAA ; G 1630\nU 8107 ; WX 602 ; N uni1FAB ; G 1631\nU 8108 ; WX 602 ; N uni1FAC ; G 1632\nU 8109 ; WX 602 ; N uni1FAD ; G 1633\nU 8110 ; WX 602 ; N uni1FAE ; G 1634\nU 8111 ; WX 602 ; N uni1FAF ; G 1635\nU 8112 ; WX 602 ; N uni1FB0 ; G 1636\nU 8113 ; WX 602 ; N uni1FB1 ; G 1637\nU 8114 ; WX 602 ; N uni1FB2 ; G 1638\nU 8115 ; WX 602 ; N uni1FB3 ; G 1639\nU 8116 ; WX 602 ; N uni1FB4 ; G 1640\nU 8118 ; WX 602 ; N uni1FB6 ; G 1641\nU 8119 ; WX 602 ; N uni1FB7 ; G 1642\nU 8120 ; WX 602 ; N uni1FB8 ; G 1643\nU 8121 ; WX 602 ; N uni1FB9 ; G 1644\nU 8122 ; WX 602 ; N uni1FBA ; G 1645\nU 8123 ; WX 602 ; N uni1FBB ; G 1646\nU 8124 ; WX 602 ; N uni1FBC ; G 1647\nU 8125 ; WX 602 ; N uni1FBD ; G 1648\nU 8126 ; WX 602 ; N uni1FBE ; G 1649\nU 8127 ; WX 602 ; N uni1FBF ; G 1650\nU 8128 ; WX 602 ; N uni1FC0 ; G 1651\nU 8129 ; WX 602 ; N uni1FC1 ; G 1652\nU 8130 ; WX 602 ; N uni1FC2 ; G 1653\nU 8131 ; WX 602 ; N uni1FC3 ; G 1654\nU 8132 ; WX 602 ; N uni1FC4 ; G 1655\nU 8134 ; WX 602 ; N uni1FC6 ; G 1656\nU 8135 ; WX 602 ; N uni1FC7 ; G 1657\nU 8136 ; WX 602 ; N uni1FC8 ; G 1658\nU 8137 ; WX 602 ; N uni1FC9 ; G 1659\nU 8138 ; WX 602 ; N uni1FCA ; G 1660\nU 8139 ; WX 602 ; N uni1FCB ; G 1661\nU 8140 ; WX 602 ; N uni1FCC ; G 1662\nU 8141 ; WX 602 ; N uni1FCD ; G 1663\nU 8142 ; WX 602 ; N uni1FCE ; G 1664\nU 8143 ; WX 602 ; N uni1FCF ; G 1665\nU 8144 ; WX 602 ; N uni1FD0 ; G 1666\nU 8145 ; WX 602 ; N uni1FD1 ; G 1667\nU 8146 ; WX 602 ; N uni1FD2 ; G 1668\nU 8147 ; WX 602 ; N uni1FD3 ; G 1669\nU 8150 ; WX 602 ; N uni1FD6 ; G 1670\nU 8151 ; WX 602 ; N uni1FD7 ; G 1671\nU 8152 ; WX 602 ; N uni1FD8 ; G 1672\nU 8153 ; WX 602 ; N uni1FD9 ; G 1673\nU 8154 ; WX 602 ; N uni1FDA ; G 1674\nU 8155 ; WX 602 ; N uni1FDB ; G 1675\nU 8157 ; WX 602 ; N uni1FDD ; G 1676\nU 8158 ; WX 602 ; N uni1FDE ; G 1677\nU 8159 ; WX 602 ; N uni1FDF ; G 1678\nU 8160 ; WX 602 ; N uni1FE0 ; G 1679\nU 8161 ; WX 602 ; N uni1FE1 ; G 1680\nU 8162 ; WX 602 ; N uni1FE2 ; G 1681\nU 8163 ; WX 602 ; N uni1FE3 ; G 1682\nU 8164 ; WX 602 ; N uni1FE4 ; G 1683\nU 8165 ; WX 602 ; N uni1FE5 ; G 1684\nU 8166 ; WX 602 ; N uni1FE6 ; G 1685\nU 8167 ; WX 602 ; N uni1FE7 ; G 1686\nU 8168 ; WX 602 ; N uni1FE8 ; G 1687\nU 8169 ; WX 602 ; N uni1FE9 ; G 1688\nU 8170 ; WX 602 ; N uni1FEA ; G 1689\nU 8171 ; WX 602 ; N uni1FEB ; G 1690\nU 8172 ; WX 602 ; N uni1FEC ; G 1691\nU 8173 ; WX 602 ; N uni1FED ; G 1692\nU 8174 ; WX 602 ; N uni1FEE ; G 1693\nU 8175 ; WX 602 ; N uni1FEF ; G 1694\nU 8178 ; WX 602 ; N uni1FF2 ; G 1695\nU 8179 ; WX 602 ; N uni1FF3 ; G 1696\nU 8180 ; WX 602 ; N uni1FF4 ; G 1697\nU 8182 ; WX 602 ; N uni1FF6 ; G 1698\nU 8183 ; WX 602 ; N uni1FF7 ; G 1699\nU 8184 ; WX 602 ; N uni1FF8 ; G 1700\nU 8185 ; WX 602 ; N uni1FF9 ; G 1701\nU 8186 ; WX 602 ; N uni1FFA ; G 1702\nU 8187 ; WX 602 ; N uni1FFB ; G 1703\nU 8188 ; WX 602 ; N uni1FFC ; G 1704\nU 8189 ; WX 602 ; N uni1FFD ; G 1705\nU 8190 ; WX 602 ; N uni1FFE ; G 1706\nU 8192 ; WX 602 ; N uni2000 ; G 1707\nU 8193 ; WX 602 ; N uni2001 ; G 1708\nU 8194 ; WX 602 ; N uni2002 ; G 1709\nU 8195 ; WX 602 ; N uni2003 ; G 1710\nU 8196 ; WX 602 ; N uni2004 ; G 1711\nU 8197 ; WX 602 ; N uni2005 ; G 1712\nU 8198 ; WX 602 ; N uni2006 ; G 1713\nU 8199 ; WX 602 ; N uni2007 ; G 1714\nU 8200 ; WX 602 ; N uni2008 ; G 1715\nU 8201 ; WX 602 ; N uni2009 ; G 1716\nU 8202 ; WX 602 ; N uni200A ; G 1717\nU 8208 ; WX 602 ; N uni2010 ; G 1718\nU 8209 ; WX 602 ; N uni2011 ; G 1719\nU 8210 ; WX 602 ; N figuredash ; G 1720\nU 8211 ; WX 602 ; N endash ; G 1721\nU 8212 ; WX 602 ; N emdash ; G 1722\nU 8213 ; WX 602 ; N uni2015 ; G 1723\nU 8214 ; WX 602 ; N uni2016 ; G 1724\nU 8215 ; WX 602 ; N underscoredbl ; G 1725\nU 8216 ; WX 602 ; N quoteleft ; G 1726\nU 8217 ; WX 602 ; N quoteright ; G 1727\nU 8218 ; WX 602 ; N quotesinglbase ; G 1728\nU 8219 ; WX 602 ; N quotereversed ; G 1729\nU 8220 ; WX 602 ; N quotedblleft ; G 1730\nU 8221 ; WX 602 ; N quotedblright ; G 1731\nU 8222 ; WX 602 ; N quotedblbase ; G 1732\nU 8223 ; WX 602 ; N uni201F ; G 1733\nU 8224 ; WX 602 ; N dagger ; G 1734\nU 8225 ; WX 602 ; N daggerdbl ; G 1735\nU 8226 ; WX 602 ; N bullet ; G 1736\nU 8227 ; WX 602 ; N uni2023 ; G 1737\nU 8230 ; WX 602 ; N ellipsis ; G 1738\nU 8239 ; WX 602 ; N uni202F ; G 1739\nU 8240 ; WX 602 ; N perthousand ; G 1740\nU 8241 ; WX 602 ; N uni2031 ; G 1741\nU 8242 ; WX 602 ; N minute ; G 1742\nU 8243 ; WX 602 ; N second ; G 1743\nU 8244 ; WX 602 ; N uni2034 ; G 1744\nU 8245 ; WX 602 ; N uni2035 ; G 1745\nU 8246 ; WX 602 ; N uni2036 ; G 1746\nU 8247 ; WX 602 ; N uni2037 ; G 1747\nU 8249 ; WX 602 ; N guilsinglleft ; G 1748\nU 8250 ; WX 602 ; N guilsinglright ; G 1749\nU 8252 ; WX 602 ; N exclamdbl ; G 1750\nU 8253 ; WX 602 ; N uni203D ; G 1751\nU 8254 ; WX 602 ; N uni203E ; G 1752\nU 8255 ; WX 602 ; N uni203F ; G 1753\nU 8261 ; WX 602 ; N uni2045 ; G 1754\nU 8262 ; WX 602 ; N uni2046 ; G 1755\nU 8263 ; WX 602 ; N uni2047 ; G 1756\nU 8264 ; WX 602 ; N uni2048 ; G 1757\nU 8265 ; WX 602 ; N uni2049 ; G 1758\nU 8267 ; WX 602 ; N uni204B ; G 1759\nU 8287 ; WX 602 ; N uni205F ; G 1760\nU 8304 ; WX 602 ; N uni2070 ; G 1761\nU 8305 ; WX 602 ; N uni2071 ; G 1762\nU 8308 ; WX 602 ; N uni2074 ; G 1763\nU 8309 ; WX 602 ; N uni2075 ; G 1764\nU 8310 ; WX 602 ; N uni2076 ; G 1765\nU 8311 ; WX 602 ; N uni2077 ; G 1766\nU 8312 ; WX 602 ; N uni2078 ; G 1767\nU 8313 ; WX 602 ; N uni2079 ; G 1768\nU 8314 ; WX 602 ; N uni207A ; G 1769\nU 8315 ; WX 602 ; N uni207B ; G 1770\nU 8316 ; WX 602 ; N uni207C ; G 1771\nU 8317 ; WX 602 ; N uni207D ; G 1772\nU 8318 ; WX 602 ; N uni207E ; G 1773\nU 8319 ; WX 602 ; N uni207F ; G 1774\nU 8320 ; WX 602 ; N uni2080 ; G 1775\nU 8321 ; WX 602 ; N uni2081 ; G 1776\nU 8322 ; WX 602 ; N uni2082 ; G 1777\nU 8323 ; WX 602 ; N uni2083 ; G 1778\nU 8324 ; WX 602 ; N uni2084 ; G 1779\nU 8325 ; WX 602 ; N uni2085 ; G 1780\nU 8326 ; WX 602 ; N uni2086 ; G 1781\nU 8327 ; WX 602 ; N uni2087 ; G 1782\nU 8328 ; WX 602 ; N uni2088 ; G 1783\nU 8329 ; WX 602 ; N uni2089 ; G 1784\nU 8330 ; WX 602 ; N uni208A ; G 1785\nU 8331 ; WX 602 ; N uni208B ; G 1786\nU 8332 ; WX 602 ; N uni208C ; G 1787\nU 8333 ; WX 602 ; N uni208D ; G 1788\nU 8334 ; WX 602 ; N uni208E ; G 1789\nU 8336 ; WX 602 ; N uni2090 ; G 1790\nU 8337 ; WX 602 ; N uni2091 ; G 1791\nU 8338 ; WX 602 ; N uni2092 ; G 1792\nU 8339 ; WX 602 ; N uni2093 ; G 1793\nU 8340 ; WX 602 ; N uni2094 ; G 1794\nU 8341 ; WX 602 ; N uni2095 ; G 1795\nU 8342 ; WX 602 ; N uni2096 ; G 1796\nU 8343 ; WX 602 ; N uni2097 ; G 1797\nU 8344 ; WX 602 ; N uni2098 ; G 1798\nU 8345 ; WX 602 ; N uni2099 ; G 1799\nU 8346 ; WX 602 ; N uni209A ; G 1800\nU 8347 ; WX 602 ; N uni209B ; G 1801\nU 8348 ; WX 602 ; N uni209C ; G 1802\nU 8352 ; WX 602 ; N uni20A0 ; G 1803\nU 8353 ; WX 602 ; N colonmonetary ; G 1804\nU 8354 ; WX 602 ; N uni20A2 ; G 1805\nU 8355 ; WX 602 ; N franc ; G 1806\nU 8356 ; WX 602 ; N lira ; G 1807\nU 8357 ; WX 602 ; N uni20A5 ; G 1808\nU 8358 ; WX 602 ; N uni20A6 ; G 1809\nU 8359 ; WX 602 ; N peseta ; G 1810\nU 8360 ; WX 602 ; N uni20A8 ; G 1811\nU 8361 ; WX 602 ; N uni20A9 ; G 1812\nU 8362 ; WX 602 ; N uni20AA ; G 1813\nU 8363 ; WX 602 ; N dong ; G 1814\nU 8364 ; WX 602 ; N Euro ; G 1815\nU 8365 ; WX 602 ; N uni20AD ; G 1816\nU 8366 ; WX 602 ; N uni20AE ; G 1817\nU 8367 ; WX 602 ; N uni20AF ; G 1818\nU 8368 ; WX 602 ; N uni20B0 ; G 1819\nU 8369 ; WX 602 ; N uni20B1 ; G 1820\nU 8370 ; WX 602 ; N uni20B2 ; G 1821\nU 8371 ; WX 602 ; N uni20B3 ; G 1822\nU 8372 ; WX 602 ; N uni20B4 ; G 1823\nU 8373 ; WX 602 ; N uni20B5 ; G 1824\nU 8376 ; WX 602 ; N uni20B8 ; G 1825\nU 8377 ; WX 602 ; N uni20B9 ; G 1826\nU 8378 ; WX 602 ; N uni20BA ; G 1827\nU 8381 ; WX 602 ; N uni20BD ; G 1828\nU 8450 ; WX 602 ; N uni2102 ; G 1829\nU 8453 ; WX 602 ; N uni2105 ; G 1830\nU 8461 ; WX 602 ; N uni210D ; G 1831\nU 8462 ; WX 602 ; N uni210E ; G 1832\nU 8463 ; WX 602 ; N uni210F ; G 1833\nU 8469 ; WX 602 ; N uni2115 ; G 1834\nU 8470 ; WX 602 ; N uni2116 ; G 1835\nU 8471 ; WX 602 ; N uni2117 ; G 1836\nU 8473 ; WX 602 ; N uni2119 ; G 1837\nU 8474 ; WX 602 ; N uni211A ; G 1838\nU 8477 ; WX 602 ; N uni211D ; G 1839\nU 8482 ; WX 602 ; N trademark ; G 1840\nU 8484 ; WX 602 ; N uni2124 ; G 1841\nU 8486 ; WX 602 ; N uni2126 ; G 1842\nU 8490 ; WX 602 ; N uni212A ; G 1843\nU 8491 ; WX 602 ; N uni212B ; G 1844\nU 8494 ; WX 602 ; N estimated ; G 1845\nU 8520 ; WX 602 ; N uni2148 ; G 1846\nU 8528 ; WX 602 ; N uni2150 ; G 1847\nU 8529 ; WX 602 ; N uni2151 ; G 1848\nU 8531 ; WX 602 ; N onethird ; G 1849\nU 8532 ; WX 602 ; N twothirds ; G 1850\nU 8533 ; WX 602 ; N uni2155 ; G 1851\nU 8534 ; WX 602 ; N uni2156 ; G 1852\nU 8535 ; WX 602 ; N uni2157 ; G 1853\nU 8536 ; WX 602 ; N uni2158 ; G 1854\nU 8537 ; WX 602 ; N uni2159 ; G 1855\nU 8538 ; WX 602 ; N uni215A ; G 1856\nU 8539 ; WX 602 ; N oneeighth ; G 1857\nU 8540 ; WX 602 ; N threeeighths ; G 1858\nU 8541 ; WX 602 ; N fiveeighths ; G 1859\nU 8542 ; WX 602 ; N seveneighths ; G 1860\nU 8543 ; WX 602 ; N uni215F ; G 1861\nU 8585 ; WX 602 ; N uni2189 ; G 1862\nU 8592 ; WX 602 ; N arrowleft ; G 1863\nU 8593 ; WX 602 ; N arrowup ; G 1864\nU 8594 ; WX 602 ; N arrowright ; G 1865\nU 8595 ; WX 602 ; N arrowdown ; G 1866\nU 8596 ; WX 602 ; N arrowboth ; G 1867\nU 8597 ; WX 602 ; N arrowupdn ; G 1868\nU 8598 ; WX 602 ; N uni2196 ; G 1869\nU 8599 ; WX 602 ; N uni2197 ; G 1870\nU 8600 ; WX 602 ; N uni2198 ; G 1871\nU 8601 ; WX 602 ; N uni2199 ; G 1872\nU 8602 ; WX 602 ; N uni219A ; G 1873\nU 8603 ; WX 602 ; N uni219B ; G 1874\nU 8604 ; WX 602 ; N uni219C ; G 1875\nU 8605 ; WX 602 ; N uni219D ; G 1876\nU 8606 ; WX 602 ; N uni219E ; G 1877\nU 8607 ; WX 602 ; N uni219F ; G 1878\nU 8608 ; WX 602 ; N uni21A0 ; G 1879\nU 8609 ; WX 602 ; N uni21A1 ; G 1880\nU 8610 ; WX 602 ; N uni21A2 ; G 1881\nU 8611 ; WX 602 ; N uni21A3 ; G 1882\nU 8612 ; WX 602 ; N uni21A4 ; G 1883\nU 8613 ; WX 602 ; N uni21A5 ; G 1884\nU 8614 ; WX 602 ; N uni21A6 ; G 1885\nU 8615 ; WX 602 ; N uni21A7 ; G 1886\nU 8616 ; WX 602 ; N arrowupdnbse ; G 1887\nU 8617 ; WX 602 ; N uni21A9 ; G 1888\nU 8618 ; WX 602 ; N uni21AA ; G 1889\nU 8619 ; WX 602 ; N uni21AB ; G 1890\nU 8620 ; WX 602 ; N uni21AC ; G 1891\nU 8621 ; WX 602 ; N uni21AD ; G 1892\nU 8622 ; WX 602 ; N uni21AE ; G 1893\nU 8623 ; WX 602 ; N uni21AF ; G 1894\nU 8624 ; WX 602 ; N uni21B0 ; G 1895\nU 8625 ; WX 602 ; N uni21B1 ; G 1896\nU 8626 ; WX 602 ; N uni21B2 ; G 1897\nU 8627 ; WX 602 ; N uni21B3 ; G 1898\nU 8628 ; WX 602 ; N uni21B4 ; G 1899\nU 8629 ; WX 602 ; N carriagereturn ; G 1900\nU 8630 ; WX 602 ; N uni21B6 ; G 1901\nU 8631 ; WX 602 ; N uni21B7 ; G 1902\nU 8632 ; WX 602 ; N uni21B8 ; G 1903\nU 8633 ; WX 602 ; N uni21B9 ; G 1904\nU 8634 ; WX 602 ; N uni21BA ; G 1905\nU 8635 ; WX 602 ; N uni21BB ; G 1906\nU 8636 ; WX 602 ; N uni21BC ; G 1907\nU 8637 ; WX 602 ; N uni21BD ; G 1908\nU 8638 ; WX 602 ; N uni21BE ; G 1909\nU 8639 ; WX 602 ; N uni21BF ; G 1910\nU 8640 ; WX 602 ; N uni21C0 ; G 1911\nU 8641 ; WX 602 ; N uni21C1 ; G 1912\nU 8642 ; WX 602 ; N uni21C2 ; G 1913\nU 8643 ; WX 602 ; N uni21C3 ; G 1914\nU 8644 ; WX 602 ; N uni21C4 ; G 1915\nU 8645 ; WX 602 ; N uni21C5 ; G 1916\nU 8646 ; WX 602 ; N uni21C6 ; G 1917\nU 8647 ; WX 602 ; N uni21C7 ; G 1918\nU 8648 ; WX 602 ; N uni21C8 ; G 1919\nU 8649 ; WX 602 ; N uni21C9 ; G 1920\nU 8650 ; WX 602 ; N uni21CA ; G 1921\nU 8651 ; WX 602 ; N uni21CB ; G 1922\nU 8652 ; WX 602 ; N uni21CC ; G 1923\nU 8653 ; WX 602 ; N uni21CD ; G 1924\nU 8654 ; WX 602 ; N uni21CE ; G 1925\nU 8655 ; WX 602 ; N uni21CF ; G 1926\nU 8656 ; WX 602 ; N arrowdblleft ; G 1927\nU 8657 ; WX 602 ; N arrowdblup ; G 1928\nU 8658 ; WX 602 ; N arrowdblright ; G 1929\nU 8659 ; WX 602 ; N arrowdbldown ; G 1930\nU 8660 ; WX 602 ; N arrowdblboth ; G 1931\nU 8661 ; WX 602 ; N uni21D5 ; G 1932\nU 8662 ; WX 602 ; N uni21D6 ; G 1933\nU 8663 ; WX 602 ; N uni21D7 ; G 1934\nU 8664 ; WX 602 ; N uni21D8 ; G 1935\nU 8665 ; WX 602 ; N uni21D9 ; G 1936\nU 8666 ; WX 602 ; N uni21DA ; G 1937\nU 8667 ; WX 602 ; N uni21DB ; G 1938\nU 8668 ; WX 602 ; N uni21DC ; G 1939\nU 8669 ; WX 602 ; N uni21DD ; G 1940\nU 8670 ; WX 602 ; N uni21DE ; G 1941\nU 8671 ; WX 602 ; N uni21DF ; G 1942\nU 8672 ; WX 602 ; N uni21E0 ; G 1943\nU 8673 ; WX 602 ; N uni21E1 ; G 1944\nU 8674 ; WX 602 ; N uni21E2 ; G 1945\nU 8675 ; WX 602 ; N uni21E3 ; G 1946\nU 8676 ; WX 602 ; N uni21E4 ; G 1947\nU 8677 ; WX 602 ; N uni21E5 ; G 1948\nU 8678 ; WX 602 ; N uni21E6 ; G 1949\nU 8679 ; WX 602 ; N uni21E7 ; G 1950\nU 8680 ; WX 602 ; N uni21E8 ; G 1951\nU 8681 ; WX 602 ; N uni21E9 ; G 1952\nU 8682 ; WX 602 ; N uni21EA ; G 1953\nU 8683 ; WX 602 ; N uni21EB ; G 1954\nU 8684 ; WX 602 ; N uni21EC ; G 1955\nU 8685 ; WX 602 ; N uni21ED ; G 1956\nU 8686 ; WX 602 ; N uni21EE ; G 1957\nU 8687 ; WX 602 ; N uni21EF ; G 1958\nU 8688 ; WX 602 ; N uni21F0 ; G 1959\nU 8689 ; WX 602 ; N uni21F1 ; G 1960\nU 8690 ; WX 602 ; N uni21F2 ; G 1961\nU 8691 ; WX 602 ; N uni21F3 ; G 1962\nU 8692 ; WX 602 ; N uni21F4 ; G 1963\nU 8693 ; WX 602 ; N uni21F5 ; G 1964\nU 8694 ; WX 602 ; N uni21F6 ; G 1965\nU 8695 ; WX 602 ; N uni21F7 ; G 1966\nU 8696 ; WX 602 ; N uni21F8 ; G 1967\nU 8697 ; WX 602 ; N uni21F9 ; G 1968\nU 8698 ; WX 602 ; N uni21FA ; G 1969\nU 8699 ; WX 602 ; N uni21FB ; G 1970\nU 8700 ; WX 602 ; N uni21FC ; G 1971\nU 8701 ; WX 602 ; N uni21FD ; G 1972\nU 8702 ; WX 602 ; N uni21FE ; G 1973\nU 8703 ; WX 602 ; N uni21FF ; G 1974\nU 8704 ; WX 602 ; N universal ; G 1975\nU 8705 ; WX 602 ; N uni2201 ; G 1976\nU 8706 ; WX 602 ; N partialdiff ; G 1977\nU 8707 ; WX 602 ; N existential ; G 1978\nU 8708 ; WX 602 ; N uni2204 ; G 1979\nU 8709 ; WX 602 ; N emptyset ; G 1980\nU 8710 ; WX 602 ; N increment ; G 1981\nU 8711 ; WX 602 ; N gradient ; G 1982\nU 8712 ; WX 602 ; N element ; G 1983\nU 8713 ; WX 602 ; N notelement ; G 1984\nU 8714 ; WX 602 ; N uni220A ; G 1985\nU 8715 ; WX 602 ; N suchthat ; G 1986\nU 8716 ; WX 602 ; N uni220C ; G 1987\nU 8717 ; WX 602 ; N uni220D ; G 1988\nU 8718 ; WX 602 ; N uni220E ; G 1989\nU 8719 ; WX 602 ; N product ; G 1990\nU 8720 ; WX 602 ; N uni2210 ; G 1991\nU 8721 ; WX 602 ; N summation ; G 1992\nU 8722 ; WX 602 ; N minus ; G 1993\nU 8723 ; WX 602 ; N uni2213 ; G 1994\nU 8725 ; WX 602 ; N uni2215 ; G 1995\nU 8727 ; WX 602 ; N asteriskmath ; G 1996\nU 8728 ; WX 602 ; N uni2218 ; G 1997\nU 8729 ; WX 602 ; N uni2219 ; G 1998\nU 8730 ; WX 602 ; N radical ; G 1999\nU 8731 ; WX 602 ; N uni221B ; G 2000\nU 8732 ; WX 602 ; N uni221C ; G 2001\nU 8733 ; WX 602 ; N proportional ; G 2002\nU 8734 ; WX 602 ; N infinity ; G 2003\nU 8735 ; WX 602 ; N orthogonal ; G 2004\nU 8736 ; WX 602 ; N angle ; G 2005\nU 8739 ; WX 602 ; N uni2223 ; G 2006\nU 8743 ; WX 602 ; N logicaland ; G 2007\nU 8744 ; WX 602 ; N logicalor ; G 2008\nU 8745 ; WX 602 ; N intersection ; G 2009\nU 8746 ; WX 602 ; N union ; G 2010\nU 8747 ; WX 602 ; N integral ; G 2011\nU 8748 ; WX 602 ; N uni222C ; G 2012\nU 8749 ; WX 602 ; N uni222D ; G 2013\nU 8756 ; WX 602 ; N therefore ; G 2014\nU 8757 ; WX 602 ; N uni2235 ; G 2015\nU 8758 ; WX 602 ; N uni2236 ; G 2016\nU 8759 ; WX 602 ; N uni2237 ; G 2017\nU 8760 ; WX 602 ; N uni2238 ; G 2018\nU 8761 ; WX 602 ; N uni2239 ; G 2019\nU 8762 ; WX 602 ; N uni223A ; G 2020\nU 8763 ; WX 602 ; N uni223B ; G 2021\nU 8764 ; WX 602 ; N similar ; G 2022\nU 8765 ; WX 602 ; N uni223D ; G 2023\nU 8769 ; WX 602 ; N uni2241 ; G 2024\nU 8770 ; WX 602 ; N uni2242 ; G 2025\nU 8771 ; WX 602 ; N uni2243 ; G 2026\nU 8772 ; WX 602 ; N uni2244 ; G 2027\nU 8773 ; WX 602 ; N congruent ; G 2028\nU 8774 ; WX 602 ; N uni2246 ; G 2029\nU 8775 ; WX 602 ; N uni2247 ; G 2030\nU 8776 ; WX 602 ; N approxequal ; G 2031\nU 8777 ; WX 602 ; N uni2249 ; G 2032\nU 8778 ; WX 602 ; N uni224A ; G 2033\nU 8779 ; WX 602 ; N uni224B ; G 2034\nU 8780 ; WX 602 ; N uni224C ; G 2035\nU 8781 ; WX 602 ; N uni224D ; G 2036\nU 8782 ; WX 602 ; N uni224E ; G 2037\nU 8783 ; WX 602 ; N uni224F ; G 2038\nU 8784 ; WX 602 ; N uni2250 ; G 2039\nU 8785 ; WX 602 ; N uni2251 ; G 2040\nU 8786 ; WX 602 ; N uni2252 ; G 2041\nU 8787 ; WX 602 ; N uni2253 ; G 2042\nU 8788 ; WX 602 ; N uni2254 ; G 2043\nU 8789 ; WX 602 ; N uni2255 ; G 2044\nU 8790 ; WX 602 ; N uni2256 ; G 2045\nU 8791 ; WX 602 ; N uni2257 ; G 2046\nU 8792 ; WX 602 ; N uni2258 ; G 2047\nU 8793 ; WX 602 ; N uni2259 ; G 2048\nU 8794 ; WX 602 ; N uni225A ; G 2049\nU 8795 ; WX 602 ; N uni225B ; G 2050\nU 8796 ; WX 602 ; N uni225C ; G 2051\nU 8797 ; WX 602 ; N uni225D ; G 2052\nU 8798 ; WX 602 ; N uni225E ; G 2053\nU 8799 ; WX 602 ; N uni225F ; G 2054\nU 8800 ; WX 602 ; N notequal ; G 2055\nU 8801 ; WX 602 ; N equivalence ; G 2056\nU 8802 ; WX 602 ; N uni2262 ; G 2057\nU 8803 ; WX 602 ; N uni2263 ; G 2058\nU 8804 ; WX 602 ; N lessequal ; G 2059\nU 8805 ; WX 602 ; N greaterequal ; G 2060\nU 8806 ; WX 602 ; N uni2266 ; G 2061\nU 8807 ; WX 602 ; N uni2267 ; G 2062\nU 8808 ; WX 602 ; N uni2268 ; G 2063\nU 8809 ; WX 602 ; N uni2269 ; G 2064\nU 8813 ; WX 602 ; N uni226D ; G 2065\nU 8814 ; WX 602 ; N uni226E ; G 2066\nU 8815 ; WX 602 ; N uni226F ; G 2067\nU 8816 ; WX 602 ; N uni2270 ; G 2068\nU 8817 ; WX 602 ; N uni2271 ; G 2069\nU 8818 ; WX 602 ; N uni2272 ; G 2070\nU 8819 ; WX 602 ; N uni2273 ; G 2071\nU 8820 ; WX 602 ; N uni2274 ; G 2072\nU 8821 ; WX 602 ; N uni2275 ; G 2073\nU 8822 ; WX 602 ; N uni2276 ; G 2074\nU 8823 ; WX 602 ; N uni2277 ; G 2075\nU 8824 ; WX 602 ; N uni2278 ; G 2076\nU 8825 ; WX 602 ; N uni2279 ; G 2077\nU 8826 ; WX 602 ; N uni227A ; G 2078\nU 8827 ; WX 602 ; N uni227B ; G 2079\nU 8828 ; WX 602 ; N uni227C ; G 2080\nU 8829 ; WX 602 ; N uni227D ; G 2081\nU 8830 ; WX 602 ; N uni227E ; G 2082\nU 8831 ; WX 602 ; N uni227F ; G 2083\nU 8832 ; WX 602 ; N uni2280 ; G 2084\nU 8833 ; WX 602 ; N uni2281 ; G 2085\nU 8834 ; WX 602 ; N propersubset ; G 2086\nU 8835 ; WX 602 ; N propersuperset ; G 2087\nU 8836 ; WX 602 ; N notsubset ; G 2088\nU 8837 ; WX 602 ; N uni2285 ; G 2089\nU 8838 ; WX 602 ; N reflexsubset ; G 2090\nU 8839 ; WX 602 ; N reflexsuperset ; G 2091\nU 8840 ; WX 602 ; N uni2288 ; G 2092\nU 8841 ; WX 602 ; N uni2289 ; G 2093\nU 8842 ; WX 602 ; N uni228A ; G 2094\nU 8843 ; WX 602 ; N uni228B ; G 2095\nU 8845 ; WX 602 ; N uni228D ; G 2096\nU 8846 ; WX 602 ; N uni228E ; G 2097\nU 8847 ; WX 602 ; N uni228F ; G 2098\nU 8848 ; WX 602 ; N uni2290 ; G 2099\nU 8849 ; WX 602 ; N uni2291 ; G 2100\nU 8850 ; WX 602 ; N uni2292 ; G 2101\nU 8851 ; WX 602 ; N uni2293 ; G 2102\nU 8852 ; WX 602 ; N uni2294 ; G 2103\nU 8853 ; WX 602 ; N circleplus ; G 2104\nU 8854 ; WX 602 ; N uni2296 ; G 2105\nU 8855 ; WX 602 ; N circlemultiply ; G 2106\nU 8856 ; WX 602 ; N uni2298 ; G 2107\nU 8857 ; WX 602 ; N uni2299 ; G 2108\nU 8858 ; WX 602 ; N uni229A ; G 2109\nU 8859 ; WX 602 ; N uni229B ; G 2110\nU 8860 ; WX 602 ; N uni229C ; G 2111\nU 8861 ; WX 602 ; N uni229D ; G 2112\nU 8862 ; WX 602 ; N uni229E ; G 2113\nU 8863 ; WX 602 ; N uni229F ; G 2114\nU 8864 ; WX 602 ; N uni22A0 ; G 2115\nU 8865 ; WX 602 ; N uni22A1 ; G 2116\nU 8866 ; WX 602 ; N uni22A2 ; G 2117\nU 8867 ; WX 602 ; N uni22A3 ; G 2118\nU 8868 ; WX 602 ; N uni22A4 ; G 2119\nU 8869 ; WX 602 ; N perpendicular ; G 2120\nU 8882 ; WX 602 ; N uni22B2 ; G 2121\nU 8883 ; WX 602 ; N uni22B3 ; G 2122\nU 8884 ; WX 602 ; N uni22B4 ; G 2123\nU 8885 ; WX 602 ; N uni22B5 ; G 2124\nU 8888 ; WX 602 ; N uni22B8 ; G 2125\nU 8898 ; WX 602 ; N uni22C2 ; G 2126\nU 8899 ; WX 602 ; N uni22C3 ; G 2127\nU 8900 ; WX 602 ; N uni22C4 ; G 2128\nU 8901 ; WX 602 ; N dotmath ; G 2129\nU 8902 ; WX 602 ; N uni22C6 ; G 2130\nU 8909 ; WX 602 ; N uni22CD ; G 2131\nU 8910 ; WX 602 ; N uni22CE ; G 2132\nU 8911 ; WX 602 ; N uni22CF ; G 2133\nU 8912 ; WX 602 ; N uni22D0 ; G 2134\nU 8913 ; WX 602 ; N uni22D1 ; G 2135\nU 8922 ; WX 602 ; N uni22DA ; G 2136\nU 8923 ; WX 602 ; N uni22DB ; G 2137\nU 8924 ; WX 602 ; N uni22DC ; G 2138\nU 8925 ; WX 602 ; N uni22DD ; G 2139\nU 8926 ; WX 602 ; N uni22DE ; G 2140\nU 8927 ; WX 602 ; N uni22DF ; G 2141\nU 8928 ; WX 602 ; N uni22E0 ; G 2142\nU 8929 ; WX 602 ; N uni22E1 ; G 2143\nU 8930 ; WX 602 ; N uni22E2 ; G 2144\nU 8931 ; WX 602 ; N uni22E3 ; G 2145\nU 8932 ; WX 602 ; N uni22E4 ; G 2146\nU 8933 ; WX 602 ; N uni22E5 ; G 2147\nU 8934 ; WX 602 ; N uni22E6 ; G 2148\nU 8935 ; WX 602 ; N uni22E7 ; G 2149\nU 8936 ; WX 602 ; N uni22E8 ; G 2150\nU 8937 ; WX 602 ; N uni22E9 ; G 2151\nU 8943 ; WX 602 ; N uni22EF ; G 2152\nU 8960 ; WX 602 ; N uni2300 ; G 2153\nU 8961 ; WX 602 ; N uni2301 ; G 2154\nU 8962 ; WX 602 ; N house ; G 2155\nU 8963 ; WX 602 ; N uni2303 ; G 2156\nU 8964 ; WX 602 ; N uni2304 ; G 2157\nU 8965 ; WX 602 ; N uni2305 ; G 2158\nU 8966 ; WX 602 ; N uni2306 ; G 2159\nU 8968 ; WX 602 ; N uni2308 ; G 2160\nU 8969 ; WX 602 ; N uni2309 ; G 2161\nU 8970 ; WX 602 ; N uni230A ; G 2162\nU 8971 ; WX 602 ; N uni230B ; G 2163\nU 8972 ; WX 602 ; N uni230C ; G 2164\nU 8973 ; WX 602 ; N uni230D ; G 2165\nU 8974 ; WX 602 ; N uni230E ; G 2166\nU 8975 ; WX 602 ; N uni230F ; G 2167\nU 8976 ; WX 602 ; N revlogicalnot ; G 2168\nU 8977 ; WX 602 ; N uni2311 ; G 2169\nU 8978 ; WX 602 ; N uni2312 ; G 2170\nU 8979 ; WX 602 ; N uni2313 ; G 2171\nU 8980 ; WX 602 ; N uni2314 ; G 2172\nU 8981 ; WX 602 ; N uni2315 ; G 2173\nU 8984 ; WX 602 ; N uni2318 ; G 2174\nU 8985 ; WX 602 ; N uni2319 ; G 2175\nU 8988 ; WX 602 ; N uni231C ; G 2176\nU 8989 ; WX 602 ; N uni231D ; G 2177\nU 8990 ; WX 602 ; N uni231E ; G 2178\nU 8991 ; WX 602 ; N uni231F ; G 2179\nU 8992 ; WX 602 ; N integraltp ; G 2180\nU 8993 ; WX 602 ; N integralbt ; G 2181\nU 8997 ; WX 602 ; N uni2325 ; G 2182\nU 8998 ; WX 602 ; N uni2326 ; G 2183\nU 8999 ; WX 602 ; N uni2327 ; G 2184\nU 9000 ; WX 602 ; N uni2328 ; G 2185\nU 9003 ; WX 602 ; N uni232B ; G 2186\nU 9013 ; WX 602 ; N uni2335 ; G 2187\nU 9014 ; WX 602 ; N uni2336 ; G 2188\nU 9015 ; WX 602 ; N uni2337 ; G 2189\nU 9016 ; WX 602 ; N uni2338 ; G 2190\nU 9017 ; WX 602 ; N uni2339 ; G 2191\nU 9018 ; WX 602 ; N uni233A ; G 2192\nU 9019 ; WX 602 ; N uni233B ; G 2193\nU 9020 ; WX 602 ; N uni233C ; G 2194\nU 9021 ; WX 602 ; N uni233D ; G 2195\nU 9022 ; WX 602 ; N uni233E ; G 2196\nU 9023 ; WX 602 ; N uni233F ; G 2197\nU 9024 ; WX 602 ; N uni2340 ; G 2198\nU 9025 ; WX 602 ; N uni2341 ; G 2199\nU 9026 ; WX 602 ; N uni2342 ; G 2200\nU 9027 ; WX 602 ; N uni2343 ; G 2201\nU 9028 ; WX 602 ; N uni2344 ; G 2202\nU 9029 ; WX 602 ; N uni2345 ; G 2203\nU 9030 ; WX 602 ; N uni2346 ; G 2204\nU 9031 ; WX 602 ; N uni2347 ; G 2205\nU 9032 ; WX 602 ; N uni2348 ; G 2206\nU 9033 ; WX 602 ; N uni2349 ; G 2207\nU 9034 ; WX 602 ; N uni234A ; G 2208\nU 9035 ; WX 602 ; N uni234B ; G 2209\nU 9036 ; WX 602 ; N uni234C ; G 2210\nU 9037 ; WX 602 ; N uni234D ; G 2211\nU 9038 ; WX 602 ; N uni234E ; G 2212\nU 9039 ; WX 602 ; N uni234F ; G 2213\nU 9040 ; WX 602 ; N uni2350 ; G 2214\nU 9041 ; WX 602 ; N uni2351 ; G 2215\nU 9042 ; WX 602 ; N uni2352 ; G 2216\nU 9043 ; WX 602 ; N uni2353 ; G 2217\nU 9044 ; WX 602 ; N uni2354 ; G 2218\nU 9045 ; WX 602 ; N uni2355 ; G 2219\nU 9046 ; WX 602 ; N uni2356 ; G 2220\nU 9047 ; WX 602 ; N uni2357 ; G 2221\nU 9048 ; WX 602 ; N uni2358 ; G 2222\nU 9049 ; WX 602 ; N uni2359 ; G 2223\nU 9050 ; WX 602 ; N uni235A ; G 2224\nU 9051 ; WX 602 ; N uni235B ; G 2225\nU 9052 ; WX 602 ; N uni235C ; G 2226\nU 9053 ; WX 602 ; N uni235D ; G 2227\nU 9054 ; WX 602 ; N uni235E ; G 2228\nU 9055 ; WX 602 ; N uni235F ; G 2229\nU 9056 ; WX 602 ; N uni2360 ; G 2230\nU 9057 ; WX 602 ; N uni2361 ; G 2231\nU 9058 ; WX 602 ; N uni2362 ; G 2232\nU 9059 ; WX 602 ; N uni2363 ; G 2233\nU 9060 ; WX 602 ; N uni2364 ; G 2234\nU 9061 ; WX 602 ; N uni2365 ; G 2235\nU 9062 ; WX 602 ; N uni2366 ; G 2236\nU 9063 ; WX 602 ; N uni2367 ; G 2237\nU 9064 ; WX 602 ; N uni2368 ; G 2238\nU 9065 ; WX 602 ; N uni2369 ; G 2239\nU 9066 ; WX 602 ; N uni236A ; G 2240\nU 9067 ; WX 602 ; N uni236B ; G 2241\nU 9068 ; WX 602 ; N uni236C ; G 2242\nU 9069 ; WX 602 ; N uni236D ; G 2243\nU 9070 ; WX 602 ; N uni236E ; G 2244\nU 9071 ; WX 602 ; N uni236F ; G 2245\nU 9072 ; WX 602 ; N uni2370 ; G 2246\nU 9073 ; WX 602 ; N uni2371 ; G 2247\nU 9074 ; WX 602 ; N uni2372 ; G 2248\nU 9075 ; WX 602 ; N uni2373 ; G 2249\nU 9076 ; WX 602 ; N uni2374 ; G 2250\nU 9077 ; WX 602 ; N uni2375 ; G 2251\nU 9078 ; WX 602 ; N uni2376 ; G 2252\nU 9079 ; WX 602 ; N uni2377 ; G 2253\nU 9080 ; WX 602 ; N uni2378 ; G 2254\nU 9081 ; WX 602 ; N uni2379 ; G 2255\nU 9082 ; WX 602 ; N uni237A ; G 2256\nU 9085 ; WX 602 ; N uni237D ; G 2257\nU 9088 ; WX 602 ; N uni2380 ; G 2258\nU 9089 ; WX 602 ; N uni2381 ; G 2259\nU 9090 ; WX 602 ; N uni2382 ; G 2260\nU 9091 ; WX 602 ; N uni2383 ; G 2261\nU 9096 ; WX 602 ; N uni2388 ; G 2262\nU 9097 ; WX 602 ; N uni2389 ; G 2263\nU 9098 ; WX 602 ; N uni238A ; G 2264\nU 9099 ; WX 602 ; N uni238B ; G 2265\nU 9109 ; WX 602 ; N uni2395 ; G 2266\nU 9115 ; WX 602 ; N uni239B ; G 2267\nU 9116 ; WX 602 ; N uni239C ; G 2268\nU 9117 ; WX 602 ; N uni239D ; G 2269\nU 9118 ; WX 602 ; N uni239E ; G 2270\nU 9119 ; WX 602 ; N uni239F ; G 2271\nU 9120 ; WX 602 ; N uni23A0 ; G 2272\nU 9121 ; WX 602 ; N uni23A1 ; G 2273\nU 9122 ; WX 602 ; N uni23A2 ; G 2274\nU 9123 ; WX 602 ; N uni23A3 ; G 2275\nU 9124 ; WX 602 ; N uni23A4 ; G 2276\nU 9125 ; WX 602 ; N uni23A5 ; G 2277\nU 9126 ; WX 602 ; N uni23A6 ; G 2278\nU 9127 ; WX 602 ; N uni23A7 ; G 2279\nU 9128 ; WX 602 ; N uni23A8 ; G 2280\nU 9129 ; WX 602 ; N uni23A9 ; G 2281\nU 9130 ; WX 602 ; N uni23AA ; G 2282\nU 9131 ; WX 602 ; N uni23AB ; G 2283\nU 9132 ; WX 602 ; N uni23AC ; G 2284\nU 9133 ; WX 602 ; N uni23AD ; G 2285\nU 9134 ; WX 602 ; N uni23AE ; G 2286\nU 9166 ; WX 602 ; N uni23CE ; G 2287\nU 9167 ; WX 602 ; N uni23CF ; G 2288\nU 9251 ; WX 602 ; N uni2423 ; G 2289\nU 9472 ; WX 602 ; N SF100000 ; G 2290\nU 9473 ; WX 602 ; N uni2501 ; G 2291\nU 9474 ; WX 602 ; N SF110000 ; G 2292\nU 9475 ; WX 602 ; N uni2503 ; G 2293\nU 9476 ; WX 602 ; N uni2504 ; G 2294\nU 9477 ; WX 602 ; N uni2505 ; G 2295\nU 9478 ; WX 602 ; N uni2506 ; G 2296\nU 9479 ; WX 602 ; N uni2507 ; G 2297\nU 9480 ; WX 602 ; N uni2508 ; G 2298\nU 9481 ; WX 602 ; N uni2509 ; G 2299\nU 9482 ; WX 602 ; N uni250A ; G 2300\nU 9483 ; WX 602 ; N uni250B ; G 2301\nU 9484 ; WX 602 ; N SF010000 ; G 2302\nU 9485 ; WX 602 ; N uni250D ; G 2303\nU 9486 ; WX 602 ; N uni250E ; G 2304\nU 9487 ; WX 602 ; N uni250F ; G 2305\nU 9488 ; WX 602 ; N SF030000 ; G 2306\nU 9489 ; WX 602 ; N uni2511 ; G 2307\nU 9490 ; WX 602 ; N uni2512 ; G 2308\nU 9491 ; WX 602 ; N uni2513 ; G 2309\nU 9492 ; WX 602 ; N SF020000 ; G 2310\nU 9493 ; WX 602 ; N uni2515 ; G 2311\nU 9494 ; WX 602 ; N uni2516 ; G 2312\nU 9495 ; WX 602 ; N uni2517 ; G 2313\nU 9496 ; WX 602 ; N SF040000 ; G 2314\nU 9497 ; WX 602 ; N uni2519 ; G 2315\nU 9498 ; WX 602 ; N uni251A ; G 2316\nU 9499 ; WX 602 ; N uni251B ; G 2317\nU 9500 ; WX 602 ; N SF080000 ; G 2318\nU 9501 ; WX 602 ; N uni251D ; G 2319\nU 9502 ; WX 602 ; N uni251E ; G 2320\nU 9503 ; WX 602 ; N uni251F ; G 2321\nU 9504 ; WX 602 ; N uni2520 ; G 2322\nU 9505 ; WX 602 ; N uni2521 ; G 2323\nU 9506 ; WX 602 ; N uni2522 ; G 2324\nU 9507 ; WX 602 ; N uni2523 ; G 2325\nU 9508 ; WX 602 ; N SF090000 ; G 2326\nU 9509 ; WX 602 ; N uni2525 ; G 2327\nU 9510 ; WX 602 ; N uni2526 ; G 2328\nU 9511 ; WX 602 ; N uni2527 ; G 2329\nU 9512 ; WX 602 ; N uni2528 ; G 2330\nU 9513 ; WX 602 ; N uni2529 ; G 2331\nU 9514 ; WX 602 ; N uni252A ; G 2332\nU 9515 ; WX 602 ; N uni252B ; G 2333\nU 9516 ; WX 602 ; N SF060000 ; G 2334\nU 9517 ; WX 602 ; N uni252D ; G 2335\nU 9518 ; WX 602 ; N uni252E ; G 2336\nU 9519 ; WX 602 ; N uni252F ; G 2337\nU 9520 ; WX 602 ; N uni2530 ; G 2338\nU 9521 ; WX 602 ; N uni2531 ; G 2339\nU 9522 ; WX 602 ; N uni2532 ; G 2340\nU 9523 ; WX 602 ; N uni2533 ; G 2341\nU 9524 ; WX 602 ; N SF070000 ; G 2342\nU 9525 ; WX 602 ; N uni2535 ; G 2343\nU 9526 ; WX 602 ; N uni2536 ; G 2344\nU 9527 ; WX 602 ; N uni2537 ; G 2345\nU 9528 ; WX 602 ; N uni2538 ; G 2346\nU 9529 ; WX 602 ; N uni2539 ; G 2347\nU 9530 ; WX 602 ; N uni253A ; G 2348\nU 9531 ; WX 602 ; N uni253B ; G 2349\nU 9532 ; WX 602 ; N SF050000 ; G 2350\nU 9533 ; WX 602 ; N uni253D ; G 2351\nU 9534 ; WX 602 ; N uni253E ; G 2352\nU 9535 ; WX 602 ; N uni253F ; G 2353\nU 9536 ; WX 602 ; N uni2540 ; G 2354\nU 9537 ; WX 602 ; N uni2541 ; G 2355\nU 9538 ; WX 602 ; N uni2542 ; G 2356\nU 9539 ; WX 602 ; N uni2543 ; G 2357\nU 9540 ; WX 602 ; N uni2544 ; G 2358\nU 9541 ; WX 602 ; N uni2545 ; G 2359\nU 9542 ; WX 602 ; N uni2546 ; G 2360\nU 9543 ; WX 602 ; N uni2547 ; G 2361\nU 9544 ; WX 602 ; N uni2548 ; G 2362\nU 9545 ; WX 602 ; N uni2549 ; G 2363\nU 9546 ; WX 602 ; N uni254A ; G 2364\nU 9547 ; WX 602 ; N uni254B ; G 2365\nU 9548 ; WX 602 ; N uni254C ; G 2366\nU 9549 ; WX 602 ; N uni254D ; G 2367\nU 9550 ; WX 602 ; N uni254E ; G 2368\nU 9551 ; WX 602 ; N uni254F ; G 2369\nU 9552 ; WX 602 ; N SF430000 ; G 2370\nU 9553 ; WX 602 ; N SF240000 ; G 2371\nU 9554 ; WX 602 ; N SF510000 ; G 2372\nU 9555 ; WX 602 ; N SF520000 ; G 2373\nU 9556 ; WX 602 ; N SF390000 ; G 2374\nU 9557 ; WX 602 ; N SF220000 ; G 2375\nU 9558 ; WX 602 ; N SF210000 ; G 2376\nU 9559 ; WX 602 ; N SF250000 ; G 2377\nU 9560 ; WX 602 ; N SF500000 ; G 2378\nU 9561 ; WX 602 ; N SF490000 ; G 2379\nU 9562 ; WX 602 ; N SF380000 ; G 2380\nU 9563 ; WX 602 ; N SF280000 ; G 2381\nU 9564 ; WX 602 ; N SF270000 ; G 2382\nU 9565 ; WX 602 ; N SF260000 ; G 2383\nU 9566 ; WX 602 ; N SF360000 ; G 2384\nU 9567 ; WX 602 ; N SF370000 ; G 2385\nU 9568 ; WX 602 ; N SF420000 ; G 2386\nU 9569 ; WX 602 ; N SF190000 ; G 2387\nU 9570 ; WX 602 ; N SF200000 ; G 2388\nU 9571 ; WX 602 ; N SF230000 ; G 2389\nU 9572 ; WX 602 ; N SF470000 ; G 2390\nU 9573 ; WX 602 ; N SF480000 ; G 2391\nU 9574 ; WX 602 ; N SF410000 ; G 2392\nU 9575 ; WX 602 ; N SF450000 ; G 2393\nU 9576 ; WX 602 ; N SF460000 ; G 2394\nU 9577 ; WX 602 ; N SF400000 ; G 2395\nU 9578 ; WX 602 ; N SF540000 ; G 2396\nU 9579 ; WX 602 ; N SF530000 ; G 2397\nU 9580 ; WX 602 ; N SF440000 ; G 2398\nU 9581 ; WX 602 ; N uni256D ; G 2399\nU 9582 ; WX 602 ; N uni256E ; G 2400\nU 9583 ; WX 602 ; N uni256F ; G 2401\nU 9584 ; WX 602 ; N uni2570 ; G 2402\nU 9585 ; WX 602 ; N uni2571 ; G 2403\nU 9586 ; WX 602 ; N uni2572 ; G 2404\nU 9587 ; WX 602 ; N uni2573 ; G 2405\nU 9588 ; WX 602 ; N uni2574 ; G 2406\nU 9589 ; WX 602 ; N uni2575 ; G 2407\nU 9590 ; WX 602 ; N uni2576 ; G 2408\nU 9591 ; WX 602 ; N uni2577 ; G 2409\nU 9592 ; WX 602 ; N uni2578 ; G 2410\nU 9593 ; WX 602 ; N uni2579 ; G 2411\nU 9594 ; WX 602 ; N uni257A ; G 2412\nU 9595 ; WX 602 ; N uni257B ; G 2413\nU 9596 ; WX 602 ; N uni257C ; G 2414\nU 9597 ; WX 602 ; N uni257D ; G 2415\nU 9598 ; WX 602 ; N uni257E ; G 2416\nU 9599 ; WX 602 ; N uni257F ; G 2417\nU 9600 ; WX 602 ; N upblock ; G 2418\nU 9601 ; WX 602 ; N uni2581 ; G 2419\nU 9602 ; WX 602 ; N uni2582 ; G 2420\nU 9603 ; WX 602 ; N uni2583 ; G 2421\nU 9604 ; WX 602 ; N dnblock ; G 2422\nU 9605 ; WX 602 ; N uni2585 ; G 2423\nU 9606 ; WX 602 ; N uni2586 ; G 2424\nU 9607 ; WX 602 ; N uni2587 ; G 2425\nU 9608 ; WX 602 ; N block ; G 2426\nU 9609 ; WX 602 ; N uni2589 ; G 2427\nU 9610 ; WX 602 ; N uni258A ; G 2428\nU 9611 ; WX 602 ; N uni258B ; G 2429\nU 9612 ; WX 602 ; N lfblock ; G 2430\nU 9613 ; WX 602 ; N uni258D ; G 2431\nU 9614 ; WX 602 ; N uni258E ; G 2432\nU 9615 ; WX 602 ; N uni258F ; G 2433\nU 9616 ; WX 602 ; N rtblock ; G 2434\nU 9617 ; WX 602 ; N ltshade ; G 2435\nU 9618 ; WX 602 ; N shade ; G 2436\nU 9619 ; WX 602 ; N dkshade ; G 2437\nU 9620 ; WX 602 ; N uni2594 ; G 2438\nU 9621 ; WX 602 ; N uni2595 ; G 2439\nU 9622 ; WX 602 ; N uni2596 ; G 2440\nU 9623 ; WX 602 ; N uni2597 ; G 2441\nU 9624 ; WX 602 ; N uni2598 ; G 2442\nU 9625 ; WX 602 ; N uni2599 ; G 2443\nU 9626 ; WX 602 ; N uni259A ; G 2444\nU 9627 ; WX 602 ; N uni259B ; G 2445\nU 9628 ; WX 602 ; N uni259C ; G 2446\nU 9629 ; WX 602 ; N uni259D ; G 2447\nU 9630 ; WX 602 ; N uni259E ; G 2448\nU 9631 ; WX 602 ; N uni259F ; G 2449\nU 9632 ; WX 602 ; N filledbox ; G 2450\nU 9633 ; WX 602 ; N H22073 ; G 2451\nU 9634 ; WX 602 ; N uni25A2 ; G 2452\nU 9635 ; WX 602 ; N uni25A3 ; G 2453\nU 9636 ; WX 602 ; N uni25A4 ; G 2454\nU 9637 ; WX 602 ; N uni25A5 ; G 2455\nU 9638 ; WX 602 ; N uni25A6 ; G 2456\nU 9639 ; WX 602 ; N uni25A7 ; G 2457\nU 9640 ; WX 602 ; N uni25A8 ; G 2458\nU 9641 ; WX 602 ; N uni25A9 ; G 2459\nU 9642 ; WX 602 ; N H18543 ; G 2460\nU 9643 ; WX 602 ; N H18551 ; G 2461\nU 9644 ; WX 602 ; N filledrect ; G 2462\nU 9645 ; WX 602 ; N uni25AD ; G 2463\nU 9646 ; WX 602 ; N uni25AE ; G 2464\nU 9647 ; WX 602 ; N uni25AF ; G 2465\nU 9648 ; WX 602 ; N uni25B0 ; G 2466\nU 9649 ; WX 602 ; N uni25B1 ; G 2467\nU 9650 ; WX 602 ; N triagup ; G 2468\nU 9651 ; WX 602 ; N uni25B3 ; G 2469\nU 9652 ; WX 602 ; N uni25B4 ; G 2470\nU 9653 ; WX 602 ; N uni25B5 ; G 2471\nU 9654 ; WX 602 ; N uni25B6 ; G 2472\nU 9655 ; WX 602 ; N uni25B7 ; G 2473\nU 9656 ; WX 602 ; N uni25B8 ; G 2474\nU 9657 ; WX 602 ; N uni25B9 ; G 2475\nU 9658 ; WX 602 ; N triagrt ; G 2476\nU 9659 ; WX 602 ; N uni25BB ; G 2477\nU 9660 ; WX 602 ; N triagdn ; G 2478\nU 9661 ; WX 602 ; N uni25BD ; G 2479\nU 9662 ; WX 602 ; N uni25BE ; G 2480\nU 9663 ; WX 602 ; N uni25BF ; G 2481\nU 9664 ; WX 602 ; N uni25C0 ; G 2482\nU 9665 ; WX 602 ; N uni25C1 ; G 2483\nU 9666 ; WX 602 ; N uni25C2 ; G 2484\nU 9667 ; WX 602 ; N uni25C3 ; G 2485\nU 9668 ; WX 602 ; N triaglf ; G 2486\nU 9669 ; WX 602 ; N uni25C5 ; G 2487\nU 9670 ; WX 602 ; N uni25C6 ; G 2488\nU 9671 ; WX 602 ; N uni25C7 ; G 2489\nU 9672 ; WX 602 ; N uni25C8 ; G 2490\nU 9673 ; WX 602 ; N uni25C9 ; G 2491\nU 9674 ; WX 602 ; N lozenge ; G 2492\nU 9675 ; WX 602 ; N circle ; G 2493\nU 9676 ; WX 602 ; N uni25CC ; G 2494\nU 9677 ; WX 602 ; N uni25CD ; G 2495\nU 9678 ; WX 602 ; N uni25CE ; G 2496\nU 9679 ; WX 602 ; N H18533 ; G 2497\nU 9680 ; WX 602 ; N uni25D0 ; G 2498\nU 9681 ; WX 602 ; N uni25D1 ; G 2499\nU 9682 ; WX 602 ; N uni25D2 ; G 2500\nU 9683 ; WX 602 ; N uni25D3 ; G 2501\nU 9684 ; WX 602 ; N uni25D4 ; G 2502\nU 9685 ; WX 602 ; N uni25D5 ; G 2503\nU 9686 ; WX 602 ; N uni25D6 ; G 2504\nU 9687 ; WX 602 ; N uni25D7 ; G 2505\nU 9688 ; WX 602 ; N invbullet ; G 2506\nU 9689 ; WX 602 ; N invcircle ; G 2507\nU 9690 ; WX 602 ; N uni25DA ; G 2508\nU 9691 ; WX 602 ; N uni25DB ; G 2509\nU 9692 ; WX 602 ; N uni25DC ; G 2510\nU 9693 ; WX 602 ; N uni25DD ; G 2511\nU 9694 ; WX 602 ; N uni25DE ; G 2512\nU 9695 ; WX 602 ; N uni25DF ; G 2513\nU 9696 ; WX 602 ; N uni25E0 ; G 2514\nU 9697 ; WX 602 ; N uni25E1 ; G 2515\nU 9698 ; WX 602 ; N uni25E2 ; G 2516\nU 9699 ; WX 602 ; N uni25E3 ; G 2517\nU 9700 ; WX 602 ; N uni25E4 ; G 2518\nU 9701 ; WX 602 ; N uni25E5 ; G 2519\nU 9702 ; WX 602 ; N openbullet ; G 2520\nU 9703 ; WX 602 ; N uni25E7 ; G 2521\nU 9704 ; WX 602 ; N uni25E8 ; G 2522\nU 9705 ; WX 602 ; N uni25E9 ; G 2523\nU 9706 ; WX 602 ; N uni25EA ; G 2524\nU 9707 ; WX 602 ; N uni25EB ; G 2525\nU 9708 ; WX 602 ; N uni25EC ; G 2526\nU 9709 ; WX 602 ; N uni25ED ; G 2527\nU 9710 ; WX 602 ; N uni25EE ; G 2528\nU 9711 ; WX 602 ; N uni25EF ; G 2529\nU 9712 ; WX 602 ; N uni25F0 ; G 2530\nU 9713 ; WX 602 ; N uni25F1 ; G 2531\nU 9714 ; WX 602 ; N uni25F2 ; G 2532\nU 9715 ; WX 602 ; N uni25F3 ; G 2533\nU 9716 ; WX 602 ; N uni25F4 ; G 2534\nU 9717 ; WX 602 ; N uni25F5 ; G 2535\nU 9718 ; WX 602 ; N uni25F6 ; G 2536\nU 9719 ; WX 602 ; N uni25F7 ; G 2537\nU 9720 ; WX 602 ; N uni25F8 ; G 2538\nU 9721 ; WX 602 ; N uni25F9 ; G 2539\nU 9722 ; WX 602 ; N uni25FA ; G 2540\nU 9723 ; WX 602 ; N uni25FB ; G 2541\nU 9724 ; WX 602 ; N uni25FC ; G 2542\nU 9725 ; WX 602 ; N uni25FD ; G 2543\nU 9726 ; WX 602 ; N uni25FE ; G 2544\nU 9727 ; WX 602 ; N uni25FF ; G 2545\nU 9728 ; WX 602 ; N uni2600 ; G 2546\nU 9784 ; WX 602 ; N uni2638 ; G 2547\nU 9785 ; WX 602 ; N uni2639 ; G 2548\nU 9786 ; WX 602 ; N smileface ; G 2549\nU 9787 ; WX 602 ; N invsmileface ; G 2550\nU 9788 ; WX 602 ; N sun ; G 2551\nU 9791 ; WX 602 ; N uni263F ; G 2552\nU 9792 ; WX 602 ; N female ; G 2553\nU 9793 ; WX 602 ; N uni2641 ; G 2554\nU 9794 ; WX 602 ; N male ; G 2555\nU 9795 ; WX 602 ; N uni2643 ; G 2556\nU 9796 ; WX 602 ; N uni2644 ; G 2557\nU 9797 ; WX 602 ; N uni2645 ; G 2558\nU 9798 ; WX 602 ; N uni2646 ; G 2559\nU 9799 ; WX 602 ; N uni2647 ; G 2560\nU 9824 ; WX 602 ; N spade ; G 2561\nU 9825 ; WX 602 ; N uni2661 ; G 2562\nU 9826 ; WX 602 ; N uni2662 ; G 2563\nU 9827 ; WX 602 ; N club ; G 2564\nU 9828 ; WX 602 ; N uni2664 ; G 2565\nU 9829 ; WX 602 ; N heart ; G 2566\nU 9830 ; WX 602 ; N diamond ; G 2567\nU 9831 ; WX 602 ; N uni2667 ; G 2568\nU 9833 ; WX 602 ; N uni2669 ; G 2569\nU 9834 ; WX 602 ; N musicalnote ; G 2570\nU 9835 ; WX 602 ; N musicalnotedbl ; G 2571\nU 9836 ; WX 602 ; N uni266C ; G 2572\nU 9837 ; WX 602 ; N uni266D ; G 2573\nU 9838 ; WX 602 ; N uni266E ; G 2574\nU 9839 ; WX 602 ; N uni266F ; G 2575\nU 10178 ; WX 602 ; N uni27C2 ; G 2576\nU 10181 ; WX 602 ; N uni27C5 ; G 2577\nU 10182 ; WX 602 ; N uni27C6 ; G 2578\nU 10204 ; WX 602 ; N uni27DC ; G 2579\nU 10208 ; WX 602 ; N uni27E0 ; G 2580\nU 10214 ; WX 602 ; N uni27E6 ; G 2581\nU 10215 ; WX 602 ; N uni27E7 ; G 2582\nU 10216 ; WX 602 ; N uni27E8 ; G 2583\nU 10217 ; WX 602 ; N uni27E9 ; G 2584\nU 10218 ; WX 602 ; N uni27EA ; G 2585\nU 10219 ; WX 602 ; N uni27EB ; G 2586\nU 10229 ; WX 602 ; N uni27F5 ; G 2587\nU 10230 ; WX 602 ; N uni27F6 ; G 2588\nU 10231 ; WX 602 ; N uni27F7 ; G 2589\nU 10631 ; WX 602 ; N uni2987 ; G 2590\nU 10632 ; WX 602 ; N uni2988 ; G 2591\nU 10647 ; WX 602 ; N uni2997 ; G 2592\nU 10648 ; WX 602 ; N uni2998 ; G 2593\nU 10731 ; WX 602 ; N uni29EB ; G 2594\nU 10746 ; WX 602 ; N uni29FA ; G 2595\nU 10747 ; WX 602 ; N uni29FB ; G 2596\nU 10752 ; WX 602 ; N uni2A00 ; G 2597\nU 10799 ; WX 602 ; N uni2A2F ; G 2598\nU 10858 ; WX 602 ; N uni2A6A ; G 2599\nU 10859 ; WX 602 ; N uni2A6B ; G 2600\nU 11013 ; WX 602 ; N uni2B05 ; G 2601\nU 11014 ; WX 602 ; N uni2B06 ; G 2602\nU 11015 ; WX 602 ; N uni2B07 ; G 2603\nU 11016 ; WX 602 ; N uni2B08 ; G 2604\nU 11017 ; WX 602 ; N uni2B09 ; G 2605\nU 11018 ; WX 602 ; N uni2B0A ; G 2606\nU 11019 ; WX 602 ; N uni2B0B ; G 2607\nU 11020 ; WX 602 ; N uni2B0C ; G 2608\nU 11021 ; WX 602 ; N uni2B0D ; G 2609\nU 11026 ; WX 602 ; N uni2B12 ; G 2610\nU 11027 ; WX 602 ; N uni2B13 ; G 2611\nU 11028 ; WX 602 ; N uni2B14 ; G 2612\nU 11029 ; WX 602 ; N uni2B15 ; G 2613\nU 11030 ; WX 602 ; N uni2B16 ; G 2614\nU 11031 ; WX 602 ; N uni2B17 ; G 2615\nU 11032 ; WX 602 ; N uni2B18 ; G 2616\nU 11033 ; WX 602 ; N uni2B19 ; G 2617\nU 11034 ; WX 602 ; N uni2B1A ; G 2618\nU 11364 ; WX 602 ; N uni2C64 ; G 2619\nU 11373 ; WX 602 ; N uni2C6D ; G 2620\nU 11374 ; WX 602 ; N uni2C6E ; G 2621\nU 11375 ; WX 602 ; N uni2C6F ; G 2622\nU 11376 ; WX 602 ; N uni2C70 ; G 2623\nU 11381 ; WX 602 ; N uni2C75 ; G 2624\nU 11382 ; WX 602 ; N uni2C76 ; G 2625\nU 11383 ; WX 602 ; N uni2C77 ; G 2626\nU 11385 ; WX 602 ; N uni2C79 ; G 2627\nU 11386 ; WX 602 ; N uni2C7A ; G 2628\nU 11388 ; WX 602 ; N uni2C7C ; G 2629\nU 11389 ; WX 602 ; N uni2C7D ; G 2630\nU 11390 ; WX 602 ; N uni2C7E ; G 2631\nU 11391 ; WX 602 ; N uni2C7F ; G 2632\nU 11800 ; WX 602 ; N uni2E18 ; G 2633\nU 11807 ; WX 602 ; N uni2E1F ; G 2634\nU 11810 ; WX 602 ; N uni2E22 ; G 2635\nU 11811 ; WX 602 ; N uni2E23 ; G 2636\nU 11812 ; WX 602 ; N uni2E24 ; G 2637\nU 11813 ; WX 602 ; N uni2E25 ; G 2638\nU 11822 ; WX 602 ; N uni2E2E ; G 2639\nU 42760 ; WX 602 ; N uniA708 ; G 2640\nU 42761 ; WX 602 ; N uniA709 ; G 2641\nU 42762 ; WX 602 ; N uniA70A ; G 2642\nU 42763 ; WX 602 ; N uniA70B ; G 2643\nU 42764 ; WX 602 ; N uniA70C ; G 2644\nU 42765 ; WX 602 ; N uniA70D ; G 2645\nU 42766 ; WX 602 ; N uniA70E ; G 2646\nU 42767 ; WX 602 ; N uniA70F ; G 2647\nU 42768 ; WX 602 ; N uniA710 ; G 2648\nU 42769 ; WX 602 ; N uniA711 ; G 2649\nU 42770 ; WX 602 ; N uniA712 ; G 2650\nU 42771 ; WX 602 ; N uniA713 ; G 2651\nU 42772 ; WX 602 ; N uniA714 ; G 2652\nU 42773 ; WX 602 ; N uniA715 ; G 2653\nU 42774 ; WX 602 ; N uniA716 ; G 2654\nU 42779 ; WX 602 ; N uniA71B ; G 2655\nU 42780 ; WX 602 ; N uniA71C ; G 2656\nU 42781 ; WX 602 ; N uniA71D ; G 2657\nU 42782 ; WX 602 ; N uniA71E ; G 2658\nU 42783 ; WX 602 ; N uniA71F ; G 2659\nU 42786 ; WX 602 ; N uniA722 ; G 2660\nU 42787 ; WX 602 ; N uniA723 ; G 2661\nU 42788 ; WX 602 ; N uniA724 ; G 2662\nU 42789 ; WX 602 ; N uniA725 ; G 2663\nU 42790 ; WX 602 ; N uniA726 ; G 2664\nU 42791 ; WX 602 ; N uniA727 ; G 2665\nU 42889 ; WX 602 ; N uniA789 ; G 2666\nU 42890 ; WX 602 ; N uniA78A ; G 2667\nU 42891 ; WX 602 ; N uniA78B ; G 2668\nU 42892 ; WX 602 ; N uniA78C ; G 2669\nU 42893 ; WX 602 ; N uniA78D ; G 2670\nU 42894 ; WX 602 ; N uniA78E ; G 2671\nU 42896 ; WX 602 ; N uniA790 ; G 2672\nU 42897 ; WX 602 ; N uniA791 ; G 2673\nU 42922 ; WX 602 ; N uniA7AA ; G 2674\nU 43000 ; WX 602 ; N uniA7F8 ; G 2675\nU 43001 ; WX 602 ; N uniA7F9 ; G 2676\nU 63173 ; WX 602 ; N uniF6C5 ; G 2677\nU 64257 ; WX 602 ; N fi ; G 2678\nU 64258 ; WX 602 ; N fl ; G 2679\nU 65529 ; WX 602 ; N uniFFF9 ; G 2680\nU 65530 ; WX 602 ; N uniFFFA ; G 2681\nU 65531 ; WX 602 ; N uniFFFB ; G 2682\nU 65532 ; WX 602 ; N uniFFFC ; G 2683\nU 65533 ; WX 602 ; N uniFFFD ; G 2684\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSansMono.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans Mono\nFontSubfamily Book\nUniqueID DejaVu Sans Mono\nFullName DejaVu Sans Mono\nVersion Version 2.37\nPostScriptName DejaVuSansMono\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nWeight Medium\nItalicAngle 0\nIsFixedPitch true\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -558 -375 718 1028\nStartCharMetrics 3377\nU 32 ; WX 602 ; N space ; G 3\nU 33 ; WX 602 ; N exclam ; G 4\nU 34 ; WX 602 ; N quotedbl ; G 5\nU 35 ; WX 602 ; N numbersign ; G 6\nU 36 ; WX 602 ; N dollar ; G 7\nU 37 ; WX 602 ; N percent ; G 8\nU 38 ; WX 602 ; N ampersand ; G 9\nU 39 ; WX 602 ; N quotesingle ; G 10\nU 40 ; WX 602 ; N parenleft ; G 11\nU 41 ; WX 602 ; N parenright ; G 12\nU 42 ; WX 602 ; N asterisk ; G 13\nU 43 ; WX 602 ; N plus ; G 14\nU 44 ; WX 602 ; N comma ; G 15\nU 45 ; WX 602 ; N hyphen ; G 16\nU 46 ; WX 602 ; N period ; G 17\nU 47 ; WX 602 ; N slash ; G 18\nU 48 ; WX 602 ; N zero ; G 19\nU 49 ; WX 602 ; N one ; G 20\nU 50 ; WX 602 ; N two ; G 21\nU 51 ; WX 602 ; N three ; G 22\nU 52 ; WX 602 ; N four ; G 23\nU 53 ; WX 602 ; N five ; G 24\nU 54 ; WX 602 ; N six ; G 25\nU 55 ; WX 602 ; N seven ; G 26\nU 56 ; WX 602 ; N eight ; G 27\nU 57 ; WX 602 ; N nine ; G 28\nU 58 ; WX 602 ; N colon ; G 29\nU 59 ; WX 602 ; N semicolon ; G 30\nU 60 ; WX 602 ; N less ; G 31\nU 61 ; WX 602 ; N equal ; G 32\nU 62 ; WX 602 ; N greater ; G 33\nU 63 ; WX 602 ; N question ; G 34\nU 64 ; WX 602 ; N at ; G 35\nU 65 ; WX 602 ; N A ; G 36\nU 66 ; WX 602 ; N B ; G 37\nU 67 ; WX 602 ; N C ; G 38\nU 68 ; WX 602 ; N D ; G 39\nU 69 ; WX 602 ; N E ; G 40\nU 70 ; WX 602 ; N F ; G 41\nU 71 ; WX 602 ; N G ; G 42\nU 72 ; WX 602 ; N H ; G 43\nU 73 ; WX 602 ; N I ; G 44\nU 74 ; WX 602 ; N J ; G 45\nU 75 ; WX 602 ; N K ; G 46\nU 76 ; WX 602 ; N L ; G 47\nU 77 ; WX 602 ; N M ; G 48\nU 78 ; WX 602 ; N N ; G 49\nU 79 ; WX 602 ; N O ; G 50\nU 80 ; WX 602 ; N P ; G 51\nU 81 ; WX 602 ; N Q ; G 52\nU 82 ; WX 602 ; N R ; G 53\nU 83 ; WX 602 ; N S ; G 54\nU 84 ; WX 602 ; N T ; G 55\nU 85 ; WX 602 ; N U ; G 56\nU 86 ; WX 602 ; N V ; G 57\nU 87 ; WX 602 ; N W ; G 58\nU 88 ; WX 602 ; N X ; G 59\nU 89 ; WX 602 ; N Y ; G 60\nU 90 ; WX 602 ; N Z ; G 61\nU 91 ; WX 602 ; N bracketleft ; G 62\nU 92 ; WX 602 ; N backslash ; G 63\nU 93 ; WX 602 ; N bracketright ; G 64\nU 94 ; WX 602 ; N asciicircum ; G 65\nU 95 ; WX 602 ; N underscore ; G 66\nU 96 ; WX 602 ; N grave ; G 67\nU 97 ; WX 602 ; N a ; G 68\nU 98 ; WX 602 ; N b ; G 69\nU 99 ; WX 602 ; N c ; G 70\nU 100 ; WX 602 ; N d ; G 71\nU 101 ; WX 602 ; N e ; G 72\nU 102 ; WX 602 ; N f ; G 73\nU 103 ; WX 602 ; N g ; G 74\nU 104 ; WX 602 ; N h ; G 75\nU 105 ; WX 602 ; N i ; G 76\nU 106 ; WX 602 ; N j ; G 77\nU 107 ; WX 602 ; N k ; G 78\nU 108 ; WX 602 ; N l ; G 79\nU 109 ; WX 602 ; N m ; G 80\nU 110 ; WX 602 ; N n ; G 81\nU 111 ; WX 602 ; N o ; G 82\nU 112 ; WX 602 ; N p ; G 83\nU 113 ; WX 602 ; N q ; G 84\nU 114 ; WX 602 ; N r ; G 85\nU 115 ; WX 602 ; N s ; G 86\nU 116 ; WX 602 ; N t ; G 87\nU 117 ; WX 602 ; N u ; G 88\nU 118 ; WX 602 ; N v ; G 89\nU 119 ; WX 602 ; N w ; G 90\nU 120 ; WX 602 ; N x ; G 91\nU 121 ; WX 602 ; N y ; G 92\nU 122 ; WX 602 ; N z ; G 93\nU 123 ; WX 602 ; N braceleft ; G 94\nU 124 ; WX 602 ; N bar ; G 95\nU 125 ; WX 602 ; N braceright ; G 96\nU 126 ; WX 602 ; N asciitilde ; G 97\nU 160 ; WX 602 ; N nbspace ; G 98\nU 161 ; WX 602 ; N exclamdown ; G 99\nU 162 ; WX 602 ; N cent ; G 100\nU 163 ; WX 602 ; N sterling ; G 101\nU 164 ; WX 602 ; N currency ; G 102\nU 165 ; WX 602 ; N yen ; G 103\nU 166 ; WX 602 ; N brokenbar ; G 104\nU 167 ; WX 602 ; N section ; G 105\nU 168 ; WX 602 ; N dieresis ; G 106\nU 169 ; WX 602 ; N copyright ; G 107\nU 170 ; WX 602 ; N ordfeminine ; G 108\nU 171 ; WX 602 ; N guillemotleft ; G 109\nU 172 ; WX 602 ; N logicalnot ; G 110\nU 173 ; WX 602 ; N sfthyphen ; G 111\nU 174 ; WX 602 ; N registered ; G 112\nU 175 ; WX 602 ; N macron ; G 113\nU 176 ; WX 602 ; N degree ; G 114\nU 177 ; WX 602 ; N plusminus ; G 115\nU 178 ; WX 602 ; N twosuperior ; G 116\nU 179 ; WX 602 ; N threesuperior ; G 117\nU 180 ; WX 602 ; N acute ; G 118\nU 181 ; WX 602 ; N mu ; G 119\nU 182 ; WX 602 ; N paragraph ; G 120\nU 183 ; WX 602 ; N periodcentered ; G 121\nU 184 ; WX 602 ; N cedilla ; G 122\nU 185 ; WX 602 ; N onesuperior ; G 123\nU 186 ; WX 602 ; N ordmasculine ; G 124\nU 187 ; WX 602 ; N guillemotright ; G 125\nU 188 ; WX 602 ; N onequarter ; G 126\nU 189 ; WX 602 ; N onehalf ; G 127\nU 190 ; WX 602 ; N threequarters ; G 128\nU 191 ; WX 602 ; N questiondown ; G 129\nU 192 ; WX 602 ; N Agrave ; G 130\nU 193 ; WX 602 ; N Aacute ; G 131\nU 194 ; WX 602 ; N Acircumflex ; G 132\nU 195 ; WX 602 ; N Atilde ; G 133\nU 196 ; WX 602 ; N Adieresis ; G 134\nU 197 ; WX 602 ; N Aring ; G 135\nU 198 ; WX 602 ; N AE ; G 136\nU 199 ; WX 602 ; N Ccedilla ; G 137\nU 200 ; WX 602 ; N Egrave ; G 138\nU 201 ; WX 602 ; N Eacute ; G 139\nU 202 ; WX 602 ; N Ecircumflex ; G 140\nU 203 ; WX 602 ; N Edieresis ; G 141\nU 204 ; WX 602 ; N Igrave ; G 142\nU 205 ; WX 602 ; N Iacute ; G 143\nU 206 ; WX 602 ; N Icircumflex ; G 144\nU 207 ; WX 602 ; N Idieresis ; G 145\nU 208 ; WX 602 ; N Eth ; G 146\nU 209 ; WX 602 ; N Ntilde ; G 147\nU 210 ; WX 602 ; N Ograve ; G 148\nU 211 ; WX 602 ; N Oacute ; G 149\nU 212 ; WX 602 ; N Ocircumflex ; G 150\nU 213 ; WX 602 ; N Otilde ; G 151\nU 214 ; WX 602 ; N Odieresis ; G 152\nU 215 ; WX 602 ; N multiply ; G 153\nU 216 ; WX 602 ; N Oslash ; G 154\nU 217 ; WX 602 ; N Ugrave ; G 155\nU 218 ; WX 602 ; N Uacute ; G 156\nU 219 ; WX 602 ; N Ucircumflex ; G 157\nU 220 ; WX 602 ; N Udieresis ; G 158\nU 221 ; WX 602 ; N Yacute ; G 159\nU 222 ; WX 602 ; N Thorn ; G 160\nU 223 ; WX 602 ; N germandbls ; G 161\nU 224 ; WX 602 ; N agrave ; G 162\nU 225 ; WX 602 ; N aacute ; G 163\nU 226 ; WX 602 ; N acircumflex ; G 164\nU 227 ; WX 602 ; N atilde ; G 165\nU 228 ; WX 602 ; N adieresis ; G 166\nU 229 ; WX 602 ; N aring ; G 167\nU 230 ; WX 602 ; N ae ; G 168\nU 231 ; WX 602 ; N ccedilla ; G 169\nU 232 ; WX 602 ; N egrave ; G 170\nU 233 ; WX 602 ; N eacute ; G 171\nU 234 ; WX 602 ; N ecircumflex ; G 172\nU 235 ; WX 602 ; N edieresis ; G 173\nU 236 ; WX 602 ; N igrave ; G 174\nU 237 ; WX 602 ; N iacute ; G 175\nU 238 ; WX 602 ; N icircumflex ; G 176\nU 239 ; WX 602 ; N idieresis ; G 177\nU 240 ; WX 602 ; N eth ; G 178\nU 241 ; WX 602 ; N ntilde ; G 179\nU 242 ; WX 602 ; N ograve ; G 180\nU 243 ; WX 602 ; N oacute ; G 181\nU 244 ; WX 602 ; N ocircumflex ; G 182\nU 245 ; WX 602 ; N otilde ; G 183\nU 246 ; WX 602 ; N odieresis ; G 184\nU 247 ; WX 602 ; N divide ; G 185\nU 248 ; WX 602 ; N oslash ; G 186\nU 249 ; WX 602 ; N ugrave ; G 187\nU 250 ; WX 602 ; N uacute ; G 188\nU 251 ; WX 602 ; N ucircumflex ; G 189\nU 252 ; WX 602 ; N udieresis ; G 190\nU 253 ; WX 602 ; N yacute ; G 191\nU 254 ; WX 602 ; N thorn ; G 192\nU 255 ; WX 602 ; N ydieresis ; G 193\nU 256 ; WX 602 ; N Amacron ; G 194\nU 257 ; WX 602 ; N amacron ; G 195\nU 258 ; WX 602 ; N Abreve ; G 196\nU 259 ; WX 602 ; N abreve ; G 197\nU 260 ; WX 602 ; N Aogonek ; G 198\nU 261 ; WX 602 ; N aogonek ; G 199\nU 262 ; WX 602 ; N Cacute ; G 200\nU 263 ; WX 602 ; N cacute ; G 201\nU 264 ; WX 602 ; N Ccircumflex ; G 202\nU 265 ; WX 602 ; N ccircumflex ; G 203\nU 266 ; WX 602 ; N Cdotaccent ; G 204\nU 267 ; WX 602 ; N cdotaccent ; G 205\nU 268 ; WX 602 ; N Ccaron ; G 206\nU 269 ; WX 602 ; N ccaron ; G 207\nU 270 ; WX 602 ; N Dcaron ; G 208\nU 271 ; WX 602 ; N dcaron ; G 209\nU 272 ; WX 602 ; N Dcroat ; G 210\nU 273 ; WX 602 ; N dmacron ; G 211\nU 274 ; WX 602 ; N Emacron ; G 212\nU 275 ; WX 602 ; N emacron ; G 213\nU 276 ; WX 602 ; N Ebreve ; G 214\nU 277 ; WX 602 ; N ebreve ; G 215\nU 278 ; WX 602 ; N Edotaccent ; G 216\nU 279 ; WX 602 ; N edotaccent ; G 217\nU 280 ; WX 602 ; N Eogonek ; G 218\nU 281 ; WX 602 ; N eogonek ; G 219\nU 282 ; WX 602 ; N Ecaron ; G 220\nU 283 ; WX 602 ; N ecaron ; G 221\nU 284 ; WX 602 ; N Gcircumflex ; G 222\nU 285 ; WX 602 ; N gcircumflex ; G 223\nU 286 ; WX 602 ; N Gbreve ; G 224\nU 287 ; WX 602 ; N gbreve ; G 225\nU 288 ; WX 602 ; N Gdotaccent ; G 226\nU 289 ; WX 602 ; N gdotaccent ; G 227\nU 290 ; WX 602 ; N Gcommaaccent ; G 228\nU 291 ; WX 602 ; N gcommaaccent ; G 229\nU 292 ; WX 602 ; N Hcircumflex ; G 230\nU 293 ; WX 602 ; N hcircumflex ; G 231\nU 294 ; WX 602 ; N Hbar ; G 232\nU 295 ; WX 602 ; N hbar ; G 233\nU 296 ; WX 602 ; N Itilde ; G 234\nU 297 ; WX 602 ; N itilde ; G 235\nU 298 ; WX 602 ; N Imacron ; G 236\nU 299 ; WX 602 ; N imacron ; G 237\nU 300 ; WX 602 ; N Ibreve ; G 238\nU 301 ; WX 602 ; N ibreve ; G 239\nU 302 ; WX 602 ; N Iogonek ; G 240\nU 303 ; WX 602 ; N iogonek ; G 241\nU 304 ; WX 602 ; N Idot ; G 242\nU 305 ; WX 602 ; N dotlessi ; G 243\nU 306 ; WX 602 ; N IJ ; G 244\nU 307 ; WX 602 ; N ij ; G 245\nU 308 ; WX 602 ; N Jcircumflex ; G 246\nU 309 ; WX 602 ; N jcircumflex ; G 247\nU 310 ; WX 602 ; N Kcommaaccent ; G 248\nU 311 ; WX 602 ; N kcommaaccent ; G 249\nU 312 ; WX 602 ; N kgreenlandic ; G 250\nU 313 ; WX 602 ; N Lacute ; G 251\nU 314 ; WX 602 ; N lacute ; G 252\nU 315 ; WX 602 ; N Lcommaaccent ; G 253\nU 316 ; WX 602 ; N lcommaaccent ; G 254\nU 317 ; WX 602 ; N Lcaron ; G 255\nU 318 ; WX 602 ; N lcaron ; G 256\nU 319 ; WX 602 ; N Ldot ; G 257\nU 320 ; WX 602 ; N ldot ; G 258\nU 321 ; WX 602 ; N Lslash ; G 259\nU 322 ; WX 602 ; N lslash ; G 260\nU 323 ; WX 602 ; N Nacute ; G 261\nU 324 ; WX 602 ; N nacute ; G 262\nU 325 ; WX 602 ; N Ncommaaccent ; G 263\nU 326 ; WX 602 ; N ncommaaccent ; G 264\nU 327 ; WX 602 ; N Ncaron ; G 265\nU 328 ; WX 602 ; N ncaron ; G 266\nU 329 ; WX 602 ; N napostrophe ; G 267\nU 330 ; WX 602 ; N Eng ; G 268\nU 331 ; WX 602 ; N eng ; G 269\nU 332 ; WX 602 ; N Omacron ; G 270\nU 333 ; WX 602 ; N omacron ; G 271\nU 334 ; WX 602 ; N Obreve ; G 272\nU 335 ; WX 602 ; N obreve ; G 273\nU 336 ; WX 602 ; N Ohungarumlaut ; G 274\nU 337 ; WX 602 ; N ohungarumlaut ; G 275\nU 338 ; WX 602 ; N OE ; G 276\nU 339 ; WX 602 ; N oe ; G 277\nU 340 ; WX 602 ; N Racute ; G 278\nU 341 ; WX 602 ; N racute ; G 279\nU 342 ; WX 602 ; N Rcommaaccent ; G 280\nU 343 ; WX 602 ; N rcommaaccent ; G 281\nU 344 ; WX 602 ; N Rcaron ; G 282\nU 345 ; WX 602 ; N rcaron ; G 283\nU 346 ; WX 602 ; N Sacute ; G 284\nU 347 ; WX 602 ; N sacute ; G 285\nU 348 ; WX 602 ; N Scircumflex ; G 286\nU 349 ; WX 602 ; N scircumflex ; G 287\nU 350 ; WX 602 ; N Scedilla ; G 288\nU 351 ; WX 602 ; N scedilla ; G 289\nU 352 ; WX 602 ; N Scaron ; G 290\nU 353 ; WX 602 ; N scaron ; G 291\nU 354 ; WX 602 ; N Tcommaaccent ; G 292\nU 355 ; WX 602 ; N tcommaaccent ; G 293\nU 356 ; WX 602 ; N Tcaron ; G 294\nU 357 ; WX 602 ; N tcaron ; G 295\nU 358 ; WX 602 ; N Tbar ; G 296\nU 359 ; WX 602 ; N tbar ; G 297\nU 360 ; WX 602 ; N Utilde ; G 298\nU 361 ; WX 602 ; N utilde ; G 299\nU 362 ; WX 602 ; N Umacron ; G 300\nU 363 ; WX 602 ; N umacron ; G 301\nU 364 ; WX 602 ; N Ubreve ; G 302\nU 365 ; WX 602 ; N ubreve ; G 303\nU 366 ; WX 602 ; N Uring ; G 304\nU 367 ; WX 602 ; N uring ; G 305\nU 368 ; WX 602 ; N Uhungarumlaut ; G 306\nU 369 ; WX 602 ; N uhungarumlaut ; G 307\nU 370 ; WX 602 ; N Uogonek ; G 308\nU 371 ; WX 602 ; N uogonek ; G 309\nU 372 ; WX 602 ; N Wcircumflex ; G 310\nU 373 ; WX 602 ; N wcircumflex ; G 311\nU 374 ; WX 602 ; N Ycircumflex ; G 312\nU 375 ; WX 602 ; N ycircumflex ; G 313\nU 376 ; WX 602 ; N Ydieresis ; G 314\nU 377 ; WX 602 ; N Zacute ; G 315\nU 378 ; WX 602 ; N zacute ; G 316\nU 379 ; WX 602 ; N Zdotaccent ; G 317\nU 380 ; WX 602 ; N zdotaccent ; G 318\nU 381 ; WX 602 ; N Zcaron ; G 319\nU 382 ; WX 602 ; N zcaron ; G 320\nU 383 ; WX 602 ; N longs ; G 321\nU 384 ; WX 602 ; N uni0180 ; G 322\nU 385 ; WX 602 ; N uni0181 ; G 323\nU 386 ; WX 602 ; N uni0182 ; G 324\nU 387 ; WX 602 ; N uni0183 ; G 325\nU 388 ; WX 602 ; N uni0184 ; G 326\nU 389 ; WX 602 ; N uni0185 ; G 327\nU 390 ; WX 602 ; N uni0186 ; G 328\nU 391 ; WX 602 ; N uni0187 ; G 329\nU 392 ; WX 602 ; N uni0188 ; G 330\nU 393 ; WX 602 ; N uni0189 ; G 331\nU 394 ; WX 602 ; N uni018A ; G 332\nU 395 ; WX 602 ; N uni018B ; G 333\nU 396 ; WX 602 ; N uni018C ; G 334\nU 397 ; WX 602 ; N uni018D ; G 335\nU 398 ; WX 602 ; N uni018E ; G 336\nU 399 ; WX 602 ; N uni018F ; G 337\nU 400 ; WX 602 ; N uni0190 ; G 338\nU 401 ; WX 602 ; N uni0191 ; G 339\nU 402 ; WX 602 ; N florin ; G 340\nU 403 ; WX 602 ; N uni0193 ; G 341\nU 404 ; WX 602 ; N uni0194 ; G 342\nU 405 ; WX 602 ; N uni0195 ; G 343\nU 406 ; WX 602 ; N uni0196 ; G 344\nU 407 ; WX 602 ; N uni0197 ; G 345\nU 408 ; WX 602 ; N uni0198 ; G 346\nU 409 ; WX 602 ; N uni0199 ; G 347\nU 410 ; WX 602 ; N uni019A ; G 348\nU 411 ; WX 602 ; N uni019B ; G 349\nU 412 ; WX 602 ; N uni019C ; G 350\nU 413 ; WX 602 ; N uni019D ; G 351\nU 414 ; WX 602 ; N uni019E ; G 352\nU 415 ; WX 602 ; N uni019F ; G 353\nU 416 ; WX 602 ; N Ohorn ; G 354\nU 417 ; WX 602 ; N ohorn ; G 355\nU 418 ; WX 602 ; N uni01A2 ; G 356\nU 419 ; WX 602 ; N uni01A3 ; G 357\nU 420 ; WX 602 ; N uni01A4 ; G 358\nU 421 ; WX 602 ; N uni01A5 ; G 359\nU 422 ; WX 602 ; N uni01A6 ; G 360\nU 423 ; WX 602 ; N uni01A7 ; G 361\nU 424 ; WX 602 ; N uni01A8 ; G 362\nU 425 ; WX 602 ; N uni01A9 ; G 363\nU 426 ; WX 602 ; N uni01AA ; G 364\nU 427 ; WX 602 ; N uni01AB ; G 365\nU 428 ; WX 602 ; N uni01AC ; G 366\nU 429 ; WX 602 ; N uni01AD ; G 367\nU 430 ; WX 602 ; N uni01AE ; G 368\nU 431 ; WX 602 ; N Uhorn ; G 369\nU 432 ; WX 602 ; N uhorn ; G 370\nU 433 ; WX 602 ; N uni01B1 ; G 371\nU 434 ; WX 602 ; N uni01B2 ; G 372\nU 435 ; WX 602 ; N uni01B3 ; G 373\nU 436 ; WX 602 ; N uni01B4 ; G 374\nU 437 ; WX 602 ; N uni01B5 ; G 375\nU 438 ; WX 602 ; N uni01B6 ; G 376\nU 439 ; WX 602 ; N uni01B7 ; G 377\nU 440 ; WX 602 ; N uni01B8 ; G 378\nU 441 ; WX 602 ; N uni01B9 ; G 379\nU 442 ; WX 602 ; N uni01BA ; G 380\nU 443 ; WX 602 ; N uni01BB ; G 381\nU 444 ; WX 602 ; N uni01BC ; G 382\nU 445 ; WX 602 ; N uni01BD ; G 383\nU 446 ; WX 602 ; N uni01BE ; G 384\nU 447 ; WX 602 ; N uni01BF ; G 385\nU 448 ; WX 602 ; N uni01C0 ; G 386\nU 449 ; WX 602 ; N uni01C1 ; G 387\nU 450 ; WX 602 ; N uni01C2 ; G 388\nU 451 ; WX 602 ; N uni01C3 ; G 389\nU 461 ; WX 602 ; N uni01CD ; G 390\nU 462 ; WX 602 ; N uni01CE ; G 391\nU 463 ; WX 602 ; N uni01CF ; G 392\nU 464 ; WX 602 ; N uni01D0 ; G 393\nU 465 ; WX 602 ; N uni01D1 ; G 394\nU 466 ; WX 602 ; N uni01D2 ; G 395\nU 467 ; WX 602 ; N uni01D3 ; G 396\nU 468 ; WX 602 ; N uni01D4 ; G 397\nU 469 ; WX 602 ; N uni01D5 ; G 398\nU 470 ; WX 602 ; N uni01D6 ; G 399\nU 471 ; WX 602 ; N uni01D7 ; G 400\nU 472 ; WX 602 ; N uni01D8 ; G 401\nU 473 ; WX 602 ; N uni01D9 ; G 402\nU 474 ; WX 602 ; N uni01DA ; G 403\nU 475 ; WX 602 ; N uni01DB ; G 404\nU 476 ; WX 602 ; N uni01DC ; G 405\nU 477 ; WX 602 ; N uni01DD ; G 406\nU 478 ; WX 602 ; N uni01DE ; G 407\nU 479 ; WX 602 ; N uni01DF ; G 408\nU 480 ; WX 602 ; N uni01E0 ; G 409\nU 481 ; WX 602 ; N uni01E1 ; G 410\nU 482 ; WX 602 ; N uni01E2 ; G 411\nU 483 ; WX 602 ; N uni01E3 ; G 412\nU 486 ; WX 602 ; N Gcaron ; G 413\nU 487 ; WX 602 ; N gcaron ; G 414\nU 488 ; WX 602 ; N uni01E8 ; G 415\nU 489 ; WX 602 ; N uni01E9 ; G 416\nU 490 ; WX 602 ; N uni01EA ; G 417\nU 491 ; WX 602 ; N uni01EB ; G 418\nU 492 ; WX 602 ; N uni01EC ; G 419\nU 493 ; WX 602 ; N uni01ED ; G 420\nU 494 ; WX 602 ; N uni01EE ; G 421\nU 495 ; WX 602 ; N uni01EF ; G 422\nU 496 ; WX 602 ; N uni01F0 ; G 423\nU 500 ; WX 602 ; N uni01F4 ; G 424\nU 501 ; WX 602 ; N uni01F5 ; G 425\nU 502 ; WX 602 ; N uni01F6 ; G 426\nU 504 ; WX 602 ; N uni01F8 ; G 427\nU 505 ; WX 602 ; N uni01F9 ; G 428\nU 508 ; WX 602 ; N AEacute ; G 429\nU 509 ; WX 602 ; N aeacute ; G 430\nU 510 ; WX 602 ; N Oslashacute ; G 431\nU 511 ; WX 602 ; N oslashacute ; G 432\nU 512 ; WX 602 ; N uni0200 ; G 433\nU 513 ; WX 602 ; N uni0201 ; G 434\nU 514 ; WX 602 ; N uni0202 ; G 435\nU 515 ; WX 602 ; N uni0203 ; G 436\nU 516 ; WX 602 ; N uni0204 ; G 437\nU 517 ; WX 602 ; N uni0205 ; G 438\nU 518 ; WX 602 ; N uni0206 ; G 439\nU 519 ; WX 602 ; N uni0207 ; G 440\nU 520 ; WX 602 ; N uni0208 ; G 441\nU 521 ; WX 602 ; N uni0209 ; G 442\nU 522 ; WX 602 ; N uni020A ; G 443\nU 523 ; WX 602 ; N uni020B ; G 444\nU 524 ; WX 602 ; N uni020C ; G 445\nU 525 ; WX 602 ; N uni020D ; G 446\nU 526 ; WX 602 ; N uni020E ; G 447\nU 527 ; WX 602 ; N uni020F ; G 448\nU 528 ; WX 602 ; N uni0210 ; G 449\nU 529 ; WX 602 ; N uni0211 ; G 450\nU 530 ; WX 602 ; N uni0212 ; G 451\nU 531 ; WX 602 ; N uni0213 ; G 452\nU 532 ; WX 602 ; N uni0214 ; G 453\nU 533 ; WX 602 ; N uni0215 ; G 454\nU 534 ; WX 602 ; N uni0216 ; G 455\nU 535 ; WX 602 ; N uni0217 ; G 456\nU 536 ; WX 602 ; N Scommaaccent ; G 457\nU 537 ; WX 602 ; N scommaaccent ; G 458\nU 538 ; WX 602 ; N uni021A ; G 459\nU 539 ; WX 602 ; N uni021B ; G 460\nU 540 ; WX 602 ; N uni021C ; G 461\nU 541 ; WX 602 ; N uni021D ; G 462\nU 542 ; WX 602 ; N uni021E ; G 463\nU 543 ; WX 602 ; N uni021F ; G 464\nU 544 ; WX 602 ; N uni0220 ; G 465\nU 545 ; WX 602 ; N uni0221 ; G 466\nU 548 ; WX 602 ; N uni0224 ; G 467\nU 549 ; WX 602 ; N uni0225 ; G 468\nU 550 ; WX 602 ; N uni0226 ; G 469\nU 551 ; WX 602 ; N uni0227 ; G 470\nU 552 ; WX 602 ; N uni0228 ; G 471\nU 553 ; WX 602 ; N uni0229 ; G 472\nU 554 ; WX 602 ; N uni022A ; G 473\nU 555 ; WX 602 ; N uni022B ; G 474\nU 556 ; WX 602 ; N uni022C ; G 475\nU 557 ; WX 602 ; N uni022D ; G 476\nU 558 ; WX 602 ; N uni022E ; G 477\nU 559 ; WX 602 ; N uni022F ; G 478\nU 560 ; WX 602 ; N uni0230 ; G 479\nU 561 ; WX 602 ; N uni0231 ; G 480\nU 562 ; WX 602 ; N uni0232 ; G 481\nU 563 ; WX 602 ; N uni0233 ; G 482\nU 564 ; WX 602 ; N uni0234 ; G 483\nU 565 ; WX 602 ; N uni0235 ; G 484\nU 566 ; WX 602 ; N uni0236 ; G 485\nU 567 ; WX 602 ; N dotlessj ; G 486\nU 568 ; WX 602 ; N uni0238 ; G 487\nU 569 ; WX 602 ; N uni0239 ; G 488\nU 570 ; WX 602 ; N uni023A ; G 489\nU 571 ; WX 602 ; N uni023B ; G 490\nU 572 ; WX 602 ; N uni023C ; G 491\nU 573 ; WX 602 ; N uni023D ; G 492\nU 574 ; WX 602 ; N uni023E ; G 493\nU 575 ; WX 602 ; N uni023F ; G 494\nU 576 ; WX 602 ; N uni0240 ; G 495\nU 577 ; WX 602 ; N uni0241 ; G 496\nU 579 ; WX 602 ; N uni0243 ; G 497\nU 580 ; WX 602 ; N uni0244 ; G 498\nU 581 ; WX 602 ; N uni0245 ; G 499\nU 588 ; WX 602 ; N uni024C ; G 500\nU 589 ; WX 602 ; N uni024D ; G 501\nU 592 ; WX 602 ; N uni0250 ; G 502\nU 593 ; WX 602 ; N uni0251 ; G 503\nU 594 ; WX 602 ; N uni0252 ; G 504\nU 595 ; WX 602 ; N uni0253 ; G 505\nU 596 ; WX 602 ; N uni0254 ; G 506\nU 597 ; WX 602 ; N uni0255 ; G 507\nU 598 ; WX 602 ; N uni0256 ; G 508\nU 599 ; WX 602 ; N uni0257 ; G 509\nU 600 ; WX 602 ; N uni0258 ; G 510\nU 601 ; WX 602 ; N uni0259 ; G 511\nU 602 ; WX 602 ; N uni025A ; G 512\nU 603 ; WX 602 ; N uni025B ; G 513\nU 604 ; WX 602 ; N uni025C ; G 514\nU 605 ; WX 602 ; N uni025D ; G 515\nU 606 ; WX 602 ; N uni025E ; G 516\nU 607 ; WX 602 ; N uni025F ; G 517\nU 608 ; WX 602 ; N uni0260 ; G 518\nU 609 ; WX 602 ; N uni0261 ; G 519\nU 610 ; WX 602 ; N uni0262 ; G 520\nU 611 ; WX 602 ; N uni0263 ; G 521\nU 612 ; WX 602 ; N uni0264 ; G 522\nU 613 ; WX 602 ; N uni0265 ; G 523\nU 614 ; WX 602 ; N uni0266 ; G 524\nU 615 ; WX 602 ; N uni0267 ; G 525\nU 616 ; WX 602 ; N uni0268 ; G 526\nU 617 ; WX 602 ; N uni0269 ; G 527\nU 618 ; WX 602 ; N uni026A ; G 528\nU 619 ; WX 602 ; N uni026B ; G 529\nU 620 ; WX 602 ; N uni026C ; G 530\nU 621 ; WX 602 ; N uni026D ; G 531\nU 622 ; WX 602 ; N uni026E ; G 532\nU 623 ; WX 602 ; N uni026F ; G 533\nU 624 ; WX 602 ; N uni0270 ; G 534\nU 625 ; WX 602 ; N uni0271 ; G 535\nU 626 ; WX 602 ; N uni0272 ; G 536\nU 627 ; WX 602 ; N uni0273 ; G 537\nU 628 ; WX 602 ; N uni0274 ; G 538\nU 629 ; WX 602 ; N uni0275 ; G 539\nU 630 ; WX 602 ; N uni0276 ; G 540\nU 631 ; WX 602 ; N uni0277 ; G 541\nU 632 ; WX 602 ; N uni0278 ; G 542\nU 633 ; WX 602 ; N uni0279 ; G 543\nU 634 ; WX 602 ; N uni027A ; G 544\nU 635 ; WX 602 ; N uni027B ; G 545\nU 636 ; WX 602 ; N uni027C ; G 546\nU 637 ; WX 602 ; N uni027D ; G 547\nU 638 ; WX 602 ; N uni027E ; G 548\nU 639 ; WX 602 ; N uni027F ; G 549\nU 640 ; WX 602 ; N uni0280 ; G 550\nU 641 ; WX 602 ; N uni0281 ; G 551\nU 642 ; WX 602 ; N uni0282 ; G 552\nU 643 ; WX 602 ; N uni0283 ; G 553\nU 644 ; WX 602 ; N uni0284 ; G 554\nU 645 ; WX 602 ; N uni0285 ; G 555\nU 646 ; WX 602 ; N uni0286 ; G 556\nU 647 ; WX 602 ; N uni0287 ; G 557\nU 648 ; WX 602 ; N uni0288 ; G 558\nU 649 ; WX 602 ; N uni0289 ; G 559\nU 650 ; WX 602 ; N uni028A ; G 560\nU 651 ; WX 602 ; N uni028B ; G 561\nU 652 ; WX 602 ; N uni028C ; G 562\nU 653 ; WX 602 ; N uni028D ; G 563\nU 654 ; WX 602 ; N uni028E ; G 564\nU 655 ; WX 602 ; N uni028F ; G 565\nU 656 ; WX 602 ; N uni0290 ; G 566\nU 657 ; WX 602 ; N uni0291 ; G 567\nU 658 ; WX 602 ; N uni0292 ; G 568\nU 659 ; WX 602 ; N uni0293 ; G 569\nU 660 ; WX 602 ; N uni0294 ; G 570\nU 661 ; WX 602 ; N uni0295 ; G 571\nU 662 ; WX 602 ; N uni0296 ; G 572\nU 663 ; WX 602 ; N uni0297 ; G 573\nU 664 ; WX 602 ; N uni0298 ; G 574\nU 665 ; WX 602 ; N uni0299 ; G 575\nU 666 ; WX 602 ; N uni029A ; G 576\nU 667 ; WX 602 ; N uni029B ; G 577\nU 668 ; WX 602 ; N uni029C ; G 578\nU 669 ; WX 602 ; N uni029D ; G 579\nU 670 ; WX 602 ; N uni029E ; G 580\nU 671 ; WX 602 ; N uni029F ; G 581\nU 672 ; WX 602 ; N uni02A0 ; G 582\nU 673 ; WX 602 ; N uni02A1 ; G 583\nU 674 ; WX 602 ; N uni02A2 ; G 584\nU 675 ; WX 602 ; N uni02A3 ; G 585\nU 676 ; WX 602 ; N uni02A4 ; G 586\nU 677 ; WX 602 ; N uni02A5 ; G 587\nU 678 ; WX 602 ; N uni02A6 ; G 588\nU 679 ; WX 602 ; N uni02A7 ; G 589\nU 680 ; WX 602 ; N uni02A8 ; G 590\nU 681 ; WX 602 ; N uni02A9 ; G 591\nU 682 ; WX 602 ; N uni02AA ; G 592\nU 683 ; WX 602 ; N uni02AB ; G 593\nU 684 ; WX 602 ; N uni02AC ; G 594\nU 685 ; WX 602 ; N uni02AD ; G 595\nU 686 ; WX 602 ; N uni02AE ; G 596\nU 687 ; WX 602 ; N uni02AF ; G 597\nU 688 ; WX 602 ; N uni02B0 ; G 598\nU 689 ; WX 602 ; N uni02B1 ; G 599\nU 690 ; WX 602 ; N uni02B2 ; G 600\nU 691 ; WX 602 ; N uni02B3 ; G 601\nU 692 ; WX 602 ; N uni02B4 ; G 602\nU 693 ; WX 602 ; N uni02B5 ; G 603\nU 694 ; WX 602 ; N uni02B6 ; G 604\nU 695 ; WX 602 ; N uni02B7 ; G 605\nU 696 ; WX 602 ; N uni02B8 ; G 606\nU 697 ; WX 602 ; N uni02B9 ; G 607\nU 699 ; WX 602 ; N uni02BB ; G 608\nU 700 ; WX 602 ; N uni02BC ; G 609\nU 701 ; WX 602 ; N uni02BD ; G 610\nU 702 ; WX 602 ; N uni02BE ; G 611\nU 703 ; WX 602 ; N uni02BF ; G 612\nU 704 ; WX 602 ; N uni02C0 ; G 613\nU 705 ; WX 602 ; N uni02C1 ; G 614\nU 710 ; WX 602 ; N circumflex ; G 615\nU 711 ; WX 602 ; N caron ; G 616\nU 712 ; WX 602 ; N uni02C8 ; G 617\nU 713 ; WX 602 ; N uni02C9 ; G 618\nU 716 ; WX 602 ; N uni02CC ; G 619\nU 717 ; WX 602 ; N uni02CD ; G 620\nU 718 ; WX 602 ; N uni02CE ; G 621\nU 719 ; WX 602 ; N uni02CF ; G 622\nU 720 ; WX 602 ; N uni02D0 ; G 623\nU 721 ; WX 602 ; N uni02D1 ; G 624\nU 722 ; WX 602 ; N uni02D2 ; G 625\nU 723 ; WX 602 ; N uni02D3 ; G 626\nU 726 ; WX 602 ; N uni02D6 ; G 627\nU 727 ; WX 602 ; N uni02D7 ; G 628\nU 728 ; WX 602 ; N breve ; G 629\nU 729 ; WX 602 ; N dotaccent ; G 630\nU 730 ; WX 602 ; N ring ; G 631\nU 731 ; WX 602 ; N ogonek ; G 632\nU 732 ; WX 602 ; N tilde ; G 633\nU 733 ; WX 602 ; N hungarumlaut ; G 634\nU 734 ; WX 602 ; N uni02DE ; G 635\nU 736 ; WX 602 ; N uni02E0 ; G 636\nU 737 ; WX 602 ; N uni02E1 ; G 637\nU 738 ; WX 602 ; N uni02E2 ; G 638\nU 739 ; WX 602 ; N uni02E3 ; G 639\nU 740 ; WX 602 ; N uni02E4 ; G 640\nU 741 ; WX 602 ; N uni02E5 ; G 641\nU 742 ; WX 602 ; N uni02E6 ; G 642\nU 743 ; WX 602 ; N uni02E7 ; G 643\nU 744 ; WX 602 ; N uni02E8 ; G 644\nU 745 ; WX 602 ; N uni02E9 ; G 645\nU 750 ; WX 602 ; N uni02EE ; G 646\nU 755 ; WX 602 ; N uni02F3 ; G 647\nU 768 ; WX 602 ; N gravecomb ; G 648\nU 769 ; WX 602 ; N acutecomb ; G 649\nU 770 ; WX 602 ; N uni0302 ; G 650\nU 771 ; WX 602 ; N tildecomb ; G 651\nU 772 ; WX 602 ; N uni0304 ; G 652\nU 773 ; WX 602 ; N uni0305 ; G 653\nU 774 ; WX 602 ; N uni0306 ; G 654\nU 775 ; WX 602 ; N uni0307 ; G 655\nU 776 ; WX 602 ; N uni0308 ; G 656\nU 777 ; WX 602 ; N hookabovecomb ; G 657\nU 778 ; WX 602 ; N uni030A ; G 658\nU 779 ; WX 602 ; N uni030B ; G 659\nU 780 ; WX 602 ; N uni030C ; G 660\nU 781 ; WX 602 ; N uni030D ; G 661\nU 782 ; WX 602 ; N uni030E ; G 662\nU 783 ; WX 602 ; N uni030F ; G 663\nU 784 ; WX 602 ; N uni0310 ; G 664\nU 785 ; WX 602 ; N uni0311 ; G 665\nU 786 ; WX 602 ; N uni0312 ; G 666\nU 787 ; WX 602 ; N uni0313 ; G 667\nU 788 ; WX 602 ; N uni0314 ; G 668\nU 789 ; WX 602 ; N uni0315 ; G 669\nU 790 ; WX 602 ; N uni0316 ; G 670\nU 791 ; WX 602 ; N uni0317 ; G 671\nU 792 ; WX 602 ; N uni0318 ; G 672\nU 793 ; WX 602 ; N uni0319 ; G 673\nU 794 ; WX 602 ; N uni031A ; G 674\nU 795 ; WX 602 ; N uni031B ; G 675\nU 796 ; WX 602 ; N uni031C ; G 676\nU 797 ; WX 602 ; N uni031D ; G 677\nU 798 ; WX 602 ; N uni031E ; G 678\nU 799 ; WX 602 ; N uni031F ; G 679\nU 800 ; WX 602 ; N uni0320 ; G 680\nU 801 ; WX 602 ; N uni0321 ; G 681\nU 802 ; WX 602 ; N uni0322 ; G 682\nU 803 ; WX 602 ; N dotbelowcomb ; G 683\nU 804 ; WX 602 ; N uni0324 ; G 684\nU 805 ; WX 602 ; N uni0325 ; G 685\nU 806 ; WX 602 ; N uni0326 ; G 686\nU 807 ; WX 602 ; N uni0327 ; G 687\nU 808 ; WX 602 ; N uni0328 ; G 688\nU 809 ; WX 602 ; N uni0329 ; G 689\nU 810 ; WX 602 ; N uni032A ; G 690\nU 811 ; WX 602 ; N uni032B ; G 691\nU 812 ; WX 602 ; N uni032C ; G 692\nU 813 ; WX 602 ; N uni032D ; G 693\nU 814 ; WX 602 ; N uni032E ; G 694\nU 815 ; WX 602 ; N uni032F ; G 695\nU 816 ; WX 602 ; N uni0330 ; G 696\nU 817 ; WX 602 ; N uni0331 ; G 697\nU 818 ; WX 602 ; N uni0332 ; G 698\nU 819 ; WX 602 ; N uni0333 ; G 699\nU 820 ; WX 602 ; N uni0334 ; G 700\nU 821 ; WX 602 ; N uni0335 ; G 701\nU 822 ; WX 602 ; N uni0336 ; G 702\nU 823 ; WX 602 ; N uni0337 ; G 703\nU 824 ; WX 602 ; N uni0338 ; G 704\nU 825 ; WX 602 ; N uni0339 ; G 705\nU 826 ; WX 602 ; N uni033A ; G 706\nU 827 ; WX 602 ; N uni033B ; G 707\nU 828 ; WX 602 ; N uni033C ; G 708\nU 829 ; WX 602 ; N uni033D ; G 709\nU 830 ; WX 602 ; N uni033E ; G 710\nU 831 ; WX 602 ; N uni033F ; G 711\nU 835 ; WX 602 ; N uni0343 ; G 712\nU 856 ; WX 602 ; N uni0358 ; G 713\nU 865 ; WX 602 ; N uni0361 ; G 714\nU 884 ; WX 602 ; N uni0374 ; G 715\nU 885 ; WX 602 ; N uni0375 ; G 716\nU 886 ; WX 602 ; N uni0376 ; G 717\nU 887 ; WX 602 ; N uni0377 ; G 718\nU 890 ; WX 602 ; N uni037A ; G 719\nU 891 ; WX 602 ; N uni037B ; G 720\nU 892 ; WX 602 ; N uni037C ; G 721\nU 893 ; WX 602 ; N uni037D ; G 722\nU 894 ; WX 602 ; N uni037E ; G 723\nU 895 ; WX 602 ; N uni037F ; G 724\nU 900 ; WX 602 ; N tonos ; G 725\nU 901 ; WX 602 ; N dieresistonos ; G 726\nU 902 ; WX 602 ; N Alphatonos ; G 727\nU 903 ; WX 602 ; N anoteleia ; G 728\nU 904 ; WX 602 ; N Epsilontonos ; G 729\nU 905 ; WX 602 ; N Etatonos ; G 730\nU 906 ; WX 602 ; N Iotatonos ; G 731\nU 908 ; WX 602 ; N Omicrontonos ; G 732\nU 910 ; WX 602 ; N Upsilontonos ; G 733\nU 911 ; WX 602 ; N Omegatonos ; G 734\nU 912 ; WX 602 ; N iotadieresistonos ; G 735\nU 913 ; WX 602 ; N Alpha ; G 736\nU 914 ; WX 602 ; N Beta ; G 737\nU 915 ; WX 602 ; N Gamma ; G 738\nU 916 ; WX 602 ; N uni0394 ; G 739\nU 917 ; WX 602 ; N Epsilon ; G 740\nU 918 ; WX 602 ; N Zeta ; G 741\nU 919 ; WX 602 ; N Eta ; G 742\nU 920 ; WX 602 ; N Theta ; G 743\nU 921 ; WX 602 ; N Iota ; G 744\nU 922 ; WX 602 ; N Kappa ; G 745\nU 923 ; WX 602 ; N Lambda ; G 746\nU 924 ; WX 602 ; N Mu ; G 747\nU 925 ; WX 602 ; N Nu ; G 748\nU 926 ; WX 602 ; N Xi ; G 749\nU 927 ; WX 602 ; N Omicron ; G 750\nU 928 ; WX 602 ; N Pi ; G 751\nU 929 ; WX 602 ; N Rho ; G 752\nU 931 ; WX 602 ; N Sigma ; G 753\nU 932 ; WX 602 ; N Tau ; G 754\nU 933 ; WX 602 ; N Upsilon ; G 755\nU 934 ; WX 602 ; N Phi ; G 756\nU 935 ; WX 602 ; N Chi ; G 757\nU 936 ; WX 602 ; N Psi ; G 758\nU 937 ; WX 602 ; N Omega ; G 759\nU 938 ; WX 602 ; N Iotadieresis ; G 760\nU 939 ; WX 602 ; N Upsilondieresis ; G 761\nU 940 ; WX 602 ; N alphatonos ; G 762\nU 941 ; WX 602 ; N epsilontonos ; G 763\nU 942 ; WX 602 ; N etatonos ; G 764\nU 943 ; WX 602 ; N iotatonos ; G 765\nU 944 ; WX 602 ; N upsilondieresistonos ; G 766\nU 945 ; WX 602 ; N alpha ; G 767\nU 946 ; WX 602 ; N beta ; G 768\nU 947 ; WX 602 ; N gamma ; G 769\nU 948 ; WX 602 ; N delta ; G 770\nU 949 ; WX 602 ; N epsilon ; G 771\nU 950 ; WX 602 ; N zeta ; G 772\nU 951 ; WX 602 ; N eta ; G 773\nU 952 ; WX 602 ; N theta ; G 774\nU 953 ; WX 602 ; N iota ; G 775\nU 954 ; WX 602 ; N kappa ; G 776\nU 955 ; WX 602 ; N lambda ; G 777\nU 956 ; WX 602 ; N uni03BC ; G 778\nU 957 ; WX 602 ; N nu ; G 779\nU 958 ; WX 602 ; N xi ; G 780\nU 959 ; WX 602 ; N omicron ; G 781\nU 960 ; WX 602 ; N pi ; G 782\nU 961 ; WX 602 ; N rho ; G 783\nU 962 ; WX 602 ; N sigma1 ; G 784\nU 963 ; WX 602 ; N sigma ; G 785\nU 964 ; WX 602 ; N tau ; G 786\nU 965 ; WX 602 ; N upsilon ; G 787\nU 966 ; WX 602 ; N phi ; G 788\nU 967 ; WX 602 ; N chi ; G 789\nU 968 ; WX 602 ; N psi ; G 790\nU 969 ; WX 602 ; N omega ; G 791\nU 970 ; WX 602 ; N iotadieresis ; G 792\nU 971 ; WX 602 ; N upsilondieresis ; G 793\nU 972 ; WX 602 ; N omicrontonos ; G 794\nU 973 ; WX 602 ; N upsilontonos ; G 795\nU 974 ; WX 602 ; N omegatonos ; G 796\nU 976 ; WX 602 ; N uni03D0 ; G 797\nU 977 ; WX 602 ; N theta1 ; G 798\nU 978 ; WX 602 ; N Upsilon1 ; G 799\nU 979 ; WX 602 ; N uni03D3 ; G 800\nU 980 ; WX 602 ; N uni03D4 ; G 801\nU 981 ; WX 602 ; N phi1 ; G 802\nU 982 ; WX 602 ; N omega1 ; G 803\nU 983 ; WX 602 ; N uni03D7 ; G 804\nU 984 ; WX 602 ; N uni03D8 ; G 805\nU 985 ; WX 602 ; N uni03D9 ; G 806\nU 986 ; WX 602 ; N uni03DA ; G 807\nU 987 ; WX 602 ; N uni03DB ; G 808\nU 988 ; WX 602 ; N uni03DC ; G 809\nU 989 ; WX 602 ; N uni03DD ; G 810\nU 990 ; WX 602 ; N uni03DE ; G 811\nU 991 ; WX 602 ; N uni03DF ; G 812\nU 992 ; WX 602 ; N uni03E0 ; G 813\nU 993 ; WX 602 ; N uni03E1 ; G 814\nU 1008 ; WX 602 ; N uni03F0 ; G 815\nU 1009 ; WX 602 ; N uni03F1 ; G 816\nU 1010 ; WX 602 ; N uni03F2 ; G 817\nU 1011 ; WX 602 ; N uni03F3 ; G 818\nU 1012 ; WX 602 ; N uni03F4 ; G 819\nU 1013 ; WX 602 ; N uni03F5 ; G 820\nU 1014 ; WX 602 ; N uni03F6 ; G 821\nU 1015 ; WX 602 ; N uni03F7 ; G 822\nU 1016 ; WX 602 ; N uni03F8 ; G 823\nU 1017 ; WX 602 ; N uni03F9 ; G 824\nU 1018 ; WX 602 ; N uni03FA ; G 825\nU 1019 ; WX 602 ; N uni03FB ; G 826\nU 1020 ; WX 602 ; N uni03FC ; G 827\nU 1021 ; WX 602 ; N uni03FD ; G 828\nU 1022 ; WX 602 ; N uni03FE ; G 829\nU 1023 ; WX 602 ; N uni03FF ; G 830\nU 1024 ; WX 602 ; N uni0400 ; G 831\nU 1025 ; WX 602 ; N uni0401 ; G 832\nU 1026 ; WX 602 ; N uni0402 ; G 833\nU 1027 ; WX 602 ; N uni0403 ; G 834\nU 1028 ; WX 602 ; N uni0404 ; G 835\nU 1029 ; WX 602 ; N uni0405 ; G 836\nU 1030 ; WX 602 ; N uni0406 ; G 837\nU 1031 ; WX 602 ; N uni0407 ; G 838\nU 1032 ; WX 602 ; N uni0408 ; G 839\nU 1033 ; WX 602 ; N uni0409 ; G 840\nU 1034 ; WX 602 ; N uni040A ; G 841\nU 1035 ; WX 602 ; N uni040B ; G 842\nU 1036 ; WX 602 ; N uni040C ; G 843\nU 1037 ; WX 602 ; N uni040D ; G 844\nU 1038 ; WX 602 ; N uni040E ; G 845\nU 1039 ; WX 602 ; N uni040F ; G 846\nU 1040 ; WX 602 ; N uni0410 ; G 847\nU 1041 ; WX 602 ; N uni0411 ; G 848\nU 1042 ; WX 602 ; N uni0412 ; G 849\nU 1043 ; WX 602 ; N uni0413 ; G 850\nU 1044 ; WX 602 ; N uni0414 ; G 851\nU 1045 ; WX 602 ; N uni0415 ; G 852\nU 1046 ; WX 602 ; N uni0416 ; G 853\nU 1047 ; WX 602 ; N uni0417 ; G 854\nU 1048 ; WX 602 ; N uni0418 ; G 855\nU 1049 ; WX 602 ; N uni0419 ; G 856\nU 1050 ; WX 602 ; N uni041A ; G 857\nU 1051 ; WX 602 ; N uni041B ; G 858\nU 1052 ; WX 602 ; N uni041C ; G 859\nU 1053 ; WX 602 ; N uni041D ; G 860\nU 1054 ; WX 602 ; N uni041E ; G 861\nU 1055 ; WX 602 ; N uni041F ; G 862\nU 1056 ; WX 602 ; N uni0420 ; G 863\nU 1057 ; WX 602 ; N uni0421 ; G 864\nU 1058 ; WX 602 ; N uni0422 ; G 865\nU 1059 ; WX 602 ; N uni0423 ; G 866\nU 1060 ; WX 602 ; N uni0424 ; G 867\nU 1061 ; WX 602 ; N uni0425 ; G 868\nU 1062 ; WX 602 ; N uni0426 ; G 869\nU 1063 ; WX 602 ; N uni0427 ; G 870\nU 1064 ; WX 602 ; N uni0428 ; G 871\nU 1065 ; WX 602 ; N uni0429 ; G 872\nU 1066 ; WX 602 ; N uni042A ; G 873\nU 1067 ; WX 602 ; N uni042B ; G 874\nU 1068 ; WX 602 ; N uni042C ; G 875\nU 1069 ; WX 602 ; N uni042D ; G 876\nU 1070 ; WX 602 ; N uni042E ; G 877\nU 1071 ; WX 602 ; N uni042F ; G 878\nU 1072 ; WX 602 ; N uni0430 ; G 879\nU 1073 ; WX 602 ; N uni0431 ; G 880\nU 1074 ; WX 602 ; N uni0432 ; G 881\nU 1075 ; WX 602 ; N uni0433 ; G 882\nU 1076 ; WX 602 ; N uni0434 ; G 883\nU 1077 ; WX 602 ; N uni0435 ; G 884\nU 1078 ; WX 602 ; N uni0436 ; G 885\nU 1079 ; WX 602 ; N uni0437 ; G 886\nU 1080 ; WX 602 ; N uni0438 ; G 887\nU 1081 ; WX 602 ; N uni0439 ; G 888\nU 1082 ; WX 602 ; N uni043A ; G 889\nU 1083 ; WX 602 ; N uni043B ; G 890\nU 1084 ; WX 602 ; N uni043C ; G 891\nU 1085 ; WX 602 ; N uni043D ; G 892\nU 1086 ; WX 602 ; N uni043E ; G 893\nU 1087 ; WX 602 ; N uni043F ; G 894\nU 1088 ; WX 602 ; N uni0440 ; G 895\nU 1089 ; WX 602 ; N uni0441 ; G 896\nU 1090 ; WX 602 ; N uni0442 ; G 897\nU 1091 ; WX 602 ; N uni0443 ; G 898\nU 1092 ; WX 602 ; N uni0444 ; G 899\nU 1093 ; WX 602 ; N uni0445 ; G 900\nU 1094 ; WX 602 ; N uni0446 ; G 901\nU 1095 ; WX 602 ; N uni0447 ; G 902\nU 1096 ; WX 602 ; N uni0448 ; G 903\nU 1097 ; WX 602 ; N uni0449 ; G 904\nU 1098 ; WX 602 ; N uni044A ; G 905\nU 1099 ; WX 602 ; N uni044B ; G 906\nU 1100 ; WX 602 ; N uni044C ; G 907\nU 1101 ; WX 602 ; N uni044D ; G 908\nU 1102 ; WX 602 ; N uni044E ; G 909\nU 1103 ; WX 602 ; N uni044F ; G 910\nU 1104 ; WX 602 ; N uni0450 ; G 911\nU 1105 ; WX 602 ; N uni0451 ; G 912\nU 1106 ; WX 602 ; N uni0452 ; G 913\nU 1107 ; WX 602 ; N uni0453 ; G 914\nU 1108 ; WX 602 ; N uni0454 ; G 915\nU 1109 ; WX 602 ; N uni0455 ; G 916\nU 1110 ; WX 602 ; N uni0456 ; G 917\nU 1111 ; WX 602 ; N uni0457 ; G 918\nU 1112 ; WX 602 ; N uni0458 ; G 919\nU 1113 ; WX 602 ; N uni0459 ; G 920\nU 1114 ; WX 602 ; N uni045A ; G 921\nU 1115 ; WX 602 ; N uni045B ; G 922\nU 1116 ; WX 602 ; N uni045C ; G 923\nU 1117 ; WX 602 ; N uni045D ; G 924\nU 1118 ; WX 602 ; N uni045E ; G 925\nU 1119 ; WX 602 ; N uni045F ; G 926\nU 1122 ; WX 602 ; N uni0462 ; G 927\nU 1123 ; WX 602 ; N uni0463 ; G 928\nU 1138 ; WX 602 ; N uni0472 ; G 929\nU 1139 ; WX 602 ; N uni0473 ; G 930\nU 1168 ; WX 602 ; N uni0490 ; G 931\nU 1169 ; WX 602 ; N uni0491 ; G 932\nU 1170 ; WX 602 ; N uni0492 ; G 933\nU 1171 ; WX 602 ; N uni0493 ; G 934\nU 1172 ; WX 602 ; N uni0494 ; G 935\nU 1173 ; WX 602 ; N uni0495 ; G 936\nU 1174 ; WX 602 ; N uni0496 ; G 937\nU 1175 ; WX 602 ; N uni0497 ; G 938\nU 1176 ; WX 602 ; N uni0498 ; G 939\nU 1177 ; WX 602 ; N uni0499 ; G 940\nU 1178 ; WX 602 ; N uni049A ; G 941\nU 1179 ; WX 602 ; N uni049B ; G 942\nU 1186 ; WX 602 ; N uni04A2 ; G 943\nU 1187 ; WX 602 ; N uni04A3 ; G 944\nU 1188 ; WX 602 ; N uni04A4 ; G 945\nU 1189 ; WX 602 ; N uni04A5 ; G 946\nU 1194 ; WX 602 ; N uni04AA ; G 947\nU 1195 ; WX 602 ; N uni04AB ; G 948\nU 1196 ; WX 602 ; N uni04AC ; G 949\nU 1197 ; WX 602 ; N uni04AD ; G 950\nU 1198 ; WX 602 ; N uni04AE ; G 951\nU 1199 ; WX 602 ; N uni04AF ; G 952\nU 1200 ; WX 602 ; N uni04B0 ; G 953\nU 1201 ; WX 602 ; N uni04B1 ; G 954\nU 1202 ; WX 602 ; N uni04B2 ; G 955\nU 1203 ; WX 602 ; N uni04B3 ; G 956\nU 1210 ; WX 602 ; N uni04BA ; G 957\nU 1211 ; WX 602 ; N uni04BB ; G 958\nU 1216 ; WX 602 ; N uni04C0 ; G 959\nU 1217 ; WX 602 ; N uni04C1 ; G 960\nU 1218 ; WX 602 ; N uni04C2 ; G 961\nU 1219 ; WX 602 ; N uni04C3 ; G 962\nU 1220 ; WX 602 ; N uni04C4 ; G 963\nU 1223 ; WX 602 ; N uni04C7 ; G 964\nU 1224 ; WX 602 ; N uni04C8 ; G 965\nU 1227 ; WX 602 ; N uni04CB ; G 966\nU 1228 ; WX 602 ; N uni04CC ; G 967\nU 1231 ; WX 602 ; N uni04CF ; G 968\nU 1232 ; WX 602 ; N uni04D0 ; G 969\nU 1233 ; WX 602 ; N uni04D1 ; G 970\nU 1234 ; WX 602 ; N uni04D2 ; G 971\nU 1235 ; WX 602 ; N uni04D3 ; G 972\nU 1236 ; WX 602 ; N uni04D4 ; G 973\nU 1237 ; WX 602 ; N uni04D5 ; G 974\nU 1238 ; WX 602 ; N uni04D6 ; G 975\nU 1239 ; WX 602 ; N uni04D7 ; G 976\nU 1240 ; WX 602 ; N uni04D8 ; G 977\nU 1241 ; WX 602 ; N uni04D9 ; G 978\nU 1242 ; WX 602 ; N uni04DA ; G 979\nU 1243 ; WX 602 ; N uni04DB ; G 980\nU 1244 ; WX 602 ; N uni04DC ; G 981\nU 1245 ; WX 602 ; N uni04DD ; G 982\nU 1246 ; WX 602 ; N uni04DE ; G 983\nU 1247 ; WX 602 ; N uni04DF ; G 984\nU 1248 ; WX 602 ; N uni04E0 ; G 985\nU 1249 ; WX 602 ; N uni04E1 ; G 986\nU 1250 ; WX 602 ; N uni04E2 ; G 987\nU 1251 ; WX 602 ; N uni04E3 ; G 988\nU 1252 ; WX 602 ; N uni04E4 ; G 989\nU 1253 ; WX 602 ; N uni04E5 ; G 990\nU 1254 ; WX 602 ; N uni04E6 ; G 991\nU 1255 ; WX 602 ; N uni04E7 ; G 992\nU 1256 ; WX 602 ; N uni04E8 ; G 993\nU 1257 ; WX 602 ; N uni04E9 ; G 994\nU 1258 ; WX 602 ; N uni04EA ; G 995\nU 1259 ; WX 602 ; N uni04EB ; G 996\nU 1260 ; WX 602 ; N uni04EC ; G 997\nU 1261 ; WX 602 ; N uni04ED ; G 998\nU 1262 ; WX 602 ; N uni04EE ; G 999\nU 1263 ; WX 602 ; N uni04EF ; G 1000\nU 1264 ; WX 602 ; N uni04F0 ; G 1001\nU 1265 ; WX 602 ; N uni04F1 ; G 1002\nU 1266 ; WX 602 ; N uni04F2 ; G 1003\nU 1267 ; WX 602 ; N uni04F3 ; G 1004\nU 1268 ; WX 602 ; N uni04F4 ; G 1005\nU 1269 ; WX 602 ; N uni04F5 ; G 1006\nU 1270 ; WX 602 ; N uni04F6 ; G 1007\nU 1271 ; WX 602 ; N uni04F7 ; G 1008\nU 1272 ; WX 602 ; N uni04F8 ; G 1009\nU 1273 ; WX 602 ; N uni04F9 ; G 1010\nU 1296 ; WX 602 ; N uni0510 ; G 1011\nU 1297 ; WX 602 ; N uni0511 ; G 1012\nU 1306 ; WX 602 ; N uni051A ; G 1013\nU 1307 ; WX 602 ; N uni051B ; G 1014\nU 1308 ; WX 602 ; N uni051C ; G 1015\nU 1309 ; WX 602 ; N uni051D ; G 1016\nU 1329 ; WX 602 ; N uni0531 ; G 1017\nU 1330 ; WX 602 ; N uni0532 ; G 1018\nU 1331 ; WX 602 ; N uni0533 ; G 1019\nU 1332 ; WX 602 ; N uni0534 ; G 1020\nU 1333 ; WX 602 ; N uni0535 ; G 1021\nU 1334 ; WX 602 ; N uni0536 ; G 1022\nU 1335 ; WX 602 ; N uni0537 ; G 1023\nU 1336 ; WX 602 ; N uni0538 ; G 1024\nU 1337 ; WX 602 ; N uni0539 ; G 1025\nU 1338 ; WX 602 ; N uni053A ; G 1026\nU 1339 ; WX 602 ; N uni053B ; G 1027\nU 1340 ; WX 602 ; N uni053C ; G 1028\nU 1341 ; WX 602 ; N uni053D ; G 1029\nU 1342 ; WX 602 ; N uni053E ; G 1030\nU 1343 ; WX 602 ; N uni053F ; G 1031\nU 1344 ; WX 602 ; N uni0540 ; G 1032\nU 1345 ; WX 602 ; N uni0541 ; G 1033\nU 1346 ; WX 602 ; N uni0542 ; G 1034\nU 1347 ; WX 602 ; N uni0543 ; G 1035\nU 1348 ; WX 602 ; N uni0544 ; G 1036\nU 1349 ; WX 602 ; N uni0545 ; G 1037\nU 1350 ; WX 602 ; N uni0546 ; G 1038\nU 1351 ; WX 602 ; N uni0547 ; G 1039\nU 1352 ; WX 602 ; N uni0548 ; G 1040\nU 1353 ; WX 602 ; N uni0549 ; G 1041\nU 1354 ; WX 602 ; N uni054A ; G 1042\nU 1355 ; WX 602 ; N uni054B ; G 1043\nU 1356 ; WX 602 ; N uni054C ; G 1044\nU 1357 ; WX 602 ; N uni054D ; G 1045\nU 1358 ; WX 602 ; N uni054E ; G 1046\nU 1359 ; WX 602 ; N uni054F ; G 1047\nU 1360 ; WX 602 ; N uni0550 ; G 1048\nU 1361 ; WX 602 ; N uni0551 ; G 1049\nU 1362 ; WX 602 ; N uni0552 ; G 1050\nU 1363 ; WX 602 ; N uni0553 ; G 1051\nU 1364 ; WX 602 ; N uni0554 ; G 1052\nU 1365 ; WX 602 ; N uni0555 ; G 1053\nU 1366 ; WX 602 ; N uni0556 ; G 1054\nU 1369 ; WX 602 ; N uni0559 ; G 1055\nU 1370 ; WX 602 ; N uni055A ; G 1056\nU 1371 ; WX 602 ; N uni055B ; G 1057\nU 1372 ; WX 602 ; N uni055C ; G 1058\nU 1373 ; WX 602 ; N uni055D ; G 1059\nU 1374 ; WX 602 ; N uni055E ; G 1060\nU 1375 ; WX 602 ; N uni055F ; G 1061\nU 1377 ; WX 602 ; N uni0561 ; G 1062\nU 1378 ; WX 602 ; N uni0562 ; G 1063\nU 1379 ; WX 602 ; N uni0563 ; G 1064\nU 1380 ; WX 602 ; N uni0564 ; G 1065\nU 1381 ; WX 602 ; N uni0565 ; G 1066\nU 1382 ; WX 602 ; N uni0566 ; G 1067\nU 1383 ; WX 602 ; N uni0567 ; G 1068\nU 1384 ; WX 602 ; N uni0568 ; G 1069\nU 1385 ; WX 602 ; N uni0569 ; G 1070\nU 1386 ; WX 602 ; N uni056A ; G 1071\nU 1387 ; WX 602 ; N uni056B ; G 1072\nU 1388 ; WX 602 ; N uni056C ; G 1073\nU 1389 ; WX 602 ; N uni056D ; G 1074\nU 1390 ; WX 602 ; N uni056E ; G 1075\nU 1391 ; WX 602 ; N uni056F ; G 1076\nU 1392 ; WX 602 ; N uni0570 ; G 1077\nU 1393 ; WX 602 ; N uni0571 ; G 1078\nU 1394 ; WX 602 ; N uni0572 ; G 1079\nU 1395 ; WX 602 ; N uni0573 ; G 1080\nU 1396 ; WX 602 ; N uni0574 ; G 1081\nU 1397 ; WX 602 ; N uni0575 ; G 1082\nU 1398 ; WX 602 ; N uni0576 ; G 1083\nU 1399 ; WX 602 ; N uni0577 ; G 1084\nU 1400 ; WX 602 ; N uni0578 ; G 1085\nU 1401 ; WX 602 ; N uni0579 ; G 1086\nU 1402 ; WX 602 ; N uni057A ; G 1087\nU 1403 ; WX 602 ; N uni057B ; G 1088\nU 1404 ; WX 602 ; N uni057C ; G 1089\nU 1405 ; WX 602 ; N uni057D ; G 1090\nU 1406 ; WX 602 ; N uni057E ; G 1091\nU 1407 ; WX 602 ; N uni057F ; G 1092\nU 1408 ; WX 602 ; N uni0580 ; G 1093\nU 1409 ; WX 602 ; N uni0581 ; G 1094\nU 1410 ; WX 602 ; N uni0582 ; G 1095\nU 1411 ; WX 602 ; N uni0583 ; G 1096\nU 1412 ; WX 602 ; N uni0584 ; G 1097\nU 1413 ; WX 602 ; N uni0585 ; G 1098\nU 1414 ; WX 602 ; N uni0586 ; G 1099\nU 1415 ; WX 602 ; N uni0587 ; G 1100\nU 1417 ; WX 602 ; N uni0589 ; G 1101\nU 1418 ; WX 602 ; N uni058A ; G 1102\nU 1542 ; WX 602 ; N uni0606 ; G 1103\nU 1543 ; WX 602 ; N uni0607 ; G 1104\nU 1545 ; WX 602 ; N uni0609 ; G 1105\nU 1546 ; WX 602 ; N uni060A ; G 1106\nU 1548 ; WX 602 ; N uni060C ; G 1107\nU 1557 ; WX 602 ; N uni0615 ; G 1108\nU 1563 ; WX 602 ; N uni061B ; G 1109\nU 1567 ; WX 602 ; N uni061F ; G 1110\nU 1569 ; WX 602 ; N uni0621 ; G 1111\nU 1570 ; WX 602 ; N uni0622 ; G 1112\nU 1571 ; WX 602 ; N uni0623 ; G 1113\nU 1572 ; WX 602 ; N uni0624 ; G 1114\nU 1573 ; WX 602 ; N uni0625 ; G 1115\nU 1574 ; WX 602 ; N uni0626 ; G 1116\nU 1575 ; WX 602 ; N uni0627 ; G 1117\nU 1576 ; WX 602 ; N uni0628 ; G 1118\nU 1577 ; WX 602 ; N uni0629 ; G 1119\nU 1578 ; WX 602 ; N uni062A ; G 1120\nU 1579 ; WX 602 ; N uni062B ; G 1121\nU 1580 ; WX 602 ; N uni062C ; G 1122\nU 1581 ; WX 602 ; N uni062D ; G 1123\nU 1582 ; WX 602 ; N uni062E ; G 1124\nU 1583 ; WX 602 ; N uni062F ; G 1125\nU 1584 ; WX 602 ; N uni0630 ; G 1126\nU 1585 ; WX 602 ; N uni0631 ; G 1127\nU 1586 ; WX 602 ; N uni0632 ; G 1128\nU 1587 ; WX 602 ; N uni0633 ; G 1129\nU 1588 ; WX 602 ; N uni0634 ; G 1130\nU 1589 ; WX 602 ; N uni0635 ; G 1131\nU 1590 ; WX 602 ; N uni0636 ; G 1132\nU 1591 ; WX 602 ; N uni0637 ; G 1133\nU 1592 ; WX 602 ; N uni0638 ; G 1134\nU 1593 ; WX 602 ; N uni0639 ; G 1135\nU 1594 ; WX 602 ; N uni063A ; G 1136\nU 1600 ; WX 602 ; N uni0640 ; G 1137\nU 1601 ; WX 602 ; N uni0641 ; G 1138\nU 1602 ; WX 602 ; N uni0642 ; G 1139\nU 1603 ; WX 602 ; N uni0643 ; G 1140\nU 1604 ; WX 602 ; N uni0644 ; G 1141\nU 1605 ; WX 602 ; N uni0645 ; G 1142\nU 1606 ; WX 602 ; N uni0646 ; G 1143\nU 1607 ; WX 602 ; N uni0647 ; G 1144\nU 1608 ; WX 602 ; N uni0648 ; G 1145\nU 1609 ; WX 602 ; N uni0649 ; G 1146\nU 1610 ; WX 602 ; N uni064A ; G 1147\nU 1611 ; WX 602 ; N uni064B ; G 1148\nU 1612 ; WX 602 ; N uni064C ; G 1149\nU 1613 ; WX 602 ; N uni064D ; G 1150\nU 1614 ; WX 602 ; N uni064E ; G 1151\nU 1615 ; WX 602 ; N uni064F ; G 1152\nU 1616 ; WX 602 ; N uni0650 ; G 1153\nU 1617 ; WX 602 ; N uni0651 ; G 1154\nU 1618 ; WX 602 ; N uni0652 ; G 1155\nU 1619 ; WX 602 ; N uni0653 ; G 1156\nU 1620 ; WX 602 ; N uni0654 ; G 1157\nU 1621 ; WX 602 ; N uni0655 ; G 1158\nU 1626 ; WX 602 ; N uni065A ; G 1159\nU 1632 ; WX 602 ; N uni0660 ; G 1160\nU 1633 ; WX 602 ; N uni0661 ; G 1161\nU 1634 ; WX 602 ; N uni0662 ; G 1162\nU 1635 ; WX 602 ; N uni0663 ; G 1163\nU 1636 ; WX 602 ; N uni0664 ; G 1164\nU 1637 ; WX 602 ; N uni0665 ; G 1165\nU 1638 ; WX 602 ; N uni0666 ; G 1166\nU 1639 ; WX 602 ; N uni0667 ; G 1167\nU 1640 ; WX 602 ; N uni0668 ; G 1168\nU 1641 ; WX 602 ; N uni0669 ; G 1169\nU 1642 ; WX 602 ; N uni066A ; G 1170\nU 1643 ; WX 602 ; N uni066B ; G 1171\nU 1644 ; WX 602 ; N uni066C ; G 1172\nU 1645 ; WX 602 ; N uni066D ; G 1173\nU 1652 ; WX 602 ; N uni0674 ; G 1174\nU 1657 ; WX 602 ; N uni0679 ; G 1175\nU 1658 ; WX 602 ; N uni067A ; G 1176\nU 1659 ; WX 602 ; N uni067B ; G 1177\nU 1662 ; WX 602 ; N uni067E ; G 1178\nU 1663 ; WX 602 ; N uni067F ; G 1179\nU 1664 ; WX 602 ; N uni0680 ; G 1180\nU 1667 ; WX 602 ; N uni0683 ; G 1181\nU 1668 ; WX 602 ; N uni0684 ; G 1182\nU 1670 ; WX 602 ; N uni0686 ; G 1183\nU 1671 ; WX 602 ; N uni0687 ; G 1184\nU 1681 ; WX 602 ; N uni0691 ; G 1185\nU 1688 ; WX 602 ; N uni0698 ; G 1186\nU 1700 ; WX 602 ; N uni06A4 ; G 1187\nU 1705 ; WX 602 ; N uni06A9 ; G 1188\nU 1711 ; WX 602 ; N uni06AF ; G 1189\nU 1726 ; WX 602 ; N uni06BE ; G 1190\nU 1740 ; WX 602 ; N uni06CC ; G 1191\nU 1776 ; WX 602 ; N uni06F0 ; G 1192\nU 1777 ; WX 602 ; N uni06F1 ; G 1193\nU 1778 ; WX 602 ; N uni06F2 ; G 1194\nU 1779 ; WX 602 ; N uni06F3 ; G 1195\nU 1780 ; WX 602 ; N uni06F4 ; G 1196\nU 1781 ; WX 602 ; N uni06F5 ; G 1197\nU 1782 ; WX 602 ; N uni06F6 ; G 1198\nU 1783 ; WX 602 ; N uni06F7 ; G 1199\nU 1784 ; WX 602 ; N uni06F8 ; G 1200\nU 1785 ; WX 602 ; N uni06F9 ; G 1201\nU 3647 ; WX 602 ; N uni0E3F ; G 1202\nU 3713 ; WX 602 ; N uni0E81 ; G 1203\nU 3714 ; WX 602 ; N uni0E82 ; G 1204\nU 3716 ; WX 602 ; N uni0E84 ; G 1205\nU 3719 ; WX 602 ; N uni0E87 ; G 1206\nU 3720 ; WX 602 ; N uni0E88 ; G 1207\nU 3722 ; WX 602 ; N uni0E8A ; G 1208\nU 3725 ; WX 602 ; N uni0E8D ; G 1209\nU 3732 ; WX 602 ; N uni0E94 ; G 1210\nU 3733 ; WX 602 ; N uni0E95 ; G 1211\nU 3734 ; WX 602 ; N uni0E96 ; G 1212\nU 3735 ; WX 602 ; N uni0E97 ; G 1213\nU 3737 ; WX 602 ; N uni0E99 ; G 1214\nU 3738 ; WX 602 ; N uni0E9A ; G 1215\nU 3739 ; WX 602 ; N uni0E9B ; G 1216\nU 3740 ; WX 602 ; N uni0E9C ; G 1217\nU 3741 ; WX 602 ; N uni0E9D ; G 1218\nU 3742 ; WX 602 ; N uni0E9E ; G 1219\nU 3743 ; WX 602 ; N uni0E9F ; G 1220\nU 3745 ; WX 602 ; N uni0EA1 ; G 1221\nU 3746 ; WX 602 ; N uni0EA2 ; G 1222\nU 3747 ; WX 602 ; N uni0EA3 ; G 1223\nU 3749 ; WX 602 ; N uni0EA5 ; G 1224\nU 3751 ; WX 602 ; N uni0EA7 ; G 1225\nU 3754 ; WX 602 ; N uni0EAA ; G 1226\nU 3755 ; WX 602 ; N uni0EAB ; G 1227\nU 3757 ; WX 602 ; N uni0EAD ; G 1228\nU 3758 ; WX 602 ; N uni0EAE ; G 1229\nU 3759 ; WX 602 ; N uni0EAF ; G 1230\nU 3760 ; WX 602 ; N uni0EB0 ; G 1231\nU 3761 ; WX 602 ; N uni0EB1 ; G 1232\nU 3762 ; WX 602 ; N uni0EB2 ; G 1233\nU 3763 ; WX 602 ; N uni0EB3 ; G 1234\nU 3764 ; WX 602 ; N uni0EB4 ; G 1235\nU 3765 ; WX 602 ; N uni0EB5 ; G 1236\nU 3766 ; WX 602 ; N uni0EB6 ; G 1237\nU 3767 ; WX 602 ; N uni0EB7 ; G 1238\nU 3768 ; WX 602 ; N uni0EB8 ; G 1239\nU 3769 ; WX 602 ; N uni0EB9 ; G 1240\nU 3771 ; WX 602 ; N uni0EBB ; G 1241\nU 3772 ; WX 602 ; N uni0EBC ; G 1242\nU 3784 ; WX 602 ; N uni0EC8 ; G 1243\nU 3785 ; WX 602 ; N uni0EC9 ; G 1244\nU 3786 ; WX 602 ; N uni0ECA ; G 1245\nU 3787 ; WX 602 ; N uni0ECB ; G 1246\nU 3788 ; WX 602 ; N uni0ECC ; G 1247\nU 3789 ; WX 602 ; N uni0ECD ; G 1248\nU 4304 ; WX 602 ; N uni10D0 ; G 1249\nU 4305 ; WX 602 ; N uni10D1 ; G 1250\nU 4306 ; WX 602 ; N uni10D2 ; G 1251\nU 4307 ; WX 602 ; N uni10D3 ; G 1252\nU 4308 ; WX 602 ; N uni10D4 ; G 1253\nU 4309 ; WX 602 ; N uni10D5 ; G 1254\nU 4310 ; WX 602 ; N uni10D6 ; G 1255\nU 4311 ; WX 602 ; N uni10D7 ; G 1256\nU 4312 ; WX 602 ; N uni10D8 ; G 1257\nU 4313 ; WX 602 ; N uni10D9 ; G 1258\nU 4314 ; WX 602 ; N uni10DA ; G 1259\nU 4315 ; WX 602 ; N uni10DB ; G 1260\nU 4316 ; WX 602 ; N uni10DC ; G 1261\nU 4317 ; WX 602 ; N uni10DD ; G 1262\nU 4318 ; WX 602 ; N uni10DE ; G 1263\nU 4319 ; WX 602 ; N uni10DF ; G 1264\nU 4320 ; WX 602 ; N uni10E0 ; G 1265\nU 4321 ; WX 602 ; N uni10E1 ; G 1266\nU 4322 ; WX 602 ; N uni10E2 ; G 1267\nU 4323 ; WX 602 ; N uni10E3 ; G 1268\nU 4324 ; WX 602 ; N uni10E4 ; G 1269\nU 4325 ; WX 602 ; N uni10E5 ; G 1270\nU 4326 ; WX 602 ; N uni10E6 ; G 1271\nU 4327 ; WX 602 ; N uni10E7 ; G 1272\nU 4328 ; WX 602 ; N uni10E8 ; G 1273\nU 4329 ; WX 602 ; N uni10E9 ; G 1274\nU 4330 ; WX 602 ; N uni10EA ; G 1275\nU 4331 ; WX 602 ; N uni10EB ; G 1276\nU 4332 ; WX 602 ; N uni10EC ; G 1277\nU 4333 ; WX 602 ; N uni10ED ; G 1278\nU 4334 ; WX 602 ; N uni10EE ; G 1279\nU 4335 ; WX 602 ; N uni10EF ; G 1280\nU 4336 ; WX 602 ; N uni10F0 ; G 1281\nU 4337 ; WX 602 ; N uni10F1 ; G 1282\nU 4338 ; WX 602 ; N uni10F2 ; G 1283\nU 4339 ; WX 602 ; N uni10F3 ; G 1284\nU 4340 ; WX 602 ; N uni10F4 ; G 1285\nU 4341 ; WX 602 ; N uni10F5 ; G 1286\nU 4342 ; WX 602 ; N uni10F6 ; G 1287\nU 4343 ; WX 602 ; N uni10F7 ; G 1288\nU 4344 ; WX 602 ; N uni10F8 ; G 1289\nU 4345 ; WX 602 ; N uni10F9 ; G 1290\nU 4346 ; WX 602 ; N uni10FA ; G 1291\nU 4347 ; WX 602 ; N uni10FB ; G 1292\nU 4348 ; WX 602 ; N uni10FC ; G 1293\nU 7426 ; WX 602 ; N uni1D02 ; G 1294\nU 7432 ; WX 602 ; N uni1D08 ; G 1295\nU 7433 ; WX 602 ; N uni1D09 ; G 1296\nU 7444 ; WX 602 ; N uni1D14 ; G 1297\nU 7446 ; WX 602 ; N uni1D16 ; G 1298\nU 7447 ; WX 602 ; N uni1D17 ; G 1299\nU 7453 ; WX 602 ; N uni1D1D ; G 1300\nU 7454 ; WX 602 ; N uni1D1E ; G 1301\nU 7455 ; WX 602 ; N uni1D1F ; G 1302\nU 7468 ; WX 602 ; N uni1D2C ; G 1303\nU 7469 ; WX 602 ; N uni1D2D ; G 1304\nU 7470 ; WX 602 ; N uni1D2E ; G 1305\nU 7472 ; WX 602 ; N uni1D30 ; G 1306\nU 7473 ; WX 602 ; N uni1D31 ; G 1307\nU 7474 ; WX 602 ; N uni1D32 ; G 1308\nU 7475 ; WX 602 ; N uni1D33 ; G 1309\nU 7476 ; WX 602 ; N uni1D34 ; G 1310\nU 7477 ; WX 602 ; N uni1D35 ; G 1311\nU 7478 ; WX 602 ; N uni1D36 ; G 1312\nU 7479 ; WX 602 ; N uni1D37 ; G 1313\nU 7480 ; WX 602 ; N uni1D38 ; G 1314\nU 7481 ; WX 602 ; N uni1D39 ; G 1315\nU 7482 ; WX 602 ; N uni1D3A ; G 1316\nU 7483 ; WX 602 ; N uni1D3B ; G 1317\nU 7484 ; WX 602 ; N uni1D3C ; G 1318\nU 7486 ; WX 602 ; N uni1D3E ; G 1319\nU 7487 ; WX 602 ; N uni1D3F ; G 1320\nU 7488 ; WX 602 ; N uni1D40 ; G 1321\nU 7489 ; WX 602 ; N uni1D41 ; G 1322\nU 7490 ; WX 602 ; N uni1D42 ; G 1323\nU 7491 ; WX 602 ; N uni1D43 ; G 1324\nU 7492 ; WX 602 ; N uni1D44 ; G 1325\nU 7493 ; WX 602 ; N uni1D45 ; G 1326\nU 7494 ; WX 602 ; N uni1D46 ; G 1327\nU 7495 ; WX 602 ; N uni1D47 ; G 1328\nU 7496 ; WX 602 ; N uni1D48 ; G 1329\nU 7497 ; WX 602 ; N uni1D49 ; G 1330\nU 7498 ; WX 602 ; N uni1D4A ; G 1331\nU 7499 ; WX 602 ; N uni1D4B ; G 1332\nU 7500 ; WX 602 ; N uni1D4C ; G 1333\nU 7501 ; WX 602 ; N uni1D4D ; G 1334\nU 7502 ; WX 602 ; N uni1D4E ; G 1335\nU 7503 ; WX 602 ; N uni1D4F ; G 1336\nU 7504 ; WX 602 ; N uni1D50 ; G 1337\nU 7505 ; WX 602 ; N uni1D51 ; G 1338\nU 7506 ; WX 602 ; N uni1D52 ; G 1339\nU 7507 ; WX 602 ; N uni1D53 ; G 1340\nU 7508 ; WX 602 ; N uni1D54 ; G 1341\nU 7509 ; WX 602 ; N uni1D55 ; G 1342\nU 7510 ; WX 602 ; N uni1D56 ; G 1343\nU 7511 ; WX 602 ; N uni1D57 ; G 1344\nU 7512 ; WX 602 ; N uni1D58 ; G 1345\nU 7513 ; WX 602 ; N uni1D59 ; G 1346\nU 7514 ; WX 602 ; N uni1D5A ; G 1347\nU 7515 ; WX 602 ; N uni1D5B ; G 1348\nU 7522 ; WX 602 ; N uni1D62 ; G 1349\nU 7523 ; WX 602 ; N uni1D63 ; G 1350\nU 7524 ; WX 602 ; N uni1D64 ; G 1351\nU 7525 ; WX 602 ; N uni1D65 ; G 1352\nU 7543 ; WX 602 ; N uni1D77 ; G 1353\nU 7544 ; WX 602 ; N uni1D78 ; G 1354\nU 7547 ; WX 602 ; N uni1D7B ; G 1355\nU 7557 ; WX 602 ; N uni1D85 ; G 1356\nU 7579 ; WX 602 ; N uni1D9B ; G 1357\nU 7580 ; WX 602 ; N uni1D9C ; G 1358\nU 7581 ; WX 602 ; N uni1D9D ; G 1359\nU 7582 ; WX 602 ; N uni1D9E ; G 1360\nU 7583 ; WX 602 ; N uni1D9F ; G 1361\nU 7584 ; WX 602 ; N uni1DA0 ; G 1362\nU 7585 ; WX 602 ; N uni1DA1 ; G 1363\nU 7586 ; WX 602 ; N uni1DA2 ; G 1364\nU 7587 ; WX 602 ; N uni1DA3 ; G 1365\nU 7588 ; WX 602 ; N uni1DA4 ; G 1366\nU 7589 ; WX 602 ; N uni1DA5 ; G 1367\nU 7590 ; WX 602 ; N uni1DA6 ; G 1368\nU 7591 ; WX 602 ; N uni1DA7 ; G 1369\nU 7592 ; WX 602 ; N uni1DA8 ; G 1370\nU 7593 ; WX 602 ; N uni1DA9 ; G 1371\nU 7594 ; WX 602 ; N uni1DAA ; G 1372\nU 7595 ; WX 602 ; N uni1DAB ; G 1373\nU 7596 ; WX 602 ; N uni1DAC ; G 1374\nU 7597 ; WX 602 ; N uni1DAD ; G 1375\nU 7598 ; WX 602 ; N uni1DAE ; G 1376\nU 7599 ; WX 602 ; N uni1DAF ; G 1377\nU 7600 ; WX 602 ; N uni1DB0 ; G 1378\nU 7601 ; WX 602 ; N uni1DB1 ; G 1379\nU 7602 ; WX 602 ; N uni1DB2 ; G 1380\nU 7603 ; WX 602 ; N uni1DB3 ; G 1381\nU 7604 ; WX 602 ; N uni1DB4 ; G 1382\nU 7605 ; WX 602 ; N uni1DB5 ; G 1383\nU 7606 ; WX 602 ; N uni1DB6 ; G 1384\nU 7607 ; WX 602 ; N uni1DB7 ; G 1385\nU 7609 ; WX 602 ; N uni1DB9 ; G 1386\nU 7610 ; WX 602 ; N uni1DBA ; G 1387\nU 7611 ; WX 602 ; N uni1DBB ; G 1388\nU 7612 ; WX 602 ; N uni1DBC ; G 1389\nU 7613 ; WX 602 ; N uni1DBD ; G 1390\nU 7614 ; WX 602 ; N uni1DBE ; G 1391\nU 7615 ; WX 602 ; N uni1DBF ; G 1392\nU 7680 ; WX 602 ; N uni1E00 ; G 1393\nU 7681 ; WX 602 ; N uni1E01 ; G 1394\nU 7682 ; WX 602 ; N uni1E02 ; G 1395\nU 7683 ; WX 602 ; N uni1E03 ; G 1396\nU 7684 ; WX 602 ; N uni1E04 ; G 1397\nU 7685 ; WX 602 ; N uni1E05 ; G 1398\nU 7686 ; WX 602 ; N uni1E06 ; G 1399\nU 7687 ; WX 602 ; N uni1E07 ; G 1400\nU 7688 ; WX 602 ; N uni1E08 ; G 1401\nU 7689 ; WX 602 ; N uni1E09 ; G 1402\nU 7690 ; WX 602 ; N uni1E0A ; G 1403\nU 7691 ; WX 602 ; N uni1E0B ; G 1404\nU 7692 ; WX 602 ; N uni1E0C ; G 1405\nU 7693 ; WX 602 ; N uni1E0D ; G 1406\nU 7694 ; WX 602 ; N uni1E0E ; G 1407\nU 7695 ; WX 602 ; N uni1E0F ; G 1408\nU 7696 ; WX 602 ; N uni1E10 ; G 1409\nU 7697 ; WX 602 ; N uni1E11 ; G 1410\nU 7698 ; WX 602 ; N uni1E12 ; G 1411\nU 7699 ; WX 602 ; N uni1E13 ; G 1412\nU 7704 ; WX 602 ; N uni1E18 ; G 1413\nU 7705 ; WX 602 ; N uni1E19 ; G 1414\nU 7706 ; WX 602 ; N uni1E1A ; G 1415\nU 7707 ; WX 602 ; N uni1E1B ; G 1416\nU 7708 ; WX 602 ; N uni1E1C ; G 1417\nU 7709 ; WX 602 ; N uni1E1D ; G 1418\nU 7710 ; WX 602 ; N uni1E1E ; G 1419\nU 7711 ; WX 602 ; N uni1E1F ; G 1420\nU 7712 ; WX 602 ; N uni1E20 ; G 1421\nU 7713 ; WX 602 ; N uni1E21 ; G 1422\nU 7714 ; WX 602 ; N uni1E22 ; G 1423\nU 7715 ; WX 602 ; N uni1E23 ; G 1424\nU 7716 ; WX 602 ; N uni1E24 ; G 1425\nU 7717 ; WX 602 ; N uni1E25 ; G 1426\nU 7718 ; WX 602 ; N uni1E26 ; G 1427\nU 7719 ; WX 602 ; N uni1E27 ; G 1428\nU 7720 ; WX 602 ; N uni1E28 ; G 1429\nU 7721 ; WX 602 ; N uni1E29 ; G 1430\nU 7722 ; WX 602 ; N uni1E2A ; G 1431\nU 7723 ; WX 602 ; N uni1E2B ; G 1432\nU 7724 ; WX 602 ; N uni1E2C ; G 1433\nU 7725 ; WX 602 ; N uni1E2D ; G 1434\nU 7728 ; WX 602 ; N uni1E30 ; G 1435\nU 7729 ; WX 602 ; N uni1E31 ; G 1436\nU 7730 ; WX 602 ; N uni1E32 ; G 1437\nU 7731 ; WX 602 ; N uni1E33 ; G 1438\nU 7732 ; WX 602 ; N uni1E34 ; G 1439\nU 7733 ; WX 602 ; N uni1E35 ; G 1440\nU 7734 ; WX 602 ; N uni1E36 ; G 1441\nU 7735 ; WX 602 ; N uni1E37 ; G 1442\nU 7736 ; WX 602 ; N uni1E38 ; G 1443\nU 7737 ; WX 602 ; N uni1E39 ; G 1444\nU 7738 ; WX 602 ; N uni1E3A ; G 1445\nU 7739 ; WX 602 ; N uni1E3B ; G 1446\nU 7740 ; WX 602 ; N uni1E3C ; G 1447\nU 7741 ; WX 602 ; N uni1E3D ; G 1448\nU 7742 ; WX 602 ; N uni1E3E ; G 1449\nU 7743 ; WX 602 ; N uni1E3F ; G 1450\nU 7744 ; WX 602 ; N uni1E40 ; G 1451\nU 7745 ; WX 602 ; N uni1E41 ; G 1452\nU 7746 ; WX 602 ; N uni1E42 ; G 1453\nU 7747 ; WX 602 ; N uni1E43 ; G 1454\nU 7748 ; WX 602 ; N uni1E44 ; G 1455\nU 7749 ; WX 602 ; N uni1E45 ; G 1456\nU 7750 ; WX 602 ; N uni1E46 ; G 1457\nU 7751 ; WX 602 ; N uni1E47 ; G 1458\nU 7752 ; WX 602 ; N uni1E48 ; G 1459\nU 7753 ; WX 602 ; N uni1E49 ; G 1460\nU 7754 ; WX 602 ; N uni1E4A ; G 1461\nU 7755 ; WX 602 ; N uni1E4B ; G 1462\nU 7756 ; WX 602 ; N uni1E4C ; G 1463\nU 7757 ; WX 602 ; N uni1E4D ; G 1464\nU 7764 ; WX 602 ; N uni1E54 ; G 1465\nU 7765 ; WX 602 ; N uni1E55 ; G 1466\nU 7766 ; WX 602 ; N uni1E56 ; G 1467\nU 7767 ; WX 602 ; N uni1E57 ; G 1468\nU 7768 ; WX 602 ; N uni1E58 ; G 1469\nU 7769 ; WX 602 ; N uni1E59 ; G 1470\nU 7770 ; WX 602 ; N uni1E5A ; G 1471\nU 7771 ; WX 602 ; N uni1E5B ; G 1472\nU 7772 ; WX 602 ; N uni1E5C ; G 1473\nU 7773 ; WX 602 ; N uni1E5D ; G 1474\nU 7774 ; WX 602 ; N uni1E5E ; G 1475\nU 7775 ; WX 602 ; N uni1E5F ; G 1476\nU 7776 ; WX 602 ; N uni1E60 ; G 1477\nU 7777 ; WX 602 ; N uni1E61 ; G 1478\nU 7778 ; WX 602 ; N uni1E62 ; G 1479\nU 7779 ; WX 602 ; N uni1E63 ; G 1480\nU 7784 ; WX 602 ; N uni1E68 ; G 1481\nU 7785 ; WX 602 ; N uni1E69 ; G 1482\nU 7786 ; WX 602 ; N uni1E6A ; G 1483\nU 7787 ; WX 602 ; N uni1E6B ; G 1484\nU 7788 ; WX 602 ; N uni1E6C ; G 1485\nU 7789 ; WX 602 ; N uni1E6D ; G 1486\nU 7790 ; WX 602 ; N uni1E6E ; G 1487\nU 7791 ; WX 602 ; N uni1E6F ; G 1488\nU 7792 ; WX 602 ; N uni1E70 ; G 1489\nU 7793 ; WX 602 ; N uni1E71 ; G 1490\nU 7794 ; WX 602 ; N uni1E72 ; G 1491\nU 7795 ; WX 602 ; N uni1E73 ; G 1492\nU 7796 ; WX 602 ; N uni1E74 ; G 1493\nU 7797 ; WX 602 ; N uni1E75 ; G 1494\nU 7798 ; WX 602 ; N uni1E76 ; G 1495\nU 7799 ; WX 602 ; N uni1E77 ; G 1496\nU 7800 ; WX 602 ; N uni1E78 ; G 1497\nU 7801 ; WX 602 ; N uni1E79 ; G 1498\nU 7804 ; WX 602 ; N uni1E7C ; G 1499\nU 7805 ; WX 602 ; N uni1E7D ; G 1500\nU 7806 ; WX 602 ; N uni1E7E ; G 1501\nU 7807 ; WX 602 ; N uni1E7F ; G 1502\nU 7808 ; WX 602 ; N Wgrave ; G 1503\nU 7809 ; WX 602 ; N wgrave ; G 1504\nU 7810 ; WX 602 ; N Wacute ; G 1505\nU 7811 ; WX 602 ; N wacute ; G 1506\nU 7812 ; WX 602 ; N Wdieresis ; G 1507\nU 7813 ; WX 602 ; N wdieresis ; G 1508\nU 7814 ; WX 602 ; N uni1E86 ; G 1509\nU 7815 ; WX 602 ; N uni1E87 ; G 1510\nU 7816 ; WX 602 ; N uni1E88 ; G 1511\nU 7817 ; WX 602 ; N uni1E89 ; G 1512\nU 7818 ; WX 602 ; N uni1E8A ; G 1513\nU 7819 ; WX 602 ; N uni1E8B ; G 1514\nU 7820 ; WX 602 ; N uni1E8C ; G 1515\nU 7821 ; WX 602 ; N uni1E8D ; G 1516\nU 7822 ; WX 602 ; N uni1E8E ; G 1517\nU 7823 ; WX 602 ; N uni1E8F ; G 1518\nU 7824 ; WX 602 ; N uni1E90 ; G 1519\nU 7825 ; WX 602 ; N uni1E91 ; G 1520\nU 7826 ; WX 602 ; N uni1E92 ; G 1521\nU 7827 ; WX 602 ; N uni1E93 ; G 1522\nU 7828 ; WX 602 ; N uni1E94 ; G 1523\nU 7829 ; WX 602 ; N uni1E95 ; G 1524\nU 7830 ; WX 602 ; N uni1E96 ; G 1525\nU 7831 ; WX 602 ; N uni1E97 ; G 1526\nU 7832 ; WX 602 ; N uni1E98 ; G 1527\nU 7833 ; WX 602 ; N uni1E99 ; G 1528\nU 7835 ; WX 602 ; N uni1E9B ; G 1529\nU 7839 ; WX 602 ; N uni1E9F ; G 1530\nU 7840 ; WX 602 ; N uni1EA0 ; G 1531\nU 7841 ; WX 602 ; N uni1EA1 ; G 1532\nU 7852 ; WX 602 ; N uni1EAC ; G 1533\nU 7853 ; WX 602 ; N uni1EAD ; G 1534\nU 7856 ; WX 602 ; N uni1EB0 ; G 1535\nU 7857 ; WX 602 ; N uni1EB1 ; G 1536\nU 7862 ; WX 602 ; N uni1EB6 ; G 1537\nU 7863 ; WX 602 ; N uni1EB7 ; G 1538\nU 7864 ; WX 602 ; N uni1EB8 ; G 1539\nU 7865 ; WX 602 ; N uni1EB9 ; G 1540\nU 7868 ; WX 602 ; N uni1EBC ; G 1541\nU 7869 ; WX 602 ; N uni1EBD ; G 1542\nU 7878 ; WX 602 ; N uni1EC6 ; G 1543\nU 7879 ; WX 602 ; N uni1EC7 ; G 1544\nU 7882 ; WX 602 ; N uni1ECA ; G 1545\nU 7883 ; WX 602 ; N uni1ECB ; G 1546\nU 7884 ; WX 602 ; N uni1ECC ; G 1547\nU 7885 ; WX 602 ; N uni1ECD ; G 1548\nU 7896 ; WX 602 ; N uni1ED8 ; G 1549\nU 7897 ; WX 602 ; N uni1ED9 ; G 1550\nU 7898 ; WX 602 ; N uni1EDA ; G 1551\nU 7899 ; WX 602 ; N uni1EDB ; G 1552\nU 7900 ; WX 602 ; N uni1EDC ; G 1553\nU 7901 ; WX 602 ; N uni1EDD ; G 1554\nU 7904 ; WX 602 ; N uni1EE0 ; G 1555\nU 7905 ; WX 602 ; N uni1EE1 ; G 1556\nU 7906 ; WX 602 ; N uni1EE2 ; G 1557\nU 7907 ; WX 602 ; N uni1EE3 ; G 1558\nU 7908 ; WX 602 ; N uni1EE4 ; G 1559\nU 7909 ; WX 602 ; N uni1EE5 ; G 1560\nU 7912 ; WX 602 ; N uni1EE8 ; G 1561\nU 7913 ; WX 602 ; N uni1EE9 ; G 1562\nU 7914 ; WX 602 ; N uni1EEA ; G 1563\nU 7915 ; WX 602 ; N uni1EEB ; G 1564\nU 7918 ; WX 602 ; N uni1EEE ; G 1565\nU 7919 ; WX 602 ; N uni1EEF ; G 1566\nU 7920 ; WX 602 ; N uni1EF0 ; G 1567\nU 7921 ; WX 602 ; N uni1EF1 ; G 1568\nU 7922 ; WX 602 ; N Ygrave ; G 1569\nU 7923 ; WX 602 ; N ygrave ; G 1570\nU 7924 ; WX 602 ; N uni1EF4 ; G 1571\nU 7925 ; WX 602 ; N uni1EF5 ; G 1572\nU 7928 ; WX 602 ; N uni1EF8 ; G 1573\nU 7929 ; WX 602 ; N uni1EF9 ; G 1574\nU 7936 ; WX 602 ; N uni1F00 ; G 1575\nU 7937 ; WX 602 ; N uni1F01 ; G 1576\nU 7938 ; WX 602 ; N uni1F02 ; G 1577\nU 7939 ; WX 602 ; N uni1F03 ; G 1578\nU 7940 ; WX 602 ; N uni1F04 ; G 1579\nU 7941 ; WX 602 ; N uni1F05 ; G 1580\nU 7942 ; WX 602 ; N uni1F06 ; G 1581\nU 7943 ; WX 602 ; N uni1F07 ; G 1582\nU 7944 ; WX 602 ; N uni1F08 ; G 1583\nU 7945 ; WX 602 ; N uni1F09 ; G 1584\nU 7946 ; WX 602 ; N uni1F0A ; G 1585\nU 7947 ; WX 602 ; N uni1F0B ; G 1586\nU 7948 ; WX 602 ; N uni1F0C ; G 1587\nU 7949 ; WX 602 ; N uni1F0D ; G 1588\nU 7950 ; WX 602 ; N uni1F0E ; G 1589\nU 7951 ; WX 602 ; N uni1F0F ; G 1590\nU 7952 ; WX 602 ; N uni1F10 ; G 1591\nU 7953 ; WX 602 ; N uni1F11 ; G 1592\nU 7954 ; WX 602 ; N uni1F12 ; G 1593\nU 7955 ; WX 602 ; N uni1F13 ; G 1594\nU 7956 ; WX 602 ; N uni1F14 ; G 1595\nU 7957 ; WX 602 ; N uni1F15 ; G 1596\nU 7960 ; WX 602 ; N uni1F18 ; G 1597\nU 7961 ; WX 602 ; N uni1F19 ; G 1598\nU 7962 ; WX 602 ; N uni1F1A ; G 1599\nU 7963 ; WX 602 ; N uni1F1B ; G 1600\nU 7964 ; WX 602 ; N uni1F1C ; G 1601\nU 7965 ; WX 602 ; N uni1F1D ; G 1602\nU 7968 ; WX 602 ; N uni1F20 ; G 1603\nU 7969 ; WX 602 ; N uni1F21 ; G 1604\nU 7970 ; WX 602 ; N uni1F22 ; G 1605\nU 7971 ; WX 602 ; N uni1F23 ; G 1606\nU 7972 ; WX 602 ; N uni1F24 ; G 1607\nU 7973 ; WX 602 ; N uni1F25 ; G 1608\nU 7974 ; WX 602 ; N uni1F26 ; G 1609\nU 7975 ; WX 602 ; N uni1F27 ; G 1610\nU 7976 ; WX 602 ; N uni1F28 ; G 1611\nU 7977 ; WX 602 ; N uni1F29 ; G 1612\nU 7978 ; WX 602 ; N uni1F2A ; G 1613\nU 7979 ; WX 602 ; N uni1F2B ; G 1614\nU 7980 ; WX 602 ; N uni1F2C ; G 1615\nU 7981 ; WX 602 ; N uni1F2D ; G 1616\nU 7982 ; WX 602 ; N uni1F2E ; G 1617\nU 7983 ; WX 602 ; N uni1F2F ; G 1618\nU 7984 ; WX 602 ; N uni1F30 ; G 1619\nU 7985 ; WX 602 ; N uni1F31 ; G 1620\nU 7986 ; WX 602 ; N uni1F32 ; G 1621\nU 7987 ; WX 602 ; N uni1F33 ; G 1622\nU 7988 ; WX 602 ; N uni1F34 ; G 1623\nU 7989 ; WX 602 ; N uni1F35 ; G 1624\nU 7990 ; WX 602 ; N uni1F36 ; G 1625\nU 7991 ; WX 602 ; N uni1F37 ; G 1626\nU 7992 ; WX 602 ; N uni1F38 ; G 1627\nU 7993 ; WX 602 ; N uni1F39 ; G 1628\nU 7994 ; WX 602 ; N uni1F3A ; G 1629\nU 7995 ; WX 602 ; N uni1F3B ; G 1630\nU 7996 ; WX 602 ; N uni1F3C ; G 1631\nU 7997 ; WX 602 ; N uni1F3D ; G 1632\nU 7998 ; WX 602 ; N uni1F3E ; G 1633\nU 7999 ; WX 602 ; N uni1F3F ; G 1634\nU 8000 ; WX 602 ; N uni1F40 ; G 1635\nU 8001 ; WX 602 ; N uni1F41 ; G 1636\nU 8002 ; WX 602 ; N uni1F42 ; G 1637\nU 8003 ; WX 602 ; N uni1F43 ; G 1638\nU 8004 ; WX 602 ; N uni1F44 ; G 1639\nU 8005 ; WX 602 ; N uni1F45 ; G 1640\nU 8008 ; WX 602 ; N uni1F48 ; G 1641\nU 8009 ; WX 602 ; N uni1F49 ; G 1642\nU 8010 ; WX 602 ; N uni1F4A ; G 1643\nU 8011 ; WX 602 ; N uni1F4B ; G 1644\nU 8012 ; WX 602 ; N uni1F4C ; G 1645\nU 8013 ; WX 602 ; N uni1F4D ; G 1646\nU 8016 ; WX 602 ; N uni1F50 ; G 1647\nU 8017 ; WX 602 ; N uni1F51 ; G 1648\nU 8018 ; WX 602 ; N uni1F52 ; G 1649\nU 8019 ; WX 602 ; N uni1F53 ; G 1650\nU 8020 ; WX 602 ; N uni1F54 ; G 1651\nU 8021 ; WX 602 ; N uni1F55 ; G 1652\nU 8022 ; WX 602 ; N uni1F56 ; G 1653\nU 8023 ; WX 602 ; N uni1F57 ; G 1654\nU 8025 ; WX 602 ; N uni1F59 ; G 1655\nU 8027 ; WX 602 ; N uni1F5B ; G 1656\nU 8029 ; WX 602 ; N uni1F5D ; G 1657\nU 8031 ; WX 602 ; N uni1F5F ; G 1658\nU 8032 ; WX 602 ; N uni1F60 ; G 1659\nU 8033 ; WX 602 ; N uni1F61 ; G 1660\nU 8034 ; WX 602 ; N uni1F62 ; G 1661\nU 8035 ; WX 602 ; N uni1F63 ; G 1662\nU 8036 ; WX 602 ; N uni1F64 ; G 1663\nU 8037 ; WX 602 ; N uni1F65 ; G 1664\nU 8038 ; WX 602 ; N uni1F66 ; G 1665\nU 8039 ; WX 602 ; N uni1F67 ; G 1666\nU 8040 ; WX 602 ; N uni1F68 ; G 1667\nU 8041 ; WX 602 ; N uni1F69 ; G 1668\nU 8042 ; WX 602 ; N uni1F6A ; G 1669\nU 8043 ; WX 602 ; N uni1F6B ; G 1670\nU 8044 ; WX 602 ; N uni1F6C ; G 1671\nU 8045 ; WX 602 ; N uni1F6D ; G 1672\nU 8046 ; WX 602 ; N uni1F6E ; G 1673\nU 8047 ; WX 602 ; N uni1F6F ; G 1674\nU 8048 ; WX 602 ; N uni1F70 ; G 1675\nU 8049 ; WX 602 ; N uni1F71 ; G 1676\nU 8050 ; WX 602 ; N uni1F72 ; G 1677\nU 8051 ; WX 602 ; N uni1F73 ; G 1678\nU 8052 ; WX 602 ; N uni1F74 ; G 1679\nU 8053 ; WX 602 ; N uni1F75 ; G 1680\nU 8054 ; WX 602 ; N uni1F76 ; G 1681\nU 8055 ; WX 602 ; N uni1F77 ; G 1682\nU 8056 ; WX 602 ; N uni1F78 ; G 1683\nU 8057 ; WX 602 ; N uni1F79 ; G 1684\nU 8058 ; WX 602 ; N uni1F7A ; G 1685\nU 8059 ; WX 602 ; N uni1F7B ; G 1686\nU 8060 ; WX 602 ; N uni1F7C ; G 1687\nU 8061 ; WX 602 ; N uni1F7D ; G 1688\nU 8064 ; WX 602 ; N uni1F80 ; G 1689\nU 8065 ; WX 602 ; N uni1F81 ; G 1690\nU 8066 ; WX 602 ; N uni1F82 ; G 1691\nU 8067 ; WX 602 ; N uni1F83 ; G 1692\nU 8068 ; WX 602 ; N uni1F84 ; G 1693\nU 8069 ; WX 602 ; N uni1F85 ; G 1694\nU 8070 ; WX 602 ; N uni1F86 ; G 1695\nU 8071 ; WX 602 ; N uni1F87 ; G 1696\nU 8072 ; WX 602 ; N uni1F88 ; G 1697\nU 8073 ; WX 602 ; N uni1F89 ; G 1698\nU 8074 ; WX 602 ; N uni1F8A ; G 1699\nU 8075 ; WX 602 ; N uni1F8B ; G 1700\nU 8076 ; WX 602 ; N uni1F8C ; G 1701\nU 8077 ; WX 602 ; N uni1F8D ; G 1702\nU 8078 ; WX 602 ; N uni1F8E ; G 1703\nU 8079 ; WX 602 ; N uni1F8F ; G 1704\nU 8080 ; WX 602 ; N uni1F90 ; G 1705\nU 8081 ; WX 602 ; N uni1F91 ; G 1706\nU 8082 ; WX 602 ; N uni1F92 ; G 1707\nU 8083 ; WX 602 ; N uni1F93 ; G 1708\nU 8084 ; WX 602 ; N uni1F94 ; G 1709\nU 8085 ; WX 602 ; N uni1F95 ; G 1710\nU 8086 ; WX 602 ; N uni1F96 ; G 1711\nU 8087 ; WX 602 ; N uni1F97 ; G 1712\nU 8088 ; WX 602 ; N uni1F98 ; G 1713\nU 8089 ; WX 602 ; N uni1F99 ; G 1714\nU 8090 ; WX 602 ; N uni1F9A ; G 1715\nU 8091 ; WX 602 ; N uni1F9B ; G 1716\nU 8092 ; WX 602 ; N uni1F9C ; G 1717\nU 8093 ; WX 602 ; N uni1F9D ; G 1718\nU 8094 ; WX 602 ; N uni1F9E ; G 1719\nU 8095 ; WX 602 ; N uni1F9F ; G 1720\nU 8096 ; WX 602 ; N uni1FA0 ; G 1721\nU 8097 ; WX 602 ; N uni1FA1 ; G 1722\nU 8098 ; WX 602 ; N uni1FA2 ; G 1723\nU 8099 ; WX 602 ; N uni1FA3 ; G 1724\nU 8100 ; WX 602 ; N uni1FA4 ; G 1725\nU 8101 ; WX 602 ; N uni1FA5 ; G 1726\nU 8102 ; WX 602 ; N uni1FA6 ; G 1727\nU 8103 ; WX 602 ; N uni1FA7 ; G 1728\nU 8104 ; WX 602 ; N uni1FA8 ; G 1729\nU 8105 ; WX 602 ; N uni1FA9 ; G 1730\nU 8106 ; WX 602 ; N uni1FAA ; G 1731\nU 8107 ; WX 602 ; N uni1FAB ; G 1732\nU 8108 ; WX 602 ; N uni1FAC ; G 1733\nU 8109 ; WX 602 ; N uni1FAD ; G 1734\nU 8110 ; WX 602 ; N uni1FAE ; G 1735\nU 8111 ; WX 602 ; N uni1FAF ; G 1736\nU 8112 ; WX 602 ; N uni1FB0 ; G 1737\nU 8113 ; WX 602 ; N uni1FB1 ; G 1738\nU 8114 ; WX 602 ; N uni1FB2 ; G 1739\nU 8115 ; WX 602 ; N uni1FB3 ; G 1740\nU 8116 ; WX 602 ; N uni1FB4 ; G 1741\nU 8118 ; WX 602 ; N uni1FB6 ; G 1742\nU 8119 ; WX 602 ; N uni1FB7 ; G 1743\nU 8120 ; WX 602 ; N uni1FB8 ; G 1744\nU 8121 ; WX 602 ; N uni1FB9 ; G 1745\nU 8122 ; WX 602 ; N uni1FBA ; G 1746\nU 8123 ; WX 602 ; N uni1FBB ; G 1747\nU 8124 ; WX 602 ; N uni1FBC ; G 1748\nU 8125 ; WX 602 ; N uni1FBD ; G 1749\nU 8126 ; WX 602 ; N uni1FBE ; G 1750\nU 8127 ; WX 602 ; N uni1FBF ; G 1751\nU 8128 ; WX 602 ; N uni1FC0 ; G 1752\nU 8129 ; WX 602 ; N uni1FC1 ; G 1753\nU 8130 ; WX 602 ; N uni1FC2 ; G 1754\nU 8131 ; WX 602 ; N uni1FC3 ; G 1755\nU 8132 ; WX 602 ; N uni1FC4 ; G 1756\nU 8134 ; WX 602 ; N uni1FC6 ; G 1757\nU 8135 ; WX 602 ; N uni1FC7 ; G 1758\nU 8136 ; WX 602 ; N uni1FC8 ; G 1759\nU 8137 ; WX 602 ; N uni1FC9 ; G 1760\nU 8138 ; WX 602 ; N uni1FCA ; G 1761\nU 8139 ; WX 602 ; N uni1FCB ; G 1762\nU 8140 ; WX 602 ; N uni1FCC ; G 1763\nU 8141 ; WX 602 ; N uni1FCD ; G 1764\nU 8142 ; WX 602 ; N uni1FCE ; G 1765\nU 8143 ; WX 602 ; N uni1FCF ; G 1766\nU 8144 ; WX 602 ; N uni1FD0 ; G 1767\nU 8145 ; WX 602 ; N uni1FD1 ; G 1768\nU 8146 ; WX 602 ; N uni1FD2 ; G 1769\nU 8147 ; WX 602 ; N uni1FD3 ; G 1770\nU 8150 ; WX 602 ; N uni1FD6 ; G 1771\nU 8151 ; WX 602 ; N uni1FD7 ; G 1772\nU 8152 ; WX 602 ; N uni1FD8 ; G 1773\nU 8153 ; WX 602 ; N uni1FD9 ; G 1774\nU 8154 ; WX 602 ; N uni1FDA ; G 1775\nU 8155 ; WX 602 ; N uni1FDB ; G 1776\nU 8157 ; WX 602 ; N uni1FDD ; G 1777\nU 8158 ; WX 602 ; N uni1FDE ; G 1778\nU 8159 ; WX 602 ; N uni1FDF ; G 1779\nU 8160 ; WX 602 ; N uni1FE0 ; G 1780\nU 8161 ; WX 602 ; N uni1FE1 ; G 1781\nU 8162 ; WX 602 ; N uni1FE2 ; G 1782\nU 8163 ; WX 602 ; N uni1FE3 ; G 1783\nU 8164 ; WX 602 ; N uni1FE4 ; G 1784\nU 8165 ; WX 602 ; N uni1FE5 ; G 1785\nU 8166 ; WX 602 ; N uni1FE6 ; G 1786\nU 8167 ; WX 602 ; N uni1FE7 ; G 1787\nU 8168 ; WX 602 ; N uni1FE8 ; G 1788\nU 8169 ; WX 602 ; N uni1FE9 ; G 1789\nU 8170 ; WX 602 ; N uni1FEA ; G 1790\nU 8171 ; WX 602 ; N uni1FEB ; G 1791\nU 8172 ; WX 602 ; N uni1FEC ; G 1792\nU 8173 ; WX 602 ; N uni1FED ; G 1793\nU 8174 ; WX 602 ; N uni1FEE ; G 1794\nU 8175 ; WX 602 ; N uni1FEF ; G 1795\nU 8178 ; WX 602 ; N uni1FF2 ; G 1796\nU 8179 ; WX 602 ; N uni1FF3 ; G 1797\nU 8180 ; WX 602 ; N uni1FF4 ; G 1798\nU 8182 ; WX 602 ; N uni1FF6 ; G 1799\nU 8183 ; WX 602 ; N uni1FF7 ; G 1800\nU 8184 ; WX 602 ; N uni1FF8 ; G 1801\nU 8185 ; WX 602 ; N uni1FF9 ; G 1802\nU 8186 ; WX 602 ; N uni1FFA ; G 1803\nU 8187 ; WX 602 ; N uni1FFB ; G 1804\nU 8188 ; WX 602 ; N uni1FFC ; G 1805\nU 8189 ; WX 602 ; N uni1FFD ; G 1806\nU 8190 ; WX 602 ; N uni1FFE ; G 1807\nU 8192 ; WX 602 ; N uni2000 ; G 1808\nU 8193 ; WX 602 ; N uni2001 ; G 1809\nU 8194 ; WX 602 ; N uni2002 ; G 1810\nU 8195 ; WX 602 ; N uni2003 ; G 1811\nU 8196 ; WX 602 ; N uni2004 ; G 1812\nU 8197 ; WX 602 ; N uni2005 ; G 1813\nU 8198 ; WX 602 ; N uni2006 ; G 1814\nU 8199 ; WX 602 ; N uni2007 ; G 1815\nU 8200 ; WX 602 ; N uni2008 ; G 1816\nU 8201 ; WX 602 ; N uni2009 ; G 1817\nU 8202 ; WX 602 ; N uni200A ; G 1818\nU 8208 ; WX 602 ; N uni2010 ; G 1819\nU 8209 ; WX 602 ; N uni2011 ; G 1820\nU 8210 ; WX 602 ; N figuredash ; G 1821\nU 8211 ; WX 602 ; N endash ; G 1822\nU 8212 ; WX 602 ; N emdash ; G 1823\nU 8213 ; WX 602 ; N uni2015 ; G 1824\nU 8214 ; WX 602 ; N uni2016 ; G 1825\nU 8215 ; WX 602 ; N underscoredbl ; G 1826\nU 8216 ; WX 602 ; N quoteleft ; G 1827\nU 8217 ; WX 602 ; N quoteright ; G 1828\nU 8218 ; WX 602 ; N quotesinglbase ; G 1829\nU 8219 ; WX 602 ; N quotereversed ; G 1830\nU 8220 ; WX 602 ; N quotedblleft ; G 1831\nU 8221 ; WX 602 ; N quotedblright ; G 1832\nU 8222 ; WX 602 ; N quotedblbase ; G 1833\nU 8223 ; WX 602 ; N uni201F ; G 1834\nU 8224 ; WX 602 ; N dagger ; G 1835\nU 8225 ; WX 602 ; N daggerdbl ; G 1836\nU 8226 ; WX 602 ; N bullet ; G 1837\nU 8227 ; WX 602 ; N uni2023 ; G 1838\nU 8230 ; WX 602 ; N ellipsis ; G 1839\nU 8239 ; WX 602 ; N uni202F ; G 1840\nU 8240 ; WX 602 ; N perthousand ; G 1841\nU 8241 ; WX 602 ; N uni2031 ; G 1842\nU 8242 ; WX 602 ; N minute ; G 1843\nU 8243 ; WX 602 ; N second ; G 1844\nU 8244 ; WX 602 ; N uni2034 ; G 1845\nU 8245 ; WX 602 ; N uni2035 ; G 1846\nU 8246 ; WX 602 ; N uni2036 ; G 1847\nU 8247 ; WX 602 ; N uni2037 ; G 1848\nU 8249 ; WX 602 ; N guilsinglleft ; G 1849\nU 8250 ; WX 602 ; N guilsinglright ; G 1850\nU 8252 ; WX 602 ; N exclamdbl ; G 1851\nU 8253 ; WX 602 ; N uni203D ; G 1852\nU 8254 ; WX 602 ; N uni203E ; G 1853\nU 8255 ; WX 602 ; N uni203F ; G 1854\nU 8261 ; WX 602 ; N uni2045 ; G 1855\nU 8262 ; WX 602 ; N uni2046 ; G 1856\nU 8263 ; WX 602 ; N uni2047 ; G 1857\nU 8264 ; WX 602 ; N uni2048 ; G 1858\nU 8265 ; WX 602 ; N uni2049 ; G 1859\nU 8267 ; WX 602 ; N uni204B ; G 1860\nU 8287 ; WX 602 ; N uni205F ; G 1861\nU 8304 ; WX 602 ; N uni2070 ; G 1862\nU 8305 ; WX 602 ; N uni2071 ; G 1863\nU 8308 ; WX 602 ; N uni2074 ; G 1864\nU 8309 ; WX 602 ; N uni2075 ; G 1865\nU 8310 ; WX 602 ; N uni2076 ; G 1866\nU 8311 ; WX 602 ; N uni2077 ; G 1867\nU 8312 ; WX 602 ; N uni2078 ; G 1868\nU 8313 ; WX 602 ; N uni2079 ; G 1869\nU 8314 ; WX 602 ; N uni207A ; G 1870\nU 8315 ; WX 602 ; N uni207B ; G 1871\nU 8316 ; WX 602 ; N uni207C ; G 1872\nU 8317 ; WX 602 ; N uni207D ; G 1873\nU 8318 ; WX 602 ; N uni207E ; G 1874\nU 8319 ; WX 602 ; N uni207F ; G 1875\nU 8320 ; WX 602 ; N uni2080 ; G 1876\nU 8321 ; WX 602 ; N uni2081 ; G 1877\nU 8322 ; WX 602 ; N uni2082 ; G 1878\nU 8323 ; WX 602 ; N uni2083 ; G 1879\nU 8324 ; WX 602 ; N uni2084 ; G 1880\nU 8325 ; WX 602 ; N uni2085 ; G 1881\nU 8326 ; WX 602 ; N uni2086 ; G 1882\nU 8327 ; WX 602 ; N uni2087 ; G 1883\nU 8328 ; WX 602 ; N uni2088 ; G 1884\nU 8329 ; WX 602 ; N uni2089 ; G 1885\nU 8330 ; WX 602 ; N uni208A ; G 1886\nU 8331 ; WX 602 ; N uni208B ; G 1887\nU 8332 ; WX 602 ; N uni208C ; G 1888\nU 8333 ; WX 602 ; N uni208D ; G 1889\nU 8334 ; WX 602 ; N uni208E ; G 1890\nU 8336 ; WX 602 ; N uni2090 ; G 1891\nU 8337 ; WX 602 ; N uni2091 ; G 1892\nU 8338 ; WX 602 ; N uni2092 ; G 1893\nU 8339 ; WX 602 ; N uni2093 ; G 1894\nU 8340 ; WX 602 ; N uni2094 ; G 1895\nU 8341 ; WX 602 ; N uni2095 ; G 1896\nU 8342 ; WX 602 ; N uni2096 ; G 1897\nU 8343 ; WX 602 ; N uni2097 ; G 1898\nU 8344 ; WX 602 ; N uni2098 ; G 1899\nU 8345 ; WX 602 ; N uni2099 ; G 1900\nU 8346 ; WX 602 ; N uni209A ; G 1901\nU 8347 ; WX 602 ; N uni209B ; G 1902\nU 8348 ; WX 602 ; N uni209C ; G 1903\nU 8352 ; WX 602 ; N uni20A0 ; G 1904\nU 8353 ; WX 602 ; N colonmonetary ; G 1905\nU 8354 ; WX 602 ; N uni20A2 ; G 1906\nU 8355 ; WX 602 ; N franc ; G 1907\nU 8356 ; WX 602 ; N lira ; G 1908\nU 8357 ; WX 602 ; N uni20A5 ; G 1909\nU 8358 ; WX 602 ; N uni20A6 ; G 1910\nU 8359 ; WX 602 ; N peseta ; G 1911\nU 8360 ; WX 602 ; N uni20A8 ; G 1912\nU 8361 ; WX 602 ; N uni20A9 ; G 1913\nU 8362 ; WX 602 ; N uni20AA ; G 1914\nU 8363 ; WX 602 ; N dong ; G 1915\nU 8364 ; WX 602 ; N Euro ; G 1916\nU 8365 ; WX 602 ; N uni20AD ; G 1917\nU 8366 ; WX 602 ; N uni20AE ; G 1918\nU 8367 ; WX 602 ; N uni20AF ; G 1919\nU 8368 ; WX 602 ; N uni20B0 ; G 1920\nU 8369 ; WX 602 ; N uni20B1 ; G 1921\nU 8370 ; WX 602 ; N uni20B2 ; G 1922\nU 8371 ; WX 602 ; N uni20B3 ; G 1923\nU 8372 ; WX 602 ; N uni20B4 ; G 1924\nU 8373 ; WX 602 ; N uni20B5 ; G 1925\nU 8376 ; WX 602 ; N uni20B8 ; G 1926\nU 8377 ; WX 602 ; N uni20B9 ; G 1927\nU 8378 ; WX 602 ; N uni20BA ; G 1928\nU 8381 ; WX 602 ; N uni20BD ; G 1929\nU 8450 ; WX 602 ; N uni2102 ; G 1930\nU 8453 ; WX 602 ; N uni2105 ; G 1931\nU 8461 ; WX 602 ; N uni210D ; G 1932\nU 8462 ; WX 602 ; N uni210E ; G 1933\nU 8463 ; WX 602 ; N uni210F ; G 1934\nU 8469 ; WX 602 ; N uni2115 ; G 1935\nU 8470 ; WX 602 ; N uni2116 ; G 1936\nU 8471 ; WX 602 ; N uni2117 ; G 1937\nU 8473 ; WX 602 ; N uni2119 ; G 1938\nU 8474 ; WX 602 ; N uni211A ; G 1939\nU 8477 ; WX 602 ; N uni211D ; G 1940\nU 8482 ; WX 602 ; N trademark ; G 1941\nU 8484 ; WX 602 ; N uni2124 ; G 1942\nU 8486 ; WX 602 ; N uni2126 ; G 1943\nU 8490 ; WX 602 ; N uni212A ; G 1944\nU 8491 ; WX 602 ; N uni212B ; G 1945\nU 8494 ; WX 602 ; N estimated ; G 1946\nU 8520 ; WX 602 ; N uni2148 ; G 1947\nU 8528 ; WX 602 ; N uni2150 ; G 1948\nU 8529 ; WX 602 ; N uni2151 ; G 1949\nU 8531 ; WX 602 ; N onethird ; G 1950\nU 8532 ; WX 602 ; N twothirds ; G 1951\nU 8533 ; WX 602 ; N uni2155 ; G 1952\nU 8534 ; WX 602 ; N uni2156 ; G 1953\nU 8535 ; WX 602 ; N uni2157 ; G 1954\nU 8536 ; WX 602 ; N uni2158 ; G 1955\nU 8537 ; WX 602 ; N uni2159 ; G 1956\nU 8538 ; WX 602 ; N uni215A ; G 1957\nU 8539 ; WX 602 ; N oneeighth ; G 1958\nU 8540 ; WX 602 ; N threeeighths ; G 1959\nU 8541 ; WX 602 ; N fiveeighths ; G 1960\nU 8542 ; WX 602 ; N seveneighths ; G 1961\nU 8543 ; WX 602 ; N uni215F ; G 1962\nU 8585 ; WX 602 ; N uni2189 ; G 1963\nU 8592 ; WX 602 ; N arrowleft ; G 1964\nU 8593 ; WX 602 ; N arrowup ; G 1965\nU 8594 ; WX 602 ; N arrowright ; G 1966\nU 8595 ; WX 602 ; N arrowdown ; G 1967\nU 8596 ; WX 602 ; N arrowboth ; G 1968\nU 8597 ; WX 602 ; N arrowupdn ; G 1969\nU 8598 ; WX 602 ; N uni2196 ; G 1970\nU 8599 ; WX 602 ; N uni2197 ; G 1971\nU 8600 ; WX 602 ; N uni2198 ; G 1972\nU 8601 ; WX 602 ; N uni2199 ; G 1973\nU 8602 ; WX 602 ; N uni219A ; G 1974\nU 8603 ; WX 602 ; N uni219B ; G 1975\nU 8604 ; WX 602 ; N uni219C ; G 1976\nU 8605 ; WX 602 ; N uni219D ; G 1977\nU 8606 ; WX 602 ; N uni219E ; G 1978\nU 8607 ; WX 602 ; N uni219F ; G 1979\nU 8608 ; WX 602 ; N uni21A0 ; G 1980\nU 8609 ; WX 602 ; N uni21A1 ; G 1981\nU 8610 ; WX 602 ; N uni21A2 ; G 1982\nU 8611 ; WX 602 ; N uni21A3 ; G 1983\nU 8612 ; WX 602 ; N uni21A4 ; G 1984\nU 8613 ; WX 602 ; N uni21A5 ; G 1985\nU 8614 ; WX 602 ; N uni21A6 ; G 1986\nU 8615 ; WX 602 ; N uni21A7 ; G 1987\nU 8616 ; WX 602 ; N arrowupdnbse ; G 1988\nU 8617 ; WX 602 ; N uni21A9 ; G 1989\nU 8618 ; WX 602 ; N uni21AA ; G 1990\nU 8619 ; WX 602 ; N uni21AB ; G 1991\nU 8620 ; WX 602 ; N uni21AC ; G 1992\nU 8621 ; WX 602 ; N uni21AD ; G 1993\nU 8622 ; WX 602 ; N uni21AE ; G 1994\nU 8623 ; WX 602 ; N uni21AF ; G 1995\nU 8624 ; WX 602 ; N uni21B0 ; G 1996\nU 8625 ; WX 602 ; N uni21B1 ; G 1997\nU 8626 ; WX 602 ; N uni21B2 ; G 1998\nU 8627 ; WX 602 ; N uni21B3 ; G 1999\nU 8628 ; WX 602 ; N uni21B4 ; G 2000\nU 8629 ; WX 602 ; N carriagereturn ; G 2001\nU 8630 ; WX 602 ; N uni21B6 ; G 2002\nU 8631 ; WX 602 ; N uni21B7 ; G 2003\nU 8632 ; WX 602 ; N uni21B8 ; G 2004\nU 8633 ; WX 602 ; N uni21B9 ; G 2005\nU 8634 ; WX 602 ; N uni21BA ; G 2006\nU 8635 ; WX 602 ; N uni21BB ; G 2007\nU 8636 ; WX 602 ; N uni21BC ; G 2008\nU 8637 ; WX 602 ; N uni21BD ; G 2009\nU 8638 ; WX 602 ; N uni21BE ; G 2010\nU 8639 ; WX 602 ; N uni21BF ; G 2011\nU 8640 ; WX 602 ; N uni21C0 ; G 2012\nU 8641 ; WX 602 ; N uni21C1 ; G 2013\nU 8642 ; WX 602 ; N uni21C2 ; G 2014\nU 8643 ; WX 602 ; N uni21C3 ; G 2015\nU 8644 ; WX 602 ; N uni21C4 ; G 2016\nU 8645 ; WX 602 ; N uni21C5 ; G 2017\nU 8646 ; WX 602 ; N uni21C6 ; G 2018\nU 8647 ; WX 602 ; N uni21C7 ; G 2019\nU 8648 ; WX 602 ; N uni21C8 ; G 2020\nU 8649 ; WX 602 ; N uni21C9 ; G 2021\nU 8650 ; WX 602 ; N uni21CA ; G 2022\nU 8651 ; WX 602 ; N uni21CB ; G 2023\nU 8652 ; WX 602 ; N uni21CC ; G 2024\nU 8653 ; WX 602 ; N uni21CD ; G 2025\nU 8654 ; WX 602 ; N uni21CE ; G 2026\nU 8655 ; WX 602 ; N uni21CF ; G 2027\nU 8656 ; WX 602 ; N arrowdblleft ; G 2028\nU 8657 ; WX 602 ; N arrowdblup ; G 2029\nU 8658 ; WX 602 ; N arrowdblright ; G 2030\nU 8659 ; WX 602 ; N arrowdbldown ; G 2031\nU 8660 ; WX 602 ; N arrowdblboth ; G 2032\nU 8661 ; WX 602 ; N uni21D5 ; G 2033\nU 8662 ; WX 602 ; N uni21D6 ; G 2034\nU 8663 ; WX 602 ; N uni21D7 ; G 2035\nU 8664 ; WX 602 ; N uni21D8 ; G 2036\nU 8665 ; WX 602 ; N uni21D9 ; G 2037\nU 8666 ; WX 602 ; N uni21DA ; G 2038\nU 8667 ; WX 602 ; N uni21DB ; G 2039\nU 8668 ; WX 602 ; N uni21DC ; G 2040\nU 8669 ; WX 602 ; N uni21DD ; G 2041\nU 8670 ; WX 602 ; N uni21DE ; G 2042\nU 8671 ; WX 602 ; N uni21DF ; G 2043\nU 8672 ; WX 602 ; N uni21E0 ; G 2044\nU 8673 ; WX 602 ; N uni21E1 ; G 2045\nU 8674 ; WX 602 ; N uni21E2 ; G 2046\nU 8675 ; WX 602 ; N uni21E3 ; G 2047\nU 8676 ; WX 602 ; N uni21E4 ; G 2048\nU 8677 ; WX 602 ; N uni21E5 ; G 2049\nU 8678 ; WX 602 ; N uni21E6 ; G 2050\nU 8679 ; WX 602 ; N uni21E7 ; G 2051\nU 8680 ; WX 602 ; N uni21E8 ; G 2052\nU 8681 ; WX 602 ; N uni21E9 ; G 2053\nU 8682 ; WX 602 ; N uni21EA ; G 2054\nU 8683 ; WX 602 ; N uni21EB ; G 2055\nU 8684 ; WX 602 ; N uni21EC ; G 2056\nU 8685 ; WX 602 ; N uni21ED ; G 2057\nU 8686 ; WX 602 ; N uni21EE ; G 2058\nU 8687 ; WX 602 ; N uni21EF ; G 2059\nU 8688 ; WX 602 ; N uni21F0 ; G 2060\nU 8689 ; WX 602 ; N uni21F1 ; G 2061\nU 8690 ; WX 602 ; N uni21F2 ; G 2062\nU 8691 ; WX 602 ; N uni21F3 ; G 2063\nU 8692 ; WX 602 ; N uni21F4 ; G 2064\nU 8693 ; WX 602 ; N uni21F5 ; G 2065\nU 8694 ; WX 602 ; N uni21F6 ; G 2066\nU 8695 ; WX 602 ; N uni21F7 ; G 2067\nU 8696 ; WX 602 ; N uni21F8 ; G 2068\nU 8697 ; WX 602 ; N uni21F9 ; G 2069\nU 8698 ; WX 602 ; N uni21FA ; G 2070\nU 8699 ; WX 602 ; N uni21FB ; G 2071\nU 8700 ; WX 602 ; N uni21FC ; G 2072\nU 8701 ; WX 602 ; N uni21FD ; G 2073\nU 8702 ; WX 602 ; N uni21FE ; G 2074\nU 8703 ; WX 602 ; N uni21FF ; G 2075\nU 8704 ; WX 602 ; N universal ; G 2076\nU 8705 ; WX 602 ; N uni2201 ; G 2077\nU 8706 ; WX 602 ; N partialdiff ; G 2078\nU 8707 ; WX 602 ; N existential ; G 2079\nU 8708 ; WX 602 ; N uni2204 ; G 2080\nU 8709 ; WX 602 ; N emptyset ; G 2081\nU 8710 ; WX 602 ; N increment ; G 2082\nU 8711 ; WX 602 ; N gradient ; G 2083\nU 8712 ; WX 602 ; N element ; G 2084\nU 8713 ; WX 602 ; N notelement ; G 2085\nU 8714 ; WX 602 ; N uni220A ; G 2086\nU 8715 ; WX 602 ; N suchthat ; G 2087\nU 8716 ; WX 602 ; N uni220C ; G 2088\nU 8717 ; WX 602 ; N uni220D ; G 2089\nU 8718 ; WX 602 ; N uni220E ; G 2090\nU 8719 ; WX 602 ; N product ; G 2091\nU 8720 ; WX 602 ; N uni2210 ; G 2092\nU 8721 ; WX 602 ; N summation ; G 2093\nU 8722 ; WX 602 ; N minus ; G 2094\nU 8723 ; WX 602 ; N uni2213 ; G 2095\nU 8725 ; WX 602 ; N uni2215 ; G 2096\nU 8727 ; WX 602 ; N asteriskmath ; G 2097\nU 8728 ; WX 602 ; N uni2218 ; G 2098\nU 8729 ; WX 602 ; N uni2219 ; G 2099\nU 8730 ; WX 602 ; N radical ; G 2100\nU 8731 ; WX 602 ; N uni221B ; G 2101\nU 8732 ; WX 602 ; N uni221C ; G 2102\nU 8733 ; WX 602 ; N proportional ; G 2103\nU 8734 ; WX 602 ; N infinity ; G 2104\nU 8735 ; WX 602 ; N orthogonal ; G 2105\nU 8736 ; WX 602 ; N angle ; G 2106\nU 8739 ; WX 602 ; N uni2223 ; G 2107\nU 8743 ; WX 602 ; N logicaland ; G 2108\nU 8744 ; WX 602 ; N logicalor ; G 2109\nU 8745 ; WX 602 ; N intersection ; G 2110\nU 8746 ; WX 602 ; N union ; G 2111\nU 8747 ; WX 602 ; N integral ; G 2112\nU 8748 ; WX 602 ; N uni222C ; G 2113\nU 8749 ; WX 602 ; N uni222D ; G 2114\nU 8756 ; WX 602 ; N therefore ; G 2115\nU 8757 ; WX 602 ; N uni2235 ; G 2116\nU 8758 ; WX 602 ; N uni2236 ; G 2117\nU 8759 ; WX 602 ; N uni2237 ; G 2118\nU 8760 ; WX 602 ; N uni2238 ; G 2119\nU 8761 ; WX 602 ; N uni2239 ; G 2120\nU 8762 ; WX 602 ; N uni223A ; G 2121\nU 8763 ; WX 602 ; N uni223B ; G 2122\nU 8764 ; WX 602 ; N similar ; G 2123\nU 8765 ; WX 602 ; N uni223D ; G 2124\nU 8769 ; WX 602 ; N uni2241 ; G 2125\nU 8770 ; WX 602 ; N uni2242 ; G 2126\nU 8771 ; WX 602 ; N uni2243 ; G 2127\nU 8772 ; WX 602 ; N uni2244 ; G 2128\nU 8773 ; WX 602 ; N congruent ; G 2129\nU 8774 ; WX 602 ; N uni2246 ; G 2130\nU 8775 ; WX 602 ; N uni2247 ; G 2131\nU 8776 ; WX 602 ; N approxequal ; G 2132\nU 8777 ; WX 602 ; N uni2249 ; G 2133\nU 8778 ; WX 602 ; N uni224A ; G 2134\nU 8779 ; WX 602 ; N uni224B ; G 2135\nU 8780 ; WX 602 ; N uni224C ; G 2136\nU 8781 ; WX 602 ; N uni224D ; G 2137\nU 8782 ; WX 602 ; N uni224E ; G 2138\nU 8783 ; WX 602 ; N uni224F ; G 2139\nU 8784 ; WX 602 ; N uni2250 ; G 2140\nU 8785 ; WX 602 ; N uni2251 ; G 2141\nU 8786 ; WX 602 ; N uni2252 ; G 2142\nU 8787 ; WX 602 ; N uni2253 ; G 2143\nU 8788 ; WX 602 ; N uni2254 ; G 2144\nU 8789 ; WX 602 ; N uni2255 ; G 2145\nU 8790 ; WX 602 ; N uni2256 ; G 2146\nU 8791 ; WX 602 ; N uni2257 ; G 2147\nU 8792 ; WX 602 ; N uni2258 ; G 2148\nU 8793 ; WX 602 ; N uni2259 ; G 2149\nU 8794 ; WX 602 ; N uni225A ; G 2150\nU 8795 ; WX 602 ; N uni225B ; G 2151\nU 8796 ; WX 602 ; N uni225C ; G 2152\nU 8797 ; WX 602 ; N uni225D ; G 2153\nU 8798 ; WX 602 ; N uni225E ; G 2154\nU 8799 ; WX 602 ; N uni225F ; G 2155\nU 8800 ; WX 602 ; N notequal ; G 2156\nU 8801 ; WX 602 ; N equivalence ; G 2157\nU 8802 ; WX 602 ; N uni2262 ; G 2158\nU 8803 ; WX 602 ; N uni2263 ; G 2159\nU 8804 ; WX 602 ; N lessequal ; G 2160\nU 8805 ; WX 602 ; N greaterequal ; G 2161\nU 8806 ; WX 602 ; N uni2266 ; G 2162\nU 8807 ; WX 602 ; N uni2267 ; G 2163\nU 8808 ; WX 602 ; N uni2268 ; G 2164\nU 8809 ; WX 602 ; N uni2269 ; G 2165\nU 8813 ; WX 602 ; N uni226D ; G 2166\nU 8814 ; WX 602 ; N uni226E ; G 2167\nU 8815 ; WX 602 ; N uni226F ; G 2168\nU 8816 ; WX 602 ; N uni2270 ; G 2169\nU 8817 ; WX 602 ; N uni2271 ; G 2170\nU 8818 ; WX 602 ; N uni2272 ; G 2171\nU 8819 ; WX 602 ; N uni2273 ; G 2172\nU 8820 ; WX 602 ; N uni2274 ; G 2173\nU 8821 ; WX 602 ; N uni2275 ; G 2174\nU 8822 ; WX 602 ; N uni2276 ; G 2175\nU 8823 ; WX 602 ; N uni2277 ; G 2176\nU 8824 ; WX 602 ; N uni2278 ; G 2177\nU 8825 ; WX 602 ; N uni2279 ; G 2178\nU 8826 ; WX 602 ; N uni227A ; G 2179\nU 8827 ; WX 602 ; N uni227B ; G 2180\nU 8828 ; WX 602 ; N uni227C ; G 2181\nU 8829 ; WX 602 ; N uni227D ; G 2182\nU 8830 ; WX 602 ; N uni227E ; G 2183\nU 8831 ; WX 602 ; N uni227F ; G 2184\nU 8832 ; WX 602 ; N uni2280 ; G 2185\nU 8833 ; WX 602 ; N uni2281 ; G 2186\nU 8834 ; WX 602 ; N propersubset ; G 2187\nU 8835 ; WX 602 ; N propersuperset ; G 2188\nU 8836 ; WX 602 ; N notsubset ; G 2189\nU 8837 ; WX 602 ; N uni2285 ; G 2190\nU 8838 ; WX 602 ; N reflexsubset ; G 2191\nU 8839 ; WX 602 ; N reflexsuperset ; G 2192\nU 8840 ; WX 602 ; N uni2288 ; G 2193\nU 8841 ; WX 602 ; N uni2289 ; G 2194\nU 8842 ; WX 602 ; N uni228A ; G 2195\nU 8843 ; WX 602 ; N uni228B ; G 2196\nU 8845 ; WX 602 ; N uni228D ; G 2197\nU 8846 ; WX 602 ; N uni228E ; G 2198\nU 8847 ; WX 602 ; N uni228F ; G 2199\nU 8848 ; WX 602 ; N uni2290 ; G 2200\nU 8849 ; WX 602 ; N uni2291 ; G 2201\nU 8850 ; WX 602 ; N uni2292 ; G 2202\nU 8851 ; WX 602 ; N uni2293 ; G 2203\nU 8852 ; WX 602 ; N uni2294 ; G 2204\nU 8853 ; WX 602 ; N circleplus ; G 2205\nU 8854 ; WX 602 ; N uni2296 ; G 2206\nU 8855 ; WX 602 ; N circlemultiply ; G 2207\nU 8856 ; WX 602 ; N uni2298 ; G 2208\nU 8857 ; WX 602 ; N uni2299 ; G 2209\nU 8858 ; WX 602 ; N uni229A ; G 2210\nU 8859 ; WX 602 ; N uni229B ; G 2211\nU 8860 ; WX 602 ; N uni229C ; G 2212\nU 8861 ; WX 602 ; N uni229D ; G 2213\nU 8862 ; WX 602 ; N uni229E ; G 2214\nU 8863 ; WX 602 ; N uni229F ; G 2215\nU 8864 ; WX 602 ; N uni22A0 ; G 2216\nU 8865 ; WX 602 ; N uni22A1 ; G 2217\nU 8866 ; WX 602 ; N uni22A2 ; G 2218\nU 8867 ; WX 602 ; N uni22A3 ; G 2219\nU 8868 ; WX 602 ; N uni22A4 ; G 2220\nU 8869 ; WX 602 ; N perpendicular ; G 2221\nU 8882 ; WX 602 ; N uni22B2 ; G 2222\nU 8883 ; WX 602 ; N uni22B3 ; G 2223\nU 8884 ; WX 602 ; N uni22B4 ; G 2224\nU 8885 ; WX 602 ; N uni22B5 ; G 2225\nU 8888 ; WX 602 ; N uni22B8 ; G 2226\nU 8898 ; WX 602 ; N uni22C2 ; G 2227\nU 8899 ; WX 602 ; N uni22C3 ; G 2228\nU 8900 ; WX 602 ; N uni22C4 ; G 2229\nU 8901 ; WX 602 ; N dotmath ; G 2230\nU 8902 ; WX 602 ; N uni22C6 ; G 2231\nU 8909 ; WX 602 ; N uni22CD ; G 2232\nU 8910 ; WX 602 ; N uni22CE ; G 2233\nU 8911 ; WX 602 ; N uni22CF ; G 2234\nU 8912 ; WX 602 ; N uni22D0 ; G 2235\nU 8913 ; WX 602 ; N uni22D1 ; G 2236\nU 8922 ; WX 602 ; N uni22DA ; G 2237\nU 8923 ; WX 602 ; N uni22DB ; G 2238\nU 8924 ; WX 602 ; N uni22DC ; G 2239\nU 8925 ; WX 602 ; N uni22DD ; G 2240\nU 8926 ; WX 602 ; N uni22DE ; G 2241\nU 8927 ; WX 602 ; N uni22DF ; G 2242\nU 8928 ; WX 602 ; N uni22E0 ; G 2243\nU 8929 ; WX 602 ; N uni22E1 ; G 2244\nU 8930 ; WX 602 ; N uni22E2 ; G 2245\nU 8931 ; WX 602 ; N uni22E3 ; G 2246\nU 8932 ; WX 602 ; N uni22E4 ; G 2247\nU 8933 ; WX 602 ; N uni22E5 ; G 2248\nU 8934 ; WX 602 ; N uni22E6 ; G 2249\nU 8935 ; WX 602 ; N uni22E7 ; G 2250\nU 8936 ; WX 602 ; N uni22E8 ; G 2251\nU 8937 ; WX 602 ; N uni22E9 ; G 2252\nU 8943 ; WX 602 ; N uni22EF ; G 2253\nU 8960 ; WX 602 ; N uni2300 ; G 2254\nU 8961 ; WX 602 ; N uni2301 ; G 2255\nU 8962 ; WX 602 ; N house ; G 2256\nU 8963 ; WX 602 ; N uni2303 ; G 2257\nU 8964 ; WX 602 ; N uni2304 ; G 2258\nU 8965 ; WX 602 ; N uni2305 ; G 2259\nU 8966 ; WX 602 ; N uni2306 ; G 2260\nU 8968 ; WX 602 ; N uni2308 ; G 2261\nU 8969 ; WX 602 ; N uni2309 ; G 2262\nU 8970 ; WX 602 ; N uni230A ; G 2263\nU 8971 ; WX 602 ; N uni230B ; G 2264\nU 8972 ; WX 602 ; N uni230C ; G 2265\nU 8973 ; WX 602 ; N uni230D ; G 2266\nU 8974 ; WX 602 ; N uni230E ; G 2267\nU 8975 ; WX 602 ; N uni230F ; G 2268\nU 8976 ; WX 602 ; N revlogicalnot ; G 2269\nU 8977 ; WX 602 ; N uni2311 ; G 2270\nU 8978 ; WX 602 ; N uni2312 ; G 2271\nU 8979 ; WX 602 ; N uni2313 ; G 2272\nU 8980 ; WX 602 ; N uni2314 ; G 2273\nU 8981 ; WX 602 ; N uni2315 ; G 2274\nU 8984 ; WX 602 ; N uni2318 ; G 2275\nU 8985 ; WX 602 ; N uni2319 ; G 2276\nU 8988 ; WX 602 ; N uni231C ; G 2277\nU 8989 ; WX 602 ; N uni231D ; G 2278\nU 8990 ; WX 602 ; N uni231E ; G 2279\nU 8991 ; WX 602 ; N uni231F ; G 2280\nU 8992 ; WX 602 ; N integraltp ; G 2281\nU 8993 ; WX 602 ; N integralbt ; G 2282\nU 8997 ; WX 602 ; N uni2325 ; G 2283\nU 8998 ; WX 602 ; N uni2326 ; G 2284\nU 8999 ; WX 602 ; N uni2327 ; G 2285\nU 9000 ; WX 602 ; N uni2328 ; G 2286\nU 9003 ; WX 602 ; N uni232B ; G 2287\nU 9013 ; WX 602 ; N uni2335 ; G 2288\nU 9014 ; WX 602 ; N uni2336 ; G 2289\nU 9015 ; WX 602 ; N uni2337 ; G 2290\nU 9016 ; WX 602 ; N uni2338 ; G 2291\nU 9017 ; WX 602 ; N uni2339 ; G 2292\nU 9018 ; WX 602 ; N uni233A ; G 2293\nU 9019 ; WX 602 ; N uni233B ; G 2294\nU 9020 ; WX 602 ; N uni233C ; G 2295\nU 9021 ; WX 602 ; N uni233D ; G 2296\nU 9022 ; WX 602 ; N uni233E ; G 2297\nU 9023 ; WX 602 ; N uni233F ; G 2298\nU 9024 ; WX 602 ; N uni2340 ; G 2299\nU 9025 ; WX 602 ; N uni2341 ; G 2300\nU 9026 ; WX 602 ; N uni2342 ; G 2301\nU 9027 ; WX 602 ; N uni2343 ; G 2302\nU 9028 ; WX 602 ; N uni2344 ; G 2303\nU 9029 ; WX 602 ; N uni2345 ; G 2304\nU 9030 ; WX 602 ; N uni2346 ; G 2305\nU 9031 ; WX 602 ; N uni2347 ; G 2306\nU 9032 ; WX 602 ; N uni2348 ; G 2307\nU 9033 ; WX 602 ; N uni2349 ; G 2308\nU 9034 ; WX 602 ; N uni234A ; G 2309\nU 9035 ; WX 602 ; N uni234B ; G 2310\nU 9036 ; WX 602 ; N uni234C ; G 2311\nU 9037 ; WX 602 ; N uni234D ; G 2312\nU 9038 ; WX 602 ; N uni234E ; G 2313\nU 9039 ; WX 602 ; N uni234F ; G 2314\nU 9040 ; WX 602 ; N uni2350 ; G 2315\nU 9041 ; WX 602 ; N uni2351 ; G 2316\nU 9042 ; WX 602 ; N uni2352 ; G 2317\nU 9043 ; WX 602 ; N uni2353 ; G 2318\nU 9044 ; WX 602 ; N uni2354 ; G 2319\nU 9045 ; WX 602 ; N uni2355 ; G 2320\nU 9046 ; WX 602 ; N uni2356 ; G 2321\nU 9047 ; WX 602 ; N uni2357 ; G 2322\nU 9048 ; WX 602 ; N uni2358 ; G 2323\nU 9049 ; WX 602 ; N uni2359 ; G 2324\nU 9050 ; WX 602 ; N uni235A ; G 2325\nU 9051 ; WX 602 ; N uni235B ; G 2326\nU 9052 ; WX 602 ; N uni235C ; G 2327\nU 9053 ; WX 602 ; N uni235D ; G 2328\nU 9054 ; WX 602 ; N uni235E ; G 2329\nU 9055 ; WX 602 ; N uni235F ; G 2330\nU 9056 ; WX 602 ; N uni2360 ; G 2331\nU 9057 ; WX 602 ; N uni2361 ; G 2332\nU 9058 ; WX 602 ; N uni2362 ; G 2333\nU 9059 ; WX 602 ; N uni2363 ; G 2334\nU 9060 ; WX 602 ; N uni2364 ; G 2335\nU 9061 ; WX 602 ; N uni2365 ; G 2336\nU 9062 ; WX 602 ; N uni2366 ; G 2337\nU 9063 ; WX 602 ; N uni2367 ; G 2338\nU 9064 ; WX 602 ; N uni2368 ; G 2339\nU 9065 ; WX 602 ; N uni2369 ; G 2340\nU 9066 ; WX 602 ; N uni236A ; G 2341\nU 9067 ; WX 602 ; N uni236B ; G 2342\nU 9068 ; WX 602 ; N uni236C ; G 2343\nU 9069 ; WX 602 ; N uni236D ; G 2344\nU 9070 ; WX 602 ; N uni236E ; G 2345\nU 9071 ; WX 602 ; N uni236F ; G 2346\nU 9072 ; WX 602 ; N uni2370 ; G 2347\nU 9073 ; WX 602 ; N uni2371 ; G 2348\nU 9074 ; WX 602 ; N uni2372 ; G 2349\nU 9075 ; WX 602 ; N uni2373 ; G 2350\nU 9076 ; WX 602 ; N uni2374 ; G 2351\nU 9077 ; WX 602 ; N uni2375 ; G 2352\nU 9078 ; WX 602 ; N uni2376 ; G 2353\nU 9079 ; WX 602 ; N uni2377 ; G 2354\nU 9080 ; WX 602 ; N uni2378 ; G 2355\nU 9081 ; WX 602 ; N uni2379 ; G 2356\nU 9082 ; WX 602 ; N uni237A ; G 2357\nU 9085 ; WX 602 ; N uni237D ; G 2358\nU 9088 ; WX 602 ; N uni2380 ; G 2359\nU 9089 ; WX 602 ; N uni2381 ; G 2360\nU 9090 ; WX 602 ; N uni2382 ; G 2361\nU 9091 ; WX 602 ; N uni2383 ; G 2362\nU 9096 ; WX 602 ; N uni2388 ; G 2363\nU 9097 ; WX 602 ; N uni2389 ; G 2364\nU 9098 ; WX 602 ; N uni238A ; G 2365\nU 9099 ; WX 602 ; N uni238B ; G 2366\nU 9109 ; WX 602 ; N uni2395 ; G 2367\nU 9115 ; WX 602 ; N uni239B ; G 2368\nU 9116 ; WX 602 ; N uni239C ; G 2369\nU 9117 ; WX 602 ; N uni239D ; G 2370\nU 9118 ; WX 602 ; N uni239E ; G 2371\nU 9119 ; WX 602 ; N uni239F ; G 2372\nU 9120 ; WX 602 ; N uni23A0 ; G 2373\nU 9121 ; WX 602 ; N uni23A1 ; G 2374\nU 9122 ; WX 602 ; N uni23A2 ; G 2375\nU 9123 ; WX 602 ; N uni23A3 ; G 2376\nU 9124 ; WX 602 ; N uni23A4 ; G 2377\nU 9125 ; WX 602 ; N uni23A5 ; G 2378\nU 9126 ; WX 602 ; N uni23A6 ; G 2379\nU 9127 ; WX 602 ; N uni23A7 ; G 2380\nU 9128 ; WX 602 ; N uni23A8 ; G 2381\nU 9129 ; WX 602 ; N uni23A9 ; G 2382\nU 9130 ; WX 602 ; N uni23AA ; G 2383\nU 9131 ; WX 602 ; N uni23AB ; G 2384\nU 9132 ; WX 602 ; N uni23AC ; G 2385\nU 9133 ; WX 602 ; N uni23AD ; G 2386\nU 9134 ; WX 602 ; N uni23AE ; G 2387\nU 9166 ; WX 602 ; N uni23CE ; G 2388\nU 9167 ; WX 602 ; N uni23CF ; G 2389\nU 9251 ; WX 602 ; N uni2423 ; G 2390\nU 9472 ; WX 602 ; N SF100000 ; G 2391\nU 9473 ; WX 602 ; N uni2501 ; G 2392\nU 9474 ; WX 602 ; N SF110000 ; G 2393\nU 9475 ; WX 602 ; N uni2503 ; G 2394\nU 9476 ; WX 602 ; N uni2504 ; G 2395\nU 9477 ; WX 602 ; N uni2505 ; G 2396\nU 9478 ; WX 602 ; N uni2506 ; G 2397\nU 9479 ; WX 602 ; N uni2507 ; G 2398\nU 9480 ; WX 602 ; N uni2508 ; G 2399\nU 9481 ; WX 602 ; N uni2509 ; G 2400\nU 9482 ; WX 602 ; N uni250A ; G 2401\nU 9483 ; WX 602 ; N uni250B ; G 2402\nU 9484 ; WX 602 ; N SF010000 ; G 2403\nU 9485 ; WX 602 ; N uni250D ; G 2404\nU 9486 ; WX 602 ; N uni250E ; G 2405\nU 9487 ; WX 602 ; N uni250F ; G 2406\nU 9488 ; WX 602 ; N SF030000 ; G 2407\nU 9489 ; WX 602 ; N uni2511 ; G 2408\nU 9490 ; WX 602 ; N uni2512 ; G 2409\nU 9491 ; WX 602 ; N uni2513 ; G 2410\nU 9492 ; WX 602 ; N SF020000 ; G 2411\nU 9493 ; WX 602 ; N uni2515 ; G 2412\nU 9494 ; WX 602 ; N uni2516 ; G 2413\nU 9495 ; WX 602 ; N uni2517 ; G 2414\nU 9496 ; WX 602 ; N SF040000 ; G 2415\nU 9497 ; WX 602 ; N uni2519 ; G 2416\nU 9498 ; WX 602 ; N uni251A ; G 2417\nU 9499 ; WX 602 ; N uni251B ; G 2418\nU 9500 ; WX 602 ; N SF080000 ; G 2419\nU 9501 ; WX 602 ; N uni251D ; G 2420\nU 9502 ; WX 602 ; N uni251E ; G 2421\nU 9503 ; WX 602 ; N uni251F ; G 2422\nU 9504 ; WX 602 ; N uni2520 ; G 2423\nU 9505 ; WX 602 ; N uni2521 ; G 2424\nU 9506 ; WX 602 ; N uni2522 ; G 2425\nU 9507 ; WX 602 ; N uni2523 ; G 2426\nU 9508 ; WX 602 ; N SF090000 ; G 2427\nU 9509 ; WX 602 ; N uni2525 ; G 2428\nU 9510 ; WX 602 ; N uni2526 ; G 2429\nU 9511 ; WX 602 ; N uni2527 ; G 2430\nU 9512 ; WX 602 ; N uni2528 ; G 2431\nU 9513 ; WX 602 ; N uni2529 ; G 2432\nU 9514 ; WX 602 ; N uni252A ; G 2433\nU 9515 ; WX 602 ; N uni252B ; G 2434\nU 9516 ; WX 602 ; N SF060000 ; G 2435\nU 9517 ; WX 602 ; N uni252D ; G 2436\nU 9518 ; WX 602 ; N uni252E ; G 2437\nU 9519 ; WX 602 ; N uni252F ; G 2438\nU 9520 ; WX 602 ; N uni2530 ; G 2439\nU 9521 ; WX 602 ; N uni2531 ; G 2440\nU 9522 ; WX 602 ; N uni2532 ; G 2441\nU 9523 ; WX 602 ; N uni2533 ; G 2442\nU 9524 ; WX 602 ; N SF070000 ; G 2443\nU 9525 ; WX 602 ; N uni2535 ; G 2444\nU 9526 ; WX 602 ; N uni2536 ; G 2445\nU 9527 ; WX 602 ; N uni2537 ; G 2446\nU 9528 ; WX 602 ; N uni2538 ; G 2447\nU 9529 ; WX 602 ; N uni2539 ; G 2448\nU 9530 ; WX 602 ; N uni253A ; G 2449\nU 9531 ; WX 602 ; N uni253B ; G 2450\nU 9532 ; WX 602 ; N SF050000 ; G 2451\nU 9533 ; WX 602 ; N uni253D ; G 2452\nU 9534 ; WX 602 ; N uni253E ; G 2453\nU 9535 ; WX 602 ; N uni253F ; G 2454\nU 9536 ; WX 602 ; N uni2540 ; G 2455\nU 9537 ; WX 602 ; N uni2541 ; G 2456\nU 9538 ; WX 602 ; N uni2542 ; G 2457\nU 9539 ; WX 602 ; N uni2543 ; G 2458\nU 9540 ; WX 602 ; N uni2544 ; G 2459\nU 9541 ; WX 602 ; N uni2545 ; G 2460\nU 9542 ; WX 602 ; N uni2546 ; G 2461\nU 9543 ; WX 602 ; N uni2547 ; G 2462\nU 9544 ; WX 602 ; N uni2548 ; G 2463\nU 9545 ; WX 602 ; N uni2549 ; G 2464\nU 9546 ; WX 602 ; N uni254A ; G 2465\nU 9547 ; WX 602 ; N uni254B ; G 2466\nU 9548 ; WX 602 ; N uni254C ; G 2467\nU 9549 ; WX 602 ; N uni254D ; G 2468\nU 9550 ; WX 602 ; N uni254E ; G 2469\nU 9551 ; WX 602 ; N uni254F ; G 2470\nU 9552 ; WX 602 ; N SF430000 ; G 2471\nU 9553 ; WX 602 ; N SF240000 ; G 2472\nU 9554 ; WX 602 ; N SF510000 ; G 2473\nU 9555 ; WX 602 ; N SF520000 ; G 2474\nU 9556 ; WX 602 ; N SF390000 ; G 2475\nU 9557 ; WX 602 ; N SF220000 ; G 2476\nU 9558 ; WX 602 ; N SF210000 ; G 2477\nU 9559 ; WX 602 ; N SF250000 ; G 2478\nU 9560 ; WX 602 ; N SF500000 ; G 2479\nU 9561 ; WX 602 ; N SF490000 ; G 2480\nU 9562 ; WX 602 ; N SF380000 ; G 2481\nU 9563 ; WX 602 ; N SF280000 ; G 2482\nU 9564 ; WX 602 ; N SF270000 ; G 2483\nU 9565 ; WX 602 ; N SF260000 ; G 2484\nU 9566 ; WX 602 ; N SF360000 ; G 2485\nU 9567 ; WX 602 ; N SF370000 ; G 2486\nU 9568 ; WX 602 ; N SF420000 ; G 2487\nU 9569 ; WX 602 ; N SF190000 ; G 2488\nU 9570 ; WX 602 ; N SF200000 ; G 2489\nU 9571 ; WX 602 ; N SF230000 ; G 2490\nU 9572 ; WX 602 ; N SF470000 ; G 2491\nU 9573 ; WX 602 ; N SF480000 ; G 2492\nU 9574 ; WX 602 ; N SF410000 ; G 2493\nU 9575 ; WX 602 ; N SF450000 ; G 2494\nU 9576 ; WX 602 ; N SF460000 ; G 2495\nU 9577 ; WX 602 ; N SF400000 ; G 2496\nU 9578 ; WX 602 ; N SF540000 ; G 2497\nU 9579 ; WX 602 ; N SF530000 ; G 2498\nU 9580 ; WX 602 ; N SF440000 ; G 2499\nU 9581 ; WX 602 ; N uni256D ; G 2500\nU 9582 ; WX 602 ; N uni256E ; G 2501\nU 9583 ; WX 602 ; N uni256F ; G 2502\nU 9584 ; WX 602 ; N uni2570 ; G 2503\nU 9585 ; WX 602 ; N uni2571 ; G 2504\nU 9586 ; WX 602 ; N uni2572 ; G 2505\nU 9587 ; WX 602 ; N uni2573 ; G 2506\nU 9588 ; WX 602 ; N uni2574 ; G 2507\nU 9589 ; WX 602 ; N uni2575 ; G 2508\nU 9590 ; WX 602 ; N uni2576 ; G 2509\nU 9591 ; WX 602 ; N uni2577 ; G 2510\nU 9592 ; WX 602 ; N uni2578 ; G 2511\nU 9593 ; WX 602 ; N uni2579 ; G 2512\nU 9594 ; WX 602 ; N uni257A ; G 2513\nU 9595 ; WX 602 ; N uni257B ; G 2514\nU 9596 ; WX 602 ; N uni257C ; G 2515\nU 9597 ; WX 602 ; N uni257D ; G 2516\nU 9598 ; WX 602 ; N uni257E ; G 2517\nU 9599 ; WX 602 ; N uni257F ; G 2518\nU 9600 ; WX 602 ; N upblock ; G 2519\nU 9601 ; WX 602 ; N uni2581 ; G 2520\nU 9602 ; WX 602 ; N uni2582 ; G 2521\nU 9603 ; WX 602 ; N uni2583 ; G 2522\nU 9604 ; WX 602 ; N dnblock ; G 2523\nU 9605 ; WX 602 ; N uni2585 ; G 2524\nU 9606 ; WX 602 ; N uni2586 ; G 2525\nU 9607 ; WX 602 ; N uni2587 ; G 2526\nU 9608 ; WX 602 ; N block ; G 2527\nU 9609 ; WX 602 ; N uni2589 ; G 2528\nU 9610 ; WX 602 ; N uni258A ; G 2529\nU 9611 ; WX 602 ; N uni258B ; G 2530\nU 9612 ; WX 602 ; N lfblock ; G 2531\nU 9613 ; WX 602 ; N uni258D ; G 2532\nU 9614 ; WX 602 ; N uni258E ; G 2533\nU 9615 ; WX 602 ; N uni258F ; G 2534\nU 9616 ; WX 602 ; N rtblock ; G 2535\nU 9617 ; WX 602 ; N ltshade ; G 2536\nU 9618 ; WX 602 ; N shade ; G 2537\nU 9619 ; WX 602 ; N dkshade ; G 2538\nU 9620 ; WX 602 ; N uni2594 ; G 2539\nU 9621 ; WX 602 ; N uni2595 ; G 2540\nU 9622 ; WX 602 ; N uni2596 ; G 2541\nU 9623 ; WX 602 ; N uni2597 ; G 2542\nU 9624 ; WX 602 ; N uni2598 ; G 2543\nU 9625 ; WX 602 ; N uni2599 ; G 2544\nU 9626 ; WX 602 ; N uni259A ; G 2545\nU 9627 ; WX 602 ; N uni259B ; G 2546\nU 9628 ; WX 602 ; N uni259C ; G 2547\nU 9629 ; WX 602 ; N uni259D ; G 2548\nU 9630 ; WX 602 ; N uni259E ; G 2549\nU 9631 ; WX 602 ; N uni259F ; G 2550\nU 9632 ; WX 602 ; N filledbox ; G 2551\nU 9633 ; WX 602 ; N H22073 ; G 2552\nU 9634 ; WX 602 ; N uni25A2 ; G 2553\nU 9635 ; WX 602 ; N uni25A3 ; G 2554\nU 9636 ; WX 602 ; N uni25A4 ; G 2555\nU 9637 ; WX 602 ; N uni25A5 ; G 2556\nU 9638 ; WX 602 ; N uni25A6 ; G 2557\nU 9639 ; WX 602 ; N uni25A7 ; G 2558\nU 9640 ; WX 602 ; N uni25A8 ; G 2559\nU 9641 ; WX 602 ; N uni25A9 ; G 2560\nU 9642 ; WX 602 ; N H18543 ; G 2561\nU 9643 ; WX 602 ; N H18551 ; G 2562\nU 9644 ; WX 602 ; N filledrect ; G 2563\nU 9645 ; WX 602 ; N uni25AD ; G 2564\nU 9646 ; WX 602 ; N uni25AE ; G 2565\nU 9647 ; WX 602 ; N uni25AF ; G 2566\nU 9648 ; WX 602 ; N uni25B0 ; G 2567\nU 9649 ; WX 602 ; N uni25B1 ; G 2568\nU 9650 ; WX 602 ; N triagup ; G 2569\nU 9651 ; WX 602 ; N uni25B3 ; G 2570\nU 9652 ; WX 602 ; N uni25B4 ; G 2571\nU 9653 ; WX 602 ; N uni25B5 ; G 2572\nU 9654 ; WX 602 ; N uni25B6 ; G 2573\nU 9655 ; WX 602 ; N uni25B7 ; G 2574\nU 9656 ; WX 602 ; N uni25B8 ; G 2575\nU 9657 ; WX 602 ; N uni25B9 ; G 2576\nU 9658 ; WX 602 ; N triagrt ; G 2577\nU 9659 ; WX 602 ; N uni25BB ; G 2578\nU 9660 ; WX 602 ; N triagdn ; G 2579\nU 9661 ; WX 602 ; N uni25BD ; G 2580\nU 9662 ; WX 602 ; N uni25BE ; G 2581\nU 9663 ; WX 602 ; N uni25BF ; G 2582\nU 9664 ; WX 602 ; N uni25C0 ; G 2583\nU 9665 ; WX 602 ; N uni25C1 ; G 2584\nU 9666 ; WX 602 ; N uni25C2 ; G 2585\nU 9667 ; WX 602 ; N uni25C3 ; G 2586\nU 9668 ; WX 602 ; N triaglf ; G 2587\nU 9669 ; WX 602 ; N uni25C5 ; G 2588\nU 9670 ; WX 602 ; N uni25C6 ; G 2589\nU 9671 ; WX 602 ; N uni25C7 ; G 2590\nU 9672 ; WX 602 ; N uni25C8 ; G 2591\nU 9673 ; WX 602 ; N uni25C9 ; G 2592\nU 9674 ; WX 602 ; N lozenge ; G 2593\nU 9675 ; WX 602 ; N circle ; G 2594\nU 9676 ; WX 602 ; N uni25CC ; G 2595\nU 9677 ; WX 602 ; N uni25CD ; G 2596\nU 9678 ; WX 602 ; N uni25CE ; G 2597\nU 9679 ; WX 602 ; N H18533 ; G 2598\nU 9680 ; WX 602 ; N uni25D0 ; G 2599\nU 9681 ; WX 602 ; N uni25D1 ; G 2600\nU 9682 ; WX 602 ; N uni25D2 ; G 2601\nU 9683 ; WX 602 ; N uni25D3 ; G 2602\nU 9684 ; WX 602 ; N uni25D4 ; G 2603\nU 9685 ; WX 602 ; N uni25D5 ; G 2604\nU 9686 ; WX 602 ; N uni25D6 ; G 2605\nU 9687 ; WX 602 ; N uni25D7 ; G 2606\nU 9688 ; WX 602 ; N invbullet ; G 2607\nU 9689 ; WX 602 ; N invcircle ; G 2608\nU 9690 ; WX 602 ; N uni25DA ; G 2609\nU 9691 ; WX 602 ; N uni25DB ; G 2610\nU 9692 ; WX 602 ; N uni25DC ; G 2611\nU 9693 ; WX 602 ; N uni25DD ; G 2612\nU 9694 ; WX 602 ; N uni25DE ; G 2613\nU 9695 ; WX 602 ; N uni25DF ; G 2614\nU 9696 ; WX 602 ; N uni25E0 ; G 2615\nU 9697 ; WX 602 ; N uni25E1 ; G 2616\nU 9698 ; WX 602 ; N uni25E2 ; G 2617\nU 9699 ; WX 602 ; N uni25E3 ; G 2618\nU 9700 ; WX 602 ; N uni25E4 ; G 2619\nU 9701 ; WX 602 ; N uni25E5 ; G 2620\nU 9702 ; WX 602 ; N openbullet ; G 2621\nU 9703 ; WX 602 ; N uni25E7 ; G 2622\nU 9704 ; WX 602 ; N uni25E8 ; G 2623\nU 9705 ; WX 602 ; N uni25E9 ; G 2624\nU 9706 ; WX 602 ; N uni25EA ; G 2625\nU 9707 ; WX 602 ; N uni25EB ; G 2626\nU 9708 ; WX 602 ; N uni25EC ; G 2627\nU 9709 ; WX 602 ; N uni25ED ; G 2628\nU 9710 ; WX 602 ; N uni25EE ; G 2629\nU 9711 ; WX 602 ; N uni25EF ; G 2630\nU 9712 ; WX 602 ; N uni25F0 ; G 2631\nU 9713 ; WX 602 ; N uni25F1 ; G 2632\nU 9714 ; WX 602 ; N uni25F2 ; G 2633\nU 9715 ; WX 602 ; N uni25F3 ; G 2634\nU 9716 ; WX 602 ; N uni25F4 ; G 2635\nU 9717 ; WX 602 ; N uni25F5 ; G 2636\nU 9718 ; WX 602 ; N uni25F6 ; G 2637\nU 9719 ; WX 602 ; N uni25F7 ; G 2638\nU 9720 ; WX 602 ; N uni25F8 ; G 2639\nU 9721 ; WX 602 ; N uni25F9 ; G 2640\nU 9722 ; WX 602 ; N uni25FA ; G 2641\nU 9723 ; WX 602 ; N uni25FB ; G 2642\nU 9724 ; WX 602 ; N uni25FC ; G 2643\nU 9725 ; WX 602 ; N uni25FD ; G 2644\nU 9726 ; WX 602 ; N uni25FE ; G 2645\nU 9727 ; WX 602 ; N uni25FF ; G 2646\nU 9728 ; WX 602 ; N uni2600 ; G 2647\nU 9729 ; WX 602 ; N uni2601 ; G 2648\nU 9730 ; WX 602 ; N uni2602 ; G 2649\nU 9731 ; WX 602 ; N uni2603 ; G 2650\nU 9732 ; WX 602 ; N uni2604 ; G 2651\nU 9733 ; WX 602 ; N uni2605 ; G 2652\nU 9734 ; WX 602 ; N uni2606 ; G 2653\nU 9735 ; WX 602 ; N uni2607 ; G 2654\nU 9736 ; WX 602 ; N uni2608 ; G 2655\nU 9737 ; WX 602 ; N uni2609 ; G 2656\nU 9738 ; WX 602 ; N uni260A ; G 2657\nU 9739 ; WX 602 ; N uni260B ; G 2658\nU 9740 ; WX 602 ; N uni260C ; G 2659\nU 9741 ; WX 602 ; N uni260D ; G 2660\nU 9742 ; WX 602 ; N uni260E ; G 2661\nU 9743 ; WX 602 ; N uni260F ; G 2662\nU 9744 ; WX 602 ; N uni2610 ; G 2663\nU 9745 ; WX 602 ; N uni2611 ; G 2664\nU 9746 ; WX 602 ; N uni2612 ; G 2665\nU 9747 ; WX 602 ; N uni2613 ; G 2666\nU 9748 ; WX 602 ; N uni2614 ; G 2667\nU 9749 ; WX 602 ; N uni2615 ; G 2668\nU 9750 ; WX 602 ; N uni2616 ; G 2669\nU 9751 ; WX 602 ; N uni2617 ; G 2670\nU 9752 ; WX 602 ; N uni2618 ; G 2671\nU 9753 ; WX 602 ; N uni2619 ; G 2672\nU 9754 ; WX 602 ; N uni261A ; G 2673\nU 9755 ; WX 602 ; N uni261B ; G 2674\nU 9756 ; WX 602 ; N uni261C ; G 2675\nU 9757 ; WX 602 ; N uni261D ; G 2676\nU 9758 ; WX 602 ; N uni261E ; G 2677\nU 9759 ; WX 602 ; N uni261F ; G 2678\nU 9760 ; WX 602 ; N uni2620 ; G 2679\nU 9761 ; WX 602 ; N uni2621 ; G 2680\nU 9762 ; WX 602 ; N uni2622 ; G 2681\nU 9763 ; WX 602 ; N uni2623 ; G 2682\nU 9764 ; WX 602 ; N uni2624 ; G 2683\nU 9765 ; WX 602 ; N uni2625 ; G 2684\nU 9766 ; WX 602 ; N uni2626 ; G 2685\nU 9767 ; WX 602 ; N uni2627 ; G 2686\nU 9768 ; WX 602 ; N uni2628 ; G 2687\nU 9769 ; WX 602 ; N uni2629 ; G 2688\nU 9770 ; WX 602 ; N uni262A ; G 2689\nU 9771 ; WX 602 ; N uni262B ; G 2690\nU 9772 ; WX 602 ; N uni262C ; G 2691\nU 9773 ; WX 602 ; N uni262D ; G 2692\nU 9774 ; WX 602 ; N uni262E ; G 2693\nU 9775 ; WX 602 ; N uni262F ; G 2694\nU 9784 ; WX 602 ; N uni2638 ; G 2695\nU 9785 ; WX 602 ; N uni2639 ; G 2696\nU 9786 ; WX 602 ; N smileface ; G 2697\nU 9787 ; WX 602 ; N invsmileface ; G 2698\nU 9788 ; WX 602 ; N sun ; G 2699\nU 9789 ; WX 602 ; N uni263D ; G 2700\nU 9790 ; WX 602 ; N uni263E ; G 2701\nU 9791 ; WX 602 ; N uni263F ; G 2702\nU 9792 ; WX 602 ; N female ; G 2703\nU 9793 ; WX 602 ; N uni2641 ; G 2704\nU 9794 ; WX 602 ; N male ; G 2705\nU 9795 ; WX 602 ; N uni2643 ; G 2706\nU 9796 ; WX 602 ; N uni2644 ; G 2707\nU 9797 ; WX 602 ; N uni2645 ; G 2708\nU 9798 ; WX 602 ; N uni2646 ; G 2709\nU 9799 ; WX 602 ; N uni2647 ; G 2710\nU 9800 ; WX 602 ; N uni2648 ; G 2711\nU 9801 ; WX 602 ; N uni2649 ; G 2712\nU 9802 ; WX 602 ; N uni264A ; G 2713\nU 9803 ; WX 602 ; N uni264B ; G 2714\nU 9804 ; WX 602 ; N uni264C ; G 2715\nU 9805 ; WX 602 ; N uni264D ; G 2716\nU 9806 ; WX 602 ; N uni264E ; G 2717\nU 9807 ; WX 602 ; N uni264F ; G 2718\nU 9808 ; WX 602 ; N uni2650 ; G 2719\nU 9809 ; WX 602 ; N uni2651 ; G 2720\nU 9810 ; WX 602 ; N uni2652 ; G 2721\nU 9811 ; WX 602 ; N uni2653 ; G 2722\nU 9812 ; WX 602 ; N uni2654 ; G 2723\nU 9813 ; WX 602 ; N uni2655 ; G 2724\nU 9814 ; WX 602 ; N uni2656 ; G 2725\nU 9815 ; WX 602 ; N uni2657 ; G 2726\nU 9816 ; WX 602 ; N uni2658 ; G 2727\nU 9817 ; WX 602 ; N uni2659 ; G 2728\nU 9818 ; WX 602 ; N uni265A ; G 2729\nU 9819 ; WX 602 ; N uni265B ; G 2730\nU 9820 ; WX 602 ; N uni265C ; G 2731\nU 9821 ; WX 602 ; N uni265D ; G 2732\nU 9822 ; WX 602 ; N uni265E ; G 2733\nU 9823 ; WX 602 ; N uni265F ; G 2734\nU 9824 ; WX 602 ; N spade ; G 2735\nU 9825 ; WX 602 ; N uni2661 ; G 2736\nU 9826 ; WX 602 ; N uni2662 ; G 2737\nU 9827 ; WX 602 ; N club ; G 2738\nU 9828 ; WX 602 ; N uni2664 ; G 2739\nU 9829 ; WX 602 ; N heart ; G 2740\nU 9830 ; WX 602 ; N diamond ; G 2741\nU 9831 ; WX 602 ; N uni2667 ; G 2742\nU 9832 ; WX 602 ; N uni2668 ; G 2743\nU 9833 ; WX 602 ; N uni2669 ; G 2744\nU 9834 ; WX 602 ; N musicalnote ; G 2745\nU 9835 ; WX 602 ; N musicalnotedbl ; G 2746\nU 9836 ; WX 602 ; N uni266C ; G 2747\nU 9837 ; WX 602 ; N uni266D ; G 2748\nU 9838 ; WX 602 ; N uni266E ; G 2749\nU 9839 ; WX 602 ; N uni266F ; G 2750\nU 9840 ; WX 602 ; N uni2670 ; G 2751\nU 9841 ; WX 602 ; N uni2671 ; G 2752\nU 9842 ; WX 602 ; N uni2672 ; G 2753\nU 9843 ; WX 602 ; N uni2673 ; G 2754\nU 9844 ; WX 602 ; N uni2674 ; G 2755\nU 9845 ; WX 602 ; N uni2675 ; G 2756\nU 9846 ; WX 602 ; N uni2676 ; G 2757\nU 9847 ; WX 602 ; N uni2677 ; G 2758\nU 9848 ; WX 602 ; N uni2678 ; G 2759\nU 9849 ; WX 602 ; N uni2679 ; G 2760\nU 9850 ; WX 602 ; N uni267A ; G 2761\nU 9851 ; WX 602 ; N uni267B ; G 2762\nU 9852 ; WX 602 ; N uni267C ; G 2763\nU 9853 ; WX 602 ; N uni267D ; G 2764\nU 9854 ; WX 602 ; N uni267E ; G 2765\nU 9855 ; WX 602 ; N uni267F ; G 2766\nU 9856 ; WX 602 ; N uni2680 ; G 2767\nU 9857 ; WX 602 ; N uni2681 ; G 2768\nU 9858 ; WX 602 ; N uni2682 ; G 2769\nU 9859 ; WX 602 ; N uni2683 ; G 2770\nU 9860 ; WX 602 ; N uni2684 ; G 2771\nU 9861 ; WX 602 ; N uni2685 ; G 2772\nU 9862 ; WX 602 ; N uni2686 ; G 2773\nU 9863 ; WX 602 ; N uni2687 ; G 2774\nU 9864 ; WX 602 ; N uni2688 ; G 2775\nU 9865 ; WX 602 ; N uni2689 ; G 2776\nU 9866 ; WX 602 ; N uni268A ; G 2777\nU 9867 ; WX 602 ; N uni268B ; G 2778\nU 9872 ; WX 602 ; N uni2690 ; G 2779\nU 9873 ; WX 602 ; N uni2691 ; G 2780\nU 9874 ; WX 602 ; N uni2692 ; G 2781\nU 9875 ; WX 602 ; N uni2693 ; G 2782\nU 9876 ; WX 602 ; N uni2694 ; G 2783\nU 9877 ; WX 602 ; N uni2695 ; G 2784\nU 9878 ; WX 602 ; N uni2696 ; G 2785\nU 9879 ; WX 602 ; N uni2697 ; G 2786\nU 9880 ; WX 602 ; N uni2698 ; G 2787\nU 9881 ; WX 602 ; N uni2699 ; G 2788\nU 9882 ; WX 602 ; N uni269A ; G 2789\nU 9883 ; WX 602 ; N uni269B ; G 2790\nU 9884 ; WX 602 ; N uni269C ; G 2791\nU 9888 ; WX 602 ; N uni26A0 ; G 2792\nU 9889 ; WX 602 ; N uni26A1 ; G 2793\nU 9904 ; WX 602 ; N uni26B0 ; G 2794\nU 9905 ; WX 602 ; N uni26B1 ; G 2795\nU 9985 ; WX 602 ; N uni2701 ; G 2796\nU 9986 ; WX 602 ; N uni2702 ; G 2797\nU 9987 ; WX 602 ; N uni2703 ; G 2798\nU 9988 ; WX 602 ; N uni2704 ; G 2799\nU 9990 ; WX 602 ; N uni2706 ; G 2800\nU 9991 ; WX 602 ; N uni2707 ; G 2801\nU 9992 ; WX 602 ; N uni2708 ; G 2802\nU 9993 ; WX 602 ; N uni2709 ; G 2803\nU 9996 ; WX 602 ; N uni270C ; G 2804\nU 9997 ; WX 602 ; N uni270D ; G 2805\nU 9998 ; WX 602 ; N uni270E ; G 2806\nU 9999 ; WX 602 ; N uni270F ; G 2807\nU 10000 ; WX 602 ; N uni2710 ; G 2808\nU 10001 ; WX 602 ; N uni2711 ; G 2809\nU 10002 ; WX 602 ; N uni2712 ; G 2810\nU 10003 ; WX 602 ; N uni2713 ; G 2811\nU 10004 ; WX 602 ; N uni2714 ; G 2812\nU 10005 ; WX 602 ; N uni2715 ; G 2813\nU 10006 ; WX 602 ; N uni2716 ; G 2814\nU 10007 ; WX 602 ; N uni2717 ; G 2815\nU 10008 ; WX 602 ; N uni2718 ; G 2816\nU 10009 ; WX 602 ; N uni2719 ; G 2817\nU 10010 ; WX 602 ; N uni271A ; G 2818\nU 10011 ; WX 602 ; N uni271B ; G 2819\nU 10012 ; WX 602 ; N uni271C ; G 2820\nU 10013 ; WX 602 ; N uni271D ; G 2821\nU 10014 ; WX 602 ; N uni271E ; G 2822\nU 10015 ; WX 602 ; N uni271F ; G 2823\nU 10016 ; WX 602 ; N uni2720 ; G 2824\nU 10017 ; WX 602 ; N uni2721 ; G 2825\nU 10018 ; WX 602 ; N uni2722 ; G 2826\nU 10019 ; WX 602 ; N uni2723 ; G 2827\nU 10020 ; WX 602 ; N uni2724 ; G 2828\nU 10021 ; WX 602 ; N uni2725 ; G 2829\nU 10022 ; WX 602 ; N uni2726 ; G 2830\nU 10023 ; WX 602 ; N uni2727 ; G 2831\nU 10025 ; WX 602 ; N uni2729 ; G 2832\nU 10026 ; WX 602 ; N uni272A ; G 2833\nU 10027 ; WX 602 ; N uni272B ; G 2834\nU 10028 ; WX 602 ; N uni272C ; G 2835\nU 10029 ; WX 602 ; N uni272D ; G 2836\nU 10030 ; WX 602 ; N uni272E ; G 2837\nU 10031 ; WX 602 ; N uni272F ; G 2838\nU 10032 ; WX 602 ; N uni2730 ; G 2839\nU 10033 ; WX 602 ; N uni2731 ; G 2840\nU 10034 ; WX 602 ; N uni2732 ; G 2841\nU 10035 ; WX 602 ; N uni2733 ; G 2842\nU 10036 ; WX 602 ; N uni2734 ; G 2843\nU 10037 ; WX 602 ; N uni2735 ; G 2844\nU 10038 ; WX 602 ; N uni2736 ; G 2845\nU 10039 ; WX 602 ; N uni2737 ; G 2846\nU 10040 ; WX 602 ; N uni2738 ; G 2847\nU 10041 ; WX 602 ; N uni2739 ; G 2848\nU 10042 ; WX 602 ; N uni273A ; G 2849\nU 10043 ; WX 602 ; N uni273B ; G 2850\nU 10044 ; WX 602 ; N uni273C ; G 2851\nU 10045 ; WX 602 ; N uni273D ; G 2852\nU 10046 ; WX 602 ; N uni273E ; G 2853\nU 10047 ; WX 602 ; N uni273F ; G 2854\nU 10048 ; WX 602 ; N uni2740 ; G 2855\nU 10049 ; WX 602 ; N uni2741 ; G 2856\nU 10050 ; WX 602 ; N uni2742 ; G 2857\nU 10051 ; WX 602 ; N uni2743 ; G 2858\nU 10052 ; WX 602 ; N uni2744 ; G 2859\nU 10053 ; WX 602 ; N uni2745 ; G 2860\nU 10054 ; WX 602 ; N uni2746 ; G 2861\nU 10055 ; WX 602 ; N uni2747 ; G 2862\nU 10056 ; WX 602 ; N uni2748 ; G 2863\nU 10057 ; WX 602 ; N uni2749 ; G 2864\nU 10058 ; WX 602 ; N uni274A ; G 2865\nU 10059 ; WX 602 ; N uni274B ; G 2866\nU 10061 ; WX 602 ; N uni274D ; G 2867\nU 10063 ; WX 602 ; N uni274F ; G 2868\nU 10064 ; WX 602 ; N uni2750 ; G 2869\nU 10065 ; WX 602 ; N uni2751 ; G 2870\nU 10066 ; WX 602 ; N uni2752 ; G 2871\nU 10070 ; WX 602 ; N uni2756 ; G 2872\nU 10072 ; WX 602 ; N uni2758 ; G 2873\nU 10073 ; WX 602 ; N uni2759 ; G 2874\nU 10074 ; WX 602 ; N uni275A ; G 2875\nU 10075 ; WX 602 ; N uni275B ; G 2876\nU 10076 ; WX 602 ; N uni275C ; G 2877\nU 10077 ; WX 602 ; N uni275D ; G 2878\nU 10078 ; WX 602 ; N uni275E ; G 2879\nU 10081 ; WX 602 ; N uni2761 ; G 2880\nU 10082 ; WX 602 ; N uni2762 ; G 2881\nU 10083 ; WX 602 ; N uni2763 ; G 2882\nU 10084 ; WX 602 ; N uni2764 ; G 2883\nU 10085 ; WX 602 ; N uni2765 ; G 2884\nU 10086 ; WX 602 ; N uni2766 ; G 2885\nU 10087 ; WX 602 ; N uni2767 ; G 2886\nU 10088 ; WX 602 ; N uni2768 ; G 2887\nU 10089 ; WX 602 ; N uni2769 ; G 2888\nU 10090 ; WX 602 ; N uni276A ; G 2889\nU 10091 ; WX 602 ; N uni276B ; G 2890\nU 10092 ; WX 602 ; N uni276C ; G 2891\nU 10093 ; WX 602 ; N uni276D ; G 2892\nU 10094 ; WX 602 ; N uni276E ; G 2893\nU 10095 ; WX 602 ; N uni276F ; G 2894\nU 10096 ; WX 602 ; N uni2770 ; G 2895\nU 10097 ; WX 602 ; N uni2771 ; G 2896\nU 10098 ; WX 602 ; N uni2772 ; G 2897\nU 10099 ; WX 602 ; N uni2773 ; G 2898\nU 10100 ; WX 602 ; N uni2774 ; G 2899\nU 10101 ; WX 602 ; N uni2775 ; G 2900\nU 10132 ; WX 602 ; N uni2794 ; G 2901\nU 10136 ; WX 602 ; N uni2798 ; G 2902\nU 10137 ; WX 602 ; N uni2799 ; G 2903\nU 10138 ; WX 602 ; N uni279A ; G 2904\nU 10139 ; WX 602 ; N uni279B ; G 2905\nU 10140 ; WX 602 ; N uni279C ; G 2906\nU 10141 ; WX 602 ; N uni279D ; G 2907\nU 10142 ; WX 602 ; N uni279E ; G 2908\nU 10143 ; WX 602 ; N uni279F ; G 2909\nU 10144 ; WX 602 ; N uni27A0 ; G 2910\nU 10145 ; WX 602 ; N uni27A1 ; G 2911\nU 10146 ; WX 602 ; N uni27A2 ; G 2912\nU 10147 ; WX 602 ; N uni27A3 ; G 2913\nU 10148 ; WX 602 ; N uni27A4 ; G 2914\nU 10149 ; WX 602 ; N uni27A5 ; G 2915\nU 10150 ; WX 602 ; N uni27A6 ; G 2916\nU 10151 ; WX 602 ; N uni27A7 ; G 2917\nU 10152 ; WX 602 ; N uni27A8 ; G 2918\nU 10153 ; WX 602 ; N uni27A9 ; G 2919\nU 10154 ; WX 602 ; N uni27AA ; G 2920\nU 10155 ; WX 602 ; N uni27AB ; G 2921\nU 10156 ; WX 602 ; N uni27AC ; G 2922\nU 10157 ; WX 602 ; N uni27AD ; G 2923\nU 10158 ; WX 602 ; N uni27AE ; G 2924\nU 10159 ; WX 602 ; N uni27AF ; G 2925\nU 10161 ; WX 602 ; N uni27B1 ; G 2926\nU 10162 ; WX 602 ; N uni27B2 ; G 2927\nU 10163 ; WX 602 ; N uni27B3 ; G 2928\nU 10164 ; WX 602 ; N uni27B4 ; G 2929\nU 10165 ; WX 602 ; N uni27B5 ; G 2930\nU 10166 ; WX 602 ; N uni27B6 ; G 2931\nU 10167 ; WX 602 ; N uni27B7 ; G 2932\nU 10168 ; WX 602 ; N uni27B8 ; G 2933\nU 10169 ; WX 602 ; N uni27B9 ; G 2934\nU 10170 ; WX 602 ; N uni27BA ; G 2935\nU 10171 ; WX 602 ; N uni27BB ; G 2936\nU 10172 ; WX 602 ; N uni27BC ; G 2937\nU 10173 ; WX 602 ; N uni27BD ; G 2938\nU 10174 ; WX 602 ; N uni27BE ; G 2939\nU 10178 ; WX 602 ; N uni27C2 ; G 2940\nU 10181 ; WX 602 ; N uni27C5 ; G 2941\nU 10182 ; WX 602 ; N uni27C6 ; G 2942\nU 10204 ; WX 602 ; N uni27DC ; G 2943\nU 10208 ; WX 602 ; N uni27E0 ; G 2944\nU 10214 ; WX 602 ; N uni27E6 ; G 2945\nU 10215 ; WX 602 ; N uni27E7 ; G 2946\nU 10216 ; WX 602 ; N uni27E8 ; G 2947\nU 10217 ; WX 602 ; N uni27E9 ; G 2948\nU 10218 ; WX 602 ; N uni27EA ; G 2949\nU 10219 ; WX 602 ; N uni27EB ; G 2950\nU 10229 ; WX 602 ; N uni27F5 ; G 2951\nU 10230 ; WX 602 ; N uni27F6 ; G 2952\nU 10231 ; WX 602 ; N uni27F7 ; G 2953\nU 10631 ; WX 602 ; N uni2987 ; G 2954\nU 10632 ; WX 602 ; N uni2988 ; G 2955\nU 10647 ; WX 602 ; N uni2997 ; G 2956\nU 10648 ; WX 602 ; N uni2998 ; G 2957\nU 10731 ; WX 602 ; N uni29EB ; G 2958\nU 10746 ; WX 602 ; N uni29FA ; G 2959\nU 10747 ; WX 602 ; N uni29FB ; G 2960\nU 10752 ; WX 602 ; N uni2A00 ; G 2961\nU 10799 ; WX 602 ; N uni2A2F ; G 2962\nU 10858 ; WX 602 ; N uni2A6A ; G 2963\nU 10859 ; WX 602 ; N uni2A6B ; G 2964\nU 11013 ; WX 602 ; N uni2B05 ; G 2965\nU 11014 ; WX 602 ; N uni2B06 ; G 2966\nU 11015 ; WX 602 ; N uni2B07 ; G 2967\nU 11016 ; WX 602 ; N uni2B08 ; G 2968\nU 11017 ; WX 602 ; N uni2B09 ; G 2969\nU 11018 ; WX 602 ; N uni2B0A ; G 2970\nU 11019 ; WX 602 ; N uni2B0B ; G 2971\nU 11020 ; WX 602 ; N uni2B0C ; G 2972\nU 11021 ; WX 602 ; N uni2B0D ; G 2973\nU 11026 ; WX 602 ; N uni2B12 ; G 2974\nU 11027 ; WX 602 ; N uni2B13 ; G 2975\nU 11028 ; WX 602 ; N uni2B14 ; G 2976\nU 11029 ; WX 602 ; N uni2B15 ; G 2977\nU 11030 ; WX 602 ; N uni2B16 ; G 2978\nU 11031 ; WX 602 ; N uni2B17 ; G 2979\nU 11032 ; WX 602 ; N uni2B18 ; G 2980\nU 11033 ; WX 602 ; N uni2B19 ; G 2981\nU 11034 ; WX 602 ; N uni2B1A ; G 2982\nU 11364 ; WX 602 ; N uni2C64 ; G 2983\nU 11373 ; WX 602 ; N uni2C6D ; G 2984\nU 11374 ; WX 602 ; N uni2C6E ; G 2985\nU 11375 ; WX 602 ; N uni2C6F ; G 2986\nU 11376 ; WX 602 ; N uni2C70 ; G 2987\nU 11381 ; WX 602 ; N uni2C75 ; G 2988\nU 11382 ; WX 602 ; N uni2C76 ; G 2989\nU 11383 ; WX 602 ; N uni2C77 ; G 2990\nU 11385 ; WX 602 ; N uni2C79 ; G 2991\nU 11386 ; WX 602 ; N uni2C7A ; G 2992\nU 11388 ; WX 602 ; N uni2C7C ; G 2993\nU 11389 ; WX 602 ; N uni2C7D ; G 2994\nU 11390 ; WX 602 ; N uni2C7E ; G 2995\nU 11391 ; WX 602 ; N uni2C7F ; G 2996\nU 11800 ; WX 602 ; N uni2E18 ; G 2997\nU 11807 ; WX 602 ; N uni2E1F ; G 2998\nU 11810 ; WX 602 ; N uni2E22 ; G 2999\nU 11811 ; WX 602 ; N uni2E23 ; G 3000\nU 11812 ; WX 602 ; N uni2E24 ; G 3001\nU 11813 ; WX 602 ; N uni2E25 ; G 3002\nU 11822 ; WX 602 ; N uni2E2E ; G 3003\nU 42760 ; WX 602 ; N uniA708 ; G 3004\nU 42761 ; WX 602 ; N uniA709 ; G 3005\nU 42762 ; WX 602 ; N uniA70A ; G 3006\nU 42763 ; WX 602 ; N uniA70B ; G 3007\nU 42764 ; WX 602 ; N uniA70C ; G 3008\nU 42765 ; WX 602 ; N uniA70D ; G 3009\nU 42766 ; WX 602 ; N uniA70E ; G 3010\nU 42767 ; WX 602 ; N uniA70F ; G 3011\nU 42768 ; WX 602 ; N uniA710 ; G 3012\nU 42769 ; WX 602 ; N uniA711 ; G 3013\nU 42770 ; WX 602 ; N uniA712 ; G 3014\nU 42771 ; WX 602 ; N uniA713 ; G 3015\nU 42772 ; WX 602 ; N uniA714 ; G 3016\nU 42773 ; WX 602 ; N uniA715 ; G 3017\nU 42774 ; WX 602 ; N uniA716 ; G 3018\nU 42779 ; WX 602 ; N uniA71B ; G 3019\nU 42780 ; WX 602 ; N uniA71C ; G 3020\nU 42781 ; WX 602 ; N uniA71D ; G 3021\nU 42782 ; WX 602 ; N uniA71E ; G 3022\nU 42783 ; WX 602 ; N uniA71F ; G 3023\nU 42786 ; WX 602 ; N uniA722 ; G 3024\nU 42787 ; WX 602 ; N uniA723 ; G 3025\nU 42788 ; WX 602 ; N uniA724 ; G 3026\nU 42789 ; WX 602 ; N uniA725 ; G 3027\nU 42790 ; WX 602 ; N uniA726 ; G 3028\nU 42791 ; WX 602 ; N uniA727 ; G 3029\nU 42889 ; WX 602 ; N uniA789 ; G 3030\nU 42890 ; WX 602 ; N uniA78A ; G 3031\nU 42891 ; WX 602 ; N uniA78B ; G 3032\nU 42892 ; WX 602 ; N uniA78C ; G 3033\nU 42893 ; WX 602 ; N uniA78D ; G 3034\nU 42894 ; WX 602 ; N uniA78E ; G 3035\nU 42896 ; WX 602 ; N uniA790 ; G 3036\nU 42897 ; WX 602 ; N uniA791 ; G 3037\nU 42922 ; WX 602 ; N uniA7AA ; G 3038\nU 43000 ; WX 602 ; N uniA7F8 ; G 3039\nU 43001 ; WX 602 ; N uniA7F9 ; G 3040\nU 63173 ; WX 602 ; N uniF6C5 ; G 3041\nU 64257 ; WX 602 ; N fi ; G 3042\nU 64258 ; WX 602 ; N fl ; G 3043\nU 64338 ; WX 602 ; N uniFB52 ; G 3044\nU 64339 ; WX 602 ; N uniFB53 ; G 3045\nU 64340 ; WX 602 ; N uniFB54 ; G 3046\nU 64341 ; WX 602 ; N uniFB55 ; G 3047\nU 64342 ; WX 602 ; N uniFB56 ; G 3048\nU 64343 ; WX 602 ; N uniFB57 ; G 3049\nU 64344 ; WX 602 ; N uniFB58 ; G 3050\nU 64345 ; WX 602 ; N uniFB59 ; G 3051\nU 64346 ; WX 602 ; N uniFB5A ; G 3052\nU 64347 ; WX 602 ; N uniFB5B ; G 3053\nU 64348 ; WX 602 ; N uniFB5C ; G 3054\nU 64349 ; WX 602 ; N uniFB5D ; G 3055\nU 64350 ; WX 602 ; N uniFB5E ; G 3056\nU 64351 ; WX 602 ; N uniFB5F ; G 3057\nU 64352 ; WX 602 ; N uniFB60 ; G 3058\nU 64353 ; WX 602 ; N uniFB61 ; G 3059\nU 64354 ; WX 602 ; N uniFB62 ; G 3060\nU 64355 ; WX 602 ; N uniFB63 ; G 3061\nU 64356 ; WX 602 ; N uniFB64 ; G 3062\nU 64357 ; WX 602 ; N uniFB65 ; G 3063\nU 64358 ; WX 602 ; N uniFB66 ; G 3064\nU 64359 ; WX 602 ; N uniFB67 ; G 3065\nU 64360 ; WX 602 ; N uniFB68 ; G 3066\nU 64361 ; WX 602 ; N uniFB69 ; G 3067\nU 64362 ; WX 602 ; N uniFB6A ; G 3068\nU 64363 ; WX 602 ; N uniFB6B ; G 3069\nU 64364 ; WX 602 ; N uniFB6C ; G 3070\nU 64365 ; WX 602 ; N uniFB6D ; G 3071\nU 64366 ; WX 602 ; N uniFB6E ; G 3072\nU 64367 ; WX 602 ; N uniFB6F ; G 3073\nU 64368 ; WX 602 ; N uniFB70 ; G 3074\nU 64369 ; WX 602 ; N uniFB71 ; G 3075\nU 64370 ; WX 602 ; N uniFB72 ; G 3076\nU 64371 ; WX 602 ; N uniFB73 ; G 3077\nU 64372 ; WX 602 ; N uniFB74 ; G 3078\nU 64373 ; WX 602 ; N uniFB75 ; G 3079\nU 64374 ; WX 602 ; N uniFB76 ; G 3080\nU 64375 ; WX 602 ; N uniFB77 ; G 3081\nU 64376 ; WX 602 ; N uniFB78 ; G 3082\nU 64377 ; WX 602 ; N uniFB79 ; G 3083\nU 64378 ; WX 602 ; N uniFB7A ; G 3084\nU 64379 ; WX 602 ; N uniFB7B ; G 3085\nU 64380 ; WX 602 ; N uniFB7C ; G 3086\nU 64381 ; WX 602 ; N uniFB7D ; G 3087\nU 64382 ; WX 602 ; N uniFB7E ; G 3088\nU 64383 ; WX 602 ; N uniFB7F ; G 3089\nU 64384 ; WX 602 ; N uniFB80 ; G 3090\nU 64385 ; WX 602 ; N uniFB81 ; G 3091\nU 64394 ; WX 602 ; N uniFB8A ; G 3092\nU 64395 ; WX 602 ; N uniFB8B ; G 3093\nU 64396 ; WX 602 ; N uniFB8C ; G 3094\nU 64397 ; WX 602 ; N uniFB8D ; G 3095\nU 64398 ; WX 602 ; N uniFB8E ; G 3096\nU 64399 ; WX 602 ; N uniFB8F ; G 3097\nU 64400 ; WX 602 ; N uniFB90 ; G 3098\nU 64401 ; WX 602 ; N uniFB91 ; G 3099\nU 64402 ; WX 602 ; N uniFB92 ; G 3100\nU 64403 ; WX 602 ; N uniFB93 ; G 3101\nU 64404 ; WX 602 ; N uniFB94 ; G 3102\nU 64405 ; WX 602 ; N uniFB95 ; G 3103\nU 64414 ; WX 602 ; N uniFB9E ; G 3104\nU 64415 ; WX 602 ; N uniFB9F ; G 3105\nU 64426 ; WX 602 ; N uniFBAA ; G 3106\nU 64427 ; WX 602 ; N uniFBAB ; G 3107\nU 64428 ; WX 602 ; N uniFBAC ; G 3108\nU 64429 ; WX 602 ; N uniFBAD ; G 3109\nU 64488 ; WX 602 ; N uniFBE8 ; G 3110\nU 64489 ; WX 602 ; N uniFBE9 ; G 3111\nU 64508 ; WX 602 ; N uniFBFC ; G 3112\nU 64509 ; WX 602 ; N uniFBFD ; G 3113\nU 64510 ; WX 602 ; N uniFBFE ; G 3114\nU 64511 ; WX 602 ; N uniFBFF ; G 3115\nU 65136 ; WX 602 ; N uniFE70 ; G 3116\nU 65137 ; WX 602 ; N uniFE71 ; G 3117\nU 65138 ; WX 602 ; N uniFE72 ; G 3118\nU 65139 ; WX 602 ; N uniFE73 ; G 3119\nU 65140 ; WX 602 ; N uniFE74 ; G 3120\nU 65142 ; WX 602 ; N uniFE76 ; G 3121\nU 65143 ; WX 602 ; N uniFE77 ; G 3122\nU 65144 ; WX 602 ; N uniFE78 ; G 3123\nU 65145 ; WX 602 ; N uniFE79 ; G 3124\nU 65146 ; WX 602 ; N uniFE7A ; G 3125\nU 65147 ; WX 602 ; N uniFE7B ; G 3126\nU 65148 ; WX 602 ; N uniFE7C ; G 3127\nU 65149 ; WX 602 ; N uniFE7D ; G 3128\nU 65150 ; WX 602 ; N uniFE7E ; G 3129\nU 65151 ; WX 602 ; N uniFE7F ; G 3130\nU 65152 ; WX 602 ; N uniFE80 ; G 3131\nU 65153 ; WX 602 ; N uniFE81 ; G 3132\nU 65154 ; WX 602 ; N uniFE82 ; G 3133\nU 65155 ; WX 602 ; N uniFE83 ; G 3134\nU 65156 ; WX 602 ; N uniFE84 ; G 3135\nU 65157 ; WX 602 ; N uniFE85 ; G 3136\nU 65158 ; WX 602 ; N uniFE86 ; G 3137\nU 65159 ; WX 602 ; N uniFE87 ; G 3138\nU 65160 ; WX 602 ; N uniFE88 ; G 3139\nU 65161 ; WX 602 ; N uniFE89 ; G 3140\nU 65162 ; WX 602 ; N uniFE8A ; G 3141\nU 65163 ; WX 602 ; N uniFE8B ; G 3142\nU 65164 ; WX 602 ; N uniFE8C ; G 3143\nU 65165 ; WX 602 ; N uniFE8D ; G 3144\nU 65166 ; WX 602 ; N uniFE8E ; G 3145\nU 65167 ; WX 602 ; N uniFE8F ; G 3146\nU 65168 ; WX 602 ; N uniFE90 ; G 3147\nU 65169 ; WX 602 ; N uniFE91 ; G 3148\nU 65170 ; WX 602 ; N uniFE92 ; G 3149\nU 65171 ; WX 602 ; N uniFE93 ; G 3150\nU 65172 ; WX 602 ; N uniFE94 ; G 3151\nU 65173 ; WX 602 ; N uniFE95 ; G 3152\nU 65174 ; WX 602 ; N uniFE96 ; G 3153\nU 65175 ; WX 602 ; N uniFE97 ; G 3154\nU 65176 ; WX 602 ; N uniFE98 ; G 3155\nU 65177 ; WX 602 ; N uniFE99 ; G 3156\nU 65178 ; WX 602 ; N uniFE9A ; G 3157\nU 65179 ; WX 602 ; N uniFE9B ; G 3158\nU 65180 ; WX 602 ; N uniFE9C ; G 3159\nU 65181 ; WX 602 ; N uniFE9D ; G 3160\nU 65182 ; WX 602 ; N uniFE9E ; G 3161\nU 65183 ; WX 602 ; N uniFE9F ; G 3162\nU 65184 ; WX 602 ; N uniFEA0 ; G 3163\nU 65185 ; WX 602 ; N uniFEA1 ; G 3164\nU 65186 ; WX 602 ; N uniFEA2 ; G 3165\nU 65187 ; WX 602 ; N uniFEA3 ; G 3166\nU 65188 ; WX 602 ; N uniFEA4 ; G 3167\nU 65189 ; WX 602 ; N uniFEA5 ; G 3168\nU 65190 ; WX 602 ; N uniFEA6 ; G 3169\nU 65191 ; WX 602 ; N uniFEA7 ; G 3170\nU 65192 ; WX 602 ; N uniFEA8 ; G 3171\nU 65193 ; WX 602 ; N uniFEA9 ; G 3172\nU 65194 ; WX 602 ; N uniFEAA ; G 3173\nU 65195 ; WX 602 ; N uniFEAB ; G 3174\nU 65196 ; WX 602 ; N uniFEAC ; G 3175\nU 65197 ; WX 602 ; N uniFEAD ; G 3176\nU 65198 ; WX 602 ; N uniFEAE ; G 3177\nU 65199 ; WX 602 ; N uniFEAF ; G 3178\nU 65200 ; WX 602 ; N uniFEB0 ; G 3179\nU 65201 ; WX 602 ; N uniFEB1 ; G 3180\nU 65202 ; WX 602 ; N uniFEB2 ; G 3181\nU 65203 ; WX 602 ; N uniFEB3 ; G 3182\nU 65204 ; WX 602 ; N uniFEB4 ; G 3183\nU 65205 ; WX 602 ; N uniFEB5 ; G 3184\nU 65206 ; WX 602 ; N uniFEB6 ; G 3185\nU 65207 ; WX 602 ; N uniFEB7 ; G 3186\nU 65208 ; WX 602 ; N uniFEB8 ; G 3187\nU 65209 ; WX 602 ; N uniFEB9 ; G 3188\nU 65210 ; WX 602 ; N uniFEBA ; G 3189\nU 65211 ; WX 602 ; N uniFEBB ; G 3190\nU 65212 ; WX 602 ; N uniFEBC ; G 3191\nU 65213 ; WX 602 ; N uniFEBD ; G 3192\nU 65214 ; WX 602 ; N uniFEBE ; G 3193\nU 65215 ; WX 602 ; N uniFEBF ; G 3194\nU 65216 ; WX 602 ; N uniFEC0 ; G 3195\nU 65217 ; WX 602 ; N uniFEC1 ; G 3196\nU 65218 ; WX 602 ; N uniFEC2 ; G 3197\nU 65219 ; WX 602 ; N uniFEC3 ; G 3198\nU 65220 ; WX 602 ; N uniFEC4 ; G 3199\nU 65221 ; WX 602 ; N uniFEC5 ; G 3200\nU 65222 ; WX 602 ; N uniFEC6 ; G 3201\nU 65223 ; WX 602 ; N uniFEC7 ; G 3202\nU 65224 ; WX 602 ; N uniFEC8 ; G 3203\nU 65225 ; WX 602 ; N uniFEC9 ; G 3204\nU 65226 ; WX 602 ; N uniFECA ; G 3205\nU 65227 ; WX 602 ; N uniFECB ; G 3206\nU 65228 ; WX 602 ; N uniFECC ; G 3207\nU 65229 ; WX 602 ; N uniFECD ; G 3208\nU 65230 ; WX 602 ; N uniFECE ; G 3209\nU 65231 ; WX 602 ; N uniFECF ; G 3210\nU 65232 ; WX 602 ; N uniFED0 ; G 3211\nU 65233 ; WX 602 ; N uniFED1 ; G 3212\nU 65234 ; WX 602 ; N uniFED2 ; G 3213\nU 65235 ; WX 602 ; N uniFED3 ; G 3214\nU 65236 ; WX 602 ; N uniFED4 ; G 3215\nU 65237 ; WX 602 ; N uniFED5 ; G 3216\nU 65238 ; WX 602 ; N uniFED6 ; G 3217\nU 65239 ; WX 602 ; N uniFED7 ; G 3218\nU 65240 ; WX 602 ; N uniFED8 ; G 3219\nU 65241 ; WX 602 ; N uniFED9 ; G 3220\nU 65242 ; WX 602 ; N uniFEDA ; G 3221\nU 65243 ; WX 602 ; N uniFEDB ; G 3222\nU 65244 ; WX 602 ; N uniFEDC ; G 3223\nU 65245 ; WX 602 ; N uniFEDD ; G 3224\nU 65246 ; WX 602 ; N uniFEDE ; G 3225\nU 65247 ; WX 602 ; N uniFEDF ; G 3226\nU 65248 ; WX 602 ; N uniFEE0 ; G 3227\nU 65249 ; WX 602 ; N uniFEE1 ; G 3228\nU 65250 ; WX 602 ; N uniFEE2 ; G 3229\nU 65251 ; WX 602 ; N uniFEE3 ; G 3230\nU 65252 ; WX 602 ; N uniFEE4 ; G 3231\nU 65253 ; WX 602 ; N uniFEE5 ; G 3232\nU 65254 ; WX 602 ; N uniFEE6 ; G 3233\nU 65255 ; WX 602 ; N uniFEE7 ; G 3234\nU 65256 ; WX 602 ; N uniFEE8 ; G 3235\nU 65257 ; WX 602 ; N uniFEE9 ; G 3236\nU 65258 ; WX 602 ; N uniFEEA ; G 3237\nU 65259 ; WX 602 ; N uniFEEB ; G 3238\nU 65260 ; WX 602 ; N uniFEEC ; G 3239\nU 65261 ; WX 602 ; N uniFEED ; G 3240\nU 65262 ; WX 602 ; N uniFEEE ; G 3241\nU 65263 ; WX 602 ; N uniFEEF ; G 3242\nU 65264 ; WX 602 ; N uniFEF0 ; G 3243\nU 65265 ; WX 602 ; N uniFEF1 ; G 3244\nU 65266 ; WX 602 ; N uniFEF2 ; G 3245\nU 65267 ; WX 602 ; N uniFEF3 ; G 3246\nU 65268 ; WX 602 ; N uniFEF4 ; G 3247\nU 65269 ; WX 602 ; N uniFEF5 ; G 3248\nU 65270 ; WX 602 ; N uniFEF6 ; G 3249\nU 65271 ; WX 602 ; N uniFEF7 ; G 3250\nU 65272 ; WX 602 ; N uniFEF8 ; G 3251\nU 65273 ; WX 602 ; N uniFEF9 ; G 3252\nU 65274 ; WX 602 ; N uniFEFA ; G 3253\nU 65275 ; WX 602 ; N uniFEFB ; G 3254\nU 65276 ; WX 602 ; N uniFEFC ; G 3255\nU 65279 ; WX 602 ; N uniFEFF ; G 3256\nU 65529 ; WX 602 ; N uniFFF9 ; G 3257\nU 65530 ; WX 602 ; N uniFFFA ; G 3258\nU 65531 ; WX 602 ; N uniFFFB ; G 3259\nU 65532 ; WX 602 ; N uniFFFC ; G 3260\nU 65533 ; WX 602 ; N uniFFFD ; G 3261\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSerif-Bold.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Serif\nFontSubfamily Bold\nUniqueID DejaVu Serif Bold\nFullName DejaVu Serif Bold\nVersion Version 2.37\nPostScriptName DejaVuSerif-Bold\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Serif\nPreferredSubfamily Bold\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 939\nDescender -236\nFontBBox -836 -389 1854 1145\nStartCharMetrics 3506\nU 32 ; WX 348 ; N space ; G 3\nU 33 ; WX 439 ; N exclam ; G 4\nU 34 ; WX 521 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 696 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 903 ; N ampersand ; G 9\nU 39 ; WX 306 ; N quotesingle ; G 10\nU 40 ; WX 473 ; N parenleft ; G 11\nU 41 ; WX 473 ; N parenright ; G 12\nU 42 ; WX 523 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 348 ; N comma ; G 15\nU 45 ; WX 415 ; N hyphen ; G 16\nU 46 ; WX 348 ; N period ; G 17\nU 47 ; WX 365 ; N slash ; G 18\nU 48 ; WX 696 ; N zero ; G 19\nU 49 ; WX 696 ; N one ; G 20\nU 50 ; WX 696 ; N two ; G 21\nU 51 ; WX 696 ; N three ; G 22\nU 52 ; WX 696 ; N four ; G 23\nU 53 ; WX 696 ; N five ; G 24\nU 54 ; WX 696 ; N six ; G 25\nU 55 ; WX 696 ; N seven ; G 26\nU 56 ; WX 696 ; N eight ; G 27\nU 57 ; WX 696 ; N nine ; G 28\nU 58 ; WX 369 ; N colon ; G 29\nU 59 ; WX 369 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 586 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 776 ; N A ; G 36\nU 66 ; WX 845 ; N B ; G 37\nU 67 ; WX 796 ; N C ; G 38\nU 68 ; WX 867 ; N D ; G 39\nU 69 ; WX 762 ; N E ; G 40\nU 70 ; WX 710 ; N F ; G 41\nU 71 ; WX 854 ; N G ; G 42\nU 72 ; WX 945 ; N H ; G 43\nU 73 ; WX 468 ; N I ; G 44\nU 74 ; WX 473 ; N J ; G 45\nU 75 ; WX 869 ; N K ; G 46\nU 76 ; WX 703 ; N L ; G 47\nU 77 ; WX 1107 ; N M ; G 48\nU 78 ; WX 914 ; N N ; G 49\nU 79 ; WX 871 ; N O ; G 50\nU 80 ; WX 752 ; N P ; G 51\nU 81 ; WX 871 ; N Q ; G 52\nU 82 ; WX 831 ; N R ; G 53\nU 83 ; WX 722 ; N S ; G 54\nU 84 ; WX 744 ; N T ; G 55\nU 85 ; WX 872 ; N U ; G 56\nU 86 ; WX 776 ; N V ; G 57\nU 87 ; WX 1123 ; N W ; G 58\nU 88 ; WX 776 ; N X ; G 59\nU 89 ; WX 714 ; N Y ; G 60\nU 90 ; WX 730 ; N Z ; G 61\nU 91 ; WX 473 ; N bracketleft ; G 62\nU 92 ; WX 365 ; N backslash ; G 63\nU 93 ; WX 473 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 648 ; N a ; G 68\nU 98 ; WX 699 ; N b ; G 69\nU 99 ; WX 609 ; N c ; G 70\nU 100 ; WX 699 ; N d ; G 71\nU 101 ; WX 636 ; N e ; G 72\nU 102 ; WX 430 ; N f ; G 73\nU 103 ; WX 699 ; N g ; G 74\nU 104 ; WX 727 ; N h ; G 75\nU 105 ; WX 380 ; N i ; G 76\nU 106 ; WX 362 ; N j ; G 77\nU 107 ; WX 693 ; N k ; G 78\nU 108 ; WX 380 ; N l ; G 79\nU 109 ; WX 1058 ; N m ; G 80\nU 110 ; WX 727 ; N n ; G 81\nU 111 ; WX 667 ; N o ; G 82\nU 112 ; WX 699 ; N p ; G 83\nU 113 ; WX 699 ; N q ; G 84\nU 114 ; WX 527 ; N r ; G 85\nU 115 ; WX 563 ; N s ; G 86\nU 116 ; WX 462 ; N t ; G 87\nU 117 ; WX 727 ; N u ; G 88\nU 118 ; WX 581 ; N v ; G 89\nU 119 ; WX 861 ; N w ; G 90\nU 120 ; WX 596 ; N x ; G 91\nU 121 ; WX 581 ; N y ; G 92\nU 122 ; WX 568 ; N z ; G 93\nU 123 ; WX 643 ; N braceleft ; G 94\nU 124 ; WX 364 ; N bar ; G 95\nU 125 ; WX 643 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 348 ; N nbspace ; G 98\nU 161 ; WX 439 ; N exclamdown ; G 99\nU 162 ; WX 696 ; N cent ; G 100\nU 163 ; WX 696 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 696 ; N yen ; G 103\nU 166 ; WX 364 ; N brokenbar ; G 104\nU 167 ; WX 523 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 487 ; N ordfeminine ; G 108\nU 171 ; WX 625 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 415 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 438 ; N twosuperior ; G 116\nU 179 ; WX 438 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 732 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 348 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 438 ; N onesuperior ; G 123\nU 186 ; WX 500 ; N ordmasculine ; G 124\nU 187 ; WX 625 ; N guillemotright ; G 125\nU 188 ; WX 1043 ; N onequarter ; G 126\nU 189 ; WX 1043 ; N onehalf ; G 127\nU 190 ; WX 1043 ; N threequarters ; G 128\nU 191 ; WX 586 ; N questiondown ; G 129\nU 192 ; WX 776 ; N Agrave ; G 130\nU 193 ; WX 776 ; N Aacute ; G 131\nU 194 ; WX 776 ; N Acircumflex ; G 132\nU 195 ; WX 776 ; N Atilde ; G 133\nU 196 ; WX 776 ; N Adieresis ; G 134\nU 197 ; WX 776 ; N Aring ; G 135\nU 198 ; WX 1034 ; N AE ; G 136\nU 199 ; WX 796 ; N Ccedilla ; G 137\nU 200 ; WX 762 ; N Egrave ; G 138\nU 201 ; WX 762 ; N Eacute ; G 139\nU 202 ; WX 762 ; N Ecircumflex ; G 140\nU 203 ; WX 762 ; N Edieresis ; G 141\nU 204 ; WX 468 ; N Igrave ; G 142\nU 205 ; WX 468 ; N Iacute ; G 143\nU 206 ; WX 468 ; N Icircumflex ; G 144\nU 207 ; WX 468 ; N Idieresis ; G 145\nU 208 ; WX 874 ; N Eth ; G 146\nU 209 ; WX 914 ; N Ntilde ; G 147\nU 210 ; WX 871 ; N Ograve ; G 148\nU 211 ; WX 871 ; N Oacute ; G 149\nU 212 ; WX 871 ; N Ocircumflex ; G 150\nU 213 ; WX 871 ; N Otilde ; G 151\nU 214 ; WX 871 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 871 ; N Oslash ; G 154\nU 217 ; WX 872 ; N Ugrave ; G 155\nU 218 ; WX 872 ; N Uacute ; G 156\nU 219 ; WX 872 ; N Ucircumflex ; G 157\nU 220 ; WX 872 ; N Udieresis ; G 158\nU 221 ; WX 714 ; N Yacute ; G 159\nU 222 ; WX 757 ; N Thorn ; G 160\nU 223 ; WX 760 ; N germandbls ; G 161\nU 224 ; WX 648 ; N agrave ; G 162\nU 225 ; WX 648 ; N aacute ; G 163\nU 226 ; WX 648 ; N acircumflex ; G 164\nU 227 ; WX 648 ; N atilde ; G 165\nU 228 ; WX 648 ; N adieresis ; G 166\nU 229 ; WX 648 ; N aring ; G 167\nU 230 ; WX 975 ; N ae ; G 168\nU 231 ; WX 609 ; N ccedilla ; G 169\nU 232 ; WX 636 ; N egrave ; G 170\nU 233 ; WX 636 ; N eacute ; G 171\nU 234 ; WX 636 ; N ecircumflex ; G 172\nU 235 ; WX 636 ; N edieresis ; G 173\nU 236 ; WX 380 ; N igrave ; G 174\nU 237 ; WX 380 ; N iacute ; G 175\nU 238 ; WX 380 ; N icircumflex ; G 176\nU 239 ; WX 380 ; N idieresis ; G 177\nU 240 ; WX 667 ; N eth ; G 178\nU 241 ; WX 727 ; N ntilde ; G 179\nU 242 ; WX 667 ; N ograve ; G 180\nU 243 ; WX 667 ; N oacute ; G 181\nU 244 ; WX 667 ; N ocircumflex ; G 182\nU 245 ; WX 667 ; N otilde ; G 183\nU 246 ; WX 667 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 667 ; N oslash ; G 186\nU 249 ; WX 727 ; N ugrave ; G 187\nU 250 ; WX 727 ; N uacute ; G 188\nU 251 ; WX 727 ; N ucircumflex ; G 189\nU 252 ; WX 727 ; N udieresis ; G 190\nU 253 ; WX 581 ; N yacute ; G 191\nU 254 ; WX 699 ; N thorn ; G 192\nU 255 ; WX 581 ; N ydieresis ; G 193\nU 256 ; WX 776 ; N Amacron ; G 194\nU 257 ; WX 648 ; N amacron ; G 195\nU 258 ; WX 776 ; N Abreve ; G 196\nU 259 ; WX 648 ; N abreve ; G 197\nU 260 ; WX 776 ; N Aogonek ; G 198\nU 261 ; WX 648 ; N aogonek ; G 199\nU 262 ; WX 796 ; N Cacute ; G 200\nU 263 ; WX 609 ; N cacute ; G 201\nU 264 ; WX 796 ; N Ccircumflex ; G 202\nU 265 ; WX 609 ; N ccircumflex ; G 203\nU 266 ; WX 796 ; N Cdotaccent ; G 204\nU 267 ; WX 609 ; N cdotaccent ; G 205\nU 268 ; WX 796 ; N Ccaron ; G 206\nU 269 ; WX 609 ; N ccaron ; G 207\nU 270 ; WX 867 ; N Dcaron ; G 208\nU 271 ; WX 699 ; N dcaron ; G 209\nU 272 ; WX 874 ; N Dcroat ; G 210\nU 273 ; WX 699 ; N dmacron ; G 211\nU 274 ; WX 762 ; N Emacron ; G 212\nU 275 ; WX 636 ; N emacron ; G 213\nU 276 ; WX 762 ; N Ebreve ; G 214\nU 277 ; WX 636 ; N ebreve ; G 215\nU 278 ; WX 762 ; N Edotaccent ; G 216\nU 279 ; WX 636 ; N edotaccent ; G 217\nU 280 ; WX 762 ; N Eogonek ; G 218\nU 281 ; WX 636 ; N eogonek ; G 219\nU 282 ; WX 762 ; N Ecaron ; G 220\nU 283 ; WX 636 ; N ecaron ; G 221\nU 284 ; WX 854 ; N Gcircumflex ; G 222\nU 285 ; WX 699 ; N gcircumflex ; G 223\nU 286 ; WX 854 ; N Gbreve ; G 224\nU 287 ; WX 699 ; N gbreve ; G 225\nU 288 ; WX 854 ; N Gdotaccent ; G 226\nU 289 ; WX 699 ; N gdotaccent ; G 227\nU 290 ; WX 854 ; N Gcommaaccent ; G 228\nU 291 ; WX 699 ; N gcommaaccent ; G 229\nU 292 ; WX 945 ; N Hcircumflex ; G 230\nU 293 ; WX 727 ; N hcircumflex ; G 231\nU 294 ; WX 945 ; N Hbar ; G 232\nU 295 ; WX 727 ; N hbar ; G 233\nU 296 ; WX 468 ; N Itilde ; G 234\nU 297 ; WX 380 ; N itilde ; G 235\nU 298 ; WX 468 ; N Imacron ; G 236\nU 299 ; WX 380 ; N imacron ; G 237\nU 300 ; WX 468 ; N Ibreve ; G 238\nU 301 ; WX 380 ; N ibreve ; G 239\nU 302 ; WX 468 ; N Iogonek ; G 240\nU 303 ; WX 380 ; N iogonek ; G 241\nU 304 ; WX 468 ; N Idot ; G 242\nU 305 ; WX 380 ; N dotlessi ; G 243\nU 306 ; WX 942 ; N IJ ; G 244\nU 307 ; WX 751 ; N ij ; G 245\nU 308 ; WX 473 ; N Jcircumflex ; G 246\nU 309 ; WX 362 ; N jcircumflex ; G 247\nU 310 ; WX 869 ; N Kcommaaccent ; G 248\nU 311 ; WX 693 ; N kcommaaccent ; G 249\nU 312 ; WX 693 ; N kgreenlandic ; G 250\nU 313 ; WX 703 ; N Lacute ; G 251\nU 314 ; WX 380 ; N lacute ; G 252\nU 315 ; WX 703 ; N Lcommaaccent ; G 253\nU 316 ; WX 380 ; N lcommaaccent ; G 254\nU 317 ; WX 703 ; N Lcaron ; G 255\nU 318 ; WX 380 ; N lcaron ; G 256\nU 319 ; WX 703 ; N Ldot ; G 257\nU 320 ; WX 380 ; N ldot ; G 258\nU 321 ; WX 710 ; N Lslash ; G 259\nU 322 ; WX 385 ; N lslash ; G 260\nU 323 ; WX 914 ; N Nacute ; G 261\nU 324 ; WX 727 ; N nacute ; G 262\nU 325 ; WX 914 ; N Ncommaaccent ; G 263\nU 326 ; WX 727 ; N ncommaaccent ; G 264\nU 327 ; WX 914 ; N Ncaron ; G 265\nU 328 ; WX 727 ; N ncaron ; G 266\nU 329 ; WX 1008 ; N napostrophe ; G 267\nU 330 ; WX 872 ; N Eng ; G 268\nU 331 ; WX 727 ; N eng ; G 269\nU 332 ; WX 871 ; N Omacron ; G 270\nU 333 ; WX 667 ; N omacron ; G 271\nU 334 ; WX 871 ; N Obreve ; G 272\nU 335 ; WX 667 ; N obreve ; G 273\nU 336 ; WX 871 ; N Ohungarumlaut ; G 274\nU 337 ; WX 667 ; N ohungarumlaut ; G 275\nU 338 ; WX 1180 ; N OE ; G 276\nU 339 ; WX 1028 ; N oe ; G 277\nU 340 ; WX 831 ; N Racute ; G 278\nU 341 ; WX 527 ; N racute ; G 279\nU 342 ; WX 831 ; N Rcommaaccent ; G 280\nU 343 ; WX 527 ; N rcommaaccent ; G 281\nU 344 ; WX 831 ; N Rcaron ; G 282\nU 345 ; WX 527 ; N rcaron ; G 283\nU 346 ; WX 722 ; N Sacute ; G 284\nU 347 ; WX 563 ; N sacute ; G 285\nU 348 ; WX 722 ; N Scircumflex ; G 286\nU 349 ; WX 563 ; N scircumflex ; G 287\nU 350 ; WX 722 ; N Scedilla ; G 288\nU 351 ; WX 563 ; N scedilla ; G 289\nU 352 ; WX 722 ; N Scaron ; G 290\nU 353 ; WX 563 ; N scaron ; G 291\nU 354 ; WX 744 ; N Tcommaaccent ; G 292\nU 355 ; WX 462 ; N tcommaaccent ; G 293\nU 356 ; WX 744 ; N Tcaron ; G 294\nU 357 ; WX 462 ; N tcaron ; G 295\nU 358 ; WX 744 ; N Tbar ; G 296\nU 359 ; WX 462 ; N tbar ; G 297\nU 360 ; WX 872 ; N Utilde ; G 298\nU 361 ; WX 727 ; N utilde ; G 299\nU 362 ; WX 872 ; N Umacron ; G 300\nU 363 ; WX 727 ; N umacron ; G 301\nU 364 ; WX 872 ; N Ubreve ; G 302\nU 365 ; WX 727 ; N ubreve ; G 303\nU 366 ; WX 872 ; N Uring ; G 304\nU 367 ; WX 727 ; N uring ; G 305\nU 368 ; WX 872 ; N Uhungarumlaut ; G 306\nU 369 ; WX 727 ; N uhungarumlaut ; G 307\nU 370 ; WX 872 ; N Uogonek ; G 308\nU 371 ; WX 727 ; N uogonek ; G 309\nU 372 ; WX 1123 ; N Wcircumflex ; G 310\nU 373 ; WX 861 ; N wcircumflex ; G 311\nU 374 ; WX 714 ; N Ycircumflex ; G 312\nU 375 ; WX 581 ; N ycircumflex ; G 313\nU 376 ; WX 714 ; N Ydieresis ; G 314\nU 377 ; WX 730 ; N Zacute ; G 315\nU 378 ; WX 568 ; N zacute ; G 316\nU 379 ; WX 730 ; N Zdotaccent ; G 317\nU 380 ; WX 568 ; N zdotaccent ; G 318\nU 381 ; WX 730 ; N Zcaron ; G 319\nU 382 ; WX 568 ; N zcaron ; G 320\nU 383 ; WX 430 ; N longs ; G 321\nU 384 ; WX 699 ; N uni0180 ; G 322\nU 385 ; WX 845 ; N uni0181 ; G 323\nU 386 ; WX 854 ; N uni0182 ; G 324\nU 387 ; WX 699 ; N uni0183 ; G 325\nU 388 ; WX 854 ; N uni0184 ; G 326\nU 389 ; WX 699 ; N uni0185 ; G 327\nU 390 ; WX 796 ; N uni0186 ; G 328\nU 391 ; WX 796 ; N uni0187 ; G 329\nU 392 ; WX 609 ; N uni0188 ; G 330\nU 393 ; WX 874 ; N uni0189 ; G 331\nU 394 ; WX 867 ; N uni018A ; G 332\nU 395 ; WX 854 ; N uni018B ; G 333\nU 396 ; WX 699 ; N uni018C ; G 334\nU 397 ; WX 667 ; N uni018D ; G 335\nU 398 ; WX 762 ; N uni018E ; G 336\nU 399 ; WX 871 ; N uni018F ; G 337\nU 400 ; WX 721 ; N uni0190 ; G 338\nU 401 ; WX 710 ; N uni0191 ; G 339\nU 402 ; WX 430 ; N florin ; G 340\nU 403 ; WX 854 ; N uni0193 ; G 341\nU 404 ; WX 771 ; N uni0194 ; G 342\nU 405 ; WX 1043 ; N uni0195 ; G 343\nU 406 ; WX 468 ; N uni0196 ; G 344\nU 407 ; WX 468 ; N uni0197 ; G 345\nU 408 ; WX 869 ; N uni0198 ; G 346\nU 409 ; WX 693 ; N uni0199 ; G 347\nU 410 ; WX 380 ; N uni019A ; G 348\nU 411 ; WX 701 ; N uni019B ; G 349\nU 412 ; WX 1058 ; N uni019C ; G 350\nU 413 ; WX 914 ; N uni019D ; G 351\nU 414 ; WX 727 ; N uni019E ; G 352\nU 415 ; WX 871 ; N uni019F ; G 353\nU 416 ; WX 871 ; N Ohorn ; G 354\nU 417 ; WX 667 ; N ohorn ; G 355\nU 418 ; WX 1200 ; N uni01A2 ; G 356\nU 419 ; WX 943 ; N uni01A3 ; G 357\nU 420 ; WX 752 ; N uni01A4 ; G 358\nU 421 ; WX 699 ; N uni01A5 ; G 359\nU 422 ; WX 831 ; N uni01A6 ; G 360\nU 423 ; WX 722 ; N uni01A7 ; G 361\nU 424 ; WX 563 ; N uni01A8 ; G 362\nU 425 ; WX 707 ; N uni01A9 ; G 363\nU 426 ; WX 331 ; N uni01AA ; G 364\nU 427 ; WX 462 ; N uni01AB ; G 365\nU 428 ; WX 744 ; N uni01AC ; G 366\nU 429 ; WX 462 ; N uni01AD ; G 367\nU 430 ; WX 744 ; N uni01AE ; G 368\nU 431 ; WX 872 ; N Uhorn ; G 369\nU 432 ; WX 727 ; N uhorn ; G 370\nU 433 ; WX 890 ; N uni01B1 ; G 371\nU 434 ; WX 890 ; N uni01B2 ; G 372\nU 435 ; WX 714 ; N uni01B3 ; G 373\nU 436 ; WX 708 ; N uni01B4 ; G 374\nU 437 ; WX 730 ; N uni01B5 ; G 375\nU 438 ; WX 568 ; N uni01B6 ; G 376\nU 439 ; WX 657 ; N uni01B7 ; G 377\nU 440 ; WX 657 ; N uni01B8 ; G 378\nU 441 ; WX 657 ; N uni01B9 ; G 379\nU 442 ; WX 657 ; N uni01BA ; G 380\nU 443 ; WX 696 ; N uni01BB ; G 381\nU 444 ; WX 754 ; N uni01BC ; G 382\nU 445 ; WX 568 ; N uni01BD ; G 383\nU 446 ; WX 536 ; N uni01BE ; G 384\nU 447 ; WX 716 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1597 ; N uni01C4 ; G 390\nU 453 ; WX 1435 ; N uni01C5 ; G 391\nU 454 ; WX 1267 ; N uni01C6 ; G 392\nU 455 ; WX 1176 ; N uni01C7 ; G 393\nU 456 ; WX 1065 ; N uni01C8 ; G 394\nU 457 ; WX 742 ; N uni01C9 ; G 395\nU 458 ; WX 1387 ; N uni01CA ; G 396\nU 459 ; WX 1276 ; N uni01CB ; G 397\nU 460 ; WX 1089 ; N uni01CC ; G 398\nU 461 ; WX 776 ; N uni01CD ; G 399\nU 462 ; WX 648 ; N uni01CE ; G 400\nU 463 ; WX 468 ; N uni01CF ; G 401\nU 464 ; WX 380 ; N uni01D0 ; G 402\nU 465 ; WX 871 ; N uni01D1 ; G 403\nU 466 ; WX 667 ; N uni01D2 ; G 404\nU 467 ; WX 872 ; N uni01D3 ; G 405\nU 468 ; WX 727 ; N uni01D4 ; G 406\nU 469 ; WX 872 ; N uni01D5 ; G 407\nU 470 ; WX 727 ; N uni01D6 ; G 408\nU 471 ; WX 872 ; N uni01D7 ; G 409\nU 472 ; WX 727 ; N uni01D8 ; G 410\nU 473 ; WX 872 ; N uni01D9 ; G 411\nU 474 ; WX 727 ; N uni01DA ; G 412\nU 475 ; WX 872 ; N uni01DB ; G 413\nU 476 ; WX 727 ; N uni01DC ; G 414\nU 477 ; WX 636 ; N uni01DD ; G 415\nU 478 ; WX 776 ; N uni01DE ; G 416\nU 479 ; WX 648 ; N uni01DF ; G 417\nU 480 ; WX 776 ; N uni01E0 ; G 418\nU 481 ; WX 648 ; N uni01E1 ; G 419\nU 482 ; WX 1034 ; N uni01E2 ; G 420\nU 483 ; WX 975 ; N uni01E3 ; G 421\nU 484 ; WX 896 ; N uni01E4 ; G 422\nU 485 ; WX 699 ; N uni01E5 ; G 423\nU 486 ; WX 854 ; N Gcaron ; G 424\nU 487 ; WX 699 ; N gcaron ; G 425\nU 488 ; WX 869 ; N uni01E8 ; G 426\nU 489 ; WX 693 ; N uni01E9 ; G 427\nU 490 ; WX 871 ; N uni01EA ; G 428\nU 491 ; WX 667 ; N uni01EB ; G 429\nU 492 ; WX 871 ; N uni01EC ; G 430\nU 493 ; WX 667 ; N uni01ED ; G 431\nU 494 ; WX 657 ; N uni01EE ; G 432\nU 495 ; WX 568 ; N uni01EF ; G 433\nU 496 ; WX 380 ; N uni01F0 ; G 434\nU 497 ; WX 1597 ; N uni01F1 ; G 435\nU 498 ; WX 1435 ; N uni01F2 ; G 436\nU 499 ; WX 1267 ; N uni01F3 ; G 437\nU 500 ; WX 854 ; N uni01F4 ; G 438\nU 501 ; WX 699 ; N uni01F5 ; G 439\nU 502 ; WX 1221 ; N uni01F6 ; G 440\nU 503 ; WX 787 ; N uni01F7 ; G 441\nU 504 ; WX 914 ; N uni01F8 ; G 442\nU 505 ; WX 727 ; N uni01F9 ; G 443\nU 506 ; WX 776 ; N Aringacute ; G 444\nU 507 ; WX 648 ; N aringacute ; G 445\nU 508 ; WX 1034 ; N AEacute ; G 446\nU 509 ; WX 975 ; N aeacute ; G 447\nU 510 ; WX 871 ; N Oslashacute ; G 448\nU 511 ; WX 667 ; N oslashacute ; G 449\nU 512 ; WX 776 ; N uni0200 ; G 450\nU 513 ; WX 648 ; N uni0201 ; G 451\nU 514 ; WX 776 ; N uni0202 ; G 452\nU 515 ; WX 648 ; N uni0203 ; G 453\nU 516 ; WX 762 ; N uni0204 ; G 454\nU 517 ; WX 636 ; N uni0205 ; G 455\nU 518 ; WX 762 ; N uni0206 ; G 456\nU 519 ; WX 636 ; N uni0207 ; G 457\nU 520 ; WX 468 ; N uni0208 ; G 458\nU 521 ; WX 380 ; N uni0209 ; G 459\nU 522 ; WX 468 ; N uni020A ; G 460\nU 523 ; WX 380 ; N uni020B ; G 461\nU 524 ; WX 871 ; N uni020C ; G 462\nU 525 ; WX 667 ; N uni020D ; G 463\nU 526 ; WX 871 ; N uni020E ; G 464\nU 527 ; WX 667 ; N uni020F ; G 465\nU 528 ; WX 831 ; N uni0210 ; G 466\nU 529 ; WX 527 ; N uni0211 ; G 467\nU 530 ; WX 831 ; N uni0212 ; G 468\nU 531 ; WX 527 ; N uni0213 ; G 469\nU 532 ; WX 872 ; N uni0214 ; G 470\nU 533 ; WX 727 ; N uni0215 ; G 471\nU 534 ; WX 872 ; N uni0216 ; G 472\nU 535 ; WX 727 ; N uni0217 ; G 473\nU 536 ; WX 722 ; N Scommaaccent ; G 474\nU 537 ; WX 563 ; N scommaaccent ; G 475\nU 538 ; WX 744 ; N uni021A ; G 476\nU 539 ; WX 462 ; N uni021B ; G 477\nU 540 ; WX 690 ; N uni021C ; G 478\nU 541 ; WX 607 ; N uni021D ; G 479\nU 542 ; WX 945 ; N uni021E ; G 480\nU 543 ; WX 727 ; N uni021F ; G 481\nU 544 ; WX 872 ; N uni0220 ; G 482\nU 545 ; WX 791 ; N uni0221 ; G 483\nU 546 ; WX 703 ; N uni0222 ; G 484\nU 547 ; WX 616 ; N uni0223 ; G 485\nU 548 ; WX 730 ; N uni0224 ; G 486\nU 549 ; WX 568 ; N uni0225 ; G 487\nU 550 ; WX 776 ; N uni0226 ; G 488\nU 551 ; WX 648 ; N uni0227 ; G 489\nU 552 ; WX 762 ; N uni0228 ; G 490\nU 553 ; WX 636 ; N uni0229 ; G 491\nU 554 ; WX 871 ; N uni022A ; G 492\nU 555 ; WX 667 ; N uni022B ; G 493\nU 556 ; WX 871 ; N uni022C ; G 494\nU 557 ; WX 667 ; N uni022D ; G 495\nU 558 ; WX 871 ; N uni022E ; G 496\nU 559 ; WX 667 ; N uni022F ; G 497\nU 560 ; WX 871 ; N uni0230 ; G 498\nU 561 ; WX 667 ; N uni0231 ; G 499\nU 562 ; WX 714 ; N uni0232 ; G 500\nU 563 ; WX 581 ; N uni0233 ; G 501\nU 564 ; WX 573 ; N uni0234 ; G 502\nU 565 ; WX 922 ; N uni0235 ; G 503\nU 566 ; WX 564 ; N uni0236 ; G 504\nU 567 ; WX 362 ; N dotlessj ; G 505\nU 568 ; WX 1031 ; N uni0238 ; G 506\nU 569 ; WX 1031 ; N uni0239 ; G 507\nU 570 ; WX 776 ; N uni023A ; G 508\nU 571 ; WX 796 ; N uni023B ; G 509\nU 572 ; WX 609 ; N uni023C ; G 510\nU 573 ; WX 703 ; N uni023D ; G 511\nU 574 ; WX 744 ; N uni023E ; G 512\nU 575 ; WX 563 ; N uni023F ; G 513\nU 576 ; WX 568 ; N uni0240 ; G 514\nU 577 ; WX 660 ; N uni0241 ; G 515\nU 578 ; WX 547 ; N uni0242 ; G 516\nU 579 ; WX 845 ; N uni0243 ; G 517\nU 580 ; WX 872 ; N uni0244 ; G 518\nU 581 ; WX 776 ; N uni0245 ; G 519\nU 582 ; WX 762 ; N uni0246 ; G 520\nU 583 ; WX 636 ; N uni0247 ; G 521\nU 584 ; WX 473 ; N uni0248 ; G 522\nU 585 ; WX 387 ; N uni0249 ; G 523\nU 586 ; WX 848 ; N uni024A ; G 524\nU 587 ; WX 699 ; N uni024B ; G 525\nU 588 ; WX 831 ; N uni024C ; G 526\nU 589 ; WX 527 ; N uni024D ; G 527\nU 590 ; WX 714 ; N uni024E ; G 528\nU 591 ; WX 581 ; N uni024F ; G 529\nU 592 ; WX 648 ; N uni0250 ; G 530\nU 593 ; WX 699 ; N uni0251 ; G 531\nU 594 ; WX 699 ; N uni0252 ; G 532\nU 595 ; WX 699 ; N uni0253 ; G 533\nU 596 ; WX 609 ; N uni0254 ; G 534\nU 597 ; WX 609 ; N uni0255 ; G 535\nU 598 ; WX 699 ; N uni0256 ; G 536\nU 599 ; WX 730 ; N uni0257 ; G 537\nU 600 ; WX 636 ; N uni0258 ; G 538\nU 601 ; WX 636 ; N uni0259 ; G 539\nU 602 ; WX 907 ; N uni025A ; G 540\nU 603 ; WX 608 ; N uni025B ; G 541\nU 604 ; WX 562 ; N uni025C ; G 542\nU 605 ; WX 907 ; N uni025D ; G 543\nU 606 ; WX 714 ; N uni025E ; G 544\nU 607 ; WX 387 ; N uni025F ; G 545\nU 608 ; WX 699 ; N uni0260 ; G 546\nU 609 ; WX 699 ; N uni0261 ; G 547\nU 610 ; WX 638 ; N uni0262 ; G 548\nU 611 ; WX 601 ; N uni0263 ; G 549\nU 612 ; WX 627 ; N uni0264 ; G 550\nU 613 ; WX 727 ; N uni0265 ; G 551\nU 614 ; WX 727 ; N uni0266 ; G 552\nU 615 ; WX 727 ; N uni0267 ; G 553\nU 616 ; WX 380 ; N uni0268 ; G 554\nU 617 ; WX 380 ; N uni0269 ; G 555\nU 618 ; WX 380 ; N uni026A ; G 556\nU 619 ; WX 409 ; N uni026B ; G 557\nU 620 ; WX 514 ; N uni026C ; G 558\nU 621 ; WX 380 ; N uni026D ; G 559\nU 622 ; WX 795 ; N uni026E ; G 560\nU 623 ; WX 1058 ; N uni026F ; G 561\nU 624 ; WX 1058 ; N uni0270 ; G 562\nU 625 ; WX 1058 ; N uni0271 ; G 563\nU 626 ; WX 727 ; N uni0272 ; G 564\nU 627 ; WX 727 ; N uni0273 ; G 565\nU 628 ; WX 712 ; N uni0274 ; G 566\nU 629 ; WX 667 ; N uni0275 ; G 567\nU 630 ; WX 1061 ; N uni0276 ; G 568\nU 631 ; WX 944 ; N uni0277 ; G 569\nU 632 ; WX 797 ; N uni0278 ; G 570\nU 633 ; WX 571 ; N uni0279 ; G 571\nU 634 ; WX 571 ; N uni027A ; G 572\nU 635 ; WX 571 ; N uni027B ; G 573\nU 636 ; WX 527 ; N uni027C ; G 574\nU 637 ; WX 527 ; N uni027D ; G 575\nU 638 ; WX 452 ; N uni027E ; G 576\nU 639 ; WX 487 ; N uni027F ; G 577\nU 640 ; WX 694 ; N uni0280 ; G 578\nU 641 ; WX 694 ; N uni0281 ; G 579\nU 642 ; WX 563 ; N uni0282 ; G 580\nU 643 ; WX 331 ; N uni0283 ; G 581\nU 644 ; WX 430 ; N uni0284 ; G 582\nU 645 ; WX 540 ; N uni0285 ; G 583\nU 646 ; WX 331 ; N uni0286 ; G 584\nU 647 ; WX 492 ; N uni0287 ; G 585\nU 648 ; WX 462 ; N uni0288 ; G 586\nU 649 ; WX 727 ; N uni0289 ; G 587\nU 650 ; WX 679 ; N uni028A ; G 588\nU 651 ; WX 694 ; N uni028B ; G 589\nU 652 ; WX 641 ; N uni028C ; G 590\nU 653 ; WX 907 ; N uni028D ; G 591\nU 654 ; WX 635 ; N uni028E ; G 592\nU 655 ; WX 727 ; N uni028F ; G 593\nU 656 ; WX 568 ; N uni0290 ; G 594\nU 657 ; WX 568 ; N uni0291 ; G 595\nU 658 ; WX 568 ; N uni0292 ; G 596\nU 659 ; WX 568 ; N uni0293 ; G 597\nU 660 ; WX 551 ; N uni0294 ; G 598\nU 661 ; WX 551 ; N uni0295 ; G 599\nU 662 ; WX 551 ; N uni0296 ; G 600\nU 663 ; WX 545 ; N uni0297 ; G 601\nU 664 ; WX 871 ; N uni0298 ; G 602\nU 665 ; WX 695 ; N uni0299 ; G 603\nU 666 ; WX 714 ; N uni029A ; G 604\nU 667 ; WX 689 ; N uni029B ; G 605\nU 668 ; WX 732 ; N uni029C ; G 606\nU 669 ; WX 384 ; N uni029D ; G 607\nU 670 ; WX 740 ; N uni029E ; G 608\nU 671 ; WX 617 ; N uni029F ; G 609\nU 672 ; WX 699 ; N uni02A0 ; G 610\nU 673 ; WX 551 ; N uni02A1 ; G 611\nU 674 ; WX 551 ; N uni02A2 ; G 612\nU 675 ; WX 1117 ; N uni02A3 ; G 613\nU 676 ; WX 1179 ; N uni02A4 ; G 614\nU 677 ; WX 1117 ; N uni02A5 ; G 615\nU 678 ; WX 938 ; N uni02A6 ; G 616\nU 679 ; WX 715 ; N uni02A7 ; G 617\nU 680 ; WX 946 ; N uni02A8 ; G 618\nU 681 ; WX 1039 ; N uni02A9 ; G 619\nU 682 ; WX 870 ; N uni02AA ; G 620\nU 683 ; WX 795 ; N uni02AB ; G 621\nU 684 ; WX 662 ; N uni02AC ; G 622\nU 685 ; WX 443 ; N uni02AD ; G 623\nU 686 ; WX 613 ; N uni02AE ; G 624\nU 687 ; WX 717 ; N uni02AF ; G 625\nU 688 ; WX 521 ; N uni02B0 ; G 626\nU 689 ; WX 519 ; N uni02B1 ; G 627\nU 690 ; WX 313 ; N uni02B2 ; G 628\nU 691 ; WX 414 ; N uni02B3 ; G 629\nU 692 ; WX 414 ; N uni02B4 ; G 630\nU 693 ; WX 480 ; N uni02B5 ; G 631\nU 694 ; WX 527 ; N uni02B6 ; G 632\nU 695 ; WX 662 ; N uni02B7 ; G 633\nU 696 ; WX 485 ; N uni02B8 ; G 634\nU 697 ; WX 302 ; N uni02B9 ; G 635\nU 698 ; WX 521 ; N uni02BA ; G 636\nU 699 ; WX 348 ; N uni02BB ; G 637\nU 700 ; WX 348 ; N uni02BC ; G 638\nU 701 ; WX 348 ; N uni02BD ; G 639\nU 702 ; WX 366 ; N uni02BE ; G 640\nU 703 ; WX 366 ; N uni02BF ; G 641\nU 704 ; WX 313 ; N uni02C0 ; G 642\nU 705 ; WX 313 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 282 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 282 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 720 ; WX 369 ; N uni02D0 ; G 656\nU 721 ; WX 369 ; N uni02D1 ; G 657\nU 722 ; WX 366 ; N uni02D2 ; G 658\nU 723 ; WX 366 ; N uni02D3 ; G 659\nU 726 ; WX 392 ; N uni02D6 ; G 660\nU 727 ; WX 392 ; N uni02D7 ; G 661\nU 728 ; WX 500 ; N breve ; G 662\nU 729 ; WX 500 ; N dotaccent ; G 663\nU 730 ; WX 500 ; N ring ; G 664\nU 731 ; WX 500 ; N ogonek ; G 665\nU 732 ; WX 500 ; N tilde ; G 666\nU 733 ; WX 500 ; N hungarumlaut ; G 667\nU 734 ; WX 417 ; N uni02DE ; G 668\nU 736 ; WX 378 ; N uni02E0 ; G 669\nU 737 ; WX 292 ; N uni02E1 ; G 670\nU 738 ; WX 395 ; N uni02E2 ; G 671\nU 739 ; WX 475 ; N uni02E3 ; G 672\nU 740 ; WX 313 ; N uni02E4 ; G 673\nU 741 ; WX 500 ; N uni02E5 ; G 674\nU 742 ; WX 500 ; N uni02E6 ; G 675\nU 743 ; WX 500 ; N uni02E7 ; G 676\nU 744 ; WX 500 ; N uni02E8 ; G 677\nU 745 ; WX 500 ; N uni02E9 ; G 678\nU 748 ; WX 500 ; N uni02EC ; G 679\nU 750 ; WX 553 ; N uni02EE ; G 680\nU 751 ; WX 500 ; N uni02EF ; G 681\nU 752 ; WX 500 ; N uni02F0 ; G 682\nU 755 ; WX 500 ; N uni02F3 ; G 683\nU 759 ; WX 500 ; N uni02F7 ; G 684\nU 768 ; WX 0 ; N gravecomb ; G 685\nU 769 ; WX 0 ; N acutecomb ; G 686\nU 770 ; WX 0 ; N uni0302 ; G 687\nU 771 ; WX 0 ; N tildecomb ; G 688\nU 772 ; WX 0 ; N uni0304 ; G 689\nU 773 ; WX 0 ; N uni0305 ; G 690\nU 774 ; WX 0 ; N uni0306 ; G 691\nU 775 ; WX 0 ; N uni0307 ; G 692\nU 776 ; WX 0 ; N uni0308 ; G 693\nU 777 ; WX 0 ; N hookabovecomb ; G 694\nU 778 ; WX 0 ; N uni030A ; G 695\nU 779 ; WX 0 ; N uni030B ; G 696\nU 780 ; WX 0 ; N uni030C ; G 697\nU 781 ; WX 0 ; N uni030D ; G 698\nU 782 ; WX 0 ; N uni030E ; G 699\nU 783 ; WX 0 ; N uni030F ; G 700\nU 784 ; WX 0 ; N uni0310 ; G 701\nU 785 ; WX 0 ; N uni0311 ; G 702\nU 786 ; WX 0 ; N uni0312 ; G 703\nU 787 ; WX 0 ; N uni0313 ; G 704\nU 788 ; WX 0 ; N uni0314 ; G 705\nU 789 ; WX 0 ; N uni0315 ; G 706\nU 790 ; WX 0 ; N uni0316 ; G 707\nU 791 ; WX 0 ; N uni0317 ; G 708\nU 792 ; WX 0 ; N uni0318 ; G 709\nU 793 ; WX 0 ; N uni0319 ; G 710\nU 794 ; WX 0 ; N uni031A ; G 711\nU 795 ; WX 0 ; N uni031B ; G 712\nU 796 ; WX 0 ; N uni031C ; G 713\nU 797 ; WX 0 ; N uni031D ; G 714\nU 798 ; WX 0 ; N uni031E ; G 715\nU 799 ; WX 0 ; N uni031F ; G 716\nU 800 ; WX 0 ; N uni0320 ; G 717\nU 801 ; WX 0 ; N uni0321 ; G 718\nU 802 ; WX 0 ; N uni0322 ; G 719\nU 803 ; WX 0 ; N dotbelowcomb ; G 720\nU 804 ; WX 0 ; N uni0324 ; G 721\nU 805 ; WX 0 ; N uni0325 ; G 722\nU 806 ; WX 0 ; N uni0326 ; G 723\nU 807 ; WX 0 ; N uni0327 ; G 724\nU 808 ; WX 0 ; N uni0328 ; G 725\nU 809 ; WX 0 ; N uni0329 ; G 726\nU 810 ; WX 0 ; N uni032A ; G 727\nU 811 ; WX 0 ; N uni032B ; G 728\nU 812 ; WX 0 ; N uni032C ; G 729\nU 813 ; WX 0 ; N uni032D ; G 730\nU 814 ; WX 0 ; N uni032E ; G 731\nU 815 ; WX 0 ; N uni032F ; G 732\nU 816 ; WX 0 ; N uni0330 ; G 733\nU 817 ; WX 0 ; N uni0331 ; G 734\nU 818 ; WX 0 ; N uni0332 ; G 735\nU 819 ; WX 0 ; N uni0333 ; G 736\nU 820 ; WX 0 ; N uni0334 ; G 737\nU 821 ; WX 0 ; N uni0335 ; G 738\nU 822 ; WX 0 ; N uni0336 ; G 739\nU 823 ; WX 0 ; N uni0337 ; G 740\nU 824 ; WX 0 ; N uni0338 ; G 741\nU 825 ; WX 0 ; N uni0339 ; G 742\nU 826 ; WX 0 ; N uni033A ; G 743\nU 827 ; WX 0 ; N uni033B ; G 744\nU 828 ; WX 0 ; N uni033C ; G 745\nU 829 ; WX 0 ; N uni033D ; G 746\nU 830 ; WX 0 ; N uni033E ; G 747\nU 831 ; WX 0 ; N uni033F ; G 748\nU 835 ; WX 0 ; N uni0343 ; G 749\nU 847 ; WX 0 ; N uni034F ; G 750\nU 856 ; WX 0 ; N uni0358 ; G 751\nU 864 ; WX 0 ; N uni0360 ; G 752\nU 865 ; WX 0 ; N uni0361 ; G 753\nU 880 ; WX 779 ; N uni0370 ; G 754\nU 881 ; WX 576 ; N uni0371 ; G 755\nU 882 ; WX 803 ; N uni0372 ; G 756\nU 883 ; WX 777 ; N uni0373 ; G 757\nU 884 ; WX 302 ; N uni0374 ; G 758\nU 885 ; WX 302 ; N uni0375 ; G 759\nU 886 ; WX 963 ; N uni0376 ; G 760\nU 887 ; WX 737 ; N uni0377 ; G 761\nU 890 ; WX 500 ; N uni037A ; G 762\nU 891 ; WX 609 ; N uni037B ; G 763\nU 892 ; WX 609 ; N uni037C ; G 764\nU 893 ; WX 609 ; N uni037D ; G 765\nU 894 ; WX 369 ; N uni037E ; G 766\nU 895 ; WX 473 ; N uni037F ; G 767\nU 900 ; WX 500 ; N tonos ; G 768\nU 901 ; WX 500 ; N dieresistonos ; G 769\nU 902 ; WX 776 ; N Alphatonos ; G 770\nU 903 ; WX 348 ; N anoteleia ; G 771\nU 904 ; WX 947 ; N Epsilontonos ; G 772\nU 905 ; WX 1118 ; N Etatonos ; G 773\nU 906 ; WX 662 ; N Iotatonos ; G 774\nU 908 ; WX 887 ; N Omicrontonos ; G 775\nU 910 ; WX 953 ; N Upsilontonos ; G 776\nU 911 ; WX 911 ; N Omegatonos ; G 777\nU 912 ; WX 484 ; N iotadieresistonos ; G 778\nU 913 ; WX 776 ; N Alpha ; G 779\nU 914 ; WX 845 ; N Beta ; G 780\nU 915 ; WX 710 ; N Gamma ; G 781\nU 916 ; WX 776 ; N uni0394 ; G 782\nU 917 ; WX 762 ; N Epsilon ; G 783\nU 918 ; WX 730 ; N Zeta ; G 784\nU 919 ; WX 945 ; N Eta ; G 785\nU 920 ; WX 871 ; N Theta ; G 786\nU 921 ; WX 468 ; N Iota ; G 787\nU 922 ; WX 869 ; N Kappa ; G 788\nU 923 ; WX 776 ; N Lambda ; G 789\nU 924 ; WX 1107 ; N Mu ; G 790\nU 925 ; WX 914 ; N Nu ; G 791\nU 926 ; WX 704 ; N Xi ; G 792\nU 927 ; WX 871 ; N Omicron ; G 793\nU 928 ; WX 944 ; N Pi ; G 794\nU 929 ; WX 752 ; N Rho ; G 795\nU 931 ; WX 707 ; N Sigma ; G 796\nU 932 ; WX 744 ; N Tau ; G 797\nU 933 ; WX 714 ; N Upsilon ; G 798\nU 934 ; WX 871 ; N Phi ; G 799\nU 935 ; WX 776 ; N Chi ; G 800\nU 936 ; WX 913 ; N Psi ; G 801\nU 937 ; WX 890 ; N Omega ; G 802\nU 938 ; WX 468 ; N Iotadieresis ; G 803\nU 939 ; WX 714 ; N Upsilondieresis ; G 804\nU 940 ; WX 770 ; N alphatonos ; G 805\nU 941 ; WX 608 ; N epsilontonos ; G 806\nU 942 ; WX 727 ; N etatonos ; G 807\nU 943 ; WX 484 ; N iotatonos ; G 808\nU 944 ; WX 694 ; N upsilondieresistonos ; G 809\nU 945 ; WX 770 ; N alpha ; G 810\nU 946 ; WX 664 ; N beta ; G 811\nU 947 ; WX 660 ; N gamma ; G 812\nU 948 ; WX 667 ; N delta ; G 813\nU 949 ; WX 608 ; N epsilon ; G 814\nU 950 ; WX 592 ; N zeta ; G 815\nU 951 ; WX 727 ; N eta ; G 816\nU 952 ; WX 667 ; N theta ; G 817\nU 953 ; WX 484 ; N iota ; G 818\nU 954 ; WX 750 ; N kappa ; G 819\nU 955 ; WX 701 ; N lambda ; G 820\nU 956 ; WX 732 ; N uni03BC ; G 821\nU 957 ; WX 694 ; N nu ; G 822\nU 958 ; WX 592 ; N xi ; G 823\nU 959 ; WX 667 ; N omicron ; G 824\nU 960 ; WX 732 ; N pi ; G 825\nU 961 ; WX 665 ; N rho ; G 826\nU 962 ; WX 609 ; N sigma1 ; G 827\nU 963 ; WX 737 ; N sigma ; G 828\nU 964 ; WX 673 ; N tau ; G 829\nU 965 ; WX 694 ; N upsilon ; G 830\nU 966 ; WX 905 ; N phi ; G 831\nU 967 ; WX 658 ; N chi ; G 832\nU 968 ; WX 941 ; N psi ; G 833\nU 969 ; WX 952 ; N omega ; G 834\nU 970 ; WX 484 ; N iotadieresis ; G 835\nU 971 ; WX 694 ; N upsilondieresis ; G 836\nU 972 ; WX 667 ; N omicrontonos ; G 837\nU 973 ; WX 694 ; N upsilontonos ; G 838\nU 974 ; WX 952 ; N omegatonos ; G 839\nU 975 ; WX 869 ; N uni03CF ; G 840\nU 976 ; WX 667 ; N uni03D0 ; G 841\nU 977 ; WX 849 ; N theta1 ; G 842\nU 978 ; WX 764 ; N Upsilon1 ; G 843\nU 979 ; WX 969 ; N uni03D3 ; G 844\nU 980 ; WX 764 ; N uni03D4 ; G 845\nU 981 ; WX 941 ; N phi1 ; G 846\nU 982 ; WX 952 ; N omega1 ; G 847\nU 983 ; WX 655 ; N uni03D7 ; G 848\nU 984 ; WX 871 ; N uni03D8 ; G 849\nU 985 ; WX 667 ; N uni03D9 ; G 850\nU 986 ; WX 796 ; N uni03DA ; G 851\nU 987 ; WX 609 ; N uni03DB ; G 852\nU 988 ; WX 710 ; N uni03DC ; G 853\nU 989 ; WX 527 ; N uni03DD ; G 854\nU 990 ; WX 590 ; N uni03DE ; G 855\nU 991 ; WX 660 ; N uni03DF ; G 856\nU 992 ; WX 796 ; N uni03E0 ; G 857\nU 993 ; WX 667 ; N uni03E1 ; G 858\nU 1008 ; WX 655 ; N uni03F0 ; G 859\nU 1009 ; WX 665 ; N uni03F1 ; G 860\nU 1010 ; WX 609 ; N uni03F2 ; G 861\nU 1011 ; WX 362 ; N uni03F3 ; G 862\nU 1012 ; WX 871 ; N uni03F4 ; G 863\nU 1013 ; WX 609 ; N uni03F5 ; G 864\nU 1014 ; WX 609 ; N uni03F6 ; G 865\nU 1015 ; WX 757 ; N uni03F7 ; G 866\nU 1016 ; WX 699 ; N uni03F8 ; G 867\nU 1017 ; WX 796 ; N uni03F9 ; G 868\nU 1018 ; WX 1107 ; N uni03FA ; G 869\nU 1019 ; WX 860 ; N uni03FB ; G 870\nU 1020 ; WX 692 ; N uni03FC ; G 871\nU 1021 ; WX 796 ; N uni03FD ; G 872\nU 1022 ; WX 796 ; N uni03FE ; G 873\nU 1023 ; WX 796 ; N uni03FF ; G 874\nU 1024 ; WX 762 ; N uni0400 ; G 875\nU 1025 ; WX 762 ; N uni0401 ; G 876\nU 1026 ; WX 901 ; N uni0402 ; G 877\nU 1027 ; WX 690 ; N uni0403 ; G 878\nU 1028 ; WX 795 ; N uni0404 ; G 879\nU 1029 ; WX 722 ; N uni0405 ; G 880\nU 1030 ; WX 468 ; N uni0406 ; G 881\nU 1031 ; WX 468 ; N uni0407 ; G 882\nU 1032 ; WX 473 ; N uni0408 ; G 883\nU 1033 ; WX 1202 ; N uni0409 ; G 884\nU 1034 ; WX 1262 ; N uni040A ; G 885\nU 1035 ; WX 963 ; N uni040B ; G 886\nU 1036 ; WX 910 ; N uni040C ; G 887\nU 1037 ; WX 945 ; N uni040D ; G 888\nU 1038 ; WX 812 ; N uni040E ; G 889\nU 1039 ; WX 945 ; N uni040F ; G 890\nU 1040 ; WX 814 ; N uni0410 ; G 891\nU 1041 ; WX 854 ; N uni0411 ; G 892\nU 1042 ; WX 845 ; N uni0412 ; G 893\nU 1043 ; WX 690 ; N uni0413 ; G 894\nU 1044 ; WX 889 ; N uni0414 ; G 895\nU 1045 ; WX 762 ; N uni0415 ; G 896\nU 1046 ; WX 1312 ; N uni0416 ; G 897\nU 1047 ; WX 721 ; N uni0417 ; G 898\nU 1048 ; WX 945 ; N uni0418 ; G 899\nU 1049 ; WX 945 ; N uni0419 ; G 900\nU 1050 ; WX 910 ; N uni041A ; G 901\nU 1051 ; WX 884 ; N uni041B ; G 902\nU 1052 ; WX 1107 ; N uni041C ; G 903\nU 1053 ; WX 945 ; N uni041D ; G 904\nU 1054 ; WX 871 ; N uni041E ; G 905\nU 1055 ; WX 944 ; N uni041F ; G 906\nU 1056 ; WX 752 ; N uni0420 ; G 907\nU 1057 ; WX 796 ; N uni0421 ; G 908\nU 1058 ; WX 744 ; N uni0422 ; G 909\nU 1059 ; WX 812 ; N uni0423 ; G 910\nU 1060 ; WX 949 ; N uni0424 ; G 911\nU 1061 ; WX 776 ; N uni0425 ; G 912\nU 1062 ; WX 966 ; N uni0426 ; G 913\nU 1063 ; WX 913 ; N uni0427 ; G 914\nU 1064 ; WX 1268 ; N uni0428 ; G 915\nU 1065 ; WX 1293 ; N uni0429 ; G 916\nU 1066 ; WX 957 ; N uni042A ; G 917\nU 1067 ; WX 1202 ; N uni042B ; G 918\nU 1068 ; WX 825 ; N uni042C ; G 919\nU 1069 ; WX 795 ; N uni042D ; G 920\nU 1070 ; WX 1287 ; N uni042E ; G 921\nU 1071 ; WX 882 ; N uni042F ; G 922\nU 1072 ; WX 648 ; N uni0430 ; G 923\nU 1073 ; WX 667 ; N uni0431 ; G 924\nU 1074 ; WX 695 ; N uni0432 ; G 925\nU 1075 ; WX 613 ; N uni0433 ; G 926\nU 1076 ; WX 667 ; N uni0434 ; G 927\nU 1077 ; WX 636 ; N uni0435 ; G 928\nU 1078 ; WX 1010 ; N uni0436 ; G 929\nU 1079 ; WX 638 ; N uni0437 ; G 930\nU 1080 ; WX 742 ; N uni0438 ; G 931\nU 1081 ; WX 742 ; N uni0439 ; G 932\nU 1082 ; WX 722 ; N uni043A ; G 933\nU 1083 ; WX 705 ; N uni043B ; G 934\nU 1084 ; WX 869 ; N uni043C ; G 935\nU 1085 ; WX 732 ; N uni043D ; G 936\nU 1086 ; WX 667 ; N uni043E ; G 937\nU 1087 ; WX 732 ; N uni043F ; G 938\nU 1088 ; WX 699 ; N uni0440 ; G 939\nU 1089 ; WX 609 ; N uni0441 ; G 940\nU 1090 ; WX 620 ; N uni0442 ; G 941\nU 1091 ; WX 640 ; N uni0443 ; G 942\nU 1092 ; WX 902 ; N uni0444 ; G 943\nU 1093 ; WX 596 ; N uni0445 ; G 944\nU 1094 ; WX 739 ; N uni0446 ; G 945\nU 1095 ; WX 732 ; N uni0447 ; G 946\nU 1096 ; WX 1075 ; N uni0448 ; G 947\nU 1097 ; WX 1082 ; N uni0449 ; G 948\nU 1098 ; WX 767 ; N uni044A ; G 949\nU 1099 ; WX 1002 ; N uni044B ; G 950\nU 1100 ; WX 679 ; N uni044C ; G 951\nU 1101 ; WX 609 ; N uni044D ; G 952\nU 1102 ; WX 1025 ; N uni044E ; G 953\nU 1103 ; WX 739 ; N uni044F ; G 954\nU 1104 ; WX 636 ; N uni0450 ; G 955\nU 1105 ; WX 636 ; N uni0451 ; G 956\nU 1106 ; WX 719 ; N uni0452 ; G 957\nU 1107 ; WX 613 ; N uni0453 ; G 958\nU 1108 ; WX 609 ; N uni0454 ; G 959\nU 1109 ; WX 563 ; N uni0455 ; G 960\nU 1110 ; WX 380 ; N uni0456 ; G 961\nU 1111 ; WX 380 ; N uni0457 ; G 962\nU 1112 ; WX 362 ; N uni0458 ; G 963\nU 1113 ; WX 988 ; N uni0459 ; G 964\nU 1114 ; WX 1015 ; N uni045A ; G 965\nU 1115 ; WX 727 ; N uni045B ; G 966\nU 1116 ; WX 722 ; N uni045C ; G 967\nU 1117 ; WX 742 ; N uni045D ; G 968\nU 1118 ; WX 640 ; N uni045E ; G 969\nU 1119 ; WX 732 ; N uni045F ; G 970\nU 1122 ; WX 880 ; N uni0462 ; G 971\nU 1123 ; WX 703 ; N uni0463 ; G 972\nU 1124 ; WX 1195 ; N uni0464 ; G 973\nU 1125 ; WX 963 ; N uni0465 ; G 974\nU 1130 ; WX 1312 ; N uni046A ; G 975\nU 1131 ; WX 1010 ; N uni046B ; G 976\nU 1132 ; WX 1630 ; N uni046C ; G 977\nU 1133 ; WX 1297 ; N uni046D ; G 978\nU 1136 ; WX 1096 ; N uni0470 ; G 979\nU 1137 ; WX 1105 ; N uni0471 ; G 980\nU 1138 ; WX 871 ; N uni0472 ; G 981\nU 1139 ; WX 652 ; N uni0473 ; G 982\nU 1140 ; WX 916 ; N uni0474 ; G 983\nU 1141 ; WX 749 ; N uni0475 ; G 984\nU 1142 ; WX 916 ; N uni0476 ; G 985\nU 1143 ; WX 749 ; N uni0477 ; G 986\nU 1164 ; WX 846 ; N uni048C ; G 987\nU 1165 ; WX 673 ; N uni048D ; G 988\nU 1168 ; WX 700 ; N uni0490 ; G 989\nU 1169 ; WX 618 ; N uni0491 ; G 990\nU 1170 ; WX 690 ; N uni0492 ; G 991\nU 1171 ; WX 613 ; N uni0493 ; G 992\nU 1172 ; WX 868 ; N uni0494 ; G 993\nU 1173 ; WX 716 ; N uni0495 ; G 994\nU 1174 ; WX 1312 ; N uni0496 ; G 995\nU 1175 ; WX 1010 ; N uni0497 ; G 996\nU 1176 ; WX 721 ; N uni0498 ; G 997\nU 1177 ; WX 638 ; N uni0499 ; G 998\nU 1178 ; WX 947 ; N uni049A ; G 999\nU 1179 ; WX 744 ; N uni049B ; G 1000\nU 1182 ; WX 910 ; N uni049E ; G 1001\nU 1183 ; WX 722 ; N uni049F ; G 1002\nU 1184 ; WX 1041 ; N uni04A0 ; G 1003\nU 1185 ; WX 827 ; N uni04A1 ; G 1004\nU 1186 ; WX 966 ; N uni04A2 ; G 1005\nU 1187 ; WX 739 ; N uni04A3 ; G 1006\nU 1188 ; WX 1167 ; N uni04A4 ; G 1007\nU 1189 ; WX 956 ; N uni04A5 ; G 1008\nU 1190 ; WX 1345 ; N uni04A6 ; G 1009\nU 1191 ; WX 1059 ; N uni04A7 ; G 1010\nU 1194 ; WX 796 ; N uni04AA ; G 1011\nU 1195 ; WX 609 ; N uni04AB ; G 1012\nU 1196 ; WX 744 ; N uni04AC ; G 1013\nU 1197 ; WX 620 ; N uni04AD ; G 1014\nU 1198 ; WX 714 ; N uni04AE ; G 1015\nU 1199 ; WX 581 ; N uni04AF ; G 1016\nU 1200 ; WX 714 ; N uni04B0 ; G 1017\nU 1201 ; WX 581 ; N uni04B1 ; G 1018\nU 1202 ; WX 866 ; N uni04B2 ; G 1019\nU 1203 ; WX 649 ; N uni04B3 ; G 1020\nU 1204 ; WX 1022 ; N uni04B4 ; G 1021\nU 1205 ; WX 807 ; N uni04B5 ; G 1022\nU 1206 ; WX 928 ; N uni04B6 ; G 1023\nU 1207 ; WX 739 ; N uni04B7 ; G 1024\nU 1210 ; WX 910 ; N uni04BA ; G 1025\nU 1211 ; WX 727 ; N uni04BB ; G 1026\nU 1216 ; WX 468 ; N uni04C0 ; G 1027\nU 1217 ; WX 1312 ; N uni04C1 ; G 1028\nU 1218 ; WX 1010 ; N uni04C2 ; G 1029\nU 1219 ; WX 869 ; N uni04C3 ; G 1030\nU 1220 ; WX 693 ; N uni04C4 ; G 1031\nU 1223 ; WX 945 ; N uni04C7 ; G 1032\nU 1224 ; WX 732 ; N uni04C8 ; G 1033\nU 1227 ; WX 913 ; N uni04CB ; G 1034\nU 1228 ; WX 732 ; N uni04CC ; G 1035\nU 1231 ; WX 380 ; N uni04CF ; G 1036\nU 1232 ; WX 814 ; N uni04D0 ; G 1037\nU 1233 ; WX 648 ; N uni04D1 ; G 1038\nU 1234 ; WX 814 ; N uni04D2 ; G 1039\nU 1235 ; WX 648 ; N uni04D3 ; G 1040\nU 1236 ; WX 1034 ; N uni04D4 ; G 1041\nU 1237 ; WX 975 ; N uni04D5 ; G 1042\nU 1238 ; WX 762 ; N uni04D6 ; G 1043\nU 1239 ; WX 636 ; N uni04D7 ; G 1044\nU 1240 ; WX 871 ; N uni04D8 ; G 1045\nU 1241 ; WX 636 ; N uni04D9 ; G 1046\nU 1242 ; WX 871 ; N uni04DA ; G 1047\nU 1243 ; WX 636 ; N uni04DB ; G 1048\nU 1244 ; WX 1312 ; N uni04DC ; G 1049\nU 1245 ; WX 1010 ; N uni04DD ; G 1050\nU 1246 ; WX 721 ; N uni04DE ; G 1051\nU 1247 ; WX 638 ; N uni04DF ; G 1052\nU 1248 ; WX 657 ; N uni04E0 ; G 1053\nU 1249 ; WX 568 ; N uni04E1 ; G 1054\nU 1250 ; WX 945 ; N uni04E2 ; G 1055\nU 1251 ; WX 742 ; N uni04E3 ; G 1056\nU 1252 ; WX 945 ; N uni04E4 ; G 1057\nU 1253 ; WX 742 ; N uni04E5 ; G 1058\nU 1254 ; WX 871 ; N uni04E6 ; G 1059\nU 1255 ; WX 667 ; N uni04E7 ; G 1060\nU 1256 ; WX 871 ; N uni04E8 ; G 1061\nU 1257 ; WX 667 ; N uni04E9 ; G 1062\nU 1258 ; WX 871 ; N uni04EA ; G 1063\nU 1259 ; WX 667 ; N uni04EB ; G 1064\nU 1260 ; WX 795 ; N uni04EC ; G 1065\nU 1261 ; WX 609 ; N uni04ED ; G 1066\nU 1262 ; WX 812 ; N uni04EE ; G 1067\nU 1263 ; WX 640 ; N uni04EF ; G 1068\nU 1264 ; WX 812 ; N uni04F0 ; G 1069\nU 1265 ; WX 640 ; N uni04F1 ; G 1070\nU 1266 ; WX 812 ; N uni04F2 ; G 1071\nU 1267 ; WX 640 ; N uni04F3 ; G 1072\nU 1268 ; WX 913 ; N uni04F4 ; G 1073\nU 1269 ; WX 732 ; N uni04F5 ; G 1074\nU 1270 ; WX 690 ; N uni04F6 ; G 1075\nU 1271 ; WX 613 ; N uni04F7 ; G 1076\nU 1272 ; WX 1202 ; N uni04F8 ; G 1077\nU 1273 ; WX 1002 ; N uni04F9 ; G 1078\nU 1296 ; WX 721 ; N uni0510 ; G 1079\nU 1297 ; WX 638 ; N uni0511 ; G 1080\nU 1298 ; WX 884 ; N uni0512 ; G 1081\nU 1299 ; WX 705 ; N uni0513 ; G 1082\nU 1300 ; WX 1248 ; N uni0514 ; G 1083\nU 1301 ; WX 945 ; N uni0515 ; G 1084\nU 1306 ; WX 820 ; N uni051A ; G 1085\nU 1307 ; WX 640 ; N uni051B ; G 1086\nU 1308 ; WX 1028 ; N uni051C ; G 1087\nU 1309 ; WX 856 ; N uni051D ; G 1088\nU 1329 ; WX 942 ; N uni0531 ; G 1089\nU 1330 ; WX 832 ; N uni0532 ; G 1090\nU 1331 ; WX 894 ; N uni0533 ; G 1091\nU 1332 ; WX 909 ; N uni0534 ; G 1092\nU 1333 ; WX 822 ; N uni0535 ; G 1093\nU 1334 ; WX 821 ; N uni0536 ; G 1094\nU 1335 ; WX 747 ; N uni0537 ; G 1095\nU 1336 ; WX 832 ; N uni0538 ; G 1096\nU 1337 ; WX 1125 ; N uni0539 ; G 1097\nU 1338 ; WX 894 ; N uni053A ; G 1098\nU 1339 ; WX 803 ; N uni053B ; G 1099\nU 1340 ; WX 722 ; N uni053C ; G 1100\nU 1341 ; WX 1188 ; N uni053D ; G 1101\nU 1342 ; WX 887 ; N uni053E ; G 1102\nU 1343 ; WX 842 ; N uni053F ; G 1103\nU 1344 ; WX 737 ; N uni0540 ; G 1104\nU 1345 ; WX 863 ; N uni0541 ; G 1105\nU 1346 ; WX 918 ; N uni0542 ; G 1106\nU 1347 ; WX 851 ; N uni0543 ; G 1107\nU 1348 ; WX 977 ; N uni0544 ; G 1108\nU 1349 ; WX 833 ; N uni0545 ; G 1109\nU 1350 ; WX 914 ; N uni0546 ; G 1110\nU 1351 ; WX 843 ; N uni0547 ; G 1111\nU 1352 ; WX 871 ; N uni0548 ; G 1112\nU 1353 ; WX 818 ; N uni0549 ; G 1113\nU 1354 ; WX 1034 ; N uni054A ; G 1114\nU 1355 ; WX 846 ; N uni054B ; G 1115\nU 1356 ; WX 964 ; N uni054C ; G 1116\nU 1357 ; WX 871 ; N uni054D ; G 1117\nU 1358 ; WX 914 ; N uni054E ; G 1118\nU 1359 ; WX 808 ; N uni054F ; G 1119\nU 1360 ; WX 808 ; N uni0550 ; G 1120\nU 1361 ; WX 836 ; N uni0551 ; G 1121\nU 1362 ; WX 710 ; N uni0552 ; G 1122\nU 1363 ; WX 955 ; N uni0553 ; G 1123\nU 1364 ; WX 891 ; N uni0554 ; G 1124\nU 1365 ; WX 871 ; N uni0555 ; G 1125\nU 1366 ; WX 963 ; N uni0556 ; G 1126\nU 1369 ; WX 307 ; N uni0559 ; G 1127\nU 1370 ; WX 264 ; N uni055A ; G 1128\nU 1371 ; WX 293 ; N uni055B ; G 1129\nU 1372 ; WX 391 ; N uni055C ; G 1130\nU 1373 ; WX 323 ; N uni055D ; G 1131\nU 1374 ; WX 439 ; N uni055E ; G 1132\nU 1375 ; WX 500 ; N uni055F ; G 1133\nU 1377 ; WX 1055 ; N uni0561 ; G 1134\nU 1378 ; WX 695 ; N uni0562 ; G 1135\nU 1379 ; WX 776 ; N uni0563 ; G 1136\nU 1380 ; WX 801 ; N uni0564 ; G 1137\nU 1381 ; WX 729 ; N uni0565 ; G 1138\nU 1382 ; WX 742 ; N uni0566 ; G 1139\nU 1383 ; WX 599 ; N uni0567 ; G 1140\nU 1384 ; WX 733 ; N uni0568 ; G 1141\nU 1385 ; WX 909 ; N uni0569 ; G 1142\nU 1386 ; WX 768 ; N uni056A ; G 1143\nU 1387 ; WX 724 ; N uni056B ; G 1144\nU 1388 ; WX 398 ; N uni056C ; G 1145\nU 1389 ; WX 1087 ; N uni056D ; G 1146\nU 1390 ; WX 695 ; N uni056E ; G 1147\nU 1391 ; WX 719 ; N uni056F ; G 1148\nU 1392 ; WX 737 ; N uni0570 ; G 1149\nU 1393 ; WX 684 ; N uni0571 ; G 1150\nU 1394 ; WX 738 ; N uni0572 ; G 1151\nU 1395 ; WX 703 ; N uni0573 ; G 1152\nU 1396 ; WX 724 ; N uni0574 ; G 1153\nU 1397 ; WX 359 ; N uni0575 ; G 1154\nU 1398 ; WX 719 ; N uni0576 ; G 1155\nU 1399 ; WX 496 ; N uni0577 ; G 1156\nU 1400 ; WX 738 ; N uni0578 ; G 1157\nU 1401 ; WX 428 ; N uni0579 ; G 1158\nU 1402 ; WX 1059 ; N uni057A ; G 1159\nU 1403 ; WX 668 ; N uni057B ; G 1160\nU 1404 ; WX 744 ; N uni057C ; G 1161\nU 1405 ; WX 724 ; N uni057D ; G 1162\nU 1406 ; WX 724 ; N uni057E ; G 1163\nU 1407 ; WX 1040 ; N uni057F ; G 1164\nU 1408 ; WX 724 ; N uni0580 ; G 1165\nU 1409 ; WX 713 ; N uni0581 ; G 1166\nU 1410 ; WX 493 ; N uni0582 ; G 1167\nU 1411 ; WX 1040 ; N uni0583 ; G 1168\nU 1412 ; WX 734 ; N uni0584 ; G 1169\nU 1413 ; WX 693 ; N uni0585 ; G 1170\nU 1414 ; WX 956 ; N uni0586 ; G 1171\nU 1415 ; WX 833 ; N uni0587 ; G 1172\nU 1417 ; WX 340 ; N uni0589 ; G 1173\nU 1418 ; WX 388 ; N uni058A ; G 1174\nU 3647 ; WX 696 ; N uni0E3F ; G 1175\nU 4256 ; WX 755 ; N uni10A0 ; G 1176\nU 4257 ; WX 936 ; N uni10A1 ; G 1177\nU 4258 ; WX 866 ; N uni10A2 ; G 1178\nU 4259 ; WX 874 ; N uni10A3 ; G 1179\nU 4260 ; WX 781 ; N uni10A4 ; G 1180\nU 4261 ; WX 1078 ; N uni10A5 ; G 1181\nU 4262 ; WX 1014 ; N uni10A6 ; G 1182\nU 4263 ; WX 1213 ; N uni10A7 ; G 1183\nU 4264 ; WX 643 ; N uni10A8 ; G 1184\nU 4265 ; WX 818 ; N uni10A9 ; G 1185\nU 4266 ; WX 1051 ; N uni10AA ; G 1186\nU 4267 ; WX 1051 ; N uni10AB ; G 1187\nU 4268 ; WX 796 ; N uni10AC ; G 1188\nU 4269 ; WX 1135 ; N uni10AD ; G 1189\nU 4270 ; WX 969 ; N uni10AE ; G 1190\nU 4271 ; WX 902 ; N uni10AF ; G 1191\nU 4272 ; WX 1109 ; N uni10B0 ; G 1192\nU 4273 ; WX 792 ; N uni10B1 ; G 1193\nU 4274 ; WX 756 ; N uni10B2 ; G 1194\nU 4275 ; WX 1076 ; N uni10B3 ; G 1195\nU 4276 ; WX 976 ; N uni10B4 ; G 1196\nU 4277 ; WX 1066 ; N uni10B5 ; G 1197\nU 4278 ; WX 811 ; N uni10B6 ; G 1198\nU 4279 ; WX 833 ; N uni10B7 ; G 1199\nU 4280 ; WX 821 ; N uni10B8 ; G 1200\nU 4281 ; WX 833 ; N uni10B9 ; G 1201\nU 4282 ; WX 908 ; N uni10BA ; G 1202\nU 4283 ; WX 1077 ; N uni10BB ; G 1203\nU 4284 ; WX 769 ; N uni10BC ; G 1204\nU 4285 ; WX 822 ; N uni10BD ; G 1205\nU 4286 ; WX 813 ; N uni10BE ; G 1206\nU 4287 ; WX 1111 ; N uni10BF ; G 1207\nU 4288 ; WX 1123 ; N uni10C0 ; G 1208\nU 4289 ; WX 802 ; N uni10C1 ; G 1209\nU 4290 ; WX 892 ; N uni10C2 ; G 1210\nU 4291 ; WX 802 ; N uni10C3 ; G 1211\nU 4292 ; WX 880 ; N uni10C4 ; G 1212\nU 4293 ; WX 1063 ; N uni10C5 ; G 1213\nU 4304 ; WX 594 ; N uni10D0 ; G 1214\nU 4305 ; WX 625 ; N uni10D1 ; G 1215\nU 4306 ; WX 643 ; N uni10D2 ; G 1216\nU 4307 ; WX 887 ; N uni10D3 ; G 1217\nU 4308 ; WX 615 ; N uni10D4 ; G 1218\nU 4309 ; WX 611 ; N uni10D5 ; G 1219\nU 4310 ; WX 667 ; N uni10D6 ; G 1220\nU 4311 ; WX 915 ; N uni10D7 ; G 1221\nU 4312 ; WX 613 ; N uni10D8 ; G 1222\nU 4313 ; WX 600 ; N uni10D9 ; G 1223\nU 4314 ; WX 1120 ; N uni10DA ; G 1224\nU 4315 ; WX 640 ; N uni10DB ; G 1225\nU 4316 ; WX 640 ; N uni10DC ; G 1226\nU 4317 ; WX 879 ; N uni10DD ; G 1227\nU 4318 ; WX 624 ; N uni10DE ; G 1228\nU 4319 ; WX 634 ; N uni10DF ; G 1229\nU 4320 ; WX 877 ; N uni10E0 ; G 1230\nU 4321 ; WX 666 ; N uni10E1 ; G 1231\nU 4322 ; WX 780 ; N uni10E2 ; G 1232\nU 4323 ; WX 751 ; N uni10E3 ; G 1233\nU 4324 ; WX 869 ; N uni10E4 ; G 1234\nU 4325 ; WX 639 ; N uni10E5 ; G 1235\nU 4326 ; WX 912 ; N uni10E6 ; G 1236\nU 4327 ; WX 622 ; N uni10E7 ; G 1237\nU 4328 ; WX 647 ; N uni10E8 ; G 1238\nU 4329 ; WX 640 ; N uni10E9 ; G 1239\nU 4330 ; WX 729 ; N uni10EA ; G 1240\nU 4331 ; WX 641 ; N uni10EB ; G 1241\nU 4332 ; WX 630 ; N uni10EC ; G 1242\nU 4333 ; WX 629 ; N uni10ED ; G 1243\nU 4334 ; WX 670 ; N uni10EE ; G 1244\nU 4335 ; WX 753 ; N uni10EF ; G 1245\nU 4336 ; WX 625 ; N uni10F0 ; G 1246\nU 4337 ; WX 657 ; N uni10F1 ; G 1247\nU 4338 ; WX 625 ; N uni10F2 ; G 1248\nU 4339 ; WX 625 ; N uni10F3 ; G 1249\nU 4340 ; WX 624 ; N uni10F4 ; G 1250\nU 4341 ; WX 670 ; N uni10F5 ; G 1251\nU 4342 ; WX 940 ; N uni10F6 ; G 1252\nU 4343 ; WX 680 ; N uni10F7 ; G 1253\nU 4344 ; WX 636 ; N uni10F8 ; G 1254\nU 4345 ; WX 672 ; N uni10F9 ; G 1255\nU 4346 ; WX 625 ; N uni10FA ; G 1256\nU 4347 ; WX 588 ; N uni10FB ; G 1257\nU 4348 ; WX 354 ; N uni10FC ; G 1258\nU 7424 ; WX 641 ; N uni1D00 ; G 1259\nU 7425 ; WX 892 ; N uni1D01 ; G 1260\nU 7426 ; WX 940 ; N uni1D02 ; G 1261\nU 7427 ; WX 695 ; N uni1D03 ; G 1262\nU 7428 ; WX 609 ; N uni1D04 ; G 1263\nU 7429 ; WX 675 ; N uni1D05 ; G 1264\nU 7430 ; WX 675 ; N uni1D06 ; G 1265\nU 7431 ; WX 617 ; N uni1D07 ; G 1266\nU 7432 ; WX 509 ; N uni1D08 ; G 1267\nU 7433 ; WX 320 ; N uni1D09 ; G 1268\nU 7434 ; WX 561 ; N uni1D0A ; G 1269\nU 7435 ; WX 722 ; N uni1D0B ; G 1270\nU 7436 ; WX 617 ; N uni1D0C ; G 1271\nU 7437 ; WX 869 ; N uni1D0D ; G 1272\nU 7438 ; WX 737 ; N uni1D0E ; G 1273\nU 7439 ; WX 667 ; N uni1D0F ; G 1274\nU 7440 ; WX 609 ; N uni1D10 ; G 1275\nU 7441 ; WX 628 ; N uni1D11 ; G 1276\nU 7442 ; WX 628 ; N uni1D12 ; G 1277\nU 7443 ; WX 667 ; N uni1D13 ; G 1278\nU 7444 ; WX 989 ; N uni1D14 ; G 1279\nU 7445 ; WX 598 ; N uni1D15 ; G 1280\nU 7446 ; WX 667 ; N uni1D16 ; G 1281\nU 7447 ; WX 667 ; N uni1D17 ; G 1282\nU 7448 ; WX 586 ; N uni1D18 ; G 1283\nU 7449 ; WX 801 ; N uni1D19 ; G 1284\nU 7450 ; WX 801 ; N uni1D1A ; G 1285\nU 7451 ; WX 620 ; N uni1D1B ; G 1286\nU 7452 ; WX 647 ; N uni1D1C ; G 1287\nU 7453 ; WX 664 ; N uni1D1D ; G 1288\nU 7454 ; WX 923 ; N uni1D1E ; G 1289\nU 7455 ; WX 655 ; N uni1D1F ; G 1290\nU 7456 ; WX 581 ; N uni1D20 ; G 1291\nU 7457 ; WX 861 ; N uni1D21 ; G 1292\nU 7458 ; WX 568 ; N uni1D22 ; G 1293\nU 7459 ; WX 568 ; N uni1D23 ; G 1294\nU 7460 ; WX 588 ; N uni1D24 ; G 1295\nU 7461 ; WX 802 ; N uni1D25 ; G 1296\nU 7462 ; WX 586 ; N uni1D26 ; G 1297\nU 7463 ; WX 641 ; N uni1D27 ; G 1298\nU 7464 ; WX 732 ; N uni1D28 ; G 1299\nU 7465 ; WX 586 ; N uni1D29 ; G 1300\nU 7466 ; WX 854 ; N uni1D2A ; G 1301\nU 7467 ; WX 705 ; N uni1D2B ; G 1302\nU 7468 ; WX 489 ; N uni1D2C ; G 1303\nU 7469 ; WX 651 ; N uni1D2D ; G 1304\nU 7470 ; WX 532 ; N uni1D2E ; G 1305\nU 7471 ; WX 532 ; N uni1D2F ; G 1306\nU 7472 ; WX 546 ; N uni1D30 ; G 1307\nU 7473 ; WX 480 ; N uni1D31 ; G 1308\nU 7474 ; WX 480 ; N uni1D32 ; G 1309\nU 7475 ; WX 538 ; N uni1D33 ; G 1310\nU 7476 ; WX 595 ; N uni1D34 ; G 1311\nU 7477 ; WX 294 ; N uni1D35 ; G 1312\nU 7478 ; WX 298 ; N uni1D36 ; G 1313\nU 7479 ; WX 547 ; N uni1D37 ; G 1314\nU 7480 ; WX 443 ; N uni1D38 ; G 1315\nU 7481 ; WX 697 ; N uni1D39 ; G 1316\nU 7482 ; WX 576 ; N uni1D3A ; G 1317\nU 7483 ; WX 606 ; N uni1D3B ; G 1318\nU 7484 ; WX 548 ; N uni1D3C ; G 1319\nU 7485 ; WX 442 ; N uni1D3D ; G 1320\nU 7486 ; WX 474 ; N uni1D3E ; G 1321\nU 7487 ; WX 523 ; N uni1D3F ; G 1322\nU 7488 ; WX 455 ; N uni1D40 ; G 1323\nU 7489 ; WX 469 ; N uni1D41 ; G 1324\nU 7490 ; WX 549 ; N uni1D42 ; G 1325\nU 7491 ; WX 466 ; N uni1D43 ; G 1326\nU 7492 ; WX 466 ; N uni1D44 ; G 1327\nU 7493 ; WX 498 ; N uni1D45 ; G 1328\nU 7494 ; WX 657 ; N uni1D46 ; G 1329\nU 7495 ; WX 499 ; N uni1D47 ; G 1330\nU 7496 ; WX 498 ; N uni1D48 ; G 1331\nU 7497 ; WX 444 ; N uni1D49 ; G 1332\nU 7498 ; WX 444 ; N uni1D4A ; G 1333\nU 7499 ; WX 412 ; N uni1D4B ; G 1334\nU 7500 ; WX 412 ; N uni1D4C ; G 1335\nU 7501 ; WX 498 ; N uni1D4D ; G 1336\nU 7502 ; WX 300 ; N uni1D4E ; G 1337\nU 7503 ; WX 523 ; N uni1D4F ; G 1338\nU 7504 ; WX 729 ; N uni1D50 ; G 1339\nU 7505 ; WX 473 ; N uni1D51 ; G 1340\nU 7506 ; WX 467 ; N uni1D52 ; G 1341\nU 7507 ; WX 427 ; N uni1D53 ; G 1342\nU 7508 ; WX 467 ; N uni1D54 ; G 1343\nU 7509 ; WX 467 ; N uni1D55 ; G 1344\nU 7510 ; WX 499 ; N uni1D56 ; G 1345\nU 7511 ; WX 371 ; N uni1D57 ; G 1346\nU 7512 ; WX 520 ; N uni1D58 ; G 1347\nU 7513 ; WX 418 ; N uni1D59 ; G 1348\nU 7514 ; WX 729 ; N uni1D5A ; G 1349\nU 7515 ; WX 491 ; N uni1D5B ; G 1350\nU 7516 ; WX 505 ; N uni1D5C ; G 1351\nU 7517 ; WX 418 ; N uni1D5D ; G 1352\nU 7518 ; WX 416 ; N uni1D5E ; G 1353\nU 7519 ; WX 420 ; N uni1D5F ; G 1354\nU 7520 ; WX 570 ; N uni1D60 ; G 1355\nU 7521 ; WX 414 ; N uni1D61 ; G 1356\nU 7522 ; WX 239 ; N uni1D62 ; G 1357\nU 7523 ; WX 414 ; N uni1D63 ; G 1358\nU 7524 ; WX 520 ; N uni1D64 ; G 1359\nU 7525 ; WX 491 ; N uni1D65 ; G 1360\nU 7526 ; WX 418 ; N uni1D66 ; G 1361\nU 7527 ; WX 416 ; N uni1D67 ; G 1362\nU 7528 ; WX 419 ; N uni1D68 ; G 1363\nU 7529 ; WX 570 ; N uni1D69 ; G 1364\nU 7530 ; WX 414 ; N uni1D6A ; G 1365\nU 7531 ; WX 1041 ; N uni1D6B ; G 1366\nU 7543 ; WX 640 ; N uni1D77 ; G 1367\nU 7544 ; WX 595 ; N uni1D78 ; G 1368\nU 7547 ; WX 380 ; N uni1D7B ; G 1369\nU 7548 ; WX 380 ; N uni1D7C ; G 1370\nU 7549 ; WX 699 ; N uni1D7D ; G 1371\nU 7550 ; WX 647 ; N uni1D7E ; G 1372\nU 7551 ; WX 679 ; N uni1D7F ; G 1373\nU 7557 ; WX 380 ; N uni1D85 ; G 1374\nU 7579 ; WX 498 ; N uni1D9B ; G 1375\nU 7580 ; WX 427 ; N uni1D9C ; G 1376\nU 7581 ; WX 427 ; N uni1D9D ; G 1377\nU 7582 ; WX 467 ; N uni1D9E ; G 1378\nU 7583 ; WX 412 ; N uni1D9F ; G 1379\nU 7584 ; WX 383 ; N uni1DA0 ; G 1380\nU 7585 ; WX 373 ; N uni1DA1 ; G 1381\nU 7586 ; WX 498 ; N uni1DA2 ; G 1382\nU 7587 ; WX 522 ; N uni1DA3 ; G 1383\nU 7588 ; WX 300 ; N uni1DA4 ; G 1384\nU 7589 ; WX 307 ; N uni1DA5 ; G 1385\nU 7590 ; WX 300 ; N uni1DA6 ; G 1386\nU 7591 ; WX 300 ; N uni1DA7 ; G 1387\nU 7592 ; WX 370 ; N uni1DA8 ; G 1388\nU 7593 ; WX 368 ; N uni1DA9 ; G 1389\nU 7594 ; WX 321 ; N uni1DAA ; G 1390\nU 7595 ; WX 430 ; N uni1DAB ; G 1391\nU 7596 ; WX 682 ; N uni1DAC ; G 1392\nU 7597 ; WX 729 ; N uni1DAD ; G 1393\nU 7598 ; WX 588 ; N uni1DAE ; G 1394\nU 7599 ; WX 587 ; N uni1DAF ; G 1395\nU 7600 ; WX 472 ; N uni1DB0 ; G 1396\nU 7601 ; WX 467 ; N uni1DB1 ; G 1397\nU 7602 ; WX 522 ; N uni1DB2 ; G 1398\nU 7603 ; WX 400 ; N uni1DB3 ; G 1399\nU 7604 ; WX 387 ; N uni1DB4 ; G 1400\nU 7605 ; WX 371 ; N uni1DB5 ; G 1401\nU 7606 ; WX 520 ; N uni1DB6 ; G 1402\nU 7607 ; WX 475 ; N uni1DB7 ; G 1403\nU 7608 ; WX 408 ; N uni1DB8 ; G 1404\nU 7609 ; WX 489 ; N uni1DB9 ; G 1405\nU 7610 ; WX 491 ; N uni1DBA ; G 1406\nU 7611 ; WX 412 ; N uni1DBB ; G 1407\nU 7612 ; WX 527 ; N uni1DBC ; G 1408\nU 7613 ; WX 412 ; N uni1DBD ; G 1409\nU 7614 ; WX 452 ; N uni1DBE ; G 1410\nU 7615 ; WX 467 ; N uni1DBF ; G 1411\nU 7620 ; WX 0 ; N uni1DC4 ; G 1412\nU 7621 ; WX 0 ; N uni1DC5 ; G 1413\nU 7622 ; WX 0 ; N uni1DC6 ; G 1414\nU 7623 ; WX 0 ; N uni1DC7 ; G 1415\nU 7624 ; WX 0 ; N uni1DC8 ; G 1416\nU 7625 ; WX 0 ; N uni1DC9 ; G 1417\nU 7680 ; WX 776 ; N uni1E00 ; G 1418\nU 7681 ; WX 648 ; N uni1E01 ; G 1419\nU 7682 ; WX 845 ; N uni1E02 ; G 1420\nU 7683 ; WX 699 ; N uni1E03 ; G 1421\nU 7684 ; WX 845 ; N uni1E04 ; G 1422\nU 7685 ; WX 699 ; N uni1E05 ; G 1423\nU 7686 ; WX 845 ; N uni1E06 ; G 1424\nU 7687 ; WX 699 ; N uni1E07 ; G 1425\nU 7688 ; WX 796 ; N uni1E08 ; G 1426\nU 7689 ; WX 609 ; N uni1E09 ; G 1427\nU 7690 ; WX 867 ; N uni1E0A ; G 1428\nU 7691 ; WX 699 ; N uni1E0B ; G 1429\nU 7692 ; WX 867 ; N uni1E0C ; G 1430\nU 7693 ; WX 699 ; N uni1E0D ; G 1431\nU 7694 ; WX 867 ; N uni1E0E ; G 1432\nU 7695 ; WX 699 ; N uni1E0F ; G 1433\nU 7696 ; WX 867 ; N uni1E10 ; G 1434\nU 7697 ; WX 699 ; N uni1E11 ; G 1435\nU 7698 ; WX 867 ; N uni1E12 ; G 1436\nU 7699 ; WX 699 ; N uni1E13 ; G 1437\nU 7700 ; WX 762 ; N uni1E14 ; G 1438\nU 7701 ; WX 636 ; N uni1E15 ; G 1439\nU 7702 ; WX 762 ; N uni1E16 ; G 1440\nU 7703 ; WX 636 ; N uni1E17 ; G 1441\nU 7704 ; WX 762 ; N uni1E18 ; G 1442\nU 7705 ; WX 636 ; N uni1E19 ; G 1443\nU 7706 ; WX 762 ; N uni1E1A ; G 1444\nU 7707 ; WX 636 ; N uni1E1B ; G 1445\nU 7708 ; WX 762 ; N uni1E1C ; G 1446\nU 7709 ; WX 636 ; N uni1E1D ; G 1447\nU 7710 ; WX 710 ; N uni1E1E ; G 1448\nU 7711 ; WX 430 ; N uni1E1F ; G 1449\nU 7712 ; WX 854 ; N uni1E20 ; G 1450\nU 7713 ; WX 699 ; N uni1E21 ; G 1451\nU 7714 ; WX 945 ; N uni1E22 ; G 1452\nU 7715 ; WX 727 ; N uni1E23 ; G 1453\nU 7716 ; WX 945 ; N uni1E24 ; G 1454\nU 7717 ; WX 727 ; N uni1E25 ; G 1455\nU 7718 ; WX 945 ; N uni1E26 ; G 1456\nU 7719 ; WX 727 ; N uni1E27 ; G 1457\nU 7720 ; WX 945 ; N uni1E28 ; G 1458\nU 7721 ; WX 727 ; N uni1E29 ; G 1459\nU 7722 ; WX 945 ; N uni1E2A ; G 1460\nU 7723 ; WX 727 ; N uni1E2B ; G 1461\nU 7724 ; WX 468 ; N uni1E2C ; G 1462\nU 7725 ; WX 380 ; N uni1E2D ; G 1463\nU 7726 ; WX 468 ; N uni1E2E ; G 1464\nU 7727 ; WX 380 ; N uni1E2F ; G 1465\nU 7728 ; WX 869 ; N uni1E30 ; G 1466\nU 7729 ; WX 693 ; N uni1E31 ; G 1467\nU 7730 ; WX 869 ; N uni1E32 ; G 1468\nU 7731 ; WX 693 ; N uni1E33 ; G 1469\nU 7732 ; WX 869 ; N uni1E34 ; G 1470\nU 7733 ; WX 693 ; N uni1E35 ; G 1471\nU 7734 ; WX 703 ; N uni1E36 ; G 1472\nU 7735 ; WX 380 ; N uni1E37 ; G 1473\nU 7736 ; WX 703 ; N uni1E38 ; G 1474\nU 7737 ; WX 380 ; N uni1E39 ; G 1475\nU 7738 ; WX 703 ; N uni1E3A ; G 1476\nU 7739 ; WX 380 ; N uni1E3B ; G 1477\nU 7740 ; WX 703 ; N uni1E3C ; G 1478\nU 7741 ; WX 380 ; N uni1E3D ; G 1479\nU 7742 ; WX 1107 ; N uni1E3E ; G 1480\nU 7743 ; WX 1058 ; N uni1E3F ; G 1481\nU 7744 ; WX 1107 ; N uni1E40 ; G 1482\nU 7745 ; WX 1058 ; N uni1E41 ; G 1483\nU 7746 ; WX 1107 ; N uni1E42 ; G 1484\nU 7747 ; WX 1058 ; N uni1E43 ; G 1485\nU 7748 ; WX 914 ; N uni1E44 ; G 1486\nU 7749 ; WX 727 ; N uni1E45 ; G 1487\nU 7750 ; WX 914 ; N uni1E46 ; G 1488\nU 7751 ; WX 727 ; N uni1E47 ; G 1489\nU 7752 ; WX 914 ; N uni1E48 ; G 1490\nU 7753 ; WX 727 ; N uni1E49 ; G 1491\nU 7754 ; WX 914 ; N uni1E4A ; G 1492\nU 7755 ; WX 727 ; N uni1E4B ; G 1493\nU 7756 ; WX 871 ; N uni1E4C ; G 1494\nU 7757 ; WX 667 ; N uni1E4D ; G 1495\nU 7758 ; WX 871 ; N uni1E4E ; G 1496\nU 7759 ; WX 667 ; N uni1E4F ; G 1497\nU 7760 ; WX 871 ; N uni1E50 ; G 1498\nU 7761 ; WX 667 ; N uni1E51 ; G 1499\nU 7762 ; WX 871 ; N uni1E52 ; G 1500\nU 7763 ; WX 667 ; N uni1E53 ; G 1501\nU 7764 ; WX 752 ; N uni1E54 ; G 1502\nU 7765 ; WX 699 ; N uni1E55 ; G 1503\nU 7766 ; WX 752 ; N uni1E56 ; G 1504\nU 7767 ; WX 699 ; N uni1E57 ; G 1505\nU 7768 ; WX 831 ; N uni1E58 ; G 1506\nU 7769 ; WX 527 ; N uni1E59 ; G 1507\nU 7770 ; WX 831 ; N uni1E5A ; G 1508\nU 7771 ; WX 527 ; N uni1E5B ; G 1509\nU 7772 ; WX 831 ; N uni1E5C ; G 1510\nU 7773 ; WX 527 ; N uni1E5D ; G 1511\nU 7774 ; WX 831 ; N uni1E5E ; G 1512\nU 7775 ; WX 527 ; N uni1E5F ; G 1513\nU 7776 ; WX 722 ; N uni1E60 ; G 1514\nU 7777 ; WX 563 ; N uni1E61 ; G 1515\nU 7778 ; WX 722 ; N uni1E62 ; G 1516\nU 7779 ; WX 563 ; N uni1E63 ; G 1517\nU 7780 ; WX 722 ; N uni1E64 ; G 1518\nU 7781 ; WX 563 ; N uni1E65 ; G 1519\nU 7782 ; WX 722 ; N uni1E66 ; G 1520\nU 7783 ; WX 563 ; N uni1E67 ; G 1521\nU 7784 ; WX 722 ; N uni1E68 ; G 1522\nU 7785 ; WX 563 ; N uni1E69 ; G 1523\nU 7786 ; WX 744 ; N uni1E6A ; G 1524\nU 7787 ; WX 462 ; N uni1E6B ; G 1525\nU 7788 ; WX 744 ; N uni1E6C ; G 1526\nU 7789 ; WX 462 ; N uni1E6D ; G 1527\nU 7790 ; WX 744 ; N uni1E6E ; G 1528\nU 7791 ; WX 462 ; N uni1E6F ; G 1529\nU 7792 ; WX 744 ; N uni1E70 ; G 1530\nU 7793 ; WX 462 ; N uni1E71 ; G 1531\nU 7794 ; WX 872 ; N uni1E72 ; G 1532\nU 7795 ; WX 727 ; N uni1E73 ; G 1533\nU 7796 ; WX 872 ; N uni1E74 ; G 1534\nU 7797 ; WX 727 ; N uni1E75 ; G 1535\nU 7798 ; WX 872 ; N uni1E76 ; G 1536\nU 7799 ; WX 727 ; N uni1E77 ; G 1537\nU 7800 ; WX 872 ; N uni1E78 ; G 1538\nU 7801 ; WX 727 ; N uni1E79 ; G 1539\nU 7802 ; WX 872 ; N uni1E7A ; G 1540\nU 7803 ; WX 727 ; N uni1E7B ; G 1541\nU 7804 ; WX 776 ; N uni1E7C ; G 1542\nU 7805 ; WX 581 ; N uni1E7D ; G 1543\nU 7806 ; WX 776 ; N uni1E7E ; G 1544\nU 7807 ; WX 581 ; N uni1E7F ; G 1545\nU 7808 ; WX 1123 ; N Wgrave ; G 1546\nU 7809 ; WX 861 ; N wgrave ; G 1547\nU 7810 ; WX 1123 ; N Wacute ; G 1548\nU 7811 ; WX 861 ; N wacute ; G 1549\nU 7812 ; WX 1123 ; N Wdieresis ; G 1550\nU 7813 ; WX 861 ; N wdieresis ; G 1551\nU 7814 ; WX 1123 ; N uni1E86 ; G 1552\nU 7815 ; WX 861 ; N uni1E87 ; G 1553\nU 7816 ; WX 1123 ; N uni1E88 ; G 1554\nU 7817 ; WX 861 ; N uni1E89 ; G 1555\nU 7818 ; WX 776 ; N uni1E8A ; G 1556\nU 7819 ; WX 596 ; N uni1E8B ; G 1557\nU 7820 ; WX 776 ; N uni1E8C ; G 1558\nU 7821 ; WX 596 ; N uni1E8D ; G 1559\nU 7822 ; WX 714 ; N uni1E8E ; G 1560\nU 7823 ; WX 581 ; N uni1E8F ; G 1561\nU 7824 ; WX 730 ; N uni1E90 ; G 1562\nU 7825 ; WX 568 ; N uni1E91 ; G 1563\nU 7826 ; WX 730 ; N uni1E92 ; G 1564\nU 7827 ; WX 568 ; N uni1E93 ; G 1565\nU 7828 ; WX 730 ; N uni1E94 ; G 1566\nU 7829 ; WX 568 ; N uni1E95 ; G 1567\nU 7830 ; WX 727 ; N uni1E96 ; G 1568\nU 7831 ; WX 462 ; N uni1E97 ; G 1569\nU 7832 ; WX 861 ; N uni1E98 ; G 1570\nU 7833 ; WX 581 ; N uni1E99 ; G 1571\nU 7834 ; WX 1014 ; N uni1E9A ; G 1572\nU 7835 ; WX 430 ; N uni1E9B ; G 1573\nU 7836 ; WX 430 ; N uni1E9C ; G 1574\nU 7837 ; WX 430 ; N uni1E9D ; G 1575\nU 7838 ; WX 947 ; N uni1E9E ; G 1576\nU 7839 ; WX 667 ; N uni1E9F ; G 1577\nU 7840 ; WX 776 ; N uni1EA0 ; G 1578\nU 7841 ; WX 648 ; N uni1EA1 ; G 1579\nU 7842 ; WX 776 ; N uni1EA2 ; G 1580\nU 7843 ; WX 648 ; N uni1EA3 ; G 1581\nU 7844 ; WX 776 ; N uni1EA4 ; G 1582\nU 7845 ; WX 648 ; N uni1EA5 ; G 1583\nU 7846 ; WX 776 ; N uni1EA6 ; G 1584\nU 7847 ; WX 648 ; N uni1EA7 ; G 1585\nU 7848 ; WX 776 ; N uni1EA8 ; G 1586\nU 7849 ; WX 648 ; N uni1EA9 ; G 1587\nU 7850 ; WX 776 ; N uni1EAA ; G 1588\nU 7851 ; WX 648 ; N uni1EAB ; G 1589\nU 7852 ; WX 776 ; N uni1EAC ; G 1590\nU 7853 ; WX 648 ; N uni1EAD ; G 1591\nU 7854 ; WX 776 ; N uni1EAE ; G 1592\nU 7855 ; WX 648 ; N uni1EAF ; G 1593\nU 7856 ; WX 776 ; N uni1EB0 ; G 1594\nU 7857 ; WX 648 ; N uni1EB1 ; G 1595\nU 7858 ; WX 776 ; N uni1EB2 ; G 1596\nU 7859 ; WX 648 ; N uni1EB3 ; G 1597\nU 7860 ; WX 776 ; N uni1EB4 ; G 1598\nU 7861 ; WX 648 ; N uni1EB5 ; G 1599\nU 7862 ; WX 776 ; N uni1EB6 ; G 1600\nU 7863 ; WX 648 ; N uni1EB7 ; G 1601\nU 7864 ; WX 762 ; N uni1EB8 ; G 1602\nU 7865 ; WX 636 ; N uni1EB9 ; G 1603\nU 7866 ; WX 762 ; N uni1EBA ; G 1604\nU 7867 ; WX 636 ; N uni1EBB ; G 1605\nU 7868 ; WX 762 ; N uni1EBC ; G 1606\nU 7869 ; WX 636 ; N uni1EBD ; G 1607\nU 7870 ; WX 762 ; N uni1EBE ; G 1608\nU 7871 ; WX 636 ; N uni1EBF ; G 1609\nU 7872 ; WX 762 ; N uni1EC0 ; G 1610\nU 7873 ; WX 636 ; N uni1EC1 ; G 1611\nU 7874 ; WX 762 ; N uni1EC2 ; G 1612\nU 7875 ; WX 636 ; N uni1EC3 ; G 1613\nU 7876 ; WX 762 ; N uni1EC4 ; G 1614\nU 7877 ; WX 636 ; N uni1EC5 ; G 1615\nU 7878 ; WX 762 ; N uni1EC6 ; G 1616\nU 7879 ; WX 636 ; N uni1EC7 ; G 1617\nU 7880 ; WX 468 ; N uni1EC8 ; G 1618\nU 7881 ; WX 380 ; N uni1EC9 ; G 1619\nU 7882 ; WX 468 ; N uni1ECA ; G 1620\nU 7883 ; WX 380 ; N uni1ECB ; G 1621\nU 7884 ; WX 871 ; N uni1ECC ; G 1622\nU 7885 ; WX 667 ; N uni1ECD ; G 1623\nU 7886 ; WX 871 ; N uni1ECE ; G 1624\nU 7887 ; WX 667 ; N uni1ECF ; G 1625\nU 7888 ; WX 871 ; N uni1ED0 ; G 1626\nU 7889 ; WX 667 ; N uni1ED1 ; G 1627\nU 7890 ; WX 871 ; N uni1ED2 ; G 1628\nU 7891 ; WX 667 ; N uni1ED3 ; G 1629\nU 7892 ; WX 871 ; N uni1ED4 ; G 1630\nU 7893 ; WX 667 ; N uni1ED5 ; G 1631\nU 7894 ; WX 871 ; N uni1ED6 ; G 1632\nU 7895 ; WX 667 ; N uni1ED7 ; G 1633\nU 7896 ; WX 871 ; N uni1ED8 ; G 1634\nU 7897 ; WX 667 ; N uni1ED9 ; G 1635\nU 7898 ; WX 871 ; N uni1EDA ; G 1636\nU 7899 ; WX 667 ; N uni1EDB ; G 1637\nU 7900 ; WX 871 ; N uni1EDC ; G 1638\nU 7901 ; WX 667 ; N uni1EDD ; G 1639\nU 7902 ; WX 871 ; N uni1EDE ; G 1640\nU 7903 ; WX 667 ; N uni1EDF ; G 1641\nU 7904 ; WX 871 ; N uni1EE0 ; G 1642\nU 7905 ; WX 667 ; N uni1EE1 ; G 1643\nU 7906 ; WX 871 ; N uni1EE2 ; G 1644\nU 7907 ; WX 667 ; N uni1EE3 ; G 1645\nU 7908 ; WX 872 ; N uni1EE4 ; G 1646\nU 7909 ; WX 727 ; N uni1EE5 ; G 1647\nU 7910 ; WX 872 ; N uni1EE6 ; G 1648\nU 7911 ; WX 727 ; N uni1EE7 ; G 1649\nU 7912 ; WX 872 ; N uni1EE8 ; G 1650\nU 7913 ; WX 727 ; N uni1EE9 ; G 1651\nU 7914 ; WX 872 ; N uni1EEA ; G 1652\nU 7915 ; WX 727 ; N uni1EEB ; G 1653\nU 7916 ; WX 872 ; N uni1EEC ; G 1654\nU 7917 ; WX 727 ; N uni1EED ; G 1655\nU 7918 ; WX 872 ; N uni1EEE ; G 1656\nU 7919 ; WX 727 ; N uni1EEF ; G 1657\nU 7920 ; WX 872 ; N uni1EF0 ; G 1658\nU 7921 ; WX 727 ; N uni1EF1 ; G 1659\nU 7922 ; WX 714 ; N Ygrave ; G 1660\nU 7923 ; WX 581 ; N ygrave ; G 1661\nU 7924 ; WX 714 ; N uni1EF4 ; G 1662\nU 7925 ; WX 581 ; N uni1EF5 ; G 1663\nU 7926 ; WX 714 ; N uni1EF6 ; G 1664\nU 7927 ; WX 581 ; N uni1EF7 ; G 1665\nU 7928 ; WX 714 ; N uni1EF8 ; G 1666\nU 7929 ; WX 581 ; N uni1EF9 ; G 1667\nU 7930 ; WX 1078 ; N uni1EFA ; G 1668\nU 7931 ; WX 701 ; N uni1EFB ; G 1669\nU 7936 ; WX 770 ; N uni1F00 ; G 1670\nU 7937 ; WX 770 ; N uni1F01 ; G 1671\nU 7938 ; WX 770 ; N uni1F02 ; G 1672\nU 7939 ; WX 770 ; N uni1F03 ; G 1673\nU 7940 ; WX 770 ; N uni1F04 ; G 1674\nU 7941 ; WX 770 ; N uni1F05 ; G 1675\nU 7942 ; WX 770 ; N uni1F06 ; G 1676\nU 7943 ; WX 770 ; N uni1F07 ; G 1677\nU 7944 ; WX 776 ; N uni1F08 ; G 1678\nU 7945 ; WX 776 ; N uni1F09 ; G 1679\nU 7946 ; WX 978 ; N uni1F0A ; G 1680\nU 7947 ; WX 978 ; N uni1F0B ; G 1681\nU 7948 ; WX 832 ; N uni1F0C ; G 1682\nU 7949 ; WX 849 ; N uni1F0D ; G 1683\nU 7950 ; WX 776 ; N uni1F0E ; G 1684\nU 7951 ; WX 776 ; N uni1F0F ; G 1685\nU 7952 ; WX 608 ; N uni1F10 ; G 1686\nU 7953 ; WX 608 ; N uni1F11 ; G 1687\nU 7954 ; WX 608 ; N uni1F12 ; G 1688\nU 7955 ; WX 608 ; N uni1F13 ; G 1689\nU 7956 ; WX 608 ; N uni1F14 ; G 1690\nU 7957 ; WX 608 ; N uni1F15 ; G 1691\nU 7960 ; WX 917 ; N uni1F18 ; G 1692\nU 7961 ; WX 909 ; N uni1F19 ; G 1693\nU 7962 ; WX 1169 ; N uni1F1A ; G 1694\nU 7963 ; WX 1169 ; N uni1F1B ; G 1695\nU 7964 ; WX 1093 ; N uni1F1C ; G 1696\nU 7965 ; WX 1120 ; N uni1F1D ; G 1697\nU 7968 ; WX 727 ; N uni1F20 ; G 1698\nU 7969 ; WX 727 ; N uni1F21 ; G 1699\nU 7970 ; WX 727 ; N uni1F22 ; G 1700\nU 7971 ; WX 727 ; N uni1F23 ; G 1701\nU 7972 ; WX 727 ; N uni1F24 ; G 1702\nU 7973 ; WX 727 ; N uni1F25 ; G 1703\nU 7974 ; WX 727 ; N uni1F26 ; G 1704\nU 7975 ; WX 727 ; N uni1F27 ; G 1705\nU 7976 ; WX 1100 ; N uni1F28 ; G 1706\nU 7977 ; WX 1094 ; N uni1F29 ; G 1707\nU 7978 ; WX 1358 ; N uni1F2A ; G 1708\nU 7979 ; WX 1361 ; N uni1F2B ; G 1709\nU 7980 ; WX 1279 ; N uni1F2C ; G 1710\nU 7981 ; WX 1308 ; N uni1F2D ; G 1711\nU 7982 ; WX 1197 ; N uni1F2E ; G 1712\nU 7983 ; WX 1194 ; N uni1F2F ; G 1713\nU 7984 ; WX 484 ; N uni1F30 ; G 1714\nU 7985 ; WX 484 ; N uni1F31 ; G 1715\nU 7986 ; WX 484 ; N uni1F32 ; G 1716\nU 7987 ; WX 484 ; N uni1F33 ; G 1717\nU 7988 ; WX 484 ; N uni1F34 ; G 1718\nU 7989 ; WX 484 ; N uni1F35 ; G 1719\nU 7990 ; WX 484 ; N uni1F36 ; G 1720\nU 7991 ; WX 484 ; N uni1F37 ; G 1721\nU 7992 ; WX 629 ; N uni1F38 ; G 1722\nU 7993 ; WX 617 ; N uni1F39 ; G 1723\nU 7994 ; WX 878 ; N uni1F3A ; G 1724\nU 7995 ; WX 881 ; N uni1F3B ; G 1725\nU 7996 ; WX 799 ; N uni1F3C ; G 1726\nU 7997 ; WX 831 ; N uni1F3D ; G 1727\nU 7998 ; WX 723 ; N uni1F3E ; G 1728\nU 7999 ; WX 714 ; N uni1F3F ; G 1729\nU 8000 ; WX 667 ; N uni1F40 ; G 1730\nU 8001 ; WX 667 ; N uni1F41 ; G 1731\nU 8002 ; WX 667 ; N uni1F42 ; G 1732\nU 8003 ; WX 667 ; N uni1F43 ; G 1733\nU 8004 ; WX 667 ; N uni1F44 ; G 1734\nU 8005 ; WX 667 ; N uni1F45 ; G 1735\nU 8008 ; WX 900 ; N uni1F48 ; G 1736\nU 8009 ; WX 935 ; N uni1F49 ; G 1737\nU 8010 ; WX 1240 ; N uni1F4A ; G 1738\nU 8011 ; WX 1237 ; N uni1F4B ; G 1739\nU 8012 ; WX 1035 ; N uni1F4C ; G 1740\nU 8013 ; WX 1066 ; N uni1F4D ; G 1741\nU 8016 ; WX 694 ; N uni1F50 ; G 1742\nU 8017 ; WX 694 ; N uni1F51 ; G 1743\nU 8018 ; WX 694 ; N uni1F52 ; G 1744\nU 8019 ; WX 694 ; N uni1F53 ; G 1745\nU 8020 ; WX 694 ; N uni1F54 ; G 1746\nU 8021 ; WX 694 ; N uni1F55 ; G 1747\nU 8022 ; WX 694 ; N uni1F56 ; G 1748\nU 8023 ; WX 694 ; N uni1F57 ; G 1749\nU 8025 ; WX 922 ; N uni1F59 ; G 1750\nU 8027 ; WX 1186 ; N uni1F5B ; G 1751\nU 8029 ; WX 1133 ; N uni1F5D ; G 1752\nU 8031 ; WX 1019 ; N uni1F5F ; G 1753\nU 8032 ; WX 952 ; N uni1F60 ; G 1754\nU 8033 ; WX 952 ; N uni1F61 ; G 1755\nU 8034 ; WX 952 ; N uni1F62 ; G 1756\nU 8035 ; WX 952 ; N uni1F63 ; G 1757\nU 8036 ; WX 952 ; N uni1F64 ; G 1758\nU 8037 ; WX 952 ; N uni1F65 ; G 1759\nU 8038 ; WX 952 ; N uni1F66 ; G 1760\nU 8039 ; WX 952 ; N uni1F67 ; G 1761\nU 8040 ; WX 931 ; N uni1F68 ; G 1762\nU 8041 ; WX 963 ; N uni1F69 ; G 1763\nU 8042 ; WX 1268 ; N uni1F6A ; G 1764\nU 8043 ; WX 1274 ; N uni1F6B ; G 1765\nU 8044 ; WX 1054 ; N uni1F6C ; G 1766\nU 8045 ; WX 1088 ; N uni1F6D ; G 1767\nU 8046 ; WX 1023 ; N uni1F6E ; G 1768\nU 8047 ; WX 1060 ; N uni1F6F ; G 1769\nU 8048 ; WX 770 ; N uni1F70 ; G 1770\nU 8049 ; WX 770 ; N uni1F71 ; G 1771\nU 8050 ; WX 608 ; N uni1F72 ; G 1772\nU 8051 ; WX 608 ; N uni1F73 ; G 1773\nU 8052 ; WX 727 ; N uni1F74 ; G 1774\nU 8053 ; WX 727 ; N uni1F75 ; G 1775\nU 8054 ; WX 484 ; N uni1F76 ; G 1776\nU 8055 ; WX 484 ; N uni1F77 ; G 1777\nU 8056 ; WX 667 ; N uni1F78 ; G 1778\nU 8057 ; WX 667 ; N uni1F79 ; G 1779\nU 8058 ; WX 694 ; N uni1F7A ; G 1780\nU 8059 ; WX 694 ; N uni1F7B ; G 1781\nU 8060 ; WX 952 ; N uni1F7C ; G 1782\nU 8061 ; WX 952 ; N uni1F7D ; G 1783\nU 8064 ; WX 770 ; N uni1F80 ; G 1784\nU 8065 ; WX 770 ; N uni1F81 ; G 1785\nU 8066 ; WX 770 ; N uni1F82 ; G 1786\nU 8067 ; WX 770 ; N uni1F83 ; G 1787\nU 8068 ; WX 770 ; N uni1F84 ; G 1788\nU 8069 ; WX 770 ; N uni1F85 ; G 1789\nU 8070 ; WX 770 ; N uni1F86 ; G 1790\nU 8071 ; WX 770 ; N uni1F87 ; G 1791\nU 8072 ; WX 776 ; N uni1F88 ; G 1792\nU 8073 ; WX 776 ; N uni1F89 ; G 1793\nU 8074 ; WX 978 ; N uni1F8A ; G 1794\nU 8075 ; WX 978 ; N uni1F8B ; G 1795\nU 8076 ; WX 832 ; N uni1F8C ; G 1796\nU 8077 ; WX 849 ; N uni1F8D ; G 1797\nU 8078 ; WX 776 ; N uni1F8E ; G 1798\nU 8079 ; WX 776 ; N uni1F8F ; G 1799\nU 8080 ; WX 727 ; N uni1F90 ; G 1800\nU 8081 ; WX 727 ; N uni1F91 ; G 1801\nU 8082 ; WX 727 ; N uni1F92 ; G 1802\nU 8083 ; WX 727 ; N uni1F93 ; G 1803\nU 8084 ; WX 727 ; N uni1F94 ; G 1804\nU 8085 ; WX 727 ; N uni1F95 ; G 1805\nU 8086 ; WX 727 ; N uni1F96 ; G 1806\nU 8087 ; WX 727 ; N uni1F97 ; G 1807\nU 8088 ; WX 1100 ; N uni1F98 ; G 1808\nU 8089 ; WX 1094 ; N uni1F99 ; G 1809\nU 8090 ; WX 1358 ; N uni1F9A ; G 1810\nU 8091 ; WX 1361 ; N uni1F9B ; G 1811\nU 8092 ; WX 1279 ; N uni1F9C ; G 1812\nU 8093 ; WX 1308 ; N uni1F9D ; G 1813\nU 8094 ; WX 1197 ; N uni1F9E ; G 1814\nU 8095 ; WX 1194 ; N uni1F9F ; G 1815\nU 8096 ; WX 952 ; N uni1FA0 ; G 1816\nU 8097 ; WX 952 ; N uni1FA1 ; G 1817\nU 8098 ; WX 952 ; N uni1FA2 ; G 1818\nU 8099 ; WX 952 ; N uni1FA3 ; G 1819\nU 8100 ; WX 952 ; N uni1FA4 ; G 1820\nU 8101 ; WX 952 ; N uni1FA5 ; G 1821\nU 8102 ; WX 952 ; N uni1FA6 ; G 1822\nU 8103 ; WX 952 ; N uni1FA7 ; G 1823\nU 8104 ; WX 931 ; N uni1FA8 ; G 1824\nU 8105 ; WX 963 ; N uni1FA9 ; G 1825\nU 8106 ; WX 1268 ; N uni1FAA ; G 1826\nU 8107 ; WX 1274 ; N uni1FAB ; G 1827\nU 8108 ; WX 1054 ; N uni1FAC ; G 1828\nU 8109 ; WX 1088 ; N uni1FAD ; G 1829\nU 8110 ; WX 1023 ; N uni1FAE ; G 1830\nU 8111 ; WX 1060 ; N uni1FAF ; G 1831\nU 8112 ; WX 770 ; N uni1FB0 ; G 1832\nU 8113 ; WX 770 ; N uni1FB1 ; G 1833\nU 8114 ; WX 770 ; N uni1FB2 ; G 1834\nU 8115 ; WX 770 ; N uni1FB3 ; G 1835\nU 8116 ; WX 770 ; N uni1FB4 ; G 1836\nU 8118 ; WX 770 ; N uni1FB6 ; G 1837\nU 8119 ; WX 770 ; N uni1FB7 ; G 1838\nU 8120 ; WX 776 ; N uni1FB8 ; G 1839\nU 8121 ; WX 776 ; N uni1FB9 ; G 1840\nU 8122 ; WX 811 ; N uni1FBA ; G 1841\nU 8123 ; WX 776 ; N uni1FBB ; G 1842\nU 8124 ; WX 776 ; N uni1FBC ; G 1843\nU 8125 ; WX 500 ; N uni1FBD ; G 1844\nU 8126 ; WX 500 ; N uni1FBE ; G 1845\nU 8127 ; WX 500 ; N uni1FBF ; G 1846\nU 8128 ; WX 500 ; N uni1FC0 ; G 1847\nU 8129 ; WX 500 ; N uni1FC1 ; G 1848\nU 8130 ; WX 727 ; N uni1FC2 ; G 1849\nU 8131 ; WX 727 ; N uni1FC3 ; G 1850\nU 8132 ; WX 727 ; N uni1FC4 ; G 1851\nU 8134 ; WX 727 ; N uni1FC6 ; G 1852\nU 8135 ; WX 727 ; N uni1FC7 ; G 1853\nU 8136 ; WX 1000 ; N uni1FC8 ; G 1854\nU 8137 ; WX 947 ; N uni1FC9 ; G 1855\nU 8138 ; WX 1191 ; N uni1FCA ; G 1856\nU 8139 ; WX 1118 ; N uni1FCB ; G 1857\nU 8140 ; WX 945 ; N uni1FCC ; G 1858\nU 8141 ; WX 500 ; N uni1FCD ; G 1859\nU 8142 ; WX 500 ; N uni1FCE ; G 1860\nU 8143 ; WX 500 ; N uni1FCF ; G 1861\nU 8144 ; WX 484 ; N uni1FD0 ; G 1862\nU 8145 ; WX 484 ; N uni1FD1 ; G 1863\nU 8146 ; WX 484 ; N uni1FD2 ; G 1864\nU 8147 ; WX 484 ; N uni1FD3 ; G 1865\nU 8150 ; WX 484 ; N uni1FD6 ; G 1866\nU 8151 ; WX 484 ; N uni1FD7 ; G 1867\nU 8152 ; WX 468 ; N uni1FD8 ; G 1868\nU 8153 ; WX 468 ; N uni1FD9 ; G 1869\nU 8154 ; WX 714 ; N uni1FDA ; G 1870\nU 8155 ; WX 662 ; N uni1FDB ; G 1871\nU 8157 ; WX 500 ; N uni1FDD ; G 1872\nU 8158 ; WX 500 ; N uni1FDE ; G 1873\nU 8159 ; WX 500 ; N uni1FDF ; G 1874\nU 8160 ; WX 694 ; N uni1FE0 ; G 1875\nU 8161 ; WX 694 ; N uni1FE1 ; G 1876\nU 8162 ; WX 694 ; N uni1FE2 ; G 1877\nU 8163 ; WX 694 ; N uni1FE3 ; G 1878\nU 8164 ; WX 665 ; N uni1FE4 ; G 1879\nU 8165 ; WX 665 ; N uni1FE5 ; G 1880\nU 8166 ; WX 694 ; N uni1FE6 ; G 1881\nU 8167 ; WX 694 ; N uni1FE7 ; G 1882\nU 8168 ; WX 714 ; N uni1FE8 ; G 1883\nU 8169 ; WX 714 ; N uni1FE9 ; G 1884\nU 8170 ; WX 1019 ; N uni1FEA ; G 1885\nU 8171 ; WX 953 ; N uni1FEB ; G 1886\nU 8172 ; WX 910 ; N uni1FEC ; G 1887\nU 8173 ; WX 500 ; N uni1FED ; G 1888\nU 8174 ; WX 500 ; N uni1FEE ; G 1889\nU 8175 ; WX 500 ; N uni1FEF ; G 1890\nU 8178 ; WX 952 ; N uni1FF2 ; G 1891\nU 8179 ; WX 952 ; N uni1FF3 ; G 1892\nU 8180 ; WX 952 ; N uni1FF4 ; G 1893\nU 8182 ; WX 952 ; N uni1FF6 ; G 1894\nU 8183 ; WX 952 ; N uni1FF7 ; G 1895\nU 8184 ; WX 1069 ; N uni1FF8 ; G 1896\nU 8185 ; WX 887 ; N uni1FF9 ; G 1897\nU 8186 ; WX 1101 ; N uni1FFA ; G 1898\nU 8187 ; WX 911 ; N uni1FFB ; G 1899\nU 8188 ; WX 890 ; N uni1FFC ; G 1900\nU 8189 ; WX 500 ; N uni1FFD ; G 1901\nU 8190 ; WX 500 ; N uni1FFE ; G 1902\nU 8192 ; WX 500 ; N uni2000 ; G 1903\nU 8193 ; WX 1000 ; N uni2001 ; G 1904\nU 8194 ; WX 500 ; N uni2002 ; G 1905\nU 8195 ; WX 1000 ; N uni2003 ; G 1906\nU 8196 ; WX 330 ; N uni2004 ; G 1907\nU 8197 ; WX 250 ; N uni2005 ; G 1908\nU 8198 ; WX 167 ; N uni2006 ; G 1909\nU 8199 ; WX 696 ; N uni2007 ; G 1910\nU 8200 ; WX 348 ; N uni2008 ; G 1911\nU 8201 ; WX 200 ; N uni2009 ; G 1912\nU 8202 ; WX 100 ; N uni200A ; G 1913\nU 8203 ; WX 0 ; N uni200B ; G 1914\nU 8204 ; WX 0 ; N uni200C ; G 1915\nU 8205 ; WX 0 ; N uni200D ; G 1916\nU 8206 ; WX 0 ; N uni200E ; G 1917\nU 8207 ; WX 0 ; N uni200F ; G 1918\nU 8208 ; WX 415 ; N uni2010 ; G 1919\nU 8209 ; WX 415 ; N uni2011 ; G 1920\nU 8210 ; WX 696 ; N figuredash ; G 1921\nU 8211 ; WX 500 ; N endash ; G 1922\nU 8212 ; WX 1000 ; N emdash ; G 1923\nU 8213 ; WX 1000 ; N uni2015 ; G 1924\nU 8214 ; WX 500 ; N uni2016 ; G 1925\nU 8215 ; WX 500 ; N underscoredbl ; G 1926\nU 8216 ; WX 348 ; N quoteleft ; G 1927\nU 8217 ; WX 348 ; N quoteright ; G 1928\nU 8218 ; WX 348 ; N quotesinglbase ; G 1929\nU 8219 ; WX 348 ; N quotereversed ; G 1930\nU 8220 ; WX 575 ; N quotedblleft ; G 1931\nU 8221 ; WX 575 ; N quotedblright ; G 1932\nU 8222 ; WX 575 ; N quotedblbase ; G 1933\nU 8223 ; WX 575 ; N uni201F ; G 1934\nU 8224 ; WX 523 ; N dagger ; G 1935\nU 8225 ; WX 523 ; N daggerdbl ; G 1936\nU 8226 ; WX 639 ; N bullet ; G 1937\nU 8227 ; WX 639 ; N uni2023 ; G 1938\nU 8228 ; WX 348 ; N onedotenleader ; G 1939\nU 8229 ; WX 674 ; N twodotenleader ; G 1940\nU 8230 ; WX 1000 ; N ellipsis ; G 1941\nU 8234 ; WX 0 ; N uni202A ; G 1942\nU 8235 ; WX 0 ; N uni202B ; G 1943\nU 8236 ; WX 0 ; N uni202C ; G 1944\nU 8237 ; WX 0 ; N uni202D ; G 1945\nU 8238 ; WX 0 ; N uni202E ; G 1946\nU 8239 ; WX 200 ; N uni202F ; G 1947\nU 8240 ; WX 1385 ; N perthousand ; G 1948\nU 8241 ; WX 1820 ; N uni2031 ; G 1949\nU 8242 ; WX 264 ; N minute ; G 1950\nU 8243 ; WX 447 ; N second ; G 1951\nU 8244 ; WX 630 ; N uni2034 ; G 1952\nU 8245 ; WX 264 ; N uni2035 ; G 1953\nU 8246 ; WX 447 ; N uni2036 ; G 1954\nU 8247 ; WX 630 ; N uni2037 ; G 1955\nU 8248 ; WX 733 ; N uni2038 ; G 1956\nU 8249 ; WX 400 ; N guilsinglleft ; G 1957\nU 8250 ; WX 400 ; N guilsinglright ; G 1958\nU 8252 ; WX 629 ; N exclamdbl ; G 1959\nU 8253 ; WX 586 ; N uni203D ; G 1960\nU 8254 ; WX 500 ; N uni203E ; G 1961\nU 8258 ; WX 1023 ; N uni2042 ; G 1962\nU 8260 ; WX 167 ; N fraction ; G 1963\nU 8261 ; WX 473 ; N uni2045 ; G 1964\nU 8262 ; WX 473 ; N uni2046 ; G 1965\nU 8263 ; WX 1082 ; N uni2047 ; G 1966\nU 8264 ; WX 856 ; N uni2048 ; G 1967\nU 8265 ; WX 856 ; N uni2049 ; G 1968\nU 8267 ; WX 636 ; N uni204B ; G 1969\nU 8268 ; WX 500 ; N uni204C ; G 1970\nU 8269 ; WX 500 ; N uni204D ; G 1971\nU 8270 ; WX 523 ; N uni204E ; G 1972\nU 8271 ; WX 369 ; N uni204F ; G 1973\nU 8273 ; WX 523 ; N uni2051 ; G 1974\nU 8274 ; WX 556 ; N uni2052 ; G 1975\nU 8275 ; WX 1000 ; N uni2053 ; G 1976\nU 8279 ; WX 813 ; N uni2057 ; G 1977\nU 8287 ; WX 222 ; N uni205F ; G 1978\nU 8288 ; WX 0 ; N uni2060 ; G 1979\nU 8289 ; WX 0 ; N uni2061 ; G 1980\nU 8290 ; WX 0 ; N uni2062 ; G 1981\nU 8291 ; WX 0 ; N uni2063 ; G 1982\nU 8292 ; WX 0 ; N uni2064 ; G 1983\nU 8298 ; WX 0 ; N uni206A ; G 1984\nU 8299 ; WX 0 ; N uni206B ; G 1985\nU 8300 ; WX 0 ; N uni206C ; G 1986\nU 8301 ; WX 0 ; N uni206D ; G 1987\nU 8302 ; WX 0 ; N uni206E ; G 1988\nU 8303 ; WX 0 ; N uni206F ; G 1989\nU 8304 ; WX 438 ; N uni2070 ; G 1990\nU 8305 ; WX 239 ; N uni2071 ; G 1991\nU 8308 ; WX 438 ; N uni2074 ; G 1992\nU 8309 ; WX 438 ; N uni2075 ; G 1993\nU 8310 ; WX 438 ; N uni2076 ; G 1994\nU 8311 ; WX 438 ; N uni2077 ; G 1995\nU 8312 ; WX 438 ; N uni2078 ; G 1996\nU 8313 ; WX 438 ; N uni2079 ; G 1997\nU 8314 ; WX 528 ; N uni207A ; G 1998\nU 8315 ; WX 528 ; N uni207B ; G 1999\nU 8316 ; WX 528 ; N uni207C ; G 2000\nU 8317 ; WX 298 ; N uni207D ; G 2001\nU 8318 ; WX 298 ; N uni207E ; G 2002\nU 8319 ; WX 519 ; N uni207F ; G 2003\nU 8320 ; WX 438 ; N uni2080 ; G 2004\nU 8321 ; WX 438 ; N uni2081 ; G 2005\nU 8322 ; WX 438 ; N uni2082 ; G 2006\nU 8323 ; WX 438 ; N uni2083 ; G 2007\nU 8324 ; WX 438 ; N uni2084 ; G 2008\nU 8325 ; WX 438 ; N uni2085 ; G 2009\nU 8326 ; WX 438 ; N uni2086 ; G 2010\nU 8327 ; WX 438 ; N uni2087 ; G 2011\nU 8328 ; WX 438 ; N uni2088 ; G 2012\nU 8329 ; WX 438 ; N uni2089 ; G 2013\nU 8330 ; WX 528 ; N uni208A ; G 2014\nU 8331 ; WX 528 ; N uni208B ; G 2015\nU 8332 ; WX 528 ; N uni208C ; G 2016\nU 8333 ; WX 298 ; N uni208D ; G 2017\nU 8334 ; WX 298 ; N uni208E ; G 2018\nU 8336 ; WX 466 ; N uni2090 ; G 2019\nU 8337 ; WX 444 ; N uni2091 ; G 2020\nU 8338 ; WX 467 ; N uni2092 ; G 2021\nU 8339 ; WX 475 ; N uni2093 ; G 2022\nU 8340 ; WX 444 ; N uni2094 ; G 2023\nU 8341 ; WX 521 ; N uni2095 ; G 2024\nU 8342 ; WX 523 ; N uni2096 ; G 2025\nU 8343 ; WX 292 ; N uni2097 ; G 2026\nU 8344 ; WX 729 ; N uni2098 ; G 2027\nU 8345 ; WX 519 ; N uni2099 ; G 2028\nU 8346 ; WX 499 ; N uni209A ; G 2029\nU 8347 ; WX 395 ; N uni209B ; G 2030\nU 8348 ; WX 371 ; N uni209C ; G 2031\nU 8358 ; WX 696 ; N uni20A6 ; G 2032\nU 8364 ; WX 696 ; N Euro ; G 2033\nU 8367 ; WX 1155 ; N uni20AF ; G 2034\nU 8369 ; WX 790 ; N uni20B1 ; G 2035\nU 8372 ; WX 876 ; N uni20B4 ; G 2036\nU 8373 ; WX 696 ; N uni20B5 ; G 2037\nU 8376 ; WX 696 ; N uni20B8 ; G 2038\nU 8377 ; WX 696 ; N uni20B9 ; G 2039\nU 8378 ; WX 696 ; N uni20BA ; G 2040\nU 8381 ; WX 696 ; N uni20BD ; G 2041\nU 8451 ; WX 1198 ; N uni2103 ; G 2042\nU 8457 ; WX 1112 ; N uni2109 ; G 2043\nU 8462 ; WX 727 ; N uni210E ; G 2044\nU 8463 ; WX 727 ; N uni210F ; G 2045\nU 8470 ; WX 1087 ; N uni2116 ; G 2046\nU 8482 ; WX 1000 ; N trademark ; G 2047\nU 8486 ; WX 890 ; N uni2126 ; G 2048\nU 8487 ; WX 890 ; N uni2127 ; G 2049\nU 8490 ; WX 869 ; N uni212A ; G 2050\nU 8491 ; WX 776 ; N uni212B ; G 2051\nU 8498 ; WX 710 ; N uni2132 ; G 2052\nU 8513 ; WX 775 ; N uni2141 ; G 2053\nU 8514 ; WX 557 ; N uni2142 ; G 2054\nU 8515 ; WX 637 ; N uni2143 ; G 2055\nU 8516 ; WX 760 ; N uni2144 ; G 2056\nU 8523 ; WX 903 ; N uni214B ; G 2057\nU 8526 ; WX 592 ; N uni214E ; G 2058\nU 8528 ; WX 1035 ; N uni2150 ; G 2059\nU 8529 ; WX 1035 ; N uni2151 ; G 2060\nU 8530 ; WX 1473 ; N uni2152 ; G 2061\nU 8531 ; WX 1035 ; N onethird ; G 2062\nU 8532 ; WX 1035 ; N twothirds ; G 2063\nU 8533 ; WX 1035 ; N uni2155 ; G 2064\nU 8534 ; WX 1035 ; N uni2156 ; G 2065\nU 8535 ; WX 1035 ; N uni2157 ; G 2066\nU 8536 ; WX 1035 ; N uni2158 ; G 2067\nU 8537 ; WX 1035 ; N uni2159 ; G 2068\nU 8538 ; WX 1035 ; N uni215A ; G 2069\nU 8539 ; WX 1035 ; N oneeighth ; G 2070\nU 8540 ; WX 1035 ; N threeeighths ; G 2071\nU 8541 ; WX 1035 ; N fiveeighths ; G 2072\nU 8542 ; WX 1035 ; N seveneighths ; G 2073\nU 8543 ; WX 615 ; N uni215F ; G 2074\nU 8544 ; WX 468 ; N uni2160 ; G 2075\nU 8545 ; WX 843 ; N uni2161 ; G 2076\nU 8546 ; WX 1218 ; N uni2162 ; G 2077\nU 8547 ; WX 1135 ; N uni2163 ; G 2078\nU 8548 ; WX 776 ; N uni2164 ; G 2079\nU 8549 ; WX 1150 ; N uni2165 ; G 2080\nU 8550 ; WX 1525 ; N uni2166 ; G 2081\nU 8551 ; WX 1900 ; N uni2167 ; G 2082\nU 8552 ; WX 1126 ; N uni2168 ; G 2083\nU 8553 ; WX 776 ; N uni2169 ; G 2084\nU 8554 ; WX 1127 ; N uni216A ; G 2085\nU 8555 ; WX 1502 ; N uni216B ; G 2086\nU 8556 ; WX 703 ; N uni216C ; G 2087\nU 8557 ; WX 796 ; N uni216D ; G 2088\nU 8558 ; WX 867 ; N uni216E ; G 2089\nU 8559 ; WX 1107 ; N uni216F ; G 2090\nU 8560 ; WX 380 ; N uni2170 ; G 2091\nU 8561 ; WX 760 ; N uni2171 ; G 2092\nU 8562 ; WX 1140 ; N uni2172 ; G 2093\nU 8563 ; WX 961 ; N uni2173 ; G 2094\nU 8564 ; WX 581 ; N uni2174 ; G 2095\nU 8565 ; WX 961 ; N uni2175 ; G 2096\nU 8566 ; WX 1341 ; N uni2176 ; G 2097\nU 8567 ; WX 1721 ; N uni2177 ; G 2098\nU 8568 ; WX 976 ; N uni2178 ; G 2099\nU 8569 ; WX 596 ; N uni2179 ; G 2100\nU 8570 ; WX 976 ; N uni217A ; G 2101\nU 8571 ; WX 1356 ; N uni217B ; G 2102\nU 8572 ; WX 380 ; N uni217C ; G 2103\nU 8573 ; WX 609 ; N uni217D ; G 2104\nU 8574 ; WX 699 ; N uni217E ; G 2105\nU 8575 ; WX 1058 ; N uni217F ; G 2106\nU 8576 ; WX 1255 ; N uni2180 ; G 2107\nU 8577 ; WX 867 ; N uni2181 ; G 2108\nU 8578 ; WX 1268 ; N uni2182 ; G 2109\nU 8579 ; WX 796 ; N uni2183 ; G 2110\nU 8580 ; WX 609 ; N uni2184 ; G 2111\nU 8581 ; WX 796 ; N uni2185 ; G 2112\nU 8585 ; WX 1035 ; N uni2189 ; G 2113\nU 8592 ; WX 838 ; N arrowleft ; G 2114\nU 8593 ; WX 838 ; N arrowup ; G 2115\nU 8594 ; WX 838 ; N arrowright ; G 2116\nU 8595 ; WX 838 ; N arrowdown ; G 2117\nU 8596 ; WX 838 ; N arrowboth ; G 2118\nU 8597 ; WX 838 ; N arrowupdn ; G 2119\nU 8598 ; WX 838 ; N uni2196 ; G 2120\nU 8599 ; WX 838 ; N uni2197 ; G 2121\nU 8600 ; WX 838 ; N uni2198 ; G 2122\nU 8601 ; WX 838 ; N uni2199 ; G 2123\nU 8602 ; WX 838 ; N uni219A ; G 2124\nU 8603 ; WX 838 ; N uni219B ; G 2125\nU 8604 ; WX 838 ; N uni219C ; G 2126\nU 8605 ; WX 838 ; N uni219D ; G 2127\nU 8606 ; WX 838 ; N uni219E ; G 2128\nU 8607 ; WX 838 ; N uni219F ; G 2129\nU 8608 ; WX 838 ; N uni21A0 ; G 2130\nU 8609 ; WX 838 ; N uni21A1 ; G 2131\nU 8610 ; WX 838 ; N uni21A2 ; G 2132\nU 8611 ; WX 838 ; N uni21A3 ; G 2133\nU 8612 ; WX 838 ; N uni21A4 ; G 2134\nU 8613 ; WX 838 ; N uni21A5 ; G 2135\nU 8614 ; WX 838 ; N uni21A6 ; G 2136\nU 8615 ; WX 838 ; N uni21A7 ; G 2137\nU 8616 ; WX 838 ; N arrowupdnbse ; G 2138\nU 8617 ; WX 838 ; N uni21A9 ; G 2139\nU 8618 ; WX 838 ; N uni21AA ; G 2140\nU 8619 ; WX 838 ; N uni21AB ; G 2141\nU 8620 ; WX 838 ; N uni21AC ; G 2142\nU 8621 ; WX 838 ; N uni21AD ; G 2143\nU 8622 ; WX 838 ; N uni21AE ; G 2144\nU 8623 ; WX 850 ; N uni21AF ; G 2145\nU 8624 ; WX 838 ; N uni21B0 ; G 2146\nU 8625 ; WX 838 ; N uni21B1 ; G 2147\nU 8626 ; WX 838 ; N uni21B2 ; G 2148\nU 8627 ; WX 838 ; N uni21B3 ; G 2149\nU 8628 ; WX 838 ; N uni21B4 ; G 2150\nU 8629 ; WX 838 ; N carriagereturn ; G 2151\nU 8630 ; WX 838 ; N uni21B6 ; G 2152\nU 8631 ; WX 838 ; N uni21B7 ; G 2153\nU 8632 ; WX 838 ; N uni21B8 ; G 2154\nU 8633 ; WX 838 ; N uni21B9 ; G 2155\nU 8634 ; WX 838 ; N uni21BA ; G 2156\nU 8635 ; WX 838 ; N uni21BB ; G 2157\nU 8636 ; WX 838 ; N uni21BC ; G 2158\nU 8637 ; WX 838 ; N uni21BD ; G 2159\nU 8638 ; WX 838 ; N uni21BE ; G 2160\nU 8639 ; WX 838 ; N uni21BF ; G 2161\nU 8640 ; WX 838 ; N uni21C0 ; G 2162\nU 8641 ; WX 838 ; N uni21C1 ; G 2163\nU 8642 ; WX 838 ; N uni21C2 ; G 2164\nU 8643 ; WX 838 ; N uni21C3 ; G 2165\nU 8644 ; WX 838 ; N uni21C4 ; G 2166\nU 8645 ; WX 838 ; N uni21C5 ; G 2167\nU 8646 ; WX 838 ; N uni21C6 ; G 2168\nU 8647 ; WX 838 ; N uni21C7 ; G 2169\nU 8648 ; WX 838 ; N uni21C8 ; G 2170\nU 8649 ; WX 838 ; N uni21C9 ; G 2171\nU 8650 ; WX 838 ; N uni21CA ; G 2172\nU 8651 ; WX 838 ; N uni21CB ; G 2173\nU 8652 ; WX 838 ; N uni21CC ; G 2174\nU 8653 ; WX 838 ; N uni21CD ; G 2175\nU 8654 ; WX 838 ; N uni21CE ; G 2176\nU 8655 ; WX 838 ; N uni21CF ; G 2177\nU 8656 ; WX 838 ; N arrowdblleft ; G 2178\nU 8657 ; WX 838 ; N arrowdblup ; G 2179\nU 8658 ; WX 838 ; N arrowdblright ; G 2180\nU 8659 ; WX 838 ; N arrowdbldown ; G 2181\nU 8660 ; WX 838 ; N arrowdblboth ; G 2182\nU 8661 ; WX 838 ; N uni21D5 ; G 2183\nU 8662 ; WX 838 ; N uni21D6 ; G 2184\nU 8663 ; WX 838 ; N uni21D7 ; G 2185\nU 8664 ; WX 838 ; N uni21D8 ; G 2186\nU 8665 ; WX 838 ; N uni21D9 ; G 2187\nU 8666 ; WX 838 ; N uni21DA ; G 2188\nU 8667 ; WX 838 ; N uni21DB ; G 2189\nU 8668 ; WX 838 ; N uni21DC ; G 2190\nU 8669 ; WX 838 ; N uni21DD ; G 2191\nU 8670 ; WX 838 ; N uni21DE ; G 2192\nU 8671 ; WX 838 ; N uni21DF ; G 2193\nU 8672 ; WX 838 ; N uni21E0 ; G 2194\nU 8673 ; WX 838 ; N uni21E1 ; G 2195\nU 8674 ; WX 838 ; N uni21E2 ; G 2196\nU 8675 ; WX 838 ; N uni21E3 ; G 2197\nU 8676 ; WX 838 ; N uni21E4 ; G 2198\nU 8677 ; WX 838 ; N uni21E5 ; G 2199\nU 8678 ; WX 838 ; N uni21E6 ; G 2200\nU 8679 ; WX 838 ; N uni21E7 ; G 2201\nU 8680 ; WX 838 ; N uni21E8 ; G 2202\nU 8681 ; WX 838 ; N uni21E9 ; G 2203\nU 8682 ; WX 838 ; N uni21EA ; G 2204\nU 8683 ; WX 838 ; N uni21EB ; G 2205\nU 8684 ; WX 838 ; N uni21EC ; G 2206\nU 8685 ; WX 838 ; N uni21ED ; G 2207\nU 8686 ; WX 838 ; N uni21EE ; G 2208\nU 8687 ; WX 838 ; N uni21EF ; G 2209\nU 8688 ; WX 838 ; N uni21F0 ; G 2210\nU 8689 ; WX 838 ; N uni21F1 ; G 2211\nU 8690 ; WX 838 ; N uni21F2 ; G 2212\nU 8691 ; WX 838 ; N uni21F3 ; G 2213\nU 8692 ; WX 838 ; N uni21F4 ; G 2214\nU 8693 ; WX 838 ; N uni21F5 ; G 2215\nU 8694 ; WX 838 ; N uni21F6 ; G 2216\nU 8695 ; WX 838 ; N uni21F7 ; G 2217\nU 8696 ; WX 838 ; N uni21F8 ; G 2218\nU 8697 ; WX 838 ; N uni21F9 ; G 2219\nU 8698 ; WX 838 ; N uni21FA ; G 2220\nU 8699 ; WX 838 ; N uni21FB ; G 2221\nU 8700 ; WX 838 ; N uni21FC ; G 2222\nU 8701 ; WX 838 ; N uni21FD ; G 2223\nU 8702 ; WX 838 ; N uni21FE ; G 2224\nU 8703 ; WX 838 ; N uni21FF ; G 2225\nU 8704 ; WX 641 ; N universal ; G 2226\nU 8706 ; WX 534 ; N partialdiff ; G 2227\nU 8707 ; WX 620 ; N existential ; G 2228\nU 8708 ; WX 620 ; N uni2204 ; G 2229\nU 8710 ; WX 753 ; N increment ; G 2230\nU 8711 ; WX 753 ; N gradient ; G 2231\nU 8712 ; WX 740 ; N element ; G 2232\nU 8713 ; WX 740 ; N notelement ; G 2233\nU 8715 ; WX 740 ; N suchthat ; G 2234\nU 8716 ; WX 740 ; N uni220C ; G 2235\nU 8719 ; WX 842 ; N product ; G 2236\nU 8720 ; WX 842 ; N uni2210 ; G 2237\nU 8721 ; WX 753 ; N summation ; G 2238\nU 8722 ; WX 838 ; N minus ; G 2239\nU 8723 ; WX 838 ; N uni2213 ; G 2240\nU 8724 ; WX 838 ; N uni2214 ; G 2241\nU 8725 ; WX 365 ; N uni2215 ; G 2242\nU 8727 ; WX 691 ; N asteriskmath ; G 2243\nU 8728 ; WX 519 ; N uni2218 ; G 2244\nU 8729 ; WX 519 ; N uni2219 ; G 2245\nU 8730 ; WX 657 ; N radical ; G 2246\nU 8731 ; WX 657 ; N uni221B ; G 2247\nU 8732 ; WX 657 ; N uni221C ; G 2248\nU 8733 ; WX 672 ; N proportional ; G 2249\nU 8734 ; WX 833 ; N infinity ; G 2250\nU 8735 ; WX 838 ; N orthogonal ; G 2251\nU 8736 ; WX 838 ; N angle ; G 2252\nU 8739 ; WX 324 ; N uni2223 ; G 2253\nU 8740 ; WX 607 ; N uni2224 ; G 2254\nU 8741 ; WX 529 ; N uni2225 ; G 2255\nU 8742 ; WX 773 ; N uni2226 ; G 2256\nU 8743 ; WX 812 ; N logicaland ; G 2257\nU 8744 ; WX 812 ; N logicalor ; G 2258\nU 8745 ; WX 838 ; N intersection ; G 2259\nU 8746 ; WX 838 ; N union ; G 2260\nU 8747 ; WX 579 ; N integral ; G 2261\nU 8748 ; WX 1000 ; N uni222C ; G 2262\nU 8749 ; WX 1391 ; N uni222D ; G 2263\nU 8760 ; WX 838 ; N uni2238 ; G 2264\nU 8761 ; WX 838 ; N uni2239 ; G 2265\nU 8762 ; WX 838 ; N uni223A ; G 2266\nU 8763 ; WX 838 ; N uni223B ; G 2267\nU 8764 ; WX 838 ; N similar ; G 2268\nU 8765 ; WX 838 ; N uni223D ; G 2269\nU 8770 ; WX 838 ; N uni2242 ; G 2270\nU 8771 ; WX 838 ; N uni2243 ; G 2271\nU 8776 ; WX 838 ; N approxequal ; G 2272\nU 8784 ; WX 838 ; N uni2250 ; G 2273\nU 8785 ; WX 838 ; N uni2251 ; G 2274\nU 8786 ; WX 838 ; N uni2252 ; G 2275\nU 8787 ; WX 838 ; N uni2253 ; G 2276\nU 8788 ; WX 1082 ; N uni2254 ; G 2277\nU 8789 ; WX 1082 ; N uni2255 ; G 2278\nU 8800 ; WX 838 ; N notequal ; G 2279\nU 8801 ; WX 838 ; N equivalence ; G 2280\nU 8804 ; WX 838 ; N lessequal ; G 2281\nU 8805 ; WX 838 ; N greaterequal ; G 2282\nU 8834 ; WX 838 ; N propersubset ; G 2283\nU 8835 ; WX 838 ; N propersuperset ; G 2284\nU 8836 ; WX 838 ; N notsubset ; G 2285\nU 8837 ; WX 838 ; N uni2285 ; G 2286\nU 8838 ; WX 838 ; N reflexsubset ; G 2287\nU 8839 ; WX 838 ; N reflexsuperset ; G 2288\nU 8844 ; WX 838 ; N uni228C ; G 2289\nU 8845 ; WX 838 ; N uni228D ; G 2290\nU 8846 ; WX 838 ; N uni228E ; G 2291\nU 8847 ; WX 838 ; N uni228F ; G 2292\nU 8848 ; WX 838 ; N uni2290 ; G 2293\nU 8849 ; WX 838 ; N uni2291 ; G 2294\nU 8850 ; WX 838 ; N uni2292 ; G 2295\nU 8851 ; WX 838 ; N uni2293 ; G 2296\nU 8852 ; WX 838 ; N uni2294 ; G 2297\nU 8853 ; WX 838 ; N circleplus ; G 2298\nU 8854 ; WX 838 ; N uni2296 ; G 2299\nU 8855 ; WX 838 ; N circlemultiply ; G 2300\nU 8856 ; WX 838 ; N uni2298 ; G 2301\nU 8857 ; WX 838 ; N uni2299 ; G 2302\nU 8858 ; WX 838 ; N uni229A ; G 2303\nU 8859 ; WX 838 ; N uni229B ; G 2304\nU 8860 ; WX 838 ; N uni229C ; G 2305\nU 8861 ; WX 838 ; N uni229D ; G 2306\nU 8862 ; WX 838 ; N uni229E ; G 2307\nU 8863 ; WX 838 ; N uni229F ; G 2308\nU 8864 ; WX 838 ; N uni22A0 ; G 2309\nU 8865 ; WX 838 ; N uni22A1 ; G 2310\nU 8866 ; WX 884 ; N uni22A2 ; G 2311\nU 8867 ; WX 884 ; N uni22A3 ; G 2312\nU 8868 ; WX 960 ; N uni22A4 ; G 2313\nU 8869 ; WX 960 ; N perpendicular ; G 2314\nU 8870 ; WX 616 ; N uni22A6 ; G 2315\nU 8871 ; WX 616 ; N uni22A7 ; G 2316\nU 8872 ; WX 884 ; N uni22A8 ; G 2317\nU 8873 ; WX 884 ; N uni22A9 ; G 2318\nU 8874 ; WX 884 ; N uni22AA ; G 2319\nU 8875 ; WX 1080 ; N uni22AB ; G 2320\nU 8876 ; WX 884 ; N uni22AC ; G 2321\nU 8877 ; WX 884 ; N uni22AD ; G 2322\nU 8878 ; WX 884 ; N uni22AE ; G 2323\nU 8879 ; WX 1080 ; N uni22AF ; G 2324\nU 8900 ; WX 626 ; N uni22C4 ; G 2325\nU 8901 ; WX 398 ; N dotmath ; G 2326\nU 8962 ; WX 834 ; N house ; G 2327\nU 8968 ; WX 473 ; N uni2308 ; G 2328\nU 8969 ; WX 473 ; N uni2309 ; G 2329\nU 8970 ; WX 473 ; N uni230A ; G 2330\nU 8971 ; WX 473 ; N uni230B ; G 2331\nU 8976 ; WX 838 ; N revlogicalnot ; G 2332\nU 8977 ; WX 539 ; N uni2311 ; G 2333\nU 8984 ; WX 928 ; N uni2318 ; G 2334\nU 8985 ; WX 838 ; N uni2319 ; G 2335\nU 8992 ; WX 579 ; N integraltp ; G 2336\nU 8993 ; WX 579 ; N integralbt ; G 2337\nU 8997 ; WX 1000 ; N uni2325 ; G 2338\nU 9000 ; WX 1443 ; N uni2328 ; G 2339\nU 9085 ; WX 1008 ; N uni237D ; G 2340\nU 9115 ; WX 500 ; N uni239B ; G 2341\nU 9116 ; WX 500 ; N uni239C ; G 2342\nU 9117 ; WX 500 ; N uni239D ; G 2343\nU 9118 ; WX 500 ; N uni239E ; G 2344\nU 9119 ; WX 500 ; N uni239F ; G 2345\nU 9120 ; WX 500 ; N uni23A0 ; G 2346\nU 9121 ; WX 500 ; N uni23A1 ; G 2347\nU 9122 ; WX 500 ; N uni23A2 ; G 2348\nU 9123 ; WX 500 ; N uni23A3 ; G 2349\nU 9124 ; WX 500 ; N uni23A4 ; G 2350\nU 9125 ; WX 500 ; N uni23A5 ; G 2351\nU 9126 ; WX 500 ; N uni23A6 ; G 2352\nU 9127 ; WX 750 ; N uni23A7 ; G 2353\nU 9128 ; WX 750 ; N uni23A8 ; G 2354\nU 9129 ; WX 750 ; N uni23A9 ; G 2355\nU 9130 ; WX 750 ; N uni23AA ; G 2356\nU 9131 ; WX 750 ; N uni23AB ; G 2357\nU 9132 ; WX 750 ; N uni23AC ; G 2358\nU 9133 ; WX 750 ; N uni23AD ; G 2359\nU 9134 ; WX 579 ; N uni23AE ; G 2360\nU 9167 ; WX 945 ; N uni23CF ; G 2361\nU 9251 ; WX 834 ; N uni2423 ; G 2362\nU 9472 ; WX 602 ; N SF100000 ; G 2363\nU 9473 ; WX 602 ; N uni2501 ; G 2364\nU 9474 ; WX 602 ; N SF110000 ; G 2365\nU 9475 ; WX 602 ; N uni2503 ; G 2366\nU 9476 ; WX 602 ; N uni2504 ; G 2367\nU 9477 ; WX 602 ; N uni2505 ; G 2368\nU 9478 ; WX 602 ; N uni2506 ; G 2369\nU 9479 ; WX 602 ; N uni2507 ; G 2370\nU 9480 ; WX 602 ; N uni2508 ; G 2371\nU 9481 ; WX 602 ; N uni2509 ; G 2372\nU 9482 ; WX 602 ; N uni250A ; G 2373\nU 9483 ; WX 602 ; N uni250B ; G 2374\nU 9484 ; WX 602 ; N SF010000 ; G 2375\nU 9485 ; WX 602 ; N uni250D ; G 2376\nU 9486 ; WX 602 ; N uni250E ; G 2377\nU 9487 ; WX 602 ; N uni250F ; G 2378\nU 9488 ; WX 602 ; N SF030000 ; G 2379\nU 9489 ; WX 602 ; N uni2511 ; G 2380\nU 9490 ; WX 602 ; N uni2512 ; G 2381\nU 9491 ; WX 602 ; N uni2513 ; G 2382\nU 9492 ; WX 602 ; N SF020000 ; G 2383\nU 9493 ; WX 602 ; N uni2515 ; G 2384\nU 9494 ; WX 602 ; N uni2516 ; G 2385\nU 9495 ; WX 602 ; N uni2517 ; G 2386\nU 9496 ; WX 602 ; N SF040000 ; G 2387\nU 9497 ; WX 602 ; N uni2519 ; G 2388\nU 9498 ; WX 602 ; N uni251A ; G 2389\nU 9499 ; WX 602 ; N uni251B ; G 2390\nU 9500 ; WX 602 ; N SF080000 ; G 2391\nU 9501 ; WX 602 ; N uni251D ; G 2392\nU 9502 ; WX 602 ; N uni251E ; G 2393\nU 9503 ; WX 602 ; N uni251F ; G 2394\nU 9504 ; WX 602 ; N uni2520 ; G 2395\nU 9505 ; WX 602 ; N uni2521 ; G 2396\nU 9506 ; WX 602 ; N uni2522 ; G 2397\nU 9507 ; WX 602 ; N uni2523 ; G 2398\nU 9508 ; WX 602 ; N SF090000 ; G 2399\nU 9509 ; WX 602 ; N uni2525 ; G 2400\nU 9510 ; WX 602 ; N uni2526 ; G 2401\nU 9511 ; WX 602 ; N uni2527 ; G 2402\nU 9512 ; WX 602 ; N uni2528 ; G 2403\nU 9513 ; WX 602 ; N uni2529 ; G 2404\nU 9514 ; WX 602 ; N uni252A ; G 2405\nU 9515 ; WX 602 ; N uni252B ; G 2406\nU 9516 ; WX 602 ; N SF060000 ; G 2407\nU 9517 ; WX 602 ; N uni252D ; G 2408\nU 9518 ; WX 602 ; N uni252E ; G 2409\nU 9519 ; WX 602 ; N uni252F ; G 2410\nU 9520 ; WX 602 ; N uni2530 ; G 2411\nU 9521 ; WX 602 ; N uni2531 ; G 2412\nU 9522 ; WX 602 ; N uni2532 ; G 2413\nU 9523 ; WX 602 ; N uni2533 ; G 2414\nU 9524 ; WX 602 ; N SF070000 ; G 2415\nU 9525 ; WX 602 ; N uni2535 ; G 2416\nU 9526 ; WX 602 ; N uni2536 ; G 2417\nU 9527 ; WX 602 ; N uni2537 ; G 2418\nU 9528 ; WX 602 ; N uni2538 ; G 2419\nU 9529 ; WX 602 ; N uni2539 ; G 2420\nU 9530 ; WX 602 ; N uni253A ; G 2421\nU 9531 ; WX 602 ; N uni253B ; G 2422\nU 9532 ; WX 602 ; N SF050000 ; G 2423\nU 9533 ; WX 602 ; N uni253D ; G 2424\nU 9534 ; WX 602 ; N uni253E ; G 2425\nU 9535 ; WX 602 ; N uni253F ; G 2426\nU 9536 ; WX 602 ; N uni2540 ; G 2427\nU 9537 ; WX 602 ; N uni2541 ; G 2428\nU 9538 ; WX 602 ; N uni2542 ; G 2429\nU 9539 ; WX 602 ; N uni2543 ; G 2430\nU 9540 ; WX 602 ; N uni2544 ; G 2431\nU 9541 ; WX 602 ; N uni2545 ; G 2432\nU 9542 ; WX 602 ; N uni2546 ; G 2433\nU 9543 ; WX 602 ; N uni2547 ; G 2434\nU 9544 ; WX 602 ; N uni2548 ; G 2435\nU 9545 ; WX 602 ; N uni2549 ; G 2436\nU 9546 ; WX 602 ; N uni254A ; G 2437\nU 9547 ; WX 602 ; N uni254B ; G 2438\nU 9548 ; WX 602 ; N uni254C ; G 2439\nU 9549 ; WX 602 ; N uni254D ; G 2440\nU 9550 ; WX 602 ; N uni254E ; G 2441\nU 9551 ; WX 602 ; N uni254F ; G 2442\nU 9552 ; WX 602 ; N SF430000 ; G 2443\nU 9553 ; WX 602 ; N SF240000 ; G 2444\nU 9554 ; WX 602 ; N SF510000 ; G 2445\nU 9555 ; WX 602 ; N SF520000 ; G 2446\nU 9556 ; WX 602 ; N SF390000 ; G 2447\nU 9557 ; WX 602 ; N SF220000 ; G 2448\nU 9558 ; WX 602 ; N SF210000 ; G 2449\nU 9559 ; WX 602 ; N SF250000 ; G 2450\nU 9560 ; WX 602 ; N SF500000 ; G 2451\nU 9561 ; WX 602 ; N SF490000 ; G 2452\nU 9562 ; WX 602 ; N SF380000 ; G 2453\nU 9563 ; WX 602 ; N SF280000 ; G 2454\nU 9564 ; WX 602 ; N SF270000 ; G 2455\nU 9565 ; WX 602 ; N SF260000 ; G 2456\nU 9566 ; WX 602 ; N SF360000 ; G 2457\nU 9567 ; WX 602 ; N SF370000 ; G 2458\nU 9568 ; WX 602 ; N SF420000 ; G 2459\nU 9569 ; WX 602 ; N SF190000 ; G 2460\nU 9570 ; WX 602 ; N SF200000 ; G 2461\nU 9571 ; WX 602 ; N SF230000 ; G 2462\nU 9572 ; WX 602 ; N SF470000 ; G 2463\nU 9573 ; WX 602 ; N SF480000 ; G 2464\nU 9574 ; WX 602 ; N SF410000 ; G 2465\nU 9575 ; WX 602 ; N SF450000 ; G 2466\nU 9576 ; WX 602 ; N SF460000 ; G 2467\nU 9577 ; WX 602 ; N SF400000 ; G 2468\nU 9578 ; WX 602 ; N SF540000 ; G 2469\nU 9579 ; WX 602 ; N SF530000 ; G 2470\nU 9580 ; WX 602 ; N SF440000 ; G 2471\nU 9581 ; WX 602 ; N uni256D ; G 2472\nU 9582 ; WX 602 ; N uni256E ; G 2473\nU 9583 ; WX 602 ; N uni256F ; G 2474\nU 9584 ; WX 602 ; N uni2570 ; G 2475\nU 9585 ; WX 602 ; N uni2571 ; G 2476\nU 9586 ; WX 602 ; N uni2572 ; G 2477\nU 9587 ; WX 602 ; N uni2573 ; G 2478\nU 9588 ; WX 602 ; N uni2574 ; G 2479\nU 9589 ; WX 602 ; N uni2575 ; G 2480\nU 9590 ; WX 602 ; N uni2576 ; G 2481\nU 9591 ; WX 602 ; N uni2577 ; G 2482\nU 9592 ; WX 602 ; N uni2578 ; G 2483\nU 9593 ; WX 602 ; N uni2579 ; G 2484\nU 9594 ; WX 602 ; N uni257A ; G 2485\nU 9595 ; WX 602 ; N uni257B ; G 2486\nU 9596 ; WX 602 ; N uni257C ; G 2487\nU 9597 ; WX 602 ; N uni257D ; G 2488\nU 9598 ; WX 602 ; N uni257E ; G 2489\nU 9599 ; WX 602 ; N uni257F ; G 2490\nU 9600 ; WX 769 ; N upblock ; G 2491\nU 9601 ; WX 769 ; N uni2581 ; G 2492\nU 9602 ; WX 769 ; N uni2582 ; G 2493\nU 9603 ; WX 769 ; N uni2583 ; G 2494\nU 9604 ; WX 769 ; N dnblock ; G 2495\nU 9605 ; WX 769 ; N uni2585 ; G 2496\nU 9606 ; WX 769 ; N uni2586 ; G 2497\nU 9607 ; WX 769 ; N uni2587 ; G 2498\nU 9608 ; WX 769 ; N block ; G 2499\nU 9609 ; WX 769 ; N uni2589 ; G 2500\nU 9610 ; WX 769 ; N uni258A ; G 2501\nU 9611 ; WX 769 ; N uni258B ; G 2502\nU 9612 ; WX 769 ; N lfblock ; G 2503\nU 9613 ; WX 769 ; N uni258D ; G 2504\nU 9614 ; WX 769 ; N uni258E ; G 2505\nU 9615 ; WX 769 ; N uni258F ; G 2506\nU 9616 ; WX 769 ; N rtblock ; G 2507\nU 9617 ; WX 769 ; N ltshade ; G 2508\nU 9618 ; WX 769 ; N shade ; G 2509\nU 9619 ; WX 769 ; N dkshade ; G 2510\nU 9620 ; WX 769 ; N uni2594 ; G 2511\nU 9621 ; WX 769 ; N uni2595 ; G 2512\nU 9622 ; WX 769 ; N uni2596 ; G 2513\nU 9623 ; WX 769 ; N uni2597 ; G 2514\nU 9624 ; WX 769 ; N uni2598 ; G 2515\nU 9625 ; WX 769 ; N uni2599 ; G 2516\nU 9626 ; WX 769 ; N uni259A ; G 2517\nU 9627 ; WX 769 ; N uni259B ; G 2518\nU 9628 ; WX 769 ; N uni259C ; G 2519\nU 9629 ; WX 769 ; N uni259D ; G 2520\nU 9630 ; WX 769 ; N uni259E ; G 2521\nU 9631 ; WX 769 ; N uni259F ; G 2522\nU 9632 ; WX 945 ; N filledbox ; G 2523\nU 9633 ; WX 945 ; N H22073 ; G 2524\nU 9634 ; WX 945 ; N uni25A2 ; G 2525\nU 9635 ; WX 945 ; N uni25A3 ; G 2526\nU 9636 ; WX 945 ; N uni25A4 ; G 2527\nU 9637 ; WX 945 ; N uni25A5 ; G 2528\nU 9638 ; WX 945 ; N uni25A6 ; G 2529\nU 9639 ; WX 945 ; N uni25A7 ; G 2530\nU 9640 ; WX 945 ; N uni25A8 ; G 2531\nU 9641 ; WX 945 ; N uni25A9 ; G 2532\nU 9642 ; WX 678 ; N H18543 ; G 2533\nU 9643 ; WX 678 ; N H18551 ; G 2534\nU 9644 ; WX 945 ; N filledrect ; G 2535\nU 9645 ; WX 945 ; N uni25AD ; G 2536\nU 9646 ; WX 550 ; N uni25AE ; G 2537\nU 9647 ; WX 550 ; N uni25AF ; G 2538\nU 9648 ; WX 769 ; N uni25B0 ; G 2539\nU 9649 ; WX 769 ; N uni25B1 ; G 2540\nU 9650 ; WX 769 ; N triagup ; G 2541\nU 9651 ; WX 769 ; N uni25B3 ; G 2542\nU 9652 ; WX 502 ; N uni25B4 ; G 2543\nU 9653 ; WX 502 ; N uni25B5 ; G 2544\nU 9654 ; WX 769 ; N uni25B6 ; G 2545\nU 9655 ; WX 769 ; N uni25B7 ; G 2546\nU 9656 ; WX 502 ; N uni25B8 ; G 2547\nU 9657 ; WX 502 ; N uni25B9 ; G 2548\nU 9658 ; WX 769 ; N triagrt ; G 2549\nU 9659 ; WX 769 ; N uni25BB ; G 2550\nU 9660 ; WX 769 ; N triagdn ; G 2551\nU 9661 ; WX 769 ; N uni25BD ; G 2552\nU 9662 ; WX 502 ; N uni25BE ; G 2553\nU 9663 ; WX 502 ; N uni25BF ; G 2554\nU 9664 ; WX 769 ; N uni25C0 ; G 2555\nU 9665 ; WX 769 ; N uni25C1 ; G 2556\nU 9666 ; WX 502 ; N uni25C2 ; G 2557\nU 9667 ; WX 502 ; N uni25C3 ; G 2558\nU 9668 ; WX 769 ; N triaglf ; G 2559\nU 9669 ; WX 769 ; N uni25C5 ; G 2560\nU 9670 ; WX 769 ; N uni25C6 ; G 2561\nU 9671 ; WX 769 ; N uni25C7 ; G 2562\nU 9672 ; WX 769 ; N uni25C8 ; G 2563\nU 9673 ; WX 873 ; N uni25C9 ; G 2564\nU 9674 ; WX 494 ; N lozenge ; G 2565\nU 9675 ; WX 873 ; N circle ; G 2566\nU 9676 ; WX 873 ; N uni25CC ; G 2567\nU 9677 ; WX 873 ; N uni25CD ; G 2568\nU 9678 ; WX 873 ; N uni25CE ; G 2569\nU 9679 ; WX 873 ; N H18533 ; G 2570\nU 9680 ; WX 873 ; N uni25D0 ; G 2571\nU 9681 ; WX 873 ; N uni25D1 ; G 2572\nU 9682 ; WX 873 ; N uni25D2 ; G 2573\nU 9683 ; WX 873 ; N uni25D3 ; G 2574\nU 9684 ; WX 873 ; N uni25D4 ; G 2575\nU 9685 ; WX 873 ; N uni25D5 ; G 2576\nU 9686 ; WX 527 ; N uni25D6 ; G 2577\nU 9687 ; WX 527 ; N uni25D7 ; G 2578\nU 9688 ; WX 791 ; N invbullet ; G 2579\nU 9689 ; WX 970 ; N invcircle ; G 2580\nU 9690 ; WX 970 ; N uni25DA ; G 2581\nU 9691 ; WX 970 ; N uni25DB ; G 2582\nU 9692 ; WX 387 ; N uni25DC ; G 2583\nU 9693 ; WX 387 ; N uni25DD ; G 2584\nU 9694 ; WX 387 ; N uni25DE ; G 2585\nU 9695 ; WX 387 ; N uni25DF ; G 2586\nU 9696 ; WX 873 ; N uni25E0 ; G 2587\nU 9697 ; WX 873 ; N uni25E1 ; G 2588\nU 9698 ; WX 769 ; N uni25E2 ; G 2589\nU 9699 ; WX 769 ; N uni25E3 ; G 2590\nU 9700 ; WX 769 ; N uni25E4 ; G 2591\nU 9701 ; WX 769 ; N uni25E5 ; G 2592\nU 9702 ; WX 590 ; N openbullet ; G 2593\nU 9703 ; WX 945 ; N uni25E7 ; G 2594\nU 9704 ; WX 945 ; N uni25E8 ; G 2595\nU 9705 ; WX 945 ; N uni25E9 ; G 2596\nU 9706 ; WX 945 ; N uni25EA ; G 2597\nU 9707 ; WX 945 ; N uni25EB ; G 2598\nU 9708 ; WX 769 ; N uni25EC ; G 2599\nU 9709 ; WX 769 ; N uni25ED ; G 2600\nU 9710 ; WX 769 ; N uni25EE ; G 2601\nU 9711 ; WX 1119 ; N uni25EF ; G 2602\nU 9712 ; WX 945 ; N uni25F0 ; G 2603\nU 9713 ; WX 945 ; N uni25F1 ; G 2604\nU 9714 ; WX 945 ; N uni25F2 ; G 2605\nU 9715 ; WX 945 ; N uni25F3 ; G 2606\nU 9716 ; WX 873 ; N uni25F4 ; G 2607\nU 9717 ; WX 873 ; N uni25F5 ; G 2608\nU 9718 ; WX 873 ; N uni25F6 ; G 2609\nU 9719 ; WX 873 ; N uni25F7 ; G 2610\nU 9720 ; WX 769 ; N uni25F8 ; G 2611\nU 9721 ; WX 769 ; N uni25F9 ; G 2612\nU 9722 ; WX 769 ; N uni25FA ; G 2613\nU 9723 ; WX 830 ; N uni25FB ; G 2614\nU 9724 ; WX 830 ; N uni25FC ; G 2615\nU 9725 ; WX 732 ; N uni25FD ; G 2616\nU 9726 ; WX 732 ; N uni25FE ; G 2617\nU 9727 ; WX 769 ; N uni25FF ; G 2618\nU 9728 ; WX 896 ; N uni2600 ; G 2619\nU 9784 ; WX 896 ; N uni2638 ; G 2620\nU 9785 ; WX 896 ; N uni2639 ; G 2621\nU 9786 ; WX 896 ; N smileface ; G 2622\nU 9787 ; WX 896 ; N invsmileface ; G 2623\nU 9788 ; WX 896 ; N sun ; G 2624\nU 9791 ; WX 614 ; N uni263F ; G 2625\nU 9792 ; WX 731 ; N female ; G 2626\nU 9793 ; WX 731 ; N uni2641 ; G 2627\nU 9794 ; WX 896 ; N male ; G 2628\nU 9795 ; WX 896 ; N uni2643 ; G 2629\nU 9796 ; WX 896 ; N uni2644 ; G 2630\nU 9797 ; WX 896 ; N uni2645 ; G 2631\nU 9798 ; WX 896 ; N uni2646 ; G 2632\nU 9799 ; WX 896 ; N uni2647 ; G 2633\nU 9824 ; WX 896 ; N spade ; G 2634\nU 9825 ; WX 896 ; N uni2661 ; G 2635\nU 9826 ; WX 896 ; N uni2662 ; G 2636\nU 9827 ; WX 896 ; N club ; G 2637\nU 9828 ; WX 896 ; N uni2664 ; G 2638\nU 9829 ; WX 896 ; N heart ; G 2639\nU 9830 ; WX 896 ; N diamond ; G 2640\nU 9831 ; WX 896 ; N uni2667 ; G 2641\nU 9833 ; WX 472 ; N uni2669 ; G 2642\nU 9834 ; WX 638 ; N musicalnote ; G 2643\nU 9835 ; WX 896 ; N musicalnotedbl ; G 2644\nU 9836 ; WX 896 ; N uni266C ; G 2645\nU 9837 ; WX 472 ; N uni266D ; G 2646\nU 9838 ; WX 357 ; N uni266E ; G 2647\nU 9839 ; WX 484 ; N uni266F ; G 2648\nU 10145 ; WX 838 ; N uni27A1 ; G 2649\nU 10181 ; WX 457 ; N uni27C5 ; G 2650\nU 10182 ; WX 457 ; N uni27C6 ; G 2651\nU 10208 ; WX 494 ; N uni27E0 ; G 2652\nU 10216 ; WX 457 ; N uni27E8 ; G 2653\nU 10217 ; WX 457 ; N uni27E9 ; G 2654\nU 10224 ; WX 838 ; N uni27F0 ; G 2655\nU 10225 ; WX 838 ; N uni27F1 ; G 2656\nU 10226 ; WX 838 ; N uni27F2 ; G 2657\nU 10227 ; WX 838 ; N uni27F3 ; G 2658\nU 10228 ; WX 1033 ; N uni27F4 ; G 2659\nU 10229 ; WX 1434 ; N uni27F5 ; G 2660\nU 10230 ; WX 1434 ; N uni27F6 ; G 2661\nU 10231 ; WX 1434 ; N uni27F7 ; G 2662\nU 10232 ; WX 1434 ; N uni27F8 ; G 2663\nU 10233 ; WX 1434 ; N uni27F9 ; G 2664\nU 10234 ; WX 1434 ; N uni27FA ; G 2665\nU 10235 ; WX 1434 ; N uni27FB ; G 2666\nU 10236 ; WX 1434 ; N uni27FC ; G 2667\nU 10237 ; WX 1434 ; N uni27FD ; G 2668\nU 10238 ; WX 1434 ; N uni27FE ; G 2669\nU 10239 ; WX 1434 ; N uni27FF ; G 2670\nU 10240 ; WX 781 ; N uni2800 ; G 2671\nU 10241 ; WX 781 ; N uni2801 ; G 2672\nU 10242 ; WX 781 ; N uni2802 ; G 2673\nU 10243 ; WX 781 ; N uni2803 ; G 2674\nU 10244 ; WX 781 ; N uni2804 ; G 2675\nU 10245 ; WX 781 ; N uni2805 ; G 2676\nU 10246 ; WX 781 ; N uni2806 ; G 2677\nU 10247 ; WX 781 ; N uni2807 ; G 2678\nU 10248 ; WX 781 ; N uni2808 ; G 2679\nU 10249 ; WX 781 ; N uni2809 ; G 2680\nU 10250 ; WX 781 ; N uni280A ; G 2681\nU 10251 ; WX 781 ; N uni280B ; G 2682\nU 10252 ; WX 781 ; N uni280C ; G 2683\nU 10253 ; WX 781 ; N uni280D ; G 2684\nU 10254 ; WX 781 ; N uni280E ; G 2685\nU 10255 ; WX 781 ; N uni280F ; G 2686\nU 10256 ; WX 781 ; N uni2810 ; G 2687\nU 10257 ; WX 781 ; N uni2811 ; G 2688\nU 10258 ; WX 781 ; N uni2812 ; G 2689\nU 10259 ; WX 781 ; N uni2813 ; G 2690\nU 10260 ; WX 781 ; N uni2814 ; G 2691\nU 10261 ; WX 781 ; N uni2815 ; G 2692\nU 10262 ; WX 781 ; N uni2816 ; G 2693\nU 10263 ; WX 781 ; N uni2817 ; G 2694\nU 10264 ; WX 781 ; N uni2818 ; G 2695\nU 10265 ; WX 781 ; N uni2819 ; G 2696\nU 10266 ; WX 781 ; N uni281A ; G 2697\nU 10267 ; WX 781 ; N uni281B ; G 2698\nU 10268 ; WX 781 ; N uni281C ; G 2699\nU 10269 ; WX 781 ; N uni281D ; G 2700\nU 10270 ; WX 781 ; N uni281E ; G 2701\nU 10271 ; WX 781 ; N uni281F ; G 2702\nU 10272 ; WX 781 ; N uni2820 ; G 2703\nU 10273 ; WX 781 ; N uni2821 ; G 2704\nU 10274 ; WX 781 ; N uni2822 ; G 2705\nU 10275 ; WX 781 ; N uni2823 ; G 2706\nU 10276 ; WX 781 ; N uni2824 ; G 2707\nU 10277 ; WX 781 ; N uni2825 ; G 2708\nU 10278 ; WX 781 ; N uni2826 ; G 2709\nU 10279 ; WX 781 ; N uni2827 ; G 2710\nU 10280 ; WX 781 ; N uni2828 ; G 2711\nU 10281 ; WX 781 ; N uni2829 ; G 2712\nU 10282 ; WX 781 ; N uni282A ; G 2713\nU 10283 ; WX 781 ; N uni282B ; G 2714\nU 10284 ; WX 781 ; N uni282C ; G 2715\nU 10285 ; WX 781 ; N uni282D ; G 2716\nU 10286 ; WX 781 ; N uni282E ; G 2717\nU 10287 ; WX 781 ; N uni282F ; G 2718\nU 10288 ; WX 781 ; N uni2830 ; G 2719\nU 10289 ; WX 781 ; N uni2831 ; G 2720\nU 10290 ; WX 781 ; N uni2832 ; G 2721\nU 10291 ; WX 781 ; N uni2833 ; G 2722\nU 10292 ; WX 781 ; N uni2834 ; G 2723\nU 10293 ; WX 781 ; N uni2835 ; G 2724\nU 10294 ; WX 781 ; N uni2836 ; G 2725\nU 10295 ; WX 781 ; N uni2837 ; G 2726\nU 10296 ; WX 781 ; N uni2838 ; G 2727\nU 10297 ; WX 781 ; N uni2839 ; G 2728\nU 10298 ; WX 781 ; N uni283A ; G 2729\nU 10299 ; WX 781 ; N uni283B ; G 2730\nU 10300 ; WX 781 ; N uni283C ; G 2731\nU 10301 ; WX 781 ; N uni283D ; G 2732\nU 10302 ; WX 781 ; N uni283E ; G 2733\nU 10303 ; WX 781 ; N uni283F ; G 2734\nU 10304 ; WX 781 ; N uni2840 ; G 2735\nU 10305 ; WX 781 ; N uni2841 ; G 2736\nU 10306 ; WX 781 ; N uni2842 ; G 2737\nU 10307 ; WX 781 ; N uni2843 ; G 2738\nU 10308 ; WX 781 ; N uni2844 ; G 2739\nU 10309 ; WX 781 ; N uni2845 ; G 2740\nU 10310 ; WX 781 ; N uni2846 ; G 2741\nU 10311 ; WX 781 ; N uni2847 ; G 2742\nU 10312 ; WX 781 ; N uni2848 ; G 2743\nU 10313 ; WX 781 ; N uni2849 ; G 2744\nU 10314 ; WX 781 ; N uni284A ; G 2745\nU 10315 ; WX 781 ; N uni284B ; G 2746\nU 10316 ; WX 781 ; N uni284C ; G 2747\nU 10317 ; WX 781 ; N uni284D ; G 2748\nU 10318 ; WX 781 ; N uni284E ; G 2749\nU 10319 ; WX 781 ; N uni284F ; G 2750\nU 10320 ; WX 781 ; N uni2850 ; G 2751\nU 10321 ; WX 781 ; N uni2851 ; G 2752\nU 10322 ; WX 781 ; N uni2852 ; G 2753\nU 10323 ; WX 781 ; N uni2853 ; G 2754\nU 10324 ; WX 781 ; N uni2854 ; G 2755\nU 10325 ; WX 781 ; N uni2855 ; G 2756\nU 10326 ; WX 781 ; N uni2856 ; G 2757\nU 10327 ; WX 781 ; N uni2857 ; G 2758\nU 10328 ; WX 781 ; N uni2858 ; G 2759\nU 10329 ; WX 781 ; N uni2859 ; G 2760\nU 10330 ; WX 781 ; N uni285A ; G 2761\nU 10331 ; WX 781 ; N uni285B ; G 2762\nU 10332 ; WX 781 ; N uni285C ; G 2763\nU 10333 ; WX 781 ; N uni285D ; G 2764\nU 10334 ; WX 781 ; N uni285E ; G 2765\nU 10335 ; WX 781 ; N uni285F ; G 2766\nU 10336 ; WX 781 ; N uni2860 ; G 2767\nU 10337 ; WX 781 ; N uni2861 ; G 2768\nU 10338 ; WX 781 ; N uni2862 ; G 2769\nU 10339 ; WX 781 ; N uni2863 ; G 2770\nU 10340 ; WX 781 ; N uni2864 ; G 2771\nU 10341 ; WX 781 ; N uni2865 ; G 2772\nU 10342 ; WX 781 ; N uni2866 ; G 2773\nU 10343 ; WX 781 ; N uni2867 ; G 2774\nU 10344 ; WX 781 ; N uni2868 ; G 2775\nU 10345 ; WX 781 ; N uni2869 ; G 2776\nU 10346 ; WX 781 ; N uni286A ; G 2777\nU 10347 ; WX 781 ; N uni286B ; G 2778\nU 10348 ; WX 781 ; N uni286C ; G 2779\nU 10349 ; WX 781 ; N uni286D ; G 2780\nU 10350 ; WX 781 ; N uni286E ; G 2781\nU 10351 ; WX 781 ; N uni286F ; G 2782\nU 10352 ; WX 781 ; N uni2870 ; G 2783\nU 10353 ; WX 781 ; N uni2871 ; G 2784\nU 10354 ; WX 781 ; N uni2872 ; G 2785\nU 10355 ; WX 781 ; N uni2873 ; G 2786\nU 10356 ; WX 781 ; N uni2874 ; G 2787\nU 10357 ; WX 781 ; N uni2875 ; G 2788\nU 10358 ; WX 781 ; N uni2876 ; G 2789\nU 10359 ; WX 781 ; N uni2877 ; G 2790\nU 10360 ; WX 781 ; N uni2878 ; G 2791\nU 10361 ; WX 781 ; N uni2879 ; G 2792\nU 10362 ; WX 781 ; N uni287A ; G 2793\nU 10363 ; WX 781 ; N uni287B ; G 2794\nU 10364 ; WX 781 ; N uni287C ; G 2795\nU 10365 ; WX 781 ; N uni287D ; G 2796\nU 10366 ; WX 781 ; N uni287E ; G 2797\nU 10367 ; WX 781 ; N uni287F ; G 2798\nU 10368 ; WX 781 ; N uni2880 ; G 2799\nU 10369 ; WX 781 ; N uni2881 ; G 2800\nU 10370 ; WX 781 ; N uni2882 ; G 2801\nU 10371 ; WX 781 ; N uni2883 ; G 2802\nU 10372 ; WX 781 ; N uni2884 ; G 2803\nU 10373 ; WX 781 ; N uni2885 ; G 2804\nU 10374 ; WX 781 ; N uni2886 ; G 2805\nU 10375 ; WX 781 ; N uni2887 ; G 2806\nU 10376 ; WX 781 ; N uni2888 ; G 2807\nU 10377 ; WX 781 ; N uni2889 ; G 2808\nU 10378 ; WX 781 ; N uni288A ; G 2809\nU 10379 ; WX 781 ; N uni288B ; G 2810\nU 10380 ; WX 781 ; N uni288C ; G 2811\nU 10381 ; WX 781 ; N uni288D ; G 2812\nU 10382 ; WX 781 ; N uni288E ; G 2813\nU 10383 ; WX 781 ; N uni288F ; G 2814\nU 10384 ; WX 781 ; N uni2890 ; G 2815\nU 10385 ; WX 781 ; N uni2891 ; G 2816\nU 10386 ; WX 781 ; N uni2892 ; G 2817\nU 10387 ; WX 781 ; N uni2893 ; G 2818\nU 10388 ; WX 781 ; N uni2894 ; G 2819\nU 10389 ; WX 781 ; N uni2895 ; G 2820\nU 10390 ; WX 781 ; N uni2896 ; G 2821\nU 10391 ; WX 781 ; N uni2897 ; G 2822\nU 10392 ; WX 781 ; N uni2898 ; G 2823\nU 10393 ; WX 781 ; N uni2899 ; G 2824\nU 10394 ; WX 781 ; N uni289A ; G 2825\nU 10395 ; WX 781 ; N uni289B ; G 2826\nU 10396 ; WX 781 ; N uni289C ; G 2827\nU 10397 ; WX 781 ; N uni289D ; G 2828\nU 10398 ; WX 781 ; N uni289E ; G 2829\nU 10399 ; WX 781 ; N uni289F ; G 2830\nU 10400 ; WX 781 ; N uni28A0 ; G 2831\nU 10401 ; WX 781 ; N uni28A1 ; G 2832\nU 10402 ; WX 781 ; N uni28A2 ; G 2833\nU 10403 ; WX 781 ; N uni28A3 ; G 2834\nU 10404 ; WX 781 ; N uni28A4 ; G 2835\nU 10405 ; WX 781 ; N uni28A5 ; G 2836\nU 10406 ; WX 781 ; N uni28A6 ; G 2837\nU 10407 ; WX 781 ; N uni28A7 ; G 2838\nU 10408 ; WX 781 ; N uni28A8 ; G 2839\nU 10409 ; WX 781 ; N uni28A9 ; G 2840\nU 10410 ; WX 781 ; N uni28AA ; G 2841\nU 10411 ; WX 781 ; N uni28AB ; G 2842\nU 10412 ; WX 781 ; N uni28AC ; G 2843\nU 10413 ; WX 781 ; N uni28AD ; G 2844\nU 10414 ; WX 781 ; N uni28AE ; G 2845\nU 10415 ; WX 781 ; N uni28AF ; G 2846\nU 10416 ; WX 781 ; N uni28B0 ; G 2847\nU 10417 ; WX 781 ; N uni28B1 ; G 2848\nU 10418 ; WX 781 ; N uni28B2 ; G 2849\nU 10419 ; WX 781 ; N uni28B3 ; G 2850\nU 10420 ; WX 781 ; N uni28B4 ; G 2851\nU 10421 ; WX 781 ; N uni28B5 ; G 2852\nU 10422 ; WX 781 ; N uni28B6 ; G 2853\nU 10423 ; WX 781 ; N uni28B7 ; G 2854\nU 10424 ; WX 781 ; N uni28B8 ; G 2855\nU 10425 ; WX 781 ; N uni28B9 ; G 2856\nU 10426 ; WX 781 ; N uni28BA ; G 2857\nU 10427 ; WX 781 ; N uni28BB ; G 2858\nU 10428 ; WX 781 ; N uni28BC ; G 2859\nU 10429 ; WX 781 ; N uni28BD ; G 2860\nU 10430 ; WX 781 ; N uni28BE ; G 2861\nU 10431 ; WX 781 ; N uni28BF ; G 2862\nU 10432 ; WX 781 ; N uni28C0 ; G 2863\nU 10433 ; WX 781 ; N uni28C1 ; G 2864\nU 10434 ; WX 781 ; N uni28C2 ; G 2865\nU 10435 ; WX 781 ; N uni28C3 ; G 2866\nU 10436 ; WX 781 ; N uni28C4 ; G 2867\nU 10437 ; WX 781 ; N uni28C5 ; G 2868\nU 10438 ; WX 781 ; N uni28C6 ; G 2869\nU 10439 ; WX 781 ; N uni28C7 ; G 2870\nU 10440 ; WX 781 ; N uni28C8 ; G 2871\nU 10441 ; WX 781 ; N uni28C9 ; G 2872\nU 10442 ; WX 781 ; N uni28CA ; G 2873\nU 10443 ; WX 781 ; N uni28CB ; G 2874\nU 10444 ; WX 781 ; N uni28CC ; G 2875\nU 10445 ; WX 781 ; N uni28CD ; G 2876\nU 10446 ; WX 781 ; N uni28CE ; G 2877\nU 10447 ; WX 781 ; N uni28CF ; G 2878\nU 10448 ; WX 781 ; N uni28D0 ; G 2879\nU 10449 ; WX 781 ; N uni28D1 ; G 2880\nU 10450 ; WX 781 ; N uni28D2 ; G 2881\nU 10451 ; WX 781 ; N uni28D3 ; G 2882\nU 10452 ; WX 781 ; N uni28D4 ; G 2883\nU 10453 ; WX 781 ; N uni28D5 ; G 2884\nU 10454 ; WX 781 ; N uni28D6 ; G 2885\nU 10455 ; WX 781 ; N uni28D7 ; G 2886\nU 10456 ; WX 781 ; N uni28D8 ; G 2887\nU 10457 ; WX 781 ; N uni28D9 ; G 2888\nU 10458 ; WX 781 ; N uni28DA ; G 2889\nU 10459 ; WX 781 ; N uni28DB ; G 2890\nU 10460 ; WX 781 ; N uni28DC ; G 2891\nU 10461 ; WX 781 ; N uni28DD ; G 2892\nU 10462 ; WX 781 ; N uni28DE ; G 2893\nU 10463 ; WX 781 ; N uni28DF ; G 2894\nU 10464 ; WX 781 ; N uni28E0 ; G 2895\nU 10465 ; WX 781 ; N uni28E1 ; G 2896\nU 10466 ; WX 781 ; N uni28E2 ; G 2897\nU 10467 ; WX 781 ; N uni28E3 ; G 2898\nU 10468 ; WX 781 ; N uni28E4 ; G 2899\nU 10469 ; WX 781 ; N uni28E5 ; G 2900\nU 10470 ; WX 781 ; N uni28E6 ; G 2901\nU 10471 ; WX 781 ; N uni28E7 ; G 2902\nU 10472 ; WX 781 ; N uni28E8 ; G 2903\nU 10473 ; WX 781 ; N uni28E9 ; G 2904\nU 10474 ; WX 781 ; N uni28EA ; G 2905\nU 10475 ; WX 781 ; N uni28EB ; G 2906\nU 10476 ; WX 781 ; N uni28EC ; G 2907\nU 10477 ; WX 781 ; N uni28ED ; G 2908\nU 10478 ; WX 781 ; N uni28EE ; G 2909\nU 10479 ; WX 781 ; N uni28EF ; G 2910\nU 10480 ; WX 781 ; N uni28F0 ; G 2911\nU 10481 ; WX 781 ; N uni28F1 ; G 2912\nU 10482 ; WX 781 ; N uni28F2 ; G 2913\nU 10483 ; WX 781 ; N uni28F3 ; G 2914\nU 10484 ; WX 781 ; N uni28F4 ; G 2915\nU 10485 ; WX 781 ; N uni28F5 ; G 2916\nU 10486 ; WX 781 ; N uni28F6 ; G 2917\nU 10487 ; WX 781 ; N uni28F7 ; G 2918\nU 10488 ; WX 781 ; N uni28F8 ; G 2919\nU 10489 ; WX 781 ; N uni28F9 ; G 2920\nU 10490 ; WX 781 ; N uni28FA ; G 2921\nU 10491 ; WX 781 ; N uni28FB ; G 2922\nU 10492 ; WX 781 ; N uni28FC ; G 2923\nU 10493 ; WX 781 ; N uni28FD ; G 2924\nU 10494 ; WX 781 ; N uni28FE ; G 2925\nU 10495 ; WX 781 ; N uni28FF ; G 2926\nU 10496 ; WX 838 ; N uni2900 ; G 2927\nU 10497 ; WX 838 ; N uni2901 ; G 2928\nU 10498 ; WX 838 ; N uni2902 ; G 2929\nU 10499 ; WX 838 ; N uni2903 ; G 2930\nU 10500 ; WX 838 ; N uni2904 ; G 2931\nU 10501 ; WX 838 ; N uni2905 ; G 2932\nU 10502 ; WX 838 ; N uni2906 ; G 2933\nU 10503 ; WX 838 ; N uni2907 ; G 2934\nU 10504 ; WX 838 ; N uni2908 ; G 2935\nU 10505 ; WX 838 ; N uni2909 ; G 2936\nU 10506 ; WX 838 ; N uni290A ; G 2937\nU 10507 ; WX 838 ; N uni290B ; G 2938\nU 10508 ; WX 838 ; N uni290C ; G 2939\nU 10509 ; WX 838 ; N uni290D ; G 2940\nU 10510 ; WX 838 ; N uni290E ; G 2941\nU 10511 ; WX 838 ; N uni290F ; G 2942\nU 10512 ; WX 838 ; N uni2910 ; G 2943\nU 10513 ; WX 838 ; N uni2911 ; G 2944\nU 10514 ; WX 838 ; N uni2912 ; G 2945\nU 10515 ; WX 838 ; N uni2913 ; G 2946\nU 10516 ; WX 838 ; N uni2914 ; G 2947\nU 10517 ; WX 838 ; N uni2915 ; G 2948\nU 10518 ; WX 838 ; N uni2916 ; G 2949\nU 10519 ; WX 838 ; N uni2917 ; G 2950\nU 10520 ; WX 838 ; N uni2918 ; G 2951\nU 10521 ; WX 838 ; N uni2919 ; G 2952\nU 10522 ; WX 838 ; N uni291A ; G 2953\nU 10523 ; WX 838 ; N uni291B ; G 2954\nU 10524 ; WX 838 ; N uni291C ; G 2955\nU 10525 ; WX 838 ; N uni291D ; G 2956\nU 10526 ; WX 838 ; N uni291E ; G 2957\nU 10527 ; WX 838 ; N uni291F ; G 2958\nU 10528 ; WX 838 ; N uni2920 ; G 2959\nU 10529 ; WX 838 ; N uni2921 ; G 2960\nU 10530 ; WX 838 ; N uni2922 ; G 2961\nU 10531 ; WX 838 ; N uni2923 ; G 2962\nU 10532 ; WX 838 ; N uni2924 ; G 2963\nU 10533 ; WX 838 ; N uni2925 ; G 2964\nU 10534 ; WX 838 ; N uni2926 ; G 2965\nU 10535 ; WX 838 ; N uni2927 ; G 2966\nU 10536 ; WX 838 ; N uni2928 ; G 2967\nU 10537 ; WX 838 ; N uni2929 ; G 2968\nU 10538 ; WX 838 ; N uni292A ; G 2969\nU 10539 ; WX 838 ; N uni292B ; G 2970\nU 10540 ; WX 838 ; N uni292C ; G 2971\nU 10541 ; WX 838 ; N uni292D ; G 2972\nU 10542 ; WX 838 ; N uni292E ; G 2973\nU 10543 ; WX 838 ; N uni292F ; G 2974\nU 10544 ; WX 838 ; N uni2930 ; G 2975\nU 10545 ; WX 838 ; N uni2931 ; G 2976\nU 10546 ; WX 838 ; N uni2932 ; G 2977\nU 10547 ; WX 838 ; N uni2933 ; G 2978\nU 10548 ; WX 838 ; N uni2934 ; G 2979\nU 10549 ; WX 838 ; N uni2935 ; G 2980\nU 10550 ; WX 838 ; N uni2936 ; G 2981\nU 10551 ; WX 838 ; N uni2937 ; G 2982\nU 10552 ; WX 838 ; N uni2938 ; G 2983\nU 10553 ; WX 838 ; N uni2939 ; G 2984\nU 10554 ; WX 838 ; N uni293A ; G 2985\nU 10555 ; WX 838 ; N uni293B ; G 2986\nU 10556 ; WX 838 ; N uni293C ; G 2987\nU 10557 ; WX 838 ; N uni293D ; G 2988\nU 10558 ; WX 838 ; N uni293E ; G 2989\nU 10559 ; WX 838 ; N uni293F ; G 2990\nU 10560 ; WX 838 ; N uni2940 ; G 2991\nU 10561 ; WX 838 ; N uni2941 ; G 2992\nU 10562 ; WX 838 ; N uni2942 ; G 2993\nU 10563 ; WX 838 ; N uni2943 ; G 2994\nU 10564 ; WX 838 ; N uni2944 ; G 2995\nU 10565 ; WX 838 ; N uni2945 ; G 2996\nU 10566 ; WX 838 ; N uni2946 ; G 2997\nU 10567 ; WX 838 ; N uni2947 ; G 2998\nU 10568 ; WX 838 ; N uni2948 ; G 2999\nU 10569 ; WX 838 ; N uni2949 ; G 3000\nU 10570 ; WX 838 ; N uni294A ; G 3001\nU 10571 ; WX 838 ; N uni294B ; G 3002\nU 10572 ; WX 838 ; N uni294C ; G 3003\nU 10573 ; WX 838 ; N uni294D ; G 3004\nU 10574 ; WX 838 ; N uni294E ; G 3005\nU 10575 ; WX 838 ; N uni294F ; G 3006\nU 10576 ; WX 838 ; N uni2950 ; G 3007\nU 10577 ; WX 838 ; N uni2951 ; G 3008\nU 10578 ; WX 838 ; N uni2952 ; G 3009\nU 10579 ; WX 838 ; N uni2953 ; G 3010\nU 10580 ; WX 838 ; N uni2954 ; G 3011\nU 10581 ; WX 838 ; N uni2955 ; G 3012\nU 10582 ; WX 838 ; N uni2956 ; G 3013\nU 10583 ; WX 838 ; N uni2957 ; G 3014\nU 10584 ; WX 838 ; N uni2958 ; G 3015\nU 10585 ; WX 838 ; N uni2959 ; G 3016\nU 10586 ; WX 838 ; N uni295A ; G 3017\nU 10587 ; WX 838 ; N uni295B ; G 3018\nU 10588 ; WX 838 ; N uni295C ; G 3019\nU 10589 ; WX 838 ; N uni295D ; G 3020\nU 10590 ; WX 838 ; N uni295E ; G 3021\nU 10591 ; WX 838 ; N uni295F ; G 3022\nU 10592 ; WX 838 ; N uni2960 ; G 3023\nU 10593 ; WX 838 ; N uni2961 ; G 3024\nU 10594 ; WX 838 ; N uni2962 ; G 3025\nU 10595 ; WX 838 ; N uni2963 ; G 3026\nU 10596 ; WX 838 ; N uni2964 ; G 3027\nU 10597 ; WX 838 ; N uni2965 ; G 3028\nU 10598 ; WX 838 ; N uni2966 ; G 3029\nU 10599 ; WX 838 ; N uni2967 ; G 3030\nU 10600 ; WX 838 ; N uni2968 ; G 3031\nU 10601 ; WX 838 ; N uni2969 ; G 3032\nU 10602 ; WX 838 ; N uni296A ; G 3033\nU 10603 ; WX 838 ; N uni296B ; G 3034\nU 10604 ; WX 838 ; N uni296C ; G 3035\nU 10605 ; WX 838 ; N uni296D ; G 3036\nU 10606 ; WX 838 ; N uni296E ; G 3037\nU 10607 ; WX 838 ; N uni296F ; G 3038\nU 10608 ; WX 838 ; N uni2970 ; G 3039\nU 10609 ; WX 838 ; N uni2971 ; G 3040\nU 10610 ; WX 838 ; N uni2972 ; G 3041\nU 10611 ; WX 838 ; N uni2973 ; G 3042\nU 10612 ; WX 838 ; N uni2974 ; G 3043\nU 10613 ; WX 838 ; N uni2975 ; G 3044\nU 10614 ; WX 838 ; N uni2976 ; G 3045\nU 10615 ; WX 1032 ; N uni2977 ; G 3046\nU 10616 ; WX 838 ; N uni2978 ; G 3047\nU 10617 ; WX 838 ; N uni2979 ; G 3048\nU 10618 ; WX 960 ; N uni297A ; G 3049\nU 10619 ; WX 838 ; N uni297B ; G 3050\nU 10620 ; WX 838 ; N uni297C ; G 3051\nU 10621 ; WX 838 ; N uni297D ; G 3052\nU 10622 ; WX 838 ; N uni297E ; G 3053\nU 10623 ; WX 838 ; N uni297F ; G 3054\nU 10731 ; WX 494 ; N uni29EB ; G 3055\nU 10764 ; WX 1782 ; N uni2A0C ; G 3056\nU 10765 ; WX 610 ; N uni2A0D ; G 3057\nU 10766 ; WX 610 ; N uni2A0E ; G 3058\nU 10799 ; WX 838 ; N uni2A2F ; G 3059\nU 10858 ; WX 838 ; N uni2A6A ; G 3060\nU 10859 ; WX 838 ; N uni2A6B ; G 3061\nU 11008 ; WX 838 ; N uni2B00 ; G 3062\nU 11009 ; WX 838 ; N uni2B01 ; G 3063\nU 11010 ; WX 838 ; N uni2B02 ; G 3064\nU 11011 ; WX 838 ; N uni2B03 ; G 3065\nU 11012 ; WX 838 ; N uni2B04 ; G 3066\nU 11013 ; WX 838 ; N uni2B05 ; G 3067\nU 11014 ; WX 838 ; N uni2B06 ; G 3068\nU 11015 ; WX 838 ; N uni2B07 ; G 3069\nU 11016 ; WX 838 ; N uni2B08 ; G 3070\nU 11017 ; WX 838 ; N uni2B09 ; G 3071\nU 11018 ; WX 838 ; N uni2B0A ; G 3072\nU 11019 ; WX 838 ; N uni2B0B ; G 3073\nU 11020 ; WX 838 ; N uni2B0C ; G 3074\nU 11021 ; WX 838 ; N uni2B0D ; G 3075\nU 11022 ; WX 838 ; N uni2B0E ; G 3076\nU 11023 ; WX 838 ; N uni2B0F ; G 3077\nU 11024 ; WX 838 ; N uni2B10 ; G 3078\nU 11025 ; WX 838 ; N uni2B11 ; G 3079\nU 11026 ; WX 945 ; N uni2B12 ; G 3080\nU 11027 ; WX 945 ; N uni2B13 ; G 3081\nU 11028 ; WX 945 ; N uni2B14 ; G 3082\nU 11029 ; WX 945 ; N uni2B15 ; G 3083\nU 11030 ; WX 769 ; N uni2B16 ; G 3084\nU 11031 ; WX 769 ; N uni2B17 ; G 3085\nU 11032 ; WX 769 ; N uni2B18 ; G 3086\nU 11033 ; WX 769 ; N uni2B19 ; G 3087\nU 11034 ; WX 945 ; N uni2B1A ; G 3088\nU 11360 ; WX 703 ; N uni2C60 ; G 3089\nU 11361 ; WX 380 ; N uni2C61 ; G 3090\nU 11363 ; WX 752 ; N uni2C63 ; G 3091\nU 11364 ; WX 831 ; N uni2C64 ; G 3092\nU 11367 ; WX 945 ; N uni2C67 ; G 3093\nU 11368 ; WX 727 ; N uni2C68 ; G 3094\nU 11369 ; WX 869 ; N uni2C69 ; G 3095\nU 11370 ; WX 693 ; N uni2C6A ; G 3096\nU 11371 ; WX 730 ; N uni2C6B ; G 3097\nU 11372 ; WX 568 ; N uni2C6C ; G 3098\nU 11373 ; WX 848 ; N uni2C6D ; G 3099\nU 11374 ; WX 1107 ; N uni2C6E ; G 3100\nU 11375 ; WX 776 ; N uni2C6F ; G 3101\nU 11376 ; WX 848 ; N uni2C70 ; G 3102\nU 11377 ; WX 709 ; N uni2C71 ; G 3103\nU 11378 ; WX 1221 ; N uni2C72 ; G 3104\nU 11379 ; WX 984 ; N uni2C73 ; G 3105\nU 11381 ; WX 779 ; N uni2C75 ; G 3106\nU 11382 ; WX 601 ; N uni2C76 ; G 3107\nU 11383 ; WX 905 ; N uni2C77 ; G 3108\nU 11385 ; WX 571 ; N uni2C79 ; G 3109\nU 11386 ; WX 667 ; N uni2C7A ; G 3110\nU 11387 ; WX 617 ; N uni2C7B ; G 3111\nU 11388 ; WX 313 ; N uni2C7C ; G 3112\nU 11389 ; WX 489 ; N uni2C7D ; G 3113\nU 11390 ; WX 722 ; N uni2C7E ; G 3114\nU 11391 ; WX 730 ; N uni2C7F ; G 3115\nU 11520 ; WX 773 ; N uni2D00 ; G 3116\nU 11521 ; WX 635 ; N uni2D01 ; G 3117\nU 11522 ; WX 804 ; N uni2D02 ; G 3118\nU 11523 ; WX 658 ; N uni2D03 ; G 3119\nU 11524 ; WX 788 ; N uni2D04 ; G 3120\nU 11525 ; WX 962 ; N uni2D05 ; G 3121\nU 11526 ; WX 756 ; N uni2D06 ; G 3122\nU 11527 ; WX 960 ; N uni2D07 ; G 3123\nU 11528 ; WX 617 ; N uni2D08 ; G 3124\nU 11529 ; WX 646 ; N uni2D09 ; G 3125\nU 11530 ; WX 962 ; N uni2D0A ; G 3126\nU 11531 ; WX 631 ; N uni2D0B ; G 3127\nU 11532 ; WX 646 ; N uni2D0C ; G 3128\nU 11533 ; WX 962 ; N uni2D0D ; G 3129\nU 11534 ; WX 846 ; N uni2D0E ; G 3130\nU 11535 ; WX 866 ; N uni2D0F ; G 3131\nU 11536 ; WX 961 ; N uni2D10 ; G 3132\nU 11537 ; WX 645 ; N uni2D11 ; G 3133\nU 11538 ; WX 645 ; N uni2D12 ; G 3134\nU 11539 ; WX 959 ; N uni2D13 ; G 3135\nU 11540 ; WX 945 ; N uni2D14 ; G 3136\nU 11541 ; WX 863 ; N uni2D15 ; G 3137\nU 11542 ; WX 644 ; N uni2D16 ; G 3138\nU 11543 ; WX 646 ; N uni2D17 ; G 3139\nU 11544 ; WX 645 ; N uni2D18 ; G 3140\nU 11545 ; WX 649 ; N uni2D19 ; G 3141\nU 11546 ; WX 688 ; N uni2D1A ; G 3142\nU 11547 ; WX 936 ; N uni2D1B ; G 3143\nU 11548 ; WX 982 ; N uni2D1C ; G 3144\nU 11549 ; WX 681 ; N uni2D1D ; G 3145\nU 11550 ; WX 676 ; N uni2D1E ; G 3146\nU 11551 ; WX 852 ; N uni2D1F ; G 3147\nU 11552 ; WX 1113 ; N uni2D20 ; G 3148\nU 11553 ; WX 632 ; N uni2D21 ; G 3149\nU 11554 ; WX 645 ; N uni2D22 ; G 3150\nU 11555 ; WX 646 ; N uni2D23 ; G 3151\nU 11556 ; WX 749 ; N uni2D24 ; G 3152\nU 11557 ; WX 914 ; N uni2D25 ; G 3153\nU 11800 ; WX 586 ; N uni2E18 ; G 3154\nU 11807 ; WX 838 ; N uni2E1F ; G 3155\nU 11810 ; WX 473 ; N uni2E22 ; G 3156\nU 11811 ; WX 473 ; N uni2E23 ; G 3157\nU 11812 ; WX 473 ; N uni2E24 ; G 3158\nU 11813 ; WX 473 ; N uni2E25 ; G 3159\nU 11822 ; WX 586 ; N uni2E2E ; G 3160\nU 42564 ; WX 722 ; N uniA644 ; G 3161\nU 42565 ; WX 563 ; N uniA645 ; G 3162\nU 42566 ; WX 468 ; N uniA646 ; G 3163\nU 42567 ; WX 380 ; N uniA647 ; G 3164\nU 42576 ; WX 1333 ; N uniA650 ; G 3165\nU 42577 ; WX 1092 ; N uniA651 ; G 3166\nU 42580 ; WX 1287 ; N uniA654 ; G 3167\nU 42581 ; WX 1025 ; N uniA655 ; G 3168\nU 42582 ; WX 1287 ; N uniA656 ; G 3169\nU 42583 ; WX 1039 ; N uniA657 ; G 3170\nU 42648 ; WX 1448 ; N uniA698 ; G 3171\nU 42649 ; WX 1060 ; N uniA699 ; G 3172\nU 42760 ; WX 500 ; N uniA708 ; G 3173\nU 42761 ; WX 500 ; N uniA709 ; G 3174\nU 42762 ; WX 500 ; N uniA70A ; G 3175\nU 42763 ; WX 500 ; N uniA70B ; G 3176\nU 42764 ; WX 500 ; N uniA70C ; G 3177\nU 42765 ; WX 500 ; N uniA70D ; G 3178\nU 42766 ; WX 500 ; N uniA70E ; G 3179\nU 42767 ; WX 500 ; N uniA70F ; G 3180\nU 42768 ; WX 500 ; N uniA710 ; G 3181\nU 42769 ; WX 500 ; N uniA711 ; G 3182\nU 42770 ; WX 500 ; N uniA712 ; G 3183\nU 42771 ; WX 500 ; N uniA713 ; G 3184\nU 42772 ; WX 500 ; N uniA714 ; G 3185\nU 42773 ; WX 500 ; N uniA715 ; G 3186\nU 42774 ; WX 500 ; N uniA716 ; G 3187\nU 42779 ; WX 384 ; N uniA71B ; G 3188\nU 42780 ; WX 384 ; N uniA71C ; G 3189\nU 42781 ; WX 276 ; N uniA71D ; G 3190\nU 42782 ; WX 276 ; N uniA71E ; G 3191\nU 42783 ; WX 276 ; N uniA71F ; G 3192\nU 42790 ; WX 945 ; N uniA726 ; G 3193\nU 42791 ; WX 712 ; N uniA727 ; G 3194\nU 42792 ; WX 1003 ; N uniA728 ; G 3195\nU 42793 ; WX 909 ; N uniA729 ; G 3196\nU 42794 ; WX 696 ; N uniA72A ; G 3197\nU 42795 ; WX 609 ; N uniA72B ; G 3198\nU 42796 ; WX 634 ; N uniA72C ; G 3199\nU 42797 ; WX 598 ; N uniA72D ; G 3200\nU 42798 ; WX 741 ; N uniA72E ; G 3201\nU 42799 ; WX 706 ; N uniA72F ; G 3202\nU 42800 ; WX 592 ; N uniA730 ; G 3203\nU 42801 ; WX 563 ; N uniA731 ; G 3204\nU 42802 ; WX 1301 ; N uniA732 ; G 3205\nU 42803 ; WX 986 ; N uniA733 ; G 3206\nU 42804 ; WX 1261 ; N uniA734 ; G 3207\nU 42805 ; WX 1004 ; N uniA735 ; G 3208\nU 42806 ; WX 1168 ; N uniA736 ; G 3209\nU 42807 ; WX 1008 ; N uniA737 ; G 3210\nU 42808 ; WX 1016 ; N uniA738 ; G 3211\nU 42809 ; WX 813 ; N uniA739 ; G 3212\nU 42810 ; WX 1016 ; N uniA73A ; G 3213\nU 42811 ; WX 813 ; N uniA73B ; G 3214\nU 42812 ; WX 994 ; N uniA73C ; G 3215\nU 42813 ; WX 847 ; N uniA73D ; G 3216\nU 42814 ; WX 796 ; N uniA73E ; G 3217\nU 42815 ; WX 609 ; N uniA73F ; G 3218\nU 42816 ; WX 910 ; N uniA740 ; G 3219\nU 42817 ; WX 722 ; N uniA741 ; G 3220\nU 42822 ; WX 916 ; N uniA746 ; G 3221\nU 42823 ; WX 581 ; N uniA747 ; G 3222\nU 42826 ; WX 1010 ; N uniA74A ; G 3223\nU 42827 ; WX 770 ; N uniA74B ; G 3224\nU 42830 ; WX 1448 ; N uniA74E ; G 3225\nU 42831 ; WX 1060 ; N uniA74F ; G 3226\nU 42856 ; WX 787 ; N uniA768 ; G 3227\nU 42857 ; WX 716 ; N uniA769 ; G 3228\nU 42875 ; WX 694 ; N uniA77B ; G 3229\nU 42876 ; WX 527 ; N uniA77C ; G 3230\nU 42880 ; WX 703 ; N uniA780 ; G 3231\nU 42881 ; WX 380 ; N uniA781 ; G 3232\nU 42882 ; WX 872 ; N uniA782 ; G 3233\nU 42883 ; WX 727 ; N uniA783 ; G 3234\nU 42884 ; WX 694 ; N uniA784 ; G 3235\nU 42885 ; WX 527 ; N uniA785 ; G 3236\nU 42886 ; WX 796 ; N uniA786 ; G 3237\nU 42887 ; WX 609 ; N uniA787 ; G 3238\nU 42891 ; WX 439 ; N uniA78B ; G 3239\nU 42892 ; WX 306 ; N uniA78C ; G 3240\nU 42893 ; WX 913 ; N uniA78D ; G 3241\nU 42896 ; WX 914 ; N uniA790 ; G 3242\nU 42897 ; WX 727 ; N uniA791 ; G 3243\nU 42922 ; WX 945 ; N uniA7AA ; G 3244\nU 43000 ; WX 595 ; N uniA7F8 ; G 3245\nU 43001 ; WX 647 ; N uniA7F9 ; G 3246\nU 43002 ; WX 1069 ; N uniA7FA ; G 3247\nU 43003 ; WX 710 ; N uniA7FB ; G 3248\nU 43004 ; WX 752 ; N uniA7FC ; G 3249\nU 43005 ; WX 1107 ; N uniA7FD ; G 3250\nU 43006 ; WX 468 ; N uniA7FE ; G 3251\nU 43007 ; WX 1286 ; N uniA7FF ; G 3252\nU 62464 ; WX 705 ; N uniF400 ; G 3253\nU 62465 ; WX 716 ; N uniF401 ; G 3254\nU 62466 ; WX 765 ; N uniF402 ; G 3255\nU 62467 ; WX 999 ; N uniF403 ; G 3256\nU 62468 ; WX 716 ; N uniF404 ; G 3257\nU 62469 ; WX 710 ; N uniF405 ; G 3258\nU 62470 ; WX 776 ; N uniF406 ; G 3259\nU 62471 ; WX 1038 ; N uniF407 ; G 3260\nU 62472 ; WX 716 ; N uniF408 ; G 3261\nU 62473 ; WX 716 ; N uniF409 ; G 3262\nU 62474 ; WX 1309 ; N uniF40A ; G 3263\nU 62475 ; WX 734 ; N uniF40B ; G 3264\nU 62476 ; WX 733 ; N uniF40C ; G 3265\nU 62477 ; WX 1004 ; N uniF40D ; G 3266\nU 62478 ; WX 716 ; N uniF40E ; G 3267\nU 62479 ; WX 733 ; N uniF40F ; G 3268\nU 62480 ; WX 1050 ; N uniF410 ; G 3269\nU 62481 ; WX 797 ; N uniF411 ; G 3270\nU 62482 ; WX 850 ; N uniF412 ; G 3271\nU 62483 ; WX 799 ; N uniF413 ; G 3272\nU 62484 ; WX 996 ; N uniF414 ; G 3273\nU 62485 ; WX 732 ; N uniF415 ; G 3274\nU 62486 ; WX 987 ; N uniF416 ; G 3275\nU 62487 ; WX 731 ; N uniF417 ; G 3276\nU 62488 ; WX 739 ; N uniF418 ; G 3277\nU 62489 ; WX 733 ; N uniF419 ; G 3278\nU 62490 ; WX 780 ; N uniF41A ; G 3279\nU 62491 ; WX 733 ; N uniF41B ; G 3280\nU 62492 ; WX 739 ; N uniF41C ; G 3281\nU 62493 ; WX 717 ; N uniF41D ; G 3282\nU 62494 ; WX 780 ; N uniF41E ; G 3283\nU 62495 ; WX 936 ; N uniF41F ; G 3284\nU 62496 ; WX 716 ; N uniF420 ; G 3285\nU 62497 ; WX 826 ; N uniF421 ; G 3286\nU 62498 ; WX 717 ; N uniF422 ; G 3287\nU 62499 ; WX 716 ; N uniF423 ; G 3288\nU 62500 ; WX 716 ; N uniF424 ; G 3289\nU 62501 ; WX 773 ; N uniF425 ; G 3290\nU 62502 ; WX 1013 ; N uniF426 ; G 3291\nU 62504 ; WX 904 ; N uniF428 ; G 3292\nU 63173 ; WX 667 ; N uniF6C5 ; G 3293\nU 63185 ; WX 500 ; N cyrBreve ; G 3294\nU 63188 ; WX 500 ; N cyrbreve ; G 3295\nU 64256 ; WX 821 ; N uniFB00 ; G 3296\nU 64257 ; WX 727 ; N fi ; G 3297\nU 64258 ; WX 727 ; N fl ; G 3298\nU 64259 ; WX 1120 ; N uniFB03 ; G 3299\nU 64260 ; WX 1117 ; N uniFB04 ; G 3300\nU 64261 ; WX 871 ; N uniFB05 ; G 3301\nU 64262 ; WX 971 ; N uniFB06 ; G 3302\nU 65024 ; WX 0 ; N uniFE00 ; G 3303\nU 65025 ; WX 0 ; N uniFE01 ; G 3304\nU 65026 ; WX 0 ; N uniFE02 ; G 3305\nU 65027 ; WX 0 ; N uniFE03 ; G 3306\nU 65028 ; WX 0 ; N uniFE04 ; G 3307\nU 65029 ; WX 0 ; N uniFE05 ; G 3308\nU 65030 ; WX 0 ; N uniFE06 ; G 3309\nU 65031 ; WX 0 ; N uniFE07 ; G 3310\nU 65032 ; WX 0 ; N uniFE08 ; G 3311\nU 65033 ; WX 0 ; N uniFE09 ; G 3312\nU 65034 ; WX 0 ; N uniFE0A ; G 3313\nU 65035 ; WX 0 ; N uniFE0B ; G 3314\nU 65036 ; WX 0 ; N uniFE0C ; G 3315\nU 65037 ; WX 0 ; N uniFE0D ; G 3316\nU 65038 ; WX 0 ; N uniFE0E ; G 3317\nU 65039 ; WX 0 ; N uniFE0F ; G 3318\nU 65529 ; WX 0 ; N uniFFF9 ; G 3319\nU 65530 ; WX 0 ; N uniFFFA ; G 3320\nU 65531 ; WX 0 ; N uniFFFB ; G 3321\nU 65532 ; WX 0 ; N uniFFFC ; G 3322\nU 65533 ; WX 1113 ; N uniFFFD ; G 3323\nEndCharMetrics\nStartKernData \nStartKernPairs 1408\n\nKPX dollar seven -112\nKPX dollar nine -149\nKPX dollar colon -102\nKPX dollar less -102\nKPX dollar I -36\nKPX dollar W -36\nKPX dollar Y -83\nKPX dollar Z -83\nKPX dollar backslash -83\nKPX dollar questiondown -83\nKPX dollar Aacute -83\nKPX dollar Hcircumflex -112\nKPX dollar hcircumflex -36\nKPX dollar Hbar -112\nKPX dollar hbar -36\nKPX dollar Kcommaaccent -102\nKPX dollar kcommaaccent -83\nKPX dollar kgreenlandic -102\nKPX dollar Lacute -83\nKPX dollar lacute -102\nKPX dollar uni01DC -112\nKPX dollar uni01DD -36\nKPX dollar uni01F4 -102\nKPX dollar uni01F5 -83\n\nKPX percent ampersand 38\nKPX percent asterisk 38\nKPX percent two 38\nKPX percent less -36\nKPX percent Egrave 38\nKPX percent Ecircumflex 38\nKPX percent Igrave 38\nKPX percent Icircumflex 38\nKPX percent Thorn 38\nKPX percent agrave 38\nKPX percent acircumflex 38\nKPX percent adieresis 38\nKPX percent Dcaron 38\nKPX percent Dcroat 38\nKPX percent Emacron 38\nKPX percent Ebreve 38\nKPX percent kgreenlandic -36\nKPX percent lacute -36\nKPX percent uni01AC 38\nKPX percent uni01AE 38\nKPX percent uni01F0 38\nKPX percent uni01F4 -36\n\n\nKPX quotesingle nine -36\n\n\nKPX parenright dollar -120\nKPX parenright D -112\nKPX parenright H -112\nKPX parenright R -112\nKPX parenright U -36\nKPX parenright X -36\nKPX parenright cent -112\nKPX parenright sterling -112\nKPX parenright currency -112\nKPX parenright yen -112\nKPX parenright brokenbar -112\nKPX parenright section -112\nKPX parenright dieresis -112\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -112\nKPX parenright mu -112\nKPX parenright paragraph -112\nKPX parenright periodcentered -112\nKPX parenright cedilla -112\nKPX parenright ordmasculine -112\nKPX parenright guillemotright -36\nKPX parenright onequarter -36\nKPX parenright onehalf -36\nKPX parenright threequarters -36\nKPX parenright Acircumflex -120\nKPX parenright Atilde -112\nKPX parenright Adieresis -120\nKPX parenright Aring -112\nKPX parenright AE -120\nKPX parenright Ccedilla -112\nKPX parenright Otilde -112\nKPX parenright multiply -112\nKPX parenright Ugrave -112\nKPX parenright Ucircumflex -112\nKPX parenright Yacute -112\nKPX parenright dcaron -112\nKPX parenright dmacron -112\nKPX parenright emacron -112\nKPX parenright ebreve -112\nKPX parenright edotaccent -36\nKPX parenright eogonek -36\nKPX parenright ecaron -36\nKPX parenright imacron -36\nKPX parenright ibreve -36\nKPX parenright iogonek -36\nKPX parenright dotlessi -36\nKPX parenright ij -36\nKPX parenright jcircumflex -36\nKPX parenright uni01A5 -112\nKPX parenright uni01AD -112\nKPX parenright Uhorn -112\nKPX parenright uni01F1 -112\n\n\n\nKPX period dollar -83\nKPX period ampersand -55\nKPX period two -55\nKPX period eight -73\nKPX period colon -73\nKPX period less -55\nKPX period H -45\nKPX period R -45\nKPX period X -45\nKPX period backslash -92\nKPX period ordfeminine -45\nKPX period guillemotleft -45\nKPX period logicalnot -45\nKPX period sfthyphen -45\nKPX period acute -45\nKPX period mu -45\nKPX period paragraph -45\nKPX period periodcentered -45\nKPX period cedilla -45\nKPX period ordmasculine -36\nKPX period guillemotright -45\nKPX period onequarter -45\nKPX period onehalf -45\nKPX period threequarters -45\nKPX period questiondown -92\nKPX period Aacute -92\nKPX period Egrave -55\nKPX period Icircumflex -55\nKPX period Yacute -45\nKPX period Ebreve -55\nKPX period ebreve -45\nKPX period Idot -73\nKPX period dotlessi -45\nKPX period lacute -55\n\nKPX slash seven -167\nKPX slash eight -112\nKPX slash nine -243\nKPX slash colon -139\nKPX slash less -131\nKPX slash backslash -73\nKPX slash questiondown -73\nKPX slash Aacute -73\nKPX slash Hbar -167\nKPX slash Idot -112\nKPX slash lacute -131\n\n\nKPX two nine -36\nKPX two semicolon -36\n\nKPX three dollar -149\nKPX three D -55\nKPX three H -55\nKPX three R -55\nKPX three cent -55\nKPX three sterling -55\nKPX three currency -55\nKPX three yen -55\nKPX three brokenbar -55\nKPX three section -55\nKPX three dieresis -55\nKPX three ordfeminine -55\nKPX three guillemotleft -55\nKPX three logicalnot -55\nKPX three sfthyphen -55\nKPX three acute -55\nKPX three mu -55\nKPX three paragraph -55\nKPX three periodcentered -55\nKPX three cedilla -55\nKPX three ordmasculine -55\nKPX three Yacute -55\nKPX three ebreve -55\n\n\nKPX five seven -36\nKPX five nine -73\nKPX five colon -45\nKPX five less -63\nKPX five D 47\nKPX five backslash -36\nKPX five cent 47\nKPX five sterling 47\nKPX five currency 47\nKPX five yen 47\nKPX five brokenbar 47\nKPX five section 47\nKPX five dieresis 47\nKPX five ordmasculine 38\nKPX five questiondown -36\nKPX five Aacute -36\nKPX five Hbar -36\nKPX five lacute -63\n\nKPX six six -45\nKPX six Gdotaccent -45\nKPX six Gcommaaccent -45\n\nKPX seven dollar -112\nKPX seven seven -73\nKPX seven D -196\nKPX seven F -235\nKPX seven H -235\nKPX seven R -235\nKPX seven U -149\nKPX seven V -188\nKPX seven X -188\nKPX seven Z -225\nKPX seven backslash -225\nKPX seven m -149\nKPX seven braceright -149\nKPX seven cent -96\nKPX seven sterling -196\nKPX seven currency -96\nKPX seven yen -96\nKPX seven brokenbar -96\nKPX seven section -96\nKPX seven dieresis -159\nKPX seven copyright -235\nKPX seven ordfeminine -175\nKPX seven guillemotleft -235\nKPX seven logicalnot -175\nKPX seven sfthyphen -175\nKPX seven acute -155\nKPX seven mu -235\nKPX seven paragraph -155\nKPX seven periodcentered -155\nKPX seven cedilla -155\nKPX seven ordmasculine -159\nKPX seven guillemotright -158\nKPX seven onequarter -188\nKPX seven onehalf -158\nKPX seven threequarters -158\nKPX seven questiondown -225\nKPX seven Aacute -225\nKPX seven Eacute -235\nKPX seven Idieresis -235\nKPX seven Yacute -235\nKPX seven ebreve -159\nKPX seven edotaccent -149\nKPX seven ecaron -149\nKPX seven gdotaccent -188\nKPX seven gcommaaccent -188\nKPX seven Hbar -73\nKPX seven dotlessi -188\n\nKPX eight dollar -63\n\nKPX nine dollar -159\nKPX nine two -36\nKPX nine D -188\nKPX nine H -188\nKPX nine L -36\nKPX nine R -188\nKPX nine X -131\nKPX nine backslash -83\nKPX nine cent -188\nKPX nine sterling -188\nKPX nine currency -188\nKPX nine yen -188\nKPX nine brokenbar -188\nKPX nine section -188\nKPX nine dieresis -188\nKPX nine ordfeminine -188\nKPX nine guillemotleft -188\nKPX nine logicalnot -188\nKPX nine sfthyphen -188\nKPX nine acute -188\nKPX nine mu -188\nKPX nine paragraph -188\nKPX nine periodcentered -188\nKPX nine cedilla -188\nKPX nine ordmasculine -188\nKPX nine guillemotright -131\nKPX nine onequarter -131\nKPX nine onehalf -131\nKPX nine threequarters -131\nKPX nine questiondown -83\nKPX nine Aacute -83\nKPX nine Yacute -188\nKPX nine Ebreve -36\nKPX nine ebreve -188\nKPX nine dotlessi -131\n\nKPX colon dollar -131\nKPX colon D -178\nKPX colon H -167\nKPX colon L -36\nKPX colon R -167\nKPX colon U -92\nKPX colon X -83\nKPX colon backslash -45\nKPX colon cent -178\nKPX colon sterling -178\nKPX colon currency -178\nKPX colon yen -178\nKPX colon brokenbar -178\nKPX colon section -178\nKPX colon dieresis -139\nKPX colon ordfeminine -167\nKPX colon guillemotleft -167\nKPX colon logicalnot -167\nKPX colon sfthyphen -167\nKPX colon acute -167\nKPX colon mu -167\nKPX colon paragraph -167\nKPX colon periodcentered -167\nKPX colon cedilla -167\nKPX colon ordmasculine -167\nKPX colon guillemotright -83\nKPX colon onequarter -83\nKPX colon onehalf -83\nKPX colon threequarters -83\nKPX colon questiondown -45\nKPX colon Aacute -45\nKPX colon Yacute -167\nKPX colon ebreve -167\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -83\n\nKPX semicolon dollar -73\nKPX semicolon ampersand -36\nKPX semicolon two -36\nKPX semicolon Egrave -36\nKPX semicolon Icircumflex -36\nKPX semicolon Ebreve -36\n\nKPX less dollar -131\nKPX less ampersand -36\nKPX less D -159\nKPX less H -178\nKPX less L -36\nKPX less R -178\nKPX less X -178\nKPX less cent -159\nKPX less sterling -159\nKPX less currency -159\nKPX less yen -159\nKPX less brokenbar -159\nKPX less section -159\nKPX less dieresis -159\nKPX less ordfeminine -178\nKPX less guillemotleft -178\nKPX less logicalnot -178\nKPX less sfthyphen -178\nKPX less acute -178\nKPX less mu -178\nKPX less paragraph -178\nKPX less periodcentered -178\nKPX less cedilla -178\nKPX less ordmasculine -178\nKPX less guillemotright -178\nKPX less onequarter -178\nKPX less onehalf -178\nKPX less threequarters -178\nKPX less Egrave -36\nKPX less Icircumflex -36\nKPX less Yacute -178\nKPX less ebreve -178\nKPX less dotlessi -178\n\n\n\n\n\n\n\n\n\n\nKPX m hyphen -73\nKPX m seven -149\nKPX m Hbar -149\n\nKPX braceright hyphen -73\nKPX braceright seven -149\nKPX braceright Hbar -149\n\n\n\n\n\n\n\n\n\n\n\n\nKPX Acircumflex seven -112\nKPX Acircumflex nine -149\nKPX Acircumflex colon -102\nKPX Acircumflex less -102\nKPX Acircumflex I -36\nKPX Acircumflex W -36\nKPX Acircumflex Y -83\nKPX Acircumflex Z -83\nKPX Acircumflex backslash -83\nKPX Acircumflex questiondown -83\nKPX Acircumflex Aacute -83\nKPX Acircumflex Hcircumflex -112\nKPX Acircumflex hcircumflex -36\nKPX Acircumflex Hbar -112\nKPX Acircumflex hbar -36\nKPX Acircumflex Kcommaaccent -102\nKPX Acircumflex kcommaaccent -83\nKPX Acircumflex kgreenlandic -102\nKPX Acircumflex Lacute -83\nKPX Acircumflex lacute -102\nKPX Acircumflex uni01DC -112\nKPX Acircumflex uni01DD -36\nKPX Acircumflex uni01F4 -102\nKPX Acircumflex uni01F5 -83\n\nKPX Adieresis seven -112\nKPX Adieresis nine -149\nKPX Adieresis colon -102\nKPX Adieresis less -102\nKPX Adieresis I -36\nKPX Adieresis W -36\nKPX Adieresis Y -83\nKPX Adieresis Z -83\nKPX Adieresis backslash -83\nKPX Adieresis questiondown -83\nKPX Adieresis Aacute -83\nKPX Adieresis Hcircumflex -112\nKPX Adieresis hcircumflex -36\nKPX Adieresis Hbar -112\nKPX Adieresis hbar -36\nKPX Adieresis Kcommaaccent -102\nKPX Adieresis kcommaaccent -83\nKPX Adieresis kgreenlandic -102\nKPX Adieresis Lacute -83\nKPX Adieresis lacute -102\nKPX Adieresis uni01DC -112\nKPX Adieresis uni01DD -36\nKPX Adieresis uni01F4 -102\nKPX Adieresis uni01F5 -83\n\nKPX AE seven -112\nKPX AE nine -149\nKPX AE colon -102\nKPX AE less -102\nKPX AE I -36\nKPX AE W -36\nKPX AE Y -83\nKPX AE Z -83\nKPX AE backslash -83\nKPX AE questiondown -83\nKPX AE Aacute -83\nKPX AE Hcircumflex -112\nKPX AE hcircumflex -36\nKPX AE Hbar -112\nKPX AE hbar -36\nKPX AE Kcommaaccent -102\nKPX AE kcommaaccent -83\nKPX AE kgreenlandic -102\nKPX AE Lacute -83\nKPX AE lacute -102\nKPX AE uni01DC -112\nKPX AE uni01DD -36\nKPX AE uni01F4 -102\nKPX AE uni01F5 -83\n\n\n\n\n\nKPX Eth nine -36\n\nKPX Ograve nine -36\n\n\n\nKPX ucircumflex seven -167\nKPX ucircumflex eight -112\nKPX ucircumflex nine -243\nKPX ucircumflex colon -139\nKPX ucircumflex less -131\nKPX ucircumflex backslash -73\nKPX ucircumflex questiondown -73\nKPX ucircumflex Aacute -73\nKPX ucircumflex Hbar -167\nKPX ucircumflex Idot -112\nKPX ucircumflex lacute -131\n\nKPX ydieresis seven -167\nKPX ydieresis eight -112\nKPX ydieresis nine -243\nKPX ydieresis colon -139\nKPX ydieresis less -131\nKPX ydieresis backslash -73\nKPX ydieresis questiondown -73\nKPX ydieresis Aacute -73\nKPX ydieresis Hbar -167\nKPX ydieresis Idot -112\nKPX ydieresis lacute -131\n\nKPX Abreve O -241\n\nKPX abreve seven -167\nKPX abreve eight -112\nKPX abreve nine -243\nKPX abreve colon -139\nKPX abreve less -131\nKPX abreve backslash -73\nKPX abreve questiondown -73\nKPX abreve Aacute -73\nKPX abreve Hbar -167\nKPX abreve Idot -112\nKPX abreve lacute -131\n\n\n\nKPX Edotaccent seven -36\nKPX Edotaccent nine -73\nKPX Edotaccent colon -45\nKPX Edotaccent less -63\nKPX Edotaccent D 47\nKPX Edotaccent backslash -36\nKPX Edotaccent cent 47\nKPX Edotaccent sterling 47\nKPX Edotaccent currency 47\nKPX Edotaccent yen 47\nKPX Edotaccent brokenbar 47\nKPX Edotaccent section 47\nKPX Edotaccent dieresis 47\nKPX Edotaccent ordmasculine 38\nKPX Edotaccent questiondown -36\nKPX Edotaccent Aacute -36\nKPX Edotaccent Hbar -36\nKPX Edotaccent lacute -63\n\n\nKPX Ecaron seven -36\nKPX Ecaron nine -73\nKPX Ecaron colon -45\nKPX Ecaron less -63\nKPX Ecaron D 47\nKPX Ecaron backslash -36\nKPX Ecaron cent 47\nKPX Ecaron sterling 47\nKPX Ecaron currency 47\nKPX Ecaron yen 47\nKPX Ecaron brokenbar 47\nKPX Ecaron section 47\nKPX Ecaron dieresis 47\nKPX Ecaron ordmasculine 38\nKPX Ecaron questiondown -36\nKPX Ecaron Aacute -36\nKPX Ecaron Hbar -36\nKPX Ecaron lacute -63\n\n\nKPX Gdotaccent six -45\nKPX Gdotaccent Gdotaccent -45\nKPX Gdotaccent Gcommaaccent -45\n\nKPX Gcommaaccent six -45\nKPX Gcommaaccent Gdotaccent -45\nKPX Gcommaaccent Gcommaaccent -45\n\nKPX Hbar dollar -112\nKPX Hbar seven -73\nKPX Hbar D -196\nKPX Hbar F -235\nKPX Hbar H -235\nKPX Hbar R -235\nKPX Hbar U -149\nKPX Hbar V -188\nKPX Hbar X -188\nKPX Hbar Z -225\nKPX Hbar backslash -225\nKPX Hbar m -149\nKPX Hbar braceright -149\nKPX Hbar cent -196\nKPX Hbar sterling -196\nKPX Hbar currency -196\nKPX Hbar yen -196\nKPX Hbar brokenbar -196\nKPX Hbar section -196\nKPX Hbar dieresis -159\nKPX Hbar copyright -235\nKPX Hbar ordfeminine -235\nKPX Hbar guillemotleft -235\nKPX Hbar logicalnot -235\nKPX Hbar sfthyphen -235\nKPX Hbar acute -235\nKPX Hbar mu -235\nKPX Hbar paragraph -235\nKPX Hbar periodcentered -235\nKPX Hbar cedilla -235\nKPX Hbar ordmasculine -159\nKPX Hbar guillemotright -188\nKPX Hbar onequarter -188\nKPX Hbar onehalf -188\nKPX Hbar threequarters -188\nKPX Hbar questiondown -225\nKPX Hbar Aacute -225\nKPX Hbar Eacute -235\nKPX Hbar Idieresis -235\nKPX Hbar Yacute -235\nKPX Hbar ebreve -159\nKPX Hbar edotaccent -149\nKPX Hbar ecaron -149\nKPX Hbar gdotaccent -188\nKPX Hbar gcommaaccent -188\nKPX Hbar Hbar -73\nKPX Hbar dotlessi -188\n\nKPX Idot dollar -63\n\nKPX lacute dollar -131\nKPX lacute ampersand -36\nKPX lacute D -159\nKPX lacute H -178\nKPX lacute L -36\nKPX lacute R -178\nKPX lacute X -178\nKPX lacute cent -159\nKPX lacute sterling -159\nKPX lacute currency -159\nKPX lacute yen -159\nKPX lacute brokenbar -159\nKPX lacute section -159\nKPX lacute dieresis -159\nKPX lacute ordfeminine -178\nKPX lacute guillemotleft -178\nKPX lacute logicalnot -178\nKPX lacute sfthyphen -178\nKPX lacute acute -178\nKPX lacute mu -178\nKPX lacute paragraph -178\nKPX lacute periodcentered -178\nKPX lacute cedilla -178\nKPX lacute ordmasculine -178\nKPX lacute guillemotright -178\nKPX lacute onequarter -178\nKPX lacute onehalf -178\nKPX lacute threequarters -178\nKPX lacute Egrave -36\nKPX lacute Icircumflex -36\nKPX lacute Yacute -178\nKPX lacute ebreve -178\nKPX lacute dotlessi -178\n\n\nKPX uni027D dollar -282\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Serif\nFontSubfamily Bold Italic\nUniqueID DejaVu Serif Bold Italic\nFullName DejaVu Serif Bold Italic\nVersion Version 2.37\nPostScriptName DejaVuSerif-BoldItalic\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Serif\nPreferredSubfamily Bold Italic\nWeight Bold\nItalicAngle -11\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 939\nDescender -236\nFontBBox -906 -389 1925 1145\nStartCharMetrics 3506\nU 32 ; WX 348 ; N space ; G 3\nU 33 ; WX 439 ; N exclam ; G 4\nU 34 ; WX 521 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 696 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 903 ; N ampersand ; G 9\nU 39 ; WX 306 ; N quotesingle ; G 10\nU 40 ; WX 473 ; N parenleft ; G 11\nU 41 ; WX 473 ; N parenright ; G 12\nU 42 ; WX 523 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 348 ; N comma ; G 15\nU 45 ; WX 415 ; N hyphen ; G 16\nU 46 ; WX 348 ; N period ; G 17\nU 47 ; WX 365 ; N slash ; G 18\nU 48 ; WX 696 ; N zero ; G 19\nU 49 ; WX 696 ; N one ; G 20\nU 50 ; WX 696 ; N two ; G 21\nU 51 ; WX 696 ; N three ; G 22\nU 52 ; WX 696 ; N four ; G 23\nU 53 ; WX 696 ; N five ; G 24\nU 54 ; WX 696 ; N six ; G 25\nU 55 ; WX 696 ; N seven ; G 26\nU 56 ; WX 696 ; N eight ; G 27\nU 57 ; WX 696 ; N nine ; G 28\nU 58 ; WX 369 ; N colon ; G 29\nU 59 ; WX 369 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 586 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 776 ; N A ; G 36\nU 66 ; WX 845 ; N B ; G 37\nU 67 ; WX 796 ; N C ; G 38\nU 68 ; WX 867 ; N D ; G 39\nU 69 ; WX 762 ; N E ; G 40\nU 70 ; WX 710 ; N F ; G 41\nU 71 ; WX 854 ; N G ; G 42\nU 72 ; WX 945 ; N H ; G 43\nU 73 ; WX 468 ; N I ; G 44\nU 74 ; WX 473 ; N J ; G 45\nU 75 ; WX 869 ; N K ; G 46\nU 76 ; WX 703 ; N L ; G 47\nU 77 ; WX 1107 ; N M ; G 48\nU 78 ; WX 914 ; N N ; G 49\nU 79 ; WX 871 ; N O ; G 50\nU 80 ; WX 752 ; N P ; G 51\nU 81 ; WX 871 ; N Q ; G 52\nU 82 ; WX 831 ; N R ; G 53\nU 83 ; WX 722 ; N S ; G 54\nU 84 ; WX 744 ; N T ; G 55\nU 85 ; WX 872 ; N U ; G 56\nU 86 ; WX 776 ; N V ; G 57\nU 87 ; WX 1123 ; N W ; G 58\nU 88 ; WX 776 ; N X ; G 59\nU 89 ; WX 714 ; N Y ; G 60\nU 90 ; WX 730 ; N Z ; G 61\nU 91 ; WX 473 ; N bracketleft ; G 62\nU 92 ; WX 365 ; N backslash ; G 63\nU 93 ; WX 473 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 648 ; N a ; G 68\nU 98 ; WX 699 ; N b ; G 69\nU 99 ; WX 609 ; N c ; G 70\nU 100 ; WX 699 ; N d ; G 71\nU 101 ; WX 636 ; N e ; G 72\nU 102 ; WX 430 ; N f ; G 73\nU 103 ; WX 699 ; N g ; G 74\nU 104 ; WX 727 ; N h ; G 75\nU 105 ; WX 380 ; N i ; G 76\nU 106 ; WX 362 ; N j ; G 77\nU 107 ; WX 693 ; N k ; G 78\nU 108 ; WX 380 ; N l ; G 79\nU 109 ; WX 1058 ; N m ; G 80\nU 110 ; WX 727 ; N n ; G 81\nU 111 ; WX 667 ; N o ; G 82\nU 112 ; WX 699 ; N p ; G 83\nU 113 ; WX 699 ; N q ; G 84\nU 114 ; WX 527 ; N r ; G 85\nU 115 ; WX 563 ; N s ; G 86\nU 116 ; WX 462 ; N t ; G 87\nU 117 ; WX 727 ; N u ; G 88\nU 118 ; WX 581 ; N v ; G 89\nU 119 ; WX 861 ; N w ; G 90\nU 120 ; WX 596 ; N x ; G 91\nU 121 ; WX 581 ; N y ; G 92\nU 122 ; WX 568 ; N z ; G 93\nU 123 ; WX 643 ; N braceleft ; G 94\nU 124 ; WX 364 ; N bar ; G 95\nU 125 ; WX 643 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 348 ; N nbspace ; G 98\nU 161 ; WX 439 ; N exclamdown ; G 99\nU 162 ; WX 696 ; N cent ; G 100\nU 163 ; WX 696 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 696 ; N yen ; G 103\nU 166 ; WX 364 ; N brokenbar ; G 104\nU 167 ; WX 523 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 487 ; N ordfeminine ; G 108\nU 171 ; WX 625 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 415 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 438 ; N twosuperior ; G 116\nU 179 ; WX 438 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 732 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 348 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 438 ; N onesuperior ; G 123\nU 186 ; WX 500 ; N ordmasculine ; G 124\nU 187 ; WX 625 ; N guillemotright ; G 125\nU 188 ; WX 1043 ; N onequarter ; G 126\nU 189 ; WX 1043 ; N onehalf ; G 127\nU 190 ; WX 1043 ; N threequarters ; G 128\nU 191 ; WX 586 ; N questiondown ; G 129\nU 192 ; WX 776 ; N Agrave ; G 130\nU 193 ; WX 776 ; N Aacute ; G 131\nU 194 ; WX 776 ; N Acircumflex ; G 132\nU 195 ; WX 776 ; N Atilde ; G 133\nU 196 ; WX 776 ; N Adieresis ; G 134\nU 197 ; WX 776 ; N Aring ; G 135\nU 198 ; WX 1034 ; N AE ; G 136\nU 199 ; WX 796 ; N Ccedilla ; G 137\nU 200 ; WX 762 ; N Egrave ; G 138\nU 201 ; WX 762 ; N Eacute ; G 139\nU 202 ; WX 762 ; N Ecircumflex ; G 140\nU 203 ; WX 762 ; N Edieresis ; G 141\nU 204 ; WX 468 ; N Igrave ; G 142\nU 205 ; WX 468 ; N Iacute ; G 143\nU 206 ; WX 468 ; N Icircumflex ; G 144\nU 207 ; WX 468 ; N Idieresis ; G 145\nU 208 ; WX 874 ; N Eth ; G 146\nU 209 ; WX 914 ; N Ntilde ; G 147\nU 210 ; WX 871 ; N Ograve ; G 148\nU 211 ; WX 871 ; N Oacute ; G 149\nU 212 ; WX 871 ; N Ocircumflex ; G 150\nU 213 ; WX 871 ; N Otilde ; G 151\nU 214 ; WX 871 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 871 ; N Oslash ; G 154\nU 217 ; WX 872 ; N Ugrave ; G 155\nU 218 ; WX 872 ; N Uacute ; G 156\nU 219 ; WX 872 ; N Ucircumflex ; G 157\nU 220 ; WX 872 ; N Udieresis ; G 158\nU 221 ; WX 714 ; N Yacute ; G 159\nU 222 ; WX 757 ; N Thorn ; G 160\nU 223 ; WX 760 ; N germandbls ; G 161\nU 224 ; WX 648 ; N agrave ; G 162\nU 225 ; WX 648 ; N aacute ; G 163\nU 226 ; WX 648 ; N acircumflex ; G 164\nU 227 ; WX 648 ; N atilde ; G 165\nU 228 ; WX 648 ; N adieresis ; G 166\nU 229 ; WX 648 ; N aring ; G 167\nU 230 ; WX 932 ; N ae ; G 168\nU 231 ; WX 609 ; N ccedilla ; G 169\nU 232 ; WX 636 ; N egrave ; G 170\nU 233 ; WX 636 ; N eacute ; G 171\nU 234 ; WX 636 ; N ecircumflex ; G 172\nU 235 ; WX 636 ; N edieresis ; G 173\nU 236 ; WX 380 ; N igrave ; G 174\nU 237 ; WX 380 ; N iacute ; G 175\nU 238 ; WX 380 ; N icircumflex ; G 176\nU 239 ; WX 380 ; N idieresis ; G 177\nU 240 ; WX 667 ; N eth ; G 178\nU 241 ; WX 727 ; N ntilde ; G 179\nU 242 ; WX 667 ; N ograve ; G 180\nU 243 ; WX 667 ; N oacute ; G 181\nU 244 ; WX 667 ; N ocircumflex ; G 182\nU 245 ; WX 667 ; N otilde ; G 183\nU 246 ; WX 667 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 667 ; N oslash ; G 186\nU 249 ; WX 727 ; N ugrave ; G 187\nU 250 ; WX 727 ; N uacute ; G 188\nU 251 ; WX 727 ; N ucircumflex ; G 189\nU 252 ; WX 727 ; N udieresis ; G 190\nU 253 ; WX 581 ; N yacute ; G 191\nU 254 ; WX 699 ; N thorn ; G 192\nU 255 ; WX 581 ; N ydieresis ; G 193\nU 256 ; WX 776 ; N Amacron ; G 194\nU 257 ; WX 648 ; N amacron ; G 195\nU 258 ; WX 776 ; N Abreve ; G 196\nU 259 ; WX 648 ; N abreve ; G 197\nU 260 ; WX 776 ; N Aogonek ; G 198\nU 261 ; WX 648 ; N aogonek ; G 199\nU 262 ; WX 796 ; N Cacute ; G 200\nU 263 ; WX 609 ; N cacute ; G 201\nU 264 ; WX 796 ; N Ccircumflex ; G 202\nU 265 ; WX 609 ; N ccircumflex ; G 203\nU 266 ; WX 796 ; N Cdotaccent ; G 204\nU 267 ; WX 609 ; N cdotaccent ; G 205\nU 268 ; WX 796 ; N Ccaron ; G 206\nU 269 ; WX 609 ; N ccaron ; G 207\nU 270 ; WX 867 ; N Dcaron ; G 208\nU 271 ; WX 699 ; N dcaron ; G 209\nU 272 ; WX 874 ; N Dcroat ; G 210\nU 273 ; WX 699 ; N dmacron ; G 211\nU 274 ; WX 762 ; N Emacron ; G 212\nU 275 ; WX 636 ; N emacron ; G 213\nU 276 ; WX 762 ; N Ebreve ; G 214\nU 277 ; WX 636 ; N ebreve ; G 215\nU 278 ; WX 762 ; N Edotaccent ; G 216\nU 279 ; WX 636 ; N edotaccent ; G 217\nU 280 ; WX 762 ; N Eogonek ; G 218\nU 281 ; WX 636 ; N eogonek ; G 219\nU 282 ; WX 762 ; N Ecaron ; G 220\nU 283 ; WX 636 ; N ecaron ; G 221\nU 284 ; WX 854 ; N Gcircumflex ; G 222\nU 285 ; WX 699 ; N gcircumflex ; G 223\nU 286 ; WX 854 ; N Gbreve ; G 224\nU 287 ; WX 699 ; N gbreve ; G 225\nU 288 ; WX 854 ; N Gdotaccent ; G 226\nU 289 ; WX 699 ; N gdotaccent ; G 227\nU 290 ; WX 854 ; N Gcommaaccent ; G 228\nU 291 ; WX 699 ; N gcommaaccent ; G 229\nU 292 ; WX 945 ; N Hcircumflex ; G 230\nU 293 ; WX 727 ; N hcircumflex ; G 231\nU 294 ; WX 945 ; N Hbar ; G 232\nU 295 ; WX 727 ; N hbar ; G 233\nU 296 ; WX 468 ; N Itilde ; G 234\nU 297 ; WX 380 ; N itilde ; G 235\nU 298 ; WX 468 ; N Imacron ; G 236\nU 299 ; WX 380 ; N imacron ; G 237\nU 300 ; WX 468 ; N Ibreve ; G 238\nU 301 ; WX 380 ; N ibreve ; G 239\nU 302 ; WX 468 ; N Iogonek ; G 240\nU 303 ; WX 380 ; N iogonek ; G 241\nU 304 ; WX 468 ; N Idot ; G 242\nU 305 ; WX 380 ; N dotlessi ; G 243\nU 306 ; WX 942 ; N IJ ; G 244\nU 307 ; WX 751 ; N ij ; G 245\nU 308 ; WX 473 ; N Jcircumflex ; G 246\nU 309 ; WX 362 ; N jcircumflex ; G 247\nU 310 ; WX 869 ; N Kcommaaccent ; G 248\nU 311 ; WX 693 ; N kcommaaccent ; G 249\nU 312 ; WX 693 ; N kgreenlandic ; G 250\nU 313 ; WX 703 ; N Lacute ; G 251\nU 314 ; WX 380 ; N lacute ; G 252\nU 315 ; WX 703 ; N Lcommaaccent ; G 253\nU 316 ; WX 380 ; N lcommaaccent ; G 254\nU 317 ; WX 703 ; N Lcaron ; G 255\nU 318 ; WX 508 ; N lcaron ; G 256\nU 319 ; WX 703 ; N Ldot ; G 257\nU 320 ; WX 557 ; N ldot ; G 258\nU 321 ; WX 710 ; N Lslash ; G 259\nU 322 ; WX 385 ; N lslash ; G 260\nU 323 ; WX 914 ; N Nacute ; G 261\nU 324 ; WX 727 ; N nacute ; G 262\nU 325 ; WX 914 ; N Ncommaaccent ; G 263\nU 326 ; WX 727 ; N ncommaaccent ; G 264\nU 327 ; WX 914 ; N Ncaron ; G 265\nU 328 ; WX 727 ; N ncaron ; G 266\nU 329 ; WX 1008 ; N napostrophe ; G 267\nU 330 ; WX 872 ; N Eng ; G 268\nU 331 ; WX 727 ; N eng ; G 269\nU 332 ; WX 871 ; N Omacron ; G 270\nU 333 ; WX 667 ; N omacron ; G 271\nU 334 ; WX 871 ; N Obreve ; G 272\nU 335 ; WX 667 ; N obreve ; G 273\nU 336 ; WX 871 ; N Ohungarumlaut ; G 274\nU 337 ; WX 667 ; N ohungarumlaut ; G 275\nU 338 ; WX 1180 ; N OE ; G 276\nU 339 ; WX 1028 ; N oe ; G 277\nU 340 ; WX 831 ; N Racute ; G 278\nU 341 ; WX 527 ; N racute ; G 279\nU 342 ; WX 831 ; N Rcommaaccent ; G 280\nU 343 ; WX 527 ; N rcommaaccent ; G 281\nU 344 ; WX 831 ; N Rcaron ; G 282\nU 345 ; WX 527 ; N rcaron ; G 283\nU 346 ; WX 722 ; N Sacute ; G 284\nU 347 ; WX 563 ; N sacute ; G 285\nU 348 ; WX 722 ; N Scircumflex ; G 286\nU 349 ; WX 563 ; N scircumflex ; G 287\nU 350 ; WX 722 ; N Scedilla ; G 288\nU 351 ; WX 563 ; N scedilla ; G 289\nU 352 ; WX 722 ; N Scaron ; G 290\nU 353 ; WX 563 ; N scaron ; G 291\nU 354 ; WX 744 ; N Tcommaaccent ; G 292\nU 355 ; WX 462 ; N tcommaaccent ; G 293\nU 356 ; WX 744 ; N Tcaron ; G 294\nU 357 ; WX 462 ; N tcaron ; G 295\nU 358 ; WX 744 ; N Tbar ; G 296\nU 359 ; WX 462 ; N tbar ; G 297\nU 360 ; WX 872 ; N Utilde ; G 298\nU 361 ; WX 727 ; N utilde ; G 299\nU 362 ; WX 872 ; N Umacron ; G 300\nU 363 ; WX 727 ; N umacron ; G 301\nU 364 ; WX 872 ; N Ubreve ; G 302\nU 365 ; WX 727 ; N ubreve ; G 303\nU 366 ; WX 872 ; N Uring ; G 304\nU 367 ; WX 727 ; N uring ; G 305\nU 368 ; WX 872 ; N Uhungarumlaut ; G 306\nU 369 ; WX 727 ; N uhungarumlaut ; G 307\nU 370 ; WX 872 ; N Uogonek ; G 308\nU 371 ; WX 727 ; N uogonek ; G 309\nU 372 ; WX 1123 ; N Wcircumflex ; G 310\nU 373 ; WX 861 ; N wcircumflex ; G 311\nU 374 ; WX 714 ; N Ycircumflex ; G 312\nU 375 ; WX 581 ; N ycircumflex ; G 313\nU 376 ; WX 714 ; N Ydieresis ; G 314\nU 377 ; WX 730 ; N Zacute ; G 315\nU 378 ; WX 568 ; N zacute ; G 316\nU 379 ; WX 730 ; N Zdotaccent ; G 317\nU 380 ; WX 568 ; N zdotaccent ; G 318\nU 381 ; WX 730 ; N Zcaron ; G 319\nU 382 ; WX 568 ; N zcaron ; G 320\nU 383 ; WX 430 ; N longs ; G 321\nU 384 ; WX 699 ; N uni0180 ; G 322\nU 385 ; WX 845 ; N uni0181 ; G 323\nU 386 ; WX 854 ; N uni0182 ; G 324\nU 387 ; WX 699 ; N uni0183 ; G 325\nU 388 ; WX 854 ; N uni0184 ; G 326\nU 389 ; WX 699 ; N uni0185 ; G 327\nU 390 ; WX 796 ; N uni0186 ; G 328\nU 391 ; WX 796 ; N uni0187 ; G 329\nU 392 ; WX 609 ; N uni0188 ; G 330\nU 393 ; WX 874 ; N uni0189 ; G 331\nU 394 ; WX 867 ; N uni018A ; G 332\nU 395 ; WX 854 ; N uni018B ; G 333\nU 396 ; WX 699 ; N uni018C ; G 334\nU 397 ; WX 667 ; N uni018D ; G 335\nU 398 ; WX 762 ; N uni018E ; G 336\nU 399 ; WX 871 ; N uni018F ; G 337\nU 400 ; WX 721 ; N uni0190 ; G 338\nU 401 ; WX 710 ; N uni0191 ; G 339\nU 402 ; WX 430 ; N florin ; G 340\nU 403 ; WX 854 ; N uni0193 ; G 341\nU 404 ; WX 771 ; N uni0194 ; G 342\nU 405 ; WX 1043 ; N uni0195 ; G 343\nU 406 ; WX 468 ; N uni0196 ; G 344\nU 407 ; WX 468 ; N uni0197 ; G 345\nU 408 ; WX 869 ; N uni0198 ; G 346\nU 409 ; WX 693 ; N uni0199 ; G 347\nU 410 ; WX 380 ; N uni019A ; G 348\nU 411 ; WX 701 ; N uni019B ; G 349\nU 412 ; WX 1058 ; N uni019C ; G 350\nU 413 ; WX 914 ; N uni019D ; G 351\nU 414 ; WX 727 ; N uni019E ; G 352\nU 415 ; WX 871 ; N uni019F ; G 353\nU 416 ; WX 871 ; N Ohorn ; G 354\nU 417 ; WX 667 ; N ohorn ; G 355\nU 418 ; WX 1200 ; N uni01A2 ; G 356\nU 419 ; WX 943 ; N uni01A3 ; G 357\nU 420 ; WX 752 ; N uni01A4 ; G 358\nU 421 ; WX 699 ; N uni01A5 ; G 359\nU 422 ; WX 831 ; N uni01A6 ; G 360\nU 423 ; WX 722 ; N uni01A7 ; G 361\nU 424 ; WX 563 ; N uni01A8 ; G 362\nU 425 ; WX 707 ; N uni01A9 ; G 363\nU 426 ; WX 331 ; N uni01AA ; G 364\nU 427 ; WX 462 ; N uni01AB ; G 365\nU 428 ; WX 744 ; N uni01AC ; G 366\nU 429 ; WX 462 ; N uni01AD ; G 367\nU 430 ; WX 744 ; N uni01AE ; G 368\nU 431 ; WX 872 ; N Uhorn ; G 369\nU 432 ; WX 727 ; N uhorn ; G 370\nU 433 ; WX 890 ; N uni01B1 ; G 371\nU 434 ; WX 890 ; N uni01B2 ; G 372\nU 435 ; WX 714 ; N uni01B3 ; G 373\nU 436 ; WX 699 ; N uni01B4 ; G 374\nU 437 ; WX 730 ; N uni01B5 ; G 375\nU 438 ; WX 568 ; N uni01B6 ; G 376\nU 439 ; WX 657 ; N uni01B7 ; G 377\nU 440 ; WX 657 ; N uni01B8 ; G 378\nU 441 ; WX 657 ; N uni01B9 ; G 379\nU 442 ; WX 657 ; N uni01BA ; G 380\nU 443 ; WX 696 ; N uni01BB ; G 381\nU 444 ; WX 754 ; N uni01BC ; G 382\nU 445 ; WX 568 ; N uni01BD ; G 383\nU 446 ; WX 536 ; N uni01BE ; G 384\nU 447 ; WX 716 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1597 ; N uni01C4 ; G 390\nU 453 ; WX 1435 ; N uni01C5 ; G 391\nU 454 ; WX 1267 ; N uni01C6 ; G 392\nU 455 ; WX 1176 ; N uni01C7 ; G 393\nU 456 ; WX 1065 ; N uni01C8 ; G 394\nU 457 ; WX 742 ; N uni01C9 ; G 395\nU 458 ; WX 1387 ; N uni01CA ; G 396\nU 459 ; WX 1276 ; N uni01CB ; G 397\nU 460 ; WX 1089 ; N uni01CC ; G 398\nU 461 ; WX 776 ; N uni01CD ; G 399\nU 462 ; WX 648 ; N uni01CE ; G 400\nU 463 ; WX 468 ; N uni01CF ; G 401\nU 464 ; WX 380 ; N uni01D0 ; G 402\nU 465 ; WX 871 ; N uni01D1 ; G 403\nU 466 ; WX 667 ; N uni01D2 ; G 404\nU 467 ; WX 872 ; N uni01D3 ; G 405\nU 468 ; WX 727 ; N uni01D4 ; G 406\nU 469 ; WX 872 ; N uni01D5 ; G 407\nU 470 ; WX 727 ; N uni01D6 ; G 408\nU 471 ; WX 872 ; N uni01D7 ; G 409\nU 472 ; WX 727 ; N uni01D8 ; G 410\nU 473 ; WX 872 ; N uni01D9 ; G 411\nU 474 ; WX 727 ; N uni01DA ; G 412\nU 475 ; WX 872 ; N uni01DB ; G 413\nU 476 ; WX 727 ; N uni01DC ; G 414\nU 477 ; WX 636 ; N uni01DD ; G 415\nU 478 ; WX 776 ; N uni01DE ; G 416\nU 479 ; WX 648 ; N uni01DF ; G 417\nU 480 ; WX 776 ; N uni01E0 ; G 418\nU 481 ; WX 648 ; N uni01E1 ; G 419\nU 482 ; WX 1034 ; N uni01E2 ; G 420\nU 483 ; WX 975 ; N uni01E3 ; G 421\nU 484 ; WX 896 ; N uni01E4 ; G 422\nU 485 ; WX 699 ; N uni01E5 ; G 423\nU 486 ; WX 854 ; N Gcaron ; G 424\nU 487 ; WX 699 ; N gcaron ; G 425\nU 488 ; WX 869 ; N uni01E8 ; G 426\nU 489 ; WX 693 ; N uni01E9 ; G 427\nU 490 ; WX 871 ; N uni01EA ; G 428\nU 491 ; WX 667 ; N uni01EB ; G 429\nU 492 ; WX 871 ; N uni01EC ; G 430\nU 493 ; WX 667 ; N uni01ED ; G 431\nU 494 ; WX 657 ; N uni01EE ; G 432\nU 495 ; WX 568 ; N uni01EF ; G 433\nU 496 ; WX 362 ; N uni01F0 ; G 434\nU 497 ; WX 1597 ; N uni01F1 ; G 435\nU 498 ; WX 1435 ; N uni01F2 ; G 436\nU 499 ; WX 1267 ; N uni01F3 ; G 437\nU 500 ; WX 854 ; N uni01F4 ; G 438\nU 501 ; WX 699 ; N uni01F5 ; G 439\nU 502 ; WX 1221 ; N uni01F6 ; G 440\nU 503 ; WX 787 ; N uni01F7 ; G 441\nU 504 ; WX 914 ; N uni01F8 ; G 442\nU 505 ; WX 727 ; N uni01F9 ; G 443\nU 506 ; WX 776 ; N Aringacute ; G 444\nU 507 ; WX 648 ; N aringacute ; G 445\nU 508 ; WX 1034 ; N AEacute ; G 446\nU 509 ; WX 932 ; N aeacute ; G 447\nU 510 ; WX 871 ; N Oslashacute ; G 448\nU 511 ; WX 667 ; N oslashacute ; G 449\nU 512 ; WX 776 ; N uni0200 ; G 450\nU 513 ; WX 648 ; N uni0201 ; G 451\nU 514 ; WX 776 ; N uni0202 ; G 452\nU 515 ; WX 648 ; N uni0203 ; G 453\nU 516 ; WX 762 ; N uni0204 ; G 454\nU 517 ; WX 636 ; N uni0205 ; G 455\nU 518 ; WX 762 ; N uni0206 ; G 456\nU 519 ; WX 636 ; N uni0207 ; G 457\nU 520 ; WX 468 ; N uni0208 ; G 458\nU 521 ; WX 380 ; N uni0209 ; G 459\nU 522 ; WX 468 ; N uni020A ; G 460\nU 523 ; WX 380 ; N uni020B ; G 461\nU 524 ; WX 871 ; N uni020C ; G 462\nU 525 ; WX 667 ; N uni020D ; G 463\nU 526 ; WX 871 ; N uni020E ; G 464\nU 527 ; WX 667 ; N uni020F ; G 465\nU 528 ; WX 831 ; N uni0210 ; G 466\nU 529 ; WX 527 ; N uni0211 ; G 467\nU 530 ; WX 831 ; N uni0212 ; G 468\nU 531 ; WX 527 ; N uni0213 ; G 469\nU 532 ; WX 872 ; N uni0214 ; G 470\nU 533 ; WX 727 ; N uni0215 ; G 471\nU 534 ; WX 872 ; N uni0216 ; G 472\nU 535 ; WX 727 ; N uni0217 ; G 473\nU 536 ; WX 722 ; N Scommaaccent ; G 474\nU 537 ; WX 563 ; N scommaaccent ; G 475\nU 538 ; WX 744 ; N uni021A ; G 476\nU 539 ; WX 462 ; N uni021B ; G 477\nU 540 ; WX 690 ; N uni021C ; G 478\nU 541 ; WX 607 ; N uni021D ; G 479\nU 542 ; WX 945 ; N uni021E ; G 480\nU 543 ; WX 727 ; N uni021F ; G 481\nU 544 ; WX 872 ; N uni0220 ; G 482\nU 545 ; WX 791 ; N uni0221 ; G 483\nU 546 ; WX 703 ; N uni0222 ; G 484\nU 547 ; WX 616 ; N uni0223 ; G 485\nU 548 ; WX 730 ; N uni0224 ; G 486\nU 549 ; WX 568 ; N uni0225 ; G 487\nU 550 ; WX 776 ; N uni0226 ; G 488\nU 551 ; WX 648 ; N uni0227 ; G 489\nU 552 ; WX 762 ; N uni0228 ; G 490\nU 553 ; WX 636 ; N uni0229 ; G 491\nU 554 ; WX 871 ; N uni022A ; G 492\nU 555 ; WX 667 ; N uni022B ; G 493\nU 556 ; WX 871 ; N uni022C ; G 494\nU 557 ; WX 667 ; N uni022D ; G 495\nU 558 ; WX 871 ; N uni022E ; G 496\nU 559 ; WX 667 ; N uni022F ; G 497\nU 560 ; WX 871 ; N uni0230 ; G 498\nU 561 ; WX 667 ; N uni0231 ; G 499\nU 562 ; WX 714 ; N uni0232 ; G 500\nU 563 ; WX 581 ; N uni0233 ; G 501\nU 564 ; WX 573 ; N uni0234 ; G 502\nU 565 ; WX 922 ; N uni0235 ; G 503\nU 566 ; WX 564 ; N uni0236 ; G 504\nU 567 ; WX 362 ; N dotlessj ; G 505\nU 568 ; WX 1031 ; N uni0238 ; G 506\nU 569 ; WX 1031 ; N uni0239 ; G 507\nU 570 ; WX 776 ; N uni023A ; G 508\nU 571 ; WX 796 ; N uni023B ; G 509\nU 572 ; WX 609 ; N uni023C ; G 510\nU 573 ; WX 703 ; N uni023D ; G 511\nU 574 ; WX 744 ; N uni023E ; G 512\nU 575 ; WX 563 ; N uni023F ; G 513\nU 576 ; WX 568 ; N uni0240 ; G 514\nU 577 ; WX 660 ; N uni0241 ; G 515\nU 578 ; WX 547 ; N uni0242 ; G 516\nU 579 ; WX 845 ; N uni0243 ; G 517\nU 580 ; WX 872 ; N uni0244 ; G 518\nU 581 ; WX 776 ; N uni0245 ; G 519\nU 582 ; WX 762 ; N uni0246 ; G 520\nU 583 ; WX 636 ; N uni0247 ; G 521\nU 584 ; WX 473 ; N uni0248 ; G 522\nU 585 ; WX 387 ; N uni0249 ; G 523\nU 586 ; WX 848 ; N uni024A ; G 524\nU 587 ; WX 699 ; N uni024B ; G 525\nU 588 ; WX 831 ; N uni024C ; G 526\nU 589 ; WX 527 ; N uni024D ; G 527\nU 590 ; WX 714 ; N uni024E ; G 528\nU 591 ; WX 581 ; N uni024F ; G 529\nU 592 ; WX 648 ; N uni0250 ; G 530\nU 593 ; WX 770 ; N uni0251 ; G 531\nU 594 ; WX 770 ; N uni0252 ; G 532\nU 595 ; WX 699 ; N uni0253 ; G 533\nU 596 ; WX 609 ; N uni0254 ; G 534\nU 597 ; WX 609 ; N uni0255 ; G 535\nU 598 ; WX 699 ; N uni0256 ; G 536\nU 599 ; WX 730 ; N uni0257 ; G 537\nU 600 ; WX 636 ; N uni0258 ; G 538\nU 601 ; WX 636 ; N uni0259 ; G 539\nU 602 ; WX 907 ; N uni025A ; G 540\nU 603 ; WX 608 ; N uni025B ; G 541\nU 604 ; WX 562 ; N uni025C ; G 542\nU 605 ; WX 907 ; N uni025D ; G 543\nU 606 ; WX 714 ; N uni025E ; G 544\nU 607 ; WX 387 ; N uni025F ; G 545\nU 608 ; WX 699 ; N uni0260 ; G 546\nU 609 ; WX 699 ; N uni0261 ; G 547\nU 610 ; WX 638 ; N uni0262 ; G 548\nU 611 ; WX 601 ; N uni0263 ; G 549\nU 612 ; WX 627 ; N uni0264 ; G 550\nU 613 ; WX 727 ; N uni0265 ; G 551\nU 614 ; WX 727 ; N uni0266 ; G 552\nU 615 ; WX 727 ; N uni0267 ; G 553\nU 616 ; WX 380 ; N uni0268 ; G 554\nU 617 ; WX 380 ; N uni0269 ; G 555\nU 618 ; WX 380 ; N uni026A ; G 556\nU 619 ; WX 409 ; N uni026B ; G 557\nU 620 ; WX 514 ; N uni026C ; G 558\nU 621 ; WX 380 ; N uni026D ; G 559\nU 622 ; WX 795 ; N uni026E ; G 560\nU 623 ; WX 1058 ; N uni026F ; G 561\nU 624 ; WX 1058 ; N uni0270 ; G 562\nU 625 ; WX 1058 ; N uni0271 ; G 563\nU 626 ; WX 727 ; N uni0272 ; G 564\nU 627 ; WX 727 ; N uni0273 ; G 565\nU 628 ; WX 712 ; N uni0274 ; G 566\nU 629 ; WX 667 ; N uni0275 ; G 567\nU 630 ; WX 1061 ; N uni0276 ; G 568\nU 631 ; WX 944 ; N uni0277 ; G 569\nU 632 ; WX 797 ; N uni0278 ; G 570\nU 633 ; WX 571 ; N uni0279 ; G 571\nU 634 ; WX 571 ; N uni027A ; G 572\nU 635 ; WX 571 ; N uni027B ; G 573\nU 636 ; WX 527 ; N uni027C ; G 574\nU 637 ; WX 527 ; N uni027D ; G 575\nU 638 ; WX 452 ; N uni027E ; G 576\nU 639 ; WX 487 ; N uni027F ; G 577\nU 640 ; WX 694 ; N uni0280 ; G 578\nU 641 ; WX 694 ; N uni0281 ; G 579\nU 642 ; WX 563 ; N uni0282 ; G 580\nU 643 ; WX 331 ; N uni0283 ; G 581\nU 644 ; WX 430 ; N uni0284 ; G 582\nU 645 ; WX 540 ; N uni0285 ; G 583\nU 646 ; WX 331 ; N uni0286 ; G 584\nU 647 ; WX 492 ; N uni0287 ; G 585\nU 648 ; WX 462 ; N uni0288 ; G 586\nU 649 ; WX 727 ; N uni0289 ; G 587\nU 650 ; WX 679 ; N uni028A ; G 588\nU 651 ; WX 694 ; N uni028B ; G 589\nU 652 ; WX 581 ; N uni028C ; G 590\nU 653 ; WX 861 ; N uni028D ; G 591\nU 654 ; WX 635 ; N uni028E ; G 592\nU 655 ; WX 727 ; N uni028F ; G 593\nU 656 ; WX 568 ; N uni0290 ; G 594\nU 657 ; WX 568 ; N uni0291 ; G 595\nU 658 ; WX 568 ; N uni0292 ; G 596\nU 659 ; WX 568 ; N uni0293 ; G 597\nU 660 ; WX 551 ; N uni0294 ; G 598\nU 661 ; WX 551 ; N uni0295 ; G 599\nU 662 ; WX 551 ; N uni0296 ; G 600\nU 663 ; WX 545 ; N uni0297 ; G 601\nU 664 ; WX 871 ; N uni0298 ; G 602\nU 665 ; WX 695 ; N uni0299 ; G 603\nU 666 ; WX 714 ; N uni029A ; G 604\nU 667 ; WX 689 ; N uni029B ; G 605\nU 668 ; WX 732 ; N uni029C ; G 606\nU 669 ; WX 384 ; N uni029D ; G 607\nU 670 ; WX 740 ; N uni029E ; G 608\nU 671 ; WX 617 ; N uni029F ; G 609\nU 672 ; WX 699 ; N uni02A0 ; G 610\nU 673 ; WX 551 ; N uni02A1 ; G 611\nU 674 ; WX 551 ; N uni02A2 ; G 612\nU 675 ; WX 1117 ; N uni02A3 ; G 613\nU 676 ; WX 1179 ; N uni02A4 ; G 614\nU 677 ; WX 1117 ; N uni02A5 ; G 615\nU 678 ; WX 938 ; N uni02A6 ; G 616\nU 679 ; WX 715 ; N uni02A7 ; G 617\nU 680 ; WX 946 ; N uni02A8 ; G 618\nU 681 ; WX 1039 ; N uni02A9 ; G 619\nU 682 ; WX 870 ; N uni02AA ; G 620\nU 683 ; WX 795 ; N uni02AB ; G 621\nU 684 ; WX 662 ; N uni02AC ; G 622\nU 685 ; WX 443 ; N uni02AD ; G 623\nU 686 ; WX 613 ; N uni02AE ; G 624\nU 687 ; WX 717 ; N uni02AF ; G 625\nU 688 ; WX 521 ; N uni02B0 ; G 626\nU 689 ; WX 519 ; N uni02B1 ; G 627\nU 690 ; WX 313 ; N uni02B2 ; G 628\nU 691 ; WX 414 ; N uni02B3 ; G 629\nU 692 ; WX 414 ; N uni02B4 ; G 630\nU 693 ; WX 480 ; N uni02B5 ; G 631\nU 694 ; WX 527 ; N uni02B6 ; G 632\nU 695 ; WX 542 ; N uni02B7 ; G 633\nU 696 ; WX 366 ; N uni02B8 ; G 634\nU 697 ; WX 302 ; N uni02B9 ; G 635\nU 698 ; WX 521 ; N uni02BA ; G 636\nU 699 ; WX 348 ; N uni02BB ; G 637\nU 700 ; WX 348 ; N uni02BC ; G 638\nU 701 ; WX 348 ; N uni02BD ; G 639\nU 702 ; WX 366 ; N uni02BE ; G 640\nU 703 ; WX 366 ; N uni02BF ; G 641\nU 704 ; WX 313 ; N uni02C0 ; G 642\nU 705 ; WX 313 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 282 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 282 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 720 ; WX 369 ; N uni02D0 ; G 656\nU 721 ; WX 369 ; N uni02D1 ; G 657\nU 722 ; WX 366 ; N uni02D2 ; G 658\nU 723 ; WX 366 ; N uni02D3 ; G 659\nU 726 ; WX 392 ; N uni02D6 ; G 660\nU 727 ; WX 392 ; N uni02D7 ; G 661\nU 728 ; WX 500 ; N breve ; G 662\nU 729 ; WX 500 ; N dotaccent ; G 663\nU 730 ; WX 500 ; N ring ; G 664\nU 731 ; WX 500 ; N ogonek ; G 665\nU 732 ; WX 500 ; N tilde ; G 666\nU 733 ; WX 500 ; N hungarumlaut ; G 667\nU 734 ; WX 417 ; N uni02DE ; G 668\nU 736 ; WX 378 ; N uni02E0 ; G 669\nU 737 ; WX 292 ; N uni02E1 ; G 670\nU 738 ; WX 395 ; N uni02E2 ; G 671\nU 739 ; WX 375 ; N uni02E3 ; G 672\nU 740 ; WX 313 ; N uni02E4 ; G 673\nU 741 ; WX 500 ; N uni02E5 ; G 674\nU 742 ; WX 500 ; N uni02E6 ; G 675\nU 743 ; WX 500 ; N uni02E7 ; G 676\nU 744 ; WX 500 ; N uni02E8 ; G 677\nU 745 ; WX 500 ; N uni02E9 ; G 678\nU 748 ; WX 500 ; N uni02EC ; G 679\nU 750 ; WX 553 ; N uni02EE ; G 680\nU 751 ; WX 500 ; N uni02EF ; G 681\nU 752 ; WX 500 ; N uni02F0 ; G 682\nU 755 ; WX 500 ; N uni02F3 ; G 683\nU 759 ; WX 500 ; N uni02F7 ; G 684\nU 768 ; WX 0 ; N gravecomb ; G 685\nU 769 ; WX 0 ; N acutecomb ; G 686\nU 770 ; WX 0 ; N uni0302 ; G 687\nU 771 ; WX 0 ; N tildecomb ; G 688\nU 772 ; WX 0 ; N uni0304 ; G 689\nU 773 ; WX 0 ; N uni0305 ; G 690\nU 774 ; WX 0 ; N uni0306 ; G 691\nU 775 ; WX 0 ; N uni0307 ; G 692\nU 776 ; WX 0 ; N uni0308 ; G 693\nU 777 ; WX 0 ; N hookabovecomb ; G 694\nU 778 ; WX 0 ; N uni030A ; G 695\nU 779 ; WX 0 ; N uni030B ; G 696\nU 780 ; WX 0 ; N uni030C ; G 697\nU 781 ; WX 0 ; N uni030D ; G 698\nU 782 ; WX 0 ; N uni030E ; G 699\nU 783 ; WX 0 ; N uni030F ; G 700\nU 784 ; WX 0 ; N uni0310 ; G 701\nU 785 ; WX 0 ; N uni0311 ; G 702\nU 786 ; WX 0 ; N uni0312 ; G 703\nU 787 ; WX 0 ; N uni0313 ; G 704\nU 788 ; WX 0 ; N uni0314 ; G 705\nU 789 ; WX 0 ; N uni0315 ; G 706\nU 790 ; WX 0 ; N uni0316 ; G 707\nU 791 ; WX 0 ; N uni0317 ; G 708\nU 792 ; WX 0 ; N uni0318 ; G 709\nU 793 ; WX 0 ; N uni0319 ; G 710\nU 794 ; WX 0 ; N uni031A ; G 711\nU 795 ; WX 0 ; N uni031B ; G 712\nU 796 ; WX 0 ; N uni031C ; G 713\nU 797 ; WX 0 ; N uni031D ; G 714\nU 798 ; WX 0 ; N uni031E ; G 715\nU 799 ; WX 0 ; N uni031F ; G 716\nU 800 ; WX 0 ; N uni0320 ; G 717\nU 801 ; WX 0 ; N uni0321 ; G 718\nU 802 ; WX 0 ; N uni0322 ; G 719\nU 803 ; WX 0 ; N dotbelowcomb ; G 720\nU 804 ; WX 0 ; N uni0324 ; G 721\nU 805 ; WX 0 ; N uni0325 ; G 722\nU 806 ; WX 0 ; N uni0326 ; G 723\nU 807 ; WX 0 ; N uni0327 ; G 724\nU 808 ; WX 0 ; N uni0328 ; G 725\nU 809 ; WX 0 ; N uni0329 ; G 726\nU 810 ; WX 0 ; N uni032A ; G 727\nU 811 ; WX 0 ; N uni032B ; G 728\nU 812 ; WX 0 ; N uni032C ; G 729\nU 813 ; WX 0 ; N uni032D ; G 730\nU 814 ; WX 0 ; N uni032E ; G 731\nU 815 ; WX 0 ; N uni032F ; G 732\nU 816 ; WX 0 ; N uni0330 ; G 733\nU 817 ; WX 0 ; N uni0331 ; G 734\nU 818 ; WX 0 ; N uni0332 ; G 735\nU 819 ; WX 0 ; N uni0333 ; G 736\nU 820 ; WX 0 ; N uni0334 ; G 737\nU 821 ; WX 0 ; N uni0335 ; G 738\nU 822 ; WX 0 ; N uni0336 ; G 739\nU 823 ; WX 0 ; N uni0337 ; G 740\nU 824 ; WX 0 ; N uni0338 ; G 741\nU 825 ; WX 0 ; N uni0339 ; G 742\nU 826 ; WX 0 ; N uni033A ; G 743\nU 827 ; WX 0 ; N uni033B ; G 744\nU 828 ; WX 0 ; N uni033C ; G 745\nU 829 ; WX 0 ; N uni033D ; G 746\nU 830 ; WX 0 ; N uni033E ; G 747\nU 831 ; WX 0 ; N uni033F ; G 748\nU 835 ; WX 0 ; N uni0343 ; G 749\nU 847 ; WX 0 ; N uni034F ; G 750\nU 856 ; WX 0 ; N uni0358 ; G 751\nU 864 ; WX 0 ; N uni0360 ; G 752\nU 865 ; WX 0 ; N uni0361 ; G 753\nU 880 ; WX 779 ; N uni0370 ; G 754\nU 881 ; WX 576 ; N uni0371 ; G 755\nU 882 ; WX 803 ; N uni0372 ; G 756\nU 883 ; WX 777 ; N uni0373 ; G 757\nU 884 ; WX 302 ; N uni0374 ; G 758\nU 885 ; WX 302 ; N uni0375 ; G 759\nU 886 ; WX 963 ; N uni0376 ; G 760\nU 887 ; WX 737 ; N uni0377 ; G 761\nU 890 ; WX 500 ; N uni037A ; G 762\nU 891 ; WX 609 ; N uni037B ; G 763\nU 892 ; WX 609 ; N uni037C ; G 764\nU 893 ; WX 609 ; N uni037D ; G 765\nU 894 ; WX 369 ; N uni037E ; G 766\nU 895 ; WX 473 ; N uni037F ; G 767\nU 900 ; WX 500 ; N tonos ; G 768\nU 901 ; WX 500 ; N dieresistonos ; G 769\nU 902 ; WX 776 ; N Alphatonos ; G 770\nU 903 ; WX 348 ; N anoteleia ; G 771\nU 904 ; WX 947 ; N Epsilontonos ; G 772\nU 905 ; WX 1136 ; N Etatonos ; G 773\nU 906 ; WX 662 ; N Iotatonos ; G 774\nU 908 ; WX 887 ; N Omicrontonos ; G 775\nU 910 ; WX 953 ; N Upsilontonos ; G 776\nU 911 ; WX 911 ; N Omegatonos ; G 777\nU 912 ; WX 484 ; N iotadieresistonos ; G 778\nU 913 ; WX 776 ; N Alpha ; G 779\nU 914 ; WX 845 ; N Beta ; G 780\nU 915 ; WX 710 ; N Gamma ; G 781\nU 916 ; WX 776 ; N uni0394 ; G 782\nU 917 ; WX 762 ; N Epsilon ; G 783\nU 918 ; WX 730 ; N Zeta ; G 784\nU 919 ; WX 945 ; N Eta ; G 785\nU 920 ; WX 871 ; N Theta ; G 786\nU 921 ; WX 468 ; N Iota ; G 787\nU 922 ; WX 869 ; N Kappa ; G 788\nU 923 ; WX 776 ; N Lambda ; G 789\nU 924 ; WX 1107 ; N Mu ; G 790\nU 925 ; WX 914 ; N Nu ; G 791\nU 926 ; WX 704 ; N Xi ; G 792\nU 927 ; WX 871 ; N Omicron ; G 793\nU 928 ; WX 945 ; N Pi ; G 794\nU 929 ; WX 752 ; N Rho ; G 795\nU 931 ; WX 707 ; N Sigma ; G 796\nU 932 ; WX 744 ; N Tau ; G 797\nU 933 ; WX 714 ; N Upsilon ; G 798\nU 934 ; WX 871 ; N Phi ; G 799\nU 935 ; WX 776 ; N Chi ; G 800\nU 936 ; WX 913 ; N Psi ; G 801\nU 937 ; WX 890 ; N Omega ; G 802\nU 938 ; WX 468 ; N Iotadieresis ; G 803\nU 939 ; WX 714 ; N Upsilondieresis ; G 804\nU 940 ; WX 770 ; N alphatonos ; G 805\nU 941 ; WX 608 ; N epsilontonos ; G 806\nU 942 ; WX 727 ; N etatonos ; G 807\nU 943 ; WX 484 ; N iotatonos ; G 808\nU 944 ; WX 694 ; N upsilondieresistonos ; G 809\nU 945 ; WX 770 ; N alpha ; G 810\nU 946 ; WX 664 ; N beta ; G 811\nU 947 ; WX 660 ; N gamma ; G 812\nU 948 ; WX 667 ; N delta ; G 813\nU 949 ; WX 608 ; N epsilon ; G 814\nU 950 ; WX 592 ; N zeta ; G 815\nU 951 ; WX 727 ; N eta ; G 816\nU 952 ; WX 667 ; N theta ; G 817\nU 953 ; WX 484 ; N iota ; G 818\nU 954 ; WX 750 ; N kappa ; G 819\nU 955 ; WX 701 ; N lambda ; G 820\nU 956 ; WX 732 ; N uni03BC ; G 821\nU 957 ; WX 694 ; N nu ; G 822\nU 958 ; WX 592 ; N xi ; G 823\nU 959 ; WX 667 ; N omicron ; G 824\nU 960 ; WX 732 ; N pi ; G 825\nU 961 ; WX 665 ; N rho ; G 826\nU 962 ; WX 609 ; N sigma1 ; G 827\nU 963 ; WX 737 ; N sigma ; G 828\nU 964 ; WX 673 ; N tau ; G 829\nU 965 ; WX 694 ; N upsilon ; G 830\nU 966 ; WX 905 ; N phi ; G 831\nU 967 ; WX 658 ; N chi ; G 832\nU 968 ; WX 941 ; N psi ; G 833\nU 969 ; WX 952 ; N omega ; G 834\nU 970 ; WX 484 ; N iotadieresis ; G 835\nU 971 ; WX 694 ; N upsilondieresis ; G 836\nU 972 ; WX 667 ; N omicrontonos ; G 837\nU 973 ; WX 694 ; N upsilontonos ; G 838\nU 974 ; WX 952 ; N omegatonos ; G 839\nU 975 ; WX 869 ; N uni03CF ; G 840\nU 976 ; WX 667 ; N uni03D0 ; G 841\nU 977 ; WX 849 ; N theta1 ; G 842\nU 978 ; WX 764 ; N Upsilon1 ; G 843\nU 979 ; WX 969 ; N uni03D3 ; G 844\nU 980 ; WX 764 ; N uni03D4 ; G 845\nU 981 ; WX 941 ; N phi1 ; G 846\nU 982 ; WX 952 ; N omega1 ; G 847\nU 983 ; WX 655 ; N uni03D7 ; G 848\nU 984 ; WX 871 ; N uni03D8 ; G 849\nU 985 ; WX 667 ; N uni03D9 ; G 850\nU 986 ; WX 796 ; N uni03DA ; G 851\nU 987 ; WX 609 ; N uni03DB ; G 852\nU 988 ; WX 710 ; N uni03DC ; G 853\nU 989 ; WX 527 ; N uni03DD ; G 854\nU 990 ; WX 590 ; N uni03DE ; G 855\nU 991 ; WX 660 ; N uni03DF ; G 856\nU 992 ; WX 796 ; N uni03E0 ; G 857\nU 993 ; WX 667 ; N uni03E1 ; G 858\nU 1008 ; WX 655 ; N uni03F0 ; G 859\nU 1009 ; WX 665 ; N uni03F1 ; G 860\nU 1010 ; WX 609 ; N uni03F2 ; G 861\nU 1011 ; WX 362 ; N uni03F3 ; G 862\nU 1012 ; WX 871 ; N uni03F4 ; G 863\nU 1013 ; WX 609 ; N uni03F5 ; G 864\nU 1014 ; WX 609 ; N uni03F6 ; G 865\nU 1015 ; WX 757 ; N uni03F7 ; G 866\nU 1016 ; WX 699 ; N uni03F8 ; G 867\nU 1017 ; WX 796 ; N uni03F9 ; G 868\nU 1018 ; WX 1107 ; N uni03FA ; G 869\nU 1019 ; WX 860 ; N uni03FB ; G 870\nU 1020 ; WX 692 ; N uni03FC ; G 871\nU 1021 ; WX 796 ; N uni03FD ; G 872\nU 1022 ; WX 796 ; N uni03FE ; G 873\nU 1023 ; WX 796 ; N uni03FF ; G 874\nU 1024 ; WX 762 ; N uni0400 ; G 875\nU 1025 ; WX 762 ; N uni0401 ; G 876\nU 1026 ; WX 901 ; N uni0402 ; G 877\nU 1027 ; WX 690 ; N uni0403 ; G 878\nU 1028 ; WX 795 ; N uni0404 ; G 879\nU 1029 ; WX 722 ; N uni0405 ; G 880\nU 1030 ; WX 468 ; N uni0406 ; G 881\nU 1031 ; WX 468 ; N uni0407 ; G 882\nU 1032 ; WX 473 ; N uni0408 ; G 883\nU 1033 ; WX 1202 ; N uni0409 ; G 884\nU 1034 ; WX 1262 ; N uni040A ; G 885\nU 1035 ; WX 963 ; N uni040B ; G 886\nU 1036 ; WX 910 ; N uni040C ; G 887\nU 1037 ; WX 945 ; N uni040D ; G 888\nU 1038 ; WX 812 ; N uni040E ; G 889\nU 1039 ; WX 945 ; N uni040F ; G 890\nU 1040 ; WX 814 ; N uni0410 ; G 891\nU 1041 ; WX 854 ; N uni0411 ; G 892\nU 1042 ; WX 845 ; N uni0412 ; G 893\nU 1043 ; WX 690 ; N uni0413 ; G 894\nU 1044 ; WX 889 ; N uni0414 ; G 895\nU 1045 ; WX 762 ; N uni0415 ; G 896\nU 1046 ; WX 1312 ; N uni0416 ; G 897\nU 1047 ; WX 721 ; N uni0417 ; G 898\nU 1048 ; WX 945 ; N uni0418 ; G 899\nU 1049 ; WX 945 ; N uni0419 ; G 900\nU 1050 ; WX 910 ; N uni041A ; G 901\nU 1051 ; WX 884 ; N uni041B ; G 902\nU 1052 ; WX 1107 ; N uni041C ; G 903\nU 1053 ; WX 945 ; N uni041D ; G 904\nU 1054 ; WX 871 ; N uni041E ; G 905\nU 1055 ; WX 945 ; N uni041F ; G 906\nU 1056 ; WX 752 ; N uni0420 ; G 907\nU 1057 ; WX 796 ; N uni0421 ; G 908\nU 1058 ; WX 744 ; N uni0422 ; G 909\nU 1059 ; WX 812 ; N uni0423 ; G 910\nU 1060 ; WX 949 ; N uni0424 ; G 911\nU 1061 ; WX 776 ; N uni0425 ; G 912\nU 1062 ; WX 966 ; N uni0426 ; G 913\nU 1063 ; WX 913 ; N uni0427 ; G 914\nU 1064 ; WX 1268 ; N uni0428 ; G 915\nU 1065 ; WX 1293 ; N uni0429 ; G 916\nU 1066 ; WX 957 ; N uni042A ; G 917\nU 1067 ; WX 1202 ; N uni042B ; G 918\nU 1068 ; WX 825 ; N uni042C ; G 919\nU 1069 ; WX 795 ; N uni042D ; G 920\nU 1070 ; WX 1287 ; N uni042E ; G 921\nU 1071 ; WX 882 ; N uni042F ; G 922\nU 1072 ; WX 648 ; N uni0430 ; G 923\nU 1073 ; WX 722 ; N uni0431 ; G 924\nU 1074 ; WX 657 ; N uni0432 ; G 925\nU 1075 ; WX 563 ; N uni0433 ; G 926\nU 1076 ; WX 695 ; N uni0434 ; G 927\nU 1077 ; WX 636 ; N uni0435 ; G 928\nU 1078 ; WX 1306 ; N uni0436 ; G 929\nU 1079 ; WX 638 ; N uni0437 ; G 930\nU 1080 ; WX 727 ; N uni0438 ; G 931\nU 1081 ; WX 727 ; N uni0439 ; G 932\nU 1082 ; WX 677 ; N uni043A ; G 933\nU 1083 ; WX 732 ; N uni043B ; G 934\nU 1084 ; WX 951 ; N uni043C ; G 935\nU 1085 ; WX 729 ; N uni043D ; G 936\nU 1086 ; WX 667 ; N uni043E ; G 937\nU 1087 ; WX 727 ; N uni043F ; G 938\nU 1088 ; WX 699 ; N uni0440 ; G 939\nU 1089 ; WX 609 ; N uni0441 ; G 940\nU 1090 ; WX 1058 ; N uni0442 ; G 941\nU 1091 ; WX 598 ; N uni0443 ; G 942\nU 1092 ; WX 902 ; N uni0444 ; G 943\nU 1093 ; WX 596 ; N uni0445 ; G 944\nU 1094 ; WX 803 ; N uni0446 ; G 945\nU 1095 ; WX 715 ; N uni0447 ; G 946\nU 1096 ; WX 1058 ; N uni0448 ; G 947\nU 1097 ; WX 1134 ; N uni0449 ; G 948\nU 1098 ; WX 727 ; N uni044A ; G 949\nU 1099 ; WX 1018 ; N uni044B ; G 950\nU 1100 ; WX 660 ; N uni044C ; G 951\nU 1101 ; WX 645 ; N uni044D ; G 952\nU 1102 ; WX 1001 ; N uni044E ; G 953\nU 1103 ; WX 796 ; N uni044F ; G 954\nU 1104 ; WX 636 ; N uni0450 ; G 955\nU 1105 ; WX 636 ; N uni0451 ; G 956\nU 1106 ; WX 719 ; N uni0452 ; G 957\nU 1107 ; WX 563 ; N uni0453 ; G 958\nU 1108 ; WX 609 ; N uni0454 ; G 959\nU 1109 ; WX 563 ; N uni0455 ; G 960\nU 1110 ; WX 380 ; N uni0456 ; G 961\nU 1111 ; WX 380 ; N uni0457 ; G 962\nU 1112 ; WX 362 ; N uni0458 ; G 963\nU 1113 ; WX 1014 ; N uni0459 ; G 964\nU 1114 ; WX 1011 ; N uni045A ; G 965\nU 1115 ; WX 727 ; N uni045B ; G 966\nU 1116 ; WX 677 ; N uni045C ; G 967\nU 1117 ; WX 727 ; N uni045D ; G 968\nU 1118 ; WX 598 ; N uni045E ; G 969\nU 1119 ; WX 727 ; N uni045F ; G 970\nU 1122 ; WX 880 ; N uni0462 ; G 971\nU 1123 ; WX 1050 ; N uni0463 ; G 972\nU 1124 ; WX 1195 ; N uni0464 ; G 973\nU 1125 ; WX 963 ; N uni0465 ; G 974\nU 1130 ; WX 1312 ; N uni046A ; G 975\nU 1131 ; WX 1010 ; N uni046B ; G 976\nU 1132 ; WX 1630 ; N uni046C ; G 977\nU 1133 ; WX 1247 ; N uni046D ; G 978\nU 1136 ; WX 1096 ; N uni0470 ; G 979\nU 1137 ; WX 1105 ; N uni0471 ; G 980\nU 1138 ; WX 871 ; N uni0472 ; G 981\nU 1139 ; WX 652 ; N uni0473 ; G 982\nU 1140 ; WX 916 ; N uni0474 ; G 983\nU 1141 ; WX 749 ; N uni0475 ; G 984\nU 1142 ; WX 916 ; N uni0476 ; G 985\nU 1143 ; WX 749 ; N uni0477 ; G 986\nU 1164 ; WX 846 ; N uni048C ; G 987\nU 1165 ; WX 673 ; N uni048D ; G 988\nU 1168 ; WX 700 ; N uni0490 ; G 989\nU 1169 ; WX 618 ; N uni0491 ; G 990\nU 1170 ; WX 690 ; N uni0492 ; G 991\nU 1171 ; WX 563 ; N uni0493 ; G 992\nU 1172 ; WX 854 ; N uni0494 ; G 993\nU 1173 ; WX 705 ; N uni0495 ; G 994\nU 1174 ; WX 1312 ; N uni0496 ; G 995\nU 1175 ; WX 1306 ; N uni0497 ; G 996\nU 1176 ; WX 721 ; N uni0498 ; G 997\nU 1177 ; WX 638 ; N uni0499 ; G 998\nU 1178 ; WX 902 ; N uni049A ; G 999\nU 1179 ; WX 703 ; N uni049B ; G 1000\nU 1182 ; WX 910 ; N uni049E ; G 1001\nU 1183 ; WX 677 ; N uni049F ; G 1002\nU 1184 ; WX 1041 ; N uni04A0 ; G 1003\nU 1185 ; WX 760 ; N uni04A1 ; G 1004\nU 1186 ; WX 952 ; N uni04A2 ; G 1005\nU 1187 ; WX 805 ; N uni04A3 ; G 1006\nU 1188 ; WX 1167 ; N uni04A4 ; G 1007\nU 1189 ; WX 955 ; N uni04A5 ; G 1008\nU 1190 ; WX 1324 ; N uni04A6 ; G 1009\nU 1191 ; WX 1013 ; N uni04A7 ; G 1010\nU 1194 ; WX 796 ; N uni04AA ; G 1011\nU 1195 ; WX 609 ; N uni04AB ; G 1012\nU 1196 ; WX 744 ; N uni04AC ; G 1013\nU 1197 ; WX 1142 ; N uni04AD ; G 1014\nU 1198 ; WX 714 ; N uni04AE ; G 1015\nU 1199 ; WX 572 ; N uni04AF ; G 1016\nU 1200 ; WX 713 ; N uni04B0 ; G 1017\nU 1201 ; WX 572 ; N uni04B1 ; G 1018\nU 1202 ; WX 789 ; N uni04B2 ; G 1019\nU 1203 ; WX 596 ; N uni04B3 ; G 1020\nU 1204 ; WX 1010 ; N uni04B4 ; G 1021\nU 1205 ; WX 833 ; N uni04B5 ; G 1022\nU 1206 ; WX 913 ; N uni04B6 ; G 1023\nU 1207 ; WX 792 ; N uni04B7 ; G 1024\nU 1210 ; WX 910 ; N uni04BA ; G 1025\nU 1211 ; WX 727 ; N uni04BB ; G 1026\nU 1216 ; WX 468 ; N uni04C0 ; G 1027\nU 1217 ; WX 1312 ; N uni04C1 ; G 1028\nU 1218 ; WX 1306 ; N uni04C2 ; G 1029\nU 1219 ; WX 869 ; N uni04C3 ; G 1030\nU 1220 ; WX 693 ; N uni04C4 ; G 1031\nU 1223 ; WX 945 ; N uni04C7 ; G 1032\nU 1224 ; WX 732 ; N uni04C8 ; G 1033\nU 1227 ; WX 984 ; N uni04CB ; G 1034\nU 1228 ; WX 732 ; N uni04CC ; G 1035\nU 1231 ; WX 380 ; N uni04CF ; G 1036\nU 1232 ; WX 814 ; N uni04D0 ; G 1037\nU 1233 ; WX 648 ; N uni04D1 ; G 1038\nU 1234 ; WX 814 ; N uni04D2 ; G 1039\nU 1235 ; WX 648 ; N uni04D3 ; G 1040\nU 1236 ; WX 1034 ; N uni04D4 ; G 1041\nU 1237 ; WX 975 ; N uni04D5 ; G 1042\nU 1238 ; WX 762 ; N uni04D6 ; G 1043\nU 1239 ; WX 636 ; N uni04D7 ; G 1044\nU 1240 ; WX 871 ; N uni04D8 ; G 1045\nU 1241 ; WX 636 ; N uni04D9 ; G 1046\nU 1242 ; WX 871 ; N uni04DA ; G 1047\nU 1243 ; WX 636 ; N uni04DB ; G 1048\nU 1244 ; WX 1312 ; N uni04DC ; G 1049\nU 1245 ; WX 1306 ; N uni04DD ; G 1050\nU 1246 ; WX 721 ; N uni04DE ; G 1051\nU 1247 ; WX 638 ; N uni04DF ; G 1052\nU 1248 ; WX 657 ; N uni04E0 ; G 1053\nU 1249 ; WX 568 ; N uni04E1 ; G 1054\nU 1250 ; WX 945 ; N uni04E2 ; G 1055\nU 1251 ; WX 727 ; N uni04E3 ; G 1056\nU 1252 ; WX 945 ; N uni04E4 ; G 1057\nU 1253 ; WX 727 ; N uni04E5 ; G 1058\nU 1254 ; WX 871 ; N uni04E6 ; G 1059\nU 1255 ; WX 667 ; N uni04E7 ; G 1060\nU 1256 ; WX 871 ; N uni04E8 ; G 1061\nU 1257 ; WX 667 ; N uni04E9 ; G 1062\nU 1258 ; WX 871 ; N uni04EA ; G 1063\nU 1259 ; WX 667 ; N uni04EB ; G 1064\nU 1260 ; WX 795 ; N uni04EC ; G 1065\nU 1261 ; WX 645 ; N uni04ED ; G 1066\nU 1262 ; WX 812 ; N uni04EE ; G 1067\nU 1263 ; WX 598 ; N uni04EF ; G 1068\nU 1264 ; WX 812 ; N uni04F0 ; G 1069\nU 1265 ; WX 598 ; N uni04F1 ; G 1070\nU 1266 ; WX 812 ; N uni04F2 ; G 1071\nU 1267 ; WX 598 ; N uni04F3 ; G 1072\nU 1268 ; WX 913 ; N uni04F4 ; G 1073\nU 1269 ; WX 715 ; N uni04F5 ; G 1074\nU 1270 ; WX 690 ; N uni04F6 ; G 1075\nU 1271 ; WX 563 ; N uni04F7 ; G 1076\nU 1272 ; WX 1202 ; N uni04F8 ; G 1077\nU 1273 ; WX 1018 ; N uni04F9 ; G 1078\nU 1296 ; WX 721 ; N uni0510 ; G 1079\nU 1297 ; WX 638 ; N uni0511 ; G 1080\nU 1298 ; WX 884 ; N uni0512 ; G 1081\nU 1299 ; WX 732 ; N uni0513 ; G 1082\nU 1300 ; WX 1248 ; N uni0514 ; G 1083\nU 1301 ; WX 1005 ; N uni0515 ; G 1084\nU 1306 ; WX 820 ; N uni051A ; G 1085\nU 1307 ; WX 640 ; N uni051B ; G 1086\nU 1308 ; WX 1028 ; N uni051C ; G 1087\nU 1309 ; WX 856 ; N uni051D ; G 1088\nU 1329 ; WX 942 ; N uni0531 ; G 1089\nU 1330 ; WX 832 ; N uni0532 ; G 1090\nU 1331 ; WX 894 ; N uni0533 ; G 1091\nU 1332 ; WX 909 ; N uni0534 ; G 1092\nU 1333 ; WX 822 ; N uni0535 ; G 1093\nU 1334 ; WX 821 ; N uni0536 ; G 1094\nU 1335 ; WX 747 ; N uni0537 ; G 1095\nU 1336 ; WX 832 ; N uni0538 ; G 1096\nU 1337 ; WX 1125 ; N uni0539 ; G 1097\nU 1338 ; WX 894 ; N uni053A ; G 1098\nU 1339 ; WX 803 ; N uni053B ; G 1099\nU 1340 ; WX 722 ; N uni053C ; G 1100\nU 1341 ; WX 1188 ; N uni053D ; G 1101\nU 1342 ; WX 887 ; N uni053E ; G 1102\nU 1343 ; WX 842 ; N uni053F ; G 1103\nU 1344 ; WX 737 ; N uni0540 ; G 1104\nU 1345 ; WX 863 ; N uni0541 ; G 1105\nU 1346 ; WX 918 ; N uni0542 ; G 1106\nU 1347 ; WX 851 ; N uni0543 ; G 1107\nU 1348 ; WX 977 ; N uni0544 ; G 1108\nU 1349 ; WX 833 ; N uni0545 ; G 1109\nU 1350 ; WX 914 ; N uni0546 ; G 1110\nU 1351 ; WX 843 ; N uni0547 ; G 1111\nU 1352 ; WX 871 ; N uni0548 ; G 1112\nU 1353 ; WX 818 ; N uni0549 ; G 1113\nU 1354 ; WX 1034 ; N uni054A ; G 1114\nU 1355 ; WX 846 ; N uni054B ; G 1115\nU 1356 ; WX 964 ; N uni054C ; G 1116\nU 1357 ; WX 871 ; N uni054D ; G 1117\nU 1358 ; WX 914 ; N uni054E ; G 1118\nU 1359 ; WX 808 ; N uni054F ; G 1119\nU 1360 ; WX 808 ; N uni0550 ; G 1120\nU 1361 ; WX 836 ; N uni0551 ; G 1121\nU 1362 ; WX 710 ; N uni0552 ; G 1122\nU 1363 ; WX 955 ; N uni0553 ; G 1123\nU 1364 ; WX 891 ; N uni0554 ; G 1124\nU 1365 ; WX 871 ; N uni0555 ; G 1125\nU 1366 ; WX 963 ; N uni0556 ; G 1126\nU 1369 ; WX 307 ; N uni0559 ; G 1127\nU 1370 ; WX 264 ; N uni055A ; G 1128\nU 1371 ; WX 293 ; N uni055B ; G 1129\nU 1372 ; WX 391 ; N uni055C ; G 1130\nU 1373 ; WX 323 ; N uni055D ; G 1131\nU 1374 ; WX 439 ; N uni055E ; G 1132\nU 1375 ; WX 500 ; N uni055F ; G 1133\nU 1377 ; WX 1055 ; N uni0561 ; G 1134\nU 1378 ; WX 695 ; N uni0562 ; G 1135\nU 1379 ; WX 776 ; N uni0563 ; G 1136\nU 1380 ; WX 801 ; N uni0564 ; G 1137\nU 1381 ; WX 729 ; N uni0565 ; G 1138\nU 1382 ; WX 742 ; N uni0566 ; G 1139\nU 1383 ; WX 599 ; N uni0567 ; G 1140\nU 1384 ; WX 733 ; N uni0568 ; G 1141\nU 1385 ; WX 909 ; N uni0569 ; G 1142\nU 1386 ; WX 768 ; N uni056A ; G 1143\nU 1387 ; WX 724 ; N uni056B ; G 1144\nU 1388 ; WX 398 ; N uni056C ; G 1145\nU 1389 ; WX 1087 ; N uni056D ; G 1146\nU 1390 ; WX 695 ; N uni056E ; G 1147\nU 1391 ; WX 719 ; N uni056F ; G 1148\nU 1392 ; WX 737 ; N uni0570 ; G 1149\nU 1393 ; WX 684 ; N uni0571 ; G 1150\nU 1394 ; WX 738 ; N uni0572 ; G 1151\nU 1395 ; WX 703 ; N uni0573 ; G 1152\nU 1396 ; WX 724 ; N uni0574 ; G 1153\nU 1397 ; WX 359 ; N uni0575 ; G 1154\nU 1398 ; WX 719 ; N uni0576 ; G 1155\nU 1399 ; WX 496 ; N uni0577 ; G 1156\nU 1400 ; WX 738 ; N uni0578 ; G 1157\nU 1401 ; WX 428 ; N uni0579 ; G 1158\nU 1402 ; WX 1059 ; N uni057A ; G 1159\nU 1403 ; WX 668 ; N uni057B ; G 1160\nU 1404 ; WX 744 ; N uni057C ; G 1161\nU 1405 ; WX 724 ; N uni057D ; G 1162\nU 1406 ; WX 724 ; N uni057E ; G 1163\nU 1407 ; WX 1040 ; N uni057F ; G 1164\nU 1408 ; WX 724 ; N uni0580 ; G 1165\nU 1409 ; WX 713 ; N uni0581 ; G 1166\nU 1410 ; WX 493 ; N uni0582 ; G 1167\nU 1411 ; WX 1040 ; N uni0583 ; G 1168\nU 1412 ; WX 734 ; N uni0584 ; G 1169\nU 1413 ; WX 693 ; N uni0585 ; G 1170\nU 1414 ; WX 956 ; N uni0586 ; G 1171\nU 1415 ; WX 833 ; N uni0587 ; G 1172\nU 1417 ; WX 340 ; N uni0589 ; G 1173\nU 1418 ; WX 388 ; N uni058A ; G 1174\nU 3647 ; WX 696 ; N uni0E3F ; G 1175\nU 4256 ; WX 765 ; N uni10A0 ; G 1176\nU 4257 ; WX 945 ; N uni10A1 ; G 1177\nU 4258 ; WX 876 ; N uni10A2 ; G 1178\nU 4259 ; WX 884 ; N uni10A3 ; G 1179\nU 4260 ; WX 791 ; N uni10A4 ; G 1180\nU 4261 ; WX 1087 ; N uni10A5 ; G 1181\nU 4262 ; WX 1024 ; N uni10A6 ; G 1182\nU 4263 ; WX 1223 ; N uni10A7 ; G 1183\nU 4264 ; WX 653 ; N uni10A8 ; G 1184\nU 4265 ; WX 828 ; N uni10A9 ; G 1185\nU 4266 ; WX 1061 ; N uni10AA ; G 1186\nU 4267 ; WX 1061 ; N uni10AB ; G 1187\nU 4268 ; WX 806 ; N uni10AC ; G 1188\nU 4269 ; WX 1145 ; N uni10AD ; G 1189\nU 4270 ; WX 979 ; N uni10AE ; G 1190\nU 4271 ; WX 912 ; N uni10AF ; G 1191\nU 4272 ; WX 1119 ; N uni10B0 ; G 1192\nU 4273 ; WX 802 ; N uni10B1 ; G 1193\nU 4274 ; WX 766 ; N uni10B2 ; G 1194\nU 4275 ; WX 1085 ; N uni10B3 ; G 1195\nU 4276 ; WX 986 ; N uni10B4 ; G 1196\nU 4277 ; WX 1076 ; N uni10B5 ; G 1197\nU 4278 ; WX 820 ; N uni10B6 ; G 1198\nU 4279 ; WX 843 ; N uni10B7 ; G 1199\nU 4280 ; WX 831 ; N uni10B8 ; G 1200\nU 4281 ; WX 843 ; N uni10B9 ; G 1201\nU 4282 ; WX 918 ; N uni10BA ; G 1202\nU 4283 ; WX 1086 ; N uni10BB ; G 1203\nU 4284 ; WX 779 ; N uni10BC ; G 1204\nU 4285 ; WX 832 ; N uni10BD ; G 1205\nU 4286 ; WX 822 ; N uni10BE ; G 1206\nU 4287 ; WX 1121 ; N uni10BF ; G 1207\nU 4288 ; WX 1132 ; N uni10C0 ; G 1208\nU 4289 ; WX 812 ; N uni10C1 ; G 1209\nU 4290 ; WX 902 ; N uni10C2 ; G 1210\nU 4291 ; WX 812 ; N uni10C3 ; G 1211\nU 4292 ; WX 890 ; N uni10C4 ; G 1212\nU 4293 ; WX 1073 ; N uni10C5 ; G 1213\nU 4304 ; WX 594 ; N uni10D0 ; G 1214\nU 4305 ; WX 625 ; N uni10D1 ; G 1215\nU 4306 ; WX 643 ; N uni10D2 ; G 1216\nU 4307 ; WX 887 ; N uni10D3 ; G 1217\nU 4308 ; WX 615 ; N uni10D4 ; G 1218\nU 4309 ; WX 611 ; N uni10D5 ; G 1219\nU 4310 ; WX 666 ; N uni10D6 ; G 1220\nU 4311 ; WX 915 ; N uni10D7 ; G 1221\nU 4312 ; WX 613 ; N uni10D8 ; G 1222\nU 4313 ; WX 600 ; N uni10D9 ; G 1223\nU 4314 ; WX 1120 ; N uni10DA ; G 1224\nU 4315 ; WX 654 ; N uni10DB ; G 1225\nU 4316 ; WX 640 ; N uni10DC ; G 1226\nU 4317 ; WX 879 ; N uni10DD ; G 1227\nU 4318 ; WX 624 ; N uni10DE ; G 1228\nU 4319 ; WX 634 ; N uni10DF ; G 1229\nU 4320 ; WX 877 ; N uni10E0 ; G 1230\nU 4321 ; WX 657 ; N uni10E1 ; G 1231\nU 4322 ; WX 802 ; N uni10E2 ; G 1232\nU 4323 ; WX 751 ; N uni10E3 ; G 1233\nU 4324 ; WX 869 ; N uni10E4 ; G 1234\nU 4325 ; WX 639 ; N uni10E5 ; G 1235\nU 4326 ; WX 912 ; N uni10E6 ; G 1236\nU 4327 ; WX 622 ; N uni10E7 ; G 1237\nU 4328 ; WX 647 ; N uni10E8 ; G 1238\nU 4329 ; WX 640 ; N uni10E9 ; G 1239\nU 4330 ; WX 729 ; N uni10EA ; G 1240\nU 4331 ; WX 641 ; N uni10EB ; G 1241\nU 4332 ; WX 639 ; N uni10EC ; G 1242\nU 4333 ; WX 629 ; N uni10ED ; G 1243\nU 4334 ; WX 674 ; N uni10EE ; G 1244\nU 4335 ; WX 737 ; N uni10EF ; G 1245\nU 4336 ; WX 625 ; N uni10F0 ; G 1246\nU 4337 ; WX 657 ; N uni10F1 ; G 1247\nU 4338 ; WX 625 ; N uni10F2 ; G 1248\nU 4339 ; WX 625 ; N uni10F3 ; G 1249\nU 4340 ; WX 624 ; N uni10F4 ; G 1250\nU 4341 ; WX 670 ; N uni10F5 ; G 1251\nU 4342 ; WX 940 ; N uni10F6 ; G 1252\nU 4343 ; WX 680 ; N uni10F7 ; G 1253\nU 4344 ; WX 636 ; N uni10F8 ; G 1254\nU 4345 ; WX 672 ; N uni10F9 ; G 1255\nU 4346 ; WX 625 ; N uni10FA ; G 1256\nU 4347 ; WX 446 ; N uni10FB ; G 1257\nU 4348 ; WX 363 ; N uni10FC ; G 1258\nU 7424 ; WX 641 ; N uni1D00 ; G 1259\nU 7425 ; WX 892 ; N uni1D01 ; G 1260\nU 7426 ; WX 932 ; N uni1D02 ; G 1261\nU 7427 ; WX 695 ; N uni1D03 ; G 1262\nU 7428 ; WX 609 ; N uni1D04 ; G 1263\nU 7429 ; WX 675 ; N uni1D05 ; G 1264\nU 7430 ; WX 675 ; N uni1D06 ; G 1265\nU 7431 ; WX 617 ; N uni1D07 ; G 1266\nU 7432 ; WX 509 ; N uni1D08 ; G 1267\nU 7433 ; WX 320 ; N uni1D09 ; G 1268\nU 7434 ; WX 561 ; N uni1D0A ; G 1269\nU 7435 ; WX 722 ; N uni1D0B ; G 1270\nU 7436 ; WX 617 ; N uni1D0C ; G 1271\nU 7437 ; WX 869 ; N uni1D0D ; G 1272\nU 7438 ; WX 737 ; N uni1D0E ; G 1273\nU 7439 ; WX 667 ; N uni1D0F ; G 1274\nU 7440 ; WX 609 ; N uni1D10 ; G 1275\nU 7441 ; WX 628 ; N uni1D11 ; G 1276\nU 7442 ; WX 628 ; N uni1D12 ; G 1277\nU 7443 ; WX 667 ; N uni1D13 ; G 1278\nU 7444 ; WX 1028 ; N uni1D14 ; G 1279\nU 7445 ; WX 598 ; N uni1D15 ; G 1280\nU 7446 ; WX 667 ; N uni1D16 ; G 1281\nU 7447 ; WX 667 ; N uni1D17 ; G 1282\nU 7448 ; WX 586 ; N uni1D18 ; G 1283\nU 7449 ; WX 801 ; N uni1D19 ; G 1284\nU 7450 ; WX 801 ; N uni1D1A ; G 1285\nU 7451 ; WX 620 ; N uni1D1B ; G 1286\nU 7452 ; WX 647 ; N uni1D1C ; G 1287\nU 7453 ; WX 664 ; N uni1D1D ; G 1288\nU 7454 ; WX 923 ; N uni1D1E ; G 1289\nU 7455 ; WX 655 ; N uni1D1F ; G 1290\nU 7456 ; WX 581 ; N uni1D20 ; G 1291\nU 7457 ; WX 861 ; N uni1D21 ; G 1292\nU 7458 ; WX 568 ; N uni1D22 ; G 1293\nU 7459 ; WX 568 ; N uni1D23 ; G 1294\nU 7460 ; WX 588 ; N uni1D24 ; G 1295\nU 7461 ; WX 802 ; N uni1D25 ; G 1296\nU 7462 ; WX 586 ; N uni1D26 ; G 1297\nU 7463 ; WX 641 ; N uni1D27 ; G 1298\nU 7464 ; WX 732 ; N uni1D28 ; G 1299\nU 7465 ; WX 586 ; N uni1D29 ; G 1300\nU 7466 ; WX 854 ; N uni1D2A ; G 1301\nU 7467 ; WX 705 ; N uni1D2B ; G 1302\nU 7468 ; WX 489 ; N uni1D2C ; G 1303\nU 7469 ; WX 651 ; N uni1D2D ; G 1304\nU 7470 ; WX 532 ; N uni1D2E ; G 1305\nU 7471 ; WX 532 ; N uni1D2F ; G 1306\nU 7472 ; WX 546 ; N uni1D30 ; G 1307\nU 7473 ; WX 480 ; N uni1D31 ; G 1308\nU 7474 ; WX 480 ; N uni1D32 ; G 1309\nU 7475 ; WX 538 ; N uni1D33 ; G 1310\nU 7476 ; WX 595 ; N uni1D34 ; G 1311\nU 7477 ; WX 294 ; N uni1D35 ; G 1312\nU 7478 ; WX 298 ; N uni1D36 ; G 1313\nU 7479 ; WX 547 ; N uni1D37 ; G 1314\nU 7480 ; WX 443 ; N uni1D38 ; G 1315\nU 7481 ; WX 697 ; N uni1D39 ; G 1316\nU 7482 ; WX 576 ; N uni1D3A ; G 1317\nU 7483 ; WX 606 ; N uni1D3B ; G 1318\nU 7484 ; WX 548 ; N uni1D3C ; G 1319\nU 7485 ; WX 442 ; N uni1D3D ; G 1320\nU 7486 ; WX 474 ; N uni1D3E ; G 1321\nU 7487 ; WX 523 ; N uni1D3F ; G 1322\nU 7488 ; WX 469 ; N uni1D40 ; G 1323\nU 7489 ; WX 549 ; N uni1D41 ; G 1324\nU 7490 ; WX 708 ; N uni1D42 ; G 1325\nU 7491 ; WX 408 ; N uni1D43 ; G 1326\nU 7492 ; WX 408 ; N uni1D44 ; G 1327\nU 7493 ; WX 484 ; N uni1D45 ; G 1328\nU 7494 ; WX 587 ; N uni1D46 ; G 1329\nU 7495 ; WX 499 ; N uni1D47 ; G 1330\nU 7496 ; WX 498 ; N uni1D48 ; G 1331\nU 7497 ; WX 444 ; N uni1D49 ; G 1332\nU 7498 ; WX 444 ; N uni1D4A ; G 1333\nU 7499 ; WX 412 ; N uni1D4B ; G 1334\nU 7500 ; WX 412 ; N uni1D4C ; G 1335\nU 7501 ; WX 498 ; N uni1D4D ; G 1336\nU 7502 ; WX 300 ; N uni1D4E ; G 1337\nU 7503 ; WX 523 ; N uni1D4F ; G 1338\nU 7504 ; WX 729 ; N uni1D50 ; G 1339\nU 7505 ; WX 473 ; N uni1D51 ; G 1340\nU 7506 ; WX 467 ; N uni1D52 ; G 1341\nU 7507 ; WX 427 ; N uni1D53 ; G 1342\nU 7508 ; WX 467 ; N uni1D54 ; G 1343\nU 7509 ; WX 467 ; N uni1D55 ; G 1344\nU 7510 ; WX 499 ; N uni1D56 ; G 1345\nU 7511 ; WX 371 ; N uni1D57 ; G 1346\nU 7512 ; WX 520 ; N uni1D58 ; G 1347\nU 7513 ; WX 418 ; N uni1D59 ; G 1348\nU 7514 ; WX 729 ; N uni1D5A ; G 1349\nU 7515 ; WX 491 ; N uni1D5B ; G 1350\nU 7516 ; WX 505 ; N uni1D5C ; G 1351\nU 7517 ; WX 418 ; N uni1D5D ; G 1352\nU 7518 ; WX 416 ; N uni1D5E ; G 1353\nU 7519 ; WX 420 ; N uni1D5F ; G 1354\nU 7520 ; WX 570 ; N uni1D60 ; G 1355\nU 7521 ; WX 414 ; N uni1D61 ; G 1356\nU 7522 ; WX 239 ; N uni1D62 ; G 1357\nU 7523 ; WX 414 ; N uni1D63 ; G 1358\nU 7524 ; WX 520 ; N uni1D64 ; G 1359\nU 7525 ; WX 491 ; N uni1D65 ; G 1360\nU 7526 ; WX 418 ; N uni1D66 ; G 1361\nU 7527 ; WX 416 ; N uni1D67 ; G 1362\nU 7528 ; WX 419 ; N uni1D68 ; G 1363\nU 7529 ; WX 570 ; N uni1D69 ; G 1364\nU 7530 ; WX 414 ; N uni1D6A ; G 1365\nU 7531 ; WX 1042 ; N uni1D6B ; G 1366\nU 7543 ; WX 640 ; N uni1D77 ; G 1367\nU 7544 ; WX 595 ; N uni1D78 ; G 1368\nU 7547 ; WX 380 ; N uni1D7B ; G 1369\nU 7548 ; WX 380 ; N uni1D7C ; G 1370\nU 7549 ; WX 699 ; N uni1D7D ; G 1371\nU 7550 ; WX 647 ; N uni1D7E ; G 1372\nU 7551 ; WX 679 ; N uni1D7F ; G 1373\nU 7557 ; WX 380 ; N uni1D85 ; G 1374\nU 7579 ; WX 484 ; N uni1D9B ; G 1375\nU 7580 ; WX 427 ; N uni1D9C ; G 1376\nU 7581 ; WX 427 ; N uni1D9D ; G 1377\nU 7582 ; WX 467 ; N uni1D9E ; G 1378\nU 7583 ; WX 412 ; N uni1D9F ; G 1379\nU 7584 ; WX 271 ; N uni1DA0 ; G 1380\nU 7585 ; WX 373 ; N uni1DA1 ; G 1381\nU 7586 ; WX 498 ; N uni1DA2 ; G 1382\nU 7587 ; WX 522 ; N uni1DA3 ; G 1383\nU 7588 ; WX 300 ; N uni1DA4 ; G 1384\nU 7589 ; WX 307 ; N uni1DA5 ; G 1385\nU 7590 ; WX 300 ; N uni1DA6 ; G 1386\nU 7591 ; WX 300 ; N uni1DA7 ; G 1387\nU 7592 ; WX 370 ; N uni1DA8 ; G 1388\nU 7593 ; WX 368 ; N uni1DA9 ; G 1389\nU 7594 ; WX 321 ; N uni1DAA ; G 1390\nU 7595 ; WX 430 ; N uni1DAB ; G 1391\nU 7596 ; WX 682 ; N uni1DAC ; G 1392\nU 7597 ; WX 729 ; N uni1DAD ; G 1393\nU 7598 ; WX 588 ; N uni1DAE ; G 1394\nU 7599 ; WX 587 ; N uni1DAF ; G 1395\nU 7600 ; WX 472 ; N uni1DB0 ; G 1396\nU 7601 ; WX 467 ; N uni1DB1 ; G 1397\nU 7602 ; WX 522 ; N uni1DB2 ; G 1398\nU 7603 ; WX 400 ; N uni1DB3 ; G 1399\nU 7604 ; WX 387 ; N uni1DB4 ; G 1400\nU 7605 ; WX 371 ; N uni1DB5 ; G 1401\nU 7606 ; WX 520 ; N uni1DB6 ; G 1402\nU 7607 ; WX 475 ; N uni1DB7 ; G 1403\nU 7608 ; WX 408 ; N uni1DB8 ; G 1404\nU 7609 ; WX 489 ; N uni1DB9 ; G 1405\nU 7610 ; WX 366 ; N uni1DBA ; G 1406\nU 7611 ; WX 357 ; N uni1DBB ; G 1407\nU 7612 ; WX 527 ; N uni1DBC ; G 1408\nU 7613 ; WX 412 ; N uni1DBD ; G 1409\nU 7614 ; WX 452 ; N uni1DBE ; G 1410\nU 7615 ; WX 467 ; N uni1DBF ; G 1411\nU 7620 ; WX 0 ; N uni1DC4 ; G 1412\nU 7621 ; WX 0 ; N uni1DC5 ; G 1413\nU 7622 ; WX 0 ; N uni1DC6 ; G 1414\nU 7623 ; WX 0 ; N uni1DC7 ; G 1415\nU 7624 ; WX 0 ; N uni1DC8 ; G 1416\nU 7625 ; WX 0 ; N uni1DC9 ; G 1417\nU 7680 ; WX 776 ; N uni1E00 ; G 1418\nU 7681 ; WX 648 ; N uni1E01 ; G 1419\nU 7682 ; WX 845 ; N uni1E02 ; G 1420\nU 7683 ; WX 699 ; N uni1E03 ; G 1421\nU 7684 ; WX 845 ; N uni1E04 ; G 1422\nU 7685 ; WX 699 ; N uni1E05 ; G 1423\nU 7686 ; WX 845 ; N uni1E06 ; G 1424\nU 7687 ; WX 699 ; N uni1E07 ; G 1425\nU 7688 ; WX 796 ; N uni1E08 ; G 1426\nU 7689 ; WX 609 ; N uni1E09 ; G 1427\nU 7690 ; WX 867 ; N uni1E0A ; G 1428\nU 7691 ; WX 699 ; N uni1E0B ; G 1429\nU 7692 ; WX 867 ; N uni1E0C ; G 1430\nU 7693 ; WX 699 ; N uni1E0D ; G 1431\nU 7694 ; WX 867 ; N uni1E0E ; G 1432\nU 7695 ; WX 699 ; N uni1E0F ; G 1433\nU 7696 ; WX 867 ; N uni1E10 ; G 1434\nU 7697 ; WX 699 ; N uni1E11 ; G 1435\nU 7698 ; WX 867 ; N uni1E12 ; G 1436\nU 7699 ; WX 699 ; N uni1E13 ; G 1437\nU 7700 ; WX 762 ; N uni1E14 ; G 1438\nU 7701 ; WX 636 ; N uni1E15 ; G 1439\nU 7702 ; WX 762 ; N uni1E16 ; G 1440\nU 7703 ; WX 636 ; N uni1E17 ; G 1441\nU 7704 ; WX 762 ; N uni1E18 ; G 1442\nU 7705 ; WX 636 ; N uni1E19 ; G 1443\nU 7706 ; WX 762 ; N uni1E1A ; G 1444\nU 7707 ; WX 636 ; N uni1E1B ; G 1445\nU 7708 ; WX 762 ; N uni1E1C ; G 1446\nU 7709 ; WX 636 ; N uni1E1D ; G 1447\nU 7710 ; WX 710 ; N uni1E1E ; G 1448\nU 7711 ; WX 430 ; N uni1E1F ; G 1449\nU 7712 ; WX 854 ; N uni1E20 ; G 1450\nU 7713 ; WX 699 ; N uni1E21 ; G 1451\nU 7714 ; WX 945 ; N uni1E22 ; G 1452\nU 7715 ; WX 727 ; N uni1E23 ; G 1453\nU 7716 ; WX 945 ; N uni1E24 ; G 1454\nU 7717 ; WX 727 ; N uni1E25 ; G 1455\nU 7718 ; WX 945 ; N uni1E26 ; G 1456\nU 7719 ; WX 727 ; N uni1E27 ; G 1457\nU 7720 ; WX 945 ; N uni1E28 ; G 1458\nU 7721 ; WX 727 ; N uni1E29 ; G 1459\nU 7722 ; WX 945 ; N uni1E2A ; G 1460\nU 7723 ; WX 727 ; N uni1E2B ; G 1461\nU 7724 ; WX 468 ; N uni1E2C ; G 1462\nU 7725 ; WX 380 ; N uni1E2D ; G 1463\nU 7726 ; WX 468 ; N uni1E2E ; G 1464\nU 7727 ; WX 380 ; N uni1E2F ; G 1465\nU 7728 ; WX 869 ; N uni1E30 ; G 1466\nU 7729 ; WX 693 ; N uni1E31 ; G 1467\nU 7730 ; WX 869 ; N uni1E32 ; G 1468\nU 7731 ; WX 693 ; N uni1E33 ; G 1469\nU 7732 ; WX 869 ; N uni1E34 ; G 1470\nU 7733 ; WX 693 ; N uni1E35 ; G 1471\nU 7734 ; WX 703 ; N uni1E36 ; G 1472\nU 7735 ; WX 380 ; N uni1E37 ; G 1473\nU 7736 ; WX 703 ; N uni1E38 ; G 1474\nU 7737 ; WX 380 ; N uni1E39 ; G 1475\nU 7738 ; WX 703 ; N uni1E3A ; G 1476\nU 7739 ; WX 380 ; N uni1E3B ; G 1477\nU 7740 ; WX 703 ; N uni1E3C ; G 1478\nU 7741 ; WX 380 ; N uni1E3D ; G 1479\nU 7742 ; WX 1107 ; N uni1E3E ; G 1480\nU 7743 ; WX 1058 ; N uni1E3F ; G 1481\nU 7744 ; WX 1107 ; N uni1E40 ; G 1482\nU 7745 ; WX 1058 ; N uni1E41 ; G 1483\nU 7746 ; WX 1107 ; N uni1E42 ; G 1484\nU 7747 ; WX 1058 ; N uni1E43 ; G 1485\nU 7748 ; WX 914 ; N uni1E44 ; G 1486\nU 7749 ; WX 727 ; N uni1E45 ; G 1487\nU 7750 ; WX 914 ; N uni1E46 ; G 1488\nU 7751 ; WX 727 ; N uni1E47 ; G 1489\nU 7752 ; WX 914 ; N uni1E48 ; G 1490\nU 7753 ; WX 727 ; N uni1E49 ; G 1491\nU 7754 ; WX 914 ; N uni1E4A ; G 1492\nU 7755 ; WX 727 ; N uni1E4B ; G 1493\nU 7756 ; WX 871 ; N uni1E4C ; G 1494\nU 7757 ; WX 667 ; N uni1E4D ; G 1495\nU 7758 ; WX 871 ; N uni1E4E ; G 1496\nU 7759 ; WX 667 ; N uni1E4F ; G 1497\nU 7760 ; WX 871 ; N uni1E50 ; G 1498\nU 7761 ; WX 667 ; N uni1E51 ; G 1499\nU 7762 ; WX 871 ; N uni1E52 ; G 1500\nU 7763 ; WX 667 ; N uni1E53 ; G 1501\nU 7764 ; WX 752 ; N uni1E54 ; G 1502\nU 7765 ; WX 699 ; N uni1E55 ; G 1503\nU 7766 ; WX 752 ; N uni1E56 ; G 1504\nU 7767 ; WX 699 ; N uni1E57 ; G 1505\nU 7768 ; WX 831 ; N uni1E58 ; G 1506\nU 7769 ; WX 527 ; N uni1E59 ; G 1507\nU 7770 ; WX 831 ; N uni1E5A ; G 1508\nU 7771 ; WX 527 ; N uni1E5B ; G 1509\nU 7772 ; WX 831 ; N uni1E5C ; G 1510\nU 7773 ; WX 527 ; N uni1E5D ; G 1511\nU 7774 ; WX 831 ; N uni1E5E ; G 1512\nU 7775 ; WX 527 ; N uni1E5F ; G 1513\nU 7776 ; WX 722 ; N uni1E60 ; G 1514\nU 7777 ; WX 563 ; N uni1E61 ; G 1515\nU 7778 ; WX 722 ; N uni1E62 ; G 1516\nU 7779 ; WX 563 ; N uni1E63 ; G 1517\nU 7780 ; WX 722 ; N uni1E64 ; G 1518\nU 7781 ; WX 563 ; N uni1E65 ; G 1519\nU 7782 ; WX 722 ; N uni1E66 ; G 1520\nU 7783 ; WX 563 ; N uni1E67 ; G 1521\nU 7784 ; WX 722 ; N uni1E68 ; G 1522\nU 7785 ; WX 563 ; N uni1E69 ; G 1523\nU 7786 ; WX 744 ; N uni1E6A ; G 1524\nU 7787 ; WX 462 ; N uni1E6B ; G 1525\nU 7788 ; WX 744 ; N uni1E6C ; G 1526\nU 7789 ; WX 462 ; N uni1E6D ; G 1527\nU 7790 ; WX 744 ; N uni1E6E ; G 1528\nU 7791 ; WX 462 ; N uni1E6F ; G 1529\nU 7792 ; WX 744 ; N uni1E70 ; G 1530\nU 7793 ; WX 462 ; N uni1E71 ; G 1531\nU 7794 ; WX 872 ; N uni1E72 ; G 1532\nU 7795 ; WX 727 ; N uni1E73 ; G 1533\nU 7796 ; WX 872 ; N uni1E74 ; G 1534\nU 7797 ; WX 727 ; N uni1E75 ; G 1535\nU 7798 ; WX 872 ; N uni1E76 ; G 1536\nU 7799 ; WX 727 ; N uni1E77 ; G 1537\nU 7800 ; WX 872 ; N uni1E78 ; G 1538\nU 7801 ; WX 727 ; N uni1E79 ; G 1539\nU 7802 ; WX 872 ; N uni1E7A ; G 1540\nU 7803 ; WX 727 ; N uni1E7B ; G 1541\nU 7804 ; WX 776 ; N uni1E7C ; G 1542\nU 7805 ; WX 581 ; N uni1E7D ; G 1543\nU 7806 ; WX 776 ; N uni1E7E ; G 1544\nU 7807 ; WX 581 ; N uni1E7F ; G 1545\nU 7808 ; WX 1123 ; N Wgrave ; G 1546\nU 7809 ; WX 861 ; N wgrave ; G 1547\nU 7810 ; WX 1123 ; N Wacute ; G 1548\nU 7811 ; WX 861 ; N wacute ; G 1549\nU 7812 ; WX 1123 ; N Wdieresis ; G 1550\nU 7813 ; WX 861 ; N wdieresis ; G 1551\nU 7814 ; WX 1123 ; N uni1E86 ; G 1552\nU 7815 ; WX 861 ; N uni1E87 ; G 1553\nU 7816 ; WX 1123 ; N uni1E88 ; G 1554\nU 7817 ; WX 861 ; N uni1E89 ; G 1555\nU 7818 ; WX 776 ; N uni1E8A ; G 1556\nU 7819 ; WX 596 ; N uni1E8B ; G 1557\nU 7820 ; WX 776 ; N uni1E8C ; G 1558\nU 7821 ; WX 596 ; N uni1E8D ; G 1559\nU 7822 ; WX 714 ; N uni1E8E ; G 1560\nU 7823 ; WX 581 ; N uni1E8F ; G 1561\nU 7824 ; WX 730 ; N uni1E90 ; G 1562\nU 7825 ; WX 568 ; N uni1E91 ; G 1563\nU 7826 ; WX 730 ; N uni1E92 ; G 1564\nU 7827 ; WX 568 ; N uni1E93 ; G 1565\nU 7828 ; WX 730 ; N uni1E94 ; G 1566\nU 7829 ; WX 568 ; N uni1E95 ; G 1567\nU 7830 ; WX 727 ; N uni1E96 ; G 1568\nU 7831 ; WX 462 ; N uni1E97 ; G 1569\nU 7832 ; WX 861 ; N uni1E98 ; G 1570\nU 7833 ; WX 581 ; N uni1E99 ; G 1571\nU 7834 ; WX 1014 ; N uni1E9A ; G 1572\nU 7835 ; WX 430 ; N uni1E9B ; G 1573\nU 7836 ; WX 430 ; N uni1E9C ; G 1574\nU 7837 ; WX 430 ; N uni1E9D ; G 1575\nU 7838 ; WX 947 ; N uni1E9E ; G 1576\nU 7839 ; WX 667 ; N uni1E9F ; G 1577\nU 7840 ; WX 776 ; N uni1EA0 ; G 1578\nU 7841 ; WX 648 ; N uni1EA1 ; G 1579\nU 7842 ; WX 776 ; N uni1EA2 ; G 1580\nU 7843 ; WX 648 ; N uni1EA3 ; G 1581\nU 7844 ; WX 776 ; N uni1EA4 ; G 1582\nU 7845 ; WX 648 ; N uni1EA5 ; G 1583\nU 7846 ; WX 776 ; N uni1EA6 ; G 1584\nU 7847 ; WX 648 ; N uni1EA7 ; G 1585\nU 7848 ; WX 776 ; N uni1EA8 ; G 1586\nU 7849 ; WX 648 ; N uni1EA9 ; G 1587\nU 7850 ; WX 776 ; N uni1EAA ; G 1588\nU 7851 ; WX 648 ; N uni1EAB ; G 1589\nU 7852 ; WX 776 ; N uni1EAC ; G 1590\nU 7853 ; WX 648 ; N uni1EAD ; G 1591\nU 7854 ; WX 776 ; N uni1EAE ; G 1592\nU 7855 ; WX 648 ; N uni1EAF ; G 1593\nU 7856 ; WX 776 ; N uni1EB0 ; G 1594\nU 7857 ; WX 648 ; N uni1EB1 ; G 1595\nU 7858 ; WX 776 ; N uni1EB2 ; G 1596\nU 7859 ; WX 648 ; N uni1EB3 ; G 1597\nU 7860 ; WX 776 ; N uni1EB4 ; G 1598\nU 7861 ; WX 648 ; N uni1EB5 ; G 1599\nU 7862 ; WX 776 ; N uni1EB6 ; G 1600\nU 7863 ; WX 648 ; N uni1EB7 ; G 1601\nU 7864 ; WX 762 ; N uni1EB8 ; G 1602\nU 7865 ; WX 636 ; N uni1EB9 ; G 1603\nU 7866 ; WX 762 ; N uni1EBA ; G 1604\nU 7867 ; WX 636 ; N uni1EBB ; G 1605\nU 7868 ; WX 762 ; N uni1EBC ; G 1606\nU 7869 ; WX 636 ; N uni1EBD ; G 1607\nU 7870 ; WX 762 ; N uni1EBE ; G 1608\nU 7871 ; WX 636 ; N uni1EBF ; G 1609\nU 7872 ; WX 762 ; N uni1EC0 ; G 1610\nU 7873 ; WX 636 ; N uni1EC1 ; G 1611\nU 7874 ; WX 762 ; N uni1EC2 ; G 1612\nU 7875 ; WX 636 ; N uni1EC3 ; G 1613\nU 7876 ; WX 762 ; N uni1EC4 ; G 1614\nU 7877 ; WX 636 ; N uni1EC5 ; G 1615\nU 7878 ; WX 762 ; N uni1EC6 ; G 1616\nU 7879 ; WX 636 ; N uni1EC7 ; G 1617\nU 7880 ; WX 468 ; N uni1EC8 ; G 1618\nU 7881 ; WX 380 ; N uni1EC9 ; G 1619\nU 7882 ; WX 468 ; N uni1ECA ; G 1620\nU 7883 ; WX 380 ; N uni1ECB ; G 1621\nU 7884 ; WX 871 ; N uni1ECC ; G 1622\nU 7885 ; WX 667 ; N uni1ECD ; G 1623\nU 7886 ; WX 871 ; N uni1ECE ; G 1624\nU 7887 ; WX 667 ; N uni1ECF ; G 1625\nU 7888 ; WX 871 ; N uni1ED0 ; G 1626\nU 7889 ; WX 667 ; N uni1ED1 ; G 1627\nU 7890 ; WX 871 ; N uni1ED2 ; G 1628\nU 7891 ; WX 667 ; N uni1ED3 ; G 1629\nU 7892 ; WX 871 ; N uni1ED4 ; G 1630\nU 7893 ; WX 667 ; N uni1ED5 ; G 1631\nU 7894 ; WX 871 ; N uni1ED6 ; G 1632\nU 7895 ; WX 667 ; N uni1ED7 ; G 1633\nU 7896 ; WX 871 ; N uni1ED8 ; G 1634\nU 7897 ; WX 667 ; N uni1ED9 ; G 1635\nU 7898 ; WX 871 ; N uni1EDA ; G 1636\nU 7899 ; WX 667 ; N uni1EDB ; G 1637\nU 7900 ; WX 871 ; N uni1EDC ; G 1638\nU 7901 ; WX 667 ; N uni1EDD ; G 1639\nU 7902 ; WX 871 ; N uni1EDE ; G 1640\nU 7903 ; WX 667 ; N uni1EDF ; G 1641\nU 7904 ; WX 871 ; N uni1EE0 ; G 1642\nU 7905 ; WX 667 ; N uni1EE1 ; G 1643\nU 7906 ; WX 871 ; N uni1EE2 ; G 1644\nU 7907 ; WX 667 ; N uni1EE3 ; G 1645\nU 7908 ; WX 872 ; N uni1EE4 ; G 1646\nU 7909 ; WX 727 ; N uni1EE5 ; G 1647\nU 7910 ; WX 872 ; N uni1EE6 ; G 1648\nU 7911 ; WX 727 ; N uni1EE7 ; G 1649\nU 7912 ; WX 872 ; N uni1EE8 ; G 1650\nU 7913 ; WX 727 ; N uni1EE9 ; G 1651\nU 7914 ; WX 872 ; N uni1EEA ; G 1652\nU 7915 ; WX 727 ; N uni1EEB ; G 1653\nU 7916 ; WX 872 ; N uni1EEC ; G 1654\nU 7917 ; WX 727 ; N uni1EED ; G 1655\nU 7918 ; WX 872 ; N uni1EEE ; G 1656\nU 7919 ; WX 727 ; N uni1EEF ; G 1657\nU 7920 ; WX 872 ; N uni1EF0 ; G 1658\nU 7921 ; WX 727 ; N uni1EF1 ; G 1659\nU 7922 ; WX 714 ; N Ygrave ; G 1660\nU 7923 ; WX 581 ; N ygrave ; G 1661\nU 7924 ; WX 714 ; N uni1EF4 ; G 1662\nU 7925 ; WX 581 ; N uni1EF5 ; G 1663\nU 7926 ; WX 714 ; N uni1EF6 ; G 1664\nU 7927 ; WX 581 ; N uni1EF7 ; G 1665\nU 7928 ; WX 714 ; N uni1EF8 ; G 1666\nU 7929 ; WX 581 ; N uni1EF9 ; G 1667\nU 7930 ; WX 1078 ; N uni1EFA ; G 1668\nU 7931 ; WX 701 ; N uni1EFB ; G 1669\nU 7936 ; WX 770 ; N uni1F00 ; G 1670\nU 7937 ; WX 770 ; N uni1F01 ; G 1671\nU 7938 ; WX 770 ; N uni1F02 ; G 1672\nU 7939 ; WX 770 ; N uni1F03 ; G 1673\nU 7940 ; WX 770 ; N uni1F04 ; G 1674\nU 7941 ; WX 770 ; N uni1F05 ; G 1675\nU 7942 ; WX 770 ; N uni1F06 ; G 1676\nU 7943 ; WX 770 ; N uni1F07 ; G 1677\nU 7944 ; WX 776 ; N uni1F08 ; G 1678\nU 7945 ; WX 776 ; N uni1F09 ; G 1679\nU 7946 ; WX 978 ; N uni1F0A ; G 1680\nU 7947 ; WX 978 ; N uni1F0B ; G 1681\nU 7948 ; WX 832 ; N uni1F0C ; G 1682\nU 7949 ; WX 849 ; N uni1F0D ; G 1683\nU 7950 ; WX 776 ; N uni1F0E ; G 1684\nU 7951 ; WX 776 ; N uni1F0F ; G 1685\nU 7952 ; WX 608 ; N uni1F10 ; G 1686\nU 7953 ; WX 608 ; N uni1F11 ; G 1687\nU 7954 ; WX 608 ; N uni1F12 ; G 1688\nU 7955 ; WX 608 ; N uni1F13 ; G 1689\nU 7956 ; WX 608 ; N uni1F14 ; G 1690\nU 7957 ; WX 608 ; N uni1F15 ; G 1691\nU 7960 ; WX 917 ; N uni1F18 ; G 1692\nU 7961 ; WX 909 ; N uni1F19 ; G 1693\nU 7962 ; WX 1169 ; N uni1F1A ; G 1694\nU 7963 ; WX 1169 ; N uni1F1B ; G 1695\nU 7964 ; WX 1093 ; N uni1F1C ; G 1696\nU 7965 ; WX 1120 ; N uni1F1D ; G 1697\nU 7968 ; WX 727 ; N uni1F20 ; G 1698\nU 7969 ; WX 727 ; N uni1F21 ; G 1699\nU 7970 ; WX 727 ; N uni1F22 ; G 1700\nU 7971 ; WX 727 ; N uni1F23 ; G 1701\nU 7972 ; WX 727 ; N uni1F24 ; G 1702\nU 7973 ; WX 727 ; N uni1F25 ; G 1703\nU 7974 ; WX 727 ; N uni1F26 ; G 1704\nU 7975 ; WX 727 ; N uni1F27 ; G 1705\nU 7976 ; WX 1100 ; N uni1F28 ; G 1706\nU 7977 ; WX 1094 ; N uni1F29 ; G 1707\nU 7978 ; WX 1358 ; N uni1F2A ; G 1708\nU 7979 ; WX 1361 ; N uni1F2B ; G 1709\nU 7980 ; WX 1279 ; N uni1F2C ; G 1710\nU 7981 ; WX 1308 ; N uni1F2D ; G 1711\nU 7982 ; WX 1197 ; N uni1F2E ; G 1712\nU 7983 ; WX 1194 ; N uni1F2F ; G 1713\nU 7984 ; WX 484 ; N uni1F30 ; G 1714\nU 7985 ; WX 484 ; N uni1F31 ; G 1715\nU 7986 ; WX 484 ; N uni1F32 ; G 1716\nU 7987 ; WX 484 ; N uni1F33 ; G 1717\nU 7988 ; WX 484 ; N uni1F34 ; G 1718\nU 7989 ; WX 484 ; N uni1F35 ; G 1719\nU 7990 ; WX 484 ; N uni1F36 ; G 1720\nU 7991 ; WX 484 ; N uni1F37 ; G 1721\nU 7992 ; WX 629 ; N uni1F38 ; G 1722\nU 7993 ; WX 617 ; N uni1F39 ; G 1723\nU 7994 ; WX 878 ; N uni1F3A ; G 1724\nU 7995 ; WX 881 ; N uni1F3B ; G 1725\nU 7996 ; WX 799 ; N uni1F3C ; G 1726\nU 7997 ; WX 831 ; N uni1F3D ; G 1727\nU 7998 ; WX 723 ; N uni1F3E ; G 1728\nU 7999 ; WX 714 ; N uni1F3F ; G 1729\nU 8000 ; WX 667 ; N uni1F40 ; G 1730\nU 8001 ; WX 667 ; N uni1F41 ; G 1731\nU 8002 ; WX 667 ; N uni1F42 ; G 1732\nU 8003 ; WX 667 ; N uni1F43 ; G 1733\nU 8004 ; WX 667 ; N uni1F44 ; G 1734\nU 8005 ; WX 667 ; N uni1F45 ; G 1735\nU 8008 ; WX 900 ; N uni1F48 ; G 1736\nU 8009 ; WX 935 ; N uni1F49 ; G 1737\nU 8010 ; WX 1240 ; N uni1F4A ; G 1738\nU 8011 ; WX 1237 ; N uni1F4B ; G 1739\nU 8012 ; WX 1035 ; N uni1F4C ; G 1740\nU 8013 ; WX 1066 ; N uni1F4D ; G 1741\nU 8016 ; WX 694 ; N uni1F50 ; G 1742\nU 8017 ; WX 694 ; N uni1F51 ; G 1743\nU 8018 ; WX 694 ; N uni1F52 ; G 1744\nU 8019 ; WX 694 ; N uni1F53 ; G 1745\nU 8020 ; WX 694 ; N uni1F54 ; G 1746\nU 8021 ; WX 694 ; N uni1F55 ; G 1747\nU 8022 ; WX 694 ; N uni1F56 ; G 1748\nU 8023 ; WX 694 ; N uni1F57 ; G 1749\nU 8025 ; WX 922 ; N uni1F59 ; G 1750\nU 8027 ; WX 1186 ; N uni1F5B ; G 1751\nU 8029 ; WX 1133 ; N uni1F5D ; G 1752\nU 8031 ; WX 1019 ; N uni1F5F ; G 1753\nU 8032 ; WX 952 ; N uni1F60 ; G 1754\nU 8033 ; WX 952 ; N uni1F61 ; G 1755\nU 8034 ; WX 952 ; N uni1F62 ; G 1756\nU 8035 ; WX 952 ; N uni1F63 ; G 1757\nU 8036 ; WX 952 ; N uni1F64 ; G 1758\nU 8037 ; WX 952 ; N uni1F65 ; G 1759\nU 8038 ; WX 952 ; N uni1F66 ; G 1760\nU 8039 ; WX 952 ; N uni1F67 ; G 1761\nU 8040 ; WX 931 ; N uni1F68 ; G 1762\nU 8041 ; WX 963 ; N uni1F69 ; G 1763\nU 8042 ; WX 1268 ; N uni1F6A ; G 1764\nU 8043 ; WX 1274 ; N uni1F6B ; G 1765\nU 8044 ; WX 1054 ; N uni1F6C ; G 1766\nU 8045 ; WX 1088 ; N uni1F6D ; G 1767\nU 8046 ; WX 1023 ; N uni1F6E ; G 1768\nU 8047 ; WX 1060 ; N uni1F6F ; G 1769\nU 8048 ; WX 770 ; N uni1F70 ; G 1770\nU 8049 ; WX 770 ; N uni1F71 ; G 1771\nU 8050 ; WX 608 ; N uni1F72 ; G 1772\nU 8051 ; WX 608 ; N uni1F73 ; G 1773\nU 8052 ; WX 727 ; N uni1F74 ; G 1774\nU 8053 ; WX 727 ; N uni1F75 ; G 1775\nU 8054 ; WX 484 ; N uni1F76 ; G 1776\nU 8055 ; WX 484 ; N uni1F77 ; G 1777\nU 8056 ; WX 667 ; N uni1F78 ; G 1778\nU 8057 ; WX 667 ; N uni1F79 ; G 1779\nU 8058 ; WX 694 ; N uni1F7A ; G 1780\nU 8059 ; WX 694 ; N uni1F7B ; G 1781\nU 8060 ; WX 952 ; N uni1F7C ; G 1782\nU 8061 ; WX 952 ; N uni1F7D ; G 1783\nU 8064 ; WX 770 ; N uni1F80 ; G 1784\nU 8065 ; WX 770 ; N uni1F81 ; G 1785\nU 8066 ; WX 770 ; N uni1F82 ; G 1786\nU 8067 ; WX 770 ; N uni1F83 ; G 1787\nU 8068 ; WX 770 ; N uni1F84 ; G 1788\nU 8069 ; WX 770 ; N uni1F85 ; G 1789\nU 8070 ; WX 770 ; N uni1F86 ; G 1790\nU 8071 ; WX 770 ; N uni1F87 ; G 1791\nU 8072 ; WX 776 ; N uni1F88 ; G 1792\nU 8073 ; WX 776 ; N uni1F89 ; G 1793\nU 8074 ; WX 978 ; N uni1F8A ; G 1794\nU 8075 ; WX 978 ; N uni1F8B ; G 1795\nU 8076 ; WX 832 ; N uni1F8C ; G 1796\nU 8077 ; WX 849 ; N uni1F8D ; G 1797\nU 8078 ; WX 776 ; N uni1F8E ; G 1798\nU 8079 ; WX 776 ; N uni1F8F ; G 1799\nU 8080 ; WX 727 ; N uni1F90 ; G 1800\nU 8081 ; WX 727 ; N uni1F91 ; G 1801\nU 8082 ; WX 727 ; N uni1F92 ; G 1802\nU 8083 ; WX 727 ; N uni1F93 ; G 1803\nU 8084 ; WX 727 ; N uni1F94 ; G 1804\nU 8085 ; WX 727 ; N uni1F95 ; G 1805\nU 8086 ; WX 727 ; N uni1F96 ; G 1806\nU 8087 ; WX 727 ; N uni1F97 ; G 1807\nU 8088 ; WX 1100 ; N uni1F98 ; G 1808\nU 8089 ; WX 1094 ; N uni1F99 ; G 1809\nU 8090 ; WX 1358 ; N uni1F9A ; G 1810\nU 8091 ; WX 1361 ; N uni1F9B ; G 1811\nU 8092 ; WX 1279 ; N uni1F9C ; G 1812\nU 8093 ; WX 1308 ; N uni1F9D ; G 1813\nU 8094 ; WX 1197 ; N uni1F9E ; G 1814\nU 8095 ; WX 1194 ; N uni1F9F ; G 1815\nU 8096 ; WX 952 ; N uni1FA0 ; G 1816\nU 8097 ; WX 952 ; N uni1FA1 ; G 1817\nU 8098 ; WX 952 ; N uni1FA2 ; G 1818\nU 8099 ; WX 952 ; N uni1FA3 ; G 1819\nU 8100 ; WX 952 ; N uni1FA4 ; G 1820\nU 8101 ; WX 952 ; N uni1FA5 ; G 1821\nU 8102 ; WX 952 ; N uni1FA6 ; G 1822\nU 8103 ; WX 952 ; N uni1FA7 ; G 1823\nU 8104 ; WX 931 ; N uni1FA8 ; G 1824\nU 8105 ; WX 963 ; N uni1FA9 ; G 1825\nU 8106 ; WX 1268 ; N uni1FAA ; G 1826\nU 8107 ; WX 1274 ; N uni1FAB ; G 1827\nU 8108 ; WX 1054 ; N uni1FAC ; G 1828\nU 8109 ; WX 1088 ; N uni1FAD ; G 1829\nU 8110 ; WX 1023 ; N uni1FAE ; G 1830\nU 8111 ; WX 1060 ; N uni1FAF ; G 1831\nU 8112 ; WX 770 ; N uni1FB0 ; G 1832\nU 8113 ; WX 770 ; N uni1FB1 ; G 1833\nU 8114 ; WX 770 ; N uni1FB2 ; G 1834\nU 8115 ; WX 770 ; N uni1FB3 ; G 1835\nU 8116 ; WX 770 ; N uni1FB4 ; G 1836\nU 8118 ; WX 770 ; N uni1FB6 ; G 1837\nU 8119 ; WX 770 ; N uni1FB7 ; G 1838\nU 8120 ; WX 776 ; N uni1FB8 ; G 1839\nU 8121 ; WX 776 ; N uni1FB9 ; G 1840\nU 8122 ; WX 811 ; N uni1FBA ; G 1841\nU 8123 ; WX 776 ; N uni1FBB ; G 1842\nU 8124 ; WX 776 ; N uni1FBC ; G 1843\nU 8125 ; WX 500 ; N uni1FBD ; G 1844\nU 8126 ; WX 500 ; N uni1FBE ; G 1845\nU 8127 ; WX 500 ; N uni1FBF ; G 1846\nU 8128 ; WX 500 ; N uni1FC0 ; G 1847\nU 8129 ; WX 500 ; N uni1FC1 ; G 1848\nU 8130 ; WX 727 ; N uni1FC2 ; G 1849\nU 8131 ; WX 727 ; N uni1FC3 ; G 1850\nU 8132 ; WX 727 ; N uni1FC4 ; G 1851\nU 8134 ; WX 727 ; N uni1FC6 ; G 1852\nU 8135 ; WX 727 ; N uni1FC7 ; G 1853\nU 8136 ; WX 1000 ; N uni1FC8 ; G 1854\nU 8137 ; WX 947 ; N uni1FC9 ; G 1855\nU 8138 ; WX 1191 ; N uni1FCA ; G 1856\nU 8139 ; WX 1118 ; N uni1FCB ; G 1857\nU 8140 ; WX 945 ; N uni1FCC ; G 1858\nU 8141 ; WX 500 ; N uni1FCD ; G 1859\nU 8142 ; WX 500 ; N uni1FCE ; G 1860\nU 8143 ; WX 500 ; N uni1FCF ; G 1861\nU 8144 ; WX 484 ; N uni1FD0 ; G 1862\nU 8145 ; WX 484 ; N uni1FD1 ; G 1863\nU 8146 ; WX 484 ; N uni1FD2 ; G 1864\nU 8147 ; WX 484 ; N uni1FD3 ; G 1865\nU 8150 ; WX 484 ; N uni1FD6 ; G 1866\nU 8151 ; WX 484 ; N uni1FD7 ; G 1867\nU 8152 ; WX 468 ; N uni1FD8 ; G 1868\nU 8153 ; WX 468 ; N uni1FD9 ; G 1869\nU 8154 ; WX 714 ; N uni1FDA ; G 1870\nU 8155 ; WX 662 ; N uni1FDB ; G 1871\nU 8157 ; WX 500 ; N uni1FDD ; G 1872\nU 8158 ; WX 500 ; N uni1FDE ; G 1873\nU 8159 ; WX 500 ; N uni1FDF ; G 1874\nU 8160 ; WX 694 ; N uni1FE0 ; G 1875\nU 8161 ; WX 694 ; N uni1FE1 ; G 1876\nU 8162 ; WX 694 ; N uni1FE2 ; G 1877\nU 8163 ; WX 694 ; N uni1FE3 ; G 1878\nU 8164 ; WX 665 ; N uni1FE4 ; G 1879\nU 8165 ; WX 665 ; N uni1FE5 ; G 1880\nU 8166 ; WX 694 ; N uni1FE6 ; G 1881\nU 8167 ; WX 694 ; N uni1FE7 ; G 1882\nU 8168 ; WX 714 ; N uni1FE8 ; G 1883\nU 8169 ; WX 714 ; N uni1FE9 ; G 1884\nU 8170 ; WX 1019 ; N uni1FEA ; G 1885\nU 8171 ; WX 953 ; N uni1FEB ; G 1886\nU 8172 ; WX 910 ; N uni1FEC ; G 1887\nU 8173 ; WX 500 ; N uni1FED ; G 1888\nU 8174 ; WX 500 ; N uni1FEE ; G 1889\nU 8175 ; WX 500 ; N uni1FEF ; G 1890\nU 8178 ; WX 952 ; N uni1FF2 ; G 1891\nU 8179 ; WX 952 ; N uni1FF3 ; G 1892\nU 8180 ; WX 952 ; N uni1FF4 ; G 1893\nU 8182 ; WX 952 ; N uni1FF6 ; G 1894\nU 8183 ; WX 952 ; N uni1FF7 ; G 1895\nU 8184 ; WX 1069 ; N uni1FF8 ; G 1896\nU 8185 ; WX 887 ; N uni1FF9 ; G 1897\nU 8186 ; WX 1101 ; N uni1FFA ; G 1898\nU 8187 ; WX 911 ; N uni1FFB ; G 1899\nU 8188 ; WX 890 ; N uni1FFC ; G 1900\nU 8189 ; WX 500 ; N uni1FFD ; G 1901\nU 8190 ; WX 500 ; N uni1FFE ; G 1902\nU 8192 ; WX 500 ; N uni2000 ; G 1903\nU 8193 ; WX 1000 ; N uni2001 ; G 1904\nU 8194 ; WX 500 ; N uni2002 ; G 1905\nU 8195 ; WX 1000 ; N uni2003 ; G 1906\nU 8196 ; WX 330 ; N uni2004 ; G 1907\nU 8197 ; WX 250 ; N uni2005 ; G 1908\nU 8198 ; WX 167 ; N uni2006 ; G 1909\nU 8199 ; WX 696 ; N uni2007 ; G 1910\nU 8200 ; WX 348 ; N uni2008 ; G 1911\nU 8201 ; WX 200 ; N uni2009 ; G 1912\nU 8202 ; WX 100 ; N uni200A ; G 1913\nU 8203 ; WX 0 ; N uni200B ; G 1914\nU 8204 ; WX 0 ; N uni200C ; G 1915\nU 8205 ; WX 0 ; N uni200D ; G 1916\nU 8206 ; WX 0 ; N uni200E ; G 1917\nU 8207 ; WX 0 ; N uni200F ; G 1918\nU 8208 ; WX 415 ; N uni2010 ; G 1919\nU 8209 ; WX 415 ; N uni2011 ; G 1920\nU 8210 ; WX 696 ; N figuredash ; G 1921\nU 8211 ; WX 500 ; N endash ; G 1922\nU 8212 ; WX 1000 ; N emdash ; G 1923\nU 8213 ; WX 1000 ; N uni2015 ; G 1924\nU 8214 ; WX 500 ; N uni2016 ; G 1925\nU 8215 ; WX 500 ; N underscoredbl ; G 1926\nU 8216 ; WX 348 ; N quoteleft ; G 1927\nU 8217 ; WX 348 ; N quoteright ; G 1928\nU 8218 ; WX 348 ; N quotesinglbase ; G 1929\nU 8219 ; WX 348 ; N quotereversed ; G 1930\nU 8220 ; WX 575 ; N quotedblleft ; G 1931\nU 8221 ; WX 575 ; N quotedblright ; G 1932\nU 8222 ; WX 575 ; N quotedblbase ; G 1933\nU 8223 ; WX 575 ; N uni201F ; G 1934\nU 8224 ; WX 523 ; N dagger ; G 1935\nU 8225 ; WX 523 ; N daggerdbl ; G 1936\nU 8226 ; WX 639 ; N bullet ; G 1937\nU 8227 ; WX 639 ; N uni2023 ; G 1938\nU 8228 ; WX 348 ; N onedotenleader ; G 1939\nU 8229 ; WX 674 ; N twodotenleader ; G 1940\nU 8230 ; WX 1000 ; N ellipsis ; G 1941\nU 8234 ; WX 0 ; N uni202A ; G 1942\nU 8235 ; WX 0 ; N uni202B ; G 1943\nU 8236 ; WX 0 ; N uni202C ; G 1944\nU 8237 ; WX 0 ; N uni202D ; G 1945\nU 8238 ; WX 0 ; N uni202E ; G 1946\nU 8239 ; WX 200 ; N uni202F ; G 1947\nU 8240 ; WX 1385 ; N perthousand ; G 1948\nU 8241 ; WX 1813 ; N uni2031 ; G 1949\nU 8242 ; WX 264 ; N minute ; G 1950\nU 8243 ; WX 447 ; N second ; G 1951\nU 8244 ; WX 630 ; N uni2034 ; G 1952\nU 8245 ; WX 264 ; N uni2035 ; G 1953\nU 8246 ; WX 447 ; N uni2036 ; G 1954\nU 8247 ; WX 630 ; N uni2037 ; G 1955\nU 8248 ; WX 733 ; N uni2038 ; G 1956\nU 8249 ; WX 400 ; N guilsinglleft ; G 1957\nU 8250 ; WX 400 ; N guilsinglright ; G 1958\nU 8252 ; WX 629 ; N exclamdbl ; G 1959\nU 8253 ; WX 586 ; N uni203D ; G 1960\nU 8254 ; WX 500 ; N uni203E ; G 1961\nU 8258 ; WX 1023 ; N uni2042 ; G 1962\nU 8260 ; WX 167 ; N fraction ; G 1963\nU 8261 ; WX 473 ; N uni2045 ; G 1964\nU 8262 ; WX 473 ; N uni2046 ; G 1965\nU 8263 ; WX 1082 ; N uni2047 ; G 1966\nU 8264 ; WX 856 ; N uni2048 ; G 1967\nU 8265 ; WX 856 ; N uni2049 ; G 1968\nU 8267 ; WX 636 ; N uni204B ; G 1969\nU 8268 ; WX 500 ; N uni204C ; G 1970\nU 8269 ; WX 500 ; N uni204D ; G 1971\nU 8270 ; WX 523 ; N uni204E ; G 1972\nU 8271 ; WX 369 ; N uni204F ; G 1973\nU 8273 ; WX 523 ; N uni2051 ; G 1974\nU 8274 ; WX 556 ; N uni2052 ; G 1975\nU 8275 ; WX 1000 ; N uni2053 ; G 1976\nU 8279 ; WX 813 ; N uni2057 ; G 1977\nU 8287 ; WX 222 ; N uni205F ; G 1978\nU 8288 ; WX 0 ; N uni2060 ; G 1979\nU 8289 ; WX 0 ; N uni2061 ; G 1980\nU 8290 ; WX 0 ; N uni2062 ; G 1981\nU 8291 ; WX 0 ; N uni2063 ; G 1982\nU 8292 ; WX 0 ; N uni2064 ; G 1983\nU 8298 ; WX 0 ; N uni206A ; G 1984\nU 8299 ; WX 0 ; N uni206B ; G 1985\nU 8300 ; WX 0 ; N uni206C ; G 1986\nU 8301 ; WX 0 ; N uni206D ; G 1987\nU 8302 ; WX 0 ; N uni206E ; G 1988\nU 8303 ; WX 0 ; N uni206F ; G 1989\nU 8304 ; WX 438 ; N uni2070 ; G 1990\nU 8305 ; WX 239 ; N uni2071 ; G 1991\nU 8308 ; WX 438 ; N uni2074 ; G 1992\nU 8309 ; WX 438 ; N uni2075 ; G 1993\nU 8310 ; WX 438 ; N uni2076 ; G 1994\nU 8311 ; WX 438 ; N uni2077 ; G 1995\nU 8312 ; WX 438 ; N uni2078 ; G 1996\nU 8313 ; WX 438 ; N uni2079 ; G 1997\nU 8314 ; WX 528 ; N uni207A ; G 1998\nU 8315 ; WX 528 ; N uni207B ; G 1999\nU 8316 ; WX 528 ; N uni207C ; G 2000\nU 8317 ; WX 298 ; N uni207D ; G 2001\nU 8318 ; WX 298 ; N uni207E ; G 2002\nU 8319 ; WX 458 ; N uni207F ; G 2003\nU 8320 ; WX 438 ; N uni2080 ; G 2004\nU 8321 ; WX 438 ; N uni2081 ; G 2005\nU 8322 ; WX 438 ; N uni2082 ; G 2006\nU 8323 ; WX 438 ; N uni2083 ; G 2007\nU 8324 ; WX 438 ; N uni2084 ; G 2008\nU 8325 ; WX 438 ; N uni2085 ; G 2009\nU 8326 ; WX 438 ; N uni2086 ; G 2010\nU 8327 ; WX 438 ; N uni2087 ; G 2011\nU 8328 ; WX 438 ; N uni2088 ; G 2012\nU 8329 ; WX 438 ; N uni2089 ; G 2013\nU 8330 ; WX 528 ; N uni208A ; G 2014\nU 8331 ; WX 528 ; N uni208B ; G 2015\nU 8332 ; WX 528 ; N uni208C ; G 2016\nU 8333 ; WX 298 ; N uni208D ; G 2017\nU 8334 ; WX 298 ; N uni208E ; G 2018\nU 8336 ; WX 408 ; N uni2090 ; G 2019\nU 8337 ; WX 444 ; N uni2091 ; G 2020\nU 8338 ; WX 467 ; N uni2092 ; G 2021\nU 8339 ; WX 375 ; N uni2093 ; G 2022\nU 8340 ; WX 444 ; N uni2094 ; G 2023\nU 8341 ; WX 521 ; N uni2095 ; G 2024\nU 8342 ; WX 523 ; N uni2096 ; G 2025\nU 8343 ; WX 292 ; N uni2097 ; G 2026\nU 8344 ; WX 729 ; N uni2098 ; G 2027\nU 8345 ; WX 458 ; N uni2099 ; G 2028\nU 8346 ; WX 499 ; N uni209A ; G 2029\nU 8347 ; WX 395 ; N uni209B ; G 2030\nU 8348 ; WX 371 ; N uni209C ; G 2031\nU 8358 ; WX 696 ; N uni20A6 ; G 2032\nU 8364 ; WX 696 ; N Euro ; G 2033\nU 8367 ; WX 1155 ; N uni20AF ; G 2034\nU 8369 ; WX 790 ; N uni20B1 ; G 2035\nU 8372 ; WX 876 ; N uni20B4 ; G 2036\nU 8373 ; WX 696 ; N uni20B5 ; G 2037\nU 8376 ; WX 696 ; N uni20B8 ; G 2038\nU 8377 ; WX 696 ; N uni20B9 ; G 2039\nU 8378 ; WX 696 ; N uni20BA ; G 2040\nU 8381 ; WX 696 ; N uni20BD ; G 2041\nU 8451 ; WX 1198 ; N uni2103 ; G 2042\nU 8457 ; WX 1112 ; N uni2109 ; G 2043\nU 8462 ; WX 727 ; N uni210E ; G 2044\nU 8463 ; WX 727 ; N uni210F ; G 2045\nU 8470 ; WX 1087 ; N uni2116 ; G 2046\nU 8482 ; WX 1000 ; N trademark ; G 2047\nU 8486 ; WX 890 ; N uni2126 ; G 2048\nU 8487 ; WX 890 ; N uni2127 ; G 2049\nU 8490 ; WX 869 ; N uni212A ; G 2050\nU 8491 ; WX 776 ; N uni212B ; G 2051\nU 8498 ; WX 710 ; N uni2132 ; G 2052\nU 8513 ; WX 786 ; N uni2141 ; G 2053\nU 8514 ; WX 576 ; N uni2142 ; G 2054\nU 8515 ; WX 637 ; N uni2143 ; G 2055\nU 8516 ; WX 760 ; N uni2144 ; G 2056\nU 8523 ; WX 903 ; N uni214B ; G 2057\nU 8526 ; WX 592 ; N uni214E ; G 2058\nU 8528 ; WX 1035 ; N uni2150 ; G 2059\nU 8529 ; WX 1035 ; N uni2151 ; G 2060\nU 8530 ; WX 1473 ; N uni2152 ; G 2061\nU 8531 ; WX 1035 ; N onethird ; G 2062\nU 8532 ; WX 1035 ; N twothirds ; G 2063\nU 8533 ; WX 1035 ; N uni2155 ; G 2064\nU 8534 ; WX 1035 ; N uni2156 ; G 2065\nU 8535 ; WX 1035 ; N uni2157 ; G 2066\nU 8536 ; WX 1035 ; N uni2158 ; G 2067\nU 8537 ; WX 1035 ; N uni2159 ; G 2068\nU 8538 ; WX 1035 ; N uni215A ; G 2069\nU 8539 ; WX 1035 ; N oneeighth ; G 2070\nU 8540 ; WX 1035 ; N threeeighths ; G 2071\nU 8541 ; WX 1035 ; N fiveeighths ; G 2072\nU 8542 ; WX 1035 ; N seveneighths ; G 2073\nU 8543 ; WX 615 ; N uni215F ; G 2074\nU 8544 ; WX 468 ; N uni2160 ; G 2075\nU 8545 ; WX 843 ; N uni2161 ; G 2076\nU 8546 ; WX 1218 ; N uni2162 ; G 2077\nU 8547 ; WX 1135 ; N uni2163 ; G 2078\nU 8548 ; WX 776 ; N uni2164 ; G 2079\nU 8549 ; WX 1150 ; N uni2165 ; G 2080\nU 8550 ; WX 1525 ; N uni2166 ; G 2081\nU 8551 ; WX 1900 ; N uni2167 ; G 2082\nU 8552 ; WX 1126 ; N uni2168 ; G 2083\nU 8553 ; WX 776 ; N uni2169 ; G 2084\nU 8554 ; WX 1127 ; N uni216A ; G 2085\nU 8555 ; WX 1502 ; N uni216B ; G 2086\nU 8556 ; WX 703 ; N uni216C ; G 2087\nU 8557 ; WX 796 ; N uni216D ; G 2088\nU 8558 ; WX 867 ; N uni216E ; G 2089\nU 8559 ; WX 1107 ; N uni216F ; G 2090\nU 8560 ; WX 380 ; N uni2170 ; G 2091\nU 8561 ; WX 760 ; N uni2171 ; G 2092\nU 8562 ; WX 1140 ; N uni2172 ; G 2093\nU 8563 ; WX 961 ; N uni2173 ; G 2094\nU 8564 ; WX 581 ; N uni2174 ; G 2095\nU 8565 ; WX 961 ; N uni2175 ; G 2096\nU 8566 ; WX 1341 ; N uni2176 ; G 2097\nU 8567 ; WX 1721 ; N uni2177 ; G 2098\nU 8568 ; WX 976 ; N uni2178 ; G 2099\nU 8569 ; WX 596 ; N uni2179 ; G 2100\nU 8570 ; WX 976 ; N uni217A ; G 2101\nU 8571 ; WX 1356 ; N uni217B ; G 2102\nU 8572 ; WX 380 ; N uni217C ; G 2103\nU 8573 ; WX 609 ; N uni217D ; G 2104\nU 8574 ; WX 699 ; N uni217E ; G 2105\nU 8575 ; WX 1058 ; N uni217F ; G 2106\nU 8576 ; WX 1255 ; N uni2180 ; G 2107\nU 8577 ; WX 867 ; N uni2181 ; G 2108\nU 8578 ; WX 1268 ; N uni2182 ; G 2109\nU 8579 ; WX 796 ; N uni2183 ; G 2110\nU 8580 ; WX 609 ; N uni2184 ; G 2111\nU 8581 ; WX 796 ; N uni2185 ; G 2112\nU 8585 ; WX 1035 ; N uni2189 ; G 2113\nU 8592 ; WX 838 ; N arrowleft ; G 2114\nU 8593 ; WX 838 ; N arrowup ; G 2115\nU 8594 ; WX 838 ; N arrowright ; G 2116\nU 8595 ; WX 838 ; N arrowdown ; G 2117\nU 8596 ; WX 838 ; N arrowboth ; G 2118\nU 8597 ; WX 838 ; N arrowupdn ; G 2119\nU 8598 ; WX 838 ; N uni2196 ; G 2120\nU 8599 ; WX 838 ; N uni2197 ; G 2121\nU 8600 ; WX 838 ; N uni2198 ; G 2122\nU 8601 ; WX 838 ; N uni2199 ; G 2123\nU 8602 ; WX 838 ; N uni219A ; G 2124\nU 8603 ; WX 838 ; N uni219B ; G 2125\nU 8604 ; WX 838 ; N uni219C ; G 2126\nU 8605 ; WX 838 ; N uni219D ; G 2127\nU 8606 ; WX 838 ; N uni219E ; G 2128\nU 8607 ; WX 838 ; N uni219F ; G 2129\nU 8608 ; WX 838 ; N uni21A0 ; G 2130\nU 8609 ; WX 838 ; N uni21A1 ; G 2131\nU 8610 ; WX 838 ; N uni21A2 ; G 2132\nU 8611 ; WX 838 ; N uni21A3 ; G 2133\nU 8612 ; WX 838 ; N uni21A4 ; G 2134\nU 8613 ; WX 838 ; N uni21A5 ; G 2135\nU 8614 ; WX 838 ; N uni21A6 ; G 2136\nU 8615 ; WX 838 ; N uni21A7 ; G 2137\nU 8616 ; WX 838 ; N arrowupdnbse ; G 2138\nU 8617 ; WX 838 ; N uni21A9 ; G 2139\nU 8618 ; WX 838 ; N uni21AA ; G 2140\nU 8619 ; WX 838 ; N uni21AB ; G 2141\nU 8620 ; WX 838 ; N uni21AC ; G 2142\nU 8621 ; WX 838 ; N uni21AD ; G 2143\nU 8622 ; WX 838 ; N uni21AE ; G 2144\nU 8623 ; WX 850 ; N uni21AF ; G 2145\nU 8624 ; WX 838 ; N uni21B0 ; G 2146\nU 8625 ; WX 838 ; N uni21B1 ; G 2147\nU 8626 ; WX 838 ; N uni21B2 ; G 2148\nU 8627 ; WX 838 ; N uni21B3 ; G 2149\nU 8628 ; WX 838 ; N uni21B4 ; G 2150\nU 8629 ; WX 838 ; N carriagereturn ; G 2151\nU 8630 ; WX 838 ; N uni21B6 ; G 2152\nU 8631 ; WX 838 ; N uni21B7 ; G 2153\nU 8632 ; WX 838 ; N uni21B8 ; G 2154\nU 8633 ; WX 838 ; N uni21B9 ; G 2155\nU 8634 ; WX 838 ; N uni21BA ; G 2156\nU 8635 ; WX 838 ; N uni21BB ; G 2157\nU 8636 ; WX 838 ; N uni21BC ; G 2158\nU 8637 ; WX 838 ; N uni21BD ; G 2159\nU 8638 ; WX 838 ; N uni21BE ; G 2160\nU 8639 ; WX 838 ; N uni21BF ; G 2161\nU 8640 ; WX 838 ; N uni21C0 ; G 2162\nU 8641 ; WX 838 ; N uni21C1 ; G 2163\nU 8642 ; WX 838 ; N uni21C2 ; G 2164\nU 8643 ; WX 838 ; N uni21C3 ; G 2165\nU 8644 ; WX 838 ; N uni21C4 ; G 2166\nU 8645 ; WX 838 ; N uni21C5 ; G 2167\nU 8646 ; WX 838 ; N uni21C6 ; G 2168\nU 8647 ; WX 838 ; N uni21C7 ; G 2169\nU 8648 ; WX 838 ; N uni21C8 ; G 2170\nU 8649 ; WX 838 ; N uni21C9 ; G 2171\nU 8650 ; WX 838 ; N uni21CA ; G 2172\nU 8651 ; WX 838 ; N uni21CB ; G 2173\nU 8652 ; WX 838 ; N uni21CC ; G 2174\nU 8653 ; WX 838 ; N uni21CD ; G 2175\nU 8654 ; WX 838 ; N uni21CE ; G 2176\nU 8655 ; WX 838 ; N uni21CF ; G 2177\nU 8656 ; WX 838 ; N arrowdblleft ; G 2178\nU 8657 ; WX 838 ; N arrowdblup ; G 2179\nU 8658 ; WX 838 ; N arrowdblright ; G 2180\nU 8659 ; WX 838 ; N arrowdbldown ; G 2181\nU 8660 ; WX 838 ; N arrowdblboth ; G 2182\nU 8661 ; WX 838 ; N uni21D5 ; G 2183\nU 8662 ; WX 838 ; N uni21D6 ; G 2184\nU 8663 ; WX 838 ; N uni21D7 ; G 2185\nU 8664 ; WX 838 ; N uni21D8 ; G 2186\nU 8665 ; WX 838 ; N uni21D9 ; G 2187\nU 8666 ; WX 838 ; N uni21DA ; G 2188\nU 8667 ; WX 838 ; N uni21DB ; G 2189\nU 8668 ; WX 838 ; N uni21DC ; G 2190\nU 8669 ; WX 838 ; N uni21DD ; G 2191\nU 8670 ; WX 838 ; N uni21DE ; G 2192\nU 8671 ; WX 838 ; N uni21DF ; G 2193\nU 8672 ; WX 838 ; N uni21E0 ; G 2194\nU 8673 ; WX 838 ; N uni21E1 ; G 2195\nU 8674 ; WX 838 ; N uni21E2 ; G 2196\nU 8675 ; WX 838 ; N uni21E3 ; G 2197\nU 8676 ; WX 838 ; N uni21E4 ; G 2198\nU 8677 ; WX 838 ; N uni21E5 ; G 2199\nU 8678 ; WX 838 ; N uni21E6 ; G 2200\nU 8679 ; WX 838 ; N uni21E7 ; G 2201\nU 8680 ; WX 838 ; N uni21E8 ; G 2202\nU 8681 ; WX 838 ; N uni21E9 ; G 2203\nU 8682 ; WX 838 ; N uni21EA ; G 2204\nU 8683 ; WX 838 ; N uni21EB ; G 2205\nU 8684 ; WX 838 ; N uni21EC ; G 2206\nU 8685 ; WX 838 ; N uni21ED ; G 2207\nU 8686 ; WX 838 ; N uni21EE ; G 2208\nU 8687 ; WX 838 ; N uni21EF ; G 2209\nU 8688 ; WX 838 ; N uni21F0 ; G 2210\nU 8689 ; WX 838 ; N uni21F1 ; G 2211\nU 8690 ; WX 838 ; N uni21F2 ; G 2212\nU 8691 ; WX 838 ; N uni21F3 ; G 2213\nU 8692 ; WX 838 ; N uni21F4 ; G 2214\nU 8693 ; WX 838 ; N uni21F5 ; G 2215\nU 8694 ; WX 838 ; N uni21F6 ; G 2216\nU 8695 ; WX 838 ; N uni21F7 ; G 2217\nU 8696 ; WX 838 ; N uni21F8 ; G 2218\nU 8697 ; WX 838 ; N uni21F9 ; G 2219\nU 8698 ; WX 838 ; N uni21FA ; G 2220\nU 8699 ; WX 838 ; N uni21FB ; G 2221\nU 8700 ; WX 838 ; N uni21FC ; G 2222\nU 8701 ; WX 838 ; N uni21FD ; G 2223\nU 8702 ; WX 838 ; N uni21FE ; G 2224\nU 8703 ; WX 838 ; N uni21FF ; G 2225\nU 8704 ; WX 641 ; N universal ; G 2226\nU 8706 ; WX 534 ; N partialdiff ; G 2227\nU 8707 ; WX 620 ; N existential ; G 2228\nU 8708 ; WX 620 ; N uni2204 ; G 2229\nU 8710 ; WX 753 ; N increment ; G 2230\nU 8711 ; WX 753 ; N gradient ; G 2231\nU 8712 ; WX 740 ; N element ; G 2232\nU 8713 ; WX 740 ; N notelement ; G 2233\nU 8715 ; WX 740 ; N suchthat ; G 2234\nU 8716 ; WX 740 ; N uni220C ; G 2235\nU 8719 ; WX 842 ; N product ; G 2236\nU 8720 ; WX 842 ; N uni2210 ; G 2237\nU 8721 ; WX 753 ; N summation ; G 2238\nU 8722 ; WX 838 ; N minus ; G 2239\nU 8723 ; WX 838 ; N uni2213 ; G 2240\nU 8724 ; WX 838 ; N uni2214 ; G 2241\nU 8725 ; WX 365 ; N uni2215 ; G 2242\nU 8727 ; WX 691 ; N asteriskmath ; G 2243\nU 8728 ; WX 519 ; N uni2218 ; G 2244\nU 8729 ; WX 519 ; N uni2219 ; G 2245\nU 8730 ; WX 657 ; N radical ; G 2246\nU 8731 ; WX 657 ; N uni221B ; G 2247\nU 8732 ; WX 657 ; N uni221C ; G 2248\nU 8733 ; WX 672 ; N proportional ; G 2249\nU 8734 ; WX 833 ; N infinity ; G 2250\nU 8735 ; WX 838 ; N orthogonal ; G 2251\nU 8736 ; WX 838 ; N angle ; G 2252\nU 8739 ; WX 324 ; N uni2223 ; G 2253\nU 8740 ; WX 607 ; N uni2224 ; G 2254\nU 8741 ; WX 529 ; N uni2225 ; G 2255\nU 8742 ; WX 773 ; N uni2226 ; G 2256\nU 8743 ; WX 812 ; N logicaland ; G 2257\nU 8744 ; WX 812 ; N logicalor ; G 2258\nU 8745 ; WX 838 ; N intersection ; G 2259\nU 8746 ; WX 838 ; N union ; G 2260\nU 8747 ; WX 579 ; N integral ; G 2261\nU 8748 ; WX 1000 ; N uni222C ; G 2262\nU 8749 ; WX 1391 ; N uni222D ; G 2263\nU 8760 ; WX 838 ; N uni2238 ; G 2264\nU 8761 ; WX 838 ; N uni2239 ; G 2265\nU 8762 ; WX 838 ; N uni223A ; G 2266\nU 8763 ; WX 838 ; N uni223B ; G 2267\nU 8764 ; WX 838 ; N similar ; G 2268\nU 8765 ; WX 838 ; N uni223D ; G 2269\nU 8770 ; WX 838 ; N uni2242 ; G 2270\nU 8771 ; WX 838 ; N uni2243 ; G 2271\nU 8776 ; WX 838 ; N approxequal ; G 2272\nU 8784 ; WX 838 ; N uni2250 ; G 2273\nU 8785 ; WX 838 ; N uni2251 ; G 2274\nU 8786 ; WX 838 ; N uni2252 ; G 2275\nU 8787 ; WX 838 ; N uni2253 ; G 2276\nU 8788 ; WX 1082 ; N uni2254 ; G 2277\nU 8789 ; WX 1082 ; N uni2255 ; G 2278\nU 8800 ; WX 838 ; N notequal ; G 2279\nU 8801 ; WX 838 ; N equivalence ; G 2280\nU 8804 ; WX 838 ; N lessequal ; G 2281\nU 8805 ; WX 838 ; N greaterequal ; G 2282\nU 8834 ; WX 838 ; N propersubset ; G 2283\nU 8835 ; WX 838 ; N propersuperset ; G 2284\nU 8836 ; WX 838 ; N notsubset ; G 2285\nU 8837 ; WX 838 ; N uni2285 ; G 2286\nU 8838 ; WX 838 ; N reflexsubset ; G 2287\nU 8839 ; WX 838 ; N reflexsuperset ; G 2288\nU 8844 ; WX 838 ; N uni228C ; G 2289\nU 8845 ; WX 838 ; N uni228D ; G 2290\nU 8846 ; WX 838 ; N uni228E ; G 2291\nU 8847 ; WX 838 ; N uni228F ; G 2292\nU 8848 ; WX 838 ; N uni2290 ; G 2293\nU 8849 ; WX 838 ; N uni2291 ; G 2294\nU 8850 ; WX 838 ; N uni2292 ; G 2295\nU 8851 ; WX 838 ; N uni2293 ; G 2296\nU 8852 ; WX 838 ; N uni2294 ; G 2297\nU 8853 ; WX 838 ; N circleplus ; G 2298\nU 8854 ; WX 838 ; N uni2296 ; G 2299\nU 8855 ; WX 838 ; N circlemultiply ; G 2300\nU 8856 ; WX 838 ; N uni2298 ; G 2301\nU 8857 ; WX 838 ; N uni2299 ; G 2302\nU 8858 ; WX 838 ; N uni229A ; G 2303\nU 8859 ; WX 838 ; N uni229B ; G 2304\nU 8860 ; WX 838 ; N uni229C ; G 2305\nU 8861 ; WX 838 ; N uni229D ; G 2306\nU 8862 ; WX 838 ; N uni229E ; G 2307\nU 8863 ; WX 838 ; N uni229F ; G 2308\nU 8864 ; WX 838 ; N uni22A0 ; G 2309\nU 8865 ; WX 838 ; N uni22A1 ; G 2310\nU 8866 ; WX 884 ; N uni22A2 ; G 2311\nU 8867 ; WX 884 ; N uni22A3 ; G 2312\nU 8868 ; WX 960 ; N uni22A4 ; G 2313\nU 8869 ; WX 960 ; N perpendicular ; G 2314\nU 8870 ; WX 616 ; N uni22A6 ; G 2315\nU 8871 ; WX 616 ; N uni22A7 ; G 2316\nU 8872 ; WX 884 ; N uni22A8 ; G 2317\nU 8873 ; WX 884 ; N uni22A9 ; G 2318\nU 8874 ; WX 884 ; N uni22AA ; G 2319\nU 8875 ; WX 1080 ; N uni22AB ; G 2320\nU 8876 ; WX 884 ; N uni22AC ; G 2321\nU 8877 ; WX 884 ; N uni22AD ; G 2322\nU 8878 ; WX 884 ; N uni22AE ; G 2323\nU 8879 ; WX 1080 ; N uni22AF ; G 2324\nU 8900 ; WX 626 ; N uni22C4 ; G 2325\nU 8901 ; WX 398 ; N dotmath ; G 2326\nU 8962 ; WX 834 ; N house ; G 2327\nU 8968 ; WX 473 ; N uni2308 ; G 2328\nU 8969 ; WX 473 ; N uni2309 ; G 2329\nU 8970 ; WX 473 ; N uni230A ; G 2330\nU 8971 ; WX 473 ; N uni230B ; G 2331\nU 8976 ; WX 838 ; N revlogicalnot ; G 2332\nU 8977 ; WX 539 ; N uni2311 ; G 2333\nU 8984 ; WX 928 ; N uni2318 ; G 2334\nU 8985 ; WX 838 ; N uni2319 ; G 2335\nU 8992 ; WX 579 ; N integraltp ; G 2336\nU 8993 ; WX 579 ; N integralbt ; G 2337\nU 8997 ; WX 1000 ; N uni2325 ; G 2338\nU 9000 ; WX 1443 ; N uni2328 ; G 2339\nU 9085 ; WX 1008 ; N uni237D ; G 2340\nU 9115 ; WX 500 ; N uni239B ; G 2341\nU 9116 ; WX 500 ; N uni239C ; G 2342\nU 9117 ; WX 500 ; N uni239D ; G 2343\nU 9118 ; WX 500 ; N uni239E ; G 2344\nU 9119 ; WX 500 ; N uni239F ; G 2345\nU 9120 ; WX 500 ; N uni23A0 ; G 2346\nU 9121 ; WX 500 ; N uni23A1 ; G 2347\nU 9122 ; WX 500 ; N uni23A2 ; G 2348\nU 9123 ; WX 500 ; N uni23A3 ; G 2349\nU 9124 ; WX 500 ; N uni23A4 ; G 2350\nU 9125 ; WX 500 ; N uni23A5 ; G 2351\nU 9126 ; WX 500 ; N uni23A6 ; G 2352\nU 9127 ; WX 750 ; N uni23A7 ; G 2353\nU 9128 ; WX 750 ; N uni23A8 ; G 2354\nU 9129 ; WX 750 ; N uni23A9 ; G 2355\nU 9130 ; WX 750 ; N uni23AA ; G 2356\nU 9131 ; WX 750 ; N uni23AB ; G 2357\nU 9132 ; WX 750 ; N uni23AC ; G 2358\nU 9133 ; WX 750 ; N uni23AD ; G 2359\nU 9134 ; WX 579 ; N uni23AE ; G 2360\nU 9167 ; WX 945 ; N uni23CF ; G 2361\nU 9251 ; WX 834 ; N uni2423 ; G 2362\nU 9472 ; WX 602 ; N SF100000 ; G 2363\nU 9473 ; WX 602 ; N uni2501 ; G 2364\nU 9474 ; WX 602 ; N SF110000 ; G 2365\nU 9475 ; WX 602 ; N uni2503 ; G 2366\nU 9476 ; WX 602 ; N uni2504 ; G 2367\nU 9477 ; WX 602 ; N uni2505 ; G 2368\nU 9478 ; WX 602 ; N uni2506 ; G 2369\nU 9479 ; WX 602 ; N uni2507 ; G 2370\nU 9480 ; WX 602 ; N uni2508 ; G 2371\nU 9481 ; WX 602 ; N uni2509 ; G 2372\nU 9482 ; WX 602 ; N uni250A ; G 2373\nU 9483 ; WX 602 ; N uni250B ; G 2374\nU 9484 ; WX 602 ; N SF010000 ; G 2375\nU 9485 ; WX 602 ; N uni250D ; G 2376\nU 9486 ; WX 602 ; N uni250E ; G 2377\nU 9487 ; WX 602 ; N uni250F ; G 2378\nU 9488 ; WX 602 ; N SF030000 ; G 2379\nU 9489 ; WX 602 ; N uni2511 ; G 2380\nU 9490 ; WX 602 ; N uni2512 ; G 2381\nU 9491 ; WX 602 ; N uni2513 ; G 2382\nU 9492 ; WX 602 ; N SF020000 ; G 2383\nU 9493 ; WX 602 ; N uni2515 ; G 2384\nU 9494 ; WX 602 ; N uni2516 ; G 2385\nU 9495 ; WX 602 ; N uni2517 ; G 2386\nU 9496 ; WX 602 ; N SF040000 ; G 2387\nU 9497 ; WX 602 ; N uni2519 ; G 2388\nU 9498 ; WX 602 ; N uni251A ; G 2389\nU 9499 ; WX 602 ; N uni251B ; G 2390\nU 9500 ; WX 602 ; N SF080000 ; G 2391\nU 9501 ; WX 602 ; N uni251D ; G 2392\nU 9502 ; WX 602 ; N uni251E ; G 2393\nU 9503 ; WX 602 ; N uni251F ; G 2394\nU 9504 ; WX 602 ; N uni2520 ; G 2395\nU 9505 ; WX 602 ; N uni2521 ; G 2396\nU 9506 ; WX 602 ; N uni2522 ; G 2397\nU 9507 ; WX 602 ; N uni2523 ; G 2398\nU 9508 ; WX 602 ; N SF090000 ; G 2399\nU 9509 ; WX 602 ; N uni2525 ; G 2400\nU 9510 ; WX 602 ; N uni2526 ; G 2401\nU 9511 ; WX 602 ; N uni2527 ; G 2402\nU 9512 ; WX 602 ; N uni2528 ; G 2403\nU 9513 ; WX 602 ; N uni2529 ; G 2404\nU 9514 ; WX 602 ; N uni252A ; G 2405\nU 9515 ; WX 602 ; N uni252B ; G 2406\nU 9516 ; WX 602 ; N SF060000 ; G 2407\nU 9517 ; WX 602 ; N uni252D ; G 2408\nU 9518 ; WX 602 ; N uni252E ; G 2409\nU 9519 ; WX 602 ; N uni252F ; G 2410\nU 9520 ; WX 602 ; N uni2530 ; G 2411\nU 9521 ; WX 602 ; N uni2531 ; G 2412\nU 9522 ; WX 602 ; N uni2532 ; G 2413\nU 9523 ; WX 602 ; N uni2533 ; G 2414\nU 9524 ; WX 602 ; N SF070000 ; G 2415\nU 9525 ; WX 602 ; N uni2535 ; G 2416\nU 9526 ; WX 602 ; N uni2536 ; G 2417\nU 9527 ; WX 602 ; N uni2537 ; G 2418\nU 9528 ; WX 602 ; N uni2538 ; G 2419\nU 9529 ; WX 602 ; N uni2539 ; G 2420\nU 9530 ; WX 602 ; N uni253A ; G 2421\nU 9531 ; WX 602 ; N uni253B ; G 2422\nU 9532 ; WX 602 ; N SF050000 ; G 2423\nU 9533 ; WX 602 ; N uni253D ; G 2424\nU 9534 ; WX 602 ; N uni253E ; G 2425\nU 9535 ; WX 602 ; N uni253F ; G 2426\nU 9536 ; WX 602 ; N uni2540 ; G 2427\nU 9537 ; WX 602 ; N uni2541 ; G 2428\nU 9538 ; WX 602 ; N uni2542 ; G 2429\nU 9539 ; WX 602 ; N uni2543 ; G 2430\nU 9540 ; WX 602 ; N uni2544 ; G 2431\nU 9541 ; WX 602 ; N uni2545 ; G 2432\nU 9542 ; WX 602 ; N uni2546 ; G 2433\nU 9543 ; WX 602 ; N uni2547 ; G 2434\nU 9544 ; WX 602 ; N uni2548 ; G 2435\nU 9545 ; WX 602 ; N uni2549 ; G 2436\nU 9546 ; WX 602 ; N uni254A ; G 2437\nU 9547 ; WX 602 ; N uni254B ; G 2438\nU 9548 ; WX 602 ; N uni254C ; G 2439\nU 9549 ; WX 602 ; N uni254D ; G 2440\nU 9550 ; WX 602 ; N uni254E ; G 2441\nU 9551 ; WX 602 ; N uni254F ; G 2442\nU 9552 ; WX 602 ; N SF430000 ; G 2443\nU 9553 ; WX 602 ; N SF240000 ; G 2444\nU 9554 ; WX 602 ; N SF510000 ; G 2445\nU 9555 ; WX 602 ; N SF520000 ; G 2446\nU 9556 ; WX 602 ; N SF390000 ; G 2447\nU 9557 ; WX 602 ; N SF220000 ; G 2448\nU 9558 ; WX 602 ; N SF210000 ; G 2449\nU 9559 ; WX 602 ; N SF250000 ; G 2450\nU 9560 ; WX 602 ; N SF500000 ; G 2451\nU 9561 ; WX 602 ; N SF490000 ; G 2452\nU 9562 ; WX 602 ; N SF380000 ; G 2453\nU 9563 ; WX 602 ; N SF280000 ; G 2454\nU 9564 ; WX 602 ; N SF270000 ; G 2455\nU 9565 ; WX 602 ; N SF260000 ; G 2456\nU 9566 ; WX 602 ; N SF360000 ; G 2457\nU 9567 ; WX 602 ; N SF370000 ; G 2458\nU 9568 ; WX 602 ; N SF420000 ; G 2459\nU 9569 ; WX 602 ; N SF190000 ; G 2460\nU 9570 ; WX 602 ; N SF200000 ; G 2461\nU 9571 ; WX 602 ; N SF230000 ; G 2462\nU 9572 ; WX 602 ; N SF470000 ; G 2463\nU 9573 ; WX 602 ; N SF480000 ; G 2464\nU 9574 ; WX 602 ; N SF410000 ; G 2465\nU 9575 ; WX 602 ; N SF450000 ; G 2466\nU 9576 ; WX 602 ; N SF460000 ; G 2467\nU 9577 ; WX 602 ; N SF400000 ; G 2468\nU 9578 ; WX 602 ; N SF540000 ; G 2469\nU 9579 ; WX 602 ; N SF530000 ; G 2470\nU 9580 ; WX 602 ; N SF440000 ; G 2471\nU 9581 ; WX 602 ; N uni256D ; G 2472\nU 9582 ; WX 602 ; N uni256E ; G 2473\nU 9583 ; WX 602 ; N uni256F ; G 2474\nU 9584 ; WX 602 ; N uni2570 ; G 2475\nU 9585 ; WX 602 ; N uni2571 ; G 2476\nU 9586 ; WX 602 ; N uni2572 ; G 2477\nU 9587 ; WX 602 ; N uni2573 ; G 2478\nU 9588 ; WX 602 ; N uni2574 ; G 2479\nU 9589 ; WX 602 ; N uni2575 ; G 2480\nU 9590 ; WX 602 ; N uni2576 ; G 2481\nU 9591 ; WX 602 ; N uni2577 ; G 2482\nU 9592 ; WX 602 ; N uni2578 ; G 2483\nU 9593 ; WX 602 ; N uni2579 ; G 2484\nU 9594 ; WX 602 ; N uni257A ; G 2485\nU 9595 ; WX 602 ; N uni257B ; G 2486\nU 9596 ; WX 602 ; N uni257C ; G 2487\nU 9597 ; WX 602 ; N uni257D ; G 2488\nU 9598 ; WX 602 ; N uni257E ; G 2489\nU 9599 ; WX 602 ; N uni257F ; G 2490\nU 9600 ; WX 769 ; N upblock ; G 2491\nU 9601 ; WX 769 ; N uni2581 ; G 2492\nU 9602 ; WX 769 ; N uni2582 ; G 2493\nU 9603 ; WX 769 ; N uni2583 ; G 2494\nU 9604 ; WX 769 ; N dnblock ; G 2495\nU 9605 ; WX 769 ; N uni2585 ; G 2496\nU 9606 ; WX 769 ; N uni2586 ; G 2497\nU 9607 ; WX 769 ; N uni2587 ; G 2498\nU 9608 ; WX 769 ; N block ; G 2499\nU 9609 ; WX 769 ; N uni2589 ; G 2500\nU 9610 ; WX 769 ; N uni258A ; G 2501\nU 9611 ; WX 769 ; N uni258B ; G 2502\nU 9612 ; WX 769 ; N lfblock ; G 2503\nU 9613 ; WX 769 ; N uni258D ; G 2504\nU 9614 ; WX 769 ; N uni258E ; G 2505\nU 9615 ; WX 769 ; N uni258F ; G 2506\nU 9616 ; WX 769 ; N rtblock ; G 2507\nU 9617 ; WX 769 ; N ltshade ; G 2508\nU 9618 ; WX 769 ; N shade ; G 2509\nU 9619 ; WX 769 ; N dkshade ; G 2510\nU 9620 ; WX 769 ; N uni2594 ; G 2511\nU 9621 ; WX 769 ; N uni2595 ; G 2512\nU 9622 ; WX 769 ; N uni2596 ; G 2513\nU 9623 ; WX 769 ; N uni2597 ; G 2514\nU 9624 ; WX 769 ; N uni2598 ; G 2515\nU 9625 ; WX 769 ; N uni2599 ; G 2516\nU 9626 ; WX 769 ; N uni259A ; G 2517\nU 9627 ; WX 769 ; N uni259B ; G 2518\nU 9628 ; WX 769 ; N uni259C ; G 2519\nU 9629 ; WX 769 ; N uni259D ; G 2520\nU 9630 ; WX 769 ; N uni259E ; G 2521\nU 9631 ; WX 769 ; N uni259F ; G 2522\nU 9632 ; WX 945 ; N filledbox ; G 2523\nU 9633 ; WX 945 ; N H22073 ; G 2524\nU 9634 ; WX 945 ; N uni25A2 ; G 2525\nU 9635 ; WX 945 ; N uni25A3 ; G 2526\nU 9636 ; WX 945 ; N uni25A4 ; G 2527\nU 9637 ; WX 945 ; N uni25A5 ; G 2528\nU 9638 ; WX 945 ; N uni25A6 ; G 2529\nU 9639 ; WX 945 ; N uni25A7 ; G 2530\nU 9640 ; WX 945 ; N uni25A8 ; G 2531\nU 9641 ; WX 945 ; N uni25A9 ; G 2532\nU 9642 ; WX 678 ; N H18543 ; G 2533\nU 9643 ; WX 678 ; N H18551 ; G 2534\nU 9644 ; WX 945 ; N filledrect ; G 2535\nU 9645 ; WX 945 ; N uni25AD ; G 2536\nU 9646 ; WX 550 ; N uni25AE ; G 2537\nU 9647 ; WX 550 ; N uni25AF ; G 2538\nU 9648 ; WX 769 ; N uni25B0 ; G 2539\nU 9649 ; WX 769 ; N uni25B1 ; G 2540\nU 9650 ; WX 769 ; N triagup ; G 2541\nU 9651 ; WX 769 ; N uni25B3 ; G 2542\nU 9652 ; WX 502 ; N uni25B4 ; G 2543\nU 9653 ; WX 502 ; N uni25B5 ; G 2544\nU 9654 ; WX 769 ; N uni25B6 ; G 2545\nU 9655 ; WX 769 ; N uni25B7 ; G 2546\nU 9656 ; WX 502 ; N uni25B8 ; G 2547\nU 9657 ; WX 502 ; N uni25B9 ; G 2548\nU 9658 ; WX 769 ; N triagrt ; G 2549\nU 9659 ; WX 769 ; N uni25BB ; G 2550\nU 9660 ; WX 769 ; N triagdn ; G 2551\nU 9661 ; WX 769 ; N uni25BD ; G 2552\nU 9662 ; WX 502 ; N uni25BE ; G 2553\nU 9663 ; WX 502 ; N uni25BF ; G 2554\nU 9664 ; WX 769 ; N uni25C0 ; G 2555\nU 9665 ; WX 769 ; N uni25C1 ; G 2556\nU 9666 ; WX 502 ; N uni25C2 ; G 2557\nU 9667 ; WX 502 ; N uni25C3 ; G 2558\nU 9668 ; WX 769 ; N triaglf ; G 2559\nU 9669 ; WX 769 ; N uni25C5 ; G 2560\nU 9670 ; WX 769 ; N uni25C6 ; G 2561\nU 9671 ; WX 769 ; N uni25C7 ; G 2562\nU 9672 ; WX 769 ; N uni25C8 ; G 2563\nU 9673 ; WX 873 ; N uni25C9 ; G 2564\nU 9674 ; WX 494 ; N lozenge ; G 2565\nU 9675 ; WX 873 ; N circle ; G 2566\nU 9676 ; WX 873 ; N uni25CC ; G 2567\nU 9677 ; WX 873 ; N uni25CD ; G 2568\nU 9678 ; WX 873 ; N uni25CE ; G 2569\nU 9679 ; WX 873 ; N H18533 ; G 2570\nU 9680 ; WX 873 ; N uni25D0 ; G 2571\nU 9681 ; WX 873 ; N uni25D1 ; G 2572\nU 9682 ; WX 873 ; N uni25D2 ; G 2573\nU 9683 ; WX 873 ; N uni25D3 ; G 2574\nU 9684 ; WX 873 ; N uni25D4 ; G 2575\nU 9685 ; WX 873 ; N uni25D5 ; G 2576\nU 9686 ; WX 527 ; N uni25D6 ; G 2577\nU 9687 ; WX 527 ; N uni25D7 ; G 2578\nU 9688 ; WX 791 ; N invbullet ; G 2579\nU 9689 ; WX 970 ; N invcircle ; G 2580\nU 9690 ; WX 970 ; N uni25DA ; G 2581\nU 9691 ; WX 970 ; N uni25DB ; G 2582\nU 9692 ; WX 387 ; N uni25DC ; G 2583\nU 9693 ; WX 387 ; N uni25DD ; G 2584\nU 9694 ; WX 387 ; N uni25DE ; G 2585\nU 9695 ; WX 387 ; N uni25DF ; G 2586\nU 9696 ; WX 873 ; N uni25E0 ; G 2587\nU 9697 ; WX 873 ; N uni25E1 ; G 2588\nU 9698 ; WX 769 ; N uni25E2 ; G 2589\nU 9699 ; WX 769 ; N uni25E3 ; G 2590\nU 9700 ; WX 769 ; N uni25E4 ; G 2591\nU 9701 ; WX 769 ; N uni25E5 ; G 2592\nU 9702 ; WX 590 ; N openbullet ; G 2593\nU 9703 ; WX 945 ; N uni25E7 ; G 2594\nU 9704 ; WX 945 ; N uni25E8 ; G 2595\nU 9705 ; WX 945 ; N uni25E9 ; G 2596\nU 9706 ; WX 945 ; N uni25EA ; G 2597\nU 9707 ; WX 945 ; N uni25EB ; G 2598\nU 9708 ; WX 769 ; N uni25EC ; G 2599\nU 9709 ; WX 769 ; N uni25ED ; G 2600\nU 9710 ; WX 769 ; N uni25EE ; G 2601\nU 9711 ; WX 1119 ; N uni25EF ; G 2602\nU 9712 ; WX 945 ; N uni25F0 ; G 2603\nU 9713 ; WX 945 ; N uni25F1 ; G 2604\nU 9714 ; WX 945 ; N uni25F2 ; G 2605\nU 9715 ; WX 945 ; N uni25F3 ; G 2606\nU 9716 ; WX 873 ; N uni25F4 ; G 2607\nU 9717 ; WX 873 ; N uni25F5 ; G 2608\nU 9718 ; WX 873 ; N uni25F6 ; G 2609\nU 9719 ; WX 873 ; N uni25F7 ; G 2610\nU 9720 ; WX 769 ; N uni25F8 ; G 2611\nU 9721 ; WX 769 ; N uni25F9 ; G 2612\nU 9722 ; WX 769 ; N uni25FA ; G 2613\nU 9723 ; WX 830 ; N uni25FB ; G 2614\nU 9724 ; WX 830 ; N uni25FC ; G 2615\nU 9725 ; WX 732 ; N uni25FD ; G 2616\nU 9726 ; WX 732 ; N uni25FE ; G 2617\nU 9727 ; WX 769 ; N uni25FF ; G 2618\nU 9728 ; WX 896 ; N uni2600 ; G 2619\nU 9784 ; WX 896 ; N uni2638 ; G 2620\nU 9785 ; WX 896 ; N uni2639 ; G 2621\nU 9786 ; WX 896 ; N smileface ; G 2622\nU 9787 ; WX 896 ; N invsmileface ; G 2623\nU 9788 ; WX 896 ; N sun ; G 2624\nU 9791 ; WX 614 ; N uni263F ; G 2625\nU 9792 ; WX 731 ; N female ; G 2626\nU 9793 ; WX 731 ; N uni2641 ; G 2627\nU 9794 ; WX 896 ; N male ; G 2628\nU 9795 ; WX 896 ; N uni2643 ; G 2629\nU 9796 ; WX 896 ; N uni2644 ; G 2630\nU 9797 ; WX 896 ; N uni2645 ; G 2631\nU 9798 ; WX 896 ; N uni2646 ; G 2632\nU 9799 ; WX 896 ; N uni2647 ; G 2633\nU 9824 ; WX 896 ; N spade ; G 2634\nU 9825 ; WX 896 ; N uni2661 ; G 2635\nU 9826 ; WX 896 ; N uni2662 ; G 2636\nU 9827 ; WX 896 ; N club ; G 2637\nU 9828 ; WX 896 ; N uni2664 ; G 2638\nU 9829 ; WX 896 ; N heart ; G 2639\nU 9830 ; WX 896 ; N diamond ; G 2640\nU 9831 ; WX 896 ; N uni2667 ; G 2641\nU 9833 ; WX 472 ; N uni2669 ; G 2642\nU 9834 ; WX 638 ; N musicalnote ; G 2643\nU 9835 ; WX 896 ; N musicalnotedbl ; G 2644\nU 9836 ; WX 896 ; N uni266C ; G 2645\nU 9837 ; WX 472 ; N uni266D ; G 2646\nU 9838 ; WX 357 ; N uni266E ; G 2647\nU 9839 ; WX 484 ; N uni266F ; G 2648\nU 10145 ; WX 838 ; N uni27A1 ; G 2649\nU 10181 ; WX 457 ; N uni27C5 ; G 2650\nU 10182 ; WX 457 ; N uni27C6 ; G 2651\nU 10208 ; WX 494 ; N uni27E0 ; G 2652\nU 10216 ; WX 457 ; N uni27E8 ; G 2653\nU 10217 ; WX 457 ; N uni27E9 ; G 2654\nU 10224 ; WX 838 ; N uni27F0 ; G 2655\nU 10225 ; WX 838 ; N uni27F1 ; G 2656\nU 10226 ; WX 838 ; N uni27F2 ; G 2657\nU 10227 ; WX 838 ; N uni27F3 ; G 2658\nU 10228 ; WX 1033 ; N uni27F4 ; G 2659\nU 10229 ; WX 1434 ; N uni27F5 ; G 2660\nU 10230 ; WX 1434 ; N uni27F6 ; G 2661\nU 10231 ; WX 1434 ; N uni27F7 ; G 2662\nU 10232 ; WX 1434 ; N uni27F8 ; G 2663\nU 10233 ; WX 1434 ; N uni27F9 ; G 2664\nU 10234 ; WX 1434 ; N uni27FA ; G 2665\nU 10235 ; WX 1434 ; N uni27FB ; G 2666\nU 10236 ; WX 1434 ; N uni27FC ; G 2667\nU 10237 ; WX 1434 ; N uni27FD ; G 2668\nU 10238 ; WX 1434 ; N uni27FE ; G 2669\nU 10239 ; WX 1434 ; N uni27FF ; G 2670\nU 10240 ; WX 781 ; N uni2800 ; G 2671\nU 10241 ; WX 781 ; N uni2801 ; G 2672\nU 10242 ; WX 781 ; N uni2802 ; G 2673\nU 10243 ; WX 781 ; N uni2803 ; G 2674\nU 10244 ; WX 781 ; N uni2804 ; G 2675\nU 10245 ; WX 781 ; N uni2805 ; G 2676\nU 10246 ; WX 781 ; N uni2806 ; G 2677\nU 10247 ; WX 781 ; N uni2807 ; G 2678\nU 10248 ; WX 781 ; N uni2808 ; G 2679\nU 10249 ; WX 781 ; N uni2809 ; G 2680\nU 10250 ; WX 781 ; N uni280A ; G 2681\nU 10251 ; WX 781 ; N uni280B ; G 2682\nU 10252 ; WX 781 ; N uni280C ; G 2683\nU 10253 ; WX 781 ; N uni280D ; G 2684\nU 10254 ; WX 781 ; N uni280E ; G 2685\nU 10255 ; WX 781 ; N uni280F ; G 2686\nU 10256 ; WX 781 ; N uni2810 ; G 2687\nU 10257 ; WX 781 ; N uni2811 ; G 2688\nU 10258 ; WX 781 ; N uni2812 ; G 2689\nU 10259 ; WX 781 ; N uni2813 ; G 2690\nU 10260 ; WX 781 ; N uni2814 ; G 2691\nU 10261 ; WX 781 ; N uni2815 ; G 2692\nU 10262 ; WX 781 ; N uni2816 ; G 2693\nU 10263 ; WX 781 ; N uni2817 ; G 2694\nU 10264 ; WX 781 ; N uni2818 ; G 2695\nU 10265 ; WX 781 ; N uni2819 ; G 2696\nU 10266 ; WX 781 ; N uni281A ; G 2697\nU 10267 ; WX 781 ; N uni281B ; G 2698\nU 10268 ; WX 781 ; N uni281C ; G 2699\nU 10269 ; WX 781 ; N uni281D ; G 2700\nU 10270 ; WX 781 ; N uni281E ; G 2701\nU 10271 ; WX 781 ; N uni281F ; G 2702\nU 10272 ; WX 781 ; N uni2820 ; G 2703\nU 10273 ; WX 781 ; N uni2821 ; G 2704\nU 10274 ; WX 781 ; N uni2822 ; G 2705\nU 10275 ; WX 781 ; N uni2823 ; G 2706\nU 10276 ; WX 781 ; N uni2824 ; G 2707\nU 10277 ; WX 781 ; N uni2825 ; G 2708\nU 10278 ; WX 781 ; N uni2826 ; G 2709\nU 10279 ; WX 781 ; N uni2827 ; G 2710\nU 10280 ; WX 781 ; N uni2828 ; G 2711\nU 10281 ; WX 781 ; N uni2829 ; G 2712\nU 10282 ; WX 781 ; N uni282A ; G 2713\nU 10283 ; WX 781 ; N uni282B ; G 2714\nU 10284 ; WX 781 ; N uni282C ; G 2715\nU 10285 ; WX 781 ; N uni282D ; G 2716\nU 10286 ; WX 781 ; N uni282E ; G 2717\nU 10287 ; WX 781 ; N uni282F ; G 2718\nU 10288 ; WX 781 ; N uni2830 ; G 2719\nU 10289 ; WX 781 ; N uni2831 ; G 2720\nU 10290 ; WX 781 ; N uni2832 ; G 2721\nU 10291 ; WX 781 ; N uni2833 ; G 2722\nU 10292 ; WX 781 ; N uni2834 ; G 2723\nU 10293 ; WX 781 ; N uni2835 ; G 2724\nU 10294 ; WX 781 ; N uni2836 ; G 2725\nU 10295 ; WX 781 ; N uni2837 ; G 2726\nU 10296 ; WX 781 ; N uni2838 ; G 2727\nU 10297 ; WX 781 ; N uni2839 ; G 2728\nU 10298 ; WX 781 ; N uni283A ; G 2729\nU 10299 ; WX 781 ; N uni283B ; G 2730\nU 10300 ; WX 781 ; N uni283C ; G 2731\nU 10301 ; WX 781 ; N uni283D ; G 2732\nU 10302 ; WX 781 ; N uni283E ; G 2733\nU 10303 ; WX 781 ; N uni283F ; G 2734\nU 10304 ; WX 781 ; N uni2840 ; G 2735\nU 10305 ; WX 781 ; N uni2841 ; G 2736\nU 10306 ; WX 781 ; N uni2842 ; G 2737\nU 10307 ; WX 781 ; N uni2843 ; G 2738\nU 10308 ; WX 781 ; N uni2844 ; G 2739\nU 10309 ; WX 781 ; N uni2845 ; G 2740\nU 10310 ; WX 781 ; N uni2846 ; G 2741\nU 10311 ; WX 781 ; N uni2847 ; G 2742\nU 10312 ; WX 781 ; N uni2848 ; G 2743\nU 10313 ; WX 781 ; N uni2849 ; G 2744\nU 10314 ; WX 781 ; N uni284A ; G 2745\nU 10315 ; WX 781 ; N uni284B ; G 2746\nU 10316 ; WX 781 ; N uni284C ; G 2747\nU 10317 ; WX 781 ; N uni284D ; G 2748\nU 10318 ; WX 781 ; N uni284E ; G 2749\nU 10319 ; WX 781 ; N uni284F ; G 2750\nU 10320 ; WX 781 ; N uni2850 ; G 2751\nU 10321 ; WX 781 ; N uni2851 ; G 2752\nU 10322 ; WX 781 ; N uni2852 ; G 2753\nU 10323 ; WX 781 ; N uni2853 ; G 2754\nU 10324 ; WX 781 ; N uni2854 ; G 2755\nU 10325 ; WX 781 ; N uni2855 ; G 2756\nU 10326 ; WX 781 ; N uni2856 ; G 2757\nU 10327 ; WX 781 ; N uni2857 ; G 2758\nU 10328 ; WX 781 ; N uni2858 ; G 2759\nU 10329 ; WX 781 ; N uni2859 ; G 2760\nU 10330 ; WX 781 ; N uni285A ; G 2761\nU 10331 ; WX 781 ; N uni285B ; G 2762\nU 10332 ; WX 781 ; N uni285C ; G 2763\nU 10333 ; WX 781 ; N uni285D ; G 2764\nU 10334 ; WX 781 ; N uni285E ; G 2765\nU 10335 ; WX 781 ; N uni285F ; G 2766\nU 10336 ; WX 781 ; N uni2860 ; G 2767\nU 10337 ; WX 781 ; N uni2861 ; G 2768\nU 10338 ; WX 781 ; N uni2862 ; G 2769\nU 10339 ; WX 781 ; N uni2863 ; G 2770\nU 10340 ; WX 781 ; N uni2864 ; G 2771\nU 10341 ; WX 781 ; N uni2865 ; G 2772\nU 10342 ; WX 781 ; N uni2866 ; G 2773\nU 10343 ; WX 781 ; N uni2867 ; G 2774\nU 10344 ; WX 781 ; N uni2868 ; G 2775\nU 10345 ; WX 781 ; N uni2869 ; G 2776\nU 10346 ; WX 781 ; N uni286A ; G 2777\nU 10347 ; WX 781 ; N uni286B ; G 2778\nU 10348 ; WX 781 ; N uni286C ; G 2779\nU 10349 ; WX 781 ; N uni286D ; G 2780\nU 10350 ; WX 781 ; N uni286E ; G 2781\nU 10351 ; WX 781 ; N uni286F ; G 2782\nU 10352 ; WX 781 ; N uni2870 ; G 2783\nU 10353 ; WX 781 ; N uni2871 ; G 2784\nU 10354 ; WX 781 ; N uni2872 ; G 2785\nU 10355 ; WX 781 ; N uni2873 ; G 2786\nU 10356 ; WX 781 ; N uni2874 ; G 2787\nU 10357 ; WX 781 ; N uni2875 ; G 2788\nU 10358 ; WX 781 ; N uni2876 ; G 2789\nU 10359 ; WX 781 ; N uni2877 ; G 2790\nU 10360 ; WX 781 ; N uni2878 ; G 2791\nU 10361 ; WX 781 ; N uni2879 ; G 2792\nU 10362 ; WX 781 ; N uni287A ; G 2793\nU 10363 ; WX 781 ; N uni287B ; G 2794\nU 10364 ; WX 781 ; N uni287C ; G 2795\nU 10365 ; WX 781 ; N uni287D ; G 2796\nU 10366 ; WX 781 ; N uni287E ; G 2797\nU 10367 ; WX 781 ; N uni287F ; G 2798\nU 10368 ; WX 781 ; N uni2880 ; G 2799\nU 10369 ; WX 781 ; N uni2881 ; G 2800\nU 10370 ; WX 781 ; N uni2882 ; G 2801\nU 10371 ; WX 781 ; N uni2883 ; G 2802\nU 10372 ; WX 781 ; N uni2884 ; G 2803\nU 10373 ; WX 781 ; N uni2885 ; G 2804\nU 10374 ; WX 781 ; N uni2886 ; G 2805\nU 10375 ; WX 781 ; N uni2887 ; G 2806\nU 10376 ; WX 781 ; N uni2888 ; G 2807\nU 10377 ; WX 781 ; N uni2889 ; G 2808\nU 10378 ; WX 781 ; N uni288A ; G 2809\nU 10379 ; WX 781 ; N uni288B ; G 2810\nU 10380 ; WX 781 ; N uni288C ; G 2811\nU 10381 ; WX 781 ; N uni288D ; G 2812\nU 10382 ; WX 781 ; N uni288E ; G 2813\nU 10383 ; WX 781 ; N uni288F ; G 2814\nU 10384 ; WX 781 ; N uni2890 ; G 2815\nU 10385 ; WX 781 ; N uni2891 ; G 2816\nU 10386 ; WX 781 ; N uni2892 ; G 2817\nU 10387 ; WX 781 ; N uni2893 ; G 2818\nU 10388 ; WX 781 ; N uni2894 ; G 2819\nU 10389 ; WX 781 ; N uni2895 ; G 2820\nU 10390 ; WX 781 ; N uni2896 ; G 2821\nU 10391 ; WX 781 ; N uni2897 ; G 2822\nU 10392 ; WX 781 ; N uni2898 ; G 2823\nU 10393 ; WX 781 ; N uni2899 ; G 2824\nU 10394 ; WX 781 ; N uni289A ; G 2825\nU 10395 ; WX 781 ; N uni289B ; G 2826\nU 10396 ; WX 781 ; N uni289C ; G 2827\nU 10397 ; WX 781 ; N uni289D ; G 2828\nU 10398 ; WX 781 ; N uni289E ; G 2829\nU 10399 ; WX 781 ; N uni289F ; G 2830\nU 10400 ; WX 781 ; N uni28A0 ; G 2831\nU 10401 ; WX 781 ; N uni28A1 ; G 2832\nU 10402 ; WX 781 ; N uni28A2 ; G 2833\nU 10403 ; WX 781 ; N uni28A3 ; G 2834\nU 10404 ; WX 781 ; N uni28A4 ; G 2835\nU 10405 ; WX 781 ; N uni28A5 ; G 2836\nU 10406 ; WX 781 ; N uni28A6 ; G 2837\nU 10407 ; WX 781 ; N uni28A7 ; G 2838\nU 10408 ; WX 781 ; N uni28A8 ; G 2839\nU 10409 ; WX 781 ; N uni28A9 ; G 2840\nU 10410 ; WX 781 ; N uni28AA ; G 2841\nU 10411 ; WX 781 ; N uni28AB ; G 2842\nU 10412 ; WX 781 ; N uni28AC ; G 2843\nU 10413 ; WX 781 ; N uni28AD ; G 2844\nU 10414 ; WX 781 ; N uni28AE ; G 2845\nU 10415 ; WX 781 ; N uni28AF ; G 2846\nU 10416 ; WX 781 ; N uni28B0 ; G 2847\nU 10417 ; WX 781 ; N uni28B1 ; G 2848\nU 10418 ; WX 781 ; N uni28B2 ; G 2849\nU 10419 ; WX 781 ; N uni28B3 ; G 2850\nU 10420 ; WX 781 ; N uni28B4 ; G 2851\nU 10421 ; WX 781 ; N uni28B5 ; G 2852\nU 10422 ; WX 781 ; N uni28B6 ; G 2853\nU 10423 ; WX 781 ; N uni28B7 ; G 2854\nU 10424 ; WX 781 ; N uni28B8 ; G 2855\nU 10425 ; WX 781 ; N uni28B9 ; G 2856\nU 10426 ; WX 781 ; N uni28BA ; G 2857\nU 10427 ; WX 781 ; N uni28BB ; G 2858\nU 10428 ; WX 781 ; N uni28BC ; G 2859\nU 10429 ; WX 781 ; N uni28BD ; G 2860\nU 10430 ; WX 781 ; N uni28BE ; G 2861\nU 10431 ; WX 781 ; N uni28BF ; G 2862\nU 10432 ; WX 781 ; N uni28C0 ; G 2863\nU 10433 ; WX 781 ; N uni28C1 ; G 2864\nU 10434 ; WX 781 ; N uni28C2 ; G 2865\nU 10435 ; WX 781 ; N uni28C3 ; G 2866\nU 10436 ; WX 781 ; N uni28C4 ; G 2867\nU 10437 ; WX 781 ; N uni28C5 ; G 2868\nU 10438 ; WX 781 ; N uni28C6 ; G 2869\nU 10439 ; WX 781 ; N uni28C7 ; G 2870\nU 10440 ; WX 781 ; N uni28C8 ; G 2871\nU 10441 ; WX 781 ; N uni28C9 ; G 2872\nU 10442 ; WX 781 ; N uni28CA ; G 2873\nU 10443 ; WX 781 ; N uni28CB ; G 2874\nU 10444 ; WX 781 ; N uni28CC ; G 2875\nU 10445 ; WX 781 ; N uni28CD ; G 2876\nU 10446 ; WX 781 ; N uni28CE ; G 2877\nU 10447 ; WX 781 ; N uni28CF ; G 2878\nU 10448 ; WX 781 ; N uni28D0 ; G 2879\nU 10449 ; WX 781 ; N uni28D1 ; G 2880\nU 10450 ; WX 781 ; N uni28D2 ; G 2881\nU 10451 ; WX 781 ; N uni28D3 ; G 2882\nU 10452 ; WX 781 ; N uni28D4 ; G 2883\nU 10453 ; WX 781 ; N uni28D5 ; G 2884\nU 10454 ; WX 781 ; N uni28D6 ; G 2885\nU 10455 ; WX 781 ; N uni28D7 ; G 2886\nU 10456 ; WX 781 ; N uni28D8 ; G 2887\nU 10457 ; WX 781 ; N uni28D9 ; G 2888\nU 10458 ; WX 781 ; N uni28DA ; G 2889\nU 10459 ; WX 781 ; N uni28DB ; G 2890\nU 10460 ; WX 781 ; N uni28DC ; G 2891\nU 10461 ; WX 781 ; N uni28DD ; G 2892\nU 10462 ; WX 781 ; N uni28DE ; G 2893\nU 10463 ; WX 781 ; N uni28DF ; G 2894\nU 10464 ; WX 781 ; N uni28E0 ; G 2895\nU 10465 ; WX 781 ; N uni28E1 ; G 2896\nU 10466 ; WX 781 ; N uni28E2 ; G 2897\nU 10467 ; WX 781 ; N uni28E3 ; G 2898\nU 10468 ; WX 781 ; N uni28E4 ; G 2899\nU 10469 ; WX 781 ; N uni28E5 ; G 2900\nU 10470 ; WX 781 ; N uni28E6 ; G 2901\nU 10471 ; WX 781 ; N uni28E7 ; G 2902\nU 10472 ; WX 781 ; N uni28E8 ; G 2903\nU 10473 ; WX 781 ; N uni28E9 ; G 2904\nU 10474 ; WX 781 ; N uni28EA ; G 2905\nU 10475 ; WX 781 ; N uni28EB ; G 2906\nU 10476 ; WX 781 ; N uni28EC ; G 2907\nU 10477 ; WX 781 ; N uni28ED ; G 2908\nU 10478 ; WX 781 ; N uni28EE ; G 2909\nU 10479 ; WX 781 ; N uni28EF ; G 2910\nU 10480 ; WX 781 ; N uni28F0 ; G 2911\nU 10481 ; WX 781 ; N uni28F1 ; G 2912\nU 10482 ; WX 781 ; N uni28F2 ; G 2913\nU 10483 ; WX 781 ; N uni28F3 ; G 2914\nU 10484 ; WX 781 ; N uni28F4 ; G 2915\nU 10485 ; WX 781 ; N uni28F5 ; G 2916\nU 10486 ; WX 781 ; N uni28F6 ; G 2917\nU 10487 ; WX 781 ; N uni28F7 ; G 2918\nU 10488 ; WX 781 ; N uni28F8 ; G 2919\nU 10489 ; WX 781 ; N uni28F9 ; G 2920\nU 10490 ; WX 781 ; N uni28FA ; G 2921\nU 10491 ; WX 781 ; N uni28FB ; G 2922\nU 10492 ; WX 781 ; N uni28FC ; G 2923\nU 10493 ; WX 781 ; N uni28FD ; G 2924\nU 10494 ; WX 781 ; N uni28FE ; G 2925\nU 10495 ; WX 781 ; N uni28FF ; G 2926\nU 10496 ; WX 838 ; N uni2900 ; G 2927\nU 10497 ; WX 838 ; N uni2901 ; G 2928\nU 10498 ; WX 838 ; N uni2902 ; G 2929\nU 10499 ; WX 838 ; N uni2903 ; G 2930\nU 10500 ; WX 838 ; N uni2904 ; G 2931\nU 10501 ; WX 838 ; N uni2905 ; G 2932\nU 10502 ; WX 838 ; N uni2906 ; G 2933\nU 10503 ; WX 838 ; N uni2907 ; G 2934\nU 10504 ; WX 838 ; N uni2908 ; G 2935\nU 10505 ; WX 838 ; N uni2909 ; G 2936\nU 10506 ; WX 838 ; N uni290A ; G 2937\nU 10507 ; WX 838 ; N uni290B ; G 2938\nU 10508 ; WX 838 ; N uni290C ; G 2939\nU 10509 ; WX 838 ; N uni290D ; G 2940\nU 10510 ; WX 838 ; N uni290E ; G 2941\nU 10511 ; WX 838 ; N uni290F ; G 2942\nU 10512 ; WX 838 ; N uni2910 ; G 2943\nU 10513 ; WX 838 ; N uni2911 ; G 2944\nU 10514 ; WX 838 ; N uni2912 ; G 2945\nU 10515 ; WX 838 ; N uni2913 ; G 2946\nU 10516 ; WX 838 ; N uni2914 ; G 2947\nU 10517 ; WX 838 ; N uni2915 ; G 2948\nU 10518 ; WX 838 ; N uni2916 ; G 2949\nU 10519 ; WX 838 ; N uni2917 ; G 2950\nU 10520 ; WX 838 ; N uni2918 ; G 2951\nU 10521 ; WX 838 ; N uni2919 ; G 2952\nU 10522 ; WX 838 ; N uni291A ; G 2953\nU 10523 ; WX 838 ; N uni291B ; G 2954\nU 10524 ; WX 838 ; N uni291C ; G 2955\nU 10525 ; WX 838 ; N uni291D ; G 2956\nU 10526 ; WX 838 ; N uni291E ; G 2957\nU 10527 ; WX 838 ; N uni291F ; G 2958\nU 10528 ; WX 838 ; N uni2920 ; G 2959\nU 10529 ; WX 838 ; N uni2921 ; G 2960\nU 10530 ; WX 838 ; N uni2922 ; G 2961\nU 10531 ; WX 838 ; N uni2923 ; G 2962\nU 10532 ; WX 838 ; N uni2924 ; G 2963\nU 10533 ; WX 838 ; N uni2925 ; G 2964\nU 10534 ; WX 838 ; N uni2926 ; G 2965\nU 10535 ; WX 838 ; N uni2927 ; G 2966\nU 10536 ; WX 838 ; N uni2928 ; G 2967\nU 10537 ; WX 838 ; N uni2929 ; G 2968\nU 10538 ; WX 838 ; N uni292A ; G 2969\nU 10539 ; WX 838 ; N uni292B ; G 2970\nU 10540 ; WX 838 ; N uni292C ; G 2971\nU 10541 ; WX 838 ; N uni292D ; G 2972\nU 10542 ; WX 838 ; N uni292E ; G 2973\nU 10543 ; WX 838 ; N uni292F ; G 2974\nU 10544 ; WX 838 ; N uni2930 ; G 2975\nU 10545 ; WX 838 ; N uni2931 ; G 2976\nU 10546 ; WX 838 ; N uni2932 ; G 2977\nU 10547 ; WX 838 ; N uni2933 ; G 2978\nU 10548 ; WX 838 ; N uni2934 ; G 2979\nU 10549 ; WX 838 ; N uni2935 ; G 2980\nU 10550 ; WX 838 ; N uni2936 ; G 2981\nU 10551 ; WX 838 ; N uni2937 ; G 2982\nU 10552 ; WX 838 ; N uni2938 ; G 2983\nU 10553 ; WX 838 ; N uni2939 ; G 2984\nU 10554 ; WX 838 ; N uni293A ; G 2985\nU 10555 ; WX 838 ; N uni293B ; G 2986\nU 10556 ; WX 838 ; N uni293C ; G 2987\nU 10557 ; WX 838 ; N uni293D ; G 2988\nU 10558 ; WX 838 ; N uni293E ; G 2989\nU 10559 ; WX 838 ; N uni293F ; G 2990\nU 10560 ; WX 838 ; N uni2940 ; G 2991\nU 10561 ; WX 838 ; N uni2941 ; G 2992\nU 10562 ; WX 838 ; N uni2942 ; G 2993\nU 10563 ; WX 838 ; N uni2943 ; G 2994\nU 10564 ; WX 838 ; N uni2944 ; G 2995\nU 10565 ; WX 838 ; N uni2945 ; G 2996\nU 10566 ; WX 838 ; N uni2946 ; G 2997\nU 10567 ; WX 838 ; N uni2947 ; G 2998\nU 10568 ; WX 838 ; N uni2948 ; G 2999\nU 10569 ; WX 838 ; N uni2949 ; G 3000\nU 10570 ; WX 838 ; N uni294A ; G 3001\nU 10571 ; WX 838 ; N uni294B ; G 3002\nU 10572 ; WX 838 ; N uni294C ; G 3003\nU 10573 ; WX 838 ; N uni294D ; G 3004\nU 10574 ; WX 838 ; N uni294E ; G 3005\nU 10575 ; WX 838 ; N uni294F ; G 3006\nU 10576 ; WX 838 ; N uni2950 ; G 3007\nU 10577 ; WX 838 ; N uni2951 ; G 3008\nU 10578 ; WX 838 ; N uni2952 ; G 3009\nU 10579 ; WX 838 ; N uni2953 ; G 3010\nU 10580 ; WX 838 ; N uni2954 ; G 3011\nU 10581 ; WX 838 ; N uni2955 ; G 3012\nU 10582 ; WX 838 ; N uni2956 ; G 3013\nU 10583 ; WX 838 ; N uni2957 ; G 3014\nU 10584 ; WX 838 ; N uni2958 ; G 3015\nU 10585 ; WX 838 ; N uni2959 ; G 3016\nU 10586 ; WX 838 ; N uni295A ; G 3017\nU 10587 ; WX 838 ; N uni295B ; G 3018\nU 10588 ; WX 838 ; N uni295C ; G 3019\nU 10589 ; WX 838 ; N uni295D ; G 3020\nU 10590 ; WX 838 ; N uni295E ; G 3021\nU 10591 ; WX 838 ; N uni295F ; G 3022\nU 10592 ; WX 838 ; N uni2960 ; G 3023\nU 10593 ; WX 838 ; N uni2961 ; G 3024\nU 10594 ; WX 838 ; N uni2962 ; G 3025\nU 10595 ; WX 838 ; N uni2963 ; G 3026\nU 10596 ; WX 838 ; N uni2964 ; G 3027\nU 10597 ; WX 838 ; N uni2965 ; G 3028\nU 10598 ; WX 838 ; N uni2966 ; G 3029\nU 10599 ; WX 838 ; N uni2967 ; G 3030\nU 10600 ; WX 838 ; N uni2968 ; G 3031\nU 10601 ; WX 838 ; N uni2969 ; G 3032\nU 10602 ; WX 838 ; N uni296A ; G 3033\nU 10603 ; WX 838 ; N uni296B ; G 3034\nU 10604 ; WX 838 ; N uni296C ; G 3035\nU 10605 ; WX 838 ; N uni296D ; G 3036\nU 10606 ; WX 838 ; N uni296E ; G 3037\nU 10607 ; WX 838 ; N uni296F ; G 3038\nU 10608 ; WX 838 ; N uni2970 ; G 3039\nU 10609 ; WX 838 ; N uni2971 ; G 3040\nU 10610 ; WX 838 ; N uni2972 ; G 3041\nU 10611 ; WX 838 ; N uni2973 ; G 3042\nU 10612 ; WX 838 ; N uni2974 ; G 3043\nU 10613 ; WX 838 ; N uni2975 ; G 3044\nU 10614 ; WX 838 ; N uni2976 ; G 3045\nU 10615 ; WX 1032 ; N uni2977 ; G 3046\nU 10616 ; WX 838 ; N uni2978 ; G 3047\nU 10617 ; WX 838 ; N uni2979 ; G 3048\nU 10618 ; WX 960 ; N uni297A ; G 3049\nU 10619 ; WX 838 ; N uni297B ; G 3050\nU 10620 ; WX 838 ; N uni297C ; G 3051\nU 10621 ; WX 838 ; N uni297D ; G 3052\nU 10622 ; WX 838 ; N uni297E ; G 3053\nU 10623 ; WX 838 ; N uni297F ; G 3054\nU 10731 ; WX 494 ; N uni29EB ; G 3055\nU 10764 ; WX 1782 ; N uni2A0C ; G 3056\nU 10765 ; WX 610 ; N uni2A0D ; G 3057\nU 10766 ; WX 610 ; N uni2A0E ; G 3058\nU 10799 ; WX 838 ; N uni2A2F ; G 3059\nU 10858 ; WX 838 ; N uni2A6A ; G 3060\nU 10859 ; WX 838 ; N uni2A6B ; G 3061\nU 11008 ; WX 838 ; N uni2B00 ; G 3062\nU 11009 ; WX 838 ; N uni2B01 ; G 3063\nU 11010 ; WX 838 ; N uni2B02 ; G 3064\nU 11011 ; WX 838 ; N uni2B03 ; G 3065\nU 11012 ; WX 838 ; N uni2B04 ; G 3066\nU 11013 ; WX 838 ; N uni2B05 ; G 3067\nU 11014 ; WX 838 ; N uni2B06 ; G 3068\nU 11015 ; WX 838 ; N uni2B07 ; G 3069\nU 11016 ; WX 838 ; N uni2B08 ; G 3070\nU 11017 ; WX 838 ; N uni2B09 ; G 3071\nU 11018 ; WX 838 ; N uni2B0A ; G 3072\nU 11019 ; WX 838 ; N uni2B0B ; G 3073\nU 11020 ; WX 838 ; N uni2B0C ; G 3074\nU 11021 ; WX 838 ; N uni2B0D ; G 3075\nU 11022 ; WX 838 ; N uni2B0E ; G 3076\nU 11023 ; WX 838 ; N uni2B0F ; G 3077\nU 11024 ; WX 838 ; N uni2B10 ; G 3078\nU 11025 ; WX 838 ; N uni2B11 ; G 3079\nU 11026 ; WX 945 ; N uni2B12 ; G 3080\nU 11027 ; WX 945 ; N uni2B13 ; G 3081\nU 11028 ; WX 945 ; N uni2B14 ; G 3082\nU 11029 ; WX 945 ; N uni2B15 ; G 3083\nU 11030 ; WX 769 ; N uni2B16 ; G 3084\nU 11031 ; WX 769 ; N uni2B17 ; G 3085\nU 11032 ; WX 769 ; N uni2B18 ; G 3086\nU 11033 ; WX 769 ; N uni2B19 ; G 3087\nU 11034 ; WX 945 ; N uni2B1A ; G 3088\nU 11360 ; WX 703 ; N uni2C60 ; G 3089\nU 11361 ; WX 380 ; N uni2C61 ; G 3090\nU 11363 ; WX 752 ; N uni2C63 ; G 3091\nU 11364 ; WX 831 ; N uni2C64 ; G 3092\nU 11367 ; WX 945 ; N uni2C67 ; G 3093\nU 11368 ; WX 727 ; N uni2C68 ; G 3094\nU 11369 ; WX 869 ; N uni2C69 ; G 3095\nU 11370 ; WX 693 ; N uni2C6A ; G 3096\nU 11371 ; WX 730 ; N uni2C6B ; G 3097\nU 11372 ; WX 568 ; N uni2C6C ; G 3098\nU 11373 ; WX 848 ; N uni2C6D ; G 3099\nU 11374 ; WX 1107 ; N uni2C6E ; G 3100\nU 11375 ; WX 776 ; N uni2C6F ; G 3101\nU 11376 ; WX 848 ; N uni2C70 ; G 3102\nU 11377 ; WX 709 ; N uni2C71 ; G 3103\nU 11378 ; WX 1221 ; N uni2C72 ; G 3104\nU 11379 ; WX 984 ; N uni2C73 ; G 3105\nU 11381 ; WX 779 ; N uni2C75 ; G 3106\nU 11382 ; WX 576 ; N uni2C76 ; G 3107\nU 11383 ; WX 905 ; N uni2C77 ; G 3108\nU 11385 ; WX 571 ; N uni2C79 ; G 3109\nU 11386 ; WX 667 ; N uni2C7A ; G 3110\nU 11387 ; WX 617 ; N uni2C7B ; G 3111\nU 11388 ; WX 313 ; N uni2C7C ; G 3112\nU 11389 ; WX 489 ; N uni2C7D ; G 3113\nU 11390 ; WX 722 ; N uni2C7E ; G 3114\nU 11391 ; WX 730 ; N uni2C7F ; G 3115\nU 11520 ; WX 773 ; N uni2D00 ; G 3116\nU 11521 ; WX 635 ; N uni2D01 ; G 3117\nU 11522 ; WX 804 ; N uni2D02 ; G 3118\nU 11523 ; WX 658 ; N uni2D03 ; G 3119\nU 11524 ; WX 788 ; N uni2D04 ; G 3120\nU 11525 ; WX 962 ; N uni2D05 ; G 3121\nU 11526 ; WX 756 ; N uni2D06 ; G 3122\nU 11527 ; WX 960 ; N uni2D07 ; G 3123\nU 11528 ; WX 617 ; N uni2D08 ; G 3124\nU 11529 ; WX 646 ; N uni2D09 ; G 3125\nU 11530 ; WX 962 ; N uni2D0A ; G 3126\nU 11531 ; WX 631 ; N uni2D0B ; G 3127\nU 11532 ; WX 646 ; N uni2D0C ; G 3128\nU 11533 ; WX 962 ; N uni2D0D ; G 3129\nU 11534 ; WX 846 ; N uni2D0E ; G 3130\nU 11535 ; WX 866 ; N uni2D0F ; G 3131\nU 11536 ; WX 961 ; N uni2D10 ; G 3132\nU 11537 ; WX 645 ; N uni2D11 ; G 3133\nU 11538 ; WX 645 ; N uni2D12 ; G 3134\nU 11539 ; WX 959 ; N uni2D13 ; G 3135\nU 11540 ; WX 945 ; N uni2D14 ; G 3136\nU 11541 ; WX 863 ; N uni2D15 ; G 3137\nU 11542 ; WX 644 ; N uni2D16 ; G 3138\nU 11543 ; WX 646 ; N uni2D17 ; G 3139\nU 11544 ; WX 645 ; N uni2D18 ; G 3140\nU 11545 ; WX 649 ; N uni2D19 ; G 3141\nU 11546 ; WX 688 ; N uni2D1A ; G 3142\nU 11547 ; WX 936 ; N uni2D1B ; G 3143\nU 11548 ; WX 982 ; N uni2D1C ; G 3144\nU 11549 ; WX 681 ; N uni2D1D ; G 3145\nU 11550 ; WX 676 ; N uni2D1E ; G 3146\nU 11551 ; WX 852 ; N uni2D1F ; G 3147\nU 11552 ; WX 1113 ; N uni2D20 ; G 3148\nU 11553 ; WX 632 ; N uni2D21 ; G 3149\nU 11554 ; WX 645 ; N uni2D22 ; G 3150\nU 11555 ; WX 646 ; N uni2D23 ; G 3151\nU 11556 ; WX 749 ; N uni2D24 ; G 3152\nU 11557 ; WX 914 ; N uni2D25 ; G 3153\nU 11800 ; WX 586 ; N uni2E18 ; G 3154\nU 11807 ; WX 838 ; N uni2E1F ; G 3155\nU 11810 ; WX 473 ; N uni2E22 ; G 3156\nU 11811 ; WX 473 ; N uni2E23 ; G 3157\nU 11812 ; WX 473 ; N uni2E24 ; G 3158\nU 11813 ; WX 473 ; N uni2E25 ; G 3159\nU 11822 ; WX 586 ; N uni2E2E ; G 3160\nU 42564 ; WX 722 ; N uniA644 ; G 3161\nU 42565 ; WX 563 ; N uniA645 ; G 3162\nU 42566 ; WX 468 ; N uniA646 ; G 3163\nU 42567 ; WX 380 ; N uniA647 ; G 3164\nU 42576 ; WX 1333 ; N uniA650 ; G 3165\nU 42577 ; WX 1085 ; N uniA651 ; G 3166\nU 42580 ; WX 1287 ; N uniA654 ; G 3167\nU 42581 ; WX 1025 ; N uniA655 ; G 3168\nU 42582 ; WX 1287 ; N uniA656 ; G 3169\nU 42583 ; WX 1029 ; N uniA657 ; G 3170\nU 42648 ; WX 1448 ; N uniA698 ; G 3171\nU 42649 ; WX 1060 ; N uniA699 ; G 3172\nU 42760 ; WX 500 ; N uniA708 ; G 3173\nU 42761 ; WX 500 ; N uniA709 ; G 3174\nU 42762 ; WX 500 ; N uniA70A ; G 3175\nU 42763 ; WX 500 ; N uniA70B ; G 3176\nU 42764 ; WX 500 ; N uniA70C ; G 3177\nU 42765 ; WX 500 ; N uniA70D ; G 3178\nU 42766 ; WX 500 ; N uniA70E ; G 3179\nU 42767 ; WX 500 ; N uniA70F ; G 3180\nU 42768 ; WX 500 ; N uniA710 ; G 3181\nU 42769 ; WX 500 ; N uniA711 ; G 3182\nU 42770 ; WX 500 ; N uniA712 ; G 3183\nU 42771 ; WX 500 ; N uniA713 ; G 3184\nU 42772 ; WX 500 ; N uniA714 ; G 3185\nU 42773 ; WX 500 ; N uniA715 ; G 3186\nU 42774 ; WX 500 ; N uniA716 ; G 3187\nU 42779 ; WX 384 ; N uniA71B ; G 3188\nU 42780 ; WX 384 ; N uniA71C ; G 3189\nU 42781 ; WX 276 ; N uniA71D ; G 3190\nU 42782 ; WX 276 ; N uniA71E ; G 3191\nU 42783 ; WX 276 ; N uniA71F ; G 3192\nU 42790 ; WX 945 ; N uniA726 ; G 3193\nU 42791 ; WX 712 ; N uniA727 ; G 3194\nU 42792 ; WX 1003 ; N uniA728 ; G 3195\nU 42793 ; WX 909 ; N uniA729 ; G 3196\nU 42794 ; WX 696 ; N uniA72A ; G 3197\nU 42795 ; WX 609 ; N uniA72B ; G 3198\nU 42796 ; WX 634 ; N uniA72C ; G 3199\nU 42797 ; WX 598 ; N uniA72D ; G 3200\nU 42798 ; WX 741 ; N uniA72E ; G 3201\nU 42799 ; WX 706 ; N uniA72F ; G 3202\nU 42800 ; WX 592 ; N uniA730 ; G 3203\nU 42801 ; WX 563 ; N uniA731 ; G 3204\nU 42802 ; WX 1301 ; N uniA732 ; G 3205\nU 42803 ; WX 983 ; N uniA733 ; G 3206\nU 42804 ; WX 1261 ; N uniA734 ; G 3207\nU 42805 ; WX 985 ; N uniA735 ; G 3208\nU 42806 ; WX 1168 ; N uniA736 ; G 3209\nU 42807 ; WX 1007 ; N uniA737 ; G 3210\nU 42808 ; WX 1016 ; N uniA738 ; G 3211\nU 42809 ; WX 832 ; N uniA739 ; G 3212\nU 42810 ; WX 1016 ; N uniA73A ; G 3213\nU 42811 ; WX 832 ; N uniA73B ; G 3214\nU 42812 ; WX 994 ; N uniA73C ; G 3215\nU 42813 ; WX 746 ; N uniA73D ; G 3216\nU 42814 ; WX 796 ; N uniA73E ; G 3217\nU 42815 ; WX 609 ; N uniA73F ; G 3218\nU 42816 ; WX 869 ; N uniA740 ; G 3219\nU 42817 ; WX 693 ; N uniA741 ; G 3220\nU 42822 ; WX 916 ; N uniA746 ; G 3221\nU 42823 ; WX 581 ; N uniA747 ; G 3222\nU 42826 ; WX 1010 ; N uniA74A ; G 3223\nU 42827 ; WX 770 ; N uniA74B ; G 3224\nU 42830 ; WX 1448 ; N uniA74E ; G 3225\nU 42831 ; WX 1060 ; N uniA74F ; G 3226\nU 42856 ; WX 787 ; N uniA768 ; G 3227\nU 42857 ; WX 716 ; N uniA769 ; G 3228\nU 42875 ; WX 694 ; N uniA77B ; G 3229\nU 42876 ; WX 527 ; N uniA77C ; G 3230\nU 42880 ; WX 703 ; N uniA780 ; G 3231\nU 42881 ; WX 380 ; N uniA781 ; G 3232\nU 42882 ; WX 872 ; N uniA782 ; G 3233\nU 42883 ; WX 727 ; N uniA783 ; G 3234\nU 42884 ; WX 694 ; N uniA784 ; G 3235\nU 42885 ; WX 527 ; N uniA785 ; G 3236\nU 42886 ; WX 796 ; N uniA786 ; G 3237\nU 42887 ; WX 609 ; N uniA787 ; G 3238\nU 42891 ; WX 439 ; N uniA78B ; G 3239\nU 42892 ; WX 306 ; N uniA78C ; G 3240\nU 42893 ; WX 913 ; N uniA78D ; G 3241\nU 42896 ; WX 914 ; N uniA790 ; G 3242\nU 42897 ; WX 812 ; N uniA791 ; G 3243\nU 42922 ; WX 945 ; N uniA7AA ; G 3244\nU 43000 ; WX 595 ; N uniA7F8 ; G 3245\nU 43001 ; WX 647 ; N uniA7F9 ; G 3246\nU 43002 ; WX 1068 ; N uniA7FA ; G 3247\nU 43003 ; WX 710 ; N uniA7FB ; G 3248\nU 43004 ; WX 752 ; N uniA7FC ; G 3249\nU 43005 ; WX 1107 ; N uniA7FD ; G 3250\nU 43006 ; WX 468 ; N uniA7FE ; G 3251\nU 43007 ; WX 1286 ; N uniA7FF ; G 3252\nU 62464 ; WX 726 ; N uniF400 ; G 3253\nU 62465 ; WX 737 ; N uniF401 ; G 3254\nU 62466 ; WX 786 ; N uniF402 ; G 3255\nU 62467 ; WX 1019 ; N uniF403 ; G 3256\nU 62468 ; WX 737 ; N uniF404 ; G 3257\nU 62469 ; WX 731 ; N uniF405 ; G 3258\nU 62470 ; WX 796 ; N uniF406 ; G 3259\nU 62471 ; WX 1058 ; N uniF407 ; G 3260\nU 62472 ; WX 737 ; N uniF408 ; G 3261\nU 62473 ; WX 737 ; N uniF409 ; G 3262\nU 62474 ; WX 1329 ; N uniF40A ; G 3263\nU 62475 ; WX 754 ; N uniF40B ; G 3264\nU 62476 ; WX 753 ; N uniF40C ; G 3265\nU 62477 ; WX 1024 ; N uniF40D ; G 3266\nU 62478 ; WX 737 ; N uniF40E ; G 3267\nU 62479 ; WX 753 ; N uniF40F ; G 3268\nU 62480 ; WX 1070 ; N uniF410 ; G 3269\nU 62481 ; WX 818 ; N uniF411 ; G 3270\nU 62482 ; WX 870 ; N uniF412 ; G 3271\nU 62483 ; WX 819 ; N uniF413 ; G 3272\nU 62484 ; WX 1016 ; N uniF414 ; G 3273\nU 62485 ; WX 753 ; N uniF415 ; G 3274\nU 62486 ; WX 1008 ; N uniF416 ; G 3275\nU 62487 ; WX 752 ; N uniF417 ; G 3276\nU 62488 ; WX 760 ; N uniF418 ; G 3277\nU 62489 ; WX 753 ; N uniF419 ; G 3278\nU 62490 ; WX 800 ; N uniF41A ; G 3279\nU 62491 ; WX 753 ; N uniF41B ; G 3280\nU 62492 ; WX 760 ; N uniF41C ; G 3281\nU 62493 ; WX 738 ; N uniF41D ; G 3282\nU 62494 ; WX 801 ; N uniF41E ; G 3283\nU 62495 ; WX 956 ; N uniF41F ; G 3284\nU 62496 ; WX 736 ; N uniF420 ; G 3285\nU 62497 ; WX 847 ; N uniF421 ; G 3286\nU 62498 ; WX 737 ; N uniF422 ; G 3287\nU 62499 ; WX 737 ; N uniF423 ; G 3288\nU 62500 ; WX 737 ; N uniF424 ; G 3289\nU 62501 ; WX 793 ; N uniF425 ; G 3290\nU 62502 ; WX 1033 ; N uniF426 ; G 3291\nU 62504 ; WX 904 ; N uniF428 ; G 3292\nU 63172 ; WX 380 ; N uniF6C4 ; G 3293\nU 63173 ; WX 667 ; N uniF6C5 ; G 3294\nU 63174 ; WX 699 ; N uniF6C6 ; G 3295\nU 63175 ; WX 727 ; N uniF6C7 ; G 3296\nU 63176 ; WX 1058 ; N uniF6C8 ; G 3297\nU 63185 ; WX 500 ; N cyrBreve ; G 3298\nU 63188 ; WX 500 ; N cyrbreve ; G 3299\nU 64256 ; WX 827 ; N uniFB00 ; G 3300\nU 64257 ; WX 727 ; N fi ; G 3301\nU 64258 ; WX 727 ; N fl ; G 3302\nU 64259 ; WX 1108 ; N uniFB03 ; G 3303\nU 64260 ; WX 1146 ; N uniFB04 ; G 3304\nU 64261 ; WX 879 ; N uniFB05 ; G 3305\nU 64262 ; WX 971 ; N uniFB06 ; G 3306\nU 65024 ; WX 0 ; N uniFE00 ; G 3307\nU 65025 ; WX 0 ; N uniFE01 ; G 3308\nU 65026 ; WX 0 ; N uniFE02 ; G 3309\nU 65027 ; WX 0 ; N uniFE03 ; G 3310\nU 65028 ; WX 0 ; N uniFE04 ; G 3311\nU 65029 ; WX 0 ; N uniFE05 ; G 3312\nU 65030 ; WX 0 ; N uniFE06 ; G 3313\nU 65031 ; WX 0 ; N uniFE07 ; G 3314\nU 65032 ; WX 0 ; N uniFE08 ; G 3315\nU 65033 ; WX 0 ; N uniFE09 ; G 3316\nU 65034 ; WX 0 ; N uniFE0A ; G 3317\nU 65035 ; WX 0 ; N uniFE0B ; G 3318\nU 65036 ; WX 0 ; N uniFE0C ; G 3319\nU 65037 ; WX 0 ; N uniFE0D ; G 3320\nU 65038 ; WX 0 ; N uniFE0E ; G 3321\nU 65039 ; WX 0 ; N uniFE0F ; G 3322\nU 65529 ; WX 0 ; N uniFFF9 ; G 3323\nU 65530 ; WX 0 ; N uniFFFA ; G 3324\nU 65531 ; WX 0 ; N uniFFFB ; G 3325\nU 65532 ; WX 0 ; N uniFFFC ; G 3326\nU 65533 ; WX 1113 ; N uniFFFD ; G 3327\nEndCharMetrics\nStartKernData \nStartKernPairs 1153\n\nKPX dollar seven -112\nKPX dollar nine -149\nKPX dollar colon -102\nKPX dollar less -102\nKPX dollar I -36\nKPX dollar W -36\nKPX dollar Y -83\nKPX dollar Z -83\nKPX dollar backslash -83\nKPX dollar questiondown -83\nKPX dollar Aacute -83\nKPX dollar Hbar -112\nKPX dollar hbar -36\nKPX dollar lacute -102\n\nKPX percent ampersand 38\nKPX percent asterisk 38\nKPX percent two 38\nKPX percent less -36\nKPX percent Egrave 38\nKPX percent Icircumflex 38\nKPX percent agrave 38\nKPX percent Ebreve 38\nKPX percent lacute -36\n\n\nKPX quotesingle nine -36\n\n\nKPX parenright dollar -120\nKPX parenright D -112\nKPX parenright H -112\nKPX parenright R -112\nKPX parenright U -36\nKPX parenright X -36\nKPX parenright cent -112\nKPX parenright sterling -112\nKPX parenright currency -112\nKPX parenright yen -112\nKPX parenright brokenbar -112\nKPX parenright section -112\nKPX parenright dieresis -112\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -112\nKPX parenright mu -112\nKPX parenright paragraph -112\nKPX parenright periodcentered -112\nKPX parenright cedilla -112\nKPX parenright ordmasculine -112\nKPX parenright guillemotright -36\nKPX parenright onequarter -36\nKPX parenright onehalf -36\nKPX parenright threequarters -36\nKPX parenright Yacute -112\nKPX parenright ebreve -112\nKPX parenright edotaccent -36\nKPX parenright ecaron -36\nKPX parenright dotlessi -36\n\n\n\nKPX period dollar -83\nKPX period ampersand -55\nKPX period two -55\nKPX period eight -73\nKPX period colon -73\nKPX period less -55\nKPX period H -45\nKPX period R -45\nKPX period X -45\nKPX period backslash -92\nKPX period ordfeminine -45\nKPX period guillemotleft -45\nKPX period logicalnot -45\nKPX period sfthyphen -45\nKPX period acute -45\nKPX period mu -45\nKPX period paragraph -45\nKPX period periodcentered -45\nKPX period cedilla -45\nKPX period ordmasculine -36\nKPX period guillemotright -45\nKPX period onequarter -45\nKPX period onehalf -45\nKPX period threequarters -45\nKPX period questiondown -92\nKPX period Aacute -92\nKPX period Egrave -55\nKPX period Icircumflex -55\nKPX period Yacute -45\nKPX period Ebreve -55\nKPX period ebreve -45\nKPX period Idot -73\nKPX period dotlessi -45\nKPX period lacute -55\n\nKPX slash seven -167\nKPX slash eight -112\nKPX slash nine -243\nKPX slash colon -139\nKPX slash less -131\nKPX slash backslash -73\nKPX slash questiondown -73\nKPX slash Aacute -73\nKPX slash Hbar -167\nKPX slash Idot -112\nKPX slash lacute -131\n\n\nKPX two nine -36\nKPX two semicolon -36\n\nKPX three dollar -149\nKPX three D -55\nKPX three H -55\nKPX three R -55\nKPX three cent -55\nKPX three sterling -55\nKPX three currency -55\nKPX three yen -55\nKPX three brokenbar -55\nKPX three section -55\nKPX three dieresis -55\nKPX three ordfeminine -55\nKPX three guillemotleft -55\nKPX three logicalnot -55\nKPX three sfthyphen -55\nKPX three acute -55\nKPX three mu -55\nKPX three paragraph -55\nKPX three periodcentered -55\nKPX three cedilla -55\nKPX three ordmasculine -55\nKPX three Yacute -55\nKPX three ebreve -55\n\n\nKPX five seven -36\nKPX five nine -73\nKPX five colon -45\nKPX five less -63\nKPX five D 47\nKPX five backslash -36\nKPX five cent 47\nKPX five sterling 47\nKPX five currency 47\nKPX five yen 47\nKPX five brokenbar 47\nKPX five section 47\nKPX five dieresis 47\nKPX five ordmasculine 38\nKPX five questiondown -36\nKPX five Aacute -36\nKPX five Hbar -36\nKPX five lacute -63\n\nKPX six six -45\nKPX six Gdotaccent -45\nKPX six Gcommaaccent -45\n\nKPX seven dollar -112\nKPX seven seven -73\nKPX seven D -196\nKPX seven F -235\nKPX seven H -235\nKPX seven R -235\nKPX seven U -149\nKPX seven V -188\nKPX seven X -188\nKPX seven Z -225\nKPX seven backslash -225\nKPX seven m -149\nKPX seven braceright -149\nKPX seven cent -196\nKPX seven sterling -196\nKPX seven currency -196\nKPX seven yen -196\nKPX seven brokenbar -196\nKPX seven section -196\nKPX seven dieresis -159\nKPX seven copyright -235\nKPX seven ordfeminine -235\nKPX seven guillemotleft -235\nKPX seven logicalnot -235\nKPX seven sfthyphen -235\nKPX seven acute -235\nKPX seven mu -235\nKPX seven paragraph -235\nKPX seven periodcentered -235\nKPX seven cedilla -235\nKPX seven ordmasculine -159\nKPX seven guillemotright -188\nKPX seven onequarter -188\nKPX seven onehalf -188\nKPX seven threequarters -188\nKPX seven questiondown -225\nKPX seven Aacute -225\nKPX seven Eacute -235\nKPX seven Idieresis -235\nKPX seven Yacute -235\nKPX seven ebreve -159\nKPX seven edotaccent -149\nKPX seven ecaron -149\nKPX seven gdotaccent -188\nKPX seven gcommaaccent -188\nKPX seven Hbar -73\nKPX seven dotlessi -188\n\nKPX eight dollar -63\n\nKPX nine dollar -159\nKPX nine two -36\nKPX nine D -188\nKPX nine H -188\nKPX nine L -36\nKPX nine R -188\nKPX nine X -131\nKPX nine backslash -83\nKPX nine cent -188\nKPX nine sterling -188\nKPX nine currency -188\nKPX nine yen -188\nKPX nine brokenbar -188\nKPX nine section -188\nKPX nine dieresis -188\nKPX nine ordfeminine -188\nKPX nine guillemotleft -188\nKPX nine logicalnot -188\nKPX nine sfthyphen -188\nKPX nine acute -188\nKPX nine mu -188\nKPX nine paragraph -188\nKPX nine periodcentered -188\nKPX nine cedilla -188\nKPX nine ordmasculine -188\nKPX nine guillemotright -131\nKPX nine onequarter -131\nKPX nine onehalf -131\nKPX nine threequarters -131\nKPX nine questiondown -83\nKPX nine Aacute -83\nKPX nine Yacute -188\nKPX nine Ebreve -36\nKPX nine ebreve -188\nKPX nine dotlessi -131\n\nKPX colon dollar -131\nKPX colon D -178\nKPX colon H -167\nKPX colon L -36\nKPX colon R -167\nKPX colon U -92\nKPX colon X -83\nKPX colon backslash -45\nKPX colon cent -178\nKPX colon sterling -178\nKPX colon currency -178\nKPX colon yen -178\nKPX colon brokenbar -178\nKPX colon section -178\nKPX colon dieresis -139\nKPX colon ordfeminine -167\nKPX colon guillemotleft -167\nKPX colon logicalnot -167\nKPX colon sfthyphen -167\nKPX colon acute -167\nKPX colon mu -167\nKPX colon paragraph -167\nKPX colon periodcentered -167\nKPX colon cedilla -167\nKPX colon ordmasculine -167\nKPX colon guillemotright -83\nKPX colon onequarter -83\nKPX colon onehalf -83\nKPX colon threequarters -83\nKPX colon questiondown -45\nKPX colon Aacute -45\nKPX colon Yacute -167\nKPX colon ebreve -167\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -83\n\nKPX semicolon dollar -73\nKPX semicolon ampersand -36\nKPX semicolon two -36\nKPX semicolon Egrave -36\nKPX semicolon Icircumflex -36\nKPX semicolon Ebreve -36\n\nKPX less dollar -131\nKPX less ampersand -36\nKPX less D -159\nKPX less H -178\nKPX less L -36\nKPX less R -178\nKPX less X -178\nKPX less cent -159\nKPX less sterling -159\nKPX less currency -159\nKPX less yen -159\nKPX less brokenbar -159\nKPX less section -159\nKPX less dieresis -159\nKPX less ordfeminine -178\nKPX less guillemotleft -178\nKPX less logicalnot -178\nKPX less sfthyphen -178\nKPX less acute -178\nKPX less mu -178\nKPX less paragraph -178\nKPX less periodcentered -178\nKPX less cedilla -178\nKPX less ordmasculine -178\nKPX less guillemotright -178\nKPX less onequarter -178\nKPX less onehalf -178\nKPX less threequarters -178\nKPX less Egrave -36\nKPX less Icircumflex -36\nKPX less Yacute -178\nKPX less ebreve -178\nKPX less dotlessi -178\n\n\n\n\n\n\n\n\n\n\nKPX m hyphen -73\nKPX m seven -149\nKPX m Hbar -149\n\nKPX braceright hyphen -73\nKPX braceright seven -149\nKPX braceright Hbar -149\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nKPX Eth nine -36\n\n\n\nKPX ucircumflex seven -167\nKPX ucircumflex eight -112\nKPX ucircumflex nine -243\nKPX ucircumflex colon -139\nKPX ucircumflex less -131\nKPX ucircumflex backslash -73\nKPX ucircumflex questiondown -73\nKPX ucircumflex Aacute -73\nKPX ucircumflex Hbar -167\nKPX ucircumflex Idot -112\nKPX ucircumflex lacute -131\n\nKPX ydieresis seven -167\nKPX ydieresis eight -112\nKPX ydieresis nine -243\nKPX ydieresis colon -139\nKPX ydieresis less -131\nKPX ydieresis backslash -73\nKPX ydieresis questiondown -73\nKPX ydieresis Aacute -73\nKPX ydieresis Hbar -167\nKPX ydieresis Idot -112\nKPX ydieresis lacute -131\n\nKPX Abreve O -241\n\nKPX abreve seven -167\nKPX abreve eight -112\nKPX abreve nine -243\nKPX abreve colon -139\nKPX abreve less -131\nKPX abreve backslash -73\nKPX abreve questiondown -73\nKPX abreve Aacute -73\nKPX abreve Hbar -167\nKPX abreve Idot -112\nKPX abreve lacute -131\n\n\n\nKPX Edotaccent seven -36\nKPX Edotaccent nine -73\nKPX Edotaccent colon -45\nKPX Edotaccent less -63\nKPX Edotaccent D 47\nKPX Edotaccent backslash -36\nKPX Edotaccent cent 47\nKPX Edotaccent sterling 47\nKPX Edotaccent currency 47\nKPX Edotaccent yen 47\nKPX Edotaccent brokenbar 47\nKPX Edotaccent section 47\nKPX Edotaccent dieresis 47\nKPX Edotaccent ordmasculine 38\nKPX Edotaccent questiondown -36\nKPX Edotaccent Aacute -36\nKPX Edotaccent Hbar -36\nKPX Edotaccent lacute -63\n\n\nKPX Ecaron seven -36\nKPX Ecaron nine -73\nKPX Ecaron colon -45\nKPX Ecaron less -63\nKPX Ecaron D 47\nKPX Ecaron backslash -36\nKPX Ecaron cent 47\nKPX Ecaron sterling 47\nKPX Ecaron currency 47\nKPX Ecaron yen 47\nKPX Ecaron brokenbar 47\nKPX Ecaron section 47\nKPX Ecaron dieresis 47\nKPX Ecaron ordmasculine 38\nKPX Ecaron questiondown -36\nKPX Ecaron Aacute -36\nKPX Ecaron Hbar -36\nKPX Ecaron lacute -63\n\n\nKPX Gdotaccent six -45\nKPX Gdotaccent Gdotaccent -45\nKPX Gdotaccent Gcommaaccent -45\n\nKPX Gcommaaccent six -45\nKPX Gcommaaccent Gdotaccent -45\nKPX Gcommaaccent Gcommaaccent -45\n\nKPX Hbar dollar -112\nKPX Hbar seven -73\nKPX Hbar D -196\nKPX Hbar F -235\nKPX Hbar H -235\nKPX Hbar R -235\nKPX Hbar U -149\nKPX Hbar V -188\nKPX Hbar X -188\nKPX Hbar Z -225\nKPX Hbar backslash -225\nKPX Hbar m -149\nKPX Hbar braceright -149\nKPX Hbar cent -196\nKPX Hbar sterling -196\nKPX Hbar currency -196\nKPX Hbar yen -196\nKPX Hbar brokenbar -196\nKPX Hbar section -196\nKPX Hbar dieresis -159\nKPX Hbar copyright -235\nKPX Hbar ordfeminine -235\nKPX Hbar guillemotleft -235\nKPX Hbar logicalnot -235\nKPX Hbar sfthyphen -235\nKPX Hbar acute -235\nKPX Hbar mu -235\nKPX Hbar paragraph -235\nKPX Hbar periodcentered -235\nKPX Hbar cedilla -235\nKPX Hbar ordmasculine -159\nKPX Hbar guillemotright -188\nKPX Hbar onequarter -188\nKPX Hbar onehalf -188\nKPX Hbar threequarters -188\nKPX Hbar questiondown -225\nKPX Hbar Aacute -225\nKPX Hbar Eacute -235\nKPX Hbar Idieresis -235\nKPX Hbar Yacute -235\nKPX Hbar ebreve -159\nKPX Hbar edotaccent -149\nKPX Hbar ecaron -149\nKPX Hbar gdotaccent -188\nKPX Hbar gcommaaccent -188\nKPX Hbar Hbar -73\nKPX Hbar dotlessi -188\n\nKPX Idot dollar -63\n\nKPX lacute dollar -131\nKPX lacute ampersand -36\nKPX lacute D -159\nKPX lacute H -178\nKPX lacute L -36\nKPX lacute R -178\nKPX lacute X -178\nKPX lacute cent -159\nKPX lacute sterling -159\nKPX lacute currency -159\nKPX lacute yen -159\nKPX lacute brokenbar -159\nKPX lacute section -159\nKPX lacute dieresis -159\nKPX lacute ordfeminine -178\nKPX lacute guillemotleft -178\nKPX lacute logicalnot -178\nKPX lacute sfthyphen -178\nKPX lacute acute -178\nKPX lacute mu -178\nKPX lacute paragraph -178\nKPX lacute periodcentered -178\nKPX lacute cedilla -178\nKPX lacute ordmasculine -178\nKPX lacute guillemotright -178\nKPX lacute onequarter -178\nKPX lacute onehalf -178\nKPX lacute threequarters -178\nKPX lacute Egrave -36\nKPX lacute Icircumflex -36\nKPX lacute Yacute -178\nKPX lacute ebreve -178\nKPX lacute dotlessi -178\n\n\nKPX uni027D dollar -282\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSerif-Italic.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Serif\nFontSubfamily Italic\nUniqueID DejaVu Serif Italic\nFullName DejaVu Serif Italic\nVersion Version 2.37\nPostScriptName DejaVuSerif-Italic\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Serif\nPreferredSubfamily Italic\nWeight Medium\nItalicAngle -11\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -839 -347 1645 1109\nStartCharMetrics 3507\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 402 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 890 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 338 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 536 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 722 ; N A ; G 36\nU 66 ; WX 735 ; N B ; G 37\nU 67 ; WX 765 ; N C ; G 38\nU 68 ; WX 802 ; N D ; G 39\nU 69 ; WX 730 ; N E ; G 40\nU 70 ; WX 694 ; N F ; G 41\nU 71 ; WX 799 ; N G ; G 42\nU 72 ; WX 872 ; N H ; G 43\nU 73 ; WX 395 ; N I ; G 44\nU 74 ; WX 401 ; N J ; G 45\nU 75 ; WX 747 ; N K ; G 46\nU 76 ; WX 664 ; N L ; G 47\nU 77 ; WX 1024 ; N M ; G 48\nU 78 ; WX 875 ; N N ; G 49\nU 79 ; WX 820 ; N O ; G 50\nU 80 ; WX 673 ; N P ; G 51\nU 81 ; WX 820 ; N Q ; G 52\nU 82 ; WX 753 ; N R ; G 53\nU 83 ; WX 685 ; N S ; G 54\nU 84 ; WX 667 ; N T ; G 55\nU 85 ; WX 843 ; N U ; G 56\nU 86 ; WX 722 ; N V ; G 57\nU 87 ; WX 1028 ; N W ; G 58\nU 88 ; WX 712 ; N X ; G 59\nU 89 ; WX 660 ; N Y ; G 60\nU 90 ; WX 695 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 596 ; N a ; G 68\nU 98 ; WX 640 ; N b ; G 69\nU 99 ; WX 560 ; N c ; G 70\nU 100 ; WX 640 ; N d ; G 71\nU 101 ; WX 592 ; N e ; G 72\nU 102 ; WX 370 ; N f ; G 73\nU 103 ; WX 640 ; N g ; G 74\nU 104 ; WX 644 ; N h ; G 75\nU 105 ; WX 320 ; N i ; G 76\nU 106 ; WX 310 ; N j ; G 77\nU 107 ; WX 606 ; N k ; G 78\nU 108 ; WX 320 ; N l ; G 79\nU 109 ; WX 948 ; N m ; G 80\nU 110 ; WX 644 ; N n ; G 81\nU 111 ; WX 602 ; N o ; G 82\nU 112 ; WX 640 ; N p ; G 83\nU 113 ; WX 640 ; N q ; G 84\nU 114 ; WX 478 ; N r ; G 85\nU 115 ; WX 513 ; N s ; G 86\nU 116 ; WX 402 ; N t ; G 87\nU 117 ; WX 644 ; N u ; G 88\nU 118 ; WX 565 ; N v ; G 89\nU 119 ; WX 856 ; N w ; G 90\nU 120 ; WX 564 ; N x ; G 91\nU 121 ; WX 565 ; N y ; G 92\nU 122 ; WX 527 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 402 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 475 ; N ordfeminine ; G 108\nU 171 ; WX 612 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 338 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 650 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 470 ; N ordmasculine ; G 124\nU 187 ; WX 612 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 536 ; N questiondown ; G 129\nU 192 ; WX 722 ; N Agrave ; G 130\nU 193 ; WX 722 ; N Aacute ; G 131\nU 194 ; WX 722 ; N Acircumflex ; G 132\nU 195 ; WX 722 ; N Atilde ; G 133\nU 196 ; WX 722 ; N Adieresis ; G 134\nU 197 ; WX 722 ; N Aring ; G 135\nU 198 ; WX 1001 ; N AE ; G 136\nU 199 ; WX 765 ; N Ccedilla ; G 137\nU 200 ; WX 730 ; N Egrave ; G 138\nU 201 ; WX 730 ; N Eacute ; G 139\nU 202 ; WX 730 ; N Ecircumflex ; G 140\nU 203 ; WX 730 ; N Edieresis ; G 141\nU 204 ; WX 395 ; N Igrave ; G 142\nU 205 ; WX 395 ; N Iacute ; G 143\nU 206 ; WX 395 ; N Icircumflex ; G 144\nU 207 ; WX 395 ; N Idieresis ; G 145\nU 208 ; WX 807 ; N Eth ; G 146\nU 209 ; WX 875 ; N Ntilde ; G 147\nU 210 ; WX 820 ; N Ograve ; G 148\nU 211 ; WX 820 ; N Oacute ; G 149\nU 212 ; WX 820 ; N Ocircumflex ; G 150\nU 213 ; WX 820 ; N Otilde ; G 151\nU 214 ; WX 820 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 820 ; N Oslash ; G 154\nU 217 ; WX 843 ; N Ugrave ; G 155\nU 218 ; WX 843 ; N Uacute ; G 156\nU 219 ; WX 843 ; N Ucircumflex ; G 157\nU 220 ; WX 843 ; N Udieresis ; G 158\nU 221 ; WX 660 ; N Yacute ; G 159\nU 222 ; WX 676 ; N Thorn ; G 160\nU 223 ; WX 668 ; N germandbls ; G 161\nU 224 ; WX 596 ; N agrave ; G 162\nU 225 ; WX 596 ; N aacute ; G 163\nU 226 ; WX 596 ; N acircumflex ; G 164\nU 227 ; WX 596 ; N atilde ; G 165\nU 228 ; WX 596 ; N adieresis ; G 166\nU 229 ; WX 596 ; N aring ; G 167\nU 230 ; WX 940 ; N ae ; G 168\nU 231 ; WX 560 ; N ccedilla ; G 169\nU 232 ; WX 592 ; N egrave ; G 170\nU 233 ; WX 592 ; N eacute ; G 171\nU 234 ; WX 592 ; N ecircumflex ; G 172\nU 235 ; WX 592 ; N edieresis ; G 173\nU 236 ; WX 320 ; N igrave ; G 174\nU 237 ; WX 320 ; N iacute ; G 175\nU 238 ; WX 320 ; N icircumflex ; G 176\nU 239 ; WX 320 ; N idieresis ; G 177\nU 240 ; WX 602 ; N eth ; G 178\nU 241 ; WX 644 ; N ntilde ; G 179\nU 242 ; WX 602 ; N ograve ; G 180\nU 243 ; WX 602 ; N oacute ; G 181\nU 244 ; WX 602 ; N ocircumflex ; G 182\nU 245 ; WX 602 ; N otilde ; G 183\nU 246 ; WX 602 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 602 ; N oslash ; G 186\nU 249 ; WX 644 ; N ugrave ; G 187\nU 250 ; WX 644 ; N uacute ; G 188\nU 251 ; WX 644 ; N ucircumflex ; G 189\nU 252 ; WX 644 ; N udieresis ; G 190\nU 253 ; WX 565 ; N yacute ; G 191\nU 254 ; WX 640 ; N thorn ; G 192\nU 255 ; WX 565 ; N ydieresis ; G 193\nU 256 ; WX 722 ; N Amacron ; G 194\nU 257 ; WX 596 ; N amacron ; G 195\nU 258 ; WX 722 ; N Abreve ; G 196\nU 259 ; WX 596 ; N abreve ; G 197\nU 260 ; WX 722 ; N Aogonek ; G 198\nU 261 ; WX 596 ; N aogonek ; G 199\nU 262 ; WX 765 ; N Cacute ; G 200\nU 263 ; WX 560 ; N cacute ; G 201\nU 264 ; WX 765 ; N Ccircumflex ; G 202\nU 265 ; WX 560 ; N ccircumflex ; G 203\nU 266 ; WX 765 ; N Cdotaccent ; G 204\nU 267 ; WX 560 ; N cdotaccent ; G 205\nU 268 ; WX 765 ; N Ccaron ; G 206\nU 269 ; WX 560 ; N ccaron ; G 207\nU 270 ; WX 802 ; N Dcaron ; G 208\nU 271 ; WX 640 ; N dcaron ; G 209\nU 272 ; WX 807 ; N Dcroat ; G 210\nU 273 ; WX 640 ; N dmacron ; G 211\nU 274 ; WX 730 ; N Emacron ; G 212\nU 275 ; WX 592 ; N emacron ; G 213\nU 276 ; WX 730 ; N Ebreve ; G 214\nU 277 ; WX 592 ; N ebreve ; G 215\nU 278 ; WX 730 ; N Edotaccent ; G 216\nU 279 ; WX 592 ; N edotaccent ; G 217\nU 280 ; WX 730 ; N Eogonek ; G 218\nU 281 ; WX 592 ; N eogonek ; G 219\nU 282 ; WX 730 ; N Ecaron ; G 220\nU 283 ; WX 592 ; N ecaron ; G 221\nU 284 ; WX 799 ; N Gcircumflex ; G 222\nU 285 ; WX 640 ; N gcircumflex ; G 223\nU 286 ; WX 799 ; N Gbreve ; G 224\nU 287 ; WX 640 ; N gbreve ; G 225\nU 288 ; WX 799 ; N Gdotaccent ; G 226\nU 289 ; WX 640 ; N gdotaccent ; G 227\nU 290 ; WX 799 ; N Gcommaaccent ; G 228\nU 291 ; WX 640 ; N gcommaaccent ; G 229\nU 292 ; WX 872 ; N Hcircumflex ; G 230\nU 293 ; WX 644 ; N hcircumflex ; G 231\nU 294 ; WX 872 ; N Hbar ; G 232\nU 295 ; WX 644 ; N hbar ; G 233\nU 296 ; WX 395 ; N Itilde ; G 234\nU 297 ; WX 320 ; N itilde ; G 235\nU 298 ; WX 395 ; N Imacron ; G 236\nU 299 ; WX 320 ; N imacron ; G 237\nU 300 ; WX 395 ; N Ibreve ; G 238\nU 301 ; WX 320 ; N ibreve ; G 239\nU 302 ; WX 395 ; N Iogonek ; G 240\nU 303 ; WX 320 ; N iogonek ; G 241\nU 304 ; WX 395 ; N Idot ; G 242\nU 305 ; WX 320 ; N dotlessi ; G 243\nU 306 ; WX 801 ; N IJ ; G 244\nU 307 ; WX 533 ; N ij ; G 245\nU 308 ; WX 401 ; N Jcircumflex ; G 246\nU 309 ; WX 310 ; N jcircumflex ; G 247\nU 310 ; WX 747 ; N Kcommaaccent ; G 248\nU 311 ; WX 606 ; N kcommaaccent ; G 249\nU 312 ; WX 606 ; N kgreenlandic ; G 250\nU 313 ; WX 664 ; N Lacute ; G 251\nU 314 ; WX 320 ; N lacute ; G 252\nU 315 ; WX 664 ; N Lcommaaccent ; G 253\nU 316 ; WX 320 ; N lcommaaccent ; G 254\nU 317 ; WX 664 ; N Lcaron ; G 255\nU 318 ; WX 400 ; N lcaron ; G 256\nU 319 ; WX 671 ; N Ldot ; G 257\nU 320 ; WX 465 ; N ldot ; G 258\nU 321 ; WX 669 ; N Lslash ; G 259\nU 322 ; WX 324 ; N lslash ; G 260\nU 323 ; WX 875 ; N Nacute ; G 261\nU 324 ; WX 644 ; N nacute ; G 262\nU 325 ; WX 875 ; N Ncommaaccent ; G 263\nU 326 ; WX 644 ; N ncommaaccent ; G 264\nU 327 ; WX 875 ; N Ncaron ; G 265\nU 328 ; WX 644 ; N ncaron ; G 266\nU 329 ; WX 866 ; N napostrophe ; G 267\nU 330 ; WX 843 ; N Eng ; G 268\nU 331 ; WX 644 ; N eng ; G 269\nU 332 ; WX 820 ; N Omacron ; G 270\nU 333 ; WX 602 ; N omacron ; G 271\nU 334 ; WX 820 ; N Obreve ; G 272\nU 335 ; WX 602 ; N obreve ; G 273\nU 336 ; WX 820 ; N Ohungarumlaut ; G 274\nU 337 ; WX 602 ; N ohungarumlaut ; G 275\nU 338 ; WX 1137 ; N OE ; G 276\nU 339 ; WX 989 ; N oe ; G 277\nU 340 ; WX 753 ; N Racute ; G 278\nU 341 ; WX 478 ; N racute ; G 279\nU 342 ; WX 753 ; N Rcommaaccent ; G 280\nU 343 ; WX 478 ; N rcommaaccent ; G 281\nU 344 ; WX 753 ; N Rcaron ; G 282\nU 345 ; WX 478 ; N rcaron ; G 283\nU 346 ; WX 685 ; N Sacute ; G 284\nU 347 ; WX 513 ; N sacute ; G 285\nU 348 ; WX 685 ; N Scircumflex ; G 286\nU 349 ; WX 513 ; N scircumflex ; G 287\nU 350 ; WX 685 ; N Scedilla ; G 288\nU 351 ; WX 513 ; N scedilla ; G 289\nU 352 ; WX 685 ; N Scaron ; G 290\nU 353 ; WX 513 ; N scaron ; G 291\nU 354 ; WX 667 ; N Tcommaaccent ; G 292\nU 355 ; WX 402 ; N tcommaaccent ; G 293\nU 356 ; WX 667 ; N Tcaron ; G 294\nU 357 ; WX 402 ; N tcaron ; G 295\nU 358 ; WX 667 ; N Tbar ; G 296\nU 359 ; WX 402 ; N tbar ; G 297\nU 360 ; WX 843 ; N Utilde ; G 298\nU 361 ; WX 644 ; N utilde ; G 299\nU 362 ; WX 843 ; N Umacron ; G 300\nU 363 ; WX 644 ; N umacron ; G 301\nU 364 ; WX 843 ; N Ubreve ; G 302\nU 365 ; WX 644 ; N ubreve ; G 303\nU 366 ; WX 843 ; N Uring ; G 304\nU 367 ; WX 644 ; N uring ; G 305\nU 368 ; WX 843 ; N Uhungarumlaut ; G 306\nU 369 ; WX 644 ; N uhungarumlaut ; G 307\nU 370 ; WX 843 ; N Uogonek ; G 308\nU 371 ; WX 644 ; N uogonek ; G 309\nU 372 ; WX 1028 ; N Wcircumflex ; G 310\nU 373 ; WX 856 ; N wcircumflex ; G 311\nU 374 ; WX 660 ; N Ycircumflex ; G 312\nU 375 ; WX 565 ; N ycircumflex ; G 313\nU 376 ; WX 660 ; N Ydieresis ; G 314\nU 377 ; WX 695 ; N Zacute ; G 315\nU 378 ; WX 527 ; N zacute ; G 316\nU 379 ; WX 695 ; N Zdotaccent ; G 317\nU 380 ; WX 527 ; N zdotaccent ; G 318\nU 381 ; WX 695 ; N Zcaron ; G 319\nU 382 ; WX 527 ; N zcaron ; G 320\nU 383 ; WX 370 ; N longs ; G 321\nU 384 ; WX 640 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 735 ; N uni0182 ; G 324\nU 387 ; WX 640 ; N uni0183 ; G 325\nU 388 ; WX 735 ; N uni0184 ; G 326\nU 389 ; WX 640 ; N uni0185 ; G 327\nU 390 ; WX 765 ; N uni0186 ; G 328\nU 391 ; WX 765 ; N uni0187 ; G 329\nU 392 ; WX 560 ; N uni0188 ; G 330\nU 393 ; WX 807 ; N uni0189 ; G 331\nU 394 ; WX 802 ; N uni018A ; G 332\nU 395 ; WX 735 ; N uni018B ; G 333\nU 396 ; WX 640 ; N uni018C ; G 334\nU 397 ; WX 602 ; N uni018D ; G 335\nU 398 ; WX 730 ; N uni018E ; G 336\nU 399 ; WX 820 ; N uni018F ; G 337\nU 400 ; WX 623 ; N uni0190 ; G 338\nU 401 ; WX 694 ; N uni0191 ; G 339\nU 402 ; WX 370 ; N florin ; G 340\nU 403 ; WX 799 ; N uni0193 ; G 341\nU 404 ; WX 712 ; N uni0194 ; G 342\nU 405 ; WX 932 ; N uni0195 ; G 343\nU 406 ; WX 395 ; N uni0196 ; G 344\nU 407 ; WX 395 ; N uni0197 ; G 345\nU 408 ; WX 747 ; N uni0198 ; G 346\nU 409 ; WX 606 ; N uni0199 ; G 347\nU 410 ; WX 320 ; N uni019A ; G 348\nU 411 ; WX 634 ; N uni019B ; G 349\nU 412 ; WX 948 ; N uni019C ; G 350\nU 413 ; WX 875 ; N uni019D ; G 351\nU 414 ; WX 644 ; N uni019E ; G 352\nU 415 ; WX 820 ; N uni019F ; G 353\nU 416 ; WX 820 ; N Ohorn ; G 354\nU 417 ; WX 602 ; N ohorn ; G 355\nU 418 ; WX 1040 ; N uni01A2 ; G 356\nU 419 ; WX 807 ; N uni01A3 ; G 357\nU 420 ; WX 673 ; N uni01A4 ; G 358\nU 421 ; WX 640 ; N uni01A5 ; G 359\nU 422 ; WX 753 ; N uni01A6 ; G 360\nU 423 ; WX 685 ; N uni01A7 ; G 361\nU 424 ; WX 513 ; N uni01A8 ; G 362\nU 425 ; WX 707 ; N uni01A9 ; G 363\nU 426 ; WX 324 ; N uni01AA ; G 364\nU 427 ; WX 402 ; N uni01AB ; G 365\nU 428 ; WX 667 ; N uni01AC ; G 366\nU 429 ; WX 402 ; N uni01AD ; G 367\nU 430 ; WX 667 ; N uni01AE ; G 368\nU 431 ; WX 843 ; N Uhorn ; G 369\nU 432 ; WX 644 ; N uhorn ; G 370\nU 433 ; WX 829 ; N uni01B1 ; G 371\nU 434 ; WX 760 ; N uni01B2 ; G 372\nU 435 ; WX 738 ; N uni01B3 ; G 373\nU 436 ; WX 745 ; N uni01B4 ; G 374\nU 437 ; WX 695 ; N uni01B5 ; G 375\nU 438 ; WX 527 ; N uni01B6 ; G 376\nU 439 ; WX 564 ; N uni01B7 ; G 377\nU 440 ; WX 564 ; N uni01B8 ; G 378\nU 441 ; WX 564 ; N uni01B9 ; G 379\nU 442 ; WX 564 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 687 ; N uni01BC ; G 382\nU 445 ; WX 564 ; N uni01BD ; G 383\nU 446 ; WX 536 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1497 ; N uni01C4 ; G 390\nU 453 ; WX 1329 ; N uni01C5 ; G 391\nU 454 ; WX 1167 ; N uni01C6 ; G 392\nU 455 ; WX 1065 ; N uni01C7 ; G 393\nU 456 ; WX 974 ; N uni01C8 ; G 394\nU 457 ; WX 630 ; N uni01C9 ; G 395\nU 458 ; WX 1276 ; N uni01CA ; G 396\nU 459 ; WX 1185 ; N uni01CB ; G 397\nU 460 ; WX 954 ; N uni01CC ; G 398\nU 461 ; WX 722 ; N uni01CD ; G 399\nU 462 ; WX 596 ; N uni01CE ; G 400\nU 463 ; WX 395 ; N uni01CF ; G 401\nU 464 ; WX 320 ; N uni01D0 ; G 402\nU 465 ; WX 820 ; N uni01D1 ; G 403\nU 466 ; WX 602 ; N uni01D2 ; G 404\nU 467 ; WX 843 ; N uni01D3 ; G 405\nU 468 ; WX 644 ; N uni01D4 ; G 406\nU 469 ; WX 843 ; N uni01D5 ; G 407\nU 470 ; WX 644 ; N uni01D6 ; G 408\nU 471 ; WX 843 ; N uni01D7 ; G 409\nU 472 ; WX 644 ; N uni01D8 ; G 410\nU 473 ; WX 843 ; N uni01D9 ; G 411\nU 474 ; WX 644 ; N uni01DA ; G 412\nU 475 ; WX 843 ; N uni01DB ; G 413\nU 476 ; WX 644 ; N uni01DC ; G 414\nU 477 ; WX 592 ; N uni01DD ; G 415\nU 478 ; WX 722 ; N uni01DE ; G 416\nU 479 ; WX 596 ; N uni01DF ; G 417\nU 480 ; WX 722 ; N uni01E0 ; G 418\nU 481 ; WX 596 ; N uni01E1 ; G 419\nU 482 ; WX 1001 ; N uni01E2 ; G 420\nU 483 ; WX 940 ; N uni01E3 ; G 421\nU 484 ; WX 848 ; N uni01E4 ; G 422\nU 485 ; WX 640 ; N uni01E5 ; G 423\nU 486 ; WX 799 ; N Gcaron ; G 424\nU 487 ; WX 640 ; N gcaron ; G 425\nU 488 ; WX 747 ; N uni01E8 ; G 426\nU 489 ; WX 606 ; N uni01E9 ; G 427\nU 490 ; WX 820 ; N uni01EA ; G 428\nU 491 ; WX 602 ; N uni01EB ; G 429\nU 492 ; WX 820 ; N uni01EC ; G 430\nU 493 ; WX 602 ; N uni01ED ; G 431\nU 494 ; WX 564 ; N uni01EE ; G 432\nU 495 ; WX 564 ; N uni01EF ; G 433\nU 496 ; WX 320 ; N uni01F0 ; G 434\nU 497 ; WX 1497 ; N uni01F1 ; G 435\nU 498 ; WX 1329 ; N uni01F2 ; G 436\nU 499 ; WX 1167 ; N uni01F3 ; G 437\nU 500 ; WX 799 ; N uni01F4 ; G 438\nU 501 ; WX 640 ; N uni01F5 ; G 439\nU 502 ; WX 1154 ; N uni01F6 ; G 440\nU 503 ; WX 707 ; N uni01F7 ; G 441\nU 504 ; WX 875 ; N uni01F8 ; G 442\nU 505 ; WX 644 ; N uni01F9 ; G 443\nU 506 ; WX 722 ; N Aringacute ; G 444\nU 507 ; WX 596 ; N aringacute ; G 445\nU 508 ; WX 1001 ; N AEacute ; G 446\nU 509 ; WX 940 ; N aeacute ; G 447\nU 510 ; WX 820 ; N Oslashacute ; G 448\nU 511 ; WX 602 ; N oslashacute ; G 449\nU 512 ; WX 722 ; N uni0200 ; G 450\nU 513 ; WX 596 ; N uni0201 ; G 451\nU 514 ; WX 722 ; N uni0202 ; G 452\nU 515 ; WX 596 ; N uni0203 ; G 453\nU 516 ; WX 730 ; N uni0204 ; G 454\nU 517 ; WX 592 ; N uni0205 ; G 455\nU 518 ; WX 730 ; N uni0206 ; G 456\nU 519 ; WX 592 ; N uni0207 ; G 457\nU 520 ; WX 395 ; N uni0208 ; G 458\nU 521 ; WX 320 ; N uni0209 ; G 459\nU 522 ; WX 395 ; N uni020A ; G 460\nU 523 ; WX 320 ; N uni020B ; G 461\nU 524 ; WX 820 ; N uni020C ; G 462\nU 525 ; WX 602 ; N uni020D ; G 463\nU 526 ; WX 820 ; N uni020E ; G 464\nU 527 ; WX 602 ; N uni020F ; G 465\nU 528 ; WX 753 ; N uni0210 ; G 466\nU 529 ; WX 478 ; N uni0211 ; G 467\nU 530 ; WX 753 ; N uni0212 ; G 468\nU 531 ; WX 478 ; N uni0213 ; G 469\nU 532 ; WX 843 ; N uni0214 ; G 470\nU 533 ; WX 644 ; N uni0215 ; G 471\nU 534 ; WX 843 ; N uni0216 ; G 472\nU 535 ; WX 644 ; N uni0217 ; G 473\nU 536 ; WX 685 ; N Scommaaccent ; G 474\nU 537 ; WX 513 ; N scommaaccent ; G 475\nU 538 ; WX 667 ; N uni021A ; G 476\nU 539 ; WX 402 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 872 ; N uni021E ; G 480\nU 543 ; WX 644 ; N uni021F ; G 481\nU 544 ; WX 843 ; N uni0220 ; G 482\nU 545 ; WX 814 ; N uni0221 ; G 483\nU 546 ; WX 572 ; N uni0222 ; G 484\nU 547 ; WX 552 ; N uni0223 ; G 485\nU 548 ; WX 695 ; N uni0224 ; G 486\nU 549 ; WX 527 ; N uni0225 ; G 487\nU 550 ; WX 722 ; N uni0226 ; G 488\nU 551 ; WX 596 ; N uni0227 ; G 489\nU 552 ; WX 730 ; N uni0228 ; G 490\nU 553 ; WX 592 ; N uni0229 ; G 491\nU 554 ; WX 820 ; N uni022A ; G 492\nU 555 ; WX 602 ; N uni022B ; G 493\nU 556 ; WX 820 ; N uni022C ; G 494\nU 557 ; WX 602 ; N uni022D ; G 495\nU 558 ; WX 820 ; N uni022E ; G 496\nU 559 ; WX 602 ; N uni022F ; G 497\nU 560 ; WX 820 ; N uni0230 ; G 498\nU 561 ; WX 602 ; N uni0231 ; G 499\nU 562 ; WX 660 ; N uni0232 ; G 500\nU 563 ; WX 565 ; N uni0233 ; G 501\nU 564 ; WX 500 ; N uni0234 ; G 502\nU 565 ; WX 832 ; N uni0235 ; G 503\nU 566 ; WX 494 ; N uni0236 ; G 504\nU 567 ; WX 310 ; N dotlessj ; G 505\nU 568 ; WX 960 ; N uni0238 ; G 506\nU 569 ; WX 960 ; N uni0239 ; G 507\nU 570 ; WX 722 ; N uni023A ; G 508\nU 571 ; WX 765 ; N uni023B ; G 509\nU 572 ; WX 560 ; N uni023C ; G 510\nU 573 ; WX 664 ; N uni023D ; G 511\nU 574 ; WX 667 ; N uni023E ; G 512\nU 575 ; WX 513 ; N uni023F ; G 513\nU 576 ; WX 527 ; N uni0240 ; G 514\nU 577 ; WX 583 ; N uni0241 ; G 515\nU 578 ; WX 464 ; N uni0242 ; G 516\nU 579 ; WX 735 ; N uni0243 ; G 517\nU 580 ; WX 843 ; N uni0244 ; G 518\nU 581 ; WX 722 ; N uni0245 ; G 519\nU 582 ; WX 730 ; N uni0246 ; G 520\nU 583 ; WX 592 ; N uni0247 ; G 521\nU 584 ; WX 401 ; N uni0248 ; G 522\nU 585 ; WX 315 ; N uni0249 ; G 523\nU 586 ; WX 782 ; N uni024A ; G 524\nU 587 ; WX 640 ; N uni024B ; G 525\nU 588 ; WX 753 ; N uni024C ; G 526\nU 589 ; WX 478 ; N uni024D ; G 527\nU 590 ; WX 660 ; N uni024E ; G 528\nU 591 ; WX 565 ; N uni024F ; G 529\nU 592 ; WX 596 ; N uni0250 ; G 530\nU 593 ; WX 675 ; N uni0251 ; G 531\nU 594 ; WX 675 ; N uni0252 ; G 532\nU 595 ; WX 640 ; N uni0253 ; G 533\nU 596 ; WX 560 ; N uni0254 ; G 534\nU 597 ; WX 560 ; N uni0255 ; G 535\nU 598 ; WX 647 ; N uni0256 ; G 536\nU 599 ; WX 683 ; N uni0257 ; G 537\nU 600 ; WX 592 ; N uni0258 ; G 538\nU 601 ; WX 592 ; N uni0259 ; G 539\nU 602 ; WX 843 ; N uni025A ; G 540\nU 603 ; WX 537 ; N uni025B ; G 541\nU 604 ; WX 509 ; N uni025C ; G 542\nU 605 ; WX 773 ; N uni025D ; G 543\nU 606 ; WX 613 ; N uni025E ; G 544\nU 607 ; WX 315 ; N uni025F ; G 545\nU 608 ; WX 683 ; N uni0260 ; G 546\nU 609 ; WX 640 ; N uni0261 ; G 547\nU 610 ; WX 580 ; N uni0262 ; G 548\nU 611 ; WX 599 ; N uni0263 ; G 549\nU 612 ; WX 564 ; N uni0264 ; G 550\nU 613 ; WX 644 ; N uni0265 ; G 551\nU 614 ; WX 644 ; N uni0266 ; G 552\nU 615 ; WX 644 ; N uni0267 ; G 553\nU 616 ; WX 320 ; N uni0268 ; G 554\nU 617 ; WX 392 ; N uni0269 ; G 555\nU 618 ; WX 320 ; N uni026A ; G 556\nU 619 ; WX 380 ; N uni026B ; G 557\nU 620 ; WX 454 ; N uni026C ; G 558\nU 621 ; WX 363 ; N uni026D ; G 559\nU 622 ; WX 704 ; N uni026E ; G 560\nU 623 ; WX 948 ; N uni026F ; G 561\nU 624 ; WX 948 ; N uni0270 ; G 562\nU 625 ; WX 948 ; N uni0271 ; G 563\nU 626 ; WX 644 ; N uni0272 ; G 564\nU 627 ; WX 694 ; N uni0273 ; G 565\nU 628 ; WX 646 ; N uni0274 ; G 566\nU 629 ; WX 602 ; N uni0275 ; G 567\nU 630 ; WX 790 ; N uni0276 ; G 568\nU 631 ; WX 821 ; N uni0277 ; G 569\nU 632 ; WX 692 ; N uni0278 ; G 570\nU 633 ; WX 501 ; N uni0279 ; G 571\nU 634 ; WX 501 ; N uni027A ; G 572\nU 635 ; WX 551 ; N uni027B ; G 573\nU 636 ; WX 478 ; N uni027C ; G 574\nU 637 ; WX 478 ; N uni027D ; G 575\nU 638 ; WX 453 ; N uni027E ; G 576\nU 639 ; WX 453 ; N uni027F ; G 577\nU 640 ; WX 581 ; N uni0280 ; G 578\nU 641 ; WX 581 ; N uni0281 ; G 579\nU 642 ; WX 513 ; N uni0282 ; G 580\nU 643 ; WX 271 ; N uni0283 ; G 581\nU 644 ; WX 370 ; N uni0284 ; G 582\nU 645 ; WX 487 ; N uni0285 ; G 583\nU 646 ; WX 324 ; N uni0286 ; G 584\nU 647 ; WX 402 ; N uni0287 ; G 585\nU 648 ; WX 402 ; N uni0288 ; G 586\nU 649 ; WX 644 ; N uni0289 ; G 587\nU 650 ; WX 620 ; N uni028A ; G 588\nU 651 ; WX 608 ; N uni028B ; G 589\nU 652 ; WX 565 ; N uni028C ; G 590\nU 653 ; WX 856 ; N uni028D ; G 591\nU 654 ; WX 565 ; N uni028E ; G 592\nU 655 ; WX 655 ; N uni028F ; G 593\nU 656 ; WX 597 ; N uni0290 ; G 594\nU 657 ; WX 560 ; N uni0291 ; G 595\nU 658 ; WX 564 ; N uni0292 ; G 596\nU 659 ; WX 560 ; N uni0293 ; G 597\nU 660 ; WX 536 ; N uni0294 ; G 598\nU 661 ; WX 536 ; N uni0295 ; G 599\nU 662 ; WX 536 ; N uni0296 ; G 600\nU 663 ; WX 420 ; N uni0297 ; G 601\nU 664 ; WX 820 ; N uni0298 ; G 602\nU 665 ; WX 563 ; N uni0299 ; G 603\nU 666 ; WX 613 ; N uni029A ; G 604\nU 667 ; WX 660 ; N uni029B ; G 605\nU 668 ; WX 667 ; N uni029C ; G 606\nU 669 ; WX 366 ; N uni029D ; G 607\nU 670 ; WX 606 ; N uni029E ; G 608\nU 671 ; WX 543 ; N uni029F ; G 609\nU 672 ; WX 683 ; N uni02A0 ; G 610\nU 673 ; WX 536 ; N uni02A1 ; G 611\nU 674 ; WX 536 ; N uni02A2 ; G 612\nU 675 ; WX 996 ; N uni02A3 ; G 613\nU 676 ; WX 1033 ; N uni02A4 ; G 614\nU 677 ; WX 998 ; N uni02A5 ; G 615\nU 678 ; WX 823 ; N uni02A6 ; G 616\nU 679 ; WX 598 ; N uni02A7 ; G 617\nU 680 ; WX 825 ; N uni02A8 ; G 618\nU 681 ; WX 894 ; N uni02A9 ; G 619\nU 682 ; WX 725 ; N uni02AA ; G 620\nU 683 ; WX 676 ; N uni02AB ; G 621\nU 684 ; WX 598 ; N uni02AC ; G 622\nU 685 ; WX 443 ; N uni02AD ; G 623\nU 686 ; WX 781 ; N uni02AE ; G 624\nU 687 ; WX 767 ; N uni02AF ; G 625\nU 688 ; WX 433 ; N uni02B0 ; G 626\nU 689 ; WX 430 ; N uni02B1 ; G 627\nU 690 ; WX 264 ; N uni02B2 ; G 628\nU 691 ; WX 347 ; N uni02B3 ; G 629\nU 692 ; WX 347 ; N uni02B4 ; G 630\nU 693 ; WX 430 ; N uni02B5 ; G 631\nU 694 ; WX 392 ; N uni02B6 ; G 632\nU 695 ; WX 539 ; N uni02B7 ; G 633\nU 696 ; WX 355 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 280 ; N uni02C0 ; G 642\nU 705 ; WX 281 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 282 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 282 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 720 ; WX 337 ; N uni02D0 ; G 656\nU 721 ; WX 337 ; N uni02D1 ; G 657\nU 722 ; WX 307 ; N uni02D2 ; G 658\nU 723 ; WX 307 ; N uni02D3 ; G 659\nU 726 ; WX 392 ; N uni02D6 ; G 660\nU 727 ; WX 392 ; N uni02D7 ; G 661\nU 728 ; WX 500 ; N breve ; G 662\nU 729 ; WX 500 ; N dotaccent ; G 663\nU 730 ; WX 500 ; N ring ; G 664\nU 731 ; WX 500 ; N ogonek ; G 665\nU 732 ; WX 500 ; N tilde ; G 666\nU 733 ; WX 500 ; N hungarumlaut ; G 667\nU 734 ; WX 417 ; N uni02DE ; G 668\nU 736 ; WX 377 ; N uni02E0 ; G 669\nU 737 ; WX 243 ; N uni02E1 ; G 670\nU 738 ; WX 337 ; N uni02E2 ; G 671\nU 739 ; WX 355 ; N uni02E3 ; G 672\nU 740 ; WX 281 ; N uni02E4 ; G 673\nU 741 ; WX 493 ; N uni02E5 ; G 674\nU 742 ; WX 493 ; N uni02E6 ; G 675\nU 743 ; WX 493 ; N uni02E7 ; G 676\nU 744 ; WX 493 ; N uni02E8 ; G 677\nU 745 ; WX 493 ; N uni02E9 ; G 678\nU 748 ; WX 500 ; N uni02EC ; G 679\nU 750 ; WX 484 ; N uni02EE ; G 680\nU 751 ; WX 500 ; N uni02EF ; G 681\nU 752 ; WX 500 ; N uni02F0 ; G 682\nU 755 ; WX 500 ; N uni02F3 ; G 683\nU 759 ; WX 500 ; N uni02F7 ; G 684\nU 768 ; WX 0 ; N gravecomb ; G 685\nU 769 ; WX 0 ; N acutecomb ; G 686\nU 770 ; WX 0 ; N uni0302 ; G 687\nU 771 ; WX 0 ; N tildecomb ; G 688\nU 772 ; WX 0 ; N uni0304 ; G 689\nU 773 ; WX 0 ; N uni0305 ; G 690\nU 774 ; WX 0 ; N uni0306 ; G 691\nU 775 ; WX 0 ; N uni0307 ; G 692\nU 776 ; WX 0 ; N uni0308 ; G 693\nU 777 ; WX 0 ; N hookabovecomb ; G 694\nU 778 ; WX 0 ; N uni030A ; G 695\nU 779 ; WX 0 ; N uni030B ; G 696\nU 780 ; WX 0 ; N uni030C ; G 697\nU 781 ; WX 0 ; N uni030D ; G 698\nU 782 ; WX 0 ; N uni030E ; G 699\nU 783 ; WX 0 ; N uni030F ; G 700\nU 784 ; WX 0 ; N uni0310 ; G 701\nU 785 ; WX 0 ; N uni0311 ; G 702\nU 786 ; WX 0 ; N uni0312 ; G 703\nU 787 ; WX 0 ; N uni0313 ; G 704\nU 788 ; WX 0 ; N uni0314 ; G 705\nU 789 ; WX 0 ; N uni0315 ; G 706\nU 790 ; WX 0 ; N uni0316 ; G 707\nU 791 ; WX 0 ; N uni0317 ; G 708\nU 792 ; WX 0 ; N uni0318 ; G 709\nU 793 ; WX 0 ; N uni0319 ; G 710\nU 794 ; WX 0 ; N uni031A ; G 711\nU 795 ; WX 0 ; N uni031B ; G 712\nU 796 ; WX 0 ; N uni031C ; G 713\nU 797 ; WX 0 ; N uni031D ; G 714\nU 798 ; WX 0 ; N uni031E ; G 715\nU 799 ; WX 0 ; N uni031F ; G 716\nU 800 ; WX 0 ; N uni0320 ; G 717\nU 801 ; WX 0 ; N uni0321 ; G 718\nU 802 ; WX 0 ; N uni0322 ; G 719\nU 803 ; WX 0 ; N dotbelowcomb ; G 720\nU 804 ; WX 0 ; N uni0324 ; G 721\nU 805 ; WX 0 ; N uni0325 ; G 722\nU 806 ; WX 0 ; N uni0326 ; G 723\nU 807 ; WX 0 ; N uni0327 ; G 724\nU 808 ; WX 0 ; N uni0328 ; G 725\nU 809 ; WX 0 ; N uni0329 ; G 726\nU 810 ; WX 0 ; N uni032A ; G 727\nU 811 ; WX 0 ; N uni032B ; G 728\nU 812 ; WX 0 ; N uni032C ; G 729\nU 813 ; WX 0 ; N uni032D ; G 730\nU 814 ; WX 0 ; N uni032E ; G 731\nU 815 ; WX 0 ; N uni032F ; G 732\nU 816 ; WX 0 ; N uni0330 ; G 733\nU 817 ; WX 0 ; N uni0331 ; G 734\nU 818 ; WX 0 ; N uni0332 ; G 735\nU 819 ; WX 0 ; N uni0333 ; G 736\nU 820 ; WX 0 ; N uni0334 ; G 737\nU 821 ; WX 0 ; N uni0335 ; G 738\nU 822 ; WX 0 ; N uni0336 ; G 739\nU 823 ; WX 0 ; N uni0337 ; G 740\nU 824 ; WX 0 ; N uni0338 ; G 741\nU 825 ; WX 0 ; N uni0339 ; G 742\nU 826 ; WX 0 ; N uni033A ; G 743\nU 827 ; WX 0 ; N uni033B ; G 744\nU 828 ; WX 0 ; N uni033C ; G 745\nU 829 ; WX 0 ; N uni033D ; G 746\nU 830 ; WX 0 ; N uni033E ; G 747\nU 831 ; WX 0 ; N uni033F ; G 748\nU 835 ; WX 0 ; N uni0343 ; G 749\nU 847 ; WX 0 ; N uni034F ; G 750\nU 856 ; WX 0 ; N uni0358 ; G 751\nU 864 ; WX 0 ; N uni0360 ; G 752\nU 865 ; WX 0 ; N uni0361 ; G 753\nU 880 ; WX 740 ; N uni0370 ; G 754\nU 881 ; WX 531 ; N uni0371 ; G 755\nU 882 ; WX 667 ; N uni0372 ; G 756\nU 883 ; WX 553 ; N uni0373 ; G 757\nU 884 ; WX 278 ; N uni0374 ; G 758\nU 885 ; WX 278 ; N uni0375 ; G 759\nU 886 ; WX 875 ; N uni0376 ; G 760\nU 887 ; WX 667 ; N uni0377 ; G 761\nU 890 ; WX 500 ; N uni037A ; G 762\nU 891 ; WX 560 ; N uni037B ; G 763\nU 892 ; WX 560 ; N uni037C ; G 764\nU 893 ; WX 560 ; N uni037D ; G 765\nU 894 ; WX 337 ; N uni037E ; G 766\nU 895 ; WX 401 ; N uni037F ; G 767\nU 900 ; WX 500 ; N tonos ; G 768\nU 901 ; WX 500 ; N dieresistonos ; G 769\nU 902 ; WX 722 ; N Alphatonos ; G 770\nU 903 ; WX 318 ; N anoteleia ; G 771\nU 904 ; WX 900 ; N Epsilontonos ; G 772\nU 905 ; WX 1039 ; N Etatonos ; G 773\nU 906 ; WX 562 ; N Iotatonos ; G 774\nU 908 ; WX 835 ; N Omicrontonos ; G 775\nU 910 ; WX 897 ; N Upsilontonos ; G 776\nU 911 ; WX 853 ; N Omegatonos ; G 777\nU 912 ; WX 392 ; N iotadieresistonos ; G 778\nU 913 ; WX 722 ; N Alpha ; G 779\nU 914 ; WX 735 ; N Beta ; G 780\nU 915 ; WX 694 ; N Gamma ; G 781\nU 916 ; WX 722 ; N uni0394 ; G 782\nU 917 ; WX 730 ; N Epsilon ; G 783\nU 918 ; WX 695 ; N Zeta ; G 784\nU 919 ; WX 872 ; N Eta ; G 785\nU 920 ; WX 820 ; N Theta ; G 786\nU 921 ; WX 395 ; N Iota ; G 787\nU 922 ; WX 747 ; N Kappa ; G 788\nU 923 ; WX 722 ; N Lambda ; G 789\nU 924 ; WX 1024 ; N Mu ; G 790\nU 925 ; WX 875 ; N Nu ; G 791\nU 926 ; WX 704 ; N Xi ; G 792\nU 927 ; WX 820 ; N Omicron ; G 793\nU 928 ; WX 872 ; N Pi ; G 794\nU 929 ; WX 673 ; N Rho ; G 795\nU 931 ; WX 707 ; N Sigma ; G 796\nU 932 ; WX 667 ; N Tau ; G 797\nU 933 ; WX 660 ; N Upsilon ; G 798\nU 934 ; WX 820 ; N Phi ; G 799\nU 935 ; WX 712 ; N Chi ; G 800\nU 936 ; WX 877 ; N Psi ; G 801\nU 937 ; WX 829 ; N Omega ; G 802\nU 938 ; WX 395 ; N Iotadieresis ; G 803\nU 939 ; WX 660 ; N Upsilondieresis ; G 804\nU 940 ; WX 675 ; N alphatonos ; G 805\nU 941 ; WX 537 ; N epsilontonos ; G 806\nU 942 ; WX 599 ; N etatonos ; G 807\nU 943 ; WX 392 ; N iotatonos ; G 808\nU 944 ; WX 608 ; N upsilondieresistonos ; G 809\nU 945 ; WX 675 ; N alpha ; G 810\nU 946 ; WX 578 ; N beta ; G 811\nU 947 ; WX 598 ; N gamma ; G 812\nU 948 ; WX 602 ; N delta ; G 813\nU 949 ; WX 537 ; N epsilon ; G 814\nU 950 ; WX 542 ; N zeta ; G 815\nU 951 ; WX 599 ; N eta ; G 816\nU 952 ; WX 602 ; N theta ; G 817\nU 953 ; WX 392 ; N iota ; G 818\nU 954 ; WX 656 ; N kappa ; G 819\nU 955 ; WX 634 ; N lambda ; G 820\nU 956 ; WX 650 ; N uni03BC ; G 821\nU 957 ; WX 608 ; N nu ; G 822\nU 958 ; WX 551 ; N xi ; G 823\nU 959 ; WX 602 ; N omicron ; G 824\nU 960 ; WX 657 ; N pi ; G 825\nU 961 ; WX 588 ; N rho ; G 826\nU 962 ; WX 560 ; N sigma1 ; G 827\nU 963 ; WX 683 ; N sigma ; G 828\nU 964 ; WX 553 ; N tau ; G 829\nU 965 ; WX 608 ; N upsilon ; G 830\nU 966 ; WX 700 ; N phi ; G 831\nU 967 ; WX 606 ; N chi ; G 832\nU 968 ; WX 784 ; N psi ; G 833\nU 969 ; WX 815 ; N omega ; G 834\nU 970 ; WX 392 ; N iotadieresis ; G 835\nU 971 ; WX 608 ; N upsilondieresis ; G 836\nU 972 ; WX 602 ; N omicrontonos ; G 837\nU 973 ; WX 608 ; N upsilontonos ; G 838\nU 974 ; WX 815 ; N omegatonos ; G 839\nU 975 ; WX 747 ; N uni03CF ; G 840\nU 976 ; WX 583 ; N uni03D0 ; G 841\nU 977 ; WX 715 ; N theta1 ; G 842\nU 978 ; WX 687 ; N Upsilon1 ; G 843\nU 979 ; WX 874 ; N uni03D3 ; G 844\nU 980 ; WX 687 ; N uni03D4 ; G 845\nU 981 ; WX 682 ; N phi1 ; G 846\nU 982 ; WX 815 ; N omega1 ; G 847\nU 983 ; WX 624 ; N uni03D7 ; G 848\nU 984 ; WX 820 ; N uni03D8 ; G 849\nU 985 ; WX 602 ; N uni03D9 ; G 850\nU 986 ; WX 765 ; N uni03DA ; G 851\nU 987 ; WX 560 ; N uni03DB ; G 852\nU 988 ; WX 694 ; N uni03DC ; G 853\nU 989 ; WX 463 ; N uni03DD ; G 854\nU 990 ; WX 590 ; N uni03DE ; G 855\nU 991 ; WX 660 ; N uni03DF ; G 856\nU 992 ; WX 782 ; N uni03E0 ; G 857\nU 993 ; WX 577 ; N uni03E1 ; G 858\nU 1008 ; WX 624 ; N uni03F0 ; G 859\nU 1009 ; WX 588 ; N uni03F1 ; G 860\nU 1010 ; WX 560 ; N uni03F2 ; G 861\nU 1011 ; WX 310 ; N uni03F3 ; G 862\nU 1012 ; WX 820 ; N uni03F4 ; G 863\nU 1013 ; WX 560 ; N uni03F5 ; G 864\nU 1014 ; WX 560 ; N uni03F6 ; G 865\nU 1015 ; WX 676 ; N uni03F7 ; G 866\nU 1016 ; WX 640 ; N uni03F8 ; G 867\nU 1017 ; WX 765 ; N uni03F9 ; G 868\nU 1018 ; WX 1024 ; N uni03FA ; G 869\nU 1019 ; WX 708 ; N uni03FB ; G 870\nU 1020 ; WX 588 ; N uni03FC ; G 871\nU 1021 ; WX 765 ; N uni03FD ; G 872\nU 1022 ; WX 765 ; N uni03FE ; G 873\nU 1023 ; WX 765 ; N uni03FF ; G 874\nU 1024 ; WX 730 ; N uni0400 ; G 875\nU 1025 ; WX 730 ; N uni0401 ; G 876\nU 1026 ; WX 799 ; N uni0402 ; G 877\nU 1027 ; WX 662 ; N uni0403 ; G 878\nU 1028 ; WX 765 ; N uni0404 ; G 879\nU 1029 ; WX 685 ; N uni0405 ; G 880\nU 1030 ; WX 395 ; N uni0406 ; G 881\nU 1031 ; WX 395 ; N uni0407 ; G 882\nU 1032 ; WX 401 ; N uni0408 ; G 883\nU 1033 ; WX 1084 ; N uni0409 ; G 884\nU 1034 ; WX 1118 ; N uni040A ; G 885\nU 1035 ; WX 872 ; N uni040B ; G 886\nU 1036 ; WX 774 ; N uni040C ; G 887\nU 1037 ; WX 872 ; N uni040D ; G 888\nU 1038 ; WX 723 ; N uni040E ; G 889\nU 1039 ; WX 872 ; N uni040F ; G 890\nU 1040 ; WX 757 ; N uni0410 ; G 891\nU 1041 ; WX 735 ; N uni0411 ; G 892\nU 1042 ; WX 735 ; N uni0412 ; G 893\nU 1043 ; WX 662 ; N uni0413 ; G 894\nU 1044 ; WX 813 ; N uni0414 ; G 895\nU 1045 ; WX 730 ; N uni0415 ; G 896\nU 1046 ; WX 1124 ; N uni0416 ; G 897\nU 1047 ; WX 623 ; N uni0417 ; G 898\nU 1048 ; WX 872 ; N uni0418 ; G 899\nU 1049 ; WX 872 ; N uni0419 ; G 900\nU 1050 ; WX 774 ; N uni041A ; G 901\nU 1051 ; WX 834 ; N uni041B ; G 902\nU 1052 ; WX 1024 ; N uni041C ; G 903\nU 1053 ; WX 872 ; N uni041D ; G 904\nU 1054 ; WX 820 ; N uni041E ; G 905\nU 1055 ; WX 872 ; N uni041F ; G 906\nU 1056 ; WX 673 ; N uni0420 ; G 907\nU 1057 ; WX 765 ; N uni0421 ; G 908\nU 1058 ; WX 667 ; N uni0422 ; G 909\nU 1059 ; WX 723 ; N uni0423 ; G 910\nU 1060 ; WX 830 ; N uni0424 ; G 911\nU 1061 ; WX 712 ; N uni0425 ; G 912\nU 1062 ; WX 872 ; N uni0426 ; G 913\nU 1063 ; WX 773 ; N uni0427 ; G 914\nU 1064 ; WX 1141 ; N uni0428 ; G 915\nU 1065 ; WX 1141 ; N uni0429 ; G 916\nU 1066 ; WX 794 ; N uni042A ; G 917\nU 1067 ; WX 984 ; N uni042B ; G 918\nU 1068 ; WX 674 ; N uni042C ; G 919\nU 1069 ; WX 765 ; N uni042D ; G 920\nU 1070 ; WX 1193 ; N uni042E ; G 921\nU 1071 ; WX 808 ; N uni042F ; G 922\nU 1072 ; WX 596 ; N uni0430 ; G 923\nU 1073 ; WX 610 ; N uni0431 ; G 924\nU 1074 ; WX 582 ; N uni0432 ; G 925\nU 1075 ; WX 505 ; N uni0433 ; G 926\nU 1076 ; WX 634 ; N uni0434 ; G 927\nU 1077 ; WX 592 ; N uni0435 ; G 928\nU 1078 ; WX 1137 ; N uni0436 ; G 929\nU 1079 ; WX 545 ; N uni0437 ; G 930\nU 1080 ; WX 644 ; N uni0438 ; G 931\nU 1081 ; WX 644 ; N uni0439 ; G 932\nU 1082 ; WX 597 ; N uni043A ; G 933\nU 1083 ; WX 637 ; N uni043B ; G 934\nU 1084 ; WX 829 ; N uni043C ; G 935\nU 1085 ; WX 659 ; N uni043D ; G 936\nU 1086 ; WX 602 ; N uni043E ; G 937\nU 1087 ; WX 644 ; N uni043F ; G 938\nU 1088 ; WX 640 ; N uni0440 ; G 939\nU 1089 ; WX 560 ; N uni0441 ; G 940\nU 1090 ; WX 948 ; N uni0442 ; G 941\nU 1091 ; WX 580 ; N uni0443 ; G 942\nU 1092 ; WX 783 ; N uni0444 ; G 943\nU 1093 ; WX 564 ; N uni0445 ; G 944\nU 1094 ; WX 698 ; N uni0446 ; G 945\nU 1095 ; WX 622 ; N uni0447 ; G 946\nU 1096 ; WX 947 ; N uni0448 ; G 947\nU 1097 ; WX 1001 ; N uni0449 ; G 948\nU 1098 ; WX 667 ; N uni044A ; G 949\nU 1099 ; WX 814 ; N uni044B ; G 950\nU 1100 ; WX 544 ; N uni044C ; G 951\nU 1101 ; WX 560 ; N uni044D ; G 952\nU 1102 ; WX 880 ; N uni044E ; G 953\nU 1103 ; WX 662 ; N uni044F ; G 954\nU 1104 ; WX 592 ; N uni0450 ; G 955\nU 1105 ; WX 592 ; N uni0451 ; G 956\nU 1106 ; WX 624 ; N uni0452 ; G 957\nU 1107 ; WX 505 ; N uni0453 ; G 958\nU 1108 ; WX 560 ; N uni0454 ; G 959\nU 1109 ; WX 513 ; N uni0455 ; G 960\nU 1110 ; WX 320 ; N uni0456 ; G 961\nU 1111 ; WX 320 ; N uni0457 ; G 962\nU 1112 ; WX 310 ; N uni0458 ; G 963\nU 1113 ; WX 859 ; N uni0459 ; G 964\nU 1114 ; WX 878 ; N uni045A ; G 965\nU 1115 ; WX 644 ; N uni045B ; G 966\nU 1116 ; WX 597 ; N uni045C ; G 967\nU 1117 ; WX 644 ; N uni045D ; G 968\nU 1118 ; WX 580 ; N uni045E ; G 969\nU 1119 ; WX 644 ; N uni045F ; G 970\nU 1122 ; WX 762 ; N uni0462 ; G 971\nU 1123 ; WX 882 ; N uni0463 ; G 972\nU 1124 ; WX 1129 ; N uni0464 ; G 973\nU 1125 ; WX 834 ; N uni0465 ; G 974\nU 1130 ; WX 1124 ; N uni046A ; G 975\nU 1131 ; WX 920 ; N uni046B ; G 976\nU 1132 ; WX 1359 ; N uni046C ; G 977\nU 1133 ; WX 1063 ; N uni046D ; G 978\nU 1136 ; WX 944 ; N uni0470 ; G 979\nU 1137 ; WX 902 ; N uni0471 ; G 980\nU 1138 ; WX 820 ; N uni0472 ; G 981\nU 1139 ; WX 552 ; N uni0473 ; G 982\nU 1140 ; WX 859 ; N uni0474 ; G 983\nU 1141 ; WX 678 ; N uni0475 ; G 984\nU 1142 ; WX 859 ; N uni0476 ; G 985\nU 1143 ; WX 678 ; N uni0477 ; G 986\nU 1164 ; WX 707 ; N uni048C ; G 987\nU 1165 ; WX 544 ; N uni048D ; G 988\nU 1168 ; WX 672 ; N uni0490 ; G 989\nU 1169 ; WX 529 ; N uni0491 ; G 990\nU 1170 ; WX 662 ; N uni0492 ; G 991\nU 1171 ; WX 505 ; N uni0493 ; G 992\nU 1172 ; WX 730 ; N uni0494 ; G 993\nU 1173 ; WX 614 ; N uni0495 ; G 994\nU 1174 ; WX 1124 ; N uni0496 ; G 995\nU 1175 ; WX 1137 ; N uni0497 ; G 996\nU 1176 ; WX 623 ; N uni0498 ; G 997\nU 1177 ; WX 545 ; N uni0499 ; G 998\nU 1178 ; WX 774 ; N uni049A ; G 999\nU 1179 ; WX 604 ; N uni049B ; G 1000\nU 1182 ; WX 774 ; N uni049E ; G 1001\nU 1183 ; WX 597 ; N uni049F ; G 1002\nU 1184 ; WX 892 ; N uni04A0 ; G 1003\nU 1185 ; WX 669 ; N uni04A1 ; G 1004\nU 1186 ; WX 872 ; N uni04A2 ; G 1005\nU 1187 ; WX 712 ; N uni04A3 ; G 1006\nU 1188 ; WX 1139 ; N uni04A4 ; G 1007\nU 1189 ; WX 857 ; N uni04A5 ; G 1008\nU 1190 ; WX 1206 ; N uni04A6 ; G 1009\nU 1191 ; WX 943 ; N uni04A7 ; G 1010\nU 1194 ; WX 765 ; N uni04AA ; G 1011\nU 1195 ; WX 560 ; N uni04AB ; G 1012\nU 1196 ; WX 667 ; N uni04AC ; G 1013\nU 1197 ; WX 1013 ; N uni04AD ; G 1014\nU 1198 ; WX 660 ; N uni04AE ; G 1015\nU 1199 ; WX 571 ; N uni04AF ; G 1016\nU 1200 ; WX 660 ; N uni04B0 ; G 1017\nU 1201 ; WX 571 ; N uni04B1 ; G 1018\nU 1202 ; WX 712 ; N uni04B2 ; G 1019\nU 1203 ; WX 629 ; N uni04B3 ; G 1020\nU 1204 ; WX 936 ; N uni04B4 ; G 1021\nU 1205 ; WX 732 ; N uni04B5 ; G 1022\nU 1206 ; WX 749 ; N uni04B6 ; G 1023\nU 1207 ; WX 677 ; N uni04B7 ; G 1024\nU 1210 ; WX 749 ; N uni04BA ; G 1025\nU 1211 ; WX 644 ; N uni04BB ; G 1026\nU 1216 ; WX 395 ; N uni04C0 ; G 1027\nU 1217 ; WX 1124 ; N uni04C1 ; G 1028\nU 1218 ; WX 1137 ; N uni04C2 ; G 1029\nU 1219 ; WX 747 ; N uni04C3 ; G 1030\nU 1220 ; WX 606 ; N uni04C4 ; G 1031\nU 1223 ; WX 872 ; N uni04C7 ; G 1032\nU 1224 ; WX 667 ; N uni04C8 ; G 1033\nU 1227 ; WX 749 ; N uni04CB ; G 1034\nU 1228 ; WX 667 ; N uni04CC ; G 1035\nU 1231 ; WX 320 ; N uni04CF ; G 1036\nU 1232 ; WX 757 ; N uni04D0 ; G 1037\nU 1233 ; WX 596 ; N uni04D1 ; G 1038\nU 1234 ; WX 757 ; N uni04D2 ; G 1039\nU 1235 ; WX 596 ; N uni04D3 ; G 1040\nU 1236 ; WX 1001 ; N uni04D4 ; G 1041\nU 1237 ; WX 940 ; N uni04D5 ; G 1042\nU 1238 ; WX 730 ; N uni04D6 ; G 1043\nU 1239 ; WX 592 ; N uni04D7 ; G 1044\nU 1240 ; WX 820 ; N uni04D8 ; G 1045\nU 1241 ; WX 592 ; N uni04D9 ; G 1046\nU 1242 ; WX 820 ; N uni04DA ; G 1047\nU 1243 ; WX 592 ; N uni04DB ; G 1048\nU 1244 ; WX 1124 ; N uni04DC ; G 1049\nU 1245 ; WX 1137 ; N uni04DD ; G 1050\nU 1246 ; WX 623 ; N uni04DE ; G 1051\nU 1247 ; WX 545 ; N uni04DF ; G 1052\nU 1248 ; WX 564 ; N uni04E0 ; G 1053\nU 1249 ; WX 564 ; N uni04E1 ; G 1054\nU 1250 ; WX 872 ; N uni04E2 ; G 1055\nU 1251 ; WX 644 ; N uni04E3 ; G 1056\nU 1252 ; WX 872 ; N uni04E4 ; G 1057\nU 1253 ; WX 644 ; N uni04E5 ; G 1058\nU 1254 ; WX 820 ; N uni04E6 ; G 1059\nU 1255 ; WX 602 ; N uni04E7 ; G 1060\nU 1256 ; WX 820 ; N uni04E8 ; G 1061\nU 1257 ; WX 602 ; N uni04E9 ; G 1062\nU 1258 ; WX 820 ; N uni04EA ; G 1063\nU 1259 ; WX 602 ; N uni04EB ; G 1064\nU 1260 ; WX 765 ; N uni04EC ; G 1065\nU 1261 ; WX 560 ; N uni04ED ; G 1066\nU 1262 ; WX 723 ; N uni04EE ; G 1067\nU 1263 ; WX 580 ; N uni04EF ; G 1068\nU 1264 ; WX 723 ; N uni04F0 ; G 1069\nU 1265 ; WX 580 ; N uni04F1 ; G 1070\nU 1266 ; WX 723 ; N uni04F2 ; G 1071\nU 1267 ; WX 580 ; N uni04F3 ; G 1072\nU 1268 ; WX 773 ; N uni04F4 ; G 1073\nU 1269 ; WX 622 ; N uni04F5 ; G 1074\nU 1270 ; WX 662 ; N uni04F6 ; G 1075\nU 1271 ; WX 505 ; N uni04F7 ; G 1076\nU 1272 ; WX 984 ; N uni04F8 ; G 1077\nU 1273 ; WX 814 ; N uni04F9 ; G 1078\nU 1296 ; WX 623 ; N uni0510 ; G 1079\nU 1297 ; WX 545 ; N uni0511 ; G 1080\nU 1298 ; WX 834 ; N uni0512 ; G 1081\nU 1299 ; WX 637 ; N uni0513 ; G 1082\nU 1300 ; WX 1199 ; N uni0514 ; G 1083\nU 1301 ; WX 939 ; N uni0515 ; G 1084\nU 1306 ; WX 820 ; N uni051A ; G 1085\nU 1307 ; WX 640 ; N uni051B ; G 1086\nU 1308 ; WX 1028 ; N uni051C ; G 1087\nU 1309 ; WX 856 ; N uni051D ; G 1088\nU 1329 ; WX 810 ; N uni0531 ; G 1089\nU 1330 ; WX 811 ; N uni0532 ; G 1090\nU 1331 ; WX 806 ; N uni0533 ; G 1091\nU 1332 ; WX 828 ; N uni0534 ; G 1092\nU 1333 ; WX 806 ; N uni0535 ; G 1093\nU 1334 ; WX 826 ; N uni0536 ; G 1094\nU 1335 ; WX 761 ; N uni0537 ; G 1095\nU 1336 ; WX 811 ; N uni0538 ; G 1096\nU 1337 ; WX 968 ; N uni0539 ; G 1097\nU 1338 ; WX 816 ; N uni053A ; G 1098\nU 1339 ; WX 772 ; N uni053B ; G 1099\nU 1340 ; WX 682 ; N uni053C ; G 1100\nU 1341 ; WX 1097 ; N uni053D ; G 1101\nU 1342 ; WX 845 ; N uni053E ; G 1102\nU 1343 ; WX 804 ; N uni053F ; G 1103\nU 1344 ; WX 719 ; N uni0540 ; G 1104\nU 1345 ; WX 810 ; N uni0541 ; G 1105\nU 1346 ; WX 833 ; N uni0542 ; G 1106\nU 1347 ; WX 831 ; N uni0543 ; G 1107\nU 1348 ; WX 897 ; N uni0544 ; G 1108\nU 1349 ; WX 763 ; N uni0545 ; G 1109\nU 1350 ; WX 794 ; N uni0546 ; G 1110\nU 1351 ; WX 754 ; N uni0547 ; G 1111\nU 1352 ; WX 799 ; N uni0548 ; G 1112\nU 1353 ; WX 797 ; N uni0549 ; G 1113\nU 1354 ; WX 875 ; N uni054A ; G 1114\nU 1355 ; WX 830 ; N uni054B ; G 1115\nU 1356 ; WX 864 ; N uni054C ; G 1116\nU 1357 ; WX 799 ; N uni054D ; G 1117\nU 1358 ; WX 802 ; N uni054E ; G 1118\nU 1359 ; WX 731 ; N uni054F ; G 1119\nU 1360 ; WX 774 ; N uni0550 ; G 1120\nU 1361 ; WX 749 ; N uni0551 ; G 1121\nU 1362 ; WX 633 ; N uni0552 ; G 1122\nU 1363 ; WX 845 ; N uni0553 ; G 1123\nU 1364 ; WX 843 ; N uni0554 ; G 1124\nU 1365 ; WX 835 ; N uni0555 ; G 1125\nU 1366 ; WX 821 ; N uni0556 ; G 1126\nU 1369 ; WX 307 ; N uni0559 ; G 1127\nU 1370 ; WX 264 ; N uni055A ; G 1128\nU 1371 ; WX 229 ; N uni055B ; G 1129\nU 1372 ; WX 391 ; N uni055C ; G 1130\nU 1373 ; WX 364 ; N uni055D ; G 1131\nU 1374 ; WX 386 ; N uni055E ; G 1132\nU 1375 ; WX 500 ; N uni055F ; G 1133\nU 1377 ; WX 949 ; N uni0561 ; G 1134\nU 1378 ; WX 618 ; N uni0562 ; G 1135\nU 1379 ; WX 695 ; N uni0563 ; G 1136\nU 1380 ; WX 695 ; N uni0564 ; G 1137\nU 1381 ; WX 628 ; N uni0565 ; G 1138\nU 1382 ; WX 688 ; N uni0566 ; G 1139\nU 1383 ; WX 510 ; N uni0567 ; G 1140\nU 1384 ; WX 636 ; N uni0568 ; G 1141\nU 1385 ; WX 791 ; N uni0569 ; G 1142\nU 1386 ; WX 671 ; N uni056A ; G 1143\nU 1387 ; WX 635 ; N uni056B ; G 1144\nU 1388 ; WX 305 ; N uni056C ; G 1145\nU 1389 ; WX 973 ; N uni056D ; G 1146\nU 1390 ; WX 614 ; N uni056E ; G 1147\nU 1391 ; WX 628 ; N uni056F ; G 1148\nU 1392 ; WX 636 ; N uni0570 ; G 1149\nU 1393 ; WX 630 ; N uni0571 ; G 1150\nU 1394 ; WX 636 ; N uni0572 ; G 1151\nU 1395 ; WX 654 ; N uni0573 ; G 1152\nU 1396 ; WX 644 ; N uni0574 ; G 1153\nU 1397 ; WX 309 ; N uni0575 ; G 1154\nU 1398 ; WX 636 ; N uni0576 ; G 1155\nU 1399 ; WX 461 ; N uni0577 ; G 1156\nU 1400 ; WX 649 ; N uni0578 ; G 1157\nU 1401 ; WX 365 ; N uni0579 ; G 1158\nU 1402 ; WX 940 ; N uni057A ; G 1159\nU 1403 ; WX 562 ; N uni057B ; G 1160\nU 1404 ; WX 657 ; N uni057C ; G 1161\nU 1405 ; WX 644 ; N uni057D ; G 1162\nU 1406 ; WX 630 ; N uni057E ; G 1163\nU 1407 ; WX 930 ; N uni057F ; G 1164\nU 1408 ; WX 644 ; N uni0580 ; G 1165\nU 1409 ; WX 643 ; N uni0581 ; G 1166\nU 1410 ; WX 483 ; N uni0582 ; G 1167\nU 1411 ; WX 930 ; N uni0583 ; G 1168\nU 1412 ; WX 636 ; N uni0584 ; G 1169\nU 1413 ; WX 609 ; N uni0585 ; G 1170\nU 1414 ; WX 809 ; N uni0586 ; G 1171\nU 1415 ; WX 789 ; N uni0587 ; G 1172\nU 1417 ; WX 340 ; N uni0589 ; G 1173\nU 1418 ; WX 334 ; N uni058A ; G 1174\nU 3647 ; WX 636 ; N uni0E3F ; G 1175\nU 4256 ; WX 732 ; N uni10A0 ; G 1176\nU 4257 ; WX 860 ; N uni10A1 ; G 1177\nU 4258 ; WX 837 ; N uni10A2 ; G 1178\nU 4259 ; WX 869 ; N uni10A3 ; G 1179\nU 4260 ; WX 743 ; N uni10A4 ; G 1180\nU 4261 ; WX 991 ; N uni10A5 ; G 1181\nU 4262 ; WX 925 ; N uni10A6 ; G 1182\nU 4263 ; WX 1111 ; N uni10A7 ; G 1183\nU 4264 ; WX 576 ; N uni10A8 ; G 1184\nU 4265 ; WX 760 ; N uni10A9 ; G 1185\nU 4266 ; WX 972 ; N uni10AA ; G 1186\nU 4267 ; WX 951 ; N uni10AB ; G 1187\nU 4268 ; WX 753 ; N uni10AC ; G 1188\nU 4269 ; WX 1084 ; N uni10AD ; G 1189\nU 4270 ; WX 906 ; N uni10AE ; G 1190\nU 4271 ; WX 838 ; N uni10AF ; G 1191\nU 4272 ; WX 1049 ; N uni10B0 ; G 1192\nU 4273 ; WX 743 ; N uni10B1 ; G 1193\nU 4274 ; WX 679 ; N uni10B2 ; G 1194\nU 4275 ; WX 1025 ; N uni10B3 ; G 1195\nU 4276 ; WX 946 ; N uni10B4 ; G 1196\nU 4277 ; WX 1029 ; N uni10B5 ; G 1197\nU 4278 ; WX 741 ; N uni10B6 ; G 1198\nU 4279 ; WX 743 ; N uni10B7 ; G 1199\nU 4280 ; WX 742 ; N uni10B8 ; G 1200\nU 4281 ; WX 743 ; N uni10B9 ; G 1201\nU 4282 ; WX 889 ; N uni10BA ; G 1202\nU 4283 ; WX 946 ; N uni10BB ; G 1203\nU 4284 ; WX 724 ; N uni10BC ; G 1204\nU 4285 ; WX 765 ; N uni10BD ; G 1205\nU 4286 ; WX 743 ; N uni10BE ; G 1206\nU 4287 ; WX 968 ; N uni10BF ; G 1207\nU 4288 ; WX 1010 ; N uni10C0 ; G 1208\nU 4289 ; WX 712 ; N uni10C1 ; G 1209\nU 4290 ; WX 874 ; N uni10C2 ; G 1210\nU 4291 ; WX 744 ; N uni10C3 ; G 1211\nU 4292 ; WX 847 ; N uni10C4 ; G 1212\nU 4293 ; WX 960 ; N uni10C5 ; G 1213\nU 4304 ; WX 550 ; N uni10D0 ; G 1214\nU 4305 ; WX 581 ; N uni10D1 ; G 1215\nU 4306 ; WX 599 ; N uni10D2 ; G 1216\nU 4307 ; WX 843 ; N uni10D3 ; G 1217\nU 4308 ; WX 571 ; N uni10D4 ; G 1218\nU 4309 ; WX 567 ; N uni10D5 ; G 1219\nU 4310 ; WX 620 ; N uni10D6 ; G 1220\nU 4311 ; WX 871 ; N uni10D7 ; G 1221\nU 4312 ; WX 569 ; N uni10D8 ; G 1222\nU 4313 ; WX 556 ; N uni10D9 ; G 1223\nU 4314 ; WX 1076 ; N uni10DA ; G 1224\nU 4315 ; WX 596 ; N uni10DB ; G 1225\nU 4316 ; WX 596 ; N uni10DC ; G 1226\nU 4317 ; WX 835 ; N uni10DD ; G 1227\nU 4318 ; WX 580 ; N uni10DE ; G 1228\nU 4319 ; WX 590 ; N uni10DF ; G 1229\nU 4320 ; WX 833 ; N uni10E0 ; G 1230\nU 4321 ; WX 607 ; N uni10E1 ; G 1231\nU 4322 ; WX 758 ; N uni10E2 ; G 1232\nU 4323 ; WX 701 ; N uni10E3 ; G 1233\nU 4324 ; WX 825 ; N uni10E4 ; G 1234\nU 4325 ; WX 595 ; N uni10E5 ; G 1235\nU 4326 ; WX 868 ; N uni10E6 ; G 1236\nU 4327 ; WX 578 ; N uni10E7 ; G 1237\nU 4328 ; WX 604 ; N uni10E8 ; G 1238\nU 4329 ; WX 596 ; N uni10E9 ; G 1239\nU 4330 ; WX 685 ; N uni10EA ; G 1240\nU 4331 ; WX 597 ; N uni10EB ; G 1241\nU 4332 ; WX 557 ; N uni10EC ; G 1242\nU 4333 ; WX 585 ; N uni10ED ; G 1243\nU 4334 ; WX 625 ; N uni10EE ; G 1244\nU 4335 ; WX 693 ; N uni10EF ; G 1245\nU 4336 ; WX 582 ; N uni10F0 ; G 1246\nU 4337 ; WX 613 ; N uni10F1 ; G 1247\nU 4338 ; WX 581 ; N uni10F2 ; G 1248\nU 4339 ; WX 582 ; N uni10F3 ; G 1249\nU 4340 ; WX 580 ; N uni10F4 ; G 1250\nU 4341 ; WX 659 ; N uni10F5 ; G 1251\nU 4342 ; WX 896 ; N uni10F6 ; G 1252\nU 4343 ; WX 636 ; N uni10F7 ; G 1253\nU 4344 ; WX 592 ; N uni10F8 ; G 1254\nU 4345 ; WX 628 ; N uni10F9 ; G 1255\nU 4346 ; WX 581 ; N uni10FA ; G 1256\nU 4347 ; WX 456 ; N uni10FB ; G 1257\nU 4348 ; WX 373 ; N uni10FC ; G 1258\nU 7424 ; WX 565 ; N uni1D00 ; G 1259\nU 7425 ; WX 774 ; N uni1D01 ; G 1260\nU 7426 ; WX 940 ; N uni1D02 ; G 1261\nU 7427 ; WX 563 ; N uni1D03 ; G 1262\nU 7428 ; WX 560 ; N uni1D04 ; G 1263\nU 7429 ; WX 585 ; N uni1D05 ; G 1264\nU 7430 ; WX 585 ; N uni1D06 ; G 1265\nU 7431 ; WX 553 ; N uni1D07 ; G 1266\nU 7432 ; WX 509 ; N uni1D08 ; G 1267\nU 7433 ; WX 320 ; N uni1D09 ; G 1268\nU 7434 ; WX 499 ; N uni1D0A ; G 1269\nU 7435 ; WX 597 ; N uni1D0B ; G 1270\nU 7436 ; WX 543 ; N uni1D0C ; G 1271\nU 7437 ; WX 778 ; N uni1D0D ; G 1272\nU 7438 ; WX 667 ; N uni1D0E ; G 1273\nU 7439 ; WX 602 ; N uni1D0F ; G 1274\nU 7440 ; WX 560 ; N uni1D10 ; G 1275\nU 7441 ; WX 647 ; N uni1D11 ; G 1276\nU 7442 ; WX 647 ; N uni1D12 ; G 1277\nU 7443 ; WX 647 ; N uni1D13 ; G 1278\nU 7444 ; WX 989 ; N uni1D14 ; G 1279\nU 7445 ; WX 512 ; N uni1D15 ; G 1280\nU 7446 ; WX 602 ; N uni1D16 ; G 1281\nU 7447 ; WX 602 ; N uni1D17 ; G 1282\nU 7448 ; WX 553 ; N uni1D18 ; G 1283\nU 7449 ; WX 594 ; N uni1D19 ; G 1284\nU 7450 ; WX 594 ; N uni1D1A ; G 1285\nU 7451 ; WX 553 ; N uni1D1B ; G 1286\nU 7452 ; WX 585 ; N uni1D1C ; G 1287\nU 7453 ; WX 664 ; N uni1D1D ; G 1288\nU 7454 ; WX 923 ; N uni1D1E ; G 1289\nU 7455 ; WX 655 ; N uni1D1F ; G 1290\nU 7456 ; WX 565 ; N uni1D20 ; G 1291\nU 7457 ; WX 856 ; N uni1D21 ; G 1292\nU 7458 ; WX 527 ; N uni1D22 ; G 1293\nU 7459 ; WX 527 ; N uni1D23 ; G 1294\nU 7460 ; WX 531 ; N uni1D24 ; G 1295\nU 7461 ; WX 743 ; N uni1D25 ; G 1296\nU 7462 ; WX 524 ; N uni1D26 ; G 1297\nU 7463 ; WX 565 ; N uni1D27 ; G 1298\nU 7464 ; WX 657 ; N uni1D28 ; G 1299\nU 7465 ; WX 553 ; N uni1D29 ; G 1300\nU 7466 ; WX 703 ; N uni1D2A ; G 1301\nU 7467 ; WX 635 ; N uni1D2B ; G 1302\nU 7468 ; WX 455 ; N uni1D2C ; G 1303\nU 7469 ; WX 630 ; N uni1D2D ; G 1304\nU 7470 ; WX 463 ; N uni1D2E ; G 1305\nU 7471 ; WX 463 ; N uni1D2F ; G 1306\nU 7472 ; WX 505 ; N uni1D30 ; G 1307\nU 7473 ; WX 459 ; N uni1D31 ; G 1308\nU 7474 ; WX 459 ; N uni1D32 ; G 1309\nU 7475 ; WX 503 ; N uni1D33 ; G 1310\nU 7476 ; WX 549 ; N uni1D34 ; G 1311\nU 7477 ; WX 249 ; N uni1D35 ; G 1312\nU 7478 ; WX 252 ; N uni1D36 ; G 1313\nU 7479 ; WX 470 ; N uni1D37 ; G 1314\nU 7480 ; WX 418 ; N uni1D38 ; G 1315\nU 7481 ; WX 645 ; N uni1D39 ; G 1316\nU 7482 ; WX 551 ; N uni1D3A ; G 1317\nU 7483 ; WX 551 ; N uni1D3B ; G 1318\nU 7484 ; WX 516 ; N uni1D3C ; G 1319\nU 7485 ; WX 369 ; N uni1D3D ; G 1320\nU 7486 ; WX 424 ; N uni1D3E ; G 1321\nU 7487 ; WX 474 ; N uni1D3F ; G 1322\nU 7488 ; WX 420 ; N uni1D40 ; G 1323\nU 7489 ; WX 531 ; N uni1D41 ; G 1324\nU 7490 ; WX 647 ; N uni1D42 ; G 1325\nU 7491 ; WX 375 ; N uni1D43 ; G 1326\nU 7492 ; WX 375 ; N uni1D44 ; G 1327\nU 7493 ; WX 425 ; N uni1D45 ; G 1328\nU 7494 ; WX 592 ; N uni1D46 ; G 1329\nU 7495 ; WX 400 ; N uni1D47 ; G 1330\nU 7496 ; WX 400 ; N uni1D48 ; G 1331\nU 7497 ; WX 387 ; N uni1D49 ; G 1332\nU 7498 ; WX 387 ; N uni1D4A ; G 1333\nU 7499 ; WX 428 ; N uni1D4B ; G 1334\nU 7500 ; WX 340 ; N uni1D4C ; G 1335\nU 7501 ; WX 400 ; N uni1D4D ; G 1336\nU 7502 ; WX 175 ; N uni1D4E ; G 1337\nU 7503 ; WX 365 ; N uni1D4F ; G 1338\nU 7504 ; WX 613 ; N uni1D50 ; G 1339\nU 7505 ; WX 399 ; N uni1D51 ; G 1340\nU 7506 ; WX 385 ; N uni1D52 ; G 1341\nU 7507 ; WX 346 ; N uni1D53 ; G 1342\nU 7508 ; WX 385 ; N uni1D54 ; G 1343\nU 7509 ; WX 385 ; N uni1D55 ; G 1344\nU 7510 ; WX 400 ; N uni1D56 ; G 1345\nU 7511 ; WX 247 ; N uni1D57 ; G 1346\nU 7512 ; WX 399 ; N uni1D58 ; G 1347\nU 7513 ; WX 418 ; N uni1D59 ; G 1348\nU 7514 ; WX 613 ; N uni1D5A ; G 1349\nU 7515 ; WX 373 ; N uni1D5B ; G 1350\nU 7516 ; WX 468 ; N uni1D5C ; G 1351\nU 7517 ; WX 364 ; N uni1D5D ; G 1352\nU 7518 ; WX 376 ; N uni1D5E ; G 1353\nU 7519 ; WX 379 ; N uni1D5F ; G 1354\nU 7520 ; WX 441 ; N uni1D60 ; G 1355\nU 7521 ; WX 381 ; N uni1D61 ; G 1356\nU 7522 ; WX 201 ; N uni1D62 ; G 1357\nU 7523 ; WX 347 ; N uni1D63 ; G 1358\nU 7524 ; WX 399 ; N uni1D64 ; G 1359\nU 7525 ; WX 373 ; N uni1D65 ; G 1360\nU 7526 ; WX 364 ; N uni1D66 ; G 1361\nU 7527 ; WX 376 ; N uni1D67 ; G 1362\nU 7528 ; WX 370 ; N uni1D68 ; G 1363\nU 7529 ; WX 441 ; N uni1D69 ; G 1364\nU 7530 ; WX 381 ; N uni1D6A ; G 1365\nU 7531 ; WX 974 ; N uni1D6B ; G 1366\nU 7543 ; WX 640 ; N uni1D77 ; G 1367\nU 7544 ; WX 549 ; N uni1D78 ; G 1368\nU 7547 ; WX 320 ; N uni1D7B ; G 1369\nU 7548 ; WX 392 ; N uni1D7C ; G 1370\nU 7549 ; WX 640 ; N uni1D7D ; G 1371\nU 7550 ; WX 585 ; N uni1D7E ; G 1372\nU 7551 ; WX 620 ; N uni1D7F ; G 1373\nU 7557 ; WX 320 ; N uni1D85 ; G 1374\nU 7579 ; WX 425 ; N uni1D9B ; G 1375\nU 7580 ; WX 353 ; N uni1D9C ; G 1376\nU 7581 ; WX 353 ; N uni1D9D ; G 1377\nU 7582 ; WX 473 ; N uni1D9E ; G 1378\nU 7583 ; WX 428 ; N uni1D9F ; G 1379\nU 7584 ; WX 233 ; N uni1DA0 ; G 1380\nU 7585 ; WX 316 ; N uni1DA1 ; G 1381\nU 7586 ; WX 488 ; N uni1DA2 ; G 1382\nU 7587 ; WX 399 ; N uni1DA3 ; G 1383\nU 7588 ; WX 201 ; N uni1DA4 ; G 1384\nU 7589 ; WX 201 ; N uni1DA5 ; G 1385\nU 7590 ; WX 201 ; N uni1DA6 ; G 1386\nU 7591 ; WX 201 ; N uni1DA7 ; G 1387\nU 7592 ; WX 318 ; N uni1DA8 ; G 1388\nU 7593 ; WX 263 ; N uni1DA9 ; G 1389\nU 7594 ; WX 263 ; N uni1DAA ; G 1390\nU 7595 ; WX 455 ; N uni1DAB ; G 1391\nU 7596 ; WX 613 ; N uni1DAC ; G 1392\nU 7597 ; WX 613 ; N uni1DAD ; G 1393\nU 7598 ; WX 495 ; N uni1DAE ; G 1394\nU 7599 ; WX 492 ; N uni1DAF ; G 1395\nU 7600 ; WX 487 ; N uni1DB0 ; G 1396\nU 7601 ; WX 385 ; N uni1DB1 ; G 1397\nU 7602 ; WX 473 ; N uni1DB2 ; G 1398\nU 7603 ; WX 328 ; N uni1DB3 ; G 1399\nU 7604 ; WX 299 ; N uni1DB4 ; G 1400\nU 7605 ; WX 334 ; N uni1DB5 ; G 1401\nU 7606 ; WX 399 ; N uni1DB6 ; G 1402\nU 7607 ; WX 477 ; N uni1DB7 ; G 1403\nU 7608 ; WX 368 ; N uni1DB8 ; G 1404\nU 7609 ; WX 464 ; N uni1DB9 ; G 1405\nU 7610 ; WX 355 ; N uni1DBA ; G 1406\nU 7611 ; WX 332 ; N uni1DBB ; G 1407\nU 7612 ; WX 418 ; N uni1DBC ; G 1408\nU 7613 ; WX 418 ; N uni1DBD ; G 1409\nU 7614 ; WX 452 ; N uni1DBE ; G 1410\nU 7615 ; WX 473 ; N uni1DBF ; G 1411\nU 7620 ; WX 0 ; N uni1DC4 ; G 1412\nU 7621 ; WX 0 ; N uni1DC5 ; G 1413\nU 7622 ; WX 0 ; N uni1DC6 ; G 1414\nU 7623 ; WX 0 ; N uni1DC7 ; G 1415\nU 7624 ; WX 0 ; N uni1DC8 ; G 1416\nU 7625 ; WX 0 ; N uni1DC9 ; G 1417\nU 7680 ; WX 722 ; N uni1E00 ; G 1418\nU 7681 ; WX 596 ; N uni1E01 ; G 1419\nU 7682 ; WX 735 ; N uni1E02 ; G 1420\nU 7683 ; WX 640 ; N uni1E03 ; G 1421\nU 7684 ; WX 735 ; N uni1E04 ; G 1422\nU 7685 ; WX 640 ; N uni1E05 ; G 1423\nU 7686 ; WX 735 ; N uni1E06 ; G 1424\nU 7687 ; WX 640 ; N uni1E07 ; G 1425\nU 7688 ; WX 765 ; N uni1E08 ; G 1426\nU 7689 ; WX 560 ; N uni1E09 ; G 1427\nU 7690 ; WX 802 ; N uni1E0A ; G 1428\nU 7691 ; WX 640 ; N uni1E0B ; G 1429\nU 7692 ; WX 802 ; N uni1E0C ; G 1430\nU 7693 ; WX 640 ; N uni1E0D ; G 1431\nU 7694 ; WX 802 ; N uni1E0E ; G 1432\nU 7695 ; WX 640 ; N uni1E0F ; G 1433\nU 7696 ; WX 802 ; N uni1E10 ; G 1434\nU 7697 ; WX 640 ; N uni1E11 ; G 1435\nU 7698 ; WX 802 ; N uni1E12 ; G 1436\nU 7699 ; WX 640 ; N uni1E13 ; G 1437\nU 7700 ; WX 730 ; N uni1E14 ; G 1438\nU 7701 ; WX 592 ; N uni1E15 ; G 1439\nU 7702 ; WX 730 ; N uni1E16 ; G 1440\nU 7703 ; WX 592 ; N uni1E17 ; G 1441\nU 7704 ; WX 730 ; N uni1E18 ; G 1442\nU 7705 ; WX 592 ; N uni1E19 ; G 1443\nU 7706 ; WX 730 ; N uni1E1A ; G 1444\nU 7707 ; WX 592 ; N uni1E1B ; G 1445\nU 7708 ; WX 730 ; N uni1E1C ; G 1446\nU 7709 ; WX 592 ; N uni1E1D ; G 1447\nU 7710 ; WX 694 ; N uni1E1E ; G 1448\nU 7711 ; WX 370 ; N uni1E1F ; G 1449\nU 7712 ; WX 799 ; N uni1E20 ; G 1450\nU 7713 ; WX 640 ; N uni1E21 ; G 1451\nU 7714 ; WX 872 ; N uni1E22 ; G 1452\nU 7715 ; WX 644 ; N uni1E23 ; G 1453\nU 7716 ; WX 872 ; N uni1E24 ; G 1454\nU 7717 ; WX 644 ; N uni1E25 ; G 1455\nU 7718 ; WX 872 ; N uni1E26 ; G 1456\nU 7719 ; WX 644 ; N uni1E27 ; G 1457\nU 7720 ; WX 872 ; N uni1E28 ; G 1458\nU 7721 ; WX 644 ; N uni1E29 ; G 1459\nU 7722 ; WX 872 ; N uni1E2A ; G 1460\nU 7723 ; WX 644 ; N uni1E2B ; G 1461\nU 7724 ; WX 395 ; N uni1E2C ; G 1462\nU 7725 ; WX 320 ; N uni1E2D ; G 1463\nU 7726 ; WX 395 ; N uni1E2E ; G 1464\nU 7727 ; WX 320 ; N uni1E2F ; G 1465\nU 7728 ; WX 747 ; N uni1E30 ; G 1466\nU 7729 ; WX 606 ; N uni1E31 ; G 1467\nU 7730 ; WX 747 ; N uni1E32 ; G 1468\nU 7731 ; WX 606 ; N uni1E33 ; G 1469\nU 7732 ; WX 747 ; N uni1E34 ; G 1470\nU 7733 ; WX 606 ; N uni1E35 ; G 1471\nU 7734 ; WX 664 ; N uni1E36 ; G 1472\nU 7735 ; WX 320 ; N uni1E37 ; G 1473\nU 7736 ; WX 664 ; N uni1E38 ; G 1474\nU 7737 ; WX 320 ; N uni1E39 ; G 1475\nU 7738 ; WX 664 ; N uni1E3A ; G 1476\nU 7739 ; WX 320 ; N uni1E3B ; G 1477\nU 7740 ; WX 664 ; N uni1E3C ; G 1478\nU 7741 ; WX 320 ; N uni1E3D ; G 1479\nU 7742 ; WX 1024 ; N uni1E3E ; G 1480\nU 7743 ; WX 948 ; N uni1E3F ; G 1481\nU 7744 ; WX 1024 ; N uni1E40 ; G 1482\nU 7745 ; WX 948 ; N uni1E41 ; G 1483\nU 7746 ; WX 1024 ; N uni1E42 ; G 1484\nU 7747 ; WX 953 ; N uni1E43 ; G 1485\nU 7748 ; WX 875 ; N uni1E44 ; G 1486\nU 7749 ; WX 644 ; N uni1E45 ; G 1487\nU 7750 ; WX 875 ; N uni1E46 ; G 1488\nU 7751 ; WX 644 ; N uni1E47 ; G 1489\nU 7752 ; WX 875 ; N uni1E48 ; G 1490\nU 7753 ; WX 644 ; N uni1E49 ; G 1491\nU 7754 ; WX 875 ; N uni1E4A ; G 1492\nU 7755 ; WX 644 ; N uni1E4B ; G 1493\nU 7756 ; WX 820 ; N uni1E4C ; G 1494\nU 7757 ; WX 602 ; N uni1E4D ; G 1495\nU 7758 ; WX 820 ; N uni1E4E ; G 1496\nU 7759 ; WX 602 ; N uni1E4F ; G 1497\nU 7760 ; WX 820 ; N uni1E50 ; G 1498\nU 7761 ; WX 602 ; N uni1E51 ; G 1499\nU 7762 ; WX 820 ; N uni1E52 ; G 1500\nU 7763 ; WX 602 ; N uni1E53 ; G 1501\nU 7764 ; WX 673 ; N uni1E54 ; G 1502\nU 7765 ; WX 640 ; N uni1E55 ; G 1503\nU 7766 ; WX 673 ; N uni1E56 ; G 1504\nU 7767 ; WX 640 ; N uni1E57 ; G 1505\nU 7768 ; WX 753 ; N uni1E58 ; G 1506\nU 7769 ; WX 478 ; N uni1E59 ; G 1507\nU 7770 ; WX 753 ; N uni1E5A ; G 1508\nU 7771 ; WX 478 ; N uni1E5B ; G 1509\nU 7772 ; WX 753 ; N uni1E5C ; G 1510\nU 7773 ; WX 478 ; N uni1E5D ; G 1511\nU 7774 ; WX 753 ; N uni1E5E ; G 1512\nU 7775 ; WX 478 ; N uni1E5F ; G 1513\nU 7776 ; WX 685 ; N uni1E60 ; G 1514\nU 7777 ; WX 513 ; N uni1E61 ; G 1515\nU 7778 ; WX 685 ; N uni1E62 ; G 1516\nU 7779 ; WX 513 ; N uni1E63 ; G 1517\nU 7780 ; WX 685 ; N uni1E64 ; G 1518\nU 7781 ; WX 513 ; N uni1E65 ; G 1519\nU 7782 ; WX 685 ; N uni1E66 ; G 1520\nU 7783 ; WX 521 ; N uni1E67 ; G 1521\nU 7784 ; WX 685 ; N uni1E68 ; G 1522\nU 7785 ; WX 513 ; N uni1E69 ; G 1523\nU 7786 ; WX 667 ; N uni1E6A ; G 1524\nU 7787 ; WX 402 ; N uni1E6B ; G 1525\nU 7788 ; WX 667 ; N uni1E6C ; G 1526\nU 7789 ; WX 402 ; N uni1E6D ; G 1527\nU 7790 ; WX 667 ; N uni1E6E ; G 1528\nU 7791 ; WX 402 ; N uni1E6F ; G 1529\nU 7792 ; WX 667 ; N uni1E70 ; G 1530\nU 7793 ; WX 402 ; N uni1E71 ; G 1531\nU 7794 ; WX 843 ; N uni1E72 ; G 1532\nU 7795 ; WX 644 ; N uni1E73 ; G 1533\nU 7796 ; WX 843 ; N uni1E74 ; G 1534\nU 7797 ; WX 644 ; N uni1E75 ; G 1535\nU 7798 ; WX 843 ; N uni1E76 ; G 1536\nU 7799 ; WX 644 ; N uni1E77 ; G 1537\nU 7800 ; WX 843 ; N uni1E78 ; G 1538\nU 7801 ; WX 644 ; N uni1E79 ; G 1539\nU 7802 ; WX 843 ; N uni1E7A ; G 1540\nU 7803 ; WX 644 ; N uni1E7B ; G 1541\nU 7804 ; WX 722 ; N uni1E7C ; G 1542\nU 7805 ; WX 565 ; N uni1E7D ; G 1543\nU 7806 ; WX 722 ; N uni1E7E ; G 1544\nU 7807 ; WX 565 ; N uni1E7F ; G 1545\nU 7808 ; WX 1028 ; N Wgrave ; G 1546\nU 7809 ; WX 856 ; N wgrave ; G 1547\nU 7810 ; WX 1028 ; N Wacute ; G 1548\nU 7811 ; WX 856 ; N wacute ; G 1549\nU 7812 ; WX 1028 ; N Wdieresis ; G 1550\nU 7813 ; WX 856 ; N wdieresis ; G 1551\nU 7814 ; WX 1028 ; N uni1E86 ; G 1552\nU 7815 ; WX 856 ; N uni1E87 ; G 1553\nU 7816 ; WX 1028 ; N uni1E88 ; G 1554\nU 7817 ; WX 856 ; N uni1E89 ; G 1555\nU 7818 ; WX 712 ; N uni1E8A ; G 1556\nU 7819 ; WX 564 ; N uni1E8B ; G 1557\nU 7820 ; WX 712 ; N uni1E8C ; G 1558\nU 7821 ; WX 564 ; N uni1E8D ; G 1559\nU 7822 ; WX 660 ; N uni1E8E ; G 1560\nU 7823 ; WX 565 ; N uni1E8F ; G 1561\nU 7824 ; WX 695 ; N uni1E90 ; G 1562\nU 7825 ; WX 527 ; N uni1E91 ; G 1563\nU 7826 ; WX 695 ; N uni1E92 ; G 1564\nU 7827 ; WX 527 ; N uni1E93 ; G 1565\nU 7828 ; WX 695 ; N uni1E94 ; G 1566\nU 7829 ; WX 527 ; N uni1E95 ; G 1567\nU 7830 ; WX 644 ; N uni1E96 ; G 1568\nU 7831 ; WX 402 ; N uni1E97 ; G 1569\nU 7832 ; WX 856 ; N uni1E98 ; G 1570\nU 7833 ; WX 565 ; N uni1E99 ; G 1571\nU 7834 ; WX 903 ; N uni1E9A ; G 1572\nU 7835 ; WX 370 ; N uni1E9B ; G 1573\nU 7836 ; WX 370 ; N uni1E9C ; G 1574\nU 7837 ; WX 370 ; N uni1E9D ; G 1575\nU 7838 ; WX 829 ; N uni1E9E ; G 1576\nU 7839 ; WX 602 ; N uni1E9F ; G 1577\nU 7840 ; WX 722 ; N uni1EA0 ; G 1578\nU 7841 ; WX 596 ; N uni1EA1 ; G 1579\nU 7842 ; WX 722 ; N uni1EA2 ; G 1580\nU 7843 ; WX 596 ; N uni1EA3 ; G 1581\nU 7844 ; WX 722 ; N uni1EA4 ; G 1582\nU 7845 ; WX 613 ; N uni1EA5 ; G 1583\nU 7846 ; WX 722 ; N uni1EA6 ; G 1584\nU 7847 ; WX 613 ; N uni1EA7 ; G 1585\nU 7848 ; WX 722 ; N uni1EA8 ; G 1586\nU 7849 ; WX 613 ; N uni1EA9 ; G 1587\nU 7850 ; WX 722 ; N uni1EAA ; G 1588\nU 7851 ; WX 613 ; N uni1EAB ; G 1589\nU 7852 ; WX 722 ; N uni1EAC ; G 1590\nU 7853 ; WX 596 ; N uni1EAD ; G 1591\nU 7854 ; WX 722 ; N uni1EAE ; G 1592\nU 7855 ; WX 596 ; N uni1EAF ; G 1593\nU 7856 ; WX 722 ; N uni1EB0 ; G 1594\nU 7857 ; WX 596 ; N uni1EB1 ; G 1595\nU 7858 ; WX 722 ; N uni1EB2 ; G 1596\nU 7859 ; WX 596 ; N uni1EB3 ; G 1597\nU 7860 ; WX 722 ; N uni1EB4 ; G 1598\nU 7861 ; WX 596 ; N uni1EB5 ; G 1599\nU 7862 ; WX 722 ; N uni1EB6 ; G 1600\nU 7863 ; WX 596 ; N uni1EB7 ; G 1601\nU 7864 ; WX 730 ; N uni1EB8 ; G 1602\nU 7865 ; WX 592 ; N uni1EB9 ; G 1603\nU 7866 ; WX 730 ; N uni1EBA ; G 1604\nU 7867 ; WX 592 ; N uni1EBB ; G 1605\nU 7868 ; WX 730 ; N uni1EBC ; G 1606\nU 7869 ; WX 592 ; N uni1EBD ; G 1607\nU 7870 ; WX 730 ; N uni1EBE ; G 1608\nU 7871 ; WX 615 ; N uni1EBF ; G 1609\nU 7872 ; WX 730 ; N uni1EC0 ; G 1610\nU 7873 ; WX 615 ; N uni1EC1 ; G 1611\nU 7874 ; WX 730 ; N uni1EC2 ; G 1612\nU 7875 ; WX 615 ; N uni1EC3 ; G 1613\nU 7876 ; WX 730 ; N uni1EC4 ; G 1614\nU 7877 ; WX 615 ; N uni1EC5 ; G 1615\nU 7878 ; WX 730 ; N uni1EC6 ; G 1616\nU 7879 ; WX 592 ; N uni1EC7 ; G 1617\nU 7880 ; WX 395 ; N uni1EC8 ; G 1618\nU 7881 ; WX 320 ; N uni1EC9 ; G 1619\nU 7882 ; WX 395 ; N uni1ECA ; G 1620\nU 7883 ; WX 320 ; N uni1ECB ; G 1621\nU 7884 ; WX 820 ; N uni1ECC ; G 1622\nU 7885 ; WX 602 ; N uni1ECD ; G 1623\nU 7886 ; WX 820 ; N uni1ECE ; G 1624\nU 7887 ; WX 602 ; N uni1ECF ; G 1625\nU 7888 ; WX 820 ; N uni1ED0 ; G 1626\nU 7889 ; WX 612 ; N uni1ED1 ; G 1627\nU 7890 ; WX 820 ; N uni1ED2 ; G 1628\nU 7891 ; WX 612 ; N uni1ED3 ; G 1629\nU 7892 ; WX 820 ; N uni1ED4 ; G 1630\nU 7893 ; WX 612 ; N uni1ED5 ; G 1631\nU 7894 ; WX 820 ; N uni1ED6 ; G 1632\nU 7895 ; WX 612 ; N uni1ED7 ; G 1633\nU 7896 ; WX 820 ; N uni1ED8 ; G 1634\nU 7897 ; WX 602 ; N uni1ED9 ; G 1635\nU 7898 ; WX 820 ; N uni1EDA ; G 1636\nU 7899 ; WX 602 ; N uni1EDB ; G 1637\nU 7900 ; WX 820 ; N uni1EDC ; G 1638\nU 7901 ; WX 602 ; N uni1EDD ; G 1639\nU 7902 ; WX 820 ; N uni1EDE ; G 1640\nU 7903 ; WX 602 ; N uni1EDF ; G 1641\nU 7904 ; WX 820 ; N uni1EE0 ; G 1642\nU 7905 ; WX 602 ; N uni1EE1 ; G 1643\nU 7906 ; WX 820 ; N uni1EE2 ; G 1644\nU 7907 ; WX 602 ; N uni1EE3 ; G 1645\nU 7908 ; WX 843 ; N uni1EE4 ; G 1646\nU 7909 ; WX 644 ; N uni1EE5 ; G 1647\nU 7910 ; WX 843 ; N uni1EE6 ; G 1648\nU 7911 ; WX 644 ; N uni1EE7 ; G 1649\nU 7912 ; WX 843 ; N uni1EE8 ; G 1650\nU 7913 ; WX 644 ; N uni1EE9 ; G 1651\nU 7914 ; WX 843 ; N uni1EEA ; G 1652\nU 7915 ; WX 644 ; N uni1EEB ; G 1653\nU 7916 ; WX 843 ; N uni1EEC ; G 1654\nU 7917 ; WX 644 ; N uni1EED ; G 1655\nU 7918 ; WX 843 ; N uni1EEE ; G 1656\nU 7919 ; WX 644 ; N uni1EEF ; G 1657\nU 7920 ; WX 843 ; N uni1EF0 ; G 1658\nU 7921 ; WX 644 ; N uni1EF1 ; G 1659\nU 7922 ; WX 660 ; N Ygrave ; G 1660\nU 7923 ; WX 565 ; N ygrave ; G 1661\nU 7924 ; WX 660 ; N uni1EF4 ; G 1662\nU 7925 ; WX 565 ; N uni1EF5 ; G 1663\nU 7926 ; WX 660 ; N uni1EF6 ; G 1664\nU 7927 ; WX 565 ; N uni1EF7 ; G 1665\nU 7928 ; WX 660 ; N uni1EF8 ; G 1666\nU 7929 ; WX 565 ; N uni1EF9 ; G 1667\nU 7930 ; WX 949 ; N uni1EFA ; G 1668\nU 7931 ; WX 581 ; N uni1EFB ; G 1669\nU 7936 ; WX 675 ; N uni1F00 ; G 1670\nU 7937 ; WX 675 ; N uni1F01 ; G 1671\nU 7938 ; WX 675 ; N uni1F02 ; G 1672\nU 7939 ; WX 675 ; N uni1F03 ; G 1673\nU 7940 ; WX 675 ; N uni1F04 ; G 1674\nU 7941 ; WX 675 ; N uni1F05 ; G 1675\nU 7942 ; WX 675 ; N uni1F06 ; G 1676\nU 7943 ; WX 675 ; N uni1F07 ; G 1677\nU 7944 ; WX 722 ; N uni1F08 ; G 1678\nU 7945 ; WX 722 ; N uni1F09 ; G 1679\nU 7946 ; WX 869 ; N uni1F0A ; G 1680\nU 7947 ; WX 869 ; N uni1F0B ; G 1681\nU 7948 ; WX 734 ; N uni1F0C ; G 1682\nU 7949 ; WX 763 ; N uni1F0D ; G 1683\nU 7950 ; WX 722 ; N uni1F0E ; G 1684\nU 7951 ; WX 722 ; N uni1F0F ; G 1685\nU 7952 ; WX 537 ; N uni1F10 ; G 1686\nU 7953 ; WX 537 ; N uni1F11 ; G 1687\nU 7954 ; WX 537 ; N uni1F12 ; G 1688\nU 7955 ; WX 537 ; N uni1F13 ; G 1689\nU 7956 ; WX 537 ; N uni1F14 ; G 1690\nU 7957 ; WX 537 ; N uni1F15 ; G 1691\nU 7960 ; WX 853 ; N uni1F18 ; G 1692\nU 7961 ; WX 841 ; N uni1F19 ; G 1693\nU 7962 ; WX 1067 ; N uni1F1A ; G 1694\nU 7963 ; WX 1077 ; N uni1F1B ; G 1695\nU 7964 ; WX 1008 ; N uni1F1C ; G 1696\nU 7965 ; WX 1035 ; N uni1F1D ; G 1697\nU 7968 ; WX 599 ; N uni1F20 ; G 1698\nU 7969 ; WX 599 ; N uni1F21 ; G 1699\nU 7970 ; WX 599 ; N uni1F22 ; G 1700\nU 7971 ; WX 599 ; N uni1F23 ; G 1701\nU 7972 ; WX 599 ; N uni1F24 ; G 1702\nU 7973 ; WX 599 ; N uni1F25 ; G 1703\nU 7974 ; WX 599 ; N uni1F26 ; G 1704\nU 7975 ; WX 599 ; N uni1F27 ; G 1705\nU 7976 ; WX 998 ; N uni1F28 ; G 1706\nU 7977 ; WX 992 ; N uni1F29 ; G 1707\nU 7978 ; WX 1212 ; N uni1F2A ; G 1708\nU 7979 ; WX 1224 ; N uni1F2B ; G 1709\nU 7980 ; WX 1159 ; N uni1F2C ; G 1710\nU 7981 ; WX 1183 ; N uni1F2D ; G 1711\nU 7982 ; WX 1098 ; N uni1F2E ; G 1712\nU 7983 ; WX 1095 ; N uni1F2F ; G 1713\nU 7984 ; WX 392 ; N uni1F30 ; G 1714\nU 7985 ; WX 392 ; N uni1F31 ; G 1715\nU 7986 ; WX 392 ; N uni1F32 ; G 1716\nU 7987 ; WX 392 ; N uni1F33 ; G 1717\nU 7988 ; WX 392 ; N uni1F34 ; G 1718\nU 7989 ; WX 392 ; N uni1F35 ; G 1719\nU 7990 ; WX 392 ; N uni1F36 ; G 1720\nU 7991 ; WX 392 ; N uni1F37 ; G 1721\nU 7992 ; WX 521 ; N uni1F38 ; G 1722\nU 7993 ; WX 512 ; N uni1F39 ; G 1723\nU 7994 ; WX 735 ; N uni1F3A ; G 1724\nU 7995 ; WX 738 ; N uni1F3B ; G 1725\nU 7996 ; WX 679 ; N uni1F3C ; G 1726\nU 7997 ; WX 706 ; N uni1F3D ; G 1727\nU 7998 ; WX 624 ; N uni1F3E ; G 1728\nU 7999 ; WX 615 ; N uni1F3F ; G 1729\nU 8000 ; WX 602 ; N uni1F40 ; G 1730\nU 8001 ; WX 602 ; N uni1F41 ; G 1731\nU 8002 ; WX 602 ; N uni1F42 ; G 1732\nU 8003 ; WX 602 ; N uni1F43 ; G 1733\nU 8004 ; WX 602 ; N uni1F44 ; G 1734\nU 8005 ; WX 602 ; N uni1F45 ; G 1735\nU 8008 ; WX 820 ; N uni1F48 ; G 1736\nU 8009 ; WX 859 ; N uni1F49 ; G 1737\nU 8010 ; WX 1120 ; N uni1F4A ; G 1738\nU 8011 ; WX 1127 ; N uni1F4B ; G 1739\nU 8012 ; WX 937 ; N uni1F4C ; G 1740\nU 8013 ; WX 964 ; N uni1F4D ; G 1741\nU 8016 ; WX 608 ; N uni1F50 ; G 1742\nU 8017 ; WX 608 ; N uni1F51 ; G 1743\nU 8018 ; WX 608 ; N uni1F52 ; G 1744\nU 8019 ; WX 608 ; N uni1F53 ; G 1745\nU 8020 ; WX 608 ; N uni1F54 ; G 1746\nU 8021 ; WX 608 ; N uni1F55 ; G 1747\nU 8022 ; WX 608 ; N uni1F56 ; G 1748\nU 8023 ; WX 608 ; N uni1F57 ; G 1749\nU 8025 ; WX 851 ; N uni1F59 ; G 1750\nU 8027 ; WX 1079 ; N uni1F5B ; G 1751\nU 8029 ; WX 1044 ; N uni1F5D ; G 1752\nU 8031 ; WX 953 ; N uni1F5F ; G 1753\nU 8032 ; WX 815 ; N uni1F60 ; G 1754\nU 8033 ; WX 815 ; N uni1F61 ; G 1755\nU 8034 ; WX 815 ; N uni1F62 ; G 1756\nU 8035 ; WX 815 ; N uni1F63 ; G 1757\nU 8036 ; WX 815 ; N uni1F64 ; G 1758\nU 8037 ; WX 815 ; N uni1F65 ; G 1759\nU 8038 ; WX 815 ; N uni1F66 ; G 1760\nU 8039 ; WX 815 ; N uni1F67 ; G 1761\nU 8040 ; WX 829 ; N uni1F68 ; G 1762\nU 8041 ; WX 870 ; N uni1F69 ; G 1763\nU 8042 ; WX 1131 ; N uni1F6A ; G 1764\nU 8043 ; WX 1137 ; N uni1F6B ; G 1765\nU 8044 ; WX 946 ; N uni1F6C ; G 1766\nU 8045 ; WX 976 ; N uni1F6D ; G 1767\nU 8046 ; WX 938 ; N uni1F6E ; G 1768\nU 8047 ; WX 970 ; N uni1F6F ; G 1769\nU 8048 ; WX 675 ; N uni1F70 ; G 1770\nU 8049 ; WX 675 ; N uni1F71 ; G 1771\nU 8050 ; WX 537 ; N uni1F72 ; G 1772\nU 8051 ; WX 537 ; N uni1F73 ; G 1773\nU 8052 ; WX 599 ; N uni1F74 ; G 1774\nU 8053 ; WX 599 ; N uni1F75 ; G 1775\nU 8054 ; WX 392 ; N uni1F76 ; G 1776\nU 8055 ; WX 392 ; N uni1F77 ; G 1777\nU 8056 ; WX 602 ; N uni1F78 ; G 1778\nU 8057 ; WX 602 ; N uni1F79 ; G 1779\nU 8058 ; WX 608 ; N uni1F7A ; G 1780\nU 8059 ; WX 608 ; N uni1F7B ; G 1781\nU 8060 ; WX 815 ; N uni1F7C ; G 1782\nU 8061 ; WX 815 ; N uni1F7D ; G 1783\nU 8064 ; WX 675 ; N uni1F80 ; G 1784\nU 8065 ; WX 675 ; N uni1F81 ; G 1785\nU 8066 ; WX 675 ; N uni1F82 ; G 1786\nU 8067 ; WX 675 ; N uni1F83 ; G 1787\nU 8068 ; WX 675 ; N uni1F84 ; G 1788\nU 8069 ; WX 675 ; N uni1F85 ; G 1789\nU 8070 ; WX 675 ; N uni1F86 ; G 1790\nU 8071 ; WX 675 ; N uni1F87 ; G 1791\nU 8072 ; WX 722 ; N uni1F88 ; G 1792\nU 8073 ; WX 722 ; N uni1F89 ; G 1793\nU 8074 ; WX 869 ; N uni1F8A ; G 1794\nU 8075 ; WX 869 ; N uni1F8B ; G 1795\nU 8076 ; WX 734 ; N uni1F8C ; G 1796\nU 8077 ; WX 763 ; N uni1F8D ; G 1797\nU 8078 ; WX 722 ; N uni1F8E ; G 1798\nU 8079 ; WX 722 ; N uni1F8F ; G 1799\nU 8080 ; WX 599 ; N uni1F90 ; G 1800\nU 8081 ; WX 599 ; N uni1F91 ; G 1801\nU 8082 ; WX 599 ; N uni1F92 ; G 1802\nU 8083 ; WX 599 ; N uni1F93 ; G 1803\nU 8084 ; WX 599 ; N uni1F94 ; G 1804\nU 8085 ; WX 599 ; N uni1F95 ; G 1805\nU 8086 ; WX 599 ; N uni1F96 ; G 1806\nU 8087 ; WX 599 ; N uni1F97 ; G 1807\nU 8088 ; WX 998 ; N uni1F98 ; G 1808\nU 8089 ; WX 992 ; N uni1F99 ; G 1809\nU 8090 ; WX 1212 ; N uni1F9A ; G 1810\nU 8091 ; WX 1224 ; N uni1F9B ; G 1811\nU 8092 ; WX 1159 ; N uni1F9C ; G 1812\nU 8093 ; WX 1183 ; N uni1F9D ; G 1813\nU 8094 ; WX 1098 ; N uni1F9E ; G 1814\nU 8095 ; WX 1095 ; N uni1F9F ; G 1815\nU 8096 ; WX 815 ; N uni1FA0 ; G 1816\nU 8097 ; WX 815 ; N uni1FA1 ; G 1817\nU 8098 ; WX 815 ; N uni1FA2 ; G 1818\nU 8099 ; WX 815 ; N uni1FA3 ; G 1819\nU 8100 ; WX 815 ; N uni1FA4 ; G 1820\nU 8101 ; WX 815 ; N uni1FA5 ; G 1821\nU 8102 ; WX 815 ; N uni1FA6 ; G 1822\nU 8103 ; WX 815 ; N uni1FA7 ; G 1823\nU 8104 ; WX 829 ; N uni1FA8 ; G 1824\nU 8105 ; WX 870 ; N uni1FA9 ; G 1825\nU 8106 ; WX 1131 ; N uni1FAA ; G 1826\nU 8107 ; WX 1137 ; N uni1FAB ; G 1827\nU 8108 ; WX 946 ; N uni1FAC ; G 1828\nU 8109 ; WX 976 ; N uni1FAD ; G 1829\nU 8110 ; WX 938 ; N uni1FAE ; G 1830\nU 8111 ; WX 970 ; N uni1FAF ; G 1831\nU 8112 ; WX 675 ; N uni1FB0 ; G 1832\nU 8113 ; WX 675 ; N uni1FB1 ; G 1833\nU 8114 ; WX 675 ; N uni1FB2 ; G 1834\nU 8115 ; WX 675 ; N uni1FB3 ; G 1835\nU 8116 ; WX 675 ; N uni1FB4 ; G 1836\nU 8118 ; WX 675 ; N uni1FB6 ; G 1837\nU 8119 ; WX 675 ; N uni1FB7 ; G 1838\nU 8120 ; WX 722 ; N uni1FB8 ; G 1839\nU 8121 ; WX 722 ; N uni1FB9 ; G 1840\nU 8122 ; WX 722 ; N uni1FBA ; G 1841\nU 8123 ; WX 722 ; N uni1FBB ; G 1842\nU 8124 ; WX 722 ; N uni1FBC ; G 1843\nU 8125 ; WX 500 ; N uni1FBD ; G 1844\nU 8126 ; WX 500 ; N uni1FBE ; G 1845\nU 8127 ; WX 500 ; N uni1FBF ; G 1846\nU 8128 ; WX 500 ; N uni1FC0 ; G 1847\nU 8129 ; WX 500 ; N uni1FC1 ; G 1848\nU 8130 ; WX 599 ; N uni1FC2 ; G 1849\nU 8131 ; WX 599 ; N uni1FC3 ; G 1850\nU 8132 ; WX 599 ; N uni1FC4 ; G 1851\nU 8134 ; WX 599 ; N uni1FC6 ; G 1852\nU 8135 ; WX 599 ; N uni1FC7 ; G 1853\nU 8136 ; WX 912 ; N uni1FC8 ; G 1854\nU 8137 ; WX 900 ; N uni1FC9 ; G 1855\nU 8138 ; WX 1063 ; N uni1FCA ; G 1856\nU 8139 ; WX 1039 ; N uni1FCB ; G 1857\nU 8140 ; WX 872 ; N uni1FCC ; G 1858\nU 8141 ; WX 500 ; N uni1FCD ; G 1859\nU 8142 ; WX 500 ; N uni1FCE ; G 1860\nU 8143 ; WX 500 ; N uni1FCF ; G 1861\nU 8144 ; WX 392 ; N uni1FD0 ; G 1862\nU 8145 ; WX 392 ; N uni1FD1 ; G 1863\nU 8146 ; WX 392 ; N uni1FD2 ; G 1864\nU 8147 ; WX 392 ; N uni1FD3 ; G 1865\nU 8150 ; WX 392 ; N uni1FD6 ; G 1866\nU 8151 ; WX 392 ; N uni1FD7 ; G 1867\nU 8152 ; WX 395 ; N uni1FD8 ; G 1868\nU 8153 ; WX 395 ; N uni1FD9 ; G 1869\nU 8154 ; WX 588 ; N uni1FDA ; G 1870\nU 8155 ; WX 562 ; N uni1FDB ; G 1871\nU 8157 ; WX 500 ; N uni1FDD ; G 1872\nU 8158 ; WX 500 ; N uni1FDE ; G 1873\nU 8159 ; WX 500 ; N uni1FDF ; G 1874\nU 8160 ; WX 608 ; N uni1FE0 ; G 1875\nU 8161 ; WX 608 ; N uni1FE1 ; G 1876\nU 8162 ; WX 608 ; N uni1FE2 ; G 1877\nU 8163 ; WX 608 ; N uni1FE3 ; G 1878\nU 8164 ; WX 588 ; N uni1FE4 ; G 1879\nU 8165 ; WX 588 ; N uni1FE5 ; G 1880\nU 8166 ; WX 608 ; N uni1FE6 ; G 1881\nU 8167 ; WX 608 ; N uni1FE7 ; G 1882\nU 8168 ; WX 660 ; N uni1FE8 ; G 1883\nU 8169 ; WX 660 ; N uni1FE9 ; G 1884\nU 8170 ; WX 921 ; N uni1FEA ; G 1885\nU 8171 ; WX 897 ; N uni1FEB ; G 1886\nU 8172 ; WX 790 ; N uni1FEC ; G 1887\nU 8173 ; WX 500 ; N uni1FED ; G 1888\nU 8174 ; WX 500 ; N uni1FEE ; G 1889\nU 8175 ; WX 500 ; N uni1FEF ; G 1890\nU 8178 ; WX 815 ; N uni1FF2 ; G 1891\nU 8179 ; WX 815 ; N uni1FF3 ; G 1892\nU 8180 ; WX 815 ; N uni1FF4 ; G 1893\nU 8182 ; WX 815 ; N uni1FF6 ; G 1894\nU 8183 ; WX 815 ; N uni1FF7 ; G 1895\nU 8184 ; WX 961 ; N uni1FF8 ; G 1896\nU 8185 ; WX 835 ; N uni1FF9 ; G 1897\nU 8186 ; WX 984 ; N uni1FFA ; G 1898\nU 8187 ; WX 853 ; N uni1FFB ; G 1899\nU 8188 ; WX 829 ; N uni1FFC ; G 1900\nU 8189 ; WX 500 ; N uni1FFD ; G 1901\nU 8190 ; WX 500 ; N uni1FFE ; G 1902\nU 8192 ; WX 500 ; N uni2000 ; G 1903\nU 8193 ; WX 1000 ; N uni2001 ; G 1904\nU 8194 ; WX 500 ; N uni2002 ; G 1905\nU 8195 ; WX 1000 ; N uni2003 ; G 1906\nU 8196 ; WX 330 ; N uni2004 ; G 1907\nU 8197 ; WX 250 ; N uni2005 ; G 1908\nU 8198 ; WX 167 ; N uni2006 ; G 1909\nU 8199 ; WX 636 ; N uni2007 ; G 1910\nU 8200 ; WX 318 ; N uni2008 ; G 1911\nU 8201 ; WX 200 ; N uni2009 ; G 1912\nU 8202 ; WX 100 ; N uni200A ; G 1913\nU 8203 ; WX 0 ; N uni200B ; G 1914\nU 8204 ; WX 0 ; N uni200C ; G 1915\nU 8205 ; WX 0 ; N uni200D ; G 1916\nU 8206 ; WX 0 ; N uni200E ; G 1917\nU 8207 ; WX 0 ; N uni200F ; G 1918\nU 8208 ; WX 338 ; N uni2010 ; G 1919\nU 8209 ; WX 338 ; N uni2011 ; G 1920\nU 8210 ; WX 636 ; N figuredash ; G 1921\nU 8211 ; WX 500 ; N endash ; G 1922\nU 8212 ; WX 1000 ; N emdash ; G 1923\nU 8213 ; WX 1000 ; N uni2015 ; G 1924\nU 8214 ; WX 500 ; N uni2016 ; G 1925\nU 8215 ; WX 500 ; N underscoredbl ; G 1926\nU 8216 ; WX 318 ; N quoteleft ; G 1927\nU 8217 ; WX 318 ; N quoteright ; G 1928\nU 8218 ; WX 318 ; N quotesinglbase ; G 1929\nU 8219 ; WX 318 ; N quotereversed ; G 1930\nU 8220 ; WX 511 ; N quotedblleft ; G 1931\nU 8221 ; WX 511 ; N quotedblright ; G 1932\nU 8222 ; WX 518 ; N quotedblbase ; G 1933\nU 8223 ; WX 511 ; N uni201F ; G 1934\nU 8224 ; WX 500 ; N dagger ; G 1935\nU 8225 ; WX 500 ; N daggerdbl ; G 1936\nU 8226 ; WX 590 ; N bullet ; G 1937\nU 8227 ; WX 590 ; N uni2023 ; G 1938\nU 8228 ; WX 334 ; N onedotenleader ; G 1939\nU 8229 ; WX 667 ; N twodotenleader ; G 1940\nU 8230 ; WX 1000 ; N ellipsis ; G 1941\nU 8234 ; WX 0 ; N uni202A ; G 1942\nU 8235 ; WX 0 ; N uni202B ; G 1943\nU 8236 ; WX 0 ; N uni202C ; G 1944\nU 8237 ; WX 0 ; N uni202D ; G 1945\nU 8238 ; WX 0 ; N uni202E ; G 1946\nU 8239 ; WX 200 ; N uni202F ; G 1947\nU 8240 ; WX 1342 ; N perthousand ; G 1948\nU 8241 ; WX 1734 ; N uni2031 ; G 1949\nU 8242 ; WX 227 ; N minute ; G 1950\nU 8243 ; WX 374 ; N second ; G 1951\nU 8244 ; WX 520 ; N uni2034 ; G 1952\nU 8245 ; WX 227 ; N uni2035 ; G 1953\nU 8246 ; WX 374 ; N uni2036 ; G 1954\nU 8247 ; WX 520 ; N uni2037 ; G 1955\nU 8248 ; WX 339 ; N uni2038 ; G 1956\nU 8249 ; WX 400 ; N guilsinglleft ; G 1957\nU 8250 ; WX 400 ; N guilsinglright ; G 1958\nU 8252 ; WX 527 ; N exclamdbl ; G 1959\nU 8253 ; WX 536 ; N uni203D ; G 1960\nU 8254 ; WX 500 ; N uni203E ; G 1961\nU 8258 ; WX 1000 ; N uni2042 ; G 1962\nU 8260 ; WX 167 ; N fraction ; G 1963\nU 8261 ; WX 390 ; N uni2045 ; G 1964\nU 8262 ; WX 390 ; N uni2046 ; G 1965\nU 8263 ; WX 976 ; N uni2047 ; G 1966\nU 8264 ; WX 753 ; N uni2048 ; G 1967\nU 8265 ; WX 753 ; N uni2049 ; G 1968\nU 8267 ; WX 636 ; N uni204B ; G 1969\nU 8268 ; WX 500 ; N uni204C ; G 1970\nU 8269 ; WX 500 ; N uni204D ; G 1971\nU 8270 ; WX 500 ; N uni204E ; G 1972\nU 8271 ; WX 337 ; N uni204F ; G 1973\nU 8273 ; WX 500 ; N uni2051 ; G 1974\nU 8274 ; WX 450 ; N uni2052 ; G 1975\nU 8275 ; WX 1000 ; N uni2053 ; G 1976\nU 8279 ; WX 663 ; N uni2057 ; G 1977\nU 8287 ; WX 222 ; N uni205F ; G 1978\nU 8288 ; WX 0 ; N uni2060 ; G 1979\nU 8289 ; WX 0 ; N uni2061 ; G 1980\nU 8290 ; WX 0 ; N uni2062 ; G 1981\nU 8291 ; WX 0 ; N uni2063 ; G 1982\nU 8292 ; WX 0 ; N uni2064 ; G 1983\nU 8298 ; WX 0 ; N uni206A ; G 1984\nU 8299 ; WX 0 ; N uni206B ; G 1985\nU 8300 ; WX 0 ; N uni206C ; G 1986\nU 8301 ; WX 0 ; N uni206D ; G 1987\nU 8302 ; WX 0 ; N uni206E ; G 1988\nU 8303 ; WX 0 ; N uni206F ; G 1989\nU 8304 ; WX 401 ; N uni2070 ; G 1990\nU 8305 ; WX 201 ; N uni2071 ; G 1991\nU 8308 ; WX 401 ; N uni2074 ; G 1992\nU 8309 ; WX 401 ; N uni2075 ; G 1993\nU 8310 ; WX 401 ; N uni2076 ; G 1994\nU 8311 ; WX 401 ; N uni2077 ; G 1995\nU 8312 ; WX 401 ; N uni2078 ; G 1996\nU 8313 ; WX 401 ; N uni2079 ; G 1997\nU 8314 ; WX 528 ; N uni207A ; G 1998\nU 8315 ; WX 528 ; N uni207B ; G 1999\nU 8316 ; WX 528 ; N uni207C ; G 2000\nU 8317 ; WX 246 ; N uni207D ; G 2001\nU 8318 ; WX 246 ; N uni207E ; G 2002\nU 8319 ; WX 405 ; N uni207F ; G 2003\nU 8320 ; WX 401 ; N uni2080 ; G 2004\nU 8321 ; WX 401 ; N uni2081 ; G 2005\nU 8322 ; WX 401 ; N uni2082 ; G 2006\nU 8323 ; WX 401 ; N uni2083 ; G 2007\nU 8324 ; WX 401 ; N uni2084 ; G 2008\nU 8325 ; WX 401 ; N uni2085 ; G 2009\nU 8326 ; WX 401 ; N uni2086 ; G 2010\nU 8327 ; WX 401 ; N uni2087 ; G 2011\nU 8328 ; WX 401 ; N uni2088 ; G 2012\nU 8329 ; WX 401 ; N uni2089 ; G 2013\nU 8330 ; WX 528 ; N uni208A ; G 2014\nU 8331 ; WX 528 ; N uni208B ; G 2015\nU 8332 ; WX 528 ; N uni208C ; G 2016\nU 8333 ; WX 246 ; N uni208D ; G 2017\nU 8334 ; WX 246 ; N uni208E ; G 2018\nU 8336 ; WX 375 ; N uni2090 ; G 2019\nU 8337 ; WX 387 ; N uni2091 ; G 2020\nU 8338 ; WX 385 ; N uni2092 ; G 2021\nU 8339 ; WX 355 ; N uni2093 ; G 2022\nU 8340 ; WX 387 ; N uni2094 ; G 2023\nU 8341 ; WX 433 ; N uni2095 ; G 2024\nU 8342 ; WX 365 ; N uni2096 ; G 2025\nU 8343 ; WX 243 ; N uni2097 ; G 2026\nU 8344 ; WX 613 ; N uni2098 ; G 2027\nU 8345 ; WX 405 ; N uni2099 ; G 2028\nU 8346 ; WX 400 ; N uni209A ; G 2029\nU 8347 ; WX 337 ; N uni209B ; G 2030\nU 8348 ; WX 247 ; N uni209C ; G 2031\nU 8358 ; WX 636 ; N uni20A6 ; G 2032\nU 8364 ; WX 636 ; N Euro ; G 2033\nU 8367 ; WX 1057 ; N uni20AF ; G 2034\nU 8369 ; WX 706 ; N uni20B1 ; G 2035\nU 8372 ; WX 780 ; N uni20B4 ; G 2036\nU 8373 ; WX 636 ; N uni20B5 ; G 2037\nU 8376 ; WX 636 ; N uni20B8 ; G 2038\nU 8377 ; WX 636 ; N uni20B9 ; G 2039\nU 8378 ; WX 636 ; N uni20BA ; G 2040\nU 8381 ; WX 636 ; N uni20BD ; G 2041\nU 8451 ; WX 1119 ; N uni2103 ; G 2042\nU 8457 ; WX 1047 ; N uni2109 ; G 2043\nU 8462 ; WX 644 ; N uni210E ; G 2044\nU 8463 ; WX 644 ; N uni210F ; G 2045\nU 8470 ; WX 946 ; N uni2116 ; G 2046\nU 8482 ; WX 1000 ; N trademark ; G 2047\nU 8486 ; WX 829 ; N uni2126 ; G 2048\nU 8487 ; WX 829 ; N uni2127 ; G 2049\nU 8490 ; WX 747 ; N uni212A ; G 2050\nU 8491 ; WX 722 ; N uni212B ; G 2051\nU 8498 ; WX 694 ; N uni2132 ; G 2052\nU 8513 ; WX 775 ; N uni2141 ; G 2053\nU 8514 ; WX 557 ; N uni2142 ; G 2054\nU 8515 ; WX 557 ; N uni2143 ; G 2055\nU 8516 ; WX 611 ; N uni2144 ; G 2056\nU 8523 ; WX 890 ; N uni214B ; G 2057\nU 8526 ; WX 514 ; N uni214E ; G 2058\nU 8528 ; WX 969 ; N uni2150 ; G 2059\nU 8529 ; WX 969 ; N uni2151 ; G 2060\nU 8530 ; WX 1370 ; N uni2152 ; G 2061\nU 8531 ; WX 969 ; N onethird ; G 2062\nU 8532 ; WX 969 ; N twothirds ; G 2063\nU 8533 ; WX 969 ; N uni2155 ; G 2064\nU 8534 ; WX 969 ; N uni2156 ; G 2065\nU 8535 ; WX 969 ; N uni2157 ; G 2066\nU 8536 ; WX 969 ; N uni2158 ; G 2067\nU 8537 ; WX 969 ; N uni2159 ; G 2068\nU 8538 ; WX 969 ; N uni215A ; G 2069\nU 8539 ; WX 969 ; N oneeighth ; G 2070\nU 8540 ; WX 969 ; N threeeighths ; G 2071\nU 8541 ; WX 969 ; N fiveeighths ; G 2072\nU 8542 ; WX 969 ; N seveneighths ; G 2073\nU 8543 ; WX 568 ; N uni215F ; G 2074\nU 8544 ; WX 395 ; N uni2160 ; G 2075\nU 8545 ; WX 680 ; N uni2161 ; G 2076\nU 8546 ; WX 964 ; N uni2162 ; G 2077\nU 8547 ; WX 999 ; N uni2163 ; G 2078\nU 8548 ; WX 722 ; N uni2164 ; G 2079\nU 8549 ; WX 1006 ; N uni2165 ; G 2080\nU 8550 ; WX 1291 ; N uni2166 ; G 2081\nU 8551 ; WX 1575 ; N uni2167 ; G 2082\nU 8552 ; WX 965 ; N uni2168 ; G 2083\nU 8553 ; WX 712 ; N uni2169 ; G 2084\nU 8554 ; WX 969 ; N uni216A ; G 2085\nU 8555 ; WX 1253 ; N uni216B ; G 2086\nU 8556 ; WX 664 ; N uni216C ; G 2087\nU 8557 ; WX 765 ; N uni216D ; G 2088\nU 8558 ; WX 802 ; N uni216E ; G 2089\nU 8559 ; WX 1024 ; N uni216F ; G 2090\nU 8560 ; WX 320 ; N uni2170 ; G 2091\nU 8561 ; WX 640 ; N uni2171 ; G 2092\nU 8562 ; WX 959 ; N uni2172 ; G 2093\nU 8563 ; WX 885 ; N uni2173 ; G 2094\nU 8564 ; WX 565 ; N uni2174 ; G 2095\nU 8565 ; WX 885 ; N uni2175 ; G 2096\nU 8566 ; WX 1205 ; N uni2176 ; G 2097\nU 8567 ; WX 1524 ; N uni2177 ; G 2098\nU 8568 ; WX 884 ; N uni2178 ; G 2099\nU 8569 ; WX 564 ; N uni2179 ; G 2100\nU 8570 ; WX 884 ; N uni217A ; G 2101\nU 8571 ; WX 1204 ; N uni217B ; G 2102\nU 8572 ; WX 320 ; N uni217C ; G 2103\nU 8573 ; WX 560 ; N uni217D ; G 2104\nU 8574 ; WX 640 ; N uni217E ; G 2105\nU 8575 ; WX 948 ; N uni217F ; G 2106\nU 8576 ; WX 1206 ; N uni2180 ; G 2107\nU 8577 ; WX 802 ; N uni2181 ; G 2108\nU 8578 ; WX 1206 ; N uni2182 ; G 2109\nU 8579 ; WX 765 ; N uni2183 ; G 2110\nU 8580 ; WX 560 ; N uni2184 ; G 2111\nU 8581 ; WX 765 ; N uni2185 ; G 2112\nU 8585 ; WX 969 ; N uni2189 ; G 2113\nU 8592 ; WX 838 ; N arrowleft ; G 2114\nU 8593 ; WX 838 ; N arrowup ; G 2115\nU 8594 ; WX 838 ; N arrowright ; G 2116\nU 8595 ; WX 838 ; N arrowdown ; G 2117\nU 8596 ; WX 838 ; N arrowboth ; G 2118\nU 8597 ; WX 838 ; N arrowupdn ; G 2119\nU 8598 ; WX 838 ; N uni2196 ; G 2120\nU 8599 ; WX 838 ; N uni2197 ; G 2121\nU 8600 ; WX 838 ; N uni2198 ; G 2122\nU 8601 ; WX 838 ; N uni2199 ; G 2123\nU 8602 ; WX 838 ; N uni219A ; G 2124\nU 8603 ; WX 838 ; N uni219B ; G 2125\nU 8604 ; WX 838 ; N uni219C ; G 2126\nU 8605 ; WX 838 ; N uni219D ; G 2127\nU 8606 ; WX 838 ; N uni219E ; G 2128\nU 8607 ; WX 838 ; N uni219F ; G 2129\nU 8608 ; WX 838 ; N uni21A0 ; G 2130\nU 8609 ; WX 838 ; N uni21A1 ; G 2131\nU 8610 ; WX 838 ; N uni21A2 ; G 2132\nU 8611 ; WX 838 ; N uni21A3 ; G 2133\nU 8612 ; WX 838 ; N uni21A4 ; G 2134\nU 8613 ; WX 838 ; N uni21A5 ; G 2135\nU 8614 ; WX 838 ; N uni21A6 ; G 2136\nU 8615 ; WX 838 ; N uni21A7 ; G 2137\nU 8616 ; WX 838 ; N arrowupdnbse ; G 2138\nU 8617 ; WX 838 ; N uni21A9 ; G 2139\nU 8618 ; WX 838 ; N uni21AA ; G 2140\nU 8619 ; WX 838 ; N uni21AB ; G 2141\nU 8620 ; WX 838 ; N uni21AC ; G 2142\nU 8621 ; WX 838 ; N uni21AD ; G 2143\nU 8622 ; WX 838 ; N uni21AE ; G 2144\nU 8623 ; WX 838 ; N uni21AF ; G 2145\nU 8624 ; WX 838 ; N uni21B0 ; G 2146\nU 8625 ; WX 838 ; N uni21B1 ; G 2147\nU 8626 ; WX 838 ; N uni21B2 ; G 2148\nU 8627 ; WX 838 ; N uni21B3 ; G 2149\nU 8628 ; WX 838 ; N uni21B4 ; G 2150\nU 8629 ; WX 838 ; N carriagereturn ; G 2151\nU 8630 ; WX 838 ; N uni21B6 ; G 2152\nU 8631 ; WX 838 ; N uni21B7 ; G 2153\nU 8632 ; WX 838 ; N uni21B8 ; G 2154\nU 8633 ; WX 838 ; N uni21B9 ; G 2155\nU 8634 ; WX 838 ; N uni21BA ; G 2156\nU 8635 ; WX 838 ; N uni21BB ; G 2157\nU 8636 ; WX 838 ; N uni21BC ; G 2158\nU 8637 ; WX 838 ; N uni21BD ; G 2159\nU 8638 ; WX 838 ; N uni21BE ; G 2160\nU 8639 ; WX 838 ; N uni21BF ; G 2161\nU 8640 ; WX 838 ; N uni21C0 ; G 2162\nU 8641 ; WX 838 ; N uni21C1 ; G 2163\nU 8642 ; WX 838 ; N uni21C2 ; G 2164\nU 8643 ; WX 838 ; N uni21C3 ; G 2165\nU 8644 ; WX 838 ; N uni21C4 ; G 2166\nU 8645 ; WX 838 ; N uni21C5 ; G 2167\nU 8646 ; WX 838 ; N uni21C6 ; G 2168\nU 8647 ; WX 838 ; N uni21C7 ; G 2169\nU 8648 ; WX 838 ; N uni21C8 ; G 2170\nU 8649 ; WX 838 ; N uni21C9 ; G 2171\nU 8650 ; WX 838 ; N uni21CA ; G 2172\nU 8651 ; WX 838 ; N uni21CB ; G 2173\nU 8652 ; WX 838 ; N uni21CC ; G 2174\nU 8653 ; WX 838 ; N uni21CD ; G 2175\nU 8654 ; WX 838 ; N uni21CE ; G 2176\nU 8655 ; WX 838 ; N uni21CF ; G 2177\nU 8656 ; WX 838 ; N arrowdblleft ; G 2178\nU 8657 ; WX 838 ; N arrowdblup ; G 2179\nU 8658 ; WX 838 ; N arrowdblright ; G 2180\nU 8659 ; WX 838 ; N arrowdbldown ; G 2181\nU 8660 ; WX 838 ; N arrowdblboth ; G 2182\nU 8661 ; WX 838 ; N uni21D5 ; G 2183\nU 8662 ; WX 838 ; N uni21D6 ; G 2184\nU 8663 ; WX 838 ; N uni21D7 ; G 2185\nU 8664 ; WX 838 ; N uni21D8 ; G 2186\nU 8665 ; WX 838 ; N uni21D9 ; G 2187\nU 8666 ; WX 838 ; N uni21DA ; G 2188\nU 8667 ; WX 838 ; N uni21DB ; G 2189\nU 8668 ; WX 838 ; N uni21DC ; G 2190\nU 8669 ; WX 838 ; N uni21DD ; G 2191\nU 8670 ; WX 838 ; N uni21DE ; G 2192\nU 8671 ; WX 838 ; N uni21DF ; G 2193\nU 8672 ; WX 838 ; N uni21E0 ; G 2194\nU 8673 ; WX 838 ; N uni21E1 ; G 2195\nU 8674 ; WX 838 ; N uni21E2 ; G 2196\nU 8675 ; WX 838 ; N uni21E3 ; G 2197\nU 8676 ; WX 838 ; N uni21E4 ; G 2198\nU 8677 ; WX 838 ; N uni21E5 ; G 2199\nU 8678 ; WX 838 ; N uni21E6 ; G 2200\nU 8679 ; WX 838 ; N uni21E7 ; G 2201\nU 8680 ; WX 838 ; N uni21E8 ; G 2202\nU 8681 ; WX 838 ; N uni21E9 ; G 2203\nU 8682 ; WX 838 ; N uni21EA ; G 2204\nU 8683 ; WX 838 ; N uni21EB ; G 2205\nU 8684 ; WX 838 ; N uni21EC ; G 2206\nU 8685 ; WX 838 ; N uni21ED ; G 2207\nU 8686 ; WX 838 ; N uni21EE ; G 2208\nU 8687 ; WX 838 ; N uni21EF ; G 2209\nU 8688 ; WX 838 ; N uni21F0 ; G 2210\nU 8689 ; WX 838 ; N uni21F1 ; G 2211\nU 8690 ; WX 838 ; N uni21F2 ; G 2212\nU 8691 ; WX 838 ; N uni21F3 ; G 2213\nU 8692 ; WX 838 ; N uni21F4 ; G 2214\nU 8693 ; WX 838 ; N uni21F5 ; G 2215\nU 8694 ; WX 838 ; N uni21F6 ; G 2216\nU 8695 ; WX 838 ; N uni21F7 ; G 2217\nU 8696 ; WX 838 ; N uni21F8 ; G 2218\nU 8697 ; WX 838 ; N uni21F9 ; G 2219\nU 8698 ; WX 838 ; N uni21FA ; G 2220\nU 8699 ; WX 838 ; N uni21FB ; G 2221\nU 8700 ; WX 838 ; N uni21FC ; G 2222\nU 8701 ; WX 838 ; N uni21FD ; G 2223\nU 8702 ; WX 838 ; N uni21FE ; G 2224\nU 8703 ; WX 838 ; N uni21FF ; G 2225\nU 8704 ; WX 604 ; N universal ; G 2226\nU 8706 ; WX 517 ; N partialdiff ; G 2227\nU 8707 ; WX 542 ; N existential ; G 2228\nU 8708 ; WX 542 ; N uni2204 ; G 2229\nU 8710 ; WX 698 ; N increment ; G 2230\nU 8711 ; WX 698 ; N gradient ; G 2231\nU 8712 ; WX 740 ; N element ; G 2232\nU 8713 ; WX 740 ; N notelement ; G 2233\nU 8715 ; WX 740 ; N suchthat ; G 2234\nU 8716 ; WX 740 ; N uni220C ; G 2235\nU 8719 ; WX 796 ; N product ; G 2236\nU 8720 ; WX 796 ; N uni2210 ; G 2237\nU 8721 ; WX 714 ; N summation ; G 2238\nU 8722 ; WX 838 ; N minus ; G 2239\nU 8723 ; WX 838 ; N uni2213 ; G 2240\nU 8724 ; WX 838 ; N uni2214 ; G 2241\nU 8725 ; WX 337 ; N uni2215 ; G 2242\nU 8727 ; WX 680 ; N asteriskmath ; G 2243\nU 8728 ; WX 490 ; N uni2218 ; G 2244\nU 8729 ; WX 490 ; N uni2219 ; G 2245\nU 8730 ; WX 637 ; N radical ; G 2246\nU 8731 ; WX 637 ; N uni221B ; G 2247\nU 8732 ; WX 637 ; N uni221C ; G 2248\nU 8733 ; WX 677 ; N proportional ; G 2249\nU 8734 ; WX 833 ; N infinity ; G 2250\nU 8735 ; WX 838 ; N orthogonal ; G 2251\nU 8736 ; WX 838 ; N angle ; G 2252\nU 8739 ; WX 291 ; N uni2223 ; G 2253\nU 8740 ; WX 479 ; N uni2224 ; G 2254\nU 8741 ; WX 462 ; N uni2225 ; G 2255\nU 8742 ; WX 634 ; N uni2226 ; G 2256\nU 8743 ; WX 732 ; N logicaland ; G 2257\nU 8744 ; WX 732 ; N logicalor ; G 2258\nU 8745 ; WX 838 ; N intersection ; G 2259\nU 8746 ; WX 838 ; N union ; G 2260\nU 8747 ; WX 521 ; N integral ; G 2261\nU 8748 ; WX 852 ; N uni222C ; G 2262\nU 8749 ; WX 1182 ; N uni222D ; G 2263\nU 8760 ; WX 838 ; N uni2238 ; G 2264\nU 8761 ; WX 838 ; N uni2239 ; G 2265\nU 8762 ; WX 838 ; N uni223A ; G 2266\nU 8763 ; WX 838 ; N uni223B ; G 2267\nU 8764 ; WX 838 ; N similar ; G 2268\nU 8765 ; WX 838 ; N uni223D ; G 2269\nU 8770 ; WX 838 ; N uni2242 ; G 2270\nU 8771 ; WX 838 ; N uni2243 ; G 2271\nU 8776 ; WX 838 ; N approxequal ; G 2272\nU 8784 ; WX 838 ; N uni2250 ; G 2273\nU 8785 ; WX 838 ; N uni2251 ; G 2274\nU 8786 ; WX 838 ; N uni2252 ; G 2275\nU 8787 ; WX 838 ; N uni2253 ; G 2276\nU 8788 ; WX 1033 ; N uni2254 ; G 2277\nU 8789 ; WX 1033 ; N uni2255 ; G 2278\nU 8800 ; WX 838 ; N notequal ; G 2279\nU 8801 ; WX 838 ; N equivalence ; G 2280\nU 8804 ; WX 838 ; N lessequal ; G 2281\nU 8805 ; WX 838 ; N greaterequal ; G 2282\nU 8834 ; WX 838 ; N propersubset ; G 2283\nU 8835 ; WX 838 ; N propersuperset ; G 2284\nU 8836 ; WX 838 ; N notsubset ; G 2285\nU 8837 ; WX 838 ; N uni2285 ; G 2286\nU 8838 ; WX 838 ; N reflexsubset ; G 2287\nU 8839 ; WX 838 ; N reflexsuperset ; G 2288\nU 8844 ; WX 838 ; N uni228C ; G 2289\nU 8845 ; WX 838 ; N uni228D ; G 2290\nU 8846 ; WX 838 ; N uni228E ; G 2291\nU 8847 ; WX 846 ; N uni228F ; G 2292\nU 8848 ; WX 846 ; N uni2290 ; G 2293\nU 8849 ; WX 846 ; N uni2291 ; G 2294\nU 8850 ; WX 846 ; N uni2292 ; G 2295\nU 8851 ; WX 838 ; N uni2293 ; G 2296\nU 8852 ; WX 838 ; N uni2294 ; G 2297\nU 8853 ; WX 838 ; N circleplus ; G 2298\nU 8854 ; WX 838 ; N uni2296 ; G 2299\nU 8855 ; WX 838 ; N circlemultiply ; G 2300\nU 8856 ; WX 838 ; N uni2298 ; G 2301\nU 8857 ; WX 838 ; N uni2299 ; G 2302\nU 8858 ; WX 838 ; N uni229A ; G 2303\nU 8859 ; WX 838 ; N uni229B ; G 2304\nU 8860 ; WX 838 ; N uni229C ; G 2305\nU 8861 ; WX 838 ; N uni229D ; G 2306\nU 8862 ; WX 838 ; N uni229E ; G 2307\nU 8863 ; WX 838 ; N uni229F ; G 2308\nU 8864 ; WX 838 ; N uni22A0 ; G 2309\nU 8865 ; WX 838 ; N uni22A1 ; G 2310\nU 8866 ; WX 860 ; N uni22A2 ; G 2311\nU 8867 ; WX 860 ; N uni22A3 ; G 2312\nU 8868 ; WX 940 ; N uni22A4 ; G 2313\nU 8869 ; WX 940 ; N perpendicular ; G 2314\nU 8870 ; WX 567 ; N uni22A6 ; G 2315\nU 8871 ; WX 567 ; N uni22A7 ; G 2316\nU 8872 ; WX 860 ; N uni22A8 ; G 2317\nU 8873 ; WX 860 ; N uni22A9 ; G 2318\nU 8874 ; WX 860 ; N uni22AA ; G 2319\nU 8875 ; WX 1031 ; N uni22AB ; G 2320\nU 8876 ; WX 860 ; N uni22AC ; G 2321\nU 8877 ; WX 860 ; N uni22AD ; G 2322\nU 8878 ; WX 860 ; N uni22AE ; G 2323\nU 8879 ; WX 1031 ; N uni22AF ; G 2324\nU 8900 ; WX 626 ; N uni22C4 ; G 2325\nU 8901 ; WX 342 ; N dotmath ; G 2326\nU 8962 ; WX 764 ; N house ; G 2327\nU 8968 ; WX 390 ; N uni2308 ; G 2328\nU 8969 ; WX 390 ; N uni2309 ; G 2329\nU 8970 ; WX 390 ; N uni230A ; G 2330\nU 8971 ; WX 390 ; N uni230B ; G 2331\nU 8976 ; WX 838 ; N revlogicalnot ; G 2332\nU 8977 ; WX 513 ; N uni2311 ; G 2333\nU 8984 ; WX 1000 ; N uni2318 ; G 2334\nU 8985 ; WX 838 ; N uni2319 ; G 2335\nU 8992 ; WX 521 ; N integraltp ; G 2336\nU 8993 ; WX 521 ; N integralbt ; G 2337\nU 8997 ; WX 1000 ; N uni2325 ; G 2338\nU 9000 ; WX 1443 ; N uni2328 ; G 2339\nU 9085 ; WX 919 ; N uni237D ; G 2340\nU 9115 ; WX 500 ; N uni239B ; G 2341\nU 9116 ; WX 500 ; N uni239C ; G 2342\nU 9117 ; WX 500 ; N uni239D ; G 2343\nU 9118 ; WX 500 ; N uni239E ; G 2344\nU 9119 ; WX 500 ; N uni239F ; G 2345\nU 9120 ; WX 500 ; N uni23A0 ; G 2346\nU 9121 ; WX 500 ; N uni23A1 ; G 2347\nU 9122 ; WX 500 ; N uni23A2 ; G 2348\nU 9123 ; WX 500 ; N uni23A3 ; G 2349\nU 9124 ; WX 500 ; N uni23A4 ; G 2350\nU 9125 ; WX 500 ; N uni23A5 ; G 2351\nU 9126 ; WX 500 ; N uni23A6 ; G 2352\nU 9127 ; WX 750 ; N uni23A7 ; G 2353\nU 9128 ; WX 750 ; N uni23A8 ; G 2354\nU 9129 ; WX 750 ; N uni23A9 ; G 2355\nU 9130 ; WX 750 ; N uni23AA ; G 2356\nU 9131 ; WX 750 ; N uni23AB ; G 2357\nU 9132 ; WX 750 ; N uni23AC ; G 2358\nU 9133 ; WX 750 ; N uni23AD ; G 2359\nU 9134 ; WX 521 ; N uni23AE ; G 2360\nU 9167 ; WX 945 ; N uni23CF ; G 2361\nU 9251 ; WX 764 ; N uni2423 ; G 2362\nU 9472 ; WX 602 ; N SF100000 ; G 2363\nU 9473 ; WX 602 ; N uni2501 ; G 2364\nU 9474 ; WX 602 ; N SF110000 ; G 2365\nU 9475 ; WX 602 ; N uni2503 ; G 2366\nU 9476 ; WX 602 ; N uni2504 ; G 2367\nU 9477 ; WX 602 ; N uni2505 ; G 2368\nU 9478 ; WX 602 ; N uni2506 ; G 2369\nU 9479 ; WX 602 ; N uni2507 ; G 2370\nU 9480 ; WX 602 ; N uni2508 ; G 2371\nU 9481 ; WX 602 ; N uni2509 ; G 2372\nU 9482 ; WX 602 ; N uni250A ; G 2373\nU 9483 ; WX 602 ; N uni250B ; G 2374\nU 9484 ; WX 602 ; N SF010000 ; G 2375\nU 9485 ; WX 602 ; N uni250D ; G 2376\nU 9486 ; WX 602 ; N uni250E ; G 2377\nU 9487 ; WX 602 ; N uni250F ; G 2378\nU 9488 ; WX 602 ; N SF030000 ; G 2379\nU 9489 ; WX 602 ; N uni2511 ; G 2380\nU 9490 ; WX 602 ; N uni2512 ; G 2381\nU 9491 ; WX 602 ; N uni2513 ; G 2382\nU 9492 ; WX 602 ; N SF020000 ; G 2383\nU 9493 ; WX 602 ; N uni2515 ; G 2384\nU 9494 ; WX 602 ; N uni2516 ; G 2385\nU 9495 ; WX 602 ; N uni2517 ; G 2386\nU 9496 ; WX 602 ; N SF040000 ; G 2387\nU 9497 ; WX 602 ; N uni2519 ; G 2388\nU 9498 ; WX 602 ; N uni251A ; G 2389\nU 9499 ; WX 602 ; N uni251B ; G 2390\nU 9500 ; WX 602 ; N SF080000 ; G 2391\nU 9501 ; WX 602 ; N uni251D ; G 2392\nU 9502 ; WX 602 ; N uni251E ; G 2393\nU 9503 ; WX 602 ; N uni251F ; G 2394\nU 9504 ; WX 602 ; N uni2520 ; G 2395\nU 9505 ; WX 602 ; N uni2521 ; G 2396\nU 9506 ; WX 602 ; N uni2522 ; G 2397\nU 9507 ; WX 602 ; N uni2523 ; G 2398\nU 9508 ; WX 602 ; N SF090000 ; G 2399\nU 9509 ; WX 602 ; N uni2525 ; G 2400\nU 9510 ; WX 602 ; N uni2526 ; G 2401\nU 9511 ; WX 602 ; N uni2527 ; G 2402\nU 9512 ; WX 602 ; N uni2528 ; G 2403\nU 9513 ; WX 602 ; N uni2529 ; G 2404\nU 9514 ; WX 602 ; N uni252A ; G 2405\nU 9515 ; WX 602 ; N uni252B ; G 2406\nU 9516 ; WX 602 ; N SF060000 ; G 2407\nU 9517 ; WX 602 ; N uni252D ; G 2408\nU 9518 ; WX 602 ; N uni252E ; G 2409\nU 9519 ; WX 602 ; N uni252F ; G 2410\nU 9520 ; WX 602 ; N uni2530 ; G 2411\nU 9521 ; WX 602 ; N uni2531 ; G 2412\nU 9522 ; WX 602 ; N uni2532 ; G 2413\nU 9523 ; WX 602 ; N uni2533 ; G 2414\nU 9524 ; WX 602 ; N SF070000 ; G 2415\nU 9525 ; WX 602 ; N uni2535 ; G 2416\nU 9526 ; WX 602 ; N uni2536 ; G 2417\nU 9527 ; WX 602 ; N uni2537 ; G 2418\nU 9528 ; WX 602 ; N uni2538 ; G 2419\nU 9529 ; WX 602 ; N uni2539 ; G 2420\nU 9530 ; WX 602 ; N uni253A ; G 2421\nU 9531 ; WX 602 ; N uni253B ; G 2422\nU 9532 ; WX 602 ; N SF050000 ; G 2423\nU 9533 ; WX 602 ; N uni253D ; G 2424\nU 9534 ; WX 602 ; N uni253E ; G 2425\nU 9535 ; WX 602 ; N uni253F ; G 2426\nU 9536 ; WX 602 ; N uni2540 ; G 2427\nU 9537 ; WX 602 ; N uni2541 ; G 2428\nU 9538 ; WX 602 ; N uni2542 ; G 2429\nU 9539 ; WX 602 ; N uni2543 ; G 2430\nU 9540 ; WX 602 ; N uni2544 ; G 2431\nU 9541 ; WX 602 ; N uni2545 ; G 2432\nU 9542 ; WX 602 ; N uni2546 ; G 2433\nU 9543 ; WX 602 ; N uni2547 ; G 2434\nU 9544 ; WX 602 ; N uni2548 ; G 2435\nU 9545 ; WX 602 ; N uni2549 ; G 2436\nU 9546 ; WX 602 ; N uni254A ; G 2437\nU 9547 ; WX 602 ; N uni254B ; G 2438\nU 9548 ; WX 602 ; N uni254C ; G 2439\nU 9549 ; WX 602 ; N uni254D ; G 2440\nU 9550 ; WX 602 ; N uni254E ; G 2441\nU 9551 ; WX 602 ; N uni254F ; G 2442\nU 9552 ; WX 602 ; N SF430000 ; G 2443\nU 9553 ; WX 602 ; N SF240000 ; G 2444\nU 9554 ; WX 602 ; N SF510000 ; G 2445\nU 9555 ; WX 602 ; N SF520000 ; G 2446\nU 9556 ; WX 602 ; N SF390000 ; G 2447\nU 9557 ; WX 602 ; N SF220000 ; G 2448\nU 9558 ; WX 602 ; N SF210000 ; G 2449\nU 9559 ; WX 602 ; N SF250000 ; G 2450\nU 9560 ; WX 602 ; N SF500000 ; G 2451\nU 9561 ; WX 602 ; N SF490000 ; G 2452\nU 9562 ; WX 602 ; N SF380000 ; G 2453\nU 9563 ; WX 602 ; N SF280000 ; G 2454\nU 9564 ; WX 602 ; N SF270000 ; G 2455\nU 9565 ; WX 602 ; N SF260000 ; G 2456\nU 9566 ; WX 602 ; N SF360000 ; G 2457\nU 9567 ; WX 602 ; N SF370000 ; G 2458\nU 9568 ; WX 602 ; N SF420000 ; G 2459\nU 9569 ; WX 602 ; N SF190000 ; G 2460\nU 9570 ; WX 602 ; N SF200000 ; G 2461\nU 9571 ; WX 602 ; N SF230000 ; G 2462\nU 9572 ; WX 602 ; N SF470000 ; G 2463\nU 9573 ; WX 602 ; N SF480000 ; G 2464\nU 9574 ; WX 602 ; N SF410000 ; G 2465\nU 9575 ; WX 602 ; N SF450000 ; G 2466\nU 9576 ; WX 602 ; N SF460000 ; G 2467\nU 9577 ; WX 602 ; N SF400000 ; G 2468\nU 9578 ; WX 602 ; N SF540000 ; G 2469\nU 9579 ; WX 602 ; N SF530000 ; G 2470\nU 9580 ; WX 602 ; N SF440000 ; G 2471\nU 9581 ; WX 602 ; N uni256D ; G 2472\nU 9582 ; WX 602 ; N uni256E ; G 2473\nU 9583 ; WX 602 ; N uni256F ; G 2474\nU 9584 ; WX 602 ; N uni2570 ; G 2475\nU 9585 ; WX 602 ; N uni2571 ; G 2476\nU 9586 ; WX 602 ; N uni2572 ; G 2477\nU 9587 ; WX 602 ; N uni2573 ; G 2478\nU 9588 ; WX 602 ; N uni2574 ; G 2479\nU 9589 ; WX 602 ; N uni2575 ; G 2480\nU 9590 ; WX 602 ; N uni2576 ; G 2481\nU 9591 ; WX 602 ; N uni2577 ; G 2482\nU 9592 ; WX 602 ; N uni2578 ; G 2483\nU 9593 ; WX 602 ; N uni2579 ; G 2484\nU 9594 ; WX 602 ; N uni257A ; G 2485\nU 9595 ; WX 602 ; N uni257B ; G 2486\nU 9596 ; WX 602 ; N uni257C ; G 2487\nU 9597 ; WX 602 ; N uni257D ; G 2488\nU 9598 ; WX 602 ; N uni257E ; G 2489\nU 9599 ; WX 602 ; N uni257F ; G 2490\nU 9600 ; WX 769 ; N upblock ; G 2491\nU 9601 ; WX 769 ; N uni2581 ; G 2492\nU 9602 ; WX 769 ; N uni2582 ; G 2493\nU 9603 ; WX 769 ; N uni2583 ; G 2494\nU 9604 ; WX 769 ; N dnblock ; G 2495\nU 9605 ; WX 769 ; N uni2585 ; G 2496\nU 9606 ; WX 769 ; N uni2586 ; G 2497\nU 9607 ; WX 769 ; N uni2587 ; G 2498\nU 9608 ; WX 769 ; N block ; G 2499\nU 9609 ; WX 769 ; N uni2589 ; G 2500\nU 9610 ; WX 769 ; N uni258A ; G 2501\nU 9611 ; WX 769 ; N uni258B ; G 2502\nU 9612 ; WX 769 ; N lfblock ; G 2503\nU 9613 ; WX 769 ; N uni258D ; G 2504\nU 9614 ; WX 769 ; N uni258E ; G 2505\nU 9615 ; WX 769 ; N uni258F ; G 2506\nU 9616 ; WX 769 ; N rtblock ; G 2507\nU 9617 ; WX 769 ; N ltshade ; G 2508\nU 9618 ; WX 769 ; N shade ; G 2509\nU 9619 ; WX 769 ; N dkshade ; G 2510\nU 9620 ; WX 769 ; N uni2594 ; G 2511\nU 9621 ; WX 769 ; N uni2595 ; G 2512\nU 9622 ; WX 769 ; N uni2596 ; G 2513\nU 9623 ; WX 769 ; N uni2597 ; G 2514\nU 9624 ; WX 769 ; N uni2598 ; G 2515\nU 9625 ; WX 769 ; N uni2599 ; G 2516\nU 9626 ; WX 769 ; N uni259A ; G 2517\nU 9627 ; WX 769 ; N uni259B ; G 2518\nU 9628 ; WX 769 ; N uni259C ; G 2519\nU 9629 ; WX 769 ; N uni259D ; G 2520\nU 9630 ; WX 769 ; N uni259E ; G 2521\nU 9631 ; WX 769 ; N uni259F ; G 2522\nU 9632 ; WX 945 ; N filledbox ; G 2523\nU 9633 ; WX 945 ; N H22073 ; G 2524\nU 9634 ; WX 945 ; N uni25A2 ; G 2525\nU 9635 ; WX 945 ; N uni25A3 ; G 2526\nU 9636 ; WX 945 ; N uni25A4 ; G 2527\nU 9637 ; WX 945 ; N uni25A5 ; G 2528\nU 9638 ; WX 945 ; N uni25A6 ; G 2529\nU 9639 ; WX 945 ; N uni25A7 ; G 2530\nU 9640 ; WX 945 ; N uni25A8 ; G 2531\nU 9641 ; WX 945 ; N uni25A9 ; G 2532\nU 9642 ; WX 678 ; N H18543 ; G 2533\nU 9643 ; WX 678 ; N H18551 ; G 2534\nU 9644 ; WX 945 ; N filledrect ; G 2535\nU 9645 ; WX 945 ; N uni25AD ; G 2536\nU 9646 ; WX 550 ; N uni25AE ; G 2537\nU 9647 ; WX 550 ; N uni25AF ; G 2538\nU 9648 ; WX 769 ; N uni25B0 ; G 2539\nU 9649 ; WX 769 ; N uni25B1 ; G 2540\nU 9650 ; WX 769 ; N triagup ; G 2541\nU 9651 ; WX 769 ; N uni25B3 ; G 2542\nU 9652 ; WX 502 ; N uni25B4 ; G 2543\nU 9653 ; WX 502 ; N uni25B5 ; G 2544\nU 9654 ; WX 769 ; N uni25B6 ; G 2545\nU 9655 ; WX 769 ; N uni25B7 ; G 2546\nU 9656 ; WX 502 ; N uni25B8 ; G 2547\nU 9657 ; WX 502 ; N uni25B9 ; G 2548\nU 9658 ; WX 769 ; N triagrt ; G 2549\nU 9659 ; WX 769 ; N uni25BB ; G 2550\nU 9660 ; WX 769 ; N triagdn ; G 2551\nU 9661 ; WX 769 ; N uni25BD ; G 2552\nU 9662 ; WX 502 ; N uni25BE ; G 2553\nU 9663 ; WX 502 ; N uni25BF ; G 2554\nU 9664 ; WX 769 ; N uni25C0 ; G 2555\nU 9665 ; WX 769 ; N uni25C1 ; G 2556\nU 9666 ; WX 502 ; N uni25C2 ; G 2557\nU 9667 ; WX 502 ; N uni25C3 ; G 2558\nU 9668 ; WX 769 ; N triaglf ; G 2559\nU 9669 ; WX 769 ; N uni25C5 ; G 2560\nU 9670 ; WX 769 ; N uni25C6 ; G 2561\nU 9671 ; WX 769 ; N uni25C7 ; G 2562\nU 9672 ; WX 769 ; N uni25C8 ; G 2563\nU 9673 ; WX 873 ; N uni25C9 ; G 2564\nU 9674 ; WX 494 ; N lozenge ; G 2565\nU 9675 ; WX 873 ; N circle ; G 2566\nU 9676 ; WX 873 ; N uni25CC ; G 2567\nU 9677 ; WX 873 ; N uni25CD ; G 2568\nU 9678 ; WX 873 ; N uni25CE ; G 2569\nU 9679 ; WX 873 ; N H18533 ; G 2570\nU 9680 ; WX 873 ; N uni25D0 ; G 2571\nU 9681 ; WX 873 ; N uni25D1 ; G 2572\nU 9682 ; WX 873 ; N uni25D2 ; G 2573\nU 9683 ; WX 873 ; N uni25D3 ; G 2574\nU 9684 ; WX 873 ; N uni25D4 ; G 2575\nU 9685 ; WX 873 ; N uni25D5 ; G 2576\nU 9686 ; WX 527 ; N uni25D6 ; G 2577\nU 9687 ; WX 527 ; N uni25D7 ; G 2578\nU 9688 ; WX 791 ; N invbullet ; G 2579\nU 9689 ; WX 970 ; N invcircle ; G 2580\nU 9690 ; WX 970 ; N uni25DA ; G 2581\nU 9691 ; WX 970 ; N uni25DB ; G 2582\nU 9692 ; WX 387 ; N uni25DC ; G 2583\nU 9693 ; WX 387 ; N uni25DD ; G 2584\nU 9694 ; WX 387 ; N uni25DE ; G 2585\nU 9695 ; WX 387 ; N uni25DF ; G 2586\nU 9696 ; WX 873 ; N uni25E0 ; G 2587\nU 9697 ; WX 873 ; N uni25E1 ; G 2588\nU 9698 ; WX 769 ; N uni25E2 ; G 2589\nU 9699 ; WX 769 ; N uni25E3 ; G 2590\nU 9700 ; WX 769 ; N uni25E4 ; G 2591\nU 9701 ; WX 769 ; N uni25E5 ; G 2592\nU 9702 ; WX 590 ; N openbullet ; G 2593\nU 9703 ; WX 945 ; N uni25E7 ; G 2594\nU 9704 ; WX 945 ; N uni25E8 ; G 2595\nU 9705 ; WX 945 ; N uni25E9 ; G 2596\nU 9706 ; WX 945 ; N uni25EA ; G 2597\nU 9707 ; WX 945 ; N uni25EB ; G 2598\nU 9708 ; WX 769 ; N uni25EC ; G 2599\nU 9709 ; WX 769 ; N uni25ED ; G 2600\nU 9710 ; WX 769 ; N uni25EE ; G 2601\nU 9711 ; WX 1119 ; N uni25EF ; G 2602\nU 9712 ; WX 945 ; N uni25F0 ; G 2603\nU 9713 ; WX 945 ; N uni25F1 ; G 2604\nU 9714 ; WX 945 ; N uni25F2 ; G 2605\nU 9715 ; WX 945 ; N uni25F3 ; G 2606\nU 9716 ; WX 873 ; N uni25F4 ; G 2607\nU 9717 ; WX 873 ; N uni25F5 ; G 2608\nU 9718 ; WX 873 ; N uni25F6 ; G 2609\nU 9719 ; WX 873 ; N uni25F7 ; G 2610\nU 9720 ; WX 769 ; N uni25F8 ; G 2611\nU 9721 ; WX 769 ; N uni25F9 ; G 2612\nU 9722 ; WX 769 ; N uni25FA ; G 2613\nU 9723 ; WX 830 ; N uni25FB ; G 2614\nU 9724 ; WX 830 ; N uni25FC ; G 2615\nU 9725 ; WX 732 ; N uni25FD ; G 2616\nU 9726 ; WX 732 ; N uni25FE ; G 2617\nU 9727 ; WX 769 ; N uni25FF ; G 2618\nU 9728 ; WX 896 ; N uni2600 ; G 2619\nU 9784 ; WX 896 ; N uni2638 ; G 2620\nU 9785 ; WX 896 ; N uni2639 ; G 2621\nU 9786 ; WX 896 ; N smileface ; G 2622\nU 9787 ; WX 896 ; N invsmileface ; G 2623\nU 9788 ; WX 896 ; N sun ; G 2624\nU 9791 ; WX 614 ; N uni263F ; G 2625\nU 9792 ; WX 731 ; N female ; G 2626\nU 9793 ; WX 731 ; N uni2641 ; G 2627\nU 9794 ; WX 896 ; N male ; G 2628\nU 9795 ; WX 896 ; N uni2643 ; G 2629\nU 9796 ; WX 896 ; N uni2644 ; G 2630\nU 9797 ; WX 896 ; N uni2645 ; G 2631\nU 9798 ; WX 896 ; N uni2646 ; G 2632\nU 9799 ; WX 896 ; N uni2647 ; G 2633\nU 9824 ; WX 896 ; N spade ; G 2634\nU 9825 ; WX 896 ; N uni2661 ; G 2635\nU 9826 ; WX 896 ; N uni2662 ; G 2636\nU 9827 ; WX 896 ; N club ; G 2637\nU 9828 ; WX 896 ; N uni2664 ; G 2638\nU 9829 ; WX 896 ; N heart ; G 2639\nU 9830 ; WX 896 ; N diamond ; G 2640\nU 9831 ; WX 896 ; N uni2667 ; G 2641\nU 9833 ; WX 472 ; N uni2669 ; G 2642\nU 9834 ; WX 638 ; N musicalnote ; G 2643\nU 9835 ; WX 896 ; N musicalnotedbl ; G 2644\nU 9836 ; WX 896 ; N uni266C ; G 2645\nU 9837 ; WX 472 ; N uni266D ; G 2646\nU 9838 ; WX 357 ; N uni266E ; G 2647\nU 9839 ; WX 484 ; N uni266F ; G 2648\nU 10145 ; WX 838 ; N uni27A1 ; G 2649\nU 10181 ; WX 390 ; N uni27C5 ; G 2650\nU 10182 ; WX 390 ; N uni27C6 ; G 2651\nU 10208 ; WX 494 ; N uni27E0 ; G 2652\nU 10216 ; WX 390 ; N uni27E8 ; G 2653\nU 10217 ; WX 390 ; N uni27E9 ; G 2654\nU 10224 ; WX 838 ; N uni27F0 ; G 2655\nU 10225 ; WX 838 ; N uni27F1 ; G 2656\nU 10226 ; WX 838 ; N uni27F2 ; G 2657\nU 10227 ; WX 838 ; N uni27F3 ; G 2658\nU 10228 ; WX 1033 ; N uni27F4 ; G 2659\nU 10229 ; WX 1434 ; N uni27F5 ; G 2660\nU 10230 ; WX 1434 ; N uni27F6 ; G 2661\nU 10231 ; WX 1434 ; N uni27F7 ; G 2662\nU 10232 ; WX 1434 ; N uni27F8 ; G 2663\nU 10233 ; WX 1434 ; N uni27F9 ; G 2664\nU 10234 ; WX 1434 ; N uni27FA ; G 2665\nU 10235 ; WX 1434 ; N uni27FB ; G 2666\nU 10236 ; WX 1434 ; N uni27FC ; G 2667\nU 10237 ; WX 1434 ; N uni27FD ; G 2668\nU 10238 ; WX 1434 ; N uni27FE ; G 2669\nU 10239 ; WX 1434 ; N uni27FF ; G 2670\nU 10240 ; WX 732 ; N uni2800 ; G 2671\nU 10241 ; WX 732 ; N uni2801 ; G 2672\nU 10242 ; WX 732 ; N uni2802 ; G 2673\nU 10243 ; WX 732 ; N uni2803 ; G 2674\nU 10244 ; WX 732 ; N uni2804 ; G 2675\nU 10245 ; WX 732 ; N uni2805 ; G 2676\nU 10246 ; WX 732 ; N uni2806 ; G 2677\nU 10247 ; WX 732 ; N uni2807 ; G 2678\nU 10248 ; WX 732 ; N uni2808 ; G 2679\nU 10249 ; WX 732 ; N uni2809 ; G 2680\nU 10250 ; WX 732 ; N uni280A ; G 2681\nU 10251 ; WX 732 ; N uni280B ; G 2682\nU 10252 ; WX 732 ; N uni280C ; G 2683\nU 10253 ; WX 732 ; N uni280D ; G 2684\nU 10254 ; WX 732 ; N uni280E ; G 2685\nU 10255 ; WX 732 ; N uni280F ; G 2686\nU 10256 ; WX 732 ; N uni2810 ; G 2687\nU 10257 ; WX 732 ; N uni2811 ; G 2688\nU 10258 ; WX 732 ; N uni2812 ; G 2689\nU 10259 ; WX 732 ; N uni2813 ; G 2690\nU 10260 ; WX 732 ; N uni2814 ; G 2691\nU 10261 ; WX 732 ; N uni2815 ; G 2692\nU 10262 ; WX 732 ; N uni2816 ; G 2693\nU 10263 ; WX 732 ; N uni2817 ; G 2694\nU 10264 ; WX 732 ; N uni2818 ; G 2695\nU 10265 ; WX 732 ; N uni2819 ; G 2696\nU 10266 ; WX 732 ; N uni281A ; G 2697\nU 10267 ; WX 732 ; N uni281B ; G 2698\nU 10268 ; WX 732 ; N uni281C ; G 2699\nU 10269 ; WX 732 ; N uni281D ; G 2700\nU 10270 ; WX 732 ; N uni281E ; G 2701\nU 10271 ; WX 732 ; N uni281F ; G 2702\nU 10272 ; WX 732 ; N uni2820 ; G 2703\nU 10273 ; WX 732 ; N uni2821 ; G 2704\nU 10274 ; WX 732 ; N uni2822 ; G 2705\nU 10275 ; WX 732 ; N uni2823 ; G 2706\nU 10276 ; WX 732 ; N uni2824 ; G 2707\nU 10277 ; WX 732 ; N uni2825 ; G 2708\nU 10278 ; WX 732 ; N uni2826 ; G 2709\nU 10279 ; WX 732 ; N uni2827 ; G 2710\nU 10280 ; WX 732 ; N uni2828 ; G 2711\nU 10281 ; WX 732 ; N uni2829 ; G 2712\nU 10282 ; WX 732 ; N uni282A ; G 2713\nU 10283 ; WX 732 ; N uni282B ; G 2714\nU 10284 ; WX 732 ; N uni282C ; G 2715\nU 10285 ; WX 732 ; N uni282D ; G 2716\nU 10286 ; WX 732 ; N uni282E ; G 2717\nU 10287 ; WX 732 ; N uni282F ; G 2718\nU 10288 ; WX 732 ; N uni2830 ; G 2719\nU 10289 ; WX 732 ; N uni2831 ; G 2720\nU 10290 ; WX 732 ; N uni2832 ; G 2721\nU 10291 ; WX 732 ; N uni2833 ; G 2722\nU 10292 ; WX 732 ; N uni2834 ; G 2723\nU 10293 ; WX 732 ; N uni2835 ; G 2724\nU 10294 ; WX 732 ; N uni2836 ; G 2725\nU 10295 ; WX 732 ; N uni2837 ; G 2726\nU 10296 ; WX 732 ; N uni2838 ; G 2727\nU 10297 ; WX 732 ; N uni2839 ; G 2728\nU 10298 ; WX 732 ; N uni283A ; G 2729\nU 10299 ; WX 732 ; N uni283B ; G 2730\nU 10300 ; WX 732 ; N uni283C ; G 2731\nU 10301 ; WX 732 ; N uni283D ; G 2732\nU 10302 ; WX 732 ; N uni283E ; G 2733\nU 10303 ; WX 732 ; N uni283F ; G 2734\nU 10304 ; WX 732 ; N uni2840 ; G 2735\nU 10305 ; WX 732 ; N uni2841 ; G 2736\nU 10306 ; WX 732 ; N uni2842 ; G 2737\nU 10307 ; WX 732 ; N uni2843 ; G 2738\nU 10308 ; WX 732 ; N uni2844 ; G 2739\nU 10309 ; WX 732 ; N uni2845 ; G 2740\nU 10310 ; WX 732 ; N uni2846 ; G 2741\nU 10311 ; WX 732 ; N uni2847 ; G 2742\nU 10312 ; WX 732 ; N uni2848 ; G 2743\nU 10313 ; WX 732 ; N uni2849 ; G 2744\nU 10314 ; WX 732 ; N uni284A ; G 2745\nU 10315 ; WX 732 ; N uni284B ; G 2746\nU 10316 ; WX 732 ; N uni284C ; G 2747\nU 10317 ; WX 732 ; N uni284D ; G 2748\nU 10318 ; WX 732 ; N uni284E ; G 2749\nU 10319 ; WX 732 ; N uni284F ; G 2750\nU 10320 ; WX 732 ; N uni2850 ; G 2751\nU 10321 ; WX 732 ; N uni2851 ; G 2752\nU 10322 ; WX 732 ; N uni2852 ; G 2753\nU 10323 ; WX 732 ; N uni2853 ; G 2754\nU 10324 ; WX 732 ; N uni2854 ; G 2755\nU 10325 ; WX 732 ; N uni2855 ; G 2756\nU 10326 ; WX 732 ; N uni2856 ; G 2757\nU 10327 ; WX 732 ; N uni2857 ; G 2758\nU 10328 ; WX 732 ; N uni2858 ; G 2759\nU 10329 ; WX 732 ; N uni2859 ; G 2760\nU 10330 ; WX 732 ; N uni285A ; G 2761\nU 10331 ; WX 732 ; N uni285B ; G 2762\nU 10332 ; WX 732 ; N uni285C ; G 2763\nU 10333 ; WX 732 ; N uni285D ; G 2764\nU 10334 ; WX 732 ; N uni285E ; G 2765\nU 10335 ; WX 732 ; N uni285F ; G 2766\nU 10336 ; WX 732 ; N uni2860 ; G 2767\nU 10337 ; WX 732 ; N uni2861 ; G 2768\nU 10338 ; WX 732 ; N uni2862 ; G 2769\nU 10339 ; WX 732 ; N uni2863 ; G 2770\nU 10340 ; WX 732 ; N uni2864 ; G 2771\nU 10341 ; WX 732 ; N uni2865 ; G 2772\nU 10342 ; WX 732 ; N uni2866 ; G 2773\nU 10343 ; WX 732 ; N uni2867 ; G 2774\nU 10344 ; WX 732 ; N uni2868 ; G 2775\nU 10345 ; WX 732 ; N uni2869 ; G 2776\nU 10346 ; WX 732 ; N uni286A ; G 2777\nU 10347 ; WX 732 ; N uni286B ; G 2778\nU 10348 ; WX 732 ; N uni286C ; G 2779\nU 10349 ; WX 732 ; N uni286D ; G 2780\nU 10350 ; WX 732 ; N uni286E ; G 2781\nU 10351 ; WX 732 ; N uni286F ; G 2782\nU 10352 ; WX 732 ; N uni2870 ; G 2783\nU 10353 ; WX 732 ; N uni2871 ; G 2784\nU 10354 ; WX 732 ; N uni2872 ; G 2785\nU 10355 ; WX 732 ; N uni2873 ; G 2786\nU 10356 ; WX 732 ; N uni2874 ; G 2787\nU 10357 ; WX 732 ; N uni2875 ; G 2788\nU 10358 ; WX 732 ; N uni2876 ; G 2789\nU 10359 ; WX 732 ; N uni2877 ; G 2790\nU 10360 ; WX 732 ; N uni2878 ; G 2791\nU 10361 ; WX 732 ; N uni2879 ; G 2792\nU 10362 ; WX 732 ; N uni287A ; G 2793\nU 10363 ; WX 732 ; N uni287B ; G 2794\nU 10364 ; WX 732 ; N uni287C ; G 2795\nU 10365 ; WX 732 ; N uni287D ; G 2796\nU 10366 ; WX 732 ; N uni287E ; G 2797\nU 10367 ; WX 732 ; N uni287F ; G 2798\nU 10368 ; WX 732 ; N uni2880 ; G 2799\nU 10369 ; WX 732 ; N uni2881 ; G 2800\nU 10370 ; WX 732 ; N uni2882 ; G 2801\nU 10371 ; WX 732 ; N uni2883 ; G 2802\nU 10372 ; WX 732 ; N uni2884 ; G 2803\nU 10373 ; WX 732 ; N uni2885 ; G 2804\nU 10374 ; WX 732 ; N uni2886 ; G 2805\nU 10375 ; WX 732 ; N uni2887 ; G 2806\nU 10376 ; WX 732 ; N uni2888 ; G 2807\nU 10377 ; WX 732 ; N uni2889 ; G 2808\nU 10378 ; WX 732 ; N uni288A ; G 2809\nU 10379 ; WX 732 ; N uni288B ; G 2810\nU 10380 ; WX 732 ; N uni288C ; G 2811\nU 10381 ; WX 732 ; N uni288D ; G 2812\nU 10382 ; WX 732 ; N uni288E ; G 2813\nU 10383 ; WX 732 ; N uni288F ; G 2814\nU 10384 ; WX 732 ; N uni2890 ; G 2815\nU 10385 ; WX 732 ; N uni2891 ; G 2816\nU 10386 ; WX 732 ; N uni2892 ; G 2817\nU 10387 ; WX 732 ; N uni2893 ; G 2818\nU 10388 ; WX 732 ; N uni2894 ; G 2819\nU 10389 ; WX 732 ; N uni2895 ; G 2820\nU 10390 ; WX 732 ; N uni2896 ; G 2821\nU 10391 ; WX 732 ; N uni2897 ; G 2822\nU 10392 ; WX 732 ; N uni2898 ; G 2823\nU 10393 ; WX 732 ; N uni2899 ; G 2824\nU 10394 ; WX 732 ; N uni289A ; G 2825\nU 10395 ; WX 732 ; N uni289B ; G 2826\nU 10396 ; WX 732 ; N uni289C ; G 2827\nU 10397 ; WX 732 ; N uni289D ; G 2828\nU 10398 ; WX 732 ; N uni289E ; G 2829\nU 10399 ; WX 732 ; N uni289F ; G 2830\nU 10400 ; WX 732 ; N uni28A0 ; G 2831\nU 10401 ; WX 732 ; N uni28A1 ; G 2832\nU 10402 ; WX 732 ; N uni28A2 ; G 2833\nU 10403 ; WX 732 ; N uni28A3 ; G 2834\nU 10404 ; WX 732 ; N uni28A4 ; G 2835\nU 10405 ; WX 732 ; N uni28A5 ; G 2836\nU 10406 ; WX 732 ; N uni28A6 ; G 2837\nU 10407 ; WX 732 ; N uni28A7 ; G 2838\nU 10408 ; WX 732 ; N uni28A8 ; G 2839\nU 10409 ; WX 732 ; N uni28A9 ; G 2840\nU 10410 ; WX 732 ; N uni28AA ; G 2841\nU 10411 ; WX 732 ; N uni28AB ; G 2842\nU 10412 ; WX 732 ; N uni28AC ; G 2843\nU 10413 ; WX 732 ; N uni28AD ; G 2844\nU 10414 ; WX 732 ; N uni28AE ; G 2845\nU 10415 ; WX 732 ; N uni28AF ; G 2846\nU 10416 ; WX 732 ; N uni28B0 ; G 2847\nU 10417 ; WX 732 ; N uni28B1 ; G 2848\nU 10418 ; WX 732 ; N uni28B2 ; G 2849\nU 10419 ; WX 732 ; N uni28B3 ; G 2850\nU 10420 ; WX 732 ; N uni28B4 ; G 2851\nU 10421 ; WX 732 ; N uni28B5 ; G 2852\nU 10422 ; WX 732 ; N uni28B6 ; G 2853\nU 10423 ; WX 732 ; N uni28B7 ; G 2854\nU 10424 ; WX 732 ; N uni28B8 ; G 2855\nU 10425 ; WX 732 ; N uni28B9 ; G 2856\nU 10426 ; WX 732 ; N uni28BA ; G 2857\nU 10427 ; WX 732 ; N uni28BB ; G 2858\nU 10428 ; WX 732 ; N uni28BC ; G 2859\nU 10429 ; WX 732 ; N uni28BD ; G 2860\nU 10430 ; WX 732 ; N uni28BE ; G 2861\nU 10431 ; WX 732 ; N uni28BF ; G 2862\nU 10432 ; WX 732 ; N uni28C0 ; G 2863\nU 10433 ; WX 732 ; N uni28C1 ; G 2864\nU 10434 ; WX 732 ; N uni28C2 ; G 2865\nU 10435 ; WX 732 ; N uni28C3 ; G 2866\nU 10436 ; WX 732 ; N uni28C4 ; G 2867\nU 10437 ; WX 732 ; N uni28C5 ; G 2868\nU 10438 ; WX 732 ; N uni28C6 ; G 2869\nU 10439 ; WX 732 ; N uni28C7 ; G 2870\nU 10440 ; WX 732 ; N uni28C8 ; G 2871\nU 10441 ; WX 732 ; N uni28C9 ; G 2872\nU 10442 ; WX 732 ; N uni28CA ; G 2873\nU 10443 ; WX 732 ; N uni28CB ; G 2874\nU 10444 ; WX 732 ; N uni28CC ; G 2875\nU 10445 ; WX 732 ; N uni28CD ; G 2876\nU 10446 ; WX 732 ; N uni28CE ; G 2877\nU 10447 ; WX 732 ; N uni28CF ; G 2878\nU 10448 ; WX 732 ; N uni28D0 ; G 2879\nU 10449 ; WX 732 ; N uni28D1 ; G 2880\nU 10450 ; WX 732 ; N uni28D2 ; G 2881\nU 10451 ; WX 732 ; N uni28D3 ; G 2882\nU 10452 ; WX 732 ; N uni28D4 ; G 2883\nU 10453 ; WX 732 ; N uni28D5 ; G 2884\nU 10454 ; WX 732 ; N uni28D6 ; G 2885\nU 10455 ; WX 732 ; N uni28D7 ; G 2886\nU 10456 ; WX 732 ; N uni28D8 ; G 2887\nU 10457 ; WX 732 ; N uni28D9 ; G 2888\nU 10458 ; WX 732 ; N uni28DA ; G 2889\nU 10459 ; WX 732 ; N uni28DB ; G 2890\nU 10460 ; WX 732 ; N uni28DC ; G 2891\nU 10461 ; WX 732 ; N uni28DD ; G 2892\nU 10462 ; WX 732 ; N uni28DE ; G 2893\nU 10463 ; WX 732 ; N uni28DF ; G 2894\nU 10464 ; WX 732 ; N uni28E0 ; G 2895\nU 10465 ; WX 732 ; N uni28E1 ; G 2896\nU 10466 ; WX 732 ; N uni28E2 ; G 2897\nU 10467 ; WX 732 ; N uni28E3 ; G 2898\nU 10468 ; WX 732 ; N uni28E4 ; G 2899\nU 10469 ; WX 732 ; N uni28E5 ; G 2900\nU 10470 ; WX 732 ; N uni28E6 ; G 2901\nU 10471 ; WX 732 ; N uni28E7 ; G 2902\nU 10472 ; WX 732 ; N uni28E8 ; G 2903\nU 10473 ; WX 732 ; N uni28E9 ; G 2904\nU 10474 ; WX 732 ; N uni28EA ; G 2905\nU 10475 ; WX 732 ; N uni28EB ; G 2906\nU 10476 ; WX 732 ; N uni28EC ; G 2907\nU 10477 ; WX 732 ; N uni28ED ; G 2908\nU 10478 ; WX 732 ; N uni28EE ; G 2909\nU 10479 ; WX 732 ; N uni28EF ; G 2910\nU 10480 ; WX 732 ; N uni28F0 ; G 2911\nU 10481 ; WX 732 ; N uni28F1 ; G 2912\nU 10482 ; WX 732 ; N uni28F2 ; G 2913\nU 10483 ; WX 732 ; N uni28F3 ; G 2914\nU 10484 ; WX 732 ; N uni28F4 ; G 2915\nU 10485 ; WX 732 ; N uni28F5 ; G 2916\nU 10486 ; WX 732 ; N uni28F6 ; G 2917\nU 10487 ; WX 732 ; N uni28F7 ; G 2918\nU 10488 ; WX 732 ; N uni28F8 ; G 2919\nU 10489 ; WX 732 ; N uni28F9 ; G 2920\nU 10490 ; WX 732 ; N uni28FA ; G 2921\nU 10491 ; WX 732 ; N uni28FB ; G 2922\nU 10492 ; WX 732 ; N uni28FC ; G 2923\nU 10493 ; WX 732 ; N uni28FD ; G 2924\nU 10494 ; WX 732 ; N uni28FE ; G 2925\nU 10495 ; WX 732 ; N uni28FF ; G 2926\nU 10496 ; WX 838 ; N uni2900 ; G 2927\nU 10497 ; WX 838 ; N uni2901 ; G 2928\nU 10498 ; WX 838 ; N uni2902 ; G 2929\nU 10499 ; WX 838 ; N uni2903 ; G 2930\nU 10500 ; WX 838 ; N uni2904 ; G 2931\nU 10501 ; WX 838 ; N uni2905 ; G 2932\nU 10502 ; WX 838 ; N uni2906 ; G 2933\nU 10503 ; WX 838 ; N uni2907 ; G 2934\nU 10504 ; WX 838 ; N uni2908 ; G 2935\nU 10505 ; WX 838 ; N uni2909 ; G 2936\nU 10506 ; WX 838 ; N uni290A ; G 2937\nU 10507 ; WX 838 ; N uni290B ; G 2938\nU 10508 ; WX 838 ; N uni290C ; G 2939\nU 10509 ; WX 838 ; N uni290D ; G 2940\nU 10510 ; WX 838 ; N uni290E ; G 2941\nU 10511 ; WX 838 ; N uni290F ; G 2942\nU 10512 ; WX 838 ; N uni2910 ; G 2943\nU 10513 ; WX 838 ; N uni2911 ; G 2944\nU 10514 ; WX 838 ; N uni2912 ; G 2945\nU 10515 ; WX 838 ; N uni2913 ; G 2946\nU 10516 ; WX 838 ; N uni2914 ; G 2947\nU 10517 ; WX 838 ; N uni2915 ; G 2948\nU 10518 ; WX 838 ; N uni2916 ; G 2949\nU 10519 ; WX 838 ; N uni2917 ; G 2950\nU 10520 ; WX 838 ; N uni2918 ; G 2951\nU 10521 ; WX 838 ; N uni2919 ; G 2952\nU 10522 ; WX 838 ; N uni291A ; G 2953\nU 10523 ; WX 838 ; N uni291B ; G 2954\nU 10524 ; WX 838 ; N uni291C ; G 2955\nU 10525 ; WX 838 ; N uni291D ; G 2956\nU 10526 ; WX 838 ; N uni291E ; G 2957\nU 10527 ; WX 838 ; N uni291F ; G 2958\nU 10528 ; WX 838 ; N uni2920 ; G 2959\nU 10529 ; WX 838 ; N uni2921 ; G 2960\nU 10530 ; WX 838 ; N uni2922 ; G 2961\nU 10531 ; WX 838 ; N uni2923 ; G 2962\nU 10532 ; WX 838 ; N uni2924 ; G 2963\nU 10533 ; WX 838 ; N uni2925 ; G 2964\nU 10534 ; WX 838 ; N uni2926 ; G 2965\nU 10535 ; WX 838 ; N uni2927 ; G 2966\nU 10536 ; WX 838 ; N uni2928 ; G 2967\nU 10537 ; WX 838 ; N uni2929 ; G 2968\nU 10538 ; WX 838 ; N uni292A ; G 2969\nU 10539 ; WX 838 ; N uni292B ; G 2970\nU 10540 ; WX 838 ; N uni292C ; G 2971\nU 10541 ; WX 838 ; N uni292D ; G 2972\nU 10542 ; WX 838 ; N uni292E ; G 2973\nU 10543 ; WX 838 ; N uni292F ; G 2974\nU 10544 ; WX 838 ; N uni2930 ; G 2975\nU 10545 ; WX 838 ; N uni2931 ; G 2976\nU 10546 ; WX 838 ; N uni2932 ; G 2977\nU 10547 ; WX 838 ; N uni2933 ; G 2978\nU 10548 ; WX 838 ; N uni2934 ; G 2979\nU 10549 ; WX 838 ; N uni2935 ; G 2980\nU 10550 ; WX 838 ; N uni2936 ; G 2981\nU 10551 ; WX 838 ; N uni2937 ; G 2982\nU 10552 ; WX 838 ; N uni2938 ; G 2983\nU 10553 ; WX 838 ; N uni2939 ; G 2984\nU 10554 ; WX 838 ; N uni293A ; G 2985\nU 10555 ; WX 838 ; N uni293B ; G 2986\nU 10556 ; WX 838 ; N uni293C ; G 2987\nU 10557 ; WX 838 ; N uni293D ; G 2988\nU 10558 ; WX 838 ; N uni293E ; G 2989\nU 10559 ; WX 838 ; N uni293F ; G 2990\nU 10560 ; WX 838 ; N uni2940 ; G 2991\nU 10561 ; WX 838 ; N uni2941 ; G 2992\nU 10562 ; WX 838 ; N uni2942 ; G 2993\nU 10563 ; WX 838 ; N uni2943 ; G 2994\nU 10564 ; WX 838 ; N uni2944 ; G 2995\nU 10565 ; WX 838 ; N uni2945 ; G 2996\nU 10566 ; WX 838 ; N uni2946 ; G 2997\nU 10567 ; WX 838 ; N uni2947 ; G 2998\nU 10568 ; WX 838 ; N uni2948 ; G 2999\nU 10569 ; WX 838 ; N uni2949 ; G 3000\nU 10570 ; WX 838 ; N uni294A ; G 3001\nU 10571 ; WX 838 ; N uni294B ; G 3002\nU 10572 ; WX 838 ; N uni294C ; G 3003\nU 10573 ; WX 838 ; N uni294D ; G 3004\nU 10574 ; WX 838 ; N uni294E ; G 3005\nU 10575 ; WX 838 ; N uni294F ; G 3006\nU 10576 ; WX 838 ; N uni2950 ; G 3007\nU 10577 ; WX 838 ; N uni2951 ; G 3008\nU 10578 ; WX 838 ; N uni2952 ; G 3009\nU 10579 ; WX 838 ; N uni2953 ; G 3010\nU 10580 ; WX 838 ; N uni2954 ; G 3011\nU 10581 ; WX 838 ; N uni2955 ; G 3012\nU 10582 ; WX 838 ; N uni2956 ; G 3013\nU 10583 ; WX 838 ; N uni2957 ; G 3014\nU 10584 ; WX 838 ; N uni2958 ; G 3015\nU 10585 ; WX 838 ; N uni2959 ; G 3016\nU 10586 ; WX 838 ; N uni295A ; G 3017\nU 10587 ; WX 838 ; N uni295B ; G 3018\nU 10588 ; WX 838 ; N uni295C ; G 3019\nU 10589 ; WX 838 ; N uni295D ; G 3020\nU 10590 ; WX 838 ; N uni295E ; G 3021\nU 10591 ; WX 838 ; N uni295F ; G 3022\nU 10592 ; WX 838 ; N uni2960 ; G 3023\nU 10593 ; WX 838 ; N uni2961 ; G 3024\nU 10594 ; WX 838 ; N uni2962 ; G 3025\nU 10595 ; WX 838 ; N uni2963 ; G 3026\nU 10596 ; WX 838 ; N uni2964 ; G 3027\nU 10597 ; WX 838 ; N uni2965 ; G 3028\nU 10598 ; WX 838 ; N uni2966 ; G 3029\nU 10599 ; WX 838 ; N uni2967 ; G 3030\nU 10600 ; WX 838 ; N uni2968 ; G 3031\nU 10601 ; WX 838 ; N uni2969 ; G 3032\nU 10602 ; WX 838 ; N uni296A ; G 3033\nU 10603 ; WX 838 ; N uni296B ; G 3034\nU 10604 ; WX 838 ; N uni296C ; G 3035\nU 10605 ; WX 838 ; N uni296D ; G 3036\nU 10606 ; WX 838 ; N uni296E ; G 3037\nU 10607 ; WX 838 ; N uni296F ; G 3038\nU 10608 ; WX 838 ; N uni2970 ; G 3039\nU 10609 ; WX 838 ; N uni2971 ; G 3040\nU 10610 ; WX 838 ; N uni2972 ; G 3041\nU 10611 ; WX 838 ; N uni2973 ; G 3042\nU 10612 ; WX 838 ; N uni2974 ; G 3043\nU 10613 ; WX 838 ; N uni2975 ; G 3044\nU 10614 ; WX 838 ; N uni2976 ; G 3045\nU 10615 ; WX 981 ; N uni2977 ; G 3046\nU 10616 ; WX 838 ; N uni2978 ; G 3047\nU 10617 ; WX 838 ; N uni2979 ; G 3048\nU 10618 ; WX 984 ; N uni297A ; G 3049\nU 10619 ; WX 838 ; N uni297B ; G 3050\nU 10620 ; WX 838 ; N uni297C ; G 3051\nU 10621 ; WX 838 ; N uni297D ; G 3052\nU 10622 ; WX 838 ; N uni297E ; G 3053\nU 10623 ; WX 838 ; N uni297F ; G 3054\nU 10731 ; WX 494 ; N uni29EB ; G 3055\nU 10764 ; WX 1513 ; N uni2A0C ; G 3056\nU 10765 ; WX 521 ; N uni2A0D ; G 3057\nU 10766 ; WX 521 ; N uni2A0E ; G 3058\nU 10799 ; WX 838 ; N uni2A2F ; G 3059\nU 10858 ; WX 838 ; N uni2A6A ; G 3060\nU 10859 ; WX 838 ; N uni2A6B ; G 3061\nU 11008 ; WX 838 ; N uni2B00 ; G 3062\nU 11009 ; WX 838 ; N uni2B01 ; G 3063\nU 11010 ; WX 838 ; N uni2B02 ; G 3064\nU 11011 ; WX 838 ; N uni2B03 ; G 3065\nU 11012 ; WX 838 ; N uni2B04 ; G 3066\nU 11013 ; WX 838 ; N uni2B05 ; G 3067\nU 11014 ; WX 838 ; N uni2B06 ; G 3068\nU 11015 ; WX 838 ; N uni2B07 ; G 3069\nU 11016 ; WX 838 ; N uni2B08 ; G 3070\nU 11017 ; WX 838 ; N uni2B09 ; G 3071\nU 11018 ; WX 838 ; N uni2B0A ; G 3072\nU 11019 ; WX 838 ; N uni2B0B ; G 3073\nU 11020 ; WX 838 ; N uni2B0C ; G 3074\nU 11021 ; WX 838 ; N uni2B0D ; G 3075\nU 11022 ; WX 838 ; N uni2B0E ; G 3076\nU 11023 ; WX 838 ; N uni2B0F ; G 3077\nU 11024 ; WX 838 ; N uni2B10 ; G 3078\nU 11025 ; WX 838 ; N uni2B11 ; G 3079\nU 11026 ; WX 945 ; N uni2B12 ; G 3080\nU 11027 ; WX 945 ; N uni2B13 ; G 3081\nU 11028 ; WX 945 ; N uni2B14 ; G 3082\nU 11029 ; WX 945 ; N uni2B15 ; G 3083\nU 11030 ; WX 769 ; N uni2B16 ; G 3084\nU 11031 ; WX 769 ; N uni2B17 ; G 3085\nU 11032 ; WX 769 ; N uni2B18 ; G 3086\nU 11033 ; WX 769 ; N uni2B19 ; G 3087\nU 11034 ; WX 945 ; N uni2B1A ; G 3088\nU 11360 ; WX 664 ; N uni2C60 ; G 3089\nU 11361 ; WX 320 ; N uni2C61 ; G 3090\nU 11363 ; WX 673 ; N uni2C63 ; G 3091\nU 11364 ; WX 753 ; N uni2C64 ; G 3092\nU 11367 ; WX 872 ; N uni2C67 ; G 3093\nU 11368 ; WX 644 ; N uni2C68 ; G 3094\nU 11369 ; WX 747 ; N uni2C69 ; G 3095\nU 11370 ; WX 606 ; N uni2C6A ; G 3096\nU 11371 ; WX 695 ; N uni2C6B ; G 3097\nU 11372 ; WX 527 ; N uni2C6C ; G 3098\nU 11373 ; WX 782 ; N uni2C6D ; G 3099\nU 11374 ; WX 1024 ; N uni2C6E ; G 3100\nU 11375 ; WX 722 ; N uni2C6F ; G 3101\nU 11376 ; WX 782 ; N uni2C70 ; G 3102\nU 11377 ; WX 663 ; N uni2C71 ; G 3103\nU 11378 ; WX 1130 ; N uni2C72 ; G 3104\nU 11379 ; WX 939 ; N uni2C73 ; G 3105\nU 11381 ; WX 740 ; N uni2C75 ; G 3106\nU 11382 ; WX 531 ; N uni2C76 ; G 3107\nU 11383 ; WX 700 ; N uni2C77 ; G 3108\nU 11385 ; WX 501 ; N uni2C79 ; G 3109\nU 11386 ; WX 602 ; N uni2C7A ; G 3110\nU 11387 ; WX 553 ; N uni2C7B ; G 3111\nU 11388 ; WX 264 ; N uni2C7C ; G 3112\nU 11389 ; WX 455 ; N uni2C7D ; G 3113\nU 11390 ; WX 685 ; N uni2C7E ; G 3114\nU 11391 ; WX 695 ; N uni2C7F ; G 3115\nU 11520 ; WX 773 ; N uni2D00 ; G 3116\nU 11521 ; WX 635 ; N uni2D01 ; G 3117\nU 11522 ; WX 633 ; N uni2D02 ; G 3118\nU 11523 ; WX 658 ; N uni2D03 ; G 3119\nU 11524 ; WX 631 ; N uni2D04 ; G 3120\nU 11525 ; WX 962 ; N uni2D05 ; G 3121\nU 11526 ; WX 756 ; N uni2D06 ; G 3122\nU 11527 ; WX 960 ; N uni2D07 ; G 3123\nU 11528 ; WX 617 ; N uni2D08 ; G 3124\nU 11529 ; WX 646 ; N uni2D09 ; G 3125\nU 11530 ; WX 962 ; N uni2D0A ; G 3126\nU 11531 ; WX 632 ; N uni2D0B ; G 3127\nU 11532 ; WX 646 ; N uni2D0C ; G 3128\nU 11533 ; WX 962 ; N uni2D0D ; G 3129\nU 11534 ; WX 645 ; N uni2D0E ; G 3130\nU 11535 ; WX 866 ; N uni2D0F ; G 3131\nU 11536 ; WX 961 ; N uni2D10 ; G 3132\nU 11537 ; WX 645 ; N uni2D11 ; G 3133\nU 11538 ; WX 645 ; N uni2D12 ; G 3134\nU 11539 ; WX 959 ; N uni2D13 ; G 3135\nU 11540 ; WX 945 ; N uni2D14 ; G 3136\nU 11541 ; WX 863 ; N uni2D15 ; G 3137\nU 11542 ; WX 644 ; N uni2D16 ; G 3138\nU 11543 ; WX 646 ; N uni2D17 ; G 3139\nU 11544 ; WX 645 ; N uni2D18 ; G 3140\nU 11545 ; WX 649 ; N uni2D19 ; G 3141\nU 11546 ; WX 688 ; N uni2D1A ; G 3142\nU 11547 ; WX 634 ; N uni2D1B ; G 3143\nU 11548 ; WX 982 ; N uni2D1C ; G 3144\nU 11549 ; WX 681 ; N uni2D1D ; G 3145\nU 11550 ; WX 676 ; N uni2D1E ; G 3146\nU 11551 ; WX 852 ; N uni2D1F ; G 3147\nU 11552 ; WX 957 ; N uni2D20 ; G 3148\nU 11553 ; WX 632 ; N uni2D21 ; G 3149\nU 11554 ; WX 645 ; N uni2D22 ; G 3150\nU 11555 ; WX 646 ; N uni2D23 ; G 3151\nU 11556 ; WX 749 ; N uni2D24 ; G 3152\nU 11557 ; WX 914 ; N uni2D25 ; G 3153\nU 11800 ; WX 536 ; N uni2E18 ; G 3154\nU 11807 ; WX 838 ; N uni2E1F ; G 3155\nU 11810 ; WX 390 ; N uni2E22 ; G 3156\nU 11811 ; WX 390 ; N uni2E23 ; G 3157\nU 11812 ; WX 390 ; N uni2E24 ; G 3158\nU 11813 ; WX 390 ; N uni2E25 ; G 3159\nU 11822 ; WX 536 ; N uni2E2E ; G 3160\nU 42564 ; WX 685 ; N uniA644 ; G 3161\nU 42565 ; WX 513 ; N uniA645 ; G 3162\nU 42566 ; WX 395 ; N uniA646 ; G 3163\nU 42567 ; WX 392 ; N uniA647 ; G 3164\nU 42576 ; WX 1104 ; N uniA650 ; G 3165\nU 42577 ; WX 939 ; N uniA651 ; G 3166\nU 42580 ; WX 1193 ; N uniA654 ; G 3167\nU 42581 ; WX 871 ; N uniA655 ; G 3168\nU 42582 ; WX 1140 ; N uniA656 ; G 3169\nU 42583 ; WX 875 ; N uniA657 ; G 3170\nU 42648 ; WX 1416 ; N uniA698 ; G 3171\nU 42649 ; WX 999 ; N uniA699 ; G 3172\nU 42760 ; WX 493 ; N uniA708 ; G 3173\nU 42761 ; WX 493 ; N uniA709 ; G 3174\nU 42762 ; WX 493 ; N uniA70A ; G 3175\nU 42763 ; WX 493 ; N uniA70B ; G 3176\nU 42764 ; WX 493 ; N uniA70C ; G 3177\nU 42765 ; WX 493 ; N uniA70D ; G 3178\nU 42766 ; WX 493 ; N uniA70E ; G 3179\nU 42767 ; WX 493 ; N uniA70F ; G 3180\nU 42768 ; WX 493 ; N uniA710 ; G 3181\nU 42769 ; WX 493 ; N uniA711 ; G 3182\nU 42770 ; WX 493 ; N uniA712 ; G 3183\nU 42771 ; WX 493 ; N uniA713 ; G 3184\nU 42772 ; WX 493 ; N uniA714 ; G 3185\nU 42773 ; WX 493 ; N uniA715 ; G 3186\nU 42774 ; WX 493 ; N uniA716 ; G 3187\nU 42779 ; WX 369 ; N uniA71B ; G 3188\nU 42780 ; WX 369 ; N uniA71C ; G 3189\nU 42781 ; WX 253 ; N uniA71D ; G 3190\nU 42782 ; WX 253 ; N uniA71E ; G 3191\nU 42783 ; WX 253 ; N uniA71F ; G 3192\nU 42790 ; WX 872 ; N uniA726 ; G 3193\nU 42791 ; WX 634 ; N uniA727 ; G 3194\nU 42792 ; WX 843 ; N uniA728 ; G 3195\nU 42793 ; WX 754 ; N uniA729 ; G 3196\nU 42794 ; WX 612 ; N uniA72A ; G 3197\nU 42795 ; WX 560 ; N uniA72B ; G 3198\nU 42796 ; WX 548 ; N uniA72C ; G 3199\nU 42797 ; WX 531 ; N uniA72D ; G 3200\nU 42798 ; WX 629 ; N uniA72E ; G 3201\nU 42799 ; WX 610 ; N uniA72F ; G 3202\nU 42800 ; WX 514 ; N uniA730 ; G 3203\nU 42801 ; WX 513 ; N uniA731 ; G 3204\nU 42802 ; WX 1195 ; N uniA732 ; G 3205\nU 42803 ; WX 943 ; N uniA733 ; G 3206\nU 42804 ; WX 1226 ; N uniA734 ; G 3207\nU 42805 ; WX 950 ; N uniA735 ; G 3208\nU 42806 ; WX 1149 ; N uniA736 ; G 3209\nU 42807 ; WX 933 ; N uniA737 ; G 3210\nU 42808 ; WX 968 ; N uniA738 ; G 3211\nU 42809 ; WX 784 ; N uniA739 ; G 3212\nU 42810 ; WX 968 ; N uniA73A ; G 3213\nU 42811 ; WX 784 ; N uniA73B ; G 3214\nU 42812 ; WX 962 ; N uniA73C ; G 3215\nU 42813 ; WX 759 ; N uniA73D ; G 3216\nU 42814 ; WX 765 ; N uniA73E ; G 3217\nU 42815 ; WX 560 ; N uniA73F ; G 3218\nU 42816 ; WX 747 ; N uniA740 ; G 3219\nU 42817 ; WX 606 ; N uniA741 ; G 3220\nU 42822 ; WX 787 ; N uniA746 ; G 3221\nU 42823 ; WX 434 ; N uniA747 ; G 3222\nU 42826 ; WX 932 ; N uniA74A ; G 3223\nU 42827 ; WX 711 ; N uniA74B ; G 3224\nU 42830 ; WX 1416 ; N uniA74E ; G 3225\nU 42831 ; WX 999 ; N uniA74F ; G 3226\nU 42856 ; WX 707 ; N uniA768 ; G 3227\nU 42857 ; WX 610 ; N uniA769 ; G 3228\nU 42875 ; WX 612 ; N uniA77B ; G 3229\nU 42876 ; WX 478 ; N uniA77C ; G 3230\nU 42880 ; WX 664 ; N uniA780 ; G 3231\nU 42881 ; WX 320 ; N uniA781 ; G 3232\nU 42882 ; WX 843 ; N uniA782 ; G 3233\nU 42883 ; WX 644 ; N uniA783 ; G 3234\nU 42884 ; WX 612 ; N uniA784 ; G 3235\nU 42885 ; WX 478 ; N uniA785 ; G 3236\nU 42886 ; WX 765 ; N uniA786 ; G 3237\nU 42887 ; WX 560 ; N uniA787 ; G 3238\nU 42891 ; WX 402 ; N uniA78B ; G 3239\nU 42892 ; WX 275 ; N uniA78C ; G 3240\nU 42893 ; WX 773 ; N uniA78D ; G 3241\nU 42896 ; WX 875 ; N uniA790 ; G 3242\nU 42897 ; WX 698 ; N uniA791 ; G 3243\nU 42922 ; WX 872 ; N uniA7AA ; G 3244\nU 43000 ; WX 549 ; N uniA7F8 ; G 3245\nU 43001 ; WX 623 ; N uniA7F9 ; G 3246\nU 43002 ; WX 957 ; N uniA7FA ; G 3247\nU 43003 ; WX 694 ; N uniA7FB ; G 3248\nU 43004 ; WX 673 ; N uniA7FC ; G 3249\nU 43005 ; WX 1024 ; N uniA7FD ; G 3250\nU 43006 ; WX 395 ; N uniA7FE ; G 3251\nU 43007 ; WX 1201 ; N uniA7FF ; G 3252\nU 62464 ; WX 664 ; N uniF400 ; G 3253\nU 62465 ; WX 675 ; N uniF401 ; G 3254\nU 62466 ; WX 724 ; N uniF402 ; G 3255\nU 62467 ; WX 958 ; N uniF403 ; G 3256\nU 62468 ; WX 675 ; N uniF404 ; G 3257\nU 62469 ; WX 669 ; N uniF405 ; G 3258\nU 62470 ; WX 735 ; N uniF406 ; G 3259\nU 62471 ; WX 997 ; N uniF407 ; G 3260\nU 62472 ; WX 675 ; N uniF408 ; G 3261\nU 62473 ; WX 675 ; N uniF409 ; G 3262\nU 62474 ; WX 1268 ; N uniF40A ; G 3263\nU 62475 ; WX 693 ; N uniF40B ; G 3264\nU 62476 ; WX 692 ; N uniF40C ; G 3265\nU 62477 ; WX 963 ; N uniF40D ; G 3266\nU 62478 ; WX 675 ; N uniF40E ; G 3267\nU 62479 ; WX 692 ; N uniF40F ; G 3268\nU 62480 ; WX 1009 ; N uniF410 ; G 3269\nU 62481 ; WX 756 ; N uniF411 ; G 3270\nU 62482 ; WX 809 ; N uniF412 ; G 3271\nU 62483 ; WX 758 ; N uniF413 ; G 3272\nU 62484 ; WX 955 ; N uniF414 ; G 3273\nU 62485 ; WX 691 ; N uniF415 ; G 3274\nU 62486 ; WX 946 ; N uniF416 ; G 3275\nU 62487 ; WX 690 ; N uniF417 ; G 3276\nU 62488 ; WX 698 ; N uniF418 ; G 3277\nU 62489 ; WX 692 ; N uniF419 ; G 3278\nU 62490 ; WX 739 ; N uniF41A ; G 3279\nU 62491 ; WX 692 ; N uniF41B ; G 3280\nU 62492 ; WX 698 ; N uniF41C ; G 3281\nU 62493 ; WX 676 ; N uniF41D ; G 3282\nU 62494 ; WX 739 ; N uniF41E ; G 3283\nU 62495 ; WX 895 ; N uniF41F ; G 3284\nU 62496 ; WX 675 ; N uniF420 ; G 3285\nU 62497 ; WX 785 ; N uniF421 ; G 3286\nU 62498 ; WX 676 ; N uniF422 ; G 3287\nU 62499 ; WX 675 ; N uniF423 ; G 3288\nU 62500 ; WX 675 ; N uniF424 ; G 3289\nU 62501 ; WX 732 ; N uniF425 ; G 3290\nU 62502 ; WX 972 ; N uniF426 ; G 3291\nU 62504 ; WX 904 ; N uniF428 ; G 3292\nU 63172 ; WX 320 ; N uniF6C4 ; G 3293\nU 63173 ; WX 602 ; N uniF6C5 ; G 3294\nU 63174 ; WX 640 ; N uniF6C6 ; G 3295\nU 63175 ; WX 644 ; N uniF6C7 ; G 3296\nU 63176 ; WX 947 ; N uniF6C8 ; G 3297\nU 63185 ; WX 500 ; N cyrBreve ; G 3298\nU 63188 ; WX 500 ; N cyrbreve ; G 3299\nU 64256 ; WX 708 ; N uniFB00 ; G 3300\nU 64257 ; WX 667 ; N fi ; G 3301\nU 64258 ; WX 667 ; N fl ; G 3302\nU 64259 ; WX 941 ; N uniFB03 ; G 3303\nU 64260 ; WX 986 ; N uniFB04 ; G 3304\nU 64261 ; WX 744 ; N uniFB05 ; G 3305\nU 64262 ; WX 916 ; N uniFB06 ; G 3306\nU 65024 ; WX 0 ; N uniFE00 ; G 3307\nU 65025 ; WX 0 ; N uniFE01 ; G 3308\nU 65026 ; WX 0 ; N uniFE02 ; G 3309\nU 65027 ; WX 0 ; N uniFE03 ; G 3310\nU 65028 ; WX 0 ; N uniFE04 ; G 3311\nU 65029 ; WX 0 ; N uniFE05 ; G 3312\nU 65030 ; WX 0 ; N uniFE06 ; G 3313\nU 65031 ; WX 0 ; N uniFE07 ; G 3314\nU 65032 ; WX 0 ; N uniFE08 ; G 3315\nU 65033 ; WX 0 ; N uniFE09 ; G 3316\nU 65034 ; WX 0 ; N uniFE0A ; G 3317\nU 65035 ; WX 0 ; N uniFE0B ; G 3318\nU 65036 ; WX 0 ; N uniFE0C ; G 3319\nU 65037 ; WX 0 ; N uniFE0D ; G 3320\nU 65038 ; WX 0 ; N uniFE0E ; G 3321\nU 65039 ; WX 0 ; N uniFE0F ; G 3322\nU 65529 ; WX 0 ; N uniFFF9 ; G 3323\nU 65530 ; WX 0 ; N uniFFFA ; G 3324\nU 65531 ; WX 0 ; N uniFFFB ; G 3325\nU 65532 ; WX 0 ; N uniFFFC ; G 3326\nU 65533 ; WX 1025 ; N uniFFFD ; G 3327\nEndCharMetrics\nStartKernData \nStartKernPairs 1103\n\nKPX dollar seven -112\nKPX dollar nine -102\nKPX dollar colon -83\nKPX dollar less -83\nKPX dollar I -36\nKPX dollar W -36\nKPX dollar Y -83\nKPX dollar Z -92\nKPX dollar backslash -83\nKPX dollar questiondown -83\nKPX dollar Aacute -83\nKPX dollar Hbar -112\nKPX dollar hbar -36\nKPX dollar lacute -83\n\nKPX percent ampersand 38\nKPX percent asterisk 38\nKPX percent two 38\nKPX percent less -36\nKPX percent Egrave 38\nKPX percent Icircumflex 38\nKPX percent agrave 38\nKPX percent Ebreve 38\nKPX percent lacute -36\n\n\nKPX quotesingle nine -36\n\n\nKPX parenright dollar -178\nKPX parenright D -139\nKPX parenright H -112\nKPX parenright R -112\nKPX parenright cent -139\nKPX parenright sterling -139\nKPX parenright currency -139\nKPX parenright yen -139\nKPX parenright brokenbar -139\nKPX parenright section -139\nKPX parenright dieresis -139\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -112\nKPX parenright mu -112\nKPX parenright paragraph -112\nKPX parenright periodcentered -112\nKPX parenright cedilla -112\nKPX parenright ordmasculine -112\nKPX parenright Yacute -112\nKPX parenright ebreve -112\n\nKPX asterisk less -36\nKPX asterisk lacute -36\n\n\nKPX period dollar -83\nKPX period ampersand -55\nKPX period two -55\nKPX period eight -73\nKPX period colon -73\nKPX period less -55\nKPX period H -55\nKPX period R -55\nKPX period X -45\nKPX period backslash -131\nKPX period ordfeminine -55\nKPX period guillemotleft -55\nKPX period logicalnot -55\nKPX period sfthyphen -55\nKPX period acute -55\nKPX period mu -55\nKPX period paragraph -55\nKPX period periodcentered -55\nKPX period cedilla -55\nKPX period ordmasculine -36\nKPX period guillemotright -45\nKPX period onequarter -45\nKPX period onehalf -45\nKPX period threequarters -45\nKPX period questiondown -131\nKPX period Aacute -131\nKPX period Egrave -55\nKPX period Icircumflex -55\nKPX period Yacute -55\nKPX period Ebreve -55\nKPX period ebreve -55\nKPX period Idot -73\nKPX period dotlessi -45\nKPX period lacute -55\n\nKPX slash seven -167\nKPX slash eight -112\nKPX slash nine -243\nKPX slash colon -178\nKPX slash less -131\nKPX slash backslash -36\nKPX slash questiondown -36\nKPX slash Aacute -36\nKPX slash Hbar -167\nKPX slash Idot -112\nKPX slash lacute -131\n\n\nKPX two nine -36\nKPX two semicolon -36\n\nKPX three dollar -188\nKPX three eight -36\nKPX three D -92\nKPX three H -92\nKPX three R -83\nKPX three V -55\nKPX three cent -92\nKPX three sterling -92\nKPX three currency -92\nKPX three yen -92\nKPX three brokenbar -92\nKPX three section -92\nKPX three dieresis -92\nKPX three ordfeminine -92\nKPX three guillemotleft -92\nKPX three logicalnot -92\nKPX three sfthyphen -92\nKPX three acute -83\nKPX three mu -83\nKPX three paragraph -83\nKPX three periodcentered -83\nKPX three cedilla -83\nKPX three ordmasculine -83\nKPX three Yacute -92\nKPX three ebreve -83\nKPX three gdotaccent -55\nKPX three gcommaaccent -55\nKPX three Idot -36\n\n\nKPX five seven -36\nKPX five nine -73\nKPX five colon -45\nKPX five less -63\nKPX five D 47\nKPX five backslash -36\nKPX five cent 47\nKPX five sterling 47\nKPX five currency 47\nKPX five yen 47\nKPX five brokenbar 47\nKPX five section 47\nKPX five dieresis 47\nKPX five ordmasculine 38\nKPX five questiondown -36\nKPX five Aacute -36\nKPX five Hbar -36\nKPX five lacute -63\n\nKPX six six -36\nKPX six Gdotaccent -36\nKPX six Gcommaaccent -36\n\nKPX seven dollar -112\nKPX seven seven 38\nKPX seven D -159\nKPX seven F -159\nKPX seven H -159\nKPX seven R -159\nKPX seven V -149\nKPX seven Z -73\nKPX seven cent -159\nKPX seven sterling -159\nKPX seven currency -159\nKPX seven yen -159\nKPX seven brokenbar -159\nKPX seven section -159\nKPX seven dieresis -159\nKPX seven copyright -159\nKPX seven ordfeminine -159\nKPX seven guillemotleft -159\nKPX seven logicalnot -159\nKPX seven sfthyphen -159\nKPX seven acute -159\nKPX seven mu -159\nKPX seven paragraph -159\nKPX seven periodcentered -159\nKPX seven cedilla -159\nKPX seven ordmasculine -159\nKPX seven Eacute -159\nKPX seven Idieresis -159\nKPX seven Yacute -159\nKPX seven ebreve -159\nKPX seven gdotaccent -149\nKPX seven gcommaaccent -149\nKPX seven Hbar 38\n\nKPX eight dollar -63\nKPX eight hyphen -55\n\nKPX nine dollar -139\nKPX nine two -36\nKPX nine D -188\nKPX nine H -188\nKPX nine L -36\nKPX nine R -188\nKPX nine X -131\nKPX nine backslash -83\nKPX nine cent -188\nKPX nine sterling -188\nKPX nine currency -188\nKPX nine yen -188\nKPX nine brokenbar -188\nKPX nine section -188\nKPX nine dieresis -188\nKPX nine ordfeminine -188\nKPX nine guillemotleft -188\nKPX nine logicalnot -188\nKPX nine sfthyphen -188\nKPX nine acute -188\nKPX nine mu -188\nKPX nine paragraph -188\nKPX nine periodcentered -188\nKPX nine cedilla -188\nKPX nine ordmasculine -188\nKPX nine guillemotright -131\nKPX nine onequarter -131\nKPX nine onehalf -131\nKPX nine threequarters -131\nKPX nine questiondown -83\nKPX nine Aacute -83\nKPX nine Yacute -188\nKPX nine Ebreve -36\nKPX nine ebreve -188\nKPX nine dotlessi -131\n\nKPX colon dollar -102\nKPX colon D -178\nKPX colon H -167\nKPX colon L -36\nKPX colon R -139\nKPX colon U -92\nKPX colon X -83\nKPX colon backslash -45\nKPX colon cent -178\nKPX colon sterling -178\nKPX colon currency -178\nKPX colon yen -178\nKPX colon brokenbar -178\nKPX colon section -178\nKPX colon dieresis -139\nKPX colon ordfeminine -167\nKPX colon guillemotleft -167\nKPX colon logicalnot -167\nKPX colon sfthyphen -167\nKPX colon acute -139\nKPX colon mu -139\nKPX colon paragraph -139\nKPX colon periodcentered -139\nKPX colon cedilla -139\nKPX colon ordmasculine -139\nKPX colon guillemotright -83\nKPX colon onequarter -83\nKPX colon onehalf -83\nKPX colon threequarters -83\nKPX colon questiondown -45\nKPX colon Aacute -45\nKPX colon Yacute -167\nKPX colon ebreve -139\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -83\n\nKPX semicolon dollar -73\nKPX semicolon ampersand -36\nKPX semicolon two -36\nKPX semicolon Egrave -36\nKPX semicolon Icircumflex -36\nKPX semicolon Ebreve -36\n\nKPX less dollar -159\nKPX less ampersand -36\nKPX less D -159\nKPX less H -178\nKPX less L -36\nKPX less R -178\nKPX less X -178\nKPX less cent -159\nKPX less sterling -159\nKPX less currency -159\nKPX less yen -159\nKPX less brokenbar -159\nKPX less section -159\nKPX less dieresis -196\nKPX less ordfeminine -178\nKPX less guillemotleft -178\nKPX less logicalnot -178\nKPX less sfthyphen -178\nKPX less acute -178\nKPX less mu -178\nKPX less paragraph -178\nKPX less periodcentered -178\nKPX less cedilla -178\nKPX less ordmasculine -178\nKPX less guillemotright -178\nKPX less onequarter -178\nKPX less onehalf -178\nKPX less threequarters -178\nKPX less Egrave -36\nKPX less Icircumflex -36\nKPX less Yacute -178\nKPX less ebreve -215\nKPX less dotlessi -178\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nKPX Eth nine -36\n\n\nKPX agrave less -36\nKPX agrave lacute -36\n\nKPX ucircumflex seven -167\nKPX ucircumflex eight -112\nKPX ucircumflex nine -243\nKPX ucircumflex colon -178\nKPX ucircumflex less -131\nKPX ucircumflex backslash -36\nKPX ucircumflex questiondown -36\nKPX ucircumflex Aacute -36\nKPX ucircumflex Hbar -167\nKPX ucircumflex Idot -112\nKPX ucircumflex lacute -131\n\nKPX ydieresis seven -167\nKPX ydieresis eight -112\nKPX ydieresis nine -243\nKPX ydieresis colon -178\nKPX ydieresis less -131\nKPX ydieresis backslash -36\nKPX ydieresis questiondown -36\nKPX ydieresis Aacute -36\nKPX ydieresis Hbar -167\nKPX ydieresis Idot -112\nKPX ydieresis lacute -131\n\nKPX Abreve O -227\n\nKPX abreve seven -167\nKPX abreve eight -36\nKPX abreve nine -243\nKPX abreve colon -178\nKPX abreve less -206\nKPX abreve backslash -36\nKPX abreve questiondown -36\nKPX abreve Aacute -36\nKPX abreve Hbar -167\nKPX abreve Idot -36\nKPX abreve lacute -206\n\n\n\nKPX Edotaccent seven -36\nKPX Edotaccent nine -73\nKPX Edotaccent colon -45\nKPX Edotaccent less -63\nKPX Edotaccent D 47\nKPX Edotaccent backslash -36\nKPX Edotaccent cent 47\nKPX Edotaccent sterling 47\nKPX Edotaccent currency 47\nKPX Edotaccent yen 47\nKPX Edotaccent brokenbar 47\nKPX Edotaccent section 47\nKPX Edotaccent dieresis 47\nKPX Edotaccent ordmasculine 38\nKPX Edotaccent questiondown -36\nKPX Edotaccent Aacute -36\nKPX Edotaccent Hbar -36\nKPX Edotaccent lacute -63\n\n\nKPX Ecaron seven -36\nKPX Ecaron nine -73\nKPX Ecaron colon -45\nKPX Ecaron less -63\nKPX Ecaron D 47\nKPX Ecaron backslash -36\nKPX Ecaron cent 47\nKPX Ecaron sterling 47\nKPX Ecaron currency 47\nKPX Ecaron yen 47\nKPX Ecaron brokenbar 47\nKPX Ecaron section 47\nKPX Ecaron dieresis 47\nKPX Ecaron ordmasculine 38\nKPX Ecaron questiondown -36\nKPX Ecaron Aacute -36\nKPX Ecaron Hbar -36\nKPX Ecaron lacute -63\n\n\nKPX Gdotaccent six -36\nKPX Gdotaccent Gdotaccent -36\nKPX Gdotaccent Gcommaaccent -36\n\nKPX Gcommaaccent six -36\nKPX Gcommaaccent Gdotaccent -36\nKPX Gcommaaccent Gcommaaccent -36\n\nKPX Hbar dollar -112\nKPX Hbar seven 38\nKPX Hbar D -159\nKPX Hbar F -159\nKPX Hbar H -159\nKPX Hbar R -159\nKPX Hbar V -149\nKPX Hbar Z -73\nKPX Hbar cent -159\nKPX Hbar sterling -159\nKPX Hbar currency -159\nKPX Hbar yen -159\nKPX Hbar brokenbar -159\nKPX Hbar section -159\nKPX Hbar dieresis -159\nKPX Hbar copyright -159\nKPX Hbar ordfeminine -159\nKPX Hbar guillemotleft -159\nKPX Hbar logicalnot -159\nKPX Hbar sfthyphen -159\nKPX Hbar acute -159\nKPX Hbar mu -159\nKPX Hbar paragraph -159\nKPX Hbar periodcentered -159\nKPX Hbar cedilla -159\nKPX Hbar ordmasculine -159\nKPX Hbar Eacute -159\nKPX Hbar Idieresis -159\nKPX Hbar Yacute -159\nKPX Hbar ebreve -159\nKPX Hbar gdotaccent -149\nKPX Hbar gcommaaccent -149\nKPX Hbar Hbar 38\n\nKPX Idot dollar -63\nKPX Idot hyphen -55\n\nKPX kcommaaccent D 110\nKPX kcommaaccent F 85\nKPX kcommaaccent G 97\nKPX kcommaaccent H 86\nKPX kcommaaccent I 220\nKPX kcommaaccent J 97\nKPX kcommaaccent L 220\nKPX kcommaaccent M 218\nKPX kcommaaccent P 125\nKPX kcommaaccent Q 125\nKPX kcommaaccent R 85\nKPX kcommaaccent S 140\nKPX kcommaaccent T 97\nKPX kcommaaccent U 125\nKPX kcommaaccent V 155\nKPX kcommaaccent W 235\nKPX kcommaaccent X 144\nKPX kcommaaccent Y 205\nKPX kcommaaccent Z 166\nKPX kcommaaccent bracketleft 174\nKPX kcommaaccent backslash 205\nKPX kcommaaccent bracketright 179\nKPX kcommaaccent kcommaaccent 261\n\nKPX lacute dollar -159\nKPX lacute ampersand -36\nKPX lacute D -159\nKPX lacute H -178\nKPX lacute L -36\nKPX lacute R -178\nKPX lacute X -178\nKPX lacute cent -159\nKPX lacute sterling -159\nKPX lacute currency -159\nKPX lacute yen -159\nKPX lacute brokenbar -159\nKPX lacute section -159\nKPX lacute dieresis -196\nKPX lacute ordfeminine -178\nKPX lacute guillemotleft -178\nKPX lacute logicalnot -178\nKPX lacute sfthyphen -178\nKPX lacute acute -178\nKPX lacute mu -178\nKPX lacute paragraph -178\nKPX lacute periodcentered -178\nKPX lacute cedilla -178\nKPX lacute ordmasculine -178\nKPX lacute guillemotright -178\nKPX lacute onequarter -178\nKPX lacute onehalf -178\nKPX lacute threequarters -178\nKPX lacute Egrave -36\nKPX lacute Icircumflex -36\nKPX lacute Yacute -178\nKPX lacute ebreve -215\nKPX lacute dotlessi -178\n\n\nKPX uni027D dollar -264\nKPX uni027D hyphen 47\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/DejaVuSerif.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Serif\nFontSubfamily Book\nUniqueID DejaVu Serif\nFullName DejaVu Serif\nVersion Version 2.37\nPostScriptName DejaVuSerif\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Serif\nPreferredSubfamily Book\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -770 -347 2105 1109\nStartCharMetrics 3528\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 402 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 890 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 338 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 536 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 722 ; N A ; G 36\nU 66 ; WX 735 ; N B ; G 37\nU 67 ; WX 765 ; N C ; G 38\nU 68 ; WX 802 ; N D ; G 39\nU 69 ; WX 730 ; N E ; G 40\nU 70 ; WX 694 ; N F ; G 41\nU 71 ; WX 799 ; N G ; G 42\nU 72 ; WX 872 ; N H ; G 43\nU 73 ; WX 395 ; N I ; G 44\nU 74 ; WX 401 ; N J ; G 45\nU 75 ; WX 747 ; N K ; G 46\nU 76 ; WX 664 ; N L ; G 47\nU 77 ; WX 1024 ; N M ; G 48\nU 78 ; WX 875 ; N N ; G 49\nU 79 ; WX 820 ; N O ; G 50\nU 80 ; WX 673 ; N P ; G 51\nU 81 ; WX 820 ; N Q ; G 52\nU 82 ; WX 753 ; N R ; G 53\nU 83 ; WX 685 ; N S ; G 54\nU 84 ; WX 667 ; N T ; G 55\nU 85 ; WX 843 ; N U ; G 56\nU 86 ; WX 722 ; N V ; G 57\nU 87 ; WX 1028 ; N W ; G 58\nU 88 ; WX 712 ; N X ; G 59\nU 89 ; WX 660 ; N Y ; G 60\nU 90 ; WX 695 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 596 ; N a ; G 68\nU 98 ; WX 640 ; N b ; G 69\nU 99 ; WX 560 ; N c ; G 70\nU 100 ; WX 640 ; N d ; G 71\nU 101 ; WX 592 ; N e ; G 72\nU 102 ; WX 370 ; N f ; G 73\nU 103 ; WX 640 ; N g ; G 74\nU 104 ; WX 644 ; N h ; G 75\nU 105 ; WX 320 ; N i ; G 76\nU 106 ; WX 310 ; N j ; G 77\nU 107 ; WX 606 ; N k ; G 78\nU 108 ; WX 320 ; N l ; G 79\nU 109 ; WX 948 ; N m ; G 80\nU 110 ; WX 644 ; N n ; G 81\nU 111 ; WX 602 ; N o ; G 82\nU 112 ; WX 640 ; N p ; G 83\nU 113 ; WX 640 ; N q ; G 84\nU 114 ; WX 478 ; N r ; G 85\nU 115 ; WX 513 ; N s ; G 86\nU 116 ; WX 402 ; N t ; G 87\nU 117 ; WX 644 ; N u ; G 88\nU 118 ; WX 565 ; N v ; G 89\nU 119 ; WX 856 ; N w ; G 90\nU 120 ; WX 564 ; N x ; G 91\nU 121 ; WX 565 ; N y ; G 92\nU 122 ; WX 527 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 402 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 475 ; N ordfeminine ; G 108\nU 171 ; WX 612 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 338 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 650 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 470 ; N ordmasculine ; G 124\nU 187 ; WX 612 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 536 ; N questiondown ; G 129\nU 192 ; WX 722 ; N Agrave ; G 130\nU 193 ; WX 722 ; N Aacute ; G 131\nU 194 ; WX 722 ; N Acircumflex ; G 132\nU 195 ; WX 722 ; N Atilde ; G 133\nU 196 ; WX 722 ; N Adieresis ; G 134\nU 197 ; WX 722 ; N Aring ; G 135\nU 198 ; WX 1001 ; N AE ; G 136\nU 199 ; WX 765 ; N Ccedilla ; G 137\nU 200 ; WX 730 ; N Egrave ; G 138\nU 201 ; WX 730 ; N Eacute ; G 139\nU 202 ; WX 730 ; N Ecircumflex ; G 140\nU 203 ; WX 730 ; N Edieresis ; G 141\nU 204 ; WX 395 ; N Igrave ; G 142\nU 205 ; WX 395 ; N Iacute ; G 143\nU 206 ; WX 395 ; N Icircumflex ; G 144\nU 207 ; WX 395 ; N Idieresis ; G 145\nU 208 ; WX 807 ; N Eth ; G 146\nU 209 ; WX 875 ; N Ntilde ; G 147\nU 210 ; WX 820 ; N Ograve ; G 148\nU 211 ; WX 820 ; N Oacute ; G 149\nU 212 ; WX 820 ; N Ocircumflex ; G 150\nU 213 ; WX 820 ; N Otilde ; G 151\nU 214 ; WX 820 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 820 ; N Oslash ; G 154\nU 217 ; WX 843 ; N Ugrave ; G 155\nU 218 ; WX 843 ; N Uacute ; G 156\nU 219 ; WX 843 ; N Ucircumflex ; G 157\nU 220 ; WX 843 ; N Udieresis ; G 158\nU 221 ; WX 660 ; N Yacute ; G 159\nU 222 ; WX 676 ; N Thorn ; G 160\nU 223 ; WX 668 ; N germandbls ; G 161\nU 224 ; WX 596 ; N agrave ; G 162\nU 225 ; WX 596 ; N aacute ; G 163\nU 226 ; WX 596 ; N acircumflex ; G 164\nU 227 ; WX 596 ; N atilde ; G 165\nU 228 ; WX 596 ; N adieresis ; G 166\nU 229 ; WX 596 ; N aring ; G 167\nU 230 ; WX 940 ; N ae ; G 168\nU 231 ; WX 560 ; N ccedilla ; G 169\nU 232 ; WX 592 ; N egrave ; G 170\nU 233 ; WX 592 ; N eacute ; G 171\nU 234 ; WX 592 ; N ecircumflex ; G 172\nU 235 ; WX 592 ; N edieresis ; G 173\nU 236 ; WX 320 ; N igrave ; G 174\nU 237 ; WX 320 ; N iacute ; G 175\nU 238 ; WX 320 ; N icircumflex ; G 176\nU 239 ; WX 320 ; N idieresis ; G 177\nU 240 ; WX 602 ; N eth ; G 178\nU 241 ; WX 644 ; N ntilde ; G 179\nU 242 ; WX 602 ; N ograve ; G 180\nU 243 ; WX 602 ; N oacute ; G 181\nU 244 ; WX 602 ; N ocircumflex ; G 182\nU 245 ; WX 602 ; N otilde ; G 183\nU 246 ; WX 602 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 602 ; N oslash ; G 186\nU 249 ; WX 644 ; N ugrave ; G 187\nU 250 ; WX 644 ; N uacute ; G 188\nU 251 ; WX 644 ; N ucircumflex ; G 189\nU 252 ; WX 644 ; N udieresis ; G 190\nU 253 ; WX 565 ; N yacute ; G 191\nU 254 ; WX 640 ; N thorn ; G 192\nU 255 ; WX 565 ; N ydieresis ; G 193\nU 256 ; WX 722 ; N Amacron ; G 194\nU 257 ; WX 596 ; N amacron ; G 195\nU 258 ; WX 722 ; N Abreve ; G 196\nU 259 ; WX 596 ; N abreve ; G 197\nU 260 ; WX 722 ; N Aogonek ; G 198\nU 261 ; WX 596 ; N aogonek ; G 199\nU 262 ; WX 765 ; N Cacute ; G 200\nU 263 ; WX 560 ; N cacute ; G 201\nU 264 ; WX 765 ; N Ccircumflex ; G 202\nU 265 ; WX 560 ; N ccircumflex ; G 203\nU 266 ; WX 765 ; N Cdotaccent ; G 204\nU 267 ; WX 560 ; N cdotaccent ; G 205\nU 268 ; WX 765 ; N Ccaron ; G 206\nU 269 ; WX 560 ; N ccaron ; G 207\nU 270 ; WX 802 ; N Dcaron ; G 208\nU 271 ; WX 640 ; N dcaron ; G 209\nU 272 ; WX 807 ; N Dcroat ; G 210\nU 273 ; WX 640 ; N dmacron ; G 211\nU 274 ; WX 730 ; N Emacron ; G 212\nU 275 ; WX 592 ; N emacron ; G 213\nU 276 ; WX 730 ; N Ebreve ; G 214\nU 277 ; WX 592 ; N ebreve ; G 215\nU 278 ; WX 730 ; N Edotaccent ; G 216\nU 279 ; WX 592 ; N edotaccent ; G 217\nU 280 ; WX 730 ; N Eogonek ; G 218\nU 281 ; WX 592 ; N eogonek ; G 219\nU 282 ; WX 730 ; N Ecaron ; G 220\nU 283 ; WX 592 ; N ecaron ; G 221\nU 284 ; WX 799 ; N Gcircumflex ; G 222\nU 285 ; WX 640 ; N gcircumflex ; G 223\nU 286 ; WX 799 ; N Gbreve ; G 224\nU 287 ; WX 640 ; N gbreve ; G 225\nU 288 ; WX 799 ; N Gdotaccent ; G 226\nU 289 ; WX 640 ; N gdotaccent ; G 227\nU 290 ; WX 799 ; N Gcommaaccent ; G 228\nU 291 ; WX 640 ; N gcommaaccent ; G 229\nU 292 ; WX 872 ; N Hcircumflex ; G 230\nU 293 ; WX 644 ; N hcircumflex ; G 231\nU 294 ; WX 872 ; N Hbar ; G 232\nU 295 ; WX 644 ; N hbar ; G 233\nU 296 ; WX 395 ; N Itilde ; G 234\nU 297 ; WX 320 ; N itilde ; G 235\nU 298 ; WX 395 ; N Imacron ; G 236\nU 299 ; WX 320 ; N imacron ; G 237\nU 300 ; WX 395 ; N Ibreve ; G 238\nU 301 ; WX 320 ; N ibreve ; G 239\nU 302 ; WX 395 ; N Iogonek ; G 240\nU 303 ; WX 320 ; N iogonek ; G 241\nU 304 ; WX 395 ; N Idot ; G 242\nU 305 ; WX 320 ; N dotlessi ; G 243\nU 306 ; WX 801 ; N IJ ; G 244\nU 307 ; WX 533 ; N ij ; G 245\nU 308 ; WX 401 ; N Jcircumflex ; G 246\nU 309 ; WX 310 ; N jcircumflex ; G 247\nU 310 ; WX 747 ; N Kcommaaccent ; G 248\nU 311 ; WX 606 ; N kcommaaccent ; G 249\nU 312 ; WX 606 ; N kgreenlandic ; G 250\nU 313 ; WX 664 ; N Lacute ; G 251\nU 314 ; WX 320 ; N lacute ; G 252\nU 315 ; WX 664 ; N Lcommaaccent ; G 253\nU 316 ; WX 320 ; N lcommaaccent ; G 254\nU 317 ; WX 664 ; N Lcaron ; G 255\nU 318 ; WX 320 ; N lcaron ; G 256\nU 319 ; WX 664 ; N Ldot ; G 257\nU 320 ; WX 320 ; N ldot ; G 258\nU 321 ; WX 669 ; N Lslash ; G 259\nU 322 ; WX 324 ; N lslash ; G 260\nU 323 ; WX 875 ; N Nacute ; G 261\nU 324 ; WX 644 ; N nacute ; G 262\nU 325 ; WX 875 ; N Ncommaaccent ; G 263\nU 326 ; WX 644 ; N ncommaaccent ; G 264\nU 327 ; WX 875 ; N Ncaron ; G 265\nU 328 ; WX 644 ; N ncaron ; G 266\nU 329 ; WX 866 ; N napostrophe ; G 267\nU 330 ; WX 843 ; N Eng ; G 268\nU 331 ; WX 644 ; N eng ; G 269\nU 332 ; WX 820 ; N Omacron ; G 270\nU 333 ; WX 602 ; N omacron ; G 271\nU 334 ; WX 820 ; N Obreve ; G 272\nU 335 ; WX 602 ; N obreve ; G 273\nU 336 ; WX 820 ; N Ohungarumlaut ; G 274\nU 337 ; WX 602 ; N ohungarumlaut ; G 275\nU 338 ; WX 1137 ; N OE ; G 276\nU 339 ; WX 989 ; N oe ; G 277\nU 340 ; WX 753 ; N Racute ; G 278\nU 341 ; WX 478 ; N racute ; G 279\nU 342 ; WX 753 ; N Rcommaaccent ; G 280\nU 343 ; WX 478 ; N rcommaaccent ; G 281\nU 344 ; WX 753 ; N Rcaron ; G 282\nU 345 ; WX 478 ; N rcaron ; G 283\nU 346 ; WX 685 ; N Sacute ; G 284\nU 347 ; WX 513 ; N sacute ; G 285\nU 348 ; WX 685 ; N Scircumflex ; G 286\nU 349 ; WX 513 ; N scircumflex ; G 287\nU 350 ; WX 685 ; N Scedilla ; G 288\nU 351 ; WX 513 ; N scedilla ; G 289\nU 352 ; WX 685 ; N Scaron ; G 290\nU 353 ; WX 513 ; N scaron ; G 291\nU 354 ; WX 667 ; N Tcommaaccent ; G 292\nU 355 ; WX 402 ; N tcommaaccent ; G 293\nU 356 ; WX 667 ; N Tcaron ; G 294\nU 357 ; WX 402 ; N tcaron ; G 295\nU 358 ; WX 667 ; N Tbar ; G 296\nU 359 ; WX 402 ; N tbar ; G 297\nU 360 ; WX 843 ; N Utilde ; G 298\nU 361 ; WX 644 ; N utilde ; G 299\nU 362 ; WX 843 ; N Umacron ; G 300\nU 363 ; WX 644 ; N umacron ; G 301\nU 364 ; WX 843 ; N Ubreve ; G 302\nU 365 ; WX 644 ; N ubreve ; G 303\nU 366 ; WX 843 ; N Uring ; G 304\nU 367 ; WX 644 ; N uring ; G 305\nU 368 ; WX 843 ; N Uhungarumlaut ; G 306\nU 369 ; WX 644 ; N uhungarumlaut ; G 307\nU 370 ; WX 843 ; N Uogonek ; G 308\nU 371 ; WX 644 ; N uogonek ; G 309\nU 372 ; WX 1028 ; N Wcircumflex ; G 310\nU 373 ; WX 856 ; N wcircumflex ; G 311\nU 374 ; WX 660 ; N Ycircumflex ; G 312\nU 375 ; WX 565 ; N ycircumflex ; G 313\nU 376 ; WX 660 ; N Ydieresis ; G 314\nU 377 ; WX 695 ; N Zacute ; G 315\nU 378 ; WX 527 ; N zacute ; G 316\nU 379 ; WX 695 ; N Zdotaccent ; G 317\nU 380 ; WX 527 ; N zdotaccent ; G 318\nU 381 ; WX 695 ; N Zcaron ; G 319\nU 382 ; WX 527 ; N zcaron ; G 320\nU 383 ; WX 370 ; N longs ; G 321\nU 384 ; WX 640 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 735 ; N uni0182 ; G 324\nU 387 ; WX 640 ; N uni0183 ; G 325\nU 388 ; WX 735 ; N uni0184 ; G 326\nU 389 ; WX 640 ; N uni0185 ; G 327\nU 390 ; WX 765 ; N uni0186 ; G 328\nU 391 ; WX 765 ; N uni0187 ; G 329\nU 392 ; WX 560 ; N uni0188 ; G 330\nU 393 ; WX 807 ; N uni0189 ; G 331\nU 394 ; WX 802 ; N uni018A ; G 332\nU 395 ; WX 735 ; N uni018B ; G 333\nU 396 ; WX 640 ; N uni018C ; G 334\nU 397 ; WX 602 ; N uni018D ; G 335\nU 398 ; WX 730 ; N uni018E ; G 336\nU 399 ; WX 820 ; N uni018F ; G 337\nU 400 ; WX 623 ; N uni0190 ; G 338\nU 401 ; WX 694 ; N uni0191 ; G 339\nU 402 ; WX 370 ; N florin ; G 340\nU 403 ; WX 799 ; N uni0193 ; G 341\nU 404 ; WX 712 ; N uni0194 ; G 342\nU 405 ; WX 932 ; N uni0195 ; G 343\nU 406 ; WX 395 ; N uni0196 ; G 344\nU 407 ; WX 395 ; N uni0197 ; G 345\nU 408 ; WX 747 ; N uni0198 ; G 346\nU 409 ; WX 606 ; N uni0199 ; G 347\nU 410 ; WX 320 ; N uni019A ; G 348\nU 411 ; WX 634 ; N uni019B ; G 349\nU 412 ; WX 948 ; N uni019C ; G 350\nU 413 ; WX 875 ; N uni019D ; G 351\nU 414 ; WX 644 ; N uni019E ; G 352\nU 415 ; WX 820 ; N uni019F ; G 353\nU 416 ; WX 820 ; N Ohorn ; G 354\nU 417 ; WX 602 ; N ohorn ; G 355\nU 418 ; WX 1040 ; N uni01A2 ; G 356\nU 419 ; WX 807 ; N uni01A3 ; G 357\nU 420 ; WX 673 ; N uni01A4 ; G 358\nU 421 ; WX 640 ; N uni01A5 ; G 359\nU 422 ; WX 753 ; N uni01A6 ; G 360\nU 423 ; WX 685 ; N uni01A7 ; G 361\nU 424 ; WX 513 ; N uni01A8 ; G 362\nU 425 ; WX 707 ; N uni01A9 ; G 363\nU 426 ; WX 324 ; N uni01AA ; G 364\nU 427 ; WX 402 ; N uni01AB ; G 365\nU 428 ; WX 667 ; N uni01AC ; G 366\nU 429 ; WX 402 ; N uni01AD ; G 367\nU 430 ; WX 667 ; N uni01AE ; G 368\nU 431 ; WX 843 ; N Uhorn ; G 369\nU 432 ; WX 644 ; N uhorn ; G 370\nU 433 ; WX 829 ; N uni01B1 ; G 371\nU 434 ; WX 760 ; N uni01B2 ; G 372\nU 435 ; WX 738 ; N uni01B3 ; G 373\nU 436 ; WX 663 ; N uni01B4 ; G 374\nU 437 ; WX 695 ; N uni01B5 ; G 375\nU 438 ; WX 527 ; N uni01B6 ; G 376\nU 439 ; WX 564 ; N uni01B7 ; G 377\nU 440 ; WX 564 ; N uni01B8 ; G 378\nU 441 ; WX 564 ; N uni01B9 ; G 379\nU 442 ; WX 564 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 687 ; N uni01BC ; G 382\nU 445 ; WX 564 ; N uni01BD ; G 383\nU 446 ; WX 536 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1497 ; N uni01C4 ; G 390\nU 453 ; WX 1329 ; N uni01C5 ; G 391\nU 454 ; WX 1167 ; N uni01C6 ; G 392\nU 455 ; WX 1065 ; N uni01C7 ; G 393\nU 456 ; WX 974 ; N uni01C8 ; G 394\nU 457 ; WX 630 ; N uni01C9 ; G 395\nU 458 ; WX 1276 ; N uni01CA ; G 396\nU 459 ; WX 1185 ; N uni01CB ; G 397\nU 460 ; WX 954 ; N uni01CC ; G 398\nU 461 ; WX 722 ; N uni01CD ; G 399\nU 462 ; WX 596 ; N uni01CE ; G 400\nU 463 ; WX 395 ; N uni01CF ; G 401\nU 464 ; WX 320 ; N uni01D0 ; G 402\nU 465 ; WX 820 ; N uni01D1 ; G 403\nU 466 ; WX 602 ; N uni01D2 ; G 404\nU 467 ; WX 843 ; N uni01D3 ; G 405\nU 468 ; WX 644 ; N uni01D4 ; G 406\nU 469 ; WX 843 ; N uni01D5 ; G 407\nU 470 ; WX 644 ; N uni01D6 ; G 408\nU 471 ; WX 843 ; N uni01D7 ; G 409\nU 472 ; WX 644 ; N uni01D8 ; G 410\nU 473 ; WX 843 ; N uni01D9 ; G 411\nU 474 ; WX 644 ; N uni01DA ; G 412\nU 475 ; WX 843 ; N uni01DB ; G 413\nU 476 ; WX 644 ; N uni01DC ; G 414\nU 477 ; WX 592 ; N uni01DD ; G 415\nU 478 ; WX 722 ; N uni01DE ; G 416\nU 479 ; WX 596 ; N uni01DF ; G 417\nU 480 ; WX 722 ; N uni01E0 ; G 418\nU 481 ; WX 596 ; N uni01E1 ; G 419\nU 482 ; WX 1001 ; N uni01E2 ; G 420\nU 483 ; WX 940 ; N uni01E3 ; G 421\nU 484 ; WX 848 ; N uni01E4 ; G 422\nU 485 ; WX 640 ; N uni01E5 ; G 423\nU 486 ; WX 799 ; N Gcaron ; G 424\nU 487 ; WX 640 ; N gcaron ; G 425\nU 488 ; WX 747 ; N uni01E8 ; G 426\nU 489 ; WX 606 ; N uni01E9 ; G 427\nU 490 ; WX 820 ; N uni01EA ; G 428\nU 491 ; WX 602 ; N uni01EB ; G 429\nU 492 ; WX 820 ; N uni01EC ; G 430\nU 493 ; WX 602 ; N uni01ED ; G 431\nU 494 ; WX 564 ; N uni01EE ; G 432\nU 495 ; WX 564 ; N uni01EF ; G 433\nU 496 ; WX 320 ; N uni01F0 ; G 434\nU 497 ; WX 1497 ; N uni01F1 ; G 435\nU 498 ; WX 1329 ; N uni01F2 ; G 436\nU 499 ; WX 1167 ; N uni01F3 ; G 437\nU 500 ; WX 799 ; N uni01F4 ; G 438\nU 501 ; WX 640 ; N uni01F5 ; G 439\nU 502 ; WX 1154 ; N uni01F6 ; G 440\nU 503 ; WX 707 ; N uni01F7 ; G 441\nU 504 ; WX 875 ; N uni01F8 ; G 442\nU 505 ; WX 644 ; N uni01F9 ; G 443\nU 506 ; WX 722 ; N Aringacute ; G 444\nU 507 ; WX 596 ; N aringacute ; G 445\nU 508 ; WX 1001 ; N AEacute ; G 446\nU 509 ; WX 940 ; N aeacute ; G 447\nU 510 ; WX 820 ; N Oslashacute ; G 448\nU 511 ; WX 602 ; N oslashacute ; G 449\nU 512 ; WX 722 ; N uni0200 ; G 450\nU 513 ; WX 596 ; N uni0201 ; G 451\nU 514 ; WX 722 ; N uni0202 ; G 452\nU 515 ; WX 596 ; N uni0203 ; G 453\nU 516 ; WX 730 ; N uni0204 ; G 454\nU 517 ; WX 592 ; N uni0205 ; G 455\nU 518 ; WX 730 ; N uni0206 ; G 456\nU 519 ; WX 592 ; N uni0207 ; G 457\nU 520 ; WX 395 ; N uni0208 ; G 458\nU 521 ; WX 320 ; N uni0209 ; G 459\nU 522 ; WX 395 ; N uni020A ; G 460\nU 523 ; WX 320 ; N uni020B ; G 461\nU 524 ; WX 820 ; N uni020C ; G 462\nU 525 ; WX 602 ; N uni020D ; G 463\nU 526 ; WX 820 ; N uni020E ; G 464\nU 527 ; WX 602 ; N uni020F ; G 465\nU 528 ; WX 753 ; N uni0210 ; G 466\nU 529 ; WX 478 ; N uni0211 ; G 467\nU 530 ; WX 753 ; N uni0212 ; G 468\nU 531 ; WX 478 ; N uni0213 ; G 469\nU 532 ; WX 843 ; N uni0214 ; G 470\nU 533 ; WX 644 ; N uni0215 ; G 471\nU 534 ; WX 843 ; N uni0216 ; G 472\nU 535 ; WX 644 ; N uni0217 ; G 473\nU 536 ; WX 685 ; N Scommaaccent ; G 474\nU 537 ; WX 513 ; N scommaaccent ; G 475\nU 538 ; WX 667 ; N uni021A ; G 476\nU 539 ; WX 402 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 872 ; N uni021E ; G 480\nU 543 ; WX 644 ; N uni021F ; G 481\nU 544 ; WX 843 ; N uni0220 ; G 482\nU 545 ; WX 814 ; N uni0221 ; G 483\nU 546 ; WX 572 ; N uni0222 ; G 484\nU 547 ; WX 552 ; N uni0223 ; G 485\nU 548 ; WX 695 ; N uni0224 ; G 486\nU 549 ; WX 527 ; N uni0225 ; G 487\nU 550 ; WX 722 ; N uni0226 ; G 488\nU 551 ; WX 596 ; N uni0227 ; G 489\nU 552 ; WX 730 ; N uni0228 ; G 490\nU 553 ; WX 592 ; N uni0229 ; G 491\nU 554 ; WX 820 ; N uni022A ; G 492\nU 555 ; WX 602 ; N uni022B ; G 493\nU 556 ; WX 820 ; N uni022C ; G 494\nU 557 ; WX 602 ; N uni022D ; G 495\nU 558 ; WX 820 ; N uni022E ; G 496\nU 559 ; WX 602 ; N uni022F ; G 497\nU 560 ; WX 820 ; N uni0230 ; G 498\nU 561 ; WX 602 ; N uni0231 ; G 499\nU 562 ; WX 660 ; N uni0232 ; G 500\nU 563 ; WX 565 ; N uni0233 ; G 501\nU 564 ; WX 500 ; N uni0234 ; G 502\nU 565 ; WX 832 ; N uni0235 ; G 503\nU 566 ; WX 494 ; N uni0236 ; G 504\nU 567 ; WX 310 ; N dotlessj ; G 505\nU 568 ; WX 960 ; N uni0238 ; G 506\nU 569 ; WX 960 ; N uni0239 ; G 507\nU 570 ; WX 722 ; N uni023A ; G 508\nU 571 ; WX 765 ; N uni023B ; G 509\nU 572 ; WX 560 ; N uni023C ; G 510\nU 573 ; WX 664 ; N uni023D ; G 511\nU 574 ; WX 667 ; N uni023E ; G 512\nU 575 ; WX 513 ; N uni023F ; G 513\nU 576 ; WX 527 ; N uni0240 ; G 514\nU 577 ; WX 583 ; N uni0241 ; G 515\nU 578 ; WX 464 ; N uni0242 ; G 516\nU 579 ; WX 735 ; N uni0243 ; G 517\nU 580 ; WX 843 ; N uni0244 ; G 518\nU 581 ; WX 722 ; N uni0245 ; G 519\nU 582 ; WX 730 ; N uni0246 ; G 520\nU 583 ; WX 592 ; N uni0247 ; G 521\nU 584 ; WX 401 ; N uni0248 ; G 522\nU 585 ; WX 315 ; N uni0249 ; G 523\nU 586 ; WX 782 ; N uni024A ; G 524\nU 587 ; WX 640 ; N uni024B ; G 525\nU 588 ; WX 753 ; N uni024C ; G 526\nU 589 ; WX 478 ; N uni024D ; G 527\nU 590 ; WX 660 ; N uni024E ; G 528\nU 591 ; WX 565 ; N uni024F ; G 529\nU 592 ; WX 596 ; N uni0250 ; G 530\nU 593 ; WX 640 ; N uni0251 ; G 531\nU 594 ; WX 640 ; N uni0252 ; G 532\nU 595 ; WX 640 ; N uni0253 ; G 533\nU 596 ; WX 560 ; N uni0254 ; G 534\nU 597 ; WX 560 ; N uni0255 ; G 535\nU 598 ; WX 647 ; N uni0256 ; G 536\nU 599 ; WX 683 ; N uni0257 ; G 537\nU 600 ; WX 592 ; N uni0258 ; G 538\nU 601 ; WX 592 ; N uni0259 ; G 539\nU 602 ; WX 843 ; N uni025A ; G 540\nU 603 ; WX 518 ; N uni025B ; G 541\nU 604 ; WX 509 ; N uni025C ; G 542\nU 605 ; WX 773 ; N uni025D ; G 543\nU 606 ; WX 613 ; N uni025E ; G 544\nU 607 ; WX 315 ; N uni025F ; G 545\nU 608 ; WX 683 ; N uni0260 ; G 546\nU 609 ; WX 640 ; N uni0261 ; G 547\nU 610 ; WX 580 ; N uni0262 ; G 548\nU 611 ; WX 599 ; N uni0263 ; G 549\nU 612 ; WX 564 ; N uni0264 ; G 550\nU 613 ; WX 644 ; N uni0265 ; G 551\nU 614 ; WX 644 ; N uni0266 ; G 552\nU 615 ; WX 644 ; N uni0267 ; G 553\nU 616 ; WX 320 ; N uni0268 ; G 554\nU 617 ; WX 392 ; N uni0269 ; G 555\nU 618 ; WX 320 ; N uni026A ; G 556\nU 619 ; WX 380 ; N uni026B ; G 557\nU 620 ; WX 454 ; N uni026C ; G 558\nU 621 ; WX 363 ; N uni026D ; G 559\nU 622 ; WX 704 ; N uni026E ; G 560\nU 623 ; WX 948 ; N uni026F ; G 561\nU 624 ; WX 948 ; N uni0270 ; G 562\nU 625 ; WX 948 ; N uni0271 ; G 563\nU 626 ; WX 644 ; N uni0272 ; G 564\nU 627 ; WX 694 ; N uni0273 ; G 565\nU 628 ; WX 646 ; N uni0274 ; G 566\nU 629 ; WX 602 ; N uni0275 ; G 567\nU 630 ; WX 790 ; N uni0276 ; G 568\nU 631 ; WX 821 ; N uni0277 ; G 569\nU 632 ; WX 692 ; N uni0278 ; G 570\nU 633 ; WX 501 ; N uni0279 ; G 571\nU 634 ; WX 501 ; N uni027A ; G 572\nU 635 ; WX 551 ; N uni027B ; G 573\nU 636 ; WX 478 ; N uni027C ; G 574\nU 637 ; WX 478 ; N uni027D ; G 575\nU 638 ; WX 453 ; N uni027E ; G 576\nU 639 ; WX 453 ; N uni027F ; G 577\nU 640 ; WX 581 ; N uni0280 ; G 578\nU 641 ; WX 581 ; N uni0281 ; G 579\nU 642 ; WX 513 ; N uni0282 ; G 580\nU 643 ; WX 271 ; N uni0283 ; G 581\nU 644 ; WX 370 ; N uni0284 ; G 582\nU 645 ; WX 487 ; N uni0285 ; G 583\nU 646 ; WX 324 ; N uni0286 ; G 584\nU 647 ; WX 402 ; N uni0287 ; G 585\nU 648 ; WX 402 ; N uni0288 ; G 586\nU 649 ; WX 644 ; N uni0289 ; G 587\nU 650 ; WX 620 ; N uni028A ; G 588\nU 651 ; WX 608 ; N uni028B ; G 589\nU 652 ; WX 565 ; N uni028C ; G 590\nU 653 ; WX 856 ; N uni028D ; G 591\nU 654 ; WX 565 ; N uni028E ; G 592\nU 655 ; WX 655 ; N uni028F ; G 593\nU 656 ; WX 597 ; N uni0290 ; G 594\nU 657 ; WX 560 ; N uni0291 ; G 595\nU 658 ; WX 564 ; N uni0292 ; G 596\nU 659 ; WX 560 ; N uni0293 ; G 597\nU 660 ; WX 536 ; N uni0294 ; G 598\nU 661 ; WX 536 ; N uni0295 ; G 599\nU 662 ; WX 536 ; N uni0296 ; G 600\nU 663 ; WX 420 ; N uni0297 ; G 601\nU 664 ; WX 820 ; N uni0298 ; G 602\nU 665 ; WX 563 ; N uni0299 ; G 603\nU 666 ; WX 613 ; N uni029A ; G 604\nU 667 ; WX 660 ; N uni029B ; G 605\nU 668 ; WX 667 ; N uni029C ; G 606\nU 669 ; WX 366 ; N uni029D ; G 607\nU 670 ; WX 606 ; N uni029E ; G 608\nU 671 ; WX 543 ; N uni029F ; G 609\nU 672 ; WX 683 ; N uni02A0 ; G 610\nU 673 ; WX 536 ; N uni02A1 ; G 611\nU 674 ; WX 536 ; N uni02A2 ; G 612\nU 675 ; WX 996 ; N uni02A3 ; G 613\nU 676 ; WX 1033 ; N uni02A4 ; G 614\nU 677 ; WX 998 ; N uni02A5 ; G 615\nU 678 ; WX 823 ; N uni02A6 ; G 616\nU 679 ; WX 598 ; N uni02A7 ; G 617\nU 680 ; WX 825 ; N uni02A8 ; G 618\nU 681 ; WX 894 ; N uni02A9 ; G 619\nU 682 ; WX 725 ; N uni02AA ; G 620\nU 683 ; WX 676 ; N uni02AB ; G 621\nU 684 ; WX 598 ; N uni02AC ; G 622\nU 685 ; WX 443 ; N uni02AD ; G 623\nU 686 ; WX 781 ; N uni02AE ; G 624\nU 687 ; WX 767 ; N uni02AF ; G 625\nU 688 ; WX 433 ; N uni02B0 ; G 626\nU 689 ; WX 430 ; N uni02B1 ; G 627\nU 690 ; WX 264 ; N uni02B2 ; G 628\nU 691 ; WX 347 ; N uni02B3 ; G 629\nU 692 ; WX 347 ; N uni02B4 ; G 630\nU 693 ; WX 430 ; N uni02B5 ; G 631\nU 694 ; WX 392 ; N uni02B6 ; G 632\nU 695 ; WX 585 ; N uni02B7 ; G 633\nU 696 ; WX 423 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 280 ; N uni02C0 ; G 642\nU 705 ; WX 281 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 275 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 275 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 720 ; WX 337 ; N uni02D0 ; G 656\nU 721 ; WX 337 ; N uni02D1 ; G 657\nU 722 ; WX 307 ; N uni02D2 ; G 658\nU 723 ; WX 307 ; N uni02D3 ; G 659\nU 726 ; WX 329 ; N uni02D6 ; G 660\nU 727 ; WX 329 ; N uni02D7 ; G 661\nU 728 ; WX 500 ; N breve ; G 662\nU 729 ; WX 500 ; N dotaccent ; G 663\nU 730 ; WX 500 ; N ring ; G 664\nU 731 ; WX 500 ; N ogonek ; G 665\nU 732 ; WX 500 ; N tilde ; G 666\nU 733 ; WX 500 ; N hungarumlaut ; G 667\nU 734 ; WX 417 ; N uni02DE ; G 668\nU 736 ; WX 377 ; N uni02E0 ; G 669\nU 737 ; WX 243 ; N uni02E1 ; G 670\nU 738 ; WX 337 ; N uni02E2 ; G 671\nU 739 ; WX 424 ; N uni02E3 ; G 672\nU 740 ; WX 281 ; N uni02E4 ; G 673\nU 741 ; WX 493 ; N uni02E5 ; G 674\nU 742 ; WX 493 ; N uni02E6 ; G 675\nU 743 ; WX 493 ; N uni02E7 ; G 676\nU 744 ; WX 493 ; N uni02E8 ; G 677\nU 745 ; WX 493 ; N uni02E9 ; G 678\nU 748 ; WX 500 ; N uni02EC ; G 679\nU 750 ; WX 484 ; N uni02EE ; G 680\nU 751 ; WX 500 ; N uni02EF ; G 681\nU 752 ; WX 500 ; N uni02F0 ; G 682\nU 755 ; WX 500 ; N uni02F3 ; G 683\nU 759 ; WX 500 ; N uni02F7 ; G 684\nU 768 ; WX 0 ; N gravecomb ; G 685\nU 769 ; WX 0 ; N acutecomb ; G 686\nU 770 ; WX 0 ; N uni0302 ; G 687\nU 771 ; WX 0 ; N tildecomb ; G 688\nU 772 ; WX 0 ; N uni0304 ; G 689\nU 773 ; WX 0 ; N uni0305 ; G 690\nU 774 ; WX 0 ; N uni0306 ; G 691\nU 775 ; WX 0 ; N uni0307 ; G 692\nU 776 ; WX 0 ; N uni0308 ; G 693\nU 777 ; WX 0 ; N hookabovecomb ; G 694\nU 778 ; WX 0 ; N uni030A ; G 695\nU 779 ; WX 0 ; N uni030B ; G 696\nU 780 ; WX 0 ; N uni030C ; G 697\nU 781 ; WX 0 ; N uni030D ; G 698\nU 782 ; WX 0 ; N uni030E ; G 699\nU 783 ; WX 0 ; N uni030F ; G 700\nU 784 ; WX 0 ; N uni0310 ; G 701\nU 785 ; WX 0 ; N uni0311 ; G 702\nU 786 ; WX 0 ; N uni0312 ; G 703\nU 787 ; WX 0 ; N uni0313 ; G 704\nU 788 ; WX 0 ; N uni0314 ; G 705\nU 789 ; WX 0 ; N uni0315 ; G 706\nU 790 ; WX 0 ; N uni0316 ; G 707\nU 791 ; WX 0 ; N uni0317 ; G 708\nU 792 ; WX 0 ; N uni0318 ; G 709\nU 793 ; WX 0 ; N uni0319 ; G 710\nU 794 ; WX 0 ; N uni031A ; G 711\nU 795 ; WX 0 ; N uni031B ; G 712\nU 796 ; WX 0 ; N uni031C ; G 713\nU 797 ; WX 0 ; N uni031D ; G 714\nU 798 ; WX 0 ; N uni031E ; G 715\nU 799 ; WX 0 ; N uni031F ; G 716\nU 800 ; WX 0 ; N uni0320 ; G 717\nU 801 ; WX 0 ; N uni0321 ; G 718\nU 802 ; WX 0 ; N uni0322 ; G 719\nU 803 ; WX 0 ; N dotbelowcomb ; G 720\nU 804 ; WX 0 ; N uni0324 ; G 721\nU 805 ; WX 0 ; N uni0325 ; G 722\nU 806 ; WX 0 ; N uni0326 ; G 723\nU 807 ; WX 0 ; N uni0327 ; G 724\nU 808 ; WX 0 ; N uni0328 ; G 725\nU 809 ; WX 0 ; N uni0329 ; G 726\nU 810 ; WX 0 ; N uni032A ; G 727\nU 811 ; WX 0 ; N uni032B ; G 728\nU 812 ; WX 0 ; N uni032C ; G 729\nU 813 ; WX 0 ; N uni032D ; G 730\nU 814 ; WX 0 ; N uni032E ; G 731\nU 815 ; WX 0 ; N uni032F ; G 732\nU 816 ; WX 0 ; N uni0330 ; G 733\nU 817 ; WX 0 ; N uni0331 ; G 734\nU 818 ; WX 0 ; N uni0332 ; G 735\nU 819 ; WX 0 ; N uni0333 ; G 736\nU 820 ; WX 0 ; N uni0334 ; G 737\nU 821 ; WX 0 ; N uni0335 ; G 738\nU 822 ; WX 0 ; N uni0336 ; G 739\nU 823 ; WX 0 ; N uni0337 ; G 740\nU 824 ; WX 0 ; N uni0338 ; G 741\nU 825 ; WX 0 ; N uni0339 ; G 742\nU 826 ; WX 0 ; N uni033A ; G 743\nU 827 ; WX 0 ; N uni033B ; G 744\nU 828 ; WX 0 ; N uni033C ; G 745\nU 829 ; WX 0 ; N uni033D ; G 746\nU 830 ; WX 0 ; N uni033E ; G 747\nU 831 ; WX 0 ; N uni033F ; G 748\nU 835 ; WX 0 ; N uni0343 ; G 749\nU 847 ; WX 0 ; N uni034F ; G 750\nU 856 ; WX 0 ; N uni0358 ; G 751\nU 864 ; WX 0 ; N uni0360 ; G 752\nU 865 ; WX 0 ; N uni0361 ; G 753\nU 880 ; WX 740 ; N uni0370 ; G 754\nU 881 ; WX 531 ; N uni0371 ; G 755\nU 882 ; WX 667 ; N uni0372 ; G 756\nU 883 ; WX 553 ; N uni0373 ; G 757\nU 884 ; WX 278 ; N uni0374 ; G 758\nU 885 ; WX 278 ; N uni0375 ; G 759\nU 886 ; WX 875 ; N uni0376 ; G 760\nU 887 ; WX 667 ; N uni0377 ; G 761\nU 890 ; WX 500 ; N uni037A ; G 762\nU 891 ; WX 560 ; N uni037B ; G 763\nU 892 ; WX 560 ; N uni037C ; G 764\nU 893 ; WX 560 ; N uni037D ; G 765\nU 894 ; WX 337 ; N uni037E ; G 766\nU 895 ; WX 401 ; N uni037F ; G 767\nU 900 ; WX 500 ; N tonos ; G 768\nU 901 ; WX 500 ; N dieresistonos ; G 769\nU 902 ; WX 722 ; N Alphatonos ; G 770\nU 903 ; WX 318 ; N anoteleia ; G 771\nU 904 ; WX 900 ; N Epsilontonos ; G 772\nU 905 ; WX 1039 ; N Etatonos ; G 773\nU 906 ; WX 562 ; N Iotatonos ; G 774\nU 908 ; WX 835 ; N Omicrontonos ; G 775\nU 910 ; WX 897 ; N Upsilontonos ; G 776\nU 911 ; WX 853 ; N Omegatonos ; G 777\nU 912 ; WX 392 ; N iotadieresistonos ; G 778\nU 913 ; WX 722 ; N Alpha ; G 779\nU 914 ; WX 735 ; N Beta ; G 780\nU 915 ; WX 694 ; N Gamma ; G 781\nU 916 ; WX 722 ; N uni0394 ; G 782\nU 917 ; WX 730 ; N Epsilon ; G 783\nU 918 ; WX 695 ; N Zeta ; G 784\nU 919 ; WX 872 ; N Eta ; G 785\nU 920 ; WX 820 ; N Theta ; G 786\nU 921 ; WX 395 ; N Iota ; G 787\nU 922 ; WX 747 ; N Kappa ; G 788\nU 923 ; WX 722 ; N Lambda ; G 789\nU 924 ; WX 1024 ; N Mu ; G 790\nU 925 ; WX 875 ; N Nu ; G 791\nU 926 ; WX 704 ; N Xi ; G 792\nU 927 ; WX 820 ; N Omicron ; G 793\nU 928 ; WX 872 ; N Pi ; G 794\nU 929 ; WX 673 ; N Rho ; G 795\nU 931 ; WX 707 ; N Sigma ; G 796\nU 932 ; WX 667 ; N Tau ; G 797\nU 933 ; WX 660 ; N Upsilon ; G 798\nU 934 ; WX 820 ; N Phi ; G 799\nU 935 ; WX 712 ; N Chi ; G 800\nU 936 ; WX 877 ; N Psi ; G 801\nU 937 ; WX 829 ; N Omega ; G 802\nU 938 ; WX 395 ; N Iotadieresis ; G 803\nU 939 ; WX 660 ; N Upsilondieresis ; G 804\nU 940 ; WX 675 ; N alphatonos ; G 805\nU 941 ; WX 518 ; N epsilontonos ; G 806\nU 942 ; WX 599 ; N etatonos ; G 807\nU 943 ; WX 392 ; N iotatonos ; G 808\nU 944 ; WX 608 ; N upsilondieresistonos ; G 809\nU 945 ; WX 675 ; N alpha ; G 810\nU 946 ; WX 578 ; N beta ; G 811\nU 947 ; WX 598 ; N gamma ; G 812\nU 948 ; WX 602 ; N delta ; G 813\nU 949 ; WX 518 ; N epsilon ; G 814\nU 950 ; WX 542 ; N zeta ; G 815\nU 951 ; WX 599 ; N eta ; G 816\nU 952 ; WX 602 ; N theta ; G 817\nU 953 ; WX 392 ; N iota ; G 818\nU 954 ; WX 625 ; N kappa ; G 819\nU 955 ; WX 634 ; N lambda ; G 820\nU 956 ; WX 650 ; N uni03BC ; G 821\nU 957 ; WX 608 ; N nu ; G 822\nU 958 ; WX 551 ; N xi ; G 823\nU 959 ; WX 602 ; N omicron ; G 824\nU 960 ; WX 657 ; N pi ; G 825\nU 961 ; WX 588 ; N rho ; G 826\nU 962 ; WX 560 ; N sigma1 ; G 827\nU 963 ; WX 683 ; N sigma ; G 828\nU 964 ; WX 553 ; N tau ; G 829\nU 965 ; WX 608 ; N upsilon ; G 830\nU 966 ; WX 700 ; N phi ; G 831\nU 967 ; WX 606 ; N chi ; G 832\nU 968 ; WX 784 ; N psi ; G 833\nU 969 ; WX 815 ; N omega ; G 834\nU 970 ; WX 392 ; N iotadieresis ; G 835\nU 971 ; WX 608 ; N upsilondieresis ; G 836\nU 972 ; WX 602 ; N omicrontonos ; G 837\nU 973 ; WX 608 ; N upsilontonos ; G 838\nU 974 ; WX 815 ; N omegatonos ; G 839\nU 975 ; WX 747 ; N uni03CF ; G 840\nU 976 ; WX 583 ; N uni03D0 ; G 841\nU 977 ; WX 715 ; N theta1 ; G 842\nU 978 ; WX 687 ; N Upsilon1 ; G 843\nU 979 ; WX 874 ; N uni03D3 ; G 844\nU 980 ; WX 687 ; N uni03D4 ; G 845\nU 981 ; WX 682 ; N phi1 ; G 846\nU 982 ; WX 815 ; N omega1 ; G 847\nU 983 ; WX 624 ; N uni03D7 ; G 848\nU 984 ; WX 820 ; N uni03D8 ; G 849\nU 985 ; WX 602 ; N uni03D9 ; G 850\nU 986 ; WX 765 ; N uni03DA ; G 851\nU 987 ; WX 560 ; N uni03DB ; G 852\nU 988 ; WX 694 ; N uni03DC ; G 853\nU 989 ; WX 463 ; N uni03DD ; G 854\nU 990 ; WX 590 ; N uni03DE ; G 855\nU 991 ; WX 660 ; N uni03DF ; G 856\nU 992 ; WX 782 ; N uni03E0 ; G 857\nU 993 ; WX 577 ; N uni03E1 ; G 858\nU 1008 ; WX 624 ; N uni03F0 ; G 859\nU 1009 ; WX 588 ; N uni03F1 ; G 860\nU 1010 ; WX 560 ; N uni03F2 ; G 861\nU 1011 ; WX 310 ; N uni03F3 ; G 862\nU 1012 ; WX 820 ; N uni03F4 ; G 863\nU 1013 ; WX 560 ; N uni03F5 ; G 864\nU 1014 ; WX 560 ; N uni03F6 ; G 865\nU 1015 ; WX 676 ; N uni03F7 ; G 866\nU 1016 ; WX 640 ; N uni03F8 ; G 867\nU 1017 ; WX 765 ; N uni03F9 ; G 868\nU 1018 ; WX 1024 ; N uni03FA ; G 869\nU 1019 ; WX 708 ; N uni03FB ; G 870\nU 1020 ; WX 588 ; N uni03FC ; G 871\nU 1021 ; WX 765 ; N uni03FD ; G 872\nU 1022 ; WX 765 ; N uni03FE ; G 873\nU 1023 ; WX 765 ; N uni03FF ; G 874\nU 1024 ; WX 730 ; N uni0400 ; G 875\nU 1025 ; WX 730 ; N uni0401 ; G 876\nU 1026 ; WX 799 ; N uni0402 ; G 877\nU 1027 ; WX 662 ; N uni0403 ; G 878\nU 1028 ; WX 765 ; N uni0404 ; G 879\nU 1029 ; WX 685 ; N uni0405 ; G 880\nU 1030 ; WX 395 ; N uni0406 ; G 881\nU 1031 ; WX 395 ; N uni0407 ; G 882\nU 1032 ; WX 401 ; N uni0408 ; G 883\nU 1033 ; WX 1084 ; N uni0409 ; G 884\nU 1034 ; WX 1118 ; N uni040A ; G 885\nU 1035 ; WX 872 ; N uni040B ; G 886\nU 1036 ; WX 774 ; N uni040C ; G 887\nU 1037 ; WX 872 ; N uni040D ; G 888\nU 1038 ; WX 723 ; N uni040E ; G 889\nU 1039 ; WX 872 ; N uni040F ; G 890\nU 1040 ; WX 757 ; N uni0410 ; G 891\nU 1041 ; WX 735 ; N uni0411 ; G 892\nU 1042 ; WX 735 ; N uni0412 ; G 893\nU 1043 ; WX 662 ; N uni0413 ; G 894\nU 1044 ; WX 813 ; N uni0414 ; G 895\nU 1045 ; WX 730 ; N uni0415 ; G 896\nU 1046 ; WX 1124 ; N uni0416 ; G 897\nU 1047 ; WX 623 ; N uni0417 ; G 898\nU 1048 ; WX 872 ; N uni0418 ; G 899\nU 1049 ; WX 872 ; N uni0419 ; G 900\nU 1050 ; WX 774 ; N uni041A ; G 901\nU 1051 ; WX 834 ; N uni041B ; G 902\nU 1052 ; WX 1024 ; N uni041C ; G 903\nU 1053 ; WX 872 ; N uni041D ; G 904\nU 1054 ; WX 820 ; N uni041E ; G 905\nU 1055 ; WX 872 ; N uni041F ; G 906\nU 1056 ; WX 673 ; N uni0420 ; G 907\nU 1057 ; WX 765 ; N uni0421 ; G 908\nU 1058 ; WX 667 ; N uni0422 ; G 909\nU 1059 ; WX 723 ; N uni0423 ; G 910\nU 1060 ; WX 830 ; N uni0424 ; G 911\nU 1061 ; WX 712 ; N uni0425 ; G 912\nU 1062 ; WX 872 ; N uni0426 ; G 913\nU 1063 ; WX 773 ; N uni0427 ; G 914\nU 1064 ; WX 1141 ; N uni0428 ; G 915\nU 1065 ; WX 1141 ; N uni0429 ; G 916\nU 1066 ; WX 794 ; N uni042A ; G 917\nU 1067 ; WX 984 ; N uni042B ; G 918\nU 1068 ; WX 674 ; N uni042C ; G 919\nU 1069 ; WX 765 ; N uni042D ; G 920\nU 1070 ; WX 1193 ; N uni042E ; G 921\nU 1071 ; WX 808 ; N uni042F ; G 922\nU 1072 ; WX 596 ; N uni0430 ; G 923\nU 1073 ; WX 602 ; N uni0431 ; G 924\nU 1074 ; WX 563 ; N uni0432 ; G 925\nU 1075 ; WX 524 ; N uni0433 ; G 926\nU 1076 ; WX 616 ; N uni0434 ; G 927\nU 1077 ; WX 592 ; N uni0435 ; G 928\nU 1078 ; WX 920 ; N uni0436 ; G 929\nU 1079 ; WX 545 ; N uni0437 ; G 930\nU 1080 ; WX 667 ; N uni0438 ; G 931\nU 1081 ; WX 667 ; N uni0439 ; G 932\nU 1082 ; WX 625 ; N uni043A ; G 933\nU 1083 ; WX 635 ; N uni043B ; G 934\nU 1084 ; WX 778 ; N uni043C ; G 935\nU 1085 ; WX 667 ; N uni043D ; G 936\nU 1086 ; WX 602 ; N uni043E ; G 937\nU 1087 ; WX 667 ; N uni043F ; G 938\nU 1088 ; WX 640 ; N uni0440 ; G 939\nU 1089 ; WX 560 ; N uni0441 ; G 940\nU 1090 ; WX 553 ; N uni0442 ; G 941\nU 1091 ; WX 588 ; N uni0443 ; G 942\nU 1092 ; WX 783 ; N uni0444 ; G 943\nU 1093 ; WX 564 ; N uni0445 ; G 944\nU 1094 ; WX 643 ; N uni0446 ; G 945\nU 1095 ; WX 661 ; N uni0447 ; G 946\nU 1096 ; WX 930 ; N uni0448 ; G 947\nU 1097 ; WX 930 ; N uni0449 ; G 948\nU 1098 ; WX 636 ; N uni044A ; G 949\nU 1099 ; WX 796 ; N uni044B ; G 950\nU 1100 ; WX 544 ; N uni044C ; G 951\nU 1101 ; WX 560 ; N uni044D ; G 952\nU 1102 ; WX 871 ; N uni044E ; G 953\nU 1103 ; WX 631 ; N uni044F ; G 954\nU 1104 ; WX 592 ; N uni0450 ; G 955\nU 1105 ; WX 592 ; N uni0451 ; G 956\nU 1106 ; WX 624 ; N uni0452 ; G 957\nU 1107 ; WX 524 ; N uni0453 ; G 958\nU 1108 ; WX 560 ; N uni0454 ; G 959\nU 1109 ; WX 513 ; N uni0455 ; G 960\nU 1110 ; WX 320 ; N uni0456 ; G 961\nU 1111 ; WX 320 ; N uni0457 ; G 962\nU 1112 ; WX 310 ; N uni0458 ; G 963\nU 1113 ; WX 843 ; N uni0459 ; G 964\nU 1114 ; WX 860 ; N uni045A ; G 965\nU 1115 ; WX 644 ; N uni045B ; G 966\nU 1116 ; WX 625 ; N uni045C ; G 967\nU 1117 ; WX 667 ; N uni045D ; G 968\nU 1118 ; WX 588 ; N uni045E ; G 969\nU 1119 ; WX 656 ; N uni045F ; G 970\nU 1122 ; WX 762 ; N uni0462 ; G 971\nU 1123 ; WX 603 ; N uni0463 ; G 972\nU 1124 ; WX 1129 ; N uni0464 ; G 973\nU 1125 ; WX 834 ; N uni0465 ; G 974\nU 1130 ; WX 1124 ; N uni046A ; G 975\nU 1131 ; WX 920 ; N uni046B ; G 976\nU 1132 ; WX 1359 ; N uni046C ; G 977\nU 1133 ; WX 1113 ; N uni046D ; G 978\nU 1136 ; WX 944 ; N uni0470 ; G 979\nU 1137 ; WX 902 ; N uni0471 ; G 980\nU 1138 ; WX 820 ; N uni0472 ; G 981\nU 1139 ; WX 552 ; N uni0473 ; G 982\nU 1140 ; WX 859 ; N uni0474 ; G 983\nU 1141 ; WX 678 ; N uni0475 ; G 984\nU 1142 ; WX 859 ; N uni0476 ; G 985\nU 1143 ; WX 678 ; N uni0477 ; G 986\nU 1164 ; WX 707 ; N uni048C ; G 987\nU 1165 ; WX 544 ; N uni048D ; G 988\nU 1168 ; WX 672 ; N uni0490 ; G 989\nU 1169 ; WX 529 ; N uni0491 ; G 990\nU 1170 ; WX 662 ; N uni0492 ; G 991\nU 1171 ; WX 523 ; N uni0493 ; G 992\nU 1172 ; WX 728 ; N uni0494 ; G 993\nU 1173 ; WX 614 ; N uni0495 ; G 994\nU 1174 ; WX 1124 ; N uni0496 ; G 995\nU 1175 ; WX 920 ; N uni0497 ; G 996\nU 1176 ; WX 636 ; N uni0498 ; G 997\nU 1177 ; WX 537 ; N uni0499 ; G 998\nU 1178 ; WX 774 ; N uni049A ; G 999\nU 1179 ; WX 606 ; N uni049B ; G 1000\nU 1182 ; WX 774 ; N uni049E ; G 1001\nU 1183 ; WX 625 ; N uni049F ; G 1002\nU 1184 ; WX 891 ; N uni04A0 ; G 1003\nU 1185 ; WX 717 ; N uni04A1 ; G 1004\nU 1186 ; WX 872 ; N uni04A2 ; G 1005\nU 1187 ; WX 641 ; N uni04A3 ; G 1006\nU 1188 ; WX 1139 ; N uni04A4 ; G 1007\nU 1189 ; WX 852 ; N uni04A5 ; G 1008\nU 1190 ; WX 1205 ; N uni04A6 ; G 1009\nU 1191 ; WX 941 ; N uni04A7 ; G 1010\nU 1194 ; WX 765 ; N uni04AA ; G 1011\nU 1195 ; WX 560 ; N uni04AB ; G 1012\nU 1196 ; WX 667 ; N uni04AC ; G 1013\nU 1197 ; WX 553 ; N uni04AD ; G 1014\nU 1198 ; WX 660 ; N uni04AE ; G 1015\nU 1199 ; WX 565 ; N uni04AF ; G 1016\nU 1200 ; WX 660 ; N uni04B0 ; G 1017\nU 1201 ; WX 565 ; N uni04B1 ; G 1018\nU 1202 ; WX 712 ; N uni04B2 ; G 1019\nU 1203 ; WX 564 ; N uni04B3 ; G 1020\nU 1204 ; WX 952 ; N uni04B4 ; G 1021\nU 1205 ; WX 732 ; N uni04B5 ; G 1022\nU 1206 ; WX 749 ; N uni04B6 ; G 1023\nU 1207 ; WX 690 ; N uni04B7 ; G 1024\nU 1210 ; WX 749 ; N uni04BA ; G 1025\nU 1211 ; WX 644 ; N uni04BB ; G 1026\nU 1216 ; WX 395 ; N uni04C0 ; G 1027\nU 1217 ; WX 1124 ; N uni04C1 ; G 1028\nU 1218 ; WX 920 ; N uni04C2 ; G 1029\nU 1219 ; WX 747 ; N uni04C3 ; G 1030\nU 1220 ; WX 606 ; N uni04C4 ; G 1031\nU 1223 ; WX 872 ; N uni04C7 ; G 1032\nU 1224 ; WX 667 ; N uni04C8 ; G 1033\nU 1227 ; WX 749 ; N uni04CB ; G 1034\nU 1228 ; WX 667 ; N uni04CC ; G 1035\nU 1231 ; WX 320 ; N uni04CF ; G 1036\nU 1232 ; WX 757 ; N uni04D0 ; G 1037\nU 1233 ; WX 596 ; N uni04D1 ; G 1038\nU 1234 ; WX 757 ; N uni04D2 ; G 1039\nU 1235 ; WX 596 ; N uni04D3 ; G 1040\nU 1236 ; WX 1001 ; N uni04D4 ; G 1041\nU 1237 ; WX 940 ; N uni04D5 ; G 1042\nU 1238 ; WX 730 ; N uni04D6 ; G 1043\nU 1239 ; WX 592 ; N uni04D7 ; G 1044\nU 1240 ; WX 820 ; N uni04D8 ; G 1045\nU 1241 ; WX 592 ; N uni04D9 ; G 1046\nU 1242 ; WX 820 ; N uni04DA ; G 1047\nU 1243 ; WX 592 ; N uni04DB ; G 1048\nU 1244 ; WX 1124 ; N uni04DC ; G 1049\nU 1245 ; WX 920 ; N uni04DD ; G 1050\nU 1246 ; WX 623 ; N uni04DE ; G 1051\nU 1247 ; WX 545 ; N uni04DF ; G 1052\nU 1248 ; WX 564 ; N uni04E0 ; G 1053\nU 1249 ; WX 564 ; N uni04E1 ; G 1054\nU 1250 ; WX 872 ; N uni04E2 ; G 1055\nU 1251 ; WX 667 ; N uni04E3 ; G 1056\nU 1252 ; WX 872 ; N uni04E4 ; G 1057\nU 1253 ; WX 667 ; N uni04E5 ; G 1058\nU 1254 ; WX 820 ; N uni04E6 ; G 1059\nU 1255 ; WX 602 ; N uni04E7 ; G 1060\nU 1256 ; WX 820 ; N uni04E8 ; G 1061\nU 1257 ; WX 602 ; N uni04E9 ; G 1062\nU 1258 ; WX 820 ; N uni04EA ; G 1063\nU 1259 ; WX 602 ; N uni04EB ; G 1064\nU 1260 ; WX 765 ; N uni04EC ; G 1065\nU 1261 ; WX 560 ; N uni04ED ; G 1066\nU 1262 ; WX 723 ; N uni04EE ; G 1067\nU 1263 ; WX 588 ; N uni04EF ; G 1068\nU 1264 ; WX 723 ; N uni04F0 ; G 1069\nU 1265 ; WX 588 ; N uni04F1 ; G 1070\nU 1266 ; WX 723 ; N uni04F2 ; G 1071\nU 1267 ; WX 588 ; N uni04F3 ; G 1072\nU 1268 ; WX 773 ; N uni04F4 ; G 1073\nU 1269 ; WX 661 ; N uni04F5 ; G 1074\nU 1270 ; WX 662 ; N uni04F6 ; G 1075\nU 1271 ; WX 524 ; N uni04F7 ; G 1076\nU 1272 ; WX 984 ; N uni04F8 ; G 1077\nU 1273 ; WX 796 ; N uni04F9 ; G 1078\nU 1296 ; WX 623 ; N uni0510 ; G 1079\nU 1297 ; WX 545 ; N uni0511 ; G 1080\nU 1298 ; WX 834 ; N uni0512 ; G 1081\nU 1299 ; WX 635 ; N uni0513 ; G 1082\nU 1300 ; WX 1198 ; N uni0514 ; G 1083\nU 1301 ; WX 919 ; N uni0515 ; G 1084\nU 1306 ; WX 820 ; N uni051A ; G 1085\nU 1307 ; WX 640 ; N uni051B ; G 1086\nU 1308 ; WX 1028 ; N uni051C ; G 1087\nU 1309 ; WX 856 ; N uni051D ; G 1088\nU 1329 ; WX 810 ; N uni0531 ; G 1089\nU 1330 ; WX 811 ; N uni0532 ; G 1090\nU 1331 ; WX 826 ; N uni0533 ; G 1091\nU 1332 ; WX 847 ; N uni0534 ; G 1092\nU 1333 ; WX 806 ; N uni0535 ; G 1093\nU 1334 ; WX 826 ; N uni0536 ; G 1094\nU 1335 ; WX 761 ; N uni0537 ; G 1095\nU 1336 ; WX 811 ; N uni0538 ; G 1096\nU 1337 ; WX 968 ; N uni0539 ; G 1097\nU 1338 ; WX 816 ; N uni053A ; G 1098\nU 1339 ; WX 772 ; N uni053B ; G 1099\nU 1340 ; WX 682 ; N uni053C ; G 1100\nU 1341 ; WX 1097 ; N uni053D ; G 1101\nU 1342 ; WX 845 ; N uni053E ; G 1102\nU 1343 ; WX 804 ; N uni053F ; G 1103\nU 1344 ; WX 719 ; N uni0540 ; G 1104\nU 1345 ; WX 810 ; N uni0541 ; G 1105\nU 1346 ; WX 833 ; N uni0542 ; G 1106\nU 1347 ; WX 843 ; N uni0543 ; G 1107\nU 1348 ; WX 897 ; N uni0544 ; G 1108\nU 1349 ; WX 763 ; N uni0545 ; G 1109\nU 1350 ; WX 794 ; N uni0546 ; G 1110\nU 1351 ; WX 754 ; N uni0547 ; G 1111\nU 1352 ; WX 799 ; N uni0548 ; G 1112\nU 1353 ; WX 797 ; N uni0549 ; G 1113\nU 1354 ; WX 875 ; N uni054A ; G 1114\nU 1355 ; WX 830 ; N uni054B ; G 1115\nU 1356 ; WX 884 ; N uni054C ; G 1116\nU 1357 ; WX 799 ; N uni054D ; G 1117\nU 1358 ; WX 802 ; N uni054E ; G 1118\nU 1359 ; WX 731 ; N uni054F ; G 1119\nU 1360 ; WX 774 ; N uni0550 ; G 1120\nU 1361 ; WX 749 ; N uni0551 ; G 1121\nU 1362 ; WX 633 ; N uni0552 ; G 1122\nU 1363 ; WX 845 ; N uni0553 ; G 1123\nU 1364 ; WX 843 ; N uni0554 ; G 1124\nU 1365 ; WX 835 ; N uni0555 ; G 1125\nU 1366 ; WX 821 ; N uni0556 ; G 1126\nU 1369 ; WX 307 ; N uni0559 ; G 1127\nU 1370 ; WX 264 ; N uni055A ; G 1128\nU 1371 ; WX 229 ; N uni055B ; G 1129\nU 1372 ; WX 391 ; N uni055C ; G 1130\nU 1373 ; WX 364 ; N uni055D ; G 1131\nU 1374 ; WX 386 ; N uni055E ; G 1132\nU 1375 ; WX 500 ; N uni055F ; G 1133\nU 1377 ; WX 949 ; N uni0561 ; G 1134\nU 1378 ; WX 618 ; N uni0562 ; G 1135\nU 1379 ; WX 695 ; N uni0563 ; G 1136\nU 1380 ; WX 695 ; N uni0564 ; G 1137\nU 1381 ; WX 628 ; N uni0565 ; G 1138\nU 1382 ; WX 688 ; N uni0566 ; G 1139\nU 1383 ; WX 510 ; N uni0567 ; G 1140\nU 1384 ; WX 636 ; N uni0568 ; G 1141\nU 1385 ; WX 791 ; N uni0569 ; G 1142\nU 1386 ; WX 671 ; N uni056A ; G 1143\nU 1387 ; WX 635 ; N uni056B ; G 1144\nU 1388 ; WX 305 ; N uni056C ; G 1145\nU 1389 ; WX 973 ; N uni056D ; G 1146\nU 1390 ; WX 614 ; N uni056E ; G 1147\nU 1391 ; WX 628 ; N uni056F ; G 1148\nU 1392 ; WX 636 ; N uni0570 ; G 1149\nU 1393 ; WX 630 ; N uni0571 ; G 1150\nU 1394 ; WX 636 ; N uni0572 ; G 1151\nU 1395 ; WX 654 ; N uni0573 ; G 1152\nU 1396 ; WX 644 ; N uni0574 ; G 1153\nU 1397 ; WX 309 ; N uni0575 ; G 1154\nU 1398 ; WX 636 ; N uni0576 ; G 1155\nU 1399 ; WX 461 ; N uni0577 ; G 1156\nU 1400 ; WX 649 ; N uni0578 ; G 1157\nU 1401 ; WX 365 ; N uni0579 ; G 1158\nU 1402 ; WX 940 ; N uni057A ; G 1159\nU 1403 ; WX 562 ; N uni057B ; G 1160\nU 1404 ; WX 657 ; N uni057C ; G 1161\nU 1405 ; WX 644 ; N uni057D ; G 1162\nU 1406 ; WX 630 ; N uni057E ; G 1163\nU 1407 ; WX 930 ; N uni057F ; G 1164\nU 1408 ; WX 644 ; N uni0580 ; G 1165\nU 1409 ; WX 643 ; N uni0581 ; G 1166\nU 1410 ; WX 483 ; N uni0582 ; G 1167\nU 1411 ; WX 930 ; N uni0583 ; G 1168\nU 1412 ; WX 636 ; N uni0584 ; G 1169\nU 1413 ; WX 609 ; N uni0585 ; G 1170\nU 1414 ; WX 809 ; N uni0586 ; G 1171\nU 1415 ; WX 789 ; N uni0587 ; G 1172\nU 1417 ; WX 340 ; N uni0589 ; G 1173\nU 1418 ; WX 334 ; N uni058A ; G 1174\nU 3647 ; WX 636 ; N uni0E3F ; G 1175\nU 4256 ; WX 723 ; N uni10A0 ; G 1176\nU 4257 ; WX 850 ; N uni10A1 ; G 1177\nU 4258 ; WX 828 ; N uni10A2 ; G 1178\nU 4259 ; WX 859 ; N uni10A3 ; G 1179\nU 4260 ; WX 733 ; N uni10A4 ; G 1180\nU 4261 ; WX 981 ; N uni10A5 ; G 1181\nU 4262 ; WX 916 ; N uni10A6 ; G 1182\nU 4263 ; WX 1101 ; N uni10A7 ; G 1183\nU 4264 ; WX 566 ; N uni10A8 ; G 1184\nU 4265 ; WX 750 ; N uni10A9 ; G 1185\nU 4266 ; WX 962 ; N uni10AA ; G 1186\nU 4267 ; WX 941 ; N uni10AB ; G 1187\nU 4268 ; WX 743 ; N uni10AC ; G 1188\nU 4269 ; WX 1075 ; N uni10AD ; G 1189\nU 4270 ; WX 896 ; N uni10AE ; G 1190\nU 4271 ; WX 829 ; N uni10AF ; G 1191\nU 4272 ; WX 1040 ; N uni10B0 ; G 1192\nU 4273 ; WX 733 ; N uni10B1 ; G 1193\nU 4274 ; WX 669 ; N uni10B2 ; G 1194\nU 4275 ; WX 1015 ; N uni10B3 ; G 1195\nU 4276 ; WX 937 ; N uni10B4 ; G 1196\nU 4277 ; WX 1020 ; N uni10B5 ; G 1197\nU 4278 ; WX 731 ; N uni10B6 ; G 1198\nU 4279 ; WX 733 ; N uni10B7 ; G 1199\nU 4280 ; WX 732 ; N uni10B8 ; G 1200\nU 4281 ; WX 733 ; N uni10B9 ; G 1201\nU 4282 ; WX 879 ; N uni10BA ; G 1202\nU 4283 ; WX 937 ; N uni10BB ; G 1203\nU 4284 ; WX 714 ; N uni10BC ; G 1204\nU 4285 ; WX 755 ; N uni10BD ; G 1205\nU 4286 ; WX 733 ; N uni10BE ; G 1206\nU 4287 ; WX 958 ; N uni10BF ; G 1207\nU 4288 ; WX 1000 ; N uni10C0 ; G 1208\nU 4289 ; WX 702 ; N uni10C1 ; G 1209\nU 4290 ; WX 864 ; N uni10C2 ; G 1210\nU 4291 ; WX 734 ; N uni10C3 ; G 1211\nU 4292 ; WX 837 ; N uni10C4 ; G 1212\nU 4293 ; WX 951 ; N uni10C5 ; G 1213\nU 4304 ; WX 541 ; N uni10D0 ; G 1214\nU 4305 ; WX 571 ; N uni10D1 ; G 1215\nU 4306 ; WX 589 ; N uni10D2 ; G 1216\nU 4307 ; WX 833 ; N uni10D3 ; G 1217\nU 4308 ; WX 561 ; N uni10D4 ; G 1218\nU 4309 ; WX 557 ; N uni10D5 ; G 1219\nU 4310 ; WX 618 ; N uni10D6 ; G 1220\nU 4311 ; WX 861 ; N uni10D7 ; G 1221\nU 4312 ; WX 560 ; N uni10D8 ; G 1222\nU 4313 ; WX 546 ; N uni10D9 ; G 1223\nU 4314 ; WX 1066 ; N uni10DA ; G 1224\nU 4315 ; WX 586 ; N uni10DB ; G 1225\nU 4316 ; WX 586 ; N uni10DC ; G 1226\nU 4317 ; WX 825 ; N uni10DD ; G 1227\nU 4318 ; WX 570 ; N uni10DE ; G 1228\nU 4319 ; WX 581 ; N uni10DF ; G 1229\nU 4320 ; WX 824 ; N uni10E0 ; G 1230\nU 4321 ; WX 607 ; N uni10E1 ; G 1231\nU 4322 ; WX 748 ; N uni10E2 ; G 1232\nU 4323 ; WX 698 ; N uni10E3 ; G 1233\nU 4324 ; WX 815 ; N uni10E4 ; G 1234\nU 4325 ; WX 585 ; N uni10E5 ; G 1235\nU 4326 ; WX 858 ; N uni10E6 ; G 1236\nU 4327 ; WX 568 ; N uni10E7 ; G 1237\nU 4328 ; WX 594 ; N uni10E8 ; G 1238\nU 4329 ; WX 586 ; N uni10E9 ; G 1239\nU 4330 ; WX 675 ; N uni10EA ; G 1240\nU 4331 ; WX 587 ; N uni10EB ; G 1241\nU 4332 ; WX 582 ; N uni10EC ; G 1242\nU 4333 ; WX 576 ; N uni10ED ; G 1243\nU 4334 ; WX 612 ; N uni10EE ; G 1244\nU 4335 ; WX 683 ; N uni10EF ; G 1245\nU 4336 ; WX 572 ; N uni10F0 ; G 1246\nU 4337 ; WX 603 ; N uni10F1 ; G 1247\nU 4338 ; WX 571 ; N uni10F2 ; G 1248\nU 4339 ; WX 572 ; N uni10F3 ; G 1249\nU 4340 ; WX 570 ; N uni10F4 ; G 1250\nU 4341 ; WX 649 ; N uni10F5 ; G 1251\nU 4342 ; WX 886 ; N uni10F6 ; G 1252\nU 4343 ; WX 626 ; N uni10F7 ; G 1253\nU 4344 ; WX 582 ; N uni10F8 ; G 1254\nU 4345 ; WX 619 ; N uni10F9 ; G 1255\nU 4346 ; WX 571 ; N uni10FA ; G 1256\nU 4347 ; WX 437 ; N uni10FB ; G 1257\nU 4348 ; WX 354 ; N uni10FC ; G 1258\nU 7424 ; WX 565 ; N uni1D00 ; G 1259\nU 7425 ; WX 774 ; N uni1D01 ; G 1260\nU 7426 ; WX 940 ; N uni1D02 ; G 1261\nU 7427 ; WX 563 ; N uni1D03 ; G 1262\nU 7428 ; WX 560 ; N uni1D04 ; G 1263\nU 7429 ; WX 585 ; N uni1D05 ; G 1264\nU 7430 ; WX 585 ; N uni1D06 ; G 1265\nU 7431 ; WX 553 ; N uni1D07 ; G 1266\nU 7432 ; WX 509 ; N uni1D08 ; G 1267\nU 7433 ; WX 320 ; N uni1D09 ; G 1268\nU 7434 ; WX 499 ; N uni1D0A ; G 1269\nU 7435 ; WX 625 ; N uni1D0B ; G 1270\nU 7436 ; WX 543 ; N uni1D0C ; G 1271\nU 7437 ; WX 778 ; N uni1D0D ; G 1272\nU 7438 ; WX 667 ; N uni1D0E ; G 1273\nU 7439 ; WX 602 ; N uni1D0F ; G 1274\nU 7440 ; WX 560 ; N uni1D10 ; G 1275\nU 7441 ; WX 647 ; N uni1D11 ; G 1276\nU 7442 ; WX 647 ; N uni1D12 ; G 1277\nU 7443 ; WX 647 ; N uni1D13 ; G 1278\nU 7444 ; WX 989 ; N uni1D14 ; G 1279\nU 7445 ; WX 512 ; N uni1D15 ; G 1280\nU 7446 ; WX 602 ; N uni1D16 ; G 1281\nU 7447 ; WX 602 ; N uni1D17 ; G 1282\nU 7448 ; WX 553 ; N uni1D18 ; G 1283\nU 7449 ; WX 594 ; N uni1D19 ; G 1284\nU 7450 ; WX 594 ; N uni1D1A ; G 1285\nU 7451 ; WX 553 ; N uni1D1B ; G 1286\nU 7452 ; WX 585 ; N uni1D1C ; G 1287\nU 7453 ; WX 664 ; N uni1D1D ; G 1288\nU 7454 ; WX 923 ; N uni1D1E ; G 1289\nU 7455 ; WX 655 ; N uni1D1F ; G 1290\nU 7456 ; WX 565 ; N uni1D20 ; G 1291\nU 7457 ; WX 856 ; N uni1D21 ; G 1292\nU 7458 ; WX 527 ; N uni1D22 ; G 1293\nU 7459 ; WX 527 ; N uni1D23 ; G 1294\nU 7460 ; WX 531 ; N uni1D24 ; G 1295\nU 7461 ; WX 743 ; N uni1D25 ; G 1296\nU 7462 ; WX 524 ; N uni1D26 ; G 1297\nU 7463 ; WX 565 ; N uni1D27 ; G 1298\nU 7464 ; WX 657 ; N uni1D28 ; G 1299\nU 7465 ; WX 553 ; N uni1D29 ; G 1300\nU 7466 ; WX 703 ; N uni1D2A ; G 1301\nU 7467 ; WX 635 ; N uni1D2B ; G 1302\nU 7468 ; WX 455 ; N uni1D2C ; G 1303\nU 7469 ; WX 630 ; N uni1D2D ; G 1304\nU 7470 ; WX 463 ; N uni1D2E ; G 1305\nU 7471 ; WX 463 ; N uni1D2F ; G 1306\nU 7472 ; WX 505 ; N uni1D30 ; G 1307\nU 7473 ; WX 459 ; N uni1D31 ; G 1308\nU 7474 ; WX 459 ; N uni1D32 ; G 1309\nU 7475 ; WX 503 ; N uni1D33 ; G 1310\nU 7476 ; WX 549 ; N uni1D34 ; G 1311\nU 7477 ; WX 249 ; N uni1D35 ; G 1312\nU 7478 ; WX 252 ; N uni1D36 ; G 1313\nU 7479 ; WX 470 ; N uni1D37 ; G 1314\nU 7480 ; WX 418 ; N uni1D38 ; G 1315\nU 7481 ; WX 645 ; N uni1D39 ; G 1316\nU 7482 ; WX 551 ; N uni1D3A ; G 1317\nU 7483 ; WX 551 ; N uni1D3B ; G 1318\nU 7484 ; WX 516 ; N uni1D3C ; G 1319\nU 7485 ; WX 369 ; N uni1D3D ; G 1320\nU 7486 ; WX 424 ; N uni1D3E ; G 1321\nU 7487 ; WX 474 ; N uni1D3F ; G 1322\nU 7488 ; WX 420 ; N uni1D40 ; G 1323\nU 7489 ; WX 531 ; N uni1D41 ; G 1324\nU 7490 ; WX 647 ; N uni1D42 ; G 1325\nU 7491 ; WX 386 ; N uni1D43 ; G 1326\nU 7492 ; WX 386 ; N uni1D44 ; G 1327\nU 7493 ; WX 400 ; N uni1D45 ; G 1328\nU 7494 ; WX 618 ; N uni1D46 ; G 1329\nU 7495 ; WX 400 ; N uni1D47 ; G 1330\nU 7496 ; WX 400 ; N uni1D48 ; G 1331\nU 7497 ; WX 387 ; N uni1D49 ; G 1332\nU 7498 ; WX 387 ; N uni1D4A ; G 1333\nU 7499 ; WX 340 ; N uni1D4B ; G 1334\nU 7500 ; WX 340 ; N uni1D4C ; G 1335\nU 7501 ; WX 400 ; N uni1D4D ; G 1336\nU 7502 ; WX 175 ; N uni1D4E ; G 1337\nU 7503 ; WX 365 ; N uni1D4F ; G 1338\nU 7504 ; WX 613 ; N uni1D50 ; G 1339\nU 7505 ; WX 399 ; N uni1D51 ; G 1340\nU 7506 ; WX 385 ; N uni1D52 ; G 1341\nU 7507 ; WX 346 ; N uni1D53 ; G 1342\nU 7508 ; WX 385 ; N uni1D54 ; G 1343\nU 7509 ; WX 385 ; N uni1D55 ; G 1344\nU 7510 ; WX 400 ; N uni1D56 ; G 1345\nU 7511 ; WX 247 ; N uni1D57 ; G 1346\nU 7512 ; WX 399 ; N uni1D58 ; G 1347\nU 7513 ; WX 418 ; N uni1D59 ; G 1348\nU 7514 ; WX 613 ; N uni1D5A ; G 1349\nU 7515 ; WX 373 ; N uni1D5B ; G 1350\nU 7516 ; WX 468 ; N uni1D5C ; G 1351\nU 7517 ; WX 364 ; N uni1D5D ; G 1352\nU 7518 ; WX 376 ; N uni1D5E ; G 1353\nU 7519 ; WX 379 ; N uni1D5F ; G 1354\nU 7520 ; WX 441 ; N uni1D60 ; G 1355\nU 7521 ; WX 381 ; N uni1D61 ; G 1356\nU 7522 ; WX 201 ; N uni1D62 ; G 1357\nU 7523 ; WX 347 ; N uni1D63 ; G 1358\nU 7524 ; WX 399 ; N uni1D64 ; G 1359\nU 7525 ; WX 373 ; N uni1D65 ; G 1360\nU 7526 ; WX 364 ; N uni1D66 ; G 1361\nU 7527 ; WX 376 ; N uni1D67 ; G 1362\nU 7528 ; WX 370 ; N uni1D68 ; G 1363\nU 7529 ; WX 441 ; N uni1D69 ; G 1364\nU 7530 ; WX 381 ; N uni1D6A ; G 1365\nU 7531 ; WX 974 ; N uni1D6B ; G 1366\nU 7543 ; WX 640 ; N uni1D77 ; G 1367\nU 7544 ; WX 549 ; N uni1D78 ; G 1368\nU 7547 ; WX 320 ; N uni1D7B ; G 1369\nU 7548 ; WX 392 ; N uni1D7C ; G 1370\nU 7549 ; WX 640 ; N uni1D7D ; G 1371\nU 7550 ; WX 585 ; N uni1D7E ; G 1372\nU 7551 ; WX 620 ; N uni1D7F ; G 1373\nU 7557 ; WX 320 ; N uni1D85 ; G 1374\nU 7579 ; WX 400 ; N uni1D9B ; G 1375\nU 7580 ; WX 346 ; N uni1D9C ; G 1376\nU 7581 ; WX 346 ; N uni1D9D ; G 1377\nU 7582 ; WX 385 ; N uni1D9E ; G 1378\nU 7583 ; WX 340 ; N uni1D9F ; G 1379\nU 7584 ; WX 222 ; N uni1DA0 ; G 1380\nU 7585 ; WX 229 ; N uni1DA1 ; G 1381\nU 7586 ; WX 400 ; N uni1DA2 ; G 1382\nU 7587 ; WX 399 ; N uni1DA3 ; G 1383\nU 7588 ; WX 234 ; N uni1DA4 ; G 1384\nU 7589 ; WX 244 ; N uni1DA5 ; G 1385\nU 7590 ; WX 234 ; N uni1DA6 ; G 1386\nU 7591 ; WX 234 ; N uni1DA7 ; G 1387\nU 7592 ; WX 230 ; N uni1DA8 ; G 1388\nU 7593 ; WX 175 ; N uni1DA9 ; G 1389\nU 7594 ; WX 175 ; N uni1DAA ; G 1390\nU 7595 ; WX 367 ; N uni1DAB ; G 1391\nU 7596 ; WX 613 ; N uni1DAC ; G 1392\nU 7597 ; WX 613 ; N uni1DAD ; G 1393\nU 7598 ; WX 407 ; N uni1DAE ; G 1394\nU 7599 ; WX 404 ; N uni1DAF ; G 1395\nU 7600 ; WX 399 ; N uni1DB0 ; G 1396\nU 7601 ; WX 385 ; N uni1DB1 ; G 1397\nU 7602 ; WX 385 ; N uni1DB2 ; G 1398\nU 7603 ; WX 328 ; N uni1DB3 ; G 1399\nU 7604 ; WX 211 ; N uni1DB4 ; G 1400\nU 7605 ; WX 247 ; N uni1DB5 ; G 1401\nU 7606 ; WX 399 ; N uni1DB6 ; G 1402\nU 7607 ; WX 389 ; N uni1DB7 ; G 1403\nU 7608 ; WX 368 ; N uni1DB8 ; G 1404\nU 7609 ; WX 376 ; N uni1DB9 ; G 1405\nU 7610 ; WX 373 ; N uni1DBA ; G 1406\nU 7611 ; WX 331 ; N uni1DBB ; G 1407\nU 7612 ; WX 331 ; N uni1DBC ; G 1408\nU 7613 ; WX 331 ; N uni1DBD ; G 1409\nU 7614 ; WX 364 ; N uni1DBE ; G 1410\nU 7615 ; WX 385 ; N uni1DBF ; G 1411\nU 7620 ; WX 0 ; N uni1DC4 ; G 1412\nU 7621 ; WX 0 ; N uni1DC5 ; G 1413\nU 7622 ; WX 0 ; N uni1DC6 ; G 1414\nU 7623 ; WX 0 ; N uni1DC7 ; G 1415\nU 7624 ; WX 0 ; N uni1DC8 ; G 1416\nU 7625 ; WX 0 ; N uni1DC9 ; G 1417\nU 7680 ; WX 722 ; N uni1E00 ; G 1418\nU 7681 ; WX 596 ; N uni1E01 ; G 1419\nU 7682 ; WX 735 ; N uni1E02 ; G 1420\nU 7683 ; WX 640 ; N uni1E03 ; G 1421\nU 7684 ; WX 735 ; N uni1E04 ; G 1422\nU 7685 ; WX 640 ; N uni1E05 ; G 1423\nU 7686 ; WX 735 ; N uni1E06 ; G 1424\nU 7687 ; WX 640 ; N uni1E07 ; G 1425\nU 7688 ; WX 765 ; N uni1E08 ; G 1426\nU 7689 ; WX 560 ; N uni1E09 ; G 1427\nU 7690 ; WX 802 ; N uni1E0A ; G 1428\nU 7691 ; WX 640 ; N uni1E0B ; G 1429\nU 7692 ; WX 802 ; N uni1E0C ; G 1430\nU 7693 ; WX 640 ; N uni1E0D ; G 1431\nU 7694 ; WX 802 ; N uni1E0E ; G 1432\nU 7695 ; WX 640 ; N uni1E0F ; G 1433\nU 7696 ; WX 802 ; N uni1E10 ; G 1434\nU 7697 ; WX 640 ; N uni1E11 ; G 1435\nU 7698 ; WX 802 ; N uni1E12 ; G 1436\nU 7699 ; WX 640 ; N uni1E13 ; G 1437\nU 7700 ; WX 730 ; N uni1E14 ; G 1438\nU 7701 ; WX 592 ; N uni1E15 ; G 1439\nU 7702 ; WX 730 ; N uni1E16 ; G 1440\nU 7703 ; WX 592 ; N uni1E17 ; G 1441\nU 7704 ; WX 730 ; N uni1E18 ; G 1442\nU 7705 ; WX 592 ; N uni1E19 ; G 1443\nU 7706 ; WX 730 ; N uni1E1A ; G 1444\nU 7707 ; WX 592 ; N uni1E1B ; G 1445\nU 7708 ; WX 730 ; N uni1E1C ; G 1446\nU 7709 ; WX 592 ; N uni1E1D ; G 1447\nU 7710 ; WX 694 ; N uni1E1E ; G 1448\nU 7711 ; WX 370 ; N uni1E1F ; G 1449\nU 7712 ; WX 799 ; N uni1E20 ; G 1450\nU 7713 ; WX 640 ; N uni1E21 ; G 1451\nU 7714 ; WX 872 ; N uni1E22 ; G 1452\nU 7715 ; WX 644 ; N uni1E23 ; G 1453\nU 7716 ; WX 872 ; N uni1E24 ; G 1454\nU 7717 ; WX 644 ; N uni1E25 ; G 1455\nU 7718 ; WX 872 ; N uni1E26 ; G 1456\nU 7719 ; WX 644 ; N uni1E27 ; G 1457\nU 7720 ; WX 872 ; N uni1E28 ; G 1458\nU 7721 ; WX 644 ; N uni1E29 ; G 1459\nU 7722 ; WX 872 ; N uni1E2A ; G 1460\nU 7723 ; WX 644 ; N uni1E2B ; G 1461\nU 7724 ; WX 395 ; N uni1E2C ; G 1462\nU 7725 ; WX 320 ; N uni1E2D ; G 1463\nU 7726 ; WX 395 ; N uni1E2E ; G 1464\nU 7727 ; WX 320 ; N uni1E2F ; G 1465\nU 7728 ; WX 747 ; N uni1E30 ; G 1466\nU 7729 ; WX 606 ; N uni1E31 ; G 1467\nU 7730 ; WX 747 ; N uni1E32 ; G 1468\nU 7731 ; WX 606 ; N uni1E33 ; G 1469\nU 7732 ; WX 747 ; N uni1E34 ; G 1470\nU 7733 ; WX 606 ; N uni1E35 ; G 1471\nU 7734 ; WX 664 ; N uni1E36 ; G 1472\nU 7735 ; WX 320 ; N uni1E37 ; G 1473\nU 7736 ; WX 664 ; N uni1E38 ; G 1474\nU 7737 ; WX 320 ; N uni1E39 ; G 1475\nU 7738 ; WX 664 ; N uni1E3A ; G 1476\nU 7739 ; WX 320 ; N uni1E3B ; G 1477\nU 7740 ; WX 664 ; N uni1E3C ; G 1478\nU 7741 ; WX 320 ; N uni1E3D ; G 1479\nU 7742 ; WX 1024 ; N uni1E3E ; G 1480\nU 7743 ; WX 948 ; N uni1E3F ; G 1481\nU 7744 ; WX 1024 ; N uni1E40 ; G 1482\nU 7745 ; WX 948 ; N uni1E41 ; G 1483\nU 7746 ; WX 1024 ; N uni1E42 ; G 1484\nU 7747 ; WX 948 ; N uni1E43 ; G 1485\nU 7748 ; WX 875 ; N uni1E44 ; G 1486\nU 7749 ; WX 644 ; N uni1E45 ; G 1487\nU 7750 ; WX 875 ; N uni1E46 ; G 1488\nU 7751 ; WX 644 ; N uni1E47 ; G 1489\nU 7752 ; WX 875 ; N uni1E48 ; G 1490\nU 7753 ; WX 644 ; N uni1E49 ; G 1491\nU 7754 ; WX 875 ; N uni1E4A ; G 1492\nU 7755 ; WX 644 ; N uni1E4B ; G 1493\nU 7756 ; WX 820 ; N uni1E4C ; G 1494\nU 7757 ; WX 602 ; N uni1E4D ; G 1495\nU 7758 ; WX 820 ; N uni1E4E ; G 1496\nU 7759 ; WX 602 ; N uni1E4F ; G 1497\nU 7760 ; WX 820 ; N uni1E50 ; G 1498\nU 7761 ; WX 602 ; N uni1E51 ; G 1499\nU 7762 ; WX 820 ; N uni1E52 ; G 1500\nU 7763 ; WX 602 ; N uni1E53 ; G 1501\nU 7764 ; WX 673 ; N uni1E54 ; G 1502\nU 7765 ; WX 640 ; N uni1E55 ; G 1503\nU 7766 ; WX 673 ; N uni1E56 ; G 1504\nU 7767 ; WX 640 ; N uni1E57 ; G 1505\nU 7768 ; WX 753 ; N uni1E58 ; G 1506\nU 7769 ; WX 478 ; N uni1E59 ; G 1507\nU 7770 ; WX 753 ; N uni1E5A ; G 1508\nU 7771 ; WX 478 ; N uni1E5B ; G 1509\nU 7772 ; WX 753 ; N uni1E5C ; G 1510\nU 7773 ; WX 478 ; N uni1E5D ; G 1511\nU 7774 ; WX 753 ; N uni1E5E ; G 1512\nU 7775 ; WX 478 ; N uni1E5F ; G 1513\nU 7776 ; WX 685 ; N uni1E60 ; G 1514\nU 7777 ; WX 513 ; N uni1E61 ; G 1515\nU 7778 ; WX 685 ; N uni1E62 ; G 1516\nU 7779 ; WX 513 ; N uni1E63 ; G 1517\nU 7780 ; WX 685 ; N uni1E64 ; G 1518\nU 7781 ; WX 513 ; N uni1E65 ; G 1519\nU 7782 ; WX 685 ; N uni1E66 ; G 1520\nU 7783 ; WX 521 ; N uni1E67 ; G 1521\nU 7784 ; WX 685 ; N uni1E68 ; G 1522\nU 7785 ; WX 513 ; N uni1E69 ; G 1523\nU 7786 ; WX 667 ; N uni1E6A ; G 1524\nU 7787 ; WX 402 ; N uni1E6B ; G 1525\nU 7788 ; WX 667 ; N uni1E6C ; G 1526\nU 7789 ; WX 402 ; N uni1E6D ; G 1527\nU 7790 ; WX 667 ; N uni1E6E ; G 1528\nU 7791 ; WX 402 ; N uni1E6F ; G 1529\nU 7792 ; WX 667 ; N uni1E70 ; G 1530\nU 7793 ; WX 402 ; N uni1E71 ; G 1531\nU 7794 ; WX 843 ; N uni1E72 ; G 1532\nU 7795 ; WX 644 ; N uni1E73 ; G 1533\nU 7796 ; WX 843 ; N uni1E74 ; G 1534\nU 7797 ; WX 644 ; N uni1E75 ; G 1535\nU 7798 ; WX 843 ; N uni1E76 ; G 1536\nU 7799 ; WX 644 ; N uni1E77 ; G 1537\nU 7800 ; WX 843 ; N uni1E78 ; G 1538\nU 7801 ; WX 644 ; N uni1E79 ; G 1539\nU 7802 ; WX 843 ; N uni1E7A ; G 1540\nU 7803 ; WX 644 ; N uni1E7B ; G 1541\nU 7804 ; WX 722 ; N uni1E7C ; G 1542\nU 7805 ; WX 565 ; N uni1E7D ; G 1543\nU 7806 ; WX 722 ; N uni1E7E ; G 1544\nU 7807 ; WX 565 ; N uni1E7F ; G 1545\nU 7808 ; WX 1028 ; N Wgrave ; G 1546\nU 7809 ; WX 856 ; N wgrave ; G 1547\nU 7810 ; WX 1028 ; N Wacute ; G 1548\nU 7811 ; WX 856 ; N wacute ; G 1549\nU 7812 ; WX 1028 ; N Wdieresis ; G 1550\nU 7813 ; WX 856 ; N wdieresis ; G 1551\nU 7814 ; WX 1028 ; N uni1E86 ; G 1552\nU 7815 ; WX 856 ; N uni1E87 ; G 1553\nU 7816 ; WX 1028 ; N uni1E88 ; G 1554\nU 7817 ; WX 856 ; N uni1E89 ; G 1555\nU 7818 ; WX 712 ; N uni1E8A ; G 1556\nU 7819 ; WX 564 ; N uni1E8B ; G 1557\nU 7820 ; WX 712 ; N uni1E8C ; G 1558\nU 7821 ; WX 564 ; N uni1E8D ; G 1559\nU 7822 ; WX 660 ; N uni1E8E ; G 1560\nU 7823 ; WX 565 ; N uni1E8F ; G 1561\nU 7824 ; WX 695 ; N uni1E90 ; G 1562\nU 7825 ; WX 527 ; N uni1E91 ; G 1563\nU 7826 ; WX 695 ; N uni1E92 ; G 1564\nU 7827 ; WX 527 ; N uni1E93 ; G 1565\nU 7828 ; WX 695 ; N uni1E94 ; G 1566\nU 7829 ; WX 527 ; N uni1E95 ; G 1567\nU 7830 ; WX 644 ; N uni1E96 ; G 1568\nU 7831 ; WX 402 ; N uni1E97 ; G 1569\nU 7832 ; WX 856 ; N uni1E98 ; G 1570\nU 7833 ; WX 565 ; N uni1E99 ; G 1571\nU 7834 ; WX 903 ; N uni1E9A ; G 1572\nU 7835 ; WX 370 ; N uni1E9B ; G 1573\nU 7836 ; WX 370 ; N uni1E9C ; G 1574\nU 7837 ; WX 370 ; N uni1E9D ; G 1575\nU 7838 ; WX 829 ; N uni1E9E ; G 1576\nU 7839 ; WX 602 ; N uni1E9F ; G 1577\nU 7840 ; WX 722 ; N uni1EA0 ; G 1578\nU 7841 ; WX 596 ; N uni1EA1 ; G 1579\nU 7842 ; WX 722 ; N uni1EA2 ; G 1580\nU 7843 ; WX 596 ; N uni1EA3 ; G 1581\nU 7844 ; WX 722 ; N uni1EA4 ; G 1582\nU 7845 ; WX 613 ; N uni1EA5 ; G 1583\nU 7846 ; WX 722 ; N uni1EA6 ; G 1584\nU 7847 ; WX 613 ; N uni1EA7 ; G 1585\nU 7848 ; WX 722 ; N uni1EA8 ; G 1586\nU 7849 ; WX 613 ; N uni1EA9 ; G 1587\nU 7850 ; WX 722 ; N uni1EAA ; G 1588\nU 7851 ; WX 613 ; N uni1EAB ; G 1589\nU 7852 ; WX 722 ; N uni1EAC ; G 1590\nU 7853 ; WX 596 ; N uni1EAD ; G 1591\nU 7854 ; WX 722 ; N uni1EAE ; G 1592\nU 7855 ; WX 596 ; N uni1EAF ; G 1593\nU 7856 ; WX 722 ; N uni1EB0 ; G 1594\nU 7857 ; WX 596 ; N uni1EB1 ; G 1595\nU 7858 ; WX 722 ; N uni1EB2 ; G 1596\nU 7859 ; WX 596 ; N uni1EB3 ; G 1597\nU 7860 ; WX 722 ; N uni1EB4 ; G 1598\nU 7861 ; WX 596 ; N uni1EB5 ; G 1599\nU 7862 ; WX 722 ; N uni1EB6 ; G 1600\nU 7863 ; WX 596 ; N uni1EB7 ; G 1601\nU 7864 ; WX 730 ; N uni1EB8 ; G 1602\nU 7865 ; WX 592 ; N uni1EB9 ; G 1603\nU 7866 ; WX 730 ; N uni1EBA ; G 1604\nU 7867 ; WX 592 ; N uni1EBB ; G 1605\nU 7868 ; WX 730 ; N uni1EBC ; G 1606\nU 7869 ; WX 592 ; N uni1EBD ; G 1607\nU 7870 ; WX 730 ; N uni1ebe ; G 1608\nU 7871 ; WX 615 ; N uni1ebF ; G 1609\nU 7872 ; WX 730 ; N uni1EC0 ; G 1610\nU 7873 ; WX 615 ; N uni1EC1 ; G 1611\nU 7874 ; WX 730 ; N uni1EC2 ; G 1612\nU 7875 ; WX 615 ; N uni1EC3 ; G 1613\nU 7876 ; WX 730 ; N uni1EC4 ; G 1614\nU 7877 ; WX 615 ; N uni1EC5 ; G 1615\nU 7878 ; WX 730 ; N uni1EC6 ; G 1616\nU 7879 ; WX 592 ; N uni1EC7 ; G 1617\nU 7880 ; WX 395 ; N uni1EC8 ; G 1618\nU 7881 ; WX 320 ; N uni1EC9 ; G 1619\nU 7882 ; WX 395 ; N uni1ECA ; G 1620\nU 7883 ; WX 320 ; N uni1ECB ; G 1621\nU 7884 ; WX 820 ; N uni1ECC ; G 1622\nU 7885 ; WX 602 ; N uni1ECD ; G 1623\nU 7886 ; WX 820 ; N uni1ECE ; G 1624\nU 7887 ; WX 602 ; N uni1ECF ; G 1625\nU 7888 ; WX 820 ; N uni1ED0 ; G 1626\nU 7889 ; WX 612 ; N uni1ED1 ; G 1627\nU 7890 ; WX 820 ; N uni1ED2 ; G 1628\nU 7891 ; WX 612 ; N uni1ED3 ; G 1629\nU 7892 ; WX 820 ; N uni1ED4 ; G 1630\nU 7893 ; WX 612 ; N uni1ED5 ; G 1631\nU 7894 ; WX 820 ; N uni1ED6 ; G 1632\nU 7895 ; WX 612 ; N uni1ED7 ; G 1633\nU 7896 ; WX 820 ; N uni1ED8 ; G 1634\nU 7897 ; WX 602 ; N uni1ED9 ; G 1635\nU 7898 ; WX 820 ; N uni1EDA ; G 1636\nU 7899 ; WX 602 ; N uni1EDB ; G 1637\nU 7900 ; WX 820 ; N uni1EDC ; G 1638\nU 7901 ; WX 602 ; N uni1EDD ; G 1639\nU 7902 ; WX 820 ; N uni1EDE ; G 1640\nU 7903 ; WX 602 ; N uni1EDF ; G 1641\nU 7904 ; WX 820 ; N uni1EE0 ; G 1642\nU 7905 ; WX 602 ; N uni1EE1 ; G 1643\nU 7906 ; WX 820 ; N uni1EE2 ; G 1644\nU 7907 ; WX 602 ; N uni1EE3 ; G 1645\nU 7908 ; WX 843 ; N uni1EE4 ; G 1646\nU 7909 ; WX 644 ; N uni1EE5 ; G 1647\nU 7910 ; WX 843 ; N uni1EE6 ; G 1648\nU 7911 ; WX 644 ; N uni1EE7 ; G 1649\nU 7912 ; WX 843 ; N uni1EE8 ; G 1650\nU 7913 ; WX 644 ; N uni1EE9 ; G 1651\nU 7914 ; WX 843 ; N uni1EEA ; G 1652\nU 7915 ; WX 644 ; N uni1EEB ; G 1653\nU 7916 ; WX 843 ; N uni1EEC ; G 1654\nU 7917 ; WX 644 ; N uni1EED ; G 1655\nU 7918 ; WX 843 ; N uni1EEE ; G 1656\nU 7919 ; WX 644 ; N uni1EEF ; G 1657\nU 7920 ; WX 843 ; N uni1EF0 ; G 1658\nU 7921 ; WX 644 ; N uni1EF1 ; G 1659\nU 7922 ; WX 660 ; N Ygrave ; G 1660\nU 7923 ; WX 565 ; N ygrave ; G 1661\nU 7924 ; WX 660 ; N uni1EF4 ; G 1662\nU 7925 ; WX 565 ; N uni1EF5 ; G 1663\nU 7926 ; WX 660 ; N uni1EF6 ; G 1664\nU 7927 ; WX 565 ; N uni1EF7 ; G 1665\nU 7928 ; WX 660 ; N uni1EF8 ; G 1666\nU 7929 ; WX 565 ; N uni1EF9 ; G 1667\nU 7930 ; WX 949 ; N uni1EFA ; G 1668\nU 7931 ; WX 581 ; N uni1EFB ; G 1669\nU 7936 ; WX 675 ; N uni1F00 ; G 1670\nU 7937 ; WX 675 ; N uni1F01 ; G 1671\nU 7938 ; WX 675 ; N uni1F02 ; G 1672\nU 7939 ; WX 675 ; N uni1F03 ; G 1673\nU 7940 ; WX 675 ; N uni1F04 ; G 1674\nU 7941 ; WX 675 ; N uni1F05 ; G 1675\nU 7942 ; WX 675 ; N uni1F06 ; G 1676\nU 7943 ; WX 675 ; N uni1F07 ; G 1677\nU 7944 ; WX 722 ; N uni1F08 ; G 1678\nU 7945 ; WX 722 ; N uni1F09 ; G 1679\nU 7946 ; WX 869 ; N uni1F0A ; G 1680\nU 7947 ; WX 869 ; N uni1F0B ; G 1681\nU 7948 ; WX 734 ; N uni1F0C ; G 1682\nU 7949 ; WX 763 ; N uni1F0D ; G 1683\nU 7950 ; WX 722 ; N uni1F0E ; G 1684\nU 7951 ; WX 722 ; N uni1F0F ; G 1685\nU 7952 ; WX 537 ; N uni1F10 ; G 1686\nU 7953 ; WX 537 ; N uni1F11 ; G 1687\nU 7954 ; WX 537 ; N uni1F12 ; G 1688\nU 7955 ; WX 537 ; N uni1F13 ; G 1689\nU 7956 ; WX 537 ; N uni1F14 ; G 1690\nU 7957 ; WX 537 ; N uni1F15 ; G 1691\nU 7960 ; WX 853 ; N uni1F18 ; G 1692\nU 7961 ; WX 841 ; N uni1F19 ; G 1693\nU 7962 ; WX 1067 ; N uni1F1A ; G 1694\nU 7963 ; WX 1077 ; N uni1F1B ; G 1695\nU 7964 ; WX 1008 ; N uni1F1C ; G 1696\nU 7965 ; WX 1035 ; N uni1F1D ; G 1697\nU 7968 ; WX 599 ; N uni1F20 ; G 1698\nU 7969 ; WX 599 ; N uni1F21 ; G 1699\nU 7970 ; WX 599 ; N uni1F22 ; G 1700\nU 7971 ; WX 599 ; N uni1F23 ; G 1701\nU 7972 ; WX 599 ; N uni1F24 ; G 1702\nU 7973 ; WX 599 ; N uni1F25 ; G 1703\nU 7974 ; WX 599 ; N uni1F26 ; G 1704\nU 7975 ; WX 599 ; N uni1F27 ; G 1705\nU 7976 ; WX 998 ; N uni1F28 ; G 1706\nU 7977 ; WX 992 ; N uni1F29 ; G 1707\nU 7978 ; WX 1212 ; N uni1F2A ; G 1708\nU 7979 ; WX 1224 ; N uni1F2B ; G 1709\nU 7980 ; WX 1159 ; N uni1F2C ; G 1710\nU 7981 ; WX 1183 ; N uni1F2D ; G 1711\nU 7982 ; WX 1098 ; N uni1F2E ; G 1712\nU 7983 ; WX 1095 ; N uni1F2F ; G 1713\nU 7984 ; WX 392 ; N uni1F30 ; G 1714\nU 7985 ; WX 392 ; N uni1F31 ; G 1715\nU 7986 ; WX 392 ; N uni1F32 ; G 1716\nU 7987 ; WX 392 ; N uni1F33 ; G 1717\nU 7988 ; WX 392 ; N uni1F34 ; G 1718\nU 7989 ; WX 392 ; N uni1F35 ; G 1719\nU 7990 ; WX 392 ; N uni1F36 ; G 1720\nU 7991 ; WX 392 ; N uni1F37 ; G 1721\nU 7992 ; WX 521 ; N uni1F38 ; G 1722\nU 7993 ; WX 512 ; N uni1F39 ; G 1723\nU 7994 ; WX 735 ; N uni1F3A ; G 1724\nU 7995 ; WX 738 ; N uni1F3B ; G 1725\nU 7996 ; WX 679 ; N uni1F3C ; G 1726\nU 7997 ; WX 706 ; N uni1F3D ; G 1727\nU 7998 ; WX 624 ; N uni1F3E ; G 1728\nU 7999 ; WX 615 ; N uni1F3F ; G 1729\nU 8000 ; WX 602 ; N uni1F40 ; G 1730\nU 8001 ; WX 602 ; N uni1F41 ; G 1731\nU 8002 ; WX 602 ; N uni1F42 ; G 1732\nU 8003 ; WX 602 ; N uni1F43 ; G 1733\nU 8004 ; WX 602 ; N uni1F44 ; G 1734\nU 8005 ; WX 602 ; N uni1F45 ; G 1735\nU 8008 ; WX 820 ; N uni1F48 ; G 1736\nU 8009 ; WX 859 ; N uni1F49 ; G 1737\nU 8010 ; WX 1120 ; N uni1F4A ; G 1738\nU 8011 ; WX 1127 ; N uni1F4B ; G 1739\nU 8012 ; WX 937 ; N uni1F4C ; G 1740\nU 8013 ; WX 964 ; N uni1F4D ; G 1741\nU 8016 ; WX 608 ; N uni1F50 ; G 1742\nU 8017 ; WX 608 ; N uni1F51 ; G 1743\nU 8018 ; WX 608 ; N uni1F52 ; G 1744\nU 8019 ; WX 608 ; N uni1F53 ; G 1745\nU 8020 ; WX 608 ; N uni1F54 ; G 1746\nU 8021 ; WX 608 ; N uni1F55 ; G 1747\nU 8022 ; WX 608 ; N uni1F56 ; G 1748\nU 8023 ; WX 608 ; N uni1F57 ; G 1749\nU 8025 ; WX 851 ; N uni1F59 ; G 1750\nU 8027 ; WX 1079 ; N uni1F5B ; G 1751\nU 8029 ; WX 1044 ; N uni1F5D ; G 1752\nU 8031 ; WX 953 ; N uni1F5F ; G 1753\nU 8032 ; WX 815 ; N uni1F60 ; G 1754\nU 8033 ; WX 815 ; N uni1F61 ; G 1755\nU 8034 ; WX 815 ; N uni1F62 ; G 1756\nU 8035 ; WX 815 ; N uni1F63 ; G 1757\nU 8036 ; WX 815 ; N uni1F64 ; G 1758\nU 8037 ; WX 815 ; N uni1F65 ; G 1759\nU 8038 ; WX 815 ; N uni1F66 ; G 1760\nU 8039 ; WX 815 ; N uni1F67 ; G 1761\nU 8040 ; WX 829 ; N uni1F68 ; G 1762\nU 8041 ; WX 870 ; N uni1F69 ; G 1763\nU 8042 ; WX 1131 ; N uni1F6A ; G 1764\nU 8043 ; WX 1137 ; N uni1F6B ; G 1765\nU 8044 ; WX 946 ; N uni1F6C ; G 1766\nU 8045 ; WX 976 ; N uni1F6D ; G 1767\nU 8046 ; WX 938 ; N uni1F6E ; G 1768\nU 8047 ; WX 970 ; N uni1F6F ; G 1769\nU 8048 ; WX 675 ; N uni1F70 ; G 1770\nU 8049 ; WX 675 ; N uni1F71 ; G 1771\nU 8050 ; WX 537 ; N uni1F72 ; G 1772\nU 8051 ; WX 537 ; N uni1F73 ; G 1773\nU 8052 ; WX 599 ; N uni1F74 ; G 1774\nU 8053 ; WX 599 ; N uni1F75 ; G 1775\nU 8054 ; WX 392 ; N uni1F76 ; G 1776\nU 8055 ; WX 392 ; N uni1F77 ; G 1777\nU 8056 ; WX 602 ; N uni1F78 ; G 1778\nU 8057 ; WX 602 ; N uni1F79 ; G 1779\nU 8058 ; WX 608 ; N uni1F7A ; G 1780\nU 8059 ; WX 608 ; N uni1F7B ; G 1781\nU 8060 ; WX 815 ; N uni1F7C ; G 1782\nU 8061 ; WX 815 ; N uni1F7D ; G 1783\nU 8064 ; WX 675 ; N uni1F80 ; G 1784\nU 8065 ; WX 675 ; N uni1F81 ; G 1785\nU 8066 ; WX 675 ; N uni1F82 ; G 1786\nU 8067 ; WX 675 ; N uni1F83 ; G 1787\nU 8068 ; WX 675 ; N uni1F84 ; G 1788\nU 8069 ; WX 675 ; N uni1F85 ; G 1789\nU 8070 ; WX 675 ; N uni1F86 ; G 1790\nU 8071 ; WX 675 ; N uni1F87 ; G 1791\nU 8072 ; WX 722 ; N uni1F88 ; G 1792\nU 8073 ; WX 722 ; N uni1F89 ; G 1793\nU 8074 ; WX 869 ; N uni1F8A ; G 1794\nU 8075 ; WX 869 ; N uni1F8B ; G 1795\nU 8076 ; WX 734 ; N uni1F8C ; G 1796\nU 8077 ; WX 763 ; N uni1F8D ; G 1797\nU 8078 ; WX 722 ; N uni1F8E ; G 1798\nU 8079 ; WX 722 ; N uni1F8F ; G 1799\nU 8080 ; WX 599 ; N uni1F90 ; G 1800\nU 8081 ; WX 599 ; N uni1F91 ; G 1801\nU 8082 ; WX 599 ; N uni1F92 ; G 1802\nU 8083 ; WX 599 ; N uni1F93 ; G 1803\nU 8084 ; WX 599 ; N uni1F94 ; G 1804\nU 8085 ; WX 599 ; N uni1F95 ; G 1805\nU 8086 ; WX 599 ; N uni1F96 ; G 1806\nU 8087 ; WX 599 ; N uni1F97 ; G 1807\nU 8088 ; WX 998 ; N uni1F98 ; G 1808\nU 8089 ; WX 992 ; N uni1F99 ; G 1809\nU 8090 ; WX 1212 ; N uni1F9A ; G 1810\nU 8091 ; WX 1224 ; N uni1F9B ; G 1811\nU 8092 ; WX 1159 ; N uni1F9C ; G 1812\nU 8093 ; WX 1183 ; N uni1F9D ; G 1813\nU 8094 ; WX 1098 ; N uni1F9E ; G 1814\nU 8095 ; WX 1095 ; N uni1F9F ; G 1815\nU 8096 ; WX 815 ; N uni1FA0 ; G 1816\nU 8097 ; WX 815 ; N uni1FA1 ; G 1817\nU 8098 ; WX 815 ; N uni1FA2 ; G 1818\nU 8099 ; WX 815 ; N uni1FA3 ; G 1819\nU 8100 ; WX 815 ; N uni1FA4 ; G 1820\nU 8101 ; WX 815 ; N uni1FA5 ; G 1821\nU 8102 ; WX 815 ; N uni1FA6 ; G 1822\nU 8103 ; WX 815 ; N uni1FA7 ; G 1823\nU 8104 ; WX 829 ; N uni1FA8 ; G 1824\nU 8105 ; WX 870 ; N uni1FA9 ; G 1825\nU 8106 ; WX 1131 ; N uni1FAA ; G 1826\nU 8107 ; WX 1137 ; N uni1FAB ; G 1827\nU 8108 ; WX 946 ; N uni1FAC ; G 1828\nU 8109 ; WX 976 ; N uni1FAD ; G 1829\nU 8110 ; WX 938 ; N uni1FAE ; G 1830\nU 8111 ; WX 970 ; N uni1FAF ; G 1831\nU 8112 ; WX 675 ; N uni1FB0 ; G 1832\nU 8113 ; WX 675 ; N uni1FB1 ; G 1833\nU 8114 ; WX 675 ; N uni1FB2 ; G 1834\nU 8115 ; WX 675 ; N uni1FB3 ; G 1835\nU 8116 ; WX 675 ; N uni1FB4 ; G 1836\nU 8118 ; WX 675 ; N uni1FB6 ; G 1837\nU 8119 ; WX 675 ; N uni1FB7 ; G 1838\nU 8120 ; WX 722 ; N uni1FB8 ; G 1839\nU 8121 ; WX 722 ; N uni1FB9 ; G 1840\nU 8122 ; WX 722 ; N uni1FBA ; G 1841\nU 8123 ; WX 722 ; N uni1FBB ; G 1842\nU 8124 ; WX 722 ; N uni1FBC ; G 1843\nU 8125 ; WX 500 ; N uni1FBD ; G 1844\nU 8126 ; WX 500 ; N uni1FBE ; G 1845\nU 8127 ; WX 500 ; N uni1FBF ; G 1846\nU 8128 ; WX 500 ; N uni1FC0 ; G 1847\nU 8129 ; WX 500 ; N uni1FC1 ; G 1848\nU 8130 ; WX 599 ; N uni1FC2 ; G 1849\nU 8131 ; WX 599 ; N uni1FC3 ; G 1850\nU 8132 ; WX 599 ; N uni1FC4 ; G 1851\nU 8134 ; WX 599 ; N uni1FC6 ; G 1852\nU 8135 ; WX 599 ; N uni1FC7 ; G 1853\nU 8136 ; WX 912 ; N uni1FC8 ; G 1854\nU 8137 ; WX 900 ; N uni1FC9 ; G 1855\nU 8138 ; WX 1063 ; N uni1FCA ; G 1856\nU 8139 ; WX 1039 ; N uni1FCB ; G 1857\nU 8140 ; WX 872 ; N uni1FCC ; G 1858\nU 8141 ; WX 500 ; N uni1FCD ; G 1859\nU 8142 ; WX 500 ; N uni1FCE ; G 1860\nU 8143 ; WX 500 ; N uni1FCF ; G 1861\nU 8144 ; WX 392 ; N uni1FD0 ; G 1862\nU 8145 ; WX 392 ; N uni1FD1 ; G 1863\nU 8146 ; WX 392 ; N uni1FD2 ; G 1864\nU 8147 ; WX 392 ; N uni1FD3 ; G 1865\nU 8150 ; WX 392 ; N uni1FD6 ; G 1866\nU 8151 ; WX 392 ; N uni1FD7 ; G 1867\nU 8152 ; WX 395 ; N uni1FD8 ; G 1868\nU 8153 ; WX 395 ; N uni1FD9 ; G 1869\nU 8154 ; WX 588 ; N uni1FDA ; G 1870\nU 8155 ; WX 562 ; N uni1FDB ; G 1871\nU 8157 ; WX 500 ; N uni1FDD ; G 1872\nU 8158 ; WX 500 ; N uni1FDE ; G 1873\nU 8159 ; WX 500 ; N uni1FDF ; G 1874\nU 8160 ; WX 608 ; N uni1FE0 ; G 1875\nU 8161 ; WX 608 ; N uni1FE1 ; G 1876\nU 8162 ; WX 608 ; N uni1FE2 ; G 1877\nU 8163 ; WX 608 ; N uni1FE3 ; G 1878\nU 8164 ; WX 588 ; N uni1FE4 ; G 1879\nU 8165 ; WX 588 ; N uni1FE5 ; G 1880\nU 8166 ; WX 608 ; N uni1FE6 ; G 1881\nU 8167 ; WX 608 ; N uni1FE7 ; G 1882\nU 8168 ; WX 660 ; N uni1FE8 ; G 1883\nU 8169 ; WX 660 ; N uni1FE9 ; G 1884\nU 8170 ; WX 921 ; N uni1FEA ; G 1885\nU 8171 ; WX 897 ; N uni1FEB ; G 1886\nU 8172 ; WX 790 ; N uni1FEC ; G 1887\nU 8173 ; WX 500 ; N uni1FED ; G 1888\nU 8174 ; WX 500 ; N uni1FEE ; G 1889\nU 8175 ; WX 500 ; N uni1FEF ; G 1890\nU 8178 ; WX 815 ; N uni1FF2 ; G 1891\nU 8179 ; WX 815 ; N uni1FF3 ; G 1892\nU 8180 ; WX 815 ; N uni1FF4 ; G 1893\nU 8182 ; WX 815 ; N uni1FF6 ; G 1894\nU 8183 ; WX 815 ; N uni1FF7 ; G 1895\nU 8184 ; WX 961 ; N uni1FF8 ; G 1896\nU 8185 ; WX 835 ; N uni1FF9 ; G 1897\nU 8186 ; WX 984 ; N uni1FFA ; G 1898\nU 8187 ; WX 853 ; N uni1FFB ; G 1899\nU 8188 ; WX 829 ; N uni1FFC ; G 1900\nU 8189 ; WX 500 ; N uni1FFD ; G 1901\nU 8190 ; WX 500 ; N uni1FFE ; G 1902\nU 8192 ; WX 500 ; N uni2000 ; G 1903\nU 8193 ; WX 1000 ; N uni2001 ; G 1904\nU 8194 ; WX 500 ; N uni2002 ; G 1905\nU 8195 ; WX 1000 ; N uni2003 ; G 1906\nU 8196 ; WX 330 ; N uni2004 ; G 1907\nU 8197 ; WX 250 ; N uni2005 ; G 1908\nU 8198 ; WX 167 ; N uni2006 ; G 1909\nU 8199 ; WX 636 ; N uni2007 ; G 1910\nU 8200 ; WX 318 ; N uni2008 ; G 1911\nU 8201 ; WX 200 ; N uni2009 ; G 1912\nU 8202 ; WX 100 ; N uni200A ; G 1913\nU 8203 ; WX 0 ; N uni200B ; G 1914\nU 8204 ; WX 0 ; N uni200C ; G 1915\nU 8205 ; WX 0 ; N uni200D ; G 1916\nU 8206 ; WX 0 ; N uni200E ; G 1917\nU 8207 ; WX 0 ; N uni200F ; G 1918\nU 8208 ; WX 338 ; N uni2010 ; G 1919\nU 8209 ; WX 338 ; N uni2011 ; G 1920\nU 8210 ; WX 636 ; N figuredash ; G 1921\nU 8211 ; WX 500 ; N endash ; G 1922\nU 8212 ; WX 1000 ; N emdash ; G 1923\nU 8213 ; WX 1000 ; N uni2015 ; G 1924\nU 8214 ; WX 500 ; N uni2016 ; G 1925\nU 8215 ; WX 500 ; N underscoredbl ; G 1926\nU 8216 ; WX 318 ; N quoteleft ; G 1927\nU 8217 ; WX 318 ; N quoteright ; G 1928\nU 8218 ; WX 318 ; N quotesinglbase ; G 1929\nU 8219 ; WX 318 ; N quotereversed ; G 1930\nU 8220 ; WX 511 ; N quotedblleft ; G 1931\nU 8221 ; WX 511 ; N quotedblright ; G 1932\nU 8222 ; WX 518 ; N quotedblbase ; G 1933\nU 8223 ; WX 511 ; N uni201F ; G 1934\nU 8224 ; WX 500 ; N dagger ; G 1935\nU 8225 ; WX 500 ; N daggerdbl ; G 1936\nU 8226 ; WX 590 ; N bullet ; G 1937\nU 8227 ; WX 590 ; N uni2023 ; G 1938\nU 8228 ; WX 334 ; N onedotenleader ; G 1939\nU 8229 ; WX 667 ; N twodotenleader ; G 1940\nU 8230 ; WX 1000 ; N ellipsis ; G 1941\nU 8234 ; WX 0 ; N uni202A ; G 1942\nU 8235 ; WX 0 ; N uni202B ; G 1943\nU 8236 ; WX 0 ; N uni202C ; G 1944\nU 8237 ; WX 0 ; N uni202D ; G 1945\nU 8238 ; WX 0 ; N uni202E ; G 1946\nU 8239 ; WX 200 ; N uni202F ; G 1947\nU 8240 ; WX 1342 ; N perthousand ; G 1948\nU 8241 ; WX 1734 ; N uni2031 ; G 1949\nU 8242 ; WX 227 ; N minute ; G 1950\nU 8243 ; WX 374 ; N second ; G 1951\nU 8244 ; WX 520 ; N uni2034 ; G 1952\nU 8245 ; WX 227 ; N uni2035 ; G 1953\nU 8246 ; WX 374 ; N uni2036 ; G 1954\nU 8247 ; WX 520 ; N uni2037 ; G 1955\nU 8248 ; WX 339 ; N uni2038 ; G 1956\nU 8249 ; WX 400 ; N guilsinglleft ; G 1957\nU 8250 ; WX 400 ; N guilsinglright ; G 1958\nU 8252 ; WX 527 ; N exclamdbl ; G 1959\nU 8253 ; WX 536 ; N uni203D ; G 1960\nU 8254 ; WX 500 ; N uni203E ; G 1961\nU 8258 ; WX 1000 ; N uni2042 ; G 1962\nU 8260 ; WX 167 ; N fraction ; G 1963\nU 8261 ; WX 390 ; N uni2045 ; G 1964\nU 8262 ; WX 390 ; N uni2046 ; G 1965\nU 8263 ; WX 976 ; N uni2047 ; G 1966\nU 8264 ; WX 753 ; N uni2048 ; G 1967\nU 8265 ; WX 753 ; N uni2049 ; G 1968\nU 8267 ; WX 636 ; N uni204B ; G 1969\nU 8268 ; WX 500 ; N uni204C ; G 1970\nU 8269 ; WX 500 ; N uni204D ; G 1971\nU 8270 ; WX 500 ; N uni204E ; G 1972\nU 8271 ; WX 337 ; N uni204F ; G 1973\nU 8273 ; WX 500 ; N uni2051 ; G 1974\nU 8274 ; WX 450 ; N uni2052 ; G 1975\nU 8275 ; WX 1000 ; N uni2053 ; G 1976\nU 8279 ; WX 663 ; N uni2057 ; G 1977\nU 8287 ; WX 222 ; N uni205F ; G 1978\nU 8288 ; WX 0 ; N uni2060 ; G 1979\nU 8289 ; WX 0 ; N uni2061 ; G 1980\nU 8290 ; WX 0 ; N uni2062 ; G 1981\nU 8291 ; WX 0 ; N uni2063 ; G 1982\nU 8292 ; WX 0 ; N uni2064 ; G 1983\nU 8298 ; WX 0 ; N uni206A ; G 1984\nU 8299 ; WX 0 ; N uni206B ; G 1985\nU 8300 ; WX 0 ; N uni206C ; G 1986\nU 8301 ; WX 0 ; N uni206D ; G 1987\nU 8302 ; WX 0 ; N uni206E ; G 1988\nU 8303 ; WX 0 ; N uni206F ; G 1989\nU 8304 ; WX 401 ; N uni2070 ; G 1990\nU 8305 ; WX 201 ; N uni2071 ; G 1991\nU 8308 ; WX 401 ; N uni2074 ; G 1992\nU 8309 ; WX 401 ; N uni2075 ; G 1993\nU 8310 ; WX 401 ; N uni2076 ; G 1994\nU 8311 ; WX 401 ; N uni2077 ; G 1995\nU 8312 ; WX 401 ; N uni2078 ; G 1996\nU 8313 ; WX 401 ; N uni2079 ; G 1997\nU 8314 ; WX 528 ; N uni207A ; G 1998\nU 8315 ; WX 528 ; N uni207B ; G 1999\nU 8316 ; WX 528 ; N uni207C ; G 2000\nU 8317 ; WX 246 ; N uni207D ; G 2001\nU 8318 ; WX 246 ; N uni207E ; G 2002\nU 8319 ; WX 433 ; N uni207F ; G 2003\nU 8320 ; WX 401 ; N uni2080 ; G 2004\nU 8321 ; WX 401 ; N uni2081 ; G 2005\nU 8322 ; WX 401 ; N uni2082 ; G 2006\nU 8323 ; WX 401 ; N uni2083 ; G 2007\nU 8324 ; WX 401 ; N uni2084 ; G 2008\nU 8325 ; WX 401 ; N uni2085 ; G 2009\nU 8326 ; WX 401 ; N uni2086 ; G 2010\nU 8327 ; WX 401 ; N uni2087 ; G 2011\nU 8328 ; WX 401 ; N uni2088 ; G 2012\nU 8329 ; WX 401 ; N uni2089 ; G 2013\nU 8330 ; WX 528 ; N uni208A ; G 2014\nU 8331 ; WX 528 ; N uni208B ; G 2015\nU 8332 ; WX 528 ; N uni208C ; G 2016\nU 8333 ; WX 246 ; N uni208D ; G 2017\nU 8334 ; WX 246 ; N uni208E ; G 2018\nU 8336 ; WX 386 ; N uni2090 ; G 2019\nU 8337 ; WX 387 ; N uni2091 ; G 2020\nU 8338 ; WX 385 ; N uni2092 ; G 2021\nU 8339 ; WX 424 ; N uni2093 ; G 2022\nU 8340 ; WX 387 ; N uni2094 ; G 2023\nU 8341 ; WX 433 ; N uni2095 ; G 2024\nU 8342 ; WX 365 ; N uni2096 ; G 2025\nU 8343 ; WX 243 ; N uni2097 ; G 2026\nU 8344 ; WX 613 ; N uni2098 ; G 2027\nU 8345 ; WX 433 ; N uni2099 ; G 2028\nU 8346 ; WX 400 ; N uni209A ; G 2029\nU 8347 ; WX 337 ; N uni209B ; G 2030\nU 8348 ; WX 247 ; N uni209C ; G 2031\nU 8358 ; WX 636 ; N uni20A6 ; G 2032\nU 8364 ; WX 636 ; N Euro ; G 2033\nU 8367 ; WX 1057 ; N uni20AF ; G 2034\nU 8369 ; WX 706 ; N uni20B1 ; G 2035\nU 8372 ; WX 780 ; N uni20B4 ; G 2036\nU 8373 ; WX 636 ; N uni20B5 ; G 2037\nU 8376 ; WX 636 ; N uni20B8 ; G 2038\nU 8377 ; WX 636 ; N uni20B9 ; G 2039\nU 8378 ; WX 636 ; N uni20BA ; G 2040\nU 8381 ; WX 636 ; N uni20BD ; G 2041\nU 8450 ; WX 796 ; N uni2102 ; G 2042\nU 8451 ; WX 1119 ; N uni2103 ; G 2043\nU 8457 ; WX 1047 ; N uni2109 ; G 2044\nU 8461 ; WX 945 ; N uni210D ; G 2045\nU 8462 ; WX 644 ; N uni210E ; G 2046\nU 8463 ; WX 644 ; N uni210F ; G 2047\nU 8469 ; WX 914 ; N uni2115 ; G 2048\nU 8470 ; WX 946 ; N uni2116 ; G 2049\nU 8473 ; WX 752 ; N uni2119 ; G 2050\nU 8474 ; WX 871 ; N uni211A ; G 2051\nU 8477 ; WX 831 ; N uni211D ; G 2052\nU 8482 ; WX 1000 ; N trademark ; G 2053\nU 8484 ; WX 730 ; N uni2124 ; G 2054\nU 8486 ; WX 829 ; N uni2126 ; G 2055\nU 8487 ; WX 829 ; N uni2127 ; G 2056\nU 8490 ; WX 747 ; N uni212A ; G 2057\nU 8491 ; WX 722 ; N uni212B ; G 2058\nU 8498 ; WX 694 ; N uni2132 ; G 2059\nU 8508 ; WX 732 ; N uni213C ; G 2060\nU 8509 ; WX 660 ; N uni213D ; G 2061\nU 8510 ; WX 710 ; N uni213E ; G 2062\nU 8511 ; WX 944 ; N uni213F ; G 2063\nU 8512 ; WX 714 ; N uni2140 ; G 2064\nU 8513 ; WX 775 ; N uni2141 ; G 2065\nU 8514 ; WX 557 ; N uni2142 ; G 2066\nU 8515 ; WX 557 ; N uni2143 ; G 2067\nU 8516 ; WX 611 ; N uni2144 ; G 2068\nU 8517 ; WX 867 ; N uni2145 ; G 2069\nU 8518 ; WX 699 ; N uni2146 ; G 2070\nU 8519 ; WX 636 ; N uni2147 ; G 2071\nU 8520 ; WX 380 ; N uni2148 ; G 2072\nU 8521 ; WX 362 ; N uni2149 ; G 2073\nU 8523 ; WX 890 ; N uni214B ; G 2074\nU 8526 ; WX 514 ; N uni214E ; G 2075\nU 8528 ; WX 969 ; N uni2150 ; G 2076\nU 8529 ; WX 969 ; N uni2151 ; G 2077\nU 8530 ; WX 1370 ; N uni2152 ; G 2078\nU 8531 ; WX 969 ; N onethird ; G 2079\nU 8532 ; WX 969 ; N twothirds ; G 2080\nU 8533 ; WX 969 ; N uni2155 ; G 2081\nU 8534 ; WX 969 ; N uni2156 ; G 2082\nU 8535 ; WX 969 ; N uni2157 ; G 2083\nU 8536 ; WX 969 ; N uni2158 ; G 2084\nU 8537 ; WX 969 ; N uni2159 ; G 2085\nU 8538 ; WX 969 ; N uni215A ; G 2086\nU 8539 ; WX 969 ; N oneeighth ; G 2087\nU 8540 ; WX 969 ; N threeeighths ; G 2088\nU 8541 ; WX 969 ; N fiveeighths ; G 2089\nU 8542 ; WX 969 ; N seveneighths ; G 2090\nU 8543 ; WX 568 ; N uni215F ; G 2091\nU 8544 ; WX 395 ; N uni2160 ; G 2092\nU 8545 ; WX 680 ; N uni2161 ; G 2093\nU 8546 ; WX 964 ; N uni2162 ; G 2094\nU 8547 ; WX 999 ; N uni2163 ; G 2095\nU 8548 ; WX 722 ; N uni2164 ; G 2096\nU 8549 ; WX 1006 ; N uni2165 ; G 2097\nU 8550 ; WX 1291 ; N uni2166 ; G 2098\nU 8551 ; WX 1575 ; N uni2167 ; G 2099\nU 8552 ; WX 965 ; N uni2168 ; G 2100\nU 8553 ; WX 712 ; N uni2169 ; G 2101\nU 8554 ; WX 969 ; N uni216A ; G 2102\nU 8555 ; WX 1253 ; N uni216B ; G 2103\nU 8556 ; WX 664 ; N uni216C ; G 2104\nU 8557 ; WX 765 ; N uni216D ; G 2105\nU 8558 ; WX 802 ; N uni216E ; G 2106\nU 8559 ; WX 1024 ; N uni216F ; G 2107\nU 8560 ; WX 320 ; N uni2170 ; G 2108\nU 8561 ; WX 640 ; N uni2171 ; G 2109\nU 8562 ; WX 959 ; N uni2172 ; G 2110\nU 8563 ; WX 885 ; N uni2173 ; G 2111\nU 8564 ; WX 565 ; N uni2174 ; G 2112\nU 8565 ; WX 885 ; N uni2175 ; G 2113\nU 8566 ; WX 1205 ; N uni2176 ; G 2114\nU 8567 ; WX 1524 ; N uni2177 ; G 2115\nU 8568 ; WX 884 ; N uni2178 ; G 2116\nU 8569 ; WX 564 ; N uni2179 ; G 2117\nU 8570 ; WX 884 ; N uni217A ; G 2118\nU 8571 ; WX 1204 ; N uni217B ; G 2119\nU 8572 ; WX 320 ; N uni217C ; G 2120\nU 8573 ; WX 560 ; N uni217D ; G 2121\nU 8574 ; WX 640 ; N uni217E ; G 2122\nU 8575 ; WX 948 ; N uni217F ; G 2123\nU 8576 ; WX 1206 ; N uni2180 ; G 2124\nU 8577 ; WX 802 ; N uni2181 ; G 2125\nU 8578 ; WX 1206 ; N uni2182 ; G 2126\nU 8579 ; WX 765 ; N uni2183 ; G 2127\nU 8580 ; WX 560 ; N uni2184 ; G 2128\nU 8581 ; WX 765 ; N uni2185 ; G 2129\nU 8585 ; WX 969 ; N uni2189 ; G 2130\nU 8592 ; WX 838 ; N arrowleft ; G 2131\nU 8593 ; WX 838 ; N arrowup ; G 2132\nU 8594 ; WX 838 ; N arrowright ; G 2133\nU 8595 ; WX 838 ; N arrowdown ; G 2134\nU 8596 ; WX 838 ; N arrowboth ; G 2135\nU 8597 ; WX 838 ; N arrowupdn ; G 2136\nU 8598 ; WX 838 ; N uni2196 ; G 2137\nU 8599 ; WX 838 ; N uni2197 ; G 2138\nU 8600 ; WX 838 ; N uni2198 ; G 2139\nU 8601 ; WX 838 ; N uni2199 ; G 2140\nU 8602 ; WX 838 ; N uni219A ; G 2141\nU 8603 ; WX 838 ; N uni219B ; G 2142\nU 8604 ; WX 838 ; N uni219C ; G 2143\nU 8605 ; WX 838 ; N uni219D ; G 2144\nU 8606 ; WX 838 ; N uni219E ; G 2145\nU 8607 ; WX 838 ; N uni219F ; G 2146\nU 8608 ; WX 838 ; N uni21A0 ; G 2147\nU 8609 ; WX 838 ; N uni21A1 ; G 2148\nU 8610 ; WX 838 ; N uni21A2 ; G 2149\nU 8611 ; WX 838 ; N uni21A3 ; G 2150\nU 8612 ; WX 838 ; N uni21A4 ; G 2151\nU 8613 ; WX 838 ; N uni21A5 ; G 2152\nU 8614 ; WX 838 ; N uni21A6 ; G 2153\nU 8615 ; WX 838 ; N uni21A7 ; G 2154\nU 8616 ; WX 838 ; N arrowupdnbse ; G 2155\nU 8617 ; WX 838 ; N uni21A9 ; G 2156\nU 8618 ; WX 838 ; N uni21AA ; G 2157\nU 8619 ; WX 838 ; N uni21AB ; G 2158\nU 8620 ; WX 838 ; N uni21AC ; G 2159\nU 8621 ; WX 838 ; N uni21AD ; G 2160\nU 8622 ; WX 838 ; N uni21AE ; G 2161\nU 8623 ; WX 838 ; N uni21AF ; G 2162\nU 8624 ; WX 838 ; N uni21B0 ; G 2163\nU 8625 ; WX 838 ; N uni21B1 ; G 2164\nU 8626 ; WX 838 ; N uni21B2 ; G 2165\nU 8627 ; WX 838 ; N uni21B3 ; G 2166\nU 8628 ; WX 838 ; N uni21B4 ; G 2167\nU 8629 ; WX 838 ; N carriagereturn ; G 2168\nU 8630 ; WX 838 ; N uni21B6 ; G 2169\nU 8631 ; WX 838 ; N uni21B7 ; G 2170\nU 8632 ; WX 838 ; N uni21B8 ; G 2171\nU 8633 ; WX 838 ; N uni21B9 ; G 2172\nU 8634 ; WX 838 ; N uni21BA ; G 2173\nU 8635 ; WX 838 ; N uni21BB ; G 2174\nU 8636 ; WX 838 ; N uni21BC ; G 2175\nU 8637 ; WX 838 ; N uni21BD ; G 2176\nU 8638 ; WX 838 ; N uni21BE ; G 2177\nU 8639 ; WX 838 ; N uni21BF ; G 2178\nU 8640 ; WX 838 ; N uni21C0 ; G 2179\nU 8641 ; WX 838 ; N uni21C1 ; G 2180\nU 8642 ; WX 838 ; N uni21C2 ; G 2181\nU 8643 ; WX 838 ; N uni21C3 ; G 2182\nU 8644 ; WX 838 ; N uni21C4 ; G 2183\nU 8645 ; WX 838 ; N uni21C5 ; G 2184\nU 8646 ; WX 838 ; N uni21C6 ; G 2185\nU 8647 ; WX 838 ; N uni21C7 ; G 2186\nU 8648 ; WX 838 ; N uni21C8 ; G 2187\nU 8649 ; WX 838 ; N uni21C9 ; G 2188\nU 8650 ; WX 838 ; N uni21CA ; G 2189\nU 8651 ; WX 838 ; N uni21CB ; G 2190\nU 8652 ; WX 838 ; N uni21CC ; G 2191\nU 8653 ; WX 838 ; N uni21CD ; G 2192\nU 8654 ; WX 838 ; N uni21CE ; G 2193\nU 8655 ; WX 838 ; N uni21CF ; G 2194\nU 8656 ; WX 838 ; N arrowdblleft ; G 2195\nU 8657 ; WX 838 ; N arrowdblup ; G 2196\nU 8658 ; WX 838 ; N arrowdblright ; G 2197\nU 8659 ; WX 838 ; N arrowdbldown ; G 2198\nU 8660 ; WX 838 ; N arrowdblboth ; G 2199\nU 8661 ; WX 838 ; N uni21D5 ; G 2200\nU 8662 ; WX 838 ; N uni21D6 ; G 2201\nU 8663 ; WX 838 ; N uni21D7 ; G 2202\nU 8664 ; WX 838 ; N uni21D8 ; G 2203\nU 8665 ; WX 838 ; N uni21D9 ; G 2204\nU 8666 ; WX 838 ; N uni21DA ; G 2205\nU 8667 ; WX 838 ; N uni21DB ; G 2206\nU 8668 ; WX 838 ; N uni21DC ; G 2207\nU 8669 ; WX 838 ; N uni21DD ; G 2208\nU 8670 ; WX 838 ; N uni21DE ; G 2209\nU 8671 ; WX 838 ; N uni21DF ; G 2210\nU 8672 ; WX 838 ; N uni21E0 ; G 2211\nU 8673 ; WX 838 ; N uni21E1 ; G 2212\nU 8674 ; WX 838 ; N uni21E2 ; G 2213\nU 8675 ; WX 838 ; N uni21E3 ; G 2214\nU 8676 ; WX 838 ; N uni21E4 ; G 2215\nU 8677 ; WX 838 ; N uni21E5 ; G 2216\nU 8678 ; WX 838 ; N uni21E6 ; G 2217\nU 8679 ; WX 838 ; N uni21E7 ; G 2218\nU 8680 ; WX 838 ; N uni21E8 ; G 2219\nU 8681 ; WX 838 ; N uni21E9 ; G 2220\nU 8682 ; WX 838 ; N uni21EA ; G 2221\nU 8683 ; WX 838 ; N uni21EB ; G 2222\nU 8684 ; WX 838 ; N uni21EC ; G 2223\nU 8685 ; WX 838 ; N uni21ED ; G 2224\nU 8686 ; WX 838 ; N uni21EE ; G 2225\nU 8687 ; WX 838 ; N uni21EF ; G 2226\nU 8688 ; WX 838 ; N uni21F0 ; G 2227\nU 8689 ; WX 838 ; N uni21F1 ; G 2228\nU 8690 ; WX 838 ; N uni21F2 ; G 2229\nU 8691 ; WX 838 ; N uni21F3 ; G 2230\nU 8692 ; WX 838 ; N uni21F4 ; G 2231\nU 8693 ; WX 838 ; N uni21F5 ; G 2232\nU 8694 ; WX 838 ; N uni21F6 ; G 2233\nU 8695 ; WX 838 ; N uni21F7 ; G 2234\nU 8696 ; WX 838 ; N uni21F8 ; G 2235\nU 8697 ; WX 838 ; N uni21F9 ; G 2236\nU 8698 ; WX 838 ; N uni21FA ; G 2237\nU 8699 ; WX 838 ; N uni21FB ; G 2238\nU 8700 ; WX 838 ; N uni21FC ; G 2239\nU 8701 ; WX 838 ; N uni21FD ; G 2240\nU 8702 ; WX 838 ; N uni21FE ; G 2241\nU 8703 ; WX 838 ; N uni21FF ; G 2242\nU 8704 ; WX 604 ; N universal ; G 2243\nU 8706 ; WX 517 ; N partialdiff ; G 2244\nU 8707 ; WX 542 ; N existential ; G 2245\nU 8708 ; WX 542 ; N uni2204 ; G 2246\nU 8710 ; WX 698 ; N increment ; G 2247\nU 8711 ; WX 698 ; N gradient ; G 2248\nU 8712 ; WX 740 ; N element ; G 2249\nU 8713 ; WX 740 ; N notelement ; G 2250\nU 8715 ; WX 740 ; N suchthat ; G 2251\nU 8716 ; WX 740 ; N uni220C ; G 2252\nU 8719 ; WX 796 ; N product ; G 2253\nU 8720 ; WX 796 ; N uni2210 ; G 2254\nU 8721 ; WX 714 ; N summation ; G 2255\nU 8722 ; WX 838 ; N minus ; G 2256\nU 8723 ; WX 838 ; N uni2213 ; G 2257\nU 8724 ; WX 838 ; N uni2214 ; G 2258\nU 8725 ; WX 337 ; N uni2215 ; G 2259\nU 8727 ; WX 680 ; N asteriskmath ; G 2260\nU 8728 ; WX 490 ; N uni2218 ; G 2261\nU 8729 ; WX 490 ; N uni2219 ; G 2262\nU 8730 ; WX 637 ; N radical ; G 2263\nU 8731 ; WX 637 ; N uni221B ; G 2264\nU 8732 ; WX 637 ; N uni221C ; G 2265\nU 8733 ; WX 677 ; N proportional ; G 2266\nU 8734 ; WX 833 ; N infinity ; G 2267\nU 8735 ; WX 838 ; N orthogonal ; G 2268\nU 8736 ; WX 838 ; N angle ; G 2269\nU 8739 ; WX 291 ; N uni2223 ; G 2270\nU 8740 ; WX 479 ; N uni2224 ; G 2271\nU 8741 ; WX 462 ; N uni2225 ; G 2272\nU 8742 ; WX 634 ; N uni2226 ; G 2273\nU 8743 ; WX 732 ; N logicaland ; G 2274\nU 8744 ; WX 732 ; N logicalor ; G 2275\nU 8745 ; WX 838 ; N intersection ; G 2276\nU 8746 ; WX 838 ; N union ; G 2277\nU 8747 ; WX 521 ; N integral ; G 2278\nU 8748 ; WX 852 ; N uni222C ; G 2279\nU 8749 ; WX 1182 ; N uni222D ; G 2280\nU 8760 ; WX 838 ; N uni2238 ; G 2281\nU 8761 ; WX 838 ; N uni2239 ; G 2282\nU 8762 ; WX 838 ; N uni223A ; G 2283\nU 8763 ; WX 838 ; N uni223B ; G 2284\nU 8764 ; WX 838 ; N similar ; G 2285\nU 8765 ; WX 838 ; N uni223D ; G 2286\nU 8770 ; WX 838 ; N uni2242 ; G 2287\nU 8771 ; WX 838 ; N uni2243 ; G 2288\nU 8776 ; WX 838 ; N approxequal ; G 2289\nU 8784 ; WX 838 ; N uni2250 ; G 2290\nU 8785 ; WX 838 ; N uni2251 ; G 2291\nU 8786 ; WX 838 ; N uni2252 ; G 2292\nU 8787 ; WX 838 ; N uni2253 ; G 2293\nU 8788 ; WX 1033 ; N uni2254 ; G 2294\nU 8789 ; WX 1033 ; N uni2255 ; G 2295\nU 8800 ; WX 838 ; N notequal ; G 2296\nU 8801 ; WX 838 ; N equivalence ; G 2297\nU 8804 ; WX 838 ; N lessequal ; G 2298\nU 8805 ; WX 838 ; N greaterequal ; G 2299\nU 8834 ; WX 838 ; N propersubset ; G 2300\nU 8835 ; WX 838 ; N propersuperset ; G 2301\nU 8836 ; WX 838 ; N notsubset ; G 2302\nU 8837 ; WX 838 ; N uni2285 ; G 2303\nU 8838 ; WX 838 ; N reflexsubset ; G 2304\nU 8839 ; WX 838 ; N reflexsuperset ; G 2305\nU 8844 ; WX 838 ; N uni228C ; G 2306\nU 8845 ; WX 838 ; N uni228D ; G 2307\nU 8846 ; WX 838 ; N uni228E ; G 2308\nU 8847 ; WX 846 ; N uni228F ; G 2309\nU 8848 ; WX 846 ; N uni2290 ; G 2310\nU 8849 ; WX 846 ; N uni2291 ; G 2311\nU 8850 ; WX 846 ; N uni2292 ; G 2312\nU 8851 ; WX 838 ; N uni2293 ; G 2313\nU 8852 ; WX 838 ; N uni2294 ; G 2314\nU 8853 ; WX 838 ; N circleplus ; G 2315\nU 8854 ; WX 838 ; N uni2296 ; G 2316\nU 8855 ; WX 838 ; N circlemultiply ; G 2317\nU 8856 ; WX 838 ; N uni2298 ; G 2318\nU 8857 ; WX 838 ; N uni2299 ; G 2319\nU 8858 ; WX 838 ; N uni229A ; G 2320\nU 8859 ; WX 838 ; N uni229B ; G 2321\nU 8860 ; WX 838 ; N uni229C ; G 2322\nU 8861 ; WX 838 ; N uni229D ; G 2323\nU 8862 ; WX 838 ; N uni229E ; G 2324\nU 8863 ; WX 838 ; N uni229F ; G 2325\nU 8864 ; WX 838 ; N uni22A0 ; G 2326\nU 8865 ; WX 838 ; N uni22A1 ; G 2327\nU 8866 ; WX 860 ; N uni22A2 ; G 2328\nU 8867 ; WX 860 ; N uni22A3 ; G 2329\nU 8868 ; WX 940 ; N uni22A4 ; G 2330\nU 8869 ; WX 940 ; N perpendicular ; G 2331\nU 8870 ; WX 567 ; N uni22A6 ; G 2332\nU 8871 ; WX 567 ; N uni22A7 ; G 2333\nU 8872 ; WX 860 ; N uni22A8 ; G 2334\nU 8873 ; WX 860 ; N uni22A9 ; G 2335\nU 8874 ; WX 860 ; N uni22AA ; G 2336\nU 8875 ; WX 1031 ; N uni22AB ; G 2337\nU 8876 ; WX 860 ; N uni22AC ; G 2338\nU 8877 ; WX 860 ; N uni22AD ; G 2339\nU 8878 ; WX 860 ; N uni22AE ; G 2340\nU 8879 ; WX 1031 ; N uni22AF ; G 2341\nU 8900 ; WX 626 ; N uni22C4 ; G 2342\nU 8901 ; WX 342 ; N dotmath ; G 2343\nU 8962 ; WX 764 ; N house ; G 2344\nU 8968 ; WX 390 ; N uni2308 ; G 2345\nU 8969 ; WX 390 ; N uni2309 ; G 2346\nU 8970 ; WX 390 ; N uni230A ; G 2347\nU 8971 ; WX 390 ; N uni230B ; G 2348\nU 8976 ; WX 838 ; N revlogicalnot ; G 2349\nU 8977 ; WX 513 ; N uni2311 ; G 2350\nU 8984 ; WX 1000 ; N uni2318 ; G 2351\nU 8985 ; WX 838 ; N uni2319 ; G 2352\nU 8992 ; WX 521 ; N integraltp ; G 2353\nU 8993 ; WX 521 ; N integralbt ; G 2354\nU 8997 ; WX 1000 ; N uni2325 ; G 2355\nU 9000 ; WX 1443 ; N uni2328 ; G 2356\nU 9085 ; WX 919 ; N uni237D ; G 2357\nU 9115 ; WX 500 ; N uni239B ; G 2358\nU 9116 ; WX 500 ; N uni239C ; G 2359\nU 9117 ; WX 500 ; N uni239D ; G 2360\nU 9118 ; WX 500 ; N uni239E ; G 2361\nU 9119 ; WX 500 ; N uni239F ; G 2362\nU 9120 ; WX 500 ; N uni23A0 ; G 2363\nU 9121 ; WX 500 ; N uni23A1 ; G 2364\nU 9122 ; WX 500 ; N uni23A2 ; G 2365\nU 9123 ; WX 500 ; N uni23A3 ; G 2366\nU 9124 ; WX 500 ; N uni23A4 ; G 2367\nU 9125 ; WX 500 ; N uni23A5 ; G 2368\nU 9126 ; WX 500 ; N uni23A6 ; G 2369\nU 9127 ; WX 750 ; N uni23A7 ; G 2370\nU 9128 ; WX 750 ; N uni23A8 ; G 2371\nU 9129 ; WX 750 ; N uni23A9 ; G 2372\nU 9130 ; WX 750 ; N uni23AA ; G 2373\nU 9131 ; WX 750 ; N uni23AB ; G 2374\nU 9132 ; WX 750 ; N uni23AC ; G 2375\nU 9133 ; WX 750 ; N uni23AD ; G 2376\nU 9134 ; WX 521 ; N uni23AE ; G 2377\nU 9143 ; WX 637 ; N uni23B7 ; G 2378\nU 9167 ; WX 945 ; N uni23CF ; G 2379\nU 9251 ; WX 764 ; N uni2423 ; G 2380\nU 9472 ; WX 602 ; N SF100000 ; G 2381\nU 9473 ; WX 602 ; N uni2501 ; G 2382\nU 9474 ; WX 602 ; N SF110000 ; G 2383\nU 9475 ; WX 602 ; N uni2503 ; G 2384\nU 9476 ; WX 602 ; N uni2504 ; G 2385\nU 9477 ; WX 602 ; N uni2505 ; G 2386\nU 9478 ; WX 602 ; N uni2506 ; G 2387\nU 9479 ; WX 602 ; N uni2507 ; G 2388\nU 9480 ; WX 602 ; N uni2508 ; G 2389\nU 9481 ; WX 602 ; N uni2509 ; G 2390\nU 9482 ; WX 602 ; N uni250A ; G 2391\nU 9483 ; WX 602 ; N uni250B ; G 2392\nU 9484 ; WX 602 ; N SF010000 ; G 2393\nU 9485 ; WX 602 ; N uni250D ; G 2394\nU 9486 ; WX 602 ; N uni250E ; G 2395\nU 9487 ; WX 602 ; N uni250F ; G 2396\nU 9488 ; WX 602 ; N SF030000 ; G 2397\nU 9489 ; WX 602 ; N uni2511 ; G 2398\nU 9490 ; WX 602 ; N uni2512 ; G 2399\nU 9491 ; WX 602 ; N uni2513 ; G 2400\nU 9492 ; WX 602 ; N SF020000 ; G 2401\nU 9493 ; WX 602 ; N uni2515 ; G 2402\nU 9494 ; WX 602 ; N uni2516 ; G 2403\nU 9495 ; WX 602 ; N uni2517 ; G 2404\nU 9496 ; WX 602 ; N SF040000 ; G 2405\nU 9497 ; WX 602 ; N uni2519 ; G 2406\nU 9498 ; WX 602 ; N uni251A ; G 2407\nU 9499 ; WX 602 ; N uni251B ; G 2408\nU 9500 ; WX 602 ; N SF080000 ; G 2409\nU 9501 ; WX 602 ; N uni251D ; G 2410\nU 9502 ; WX 602 ; N uni251E ; G 2411\nU 9503 ; WX 602 ; N uni251F ; G 2412\nU 9504 ; WX 602 ; N uni2520 ; G 2413\nU 9505 ; WX 602 ; N uni2521 ; G 2414\nU 9506 ; WX 602 ; N uni2522 ; G 2415\nU 9507 ; WX 602 ; N uni2523 ; G 2416\nU 9508 ; WX 602 ; N SF090000 ; G 2417\nU 9509 ; WX 602 ; N uni2525 ; G 2418\nU 9510 ; WX 602 ; N uni2526 ; G 2419\nU 9511 ; WX 602 ; N uni2527 ; G 2420\nU 9512 ; WX 602 ; N uni2528 ; G 2421\nU 9513 ; WX 602 ; N uni2529 ; G 2422\nU 9514 ; WX 602 ; N uni252A ; G 2423\nU 9515 ; WX 602 ; N uni252B ; G 2424\nU 9516 ; WX 602 ; N SF060000 ; G 2425\nU 9517 ; WX 602 ; N uni252D ; G 2426\nU 9518 ; WX 602 ; N uni252E ; G 2427\nU 9519 ; WX 602 ; N uni252F ; G 2428\nU 9520 ; WX 602 ; N uni2530 ; G 2429\nU 9521 ; WX 602 ; N uni2531 ; G 2430\nU 9522 ; WX 602 ; N uni2532 ; G 2431\nU 9523 ; WX 602 ; N uni2533 ; G 2432\nU 9524 ; WX 602 ; N SF070000 ; G 2433\nU 9525 ; WX 602 ; N uni2535 ; G 2434\nU 9526 ; WX 602 ; N uni2536 ; G 2435\nU 9527 ; WX 602 ; N uni2537 ; G 2436\nU 9528 ; WX 602 ; N uni2538 ; G 2437\nU 9529 ; WX 602 ; N uni2539 ; G 2438\nU 9530 ; WX 602 ; N uni253A ; G 2439\nU 9531 ; WX 602 ; N uni253B ; G 2440\nU 9532 ; WX 602 ; N SF050000 ; G 2441\nU 9533 ; WX 602 ; N uni253D ; G 2442\nU 9534 ; WX 602 ; N uni253E ; G 2443\nU 9535 ; WX 602 ; N uni253F ; G 2444\nU 9536 ; WX 602 ; N uni2540 ; G 2445\nU 9537 ; WX 602 ; N uni2541 ; G 2446\nU 9538 ; WX 602 ; N uni2542 ; G 2447\nU 9539 ; WX 602 ; N uni2543 ; G 2448\nU 9540 ; WX 602 ; N uni2544 ; G 2449\nU 9541 ; WX 602 ; N uni2545 ; G 2450\nU 9542 ; WX 602 ; N uni2546 ; G 2451\nU 9543 ; WX 602 ; N uni2547 ; G 2452\nU 9544 ; WX 602 ; N uni2548 ; G 2453\nU 9545 ; WX 602 ; N uni2549 ; G 2454\nU 9546 ; WX 602 ; N uni254A ; G 2455\nU 9547 ; WX 602 ; N uni254B ; G 2456\nU 9548 ; WX 602 ; N uni254C ; G 2457\nU 9549 ; WX 602 ; N uni254D ; G 2458\nU 9550 ; WX 602 ; N uni254E ; G 2459\nU 9551 ; WX 602 ; N uni254F ; G 2460\nU 9552 ; WX 602 ; N SF430000 ; G 2461\nU 9553 ; WX 602 ; N SF240000 ; G 2462\nU 9554 ; WX 602 ; N SF510000 ; G 2463\nU 9555 ; WX 602 ; N SF520000 ; G 2464\nU 9556 ; WX 602 ; N SF390000 ; G 2465\nU 9557 ; WX 602 ; N SF220000 ; G 2466\nU 9558 ; WX 602 ; N SF210000 ; G 2467\nU 9559 ; WX 602 ; N SF250000 ; G 2468\nU 9560 ; WX 602 ; N SF500000 ; G 2469\nU 9561 ; WX 602 ; N SF490000 ; G 2470\nU 9562 ; WX 602 ; N SF380000 ; G 2471\nU 9563 ; WX 602 ; N SF280000 ; G 2472\nU 9564 ; WX 602 ; N SF270000 ; G 2473\nU 9565 ; WX 602 ; N SF260000 ; G 2474\nU 9566 ; WX 602 ; N SF360000 ; G 2475\nU 9567 ; WX 602 ; N SF370000 ; G 2476\nU 9568 ; WX 602 ; N SF420000 ; G 2477\nU 9569 ; WX 602 ; N SF190000 ; G 2478\nU 9570 ; WX 602 ; N SF200000 ; G 2479\nU 9571 ; WX 602 ; N SF230000 ; G 2480\nU 9572 ; WX 602 ; N SF470000 ; G 2481\nU 9573 ; WX 602 ; N SF480000 ; G 2482\nU 9574 ; WX 602 ; N SF410000 ; G 2483\nU 9575 ; WX 602 ; N SF450000 ; G 2484\nU 9576 ; WX 602 ; N SF460000 ; G 2485\nU 9577 ; WX 602 ; N SF400000 ; G 2486\nU 9578 ; WX 602 ; N SF540000 ; G 2487\nU 9579 ; WX 602 ; N SF530000 ; G 2488\nU 9580 ; WX 602 ; N SF440000 ; G 2489\nU 9581 ; WX 602 ; N uni256D ; G 2490\nU 9582 ; WX 602 ; N uni256E ; G 2491\nU 9583 ; WX 602 ; N uni256F ; G 2492\nU 9584 ; WX 602 ; N uni2570 ; G 2493\nU 9585 ; WX 602 ; N uni2571 ; G 2494\nU 9586 ; WX 602 ; N uni2572 ; G 2495\nU 9587 ; WX 602 ; N uni2573 ; G 2496\nU 9588 ; WX 602 ; N uni2574 ; G 2497\nU 9589 ; WX 602 ; N uni2575 ; G 2498\nU 9590 ; WX 602 ; N uni2576 ; G 2499\nU 9591 ; WX 602 ; N uni2577 ; G 2500\nU 9592 ; WX 602 ; N uni2578 ; G 2501\nU 9593 ; WX 602 ; N uni2579 ; G 2502\nU 9594 ; WX 602 ; N uni257A ; G 2503\nU 9595 ; WX 602 ; N uni257B ; G 2504\nU 9596 ; WX 602 ; N uni257C ; G 2505\nU 9597 ; WX 602 ; N uni257D ; G 2506\nU 9598 ; WX 602 ; N uni257E ; G 2507\nU 9599 ; WX 602 ; N uni257F ; G 2508\nU 9600 ; WX 769 ; N upblock ; G 2509\nU 9601 ; WX 769 ; N uni2581 ; G 2510\nU 9602 ; WX 769 ; N uni2582 ; G 2511\nU 9603 ; WX 769 ; N uni2583 ; G 2512\nU 9604 ; WX 769 ; N dnblock ; G 2513\nU 9605 ; WX 769 ; N uni2585 ; G 2514\nU 9606 ; WX 769 ; N uni2586 ; G 2515\nU 9607 ; WX 769 ; N uni2587 ; G 2516\nU 9608 ; WX 769 ; N block ; G 2517\nU 9609 ; WX 769 ; N uni2589 ; G 2518\nU 9610 ; WX 769 ; N uni258A ; G 2519\nU 9611 ; WX 769 ; N uni258B ; G 2520\nU 9612 ; WX 769 ; N lfblock ; G 2521\nU 9613 ; WX 769 ; N uni258D ; G 2522\nU 9614 ; WX 769 ; N uni258E ; G 2523\nU 9615 ; WX 769 ; N uni258F ; G 2524\nU 9616 ; WX 769 ; N rtblock ; G 2525\nU 9617 ; WX 769 ; N ltshade ; G 2526\nU 9618 ; WX 769 ; N shade ; G 2527\nU 9619 ; WX 769 ; N dkshade ; G 2528\nU 9620 ; WX 769 ; N uni2594 ; G 2529\nU 9621 ; WX 769 ; N uni2595 ; G 2530\nU 9622 ; WX 769 ; N uni2596 ; G 2531\nU 9623 ; WX 769 ; N uni2597 ; G 2532\nU 9624 ; WX 769 ; N uni2598 ; G 2533\nU 9625 ; WX 769 ; N uni2599 ; G 2534\nU 9626 ; WX 769 ; N uni259A ; G 2535\nU 9627 ; WX 769 ; N uni259B ; G 2536\nU 9628 ; WX 769 ; N uni259C ; G 2537\nU 9629 ; WX 769 ; N uni259D ; G 2538\nU 9630 ; WX 769 ; N uni259E ; G 2539\nU 9631 ; WX 769 ; N uni259F ; G 2540\nU 9632 ; WX 945 ; N filledbox ; G 2541\nU 9633 ; WX 945 ; N H22073 ; G 2542\nU 9634 ; WX 945 ; N uni25A2 ; G 2543\nU 9635 ; WX 945 ; N uni25A3 ; G 2544\nU 9636 ; WX 945 ; N uni25A4 ; G 2545\nU 9637 ; WX 945 ; N uni25A5 ; G 2546\nU 9638 ; WX 945 ; N uni25A6 ; G 2547\nU 9639 ; WX 945 ; N uni25A7 ; G 2548\nU 9640 ; WX 945 ; N uni25A8 ; G 2549\nU 9641 ; WX 945 ; N uni25A9 ; G 2550\nU 9642 ; WX 678 ; N H18543 ; G 2551\nU 9643 ; WX 678 ; N H18551 ; G 2552\nU 9644 ; WX 945 ; N filledrect ; G 2553\nU 9645 ; WX 945 ; N uni25AD ; G 2554\nU 9646 ; WX 550 ; N uni25AE ; G 2555\nU 9647 ; WX 550 ; N uni25AF ; G 2556\nU 9648 ; WX 769 ; N uni25B0 ; G 2557\nU 9649 ; WX 769 ; N uni25B1 ; G 2558\nU 9650 ; WX 769 ; N triagup ; G 2559\nU 9651 ; WX 769 ; N uni25B3 ; G 2560\nU 9652 ; WX 502 ; N uni25B4 ; G 2561\nU 9653 ; WX 502 ; N uni25B5 ; G 2562\nU 9654 ; WX 769 ; N uni25B6 ; G 2563\nU 9655 ; WX 769 ; N uni25B7 ; G 2564\nU 9656 ; WX 502 ; N uni25B8 ; G 2565\nU 9657 ; WX 502 ; N uni25B9 ; G 2566\nU 9658 ; WX 769 ; N triagrt ; G 2567\nU 9659 ; WX 769 ; N uni25BB ; G 2568\nU 9660 ; WX 769 ; N triagdn ; G 2569\nU 9661 ; WX 769 ; N uni25BD ; G 2570\nU 9662 ; WX 502 ; N uni25BE ; G 2571\nU 9663 ; WX 502 ; N uni25BF ; G 2572\nU 9664 ; WX 769 ; N uni25C0 ; G 2573\nU 9665 ; WX 769 ; N uni25C1 ; G 2574\nU 9666 ; WX 502 ; N uni25C2 ; G 2575\nU 9667 ; WX 502 ; N uni25C3 ; G 2576\nU 9668 ; WX 769 ; N triaglf ; G 2577\nU 9669 ; WX 769 ; N uni25C5 ; G 2578\nU 9670 ; WX 769 ; N uni25C6 ; G 2579\nU 9671 ; WX 769 ; N uni25C7 ; G 2580\nU 9672 ; WX 769 ; N uni25C8 ; G 2581\nU 9673 ; WX 873 ; N uni25C9 ; G 2582\nU 9674 ; WX 494 ; N lozenge ; G 2583\nU 9675 ; WX 873 ; N circle ; G 2584\nU 9676 ; WX 873 ; N uni25CC ; G 2585\nU 9677 ; WX 873 ; N uni25CD ; G 2586\nU 9678 ; WX 873 ; N uni25CE ; G 2587\nU 9679 ; WX 873 ; N H18533 ; G 2588\nU 9680 ; WX 873 ; N uni25D0 ; G 2589\nU 9681 ; WX 873 ; N uni25D1 ; G 2590\nU 9682 ; WX 873 ; N uni25D2 ; G 2591\nU 9683 ; WX 873 ; N uni25D3 ; G 2592\nU 9684 ; WX 873 ; N uni25D4 ; G 2593\nU 9685 ; WX 873 ; N uni25D5 ; G 2594\nU 9686 ; WX 527 ; N uni25D6 ; G 2595\nU 9687 ; WX 527 ; N uni25D7 ; G 2596\nU 9688 ; WX 791 ; N invbullet ; G 2597\nU 9689 ; WX 970 ; N invcircle ; G 2598\nU 9690 ; WX 970 ; N uni25DA ; G 2599\nU 9691 ; WX 970 ; N uni25DB ; G 2600\nU 9692 ; WX 387 ; N uni25DC ; G 2601\nU 9693 ; WX 387 ; N uni25DD ; G 2602\nU 9694 ; WX 387 ; N uni25DE ; G 2603\nU 9695 ; WX 387 ; N uni25DF ; G 2604\nU 9696 ; WX 873 ; N uni25E0 ; G 2605\nU 9697 ; WX 873 ; N uni25E1 ; G 2606\nU 9698 ; WX 769 ; N uni25E2 ; G 2607\nU 9699 ; WX 769 ; N uni25E3 ; G 2608\nU 9700 ; WX 769 ; N uni25E4 ; G 2609\nU 9701 ; WX 769 ; N uni25E5 ; G 2610\nU 9702 ; WX 590 ; N openbullet ; G 2611\nU 9703 ; WX 945 ; N uni25E7 ; G 2612\nU 9704 ; WX 945 ; N uni25E8 ; G 2613\nU 9705 ; WX 945 ; N uni25E9 ; G 2614\nU 9706 ; WX 945 ; N uni25EA ; G 2615\nU 9707 ; WX 945 ; N uni25EB ; G 2616\nU 9708 ; WX 769 ; N uni25EC ; G 2617\nU 9709 ; WX 769 ; N uni25ED ; G 2618\nU 9710 ; WX 769 ; N uni25EE ; G 2619\nU 9711 ; WX 1119 ; N uni25EF ; G 2620\nU 9712 ; WX 945 ; N uni25F0 ; G 2621\nU 9713 ; WX 945 ; N uni25F1 ; G 2622\nU 9714 ; WX 945 ; N uni25F2 ; G 2623\nU 9715 ; WX 945 ; N uni25F3 ; G 2624\nU 9716 ; WX 873 ; N uni25F4 ; G 2625\nU 9717 ; WX 873 ; N uni25F5 ; G 2626\nU 9718 ; WX 873 ; N uni25F6 ; G 2627\nU 9719 ; WX 873 ; N uni25F7 ; G 2628\nU 9720 ; WX 769 ; N uni25F8 ; G 2629\nU 9721 ; WX 769 ; N uni25F9 ; G 2630\nU 9722 ; WX 769 ; N uni25FA ; G 2631\nU 9723 ; WX 830 ; N uni25FB ; G 2632\nU 9724 ; WX 830 ; N uni25FC ; G 2633\nU 9725 ; WX 732 ; N uni25FD ; G 2634\nU 9726 ; WX 732 ; N uni25FE ; G 2635\nU 9727 ; WX 769 ; N uni25FF ; G 2636\nU 9728 ; WX 896 ; N uni2600 ; G 2637\nU 9784 ; WX 896 ; N uni2638 ; G 2638\nU 9785 ; WX 896 ; N uni2639 ; G 2639\nU 9786 ; WX 896 ; N smileface ; G 2640\nU 9787 ; WX 896 ; N invsmileface ; G 2641\nU 9788 ; WX 896 ; N sun ; G 2642\nU 9791 ; WX 614 ; N uni263F ; G 2643\nU 9792 ; WX 731 ; N female ; G 2644\nU 9793 ; WX 731 ; N uni2641 ; G 2645\nU 9794 ; WX 896 ; N male ; G 2646\nU 9795 ; WX 896 ; N uni2643 ; G 2647\nU 9796 ; WX 896 ; N uni2644 ; G 2648\nU 9797 ; WX 896 ; N uni2645 ; G 2649\nU 9798 ; WX 896 ; N uni2646 ; G 2650\nU 9799 ; WX 896 ; N uni2647 ; G 2651\nU 9824 ; WX 896 ; N spade ; G 2652\nU 9825 ; WX 896 ; N uni2661 ; G 2653\nU 9826 ; WX 896 ; N uni2662 ; G 2654\nU 9827 ; WX 896 ; N club ; G 2655\nU 9828 ; WX 896 ; N uni2664 ; G 2656\nU 9829 ; WX 896 ; N heart ; G 2657\nU 9830 ; WX 896 ; N diamond ; G 2658\nU 9831 ; WX 896 ; N uni2667 ; G 2659\nU 9833 ; WX 472 ; N uni2669 ; G 2660\nU 9834 ; WX 638 ; N musicalnote ; G 2661\nU 9835 ; WX 896 ; N musicalnotedbl ; G 2662\nU 9836 ; WX 896 ; N uni266C ; G 2663\nU 9837 ; WX 472 ; N uni266D ; G 2664\nU 9838 ; WX 357 ; N uni266E ; G 2665\nU 9839 ; WX 484 ; N uni266F ; G 2666\nU 10145 ; WX 838 ; N uni27A1 ; G 2667\nU 10181 ; WX 390 ; N uni27C5 ; G 2668\nU 10182 ; WX 390 ; N uni27C6 ; G 2669\nU 10208 ; WX 494 ; N uni27E0 ; G 2670\nU 10216 ; WX 390 ; N uni27E8 ; G 2671\nU 10217 ; WX 390 ; N uni27E9 ; G 2672\nU 10224 ; WX 838 ; N uni27F0 ; G 2673\nU 10225 ; WX 838 ; N uni27F1 ; G 2674\nU 10226 ; WX 838 ; N uni27F2 ; G 2675\nU 10227 ; WX 838 ; N uni27F3 ; G 2676\nU 10228 ; WX 1033 ; N uni27F4 ; G 2677\nU 10229 ; WX 1434 ; N uni27F5 ; G 2678\nU 10230 ; WX 1434 ; N uni27F6 ; G 2679\nU 10231 ; WX 1434 ; N uni27F7 ; G 2680\nU 10232 ; WX 1434 ; N uni27F8 ; G 2681\nU 10233 ; WX 1434 ; N uni27F9 ; G 2682\nU 10234 ; WX 1434 ; N uni27FA ; G 2683\nU 10235 ; WX 1434 ; N uni27FB ; G 2684\nU 10236 ; WX 1434 ; N uni27FC ; G 2685\nU 10237 ; WX 1434 ; N uni27FD ; G 2686\nU 10238 ; WX 1434 ; N uni27FE ; G 2687\nU 10239 ; WX 1434 ; N uni27FF ; G 2688\nU 10240 ; WX 732 ; N uni2800 ; G 2689\nU 10241 ; WX 732 ; N uni2801 ; G 2690\nU 10242 ; WX 732 ; N uni2802 ; G 2691\nU 10243 ; WX 732 ; N uni2803 ; G 2692\nU 10244 ; WX 732 ; N uni2804 ; G 2693\nU 10245 ; WX 732 ; N uni2805 ; G 2694\nU 10246 ; WX 732 ; N uni2806 ; G 2695\nU 10247 ; WX 732 ; N uni2807 ; G 2696\nU 10248 ; WX 732 ; N uni2808 ; G 2697\nU 10249 ; WX 732 ; N uni2809 ; G 2698\nU 10250 ; WX 732 ; N uni280A ; G 2699\nU 10251 ; WX 732 ; N uni280B ; G 2700\nU 10252 ; WX 732 ; N uni280C ; G 2701\nU 10253 ; WX 732 ; N uni280D ; G 2702\nU 10254 ; WX 732 ; N uni280E ; G 2703\nU 10255 ; WX 732 ; N uni280F ; G 2704\nU 10256 ; WX 732 ; N uni2810 ; G 2705\nU 10257 ; WX 732 ; N uni2811 ; G 2706\nU 10258 ; WX 732 ; N uni2812 ; G 2707\nU 10259 ; WX 732 ; N uni2813 ; G 2708\nU 10260 ; WX 732 ; N uni2814 ; G 2709\nU 10261 ; WX 732 ; N uni2815 ; G 2710\nU 10262 ; WX 732 ; N uni2816 ; G 2711\nU 10263 ; WX 732 ; N uni2817 ; G 2712\nU 10264 ; WX 732 ; N uni2818 ; G 2713\nU 10265 ; WX 732 ; N uni2819 ; G 2714\nU 10266 ; WX 732 ; N uni281A ; G 2715\nU 10267 ; WX 732 ; N uni281B ; G 2716\nU 10268 ; WX 732 ; N uni281C ; G 2717\nU 10269 ; WX 732 ; N uni281D ; G 2718\nU 10270 ; WX 732 ; N uni281E ; G 2719\nU 10271 ; WX 732 ; N uni281F ; G 2720\nU 10272 ; WX 732 ; N uni2820 ; G 2721\nU 10273 ; WX 732 ; N uni2821 ; G 2722\nU 10274 ; WX 732 ; N uni2822 ; G 2723\nU 10275 ; WX 732 ; N uni2823 ; G 2724\nU 10276 ; WX 732 ; N uni2824 ; G 2725\nU 10277 ; WX 732 ; N uni2825 ; G 2726\nU 10278 ; WX 732 ; N uni2826 ; G 2727\nU 10279 ; WX 732 ; N uni2827 ; G 2728\nU 10280 ; WX 732 ; N uni2828 ; G 2729\nU 10281 ; WX 732 ; N uni2829 ; G 2730\nU 10282 ; WX 732 ; N uni282A ; G 2731\nU 10283 ; WX 732 ; N uni282B ; G 2732\nU 10284 ; WX 732 ; N uni282C ; G 2733\nU 10285 ; WX 732 ; N uni282D ; G 2734\nU 10286 ; WX 732 ; N uni282E ; G 2735\nU 10287 ; WX 732 ; N uni282F ; G 2736\nU 10288 ; WX 732 ; N uni2830 ; G 2737\nU 10289 ; WX 732 ; N uni2831 ; G 2738\nU 10290 ; WX 732 ; N uni2832 ; G 2739\nU 10291 ; WX 732 ; N uni2833 ; G 2740\nU 10292 ; WX 732 ; N uni2834 ; G 2741\nU 10293 ; WX 732 ; N uni2835 ; G 2742\nU 10294 ; WX 732 ; N uni2836 ; G 2743\nU 10295 ; WX 732 ; N uni2837 ; G 2744\nU 10296 ; WX 732 ; N uni2838 ; G 2745\nU 10297 ; WX 732 ; N uni2839 ; G 2746\nU 10298 ; WX 732 ; N uni283A ; G 2747\nU 10299 ; WX 732 ; N uni283B ; G 2748\nU 10300 ; WX 732 ; N uni283C ; G 2749\nU 10301 ; WX 732 ; N uni283D ; G 2750\nU 10302 ; WX 732 ; N uni283E ; G 2751\nU 10303 ; WX 732 ; N uni283F ; G 2752\nU 10304 ; WX 732 ; N uni2840 ; G 2753\nU 10305 ; WX 732 ; N uni2841 ; G 2754\nU 10306 ; WX 732 ; N uni2842 ; G 2755\nU 10307 ; WX 732 ; N uni2843 ; G 2756\nU 10308 ; WX 732 ; N uni2844 ; G 2757\nU 10309 ; WX 732 ; N uni2845 ; G 2758\nU 10310 ; WX 732 ; N uni2846 ; G 2759\nU 10311 ; WX 732 ; N uni2847 ; G 2760\nU 10312 ; WX 732 ; N uni2848 ; G 2761\nU 10313 ; WX 732 ; N uni2849 ; G 2762\nU 10314 ; WX 732 ; N uni284A ; G 2763\nU 10315 ; WX 732 ; N uni284B ; G 2764\nU 10316 ; WX 732 ; N uni284C ; G 2765\nU 10317 ; WX 732 ; N uni284D ; G 2766\nU 10318 ; WX 732 ; N uni284E ; G 2767\nU 10319 ; WX 732 ; N uni284F ; G 2768\nU 10320 ; WX 732 ; N uni2850 ; G 2769\nU 10321 ; WX 732 ; N uni2851 ; G 2770\nU 10322 ; WX 732 ; N uni2852 ; G 2771\nU 10323 ; WX 732 ; N uni2853 ; G 2772\nU 10324 ; WX 732 ; N uni2854 ; G 2773\nU 10325 ; WX 732 ; N uni2855 ; G 2774\nU 10326 ; WX 732 ; N uni2856 ; G 2775\nU 10327 ; WX 732 ; N uni2857 ; G 2776\nU 10328 ; WX 732 ; N uni2858 ; G 2777\nU 10329 ; WX 732 ; N uni2859 ; G 2778\nU 10330 ; WX 732 ; N uni285A ; G 2779\nU 10331 ; WX 732 ; N uni285B ; G 2780\nU 10332 ; WX 732 ; N uni285C ; G 2781\nU 10333 ; WX 732 ; N uni285D ; G 2782\nU 10334 ; WX 732 ; N uni285E ; G 2783\nU 10335 ; WX 732 ; N uni285F ; G 2784\nU 10336 ; WX 732 ; N uni2860 ; G 2785\nU 10337 ; WX 732 ; N uni2861 ; G 2786\nU 10338 ; WX 732 ; N uni2862 ; G 2787\nU 10339 ; WX 732 ; N uni2863 ; G 2788\nU 10340 ; WX 732 ; N uni2864 ; G 2789\nU 10341 ; WX 732 ; N uni2865 ; G 2790\nU 10342 ; WX 732 ; N uni2866 ; G 2791\nU 10343 ; WX 732 ; N uni2867 ; G 2792\nU 10344 ; WX 732 ; N uni2868 ; G 2793\nU 10345 ; WX 732 ; N uni2869 ; G 2794\nU 10346 ; WX 732 ; N uni286A ; G 2795\nU 10347 ; WX 732 ; N uni286B ; G 2796\nU 10348 ; WX 732 ; N uni286C ; G 2797\nU 10349 ; WX 732 ; N uni286D ; G 2798\nU 10350 ; WX 732 ; N uni286E ; G 2799\nU 10351 ; WX 732 ; N uni286F ; G 2800\nU 10352 ; WX 732 ; N uni2870 ; G 2801\nU 10353 ; WX 732 ; N uni2871 ; G 2802\nU 10354 ; WX 732 ; N uni2872 ; G 2803\nU 10355 ; WX 732 ; N uni2873 ; G 2804\nU 10356 ; WX 732 ; N uni2874 ; G 2805\nU 10357 ; WX 732 ; N uni2875 ; G 2806\nU 10358 ; WX 732 ; N uni2876 ; G 2807\nU 10359 ; WX 732 ; N uni2877 ; G 2808\nU 10360 ; WX 732 ; N uni2878 ; G 2809\nU 10361 ; WX 732 ; N uni2879 ; G 2810\nU 10362 ; WX 732 ; N uni287A ; G 2811\nU 10363 ; WX 732 ; N uni287B ; G 2812\nU 10364 ; WX 732 ; N uni287C ; G 2813\nU 10365 ; WX 732 ; N uni287D ; G 2814\nU 10366 ; WX 732 ; N uni287E ; G 2815\nU 10367 ; WX 732 ; N uni287F ; G 2816\nU 10368 ; WX 732 ; N uni2880 ; G 2817\nU 10369 ; WX 732 ; N uni2881 ; G 2818\nU 10370 ; WX 732 ; N uni2882 ; G 2819\nU 10371 ; WX 732 ; N uni2883 ; G 2820\nU 10372 ; WX 732 ; N uni2884 ; G 2821\nU 10373 ; WX 732 ; N uni2885 ; G 2822\nU 10374 ; WX 732 ; N uni2886 ; G 2823\nU 10375 ; WX 732 ; N uni2887 ; G 2824\nU 10376 ; WX 732 ; N uni2888 ; G 2825\nU 10377 ; WX 732 ; N uni2889 ; G 2826\nU 10378 ; WX 732 ; N uni288A ; G 2827\nU 10379 ; WX 732 ; N uni288B ; G 2828\nU 10380 ; WX 732 ; N uni288C ; G 2829\nU 10381 ; WX 732 ; N uni288D ; G 2830\nU 10382 ; WX 732 ; N uni288E ; G 2831\nU 10383 ; WX 732 ; N uni288F ; G 2832\nU 10384 ; WX 732 ; N uni2890 ; G 2833\nU 10385 ; WX 732 ; N uni2891 ; G 2834\nU 10386 ; WX 732 ; N uni2892 ; G 2835\nU 10387 ; WX 732 ; N uni2893 ; G 2836\nU 10388 ; WX 732 ; N uni2894 ; G 2837\nU 10389 ; WX 732 ; N uni2895 ; G 2838\nU 10390 ; WX 732 ; N uni2896 ; G 2839\nU 10391 ; WX 732 ; N uni2897 ; G 2840\nU 10392 ; WX 732 ; N uni2898 ; G 2841\nU 10393 ; WX 732 ; N uni2899 ; G 2842\nU 10394 ; WX 732 ; N uni289A ; G 2843\nU 10395 ; WX 732 ; N uni289B ; G 2844\nU 10396 ; WX 732 ; N uni289C ; G 2845\nU 10397 ; WX 732 ; N uni289D ; G 2846\nU 10398 ; WX 732 ; N uni289E ; G 2847\nU 10399 ; WX 732 ; N uni289F ; G 2848\nU 10400 ; WX 732 ; N uni28A0 ; G 2849\nU 10401 ; WX 732 ; N uni28A1 ; G 2850\nU 10402 ; WX 732 ; N uni28A2 ; G 2851\nU 10403 ; WX 732 ; N uni28A3 ; G 2852\nU 10404 ; WX 732 ; N uni28A4 ; G 2853\nU 10405 ; WX 732 ; N uni28A5 ; G 2854\nU 10406 ; WX 732 ; N uni28A6 ; G 2855\nU 10407 ; WX 732 ; N uni28A7 ; G 2856\nU 10408 ; WX 732 ; N uni28A8 ; G 2857\nU 10409 ; WX 732 ; N uni28A9 ; G 2858\nU 10410 ; WX 732 ; N uni28AA ; G 2859\nU 10411 ; WX 732 ; N uni28AB ; G 2860\nU 10412 ; WX 732 ; N uni28AC ; G 2861\nU 10413 ; WX 732 ; N uni28AD ; G 2862\nU 10414 ; WX 732 ; N uni28AE ; G 2863\nU 10415 ; WX 732 ; N uni28AF ; G 2864\nU 10416 ; WX 732 ; N uni28B0 ; G 2865\nU 10417 ; WX 732 ; N uni28B1 ; G 2866\nU 10418 ; WX 732 ; N uni28B2 ; G 2867\nU 10419 ; WX 732 ; N uni28B3 ; G 2868\nU 10420 ; WX 732 ; N uni28B4 ; G 2869\nU 10421 ; WX 732 ; N uni28B5 ; G 2870\nU 10422 ; WX 732 ; N uni28B6 ; G 2871\nU 10423 ; WX 732 ; N uni28B7 ; G 2872\nU 10424 ; WX 732 ; N uni28B8 ; G 2873\nU 10425 ; WX 732 ; N uni28B9 ; G 2874\nU 10426 ; WX 732 ; N uni28BA ; G 2875\nU 10427 ; WX 732 ; N uni28BB ; G 2876\nU 10428 ; WX 732 ; N uni28BC ; G 2877\nU 10429 ; WX 732 ; N uni28BD ; G 2878\nU 10430 ; WX 732 ; N uni28BE ; G 2879\nU 10431 ; WX 732 ; N uni28BF ; G 2880\nU 10432 ; WX 732 ; N uni28C0 ; G 2881\nU 10433 ; WX 732 ; N uni28C1 ; G 2882\nU 10434 ; WX 732 ; N uni28C2 ; G 2883\nU 10435 ; WX 732 ; N uni28C3 ; G 2884\nU 10436 ; WX 732 ; N uni28C4 ; G 2885\nU 10437 ; WX 732 ; N uni28C5 ; G 2886\nU 10438 ; WX 732 ; N uni28C6 ; G 2887\nU 10439 ; WX 732 ; N uni28C7 ; G 2888\nU 10440 ; WX 732 ; N uni28C8 ; G 2889\nU 10441 ; WX 732 ; N uni28C9 ; G 2890\nU 10442 ; WX 732 ; N uni28CA ; G 2891\nU 10443 ; WX 732 ; N uni28CB ; G 2892\nU 10444 ; WX 732 ; N uni28CC ; G 2893\nU 10445 ; WX 732 ; N uni28CD ; G 2894\nU 10446 ; WX 732 ; N uni28CE ; G 2895\nU 10447 ; WX 732 ; N uni28CF ; G 2896\nU 10448 ; WX 732 ; N uni28D0 ; G 2897\nU 10449 ; WX 732 ; N uni28D1 ; G 2898\nU 10450 ; WX 732 ; N uni28D2 ; G 2899\nU 10451 ; WX 732 ; N uni28D3 ; G 2900\nU 10452 ; WX 732 ; N uni28D4 ; G 2901\nU 10453 ; WX 732 ; N uni28D5 ; G 2902\nU 10454 ; WX 732 ; N uni28D6 ; G 2903\nU 10455 ; WX 732 ; N uni28D7 ; G 2904\nU 10456 ; WX 732 ; N uni28D8 ; G 2905\nU 10457 ; WX 732 ; N uni28D9 ; G 2906\nU 10458 ; WX 732 ; N uni28DA ; G 2907\nU 10459 ; WX 732 ; N uni28DB ; G 2908\nU 10460 ; WX 732 ; N uni28DC ; G 2909\nU 10461 ; WX 732 ; N uni28DD ; G 2910\nU 10462 ; WX 732 ; N uni28DE ; G 2911\nU 10463 ; WX 732 ; N uni28DF ; G 2912\nU 10464 ; WX 732 ; N uni28E0 ; G 2913\nU 10465 ; WX 732 ; N uni28E1 ; G 2914\nU 10466 ; WX 732 ; N uni28E2 ; G 2915\nU 10467 ; WX 732 ; N uni28E3 ; G 2916\nU 10468 ; WX 732 ; N uni28E4 ; G 2917\nU 10469 ; WX 732 ; N uni28E5 ; G 2918\nU 10470 ; WX 732 ; N uni28E6 ; G 2919\nU 10471 ; WX 732 ; N uni28E7 ; G 2920\nU 10472 ; WX 732 ; N uni28E8 ; G 2921\nU 10473 ; WX 732 ; N uni28E9 ; G 2922\nU 10474 ; WX 732 ; N uni28EA ; G 2923\nU 10475 ; WX 732 ; N uni28EB ; G 2924\nU 10476 ; WX 732 ; N uni28EC ; G 2925\nU 10477 ; WX 732 ; N uni28ED ; G 2926\nU 10478 ; WX 732 ; N uni28EE ; G 2927\nU 10479 ; WX 732 ; N uni28EF ; G 2928\nU 10480 ; WX 732 ; N uni28F0 ; G 2929\nU 10481 ; WX 732 ; N uni28F1 ; G 2930\nU 10482 ; WX 732 ; N uni28F2 ; G 2931\nU 10483 ; WX 732 ; N uni28F3 ; G 2932\nU 10484 ; WX 732 ; N uni28F4 ; G 2933\nU 10485 ; WX 732 ; N uni28F5 ; G 2934\nU 10486 ; WX 732 ; N uni28F6 ; G 2935\nU 10487 ; WX 732 ; N uni28F7 ; G 2936\nU 10488 ; WX 732 ; N uni28F8 ; G 2937\nU 10489 ; WX 732 ; N uni28F9 ; G 2938\nU 10490 ; WX 732 ; N uni28FA ; G 2939\nU 10491 ; WX 732 ; N uni28FB ; G 2940\nU 10492 ; WX 732 ; N uni28FC ; G 2941\nU 10493 ; WX 732 ; N uni28FD ; G 2942\nU 10494 ; WX 732 ; N uni28FE ; G 2943\nU 10495 ; WX 732 ; N uni28FF ; G 2944\nU 10496 ; WX 838 ; N uni2900 ; G 2945\nU 10497 ; WX 838 ; N uni2901 ; G 2946\nU 10498 ; WX 838 ; N uni2902 ; G 2947\nU 10499 ; WX 838 ; N uni2903 ; G 2948\nU 10500 ; WX 838 ; N uni2904 ; G 2949\nU 10501 ; WX 838 ; N uni2905 ; G 2950\nU 10502 ; WX 838 ; N uni2906 ; G 2951\nU 10503 ; WX 838 ; N uni2907 ; G 2952\nU 10504 ; WX 838 ; N uni2908 ; G 2953\nU 10505 ; WX 838 ; N uni2909 ; G 2954\nU 10506 ; WX 838 ; N uni290A ; G 2955\nU 10507 ; WX 838 ; N uni290B ; G 2956\nU 10508 ; WX 838 ; N uni290C ; G 2957\nU 10509 ; WX 838 ; N uni290D ; G 2958\nU 10510 ; WX 838 ; N uni290E ; G 2959\nU 10511 ; WX 838 ; N uni290F ; G 2960\nU 10512 ; WX 838 ; N uni2910 ; G 2961\nU 10513 ; WX 838 ; N uni2911 ; G 2962\nU 10514 ; WX 838 ; N uni2912 ; G 2963\nU 10515 ; WX 838 ; N uni2913 ; G 2964\nU 10516 ; WX 838 ; N uni2914 ; G 2965\nU 10517 ; WX 838 ; N uni2915 ; G 2966\nU 10518 ; WX 838 ; N uni2916 ; G 2967\nU 10519 ; WX 838 ; N uni2917 ; G 2968\nU 10520 ; WX 838 ; N uni2918 ; G 2969\nU 10521 ; WX 838 ; N uni2919 ; G 2970\nU 10522 ; WX 838 ; N uni291A ; G 2971\nU 10523 ; WX 838 ; N uni291B ; G 2972\nU 10524 ; WX 838 ; N uni291C ; G 2973\nU 10525 ; WX 838 ; N uni291D ; G 2974\nU 10526 ; WX 838 ; N uni291E ; G 2975\nU 10527 ; WX 838 ; N uni291F ; G 2976\nU 10528 ; WX 838 ; N uni2920 ; G 2977\nU 10529 ; WX 838 ; N uni2921 ; G 2978\nU 10530 ; WX 838 ; N uni2922 ; G 2979\nU 10531 ; WX 838 ; N uni2923 ; G 2980\nU 10532 ; WX 838 ; N uni2924 ; G 2981\nU 10533 ; WX 838 ; N uni2925 ; G 2982\nU 10534 ; WX 838 ; N uni2926 ; G 2983\nU 10535 ; WX 838 ; N uni2927 ; G 2984\nU 10536 ; WX 838 ; N uni2928 ; G 2985\nU 10537 ; WX 838 ; N uni2929 ; G 2986\nU 10538 ; WX 838 ; N uni292A ; G 2987\nU 10539 ; WX 838 ; N uni292B ; G 2988\nU 10540 ; WX 838 ; N uni292C ; G 2989\nU 10541 ; WX 838 ; N uni292D ; G 2990\nU 10542 ; WX 838 ; N uni292E ; G 2991\nU 10543 ; WX 838 ; N uni292F ; G 2992\nU 10544 ; WX 838 ; N uni2930 ; G 2993\nU 10545 ; WX 838 ; N uni2931 ; G 2994\nU 10546 ; WX 838 ; N uni2932 ; G 2995\nU 10547 ; WX 838 ; N uni2933 ; G 2996\nU 10548 ; WX 838 ; N uni2934 ; G 2997\nU 10549 ; WX 838 ; N uni2935 ; G 2998\nU 10550 ; WX 838 ; N uni2936 ; G 2999\nU 10551 ; WX 838 ; N uni2937 ; G 3000\nU 10552 ; WX 838 ; N uni2938 ; G 3001\nU 10553 ; WX 838 ; N uni2939 ; G 3002\nU 10554 ; WX 838 ; N uni293A ; G 3003\nU 10555 ; WX 838 ; N uni293B ; G 3004\nU 10556 ; WX 838 ; N uni293C ; G 3005\nU 10557 ; WX 838 ; N uni293D ; G 3006\nU 10558 ; WX 838 ; N uni293E ; G 3007\nU 10559 ; WX 838 ; N uni293F ; G 3008\nU 10560 ; WX 838 ; N uni2940 ; G 3009\nU 10561 ; WX 838 ; N uni2941 ; G 3010\nU 10562 ; WX 838 ; N uni2942 ; G 3011\nU 10563 ; WX 838 ; N uni2943 ; G 3012\nU 10564 ; WX 838 ; N uni2944 ; G 3013\nU 10565 ; WX 838 ; N uni2945 ; G 3014\nU 10566 ; WX 838 ; N uni2946 ; G 3015\nU 10567 ; WX 838 ; N uni2947 ; G 3016\nU 10568 ; WX 838 ; N uni2948 ; G 3017\nU 10569 ; WX 838 ; N uni2949 ; G 3018\nU 10570 ; WX 838 ; N uni294A ; G 3019\nU 10571 ; WX 838 ; N uni294B ; G 3020\nU 10572 ; WX 838 ; N uni294C ; G 3021\nU 10573 ; WX 838 ; N uni294D ; G 3022\nU 10574 ; WX 838 ; N uni294E ; G 3023\nU 10575 ; WX 838 ; N uni294F ; G 3024\nU 10576 ; WX 838 ; N uni2950 ; G 3025\nU 10577 ; WX 838 ; N uni2951 ; G 3026\nU 10578 ; WX 838 ; N uni2952 ; G 3027\nU 10579 ; WX 838 ; N uni2953 ; G 3028\nU 10580 ; WX 838 ; N uni2954 ; G 3029\nU 10581 ; WX 838 ; N uni2955 ; G 3030\nU 10582 ; WX 838 ; N uni2956 ; G 3031\nU 10583 ; WX 838 ; N uni2957 ; G 3032\nU 10584 ; WX 838 ; N uni2958 ; G 3033\nU 10585 ; WX 838 ; N uni2959 ; G 3034\nU 10586 ; WX 838 ; N uni295A ; G 3035\nU 10587 ; WX 838 ; N uni295B ; G 3036\nU 10588 ; WX 838 ; N uni295C ; G 3037\nU 10589 ; WX 838 ; N uni295D ; G 3038\nU 10590 ; WX 838 ; N uni295E ; G 3039\nU 10591 ; WX 838 ; N uni295F ; G 3040\nU 10592 ; WX 838 ; N uni2960 ; G 3041\nU 10593 ; WX 838 ; N uni2961 ; G 3042\nU 10594 ; WX 838 ; N uni2962 ; G 3043\nU 10595 ; WX 838 ; N uni2963 ; G 3044\nU 10596 ; WX 838 ; N uni2964 ; G 3045\nU 10597 ; WX 838 ; N uni2965 ; G 3046\nU 10598 ; WX 838 ; N uni2966 ; G 3047\nU 10599 ; WX 838 ; N uni2967 ; G 3048\nU 10600 ; WX 838 ; N uni2968 ; G 3049\nU 10601 ; WX 838 ; N uni2969 ; G 3050\nU 10602 ; WX 838 ; N uni296A ; G 3051\nU 10603 ; WX 838 ; N uni296B ; G 3052\nU 10604 ; WX 838 ; N uni296C ; G 3053\nU 10605 ; WX 838 ; N uni296D ; G 3054\nU 10606 ; WX 838 ; N uni296E ; G 3055\nU 10607 ; WX 838 ; N uni296F ; G 3056\nU 10608 ; WX 838 ; N uni2970 ; G 3057\nU 10609 ; WX 838 ; N uni2971 ; G 3058\nU 10610 ; WX 838 ; N uni2972 ; G 3059\nU 10611 ; WX 838 ; N uni2973 ; G 3060\nU 10612 ; WX 838 ; N uni2974 ; G 3061\nU 10613 ; WX 838 ; N uni2975 ; G 3062\nU 10614 ; WX 838 ; N uni2976 ; G 3063\nU 10615 ; WX 981 ; N uni2977 ; G 3064\nU 10616 ; WX 838 ; N uni2978 ; G 3065\nU 10617 ; WX 838 ; N uni2979 ; G 3066\nU 10618 ; WX 984 ; N uni297A ; G 3067\nU 10619 ; WX 838 ; N uni297B ; G 3068\nU 10620 ; WX 838 ; N uni297C ; G 3069\nU 10621 ; WX 838 ; N uni297D ; G 3070\nU 10622 ; WX 838 ; N uni297E ; G 3071\nU 10623 ; WX 838 ; N uni297F ; G 3072\nU 10731 ; WX 494 ; N uni29EB ; G 3073\nU 10764 ; WX 1513 ; N uni2A0C ; G 3074\nU 10765 ; WX 521 ; N uni2A0D ; G 3075\nU 10766 ; WX 521 ; N uni2A0E ; G 3076\nU 10799 ; WX 838 ; N uni2A2F ; G 3077\nU 10858 ; WX 838 ; N uni2A6A ; G 3078\nU 10859 ; WX 838 ; N uni2A6B ; G 3079\nU 11008 ; WX 838 ; N uni2B00 ; G 3080\nU 11009 ; WX 838 ; N uni2B01 ; G 3081\nU 11010 ; WX 838 ; N uni2B02 ; G 3082\nU 11011 ; WX 838 ; N uni2B03 ; G 3083\nU 11012 ; WX 838 ; N uni2B04 ; G 3084\nU 11013 ; WX 838 ; N uni2B05 ; G 3085\nU 11014 ; WX 838 ; N uni2B06 ; G 3086\nU 11015 ; WX 838 ; N uni2B07 ; G 3087\nU 11016 ; WX 838 ; N uni2B08 ; G 3088\nU 11017 ; WX 838 ; N uni2B09 ; G 3089\nU 11018 ; WX 838 ; N uni2B0A ; G 3090\nU 11019 ; WX 838 ; N uni2B0B ; G 3091\nU 11020 ; WX 838 ; N uni2B0C ; G 3092\nU 11021 ; WX 838 ; N uni2B0D ; G 3093\nU 11022 ; WX 838 ; N uni2B0E ; G 3094\nU 11023 ; WX 838 ; N uni2B0F ; G 3095\nU 11024 ; WX 838 ; N uni2B10 ; G 3096\nU 11025 ; WX 838 ; N uni2B11 ; G 3097\nU 11026 ; WX 945 ; N uni2B12 ; G 3098\nU 11027 ; WX 945 ; N uni2B13 ; G 3099\nU 11028 ; WX 945 ; N uni2B14 ; G 3100\nU 11029 ; WX 945 ; N uni2B15 ; G 3101\nU 11030 ; WX 769 ; N uni2B16 ; G 3102\nU 11031 ; WX 769 ; N uni2B17 ; G 3103\nU 11032 ; WX 769 ; N uni2B18 ; G 3104\nU 11033 ; WX 769 ; N uni2B19 ; G 3105\nU 11034 ; WX 945 ; N uni2B1A ; G 3106\nU 11360 ; WX 664 ; N uni2C60 ; G 3107\nU 11361 ; WX 320 ; N uni2C61 ; G 3108\nU 11363 ; WX 673 ; N uni2C63 ; G 3109\nU 11364 ; WX 753 ; N uni2C64 ; G 3110\nU 11367 ; WX 872 ; N uni2C67 ; G 3111\nU 11368 ; WX 644 ; N uni2C68 ; G 3112\nU 11369 ; WX 747 ; N uni2C69 ; G 3113\nU 11370 ; WX 606 ; N uni2C6A ; G 3114\nU 11371 ; WX 695 ; N uni2C6B ; G 3115\nU 11372 ; WX 527 ; N uni2C6C ; G 3116\nU 11373 ; WX 782 ; N uni2C6D ; G 3117\nU 11374 ; WX 1024 ; N uni2C6E ; G 3118\nU 11375 ; WX 722 ; N uni2C6F ; G 3119\nU 11376 ; WX 782 ; N uni2C70 ; G 3120\nU 11377 ; WX 663 ; N uni2C71 ; G 3121\nU 11378 ; WX 1130 ; N uni2C72 ; G 3122\nU 11379 ; WX 939 ; N uni2C73 ; G 3123\nU 11381 ; WX 740 ; N uni2C75 ; G 3124\nU 11382 ; WX 556 ; N uni2C76 ; G 3125\nU 11383 ; WX 700 ; N uni2C77 ; G 3126\nU 11385 ; WX 501 ; N uni2C79 ; G 3127\nU 11386 ; WX 602 ; N uni2C7A ; G 3128\nU 11387 ; WX 553 ; N uni2C7B ; G 3129\nU 11388 ; WX 264 ; N uni2C7C ; G 3130\nU 11389 ; WX 455 ; N uni2C7D ; G 3131\nU 11390 ; WX 685 ; N uni2C7E ; G 3132\nU 11391 ; WX 695 ; N uni2C7F ; G 3133\nU 11520 ; WX 773 ; N uni2D00 ; G 3134\nU 11521 ; WX 635 ; N uni2D01 ; G 3135\nU 11522 ; WX 633 ; N uni2D02 ; G 3136\nU 11523 ; WX 658 ; N uni2D03 ; G 3137\nU 11524 ; WX 631 ; N uni2D04 ; G 3138\nU 11525 ; WX 962 ; N uni2D05 ; G 3139\nU 11526 ; WX 756 ; N uni2D06 ; G 3140\nU 11527 ; WX 960 ; N uni2D07 ; G 3141\nU 11528 ; WX 617 ; N uni2D08 ; G 3142\nU 11529 ; WX 646 ; N uni2D09 ; G 3143\nU 11530 ; WX 962 ; N uni2D0A ; G 3144\nU 11531 ; WX 632 ; N uni2D0B ; G 3145\nU 11532 ; WX 646 ; N uni2D0C ; G 3146\nU 11533 ; WX 962 ; N uni2D0D ; G 3147\nU 11534 ; WX 645 ; N uni2D0E ; G 3148\nU 11535 ; WX 866 ; N uni2D0F ; G 3149\nU 11536 ; WX 961 ; N uni2D10 ; G 3150\nU 11537 ; WX 645 ; N uni2D11 ; G 3151\nU 11538 ; WX 645 ; N uni2D12 ; G 3152\nU 11539 ; WX 959 ; N uni2D13 ; G 3153\nU 11540 ; WX 945 ; N uni2D14 ; G 3154\nU 11541 ; WX 863 ; N uni2D15 ; G 3155\nU 11542 ; WX 644 ; N uni2D16 ; G 3156\nU 11543 ; WX 646 ; N uni2D17 ; G 3157\nU 11544 ; WX 645 ; N uni2D18 ; G 3158\nU 11545 ; WX 649 ; N uni2D19 ; G 3159\nU 11546 ; WX 688 ; N uni2D1A ; G 3160\nU 11547 ; WX 634 ; N uni2D1B ; G 3161\nU 11548 ; WX 982 ; N uni2D1C ; G 3162\nU 11549 ; WX 681 ; N uni2D1D ; G 3163\nU 11550 ; WX 676 ; N uni2D1E ; G 3164\nU 11551 ; WX 852 ; N uni2D1F ; G 3165\nU 11552 ; WX 957 ; N uni2D20 ; G 3166\nU 11553 ; WX 632 ; N uni2D21 ; G 3167\nU 11554 ; WX 645 ; N uni2D22 ; G 3168\nU 11555 ; WX 646 ; N uni2D23 ; G 3169\nU 11556 ; WX 749 ; N uni2D24 ; G 3170\nU 11557 ; WX 914 ; N uni2D25 ; G 3171\nU 11800 ; WX 536 ; N uni2E18 ; G 3172\nU 11807 ; WX 838 ; N uni2E1F ; G 3173\nU 11810 ; WX 390 ; N uni2E22 ; G 3174\nU 11811 ; WX 390 ; N uni2E23 ; G 3175\nU 11812 ; WX 390 ; N uni2E24 ; G 3176\nU 11813 ; WX 390 ; N uni2E25 ; G 3177\nU 11822 ; WX 536 ; N uni2E2E ; G 3178\nU 42564 ; WX 685 ; N uniA644 ; G 3179\nU 42565 ; WX 513 ; N uniA645 ; G 3180\nU 42566 ; WX 395 ; N uniA646 ; G 3181\nU 42567 ; WX 392 ; N uniA647 ; G 3182\nU 42576 ; WX 1104 ; N uniA650 ; G 3183\nU 42577 ; WX 888 ; N uniA651 ; G 3184\nU 42580 ; WX 1193 ; N uniA654 ; G 3185\nU 42581 ; WX 871 ; N uniA655 ; G 3186\nU 42582 ; WX 1140 ; N uniA656 ; G 3187\nU 42583 ; WX 899 ; N uniA657 ; G 3188\nU 42648 ; WX 1416 ; N uniA698 ; G 3189\nU 42649 ; WX 999 ; N uniA699 ; G 3190\nU 42760 ; WX 493 ; N uniA708 ; G 3191\nU 42761 ; WX 493 ; N uniA709 ; G 3192\nU 42762 ; WX 493 ; N uniA70A ; G 3193\nU 42763 ; WX 493 ; N uniA70B ; G 3194\nU 42764 ; WX 493 ; N uniA70C ; G 3195\nU 42765 ; WX 493 ; N uniA70D ; G 3196\nU 42766 ; WX 493 ; N uniA70E ; G 3197\nU 42767 ; WX 493 ; N uniA70F ; G 3198\nU 42768 ; WX 493 ; N uniA710 ; G 3199\nU 42769 ; WX 493 ; N uniA711 ; G 3200\nU 42770 ; WX 493 ; N uniA712 ; G 3201\nU 42771 ; WX 493 ; N uniA713 ; G 3202\nU 42772 ; WX 493 ; N uniA714 ; G 3203\nU 42773 ; WX 493 ; N uniA715 ; G 3204\nU 42774 ; WX 493 ; N uniA716 ; G 3205\nU 42779 ; WX 369 ; N uniA71B ; G 3206\nU 42780 ; WX 369 ; N uniA71C ; G 3207\nU 42781 ; WX 253 ; N uniA71D ; G 3208\nU 42782 ; WX 253 ; N uniA71E ; G 3209\nU 42783 ; WX 253 ; N uniA71F ; G 3210\nU 42790 ; WX 872 ; N uniA726 ; G 3211\nU 42791 ; WX 634 ; N uniA727 ; G 3212\nU 42792 ; WX 843 ; N uniA728 ; G 3213\nU 42793 ; WX 754 ; N uniA729 ; G 3214\nU 42794 ; WX 612 ; N uniA72A ; G 3215\nU 42795 ; WX 560 ; N uniA72B ; G 3216\nU 42796 ; WX 548 ; N uniA72C ; G 3217\nU 42797 ; WX 531 ; N uniA72D ; G 3218\nU 42798 ; WX 629 ; N uniA72E ; G 3219\nU 42799 ; WX 610 ; N uniA72F ; G 3220\nU 42800 ; WX 514 ; N uniA730 ; G 3221\nU 42801 ; WX 513 ; N uniA731 ; G 3222\nU 42802 ; WX 1195 ; N uniA732 ; G 3223\nU 42803 ; WX 944 ; N uniA733 ; G 3224\nU 42804 ; WX 1226 ; N uniA734 ; G 3225\nU 42805 ; WX 950 ; N uniA735 ; G 3226\nU 42806 ; WX 1149 ; N uniA736 ; G 3227\nU 42807 ; WX 934 ; N uniA737 ; G 3228\nU 42808 ; WX 968 ; N uniA738 ; G 3229\nU 42809 ; WX 784 ; N uniA739 ; G 3230\nU 42810 ; WX 968 ; N uniA73A ; G 3231\nU 42811 ; WX 784 ; N uniA73B ; G 3232\nU 42812 ; WX 962 ; N uniA73C ; G 3233\nU 42813 ; WX 824 ; N uniA73D ; G 3234\nU 42814 ; WX 765 ; N uniA73E ; G 3235\nU 42815 ; WX 560 ; N uniA73F ; G 3236\nU 42816 ; WX 774 ; N uniA740 ; G 3237\nU 42817 ; WX 625 ; N uniA741 ; G 3238\nU 42822 ; WX 787 ; N uniA746 ; G 3239\nU 42823 ; WX 434 ; N uniA747 ; G 3240\nU 42826 ; WX 932 ; N uniA74A ; G 3241\nU 42827 ; WX 711 ; N uniA74B ; G 3242\nU 42830 ; WX 1416 ; N uniA74E ; G 3243\nU 42831 ; WX 999 ; N uniA74F ; G 3244\nU 42856 ; WX 707 ; N uniA768 ; G 3245\nU 42857 ; WX 610 ; N uniA769 ; G 3246\nU 42875 ; WX 612 ; N uniA77B ; G 3247\nU 42876 ; WX 478 ; N uniA77C ; G 3248\nU 42880 ; WX 664 ; N uniA780 ; G 3249\nU 42881 ; WX 320 ; N uniA781 ; G 3250\nU 42882 ; WX 843 ; N uniA782 ; G 3251\nU 42883 ; WX 644 ; N uniA783 ; G 3252\nU 42884 ; WX 612 ; N uniA784 ; G 3253\nU 42885 ; WX 478 ; N uniA785 ; G 3254\nU 42886 ; WX 765 ; N uniA786 ; G 3255\nU 42887 ; WX 560 ; N uniA787 ; G 3256\nU 42891 ; WX 402 ; N uniA78B ; G 3257\nU 42892 ; WX 275 ; N uniA78C ; G 3258\nU 42893 ; WX 773 ; N uniA78D ; G 3259\nU 42896 ; WX 875 ; N uniA790 ; G 3260\nU 42897 ; WX 644 ; N uniA791 ; G 3261\nU 42922 ; WX 872 ; N uniA7AA ; G 3262\nU 43000 ; WX 549 ; N uniA7F8 ; G 3263\nU 43001 ; WX 623 ; N uniA7F9 ; G 3264\nU 43002 ; WX 957 ; N uniA7FA ; G 3265\nU 43003 ; WX 694 ; N uniA7FB ; G 3266\nU 43004 ; WX 673 ; N uniA7FC ; G 3267\nU 43005 ; WX 1024 ; N uniA7FD ; G 3268\nU 43006 ; WX 395 ; N uniA7FE ; G 3269\nU 43007 ; WX 1201 ; N uniA7FF ; G 3270\nU 62464 ; WX 654 ; N uniF400 ; G 3271\nU 62465 ; WX 665 ; N uniF401 ; G 3272\nU 62466 ; WX 714 ; N uniF402 ; G 3273\nU 62467 ; WX 947 ; N uniF403 ; G 3274\nU 62468 ; WX 665 ; N uniF404 ; G 3275\nU 62469 ; WX 659 ; N uniF405 ; G 3276\nU 62470 ; WX 725 ; N uniF406 ; G 3277\nU 62471 ; WX 986 ; N uniF407 ; G 3278\nU 62472 ; WX 665 ; N uniF408 ; G 3279\nU 62473 ; WX 665 ; N uniF409 ; G 3280\nU 62474 ; WX 1257 ; N uniF40A ; G 3281\nU 62475 ; WX 683 ; N uniF40B ; G 3282\nU 62476 ; WX 682 ; N uniF40C ; G 3283\nU 62477 ; WX 953 ; N uniF40D ; G 3284\nU 62478 ; WX 665 ; N uniF40E ; G 3285\nU 62479 ; WX 682 ; N uniF40F ; G 3286\nU 62480 ; WX 999 ; N uniF410 ; G 3287\nU 62481 ; WX 746 ; N uniF411 ; G 3288\nU 62482 ; WX 798 ; N uniF412 ; G 3289\nU 62483 ; WX 748 ; N uniF413 ; G 3290\nU 62484 ; WX 944 ; N uniF414 ; G 3291\nU 62485 ; WX 681 ; N uniF415 ; G 3292\nU 62486 ; WX 936 ; N uniF416 ; G 3293\nU 62487 ; WX 680 ; N uniF417 ; G 3294\nU 62488 ; WX 688 ; N uniF418 ; G 3295\nU 62489 ; WX 682 ; N uniF419 ; G 3296\nU 62490 ; WX 729 ; N uniF41A ; G 3297\nU 62491 ; WX 682 ; N uniF41B ; G 3298\nU 62492 ; WX 688 ; N uniF41C ; G 3299\nU 62493 ; WX 666 ; N uniF41D ; G 3300\nU 62494 ; WX 729 ; N uniF41E ; G 3301\nU 62495 ; WX 884 ; N uniF41F ; G 3302\nU 62496 ; WX 665 ; N uniF420 ; G 3303\nU 62497 ; WX 706 ; N uniF421 ; G 3304\nU 62498 ; WX 666 ; N uniF422 ; G 3305\nU 62499 ; WX 665 ; N uniF423 ; G 3306\nU 62500 ; WX 665 ; N uniF424 ; G 3307\nU 62501 ; WX 722 ; N uniF425 ; G 3308\nU 62502 ; WX 961 ; N uniF426 ; G 3309\nU 62504 ; WX 904 ; N uniF428 ; G 3310\nU 63173 ; WX 602 ; N uniF6C5 ; G 3311\nU 63185 ; WX 500 ; N cyrBreve ; G 3312\nU 63188 ; WX 500 ; N cyrbreve ; G 3313\nU 64256 ; WX 710 ; N uniFB00 ; G 3314\nU 64257 ; WX 667 ; N fi ; G 3315\nU 64258 ; WX 667 ; N fl ; G 3316\nU 64259 ; WX 1028 ; N uniFB03 ; G 3317\nU 64260 ; WX 1030 ; N uniFB04 ; G 3318\nU 64261 ; WX 771 ; N uniFB05 ; G 3319\nU 64262 ; WX 933 ; N uniFB06 ; G 3320\nU 65024 ; WX 0 ; N uniFE00 ; G 3321\nU 65025 ; WX 0 ; N uniFE01 ; G 3322\nU 65026 ; WX 0 ; N uniFE02 ; G 3323\nU 65027 ; WX 0 ; N uniFE03 ; G 3324\nU 65028 ; WX 0 ; N uniFE04 ; G 3325\nU 65029 ; WX 0 ; N uniFE05 ; G 3326\nU 65030 ; WX 0 ; N uniFE06 ; G 3327\nU 65031 ; WX 0 ; N uniFE07 ; G 3328\nU 65032 ; WX 0 ; N uniFE08 ; G 3329\nU 65033 ; WX 0 ; N uniFE09 ; G 3330\nU 65034 ; WX 0 ; N uniFE0A ; G 3331\nU 65035 ; WX 0 ; N uniFE0B ; G 3332\nU 65036 ; WX 0 ; N uniFE0C ; G 3333\nU 65037 ; WX 0 ; N uniFE0D ; G 3334\nU 65038 ; WX 0 ; N uniFE0E ; G 3335\nU 65039 ; WX 0 ; N uniFE0F ; G 3336\nU 65529 ; WX 0 ; N uniFFF9 ; G 3337\nU 65530 ; WX 0 ; N uniFFFA ; G 3338\nU 65531 ; WX 0 ; N uniFFFB ; G 3339\nU 65532 ; WX 0 ; N uniFFFC ; G 3340\nU 65533 ; WX 1025 ; N uniFFFD ; G 3341\nEndCharMetrics\nStartKernData \nStartKernPairs 1367\n\nKPX dollar seven -112\nKPX dollar nine -102\nKPX dollar colon -83\nKPX dollar less -83\nKPX dollar I -36\nKPX dollar W -36\nKPX dollar Y -83\nKPX dollar Z -92\nKPX dollar backslash -83\nKPX dollar questiondown -83\nKPX dollar Aacute -83\nKPX dollar Hcircumflex -112\nKPX dollar hcircumflex -36\nKPX dollar Hbar -112\nKPX dollar hbar -36\nKPX dollar Kcommaaccent -83\nKPX dollar kcommaaccent -92\nKPX dollar kgreenlandic -83\nKPX dollar Lacute -83\nKPX dollar lacute -83\nKPX dollar uni01DC -112\nKPX dollar uni01DD -36\nKPX dollar uni01F4 -83\n\nKPX percent ampersand 38\nKPX percent asterisk 38\nKPX percent two 38\nKPX percent less -36\nKPX percent Egrave 38\nKPX percent Ecircumflex 38\nKPX percent Igrave 38\nKPX percent Icircumflex 38\nKPX percent Thorn 38\nKPX percent agrave 38\nKPX percent acircumflex 38\nKPX percent adieresis 38\nKPX percent Dcaron 38\nKPX percent Dcroat 38\nKPX percent Emacron 38\nKPX percent Ebreve 38\nKPX percent kgreenlandic -36\nKPX percent lacute -36\nKPX percent uni01AC 38\nKPX percent uni01AE 38\nKPX percent uni01F0 38\nKPX percent uni01F4 -36\n\n\nKPX quotesingle nine -36\n\n\nKPX parenright dollar -178\nKPX parenright D -139\nKPX parenright H -112\nKPX parenright R -112\nKPX parenright cent -139\nKPX parenright sterling -139\nKPX parenright currency -139\nKPX parenright yen -139\nKPX parenright brokenbar -139\nKPX parenright section -139\nKPX parenright dieresis -139\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -112\nKPX parenright mu -112\nKPX parenright paragraph -112\nKPX parenright periodcentered -112\nKPX parenright cedilla -112\nKPX parenright ordmasculine -112\nKPX parenright Acircumflex -178\nKPX parenright Atilde -139\nKPX parenright Adieresis -178\nKPX parenright Aring -139\nKPX parenright AE -178\nKPX parenright Ccedilla -139\nKPX parenright Otilde -112\nKPX parenright multiply -112\nKPX parenright Ugrave -112\nKPX parenright Ucircumflex -112\nKPX parenright Yacute -112\nKPX parenright dcaron -112\nKPX parenright dmacron -112\nKPX parenright emacron -112\nKPX parenright ebreve -112\nKPX parenright uni01A5 -139\nKPX parenright uni01AD -112\nKPX parenright Uhorn -112\nKPX parenright uni01F1 -112\n\nKPX asterisk less -36\nKPX asterisk lacute -36\n\n\nKPX period dollar -83\nKPX period ampersand -55\nKPX period two -55\nKPX period eight -73\nKPX period colon -73\nKPX period less -55\nKPX period H -55\nKPX period R -55\nKPX period X -45\nKPX period backslash -131\nKPX period ordfeminine -55\nKPX period guillemotleft -55\nKPX period logicalnot -55\nKPX period sfthyphen -55\nKPX period acute -55\nKPX period mu -55\nKPX period paragraph -55\nKPX period periodcentered -55\nKPX period cedilla -55\nKPX period ordmasculine -36\nKPX period guillemotright -45\nKPX period onequarter -45\nKPX period onehalf -45\nKPX period threequarters -45\nKPX period questiondown -131\nKPX period Aacute -131\nKPX period Egrave -55\nKPX period Icircumflex -55\nKPX period Yacute -55\nKPX period Ebreve -55\nKPX period ebreve -55\nKPX period Idot -73\nKPX period dotlessi -45\nKPX period lacute -55\n\nKPX slash seven -167\nKPX slash eight -112\nKPX slash nine -243\nKPX slash colon -178\nKPX slash less -131\nKPX slash backslash -36\nKPX slash questiondown -36\nKPX slash Aacute -36\nKPX slash Hbar -167\nKPX slash Idot -112\nKPX slash lacute -131\n\n\nKPX two nine -36\nKPX two semicolon -36\n\nKPX three dollar -188\nKPX three eight -36\nKPX three D -92\nKPX three H -92\nKPX three R -83\nKPX three V -55\nKPX three cent -92\nKPX three sterling -92\nKPX three currency -92\nKPX three yen -92\nKPX three brokenbar -92\nKPX three section -92\nKPX three dieresis -92\nKPX three ordfeminine -92\nKPX three guillemotleft -92\nKPX three logicalnot -92\nKPX three sfthyphen -92\nKPX three acute -83\nKPX three mu -83\nKPX three paragraph -83\nKPX three periodcentered -83\nKPX three cedilla -83\nKPX three ordmasculine -83\nKPX three Yacute -92\nKPX three ebreve -83\nKPX three gdotaccent -55\nKPX three gcommaaccent -55\nKPX three Idot -36\n\n\nKPX five seven -36\nKPX five nine -73\nKPX five colon -45\nKPX five less -63\nKPX five D 47\nKPX five backslash -36\nKPX five cent 47\nKPX five sterling 47\nKPX five currency 47\nKPX five yen 47\nKPX five brokenbar 47\nKPX five section 47\nKPX five dieresis 47\nKPX five ordmasculine 38\nKPX five questiondown -36\nKPX five Aacute -36\nKPX five Hbar -36\nKPX five lacute -63\n\nKPX six six -36\nKPX six Gdotaccent -36\nKPX six Gcommaaccent -36\n\nKPX seven dollar -112\nKPX seven seven 38\nKPX seven D -159\nKPX seven F -159\nKPX seven H -159\nKPX seven R -159\nKPX seven V -149\nKPX seven Z -73\nKPX seven cent -59\nKPX seven sterling -159\nKPX seven currency -59\nKPX seven yen -59\nKPX seven brokenbar -59\nKPX seven section -59\nKPX seven dieresis -159\nKPX seven copyright -159\nKPX seven ordfeminine -99\nKPX seven guillemotleft -159\nKPX seven logicalnot -99\nKPX seven sfthyphen -99\nKPX seven acute -79\nKPX seven mu -159\nKPX seven paragraph -79\nKPX seven periodcentered -79\nKPX seven cedilla -79\nKPX seven ordmasculine -159\nKPX seven Eacute -159\nKPX seven Idieresis -159\nKPX seven Yacute -159\nKPX seven ebreve -159\nKPX seven gdotaccent -149\nKPX seven gcommaaccent -149\nKPX seven Hbar 38\n\nKPX eight dollar -63\nKPX eight hyphen -55\n\nKPX nine dollar -139\nKPX nine two -36\nKPX nine D -188\nKPX nine H -188\nKPX nine L -36\nKPX nine R -188\nKPX nine X -131\nKPX nine backslash -83\nKPX nine cent -188\nKPX nine sterling -188\nKPX nine currency -188\nKPX nine yen -188\nKPX nine brokenbar -188\nKPX nine section -188\nKPX nine dieresis -188\nKPX nine ordfeminine -188\nKPX nine guillemotleft -188\nKPX nine logicalnot -188\nKPX nine sfthyphen -188\nKPX nine acute -188\nKPX nine mu -188\nKPX nine paragraph -188\nKPX nine periodcentered -188\nKPX nine cedilla -188\nKPX nine ordmasculine -188\nKPX nine guillemotright -131\nKPX nine onequarter -131\nKPX nine onehalf -131\nKPX nine threequarters -131\nKPX nine questiondown -83\nKPX nine Aacute -83\nKPX nine Yacute -188\nKPX nine Ebreve -36\nKPX nine ebreve -188\nKPX nine dotlessi -131\n\nKPX colon dollar -102\nKPX colon D -178\nKPX colon H -167\nKPX colon L -36\nKPX colon R -139\nKPX colon U -92\nKPX colon X -83\nKPX colon backslash -45\nKPX colon cent -178\nKPX colon sterling -178\nKPX colon currency -178\nKPX colon yen -178\nKPX colon brokenbar -178\nKPX colon section -178\nKPX colon dieresis -139\nKPX colon ordfeminine -167\nKPX colon guillemotleft -167\nKPX colon logicalnot -167\nKPX colon sfthyphen -167\nKPX colon acute -139\nKPX colon mu -139\nKPX colon paragraph -139\nKPX colon periodcentered -139\nKPX colon cedilla -139\nKPX colon ordmasculine -139\nKPX colon guillemotright -83\nKPX colon onequarter -83\nKPX colon onehalf -83\nKPX colon threequarters -83\nKPX colon questiondown -45\nKPX colon Aacute -45\nKPX colon Yacute -167\nKPX colon ebreve -139\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -83\n\nKPX semicolon dollar -73\nKPX semicolon ampersand -36\nKPX semicolon two -36\nKPX semicolon Egrave -36\nKPX semicolon Icircumflex -36\nKPX semicolon Ebreve -36\n\nKPX less dollar -159\nKPX less ampersand -36\nKPX less D -159\nKPX less H -178\nKPX less L -36\nKPX less R -178\nKPX less X -178\nKPX less cent -159\nKPX less sterling -159\nKPX less currency -159\nKPX less yen -159\nKPX less brokenbar -159\nKPX less section -159\nKPX less dieresis -196\nKPX less ordfeminine -178\nKPX less guillemotleft -178\nKPX less logicalnot -178\nKPX less sfthyphen -178\nKPX less acute -178\nKPX less mu -178\nKPX less paragraph -178\nKPX less periodcentered -178\nKPX less cedilla -178\nKPX less ordmasculine -178\nKPX less guillemotright -178\nKPX less onequarter -178\nKPX less onehalf -178\nKPX less threequarters -178\nKPX less Egrave -36\nKPX less Icircumflex -36\nKPX less Yacute -178\nKPX less ebreve -215\nKPX less dotlessi -178\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nKPX Acircumflex seven -112\nKPX Acircumflex nine -102\nKPX Acircumflex colon -83\nKPX Acircumflex less -83\nKPX Acircumflex I -36\nKPX Acircumflex W -36\nKPX Acircumflex Y -83\nKPX Acircumflex Z -92\nKPX Acircumflex backslash -83\nKPX Acircumflex questiondown -83\nKPX Acircumflex Aacute -83\nKPX Acircumflex Hcircumflex -112\nKPX Acircumflex hcircumflex -36\nKPX Acircumflex Hbar -112\nKPX Acircumflex hbar -36\nKPX Acircumflex Kcommaaccent -83\nKPX Acircumflex kcommaaccent -92\nKPX Acircumflex kgreenlandic -83\nKPX Acircumflex Lacute -83\nKPX Acircumflex lacute -83\nKPX Acircumflex uni01DC -112\nKPX Acircumflex uni01DD -36\nKPX Acircumflex uni01F4 -83\n\nKPX Adieresis seven -112\nKPX Adieresis nine -102\nKPX Adieresis colon -83\nKPX Adieresis less -83\nKPX Adieresis I -36\nKPX Adieresis W -36\nKPX Adieresis Y -83\nKPX Adieresis Z -92\nKPX Adieresis backslash -83\nKPX Adieresis questiondown -83\nKPX Adieresis Aacute -83\nKPX Adieresis Hcircumflex -112\nKPX Adieresis hcircumflex -36\nKPX Adieresis Hbar -112\nKPX Adieresis hbar -36\nKPX Adieresis Kcommaaccent -83\nKPX Adieresis kcommaaccent -92\nKPX Adieresis kgreenlandic -83\nKPX Adieresis Lacute -83\nKPX Adieresis lacute -83\nKPX Adieresis uni01DC -112\nKPX Adieresis uni01DD -36\nKPX Adieresis uni01F4 -83\n\nKPX AE seven -112\nKPX AE nine -102\nKPX AE colon -83\nKPX AE less -83\nKPX AE I -36\nKPX AE W -36\nKPX AE Y -83\nKPX AE Z -92\nKPX AE backslash -83\nKPX AE questiondown -83\nKPX AE Aacute -83\nKPX AE Hcircumflex -112\nKPX AE hcircumflex -36\nKPX AE Hbar -112\nKPX AE hbar -36\nKPX AE Kcommaaccent -83\nKPX AE kcommaaccent -92\nKPX AE kgreenlandic -83\nKPX AE Lacute -83\nKPX AE lacute -83\nKPX AE uni01DC -112\nKPX AE uni01DD -36\nKPX AE uni01F4 -83\n\n\n\n\n\nKPX Eth nine -36\n\nKPX Ograve nine -36\n\n\nKPX agrave less -36\nKPX agrave lacute -36\n\nKPX ucircumflex seven -167\nKPX ucircumflex eight -112\nKPX ucircumflex nine -243\nKPX ucircumflex colon -178\nKPX ucircumflex less -131\nKPX ucircumflex backslash -36\nKPX ucircumflex questiondown -36\nKPX ucircumflex Aacute -36\nKPX ucircumflex Hbar -167\nKPX ucircumflex Idot -112\nKPX ucircumflex lacute -131\n\nKPX ydieresis seven -167\nKPX ydieresis eight -112\nKPX ydieresis nine -243\nKPX ydieresis colon -178\nKPX ydieresis less -131\nKPX ydieresis backslash -36\nKPX ydieresis questiondown -36\nKPX ydieresis Aacute -36\nKPX ydieresis Hbar -167\nKPX ydieresis Idot -112\nKPX ydieresis lacute -131\n\nKPX Abreve O -227\n\nKPX abreve seven -167\nKPX abreve eight -36\nKPX abreve nine -243\nKPX abreve colon -178\nKPX abreve less -206\nKPX abreve backslash -36\nKPX abreve questiondown -36\nKPX abreve Aacute -36\nKPX abreve Hbar -167\nKPX abreve Idot -36\nKPX abreve lacute -206\n\n\n\nKPX Edotaccent seven -36\nKPX Edotaccent nine -73\nKPX Edotaccent colon -45\nKPX Edotaccent less -63\nKPX Edotaccent D 47\nKPX Edotaccent backslash -36\nKPX Edotaccent cent 47\nKPX Edotaccent sterling 47\nKPX Edotaccent currency 47\nKPX Edotaccent yen 47\nKPX Edotaccent brokenbar 47\nKPX Edotaccent section 47\nKPX Edotaccent dieresis 47\nKPX Edotaccent ordmasculine 38\nKPX Edotaccent questiondown -36\nKPX Edotaccent Aacute -36\nKPX Edotaccent Hbar -36\nKPX Edotaccent lacute -63\n\n\nKPX Ecaron seven -36\nKPX Ecaron nine -73\nKPX Ecaron colon -45\nKPX Ecaron less -63\nKPX Ecaron D 47\nKPX Ecaron backslash -36\nKPX Ecaron cent 47\nKPX Ecaron sterling 47\nKPX Ecaron currency 47\nKPX Ecaron yen 47\nKPX Ecaron brokenbar 47\nKPX Ecaron section 47\nKPX Ecaron dieresis 47\nKPX Ecaron ordmasculine 38\nKPX Ecaron questiondown -36\nKPX Ecaron Aacute -36\nKPX Ecaron Hbar -36\nKPX Ecaron lacute -63\n\n\nKPX Gdotaccent six -36\nKPX Gdotaccent Gdotaccent -36\nKPX Gdotaccent Gcommaaccent -36\n\nKPX Gcommaaccent six -36\nKPX Gcommaaccent Gdotaccent -36\nKPX Gcommaaccent Gcommaaccent -36\n\nKPX Hbar dollar -112\nKPX Hbar seven 38\nKPX Hbar D -159\nKPX Hbar F -159\nKPX Hbar H -159\nKPX Hbar R -159\nKPX Hbar V -149\nKPX Hbar Z -73\nKPX Hbar cent -159\nKPX Hbar sterling -159\nKPX Hbar currency -159\nKPX Hbar yen -159\nKPX Hbar brokenbar -159\nKPX Hbar section -159\nKPX Hbar dieresis -159\nKPX Hbar copyright -159\nKPX Hbar ordfeminine -159\nKPX Hbar guillemotleft -159\nKPX Hbar logicalnot -159\nKPX Hbar sfthyphen -159\nKPX Hbar acute -159\nKPX Hbar mu -159\nKPX Hbar paragraph -159\nKPX Hbar periodcentered -159\nKPX Hbar cedilla -159\nKPX Hbar ordmasculine -159\nKPX Hbar Eacute -159\nKPX Hbar Idieresis -159\nKPX Hbar Yacute -159\nKPX Hbar ebreve -159\nKPX Hbar gdotaccent -149\nKPX Hbar gcommaaccent -149\nKPX Hbar Hbar 38\n\nKPX Idot dollar -63\nKPX Idot hyphen -55\n\nKPX kcommaaccent D 110\nKPX kcommaaccent F 85\nKPX kcommaaccent G 97\nKPX kcommaaccent H 86\nKPX kcommaaccent I 220\nKPX kcommaaccent J 97\nKPX kcommaaccent L 220\nKPX kcommaaccent M 218\nKPX kcommaaccent P 125\nKPX kcommaaccent Q 125\nKPX kcommaaccent R 85\nKPX kcommaaccent S 140\nKPX kcommaaccent T 97\nKPX kcommaaccent U 125\nKPX kcommaaccent V 155\nKPX kcommaaccent W 235\nKPX kcommaaccent X 144\nKPX kcommaaccent Y 205\nKPX kcommaaccent Z 166\nKPX kcommaaccent bracketleft 174\nKPX kcommaaccent backslash 205\nKPX kcommaaccent bracketright 179\nKPX kcommaaccent kcommaaccent 261\n\nKPX lacute dollar -159\nKPX lacute ampersand -36\nKPX lacute D -159\nKPX lacute H -178\nKPX lacute L -36\nKPX lacute R -178\nKPX lacute X -178\nKPX lacute cent -159\nKPX lacute sterling -159\nKPX lacute currency -159\nKPX lacute yen -159\nKPX lacute brokenbar -159\nKPX lacute section -159\nKPX lacute dieresis -196\nKPX lacute ordfeminine -178\nKPX lacute guillemotleft -178\nKPX lacute logicalnot -178\nKPX lacute sfthyphen -178\nKPX lacute acute -178\nKPX lacute mu -178\nKPX lacute paragraph -178\nKPX lacute periodcentered -178\nKPX lacute cedilla -178\nKPX lacute ordmasculine -178\nKPX lacute guillemotright -178\nKPX lacute onequarter -178\nKPX lacute onehalf -178\nKPX lacute threequarters -178\nKPX lacute Egrave -36\nKPX lacute Icircumflex -36\nKPX lacute Yacute -178\nKPX lacute ebreve -215\nKPX lacute dotlessi -178\n\n\nKPX uni027D dollar -264\nKPX uni027D hyphen 47\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dejavu_sans_normal_b851f57bf3783ae5089a634872aa8ce8.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Book\nUniqueID DejaVu Sans\nFullName DejaVu Sans\nVersion Version 2.37\nPostScriptName DejaVuSans\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Book\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1021 -463 1793 1232\nStartCharMetrics 6253\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 401 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 780 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 361 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 531 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 684 ; N A ; G 36\nU 66 ; WX 686 ; N B ; G 37\nU 67 ; WX 698 ; N C ; G 38\nU 68 ; WX 770 ; N D ; G 39\nU 69 ; WX 632 ; N E ; G 40\nU 70 ; WX 575 ; N F ; G 41\nU 71 ; WX 775 ; N G ; G 42\nU 72 ; WX 752 ; N H ; G 43\nU 73 ; WX 295 ; N I ; G 44\nU 74 ; WX 295 ; N J ; G 45\nU 75 ; WX 656 ; N K ; G 46\nU 76 ; WX 557 ; N L ; G 47\nU 77 ; WX 863 ; N M ; G 48\nU 78 ; WX 748 ; N N ; G 49\nU 79 ; WX 787 ; N O ; G 50\nU 80 ; WX 603 ; N P ; G 51\nU 81 ; WX 787 ; N Q ; G 52\nU 82 ; WX 695 ; N R ; G 53\nU 83 ; WX 635 ; N S ; G 54\nU 84 ; WX 611 ; N T ; G 55\nU 85 ; WX 732 ; N U ; G 56\nU 86 ; WX 684 ; N V ; G 57\nU 87 ; WX 989 ; N W ; G 58\nU 88 ; WX 685 ; N X ; G 59\nU 89 ; WX 611 ; N Y ; G 60\nU 90 ; WX 685 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 613 ; N a ; G 68\nU 98 ; WX 635 ; N b ; G 69\nU 99 ; WX 550 ; N c ; G 70\nU 100 ; WX 635 ; N d ; G 71\nU 101 ; WX 615 ; N e ; G 72\nU 102 ; WX 352 ; N f ; G 73\nU 103 ; WX 635 ; N g ; G 74\nU 104 ; WX 634 ; N h ; G 75\nU 105 ; WX 278 ; N i ; G 76\nU 106 ; WX 278 ; N j ; G 77\nU 107 ; WX 579 ; N k ; G 78\nU 108 ; WX 278 ; N l ; G 79\nU 109 ; WX 974 ; N m ; G 80\nU 110 ; WX 634 ; N n ; G 81\nU 111 ; WX 612 ; N o ; G 82\nU 112 ; WX 635 ; N p ; G 83\nU 113 ; WX 635 ; N q ; G 84\nU 114 ; WX 411 ; N r ; G 85\nU 115 ; WX 521 ; N s ; G 86\nU 116 ; WX 392 ; N t ; G 87\nU 117 ; WX 634 ; N u ; G 88\nU 118 ; WX 592 ; N v ; G 89\nU 119 ; WX 818 ; N w ; G 90\nU 120 ; WX 592 ; N x ; G 91\nU 121 ; WX 592 ; N y ; G 92\nU 122 ; WX 525 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 401 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 471 ; N ordfeminine ; G 108\nU 171 ; WX 612 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 361 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 636 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 471 ; N ordmasculine ; G 124\nU 187 ; WX 612 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 531 ; N questiondown ; G 129\nU 192 ; WX 684 ; N Agrave ; G 130\nU 193 ; WX 684 ; N Aacute ; G 131\nU 194 ; WX 684 ; N Acircumflex ; G 132\nU 195 ; WX 684 ; N Atilde ; G 133\nU 196 ; WX 684 ; N Adieresis ; G 134\nU 197 ; WX 684 ; N Aring ; G 135\nU 198 ; WX 974 ; N AE ; G 136\nU 199 ; WX 698 ; N Ccedilla ; G 137\nU 200 ; WX 632 ; N Egrave ; G 138\nU 201 ; WX 632 ; N Eacute ; G 139\nU 202 ; WX 632 ; N Ecircumflex ; G 140\nU 203 ; WX 632 ; N Edieresis ; G 141\nU 204 ; WX 295 ; N Igrave ; G 142\nU 205 ; WX 295 ; N Iacute ; G 143\nU 206 ; WX 295 ; N Icircumflex ; G 144\nU 207 ; WX 295 ; N Idieresis ; G 145\nU 208 ; WX 775 ; N Eth ; G 146\nU 209 ; WX 748 ; N Ntilde ; G 147\nU 210 ; WX 787 ; N Ograve ; G 148\nU 211 ; WX 787 ; N Oacute ; G 149\nU 212 ; WX 787 ; N Ocircumflex ; G 150\nU 213 ; WX 787 ; N Otilde ; G 151\nU 214 ; WX 787 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 787 ; N Oslash ; G 154\nU 217 ; WX 732 ; N Ugrave ; G 155\nU 218 ; WX 732 ; N Uacute ; G 156\nU 219 ; WX 732 ; N Ucircumflex ; G 157\nU 220 ; WX 732 ; N Udieresis ; G 158\nU 221 ; WX 611 ; N Yacute ; G 159\nU 222 ; WX 605 ; N Thorn ; G 160\nU 223 ; WX 630 ; N germandbls ; G 161\nU 224 ; WX 613 ; N agrave ; G 162\nU 225 ; WX 613 ; N aacute ; G 163\nU 226 ; WX 613 ; N acircumflex ; G 164\nU 227 ; WX 613 ; N atilde ; G 165\nU 228 ; WX 613 ; N adieresis ; G 166\nU 229 ; WX 613 ; N aring ; G 167\nU 230 ; WX 982 ; N ae ; G 168\nU 231 ; WX 550 ; N ccedilla ; G 169\nU 232 ; WX 615 ; N egrave ; G 170\nU 233 ; WX 615 ; N eacute ; G 171\nU 234 ; WX 615 ; N ecircumflex ; G 172\nU 235 ; WX 615 ; N edieresis ; G 173\nU 236 ; WX 278 ; N igrave ; G 174\nU 237 ; WX 278 ; N iacute ; G 175\nU 238 ; WX 278 ; N icircumflex ; G 176\nU 239 ; WX 278 ; N idieresis ; G 177\nU 240 ; WX 612 ; N eth ; G 178\nU 241 ; WX 634 ; N ntilde ; G 179\nU 242 ; WX 612 ; N ograve ; G 180\nU 243 ; WX 612 ; N oacute ; G 181\nU 244 ; WX 612 ; N ocircumflex ; G 182\nU 245 ; WX 612 ; N otilde ; G 183\nU 246 ; WX 612 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 612 ; N oslash ; G 186\nU 249 ; WX 634 ; N ugrave ; G 187\nU 250 ; WX 634 ; N uacute ; G 188\nU 251 ; WX 634 ; N ucircumflex ; G 189\nU 252 ; WX 634 ; N udieresis ; G 190\nU 253 ; WX 592 ; N yacute ; G 191\nU 254 ; WX 635 ; N thorn ; G 192\nU 255 ; WX 592 ; N ydieresis ; G 193\nU 256 ; WX 684 ; N Amacron ; G 194\nU 257 ; WX 613 ; N amacron ; G 195\nU 258 ; WX 684 ; N Abreve ; G 196\nU 259 ; WX 613 ; N abreve ; G 197\nU 260 ; WX 684 ; N Aogonek ; G 198\nU 261 ; WX 613 ; N aogonek ; G 199\nU 262 ; WX 698 ; N Cacute ; G 200\nU 263 ; WX 550 ; N cacute ; G 201\nU 264 ; WX 698 ; N Ccircumflex ; G 202\nU 265 ; WX 550 ; N ccircumflex ; G 203\nU 266 ; WX 698 ; N Cdotaccent ; G 204\nU 267 ; WX 550 ; N cdotaccent ; G 205\nU 268 ; WX 698 ; N Ccaron ; G 206\nU 269 ; WX 550 ; N ccaron ; G 207\nU 270 ; WX 770 ; N Dcaron ; G 208\nU 271 ; WX 635 ; N dcaron ; G 209\nU 272 ; WX 775 ; N Dcroat ; G 210\nU 273 ; WX 635 ; N dmacron ; G 211\nU 274 ; WX 632 ; N Emacron ; G 212\nU 275 ; WX 615 ; N emacron ; G 213\nU 276 ; WX 632 ; N Ebreve ; G 214\nU 277 ; WX 615 ; N ebreve ; G 215\nU 278 ; WX 632 ; N Edotaccent ; G 216\nU 279 ; WX 615 ; N edotaccent ; G 217\nU 280 ; WX 632 ; N Eogonek ; G 218\nU 281 ; WX 615 ; N eogonek ; G 219\nU 282 ; WX 632 ; N Ecaron ; G 220\nU 283 ; WX 615 ; N ecaron ; G 221\nU 284 ; WX 775 ; N Gcircumflex ; G 222\nU 285 ; WX 635 ; N gcircumflex ; G 223\nU 286 ; WX 775 ; N Gbreve ; G 224\nU 287 ; WX 635 ; N gbreve ; G 225\nU 288 ; WX 775 ; N Gdotaccent ; G 226\nU 289 ; WX 635 ; N gdotaccent ; G 227\nU 290 ; WX 775 ; N Gcommaaccent ; G 228\nU 291 ; WX 635 ; N gcommaaccent ; G 229\nU 292 ; WX 752 ; N Hcircumflex ; G 230\nU 293 ; WX 634 ; N hcircumflex ; G 231\nU 294 ; WX 916 ; N Hbar ; G 232\nU 295 ; WX 695 ; N hbar ; G 233\nU 296 ; WX 295 ; N Itilde ; G 234\nU 297 ; WX 278 ; N itilde ; G 235\nU 298 ; WX 295 ; N Imacron ; G 236\nU 299 ; WX 278 ; N imacron ; G 237\nU 300 ; WX 295 ; N Ibreve ; G 238\nU 301 ; WX 278 ; N ibreve ; G 239\nU 302 ; WX 295 ; N Iogonek ; G 240\nU 303 ; WX 278 ; N iogonek ; G 241\nU 304 ; WX 295 ; N Idot ; G 242\nU 305 ; WX 278 ; N dotlessi ; G 243\nU 306 ; WX 590 ; N IJ ; G 244\nU 307 ; WX 556 ; N ij ; G 245\nU 308 ; WX 295 ; N Jcircumflex ; G 246\nU 309 ; WX 278 ; N jcircumflex ; G 247\nU 310 ; WX 656 ; N Kcommaaccent ; G 248\nU 311 ; WX 579 ; N kcommaaccent ; G 249\nU 312 ; WX 579 ; N kgreenlandic ; G 250\nU 313 ; WX 557 ; N Lacute ; G 251\nU 314 ; WX 278 ; N lacute ; G 252\nU 315 ; WX 557 ; N Lcommaaccent ; G 253\nU 316 ; WX 278 ; N lcommaaccent ; G 254\nU 317 ; WX 557 ; N Lcaron ; G 255\nU 318 ; WX 375 ; N lcaron ; G 256\nU 319 ; WX 557 ; N Ldot ; G 257\nU 320 ; WX 342 ; N ldot ; G 258\nU 321 ; WX 562 ; N Lslash ; G 259\nU 322 ; WX 284 ; N lslash ; G 260\nU 323 ; WX 748 ; N Nacute ; G 261\nU 324 ; WX 634 ; N nacute ; G 262\nU 325 ; WX 748 ; N Ncommaaccent ; G 263\nU 326 ; WX 634 ; N ncommaaccent ; G 264\nU 327 ; WX 748 ; N Ncaron ; G 265\nU 328 ; WX 634 ; N ncaron ; G 266\nU 329 ; WX 813 ; N napostrophe ; G 267\nU 330 ; WX 748 ; N Eng ; G 268\nU 331 ; WX 634 ; N eng ; G 269\nU 332 ; WX 787 ; N Omacron ; G 270\nU 333 ; WX 612 ; N omacron ; G 271\nU 334 ; WX 787 ; N Obreve ; G 272\nU 335 ; WX 612 ; N obreve ; G 273\nU 336 ; WX 787 ; N Ohungarumlaut ; G 274\nU 337 ; WX 612 ; N ohungarumlaut ; G 275\nU 338 ; WX 1070 ; N OE ; G 276\nU 339 ; WX 1023 ; N oe ; G 277\nU 340 ; WX 695 ; N Racute ; G 278\nU 341 ; WX 411 ; N racute ; G 279\nU 342 ; WX 695 ; N Rcommaaccent ; G 280\nU 343 ; WX 411 ; N rcommaaccent ; G 281\nU 344 ; WX 695 ; N Rcaron ; G 282\nU 345 ; WX 411 ; N rcaron ; G 283\nU 346 ; WX 635 ; N Sacute ; G 284\nU 347 ; WX 521 ; N sacute ; G 285\nU 348 ; WX 635 ; N Scircumflex ; G 286\nU 349 ; WX 521 ; N scircumflex ; G 287\nU 350 ; WX 635 ; N Scedilla ; G 288\nU 351 ; WX 521 ; N scedilla ; G 289\nU 352 ; WX 635 ; N Scaron ; G 290\nU 353 ; WX 521 ; N scaron ; G 291\nU 354 ; WX 611 ; N Tcommaaccent ; G 292\nU 355 ; WX 392 ; N tcommaaccent ; G 293\nU 356 ; WX 611 ; N Tcaron ; G 294\nU 357 ; WX 392 ; N tcaron ; G 295\nU 358 ; WX 611 ; N Tbar ; G 296\nU 359 ; WX 392 ; N tbar ; G 297\nU 360 ; WX 732 ; N Utilde ; G 298\nU 361 ; WX 634 ; N utilde ; G 299\nU 362 ; WX 732 ; N Umacron ; G 300\nU 363 ; WX 634 ; N umacron ; G 301\nU 364 ; WX 732 ; N Ubreve ; G 302\nU 365 ; WX 634 ; N ubreve ; G 303\nU 366 ; WX 732 ; N Uring ; G 304\nU 367 ; WX 634 ; N uring ; G 305\nU 368 ; WX 732 ; N Uhungarumlaut ; G 306\nU 369 ; WX 634 ; N uhungarumlaut ; G 307\nU 370 ; WX 732 ; N Uogonek ; G 308\nU 371 ; WX 634 ; N uogonek ; G 309\nU 372 ; WX 989 ; N Wcircumflex ; G 310\nU 373 ; WX 818 ; N wcircumflex ; G 311\nU 374 ; WX 611 ; N Ycircumflex ; G 312\nU 375 ; WX 592 ; N ycircumflex ; G 313\nU 376 ; WX 611 ; N Ydieresis ; G 314\nU 377 ; WX 685 ; N Zacute ; G 315\nU 378 ; WX 525 ; N zacute ; G 316\nU 379 ; WX 685 ; N Zdotaccent ; G 317\nU 380 ; WX 525 ; N zdotaccent ; G 318\nU 381 ; WX 685 ; N Zcaron ; G 319\nU 382 ; WX 525 ; N zcaron ; G 320\nU 383 ; WX 352 ; N longs ; G 321\nU 384 ; WX 635 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 686 ; N uni0182 ; G 324\nU 387 ; WX 635 ; N uni0183 ; G 325\nU 388 ; WX 686 ; N uni0184 ; G 326\nU 389 ; WX 635 ; N uni0185 ; G 327\nU 390 ; WX 703 ; N uni0186 ; G 328\nU 391 ; WX 698 ; N uni0187 ; G 329\nU 392 ; WX 550 ; N uni0188 ; G 330\nU 393 ; WX 775 ; N uni0189 ; G 331\nU 394 ; WX 819 ; N uni018A ; G 332\nU 395 ; WX 686 ; N uni018B ; G 333\nU 396 ; WX 635 ; N uni018C ; G 334\nU 397 ; WX 612 ; N uni018D ; G 335\nU 398 ; WX 632 ; N uni018E ; G 336\nU 399 ; WX 787 ; N uni018F ; G 337\nU 400 ; WX 614 ; N uni0190 ; G 338\nU 401 ; WX 575 ; N uni0191 ; G 339\nU 402 ; WX 352 ; N florin ; G 340\nU 403 ; WX 775 ; N uni0193 ; G 341\nU 404 ; WX 687 ; N uni0194 ; G 342\nU 405 ; WX 984 ; N uni0195 ; G 343\nU 406 ; WX 354 ; N uni0196 ; G 344\nU 407 ; WX 295 ; N uni0197 ; G 345\nU 408 ; WX 746 ; N uni0198 ; G 346\nU 409 ; WX 579 ; N uni0199 ; G 347\nU 410 ; WX 278 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 974 ; N uni019C ; G 350\nU 413 ; WX 748 ; N uni019D ; G 351\nU 414 ; WX 634 ; N uni019E ; G 352\nU 415 ; WX 787 ; N uni019F ; G 353\nU 416 ; WX 913 ; N Ohorn ; G 354\nU 417 ; WX 612 ; N ohorn ; G 355\nU 418 ; WX 949 ; N uni01A2 ; G 356\nU 419 ; WX 759 ; N uni01A3 ; G 357\nU 420 ; WX 652 ; N uni01A4 ; G 358\nU 421 ; WX 635 ; N uni01A5 ; G 359\nU 422 ; WX 695 ; N uni01A6 ; G 360\nU 423 ; WX 635 ; N uni01A7 ; G 361\nU 424 ; WX 521 ; N uni01A8 ; G 362\nU 425 ; WX 632 ; N uni01A9 ; G 363\nU 426 ; WX 336 ; N uni01AA ; G 364\nU 427 ; WX 392 ; N uni01AB ; G 365\nU 428 ; WX 611 ; N uni01AC ; G 366\nU 429 ; WX 392 ; N uni01AD ; G 367\nU 430 ; WX 611 ; N uni01AE ; G 368\nU 431 ; WX 858 ; N Uhorn ; G 369\nU 432 ; WX 634 ; N uhorn ; G 370\nU 433 ; WX 764 ; N uni01B1 ; G 371\nU 434 ; WX 721 ; N uni01B2 ; G 372\nU 435 ; WX 744 ; N uni01B3 ; G 373\nU 436 ; WX 730 ; N uni01B4 ; G 374\nU 437 ; WX 685 ; N uni01B5 ; G 375\nU 438 ; WX 525 ; N uni01B6 ; G 376\nU 439 ; WX 666 ; N uni01B7 ; G 377\nU 440 ; WX 666 ; N uni01B8 ; G 378\nU 441 ; WX 578 ; N uni01B9 ; G 379\nU 442 ; WX 525 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 666 ; N uni01BC ; G 382\nU 445 ; WX 578 ; N uni01BD ; G 383\nU 446 ; WX 510 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1422 ; N uni01C4 ; G 390\nU 453 ; WX 1299 ; N uni01C5 ; G 391\nU 454 ; WX 1154 ; N uni01C6 ; G 392\nU 455 ; WX 835 ; N uni01C7 ; G 393\nU 456 ; WX 787 ; N uni01C8 ; G 394\nU 457 ; WX 457 ; N uni01C9 ; G 395\nU 458 ; WX 931 ; N uni01CA ; G 396\nU 459 ; WX 924 ; N uni01CB ; G 397\nU 460 ; WX 797 ; N uni01CC ; G 398\nU 461 ; WX 684 ; N uni01CD ; G 399\nU 462 ; WX 613 ; N uni01CE ; G 400\nU 463 ; WX 295 ; N uni01CF ; G 401\nU 464 ; WX 278 ; N uni01D0 ; G 402\nU 465 ; WX 787 ; N uni01D1 ; G 403\nU 466 ; WX 612 ; N uni01D2 ; G 404\nU 467 ; WX 732 ; N uni01D3 ; G 405\nU 468 ; WX 634 ; N uni01D4 ; G 406\nU 469 ; WX 732 ; N uni01D5 ; G 407\nU 470 ; WX 634 ; N uni01D6 ; G 408\nU 471 ; WX 732 ; N uni01D7 ; G 409\nU 472 ; WX 634 ; N uni01D8 ; G 410\nU 473 ; WX 732 ; N uni01D9 ; G 411\nU 474 ; WX 634 ; N uni01DA ; G 412\nU 475 ; WX 732 ; N uni01DB ; G 413\nU 476 ; WX 634 ; N uni01DC ; G 414\nU 477 ; WX 615 ; N uni01DD ; G 415\nU 478 ; WX 684 ; N uni01DE ; G 416\nU 479 ; WX 613 ; N uni01DF ; G 417\nU 480 ; WX 684 ; N uni01E0 ; G 418\nU 481 ; WX 613 ; N uni01E1 ; G 419\nU 482 ; WX 974 ; N uni01E2 ; G 420\nU 483 ; WX 982 ; N uni01E3 ; G 421\nU 484 ; WX 775 ; N uni01E4 ; G 422\nU 485 ; WX 635 ; N uni01E5 ; G 423\nU 486 ; WX 775 ; N Gcaron ; G 424\nU 487 ; WX 635 ; N gcaron ; G 425\nU 488 ; WX 656 ; N uni01E8 ; G 426\nU 489 ; WX 579 ; N uni01E9 ; G 427\nU 490 ; WX 787 ; N uni01EA ; G 428\nU 491 ; WX 612 ; N uni01EB ; G 429\nU 492 ; WX 787 ; N uni01EC ; G 430\nU 493 ; WX 612 ; N uni01ED ; G 431\nU 494 ; WX 666 ; N uni01EE ; G 432\nU 495 ; WX 578 ; N uni01EF ; G 433\nU 496 ; WX 278 ; N uni01F0 ; G 434\nU 497 ; WX 1422 ; N uni01F1 ; G 435\nU 498 ; WX 1299 ; N uni01F2 ; G 436\nU 499 ; WX 1154 ; N uni01F3 ; G 437\nU 500 ; WX 775 ; N uni01F4 ; G 438\nU 501 ; WX 635 ; N uni01F5 ; G 439\nU 502 ; WX 1113 ; N uni01F6 ; G 440\nU 503 ; WX 682 ; N uni01F7 ; G 441\nU 504 ; WX 748 ; N uni01F8 ; G 442\nU 505 ; WX 634 ; N uni01F9 ; G 443\nU 506 ; WX 684 ; N Aringacute ; G 444\nU 507 ; WX 613 ; N aringacute ; G 445\nU 508 ; WX 974 ; N AEacute ; G 446\nU 509 ; WX 982 ; N aeacute ; G 447\nU 510 ; WX 787 ; N Oslashacute ; G 448\nU 511 ; WX 612 ; N oslashacute ; G 449\nU 512 ; WX 684 ; N uni0200 ; G 450\nU 513 ; WX 613 ; N uni0201 ; G 451\nU 514 ; WX 684 ; N uni0202 ; G 452\nU 515 ; WX 613 ; N uni0203 ; G 453\nU 516 ; WX 632 ; N uni0204 ; G 454\nU 517 ; WX 615 ; N uni0205 ; G 455\nU 518 ; WX 632 ; N uni0206 ; G 456\nU 519 ; WX 615 ; N uni0207 ; G 457\nU 520 ; WX 295 ; N uni0208 ; G 458\nU 521 ; WX 278 ; N uni0209 ; G 459\nU 522 ; WX 295 ; N uni020A ; G 460\nU 523 ; WX 278 ; N uni020B ; G 461\nU 524 ; WX 787 ; N uni020C ; G 462\nU 525 ; WX 612 ; N uni020D ; G 463\nU 526 ; WX 787 ; N uni020E ; G 464\nU 527 ; WX 612 ; N uni020F ; G 465\nU 528 ; WX 695 ; N uni0210 ; G 466\nU 529 ; WX 411 ; N uni0211 ; G 467\nU 530 ; WX 695 ; N uni0212 ; G 468\nU 531 ; WX 411 ; N uni0213 ; G 469\nU 532 ; WX 732 ; N uni0214 ; G 470\nU 533 ; WX 634 ; N uni0215 ; G 471\nU 534 ; WX 732 ; N uni0216 ; G 472\nU 535 ; WX 634 ; N uni0217 ; G 473\nU 536 ; WX 635 ; N Scommaaccent ; G 474\nU 537 ; WX 521 ; N scommaaccent ; G 475\nU 538 ; WX 611 ; N uni021A ; G 476\nU 539 ; WX 392 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 752 ; N uni021E ; G 480\nU 543 ; WX 634 ; N uni021F ; G 481\nU 544 ; WX 735 ; N uni0220 ; G 482\nU 545 ; WX 838 ; N uni0221 ; G 483\nU 546 ; WX 698 ; N uni0222 ; G 484\nU 547 ; WX 610 ; N uni0223 ; G 485\nU 548 ; WX 685 ; N uni0224 ; G 486\nU 549 ; WX 525 ; N uni0225 ; G 487\nU 550 ; WX 684 ; N uni0226 ; G 488\nU 551 ; WX 613 ; N uni0227 ; G 489\nU 552 ; WX 632 ; N uni0228 ; G 490\nU 553 ; WX 615 ; N uni0229 ; G 491\nU 554 ; WX 787 ; N uni022A ; G 492\nU 555 ; WX 612 ; N uni022B ; G 493\nU 556 ; WX 787 ; N uni022C ; G 494\nU 557 ; WX 612 ; N uni022D ; G 495\nU 558 ; WX 787 ; N uni022E ; G 496\nU 559 ; WX 612 ; N uni022F ; G 497\nU 560 ; WX 787 ; N uni0230 ; G 498\nU 561 ; WX 612 ; N uni0231 ; G 499\nU 562 ; WX 611 ; N uni0232 ; G 500\nU 563 ; WX 592 ; N uni0233 ; G 501\nU 564 ; WX 475 ; N uni0234 ; G 502\nU 565 ; WX 843 ; N uni0235 ; G 503\nU 566 ; WX 477 ; N uni0236 ; G 504\nU 567 ; WX 278 ; N dotlessj ; G 505\nU 568 ; WX 998 ; N uni0238 ; G 506\nU 569 ; WX 998 ; N uni0239 ; G 507\nU 570 ; WX 684 ; N uni023A ; G 508\nU 571 ; WX 698 ; N uni023B ; G 509\nU 572 ; WX 550 ; N uni023C ; G 510\nU 573 ; WX 557 ; N uni023D ; G 511\nU 574 ; WX 611 ; N uni023E ; G 512\nU 575 ; WX 521 ; N uni023F ; G 513\nU 576 ; WX 525 ; N uni0240 ; G 514\nU 577 ; WX 603 ; N uni0241 ; G 515\nU 578 ; WX 479 ; N uni0242 ; G 516\nU 579 ; WX 686 ; N uni0243 ; G 517\nU 580 ; WX 732 ; N uni0244 ; G 518\nU 581 ; WX 684 ; N uni0245 ; G 519\nU 582 ; WX 632 ; N uni0246 ; G 520\nU 583 ; WX 615 ; N uni0247 ; G 521\nU 584 ; WX 295 ; N uni0248 ; G 522\nU 585 ; WX 278 ; N uni0249 ; G 523\nU 586 ; WX 781 ; N uni024A ; G 524\nU 587 ; WX 635 ; N uni024B ; G 525\nU 588 ; WX 695 ; N uni024C ; G 526\nU 589 ; WX 411 ; N uni024D ; G 527\nU 590 ; WX 611 ; N uni024E ; G 528\nU 591 ; WX 592 ; N uni024F ; G 529\nU 592 ; WX 600 ; N uni0250 ; G 530\nU 593 ; WX 635 ; N uni0251 ; G 531\nU 594 ; WX 635 ; N uni0252 ; G 532\nU 595 ; WX 635 ; N uni0253 ; G 533\nU 596 ; WX 549 ; N uni0254 ; G 534\nU 597 ; WX 550 ; N uni0255 ; G 535\nU 598 ; WX 635 ; N uni0256 ; G 536\nU 599 ; WX 696 ; N uni0257 ; G 537\nU 600 ; WX 615 ; N uni0258 ; G 538\nU 601 ; WX 615 ; N uni0259 ; G 539\nU 602 ; WX 819 ; N uni025A ; G 540\nU 603 ; WX 541 ; N uni025B ; G 541\nU 604 ; WX 532 ; N uni025C ; G 542\nU 605 ; WX 775 ; N uni025D ; G 543\nU 606 ; WX 664 ; N uni025E ; G 544\nU 607 ; WX 278 ; N uni025F ; G 545\nU 608 ; WX 696 ; N uni0260 ; G 546\nU 609 ; WX 635 ; N uni0261 ; G 547\nU 610 ; WX 629 ; N uni0262 ; G 548\nU 611 ; WX 596 ; N uni0263 ; G 549\nU 612 ; WX 596 ; N uni0264 ; G 550\nU 613 ; WX 634 ; N uni0265 ; G 551\nU 614 ; WX 634 ; N uni0266 ; G 552\nU 615 ; WX 634 ; N uni0267 ; G 553\nU 616 ; WX 278 ; N uni0268 ; G 554\nU 617 ; WX 338 ; N uni0269 ; G 555\nU 618 ; WX 372 ; N uni026A ; G 556\nU 619 ; WX 396 ; N uni026B ; G 557\nU 620 ; WX 487 ; N uni026C ; G 558\nU 621 ; WX 278 ; N uni026D ; G 559\nU 622 ; WX 706 ; N uni026E ; G 560\nU 623 ; WX 974 ; N uni026F ; G 561\nU 624 ; WX 974 ; N uni0270 ; G 562\nU 625 ; WX 974 ; N uni0271 ; G 563\nU 626 ; WX 646 ; N uni0272 ; G 564\nU 627 ; WX 642 ; N uni0273 ; G 565\nU 628 ; WX 634 ; N uni0274 ; G 566\nU 629 ; WX 612 ; N uni0275 ; G 567\nU 630 ; WX 858 ; N uni0276 ; G 568\nU 631 ; WX 728 ; N uni0277 ; G 569\nU 632 ; WX 660 ; N uni0278 ; G 570\nU 633 ; WX 414 ; N uni0279 ; G 571\nU 634 ; WX 414 ; N uni027A ; G 572\nU 635 ; WX 414 ; N uni027B ; G 573\nU 636 ; WX 411 ; N uni027C ; G 574\nU 637 ; WX 411 ; N uni027D ; G 575\nU 638 ; WX 530 ; N uni027E ; G 576\nU 639 ; WX 530 ; N uni027F ; G 577\nU 640 ; WX 604 ; N uni0280 ; G 578\nU 641 ; WX 604 ; N uni0281 ; G 579\nU 642 ; WX 521 ; N uni0282 ; G 580\nU 643 ; WX 336 ; N uni0283 ; G 581\nU 644 ; WX 336 ; N uni0284 ; G 582\nU 645 ; WX 461 ; N uni0285 ; G 583\nU 646 ; WX 336 ; N uni0286 ; G 584\nU 647 ; WX 392 ; N uni0287 ; G 585\nU 648 ; WX 392 ; N uni0288 ; G 586\nU 649 ; WX 634 ; N uni0289 ; G 587\nU 650 ; WX 618 ; N uni028A ; G 588\nU 651 ; WX 598 ; N uni028B ; G 589\nU 652 ; WX 592 ; N uni028C ; G 590\nU 653 ; WX 818 ; N uni028D ; G 591\nU 654 ; WX 592 ; N uni028E ; G 592\nU 655 ; WX 611 ; N uni028F ; G 593\nU 656 ; WX 525 ; N uni0290 ; G 594\nU 657 ; WX 525 ; N uni0291 ; G 595\nU 658 ; WX 578 ; N uni0292 ; G 596\nU 659 ; WX 578 ; N uni0293 ; G 597\nU 660 ; WX 510 ; N uni0294 ; G 598\nU 661 ; WX 510 ; N uni0295 ; G 599\nU 662 ; WX 510 ; N uni0296 ; G 600\nU 663 ; WX 510 ; N uni0297 ; G 601\nU 664 ; WX 787 ; N uni0298 ; G 602\nU 665 ; WX 580 ; N uni0299 ; G 603\nU 666 ; WX 664 ; N uni029A ; G 604\nU 667 ; WX 708 ; N uni029B ; G 605\nU 668 ; WX 654 ; N uni029C ; G 606\nU 669 ; WX 292 ; N uni029D ; G 607\nU 670 ; WX 667 ; N uni029E ; G 608\nU 671 ; WX 507 ; N uni029F ; G 609\nU 672 ; WX 727 ; N uni02A0 ; G 610\nU 673 ; WX 510 ; N uni02A1 ; G 611\nU 674 ; WX 510 ; N uni02A2 ; G 612\nU 675 ; WX 1014 ; N uni02A3 ; G 613\nU 676 ; WX 1058 ; N uni02A4 ; G 614\nU 677 ; WX 1013 ; N uni02A5 ; G 615\nU 678 ; WX 830 ; N uni02A6 ; G 616\nU 679 ; WX 610 ; N uni02A7 ; G 617\nU 680 ; WX 778 ; N uni02A8 ; G 618\nU 681 ; WX 848 ; N uni02A9 ; G 619\nU 682 ; WX 706 ; N uni02AA ; G 620\nU 683 ; WX 654 ; N uni02AB ; G 621\nU 684 ; WX 515 ; N uni02AC ; G 622\nU 685 ; WX 515 ; N uni02AD ; G 623\nU 686 ; WX 661 ; N uni02AE ; G 624\nU 687 ; WX 664 ; N uni02AF ; G 625\nU 688 ; WX 404 ; N uni02B0 ; G 626\nU 689 ; WX 399 ; N uni02B1 ; G 627\nU 690 ; WX 175 ; N uni02B2 ; G 628\nU 691 ; WX 259 ; N uni02B3 ; G 629\nU 692 ; WX 295 ; N uni02B4 ; G 630\nU 693 ; WX 296 ; N uni02B5 ; G 631\nU 694 ; WX 379 ; N uni02B6 ; G 632\nU 695 ; WX 515 ; N uni02B7 ; G 633\nU 696 ; WX 373 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 370 ; N uni02C0 ; G 642\nU 705 ; WX 370 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 275 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 275 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 307 ; N uni02D2 ; G 660\nU 723 ; WX 307 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 390 ; N uni02D6 ; G 664\nU 727 ; WX 317 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 315 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 426 ; N uni02E0 ; G 674\nU 737 ; WX 166 ; N uni02E1 ; G 675\nU 738 ; WX 373 ; N uni02E2 ; G 676\nU 739 ; WX 444 ; N uni02E3 ; G 677\nU 740 ; WX 370 ; N uni02E4 ; G 678\nU 741 ; WX 493 ; N uni02E5 ; G 679\nU 742 ; WX 493 ; N uni02E6 ; G 680\nU 743 ; WX 493 ; N uni02E7 ; G 681\nU 744 ; WX 493 ; N uni02E8 ; G 682\nU 745 ; WX 493 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 518 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 654 ; N uni0370 ; G 782\nU 881 ; WX 568 ; N uni0371 ; G 783\nU 882 ; WX 862 ; N uni0372 ; G 784\nU 883 ; WX 647 ; N uni0373 ; G 785\nU 884 ; WX 278 ; N uni0374 ; G 786\nU 885 ; WX 278 ; N uni0375 ; G 787\nU 886 ; WX 748 ; N uni0376 ; G 788\nU 887 ; WX 650 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 549 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 337 ; N uni037E ; G 794\nU 895 ; WX 295 ; N uni037F ; G 795\nU 900 ; WX 500 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 692 ; N Alphatonos ; G 798\nU 903 ; WX 318 ; N anoteleia ; G 799\nU 904 ; WX 746 ; N Epsilontonos ; G 800\nU 905 ; WX 871 ; N Etatonos ; G 801\nU 906 ; WX 408 ; N Iotatonos ; G 802\nU 908 ; WX 813 ; N Omicrontonos ; G 803\nU 910 ; WX 825 ; N Upsilontonos ; G 804\nU 911 ; WX 826 ; N Omegatonos ; G 805\nU 912 ; WX 338 ; N iotadieresistonos ; G 806\nU 913 ; WX 684 ; N Alpha ; G 807\nU 914 ; WX 686 ; N Beta ; G 808\nU 915 ; WX 557 ; N Gamma ; G 809\nU 916 ; WX 684 ; N uni0394 ; G 810\nU 917 ; WX 632 ; N Epsilon ; G 811\nU 918 ; WX 685 ; N Zeta ; G 812\nU 919 ; WX 752 ; N Eta ; G 813\nU 920 ; WX 787 ; N Theta ; G 814\nU 921 ; WX 295 ; N Iota ; G 815\nU 922 ; WX 656 ; N Kappa ; G 816\nU 923 ; WX 684 ; N Lambda ; G 817\nU 924 ; WX 863 ; N Mu ; G 818\nU 925 ; WX 748 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 787 ; N Omicron ; G 821\nU 928 ; WX 752 ; N Pi ; G 822\nU 929 ; WX 603 ; N Rho ; G 823\nU 931 ; WX 632 ; N Sigma ; G 824\nU 932 ; WX 611 ; N Tau ; G 825\nU 933 ; WX 611 ; N Upsilon ; G 826\nU 934 ; WX 787 ; N Phi ; G 827\nU 935 ; WX 685 ; N Chi ; G 828\nU 936 ; WX 787 ; N Psi ; G 829\nU 937 ; WX 764 ; N Omega ; G 830\nU 938 ; WX 295 ; N Iotadieresis ; G 831\nU 939 ; WX 611 ; N Upsilondieresis ; G 832\nU 940 ; WX 659 ; N alphatonos ; G 833\nU 941 ; WX 541 ; N epsilontonos ; G 834\nU 942 ; WX 634 ; N etatonos ; G 835\nU 943 ; WX 338 ; N iotatonos ; G 836\nU 944 ; WX 579 ; N upsilondieresistonos ; G 837\nU 945 ; WX 659 ; N alpha ; G 838\nU 946 ; WX 638 ; N beta ; G 839\nU 947 ; WX 592 ; N gamma ; G 840\nU 948 ; WX 612 ; N delta ; G 841\nU 949 ; WX 541 ; N epsilon ; G 842\nU 950 ; WX 544 ; N zeta ; G 843\nU 951 ; WX 634 ; N eta ; G 844\nU 952 ; WX 612 ; N theta ; G 845\nU 953 ; WX 338 ; N iota ; G 846\nU 954 ; WX 589 ; N kappa ; G 847\nU 955 ; WX 592 ; N lambda ; G 848\nU 956 ; WX 636 ; N uni03BC ; G 849\nU 957 ; WX 559 ; N nu ; G 850\nU 958 ; WX 558 ; N xi ; G 851\nU 959 ; WX 612 ; N omicron ; G 852\nU 960 ; WX 602 ; N pi ; G 853\nU 961 ; WX 635 ; N rho ; G 854\nU 962 ; WX 587 ; N sigma1 ; G 855\nU 963 ; WX 634 ; N sigma ; G 856\nU 964 ; WX 602 ; N tau ; G 857\nU 965 ; WX 579 ; N upsilon ; G 858\nU 966 ; WX 660 ; N phi ; G 859\nU 967 ; WX 578 ; N chi ; G 860\nU 968 ; WX 660 ; N psi ; G 861\nU 969 ; WX 837 ; N omega ; G 862\nU 970 ; WX 338 ; N iotadieresis ; G 863\nU 971 ; WX 579 ; N upsilondieresis ; G 864\nU 972 ; WX 612 ; N omicrontonos ; G 865\nU 973 ; WX 579 ; N upsilontonos ; G 866\nU 974 ; WX 837 ; N omegatonos ; G 867\nU 975 ; WX 656 ; N uni03CF ; G 868\nU 976 ; WX 614 ; N uni03D0 ; G 869\nU 977 ; WX 619 ; N theta1 ; G 870\nU 978 ; WX 699 ; N Upsilon1 ; G 871\nU 979 ; WX 842 ; N uni03D3 ; G 872\nU 980 ; WX 699 ; N uni03D4 ; G 873\nU 981 ; WX 660 ; N phi1 ; G 874\nU 982 ; WX 837 ; N omega1 ; G 875\nU 983 ; WX 664 ; N uni03D7 ; G 876\nU 984 ; WX 787 ; N uni03D8 ; G 877\nU 985 ; WX 612 ; N uni03D9 ; G 878\nU 986 ; WX 648 ; N uni03DA ; G 879\nU 987 ; WX 587 ; N uni03DB ; G 880\nU 988 ; WX 575 ; N uni03DC ; G 881\nU 989 ; WX 458 ; N uni03DD ; G 882\nU 990 ; WX 660 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 865 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 934 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 758 ; N uni03E4 ; G 889\nU 997 ; WX 659 ; N uni03E5 ; G 890\nU 998 ; WX 792 ; N uni03E6 ; G 891\nU 999 ; WX 615 ; N uni03E7 ; G 892\nU 1000 ; WX 687 ; N uni03E8 ; G 893\nU 1001 ; WX 607 ; N uni03E9 ; G 894\nU 1002 ; WX 768 ; N uni03EA ; G 895\nU 1003 ; WX 625 ; N uni03EB ; G 896\nU 1004 ; WX 699 ; N uni03EC ; G 897\nU 1005 ; WX 612 ; N uni03ED ; G 898\nU 1006 ; WX 611 ; N uni03EE ; G 899\nU 1007 ; WX 536 ; N uni03EF ; G 900\nU 1008 ; WX 664 ; N uni03F0 ; G 901\nU 1009 ; WX 635 ; N uni03F1 ; G 902\nU 1010 ; WX 550 ; N uni03F2 ; G 903\nU 1011 ; WX 278 ; N uni03F3 ; G 904\nU 1012 ; WX 787 ; N uni03F4 ; G 905\nU 1013 ; WX 615 ; N uni03F5 ; G 906\nU 1014 ; WX 615 ; N uni03F6 ; G 907\nU 1015 ; WX 605 ; N uni03F7 ; G 908\nU 1016 ; WX 635 ; N uni03F8 ; G 909\nU 1017 ; WX 698 ; N uni03F9 ; G 910\nU 1018 ; WX 863 ; N uni03FA ; G 911\nU 1019 ; WX 651 ; N uni03FB ; G 912\nU 1020 ; WX 635 ; N uni03FC ; G 913\nU 1021 ; WX 703 ; N uni03FD ; G 914\nU 1022 ; WX 698 ; N uni03FE ; G 915\nU 1023 ; WX 703 ; N uni03FF ; G 916\nU 1024 ; WX 632 ; N uni0400 ; G 917\nU 1025 ; WX 632 ; N uni0401 ; G 918\nU 1026 ; WX 786 ; N uni0402 ; G 919\nU 1027 ; WX 610 ; N uni0403 ; G 920\nU 1028 ; WX 698 ; N uni0404 ; G 921\nU 1029 ; WX 635 ; N uni0405 ; G 922\nU 1030 ; WX 295 ; N uni0406 ; G 923\nU 1031 ; WX 295 ; N uni0407 ; G 924\nU 1032 ; WX 295 ; N uni0408 ; G 925\nU 1033 ; WX 1094 ; N uni0409 ; G 926\nU 1034 ; WX 1045 ; N uni040A ; G 927\nU 1035 ; WX 786 ; N uni040B ; G 928\nU 1036 ; WX 710 ; N uni040C ; G 929\nU 1037 ; WX 748 ; N uni040D ; G 930\nU 1038 ; WX 609 ; N uni040E ; G 931\nU 1039 ; WX 752 ; N uni040F ; G 932\nU 1040 ; WX 684 ; N uni0410 ; G 933\nU 1041 ; WX 686 ; N uni0411 ; G 934\nU 1042 ; WX 686 ; N uni0412 ; G 935\nU 1043 ; WX 610 ; N uni0413 ; G 936\nU 1044 ; WX 781 ; N uni0414 ; G 937\nU 1045 ; WX 632 ; N uni0415 ; G 938\nU 1046 ; WX 1077 ; N uni0416 ; G 939\nU 1047 ; WX 641 ; N uni0417 ; G 940\nU 1048 ; WX 748 ; N uni0418 ; G 941\nU 1049 ; WX 748 ; N uni0419 ; G 942\nU 1050 ; WX 710 ; N uni041A ; G 943\nU 1051 ; WX 752 ; N uni041B ; G 944\nU 1052 ; WX 863 ; N uni041C ; G 945\nU 1053 ; WX 752 ; N uni041D ; G 946\nU 1054 ; WX 787 ; N uni041E ; G 947\nU 1055 ; WX 752 ; N uni041F ; G 948\nU 1056 ; WX 603 ; N uni0420 ; G 949\nU 1057 ; WX 698 ; N uni0421 ; G 950\nU 1058 ; WX 611 ; N uni0422 ; G 951\nU 1059 ; WX 609 ; N uni0423 ; G 952\nU 1060 ; WX 861 ; N uni0424 ; G 953\nU 1061 ; WX 685 ; N uni0425 ; G 954\nU 1062 ; WX 776 ; N uni0426 ; G 955\nU 1063 ; WX 686 ; N uni0427 ; G 956\nU 1064 ; WX 1069 ; N uni0428 ; G 957\nU 1065 ; WX 1094 ; N uni0429 ; G 958\nU 1066 ; WX 833 ; N uni042A ; G 959\nU 1067 ; WX 882 ; N uni042B ; G 960\nU 1068 ; WX 686 ; N uni042C ; G 961\nU 1069 ; WX 698 ; N uni042D ; G 962\nU 1070 ; WX 1080 ; N uni042E ; G 963\nU 1071 ; WX 695 ; N uni042F ; G 964\nU 1072 ; WX 613 ; N uni0430 ; G 965\nU 1073 ; WX 617 ; N uni0431 ; G 966\nU 1074 ; WX 589 ; N uni0432 ; G 967\nU 1075 ; WX 525 ; N uni0433 ; G 968\nU 1076 ; WX 691 ; N uni0434 ; G 969\nU 1077 ; WX 615 ; N uni0435 ; G 970\nU 1078 ; WX 901 ; N uni0436 ; G 971\nU 1079 ; WX 532 ; N uni0437 ; G 972\nU 1080 ; WX 650 ; N uni0438 ; G 973\nU 1081 ; WX 650 ; N uni0439 ; G 974\nU 1082 ; WX 604 ; N uni043A ; G 975\nU 1083 ; WX 639 ; N uni043B ; G 976\nU 1084 ; WX 754 ; N uni043C ; G 977\nU 1085 ; WX 654 ; N uni043D ; G 978\nU 1086 ; WX 612 ; N uni043E ; G 979\nU 1087 ; WX 654 ; N uni043F ; G 980\nU 1088 ; WX 635 ; N uni0440 ; G 981\nU 1089 ; WX 550 ; N uni0441 ; G 982\nU 1090 ; WX 583 ; N uni0442 ; G 983\nU 1091 ; WX 592 ; N uni0443 ; G 984\nU 1092 ; WX 855 ; N uni0444 ; G 985\nU 1093 ; WX 592 ; N uni0445 ; G 986\nU 1094 ; WX 681 ; N uni0446 ; G 987\nU 1095 ; WX 591 ; N uni0447 ; G 988\nU 1096 ; WX 915 ; N uni0448 ; G 989\nU 1097 ; WX 942 ; N uni0449 ; G 990\nU 1098 ; WX 707 ; N uni044A ; G 991\nU 1099 ; WX 790 ; N uni044B ; G 992\nU 1100 ; WX 589 ; N uni044C ; G 993\nU 1101 ; WX 549 ; N uni044D ; G 994\nU 1102 ; WX 842 ; N uni044E ; G 995\nU 1103 ; WX 602 ; N uni044F ; G 996\nU 1104 ; WX 615 ; N uni0450 ; G 997\nU 1105 ; WX 615 ; N uni0451 ; G 998\nU 1106 ; WX 625 ; N uni0452 ; G 999\nU 1107 ; WX 525 ; N uni0453 ; G 1000\nU 1108 ; WX 549 ; N uni0454 ; G 1001\nU 1109 ; WX 521 ; N uni0455 ; G 1002\nU 1110 ; WX 278 ; N uni0456 ; G 1003\nU 1111 ; WX 278 ; N uni0457 ; G 1004\nU 1112 ; WX 278 ; N uni0458 ; G 1005\nU 1113 ; WX 902 ; N uni0459 ; G 1006\nU 1114 ; WX 898 ; N uni045A ; G 1007\nU 1115 ; WX 652 ; N uni045B ; G 1008\nU 1116 ; WX 604 ; N uni045C ; G 1009\nU 1117 ; WX 650 ; N uni045D ; G 1010\nU 1118 ; WX 592 ; N uni045E ; G 1011\nU 1119 ; WX 654 ; N uni045F ; G 1012\nU 1120 ; WX 934 ; N uni0460 ; G 1013\nU 1121 ; WX 837 ; N uni0461 ; G 1014\nU 1122 ; WX 771 ; N uni0462 ; G 1015\nU 1123 ; WX 672 ; N uni0463 ; G 1016\nU 1124 ; WX 942 ; N uni0464 ; G 1017\nU 1125 ; WX 749 ; N uni0465 ; G 1018\nU 1126 ; WX 879 ; N uni0466 ; G 1019\nU 1127 ; WX 783 ; N uni0467 ; G 1020\nU 1128 ; WX 1160 ; N uni0468 ; G 1021\nU 1129 ; WX 1001 ; N uni0469 ; G 1022\nU 1130 ; WX 787 ; N uni046A ; G 1023\nU 1131 ; WX 612 ; N uni046B ; G 1024\nU 1132 ; WX 1027 ; N uni046C ; G 1025\nU 1133 ; WX 824 ; N uni046D ; G 1026\nU 1134 ; WX 636 ; N uni046E ; G 1027\nU 1135 ; WX 541 ; N uni046F ; G 1028\nU 1136 ; WX 856 ; N uni0470 ; G 1029\nU 1137 ; WX 876 ; N uni0471 ; G 1030\nU 1138 ; WX 787 ; N uni0472 ; G 1031\nU 1139 ; WX 612 ; N uni0473 ; G 1032\nU 1140 ; WX 781 ; N uni0474 ; G 1033\nU 1141 ; WX 665 ; N uni0475 ; G 1034\nU 1142 ; WX 781 ; N uni0476 ; G 1035\nU 1143 ; WX 665 ; N uni0477 ; G 1036\nU 1144 ; WX 992 ; N uni0478 ; G 1037\nU 1145 ; WX 904 ; N uni0479 ; G 1038\nU 1146 ; WX 953 ; N uni047A ; G 1039\nU 1147 ; WX 758 ; N uni047B ; G 1040\nU 1148 ; WX 1180 ; N uni047C ; G 1041\nU 1149 ; WX 1028 ; N uni047D ; G 1042\nU 1150 ; WX 934 ; N uni047E ; G 1043\nU 1151 ; WX 837 ; N uni047F ; G 1044\nU 1152 ; WX 698 ; N uni0480 ; G 1045\nU 1153 ; WX 550 ; N uni0481 ; G 1046\nU 1154 ; WX 502 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 772 ; N uni048A ; G 1055\nU 1163 ; WX 677 ; N uni048B ; G 1056\nU 1164 ; WX 686 ; N uni048C ; G 1057\nU 1165 ; WX 589 ; N uni048D ; G 1058\nU 1166 ; WX 603 ; N uni048E ; G 1059\nU 1167 ; WX 635 ; N uni048F ; G 1060\nU 1168 ; WX 610 ; N uni0490 ; G 1061\nU 1169 ; WX 525 ; N uni0491 ; G 1062\nU 1170 ; WX 675 ; N uni0492 ; G 1063\nU 1171 ; WX 590 ; N uni0493 ; G 1064\nU 1172 ; WX 624 ; N uni0494 ; G 1065\nU 1173 ; WX 530 ; N uni0495 ; G 1066\nU 1174 ; WX 1077 ; N uni0496 ; G 1067\nU 1175 ; WX 901 ; N uni0497 ; G 1068\nU 1176 ; WX 641 ; N uni0498 ; G 1069\nU 1177 ; WX 532 ; N uni0499 ; G 1070\nU 1178 ; WX 710 ; N uni049A ; G 1071\nU 1179 ; WX 604 ; N uni049B ; G 1072\nU 1180 ; WX 710 ; N uni049C ; G 1073\nU 1181 ; WX 604 ; N uni049D ; G 1074\nU 1182 ; WX 710 ; N uni049E ; G 1075\nU 1183 ; WX 604 ; N uni049F ; G 1076\nU 1184 ; WX 856 ; N uni04A0 ; G 1077\nU 1185 ; WX 832 ; N uni04A1 ; G 1078\nU 1186 ; WX 752 ; N uni04A2 ; G 1079\nU 1187 ; WX 661 ; N uni04A3 ; G 1080\nU 1188 ; WX 1014 ; N uni04A4 ; G 1081\nU 1189 ; WX 877 ; N uni04A5 ; G 1082\nU 1190 ; WX 1081 ; N uni04A6 ; G 1083\nU 1191 ; WX 916 ; N uni04A7 ; G 1084\nU 1192 ; WX 878 ; N uni04A8 ; G 1085\nU 1193 ; WX 693 ; N uni04A9 ; G 1086\nU 1194 ; WX 698 ; N uni04AA ; G 1087\nU 1195 ; WX 550 ; N uni04AB ; G 1088\nU 1196 ; WX 611 ; N uni04AC ; G 1089\nU 1197 ; WX 583 ; N uni04AD ; G 1090\nU 1198 ; WX 611 ; N uni04AE ; G 1091\nU 1199 ; WX 592 ; N uni04AF ; G 1092\nU 1200 ; WX 611 ; N uni04B0 ; G 1093\nU 1201 ; WX 592 ; N uni04B1 ; G 1094\nU 1202 ; WX 685 ; N uni04B2 ; G 1095\nU 1203 ; WX 592 ; N uni04B3 ; G 1096\nU 1204 ; WX 934 ; N uni04B4 ; G 1097\nU 1205 ; WX 807 ; N uni04B5 ; G 1098\nU 1206 ; WX 686 ; N uni04B6 ; G 1099\nU 1207 ; WX 591 ; N uni04B7 ; G 1100\nU 1208 ; WX 686 ; N uni04B8 ; G 1101\nU 1209 ; WX 591 ; N uni04B9 ; G 1102\nU 1210 ; WX 686 ; N uni04BA ; G 1103\nU 1211 ; WX 634 ; N uni04BB ; G 1104\nU 1212 ; WX 941 ; N uni04BC ; G 1105\nU 1213 ; WX 728 ; N uni04BD ; G 1106\nU 1214 ; WX 941 ; N uni04BE ; G 1107\nU 1215 ; WX 728 ; N uni04BF ; G 1108\nU 1216 ; WX 295 ; N uni04C0 ; G 1109\nU 1217 ; WX 1077 ; N uni04C1 ; G 1110\nU 1218 ; WX 901 ; N uni04C2 ; G 1111\nU 1219 ; WX 656 ; N uni04C3 ; G 1112\nU 1220 ; WX 604 ; N uni04C4 ; G 1113\nU 1221 ; WX 776 ; N uni04C5 ; G 1114\nU 1222 ; WX 670 ; N uni04C6 ; G 1115\nU 1223 ; WX 752 ; N uni04C7 ; G 1116\nU 1224 ; WX 661 ; N uni04C8 ; G 1117\nU 1225 ; WX 776 ; N uni04C9 ; G 1118\nU 1226 ; WX 681 ; N uni04CA ; G 1119\nU 1227 ; WX 686 ; N uni04CB ; G 1120\nU 1228 ; WX 591 ; N uni04CC ; G 1121\nU 1229 ; WX 888 ; N uni04CD ; G 1122\nU 1230 ; WX 774 ; N uni04CE ; G 1123\nU 1231 ; WX 278 ; N uni04CF ; G 1124\nU 1232 ; WX 684 ; N uni04D0 ; G 1125\nU 1233 ; WX 613 ; N uni04D1 ; G 1126\nU 1234 ; WX 684 ; N uni04D2 ; G 1127\nU 1235 ; WX 613 ; N uni04D3 ; G 1128\nU 1236 ; WX 974 ; N uni04D4 ; G 1129\nU 1237 ; WX 982 ; N uni04D5 ; G 1130\nU 1238 ; WX 632 ; N uni04D6 ; G 1131\nU 1239 ; WX 615 ; N uni04D7 ; G 1132\nU 1240 ; WX 787 ; N uni04D8 ; G 1133\nU 1241 ; WX 615 ; N uni04D9 ; G 1134\nU 1242 ; WX 787 ; N uni04DA ; G 1135\nU 1243 ; WX 615 ; N uni04DB ; G 1136\nU 1244 ; WX 1077 ; N uni04DC ; G 1137\nU 1245 ; WX 901 ; N uni04DD ; G 1138\nU 1246 ; WX 641 ; N uni04DE ; G 1139\nU 1247 ; WX 532 ; N uni04DF ; G 1140\nU 1248 ; WX 666 ; N uni04E0 ; G 1141\nU 1249 ; WX 578 ; N uni04E1 ; G 1142\nU 1250 ; WX 748 ; N uni04E2 ; G 1143\nU 1251 ; WX 650 ; N uni04E3 ; G 1144\nU 1252 ; WX 748 ; N uni04E4 ; G 1145\nU 1253 ; WX 650 ; N uni04E5 ; G 1146\nU 1254 ; WX 787 ; N uni04E6 ; G 1147\nU 1255 ; WX 612 ; N uni04E7 ; G 1148\nU 1256 ; WX 787 ; N uni04E8 ; G 1149\nU 1257 ; WX 612 ; N uni04E9 ; G 1150\nU 1258 ; WX 787 ; N uni04EA ; G 1151\nU 1259 ; WX 612 ; N uni04EB ; G 1152\nU 1260 ; WX 698 ; N uni04EC ; G 1153\nU 1261 ; WX 549 ; N uni04ED ; G 1154\nU 1262 ; WX 609 ; N uni04EE ; G 1155\nU 1263 ; WX 592 ; N uni04EF ; G 1156\nU 1264 ; WX 609 ; N uni04F0 ; G 1157\nU 1265 ; WX 592 ; N uni04F1 ; G 1158\nU 1266 ; WX 609 ; N uni04F2 ; G 1159\nU 1267 ; WX 592 ; N uni04F3 ; G 1160\nU 1268 ; WX 686 ; N uni04F4 ; G 1161\nU 1269 ; WX 591 ; N uni04F5 ; G 1162\nU 1270 ; WX 610 ; N uni04F6 ; G 1163\nU 1271 ; WX 525 ; N uni04F7 ; G 1164\nU 1272 ; WX 882 ; N uni04F8 ; G 1165\nU 1273 ; WX 790 ; N uni04F9 ; G 1166\nU 1274 ; WX 675 ; N uni04FA ; G 1167\nU 1275 ; WX 590 ; N uni04FB ; G 1168\nU 1276 ; WX 685 ; N uni04FC ; G 1169\nU 1277 ; WX 592 ; N uni04FD ; G 1170\nU 1278 ; WX 685 ; N uni04FE ; G 1171\nU 1279 ; WX 592 ; N uni04FF ; G 1172\nU 1280 ; WX 686 ; N uni0500 ; G 1173\nU 1281 ; WX 589 ; N uni0501 ; G 1174\nU 1282 ; WX 1006 ; N uni0502 ; G 1175\nU 1283 ; WX 897 ; N uni0503 ; G 1176\nU 1284 ; WX 975 ; N uni0504 ; G 1177\nU 1285 ; WX 869 ; N uni0505 ; G 1178\nU 1286 ; WX 679 ; N uni0506 ; G 1179\nU 1287 ; WX 588 ; N uni0507 ; G 1180\nU 1288 ; WX 1072 ; N uni0508 ; G 1181\nU 1289 ; WX 957 ; N uni0509 ; G 1182\nU 1290 ; WX 1113 ; N uni050A ; G 1183\nU 1291 ; WX 967 ; N uni050B ; G 1184\nU 1292 ; WX 775 ; N uni050C ; G 1185\nU 1293 ; WX 660 ; N uni050D ; G 1186\nU 1294 ; WX 773 ; N uni050E ; G 1187\nU 1295 ; WX 711 ; N uni050F ; G 1188\nU 1296 ; WX 614 ; N uni0510 ; G 1189\nU 1297 ; WX 541 ; N uni0511 ; G 1190\nU 1298 ; WX 752 ; N uni0512 ; G 1191\nU 1299 ; WX 639 ; N uni0513 ; G 1192\nU 1300 ; WX 1169 ; N uni0514 ; G 1193\nU 1301 ; WX 994 ; N uni0515 ; G 1194\nU 1302 ; WX 894 ; N uni0516 ; G 1195\nU 1303 ; WX 864 ; N uni0517 ; G 1196\nU 1304 ; WX 1032 ; N uni0518 ; G 1197\nU 1305 ; WX 986 ; N uni0519 ; G 1198\nU 1306 ; WX 787 ; N uni051A ; G 1199\nU 1307 ; WX 635 ; N uni051B ; G 1200\nU 1308 ; WX 989 ; N uni051C ; G 1201\nU 1309 ; WX 818 ; N uni051D ; G 1202\nU 1310 ; WX 710 ; N uni051E ; G 1203\nU 1311 ; WX 604 ; N uni051F ; G 1204\nU 1312 ; WX 1081 ; N uni0520 ; G 1205\nU 1313 ; WX 905 ; N uni0521 ; G 1206\nU 1314 ; WX 1081 ; N uni0522 ; G 1207\nU 1315 ; WX 912 ; N uni0523 ; G 1208\nU 1316 ; WX 793 ; N uni0524 ; G 1209\nU 1317 ; WX 683 ; N uni0525 ; G 1210\nU 1329 ; WX 766 ; N uni0531 ; G 1211\nU 1330 ; WX 732 ; N uni0532 ; G 1212\nU 1331 ; WX 753 ; N uni0533 ; G 1213\nU 1332 ; WX 753 ; N uni0534 ; G 1214\nU 1333 ; WX 732 ; N uni0535 ; G 1215\nU 1334 ; WX 772 ; N uni0536 ; G 1216\nU 1335 ; WX 640 ; N uni0537 ; G 1217\nU 1336 ; WX 732 ; N uni0538 ; G 1218\nU 1337 ; WX 859 ; N uni0539 ; G 1219\nU 1338 ; WX 753 ; N uni053A ; G 1220\nU 1339 ; WX 691 ; N uni053B ; G 1221\nU 1340 ; WX 533 ; N uni053C ; G 1222\nU 1341 ; WX 922 ; N uni053D ; G 1223\nU 1342 ; WX 863 ; N uni053E ; G 1224\nU 1343 ; WX 732 ; N uni053F ; G 1225\nU 1344 ; WX 716 ; N uni0540 ; G 1226\nU 1345 ; WX 766 ; N uni0541 ; G 1227\nU 1346 ; WX 753 ; N uni0542 ; G 1228\nU 1347 ; WX 767 ; N uni0543 ; G 1229\nU 1348 ; WX 792 ; N uni0544 ; G 1230\nU 1349 ; WX 728 ; N uni0545 ; G 1231\nU 1350 ; WX 729 ; N uni0546 ; G 1232\nU 1351 ; WX 757 ; N uni0547 ; G 1233\nU 1352 ; WX 732 ; N uni0548 ; G 1234\nU 1353 ; WX 713 ; N uni0549 ; G 1235\nU 1354 ; WX 800 ; N uni054A ; G 1236\nU 1355 ; WX 768 ; N uni054B ; G 1237\nU 1356 ; WX 792 ; N uni054C ; G 1238\nU 1357 ; WX 732 ; N uni054D ; G 1239\nU 1358 ; WX 753 ; N uni054E ; G 1240\nU 1359 ; WX 705 ; N uni054F ; G 1241\nU 1360 ; WX 694 ; N uni0550 ; G 1242\nU 1361 ; WX 744 ; N uni0551 ; G 1243\nU 1362 ; WX 538 ; N uni0552 ; G 1244\nU 1363 ; WX 811 ; N uni0553 ; G 1245\nU 1364 ; WX 757 ; N uni0554 ; G 1246\nU 1365 ; WX 787 ; N uni0555 ; G 1247\nU 1366 ; WX 790 ; N uni0556 ; G 1248\nU 1369 ; WX 307 ; N uni0559 ; G 1249\nU 1370 ; WX 318 ; N uni055A ; G 1250\nU 1371 ; WX 234 ; N uni055B ; G 1251\nU 1372 ; WX 361 ; N uni055C ; G 1252\nU 1373 ; WX 238 ; N uni055D ; G 1253\nU 1374 ; WX 405 ; N uni055E ; G 1254\nU 1375 ; WX 500 ; N uni055F ; G 1255\nU 1377 ; WX 974 ; N uni0561 ; G 1256\nU 1378 ; WX 634 ; N uni0562 ; G 1257\nU 1379 ; WX 658 ; N uni0563 ; G 1258\nU 1380 ; WX 663 ; N uni0564 ; G 1259\nU 1381 ; WX 634 ; N uni0565 ; G 1260\nU 1382 ; WX 635 ; N uni0566 ; G 1261\nU 1383 ; WX 515 ; N uni0567 ; G 1262\nU 1384 ; WX 634 ; N uni0568 ; G 1263\nU 1385 ; WX 738 ; N uni0569 ; G 1264\nU 1386 ; WX 658 ; N uni056A ; G 1265\nU 1387 ; WX 634 ; N uni056B ; G 1266\nU 1388 ; WX 271 ; N uni056C ; G 1267\nU 1389 ; WX 980 ; N uni056D ; G 1268\nU 1390 ; WX 623 ; N uni056E ; G 1269\nU 1391 ; WX 634 ; N uni056F ; G 1270\nU 1392 ; WX 634 ; N uni0570 ; G 1271\nU 1393 ; WX 608 ; N uni0571 ; G 1272\nU 1394 ; WX 634 ; N uni0572 ; G 1273\nU 1395 ; WX 629 ; N uni0573 ; G 1274\nU 1396 ; WX 634 ; N uni0574 ; G 1275\nU 1397 ; WX 271 ; N uni0575 ; G 1276\nU 1398 ; WX 634 ; N uni0576 ; G 1277\nU 1399 ; WX 499 ; N uni0577 ; G 1278\nU 1400 ; WX 634 ; N uni0578 ; G 1279\nU 1401 ; WX 404 ; N uni0579 ; G 1280\nU 1402 ; WX 974 ; N uni057A ; G 1281\nU 1403 ; WX 560 ; N uni057B ; G 1282\nU 1404 ; WX 648 ; N uni057C ; G 1283\nU 1405 ; WX 634 ; N uni057D ; G 1284\nU 1406 ; WX 634 ; N uni057E ; G 1285\nU 1407 ; WX 974 ; N uni057F ; G 1286\nU 1408 ; WX 634 ; N uni0580 ; G 1287\nU 1409 ; WX 633 ; N uni0581 ; G 1288\nU 1410 ; WX 435 ; N uni0582 ; G 1289\nU 1411 ; WX 974 ; N uni0583 ; G 1290\nU 1412 ; WX 636 ; N uni0584 ; G 1291\nU 1413 ; WX 609 ; N uni0585 ; G 1292\nU 1414 ; WX 805 ; N uni0586 ; G 1293\nU 1415 ; WX 812 ; N uni0587 ; G 1294\nU 1417 ; WX 337 ; N uni0589 ; G 1295\nU 1418 ; WX 361 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 361 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 295 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 295 ; N uni05C3 ; G 1316\nU 1478 ; WX 441 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 668 ; N uni05D0 ; G 1319\nU 1489 ; WX 578 ; N uni05D1 ; G 1320\nU 1490 ; WX 412 ; N uni05D2 ; G 1321\nU 1491 ; WX 546 ; N uni05D3 ; G 1322\nU 1492 ; WX 653 ; N uni05D4 ; G 1323\nU 1493 ; WX 272 ; N uni05D5 ; G 1324\nU 1494 ; WX 346 ; N uni05D6 ; G 1325\nU 1495 ; WX 653 ; N uni05D7 ; G 1326\nU 1496 ; WX 648 ; N uni05D8 ; G 1327\nU 1497 ; WX 224 ; N uni05D9 ; G 1328\nU 1498 ; WX 537 ; N uni05DA ; G 1329\nU 1499 ; WX 529 ; N uni05DB ; G 1330\nU 1500 ; WX 568 ; N uni05DC ; G 1331\nU 1501 ; WX 664 ; N uni05DD ; G 1332\nU 1502 ; WX 679 ; N uni05DE ; G 1333\nU 1503 ; WX 272 ; N uni05DF ; G 1334\nU 1504 ; WX 400 ; N uni05E0 ; G 1335\nU 1505 ; WX 649 ; N uni05E1 ; G 1336\nU 1506 ; WX 626 ; N uni05E2 ; G 1337\nU 1507 ; WX 640 ; N uni05E3 ; G 1338\nU 1508 ; WX 625 ; N uni05E4 ; G 1339\nU 1509 ; WX 540 ; N uni05E5 ; G 1340\nU 1510 ; WX 593 ; N uni05E6 ; G 1341\nU 1511 ; WX 709 ; N uni05E7 ; G 1342\nU 1512 ; WX 564 ; N uni05E8 ; G 1343\nU 1513 ; WX 708 ; N uni05E9 ; G 1344\nU 1514 ; WX 657 ; N uni05EA ; G 1345\nU 1520 ; WX 471 ; N uni05F0 ; G 1346\nU 1521 ; WX 423 ; N uni05F1 ; G 1347\nU 1522 ; WX 331 ; N uni05F2 ; G 1348\nU 1523 ; WX 416 ; N uni05F3 ; G 1349\nU 1524 ; WX 645 ; N uni05F4 ; G 1350\nU 1542 ; WX 637 ; N uni0606 ; G 1351\nU 1543 ; WX 637 ; N uni0607 ; G 1352\nU 1545 ; WX 757 ; N uni0609 ; G 1353\nU 1546 ; WX 977 ; N uni060A ; G 1354\nU 1548 ; WX 323 ; N uni060C ; G 1355\nU 1557 ; WX 0 ; N uni0615 ; G 1356\nU 1563 ; WX 318 ; N uni061B ; G 1357\nU 1567 ; WX 531 ; N uni061F ; G 1358\nU 1569 ; WX 470 ; N uni0621 ; G 1359\nU 1570 ; WX 278 ; N uni0622 ; G 1360\nU 1571 ; WX 278 ; N uni0623 ; G 1361\nU 1572 ; WX 483 ; N uni0624 ; G 1362\nU 1573 ; WX 278 ; N uni0625 ; G 1363\nU 1574 ; WX 783 ; N uni0626 ; G 1364\nU 1575 ; WX 278 ; N uni0627 ; G 1365\nU 1576 ; WX 941 ; N uni0628 ; G 1366\nU 1577 ; WX 524 ; N uni0629 ; G 1367\nU 1578 ; WX 941 ; N uni062A ; G 1368\nU 1579 ; WX 941 ; N uni062B ; G 1369\nU 1580 ; WX 646 ; N uni062C ; G 1370\nU 1581 ; WX 646 ; N uni062D ; G 1371\nU 1582 ; WX 646 ; N uni062E ; G 1372\nU 1583 ; WX 445 ; N uni062F ; G 1373\nU 1584 ; WX 445 ; N uni0630 ; G 1374\nU 1585 ; WX 483 ; N uni0631 ; G 1375\nU 1586 ; WX 483 ; N uni0632 ; G 1376\nU 1587 ; WX 1221 ; N uni0633 ; G 1377\nU 1588 ; WX 1221 ; N uni0634 ; G 1378\nU 1589 ; WX 1209 ; N uni0635 ; G 1379\nU 1590 ; WX 1209 ; N uni0636 ; G 1380\nU 1591 ; WX 925 ; N uni0637 ; G 1381\nU 1592 ; WX 925 ; N uni0638 ; G 1382\nU 1593 ; WX 597 ; N uni0639 ; G 1383\nU 1594 ; WX 597 ; N uni063A ; G 1384\nU 1600 ; WX 293 ; N uni0640 ; G 1385\nU 1601 ; WX 1037 ; N uni0641 ; G 1386\nU 1602 ; WX 776 ; N uni0642 ; G 1387\nU 1603 ; WX 824 ; N uni0643 ; G 1388\nU 1604 ; WX 727 ; N uni0644 ; G 1389\nU 1605 ; WX 619 ; N uni0645 ; G 1390\nU 1606 ; WX 734 ; N uni0646 ; G 1391\nU 1607 ; WX 524 ; N uni0647 ; G 1392\nU 1608 ; WX 483 ; N uni0648 ; G 1393\nU 1609 ; WX 783 ; N uni0649 ; G 1394\nU 1610 ; WX 783 ; N uni064A ; G 1395\nU 1611 ; WX 0 ; N uni064B ; G 1396\nU 1612 ; WX 0 ; N uni064C ; G 1397\nU 1613 ; WX 0 ; N uni064D ; G 1398\nU 1614 ; WX 0 ; N uni064E ; G 1399\nU 1615 ; WX 0 ; N uni064F ; G 1400\nU 1616 ; WX 0 ; N uni0650 ; G 1401\nU 1617 ; WX 0 ; N uni0651 ; G 1402\nU 1618 ; WX 0 ; N uni0652 ; G 1403\nU 1619 ; WX 0 ; N uni0653 ; G 1404\nU 1620 ; WX 0 ; N uni0654 ; G 1405\nU 1621 ; WX 0 ; N uni0655 ; G 1406\nU 1623 ; WX 0 ; N uni0657 ; G 1407\nU 1626 ; WX 500 ; N uni065A ; G 1408\nU 1632 ; WX 537 ; N uni0660 ; G 1409\nU 1633 ; WX 537 ; N uni0661 ; G 1410\nU 1634 ; WX 537 ; N uni0662 ; G 1411\nU 1635 ; WX 537 ; N uni0663 ; G 1412\nU 1636 ; WX 537 ; N uni0664 ; G 1413\nU 1637 ; WX 537 ; N uni0665 ; G 1414\nU 1638 ; WX 537 ; N uni0666 ; G 1415\nU 1639 ; WX 537 ; N uni0667 ; G 1416\nU 1640 ; WX 537 ; N uni0668 ; G 1417\nU 1641 ; WX 537 ; N uni0669 ; G 1418\nU 1642 ; WX 537 ; N uni066A ; G 1419\nU 1643 ; WX 325 ; N uni066B ; G 1420\nU 1644 ; WX 318 ; N uni066C ; G 1421\nU 1645 ; WX 545 ; N uni066D ; G 1422\nU 1646 ; WX 941 ; N uni066E ; G 1423\nU 1647 ; WX 776 ; N uni066F ; G 1424\nU 1648 ; WX 0 ; N uni0670 ; G 1425\nU 1652 ; WX 292 ; N uni0674 ; G 1426\nU 1657 ; WX 941 ; N uni0679 ; G 1427\nU 1658 ; WX 941 ; N uni067A ; G 1428\nU 1659 ; WX 941 ; N uni067B ; G 1429\nU 1660 ; WX 941 ; N uni067C ; G 1430\nU 1661 ; WX 941 ; N uni067D ; G 1431\nU 1662 ; WX 941 ; N uni067E ; G 1432\nU 1663 ; WX 941 ; N uni067F ; G 1433\nU 1664 ; WX 941 ; N uni0680 ; G 1434\nU 1665 ; WX 646 ; N uni0681 ; G 1435\nU 1666 ; WX 646 ; N uni0682 ; G 1436\nU 1667 ; WX 646 ; N uni0683 ; G 1437\nU 1668 ; WX 646 ; N uni0684 ; G 1438\nU 1669 ; WX 646 ; N uni0685 ; G 1439\nU 1670 ; WX 646 ; N uni0686 ; G 1440\nU 1671 ; WX 646 ; N uni0687 ; G 1441\nU 1672 ; WX 445 ; N uni0688 ; G 1442\nU 1673 ; WX 445 ; N uni0689 ; G 1443\nU 1674 ; WX 445 ; N uni068A ; G 1444\nU 1675 ; WX 445 ; N uni068B ; G 1445\nU 1676 ; WX 445 ; N uni068C ; G 1446\nU 1677 ; WX 445 ; N uni068D ; G 1447\nU 1678 ; WX 445 ; N uni068E ; G 1448\nU 1679 ; WX 445 ; N uni068F ; G 1449\nU 1680 ; WX 445 ; N uni0690 ; G 1450\nU 1681 ; WX 483 ; N uni0691 ; G 1451\nU 1682 ; WX 483 ; N uni0692 ; G 1452\nU 1683 ; WX 498 ; N uni0693 ; G 1453\nU 1684 ; WX 530 ; N uni0694 ; G 1454\nU 1685 ; WX 610 ; N uni0695 ; G 1455\nU 1686 ; WX 530 ; N uni0696 ; G 1456\nU 1687 ; WX 483 ; N uni0697 ; G 1457\nU 1688 ; WX 483 ; N uni0698 ; G 1458\nU 1689 ; WX 483 ; N uni0699 ; G 1459\nU 1690 ; WX 1221 ; N uni069A ; G 1460\nU 1691 ; WX 1221 ; N uni069B ; G 1461\nU 1692 ; WX 1221 ; N uni069C ; G 1462\nU 1693 ; WX 1209 ; N uni069D ; G 1463\nU 1694 ; WX 1209 ; N uni069E ; G 1464\nU 1695 ; WX 925 ; N uni069F ; G 1465\nU 1696 ; WX 597 ; N uni06A0 ; G 1466\nU 1697 ; WX 1037 ; N uni06A1 ; G 1467\nU 1698 ; WX 1037 ; N uni06A2 ; G 1468\nU 1699 ; WX 1037 ; N uni06A3 ; G 1469\nU 1700 ; WX 1037 ; N uni06A4 ; G 1470\nU 1701 ; WX 1037 ; N uni06A5 ; G 1471\nU 1702 ; WX 1037 ; N uni06A6 ; G 1472\nU 1703 ; WX 776 ; N uni06A7 ; G 1473\nU 1704 ; WX 776 ; N uni06A8 ; G 1474\nU 1705 ; WX 895 ; N uni06A9 ; G 1475\nU 1706 ; WX 1054 ; N uni06AA ; G 1476\nU 1707 ; WX 895 ; N uni06AB ; G 1477\nU 1708 ; WX 824 ; N uni06AC ; G 1478\nU 1709 ; WX 824 ; N uni06AD ; G 1479\nU 1710 ; WX 824 ; N uni06AE ; G 1480\nU 1711 ; WX 895 ; N uni06AF ; G 1481\nU 1712 ; WX 895 ; N uni06B0 ; G 1482\nU 1713 ; WX 895 ; N uni06B1 ; G 1483\nU 1714 ; WX 895 ; N uni06B2 ; G 1484\nU 1715 ; WX 895 ; N uni06B3 ; G 1485\nU 1716 ; WX 895 ; N uni06B4 ; G 1486\nU 1717 ; WX 727 ; N uni06B5 ; G 1487\nU 1718 ; WX 727 ; N uni06B6 ; G 1488\nU 1719 ; WX 727 ; N uni06B7 ; G 1489\nU 1720 ; WX 727 ; N uni06B8 ; G 1490\nU 1721 ; WX 734 ; N uni06B9 ; G 1491\nU 1722 ; WX 734 ; N uni06BA ; G 1492\nU 1723 ; WX 734 ; N uni06BB ; G 1493\nU 1724 ; WX 734 ; N uni06BC ; G 1494\nU 1725 ; WX 734 ; N uni06BD ; G 1495\nU 1726 ; WX 698 ; N uni06BE ; G 1496\nU 1727 ; WX 646 ; N uni06BF ; G 1497\nU 1734 ; WX 483 ; N uni06C6 ; G 1498\nU 1735 ; WX 483 ; N uni06C7 ; G 1499\nU 1736 ; WX 483 ; N uni06C8 ; G 1500\nU 1739 ; WX 483 ; N uni06CB ; G 1501\nU 1740 ; WX 783 ; N uni06CC ; G 1502\nU 1742 ; WX 783 ; N uni06CE ; G 1503\nU 1744 ; WX 783 ; N uni06D0 ; G 1504\nU 1749 ; WX 524 ; N uni06D5 ; G 1505\nU 1776 ; WX 537 ; N uni06F0 ; G 1506\nU 1777 ; WX 537 ; N uni06F1 ; G 1507\nU 1778 ; WX 537 ; N uni06F2 ; G 1508\nU 1779 ; WX 537 ; N uni06F3 ; G 1509\nU 1780 ; WX 537 ; N uni06F4 ; G 1510\nU 1781 ; WX 537 ; N uni06F5 ; G 1511\nU 1782 ; WX 537 ; N uni06F6 ; G 1512\nU 1783 ; WX 537 ; N uni06F7 ; G 1513\nU 1784 ; WX 537 ; N uni06F8 ; G 1514\nU 1785 ; WX 537 ; N uni06F9 ; G 1515\nU 1984 ; WX 636 ; N uni07C0 ; G 1516\nU 1985 ; WX 636 ; N uni07C1 ; G 1517\nU 1986 ; WX 636 ; N uni07C2 ; G 1518\nU 1987 ; WX 636 ; N uni07C3 ; G 1519\nU 1988 ; WX 636 ; N uni07C4 ; G 1520\nU 1989 ; WX 636 ; N uni07C5 ; G 1521\nU 1990 ; WX 636 ; N uni07C6 ; G 1522\nU 1991 ; WX 636 ; N uni07C7 ; G 1523\nU 1992 ; WX 636 ; N uni07C8 ; G 1524\nU 1993 ; WX 636 ; N uni07C9 ; G 1525\nU 1994 ; WX 278 ; N uni07CA ; G 1526\nU 1995 ; WX 571 ; N uni07CB ; G 1527\nU 1996 ; WX 424 ; N uni07CC ; G 1528\nU 1997 ; WX 592 ; N uni07CD ; G 1529\nU 1998 ; WX 654 ; N uni07CE ; G 1530\nU 1999 ; WX 654 ; N uni07CF ; G 1531\nU 2000 ; WX 594 ; N uni07D0 ; G 1532\nU 2001 ; WX 654 ; N uni07D1 ; G 1533\nU 2002 ; WX 829 ; N uni07D2 ; G 1534\nU 2003 ; WX 438 ; N uni07D3 ; G 1535\nU 2004 ; WX 438 ; N uni07D4 ; G 1536\nU 2005 ; WX 559 ; N uni07D5 ; G 1537\nU 2006 ; WX 612 ; N uni07D6 ; G 1538\nU 2007 ; WX 350 ; N uni07D7 ; G 1539\nU 2008 ; WX 959 ; N uni07D8 ; G 1540\nU 2009 ; WX 473 ; N uni07D9 ; G 1541\nU 2010 ; WX 783 ; N uni07DA ; G 1542\nU 2011 ; WX 654 ; N uni07DB ; G 1543\nU 2012 ; WX 625 ; N uni07DC ; G 1544\nU 2013 ; WX 734 ; N uni07DD ; G 1545\nU 2014 ; WX 530 ; N uni07DE ; G 1546\nU 2015 ; WX 724 ; N uni07DF ; G 1547\nU 2016 ; WX 473 ; N uni07E0 ; G 1548\nU 2017 ; WX 625 ; N uni07E1 ; G 1549\nU 2018 ; WX 594 ; N uni07E2 ; G 1550\nU 2019 ; WX 530 ; N uni07E3 ; G 1551\nU 2020 ; WX 530 ; N uni07E4 ; G 1552\nU 2021 ; WX 522 ; N uni07E5 ; G 1553\nU 2022 ; WX 594 ; N uni07E6 ; G 1554\nU 2023 ; WX 594 ; N uni07E7 ; G 1555\nU 2027 ; WX 0 ; N uni07EB ; G 1556\nU 2028 ; WX 0 ; N uni07EC ; G 1557\nU 2029 ; WX 0 ; N uni07ED ; G 1558\nU 2030 ; WX 0 ; N uni07EE ; G 1559\nU 2031 ; WX 0 ; N uni07EF ; G 1560\nU 2032 ; WX 0 ; N uni07F0 ; G 1561\nU 2033 ; WX 0 ; N uni07F1 ; G 1562\nU 2034 ; WX 0 ; N uni07F2 ; G 1563\nU 2035 ; WX 0 ; N uni07F3 ; G 1564\nU 2036 ; WX 313 ; N uni07F4 ; G 1565\nU 2037 ; WX 313 ; N uni07F5 ; G 1566\nU 2040 ; WX 560 ; N uni07F8 ; G 1567\nU 2041 ; WX 560 ; N uni07F9 ; G 1568\nU 2042 ; WX 361 ; N uni07FA ; G 1569\nU 3647 ; WX 636 ; N uni0E3F ; G 1570\nU 3713 ; WX 670 ; N uni0E81 ; G 1571\nU 3714 ; WX 684 ; N uni0E82 ; G 1572\nU 3716 ; WX 688 ; N uni0E84 ; G 1573\nU 3719 ; WX 482 ; N uni0E87 ; G 1574\nU 3720 ; WX 628 ; N uni0E88 ; G 1575\nU 3722 ; WX 684 ; N uni0E8A ; G 1576\nU 3725 ; WX 688 ; N uni0E8D ; G 1577\nU 3732 ; WX 669 ; N uni0E94 ; G 1578\nU 3733 ; WX 642 ; N uni0E95 ; G 1579\nU 3734 ; WX 645 ; N uni0E96 ; G 1580\nU 3735 ; WX 655 ; N uni0E97 ; G 1581\nU 3737 ; WX 659 ; N uni0E99 ; G 1582\nU 3738 ; WX 625 ; N uni0E9A ; G 1583\nU 3739 ; WX 625 ; N uni0E9B ; G 1584\nU 3740 ; WX 745 ; N uni0E9C ; G 1585\nU 3741 ; WX 767 ; N uni0E9D ; G 1586\nU 3742 ; WX 687 ; N uni0E9E ; G 1587\nU 3743 ; WX 687 ; N uni0E9F ; G 1588\nU 3745 ; WX 702 ; N uni0EA1 ; G 1589\nU 3746 ; WX 688 ; N uni0EA2 ; G 1590\nU 3747 ; WX 684 ; N uni0EA3 ; G 1591\nU 3749 ; WX 649 ; N uni0EA5 ; G 1592\nU 3751 ; WX 632 ; N uni0EA7 ; G 1593\nU 3754 ; WX 703 ; N uni0EAA ; G 1594\nU 3755 ; WX 819 ; N uni0EAB ; G 1595\nU 3757 ; WX 633 ; N uni0EAD ; G 1596\nU 3758 ; WX 684 ; N uni0EAE ; G 1597\nU 3759 ; WX 788 ; N uni0EAF ; G 1598\nU 3760 ; WX 632 ; N uni0EB0 ; G 1599\nU 3761 ; WX 0 ; N uni0EB1 ; G 1600\nU 3762 ; WX 539 ; N uni0EB2 ; G 1601\nU 3763 ; WX 539 ; N uni0EB3 ; G 1602\nU 3764 ; WX 0 ; N uni0EB4 ; G 1603\nU 3765 ; WX 0 ; N uni0EB5 ; G 1604\nU 3766 ; WX 0 ; N uni0EB6 ; G 1605\nU 3767 ; WX 0 ; N uni0EB7 ; G 1606\nU 3768 ; WX 0 ; N uni0EB8 ; G 1607\nU 3769 ; WX 0 ; N uni0EB9 ; G 1608\nU 3771 ; WX 0 ; N uni0EBB ; G 1609\nU 3772 ; WX 0 ; N uni0EBC ; G 1610\nU 3773 ; WX 663 ; N uni0EBD ; G 1611\nU 3776 ; WX 375 ; N uni0EC0 ; G 1612\nU 3777 ; WX 657 ; N uni0EC1 ; G 1613\nU 3778 ; WX 460 ; N uni0EC2 ; G 1614\nU 3779 ; WX 547 ; N uni0EC3 ; G 1615\nU 3780 ; WX 491 ; N uni0EC4 ; G 1616\nU 3782 ; WX 674 ; N uni0EC6 ; G 1617\nU 3784 ; WX 0 ; N uni0EC8 ; G 1618\nU 3785 ; WX 0 ; N uni0EC9 ; G 1619\nU 3786 ; WX 0 ; N uni0ECA ; G 1620\nU 3787 ; WX 0 ; N uni0ECB ; G 1621\nU 3788 ; WX 0 ; N uni0ECC ; G 1622\nU 3789 ; WX 0 ; N uni0ECD ; G 1623\nU 3792 ; WX 636 ; N uni0ED0 ; G 1624\nU 3793 ; WX 641 ; N uni0ED1 ; G 1625\nU 3794 ; WX 641 ; N uni0ED2 ; G 1626\nU 3795 ; WX 670 ; N uni0ED3 ; G 1627\nU 3796 ; WX 625 ; N uni0ED4 ; G 1628\nU 3797 ; WX 625 ; N uni0ED5 ; G 1629\nU 3798 ; WX 703 ; N uni0ED6 ; G 1630\nU 3799 ; WX 670 ; N uni0ED7 ; G 1631\nU 3800 ; WX 674 ; N uni0ED8 ; G 1632\nU 3801 ; WX 677 ; N uni0ED9 ; G 1633\nU 3804 ; WX 1028 ; N uni0EDC ; G 1634\nU 3805 ; WX 1028 ; N uni0EDD ; G 1635\nU 4256 ; WX 874 ; N uni10A0 ; G 1636\nU 4257 ; WX 733 ; N uni10A1 ; G 1637\nU 4258 ; WX 679 ; N uni10A2 ; G 1638\nU 4259 ; WX 834 ; N uni10A3 ; G 1639\nU 4260 ; WX 615 ; N uni10A4 ; G 1640\nU 4261 ; WX 768 ; N uni10A5 ; G 1641\nU 4262 ; WX 753 ; N uni10A6 ; G 1642\nU 4263 ; WX 914 ; N uni10A7 ; G 1643\nU 4264 ; WX 453 ; N uni10A8 ; G 1644\nU 4265 ; WX 620 ; N uni10A9 ; G 1645\nU 4266 ; WX 843 ; N uni10AA ; G 1646\nU 4267 ; WX 882 ; N uni10AB ; G 1647\nU 4268 ; WX 625 ; N uni10AC ; G 1648\nU 4269 ; WX 854 ; N uni10AD ; G 1649\nU 4270 ; WX 781 ; N uni10AE ; G 1650\nU 4271 ; WX 629 ; N uni10AF ; G 1651\nU 4272 ; WX 912 ; N uni10B0 ; G 1652\nU 4273 ; WX 621 ; N uni10B1 ; G 1653\nU 4274 ; WX 620 ; N uni10B2 ; G 1654\nU 4275 ; WX 854 ; N uni10B3 ; G 1655\nU 4276 ; WX 866 ; N uni10B4 ; G 1656\nU 4277 ; WX 724 ; N uni10B5 ; G 1657\nU 4278 ; WX 630 ; N uni10B6 ; G 1658\nU 4279 ; WX 621 ; N uni10B7 ; G 1659\nU 4280 ; WX 625 ; N uni10B8 ; G 1660\nU 4281 ; WX 620 ; N uni10B9 ; G 1661\nU 4282 ; WX 818 ; N uni10BA ; G 1662\nU 4283 ; WX 874 ; N uni10BB ; G 1663\nU 4284 ; WX 615 ; N uni10BC ; G 1664\nU 4285 ; WX 623 ; N uni10BD ; G 1665\nU 4286 ; WX 625 ; N uni10BE ; G 1666\nU 4287 ; WX 725 ; N uni10BF ; G 1667\nU 4288 ; WX 844 ; N uni10C0 ; G 1668\nU 4289 ; WX 596 ; N uni10C1 ; G 1669\nU 4290 ; WX 688 ; N uni10C2 ; G 1670\nU 4291 ; WX 596 ; N uni10C3 ; G 1671\nU 4292 ; WX 594 ; N uni10C4 ; G 1672\nU 4293 ; WX 738 ; N uni10C5 ; G 1673\nU 4304 ; WX 508 ; N uni10D0 ; G 1674\nU 4305 ; WX 518 ; N uni10D1 ; G 1675\nU 4306 ; WX 581 ; N uni10D2 ; G 1676\nU 4307 ; WX 818 ; N uni10D3 ; G 1677\nU 4308 ; WX 508 ; N uni10D4 ; G 1678\nU 4309 ; WX 513 ; N uni10D5 ; G 1679\nU 4310 ; WX 500 ; N uni10D6 ; G 1680\nU 4311 ; WX 801 ; N uni10D7 ; G 1681\nU 4312 ; WX 518 ; N uni10D8 ; G 1682\nU 4313 ; WX 510 ; N uni10D9 ; G 1683\nU 4314 ; WX 1064 ; N uni10DA ; G 1684\nU 4315 ; WX 522 ; N uni10DB ; G 1685\nU 4316 ; WX 522 ; N uni10DC ; G 1686\nU 4317 ; WX 786 ; N uni10DD ; G 1687\nU 4318 ; WX 508 ; N uni10DE ; G 1688\nU 4319 ; WX 518 ; N uni10DF ; G 1689\nU 4320 ; WX 796 ; N uni10E0 ; G 1690\nU 4321 ; WX 522 ; N uni10E1 ; G 1691\nU 4322 ; WX 654 ; N uni10E2 ; G 1692\nU 4323 ; WX 522 ; N uni10E3 ; G 1693\nU 4324 ; WX 825 ; N uni10E4 ; G 1694\nU 4325 ; WX 513 ; N uni10E5 ; G 1695\nU 4326 ; WX 786 ; N uni10E6 ; G 1696\nU 4327 ; WX 518 ; N uni10E7 ; G 1697\nU 4328 ; WX 518 ; N uni10E8 ; G 1698\nU 4329 ; WX 522 ; N uni10E9 ; G 1699\nU 4330 ; WX 571 ; N uni10EA ; G 1700\nU 4331 ; WX 522 ; N uni10EB ; G 1701\nU 4332 ; WX 518 ; N uni10EC ; G 1702\nU 4333 ; WX 520 ; N uni10ED ; G 1703\nU 4334 ; WX 522 ; N uni10EE ; G 1704\nU 4335 ; WX 454 ; N uni10EF ; G 1705\nU 4336 ; WX 508 ; N uni10F0 ; G 1706\nU 4337 ; WX 518 ; N uni10F1 ; G 1707\nU 4338 ; WX 508 ; N uni10F2 ; G 1708\nU 4339 ; WX 508 ; N uni10F3 ; G 1709\nU 4340 ; WX 518 ; N uni10F4 ; G 1710\nU 4341 ; WX 554 ; N uni10F5 ; G 1711\nU 4342 ; WX 828 ; N uni10F6 ; G 1712\nU 4343 ; WX 552 ; N uni10F7 ; G 1713\nU 4344 ; WX 508 ; N uni10F8 ; G 1714\nU 4345 ; WX 571 ; N uni10F9 ; G 1715\nU 4346 ; WX 508 ; N uni10FA ; G 1716\nU 4347 ; WX 448 ; N uni10FB ; G 1717\nU 4348 ; WX 324 ; N uni10FC ; G 1718\nU 5121 ; WX 684 ; N uni1401 ; G 1719\nU 5122 ; WX 684 ; N uni1402 ; G 1720\nU 5123 ; WX 684 ; N uni1403 ; G 1721\nU 5124 ; WX 684 ; N uni1404 ; G 1722\nU 5125 ; WX 769 ; N uni1405 ; G 1723\nU 5126 ; WX 769 ; N uni1406 ; G 1724\nU 5127 ; WX 769 ; N uni1407 ; G 1725\nU 5129 ; WX 769 ; N uni1409 ; G 1726\nU 5130 ; WX 769 ; N uni140A ; G 1727\nU 5131 ; WX 769 ; N uni140B ; G 1728\nU 5132 ; WX 835 ; N uni140C ; G 1729\nU 5133 ; WX 834 ; N uni140D ; G 1730\nU 5134 ; WX 835 ; N uni140E ; G 1731\nU 5135 ; WX 834 ; N uni140F ; G 1732\nU 5136 ; WX 835 ; N uni1410 ; G 1733\nU 5137 ; WX 834 ; N uni1411 ; G 1734\nU 5138 ; WX 967 ; N uni1412 ; G 1735\nU 5139 ; WX 1007 ; N uni1413 ; G 1736\nU 5140 ; WX 967 ; N uni1414 ; G 1737\nU 5141 ; WX 1007 ; N uni1415 ; G 1738\nU 5142 ; WX 769 ; N uni1416 ; G 1739\nU 5143 ; WX 967 ; N uni1417 ; G 1740\nU 5144 ; WX 1007 ; N uni1418 ; G 1741\nU 5145 ; WX 967 ; N uni1419 ; G 1742\nU 5146 ; WX 1007 ; N uni141A ; G 1743\nU 5147 ; WX 769 ; N uni141B ; G 1744\nU 5149 ; WX 256 ; N uni141D ; G 1745\nU 5150 ; WX 543 ; N uni141E ; G 1746\nU 5151 ; WX 423 ; N uni141F ; G 1747\nU 5152 ; WX 423 ; N uni1420 ; G 1748\nU 5153 ; WX 389 ; N uni1421 ; G 1749\nU 5154 ; WX 389 ; N uni1422 ; G 1750\nU 5155 ; WX 393 ; N uni1423 ; G 1751\nU 5156 ; WX 389 ; N uni1424 ; G 1752\nU 5157 ; WX 466 ; N uni1425 ; G 1753\nU 5158 ; WX 385 ; N uni1426 ; G 1754\nU 5159 ; WX 256 ; N uni1427 ; G 1755\nU 5160 ; WX 389 ; N uni1428 ; G 1756\nU 5161 ; WX 389 ; N uni1429 ; G 1757\nU 5162 ; WX 389 ; N uni142A ; G 1758\nU 5163 ; WX 1090 ; N uni142B ; G 1759\nU 5164 ; WX 909 ; N uni142C ; G 1760\nU 5165 ; WX 953 ; N uni142D ; G 1761\nU 5166 ; WX 1117 ; N uni142E ; G 1762\nU 5167 ; WX 684 ; N uni142F ; G 1763\nU 5168 ; WX 684 ; N uni1430 ; G 1764\nU 5169 ; WX 684 ; N uni1431 ; G 1765\nU 5170 ; WX 684 ; N uni1432 ; G 1766\nU 5171 ; WX 729 ; N uni1433 ; G 1767\nU 5172 ; WX 729 ; N uni1434 ; G 1768\nU 5173 ; WX 729 ; N uni1435 ; G 1769\nU 5175 ; WX 729 ; N uni1437 ; G 1770\nU 5176 ; WX 729 ; N uni1438 ; G 1771\nU 5177 ; WX 729 ; N uni1439 ; G 1772\nU 5178 ; WX 835 ; N uni143A ; G 1773\nU 5179 ; WX 684 ; N uni143B ; G 1774\nU 5180 ; WX 835 ; N uni143C ; G 1775\nU 5181 ; WX 834 ; N uni143D ; G 1776\nU 5182 ; WX 835 ; N uni143E ; G 1777\nU 5183 ; WX 834 ; N uni143F ; G 1778\nU 5184 ; WX 967 ; N uni1440 ; G 1779\nU 5185 ; WX 1007 ; N uni1441 ; G 1780\nU 5186 ; WX 967 ; N uni1442 ; G 1781\nU 5187 ; WX 1007 ; N uni1443 ; G 1782\nU 5188 ; WX 967 ; N uni1444 ; G 1783\nU 5189 ; WX 1007 ; N uni1445 ; G 1784\nU 5190 ; WX 967 ; N uni1446 ; G 1785\nU 5191 ; WX 1007 ; N uni1447 ; G 1786\nU 5192 ; WX 729 ; N uni1448 ; G 1787\nU 5193 ; WX 508 ; N uni1449 ; G 1788\nU 5194 ; WX 192 ; N uni144A ; G 1789\nU 5196 ; WX 732 ; N uni144C ; G 1790\nU 5197 ; WX 732 ; N uni144D ; G 1791\nU 5198 ; WX 732 ; N uni144E ; G 1792\nU 5199 ; WX 732 ; N uni144F ; G 1793\nU 5200 ; WX 730 ; N uni1450 ; G 1794\nU 5201 ; WX 730 ; N uni1451 ; G 1795\nU 5202 ; WX 730 ; N uni1452 ; G 1796\nU 5204 ; WX 730 ; N uni1454 ; G 1797\nU 5205 ; WX 730 ; N uni1455 ; G 1798\nU 5206 ; WX 730 ; N uni1456 ; G 1799\nU 5207 ; WX 921 ; N uni1457 ; G 1800\nU 5208 ; WX 889 ; N uni1458 ; G 1801\nU 5209 ; WX 921 ; N uni1459 ; G 1802\nU 5210 ; WX 889 ; N uni145A ; G 1803\nU 5211 ; WX 921 ; N uni145B ; G 1804\nU 5212 ; WX 889 ; N uni145C ; G 1805\nU 5213 ; WX 928 ; N uni145D ; G 1806\nU 5214 ; WX 900 ; N uni145E ; G 1807\nU 5215 ; WX 928 ; N uni145F ; G 1808\nU 5216 ; WX 900 ; N uni1460 ; G 1809\nU 5217 ; WX 947 ; N uni1461 ; G 1810\nU 5218 ; WX 900 ; N uni1462 ; G 1811\nU 5219 ; WX 947 ; N uni1463 ; G 1812\nU 5220 ; WX 900 ; N uni1464 ; G 1813\nU 5221 ; WX 947 ; N uni1465 ; G 1814\nU 5222 ; WX 434 ; N uni1466 ; G 1815\nU 5223 ; WX 877 ; N uni1467 ; G 1816\nU 5224 ; WX 877 ; N uni1468 ; G 1817\nU 5225 ; WX 866 ; N uni1469 ; G 1818\nU 5226 ; WX 890 ; N uni146A ; G 1819\nU 5227 ; WX 628 ; N uni146B ; G 1820\nU 5228 ; WX 628 ; N uni146C ; G 1821\nU 5229 ; WX 628 ; N uni146D ; G 1822\nU 5230 ; WX 628 ; N uni146E ; G 1823\nU 5231 ; WX 628 ; N uni146F ; G 1824\nU 5232 ; WX 628 ; N uni1470 ; G 1825\nU 5233 ; WX 628 ; N uni1471 ; G 1826\nU 5234 ; WX 628 ; N uni1472 ; G 1827\nU 5235 ; WX 628 ; N uni1473 ; G 1828\nU 5236 ; WX 860 ; N uni1474 ; G 1829\nU 5237 ; WX 771 ; N uni1475 ; G 1830\nU 5238 ; WX 815 ; N uni1476 ; G 1831\nU 5239 ; WX 816 ; N uni1477 ; G 1832\nU 5240 ; WX 815 ; N uni1478 ; G 1833\nU 5241 ; WX 816 ; N uni1479 ; G 1834\nU 5242 ; WX 860 ; N uni147A ; G 1835\nU 5243 ; WX 771 ; N uni147B ; G 1836\nU 5244 ; WX 860 ; N uni147C ; G 1837\nU 5245 ; WX 771 ; N uni147D ; G 1838\nU 5246 ; WX 815 ; N uni147E ; G 1839\nU 5247 ; WX 816 ; N uni147F ; G 1840\nU 5248 ; WX 815 ; N uni1480 ; G 1841\nU 5249 ; WX 816 ; N uni1481 ; G 1842\nU 5250 ; WX 815 ; N uni1482 ; G 1843\nU 5251 ; WX 407 ; N uni1483 ; G 1844\nU 5252 ; WX 407 ; N uni1484 ; G 1845\nU 5253 ; WX 750 ; N uni1485 ; G 1846\nU 5254 ; WX 775 ; N uni1486 ; G 1847\nU 5255 ; WX 750 ; N uni1487 ; G 1848\nU 5256 ; WX 775 ; N uni1488 ; G 1849\nU 5257 ; WX 628 ; N uni1489 ; G 1850\nU 5258 ; WX 628 ; N uni148A ; G 1851\nU 5259 ; WX 628 ; N uni148B ; G 1852\nU 5260 ; WX 628 ; N uni148C ; G 1853\nU 5261 ; WX 628 ; N uni148D ; G 1854\nU 5262 ; WX 628 ; N uni148E ; G 1855\nU 5263 ; WX 628 ; N uni148F ; G 1856\nU 5264 ; WX 628 ; N uni1490 ; G 1857\nU 5265 ; WX 628 ; N uni1491 ; G 1858\nU 5266 ; WX 860 ; N uni1492 ; G 1859\nU 5267 ; WX 771 ; N uni1493 ; G 1860\nU 5268 ; WX 815 ; N uni1494 ; G 1861\nU 5269 ; WX 816 ; N uni1495 ; G 1862\nU 5270 ; WX 815 ; N uni1496 ; G 1863\nU 5271 ; WX 816 ; N uni1497 ; G 1864\nU 5272 ; WX 860 ; N uni1498 ; G 1865\nU 5273 ; WX 771 ; N uni1499 ; G 1866\nU 5274 ; WX 860 ; N uni149A ; G 1867\nU 5275 ; WX 771 ; N uni149B ; G 1868\nU 5276 ; WX 815 ; N uni149C ; G 1869\nU 5277 ; WX 816 ; N uni149D ; G 1870\nU 5278 ; WX 815 ; N uni149E ; G 1871\nU 5279 ; WX 816 ; N uni149F ; G 1872\nU 5280 ; WX 815 ; N uni14A0 ; G 1873\nU 5281 ; WX 435 ; N uni14A1 ; G 1874\nU 5282 ; WX 435 ; N uni14A2 ; G 1875\nU 5283 ; WX 610 ; N uni14A3 ; G 1876\nU 5284 ; WX 557 ; N uni14A4 ; G 1877\nU 5285 ; WX 557 ; N uni14A5 ; G 1878\nU 5286 ; WX 557 ; N uni14A6 ; G 1879\nU 5287 ; WX 610 ; N uni14A7 ; G 1880\nU 5288 ; WX 610 ; N uni14A8 ; G 1881\nU 5289 ; WX 610 ; N uni14A9 ; G 1882\nU 5290 ; WX 557 ; N uni14AA ; G 1883\nU 5291 ; WX 557 ; N uni14AB ; G 1884\nU 5292 ; WX 749 ; N uni14AC ; G 1885\nU 5293 ; WX 769 ; N uni14AD ; G 1886\nU 5294 ; WX 746 ; N uni14AE ; G 1887\nU 5295 ; WX 764 ; N uni14AF ; G 1888\nU 5296 ; WX 746 ; N uni14B0 ; G 1889\nU 5297 ; WX 764 ; N uni14B1 ; G 1890\nU 5298 ; WX 749 ; N uni14B2 ; G 1891\nU 5299 ; WX 769 ; N uni14B3 ; G 1892\nU 5300 ; WX 749 ; N uni14B4 ; G 1893\nU 5301 ; WX 769 ; N uni14B5 ; G 1894\nU 5302 ; WX 746 ; N uni14B6 ; G 1895\nU 5303 ; WX 764 ; N uni14B7 ; G 1896\nU 5304 ; WX 746 ; N uni14B8 ; G 1897\nU 5305 ; WX 764 ; N uni14B9 ; G 1898\nU 5306 ; WX 746 ; N uni14BA ; G 1899\nU 5307 ; WX 386 ; N uni14BB ; G 1900\nU 5308 ; WX 508 ; N uni14BC ; G 1901\nU 5309 ; WX 386 ; N uni14BD ; G 1902\nU 5312 ; WX 852 ; N uni14C0 ; G 1903\nU 5313 ; WX 852 ; N uni14C1 ; G 1904\nU 5314 ; WX 852 ; N uni14C2 ; G 1905\nU 5315 ; WX 852 ; N uni14C3 ; G 1906\nU 5316 ; WX 852 ; N uni14C4 ; G 1907\nU 5317 ; WX 852 ; N uni14C5 ; G 1908\nU 5318 ; WX 852 ; N uni14C6 ; G 1909\nU 5319 ; WX 852 ; N uni14C7 ; G 1910\nU 5320 ; WX 852 ; N uni14C8 ; G 1911\nU 5321 ; WX 1069 ; N uni14C9 ; G 1912\nU 5322 ; WX 1035 ; N uni14CA ; G 1913\nU 5323 ; WX 1059 ; N uni14CB ; G 1914\nU 5324 ; WX 852 ; N uni14CC ; G 1915\nU 5325 ; WX 1059 ; N uni14CD ; G 1916\nU 5326 ; WX 852 ; N uni14CE ; G 1917\nU 5327 ; WX 852 ; N uni14CF ; G 1918\nU 5328 ; WX 600 ; N uni14D0 ; G 1919\nU 5329 ; WX 453 ; N uni14D1 ; G 1920\nU 5330 ; WX 600 ; N uni14D2 ; G 1921\nU 5331 ; WX 852 ; N uni14D3 ; G 1922\nU 5332 ; WX 852 ; N uni14D4 ; G 1923\nU 5333 ; WX 852 ; N uni14D5 ; G 1924\nU 5334 ; WX 852 ; N uni14D6 ; G 1925\nU 5335 ; WX 852 ; N uni14D7 ; G 1926\nU 5336 ; WX 852 ; N uni14D8 ; G 1927\nU 5337 ; WX 852 ; N uni14D9 ; G 1928\nU 5338 ; WX 852 ; N uni14DA ; G 1929\nU 5339 ; WX 852 ; N uni14DB ; G 1930\nU 5340 ; WX 1069 ; N uni14DC ; G 1931\nU 5341 ; WX 1035 ; N uni14DD ; G 1932\nU 5342 ; WX 1059 ; N uni14DE ; G 1933\nU 5343 ; WX 1030 ; N uni14DF ; G 1934\nU 5344 ; WX 1059 ; N uni14E0 ; G 1935\nU 5345 ; WX 1030 ; N uni14E1 ; G 1936\nU 5346 ; WX 1069 ; N uni14E2 ; G 1937\nU 5347 ; WX 1035 ; N uni14E3 ; G 1938\nU 5348 ; WX 1069 ; N uni14E4 ; G 1939\nU 5349 ; WX 1035 ; N uni14E5 ; G 1940\nU 5350 ; WX 1083 ; N uni14E6 ; G 1941\nU 5351 ; WX 1030 ; N uni14E7 ; G 1942\nU 5352 ; WX 1083 ; N uni14E8 ; G 1943\nU 5353 ; WX 1030 ; N uni14E9 ; G 1944\nU 5354 ; WX 600 ; N uni14EA ; G 1945\nU 5356 ; WX 729 ; N uni14EC ; G 1946\nU 5357 ; WX 603 ; N uni14ED ; G 1947\nU 5358 ; WX 603 ; N uni14EE ; G 1948\nU 5359 ; WX 603 ; N uni14EF ; G 1949\nU 5360 ; WX 603 ; N uni14F0 ; G 1950\nU 5361 ; WX 603 ; N uni14F1 ; G 1951\nU 5362 ; WX 603 ; N uni14F2 ; G 1952\nU 5363 ; WX 603 ; N uni14F3 ; G 1953\nU 5364 ; WX 603 ; N uni14F4 ; G 1954\nU 5365 ; WX 603 ; N uni14F5 ; G 1955\nU 5366 ; WX 834 ; N uni14F6 ; G 1956\nU 5367 ; WX 754 ; N uni14F7 ; G 1957\nU 5368 ; WX 792 ; N uni14F8 ; G 1958\nU 5369 ; WX 771 ; N uni14F9 ; G 1959\nU 5370 ; WX 792 ; N uni14FA ; G 1960\nU 5371 ; WX 771 ; N uni14FB ; G 1961\nU 5372 ; WX 834 ; N uni14FC ; G 1962\nU 5373 ; WX 754 ; N uni14FD ; G 1963\nU 5374 ; WX 834 ; N uni14FE ; G 1964\nU 5375 ; WX 754 ; N uni14FF ; G 1965\nU 5376 ; WX 792 ; N uni1500 ; G 1966\nU 5377 ; WX 771 ; N uni1501 ; G 1967\nU 5378 ; WX 792 ; N uni1502 ; G 1968\nU 5379 ; WX 771 ; N uni1503 ; G 1969\nU 5380 ; WX 792 ; N uni1504 ; G 1970\nU 5381 ; WX 418 ; N uni1505 ; G 1971\nU 5382 ; WX 420 ; N uni1506 ; G 1972\nU 5383 ; WX 418 ; N uni1507 ; G 1973\nU 5392 ; WX 712 ; N uni1510 ; G 1974\nU 5393 ; WX 712 ; N uni1511 ; G 1975\nU 5394 ; WX 712 ; N uni1512 ; G 1976\nU 5395 ; WX 892 ; N uni1513 ; G 1977\nU 5396 ; WX 892 ; N uni1514 ; G 1978\nU 5397 ; WX 892 ; N uni1515 ; G 1979\nU 5398 ; WX 892 ; N uni1516 ; G 1980\nU 5399 ; WX 910 ; N uni1517 ; G 1981\nU 5400 ; WX 872 ; N uni1518 ; G 1982\nU 5401 ; WX 910 ; N uni1519 ; G 1983\nU 5402 ; WX 872 ; N uni151A ; G 1984\nU 5403 ; WX 910 ; N uni151B ; G 1985\nU 5404 ; WX 872 ; N uni151C ; G 1986\nU 5405 ; WX 1140 ; N uni151D ; G 1987\nU 5406 ; WX 1100 ; N uni151E ; G 1988\nU 5407 ; WX 1140 ; N uni151F ; G 1989\nU 5408 ; WX 1100 ; N uni1520 ; G 1990\nU 5409 ; WX 1140 ; N uni1521 ; G 1991\nU 5410 ; WX 1100 ; N uni1522 ; G 1992\nU 5411 ; WX 1140 ; N uni1523 ; G 1993\nU 5412 ; WX 1100 ; N uni1524 ; G 1994\nU 5413 ; WX 641 ; N uni1525 ; G 1995\nU 5414 ; WX 627 ; N uni1526 ; G 1996\nU 5415 ; WX 627 ; N uni1527 ; G 1997\nU 5416 ; WX 627 ; N uni1528 ; G 1998\nU 5417 ; WX 627 ; N uni1529 ; G 1999\nU 5418 ; WX 627 ; N uni152A ; G 2000\nU 5419 ; WX 627 ; N uni152B ; G 2001\nU 5420 ; WX 627 ; N uni152C ; G 2002\nU 5421 ; WX 627 ; N uni152D ; G 2003\nU 5422 ; WX 627 ; N uni152E ; G 2004\nU 5423 ; WX 844 ; N uni152F ; G 2005\nU 5424 ; WX 781 ; N uni1530 ; G 2006\nU 5425 ; WX 816 ; N uni1531 ; G 2007\nU 5426 ; WX 818 ; N uni1532 ; G 2008\nU 5427 ; WX 816 ; N uni1533 ; G 2009\nU 5428 ; WX 818 ; N uni1534 ; G 2010\nU 5429 ; WX 844 ; N uni1535 ; G 2011\nU 5430 ; WX 781 ; N uni1536 ; G 2012\nU 5431 ; WX 844 ; N uni1537 ; G 2013\nU 5432 ; WX 781 ; N uni1538 ; G 2014\nU 5433 ; WX 816 ; N uni1539 ; G 2015\nU 5434 ; WX 818 ; N uni153A ; G 2016\nU 5435 ; WX 816 ; N uni153B ; G 2017\nU 5436 ; WX 818 ; N uni153C ; G 2018\nU 5437 ; WX 816 ; N uni153D ; G 2019\nU 5438 ; WX 418 ; N uni153E ; G 2020\nU 5440 ; WX 389 ; N uni1540 ; G 2021\nU 5441 ; WX 484 ; N uni1541 ; G 2022\nU 5442 ; WX 916 ; N uni1542 ; G 2023\nU 5443 ; WX 916 ; N uni1543 ; G 2024\nU 5444 ; WX 916 ; N uni1544 ; G 2025\nU 5445 ; WX 916 ; N uni1545 ; G 2026\nU 5446 ; WX 916 ; N uni1546 ; G 2027\nU 5447 ; WX 916 ; N uni1547 ; G 2028\nU 5448 ; WX 603 ; N uni1548 ; G 2029\nU 5449 ; WX 603 ; N uni1549 ; G 2030\nU 5450 ; WX 603 ; N uni154A ; G 2031\nU 5451 ; WX 603 ; N uni154B ; G 2032\nU 5452 ; WX 603 ; N uni154C ; G 2033\nU 5453 ; WX 603 ; N uni154D ; G 2034\nU 5454 ; WX 834 ; N uni154E ; G 2035\nU 5455 ; WX 754 ; N uni154F ; G 2036\nU 5456 ; WX 418 ; N uni1550 ; G 2037\nU 5458 ; WX 729 ; N uni1552 ; G 2038\nU 5459 ; WX 684 ; N uni1553 ; G 2039\nU 5460 ; WX 684 ; N uni1554 ; G 2040\nU 5461 ; WX 684 ; N uni1555 ; G 2041\nU 5462 ; WX 684 ; N uni1556 ; G 2042\nU 5463 ; WX 726 ; N uni1557 ; G 2043\nU 5464 ; WX 726 ; N uni1558 ; G 2044\nU 5465 ; WX 726 ; N uni1559 ; G 2045\nU 5466 ; WX 726 ; N uni155A ; G 2046\nU 5467 ; WX 924 ; N uni155B ; G 2047\nU 5468 ; WX 1007 ; N uni155C ; G 2048\nU 5469 ; WX 508 ; N uni155D ; G 2049\nU 5470 ; WX 732 ; N uni155E ; G 2050\nU 5471 ; WX 732 ; N uni155F ; G 2051\nU 5472 ; WX 732 ; N uni1560 ; G 2052\nU 5473 ; WX 732 ; N uni1561 ; G 2053\nU 5474 ; WX 732 ; N uni1562 ; G 2054\nU 5475 ; WX 732 ; N uni1563 ; G 2055\nU 5476 ; WX 730 ; N uni1564 ; G 2056\nU 5477 ; WX 730 ; N uni1565 ; G 2057\nU 5478 ; WX 730 ; N uni1566 ; G 2058\nU 5479 ; WX 730 ; N uni1567 ; G 2059\nU 5480 ; WX 947 ; N uni1568 ; G 2060\nU 5481 ; WX 900 ; N uni1569 ; G 2061\nU 5482 ; WX 508 ; N uni156A ; G 2062\nU 5492 ; WX 831 ; N uni1574 ; G 2063\nU 5493 ; WX 831 ; N uni1575 ; G 2064\nU 5494 ; WX 831 ; N uni1576 ; G 2065\nU 5495 ; WX 831 ; N uni1577 ; G 2066\nU 5496 ; WX 831 ; N uni1578 ; G 2067\nU 5497 ; WX 831 ; N uni1579 ; G 2068\nU 5498 ; WX 831 ; N uni157A ; G 2069\nU 5499 ; WX 563 ; N uni157B ; G 2070\nU 5500 ; WX 752 ; N uni157C ; G 2071\nU 5501 ; WX 484 ; N uni157D ; G 2072\nU 5502 ; WX 1047 ; N uni157E ; G 2073\nU 5503 ; WX 1047 ; N uni157F ; G 2074\nU 5504 ; WX 1047 ; N uni1580 ; G 2075\nU 5505 ; WX 1047 ; N uni1581 ; G 2076\nU 5506 ; WX 1047 ; N uni1582 ; G 2077\nU 5507 ; WX 1047 ; N uni1583 ; G 2078\nU 5508 ; WX 1047 ; N uni1584 ; G 2079\nU 5509 ; WX 825 ; N uni1585 ; G 2080\nU 5514 ; WX 831 ; N uni158A ; G 2081\nU 5515 ; WX 831 ; N uni158B ; G 2082\nU 5516 ; WX 831 ; N uni158C ; G 2083\nU 5517 ; WX 831 ; N uni158D ; G 2084\nU 5518 ; WX 1259 ; N uni158E ; G 2085\nU 5519 ; WX 1259 ; N uni158F ; G 2086\nU 5520 ; WX 1259 ; N uni1590 ; G 2087\nU 5521 ; WX 1002 ; N uni1591 ; G 2088\nU 5522 ; WX 1002 ; N uni1592 ; G 2089\nU 5523 ; WX 1259 ; N uni1593 ; G 2090\nU 5524 ; WX 1259 ; N uni1594 ; G 2091\nU 5525 ; WX 700 ; N uni1595 ; G 2092\nU 5526 ; WX 1073 ; N uni1596 ; G 2093\nU 5536 ; WX 852 ; N uni15A0 ; G 2094\nU 5537 ; WX 852 ; N uni15A1 ; G 2095\nU 5538 ; WX 852 ; N uni15A2 ; G 2096\nU 5539 ; WX 852 ; N uni15A3 ; G 2097\nU 5540 ; WX 852 ; N uni15A4 ; G 2098\nU 5541 ; WX 852 ; N uni15A5 ; G 2099\nU 5542 ; WX 600 ; N uni15A6 ; G 2100\nU 5543 ; WX 643 ; N uni15A7 ; G 2101\nU 5544 ; WX 643 ; N uni15A8 ; G 2102\nU 5545 ; WX 643 ; N uni15A9 ; G 2103\nU 5546 ; WX 643 ; N uni15AA ; G 2104\nU 5547 ; WX 643 ; N uni15AB ; G 2105\nU 5548 ; WX 643 ; N uni15AC ; G 2106\nU 5549 ; WX 643 ; N uni15AD ; G 2107\nU 5550 ; WX 418 ; N uni15AE ; G 2108\nU 5551 ; WX 628 ; N uni15AF ; G 2109\nU 5598 ; WX 770 ; N uni15DE ; G 2110\nU 5601 ; WX 767 ; N uni15E1 ; G 2111\nU 5702 ; WX 468 ; N uni1646 ; G 2112\nU 5703 ; WX 468 ; N uni1647 ; G 2113\nU 5742 ; WX 444 ; N uni166E ; G 2114\nU 5743 ; WX 1047 ; N uni166F ; G 2115\nU 5744 ; WX 1310 ; N uni1670 ; G 2116\nU 5745 ; WX 1632 ; N uni1671 ; G 2117\nU 5746 ; WX 1632 ; N uni1672 ; G 2118\nU 5747 ; WX 1375 ; N uni1673 ; G 2119\nU 5748 ; WX 1375 ; N uni1674 ; G 2120\nU 5749 ; WX 1632 ; N uni1675 ; G 2121\nU 5750 ; WX 1632 ; N uni1676 ; G 2122\nU 5760 ; WX 477 ; N uni1680 ; G 2123\nU 5761 ; WX 493 ; N uni1681 ; G 2124\nU 5762 ; WX 712 ; N uni1682 ; G 2125\nU 5763 ; WX 931 ; N uni1683 ; G 2126\nU 5764 ; WX 1150 ; N uni1684 ; G 2127\nU 5765 ; WX 1370 ; N uni1685 ; G 2128\nU 5766 ; WX 493 ; N uni1686 ; G 2129\nU 5767 ; WX 712 ; N uni1687 ; G 2130\nU 5768 ; WX 931 ; N uni1688 ; G 2131\nU 5769 ; WX 1150 ; N uni1689 ; G 2132\nU 5770 ; WX 1370 ; N uni168A ; G 2133\nU 5771 ; WX 498 ; N uni168B ; G 2134\nU 5772 ; WX 718 ; N uni168C ; G 2135\nU 5773 ; WX 938 ; N uni168D ; G 2136\nU 5774 ; WX 1159 ; N uni168E ; G 2137\nU 5775 ; WX 1379 ; N uni168F ; G 2138\nU 5776 ; WX 493 ; N uni1690 ; G 2139\nU 5777 ; WX 712 ; N uni1691 ; G 2140\nU 5778 ; WX 930 ; N uni1692 ; G 2141\nU 5779 ; WX 1149 ; N uni1693 ; G 2142\nU 5780 ; WX 1370 ; N uni1694 ; G 2143\nU 5781 ; WX 498 ; N uni1695 ; G 2144\nU 5782 ; WX 752 ; N uni1696 ; G 2145\nU 5783 ; WX 789 ; N uni1697 ; G 2146\nU 5784 ; WX 1205 ; N uni1698 ; G 2147\nU 5785 ; WX 1150 ; N uni1699 ; G 2148\nU 5786 ; WX 683 ; N uni169A ; G 2149\nU 5787 ; WX 507 ; N uni169B ; G 2150\nU 5788 ; WX 507 ; N uni169C ; G 2151\nU 7424 ; WX 592 ; N uni1D00 ; G 2152\nU 7425 ; WX 717 ; N uni1D01 ; G 2153\nU 7426 ; WX 982 ; N uni1D02 ; G 2154\nU 7427 ; WX 586 ; N uni1D03 ; G 2155\nU 7428 ; WX 550 ; N uni1D04 ; G 2156\nU 7429 ; WX 605 ; N uni1D05 ; G 2157\nU 7430 ; WX 605 ; N uni1D06 ; G 2158\nU 7431 ; WX 491 ; N uni1D07 ; G 2159\nU 7432 ; WX 541 ; N uni1D08 ; G 2160\nU 7433 ; WX 278 ; N uni1D09 ; G 2161\nU 7434 ; WX 395 ; N uni1D0A ; G 2162\nU 7435 ; WX 579 ; N uni1D0B ; G 2163\nU 7436 ; WX 583 ; N uni1D0C ; G 2164\nU 7437 ; WX 754 ; N uni1D0D ; G 2165\nU 7438 ; WX 650 ; N uni1D0E ; G 2166\nU 7439 ; WX 612 ; N uni1D0F ; G 2167\nU 7440 ; WX 550 ; N uni1D10 ; G 2168\nU 7441 ; WX 684 ; N uni1D11 ; G 2169\nU 7442 ; WX 684 ; N uni1D12 ; G 2170\nU 7443 ; WX 684 ; N uni1D13 ; G 2171\nU 7444 ; WX 1023 ; N uni1D14 ; G 2172\nU 7446 ; WX 612 ; N uni1D16 ; G 2173\nU 7447 ; WX 612 ; N uni1D17 ; G 2174\nU 7448 ; WX 524 ; N uni1D18 ; G 2175\nU 7449 ; WX 602 ; N uni1D19 ; G 2176\nU 7450 ; WX 602 ; N uni1D1A ; G 2177\nU 7451 ; WX 583 ; N uni1D1B ; G 2178\nU 7452 ; WX 574 ; N uni1D1C ; G 2179\nU 7453 ; WX 737 ; N uni1D1D ; G 2180\nU 7454 ; WX 948 ; N uni1D1E ; G 2181\nU 7455 ; WX 638 ; N uni1D1F ; G 2182\nU 7456 ; WX 592 ; N uni1D20 ; G 2183\nU 7457 ; WX 818 ; N uni1D21 ; G 2184\nU 7458 ; WX 525 ; N uni1D22 ; G 2185\nU 7459 ; WX 526 ; N uni1D23 ; G 2186\nU 7462 ; WX 583 ; N uni1D26 ; G 2187\nU 7463 ; WX 592 ; N uni1D27 ; G 2188\nU 7464 ; WX 564 ; N uni1D28 ; G 2189\nU 7465 ; WX 524 ; N uni1D29 ; G 2190\nU 7466 ; WX 590 ; N uni1D2A ; G 2191\nU 7467 ; WX 639 ; N uni1D2B ; G 2192\nU 7468 ; WX 431 ; N uni1D2C ; G 2193\nU 7469 ; WX 613 ; N uni1D2D ; G 2194\nU 7470 ; WX 432 ; N uni1D2E ; G 2195\nU 7472 ; WX 485 ; N uni1D30 ; G 2196\nU 7473 ; WX 398 ; N uni1D31 ; G 2197\nU 7474 ; WX 398 ; N uni1D32 ; G 2198\nU 7475 ; WX 488 ; N uni1D33 ; G 2199\nU 7476 ; WX 474 ; N uni1D34 ; G 2200\nU 7477 ; WX 186 ; N uni1D35 ; G 2201\nU 7478 ; WX 186 ; N uni1D36 ; G 2202\nU 7479 ; WX 413 ; N uni1D37 ; G 2203\nU 7480 ; WX 351 ; N uni1D38 ; G 2204\nU 7481 ; WX 543 ; N uni1D39 ; G 2205\nU 7482 ; WX 471 ; N uni1D3A ; G 2206\nU 7483 ; WX 471 ; N uni1D3B ; G 2207\nU 7484 ; WX 496 ; N uni1D3C ; G 2208\nU 7485 ; WX 439 ; N uni1D3D ; G 2209\nU 7486 ; WX 380 ; N uni1D3E ; G 2210\nU 7487 ; WX 438 ; N uni1D3F ; G 2211\nU 7488 ; WX 385 ; N uni1D40 ; G 2212\nU 7489 ; WX 461 ; N uni1D41 ; G 2213\nU 7490 ; WX 623 ; N uni1D42 ; G 2214\nU 7491 ; WX 392 ; N uni1D43 ; G 2215\nU 7492 ; WX 392 ; N uni1D44 ; G 2216\nU 7493 ; WX 405 ; N uni1D45 ; G 2217\nU 7494 ; WX 648 ; N uni1D46 ; G 2218\nU 7495 ; WX 428 ; N uni1D47 ; G 2219\nU 7496 ; WX 405 ; N uni1D48 ; G 2220\nU 7497 ; WX 417 ; N uni1D49 ; G 2221\nU 7498 ; WX 417 ; N uni1D4A ; G 2222\nU 7499 ; WX 360 ; N uni1D4B ; G 2223\nU 7500 ; WX 359 ; N uni1D4C ; G 2224\nU 7501 ; WX 405 ; N uni1D4D ; G 2225\nU 7502 ; WX 179 ; N uni1D4E ; G 2226\nU 7503 ; WX 426 ; N uni1D4F ; G 2227\nU 7504 ; WX 623 ; N uni1D50 ; G 2228\nU 7505 ; WX 409 ; N uni1D51 ; G 2229\nU 7506 ; WX 414 ; N uni1D52 ; G 2230\nU 7507 ; WX 370 ; N uni1D53 ; G 2231\nU 7508 ; WX 414 ; N uni1D54 ; G 2232\nU 7509 ; WX 414 ; N uni1D55 ; G 2233\nU 7510 ; WX 428 ; N uni1D56 ; G 2234\nU 7511 ; WX 295 ; N uni1D57 ; G 2235\nU 7512 ; WX 405 ; N uni1D58 ; G 2236\nU 7513 ; WX 470 ; N uni1D59 ; G 2237\nU 7514 ; WX 623 ; N uni1D5A ; G 2238\nU 7515 ; WX 417 ; N uni1D5B ; G 2239\nU 7517 ; WX 402 ; N uni1D5D ; G 2240\nU 7518 ; WX 373 ; N uni1D5E ; G 2241\nU 7519 ; WX 385 ; N uni1D5F ; G 2242\nU 7520 ; WX 416 ; N uni1D60 ; G 2243\nU 7521 ; WX 364 ; N uni1D61 ; G 2244\nU 7522 ; WX 179 ; N uni1D62 ; G 2245\nU 7523 ; WX 259 ; N uni1D63 ; G 2246\nU 7524 ; WX 405 ; N uni1D64 ; G 2247\nU 7525 ; WX 417 ; N uni1D65 ; G 2248\nU 7526 ; WX 402 ; N uni1D66 ; G 2249\nU 7527 ; WX 373 ; N uni1D67 ; G 2250\nU 7528 ; WX 412 ; N uni1D68 ; G 2251\nU 7529 ; WX 416 ; N uni1D69 ; G 2252\nU 7530 ; WX 364 ; N uni1D6A ; G 2253\nU 7543 ; WX 635 ; N uni1D77 ; G 2254\nU 7544 ; WX 474 ; N uni1D78 ; G 2255\nU 7547 ; WX 372 ; N uni1D7B ; G 2256\nU 7549 ; WX 667 ; N uni1D7D ; G 2257\nU 7557 ; WX 278 ; N uni1D85 ; G 2258\nU 7579 ; WX 405 ; N uni1D9B ; G 2259\nU 7580 ; WX 370 ; N uni1D9C ; G 2260\nU 7581 ; WX 370 ; N uni1D9D ; G 2261\nU 7582 ; WX 414 ; N uni1D9E ; G 2262\nU 7583 ; WX 360 ; N uni1D9F ; G 2263\nU 7584 ; WX 296 ; N uni1DA0 ; G 2264\nU 7585 ; WX 233 ; N uni1DA1 ; G 2265\nU 7586 ; WX 405 ; N uni1DA2 ; G 2266\nU 7587 ; WX 405 ; N uni1DA3 ; G 2267\nU 7588 ; WX 261 ; N uni1DA4 ; G 2268\nU 7589 ; WX 250 ; N uni1DA5 ; G 2269\nU 7590 ; WX 261 ; N uni1DA6 ; G 2270\nU 7591 ; WX 261 ; N uni1DA7 ; G 2271\nU 7592 ; WX 234 ; N uni1DA8 ; G 2272\nU 7593 ; WX 250 ; N uni1DA9 ; G 2273\nU 7594 ; WX 235 ; N uni1DAA ; G 2274\nU 7595 ; WX 376 ; N uni1DAB ; G 2275\nU 7596 ; WX 623 ; N uni1DAC ; G 2276\nU 7597 ; WX 623 ; N uni1DAD ; G 2277\nU 7598 ; WX 411 ; N uni1DAE ; G 2278\nU 7599 ; WX 479 ; N uni1DAF ; G 2279\nU 7600 ; WX 409 ; N uni1DB0 ; G 2280\nU 7601 ; WX 414 ; N uni1DB1 ; G 2281\nU 7602 ; WX 414 ; N uni1DB2 ; G 2282\nU 7603 ; WX 360 ; N uni1DB3 ; G 2283\nU 7604 ; WX 287 ; N uni1DB4 ; G 2284\nU 7605 ; WX 295 ; N uni1DB5 ; G 2285\nU 7606 ; WX 508 ; N uni1DB6 ; G 2286\nU 7607 ; WX 418 ; N uni1DB7 ; G 2287\nU 7608 ; WX 361 ; N uni1DB8 ; G 2288\nU 7609 ; WX 406 ; N uni1DB9 ; G 2289\nU 7610 ; WX 417 ; N uni1DBA ; G 2290\nU 7611 ; WX 366 ; N uni1DBB ; G 2291\nU 7612 ; WX 437 ; N uni1DBC ; G 2292\nU 7613 ; WX 366 ; N uni1DBD ; G 2293\nU 7614 ; WX 392 ; N uni1DBE ; G 2294\nU 7615 ; WX 414 ; N uni1DBF ; G 2295\nU 7620 ; WX 0 ; N uni1DC4 ; G 2296\nU 7621 ; WX 0 ; N uni1DC5 ; G 2297\nU 7622 ; WX 0 ; N uni1DC6 ; G 2298\nU 7623 ; WX 0 ; N uni1DC7 ; G 2299\nU 7624 ; WX 0 ; N uni1DC8 ; G 2300\nU 7625 ; WX 0 ; N uni1DC9 ; G 2301\nU 7680 ; WX 684 ; N uni1E00 ; G 2302\nU 7681 ; WX 613 ; N uni1E01 ; G 2303\nU 7682 ; WX 686 ; N uni1E02 ; G 2304\nU 7683 ; WX 635 ; N uni1E03 ; G 2305\nU 7684 ; WX 686 ; N uni1E04 ; G 2306\nU 7685 ; WX 635 ; N uni1E05 ; G 2307\nU 7686 ; WX 686 ; N uni1E06 ; G 2308\nU 7687 ; WX 635 ; N uni1E07 ; G 2309\nU 7688 ; WX 698 ; N uni1E08 ; G 2310\nU 7689 ; WX 550 ; N uni1E09 ; G 2311\nU 7690 ; WX 770 ; N uni1E0A ; G 2312\nU 7691 ; WX 635 ; N uni1E0B ; G 2313\nU 7692 ; WX 770 ; N uni1E0C ; G 2314\nU 7693 ; WX 635 ; N uni1E0D ; G 2315\nU 7694 ; WX 770 ; N uni1E0E ; G 2316\nU 7695 ; WX 635 ; N uni1E0F ; G 2317\nU 7696 ; WX 770 ; N uni1E10 ; G 2318\nU 7697 ; WX 635 ; N uni1E11 ; G 2319\nU 7698 ; WX 770 ; N uni1E12 ; G 2320\nU 7699 ; WX 635 ; N uni1E13 ; G 2321\nU 7700 ; WX 632 ; N uni1E14 ; G 2322\nU 7701 ; WX 615 ; N uni1E15 ; G 2323\nU 7702 ; WX 632 ; N uni1E16 ; G 2324\nU 7703 ; WX 615 ; N uni1E17 ; G 2325\nU 7704 ; WX 632 ; N uni1E18 ; G 2326\nU 7705 ; WX 615 ; N uni1E19 ; G 2327\nU 7706 ; WX 632 ; N uni1E1A ; G 2328\nU 7707 ; WX 615 ; N uni1E1B ; G 2329\nU 7708 ; WX 632 ; N uni1E1C ; G 2330\nU 7709 ; WX 615 ; N uni1E1D ; G 2331\nU 7710 ; WX 575 ; N uni1E1E ; G 2332\nU 7711 ; WX 352 ; N uni1E1F ; G 2333\nU 7712 ; WX 775 ; N uni1E20 ; G 2334\nU 7713 ; WX 635 ; N uni1E21 ; G 2335\nU 7714 ; WX 752 ; N uni1E22 ; G 2336\nU 7715 ; WX 634 ; N uni1E23 ; G 2337\nU 7716 ; WX 752 ; N uni1E24 ; G 2338\nU 7717 ; WX 634 ; N uni1E25 ; G 2339\nU 7718 ; WX 752 ; N uni1E26 ; G 2340\nU 7719 ; WX 634 ; N uni1E27 ; G 2341\nU 7720 ; WX 752 ; N uni1E28 ; G 2342\nU 7721 ; WX 634 ; N uni1E29 ; G 2343\nU 7722 ; WX 752 ; N uni1E2A ; G 2344\nU 7723 ; WX 634 ; N uni1E2B ; G 2345\nU 7724 ; WX 295 ; N uni1E2C ; G 2346\nU 7725 ; WX 278 ; N uni1E2D ; G 2347\nU 7726 ; WX 295 ; N uni1E2E ; G 2348\nU 7727 ; WX 278 ; N uni1E2F ; G 2349\nU 7728 ; WX 656 ; N uni1E30 ; G 2350\nU 7729 ; WX 579 ; N uni1E31 ; G 2351\nU 7730 ; WX 656 ; N uni1E32 ; G 2352\nU 7731 ; WX 579 ; N uni1E33 ; G 2353\nU 7732 ; WX 656 ; N uni1E34 ; G 2354\nU 7733 ; WX 579 ; N uni1E35 ; G 2355\nU 7734 ; WX 557 ; N uni1E36 ; G 2356\nU 7735 ; WX 288 ; N uni1E37 ; G 2357\nU 7736 ; WX 557 ; N uni1E38 ; G 2358\nU 7737 ; WX 288 ; N uni1E39 ; G 2359\nU 7738 ; WX 557 ; N uni1E3A ; G 2360\nU 7739 ; WX 278 ; N uni1E3B ; G 2361\nU 7740 ; WX 557 ; N uni1E3C ; G 2362\nU 7741 ; WX 278 ; N uni1E3D ; G 2363\nU 7742 ; WX 863 ; N uni1E3E ; G 2364\nU 7743 ; WX 974 ; N uni1E3F ; G 2365\nU 7744 ; WX 863 ; N uni1E40 ; G 2366\nU 7745 ; WX 974 ; N uni1E41 ; G 2367\nU 7746 ; WX 863 ; N uni1E42 ; G 2368\nU 7747 ; WX 974 ; N uni1E43 ; G 2369\nU 7748 ; WX 748 ; N uni1E44 ; G 2370\nU 7749 ; WX 634 ; N uni1E45 ; G 2371\nU 7750 ; WX 748 ; N uni1E46 ; G 2372\nU 7751 ; WX 634 ; N uni1E47 ; G 2373\nU 7752 ; WX 748 ; N uni1E48 ; G 2374\nU 7753 ; WX 634 ; N uni1E49 ; G 2375\nU 7754 ; WX 748 ; N uni1E4A ; G 2376\nU 7755 ; WX 634 ; N uni1E4B ; G 2377\nU 7756 ; WX 787 ; N uni1E4C ; G 2378\nU 7757 ; WX 612 ; N uni1E4D ; G 2379\nU 7758 ; WX 787 ; N uni1E4E ; G 2380\nU 7759 ; WX 612 ; N uni1E4F ; G 2381\nU 7760 ; WX 787 ; N uni1E50 ; G 2382\nU 7761 ; WX 612 ; N uni1E51 ; G 2383\nU 7762 ; WX 787 ; N uni1E52 ; G 2384\nU 7763 ; WX 612 ; N uni1E53 ; G 2385\nU 7764 ; WX 603 ; N uni1E54 ; G 2386\nU 7765 ; WX 635 ; N uni1E55 ; G 2387\nU 7766 ; WX 603 ; N uni1E56 ; G 2388\nU 7767 ; WX 635 ; N uni1E57 ; G 2389\nU 7768 ; WX 695 ; N uni1E58 ; G 2390\nU 7769 ; WX 411 ; N uni1E59 ; G 2391\nU 7770 ; WX 695 ; N uni1E5A ; G 2392\nU 7771 ; WX 411 ; N uni1E5B ; G 2393\nU 7772 ; WX 695 ; N uni1E5C ; G 2394\nU 7773 ; WX 411 ; N uni1E5D ; G 2395\nU 7774 ; WX 695 ; N uni1E5E ; G 2396\nU 7775 ; WX 411 ; N uni1E5F ; G 2397\nU 7776 ; WX 635 ; N uni1E60 ; G 2398\nU 7777 ; WX 521 ; N uni1E61 ; G 2399\nU 7778 ; WX 635 ; N uni1E62 ; G 2400\nU 7779 ; WX 521 ; N uni1E63 ; G 2401\nU 7780 ; WX 635 ; N uni1E64 ; G 2402\nU 7781 ; WX 521 ; N uni1E65 ; G 2403\nU 7782 ; WX 635 ; N uni1E66 ; G 2404\nU 7783 ; WX 521 ; N uni1E67 ; G 2405\nU 7784 ; WX 635 ; N uni1E68 ; G 2406\nU 7785 ; WX 521 ; N uni1E69 ; G 2407\nU 7786 ; WX 611 ; N uni1E6A ; G 2408\nU 7787 ; WX 392 ; N uni1E6B ; G 2409\nU 7788 ; WX 611 ; N uni1E6C ; G 2410\nU 7789 ; WX 392 ; N uni1E6D ; G 2411\nU 7790 ; WX 611 ; N uni1E6E ; G 2412\nU 7791 ; WX 392 ; N uni1E6F ; G 2413\nU 7792 ; WX 611 ; N uni1E70 ; G 2414\nU 7793 ; WX 392 ; N uni1E71 ; G 2415\nU 7794 ; WX 732 ; N uni1E72 ; G 2416\nU 7795 ; WX 634 ; N uni1E73 ; G 2417\nU 7796 ; WX 732 ; N uni1E74 ; G 2418\nU 7797 ; WX 634 ; N uni1E75 ; G 2419\nU 7798 ; WX 732 ; N uni1E76 ; G 2420\nU 7799 ; WX 634 ; N uni1E77 ; G 2421\nU 7800 ; WX 732 ; N uni1E78 ; G 2422\nU 7801 ; WX 634 ; N uni1E79 ; G 2423\nU 7802 ; WX 732 ; N uni1E7A ; G 2424\nU 7803 ; WX 634 ; N uni1E7B ; G 2425\nU 7804 ; WX 684 ; N uni1E7C ; G 2426\nU 7805 ; WX 592 ; N uni1E7D ; G 2427\nU 7806 ; WX 684 ; N uni1E7E ; G 2428\nU 7807 ; WX 592 ; N uni1E7F ; G 2429\nU 7808 ; WX 989 ; N Wgrave ; G 2430\nU 7809 ; WX 818 ; N wgrave ; G 2431\nU 7810 ; WX 989 ; N Wacute ; G 2432\nU 7811 ; WX 818 ; N wacute ; G 2433\nU 7812 ; WX 989 ; N Wdieresis ; G 2434\nU 7813 ; WX 818 ; N wdieresis ; G 2435\nU 7814 ; WX 989 ; N uni1E86 ; G 2436\nU 7815 ; WX 818 ; N uni1E87 ; G 2437\nU 7816 ; WX 989 ; N uni1E88 ; G 2438\nU 7817 ; WX 818 ; N uni1E89 ; G 2439\nU 7818 ; WX 685 ; N uni1E8A ; G 2440\nU 7819 ; WX 592 ; N uni1E8B ; G 2441\nU 7820 ; WX 685 ; N uni1E8C ; G 2442\nU 7821 ; WX 592 ; N uni1E8D ; G 2443\nU 7822 ; WX 611 ; N uni1E8E ; G 2444\nU 7823 ; WX 592 ; N uni1E8F ; G 2445\nU 7824 ; WX 685 ; N uni1E90 ; G 2446\nU 7825 ; WX 525 ; N uni1E91 ; G 2447\nU 7826 ; WX 685 ; N uni1E92 ; G 2448\nU 7827 ; WX 525 ; N uni1E93 ; G 2449\nU 7828 ; WX 685 ; N uni1E94 ; G 2450\nU 7829 ; WX 525 ; N uni1E95 ; G 2451\nU 7830 ; WX 634 ; N uni1E96 ; G 2452\nU 7831 ; WX 392 ; N uni1E97 ; G 2453\nU 7832 ; WX 818 ; N uni1E98 ; G 2454\nU 7833 ; WX 592 ; N uni1E99 ; G 2455\nU 7834 ; WX 613 ; N uni1E9A ; G 2456\nU 7835 ; WX 352 ; N uni1E9B ; G 2457\nU 7836 ; WX 352 ; N uni1E9C ; G 2458\nU 7837 ; WX 352 ; N uni1E9D ; G 2459\nU 7838 ; WX 769 ; N uni1E9E ; G 2460\nU 7839 ; WX 612 ; N uni1E9F ; G 2461\nU 7840 ; WX 684 ; N uni1EA0 ; G 2462\nU 7841 ; WX 613 ; N uni1EA1 ; G 2463\nU 7842 ; WX 684 ; N uni1EA2 ; G 2464\nU 7843 ; WX 613 ; N uni1EA3 ; G 2465\nU 7844 ; WX 684 ; N uni1EA4 ; G 2466\nU 7845 ; WX 613 ; N uni1EA5 ; G 2467\nU 7846 ; WX 684 ; N uni1EA6 ; G 2468\nU 7847 ; WX 613 ; N uni1EA7 ; G 2469\nU 7848 ; WX 684 ; N uni1EA8 ; G 2470\nU 7849 ; WX 613 ; N uni1EA9 ; G 2471\nU 7850 ; WX 684 ; N uni1EAA ; G 2472\nU 7851 ; WX 613 ; N uni1EAB ; G 2473\nU 7852 ; WX 684 ; N uni1EAC ; G 2474\nU 7853 ; WX 613 ; N uni1EAD ; G 2475\nU 7854 ; WX 684 ; N uni1EAE ; G 2476\nU 7855 ; WX 613 ; N uni1EAF ; G 2477\nU 7856 ; WX 684 ; N uni1EB0 ; G 2478\nU 7857 ; WX 613 ; N uni1EB1 ; G 2479\nU 7858 ; WX 684 ; N uni1EB2 ; G 2480\nU 7859 ; WX 613 ; N uni1EB3 ; G 2481\nU 7860 ; WX 684 ; N uni1EB4 ; G 2482\nU 7861 ; WX 613 ; N uni1EB5 ; G 2483\nU 7862 ; WX 684 ; N uni1EB6 ; G 2484\nU 7863 ; WX 613 ; N uni1EB7 ; G 2485\nU 7864 ; WX 632 ; N uni1EB8 ; G 2486\nU 7865 ; WX 615 ; N uni1EB9 ; G 2487\nU 7866 ; WX 632 ; N uni1EBA ; G 2488\nU 7867 ; WX 615 ; N uni1EBB ; G 2489\nU 7868 ; WX 632 ; N uni1EBC ; G 2490\nU 7869 ; WX 615 ; N uni1EBD ; G 2491\nU 7870 ; WX 632 ; N uni1EBE ; G 2492\nU 7871 ; WX 615 ; N uni1EBF ; G 2493\nU 7872 ; WX 632 ; N uni1EC0 ; G 2494\nU 7873 ; WX 615 ; N uni1EC1 ; G 2495\nU 7874 ; WX 632 ; N uni1EC2 ; G 2496\nU 7875 ; WX 615 ; N uni1EC3 ; G 2497\nU 7876 ; WX 632 ; N uni1EC4 ; G 2498\nU 7877 ; WX 615 ; N uni1EC5 ; G 2499\nU 7878 ; WX 632 ; N uni1EC6 ; G 2500\nU 7879 ; WX 615 ; N uni1EC7 ; G 2501\nU 7880 ; WX 295 ; N uni1EC8 ; G 2502\nU 7881 ; WX 278 ; N uni1EC9 ; G 2503\nU 7882 ; WX 295 ; N uni1ECA ; G 2504\nU 7883 ; WX 278 ; N uni1ECB ; G 2505\nU 7884 ; WX 787 ; N uni1ECC ; G 2506\nU 7885 ; WX 612 ; N uni1ECD ; G 2507\nU 7886 ; WX 787 ; N uni1ECE ; G 2508\nU 7887 ; WX 612 ; N uni1ECF ; G 2509\nU 7888 ; WX 787 ; N uni1ED0 ; G 2510\nU 7889 ; WX 612 ; N uni1ED1 ; G 2511\nU 7890 ; WX 787 ; N uni1ED2 ; G 2512\nU 7891 ; WX 612 ; N uni1ED3 ; G 2513\nU 7892 ; WX 787 ; N uni1ED4 ; G 2514\nU 7893 ; WX 612 ; N uni1ED5 ; G 2515\nU 7894 ; WX 787 ; N uni1ED6 ; G 2516\nU 7895 ; WX 612 ; N uni1ED7 ; G 2517\nU 7896 ; WX 787 ; N uni1ED8 ; G 2518\nU 7897 ; WX 612 ; N uni1ED9 ; G 2519\nU 7898 ; WX 913 ; N uni1EDA ; G 2520\nU 7899 ; WX 612 ; N uni1EDB ; G 2521\nU 7900 ; WX 913 ; N uni1EDC ; G 2522\nU 7901 ; WX 612 ; N uni1EDD ; G 2523\nU 7902 ; WX 913 ; N uni1EDE ; G 2524\nU 7903 ; WX 612 ; N uni1EDF ; G 2525\nU 7904 ; WX 913 ; N uni1EE0 ; G 2526\nU 7905 ; WX 612 ; N uni1EE1 ; G 2527\nU 7906 ; WX 913 ; N uni1EE2 ; G 2528\nU 7907 ; WX 612 ; N uni1EE3 ; G 2529\nU 7908 ; WX 732 ; N uni1EE4 ; G 2530\nU 7909 ; WX 634 ; N uni1EE5 ; G 2531\nU 7910 ; WX 732 ; N uni1EE6 ; G 2532\nU 7911 ; WX 634 ; N uni1EE7 ; G 2533\nU 7912 ; WX 858 ; N uni1EE8 ; G 2534\nU 7913 ; WX 634 ; N uni1EE9 ; G 2535\nU 7914 ; WX 858 ; N uni1EEA ; G 2536\nU 7915 ; WX 634 ; N uni1EEB ; G 2537\nU 7916 ; WX 858 ; N uni1EEC ; G 2538\nU 7917 ; WX 634 ; N uni1EED ; G 2539\nU 7918 ; WX 858 ; N uni1EEE ; G 2540\nU 7919 ; WX 634 ; N uni1EEF ; G 2541\nU 7920 ; WX 858 ; N uni1EF0 ; G 2542\nU 7921 ; WX 634 ; N uni1EF1 ; G 2543\nU 7922 ; WX 611 ; N Ygrave ; G 2544\nU 7923 ; WX 592 ; N ygrave ; G 2545\nU 7924 ; WX 611 ; N uni1EF4 ; G 2546\nU 7925 ; WX 592 ; N uni1EF5 ; G 2547\nU 7926 ; WX 611 ; N uni1EF6 ; G 2548\nU 7927 ; WX 592 ; N uni1EF7 ; G 2549\nU 7928 ; WX 611 ; N uni1EF8 ; G 2550\nU 7929 ; WX 592 ; N uni1EF9 ; G 2551\nU 7930 ; WX 769 ; N uni1EFA ; G 2552\nU 7931 ; WX 477 ; N uni1EFB ; G 2553\nU 7936 ; WX 659 ; N uni1F00 ; G 2554\nU 7937 ; WX 659 ; N uni1F01 ; G 2555\nU 7938 ; WX 659 ; N uni1F02 ; G 2556\nU 7939 ; WX 659 ; N uni1F03 ; G 2557\nU 7940 ; WX 659 ; N uni1F04 ; G 2558\nU 7941 ; WX 659 ; N uni1F05 ; G 2559\nU 7942 ; WX 659 ; N uni1F06 ; G 2560\nU 7943 ; WX 659 ; N uni1F07 ; G 2561\nU 7944 ; WX 684 ; N uni1F08 ; G 2562\nU 7945 ; WX 684 ; N uni1F09 ; G 2563\nU 7946 ; WX 877 ; N uni1F0A ; G 2564\nU 7947 ; WX 877 ; N uni1F0B ; G 2565\nU 7948 ; WX 769 ; N uni1F0C ; G 2566\nU 7949 ; WX 801 ; N uni1F0D ; G 2567\nU 7950 ; WX 708 ; N uni1F0E ; G 2568\nU 7951 ; WX 743 ; N uni1F0F ; G 2569\nU 7952 ; WX 541 ; N uni1F10 ; G 2570\nU 7953 ; WX 541 ; N uni1F11 ; G 2571\nU 7954 ; WX 541 ; N uni1F12 ; G 2572\nU 7955 ; WX 541 ; N uni1F13 ; G 2573\nU 7956 ; WX 541 ; N uni1F14 ; G 2574\nU 7957 ; WX 541 ; N uni1F15 ; G 2575\nU 7960 ; WX 711 ; N uni1F18 ; G 2576\nU 7961 ; WX 711 ; N uni1F19 ; G 2577\nU 7962 ; WX 966 ; N uni1F1A ; G 2578\nU 7963 ; WX 975 ; N uni1F1B ; G 2579\nU 7964 ; WX 898 ; N uni1F1C ; G 2580\nU 7965 ; WX 928 ; N uni1F1D ; G 2581\nU 7968 ; WX 634 ; N uni1F20 ; G 2582\nU 7969 ; WX 634 ; N uni1F21 ; G 2583\nU 7970 ; WX 634 ; N uni1F22 ; G 2584\nU 7971 ; WX 634 ; N uni1F23 ; G 2585\nU 7972 ; WX 634 ; N uni1F24 ; G 2586\nU 7973 ; WX 634 ; N uni1F25 ; G 2587\nU 7974 ; WX 634 ; N uni1F26 ; G 2588\nU 7975 ; WX 634 ; N uni1F27 ; G 2589\nU 7976 ; WX 837 ; N uni1F28 ; G 2590\nU 7977 ; WX 835 ; N uni1F29 ; G 2591\nU 7978 ; WX 1086 ; N uni1F2A ; G 2592\nU 7979 ; WX 1089 ; N uni1F2B ; G 2593\nU 7980 ; WX 1027 ; N uni1F2C ; G 2594\nU 7981 ; WX 1051 ; N uni1F2D ; G 2595\nU 7982 ; WX 934 ; N uni1F2E ; G 2596\nU 7983 ; WX 947 ; N uni1F2F ; G 2597\nU 7984 ; WX 338 ; N uni1F30 ; G 2598\nU 7985 ; WX 338 ; N uni1F31 ; G 2599\nU 7986 ; WX 338 ; N uni1F32 ; G 2600\nU 7987 ; WX 338 ; N uni1F33 ; G 2601\nU 7988 ; WX 338 ; N uni1F34 ; G 2602\nU 7989 ; WX 338 ; N uni1F35 ; G 2603\nU 7990 ; WX 338 ; N uni1F36 ; G 2604\nU 7991 ; WX 338 ; N uni1F37 ; G 2605\nU 7992 ; WX 380 ; N uni1F38 ; G 2606\nU 7993 ; WX 374 ; N uni1F39 ; G 2607\nU 7994 ; WX 635 ; N uni1F3A ; G 2608\nU 7995 ; WX 635 ; N uni1F3B ; G 2609\nU 7996 ; WX 570 ; N uni1F3C ; G 2610\nU 7997 ; WX 600 ; N uni1F3D ; G 2611\nU 7998 ; WX 489 ; N uni1F3E ; G 2612\nU 7999 ; WX 493 ; N uni1F3F ; G 2613\nU 8000 ; WX 612 ; N uni1F40 ; G 2614\nU 8001 ; WX 612 ; N uni1F41 ; G 2615\nU 8002 ; WX 612 ; N uni1F42 ; G 2616\nU 8003 ; WX 612 ; N uni1F43 ; G 2617\nU 8004 ; WX 612 ; N uni1F44 ; G 2618\nU 8005 ; WX 612 ; N uni1F45 ; G 2619\nU 8008 ; WX 804 ; N uni1F48 ; G 2620\nU 8009 ; WX 848 ; N uni1F49 ; G 2621\nU 8010 ; WX 1095 ; N uni1F4A ; G 2622\nU 8011 ; WX 1100 ; N uni1F4B ; G 2623\nU 8012 ; WX 938 ; N uni1F4C ; G 2624\nU 8013 ; WX 970 ; N uni1F4D ; G 2625\nU 8016 ; WX 579 ; N uni1F50 ; G 2626\nU 8017 ; WX 579 ; N uni1F51 ; G 2627\nU 8018 ; WX 579 ; N uni1F52 ; G 2628\nU 8019 ; WX 579 ; N uni1F53 ; G 2629\nU 8020 ; WX 579 ; N uni1F54 ; G 2630\nU 8021 ; WX 579 ; N uni1F55 ; G 2631\nU 8022 ; WX 579 ; N uni1F56 ; G 2632\nU 8023 ; WX 579 ; N uni1F57 ; G 2633\nU 8025 ; WX 784 ; N uni1F59 ; G 2634\nU 8027 ; WX 998 ; N uni1F5B ; G 2635\nU 8029 ; WX 1012 ; N uni1F5D ; G 2636\nU 8031 ; WX 897 ; N uni1F5F ; G 2637\nU 8032 ; WX 837 ; N uni1F60 ; G 2638\nU 8033 ; WX 837 ; N uni1F61 ; G 2639\nU 8034 ; WX 837 ; N uni1F62 ; G 2640\nU 8035 ; WX 837 ; N uni1F63 ; G 2641\nU 8036 ; WX 837 ; N uni1F64 ; G 2642\nU 8037 ; WX 837 ; N uni1F65 ; G 2643\nU 8038 ; WX 837 ; N uni1F66 ; G 2644\nU 8039 ; WX 837 ; N uni1F67 ; G 2645\nU 8040 ; WX 802 ; N uni1F68 ; G 2646\nU 8041 ; WX 843 ; N uni1F69 ; G 2647\nU 8042 ; WX 1089 ; N uni1F6A ; G 2648\nU 8043 ; WX 1095 ; N uni1F6B ; G 2649\nU 8044 ; WX 946 ; N uni1F6C ; G 2650\nU 8045 ; WX 972 ; N uni1F6D ; G 2651\nU 8046 ; WX 921 ; N uni1F6E ; G 2652\nU 8047 ; WX 952 ; N uni1F6F ; G 2653\nU 8048 ; WX 659 ; N uni1F70 ; G 2654\nU 8049 ; WX 659 ; N uni1F71 ; G 2655\nU 8050 ; WX 541 ; N uni1F72 ; G 2656\nU 8051 ; WX 548 ; N uni1F73 ; G 2657\nU 8052 ; WX 634 ; N uni1F74 ; G 2658\nU 8053 ; WX 654 ; N uni1F75 ; G 2659\nU 8054 ; WX 338 ; N uni1F76 ; G 2660\nU 8055 ; WX 338 ; N uni1F77 ; G 2661\nU 8056 ; WX 612 ; N uni1F78 ; G 2662\nU 8057 ; WX 612 ; N uni1F79 ; G 2663\nU 8058 ; WX 579 ; N uni1F7A ; G 2664\nU 8059 ; WX 579 ; N uni1F7B ; G 2665\nU 8060 ; WX 837 ; N uni1F7C ; G 2666\nU 8061 ; WX 837 ; N uni1F7D ; G 2667\nU 8064 ; WX 659 ; N uni1F80 ; G 2668\nU 8065 ; WX 659 ; N uni1F81 ; G 2669\nU 8066 ; WX 659 ; N uni1F82 ; G 2670\nU 8067 ; WX 659 ; N uni1F83 ; G 2671\nU 8068 ; WX 659 ; N uni1F84 ; G 2672\nU 8069 ; WX 659 ; N uni1F85 ; G 2673\nU 8070 ; WX 659 ; N uni1F86 ; G 2674\nU 8071 ; WX 659 ; N uni1F87 ; G 2675\nU 8072 ; WX 684 ; N uni1F88 ; G 2676\nU 8073 ; WX 684 ; N uni1F89 ; G 2677\nU 8074 ; WX 877 ; N uni1F8A ; G 2678\nU 8075 ; WX 877 ; N uni1F8B ; G 2679\nU 8076 ; WX 769 ; N uni1F8C ; G 2680\nU 8077 ; WX 801 ; N uni1F8D ; G 2681\nU 8078 ; WX 708 ; N uni1F8E ; G 2682\nU 8079 ; WX 743 ; N uni1F8F ; G 2683\nU 8080 ; WX 634 ; N uni1F90 ; G 2684\nU 8081 ; WX 634 ; N uni1F91 ; G 2685\nU 8082 ; WX 634 ; N uni1F92 ; G 2686\nU 8083 ; WX 634 ; N uni1F93 ; G 2687\nU 8084 ; WX 634 ; N uni1F94 ; G 2688\nU 8085 ; WX 634 ; N uni1F95 ; G 2689\nU 8086 ; WX 634 ; N uni1F96 ; G 2690\nU 8087 ; WX 634 ; N uni1F97 ; G 2691\nU 8088 ; WX 837 ; N uni1F98 ; G 2692\nU 8089 ; WX 835 ; N uni1F99 ; G 2693\nU 8090 ; WX 1086 ; N uni1F9A ; G 2694\nU 8091 ; WX 1089 ; N uni1F9B ; G 2695\nU 8092 ; WX 1027 ; N uni1F9C ; G 2696\nU 8093 ; WX 1051 ; N uni1F9D ; G 2697\nU 8094 ; WX 934 ; N uni1F9E ; G 2698\nU 8095 ; WX 947 ; N uni1F9F ; G 2699\nU 8096 ; WX 837 ; N uni1FA0 ; G 2700\nU 8097 ; WX 837 ; N uni1FA1 ; G 2701\nU 8098 ; WX 837 ; N uni1FA2 ; G 2702\nU 8099 ; WX 837 ; N uni1FA3 ; G 2703\nU 8100 ; WX 837 ; N uni1FA4 ; G 2704\nU 8101 ; WX 837 ; N uni1FA5 ; G 2705\nU 8102 ; WX 837 ; N uni1FA6 ; G 2706\nU 8103 ; WX 837 ; N uni1FA7 ; G 2707\nU 8104 ; WX 802 ; N uni1FA8 ; G 2708\nU 8105 ; WX 843 ; N uni1FA9 ; G 2709\nU 8106 ; WX 1089 ; N uni1FAA ; G 2710\nU 8107 ; WX 1095 ; N uni1FAB ; G 2711\nU 8108 ; WX 946 ; N uni1FAC ; G 2712\nU 8109 ; WX 972 ; N uni1FAD ; G 2713\nU 8110 ; WX 921 ; N uni1FAE ; G 2714\nU 8111 ; WX 952 ; N uni1FAF ; G 2715\nU 8112 ; WX 659 ; N uni1FB0 ; G 2716\nU 8113 ; WX 659 ; N uni1FB1 ; G 2717\nU 8114 ; WX 659 ; N uni1FB2 ; G 2718\nU 8115 ; WX 659 ; N uni1FB3 ; G 2719\nU 8116 ; WX 659 ; N uni1FB4 ; G 2720\nU 8118 ; WX 659 ; N uni1FB6 ; G 2721\nU 8119 ; WX 659 ; N uni1FB7 ; G 2722\nU 8120 ; WX 684 ; N uni1FB8 ; G 2723\nU 8121 ; WX 684 ; N uni1FB9 ; G 2724\nU 8122 ; WX 716 ; N uni1FBA ; G 2725\nU 8123 ; WX 692 ; N uni1FBB ; G 2726\nU 8124 ; WX 684 ; N uni1FBC ; G 2727\nU 8125 ; WX 500 ; N uni1FBD ; G 2728\nU 8126 ; WX 500 ; N uni1FBE ; G 2729\nU 8127 ; WX 500 ; N uni1FBF ; G 2730\nU 8128 ; WX 500 ; N uni1FC0 ; G 2731\nU 8129 ; WX 500 ; N uni1FC1 ; G 2732\nU 8130 ; WX 634 ; N uni1FC2 ; G 2733\nU 8131 ; WX 634 ; N uni1FC3 ; G 2734\nU 8132 ; WX 654 ; N uni1FC4 ; G 2735\nU 8134 ; WX 634 ; N uni1FC6 ; G 2736\nU 8135 ; WX 634 ; N uni1FC7 ; G 2737\nU 8136 ; WX 805 ; N uni1FC8 ; G 2738\nU 8137 ; WX 746 ; N uni1FC9 ; G 2739\nU 8138 ; WX 931 ; N uni1FCA ; G 2740\nU 8139 ; WX 871 ; N uni1FCB ; G 2741\nU 8140 ; WX 752 ; N uni1FCC ; G 2742\nU 8141 ; WX 500 ; N uni1FCD ; G 2743\nU 8142 ; WX 500 ; N uni1FCE ; G 2744\nU 8143 ; WX 500 ; N uni1FCF ; G 2745\nU 8144 ; WX 338 ; N uni1FD0 ; G 2746\nU 8145 ; WX 338 ; N uni1FD1 ; G 2747\nU 8146 ; WX 338 ; N uni1FD2 ; G 2748\nU 8147 ; WX 338 ; N uni1FD3 ; G 2749\nU 8150 ; WX 338 ; N uni1FD6 ; G 2750\nU 8151 ; WX 338 ; N uni1FD7 ; G 2751\nU 8152 ; WX 295 ; N uni1FD8 ; G 2752\nU 8153 ; WX 295 ; N uni1FD9 ; G 2753\nU 8154 ; WX 475 ; N uni1FDA ; G 2754\nU 8155 ; WX 408 ; N uni1FDB ; G 2755\nU 8157 ; WX 500 ; N uni1FDD ; G 2756\nU 8158 ; WX 500 ; N uni1FDE ; G 2757\nU 8159 ; WX 500 ; N uni1FDF ; G 2758\nU 8160 ; WX 579 ; N uni1FE0 ; G 2759\nU 8161 ; WX 579 ; N uni1FE1 ; G 2760\nU 8162 ; WX 579 ; N uni1FE2 ; G 2761\nU 8163 ; WX 579 ; N uni1FE3 ; G 2762\nU 8164 ; WX 635 ; N uni1FE4 ; G 2763\nU 8165 ; WX 635 ; N uni1FE5 ; G 2764\nU 8166 ; WX 579 ; N uni1FE6 ; G 2765\nU 8167 ; WX 579 ; N uni1FE7 ; G 2766\nU 8168 ; WX 611 ; N uni1FE8 ; G 2767\nU 8169 ; WX 611 ; N uni1FE9 ; G 2768\nU 8170 ; WX 845 ; N uni1FEA ; G 2769\nU 8171 ; WX 825 ; N uni1FEB ; G 2770\nU 8172 ; WX 685 ; N uni1FEC ; G 2771\nU 8173 ; WX 500 ; N uni1FED ; G 2772\nU 8174 ; WX 500 ; N uni1FEE ; G 2773\nU 8175 ; WX 500 ; N uni1FEF ; G 2774\nU 8178 ; WX 837 ; N uni1FF2 ; G 2775\nU 8179 ; WX 837 ; N uni1FF3 ; G 2776\nU 8180 ; WX 837 ; N uni1FF4 ; G 2777\nU 8182 ; WX 837 ; N uni1FF6 ; G 2778\nU 8183 ; WX 837 ; N uni1FF7 ; G 2779\nU 8184 ; WX 941 ; N uni1FF8 ; G 2780\nU 8185 ; WX 813 ; N uni1FF9 ; G 2781\nU 8186 ; WX 922 ; N uni1FFA ; G 2782\nU 8187 ; WX 826 ; N uni1FFB ; G 2783\nU 8188 ; WX 764 ; N uni1FFC ; G 2784\nU 8189 ; WX 500 ; N uni1FFD ; G 2785\nU 8190 ; WX 500 ; N uni1FFE ; G 2786\nU 8192 ; WX 500 ; N uni2000 ; G 2787\nU 8193 ; WX 1000 ; N uni2001 ; G 2788\nU 8194 ; WX 500 ; N uni2002 ; G 2789\nU 8195 ; WX 1000 ; N uni2003 ; G 2790\nU 8196 ; WX 330 ; N uni2004 ; G 2791\nU 8197 ; WX 250 ; N uni2005 ; G 2792\nU 8198 ; WX 167 ; N uni2006 ; G 2793\nU 8199 ; WX 636 ; N uni2007 ; G 2794\nU 8200 ; WX 318 ; N uni2008 ; G 2795\nU 8201 ; WX 200 ; N uni2009 ; G 2796\nU 8202 ; WX 100 ; N uni200A ; G 2797\nU 8203 ; WX 0 ; N uni200B ; G 2798\nU 8204 ; WX 0 ; N uni200C ; G 2799\nU 8205 ; WX 0 ; N uni200D ; G 2800\nU 8206 ; WX 0 ; N uni200E ; G 2801\nU 8207 ; WX 0 ; N uni200F ; G 2802\nU 8208 ; WX 361 ; N uni2010 ; G 2803\nU 8209 ; WX 361 ; N uni2011 ; G 2804\nU 8210 ; WX 636 ; N figuredash ; G 2805\nU 8211 ; WX 500 ; N endash ; G 2806\nU 8212 ; WX 1000 ; N emdash ; G 2807\nU 8213 ; WX 1000 ; N uni2015 ; G 2808\nU 8214 ; WX 500 ; N uni2016 ; G 2809\nU 8215 ; WX 500 ; N underscoredbl ; G 2810\nU 8216 ; WX 318 ; N quoteleft ; G 2811\nU 8217 ; WX 318 ; N quoteright ; G 2812\nU 8218 ; WX 318 ; N quotesinglbase ; G 2813\nU 8219 ; WX 318 ; N quotereversed ; G 2814\nU 8220 ; WX 518 ; N quotedblleft ; G 2815\nU 8221 ; WX 518 ; N quotedblright ; G 2816\nU 8222 ; WX 518 ; N quotedblbase ; G 2817\nU 8223 ; WX 518 ; N uni201F ; G 2818\nU 8224 ; WX 500 ; N dagger ; G 2819\nU 8225 ; WX 500 ; N daggerdbl ; G 2820\nU 8226 ; WX 590 ; N bullet ; G 2821\nU 8227 ; WX 590 ; N uni2023 ; G 2822\nU 8228 ; WX 334 ; N onedotenleader ; G 2823\nU 8229 ; WX 667 ; N twodotenleader ; G 2824\nU 8230 ; WX 1000 ; N ellipsis ; G 2825\nU 8231 ; WX 318 ; N uni2027 ; G 2826\nU 8232 ; WX 0 ; N uni2028 ; G 2827\nU 8233 ; WX 0 ; N uni2029 ; G 2828\nU 8234 ; WX 0 ; N uni202A ; G 2829\nU 8235 ; WX 0 ; N uni202B ; G 2830\nU 8236 ; WX 0 ; N uni202C ; G 2831\nU 8237 ; WX 0 ; N uni202D ; G 2832\nU 8238 ; WX 0 ; N uni202E ; G 2833\nU 8239 ; WX 200 ; N uni202F ; G 2834\nU 8240 ; WX 1342 ; N perthousand ; G 2835\nU 8241 ; WX 1735 ; N uni2031 ; G 2836\nU 8242 ; WX 227 ; N minute ; G 2837\nU 8243 ; WX 374 ; N second ; G 2838\nU 8244 ; WX 520 ; N uni2034 ; G 2839\nU 8245 ; WX 227 ; N uni2035 ; G 2840\nU 8246 ; WX 374 ; N uni2036 ; G 2841\nU 8247 ; WX 520 ; N uni2037 ; G 2842\nU 8248 ; WX 339 ; N uni2038 ; G 2843\nU 8249 ; WX 400 ; N guilsinglleft ; G 2844\nU 8250 ; WX 400 ; N guilsinglright ; G 2845\nU 8251 ; WX 838 ; N uni203B ; G 2846\nU 8252 ; WX 485 ; N exclamdbl ; G 2847\nU 8253 ; WX 531 ; N uni203D ; G 2848\nU 8254 ; WX 500 ; N uni203E ; G 2849\nU 8255 ; WX 804 ; N uni203F ; G 2850\nU 8256 ; WX 804 ; N uni2040 ; G 2851\nU 8257 ; WX 250 ; N uni2041 ; G 2852\nU 8258 ; WX 1000 ; N uni2042 ; G 2853\nU 8259 ; WX 500 ; N uni2043 ; G 2854\nU 8260 ; WX 167 ; N fraction ; G 2855\nU 8261 ; WX 390 ; N uni2045 ; G 2856\nU 8262 ; WX 390 ; N uni2046 ; G 2857\nU 8263 ; WX 922 ; N uni2047 ; G 2858\nU 8264 ; WX 733 ; N uni2048 ; G 2859\nU 8265 ; WX 733 ; N uni2049 ; G 2860\nU 8266 ; WX 497 ; N uni204A ; G 2861\nU 8267 ; WX 636 ; N uni204B ; G 2862\nU 8268 ; WX 500 ; N uni204C ; G 2863\nU 8269 ; WX 500 ; N uni204D ; G 2864\nU 8270 ; WX 500 ; N uni204E ; G 2865\nU 8271 ; WX 337 ; N uni204F ; G 2866\nU 8272 ; WX 804 ; N uni2050 ; G 2867\nU 8273 ; WX 500 ; N uni2051 ; G 2868\nU 8274 ; WX 450 ; N uni2052 ; G 2869\nU 8275 ; WX 1000 ; N uni2053 ; G 2870\nU 8276 ; WX 804 ; N uni2054 ; G 2871\nU 8277 ; WX 838 ; N uni2055 ; G 2872\nU 8278 ; WX 586 ; N uni2056 ; G 2873\nU 8279 ; WX 663 ; N uni2057 ; G 2874\nU 8280 ; WX 838 ; N uni2058 ; G 2875\nU 8281 ; WX 838 ; N uni2059 ; G 2876\nU 8282 ; WX 318 ; N uni205A ; G 2877\nU 8283 ; WX 797 ; N uni205B ; G 2878\nU 8284 ; WX 838 ; N uni205C ; G 2879\nU 8285 ; WX 318 ; N uni205D ; G 2880\nU 8286 ; WX 318 ; N uni205E ; G 2881\nU 8287 ; WX 222 ; N uni205F ; G 2882\nU 8288 ; WX 0 ; N uni2060 ; G 2883\nU 8289 ; WX 0 ; N uni2061 ; G 2884\nU 8290 ; WX 0 ; N uni2062 ; G 2885\nU 8291 ; WX 0 ; N uni2063 ; G 2886\nU 8292 ; WX 0 ; N uni2064 ; G 2887\nU 8298 ; WX 0 ; N uni206A ; G 2888\nU 8299 ; WX 0 ; N uni206B ; G 2889\nU 8300 ; WX 0 ; N uni206C ; G 2890\nU 8301 ; WX 0 ; N uni206D ; G 2891\nU 8302 ; WX 0 ; N uni206E ; G 2892\nU 8303 ; WX 0 ; N uni206F ; G 2893\nU 8304 ; WX 401 ; N uni2070 ; G 2894\nU 8305 ; WX 179 ; N uni2071 ; G 2895\nU 8308 ; WX 401 ; N uni2074 ; G 2896\nU 8309 ; WX 401 ; N uni2075 ; G 2897\nU 8310 ; WX 401 ; N uni2076 ; G 2898\nU 8311 ; WX 401 ; N uni2077 ; G 2899\nU 8312 ; WX 401 ; N uni2078 ; G 2900\nU 8313 ; WX 401 ; N uni2079 ; G 2901\nU 8314 ; WX 528 ; N uni207A ; G 2902\nU 8315 ; WX 528 ; N uni207B ; G 2903\nU 8316 ; WX 528 ; N uni207C ; G 2904\nU 8317 ; WX 246 ; N uni207D ; G 2905\nU 8318 ; WX 246 ; N uni207E ; G 2906\nU 8319 ; WX 398 ; N uni207F ; G 2907\nU 8320 ; WX 401 ; N uni2080 ; G 2908\nU 8321 ; WX 401 ; N uni2081 ; G 2909\nU 8322 ; WX 401 ; N uni2082 ; G 2910\nU 8323 ; WX 401 ; N uni2083 ; G 2911\nU 8324 ; WX 401 ; N uni2084 ; G 2912\nU 8325 ; WX 401 ; N uni2085 ; G 2913\nU 8326 ; WX 401 ; N uni2086 ; G 2914\nU 8327 ; WX 401 ; N uni2087 ; G 2915\nU 8328 ; WX 401 ; N uni2088 ; G 2916\nU 8329 ; WX 401 ; N uni2089 ; G 2917\nU 8330 ; WX 528 ; N uni208A ; G 2918\nU 8331 ; WX 528 ; N uni208B ; G 2919\nU 8332 ; WX 528 ; N uni208C ; G 2920\nU 8333 ; WX 246 ; N uni208D ; G 2921\nU 8334 ; WX 246 ; N uni208E ; G 2922\nU 8336 ; WX 392 ; N uni2090 ; G 2923\nU 8337 ; WX 417 ; N uni2091 ; G 2924\nU 8338 ; WX 414 ; N uni2092 ; G 2925\nU 8339 ; WX 444 ; N uni2093 ; G 2926\nU 8340 ; WX 417 ; N uni2094 ; G 2927\nU 8341 ; WX 404 ; N uni2095 ; G 2928\nU 8342 ; WX 426 ; N uni2096 ; G 2929\nU 8343 ; WX 166 ; N uni2097 ; G 2930\nU 8344 ; WX 623 ; N uni2098 ; G 2931\nU 8345 ; WX 398 ; N uni2099 ; G 2932\nU 8346 ; WX 428 ; N uni209A ; G 2933\nU 8347 ; WX 373 ; N uni209B ; G 2934\nU 8348 ; WX 295 ; N uni209C ; G 2935\nU 8352 ; WX 877 ; N uni20A0 ; G 2936\nU 8353 ; WX 636 ; N colonmonetary ; G 2937\nU 8354 ; WX 636 ; N uni20A2 ; G 2938\nU 8355 ; WX 636 ; N franc ; G 2939\nU 8356 ; WX 636 ; N lira ; G 2940\nU 8357 ; WX 974 ; N uni20A5 ; G 2941\nU 8358 ; WX 636 ; N uni20A6 ; G 2942\nU 8359 ; WX 1272 ; N peseta ; G 2943\nU 8360 ; WX 1074 ; N uni20A8 ; G 2944\nU 8361 ; WX 989 ; N uni20A9 ; G 2945\nU 8362 ; WX 784 ; N uni20AA ; G 2946\nU 8363 ; WX 636 ; N dong ; G 2947\nU 8364 ; WX 636 ; N Euro ; G 2948\nU 8365 ; WX 636 ; N uni20AD ; G 2949\nU 8366 ; WX 636 ; N uni20AE ; G 2950\nU 8367 ; WX 1272 ; N uni20AF ; G 2951\nU 8368 ; WX 636 ; N uni20B0 ; G 2952\nU 8369 ; WX 636 ; N uni20B1 ; G 2953\nU 8370 ; WX 636 ; N uni20B2 ; G 2954\nU 8371 ; WX 636 ; N uni20B3 ; G 2955\nU 8372 ; WX 774 ; N uni20B4 ; G 2956\nU 8373 ; WX 636 ; N uni20B5 ; G 2957\nU 8376 ; WX 636 ; N uni20B8 ; G 2958\nU 8377 ; WX 636 ; N uni20B9 ; G 2959\nU 8378 ; WX 636 ; N uni20BA ; G 2960\nU 8381 ; WX 636 ; N uni20BD ; G 2961\nU 8400 ; WX 0 ; N uni20D0 ; G 2962\nU 8401 ; WX 0 ; N uni20D1 ; G 2963\nU 8406 ; WX 0 ; N uni20D6 ; G 2964\nU 8407 ; WX 0 ; N uni20D7 ; G 2965\nU 8411 ; WX 0 ; N uni20DB ; G 2966\nU 8412 ; WX 0 ; N uni20DC ; G 2967\nU 8417 ; WX 0 ; N uni20E1 ; G 2968\nU 8448 ; WX 1019 ; N uni2100 ; G 2969\nU 8449 ; WX 1019 ; N uni2101 ; G 2970\nU 8450 ; WX 698 ; N uni2102 ; G 2971\nU 8451 ; WX 1123 ; N uni2103 ; G 2972\nU 8452 ; WX 642 ; N uni2104 ; G 2973\nU 8453 ; WX 1019 ; N uni2105 ; G 2974\nU 8454 ; WX 1067 ; N uni2106 ; G 2975\nU 8455 ; WX 614 ; N uni2107 ; G 2976\nU 8456 ; WX 698 ; N uni2108 ; G 2977\nU 8457 ; WX 952 ; N uni2109 ; G 2978\nU 8459 ; WX 988 ; N uni210B ; G 2979\nU 8460 ; WX 754 ; N uni210C ; G 2980\nU 8461 ; WX 850 ; N uni210D ; G 2981\nU 8462 ; WX 634 ; N uni210E ; G 2982\nU 8463 ; WX 634 ; N uni210F ; G 2983\nU 8464 ; WX 470 ; N uni2110 ; G 2984\nU 8465 ; WX 697 ; N Ifraktur ; G 2985\nU 8466 ; WX 720 ; N uni2112 ; G 2986\nU 8467 ; WX 413 ; N uni2113 ; G 2987\nU 8468 ; WX 818 ; N uni2114 ; G 2988\nU 8469 ; WX 801 ; N uni2115 ; G 2989\nU 8470 ; WX 1040 ; N uni2116 ; G 2990\nU 8471 ; WX 1000 ; N uni2117 ; G 2991\nU 8472 ; WX 697 ; N weierstrass ; G 2992\nU 8473 ; WX 701 ; N uni2119 ; G 2993\nU 8474 ; WX 787 ; N uni211A ; G 2994\nU 8475 ; WX 798 ; N uni211B ; G 2995\nU 8476 ; WX 814 ; N Rfraktur ; G 2996\nU 8477 ; WX 792 ; N uni211D ; G 2997\nU 8478 ; WX 896 ; N prescription ; G 2998\nU 8479 ; WX 684 ; N uni211F ; G 2999\nU 8480 ; WX 1020 ; N uni2120 ; G 3000\nU 8481 ; WX 1074 ; N uni2121 ; G 3001\nU 8482 ; WX 1000 ; N trademark ; G 3002\nU 8483 ; WX 684 ; N uni2123 ; G 3003\nU 8484 ; WX 745 ; N uni2124 ; G 3004\nU 8485 ; WX 578 ; N uni2125 ; G 3005\nU 8486 ; WX 764 ; N uni2126 ; G 3006\nU 8487 ; WX 764 ; N uni2127 ; G 3007\nU 8488 ; WX 616 ; N uni2128 ; G 3008\nU 8489 ; WX 338 ; N uni2129 ; G 3009\nU 8490 ; WX 656 ; N uni212A ; G 3010\nU 8491 ; WX 684 ; N uni212B ; G 3011\nU 8492 ; WX 786 ; N uni212C ; G 3012\nU 8493 ; WX 703 ; N uni212D ; G 3013\nU 8494 ; WX 854 ; N estimated ; G 3014\nU 8495 ; WX 592 ; N uni212F ; G 3015\nU 8496 ; WX 605 ; N uni2130 ; G 3016\nU 8497 ; WX 786 ; N uni2131 ; G 3017\nU 8498 ; WX 575 ; N uni2132 ; G 3018\nU 8499 ; WX 1069 ; N uni2133 ; G 3019\nU 8500 ; WX 462 ; N uni2134 ; G 3020\nU 8501 ; WX 745 ; N aleph ; G 3021\nU 8502 ; WX 674 ; N uni2136 ; G 3022\nU 8503 ; WX 466 ; N uni2137 ; G 3023\nU 8504 ; WX 645 ; N uni2138 ; G 3024\nU 8505 ; WX 380 ; N uni2139 ; G 3025\nU 8506 ; WX 926 ; N uni213A ; G 3026\nU 8507 ; WX 1194 ; N uni213B ; G 3027\nU 8508 ; WX 702 ; N uni213C ; G 3028\nU 8509 ; WX 728 ; N uni213D ; G 3029\nU 8510 ; WX 654 ; N uni213E ; G 3030\nU 8511 ; WX 849 ; N uni213F ; G 3031\nU 8512 ; WX 811 ; N uni2140 ; G 3032\nU 8513 ; WX 775 ; N uni2141 ; G 3033\nU 8514 ; WX 557 ; N uni2142 ; G 3034\nU 8515 ; WX 557 ; N uni2143 ; G 3035\nU 8516 ; WX 611 ; N uni2144 ; G 3036\nU 8517 ; WX 819 ; N uni2145 ; G 3037\nU 8518 ; WX 708 ; N uni2146 ; G 3038\nU 8519 ; WX 615 ; N uni2147 ; G 3039\nU 8520 ; WX 351 ; N uni2148 ; G 3040\nU 8521 ; WX 351 ; N uni2149 ; G 3041\nU 8523 ; WX 780 ; N uni214B ; G 3042\nU 8526 ; WX 526 ; N uni214E ; G 3043\nU 8528 ; WX 969 ; N uni2150 ; G 3044\nU 8529 ; WX 969 ; N uni2151 ; G 3045\nU 8530 ; WX 1370 ; N uni2152 ; G 3046\nU 8531 ; WX 969 ; N onethird ; G 3047\nU 8532 ; WX 969 ; N twothirds ; G 3048\nU 8533 ; WX 969 ; N uni2155 ; G 3049\nU 8534 ; WX 969 ; N uni2156 ; G 3050\nU 8535 ; WX 969 ; N uni2157 ; G 3051\nU 8536 ; WX 969 ; N uni2158 ; G 3052\nU 8537 ; WX 969 ; N uni2159 ; G 3053\nU 8538 ; WX 969 ; N uni215A ; G 3054\nU 8539 ; WX 969 ; N oneeighth ; G 3055\nU 8540 ; WX 969 ; N threeeighths ; G 3056\nU 8541 ; WX 969 ; N fiveeighths ; G 3057\nU 8542 ; WX 969 ; N seveneighths ; G 3058\nU 8543 ; WX 568 ; N uni215F ; G 3059\nU 8544 ; WX 295 ; N uni2160 ; G 3060\nU 8545 ; WX 492 ; N uni2161 ; G 3061\nU 8546 ; WX 689 ; N uni2162 ; G 3062\nU 8547 ; WX 923 ; N uni2163 ; G 3063\nU 8548 ; WX 684 ; N uni2164 ; G 3064\nU 8549 ; WX 922 ; N uni2165 ; G 3065\nU 8550 ; WX 1120 ; N uni2166 ; G 3066\nU 8551 ; WX 1317 ; N uni2167 ; G 3067\nU 8552 ; WX 917 ; N uni2168 ; G 3068\nU 8553 ; WX 685 ; N uni2169 ; G 3069\nU 8554 ; WX 933 ; N uni216A ; G 3070\nU 8555 ; WX 1131 ; N uni216B ; G 3071\nU 8556 ; WX 557 ; N uni216C ; G 3072\nU 8557 ; WX 698 ; N uni216D ; G 3073\nU 8558 ; WX 770 ; N uni216E ; G 3074\nU 8559 ; WX 863 ; N uni216F ; G 3075\nU 8560 ; WX 278 ; N uni2170 ; G 3076\nU 8561 ; WX 458 ; N uni2171 ; G 3077\nU 8562 ; WX 637 ; N uni2172 ; G 3078\nU 8563 ; WX 812 ; N uni2173 ; G 3079\nU 8564 ; WX 592 ; N uni2174 ; G 3080\nU 8565 ; WX 811 ; N uni2175 ; G 3081\nU 8566 ; WX 991 ; N uni2176 ; G 3082\nU 8567 ; WX 1170 ; N uni2177 ; G 3083\nU 8568 ; WX 819 ; N uni2178 ; G 3084\nU 8569 ; WX 592 ; N uni2179 ; G 3085\nU 8570 ; WX 822 ; N uni217A ; G 3086\nU 8571 ; WX 1002 ; N uni217B ; G 3087\nU 8572 ; WX 278 ; N uni217C ; G 3088\nU 8573 ; WX 550 ; N uni217D ; G 3089\nU 8574 ; WX 635 ; N uni217E ; G 3090\nU 8575 ; WX 974 ; N uni217F ; G 3091\nU 8576 ; WX 1245 ; N uni2180 ; G 3092\nU 8577 ; WX 770 ; N uni2181 ; G 3093\nU 8578 ; WX 1245 ; N uni2182 ; G 3094\nU 8579 ; WX 703 ; N uni2183 ; G 3095\nU 8580 ; WX 549 ; N uni2184 ; G 3096\nU 8581 ; WX 698 ; N uni2185 ; G 3097\nU 8585 ; WX 969 ; N uni2189 ; G 3098\nU 8592 ; WX 838 ; N arrowleft ; G 3099\nU 8593 ; WX 838 ; N arrowup ; G 3100\nU 8594 ; WX 838 ; N arrowright ; G 3101\nU 8595 ; WX 838 ; N arrowdown ; G 3102\nU 8596 ; WX 838 ; N arrowboth ; G 3103\nU 8597 ; WX 838 ; N arrowupdn ; G 3104\nU 8598 ; WX 838 ; N uni2196 ; G 3105\nU 8599 ; WX 838 ; N uni2197 ; G 3106\nU 8600 ; WX 838 ; N uni2198 ; G 3107\nU 8601 ; WX 838 ; N uni2199 ; G 3108\nU 8602 ; WX 838 ; N uni219A ; G 3109\nU 8603 ; WX 838 ; N uni219B ; G 3110\nU 8604 ; WX 838 ; N uni219C ; G 3111\nU 8605 ; WX 838 ; N uni219D ; G 3112\nU 8606 ; WX 838 ; N uni219E ; G 3113\nU 8607 ; WX 838 ; N uni219F ; G 3114\nU 8608 ; WX 838 ; N uni21A0 ; G 3115\nU 8609 ; WX 838 ; N uni21A1 ; G 3116\nU 8610 ; WX 838 ; N uni21A2 ; G 3117\nU 8611 ; WX 838 ; N uni21A3 ; G 3118\nU 8612 ; WX 838 ; N uni21A4 ; G 3119\nU 8613 ; WX 838 ; N uni21A5 ; G 3120\nU 8614 ; WX 838 ; N uni21A6 ; G 3121\nU 8615 ; WX 838 ; N uni21A7 ; G 3122\nU 8616 ; WX 838 ; N arrowupdnbse ; G 3123\nU 8617 ; WX 838 ; N uni21A9 ; G 3124\nU 8618 ; WX 838 ; N uni21AA ; G 3125\nU 8619 ; WX 838 ; N uni21AB ; G 3126\nU 8620 ; WX 838 ; N uni21AC ; G 3127\nU 8621 ; WX 838 ; N uni21AD ; G 3128\nU 8622 ; WX 838 ; N uni21AE ; G 3129\nU 8623 ; WX 838 ; N uni21AF ; G 3130\nU 8624 ; WX 838 ; N uni21B0 ; G 3131\nU 8625 ; WX 838 ; N uni21B1 ; G 3132\nU 8626 ; WX 838 ; N uni21B2 ; G 3133\nU 8627 ; WX 838 ; N uni21B3 ; G 3134\nU 8628 ; WX 838 ; N uni21B4 ; G 3135\nU 8629 ; WX 838 ; N carriagereturn ; G 3136\nU 8630 ; WX 838 ; N uni21B6 ; G 3137\nU 8631 ; WX 838 ; N uni21B7 ; G 3138\nU 8632 ; WX 838 ; N uni21B8 ; G 3139\nU 8633 ; WX 838 ; N uni21B9 ; G 3140\nU 8634 ; WX 838 ; N uni21BA ; G 3141\nU 8635 ; WX 838 ; N uni21BB ; G 3142\nU 8636 ; WX 838 ; N uni21BC ; G 3143\nU 8637 ; WX 838 ; N uni21BD ; G 3144\nU 8638 ; WX 838 ; N uni21BE ; G 3145\nU 8639 ; WX 838 ; N uni21BF ; G 3146\nU 8640 ; WX 838 ; N uni21C0 ; G 3147\nU 8641 ; WX 838 ; N uni21C1 ; G 3148\nU 8642 ; WX 838 ; N uni21C2 ; G 3149\nU 8643 ; WX 838 ; N uni21C3 ; G 3150\nU 8644 ; WX 838 ; N uni21C4 ; G 3151\nU 8645 ; WX 838 ; N uni21C5 ; G 3152\nU 8646 ; WX 838 ; N uni21C6 ; G 3153\nU 8647 ; WX 838 ; N uni21C7 ; G 3154\nU 8648 ; WX 838 ; N uni21C8 ; G 3155\nU 8649 ; WX 838 ; N uni21C9 ; G 3156\nU 8650 ; WX 838 ; N uni21CA ; G 3157\nU 8651 ; WX 838 ; N uni21CB ; G 3158\nU 8652 ; WX 838 ; N uni21CC ; G 3159\nU 8653 ; WX 838 ; N uni21CD ; G 3160\nU 8654 ; WX 838 ; N uni21CE ; G 3161\nU 8655 ; WX 838 ; N uni21CF ; G 3162\nU 8656 ; WX 838 ; N arrowdblleft ; G 3163\nU 8657 ; WX 838 ; N arrowdblup ; G 3164\nU 8658 ; WX 838 ; N arrowdblright ; G 3165\nU 8659 ; WX 838 ; N arrowdbldown ; G 3166\nU 8660 ; WX 838 ; N arrowdblboth ; G 3167\nU 8661 ; WX 838 ; N uni21D5 ; G 3168\nU 8662 ; WX 838 ; N uni21D6 ; G 3169\nU 8663 ; WX 838 ; N uni21D7 ; G 3170\nU 8664 ; WX 838 ; N uni21D8 ; G 3171\nU 8665 ; WX 838 ; N uni21D9 ; G 3172\nU 8666 ; WX 838 ; N uni21DA ; G 3173\nU 8667 ; WX 838 ; N uni21DB ; G 3174\nU 8668 ; WX 838 ; N uni21DC ; G 3175\nU 8669 ; WX 838 ; N uni21DD ; G 3176\nU 8670 ; WX 838 ; N uni21DE ; G 3177\nU 8671 ; WX 838 ; N uni21DF ; G 3178\nU 8672 ; WX 838 ; N uni21E0 ; G 3179\nU 8673 ; WX 838 ; N uni21E1 ; G 3180\nU 8674 ; WX 838 ; N uni21E2 ; G 3181\nU 8675 ; WX 838 ; N uni21E3 ; G 3182\nU 8676 ; WX 838 ; N uni21E4 ; G 3183\nU 8677 ; WX 838 ; N uni21E5 ; G 3184\nU 8678 ; WX 838 ; N uni21E6 ; G 3185\nU 8679 ; WX 838 ; N uni21E7 ; G 3186\nU 8680 ; WX 838 ; N uni21E8 ; G 3187\nU 8681 ; WX 838 ; N uni21E9 ; G 3188\nU 8682 ; WX 838 ; N uni21EA ; G 3189\nU 8683 ; WX 838 ; N uni21EB ; G 3190\nU 8684 ; WX 838 ; N uni21EC ; G 3191\nU 8685 ; WX 838 ; N uni21ED ; G 3192\nU 8686 ; WX 838 ; N uni21EE ; G 3193\nU 8687 ; WX 838 ; N uni21EF ; G 3194\nU 8688 ; WX 838 ; N uni21F0 ; G 3195\nU 8689 ; WX 838 ; N uni21F1 ; G 3196\nU 8690 ; WX 838 ; N uni21F2 ; G 3197\nU 8691 ; WX 838 ; N uni21F3 ; G 3198\nU 8692 ; WX 838 ; N uni21F4 ; G 3199\nU 8693 ; WX 838 ; N uni21F5 ; G 3200\nU 8694 ; WX 838 ; N uni21F6 ; G 3201\nU 8695 ; WX 838 ; N uni21F7 ; G 3202\nU 8696 ; WX 838 ; N uni21F8 ; G 3203\nU 8697 ; WX 838 ; N uni21F9 ; G 3204\nU 8698 ; WX 838 ; N uni21FA ; G 3205\nU 8699 ; WX 838 ; N uni21FB ; G 3206\nU 8700 ; WX 838 ; N uni21FC ; G 3207\nU 8701 ; WX 838 ; N uni21FD ; G 3208\nU 8702 ; WX 838 ; N uni21FE ; G 3209\nU 8703 ; WX 838 ; N uni21FF ; G 3210\nU 8704 ; WX 684 ; N universal ; G 3211\nU 8705 ; WX 636 ; N uni2201 ; G 3212\nU 8706 ; WX 517 ; N partialdiff ; G 3213\nU 8707 ; WX 632 ; N existential ; G 3214\nU 8708 ; WX 632 ; N uni2204 ; G 3215\nU 8709 ; WX 871 ; N emptyset ; G 3216\nU 8710 ; WX 669 ; N increment ; G 3217\nU 8711 ; WX 669 ; N gradient ; G 3218\nU 8712 ; WX 871 ; N element ; G 3219\nU 8713 ; WX 871 ; N notelement ; G 3220\nU 8714 ; WX 718 ; N uni220A ; G 3221\nU 8715 ; WX 871 ; N suchthat ; G 3222\nU 8716 ; WX 871 ; N uni220C ; G 3223\nU 8717 ; WX 718 ; N uni220D ; G 3224\nU 8718 ; WX 636 ; N uni220E ; G 3225\nU 8719 ; WX 757 ; N product ; G 3226\nU 8720 ; WX 757 ; N uni2210 ; G 3227\nU 8721 ; WX 674 ; N summation ; G 3228\nU 8722 ; WX 838 ; N minus ; G 3229\nU 8723 ; WX 838 ; N uni2213 ; G 3230\nU 8724 ; WX 838 ; N uni2214 ; G 3231\nU 8725 ; WX 337 ; N uni2215 ; G 3232\nU 8726 ; WX 637 ; N uni2216 ; G 3233\nU 8727 ; WX 838 ; N asteriskmath ; G 3234\nU 8728 ; WX 626 ; N uni2218 ; G 3235\nU 8729 ; WX 626 ; N uni2219 ; G 3236\nU 8730 ; WX 637 ; N radical ; G 3237\nU 8731 ; WX 637 ; N uni221B ; G 3238\nU 8732 ; WX 637 ; N uni221C ; G 3239\nU 8733 ; WX 714 ; N proportional ; G 3240\nU 8734 ; WX 833 ; N infinity ; G 3241\nU 8735 ; WX 838 ; N orthogonal ; G 3242\nU 8736 ; WX 896 ; N angle ; G 3243\nU 8737 ; WX 896 ; N uni2221 ; G 3244\nU 8738 ; WX 838 ; N uni2222 ; G 3245\nU 8739 ; WX 500 ; N uni2223 ; G 3246\nU 8740 ; WX 500 ; N uni2224 ; G 3247\nU 8741 ; WX 500 ; N uni2225 ; G 3248\nU 8742 ; WX 500 ; N uni2226 ; G 3249\nU 8743 ; WX 732 ; N logicaland ; G 3250\nU 8744 ; WX 732 ; N logicalor ; G 3251\nU 8745 ; WX 732 ; N intersection ; G 3252\nU 8746 ; WX 732 ; N union ; G 3253\nU 8747 ; WX 521 ; N integral ; G 3254\nU 8748 ; WX 789 ; N uni222C ; G 3255\nU 8749 ; WX 1057 ; N uni222D ; G 3256\nU 8750 ; WX 521 ; N uni222E ; G 3257\nU 8751 ; WX 789 ; N uni222F ; G 3258\nU 8752 ; WX 1057 ; N uni2230 ; G 3259\nU 8753 ; WX 521 ; N uni2231 ; G 3260\nU 8754 ; WX 521 ; N uni2232 ; G 3261\nU 8755 ; WX 521 ; N uni2233 ; G 3262\nU 8756 ; WX 636 ; N therefore ; G 3263\nU 8757 ; WX 636 ; N uni2235 ; G 3264\nU 8758 ; WX 260 ; N uni2236 ; G 3265\nU 8759 ; WX 636 ; N uni2237 ; G 3266\nU 8760 ; WX 838 ; N uni2238 ; G 3267\nU 8761 ; WX 838 ; N uni2239 ; G 3268\nU 8762 ; WX 838 ; N uni223A ; G 3269\nU 8763 ; WX 838 ; N uni223B ; G 3270\nU 8764 ; WX 838 ; N similar ; G 3271\nU 8765 ; WX 838 ; N uni223D ; G 3272\nU 8766 ; WX 838 ; N uni223E ; G 3273\nU 8767 ; WX 838 ; N uni223F ; G 3274\nU 8768 ; WX 375 ; N uni2240 ; G 3275\nU 8769 ; WX 838 ; N uni2241 ; G 3276\nU 8770 ; WX 838 ; N uni2242 ; G 3277\nU 8771 ; WX 838 ; N uni2243 ; G 3278\nU 8772 ; WX 838 ; N uni2244 ; G 3279\nU 8773 ; WX 838 ; N congruent ; G 3280\nU 8774 ; WX 838 ; N uni2246 ; G 3281\nU 8775 ; WX 838 ; N uni2247 ; G 3282\nU 8776 ; WX 838 ; N approxequal ; G 3283\nU 8777 ; WX 838 ; N uni2249 ; G 3284\nU 8778 ; WX 838 ; N uni224A ; G 3285\nU 8779 ; WX 838 ; N uni224B ; G 3286\nU 8780 ; WX 838 ; N uni224C ; G 3287\nU 8781 ; WX 838 ; N uni224D ; G 3288\nU 8782 ; WX 838 ; N uni224E ; G 3289\nU 8783 ; WX 838 ; N uni224F ; G 3290\nU 8784 ; WX 838 ; N uni2250 ; G 3291\nU 8785 ; WX 838 ; N uni2251 ; G 3292\nU 8786 ; WX 839 ; N uni2252 ; G 3293\nU 8787 ; WX 839 ; N uni2253 ; G 3294\nU 8788 ; WX 1000 ; N uni2254 ; G 3295\nU 8789 ; WX 1000 ; N uni2255 ; G 3296\nU 8790 ; WX 838 ; N uni2256 ; G 3297\nU 8791 ; WX 838 ; N uni2257 ; G 3298\nU 8792 ; WX 838 ; N uni2258 ; G 3299\nU 8793 ; WX 838 ; N uni2259 ; G 3300\nU 8794 ; WX 838 ; N uni225A ; G 3301\nU 8795 ; WX 838 ; N uni225B ; G 3302\nU 8796 ; WX 838 ; N uni225C ; G 3303\nU 8797 ; WX 838 ; N uni225D ; G 3304\nU 8798 ; WX 838 ; N uni225E ; G 3305\nU 8799 ; WX 838 ; N uni225F ; G 3306\nU 8800 ; WX 838 ; N notequal ; G 3307\nU 8801 ; WX 838 ; N equivalence ; G 3308\nU 8802 ; WX 838 ; N uni2262 ; G 3309\nU 8803 ; WX 838 ; N uni2263 ; G 3310\nU 8804 ; WX 838 ; N lessequal ; G 3311\nU 8805 ; WX 838 ; N greaterequal ; G 3312\nU 8806 ; WX 838 ; N uni2266 ; G 3313\nU 8807 ; WX 838 ; N uni2267 ; G 3314\nU 8808 ; WX 838 ; N uni2268 ; G 3315\nU 8809 ; WX 838 ; N uni2269 ; G 3316\nU 8810 ; WX 1047 ; N uni226A ; G 3317\nU 8811 ; WX 1047 ; N uni226B ; G 3318\nU 8812 ; WX 464 ; N uni226C ; G 3319\nU 8813 ; WX 838 ; N uni226D ; G 3320\nU 8814 ; WX 838 ; N uni226E ; G 3321\nU 8815 ; WX 838 ; N uni226F ; G 3322\nU 8816 ; WX 838 ; N uni2270 ; G 3323\nU 8817 ; WX 838 ; N uni2271 ; G 3324\nU 8818 ; WX 838 ; N uni2272 ; G 3325\nU 8819 ; WX 838 ; N uni2273 ; G 3326\nU 8820 ; WX 838 ; N uni2274 ; G 3327\nU 8821 ; WX 838 ; N uni2275 ; G 3328\nU 8822 ; WX 838 ; N uni2276 ; G 3329\nU 8823 ; WX 838 ; N uni2277 ; G 3330\nU 8824 ; WX 838 ; N uni2278 ; G 3331\nU 8825 ; WX 838 ; N uni2279 ; G 3332\nU 8826 ; WX 838 ; N uni227A ; G 3333\nU 8827 ; WX 838 ; N uni227B ; G 3334\nU 8828 ; WX 838 ; N uni227C ; G 3335\nU 8829 ; WX 838 ; N uni227D ; G 3336\nU 8830 ; WX 838 ; N uni227E ; G 3337\nU 8831 ; WX 838 ; N uni227F ; G 3338\nU 8832 ; WX 838 ; N uni2280 ; G 3339\nU 8833 ; WX 838 ; N uni2281 ; G 3340\nU 8834 ; WX 838 ; N propersubset ; G 3341\nU 8835 ; WX 838 ; N propersuperset ; G 3342\nU 8836 ; WX 838 ; N notsubset ; G 3343\nU 8837 ; WX 838 ; N uni2285 ; G 3344\nU 8838 ; WX 838 ; N reflexsubset ; G 3345\nU 8839 ; WX 838 ; N reflexsuperset ; G 3346\nU 8840 ; WX 838 ; N uni2288 ; G 3347\nU 8841 ; WX 838 ; N uni2289 ; G 3348\nU 8842 ; WX 838 ; N uni228A ; G 3349\nU 8843 ; WX 838 ; N uni228B ; G 3350\nU 8844 ; WX 732 ; N uni228C ; G 3351\nU 8845 ; WX 732 ; N uni228D ; G 3352\nU 8846 ; WX 732 ; N uni228E ; G 3353\nU 8847 ; WX 838 ; N uni228F ; G 3354\nU 8848 ; WX 838 ; N uni2290 ; G 3355\nU 8849 ; WX 838 ; N uni2291 ; G 3356\nU 8850 ; WX 838 ; N uni2292 ; G 3357\nU 8851 ; WX 780 ; N uni2293 ; G 3358\nU 8852 ; WX 780 ; N uni2294 ; G 3359\nU 8853 ; WX 838 ; N circleplus ; G 3360\nU 8854 ; WX 838 ; N uni2296 ; G 3361\nU 8855 ; WX 838 ; N circlemultiply ; G 3362\nU 8856 ; WX 838 ; N uni2298 ; G 3363\nU 8857 ; WX 838 ; N uni2299 ; G 3364\nU 8858 ; WX 838 ; N uni229A ; G 3365\nU 8859 ; WX 838 ; N uni229B ; G 3366\nU 8860 ; WX 838 ; N uni229C ; G 3367\nU 8861 ; WX 838 ; N uni229D ; G 3368\nU 8862 ; WX 838 ; N uni229E ; G 3369\nU 8863 ; WX 838 ; N uni229F ; G 3370\nU 8864 ; WX 838 ; N uni22A0 ; G 3371\nU 8865 ; WX 838 ; N uni22A1 ; G 3372\nU 8866 ; WX 871 ; N uni22A2 ; G 3373\nU 8867 ; WX 871 ; N uni22A3 ; G 3374\nU 8868 ; WX 871 ; N uni22A4 ; G 3375\nU 8869 ; WX 871 ; N perpendicular ; G 3376\nU 8870 ; WX 521 ; N uni22A6 ; G 3377\nU 8871 ; WX 521 ; N uni22A7 ; G 3378\nU 8872 ; WX 871 ; N uni22A8 ; G 3379\nU 8873 ; WX 871 ; N uni22A9 ; G 3380\nU 8874 ; WX 871 ; N uni22AA ; G 3381\nU 8875 ; WX 871 ; N uni22AB ; G 3382\nU 8876 ; WX 871 ; N uni22AC ; G 3383\nU 8877 ; WX 871 ; N uni22AD ; G 3384\nU 8878 ; WX 871 ; N uni22AE ; G 3385\nU 8879 ; WX 871 ; N uni22AF ; G 3386\nU 8880 ; WX 838 ; N uni22B0 ; G 3387\nU 8881 ; WX 838 ; N uni22B1 ; G 3388\nU 8882 ; WX 838 ; N uni22B2 ; G 3389\nU 8883 ; WX 838 ; N uni22B3 ; G 3390\nU 8884 ; WX 838 ; N uni22B4 ; G 3391\nU 8885 ; WX 838 ; N uni22B5 ; G 3392\nU 8886 ; WX 1000 ; N uni22B6 ; G 3393\nU 8887 ; WX 1000 ; N uni22B7 ; G 3394\nU 8888 ; WX 838 ; N uni22B8 ; G 3395\nU 8889 ; WX 838 ; N uni22B9 ; G 3396\nU 8890 ; WX 521 ; N uni22BA ; G 3397\nU 8891 ; WX 732 ; N uni22BB ; G 3398\nU 8892 ; WX 732 ; N uni22BC ; G 3399\nU 8893 ; WX 732 ; N uni22BD ; G 3400\nU 8894 ; WX 838 ; N uni22BE ; G 3401\nU 8895 ; WX 838 ; N uni22BF ; G 3402\nU 8896 ; WX 820 ; N uni22C0 ; G 3403\nU 8897 ; WX 820 ; N uni22C1 ; G 3404\nU 8898 ; WX 820 ; N uni22C2 ; G 3405\nU 8899 ; WX 820 ; N uni22C3 ; G 3406\nU 8900 ; WX 626 ; N uni22C4 ; G 3407\nU 8901 ; WX 318 ; N dotmath ; G 3408\nU 8902 ; WX 626 ; N uni22C6 ; G 3409\nU 8903 ; WX 838 ; N uni22C7 ; G 3410\nU 8904 ; WX 1000 ; N uni22C8 ; G 3411\nU 8905 ; WX 1000 ; N uni22C9 ; G 3412\nU 8906 ; WX 1000 ; N uni22CA ; G 3413\nU 8907 ; WX 1000 ; N uni22CB ; G 3414\nU 8908 ; WX 1000 ; N uni22CC ; G 3415\nU 8909 ; WX 838 ; N uni22CD ; G 3416\nU 8910 ; WX 732 ; N uni22CE ; G 3417\nU 8911 ; WX 732 ; N uni22CF ; G 3418\nU 8912 ; WX 838 ; N uni22D0 ; G 3419\nU 8913 ; WX 838 ; N uni22D1 ; G 3420\nU 8914 ; WX 838 ; N uni22D2 ; G 3421\nU 8915 ; WX 838 ; N uni22D3 ; G 3422\nU 8916 ; WX 838 ; N uni22D4 ; G 3423\nU 8917 ; WX 838 ; N uni22D5 ; G 3424\nU 8918 ; WX 838 ; N uni22D6 ; G 3425\nU 8919 ; WX 838 ; N uni22D7 ; G 3426\nU 8920 ; WX 1422 ; N uni22D8 ; G 3427\nU 8921 ; WX 1422 ; N uni22D9 ; G 3428\nU 8922 ; WX 838 ; N uni22DA ; G 3429\nU 8923 ; WX 838 ; N uni22DB ; G 3430\nU 8924 ; WX 838 ; N uni22DC ; G 3431\nU 8925 ; WX 838 ; N uni22DD ; G 3432\nU 8926 ; WX 838 ; N uni22DE ; G 3433\nU 8927 ; WX 838 ; N uni22DF ; G 3434\nU 8928 ; WX 838 ; N uni22E0 ; G 3435\nU 8929 ; WX 838 ; N uni22E1 ; G 3436\nU 8930 ; WX 838 ; N uni22E2 ; G 3437\nU 8931 ; WX 838 ; N uni22E3 ; G 3438\nU 8932 ; WX 838 ; N uni22E4 ; G 3439\nU 8933 ; WX 838 ; N uni22E5 ; G 3440\nU 8934 ; WX 838 ; N uni22E6 ; G 3441\nU 8935 ; WX 838 ; N uni22E7 ; G 3442\nU 8936 ; WX 838 ; N uni22E8 ; G 3443\nU 8937 ; WX 838 ; N uni22E9 ; G 3444\nU 8938 ; WX 838 ; N uni22EA ; G 3445\nU 8939 ; WX 838 ; N uni22EB ; G 3446\nU 8940 ; WX 838 ; N uni22EC ; G 3447\nU 8941 ; WX 838 ; N uni22ED ; G 3448\nU 8942 ; WX 1000 ; N uni22EE ; G 3449\nU 8943 ; WX 1000 ; N uni22EF ; G 3450\nU 8944 ; WX 1000 ; N uni22F0 ; G 3451\nU 8945 ; WX 1000 ; N uni22F1 ; G 3452\nU 8946 ; WX 1000 ; N uni22F2 ; G 3453\nU 8947 ; WX 871 ; N uni22F3 ; G 3454\nU 8948 ; WX 718 ; N uni22F4 ; G 3455\nU 8949 ; WX 871 ; N uni22F5 ; G 3456\nU 8950 ; WX 871 ; N uni22F6 ; G 3457\nU 8951 ; WX 718 ; N uni22F7 ; G 3458\nU 8952 ; WX 871 ; N uni22F8 ; G 3459\nU 8953 ; WX 871 ; N uni22F9 ; G 3460\nU 8954 ; WX 1000 ; N uni22FA ; G 3461\nU 8955 ; WX 871 ; N uni22FB ; G 3462\nU 8956 ; WX 718 ; N uni22FC ; G 3463\nU 8957 ; WX 871 ; N uni22FD ; G 3464\nU 8958 ; WX 718 ; N uni22FE ; G 3465\nU 8959 ; WX 871 ; N uni22FF ; G 3466\nU 8960 ; WX 602 ; N uni2300 ; G 3467\nU 8961 ; WX 602 ; N uni2301 ; G 3468\nU 8962 ; WX 635 ; N house ; G 3469\nU 8963 ; WX 838 ; N uni2303 ; G 3470\nU 8964 ; WX 838 ; N uni2304 ; G 3471\nU 8965 ; WX 838 ; N uni2305 ; G 3472\nU 8966 ; WX 838 ; N uni2306 ; G 3473\nU 8967 ; WX 488 ; N uni2307 ; G 3474\nU 8968 ; WX 390 ; N uni2308 ; G 3475\nU 8969 ; WX 390 ; N uni2309 ; G 3476\nU 8970 ; WX 390 ; N uni230A ; G 3477\nU 8971 ; WX 390 ; N uni230B ; G 3478\nU 8972 ; WX 809 ; N uni230C ; G 3479\nU 8973 ; WX 809 ; N uni230D ; G 3480\nU 8974 ; WX 809 ; N uni230E ; G 3481\nU 8975 ; WX 809 ; N uni230F ; G 3482\nU 8976 ; WX 838 ; N revlogicalnot ; G 3483\nU 8977 ; WX 513 ; N uni2311 ; G 3484\nU 8984 ; WX 1000 ; N uni2318 ; G 3485\nU 8985 ; WX 838 ; N uni2319 ; G 3486\nU 8988 ; WX 469 ; N uni231C ; G 3487\nU 8989 ; WX 469 ; N uni231D ; G 3488\nU 8990 ; WX 469 ; N uni231E ; G 3489\nU 8991 ; WX 469 ; N uni231F ; G 3490\nU 8992 ; WX 521 ; N integraltp ; G 3491\nU 8993 ; WX 521 ; N integralbt ; G 3492\nU 8996 ; WX 1152 ; N uni2324 ; G 3493\nU 8997 ; WX 1152 ; N uni2325 ; G 3494\nU 8998 ; WX 1414 ; N uni2326 ; G 3495\nU 8999 ; WX 1152 ; N uni2327 ; G 3496\nU 9000 ; WX 1443 ; N uni2328 ; G 3497\nU 9003 ; WX 1414 ; N uni232B ; G 3498\nU 9004 ; WX 873 ; N uni232C ; G 3499\nU 9075 ; WX 338 ; N uni2373 ; G 3500\nU 9076 ; WX 635 ; N uni2374 ; G 3501\nU 9077 ; WX 837 ; N uni2375 ; G 3502\nU 9082 ; WX 659 ; N uni237A ; G 3503\nU 9085 ; WX 757 ; N uni237D ; G 3504\nU 9095 ; WX 1152 ; N uni2387 ; G 3505\nU 9108 ; WX 873 ; N uni2394 ; G 3506\nU 9115 ; WX 500 ; N uni239B ; G 3507\nU 9116 ; WX 500 ; N uni239C ; G 3508\nU 9117 ; WX 500 ; N uni239D ; G 3509\nU 9118 ; WX 500 ; N uni239E ; G 3510\nU 9119 ; WX 500 ; N uni239F ; G 3511\nU 9120 ; WX 500 ; N uni23A0 ; G 3512\nU 9121 ; WX 500 ; N uni23A1 ; G 3513\nU 9122 ; WX 500 ; N uni23A2 ; G 3514\nU 9123 ; WX 500 ; N uni23A3 ; G 3515\nU 9124 ; WX 500 ; N uni23A4 ; G 3516\nU 9125 ; WX 500 ; N uni23A5 ; G 3517\nU 9126 ; WX 500 ; N uni23A6 ; G 3518\nU 9127 ; WX 750 ; N uni23A7 ; G 3519\nU 9128 ; WX 750 ; N uni23A8 ; G 3520\nU 9129 ; WX 750 ; N uni23A9 ; G 3521\nU 9130 ; WX 750 ; N uni23AA ; G 3522\nU 9131 ; WX 750 ; N uni23AB ; G 3523\nU 9132 ; WX 750 ; N uni23AC ; G 3524\nU 9133 ; WX 750 ; N uni23AD ; G 3525\nU 9134 ; WX 521 ; N uni23AE ; G 3526\nU 9166 ; WX 838 ; N uni23CE ; G 3527\nU 9167 ; WX 945 ; N uni23CF ; G 3528\nU 9187 ; WX 873 ; N uni23E3 ; G 3529\nU 9189 ; WX 769 ; N uni23E5 ; G 3530\nU 9192 ; WX 636 ; N uni23E8 ; G 3531\nU 9250 ; WX 635 ; N uni2422 ; G 3532\nU 9251 ; WX 635 ; N uni2423 ; G 3533\nU 9312 ; WX 896 ; N uni2460 ; G 3534\nU 9313 ; WX 896 ; N uni2461 ; G 3535\nU 9314 ; WX 896 ; N uni2462 ; G 3536\nU 9315 ; WX 896 ; N uni2463 ; G 3537\nU 9316 ; WX 896 ; N uni2464 ; G 3538\nU 9317 ; WX 896 ; N uni2465 ; G 3539\nU 9318 ; WX 896 ; N uni2466 ; G 3540\nU 9319 ; WX 896 ; N uni2467 ; G 3541\nU 9320 ; WX 896 ; N uni2468 ; G 3542\nU 9321 ; WX 896 ; N uni2469 ; G 3543\nU 9472 ; WX 602 ; N SF100000 ; G 3544\nU 9473 ; WX 602 ; N uni2501 ; G 3545\nU 9474 ; WX 602 ; N SF110000 ; G 3546\nU 9475 ; WX 602 ; N uni2503 ; G 3547\nU 9476 ; WX 602 ; N uni2504 ; G 3548\nU 9477 ; WX 602 ; N uni2505 ; G 3549\nU 9478 ; WX 602 ; N uni2506 ; G 3550\nU 9479 ; WX 602 ; N uni2507 ; G 3551\nU 9480 ; WX 602 ; N uni2508 ; G 3552\nU 9481 ; WX 602 ; N uni2509 ; G 3553\nU 9482 ; WX 602 ; N uni250A ; G 3554\nU 9483 ; WX 602 ; N uni250B ; G 3555\nU 9484 ; WX 602 ; N SF010000 ; G 3556\nU 9485 ; WX 602 ; N uni250D ; G 3557\nU 9486 ; WX 602 ; N uni250E ; G 3558\nU 9487 ; WX 602 ; N uni250F ; G 3559\nU 9488 ; WX 602 ; N SF030000 ; G 3560\nU 9489 ; WX 602 ; N uni2511 ; G 3561\nU 9490 ; WX 602 ; N uni2512 ; G 3562\nU 9491 ; WX 602 ; N uni2513 ; G 3563\nU 9492 ; WX 602 ; N SF020000 ; G 3564\nU 9493 ; WX 602 ; N uni2515 ; G 3565\nU 9494 ; WX 602 ; N uni2516 ; G 3566\nU 9495 ; WX 602 ; N uni2517 ; G 3567\nU 9496 ; WX 602 ; N SF040000 ; G 3568\nU 9497 ; WX 602 ; N uni2519 ; G 3569\nU 9498 ; WX 602 ; N uni251A ; G 3570\nU 9499 ; WX 602 ; N uni251B ; G 3571\nU 9500 ; WX 602 ; N SF080000 ; G 3572\nU 9501 ; WX 602 ; N uni251D ; G 3573\nU 9502 ; WX 602 ; N uni251E ; G 3574\nU 9503 ; WX 602 ; N uni251F ; G 3575\nU 9504 ; WX 602 ; N uni2520 ; G 3576\nU 9505 ; WX 602 ; N uni2521 ; G 3577\nU 9506 ; WX 602 ; N uni2522 ; G 3578\nU 9507 ; WX 602 ; N uni2523 ; G 3579\nU 9508 ; WX 602 ; N SF090000 ; G 3580\nU 9509 ; WX 602 ; N uni2525 ; G 3581\nU 9510 ; WX 602 ; N uni2526 ; G 3582\nU 9511 ; WX 602 ; N uni2527 ; G 3583\nU 9512 ; WX 602 ; N uni2528 ; G 3584\nU 9513 ; WX 602 ; N uni2529 ; G 3585\nU 9514 ; WX 602 ; N uni252A ; G 3586\nU 9515 ; WX 602 ; N uni252B ; G 3587\nU 9516 ; WX 602 ; N SF060000 ; G 3588\nU 9517 ; WX 602 ; N uni252D ; G 3589\nU 9518 ; WX 602 ; N uni252E ; G 3590\nU 9519 ; WX 602 ; N uni252F ; G 3591\nU 9520 ; WX 602 ; N uni2530 ; G 3592\nU 9521 ; WX 602 ; N uni2531 ; G 3593\nU 9522 ; WX 602 ; N uni2532 ; G 3594\nU 9523 ; WX 602 ; N uni2533 ; G 3595\nU 9524 ; WX 602 ; N SF070000 ; G 3596\nU 9525 ; WX 602 ; N uni2535 ; G 3597\nU 9526 ; WX 602 ; N uni2536 ; G 3598\nU 9527 ; WX 602 ; N uni2537 ; G 3599\nU 9528 ; WX 602 ; N uni2538 ; G 3600\nU 9529 ; WX 602 ; N uni2539 ; G 3601\nU 9530 ; WX 602 ; N uni253A ; G 3602\nU 9531 ; WX 602 ; N uni253B ; G 3603\nU 9532 ; WX 602 ; N SF050000 ; G 3604\nU 9533 ; WX 602 ; N uni253D ; G 3605\nU 9534 ; WX 602 ; N uni253E ; G 3606\nU 9535 ; WX 602 ; N uni253F ; G 3607\nU 9536 ; WX 602 ; N uni2540 ; G 3608\nU 9537 ; WX 602 ; N uni2541 ; G 3609\nU 9538 ; WX 602 ; N uni2542 ; G 3610\nU 9539 ; WX 602 ; N uni2543 ; G 3611\nU 9540 ; WX 602 ; N uni2544 ; G 3612\nU 9541 ; WX 602 ; N uni2545 ; G 3613\nU 9542 ; WX 602 ; N uni2546 ; G 3614\nU 9543 ; WX 602 ; N uni2547 ; G 3615\nU 9544 ; WX 602 ; N uni2548 ; G 3616\nU 9545 ; WX 602 ; N uni2549 ; G 3617\nU 9546 ; WX 602 ; N uni254A ; G 3618\nU 9547 ; WX 602 ; N uni254B ; G 3619\nU 9548 ; WX 602 ; N uni254C ; G 3620\nU 9549 ; WX 602 ; N uni254D ; G 3621\nU 9550 ; WX 602 ; N uni254E ; G 3622\nU 9551 ; WX 602 ; N uni254F ; G 3623\nU 9552 ; WX 602 ; N SF430000 ; G 3624\nU 9553 ; WX 602 ; N SF240000 ; G 3625\nU 9554 ; WX 602 ; N SF510000 ; G 3626\nU 9555 ; WX 602 ; N SF520000 ; G 3627\nU 9556 ; WX 602 ; N SF390000 ; G 3628\nU 9557 ; WX 602 ; N SF220000 ; G 3629\nU 9558 ; WX 602 ; N SF210000 ; G 3630\nU 9559 ; WX 602 ; N SF250000 ; G 3631\nU 9560 ; WX 602 ; N SF500000 ; G 3632\nU 9561 ; WX 602 ; N SF490000 ; G 3633\nU 9562 ; WX 602 ; N SF380000 ; G 3634\nU 9563 ; WX 602 ; N SF280000 ; G 3635\nU 9564 ; WX 602 ; N SF270000 ; G 3636\nU 9565 ; WX 602 ; N SF260000 ; G 3637\nU 9566 ; WX 602 ; N SF360000 ; G 3638\nU 9567 ; WX 602 ; N SF370000 ; G 3639\nU 9568 ; WX 602 ; N SF420000 ; G 3640\nU 9569 ; WX 602 ; N SF190000 ; G 3641\nU 9570 ; WX 602 ; N SF200000 ; G 3642\nU 9571 ; WX 602 ; N SF230000 ; G 3643\nU 9572 ; WX 602 ; N SF470000 ; G 3644\nU 9573 ; WX 602 ; N SF480000 ; G 3645\nU 9574 ; WX 602 ; N SF410000 ; G 3646\nU 9575 ; WX 602 ; N SF450000 ; G 3647\nU 9576 ; WX 602 ; N SF460000 ; G 3648\nU 9577 ; WX 602 ; N SF400000 ; G 3649\nU 9578 ; WX 602 ; N SF540000 ; G 3650\nU 9579 ; WX 602 ; N SF530000 ; G 3651\nU 9580 ; WX 602 ; N SF440000 ; G 3652\nU 9581 ; WX 602 ; N uni256D ; G 3653\nU 9582 ; WX 602 ; N uni256E ; G 3654\nU 9583 ; WX 602 ; N uni256F ; G 3655\nU 9584 ; WX 602 ; N uni2570 ; G 3656\nU 9585 ; WX 602 ; N uni2571 ; G 3657\nU 9586 ; WX 602 ; N uni2572 ; G 3658\nU 9587 ; WX 602 ; N uni2573 ; G 3659\nU 9588 ; WX 602 ; N uni2574 ; G 3660\nU 9589 ; WX 602 ; N uni2575 ; G 3661\nU 9590 ; WX 602 ; N uni2576 ; G 3662\nU 9591 ; WX 602 ; N uni2577 ; G 3663\nU 9592 ; WX 602 ; N uni2578 ; G 3664\nU 9593 ; WX 602 ; N uni2579 ; G 3665\nU 9594 ; WX 602 ; N uni257A ; G 3666\nU 9595 ; WX 602 ; N uni257B ; G 3667\nU 9596 ; WX 602 ; N uni257C ; G 3668\nU 9597 ; WX 602 ; N uni257D ; G 3669\nU 9598 ; WX 602 ; N uni257E ; G 3670\nU 9599 ; WX 602 ; N uni257F ; G 3671\nU 9600 ; WX 769 ; N upblock ; G 3672\nU 9601 ; WX 769 ; N uni2581 ; G 3673\nU 9602 ; WX 769 ; N uni2582 ; G 3674\nU 9603 ; WX 769 ; N uni2583 ; G 3675\nU 9604 ; WX 769 ; N dnblock ; G 3676\nU 9605 ; WX 769 ; N uni2585 ; G 3677\nU 9606 ; WX 769 ; N uni2586 ; G 3678\nU 9607 ; WX 769 ; N uni2587 ; G 3679\nU 9608 ; WX 769 ; N block ; G 3680\nU 9609 ; WX 769 ; N uni2589 ; G 3681\nU 9610 ; WX 769 ; N uni258A ; G 3682\nU 9611 ; WX 769 ; N uni258B ; G 3683\nU 9612 ; WX 769 ; N lfblock ; G 3684\nU 9613 ; WX 769 ; N uni258D ; G 3685\nU 9614 ; WX 769 ; N uni258E ; G 3686\nU 9615 ; WX 769 ; N uni258F ; G 3687\nU 9616 ; WX 769 ; N rtblock ; G 3688\nU 9617 ; WX 769 ; N ltshade ; G 3689\nU 9618 ; WX 769 ; N shade ; G 3690\nU 9619 ; WX 769 ; N dkshade ; G 3691\nU 9620 ; WX 769 ; N uni2594 ; G 3692\nU 9621 ; WX 769 ; N uni2595 ; G 3693\nU 9622 ; WX 769 ; N uni2596 ; G 3694\nU 9623 ; WX 769 ; N uni2597 ; G 3695\nU 9624 ; WX 769 ; N uni2598 ; G 3696\nU 9625 ; WX 769 ; N uni2599 ; G 3697\nU 9626 ; WX 769 ; N uni259A ; G 3698\nU 9627 ; WX 769 ; N uni259B ; G 3699\nU 9628 ; WX 769 ; N uni259C ; G 3700\nU 9629 ; WX 769 ; N uni259D ; G 3701\nU 9630 ; WX 769 ; N uni259E ; G 3702\nU 9631 ; WX 769 ; N uni259F ; G 3703\nU 9632 ; WX 945 ; N filledbox ; G 3704\nU 9633 ; WX 945 ; N H22073 ; G 3705\nU 9634 ; WX 945 ; N uni25A2 ; G 3706\nU 9635 ; WX 945 ; N uni25A3 ; G 3707\nU 9636 ; WX 945 ; N uni25A4 ; G 3708\nU 9637 ; WX 945 ; N uni25A5 ; G 3709\nU 9638 ; WX 945 ; N uni25A6 ; G 3710\nU 9639 ; WX 945 ; N uni25A7 ; G 3711\nU 9640 ; WX 945 ; N uni25A8 ; G 3712\nU 9641 ; WX 945 ; N uni25A9 ; G 3713\nU 9642 ; WX 678 ; N H18543 ; G 3714\nU 9643 ; WX 678 ; N H18551 ; G 3715\nU 9644 ; WX 945 ; N filledrect ; G 3716\nU 9645 ; WX 945 ; N uni25AD ; G 3717\nU 9646 ; WX 550 ; N uni25AE ; G 3718\nU 9647 ; WX 550 ; N uni25AF ; G 3719\nU 9648 ; WX 769 ; N uni25B0 ; G 3720\nU 9649 ; WX 769 ; N uni25B1 ; G 3721\nU 9650 ; WX 769 ; N triagup ; G 3722\nU 9651 ; WX 769 ; N uni25B3 ; G 3723\nU 9652 ; WX 502 ; N uni25B4 ; G 3724\nU 9653 ; WX 502 ; N uni25B5 ; G 3725\nU 9654 ; WX 769 ; N uni25B6 ; G 3726\nU 9655 ; WX 769 ; N uni25B7 ; G 3727\nU 9656 ; WX 502 ; N uni25B8 ; G 3728\nU 9657 ; WX 502 ; N uni25B9 ; G 3729\nU 9658 ; WX 769 ; N triagrt ; G 3730\nU 9659 ; WX 769 ; N uni25BB ; G 3731\nU 9660 ; WX 769 ; N triagdn ; G 3732\nU 9661 ; WX 769 ; N uni25BD ; G 3733\nU 9662 ; WX 502 ; N uni25BE ; G 3734\nU 9663 ; WX 502 ; N uni25BF ; G 3735\nU 9664 ; WX 769 ; N uni25C0 ; G 3736\nU 9665 ; WX 769 ; N uni25C1 ; G 3737\nU 9666 ; WX 502 ; N uni25C2 ; G 3738\nU 9667 ; WX 502 ; N uni25C3 ; G 3739\nU 9668 ; WX 769 ; N triaglf ; G 3740\nU 9669 ; WX 769 ; N uni25C5 ; G 3741\nU 9670 ; WX 769 ; N uni25C6 ; G 3742\nU 9671 ; WX 769 ; N uni25C7 ; G 3743\nU 9672 ; WX 769 ; N uni25C8 ; G 3744\nU 9673 ; WX 873 ; N uni25C9 ; G 3745\nU 9674 ; WX 494 ; N lozenge ; G 3746\nU 9675 ; WX 873 ; N circle ; G 3747\nU 9676 ; WX 873 ; N uni25CC ; G 3748\nU 9677 ; WX 873 ; N uni25CD ; G 3749\nU 9678 ; WX 873 ; N uni25CE ; G 3750\nU 9679 ; WX 873 ; N H18533 ; G 3751\nU 9680 ; WX 873 ; N uni25D0 ; G 3752\nU 9681 ; WX 873 ; N uni25D1 ; G 3753\nU 9682 ; WX 873 ; N uni25D2 ; G 3754\nU 9683 ; WX 873 ; N uni25D3 ; G 3755\nU 9684 ; WX 873 ; N uni25D4 ; G 3756\nU 9685 ; WX 873 ; N uni25D5 ; G 3757\nU 9686 ; WX 527 ; N uni25D6 ; G 3758\nU 9687 ; WX 527 ; N uni25D7 ; G 3759\nU 9688 ; WX 791 ; N invbullet ; G 3760\nU 9689 ; WX 970 ; N invcircle ; G 3761\nU 9690 ; WX 970 ; N uni25DA ; G 3762\nU 9691 ; WX 970 ; N uni25DB ; G 3763\nU 9692 ; WX 387 ; N uni25DC ; G 3764\nU 9693 ; WX 387 ; N uni25DD ; G 3765\nU 9694 ; WX 387 ; N uni25DE ; G 3766\nU 9695 ; WX 387 ; N uni25DF ; G 3767\nU 9696 ; WX 873 ; N uni25E0 ; G 3768\nU 9697 ; WX 873 ; N uni25E1 ; G 3769\nU 9698 ; WX 769 ; N uni25E2 ; G 3770\nU 9699 ; WX 769 ; N uni25E3 ; G 3771\nU 9700 ; WX 769 ; N uni25E4 ; G 3772\nU 9701 ; WX 769 ; N uni25E5 ; G 3773\nU 9702 ; WX 590 ; N openbullet ; G 3774\nU 9703 ; WX 945 ; N uni25E7 ; G 3775\nU 9704 ; WX 945 ; N uni25E8 ; G 3776\nU 9705 ; WX 945 ; N uni25E9 ; G 3777\nU 9706 ; WX 945 ; N uni25EA ; G 3778\nU 9707 ; WX 945 ; N uni25EB ; G 3779\nU 9708 ; WX 769 ; N uni25EC ; G 3780\nU 9709 ; WX 769 ; N uni25ED ; G 3781\nU 9710 ; WX 769 ; N uni25EE ; G 3782\nU 9711 ; WX 1119 ; N uni25EF ; G 3783\nU 9712 ; WX 945 ; N uni25F0 ; G 3784\nU 9713 ; WX 945 ; N uni25F1 ; G 3785\nU 9714 ; WX 945 ; N uni25F2 ; G 3786\nU 9715 ; WX 945 ; N uni25F3 ; G 3787\nU 9716 ; WX 873 ; N uni25F4 ; G 3788\nU 9717 ; WX 873 ; N uni25F5 ; G 3789\nU 9718 ; WX 873 ; N uni25F6 ; G 3790\nU 9719 ; WX 873 ; N uni25F7 ; G 3791\nU 9720 ; WX 769 ; N uni25F8 ; G 3792\nU 9721 ; WX 769 ; N uni25F9 ; G 3793\nU 9722 ; WX 769 ; N uni25FA ; G 3794\nU 9723 ; WX 830 ; N uni25FB ; G 3795\nU 9724 ; WX 830 ; N uni25FC ; G 3796\nU 9725 ; WX 732 ; N uni25FD ; G 3797\nU 9726 ; WX 732 ; N uni25FE ; G 3798\nU 9727 ; WX 769 ; N uni25FF ; G 3799\nU 9728 ; WX 896 ; N uni2600 ; G 3800\nU 9729 ; WX 1000 ; N uni2601 ; G 3801\nU 9730 ; WX 896 ; N uni2602 ; G 3802\nU 9731 ; WX 896 ; N uni2603 ; G 3803\nU 9732 ; WX 896 ; N uni2604 ; G 3804\nU 9733 ; WX 896 ; N uni2605 ; G 3805\nU 9734 ; WX 896 ; N uni2606 ; G 3806\nU 9735 ; WX 573 ; N uni2607 ; G 3807\nU 9736 ; WX 896 ; N uni2608 ; G 3808\nU 9737 ; WX 896 ; N uni2609 ; G 3809\nU 9738 ; WX 888 ; N uni260A ; G 3810\nU 9739 ; WX 888 ; N uni260B ; G 3811\nU 9740 ; WX 671 ; N uni260C ; G 3812\nU 9741 ; WX 1013 ; N uni260D ; G 3813\nU 9742 ; WX 1246 ; N uni260E ; G 3814\nU 9743 ; WX 1250 ; N uni260F ; G 3815\nU 9744 ; WX 896 ; N uni2610 ; G 3816\nU 9745 ; WX 896 ; N uni2611 ; G 3817\nU 9746 ; WX 896 ; N uni2612 ; G 3818\nU 9747 ; WX 532 ; N uni2613 ; G 3819\nU 9748 ; WX 896 ; N uni2614 ; G 3820\nU 9749 ; WX 896 ; N uni2615 ; G 3821\nU 9750 ; WX 896 ; N uni2616 ; G 3822\nU 9751 ; WX 896 ; N uni2617 ; G 3823\nU 9752 ; WX 896 ; N uni2618 ; G 3824\nU 9753 ; WX 896 ; N uni2619 ; G 3825\nU 9754 ; WX 896 ; N uni261A ; G 3826\nU 9755 ; WX 896 ; N uni261B ; G 3827\nU 9756 ; WX 896 ; N uni261C ; G 3828\nU 9757 ; WX 609 ; N uni261D ; G 3829\nU 9758 ; WX 896 ; N uni261E ; G 3830\nU 9759 ; WX 609 ; N uni261F ; G 3831\nU 9760 ; WX 896 ; N uni2620 ; G 3832\nU 9761 ; WX 896 ; N uni2621 ; G 3833\nU 9762 ; WX 896 ; N uni2622 ; G 3834\nU 9763 ; WX 896 ; N uni2623 ; G 3835\nU 9764 ; WX 669 ; N uni2624 ; G 3836\nU 9765 ; WX 746 ; N uni2625 ; G 3837\nU 9766 ; WX 649 ; N uni2626 ; G 3838\nU 9767 ; WX 784 ; N uni2627 ; G 3839\nU 9768 ; WX 545 ; N uni2628 ; G 3840\nU 9769 ; WX 896 ; N uni2629 ; G 3841\nU 9770 ; WX 896 ; N uni262A ; G 3842\nU 9771 ; WX 896 ; N uni262B ; G 3843\nU 9772 ; WX 710 ; N uni262C ; G 3844\nU 9773 ; WX 896 ; N uni262D ; G 3845\nU 9774 ; WX 896 ; N uni262E ; G 3846\nU 9775 ; WX 896 ; N uni262F ; G 3847\nU 9776 ; WX 896 ; N uni2630 ; G 3848\nU 9777 ; WX 896 ; N uni2631 ; G 3849\nU 9778 ; WX 896 ; N uni2632 ; G 3850\nU 9779 ; WX 896 ; N uni2633 ; G 3851\nU 9780 ; WX 896 ; N uni2634 ; G 3852\nU 9781 ; WX 896 ; N uni2635 ; G 3853\nU 9782 ; WX 896 ; N uni2636 ; G 3854\nU 9783 ; WX 896 ; N uni2637 ; G 3855\nU 9784 ; WX 896 ; N uni2638 ; G 3856\nU 9785 ; WX 1042 ; N uni2639 ; G 3857\nU 9786 ; WX 1042 ; N smileface ; G 3858\nU 9787 ; WX 1042 ; N invsmileface ; G 3859\nU 9788 ; WX 896 ; N sun ; G 3860\nU 9789 ; WX 896 ; N uni263D ; G 3861\nU 9790 ; WX 896 ; N uni263E ; G 3862\nU 9791 ; WX 614 ; N uni263F ; G 3863\nU 9792 ; WX 732 ; N female ; G 3864\nU 9793 ; WX 732 ; N uni2641 ; G 3865\nU 9794 ; WX 896 ; N male ; G 3866\nU 9795 ; WX 896 ; N uni2643 ; G 3867\nU 9796 ; WX 896 ; N uni2644 ; G 3868\nU 9797 ; WX 896 ; N uni2645 ; G 3869\nU 9798 ; WX 896 ; N uni2646 ; G 3870\nU 9799 ; WX 896 ; N uni2647 ; G 3871\nU 9800 ; WX 896 ; N uni2648 ; G 3872\nU 9801 ; WX 896 ; N uni2649 ; G 3873\nU 9802 ; WX 896 ; N uni264A ; G 3874\nU 9803 ; WX 896 ; N uni264B ; G 3875\nU 9804 ; WX 896 ; N uni264C ; G 3876\nU 9805 ; WX 896 ; N uni264D ; G 3877\nU 9806 ; WX 896 ; N uni264E ; G 3878\nU 9807 ; WX 896 ; N uni264F ; G 3879\nU 9808 ; WX 896 ; N uni2650 ; G 3880\nU 9809 ; WX 896 ; N uni2651 ; G 3881\nU 9810 ; WX 896 ; N uni2652 ; G 3882\nU 9811 ; WX 896 ; N uni2653 ; G 3883\nU 9812 ; WX 896 ; N uni2654 ; G 3884\nU 9813 ; WX 896 ; N uni2655 ; G 3885\nU 9814 ; WX 896 ; N uni2656 ; G 3886\nU 9815 ; WX 896 ; N uni2657 ; G 3887\nU 9816 ; WX 896 ; N uni2658 ; G 3888\nU 9817 ; WX 896 ; N uni2659 ; G 3889\nU 9818 ; WX 896 ; N uni265A ; G 3890\nU 9819 ; WX 896 ; N uni265B ; G 3891\nU 9820 ; WX 896 ; N uni265C ; G 3892\nU 9821 ; WX 896 ; N uni265D ; G 3893\nU 9822 ; WX 896 ; N uni265E ; G 3894\nU 9823 ; WX 896 ; N uni265F ; G 3895\nU 9824 ; WX 896 ; N spade ; G 3896\nU 9825 ; WX 896 ; N uni2661 ; G 3897\nU 9826 ; WX 896 ; N uni2662 ; G 3898\nU 9827 ; WX 896 ; N club ; G 3899\nU 9828 ; WX 896 ; N uni2664 ; G 3900\nU 9829 ; WX 896 ; N heart ; G 3901\nU 9830 ; WX 896 ; N diamond ; G 3902\nU 9831 ; WX 896 ; N uni2667 ; G 3903\nU 9832 ; WX 896 ; N uni2668 ; G 3904\nU 9833 ; WX 472 ; N uni2669 ; G 3905\nU 9834 ; WX 638 ; N musicalnote ; G 3906\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3907\nU 9836 ; WX 896 ; N uni266C ; G 3908\nU 9837 ; WX 472 ; N uni266D ; G 3909\nU 9838 ; WX 357 ; N uni266E ; G 3910\nU 9839 ; WX 484 ; N uni266F ; G 3911\nU 9840 ; WX 748 ; N uni2670 ; G 3912\nU 9841 ; WX 766 ; N uni2671 ; G 3913\nU 9842 ; WX 896 ; N uni2672 ; G 3914\nU 9843 ; WX 896 ; N uni2673 ; G 3915\nU 9844 ; WX 896 ; N uni2674 ; G 3916\nU 9845 ; WX 896 ; N uni2675 ; G 3917\nU 9846 ; WX 896 ; N uni2676 ; G 3918\nU 9847 ; WX 896 ; N uni2677 ; G 3919\nU 9848 ; WX 896 ; N uni2678 ; G 3920\nU 9849 ; WX 896 ; N uni2679 ; G 3921\nU 9850 ; WX 896 ; N uni267A ; G 3922\nU 9851 ; WX 896 ; N uni267B ; G 3923\nU 9852 ; WX 896 ; N uni267C ; G 3924\nU 9853 ; WX 896 ; N uni267D ; G 3925\nU 9854 ; WX 896 ; N uni267E ; G 3926\nU 9855 ; WX 896 ; N uni267F ; G 3927\nU 9856 ; WX 869 ; N uni2680 ; G 3928\nU 9857 ; WX 869 ; N uni2681 ; G 3929\nU 9858 ; WX 869 ; N uni2682 ; G 3930\nU 9859 ; WX 869 ; N uni2683 ; G 3931\nU 9860 ; WX 869 ; N uni2684 ; G 3932\nU 9861 ; WX 869 ; N uni2685 ; G 3933\nU 9862 ; WX 896 ; N uni2686 ; G 3934\nU 9863 ; WX 896 ; N uni2687 ; G 3935\nU 9864 ; WX 896 ; N uni2688 ; G 3936\nU 9865 ; WX 896 ; N uni2689 ; G 3937\nU 9866 ; WX 896 ; N uni268A ; G 3938\nU 9867 ; WX 896 ; N uni268B ; G 3939\nU 9868 ; WX 896 ; N uni268C ; G 3940\nU 9869 ; WX 896 ; N uni268D ; G 3941\nU 9870 ; WX 896 ; N uni268E ; G 3942\nU 9871 ; WX 896 ; N uni268F ; G 3943\nU 9872 ; WX 896 ; N uni2690 ; G 3944\nU 9873 ; WX 896 ; N uni2691 ; G 3945\nU 9874 ; WX 896 ; N uni2692 ; G 3946\nU 9875 ; WX 896 ; N uni2693 ; G 3947\nU 9876 ; WX 896 ; N uni2694 ; G 3948\nU 9877 ; WX 541 ; N uni2695 ; G 3949\nU 9878 ; WX 896 ; N uni2696 ; G 3950\nU 9879 ; WX 896 ; N uni2697 ; G 3951\nU 9880 ; WX 896 ; N uni2698 ; G 3952\nU 9881 ; WX 896 ; N uni2699 ; G 3953\nU 9882 ; WX 896 ; N uni269A ; G 3954\nU 9883 ; WX 896 ; N uni269B ; G 3955\nU 9884 ; WX 896 ; N uni269C ; G 3956\nU 9886 ; WX 896 ; N uni269E ; G 3957\nU 9887 ; WX 896 ; N uni269F ; G 3958\nU 9888 ; WX 896 ; N uni26A0 ; G 3959\nU 9889 ; WX 702 ; N uni26A1 ; G 3960\nU 9890 ; WX 1004 ; N uni26A2 ; G 3961\nU 9891 ; WX 1089 ; N uni26A3 ; G 3962\nU 9892 ; WX 1175 ; N uni26A4 ; G 3963\nU 9893 ; WX 903 ; N uni26A5 ; G 3964\nU 9894 ; WX 838 ; N uni26A6 ; G 3965\nU 9895 ; WX 838 ; N uni26A7 ; G 3966\nU 9896 ; WX 838 ; N uni26A8 ; G 3967\nU 9897 ; WX 838 ; N uni26A9 ; G 3968\nU 9898 ; WX 838 ; N uni26AA ; G 3969\nU 9899 ; WX 838 ; N uni26AB ; G 3970\nU 9900 ; WX 838 ; N uni26AC ; G 3971\nU 9901 ; WX 838 ; N uni26AD ; G 3972\nU 9902 ; WX 838 ; N uni26AE ; G 3973\nU 9903 ; WX 838 ; N uni26AF ; G 3974\nU 9904 ; WX 844 ; N uni26B0 ; G 3975\nU 9905 ; WX 838 ; N uni26B1 ; G 3976\nU 9906 ; WX 732 ; N uni26B2 ; G 3977\nU 9907 ; WX 732 ; N uni26B3 ; G 3978\nU 9908 ; WX 732 ; N uni26B4 ; G 3979\nU 9909 ; WX 732 ; N uni26B5 ; G 3980\nU 9910 ; WX 850 ; N uni26B6 ; G 3981\nU 9911 ; WX 732 ; N uni26B7 ; G 3982\nU 9912 ; WX 732 ; N uni26B8 ; G 3983\nU 9920 ; WX 838 ; N uni26C0 ; G 3984\nU 9921 ; WX 838 ; N uni26C1 ; G 3985\nU 9922 ; WX 838 ; N uni26C2 ; G 3986\nU 9923 ; WX 838 ; N uni26C3 ; G 3987\nU 9954 ; WX 732 ; N uni26E2 ; G 3988\nU 9985 ; WX 838 ; N uni2701 ; G 3989\nU 9986 ; WX 838 ; N uni2702 ; G 3990\nU 9987 ; WX 838 ; N uni2703 ; G 3991\nU 9988 ; WX 838 ; N uni2704 ; G 3992\nU 9990 ; WX 838 ; N uni2706 ; G 3993\nU 9991 ; WX 838 ; N uni2707 ; G 3994\nU 9992 ; WX 838 ; N uni2708 ; G 3995\nU 9993 ; WX 838 ; N uni2709 ; G 3996\nU 9996 ; WX 838 ; N uni270C ; G 3997\nU 9997 ; WX 838 ; N uni270D ; G 3998\nU 9998 ; WX 838 ; N uni270E ; G 3999\nU 9999 ; WX 838 ; N uni270F ; G 4000\nU 10000 ; WX 838 ; N uni2710 ; G 4001\nU 10001 ; WX 838 ; N uni2711 ; G 4002\nU 10002 ; WX 838 ; N uni2712 ; G 4003\nU 10003 ; WX 838 ; N uni2713 ; G 4004\nU 10004 ; WX 838 ; N uni2714 ; G 4005\nU 10005 ; WX 838 ; N uni2715 ; G 4006\nU 10006 ; WX 838 ; N uni2716 ; G 4007\nU 10007 ; WX 838 ; N uni2717 ; G 4008\nU 10008 ; WX 838 ; N uni2718 ; G 4009\nU 10009 ; WX 838 ; N uni2719 ; G 4010\nU 10010 ; WX 838 ; N uni271A ; G 4011\nU 10011 ; WX 838 ; N uni271B ; G 4012\nU 10012 ; WX 838 ; N uni271C ; G 4013\nU 10013 ; WX 838 ; N uni271D ; G 4014\nU 10014 ; WX 838 ; N uni271E ; G 4015\nU 10015 ; WX 838 ; N uni271F ; G 4016\nU 10016 ; WX 838 ; N uni2720 ; G 4017\nU 10017 ; WX 838 ; N uni2721 ; G 4018\nU 10018 ; WX 838 ; N uni2722 ; G 4019\nU 10019 ; WX 838 ; N uni2723 ; G 4020\nU 10020 ; WX 838 ; N uni2724 ; G 4021\nU 10021 ; WX 838 ; N uni2725 ; G 4022\nU 10022 ; WX 838 ; N uni2726 ; G 4023\nU 10023 ; WX 838 ; N uni2727 ; G 4024\nU 10025 ; WX 838 ; N uni2729 ; G 4025\nU 10026 ; WX 838 ; N uni272A ; G 4026\nU 10027 ; WX 838 ; N uni272B ; G 4027\nU 10028 ; WX 838 ; N uni272C ; G 4028\nU 10029 ; WX 838 ; N uni272D ; G 4029\nU 10030 ; WX 838 ; N uni272E ; G 4030\nU 10031 ; WX 838 ; N uni272F ; G 4031\nU 10032 ; WX 838 ; N uni2730 ; G 4032\nU 10033 ; WX 838 ; N uni2731 ; G 4033\nU 10034 ; WX 838 ; N uni2732 ; G 4034\nU 10035 ; WX 838 ; N uni2733 ; G 4035\nU 10036 ; WX 838 ; N uni2734 ; G 4036\nU 10037 ; WX 838 ; N uni2735 ; G 4037\nU 10038 ; WX 838 ; N uni2736 ; G 4038\nU 10039 ; WX 838 ; N uni2737 ; G 4039\nU 10040 ; WX 838 ; N uni2738 ; G 4040\nU 10041 ; WX 838 ; N uni2739 ; G 4041\nU 10042 ; WX 838 ; N uni273A ; G 4042\nU 10043 ; WX 838 ; N uni273B ; G 4043\nU 10044 ; WX 838 ; N uni273C ; G 4044\nU 10045 ; WX 838 ; N uni273D ; G 4045\nU 10046 ; WX 838 ; N uni273E ; G 4046\nU 10047 ; WX 838 ; N uni273F ; G 4047\nU 10048 ; WX 838 ; N uni2740 ; G 4048\nU 10049 ; WX 838 ; N uni2741 ; G 4049\nU 10050 ; WX 838 ; N uni2742 ; G 4050\nU 10051 ; WX 838 ; N uni2743 ; G 4051\nU 10052 ; WX 838 ; N uni2744 ; G 4052\nU 10053 ; WX 838 ; N uni2745 ; G 4053\nU 10054 ; WX 838 ; N uni2746 ; G 4054\nU 10055 ; WX 838 ; N uni2747 ; G 4055\nU 10056 ; WX 838 ; N uni2748 ; G 4056\nU 10057 ; WX 838 ; N uni2749 ; G 4057\nU 10058 ; WX 838 ; N uni274A ; G 4058\nU 10059 ; WX 838 ; N uni274B ; G 4059\nU 10061 ; WX 896 ; N uni274D ; G 4060\nU 10063 ; WX 896 ; N uni274F ; G 4061\nU 10064 ; WX 896 ; N uni2750 ; G 4062\nU 10065 ; WX 896 ; N uni2751 ; G 4063\nU 10066 ; WX 896 ; N uni2752 ; G 4064\nU 10070 ; WX 896 ; N uni2756 ; G 4065\nU 10072 ; WX 838 ; N uni2758 ; G 4066\nU 10073 ; WX 838 ; N uni2759 ; G 4067\nU 10074 ; WX 838 ; N uni275A ; G 4068\nU 10075 ; WX 322 ; N uni275B ; G 4069\nU 10076 ; WX 322 ; N uni275C ; G 4070\nU 10077 ; WX 538 ; N uni275D ; G 4071\nU 10078 ; WX 538 ; N uni275E ; G 4072\nU 10081 ; WX 838 ; N uni2761 ; G 4073\nU 10082 ; WX 838 ; N uni2762 ; G 4074\nU 10083 ; WX 838 ; N uni2763 ; G 4075\nU 10084 ; WX 838 ; N uni2764 ; G 4076\nU 10085 ; WX 838 ; N uni2765 ; G 4077\nU 10086 ; WX 838 ; N uni2766 ; G 4078\nU 10087 ; WX 838 ; N uni2767 ; G 4079\nU 10088 ; WX 838 ; N uni2768 ; G 4080\nU 10089 ; WX 838 ; N uni2769 ; G 4081\nU 10090 ; WX 838 ; N uni276A ; G 4082\nU 10091 ; WX 838 ; N uni276B ; G 4083\nU 10092 ; WX 838 ; N uni276C ; G 4084\nU 10093 ; WX 838 ; N uni276D ; G 4085\nU 10094 ; WX 838 ; N uni276E ; G 4086\nU 10095 ; WX 838 ; N uni276F ; G 4087\nU 10096 ; WX 838 ; N uni2770 ; G 4088\nU 10097 ; WX 838 ; N uni2771 ; G 4089\nU 10098 ; WX 838 ; N uni2772 ; G 4090\nU 10099 ; WX 838 ; N uni2773 ; G 4091\nU 10100 ; WX 838 ; N uni2774 ; G 4092\nU 10101 ; WX 838 ; N uni2775 ; G 4093\nU 10102 ; WX 896 ; N uni2776 ; G 4094\nU 10103 ; WX 896 ; N uni2777 ; G 4095\nU 10104 ; WX 896 ; N uni2778 ; G 4096\nU 10105 ; WX 896 ; N uni2779 ; G 4097\nU 10106 ; WX 896 ; N uni277A ; G 4098\nU 10107 ; WX 896 ; N uni277B ; G 4099\nU 10108 ; WX 896 ; N uni277C ; G 4100\nU 10109 ; WX 896 ; N uni277D ; G 4101\nU 10110 ; WX 896 ; N uni277E ; G 4102\nU 10111 ; WX 896 ; N uni277F ; G 4103\nU 10112 ; WX 838 ; N uni2780 ; G 4104\nU 10113 ; WX 838 ; N uni2781 ; G 4105\nU 10114 ; WX 838 ; N uni2782 ; G 4106\nU 10115 ; WX 838 ; N uni2783 ; G 4107\nU 10116 ; WX 838 ; N uni2784 ; G 4108\nU 10117 ; WX 838 ; N uni2785 ; G 4109\nU 10118 ; WX 838 ; N uni2786 ; G 4110\nU 10119 ; WX 838 ; N uni2787 ; G 4111\nU 10120 ; WX 838 ; N uni2788 ; G 4112\nU 10121 ; WX 838 ; N uni2789 ; G 4113\nU 10122 ; WX 838 ; N uni278A ; G 4114\nU 10123 ; WX 838 ; N uni278B ; G 4115\nU 10124 ; WX 838 ; N uni278C ; G 4116\nU 10125 ; WX 838 ; N uni278D ; G 4117\nU 10126 ; WX 838 ; N uni278E ; G 4118\nU 10127 ; WX 838 ; N uni278F ; G 4119\nU 10128 ; WX 838 ; N uni2790 ; G 4120\nU 10129 ; WX 838 ; N uni2791 ; G 4121\nU 10130 ; WX 838 ; N uni2792 ; G 4122\nU 10131 ; WX 838 ; N uni2793 ; G 4123\nU 10132 ; WX 838 ; N uni2794 ; G 4124\nU 10136 ; WX 838 ; N uni2798 ; G 4125\nU 10137 ; WX 838 ; N uni2799 ; G 4126\nU 10138 ; WX 838 ; N uni279A ; G 4127\nU 10139 ; WX 838 ; N uni279B ; G 4128\nU 10140 ; WX 838 ; N uni279C ; G 4129\nU 10141 ; WX 838 ; N uni279D ; G 4130\nU 10142 ; WX 838 ; N uni279E ; G 4131\nU 10143 ; WX 838 ; N uni279F ; G 4132\nU 10144 ; WX 838 ; N uni27A0 ; G 4133\nU 10145 ; WX 838 ; N uni27A1 ; G 4134\nU 10146 ; WX 838 ; N uni27A2 ; G 4135\nU 10147 ; WX 838 ; N uni27A3 ; G 4136\nU 10148 ; WX 838 ; N uni27A4 ; G 4137\nU 10149 ; WX 838 ; N uni27A5 ; G 4138\nU 10150 ; WX 838 ; N uni27A6 ; G 4139\nU 10151 ; WX 838 ; N uni27A7 ; G 4140\nU 10152 ; WX 838 ; N uni27A8 ; G 4141\nU 10153 ; WX 838 ; N uni27A9 ; G 4142\nU 10154 ; WX 838 ; N uni27AA ; G 4143\nU 10155 ; WX 838 ; N uni27AB ; G 4144\nU 10156 ; WX 838 ; N uni27AC ; G 4145\nU 10157 ; WX 838 ; N uni27AD ; G 4146\nU 10158 ; WX 838 ; N uni27AE ; G 4147\nU 10159 ; WX 838 ; N uni27AF ; G 4148\nU 10161 ; WX 838 ; N uni27B1 ; G 4149\nU 10162 ; WX 838 ; N uni27B2 ; G 4150\nU 10163 ; WX 838 ; N uni27B3 ; G 4151\nU 10164 ; WX 838 ; N uni27B4 ; G 4152\nU 10165 ; WX 838 ; N uni27B5 ; G 4153\nU 10166 ; WX 838 ; N uni27B6 ; G 4154\nU 10167 ; WX 838 ; N uni27B7 ; G 4155\nU 10168 ; WX 838 ; N uni27B8 ; G 4156\nU 10169 ; WX 838 ; N uni27B9 ; G 4157\nU 10170 ; WX 838 ; N uni27BA ; G 4158\nU 10171 ; WX 838 ; N uni27BB ; G 4159\nU 10172 ; WX 838 ; N uni27BC ; G 4160\nU 10173 ; WX 838 ; N uni27BD ; G 4161\nU 10174 ; WX 838 ; N uni27BE ; G 4162\nU 10181 ; WX 390 ; N uni27C5 ; G 4163\nU 10182 ; WX 390 ; N uni27C6 ; G 4164\nU 10208 ; WX 494 ; N uni27E0 ; G 4165\nU 10214 ; WX 495 ; N uni27E6 ; G 4166\nU 10215 ; WX 495 ; N uni27E7 ; G 4167\nU 10216 ; WX 390 ; N uni27E8 ; G 4168\nU 10217 ; WX 390 ; N uni27E9 ; G 4169\nU 10218 ; WX 556 ; N uni27EA ; G 4170\nU 10219 ; WX 556 ; N uni27EB ; G 4171\nU 10224 ; WX 838 ; N uni27F0 ; G 4172\nU 10225 ; WX 838 ; N uni27F1 ; G 4173\nU 10226 ; WX 838 ; N uni27F2 ; G 4174\nU 10227 ; WX 838 ; N uni27F3 ; G 4175\nU 10228 ; WX 1157 ; N uni27F4 ; G 4176\nU 10229 ; WX 1434 ; N uni27F5 ; G 4177\nU 10230 ; WX 1434 ; N uni27F6 ; G 4178\nU 10231 ; WX 1434 ; N uni27F7 ; G 4179\nU 10232 ; WX 1434 ; N uni27F8 ; G 4180\nU 10233 ; WX 1434 ; N uni27F9 ; G 4181\nU 10234 ; WX 1434 ; N uni27FA ; G 4182\nU 10235 ; WX 1434 ; N uni27FB ; G 4183\nU 10236 ; WX 1434 ; N uni27FC ; G 4184\nU 10237 ; WX 1434 ; N uni27FD ; G 4185\nU 10238 ; WX 1434 ; N uni27FE ; G 4186\nU 10239 ; WX 1434 ; N uni27FF ; G 4187\nU 10240 ; WX 732 ; N uni2800 ; G 4188\nU 10241 ; WX 732 ; N uni2801 ; G 4189\nU 10242 ; WX 732 ; N uni2802 ; G 4190\nU 10243 ; WX 732 ; N uni2803 ; G 4191\nU 10244 ; WX 732 ; N uni2804 ; G 4192\nU 10245 ; WX 732 ; N uni2805 ; G 4193\nU 10246 ; WX 732 ; N uni2806 ; G 4194\nU 10247 ; WX 732 ; N uni2807 ; G 4195\nU 10248 ; WX 732 ; N uni2808 ; G 4196\nU 10249 ; WX 732 ; N uni2809 ; G 4197\nU 10250 ; WX 732 ; N uni280A ; G 4198\nU 10251 ; WX 732 ; N uni280B ; G 4199\nU 10252 ; WX 732 ; N uni280C ; G 4200\nU 10253 ; WX 732 ; N uni280D ; G 4201\nU 10254 ; WX 732 ; N uni280E ; G 4202\nU 10255 ; WX 732 ; N uni280F ; G 4203\nU 10256 ; WX 732 ; N uni2810 ; G 4204\nU 10257 ; WX 732 ; N uni2811 ; G 4205\nU 10258 ; WX 732 ; N uni2812 ; G 4206\nU 10259 ; WX 732 ; N uni2813 ; G 4207\nU 10260 ; WX 732 ; N uni2814 ; G 4208\nU 10261 ; WX 732 ; N uni2815 ; G 4209\nU 10262 ; WX 732 ; N uni2816 ; G 4210\nU 10263 ; WX 732 ; N uni2817 ; G 4211\nU 10264 ; WX 732 ; N uni2818 ; G 4212\nU 10265 ; WX 732 ; N uni2819 ; G 4213\nU 10266 ; WX 732 ; N uni281A ; G 4214\nU 10267 ; WX 732 ; N uni281B ; G 4215\nU 10268 ; WX 732 ; N uni281C ; G 4216\nU 10269 ; WX 732 ; N uni281D ; G 4217\nU 10270 ; WX 732 ; N uni281E ; G 4218\nU 10271 ; WX 732 ; N uni281F ; G 4219\nU 10272 ; WX 732 ; N uni2820 ; G 4220\nU 10273 ; WX 732 ; N uni2821 ; G 4221\nU 10274 ; WX 732 ; N uni2822 ; G 4222\nU 10275 ; WX 732 ; N uni2823 ; G 4223\nU 10276 ; WX 732 ; N uni2824 ; G 4224\nU 10277 ; WX 732 ; N uni2825 ; G 4225\nU 10278 ; WX 732 ; N uni2826 ; G 4226\nU 10279 ; WX 732 ; N uni2827 ; G 4227\nU 10280 ; WX 732 ; N uni2828 ; G 4228\nU 10281 ; WX 732 ; N uni2829 ; G 4229\nU 10282 ; WX 732 ; N uni282A ; G 4230\nU 10283 ; WX 732 ; N uni282B ; G 4231\nU 10284 ; WX 732 ; N uni282C ; G 4232\nU 10285 ; WX 732 ; N uni282D ; G 4233\nU 10286 ; WX 732 ; N uni282E ; G 4234\nU 10287 ; WX 732 ; N uni282F ; G 4235\nU 10288 ; WX 732 ; N uni2830 ; G 4236\nU 10289 ; WX 732 ; N uni2831 ; G 4237\nU 10290 ; WX 732 ; N uni2832 ; G 4238\nU 10291 ; WX 732 ; N uni2833 ; G 4239\nU 10292 ; WX 732 ; N uni2834 ; G 4240\nU 10293 ; WX 732 ; N uni2835 ; G 4241\nU 10294 ; WX 732 ; N uni2836 ; G 4242\nU 10295 ; WX 732 ; N uni2837 ; G 4243\nU 10296 ; WX 732 ; N uni2838 ; G 4244\nU 10297 ; WX 732 ; N uni2839 ; G 4245\nU 10298 ; WX 732 ; N uni283A ; G 4246\nU 10299 ; WX 732 ; N uni283B ; G 4247\nU 10300 ; WX 732 ; N uni283C ; G 4248\nU 10301 ; WX 732 ; N uni283D ; G 4249\nU 10302 ; WX 732 ; N uni283E ; G 4250\nU 10303 ; WX 732 ; N uni283F ; G 4251\nU 10304 ; WX 732 ; N uni2840 ; G 4252\nU 10305 ; WX 732 ; N uni2841 ; G 4253\nU 10306 ; WX 732 ; N uni2842 ; G 4254\nU 10307 ; WX 732 ; N uni2843 ; G 4255\nU 10308 ; WX 732 ; N uni2844 ; G 4256\nU 10309 ; WX 732 ; N uni2845 ; G 4257\nU 10310 ; WX 732 ; N uni2846 ; G 4258\nU 10311 ; WX 732 ; N uni2847 ; G 4259\nU 10312 ; WX 732 ; N uni2848 ; G 4260\nU 10313 ; WX 732 ; N uni2849 ; G 4261\nU 10314 ; WX 732 ; N uni284A ; G 4262\nU 10315 ; WX 732 ; N uni284B ; G 4263\nU 10316 ; WX 732 ; N uni284C ; G 4264\nU 10317 ; WX 732 ; N uni284D ; G 4265\nU 10318 ; WX 732 ; N uni284E ; G 4266\nU 10319 ; WX 732 ; N uni284F ; G 4267\nU 10320 ; WX 732 ; N uni2850 ; G 4268\nU 10321 ; WX 732 ; N uni2851 ; G 4269\nU 10322 ; WX 732 ; N uni2852 ; G 4270\nU 10323 ; WX 732 ; N uni2853 ; G 4271\nU 10324 ; WX 732 ; N uni2854 ; G 4272\nU 10325 ; WX 732 ; N uni2855 ; G 4273\nU 10326 ; WX 732 ; N uni2856 ; G 4274\nU 10327 ; WX 732 ; N uni2857 ; G 4275\nU 10328 ; WX 732 ; N uni2858 ; G 4276\nU 10329 ; WX 732 ; N uni2859 ; G 4277\nU 10330 ; WX 732 ; N uni285A ; G 4278\nU 10331 ; WX 732 ; N uni285B ; G 4279\nU 10332 ; WX 732 ; N uni285C ; G 4280\nU 10333 ; WX 732 ; N uni285D ; G 4281\nU 10334 ; WX 732 ; N uni285E ; G 4282\nU 10335 ; WX 732 ; N uni285F ; G 4283\nU 10336 ; WX 732 ; N uni2860 ; G 4284\nU 10337 ; WX 732 ; N uni2861 ; G 4285\nU 10338 ; WX 732 ; N uni2862 ; G 4286\nU 10339 ; WX 732 ; N uni2863 ; G 4287\nU 10340 ; WX 732 ; N uni2864 ; G 4288\nU 10341 ; WX 732 ; N uni2865 ; G 4289\nU 10342 ; WX 732 ; N uni2866 ; G 4290\nU 10343 ; WX 732 ; N uni2867 ; G 4291\nU 10344 ; WX 732 ; N uni2868 ; G 4292\nU 10345 ; WX 732 ; N uni2869 ; G 4293\nU 10346 ; WX 732 ; N uni286A ; G 4294\nU 10347 ; WX 732 ; N uni286B ; G 4295\nU 10348 ; WX 732 ; N uni286C ; G 4296\nU 10349 ; WX 732 ; N uni286D ; G 4297\nU 10350 ; WX 732 ; N uni286E ; G 4298\nU 10351 ; WX 732 ; N uni286F ; G 4299\nU 10352 ; WX 732 ; N uni2870 ; G 4300\nU 10353 ; WX 732 ; N uni2871 ; G 4301\nU 10354 ; WX 732 ; N uni2872 ; G 4302\nU 10355 ; WX 732 ; N uni2873 ; G 4303\nU 10356 ; WX 732 ; N uni2874 ; G 4304\nU 10357 ; WX 732 ; N uni2875 ; G 4305\nU 10358 ; WX 732 ; N uni2876 ; G 4306\nU 10359 ; WX 732 ; N uni2877 ; G 4307\nU 10360 ; WX 732 ; N uni2878 ; G 4308\nU 10361 ; WX 732 ; N uni2879 ; G 4309\nU 10362 ; WX 732 ; N uni287A ; G 4310\nU 10363 ; WX 732 ; N uni287B ; G 4311\nU 10364 ; WX 732 ; N uni287C ; G 4312\nU 10365 ; WX 732 ; N uni287D ; G 4313\nU 10366 ; WX 732 ; N uni287E ; G 4314\nU 10367 ; WX 732 ; N uni287F ; G 4315\nU 10368 ; WX 732 ; N uni2880 ; G 4316\nU 10369 ; WX 732 ; N uni2881 ; G 4317\nU 10370 ; WX 732 ; N uni2882 ; G 4318\nU 10371 ; WX 732 ; N uni2883 ; G 4319\nU 10372 ; WX 732 ; N uni2884 ; G 4320\nU 10373 ; WX 732 ; N uni2885 ; G 4321\nU 10374 ; WX 732 ; N uni2886 ; G 4322\nU 10375 ; WX 732 ; N uni2887 ; G 4323\nU 10376 ; WX 732 ; N uni2888 ; G 4324\nU 10377 ; WX 732 ; N uni2889 ; G 4325\nU 10378 ; WX 732 ; N uni288A ; G 4326\nU 10379 ; WX 732 ; N uni288B ; G 4327\nU 10380 ; WX 732 ; N uni288C ; G 4328\nU 10381 ; WX 732 ; N uni288D ; G 4329\nU 10382 ; WX 732 ; N uni288E ; G 4330\nU 10383 ; WX 732 ; N uni288F ; G 4331\nU 10384 ; WX 732 ; N uni2890 ; G 4332\nU 10385 ; WX 732 ; N uni2891 ; G 4333\nU 10386 ; WX 732 ; N uni2892 ; G 4334\nU 10387 ; WX 732 ; N uni2893 ; G 4335\nU 10388 ; WX 732 ; N uni2894 ; G 4336\nU 10389 ; WX 732 ; N uni2895 ; G 4337\nU 10390 ; WX 732 ; N uni2896 ; G 4338\nU 10391 ; WX 732 ; N uni2897 ; G 4339\nU 10392 ; WX 732 ; N uni2898 ; G 4340\nU 10393 ; WX 732 ; N uni2899 ; G 4341\nU 10394 ; WX 732 ; N uni289A ; G 4342\nU 10395 ; WX 732 ; N uni289B ; G 4343\nU 10396 ; WX 732 ; N uni289C ; G 4344\nU 10397 ; WX 732 ; N uni289D ; G 4345\nU 10398 ; WX 732 ; N uni289E ; G 4346\nU 10399 ; WX 732 ; N uni289F ; G 4347\nU 10400 ; WX 732 ; N uni28A0 ; G 4348\nU 10401 ; WX 732 ; N uni28A1 ; G 4349\nU 10402 ; WX 732 ; N uni28A2 ; G 4350\nU 10403 ; WX 732 ; N uni28A3 ; G 4351\nU 10404 ; WX 732 ; N uni28A4 ; G 4352\nU 10405 ; WX 732 ; N uni28A5 ; G 4353\nU 10406 ; WX 732 ; N uni28A6 ; G 4354\nU 10407 ; WX 732 ; N uni28A7 ; G 4355\nU 10408 ; WX 732 ; N uni28A8 ; G 4356\nU 10409 ; WX 732 ; N uni28A9 ; G 4357\nU 10410 ; WX 732 ; N uni28AA ; G 4358\nU 10411 ; WX 732 ; N uni28AB ; G 4359\nU 10412 ; WX 732 ; N uni28AC ; G 4360\nU 10413 ; WX 732 ; N uni28AD ; G 4361\nU 10414 ; WX 732 ; N uni28AE ; G 4362\nU 10415 ; WX 732 ; N uni28AF ; G 4363\nU 10416 ; WX 732 ; N uni28B0 ; G 4364\nU 10417 ; WX 732 ; N uni28B1 ; G 4365\nU 10418 ; WX 732 ; N uni28B2 ; G 4366\nU 10419 ; WX 732 ; N uni28B3 ; G 4367\nU 10420 ; WX 732 ; N uni28B4 ; G 4368\nU 10421 ; WX 732 ; N uni28B5 ; G 4369\nU 10422 ; WX 732 ; N uni28B6 ; G 4370\nU 10423 ; WX 732 ; N uni28B7 ; G 4371\nU 10424 ; WX 732 ; N uni28B8 ; G 4372\nU 10425 ; WX 732 ; N uni28B9 ; G 4373\nU 10426 ; WX 732 ; N uni28BA ; G 4374\nU 10427 ; WX 732 ; N uni28BB ; G 4375\nU 10428 ; WX 732 ; N uni28BC ; G 4376\nU 10429 ; WX 732 ; N uni28BD ; G 4377\nU 10430 ; WX 732 ; N uni28BE ; G 4378\nU 10431 ; WX 732 ; N uni28BF ; G 4379\nU 10432 ; WX 732 ; N uni28C0 ; G 4380\nU 10433 ; WX 732 ; N uni28C1 ; G 4381\nU 10434 ; WX 732 ; N uni28C2 ; G 4382\nU 10435 ; WX 732 ; N uni28C3 ; G 4383\nU 10436 ; WX 732 ; N uni28C4 ; G 4384\nU 10437 ; WX 732 ; N uni28C5 ; G 4385\nU 10438 ; WX 732 ; N uni28C6 ; G 4386\nU 10439 ; WX 732 ; N uni28C7 ; G 4387\nU 10440 ; WX 732 ; N uni28C8 ; G 4388\nU 10441 ; WX 732 ; N uni28C9 ; G 4389\nU 10442 ; WX 732 ; N uni28CA ; G 4390\nU 10443 ; WX 732 ; N uni28CB ; G 4391\nU 10444 ; WX 732 ; N uni28CC ; G 4392\nU 10445 ; WX 732 ; N uni28CD ; G 4393\nU 10446 ; WX 732 ; N uni28CE ; G 4394\nU 10447 ; WX 732 ; N uni28CF ; G 4395\nU 10448 ; WX 732 ; N uni28D0 ; G 4396\nU 10449 ; WX 732 ; N uni28D1 ; G 4397\nU 10450 ; WX 732 ; N uni28D2 ; G 4398\nU 10451 ; WX 732 ; N uni28D3 ; G 4399\nU 10452 ; WX 732 ; N uni28D4 ; G 4400\nU 10453 ; WX 732 ; N uni28D5 ; G 4401\nU 10454 ; WX 732 ; N uni28D6 ; G 4402\nU 10455 ; WX 732 ; N uni28D7 ; G 4403\nU 10456 ; WX 732 ; N uni28D8 ; G 4404\nU 10457 ; WX 732 ; N uni28D9 ; G 4405\nU 10458 ; WX 732 ; N uni28DA ; G 4406\nU 10459 ; WX 732 ; N uni28DB ; G 4407\nU 10460 ; WX 732 ; N uni28DC ; G 4408\nU 10461 ; WX 732 ; N uni28DD ; G 4409\nU 10462 ; WX 732 ; N uni28DE ; G 4410\nU 10463 ; WX 732 ; N uni28DF ; G 4411\nU 10464 ; WX 732 ; N uni28E0 ; G 4412\nU 10465 ; WX 732 ; N uni28E1 ; G 4413\nU 10466 ; WX 732 ; N uni28E2 ; G 4414\nU 10467 ; WX 732 ; N uni28E3 ; G 4415\nU 10468 ; WX 732 ; N uni28E4 ; G 4416\nU 10469 ; WX 732 ; N uni28E5 ; G 4417\nU 10470 ; WX 732 ; N uni28E6 ; G 4418\nU 10471 ; WX 732 ; N uni28E7 ; G 4419\nU 10472 ; WX 732 ; N uni28E8 ; G 4420\nU 10473 ; WX 732 ; N uni28E9 ; G 4421\nU 10474 ; WX 732 ; N uni28EA ; G 4422\nU 10475 ; WX 732 ; N uni28EB ; G 4423\nU 10476 ; WX 732 ; N uni28EC ; G 4424\nU 10477 ; WX 732 ; N uni28ED ; G 4425\nU 10478 ; WX 732 ; N uni28EE ; G 4426\nU 10479 ; WX 732 ; N uni28EF ; G 4427\nU 10480 ; WX 732 ; N uni28F0 ; G 4428\nU 10481 ; WX 732 ; N uni28F1 ; G 4429\nU 10482 ; WX 732 ; N uni28F2 ; G 4430\nU 10483 ; WX 732 ; N uni28F3 ; G 4431\nU 10484 ; WX 732 ; N uni28F4 ; G 4432\nU 10485 ; WX 732 ; N uni28F5 ; G 4433\nU 10486 ; WX 732 ; N uni28F6 ; G 4434\nU 10487 ; WX 732 ; N uni28F7 ; G 4435\nU 10488 ; WX 732 ; N uni28F8 ; G 4436\nU 10489 ; WX 732 ; N uni28F9 ; G 4437\nU 10490 ; WX 732 ; N uni28FA ; G 4438\nU 10491 ; WX 732 ; N uni28FB ; G 4439\nU 10492 ; WX 732 ; N uni28FC ; G 4440\nU 10493 ; WX 732 ; N uni28FD ; G 4441\nU 10494 ; WX 732 ; N uni28FE ; G 4442\nU 10495 ; WX 732 ; N uni28FF ; G 4443\nU 10502 ; WX 838 ; N uni2906 ; G 4444\nU 10503 ; WX 838 ; N uni2907 ; G 4445\nU 10506 ; WX 838 ; N uni290A ; G 4446\nU 10507 ; WX 838 ; N uni290B ; G 4447\nU 10560 ; WX 683 ; N uni2940 ; G 4448\nU 10561 ; WX 683 ; N uni2941 ; G 4449\nU 10627 ; WX 734 ; N uni2983 ; G 4450\nU 10628 ; WX 734 ; N uni2984 ; G 4451\nU 10702 ; WX 838 ; N uni29CE ; G 4452\nU 10703 ; WX 1000 ; N uni29CF ; G 4453\nU 10704 ; WX 1000 ; N uni29D0 ; G 4454\nU 10705 ; WX 1000 ; N uni29D1 ; G 4455\nU 10706 ; WX 1000 ; N uni29D2 ; G 4456\nU 10707 ; WX 1000 ; N uni29D3 ; G 4457\nU 10708 ; WX 1000 ; N uni29D4 ; G 4458\nU 10709 ; WX 1000 ; N uni29D5 ; G 4459\nU 10731 ; WX 494 ; N uni29EB ; G 4460\nU 10746 ; WX 838 ; N uni29FA ; G 4461\nU 10747 ; WX 838 ; N uni29FB ; G 4462\nU 10752 ; WX 1000 ; N uni2A00 ; G 4463\nU 10753 ; WX 1000 ; N uni2A01 ; G 4464\nU 10754 ; WX 1000 ; N uni2A02 ; G 4465\nU 10764 ; WX 1325 ; N uni2A0C ; G 4466\nU 10765 ; WX 521 ; N uni2A0D ; G 4467\nU 10766 ; WX 521 ; N uni2A0E ; G 4468\nU 10767 ; WX 521 ; N uni2A0F ; G 4469\nU 10768 ; WX 521 ; N uni2A10 ; G 4470\nU 10769 ; WX 521 ; N uni2A11 ; G 4471\nU 10770 ; WX 521 ; N uni2A12 ; G 4472\nU 10771 ; WX 521 ; N uni2A13 ; G 4473\nU 10772 ; WX 521 ; N uni2A14 ; G 4474\nU 10773 ; WX 521 ; N uni2A15 ; G 4475\nU 10774 ; WX 521 ; N uni2A16 ; G 4476\nU 10775 ; WX 521 ; N uni2A17 ; G 4477\nU 10776 ; WX 521 ; N uni2A18 ; G 4478\nU 10777 ; WX 521 ; N uni2A19 ; G 4479\nU 10778 ; WX 521 ; N uni2A1A ; G 4480\nU 10779 ; WX 521 ; N uni2A1B ; G 4481\nU 10780 ; WX 521 ; N uni2A1C ; G 4482\nU 10799 ; WX 838 ; N uni2A2F ; G 4483\nU 10858 ; WX 838 ; N uni2A6A ; G 4484\nU 10859 ; WX 838 ; N uni2A6B ; G 4485\nU 10877 ; WX 838 ; N uni2A7D ; G 4486\nU 10878 ; WX 838 ; N uni2A7E ; G 4487\nU 10879 ; WX 838 ; N uni2A7F ; G 4488\nU 10880 ; WX 838 ; N uni2A80 ; G 4489\nU 10881 ; WX 838 ; N uni2A81 ; G 4490\nU 10882 ; WX 838 ; N uni2A82 ; G 4491\nU 10883 ; WX 838 ; N uni2A83 ; G 4492\nU 10884 ; WX 838 ; N uni2A84 ; G 4493\nU 10885 ; WX 838 ; N uni2A85 ; G 4494\nU 10886 ; WX 838 ; N uni2A86 ; G 4495\nU 10887 ; WX 838 ; N uni2A87 ; G 4496\nU 10888 ; WX 838 ; N uni2A88 ; G 4497\nU 10889 ; WX 838 ; N uni2A89 ; G 4498\nU 10890 ; WX 838 ; N uni2A8A ; G 4499\nU 10891 ; WX 838 ; N uni2A8B ; G 4500\nU 10892 ; WX 838 ; N uni2A8C ; G 4501\nU 10893 ; WX 838 ; N uni2A8D ; G 4502\nU 10894 ; WX 838 ; N uni2A8E ; G 4503\nU 10895 ; WX 838 ; N uni2A8F ; G 4504\nU 10896 ; WX 838 ; N uni2A90 ; G 4505\nU 10897 ; WX 838 ; N uni2A91 ; G 4506\nU 10898 ; WX 838 ; N uni2A92 ; G 4507\nU 10899 ; WX 838 ; N uni2A93 ; G 4508\nU 10900 ; WX 838 ; N uni2A94 ; G 4509\nU 10901 ; WX 838 ; N uni2A95 ; G 4510\nU 10902 ; WX 838 ; N uni2A96 ; G 4511\nU 10903 ; WX 838 ; N uni2A97 ; G 4512\nU 10904 ; WX 838 ; N uni2A98 ; G 4513\nU 10905 ; WX 838 ; N uni2A99 ; G 4514\nU 10906 ; WX 838 ; N uni2A9A ; G 4515\nU 10907 ; WX 838 ; N uni2A9B ; G 4516\nU 10908 ; WX 838 ; N uni2A9C ; G 4517\nU 10909 ; WX 838 ; N uni2A9D ; G 4518\nU 10910 ; WX 838 ; N uni2A9E ; G 4519\nU 10911 ; WX 838 ; N uni2A9F ; G 4520\nU 10912 ; WX 838 ; N uni2AA0 ; G 4521\nU 10926 ; WX 838 ; N uni2AAE ; G 4522\nU 10927 ; WX 838 ; N uni2AAF ; G 4523\nU 10928 ; WX 838 ; N uni2AB0 ; G 4524\nU 10929 ; WX 838 ; N uni2AB1 ; G 4525\nU 10930 ; WX 838 ; N uni2AB2 ; G 4526\nU 10931 ; WX 838 ; N uni2AB3 ; G 4527\nU 10932 ; WX 838 ; N uni2AB4 ; G 4528\nU 10933 ; WX 838 ; N uni2AB5 ; G 4529\nU 10934 ; WX 838 ; N uni2AB6 ; G 4530\nU 10935 ; WX 838 ; N uni2AB7 ; G 4531\nU 10936 ; WX 838 ; N uni2AB8 ; G 4532\nU 10937 ; WX 838 ; N uni2AB9 ; G 4533\nU 10938 ; WX 838 ; N uni2ABA ; G 4534\nU 11001 ; WX 838 ; N uni2AF9 ; G 4535\nU 11002 ; WX 838 ; N uni2AFA ; G 4536\nU 11008 ; WX 838 ; N uni2B00 ; G 4537\nU 11009 ; WX 838 ; N uni2B01 ; G 4538\nU 11010 ; WX 838 ; N uni2B02 ; G 4539\nU 11011 ; WX 838 ; N uni2B03 ; G 4540\nU 11012 ; WX 838 ; N uni2B04 ; G 4541\nU 11013 ; WX 838 ; N uni2B05 ; G 4542\nU 11014 ; WX 838 ; N uni2B06 ; G 4543\nU 11015 ; WX 838 ; N uni2B07 ; G 4544\nU 11016 ; WX 838 ; N uni2B08 ; G 4545\nU 11017 ; WX 838 ; N uni2B09 ; G 4546\nU 11018 ; WX 838 ; N uni2B0A ; G 4547\nU 11019 ; WX 838 ; N uni2B0B ; G 4548\nU 11020 ; WX 838 ; N uni2B0C ; G 4549\nU 11021 ; WX 838 ; N uni2B0D ; G 4550\nU 11022 ; WX 836 ; N uni2B0E ; G 4551\nU 11023 ; WX 836 ; N uni2B0F ; G 4552\nU 11024 ; WX 836 ; N uni2B10 ; G 4553\nU 11025 ; WX 836 ; N uni2B11 ; G 4554\nU 11026 ; WX 945 ; N uni2B12 ; G 4555\nU 11027 ; WX 945 ; N uni2B13 ; G 4556\nU 11028 ; WX 945 ; N uni2B14 ; G 4557\nU 11029 ; WX 945 ; N uni2B15 ; G 4558\nU 11030 ; WX 769 ; N uni2B16 ; G 4559\nU 11031 ; WX 769 ; N uni2B17 ; G 4560\nU 11032 ; WX 769 ; N uni2B18 ; G 4561\nU 11033 ; WX 769 ; N uni2B19 ; G 4562\nU 11034 ; WX 945 ; N uni2B1A ; G 4563\nU 11039 ; WX 869 ; N uni2B1F ; G 4564\nU 11040 ; WX 869 ; N uni2B20 ; G 4565\nU 11041 ; WX 873 ; N uni2B21 ; G 4566\nU 11042 ; WX 873 ; N uni2B22 ; G 4567\nU 11043 ; WX 873 ; N uni2B23 ; G 4568\nU 11044 ; WX 1119 ; N uni2B24 ; G 4569\nU 11091 ; WX 869 ; N uni2B53 ; G 4570\nU 11092 ; WX 869 ; N uni2B54 ; G 4571\nU 11360 ; WX 557 ; N uni2C60 ; G 4572\nU 11361 ; WX 278 ; N uni2C61 ; G 4573\nU 11362 ; WX 557 ; N uni2C62 ; G 4574\nU 11363 ; WX 603 ; N uni2C63 ; G 4575\nU 11364 ; WX 695 ; N uni2C64 ; G 4576\nU 11365 ; WX 613 ; N uni2C65 ; G 4577\nU 11366 ; WX 392 ; N uni2C66 ; G 4578\nU 11367 ; WX 752 ; N uni2C67 ; G 4579\nU 11368 ; WX 634 ; N uni2C68 ; G 4580\nU 11369 ; WX 656 ; N uni2C69 ; G 4581\nU 11370 ; WX 579 ; N uni2C6A ; G 4582\nU 11371 ; WX 685 ; N uni2C6B ; G 4583\nU 11372 ; WX 525 ; N uni2C6C ; G 4584\nU 11373 ; WX 781 ; N uni2C6D ; G 4585\nU 11374 ; WX 863 ; N uni2C6E ; G 4586\nU 11375 ; WX 684 ; N uni2C6F ; G 4587\nU 11376 ; WX 781 ; N uni2C70 ; G 4588\nU 11377 ; WX 734 ; N uni2C71 ; G 4589\nU 11378 ; WX 1128 ; N uni2C72 ; G 4590\nU 11379 ; WX 961 ; N uni2C73 ; G 4591\nU 11380 ; WX 592 ; N uni2C74 ; G 4592\nU 11381 ; WX 654 ; N uni2C75 ; G 4593\nU 11382 ; WX 568 ; N uni2C76 ; G 4594\nU 11383 ; WX 660 ; N uni2C77 ; G 4595\nU 11385 ; WX 414 ; N uni2C79 ; G 4596\nU 11386 ; WX 612 ; N uni2C7A ; G 4597\nU 11387 ; WX 491 ; N uni2C7B ; G 4598\nU 11388 ; WX 175 ; N uni2C7C ; G 4599\nU 11389 ; WX 431 ; N uni2C7D ; G 4600\nU 11390 ; WX 635 ; N uni2C7E ; G 4601\nU 11391 ; WX 685 ; N uni2C7F ; G 4602\nU 11520 ; WX 591 ; N uni2D00 ; G 4603\nU 11521 ; WX 595 ; N uni2D01 ; G 4604\nU 11522 ; WX 564 ; N uni2D02 ; G 4605\nU 11523 ; WX 602 ; N uni2D03 ; G 4606\nU 11524 ; WX 587 ; N uni2D04 ; G 4607\nU 11525 ; WX 911 ; N uni2D05 ; G 4608\nU 11526 ; WX 626 ; N uni2D06 ; G 4609\nU 11527 ; WX 952 ; N uni2D07 ; G 4610\nU 11528 ; WX 595 ; N uni2D08 ; G 4611\nU 11529 ; WX 607 ; N uni2D09 ; G 4612\nU 11530 ; WX 954 ; N uni2D0A ; G 4613\nU 11531 ; WX 620 ; N uni2D0B ; G 4614\nU 11532 ; WX 595 ; N uni2D0C ; G 4615\nU 11533 ; WX 926 ; N uni2D0D ; G 4616\nU 11534 ; WX 595 ; N uni2D0E ; G 4617\nU 11535 ; WX 806 ; N uni2D0F ; G 4618\nU 11536 ; WX 931 ; N uni2D10 ; G 4619\nU 11537 ; WX 584 ; N uni2D11 ; G 4620\nU 11538 ; WX 592 ; N uni2D12 ; G 4621\nU 11539 ; WX 923 ; N uni2D13 ; G 4622\nU 11540 ; WX 953 ; N uni2D14 ; G 4623\nU 11541 ; WX 828 ; N uni2D15 ; G 4624\nU 11542 ; WX 596 ; N uni2D16 ; G 4625\nU 11543 ; WX 595 ; N uni2D17 ; G 4626\nU 11544 ; WX 590 ; N uni2D18 ; G 4627\nU 11545 ; WX 592 ; N uni2D19 ; G 4628\nU 11546 ; WX 592 ; N uni2D1A ; G 4629\nU 11547 ; WX 621 ; N uni2D1B ; G 4630\nU 11548 ; WX 920 ; N uni2D1C ; G 4631\nU 11549 ; WX 589 ; N uni2D1D ; G 4632\nU 11550 ; WX 586 ; N uni2D1E ; G 4633\nU 11551 ; WX 581 ; N uni2D1F ; G 4634\nU 11552 ; WX 914 ; N uni2D20 ; G 4635\nU 11553 ; WX 596 ; N uni2D21 ; G 4636\nU 11554 ; WX 595 ; N uni2D22 ; G 4637\nU 11555 ; WX 592 ; N uni2D23 ; G 4638\nU 11556 ; WX 642 ; N uni2D24 ; G 4639\nU 11557 ; WX 901 ; N uni2D25 ; G 4640\nU 11568 ; WX 646 ; N uni2D30 ; G 4641\nU 11569 ; WX 888 ; N uni2D31 ; G 4642\nU 11570 ; WX 888 ; N uni2D32 ; G 4643\nU 11571 ; WX 682 ; N uni2D33 ; G 4644\nU 11572 ; WX 684 ; N uni2D34 ; G 4645\nU 11573 ; WX 635 ; N uni2D35 ; G 4646\nU 11574 ; WX 562 ; N uni2D36 ; G 4647\nU 11575 ; WX 684 ; N uni2D37 ; G 4648\nU 11576 ; WX 684 ; N uni2D38 ; G 4649\nU 11577 ; WX 632 ; N uni2D39 ; G 4650\nU 11578 ; WX 632 ; N uni2D3A ; G 4651\nU 11579 ; WX 683 ; N uni2D3B ; G 4652\nU 11580 ; WX 875 ; N uni2D3C ; G 4653\nU 11581 ; WX 685 ; N uni2D3D ; G 4654\nU 11582 ; WX 491 ; N uni2D3E ; G 4655\nU 11583 ; WX 685 ; N uni2D3F ; G 4656\nU 11584 ; WX 888 ; N uni2D40 ; G 4657\nU 11585 ; WX 888 ; N uni2D41 ; G 4658\nU 11586 ; WX 300 ; N uni2D42 ; G 4659\nU 11587 ; WX 627 ; N uni2D43 ; G 4660\nU 11588 ; WX 752 ; N uni2D44 ; G 4661\nU 11589 ; WX 656 ; N uni2D45 ; G 4662\nU 11590 ; WX 527 ; N uni2D46 ; G 4663\nU 11591 ; WX 685 ; N uni2D47 ; G 4664\nU 11592 ; WX 645 ; N uni2D48 ; G 4665\nU 11593 ; WX 632 ; N uni2D49 ; G 4666\nU 11594 ; WX 502 ; N uni2D4A ; G 4667\nU 11595 ; WX 953 ; N uni2D4B ; G 4668\nU 11596 ; WX 778 ; N uni2D4C ; G 4669\nU 11597 ; WX 748 ; N uni2D4D ; G 4670\nU 11598 ; WX 621 ; N uni2D4E ; G 4671\nU 11599 ; WX 295 ; N uni2D4F ; G 4672\nU 11600 ; WX 778 ; N uni2D50 ; G 4673\nU 11601 ; WX 295 ; N uni2D51 ; G 4674\nU 11602 ; WX 752 ; N uni2D52 ; G 4675\nU 11603 ; WX 633 ; N uni2D53 ; G 4676\nU 11604 ; WX 888 ; N uni2D54 ; G 4677\nU 11605 ; WX 888 ; N uni2D55 ; G 4678\nU 11606 ; WX 752 ; N uni2D56 ; G 4679\nU 11607 ; WX 320 ; N uni2D57 ; G 4680\nU 11608 ; WX 749 ; N uni2D58 ; G 4681\nU 11609 ; WX 888 ; N uni2D59 ; G 4682\nU 11610 ; WX 888 ; N uni2D5A ; G 4683\nU 11611 ; WX 698 ; N uni2D5B ; G 4684\nU 11612 ; WX 768 ; N uni2D5C ; G 4685\nU 11613 ; WX 685 ; N uni2D5D ; G 4686\nU 11614 ; WX 698 ; N uni2D5E ; G 4687\nU 11615 ; WX 622 ; N uni2D5F ; G 4688\nU 11616 ; WX 684 ; N uni2D60 ; G 4689\nU 11617 ; WX 752 ; N uni2D61 ; G 4690\nU 11618 ; WX 632 ; N uni2D62 ; G 4691\nU 11619 ; WX 788 ; N uni2D63 ; G 4692\nU 11620 ; WX 567 ; N uni2D64 ; G 4693\nU 11621 ; WX 788 ; N uni2D65 ; G 4694\nU 11631 ; WX 515 ; N uni2D6F ; G 4695\nU 11800 ; WX 531 ; N uni2E18 ; G 4696\nU 11807 ; WX 838 ; N uni2E1F ; G 4697\nU 11810 ; WX 390 ; N uni2E22 ; G 4698\nU 11811 ; WX 390 ; N uni2E23 ; G 4699\nU 11812 ; WX 390 ; N uni2E24 ; G 4700\nU 11813 ; WX 390 ; N uni2E25 ; G 4701\nU 11822 ; WX 531 ; N uni2E2E ; G 4702\nU 19904 ; WX 896 ; N uni4DC0 ; G 4703\nU 19905 ; WX 896 ; N uni4DC1 ; G 4704\nU 19906 ; WX 896 ; N uni4DC2 ; G 4705\nU 19907 ; WX 896 ; N uni4DC3 ; G 4706\nU 19908 ; WX 896 ; N uni4DC4 ; G 4707\nU 19909 ; WX 896 ; N uni4DC5 ; G 4708\nU 19910 ; WX 896 ; N uni4DC6 ; G 4709\nU 19911 ; WX 896 ; N uni4DC7 ; G 4710\nU 19912 ; WX 896 ; N uni4DC8 ; G 4711\nU 19913 ; WX 896 ; N uni4DC9 ; G 4712\nU 19914 ; WX 896 ; N uni4DCA ; G 4713\nU 19915 ; WX 896 ; N uni4DCB ; G 4714\nU 19916 ; WX 896 ; N uni4DCC ; G 4715\nU 19917 ; WX 896 ; N uni4DCD ; G 4716\nU 19918 ; WX 896 ; N uni4DCE ; G 4717\nU 19919 ; WX 896 ; N uni4DCF ; G 4718\nU 19920 ; WX 896 ; N uni4DD0 ; G 4719\nU 19921 ; WX 896 ; N uni4DD1 ; G 4720\nU 19922 ; WX 896 ; N uni4DD2 ; G 4721\nU 19923 ; WX 896 ; N uni4DD3 ; G 4722\nU 19924 ; WX 896 ; N uni4DD4 ; G 4723\nU 19925 ; WX 896 ; N uni4DD5 ; G 4724\nU 19926 ; WX 896 ; N uni4DD6 ; G 4725\nU 19927 ; WX 896 ; N uni4DD7 ; G 4726\nU 19928 ; WX 896 ; N uni4DD8 ; G 4727\nU 19929 ; WX 896 ; N uni4DD9 ; G 4728\nU 19930 ; WX 896 ; N uni4DDA ; G 4729\nU 19931 ; WX 896 ; N uni4DDB ; G 4730\nU 19932 ; WX 896 ; N uni4DDC ; G 4731\nU 19933 ; WX 896 ; N uni4DDD ; G 4732\nU 19934 ; WX 896 ; N uni4DDE ; G 4733\nU 19935 ; WX 896 ; N uni4DDF ; G 4734\nU 19936 ; WX 896 ; N uni4DE0 ; G 4735\nU 19937 ; WX 896 ; N uni4DE1 ; G 4736\nU 19938 ; WX 896 ; N uni4DE2 ; G 4737\nU 19939 ; WX 896 ; N uni4DE3 ; G 4738\nU 19940 ; WX 896 ; N uni4DE4 ; G 4739\nU 19941 ; WX 896 ; N uni4DE5 ; G 4740\nU 19942 ; WX 896 ; N uni4DE6 ; G 4741\nU 19943 ; WX 896 ; N uni4DE7 ; G 4742\nU 19944 ; WX 896 ; N uni4DE8 ; G 4743\nU 19945 ; WX 896 ; N uni4DE9 ; G 4744\nU 19946 ; WX 896 ; N uni4DEA ; G 4745\nU 19947 ; WX 896 ; N uni4DEB ; G 4746\nU 19948 ; WX 896 ; N uni4DEC ; G 4747\nU 19949 ; WX 896 ; N uni4DED ; G 4748\nU 19950 ; WX 896 ; N uni4DEE ; G 4749\nU 19951 ; WX 896 ; N uni4DEF ; G 4750\nU 19952 ; WX 896 ; N uni4DF0 ; G 4751\nU 19953 ; WX 896 ; N uni4DF1 ; G 4752\nU 19954 ; WX 896 ; N uni4DF2 ; G 4753\nU 19955 ; WX 896 ; N uni4DF3 ; G 4754\nU 19956 ; WX 896 ; N uni4DF4 ; G 4755\nU 19957 ; WX 896 ; N uni4DF5 ; G 4756\nU 19958 ; WX 896 ; N uni4DF6 ; G 4757\nU 19959 ; WX 896 ; N uni4DF7 ; G 4758\nU 19960 ; WX 896 ; N uni4DF8 ; G 4759\nU 19961 ; WX 896 ; N uni4DF9 ; G 4760\nU 19962 ; WX 896 ; N uni4DFA ; G 4761\nU 19963 ; WX 896 ; N uni4DFB ; G 4762\nU 19964 ; WX 896 ; N uni4DFC ; G 4763\nU 19965 ; WX 896 ; N uni4DFD ; G 4764\nU 19966 ; WX 896 ; N uni4DFE ; G 4765\nU 19967 ; WX 896 ; N uni4DFF ; G 4766\nU 42192 ; WX 686 ; N uniA4D0 ; G 4767\nU 42193 ; WX 603 ; N uniA4D1 ; G 4768\nU 42194 ; WX 603 ; N uniA4D2 ; G 4769\nU 42195 ; WX 770 ; N uniA4D3 ; G 4770\nU 42196 ; WX 611 ; N uniA4D4 ; G 4771\nU 42197 ; WX 611 ; N uniA4D5 ; G 4772\nU 42198 ; WX 775 ; N uniA4D6 ; G 4773\nU 42199 ; WX 656 ; N uniA4D7 ; G 4774\nU 42200 ; WX 656 ; N uniA4D8 ; G 4775\nU 42201 ; WX 512 ; N uniA4D9 ; G 4776\nU 42202 ; WX 698 ; N uniA4DA ; G 4777\nU 42203 ; WX 703 ; N uniA4DB ; G 4778\nU 42204 ; WX 685 ; N uniA4DC ; G 4779\nU 42205 ; WX 575 ; N uniA4DD ; G 4780\nU 42206 ; WX 575 ; N uniA4DE ; G 4781\nU 42207 ; WX 863 ; N uniA4DF ; G 4782\nU 42208 ; WX 748 ; N uniA4E0 ; G 4783\nU 42209 ; WX 557 ; N uniA4E1 ; G 4784\nU 42210 ; WX 635 ; N uniA4E2 ; G 4785\nU 42211 ; WX 695 ; N uniA4E3 ; G 4786\nU 42212 ; WX 695 ; N uniA4E4 ; G 4787\nU 42213 ; WX 684 ; N uniA4E5 ; G 4788\nU 42214 ; WX 684 ; N uniA4E6 ; G 4789\nU 42215 ; WX 752 ; N uniA4E7 ; G 4790\nU 42216 ; WX 775 ; N uniA4E8 ; G 4791\nU 42217 ; WX 512 ; N uniA4E9 ; G 4792\nU 42218 ; WX 989 ; N uniA4EA ; G 4793\nU 42219 ; WX 685 ; N uniA4EB ; G 4794\nU 42220 ; WX 611 ; N uniA4EC ; G 4795\nU 42221 ; WX 686 ; N uniA4ED ; G 4796\nU 42222 ; WX 684 ; N uniA4EE ; G 4797\nU 42223 ; WX 684 ; N uniA4EF ; G 4798\nU 42224 ; WX 632 ; N uniA4F0 ; G 4799\nU 42225 ; WX 632 ; N uniA4F1 ; G 4800\nU 42226 ; WX 295 ; N uniA4F2 ; G 4801\nU 42227 ; WX 787 ; N uniA4F3 ; G 4802\nU 42228 ; WX 732 ; N uniA4F4 ; G 4803\nU 42229 ; WX 732 ; N uniA4F5 ; G 4804\nU 42230 ; WX 557 ; N uniA4F6 ; G 4805\nU 42231 ; WX 767 ; N uniA4F7 ; G 4806\nU 42232 ; WX 300 ; N uniA4F8 ; G 4807\nU 42233 ; WX 300 ; N uniA4F9 ; G 4808\nU 42234 ; WX 596 ; N uniA4FA ; G 4809\nU 42235 ; WX 596 ; N uniA4FB ; G 4810\nU 42236 ; WX 300 ; N uniA4FC ; G 4811\nU 42237 ; WX 300 ; N uniA4FD ; G 4812\nU 42238 ; WX 588 ; N uniA4FE ; G 4813\nU 42239 ; WX 588 ; N uniA4FF ; G 4814\nU 42564 ; WX 635 ; N uniA644 ; G 4815\nU 42565 ; WX 521 ; N uniA645 ; G 4816\nU 42566 ; WX 354 ; N uniA646 ; G 4817\nU 42567 ; WX 338 ; N uniA647 ; G 4818\nU 42572 ; WX 1180 ; N uniA64C ; G 4819\nU 42573 ; WX 1028 ; N uniA64D ; G 4820\nU 42576 ; WX 1029 ; N uniA650 ; G 4821\nU 42577 ; WX 906 ; N uniA651 ; G 4822\nU 42580 ; WX 1080 ; N uniA654 ; G 4823\nU 42581 ; WX 842 ; N uniA655 ; G 4824\nU 42582 ; WX 977 ; N uniA656 ; G 4825\nU 42583 ; WX 843 ; N uniA657 ; G 4826\nU 42594 ; WX 1062 ; N uniA662 ; G 4827\nU 42595 ; WX 912 ; N uniA663 ; G 4828\nU 42596 ; WX 1066 ; N uniA664 ; G 4829\nU 42597 ; WX 901 ; N uniA665 ; G 4830\nU 42598 ; WX 1178 ; N uniA666 ; G 4831\nU 42599 ; WX 1008 ; N uniA667 ; G 4832\nU 42600 ; WX 787 ; N uniA668 ; G 4833\nU 42601 ; WX 612 ; N uniA669 ; G 4834\nU 42602 ; WX 855 ; N uniA66A ; G 4835\nU 42603 ; WX 712 ; N uniA66B ; G 4836\nU 42604 ; WX 1358 ; N uniA66C ; G 4837\nU 42605 ; WX 1019 ; N uniA66D ; G 4838\nU 42606 ; WX 879 ; N uniA66E ; G 4839\nU 42634 ; WX 782 ; N uniA68A ; G 4840\nU 42635 ; WX 685 ; N uniA68B ; G 4841\nU 42636 ; WX 611 ; N uniA68C ; G 4842\nU 42637 ; WX 583 ; N uniA68D ; G 4843\nU 42644 ; WX 686 ; N uniA694 ; G 4844\nU 42645 ; WX 634 ; N uniA695 ; G 4845\nU 42648 ; WX 1358 ; N uniA698 ; G 4846\nU 42649 ; WX 1019 ; N uniA699 ; G 4847\nU 42760 ; WX 493 ; N uniA708 ; G 4848\nU 42761 ; WX 493 ; N uniA709 ; G 4849\nU 42762 ; WX 493 ; N uniA70A ; G 4850\nU 42763 ; WX 493 ; N uniA70B ; G 4851\nU 42764 ; WX 493 ; N uniA70C ; G 4852\nU 42765 ; WX 493 ; N uniA70D ; G 4853\nU 42766 ; WX 493 ; N uniA70E ; G 4854\nU 42767 ; WX 493 ; N uniA70F ; G 4855\nU 42768 ; WX 493 ; N uniA710 ; G 4856\nU 42769 ; WX 493 ; N uniA711 ; G 4857\nU 42770 ; WX 493 ; N uniA712 ; G 4858\nU 42771 ; WX 493 ; N uniA713 ; G 4859\nU 42772 ; WX 493 ; N uniA714 ; G 4860\nU 42773 ; WX 493 ; N uniA715 ; G 4861\nU 42774 ; WX 493 ; N uniA716 ; G 4862\nU 42779 ; WX 369 ; N uniA71B ; G 4863\nU 42780 ; WX 369 ; N uniA71C ; G 4864\nU 42781 ; WX 252 ; N uniA71D ; G 4865\nU 42782 ; WX 252 ; N uniA71E ; G 4866\nU 42783 ; WX 252 ; N uniA71F ; G 4867\nU 42786 ; WX 385 ; N uniA722 ; G 4868\nU 42787 ; WX 356 ; N uniA723 ; G 4869\nU 42788 ; WX 472 ; N uniA724 ; G 4870\nU 42789 ; WX 472 ; N uniA725 ; G 4871\nU 42790 ; WX 752 ; N uniA726 ; G 4872\nU 42791 ; WX 634 ; N uniA727 ; G 4873\nU 42792 ; WX 878 ; N uniA728 ; G 4874\nU 42793 ; WX 709 ; N uniA729 ; G 4875\nU 42794 ; WX 614 ; N uniA72A ; G 4876\nU 42795 ; WX 541 ; N uniA72B ; G 4877\nU 42800 ; WX 491 ; N uniA730 ; G 4878\nU 42801 ; WX 521 ; N uniA731 ; G 4879\nU 42802 ; WX 1250 ; N uniA732 ; G 4880\nU 42803 ; WX 985 ; N uniA733 ; G 4881\nU 42804 ; WX 1203 ; N uniA734 ; G 4882\nU 42805 ; WX 990 ; N uniA735 ; G 4883\nU 42806 ; WX 1142 ; N uniA736 ; G 4884\nU 42807 ; WX 981 ; N uniA737 ; G 4885\nU 42808 ; WX 971 ; N uniA738 ; G 4886\nU 42809 ; WX 818 ; N uniA739 ; G 4887\nU 42810 ; WX 971 ; N uniA73A ; G 4888\nU 42811 ; WX 818 ; N uniA73B ; G 4889\nU 42812 ; WX 959 ; N uniA73C ; G 4890\nU 42813 ; WX 818 ; N uniA73D ; G 4891\nU 42814 ; WX 703 ; N uniA73E ; G 4892\nU 42815 ; WX 549 ; N uniA73F ; G 4893\nU 42816 ; WX 656 ; N uniA740 ; G 4894\nU 42817 ; WX 583 ; N uniA741 ; G 4895\nU 42822 ; WX 680 ; N uniA746 ; G 4896\nU 42823 ; WX 392 ; N uniA747 ; G 4897\nU 42824 ; WX 582 ; N uniA748 ; G 4898\nU 42825 ; WX 427 ; N uniA749 ; G 4899\nU 42826 ; WX 807 ; N uniA74A ; G 4900\nU 42827 ; WX 704 ; N uniA74B ; G 4901\nU 42830 ; WX 1358 ; N uniA74E ; G 4902\nU 42831 ; WX 1019 ; N uniA74F ; G 4903\nU 42832 ; WX 603 ; N uniA750 ; G 4904\nU 42833 ; WX 635 ; N uniA751 ; G 4905\nU 42834 ; WX 734 ; N uniA752 ; G 4906\nU 42835 ; WX 774 ; N uniA753 ; G 4907\nU 42838 ; WX 787 ; N uniA756 ; G 4908\nU 42839 ; WX 635 ; N uniA757 ; G 4909\nU 42852 ; WX 605 ; N uniA764 ; G 4910\nU 42853 ; WX 635 ; N uniA765 ; G 4911\nU 42854 ; WX 605 ; N uniA766 ; G 4912\nU 42855 ; WX 635 ; N uniA767 ; G 4913\nU 42880 ; WX 557 ; N uniA780 ; G 4914\nU 42881 ; WX 278 ; N uniA781 ; G 4915\nU 42882 ; WX 735 ; N uniA782 ; G 4916\nU 42883 ; WX 634 ; N uniA783 ; G 4917\nU 42889 ; WX 337 ; N uniA789 ; G 4918\nU 42890 ; WX 376 ; N uniA78A ; G 4919\nU 42891 ; WX 401 ; N uniA78B ; G 4920\nU 42892 ; WX 275 ; N uniA78C ; G 4921\nU 42893 ; WX 686 ; N uniA78D ; G 4922\nU 42894 ; WX 487 ; N uniA78E ; G 4923\nU 42896 ; WX 772 ; N uniA790 ; G 4924\nU 42897 ; WX 667 ; N uniA791 ; G 4925\nU 42912 ; WX 775 ; N uniA7A0 ; G 4926\nU 42913 ; WX 635 ; N uniA7A1 ; G 4927\nU 42914 ; WX 656 ; N uniA7A2 ; G 4928\nU 42915 ; WX 579 ; N uniA7A3 ; G 4929\nU 42916 ; WX 748 ; N uniA7A4 ; G 4930\nU 42917 ; WX 634 ; N uniA7A5 ; G 4931\nU 42918 ; WX 695 ; N uniA7A6 ; G 4932\nU 42919 ; WX 411 ; N uniA7A7 ; G 4933\nU 42920 ; WX 635 ; N uniA7A8 ; G 4934\nU 42921 ; WX 521 ; N uniA7A9 ; G 4935\nU 42922 ; WX 801 ; N uniA7AA ; G 4936\nU 43000 ; WX 577 ; N uniA7F8 ; G 4937\nU 43001 ; WX 644 ; N uniA7F9 ; G 4938\nU 43002 ; WX 915 ; N uniA7FA ; G 4939\nU 43003 ; WX 575 ; N uniA7FB ; G 4940\nU 43004 ; WX 603 ; N uniA7FC ; G 4941\nU 43005 ; WX 863 ; N uniA7FD ; G 4942\nU 43006 ; WX 295 ; N uniA7FE ; G 4943\nU 43007 ; WX 1199 ; N uniA7FF ; G 4944\nU 61184 ; WX 213 ; N uni02E5.5 ; G 4945\nU 61185 ; WX 238 ; N uni02E6.5 ; G 4946\nU 61186 ; WX 257 ; N uni02E7.5 ; G 4947\nU 61187 ; WX 264 ; N uni02E8.5 ; G 4948\nU 61188 ; WX 267 ; N uni02E9.5 ; G 4949\nU 61189 ; WX 238 ; N uni02E5.4 ; G 4950\nU 61190 ; WX 213 ; N uni02E6.4 ; G 4951\nU 61191 ; WX 238 ; N uni02E7.4 ; G 4952\nU 61192 ; WX 257 ; N uni02E8.4 ; G 4953\nU 61193 ; WX 264 ; N uni02E9.4 ; G 4954\nU 61194 ; WX 257 ; N uni02E5.3 ; G 4955\nU 61195 ; WX 238 ; N uni02E6.3 ; G 4956\nU 61196 ; WX 213 ; N uni02E7.3 ; G 4957\nU 61197 ; WX 238 ; N uni02E8.3 ; G 4958\nU 61198 ; WX 257 ; N uni02E9.3 ; G 4959\nU 61199 ; WX 264 ; N uni02E5.2 ; G 4960\nU 61200 ; WX 257 ; N uni02E6.2 ; G 4961\nU 61201 ; WX 238 ; N uni02E7.2 ; G 4962\nU 61202 ; WX 213 ; N uni02E8.2 ; G 4963\nU 61203 ; WX 238 ; N uni02E9.2 ; G 4964\nU 61204 ; WX 267 ; N uni02E5.1 ; G 4965\nU 61205 ; WX 264 ; N uni02E6.1 ; G 4966\nU 61206 ; WX 257 ; N uni02E7.1 ; G 4967\nU 61207 ; WX 238 ; N uni02E8.1 ; G 4968\nU 61208 ; WX 213 ; N uni02E9.1 ; G 4969\nU 61209 ; WX 275 ; N stem ; G 4970\nU 61440 ; WX 977 ; N uniF000 ; G 4971\nU 61441 ; WX 977 ; N uniF001 ; G 4972\nU 61442 ; WX 977 ; N uniF002 ; G 4973\nU 61443 ; WX 977 ; N uniF003 ; G 4974\nU 62464 ; WX 580 ; N uniF400 ; G 4975\nU 62465 ; WX 580 ; N uniF401 ; G 4976\nU 62466 ; WX 624 ; N uniF402 ; G 4977\nU 62467 ; WX 889 ; N uniF403 ; G 4978\nU 62468 ; WX 585 ; N uniF404 ; G 4979\nU 62469 ; WX 580 ; N uniF405 ; G 4980\nU 62470 ; WX 653 ; N uniF406 ; G 4981\nU 62471 ; WX 882 ; N uniF407 ; G 4982\nU 62472 ; WX 555 ; N uniF408 ; G 4983\nU 62473 ; WX 580 ; N uniF409 ; G 4984\nU 62474 ; WX 1168 ; N uniF40A ; G 4985\nU 62475 ; WX 589 ; N uniF40B ; G 4986\nU 62476 ; WX 590 ; N uniF40C ; G 4987\nU 62477 ; WX 869 ; N uniF40D ; G 4988\nU 62478 ; WX 580 ; N uniF40E ; G 4989\nU 62479 ; WX 589 ; N uniF40F ; G 4990\nU 62480 ; WX 914 ; N uniF410 ; G 4991\nU 62481 ; WX 590 ; N uniF411 ; G 4992\nU 62482 ; WX 731 ; N uniF412 ; G 4993\nU 62483 ; WX 583 ; N uniF413 ; G 4994\nU 62484 ; WX 872 ; N uniF414 ; G 4995\nU 62485 ; WX 589 ; N uniF415 ; G 4996\nU 62486 ; WX 895 ; N uniF416 ; G 4997\nU 62487 ; WX 589 ; N uniF417 ; G 4998\nU 62488 ; WX 589 ; N uniF418 ; G 4999\nU 62489 ; WX 590 ; N uniF419 ; G 5000\nU 62490 ; WX 649 ; N uniF41A ; G 5001\nU 62491 ; WX 589 ; N uniF41B ; G 5002\nU 62492 ; WX 589 ; N uniF41C ; G 5003\nU 62493 ; WX 599 ; N uniF41D ; G 5004\nU 62494 ; WX 590 ; N uniF41E ; G 5005\nU 62495 ; WX 516 ; N uniF41F ; G 5006\nU 62496 ; WX 580 ; N uniF420 ; G 5007\nU 62497 ; WX 584 ; N uniF421 ; G 5008\nU 62498 ; WX 580 ; N uniF422 ; G 5009\nU 62499 ; WX 580 ; N uniF423 ; G 5010\nU 62500 ; WX 581 ; N uniF424 ; G 5011\nU 62501 ; WX 638 ; N uniF425 ; G 5012\nU 62502 ; WX 955 ; N uniF426 ; G 5013\nU 62504 ; WX 931 ; N uniF428 ; G 5014\nU 62505 ; WX 808 ; N uniF429 ; G 5015\nU 62506 ; WX 508 ; N uniF42A ; G 5016\nU 62507 ; WX 508 ; N uniF42B ; G 5017\nU 62508 ; WX 508 ; N uniF42C ; G 5018\nU 62509 ; WX 508 ; N uniF42D ; G 5019\nU 62510 ; WX 508 ; N uniF42E ; G 5020\nU 62511 ; WX 508 ; N uniF42F ; G 5021\nU 62512 ; WX 508 ; N uniF430 ; G 5022\nU 62513 ; WX 508 ; N uniF431 ; G 5023\nU 62514 ; WX 508 ; N uniF432 ; G 5024\nU 62515 ; WX 508 ; N uniF433 ; G 5025\nU 62516 ; WX 518 ; N uniF434 ; G 5026\nU 62517 ; WX 518 ; N uniF435 ; G 5027\nU 62518 ; WX 518 ; N uniF436 ; G 5028\nU 62519 ; WX 787 ; N uniF437 ; G 5029\nU 62520 ; WX 787 ; N uniF438 ; G 5030\nU 62521 ; WX 787 ; N uniF439 ; G 5031\nU 62522 ; WX 787 ; N uniF43A ; G 5032\nU 62523 ; WX 787 ; N uniF43B ; G 5033\nU 62524 ; WX 546 ; N uniF43C ; G 5034\nU 62525 ; WX 546 ; N uniF43D ; G 5035\nU 62526 ; WX 546 ; N uniF43E ; G 5036\nU 62527 ; WX 546 ; N uniF43F ; G 5037\nU 62528 ; WX 546 ; N uniF440 ; G 5038\nU 62529 ; WX 546 ; N uniF441 ; G 5039\nU 63173 ; WX 612 ; N uniF6C5 ; G 5040\nU 64256 ; WX 689 ; N uniFB00 ; G 5041\nU 64257 ; WX 630 ; N fi ; G 5042\nU 64258 ; WX 630 ; N fl ; G 5043\nU 64259 ; WX 967 ; N uniFB03 ; G 5044\nU 64260 ; WX 967 ; N uniFB04 ; G 5045\nU 64261 ; WX 686 ; N uniFB05 ; G 5046\nU 64262 ; WX 861 ; N uniFB06 ; G 5047\nU 64275 ; WX 1202 ; N uniFB13 ; G 5048\nU 64276 ; WX 1202 ; N uniFB14 ; G 5049\nU 64277 ; WX 1196 ; N uniFB15 ; G 5050\nU 64278 ; WX 1186 ; N uniFB16 ; G 5051\nU 64279 ; WX 1529 ; N uniFB17 ; G 5052\nU 64285 ; WX 224 ; N uniFB1D ; G 5053\nU 64286 ; WX 0 ; N uniFB1E ; G 5054\nU 64287 ; WX 331 ; N uniFB1F ; G 5055\nU 64288 ; WX 636 ; N uniFB20 ; G 5056\nU 64289 ; WX 856 ; N uniFB21 ; G 5057\nU 64290 ; WX 774 ; N uniFB22 ; G 5058\nU 64291 ; WX 906 ; N uniFB23 ; G 5059\nU 64292 ; WX 771 ; N uniFB24 ; G 5060\nU 64293 ; WX 843 ; N uniFB25 ; G 5061\nU 64294 ; WX 855 ; N uniFB26 ; G 5062\nU 64295 ; WX 807 ; N uniFB27 ; G 5063\nU 64296 ; WX 875 ; N uniFB28 ; G 5064\nU 64297 ; WX 838 ; N uniFB29 ; G 5065\nU 64298 ; WX 708 ; N uniFB2A ; G 5066\nU 64299 ; WX 708 ; N uniFB2B ; G 5067\nU 64300 ; WX 708 ; N uniFB2C ; G 5068\nU 64301 ; WX 708 ; N uniFB2D ; G 5069\nU 64302 ; WX 668 ; N uniFB2E ; G 5070\nU 64303 ; WX 668 ; N uniFB2F ; G 5071\nU 64304 ; WX 668 ; N uniFB30 ; G 5072\nU 64305 ; WX 578 ; N uniFB31 ; G 5073\nU 64306 ; WX 412 ; N uniFB32 ; G 5074\nU 64307 ; WX 546 ; N uniFB33 ; G 5075\nU 64308 ; WX 653 ; N uniFB34 ; G 5076\nU 64309 ; WX 355 ; N uniFB35 ; G 5077\nU 64310 ; WX 406 ; N uniFB36 ; G 5078\nU 64312 ; WX 648 ; N uniFB38 ; G 5079\nU 64313 ; WX 330 ; N uniFB39 ; G 5080\nU 64314 ; WX 537 ; N uniFB3A ; G 5081\nU 64315 ; WX 529 ; N uniFB3B ; G 5082\nU 64316 ; WX 568 ; N uniFB3C ; G 5083\nU 64318 ; WX 679 ; N uniFB3E ; G 5084\nU 64320 ; WX 399 ; N uniFB40 ; G 5085\nU 64321 ; WX 649 ; N uniFB41 ; G 5086\nU 64323 ; WX 640 ; N uniFB43 ; G 5087\nU 64324 ; WX 625 ; N uniFB44 ; G 5088\nU 64326 ; WX 593 ; N uniFB46 ; G 5089\nU 64327 ; WX 709 ; N uniFB47 ; G 5090\nU 64328 ; WX 564 ; N uniFB48 ; G 5091\nU 64329 ; WX 708 ; N uniFB49 ; G 5092\nU 64330 ; WX 657 ; N uniFB4A ; G 5093\nU 64331 ; WX 272 ; N uniFB4B ; G 5094\nU 64332 ; WX 578 ; N uniFB4C ; G 5095\nU 64333 ; WX 529 ; N uniFB4D ; G 5096\nU 64334 ; WX 625 ; N uniFB4E ; G 5097\nU 64335 ; WX 629 ; N uniFB4F ; G 5098\nU 64338 ; WX 941 ; N uniFB52 ; G 5099\nU 64339 ; WX 982 ; N uniFB53 ; G 5100\nU 64340 ; WX 278 ; N uniFB54 ; G 5101\nU 64341 ; WX 302 ; N uniFB55 ; G 5102\nU 64342 ; WX 941 ; N uniFB56 ; G 5103\nU 64343 ; WX 982 ; N uniFB57 ; G 5104\nU 64344 ; WX 278 ; N uniFB58 ; G 5105\nU 64345 ; WX 302 ; N uniFB59 ; G 5106\nU 64346 ; WX 941 ; N uniFB5A ; G 5107\nU 64347 ; WX 982 ; N uniFB5B ; G 5108\nU 64348 ; WX 278 ; N uniFB5C ; G 5109\nU 64349 ; WX 302 ; N uniFB5D ; G 5110\nU 64350 ; WX 941 ; N uniFB5E ; G 5111\nU 64351 ; WX 982 ; N uniFB5F ; G 5112\nU 64352 ; WX 278 ; N uniFB60 ; G 5113\nU 64353 ; WX 302 ; N uniFB61 ; G 5114\nU 64354 ; WX 941 ; N uniFB62 ; G 5115\nU 64355 ; WX 982 ; N uniFB63 ; G 5116\nU 64356 ; WX 278 ; N uniFB64 ; G 5117\nU 64357 ; WX 302 ; N uniFB65 ; G 5118\nU 64358 ; WX 941 ; N uniFB66 ; G 5119\nU 64359 ; WX 982 ; N uniFB67 ; G 5120\nU 64360 ; WX 278 ; N uniFB68 ; G 5121\nU 64361 ; WX 302 ; N uniFB69 ; G 5122\nU 64362 ; WX 1037 ; N uniFB6A ; G 5123\nU 64363 ; WX 1035 ; N uniFB6B ; G 5124\nU 64364 ; WX 478 ; N uniFB6C ; G 5125\nU 64365 ; WX 506 ; N uniFB6D ; G 5126\nU 64366 ; WX 1037 ; N uniFB6E ; G 5127\nU 64367 ; WX 1035 ; N uniFB6F ; G 5128\nU 64368 ; WX 478 ; N uniFB70 ; G 5129\nU 64369 ; WX 506 ; N uniFB71 ; G 5130\nU 64370 ; WX 646 ; N uniFB72 ; G 5131\nU 64371 ; WX 646 ; N uniFB73 ; G 5132\nU 64372 ; WX 618 ; N uniFB74 ; G 5133\nU 64373 ; WX 646 ; N uniFB75 ; G 5134\nU 64374 ; WX 646 ; N uniFB76 ; G 5135\nU 64375 ; WX 646 ; N uniFB77 ; G 5136\nU 64376 ; WX 618 ; N uniFB78 ; G 5137\nU 64377 ; WX 646 ; N uniFB79 ; G 5138\nU 64378 ; WX 646 ; N uniFB7A ; G 5139\nU 64379 ; WX 646 ; N uniFB7B ; G 5140\nU 64380 ; WX 618 ; N uniFB7C ; G 5141\nU 64381 ; WX 646 ; N uniFB7D ; G 5142\nU 64382 ; WX 646 ; N uniFB7E ; G 5143\nU 64383 ; WX 646 ; N uniFB7F ; G 5144\nU 64384 ; WX 618 ; N uniFB80 ; G 5145\nU 64385 ; WX 646 ; N uniFB81 ; G 5146\nU 64386 ; WX 445 ; N uniFB82 ; G 5147\nU 64387 ; WX 525 ; N uniFB83 ; G 5148\nU 64388 ; WX 445 ; N uniFB84 ; G 5149\nU 64389 ; WX 525 ; N uniFB85 ; G 5150\nU 64390 ; WX 445 ; N uniFB86 ; G 5151\nU 64391 ; WX 525 ; N uniFB87 ; G 5152\nU 64392 ; WX 445 ; N uniFB88 ; G 5153\nU 64393 ; WX 525 ; N uniFB89 ; G 5154\nU 64394 ; WX 483 ; N uniFB8A ; G 5155\nU 64395 ; WX 552 ; N uniFB8B ; G 5156\nU 64396 ; WX 483 ; N uniFB8C ; G 5157\nU 64397 ; WX 552 ; N uniFB8D ; G 5158\nU 64398 ; WX 895 ; N uniFB8E ; G 5159\nU 64399 ; WX 895 ; N uniFB8F ; G 5160\nU 64400 ; WX 476 ; N uniFB90 ; G 5161\nU 64401 ; WX 552 ; N uniFB91 ; G 5162\nU 64402 ; WX 895 ; N uniFB92 ; G 5163\nU 64403 ; WX 895 ; N uniFB93 ; G 5164\nU 64404 ; WX 476 ; N uniFB94 ; G 5165\nU 64405 ; WX 552 ; N uniFB95 ; G 5166\nU 64406 ; WX 895 ; N uniFB96 ; G 5167\nU 64407 ; WX 895 ; N uniFB97 ; G 5168\nU 64408 ; WX 476 ; N uniFB98 ; G 5169\nU 64409 ; WX 552 ; N uniFB99 ; G 5170\nU 64410 ; WX 895 ; N uniFB9A ; G 5171\nU 64411 ; WX 895 ; N uniFB9B ; G 5172\nU 64412 ; WX 476 ; N uniFB9C ; G 5173\nU 64413 ; WX 552 ; N uniFB9D ; G 5174\nU 64414 ; WX 734 ; N uniFB9E ; G 5175\nU 64415 ; WX 761 ; N uniFB9F ; G 5176\nU 64416 ; WX 734 ; N uniFBA0 ; G 5177\nU 64417 ; WX 761 ; N uniFBA1 ; G 5178\nU 64418 ; WX 278 ; N uniFBA2 ; G 5179\nU 64419 ; WX 302 ; N uniFBA3 ; G 5180\nU 64426 ; WX 698 ; N uniFBAA ; G 5181\nU 64427 ; WX 632 ; N uniFBAB ; G 5182\nU 64428 ; WX 527 ; N uniFBAC ; G 5183\nU 64429 ; WX 461 ; N uniFBAD ; G 5184\nU 64467 ; WX 824 ; N uniFBD3 ; G 5185\nU 64468 ; WX 843 ; N uniFBD4 ; G 5186\nU 64469 ; WX 476 ; N uniFBD5 ; G 5187\nU 64470 ; WX 552 ; N uniFBD6 ; G 5188\nU 64471 ; WX 483 ; N uniFBD7 ; G 5189\nU 64472 ; WX 517 ; N uniFBD8 ; G 5190\nU 64473 ; WX 483 ; N uniFBD9 ; G 5191\nU 64474 ; WX 517 ; N uniFBDA ; G 5192\nU 64475 ; WX 483 ; N uniFBDB ; G 5193\nU 64476 ; WX 517 ; N uniFBDC ; G 5194\nU 64478 ; WX 483 ; N uniFBDE ; G 5195\nU 64479 ; WX 517 ; N uniFBDF ; G 5196\nU 64484 ; WX 783 ; N uniFBE4 ; G 5197\nU 64485 ; WX 833 ; N uniFBE5 ; G 5198\nU 64486 ; WX 278 ; N uniFBE6 ; G 5199\nU 64487 ; WX 302 ; N uniFBE7 ; G 5200\nU 64488 ; WX 278 ; N uniFBE8 ; G 5201\nU 64489 ; WX 302 ; N uniFBE9 ; G 5202\nU 64508 ; WX 783 ; N uniFBFC ; G 5203\nU 64509 ; WX 833 ; N uniFBFD ; G 5204\nU 64510 ; WX 278 ; N uniFBFE ; G 5205\nU 64511 ; WX 302 ; N uniFBFF ; G 5206\nU 65024 ; WX 0 ; N uniFE00 ; G 5207\nU 65025 ; WX 0 ; N uniFE01 ; G 5208\nU 65026 ; WX 0 ; N uniFE02 ; G 5209\nU 65027 ; WX 0 ; N uniFE03 ; G 5210\nU 65028 ; WX 0 ; N uniFE04 ; G 5211\nU 65029 ; WX 0 ; N uniFE05 ; G 5212\nU 65030 ; WX 0 ; N uniFE06 ; G 5213\nU 65031 ; WX 0 ; N uniFE07 ; G 5214\nU 65032 ; WX 0 ; N uniFE08 ; G 5215\nU 65033 ; WX 0 ; N uniFE09 ; G 5216\nU 65034 ; WX 0 ; N uniFE0A ; G 5217\nU 65035 ; WX 0 ; N uniFE0B ; G 5218\nU 65036 ; WX 0 ; N uniFE0C ; G 5219\nU 65037 ; WX 0 ; N uniFE0D ; G 5220\nU 65038 ; WX 0 ; N uniFE0E ; G 5221\nU 65039 ; WX 0 ; N uniFE0F ; G 5222\nU 65056 ; WX 0 ; N uniFE20 ; G 5223\nU 65057 ; WX 0 ; N uniFE21 ; G 5224\nU 65058 ; WX 0 ; N uniFE22 ; G 5225\nU 65059 ; WX 0 ; N uniFE23 ; G 5226\nU 65136 ; WX 293 ; N uniFE70 ; G 5227\nU 65137 ; WX 293 ; N uniFE71 ; G 5228\nU 65138 ; WX 293 ; N uniFE72 ; G 5229\nU 65139 ; WX 262 ; N uniFE73 ; G 5230\nU 65140 ; WX 293 ; N uniFE74 ; G 5231\nU 65142 ; WX 293 ; N uniFE76 ; G 5232\nU 65143 ; WX 293 ; N uniFE77 ; G 5233\nU 65144 ; WX 293 ; N uniFE78 ; G 5234\nU 65145 ; WX 293 ; N uniFE79 ; G 5235\nU 65146 ; WX 293 ; N uniFE7A ; G 5236\nU 65147 ; WX 293 ; N uniFE7B ; G 5237\nU 65148 ; WX 293 ; N uniFE7C ; G 5238\nU 65149 ; WX 293 ; N uniFE7D ; G 5239\nU 65150 ; WX 293 ; N uniFE7E ; G 5240\nU 65151 ; WX 293 ; N uniFE7F ; G 5241\nU 65152 ; WX 470 ; N uniFE80 ; G 5242\nU 65153 ; WX 278 ; N uniFE81 ; G 5243\nU 65154 ; WX 305 ; N uniFE82 ; G 5244\nU 65155 ; WX 278 ; N uniFE83 ; G 5245\nU 65156 ; WX 305 ; N uniFE84 ; G 5246\nU 65157 ; WX 483 ; N uniFE85 ; G 5247\nU 65158 ; WX 517 ; N uniFE86 ; G 5248\nU 65159 ; WX 278 ; N uniFE87 ; G 5249\nU 65160 ; WX 305 ; N uniFE88 ; G 5250\nU 65161 ; WX 783 ; N uniFE89 ; G 5251\nU 65162 ; WX 833 ; N uniFE8A ; G 5252\nU 65163 ; WX 278 ; N uniFE8B ; G 5253\nU 65164 ; WX 302 ; N uniFE8C ; G 5254\nU 65165 ; WX 278 ; N uniFE8D ; G 5255\nU 65166 ; WX 305 ; N uniFE8E ; G 5256\nU 65167 ; WX 941 ; N uniFE8F ; G 5257\nU 65168 ; WX 982 ; N uniFE90 ; G 5258\nU 65169 ; WX 278 ; N uniFE91 ; G 5259\nU 65170 ; WX 302 ; N uniFE92 ; G 5260\nU 65171 ; WX 524 ; N uniFE93 ; G 5261\nU 65172 ; WX 536 ; N uniFE94 ; G 5262\nU 65173 ; WX 941 ; N uniFE95 ; G 5263\nU 65174 ; WX 982 ; N uniFE96 ; G 5264\nU 65175 ; WX 278 ; N uniFE97 ; G 5265\nU 65176 ; WX 302 ; N uniFE98 ; G 5266\nU 65177 ; WX 941 ; N uniFE99 ; G 5267\nU 65178 ; WX 982 ; N uniFE9A ; G 5268\nU 65179 ; WX 278 ; N uniFE9B ; G 5269\nU 65180 ; WX 302 ; N uniFE9C ; G 5270\nU 65181 ; WX 646 ; N uniFE9D ; G 5271\nU 65182 ; WX 646 ; N uniFE9E ; G 5272\nU 65183 ; WX 618 ; N uniFE9F ; G 5273\nU 65184 ; WX 646 ; N uniFEA0 ; G 5274\nU 65185 ; WX 646 ; N uniFEA1 ; G 5275\nU 65186 ; WX 646 ; N uniFEA2 ; G 5276\nU 65187 ; WX 618 ; N uniFEA3 ; G 5277\nU 65188 ; WX 646 ; N uniFEA4 ; G 5278\nU 65189 ; WX 646 ; N uniFEA5 ; G 5279\nU 65190 ; WX 646 ; N uniFEA6 ; G 5280\nU 65191 ; WX 618 ; N uniFEA7 ; G 5281\nU 65192 ; WX 646 ; N uniFEA8 ; G 5282\nU 65193 ; WX 445 ; N uniFEA9 ; G 5283\nU 65194 ; WX 525 ; N uniFEAA ; G 5284\nU 65195 ; WX 445 ; N uniFEAB ; G 5285\nU 65196 ; WX 525 ; N uniFEAC ; G 5286\nU 65197 ; WX 483 ; N uniFEAD ; G 5287\nU 65198 ; WX 552 ; N uniFEAE ; G 5288\nU 65199 ; WX 483 ; N uniFEAF ; G 5289\nU 65200 ; WX 552 ; N uniFEB0 ; G 5290\nU 65201 ; WX 1221 ; N uniFEB1 ; G 5291\nU 65202 ; WX 1275 ; N uniFEB2 ; G 5292\nU 65203 ; WX 838 ; N uniFEB3 ; G 5293\nU 65204 ; WX 892 ; N uniFEB4 ; G 5294\nU 65205 ; WX 1221 ; N uniFEB5 ; G 5295\nU 65206 ; WX 1275 ; N uniFEB6 ; G 5296\nU 65207 ; WX 838 ; N uniFEB7 ; G 5297\nU 65208 ; WX 892 ; N uniFEB8 ; G 5298\nU 65209 ; WX 1209 ; N uniFEB9 ; G 5299\nU 65210 ; WX 1225 ; N uniFEBA ; G 5300\nU 65211 ; WX 849 ; N uniFEBB ; G 5301\nU 65212 ; WX 867 ; N uniFEBC ; G 5302\nU 65213 ; WX 1209 ; N uniFEBD ; G 5303\nU 65214 ; WX 1225 ; N uniFEBE ; G 5304\nU 65215 ; WX 849 ; N uniFEBF ; G 5305\nU 65216 ; WX 867 ; N uniFEC0 ; G 5306\nU 65217 ; WX 925 ; N uniFEC1 ; G 5307\nU 65218 ; WX 949 ; N uniFEC2 ; G 5308\nU 65219 ; WX 796 ; N uniFEC3 ; G 5309\nU 65220 ; WX 820 ; N uniFEC4 ; G 5310\nU 65221 ; WX 925 ; N uniFEC5 ; G 5311\nU 65222 ; WX 949 ; N uniFEC6 ; G 5312\nU 65223 ; WX 796 ; N uniFEC7 ; G 5313\nU 65224 ; WX 820 ; N uniFEC8 ; G 5314\nU 65225 ; WX 597 ; N uniFEC9 ; G 5315\nU 65226 ; WX 532 ; N uniFECA ; G 5316\nU 65227 ; WX 597 ; N uniFECB ; G 5317\nU 65228 ; WX 482 ; N uniFECC ; G 5318\nU 65229 ; WX 597 ; N uniFECD ; G 5319\nU 65230 ; WX 532 ; N uniFECE ; G 5320\nU 65231 ; WX 523 ; N uniFECF ; G 5321\nU 65232 ; WX 482 ; N uniFED0 ; G 5322\nU 65233 ; WX 1037 ; N uniFED1 ; G 5323\nU 65234 ; WX 1035 ; N uniFED2 ; G 5324\nU 65235 ; WX 478 ; N uniFED3 ; G 5325\nU 65236 ; WX 506 ; N uniFED4 ; G 5326\nU 65237 ; WX 776 ; N uniFED5 ; G 5327\nU 65238 ; WX 834 ; N uniFED6 ; G 5328\nU 65239 ; WX 478 ; N uniFED7 ; G 5329\nU 65240 ; WX 506 ; N uniFED8 ; G 5330\nU 65241 ; WX 824 ; N uniFED9 ; G 5331\nU 65242 ; WX 843 ; N uniFEDA ; G 5332\nU 65243 ; WX 476 ; N uniFEDB ; G 5333\nU 65244 ; WX 552 ; N uniFEDC ; G 5334\nU 65245 ; WX 727 ; N uniFEDD ; G 5335\nU 65246 ; WX 757 ; N uniFEDE ; G 5336\nU 65247 ; WX 305 ; N uniFEDF ; G 5337\nU 65248 ; WX 331 ; N uniFEE0 ; G 5338\nU 65249 ; WX 619 ; N uniFEE1 ; G 5339\nU 65250 ; WX 666 ; N uniFEE2 ; G 5340\nU 65251 ; WX 536 ; N uniFEE3 ; G 5341\nU 65252 ; WX 578 ; N uniFEE4 ; G 5342\nU 65253 ; WX 734 ; N uniFEE5 ; G 5343\nU 65254 ; WX 761 ; N uniFEE6 ; G 5344\nU 65255 ; WX 278 ; N uniFEE7 ; G 5345\nU 65256 ; WX 302 ; N uniFEE8 ; G 5346\nU 65257 ; WX 524 ; N uniFEE9 ; G 5347\nU 65258 ; WX 536 ; N uniFEEA ; G 5348\nU 65259 ; WX 527 ; N uniFEEB ; G 5349\nU 65260 ; WX 461 ; N uniFEEC ; G 5350\nU 65261 ; WX 483 ; N uniFEED ; G 5351\nU 65262 ; WX 517 ; N uniFEEE ; G 5352\nU 65263 ; WX 783 ; N uniFEEF ; G 5353\nU 65264 ; WX 833 ; N uniFEF0 ; G 5354\nU 65265 ; WX 783 ; N uniFEF1 ; G 5355\nU 65266 ; WX 833 ; N uniFEF2 ; G 5356\nU 65267 ; WX 278 ; N uniFEF3 ; G 5357\nU 65268 ; WX 302 ; N uniFEF4 ; G 5358\nU 65269 ; WX 570 ; N uniFEF5 ; G 5359\nU 65270 ; WX 597 ; N uniFEF6 ; G 5360\nU 65271 ; WX 570 ; N uniFEF7 ; G 5361\nU 65272 ; WX 597 ; N uniFEF8 ; G 5362\nU 65273 ; WX 570 ; N uniFEF9 ; G 5363\nU 65274 ; WX 597 ; N uniFEFA ; G 5364\nU 65275 ; WX 570 ; N uniFEFB ; G 5365\nU 65276 ; WX 597 ; N uniFEFC ; G 5366\nU 65279 ; WX 0 ; N uniFEFF ; G 5367\nU 65529 ; WX 0 ; N uniFFF9 ; G 5368\nU 65530 ; WX 0 ; N uniFFFA ; G 5369\nU 65531 ; WX 0 ; N uniFFFB ; G 5370\nU 65532 ; WX 0 ; N uniFFFC ; G 5371\nU 65533 ; WX 1025 ; N uniFFFD ; G 5372\nEndCharMetrics\nStartKernData \nStartKernPairs 2727\n\nKPX dollar dollar 57\nKPX dollar ampersand -36\nKPX dollar asterisk -36\nKPX dollar two -36\nKPX dollar four -36\nKPX dollar seven -159\nKPX dollar nine -131\nKPX dollar colon -112\nKPX dollar less -159\nKPX dollar F -36\nKPX dollar G -36\nKPX dollar H -36\nKPX dollar I -73\nKPX dollar R -36\nKPX dollar T -36\nKPX dollar W -36\nKPX dollar Y -120\nKPX dollar Z -83\nKPX dollar backslash -139\nKPX dollar m -73\nKPX dollar copyright -36\nKPX dollar ordfeminine -36\nKPX dollar guillemotleft -36\nKPX dollar logicalnot -36\nKPX dollar sfthyphen -36\nKPX dollar acute -36\nKPX dollar mu -36\nKPX dollar paragraph -36\nKPX dollar periodcentered -36\nKPX dollar cedilla -36\nKPX dollar questiondown -139\nKPX dollar Aacute -139\nKPX dollar Acircumflex 57\nKPX dollar Adieresis 57\nKPX dollar AE 57\nKPX dollar Egrave -36\nKPX dollar Eacute -36\nKPX dollar Ecircumflex -36\nKPX dollar Edieresis -36\nKPX dollar Igrave -36\nKPX dollar Iacute -36\nKPX dollar Icircumflex -36\nKPX dollar Idieresis -36\nKPX dollar Ntilde -36\nKPX dollar Oacute -36\nKPX dollar Otilde -36\nKPX dollar multiply -36\nKPX dollar Ugrave -36\nKPX dollar Ucircumflex -36\nKPX dollar Yacute -36\nKPX dollar Thorn -36\nKPX dollar agrave -36\nKPX dollar acircumflex -36\nKPX dollar Dcaron -36\nKPX dollar dcaron -36\nKPX dollar Dcroat -36\nKPX dollar dmacron -36\nKPX dollar Emacron -36\nKPX dollar emacron -36\nKPX dollar Hcircumflex -159\nKPX dollar hcircumflex -36\nKPX dollar Hbar -159\nKPX dollar hbar -36\nKPX dollar Kcommaaccent -112\nKPX dollar kcommaaccent -83\nKPX dollar kgreenlandic -159\nKPX dollar Lacute -139\nKPX dollar lacute -159\nKPX dollar uni0188 -36\nKPX dollar uni01AC -36\nKPX dollar uni01AD -36\nKPX dollar uni01AE -36\nKPX dollar Uhorn -36\nKPX dollar uni01DC -159\nKPX dollar uni01DD -36\nKPX dollar uni01F0 -36\nKPX dollar uni01F3 -36\nKPX dollar uni01F4 -159\nKPX dollar uni01F5 -139\n\nKPX percent ampersand -36\nKPX percent asterisk -36\nKPX percent two -36\nKPX percent six -36\nKPX percent nine -63\nKPX percent colon -73\nKPX percent less -112\nKPX percent m -63\nKPX percent braceright -36\nKPX percent Egrave -36\nKPX percent Ecircumflex -36\nKPX percent Igrave -36\nKPX percent Icircumflex -36\nKPX percent Thorn -36\nKPX percent agrave -36\nKPX percent acircumflex -36\nKPX percent adieresis -36\nKPX percent Dcaron -36\nKPX percent Dcroat -36\nKPX percent Emacron -36\nKPX percent Gcircumflex -36\nKPX percent Gbreve -36\nKPX percent Gdotaccent -36\nKPX percent Gcommaaccent -36\nKPX percent Kcommaaccent -73\nKPX percent kgreenlandic -112\nKPX percent lacute -112\nKPX percent uni01AC -36\nKPX percent uni01AE -36\nKPX percent uni01DA -36\nKPX percent uni01F0 -36\n\nKPX ampersand less -36\nKPX ampersand m -36\nKPX ampersand braceright -36\nKPX ampersand kgreenlandic -36\nKPX ampersand lacute -36\nKPX ampersand uni01F4 -36\n\nKPX quotesingle dollar -36\nKPX quotesingle nine -36\nKPX quotesingle less -112\nKPX quotesingle m -36\nKPX quotesingle braceright -36\nKPX quotesingle Acircumflex -36\nKPX quotesingle Adieresis -36\nKPX quotesingle AE -36\nKPX quotesingle kgreenlandic -112\nKPX quotesingle lacute -112\nKPX quotesingle uni01F4 -112\n\nKPX parenright dollar -188\nKPX parenright six -36\nKPX parenright seven -36\nKPX parenright D -188\nKPX parenright H -112\nKPX parenright L -149\nKPX parenright R -73\nKPX parenright U -149\nKPX parenright X -112\nKPX parenright backslash -188\nKPX parenright cent -188\nKPX parenright sterling -188\nKPX parenright currency -188\nKPX parenright yen -188\nKPX parenright brokenbar -188\nKPX parenright section -188\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -73\nKPX parenright mu -73\nKPX parenright paragraph -73\nKPX parenright periodcentered -73\nKPX parenright cedilla -73\nKPX parenright guillemotright -112\nKPX parenright onequarter -112\nKPX parenright onehalf -112\nKPX parenright threequarters -112\nKPX parenright questiondown -188\nKPX parenright Aacute -188\nKPX parenright Acircumflex -188\nKPX parenright Atilde -188\nKPX parenright Adieresis -188\nKPX parenright Aring -188\nKPX parenright AE -188\nKPX parenright Ccedilla -188\nKPX parenright Otilde -112\nKPX parenright multiply -112\nKPX parenright Ugrave -112\nKPX parenright Ucircumflex -112\nKPX parenright Yacute -112\nKPX parenright ntilde -149\nKPX parenright otilde -149\nKPX parenright dcaron -73\nKPX parenright dmacron -73\nKPX parenright emacron -73\nKPX parenright edotaccent -149\nKPX parenright eogonek -149\nKPX parenright ecaron -149\nKPX parenright Gcircumflex -36\nKPX parenright Gbreve -36\nKPX parenright Gdotaccent -36\nKPX parenright Gcommaaccent -36\nKPX parenright Hcircumflex -36\nKPX parenright Hbar -36\nKPX parenright Itilde -36\nKPX parenright imacron -112\nKPX parenright ibreve -112\nKPX parenright iogonek -112\nKPX parenright dotlessi -112\nKPX parenright ij -112\nKPX parenright jcircumflex -112\nKPX parenright Lacute -188\nKPX parenright uni01AD -73\nKPX parenright Uhorn -73\nKPX parenright uni01DA -36\nKPX parenright uni01DC -36\nKPX parenright uni01F1 -73\nKPX parenright uni01F5 -188\n\nKPX asterisk seven -73\nKPX asterisk less -102\nKPX asterisk m -36\nKPX asterisk braceright -36\nKPX asterisk Hbar -73\nKPX asterisk lacute -102\n\n\nKPX hyphen dollar -36\nKPX hyphen m -36\nKPX hyphen braceright -36\n\nKPX period dollar -36\nKPX period ampersand -112\nKPX period two -112\nKPX period seven -159\nKPX period eight -55\nKPX period colon -73\nKPX period less -73\nKPX period D -36\nKPX period H -102\nKPX period R -102\nKPX period X -102\nKPX period backslash -149\nKPX period m -131\nKPX period cent -36\nKPX period sterling -36\nKPX period currency -36\nKPX period yen -36\nKPX period brokenbar -36\nKPX period section -36\nKPX period ordfeminine -102\nKPX period guillemotleft -102\nKPX period logicalnot -102\nKPX period sfthyphen -102\nKPX period acute -102\nKPX period mu -102\nKPX period paragraph -102\nKPX period periodcentered -102\nKPX period cedilla -102\nKPX period guillemotright -102\nKPX period onequarter -102\nKPX period onehalf -102\nKPX period threequarters -102\nKPX period questiondown -149\nKPX period Aacute -149\nKPX period Egrave -112\nKPX period Icircumflex -112\nKPX period Yacute -102\nKPX period Hbar -159\nKPX period Idot -55\nKPX period dotlessi -102\nKPX period lacute -73\n\nKPX slash dollar 47\nKPX slash two -73\nKPX slash seven -282\nKPX slash eight -102\nKPX slash nine -225\nKPX slash colon -188\nKPX slash less -272\nKPX slash H -36\nKPX slash R -36\nKPX slash X -36\nKPX slash backslash -188\nKPX slash ordfeminine -36\nKPX slash guillemotleft -36\nKPX slash logicalnot -36\nKPX slash sfthyphen -36\nKPX slash acute -36\nKPX slash mu -36\nKPX slash paragraph -36\nKPX slash periodcentered -36\nKPX slash cedilla -36\nKPX slash guillemotright -36\nKPX slash onequarter -36\nKPX slash onehalf -36\nKPX slash threequarters -36\nKPX slash questiondown -188\nKPX slash Aacute -188\nKPX slash Yacute -36\nKPX slash Hbar -282\nKPX slash Idot -102\nKPX slash dotlessi -36\nKPX slash lacute -272\n\nKPX two dollar -36\nKPX two nine -36\nKPX two semicolon -131\nKPX two less -112\nKPX two m -36\nKPX two lacute -112\n\nKPX three dollar -131\nKPX three less -45\nKPX three D -92\nKPX three H -73\nKPX three L -45\nKPX three Q -36\nKPX three R -73\nKPX three U -36\nKPX three V -36\nKPX three X -36\nKPX three m -36\nKPX three cent -92\nKPX three sterling -92\nKPX three currency -92\nKPX three yen -92\nKPX three brokenbar -92\nKPX three section -92\nKPX three ordfeminine -73\nKPX three guillemotleft -73\nKPX three logicalnot -73\nKPX three sfthyphen -73\nKPX three threesuperior -36\nKPX three acute -73\nKPX three mu -73\nKPX three paragraph -73\nKPX three periodcentered -73\nKPX three cedilla -73\nKPX three guillemotright -36\nKPX three onequarter -36\nKPX three onehalf -36\nKPX three threequarters -36\nKPX three Yacute -73\nKPX three Cdotaccent -36\nKPX three edotaccent -36\nKPX three ecaron -36\nKPX three gdotaccent -36\nKPX three gcommaaccent -36\nKPX three dotlessi -36\nKPX three lacute -45\n\n\nKPX five dollar -83\nKPX five ampersand -102\nKPX five seven -149\nKPX five nine -112\nKPX five colon -83\nKPX five less -131\nKPX five D -45\nKPX five H -92\nKPX five R -92\nKPX five X -92\nKPX five backslash -112\nKPX five m -112\nKPX five braceright -36\nKPX five cent -45\nKPX five sterling -45\nKPX five currency -45\nKPX five yen -45\nKPX five brokenbar -45\nKPX five section -45\nKPX five ordfeminine -92\nKPX five guillemotleft -92\nKPX five logicalnot -92\nKPX five sfthyphen -92\nKPX five acute -92\nKPX five mu -92\nKPX five paragraph -92\nKPX five periodcentered -92\nKPX five cedilla -92\nKPX five guillemotright -92\nKPX five onequarter -92\nKPX five onehalf -92\nKPX five threequarters -92\nKPX five questiondown -112\nKPX five Aacute -112\nKPX five Egrave -102\nKPX five Icircumflex -102\nKPX five Yacute -92\nKPX five Hbar -149\nKPX five dotlessi -92\nKPX five lacute -131\n\nKPX six dollar 38\n\nKPX seven dollar -159\nKPX seven ampersand -120\nKPX seven seven -36\nKPX seven D -339\nKPX seven F -348\nKPX seven H -348\nKPX seven L -63\nKPX seven R -348\nKPX seven U -301\nKPX seven V -339\nKPX seven X -311\nKPX seven Z -339\nKPX seven backslash -319\nKPX seven m -188\nKPX seven braceright -112\nKPX seven cent -239\nKPX seven sterling -339\nKPX seven currency -239\nKPX seven yen -239\nKPX seven brokenbar -239\nKPX seven section -239\nKPX seven copyright -348\nKPX seven ordfeminine -288\nKPX seven guillemotleft -348\nKPX seven logicalnot -288\nKPX seven sfthyphen -288\nKPX seven acute -268\nKPX seven mu -348\nKPX seven paragraph -268\nKPX seven periodcentered -268\nKPX seven cedilla -268\nKPX seven guillemotright -281\nKPX seven onequarter -311\nKPX seven onehalf -281\nKPX seven threequarters -281\nKPX seven questiondown -319\nKPX seven Aacute -319\nKPX seven Egrave -120\nKPX seven Eacute -348\nKPX seven Icircumflex -120\nKPX seven Idieresis -348\nKPX seven Yacute -348\nKPX seven edotaccent -301\nKPX seven ecaron -301\nKPX seven gdotaccent -339\nKPX seven gcommaaccent -339\nKPX seven Hbar -36\nKPX seven dotlessi -311\n\nKPX eight equal -36\nKPX eight Ldot -36\n\nKPX nine dollar -131\nKPX nine two -36\nKPX nine D -159\nKPX nine H -159\nKPX nine L -45\nKPX nine R -159\nKPX nine X -139\nKPX nine backslash -55\nKPX nine m -178\nKPX nine braceright -112\nKPX nine cent -159\nKPX nine sterling -159\nKPX nine currency -159\nKPX nine yen -159\nKPX nine brokenbar -159\nKPX nine section -159\nKPX nine ordfeminine -159\nKPX nine guillemotleft -159\nKPX nine logicalnot -159\nKPX nine sfthyphen -159\nKPX nine acute -159\nKPX nine mu -159\nKPX nine paragraph -159\nKPX nine periodcentered -159\nKPX nine cedilla -159\nKPX nine guillemotright -139\nKPX nine onequarter -139\nKPX nine onehalf -139\nKPX nine threequarters -139\nKPX nine questiondown -55\nKPX nine Aacute -55\nKPX nine Yacute -159\nKPX nine dotlessi -139\n\nKPX colon dollar -112\nKPX colon D -131\nKPX colon H -120\nKPX colon L -45\nKPX colon R -120\nKPX colon U -92\nKPX colon X -73\nKPX colon backslash -36\nKPX colon m -112\nKPX colon braceright -36\nKPX colon cent -131\nKPX colon sterling -131\nKPX colon currency -131\nKPX colon yen -131\nKPX colon brokenbar -131\nKPX colon section -131\nKPX colon ordfeminine -120\nKPX colon guillemotleft -120\nKPX colon logicalnot -120\nKPX colon sfthyphen -120\nKPX colon acute -120\nKPX colon mu -120\nKPX colon paragraph -120\nKPX colon periodcentered -120\nKPX colon cedilla -120\nKPX colon guillemotright -73\nKPX colon onequarter -73\nKPX colon onehalf -73\nKPX colon threequarters -73\nKPX colon questiondown -36\nKPX colon Aacute -36\nKPX colon Yacute -120\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -73\n\nKPX semicolon ampersand -149\nKPX semicolon two -131\nKPX semicolon seven -36\nKPX semicolon H -92\nKPX semicolon m -112\nKPX semicolon ordfeminine -92\nKPX semicolon guillemotleft -92\nKPX semicolon logicalnot -92\nKPX semicolon sfthyphen -92\nKPX semicolon Egrave -149\nKPX semicolon Icircumflex -149\nKPX semicolon Yacute -92\nKPX semicolon Hbar -36\n\nKPX less dollar -159\nKPX less ampersand -112\nKPX less two -112\nKPX less D -282\nKPX less H -272\nKPX less L -73\nKPX less R -272\nKPX less X -235\nKPX less m -225\nKPX less braceright -149\nKPX less cent -282\nKPX less sterling -282\nKPX less currency -282\nKPX less yen -282\nKPX less brokenbar -282\nKPX less section -282\nKPX less ordfeminine -272\nKPX less guillemotleft -272\nKPX less logicalnot -272\nKPX less sfthyphen -272\nKPX less acute -272\nKPX less mu -272\nKPX less paragraph -272\nKPX less periodcentered -272\nKPX less cedilla -272\nKPX less guillemotright -235\nKPX less onequarter -235\nKPX less onehalf -235\nKPX less threequarters -235\nKPX less Egrave -112\nKPX less Icircumflex -112\nKPX less Yacute -272\nKPX less dotlessi -235\n\n\nKPX H bracketleft -36\n\nKPX I W -36\nKPX I Z -36\nKPX I backslash -36\nKPX I m -73\nKPX I braceright -36\nKPX I questiondown -36\nKPX I Aacute -36\nKPX I hbar -36\n\nKPX N D -36\nKPX N H -73\nKPX N R -73\nKPX N X -63\nKPX N backslash -73\nKPX N cent -36\nKPX N sterling -36\nKPX N currency -36\nKPX N yen -36\nKPX N brokenbar -36\nKPX N section -36\nKPX N ordfeminine -73\nKPX N guillemotleft -73\nKPX N logicalnot -73\nKPX N sfthyphen -73\nKPX N acute -73\nKPX N mu -73\nKPX N paragraph -73\nKPX N periodcentered -73\nKPX N cedilla -73\nKPX N guillemotright -63\nKPX N onequarter -63\nKPX N onehalf -63\nKPX N threequarters -63\nKPX N questiondown -73\nKPX N Aacute -73\nKPX N Yacute -73\nKPX N dotlessi -63\n\n\nKPX R bracketleft -63\n\nKPX U F -45\nKPX U G -36\nKPX U H -45\nKPX U J -36\nKPX U K -36\nKPX U P -36\nKPX U Q -36\nKPX U R -45\nKPX U T -36\nKPX U U -36\nKPX U bracketleft -55\nKPX U m -73\nKPX U copyright -45\nKPX U ordfeminine -45\nKPX U guillemotleft -45\nKPX U logicalnot -45\nKPX U sfthyphen -45\nKPX U threesuperior -36\nKPX U acute -45\nKPX U mu -45\nKPX U paragraph -45\nKPX U periodcentered -45\nKPX U cedilla -45\nKPX U Eacute -45\nKPX U Idieresis -45\nKPX U Ntilde 72\nKPX U Yacute -45\nKPX U aacute -36\nKPX U Cdotaccent -36\nKPX U edotaccent -36\nKPX U ecaron -36\n\nKPX Y m -36\nKPX Y braceright -36\n\nKPX Z m -36\nKPX Z braceright -36\n\nKPX bracketleft F -36\nKPX bracketleft H -63\nKPX bracketleft R -63\nKPX bracketleft copyright -36\nKPX bracketleft ordfeminine -63\nKPX bracketleft guillemotleft -63\nKPX bracketleft logicalnot -63\nKPX bracketleft sfthyphen -63\nKPX bracketleft acute -63\nKPX bracketleft mu -63\nKPX bracketleft paragraph -63\nKPX bracketleft periodcentered -63\nKPX bracketleft cedilla -63\nKPX bracketleft Eacute -36\nKPX bracketleft Idieresis -36\nKPX bracketleft Yacute -63\n\nKPX backslash m -36\nKPX backslash braceright -36\n\nKPX m percent -36\nKPX m ampersand -36\nKPX m quotesingle -36\nKPX m asterisk -36\nKPX m hyphen -36\nKPX m seven -112\nKPX m nine -112\nKPX m colon -36\nKPX m less -149\nKPX m Y -36\nKPX m Z -36\nKPX m backslash -36\nKPX m questiondown -36\nKPX m Aacute -36\nKPX m Egrave -36\nKPX m Icircumflex -36\nKPX m Eth -36\nKPX m agrave -36\nKPX m Hbar -112\nKPX m lacute -149\n\nKPX braceright dollar -73\nKPX braceright percent -73\nKPX braceright ampersand -36\nKPX braceright quotesingle -36\nKPX braceright hyphen -36\nKPX braceright two -36\nKPX braceright seven -188\nKPX braceright nine -178\nKPX braceright colon -112\nKPX braceright semicolon -112\nKPX braceright less -225\nKPX braceright Y -36\nKPX braceright Z -36\nKPX braceright backslash -36\nKPX braceright questiondown -36\nKPX braceright Aacute -36\nKPX braceright Egrave -36\nKPX braceright Icircumflex -36\nKPX braceright Eth -36\nKPX braceright Hbar -188\nKPX braceright lacute -225\n\n\n\nKPX ordfeminine bracketleft -36\n\nKPX guillemotleft bracketleft -36\n\nKPX logicalnot bracketleft -36\n\nKPX sfthyphen bracketleft -36\n\n\n\nKPX acute bracketleft -63\n\nKPX mu bracketleft -63\n\nKPX paragraph bracketleft -63\n\nKPX periodcentered bracketleft -63\n\nKPX cedilla bracketleft -63\n\nKPX questiondown m -36\nKPX questiondown braceright -36\n\nKPX Aacute m -36\nKPX Aacute braceright -36\n\nKPX Acircumflex dollar 57\nKPX Acircumflex ampersand -36\nKPX Acircumflex asterisk -36\nKPX Acircumflex two -36\nKPX Acircumflex four -36\nKPX Acircumflex seven -159\nKPX Acircumflex nine -131\nKPX Acircumflex colon -112\nKPX Acircumflex less -159\nKPX Acircumflex F -36\nKPX Acircumflex G -36\nKPX Acircumflex H -36\nKPX Acircumflex I -73\nKPX Acircumflex R -36\nKPX Acircumflex T -36\nKPX Acircumflex W -36\nKPX Acircumflex Y -120\nKPX Acircumflex Z -83\nKPX Acircumflex backslash -139\nKPX Acircumflex m -73\nKPX Acircumflex copyright -36\nKPX Acircumflex ordfeminine -36\nKPX Acircumflex guillemotleft -36\nKPX Acircumflex logicalnot -36\nKPX Acircumflex sfthyphen -36\nKPX Acircumflex acute -36\nKPX Acircumflex mu -36\nKPX Acircumflex paragraph -36\nKPX Acircumflex periodcentered -36\nKPX Acircumflex cedilla -36\nKPX Acircumflex questiondown -139\nKPX Acircumflex Aacute -139\nKPX Acircumflex Acircumflex 57\nKPX Acircumflex Adieresis 57\nKPX Acircumflex AE 57\nKPX Acircumflex Egrave -36\nKPX Acircumflex Ecircumflex -36\nKPX Acircumflex Igrave -36\nKPX Acircumflex Iacute -36\nKPX Acircumflex Icircumflex -36\nKPX Acircumflex Ntilde -36\nKPX Acircumflex Oacute -36\nKPX Acircumflex Otilde -36\nKPX Acircumflex multiply -36\nKPX Acircumflex Ugrave -36\nKPX Acircumflex Ucircumflex -36\nKPX Acircumflex Yacute -36\nKPX Acircumflex Thorn -36\nKPX Acircumflex acircumflex -36\nKPX Acircumflex Dcaron -36\nKPX Acircumflex dcaron -36\nKPX Acircumflex Dcroat -36\nKPX Acircumflex dmacron -36\nKPX Acircumflex Emacron -36\nKPX Acircumflex emacron -36\nKPX Acircumflex Hcircumflex -159\nKPX Acircumflex hcircumflex -36\nKPX Acircumflex Hbar -159\nKPX Acircumflex hbar -36\nKPX Acircumflex Kcommaaccent -112\nKPX Acircumflex kcommaaccent -83\nKPX Acircumflex kgreenlandic -159\nKPX Acircumflex Lacute -139\nKPX Acircumflex lacute -159\nKPX Acircumflex uni01F0 -36\nKPX Acircumflex uni01F1 -36\n\nKPX Adieresis dollar 57\nKPX Adieresis ampersand -36\nKPX Adieresis asterisk -36\nKPX Adieresis two -36\nKPX Adieresis four -36\nKPX Adieresis seven -159\nKPX Adieresis nine -131\nKPX Adieresis colon -112\nKPX Adieresis less -159\nKPX Adieresis F -36\nKPX Adieresis G -36\nKPX Adieresis H -36\nKPX Adieresis I -73\nKPX Adieresis R -36\nKPX Adieresis T -36\nKPX Adieresis W -36\nKPX Adieresis Y -120\nKPX Adieresis Z -83\nKPX Adieresis backslash -139\nKPX Adieresis m -73\nKPX Adieresis copyright -36\nKPX Adieresis ordfeminine -36\nKPX Adieresis guillemotleft -36\nKPX Adieresis logicalnot -36\nKPX Adieresis sfthyphen -36\nKPX Adieresis acute -36\nKPX Adieresis mu -36\nKPX Adieresis paragraph -36\nKPX Adieresis periodcentered -36\nKPX Adieresis cedilla -36\nKPX Adieresis questiondown -139\nKPX Adieresis Aacute -139\nKPX Adieresis Acircumflex 57\nKPX Adieresis Adieresis 57\nKPX Adieresis AE 57\nKPX Adieresis Egrave -36\nKPX Adieresis Ecircumflex -36\nKPX Adieresis Igrave -36\nKPX Adieresis Iacute -36\nKPX Adieresis Icircumflex -36\nKPX Adieresis Ntilde -36\nKPX Adieresis Oacute -36\nKPX Adieresis Otilde -36\nKPX Adieresis multiply -36\nKPX Adieresis Ugrave -36\nKPX Adieresis Ucircumflex -36\nKPX Adieresis Yacute -36\nKPX Adieresis Thorn -36\nKPX Adieresis acircumflex -36\nKPX Adieresis Dcaron -36\nKPX Adieresis dcaron -36\nKPX Adieresis Dcroat -36\nKPX Adieresis dmacron -36\nKPX Adieresis Emacron -36\nKPX Adieresis emacron -36\nKPX Adieresis Hcircumflex -159\nKPX Adieresis hcircumflex -36\nKPX Adieresis Hbar -159\nKPX Adieresis hbar -36\nKPX Adieresis Kcommaaccent -112\nKPX Adieresis kcommaaccent -83\nKPX Adieresis kgreenlandic -159\nKPX Adieresis Lacute -139\nKPX Adieresis lacute -159\nKPX Adieresis uni01F0 -36\nKPX Adieresis uni01F1 -36\n\nKPX AE dollar 57\nKPX AE ampersand -36\nKPX AE asterisk -36\nKPX AE two -36\nKPX AE four -36\nKPX AE seven -159\nKPX AE nine -131\nKPX AE colon -112\nKPX AE less -159\nKPX AE F -36\nKPX AE G -36\nKPX AE H -36\nKPX AE I -73\nKPX AE R -36\nKPX AE T -36\nKPX AE W -36\nKPX AE Y -120\nKPX AE Z -83\nKPX AE m -73\nKPX AE copyright -36\nKPX AE ordfeminine -36\nKPX AE guillemotleft -36\nKPX AE logicalnot -36\nKPX AE sfthyphen -36\nKPX AE acute -36\nKPX AE mu -36\nKPX AE paragraph -36\nKPX AE periodcentered -36\nKPX AE cedilla -36\nKPX AE Acircumflex 57\nKPX AE Adieresis 57\nKPX AE AE 57\nKPX AE Egrave -36\nKPX AE Ecircumflex -36\nKPX AE Igrave -36\nKPX AE Iacute -36\nKPX AE Icircumflex -36\nKPX AE Ntilde -36\nKPX AE Oacute -36\nKPX AE Otilde -36\nKPX AE multiply -36\nKPX AE Ugrave -36\nKPX AE Ucircumflex -36\nKPX AE Yacute -36\nKPX AE Thorn -36\nKPX AE acircumflex -36\nKPX AE Dcaron -36\nKPX AE dcaron -36\nKPX AE Dcroat -36\nKPX AE dmacron -36\nKPX AE emacron -36\nKPX AE Hcircumflex -159\nKPX AE hcircumflex -36\nKPX AE Hbar -159\nKPX AE hbar -36\nKPX AE Kcommaaccent -112\nKPX AE kcommaaccent -83\nKPX AE kgreenlandic -159\nKPX AE lacute -159\nKPX AE uni01F0 -36\nKPX AE uni01F1 -36\n\nKPX Egrave less -36\nKPX Egrave m -36\nKPX Egrave braceright -36\nKPX Egrave lacute -36\n\nKPX Icircumflex less -36\nKPX Icircumflex m -36\nKPX Icircumflex braceright -36\nKPX Icircumflex lacute -36\n\nKPX Eth dollar -36\nKPX Eth nine -36\nKPX Eth less -112\nKPX Eth m -36\nKPX Eth braceright -36\nKPX Eth Acircumflex -36\nKPX Eth Adieresis -36\nKPX Eth AE -36\nKPX Eth kgreenlandic -112\nKPX Eth lacute -112\nKPX Eth uni01F4 -112\n\nKPX Ograve dollar -36\nKPX Ograve nine -36\nKPX Ograve less -112\nKPX Ograve m -36\nKPX Ograve braceright -36\nKPX Ograve lacute -112\n\nKPX Yacute bracketleft -36\n\nKPX agrave seven -73\nKPX agrave less -102\nKPX agrave m -36\nKPX agrave braceright -36\nKPX agrave Hbar -73\nKPX agrave lacute -102\n\nKPX ucircumflex dollar 47\nKPX ucircumflex two -73\nKPX ucircumflex seven -282\nKPX ucircumflex eight -102\nKPX ucircumflex nine -225\nKPX ucircumflex colon -188\nKPX ucircumflex less -272\nKPX ucircumflex H -36\nKPX ucircumflex R -36\nKPX ucircumflex X -36\nKPX ucircumflex backslash -188\nKPX ucircumflex ordfeminine -36\nKPX ucircumflex guillemotleft -36\nKPX ucircumflex logicalnot -36\nKPX ucircumflex sfthyphen -36\nKPX ucircumflex acute -36\nKPX ucircumflex mu -36\nKPX ucircumflex paragraph -36\nKPX ucircumflex periodcentered -36\nKPX ucircumflex cedilla -36\nKPX ucircumflex guillemotright -36\nKPX ucircumflex onequarter -36\nKPX ucircumflex onehalf -36\nKPX ucircumflex threequarters -36\nKPX ucircumflex questiondown -188\nKPX ucircumflex Aacute -188\nKPX ucircumflex Yacute -36\nKPX ucircumflex Hbar -282\nKPX ucircumflex Idot -102\nKPX ucircumflex dotlessi -36\nKPX ucircumflex lacute -272\n\nKPX ydieresis dollar 47\nKPX ydieresis two -73\nKPX ydieresis seven -282\nKPX ydieresis eight -102\nKPX ydieresis nine -225\nKPX ydieresis colon -188\nKPX ydieresis less -272\nKPX ydieresis H -36\nKPX ydieresis R -36\nKPX ydieresis X -36\nKPX ydieresis backslash -188\nKPX ydieresis ordfeminine -36\nKPX ydieresis guillemotleft -36\nKPX ydieresis logicalnot -36\nKPX ydieresis sfthyphen -36\nKPX ydieresis acute -36\nKPX ydieresis mu -36\nKPX ydieresis paragraph -36\nKPX ydieresis periodcentered -36\nKPX ydieresis cedilla -36\nKPX ydieresis guillemotright -36\nKPX ydieresis onequarter -36\nKPX ydieresis onehalf -36\nKPX ydieresis threequarters -36\nKPX ydieresis questiondown -188\nKPX ydieresis Aacute -188\nKPX ydieresis Yacute -36\nKPX ydieresis Hbar -282\nKPX ydieresis Idot -102\nKPX ydieresis dotlessi -36\nKPX ydieresis lacute -272\n\nKPX Abreve O -193\n\n\nKPX Edotaccent dollar -83\nKPX Edotaccent ampersand -102\nKPX Edotaccent seven -149\nKPX Edotaccent nine -112\nKPX Edotaccent colon -83\nKPX Edotaccent less -131\nKPX Edotaccent D -45\nKPX Edotaccent H -92\nKPX Edotaccent R -92\nKPX Edotaccent X -92\nKPX Edotaccent backslash -112\nKPX Edotaccent m -112\nKPX Edotaccent braceright -36\nKPX Edotaccent cent -45\nKPX Edotaccent sterling -45\nKPX Edotaccent currency -45\nKPX Edotaccent yen -45\nKPX Edotaccent brokenbar -45\nKPX Edotaccent section -45\nKPX Edotaccent ordfeminine -92\nKPX Edotaccent guillemotleft -92\nKPX Edotaccent logicalnot -92\nKPX Edotaccent sfthyphen -92\nKPX Edotaccent acute -92\nKPX Edotaccent mu -92\nKPX Edotaccent paragraph -92\nKPX Edotaccent periodcentered -92\nKPX Edotaccent cedilla -92\nKPX Edotaccent guillemotright -92\nKPX Edotaccent onequarter -92\nKPX Edotaccent onehalf -92\nKPX Edotaccent threequarters -92\nKPX Edotaccent questiondown -112\nKPX Edotaccent Aacute -112\nKPX Edotaccent Egrave -102\nKPX Edotaccent Icircumflex -102\nKPX Edotaccent Yacute -92\nKPX Edotaccent Hbar -149\nKPX Edotaccent dotlessi -92\nKPX Edotaccent lacute -131\n\nKPX edotaccent F -45\nKPX edotaccent G -36\nKPX edotaccent H -45\nKPX edotaccent J -36\nKPX edotaccent K -36\nKPX edotaccent P -36\nKPX edotaccent Q -36\nKPX edotaccent R -45\nKPX edotaccent T -36\nKPX edotaccent U -36\nKPX edotaccent bracketleft -55\nKPX edotaccent m -73\nKPX edotaccent copyright -45\nKPX edotaccent ordfeminine -45\nKPX edotaccent guillemotleft -45\nKPX edotaccent logicalnot -45\nKPX edotaccent sfthyphen -45\nKPX edotaccent threesuperior -36\nKPX edotaccent acute -45\nKPX edotaccent mu -45\nKPX edotaccent paragraph -45\nKPX edotaccent periodcentered -45\nKPX edotaccent cedilla -45\nKPX edotaccent Eacute -45\nKPX edotaccent Idieresis -45\nKPX edotaccent Ntilde 72\nKPX edotaccent Yacute -45\nKPX edotaccent aacute -36\nKPX edotaccent Cdotaccent -36\nKPX edotaccent edotaccent -36\nKPX edotaccent ecaron -36\n\nKPX Ecaron dollar -83\nKPX Ecaron ampersand -102\nKPX Ecaron seven -149\nKPX Ecaron nine -112\nKPX Ecaron colon -83\nKPX Ecaron less -131\nKPX Ecaron D -45\nKPX Ecaron H -92\nKPX Ecaron R -92\nKPX Ecaron X -92\nKPX Ecaron backslash -112\nKPX Ecaron m -112\nKPX Ecaron braceright -36\nKPX Ecaron cent -45\nKPX Ecaron sterling -45\nKPX Ecaron currency -45\nKPX Ecaron yen -45\nKPX Ecaron brokenbar -45\nKPX Ecaron section -45\nKPX Ecaron ordfeminine -92\nKPX Ecaron guillemotleft -92\nKPX Ecaron logicalnot -92\nKPX Ecaron sfthyphen -92\nKPX Ecaron acute -92\nKPX Ecaron mu -92\nKPX Ecaron paragraph -92\nKPX Ecaron periodcentered -92\nKPX Ecaron cedilla -92\nKPX Ecaron guillemotright -92\nKPX Ecaron onequarter -92\nKPX Ecaron onehalf -92\nKPX Ecaron threequarters -92\nKPX Ecaron questiondown -112\nKPX Ecaron Aacute -112\nKPX Ecaron Egrave -102\nKPX Ecaron Icircumflex -102\nKPX Ecaron Yacute -92\nKPX Ecaron Hbar -149\nKPX Ecaron dotlessi -92\nKPX Ecaron lacute -131\n\nKPX ecaron F -45\nKPX ecaron G -36\nKPX ecaron H -45\nKPX ecaron J -36\nKPX ecaron K -36\nKPX ecaron P -36\nKPX ecaron Q -36\nKPX ecaron R -45\nKPX ecaron T -36\nKPX ecaron U -36\nKPX ecaron bracketleft -55\nKPX ecaron m -73\nKPX ecaron copyright -45\nKPX ecaron ordfeminine -45\nKPX ecaron guillemotleft -45\nKPX ecaron logicalnot -45\nKPX ecaron sfthyphen -45\nKPX ecaron threesuperior -36\nKPX ecaron acute -45\nKPX ecaron mu -45\nKPX ecaron paragraph -45\nKPX ecaron periodcentered -45\nKPX ecaron cedilla -45\nKPX ecaron Eacute -45\nKPX ecaron Idieresis -45\nKPX ecaron Ntilde -36\nKPX ecaron Yacute -45\nKPX ecaron aacute -36\nKPX ecaron Cdotaccent -36\nKPX ecaron edotaccent -36\nKPX ecaron ecaron -36\n\nKPX Gdotaccent dollar 38\n\nKPX Gcommaaccent dollar 38\n\nKPX Hbar dollar -159\nKPX Hbar ampersand -120\nKPX Hbar seven -36\nKPX Hbar D -339\nKPX Hbar F -348\nKPX Hbar H -348\nKPX Hbar L -63\nKPX Hbar R -348\nKPX Hbar U -301\nKPX Hbar V -339\nKPX Hbar X -311\nKPX Hbar Z -339\nKPX Hbar backslash -319\nKPX Hbar m -188\nKPX Hbar braceright -112\nKPX Hbar cent -339\nKPX Hbar sterling -339\nKPX Hbar currency -339\nKPX Hbar yen -339\nKPX Hbar brokenbar -339\nKPX Hbar section -339\nKPX Hbar copyright -348\nKPX Hbar ordfeminine -348\nKPX Hbar guillemotleft -348\nKPX Hbar logicalnot -348\nKPX Hbar sfthyphen -348\nKPX Hbar acute -348\nKPX Hbar mu -348\nKPX Hbar paragraph -348\nKPX Hbar periodcentered -348\nKPX Hbar cedilla -348\nKPX Hbar guillemotright -311\nKPX Hbar onequarter -311\nKPX Hbar onehalf -311\nKPX Hbar threequarters -311\nKPX Hbar questiondown -319\nKPX Hbar Aacute -319\nKPX Hbar Egrave -120\nKPX Hbar Eacute -348\nKPX Hbar Icircumflex -120\nKPX Hbar Idieresis -348\nKPX Hbar Yacute -348\nKPX Hbar edotaccent -301\nKPX Hbar ecaron -301\nKPX Hbar gdotaccent -339\nKPX Hbar gcommaaccent -339\nKPX Hbar Hbar -36\nKPX Hbar dotlessi -311\n\nKPX Idot equal -36\nKPX Idot Ldot -36\n\nKPX lacute dollar -159\nKPX lacute ampersand -112\nKPX lacute two -112\nKPX lacute D -282\nKPX lacute H -272\nKPX lacute L -73\nKPX lacute R -272\nKPX lacute X -235\nKPX lacute m -225\nKPX lacute braceright -149\nKPX lacute cent -282\nKPX lacute sterling -282\nKPX lacute currency -282\nKPX lacute yen -282\nKPX lacute brokenbar -282\nKPX lacute section -282\nKPX lacute ordfeminine -272\nKPX lacute guillemotleft -272\nKPX lacute logicalnot -272\nKPX lacute sfthyphen -272\nKPX lacute acute -272\nKPX lacute mu -272\nKPX lacute paragraph -272\nKPX lacute periodcentered -272\nKPX lacute cedilla -272\nKPX lacute guillemotright -235\nKPX lacute onequarter -235\nKPX lacute onehalf -235\nKPX lacute threequarters -235\nKPX lacute Egrave -112\nKPX lacute Icircumflex -112\nKPX lacute Yacute -272\nKPX lacute dotlessi -235\n\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dejavu_sans_normal_b851f57bf3783ae5089a634872aa8ce8.ufm.php",
    "content": "<?php return array (\n  'codeToName' => \n  array (\n    32 => 'space',\n    33 => 'exclam',\n    34 => 'quotedbl',\n    35 => 'numbersign',\n    36 => 'dollar',\n    37 => 'percent',\n    38 => 'ampersand',\n    39 => 'quotesingle',\n    40 => 'parenleft',\n    41 => 'parenright',\n    42 => 'asterisk',\n    43 => 'plus',\n    44 => 'comma',\n    45 => 'hyphen',\n    46 => 'period',\n    47 => 'slash',\n    48 => 'zero',\n    49 => 'one',\n    50 => 'two',\n    51 => 'three',\n    52 => 'four',\n    53 => 'five',\n    54 => 'six',\n    55 => 'seven',\n    56 => 'eight',\n    57 => 'nine',\n    58 => 'colon',\n    59 => 'semicolon',\n    60 => 'less',\n    61 => 'equal',\n    62 => 'greater',\n    63 => 'question',\n    64 => 'at',\n    65 => 'A',\n    66 => 'B',\n    67 => 'C',\n    68 => 'D',\n    69 => 'E',\n    70 => 'F',\n    71 => 'G',\n    72 => 'H',\n    73 => 'I',\n    74 => 'J',\n    75 => 'K',\n    76 => 'L',\n    77 => 'M',\n    78 => 'N',\n    79 => 'O',\n    80 => 'P',\n    81 => 'Q',\n    82 => 'R',\n    83 => 'S',\n    84 => 'T',\n    85 => 'U',\n    86 => 'V',\n    87 => 'W',\n    88 => 'X',\n    89 => 'Y',\n    90 => 'Z',\n    91 => 'bracketleft',\n    92 => 'backslash',\n    93 => 'bracketright',\n    94 => 'asciicircum',\n    95 => 'underscore',\n    96 => 'grave',\n    97 => 'a',\n    98 => 'b',\n    99 => 'c',\n    100 => 'd',\n    101 => 'e',\n    102 => 'f',\n    103 => 'g',\n    104 => 'h',\n    105 => 'i',\n    106 => 'j',\n    107 => 'k',\n    108 => 'l',\n    109 => 'm',\n    110 => 'n',\n    111 => 'o',\n    112 => 'p',\n    113 => 'q',\n    114 => 'r',\n    115 => 's',\n    116 => 't',\n    117 => 'u',\n    118 => 'v',\n    119 => 'w',\n    120 => 'x',\n    121 => 'y',\n    122 => 'z',\n    123 => 'braceleft',\n    124 => 'bar',\n    125 => 'braceright',\n    126 => 'asciitilde',\n    160 => 'nbspace',\n    161 => 'exclamdown',\n    162 => 'cent',\n    163 => 'sterling',\n    164 => 'currency',\n    165 => 'yen',\n    166 => 'brokenbar',\n    167 => 'section',\n    168 => 'dieresis',\n    169 => 'copyright',\n    170 => 'ordfeminine',\n    171 => 'guillemotleft',\n    172 => 'logicalnot',\n    173 => 'sfthyphen',\n    174 => 'registered',\n    175 => 'macron',\n    176 => 'degree',\n    177 => 'plusminus',\n    178 => 'twosuperior',\n    179 => 'threesuperior',\n    180 => 'acute',\n    181 => 'mu',\n    182 => 'paragraph',\n    183 => 'periodcentered',\n    184 => 'cedilla',\n    185 => 'onesuperior',\n    186 => 'ordmasculine',\n    187 => 'guillemotright',\n    188 => 'onequarter',\n    189 => 'onehalf',\n    190 => 'threequarters',\n    191 => 'questiondown',\n    192 => 'Agrave',\n    193 => 'Aacute',\n    194 => 'Acircumflex',\n    195 => 'Atilde',\n    196 => 'Adieresis',\n    197 => 'Aring',\n    198 => 'AE',\n    199 => 'Ccedilla',\n    200 => 'Egrave',\n    201 => 'Eacute',\n    202 => 'Ecircumflex',\n    203 => 'Edieresis',\n    204 => 'Igrave',\n    205 => 'Iacute',\n    206 => 'Icircumflex',\n    207 => 'Idieresis',\n    208 => 'Eth',\n    209 => 'Ntilde',\n    210 => 'Ograve',\n    211 => 'Oacute',\n    212 => 'Ocircumflex',\n    213 => 'Otilde',\n    214 => 'Odieresis',\n    215 => 'multiply',\n    216 => 'Oslash',\n    217 => 'Ugrave',\n    218 => 'Uacute',\n    219 => 'Ucircumflex',\n    220 => 'Udieresis',\n    221 => 'Yacute',\n    222 => 'Thorn',\n    223 => 'germandbls',\n    224 => 'agrave',\n    225 => 'aacute',\n    226 => 'acircumflex',\n    227 => 'atilde',\n    228 => 'adieresis',\n    229 => 'aring',\n    230 => 'ae',\n    231 => 'ccedilla',\n    232 => 'egrave',\n    233 => 'eacute',\n    234 => 'ecircumflex',\n    235 => 'edieresis',\n    236 => 'igrave',\n    237 => 'iacute',\n    238 => 'icircumflex',\n    239 => 'idieresis',\n    240 => 'eth',\n    241 => 'ntilde',\n    242 => 'ograve',\n    243 => 'oacute',\n    244 => 'ocircumflex',\n    245 => 'otilde',\n    246 => 'odieresis',\n    247 => 'divide',\n    248 => 'oslash',\n    249 => 'ugrave',\n    250 => 'uacute',\n    251 => 'ucircumflex',\n    252 => 'udieresis',\n    253 => 'yacute',\n    254 => 'thorn',\n    255 => 'ydieresis',\n    256 => 'Amacron',\n    257 => 'amacron',\n    258 => 'Abreve',\n    259 => 'abreve',\n    260 => 'Aogonek',\n    261 => 'aogonek',\n    262 => 'Cacute',\n    263 => 'cacute',\n    264 => 'Ccircumflex',\n    265 => 'ccircumflex',\n    266 => 'Cdotaccent',\n    267 => 'cdotaccent',\n    268 => 'Ccaron',\n    269 => 'ccaron',\n    270 => 'Dcaron',\n    271 => 'dcaron',\n    272 => 'Dcroat',\n    273 => 'dmacron',\n    274 => 'Emacron',\n    275 => 'emacron',\n    276 => 'Ebreve',\n    277 => 'ebreve',\n    278 => 'Edotaccent',\n    279 => 'edotaccent',\n    280 => 'Eogonek',\n    281 => 'eogonek',\n    282 => 'Ecaron',\n    283 => 'ecaron',\n    284 => 'Gcircumflex',\n    285 => 'gcircumflex',\n    286 => 'Gbreve',\n    287 => 'gbreve',\n    288 => 'Gdotaccent',\n    289 => 'gdotaccent',\n    290 => 'Gcommaaccent',\n    291 => 'gcommaaccent',\n    292 => 'Hcircumflex',\n    293 => 'hcircumflex',\n    294 => 'Hbar',\n    295 => 'hbar',\n    296 => 'Itilde',\n    297 => 'itilde',\n    298 => 'Imacron',\n    299 => 'imacron',\n    300 => 'Ibreve',\n    301 => 'ibreve',\n    302 => 'Iogonek',\n    303 => 'iogonek',\n    304 => 'Idot',\n    305 => 'dotlessi',\n    306 => 'IJ',\n    307 => 'ij',\n    308 => 'Jcircumflex',\n    309 => 'jcircumflex',\n    310 => 'Kcommaaccent',\n    311 => 'kcommaaccent',\n    312 => 'kgreenlandic',\n    313 => 'Lacute',\n    314 => 'lacute',\n    315 => 'Lcommaaccent',\n    316 => 'lcommaaccent',\n    317 => 'Lcaron',\n    318 => 'lcaron',\n    319 => 'Ldot',\n    320 => 'ldot',\n    321 => 'Lslash',\n    322 => 'lslash',\n    323 => 'Nacute',\n    324 => 'nacute',\n    325 => 'Ncommaaccent',\n    326 => 'ncommaaccent',\n    327 => 'Ncaron',\n    328 => 'ncaron',\n    329 => 'napostrophe',\n    330 => 'Eng',\n    331 => 'eng',\n    332 => 'Omacron',\n    333 => 'omacron',\n    334 => 'Obreve',\n    335 => 'obreve',\n    336 => 'Ohungarumlaut',\n    337 => 'ohungarumlaut',\n    338 => 'OE',\n    339 => 'oe',\n    340 => 'Racute',\n    341 => 'racute',\n    342 => 'Rcommaaccent',\n    343 => 'rcommaaccent',\n    344 => 'Rcaron',\n    345 => 'rcaron',\n    346 => 'Sacute',\n    347 => 'sacute',\n    348 => 'Scircumflex',\n    349 => 'scircumflex',\n    350 => 'Scedilla',\n    351 => 'scedilla',\n    352 => 'Scaron',\n    353 => 'scaron',\n    354 => 'Tcommaaccent',\n    355 => 'tcommaaccent',\n    356 => 'Tcaron',\n    357 => 'tcaron',\n    358 => 'Tbar',\n    359 => 'tbar',\n    360 => 'Utilde',\n    361 => 'utilde',\n    362 => 'Umacron',\n    363 => 'umacron',\n    364 => 'Ubreve',\n    365 => 'ubreve',\n    366 => 'Uring',\n    367 => 'uring',\n    368 => 'Uhungarumlaut',\n    369 => 'uhungarumlaut',\n    370 => 'Uogonek',\n    371 => 'uogonek',\n    372 => 'Wcircumflex',\n    373 => 'wcircumflex',\n    374 => 'Ycircumflex',\n    375 => 'ycircumflex',\n    376 => 'Ydieresis',\n    377 => 'Zacute',\n    378 => 'zacute',\n    379 => 'Zdotaccent',\n    380 => 'zdotaccent',\n    381 => 'Zcaron',\n    382 => 'zcaron',\n    383 => 'longs',\n    384 => 'uni0180',\n    385 => 'uni0181',\n    386 => 'uni0182',\n    387 => 'uni0183',\n    388 => 'uni0184',\n    389 => 'uni0185',\n    390 => 'uni0186',\n    391 => 'uni0187',\n    392 => 'uni0188',\n    393 => 'uni0189',\n    394 => 'uni018A',\n    395 => 'uni018B',\n    396 => 'uni018C',\n    397 => 'uni018D',\n    398 => 'uni018E',\n    399 => 'uni018F',\n    400 => 'uni0190',\n    401 => 'uni0191',\n    402 => 'florin',\n    403 => 'uni0193',\n    404 => 'uni0194',\n    405 => 'uni0195',\n    406 => 'uni0196',\n    407 => 'uni0197',\n    408 => 'uni0198',\n    409 => 'uni0199',\n    410 => 'uni019A',\n    411 => 'uni019B',\n    412 => 'uni019C',\n    413 => 'uni019D',\n    414 => 'uni019E',\n    415 => 'uni019F',\n    416 => 'Ohorn',\n    417 => 'ohorn',\n    418 => 'uni01A2',\n    419 => 'uni01A3',\n    420 => 'uni01A4',\n    421 => 'uni01A5',\n    422 => 'uni01A6',\n    423 => 'uni01A7',\n    424 => 'uni01A8',\n    425 => 'uni01A9',\n    426 => 'uni01AA',\n    427 => 'uni01AB',\n    428 => 'uni01AC',\n    429 => 'uni01AD',\n    430 => 'uni01AE',\n    431 => 'Uhorn',\n    432 => 'uhorn',\n    433 => 'uni01B1',\n    434 => 'uni01B2',\n    435 => 'uni01B3',\n    436 => 'uni01B4',\n    437 => 'uni01B5',\n    438 => 'uni01B6',\n    439 => 'uni01B7',\n    440 => 'uni01B8',\n    441 => 'uni01B9',\n    442 => 'uni01BA',\n    443 => 'uni01BB',\n    444 => 'uni01BC',\n    445 => 'uni01BD',\n    446 => 'uni01BE',\n    447 => 'uni01BF',\n    448 => 'uni01C0',\n    449 => 'uni01C1',\n    450 => 'uni01C2',\n    451 => 'uni01C3',\n    452 => 'uni01C4',\n    453 => 'uni01C5',\n    454 => 'uni01C6',\n    455 => 'uni01C7',\n    456 => 'uni01C8',\n    457 => 'uni01C9',\n    458 => 'uni01CA',\n    459 => 'uni01CB',\n    460 => 'uni01CC',\n    461 => 'uni01CD',\n    462 => 'uni01CE',\n    463 => 'uni01CF',\n    464 => 'uni01D0',\n    465 => 'uni01D1',\n    466 => 'uni01D2',\n    467 => 'uni01D3',\n    468 => 'uni01D4',\n    469 => 'uni01D5',\n    470 => 'uni01D6',\n    471 => 'uni01D7',\n    472 => 'uni01D8',\n    473 => 'uni01D9',\n    474 => 'uni01DA',\n    475 => 'uni01DB',\n    476 => 'uni01DC',\n    477 => 'uni01DD',\n    478 => 'uni01DE',\n    479 => 'uni01DF',\n    480 => 'uni01E0',\n    481 => 'uni01E1',\n    482 => 'uni01E2',\n    483 => 'uni01E3',\n    484 => 'uni01E4',\n    485 => 'uni01E5',\n    486 => 'Gcaron',\n    487 => 'gcaron',\n    488 => 'uni01E8',\n    489 => 'uni01E9',\n    490 => 'uni01EA',\n    491 => 'uni01EB',\n    492 => 'uni01EC',\n    493 => 'uni01ED',\n    494 => 'uni01EE',\n    495 => 'uni01EF',\n    496 => 'uni01F0',\n    497 => 'uni01F1',\n    498 => 'uni01F2',\n    499 => 'uni01F3',\n    500 => 'uni01F4',\n    501 => 'uni01F5',\n    502 => 'uni01F6',\n    503 => 'uni01F7',\n    504 => 'uni01F8',\n    505 => 'uni01F9',\n    506 => 'Aringacute',\n    507 => 'aringacute',\n    508 => 'AEacute',\n    509 => 'aeacute',\n    510 => 'Oslashacute',\n    511 => 'oslashacute',\n    512 => 'uni0200',\n    513 => 'uni0201',\n    514 => 'uni0202',\n    515 => 'uni0203',\n    516 => 'uni0204',\n    517 => 'uni0205',\n    518 => 'uni0206',\n    519 => 'uni0207',\n    520 => 'uni0208',\n    521 => 'uni0209',\n    522 => 'uni020A',\n    523 => 'uni020B',\n    524 => 'uni020C',\n    525 => 'uni020D',\n    526 => 'uni020E',\n    527 => 'uni020F',\n    528 => 'uni0210',\n    529 => 'uni0211',\n    530 => 'uni0212',\n    531 => 'uni0213',\n    532 => 'uni0214',\n    533 => 'uni0215',\n    534 => 'uni0216',\n    535 => 'uni0217',\n    536 => 'Scommaaccent',\n    537 => 'scommaaccent',\n    538 => 'uni021A',\n    539 => 'uni021B',\n    540 => 'uni021C',\n    541 => 'uni021D',\n    542 => 'uni021E',\n    543 => 'uni021F',\n    544 => 'uni0220',\n    545 => 'uni0221',\n    546 => 'uni0222',\n    547 => 'uni0223',\n    548 => 'uni0224',\n    549 => 'uni0225',\n    550 => 'uni0226',\n    551 => 'uni0227',\n    552 => 'uni0228',\n    553 => 'uni0229',\n    554 => 'uni022A',\n    555 => 'uni022B',\n    556 => 'uni022C',\n    557 => 'uni022D',\n    558 => 'uni022E',\n    559 => 'uni022F',\n    560 => 'uni0230',\n    561 => 'uni0231',\n    562 => 'uni0232',\n    563 => 'uni0233',\n    564 => 'uni0234',\n    565 => 'uni0235',\n    566 => 'uni0236',\n    567 => 'dotlessj',\n    568 => 'uni0238',\n    569 => 'uni0239',\n    570 => 'uni023A',\n    571 => 'uni023B',\n    572 => 'uni023C',\n    573 => 'uni023D',\n    574 => 'uni023E',\n    575 => 'uni023F',\n    576 => 'uni0240',\n    577 => 'uni0241',\n    578 => 'uni0242',\n    579 => 'uni0243',\n    580 => 'uni0244',\n    581 => 'uni0245',\n    582 => 'uni0246',\n    583 => 'uni0247',\n    584 => 'uni0248',\n    585 => 'uni0249',\n    586 => 'uni024A',\n    587 => 'uni024B',\n    588 => 'uni024C',\n    589 => 'uni024D',\n    590 => 'uni024E',\n    591 => 'uni024F',\n    592 => 'uni0250',\n    593 => 'uni0251',\n    594 => 'uni0252',\n    595 => 'uni0253',\n    596 => 'uni0254',\n    597 => 'uni0255',\n    598 => 'uni0256',\n    599 => 'uni0257',\n    600 => 'uni0258',\n    601 => 'uni0259',\n    602 => 'uni025A',\n    603 => 'uni025B',\n    604 => 'uni025C',\n    605 => 'uni025D',\n    606 => 'uni025E',\n    607 => 'uni025F',\n    608 => 'uni0260',\n    609 => 'uni0261',\n    610 => 'uni0262',\n    611 => 'uni0263',\n    612 => 'uni0264',\n    613 => 'uni0265',\n    614 => 'uni0266',\n    615 => 'uni0267',\n    616 => 'uni0268',\n    617 => 'uni0269',\n    618 => 'uni026A',\n    619 => 'uni026B',\n    620 => 'uni026C',\n    621 => 'uni026D',\n    622 => 'uni026E',\n    623 => 'uni026F',\n    624 => 'uni0270',\n    625 => 'uni0271',\n    626 => 'uni0272',\n    627 => 'uni0273',\n    628 => 'uni0274',\n    629 => 'uni0275',\n    630 => 'uni0276',\n    631 => 'uni0277',\n    632 => 'uni0278',\n    633 => 'uni0279',\n    634 => 'uni027A',\n    635 => 'uni027B',\n    636 => 'uni027C',\n    637 => 'uni027D',\n    638 => 'uni027E',\n    639 => 'uni027F',\n    640 => 'uni0280',\n    641 => 'uni0281',\n    642 => 'uni0282',\n    643 => 'uni0283',\n    644 => 'uni0284',\n    645 => 'uni0285',\n    646 => 'uni0286',\n    647 => 'uni0287',\n    648 => 'uni0288',\n    649 => 'uni0289',\n    650 => 'uni028A',\n    651 => 'uni028B',\n    652 => 'uni028C',\n    653 => 'uni028D',\n    654 => 'uni028E',\n    655 => 'uni028F',\n    656 => 'uni0290',\n    657 => 'uni0291',\n    658 => 'uni0292',\n    659 => 'uni0293',\n    660 => 'uni0294',\n    661 => 'uni0295',\n    662 => 'uni0296',\n    663 => 'uni0297',\n    664 => 'uni0298',\n    665 => 'uni0299',\n    666 => 'uni029A',\n    667 => 'uni029B',\n    668 => 'uni029C',\n    669 => 'uni029D',\n    670 => 'uni029E',\n    671 => 'uni029F',\n    672 => 'uni02A0',\n    673 => 'uni02A1',\n    674 => 'uni02A2',\n    675 => 'uni02A3',\n    676 => 'uni02A4',\n    677 => 'uni02A5',\n    678 => 'uni02A6',\n    679 => 'uni02A7',\n    680 => 'uni02A8',\n    681 => 'uni02A9',\n    682 => 'uni02AA',\n    683 => 'uni02AB',\n    684 => 'uni02AC',\n    685 => 'uni02AD',\n    686 => 'uni02AE',\n    687 => 'uni02AF',\n    688 => 'uni02B0',\n    689 => 'uni02B1',\n    690 => 'uni02B2',\n    691 => 'uni02B3',\n    692 => 'uni02B4',\n    693 => 'uni02B5',\n    694 => 'uni02B6',\n    695 => 'uni02B7',\n    696 => 'uni02B8',\n    697 => 'uni02B9',\n    698 => 'uni02BA',\n    699 => 'uni02BB',\n    700 => 'uni02BC',\n    701 => 'uni02BD',\n    702 => 'uni02BE',\n    703 => 'uni02BF',\n    704 => 'uni02C0',\n    705 => 'uni02C1',\n    706 => 'uni02C2',\n    707 => 'uni02C3',\n    708 => 'uni02C4',\n    709 => 'uni02C5',\n    710 => 'circumflex',\n    711 => 'caron',\n    712 => 'uni02C8',\n    713 => 'uni02C9',\n    714 => 'uni02CA',\n    715 => 'uni02CB',\n    716 => 'uni02CC',\n    717 => 'uni02CD',\n    718 => 'uni02CE',\n    719 => 'uni02CF',\n    720 => 'uni02D0',\n    721 => 'uni02D1',\n    722 => 'uni02D2',\n    723 => 'uni02D3',\n    724 => 'uni02D4',\n    725 => 'uni02D5',\n    726 => 'uni02D6',\n    727 => 'uni02D7',\n    728 => 'breve',\n    729 => 'dotaccent',\n    730 => 'ring',\n    731 => 'ogonek',\n    732 => 'tilde',\n    733 => 'hungarumlaut',\n    734 => 'uni02DE',\n    735 => 'uni02DF',\n    736 => 'uni02E0',\n    737 => 'uni02E1',\n    738 => 'uni02E2',\n    739 => 'uni02E3',\n    740 => 'uni02E4',\n    741 => 'uni02E5',\n    742 => 'uni02E6',\n    743 => 'uni02E7',\n    744 => 'uni02E8',\n    745 => 'uni02E9',\n    748 => 'uni02EC',\n    749 => 'uni02ED',\n    750 => 'uni02EE',\n    755 => 'uni02F3',\n    759 => 'uni02F7',\n    768 => 'gravecomb',\n    769 => 'acutecomb',\n    770 => 'uni0302',\n    771 => 'tildecomb',\n    772 => 'uni0304',\n    773 => 'uni0305',\n    774 => 'uni0306',\n    775 => 'uni0307',\n    776 => 'uni0308',\n    777 => 'hookabovecomb',\n    778 => 'uni030A',\n    779 => 'uni030B',\n    780 => 'uni030C',\n    781 => 'uni030D',\n    782 => 'uni030E',\n    783 => 'uni030F',\n    784 => 'uni0310',\n    785 => 'uni0311',\n    786 => 'uni0312',\n    787 => 'uni0313',\n    788 => 'uni0314',\n    789 => 'uni0315',\n    790 => 'uni0316',\n    791 => 'uni0317',\n    792 => 'uni0318',\n    793 => 'uni0319',\n    794 => 'uni031A',\n    795 => 'uni031B',\n    796 => 'uni031C',\n    797 => 'uni031D',\n    798 => 'uni031E',\n    799 => 'uni031F',\n    800 => 'uni0320',\n    801 => 'uni0321',\n    802 => 'uni0322',\n    803 => 'dotbelowcomb',\n    804 => 'uni0324',\n    805 => 'uni0325',\n    806 => 'uni0326',\n    807 => 'uni0327',\n    808 => 'uni0328',\n    809 => 'uni0329',\n    810 => 'uni032A',\n    811 => 'uni032B',\n    812 => 'uni032C',\n    813 => 'uni032D',\n    814 => 'uni032E',\n    815 => 'uni032F',\n    816 => 'uni0330',\n    817 => 'uni0331',\n    818 => 'uni0332',\n    819 => 'uni0333',\n    820 => 'uni0334',\n    821 => 'uni0335',\n    822 => 'uni0336',\n    823 => 'uni0337',\n    824 => 'uni0338',\n    825 => 'uni0339',\n    826 => 'uni033A',\n    827 => 'uni033B',\n    828 => 'uni033C',\n    829 => 'uni033D',\n    830 => 'uni033E',\n    831 => 'uni033F',\n    832 => 'uni0340',\n    833 => 'uni0341',\n    834 => 'uni0342',\n    835 => 'uni0343',\n    836 => 'uni0344',\n    837 => 'uni0345',\n    838 => 'uni0346',\n    839 => 'uni0347',\n    840 => 'uni0348',\n    841 => 'uni0349',\n    842 => 'uni034A',\n    843 => 'uni034B',\n    844 => 'uni034C',\n    845 => 'uni034D',\n    846 => 'uni034E',\n    847 => 'uni034F',\n    849 => 'uni0351',\n    850 => 'uni0352',\n    851 => 'uni0353',\n    855 => 'uni0357',\n    856 => 'uni0358',\n    858 => 'uni035A',\n    860 => 'uni035C',\n    861 => 'uni035D',\n    862 => 'uni035E',\n    863 => 'uni035F',\n    864 => 'uni0360',\n    865 => 'uni0361',\n    866 => 'uni0362',\n    880 => 'uni0370',\n    881 => 'uni0371',\n    882 => 'uni0372',\n    883 => 'uni0373',\n    884 => 'uni0374',\n    885 => 'uni0375',\n    886 => 'uni0376',\n    887 => 'uni0377',\n    890 => 'uni037A',\n    891 => 'uni037B',\n    892 => 'uni037C',\n    893 => 'uni037D',\n    894 => 'uni037E',\n    895 => 'uni037F',\n    900 => 'tonos',\n    901 => 'dieresistonos',\n    902 => 'Alphatonos',\n    903 => 'anoteleia',\n    904 => 'Epsilontonos',\n    905 => 'Etatonos',\n    906 => 'Iotatonos',\n    908 => 'Omicrontonos',\n    910 => 'Upsilontonos',\n    911 => 'Omegatonos',\n    912 => 'iotadieresistonos',\n    913 => 'Alpha',\n    914 => 'Beta',\n    915 => 'Gamma',\n    916 => 'uni0394',\n    917 => 'Epsilon',\n    918 => 'Zeta',\n    919 => 'Eta',\n    920 => 'Theta',\n    921 => 'Iota',\n    922 => 'Kappa',\n    923 => 'Lambda',\n    924 => 'Mu',\n    925 => 'Nu',\n    926 => 'Xi',\n    927 => 'Omicron',\n    928 => 'Pi',\n    929 => 'Rho',\n    931 => 'Sigma',\n    932 => 'Tau',\n    933 => 'Upsilon',\n    934 => 'Phi',\n    935 => 'Chi',\n    936 => 'Psi',\n    937 => 'Omega',\n    938 => 'Iotadieresis',\n    939 => 'Upsilondieresis',\n    940 => 'alphatonos',\n    941 => 'epsilontonos',\n    942 => 'etatonos',\n    943 => 'iotatonos',\n    944 => 'upsilondieresistonos',\n    945 => 'alpha',\n    946 => 'beta',\n    947 => 'gamma',\n    948 => 'delta',\n    949 => 'epsilon',\n    950 => 'zeta',\n    951 => 'eta',\n    952 => 'theta',\n    953 => 'iota',\n    954 => 'kappa',\n    955 => 'lambda',\n    956 => 'uni03BC',\n    957 => 'nu',\n    958 => 'xi',\n    959 => 'omicron',\n    960 => 'pi',\n    961 => 'rho',\n    962 => 'sigma1',\n    963 => 'sigma',\n    964 => 'tau',\n    965 => 'upsilon',\n    966 => 'phi',\n    967 => 'chi',\n    968 => 'psi',\n    969 => 'omega',\n    970 => 'iotadieresis',\n    971 => 'upsilondieresis',\n    972 => 'omicrontonos',\n    973 => 'upsilontonos',\n    974 => 'omegatonos',\n    975 => 'uni03CF',\n    976 => 'uni03D0',\n    977 => 'theta1',\n    978 => 'Upsilon1',\n    979 => 'uni03D3',\n    980 => 'uni03D4',\n    981 => 'phi1',\n    982 => 'omega1',\n    983 => 'uni03D7',\n    984 => 'uni03D8',\n    985 => 'uni03D9',\n    986 => 'uni03DA',\n    987 => 'uni03DB',\n    988 => 'uni03DC',\n    989 => 'uni03DD',\n    990 => 'uni03DE',\n    991 => 'uni03DF',\n    992 => 'uni03E0',\n    993 => 'uni03E1',\n    994 => 'uni03E2',\n    995 => 'uni03E3',\n    996 => 'uni03E4',\n    997 => 'uni03E5',\n    998 => 'uni03E6',\n    999 => 'uni03E7',\n    1000 => 'uni03E8',\n    1001 => 'uni03E9',\n    1002 => 'uni03EA',\n    1003 => 'uni03EB',\n    1004 => 'uni03EC',\n    1005 => 'uni03ED',\n    1006 => 'uni03EE',\n    1007 => 'uni03EF',\n    1008 => 'uni03F0',\n    1009 => 'uni03F1',\n    1010 => 'uni03F2',\n    1011 => 'uni03F3',\n    1012 => 'uni03F4',\n    1013 => 'uni03F5',\n    1014 => 'uni03F6',\n    1015 => 'uni03F7',\n    1016 => 'uni03F8',\n    1017 => 'uni03F9',\n    1018 => 'uni03FA',\n    1019 => 'uni03FB',\n    1020 => 'uni03FC',\n    1021 => 'uni03FD',\n    1022 => 'uni03FE',\n    1023 => 'uni03FF',\n    1024 => 'uni0400',\n    1025 => 'uni0401',\n    1026 => 'uni0402',\n    1027 => 'uni0403',\n    1028 => 'uni0404',\n    1029 => 'uni0405',\n    1030 => 'uni0406',\n    1031 => 'uni0407',\n    1032 => 'uni0408',\n    1033 => 'uni0409',\n    1034 => 'uni040A',\n    1035 => 'uni040B',\n    1036 => 'uni040C',\n    1037 => 'uni040D',\n    1038 => 'uni040E',\n    1039 => 'uni040F',\n    1040 => 'uni0410',\n    1041 => 'uni0411',\n    1042 => 'uni0412',\n    1043 => 'uni0413',\n    1044 => 'uni0414',\n    1045 => 'uni0415',\n    1046 => 'uni0416',\n    1047 => 'uni0417',\n    1048 => 'uni0418',\n    1049 => 'uni0419',\n    1050 => 'uni041A',\n    1051 => 'uni041B',\n    1052 => 'uni041C',\n    1053 => 'uni041D',\n    1054 => 'uni041E',\n    1055 => 'uni041F',\n    1056 => 'uni0420',\n    1057 => 'uni0421',\n    1058 => 'uni0422',\n    1059 => 'uni0423',\n    1060 => 'uni0424',\n    1061 => 'uni0425',\n    1062 => 'uni0426',\n    1063 => 'uni0427',\n    1064 => 'uni0428',\n    1065 => 'uni0429',\n    1066 => 'uni042A',\n    1067 => 'uni042B',\n    1068 => 'uni042C',\n    1069 => 'uni042D',\n    1070 => 'uni042E',\n    1071 => 'uni042F',\n    1072 => 'uni0430',\n    1073 => 'uni0431',\n    1074 => 'uni0432',\n    1075 => 'uni0433',\n    1076 => 'uni0434',\n    1077 => 'uni0435',\n    1078 => 'uni0436',\n    1079 => 'uni0437',\n    1080 => 'uni0438',\n    1081 => 'uni0439',\n    1082 => 'uni043A',\n    1083 => 'uni043B',\n    1084 => 'uni043C',\n    1085 => 'uni043D',\n    1086 => 'uni043E',\n    1087 => 'uni043F',\n    1088 => 'uni0440',\n    1089 => 'uni0441',\n    1090 => 'uni0442',\n    1091 => 'uni0443',\n    1092 => 'uni0444',\n    1093 => 'uni0445',\n    1094 => 'uni0446',\n    1095 => 'uni0447',\n    1096 => 'uni0448',\n    1097 => 'uni0449',\n    1098 => 'uni044A',\n    1099 => 'uni044B',\n    1100 => 'uni044C',\n    1101 => 'uni044D',\n    1102 => 'uni044E',\n    1103 => 'uni044F',\n    1104 => 'uni0450',\n    1105 => 'uni0451',\n    1106 => 'uni0452',\n    1107 => 'uni0453',\n    1108 => 'uni0454',\n    1109 => 'uni0455',\n    1110 => 'uni0456',\n    1111 => 'uni0457',\n    1112 => 'uni0458',\n    1113 => 'uni0459',\n    1114 => 'uni045A',\n    1115 => 'uni045B',\n    1116 => 'uni045C',\n    1117 => 'uni045D',\n    1118 => 'uni045E',\n    1119 => 'uni045F',\n    1120 => 'uni0460',\n    1121 => 'uni0461',\n    1122 => 'uni0462',\n    1123 => 'uni0463',\n    1124 => 'uni0464',\n    1125 => 'uni0465',\n    1126 => 'uni0466',\n    1127 => 'uni0467',\n    1128 => 'uni0468',\n    1129 => 'uni0469',\n    1130 => 'uni046A',\n    1131 => 'uni046B',\n    1132 => 'uni046C',\n    1133 => 'uni046D',\n    1134 => 'uni046E',\n    1135 => 'uni046F',\n    1136 => 'uni0470',\n    1137 => 'uni0471',\n    1138 => 'uni0472',\n    1139 => 'uni0473',\n    1140 => 'uni0474',\n    1141 => 'uni0475',\n    1142 => 'uni0476',\n    1143 => 'uni0477',\n    1144 => 'uni0478',\n    1145 => 'uni0479',\n    1146 => 'uni047A',\n    1147 => 'uni047B',\n    1148 => 'uni047C',\n    1149 => 'uni047D',\n    1150 => 'uni047E',\n    1151 => 'uni047F',\n    1152 => 'uni0480',\n    1153 => 'uni0481',\n    1154 => 'uni0482',\n    1155 => 'uni0483',\n    1156 => 'uni0484',\n    1157 => 'uni0485',\n    1158 => 'uni0486',\n    1159 => 'uni0487',\n    1160 => 'uni0488',\n    1161 => 'uni0489',\n    1162 => 'uni048A',\n    1163 => 'uni048B',\n    1164 => 'uni048C',\n    1165 => 'uni048D',\n    1166 => 'uni048E',\n    1167 => 'uni048F',\n    1168 => 'uni0490',\n    1169 => 'uni0491',\n    1170 => 'uni0492',\n    1171 => 'uni0493',\n    1172 => 'uni0494',\n    1173 => 'uni0495',\n    1174 => 'uni0496',\n    1175 => 'uni0497',\n    1176 => 'uni0498',\n    1177 => 'uni0499',\n    1178 => 'uni049A',\n    1179 => 'uni049B',\n    1180 => 'uni049C',\n    1181 => 'uni049D',\n    1182 => 'uni049E',\n    1183 => 'uni049F',\n    1184 => 'uni04A0',\n    1185 => 'uni04A1',\n    1186 => 'uni04A2',\n    1187 => 'uni04A3',\n    1188 => 'uni04A4',\n    1189 => 'uni04A5',\n    1190 => 'uni04A6',\n    1191 => 'uni04A7',\n    1192 => 'uni04A8',\n    1193 => 'uni04A9',\n    1194 => 'uni04AA',\n    1195 => 'uni04AB',\n    1196 => 'uni04AC',\n    1197 => 'uni04AD',\n    1198 => 'uni04AE',\n    1199 => 'uni04AF',\n    1200 => 'uni04B0',\n    1201 => 'uni04B1',\n    1202 => 'uni04B2',\n    1203 => 'uni04B3',\n    1204 => 'uni04B4',\n    1205 => 'uni04B5',\n    1206 => 'uni04B6',\n    1207 => 'uni04B7',\n    1208 => 'uni04B8',\n    1209 => 'uni04B9',\n    1210 => 'uni04BA',\n    1211 => 'uni04BB',\n    1212 => 'uni04BC',\n    1213 => 'uni04BD',\n    1214 => 'uni04BE',\n    1215 => 'uni04BF',\n    1216 => 'uni04C0',\n    1217 => 'uni04C1',\n    1218 => 'uni04C2',\n    1219 => 'uni04C3',\n    1220 => 'uni04C4',\n    1221 => 'uni04C5',\n    1222 => 'uni04C6',\n    1223 => 'uni04C7',\n    1224 => 'uni04C8',\n    1225 => 'uni04C9',\n    1226 => 'uni04CA',\n    1227 => 'uni04CB',\n    1228 => 'uni04CC',\n    1229 => 'uni04CD',\n    1230 => 'uni04CE',\n    1231 => 'uni04CF',\n    1232 => 'uni04D0',\n    1233 => 'uni04D1',\n    1234 => 'uni04D2',\n    1235 => 'uni04D3',\n    1236 => 'uni04D4',\n    1237 => 'uni04D5',\n    1238 => 'uni04D6',\n    1239 => 'uni04D7',\n    1240 => 'uni04D8',\n    1241 => 'uni04D9',\n    1242 => 'uni04DA',\n    1243 => 'uni04DB',\n    1244 => 'uni04DC',\n    1245 => 'uni04DD',\n    1246 => 'uni04DE',\n    1247 => 'uni04DF',\n    1248 => 'uni04E0',\n    1249 => 'uni04E1',\n    1250 => 'uni04E2',\n    1251 => 'uni04E3',\n    1252 => 'uni04E4',\n    1253 => 'uni04E5',\n    1254 => 'uni04E6',\n    1255 => 'uni04E7',\n    1256 => 'uni04E8',\n    1257 => 'uni04E9',\n    1258 => 'uni04EA',\n    1259 => 'uni04EB',\n    1260 => 'uni04EC',\n    1261 => 'uni04ED',\n    1262 => 'uni04EE',\n    1263 => 'uni04EF',\n    1264 => 'uni04F0',\n    1265 => 'uni04F1',\n    1266 => 'uni04F2',\n    1267 => 'uni04F3',\n    1268 => 'uni04F4',\n    1269 => 'uni04F5',\n    1270 => 'uni04F6',\n    1271 => 'uni04F7',\n    1272 => 'uni04F8',\n    1273 => 'uni04F9',\n    1274 => 'uni04FA',\n    1275 => 'uni04FB',\n    1276 => 'uni04FC',\n    1277 => 'uni04FD',\n    1278 => 'uni04FE',\n    1279 => 'uni04FF',\n    1280 => 'uni0500',\n    1281 => 'uni0501',\n    1282 => 'uni0502',\n    1283 => 'uni0503',\n    1284 => 'uni0504',\n    1285 => 'uni0505',\n    1286 => 'uni0506',\n    1287 => 'uni0507',\n    1288 => 'uni0508',\n    1289 => 'uni0509',\n    1290 => 'uni050A',\n    1291 => 'uni050B',\n    1292 => 'uni050C',\n    1293 => 'uni050D',\n    1294 => 'uni050E',\n    1295 => 'uni050F',\n    1296 => 'uni0510',\n    1297 => 'uni0511',\n    1298 => 'uni0512',\n    1299 => 'uni0513',\n    1300 => 'uni0514',\n    1301 => 'uni0515',\n    1302 => 'uni0516',\n    1303 => 'uni0517',\n    1304 => 'uni0518',\n    1305 => 'uni0519',\n    1306 => 'uni051A',\n    1307 => 'uni051B',\n    1308 => 'uni051C',\n    1309 => 'uni051D',\n    1310 => 'uni051E',\n    1311 => 'uni051F',\n    1312 => 'uni0520',\n    1313 => 'uni0521',\n    1314 => 'uni0522',\n    1315 => 'uni0523',\n    1316 => 'uni0524',\n    1317 => 'uni0525',\n    1329 => 'uni0531',\n    1330 => 'uni0532',\n    1331 => 'uni0533',\n    1332 => 'uni0534',\n    1333 => 'uni0535',\n    1334 => 'uni0536',\n    1335 => 'uni0537',\n    1336 => 'uni0538',\n    1337 => 'uni0539',\n    1338 => 'uni053A',\n    1339 => 'uni053B',\n    1340 => 'uni053C',\n    1341 => 'uni053D',\n    1342 => 'uni053E',\n    1343 => 'uni053F',\n    1344 => 'uni0540',\n    1345 => 'uni0541',\n    1346 => 'uni0542',\n    1347 => 'uni0543',\n    1348 => 'uni0544',\n    1349 => 'uni0545',\n    1350 => 'uni0546',\n    1351 => 'uni0547',\n    1352 => 'uni0548',\n    1353 => 'uni0549',\n    1354 => 'uni054A',\n    1355 => 'uni054B',\n    1356 => 'uni054C',\n    1357 => 'uni054D',\n    1358 => 'uni054E',\n    1359 => 'uni054F',\n    1360 => 'uni0550',\n    1361 => 'uni0551',\n    1362 => 'uni0552',\n    1363 => 'uni0553',\n    1364 => 'uni0554',\n    1365 => 'uni0555',\n    1366 => 'uni0556',\n    1369 => 'uni0559',\n    1370 => 'uni055A',\n    1371 => 'uni055B',\n    1372 => 'uni055C',\n    1373 => 'uni055D',\n    1374 => 'uni055E',\n    1375 => 'uni055F',\n    1377 => 'uni0561',\n    1378 => 'uni0562',\n    1379 => 'uni0563',\n    1380 => 'uni0564',\n    1381 => 'uni0565',\n    1382 => 'uni0566',\n    1383 => 'uni0567',\n    1384 => 'uni0568',\n    1385 => 'uni0569',\n    1386 => 'uni056A',\n    1387 => 'uni056B',\n    1388 => 'uni056C',\n    1389 => 'uni056D',\n    1390 => 'uni056E',\n    1391 => 'uni056F',\n    1392 => 'uni0570',\n    1393 => 'uni0571',\n    1394 => 'uni0572',\n    1395 => 'uni0573',\n    1396 => 'uni0574',\n    1397 => 'uni0575',\n    1398 => 'uni0576',\n    1399 => 'uni0577',\n    1400 => 'uni0578',\n    1401 => 'uni0579',\n    1402 => 'uni057A',\n    1403 => 'uni057B',\n    1404 => 'uni057C',\n    1405 => 'uni057D',\n    1406 => 'uni057E',\n    1407 => 'uni057F',\n    1408 => 'uni0580',\n    1409 => 'uni0581',\n    1410 => 'uni0582',\n    1411 => 'uni0583',\n    1412 => 'uni0584',\n    1413 => 'uni0585',\n    1414 => 'uni0586',\n    1415 => 'uni0587',\n    1417 => 'uni0589',\n    1418 => 'uni058A',\n    1456 => 'uni05B0',\n    1457 => 'uni05B1',\n    1458 => 'uni05B2',\n    1459 => 'uni05B3',\n    1460 => 'uni05B4',\n    1461 => 'uni05B5',\n    1462 => 'uni05B6',\n    1463 => 'uni05B7',\n    1464 => 'uni05B8',\n    1465 => 'uni05B9',\n    1466 => 'uni05BA',\n    1467 => 'uni05BB',\n    1468 => 'uni05BC',\n    1469 => 'uni05BD',\n    1470 => 'uni05BE',\n    1471 => 'uni05BF',\n    1472 => 'uni05C0',\n    1473 => 'uni05C1',\n    1474 => 'uni05C2',\n    1475 => 'uni05C3',\n    1478 => 'uni05C6',\n    1479 => 'uni05C7',\n    1488 => 'uni05D0',\n    1489 => 'uni05D1',\n    1490 => 'uni05D2',\n    1491 => 'uni05D3',\n    1492 => 'uni05D4',\n    1493 => 'uni05D5',\n    1494 => 'uni05D6',\n    1495 => 'uni05D7',\n    1496 => 'uni05D8',\n    1497 => 'uni05D9',\n    1498 => 'uni05DA',\n    1499 => 'uni05DB',\n    1500 => 'uni05DC',\n    1501 => 'uni05DD',\n    1502 => 'uni05DE',\n    1503 => 'uni05DF',\n    1504 => 'uni05E0',\n    1505 => 'uni05E1',\n    1506 => 'uni05E2',\n    1507 => 'uni05E3',\n    1508 => 'uni05E4',\n    1509 => 'uni05E5',\n    1510 => 'uni05E6',\n    1511 => 'uni05E7',\n    1512 => 'uni05E8',\n    1513 => 'uni05E9',\n    1514 => 'uni05EA',\n    1520 => 'uni05F0',\n    1521 => 'uni05F1',\n    1522 => 'uni05F2',\n    1523 => 'uni05F3',\n    1524 => 'uni05F4',\n    1542 => 'uni0606',\n    1543 => 'uni0607',\n    1545 => 'uni0609',\n    1546 => 'uni060A',\n    1548 => 'uni060C',\n    1557 => 'uni0615',\n    1563 => 'uni061B',\n    1567 => 'uni061F',\n    1569 => 'uni0621',\n    1570 => 'uni0622',\n    1571 => 'uni0623',\n    1572 => 'uni0624',\n    1573 => 'uni0625',\n    1574 => 'uni0626',\n    1575 => 'uni0627',\n    1576 => 'uni0628',\n    1577 => 'uni0629',\n    1578 => 'uni062A',\n    1579 => 'uni062B',\n    1580 => 'uni062C',\n    1581 => 'uni062D',\n    1582 => 'uni062E',\n    1583 => 'uni062F',\n    1584 => 'uni0630',\n    1585 => 'uni0631',\n    1586 => 'uni0632',\n    1587 => 'uni0633',\n    1588 => 'uni0634',\n    1589 => 'uni0635',\n    1590 => 'uni0636',\n    1591 => 'uni0637',\n    1592 => 'uni0638',\n    1593 => 'uni0639',\n    1594 => 'uni063A',\n    1600 => 'uni0640',\n    1601 => 'uni0641',\n    1602 => 'uni0642',\n    1603 => 'uni0643',\n    1604 => 'uni0644',\n    1605 => 'uni0645',\n    1606 => 'uni0646',\n    1607 => 'uni0647',\n    1608 => 'uni0648',\n    1609 => 'uni0649',\n    1610 => 'uni064A',\n    1611 => 'uni064B',\n    1612 => 'uni064C',\n    1613 => 'uni064D',\n    1614 => 'uni064E',\n    1615 => 'uni064F',\n    1616 => 'uni0650',\n    1617 => 'uni0651',\n    1618 => 'uni0652',\n    1619 => 'uni0653',\n    1620 => 'uni0654',\n    1621 => 'uni0655',\n    1623 => 'uni0657',\n    1626 => 'uni065A',\n    1632 => 'uni0660',\n    1633 => 'uni0661',\n    1634 => 'uni0662',\n    1635 => 'uni0663',\n    1636 => 'uni0664',\n    1637 => 'uni0665',\n    1638 => 'uni0666',\n    1639 => 'uni0667',\n    1640 => 'uni0668',\n    1641 => 'uni0669',\n    1642 => 'uni066A',\n    1643 => 'uni066B',\n    1644 => 'uni066C',\n    1645 => 'uni066D',\n    1646 => 'uni066E',\n    1647 => 'uni066F',\n    1648 => 'uni0670',\n    1652 => 'uni0674',\n    1657 => 'uni0679',\n    1658 => 'uni067A',\n    1659 => 'uni067B',\n    1660 => 'uni067C',\n    1661 => 'uni067D',\n    1662 => 'uni067E',\n    1663 => 'uni067F',\n    1664 => 'uni0680',\n    1665 => 'uni0681',\n    1666 => 'uni0682',\n    1667 => 'uni0683',\n    1668 => 'uni0684',\n    1669 => 'uni0685',\n    1670 => 'uni0686',\n    1671 => 'uni0687',\n    1672 => 'uni0688',\n    1673 => 'uni0689',\n    1674 => 'uni068A',\n    1675 => 'uni068B',\n    1676 => 'uni068C',\n    1677 => 'uni068D',\n    1678 => 'uni068E',\n    1679 => 'uni068F',\n    1680 => 'uni0690',\n    1681 => 'uni0691',\n    1682 => 'uni0692',\n    1683 => 'uni0693',\n    1684 => 'uni0694',\n    1685 => 'uni0695',\n    1686 => 'uni0696',\n    1687 => 'uni0697',\n    1688 => 'uni0698',\n    1689 => 'uni0699',\n    1690 => 'uni069A',\n    1691 => 'uni069B',\n    1692 => 'uni069C',\n    1693 => 'uni069D',\n    1694 => 'uni069E',\n    1695 => 'uni069F',\n    1696 => 'uni06A0',\n    1697 => 'uni06A1',\n    1698 => 'uni06A2',\n    1699 => 'uni06A3',\n    1700 => 'uni06A4',\n    1701 => 'uni06A5',\n    1702 => 'uni06A6',\n    1703 => 'uni06A7',\n    1704 => 'uni06A8',\n    1705 => 'uni06A9',\n    1706 => 'uni06AA',\n    1707 => 'uni06AB',\n    1708 => 'uni06AC',\n    1709 => 'uni06AD',\n    1710 => 'uni06AE',\n    1711 => 'uni06AF',\n    1712 => 'uni06B0',\n    1713 => 'uni06B1',\n    1714 => 'uni06B2',\n    1715 => 'uni06B3',\n    1716 => 'uni06B4',\n    1717 => 'uni06B5',\n    1718 => 'uni06B6',\n    1719 => 'uni06B7',\n    1720 => 'uni06B8',\n    1721 => 'uni06B9',\n    1722 => 'uni06BA',\n    1723 => 'uni06BB',\n    1724 => 'uni06BC',\n    1725 => 'uni06BD',\n    1726 => 'uni06BE',\n    1727 => 'uni06BF',\n    1734 => 'uni06C6',\n    1735 => 'uni06C7',\n    1736 => 'uni06C8',\n    1739 => 'uni06CB',\n    1740 => 'uni06CC',\n    1742 => 'uni06CE',\n    1744 => 'uni06D0',\n    1749 => 'uni06D5',\n    1776 => 'uni06F0',\n    1777 => 'uni06F1',\n    1778 => 'uni06F2',\n    1779 => 'uni06F3',\n    1780 => 'uni06F4',\n    1781 => 'uni06F5',\n    1782 => 'uni06F6',\n    1783 => 'uni06F7',\n    1784 => 'uni06F8',\n    1785 => 'uni06F9',\n    1984 => 'uni07C0',\n    1985 => 'uni07C1',\n    1986 => 'uni07C2',\n    1987 => 'uni07C3',\n    1988 => 'uni07C4',\n    1989 => 'uni07C5',\n    1990 => 'uni07C6',\n    1991 => 'uni07C7',\n    1992 => 'uni07C8',\n    1993 => 'uni07C9',\n    1994 => 'uni07CA',\n    1995 => 'uni07CB',\n    1996 => 'uni07CC',\n    1997 => 'uni07CD',\n    1998 => 'uni07CE',\n    1999 => 'uni07CF',\n    2000 => 'uni07D0',\n    2001 => 'uni07D1',\n    2002 => 'uni07D2',\n    2003 => 'uni07D3',\n    2004 => 'uni07D4',\n    2005 => 'uni07D5',\n    2006 => 'uni07D6',\n    2007 => 'uni07D7',\n    2008 => 'uni07D8',\n    2009 => 'uni07D9',\n    2010 => 'uni07DA',\n    2011 => 'uni07DB',\n    2012 => 'uni07DC',\n    2013 => 'uni07DD',\n    2014 => 'uni07DE',\n    2015 => 'uni07DF',\n    2016 => 'uni07E0',\n    2017 => 'uni07E1',\n    2018 => 'uni07E2',\n    2019 => 'uni07E3',\n    2020 => 'uni07E4',\n    2021 => 'uni07E5',\n    2022 => 'uni07E6',\n    2023 => 'uni07E7',\n    2027 => 'uni07EB',\n    2028 => 'uni07EC',\n    2029 => 'uni07ED',\n    2030 => 'uni07EE',\n    2031 => 'uni07EF',\n    2032 => 'uni07F0',\n    2033 => 'uni07F1',\n    2034 => 'uni07F2',\n    2035 => 'uni07F3',\n    2036 => 'uni07F4',\n    2037 => 'uni07F5',\n    2040 => 'uni07F8',\n    2041 => 'uni07F9',\n    2042 => 'uni07FA',\n    3647 => 'uni0E3F',\n    3713 => 'uni0E81',\n    3714 => 'uni0E82',\n    3716 => 'uni0E84',\n    3719 => 'uni0E87',\n    3720 => 'uni0E88',\n    3722 => 'uni0E8A',\n    3725 => 'uni0E8D',\n    3732 => 'uni0E94',\n    3733 => 'uni0E95',\n    3734 => 'uni0E96',\n    3735 => 'uni0E97',\n    3737 => 'uni0E99',\n    3738 => 'uni0E9A',\n    3739 => 'uni0E9B',\n    3740 => 'uni0E9C',\n    3741 => 'uni0E9D',\n    3742 => 'uni0E9E',\n    3743 => 'uni0E9F',\n    3745 => 'uni0EA1',\n    3746 => 'uni0EA2',\n    3747 => 'uni0EA3',\n    3749 => 'uni0EA5',\n    3751 => 'uni0EA7',\n    3754 => 'uni0EAA',\n    3755 => 'uni0EAB',\n    3757 => 'uni0EAD',\n    3758 => 'uni0EAE',\n    3759 => 'uni0EAF',\n    3760 => 'uni0EB0',\n    3761 => 'uni0EB1',\n    3762 => 'uni0EB2',\n    3763 => 'uni0EB3',\n    3764 => 'uni0EB4',\n    3765 => 'uni0EB5',\n    3766 => 'uni0EB6',\n    3767 => 'uni0EB7',\n    3768 => 'uni0EB8',\n    3769 => 'uni0EB9',\n    3771 => 'uni0EBB',\n    3772 => 'uni0EBC',\n    3773 => 'uni0EBD',\n    3776 => 'uni0EC0',\n    3777 => 'uni0EC1',\n    3778 => 'uni0EC2',\n    3779 => 'uni0EC3',\n    3780 => 'uni0EC4',\n    3782 => 'uni0EC6',\n    3784 => 'uni0EC8',\n    3785 => 'uni0EC9',\n    3786 => 'uni0ECA',\n    3787 => 'uni0ECB',\n    3788 => 'uni0ECC',\n    3789 => 'uni0ECD',\n    3792 => 'uni0ED0',\n    3793 => 'uni0ED1',\n    3794 => 'uni0ED2',\n    3795 => 'uni0ED3',\n    3796 => 'uni0ED4',\n    3797 => 'uni0ED5',\n    3798 => 'uni0ED6',\n    3799 => 'uni0ED7',\n    3800 => 'uni0ED8',\n    3801 => 'uni0ED9',\n    3804 => 'uni0EDC',\n    3805 => 'uni0EDD',\n    4256 => 'uni10A0',\n    4257 => 'uni10A1',\n    4258 => 'uni10A2',\n    4259 => 'uni10A3',\n    4260 => 'uni10A4',\n    4261 => 'uni10A5',\n    4262 => 'uni10A6',\n    4263 => 'uni10A7',\n    4264 => 'uni10A8',\n    4265 => 'uni10A9',\n    4266 => 'uni10AA',\n    4267 => 'uni10AB',\n    4268 => 'uni10AC',\n    4269 => 'uni10AD',\n    4270 => 'uni10AE',\n    4271 => 'uni10AF',\n    4272 => 'uni10B0',\n    4273 => 'uni10B1',\n    4274 => 'uni10B2',\n    4275 => 'uni10B3',\n    4276 => 'uni10B4',\n    4277 => 'uni10B5',\n    4278 => 'uni10B6',\n    4279 => 'uni10B7',\n    4280 => 'uni10B8',\n    4281 => 'uni10B9',\n    4282 => 'uni10BA',\n    4283 => 'uni10BB',\n    4284 => 'uni10BC',\n    4285 => 'uni10BD',\n    4286 => 'uni10BE',\n    4287 => 'uni10BF',\n    4288 => 'uni10C0',\n    4289 => 'uni10C1',\n    4290 => 'uni10C2',\n    4291 => 'uni10C3',\n    4292 => 'uni10C4',\n    4293 => 'uni10C5',\n    4304 => 'uni10D0',\n    4305 => 'uni10D1',\n    4306 => 'uni10D2',\n    4307 => 'uni10D3',\n    4308 => 'uni10D4',\n    4309 => 'uni10D5',\n    4310 => 'uni10D6',\n    4311 => 'uni10D7',\n    4312 => 'uni10D8',\n    4313 => 'uni10D9',\n    4314 => 'uni10DA',\n    4315 => 'uni10DB',\n    4316 => 'uni10DC',\n    4317 => 'uni10DD',\n    4318 => 'uni10DE',\n    4319 => 'uni10DF',\n    4320 => 'uni10E0',\n    4321 => 'uni10E1',\n    4322 => 'uni10E2',\n    4323 => 'uni10E3',\n    4324 => 'uni10E4',\n    4325 => 'uni10E5',\n    4326 => 'uni10E6',\n    4327 => 'uni10E7',\n    4328 => 'uni10E8',\n    4329 => 'uni10E9',\n    4330 => 'uni10EA',\n    4331 => 'uni10EB',\n    4332 => 'uni10EC',\n    4333 => 'uni10ED',\n    4334 => 'uni10EE',\n    4335 => 'uni10EF',\n    4336 => 'uni10F0',\n    4337 => 'uni10F1',\n    4338 => 'uni10F2',\n    4339 => 'uni10F3',\n    4340 => 'uni10F4',\n    4341 => 'uni10F5',\n    4342 => 'uni10F6',\n    4343 => 'uni10F7',\n    4344 => 'uni10F8',\n    4345 => 'uni10F9',\n    4346 => 'uni10FA',\n    4347 => 'uni10FB',\n    4348 => 'uni10FC',\n    5121 => 'uni1401',\n    5122 => 'uni1402',\n    5123 => 'uni1403',\n    5124 => 'uni1404',\n    5125 => 'uni1405',\n    5126 => 'uni1406',\n    5127 => 'uni1407',\n    5129 => 'uni1409',\n    5130 => 'uni140A',\n    5131 => 'uni140B',\n    5132 => 'uni140C',\n    5133 => 'uni140D',\n    5134 => 'uni140E',\n    5135 => 'uni140F',\n    5136 => 'uni1410',\n    5137 => 'uni1411',\n    5138 => 'uni1412',\n    5139 => 'uni1413',\n    5140 => 'uni1414',\n    5141 => 'uni1415',\n    5142 => 'uni1416',\n    5143 => 'uni1417',\n    5144 => 'uni1418',\n    5145 => 'uni1419',\n    5146 => 'uni141A',\n    5147 => 'uni141B',\n    5149 => 'uni141D',\n    5150 => 'uni141E',\n    5151 => 'uni141F',\n    5152 => 'uni1420',\n    5153 => 'uni1421',\n    5154 => 'uni1422',\n    5155 => 'uni1423',\n    5156 => 'uni1424',\n    5157 => 'uni1425',\n    5158 => 'uni1426',\n    5159 => 'uni1427',\n    5160 => 'uni1428',\n    5161 => 'uni1429',\n    5162 => 'uni142A',\n    5163 => 'uni142B',\n    5164 => 'uni142C',\n    5165 => 'uni142D',\n    5166 => 'uni142E',\n    5167 => 'uni142F',\n    5168 => 'uni1430',\n    5169 => 'uni1431',\n    5170 => 'uni1432',\n    5171 => 'uni1433',\n    5172 => 'uni1434',\n    5173 => 'uni1435',\n    5175 => 'uni1437',\n    5176 => 'uni1438',\n    5177 => 'uni1439',\n    5178 => 'uni143A',\n    5179 => 'uni143B',\n    5180 => 'uni143C',\n    5181 => 'uni143D',\n    5182 => 'uni143E',\n    5183 => 'uni143F',\n    5184 => 'uni1440',\n    5185 => 'uni1441',\n    5186 => 'uni1442',\n    5187 => 'uni1443',\n    5188 => 'uni1444',\n    5189 => 'uni1445',\n    5190 => 'uni1446',\n    5191 => 'uni1447',\n    5192 => 'uni1448',\n    5193 => 'uni1449',\n    5194 => 'uni144A',\n    5196 => 'uni144C',\n    5197 => 'uni144D',\n    5198 => 'uni144E',\n    5199 => 'uni144F',\n    5200 => 'uni1450',\n    5201 => 'uni1451',\n    5202 => 'uni1452',\n    5204 => 'uni1454',\n    5205 => 'uni1455',\n    5206 => 'uni1456',\n    5207 => 'uni1457',\n    5208 => 'uni1458',\n    5209 => 'uni1459',\n    5210 => 'uni145A',\n    5211 => 'uni145B',\n    5212 => 'uni145C',\n    5213 => 'uni145D',\n    5214 => 'uni145E',\n    5215 => 'uni145F',\n    5216 => 'uni1460',\n    5217 => 'uni1461',\n    5218 => 'uni1462',\n    5219 => 'uni1463',\n    5220 => 'uni1464',\n    5221 => 'uni1465',\n    5222 => 'uni1466',\n    5223 => 'uni1467',\n    5224 => 'uni1468',\n    5225 => 'uni1469',\n    5226 => 'uni146A',\n    5227 => 'uni146B',\n    5228 => 'uni146C',\n    5229 => 'uni146D',\n    5230 => 'uni146E',\n    5231 => 'uni146F',\n    5232 => 'uni1470',\n    5233 => 'uni1471',\n    5234 => 'uni1472',\n    5235 => 'uni1473',\n    5236 => 'uni1474',\n    5237 => 'uni1475',\n    5238 => 'uni1476',\n    5239 => 'uni1477',\n    5240 => 'uni1478',\n    5241 => 'uni1479',\n    5242 => 'uni147A',\n    5243 => 'uni147B',\n    5244 => 'uni147C',\n    5245 => 'uni147D',\n    5246 => 'uni147E',\n    5247 => 'uni147F',\n    5248 => 'uni1480',\n    5249 => 'uni1481',\n    5250 => 'uni1482',\n    5251 => 'uni1483',\n    5252 => 'uni1484',\n    5253 => 'uni1485',\n    5254 => 'uni1486',\n    5255 => 'uni1487',\n    5256 => 'uni1488',\n    5257 => 'uni1489',\n    5258 => 'uni148A',\n    5259 => 'uni148B',\n    5260 => 'uni148C',\n    5261 => 'uni148D',\n    5262 => 'uni148E',\n    5263 => 'uni148F',\n    5264 => 'uni1490',\n    5265 => 'uni1491',\n    5266 => 'uni1492',\n    5267 => 'uni1493',\n    5268 => 'uni1494',\n    5269 => 'uni1495',\n    5270 => 'uni1496',\n    5271 => 'uni1497',\n    5272 => 'uni1498',\n    5273 => 'uni1499',\n    5274 => 'uni149A',\n    5275 => 'uni149B',\n    5276 => 'uni149C',\n    5277 => 'uni149D',\n    5278 => 'uni149E',\n    5279 => 'uni149F',\n    5280 => 'uni14A0',\n    5281 => 'uni14A1',\n    5282 => 'uni14A2',\n    5283 => 'uni14A3',\n    5284 => 'uni14A4',\n    5285 => 'uni14A5',\n    5286 => 'uni14A6',\n    5287 => 'uni14A7',\n    5288 => 'uni14A8',\n    5289 => 'uni14A9',\n    5290 => 'uni14AA',\n    5291 => 'uni14AB',\n    5292 => 'uni14AC',\n    5293 => 'uni14AD',\n    5294 => 'uni14AE',\n    5295 => 'uni14AF',\n    5296 => 'uni14B0',\n    5297 => 'uni14B1',\n    5298 => 'uni14B2',\n    5299 => 'uni14B3',\n    5300 => 'uni14B4',\n    5301 => 'uni14B5',\n    5302 => 'uni14B6',\n    5303 => 'uni14B7',\n    5304 => 'uni14B8',\n    5305 => 'uni14B9',\n    5306 => 'uni14BA',\n    5307 => 'uni14BB',\n    5308 => 'uni14BC',\n    5309 => 'uni14BD',\n    5312 => 'uni14C0',\n    5313 => 'uni14C1',\n    5314 => 'uni14C2',\n    5315 => 'uni14C3',\n    5316 => 'uni14C4',\n    5317 => 'uni14C5',\n    5318 => 'uni14C6',\n    5319 => 'uni14C7',\n    5320 => 'uni14C8',\n    5321 => 'uni14C9',\n    5322 => 'uni14CA',\n    5323 => 'uni14CB',\n    5324 => 'uni14CC',\n    5325 => 'uni14CD',\n    5326 => 'uni14CE',\n    5327 => 'uni14CF',\n    5328 => 'uni14D0',\n    5329 => 'uni14D1',\n    5330 => 'uni14D2',\n    5331 => 'uni14D3',\n    5332 => 'uni14D4',\n    5333 => 'uni14D5',\n    5334 => 'uni14D6',\n    5335 => 'uni14D7',\n    5336 => 'uni14D8',\n    5337 => 'uni14D9',\n    5338 => 'uni14DA',\n    5339 => 'uni14DB',\n    5340 => 'uni14DC',\n    5341 => 'uni14DD',\n    5342 => 'uni14DE',\n    5343 => 'uni14DF',\n    5344 => 'uni14E0',\n    5345 => 'uni14E1',\n    5346 => 'uni14E2',\n    5347 => 'uni14E3',\n    5348 => 'uni14E4',\n    5349 => 'uni14E5',\n    5350 => 'uni14E6',\n    5351 => 'uni14E7',\n    5352 => 'uni14E8',\n    5353 => 'uni14E9',\n    5354 => 'uni14EA',\n    5356 => 'uni14EC',\n    5357 => 'uni14ED',\n    5358 => 'uni14EE',\n    5359 => 'uni14EF',\n    5360 => 'uni14F0',\n    5361 => 'uni14F1',\n    5362 => 'uni14F2',\n    5363 => 'uni14F3',\n    5364 => 'uni14F4',\n    5365 => 'uni14F5',\n    5366 => 'uni14F6',\n    5367 => 'uni14F7',\n    5368 => 'uni14F8',\n    5369 => 'uni14F9',\n    5370 => 'uni14FA',\n    5371 => 'uni14FB',\n    5372 => 'uni14FC',\n    5373 => 'uni14FD',\n    5374 => 'uni14FE',\n    5375 => 'uni14FF',\n    5376 => 'uni1500',\n    5377 => 'uni1501',\n    5378 => 'uni1502',\n    5379 => 'uni1503',\n    5380 => 'uni1504',\n    5381 => 'uni1505',\n    5382 => 'uni1506',\n    5383 => 'uni1507',\n    5392 => 'uni1510',\n    5393 => 'uni1511',\n    5394 => 'uni1512',\n    5395 => 'uni1513',\n    5396 => 'uni1514',\n    5397 => 'uni1515',\n    5398 => 'uni1516',\n    5399 => 'uni1517',\n    5400 => 'uni1518',\n    5401 => 'uni1519',\n    5402 => 'uni151A',\n    5403 => 'uni151B',\n    5404 => 'uni151C',\n    5405 => 'uni151D',\n    5406 => 'uni151E',\n    5407 => 'uni151F',\n    5408 => 'uni1520',\n    5409 => 'uni1521',\n    5410 => 'uni1522',\n    5411 => 'uni1523',\n    5412 => 'uni1524',\n    5413 => 'uni1525',\n    5414 => 'uni1526',\n    5415 => 'uni1527',\n    5416 => 'uni1528',\n    5417 => 'uni1529',\n    5418 => 'uni152A',\n    5419 => 'uni152B',\n    5420 => 'uni152C',\n    5421 => 'uni152D',\n    5422 => 'uni152E',\n    5423 => 'uni152F',\n    5424 => 'uni1530',\n    5425 => 'uni1531',\n    5426 => 'uni1532',\n    5427 => 'uni1533',\n    5428 => 'uni1534',\n    5429 => 'uni1535',\n    5430 => 'uni1536',\n    5431 => 'uni1537',\n    5432 => 'uni1538',\n    5433 => 'uni1539',\n    5434 => 'uni153A',\n    5435 => 'uni153B',\n    5436 => 'uni153C',\n    5437 => 'uni153D',\n    5438 => 'uni153E',\n    5440 => 'uni1540',\n    5441 => 'uni1541',\n    5442 => 'uni1542',\n    5443 => 'uni1543',\n    5444 => 'uni1544',\n    5445 => 'uni1545',\n    5446 => 'uni1546',\n    5447 => 'uni1547',\n    5448 => 'uni1548',\n    5449 => 'uni1549',\n    5450 => 'uni154A',\n    5451 => 'uni154B',\n    5452 => 'uni154C',\n    5453 => 'uni154D',\n    5454 => 'uni154E',\n    5455 => 'uni154F',\n    5456 => 'uni1550',\n    5458 => 'uni1552',\n    5459 => 'uni1553',\n    5460 => 'uni1554',\n    5461 => 'uni1555',\n    5462 => 'uni1556',\n    5463 => 'uni1557',\n    5464 => 'uni1558',\n    5465 => 'uni1559',\n    5466 => 'uni155A',\n    5467 => 'uni155B',\n    5468 => 'uni155C',\n    5469 => 'uni155D',\n    5470 => 'uni155E',\n    5471 => 'uni155F',\n    5472 => 'uni1560',\n    5473 => 'uni1561',\n    5474 => 'uni1562',\n    5475 => 'uni1563',\n    5476 => 'uni1564',\n    5477 => 'uni1565',\n    5478 => 'uni1566',\n    5479 => 'uni1567',\n    5480 => 'uni1568',\n    5481 => 'uni1569',\n    5482 => 'uni156A',\n    5492 => 'uni1574',\n    5493 => 'uni1575',\n    5494 => 'uni1576',\n    5495 => 'uni1577',\n    5496 => 'uni1578',\n    5497 => 'uni1579',\n    5498 => 'uni157A',\n    5499 => 'uni157B',\n    5500 => 'uni157C',\n    5501 => 'uni157D',\n    5502 => 'uni157E',\n    5503 => 'uni157F',\n    5504 => 'uni1580',\n    5505 => 'uni1581',\n    5506 => 'uni1582',\n    5507 => 'uni1583',\n    5508 => 'uni1584',\n    5509 => 'uni1585',\n    5514 => 'uni158A',\n    5515 => 'uni158B',\n    5516 => 'uni158C',\n    5517 => 'uni158D',\n    5518 => 'uni158E',\n    5519 => 'uni158F',\n    5520 => 'uni1590',\n    5521 => 'uni1591',\n    5522 => 'uni1592',\n    5523 => 'uni1593',\n    5524 => 'uni1594',\n    5525 => 'uni1595',\n    5526 => 'uni1596',\n    5536 => 'uni15A0',\n    5537 => 'uni15A1',\n    5538 => 'uni15A2',\n    5539 => 'uni15A3',\n    5540 => 'uni15A4',\n    5541 => 'uni15A5',\n    5542 => 'uni15A6',\n    5543 => 'uni15A7',\n    5544 => 'uni15A8',\n    5545 => 'uni15A9',\n    5546 => 'uni15AA',\n    5547 => 'uni15AB',\n    5548 => 'uni15AC',\n    5549 => 'uni15AD',\n    5550 => 'uni15AE',\n    5551 => 'uni15AF',\n    5598 => 'uni15DE',\n    5601 => 'uni15E1',\n    5702 => 'uni1646',\n    5703 => 'uni1647',\n    5742 => 'uni166E',\n    5743 => 'uni166F',\n    5744 => 'uni1670',\n    5745 => 'uni1671',\n    5746 => 'uni1672',\n    5747 => 'uni1673',\n    5748 => 'uni1674',\n    5749 => 'uni1675',\n    5750 => 'uni1676',\n    5760 => 'uni1680',\n    5761 => 'uni1681',\n    5762 => 'uni1682',\n    5763 => 'uni1683',\n    5764 => 'uni1684',\n    5765 => 'uni1685',\n    5766 => 'uni1686',\n    5767 => 'uni1687',\n    5768 => 'uni1688',\n    5769 => 'uni1689',\n    5770 => 'uni168A',\n    5771 => 'uni168B',\n    5772 => 'uni168C',\n    5773 => 'uni168D',\n    5774 => 'uni168E',\n    5775 => 'uni168F',\n    5776 => 'uni1690',\n    5777 => 'uni1691',\n    5778 => 'uni1692',\n    5779 => 'uni1693',\n    5780 => 'uni1694',\n    5781 => 'uni1695',\n    5782 => 'uni1696',\n    5783 => 'uni1697',\n    5784 => 'uni1698',\n    5785 => 'uni1699',\n    5786 => 'uni169A',\n    5787 => 'uni169B',\n    5788 => 'uni169C',\n    7424 => 'uni1D00',\n    7425 => 'uni1D01',\n    7426 => 'uni1D02',\n    7427 => 'uni1D03',\n    7428 => 'uni1D04',\n    7429 => 'uni1D05',\n    7430 => 'uni1D06',\n    7431 => 'uni1D07',\n    7432 => 'uni1D08',\n    7433 => 'uni1D09',\n    7434 => 'uni1D0A',\n    7435 => 'uni1D0B',\n    7436 => 'uni1D0C',\n    7437 => 'uni1D0D',\n    7438 => 'uni1D0E',\n    7439 => 'uni1D0F',\n    7440 => 'uni1D10',\n    7441 => 'uni1D11',\n    7442 => 'uni1D12',\n    7443 => 'uni1D13',\n    7444 => 'uni1D14',\n    7446 => 'uni1D16',\n    7447 => 'uni1D17',\n    7448 => 'uni1D18',\n    7449 => 'uni1D19',\n    7450 => 'uni1D1A',\n    7451 => 'uni1D1B',\n    7452 => 'uni1D1C',\n    7453 => 'uni1D1D',\n    7454 => 'uni1D1E',\n    7455 => 'uni1D1F',\n    7456 => 'uni1D20',\n    7457 => 'uni1D21',\n    7458 => 'uni1D22',\n    7459 => 'uni1D23',\n    7462 => 'uni1D26',\n    7463 => 'uni1D27',\n    7464 => 'uni1D28',\n    7465 => 'uni1D29',\n    7466 => 'uni1D2A',\n    7467 => 'uni1D2B',\n    7468 => 'uni1D2C',\n    7469 => 'uni1D2D',\n    7470 => 'uni1D2E',\n    7472 => 'uni1D30',\n    7473 => 'uni1D31',\n    7474 => 'uni1D32',\n    7475 => 'uni1D33',\n    7476 => 'uni1D34',\n    7477 => 'uni1D35',\n    7478 => 'uni1D36',\n    7479 => 'uni1D37',\n    7480 => 'uni1D38',\n    7481 => 'uni1D39',\n    7482 => 'uni1D3A',\n    7483 => 'uni1D3B',\n    7484 => 'uni1D3C',\n    7485 => 'uni1D3D',\n    7486 => 'uni1D3E',\n    7487 => 'uni1D3F',\n    7488 => 'uni1D40',\n    7489 => 'uni1D41',\n    7490 => 'uni1D42',\n    7491 => 'uni1D43',\n    7492 => 'uni1D44',\n    7493 => 'uni1D45',\n    7494 => 'uni1D46',\n    7495 => 'uni1D47',\n    7496 => 'uni1D48',\n    7497 => 'uni1D49',\n    7498 => 'uni1D4A',\n    7499 => 'uni1D4B',\n    7500 => 'uni1D4C',\n    7501 => 'uni1D4D',\n    7502 => 'uni1D4E',\n    7503 => 'uni1D4F',\n    7504 => 'uni1D50',\n    7505 => 'uni1D51',\n    7506 => 'uni1D52',\n    7507 => 'uni1D53',\n    7508 => 'uni1D54',\n    7509 => 'uni1D55',\n    7510 => 'uni1D56',\n    7511 => 'uni1D57',\n    7512 => 'uni1D58',\n    7513 => 'uni1D59',\n    7514 => 'uni1D5A',\n    7515 => 'uni1D5B',\n    7517 => 'uni1D5D',\n    7518 => 'uni1D5E',\n    7519 => 'uni1D5F',\n    7520 => 'uni1D60',\n    7521 => 'uni1D61',\n    7522 => 'uni1D62',\n    7523 => 'uni1D63',\n    7524 => 'uni1D64',\n    7525 => 'uni1D65',\n    7526 => 'uni1D66',\n    7527 => 'uni1D67',\n    7528 => 'uni1D68',\n    7529 => 'uni1D69',\n    7530 => 'uni1D6A',\n    7543 => 'uni1D77',\n    7544 => 'uni1D78',\n    7547 => 'uni1D7B',\n    7549 => 'uni1D7D',\n    7557 => 'uni1D85',\n    7579 => 'uni1D9B',\n    7580 => 'uni1D9C',\n    7581 => 'uni1D9D',\n    7582 => 'uni1D9E',\n    7583 => 'uni1D9F',\n    7584 => 'uni1DA0',\n    7585 => 'uni1DA1',\n    7586 => 'uni1DA2',\n    7587 => 'uni1DA3',\n    7588 => 'uni1DA4',\n    7589 => 'uni1DA5',\n    7590 => 'uni1DA6',\n    7591 => 'uni1DA7',\n    7592 => 'uni1DA8',\n    7593 => 'uni1DA9',\n    7594 => 'uni1DAA',\n    7595 => 'uni1DAB',\n    7596 => 'uni1DAC',\n    7597 => 'uni1DAD',\n    7598 => 'uni1DAE',\n    7599 => 'uni1DAF',\n    7600 => 'uni1DB0',\n    7601 => 'uni1DB1',\n    7602 => 'uni1DB2',\n    7603 => 'uni1DB3',\n    7604 => 'uni1DB4',\n    7605 => 'uni1DB5',\n    7606 => 'uni1DB6',\n    7607 => 'uni1DB7',\n    7608 => 'uni1DB8',\n    7609 => 'uni1DB9',\n    7610 => 'uni1DBA',\n    7611 => 'uni1DBB',\n    7612 => 'uni1DBC',\n    7613 => 'uni1DBD',\n    7614 => 'uni1DBE',\n    7615 => 'uni1DBF',\n    7620 => 'uni1DC4',\n    7621 => 'uni1DC5',\n    7622 => 'uni1DC6',\n    7623 => 'uni1DC7',\n    7624 => 'uni1DC8',\n    7625 => 'uni1DC9',\n    7680 => 'uni1E00',\n    7681 => 'uni1E01',\n    7682 => 'uni1E02',\n    7683 => 'uni1E03',\n    7684 => 'uni1E04',\n    7685 => 'uni1E05',\n    7686 => 'uni1E06',\n    7687 => 'uni1E07',\n    7688 => 'uni1E08',\n    7689 => 'uni1E09',\n    7690 => 'uni1E0A',\n    7691 => 'uni1E0B',\n    7692 => 'uni1E0C',\n    7693 => 'uni1E0D',\n    7694 => 'uni1E0E',\n    7695 => 'uni1E0F',\n    7696 => 'uni1E10',\n    7697 => 'uni1E11',\n    7698 => 'uni1E12',\n    7699 => 'uni1E13',\n    7700 => 'uni1E14',\n    7701 => 'uni1E15',\n    7702 => 'uni1E16',\n    7703 => 'uni1E17',\n    7704 => 'uni1E18',\n    7705 => 'uni1E19',\n    7706 => 'uni1E1A',\n    7707 => 'uni1E1B',\n    7708 => 'uni1E1C',\n    7709 => 'uni1E1D',\n    7710 => 'uni1E1E',\n    7711 => 'uni1E1F',\n    7712 => 'uni1E20',\n    7713 => 'uni1E21',\n    7714 => 'uni1E22',\n    7715 => 'uni1E23',\n    7716 => 'uni1E24',\n    7717 => 'uni1E25',\n    7718 => 'uni1E26',\n    7719 => 'uni1E27',\n    7720 => 'uni1E28',\n    7721 => 'uni1E29',\n    7722 => 'uni1E2A',\n    7723 => 'uni1E2B',\n    7724 => 'uni1E2C',\n    7725 => 'uni1E2D',\n    7726 => 'uni1E2E',\n    7727 => 'uni1E2F',\n    7728 => 'uni1E30',\n    7729 => 'uni1E31',\n    7730 => 'uni1E32',\n    7731 => 'uni1E33',\n    7732 => 'uni1E34',\n    7733 => 'uni1E35',\n    7734 => 'uni1E36',\n    7735 => 'uni1E37',\n    7736 => 'uni1E38',\n    7737 => 'uni1E39',\n    7738 => 'uni1E3A',\n    7739 => 'uni1E3B',\n    7740 => 'uni1E3C',\n    7741 => 'uni1E3D',\n    7742 => 'uni1E3E',\n    7743 => 'uni1E3F',\n    7744 => 'uni1E40',\n    7745 => 'uni1E41',\n    7746 => 'uni1E42',\n    7747 => 'uni1E43',\n    7748 => 'uni1E44',\n    7749 => 'uni1E45',\n    7750 => 'uni1E46',\n    7751 => 'uni1E47',\n    7752 => 'uni1E48',\n    7753 => 'uni1E49',\n    7754 => 'uni1E4A',\n    7755 => 'uni1E4B',\n    7756 => 'uni1E4C',\n    7757 => 'uni1E4D',\n    7758 => 'uni1E4E',\n    7759 => 'uni1E4F',\n    7760 => 'uni1E50',\n    7761 => 'uni1E51',\n    7762 => 'uni1E52',\n    7763 => 'uni1E53',\n    7764 => 'uni1E54',\n    7765 => 'uni1E55',\n    7766 => 'uni1E56',\n    7767 => 'uni1E57',\n    7768 => 'uni1E58',\n    7769 => 'uni1E59',\n    7770 => 'uni1E5A',\n    7771 => 'uni1E5B',\n    7772 => 'uni1E5C',\n    7773 => 'uni1E5D',\n    7774 => 'uni1E5E',\n    7775 => 'uni1E5F',\n    7776 => 'uni1E60',\n    7777 => 'uni1E61',\n    7778 => 'uni1E62',\n    7779 => 'uni1E63',\n    7780 => 'uni1E64',\n    7781 => 'uni1E65',\n    7782 => 'uni1E66',\n    7783 => 'uni1E67',\n    7784 => 'uni1E68',\n    7785 => 'uni1E69',\n    7786 => 'uni1E6A',\n    7787 => 'uni1E6B',\n    7788 => 'uni1E6C',\n    7789 => 'uni1E6D',\n    7790 => 'uni1E6E',\n    7791 => 'uni1E6F',\n    7792 => 'uni1E70',\n    7793 => 'uni1E71',\n    7794 => 'uni1E72',\n    7795 => 'uni1E73',\n    7796 => 'uni1E74',\n    7797 => 'uni1E75',\n    7798 => 'uni1E76',\n    7799 => 'uni1E77',\n    7800 => 'uni1E78',\n    7801 => 'uni1E79',\n    7802 => 'uni1E7A',\n    7803 => 'uni1E7B',\n    7804 => 'uni1E7C',\n    7805 => 'uni1E7D',\n    7806 => 'uni1E7E',\n    7807 => 'uni1E7F',\n    7808 => 'Wgrave',\n    7809 => 'wgrave',\n    7810 => 'Wacute',\n    7811 => 'wacute',\n    7812 => 'Wdieresis',\n    7813 => 'wdieresis',\n    7814 => 'uni1E86',\n    7815 => 'uni1E87',\n    7816 => 'uni1E88',\n    7817 => 'uni1E89',\n    7818 => 'uni1E8A',\n    7819 => 'uni1E8B',\n    7820 => 'uni1E8C',\n    7821 => 'uni1E8D',\n    7822 => 'uni1E8E',\n    7823 => 'uni1E8F',\n    7824 => 'uni1E90',\n    7825 => 'uni1E91',\n    7826 => 'uni1E92',\n    7827 => 'uni1E93',\n    7828 => 'uni1E94',\n    7829 => 'uni1E95',\n    7830 => 'uni1E96',\n    7831 => 'uni1E97',\n    7832 => 'uni1E98',\n    7833 => 'uni1E99',\n    7834 => 'uni1E9A',\n    7835 => 'uni1E9B',\n    7836 => 'uni1E9C',\n    7837 => 'uni1E9D',\n    7838 => 'uni1E9E',\n    7839 => 'uni1E9F',\n    7840 => 'uni1EA0',\n    7841 => 'uni1EA1',\n    7842 => 'uni1EA2',\n    7843 => 'uni1EA3',\n    7844 => 'uni1EA4',\n    7845 => 'uni1EA5',\n    7846 => 'uni1EA6',\n    7847 => 'uni1EA7',\n    7848 => 'uni1EA8',\n    7849 => 'uni1EA9',\n    7850 => 'uni1EAA',\n    7851 => 'uni1EAB',\n    7852 => 'uni1EAC',\n    7853 => 'uni1EAD',\n    7854 => 'uni1EAE',\n    7855 => 'uni1EAF',\n    7856 => 'uni1EB0',\n    7857 => 'uni1EB1',\n    7858 => 'uni1EB2',\n    7859 => 'uni1EB3',\n    7860 => 'uni1EB4',\n    7861 => 'uni1EB5',\n    7862 => 'uni1EB6',\n    7863 => 'uni1EB7',\n    7864 => 'uni1EB8',\n    7865 => 'uni1EB9',\n    7866 => 'uni1EBA',\n    7867 => 'uni1EBB',\n    7868 => 'uni1EBC',\n    7869 => 'uni1EBD',\n    7870 => 'uni1EBE',\n    7871 => 'uni1EBF',\n    7872 => 'uni1EC0',\n    7873 => 'uni1EC1',\n    7874 => 'uni1EC2',\n    7875 => 'uni1EC3',\n    7876 => 'uni1EC4',\n    7877 => 'uni1EC5',\n    7878 => 'uni1EC6',\n    7879 => 'uni1EC7',\n    7880 => 'uni1EC8',\n    7881 => 'uni1EC9',\n    7882 => 'uni1ECA',\n    7883 => 'uni1ECB',\n    7884 => 'uni1ECC',\n    7885 => 'uni1ECD',\n    7886 => 'uni1ECE',\n    7887 => 'uni1ECF',\n    7888 => 'uni1ED0',\n    7889 => 'uni1ED1',\n    7890 => 'uni1ED2',\n    7891 => 'uni1ED3',\n    7892 => 'uni1ED4',\n    7893 => 'uni1ED5',\n    7894 => 'uni1ED6',\n    7895 => 'uni1ED7',\n    7896 => 'uni1ED8',\n    7897 => 'uni1ED9',\n    7898 => 'uni1EDA',\n    7899 => 'uni1EDB',\n    7900 => 'uni1EDC',\n    7901 => 'uni1EDD',\n    7902 => 'uni1EDE',\n    7903 => 'uni1EDF',\n    7904 => 'uni1EE0',\n    7905 => 'uni1EE1',\n    7906 => 'uni1EE2',\n    7907 => 'uni1EE3',\n    7908 => 'uni1EE4',\n    7909 => 'uni1EE5',\n    7910 => 'uni1EE6',\n    7911 => 'uni1EE7',\n    7912 => 'uni1EE8',\n    7913 => 'uni1EE9',\n    7914 => 'uni1EEA',\n    7915 => 'uni1EEB',\n    7916 => 'uni1EEC',\n    7917 => 'uni1EED',\n    7918 => 'uni1EEE',\n    7919 => 'uni1EEF',\n    7920 => 'uni1EF0',\n    7921 => 'uni1EF1',\n    7922 => 'Ygrave',\n    7923 => 'ygrave',\n    7924 => 'uni1EF4',\n    7925 => 'uni1EF5',\n    7926 => 'uni1EF6',\n    7927 => 'uni1EF7',\n    7928 => 'uni1EF8',\n    7929 => 'uni1EF9',\n    7930 => 'uni1EFA',\n    7931 => 'uni1EFB',\n    7936 => 'uni1F00',\n    7937 => 'uni1F01',\n    7938 => 'uni1F02',\n    7939 => 'uni1F03',\n    7940 => 'uni1F04',\n    7941 => 'uni1F05',\n    7942 => 'uni1F06',\n    7943 => 'uni1F07',\n    7944 => 'uni1F08',\n    7945 => 'uni1F09',\n    7946 => 'uni1F0A',\n    7947 => 'uni1F0B',\n    7948 => 'uni1F0C',\n    7949 => 'uni1F0D',\n    7950 => 'uni1F0E',\n    7951 => 'uni1F0F',\n    7952 => 'uni1F10',\n    7953 => 'uni1F11',\n    7954 => 'uni1F12',\n    7955 => 'uni1F13',\n    7956 => 'uni1F14',\n    7957 => 'uni1F15',\n    7960 => 'uni1F18',\n    7961 => 'uni1F19',\n    7962 => 'uni1F1A',\n    7963 => 'uni1F1B',\n    7964 => 'uni1F1C',\n    7965 => 'uni1F1D',\n    7968 => 'uni1F20',\n    7969 => 'uni1F21',\n    7970 => 'uni1F22',\n    7971 => 'uni1F23',\n    7972 => 'uni1F24',\n    7973 => 'uni1F25',\n    7974 => 'uni1F26',\n    7975 => 'uni1F27',\n    7976 => 'uni1F28',\n    7977 => 'uni1F29',\n    7978 => 'uni1F2A',\n    7979 => 'uni1F2B',\n    7980 => 'uni1F2C',\n    7981 => 'uni1F2D',\n    7982 => 'uni1F2E',\n    7983 => 'uni1F2F',\n    7984 => 'uni1F30',\n    7985 => 'uni1F31',\n    7986 => 'uni1F32',\n    7987 => 'uni1F33',\n    7988 => 'uni1F34',\n    7989 => 'uni1F35',\n    7990 => 'uni1F36',\n    7991 => 'uni1F37',\n    7992 => 'uni1F38',\n    7993 => 'uni1F39',\n    7994 => 'uni1F3A',\n    7995 => 'uni1F3B',\n    7996 => 'uni1F3C',\n    7997 => 'uni1F3D',\n    7998 => 'uni1F3E',\n    7999 => 'uni1F3F',\n    8000 => 'uni1F40',\n    8001 => 'uni1F41',\n    8002 => 'uni1F42',\n    8003 => 'uni1F43',\n    8004 => 'uni1F44',\n    8005 => 'uni1F45',\n    8008 => 'uni1F48',\n    8009 => 'uni1F49',\n    8010 => 'uni1F4A',\n    8011 => 'uni1F4B',\n    8012 => 'uni1F4C',\n    8013 => 'uni1F4D',\n    8016 => 'uni1F50',\n    8017 => 'uni1F51',\n    8018 => 'uni1F52',\n    8019 => 'uni1F53',\n    8020 => 'uni1F54',\n    8021 => 'uni1F55',\n    8022 => 'uni1F56',\n    8023 => 'uni1F57',\n    8025 => 'uni1F59',\n    8027 => 'uni1F5B',\n    8029 => 'uni1F5D',\n    8031 => 'uni1F5F',\n    8032 => 'uni1F60',\n    8033 => 'uni1F61',\n    8034 => 'uni1F62',\n    8035 => 'uni1F63',\n    8036 => 'uni1F64',\n    8037 => 'uni1F65',\n    8038 => 'uni1F66',\n    8039 => 'uni1F67',\n    8040 => 'uni1F68',\n    8041 => 'uni1F69',\n    8042 => 'uni1F6A',\n    8043 => 'uni1F6B',\n    8044 => 'uni1F6C',\n    8045 => 'uni1F6D',\n    8046 => 'uni1F6E',\n    8047 => 'uni1F6F',\n    8048 => 'uni1F70',\n    8049 => 'uni1F71',\n    8050 => 'uni1F72',\n    8051 => 'uni1F73',\n    8052 => 'uni1F74',\n    8053 => 'uni1F75',\n    8054 => 'uni1F76',\n    8055 => 'uni1F77',\n    8056 => 'uni1F78',\n    8057 => 'uni1F79',\n    8058 => 'uni1F7A',\n    8059 => 'uni1F7B',\n    8060 => 'uni1F7C',\n    8061 => 'uni1F7D',\n    8064 => 'uni1F80',\n    8065 => 'uni1F81',\n    8066 => 'uni1F82',\n    8067 => 'uni1F83',\n    8068 => 'uni1F84',\n    8069 => 'uni1F85',\n    8070 => 'uni1F86',\n    8071 => 'uni1F87',\n    8072 => 'uni1F88',\n    8073 => 'uni1F89',\n    8074 => 'uni1F8A',\n    8075 => 'uni1F8B',\n    8076 => 'uni1F8C',\n    8077 => 'uni1F8D',\n    8078 => 'uni1F8E',\n    8079 => 'uni1F8F',\n    8080 => 'uni1F90',\n    8081 => 'uni1F91',\n    8082 => 'uni1F92',\n    8083 => 'uni1F93',\n    8084 => 'uni1F94',\n    8085 => 'uni1F95',\n    8086 => 'uni1F96',\n    8087 => 'uni1F97',\n    8088 => 'uni1F98',\n    8089 => 'uni1F99',\n    8090 => 'uni1F9A',\n    8091 => 'uni1F9B',\n    8092 => 'uni1F9C',\n    8093 => 'uni1F9D',\n    8094 => 'uni1F9E',\n    8095 => 'uni1F9F',\n    8096 => 'uni1FA0',\n    8097 => 'uni1FA1',\n    8098 => 'uni1FA2',\n    8099 => 'uni1FA3',\n    8100 => 'uni1FA4',\n    8101 => 'uni1FA5',\n    8102 => 'uni1FA6',\n    8103 => 'uni1FA7',\n    8104 => 'uni1FA8',\n    8105 => 'uni1FA9',\n    8106 => 'uni1FAA',\n    8107 => 'uni1FAB',\n    8108 => 'uni1FAC',\n    8109 => 'uni1FAD',\n    8110 => 'uni1FAE',\n    8111 => 'uni1FAF',\n    8112 => 'uni1FB0',\n    8113 => 'uni1FB1',\n    8114 => 'uni1FB2',\n    8115 => 'uni1FB3',\n    8116 => 'uni1FB4',\n    8118 => 'uni1FB6',\n    8119 => 'uni1FB7',\n    8120 => 'uni1FB8',\n    8121 => 'uni1FB9',\n    8122 => 'uni1FBA',\n    8123 => 'uni1FBB',\n    8124 => 'uni1FBC',\n    8125 => 'uni1FBD',\n    8126 => 'uni1FBE',\n    8127 => 'uni1FBF',\n    8128 => 'uni1FC0',\n    8129 => 'uni1FC1',\n    8130 => 'uni1FC2',\n    8131 => 'uni1FC3',\n    8132 => 'uni1FC4',\n    8134 => 'uni1FC6',\n    8135 => 'uni1FC7',\n    8136 => 'uni1FC8',\n    8137 => 'uni1FC9',\n    8138 => 'uni1FCA',\n    8139 => 'uni1FCB',\n    8140 => 'uni1FCC',\n    8141 => 'uni1FCD',\n    8142 => 'uni1FCE',\n    8143 => 'uni1FCF',\n    8144 => 'uni1FD0',\n    8145 => 'uni1FD1',\n    8146 => 'uni1FD2',\n    8147 => 'uni1FD3',\n    8150 => 'uni1FD6',\n    8151 => 'uni1FD7',\n    8152 => 'uni1FD8',\n    8153 => 'uni1FD9',\n    8154 => 'uni1FDA',\n    8155 => 'uni1FDB',\n    8157 => 'uni1FDD',\n    8158 => 'uni1FDE',\n    8159 => 'uni1FDF',\n    8160 => 'uni1FE0',\n    8161 => 'uni1FE1',\n    8162 => 'uni1FE2',\n    8163 => 'uni1FE3',\n    8164 => 'uni1FE4',\n    8165 => 'uni1FE5',\n    8166 => 'uni1FE6',\n    8167 => 'uni1FE7',\n    8168 => 'uni1FE8',\n    8169 => 'uni1FE9',\n    8170 => 'uni1FEA',\n    8171 => 'uni1FEB',\n    8172 => 'uni1FEC',\n    8173 => 'uni1FED',\n    8174 => 'uni1FEE',\n    8175 => 'uni1FEF',\n    8178 => 'uni1FF2',\n    8179 => 'uni1FF3',\n    8180 => 'uni1FF4',\n    8182 => 'uni1FF6',\n    8183 => 'uni1FF7',\n    8184 => 'uni1FF8',\n    8185 => 'uni1FF9',\n    8186 => 'uni1FFA',\n    8187 => 'uni1FFB',\n    8188 => 'uni1FFC',\n    8189 => 'uni1FFD',\n    8190 => 'uni1FFE',\n    8192 => 'uni2000',\n    8193 => 'uni2001',\n    8194 => 'uni2002',\n    8195 => 'uni2003',\n    8196 => 'uni2004',\n    8197 => 'uni2005',\n    8198 => 'uni2006',\n    8199 => 'uni2007',\n    8200 => 'uni2008',\n    8201 => 'uni2009',\n    8202 => 'uni200A',\n    8203 => 'uni200B',\n    8204 => 'uni200C',\n    8205 => 'uni200D',\n    8206 => 'uni200E',\n    8207 => 'uni200F',\n    8208 => 'uni2010',\n    8209 => 'uni2011',\n    8210 => 'figuredash',\n    8211 => 'endash',\n    8212 => 'emdash',\n    8213 => 'uni2015',\n    8214 => 'uni2016',\n    8215 => 'underscoredbl',\n    8216 => 'quoteleft',\n    8217 => 'quoteright',\n    8218 => 'quotesinglbase',\n    8219 => 'quotereversed',\n    8220 => 'quotedblleft',\n    8221 => 'quotedblright',\n    8222 => 'quotedblbase',\n    8223 => 'uni201F',\n    8224 => 'dagger',\n    8225 => 'daggerdbl',\n    8226 => 'bullet',\n    8227 => 'uni2023',\n    8228 => 'onedotenleader',\n    8229 => 'twodotenleader',\n    8230 => 'ellipsis',\n    8231 => 'uni2027',\n    8232 => 'uni2028',\n    8233 => 'uni2029',\n    8234 => 'uni202A',\n    8235 => 'uni202B',\n    8236 => 'uni202C',\n    8237 => 'uni202D',\n    8238 => 'uni202E',\n    8239 => 'uni202F',\n    8240 => 'perthousand',\n    8241 => 'uni2031',\n    8242 => 'minute',\n    8243 => 'second',\n    8244 => 'uni2034',\n    8245 => 'uni2035',\n    8246 => 'uni2036',\n    8247 => 'uni2037',\n    8248 => 'uni2038',\n    8249 => 'guilsinglleft',\n    8250 => 'guilsinglright',\n    8251 => 'uni203B',\n    8252 => 'exclamdbl',\n    8253 => 'uni203D',\n    8254 => 'uni203E',\n    8255 => 'uni203F',\n    8256 => 'uni2040',\n    8257 => 'uni2041',\n    8258 => 'uni2042',\n    8259 => 'uni2043',\n    8260 => 'fraction',\n    8261 => 'uni2045',\n    8262 => 'uni2046',\n    8263 => 'uni2047',\n    8264 => 'uni2048',\n    8265 => 'uni2049',\n    8266 => 'uni204A',\n    8267 => 'uni204B',\n    8268 => 'uni204C',\n    8269 => 'uni204D',\n    8270 => 'uni204E',\n    8271 => 'uni204F',\n    8272 => 'uni2050',\n    8273 => 'uni2051',\n    8274 => 'uni2052',\n    8275 => 'uni2053',\n    8276 => 'uni2054',\n    8277 => 'uni2055',\n    8278 => 'uni2056',\n    8279 => 'uni2057',\n    8280 => 'uni2058',\n    8281 => 'uni2059',\n    8282 => 'uni205A',\n    8283 => 'uni205B',\n    8284 => 'uni205C',\n    8285 => 'uni205D',\n    8286 => 'uni205E',\n    8287 => 'uni205F',\n    8288 => 'uni2060',\n    8289 => 'uni2061',\n    8290 => 'uni2062',\n    8291 => 'uni2063',\n    8292 => 'uni2064',\n    8298 => 'uni206A',\n    8299 => 'uni206B',\n    8300 => 'uni206C',\n    8301 => 'uni206D',\n    8302 => 'uni206E',\n    8303 => 'uni206F',\n    8304 => 'uni2070',\n    8305 => 'uni2071',\n    8308 => 'uni2074',\n    8309 => 'uni2075',\n    8310 => 'uni2076',\n    8311 => 'uni2077',\n    8312 => 'uni2078',\n    8313 => 'uni2079',\n    8314 => 'uni207A',\n    8315 => 'uni207B',\n    8316 => 'uni207C',\n    8317 => 'uni207D',\n    8318 => 'uni207E',\n    8319 => 'uni207F',\n    8320 => 'uni2080',\n    8321 => 'uni2081',\n    8322 => 'uni2082',\n    8323 => 'uni2083',\n    8324 => 'uni2084',\n    8325 => 'uni2085',\n    8326 => 'uni2086',\n    8327 => 'uni2087',\n    8328 => 'uni2088',\n    8329 => 'uni2089',\n    8330 => 'uni208A',\n    8331 => 'uni208B',\n    8332 => 'uni208C',\n    8333 => 'uni208D',\n    8334 => 'uni208E',\n    8336 => 'uni2090',\n    8337 => 'uni2091',\n    8338 => 'uni2092',\n    8339 => 'uni2093',\n    8340 => 'uni2094',\n    8341 => 'uni2095',\n    8342 => 'uni2096',\n    8343 => 'uni2097',\n    8344 => 'uni2098',\n    8345 => 'uni2099',\n    8346 => 'uni209A',\n    8347 => 'uni209B',\n    8348 => 'uni209C',\n    8352 => 'uni20A0',\n    8353 => 'colonmonetary',\n    8354 => 'uni20A2',\n    8355 => 'franc',\n    8356 => 'lira',\n    8357 => 'uni20A5',\n    8358 => 'uni20A6',\n    8359 => 'peseta',\n    8360 => 'uni20A8',\n    8361 => 'uni20A9',\n    8362 => 'uni20AA',\n    8363 => 'dong',\n    8364 => 'Euro',\n    8365 => 'uni20AD',\n    8366 => 'uni20AE',\n    8367 => 'uni20AF',\n    8368 => 'uni20B0',\n    8369 => 'uni20B1',\n    8370 => 'uni20B2',\n    8371 => 'uni20B3',\n    8372 => 'uni20B4',\n    8373 => 'uni20B5',\n    8376 => 'uni20B8',\n    8377 => 'uni20B9',\n    8378 => 'uni20BA',\n    8381 => 'uni20BD',\n    8400 => 'uni20D0',\n    8401 => 'uni20D1',\n    8406 => 'uni20D6',\n    8407 => 'uni20D7',\n    8411 => 'uni20DB',\n    8412 => 'uni20DC',\n    8417 => 'uni20E1',\n    8448 => 'uni2100',\n    8449 => 'uni2101',\n    8450 => 'uni2102',\n    8451 => 'uni2103',\n    8452 => 'uni2104',\n    8453 => 'uni2105',\n    8454 => 'uni2106',\n    8455 => 'uni2107',\n    8456 => 'uni2108',\n    8457 => 'uni2109',\n    8459 => 'uni210B',\n    8460 => 'uni210C',\n    8461 => 'uni210D',\n    8462 => 'uni210E',\n    8463 => 'uni210F',\n    8464 => 'uni2110',\n    8465 => 'Ifraktur',\n    8466 => 'uni2112',\n    8467 => 'uni2113',\n    8468 => 'uni2114',\n    8469 => 'uni2115',\n    8470 => 'uni2116',\n    8471 => 'uni2117',\n    8472 => 'weierstrass',\n    8473 => 'uni2119',\n    8474 => 'uni211A',\n    8475 => 'uni211B',\n    8476 => 'Rfraktur',\n    8477 => 'uni211D',\n    8478 => 'prescription',\n    8479 => 'uni211F',\n    8480 => 'uni2120',\n    8481 => 'uni2121',\n    8482 => 'trademark',\n    8483 => 'uni2123',\n    8484 => 'uni2124',\n    8485 => 'uni2125',\n    8486 => 'uni2126',\n    8487 => 'uni2127',\n    8488 => 'uni2128',\n    8489 => 'uni2129',\n    8490 => 'uni212A',\n    8491 => 'uni212B',\n    8492 => 'uni212C',\n    8493 => 'uni212D',\n    8494 => 'estimated',\n    8495 => 'uni212F',\n    8496 => 'uni2130',\n    8497 => 'uni2131',\n    8498 => 'uni2132',\n    8499 => 'uni2133',\n    8500 => 'uni2134',\n    8501 => 'aleph',\n    8502 => 'uni2136',\n    8503 => 'uni2137',\n    8504 => 'uni2138',\n    8505 => 'uni2139',\n    8506 => 'uni213A',\n    8507 => 'uni213B',\n    8508 => 'uni213C',\n    8509 => 'uni213D',\n    8510 => 'uni213E',\n    8511 => 'uni213F',\n    8512 => 'uni2140',\n    8513 => 'uni2141',\n    8514 => 'uni2142',\n    8515 => 'uni2143',\n    8516 => 'uni2144',\n    8517 => 'uni2145',\n    8518 => 'uni2146',\n    8519 => 'uni2147',\n    8520 => 'uni2148',\n    8521 => 'uni2149',\n    8523 => 'uni214B',\n    8526 => 'uni214E',\n    8528 => 'uni2150',\n    8529 => 'uni2151',\n    8530 => 'uni2152',\n    8531 => 'onethird',\n    8532 => 'twothirds',\n    8533 => 'uni2155',\n    8534 => 'uni2156',\n    8535 => 'uni2157',\n    8536 => 'uni2158',\n    8537 => 'uni2159',\n    8538 => 'uni215A',\n    8539 => 'oneeighth',\n    8540 => 'threeeighths',\n    8541 => 'fiveeighths',\n    8542 => 'seveneighths',\n    8543 => 'uni215F',\n    8544 => 'uni2160',\n    8545 => 'uni2161',\n    8546 => 'uni2162',\n    8547 => 'uni2163',\n    8548 => 'uni2164',\n    8549 => 'uni2165',\n    8550 => 'uni2166',\n    8551 => 'uni2167',\n    8552 => 'uni2168',\n    8553 => 'uni2169',\n    8554 => 'uni216A',\n    8555 => 'uni216B',\n    8556 => 'uni216C',\n    8557 => 'uni216D',\n    8558 => 'uni216E',\n    8559 => 'uni216F',\n    8560 => 'uni2170',\n    8561 => 'uni2171',\n    8562 => 'uni2172',\n    8563 => 'uni2173',\n    8564 => 'uni2174',\n    8565 => 'uni2175',\n    8566 => 'uni2176',\n    8567 => 'uni2177',\n    8568 => 'uni2178',\n    8569 => 'uni2179',\n    8570 => 'uni217A',\n    8571 => 'uni217B',\n    8572 => 'uni217C',\n    8573 => 'uni217D',\n    8574 => 'uni217E',\n    8575 => 'uni217F',\n    8576 => 'uni2180',\n    8577 => 'uni2181',\n    8578 => 'uni2182',\n    8579 => 'uni2183',\n    8580 => 'uni2184',\n    8581 => 'uni2185',\n    8585 => 'uni2189',\n    8592 => 'arrowleft',\n    8593 => 'arrowup',\n    8594 => 'arrowright',\n    8595 => 'arrowdown',\n    8596 => 'arrowboth',\n    8597 => 'arrowupdn',\n    8598 => 'uni2196',\n    8599 => 'uni2197',\n    8600 => 'uni2198',\n    8601 => 'uni2199',\n    8602 => 'uni219A',\n    8603 => 'uni219B',\n    8604 => 'uni219C',\n    8605 => 'uni219D',\n    8606 => 'uni219E',\n    8607 => 'uni219F',\n    8608 => 'uni21A0',\n    8609 => 'uni21A1',\n    8610 => 'uni21A2',\n    8611 => 'uni21A3',\n    8612 => 'uni21A4',\n    8613 => 'uni21A5',\n    8614 => 'uni21A6',\n    8615 => 'uni21A7',\n    8616 => 'arrowupdnbse',\n    8617 => 'uni21A9',\n    8618 => 'uni21AA',\n    8619 => 'uni21AB',\n    8620 => 'uni21AC',\n    8621 => 'uni21AD',\n    8622 => 'uni21AE',\n    8623 => 'uni21AF',\n    8624 => 'uni21B0',\n    8625 => 'uni21B1',\n    8626 => 'uni21B2',\n    8627 => 'uni21B3',\n    8628 => 'uni21B4',\n    8629 => 'carriagereturn',\n    8630 => 'uni21B6',\n    8631 => 'uni21B7',\n    8632 => 'uni21B8',\n    8633 => 'uni21B9',\n    8634 => 'uni21BA',\n    8635 => 'uni21BB',\n    8636 => 'uni21BC',\n    8637 => 'uni21BD',\n    8638 => 'uni21BE',\n    8639 => 'uni21BF',\n    8640 => 'uni21C0',\n    8641 => 'uni21C1',\n    8642 => 'uni21C2',\n    8643 => 'uni21C3',\n    8644 => 'uni21C4',\n    8645 => 'uni21C5',\n    8646 => 'uni21C6',\n    8647 => 'uni21C7',\n    8648 => 'uni21C8',\n    8649 => 'uni21C9',\n    8650 => 'uni21CA',\n    8651 => 'uni21CB',\n    8652 => 'uni21CC',\n    8653 => 'uni21CD',\n    8654 => 'uni21CE',\n    8655 => 'uni21CF',\n    8656 => 'arrowdblleft',\n    8657 => 'arrowdblup',\n    8658 => 'arrowdblright',\n    8659 => 'arrowdbldown',\n    8660 => 'arrowdblboth',\n    8661 => 'uni21D5',\n    8662 => 'uni21D6',\n    8663 => 'uni21D7',\n    8664 => 'uni21D8',\n    8665 => 'uni21D9',\n    8666 => 'uni21DA',\n    8667 => 'uni21DB',\n    8668 => 'uni21DC',\n    8669 => 'uni21DD',\n    8670 => 'uni21DE',\n    8671 => 'uni21DF',\n    8672 => 'uni21E0',\n    8673 => 'uni21E1',\n    8674 => 'uni21E2',\n    8675 => 'uni21E3',\n    8676 => 'uni21E4',\n    8677 => 'uni21E5',\n    8678 => 'uni21E6',\n    8679 => 'uni21E7',\n    8680 => 'uni21E8',\n    8681 => 'uni21E9',\n    8682 => 'uni21EA',\n    8683 => 'uni21EB',\n    8684 => 'uni21EC',\n    8685 => 'uni21ED',\n    8686 => 'uni21EE',\n    8687 => 'uni21EF',\n    8688 => 'uni21F0',\n    8689 => 'uni21F1',\n    8690 => 'uni21F2',\n    8691 => 'uni21F3',\n    8692 => 'uni21F4',\n    8693 => 'uni21F5',\n    8694 => 'uni21F6',\n    8695 => 'uni21F7',\n    8696 => 'uni21F8',\n    8697 => 'uni21F9',\n    8698 => 'uni21FA',\n    8699 => 'uni21FB',\n    8700 => 'uni21FC',\n    8701 => 'uni21FD',\n    8702 => 'uni21FE',\n    8703 => 'uni21FF',\n    8704 => 'universal',\n    8705 => 'uni2201',\n    8706 => 'partialdiff',\n    8707 => 'existential',\n    8708 => 'uni2204',\n    8709 => 'emptyset',\n    8710 => 'increment',\n    8711 => 'gradient',\n    8712 => 'element',\n    8713 => 'notelement',\n    8714 => 'uni220A',\n    8715 => 'suchthat',\n    8716 => 'uni220C',\n    8717 => 'uni220D',\n    8718 => 'uni220E',\n    8719 => 'product',\n    8720 => 'uni2210',\n    8721 => 'summation',\n    8722 => 'minus',\n    8723 => 'uni2213',\n    8724 => 'uni2214',\n    8725 => 'uni2215',\n    8726 => 'uni2216',\n    8727 => 'asteriskmath',\n    8728 => 'uni2218',\n    8729 => 'uni2219',\n    8730 => 'radical',\n    8731 => 'uni221B',\n    8732 => 'uni221C',\n    8733 => 'proportional',\n    8734 => 'infinity',\n    8735 => 'orthogonal',\n    8736 => 'angle',\n    8737 => 'uni2221',\n    8738 => 'uni2222',\n    8739 => 'uni2223',\n    8740 => 'uni2224',\n    8741 => 'uni2225',\n    8742 => 'uni2226',\n    8743 => 'logicaland',\n    8744 => 'logicalor',\n    8745 => 'intersection',\n    8746 => 'union',\n    8747 => 'integral',\n    8748 => 'uni222C',\n    8749 => 'uni222D',\n    8750 => 'uni222E',\n    8751 => 'uni222F',\n    8752 => 'uni2230',\n    8753 => 'uni2231',\n    8754 => 'uni2232',\n    8755 => 'uni2233',\n    8756 => 'therefore',\n    8757 => 'uni2235',\n    8758 => 'uni2236',\n    8759 => 'uni2237',\n    8760 => 'uni2238',\n    8761 => 'uni2239',\n    8762 => 'uni223A',\n    8763 => 'uni223B',\n    8764 => 'similar',\n    8765 => 'uni223D',\n    8766 => 'uni223E',\n    8767 => 'uni223F',\n    8768 => 'uni2240',\n    8769 => 'uni2241',\n    8770 => 'uni2242',\n    8771 => 'uni2243',\n    8772 => 'uni2244',\n    8773 => 'congruent',\n    8774 => 'uni2246',\n    8775 => 'uni2247',\n    8776 => 'approxequal',\n    8777 => 'uni2249',\n    8778 => 'uni224A',\n    8779 => 'uni224B',\n    8780 => 'uni224C',\n    8781 => 'uni224D',\n    8782 => 'uni224E',\n    8783 => 'uni224F',\n    8784 => 'uni2250',\n    8785 => 'uni2251',\n    8786 => 'uni2252',\n    8787 => 'uni2253',\n    8788 => 'uni2254',\n    8789 => 'uni2255',\n    8790 => 'uni2256',\n    8791 => 'uni2257',\n    8792 => 'uni2258',\n    8793 => 'uni2259',\n    8794 => 'uni225A',\n    8795 => 'uni225B',\n    8796 => 'uni225C',\n    8797 => 'uni225D',\n    8798 => 'uni225E',\n    8799 => 'uni225F',\n    8800 => 'notequal',\n    8801 => 'equivalence',\n    8802 => 'uni2262',\n    8803 => 'uni2263',\n    8804 => 'lessequal',\n    8805 => 'greaterequal',\n    8806 => 'uni2266',\n    8807 => 'uni2267',\n    8808 => 'uni2268',\n    8809 => 'uni2269',\n    8810 => 'uni226A',\n    8811 => 'uni226B',\n    8812 => 'uni226C',\n    8813 => 'uni226D',\n    8814 => 'uni226E',\n    8815 => 'uni226F',\n    8816 => 'uni2270',\n    8817 => 'uni2271',\n    8818 => 'uni2272',\n    8819 => 'uni2273',\n    8820 => 'uni2274',\n    8821 => 'uni2275',\n    8822 => 'uni2276',\n    8823 => 'uni2277',\n    8824 => 'uni2278',\n    8825 => 'uni2279',\n    8826 => 'uni227A',\n    8827 => 'uni227B',\n    8828 => 'uni227C',\n    8829 => 'uni227D',\n    8830 => 'uni227E',\n    8831 => 'uni227F',\n    8832 => 'uni2280',\n    8833 => 'uni2281',\n    8834 => 'propersubset',\n    8835 => 'propersuperset',\n    8836 => 'notsubset',\n    8837 => 'uni2285',\n    8838 => 'reflexsubset',\n    8839 => 'reflexsuperset',\n    8840 => 'uni2288',\n    8841 => 'uni2289',\n    8842 => 'uni228A',\n    8843 => 'uni228B',\n    8844 => 'uni228C',\n    8845 => 'uni228D',\n    8846 => 'uni228E',\n    8847 => 'uni228F',\n    8848 => 'uni2290',\n    8849 => 'uni2291',\n    8850 => 'uni2292',\n    8851 => 'uni2293',\n    8852 => 'uni2294',\n    8853 => 'circleplus',\n    8854 => 'uni2296',\n    8855 => 'circlemultiply',\n    8856 => 'uni2298',\n    8857 => 'uni2299',\n    8858 => 'uni229A',\n    8859 => 'uni229B',\n    8860 => 'uni229C',\n    8861 => 'uni229D',\n    8862 => 'uni229E',\n    8863 => 'uni229F',\n    8864 => 'uni22A0',\n    8865 => 'uni22A1',\n    8866 => 'uni22A2',\n    8867 => 'uni22A3',\n    8868 => 'uni22A4',\n    8869 => 'perpendicular',\n    8870 => 'uni22A6',\n    8871 => 'uni22A7',\n    8872 => 'uni22A8',\n    8873 => 'uni22A9',\n    8874 => 'uni22AA',\n    8875 => 'uni22AB',\n    8876 => 'uni22AC',\n    8877 => 'uni22AD',\n    8878 => 'uni22AE',\n    8879 => 'uni22AF',\n    8880 => 'uni22B0',\n    8881 => 'uni22B1',\n    8882 => 'uni22B2',\n    8883 => 'uni22B3',\n    8884 => 'uni22B4',\n    8885 => 'uni22B5',\n    8886 => 'uni22B6',\n    8887 => 'uni22B7',\n    8888 => 'uni22B8',\n    8889 => 'uni22B9',\n    8890 => 'uni22BA',\n    8891 => 'uni22BB',\n    8892 => 'uni22BC',\n    8893 => 'uni22BD',\n    8894 => 'uni22BE',\n    8895 => 'uni22BF',\n    8896 => 'uni22C0',\n    8897 => 'uni22C1',\n    8898 => 'uni22C2',\n    8899 => 'uni22C3',\n    8900 => 'uni22C4',\n    8901 => 'dotmath',\n    8902 => 'uni22C6',\n    8903 => 'uni22C7',\n    8904 => 'uni22C8',\n    8905 => 'uni22C9',\n    8906 => 'uni22CA',\n    8907 => 'uni22CB',\n    8908 => 'uni22CC',\n    8909 => 'uni22CD',\n    8910 => 'uni22CE',\n    8911 => 'uni22CF',\n    8912 => 'uni22D0',\n    8913 => 'uni22D1',\n    8914 => 'uni22D2',\n    8915 => 'uni22D3',\n    8916 => 'uni22D4',\n    8917 => 'uni22D5',\n    8918 => 'uni22D6',\n    8919 => 'uni22D7',\n    8920 => 'uni22D8',\n    8921 => 'uni22D9',\n    8922 => 'uni22DA',\n    8923 => 'uni22DB',\n    8924 => 'uni22DC',\n    8925 => 'uni22DD',\n    8926 => 'uni22DE',\n    8927 => 'uni22DF',\n    8928 => 'uni22E0',\n    8929 => 'uni22E1',\n    8930 => 'uni22E2',\n    8931 => 'uni22E3',\n    8932 => 'uni22E4',\n    8933 => 'uni22E5',\n    8934 => 'uni22E6',\n    8935 => 'uni22E7',\n    8936 => 'uni22E8',\n    8937 => 'uni22E9',\n    8938 => 'uni22EA',\n    8939 => 'uni22EB',\n    8940 => 'uni22EC',\n    8941 => 'uni22ED',\n    8942 => 'uni22EE',\n    8943 => 'uni22EF',\n    8944 => 'uni22F0',\n    8945 => 'uni22F1',\n    8946 => 'uni22F2',\n    8947 => 'uni22F3',\n    8948 => 'uni22F4',\n    8949 => 'uni22F5',\n    8950 => 'uni22F6',\n    8951 => 'uni22F7',\n    8952 => 'uni22F8',\n    8953 => 'uni22F9',\n    8954 => 'uni22FA',\n    8955 => 'uni22FB',\n    8956 => 'uni22FC',\n    8957 => 'uni22FD',\n    8958 => 'uni22FE',\n    8959 => 'uni22FF',\n    8960 => 'uni2300',\n    8961 => 'uni2301',\n    8962 => 'house',\n    8963 => 'uni2303',\n    8964 => 'uni2304',\n    8965 => 'uni2305',\n    8966 => 'uni2306',\n    8967 => 'uni2307',\n    8968 => 'uni2308',\n    8969 => 'uni2309',\n    8970 => 'uni230A',\n    8971 => 'uni230B',\n    8972 => 'uni230C',\n    8973 => 'uni230D',\n    8974 => 'uni230E',\n    8975 => 'uni230F',\n    8976 => 'revlogicalnot',\n    8977 => 'uni2311',\n    8984 => 'uni2318',\n    8985 => 'uni2319',\n    8988 => 'uni231C',\n    8989 => 'uni231D',\n    8990 => 'uni231E',\n    8991 => 'uni231F',\n    8992 => 'integraltp',\n    8993 => 'integralbt',\n    8996 => 'uni2324',\n    8997 => 'uni2325',\n    8998 => 'uni2326',\n    8999 => 'uni2327',\n    9000 => 'uni2328',\n    9003 => 'uni232B',\n    9004 => 'uni232C',\n    9075 => 'uni2373',\n    9076 => 'uni2374',\n    9077 => 'uni2375',\n    9082 => 'uni237A',\n    9085 => 'uni237D',\n    9095 => 'uni2387',\n    9108 => 'uni2394',\n    9115 => 'uni239B',\n    9116 => 'uni239C',\n    9117 => 'uni239D',\n    9118 => 'uni239E',\n    9119 => 'uni239F',\n    9120 => 'uni23A0',\n    9121 => 'uni23A1',\n    9122 => 'uni23A2',\n    9123 => 'uni23A3',\n    9124 => 'uni23A4',\n    9125 => 'uni23A5',\n    9126 => 'uni23A6',\n    9127 => 'uni23A7',\n    9128 => 'uni23A8',\n    9129 => 'uni23A9',\n    9130 => 'uni23AA',\n    9131 => 'uni23AB',\n    9132 => 'uni23AC',\n    9133 => 'uni23AD',\n    9134 => 'uni23AE',\n    9166 => 'uni23CE',\n    9167 => 'uni23CF',\n    9187 => 'uni23E3',\n    9189 => 'uni23E5',\n    9192 => 'uni23E8',\n    9250 => 'uni2422',\n    9251 => 'uni2423',\n    9312 => 'uni2460',\n    9313 => 'uni2461',\n    9314 => 'uni2462',\n    9315 => 'uni2463',\n    9316 => 'uni2464',\n    9317 => 'uni2465',\n    9318 => 'uni2466',\n    9319 => 'uni2467',\n    9320 => 'uni2468',\n    9321 => 'uni2469',\n    9472 => 'SF100000',\n    9473 => 'uni2501',\n    9474 => 'SF110000',\n    9475 => 'uni2503',\n    9476 => 'uni2504',\n    9477 => 'uni2505',\n    9478 => 'uni2506',\n    9479 => 'uni2507',\n    9480 => 'uni2508',\n    9481 => 'uni2509',\n    9482 => 'uni250A',\n    9483 => 'uni250B',\n    9484 => 'SF010000',\n    9485 => 'uni250D',\n    9486 => 'uni250E',\n    9487 => 'uni250F',\n    9488 => 'SF030000',\n    9489 => 'uni2511',\n    9490 => 'uni2512',\n    9491 => 'uni2513',\n    9492 => 'SF020000',\n    9493 => 'uni2515',\n    9494 => 'uni2516',\n    9495 => 'uni2517',\n    9496 => 'SF040000',\n    9497 => 'uni2519',\n    9498 => 'uni251A',\n    9499 => 'uni251B',\n    9500 => 'SF080000',\n    9501 => 'uni251D',\n    9502 => 'uni251E',\n    9503 => 'uni251F',\n    9504 => 'uni2520',\n    9505 => 'uni2521',\n    9506 => 'uni2522',\n    9507 => 'uni2523',\n    9508 => 'SF090000',\n    9509 => 'uni2525',\n    9510 => 'uni2526',\n    9511 => 'uni2527',\n    9512 => 'uni2528',\n    9513 => 'uni2529',\n    9514 => 'uni252A',\n    9515 => 'uni252B',\n    9516 => 'SF060000',\n    9517 => 'uni252D',\n    9518 => 'uni252E',\n    9519 => 'uni252F',\n    9520 => 'uni2530',\n    9521 => 'uni2531',\n    9522 => 'uni2532',\n    9523 => 'uni2533',\n    9524 => 'SF070000',\n    9525 => 'uni2535',\n    9526 => 'uni2536',\n    9527 => 'uni2537',\n    9528 => 'uni2538',\n    9529 => 'uni2539',\n    9530 => 'uni253A',\n    9531 => 'uni253B',\n    9532 => 'SF050000',\n    9533 => 'uni253D',\n    9534 => 'uni253E',\n    9535 => 'uni253F',\n    9536 => 'uni2540',\n    9537 => 'uni2541',\n    9538 => 'uni2542',\n    9539 => 'uni2543',\n    9540 => 'uni2544',\n    9541 => 'uni2545',\n    9542 => 'uni2546',\n    9543 => 'uni2547',\n    9544 => 'uni2548',\n    9545 => 'uni2549',\n    9546 => 'uni254A',\n    9547 => 'uni254B',\n    9548 => 'uni254C',\n    9549 => 'uni254D',\n    9550 => 'uni254E',\n    9551 => 'uni254F',\n    9552 => 'SF430000',\n    9553 => 'SF240000',\n    9554 => 'SF510000',\n    9555 => 'SF520000',\n    9556 => 'SF390000',\n    9557 => 'SF220000',\n    9558 => 'SF210000',\n    9559 => 'SF250000',\n    9560 => 'SF500000',\n    9561 => 'SF490000',\n    9562 => 'SF380000',\n    9563 => 'SF280000',\n    9564 => 'SF270000',\n    9565 => 'SF260000',\n    9566 => 'SF360000',\n    9567 => 'SF370000',\n    9568 => 'SF420000',\n    9569 => 'SF190000',\n    9570 => 'SF200000',\n    9571 => 'SF230000',\n    9572 => 'SF470000',\n    9573 => 'SF480000',\n    9574 => 'SF410000',\n    9575 => 'SF450000',\n    9576 => 'SF460000',\n    9577 => 'SF400000',\n    9578 => 'SF540000',\n    9579 => 'SF530000',\n    9580 => 'SF440000',\n    9581 => 'uni256D',\n    9582 => 'uni256E',\n    9583 => 'uni256F',\n    9584 => 'uni2570',\n    9585 => 'uni2571',\n    9586 => 'uni2572',\n    9587 => 'uni2573',\n    9588 => 'uni2574',\n    9589 => 'uni2575',\n    9590 => 'uni2576',\n    9591 => 'uni2577',\n    9592 => 'uni2578',\n    9593 => 'uni2579',\n    9594 => 'uni257A',\n    9595 => 'uni257B',\n    9596 => 'uni257C',\n    9597 => 'uni257D',\n    9598 => 'uni257E',\n    9599 => 'uni257F',\n    9600 => 'upblock',\n    9601 => 'uni2581',\n    9602 => 'uni2582',\n    9603 => 'uni2583',\n    9604 => 'dnblock',\n    9605 => 'uni2585',\n    9606 => 'uni2586',\n    9607 => 'uni2587',\n    9608 => 'block',\n    9609 => 'uni2589',\n    9610 => 'uni258A',\n    9611 => 'uni258B',\n    9612 => 'lfblock',\n    9613 => 'uni258D',\n    9614 => 'uni258E',\n    9615 => 'uni258F',\n    9616 => 'rtblock',\n    9617 => 'ltshade',\n    9618 => 'shade',\n    9619 => 'dkshade',\n    9620 => 'uni2594',\n    9621 => 'uni2595',\n    9622 => 'uni2596',\n    9623 => 'uni2597',\n    9624 => 'uni2598',\n    9625 => 'uni2599',\n    9626 => 'uni259A',\n    9627 => 'uni259B',\n    9628 => 'uni259C',\n    9629 => 'uni259D',\n    9630 => 'uni259E',\n    9631 => 'uni259F',\n    9632 => 'filledbox',\n    9633 => 'H22073',\n    9634 => 'uni25A2',\n    9635 => 'uni25A3',\n    9636 => 'uni25A4',\n    9637 => 'uni25A5',\n    9638 => 'uni25A6',\n    9639 => 'uni25A7',\n    9640 => 'uni25A8',\n    9641 => 'uni25A9',\n    9642 => 'H18543',\n    9643 => 'H18551',\n    9644 => 'filledrect',\n    9645 => 'uni25AD',\n    9646 => 'uni25AE',\n    9647 => 'uni25AF',\n    9648 => 'uni25B0',\n    9649 => 'uni25B1',\n    9650 => 'triagup',\n    9651 => 'uni25B3',\n    9652 => 'uni25B4',\n    9653 => 'uni25B5',\n    9654 => 'uni25B6',\n    9655 => 'uni25B7',\n    9656 => 'uni25B8',\n    9657 => 'uni25B9',\n    9658 => 'triagrt',\n    9659 => 'uni25BB',\n    9660 => 'triagdn',\n    9661 => 'uni25BD',\n    9662 => 'uni25BE',\n    9663 => 'uni25BF',\n    9664 => 'uni25C0',\n    9665 => 'uni25C1',\n    9666 => 'uni25C2',\n    9667 => 'uni25C3',\n    9668 => 'triaglf',\n    9669 => 'uni25C5',\n    9670 => 'uni25C6',\n    9671 => 'uni25C7',\n    9672 => 'uni25C8',\n    9673 => 'uni25C9',\n    9674 => 'lozenge',\n    9675 => 'circle',\n    9676 => 'uni25CC',\n    9677 => 'uni25CD',\n    9678 => 'uni25CE',\n    9679 => 'H18533',\n    9680 => 'uni25D0',\n    9681 => 'uni25D1',\n    9682 => 'uni25D2',\n    9683 => 'uni25D3',\n    9684 => 'uni25D4',\n    9685 => 'uni25D5',\n    9686 => 'uni25D6',\n    9687 => 'uni25D7',\n    9688 => 'invbullet',\n    9689 => 'invcircle',\n    9690 => 'uni25DA',\n    9691 => 'uni25DB',\n    9692 => 'uni25DC',\n    9693 => 'uni25DD',\n    9694 => 'uni25DE',\n    9695 => 'uni25DF',\n    9696 => 'uni25E0',\n    9697 => 'uni25E1',\n    9698 => 'uni25E2',\n    9699 => 'uni25E3',\n    9700 => 'uni25E4',\n    9701 => 'uni25E5',\n    9702 => 'openbullet',\n    9703 => 'uni25E7',\n    9704 => 'uni25E8',\n    9705 => 'uni25E9',\n    9706 => 'uni25EA',\n    9707 => 'uni25EB',\n    9708 => 'uni25EC',\n    9709 => 'uni25ED',\n    9710 => 'uni25EE',\n    9711 => 'uni25EF',\n    9712 => 'uni25F0',\n    9713 => 'uni25F1',\n    9714 => 'uni25F2',\n    9715 => 'uni25F3',\n    9716 => 'uni25F4',\n    9717 => 'uni25F5',\n    9718 => 'uni25F6',\n    9719 => 'uni25F7',\n    9720 => 'uni25F8',\n    9721 => 'uni25F9',\n    9722 => 'uni25FA',\n    9723 => 'uni25FB',\n    9724 => 'uni25FC',\n    9725 => 'uni25FD',\n    9726 => 'uni25FE',\n    9727 => 'uni25FF',\n    9728 => 'uni2600',\n    9729 => 'uni2601',\n    9730 => 'uni2602',\n    9731 => 'uni2603',\n    9732 => 'uni2604',\n    9733 => 'uni2605',\n    9734 => 'uni2606',\n    9735 => 'uni2607',\n    9736 => 'uni2608',\n    9737 => 'uni2609',\n    9738 => 'uni260A',\n    9739 => 'uni260B',\n    9740 => 'uni260C',\n    9741 => 'uni260D',\n    9742 => 'uni260E',\n    9743 => 'uni260F',\n    9744 => 'uni2610',\n    9745 => 'uni2611',\n    9746 => 'uni2612',\n    9747 => 'uni2613',\n    9748 => 'uni2614',\n    9749 => 'uni2615',\n    9750 => 'uni2616',\n    9751 => 'uni2617',\n    9752 => 'uni2618',\n    9753 => 'uni2619',\n    9754 => 'uni261A',\n    9755 => 'uni261B',\n    9756 => 'uni261C',\n    9757 => 'uni261D',\n    9758 => 'uni261E',\n    9759 => 'uni261F',\n    9760 => 'uni2620',\n    9761 => 'uni2621',\n    9762 => 'uni2622',\n    9763 => 'uni2623',\n    9764 => 'uni2624',\n    9765 => 'uni2625',\n    9766 => 'uni2626',\n    9767 => 'uni2627',\n    9768 => 'uni2628',\n    9769 => 'uni2629',\n    9770 => 'uni262A',\n    9771 => 'uni262B',\n    9772 => 'uni262C',\n    9773 => 'uni262D',\n    9774 => 'uni262E',\n    9775 => 'uni262F',\n    9776 => 'uni2630',\n    9777 => 'uni2631',\n    9778 => 'uni2632',\n    9779 => 'uni2633',\n    9780 => 'uni2634',\n    9781 => 'uni2635',\n    9782 => 'uni2636',\n    9783 => 'uni2637',\n    9784 => 'uni2638',\n    9785 => 'uni2639',\n    9786 => 'smileface',\n    9787 => 'invsmileface',\n    9788 => 'sun',\n    9789 => 'uni263D',\n    9790 => 'uni263E',\n    9791 => 'uni263F',\n    9792 => 'female',\n    9793 => 'uni2641',\n    9794 => 'male',\n    9795 => 'uni2643',\n    9796 => 'uni2644',\n    9797 => 'uni2645',\n    9798 => 'uni2646',\n    9799 => 'uni2647',\n    9800 => 'uni2648',\n    9801 => 'uni2649',\n    9802 => 'uni264A',\n    9803 => 'uni264B',\n    9804 => 'uni264C',\n    9805 => 'uni264D',\n    9806 => 'uni264E',\n    9807 => 'uni264F',\n    9808 => 'uni2650',\n    9809 => 'uni2651',\n    9810 => 'uni2652',\n    9811 => 'uni2653',\n    9812 => 'uni2654',\n    9813 => 'uni2655',\n    9814 => 'uni2656',\n    9815 => 'uni2657',\n    9816 => 'uni2658',\n    9817 => 'uni2659',\n    9818 => 'uni265A',\n    9819 => 'uni265B',\n    9820 => 'uni265C',\n    9821 => 'uni265D',\n    9822 => 'uni265E',\n    9823 => 'uni265F',\n    9824 => 'spade',\n    9825 => 'uni2661',\n    9826 => 'uni2662',\n    9827 => 'club',\n    9828 => 'uni2664',\n    9829 => 'heart',\n    9830 => 'diamond',\n    9831 => 'uni2667',\n    9832 => 'uni2668',\n    9833 => 'uni2669',\n    9834 => 'musicalnote',\n    9835 => 'musicalnotedbl',\n    9836 => 'uni266C',\n    9837 => 'uni266D',\n    9838 => 'uni266E',\n    9839 => 'uni266F',\n    9840 => 'uni2670',\n    9841 => 'uni2671',\n    9842 => 'uni2672',\n    9843 => 'uni2673',\n    9844 => 'uni2674',\n    9845 => 'uni2675',\n    9846 => 'uni2676',\n    9847 => 'uni2677',\n    9848 => 'uni2678',\n    9849 => 'uni2679',\n    9850 => 'uni267A',\n    9851 => 'uni267B',\n    9852 => 'uni267C',\n    9853 => 'uni267D',\n    9854 => 'uni267E',\n    9855 => 'uni267F',\n    9856 => 'uni2680',\n    9857 => 'uni2681',\n    9858 => 'uni2682',\n    9859 => 'uni2683',\n    9860 => 'uni2684',\n    9861 => 'uni2685',\n    9862 => 'uni2686',\n    9863 => 'uni2687',\n    9864 => 'uni2688',\n    9865 => 'uni2689',\n    9866 => 'uni268A',\n    9867 => 'uni268B',\n    9868 => 'uni268C',\n    9869 => 'uni268D',\n    9870 => 'uni268E',\n    9871 => 'uni268F',\n    9872 => 'uni2690',\n    9873 => 'uni2691',\n    9874 => 'uni2692',\n    9875 => 'uni2693',\n    9876 => 'uni2694',\n    9877 => 'uni2695',\n    9878 => 'uni2696',\n    9879 => 'uni2697',\n    9880 => 'uni2698',\n    9881 => 'uni2699',\n    9882 => 'uni269A',\n    9883 => 'uni269B',\n    9884 => 'uni269C',\n    9886 => 'uni269E',\n    9887 => 'uni269F',\n    9888 => 'uni26A0',\n    9889 => 'uni26A1',\n    9890 => 'uni26A2',\n    9891 => 'uni26A3',\n    9892 => 'uni26A4',\n    9893 => 'uni26A5',\n    9894 => 'uni26A6',\n    9895 => 'uni26A7',\n    9896 => 'uni26A8',\n    9897 => 'uni26A9',\n    9898 => 'uni26AA',\n    9899 => 'uni26AB',\n    9900 => 'uni26AC',\n    9901 => 'uni26AD',\n    9902 => 'uni26AE',\n    9903 => 'uni26AF',\n    9904 => 'uni26B0',\n    9905 => 'uni26B1',\n    9906 => 'uni26B2',\n    9907 => 'uni26B3',\n    9908 => 'uni26B4',\n    9909 => 'uni26B5',\n    9910 => 'uni26B6',\n    9911 => 'uni26B7',\n    9912 => 'uni26B8',\n    9920 => 'uni26C0',\n    9921 => 'uni26C1',\n    9922 => 'uni26C2',\n    9923 => 'uni26C3',\n    9954 => 'uni26E2',\n    9985 => 'uni2701',\n    9986 => 'uni2702',\n    9987 => 'uni2703',\n    9988 => 'uni2704',\n    9990 => 'uni2706',\n    9991 => 'uni2707',\n    9992 => 'uni2708',\n    9993 => 'uni2709',\n    9996 => 'uni270C',\n    9997 => 'uni270D',\n    9998 => 'uni270E',\n    9999 => 'uni270F',\n    10000 => 'uni2710',\n    10001 => 'uni2711',\n    10002 => 'uni2712',\n    10003 => 'uni2713',\n    10004 => 'uni2714',\n    10005 => 'uni2715',\n    10006 => 'uni2716',\n    10007 => 'uni2717',\n    10008 => 'uni2718',\n    10009 => 'uni2719',\n    10010 => 'uni271A',\n    10011 => 'uni271B',\n    10012 => 'uni271C',\n    10013 => 'uni271D',\n    10014 => 'uni271E',\n    10015 => 'uni271F',\n    10016 => 'uni2720',\n    10017 => 'uni2721',\n    10018 => 'uni2722',\n    10019 => 'uni2723',\n    10020 => 'uni2724',\n    10021 => 'uni2725',\n    10022 => 'uni2726',\n    10023 => 'uni2727',\n    10025 => 'uni2729',\n    10026 => 'uni272A',\n    10027 => 'uni272B',\n    10028 => 'uni272C',\n    10029 => 'uni272D',\n    10030 => 'uni272E',\n    10031 => 'uni272F',\n    10032 => 'uni2730',\n    10033 => 'uni2731',\n    10034 => 'uni2732',\n    10035 => 'uni2733',\n    10036 => 'uni2734',\n    10037 => 'uni2735',\n    10038 => 'uni2736',\n    10039 => 'uni2737',\n    10040 => 'uni2738',\n    10041 => 'uni2739',\n    10042 => 'uni273A',\n    10043 => 'uni273B',\n    10044 => 'uni273C',\n    10045 => 'uni273D',\n    10046 => 'uni273E',\n    10047 => 'uni273F',\n    10048 => 'uni2740',\n    10049 => 'uni2741',\n    10050 => 'uni2742',\n    10051 => 'uni2743',\n    10052 => 'uni2744',\n    10053 => 'uni2745',\n    10054 => 'uni2746',\n    10055 => 'uni2747',\n    10056 => 'uni2748',\n    10057 => 'uni2749',\n    10058 => 'uni274A',\n    10059 => 'uni274B',\n    10061 => 'uni274D',\n    10063 => 'uni274F',\n    10064 => 'uni2750',\n    10065 => 'uni2751',\n    10066 => 'uni2752',\n    10070 => 'uni2756',\n    10072 => 'uni2758',\n    10073 => 'uni2759',\n    10074 => 'uni275A',\n    10075 => 'uni275B',\n    10076 => 'uni275C',\n    10077 => 'uni275D',\n    10078 => 'uni275E',\n    10081 => 'uni2761',\n    10082 => 'uni2762',\n    10083 => 'uni2763',\n    10084 => 'uni2764',\n    10085 => 'uni2765',\n    10086 => 'uni2766',\n    10087 => 'uni2767',\n    10088 => 'uni2768',\n    10089 => 'uni2769',\n    10090 => 'uni276A',\n    10091 => 'uni276B',\n    10092 => 'uni276C',\n    10093 => 'uni276D',\n    10094 => 'uni276E',\n    10095 => 'uni276F',\n    10096 => 'uni2770',\n    10097 => 'uni2771',\n    10098 => 'uni2772',\n    10099 => 'uni2773',\n    10100 => 'uni2774',\n    10101 => 'uni2775',\n    10102 => 'uni2776',\n    10103 => 'uni2777',\n    10104 => 'uni2778',\n    10105 => 'uni2779',\n    10106 => 'uni277A',\n    10107 => 'uni277B',\n    10108 => 'uni277C',\n    10109 => 'uni277D',\n    10110 => 'uni277E',\n    10111 => 'uni277F',\n    10112 => 'uni2780',\n    10113 => 'uni2781',\n    10114 => 'uni2782',\n    10115 => 'uni2783',\n    10116 => 'uni2784',\n    10117 => 'uni2785',\n    10118 => 'uni2786',\n    10119 => 'uni2787',\n    10120 => 'uni2788',\n    10121 => 'uni2789',\n    10122 => 'uni278A',\n    10123 => 'uni278B',\n    10124 => 'uni278C',\n    10125 => 'uni278D',\n    10126 => 'uni278E',\n    10127 => 'uni278F',\n    10128 => 'uni2790',\n    10129 => 'uni2791',\n    10130 => 'uni2792',\n    10131 => 'uni2793',\n    10132 => 'uni2794',\n    10136 => 'uni2798',\n    10137 => 'uni2799',\n    10138 => 'uni279A',\n    10139 => 'uni279B',\n    10140 => 'uni279C',\n    10141 => 'uni279D',\n    10142 => 'uni279E',\n    10143 => 'uni279F',\n    10144 => 'uni27A0',\n    10145 => 'uni27A1',\n    10146 => 'uni27A2',\n    10147 => 'uni27A3',\n    10148 => 'uni27A4',\n    10149 => 'uni27A5',\n    10150 => 'uni27A6',\n    10151 => 'uni27A7',\n    10152 => 'uni27A8',\n    10153 => 'uni27A9',\n    10154 => 'uni27AA',\n    10155 => 'uni27AB',\n    10156 => 'uni27AC',\n    10157 => 'uni27AD',\n    10158 => 'uni27AE',\n    10159 => 'uni27AF',\n    10161 => 'uni27B1',\n    10162 => 'uni27B2',\n    10163 => 'uni27B3',\n    10164 => 'uni27B4',\n    10165 => 'uni27B5',\n    10166 => 'uni27B6',\n    10167 => 'uni27B7',\n    10168 => 'uni27B8',\n    10169 => 'uni27B9',\n    10170 => 'uni27BA',\n    10171 => 'uni27BB',\n    10172 => 'uni27BC',\n    10173 => 'uni27BD',\n    10174 => 'uni27BE',\n    10181 => 'uni27C5',\n    10182 => 'uni27C6',\n    10208 => 'uni27E0',\n    10214 => 'uni27E6',\n    10215 => 'uni27E7',\n    10216 => 'uni27E8',\n    10217 => 'uni27E9',\n    10218 => 'uni27EA',\n    10219 => 'uni27EB',\n    10224 => 'uni27F0',\n    10225 => 'uni27F1',\n    10226 => 'uni27F2',\n    10227 => 'uni27F3',\n    10228 => 'uni27F4',\n    10229 => 'uni27F5',\n    10230 => 'uni27F6',\n    10231 => 'uni27F7',\n    10232 => 'uni27F8',\n    10233 => 'uni27F9',\n    10234 => 'uni27FA',\n    10235 => 'uni27FB',\n    10236 => 'uni27FC',\n    10237 => 'uni27FD',\n    10238 => 'uni27FE',\n    10239 => 'uni27FF',\n    10240 => 'uni2800',\n    10241 => 'uni2801',\n    10242 => 'uni2802',\n    10243 => 'uni2803',\n    10244 => 'uni2804',\n    10245 => 'uni2805',\n    10246 => 'uni2806',\n    10247 => 'uni2807',\n    10248 => 'uni2808',\n    10249 => 'uni2809',\n    10250 => 'uni280A',\n    10251 => 'uni280B',\n    10252 => 'uni280C',\n    10253 => 'uni280D',\n    10254 => 'uni280E',\n    10255 => 'uni280F',\n    10256 => 'uni2810',\n    10257 => 'uni2811',\n    10258 => 'uni2812',\n    10259 => 'uni2813',\n    10260 => 'uni2814',\n    10261 => 'uni2815',\n    10262 => 'uni2816',\n    10263 => 'uni2817',\n    10264 => 'uni2818',\n    10265 => 'uni2819',\n    10266 => 'uni281A',\n    10267 => 'uni281B',\n    10268 => 'uni281C',\n    10269 => 'uni281D',\n    10270 => 'uni281E',\n    10271 => 'uni281F',\n    10272 => 'uni2820',\n    10273 => 'uni2821',\n    10274 => 'uni2822',\n    10275 => 'uni2823',\n    10276 => 'uni2824',\n    10277 => 'uni2825',\n    10278 => 'uni2826',\n    10279 => 'uni2827',\n    10280 => 'uni2828',\n    10281 => 'uni2829',\n    10282 => 'uni282A',\n    10283 => 'uni282B',\n    10284 => 'uni282C',\n    10285 => 'uni282D',\n    10286 => 'uni282E',\n    10287 => 'uni282F',\n    10288 => 'uni2830',\n    10289 => 'uni2831',\n    10290 => 'uni2832',\n    10291 => 'uni2833',\n    10292 => 'uni2834',\n    10293 => 'uni2835',\n    10294 => 'uni2836',\n    10295 => 'uni2837',\n    10296 => 'uni2838',\n    10297 => 'uni2839',\n    10298 => 'uni283A',\n    10299 => 'uni283B',\n    10300 => 'uni283C',\n    10301 => 'uni283D',\n    10302 => 'uni283E',\n    10303 => 'uni283F',\n    10304 => 'uni2840',\n    10305 => 'uni2841',\n    10306 => 'uni2842',\n    10307 => 'uni2843',\n    10308 => 'uni2844',\n    10309 => 'uni2845',\n    10310 => 'uni2846',\n    10311 => 'uni2847',\n    10312 => 'uni2848',\n    10313 => 'uni2849',\n    10314 => 'uni284A',\n    10315 => 'uni284B',\n    10316 => 'uni284C',\n    10317 => 'uni284D',\n    10318 => 'uni284E',\n    10319 => 'uni284F',\n    10320 => 'uni2850',\n    10321 => 'uni2851',\n    10322 => 'uni2852',\n    10323 => 'uni2853',\n    10324 => 'uni2854',\n    10325 => 'uni2855',\n    10326 => 'uni2856',\n    10327 => 'uni2857',\n    10328 => 'uni2858',\n    10329 => 'uni2859',\n    10330 => 'uni285A',\n    10331 => 'uni285B',\n    10332 => 'uni285C',\n    10333 => 'uni285D',\n    10334 => 'uni285E',\n    10335 => 'uni285F',\n    10336 => 'uni2860',\n    10337 => 'uni2861',\n    10338 => 'uni2862',\n    10339 => 'uni2863',\n    10340 => 'uni2864',\n    10341 => 'uni2865',\n    10342 => 'uni2866',\n    10343 => 'uni2867',\n    10344 => 'uni2868',\n    10345 => 'uni2869',\n    10346 => 'uni286A',\n    10347 => 'uni286B',\n    10348 => 'uni286C',\n    10349 => 'uni286D',\n    10350 => 'uni286E',\n    10351 => 'uni286F',\n    10352 => 'uni2870',\n    10353 => 'uni2871',\n    10354 => 'uni2872',\n    10355 => 'uni2873',\n    10356 => 'uni2874',\n    10357 => 'uni2875',\n    10358 => 'uni2876',\n    10359 => 'uni2877',\n    10360 => 'uni2878',\n    10361 => 'uni2879',\n    10362 => 'uni287A',\n    10363 => 'uni287B',\n    10364 => 'uni287C',\n    10365 => 'uni287D',\n    10366 => 'uni287E',\n    10367 => 'uni287F',\n    10368 => 'uni2880',\n    10369 => 'uni2881',\n    10370 => 'uni2882',\n    10371 => 'uni2883',\n    10372 => 'uni2884',\n    10373 => 'uni2885',\n    10374 => 'uni2886',\n    10375 => 'uni2887',\n    10376 => 'uni2888',\n    10377 => 'uni2889',\n    10378 => 'uni288A',\n    10379 => 'uni288B',\n    10380 => 'uni288C',\n    10381 => 'uni288D',\n    10382 => 'uni288E',\n    10383 => 'uni288F',\n    10384 => 'uni2890',\n    10385 => 'uni2891',\n    10386 => 'uni2892',\n    10387 => 'uni2893',\n    10388 => 'uni2894',\n    10389 => 'uni2895',\n    10390 => 'uni2896',\n    10391 => 'uni2897',\n    10392 => 'uni2898',\n    10393 => 'uni2899',\n    10394 => 'uni289A',\n    10395 => 'uni289B',\n    10396 => 'uni289C',\n    10397 => 'uni289D',\n    10398 => 'uni289E',\n    10399 => 'uni289F',\n    10400 => 'uni28A0',\n    10401 => 'uni28A1',\n    10402 => 'uni28A2',\n    10403 => 'uni28A3',\n    10404 => 'uni28A4',\n    10405 => 'uni28A5',\n    10406 => 'uni28A6',\n    10407 => 'uni28A7',\n    10408 => 'uni28A8',\n    10409 => 'uni28A9',\n    10410 => 'uni28AA',\n    10411 => 'uni28AB',\n    10412 => 'uni28AC',\n    10413 => 'uni28AD',\n    10414 => 'uni28AE',\n    10415 => 'uni28AF',\n    10416 => 'uni28B0',\n    10417 => 'uni28B1',\n    10418 => 'uni28B2',\n    10419 => 'uni28B3',\n    10420 => 'uni28B4',\n    10421 => 'uni28B5',\n    10422 => 'uni28B6',\n    10423 => 'uni28B7',\n    10424 => 'uni28B8',\n    10425 => 'uni28B9',\n    10426 => 'uni28BA',\n    10427 => 'uni28BB',\n    10428 => 'uni28BC',\n    10429 => 'uni28BD',\n    10430 => 'uni28BE',\n    10431 => 'uni28BF',\n    10432 => 'uni28C0',\n    10433 => 'uni28C1',\n    10434 => 'uni28C2',\n    10435 => 'uni28C3',\n    10436 => 'uni28C4',\n    10437 => 'uni28C5',\n    10438 => 'uni28C6',\n    10439 => 'uni28C7',\n    10440 => 'uni28C8',\n    10441 => 'uni28C9',\n    10442 => 'uni28CA',\n    10443 => 'uni28CB',\n    10444 => 'uni28CC',\n    10445 => 'uni28CD',\n    10446 => 'uni28CE',\n    10447 => 'uni28CF',\n    10448 => 'uni28D0',\n    10449 => 'uni28D1',\n    10450 => 'uni28D2',\n    10451 => 'uni28D3',\n    10452 => 'uni28D4',\n    10453 => 'uni28D5',\n    10454 => 'uni28D6',\n    10455 => 'uni28D7',\n    10456 => 'uni28D8',\n    10457 => 'uni28D9',\n    10458 => 'uni28DA',\n    10459 => 'uni28DB',\n    10460 => 'uni28DC',\n    10461 => 'uni28DD',\n    10462 => 'uni28DE',\n    10463 => 'uni28DF',\n    10464 => 'uni28E0',\n    10465 => 'uni28E1',\n    10466 => 'uni28E2',\n    10467 => 'uni28E3',\n    10468 => 'uni28E4',\n    10469 => 'uni28E5',\n    10470 => 'uni28E6',\n    10471 => 'uni28E7',\n    10472 => 'uni28E8',\n    10473 => 'uni28E9',\n    10474 => 'uni28EA',\n    10475 => 'uni28EB',\n    10476 => 'uni28EC',\n    10477 => 'uni28ED',\n    10478 => 'uni28EE',\n    10479 => 'uni28EF',\n    10480 => 'uni28F0',\n    10481 => 'uni28F1',\n    10482 => 'uni28F2',\n    10483 => 'uni28F3',\n    10484 => 'uni28F4',\n    10485 => 'uni28F5',\n    10486 => 'uni28F6',\n    10487 => 'uni28F7',\n    10488 => 'uni28F8',\n    10489 => 'uni28F9',\n    10490 => 'uni28FA',\n    10491 => 'uni28FB',\n    10492 => 'uni28FC',\n    10493 => 'uni28FD',\n    10494 => 'uni28FE',\n    10495 => 'uni28FF',\n    10502 => 'uni2906',\n    10503 => 'uni2907',\n    10506 => 'uni290A',\n    10507 => 'uni290B',\n    10560 => 'uni2940',\n    10561 => 'uni2941',\n    10627 => 'uni2983',\n    10628 => 'uni2984',\n    10702 => 'uni29CE',\n    10703 => 'uni29CF',\n    10704 => 'uni29D0',\n    10705 => 'uni29D1',\n    10706 => 'uni29D2',\n    10707 => 'uni29D3',\n    10708 => 'uni29D4',\n    10709 => 'uni29D5',\n    10731 => 'uni29EB',\n    10746 => 'uni29FA',\n    10747 => 'uni29FB',\n    10752 => 'uni2A00',\n    10753 => 'uni2A01',\n    10754 => 'uni2A02',\n    10764 => 'uni2A0C',\n    10765 => 'uni2A0D',\n    10766 => 'uni2A0E',\n    10767 => 'uni2A0F',\n    10768 => 'uni2A10',\n    10769 => 'uni2A11',\n    10770 => 'uni2A12',\n    10771 => 'uni2A13',\n    10772 => 'uni2A14',\n    10773 => 'uni2A15',\n    10774 => 'uni2A16',\n    10775 => 'uni2A17',\n    10776 => 'uni2A18',\n    10777 => 'uni2A19',\n    10778 => 'uni2A1A',\n    10779 => 'uni2A1B',\n    10780 => 'uni2A1C',\n    10799 => 'uni2A2F',\n    10858 => 'uni2A6A',\n    10859 => 'uni2A6B',\n    10877 => 'uni2A7D',\n    10878 => 'uni2A7E',\n    10879 => 'uni2A7F',\n    10880 => 'uni2A80',\n    10881 => 'uni2A81',\n    10882 => 'uni2A82',\n    10883 => 'uni2A83',\n    10884 => 'uni2A84',\n    10885 => 'uni2A85',\n    10886 => 'uni2A86',\n    10887 => 'uni2A87',\n    10888 => 'uni2A88',\n    10889 => 'uni2A89',\n    10890 => 'uni2A8A',\n    10891 => 'uni2A8B',\n    10892 => 'uni2A8C',\n    10893 => 'uni2A8D',\n    10894 => 'uni2A8E',\n    10895 => 'uni2A8F',\n    10896 => 'uni2A90',\n    10897 => 'uni2A91',\n    10898 => 'uni2A92',\n    10899 => 'uni2A93',\n    10900 => 'uni2A94',\n    10901 => 'uni2A95',\n    10902 => 'uni2A96',\n    10903 => 'uni2A97',\n    10904 => 'uni2A98',\n    10905 => 'uni2A99',\n    10906 => 'uni2A9A',\n    10907 => 'uni2A9B',\n    10908 => 'uni2A9C',\n    10909 => 'uni2A9D',\n    10910 => 'uni2A9E',\n    10911 => 'uni2A9F',\n    10912 => 'uni2AA0',\n    10926 => 'uni2AAE',\n    10927 => 'uni2AAF',\n    10928 => 'uni2AB0',\n    10929 => 'uni2AB1',\n    10930 => 'uni2AB2',\n    10931 => 'uni2AB3',\n    10932 => 'uni2AB4',\n    10933 => 'uni2AB5',\n    10934 => 'uni2AB6',\n    10935 => 'uni2AB7',\n    10936 => 'uni2AB8',\n    10937 => 'uni2AB9',\n    10938 => 'uni2ABA',\n    11001 => 'uni2AF9',\n    11002 => 'uni2AFA',\n    11008 => 'uni2B00',\n    11009 => 'uni2B01',\n    11010 => 'uni2B02',\n    11011 => 'uni2B03',\n    11012 => 'uni2B04',\n    11013 => 'uni2B05',\n    11014 => 'uni2B06',\n    11015 => 'uni2B07',\n    11016 => 'uni2B08',\n    11017 => 'uni2B09',\n    11018 => 'uni2B0A',\n    11019 => 'uni2B0B',\n    11020 => 'uni2B0C',\n    11021 => 'uni2B0D',\n    11022 => 'uni2B0E',\n    11023 => 'uni2B0F',\n    11024 => 'uni2B10',\n    11025 => 'uni2B11',\n    11026 => 'uni2B12',\n    11027 => 'uni2B13',\n    11028 => 'uni2B14',\n    11029 => 'uni2B15',\n    11030 => 'uni2B16',\n    11031 => 'uni2B17',\n    11032 => 'uni2B18',\n    11033 => 'uni2B19',\n    11034 => 'uni2B1A',\n    11039 => 'uni2B1F',\n    11040 => 'uni2B20',\n    11041 => 'uni2B21',\n    11042 => 'uni2B22',\n    11043 => 'uni2B23',\n    11044 => 'uni2B24',\n    11091 => 'uni2B53',\n    11092 => 'uni2B54',\n    11360 => 'uni2C60',\n    11361 => 'uni2C61',\n    11362 => 'uni2C62',\n    11363 => 'uni2C63',\n    11364 => 'uni2C64',\n    11365 => 'uni2C65',\n    11366 => 'uni2C66',\n    11367 => 'uni2C67',\n    11368 => 'uni2C68',\n    11369 => 'uni2C69',\n    11370 => 'uni2C6A',\n    11371 => 'uni2C6B',\n    11372 => 'uni2C6C',\n    11373 => 'uni2C6D',\n    11374 => 'uni2C6E',\n    11375 => 'uni2C6F',\n    11376 => 'uni2C70',\n    11377 => 'uni2C71',\n    11378 => 'uni2C72',\n    11379 => 'uni2C73',\n    11380 => 'uni2C74',\n    11381 => 'uni2C75',\n    11382 => 'uni2C76',\n    11383 => 'uni2C77',\n    11385 => 'uni2C79',\n    11386 => 'uni2C7A',\n    11387 => 'uni2C7B',\n    11388 => 'uni2C7C',\n    11389 => 'uni2C7D',\n    11390 => 'uni2C7E',\n    11391 => 'uni2C7F',\n    11520 => 'uni2D00',\n    11521 => 'uni2D01',\n    11522 => 'uni2D02',\n    11523 => 'uni2D03',\n    11524 => 'uni2D04',\n    11525 => 'uni2D05',\n    11526 => 'uni2D06',\n    11527 => 'uni2D07',\n    11528 => 'uni2D08',\n    11529 => 'uni2D09',\n    11530 => 'uni2D0A',\n    11531 => 'uni2D0B',\n    11532 => 'uni2D0C',\n    11533 => 'uni2D0D',\n    11534 => 'uni2D0E',\n    11535 => 'uni2D0F',\n    11536 => 'uni2D10',\n    11537 => 'uni2D11',\n    11538 => 'uni2D12',\n    11539 => 'uni2D13',\n    11540 => 'uni2D14',\n    11541 => 'uni2D15',\n    11542 => 'uni2D16',\n    11543 => 'uni2D17',\n    11544 => 'uni2D18',\n    11545 => 'uni2D19',\n    11546 => 'uni2D1A',\n    11547 => 'uni2D1B',\n    11548 => 'uni2D1C',\n    11549 => 'uni2D1D',\n    11550 => 'uni2D1E',\n    11551 => 'uni2D1F',\n    11552 => 'uni2D20',\n    11553 => 'uni2D21',\n    11554 => 'uni2D22',\n    11555 => 'uni2D23',\n    11556 => 'uni2D24',\n    11557 => 'uni2D25',\n    11568 => 'uni2D30',\n    11569 => 'uni2D31',\n    11570 => 'uni2D32',\n    11571 => 'uni2D33',\n    11572 => 'uni2D34',\n    11573 => 'uni2D35',\n    11574 => 'uni2D36',\n    11575 => 'uni2D37',\n    11576 => 'uni2D38',\n    11577 => 'uni2D39',\n    11578 => 'uni2D3A',\n    11579 => 'uni2D3B',\n    11580 => 'uni2D3C',\n    11581 => 'uni2D3D',\n    11582 => 'uni2D3E',\n    11583 => 'uni2D3F',\n    11584 => 'uni2D40',\n    11585 => 'uni2D41',\n    11586 => 'uni2D42',\n    11587 => 'uni2D43',\n    11588 => 'uni2D44',\n    11589 => 'uni2D45',\n    11590 => 'uni2D46',\n    11591 => 'uni2D47',\n    11592 => 'uni2D48',\n    11593 => 'uni2D49',\n    11594 => 'uni2D4A',\n    11595 => 'uni2D4B',\n    11596 => 'uni2D4C',\n    11597 => 'uni2D4D',\n    11598 => 'uni2D4E',\n    11599 => 'uni2D4F',\n    11600 => 'uni2D50',\n    11601 => 'uni2D51',\n    11602 => 'uni2D52',\n    11603 => 'uni2D53',\n    11604 => 'uni2D54',\n    11605 => 'uni2D55',\n    11606 => 'uni2D56',\n    11607 => 'uni2D57',\n    11608 => 'uni2D58',\n    11609 => 'uni2D59',\n    11610 => 'uni2D5A',\n    11611 => 'uni2D5B',\n    11612 => 'uni2D5C',\n    11613 => 'uni2D5D',\n    11614 => 'uni2D5E',\n    11615 => 'uni2D5F',\n    11616 => 'uni2D60',\n    11617 => 'uni2D61',\n    11618 => 'uni2D62',\n    11619 => 'uni2D63',\n    11620 => 'uni2D64',\n    11621 => 'uni2D65',\n    11631 => 'uni2D6F',\n    11800 => 'uni2E18',\n    11807 => 'uni2E1F',\n    11810 => 'uni2E22',\n    11811 => 'uni2E23',\n    11812 => 'uni2E24',\n    11813 => 'uni2E25',\n    11822 => 'uni2E2E',\n    19904 => 'uni4DC0',\n    19905 => 'uni4DC1',\n    19906 => 'uni4DC2',\n    19907 => 'uni4DC3',\n    19908 => 'uni4DC4',\n    19909 => 'uni4DC5',\n    19910 => 'uni4DC6',\n    19911 => 'uni4DC7',\n    19912 => 'uni4DC8',\n    19913 => 'uni4DC9',\n    19914 => 'uni4DCA',\n    19915 => 'uni4DCB',\n    19916 => 'uni4DCC',\n    19917 => 'uni4DCD',\n    19918 => 'uni4DCE',\n    19919 => 'uni4DCF',\n    19920 => 'uni4DD0',\n    19921 => 'uni4DD1',\n    19922 => 'uni4DD2',\n    19923 => 'uni4DD3',\n    19924 => 'uni4DD4',\n    19925 => 'uni4DD5',\n    19926 => 'uni4DD6',\n    19927 => 'uni4DD7',\n    19928 => 'uni4DD8',\n    19929 => 'uni4DD9',\n    19930 => 'uni4DDA',\n    19931 => 'uni4DDB',\n    19932 => 'uni4DDC',\n    19933 => 'uni4DDD',\n    19934 => 'uni4DDE',\n    19935 => 'uni4DDF',\n    19936 => 'uni4DE0',\n    19937 => 'uni4DE1',\n    19938 => 'uni4DE2',\n    19939 => 'uni4DE3',\n    19940 => 'uni4DE4',\n    19941 => 'uni4DE5',\n    19942 => 'uni4DE6',\n    19943 => 'uni4DE7',\n    19944 => 'uni4DE8',\n    19945 => 'uni4DE9',\n    19946 => 'uni4DEA',\n    19947 => 'uni4DEB',\n    19948 => 'uni4DEC',\n    19949 => 'uni4DED',\n    19950 => 'uni4DEE',\n    19951 => 'uni4DEF',\n    19952 => 'uni4DF0',\n    19953 => 'uni4DF1',\n    19954 => 'uni4DF2',\n    19955 => 'uni4DF3',\n    19956 => 'uni4DF4',\n    19957 => 'uni4DF5',\n    19958 => 'uni4DF6',\n    19959 => 'uni4DF7',\n    19960 => 'uni4DF8',\n    19961 => 'uni4DF9',\n    19962 => 'uni4DFA',\n    19963 => 'uni4DFB',\n    19964 => 'uni4DFC',\n    19965 => 'uni4DFD',\n    19966 => 'uni4DFE',\n    19967 => 'uni4DFF',\n    42192 => 'uniA4D0',\n    42193 => 'uniA4D1',\n    42194 => 'uniA4D2',\n    42195 => 'uniA4D3',\n    42196 => 'uniA4D4',\n    42197 => 'uniA4D5',\n    42198 => 'uniA4D6',\n    42199 => 'uniA4D7',\n    42200 => 'uniA4D8',\n    42201 => 'uniA4D9',\n    42202 => 'uniA4DA',\n    42203 => 'uniA4DB',\n    42204 => 'uniA4DC',\n    42205 => 'uniA4DD',\n    42206 => 'uniA4DE',\n    42207 => 'uniA4DF',\n    42208 => 'uniA4E0',\n    42209 => 'uniA4E1',\n    42210 => 'uniA4E2',\n    42211 => 'uniA4E3',\n    42212 => 'uniA4E4',\n    42213 => 'uniA4E5',\n    42214 => 'uniA4E6',\n    42215 => 'uniA4E7',\n    42216 => 'uniA4E8',\n    42217 => 'uniA4E9',\n    42218 => 'uniA4EA',\n    42219 => 'uniA4EB',\n    42220 => 'uniA4EC',\n    42221 => 'uniA4ED',\n    42222 => 'uniA4EE',\n    42223 => 'uniA4EF',\n    42224 => 'uniA4F0',\n    42225 => 'uniA4F1',\n    42226 => 'uniA4F2',\n    42227 => 'uniA4F3',\n    42228 => 'uniA4F4',\n    42229 => 'uniA4F5',\n    42230 => 'uniA4F6',\n    42231 => 'uniA4F7',\n    42232 => 'uniA4F8',\n    42233 => 'uniA4F9',\n    42234 => 'uniA4FA',\n    42235 => 'uniA4FB',\n    42236 => 'uniA4FC',\n    42237 => 'uniA4FD',\n    42238 => 'uniA4FE',\n    42239 => 'uniA4FF',\n    42564 => 'uniA644',\n    42565 => 'uniA645',\n    42566 => 'uniA646',\n    42567 => 'uniA647',\n    42572 => 'uniA64C',\n    42573 => 'uniA64D',\n    42576 => 'uniA650',\n    42577 => 'uniA651',\n    42580 => 'uniA654',\n    42581 => 'uniA655',\n    42582 => 'uniA656',\n    42583 => 'uniA657',\n    42594 => 'uniA662',\n    42595 => 'uniA663',\n    42596 => 'uniA664',\n    42597 => 'uniA665',\n    42598 => 'uniA666',\n    42599 => 'uniA667',\n    42600 => 'uniA668',\n    42601 => 'uniA669',\n    42602 => 'uniA66A',\n    42603 => 'uniA66B',\n    42604 => 'uniA66C',\n    42605 => 'uniA66D',\n    42606 => 'uniA66E',\n    42634 => 'uniA68A',\n    42635 => 'uniA68B',\n    42636 => 'uniA68C',\n    42637 => 'uniA68D',\n    42644 => 'uniA694',\n    42645 => 'uniA695',\n    42648 => 'uniA698',\n    42649 => 'uniA699',\n    42760 => 'uniA708',\n    42761 => 'uniA709',\n    42762 => 'uniA70A',\n    42763 => 'uniA70B',\n    42764 => 'uniA70C',\n    42765 => 'uniA70D',\n    42766 => 'uniA70E',\n    42767 => 'uniA70F',\n    42768 => 'uniA710',\n    42769 => 'uniA711',\n    42770 => 'uniA712',\n    42771 => 'uniA713',\n    42772 => 'uniA714',\n    42773 => 'uniA715',\n    42774 => 'uniA716',\n    42779 => 'uniA71B',\n    42780 => 'uniA71C',\n    42781 => 'uniA71D',\n    42782 => 'uniA71E',\n    42783 => 'uniA71F',\n    42786 => 'uniA722',\n    42787 => 'uniA723',\n    42788 => 'uniA724',\n    42789 => 'uniA725',\n    42790 => 'uniA726',\n    42791 => 'uniA727',\n    42792 => 'uniA728',\n    42793 => 'uniA729',\n    42794 => 'uniA72A',\n    42795 => 'uniA72B',\n    42800 => 'uniA730',\n    42801 => 'uniA731',\n    42802 => 'uniA732',\n    42803 => 'uniA733',\n    42804 => 'uniA734',\n    42805 => 'uniA735',\n    42806 => 'uniA736',\n    42807 => 'uniA737',\n    42808 => 'uniA738',\n    42809 => 'uniA739',\n    42810 => 'uniA73A',\n    42811 => 'uniA73B',\n    42812 => 'uniA73C',\n    42813 => 'uniA73D',\n    42814 => 'uniA73E',\n    42815 => 'uniA73F',\n    42816 => 'uniA740',\n    42817 => 'uniA741',\n    42822 => 'uniA746',\n    42823 => 'uniA747',\n    42824 => 'uniA748',\n    42825 => 'uniA749',\n    42826 => 'uniA74A',\n    42827 => 'uniA74B',\n    42830 => 'uniA74E',\n    42831 => 'uniA74F',\n    42832 => 'uniA750',\n    42833 => 'uniA751',\n    42834 => 'uniA752',\n    42835 => 'uniA753',\n    42838 => 'uniA756',\n    42839 => 'uniA757',\n    42852 => 'uniA764',\n    42853 => 'uniA765',\n    42854 => 'uniA766',\n    42855 => 'uniA767',\n    42880 => 'uniA780',\n    42881 => 'uniA781',\n    42882 => 'uniA782',\n    42883 => 'uniA783',\n    42889 => 'uniA789',\n    42890 => 'uniA78A',\n    42891 => 'uniA78B',\n    42892 => 'uniA78C',\n    42893 => 'uniA78D',\n    42894 => 'uniA78E',\n    42896 => 'uniA790',\n    42897 => 'uniA791',\n    42912 => 'uniA7A0',\n    42913 => 'uniA7A1',\n    42914 => 'uniA7A2',\n    42915 => 'uniA7A3',\n    42916 => 'uniA7A4',\n    42917 => 'uniA7A5',\n    42918 => 'uniA7A6',\n    42919 => 'uniA7A7',\n    42920 => 'uniA7A8',\n    42921 => 'uniA7A9',\n    42922 => 'uniA7AA',\n    43000 => 'uniA7F8',\n    43001 => 'uniA7F9',\n    43002 => 'uniA7FA',\n    43003 => 'uniA7FB',\n    43004 => 'uniA7FC',\n    43005 => 'uniA7FD',\n    43006 => 'uniA7FE',\n    43007 => 'uniA7FF',\n    61184 => 'uni02E5.5',\n    61185 => 'uni02E6.5',\n    61186 => 'uni02E7.5',\n    61187 => 'uni02E8.5',\n    61188 => 'uni02E9.5',\n    61189 => 'uni02E5.4',\n    61190 => 'uni02E6.4',\n    61191 => 'uni02E7.4',\n    61192 => 'uni02E8.4',\n    61193 => 'uni02E9.4',\n    61194 => 'uni02E5.3',\n    61195 => 'uni02E6.3',\n    61196 => 'uni02E7.3',\n    61197 => 'uni02E8.3',\n    61198 => 'uni02E9.3',\n    61199 => 'uni02E5.2',\n    61200 => 'uni02E6.2',\n    61201 => 'uni02E7.2',\n    61202 => 'uni02E8.2',\n    61203 => 'uni02E9.2',\n    61204 => 'uni02E5.1',\n    61205 => 'uni02E6.1',\n    61206 => 'uni02E7.1',\n    61207 => 'uni02E8.1',\n    61208 => 'uni02E9.1',\n    61209 => 'stem',\n    61440 => 'uniF000',\n    61441 => 'uniF001',\n    61442 => 'uniF002',\n    61443 => 'uniF003',\n    62464 => 'uniF400',\n    62465 => 'uniF401',\n    62466 => 'uniF402',\n    62467 => 'uniF403',\n    62468 => 'uniF404',\n    62469 => 'uniF405',\n    62470 => 'uniF406',\n    62471 => 'uniF407',\n    62472 => 'uniF408',\n    62473 => 'uniF409',\n    62474 => 'uniF40A',\n    62475 => 'uniF40B',\n    62476 => 'uniF40C',\n    62477 => 'uniF40D',\n    62478 => 'uniF40E',\n    62479 => 'uniF40F',\n    62480 => 'uniF410',\n    62481 => 'uniF411',\n    62482 => 'uniF412',\n    62483 => 'uniF413',\n    62484 => 'uniF414',\n    62485 => 'uniF415',\n    62486 => 'uniF416',\n    62487 => 'uniF417',\n    62488 => 'uniF418',\n    62489 => 'uniF419',\n    62490 => 'uniF41A',\n    62491 => 'uniF41B',\n    62492 => 'uniF41C',\n    62493 => 'uniF41D',\n    62494 => 'uniF41E',\n    62495 => 'uniF41F',\n    62496 => 'uniF420',\n    62497 => 'uniF421',\n    62498 => 'uniF422',\n    62499 => 'uniF423',\n    62500 => 'uniF424',\n    62501 => 'uniF425',\n    62502 => 'uniF426',\n    62504 => 'uniF428',\n    62505 => 'uniF429',\n    62506 => 'uniF42A',\n    62507 => 'uniF42B',\n    62508 => 'uniF42C',\n    62509 => 'uniF42D',\n    62510 => 'uniF42E',\n    62511 => 'uniF42F',\n    62512 => 'uniF430',\n    62513 => 'uniF431',\n    62514 => 'uniF432',\n    62515 => 'uniF433',\n    62516 => 'uniF434',\n    62517 => 'uniF435',\n    62518 => 'uniF436',\n    62519 => 'uniF437',\n    62520 => 'uniF438',\n    62521 => 'uniF439',\n    62522 => 'uniF43A',\n    62523 => 'uniF43B',\n    62524 => 'uniF43C',\n    62525 => 'uniF43D',\n    62526 => 'uniF43E',\n    62527 => 'uniF43F',\n    62528 => 'uniF440',\n    62529 => 'uniF441',\n    63173 => 'uniF6C5',\n    64256 => 'uniFB00',\n    64257 => 'fi',\n    64258 => 'fl',\n    64259 => 'uniFB03',\n    64260 => 'uniFB04',\n    64261 => 'uniFB05',\n    64262 => 'uniFB06',\n    64275 => 'uniFB13',\n    64276 => 'uniFB14',\n    64277 => 'uniFB15',\n    64278 => 'uniFB16',\n    64279 => 'uniFB17',\n    64285 => 'uniFB1D',\n    64286 => 'uniFB1E',\n    64287 => 'uniFB1F',\n    64288 => 'uniFB20',\n    64289 => 'uniFB21',\n    64290 => 'uniFB22',\n    64291 => 'uniFB23',\n    64292 => 'uniFB24',\n    64293 => 'uniFB25',\n    64294 => 'uniFB26',\n    64295 => 'uniFB27',\n    64296 => 'uniFB28',\n    64297 => 'uniFB29',\n    64298 => 'uniFB2A',\n    64299 => 'uniFB2B',\n    64300 => 'uniFB2C',\n    64301 => 'uniFB2D',\n    64302 => 'uniFB2E',\n    64303 => 'uniFB2F',\n    64304 => 'uniFB30',\n    64305 => 'uniFB31',\n    64306 => 'uniFB32',\n    64307 => 'uniFB33',\n    64308 => 'uniFB34',\n    64309 => 'uniFB35',\n    64310 => 'uniFB36',\n    64312 => 'uniFB38',\n    64313 => 'uniFB39',\n    64314 => 'uniFB3A',\n    64315 => 'uniFB3B',\n    64316 => 'uniFB3C',\n    64318 => 'uniFB3E',\n    64320 => 'uniFB40',\n    64321 => 'uniFB41',\n    64323 => 'uniFB43',\n    64324 => 'uniFB44',\n    64326 => 'uniFB46',\n    64327 => 'uniFB47',\n    64328 => 'uniFB48',\n    64329 => 'uniFB49',\n    64330 => 'uniFB4A',\n    64331 => 'uniFB4B',\n    64332 => 'uniFB4C',\n    64333 => 'uniFB4D',\n    64334 => 'uniFB4E',\n    64335 => 'uniFB4F',\n    64338 => 'uniFB52',\n    64339 => 'uniFB53',\n    64340 => 'uniFB54',\n    64341 => 'uniFB55',\n    64342 => 'uniFB56',\n    64343 => 'uniFB57',\n    64344 => 'uniFB58',\n    64345 => 'uniFB59',\n    64346 => 'uniFB5A',\n    64347 => 'uniFB5B',\n    64348 => 'uniFB5C',\n    64349 => 'uniFB5D',\n    64350 => 'uniFB5E',\n    64351 => 'uniFB5F',\n    64352 => 'uniFB60',\n    64353 => 'uniFB61',\n    64354 => 'uniFB62',\n    64355 => 'uniFB63',\n    64356 => 'uniFB64',\n    64357 => 'uniFB65',\n    64358 => 'uniFB66',\n    64359 => 'uniFB67',\n    64360 => 'uniFB68',\n    64361 => 'uniFB69',\n    64362 => 'uniFB6A',\n    64363 => 'uniFB6B',\n    64364 => 'uniFB6C',\n    64365 => 'uniFB6D',\n    64366 => 'uniFB6E',\n    64367 => 'uniFB6F',\n    64368 => 'uniFB70',\n    64369 => 'uniFB71',\n    64370 => 'uniFB72',\n    64371 => 'uniFB73',\n    64372 => 'uniFB74',\n    64373 => 'uniFB75',\n    64374 => 'uniFB76',\n    64375 => 'uniFB77',\n    64376 => 'uniFB78',\n    64377 => 'uniFB79',\n    64378 => 'uniFB7A',\n    64379 => 'uniFB7B',\n    64380 => 'uniFB7C',\n    64381 => 'uniFB7D',\n    64382 => 'uniFB7E',\n    64383 => 'uniFB7F',\n    64384 => 'uniFB80',\n    64385 => 'uniFB81',\n    64386 => 'uniFB82',\n    64387 => 'uniFB83',\n    64388 => 'uniFB84',\n    64389 => 'uniFB85',\n    64390 => 'uniFB86',\n    64391 => 'uniFB87',\n    64392 => 'uniFB88',\n    64393 => 'uniFB89',\n    64394 => 'uniFB8A',\n    64395 => 'uniFB8B',\n    64396 => 'uniFB8C',\n    64397 => 'uniFB8D',\n    64398 => 'uniFB8E',\n    64399 => 'uniFB8F',\n    64400 => 'uniFB90',\n    64401 => 'uniFB91',\n    64402 => 'uniFB92',\n    64403 => 'uniFB93',\n    64404 => 'uniFB94',\n    64405 => 'uniFB95',\n    64406 => 'uniFB96',\n    64407 => 'uniFB97',\n    64408 => 'uniFB98',\n    64409 => 'uniFB99',\n    64410 => 'uniFB9A',\n    64411 => 'uniFB9B',\n    64412 => 'uniFB9C',\n    64413 => 'uniFB9D',\n    64414 => 'uniFB9E',\n    64415 => 'uniFB9F',\n    64416 => 'uniFBA0',\n    64417 => 'uniFBA1',\n    64418 => 'uniFBA2',\n    64419 => 'uniFBA3',\n    64426 => 'uniFBAA',\n    64427 => 'uniFBAB',\n    64428 => 'uniFBAC',\n    64429 => 'uniFBAD',\n    64467 => 'uniFBD3',\n    64468 => 'uniFBD4',\n    64469 => 'uniFBD5',\n    64470 => 'uniFBD6',\n    64471 => 'uniFBD7',\n    64472 => 'uniFBD8',\n    64473 => 'uniFBD9',\n    64474 => 'uniFBDA',\n    64475 => 'uniFBDB',\n    64476 => 'uniFBDC',\n    64478 => 'uniFBDE',\n    64479 => 'uniFBDF',\n    64484 => 'uniFBE4',\n    64485 => 'uniFBE5',\n    64486 => 'uniFBE6',\n    64487 => 'uniFBE7',\n    64488 => 'uniFBE8',\n    64489 => 'uniFBE9',\n    64508 => 'uniFBFC',\n    64509 => 'uniFBFD',\n    64510 => 'uniFBFE',\n    64511 => 'uniFBFF',\n    65024 => 'uniFE00',\n    65025 => 'uniFE01',\n    65026 => 'uniFE02',\n    65027 => 'uniFE03',\n    65028 => 'uniFE04',\n    65029 => 'uniFE05',\n    65030 => 'uniFE06',\n    65031 => 'uniFE07',\n    65032 => 'uniFE08',\n    65033 => 'uniFE09',\n    65034 => 'uniFE0A',\n    65035 => 'uniFE0B',\n    65036 => 'uniFE0C',\n    65037 => 'uniFE0D',\n    65038 => 'uniFE0E',\n    65039 => 'uniFE0F',\n    65056 => 'uniFE20',\n    65057 => 'uniFE21',\n    65058 => 'uniFE22',\n    65059 => 'uniFE23',\n    65136 => 'uniFE70',\n    65137 => 'uniFE71',\n    65138 => 'uniFE72',\n    65139 => 'uniFE73',\n    65140 => 'uniFE74',\n    65142 => 'uniFE76',\n    65143 => 'uniFE77',\n    65144 => 'uniFE78',\n    65145 => 'uniFE79',\n    65146 => 'uniFE7A',\n    65147 => 'uniFE7B',\n    65148 => 'uniFE7C',\n    65149 => 'uniFE7D',\n    65150 => 'uniFE7E',\n    65151 => 'uniFE7F',\n    65152 => 'uniFE80',\n    65153 => 'uniFE81',\n    65154 => 'uniFE82',\n    65155 => 'uniFE83',\n    65156 => 'uniFE84',\n    65157 => 'uniFE85',\n    65158 => 'uniFE86',\n    65159 => 'uniFE87',\n    65160 => 'uniFE88',\n    65161 => 'uniFE89',\n    65162 => 'uniFE8A',\n    65163 => 'uniFE8B',\n    65164 => 'uniFE8C',\n    65165 => 'uniFE8D',\n    65166 => 'uniFE8E',\n    65167 => 'uniFE8F',\n    65168 => 'uniFE90',\n    65169 => 'uniFE91',\n    65170 => 'uniFE92',\n    65171 => 'uniFE93',\n    65172 => 'uniFE94',\n    65173 => 'uniFE95',\n    65174 => 'uniFE96',\n    65175 => 'uniFE97',\n    65176 => 'uniFE98',\n    65177 => 'uniFE99',\n    65178 => 'uniFE9A',\n    65179 => 'uniFE9B',\n    65180 => 'uniFE9C',\n    65181 => 'uniFE9D',\n    65182 => 'uniFE9E',\n    65183 => 'uniFE9F',\n    65184 => 'uniFEA0',\n    65185 => 'uniFEA1',\n    65186 => 'uniFEA2',\n    65187 => 'uniFEA3',\n    65188 => 'uniFEA4',\n    65189 => 'uniFEA5',\n    65190 => 'uniFEA6',\n    65191 => 'uniFEA7',\n    65192 => 'uniFEA8',\n    65193 => 'uniFEA9',\n    65194 => 'uniFEAA',\n    65195 => 'uniFEAB',\n    65196 => 'uniFEAC',\n    65197 => 'uniFEAD',\n    65198 => 'uniFEAE',\n    65199 => 'uniFEAF',\n    65200 => 'uniFEB0',\n    65201 => 'uniFEB1',\n    65202 => 'uniFEB2',\n    65203 => 'uniFEB3',\n    65204 => 'uniFEB4',\n    65205 => 'uniFEB5',\n    65206 => 'uniFEB6',\n    65207 => 'uniFEB7',\n    65208 => 'uniFEB8',\n    65209 => 'uniFEB9',\n    65210 => 'uniFEBA',\n    65211 => 'uniFEBB',\n    65212 => 'uniFEBC',\n    65213 => 'uniFEBD',\n    65214 => 'uniFEBE',\n    65215 => 'uniFEBF',\n    65216 => 'uniFEC0',\n    65217 => 'uniFEC1',\n    65218 => 'uniFEC2',\n    65219 => 'uniFEC3',\n    65220 => 'uniFEC4',\n    65221 => 'uniFEC5',\n    65222 => 'uniFEC6',\n    65223 => 'uniFEC7',\n    65224 => 'uniFEC8',\n    65225 => 'uniFEC9',\n    65226 => 'uniFECA',\n    65227 => 'uniFECB',\n    65228 => 'uniFECC',\n    65229 => 'uniFECD',\n    65230 => 'uniFECE',\n    65231 => 'uniFECF',\n    65232 => 'uniFED0',\n    65233 => 'uniFED1',\n    65234 => 'uniFED2',\n    65235 => 'uniFED3',\n    65236 => 'uniFED4',\n    65237 => 'uniFED5',\n    65238 => 'uniFED6',\n    65239 => 'uniFED7',\n    65240 => 'uniFED8',\n    65241 => 'uniFED9',\n    65242 => 'uniFEDA',\n    65243 => 'uniFEDB',\n    65244 => 'uniFEDC',\n    65245 => 'uniFEDD',\n    65246 => 'uniFEDE',\n    65247 => 'uniFEDF',\n    65248 => 'uniFEE0',\n    65249 => 'uniFEE1',\n    65250 => 'uniFEE2',\n    65251 => 'uniFEE3',\n    65252 => 'uniFEE4',\n    65253 => 'uniFEE5',\n    65254 => 'uniFEE6',\n    65255 => 'uniFEE7',\n    65256 => 'uniFEE8',\n    65257 => 'uniFEE9',\n    65258 => 'uniFEEA',\n    65259 => 'uniFEEB',\n    65260 => 'uniFEEC',\n    65261 => 'uniFEED',\n    65262 => 'uniFEEE',\n    65263 => 'uniFEEF',\n    65264 => 'uniFEF0',\n    65265 => 'uniFEF1',\n    65266 => 'uniFEF2',\n    65267 => 'uniFEF3',\n    65268 => 'uniFEF4',\n    65269 => 'uniFEF5',\n    65270 => 'uniFEF6',\n    65271 => 'uniFEF7',\n    65272 => 'uniFEF8',\n    65273 => 'uniFEF9',\n    65274 => 'uniFEFA',\n    65275 => 'uniFEFB',\n    65276 => 'uniFEFC',\n    65279 => 'uniFEFF',\n    65529 => 'uniFFF9',\n    65530 => 'uniFFFA',\n    65531 => 'uniFFFB',\n    65532 => 'uniFFFC',\n    65533 => 'uniFFFD',\n  ),\n  'isUnicode' => true,\n  'EncodingScheme' => 'FontSpecific',\n  'FontName' => 'DejaVu Sans',\n  'FullName' => 'DejaVu Sans',\n  'Version' => 'Version 2.37',\n  'PostScriptName' => 'DejaVuSans',\n  'Weight' => 'Medium',\n  'ItalicAngle' => '0',\n  'IsFixedPitch' => 'false',\n  'UnderlineThickness' => '44',\n  'UnderlinePosition' => '-63',\n  'FontHeightOffset' => '0',\n  'Ascender' => '928',\n  'Descender' => '-236',\n  'FontBBox' => \n  array (\n    0 => '-1021',\n    1 => '-463',\n    2 => '1793',\n    3 => '1232',\n  ),\n  'StartCharMetrics' => '6253',\n  'C' => \n  array (\n    32 => 318.0,\n    33 => 401.0,\n    34 => 460.0,\n    35 => 838.0,\n    36 => 636.0,\n    37 => 950.0,\n    38 => 780.0,\n    39 => 275.0,\n    40 => 390.0,\n    41 => 390.0,\n    42 => 500.0,\n    43 => 838.0,\n    44 => 318.0,\n    45 => 361.0,\n    46 => 318.0,\n    47 => 337.0,\n    48 => 636.0,\n    49 => 636.0,\n    50 => 636.0,\n    51 => 636.0,\n    52 => 636.0,\n    53 => 636.0,\n    54 => 636.0,\n    55 => 636.0,\n    56 => 636.0,\n    57 => 636.0,\n    58 => 337.0,\n    59 => 337.0,\n    60 => 838.0,\n    61 => 838.0,\n    62 => 838.0,\n    63 => 531.0,\n    64 => 1000.0,\n    65 => 684.0,\n    66 => 686.0,\n    67 => 698.0,\n    68 => 770.0,\n    69 => 632.0,\n    70 => 575.0,\n    71 => 775.0,\n    72 => 752.0,\n    73 => 295.0,\n    74 => 295.0,\n    75 => 656.0,\n    76 => 557.0,\n    77 => 863.0,\n    78 => 748.0,\n    79 => 787.0,\n    80 => 603.0,\n    81 => 787.0,\n    82 => 695.0,\n    83 => 635.0,\n    84 => 611.0,\n    85 => 732.0,\n    86 => 684.0,\n    87 => 989.0,\n    88 => 685.0,\n    89 => 611.0,\n    90 => 685.0,\n    91 => 390.0,\n    92 => 337.0,\n    93 => 390.0,\n    94 => 838.0,\n    95 => 500.0,\n    96 => 500.0,\n    97 => 613.0,\n    98 => 635.0,\n    99 => 550.0,\n    100 => 635.0,\n    101 => 615.0,\n    102 => 352.0,\n    103 => 635.0,\n    104 => 634.0,\n    105 => 278.0,\n    106 => 278.0,\n    107 => 579.0,\n    108 => 278.0,\n    109 => 974.0,\n    110 => 634.0,\n    111 => 612.0,\n    112 => 635.0,\n    113 => 635.0,\n    114 => 411.0,\n    115 => 521.0,\n    116 => 392.0,\n    117 => 634.0,\n    118 => 592.0,\n    119 => 818.0,\n    120 => 592.0,\n    121 => 592.0,\n    122 => 525.0,\n    123 => 636.0,\n    124 => 337.0,\n    125 => 636.0,\n    126 => 838.0,\n    160 => 318.0,\n    161 => 401.0,\n    162 => 636.0,\n    163 => 636.0,\n    164 => 636.0,\n    165 => 636.0,\n    166 => 337.0,\n    167 => 500.0,\n    168 => 500.0,\n    169 => 1000.0,\n    170 => 471.0,\n    171 => 612.0,\n    172 => 838.0,\n    173 => 361.0,\n    174 => 1000.0,\n    175 => 500.0,\n    176 => 500.0,\n    177 => 838.0,\n    178 => 401.0,\n    179 => 401.0,\n    180 => 500.0,\n    181 => 636.0,\n    182 => 636.0,\n    183 => 318.0,\n    184 => 500.0,\n    185 => 401.0,\n    186 => 471.0,\n    187 => 612.0,\n    188 => 969.0,\n    189 => 969.0,\n    190 => 969.0,\n    191 => 531.0,\n    192 => 684.0,\n    193 => 684.0,\n    194 => 684.0,\n    195 => 684.0,\n    196 => 684.0,\n    197 => 684.0,\n    198 => 974.0,\n    199 => 698.0,\n    200 => 632.0,\n    201 => 632.0,\n    202 => 632.0,\n    203 => 632.0,\n    204 => 295.0,\n    205 => 295.0,\n    206 => 295.0,\n    207 => 295.0,\n    208 => 775.0,\n    209 => 748.0,\n    210 => 787.0,\n    211 => 787.0,\n    212 => 787.0,\n    213 => 787.0,\n    214 => 787.0,\n    215 => 838.0,\n    216 => 787.0,\n    217 => 732.0,\n    218 => 732.0,\n    219 => 732.0,\n    220 => 732.0,\n    221 => 611.0,\n    222 => 605.0,\n    223 => 630.0,\n    224 => 613.0,\n    225 => 613.0,\n    226 => 613.0,\n    227 => 613.0,\n    228 => 613.0,\n    229 => 613.0,\n    230 => 982.0,\n    231 => 550.0,\n    232 => 615.0,\n    233 => 615.0,\n    234 => 615.0,\n    235 => 615.0,\n    236 => 278.0,\n    237 => 278.0,\n    238 => 278.0,\n    239 => 278.0,\n    240 => 612.0,\n    241 => 634.0,\n    242 => 612.0,\n    243 => 612.0,\n    244 => 612.0,\n    245 => 612.0,\n    246 => 612.0,\n    247 => 838.0,\n    248 => 612.0,\n    249 => 634.0,\n    250 => 634.0,\n    251 => 634.0,\n    252 => 634.0,\n    253 => 592.0,\n    254 => 635.0,\n    255 => 592.0,\n    256 => 684.0,\n    257 => 613.0,\n    258 => 684.0,\n    259 => 613.0,\n    260 => 684.0,\n    261 => 613.0,\n    262 => 698.0,\n    263 => 550.0,\n    264 => 698.0,\n    265 => 550.0,\n    266 => 698.0,\n    267 => 550.0,\n    268 => 698.0,\n    269 => 550.0,\n    270 => 770.0,\n    271 => 635.0,\n    272 => 775.0,\n    273 => 635.0,\n    274 => 632.0,\n    275 => 615.0,\n    276 => 632.0,\n    277 => 615.0,\n    278 => 632.0,\n    279 => 615.0,\n    280 => 632.0,\n    281 => 615.0,\n    282 => 632.0,\n    283 => 615.0,\n    284 => 775.0,\n    285 => 635.0,\n    286 => 775.0,\n    287 => 635.0,\n    288 => 775.0,\n    289 => 635.0,\n    290 => 775.0,\n    291 => 635.0,\n    292 => 752.0,\n    293 => 634.0,\n    294 => 916.0,\n    295 => 695.0,\n    296 => 295.0,\n    297 => 278.0,\n    298 => 295.0,\n    299 => 278.0,\n    300 => 295.0,\n    301 => 278.0,\n    302 => 295.0,\n    303 => 278.0,\n    304 => 295.0,\n    305 => 278.0,\n    306 => 590.0,\n    307 => 556.0,\n    308 => 295.0,\n    309 => 278.0,\n    310 => 656.0,\n    311 => 579.0,\n    312 => 579.0,\n    313 => 557.0,\n    314 => 278.0,\n    315 => 557.0,\n    316 => 278.0,\n    317 => 557.0,\n    318 => 375.0,\n    319 => 557.0,\n    320 => 342.0,\n    321 => 562.0,\n    322 => 284.0,\n    323 => 748.0,\n    324 => 634.0,\n    325 => 748.0,\n    326 => 634.0,\n    327 => 748.0,\n    328 => 634.0,\n    329 => 813.0,\n    330 => 748.0,\n    331 => 634.0,\n    332 => 787.0,\n    333 => 612.0,\n    334 => 787.0,\n    335 => 612.0,\n    336 => 787.0,\n    337 => 612.0,\n    338 => 1070.0,\n    339 => 1023.0,\n    340 => 695.0,\n    341 => 411.0,\n    342 => 695.0,\n    343 => 411.0,\n    344 => 695.0,\n    345 => 411.0,\n    346 => 635.0,\n    347 => 521.0,\n    348 => 635.0,\n    349 => 521.0,\n    350 => 635.0,\n    351 => 521.0,\n    352 => 635.0,\n    353 => 521.0,\n    354 => 611.0,\n    355 => 392.0,\n    356 => 611.0,\n    357 => 392.0,\n    358 => 611.0,\n    359 => 392.0,\n    360 => 732.0,\n    361 => 634.0,\n    362 => 732.0,\n    363 => 634.0,\n    364 => 732.0,\n    365 => 634.0,\n    366 => 732.0,\n    367 => 634.0,\n    368 => 732.0,\n    369 => 634.0,\n    370 => 732.0,\n    371 => 634.0,\n    372 => 989.0,\n    373 => 818.0,\n    374 => 611.0,\n    375 => 592.0,\n    376 => 611.0,\n    377 => 685.0,\n    378 => 525.0,\n    379 => 685.0,\n    380 => 525.0,\n    381 => 685.0,\n    382 => 525.0,\n    383 => 352.0,\n    384 => 635.0,\n    385 => 735.0,\n    386 => 686.0,\n    387 => 635.0,\n    388 => 686.0,\n    389 => 635.0,\n    390 => 703.0,\n    391 => 698.0,\n    392 => 550.0,\n    393 => 775.0,\n    394 => 819.0,\n    395 => 686.0,\n    396 => 635.0,\n    397 => 612.0,\n    398 => 632.0,\n    399 => 787.0,\n    400 => 614.0,\n    401 => 575.0,\n    402 => 352.0,\n    403 => 775.0,\n    404 => 687.0,\n    405 => 984.0,\n    406 => 354.0,\n    407 => 295.0,\n    408 => 746.0,\n    409 => 579.0,\n    410 => 278.0,\n    411 => 592.0,\n    412 => 974.0,\n    413 => 748.0,\n    414 => 634.0,\n    415 => 787.0,\n    416 => 913.0,\n    417 => 612.0,\n    418 => 949.0,\n    419 => 759.0,\n    420 => 652.0,\n    421 => 635.0,\n    422 => 695.0,\n    423 => 635.0,\n    424 => 521.0,\n    425 => 632.0,\n    426 => 336.0,\n    427 => 392.0,\n    428 => 611.0,\n    429 => 392.0,\n    430 => 611.0,\n    431 => 858.0,\n    432 => 634.0,\n    433 => 764.0,\n    434 => 721.0,\n    435 => 744.0,\n    436 => 730.0,\n    437 => 685.0,\n    438 => 525.0,\n    439 => 666.0,\n    440 => 666.0,\n    441 => 578.0,\n    442 => 525.0,\n    443 => 636.0,\n    444 => 666.0,\n    445 => 578.0,\n    446 => 510.0,\n    447 => 635.0,\n    448 => 295.0,\n    449 => 492.0,\n    450 => 459.0,\n    451 => 295.0,\n    452 => 1422.0,\n    453 => 1299.0,\n    454 => 1154.0,\n    455 => 835.0,\n    456 => 787.0,\n    457 => 457.0,\n    458 => 931.0,\n    459 => 924.0,\n    460 => 797.0,\n    461 => 684.0,\n    462 => 613.0,\n    463 => 295.0,\n    464 => 278.0,\n    465 => 787.0,\n    466 => 612.0,\n    467 => 732.0,\n    468 => 634.0,\n    469 => 732.0,\n    470 => 634.0,\n    471 => 732.0,\n    472 => 634.0,\n    473 => 732.0,\n    474 => 634.0,\n    475 => 732.0,\n    476 => 634.0,\n    477 => 615.0,\n    478 => 684.0,\n    479 => 613.0,\n    480 => 684.0,\n    481 => 613.0,\n    482 => 974.0,\n    483 => 982.0,\n    484 => 775.0,\n    485 => 635.0,\n    486 => 775.0,\n    487 => 635.0,\n    488 => 656.0,\n    489 => 579.0,\n    490 => 787.0,\n    491 => 612.0,\n    492 => 787.0,\n    493 => 612.0,\n    494 => 666.0,\n    495 => 578.0,\n    496 => 278.0,\n    497 => 1422.0,\n    498 => 1299.0,\n    499 => 1154.0,\n    500 => 775.0,\n    501 => 635.0,\n    502 => 1113.0,\n    503 => 682.0,\n    504 => 748.0,\n    505 => 634.0,\n    506 => 684.0,\n    507 => 613.0,\n    508 => 974.0,\n    509 => 982.0,\n    510 => 787.0,\n    511 => 612.0,\n    512 => 684.0,\n    513 => 613.0,\n    514 => 684.0,\n    515 => 613.0,\n    516 => 632.0,\n    517 => 615.0,\n    518 => 632.0,\n    519 => 615.0,\n    520 => 295.0,\n    521 => 278.0,\n    522 => 295.0,\n    523 => 278.0,\n    524 => 787.0,\n    525 => 612.0,\n    526 => 787.0,\n    527 => 612.0,\n    528 => 695.0,\n    529 => 411.0,\n    530 => 695.0,\n    531 => 411.0,\n    532 => 732.0,\n    533 => 634.0,\n    534 => 732.0,\n    535 => 634.0,\n    536 => 635.0,\n    537 => 521.0,\n    538 => 611.0,\n    539 => 392.0,\n    540 => 627.0,\n    541 => 521.0,\n    542 => 752.0,\n    543 => 634.0,\n    544 => 735.0,\n    545 => 838.0,\n    546 => 698.0,\n    547 => 610.0,\n    548 => 685.0,\n    549 => 525.0,\n    550 => 684.0,\n    551 => 613.0,\n    552 => 632.0,\n    553 => 615.0,\n    554 => 787.0,\n    555 => 612.0,\n    556 => 787.0,\n    557 => 612.0,\n    558 => 787.0,\n    559 => 612.0,\n    560 => 787.0,\n    561 => 612.0,\n    562 => 611.0,\n    563 => 592.0,\n    564 => 475.0,\n    565 => 843.0,\n    566 => 477.0,\n    567 => 278.0,\n    568 => 998.0,\n    569 => 998.0,\n    570 => 684.0,\n    571 => 698.0,\n    572 => 550.0,\n    573 => 557.0,\n    574 => 611.0,\n    575 => 521.0,\n    576 => 525.0,\n    577 => 603.0,\n    578 => 479.0,\n    579 => 686.0,\n    580 => 732.0,\n    581 => 684.0,\n    582 => 632.0,\n    583 => 615.0,\n    584 => 295.0,\n    585 => 278.0,\n    586 => 781.0,\n    587 => 635.0,\n    588 => 695.0,\n    589 => 411.0,\n    590 => 611.0,\n    591 => 592.0,\n    592 => 600.0,\n    593 => 635.0,\n    594 => 635.0,\n    595 => 635.0,\n    596 => 549.0,\n    597 => 550.0,\n    598 => 635.0,\n    599 => 696.0,\n    600 => 615.0,\n    601 => 615.0,\n    602 => 819.0,\n    603 => 541.0,\n    604 => 532.0,\n    605 => 775.0,\n    606 => 664.0,\n    607 => 278.0,\n    608 => 696.0,\n    609 => 635.0,\n    610 => 629.0,\n    611 => 596.0,\n    612 => 596.0,\n    613 => 634.0,\n    614 => 634.0,\n    615 => 634.0,\n    616 => 278.0,\n    617 => 338.0,\n    618 => 372.0,\n    619 => 396.0,\n    620 => 487.0,\n    621 => 278.0,\n    622 => 706.0,\n    623 => 974.0,\n    624 => 974.0,\n    625 => 974.0,\n    626 => 646.0,\n    627 => 642.0,\n    628 => 634.0,\n    629 => 612.0,\n    630 => 858.0,\n    631 => 728.0,\n    632 => 660.0,\n    633 => 414.0,\n    634 => 414.0,\n    635 => 414.0,\n    636 => 411.0,\n    637 => 411.0,\n    638 => 530.0,\n    639 => 530.0,\n    640 => 604.0,\n    641 => 604.0,\n    642 => 521.0,\n    643 => 336.0,\n    644 => 336.0,\n    645 => 461.0,\n    646 => 336.0,\n    647 => 392.0,\n    648 => 392.0,\n    649 => 634.0,\n    650 => 618.0,\n    651 => 598.0,\n    652 => 592.0,\n    653 => 818.0,\n    654 => 592.0,\n    655 => 611.0,\n    656 => 525.0,\n    657 => 525.0,\n    658 => 578.0,\n    659 => 578.0,\n    660 => 510.0,\n    661 => 510.0,\n    662 => 510.0,\n    663 => 510.0,\n    664 => 787.0,\n    665 => 580.0,\n    666 => 664.0,\n    667 => 708.0,\n    668 => 654.0,\n    669 => 292.0,\n    670 => 667.0,\n    671 => 507.0,\n    672 => 727.0,\n    673 => 510.0,\n    674 => 510.0,\n    675 => 1014.0,\n    676 => 1058.0,\n    677 => 1013.0,\n    678 => 830.0,\n    679 => 610.0,\n    680 => 778.0,\n    681 => 848.0,\n    682 => 706.0,\n    683 => 654.0,\n    684 => 515.0,\n    685 => 515.0,\n    686 => 661.0,\n    687 => 664.0,\n    688 => 404.0,\n    689 => 399.0,\n    690 => 175.0,\n    691 => 259.0,\n    692 => 295.0,\n    693 => 296.0,\n    694 => 379.0,\n    695 => 515.0,\n    696 => 373.0,\n    697 => 278.0,\n    698 => 460.0,\n    699 => 318.0,\n    700 => 318.0,\n    701 => 318.0,\n    702 => 307.0,\n    703 => 307.0,\n    704 => 370.0,\n    705 => 370.0,\n    706 => 500.0,\n    707 => 500.0,\n    708 => 500.0,\n    709 => 500.0,\n    710 => 500.0,\n    711 => 500.0,\n    712 => 275.0,\n    713 => 500.0,\n    714 => 500.0,\n    715 => 500.0,\n    716 => 275.0,\n    717 => 500.0,\n    718 => 500.0,\n    719 => 500.0,\n    720 => 337.0,\n    721 => 337.0,\n    722 => 307.0,\n    723 => 307.0,\n    724 => 500.0,\n    725 => 500.0,\n    726 => 390.0,\n    727 => 317.0,\n    728 => 500.0,\n    729 => 500.0,\n    730 => 500.0,\n    731 => 500.0,\n    732 => 500.0,\n    733 => 500.0,\n    734 => 315.0,\n    735 => 500.0,\n    736 => 426.0,\n    737 => 166.0,\n    738 => 373.0,\n    739 => 444.0,\n    740 => 370.0,\n    741 => 493.0,\n    742 => 493.0,\n    743 => 493.0,\n    744 => 493.0,\n    745 => 493.0,\n    748 => 500.0,\n    749 => 500.0,\n    750 => 518.0,\n    755 => 500.0,\n    759 => 500.0,\n    768 => 0.0,\n    769 => 0.0,\n    770 => 0.0,\n    771 => 0.0,\n    772 => 0.0,\n    773 => 0.0,\n    774 => 0.0,\n    775 => 0.0,\n    776 => 0.0,\n    777 => 0.0,\n    778 => 0.0,\n    779 => 0.0,\n    780 => 0.0,\n    781 => 0.0,\n    782 => 0.0,\n    783 => 0.0,\n    784 => 0.0,\n    785 => 0.0,\n    786 => 0.0,\n    787 => 0.0,\n    788 => 0.0,\n    789 => 0.0,\n    790 => 0.0,\n    791 => 0.0,\n    792 => 0.0,\n    793 => 0.0,\n    794 => 0.0,\n    795 => 0.0,\n    796 => 0.0,\n    797 => 0.0,\n    798 => 0.0,\n    799 => 0.0,\n    800 => 0.0,\n    801 => 0.0,\n    802 => 0.0,\n    803 => 0.0,\n    804 => 0.0,\n    805 => 0.0,\n    806 => 0.0,\n    807 => 0.0,\n    808 => 0.0,\n    809 => 0.0,\n    810 => 0.0,\n    811 => 0.0,\n    812 => 0.0,\n    813 => 0.0,\n    814 => 0.0,\n    815 => 0.0,\n    816 => 0.0,\n    817 => 0.0,\n    818 => 0.0,\n    819 => 0.0,\n    820 => 0.0,\n    821 => 0.0,\n    822 => 0.0,\n    823 => 0.0,\n    824 => 0.0,\n    825 => 0.0,\n    826 => 0.0,\n    827 => 0.0,\n    828 => 0.0,\n    829 => 0.0,\n    830 => 0.0,\n    831 => 0.0,\n    832 => 0.0,\n    833 => 0.0,\n    834 => 0.0,\n    835 => 0.0,\n    836 => 0.0,\n    837 => 0.0,\n    838 => 0.0,\n    839 => 0.0,\n    840 => 0.0,\n    841 => 0.0,\n    842 => 0.0,\n    843 => 0.0,\n    844 => 0.0,\n    845 => 0.0,\n    846 => 0.0,\n    847 => 0.0,\n    849 => 0.0,\n    850 => 0.0,\n    851 => 0.0,\n    855 => 0.0,\n    856 => 0.0,\n    858 => 0.0,\n    860 => 0.0,\n    861 => 0.0,\n    862 => 0.0,\n    863 => 0.0,\n    864 => 0.0,\n    865 => 0.0,\n    866 => 0.0,\n    880 => 654.0,\n    881 => 568.0,\n    882 => 862.0,\n    883 => 647.0,\n    884 => 278.0,\n    885 => 278.0,\n    886 => 748.0,\n    887 => 650.0,\n    890 => 500.0,\n    891 => 549.0,\n    892 => 550.0,\n    893 => 549.0,\n    894 => 337.0,\n    895 => 295.0,\n    900 => 500.0,\n    901 => 500.0,\n    902 => 692.0,\n    903 => 318.0,\n    904 => 746.0,\n    905 => 871.0,\n    906 => 408.0,\n    908 => 813.0,\n    910 => 825.0,\n    911 => 826.0,\n    912 => 338.0,\n    913 => 684.0,\n    914 => 686.0,\n    915 => 557.0,\n    916 => 684.0,\n    917 => 632.0,\n    918 => 685.0,\n    919 => 752.0,\n    920 => 787.0,\n    921 => 295.0,\n    922 => 656.0,\n    923 => 684.0,\n    924 => 863.0,\n    925 => 748.0,\n    926 => 632.0,\n    927 => 787.0,\n    928 => 752.0,\n    929 => 603.0,\n    931 => 632.0,\n    932 => 611.0,\n    933 => 611.0,\n    934 => 787.0,\n    935 => 685.0,\n    936 => 787.0,\n    937 => 764.0,\n    938 => 295.0,\n    939 => 611.0,\n    940 => 659.0,\n    941 => 541.0,\n    942 => 634.0,\n    943 => 338.0,\n    944 => 579.0,\n    945 => 659.0,\n    946 => 638.0,\n    947 => 592.0,\n    948 => 612.0,\n    949 => 541.0,\n    950 => 544.0,\n    951 => 634.0,\n    952 => 612.0,\n    953 => 338.0,\n    954 => 589.0,\n    955 => 592.0,\n    956 => 636.0,\n    957 => 559.0,\n    958 => 558.0,\n    959 => 612.0,\n    960 => 602.0,\n    961 => 635.0,\n    962 => 587.0,\n    963 => 634.0,\n    964 => 602.0,\n    965 => 579.0,\n    966 => 660.0,\n    967 => 578.0,\n    968 => 660.0,\n    969 => 837.0,\n    970 => 338.0,\n    971 => 579.0,\n    972 => 612.0,\n    973 => 579.0,\n    974 => 837.0,\n    975 => 656.0,\n    976 => 614.0,\n    977 => 619.0,\n    978 => 699.0,\n    979 => 842.0,\n    980 => 699.0,\n    981 => 660.0,\n    982 => 837.0,\n    983 => 664.0,\n    984 => 787.0,\n    985 => 612.0,\n    986 => 648.0,\n    987 => 587.0,\n    988 => 575.0,\n    989 => 458.0,\n    990 => 660.0,\n    991 => 660.0,\n    992 => 865.0,\n    993 => 627.0,\n    994 => 934.0,\n    995 => 837.0,\n    996 => 758.0,\n    997 => 659.0,\n    998 => 792.0,\n    999 => 615.0,\n    1000 => 687.0,\n    1001 => 607.0,\n    1002 => 768.0,\n    1003 => 625.0,\n    1004 => 699.0,\n    1005 => 612.0,\n    1006 => 611.0,\n    1007 => 536.0,\n    1008 => 664.0,\n    1009 => 635.0,\n    1010 => 550.0,\n    1011 => 278.0,\n    1012 => 787.0,\n    1013 => 615.0,\n    1014 => 615.0,\n    1015 => 605.0,\n    1016 => 635.0,\n    1017 => 698.0,\n    1018 => 863.0,\n    1019 => 651.0,\n    1020 => 635.0,\n    1021 => 703.0,\n    1022 => 698.0,\n    1023 => 703.0,\n    1024 => 632.0,\n    1025 => 632.0,\n    1026 => 786.0,\n    1027 => 610.0,\n    1028 => 698.0,\n    1029 => 635.0,\n    1030 => 295.0,\n    1031 => 295.0,\n    1032 => 295.0,\n    1033 => 1094.0,\n    1034 => 1045.0,\n    1035 => 786.0,\n    1036 => 710.0,\n    1037 => 748.0,\n    1038 => 609.0,\n    1039 => 752.0,\n    1040 => 684.0,\n    1041 => 686.0,\n    1042 => 686.0,\n    1043 => 610.0,\n    1044 => 781.0,\n    1045 => 632.0,\n    1046 => 1077.0,\n    1047 => 641.0,\n    1048 => 748.0,\n    1049 => 748.0,\n    1050 => 710.0,\n    1051 => 752.0,\n    1052 => 863.0,\n    1053 => 752.0,\n    1054 => 787.0,\n    1055 => 752.0,\n    1056 => 603.0,\n    1057 => 698.0,\n    1058 => 611.0,\n    1059 => 609.0,\n    1060 => 861.0,\n    1061 => 685.0,\n    1062 => 776.0,\n    1063 => 686.0,\n    1064 => 1069.0,\n    1065 => 1094.0,\n    1066 => 833.0,\n    1067 => 882.0,\n    1068 => 686.0,\n    1069 => 698.0,\n    1070 => 1080.0,\n    1071 => 695.0,\n    1072 => 613.0,\n    1073 => 617.0,\n    1074 => 589.0,\n    1075 => 525.0,\n    1076 => 691.0,\n    1077 => 615.0,\n    1078 => 901.0,\n    1079 => 532.0,\n    1080 => 650.0,\n    1081 => 650.0,\n    1082 => 604.0,\n    1083 => 639.0,\n    1084 => 754.0,\n    1085 => 654.0,\n    1086 => 612.0,\n    1087 => 654.0,\n    1088 => 635.0,\n    1089 => 550.0,\n    1090 => 583.0,\n    1091 => 592.0,\n    1092 => 855.0,\n    1093 => 592.0,\n    1094 => 681.0,\n    1095 => 591.0,\n    1096 => 915.0,\n    1097 => 942.0,\n    1098 => 707.0,\n    1099 => 790.0,\n    1100 => 589.0,\n    1101 => 549.0,\n    1102 => 842.0,\n    1103 => 602.0,\n    1104 => 615.0,\n    1105 => 615.0,\n    1106 => 625.0,\n    1107 => 525.0,\n    1108 => 549.0,\n    1109 => 521.0,\n    1110 => 278.0,\n    1111 => 278.0,\n    1112 => 278.0,\n    1113 => 902.0,\n    1114 => 898.0,\n    1115 => 652.0,\n    1116 => 604.0,\n    1117 => 650.0,\n    1118 => 592.0,\n    1119 => 654.0,\n    1120 => 934.0,\n    1121 => 837.0,\n    1122 => 771.0,\n    1123 => 672.0,\n    1124 => 942.0,\n    1125 => 749.0,\n    1126 => 879.0,\n    1127 => 783.0,\n    1128 => 1160.0,\n    1129 => 1001.0,\n    1130 => 787.0,\n    1131 => 612.0,\n    1132 => 1027.0,\n    1133 => 824.0,\n    1134 => 636.0,\n    1135 => 541.0,\n    1136 => 856.0,\n    1137 => 876.0,\n    1138 => 787.0,\n    1139 => 612.0,\n    1140 => 781.0,\n    1141 => 665.0,\n    1142 => 781.0,\n    1143 => 665.0,\n    1144 => 992.0,\n    1145 => 904.0,\n    1146 => 953.0,\n    1147 => 758.0,\n    1148 => 1180.0,\n    1149 => 1028.0,\n    1150 => 934.0,\n    1151 => 837.0,\n    1152 => 698.0,\n    1153 => 550.0,\n    1154 => 502.0,\n    1155 => 0.0,\n    1156 => 0.0,\n    1157 => 0.0,\n    1158 => 0.0,\n    1159 => 0.0,\n    1160 => 418.0,\n    1161 => 418.0,\n    1162 => 772.0,\n    1163 => 677.0,\n    1164 => 686.0,\n    1165 => 589.0,\n    1166 => 603.0,\n    1167 => 635.0,\n    1168 => 610.0,\n    1169 => 525.0,\n    1170 => 675.0,\n    1171 => 590.0,\n    1172 => 624.0,\n    1173 => 530.0,\n    1174 => 1077.0,\n    1175 => 901.0,\n    1176 => 641.0,\n    1177 => 532.0,\n    1178 => 710.0,\n    1179 => 604.0,\n    1180 => 710.0,\n    1181 => 604.0,\n    1182 => 710.0,\n    1183 => 604.0,\n    1184 => 856.0,\n    1185 => 832.0,\n    1186 => 752.0,\n    1187 => 661.0,\n    1188 => 1014.0,\n    1189 => 877.0,\n    1190 => 1081.0,\n    1191 => 916.0,\n    1192 => 878.0,\n    1193 => 693.0,\n    1194 => 698.0,\n    1195 => 550.0,\n    1196 => 611.0,\n    1197 => 583.0,\n    1198 => 611.0,\n    1199 => 592.0,\n    1200 => 611.0,\n    1201 => 592.0,\n    1202 => 685.0,\n    1203 => 592.0,\n    1204 => 934.0,\n    1205 => 807.0,\n    1206 => 686.0,\n    1207 => 591.0,\n    1208 => 686.0,\n    1209 => 591.0,\n    1210 => 686.0,\n    1211 => 634.0,\n    1212 => 941.0,\n    1213 => 728.0,\n    1214 => 941.0,\n    1215 => 728.0,\n    1216 => 295.0,\n    1217 => 1077.0,\n    1218 => 901.0,\n    1219 => 656.0,\n    1220 => 604.0,\n    1221 => 776.0,\n    1222 => 670.0,\n    1223 => 752.0,\n    1224 => 661.0,\n    1225 => 776.0,\n    1226 => 681.0,\n    1227 => 686.0,\n    1228 => 591.0,\n    1229 => 888.0,\n    1230 => 774.0,\n    1231 => 278.0,\n    1232 => 684.0,\n    1233 => 613.0,\n    1234 => 684.0,\n    1235 => 613.0,\n    1236 => 974.0,\n    1237 => 982.0,\n    1238 => 632.0,\n    1239 => 615.0,\n    1240 => 787.0,\n    1241 => 615.0,\n    1242 => 787.0,\n    1243 => 615.0,\n    1244 => 1077.0,\n    1245 => 901.0,\n    1246 => 641.0,\n    1247 => 532.0,\n    1248 => 666.0,\n    1249 => 578.0,\n    1250 => 748.0,\n    1251 => 650.0,\n    1252 => 748.0,\n    1253 => 650.0,\n    1254 => 787.0,\n    1255 => 612.0,\n    1256 => 787.0,\n    1257 => 612.0,\n    1258 => 787.0,\n    1259 => 612.0,\n    1260 => 698.0,\n    1261 => 549.0,\n    1262 => 609.0,\n    1263 => 592.0,\n    1264 => 609.0,\n    1265 => 592.0,\n    1266 => 609.0,\n    1267 => 592.0,\n    1268 => 686.0,\n    1269 => 591.0,\n    1270 => 610.0,\n    1271 => 525.0,\n    1272 => 882.0,\n    1273 => 790.0,\n    1274 => 675.0,\n    1275 => 590.0,\n    1276 => 685.0,\n    1277 => 592.0,\n    1278 => 685.0,\n    1279 => 592.0,\n    1280 => 686.0,\n    1281 => 589.0,\n    1282 => 1006.0,\n    1283 => 897.0,\n    1284 => 975.0,\n    1285 => 869.0,\n    1286 => 679.0,\n    1287 => 588.0,\n    1288 => 1072.0,\n    1289 => 957.0,\n    1290 => 1113.0,\n    1291 => 967.0,\n    1292 => 775.0,\n    1293 => 660.0,\n    1294 => 773.0,\n    1295 => 711.0,\n    1296 => 614.0,\n    1297 => 541.0,\n    1298 => 752.0,\n    1299 => 639.0,\n    1300 => 1169.0,\n    1301 => 994.0,\n    1302 => 894.0,\n    1303 => 864.0,\n    1304 => 1032.0,\n    1305 => 986.0,\n    1306 => 787.0,\n    1307 => 635.0,\n    1308 => 989.0,\n    1309 => 818.0,\n    1310 => 710.0,\n    1311 => 604.0,\n    1312 => 1081.0,\n    1313 => 905.0,\n    1314 => 1081.0,\n    1315 => 912.0,\n    1316 => 793.0,\n    1317 => 683.0,\n    1329 => 766.0,\n    1330 => 732.0,\n    1331 => 753.0,\n    1332 => 753.0,\n    1333 => 732.0,\n    1334 => 772.0,\n    1335 => 640.0,\n    1336 => 732.0,\n    1337 => 859.0,\n    1338 => 753.0,\n    1339 => 691.0,\n    1340 => 533.0,\n    1341 => 922.0,\n    1342 => 863.0,\n    1343 => 732.0,\n    1344 => 716.0,\n    1345 => 766.0,\n    1346 => 753.0,\n    1347 => 767.0,\n    1348 => 792.0,\n    1349 => 728.0,\n    1350 => 729.0,\n    1351 => 757.0,\n    1352 => 732.0,\n    1353 => 713.0,\n    1354 => 800.0,\n    1355 => 768.0,\n    1356 => 792.0,\n    1357 => 732.0,\n    1358 => 753.0,\n    1359 => 705.0,\n    1360 => 694.0,\n    1361 => 744.0,\n    1362 => 538.0,\n    1363 => 811.0,\n    1364 => 757.0,\n    1365 => 787.0,\n    1366 => 790.0,\n    1369 => 307.0,\n    1370 => 318.0,\n    1371 => 234.0,\n    1372 => 361.0,\n    1373 => 238.0,\n    1374 => 405.0,\n    1375 => 500.0,\n    1377 => 974.0,\n    1378 => 634.0,\n    1379 => 658.0,\n    1380 => 663.0,\n    1381 => 634.0,\n    1382 => 635.0,\n    1383 => 515.0,\n    1384 => 634.0,\n    1385 => 738.0,\n    1386 => 658.0,\n    1387 => 634.0,\n    1388 => 271.0,\n    1389 => 980.0,\n    1390 => 623.0,\n    1391 => 634.0,\n    1392 => 634.0,\n    1393 => 608.0,\n    1394 => 634.0,\n    1395 => 629.0,\n    1396 => 634.0,\n    1397 => 271.0,\n    1398 => 634.0,\n    1399 => 499.0,\n    1400 => 634.0,\n    1401 => 404.0,\n    1402 => 974.0,\n    1403 => 560.0,\n    1404 => 648.0,\n    1405 => 634.0,\n    1406 => 634.0,\n    1407 => 974.0,\n    1408 => 634.0,\n    1409 => 633.0,\n    1410 => 435.0,\n    1411 => 974.0,\n    1412 => 636.0,\n    1413 => 609.0,\n    1414 => 805.0,\n    1415 => 812.0,\n    1417 => 337.0,\n    1418 => 361.0,\n    1456 => 0.0,\n    1457 => 0.0,\n    1458 => 0.0,\n    1459 => 0.0,\n    1460 => 0.0,\n    1461 => 0.0,\n    1462 => 0.0,\n    1463 => 0.0,\n    1464 => 0.0,\n    1465 => 0.0,\n    1466 => 0.0,\n    1467 => 0.0,\n    1468 => 0.0,\n    1469 => 0.0,\n    1470 => 361.0,\n    1471 => 0.0,\n    1472 => 295.0,\n    1473 => 0.0,\n    1474 => 0.0,\n    1475 => 295.0,\n    1478 => 441.0,\n    1479 => 0.0,\n    1488 => 668.0,\n    1489 => 578.0,\n    1490 => 412.0,\n    1491 => 546.0,\n    1492 => 653.0,\n    1493 => 272.0,\n    1494 => 346.0,\n    1495 => 653.0,\n    1496 => 648.0,\n    1497 => 224.0,\n    1498 => 537.0,\n    1499 => 529.0,\n    1500 => 568.0,\n    1501 => 664.0,\n    1502 => 679.0,\n    1503 => 272.0,\n    1504 => 400.0,\n    1505 => 649.0,\n    1506 => 626.0,\n    1507 => 640.0,\n    1508 => 625.0,\n    1509 => 540.0,\n    1510 => 593.0,\n    1511 => 709.0,\n    1512 => 564.0,\n    1513 => 708.0,\n    1514 => 657.0,\n    1520 => 471.0,\n    1521 => 423.0,\n    1522 => 331.0,\n    1523 => 416.0,\n    1524 => 645.0,\n    1542 => 637.0,\n    1543 => 637.0,\n    1545 => 757.0,\n    1546 => 977.0,\n    1548 => 323.0,\n    1557 => 0.0,\n    1563 => 318.0,\n    1567 => 531.0,\n    1569 => 470.0,\n    1570 => 278.0,\n    1571 => 278.0,\n    1572 => 483.0,\n    1573 => 278.0,\n    1574 => 783.0,\n    1575 => 278.0,\n    1576 => 941.0,\n    1577 => 524.0,\n    1578 => 941.0,\n    1579 => 941.0,\n    1580 => 646.0,\n    1581 => 646.0,\n    1582 => 646.0,\n    1583 => 445.0,\n    1584 => 445.0,\n    1585 => 483.0,\n    1586 => 483.0,\n    1587 => 1221.0,\n    1588 => 1221.0,\n    1589 => 1209.0,\n    1590 => 1209.0,\n    1591 => 925.0,\n    1592 => 925.0,\n    1593 => 597.0,\n    1594 => 597.0,\n    1600 => 293.0,\n    1601 => 1037.0,\n    1602 => 776.0,\n    1603 => 824.0,\n    1604 => 727.0,\n    1605 => 619.0,\n    1606 => 734.0,\n    1607 => 524.0,\n    1608 => 483.0,\n    1609 => 783.0,\n    1610 => 783.0,\n    1611 => 0.0,\n    1612 => 0.0,\n    1613 => 0.0,\n    1614 => 0.0,\n    1615 => 0.0,\n    1616 => 0.0,\n    1617 => 0.0,\n    1618 => 0.0,\n    1619 => 0.0,\n    1620 => 0.0,\n    1621 => 0.0,\n    1623 => 0.0,\n    1626 => 500.0,\n    1632 => 537.0,\n    1633 => 537.0,\n    1634 => 537.0,\n    1635 => 537.0,\n    1636 => 537.0,\n    1637 => 537.0,\n    1638 => 537.0,\n    1639 => 537.0,\n    1640 => 537.0,\n    1641 => 537.0,\n    1642 => 537.0,\n    1643 => 325.0,\n    1644 => 318.0,\n    1645 => 545.0,\n    1646 => 941.0,\n    1647 => 776.0,\n    1648 => 0.0,\n    1652 => 292.0,\n    1657 => 941.0,\n    1658 => 941.0,\n    1659 => 941.0,\n    1660 => 941.0,\n    1661 => 941.0,\n    1662 => 941.0,\n    1663 => 941.0,\n    1664 => 941.0,\n    1665 => 646.0,\n    1666 => 646.0,\n    1667 => 646.0,\n    1668 => 646.0,\n    1669 => 646.0,\n    1670 => 646.0,\n    1671 => 646.0,\n    1672 => 445.0,\n    1673 => 445.0,\n    1674 => 445.0,\n    1675 => 445.0,\n    1676 => 445.0,\n    1677 => 445.0,\n    1678 => 445.0,\n    1679 => 445.0,\n    1680 => 445.0,\n    1681 => 483.0,\n    1682 => 483.0,\n    1683 => 498.0,\n    1684 => 530.0,\n    1685 => 610.0,\n    1686 => 530.0,\n    1687 => 483.0,\n    1688 => 483.0,\n    1689 => 483.0,\n    1690 => 1221.0,\n    1691 => 1221.0,\n    1692 => 1221.0,\n    1693 => 1209.0,\n    1694 => 1209.0,\n    1695 => 925.0,\n    1696 => 597.0,\n    1697 => 1037.0,\n    1698 => 1037.0,\n    1699 => 1037.0,\n    1700 => 1037.0,\n    1701 => 1037.0,\n    1702 => 1037.0,\n    1703 => 776.0,\n    1704 => 776.0,\n    1705 => 895.0,\n    1706 => 1054.0,\n    1707 => 895.0,\n    1708 => 824.0,\n    1709 => 824.0,\n    1710 => 824.0,\n    1711 => 895.0,\n    1712 => 895.0,\n    1713 => 895.0,\n    1714 => 895.0,\n    1715 => 895.0,\n    1716 => 895.0,\n    1717 => 727.0,\n    1718 => 727.0,\n    1719 => 727.0,\n    1720 => 727.0,\n    1721 => 734.0,\n    1722 => 734.0,\n    1723 => 734.0,\n    1724 => 734.0,\n    1725 => 734.0,\n    1726 => 698.0,\n    1727 => 646.0,\n    1734 => 483.0,\n    1735 => 483.0,\n    1736 => 483.0,\n    1739 => 483.0,\n    1740 => 783.0,\n    1742 => 783.0,\n    1744 => 783.0,\n    1749 => 524.0,\n    1776 => 537.0,\n    1777 => 537.0,\n    1778 => 537.0,\n    1779 => 537.0,\n    1780 => 537.0,\n    1781 => 537.0,\n    1782 => 537.0,\n    1783 => 537.0,\n    1784 => 537.0,\n    1785 => 537.0,\n    1984 => 636.0,\n    1985 => 636.0,\n    1986 => 636.0,\n    1987 => 636.0,\n    1988 => 636.0,\n    1989 => 636.0,\n    1990 => 636.0,\n    1991 => 636.0,\n    1992 => 636.0,\n    1993 => 636.0,\n    1994 => 278.0,\n    1995 => 571.0,\n    1996 => 424.0,\n    1997 => 592.0,\n    1998 => 654.0,\n    1999 => 654.0,\n    2000 => 594.0,\n    2001 => 654.0,\n    2002 => 829.0,\n    2003 => 438.0,\n    2004 => 438.0,\n    2005 => 559.0,\n    2006 => 612.0,\n    2007 => 350.0,\n    2008 => 959.0,\n    2009 => 473.0,\n    2010 => 783.0,\n    2011 => 654.0,\n    2012 => 625.0,\n    2013 => 734.0,\n    2014 => 530.0,\n    2015 => 724.0,\n    2016 => 473.0,\n    2017 => 625.0,\n    2018 => 594.0,\n    2019 => 530.0,\n    2020 => 530.0,\n    2021 => 522.0,\n    2022 => 594.0,\n    2023 => 594.0,\n    2027 => 0.0,\n    2028 => 0.0,\n    2029 => 0.0,\n    2030 => 0.0,\n    2031 => 0.0,\n    2032 => 0.0,\n    2033 => 0.0,\n    2034 => 0.0,\n    2035 => 0.0,\n    2036 => 313.0,\n    2037 => 313.0,\n    2040 => 560.0,\n    2041 => 560.0,\n    2042 => 361.0,\n    3647 => 636.0,\n    3713 => 670.0,\n    3714 => 684.0,\n    3716 => 688.0,\n    3719 => 482.0,\n    3720 => 628.0,\n    3722 => 684.0,\n    3725 => 688.0,\n    3732 => 669.0,\n    3733 => 642.0,\n    3734 => 645.0,\n    3735 => 655.0,\n    3737 => 659.0,\n    3738 => 625.0,\n    3739 => 625.0,\n    3740 => 745.0,\n    3741 => 767.0,\n    3742 => 687.0,\n    3743 => 687.0,\n    3745 => 702.0,\n    3746 => 688.0,\n    3747 => 684.0,\n    3749 => 649.0,\n    3751 => 632.0,\n    3754 => 703.0,\n    3755 => 819.0,\n    3757 => 633.0,\n    3758 => 684.0,\n    3759 => 788.0,\n    3760 => 632.0,\n    3761 => 0.0,\n    3762 => 539.0,\n    3763 => 539.0,\n    3764 => 0.0,\n    3765 => 0.0,\n    3766 => 0.0,\n    3767 => 0.0,\n    3768 => 0.0,\n    3769 => 0.0,\n    3771 => 0.0,\n    3772 => 0.0,\n    3773 => 663.0,\n    3776 => 375.0,\n    3777 => 657.0,\n    3778 => 460.0,\n    3779 => 547.0,\n    3780 => 491.0,\n    3782 => 674.0,\n    3784 => 0.0,\n    3785 => 0.0,\n    3786 => 0.0,\n    3787 => 0.0,\n    3788 => 0.0,\n    3789 => 0.0,\n    3792 => 636.0,\n    3793 => 641.0,\n    3794 => 641.0,\n    3795 => 670.0,\n    3796 => 625.0,\n    3797 => 625.0,\n    3798 => 703.0,\n    3799 => 670.0,\n    3800 => 674.0,\n    3801 => 677.0,\n    3804 => 1028.0,\n    3805 => 1028.0,\n    4256 => 874.0,\n    4257 => 733.0,\n    4258 => 679.0,\n    4259 => 834.0,\n    4260 => 615.0,\n    4261 => 768.0,\n    4262 => 753.0,\n    4263 => 914.0,\n    4264 => 453.0,\n    4265 => 620.0,\n    4266 => 843.0,\n    4267 => 882.0,\n    4268 => 625.0,\n    4269 => 854.0,\n    4270 => 781.0,\n    4271 => 629.0,\n    4272 => 912.0,\n    4273 => 621.0,\n    4274 => 620.0,\n    4275 => 854.0,\n    4276 => 866.0,\n    4277 => 724.0,\n    4278 => 630.0,\n    4279 => 621.0,\n    4280 => 625.0,\n    4281 => 620.0,\n    4282 => 818.0,\n    4283 => 874.0,\n    4284 => 615.0,\n    4285 => 623.0,\n    4286 => 625.0,\n    4287 => 725.0,\n    4288 => 844.0,\n    4289 => 596.0,\n    4290 => 688.0,\n    4291 => 596.0,\n    4292 => 594.0,\n    4293 => 738.0,\n    4304 => 508.0,\n    4305 => 518.0,\n    4306 => 581.0,\n    4307 => 818.0,\n    4308 => 508.0,\n    4309 => 513.0,\n    4310 => 500.0,\n    4311 => 801.0,\n    4312 => 518.0,\n    4313 => 510.0,\n    4314 => 1064.0,\n    4315 => 522.0,\n    4316 => 522.0,\n    4317 => 786.0,\n    4318 => 508.0,\n    4319 => 518.0,\n    4320 => 796.0,\n    4321 => 522.0,\n    4322 => 654.0,\n    4323 => 522.0,\n    4324 => 825.0,\n    4325 => 513.0,\n    4326 => 786.0,\n    4327 => 518.0,\n    4328 => 518.0,\n    4329 => 522.0,\n    4330 => 571.0,\n    4331 => 522.0,\n    4332 => 518.0,\n    4333 => 520.0,\n    4334 => 522.0,\n    4335 => 454.0,\n    4336 => 508.0,\n    4337 => 518.0,\n    4338 => 508.0,\n    4339 => 508.0,\n    4340 => 518.0,\n    4341 => 554.0,\n    4342 => 828.0,\n    4343 => 552.0,\n    4344 => 508.0,\n    4345 => 571.0,\n    4346 => 508.0,\n    4347 => 448.0,\n    4348 => 324.0,\n    5121 => 684.0,\n    5122 => 684.0,\n    5123 => 684.0,\n    5124 => 684.0,\n    5125 => 769.0,\n    5126 => 769.0,\n    5127 => 769.0,\n    5129 => 769.0,\n    5130 => 769.0,\n    5131 => 769.0,\n    5132 => 835.0,\n    5133 => 834.0,\n    5134 => 835.0,\n    5135 => 834.0,\n    5136 => 835.0,\n    5137 => 834.0,\n    5138 => 967.0,\n    5139 => 1007.0,\n    5140 => 967.0,\n    5141 => 1007.0,\n    5142 => 769.0,\n    5143 => 967.0,\n    5144 => 1007.0,\n    5145 => 967.0,\n    5146 => 1007.0,\n    5147 => 769.0,\n    5149 => 256.0,\n    5150 => 543.0,\n    5151 => 423.0,\n    5152 => 423.0,\n    5153 => 389.0,\n    5154 => 389.0,\n    5155 => 393.0,\n    5156 => 389.0,\n    5157 => 466.0,\n    5158 => 385.0,\n    5159 => 256.0,\n    5160 => 389.0,\n    5161 => 389.0,\n    5162 => 389.0,\n    5163 => 1090.0,\n    5164 => 909.0,\n    5165 => 953.0,\n    5166 => 1117.0,\n    5167 => 684.0,\n    5168 => 684.0,\n    5169 => 684.0,\n    5170 => 684.0,\n    5171 => 729.0,\n    5172 => 729.0,\n    5173 => 729.0,\n    5175 => 729.0,\n    5176 => 729.0,\n    5177 => 729.0,\n    5178 => 835.0,\n    5179 => 684.0,\n    5180 => 835.0,\n    5181 => 834.0,\n    5182 => 835.0,\n    5183 => 834.0,\n    5184 => 967.0,\n    5185 => 1007.0,\n    5186 => 967.0,\n    5187 => 1007.0,\n    5188 => 967.0,\n    5189 => 1007.0,\n    5190 => 967.0,\n    5191 => 1007.0,\n    5192 => 729.0,\n    5193 => 508.0,\n    5194 => 192.0,\n    5196 => 732.0,\n    5197 => 732.0,\n    5198 => 732.0,\n    5199 => 732.0,\n    5200 => 730.0,\n    5201 => 730.0,\n    5202 => 730.0,\n    5204 => 730.0,\n    5205 => 730.0,\n    5206 => 730.0,\n    5207 => 921.0,\n    5208 => 889.0,\n    5209 => 921.0,\n    5210 => 889.0,\n    5211 => 921.0,\n    5212 => 889.0,\n    5213 => 928.0,\n    5214 => 900.0,\n    5215 => 928.0,\n    5216 => 900.0,\n    5217 => 947.0,\n    5218 => 900.0,\n    5219 => 947.0,\n    5220 => 900.0,\n    5221 => 947.0,\n    5222 => 434.0,\n    5223 => 877.0,\n    5224 => 877.0,\n    5225 => 866.0,\n    5226 => 890.0,\n    5227 => 628.0,\n    5228 => 628.0,\n    5229 => 628.0,\n    5230 => 628.0,\n    5231 => 628.0,\n    5232 => 628.0,\n    5233 => 628.0,\n    5234 => 628.0,\n    5235 => 628.0,\n    5236 => 860.0,\n    5237 => 771.0,\n    5238 => 815.0,\n    5239 => 816.0,\n    5240 => 815.0,\n    5241 => 816.0,\n    5242 => 860.0,\n    5243 => 771.0,\n    5244 => 860.0,\n    5245 => 771.0,\n    5246 => 815.0,\n    5247 => 816.0,\n    5248 => 815.0,\n    5249 => 816.0,\n    5250 => 815.0,\n    5251 => 407.0,\n    5252 => 407.0,\n    5253 => 750.0,\n    5254 => 775.0,\n    5255 => 750.0,\n    5256 => 775.0,\n    5257 => 628.0,\n    5258 => 628.0,\n    5259 => 628.0,\n    5260 => 628.0,\n    5261 => 628.0,\n    5262 => 628.0,\n    5263 => 628.0,\n    5264 => 628.0,\n    5265 => 628.0,\n    5266 => 860.0,\n    5267 => 771.0,\n    5268 => 815.0,\n    5269 => 816.0,\n    5270 => 815.0,\n    5271 => 816.0,\n    5272 => 860.0,\n    5273 => 771.0,\n    5274 => 860.0,\n    5275 => 771.0,\n    5276 => 815.0,\n    5277 => 816.0,\n    5278 => 815.0,\n    5279 => 816.0,\n    5280 => 815.0,\n    5281 => 435.0,\n    5282 => 435.0,\n    5283 => 610.0,\n    5284 => 557.0,\n    5285 => 557.0,\n    5286 => 557.0,\n    5287 => 610.0,\n    5288 => 610.0,\n    5289 => 610.0,\n    5290 => 557.0,\n    5291 => 557.0,\n    5292 => 749.0,\n    5293 => 769.0,\n    5294 => 746.0,\n    5295 => 764.0,\n    5296 => 746.0,\n    5297 => 764.0,\n    5298 => 749.0,\n    5299 => 769.0,\n    5300 => 749.0,\n    5301 => 769.0,\n    5302 => 746.0,\n    5303 => 764.0,\n    5304 => 746.0,\n    5305 => 764.0,\n    5306 => 746.0,\n    5307 => 386.0,\n    5308 => 508.0,\n    5309 => 386.0,\n    5312 => 852.0,\n    5313 => 852.0,\n    5314 => 852.0,\n    5315 => 852.0,\n    5316 => 852.0,\n    5317 => 852.0,\n    5318 => 852.0,\n    5319 => 852.0,\n    5320 => 852.0,\n    5321 => 1069.0,\n    5322 => 1035.0,\n    5323 => 1059.0,\n    5324 => 852.0,\n    5325 => 1059.0,\n    5326 => 852.0,\n    5327 => 852.0,\n    5328 => 600.0,\n    5329 => 453.0,\n    5330 => 600.0,\n    5331 => 852.0,\n    5332 => 852.0,\n    5333 => 852.0,\n    5334 => 852.0,\n    5335 => 852.0,\n    5336 => 852.0,\n    5337 => 852.0,\n    5338 => 852.0,\n    5339 => 852.0,\n    5340 => 1069.0,\n    5341 => 1035.0,\n    5342 => 1059.0,\n    5343 => 1030.0,\n    5344 => 1059.0,\n    5345 => 1030.0,\n    5346 => 1069.0,\n    5347 => 1035.0,\n    5348 => 1069.0,\n    5349 => 1035.0,\n    5350 => 1083.0,\n    5351 => 1030.0,\n    5352 => 1083.0,\n    5353 => 1030.0,\n    5354 => 600.0,\n    5356 => 729.0,\n    5357 => 603.0,\n    5358 => 603.0,\n    5359 => 603.0,\n    5360 => 603.0,\n    5361 => 603.0,\n    5362 => 603.0,\n    5363 => 603.0,\n    5364 => 603.0,\n    5365 => 603.0,\n    5366 => 834.0,\n    5367 => 754.0,\n    5368 => 792.0,\n    5369 => 771.0,\n    5370 => 792.0,\n    5371 => 771.0,\n    5372 => 834.0,\n    5373 => 754.0,\n    5374 => 834.0,\n    5375 => 754.0,\n    5376 => 792.0,\n    5377 => 771.0,\n    5378 => 792.0,\n    5379 => 771.0,\n    5380 => 792.0,\n    5381 => 418.0,\n    5382 => 420.0,\n    5383 => 418.0,\n    5392 => 712.0,\n    5393 => 712.0,\n    5394 => 712.0,\n    5395 => 892.0,\n    5396 => 892.0,\n    5397 => 892.0,\n    5398 => 892.0,\n    5399 => 910.0,\n    5400 => 872.0,\n    5401 => 910.0,\n    5402 => 872.0,\n    5403 => 910.0,\n    5404 => 872.0,\n    5405 => 1140.0,\n    5406 => 1100.0,\n    5407 => 1140.0,\n    5408 => 1100.0,\n    5409 => 1140.0,\n    5410 => 1100.0,\n    5411 => 1140.0,\n    5412 => 1100.0,\n    5413 => 641.0,\n    5414 => 627.0,\n    5415 => 627.0,\n    5416 => 627.0,\n    5417 => 627.0,\n    5418 => 627.0,\n    5419 => 627.0,\n    5420 => 627.0,\n    5421 => 627.0,\n    5422 => 627.0,\n    5423 => 844.0,\n    5424 => 781.0,\n    5425 => 816.0,\n    5426 => 818.0,\n    5427 => 816.0,\n    5428 => 818.0,\n    5429 => 844.0,\n    5430 => 781.0,\n    5431 => 844.0,\n    5432 => 781.0,\n    5433 => 816.0,\n    5434 => 818.0,\n    5435 => 816.0,\n    5436 => 818.0,\n    5437 => 816.0,\n    5438 => 418.0,\n    5440 => 389.0,\n    5441 => 484.0,\n    5442 => 916.0,\n    5443 => 916.0,\n    5444 => 916.0,\n    5445 => 916.0,\n    5446 => 916.0,\n    5447 => 916.0,\n    5448 => 603.0,\n    5449 => 603.0,\n    5450 => 603.0,\n    5451 => 603.0,\n    5452 => 603.0,\n    5453 => 603.0,\n    5454 => 834.0,\n    5455 => 754.0,\n    5456 => 418.0,\n    5458 => 729.0,\n    5459 => 684.0,\n    5460 => 684.0,\n    5461 => 684.0,\n    5462 => 684.0,\n    5463 => 726.0,\n    5464 => 726.0,\n    5465 => 726.0,\n    5466 => 726.0,\n    5467 => 924.0,\n    5468 => 1007.0,\n    5469 => 508.0,\n    5470 => 732.0,\n    5471 => 732.0,\n    5472 => 732.0,\n    5473 => 732.0,\n    5474 => 732.0,\n    5475 => 732.0,\n    5476 => 730.0,\n    5477 => 730.0,\n    5478 => 730.0,\n    5479 => 730.0,\n    5480 => 947.0,\n    5481 => 900.0,\n    5482 => 508.0,\n    5492 => 831.0,\n    5493 => 831.0,\n    5494 => 831.0,\n    5495 => 831.0,\n    5496 => 831.0,\n    5497 => 831.0,\n    5498 => 831.0,\n    5499 => 563.0,\n    5500 => 752.0,\n    5501 => 484.0,\n    5502 => 1047.0,\n    5503 => 1047.0,\n    5504 => 1047.0,\n    5505 => 1047.0,\n    5506 => 1047.0,\n    5507 => 1047.0,\n    5508 => 1047.0,\n    5509 => 825.0,\n    5514 => 831.0,\n    5515 => 831.0,\n    5516 => 831.0,\n    5517 => 831.0,\n    5518 => 1259.0,\n    5519 => 1259.0,\n    5520 => 1259.0,\n    5521 => 1002.0,\n    5522 => 1002.0,\n    5523 => 1259.0,\n    5524 => 1259.0,\n    5525 => 700.0,\n    5526 => 1073.0,\n    5536 => 852.0,\n    5537 => 852.0,\n    5538 => 852.0,\n    5539 => 852.0,\n    5540 => 852.0,\n    5541 => 852.0,\n    5542 => 600.0,\n    5543 => 643.0,\n    5544 => 643.0,\n    5545 => 643.0,\n    5546 => 643.0,\n    5547 => 643.0,\n    5548 => 643.0,\n    5549 => 643.0,\n    5550 => 418.0,\n    5551 => 628.0,\n    5598 => 770.0,\n    5601 => 767.0,\n    5702 => 468.0,\n    5703 => 468.0,\n    5742 => 444.0,\n    5743 => 1047.0,\n    5744 => 1310.0,\n    5745 => 1632.0,\n    5746 => 1632.0,\n    5747 => 1375.0,\n    5748 => 1375.0,\n    5749 => 1632.0,\n    5750 => 1632.0,\n    5760 => 477.0,\n    5761 => 493.0,\n    5762 => 712.0,\n    5763 => 931.0,\n    5764 => 1150.0,\n    5765 => 1370.0,\n    5766 => 493.0,\n    5767 => 712.0,\n    5768 => 931.0,\n    5769 => 1150.0,\n    5770 => 1370.0,\n    5771 => 498.0,\n    5772 => 718.0,\n    5773 => 938.0,\n    5774 => 1159.0,\n    5775 => 1379.0,\n    5776 => 493.0,\n    5777 => 712.0,\n    5778 => 930.0,\n    5779 => 1149.0,\n    5780 => 1370.0,\n    5781 => 498.0,\n    5782 => 752.0,\n    5783 => 789.0,\n    5784 => 1205.0,\n    5785 => 1150.0,\n    5786 => 683.0,\n    5787 => 507.0,\n    5788 => 507.0,\n    7424 => 592.0,\n    7425 => 717.0,\n    7426 => 982.0,\n    7427 => 586.0,\n    7428 => 550.0,\n    7429 => 605.0,\n    7430 => 605.0,\n    7431 => 491.0,\n    7432 => 541.0,\n    7433 => 278.0,\n    7434 => 395.0,\n    7435 => 579.0,\n    7436 => 583.0,\n    7437 => 754.0,\n    7438 => 650.0,\n    7439 => 612.0,\n    7440 => 550.0,\n    7441 => 684.0,\n    7442 => 684.0,\n    7443 => 684.0,\n    7444 => 1023.0,\n    7446 => 612.0,\n    7447 => 612.0,\n    7448 => 524.0,\n    7449 => 602.0,\n    7450 => 602.0,\n    7451 => 583.0,\n    7452 => 574.0,\n    7453 => 737.0,\n    7454 => 948.0,\n    7455 => 638.0,\n    7456 => 592.0,\n    7457 => 818.0,\n    7458 => 525.0,\n    7459 => 526.0,\n    7462 => 583.0,\n    7463 => 592.0,\n    7464 => 564.0,\n    7465 => 524.0,\n    7466 => 590.0,\n    7467 => 639.0,\n    7468 => 431.0,\n    7469 => 613.0,\n    7470 => 432.0,\n    7472 => 485.0,\n    7473 => 398.0,\n    7474 => 398.0,\n    7475 => 488.0,\n    7476 => 474.0,\n    7477 => 186.0,\n    7478 => 186.0,\n    7479 => 413.0,\n    7480 => 351.0,\n    7481 => 543.0,\n    7482 => 471.0,\n    7483 => 471.0,\n    7484 => 496.0,\n    7485 => 439.0,\n    7486 => 380.0,\n    7487 => 438.0,\n    7488 => 385.0,\n    7489 => 461.0,\n    7490 => 623.0,\n    7491 => 392.0,\n    7492 => 392.0,\n    7493 => 405.0,\n    7494 => 648.0,\n    7495 => 428.0,\n    7496 => 405.0,\n    7497 => 417.0,\n    7498 => 417.0,\n    7499 => 360.0,\n    7500 => 359.0,\n    7501 => 405.0,\n    7502 => 179.0,\n    7503 => 426.0,\n    7504 => 623.0,\n    7505 => 409.0,\n    7506 => 414.0,\n    7507 => 370.0,\n    7508 => 414.0,\n    7509 => 414.0,\n    7510 => 428.0,\n    7511 => 295.0,\n    7512 => 405.0,\n    7513 => 470.0,\n    7514 => 623.0,\n    7515 => 417.0,\n    7517 => 402.0,\n    7518 => 373.0,\n    7519 => 385.0,\n    7520 => 416.0,\n    7521 => 364.0,\n    7522 => 179.0,\n    7523 => 259.0,\n    7524 => 405.0,\n    7525 => 417.0,\n    7526 => 402.0,\n    7527 => 373.0,\n    7528 => 412.0,\n    7529 => 416.0,\n    7530 => 364.0,\n    7543 => 635.0,\n    7544 => 474.0,\n    7547 => 372.0,\n    7549 => 667.0,\n    7557 => 278.0,\n    7579 => 405.0,\n    7580 => 370.0,\n    7581 => 370.0,\n    7582 => 414.0,\n    7583 => 360.0,\n    7584 => 296.0,\n    7585 => 233.0,\n    7586 => 405.0,\n    7587 => 405.0,\n    7588 => 261.0,\n    7589 => 250.0,\n    7590 => 261.0,\n    7591 => 261.0,\n    7592 => 234.0,\n    7593 => 250.0,\n    7594 => 235.0,\n    7595 => 376.0,\n    7596 => 623.0,\n    7597 => 623.0,\n    7598 => 411.0,\n    7599 => 479.0,\n    7600 => 409.0,\n    7601 => 414.0,\n    7602 => 414.0,\n    7603 => 360.0,\n    7604 => 287.0,\n    7605 => 295.0,\n    7606 => 508.0,\n    7607 => 418.0,\n    7608 => 361.0,\n    7609 => 406.0,\n    7610 => 417.0,\n    7611 => 366.0,\n    7612 => 437.0,\n    7613 => 366.0,\n    7614 => 392.0,\n    7615 => 414.0,\n    7620 => 0.0,\n    7621 => 0.0,\n    7622 => 0.0,\n    7623 => 0.0,\n    7624 => 0.0,\n    7625 => 0.0,\n    7680 => 684.0,\n    7681 => 613.0,\n    7682 => 686.0,\n    7683 => 635.0,\n    7684 => 686.0,\n    7685 => 635.0,\n    7686 => 686.0,\n    7687 => 635.0,\n    7688 => 698.0,\n    7689 => 550.0,\n    7690 => 770.0,\n    7691 => 635.0,\n    7692 => 770.0,\n    7693 => 635.0,\n    7694 => 770.0,\n    7695 => 635.0,\n    7696 => 770.0,\n    7697 => 635.0,\n    7698 => 770.0,\n    7699 => 635.0,\n    7700 => 632.0,\n    7701 => 615.0,\n    7702 => 632.0,\n    7703 => 615.0,\n    7704 => 632.0,\n    7705 => 615.0,\n    7706 => 632.0,\n    7707 => 615.0,\n    7708 => 632.0,\n    7709 => 615.0,\n    7710 => 575.0,\n    7711 => 352.0,\n    7712 => 775.0,\n    7713 => 635.0,\n    7714 => 752.0,\n    7715 => 634.0,\n    7716 => 752.0,\n    7717 => 634.0,\n    7718 => 752.0,\n    7719 => 634.0,\n    7720 => 752.0,\n    7721 => 634.0,\n    7722 => 752.0,\n    7723 => 634.0,\n    7724 => 295.0,\n    7725 => 278.0,\n    7726 => 295.0,\n    7727 => 278.0,\n    7728 => 656.0,\n    7729 => 579.0,\n    7730 => 656.0,\n    7731 => 579.0,\n    7732 => 656.0,\n    7733 => 579.0,\n    7734 => 557.0,\n    7735 => 288.0,\n    7736 => 557.0,\n    7737 => 288.0,\n    7738 => 557.0,\n    7739 => 278.0,\n    7740 => 557.0,\n    7741 => 278.0,\n    7742 => 863.0,\n    7743 => 974.0,\n    7744 => 863.0,\n    7745 => 974.0,\n    7746 => 863.0,\n    7747 => 974.0,\n    7748 => 748.0,\n    7749 => 634.0,\n    7750 => 748.0,\n    7751 => 634.0,\n    7752 => 748.0,\n    7753 => 634.0,\n    7754 => 748.0,\n    7755 => 634.0,\n    7756 => 787.0,\n    7757 => 612.0,\n    7758 => 787.0,\n    7759 => 612.0,\n    7760 => 787.0,\n    7761 => 612.0,\n    7762 => 787.0,\n    7763 => 612.0,\n    7764 => 603.0,\n    7765 => 635.0,\n    7766 => 603.0,\n    7767 => 635.0,\n    7768 => 695.0,\n    7769 => 411.0,\n    7770 => 695.0,\n    7771 => 411.0,\n    7772 => 695.0,\n    7773 => 411.0,\n    7774 => 695.0,\n    7775 => 411.0,\n    7776 => 635.0,\n    7777 => 521.0,\n    7778 => 635.0,\n    7779 => 521.0,\n    7780 => 635.0,\n    7781 => 521.0,\n    7782 => 635.0,\n    7783 => 521.0,\n    7784 => 635.0,\n    7785 => 521.0,\n    7786 => 611.0,\n    7787 => 392.0,\n    7788 => 611.0,\n    7789 => 392.0,\n    7790 => 611.0,\n    7791 => 392.0,\n    7792 => 611.0,\n    7793 => 392.0,\n    7794 => 732.0,\n    7795 => 634.0,\n    7796 => 732.0,\n    7797 => 634.0,\n    7798 => 732.0,\n    7799 => 634.0,\n    7800 => 732.0,\n    7801 => 634.0,\n    7802 => 732.0,\n    7803 => 634.0,\n    7804 => 684.0,\n    7805 => 592.0,\n    7806 => 684.0,\n    7807 => 592.0,\n    7808 => 989.0,\n    7809 => 818.0,\n    7810 => 989.0,\n    7811 => 818.0,\n    7812 => 989.0,\n    7813 => 818.0,\n    7814 => 989.0,\n    7815 => 818.0,\n    7816 => 989.0,\n    7817 => 818.0,\n    7818 => 685.0,\n    7819 => 592.0,\n    7820 => 685.0,\n    7821 => 592.0,\n    7822 => 611.0,\n    7823 => 592.0,\n    7824 => 685.0,\n    7825 => 525.0,\n    7826 => 685.0,\n    7827 => 525.0,\n    7828 => 685.0,\n    7829 => 525.0,\n    7830 => 634.0,\n    7831 => 392.0,\n    7832 => 818.0,\n    7833 => 592.0,\n    7834 => 613.0,\n    7835 => 352.0,\n    7836 => 352.0,\n    7837 => 352.0,\n    7838 => 769.0,\n    7839 => 612.0,\n    7840 => 684.0,\n    7841 => 613.0,\n    7842 => 684.0,\n    7843 => 613.0,\n    7844 => 684.0,\n    7845 => 613.0,\n    7846 => 684.0,\n    7847 => 613.0,\n    7848 => 684.0,\n    7849 => 613.0,\n    7850 => 684.0,\n    7851 => 613.0,\n    7852 => 684.0,\n    7853 => 613.0,\n    7854 => 684.0,\n    7855 => 613.0,\n    7856 => 684.0,\n    7857 => 613.0,\n    7858 => 684.0,\n    7859 => 613.0,\n    7860 => 684.0,\n    7861 => 613.0,\n    7862 => 684.0,\n    7863 => 613.0,\n    7864 => 632.0,\n    7865 => 615.0,\n    7866 => 632.0,\n    7867 => 615.0,\n    7868 => 632.0,\n    7869 => 615.0,\n    7870 => 632.0,\n    7871 => 615.0,\n    7872 => 632.0,\n    7873 => 615.0,\n    7874 => 632.0,\n    7875 => 615.0,\n    7876 => 632.0,\n    7877 => 615.0,\n    7878 => 632.0,\n    7879 => 615.0,\n    7880 => 295.0,\n    7881 => 278.0,\n    7882 => 295.0,\n    7883 => 278.0,\n    7884 => 787.0,\n    7885 => 612.0,\n    7886 => 787.0,\n    7887 => 612.0,\n    7888 => 787.0,\n    7889 => 612.0,\n    7890 => 787.0,\n    7891 => 612.0,\n    7892 => 787.0,\n    7893 => 612.0,\n    7894 => 787.0,\n    7895 => 612.0,\n    7896 => 787.0,\n    7897 => 612.0,\n    7898 => 913.0,\n    7899 => 612.0,\n    7900 => 913.0,\n    7901 => 612.0,\n    7902 => 913.0,\n    7903 => 612.0,\n    7904 => 913.0,\n    7905 => 612.0,\n    7906 => 913.0,\n    7907 => 612.0,\n    7908 => 732.0,\n    7909 => 634.0,\n    7910 => 732.0,\n    7911 => 634.0,\n    7912 => 858.0,\n    7913 => 634.0,\n    7914 => 858.0,\n    7915 => 634.0,\n    7916 => 858.0,\n    7917 => 634.0,\n    7918 => 858.0,\n    7919 => 634.0,\n    7920 => 858.0,\n    7921 => 634.0,\n    7922 => 611.0,\n    7923 => 592.0,\n    7924 => 611.0,\n    7925 => 592.0,\n    7926 => 611.0,\n    7927 => 592.0,\n    7928 => 611.0,\n    7929 => 592.0,\n    7930 => 769.0,\n    7931 => 477.0,\n    7936 => 659.0,\n    7937 => 659.0,\n    7938 => 659.0,\n    7939 => 659.0,\n    7940 => 659.0,\n    7941 => 659.0,\n    7942 => 659.0,\n    7943 => 659.0,\n    7944 => 684.0,\n    7945 => 684.0,\n    7946 => 877.0,\n    7947 => 877.0,\n    7948 => 769.0,\n    7949 => 801.0,\n    7950 => 708.0,\n    7951 => 743.0,\n    7952 => 541.0,\n    7953 => 541.0,\n    7954 => 541.0,\n    7955 => 541.0,\n    7956 => 541.0,\n    7957 => 541.0,\n    7960 => 711.0,\n    7961 => 711.0,\n    7962 => 966.0,\n    7963 => 975.0,\n    7964 => 898.0,\n    7965 => 928.0,\n    7968 => 634.0,\n    7969 => 634.0,\n    7970 => 634.0,\n    7971 => 634.0,\n    7972 => 634.0,\n    7973 => 634.0,\n    7974 => 634.0,\n    7975 => 634.0,\n    7976 => 837.0,\n    7977 => 835.0,\n    7978 => 1086.0,\n    7979 => 1089.0,\n    7980 => 1027.0,\n    7981 => 1051.0,\n    7982 => 934.0,\n    7983 => 947.0,\n    7984 => 338.0,\n    7985 => 338.0,\n    7986 => 338.0,\n    7987 => 338.0,\n    7988 => 338.0,\n    7989 => 338.0,\n    7990 => 338.0,\n    7991 => 338.0,\n    7992 => 380.0,\n    7993 => 374.0,\n    7994 => 635.0,\n    7995 => 635.0,\n    7996 => 570.0,\n    7997 => 600.0,\n    7998 => 489.0,\n    7999 => 493.0,\n    8000 => 612.0,\n    8001 => 612.0,\n    8002 => 612.0,\n    8003 => 612.0,\n    8004 => 612.0,\n    8005 => 612.0,\n    8008 => 804.0,\n    8009 => 848.0,\n    8010 => 1095.0,\n    8011 => 1100.0,\n    8012 => 938.0,\n    8013 => 970.0,\n    8016 => 579.0,\n    8017 => 579.0,\n    8018 => 579.0,\n    8019 => 579.0,\n    8020 => 579.0,\n    8021 => 579.0,\n    8022 => 579.0,\n    8023 => 579.0,\n    8025 => 784.0,\n    8027 => 998.0,\n    8029 => 1012.0,\n    8031 => 897.0,\n    8032 => 837.0,\n    8033 => 837.0,\n    8034 => 837.0,\n    8035 => 837.0,\n    8036 => 837.0,\n    8037 => 837.0,\n    8038 => 837.0,\n    8039 => 837.0,\n    8040 => 802.0,\n    8041 => 843.0,\n    8042 => 1089.0,\n    8043 => 1095.0,\n    8044 => 946.0,\n    8045 => 972.0,\n    8046 => 921.0,\n    8047 => 952.0,\n    8048 => 659.0,\n    8049 => 659.0,\n    8050 => 541.0,\n    8051 => 548.0,\n    8052 => 634.0,\n    8053 => 654.0,\n    8054 => 338.0,\n    8055 => 338.0,\n    8056 => 612.0,\n    8057 => 612.0,\n    8058 => 579.0,\n    8059 => 579.0,\n    8060 => 837.0,\n    8061 => 837.0,\n    8064 => 659.0,\n    8065 => 659.0,\n    8066 => 659.0,\n    8067 => 659.0,\n    8068 => 659.0,\n    8069 => 659.0,\n    8070 => 659.0,\n    8071 => 659.0,\n    8072 => 684.0,\n    8073 => 684.0,\n    8074 => 877.0,\n    8075 => 877.0,\n    8076 => 769.0,\n    8077 => 801.0,\n    8078 => 708.0,\n    8079 => 743.0,\n    8080 => 634.0,\n    8081 => 634.0,\n    8082 => 634.0,\n    8083 => 634.0,\n    8084 => 634.0,\n    8085 => 634.0,\n    8086 => 634.0,\n    8087 => 634.0,\n    8088 => 837.0,\n    8089 => 835.0,\n    8090 => 1086.0,\n    8091 => 1089.0,\n    8092 => 1027.0,\n    8093 => 1051.0,\n    8094 => 934.0,\n    8095 => 947.0,\n    8096 => 837.0,\n    8097 => 837.0,\n    8098 => 837.0,\n    8099 => 837.0,\n    8100 => 837.0,\n    8101 => 837.0,\n    8102 => 837.0,\n    8103 => 837.0,\n    8104 => 802.0,\n    8105 => 843.0,\n    8106 => 1089.0,\n    8107 => 1095.0,\n    8108 => 946.0,\n    8109 => 972.0,\n    8110 => 921.0,\n    8111 => 952.0,\n    8112 => 659.0,\n    8113 => 659.0,\n    8114 => 659.0,\n    8115 => 659.0,\n    8116 => 659.0,\n    8118 => 659.0,\n    8119 => 659.0,\n    8120 => 684.0,\n    8121 => 684.0,\n    8122 => 716.0,\n    8123 => 692.0,\n    8124 => 684.0,\n    8125 => 500.0,\n    8126 => 500.0,\n    8127 => 500.0,\n    8128 => 500.0,\n    8129 => 500.0,\n    8130 => 634.0,\n    8131 => 634.0,\n    8132 => 654.0,\n    8134 => 634.0,\n    8135 => 634.0,\n    8136 => 805.0,\n    8137 => 746.0,\n    8138 => 931.0,\n    8139 => 871.0,\n    8140 => 752.0,\n    8141 => 500.0,\n    8142 => 500.0,\n    8143 => 500.0,\n    8144 => 338.0,\n    8145 => 338.0,\n    8146 => 338.0,\n    8147 => 338.0,\n    8150 => 338.0,\n    8151 => 338.0,\n    8152 => 295.0,\n    8153 => 295.0,\n    8154 => 475.0,\n    8155 => 408.0,\n    8157 => 500.0,\n    8158 => 500.0,\n    8159 => 500.0,\n    8160 => 579.0,\n    8161 => 579.0,\n    8162 => 579.0,\n    8163 => 579.0,\n    8164 => 635.0,\n    8165 => 635.0,\n    8166 => 579.0,\n    8167 => 579.0,\n    8168 => 611.0,\n    8169 => 611.0,\n    8170 => 845.0,\n    8171 => 825.0,\n    8172 => 685.0,\n    8173 => 500.0,\n    8174 => 500.0,\n    8175 => 500.0,\n    8178 => 837.0,\n    8179 => 837.0,\n    8180 => 837.0,\n    8182 => 837.0,\n    8183 => 837.0,\n    8184 => 941.0,\n    8185 => 813.0,\n    8186 => 922.0,\n    8187 => 826.0,\n    8188 => 764.0,\n    8189 => 500.0,\n    8190 => 500.0,\n    8192 => 500.0,\n    8193 => 1000.0,\n    8194 => 500.0,\n    8195 => 1000.0,\n    8196 => 330.0,\n    8197 => 250.0,\n    8198 => 167.0,\n    8199 => 636.0,\n    8200 => 318.0,\n    8201 => 200.0,\n    8202 => 100.0,\n    8203 => 0.0,\n    8204 => 0.0,\n    8205 => 0.0,\n    8206 => 0.0,\n    8207 => 0.0,\n    8208 => 361.0,\n    8209 => 361.0,\n    8210 => 636.0,\n    8211 => 500.0,\n    8212 => 1000.0,\n    8213 => 1000.0,\n    8214 => 500.0,\n    8215 => 500.0,\n    8216 => 318.0,\n    8217 => 318.0,\n    8218 => 318.0,\n    8219 => 318.0,\n    8220 => 518.0,\n    8221 => 518.0,\n    8222 => 518.0,\n    8223 => 518.0,\n    8224 => 500.0,\n    8225 => 500.0,\n    8226 => 590.0,\n    8227 => 590.0,\n    8228 => 334.0,\n    8229 => 667.0,\n    8230 => 1000.0,\n    8231 => 318.0,\n    8232 => 0.0,\n    8233 => 0.0,\n    8234 => 0.0,\n    8235 => 0.0,\n    8236 => 0.0,\n    8237 => 0.0,\n    8238 => 0.0,\n    8239 => 200.0,\n    8240 => 1342.0,\n    8241 => 1735.0,\n    8242 => 227.0,\n    8243 => 374.0,\n    8244 => 520.0,\n    8245 => 227.0,\n    8246 => 374.0,\n    8247 => 520.0,\n    8248 => 339.0,\n    8249 => 400.0,\n    8250 => 400.0,\n    8251 => 838.0,\n    8252 => 485.0,\n    8253 => 531.0,\n    8254 => 500.0,\n    8255 => 804.0,\n    8256 => 804.0,\n    8257 => 250.0,\n    8258 => 1000.0,\n    8259 => 500.0,\n    8260 => 167.0,\n    8261 => 390.0,\n    8262 => 390.0,\n    8263 => 922.0,\n    8264 => 733.0,\n    8265 => 733.0,\n    8266 => 497.0,\n    8267 => 636.0,\n    8268 => 500.0,\n    8269 => 500.0,\n    8270 => 500.0,\n    8271 => 337.0,\n    8272 => 804.0,\n    8273 => 500.0,\n    8274 => 450.0,\n    8275 => 1000.0,\n    8276 => 804.0,\n    8277 => 838.0,\n    8278 => 586.0,\n    8279 => 663.0,\n    8280 => 838.0,\n    8281 => 838.0,\n    8282 => 318.0,\n    8283 => 797.0,\n    8284 => 838.0,\n    8285 => 318.0,\n    8286 => 318.0,\n    8287 => 222.0,\n    8288 => 0.0,\n    8289 => 0.0,\n    8290 => 0.0,\n    8291 => 0.0,\n    8292 => 0.0,\n    8298 => 0.0,\n    8299 => 0.0,\n    8300 => 0.0,\n    8301 => 0.0,\n    8302 => 0.0,\n    8303 => 0.0,\n    8304 => 401.0,\n    8305 => 179.0,\n    8308 => 401.0,\n    8309 => 401.0,\n    8310 => 401.0,\n    8311 => 401.0,\n    8312 => 401.0,\n    8313 => 401.0,\n    8314 => 528.0,\n    8315 => 528.0,\n    8316 => 528.0,\n    8317 => 246.0,\n    8318 => 246.0,\n    8319 => 398.0,\n    8320 => 401.0,\n    8321 => 401.0,\n    8322 => 401.0,\n    8323 => 401.0,\n    8324 => 401.0,\n    8325 => 401.0,\n    8326 => 401.0,\n    8327 => 401.0,\n    8328 => 401.0,\n    8329 => 401.0,\n    8330 => 528.0,\n    8331 => 528.0,\n    8332 => 528.0,\n    8333 => 246.0,\n    8334 => 246.0,\n    8336 => 392.0,\n    8337 => 417.0,\n    8338 => 414.0,\n    8339 => 444.0,\n    8340 => 417.0,\n    8341 => 404.0,\n    8342 => 426.0,\n    8343 => 166.0,\n    8344 => 623.0,\n    8345 => 398.0,\n    8346 => 428.0,\n    8347 => 373.0,\n    8348 => 295.0,\n    8352 => 877.0,\n    8353 => 636.0,\n    8354 => 636.0,\n    8355 => 636.0,\n    8356 => 636.0,\n    8357 => 974.0,\n    8358 => 636.0,\n    8359 => 1272.0,\n    8360 => 1074.0,\n    8361 => 989.0,\n    8362 => 784.0,\n    8363 => 636.0,\n    8364 => 636.0,\n    8365 => 636.0,\n    8366 => 636.0,\n    8367 => 1272.0,\n    8368 => 636.0,\n    8369 => 636.0,\n    8370 => 636.0,\n    8371 => 636.0,\n    8372 => 774.0,\n    8373 => 636.0,\n    8376 => 636.0,\n    8377 => 636.0,\n    8378 => 636.0,\n    8381 => 636.0,\n    8400 => 0.0,\n    8401 => 0.0,\n    8406 => 0.0,\n    8407 => 0.0,\n    8411 => 0.0,\n    8412 => 0.0,\n    8417 => 0.0,\n    8448 => 1019.0,\n    8449 => 1019.0,\n    8450 => 698.0,\n    8451 => 1123.0,\n    8452 => 642.0,\n    8453 => 1019.0,\n    8454 => 1067.0,\n    8455 => 614.0,\n    8456 => 698.0,\n    8457 => 952.0,\n    8459 => 988.0,\n    8460 => 754.0,\n    8461 => 850.0,\n    8462 => 634.0,\n    8463 => 634.0,\n    8464 => 470.0,\n    8465 => 697.0,\n    8466 => 720.0,\n    8467 => 413.0,\n    8468 => 818.0,\n    8469 => 801.0,\n    8470 => 1040.0,\n    8471 => 1000.0,\n    8472 => 697.0,\n    8473 => 701.0,\n    8474 => 787.0,\n    8475 => 798.0,\n    8476 => 814.0,\n    8477 => 792.0,\n    8478 => 896.0,\n    8479 => 684.0,\n    8480 => 1020.0,\n    8481 => 1074.0,\n    8482 => 1000.0,\n    8483 => 684.0,\n    8484 => 745.0,\n    8485 => 578.0,\n    8486 => 764.0,\n    8487 => 764.0,\n    8488 => 616.0,\n    8489 => 338.0,\n    8490 => 656.0,\n    8491 => 684.0,\n    8492 => 786.0,\n    8493 => 703.0,\n    8494 => 854.0,\n    8495 => 592.0,\n    8496 => 605.0,\n    8497 => 786.0,\n    8498 => 575.0,\n    8499 => 1069.0,\n    8500 => 462.0,\n    8501 => 745.0,\n    8502 => 674.0,\n    8503 => 466.0,\n    8504 => 645.0,\n    8505 => 380.0,\n    8506 => 926.0,\n    8507 => 1194.0,\n    8508 => 702.0,\n    8509 => 728.0,\n    8510 => 654.0,\n    8511 => 849.0,\n    8512 => 811.0,\n    8513 => 775.0,\n    8514 => 557.0,\n    8515 => 557.0,\n    8516 => 611.0,\n    8517 => 819.0,\n    8518 => 708.0,\n    8519 => 615.0,\n    8520 => 351.0,\n    8521 => 351.0,\n    8523 => 780.0,\n    8526 => 526.0,\n    8528 => 969.0,\n    8529 => 969.0,\n    8530 => 1370.0,\n    8531 => 969.0,\n    8532 => 969.0,\n    8533 => 969.0,\n    8534 => 969.0,\n    8535 => 969.0,\n    8536 => 969.0,\n    8537 => 969.0,\n    8538 => 969.0,\n    8539 => 969.0,\n    8540 => 969.0,\n    8541 => 969.0,\n    8542 => 969.0,\n    8543 => 568.0,\n    8544 => 295.0,\n    8545 => 492.0,\n    8546 => 689.0,\n    8547 => 923.0,\n    8548 => 684.0,\n    8549 => 922.0,\n    8550 => 1120.0,\n    8551 => 1317.0,\n    8552 => 917.0,\n    8553 => 685.0,\n    8554 => 933.0,\n    8555 => 1131.0,\n    8556 => 557.0,\n    8557 => 698.0,\n    8558 => 770.0,\n    8559 => 863.0,\n    8560 => 278.0,\n    8561 => 458.0,\n    8562 => 637.0,\n    8563 => 812.0,\n    8564 => 592.0,\n    8565 => 811.0,\n    8566 => 991.0,\n    8567 => 1170.0,\n    8568 => 819.0,\n    8569 => 592.0,\n    8570 => 822.0,\n    8571 => 1002.0,\n    8572 => 278.0,\n    8573 => 550.0,\n    8574 => 635.0,\n    8575 => 974.0,\n    8576 => 1245.0,\n    8577 => 770.0,\n    8578 => 1245.0,\n    8579 => 703.0,\n    8580 => 549.0,\n    8581 => 698.0,\n    8585 => 969.0,\n    8592 => 838.0,\n    8593 => 838.0,\n    8594 => 838.0,\n    8595 => 838.0,\n    8596 => 838.0,\n    8597 => 838.0,\n    8598 => 838.0,\n    8599 => 838.0,\n    8600 => 838.0,\n    8601 => 838.0,\n    8602 => 838.0,\n    8603 => 838.0,\n    8604 => 838.0,\n    8605 => 838.0,\n    8606 => 838.0,\n    8607 => 838.0,\n    8608 => 838.0,\n    8609 => 838.0,\n    8610 => 838.0,\n    8611 => 838.0,\n    8612 => 838.0,\n    8613 => 838.0,\n    8614 => 838.0,\n    8615 => 838.0,\n    8616 => 838.0,\n    8617 => 838.0,\n    8618 => 838.0,\n    8619 => 838.0,\n    8620 => 838.0,\n    8621 => 838.0,\n    8622 => 838.0,\n    8623 => 838.0,\n    8624 => 838.0,\n    8625 => 838.0,\n    8626 => 838.0,\n    8627 => 838.0,\n    8628 => 838.0,\n    8629 => 838.0,\n    8630 => 838.0,\n    8631 => 838.0,\n    8632 => 838.0,\n    8633 => 838.0,\n    8634 => 838.0,\n    8635 => 838.0,\n    8636 => 838.0,\n    8637 => 838.0,\n    8638 => 838.0,\n    8639 => 838.0,\n    8640 => 838.0,\n    8641 => 838.0,\n    8642 => 838.0,\n    8643 => 838.0,\n    8644 => 838.0,\n    8645 => 838.0,\n    8646 => 838.0,\n    8647 => 838.0,\n    8648 => 838.0,\n    8649 => 838.0,\n    8650 => 838.0,\n    8651 => 838.0,\n    8652 => 838.0,\n    8653 => 838.0,\n    8654 => 838.0,\n    8655 => 838.0,\n    8656 => 838.0,\n    8657 => 838.0,\n    8658 => 838.0,\n    8659 => 838.0,\n    8660 => 838.0,\n    8661 => 838.0,\n    8662 => 838.0,\n    8663 => 838.0,\n    8664 => 838.0,\n    8665 => 838.0,\n    8666 => 838.0,\n    8667 => 838.0,\n    8668 => 838.0,\n    8669 => 838.0,\n    8670 => 838.0,\n    8671 => 838.0,\n    8672 => 838.0,\n    8673 => 838.0,\n    8674 => 838.0,\n    8675 => 838.0,\n    8676 => 838.0,\n    8677 => 838.0,\n    8678 => 838.0,\n    8679 => 838.0,\n    8680 => 838.0,\n    8681 => 838.0,\n    8682 => 838.0,\n    8683 => 838.0,\n    8684 => 838.0,\n    8685 => 838.0,\n    8686 => 838.0,\n    8687 => 838.0,\n    8688 => 838.0,\n    8689 => 838.0,\n    8690 => 838.0,\n    8691 => 838.0,\n    8692 => 838.0,\n    8693 => 838.0,\n    8694 => 838.0,\n    8695 => 838.0,\n    8696 => 838.0,\n    8697 => 838.0,\n    8698 => 838.0,\n    8699 => 838.0,\n    8700 => 838.0,\n    8701 => 838.0,\n    8702 => 838.0,\n    8703 => 838.0,\n    8704 => 684.0,\n    8705 => 636.0,\n    8706 => 517.0,\n    8707 => 632.0,\n    8708 => 632.0,\n    8709 => 871.0,\n    8710 => 669.0,\n    8711 => 669.0,\n    8712 => 871.0,\n    8713 => 871.0,\n    8714 => 718.0,\n    8715 => 871.0,\n    8716 => 871.0,\n    8717 => 718.0,\n    8718 => 636.0,\n    8719 => 757.0,\n    8720 => 757.0,\n    8721 => 674.0,\n    8722 => 838.0,\n    8723 => 838.0,\n    8724 => 838.0,\n    8725 => 337.0,\n    8726 => 637.0,\n    8727 => 838.0,\n    8728 => 626.0,\n    8729 => 626.0,\n    8730 => 637.0,\n    8731 => 637.0,\n    8732 => 637.0,\n    8733 => 714.0,\n    8734 => 833.0,\n    8735 => 838.0,\n    8736 => 896.0,\n    8737 => 896.0,\n    8738 => 838.0,\n    8739 => 500.0,\n    8740 => 500.0,\n    8741 => 500.0,\n    8742 => 500.0,\n    8743 => 732.0,\n    8744 => 732.0,\n    8745 => 732.0,\n    8746 => 732.0,\n    8747 => 521.0,\n    8748 => 789.0,\n    8749 => 1057.0,\n    8750 => 521.0,\n    8751 => 789.0,\n    8752 => 1057.0,\n    8753 => 521.0,\n    8754 => 521.0,\n    8755 => 521.0,\n    8756 => 636.0,\n    8757 => 636.0,\n    8758 => 260.0,\n    8759 => 636.0,\n    8760 => 838.0,\n    8761 => 838.0,\n    8762 => 838.0,\n    8763 => 838.0,\n    8764 => 838.0,\n    8765 => 838.0,\n    8766 => 838.0,\n    8767 => 838.0,\n    8768 => 375.0,\n    8769 => 838.0,\n    8770 => 838.0,\n    8771 => 838.0,\n    8772 => 838.0,\n    8773 => 838.0,\n    8774 => 838.0,\n    8775 => 838.0,\n    8776 => 838.0,\n    8777 => 838.0,\n    8778 => 838.0,\n    8779 => 838.0,\n    8780 => 838.0,\n    8781 => 838.0,\n    8782 => 838.0,\n    8783 => 838.0,\n    8784 => 838.0,\n    8785 => 838.0,\n    8786 => 839.0,\n    8787 => 839.0,\n    8788 => 1000.0,\n    8789 => 1000.0,\n    8790 => 838.0,\n    8791 => 838.0,\n    8792 => 838.0,\n    8793 => 838.0,\n    8794 => 838.0,\n    8795 => 838.0,\n    8796 => 838.0,\n    8797 => 838.0,\n    8798 => 838.0,\n    8799 => 838.0,\n    8800 => 838.0,\n    8801 => 838.0,\n    8802 => 838.0,\n    8803 => 838.0,\n    8804 => 838.0,\n    8805 => 838.0,\n    8806 => 838.0,\n    8807 => 838.0,\n    8808 => 838.0,\n    8809 => 838.0,\n    8810 => 1047.0,\n    8811 => 1047.0,\n    8812 => 464.0,\n    8813 => 838.0,\n    8814 => 838.0,\n    8815 => 838.0,\n    8816 => 838.0,\n    8817 => 838.0,\n    8818 => 838.0,\n    8819 => 838.0,\n    8820 => 838.0,\n    8821 => 838.0,\n    8822 => 838.0,\n    8823 => 838.0,\n    8824 => 838.0,\n    8825 => 838.0,\n    8826 => 838.0,\n    8827 => 838.0,\n    8828 => 838.0,\n    8829 => 838.0,\n    8830 => 838.0,\n    8831 => 838.0,\n    8832 => 838.0,\n    8833 => 838.0,\n    8834 => 838.0,\n    8835 => 838.0,\n    8836 => 838.0,\n    8837 => 838.0,\n    8838 => 838.0,\n    8839 => 838.0,\n    8840 => 838.0,\n    8841 => 838.0,\n    8842 => 838.0,\n    8843 => 838.0,\n    8844 => 732.0,\n    8845 => 732.0,\n    8846 => 732.0,\n    8847 => 838.0,\n    8848 => 838.0,\n    8849 => 838.0,\n    8850 => 838.0,\n    8851 => 780.0,\n    8852 => 780.0,\n    8853 => 838.0,\n    8854 => 838.0,\n    8855 => 838.0,\n    8856 => 838.0,\n    8857 => 838.0,\n    8858 => 838.0,\n    8859 => 838.0,\n    8860 => 838.0,\n    8861 => 838.0,\n    8862 => 838.0,\n    8863 => 838.0,\n    8864 => 838.0,\n    8865 => 838.0,\n    8866 => 871.0,\n    8867 => 871.0,\n    8868 => 871.0,\n    8869 => 871.0,\n    8870 => 521.0,\n    8871 => 521.0,\n    8872 => 871.0,\n    8873 => 871.0,\n    8874 => 871.0,\n    8875 => 871.0,\n    8876 => 871.0,\n    8877 => 871.0,\n    8878 => 871.0,\n    8879 => 871.0,\n    8880 => 838.0,\n    8881 => 838.0,\n    8882 => 838.0,\n    8883 => 838.0,\n    8884 => 838.0,\n    8885 => 838.0,\n    8886 => 1000.0,\n    8887 => 1000.0,\n    8888 => 838.0,\n    8889 => 838.0,\n    8890 => 521.0,\n    8891 => 732.0,\n    8892 => 732.0,\n    8893 => 732.0,\n    8894 => 838.0,\n    8895 => 838.0,\n    8896 => 820.0,\n    8897 => 820.0,\n    8898 => 820.0,\n    8899 => 820.0,\n    8900 => 626.0,\n    8901 => 318.0,\n    8902 => 626.0,\n    8903 => 838.0,\n    8904 => 1000.0,\n    8905 => 1000.0,\n    8906 => 1000.0,\n    8907 => 1000.0,\n    8908 => 1000.0,\n    8909 => 838.0,\n    8910 => 732.0,\n    8911 => 732.0,\n    8912 => 838.0,\n    8913 => 838.0,\n    8914 => 838.0,\n    8915 => 838.0,\n    8916 => 838.0,\n    8917 => 838.0,\n    8918 => 838.0,\n    8919 => 838.0,\n    8920 => 1422.0,\n    8921 => 1422.0,\n    8922 => 838.0,\n    8923 => 838.0,\n    8924 => 838.0,\n    8925 => 838.0,\n    8926 => 838.0,\n    8927 => 838.0,\n    8928 => 838.0,\n    8929 => 838.0,\n    8930 => 838.0,\n    8931 => 838.0,\n    8932 => 838.0,\n    8933 => 838.0,\n    8934 => 838.0,\n    8935 => 838.0,\n    8936 => 838.0,\n    8937 => 838.0,\n    8938 => 838.0,\n    8939 => 838.0,\n    8940 => 838.0,\n    8941 => 838.0,\n    8942 => 1000.0,\n    8943 => 1000.0,\n    8944 => 1000.0,\n    8945 => 1000.0,\n    8946 => 1000.0,\n    8947 => 871.0,\n    8948 => 718.0,\n    8949 => 871.0,\n    8950 => 871.0,\n    8951 => 718.0,\n    8952 => 871.0,\n    8953 => 871.0,\n    8954 => 1000.0,\n    8955 => 871.0,\n    8956 => 718.0,\n    8957 => 871.0,\n    8958 => 718.0,\n    8959 => 871.0,\n    8960 => 602.0,\n    8961 => 602.0,\n    8962 => 635.0,\n    8963 => 838.0,\n    8964 => 838.0,\n    8965 => 838.0,\n    8966 => 838.0,\n    8967 => 488.0,\n    8968 => 390.0,\n    8969 => 390.0,\n    8970 => 390.0,\n    8971 => 390.0,\n    8972 => 809.0,\n    8973 => 809.0,\n    8974 => 809.0,\n    8975 => 809.0,\n    8976 => 838.0,\n    8977 => 513.0,\n    8984 => 1000.0,\n    8985 => 838.0,\n    8988 => 469.0,\n    8989 => 469.0,\n    8990 => 469.0,\n    8991 => 469.0,\n    8992 => 521.0,\n    8993 => 521.0,\n    8996 => 1152.0,\n    8997 => 1152.0,\n    8998 => 1414.0,\n    8999 => 1152.0,\n    9000 => 1443.0,\n    9003 => 1414.0,\n    9004 => 873.0,\n    9075 => 338.0,\n    9076 => 635.0,\n    9077 => 837.0,\n    9082 => 659.0,\n    9085 => 757.0,\n    9095 => 1152.0,\n    9108 => 873.0,\n    9115 => 500.0,\n    9116 => 500.0,\n    9117 => 500.0,\n    9118 => 500.0,\n    9119 => 500.0,\n    9120 => 500.0,\n    9121 => 500.0,\n    9122 => 500.0,\n    9123 => 500.0,\n    9124 => 500.0,\n    9125 => 500.0,\n    9126 => 500.0,\n    9127 => 750.0,\n    9128 => 750.0,\n    9129 => 750.0,\n    9130 => 750.0,\n    9131 => 750.0,\n    9132 => 750.0,\n    9133 => 750.0,\n    9134 => 521.0,\n    9166 => 838.0,\n    9167 => 945.0,\n    9187 => 873.0,\n    9189 => 769.0,\n    9192 => 636.0,\n    9250 => 635.0,\n    9251 => 635.0,\n    9312 => 896.0,\n    9313 => 896.0,\n    9314 => 896.0,\n    9315 => 896.0,\n    9316 => 896.0,\n    9317 => 896.0,\n    9318 => 896.0,\n    9319 => 896.0,\n    9320 => 896.0,\n    9321 => 896.0,\n    9472 => 602.0,\n    9473 => 602.0,\n    9474 => 602.0,\n    9475 => 602.0,\n    9476 => 602.0,\n    9477 => 602.0,\n    9478 => 602.0,\n    9479 => 602.0,\n    9480 => 602.0,\n    9481 => 602.0,\n    9482 => 602.0,\n    9483 => 602.0,\n    9484 => 602.0,\n    9485 => 602.0,\n    9486 => 602.0,\n    9487 => 602.0,\n    9488 => 602.0,\n    9489 => 602.0,\n    9490 => 602.0,\n    9491 => 602.0,\n    9492 => 602.0,\n    9493 => 602.0,\n    9494 => 602.0,\n    9495 => 602.0,\n    9496 => 602.0,\n    9497 => 602.0,\n    9498 => 602.0,\n    9499 => 602.0,\n    9500 => 602.0,\n    9501 => 602.0,\n    9502 => 602.0,\n    9503 => 602.0,\n    9504 => 602.0,\n    9505 => 602.0,\n    9506 => 602.0,\n    9507 => 602.0,\n    9508 => 602.0,\n    9509 => 602.0,\n    9510 => 602.0,\n    9511 => 602.0,\n    9512 => 602.0,\n    9513 => 602.0,\n    9514 => 602.0,\n    9515 => 602.0,\n    9516 => 602.0,\n    9517 => 602.0,\n    9518 => 602.0,\n    9519 => 602.0,\n    9520 => 602.0,\n    9521 => 602.0,\n    9522 => 602.0,\n    9523 => 602.0,\n    9524 => 602.0,\n    9525 => 602.0,\n    9526 => 602.0,\n    9527 => 602.0,\n    9528 => 602.0,\n    9529 => 602.0,\n    9530 => 602.0,\n    9531 => 602.0,\n    9532 => 602.0,\n    9533 => 602.0,\n    9534 => 602.0,\n    9535 => 602.0,\n    9536 => 602.0,\n    9537 => 602.0,\n    9538 => 602.0,\n    9539 => 602.0,\n    9540 => 602.0,\n    9541 => 602.0,\n    9542 => 602.0,\n    9543 => 602.0,\n    9544 => 602.0,\n    9545 => 602.0,\n    9546 => 602.0,\n    9547 => 602.0,\n    9548 => 602.0,\n    9549 => 602.0,\n    9550 => 602.0,\n    9551 => 602.0,\n    9552 => 602.0,\n    9553 => 602.0,\n    9554 => 602.0,\n    9555 => 602.0,\n    9556 => 602.0,\n    9557 => 602.0,\n    9558 => 602.0,\n    9559 => 602.0,\n    9560 => 602.0,\n    9561 => 602.0,\n    9562 => 602.0,\n    9563 => 602.0,\n    9564 => 602.0,\n    9565 => 602.0,\n    9566 => 602.0,\n    9567 => 602.0,\n    9568 => 602.0,\n    9569 => 602.0,\n    9570 => 602.0,\n    9571 => 602.0,\n    9572 => 602.0,\n    9573 => 602.0,\n    9574 => 602.0,\n    9575 => 602.0,\n    9576 => 602.0,\n    9577 => 602.0,\n    9578 => 602.0,\n    9579 => 602.0,\n    9580 => 602.0,\n    9581 => 602.0,\n    9582 => 602.0,\n    9583 => 602.0,\n    9584 => 602.0,\n    9585 => 602.0,\n    9586 => 602.0,\n    9587 => 602.0,\n    9588 => 602.0,\n    9589 => 602.0,\n    9590 => 602.0,\n    9591 => 602.0,\n    9592 => 602.0,\n    9593 => 602.0,\n    9594 => 602.0,\n    9595 => 602.0,\n    9596 => 602.0,\n    9597 => 602.0,\n    9598 => 602.0,\n    9599 => 602.0,\n    9600 => 769.0,\n    9601 => 769.0,\n    9602 => 769.0,\n    9603 => 769.0,\n    9604 => 769.0,\n    9605 => 769.0,\n    9606 => 769.0,\n    9607 => 769.0,\n    9608 => 769.0,\n    9609 => 769.0,\n    9610 => 769.0,\n    9611 => 769.0,\n    9612 => 769.0,\n    9613 => 769.0,\n    9614 => 769.0,\n    9615 => 769.0,\n    9616 => 769.0,\n    9617 => 769.0,\n    9618 => 769.0,\n    9619 => 769.0,\n    9620 => 769.0,\n    9621 => 769.0,\n    9622 => 769.0,\n    9623 => 769.0,\n    9624 => 769.0,\n    9625 => 769.0,\n    9626 => 769.0,\n    9627 => 769.0,\n    9628 => 769.0,\n    9629 => 769.0,\n    9630 => 769.0,\n    9631 => 769.0,\n    9632 => 945.0,\n    9633 => 945.0,\n    9634 => 945.0,\n    9635 => 945.0,\n    9636 => 945.0,\n    9637 => 945.0,\n    9638 => 945.0,\n    9639 => 945.0,\n    9640 => 945.0,\n    9641 => 945.0,\n    9642 => 678.0,\n    9643 => 678.0,\n    9644 => 945.0,\n    9645 => 945.0,\n    9646 => 550.0,\n    9647 => 550.0,\n    9648 => 769.0,\n    9649 => 769.0,\n    9650 => 769.0,\n    9651 => 769.0,\n    9652 => 502.0,\n    9653 => 502.0,\n    9654 => 769.0,\n    9655 => 769.0,\n    9656 => 502.0,\n    9657 => 502.0,\n    9658 => 769.0,\n    9659 => 769.0,\n    9660 => 769.0,\n    9661 => 769.0,\n    9662 => 502.0,\n    9663 => 502.0,\n    9664 => 769.0,\n    9665 => 769.0,\n    9666 => 502.0,\n    9667 => 502.0,\n    9668 => 769.0,\n    9669 => 769.0,\n    9670 => 769.0,\n    9671 => 769.0,\n    9672 => 769.0,\n    9673 => 873.0,\n    9674 => 494.0,\n    9675 => 873.0,\n    9676 => 873.0,\n    9677 => 873.0,\n    9678 => 873.0,\n    9679 => 873.0,\n    9680 => 873.0,\n    9681 => 873.0,\n    9682 => 873.0,\n    9683 => 873.0,\n    9684 => 873.0,\n    9685 => 873.0,\n    9686 => 527.0,\n    9687 => 527.0,\n    9688 => 791.0,\n    9689 => 970.0,\n    9690 => 970.0,\n    9691 => 970.0,\n    9692 => 387.0,\n    9693 => 387.0,\n    9694 => 387.0,\n    9695 => 387.0,\n    9696 => 873.0,\n    9697 => 873.0,\n    9698 => 769.0,\n    9699 => 769.0,\n    9700 => 769.0,\n    9701 => 769.0,\n    9702 => 590.0,\n    9703 => 945.0,\n    9704 => 945.0,\n    9705 => 945.0,\n    9706 => 945.0,\n    9707 => 945.0,\n    9708 => 769.0,\n    9709 => 769.0,\n    9710 => 769.0,\n    9711 => 1119.0,\n    9712 => 945.0,\n    9713 => 945.0,\n    9714 => 945.0,\n    9715 => 945.0,\n    9716 => 873.0,\n    9717 => 873.0,\n    9718 => 873.0,\n    9719 => 873.0,\n    9720 => 769.0,\n    9721 => 769.0,\n    9722 => 769.0,\n    9723 => 830.0,\n    9724 => 830.0,\n    9725 => 732.0,\n    9726 => 732.0,\n    9727 => 769.0,\n    9728 => 896.0,\n    9729 => 1000.0,\n    9730 => 896.0,\n    9731 => 896.0,\n    9732 => 896.0,\n    9733 => 896.0,\n    9734 => 896.0,\n    9735 => 573.0,\n    9736 => 896.0,\n    9737 => 896.0,\n    9738 => 888.0,\n    9739 => 888.0,\n    9740 => 671.0,\n    9741 => 1013.0,\n    9742 => 1246.0,\n    9743 => 1250.0,\n    9744 => 896.0,\n    9745 => 896.0,\n    9746 => 896.0,\n    9747 => 532.0,\n    9748 => 896.0,\n    9749 => 896.0,\n    9750 => 896.0,\n    9751 => 896.0,\n    9752 => 896.0,\n    9753 => 896.0,\n    9754 => 896.0,\n    9755 => 896.0,\n    9756 => 896.0,\n    9757 => 609.0,\n    9758 => 896.0,\n    9759 => 609.0,\n    9760 => 896.0,\n    9761 => 896.0,\n    9762 => 896.0,\n    9763 => 896.0,\n    9764 => 669.0,\n    9765 => 746.0,\n    9766 => 649.0,\n    9767 => 784.0,\n    9768 => 545.0,\n    9769 => 896.0,\n    9770 => 896.0,\n    9771 => 896.0,\n    9772 => 710.0,\n    9773 => 896.0,\n    9774 => 896.0,\n    9775 => 896.0,\n    9776 => 896.0,\n    9777 => 896.0,\n    9778 => 896.0,\n    9779 => 896.0,\n    9780 => 896.0,\n    9781 => 896.0,\n    9782 => 896.0,\n    9783 => 896.0,\n    9784 => 896.0,\n    9785 => 1042.0,\n    9786 => 1042.0,\n    9787 => 1042.0,\n    9788 => 896.0,\n    9789 => 896.0,\n    9790 => 896.0,\n    9791 => 614.0,\n    9792 => 732.0,\n    9793 => 732.0,\n    9794 => 896.0,\n    9795 => 896.0,\n    9796 => 896.0,\n    9797 => 896.0,\n    9798 => 896.0,\n    9799 => 896.0,\n    9800 => 896.0,\n    9801 => 896.0,\n    9802 => 896.0,\n    9803 => 896.0,\n    9804 => 896.0,\n    9805 => 896.0,\n    9806 => 896.0,\n    9807 => 896.0,\n    9808 => 896.0,\n    9809 => 896.0,\n    9810 => 896.0,\n    9811 => 896.0,\n    9812 => 896.0,\n    9813 => 896.0,\n    9814 => 896.0,\n    9815 => 896.0,\n    9816 => 896.0,\n    9817 => 896.0,\n    9818 => 896.0,\n    9819 => 896.0,\n    9820 => 896.0,\n    9821 => 896.0,\n    9822 => 896.0,\n    9823 => 896.0,\n    9824 => 896.0,\n    9825 => 896.0,\n    9826 => 896.0,\n    9827 => 896.0,\n    9828 => 896.0,\n    9829 => 896.0,\n    9830 => 896.0,\n    9831 => 896.0,\n    9832 => 896.0,\n    9833 => 472.0,\n    9834 => 638.0,\n    9835 => 896.0,\n    9836 => 896.0,\n    9837 => 472.0,\n    9838 => 357.0,\n    9839 => 484.0,\n    9840 => 748.0,\n    9841 => 766.0,\n    9842 => 896.0,\n    9843 => 896.0,\n    9844 => 896.0,\n    9845 => 896.0,\n    9846 => 896.0,\n    9847 => 896.0,\n    9848 => 896.0,\n    9849 => 896.0,\n    9850 => 896.0,\n    9851 => 896.0,\n    9852 => 896.0,\n    9853 => 896.0,\n    9854 => 896.0,\n    9855 => 896.0,\n    9856 => 869.0,\n    9857 => 869.0,\n    9858 => 869.0,\n    9859 => 869.0,\n    9860 => 869.0,\n    9861 => 869.0,\n    9862 => 896.0,\n    9863 => 896.0,\n    9864 => 896.0,\n    9865 => 896.0,\n    9866 => 896.0,\n    9867 => 896.0,\n    9868 => 896.0,\n    9869 => 896.0,\n    9870 => 896.0,\n    9871 => 896.0,\n    9872 => 896.0,\n    9873 => 896.0,\n    9874 => 896.0,\n    9875 => 896.0,\n    9876 => 896.0,\n    9877 => 541.0,\n    9878 => 896.0,\n    9879 => 896.0,\n    9880 => 896.0,\n    9881 => 896.0,\n    9882 => 896.0,\n    9883 => 896.0,\n    9884 => 896.0,\n    9886 => 896.0,\n    9887 => 896.0,\n    9888 => 896.0,\n    9889 => 702.0,\n    9890 => 1004.0,\n    9891 => 1089.0,\n    9892 => 1175.0,\n    9893 => 903.0,\n    9894 => 838.0,\n    9895 => 838.0,\n    9896 => 838.0,\n    9897 => 838.0,\n    9898 => 838.0,\n    9899 => 838.0,\n    9900 => 838.0,\n    9901 => 838.0,\n    9902 => 838.0,\n    9903 => 838.0,\n    9904 => 844.0,\n    9905 => 838.0,\n    9906 => 732.0,\n    9907 => 732.0,\n    9908 => 732.0,\n    9909 => 732.0,\n    9910 => 850.0,\n    9911 => 732.0,\n    9912 => 732.0,\n    9920 => 838.0,\n    9921 => 838.0,\n    9922 => 838.0,\n    9923 => 838.0,\n    9954 => 732.0,\n    9985 => 838.0,\n    9986 => 838.0,\n    9987 => 838.0,\n    9988 => 838.0,\n    9990 => 838.0,\n    9991 => 838.0,\n    9992 => 838.0,\n    9993 => 838.0,\n    9996 => 838.0,\n    9997 => 838.0,\n    9998 => 838.0,\n    9999 => 838.0,\n    10000 => 838.0,\n    10001 => 838.0,\n    10002 => 838.0,\n    10003 => 838.0,\n    10004 => 838.0,\n    10005 => 838.0,\n    10006 => 838.0,\n    10007 => 838.0,\n    10008 => 838.0,\n    10009 => 838.0,\n    10010 => 838.0,\n    10011 => 838.0,\n    10012 => 838.0,\n    10013 => 838.0,\n    10014 => 838.0,\n    10015 => 838.0,\n    10016 => 838.0,\n    10017 => 838.0,\n    10018 => 838.0,\n    10019 => 838.0,\n    10020 => 838.0,\n    10021 => 838.0,\n    10022 => 838.0,\n    10023 => 838.0,\n    10025 => 838.0,\n    10026 => 838.0,\n    10027 => 838.0,\n    10028 => 838.0,\n    10029 => 838.0,\n    10030 => 838.0,\n    10031 => 838.0,\n    10032 => 838.0,\n    10033 => 838.0,\n    10034 => 838.0,\n    10035 => 838.0,\n    10036 => 838.0,\n    10037 => 838.0,\n    10038 => 838.0,\n    10039 => 838.0,\n    10040 => 838.0,\n    10041 => 838.0,\n    10042 => 838.0,\n    10043 => 838.0,\n    10044 => 838.0,\n    10045 => 838.0,\n    10046 => 838.0,\n    10047 => 838.0,\n    10048 => 838.0,\n    10049 => 838.0,\n    10050 => 838.0,\n    10051 => 838.0,\n    10052 => 838.0,\n    10053 => 838.0,\n    10054 => 838.0,\n    10055 => 838.0,\n    10056 => 838.0,\n    10057 => 838.0,\n    10058 => 838.0,\n    10059 => 838.0,\n    10061 => 896.0,\n    10063 => 896.0,\n    10064 => 896.0,\n    10065 => 896.0,\n    10066 => 896.0,\n    10070 => 896.0,\n    10072 => 838.0,\n    10073 => 838.0,\n    10074 => 838.0,\n    10075 => 322.0,\n    10076 => 322.0,\n    10077 => 538.0,\n    10078 => 538.0,\n    10081 => 838.0,\n    10082 => 838.0,\n    10083 => 838.0,\n    10084 => 838.0,\n    10085 => 838.0,\n    10086 => 838.0,\n    10087 => 838.0,\n    10088 => 838.0,\n    10089 => 838.0,\n    10090 => 838.0,\n    10091 => 838.0,\n    10092 => 838.0,\n    10093 => 838.0,\n    10094 => 838.0,\n    10095 => 838.0,\n    10096 => 838.0,\n    10097 => 838.0,\n    10098 => 838.0,\n    10099 => 838.0,\n    10100 => 838.0,\n    10101 => 838.0,\n    10102 => 896.0,\n    10103 => 896.0,\n    10104 => 896.0,\n    10105 => 896.0,\n    10106 => 896.0,\n    10107 => 896.0,\n    10108 => 896.0,\n    10109 => 896.0,\n    10110 => 896.0,\n    10111 => 896.0,\n    10112 => 838.0,\n    10113 => 838.0,\n    10114 => 838.0,\n    10115 => 838.0,\n    10116 => 838.0,\n    10117 => 838.0,\n    10118 => 838.0,\n    10119 => 838.0,\n    10120 => 838.0,\n    10121 => 838.0,\n    10122 => 838.0,\n    10123 => 838.0,\n    10124 => 838.0,\n    10125 => 838.0,\n    10126 => 838.0,\n    10127 => 838.0,\n    10128 => 838.0,\n    10129 => 838.0,\n    10130 => 838.0,\n    10131 => 838.0,\n    10132 => 838.0,\n    10136 => 838.0,\n    10137 => 838.0,\n    10138 => 838.0,\n    10139 => 838.0,\n    10140 => 838.0,\n    10141 => 838.0,\n    10142 => 838.0,\n    10143 => 838.0,\n    10144 => 838.0,\n    10145 => 838.0,\n    10146 => 838.0,\n    10147 => 838.0,\n    10148 => 838.0,\n    10149 => 838.0,\n    10150 => 838.0,\n    10151 => 838.0,\n    10152 => 838.0,\n    10153 => 838.0,\n    10154 => 838.0,\n    10155 => 838.0,\n    10156 => 838.0,\n    10157 => 838.0,\n    10158 => 838.0,\n    10159 => 838.0,\n    10161 => 838.0,\n    10162 => 838.0,\n    10163 => 838.0,\n    10164 => 838.0,\n    10165 => 838.0,\n    10166 => 838.0,\n    10167 => 838.0,\n    10168 => 838.0,\n    10169 => 838.0,\n    10170 => 838.0,\n    10171 => 838.0,\n    10172 => 838.0,\n    10173 => 838.0,\n    10174 => 838.0,\n    10181 => 390.0,\n    10182 => 390.0,\n    10208 => 494.0,\n    10214 => 495.0,\n    10215 => 495.0,\n    10216 => 390.0,\n    10217 => 390.0,\n    10218 => 556.0,\n    10219 => 556.0,\n    10224 => 838.0,\n    10225 => 838.0,\n    10226 => 838.0,\n    10227 => 838.0,\n    10228 => 1157.0,\n    10229 => 1434.0,\n    10230 => 1434.0,\n    10231 => 1434.0,\n    10232 => 1434.0,\n    10233 => 1434.0,\n    10234 => 1434.0,\n    10235 => 1434.0,\n    10236 => 1434.0,\n    10237 => 1434.0,\n    10238 => 1434.0,\n    10239 => 1434.0,\n    10240 => 732.0,\n    10241 => 732.0,\n    10242 => 732.0,\n    10243 => 732.0,\n    10244 => 732.0,\n    10245 => 732.0,\n    10246 => 732.0,\n    10247 => 732.0,\n    10248 => 732.0,\n    10249 => 732.0,\n    10250 => 732.0,\n    10251 => 732.0,\n    10252 => 732.0,\n    10253 => 732.0,\n    10254 => 732.0,\n    10255 => 732.0,\n    10256 => 732.0,\n    10257 => 732.0,\n    10258 => 732.0,\n    10259 => 732.0,\n    10260 => 732.0,\n    10261 => 732.0,\n    10262 => 732.0,\n    10263 => 732.0,\n    10264 => 732.0,\n    10265 => 732.0,\n    10266 => 732.0,\n    10267 => 732.0,\n    10268 => 732.0,\n    10269 => 732.0,\n    10270 => 732.0,\n    10271 => 732.0,\n    10272 => 732.0,\n    10273 => 732.0,\n    10274 => 732.0,\n    10275 => 732.0,\n    10276 => 732.0,\n    10277 => 732.0,\n    10278 => 732.0,\n    10279 => 732.0,\n    10280 => 732.0,\n    10281 => 732.0,\n    10282 => 732.0,\n    10283 => 732.0,\n    10284 => 732.0,\n    10285 => 732.0,\n    10286 => 732.0,\n    10287 => 732.0,\n    10288 => 732.0,\n    10289 => 732.0,\n    10290 => 732.0,\n    10291 => 732.0,\n    10292 => 732.0,\n    10293 => 732.0,\n    10294 => 732.0,\n    10295 => 732.0,\n    10296 => 732.0,\n    10297 => 732.0,\n    10298 => 732.0,\n    10299 => 732.0,\n    10300 => 732.0,\n    10301 => 732.0,\n    10302 => 732.0,\n    10303 => 732.0,\n    10304 => 732.0,\n    10305 => 732.0,\n    10306 => 732.0,\n    10307 => 732.0,\n    10308 => 732.0,\n    10309 => 732.0,\n    10310 => 732.0,\n    10311 => 732.0,\n    10312 => 732.0,\n    10313 => 732.0,\n    10314 => 732.0,\n    10315 => 732.0,\n    10316 => 732.0,\n    10317 => 732.0,\n    10318 => 732.0,\n    10319 => 732.0,\n    10320 => 732.0,\n    10321 => 732.0,\n    10322 => 732.0,\n    10323 => 732.0,\n    10324 => 732.0,\n    10325 => 732.0,\n    10326 => 732.0,\n    10327 => 732.0,\n    10328 => 732.0,\n    10329 => 732.0,\n    10330 => 732.0,\n    10331 => 732.0,\n    10332 => 732.0,\n    10333 => 732.0,\n    10334 => 732.0,\n    10335 => 732.0,\n    10336 => 732.0,\n    10337 => 732.0,\n    10338 => 732.0,\n    10339 => 732.0,\n    10340 => 732.0,\n    10341 => 732.0,\n    10342 => 732.0,\n    10343 => 732.0,\n    10344 => 732.0,\n    10345 => 732.0,\n    10346 => 732.0,\n    10347 => 732.0,\n    10348 => 732.0,\n    10349 => 732.0,\n    10350 => 732.0,\n    10351 => 732.0,\n    10352 => 732.0,\n    10353 => 732.0,\n    10354 => 732.0,\n    10355 => 732.0,\n    10356 => 732.0,\n    10357 => 732.0,\n    10358 => 732.0,\n    10359 => 732.0,\n    10360 => 732.0,\n    10361 => 732.0,\n    10362 => 732.0,\n    10363 => 732.0,\n    10364 => 732.0,\n    10365 => 732.0,\n    10366 => 732.0,\n    10367 => 732.0,\n    10368 => 732.0,\n    10369 => 732.0,\n    10370 => 732.0,\n    10371 => 732.0,\n    10372 => 732.0,\n    10373 => 732.0,\n    10374 => 732.0,\n    10375 => 732.0,\n    10376 => 732.0,\n    10377 => 732.0,\n    10378 => 732.0,\n    10379 => 732.0,\n    10380 => 732.0,\n    10381 => 732.0,\n    10382 => 732.0,\n    10383 => 732.0,\n    10384 => 732.0,\n    10385 => 732.0,\n    10386 => 732.0,\n    10387 => 732.0,\n    10388 => 732.0,\n    10389 => 732.0,\n    10390 => 732.0,\n    10391 => 732.0,\n    10392 => 732.0,\n    10393 => 732.0,\n    10394 => 732.0,\n    10395 => 732.0,\n    10396 => 732.0,\n    10397 => 732.0,\n    10398 => 732.0,\n    10399 => 732.0,\n    10400 => 732.0,\n    10401 => 732.0,\n    10402 => 732.0,\n    10403 => 732.0,\n    10404 => 732.0,\n    10405 => 732.0,\n    10406 => 732.0,\n    10407 => 732.0,\n    10408 => 732.0,\n    10409 => 732.0,\n    10410 => 732.0,\n    10411 => 732.0,\n    10412 => 732.0,\n    10413 => 732.0,\n    10414 => 732.0,\n    10415 => 732.0,\n    10416 => 732.0,\n    10417 => 732.0,\n    10418 => 732.0,\n    10419 => 732.0,\n    10420 => 732.0,\n    10421 => 732.0,\n    10422 => 732.0,\n    10423 => 732.0,\n    10424 => 732.0,\n    10425 => 732.0,\n    10426 => 732.0,\n    10427 => 732.0,\n    10428 => 732.0,\n    10429 => 732.0,\n    10430 => 732.0,\n    10431 => 732.0,\n    10432 => 732.0,\n    10433 => 732.0,\n    10434 => 732.0,\n    10435 => 732.0,\n    10436 => 732.0,\n    10437 => 732.0,\n    10438 => 732.0,\n    10439 => 732.0,\n    10440 => 732.0,\n    10441 => 732.0,\n    10442 => 732.0,\n    10443 => 732.0,\n    10444 => 732.0,\n    10445 => 732.0,\n    10446 => 732.0,\n    10447 => 732.0,\n    10448 => 732.0,\n    10449 => 732.0,\n    10450 => 732.0,\n    10451 => 732.0,\n    10452 => 732.0,\n    10453 => 732.0,\n    10454 => 732.0,\n    10455 => 732.0,\n    10456 => 732.0,\n    10457 => 732.0,\n    10458 => 732.0,\n    10459 => 732.0,\n    10460 => 732.0,\n    10461 => 732.0,\n    10462 => 732.0,\n    10463 => 732.0,\n    10464 => 732.0,\n    10465 => 732.0,\n    10466 => 732.0,\n    10467 => 732.0,\n    10468 => 732.0,\n    10469 => 732.0,\n    10470 => 732.0,\n    10471 => 732.0,\n    10472 => 732.0,\n    10473 => 732.0,\n    10474 => 732.0,\n    10475 => 732.0,\n    10476 => 732.0,\n    10477 => 732.0,\n    10478 => 732.0,\n    10479 => 732.0,\n    10480 => 732.0,\n    10481 => 732.0,\n    10482 => 732.0,\n    10483 => 732.0,\n    10484 => 732.0,\n    10485 => 732.0,\n    10486 => 732.0,\n    10487 => 732.0,\n    10488 => 732.0,\n    10489 => 732.0,\n    10490 => 732.0,\n    10491 => 732.0,\n    10492 => 732.0,\n    10493 => 732.0,\n    10494 => 732.0,\n    10495 => 732.0,\n    10502 => 838.0,\n    10503 => 838.0,\n    10506 => 838.0,\n    10507 => 838.0,\n    10560 => 683.0,\n    10561 => 683.0,\n    10627 => 734.0,\n    10628 => 734.0,\n    10702 => 838.0,\n    10703 => 1000.0,\n    10704 => 1000.0,\n    10705 => 1000.0,\n    10706 => 1000.0,\n    10707 => 1000.0,\n    10708 => 1000.0,\n    10709 => 1000.0,\n    10731 => 494.0,\n    10746 => 838.0,\n    10747 => 838.0,\n    10752 => 1000.0,\n    10753 => 1000.0,\n    10754 => 1000.0,\n    10764 => 1325.0,\n    10765 => 521.0,\n    10766 => 521.0,\n    10767 => 521.0,\n    10768 => 521.0,\n    10769 => 521.0,\n    10770 => 521.0,\n    10771 => 521.0,\n    10772 => 521.0,\n    10773 => 521.0,\n    10774 => 521.0,\n    10775 => 521.0,\n    10776 => 521.0,\n    10777 => 521.0,\n    10778 => 521.0,\n    10779 => 521.0,\n    10780 => 521.0,\n    10799 => 838.0,\n    10858 => 838.0,\n    10859 => 838.0,\n    10877 => 838.0,\n    10878 => 838.0,\n    10879 => 838.0,\n    10880 => 838.0,\n    10881 => 838.0,\n    10882 => 838.0,\n    10883 => 838.0,\n    10884 => 838.0,\n    10885 => 838.0,\n    10886 => 838.0,\n    10887 => 838.0,\n    10888 => 838.0,\n    10889 => 838.0,\n    10890 => 838.0,\n    10891 => 838.0,\n    10892 => 838.0,\n    10893 => 838.0,\n    10894 => 838.0,\n    10895 => 838.0,\n    10896 => 838.0,\n    10897 => 838.0,\n    10898 => 838.0,\n    10899 => 838.0,\n    10900 => 838.0,\n    10901 => 838.0,\n    10902 => 838.0,\n    10903 => 838.0,\n    10904 => 838.0,\n    10905 => 838.0,\n    10906 => 838.0,\n    10907 => 838.0,\n    10908 => 838.0,\n    10909 => 838.0,\n    10910 => 838.0,\n    10911 => 838.0,\n    10912 => 838.0,\n    10926 => 838.0,\n    10927 => 838.0,\n    10928 => 838.0,\n    10929 => 838.0,\n    10930 => 838.0,\n    10931 => 838.0,\n    10932 => 838.0,\n    10933 => 838.0,\n    10934 => 838.0,\n    10935 => 838.0,\n    10936 => 838.0,\n    10937 => 838.0,\n    10938 => 838.0,\n    11001 => 838.0,\n    11002 => 838.0,\n    11008 => 838.0,\n    11009 => 838.0,\n    11010 => 838.0,\n    11011 => 838.0,\n    11012 => 838.0,\n    11013 => 838.0,\n    11014 => 838.0,\n    11015 => 838.0,\n    11016 => 838.0,\n    11017 => 838.0,\n    11018 => 838.0,\n    11019 => 838.0,\n    11020 => 838.0,\n    11021 => 838.0,\n    11022 => 836.0,\n    11023 => 836.0,\n    11024 => 836.0,\n    11025 => 836.0,\n    11026 => 945.0,\n    11027 => 945.0,\n    11028 => 945.0,\n    11029 => 945.0,\n    11030 => 769.0,\n    11031 => 769.0,\n    11032 => 769.0,\n    11033 => 769.0,\n    11034 => 945.0,\n    11039 => 869.0,\n    11040 => 869.0,\n    11041 => 873.0,\n    11042 => 873.0,\n    11043 => 873.0,\n    11044 => 1119.0,\n    11091 => 869.0,\n    11092 => 869.0,\n    11360 => 557.0,\n    11361 => 278.0,\n    11362 => 557.0,\n    11363 => 603.0,\n    11364 => 695.0,\n    11365 => 613.0,\n    11366 => 392.0,\n    11367 => 752.0,\n    11368 => 634.0,\n    11369 => 656.0,\n    11370 => 579.0,\n    11371 => 685.0,\n    11372 => 525.0,\n    11373 => 781.0,\n    11374 => 863.0,\n    11375 => 684.0,\n    11376 => 781.0,\n    11377 => 734.0,\n    11378 => 1128.0,\n    11379 => 961.0,\n    11380 => 592.0,\n    11381 => 654.0,\n    11382 => 568.0,\n    11383 => 660.0,\n    11385 => 414.0,\n    11386 => 612.0,\n    11387 => 491.0,\n    11388 => 175.0,\n    11389 => 431.0,\n    11390 => 635.0,\n    11391 => 685.0,\n    11520 => 591.0,\n    11521 => 595.0,\n    11522 => 564.0,\n    11523 => 602.0,\n    11524 => 587.0,\n    11525 => 911.0,\n    11526 => 626.0,\n    11527 => 952.0,\n    11528 => 595.0,\n    11529 => 607.0,\n    11530 => 954.0,\n    11531 => 620.0,\n    11532 => 595.0,\n    11533 => 926.0,\n    11534 => 595.0,\n    11535 => 806.0,\n    11536 => 931.0,\n    11537 => 584.0,\n    11538 => 592.0,\n    11539 => 923.0,\n    11540 => 953.0,\n    11541 => 828.0,\n    11542 => 596.0,\n    11543 => 595.0,\n    11544 => 590.0,\n    11545 => 592.0,\n    11546 => 592.0,\n    11547 => 621.0,\n    11548 => 920.0,\n    11549 => 589.0,\n    11550 => 586.0,\n    11551 => 581.0,\n    11552 => 914.0,\n    11553 => 596.0,\n    11554 => 595.0,\n    11555 => 592.0,\n    11556 => 642.0,\n    11557 => 901.0,\n    11568 => 646.0,\n    11569 => 888.0,\n    11570 => 888.0,\n    11571 => 682.0,\n    11572 => 684.0,\n    11573 => 635.0,\n    11574 => 562.0,\n    11575 => 684.0,\n    11576 => 684.0,\n    11577 => 632.0,\n    11578 => 632.0,\n    11579 => 683.0,\n    11580 => 875.0,\n    11581 => 685.0,\n    11582 => 491.0,\n    11583 => 685.0,\n    11584 => 888.0,\n    11585 => 888.0,\n    11586 => 300.0,\n    11587 => 627.0,\n    11588 => 752.0,\n    11589 => 656.0,\n    11590 => 527.0,\n    11591 => 685.0,\n    11592 => 645.0,\n    11593 => 632.0,\n    11594 => 502.0,\n    11595 => 953.0,\n    11596 => 778.0,\n    11597 => 748.0,\n    11598 => 621.0,\n    11599 => 295.0,\n    11600 => 778.0,\n    11601 => 295.0,\n    11602 => 752.0,\n    11603 => 633.0,\n    11604 => 888.0,\n    11605 => 888.0,\n    11606 => 752.0,\n    11607 => 320.0,\n    11608 => 749.0,\n    11609 => 888.0,\n    11610 => 888.0,\n    11611 => 698.0,\n    11612 => 768.0,\n    11613 => 685.0,\n    11614 => 698.0,\n    11615 => 622.0,\n    11616 => 684.0,\n    11617 => 752.0,\n    11618 => 632.0,\n    11619 => 788.0,\n    11620 => 567.0,\n    11621 => 788.0,\n    11631 => 515.0,\n    11800 => 531.0,\n    11807 => 838.0,\n    11810 => 390.0,\n    11811 => 390.0,\n    11812 => 390.0,\n    11813 => 390.0,\n    11822 => 531.0,\n    19904 => 896.0,\n    19905 => 896.0,\n    19906 => 896.0,\n    19907 => 896.0,\n    19908 => 896.0,\n    19909 => 896.0,\n    19910 => 896.0,\n    19911 => 896.0,\n    19912 => 896.0,\n    19913 => 896.0,\n    19914 => 896.0,\n    19915 => 896.0,\n    19916 => 896.0,\n    19917 => 896.0,\n    19918 => 896.0,\n    19919 => 896.0,\n    19920 => 896.0,\n    19921 => 896.0,\n    19922 => 896.0,\n    19923 => 896.0,\n    19924 => 896.0,\n    19925 => 896.0,\n    19926 => 896.0,\n    19927 => 896.0,\n    19928 => 896.0,\n    19929 => 896.0,\n    19930 => 896.0,\n    19931 => 896.0,\n    19932 => 896.0,\n    19933 => 896.0,\n    19934 => 896.0,\n    19935 => 896.0,\n    19936 => 896.0,\n    19937 => 896.0,\n    19938 => 896.0,\n    19939 => 896.0,\n    19940 => 896.0,\n    19941 => 896.0,\n    19942 => 896.0,\n    19943 => 896.0,\n    19944 => 896.0,\n    19945 => 896.0,\n    19946 => 896.0,\n    19947 => 896.0,\n    19948 => 896.0,\n    19949 => 896.0,\n    19950 => 896.0,\n    19951 => 896.0,\n    19952 => 896.0,\n    19953 => 896.0,\n    19954 => 896.0,\n    19955 => 896.0,\n    19956 => 896.0,\n    19957 => 896.0,\n    19958 => 896.0,\n    19959 => 896.0,\n    19960 => 896.0,\n    19961 => 896.0,\n    19962 => 896.0,\n    19963 => 896.0,\n    19964 => 896.0,\n    19965 => 896.0,\n    19966 => 896.0,\n    19967 => 896.0,\n    42192 => 686.0,\n    42193 => 603.0,\n    42194 => 603.0,\n    42195 => 770.0,\n    42196 => 611.0,\n    42197 => 611.0,\n    42198 => 775.0,\n    42199 => 656.0,\n    42200 => 656.0,\n    42201 => 512.0,\n    42202 => 698.0,\n    42203 => 703.0,\n    42204 => 685.0,\n    42205 => 575.0,\n    42206 => 575.0,\n    42207 => 863.0,\n    42208 => 748.0,\n    42209 => 557.0,\n    42210 => 635.0,\n    42211 => 695.0,\n    42212 => 695.0,\n    42213 => 684.0,\n    42214 => 684.0,\n    42215 => 752.0,\n    42216 => 775.0,\n    42217 => 512.0,\n    42218 => 989.0,\n    42219 => 685.0,\n    42220 => 611.0,\n    42221 => 686.0,\n    42222 => 684.0,\n    42223 => 684.0,\n    42224 => 632.0,\n    42225 => 632.0,\n    42226 => 295.0,\n    42227 => 787.0,\n    42228 => 732.0,\n    42229 => 732.0,\n    42230 => 557.0,\n    42231 => 767.0,\n    42232 => 300.0,\n    42233 => 300.0,\n    42234 => 596.0,\n    42235 => 596.0,\n    42236 => 300.0,\n    42237 => 300.0,\n    42238 => 588.0,\n    42239 => 588.0,\n    42564 => 635.0,\n    42565 => 521.0,\n    42566 => 354.0,\n    42567 => 338.0,\n    42572 => 1180.0,\n    42573 => 1028.0,\n    42576 => 1029.0,\n    42577 => 906.0,\n    42580 => 1080.0,\n    42581 => 842.0,\n    42582 => 977.0,\n    42583 => 843.0,\n    42594 => 1062.0,\n    42595 => 912.0,\n    42596 => 1066.0,\n    42597 => 901.0,\n    42598 => 1178.0,\n    42599 => 1008.0,\n    42600 => 787.0,\n    42601 => 612.0,\n    42602 => 855.0,\n    42603 => 712.0,\n    42604 => 1358.0,\n    42605 => 1019.0,\n    42606 => 879.0,\n    42634 => 782.0,\n    42635 => 685.0,\n    42636 => 611.0,\n    42637 => 583.0,\n    42644 => 686.0,\n    42645 => 634.0,\n    42648 => 1358.0,\n    42649 => 1019.0,\n    42760 => 493.0,\n    42761 => 493.0,\n    42762 => 493.0,\n    42763 => 493.0,\n    42764 => 493.0,\n    42765 => 493.0,\n    42766 => 493.0,\n    42767 => 493.0,\n    42768 => 493.0,\n    42769 => 493.0,\n    42770 => 493.0,\n    42771 => 493.0,\n    42772 => 493.0,\n    42773 => 493.0,\n    42774 => 493.0,\n    42779 => 369.0,\n    42780 => 369.0,\n    42781 => 252.0,\n    42782 => 252.0,\n    42783 => 252.0,\n    42786 => 385.0,\n    42787 => 356.0,\n    42788 => 472.0,\n    42789 => 472.0,\n    42790 => 752.0,\n    42791 => 634.0,\n    42792 => 878.0,\n    42793 => 709.0,\n    42794 => 614.0,\n    42795 => 541.0,\n    42800 => 491.0,\n    42801 => 521.0,\n    42802 => 1250.0,\n    42803 => 985.0,\n    42804 => 1203.0,\n    42805 => 990.0,\n    42806 => 1142.0,\n    42807 => 981.0,\n    42808 => 971.0,\n    42809 => 818.0,\n    42810 => 971.0,\n    42811 => 818.0,\n    42812 => 959.0,\n    42813 => 818.0,\n    42814 => 703.0,\n    42815 => 549.0,\n    42816 => 656.0,\n    42817 => 583.0,\n    42822 => 680.0,\n    42823 => 392.0,\n    42824 => 582.0,\n    42825 => 427.0,\n    42826 => 807.0,\n    42827 => 704.0,\n    42830 => 1358.0,\n    42831 => 1019.0,\n    42832 => 603.0,\n    42833 => 635.0,\n    42834 => 734.0,\n    42835 => 774.0,\n    42838 => 787.0,\n    42839 => 635.0,\n    42852 => 605.0,\n    42853 => 635.0,\n    42854 => 605.0,\n    42855 => 635.0,\n    42880 => 557.0,\n    42881 => 278.0,\n    42882 => 735.0,\n    42883 => 634.0,\n    42889 => 337.0,\n    42890 => 376.0,\n    42891 => 401.0,\n    42892 => 275.0,\n    42893 => 686.0,\n    42894 => 487.0,\n    42896 => 772.0,\n    42897 => 667.0,\n    42912 => 775.0,\n    42913 => 635.0,\n    42914 => 656.0,\n    42915 => 579.0,\n    42916 => 748.0,\n    42917 => 634.0,\n    42918 => 695.0,\n    42919 => 411.0,\n    42920 => 635.0,\n    42921 => 521.0,\n    42922 => 801.0,\n    43000 => 577.0,\n    43001 => 644.0,\n    43002 => 915.0,\n    43003 => 575.0,\n    43004 => 603.0,\n    43005 => 863.0,\n    43006 => 295.0,\n    43007 => 1199.0,\n    61184 => 213.0,\n    61185 => 238.0,\n    61186 => 257.0,\n    61187 => 264.0,\n    61188 => 267.0,\n    61189 => 238.0,\n    61190 => 213.0,\n    61191 => 238.0,\n    61192 => 257.0,\n    61193 => 264.0,\n    61194 => 257.0,\n    61195 => 238.0,\n    61196 => 213.0,\n    61197 => 238.0,\n    61198 => 257.0,\n    61199 => 264.0,\n    61200 => 257.0,\n    61201 => 238.0,\n    61202 => 213.0,\n    61203 => 238.0,\n    61204 => 267.0,\n    61205 => 264.0,\n    61206 => 257.0,\n    61207 => 238.0,\n    61208 => 213.0,\n    61209 => 275.0,\n    61440 => 977.0,\n    61441 => 977.0,\n    61442 => 977.0,\n    61443 => 977.0,\n    62464 => 580.0,\n    62465 => 580.0,\n    62466 => 624.0,\n    62467 => 889.0,\n    62468 => 585.0,\n    62469 => 580.0,\n    62470 => 653.0,\n    62471 => 882.0,\n    62472 => 555.0,\n    62473 => 580.0,\n    62474 => 1168.0,\n    62475 => 589.0,\n    62476 => 590.0,\n    62477 => 869.0,\n    62478 => 580.0,\n    62479 => 589.0,\n    62480 => 914.0,\n    62481 => 590.0,\n    62482 => 731.0,\n    62483 => 583.0,\n    62484 => 872.0,\n    62485 => 589.0,\n    62486 => 895.0,\n    62487 => 589.0,\n    62488 => 589.0,\n    62489 => 590.0,\n    62490 => 649.0,\n    62491 => 589.0,\n    62492 => 589.0,\n    62493 => 599.0,\n    62494 => 590.0,\n    62495 => 516.0,\n    62496 => 580.0,\n    62497 => 584.0,\n    62498 => 580.0,\n    62499 => 580.0,\n    62500 => 581.0,\n    62501 => 638.0,\n    62502 => 955.0,\n    62504 => 931.0,\n    62505 => 808.0,\n    62506 => 508.0,\n    62507 => 508.0,\n    62508 => 508.0,\n    62509 => 508.0,\n    62510 => 508.0,\n    62511 => 508.0,\n    62512 => 508.0,\n    62513 => 508.0,\n    62514 => 508.0,\n    62515 => 508.0,\n    62516 => 518.0,\n    62517 => 518.0,\n    62518 => 518.0,\n    62519 => 787.0,\n    62520 => 787.0,\n    62521 => 787.0,\n    62522 => 787.0,\n    62523 => 787.0,\n    62524 => 546.0,\n    62525 => 546.0,\n    62526 => 546.0,\n    62527 => 546.0,\n    62528 => 546.0,\n    62529 => 546.0,\n    63173 => 612.0,\n    64256 => 689.0,\n    64257 => 630.0,\n    64258 => 630.0,\n    64259 => 967.0,\n    64260 => 967.0,\n    64261 => 686.0,\n    64262 => 861.0,\n    64275 => 1202.0,\n    64276 => 1202.0,\n    64277 => 1196.0,\n    64278 => 1186.0,\n    64279 => 1529.0,\n    64285 => 224.0,\n    64286 => 0.0,\n    64287 => 331.0,\n    64288 => 636.0,\n    64289 => 856.0,\n    64290 => 774.0,\n    64291 => 906.0,\n    64292 => 771.0,\n    64293 => 843.0,\n    64294 => 855.0,\n    64295 => 807.0,\n    64296 => 875.0,\n    64297 => 838.0,\n    64298 => 708.0,\n    64299 => 708.0,\n    64300 => 708.0,\n    64301 => 708.0,\n    64302 => 668.0,\n    64303 => 668.0,\n    64304 => 668.0,\n    64305 => 578.0,\n    64306 => 412.0,\n    64307 => 546.0,\n    64308 => 653.0,\n    64309 => 355.0,\n    64310 => 406.0,\n    64312 => 648.0,\n    64313 => 330.0,\n    64314 => 537.0,\n    64315 => 529.0,\n    64316 => 568.0,\n    64318 => 679.0,\n    64320 => 399.0,\n    64321 => 649.0,\n    64323 => 640.0,\n    64324 => 625.0,\n    64326 => 593.0,\n    64327 => 709.0,\n    64328 => 564.0,\n    64329 => 708.0,\n    64330 => 657.0,\n    64331 => 272.0,\n    64332 => 578.0,\n    64333 => 529.0,\n    64334 => 625.0,\n    64335 => 629.0,\n    64338 => 941.0,\n    64339 => 982.0,\n    64340 => 278.0,\n    64341 => 302.0,\n    64342 => 941.0,\n    64343 => 982.0,\n    64344 => 278.0,\n    64345 => 302.0,\n    64346 => 941.0,\n    64347 => 982.0,\n    64348 => 278.0,\n    64349 => 302.0,\n    64350 => 941.0,\n    64351 => 982.0,\n    64352 => 278.0,\n    64353 => 302.0,\n    64354 => 941.0,\n    64355 => 982.0,\n    64356 => 278.0,\n    64357 => 302.0,\n    64358 => 941.0,\n    64359 => 982.0,\n    64360 => 278.0,\n    64361 => 302.0,\n    64362 => 1037.0,\n    64363 => 1035.0,\n    64364 => 478.0,\n    64365 => 506.0,\n    64366 => 1037.0,\n    64367 => 1035.0,\n    64368 => 478.0,\n    64369 => 506.0,\n    64370 => 646.0,\n    64371 => 646.0,\n    64372 => 618.0,\n    64373 => 646.0,\n    64374 => 646.0,\n    64375 => 646.0,\n    64376 => 618.0,\n    64377 => 646.0,\n    64378 => 646.0,\n    64379 => 646.0,\n    64380 => 618.0,\n    64381 => 646.0,\n    64382 => 646.0,\n    64383 => 646.0,\n    64384 => 618.0,\n    64385 => 646.0,\n    64386 => 445.0,\n    64387 => 525.0,\n    64388 => 445.0,\n    64389 => 525.0,\n    64390 => 445.0,\n    64391 => 525.0,\n    64392 => 445.0,\n    64393 => 525.0,\n    64394 => 483.0,\n    64395 => 552.0,\n    64396 => 483.0,\n    64397 => 552.0,\n    64398 => 895.0,\n    64399 => 895.0,\n    64400 => 476.0,\n    64401 => 552.0,\n    64402 => 895.0,\n    64403 => 895.0,\n    64404 => 476.0,\n    64405 => 552.0,\n    64406 => 895.0,\n    64407 => 895.0,\n    64408 => 476.0,\n    64409 => 552.0,\n    64410 => 895.0,\n    64411 => 895.0,\n    64412 => 476.0,\n    64413 => 552.0,\n    64414 => 734.0,\n    64415 => 761.0,\n    64416 => 734.0,\n    64417 => 761.0,\n    64418 => 278.0,\n    64419 => 302.0,\n    64426 => 698.0,\n    64427 => 632.0,\n    64428 => 527.0,\n    64429 => 461.0,\n    64467 => 824.0,\n    64468 => 843.0,\n    64469 => 476.0,\n    64470 => 552.0,\n    64471 => 483.0,\n    64472 => 517.0,\n    64473 => 483.0,\n    64474 => 517.0,\n    64475 => 483.0,\n    64476 => 517.0,\n    64478 => 483.0,\n    64479 => 517.0,\n    64484 => 783.0,\n    64485 => 833.0,\n    64486 => 278.0,\n    64487 => 302.0,\n    64488 => 278.0,\n    64489 => 302.0,\n    64508 => 783.0,\n    64509 => 833.0,\n    64510 => 278.0,\n    64511 => 302.0,\n    65024 => 0.0,\n    65025 => 0.0,\n    65026 => 0.0,\n    65027 => 0.0,\n    65028 => 0.0,\n    65029 => 0.0,\n    65030 => 0.0,\n    65031 => 0.0,\n    65032 => 0.0,\n    65033 => 0.0,\n    65034 => 0.0,\n    65035 => 0.0,\n    65036 => 0.0,\n    65037 => 0.0,\n    65038 => 0.0,\n    65039 => 0.0,\n    65056 => 0.0,\n    65057 => 0.0,\n    65058 => 0.0,\n    65059 => 0.0,\n    65136 => 293.0,\n    65137 => 293.0,\n    65138 => 293.0,\n    65139 => 262.0,\n    65140 => 293.0,\n    65142 => 293.0,\n    65143 => 293.0,\n    65144 => 293.0,\n    65145 => 293.0,\n    65146 => 293.0,\n    65147 => 293.0,\n    65148 => 293.0,\n    65149 => 293.0,\n    65150 => 293.0,\n    65151 => 293.0,\n    65152 => 470.0,\n    65153 => 278.0,\n    65154 => 305.0,\n    65155 => 278.0,\n    65156 => 305.0,\n    65157 => 483.0,\n    65158 => 517.0,\n    65159 => 278.0,\n    65160 => 305.0,\n    65161 => 783.0,\n    65162 => 833.0,\n    65163 => 278.0,\n    65164 => 302.0,\n    65165 => 278.0,\n    65166 => 305.0,\n    65167 => 941.0,\n    65168 => 982.0,\n    65169 => 278.0,\n    65170 => 302.0,\n    65171 => 524.0,\n    65172 => 536.0,\n    65173 => 941.0,\n    65174 => 982.0,\n    65175 => 278.0,\n    65176 => 302.0,\n    65177 => 941.0,\n    65178 => 982.0,\n    65179 => 278.0,\n    65180 => 302.0,\n    65181 => 646.0,\n    65182 => 646.0,\n    65183 => 618.0,\n    65184 => 646.0,\n    65185 => 646.0,\n    65186 => 646.0,\n    65187 => 618.0,\n    65188 => 646.0,\n    65189 => 646.0,\n    65190 => 646.0,\n    65191 => 618.0,\n    65192 => 646.0,\n    65193 => 445.0,\n    65194 => 525.0,\n    65195 => 445.0,\n    65196 => 525.0,\n    65197 => 483.0,\n    65198 => 552.0,\n    65199 => 483.0,\n    65200 => 552.0,\n    65201 => 1221.0,\n    65202 => 1275.0,\n    65203 => 838.0,\n    65204 => 892.0,\n    65205 => 1221.0,\n    65206 => 1275.0,\n    65207 => 838.0,\n    65208 => 892.0,\n    65209 => 1209.0,\n    65210 => 1225.0,\n    65211 => 849.0,\n    65212 => 867.0,\n    65213 => 1209.0,\n    65214 => 1225.0,\n    65215 => 849.0,\n    65216 => 867.0,\n    65217 => 925.0,\n    65218 => 949.0,\n    65219 => 796.0,\n    65220 => 820.0,\n    65221 => 925.0,\n    65222 => 949.0,\n    65223 => 796.0,\n    65224 => 820.0,\n    65225 => 597.0,\n    65226 => 532.0,\n    65227 => 597.0,\n    65228 => 482.0,\n    65229 => 597.0,\n    65230 => 532.0,\n    65231 => 523.0,\n    65232 => 482.0,\n    65233 => 1037.0,\n    65234 => 1035.0,\n    65235 => 478.0,\n    65236 => 506.0,\n    65237 => 776.0,\n    65238 => 834.0,\n    65239 => 478.0,\n    65240 => 506.0,\n    65241 => 824.0,\n    65242 => 843.0,\n    65243 => 476.0,\n    65244 => 552.0,\n    65245 => 727.0,\n    65246 => 757.0,\n    65247 => 305.0,\n    65248 => 331.0,\n    65249 => 619.0,\n    65250 => 666.0,\n    65251 => 536.0,\n    65252 => 578.0,\n    65253 => 734.0,\n    65254 => 761.0,\n    65255 => 278.0,\n    65256 => 302.0,\n    65257 => 524.0,\n    65258 => 536.0,\n    65259 => 527.0,\n    65260 => 461.0,\n    65261 => 483.0,\n    65262 => 517.0,\n    65263 => 783.0,\n    65264 => 833.0,\n    65265 => 783.0,\n    65266 => 833.0,\n    65267 => 278.0,\n    65268 => 302.0,\n    65269 => 570.0,\n    65270 => 597.0,\n    65271 => 570.0,\n    65272 => 597.0,\n    65273 => 570.0,\n    65274 => 597.0,\n    65275 => 570.0,\n    65276 => 597.0,\n    65279 => 0.0,\n    65529 => 0.0,\n    65530 => 0.0,\n    65531 => 0.0,\n    65532 => 0.0,\n    65533 => 1025.0,\n  ),\n  'CIDtoGID_Compressed' => true,\n  'CIDtoGID' => 'eJzt3AW087iZOHxJli3LliUZXmZmZmZmZmZmZmZmZmZmZmZmZmb+p3e780230+60M+3sfqvfObIl+ZH82E6cm9yTAPAbaQADHRiAABNQYAEbMOAADgSQwAUe8EEAwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CABSAgSgcQgCUgKkoHkIAVICVKB1CANSAvSgfQgA8gIMoHMIAvICrKB7CAHyAlygdwgD8gL8oH8oAAoCAqBwqAIKAqKgeKgBCgJSoHSoAwoC8qB8qACqAgqgcqgCqgKqoHqoAaoCWr91oMPqQ3qgLqgHqgPGoCGoBFoDJqApqAZaA5agJagFWgN2oC2oB1oDzqAjqAT6Ay6gK6gG+gOeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWAUGA3GgLFgHBgPJoCJYBKYDKaAqWAamA5mgJlgFpgN5oC5YB6YDxaAhWARWAyWgKVgGVgOVoCVYBVYDdaAtWAdWA82gI1gE9gMtoCtYBvYDnaAnWAX2A32gL1gH9gPDoCD4BA4DI6Ao+AYOA5OgJPgFDgNzoCz4Bw4Dy6Ai+ASuAyugKvgGrgOboCb4Ba4De6Au+AeuA8egIfgEXgMnoCn4Bl4Dl6Al+AVeA3egLfgHXgPPoCP4BP4DL6Ar+Ab+A5+QAAhRFCDGOrQgASakEIL2pBBB3IooIQu9KAPAxgOhocRYEQYCUaGUWBUGA1GhzFgTBgLxoZxYFwYD8aHCWBCmAgmhklgUpgMJocpYEqYCqaGaWBamA6mhxlgRpgJZoZZYFaYDWaHOWBOmAvmhnlgXpgP5ocFYEFYCBaGRWBRWAwWhyVgSVgKloZlYFlYDpaHFWBFWAlWhlVgVVgNVoc1YE1YC9aGdWBdWA/Whw1gQ9gINoZNYFPYDDaHLWBL2Aq2hm1gW9gOtocdYEfYCXaGXWBX2A12hz1gT9gL9oZ9YF/YD/aHA+BAOAgOhkPgUDgMDocj4Eg4Co6GY+BYOA6OhxPgRDgJToZT4FQ4DU6HM+BMOAvOhnPgXDgPzocL4EK4CC6GS+BSuAwuhyvgSrgKroZr4Fq4Dq6HG+BGuAluhlvgVrgNboc74E64C+6Ge+BeuA/uhwfgQXgIHoZH4FF4DB6HJ+BJeAqehmfgWXgOnocX4EV4CV6GV+BVeA1ehzfgTXgL3oZ34F14D96HD+BD+Ag+hk/gU/gMPocv4Ev4Cr6Gb+Bb+A6+hx/gR/gJfoZf4Ff4DX6HPxBAECGkIYx0ZCCCTESRhWzEkIM4EkgiF3nIRwEKh8KjCCgiioQioygoKoqGoqMYKCaKhWKjOCguiofiowQoIUqEEqMkKClKhpKjFCglSoVSozQoLUqH0qMMKCPKhDKjLCgryoayoxwoJ8qFcqM8KC/Kh/KjAqggKoQKoyKoKCqGiqMSqCQqhUqjMqgsKofKowqoIqqEKqMqqCqqhqqjGqgmqoVqozqoLqqH6qMGqCFqhBqjJqgpaoaaoxaoJWqFWqM2qC1qh9qjDqgj6oQ6oy6oK+qGuqMeqCfqhXqjPqgv6of6owFoIBqEBqMhaCgahoajEWgkGoVGozFoLBqHxqMJaCKahCajKWgqmoamoxloJpqFZqM5aC6ah+ajBWghWoQWoyV/ui2hpWgZWv6fNym04s/rlf/19oVWodVoDVqL1qH1aAPaiDahzWgL2oq2oe1oB9qJdqHdaA/ai/ah/egAOogOocPoCDqKjqHj6AQ6iU6h0+gMOovOofPoArqILqHL6Aq6iq6h6+gGuoluodvoDrqL7qH76AF6iB6hx+gJeoqeoefoBXqJXqHX6A16i96h9+gD+og+oc/oC/qKvqHv6If2pxcYqCFN+/OLDdb00NIIFaKZGtUszdaY5vydlyeuCU1qruZpvhZo4cL6wmsRtIhaJC2yFuWnuKhaNC26FkOLqcXSYofacUIlrhZPi68l0BJqibTEWhItqZZMS66l0FJqqbTUWhotrZZOS69lCEVm1DJpmbUsWlYtm5Zdy6Hl1HJpubU8Wl4tn5ZfK6AV1ApphbUiWlGtmFZcK6GV1EpppbUyWlmtnFZeq6BV1CpplbUqWlWtmlZdq6HV1GpptbU6Wl2tnlZfa6A11BppjbUmWlOtmdZca6G11FpprbU2WlutndZe66B11DppnbUuWletm9Zd66H11HppvbU+Wl+tn9ZfG6AN1AZpg7Uh2lBtmDZcG6GN1EZpo7Ux2lhtnDZem6BN1CZpk7Up2lRtmjZdm6HN1GZps7U52lxtnjZfW6At1BZpi7Ul2lJtmbZcW6Gt1FZpq7U12lptnbZe26Bt1DZpm7Ut2lZtm7Zd26Ht1HZpu7U92l5tn7ZfO6Ad1A5ph7Uj2lHtmHZcO6Gd1E5pp7Uz2lntnHZeu6Bd1C5pl7Ur2lXtmnZdu6Hd1G5pt7U72l3tnnZfe6A91B5pj7Un2lPtmfZce6G91F5pr7U32lvtnfZe+6B91D5pn7Uv2lftm/Zd+4EBhhhhDWOsYwMTbGKKLWxjhh3MscASu9jDPg5wOBweR8ARcSQcGUfBUXE0HB3HwDFxLBwbx8FxcTwcHyfACXEinBgnwUlxMpwcp8ApcSqcGqfBaXE6nB5nwBlxJpwZZ8FZcTacHefAOXEunBvnwXlxPpwfF8AFcSFcGBfBRXExXByXwCVxKVwal8FlcTlcHlfAFXElXBlXwVVxNVwd18A1cS1cG9fBdXE9XB83wA1xI9wYN8FNcTPcHLfALXEr3Bq3wW1xO9wed8AdcSfcGXfBXXE33B33wD1xL9wb98F9cT/cHw/AA/EgPBgPwUPxMDwcj8Aj8Sg8Go/BY/E4PB5PwBPxJDwZT8FT8TQ8Hc/AM/EsPBvPwXPxPDwfL8AL8SK8GC/BS/EyvByvwCvxKrwar8Fr8Tq8Hm/AG/EmvPmXn4F4C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br4ZNt8tfBvfwXfxPXwfPwi1H+JH+DF+gp/iZ/g5foFf4lf4NX6D3+J3+D3+gD/iT/gz/oK/4m/4O/6hAx3qSNd0rOu6oRPd1Klu6bbOdEfnAOhCl7/+z7//ju7qnu7rgR5OD69H0CPqkfTIehQ9qh5Nj67H0GPqsfTYehw9blhsPD3+X41PoCfUE+mJ9SR6Uj2ZnlxPoafUU+mp9TR6Wj2dnl7PoGfUM+mZ9Sx6Vj2bnl3PoefUc/1sfG49j55Xz6fn/xW5FtALhpaF9MKhZZG/2lr0Z/Vif14XD5USekm9lF5aL6OX1cvp5fUKekW9kl5Zr6JX1avp1fUaek29ll5br6PX1evp9fUGesOfzdRIb6w30ZvqzfTmegu9pd5Kb6230dvq7fT2ege9o95J76x30bvq3fTuoegeYWN6/mx8L7233kfvq/fT++sD9IH6IH2wPkQfqg/Th+sj9JH6qD/Hjf5pxBh9rD5OH69P0Cfqk/TJ+hR9qj5Nn67P0Gfqs/TZ+hx9rj5Pn68v0Bfqi/TF+hJ9qb5MX66v0Ffqq/TV+hp9rb5OX69v0Dfqm/TN+hZ9q75N367v0Hfqu/Td+h59r75P368f0A/qh/TD+hH9qH5MP66f0E/qp/TT+hn9rH5OP69f0C/ql/7iDF/Wr+hXw2rX9Ouh5Y1QufnT1lv//RX8hWt6W7+j39Xv6ff1B/pD/ZH+WH/yz8yj/GvoT/Vn+nP9hf5Sf6W/1t/ob/V3+nv9g/5R/6R/1r/oX/Vv+nf9hwEMaCBDM7ChG4ZBDNOghmXYBjMcgxvCkIZreIb/H7MagRHOCG9EMCIakYzIRhQjqhHNiB62JYYR04j1Rx6xoiiKoiiKoij/Nxmx/+gMQjnEMeKGlvHC6vGNBKFlwrB6or+ISmwkMZIayUK15EYKI6WRykhtpDHShtrpjPRGhtA6Y6hkCovNbGQJLbMa2YzsRg4jp5HLyG3kMfIa+Yz8RgGjYGhbIaOwEfYJi1HUKGYUN0oYJUP1UqFS2ihjlDXKGeWNCmHbKxqVjMpGFaOqUc2obtQwahph/7U0aht1/o0nSVGUX2DUNeoZ9Y0GRkOjkdHYaGI0NZoZzY0WRkujldHaaGO0NdoZ7Y0ORkejk9HZ6GJ0NboZ3Y0eRk+jl9Hb6GP0NfoZ/Y0BxkBj0C/OP9gYYgw1hhnDjRHGSGOUMdoYY4w1xhnjjQnGRGOSMdmYYkw1phnTjRnGTGOWMduYY8w15hnzjQXGQmORsdhYYiw1lhnLjRXGSmOVsdpYY6w11hnr/91nSlEURfmfxdhgbDQ2GZuNLcZWY1uovd3YYew0dhm7jT3GXmOfsd84YBw0DhmHjSPGUeOYcdw4YZwMxZ0yThtnjLPGOeO8ccG4aFwyLhtXjKvGNeO6ccO4adwybht3jLvGPeO+8cB4aDwKjXlsPDGeGs+M58YL46XxynhtvDHeGu+M98YH46PxyfhsfDG+Gt9Ckd+NHwQQSBDRCAaA6MQghJiEEovYhBGHcCKIJC7xiE8CEo6EJxFIRBKJRCZRSFQSjUQnMUhMEovEJnFIXBKPxCcJSEKSiCQmSUhSkowkJylISpKKpCZpSFqSjqQnGUhGkolkJllIVpKNZCc5SE6Si+QmeUheko/kJwVIQVKIFCZFSFFSjBQnJUhJUoqUJmVIWVKOlCcVSEVSiVQmVUhVUo1UJzVITVKL1CZ1SF1Sj9QnDUhD0og0Jk1IU9KMNP/T2SctSEvSirQmbUhb0o60Jx1IR9KJdCZdSFfSjXQnPUhP0ov0Jn1IX9KP9CcDyEAyiAwmQ8hQMowMJyPISDKKjCZjyFgyjownE8hEMik072QyhUwl08h0MoPMJLPIbDKHzCXzyHyygCwki8hisoQsJcvIcrKCrCSryGqyhqwl6/7ro4OsJxvIRrKJbCZbyFayjWwnO8hOsovsJnvIXrKP7CcHyEFyiBwmR8hRcowcJyfISXKKnCZnyFlyjpwnF8hFcolcJlfIVXKNXCc3yE1yi9wmd8jd0Pz3yH3ygDwkj8hj8oQ8Jc/Ic/KCvCSvyGvyhrwl70Ix78kH8pF8Ip/JF/KVfCPfyQ8TmNBEpmZiUzcNk5imSU3LtE1mOib/60e5KUxpuqZn+mZghjPDmxHMiGYkM7IZxYxqRjOjmzHMmD/FxjJjm3HMuGY8M76ZwExoJjITm0nMpGayX5g3uZnCTGmmMlObacy0ZjozvZnBzGhmMjObWcysZrbf73n6C/vOHrbM8a/cx7+TmdPM9d9H/QPz5TbzmHnNfGZ+s4BZ0CxkFv6FmCJmUbOYWdwsYZY0S5mlzTJmWbOcWd6sYFY0K5mVzSpmVbOaWd2sYdY0a5m1zTpmXbOeWd9s8HtmqiiKoiiKoiiK8q9nNjQbmY3NJmZTs5nZ3GxhtjRbma3NNmZbs53Z3uxgdjQ7mZ3NLmbXUGw3s7vZw+xp9jJ7m33MvmY/s785wBxoDjIHh801xBxqDjOHmyPMkeYoc7Q5JtQ31hxnjjcnmBPNSeZkc4o51ZxmTjdnmDPNWeZsc44515xnzjcXmAvNReZic4m51FxmLjdXmCvNVeZqc4251lxnrjc3mBvNTeZmc4u51dxmbjd3hGbeae4yd5t7zL3mPnO/ecA8aB4yD5tHzKPmsb95tMfNE2Hrk6Fy6r9sO/0PnLUz5lnznHnevGBeNC+Zl80r5lXzmnndvGHeNG+Zt8075l3znnnffGA+NB+Zj80n5lPzmfncfGG+NF+Zr8035lvznfne/PDTjB/NT+Zn84v51fz2D13A38j8bv6ggEKKqEYx1alBCTUppRa1KaMO5VRQSV3qUZ8GNBwNTyPQiDQSjUyj0Kg0Go1OY9CYNBaNTePQuDQejU8T0IQ0EU1Mk9CkNBlNTlPQlDQVTU3T0LQ0HU1PM9CMNBPNTLPQrDQbzU5z0Jw0F81N89C8NB/NTwvQgrQQLUyL0KK0GC1OS9CStBQtTcvQsrQcLU8r0Iq0Eq1Mq9CqtBqtTmvQmrQWrU3r0Lq0Hq1PG9CGtBFtTJvQprQZbU5b0Ja0FW1N29C2tB1tTzvQjrQT7Uy70K60G+1Oe9CetBftTfvQvrQf7U8H0IF0EB1Mh9ChdBgdTkfQkXQUHU3H0LF0HB1PJ9CJdBKdTKfQqXQanU5n0Jl0Fp1N59C5dB6dTxfQhXQRXUyX0KV0GV1OV9CVdBVdTdfQtXQdXU830I10E91Mt9CtdBvdTnfQnXQX3U330L10H91PD9CD9BA9TI/Qo/QYPU5P0JP0FD1Nz9Cz9Bw9Ty/Qi/QSvUyv0Kv0Gr1Ob9Cb9Ba9Te/Qu/QevU8f0If0EX1Mn9Cn9Bl9Tl/Ql/QVfU3f0Lf0HX1PP9CP9NN/Xn/6mX6hX+k3+p3+sIAFLWRpFrZ0y7CIZVrUsizbYpZjcUv8Kd6Slmt5lm8FVth36azwVgQrohXJimxFsaJa0azoVgwrphXLim3FseJa8az4VgIroZXISmwlsZJayazkVgorpZXKSm2lsdJa6az0VgYro5XJymxlCZsvq5XNym7lsHJaYZ8FWbmtPFZeK5+V3ypgFbQKhXoKh0qRUCkaKsWs4lYJq6RVyiptlbHKWuWs8lYFq6JVyapsVbGqWtWs6lYNq6ZVy6pt1bHqWvWs+lYDq6HVyGpsNQmbv6nVzGputbBaWq2s1lYbq63VzmpvdbA6Wp2szlYXq6vVzepu9bB6Wr2s3lYfq6/Vz+pvDbAGWoOswdYQa6g1zBpujbBGWqOs0dYYa6w1zhpvTbAmWpOsydYUa6o1zZpuzbBmhvY1y5ptzbHmWvOs+dYCa6G1yFpsLbGWWsus5daK0PaV1iprtbXGWmuts9ZbG6yN1iZrs7XF2mptC8t1u7XD2mntsnZbe0KtvdY+a791wDpoHbIOW0eso9Yx67h1wjppnbJOW2ess9Y563zYuAvWRetSaH3ZumJdta5Z160b1k3rlnU71HfHumvds+5bD6yH1iPrsfXEemo9s55bL6yX1ivrtfXGemu9s95bH6yP1ifrs/XF+mp9s75bP2xgQxvZmo1t3TZsYps2tS3btpnt2NwWtrRd27N9O7DD2eHtCHZEO5Id2Y5iR7Wj2dHtGHZMO5Yd245jx7Xj2fHtBHZCO5Gd2E5iJ7WT2cntFHZKO5Wd2k5jp7XT2entDHZGO5Od2c5iZ7Wz2dntHHZOO5ed285j57Xz2fntAv/fPc0uaBeyC9tF7KJ2Mbu4XSKsr6Rdyi5tl7HL2uXs8nYFu6Jdya5sV7Gr2tXs6nYNu6Zdy65t17Hr2vXs+nYDu6HdyG4cGtfEbmo3s5vbLeyWdiu7td3Gbmu3s9vbHf68r452J7uz3cXuanezu9s97J52L7u33cfua/ez+9sD7IH2IHuwPcQeag8Lix9uj7BHhtVG/Zr7sz3aHvNTfaw97s+18faEn3on/tp7/S/OP8mebE+xp9rT7On2DHumPcueHeqdY8+159nz7QX2QnuRvdheYi+1l9nL7RX2SnuVvdpeY6+119nr7Q32RnuTvdneYm+1t9nb7R32TnuXvdveY++199n77QP2QfuQfdg+Yh+1j9nH7RP2SfuUfdo+Y5+1z9nn7Qv2RfuSfdm+Yl+1r9nX7Rv2TftWaP+3w3K7Eyp37Xv2ffuB/dB+ZD+2n9hP7Wf2c/uF/dJ+Zb+239hv7Xf2e/uD/dH+ZH+2v9hf7W/2d/sHAwwyxDSGmc4MRpjJKLOYzRhzGGeCSeYyj/ksYOFYeBaBRWSR/uOMsMg/Pz8sCovKorHoLAaLyWKx2CwOi8visfgsAUvIErHELAlLypKx5CwFS8lSsdQsDUvL0rH0LAPLyDKxzCwLy8qysewsB8vJcrHcLA/Ly/Kx/KwAK8gKscKsCCvKirHirAQryUqx0qwMK8vKsfKsAqvIKrHKrAqryqqx6qwGq8lqsdqsDqvL6rH6rAFryBqxxqwJa8qaseasBWvJWrHWrA1ry9qx9qwD68g6sc6sC+vKurHurAfryXqx3qwP68v6sf5sABvIBrHBbAgbyoax4WwEG8lGsdFsDBvLxrHxbAKbyCaxyWwKm8qmselsBpvJZrHZbA6by+ax+WwBW8gWscVsCVvKlrHlbAVbyVax1WwNW8vWsfVsA9vINrHNbAvbyrax7WwH28l2sd1sD9vL9rH97AA7yA6xw+wIO8qOsePsBDvJTrHT7Aw7y86x8+wCu8guscvsCrvKrrHr7Aa7yW6x2+wOu8vusfvsAXvIHrHH7Al7yp6x5+wFe8lesdfsDXvL3rH37AP7yD6xz+wL+8q+se/shwMc6CBHc7CjO4ZDHNOhjuXYDnMchzvCkY7reI7vBE44J7wTwYnoRHIiO1GcqE40J7oTw4npxHJiO3GcuE48J76TwEnoJHISO0mcpE4yJ7mTwknppHJSO2mctE46J72TwcnoZHIyO1mcrE42J7uTw8np5HJyO3mcvE4+J79TwCnoFHIKO0Wcok4xp7hTwinplHJKO2Wcsk45p7xTwanoVHIqO1Wcqk41p7pTw6np1HJqO3Wcuk49p77TwGnoNHIaO02cpk4zp7nTwmnptHJaO22ctk47p73TwenodHI6O12crk43p7vTw+np9HJ6O32cvk4/p78zwBnoDHIGO0Ococ4wZ7gzwhnpjHJGO2Ocsc44Z7wzwZnoTHImO1OcqT9/PjjTnOlh6xnOTGeWM9uZ48wNa89z5jsLnIXOorDWYmfJb7kr/d6cpc4y56dfQ3DCfg3BWfkLcav+5gyr/6K1xlnrrHPWOxucjc4mZ7OzxdnqbHO2Ozucnc4uZ7ezx9nr7HP2/8asDzgHf2XkoVA5HFY78tv2+c9wjjp/8x3Xv3zfx50TzknnlHPaOeOcdc45550Lf1Qu/xs5F51LzmXninPVueZcd244N51bzm3njnPXuefcdx44D51HzmPnifPUeeY8d144L51XzmvnjfPWeee8dz44H51Pzmfni/PV+eZ8d35wwCFHXOOY69zghJuccovbnHGHcy645C73uM8DHo6H5xF4RB6JR+ZReFQejUfnMXhMHovH5nF4XB6Px+cJeEKeiCfmSXhSnown5yl4Sp6Kp+ZpeFqejqfnGXhGnoln5ll4Vp6NZ+c5eE6ei+fmeXheno/n5wV4QV6IF+ZFeFFejBfnJXhJXoqX5mV4WV6Ol+cVeEVeiVfmVXhVXo1X5zV4TV6L1+Z1eF1ej9fnDXhD3og35k14U96MN+cteEveirfmbXhb3o635x14R96Jd+ZdeFfejXfnPXhP3ov35n14X96P9+cD+EA+iA/mQ/hQPowP5yP4SD6Kj+Zj+Fg+jo/nE/hEPolP5lP4VD6NT+cz+Ew+i8/mc/hcPo/P5wv4Qr6IL+ZL+FK+jC/nK/hKvoqv5mv4Wr6Or+cb+Ea+iW/mW/hWvo1v5zv4Tr6L7+Z7+F6+j+/nB/hBfogf5kf4UX6MH+cn+El+ip/mZ/hZfo6f5xf4RX6JX+ZX+FV+jV/nN/hNfovf5nf4XX6P3+cP+EP+iD/mT/hT/ow/5y/4S/6Kv+Zv+Fv+jr/nH/hH/ol/5l/4V/6Nf+c/BBBQIKEJLHRhCCJMQYUlbMGEI7gQQgpXeMIXgQgnwosIIqKIJCKLKCKqiCaiixgipoglYos4Iq6IJ+KLBCKhSCQSiyQiqUgmkosUIqVIJVKLNCKtSCfSiwwio8gkMossIqvIJrKLHCKnyCVyizwir8gn8osCoqAoJAqLIqKoKCaKixKipCglSosyoqwoJ8qLCqKiqCQqiyqiqqgmqosaoqaoJWqLOqKuqCfqiwaioWgkGosmoqloJpqLFqKlaCVaizaiLQCinWgvOoiOopPoLLqIrqKb6C56iJ6il+gt+oi+op/oLwaIgWKQGCyGiKFimBguRvzl80+MFKPEaDHml5+dv44Y+5tGjxPjxQQRehchJonJYooIe70X08R0MUPMFLPEbDFHzBXzxHyxQCwUi8RisUQsFcvEcrFCrBSrxGqxRqwV68R6sUFsDI3cJDaLLWKr2Ca2ix1ip9gldos9Yq/YJ/aLA+KgOCQOiyPiqDgmjosT4qQ4JU6LM+KsOCfOiwviorgkLosroXmuhso1cV3cEDf/nGnonYG4Le6Iu+KeuC8eiIdhvY/EY/FEPBXPxHPxQrwUr8Rr8Ua8Fe/Ee/FBfBSfxGfxRXwV38R38UMCCSWSmsRSl4Yk0pRUWtKWTDqSSyGldKUnfRnIcDK8jCAjykgysowio/5HDjKajC5jyJgylowt48i4Mp6MLxPIhDKRTCyTyKQymUwuU8iUMpVMLdPItKER6WR6mUFmlJlkZplFZpXZZHaZQ+aUuWTun18HmUfm/cevnsz3s3p+WUAWlIVkYfnTr3fIorKYLC5LyJKylCwty8iyspwsLyvIirKSrCyryKqymqwua8iaspasLevIurKerC8byIaykWwsm8imsplsLlvIlrKVbC3byLaynWwvO8iOspPsLLvIrrKb7C57yJ6yl+wt+8i+sp/sLwfIgXKQHCyHyKFymBwuR8iRcpQcLcfIsXKcHC8nyIlykpwsp8ipcpqcLmfImXKWnC3nyLlynpwvF8iFcpFcLJfIpXKZXC5XyJVylVwt18i1cp1cLzfIjXKT3Cy3yK1ym9wud8idcpfcLffIvXKf3C8PyIPykDwsj8ij8pg8Lk/Ik/KUPC3PyLPynDwvL8iL8pK8LK/Iq/KavC5vyJvylrwt78i78p68Lx/Ih/KRfCyfyKfymXwuX8iX8pV8Ld/It/KdfC8/yI/yk/wsv8iv8pv8Ln+4wIUucjUXu7pruMQ1Xeparu0y13G5K1zpuq7n+m7ghnPDuxHciG4kN7IbxY3qRnOjuzHcmG4sN7Ybx43rxnPjuwnchG4iN7GbxE3qJnOTuynclG4qN7Wbxk3rpnPTuxncjG4mN7Obxc3qZnOzuzncnG4uN7ebx83r5nPzuwXcgm4ht7BbxC3qFnOLuyXckm4pt7Rbxi3rlnPLuxXcim4lt7Jb5eePJbeqWy1sXd2t8Y8/Ev85bk339/gVxt+aRW33f+C3qdy6bj23vtvAbeg2chu7Tf6BkU3/7tZmbvOf6i3clm6rX4hp7bZx27rt3PZuB7ej28nt7HZxu7rd3O5uD7en28vt/avy6PPrc/79uH3dfr8iqr87wB3oDnIHu0Pcoe4wd7g7wh3pjnJHu2Pcse44d7w7wZ3oTnInu1Pcqe40d7o7w53pznJnu3Pcue48d767wF3oLvo7e1jsLnGXusvc5e4Kd6W7yl3trnHXuuvcP/S7N+4Gd+PPWpvcze4Wd6u7zd3u7nB3urvc3e4ed6+7z93vHnAPuofcw+4R96h7zD3unnBPuqfc0+6Zn0afdc+5590L7kX30i/t63fL+bJ75V85v/K/lXvVveZed2+4N91b7m33jnvXvefedx+4D91H7mP3ifvUfeY+d1+4L91X7mv3TWjEW/ed+9794H50P7mf/+j8/2juF/er+8397v7wgAc95Gke9nTP8IhnetSzPNtjnuNxT3jScz3P873AC+eF9yJ4Eb1IXmQvihfVi+ZF92J4MX9pfi+WF9uL48X14nnxvQReQi+Rl9hL4iX1knnJvRReSi+Vl9pL46X10nnpvQxeRi+Tl9nL4mX1snnZvRxeTi+Xl9vL4+X18nn5vQJeQa+QV9gr4hX1innFvRJeSa+UV9or45X1ynnlf2HvFf7Fp+//HK/iX7QqhS0re1W8ql61v4qt/u/KSlEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVF+G6+GV9Or5dX26nh1vXpefa+B19Br5DX2mnhNvWZec6+F19Jr5bX22nhtvXZee6+D19Hr5HX2unhdvW5ed6+H19Pr5fX2+nh9vX5ef2+AN9Ab5A32hnhDvWHecG+EN9Ib5Y32xnhjvXHeeG+CN9Gb5E32pnhTvWne9D/6+BVFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+f8Pb4Y305vlzfbmeHO9ed58b4G30FvkLfaWeEu9Zd5yb4W30lvlrfbWeGu9dd56b4O30dvkbfa2eFu9bd52b4e309vl7fb2eHu9fd5+74B30DvkHfaOeEe9Y97xP/r4FOVPvBPeSe+Ud/qn9hnvbNj6nHc+bH3Bu+hd8i7/4tgr3lXvmnfdu+Hd9G55t7073l3vnnffe/BP5vLQe+Q99p78Rd9T71nY+rn34p+b9X8H76X3ynvtvfHeeu+8994H76P3yfvsffG+et+87z9F/fCBD33ka39q+djXfcMnvulT3/Jtn/nOf0b63Be+9F3f830/8MP54f0IfkQ/kh/Zj+JH9aP50f0YP8XG9GP5sf04flw/Xlg7vp/AT+gn8hP7ScLaSf1kfytvP7mfwk/pp/pHj9dP7afx0/rpftaT3s/gZ/Qz+Zn9LKFWVj/b3x2f3c/h5/Rz+bn9PH5eP5+f3y/gF/xHs/j38Qv5hf0iflG/mF/cL+GX/KPzURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+XfxS/ml/TJ+Wb+cX96v4Ff0K/mV/Sp+Vb+aX92v4df0a/m1/Tp+Xb+eX99v4Df0G/mN/+icld+P38Rv6jfzm//ReSiKoiiK8u/jt/Bb+q381n4bv63fzm/vd/A7+p38zn4Xv6vfze/u9/B7+r383n4fv6/fz+/vD/AH+oP8wf4Qf6g/zB/uj/BH+qP80f4Yf6w/LjTfeH+CP9Gf5E/2p/hT/Wn+dH+GP9Of5c/25/hz/Xn+fH+Bv9Bf5C/2l/hL/WX+cn/FH30OFEVR/lj+yj86A0VRFEVR/m/wV/mr/TX+Wn+dv97f8DejNvqb/M3+Fn/rz/q2+dv9Hf5Of5e/29/j7/X3+fv9A/5B/5B/2D/iH/WP+cf9E/5J/5R/2j/jn/XP+edDoy74F/1L/mX/Sqh+NVSu+ddDyxv+zdDyln/bv+Pf9e/59/0H/kP/kf84bE9P/Kf+M/+5/8J/6b/yX/tv/Lf+O/+9/8H/6H/yP/tf/K/+N/+7/yMAAQxQoAU40AMjIIEZ0MAK7IAFTsADEcjADbzAD4IgXBA+iBBEDCIFkYMoQdQgWhA9iBHEDGIFsYM4QdwgXhA/SBAkDBIFiYMkQdIgWZA8SBGkDFIFqYM0QdogXZA+yBBkDDIFmYMsQdafn60gW5A9yBHk/P2uUpAryB3kCfIG+YL8QYGgYFAoKBzqLRIU/SmiWFA8KBGUDEoFpX/VjGWCskG5oPzvl6OiKP/bBBWCikGloHJQJagaVAuqBzWCmkGtoHZQJ6gb1Avq/7fjGwQNg0bB/9j/CQdNgqZBs6B50CJUbxm0CloHbYK2QbugfdAh6Bh0CjoHXYKuQbege9Aj6Bn0CnoHfYK+Qb+gfzAgGBgMCgYHQ4KhwbBgeDAiGBmMCkYHY4KxwbhgfDAhmBhMCiYHU4KpwbRgejAjmBnMCmYHc4K5wbxgfrAgWBgsChYHS4KlwbJgebAiWBmsClYHa4K1wbpgfbAh2BhsCjYHW4KtwbZge7Aj2BnsCnYHe4K9wb5gf3AgOBgcCg4HR4KjwbHgeHAiOBmcCk4HZ4KzwbngfHAhuBhcCi4HV4KrwbXgenAjuBncCm4Hd4K7wb3gfvAgeBg8Ch4HT4KnwbPgefAieBm8Cl4Hb4K3wbvgfdjZ+fBHXx/l3y34GHwKPgdfgq9/av0/+/tE7Q==',\n  '_version_' => 6,\n);"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dejavu_sans_normal_da52e5b8c125dc4342e1d9c6baf20f36.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Book\nUniqueID DejaVu Sans\nFullName DejaVu Sans\nVersion Version 2.37\nPostScriptName DejaVuSans\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Book\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1021 -463 1793 1232\nStartCharMetrics 6253\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 401 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 780 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 361 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 531 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 684 ; N A ; G 36\nU 66 ; WX 686 ; N B ; G 37\nU 67 ; WX 698 ; N C ; G 38\nU 68 ; WX 770 ; N D ; G 39\nU 69 ; WX 632 ; N E ; G 40\nU 70 ; WX 575 ; N F ; G 41\nU 71 ; WX 775 ; N G ; G 42\nU 72 ; WX 752 ; N H ; G 43\nU 73 ; WX 295 ; N I ; G 44\nU 74 ; WX 295 ; N J ; G 45\nU 75 ; WX 656 ; N K ; G 46\nU 76 ; WX 557 ; N L ; G 47\nU 77 ; WX 863 ; N M ; G 48\nU 78 ; WX 748 ; N N ; G 49\nU 79 ; WX 787 ; N O ; G 50\nU 80 ; WX 603 ; N P ; G 51\nU 81 ; WX 787 ; N Q ; G 52\nU 82 ; WX 695 ; N R ; G 53\nU 83 ; WX 635 ; N S ; G 54\nU 84 ; WX 611 ; N T ; G 55\nU 85 ; WX 732 ; N U ; G 56\nU 86 ; WX 684 ; N V ; G 57\nU 87 ; WX 989 ; N W ; G 58\nU 88 ; WX 685 ; N X ; G 59\nU 89 ; WX 611 ; N Y ; G 60\nU 90 ; WX 685 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 613 ; N a ; G 68\nU 98 ; WX 635 ; N b ; G 69\nU 99 ; WX 550 ; N c ; G 70\nU 100 ; WX 635 ; N d ; G 71\nU 101 ; WX 615 ; N e ; G 72\nU 102 ; WX 352 ; N f ; G 73\nU 103 ; WX 635 ; N g ; G 74\nU 104 ; WX 634 ; N h ; G 75\nU 105 ; WX 278 ; N i ; G 76\nU 106 ; WX 278 ; N j ; G 77\nU 107 ; WX 579 ; N k ; G 78\nU 108 ; WX 278 ; N l ; G 79\nU 109 ; WX 974 ; N m ; G 80\nU 110 ; WX 634 ; N n ; G 81\nU 111 ; WX 612 ; N o ; G 82\nU 112 ; WX 635 ; N p ; G 83\nU 113 ; WX 635 ; N q ; G 84\nU 114 ; WX 411 ; N r ; G 85\nU 115 ; WX 521 ; N s ; G 86\nU 116 ; WX 392 ; N t ; G 87\nU 117 ; WX 634 ; N u ; G 88\nU 118 ; WX 592 ; N v ; G 89\nU 119 ; WX 818 ; N w ; G 90\nU 120 ; WX 592 ; N x ; G 91\nU 121 ; WX 592 ; N y ; G 92\nU 122 ; WX 525 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 401 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 471 ; N ordfeminine ; G 108\nU 171 ; WX 612 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 361 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 636 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 471 ; N ordmasculine ; G 124\nU 187 ; WX 612 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 531 ; N questiondown ; G 129\nU 192 ; WX 684 ; N Agrave ; G 130\nU 193 ; WX 684 ; N Aacute ; G 131\nU 194 ; WX 684 ; N Acircumflex ; G 132\nU 195 ; WX 684 ; N Atilde ; G 133\nU 196 ; WX 684 ; N Adieresis ; G 134\nU 197 ; WX 684 ; N Aring ; G 135\nU 198 ; WX 974 ; N AE ; G 136\nU 199 ; WX 698 ; N Ccedilla ; G 137\nU 200 ; WX 632 ; N Egrave ; G 138\nU 201 ; WX 632 ; N Eacute ; G 139\nU 202 ; WX 632 ; N Ecircumflex ; G 140\nU 203 ; WX 632 ; N Edieresis ; G 141\nU 204 ; WX 295 ; N Igrave ; G 142\nU 205 ; WX 295 ; N Iacute ; G 143\nU 206 ; WX 295 ; N Icircumflex ; G 144\nU 207 ; WX 295 ; N Idieresis ; G 145\nU 208 ; WX 775 ; N Eth ; G 146\nU 209 ; WX 748 ; N Ntilde ; G 147\nU 210 ; WX 787 ; N Ograve ; G 148\nU 211 ; WX 787 ; N Oacute ; G 149\nU 212 ; WX 787 ; N Ocircumflex ; G 150\nU 213 ; WX 787 ; N Otilde ; G 151\nU 214 ; WX 787 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 787 ; N Oslash ; G 154\nU 217 ; WX 732 ; N Ugrave ; G 155\nU 218 ; WX 732 ; N Uacute ; G 156\nU 219 ; WX 732 ; N Ucircumflex ; G 157\nU 220 ; WX 732 ; N Udieresis ; G 158\nU 221 ; WX 611 ; N Yacute ; G 159\nU 222 ; WX 605 ; N Thorn ; G 160\nU 223 ; WX 630 ; N germandbls ; G 161\nU 224 ; WX 613 ; N agrave ; G 162\nU 225 ; WX 613 ; N aacute ; G 163\nU 226 ; WX 613 ; N acircumflex ; G 164\nU 227 ; WX 613 ; N atilde ; G 165\nU 228 ; WX 613 ; N adieresis ; G 166\nU 229 ; WX 613 ; N aring ; G 167\nU 230 ; WX 982 ; N ae ; G 168\nU 231 ; WX 550 ; N ccedilla ; G 169\nU 232 ; WX 615 ; N egrave ; G 170\nU 233 ; WX 615 ; N eacute ; G 171\nU 234 ; WX 615 ; N ecircumflex ; G 172\nU 235 ; WX 615 ; N edieresis ; G 173\nU 236 ; WX 278 ; N igrave ; G 174\nU 237 ; WX 278 ; N iacute ; G 175\nU 238 ; WX 278 ; N icircumflex ; G 176\nU 239 ; WX 278 ; N idieresis ; G 177\nU 240 ; WX 612 ; N eth ; G 178\nU 241 ; WX 634 ; N ntilde ; G 179\nU 242 ; WX 612 ; N ograve ; G 180\nU 243 ; WX 612 ; N oacute ; G 181\nU 244 ; WX 612 ; N ocircumflex ; G 182\nU 245 ; WX 612 ; N otilde ; G 183\nU 246 ; WX 612 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 612 ; N oslash ; G 186\nU 249 ; WX 634 ; N ugrave ; G 187\nU 250 ; WX 634 ; N uacute ; G 188\nU 251 ; WX 634 ; N ucircumflex ; G 189\nU 252 ; WX 634 ; N udieresis ; G 190\nU 253 ; WX 592 ; N yacute ; G 191\nU 254 ; WX 635 ; N thorn ; G 192\nU 255 ; WX 592 ; N ydieresis ; G 193\nU 256 ; WX 684 ; N Amacron ; G 194\nU 257 ; WX 613 ; N amacron ; G 195\nU 258 ; WX 684 ; N Abreve ; G 196\nU 259 ; WX 613 ; N abreve ; G 197\nU 260 ; WX 684 ; N Aogonek ; G 198\nU 261 ; WX 613 ; N aogonek ; G 199\nU 262 ; WX 698 ; N Cacute ; G 200\nU 263 ; WX 550 ; N cacute ; G 201\nU 264 ; WX 698 ; N Ccircumflex ; G 202\nU 265 ; WX 550 ; N ccircumflex ; G 203\nU 266 ; WX 698 ; N Cdotaccent ; G 204\nU 267 ; WX 550 ; N cdotaccent ; G 205\nU 268 ; WX 698 ; N Ccaron ; G 206\nU 269 ; WX 550 ; N ccaron ; G 207\nU 270 ; WX 770 ; N Dcaron ; G 208\nU 271 ; WX 635 ; N dcaron ; G 209\nU 272 ; WX 775 ; N Dcroat ; G 210\nU 273 ; WX 635 ; N dmacron ; G 211\nU 274 ; WX 632 ; N Emacron ; G 212\nU 275 ; WX 615 ; N emacron ; G 213\nU 276 ; WX 632 ; N Ebreve ; G 214\nU 277 ; WX 615 ; N ebreve ; G 215\nU 278 ; WX 632 ; N Edotaccent ; G 216\nU 279 ; WX 615 ; N edotaccent ; G 217\nU 280 ; WX 632 ; N Eogonek ; G 218\nU 281 ; WX 615 ; N eogonek ; G 219\nU 282 ; WX 632 ; N Ecaron ; G 220\nU 283 ; WX 615 ; N ecaron ; G 221\nU 284 ; WX 775 ; N Gcircumflex ; G 222\nU 285 ; WX 635 ; N gcircumflex ; G 223\nU 286 ; WX 775 ; N Gbreve ; G 224\nU 287 ; WX 635 ; N gbreve ; G 225\nU 288 ; WX 775 ; N Gdotaccent ; G 226\nU 289 ; WX 635 ; N gdotaccent ; G 227\nU 290 ; WX 775 ; N Gcommaaccent ; G 228\nU 291 ; WX 635 ; N gcommaaccent ; G 229\nU 292 ; WX 752 ; N Hcircumflex ; G 230\nU 293 ; WX 634 ; N hcircumflex ; G 231\nU 294 ; WX 916 ; N Hbar ; G 232\nU 295 ; WX 695 ; N hbar ; G 233\nU 296 ; WX 295 ; N Itilde ; G 234\nU 297 ; WX 278 ; N itilde ; G 235\nU 298 ; WX 295 ; N Imacron ; G 236\nU 299 ; WX 278 ; N imacron ; G 237\nU 300 ; WX 295 ; N Ibreve ; G 238\nU 301 ; WX 278 ; N ibreve ; G 239\nU 302 ; WX 295 ; N Iogonek ; G 240\nU 303 ; WX 278 ; N iogonek ; G 241\nU 304 ; WX 295 ; N Idot ; G 242\nU 305 ; WX 278 ; N dotlessi ; G 243\nU 306 ; WX 590 ; N IJ ; G 244\nU 307 ; WX 556 ; N ij ; G 245\nU 308 ; WX 295 ; N Jcircumflex ; G 246\nU 309 ; WX 278 ; N jcircumflex ; G 247\nU 310 ; WX 656 ; N Kcommaaccent ; G 248\nU 311 ; WX 579 ; N kcommaaccent ; G 249\nU 312 ; WX 579 ; N kgreenlandic ; G 250\nU 313 ; WX 557 ; N Lacute ; G 251\nU 314 ; WX 278 ; N lacute ; G 252\nU 315 ; WX 557 ; N Lcommaaccent ; G 253\nU 316 ; WX 278 ; N lcommaaccent ; G 254\nU 317 ; WX 557 ; N Lcaron ; G 255\nU 318 ; WX 375 ; N lcaron ; G 256\nU 319 ; WX 557 ; N Ldot ; G 257\nU 320 ; WX 342 ; N ldot ; G 258\nU 321 ; WX 562 ; N Lslash ; G 259\nU 322 ; WX 284 ; N lslash ; G 260\nU 323 ; WX 748 ; N Nacute ; G 261\nU 324 ; WX 634 ; N nacute ; G 262\nU 325 ; WX 748 ; N Ncommaaccent ; G 263\nU 326 ; WX 634 ; N ncommaaccent ; G 264\nU 327 ; WX 748 ; N Ncaron ; G 265\nU 328 ; WX 634 ; N ncaron ; G 266\nU 329 ; WX 813 ; N napostrophe ; G 267\nU 330 ; WX 748 ; N Eng ; G 268\nU 331 ; WX 634 ; N eng ; G 269\nU 332 ; WX 787 ; N Omacron ; G 270\nU 333 ; WX 612 ; N omacron ; G 271\nU 334 ; WX 787 ; N Obreve ; G 272\nU 335 ; WX 612 ; N obreve ; G 273\nU 336 ; WX 787 ; N Ohungarumlaut ; G 274\nU 337 ; WX 612 ; N ohungarumlaut ; G 275\nU 338 ; WX 1070 ; N OE ; G 276\nU 339 ; WX 1023 ; N oe ; G 277\nU 340 ; WX 695 ; N Racute ; G 278\nU 341 ; WX 411 ; N racute ; G 279\nU 342 ; WX 695 ; N Rcommaaccent ; G 280\nU 343 ; WX 411 ; N rcommaaccent ; G 281\nU 344 ; WX 695 ; N Rcaron ; G 282\nU 345 ; WX 411 ; N rcaron ; G 283\nU 346 ; WX 635 ; N Sacute ; G 284\nU 347 ; WX 521 ; N sacute ; G 285\nU 348 ; WX 635 ; N Scircumflex ; G 286\nU 349 ; WX 521 ; N scircumflex ; G 287\nU 350 ; WX 635 ; N Scedilla ; G 288\nU 351 ; WX 521 ; N scedilla ; G 289\nU 352 ; WX 635 ; N Scaron ; G 290\nU 353 ; WX 521 ; N scaron ; G 291\nU 354 ; WX 611 ; N Tcommaaccent ; G 292\nU 355 ; WX 392 ; N tcommaaccent ; G 293\nU 356 ; WX 611 ; N Tcaron ; G 294\nU 357 ; WX 392 ; N tcaron ; G 295\nU 358 ; WX 611 ; N Tbar ; G 296\nU 359 ; WX 392 ; N tbar ; G 297\nU 360 ; WX 732 ; N Utilde ; G 298\nU 361 ; WX 634 ; N utilde ; G 299\nU 362 ; WX 732 ; N Umacron ; G 300\nU 363 ; WX 634 ; N umacron ; G 301\nU 364 ; WX 732 ; N Ubreve ; G 302\nU 365 ; WX 634 ; N ubreve ; G 303\nU 366 ; WX 732 ; N Uring ; G 304\nU 367 ; WX 634 ; N uring ; G 305\nU 368 ; WX 732 ; N Uhungarumlaut ; G 306\nU 369 ; WX 634 ; N uhungarumlaut ; G 307\nU 370 ; WX 732 ; N Uogonek ; G 308\nU 371 ; WX 634 ; N uogonek ; G 309\nU 372 ; WX 989 ; N Wcircumflex ; G 310\nU 373 ; WX 818 ; N wcircumflex ; G 311\nU 374 ; WX 611 ; N Ycircumflex ; G 312\nU 375 ; WX 592 ; N ycircumflex ; G 313\nU 376 ; WX 611 ; N Ydieresis ; G 314\nU 377 ; WX 685 ; N Zacute ; G 315\nU 378 ; WX 525 ; N zacute ; G 316\nU 379 ; WX 685 ; N Zdotaccent ; G 317\nU 380 ; WX 525 ; N zdotaccent ; G 318\nU 381 ; WX 685 ; N Zcaron ; G 319\nU 382 ; WX 525 ; N zcaron ; G 320\nU 383 ; WX 352 ; N longs ; G 321\nU 384 ; WX 635 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 686 ; N uni0182 ; G 324\nU 387 ; WX 635 ; N uni0183 ; G 325\nU 388 ; WX 686 ; N uni0184 ; G 326\nU 389 ; WX 635 ; N uni0185 ; G 327\nU 390 ; WX 703 ; N uni0186 ; G 328\nU 391 ; WX 698 ; N uni0187 ; G 329\nU 392 ; WX 550 ; N uni0188 ; G 330\nU 393 ; WX 775 ; N uni0189 ; G 331\nU 394 ; WX 819 ; N uni018A ; G 332\nU 395 ; WX 686 ; N uni018B ; G 333\nU 396 ; WX 635 ; N uni018C ; G 334\nU 397 ; WX 612 ; N uni018D ; G 335\nU 398 ; WX 632 ; N uni018E ; G 336\nU 399 ; WX 787 ; N uni018F ; G 337\nU 400 ; WX 614 ; N uni0190 ; G 338\nU 401 ; WX 575 ; N uni0191 ; G 339\nU 402 ; WX 352 ; N florin ; G 340\nU 403 ; WX 775 ; N uni0193 ; G 341\nU 404 ; WX 687 ; N uni0194 ; G 342\nU 405 ; WX 984 ; N uni0195 ; G 343\nU 406 ; WX 354 ; N uni0196 ; G 344\nU 407 ; WX 295 ; N uni0197 ; G 345\nU 408 ; WX 746 ; N uni0198 ; G 346\nU 409 ; WX 579 ; N uni0199 ; G 347\nU 410 ; WX 278 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 974 ; N uni019C ; G 350\nU 413 ; WX 748 ; N uni019D ; G 351\nU 414 ; WX 634 ; N uni019E ; G 352\nU 415 ; WX 787 ; N uni019F ; G 353\nU 416 ; WX 913 ; N Ohorn ; G 354\nU 417 ; WX 612 ; N ohorn ; G 355\nU 418 ; WX 949 ; N uni01A2 ; G 356\nU 419 ; WX 759 ; N uni01A3 ; G 357\nU 420 ; WX 652 ; N uni01A4 ; G 358\nU 421 ; WX 635 ; N uni01A5 ; G 359\nU 422 ; WX 695 ; N uni01A6 ; G 360\nU 423 ; WX 635 ; N uni01A7 ; G 361\nU 424 ; WX 521 ; N uni01A8 ; G 362\nU 425 ; WX 632 ; N uni01A9 ; G 363\nU 426 ; WX 336 ; N uni01AA ; G 364\nU 427 ; WX 392 ; N uni01AB ; G 365\nU 428 ; WX 611 ; N uni01AC ; G 366\nU 429 ; WX 392 ; N uni01AD ; G 367\nU 430 ; WX 611 ; N uni01AE ; G 368\nU 431 ; WX 858 ; N Uhorn ; G 369\nU 432 ; WX 634 ; N uhorn ; G 370\nU 433 ; WX 764 ; N uni01B1 ; G 371\nU 434 ; WX 721 ; N uni01B2 ; G 372\nU 435 ; WX 744 ; N uni01B3 ; G 373\nU 436 ; WX 730 ; N uni01B4 ; G 374\nU 437 ; WX 685 ; N uni01B5 ; G 375\nU 438 ; WX 525 ; N uni01B6 ; G 376\nU 439 ; WX 666 ; N uni01B7 ; G 377\nU 440 ; WX 666 ; N uni01B8 ; G 378\nU 441 ; WX 578 ; N uni01B9 ; G 379\nU 442 ; WX 525 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 666 ; N uni01BC ; G 382\nU 445 ; WX 578 ; N uni01BD ; G 383\nU 446 ; WX 510 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1422 ; N uni01C4 ; G 390\nU 453 ; WX 1299 ; N uni01C5 ; G 391\nU 454 ; WX 1154 ; N uni01C6 ; G 392\nU 455 ; WX 835 ; N uni01C7 ; G 393\nU 456 ; WX 787 ; N uni01C8 ; G 394\nU 457 ; WX 457 ; N uni01C9 ; G 395\nU 458 ; WX 931 ; N uni01CA ; G 396\nU 459 ; WX 924 ; N uni01CB ; G 397\nU 460 ; WX 797 ; N uni01CC ; G 398\nU 461 ; WX 684 ; N uni01CD ; G 399\nU 462 ; WX 613 ; N uni01CE ; G 400\nU 463 ; WX 295 ; N uni01CF ; G 401\nU 464 ; WX 278 ; N uni01D0 ; G 402\nU 465 ; WX 787 ; N uni01D1 ; G 403\nU 466 ; WX 612 ; N uni01D2 ; G 404\nU 467 ; WX 732 ; N uni01D3 ; G 405\nU 468 ; WX 634 ; N uni01D4 ; G 406\nU 469 ; WX 732 ; N uni01D5 ; G 407\nU 470 ; WX 634 ; N uni01D6 ; G 408\nU 471 ; WX 732 ; N uni01D7 ; G 409\nU 472 ; WX 634 ; N uni01D8 ; G 410\nU 473 ; WX 732 ; N uni01D9 ; G 411\nU 474 ; WX 634 ; N uni01DA ; G 412\nU 475 ; WX 732 ; N uni01DB ; G 413\nU 476 ; WX 634 ; N uni01DC ; G 414\nU 477 ; WX 615 ; N uni01DD ; G 415\nU 478 ; WX 684 ; N uni01DE ; G 416\nU 479 ; WX 613 ; N uni01DF ; G 417\nU 480 ; WX 684 ; N uni01E0 ; G 418\nU 481 ; WX 613 ; N uni01E1 ; G 419\nU 482 ; WX 974 ; N uni01E2 ; G 420\nU 483 ; WX 982 ; N uni01E3 ; G 421\nU 484 ; WX 775 ; N uni01E4 ; G 422\nU 485 ; WX 635 ; N uni01E5 ; G 423\nU 486 ; WX 775 ; N Gcaron ; G 424\nU 487 ; WX 635 ; N gcaron ; G 425\nU 488 ; WX 656 ; N uni01E8 ; G 426\nU 489 ; WX 579 ; N uni01E9 ; G 427\nU 490 ; WX 787 ; N uni01EA ; G 428\nU 491 ; WX 612 ; N uni01EB ; G 429\nU 492 ; WX 787 ; N uni01EC ; G 430\nU 493 ; WX 612 ; N uni01ED ; G 431\nU 494 ; WX 666 ; N uni01EE ; G 432\nU 495 ; WX 578 ; N uni01EF ; G 433\nU 496 ; WX 278 ; N uni01F0 ; G 434\nU 497 ; WX 1422 ; N uni01F1 ; G 435\nU 498 ; WX 1299 ; N uni01F2 ; G 436\nU 499 ; WX 1154 ; N uni01F3 ; G 437\nU 500 ; WX 775 ; N uni01F4 ; G 438\nU 501 ; WX 635 ; N uni01F5 ; G 439\nU 502 ; WX 1113 ; N uni01F6 ; G 440\nU 503 ; WX 682 ; N uni01F7 ; G 441\nU 504 ; WX 748 ; N uni01F8 ; G 442\nU 505 ; WX 634 ; N uni01F9 ; G 443\nU 506 ; WX 684 ; N Aringacute ; G 444\nU 507 ; WX 613 ; N aringacute ; G 445\nU 508 ; WX 974 ; N AEacute ; G 446\nU 509 ; WX 982 ; N aeacute ; G 447\nU 510 ; WX 787 ; N Oslashacute ; G 448\nU 511 ; WX 612 ; N oslashacute ; G 449\nU 512 ; WX 684 ; N uni0200 ; G 450\nU 513 ; WX 613 ; N uni0201 ; G 451\nU 514 ; WX 684 ; N uni0202 ; G 452\nU 515 ; WX 613 ; N uni0203 ; G 453\nU 516 ; WX 632 ; N uni0204 ; G 454\nU 517 ; WX 615 ; N uni0205 ; G 455\nU 518 ; WX 632 ; N uni0206 ; G 456\nU 519 ; WX 615 ; N uni0207 ; G 457\nU 520 ; WX 295 ; N uni0208 ; G 458\nU 521 ; WX 278 ; N uni0209 ; G 459\nU 522 ; WX 295 ; N uni020A ; G 460\nU 523 ; WX 278 ; N uni020B ; G 461\nU 524 ; WX 787 ; N uni020C ; G 462\nU 525 ; WX 612 ; N uni020D ; G 463\nU 526 ; WX 787 ; N uni020E ; G 464\nU 527 ; WX 612 ; N uni020F ; G 465\nU 528 ; WX 695 ; N uni0210 ; G 466\nU 529 ; WX 411 ; N uni0211 ; G 467\nU 530 ; WX 695 ; N uni0212 ; G 468\nU 531 ; WX 411 ; N uni0213 ; G 469\nU 532 ; WX 732 ; N uni0214 ; G 470\nU 533 ; WX 634 ; N uni0215 ; G 471\nU 534 ; WX 732 ; N uni0216 ; G 472\nU 535 ; WX 634 ; N uni0217 ; G 473\nU 536 ; WX 635 ; N Scommaaccent ; G 474\nU 537 ; WX 521 ; N scommaaccent ; G 475\nU 538 ; WX 611 ; N uni021A ; G 476\nU 539 ; WX 392 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 752 ; N uni021E ; G 480\nU 543 ; WX 634 ; N uni021F ; G 481\nU 544 ; WX 735 ; N uni0220 ; G 482\nU 545 ; WX 838 ; N uni0221 ; G 483\nU 546 ; WX 698 ; N uni0222 ; G 484\nU 547 ; WX 610 ; N uni0223 ; G 485\nU 548 ; WX 685 ; N uni0224 ; G 486\nU 549 ; WX 525 ; N uni0225 ; G 487\nU 550 ; WX 684 ; N uni0226 ; G 488\nU 551 ; WX 613 ; N uni0227 ; G 489\nU 552 ; WX 632 ; N uni0228 ; G 490\nU 553 ; WX 615 ; N uni0229 ; G 491\nU 554 ; WX 787 ; N uni022A ; G 492\nU 555 ; WX 612 ; N uni022B ; G 493\nU 556 ; WX 787 ; N uni022C ; G 494\nU 557 ; WX 612 ; N uni022D ; G 495\nU 558 ; WX 787 ; N uni022E ; G 496\nU 559 ; WX 612 ; N uni022F ; G 497\nU 560 ; WX 787 ; N uni0230 ; G 498\nU 561 ; WX 612 ; N uni0231 ; G 499\nU 562 ; WX 611 ; N uni0232 ; G 500\nU 563 ; WX 592 ; N uni0233 ; G 501\nU 564 ; WX 475 ; N uni0234 ; G 502\nU 565 ; WX 843 ; N uni0235 ; G 503\nU 566 ; WX 477 ; N uni0236 ; G 504\nU 567 ; WX 278 ; N dotlessj ; G 505\nU 568 ; WX 998 ; N uni0238 ; G 506\nU 569 ; WX 998 ; N uni0239 ; G 507\nU 570 ; WX 684 ; N uni023A ; G 508\nU 571 ; WX 698 ; N uni023B ; G 509\nU 572 ; WX 550 ; N uni023C ; G 510\nU 573 ; WX 557 ; N uni023D ; G 511\nU 574 ; WX 611 ; N uni023E ; G 512\nU 575 ; WX 521 ; N uni023F ; G 513\nU 576 ; WX 525 ; N uni0240 ; G 514\nU 577 ; WX 603 ; N uni0241 ; G 515\nU 578 ; WX 479 ; N uni0242 ; G 516\nU 579 ; WX 686 ; N uni0243 ; G 517\nU 580 ; WX 732 ; N uni0244 ; G 518\nU 581 ; WX 684 ; N uni0245 ; G 519\nU 582 ; WX 632 ; N uni0246 ; G 520\nU 583 ; WX 615 ; N uni0247 ; G 521\nU 584 ; WX 295 ; N uni0248 ; G 522\nU 585 ; WX 278 ; N uni0249 ; G 523\nU 586 ; WX 781 ; N uni024A ; G 524\nU 587 ; WX 635 ; N uni024B ; G 525\nU 588 ; WX 695 ; N uni024C ; G 526\nU 589 ; WX 411 ; N uni024D ; G 527\nU 590 ; WX 611 ; N uni024E ; G 528\nU 591 ; WX 592 ; N uni024F ; G 529\nU 592 ; WX 600 ; N uni0250 ; G 530\nU 593 ; WX 635 ; N uni0251 ; G 531\nU 594 ; WX 635 ; N uni0252 ; G 532\nU 595 ; WX 635 ; N uni0253 ; G 533\nU 596 ; WX 549 ; N uni0254 ; G 534\nU 597 ; WX 550 ; N uni0255 ; G 535\nU 598 ; WX 635 ; N uni0256 ; G 536\nU 599 ; WX 696 ; N uni0257 ; G 537\nU 600 ; WX 615 ; N uni0258 ; G 538\nU 601 ; WX 615 ; N uni0259 ; G 539\nU 602 ; WX 819 ; N uni025A ; G 540\nU 603 ; WX 541 ; N uni025B ; G 541\nU 604 ; WX 532 ; N uni025C ; G 542\nU 605 ; WX 775 ; N uni025D ; G 543\nU 606 ; WX 664 ; N uni025E ; G 544\nU 607 ; WX 278 ; N uni025F ; G 545\nU 608 ; WX 696 ; N uni0260 ; G 546\nU 609 ; WX 635 ; N uni0261 ; G 547\nU 610 ; WX 629 ; N uni0262 ; G 548\nU 611 ; WX 596 ; N uni0263 ; G 549\nU 612 ; WX 596 ; N uni0264 ; G 550\nU 613 ; WX 634 ; N uni0265 ; G 551\nU 614 ; WX 634 ; N uni0266 ; G 552\nU 615 ; WX 634 ; N uni0267 ; G 553\nU 616 ; WX 278 ; N uni0268 ; G 554\nU 617 ; WX 338 ; N uni0269 ; G 555\nU 618 ; WX 372 ; N uni026A ; G 556\nU 619 ; WX 396 ; N uni026B ; G 557\nU 620 ; WX 487 ; N uni026C ; G 558\nU 621 ; WX 278 ; N uni026D ; G 559\nU 622 ; WX 706 ; N uni026E ; G 560\nU 623 ; WX 974 ; N uni026F ; G 561\nU 624 ; WX 974 ; N uni0270 ; G 562\nU 625 ; WX 974 ; N uni0271 ; G 563\nU 626 ; WX 646 ; N uni0272 ; G 564\nU 627 ; WX 642 ; N uni0273 ; G 565\nU 628 ; WX 634 ; N uni0274 ; G 566\nU 629 ; WX 612 ; N uni0275 ; G 567\nU 630 ; WX 858 ; N uni0276 ; G 568\nU 631 ; WX 728 ; N uni0277 ; G 569\nU 632 ; WX 660 ; N uni0278 ; G 570\nU 633 ; WX 414 ; N uni0279 ; G 571\nU 634 ; WX 414 ; N uni027A ; G 572\nU 635 ; WX 414 ; N uni027B ; G 573\nU 636 ; WX 411 ; N uni027C ; G 574\nU 637 ; WX 411 ; N uni027D ; G 575\nU 638 ; WX 530 ; N uni027E ; G 576\nU 639 ; WX 530 ; N uni027F ; G 577\nU 640 ; WX 604 ; N uni0280 ; G 578\nU 641 ; WX 604 ; N uni0281 ; G 579\nU 642 ; WX 521 ; N uni0282 ; G 580\nU 643 ; WX 336 ; N uni0283 ; G 581\nU 644 ; WX 336 ; N uni0284 ; G 582\nU 645 ; WX 461 ; N uni0285 ; G 583\nU 646 ; WX 336 ; N uni0286 ; G 584\nU 647 ; WX 392 ; N uni0287 ; G 585\nU 648 ; WX 392 ; N uni0288 ; G 586\nU 649 ; WX 634 ; N uni0289 ; G 587\nU 650 ; WX 618 ; N uni028A ; G 588\nU 651 ; WX 598 ; N uni028B ; G 589\nU 652 ; WX 592 ; N uni028C ; G 590\nU 653 ; WX 818 ; N uni028D ; G 591\nU 654 ; WX 592 ; N uni028E ; G 592\nU 655 ; WX 611 ; N uni028F ; G 593\nU 656 ; WX 525 ; N uni0290 ; G 594\nU 657 ; WX 525 ; N uni0291 ; G 595\nU 658 ; WX 578 ; N uni0292 ; G 596\nU 659 ; WX 578 ; N uni0293 ; G 597\nU 660 ; WX 510 ; N uni0294 ; G 598\nU 661 ; WX 510 ; N uni0295 ; G 599\nU 662 ; WX 510 ; N uni0296 ; G 600\nU 663 ; WX 510 ; N uni0297 ; G 601\nU 664 ; WX 787 ; N uni0298 ; G 602\nU 665 ; WX 580 ; N uni0299 ; G 603\nU 666 ; WX 664 ; N uni029A ; G 604\nU 667 ; WX 708 ; N uni029B ; G 605\nU 668 ; WX 654 ; N uni029C ; G 606\nU 669 ; WX 292 ; N uni029D ; G 607\nU 670 ; WX 667 ; N uni029E ; G 608\nU 671 ; WX 507 ; N uni029F ; G 609\nU 672 ; WX 727 ; N uni02A0 ; G 610\nU 673 ; WX 510 ; N uni02A1 ; G 611\nU 674 ; WX 510 ; N uni02A2 ; G 612\nU 675 ; WX 1014 ; N uni02A3 ; G 613\nU 676 ; WX 1058 ; N uni02A4 ; G 614\nU 677 ; WX 1013 ; N uni02A5 ; G 615\nU 678 ; WX 830 ; N uni02A6 ; G 616\nU 679 ; WX 610 ; N uni02A7 ; G 617\nU 680 ; WX 778 ; N uni02A8 ; G 618\nU 681 ; WX 848 ; N uni02A9 ; G 619\nU 682 ; WX 706 ; N uni02AA ; G 620\nU 683 ; WX 654 ; N uni02AB ; G 621\nU 684 ; WX 515 ; N uni02AC ; G 622\nU 685 ; WX 515 ; N uni02AD ; G 623\nU 686 ; WX 661 ; N uni02AE ; G 624\nU 687 ; WX 664 ; N uni02AF ; G 625\nU 688 ; WX 404 ; N uni02B0 ; G 626\nU 689 ; WX 399 ; N uni02B1 ; G 627\nU 690 ; WX 175 ; N uni02B2 ; G 628\nU 691 ; WX 259 ; N uni02B3 ; G 629\nU 692 ; WX 295 ; N uni02B4 ; G 630\nU 693 ; WX 296 ; N uni02B5 ; G 631\nU 694 ; WX 379 ; N uni02B6 ; G 632\nU 695 ; WX 515 ; N uni02B7 ; G 633\nU 696 ; WX 373 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 370 ; N uni02C0 ; G 642\nU 705 ; WX 370 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 275 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 275 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 307 ; N uni02D2 ; G 660\nU 723 ; WX 307 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 390 ; N uni02D6 ; G 664\nU 727 ; WX 317 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 315 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 426 ; N uni02E0 ; G 674\nU 737 ; WX 166 ; N uni02E1 ; G 675\nU 738 ; WX 373 ; N uni02E2 ; G 676\nU 739 ; WX 444 ; N uni02E3 ; G 677\nU 740 ; WX 370 ; N uni02E4 ; G 678\nU 741 ; WX 493 ; N uni02E5 ; G 679\nU 742 ; WX 493 ; N uni02E6 ; G 680\nU 743 ; WX 493 ; N uni02E7 ; G 681\nU 744 ; WX 493 ; N uni02E8 ; G 682\nU 745 ; WX 493 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 518 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 654 ; N uni0370 ; G 782\nU 881 ; WX 568 ; N uni0371 ; G 783\nU 882 ; WX 862 ; N uni0372 ; G 784\nU 883 ; WX 647 ; N uni0373 ; G 785\nU 884 ; WX 278 ; N uni0374 ; G 786\nU 885 ; WX 278 ; N uni0375 ; G 787\nU 886 ; WX 748 ; N uni0376 ; G 788\nU 887 ; WX 650 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 549 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 337 ; N uni037E ; G 794\nU 895 ; WX 295 ; N uni037F ; G 795\nU 900 ; WX 500 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 692 ; N Alphatonos ; G 798\nU 903 ; WX 318 ; N anoteleia ; G 799\nU 904 ; WX 746 ; N Epsilontonos ; G 800\nU 905 ; WX 871 ; N Etatonos ; G 801\nU 906 ; WX 408 ; N Iotatonos ; G 802\nU 908 ; WX 813 ; N Omicrontonos ; G 803\nU 910 ; WX 825 ; N Upsilontonos ; G 804\nU 911 ; WX 826 ; N Omegatonos ; G 805\nU 912 ; WX 338 ; N iotadieresistonos ; G 806\nU 913 ; WX 684 ; N Alpha ; G 807\nU 914 ; WX 686 ; N Beta ; G 808\nU 915 ; WX 557 ; N Gamma ; G 809\nU 916 ; WX 684 ; N uni0394 ; G 810\nU 917 ; WX 632 ; N Epsilon ; G 811\nU 918 ; WX 685 ; N Zeta ; G 812\nU 919 ; WX 752 ; N Eta ; G 813\nU 920 ; WX 787 ; N Theta ; G 814\nU 921 ; WX 295 ; N Iota ; G 815\nU 922 ; WX 656 ; N Kappa ; G 816\nU 923 ; WX 684 ; N Lambda ; G 817\nU 924 ; WX 863 ; N Mu ; G 818\nU 925 ; WX 748 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 787 ; N Omicron ; G 821\nU 928 ; WX 752 ; N Pi ; G 822\nU 929 ; WX 603 ; N Rho ; G 823\nU 931 ; WX 632 ; N Sigma ; G 824\nU 932 ; WX 611 ; N Tau ; G 825\nU 933 ; WX 611 ; N Upsilon ; G 826\nU 934 ; WX 787 ; N Phi ; G 827\nU 935 ; WX 685 ; N Chi ; G 828\nU 936 ; WX 787 ; N Psi ; G 829\nU 937 ; WX 764 ; N Omega ; G 830\nU 938 ; WX 295 ; N Iotadieresis ; G 831\nU 939 ; WX 611 ; N Upsilondieresis ; G 832\nU 940 ; WX 659 ; N alphatonos ; G 833\nU 941 ; WX 541 ; N epsilontonos ; G 834\nU 942 ; WX 634 ; N etatonos ; G 835\nU 943 ; WX 338 ; N iotatonos ; G 836\nU 944 ; WX 579 ; N upsilondieresistonos ; G 837\nU 945 ; WX 659 ; N alpha ; G 838\nU 946 ; WX 638 ; N beta ; G 839\nU 947 ; WX 592 ; N gamma ; G 840\nU 948 ; WX 612 ; N delta ; G 841\nU 949 ; WX 541 ; N epsilon ; G 842\nU 950 ; WX 544 ; N zeta ; G 843\nU 951 ; WX 634 ; N eta ; G 844\nU 952 ; WX 612 ; N theta ; G 845\nU 953 ; WX 338 ; N iota ; G 846\nU 954 ; WX 589 ; N kappa ; G 847\nU 955 ; WX 592 ; N lambda ; G 848\nU 956 ; WX 636 ; N uni03BC ; G 849\nU 957 ; WX 559 ; N nu ; G 850\nU 958 ; WX 558 ; N xi ; G 851\nU 959 ; WX 612 ; N omicron ; G 852\nU 960 ; WX 602 ; N pi ; G 853\nU 961 ; WX 635 ; N rho ; G 854\nU 962 ; WX 587 ; N sigma1 ; G 855\nU 963 ; WX 634 ; N sigma ; G 856\nU 964 ; WX 602 ; N tau ; G 857\nU 965 ; WX 579 ; N upsilon ; G 858\nU 966 ; WX 660 ; N phi ; G 859\nU 967 ; WX 578 ; N chi ; G 860\nU 968 ; WX 660 ; N psi ; G 861\nU 969 ; WX 837 ; N omega ; G 862\nU 970 ; WX 338 ; N iotadieresis ; G 863\nU 971 ; WX 579 ; N upsilondieresis ; G 864\nU 972 ; WX 612 ; N omicrontonos ; G 865\nU 973 ; WX 579 ; N upsilontonos ; G 866\nU 974 ; WX 837 ; N omegatonos ; G 867\nU 975 ; WX 656 ; N uni03CF ; G 868\nU 976 ; WX 614 ; N uni03D0 ; G 869\nU 977 ; WX 619 ; N theta1 ; G 870\nU 978 ; WX 699 ; N Upsilon1 ; G 871\nU 979 ; WX 842 ; N uni03D3 ; G 872\nU 980 ; WX 699 ; N uni03D4 ; G 873\nU 981 ; WX 660 ; N phi1 ; G 874\nU 982 ; WX 837 ; N omega1 ; G 875\nU 983 ; WX 664 ; N uni03D7 ; G 876\nU 984 ; WX 787 ; N uni03D8 ; G 877\nU 985 ; WX 612 ; N uni03D9 ; G 878\nU 986 ; WX 648 ; N uni03DA ; G 879\nU 987 ; WX 587 ; N uni03DB ; G 880\nU 988 ; WX 575 ; N uni03DC ; G 881\nU 989 ; WX 458 ; N uni03DD ; G 882\nU 990 ; WX 660 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 865 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 934 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 758 ; N uni03E4 ; G 889\nU 997 ; WX 659 ; N uni03E5 ; G 890\nU 998 ; WX 792 ; N uni03E6 ; G 891\nU 999 ; WX 615 ; N uni03E7 ; G 892\nU 1000 ; WX 687 ; N uni03E8 ; G 893\nU 1001 ; WX 607 ; N uni03E9 ; G 894\nU 1002 ; WX 768 ; N uni03EA ; G 895\nU 1003 ; WX 625 ; N uni03EB ; G 896\nU 1004 ; WX 699 ; N uni03EC ; G 897\nU 1005 ; WX 612 ; N uni03ED ; G 898\nU 1006 ; WX 611 ; N uni03EE ; G 899\nU 1007 ; WX 536 ; N uni03EF ; G 900\nU 1008 ; WX 664 ; N uni03F0 ; G 901\nU 1009 ; WX 635 ; N uni03F1 ; G 902\nU 1010 ; WX 550 ; N uni03F2 ; G 903\nU 1011 ; WX 278 ; N uni03F3 ; G 904\nU 1012 ; WX 787 ; N uni03F4 ; G 905\nU 1013 ; WX 615 ; N uni03F5 ; G 906\nU 1014 ; WX 615 ; N uni03F6 ; G 907\nU 1015 ; WX 605 ; N uni03F7 ; G 908\nU 1016 ; WX 635 ; N uni03F8 ; G 909\nU 1017 ; WX 698 ; N uni03F9 ; G 910\nU 1018 ; WX 863 ; N uni03FA ; G 911\nU 1019 ; WX 651 ; N uni03FB ; G 912\nU 1020 ; WX 635 ; N uni03FC ; G 913\nU 1021 ; WX 703 ; N uni03FD ; G 914\nU 1022 ; WX 698 ; N uni03FE ; G 915\nU 1023 ; WX 703 ; N uni03FF ; G 916\nU 1024 ; WX 632 ; N uni0400 ; G 917\nU 1025 ; WX 632 ; N uni0401 ; G 918\nU 1026 ; WX 786 ; N uni0402 ; G 919\nU 1027 ; WX 610 ; N uni0403 ; G 920\nU 1028 ; WX 698 ; N uni0404 ; G 921\nU 1029 ; WX 635 ; N uni0405 ; G 922\nU 1030 ; WX 295 ; N uni0406 ; G 923\nU 1031 ; WX 295 ; N uni0407 ; G 924\nU 1032 ; WX 295 ; N uni0408 ; G 925\nU 1033 ; WX 1094 ; N uni0409 ; G 926\nU 1034 ; WX 1045 ; N uni040A ; G 927\nU 1035 ; WX 786 ; N uni040B ; G 928\nU 1036 ; WX 710 ; N uni040C ; G 929\nU 1037 ; WX 748 ; N uni040D ; G 930\nU 1038 ; WX 609 ; N uni040E ; G 931\nU 1039 ; WX 752 ; N uni040F ; G 932\nU 1040 ; WX 684 ; N uni0410 ; G 933\nU 1041 ; WX 686 ; N uni0411 ; G 934\nU 1042 ; WX 686 ; N uni0412 ; G 935\nU 1043 ; WX 610 ; N uni0413 ; G 936\nU 1044 ; WX 781 ; N uni0414 ; G 937\nU 1045 ; WX 632 ; N uni0415 ; G 938\nU 1046 ; WX 1077 ; N uni0416 ; G 939\nU 1047 ; WX 641 ; N uni0417 ; G 940\nU 1048 ; WX 748 ; N uni0418 ; G 941\nU 1049 ; WX 748 ; N uni0419 ; G 942\nU 1050 ; WX 710 ; N uni041A ; G 943\nU 1051 ; WX 752 ; N uni041B ; G 944\nU 1052 ; WX 863 ; N uni041C ; G 945\nU 1053 ; WX 752 ; N uni041D ; G 946\nU 1054 ; WX 787 ; N uni041E ; G 947\nU 1055 ; WX 752 ; N uni041F ; G 948\nU 1056 ; WX 603 ; N uni0420 ; G 949\nU 1057 ; WX 698 ; N uni0421 ; G 950\nU 1058 ; WX 611 ; N uni0422 ; G 951\nU 1059 ; WX 609 ; N uni0423 ; G 952\nU 1060 ; WX 861 ; N uni0424 ; G 953\nU 1061 ; WX 685 ; N uni0425 ; G 954\nU 1062 ; WX 776 ; N uni0426 ; G 955\nU 1063 ; WX 686 ; N uni0427 ; G 956\nU 1064 ; WX 1069 ; N uni0428 ; G 957\nU 1065 ; WX 1094 ; N uni0429 ; G 958\nU 1066 ; WX 833 ; N uni042A ; G 959\nU 1067 ; WX 882 ; N uni042B ; G 960\nU 1068 ; WX 686 ; N uni042C ; G 961\nU 1069 ; WX 698 ; N uni042D ; G 962\nU 1070 ; WX 1080 ; N uni042E ; G 963\nU 1071 ; WX 695 ; N uni042F ; G 964\nU 1072 ; WX 613 ; N uni0430 ; G 965\nU 1073 ; WX 617 ; N uni0431 ; G 966\nU 1074 ; WX 589 ; N uni0432 ; G 967\nU 1075 ; WX 525 ; N uni0433 ; G 968\nU 1076 ; WX 691 ; N uni0434 ; G 969\nU 1077 ; WX 615 ; N uni0435 ; G 970\nU 1078 ; WX 901 ; N uni0436 ; G 971\nU 1079 ; WX 532 ; N uni0437 ; G 972\nU 1080 ; WX 650 ; N uni0438 ; G 973\nU 1081 ; WX 650 ; N uni0439 ; G 974\nU 1082 ; WX 604 ; N uni043A ; G 975\nU 1083 ; WX 639 ; N uni043B ; G 976\nU 1084 ; WX 754 ; N uni043C ; G 977\nU 1085 ; WX 654 ; N uni043D ; G 978\nU 1086 ; WX 612 ; N uni043E ; G 979\nU 1087 ; WX 654 ; N uni043F ; G 980\nU 1088 ; WX 635 ; N uni0440 ; G 981\nU 1089 ; WX 550 ; N uni0441 ; G 982\nU 1090 ; WX 583 ; N uni0442 ; G 983\nU 1091 ; WX 592 ; N uni0443 ; G 984\nU 1092 ; WX 855 ; N uni0444 ; G 985\nU 1093 ; WX 592 ; N uni0445 ; G 986\nU 1094 ; WX 681 ; N uni0446 ; G 987\nU 1095 ; WX 591 ; N uni0447 ; G 988\nU 1096 ; WX 915 ; N uni0448 ; G 989\nU 1097 ; WX 942 ; N uni0449 ; G 990\nU 1098 ; WX 707 ; N uni044A ; G 991\nU 1099 ; WX 790 ; N uni044B ; G 992\nU 1100 ; WX 589 ; N uni044C ; G 993\nU 1101 ; WX 549 ; N uni044D ; G 994\nU 1102 ; WX 842 ; N uni044E ; G 995\nU 1103 ; WX 602 ; N uni044F ; G 996\nU 1104 ; WX 615 ; N uni0450 ; G 997\nU 1105 ; WX 615 ; N uni0451 ; G 998\nU 1106 ; WX 625 ; N uni0452 ; G 999\nU 1107 ; WX 525 ; N uni0453 ; G 1000\nU 1108 ; WX 549 ; N uni0454 ; G 1001\nU 1109 ; WX 521 ; N uni0455 ; G 1002\nU 1110 ; WX 278 ; N uni0456 ; G 1003\nU 1111 ; WX 278 ; N uni0457 ; G 1004\nU 1112 ; WX 278 ; N uni0458 ; G 1005\nU 1113 ; WX 902 ; N uni0459 ; G 1006\nU 1114 ; WX 898 ; N uni045A ; G 1007\nU 1115 ; WX 652 ; N uni045B ; G 1008\nU 1116 ; WX 604 ; N uni045C ; G 1009\nU 1117 ; WX 650 ; N uni045D ; G 1010\nU 1118 ; WX 592 ; N uni045E ; G 1011\nU 1119 ; WX 654 ; N uni045F ; G 1012\nU 1120 ; WX 934 ; N uni0460 ; G 1013\nU 1121 ; WX 837 ; N uni0461 ; G 1014\nU 1122 ; WX 771 ; N uni0462 ; G 1015\nU 1123 ; WX 672 ; N uni0463 ; G 1016\nU 1124 ; WX 942 ; N uni0464 ; G 1017\nU 1125 ; WX 749 ; N uni0465 ; G 1018\nU 1126 ; WX 879 ; N uni0466 ; G 1019\nU 1127 ; WX 783 ; N uni0467 ; G 1020\nU 1128 ; WX 1160 ; N uni0468 ; G 1021\nU 1129 ; WX 1001 ; N uni0469 ; G 1022\nU 1130 ; WX 787 ; N uni046A ; G 1023\nU 1131 ; WX 612 ; N uni046B ; G 1024\nU 1132 ; WX 1027 ; N uni046C ; G 1025\nU 1133 ; WX 824 ; N uni046D ; G 1026\nU 1134 ; WX 636 ; N uni046E ; G 1027\nU 1135 ; WX 541 ; N uni046F ; G 1028\nU 1136 ; WX 856 ; N uni0470 ; G 1029\nU 1137 ; WX 876 ; N uni0471 ; G 1030\nU 1138 ; WX 787 ; N uni0472 ; G 1031\nU 1139 ; WX 612 ; N uni0473 ; G 1032\nU 1140 ; WX 781 ; N uni0474 ; G 1033\nU 1141 ; WX 665 ; N uni0475 ; G 1034\nU 1142 ; WX 781 ; N uni0476 ; G 1035\nU 1143 ; WX 665 ; N uni0477 ; G 1036\nU 1144 ; WX 992 ; N uni0478 ; G 1037\nU 1145 ; WX 904 ; N uni0479 ; G 1038\nU 1146 ; WX 953 ; N uni047A ; G 1039\nU 1147 ; WX 758 ; N uni047B ; G 1040\nU 1148 ; WX 1180 ; N uni047C ; G 1041\nU 1149 ; WX 1028 ; N uni047D ; G 1042\nU 1150 ; WX 934 ; N uni047E ; G 1043\nU 1151 ; WX 837 ; N uni047F ; G 1044\nU 1152 ; WX 698 ; N uni0480 ; G 1045\nU 1153 ; WX 550 ; N uni0481 ; G 1046\nU 1154 ; WX 502 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 772 ; N uni048A ; G 1055\nU 1163 ; WX 677 ; N uni048B ; G 1056\nU 1164 ; WX 686 ; N uni048C ; G 1057\nU 1165 ; WX 589 ; N uni048D ; G 1058\nU 1166 ; WX 603 ; N uni048E ; G 1059\nU 1167 ; WX 635 ; N uni048F ; G 1060\nU 1168 ; WX 610 ; N uni0490 ; G 1061\nU 1169 ; WX 525 ; N uni0491 ; G 1062\nU 1170 ; WX 675 ; N uni0492 ; G 1063\nU 1171 ; WX 590 ; N uni0493 ; G 1064\nU 1172 ; WX 624 ; N uni0494 ; G 1065\nU 1173 ; WX 530 ; N uni0495 ; G 1066\nU 1174 ; WX 1077 ; N uni0496 ; G 1067\nU 1175 ; WX 901 ; N uni0497 ; G 1068\nU 1176 ; WX 641 ; N uni0498 ; G 1069\nU 1177 ; WX 532 ; N uni0499 ; G 1070\nU 1178 ; WX 710 ; N uni049A ; G 1071\nU 1179 ; WX 604 ; N uni049B ; G 1072\nU 1180 ; WX 710 ; N uni049C ; G 1073\nU 1181 ; WX 604 ; N uni049D ; G 1074\nU 1182 ; WX 710 ; N uni049E ; G 1075\nU 1183 ; WX 604 ; N uni049F ; G 1076\nU 1184 ; WX 856 ; N uni04A0 ; G 1077\nU 1185 ; WX 832 ; N uni04A1 ; G 1078\nU 1186 ; WX 752 ; N uni04A2 ; G 1079\nU 1187 ; WX 661 ; N uni04A3 ; G 1080\nU 1188 ; WX 1014 ; N uni04A4 ; G 1081\nU 1189 ; WX 877 ; N uni04A5 ; G 1082\nU 1190 ; WX 1081 ; N uni04A6 ; G 1083\nU 1191 ; WX 916 ; N uni04A7 ; G 1084\nU 1192 ; WX 878 ; N uni04A8 ; G 1085\nU 1193 ; WX 693 ; N uni04A9 ; G 1086\nU 1194 ; WX 698 ; N uni04AA ; G 1087\nU 1195 ; WX 550 ; N uni04AB ; G 1088\nU 1196 ; WX 611 ; N uni04AC ; G 1089\nU 1197 ; WX 583 ; N uni04AD ; G 1090\nU 1198 ; WX 611 ; N uni04AE ; G 1091\nU 1199 ; WX 592 ; N uni04AF ; G 1092\nU 1200 ; WX 611 ; N uni04B0 ; G 1093\nU 1201 ; WX 592 ; N uni04B1 ; G 1094\nU 1202 ; WX 685 ; N uni04B2 ; G 1095\nU 1203 ; WX 592 ; N uni04B3 ; G 1096\nU 1204 ; WX 934 ; N uni04B4 ; G 1097\nU 1205 ; WX 807 ; N uni04B5 ; G 1098\nU 1206 ; WX 686 ; N uni04B6 ; G 1099\nU 1207 ; WX 591 ; N uni04B7 ; G 1100\nU 1208 ; WX 686 ; N uni04B8 ; G 1101\nU 1209 ; WX 591 ; N uni04B9 ; G 1102\nU 1210 ; WX 686 ; N uni04BA ; G 1103\nU 1211 ; WX 634 ; N uni04BB ; G 1104\nU 1212 ; WX 941 ; N uni04BC ; G 1105\nU 1213 ; WX 728 ; N uni04BD ; G 1106\nU 1214 ; WX 941 ; N uni04BE ; G 1107\nU 1215 ; WX 728 ; N uni04BF ; G 1108\nU 1216 ; WX 295 ; N uni04C0 ; G 1109\nU 1217 ; WX 1077 ; N uni04C1 ; G 1110\nU 1218 ; WX 901 ; N uni04C2 ; G 1111\nU 1219 ; WX 656 ; N uni04C3 ; G 1112\nU 1220 ; WX 604 ; N uni04C4 ; G 1113\nU 1221 ; WX 776 ; N uni04C5 ; G 1114\nU 1222 ; WX 670 ; N uni04C6 ; G 1115\nU 1223 ; WX 752 ; N uni04C7 ; G 1116\nU 1224 ; WX 661 ; N uni04C8 ; G 1117\nU 1225 ; WX 776 ; N uni04C9 ; G 1118\nU 1226 ; WX 681 ; N uni04CA ; G 1119\nU 1227 ; WX 686 ; N uni04CB ; G 1120\nU 1228 ; WX 591 ; N uni04CC ; G 1121\nU 1229 ; WX 888 ; N uni04CD ; G 1122\nU 1230 ; WX 774 ; N uni04CE ; G 1123\nU 1231 ; WX 278 ; N uni04CF ; G 1124\nU 1232 ; WX 684 ; N uni04D0 ; G 1125\nU 1233 ; WX 613 ; N uni04D1 ; G 1126\nU 1234 ; WX 684 ; N uni04D2 ; G 1127\nU 1235 ; WX 613 ; N uni04D3 ; G 1128\nU 1236 ; WX 974 ; N uni04D4 ; G 1129\nU 1237 ; WX 982 ; N uni04D5 ; G 1130\nU 1238 ; WX 632 ; N uni04D6 ; G 1131\nU 1239 ; WX 615 ; N uni04D7 ; G 1132\nU 1240 ; WX 787 ; N uni04D8 ; G 1133\nU 1241 ; WX 615 ; N uni04D9 ; G 1134\nU 1242 ; WX 787 ; N uni04DA ; G 1135\nU 1243 ; WX 615 ; N uni04DB ; G 1136\nU 1244 ; WX 1077 ; N uni04DC ; G 1137\nU 1245 ; WX 901 ; N uni04DD ; G 1138\nU 1246 ; WX 641 ; N uni04DE ; G 1139\nU 1247 ; WX 532 ; N uni04DF ; G 1140\nU 1248 ; WX 666 ; N uni04E0 ; G 1141\nU 1249 ; WX 578 ; N uni04E1 ; G 1142\nU 1250 ; WX 748 ; N uni04E2 ; G 1143\nU 1251 ; WX 650 ; N uni04E3 ; G 1144\nU 1252 ; WX 748 ; N uni04E4 ; G 1145\nU 1253 ; WX 650 ; N uni04E5 ; G 1146\nU 1254 ; WX 787 ; N uni04E6 ; G 1147\nU 1255 ; WX 612 ; N uni04E7 ; G 1148\nU 1256 ; WX 787 ; N uni04E8 ; G 1149\nU 1257 ; WX 612 ; N uni04E9 ; G 1150\nU 1258 ; WX 787 ; N uni04EA ; G 1151\nU 1259 ; WX 612 ; N uni04EB ; G 1152\nU 1260 ; WX 698 ; N uni04EC ; G 1153\nU 1261 ; WX 549 ; N uni04ED ; G 1154\nU 1262 ; WX 609 ; N uni04EE ; G 1155\nU 1263 ; WX 592 ; N uni04EF ; G 1156\nU 1264 ; WX 609 ; N uni04F0 ; G 1157\nU 1265 ; WX 592 ; N uni04F1 ; G 1158\nU 1266 ; WX 609 ; N uni04F2 ; G 1159\nU 1267 ; WX 592 ; N uni04F3 ; G 1160\nU 1268 ; WX 686 ; N uni04F4 ; G 1161\nU 1269 ; WX 591 ; N uni04F5 ; G 1162\nU 1270 ; WX 610 ; N uni04F6 ; G 1163\nU 1271 ; WX 525 ; N uni04F7 ; G 1164\nU 1272 ; WX 882 ; N uni04F8 ; G 1165\nU 1273 ; WX 790 ; N uni04F9 ; G 1166\nU 1274 ; WX 675 ; N uni04FA ; G 1167\nU 1275 ; WX 590 ; N uni04FB ; G 1168\nU 1276 ; WX 685 ; N uni04FC ; G 1169\nU 1277 ; WX 592 ; N uni04FD ; G 1170\nU 1278 ; WX 685 ; N uni04FE ; G 1171\nU 1279 ; WX 592 ; N uni04FF ; G 1172\nU 1280 ; WX 686 ; N uni0500 ; G 1173\nU 1281 ; WX 589 ; N uni0501 ; G 1174\nU 1282 ; WX 1006 ; N uni0502 ; G 1175\nU 1283 ; WX 897 ; N uni0503 ; G 1176\nU 1284 ; WX 975 ; N uni0504 ; G 1177\nU 1285 ; WX 869 ; N uni0505 ; G 1178\nU 1286 ; WX 679 ; N uni0506 ; G 1179\nU 1287 ; WX 588 ; N uni0507 ; G 1180\nU 1288 ; WX 1072 ; N uni0508 ; G 1181\nU 1289 ; WX 957 ; N uni0509 ; G 1182\nU 1290 ; WX 1113 ; N uni050A ; G 1183\nU 1291 ; WX 967 ; N uni050B ; G 1184\nU 1292 ; WX 775 ; N uni050C ; G 1185\nU 1293 ; WX 660 ; N uni050D ; G 1186\nU 1294 ; WX 773 ; N uni050E ; G 1187\nU 1295 ; WX 711 ; N uni050F ; G 1188\nU 1296 ; WX 614 ; N uni0510 ; G 1189\nU 1297 ; WX 541 ; N uni0511 ; G 1190\nU 1298 ; WX 752 ; N uni0512 ; G 1191\nU 1299 ; WX 639 ; N uni0513 ; G 1192\nU 1300 ; WX 1169 ; N uni0514 ; G 1193\nU 1301 ; WX 994 ; N uni0515 ; G 1194\nU 1302 ; WX 894 ; N uni0516 ; G 1195\nU 1303 ; WX 864 ; N uni0517 ; G 1196\nU 1304 ; WX 1032 ; N uni0518 ; G 1197\nU 1305 ; WX 986 ; N uni0519 ; G 1198\nU 1306 ; WX 787 ; N uni051A ; G 1199\nU 1307 ; WX 635 ; N uni051B ; G 1200\nU 1308 ; WX 989 ; N uni051C ; G 1201\nU 1309 ; WX 818 ; N uni051D ; G 1202\nU 1310 ; WX 710 ; N uni051E ; G 1203\nU 1311 ; WX 604 ; N uni051F ; G 1204\nU 1312 ; WX 1081 ; N uni0520 ; G 1205\nU 1313 ; WX 905 ; N uni0521 ; G 1206\nU 1314 ; WX 1081 ; N uni0522 ; G 1207\nU 1315 ; WX 912 ; N uni0523 ; G 1208\nU 1316 ; WX 793 ; N uni0524 ; G 1209\nU 1317 ; WX 683 ; N uni0525 ; G 1210\nU 1329 ; WX 766 ; N uni0531 ; G 1211\nU 1330 ; WX 732 ; N uni0532 ; G 1212\nU 1331 ; WX 753 ; N uni0533 ; G 1213\nU 1332 ; WX 753 ; N uni0534 ; G 1214\nU 1333 ; WX 732 ; N uni0535 ; G 1215\nU 1334 ; WX 772 ; N uni0536 ; G 1216\nU 1335 ; WX 640 ; N uni0537 ; G 1217\nU 1336 ; WX 732 ; N uni0538 ; G 1218\nU 1337 ; WX 859 ; N uni0539 ; G 1219\nU 1338 ; WX 753 ; N uni053A ; G 1220\nU 1339 ; WX 691 ; N uni053B ; G 1221\nU 1340 ; WX 533 ; N uni053C ; G 1222\nU 1341 ; WX 922 ; N uni053D ; G 1223\nU 1342 ; WX 863 ; N uni053E ; G 1224\nU 1343 ; WX 732 ; N uni053F ; G 1225\nU 1344 ; WX 716 ; N uni0540 ; G 1226\nU 1345 ; WX 766 ; N uni0541 ; G 1227\nU 1346 ; WX 753 ; N uni0542 ; G 1228\nU 1347 ; WX 767 ; N uni0543 ; G 1229\nU 1348 ; WX 792 ; N uni0544 ; G 1230\nU 1349 ; WX 728 ; N uni0545 ; G 1231\nU 1350 ; WX 729 ; N uni0546 ; G 1232\nU 1351 ; WX 757 ; N uni0547 ; G 1233\nU 1352 ; WX 732 ; N uni0548 ; G 1234\nU 1353 ; WX 713 ; N uni0549 ; G 1235\nU 1354 ; WX 800 ; N uni054A ; G 1236\nU 1355 ; WX 768 ; N uni054B ; G 1237\nU 1356 ; WX 792 ; N uni054C ; G 1238\nU 1357 ; WX 732 ; N uni054D ; G 1239\nU 1358 ; WX 753 ; N uni054E ; G 1240\nU 1359 ; WX 705 ; N uni054F ; G 1241\nU 1360 ; WX 694 ; N uni0550 ; G 1242\nU 1361 ; WX 744 ; N uni0551 ; G 1243\nU 1362 ; WX 538 ; N uni0552 ; G 1244\nU 1363 ; WX 811 ; N uni0553 ; G 1245\nU 1364 ; WX 757 ; N uni0554 ; G 1246\nU 1365 ; WX 787 ; N uni0555 ; G 1247\nU 1366 ; WX 790 ; N uni0556 ; G 1248\nU 1369 ; WX 307 ; N uni0559 ; G 1249\nU 1370 ; WX 318 ; N uni055A ; G 1250\nU 1371 ; WX 234 ; N uni055B ; G 1251\nU 1372 ; WX 361 ; N uni055C ; G 1252\nU 1373 ; WX 238 ; N uni055D ; G 1253\nU 1374 ; WX 405 ; N uni055E ; G 1254\nU 1375 ; WX 500 ; N uni055F ; G 1255\nU 1377 ; WX 974 ; N uni0561 ; G 1256\nU 1378 ; WX 634 ; N uni0562 ; G 1257\nU 1379 ; WX 658 ; N uni0563 ; G 1258\nU 1380 ; WX 663 ; N uni0564 ; G 1259\nU 1381 ; WX 634 ; N uni0565 ; G 1260\nU 1382 ; WX 635 ; N uni0566 ; G 1261\nU 1383 ; WX 515 ; N uni0567 ; G 1262\nU 1384 ; WX 634 ; N uni0568 ; G 1263\nU 1385 ; WX 738 ; N uni0569 ; G 1264\nU 1386 ; WX 658 ; N uni056A ; G 1265\nU 1387 ; WX 634 ; N uni056B ; G 1266\nU 1388 ; WX 271 ; N uni056C ; G 1267\nU 1389 ; WX 980 ; N uni056D ; G 1268\nU 1390 ; WX 623 ; N uni056E ; G 1269\nU 1391 ; WX 634 ; N uni056F ; G 1270\nU 1392 ; WX 634 ; N uni0570 ; G 1271\nU 1393 ; WX 608 ; N uni0571 ; G 1272\nU 1394 ; WX 634 ; N uni0572 ; G 1273\nU 1395 ; WX 629 ; N uni0573 ; G 1274\nU 1396 ; WX 634 ; N uni0574 ; G 1275\nU 1397 ; WX 271 ; N uni0575 ; G 1276\nU 1398 ; WX 634 ; N uni0576 ; G 1277\nU 1399 ; WX 499 ; N uni0577 ; G 1278\nU 1400 ; WX 634 ; N uni0578 ; G 1279\nU 1401 ; WX 404 ; N uni0579 ; G 1280\nU 1402 ; WX 974 ; N uni057A ; G 1281\nU 1403 ; WX 560 ; N uni057B ; G 1282\nU 1404 ; WX 648 ; N uni057C ; G 1283\nU 1405 ; WX 634 ; N uni057D ; G 1284\nU 1406 ; WX 634 ; N uni057E ; G 1285\nU 1407 ; WX 974 ; N uni057F ; G 1286\nU 1408 ; WX 634 ; N uni0580 ; G 1287\nU 1409 ; WX 633 ; N uni0581 ; G 1288\nU 1410 ; WX 435 ; N uni0582 ; G 1289\nU 1411 ; WX 974 ; N uni0583 ; G 1290\nU 1412 ; WX 636 ; N uni0584 ; G 1291\nU 1413 ; WX 609 ; N uni0585 ; G 1292\nU 1414 ; WX 805 ; N uni0586 ; G 1293\nU 1415 ; WX 812 ; N uni0587 ; G 1294\nU 1417 ; WX 337 ; N uni0589 ; G 1295\nU 1418 ; WX 361 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 361 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 295 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 295 ; N uni05C3 ; G 1316\nU 1478 ; WX 441 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 668 ; N uni05D0 ; G 1319\nU 1489 ; WX 578 ; N uni05D1 ; G 1320\nU 1490 ; WX 412 ; N uni05D2 ; G 1321\nU 1491 ; WX 546 ; N uni05D3 ; G 1322\nU 1492 ; WX 653 ; N uni05D4 ; G 1323\nU 1493 ; WX 272 ; N uni05D5 ; G 1324\nU 1494 ; WX 346 ; N uni05D6 ; G 1325\nU 1495 ; WX 653 ; N uni05D7 ; G 1326\nU 1496 ; WX 648 ; N uni05D8 ; G 1327\nU 1497 ; WX 224 ; N uni05D9 ; G 1328\nU 1498 ; WX 537 ; N uni05DA ; G 1329\nU 1499 ; WX 529 ; N uni05DB ; G 1330\nU 1500 ; WX 568 ; N uni05DC ; G 1331\nU 1501 ; WX 664 ; N uni05DD ; G 1332\nU 1502 ; WX 679 ; N uni05DE ; G 1333\nU 1503 ; WX 272 ; N uni05DF ; G 1334\nU 1504 ; WX 400 ; N uni05E0 ; G 1335\nU 1505 ; WX 649 ; N uni05E1 ; G 1336\nU 1506 ; WX 626 ; N uni05E2 ; G 1337\nU 1507 ; WX 640 ; N uni05E3 ; G 1338\nU 1508 ; WX 625 ; N uni05E4 ; G 1339\nU 1509 ; WX 540 ; N uni05E5 ; G 1340\nU 1510 ; WX 593 ; N uni05E6 ; G 1341\nU 1511 ; WX 709 ; N uni05E7 ; G 1342\nU 1512 ; WX 564 ; N uni05E8 ; G 1343\nU 1513 ; WX 708 ; N uni05E9 ; G 1344\nU 1514 ; WX 657 ; N uni05EA ; G 1345\nU 1520 ; WX 471 ; N uni05F0 ; G 1346\nU 1521 ; WX 423 ; N uni05F1 ; G 1347\nU 1522 ; WX 331 ; N uni05F2 ; G 1348\nU 1523 ; WX 416 ; N uni05F3 ; G 1349\nU 1524 ; WX 645 ; N uni05F4 ; G 1350\nU 1542 ; WX 637 ; N uni0606 ; G 1351\nU 1543 ; WX 637 ; N uni0607 ; G 1352\nU 1545 ; WX 757 ; N uni0609 ; G 1353\nU 1546 ; WX 977 ; N uni060A ; G 1354\nU 1548 ; WX 323 ; N uni060C ; G 1355\nU 1557 ; WX 0 ; N uni0615 ; G 1356\nU 1563 ; WX 318 ; N uni061B ; G 1357\nU 1567 ; WX 531 ; N uni061F ; G 1358\nU 1569 ; WX 470 ; N uni0621 ; G 1359\nU 1570 ; WX 278 ; N uni0622 ; G 1360\nU 1571 ; WX 278 ; N uni0623 ; G 1361\nU 1572 ; WX 483 ; N uni0624 ; G 1362\nU 1573 ; WX 278 ; N uni0625 ; G 1363\nU 1574 ; WX 783 ; N uni0626 ; G 1364\nU 1575 ; WX 278 ; N uni0627 ; G 1365\nU 1576 ; WX 941 ; N uni0628 ; G 1366\nU 1577 ; WX 524 ; N uni0629 ; G 1367\nU 1578 ; WX 941 ; N uni062A ; G 1368\nU 1579 ; WX 941 ; N uni062B ; G 1369\nU 1580 ; WX 646 ; N uni062C ; G 1370\nU 1581 ; WX 646 ; N uni062D ; G 1371\nU 1582 ; WX 646 ; N uni062E ; G 1372\nU 1583 ; WX 445 ; N uni062F ; G 1373\nU 1584 ; WX 445 ; N uni0630 ; G 1374\nU 1585 ; WX 483 ; N uni0631 ; G 1375\nU 1586 ; WX 483 ; N uni0632 ; G 1376\nU 1587 ; WX 1221 ; N uni0633 ; G 1377\nU 1588 ; WX 1221 ; N uni0634 ; G 1378\nU 1589 ; WX 1209 ; N uni0635 ; G 1379\nU 1590 ; WX 1209 ; N uni0636 ; G 1380\nU 1591 ; WX 925 ; N uni0637 ; G 1381\nU 1592 ; WX 925 ; N uni0638 ; G 1382\nU 1593 ; WX 597 ; N uni0639 ; G 1383\nU 1594 ; WX 597 ; N uni063A ; G 1384\nU 1600 ; WX 293 ; N uni0640 ; G 1385\nU 1601 ; WX 1037 ; N uni0641 ; G 1386\nU 1602 ; WX 776 ; N uni0642 ; G 1387\nU 1603 ; WX 824 ; N uni0643 ; G 1388\nU 1604 ; WX 727 ; N uni0644 ; G 1389\nU 1605 ; WX 619 ; N uni0645 ; G 1390\nU 1606 ; WX 734 ; N uni0646 ; G 1391\nU 1607 ; WX 524 ; N uni0647 ; G 1392\nU 1608 ; WX 483 ; N uni0648 ; G 1393\nU 1609 ; WX 783 ; N uni0649 ; G 1394\nU 1610 ; WX 783 ; N uni064A ; G 1395\nU 1611 ; WX 0 ; N uni064B ; G 1396\nU 1612 ; WX 0 ; N uni064C ; G 1397\nU 1613 ; WX 0 ; N uni064D ; G 1398\nU 1614 ; WX 0 ; N uni064E ; G 1399\nU 1615 ; WX 0 ; N uni064F ; G 1400\nU 1616 ; WX 0 ; N uni0650 ; G 1401\nU 1617 ; WX 0 ; N uni0651 ; G 1402\nU 1618 ; WX 0 ; N uni0652 ; G 1403\nU 1619 ; WX 0 ; N uni0653 ; G 1404\nU 1620 ; WX 0 ; N uni0654 ; G 1405\nU 1621 ; WX 0 ; N uni0655 ; G 1406\nU 1623 ; WX 0 ; N uni0657 ; G 1407\nU 1626 ; WX 500 ; N uni065A ; G 1408\nU 1632 ; WX 537 ; N uni0660 ; G 1409\nU 1633 ; WX 537 ; N uni0661 ; G 1410\nU 1634 ; WX 537 ; N uni0662 ; G 1411\nU 1635 ; WX 537 ; N uni0663 ; G 1412\nU 1636 ; WX 537 ; N uni0664 ; G 1413\nU 1637 ; WX 537 ; N uni0665 ; G 1414\nU 1638 ; WX 537 ; N uni0666 ; G 1415\nU 1639 ; WX 537 ; N uni0667 ; G 1416\nU 1640 ; WX 537 ; N uni0668 ; G 1417\nU 1641 ; WX 537 ; N uni0669 ; G 1418\nU 1642 ; WX 537 ; N uni066A ; G 1419\nU 1643 ; WX 325 ; N uni066B ; G 1420\nU 1644 ; WX 318 ; N uni066C ; G 1421\nU 1645 ; WX 545 ; N uni066D ; G 1422\nU 1646 ; WX 941 ; N uni066E ; G 1423\nU 1647 ; WX 776 ; N uni066F ; G 1424\nU 1648 ; WX 0 ; N uni0670 ; G 1425\nU 1652 ; WX 292 ; N uni0674 ; G 1426\nU 1657 ; WX 941 ; N uni0679 ; G 1427\nU 1658 ; WX 941 ; N uni067A ; G 1428\nU 1659 ; WX 941 ; N uni067B ; G 1429\nU 1660 ; WX 941 ; N uni067C ; G 1430\nU 1661 ; WX 941 ; N uni067D ; G 1431\nU 1662 ; WX 941 ; N uni067E ; G 1432\nU 1663 ; WX 941 ; N uni067F ; G 1433\nU 1664 ; WX 941 ; N uni0680 ; G 1434\nU 1665 ; WX 646 ; N uni0681 ; G 1435\nU 1666 ; WX 646 ; N uni0682 ; G 1436\nU 1667 ; WX 646 ; N uni0683 ; G 1437\nU 1668 ; WX 646 ; N uni0684 ; G 1438\nU 1669 ; WX 646 ; N uni0685 ; G 1439\nU 1670 ; WX 646 ; N uni0686 ; G 1440\nU 1671 ; WX 646 ; N uni0687 ; G 1441\nU 1672 ; WX 445 ; N uni0688 ; G 1442\nU 1673 ; WX 445 ; N uni0689 ; G 1443\nU 1674 ; WX 445 ; N uni068A ; G 1444\nU 1675 ; WX 445 ; N uni068B ; G 1445\nU 1676 ; WX 445 ; N uni068C ; G 1446\nU 1677 ; WX 445 ; N uni068D ; G 1447\nU 1678 ; WX 445 ; N uni068E ; G 1448\nU 1679 ; WX 445 ; N uni068F ; G 1449\nU 1680 ; WX 445 ; N uni0690 ; G 1450\nU 1681 ; WX 483 ; N uni0691 ; G 1451\nU 1682 ; WX 483 ; N uni0692 ; G 1452\nU 1683 ; WX 498 ; N uni0693 ; G 1453\nU 1684 ; WX 530 ; N uni0694 ; G 1454\nU 1685 ; WX 610 ; N uni0695 ; G 1455\nU 1686 ; WX 530 ; N uni0696 ; G 1456\nU 1687 ; WX 483 ; N uni0697 ; G 1457\nU 1688 ; WX 483 ; N uni0698 ; G 1458\nU 1689 ; WX 483 ; N uni0699 ; G 1459\nU 1690 ; WX 1221 ; N uni069A ; G 1460\nU 1691 ; WX 1221 ; N uni069B ; G 1461\nU 1692 ; WX 1221 ; N uni069C ; G 1462\nU 1693 ; WX 1209 ; N uni069D ; G 1463\nU 1694 ; WX 1209 ; N uni069E ; G 1464\nU 1695 ; WX 925 ; N uni069F ; G 1465\nU 1696 ; WX 597 ; N uni06A0 ; G 1466\nU 1697 ; WX 1037 ; N uni06A1 ; G 1467\nU 1698 ; WX 1037 ; N uni06A2 ; G 1468\nU 1699 ; WX 1037 ; N uni06A3 ; G 1469\nU 1700 ; WX 1037 ; N uni06A4 ; G 1470\nU 1701 ; WX 1037 ; N uni06A5 ; G 1471\nU 1702 ; WX 1037 ; N uni06A6 ; G 1472\nU 1703 ; WX 776 ; N uni06A7 ; G 1473\nU 1704 ; WX 776 ; N uni06A8 ; G 1474\nU 1705 ; WX 895 ; N uni06A9 ; G 1475\nU 1706 ; WX 1054 ; N uni06AA ; G 1476\nU 1707 ; WX 895 ; N uni06AB ; G 1477\nU 1708 ; WX 824 ; N uni06AC ; G 1478\nU 1709 ; WX 824 ; N uni06AD ; G 1479\nU 1710 ; WX 824 ; N uni06AE ; G 1480\nU 1711 ; WX 895 ; N uni06AF ; G 1481\nU 1712 ; WX 895 ; N uni06B0 ; G 1482\nU 1713 ; WX 895 ; N uni06B1 ; G 1483\nU 1714 ; WX 895 ; N uni06B2 ; G 1484\nU 1715 ; WX 895 ; N uni06B3 ; G 1485\nU 1716 ; WX 895 ; N uni06B4 ; G 1486\nU 1717 ; WX 727 ; N uni06B5 ; G 1487\nU 1718 ; WX 727 ; N uni06B6 ; G 1488\nU 1719 ; WX 727 ; N uni06B7 ; G 1489\nU 1720 ; WX 727 ; N uni06B8 ; G 1490\nU 1721 ; WX 734 ; N uni06B9 ; G 1491\nU 1722 ; WX 734 ; N uni06BA ; G 1492\nU 1723 ; WX 734 ; N uni06BB ; G 1493\nU 1724 ; WX 734 ; N uni06BC ; G 1494\nU 1725 ; WX 734 ; N uni06BD ; G 1495\nU 1726 ; WX 698 ; N uni06BE ; G 1496\nU 1727 ; WX 646 ; N uni06BF ; G 1497\nU 1734 ; WX 483 ; N uni06C6 ; G 1498\nU 1735 ; WX 483 ; N uni06C7 ; G 1499\nU 1736 ; WX 483 ; N uni06C8 ; G 1500\nU 1739 ; WX 483 ; N uni06CB ; G 1501\nU 1740 ; WX 783 ; N uni06CC ; G 1502\nU 1742 ; WX 783 ; N uni06CE ; G 1503\nU 1744 ; WX 783 ; N uni06D0 ; G 1504\nU 1749 ; WX 524 ; N uni06D5 ; G 1505\nU 1776 ; WX 537 ; N uni06F0 ; G 1506\nU 1777 ; WX 537 ; N uni06F1 ; G 1507\nU 1778 ; WX 537 ; N uni06F2 ; G 1508\nU 1779 ; WX 537 ; N uni06F3 ; G 1509\nU 1780 ; WX 537 ; N uni06F4 ; G 1510\nU 1781 ; WX 537 ; N uni06F5 ; G 1511\nU 1782 ; WX 537 ; N uni06F6 ; G 1512\nU 1783 ; WX 537 ; N uni06F7 ; G 1513\nU 1784 ; WX 537 ; N uni06F8 ; G 1514\nU 1785 ; WX 537 ; N uni06F9 ; G 1515\nU 1984 ; WX 636 ; N uni07C0 ; G 1516\nU 1985 ; WX 636 ; N uni07C1 ; G 1517\nU 1986 ; WX 636 ; N uni07C2 ; G 1518\nU 1987 ; WX 636 ; N uni07C3 ; G 1519\nU 1988 ; WX 636 ; N uni07C4 ; G 1520\nU 1989 ; WX 636 ; N uni07C5 ; G 1521\nU 1990 ; WX 636 ; N uni07C6 ; G 1522\nU 1991 ; WX 636 ; N uni07C7 ; G 1523\nU 1992 ; WX 636 ; N uni07C8 ; G 1524\nU 1993 ; WX 636 ; N uni07C9 ; G 1525\nU 1994 ; WX 278 ; N uni07CA ; G 1526\nU 1995 ; WX 571 ; N uni07CB ; G 1527\nU 1996 ; WX 424 ; N uni07CC ; G 1528\nU 1997 ; WX 592 ; N uni07CD ; G 1529\nU 1998 ; WX 654 ; N uni07CE ; G 1530\nU 1999 ; WX 654 ; N uni07CF ; G 1531\nU 2000 ; WX 594 ; N uni07D0 ; G 1532\nU 2001 ; WX 654 ; N uni07D1 ; G 1533\nU 2002 ; WX 829 ; N uni07D2 ; G 1534\nU 2003 ; WX 438 ; N uni07D3 ; G 1535\nU 2004 ; WX 438 ; N uni07D4 ; G 1536\nU 2005 ; WX 559 ; N uni07D5 ; G 1537\nU 2006 ; WX 612 ; N uni07D6 ; G 1538\nU 2007 ; WX 350 ; N uni07D7 ; G 1539\nU 2008 ; WX 959 ; N uni07D8 ; G 1540\nU 2009 ; WX 473 ; N uni07D9 ; G 1541\nU 2010 ; WX 783 ; N uni07DA ; G 1542\nU 2011 ; WX 654 ; N uni07DB ; G 1543\nU 2012 ; WX 625 ; N uni07DC ; G 1544\nU 2013 ; WX 734 ; N uni07DD ; G 1545\nU 2014 ; WX 530 ; N uni07DE ; G 1546\nU 2015 ; WX 724 ; N uni07DF ; G 1547\nU 2016 ; WX 473 ; N uni07E0 ; G 1548\nU 2017 ; WX 625 ; N uni07E1 ; G 1549\nU 2018 ; WX 594 ; N uni07E2 ; G 1550\nU 2019 ; WX 530 ; N uni07E3 ; G 1551\nU 2020 ; WX 530 ; N uni07E4 ; G 1552\nU 2021 ; WX 522 ; N uni07E5 ; G 1553\nU 2022 ; WX 594 ; N uni07E6 ; G 1554\nU 2023 ; WX 594 ; N uni07E7 ; G 1555\nU 2027 ; WX 0 ; N uni07EB ; G 1556\nU 2028 ; WX 0 ; N uni07EC ; G 1557\nU 2029 ; WX 0 ; N uni07ED ; G 1558\nU 2030 ; WX 0 ; N uni07EE ; G 1559\nU 2031 ; WX 0 ; N uni07EF ; G 1560\nU 2032 ; WX 0 ; N uni07F0 ; G 1561\nU 2033 ; WX 0 ; N uni07F1 ; G 1562\nU 2034 ; WX 0 ; N uni07F2 ; G 1563\nU 2035 ; WX 0 ; N uni07F3 ; G 1564\nU 2036 ; WX 313 ; N uni07F4 ; G 1565\nU 2037 ; WX 313 ; N uni07F5 ; G 1566\nU 2040 ; WX 560 ; N uni07F8 ; G 1567\nU 2041 ; WX 560 ; N uni07F9 ; G 1568\nU 2042 ; WX 361 ; N uni07FA ; G 1569\nU 3647 ; WX 636 ; N uni0E3F ; G 1570\nU 3713 ; WX 670 ; N uni0E81 ; G 1571\nU 3714 ; WX 684 ; N uni0E82 ; G 1572\nU 3716 ; WX 688 ; N uni0E84 ; G 1573\nU 3719 ; WX 482 ; N uni0E87 ; G 1574\nU 3720 ; WX 628 ; N uni0E88 ; G 1575\nU 3722 ; WX 684 ; N uni0E8A ; G 1576\nU 3725 ; WX 688 ; N uni0E8D ; G 1577\nU 3732 ; WX 669 ; N uni0E94 ; G 1578\nU 3733 ; WX 642 ; N uni0E95 ; G 1579\nU 3734 ; WX 645 ; N uni0E96 ; G 1580\nU 3735 ; WX 655 ; N uni0E97 ; G 1581\nU 3737 ; WX 659 ; N uni0E99 ; G 1582\nU 3738 ; WX 625 ; N uni0E9A ; G 1583\nU 3739 ; WX 625 ; N uni0E9B ; G 1584\nU 3740 ; WX 745 ; N uni0E9C ; G 1585\nU 3741 ; WX 767 ; N uni0E9D ; G 1586\nU 3742 ; WX 687 ; N uni0E9E ; G 1587\nU 3743 ; WX 687 ; N uni0E9F ; G 1588\nU 3745 ; WX 702 ; N uni0EA1 ; G 1589\nU 3746 ; WX 688 ; N uni0EA2 ; G 1590\nU 3747 ; WX 684 ; N uni0EA3 ; G 1591\nU 3749 ; WX 649 ; N uni0EA5 ; G 1592\nU 3751 ; WX 632 ; N uni0EA7 ; G 1593\nU 3754 ; WX 703 ; N uni0EAA ; G 1594\nU 3755 ; WX 819 ; N uni0EAB ; G 1595\nU 3757 ; WX 633 ; N uni0EAD ; G 1596\nU 3758 ; WX 684 ; N uni0EAE ; G 1597\nU 3759 ; WX 788 ; N uni0EAF ; G 1598\nU 3760 ; WX 632 ; N uni0EB0 ; G 1599\nU 3761 ; WX 0 ; N uni0EB1 ; G 1600\nU 3762 ; WX 539 ; N uni0EB2 ; G 1601\nU 3763 ; WX 539 ; N uni0EB3 ; G 1602\nU 3764 ; WX 0 ; N uni0EB4 ; G 1603\nU 3765 ; WX 0 ; N uni0EB5 ; G 1604\nU 3766 ; WX 0 ; N uni0EB6 ; G 1605\nU 3767 ; WX 0 ; N uni0EB7 ; G 1606\nU 3768 ; WX 0 ; N uni0EB8 ; G 1607\nU 3769 ; WX 0 ; N uni0EB9 ; G 1608\nU 3771 ; WX 0 ; N uni0EBB ; G 1609\nU 3772 ; WX 0 ; N uni0EBC ; G 1610\nU 3773 ; WX 663 ; N uni0EBD ; G 1611\nU 3776 ; WX 375 ; N uni0EC0 ; G 1612\nU 3777 ; WX 657 ; N uni0EC1 ; G 1613\nU 3778 ; WX 460 ; N uni0EC2 ; G 1614\nU 3779 ; WX 547 ; N uni0EC3 ; G 1615\nU 3780 ; WX 491 ; N uni0EC4 ; G 1616\nU 3782 ; WX 674 ; N uni0EC6 ; G 1617\nU 3784 ; WX 0 ; N uni0EC8 ; G 1618\nU 3785 ; WX 0 ; N uni0EC9 ; G 1619\nU 3786 ; WX 0 ; N uni0ECA ; G 1620\nU 3787 ; WX 0 ; N uni0ECB ; G 1621\nU 3788 ; WX 0 ; N uni0ECC ; G 1622\nU 3789 ; WX 0 ; N uni0ECD ; G 1623\nU 3792 ; WX 636 ; N uni0ED0 ; G 1624\nU 3793 ; WX 641 ; N uni0ED1 ; G 1625\nU 3794 ; WX 641 ; N uni0ED2 ; G 1626\nU 3795 ; WX 670 ; N uni0ED3 ; G 1627\nU 3796 ; WX 625 ; N uni0ED4 ; G 1628\nU 3797 ; WX 625 ; N uni0ED5 ; G 1629\nU 3798 ; WX 703 ; N uni0ED6 ; G 1630\nU 3799 ; WX 670 ; N uni0ED7 ; G 1631\nU 3800 ; WX 674 ; N uni0ED8 ; G 1632\nU 3801 ; WX 677 ; N uni0ED9 ; G 1633\nU 3804 ; WX 1028 ; N uni0EDC ; G 1634\nU 3805 ; WX 1028 ; N uni0EDD ; G 1635\nU 4256 ; WX 874 ; N uni10A0 ; G 1636\nU 4257 ; WX 733 ; N uni10A1 ; G 1637\nU 4258 ; WX 679 ; N uni10A2 ; G 1638\nU 4259 ; WX 834 ; N uni10A3 ; G 1639\nU 4260 ; WX 615 ; N uni10A4 ; G 1640\nU 4261 ; WX 768 ; N uni10A5 ; G 1641\nU 4262 ; WX 753 ; N uni10A6 ; G 1642\nU 4263 ; WX 914 ; N uni10A7 ; G 1643\nU 4264 ; WX 453 ; N uni10A8 ; G 1644\nU 4265 ; WX 620 ; N uni10A9 ; G 1645\nU 4266 ; WX 843 ; N uni10AA ; G 1646\nU 4267 ; WX 882 ; N uni10AB ; G 1647\nU 4268 ; WX 625 ; N uni10AC ; G 1648\nU 4269 ; WX 854 ; N uni10AD ; G 1649\nU 4270 ; WX 781 ; N uni10AE ; G 1650\nU 4271 ; WX 629 ; N uni10AF ; G 1651\nU 4272 ; WX 912 ; N uni10B0 ; G 1652\nU 4273 ; WX 621 ; N uni10B1 ; G 1653\nU 4274 ; WX 620 ; N uni10B2 ; G 1654\nU 4275 ; WX 854 ; N uni10B3 ; G 1655\nU 4276 ; WX 866 ; N uni10B4 ; G 1656\nU 4277 ; WX 724 ; N uni10B5 ; G 1657\nU 4278 ; WX 630 ; N uni10B6 ; G 1658\nU 4279 ; WX 621 ; N uni10B7 ; G 1659\nU 4280 ; WX 625 ; N uni10B8 ; G 1660\nU 4281 ; WX 620 ; N uni10B9 ; G 1661\nU 4282 ; WX 818 ; N uni10BA ; G 1662\nU 4283 ; WX 874 ; N uni10BB ; G 1663\nU 4284 ; WX 615 ; N uni10BC ; G 1664\nU 4285 ; WX 623 ; N uni10BD ; G 1665\nU 4286 ; WX 625 ; N uni10BE ; G 1666\nU 4287 ; WX 725 ; N uni10BF ; G 1667\nU 4288 ; WX 844 ; N uni10C0 ; G 1668\nU 4289 ; WX 596 ; N uni10C1 ; G 1669\nU 4290 ; WX 688 ; N uni10C2 ; G 1670\nU 4291 ; WX 596 ; N uni10C3 ; G 1671\nU 4292 ; WX 594 ; N uni10C4 ; G 1672\nU 4293 ; WX 738 ; N uni10C5 ; G 1673\nU 4304 ; WX 508 ; N uni10D0 ; G 1674\nU 4305 ; WX 518 ; N uni10D1 ; G 1675\nU 4306 ; WX 581 ; N uni10D2 ; G 1676\nU 4307 ; WX 818 ; N uni10D3 ; G 1677\nU 4308 ; WX 508 ; N uni10D4 ; G 1678\nU 4309 ; WX 513 ; N uni10D5 ; G 1679\nU 4310 ; WX 500 ; N uni10D6 ; G 1680\nU 4311 ; WX 801 ; N uni10D7 ; G 1681\nU 4312 ; WX 518 ; N uni10D8 ; G 1682\nU 4313 ; WX 510 ; N uni10D9 ; G 1683\nU 4314 ; WX 1064 ; N uni10DA ; G 1684\nU 4315 ; WX 522 ; N uni10DB ; G 1685\nU 4316 ; WX 522 ; N uni10DC ; G 1686\nU 4317 ; WX 786 ; N uni10DD ; G 1687\nU 4318 ; WX 508 ; N uni10DE ; G 1688\nU 4319 ; WX 518 ; N uni10DF ; G 1689\nU 4320 ; WX 796 ; N uni10E0 ; G 1690\nU 4321 ; WX 522 ; N uni10E1 ; G 1691\nU 4322 ; WX 654 ; N uni10E2 ; G 1692\nU 4323 ; WX 522 ; N uni10E3 ; G 1693\nU 4324 ; WX 825 ; N uni10E4 ; G 1694\nU 4325 ; WX 513 ; N uni10E5 ; G 1695\nU 4326 ; WX 786 ; N uni10E6 ; G 1696\nU 4327 ; WX 518 ; N uni10E7 ; G 1697\nU 4328 ; WX 518 ; N uni10E8 ; G 1698\nU 4329 ; WX 522 ; N uni10E9 ; G 1699\nU 4330 ; WX 571 ; N uni10EA ; G 1700\nU 4331 ; WX 522 ; N uni10EB ; G 1701\nU 4332 ; WX 518 ; N uni10EC ; G 1702\nU 4333 ; WX 520 ; N uni10ED ; G 1703\nU 4334 ; WX 522 ; N uni10EE ; G 1704\nU 4335 ; WX 454 ; N uni10EF ; G 1705\nU 4336 ; WX 508 ; N uni10F0 ; G 1706\nU 4337 ; WX 518 ; N uni10F1 ; G 1707\nU 4338 ; WX 508 ; N uni10F2 ; G 1708\nU 4339 ; WX 508 ; N uni10F3 ; G 1709\nU 4340 ; WX 518 ; N uni10F4 ; G 1710\nU 4341 ; WX 554 ; N uni10F5 ; G 1711\nU 4342 ; WX 828 ; N uni10F6 ; G 1712\nU 4343 ; WX 552 ; N uni10F7 ; G 1713\nU 4344 ; WX 508 ; N uni10F8 ; G 1714\nU 4345 ; WX 571 ; N uni10F9 ; G 1715\nU 4346 ; WX 508 ; N uni10FA ; G 1716\nU 4347 ; WX 448 ; N uni10FB ; G 1717\nU 4348 ; WX 324 ; N uni10FC ; G 1718\nU 5121 ; WX 684 ; N uni1401 ; G 1719\nU 5122 ; WX 684 ; N uni1402 ; G 1720\nU 5123 ; WX 684 ; N uni1403 ; G 1721\nU 5124 ; WX 684 ; N uni1404 ; G 1722\nU 5125 ; WX 769 ; N uni1405 ; G 1723\nU 5126 ; WX 769 ; N uni1406 ; G 1724\nU 5127 ; WX 769 ; N uni1407 ; G 1725\nU 5129 ; WX 769 ; N uni1409 ; G 1726\nU 5130 ; WX 769 ; N uni140A ; G 1727\nU 5131 ; WX 769 ; N uni140B ; G 1728\nU 5132 ; WX 835 ; N uni140C ; G 1729\nU 5133 ; WX 834 ; N uni140D ; G 1730\nU 5134 ; WX 835 ; N uni140E ; G 1731\nU 5135 ; WX 834 ; N uni140F ; G 1732\nU 5136 ; WX 835 ; N uni1410 ; G 1733\nU 5137 ; WX 834 ; N uni1411 ; G 1734\nU 5138 ; WX 967 ; N uni1412 ; G 1735\nU 5139 ; WX 1007 ; N uni1413 ; G 1736\nU 5140 ; WX 967 ; N uni1414 ; G 1737\nU 5141 ; WX 1007 ; N uni1415 ; G 1738\nU 5142 ; WX 769 ; N uni1416 ; G 1739\nU 5143 ; WX 967 ; N uni1417 ; G 1740\nU 5144 ; WX 1007 ; N uni1418 ; G 1741\nU 5145 ; WX 967 ; N uni1419 ; G 1742\nU 5146 ; WX 1007 ; N uni141A ; G 1743\nU 5147 ; WX 769 ; N uni141B ; G 1744\nU 5149 ; WX 256 ; N uni141D ; G 1745\nU 5150 ; WX 543 ; N uni141E ; G 1746\nU 5151 ; WX 423 ; N uni141F ; G 1747\nU 5152 ; WX 423 ; N uni1420 ; G 1748\nU 5153 ; WX 389 ; N uni1421 ; G 1749\nU 5154 ; WX 389 ; N uni1422 ; G 1750\nU 5155 ; WX 393 ; N uni1423 ; G 1751\nU 5156 ; WX 389 ; N uni1424 ; G 1752\nU 5157 ; WX 466 ; N uni1425 ; G 1753\nU 5158 ; WX 385 ; N uni1426 ; G 1754\nU 5159 ; WX 256 ; N uni1427 ; G 1755\nU 5160 ; WX 389 ; N uni1428 ; G 1756\nU 5161 ; WX 389 ; N uni1429 ; G 1757\nU 5162 ; WX 389 ; N uni142A ; G 1758\nU 5163 ; WX 1090 ; N uni142B ; G 1759\nU 5164 ; WX 909 ; N uni142C ; G 1760\nU 5165 ; WX 953 ; N uni142D ; G 1761\nU 5166 ; WX 1117 ; N uni142E ; G 1762\nU 5167 ; WX 684 ; N uni142F ; G 1763\nU 5168 ; WX 684 ; N uni1430 ; G 1764\nU 5169 ; WX 684 ; N uni1431 ; G 1765\nU 5170 ; WX 684 ; N uni1432 ; G 1766\nU 5171 ; WX 729 ; N uni1433 ; G 1767\nU 5172 ; WX 729 ; N uni1434 ; G 1768\nU 5173 ; WX 729 ; N uni1435 ; G 1769\nU 5175 ; WX 729 ; N uni1437 ; G 1770\nU 5176 ; WX 729 ; N uni1438 ; G 1771\nU 5177 ; WX 729 ; N uni1439 ; G 1772\nU 5178 ; WX 835 ; N uni143A ; G 1773\nU 5179 ; WX 684 ; N uni143B ; G 1774\nU 5180 ; WX 835 ; N uni143C ; G 1775\nU 5181 ; WX 834 ; N uni143D ; G 1776\nU 5182 ; WX 835 ; N uni143E ; G 1777\nU 5183 ; WX 834 ; N uni143F ; G 1778\nU 5184 ; WX 967 ; N uni1440 ; G 1779\nU 5185 ; WX 1007 ; N uni1441 ; G 1780\nU 5186 ; WX 967 ; N uni1442 ; G 1781\nU 5187 ; WX 1007 ; N uni1443 ; G 1782\nU 5188 ; WX 967 ; N uni1444 ; G 1783\nU 5189 ; WX 1007 ; N uni1445 ; G 1784\nU 5190 ; WX 967 ; N uni1446 ; G 1785\nU 5191 ; WX 1007 ; N uni1447 ; G 1786\nU 5192 ; WX 729 ; N uni1448 ; G 1787\nU 5193 ; WX 508 ; N uni1449 ; G 1788\nU 5194 ; WX 192 ; N uni144A ; G 1789\nU 5196 ; WX 732 ; N uni144C ; G 1790\nU 5197 ; WX 732 ; N uni144D ; G 1791\nU 5198 ; WX 732 ; N uni144E ; G 1792\nU 5199 ; WX 732 ; N uni144F ; G 1793\nU 5200 ; WX 730 ; N uni1450 ; G 1794\nU 5201 ; WX 730 ; N uni1451 ; G 1795\nU 5202 ; WX 730 ; N uni1452 ; G 1796\nU 5204 ; WX 730 ; N uni1454 ; G 1797\nU 5205 ; WX 730 ; N uni1455 ; G 1798\nU 5206 ; WX 730 ; N uni1456 ; G 1799\nU 5207 ; WX 921 ; N uni1457 ; G 1800\nU 5208 ; WX 889 ; N uni1458 ; G 1801\nU 5209 ; WX 921 ; N uni1459 ; G 1802\nU 5210 ; WX 889 ; N uni145A ; G 1803\nU 5211 ; WX 921 ; N uni145B ; G 1804\nU 5212 ; WX 889 ; N uni145C ; G 1805\nU 5213 ; WX 928 ; N uni145D ; G 1806\nU 5214 ; WX 900 ; N uni145E ; G 1807\nU 5215 ; WX 928 ; N uni145F ; G 1808\nU 5216 ; WX 900 ; N uni1460 ; G 1809\nU 5217 ; WX 947 ; N uni1461 ; G 1810\nU 5218 ; WX 900 ; N uni1462 ; G 1811\nU 5219 ; WX 947 ; N uni1463 ; G 1812\nU 5220 ; WX 900 ; N uni1464 ; G 1813\nU 5221 ; WX 947 ; N uni1465 ; G 1814\nU 5222 ; WX 434 ; N uni1466 ; G 1815\nU 5223 ; WX 877 ; N uni1467 ; G 1816\nU 5224 ; WX 877 ; N uni1468 ; G 1817\nU 5225 ; WX 866 ; N uni1469 ; G 1818\nU 5226 ; WX 890 ; N uni146A ; G 1819\nU 5227 ; WX 628 ; N uni146B ; G 1820\nU 5228 ; WX 628 ; N uni146C ; G 1821\nU 5229 ; WX 628 ; N uni146D ; G 1822\nU 5230 ; WX 628 ; N uni146E ; G 1823\nU 5231 ; WX 628 ; N uni146F ; G 1824\nU 5232 ; WX 628 ; N uni1470 ; G 1825\nU 5233 ; WX 628 ; N uni1471 ; G 1826\nU 5234 ; WX 628 ; N uni1472 ; G 1827\nU 5235 ; WX 628 ; N uni1473 ; G 1828\nU 5236 ; WX 860 ; N uni1474 ; G 1829\nU 5237 ; WX 771 ; N uni1475 ; G 1830\nU 5238 ; WX 815 ; N uni1476 ; G 1831\nU 5239 ; WX 816 ; N uni1477 ; G 1832\nU 5240 ; WX 815 ; N uni1478 ; G 1833\nU 5241 ; WX 816 ; N uni1479 ; G 1834\nU 5242 ; WX 860 ; N uni147A ; G 1835\nU 5243 ; WX 771 ; N uni147B ; G 1836\nU 5244 ; WX 860 ; N uni147C ; G 1837\nU 5245 ; WX 771 ; N uni147D ; G 1838\nU 5246 ; WX 815 ; N uni147E ; G 1839\nU 5247 ; WX 816 ; N uni147F ; G 1840\nU 5248 ; WX 815 ; N uni1480 ; G 1841\nU 5249 ; WX 816 ; N uni1481 ; G 1842\nU 5250 ; WX 815 ; N uni1482 ; G 1843\nU 5251 ; WX 407 ; N uni1483 ; G 1844\nU 5252 ; WX 407 ; N uni1484 ; G 1845\nU 5253 ; WX 750 ; N uni1485 ; G 1846\nU 5254 ; WX 775 ; N uni1486 ; G 1847\nU 5255 ; WX 750 ; N uni1487 ; G 1848\nU 5256 ; WX 775 ; N uni1488 ; G 1849\nU 5257 ; WX 628 ; N uni1489 ; G 1850\nU 5258 ; WX 628 ; N uni148A ; G 1851\nU 5259 ; WX 628 ; N uni148B ; G 1852\nU 5260 ; WX 628 ; N uni148C ; G 1853\nU 5261 ; WX 628 ; N uni148D ; G 1854\nU 5262 ; WX 628 ; N uni148E ; G 1855\nU 5263 ; WX 628 ; N uni148F ; G 1856\nU 5264 ; WX 628 ; N uni1490 ; G 1857\nU 5265 ; WX 628 ; N uni1491 ; G 1858\nU 5266 ; WX 860 ; N uni1492 ; G 1859\nU 5267 ; WX 771 ; N uni1493 ; G 1860\nU 5268 ; WX 815 ; N uni1494 ; G 1861\nU 5269 ; WX 816 ; N uni1495 ; G 1862\nU 5270 ; WX 815 ; N uni1496 ; G 1863\nU 5271 ; WX 816 ; N uni1497 ; G 1864\nU 5272 ; WX 860 ; N uni1498 ; G 1865\nU 5273 ; WX 771 ; N uni1499 ; G 1866\nU 5274 ; WX 860 ; N uni149A ; G 1867\nU 5275 ; WX 771 ; N uni149B ; G 1868\nU 5276 ; WX 815 ; N uni149C ; G 1869\nU 5277 ; WX 816 ; N uni149D ; G 1870\nU 5278 ; WX 815 ; N uni149E ; G 1871\nU 5279 ; WX 816 ; N uni149F ; G 1872\nU 5280 ; WX 815 ; N uni14A0 ; G 1873\nU 5281 ; WX 435 ; N uni14A1 ; G 1874\nU 5282 ; WX 435 ; N uni14A2 ; G 1875\nU 5283 ; WX 610 ; N uni14A3 ; G 1876\nU 5284 ; WX 557 ; N uni14A4 ; G 1877\nU 5285 ; WX 557 ; N uni14A5 ; G 1878\nU 5286 ; WX 557 ; N uni14A6 ; G 1879\nU 5287 ; WX 610 ; N uni14A7 ; G 1880\nU 5288 ; WX 610 ; N uni14A8 ; G 1881\nU 5289 ; WX 610 ; N uni14A9 ; G 1882\nU 5290 ; WX 557 ; N uni14AA ; G 1883\nU 5291 ; WX 557 ; N uni14AB ; G 1884\nU 5292 ; WX 749 ; N uni14AC ; G 1885\nU 5293 ; WX 769 ; N uni14AD ; G 1886\nU 5294 ; WX 746 ; N uni14AE ; G 1887\nU 5295 ; WX 764 ; N uni14AF ; G 1888\nU 5296 ; WX 746 ; N uni14B0 ; G 1889\nU 5297 ; WX 764 ; N uni14B1 ; G 1890\nU 5298 ; WX 749 ; N uni14B2 ; G 1891\nU 5299 ; WX 769 ; N uni14B3 ; G 1892\nU 5300 ; WX 749 ; N uni14B4 ; G 1893\nU 5301 ; WX 769 ; N uni14B5 ; G 1894\nU 5302 ; WX 746 ; N uni14B6 ; G 1895\nU 5303 ; WX 764 ; N uni14B7 ; G 1896\nU 5304 ; WX 746 ; N uni14B8 ; G 1897\nU 5305 ; WX 764 ; N uni14B9 ; G 1898\nU 5306 ; WX 746 ; N uni14BA ; G 1899\nU 5307 ; WX 386 ; N uni14BB ; G 1900\nU 5308 ; WX 508 ; N uni14BC ; G 1901\nU 5309 ; WX 386 ; N uni14BD ; G 1902\nU 5312 ; WX 852 ; N uni14C0 ; G 1903\nU 5313 ; WX 852 ; N uni14C1 ; G 1904\nU 5314 ; WX 852 ; N uni14C2 ; G 1905\nU 5315 ; WX 852 ; N uni14C3 ; G 1906\nU 5316 ; WX 852 ; N uni14C4 ; G 1907\nU 5317 ; WX 852 ; N uni14C5 ; G 1908\nU 5318 ; WX 852 ; N uni14C6 ; G 1909\nU 5319 ; WX 852 ; N uni14C7 ; G 1910\nU 5320 ; WX 852 ; N uni14C8 ; G 1911\nU 5321 ; WX 1069 ; N uni14C9 ; G 1912\nU 5322 ; WX 1035 ; N uni14CA ; G 1913\nU 5323 ; WX 1059 ; N uni14CB ; G 1914\nU 5324 ; WX 852 ; N uni14CC ; G 1915\nU 5325 ; WX 1059 ; N uni14CD ; G 1916\nU 5326 ; WX 852 ; N uni14CE ; G 1917\nU 5327 ; WX 852 ; N uni14CF ; G 1918\nU 5328 ; WX 600 ; N uni14D0 ; G 1919\nU 5329 ; WX 453 ; N uni14D1 ; G 1920\nU 5330 ; WX 600 ; N uni14D2 ; G 1921\nU 5331 ; WX 852 ; N uni14D3 ; G 1922\nU 5332 ; WX 852 ; N uni14D4 ; G 1923\nU 5333 ; WX 852 ; N uni14D5 ; G 1924\nU 5334 ; WX 852 ; N uni14D6 ; G 1925\nU 5335 ; WX 852 ; N uni14D7 ; G 1926\nU 5336 ; WX 852 ; N uni14D8 ; G 1927\nU 5337 ; WX 852 ; N uni14D9 ; G 1928\nU 5338 ; WX 852 ; N uni14DA ; G 1929\nU 5339 ; WX 852 ; N uni14DB ; G 1930\nU 5340 ; WX 1069 ; N uni14DC ; G 1931\nU 5341 ; WX 1035 ; N uni14DD ; G 1932\nU 5342 ; WX 1059 ; N uni14DE ; G 1933\nU 5343 ; WX 1030 ; N uni14DF ; G 1934\nU 5344 ; WX 1059 ; N uni14E0 ; G 1935\nU 5345 ; WX 1030 ; N uni14E1 ; G 1936\nU 5346 ; WX 1069 ; N uni14E2 ; G 1937\nU 5347 ; WX 1035 ; N uni14E3 ; G 1938\nU 5348 ; WX 1069 ; N uni14E4 ; G 1939\nU 5349 ; WX 1035 ; N uni14E5 ; G 1940\nU 5350 ; WX 1083 ; N uni14E6 ; G 1941\nU 5351 ; WX 1030 ; N uni14E7 ; G 1942\nU 5352 ; WX 1083 ; N uni14E8 ; G 1943\nU 5353 ; WX 1030 ; N uni14E9 ; G 1944\nU 5354 ; WX 600 ; N uni14EA ; G 1945\nU 5356 ; WX 729 ; N uni14EC ; G 1946\nU 5357 ; WX 603 ; N uni14ED ; G 1947\nU 5358 ; WX 603 ; N uni14EE ; G 1948\nU 5359 ; WX 603 ; N uni14EF ; G 1949\nU 5360 ; WX 603 ; N uni14F0 ; G 1950\nU 5361 ; WX 603 ; N uni14F1 ; G 1951\nU 5362 ; WX 603 ; N uni14F2 ; G 1952\nU 5363 ; WX 603 ; N uni14F3 ; G 1953\nU 5364 ; WX 603 ; N uni14F4 ; G 1954\nU 5365 ; WX 603 ; N uni14F5 ; G 1955\nU 5366 ; WX 834 ; N uni14F6 ; G 1956\nU 5367 ; WX 754 ; N uni14F7 ; G 1957\nU 5368 ; WX 792 ; N uni14F8 ; G 1958\nU 5369 ; WX 771 ; N uni14F9 ; G 1959\nU 5370 ; WX 792 ; N uni14FA ; G 1960\nU 5371 ; WX 771 ; N uni14FB ; G 1961\nU 5372 ; WX 834 ; N uni14FC ; G 1962\nU 5373 ; WX 754 ; N uni14FD ; G 1963\nU 5374 ; WX 834 ; N uni14FE ; G 1964\nU 5375 ; WX 754 ; N uni14FF ; G 1965\nU 5376 ; WX 792 ; N uni1500 ; G 1966\nU 5377 ; WX 771 ; N uni1501 ; G 1967\nU 5378 ; WX 792 ; N uni1502 ; G 1968\nU 5379 ; WX 771 ; N uni1503 ; G 1969\nU 5380 ; WX 792 ; N uni1504 ; G 1970\nU 5381 ; WX 418 ; N uni1505 ; G 1971\nU 5382 ; WX 420 ; N uni1506 ; G 1972\nU 5383 ; WX 418 ; N uni1507 ; G 1973\nU 5392 ; WX 712 ; N uni1510 ; G 1974\nU 5393 ; WX 712 ; N uni1511 ; G 1975\nU 5394 ; WX 712 ; N uni1512 ; G 1976\nU 5395 ; WX 892 ; N uni1513 ; G 1977\nU 5396 ; WX 892 ; N uni1514 ; G 1978\nU 5397 ; WX 892 ; N uni1515 ; G 1979\nU 5398 ; WX 892 ; N uni1516 ; G 1980\nU 5399 ; WX 910 ; N uni1517 ; G 1981\nU 5400 ; WX 872 ; N uni1518 ; G 1982\nU 5401 ; WX 910 ; N uni1519 ; G 1983\nU 5402 ; WX 872 ; N uni151A ; G 1984\nU 5403 ; WX 910 ; N uni151B ; G 1985\nU 5404 ; WX 872 ; N uni151C ; G 1986\nU 5405 ; WX 1140 ; N uni151D ; G 1987\nU 5406 ; WX 1100 ; N uni151E ; G 1988\nU 5407 ; WX 1140 ; N uni151F ; G 1989\nU 5408 ; WX 1100 ; N uni1520 ; G 1990\nU 5409 ; WX 1140 ; N uni1521 ; G 1991\nU 5410 ; WX 1100 ; N uni1522 ; G 1992\nU 5411 ; WX 1140 ; N uni1523 ; G 1993\nU 5412 ; WX 1100 ; N uni1524 ; G 1994\nU 5413 ; WX 641 ; N uni1525 ; G 1995\nU 5414 ; WX 627 ; N uni1526 ; G 1996\nU 5415 ; WX 627 ; N uni1527 ; G 1997\nU 5416 ; WX 627 ; N uni1528 ; G 1998\nU 5417 ; WX 627 ; N uni1529 ; G 1999\nU 5418 ; WX 627 ; N uni152A ; G 2000\nU 5419 ; WX 627 ; N uni152B ; G 2001\nU 5420 ; WX 627 ; N uni152C ; G 2002\nU 5421 ; WX 627 ; N uni152D ; G 2003\nU 5422 ; WX 627 ; N uni152E ; G 2004\nU 5423 ; WX 844 ; N uni152F ; G 2005\nU 5424 ; WX 781 ; N uni1530 ; G 2006\nU 5425 ; WX 816 ; N uni1531 ; G 2007\nU 5426 ; WX 818 ; N uni1532 ; G 2008\nU 5427 ; WX 816 ; N uni1533 ; G 2009\nU 5428 ; WX 818 ; N uni1534 ; G 2010\nU 5429 ; WX 844 ; N uni1535 ; G 2011\nU 5430 ; WX 781 ; N uni1536 ; G 2012\nU 5431 ; WX 844 ; N uni1537 ; G 2013\nU 5432 ; WX 781 ; N uni1538 ; G 2014\nU 5433 ; WX 816 ; N uni1539 ; G 2015\nU 5434 ; WX 818 ; N uni153A ; G 2016\nU 5435 ; WX 816 ; N uni153B ; G 2017\nU 5436 ; WX 818 ; N uni153C ; G 2018\nU 5437 ; WX 816 ; N uni153D ; G 2019\nU 5438 ; WX 418 ; N uni153E ; G 2020\nU 5440 ; WX 389 ; N uni1540 ; G 2021\nU 5441 ; WX 484 ; N uni1541 ; G 2022\nU 5442 ; WX 916 ; N uni1542 ; G 2023\nU 5443 ; WX 916 ; N uni1543 ; G 2024\nU 5444 ; WX 916 ; N uni1544 ; G 2025\nU 5445 ; WX 916 ; N uni1545 ; G 2026\nU 5446 ; WX 916 ; N uni1546 ; G 2027\nU 5447 ; WX 916 ; N uni1547 ; G 2028\nU 5448 ; WX 603 ; N uni1548 ; G 2029\nU 5449 ; WX 603 ; N uni1549 ; G 2030\nU 5450 ; WX 603 ; N uni154A ; G 2031\nU 5451 ; WX 603 ; N uni154B ; G 2032\nU 5452 ; WX 603 ; N uni154C ; G 2033\nU 5453 ; WX 603 ; N uni154D ; G 2034\nU 5454 ; WX 834 ; N uni154E ; G 2035\nU 5455 ; WX 754 ; N uni154F ; G 2036\nU 5456 ; WX 418 ; N uni1550 ; G 2037\nU 5458 ; WX 729 ; N uni1552 ; G 2038\nU 5459 ; WX 684 ; N uni1553 ; G 2039\nU 5460 ; WX 684 ; N uni1554 ; G 2040\nU 5461 ; WX 684 ; N uni1555 ; G 2041\nU 5462 ; WX 684 ; N uni1556 ; G 2042\nU 5463 ; WX 726 ; N uni1557 ; G 2043\nU 5464 ; WX 726 ; N uni1558 ; G 2044\nU 5465 ; WX 726 ; N uni1559 ; G 2045\nU 5466 ; WX 726 ; N uni155A ; G 2046\nU 5467 ; WX 924 ; N uni155B ; G 2047\nU 5468 ; WX 1007 ; N uni155C ; G 2048\nU 5469 ; WX 508 ; N uni155D ; G 2049\nU 5470 ; WX 732 ; N uni155E ; G 2050\nU 5471 ; WX 732 ; N uni155F ; G 2051\nU 5472 ; WX 732 ; N uni1560 ; G 2052\nU 5473 ; WX 732 ; N uni1561 ; G 2053\nU 5474 ; WX 732 ; N uni1562 ; G 2054\nU 5475 ; WX 732 ; N uni1563 ; G 2055\nU 5476 ; WX 730 ; N uni1564 ; G 2056\nU 5477 ; WX 730 ; N uni1565 ; G 2057\nU 5478 ; WX 730 ; N uni1566 ; G 2058\nU 5479 ; WX 730 ; N uni1567 ; G 2059\nU 5480 ; WX 947 ; N uni1568 ; G 2060\nU 5481 ; WX 900 ; N uni1569 ; G 2061\nU 5482 ; WX 508 ; N uni156A ; G 2062\nU 5492 ; WX 831 ; N uni1574 ; G 2063\nU 5493 ; WX 831 ; N uni1575 ; G 2064\nU 5494 ; WX 831 ; N uni1576 ; G 2065\nU 5495 ; WX 831 ; N uni1577 ; G 2066\nU 5496 ; WX 831 ; N uni1578 ; G 2067\nU 5497 ; WX 831 ; N uni1579 ; G 2068\nU 5498 ; WX 831 ; N uni157A ; G 2069\nU 5499 ; WX 563 ; N uni157B ; G 2070\nU 5500 ; WX 752 ; N uni157C ; G 2071\nU 5501 ; WX 484 ; N uni157D ; G 2072\nU 5502 ; WX 1047 ; N uni157E ; G 2073\nU 5503 ; WX 1047 ; N uni157F ; G 2074\nU 5504 ; WX 1047 ; N uni1580 ; G 2075\nU 5505 ; WX 1047 ; N uni1581 ; G 2076\nU 5506 ; WX 1047 ; N uni1582 ; G 2077\nU 5507 ; WX 1047 ; N uni1583 ; G 2078\nU 5508 ; WX 1047 ; N uni1584 ; G 2079\nU 5509 ; WX 825 ; N uni1585 ; G 2080\nU 5514 ; WX 831 ; N uni158A ; G 2081\nU 5515 ; WX 831 ; N uni158B ; G 2082\nU 5516 ; WX 831 ; N uni158C ; G 2083\nU 5517 ; WX 831 ; N uni158D ; G 2084\nU 5518 ; WX 1259 ; N uni158E ; G 2085\nU 5519 ; WX 1259 ; N uni158F ; G 2086\nU 5520 ; WX 1259 ; N uni1590 ; G 2087\nU 5521 ; WX 1002 ; N uni1591 ; G 2088\nU 5522 ; WX 1002 ; N uni1592 ; G 2089\nU 5523 ; WX 1259 ; N uni1593 ; G 2090\nU 5524 ; WX 1259 ; N uni1594 ; G 2091\nU 5525 ; WX 700 ; N uni1595 ; G 2092\nU 5526 ; WX 1073 ; N uni1596 ; G 2093\nU 5536 ; WX 852 ; N uni15A0 ; G 2094\nU 5537 ; WX 852 ; N uni15A1 ; G 2095\nU 5538 ; WX 852 ; N uni15A2 ; G 2096\nU 5539 ; WX 852 ; N uni15A3 ; G 2097\nU 5540 ; WX 852 ; N uni15A4 ; G 2098\nU 5541 ; WX 852 ; N uni15A5 ; G 2099\nU 5542 ; WX 600 ; N uni15A6 ; G 2100\nU 5543 ; WX 643 ; N uni15A7 ; G 2101\nU 5544 ; WX 643 ; N uni15A8 ; G 2102\nU 5545 ; WX 643 ; N uni15A9 ; G 2103\nU 5546 ; WX 643 ; N uni15AA ; G 2104\nU 5547 ; WX 643 ; N uni15AB ; G 2105\nU 5548 ; WX 643 ; N uni15AC ; G 2106\nU 5549 ; WX 643 ; N uni15AD ; G 2107\nU 5550 ; WX 418 ; N uni15AE ; G 2108\nU 5551 ; WX 628 ; N uni15AF ; G 2109\nU 5598 ; WX 770 ; N uni15DE ; G 2110\nU 5601 ; WX 767 ; N uni15E1 ; G 2111\nU 5702 ; WX 468 ; N uni1646 ; G 2112\nU 5703 ; WX 468 ; N uni1647 ; G 2113\nU 5742 ; WX 444 ; N uni166E ; G 2114\nU 5743 ; WX 1047 ; N uni166F ; G 2115\nU 5744 ; WX 1310 ; N uni1670 ; G 2116\nU 5745 ; WX 1632 ; N uni1671 ; G 2117\nU 5746 ; WX 1632 ; N uni1672 ; G 2118\nU 5747 ; WX 1375 ; N uni1673 ; G 2119\nU 5748 ; WX 1375 ; N uni1674 ; G 2120\nU 5749 ; WX 1632 ; N uni1675 ; G 2121\nU 5750 ; WX 1632 ; N uni1676 ; G 2122\nU 5760 ; WX 477 ; N uni1680 ; G 2123\nU 5761 ; WX 493 ; N uni1681 ; G 2124\nU 5762 ; WX 712 ; N uni1682 ; G 2125\nU 5763 ; WX 931 ; N uni1683 ; G 2126\nU 5764 ; WX 1150 ; N uni1684 ; G 2127\nU 5765 ; WX 1370 ; N uni1685 ; G 2128\nU 5766 ; WX 493 ; N uni1686 ; G 2129\nU 5767 ; WX 712 ; N uni1687 ; G 2130\nU 5768 ; WX 931 ; N uni1688 ; G 2131\nU 5769 ; WX 1150 ; N uni1689 ; G 2132\nU 5770 ; WX 1370 ; N uni168A ; G 2133\nU 5771 ; WX 498 ; N uni168B ; G 2134\nU 5772 ; WX 718 ; N uni168C ; G 2135\nU 5773 ; WX 938 ; N uni168D ; G 2136\nU 5774 ; WX 1159 ; N uni168E ; G 2137\nU 5775 ; WX 1379 ; N uni168F ; G 2138\nU 5776 ; WX 493 ; N uni1690 ; G 2139\nU 5777 ; WX 712 ; N uni1691 ; G 2140\nU 5778 ; WX 930 ; N uni1692 ; G 2141\nU 5779 ; WX 1149 ; N uni1693 ; G 2142\nU 5780 ; WX 1370 ; N uni1694 ; G 2143\nU 5781 ; WX 498 ; N uni1695 ; G 2144\nU 5782 ; WX 752 ; N uni1696 ; G 2145\nU 5783 ; WX 789 ; N uni1697 ; G 2146\nU 5784 ; WX 1205 ; N uni1698 ; G 2147\nU 5785 ; WX 1150 ; N uni1699 ; G 2148\nU 5786 ; WX 683 ; N uni169A ; G 2149\nU 5787 ; WX 507 ; N uni169B ; G 2150\nU 5788 ; WX 507 ; N uni169C ; G 2151\nU 7424 ; WX 592 ; N uni1D00 ; G 2152\nU 7425 ; WX 717 ; N uni1D01 ; G 2153\nU 7426 ; WX 982 ; N uni1D02 ; G 2154\nU 7427 ; WX 586 ; N uni1D03 ; G 2155\nU 7428 ; WX 550 ; N uni1D04 ; G 2156\nU 7429 ; WX 605 ; N uni1D05 ; G 2157\nU 7430 ; WX 605 ; N uni1D06 ; G 2158\nU 7431 ; WX 491 ; N uni1D07 ; G 2159\nU 7432 ; WX 541 ; N uni1D08 ; G 2160\nU 7433 ; WX 278 ; N uni1D09 ; G 2161\nU 7434 ; WX 395 ; N uni1D0A ; G 2162\nU 7435 ; WX 579 ; N uni1D0B ; G 2163\nU 7436 ; WX 583 ; N uni1D0C ; G 2164\nU 7437 ; WX 754 ; N uni1D0D ; G 2165\nU 7438 ; WX 650 ; N uni1D0E ; G 2166\nU 7439 ; WX 612 ; N uni1D0F ; G 2167\nU 7440 ; WX 550 ; N uni1D10 ; G 2168\nU 7441 ; WX 684 ; N uni1D11 ; G 2169\nU 7442 ; WX 684 ; N uni1D12 ; G 2170\nU 7443 ; WX 684 ; N uni1D13 ; G 2171\nU 7444 ; WX 1023 ; N uni1D14 ; G 2172\nU 7446 ; WX 612 ; N uni1D16 ; G 2173\nU 7447 ; WX 612 ; N uni1D17 ; G 2174\nU 7448 ; WX 524 ; N uni1D18 ; G 2175\nU 7449 ; WX 602 ; N uni1D19 ; G 2176\nU 7450 ; WX 602 ; N uni1D1A ; G 2177\nU 7451 ; WX 583 ; N uni1D1B ; G 2178\nU 7452 ; WX 574 ; N uni1D1C ; G 2179\nU 7453 ; WX 737 ; N uni1D1D ; G 2180\nU 7454 ; WX 948 ; N uni1D1E ; G 2181\nU 7455 ; WX 638 ; N uni1D1F ; G 2182\nU 7456 ; WX 592 ; N uni1D20 ; G 2183\nU 7457 ; WX 818 ; N uni1D21 ; G 2184\nU 7458 ; WX 525 ; N uni1D22 ; G 2185\nU 7459 ; WX 526 ; N uni1D23 ; G 2186\nU 7462 ; WX 583 ; N uni1D26 ; G 2187\nU 7463 ; WX 592 ; N uni1D27 ; G 2188\nU 7464 ; WX 564 ; N uni1D28 ; G 2189\nU 7465 ; WX 524 ; N uni1D29 ; G 2190\nU 7466 ; WX 590 ; N uni1D2A ; G 2191\nU 7467 ; WX 639 ; N uni1D2B ; G 2192\nU 7468 ; WX 431 ; N uni1D2C ; G 2193\nU 7469 ; WX 613 ; N uni1D2D ; G 2194\nU 7470 ; WX 432 ; N uni1D2E ; G 2195\nU 7472 ; WX 485 ; N uni1D30 ; G 2196\nU 7473 ; WX 398 ; N uni1D31 ; G 2197\nU 7474 ; WX 398 ; N uni1D32 ; G 2198\nU 7475 ; WX 488 ; N uni1D33 ; G 2199\nU 7476 ; WX 474 ; N uni1D34 ; G 2200\nU 7477 ; WX 186 ; N uni1D35 ; G 2201\nU 7478 ; WX 186 ; N uni1D36 ; G 2202\nU 7479 ; WX 413 ; N uni1D37 ; G 2203\nU 7480 ; WX 351 ; N uni1D38 ; G 2204\nU 7481 ; WX 543 ; N uni1D39 ; G 2205\nU 7482 ; WX 471 ; N uni1D3A ; G 2206\nU 7483 ; WX 471 ; N uni1D3B ; G 2207\nU 7484 ; WX 496 ; N uni1D3C ; G 2208\nU 7485 ; WX 439 ; N uni1D3D ; G 2209\nU 7486 ; WX 380 ; N uni1D3E ; G 2210\nU 7487 ; WX 438 ; N uni1D3F ; G 2211\nU 7488 ; WX 385 ; N uni1D40 ; G 2212\nU 7489 ; WX 461 ; N uni1D41 ; G 2213\nU 7490 ; WX 623 ; N uni1D42 ; G 2214\nU 7491 ; WX 392 ; N uni1D43 ; G 2215\nU 7492 ; WX 392 ; N uni1D44 ; G 2216\nU 7493 ; WX 405 ; N uni1D45 ; G 2217\nU 7494 ; WX 648 ; N uni1D46 ; G 2218\nU 7495 ; WX 428 ; N uni1D47 ; G 2219\nU 7496 ; WX 405 ; N uni1D48 ; G 2220\nU 7497 ; WX 417 ; N uni1D49 ; G 2221\nU 7498 ; WX 417 ; N uni1D4A ; G 2222\nU 7499 ; WX 360 ; N uni1D4B ; G 2223\nU 7500 ; WX 359 ; N uni1D4C ; G 2224\nU 7501 ; WX 405 ; N uni1D4D ; G 2225\nU 7502 ; WX 179 ; N uni1D4E ; G 2226\nU 7503 ; WX 426 ; N uni1D4F ; G 2227\nU 7504 ; WX 623 ; N uni1D50 ; G 2228\nU 7505 ; WX 409 ; N uni1D51 ; G 2229\nU 7506 ; WX 414 ; N uni1D52 ; G 2230\nU 7507 ; WX 370 ; N uni1D53 ; G 2231\nU 7508 ; WX 414 ; N uni1D54 ; G 2232\nU 7509 ; WX 414 ; N uni1D55 ; G 2233\nU 7510 ; WX 428 ; N uni1D56 ; G 2234\nU 7511 ; WX 295 ; N uni1D57 ; G 2235\nU 7512 ; WX 405 ; N uni1D58 ; G 2236\nU 7513 ; WX 470 ; N uni1D59 ; G 2237\nU 7514 ; WX 623 ; N uni1D5A ; G 2238\nU 7515 ; WX 417 ; N uni1D5B ; G 2239\nU 7517 ; WX 402 ; N uni1D5D ; G 2240\nU 7518 ; WX 373 ; N uni1D5E ; G 2241\nU 7519 ; WX 385 ; N uni1D5F ; G 2242\nU 7520 ; WX 416 ; N uni1D60 ; G 2243\nU 7521 ; WX 364 ; N uni1D61 ; G 2244\nU 7522 ; WX 179 ; N uni1D62 ; G 2245\nU 7523 ; WX 259 ; N uni1D63 ; G 2246\nU 7524 ; WX 405 ; N uni1D64 ; G 2247\nU 7525 ; WX 417 ; N uni1D65 ; G 2248\nU 7526 ; WX 402 ; N uni1D66 ; G 2249\nU 7527 ; WX 373 ; N uni1D67 ; G 2250\nU 7528 ; WX 412 ; N uni1D68 ; G 2251\nU 7529 ; WX 416 ; N uni1D69 ; G 2252\nU 7530 ; WX 364 ; N uni1D6A ; G 2253\nU 7543 ; WX 635 ; N uni1D77 ; G 2254\nU 7544 ; WX 474 ; N uni1D78 ; G 2255\nU 7547 ; WX 372 ; N uni1D7B ; G 2256\nU 7549 ; WX 667 ; N uni1D7D ; G 2257\nU 7557 ; WX 278 ; N uni1D85 ; G 2258\nU 7579 ; WX 405 ; N uni1D9B ; G 2259\nU 7580 ; WX 370 ; N uni1D9C ; G 2260\nU 7581 ; WX 370 ; N uni1D9D ; G 2261\nU 7582 ; WX 414 ; N uni1D9E ; G 2262\nU 7583 ; WX 360 ; N uni1D9F ; G 2263\nU 7584 ; WX 296 ; N uni1DA0 ; G 2264\nU 7585 ; WX 233 ; N uni1DA1 ; G 2265\nU 7586 ; WX 405 ; N uni1DA2 ; G 2266\nU 7587 ; WX 405 ; N uni1DA3 ; G 2267\nU 7588 ; WX 261 ; N uni1DA4 ; G 2268\nU 7589 ; WX 250 ; N uni1DA5 ; G 2269\nU 7590 ; WX 261 ; N uni1DA6 ; G 2270\nU 7591 ; WX 261 ; N uni1DA7 ; G 2271\nU 7592 ; WX 234 ; N uni1DA8 ; G 2272\nU 7593 ; WX 250 ; N uni1DA9 ; G 2273\nU 7594 ; WX 235 ; N uni1DAA ; G 2274\nU 7595 ; WX 376 ; N uni1DAB ; G 2275\nU 7596 ; WX 623 ; N uni1DAC ; G 2276\nU 7597 ; WX 623 ; N uni1DAD ; G 2277\nU 7598 ; WX 411 ; N uni1DAE ; G 2278\nU 7599 ; WX 479 ; N uni1DAF ; G 2279\nU 7600 ; WX 409 ; N uni1DB0 ; G 2280\nU 7601 ; WX 414 ; N uni1DB1 ; G 2281\nU 7602 ; WX 414 ; N uni1DB2 ; G 2282\nU 7603 ; WX 360 ; N uni1DB3 ; G 2283\nU 7604 ; WX 287 ; N uni1DB4 ; G 2284\nU 7605 ; WX 295 ; N uni1DB5 ; G 2285\nU 7606 ; WX 508 ; N uni1DB6 ; G 2286\nU 7607 ; WX 418 ; N uni1DB7 ; G 2287\nU 7608 ; WX 361 ; N uni1DB8 ; G 2288\nU 7609 ; WX 406 ; N uni1DB9 ; G 2289\nU 7610 ; WX 417 ; N uni1DBA ; G 2290\nU 7611 ; WX 366 ; N uni1DBB ; G 2291\nU 7612 ; WX 437 ; N uni1DBC ; G 2292\nU 7613 ; WX 366 ; N uni1DBD ; G 2293\nU 7614 ; WX 392 ; N uni1DBE ; G 2294\nU 7615 ; WX 414 ; N uni1DBF ; G 2295\nU 7620 ; WX 0 ; N uni1DC4 ; G 2296\nU 7621 ; WX 0 ; N uni1DC5 ; G 2297\nU 7622 ; WX 0 ; N uni1DC6 ; G 2298\nU 7623 ; WX 0 ; N uni1DC7 ; G 2299\nU 7624 ; WX 0 ; N uni1DC8 ; G 2300\nU 7625 ; WX 0 ; N uni1DC9 ; G 2301\nU 7680 ; WX 684 ; N uni1E00 ; G 2302\nU 7681 ; WX 613 ; N uni1E01 ; G 2303\nU 7682 ; WX 686 ; N uni1E02 ; G 2304\nU 7683 ; WX 635 ; N uni1E03 ; G 2305\nU 7684 ; WX 686 ; N uni1E04 ; G 2306\nU 7685 ; WX 635 ; N uni1E05 ; G 2307\nU 7686 ; WX 686 ; N uni1E06 ; G 2308\nU 7687 ; WX 635 ; N uni1E07 ; G 2309\nU 7688 ; WX 698 ; N uni1E08 ; G 2310\nU 7689 ; WX 550 ; N uni1E09 ; G 2311\nU 7690 ; WX 770 ; N uni1E0A ; G 2312\nU 7691 ; WX 635 ; N uni1E0B ; G 2313\nU 7692 ; WX 770 ; N uni1E0C ; G 2314\nU 7693 ; WX 635 ; N uni1E0D ; G 2315\nU 7694 ; WX 770 ; N uni1E0E ; G 2316\nU 7695 ; WX 635 ; N uni1E0F ; G 2317\nU 7696 ; WX 770 ; N uni1E10 ; G 2318\nU 7697 ; WX 635 ; N uni1E11 ; G 2319\nU 7698 ; WX 770 ; N uni1E12 ; G 2320\nU 7699 ; WX 635 ; N uni1E13 ; G 2321\nU 7700 ; WX 632 ; N uni1E14 ; G 2322\nU 7701 ; WX 615 ; N uni1E15 ; G 2323\nU 7702 ; WX 632 ; N uni1E16 ; G 2324\nU 7703 ; WX 615 ; N uni1E17 ; G 2325\nU 7704 ; WX 632 ; N uni1E18 ; G 2326\nU 7705 ; WX 615 ; N uni1E19 ; G 2327\nU 7706 ; WX 632 ; N uni1E1A ; G 2328\nU 7707 ; WX 615 ; N uni1E1B ; G 2329\nU 7708 ; WX 632 ; N uni1E1C ; G 2330\nU 7709 ; WX 615 ; N uni1E1D ; G 2331\nU 7710 ; WX 575 ; N uni1E1E ; G 2332\nU 7711 ; WX 352 ; N uni1E1F ; G 2333\nU 7712 ; WX 775 ; N uni1E20 ; G 2334\nU 7713 ; WX 635 ; N uni1E21 ; G 2335\nU 7714 ; WX 752 ; N uni1E22 ; G 2336\nU 7715 ; WX 634 ; N uni1E23 ; G 2337\nU 7716 ; WX 752 ; N uni1E24 ; G 2338\nU 7717 ; WX 634 ; N uni1E25 ; G 2339\nU 7718 ; WX 752 ; N uni1E26 ; G 2340\nU 7719 ; WX 634 ; N uni1E27 ; G 2341\nU 7720 ; WX 752 ; N uni1E28 ; G 2342\nU 7721 ; WX 634 ; N uni1E29 ; G 2343\nU 7722 ; WX 752 ; N uni1E2A ; G 2344\nU 7723 ; WX 634 ; N uni1E2B ; G 2345\nU 7724 ; WX 295 ; N uni1E2C ; G 2346\nU 7725 ; WX 278 ; N uni1E2D ; G 2347\nU 7726 ; WX 295 ; N uni1E2E ; G 2348\nU 7727 ; WX 278 ; N uni1E2F ; G 2349\nU 7728 ; WX 656 ; N uni1E30 ; G 2350\nU 7729 ; WX 579 ; N uni1E31 ; G 2351\nU 7730 ; WX 656 ; N uni1E32 ; G 2352\nU 7731 ; WX 579 ; N uni1E33 ; G 2353\nU 7732 ; WX 656 ; N uni1E34 ; G 2354\nU 7733 ; WX 579 ; N uni1E35 ; G 2355\nU 7734 ; WX 557 ; N uni1E36 ; G 2356\nU 7735 ; WX 288 ; N uni1E37 ; G 2357\nU 7736 ; WX 557 ; N uni1E38 ; G 2358\nU 7737 ; WX 288 ; N uni1E39 ; G 2359\nU 7738 ; WX 557 ; N uni1E3A ; G 2360\nU 7739 ; WX 278 ; N uni1E3B ; G 2361\nU 7740 ; WX 557 ; N uni1E3C ; G 2362\nU 7741 ; WX 278 ; N uni1E3D ; G 2363\nU 7742 ; WX 863 ; N uni1E3E ; G 2364\nU 7743 ; WX 974 ; N uni1E3F ; G 2365\nU 7744 ; WX 863 ; N uni1E40 ; G 2366\nU 7745 ; WX 974 ; N uni1E41 ; G 2367\nU 7746 ; WX 863 ; N uni1E42 ; G 2368\nU 7747 ; WX 974 ; N uni1E43 ; G 2369\nU 7748 ; WX 748 ; N uni1E44 ; G 2370\nU 7749 ; WX 634 ; N uni1E45 ; G 2371\nU 7750 ; WX 748 ; N uni1E46 ; G 2372\nU 7751 ; WX 634 ; N uni1E47 ; G 2373\nU 7752 ; WX 748 ; N uni1E48 ; G 2374\nU 7753 ; WX 634 ; N uni1E49 ; G 2375\nU 7754 ; WX 748 ; N uni1E4A ; G 2376\nU 7755 ; WX 634 ; N uni1E4B ; G 2377\nU 7756 ; WX 787 ; N uni1E4C ; G 2378\nU 7757 ; WX 612 ; N uni1E4D ; G 2379\nU 7758 ; WX 787 ; N uni1E4E ; G 2380\nU 7759 ; WX 612 ; N uni1E4F ; G 2381\nU 7760 ; WX 787 ; N uni1E50 ; G 2382\nU 7761 ; WX 612 ; N uni1E51 ; G 2383\nU 7762 ; WX 787 ; N uni1E52 ; G 2384\nU 7763 ; WX 612 ; N uni1E53 ; G 2385\nU 7764 ; WX 603 ; N uni1E54 ; G 2386\nU 7765 ; WX 635 ; N uni1E55 ; G 2387\nU 7766 ; WX 603 ; N uni1E56 ; G 2388\nU 7767 ; WX 635 ; N uni1E57 ; G 2389\nU 7768 ; WX 695 ; N uni1E58 ; G 2390\nU 7769 ; WX 411 ; N uni1E59 ; G 2391\nU 7770 ; WX 695 ; N uni1E5A ; G 2392\nU 7771 ; WX 411 ; N uni1E5B ; G 2393\nU 7772 ; WX 695 ; N uni1E5C ; G 2394\nU 7773 ; WX 411 ; N uni1E5D ; G 2395\nU 7774 ; WX 695 ; N uni1E5E ; G 2396\nU 7775 ; WX 411 ; N uni1E5F ; G 2397\nU 7776 ; WX 635 ; N uni1E60 ; G 2398\nU 7777 ; WX 521 ; N uni1E61 ; G 2399\nU 7778 ; WX 635 ; N uni1E62 ; G 2400\nU 7779 ; WX 521 ; N uni1E63 ; G 2401\nU 7780 ; WX 635 ; N uni1E64 ; G 2402\nU 7781 ; WX 521 ; N uni1E65 ; G 2403\nU 7782 ; WX 635 ; N uni1E66 ; G 2404\nU 7783 ; WX 521 ; N uni1E67 ; G 2405\nU 7784 ; WX 635 ; N uni1E68 ; G 2406\nU 7785 ; WX 521 ; N uni1E69 ; G 2407\nU 7786 ; WX 611 ; N uni1E6A ; G 2408\nU 7787 ; WX 392 ; N uni1E6B ; G 2409\nU 7788 ; WX 611 ; N uni1E6C ; G 2410\nU 7789 ; WX 392 ; N uni1E6D ; G 2411\nU 7790 ; WX 611 ; N uni1E6E ; G 2412\nU 7791 ; WX 392 ; N uni1E6F ; G 2413\nU 7792 ; WX 611 ; N uni1E70 ; G 2414\nU 7793 ; WX 392 ; N uni1E71 ; G 2415\nU 7794 ; WX 732 ; N uni1E72 ; G 2416\nU 7795 ; WX 634 ; N uni1E73 ; G 2417\nU 7796 ; WX 732 ; N uni1E74 ; G 2418\nU 7797 ; WX 634 ; N uni1E75 ; G 2419\nU 7798 ; WX 732 ; N uni1E76 ; G 2420\nU 7799 ; WX 634 ; N uni1E77 ; G 2421\nU 7800 ; WX 732 ; N uni1E78 ; G 2422\nU 7801 ; WX 634 ; N uni1E79 ; G 2423\nU 7802 ; WX 732 ; N uni1E7A ; G 2424\nU 7803 ; WX 634 ; N uni1E7B ; G 2425\nU 7804 ; WX 684 ; N uni1E7C ; G 2426\nU 7805 ; WX 592 ; N uni1E7D ; G 2427\nU 7806 ; WX 684 ; N uni1E7E ; G 2428\nU 7807 ; WX 592 ; N uni1E7F ; G 2429\nU 7808 ; WX 989 ; N Wgrave ; G 2430\nU 7809 ; WX 818 ; N wgrave ; G 2431\nU 7810 ; WX 989 ; N Wacute ; G 2432\nU 7811 ; WX 818 ; N wacute ; G 2433\nU 7812 ; WX 989 ; N Wdieresis ; G 2434\nU 7813 ; WX 818 ; N wdieresis ; G 2435\nU 7814 ; WX 989 ; N uni1E86 ; G 2436\nU 7815 ; WX 818 ; N uni1E87 ; G 2437\nU 7816 ; WX 989 ; N uni1E88 ; G 2438\nU 7817 ; WX 818 ; N uni1E89 ; G 2439\nU 7818 ; WX 685 ; N uni1E8A ; G 2440\nU 7819 ; WX 592 ; N uni1E8B ; G 2441\nU 7820 ; WX 685 ; N uni1E8C ; G 2442\nU 7821 ; WX 592 ; N uni1E8D ; G 2443\nU 7822 ; WX 611 ; N uni1E8E ; G 2444\nU 7823 ; WX 592 ; N uni1E8F ; G 2445\nU 7824 ; WX 685 ; N uni1E90 ; G 2446\nU 7825 ; WX 525 ; N uni1E91 ; G 2447\nU 7826 ; WX 685 ; N uni1E92 ; G 2448\nU 7827 ; WX 525 ; N uni1E93 ; G 2449\nU 7828 ; WX 685 ; N uni1E94 ; G 2450\nU 7829 ; WX 525 ; N uni1E95 ; G 2451\nU 7830 ; WX 634 ; N uni1E96 ; G 2452\nU 7831 ; WX 392 ; N uni1E97 ; G 2453\nU 7832 ; WX 818 ; N uni1E98 ; G 2454\nU 7833 ; WX 592 ; N uni1E99 ; G 2455\nU 7834 ; WX 613 ; N uni1E9A ; G 2456\nU 7835 ; WX 352 ; N uni1E9B ; G 2457\nU 7836 ; WX 352 ; N uni1E9C ; G 2458\nU 7837 ; WX 352 ; N uni1E9D ; G 2459\nU 7838 ; WX 769 ; N uni1E9E ; G 2460\nU 7839 ; WX 612 ; N uni1E9F ; G 2461\nU 7840 ; WX 684 ; N uni1EA0 ; G 2462\nU 7841 ; WX 613 ; N uni1EA1 ; G 2463\nU 7842 ; WX 684 ; N uni1EA2 ; G 2464\nU 7843 ; WX 613 ; N uni1EA3 ; G 2465\nU 7844 ; WX 684 ; N uni1EA4 ; G 2466\nU 7845 ; WX 613 ; N uni1EA5 ; G 2467\nU 7846 ; WX 684 ; N uni1EA6 ; G 2468\nU 7847 ; WX 613 ; N uni1EA7 ; G 2469\nU 7848 ; WX 684 ; N uni1EA8 ; G 2470\nU 7849 ; WX 613 ; N uni1EA9 ; G 2471\nU 7850 ; WX 684 ; N uni1EAA ; G 2472\nU 7851 ; WX 613 ; N uni1EAB ; G 2473\nU 7852 ; WX 684 ; N uni1EAC ; G 2474\nU 7853 ; WX 613 ; N uni1EAD ; G 2475\nU 7854 ; WX 684 ; N uni1EAE ; G 2476\nU 7855 ; WX 613 ; N uni1EAF ; G 2477\nU 7856 ; WX 684 ; N uni1EB0 ; G 2478\nU 7857 ; WX 613 ; N uni1EB1 ; G 2479\nU 7858 ; WX 684 ; N uni1EB2 ; G 2480\nU 7859 ; WX 613 ; N uni1EB3 ; G 2481\nU 7860 ; WX 684 ; N uni1EB4 ; G 2482\nU 7861 ; WX 613 ; N uni1EB5 ; G 2483\nU 7862 ; WX 684 ; N uni1EB6 ; G 2484\nU 7863 ; WX 613 ; N uni1EB7 ; G 2485\nU 7864 ; WX 632 ; N uni1EB8 ; G 2486\nU 7865 ; WX 615 ; N uni1EB9 ; G 2487\nU 7866 ; WX 632 ; N uni1EBA ; G 2488\nU 7867 ; WX 615 ; N uni1EBB ; G 2489\nU 7868 ; WX 632 ; N uni1EBC ; G 2490\nU 7869 ; WX 615 ; N uni1EBD ; G 2491\nU 7870 ; WX 632 ; N uni1EBE ; G 2492\nU 7871 ; WX 615 ; N uni1EBF ; G 2493\nU 7872 ; WX 632 ; N uni1EC0 ; G 2494\nU 7873 ; WX 615 ; N uni1EC1 ; G 2495\nU 7874 ; WX 632 ; N uni1EC2 ; G 2496\nU 7875 ; WX 615 ; N uni1EC3 ; G 2497\nU 7876 ; WX 632 ; N uni1EC4 ; G 2498\nU 7877 ; WX 615 ; N uni1EC5 ; G 2499\nU 7878 ; WX 632 ; N uni1EC6 ; G 2500\nU 7879 ; WX 615 ; N uni1EC7 ; G 2501\nU 7880 ; WX 295 ; N uni1EC8 ; G 2502\nU 7881 ; WX 278 ; N uni1EC9 ; G 2503\nU 7882 ; WX 295 ; N uni1ECA ; G 2504\nU 7883 ; WX 278 ; N uni1ECB ; G 2505\nU 7884 ; WX 787 ; N uni1ECC ; G 2506\nU 7885 ; WX 612 ; N uni1ECD ; G 2507\nU 7886 ; WX 787 ; N uni1ECE ; G 2508\nU 7887 ; WX 612 ; N uni1ECF ; G 2509\nU 7888 ; WX 787 ; N uni1ED0 ; G 2510\nU 7889 ; WX 612 ; N uni1ED1 ; G 2511\nU 7890 ; WX 787 ; N uni1ED2 ; G 2512\nU 7891 ; WX 612 ; N uni1ED3 ; G 2513\nU 7892 ; WX 787 ; N uni1ED4 ; G 2514\nU 7893 ; WX 612 ; N uni1ED5 ; G 2515\nU 7894 ; WX 787 ; N uni1ED6 ; G 2516\nU 7895 ; WX 612 ; N uni1ED7 ; G 2517\nU 7896 ; WX 787 ; N uni1ED8 ; G 2518\nU 7897 ; WX 612 ; N uni1ED9 ; G 2519\nU 7898 ; WX 913 ; N uni1EDA ; G 2520\nU 7899 ; WX 612 ; N uni1EDB ; G 2521\nU 7900 ; WX 913 ; N uni1EDC ; G 2522\nU 7901 ; WX 612 ; N uni1EDD ; G 2523\nU 7902 ; WX 913 ; N uni1EDE ; G 2524\nU 7903 ; WX 612 ; N uni1EDF ; G 2525\nU 7904 ; WX 913 ; N uni1EE0 ; G 2526\nU 7905 ; WX 612 ; N uni1EE1 ; G 2527\nU 7906 ; WX 913 ; N uni1EE2 ; G 2528\nU 7907 ; WX 612 ; N uni1EE3 ; G 2529\nU 7908 ; WX 732 ; N uni1EE4 ; G 2530\nU 7909 ; WX 634 ; N uni1EE5 ; G 2531\nU 7910 ; WX 732 ; N uni1EE6 ; G 2532\nU 7911 ; WX 634 ; N uni1EE7 ; G 2533\nU 7912 ; WX 858 ; N uni1EE8 ; G 2534\nU 7913 ; WX 634 ; N uni1EE9 ; G 2535\nU 7914 ; WX 858 ; N uni1EEA ; G 2536\nU 7915 ; WX 634 ; N uni1EEB ; G 2537\nU 7916 ; WX 858 ; N uni1EEC ; G 2538\nU 7917 ; WX 634 ; N uni1EED ; G 2539\nU 7918 ; WX 858 ; N uni1EEE ; G 2540\nU 7919 ; WX 634 ; N uni1EEF ; G 2541\nU 7920 ; WX 858 ; N uni1EF0 ; G 2542\nU 7921 ; WX 634 ; N uni1EF1 ; G 2543\nU 7922 ; WX 611 ; N Ygrave ; G 2544\nU 7923 ; WX 592 ; N ygrave ; G 2545\nU 7924 ; WX 611 ; N uni1EF4 ; G 2546\nU 7925 ; WX 592 ; N uni1EF5 ; G 2547\nU 7926 ; WX 611 ; N uni1EF6 ; G 2548\nU 7927 ; WX 592 ; N uni1EF7 ; G 2549\nU 7928 ; WX 611 ; N uni1EF8 ; G 2550\nU 7929 ; WX 592 ; N uni1EF9 ; G 2551\nU 7930 ; WX 769 ; N uni1EFA ; G 2552\nU 7931 ; WX 477 ; N uni1EFB ; G 2553\nU 7936 ; WX 659 ; N uni1F00 ; G 2554\nU 7937 ; WX 659 ; N uni1F01 ; G 2555\nU 7938 ; WX 659 ; N uni1F02 ; G 2556\nU 7939 ; WX 659 ; N uni1F03 ; G 2557\nU 7940 ; WX 659 ; N uni1F04 ; G 2558\nU 7941 ; WX 659 ; N uni1F05 ; G 2559\nU 7942 ; WX 659 ; N uni1F06 ; G 2560\nU 7943 ; WX 659 ; N uni1F07 ; G 2561\nU 7944 ; WX 684 ; N uni1F08 ; G 2562\nU 7945 ; WX 684 ; N uni1F09 ; G 2563\nU 7946 ; WX 877 ; N uni1F0A ; G 2564\nU 7947 ; WX 877 ; N uni1F0B ; G 2565\nU 7948 ; WX 769 ; N uni1F0C ; G 2566\nU 7949 ; WX 801 ; N uni1F0D ; G 2567\nU 7950 ; WX 708 ; N uni1F0E ; G 2568\nU 7951 ; WX 743 ; N uni1F0F ; G 2569\nU 7952 ; WX 541 ; N uni1F10 ; G 2570\nU 7953 ; WX 541 ; N uni1F11 ; G 2571\nU 7954 ; WX 541 ; N uni1F12 ; G 2572\nU 7955 ; WX 541 ; N uni1F13 ; G 2573\nU 7956 ; WX 541 ; N uni1F14 ; G 2574\nU 7957 ; WX 541 ; N uni1F15 ; G 2575\nU 7960 ; WX 711 ; N uni1F18 ; G 2576\nU 7961 ; WX 711 ; N uni1F19 ; G 2577\nU 7962 ; WX 966 ; N uni1F1A ; G 2578\nU 7963 ; WX 975 ; N uni1F1B ; G 2579\nU 7964 ; WX 898 ; N uni1F1C ; G 2580\nU 7965 ; WX 928 ; N uni1F1D ; G 2581\nU 7968 ; WX 634 ; N uni1F20 ; G 2582\nU 7969 ; WX 634 ; N uni1F21 ; G 2583\nU 7970 ; WX 634 ; N uni1F22 ; G 2584\nU 7971 ; WX 634 ; N uni1F23 ; G 2585\nU 7972 ; WX 634 ; N uni1F24 ; G 2586\nU 7973 ; WX 634 ; N uni1F25 ; G 2587\nU 7974 ; WX 634 ; N uni1F26 ; G 2588\nU 7975 ; WX 634 ; N uni1F27 ; G 2589\nU 7976 ; WX 837 ; N uni1F28 ; G 2590\nU 7977 ; WX 835 ; N uni1F29 ; G 2591\nU 7978 ; WX 1086 ; N uni1F2A ; G 2592\nU 7979 ; WX 1089 ; N uni1F2B ; G 2593\nU 7980 ; WX 1027 ; N uni1F2C ; G 2594\nU 7981 ; WX 1051 ; N uni1F2D ; G 2595\nU 7982 ; WX 934 ; N uni1F2E ; G 2596\nU 7983 ; WX 947 ; N uni1F2F ; G 2597\nU 7984 ; WX 338 ; N uni1F30 ; G 2598\nU 7985 ; WX 338 ; N uni1F31 ; G 2599\nU 7986 ; WX 338 ; N uni1F32 ; G 2600\nU 7987 ; WX 338 ; N uni1F33 ; G 2601\nU 7988 ; WX 338 ; N uni1F34 ; G 2602\nU 7989 ; WX 338 ; N uni1F35 ; G 2603\nU 7990 ; WX 338 ; N uni1F36 ; G 2604\nU 7991 ; WX 338 ; N uni1F37 ; G 2605\nU 7992 ; WX 380 ; N uni1F38 ; G 2606\nU 7993 ; WX 374 ; N uni1F39 ; G 2607\nU 7994 ; WX 635 ; N uni1F3A ; G 2608\nU 7995 ; WX 635 ; N uni1F3B ; G 2609\nU 7996 ; WX 570 ; N uni1F3C ; G 2610\nU 7997 ; WX 600 ; N uni1F3D ; G 2611\nU 7998 ; WX 489 ; N uni1F3E ; G 2612\nU 7999 ; WX 493 ; N uni1F3F ; G 2613\nU 8000 ; WX 612 ; N uni1F40 ; G 2614\nU 8001 ; WX 612 ; N uni1F41 ; G 2615\nU 8002 ; WX 612 ; N uni1F42 ; G 2616\nU 8003 ; WX 612 ; N uni1F43 ; G 2617\nU 8004 ; WX 612 ; N uni1F44 ; G 2618\nU 8005 ; WX 612 ; N uni1F45 ; G 2619\nU 8008 ; WX 804 ; N uni1F48 ; G 2620\nU 8009 ; WX 848 ; N uni1F49 ; G 2621\nU 8010 ; WX 1095 ; N uni1F4A ; G 2622\nU 8011 ; WX 1100 ; N uni1F4B ; G 2623\nU 8012 ; WX 938 ; N uni1F4C ; G 2624\nU 8013 ; WX 970 ; N uni1F4D ; G 2625\nU 8016 ; WX 579 ; N uni1F50 ; G 2626\nU 8017 ; WX 579 ; N uni1F51 ; G 2627\nU 8018 ; WX 579 ; N uni1F52 ; G 2628\nU 8019 ; WX 579 ; N uni1F53 ; G 2629\nU 8020 ; WX 579 ; N uni1F54 ; G 2630\nU 8021 ; WX 579 ; N uni1F55 ; G 2631\nU 8022 ; WX 579 ; N uni1F56 ; G 2632\nU 8023 ; WX 579 ; N uni1F57 ; G 2633\nU 8025 ; WX 784 ; N uni1F59 ; G 2634\nU 8027 ; WX 998 ; N uni1F5B ; G 2635\nU 8029 ; WX 1012 ; N uni1F5D ; G 2636\nU 8031 ; WX 897 ; N uni1F5F ; G 2637\nU 8032 ; WX 837 ; N uni1F60 ; G 2638\nU 8033 ; WX 837 ; N uni1F61 ; G 2639\nU 8034 ; WX 837 ; N uni1F62 ; G 2640\nU 8035 ; WX 837 ; N uni1F63 ; G 2641\nU 8036 ; WX 837 ; N uni1F64 ; G 2642\nU 8037 ; WX 837 ; N uni1F65 ; G 2643\nU 8038 ; WX 837 ; N uni1F66 ; G 2644\nU 8039 ; WX 837 ; N uni1F67 ; G 2645\nU 8040 ; WX 802 ; N uni1F68 ; G 2646\nU 8041 ; WX 843 ; N uni1F69 ; G 2647\nU 8042 ; WX 1089 ; N uni1F6A ; G 2648\nU 8043 ; WX 1095 ; N uni1F6B ; G 2649\nU 8044 ; WX 946 ; N uni1F6C ; G 2650\nU 8045 ; WX 972 ; N uni1F6D ; G 2651\nU 8046 ; WX 921 ; N uni1F6E ; G 2652\nU 8047 ; WX 952 ; N uni1F6F ; G 2653\nU 8048 ; WX 659 ; N uni1F70 ; G 2654\nU 8049 ; WX 659 ; N uni1F71 ; G 2655\nU 8050 ; WX 541 ; N uni1F72 ; G 2656\nU 8051 ; WX 548 ; N uni1F73 ; G 2657\nU 8052 ; WX 634 ; N uni1F74 ; G 2658\nU 8053 ; WX 654 ; N uni1F75 ; G 2659\nU 8054 ; WX 338 ; N uni1F76 ; G 2660\nU 8055 ; WX 338 ; N uni1F77 ; G 2661\nU 8056 ; WX 612 ; N uni1F78 ; G 2662\nU 8057 ; WX 612 ; N uni1F79 ; G 2663\nU 8058 ; WX 579 ; N uni1F7A ; G 2664\nU 8059 ; WX 579 ; N uni1F7B ; G 2665\nU 8060 ; WX 837 ; N uni1F7C ; G 2666\nU 8061 ; WX 837 ; N uni1F7D ; G 2667\nU 8064 ; WX 659 ; N uni1F80 ; G 2668\nU 8065 ; WX 659 ; N uni1F81 ; G 2669\nU 8066 ; WX 659 ; N uni1F82 ; G 2670\nU 8067 ; WX 659 ; N uni1F83 ; G 2671\nU 8068 ; WX 659 ; N uni1F84 ; G 2672\nU 8069 ; WX 659 ; N uni1F85 ; G 2673\nU 8070 ; WX 659 ; N uni1F86 ; G 2674\nU 8071 ; WX 659 ; N uni1F87 ; G 2675\nU 8072 ; WX 684 ; N uni1F88 ; G 2676\nU 8073 ; WX 684 ; N uni1F89 ; G 2677\nU 8074 ; WX 877 ; N uni1F8A ; G 2678\nU 8075 ; WX 877 ; N uni1F8B ; G 2679\nU 8076 ; WX 769 ; N uni1F8C ; G 2680\nU 8077 ; WX 801 ; N uni1F8D ; G 2681\nU 8078 ; WX 708 ; N uni1F8E ; G 2682\nU 8079 ; WX 743 ; N uni1F8F ; G 2683\nU 8080 ; WX 634 ; N uni1F90 ; G 2684\nU 8081 ; WX 634 ; N uni1F91 ; G 2685\nU 8082 ; WX 634 ; N uni1F92 ; G 2686\nU 8083 ; WX 634 ; N uni1F93 ; G 2687\nU 8084 ; WX 634 ; N uni1F94 ; G 2688\nU 8085 ; WX 634 ; N uni1F95 ; G 2689\nU 8086 ; WX 634 ; N uni1F96 ; G 2690\nU 8087 ; WX 634 ; N uni1F97 ; G 2691\nU 8088 ; WX 837 ; N uni1F98 ; G 2692\nU 8089 ; WX 835 ; N uni1F99 ; G 2693\nU 8090 ; WX 1086 ; N uni1F9A ; G 2694\nU 8091 ; WX 1089 ; N uni1F9B ; G 2695\nU 8092 ; WX 1027 ; N uni1F9C ; G 2696\nU 8093 ; WX 1051 ; N uni1F9D ; G 2697\nU 8094 ; WX 934 ; N uni1F9E ; G 2698\nU 8095 ; WX 947 ; N uni1F9F ; G 2699\nU 8096 ; WX 837 ; N uni1FA0 ; G 2700\nU 8097 ; WX 837 ; N uni1FA1 ; G 2701\nU 8098 ; WX 837 ; N uni1FA2 ; G 2702\nU 8099 ; WX 837 ; N uni1FA3 ; G 2703\nU 8100 ; WX 837 ; N uni1FA4 ; G 2704\nU 8101 ; WX 837 ; N uni1FA5 ; G 2705\nU 8102 ; WX 837 ; N uni1FA6 ; G 2706\nU 8103 ; WX 837 ; N uni1FA7 ; G 2707\nU 8104 ; WX 802 ; N uni1FA8 ; G 2708\nU 8105 ; WX 843 ; N uni1FA9 ; G 2709\nU 8106 ; WX 1089 ; N uni1FAA ; G 2710\nU 8107 ; WX 1095 ; N uni1FAB ; G 2711\nU 8108 ; WX 946 ; N uni1FAC ; G 2712\nU 8109 ; WX 972 ; N uni1FAD ; G 2713\nU 8110 ; WX 921 ; N uni1FAE ; G 2714\nU 8111 ; WX 952 ; N uni1FAF ; G 2715\nU 8112 ; WX 659 ; N uni1FB0 ; G 2716\nU 8113 ; WX 659 ; N uni1FB1 ; G 2717\nU 8114 ; WX 659 ; N uni1FB2 ; G 2718\nU 8115 ; WX 659 ; N uni1FB3 ; G 2719\nU 8116 ; WX 659 ; N uni1FB4 ; G 2720\nU 8118 ; WX 659 ; N uni1FB6 ; G 2721\nU 8119 ; WX 659 ; N uni1FB7 ; G 2722\nU 8120 ; WX 684 ; N uni1FB8 ; G 2723\nU 8121 ; WX 684 ; N uni1FB9 ; G 2724\nU 8122 ; WX 716 ; N uni1FBA ; G 2725\nU 8123 ; WX 692 ; N uni1FBB ; G 2726\nU 8124 ; WX 684 ; N uni1FBC ; G 2727\nU 8125 ; WX 500 ; N uni1FBD ; G 2728\nU 8126 ; WX 500 ; N uni1FBE ; G 2729\nU 8127 ; WX 500 ; N uni1FBF ; G 2730\nU 8128 ; WX 500 ; N uni1FC0 ; G 2731\nU 8129 ; WX 500 ; N uni1FC1 ; G 2732\nU 8130 ; WX 634 ; N uni1FC2 ; G 2733\nU 8131 ; WX 634 ; N uni1FC3 ; G 2734\nU 8132 ; WX 654 ; N uni1FC4 ; G 2735\nU 8134 ; WX 634 ; N uni1FC6 ; G 2736\nU 8135 ; WX 634 ; N uni1FC7 ; G 2737\nU 8136 ; WX 805 ; N uni1FC8 ; G 2738\nU 8137 ; WX 746 ; N uni1FC9 ; G 2739\nU 8138 ; WX 931 ; N uni1FCA ; G 2740\nU 8139 ; WX 871 ; N uni1FCB ; G 2741\nU 8140 ; WX 752 ; N uni1FCC ; G 2742\nU 8141 ; WX 500 ; N uni1FCD ; G 2743\nU 8142 ; WX 500 ; N uni1FCE ; G 2744\nU 8143 ; WX 500 ; N uni1FCF ; G 2745\nU 8144 ; WX 338 ; N uni1FD0 ; G 2746\nU 8145 ; WX 338 ; N uni1FD1 ; G 2747\nU 8146 ; WX 338 ; N uni1FD2 ; G 2748\nU 8147 ; WX 338 ; N uni1FD3 ; G 2749\nU 8150 ; WX 338 ; N uni1FD6 ; G 2750\nU 8151 ; WX 338 ; N uni1FD7 ; G 2751\nU 8152 ; WX 295 ; N uni1FD8 ; G 2752\nU 8153 ; WX 295 ; N uni1FD9 ; G 2753\nU 8154 ; WX 475 ; N uni1FDA ; G 2754\nU 8155 ; WX 408 ; N uni1FDB ; G 2755\nU 8157 ; WX 500 ; N uni1FDD ; G 2756\nU 8158 ; WX 500 ; N uni1FDE ; G 2757\nU 8159 ; WX 500 ; N uni1FDF ; G 2758\nU 8160 ; WX 579 ; N uni1FE0 ; G 2759\nU 8161 ; WX 579 ; N uni1FE1 ; G 2760\nU 8162 ; WX 579 ; N uni1FE2 ; G 2761\nU 8163 ; WX 579 ; N uni1FE3 ; G 2762\nU 8164 ; WX 635 ; N uni1FE4 ; G 2763\nU 8165 ; WX 635 ; N uni1FE5 ; G 2764\nU 8166 ; WX 579 ; N uni1FE6 ; G 2765\nU 8167 ; WX 579 ; N uni1FE7 ; G 2766\nU 8168 ; WX 611 ; N uni1FE8 ; G 2767\nU 8169 ; WX 611 ; N uni1FE9 ; G 2768\nU 8170 ; WX 845 ; N uni1FEA ; G 2769\nU 8171 ; WX 825 ; N uni1FEB ; G 2770\nU 8172 ; WX 685 ; N uni1FEC ; G 2771\nU 8173 ; WX 500 ; N uni1FED ; G 2772\nU 8174 ; WX 500 ; N uni1FEE ; G 2773\nU 8175 ; WX 500 ; N uni1FEF ; G 2774\nU 8178 ; WX 837 ; N uni1FF2 ; G 2775\nU 8179 ; WX 837 ; N uni1FF3 ; G 2776\nU 8180 ; WX 837 ; N uni1FF4 ; G 2777\nU 8182 ; WX 837 ; N uni1FF6 ; G 2778\nU 8183 ; WX 837 ; N uni1FF7 ; G 2779\nU 8184 ; WX 941 ; N uni1FF8 ; G 2780\nU 8185 ; WX 813 ; N uni1FF9 ; G 2781\nU 8186 ; WX 922 ; N uni1FFA ; G 2782\nU 8187 ; WX 826 ; N uni1FFB ; G 2783\nU 8188 ; WX 764 ; N uni1FFC ; G 2784\nU 8189 ; WX 500 ; N uni1FFD ; G 2785\nU 8190 ; WX 500 ; N uni1FFE ; G 2786\nU 8192 ; WX 500 ; N uni2000 ; G 2787\nU 8193 ; WX 1000 ; N uni2001 ; G 2788\nU 8194 ; WX 500 ; N uni2002 ; G 2789\nU 8195 ; WX 1000 ; N uni2003 ; G 2790\nU 8196 ; WX 330 ; N uni2004 ; G 2791\nU 8197 ; WX 250 ; N uni2005 ; G 2792\nU 8198 ; WX 167 ; N uni2006 ; G 2793\nU 8199 ; WX 636 ; N uni2007 ; G 2794\nU 8200 ; WX 318 ; N uni2008 ; G 2795\nU 8201 ; WX 200 ; N uni2009 ; G 2796\nU 8202 ; WX 100 ; N uni200A ; G 2797\nU 8203 ; WX 0 ; N uni200B ; G 2798\nU 8204 ; WX 0 ; N uni200C ; G 2799\nU 8205 ; WX 0 ; N uni200D ; G 2800\nU 8206 ; WX 0 ; N uni200E ; G 2801\nU 8207 ; WX 0 ; N uni200F ; G 2802\nU 8208 ; WX 361 ; N uni2010 ; G 2803\nU 8209 ; WX 361 ; N uni2011 ; G 2804\nU 8210 ; WX 636 ; N figuredash ; G 2805\nU 8211 ; WX 500 ; N endash ; G 2806\nU 8212 ; WX 1000 ; N emdash ; G 2807\nU 8213 ; WX 1000 ; N uni2015 ; G 2808\nU 8214 ; WX 500 ; N uni2016 ; G 2809\nU 8215 ; WX 500 ; N underscoredbl ; G 2810\nU 8216 ; WX 318 ; N quoteleft ; G 2811\nU 8217 ; WX 318 ; N quoteright ; G 2812\nU 8218 ; WX 318 ; N quotesinglbase ; G 2813\nU 8219 ; WX 318 ; N quotereversed ; G 2814\nU 8220 ; WX 518 ; N quotedblleft ; G 2815\nU 8221 ; WX 518 ; N quotedblright ; G 2816\nU 8222 ; WX 518 ; N quotedblbase ; G 2817\nU 8223 ; WX 518 ; N uni201F ; G 2818\nU 8224 ; WX 500 ; N dagger ; G 2819\nU 8225 ; WX 500 ; N daggerdbl ; G 2820\nU 8226 ; WX 590 ; N bullet ; G 2821\nU 8227 ; WX 590 ; N uni2023 ; G 2822\nU 8228 ; WX 334 ; N onedotenleader ; G 2823\nU 8229 ; WX 667 ; N twodotenleader ; G 2824\nU 8230 ; WX 1000 ; N ellipsis ; G 2825\nU 8231 ; WX 318 ; N uni2027 ; G 2826\nU 8232 ; WX 0 ; N uni2028 ; G 2827\nU 8233 ; WX 0 ; N uni2029 ; G 2828\nU 8234 ; WX 0 ; N uni202A ; G 2829\nU 8235 ; WX 0 ; N uni202B ; G 2830\nU 8236 ; WX 0 ; N uni202C ; G 2831\nU 8237 ; WX 0 ; N uni202D ; G 2832\nU 8238 ; WX 0 ; N uni202E ; G 2833\nU 8239 ; WX 200 ; N uni202F ; G 2834\nU 8240 ; WX 1342 ; N perthousand ; G 2835\nU 8241 ; WX 1735 ; N uni2031 ; G 2836\nU 8242 ; WX 227 ; N minute ; G 2837\nU 8243 ; WX 374 ; N second ; G 2838\nU 8244 ; WX 520 ; N uni2034 ; G 2839\nU 8245 ; WX 227 ; N uni2035 ; G 2840\nU 8246 ; WX 374 ; N uni2036 ; G 2841\nU 8247 ; WX 520 ; N uni2037 ; G 2842\nU 8248 ; WX 339 ; N uni2038 ; G 2843\nU 8249 ; WX 400 ; N guilsinglleft ; G 2844\nU 8250 ; WX 400 ; N guilsinglright ; G 2845\nU 8251 ; WX 838 ; N uni203B ; G 2846\nU 8252 ; WX 485 ; N exclamdbl ; G 2847\nU 8253 ; WX 531 ; N uni203D ; G 2848\nU 8254 ; WX 500 ; N uni203E ; G 2849\nU 8255 ; WX 804 ; N uni203F ; G 2850\nU 8256 ; WX 804 ; N uni2040 ; G 2851\nU 8257 ; WX 250 ; N uni2041 ; G 2852\nU 8258 ; WX 1000 ; N uni2042 ; G 2853\nU 8259 ; WX 500 ; N uni2043 ; G 2854\nU 8260 ; WX 167 ; N fraction ; G 2855\nU 8261 ; WX 390 ; N uni2045 ; G 2856\nU 8262 ; WX 390 ; N uni2046 ; G 2857\nU 8263 ; WX 922 ; N uni2047 ; G 2858\nU 8264 ; WX 733 ; N uni2048 ; G 2859\nU 8265 ; WX 733 ; N uni2049 ; G 2860\nU 8266 ; WX 497 ; N uni204A ; G 2861\nU 8267 ; WX 636 ; N uni204B ; G 2862\nU 8268 ; WX 500 ; N uni204C ; G 2863\nU 8269 ; WX 500 ; N uni204D ; G 2864\nU 8270 ; WX 500 ; N uni204E ; G 2865\nU 8271 ; WX 337 ; N uni204F ; G 2866\nU 8272 ; WX 804 ; N uni2050 ; G 2867\nU 8273 ; WX 500 ; N uni2051 ; G 2868\nU 8274 ; WX 450 ; N uni2052 ; G 2869\nU 8275 ; WX 1000 ; N uni2053 ; G 2870\nU 8276 ; WX 804 ; N uni2054 ; G 2871\nU 8277 ; WX 838 ; N uni2055 ; G 2872\nU 8278 ; WX 586 ; N uni2056 ; G 2873\nU 8279 ; WX 663 ; N uni2057 ; G 2874\nU 8280 ; WX 838 ; N uni2058 ; G 2875\nU 8281 ; WX 838 ; N uni2059 ; G 2876\nU 8282 ; WX 318 ; N uni205A ; G 2877\nU 8283 ; WX 797 ; N uni205B ; G 2878\nU 8284 ; WX 838 ; N uni205C ; G 2879\nU 8285 ; WX 318 ; N uni205D ; G 2880\nU 8286 ; WX 318 ; N uni205E ; G 2881\nU 8287 ; WX 222 ; N uni205F ; G 2882\nU 8288 ; WX 0 ; N uni2060 ; G 2883\nU 8289 ; WX 0 ; N uni2061 ; G 2884\nU 8290 ; WX 0 ; N uni2062 ; G 2885\nU 8291 ; WX 0 ; N uni2063 ; G 2886\nU 8292 ; WX 0 ; N uni2064 ; G 2887\nU 8298 ; WX 0 ; N uni206A ; G 2888\nU 8299 ; WX 0 ; N uni206B ; G 2889\nU 8300 ; WX 0 ; N uni206C ; G 2890\nU 8301 ; WX 0 ; N uni206D ; G 2891\nU 8302 ; WX 0 ; N uni206E ; G 2892\nU 8303 ; WX 0 ; N uni206F ; G 2893\nU 8304 ; WX 401 ; N uni2070 ; G 2894\nU 8305 ; WX 179 ; N uni2071 ; G 2895\nU 8308 ; WX 401 ; N uni2074 ; G 2896\nU 8309 ; WX 401 ; N uni2075 ; G 2897\nU 8310 ; WX 401 ; N uni2076 ; G 2898\nU 8311 ; WX 401 ; N uni2077 ; G 2899\nU 8312 ; WX 401 ; N uni2078 ; G 2900\nU 8313 ; WX 401 ; N uni2079 ; G 2901\nU 8314 ; WX 528 ; N uni207A ; G 2902\nU 8315 ; WX 528 ; N uni207B ; G 2903\nU 8316 ; WX 528 ; N uni207C ; G 2904\nU 8317 ; WX 246 ; N uni207D ; G 2905\nU 8318 ; WX 246 ; N uni207E ; G 2906\nU 8319 ; WX 398 ; N uni207F ; G 2907\nU 8320 ; WX 401 ; N uni2080 ; G 2908\nU 8321 ; WX 401 ; N uni2081 ; G 2909\nU 8322 ; WX 401 ; N uni2082 ; G 2910\nU 8323 ; WX 401 ; N uni2083 ; G 2911\nU 8324 ; WX 401 ; N uni2084 ; G 2912\nU 8325 ; WX 401 ; N uni2085 ; G 2913\nU 8326 ; WX 401 ; N uni2086 ; G 2914\nU 8327 ; WX 401 ; N uni2087 ; G 2915\nU 8328 ; WX 401 ; N uni2088 ; G 2916\nU 8329 ; WX 401 ; N uni2089 ; G 2917\nU 8330 ; WX 528 ; N uni208A ; G 2918\nU 8331 ; WX 528 ; N uni208B ; G 2919\nU 8332 ; WX 528 ; N uni208C ; G 2920\nU 8333 ; WX 246 ; N uni208D ; G 2921\nU 8334 ; WX 246 ; N uni208E ; G 2922\nU 8336 ; WX 392 ; N uni2090 ; G 2923\nU 8337 ; WX 417 ; N uni2091 ; G 2924\nU 8338 ; WX 414 ; N uni2092 ; G 2925\nU 8339 ; WX 444 ; N uni2093 ; G 2926\nU 8340 ; WX 417 ; N uni2094 ; G 2927\nU 8341 ; WX 404 ; N uni2095 ; G 2928\nU 8342 ; WX 426 ; N uni2096 ; G 2929\nU 8343 ; WX 166 ; N uni2097 ; G 2930\nU 8344 ; WX 623 ; N uni2098 ; G 2931\nU 8345 ; WX 398 ; N uni2099 ; G 2932\nU 8346 ; WX 428 ; N uni209A ; G 2933\nU 8347 ; WX 373 ; N uni209B ; G 2934\nU 8348 ; WX 295 ; N uni209C ; G 2935\nU 8352 ; WX 877 ; N uni20A0 ; G 2936\nU 8353 ; WX 636 ; N colonmonetary ; G 2937\nU 8354 ; WX 636 ; N uni20A2 ; G 2938\nU 8355 ; WX 636 ; N franc ; G 2939\nU 8356 ; WX 636 ; N lira ; G 2940\nU 8357 ; WX 974 ; N uni20A5 ; G 2941\nU 8358 ; WX 636 ; N uni20A6 ; G 2942\nU 8359 ; WX 1272 ; N peseta ; G 2943\nU 8360 ; WX 1074 ; N uni20A8 ; G 2944\nU 8361 ; WX 989 ; N uni20A9 ; G 2945\nU 8362 ; WX 784 ; N uni20AA ; G 2946\nU 8363 ; WX 636 ; N dong ; G 2947\nU 8364 ; WX 636 ; N Euro ; G 2948\nU 8365 ; WX 636 ; N uni20AD ; G 2949\nU 8366 ; WX 636 ; N uni20AE ; G 2950\nU 8367 ; WX 1272 ; N uni20AF ; G 2951\nU 8368 ; WX 636 ; N uni20B0 ; G 2952\nU 8369 ; WX 636 ; N uni20B1 ; G 2953\nU 8370 ; WX 636 ; N uni20B2 ; G 2954\nU 8371 ; WX 636 ; N uni20B3 ; G 2955\nU 8372 ; WX 774 ; N uni20B4 ; G 2956\nU 8373 ; WX 636 ; N uni20B5 ; G 2957\nU 8376 ; WX 636 ; N uni20B8 ; G 2958\nU 8377 ; WX 636 ; N uni20B9 ; G 2959\nU 8378 ; WX 636 ; N uni20BA ; G 2960\nU 8381 ; WX 636 ; N uni20BD ; G 2961\nU 8400 ; WX 0 ; N uni20D0 ; G 2962\nU 8401 ; WX 0 ; N uni20D1 ; G 2963\nU 8406 ; WX 0 ; N uni20D6 ; G 2964\nU 8407 ; WX 0 ; N uni20D7 ; G 2965\nU 8411 ; WX 0 ; N uni20DB ; G 2966\nU 8412 ; WX 0 ; N uni20DC ; G 2967\nU 8417 ; WX 0 ; N uni20E1 ; G 2968\nU 8448 ; WX 1019 ; N uni2100 ; G 2969\nU 8449 ; WX 1019 ; N uni2101 ; G 2970\nU 8450 ; WX 698 ; N uni2102 ; G 2971\nU 8451 ; WX 1123 ; N uni2103 ; G 2972\nU 8452 ; WX 642 ; N uni2104 ; G 2973\nU 8453 ; WX 1019 ; N uni2105 ; G 2974\nU 8454 ; WX 1067 ; N uni2106 ; G 2975\nU 8455 ; WX 614 ; N uni2107 ; G 2976\nU 8456 ; WX 698 ; N uni2108 ; G 2977\nU 8457 ; WX 952 ; N uni2109 ; G 2978\nU 8459 ; WX 988 ; N uni210B ; G 2979\nU 8460 ; WX 754 ; N uni210C ; G 2980\nU 8461 ; WX 850 ; N uni210D ; G 2981\nU 8462 ; WX 634 ; N uni210E ; G 2982\nU 8463 ; WX 634 ; N uni210F ; G 2983\nU 8464 ; WX 470 ; N uni2110 ; G 2984\nU 8465 ; WX 697 ; N Ifraktur ; G 2985\nU 8466 ; WX 720 ; N uni2112 ; G 2986\nU 8467 ; WX 413 ; N uni2113 ; G 2987\nU 8468 ; WX 818 ; N uni2114 ; G 2988\nU 8469 ; WX 801 ; N uni2115 ; G 2989\nU 8470 ; WX 1040 ; N uni2116 ; G 2990\nU 8471 ; WX 1000 ; N uni2117 ; G 2991\nU 8472 ; WX 697 ; N weierstrass ; G 2992\nU 8473 ; WX 701 ; N uni2119 ; G 2993\nU 8474 ; WX 787 ; N uni211A ; G 2994\nU 8475 ; WX 798 ; N uni211B ; G 2995\nU 8476 ; WX 814 ; N Rfraktur ; G 2996\nU 8477 ; WX 792 ; N uni211D ; G 2997\nU 8478 ; WX 896 ; N prescription ; G 2998\nU 8479 ; WX 684 ; N uni211F ; G 2999\nU 8480 ; WX 1020 ; N uni2120 ; G 3000\nU 8481 ; WX 1074 ; N uni2121 ; G 3001\nU 8482 ; WX 1000 ; N trademark ; G 3002\nU 8483 ; WX 684 ; N uni2123 ; G 3003\nU 8484 ; WX 745 ; N uni2124 ; G 3004\nU 8485 ; WX 578 ; N uni2125 ; G 3005\nU 8486 ; WX 764 ; N uni2126 ; G 3006\nU 8487 ; WX 764 ; N uni2127 ; G 3007\nU 8488 ; WX 616 ; N uni2128 ; G 3008\nU 8489 ; WX 338 ; N uni2129 ; G 3009\nU 8490 ; WX 656 ; N uni212A ; G 3010\nU 8491 ; WX 684 ; N uni212B ; G 3011\nU 8492 ; WX 786 ; N uni212C ; G 3012\nU 8493 ; WX 703 ; N uni212D ; G 3013\nU 8494 ; WX 854 ; N estimated ; G 3014\nU 8495 ; WX 592 ; N uni212F ; G 3015\nU 8496 ; WX 605 ; N uni2130 ; G 3016\nU 8497 ; WX 786 ; N uni2131 ; G 3017\nU 8498 ; WX 575 ; N uni2132 ; G 3018\nU 8499 ; WX 1069 ; N uni2133 ; G 3019\nU 8500 ; WX 462 ; N uni2134 ; G 3020\nU 8501 ; WX 745 ; N aleph ; G 3021\nU 8502 ; WX 674 ; N uni2136 ; G 3022\nU 8503 ; WX 466 ; N uni2137 ; G 3023\nU 8504 ; WX 645 ; N uni2138 ; G 3024\nU 8505 ; WX 380 ; N uni2139 ; G 3025\nU 8506 ; WX 926 ; N uni213A ; G 3026\nU 8507 ; WX 1194 ; N uni213B ; G 3027\nU 8508 ; WX 702 ; N uni213C ; G 3028\nU 8509 ; WX 728 ; N uni213D ; G 3029\nU 8510 ; WX 654 ; N uni213E ; G 3030\nU 8511 ; WX 849 ; N uni213F ; G 3031\nU 8512 ; WX 811 ; N uni2140 ; G 3032\nU 8513 ; WX 775 ; N uni2141 ; G 3033\nU 8514 ; WX 557 ; N uni2142 ; G 3034\nU 8515 ; WX 557 ; N uni2143 ; G 3035\nU 8516 ; WX 611 ; N uni2144 ; G 3036\nU 8517 ; WX 819 ; N uni2145 ; G 3037\nU 8518 ; WX 708 ; N uni2146 ; G 3038\nU 8519 ; WX 615 ; N uni2147 ; G 3039\nU 8520 ; WX 351 ; N uni2148 ; G 3040\nU 8521 ; WX 351 ; N uni2149 ; G 3041\nU 8523 ; WX 780 ; N uni214B ; G 3042\nU 8526 ; WX 526 ; N uni214E ; G 3043\nU 8528 ; WX 969 ; N uni2150 ; G 3044\nU 8529 ; WX 969 ; N uni2151 ; G 3045\nU 8530 ; WX 1370 ; N uni2152 ; G 3046\nU 8531 ; WX 969 ; N onethird ; G 3047\nU 8532 ; WX 969 ; N twothirds ; G 3048\nU 8533 ; WX 969 ; N uni2155 ; G 3049\nU 8534 ; WX 969 ; N uni2156 ; G 3050\nU 8535 ; WX 969 ; N uni2157 ; G 3051\nU 8536 ; WX 969 ; N uni2158 ; G 3052\nU 8537 ; WX 969 ; N uni2159 ; G 3053\nU 8538 ; WX 969 ; N uni215A ; G 3054\nU 8539 ; WX 969 ; N oneeighth ; G 3055\nU 8540 ; WX 969 ; N threeeighths ; G 3056\nU 8541 ; WX 969 ; N fiveeighths ; G 3057\nU 8542 ; WX 969 ; N seveneighths ; G 3058\nU 8543 ; WX 568 ; N uni215F ; G 3059\nU 8544 ; WX 295 ; N uni2160 ; G 3060\nU 8545 ; WX 492 ; N uni2161 ; G 3061\nU 8546 ; WX 689 ; N uni2162 ; G 3062\nU 8547 ; WX 923 ; N uni2163 ; G 3063\nU 8548 ; WX 684 ; N uni2164 ; G 3064\nU 8549 ; WX 922 ; N uni2165 ; G 3065\nU 8550 ; WX 1120 ; N uni2166 ; G 3066\nU 8551 ; WX 1317 ; N uni2167 ; G 3067\nU 8552 ; WX 917 ; N uni2168 ; G 3068\nU 8553 ; WX 685 ; N uni2169 ; G 3069\nU 8554 ; WX 933 ; N uni216A ; G 3070\nU 8555 ; WX 1131 ; N uni216B ; G 3071\nU 8556 ; WX 557 ; N uni216C ; G 3072\nU 8557 ; WX 698 ; N uni216D ; G 3073\nU 8558 ; WX 770 ; N uni216E ; G 3074\nU 8559 ; WX 863 ; N uni216F ; G 3075\nU 8560 ; WX 278 ; N uni2170 ; G 3076\nU 8561 ; WX 458 ; N uni2171 ; G 3077\nU 8562 ; WX 637 ; N uni2172 ; G 3078\nU 8563 ; WX 812 ; N uni2173 ; G 3079\nU 8564 ; WX 592 ; N uni2174 ; G 3080\nU 8565 ; WX 811 ; N uni2175 ; G 3081\nU 8566 ; WX 991 ; N uni2176 ; G 3082\nU 8567 ; WX 1170 ; N uni2177 ; G 3083\nU 8568 ; WX 819 ; N uni2178 ; G 3084\nU 8569 ; WX 592 ; N uni2179 ; G 3085\nU 8570 ; WX 822 ; N uni217A ; G 3086\nU 8571 ; WX 1002 ; N uni217B ; G 3087\nU 8572 ; WX 278 ; N uni217C ; G 3088\nU 8573 ; WX 550 ; N uni217D ; G 3089\nU 8574 ; WX 635 ; N uni217E ; G 3090\nU 8575 ; WX 974 ; N uni217F ; G 3091\nU 8576 ; WX 1245 ; N uni2180 ; G 3092\nU 8577 ; WX 770 ; N uni2181 ; G 3093\nU 8578 ; WX 1245 ; N uni2182 ; G 3094\nU 8579 ; WX 703 ; N uni2183 ; G 3095\nU 8580 ; WX 549 ; N uni2184 ; G 3096\nU 8581 ; WX 698 ; N uni2185 ; G 3097\nU 8585 ; WX 969 ; N uni2189 ; G 3098\nU 8592 ; WX 838 ; N arrowleft ; G 3099\nU 8593 ; WX 838 ; N arrowup ; G 3100\nU 8594 ; WX 838 ; N arrowright ; G 3101\nU 8595 ; WX 838 ; N arrowdown ; G 3102\nU 8596 ; WX 838 ; N arrowboth ; G 3103\nU 8597 ; WX 838 ; N arrowupdn ; G 3104\nU 8598 ; WX 838 ; N uni2196 ; G 3105\nU 8599 ; WX 838 ; N uni2197 ; G 3106\nU 8600 ; WX 838 ; N uni2198 ; G 3107\nU 8601 ; WX 838 ; N uni2199 ; G 3108\nU 8602 ; WX 838 ; N uni219A ; G 3109\nU 8603 ; WX 838 ; N uni219B ; G 3110\nU 8604 ; WX 838 ; N uni219C ; G 3111\nU 8605 ; WX 838 ; N uni219D ; G 3112\nU 8606 ; WX 838 ; N uni219E ; G 3113\nU 8607 ; WX 838 ; N uni219F ; G 3114\nU 8608 ; WX 838 ; N uni21A0 ; G 3115\nU 8609 ; WX 838 ; N uni21A1 ; G 3116\nU 8610 ; WX 838 ; N uni21A2 ; G 3117\nU 8611 ; WX 838 ; N uni21A3 ; G 3118\nU 8612 ; WX 838 ; N uni21A4 ; G 3119\nU 8613 ; WX 838 ; N uni21A5 ; G 3120\nU 8614 ; WX 838 ; N uni21A6 ; G 3121\nU 8615 ; WX 838 ; N uni21A7 ; G 3122\nU 8616 ; WX 838 ; N arrowupdnbse ; G 3123\nU 8617 ; WX 838 ; N uni21A9 ; G 3124\nU 8618 ; WX 838 ; N uni21AA ; G 3125\nU 8619 ; WX 838 ; N uni21AB ; G 3126\nU 8620 ; WX 838 ; N uni21AC ; G 3127\nU 8621 ; WX 838 ; N uni21AD ; G 3128\nU 8622 ; WX 838 ; N uni21AE ; G 3129\nU 8623 ; WX 838 ; N uni21AF ; G 3130\nU 8624 ; WX 838 ; N uni21B0 ; G 3131\nU 8625 ; WX 838 ; N uni21B1 ; G 3132\nU 8626 ; WX 838 ; N uni21B2 ; G 3133\nU 8627 ; WX 838 ; N uni21B3 ; G 3134\nU 8628 ; WX 838 ; N uni21B4 ; G 3135\nU 8629 ; WX 838 ; N carriagereturn ; G 3136\nU 8630 ; WX 838 ; N uni21B6 ; G 3137\nU 8631 ; WX 838 ; N uni21B7 ; G 3138\nU 8632 ; WX 838 ; N uni21B8 ; G 3139\nU 8633 ; WX 838 ; N uni21B9 ; G 3140\nU 8634 ; WX 838 ; N uni21BA ; G 3141\nU 8635 ; WX 838 ; N uni21BB ; G 3142\nU 8636 ; WX 838 ; N uni21BC ; G 3143\nU 8637 ; WX 838 ; N uni21BD ; G 3144\nU 8638 ; WX 838 ; N uni21BE ; G 3145\nU 8639 ; WX 838 ; N uni21BF ; G 3146\nU 8640 ; WX 838 ; N uni21C0 ; G 3147\nU 8641 ; WX 838 ; N uni21C1 ; G 3148\nU 8642 ; WX 838 ; N uni21C2 ; G 3149\nU 8643 ; WX 838 ; N uni21C3 ; G 3150\nU 8644 ; WX 838 ; N uni21C4 ; G 3151\nU 8645 ; WX 838 ; N uni21C5 ; G 3152\nU 8646 ; WX 838 ; N uni21C6 ; G 3153\nU 8647 ; WX 838 ; N uni21C7 ; G 3154\nU 8648 ; WX 838 ; N uni21C8 ; G 3155\nU 8649 ; WX 838 ; N uni21C9 ; G 3156\nU 8650 ; WX 838 ; N uni21CA ; G 3157\nU 8651 ; WX 838 ; N uni21CB ; G 3158\nU 8652 ; WX 838 ; N uni21CC ; G 3159\nU 8653 ; WX 838 ; N uni21CD ; G 3160\nU 8654 ; WX 838 ; N uni21CE ; G 3161\nU 8655 ; WX 838 ; N uni21CF ; G 3162\nU 8656 ; WX 838 ; N arrowdblleft ; G 3163\nU 8657 ; WX 838 ; N arrowdblup ; G 3164\nU 8658 ; WX 838 ; N arrowdblright ; G 3165\nU 8659 ; WX 838 ; N arrowdbldown ; G 3166\nU 8660 ; WX 838 ; N arrowdblboth ; G 3167\nU 8661 ; WX 838 ; N uni21D5 ; G 3168\nU 8662 ; WX 838 ; N uni21D6 ; G 3169\nU 8663 ; WX 838 ; N uni21D7 ; G 3170\nU 8664 ; WX 838 ; N uni21D8 ; G 3171\nU 8665 ; WX 838 ; N uni21D9 ; G 3172\nU 8666 ; WX 838 ; N uni21DA ; G 3173\nU 8667 ; WX 838 ; N uni21DB ; G 3174\nU 8668 ; WX 838 ; N uni21DC ; G 3175\nU 8669 ; WX 838 ; N uni21DD ; G 3176\nU 8670 ; WX 838 ; N uni21DE ; G 3177\nU 8671 ; WX 838 ; N uni21DF ; G 3178\nU 8672 ; WX 838 ; N uni21E0 ; G 3179\nU 8673 ; WX 838 ; N uni21E1 ; G 3180\nU 8674 ; WX 838 ; N uni21E2 ; G 3181\nU 8675 ; WX 838 ; N uni21E3 ; G 3182\nU 8676 ; WX 838 ; N uni21E4 ; G 3183\nU 8677 ; WX 838 ; N uni21E5 ; G 3184\nU 8678 ; WX 838 ; N uni21E6 ; G 3185\nU 8679 ; WX 838 ; N uni21E7 ; G 3186\nU 8680 ; WX 838 ; N uni21E8 ; G 3187\nU 8681 ; WX 838 ; N uni21E9 ; G 3188\nU 8682 ; WX 838 ; N uni21EA ; G 3189\nU 8683 ; WX 838 ; N uni21EB ; G 3190\nU 8684 ; WX 838 ; N uni21EC ; G 3191\nU 8685 ; WX 838 ; N uni21ED ; G 3192\nU 8686 ; WX 838 ; N uni21EE ; G 3193\nU 8687 ; WX 838 ; N uni21EF ; G 3194\nU 8688 ; WX 838 ; N uni21F0 ; G 3195\nU 8689 ; WX 838 ; N uni21F1 ; G 3196\nU 8690 ; WX 838 ; N uni21F2 ; G 3197\nU 8691 ; WX 838 ; N uni21F3 ; G 3198\nU 8692 ; WX 838 ; N uni21F4 ; G 3199\nU 8693 ; WX 838 ; N uni21F5 ; G 3200\nU 8694 ; WX 838 ; N uni21F6 ; G 3201\nU 8695 ; WX 838 ; N uni21F7 ; G 3202\nU 8696 ; WX 838 ; N uni21F8 ; G 3203\nU 8697 ; WX 838 ; N uni21F9 ; G 3204\nU 8698 ; WX 838 ; N uni21FA ; G 3205\nU 8699 ; WX 838 ; N uni21FB ; G 3206\nU 8700 ; WX 838 ; N uni21FC ; G 3207\nU 8701 ; WX 838 ; N uni21FD ; G 3208\nU 8702 ; WX 838 ; N uni21FE ; G 3209\nU 8703 ; WX 838 ; N uni21FF ; G 3210\nU 8704 ; WX 684 ; N universal ; G 3211\nU 8705 ; WX 636 ; N uni2201 ; G 3212\nU 8706 ; WX 517 ; N partialdiff ; G 3213\nU 8707 ; WX 632 ; N existential ; G 3214\nU 8708 ; WX 632 ; N uni2204 ; G 3215\nU 8709 ; WX 871 ; N emptyset ; G 3216\nU 8710 ; WX 669 ; N increment ; G 3217\nU 8711 ; WX 669 ; N gradient ; G 3218\nU 8712 ; WX 871 ; N element ; G 3219\nU 8713 ; WX 871 ; N notelement ; G 3220\nU 8714 ; WX 718 ; N uni220A ; G 3221\nU 8715 ; WX 871 ; N suchthat ; G 3222\nU 8716 ; WX 871 ; N uni220C ; G 3223\nU 8717 ; WX 718 ; N uni220D ; G 3224\nU 8718 ; WX 636 ; N uni220E ; G 3225\nU 8719 ; WX 757 ; N product ; G 3226\nU 8720 ; WX 757 ; N uni2210 ; G 3227\nU 8721 ; WX 674 ; N summation ; G 3228\nU 8722 ; WX 838 ; N minus ; G 3229\nU 8723 ; WX 838 ; N uni2213 ; G 3230\nU 8724 ; WX 838 ; N uni2214 ; G 3231\nU 8725 ; WX 337 ; N uni2215 ; G 3232\nU 8726 ; WX 637 ; N uni2216 ; G 3233\nU 8727 ; WX 838 ; N asteriskmath ; G 3234\nU 8728 ; WX 626 ; N uni2218 ; G 3235\nU 8729 ; WX 626 ; N uni2219 ; G 3236\nU 8730 ; WX 637 ; N radical ; G 3237\nU 8731 ; WX 637 ; N uni221B ; G 3238\nU 8732 ; WX 637 ; N uni221C ; G 3239\nU 8733 ; WX 714 ; N proportional ; G 3240\nU 8734 ; WX 833 ; N infinity ; G 3241\nU 8735 ; WX 838 ; N orthogonal ; G 3242\nU 8736 ; WX 896 ; N angle ; G 3243\nU 8737 ; WX 896 ; N uni2221 ; G 3244\nU 8738 ; WX 838 ; N uni2222 ; G 3245\nU 8739 ; WX 500 ; N uni2223 ; G 3246\nU 8740 ; WX 500 ; N uni2224 ; G 3247\nU 8741 ; WX 500 ; N uni2225 ; G 3248\nU 8742 ; WX 500 ; N uni2226 ; G 3249\nU 8743 ; WX 732 ; N logicaland ; G 3250\nU 8744 ; WX 732 ; N logicalor ; G 3251\nU 8745 ; WX 732 ; N intersection ; G 3252\nU 8746 ; WX 732 ; N union ; G 3253\nU 8747 ; WX 521 ; N integral ; G 3254\nU 8748 ; WX 789 ; N uni222C ; G 3255\nU 8749 ; WX 1057 ; N uni222D ; G 3256\nU 8750 ; WX 521 ; N uni222E ; G 3257\nU 8751 ; WX 789 ; N uni222F ; G 3258\nU 8752 ; WX 1057 ; N uni2230 ; G 3259\nU 8753 ; WX 521 ; N uni2231 ; G 3260\nU 8754 ; WX 521 ; N uni2232 ; G 3261\nU 8755 ; WX 521 ; N uni2233 ; G 3262\nU 8756 ; WX 636 ; N therefore ; G 3263\nU 8757 ; WX 636 ; N uni2235 ; G 3264\nU 8758 ; WX 260 ; N uni2236 ; G 3265\nU 8759 ; WX 636 ; N uni2237 ; G 3266\nU 8760 ; WX 838 ; N uni2238 ; G 3267\nU 8761 ; WX 838 ; N uni2239 ; G 3268\nU 8762 ; WX 838 ; N uni223A ; G 3269\nU 8763 ; WX 838 ; N uni223B ; G 3270\nU 8764 ; WX 838 ; N similar ; G 3271\nU 8765 ; WX 838 ; N uni223D ; G 3272\nU 8766 ; WX 838 ; N uni223E ; G 3273\nU 8767 ; WX 838 ; N uni223F ; G 3274\nU 8768 ; WX 375 ; N uni2240 ; G 3275\nU 8769 ; WX 838 ; N uni2241 ; G 3276\nU 8770 ; WX 838 ; N uni2242 ; G 3277\nU 8771 ; WX 838 ; N uni2243 ; G 3278\nU 8772 ; WX 838 ; N uni2244 ; G 3279\nU 8773 ; WX 838 ; N congruent ; G 3280\nU 8774 ; WX 838 ; N uni2246 ; G 3281\nU 8775 ; WX 838 ; N uni2247 ; G 3282\nU 8776 ; WX 838 ; N approxequal ; G 3283\nU 8777 ; WX 838 ; N uni2249 ; G 3284\nU 8778 ; WX 838 ; N uni224A ; G 3285\nU 8779 ; WX 838 ; N uni224B ; G 3286\nU 8780 ; WX 838 ; N uni224C ; G 3287\nU 8781 ; WX 838 ; N uni224D ; G 3288\nU 8782 ; WX 838 ; N uni224E ; G 3289\nU 8783 ; WX 838 ; N uni224F ; G 3290\nU 8784 ; WX 838 ; N uni2250 ; G 3291\nU 8785 ; WX 838 ; N uni2251 ; G 3292\nU 8786 ; WX 839 ; N uni2252 ; G 3293\nU 8787 ; WX 839 ; N uni2253 ; G 3294\nU 8788 ; WX 1000 ; N uni2254 ; G 3295\nU 8789 ; WX 1000 ; N uni2255 ; G 3296\nU 8790 ; WX 838 ; N uni2256 ; G 3297\nU 8791 ; WX 838 ; N uni2257 ; G 3298\nU 8792 ; WX 838 ; N uni2258 ; G 3299\nU 8793 ; WX 838 ; N uni2259 ; G 3300\nU 8794 ; WX 838 ; N uni225A ; G 3301\nU 8795 ; WX 838 ; N uni225B ; G 3302\nU 8796 ; WX 838 ; N uni225C ; G 3303\nU 8797 ; WX 838 ; N uni225D ; G 3304\nU 8798 ; WX 838 ; N uni225E ; G 3305\nU 8799 ; WX 838 ; N uni225F ; G 3306\nU 8800 ; WX 838 ; N notequal ; G 3307\nU 8801 ; WX 838 ; N equivalence ; G 3308\nU 8802 ; WX 838 ; N uni2262 ; G 3309\nU 8803 ; WX 838 ; N uni2263 ; G 3310\nU 8804 ; WX 838 ; N lessequal ; G 3311\nU 8805 ; WX 838 ; N greaterequal ; G 3312\nU 8806 ; WX 838 ; N uni2266 ; G 3313\nU 8807 ; WX 838 ; N uni2267 ; G 3314\nU 8808 ; WX 838 ; N uni2268 ; G 3315\nU 8809 ; WX 838 ; N uni2269 ; G 3316\nU 8810 ; WX 1047 ; N uni226A ; G 3317\nU 8811 ; WX 1047 ; N uni226B ; G 3318\nU 8812 ; WX 464 ; N uni226C ; G 3319\nU 8813 ; WX 838 ; N uni226D ; G 3320\nU 8814 ; WX 838 ; N uni226E ; G 3321\nU 8815 ; WX 838 ; N uni226F ; G 3322\nU 8816 ; WX 838 ; N uni2270 ; G 3323\nU 8817 ; WX 838 ; N uni2271 ; G 3324\nU 8818 ; WX 838 ; N uni2272 ; G 3325\nU 8819 ; WX 838 ; N uni2273 ; G 3326\nU 8820 ; WX 838 ; N uni2274 ; G 3327\nU 8821 ; WX 838 ; N uni2275 ; G 3328\nU 8822 ; WX 838 ; N uni2276 ; G 3329\nU 8823 ; WX 838 ; N uni2277 ; G 3330\nU 8824 ; WX 838 ; N uni2278 ; G 3331\nU 8825 ; WX 838 ; N uni2279 ; G 3332\nU 8826 ; WX 838 ; N uni227A ; G 3333\nU 8827 ; WX 838 ; N uni227B ; G 3334\nU 8828 ; WX 838 ; N uni227C ; G 3335\nU 8829 ; WX 838 ; N uni227D ; G 3336\nU 8830 ; WX 838 ; N uni227E ; G 3337\nU 8831 ; WX 838 ; N uni227F ; G 3338\nU 8832 ; WX 838 ; N uni2280 ; G 3339\nU 8833 ; WX 838 ; N uni2281 ; G 3340\nU 8834 ; WX 838 ; N propersubset ; G 3341\nU 8835 ; WX 838 ; N propersuperset ; G 3342\nU 8836 ; WX 838 ; N notsubset ; G 3343\nU 8837 ; WX 838 ; N uni2285 ; G 3344\nU 8838 ; WX 838 ; N reflexsubset ; G 3345\nU 8839 ; WX 838 ; N reflexsuperset ; G 3346\nU 8840 ; WX 838 ; N uni2288 ; G 3347\nU 8841 ; WX 838 ; N uni2289 ; G 3348\nU 8842 ; WX 838 ; N uni228A ; G 3349\nU 8843 ; WX 838 ; N uni228B ; G 3350\nU 8844 ; WX 732 ; N uni228C ; G 3351\nU 8845 ; WX 732 ; N uni228D ; G 3352\nU 8846 ; WX 732 ; N uni228E ; G 3353\nU 8847 ; WX 838 ; N uni228F ; G 3354\nU 8848 ; WX 838 ; N uni2290 ; G 3355\nU 8849 ; WX 838 ; N uni2291 ; G 3356\nU 8850 ; WX 838 ; N uni2292 ; G 3357\nU 8851 ; WX 780 ; N uni2293 ; G 3358\nU 8852 ; WX 780 ; N uni2294 ; G 3359\nU 8853 ; WX 838 ; N circleplus ; G 3360\nU 8854 ; WX 838 ; N uni2296 ; G 3361\nU 8855 ; WX 838 ; N circlemultiply ; G 3362\nU 8856 ; WX 838 ; N uni2298 ; G 3363\nU 8857 ; WX 838 ; N uni2299 ; G 3364\nU 8858 ; WX 838 ; N uni229A ; G 3365\nU 8859 ; WX 838 ; N uni229B ; G 3366\nU 8860 ; WX 838 ; N uni229C ; G 3367\nU 8861 ; WX 838 ; N uni229D ; G 3368\nU 8862 ; WX 838 ; N uni229E ; G 3369\nU 8863 ; WX 838 ; N uni229F ; G 3370\nU 8864 ; WX 838 ; N uni22A0 ; G 3371\nU 8865 ; WX 838 ; N uni22A1 ; G 3372\nU 8866 ; WX 871 ; N uni22A2 ; G 3373\nU 8867 ; WX 871 ; N uni22A3 ; G 3374\nU 8868 ; WX 871 ; N uni22A4 ; G 3375\nU 8869 ; WX 871 ; N perpendicular ; G 3376\nU 8870 ; WX 521 ; N uni22A6 ; G 3377\nU 8871 ; WX 521 ; N uni22A7 ; G 3378\nU 8872 ; WX 871 ; N uni22A8 ; G 3379\nU 8873 ; WX 871 ; N uni22A9 ; G 3380\nU 8874 ; WX 871 ; N uni22AA ; G 3381\nU 8875 ; WX 871 ; N uni22AB ; G 3382\nU 8876 ; WX 871 ; N uni22AC ; G 3383\nU 8877 ; WX 871 ; N uni22AD ; G 3384\nU 8878 ; WX 871 ; N uni22AE ; G 3385\nU 8879 ; WX 871 ; N uni22AF ; G 3386\nU 8880 ; WX 838 ; N uni22B0 ; G 3387\nU 8881 ; WX 838 ; N uni22B1 ; G 3388\nU 8882 ; WX 838 ; N uni22B2 ; G 3389\nU 8883 ; WX 838 ; N uni22B3 ; G 3390\nU 8884 ; WX 838 ; N uni22B4 ; G 3391\nU 8885 ; WX 838 ; N uni22B5 ; G 3392\nU 8886 ; WX 1000 ; N uni22B6 ; G 3393\nU 8887 ; WX 1000 ; N uni22B7 ; G 3394\nU 8888 ; WX 838 ; N uni22B8 ; G 3395\nU 8889 ; WX 838 ; N uni22B9 ; G 3396\nU 8890 ; WX 521 ; N uni22BA ; G 3397\nU 8891 ; WX 732 ; N uni22BB ; G 3398\nU 8892 ; WX 732 ; N uni22BC ; G 3399\nU 8893 ; WX 732 ; N uni22BD ; G 3400\nU 8894 ; WX 838 ; N uni22BE ; G 3401\nU 8895 ; WX 838 ; N uni22BF ; G 3402\nU 8896 ; WX 820 ; N uni22C0 ; G 3403\nU 8897 ; WX 820 ; N uni22C1 ; G 3404\nU 8898 ; WX 820 ; N uni22C2 ; G 3405\nU 8899 ; WX 820 ; N uni22C3 ; G 3406\nU 8900 ; WX 626 ; N uni22C4 ; G 3407\nU 8901 ; WX 318 ; N dotmath ; G 3408\nU 8902 ; WX 626 ; N uni22C6 ; G 3409\nU 8903 ; WX 838 ; N uni22C7 ; G 3410\nU 8904 ; WX 1000 ; N uni22C8 ; G 3411\nU 8905 ; WX 1000 ; N uni22C9 ; G 3412\nU 8906 ; WX 1000 ; N uni22CA ; G 3413\nU 8907 ; WX 1000 ; N uni22CB ; G 3414\nU 8908 ; WX 1000 ; N uni22CC ; G 3415\nU 8909 ; WX 838 ; N uni22CD ; G 3416\nU 8910 ; WX 732 ; N uni22CE ; G 3417\nU 8911 ; WX 732 ; N uni22CF ; G 3418\nU 8912 ; WX 838 ; N uni22D0 ; G 3419\nU 8913 ; WX 838 ; N uni22D1 ; G 3420\nU 8914 ; WX 838 ; N uni22D2 ; G 3421\nU 8915 ; WX 838 ; N uni22D3 ; G 3422\nU 8916 ; WX 838 ; N uni22D4 ; G 3423\nU 8917 ; WX 838 ; N uni22D5 ; G 3424\nU 8918 ; WX 838 ; N uni22D6 ; G 3425\nU 8919 ; WX 838 ; N uni22D7 ; G 3426\nU 8920 ; WX 1422 ; N uni22D8 ; G 3427\nU 8921 ; WX 1422 ; N uni22D9 ; G 3428\nU 8922 ; WX 838 ; N uni22DA ; G 3429\nU 8923 ; WX 838 ; N uni22DB ; G 3430\nU 8924 ; WX 838 ; N uni22DC ; G 3431\nU 8925 ; WX 838 ; N uni22DD ; G 3432\nU 8926 ; WX 838 ; N uni22DE ; G 3433\nU 8927 ; WX 838 ; N uni22DF ; G 3434\nU 8928 ; WX 838 ; N uni22E0 ; G 3435\nU 8929 ; WX 838 ; N uni22E1 ; G 3436\nU 8930 ; WX 838 ; N uni22E2 ; G 3437\nU 8931 ; WX 838 ; N uni22E3 ; G 3438\nU 8932 ; WX 838 ; N uni22E4 ; G 3439\nU 8933 ; WX 838 ; N uni22E5 ; G 3440\nU 8934 ; WX 838 ; N uni22E6 ; G 3441\nU 8935 ; WX 838 ; N uni22E7 ; G 3442\nU 8936 ; WX 838 ; N uni22E8 ; G 3443\nU 8937 ; WX 838 ; N uni22E9 ; G 3444\nU 8938 ; WX 838 ; N uni22EA ; G 3445\nU 8939 ; WX 838 ; N uni22EB ; G 3446\nU 8940 ; WX 838 ; N uni22EC ; G 3447\nU 8941 ; WX 838 ; N uni22ED ; G 3448\nU 8942 ; WX 1000 ; N uni22EE ; G 3449\nU 8943 ; WX 1000 ; N uni22EF ; G 3450\nU 8944 ; WX 1000 ; N uni22F0 ; G 3451\nU 8945 ; WX 1000 ; N uni22F1 ; G 3452\nU 8946 ; WX 1000 ; N uni22F2 ; G 3453\nU 8947 ; WX 871 ; N uni22F3 ; G 3454\nU 8948 ; WX 718 ; N uni22F4 ; G 3455\nU 8949 ; WX 871 ; N uni22F5 ; G 3456\nU 8950 ; WX 871 ; N uni22F6 ; G 3457\nU 8951 ; WX 718 ; N uni22F7 ; G 3458\nU 8952 ; WX 871 ; N uni22F8 ; G 3459\nU 8953 ; WX 871 ; N uni22F9 ; G 3460\nU 8954 ; WX 1000 ; N uni22FA ; G 3461\nU 8955 ; WX 871 ; N uni22FB ; G 3462\nU 8956 ; WX 718 ; N uni22FC ; G 3463\nU 8957 ; WX 871 ; N uni22FD ; G 3464\nU 8958 ; WX 718 ; N uni22FE ; G 3465\nU 8959 ; WX 871 ; N uni22FF ; G 3466\nU 8960 ; WX 602 ; N uni2300 ; G 3467\nU 8961 ; WX 602 ; N uni2301 ; G 3468\nU 8962 ; WX 635 ; N house ; G 3469\nU 8963 ; WX 838 ; N uni2303 ; G 3470\nU 8964 ; WX 838 ; N uni2304 ; G 3471\nU 8965 ; WX 838 ; N uni2305 ; G 3472\nU 8966 ; WX 838 ; N uni2306 ; G 3473\nU 8967 ; WX 488 ; N uni2307 ; G 3474\nU 8968 ; WX 390 ; N uni2308 ; G 3475\nU 8969 ; WX 390 ; N uni2309 ; G 3476\nU 8970 ; WX 390 ; N uni230A ; G 3477\nU 8971 ; WX 390 ; N uni230B ; G 3478\nU 8972 ; WX 809 ; N uni230C ; G 3479\nU 8973 ; WX 809 ; N uni230D ; G 3480\nU 8974 ; WX 809 ; N uni230E ; G 3481\nU 8975 ; WX 809 ; N uni230F ; G 3482\nU 8976 ; WX 838 ; N revlogicalnot ; G 3483\nU 8977 ; WX 513 ; N uni2311 ; G 3484\nU 8984 ; WX 1000 ; N uni2318 ; G 3485\nU 8985 ; WX 838 ; N uni2319 ; G 3486\nU 8988 ; WX 469 ; N uni231C ; G 3487\nU 8989 ; WX 469 ; N uni231D ; G 3488\nU 8990 ; WX 469 ; N uni231E ; G 3489\nU 8991 ; WX 469 ; N uni231F ; G 3490\nU 8992 ; WX 521 ; N integraltp ; G 3491\nU 8993 ; WX 521 ; N integralbt ; G 3492\nU 8996 ; WX 1152 ; N uni2324 ; G 3493\nU 8997 ; WX 1152 ; N uni2325 ; G 3494\nU 8998 ; WX 1414 ; N uni2326 ; G 3495\nU 8999 ; WX 1152 ; N uni2327 ; G 3496\nU 9000 ; WX 1443 ; N uni2328 ; G 3497\nU 9003 ; WX 1414 ; N uni232B ; G 3498\nU 9004 ; WX 873 ; N uni232C ; G 3499\nU 9075 ; WX 338 ; N uni2373 ; G 3500\nU 9076 ; WX 635 ; N uni2374 ; G 3501\nU 9077 ; WX 837 ; N uni2375 ; G 3502\nU 9082 ; WX 659 ; N uni237A ; G 3503\nU 9085 ; WX 757 ; N uni237D ; G 3504\nU 9095 ; WX 1152 ; N uni2387 ; G 3505\nU 9108 ; WX 873 ; N uni2394 ; G 3506\nU 9115 ; WX 500 ; N uni239B ; G 3507\nU 9116 ; WX 500 ; N uni239C ; G 3508\nU 9117 ; WX 500 ; N uni239D ; G 3509\nU 9118 ; WX 500 ; N uni239E ; G 3510\nU 9119 ; WX 500 ; N uni239F ; G 3511\nU 9120 ; WX 500 ; N uni23A0 ; G 3512\nU 9121 ; WX 500 ; N uni23A1 ; G 3513\nU 9122 ; WX 500 ; N uni23A2 ; G 3514\nU 9123 ; WX 500 ; N uni23A3 ; G 3515\nU 9124 ; WX 500 ; N uni23A4 ; G 3516\nU 9125 ; WX 500 ; N uni23A5 ; G 3517\nU 9126 ; WX 500 ; N uni23A6 ; G 3518\nU 9127 ; WX 750 ; N uni23A7 ; G 3519\nU 9128 ; WX 750 ; N uni23A8 ; G 3520\nU 9129 ; WX 750 ; N uni23A9 ; G 3521\nU 9130 ; WX 750 ; N uni23AA ; G 3522\nU 9131 ; WX 750 ; N uni23AB ; G 3523\nU 9132 ; WX 750 ; N uni23AC ; G 3524\nU 9133 ; WX 750 ; N uni23AD ; G 3525\nU 9134 ; WX 521 ; N uni23AE ; G 3526\nU 9166 ; WX 838 ; N uni23CE ; G 3527\nU 9167 ; WX 945 ; N uni23CF ; G 3528\nU 9187 ; WX 873 ; N uni23E3 ; G 3529\nU 9189 ; WX 769 ; N uni23E5 ; G 3530\nU 9192 ; WX 636 ; N uni23E8 ; G 3531\nU 9250 ; WX 635 ; N uni2422 ; G 3532\nU 9251 ; WX 635 ; N uni2423 ; G 3533\nU 9312 ; WX 896 ; N uni2460 ; G 3534\nU 9313 ; WX 896 ; N uni2461 ; G 3535\nU 9314 ; WX 896 ; N uni2462 ; G 3536\nU 9315 ; WX 896 ; N uni2463 ; G 3537\nU 9316 ; WX 896 ; N uni2464 ; G 3538\nU 9317 ; WX 896 ; N uni2465 ; G 3539\nU 9318 ; WX 896 ; N uni2466 ; G 3540\nU 9319 ; WX 896 ; N uni2467 ; G 3541\nU 9320 ; WX 896 ; N uni2468 ; G 3542\nU 9321 ; WX 896 ; N uni2469 ; G 3543\nU 9472 ; WX 602 ; N SF100000 ; G 3544\nU 9473 ; WX 602 ; N uni2501 ; G 3545\nU 9474 ; WX 602 ; N SF110000 ; G 3546\nU 9475 ; WX 602 ; N uni2503 ; G 3547\nU 9476 ; WX 602 ; N uni2504 ; G 3548\nU 9477 ; WX 602 ; N uni2505 ; G 3549\nU 9478 ; WX 602 ; N uni2506 ; G 3550\nU 9479 ; WX 602 ; N uni2507 ; G 3551\nU 9480 ; WX 602 ; N uni2508 ; G 3552\nU 9481 ; WX 602 ; N uni2509 ; G 3553\nU 9482 ; WX 602 ; N uni250A ; G 3554\nU 9483 ; WX 602 ; N uni250B ; G 3555\nU 9484 ; WX 602 ; N SF010000 ; G 3556\nU 9485 ; WX 602 ; N uni250D ; G 3557\nU 9486 ; WX 602 ; N uni250E ; G 3558\nU 9487 ; WX 602 ; N uni250F ; G 3559\nU 9488 ; WX 602 ; N SF030000 ; G 3560\nU 9489 ; WX 602 ; N uni2511 ; G 3561\nU 9490 ; WX 602 ; N uni2512 ; G 3562\nU 9491 ; WX 602 ; N uni2513 ; G 3563\nU 9492 ; WX 602 ; N SF020000 ; G 3564\nU 9493 ; WX 602 ; N uni2515 ; G 3565\nU 9494 ; WX 602 ; N uni2516 ; G 3566\nU 9495 ; WX 602 ; N uni2517 ; G 3567\nU 9496 ; WX 602 ; N SF040000 ; G 3568\nU 9497 ; WX 602 ; N uni2519 ; G 3569\nU 9498 ; WX 602 ; N uni251A ; G 3570\nU 9499 ; WX 602 ; N uni251B ; G 3571\nU 9500 ; WX 602 ; N SF080000 ; G 3572\nU 9501 ; WX 602 ; N uni251D ; G 3573\nU 9502 ; WX 602 ; N uni251E ; G 3574\nU 9503 ; WX 602 ; N uni251F ; G 3575\nU 9504 ; WX 602 ; N uni2520 ; G 3576\nU 9505 ; WX 602 ; N uni2521 ; G 3577\nU 9506 ; WX 602 ; N uni2522 ; G 3578\nU 9507 ; WX 602 ; N uni2523 ; G 3579\nU 9508 ; WX 602 ; N SF090000 ; G 3580\nU 9509 ; WX 602 ; N uni2525 ; G 3581\nU 9510 ; WX 602 ; N uni2526 ; G 3582\nU 9511 ; WX 602 ; N uni2527 ; G 3583\nU 9512 ; WX 602 ; N uni2528 ; G 3584\nU 9513 ; WX 602 ; N uni2529 ; G 3585\nU 9514 ; WX 602 ; N uni252A ; G 3586\nU 9515 ; WX 602 ; N uni252B ; G 3587\nU 9516 ; WX 602 ; N SF060000 ; G 3588\nU 9517 ; WX 602 ; N uni252D ; G 3589\nU 9518 ; WX 602 ; N uni252E ; G 3590\nU 9519 ; WX 602 ; N uni252F ; G 3591\nU 9520 ; WX 602 ; N uni2530 ; G 3592\nU 9521 ; WX 602 ; N uni2531 ; G 3593\nU 9522 ; WX 602 ; N uni2532 ; G 3594\nU 9523 ; WX 602 ; N uni2533 ; G 3595\nU 9524 ; WX 602 ; N SF070000 ; G 3596\nU 9525 ; WX 602 ; N uni2535 ; G 3597\nU 9526 ; WX 602 ; N uni2536 ; G 3598\nU 9527 ; WX 602 ; N uni2537 ; G 3599\nU 9528 ; WX 602 ; N uni2538 ; G 3600\nU 9529 ; WX 602 ; N uni2539 ; G 3601\nU 9530 ; WX 602 ; N uni253A ; G 3602\nU 9531 ; WX 602 ; N uni253B ; G 3603\nU 9532 ; WX 602 ; N SF050000 ; G 3604\nU 9533 ; WX 602 ; N uni253D ; G 3605\nU 9534 ; WX 602 ; N uni253E ; G 3606\nU 9535 ; WX 602 ; N uni253F ; G 3607\nU 9536 ; WX 602 ; N uni2540 ; G 3608\nU 9537 ; WX 602 ; N uni2541 ; G 3609\nU 9538 ; WX 602 ; N uni2542 ; G 3610\nU 9539 ; WX 602 ; N uni2543 ; G 3611\nU 9540 ; WX 602 ; N uni2544 ; G 3612\nU 9541 ; WX 602 ; N uni2545 ; G 3613\nU 9542 ; WX 602 ; N uni2546 ; G 3614\nU 9543 ; WX 602 ; N uni2547 ; G 3615\nU 9544 ; WX 602 ; N uni2548 ; G 3616\nU 9545 ; WX 602 ; N uni2549 ; G 3617\nU 9546 ; WX 602 ; N uni254A ; G 3618\nU 9547 ; WX 602 ; N uni254B ; G 3619\nU 9548 ; WX 602 ; N uni254C ; G 3620\nU 9549 ; WX 602 ; N uni254D ; G 3621\nU 9550 ; WX 602 ; N uni254E ; G 3622\nU 9551 ; WX 602 ; N uni254F ; G 3623\nU 9552 ; WX 602 ; N SF430000 ; G 3624\nU 9553 ; WX 602 ; N SF240000 ; G 3625\nU 9554 ; WX 602 ; N SF510000 ; G 3626\nU 9555 ; WX 602 ; N SF520000 ; G 3627\nU 9556 ; WX 602 ; N SF390000 ; G 3628\nU 9557 ; WX 602 ; N SF220000 ; G 3629\nU 9558 ; WX 602 ; N SF210000 ; G 3630\nU 9559 ; WX 602 ; N SF250000 ; G 3631\nU 9560 ; WX 602 ; N SF500000 ; G 3632\nU 9561 ; WX 602 ; N SF490000 ; G 3633\nU 9562 ; WX 602 ; N SF380000 ; G 3634\nU 9563 ; WX 602 ; N SF280000 ; G 3635\nU 9564 ; WX 602 ; N SF270000 ; G 3636\nU 9565 ; WX 602 ; N SF260000 ; G 3637\nU 9566 ; WX 602 ; N SF360000 ; G 3638\nU 9567 ; WX 602 ; N SF370000 ; G 3639\nU 9568 ; WX 602 ; N SF420000 ; G 3640\nU 9569 ; WX 602 ; N SF190000 ; G 3641\nU 9570 ; WX 602 ; N SF200000 ; G 3642\nU 9571 ; WX 602 ; N SF230000 ; G 3643\nU 9572 ; WX 602 ; N SF470000 ; G 3644\nU 9573 ; WX 602 ; N SF480000 ; G 3645\nU 9574 ; WX 602 ; N SF410000 ; G 3646\nU 9575 ; WX 602 ; N SF450000 ; G 3647\nU 9576 ; WX 602 ; N SF460000 ; G 3648\nU 9577 ; WX 602 ; N SF400000 ; G 3649\nU 9578 ; WX 602 ; N SF540000 ; G 3650\nU 9579 ; WX 602 ; N SF530000 ; G 3651\nU 9580 ; WX 602 ; N SF440000 ; G 3652\nU 9581 ; WX 602 ; N uni256D ; G 3653\nU 9582 ; WX 602 ; N uni256E ; G 3654\nU 9583 ; WX 602 ; N uni256F ; G 3655\nU 9584 ; WX 602 ; N uni2570 ; G 3656\nU 9585 ; WX 602 ; N uni2571 ; G 3657\nU 9586 ; WX 602 ; N uni2572 ; G 3658\nU 9587 ; WX 602 ; N uni2573 ; G 3659\nU 9588 ; WX 602 ; N uni2574 ; G 3660\nU 9589 ; WX 602 ; N uni2575 ; G 3661\nU 9590 ; WX 602 ; N uni2576 ; G 3662\nU 9591 ; WX 602 ; N uni2577 ; G 3663\nU 9592 ; WX 602 ; N uni2578 ; G 3664\nU 9593 ; WX 602 ; N uni2579 ; G 3665\nU 9594 ; WX 602 ; N uni257A ; G 3666\nU 9595 ; WX 602 ; N uni257B ; G 3667\nU 9596 ; WX 602 ; N uni257C ; G 3668\nU 9597 ; WX 602 ; N uni257D ; G 3669\nU 9598 ; WX 602 ; N uni257E ; G 3670\nU 9599 ; WX 602 ; N uni257F ; G 3671\nU 9600 ; WX 769 ; N upblock ; G 3672\nU 9601 ; WX 769 ; N uni2581 ; G 3673\nU 9602 ; WX 769 ; N uni2582 ; G 3674\nU 9603 ; WX 769 ; N uni2583 ; G 3675\nU 9604 ; WX 769 ; N dnblock ; G 3676\nU 9605 ; WX 769 ; N uni2585 ; G 3677\nU 9606 ; WX 769 ; N uni2586 ; G 3678\nU 9607 ; WX 769 ; N uni2587 ; G 3679\nU 9608 ; WX 769 ; N block ; G 3680\nU 9609 ; WX 769 ; N uni2589 ; G 3681\nU 9610 ; WX 769 ; N uni258A ; G 3682\nU 9611 ; WX 769 ; N uni258B ; G 3683\nU 9612 ; WX 769 ; N lfblock ; G 3684\nU 9613 ; WX 769 ; N uni258D ; G 3685\nU 9614 ; WX 769 ; N uni258E ; G 3686\nU 9615 ; WX 769 ; N uni258F ; G 3687\nU 9616 ; WX 769 ; N rtblock ; G 3688\nU 9617 ; WX 769 ; N ltshade ; G 3689\nU 9618 ; WX 769 ; N shade ; G 3690\nU 9619 ; WX 769 ; N dkshade ; G 3691\nU 9620 ; WX 769 ; N uni2594 ; G 3692\nU 9621 ; WX 769 ; N uni2595 ; G 3693\nU 9622 ; WX 769 ; N uni2596 ; G 3694\nU 9623 ; WX 769 ; N uni2597 ; G 3695\nU 9624 ; WX 769 ; N uni2598 ; G 3696\nU 9625 ; WX 769 ; N uni2599 ; G 3697\nU 9626 ; WX 769 ; N uni259A ; G 3698\nU 9627 ; WX 769 ; N uni259B ; G 3699\nU 9628 ; WX 769 ; N uni259C ; G 3700\nU 9629 ; WX 769 ; N uni259D ; G 3701\nU 9630 ; WX 769 ; N uni259E ; G 3702\nU 9631 ; WX 769 ; N uni259F ; G 3703\nU 9632 ; WX 945 ; N filledbox ; G 3704\nU 9633 ; WX 945 ; N H22073 ; G 3705\nU 9634 ; WX 945 ; N uni25A2 ; G 3706\nU 9635 ; WX 945 ; N uni25A3 ; G 3707\nU 9636 ; WX 945 ; N uni25A4 ; G 3708\nU 9637 ; WX 945 ; N uni25A5 ; G 3709\nU 9638 ; WX 945 ; N uni25A6 ; G 3710\nU 9639 ; WX 945 ; N uni25A7 ; G 3711\nU 9640 ; WX 945 ; N uni25A8 ; G 3712\nU 9641 ; WX 945 ; N uni25A9 ; G 3713\nU 9642 ; WX 678 ; N H18543 ; G 3714\nU 9643 ; WX 678 ; N H18551 ; G 3715\nU 9644 ; WX 945 ; N filledrect ; G 3716\nU 9645 ; WX 945 ; N uni25AD ; G 3717\nU 9646 ; WX 550 ; N uni25AE ; G 3718\nU 9647 ; WX 550 ; N uni25AF ; G 3719\nU 9648 ; WX 769 ; N uni25B0 ; G 3720\nU 9649 ; WX 769 ; N uni25B1 ; G 3721\nU 9650 ; WX 769 ; N triagup ; G 3722\nU 9651 ; WX 769 ; N uni25B3 ; G 3723\nU 9652 ; WX 502 ; N uni25B4 ; G 3724\nU 9653 ; WX 502 ; N uni25B5 ; G 3725\nU 9654 ; WX 769 ; N uni25B6 ; G 3726\nU 9655 ; WX 769 ; N uni25B7 ; G 3727\nU 9656 ; WX 502 ; N uni25B8 ; G 3728\nU 9657 ; WX 502 ; N uni25B9 ; G 3729\nU 9658 ; WX 769 ; N triagrt ; G 3730\nU 9659 ; WX 769 ; N uni25BB ; G 3731\nU 9660 ; WX 769 ; N triagdn ; G 3732\nU 9661 ; WX 769 ; N uni25BD ; G 3733\nU 9662 ; WX 502 ; N uni25BE ; G 3734\nU 9663 ; WX 502 ; N uni25BF ; G 3735\nU 9664 ; WX 769 ; N uni25C0 ; G 3736\nU 9665 ; WX 769 ; N uni25C1 ; G 3737\nU 9666 ; WX 502 ; N uni25C2 ; G 3738\nU 9667 ; WX 502 ; N uni25C3 ; G 3739\nU 9668 ; WX 769 ; N triaglf ; G 3740\nU 9669 ; WX 769 ; N uni25C5 ; G 3741\nU 9670 ; WX 769 ; N uni25C6 ; G 3742\nU 9671 ; WX 769 ; N uni25C7 ; G 3743\nU 9672 ; WX 769 ; N uni25C8 ; G 3744\nU 9673 ; WX 873 ; N uni25C9 ; G 3745\nU 9674 ; WX 494 ; N lozenge ; G 3746\nU 9675 ; WX 873 ; N circle ; G 3747\nU 9676 ; WX 873 ; N uni25CC ; G 3748\nU 9677 ; WX 873 ; N uni25CD ; G 3749\nU 9678 ; WX 873 ; N uni25CE ; G 3750\nU 9679 ; WX 873 ; N H18533 ; G 3751\nU 9680 ; WX 873 ; N uni25D0 ; G 3752\nU 9681 ; WX 873 ; N uni25D1 ; G 3753\nU 9682 ; WX 873 ; N uni25D2 ; G 3754\nU 9683 ; WX 873 ; N uni25D3 ; G 3755\nU 9684 ; WX 873 ; N uni25D4 ; G 3756\nU 9685 ; WX 873 ; N uni25D5 ; G 3757\nU 9686 ; WX 527 ; N uni25D6 ; G 3758\nU 9687 ; WX 527 ; N uni25D7 ; G 3759\nU 9688 ; WX 791 ; N invbullet ; G 3760\nU 9689 ; WX 970 ; N invcircle ; G 3761\nU 9690 ; WX 970 ; N uni25DA ; G 3762\nU 9691 ; WX 970 ; N uni25DB ; G 3763\nU 9692 ; WX 387 ; N uni25DC ; G 3764\nU 9693 ; WX 387 ; N uni25DD ; G 3765\nU 9694 ; WX 387 ; N uni25DE ; G 3766\nU 9695 ; WX 387 ; N uni25DF ; G 3767\nU 9696 ; WX 873 ; N uni25E0 ; G 3768\nU 9697 ; WX 873 ; N uni25E1 ; G 3769\nU 9698 ; WX 769 ; N uni25E2 ; G 3770\nU 9699 ; WX 769 ; N uni25E3 ; G 3771\nU 9700 ; WX 769 ; N uni25E4 ; G 3772\nU 9701 ; WX 769 ; N uni25E5 ; G 3773\nU 9702 ; WX 590 ; N openbullet ; G 3774\nU 9703 ; WX 945 ; N uni25E7 ; G 3775\nU 9704 ; WX 945 ; N uni25E8 ; G 3776\nU 9705 ; WX 945 ; N uni25E9 ; G 3777\nU 9706 ; WX 945 ; N uni25EA ; G 3778\nU 9707 ; WX 945 ; N uni25EB ; G 3779\nU 9708 ; WX 769 ; N uni25EC ; G 3780\nU 9709 ; WX 769 ; N uni25ED ; G 3781\nU 9710 ; WX 769 ; N uni25EE ; G 3782\nU 9711 ; WX 1119 ; N uni25EF ; G 3783\nU 9712 ; WX 945 ; N uni25F0 ; G 3784\nU 9713 ; WX 945 ; N uni25F1 ; G 3785\nU 9714 ; WX 945 ; N uni25F2 ; G 3786\nU 9715 ; WX 945 ; N uni25F3 ; G 3787\nU 9716 ; WX 873 ; N uni25F4 ; G 3788\nU 9717 ; WX 873 ; N uni25F5 ; G 3789\nU 9718 ; WX 873 ; N uni25F6 ; G 3790\nU 9719 ; WX 873 ; N uni25F7 ; G 3791\nU 9720 ; WX 769 ; N uni25F8 ; G 3792\nU 9721 ; WX 769 ; N uni25F9 ; G 3793\nU 9722 ; WX 769 ; N uni25FA ; G 3794\nU 9723 ; WX 830 ; N uni25FB ; G 3795\nU 9724 ; WX 830 ; N uni25FC ; G 3796\nU 9725 ; WX 732 ; N uni25FD ; G 3797\nU 9726 ; WX 732 ; N uni25FE ; G 3798\nU 9727 ; WX 769 ; N uni25FF ; G 3799\nU 9728 ; WX 896 ; N uni2600 ; G 3800\nU 9729 ; WX 1000 ; N uni2601 ; G 3801\nU 9730 ; WX 896 ; N uni2602 ; G 3802\nU 9731 ; WX 896 ; N uni2603 ; G 3803\nU 9732 ; WX 896 ; N uni2604 ; G 3804\nU 9733 ; WX 896 ; N uni2605 ; G 3805\nU 9734 ; WX 896 ; N uni2606 ; G 3806\nU 9735 ; WX 573 ; N uni2607 ; G 3807\nU 9736 ; WX 896 ; N uni2608 ; G 3808\nU 9737 ; WX 896 ; N uni2609 ; G 3809\nU 9738 ; WX 888 ; N uni260A ; G 3810\nU 9739 ; WX 888 ; N uni260B ; G 3811\nU 9740 ; WX 671 ; N uni260C ; G 3812\nU 9741 ; WX 1013 ; N uni260D ; G 3813\nU 9742 ; WX 1246 ; N uni260E ; G 3814\nU 9743 ; WX 1250 ; N uni260F ; G 3815\nU 9744 ; WX 896 ; N uni2610 ; G 3816\nU 9745 ; WX 896 ; N uni2611 ; G 3817\nU 9746 ; WX 896 ; N uni2612 ; G 3818\nU 9747 ; WX 532 ; N uni2613 ; G 3819\nU 9748 ; WX 896 ; N uni2614 ; G 3820\nU 9749 ; WX 896 ; N uni2615 ; G 3821\nU 9750 ; WX 896 ; N uni2616 ; G 3822\nU 9751 ; WX 896 ; N uni2617 ; G 3823\nU 9752 ; WX 896 ; N uni2618 ; G 3824\nU 9753 ; WX 896 ; N uni2619 ; G 3825\nU 9754 ; WX 896 ; N uni261A ; G 3826\nU 9755 ; WX 896 ; N uni261B ; G 3827\nU 9756 ; WX 896 ; N uni261C ; G 3828\nU 9757 ; WX 609 ; N uni261D ; G 3829\nU 9758 ; WX 896 ; N uni261E ; G 3830\nU 9759 ; WX 609 ; N uni261F ; G 3831\nU 9760 ; WX 896 ; N uni2620 ; G 3832\nU 9761 ; WX 896 ; N uni2621 ; G 3833\nU 9762 ; WX 896 ; N uni2622 ; G 3834\nU 9763 ; WX 896 ; N uni2623 ; G 3835\nU 9764 ; WX 669 ; N uni2624 ; G 3836\nU 9765 ; WX 746 ; N uni2625 ; G 3837\nU 9766 ; WX 649 ; N uni2626 ; G 3838\nU 9767 ; WX 784 ; N uni2627 ; G 3839\nU 9768 ; WX 545 ; N uni2628 ; G 3840\nU 9769 ; WX 896 ; N uni2629 ; G 3841\nU 9770 ; WX 896 ; N uni262A ; G 3842\nU 9771 ; WX 896 ; N uni262B ; G 3843\nU 9772 ; WX 710 ; N uni262C ; G 3844\nU 9773 ; WX 896 ; N uni262D ; G 3845\nU 9774 ; WX 896 ; N uni262E ; G 3846\nU 9775 ; WX 896 ; N uni262F ; G 3847\nU 9776 ; WX 896 ; N uni2630 ; G 3848\nU 9777 ; WX 896 ; N uni2631 ; G 3849\nU 9778 ; WX 896 ; N uni2632 ; G 3850\nU 9779 ; WX 896 ; N uni2633 ; G 3851\nU 9780 ; WX 896 ; N uni2634 ; G 3852\nU 9781 ; WX 896 ; N uni2635 ; G 3853\nU 9782 ; WX 896 ; N uni2636 ; G 3854\nU 9783 ; WX 896 ; N uni2637 ; G 3855\nU 9784 ; WX 896 ; N uni2638 ; G 3856\nU 9785 ; WX 1042 ; N uni2639 ; G 3857\nU 9786 ; WX 1042 ; N smileface ; G 3858\nU 9787 ; WX 1042 ; N invsmileface ; G 3859\nU 9788 ; WX 896 ; N sun ; G 3860\nU 9789 ; WX 896 ; N uni263D ; G 3861\nU 9790 ; WX 896 ; N uni263E ; G 3862\nU 9791 ; WX 614 ; N uni263F ; G 3863\nU 9792 ; WX 732 ; N female ; G 3864\nU 9793 ; WX 732 ; N uni2641 ; G 3865\nU 9794 ; WX 896 ; N male ; G 3866\nU 9795 ; WX 896 ; N uni2643 ; G 3867\nU 9796 ; WX 896 ; N uni2644 ; G 3868\nU 9797 ; WX 896 ; N uni2645 ; G 3869\nU 9798 ; WX 896 ; N uni2646 ; G 3870\nU 9799 ; WX 896 ; N uni2647 ; G 3871\nU 9800 ; WX 896 ; N uni2648 ; G 3872\nU 9801 ; WX 896 ; N uni2649 ; G 3873\nU 9802 ; WX 896 ; N uni264A ; G 3874\nU 9803 ; WX 896 ; N uni264B ; G 3875\nU 9804 ; WX 896 ; N uni264C ; G 3876\nU 9805 ; WX 896 ; N uni264D ; G 3877\nU 9806 ; WX 896 ; N uni264E ; G 3878\nU 9807 ; WX 896 ; N uni264F ; G 3879\nU 9808 ; WX 896 ; N uni2650 ; G 3880\nU 9809 ; WX 896 ; N uni2651 ; G 3881\nU 9810 ; WX 896 ; N uni2652 ; G 3882\nU 9811 ; WX 896 ; N uni2653 ; G 3883\nU 9812 ; WX 896 ; N uni2654 ; G 3884\nU 9813 ; WX 896 ; N uni2655 ; G 3885\nU 9814 ; WX 896 ; N uni2656 ; G 3886\nU 9815 ; WX 896 ; N uni2657 ; G 3887\nU 9816 ; WX 896 ; N uni2658 ; G 3888\nU 9817 ; WX 896 ; N uni2659 ; G 3889\nU 9818 ; WX 896 ; N uni265A ; G 3890\nU 9819 ; WX 896 ; N uni265B ; G 3891\nU 9820 ; WX 896 ; N uni265C ; G 3892\nU 9821 ; WX 896 ; N uni265D ; G 3893\nU 9822 ; WX 896 ; N uni265E ; G 3894\nU 9823 ; WX 896 ; N uni265F ; G 3895\nU 9824 ; WX 896 ; N spade ; G 3896\nU 9825 ; WX 896 ; N uni2661 ; G 3897\nU 9826 ; WX 896 ; N uni2662 ; G 3898\nU 9827 ; WX 896 ; N club ; G 3899\nU 9828 ; WX 896 ; N uni2664 ; G 3900\nU 9829 ; WX 896 ; N heart ; G 3901\nU 9830 ; WX 896 ; N diamond ; G 3902\nU 9831 ; WX 896 ; N uni2667 ; G 3903\nU 9832 ; WX 896 ; N uni2668 ; G 3904\nU 9833 ; WX 472 ; N uni2669 ; G 3905\nU 9834 ; WX 638 ; N musicalnote ; G 3906\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3907\nU 9836 ; WX 896 ; N uni266C ; G 3908\nU 9837 ; WX 472 ; N uni266D ; G 3909\nU 9838 ; WX 357 ; N uni266E ; G 3910\nU 9839 ; WX 484 ; N uni266F ; G 3911\nU 9840 ; WX 748 ; N uni2670 ; G 3912\nU 9841 ; WX 766 ; N uni2671 ; G 3913\nU 9842 ; WX 896 ; N uni2672 ; G 3914\nU 9843 ; WX 896 ; N uni2673 ; G 3915\nU 9844 ; WX 896 ; N uni2674 ; G 3916\nU 9845 ; WX 896 ; N uni2675 ; G 3917\nU 9846 ; WX 896 ; N uni2676 ; G 3918\nU 9847 ; WX 896 ; N uni2677 ; G 3919\nU 9848 ; WX 896 ; N uni2678 ; G 3920\nU 9849 ; WX 896 ; N uni2679 ; G 3921\nU 9850 ; WX 896 ; N uni267A ; G 3922\nU 9851 ; WX 896 ; N uni267B ; G 3923\nU 9852 ; WX 896 ; N uni267C ; G 3924\nU 9853 ; WX 896 ; N uni267D ; G 3925\nU 9854 ; WX 896 ; N uni267E ; G 3926\nU 9855 ; WX 896 ; N uni267F ; G 3927\nU 9856 ; WX 869 ; N uni2680 ; G 3928\nU 9857 ; WX 869 ; N uni2681 ; G 3929\nU 9858 ; WX 869 ; N uni2682 ; G 3930\nU 9859 ; WX 869 ; N uni2683 ; G 3931\nU 9860 ; WX 869 ; N uni2684 ; G 3932\nU 9861 ; WX 869 ; N uni2685 ; G 3933\nU 9862 ; WX 896 ; N uni2686 ; G 3934\nU 9863 ; WX 896 ; N uni2687 ; G 3935\nU 9864 ; WX 896 ; N uni2688 ; G 3936\nU 9865 ; WX 896 ; N uni2689 ; G 3937\nU 9866 ; WX 896 ; N uni268A ; G 3938\nU 9867 ; WX 896 ; N uni268B ; G 3939\nU 9868 ; WX 896 ; N uni268C ; G 3940\nU 9869 ; WX 896 ; N uni268D ; G 3941\nU 9870 ; WX 896 ; N uni268E ; G 3942\nU 9871 ; WX 896 ; N uni268F ; G 3943\nU 9872 ; WX 896 ; N uni2690 ; G 3944\nU 9873 ; WX 896 ; N uni2691 ; G 3945\nU 9874 ; WX 896 ; N uni2692 ; G 3946\nU 9875 ; WX 896 ; N uni2693 ; G 3947\nU 9876 ; WX 896 ; N uni2694 ; G 3948\nU 9877 ; WX 541 ; N uni2695 ; G 3949\nU 9878 ; WX 896 ; N uni2696 ; G 3950\nU 9879 ; WX 896 ; N uni2697 ; G 3951\nU 9880 ; WX 896 ; N uni2698 ; G 3952\nU 9881 ; WX 896 ; N uni2699 ; G 3953\nU 9882 ; WX 896 ; N uni269A ; G 3954\nU 9883 ; WX 896 ; N uni269B ; G 3955\nU 9884 ; WX 896 ; N uni269C ; G 3956\nU 9886 ; WX 896 ; N uni269E ; G 3957\nU 9887 ; WX 896 ; N uni269F ; G 3958\nU 9888 ; WX 896 ; N uni26A0 ; G 3959\nU 9889 ; WX 702 ; N uni26A1 ; G 3960\nU 9890 ; WX 1004 ; N uni26A2 ; G 3961\nU 9891 ; WX 1089 ; N uni26A3 ; G 3962\nU 9892 ; WX 1175 ; N uni26A4 ; G 3963\nU 9893 ; WX 903 ; N uni26A5 ; G 3964\nU 9894 ; WX 838 ; N uni26A6 ; G 3965\nU 9895 ; WX 838 ; N uni26A7 ; G 3966\nU 9896 ; WX 838 ; N uni26A8 ; G 3967\nU 9897 ; WX 838 ; N uni26A9 ; G 3968\nU 9898 ; WX 838 ; N uni26AA ; G 3969\nU 9899 ; WX 838 ; N uni26AB ; G 3970\nU 9900 ; WX 838 ; N uni26AC ; G 3971\nU 9901 ; WX 838 ; N uni26AD ; G 3972\nU 9902 ; WX 838 ; N uni26AE ; G 3973\nU 9903 ; WX 838 ; N uni26AF ; G 3974\nU 9904 ; WX 844 ; N uni26B0 ; G 3975\nU 9905 ; WX 838 ; N uni26B1 ; G 3976\nU 9906 ; WX 732 ; N uni26B2 ; G 3977\nU 9907 ; WX 732 ; N uni26B3 ; G 3978\nU 9908 ; WX 732 ; N uni26B4 ; G 3979\nU 9909 ; WX 732 ; N uni26B5 ; G 3980\nU 9910 ; WX 850 ; N uni26B6 ; G 3981\nU 9911 ; WX 732 ; N uni26B7 ; G 3982\nU 9912 ; WX 732 ; N uni26B8 ; G 3983\nU 9920 ; WX 838 ; N uni26C0 ; G 3984\nU 9921 ; WX 838 ; N uni26C1 ; G 3985\nU 9922 ; WX 838 ; N uni26C2 ; G 3986\nU 9923 ; WX 838 ; N uni26C3 ; G 3987\nU 9954 ; WX 732 ; N uni26E2 ; G 3988\nU 9985 ; WX 838 ; N uni2701 ; G 3989\nU 9986 ; WX 838 ; N uni2702 ; G 3990\nU 9987 ; WX 838 ; N uni2703 ; G 3991\nU 9988 ; WX 838 ; N uni2704 ; G 3992\nU 9990 ; WX 838 ; N uni2706 ; G 3993\nU 9991 ; WX 838 ; N uni2707 ; G 3994\nU 9992 ; WX 838 ; N uni2708 ; G 3995\nU 9993 ; WX 838 ; N uni2709 ; G 3996\nU 9996 ; WX 838 ; N uni270C ; G 3997\nU 9997 ; WX 838 ; N uni270D ; G 3998\nU 9998 ; WX 838 ; N uni270E ; G 3999\nU 9999 ; WX 838 ; N uni270F ; G 4000\nU 10000 ; WX 838 ; N uni2710 ; G 4001\nU 10001 ; WX 838 ; N uni2711 ; G 4002\nU 10002 ; WX 838 ; N uni2712 ; G 4003\nU 10003 ; WX 838 ; N uni2713 ; G 4004\nU 10004 ; WX 838 ; N uni2714 ; G 4005\nU 10005 ; WX 838 ; N uni2715 ; G 4006\nU 10006 ; WX 838 ; N uni2716 ; G 4007\nU 10007 ; WX 838 ; N uni2717 ; G 4008\nU 10008 ; WX 838 ; N uni2718 ; G 4009\nU 10009 ; WX 838 ; N uni2719 ; G 4010\nU 10010 ; WX 838 ; N uni271A ; G 4011\nU 10011 ; WX 838 ; N uni271B ; G 4012\nU 10012 ; WX 838 ; N uni271C ; G 4013\nU 10013 ; WX 838 ; N uni271D ; G 4014\nU 10014 ; WX 838 ; N uni271E ; G 4015\nU 10015 ; WX 838 ; N uni271F ; G 4016\nU 10016 ; WX 838 ; N uni2720 ; G 4017\nU 10017 ; WX 838 ; N uni2721 ; G 4018\nU 10018 ; WX 838 ; N uni2722 ; G 4019\nU 10019 ; WX 838 ; N uni2723 ; G 4020\nU 10020 ; WX 838 ; N uni2724 ; G 4021\nU 10021 ; WX 838 ; N uni2725 ; G 4022\nU 10022 ; WX 838 ; N uni2726 ; G 4023\nU 10023 ; WX 838 ; N uni2727 ; G 4024\nU 10025 ; WX 838 ; N uni2729 ; G 4025\nU 10026 ; WX 838 ; N uni272A ; G 4026\nU 10027 ; WX 838 ; N uni272B ; G 4027\nU 10028 ; WX 838 ; N uni272C ; G 4028\nU 10029 ; WX 838 ; N uni272D ; G 4029\nU 10030 ; WX 838 ; N uni272E ; G 4030\nU 10031 ; WX 838 ; N uni272F ; G 4031\nU 10032 ; WX 838 ; N uni2730 ; G 4032\nU 10033 ; WX 838 ; N uni2731 ; G 4033\nU 10034 ; WX 838 ; N uni2732 ; G 4034\nU 10035 ; WX 838 ; N uni2733 ; G 4035\nU 10036 ; WX 838 ; N uni2734 ; G 4036\nU 10037 ; WX 838 ; N uni2735 ; G 4037\nU 10038 ; WX 838 ; N uni2736 ; G 4038\nU 10039 ; WX 838 ; N uni2737 ; G 4039\nU 10040 ; WX 838 ; N uni2738 ; G 4040\nU 10041 ; WX 838 ; N uni2739 ; G 4041\nU 10042 ; WX 838 ; N uni273A ; G 4042\nU 10043 ; WX 838 ; N uni273B ; G 4043\nU 10044 ; WX 838 ; N uni273C ; G 4044\nU 10045 ; WX 838 ; N uni273D ; G 4045\nU 10046 ; WX 838 ; N uni273E ; G 4046\nU 10047 ; WX 838 ; N uni273F ; G 4047\nU 10048 ; WX 838 ; N uni2740 ; G 4048\nU 10049 ; WX 838 ; N uni2741 ; G 4049\nU 10050 ; WX 838 ; N uni2742 ; G 4050\nU 10051 ; WX 838 ; N uni2743 ; G 4051\nU 10052 ; WX 838 ; N uni2744 ; G 4052\nU 10053 ; WX 838 ; N uni2745 ; G 4053\nU 10054 ; WX 838 ; N uni2746 ; G 4054\nU 10055 ; WX 838 ; N uni2747 ; G 4055\nU 10056 ; WX 838 ; N uni2748 ; G 4056\nU 10057 ; WX 838 ; N uni2749 ; G 4057\nU 10058 ; WX 838 ; N uni274A ; G 4058\nU 10059 ; WX 838 ; N uni274B ; G 4059\nU 10061 ; WX 896 ; N uni274D ; G 4060\nU 10063 ; WX 896 ; N uni274F ; G 4061\nU 10064 ; WX 896 ; N uni2750 ; G 4062\nU 10065 ; WX 896 ; N uni2751 ; G 4063\nU 10066 ; WX 896 ; N uni2752 ; G 4064\nU 10070 ; WX 896 ; N uni2756 ; G 4065\nU 10072 ; WX 838 ; N uni2758 ; G 4066\nU 10073 ; WX 838 ; N uni2759 ; G 4067\nU 10074 ; WX 838 ; N uni275A ; G 4068\nU 10075 ; WX 322 ; N uni275B ; G 4069\nU 10076 ; WX 322 ; N uni275C ; G 4070\nU 10077 ; WX 538 ; N uni275D ; G 4071\nU 10078 ; WX 538 ; N uni275E ; G 4072\nU 10081 ; WX 838 ; N uni2761 ; G 4073\nU 10082 ; WX 838 ; N uni2762 ; G 4074\nU 10083 ; WX 838 ; N uni2763 ; G 4075\nU 10084 ; WX 838 ; N uni2764 ; G 4076\nU 10085 ; WX 838 ; N uni2765 ; G 4077\nU 10086 ; WX 838 ; N uni2766 ; G 4078\nU 10087 ; WX 838 ; N uni2767 ; G 4079\nU 10088 ; WX 838 ; N uni2768 ; G 4080\nU 10089 ; WX 838 ; N uni2769 ; G 4081\nU 10090 ; WX 838 ; N uni276A ; G 4082\nU 10091 ; WX 838 ; N uni276B ; G 4083\nU 10092 ; WX 838 ; N uni276C ; G 4084\nU 10093 ; WX 838 ; N uni276D ; G 4085\nU 10094 ; WX 838 ; N uni276E ; G 4086\nU 10095 ; WX 838 ; N uni276F ; G 4087\nU 10096 ; WX 838 ; N uni2770 ; G 4088\nU 10097 ; WX 838 ; N uni2771 ; G 4089\nU 10098 ; WX 838 ; N uni2772 ; G 4090\nU 10099 ; WX 838 ; N uni2773 ; G 4091\nU 10100 ; WX 838 ; N uni2774 ; G 4092\nU 10101 ; WX 838 ; N uni2775 ; G 4093\nU 10102 ; WX 896 ; N uni2776 ; G 4094\nU 10103 ; WX 896 ; N uni2777 ; G 4095\nU 10104 ; WX 896 ; N uni2778 ; G 4096\nU 10105 ; WX 896 ; N uni2779 ; G 4097\nU 10106 ; WX 896 ; N uni277A ; G 4098\nU 10107 ; WX 896 ; N uni277B ; G 4099\nU 10108 ; WX 896 ; N uni277C ; G 4100\nU 10109 ; WX 896 ; N uni277D ; G 4101\nU 10110 ; WX 896 ; N uni277E ; G 4102\nU 10111 ; WX 896 ; N uni277F ; G 4103\nU 10112 ; WX 838 ; N uni2780 ; G 4104\nU 10113 ; WX 838 ; N uni2781 ; G 4105\nU 10114 ; WX 838 ; N uni2782 ; G 4106\nU 10115 ; WX 838 ; N uni2783 ; G 4107\nU 10116 ; WX 838 ; N uni2784 ; G 4108\nU 10117 ; WX 838 ; N uni2785 ; G 4109\nU 10118 ; WX 838 ; N uni2786 ; G 4110\nU 10119 ; WX 838 ; N uni2787 ; G 4111\nU 10120 ; WX 838 ; N uni2788 ; G 4112\nU 10121 ; WX 838 ; N uni2789 ; G 4113\nU 10122 ; WX 838 ; N uni278A ; G 4114\nU 10123 ; WX 838 ; N uni278B ; G 4115\nU 10124 ; WX 838 ; N uni278C ; G 4116\nU 10125 ; WX 838 ; N uni278D ; G 4117\nU 10126 ; WX 838 ; N uni278E ; G 4118\nU 10127 ; WX 838 ; N uni278F ; G 4119\nU 10128 ; WX 838 ; N uni2790 ; G 4120\nU 10129 ; WX 838 ; N uni2791 ; G 4121\nU 10130 ; WX 838 ; N uni2792 ; G 4122\nU 10131 ; WX 838 ; N uni2793 ; G 4123\nU 10132 ; WX 838 ; N uni2794 ; G 4124\nU 10136 ; WX 838 ; N uni2798 ; G 4125\nU 10137 ; WX 838 ; N uni2799 ; G 4126\nU 10138 ; WX 838 ; N uni279A ; G 4127\nU 10139 ; WX 838 ; N uni279B ; G 4128\nU 10140 ; WX 838 ; N uni279C ; G 4129\nU 10141 ; WX 838 ; N uni279D ; G 4130\nU 10142 ; WX 838 ; N uni279E ; G 4131\nU 10143 ; WX 838 ; N uni279F ; G 4132\nU 10144 ; WX 838 ; N uni27A0 ; G 4133\nU 10145 ; WX 838 ; N uni27A1 ; G 4134\nU 10146 ; WX 838 ; N uni27A2 ; G 4135\nU 10147 ; WX 838 ; N uni27A3 ; G 4136\nU 10148 ; WX 838 ; N uni27A4 ; G 4137\nU 10149 ; WX 838 ; N uni27A5 ; G 4138\nU 10150 ; WX 838 ; N uni27A6 ; G 4139\nU 10151 ; WX 838 ; N uni27A7 ; G 4140\nU 10152 ; WX 838 ; N uni27A8 ; G 4141\nU 10153 ; WX 838 ; N uni27A9 ; G 4142\nU 10154 ; WX 838 ; N uni27AA ; G 4143\nU 10155 ; WX 838 ; N uni27AB ; G 4144\nU 10156 ; WX 838 ; N uni27AC ; G 4145\nU 10157 ; WX 838 ; N uni27AD ; G 4146\nU 10158 ; WX 838 ; N uni27AE ; G 4147\nU 10159 ; WX 838 ; N uni27AF ; G 4148\nU 10161 ; WX 838 ; N uni27B1 ; G 4149\nU 10162 ; WX 838 ; N uni27B2 ; G 4150\nU 10163 ; WX 838 ; N uni27B3 ; G 4151\nU 10164 ; WX 838 ; N uni27B4 ; G 4152\nU 10165 ; WX 838 ; N uni27B5 ; G 4153\nU 10166 ; WX 838 ; N uni27B6 ; G 4154\nU 10167 ; WX 838 ; N uni27B7 ; G 4155\nU 10168 ; WX 838 ; N uni27B8 ; G 4156\nU 10169 ; WX 838 ; N uni27B9 ; G 4157\nU 10170 ; WX 838 ; N uni27BA ; G 4158\nU 10171 ; WX 838 ; N uni27BB ; G 4159\nU 10172 ; WX 838 ; N uni27BC ; G 4160\nU 10173 ; WX 838 ; N uni27BD ; G 4161\nU 10174 ; WX 838 ; N uni27BE ; G 4162\nU 10181 ; WX 390 ; N uni27C5 ; G 4163\nU 10182 ; WX 390 ; N uni27C6 ; G 4164\nU 10208 ; WX 494 ; N uni27E0 ; G 4165\nU 10214 ; WX 495 ; N uni27E6 ; G 4166\nU 10215 ; WX 495 ; N uni27E7 ; G 4167\nU 10216 ; WX 390 ; N uni27E8 ; G 4168\nU 10217 ; WX 390 ; N uni27E9 ; G 4169\nU 10218 ; WX 556 ; N uni27EA ; G 4170\nU 10219 ; WX 556 ; N uni27EB ; G 4171\nU 10224 ; WX 838 ; N uni27F0 ; G 4172\nU 10225 ; WX 838 ; N uni27F1 ; G 4173\nU 10226 ; WX 838 ; N uni27F2 ; G 4174\nU 10227 ; WX 838 ; N uni27F3 ; G 4175\nU 10228 ; WX 1157 ; N uni27F4 ; G 4176\nU 10229 ; WX 1434 ; N uni27F5 ; G 4177\nU 10230 ; WX 1434 ; N uni27F6 ; G 4178\nU 10231 ; WX 1434 ; N uni27F7 ; G 4179\nU 10232 ; WX 1434 ; N uni27F8 ; G 4180\nU 10233 ; WX 1434 ; N uni27F9 ; G 4181\nU 10234 ; WX 1434 ; N uni27FA ; G 4182\nU 10235 ; WX 1434 ; N uni27FB ; G 4183\nU 10236 ; WX 1434 ; N uni27FC ; G 4184\nU 10237 ; WX 1434 ; N uni27FD ; G 4185\nU 10238 ; WX 1434 ; N uni27FE ; G 4186\nU 10239 ; WX 1434 ; N uni27FF ; G 4187\nU 10240 ; WX 732 ; N uni2800 ; G 4188\nU 10241 ; WX 732 ; N uni2801 ; G 4189\nU 10242 ; WX 732 ; N uni2802 ; G 4190\nU 10243 ; WX 732 ; N uni2803 ; G 4191\nU 10244 ; WX 732 ; N uni2804 ; G 4192\nU 10245 ; WX 732 ; N uni2805 ; G 4193\nU 10246 ; WX 732 ; N uni2806 ; G 4194\nU 10247 ; WX 732 ; N uni2807 ; G 4195\nU 10248 ; WX 732 ; N uni2808 ; G 4196\nU 10249 ; WX 732 ; N uni2809 ; G 4197\nU 10250 ; WX 732 ; N uni280A ; G 4198\nU 10251 ; WX 732 ; N uni280B ; G 4199\nU 10252 ; WX 732 ; N uni280C ; G 4200\nU 10253 ; WX 732 ; N uni280D ; G 4201\nU 10254 ; WX 732 ; N uni280E ; G 4202\nU 10255 ; WX 732 ; N uni280F ; G 4203\nU 10256 ; WX 732 ; N uni2810 ; G 4204\nU 10257 ; WX 732 ; N uni2811 ; G 4205\nU 10258 ; WX 732 ; N uni2812 ; G 4206\nU 10259 ; WX 732 ; N uni2813 ; G 4207\nU 10260 ; WX 732 ; N uni2814 ; G 4208\nU 10261 ; WX 732 ; N uni2815 ; G 4209\nU 10262 ; WX 732 ; N uni2816 ; G 4210\nU 10263 ; WX 732 ; N uni2817 ; G 4211\nU 10264 ; WX 732 ; N uni2818 ; G 4212\nU 10265 ; WX 732 ; N uni2819 ; G 4213\nU 10266 ; WX 732 ; N uni281A ; G 4214\nU 10267 ; WX 732 ; N uni281B ; G 4215\nU 10268 ; WX 732 ; N uni281C ; G 4216\nU 10269 ; WX 732 ; N uni281D ; G 4217\nU 10270 ; WX 732 ; N uni281E ; G 4218\nU 10271 ; WX 732 ; N uni281F ; G 4219\nU 10272 ; WX 732 ; N uni2820 ; G 4220\nU 10273 ; WX 732 ; N uni2821 ; G 4221\nU 10274 ; WX 732 ; N uni2822 ; G 4222\nU 10275 ; WX 732 ; N uni2823 ; G 4223\nU 10276 ; WX 732 ; N uni2824 ; G 4224\nU 10277 ; WX 732 ; N uni2825 ; G 4225\nU 10278 ; WX 732 ; N uni2826 ; G 4226\nU 10279 ; WX 732 ; N uni2827 ; G 4227\nU 10280 ; WX 732 ; N uni2828 ; G 4228\nU 10281 ; WX 732 ; N uni2829 ; G 4229\nU 10282 ; WX 732 ; N uni282A ; G 4230\nU 10283 ; WX 732 ; N uni282B ; G 4231\nU 10284 ; WX 732 ; N uni282C ; G 4232\nU 10285 ; WX 732 ; N uni282D ; G 4233\nU 10286 ; WX 732 ; N uni282E ; G 4234\nU 10287 ; WX 732 ; N uni282F ; G 4235\nU 10288 ; WX 732 ; N uni2830 ; G 4236\nU 10289 ; WX 732 ; N uni2831 ; G 4237\nU 10290 ; WX 732 ; N uni2832 ; G 4238\nU 10291 ; WX 732 ; N uni2833 ; G 4239\nU 10292 ; WX 732 ; N uni2834 ; G 4240\nU 10293 ; WX 732 ; N uni2835 ; G 4241\nU 10294 ; WX 732 ; N uni2836 ; G 4242\nU 10295 ; WX 732 ; N uni2837 ; G 4243\nU 10296 ; WX 732 ; N uni2838 ; G 4244\nU 10297 ; WX 732 ; N uni2839 ; G 4245\nU 10298 ; WX 732 ; N uni283A ; G 4246\nU 10299 ; WX 732 ; N uni283B ; G 4247\nU 10300 ; WX 732 ; N uni283C ; G 4248\nU 10301 ; WX 732 ; N uni283D ; G 4249\nU 10302 ; WX 732 ; N uni283E ; G 4250\nU 10303 ; WX 732 ; N uni283F ; G 4251\nU 10304 ; WX 732 ; N uni2840 ; G 4252\nU 10305 ; WX 732 ; N uni2841 ; G 4253\nU 10306 ; WX 732 ; N uni2842 ; G 4254\nU 10307 ; WX 732 ; N uni2843 ; G 4255\nU 10308 ; WX 732 ; N uni2844 ; G 4256\nU 10309 ; WX 732 ; N uni2845 ; G 4257\nU 10310 ; WX 732 ; N uni2846 ; G 4258\nU 10311 ; WX 732 ; N uni2847 ; G 4259\nU 10312 ; WX 732 ; N uni2848 ; G 4260\nU 10313 ; WX 732 ; N uni2849 ; G 4261\nU 10314 ; WX 732 ; N uni284A ; G 4262\nU 10315 ; WX 732 ; N uni284B ; G 4263\nU 10316 ; WX 732 ; N uni284C ; G 4264\nU 10317 ; WX 732 ; N uni284D ; G 4265\nU 10318 ; WX 732 ; N uni284E ; G 4266\nU 10319 ; WX 732 ; N uni284F ; G 4267\nU 10320 ; WX 732 ; N uni2850 ; G 4268\nU 10321 ; WX 732 ; N uni2851 ; G 4269\nU 10322 ; WX 732 ; N uni2852 ; G 4270\nU 10323 ; WX 732 ; N uni2853 ; G 4271\nU 10324 ; WX 732 ; N uni2854 ; G 4272\nU 10325 ; WX 732 ; N uni2855 ; G 4273\nU 10326 ; WX 732 ; N uni2856 ; G 4274\nU 10327 ; WX 732 ; N uni2857 ; G 4275\nU 10328 ; WX 732 ; N uni2858 ; G 4276\nU 10329 ; WX 732 ; N uni2859 ; G 4277\nU 10330 ; WX 732 ; N uni285A ; G 4278\nU 10331 ; WX 732 ; N uni285B ; G 4279\nU 10332 ; WX 732 ; N uni285C ; G 4280\nU 10333 ; WX 732 ; N uni285D ; G 4281\nU 10334 ; WX 732 ; N uni285E ; G 4282\nU 10335 ; WX 732 ; N uni285F ; G 4283\nU 10336 ; WX 732 ; N uni2860 ; G 4284\nU 10337 ; WX 732 ; N uni2861 ; G 4285\nU 10338 ; WX 732 ; N uni2862 ; G 4286\nU 10339 ; WX 732 ; N uni2863 ; G 4287\nU 10340 ; WX 732 ; N uni2864 ; G 4288\nU 10341 ; WX 732 ; N uni2865 ; G 4289\nU 10342 ; WX 732 ; N uni2866 ; G 4290\nU 10343 ; WX 732 ; N uni2867 ; G 4291\nU 10344 ; WX 732 ; N uni2868 ; G 4292\nU 10345 ; WX 732 ; N uni2869 ; G 4293\nU 10346 ; WX 732 ; N uni286A ; G 4294\nU 10347 ; WX 732 ; N uni286B ; G 4295\nU 10348 ; WX 732 ; N uni286C ; G 4296\nU 10349 ; WX 732 ; N uni286D ; G 4297\nU 10350 ; WX 732 ; N uni286E ; G 4298\nU 10351 ; WX 732 ; N uni286F ; G 4299\nU 10352 ; WX 732 ; N uni2870 ; G 4300\nU 10353 ; WX 732 ; N uni2871 ; G 4301\nU 10354 ; WX 732 ; N uni2872 ; G 4302\nU 10355 ; WX 732 ; N uni2873 ; G 4303\nU 10356 ; WX 732 ; N uni2874 ; G 4304\nU 10357 ; WX 732 ; N uni2875 ; G 4305\nU 10358 ; WX 732 ; N uni2876 ; G 4306\nU 10359 ; WX 732 ; N uni2877 ; G 4307\nU 10360 ; WX 732 ; N uni2878 ; G 4308\nU 10361 ; WX 732 ; N uni2879 ; G 4309\nU 10362 ; WX 732 ; N uni287A ; G 4310\nU 10363 ; WX 732 ; N uni287B ; G 4311\nU 10364 ; WX 732 ; N uni287C ; G 4312\nU 10365 ; WX 732 ; N uni287D ; G 4313\nU 10366 ; WX 732 ; N uni287E ; G 4314\nU 10367 ; WX 732 ; N uni287F ; G 4315\nU 10368 ; WX 732 ; N uni2880 ; G 4316\nU 10369 ; WX 732 ; N uni2881 ; G 4317\nU 10370 ; WX 732 ; N uni2882 ; G 4318\nU 10371 ; WX 732 ; N uni2883 ; G 4319\nU 10372 ; WX 732 ; N uni2884 ; G 4320\nU 10373 ; WX 732 ; N uni2885 ; G 4321\nU 10374 ; WX 732 ; N uni2886 ; G 4322\nU 10375 ; WX 732 ; N uni2887 ; G 4323\nU 10376 ; WX 732 ; N uni2888 ; G 4324\nU 10377 ; WX 732 ; N uni2889 ; G 4325\nU 10378 ; WX 732 ; N uni288A ; G 4326\nU 10379 ; WX 732 ; N uni288B ; G 4327\nU 10380 ; WX 732 ; N uni288C ; G 4328\nU 10381 ; WX 732 ; N uni288D ; G 4329\nU 10382 ; WX 732 ; N uni288E ; G 4330\nU 10383 ; WX 732 ; N uni288F ; G 4331\nU 10384 ; WX 732 ; N uni2890 ; G 4332\nU 10385 ; WX 732 ; N uni2891 ; G 4333\nU 10386 ; WX 732 ; N uni2892 ; G 4334\nU 10387 ; WX 732 ; N uni2893 ; G 4335\nU 10388 ; WX 732 ; N uni2894 ; G 4336\nU 10389 ; WX 732 ; N uni2895 ; G 4337\nU 10390 ; WX 732 ; N uni2896 ; G 4338\nU 10391 ; WX 732 ; N uni2897 ; G 4339\nU 10392 ; WX 732 ; N uni2898 ; G 4340\nU 10393 ; WX 732 ; N uni2899 ; G 4341\nU 10394 ; WX 732 ; N uni289A ; G 4342\nU 10395 ; WX 732 ; N uni289B ; G 4343\nU 10396 ; WX 732 ; N uni289C ; G 4344\nU 10397 ; WX 732 ; N uni289D ; G 4345\nU 10398 ; WX 732 ; N uni289E ; G 4346\nU 10399 ; WX 732 ; N uni289F ; G 4347\nU 10400 ; WX 732 ; N uni28A0 ; G 4348\nU 10401 ; WX 732 ; N uni28A1 ; G 4349\nU 10402 ; WX 732 ; N uni28A2 ; G 4350\nU 10403 ; WX 732 ; N uni28A3 ; G 4351\nU 10404 ; WX 732 ; N uni28A4 ; G 4352\nU 10405 ; WX 732 ; N uni28A5 ; G 4353\nU 10406 ; WX 732 ; N uni28A6 ; G 4354\nU 10407 ; WX 732 ; N uni28A7 ; G 4355\nU 10408 ; WX 732 ; N uni28A8 ; G 4356\nU 10409 ; WX 732 ; N uni28A9 ; G 4357\nU 10410 ; WX 732 ; N uni28AA ; G 4358\nU 10411 ; WX 732 ; N uni28AB ; G 4359\nU 10412 ; WX 732 ; N uni28AC ; G 4360\nU 10413 ; WX 732 ; N uni28AD ; G 4361\nU 10414 ; WX 732 ; N uni28AE ; G 4362\nU 10415 ; WX 732 ; N uni28AF ; G 4363\nU 10416 ; WX 732 ; N uni28B0 ; G 4364\nU 10417 ; WX 732 ; N uni28B1 ; G 4365\nU 10418 ; WX 732 ; N uni28B2 ; G 4366\nU 10419 ; WX 732 ; N uni28B3 ; G 4367\nU 10420 ; WX 732 ; N uni28B4 ; G 4368\nU 10421 ; WX 732 ; N uni28B5 ; G 4369\nU 10422 ; WX 732 ; N uni28B6 ; G 4370\nU 10423 ; WX 732 ; N uni28B7 ; G 4371\nU 10424 ; WX 732 ; N uni28B8 ; G 4372\nU 10425 ; WX 732 ; N uni28B9 ; G 4373\nU 10426 ; WX 732 ; N uni28BA ; G 4374\nU 10427 ; WX 732 ; N uni28BB ; G 4375\nU 10428 ; WX 732 ; N uni28BC ; G 4376\nU 10429 ; WX 732 ; N uni28BD ; G 4377\nU 10430 ; WX 732 ; N uni28BE ; G 4378\nU 10431 ; WX 732 ; N uni28BF ; G 4379\nU 10432 ; WX 732 ; N uni28C0 ; G 4380\nU 10433 ; WX 732 ; N uni28C1 ; G 4381\nU 10434 ; WX 732 ; N uni28C2 ; G 4382\nU 10435 ; WX 732 ; N uni28C3 ; G 4383\nU 10436 ; WX 732 ; N uni28C4 ; G 4384\nU 10437 ; WX 732 ; N uni28C5 ; G 4385\nU 10438 ; WX 732 ; N uni28C6 ; G 4386\nU 10439 ; WX 732 ; N uni28C7 ; G 4387\nU 10440 ; WX 732 ; N uni28C8 ; G 4388\nU 10441 ; WX 732 ; N uni28C9 ; G 4389\nU 10442 ; WX 732 ; N uni28CA ; G 4390\nU 10443 ; WX 732 ; N uni28CB ; G 4391\nU 10444 ; WX 732 ; N uni28CC ; G 4392\nU 10445 ; WX 732 ; N uni28CD ; G 4393\nU 10446 ; WX 732 ; N uni28CE ; G 4394\nU 10447 ; WX 732 ; N uni28CF ; G 4395\nU 10448 ; WX 732 ; N uni28D0 ; G 4396\nU 10449 ; WX 732 ; N uni28D1 ; G 4397\nU 10450 ; WX 732 ; N uni28D2 ; G 4398\nU 10451 ; WX 732 ; N uni28D3 ; G 4399\nU 10452 ; WX 732 ; N uni28D4 ; G 4400\nU 10453 ; WX 732 ; N uni28D5 ; G 4401\nU 10454 ; WX 732 ; N uni28D6 ; G 4402\nU 10455 ; WX 732 ; N uni28D7 ; G 4403\nU 10456 ; WX 732 ; N uni28D8 ; G 4404\nU 10457 ; WX 732 ; N uni28D9 ; G 4405\nU 10458 ; WX 732 ; N uni28DA ; G 4406\nU 10459 ; WX 732 ; N uni28DB ; G 4407\nU 10460 ; WX 732 ; N uni28DC ; G 4408\nU 10461 ; WX 732 ; N uni28DD ; G 4409\nU 10462 ; WX 732 ; N uni28DE ; G 4410\nU 10463 ; WX 732 ; N uni28DF ; G 4411\nU 10464 ; WX 732 ; N uni28E0 ; G 4412\nU 10465 ; WX 732 ; N uni28E1 ; G 4413\nU 10466 ; WX 732 ; N uni28E2 ; G 4414\nU 10467 ; WX 732 ; N uni28E3 ; G 4415\nU 10468 ; WX 732 ; N uni28E4 ; G 4416\nU 10469 ; WX 732 ; N uni28E5 ; G 4417\nU 10470 ; WX 732 ; N uni28E6 ; G 4418\nU 10471 ; WX 732 ; N uni28E7 ; G 4419\nU 10472 ; WX 732 ; N uni28E8 ; G 4420\nU 10473 ; WX 732 ; N uni28E9 ; G 4421\nU 10474 ; WX 732 ; N uni28EA ; G 4422\nU 10475 ; WX 732 ; N uni28EB ; G 4423\nU 10476 ; WX 732 ; N uni28EC ; G 4424\nU 10477 ; WX 732 ; N uni28ED ; G 4425\nU 10478 ; WX 732 ; N uni28EE ; G 4426\nU 10479 ; WX 732 ; N uni28EF ; G 4427\nU 10480 ; WX 732 ; N uni28F0 ; G 4428\nU 10481 ; WX 732 ; N uni28F1 ; G 4429\nU 10482 ; WX 732 ; N uni28F2 ; G 4430\nU 10483 ; WX 732 ; N uni28F3 ; G 4431\nU 10484 ; WX 732 ; N uni28F4 ; G 4432\nU 10485 ; WX 732 ; N uni28F5 ; G 4433\nU 10486 ; WX 732 ; N uni28F6 ; G 4434\nU 10487 ; WX 732 ; N uni28F7 ; G 4435\nU 10488 ; WX 732 ; N uni28F8 ; G 4436\nU 10489 ; WX 732 ; N uni28F9 ; G 4437\nU 10490 ; WX 732 ; N uni28FA ; G 4438\nU 10491 ; WX 732 ; N uni28FB ; G 4439\nU 10492 ; WX 732 ; N uni28FC ; G 4440\nU 10493 ; WX 732 ; N uni28FD ; G 4441\nU 10494 ; WX 732 ; N uni28FE ; G 4442\nU 10495 ; WX 732 ; N uni28FF ; G 4443\nU 10502 ; WX 838 ; N uni2906 ; G 4444\nU 10503 ; WX 838 ; N uni2907 ; G 4445\nU 10506 ; WX 838 ; N uni290A ; G 4446\nU 10507 ; WX 838 ; N uni290B ; G 4447\nU 10560 ; WX 683 ; N uni2940 ; G 4448\nU 10561 ; WX 683 ; N uni2941 ; G 4449\nU 10627 ; WX 734 ; N uni2983 ; G 4450\nU 10628 ; WX 734 ; N uni2984 ; G 4451\nU 10702 ; WX 838 ; N uni29CE ; G 4452\nU 10703 ; WX 1000 ; N uni29CF ; G 4453\nU 10704 ; WX 1000 ; N uni29D0 ; G 4454\nU 10705 ; WX 1000 ; N uni29D1 ; G 4455\nU 10706 ; WX 1000 ; N uni29D2 ; G 4456\nU 10707 ; WX 1000 ; N uni29D3 ; G 4457\nU 10708 ; WX 1000 ; N uni29D4 ; G 4458\nU 10709 ; WX 1000 ; N uni29D5 ; G 4459\nU 10731 ; WX 494 ; N uni29EB ; G 4460\nU 10746 ; WX 838 ; N uni29FA ; G 4461\nU 10747 ; WX 838 ; N uni29FB ; G 4462\nU 10752 ; WX 1000 ; N uni2A00 ; G 4463\nU 10753 ; WX 1000 ; N uni2A01 ; G 4464\nU 10754 ; WX 1000 ; N uni2A02 ; G 4465\nU 10764 ; WX 1325 ; N uni2A0C ; G 4466\nU 10765 ; WX 521 ; N uni2A0D ; G 4467\nU 10766 ; WX 521 ; N uni2A0E ; G 4468\nU 10767 ; WX 521 ; N uni2A0F ; G 4469\nU 10768 ; WX 521 ; N uni2A10 ; G 4470\nU 10769 ; WX 521 ; N uni2A11 ; G 4471\nU 10770 ; WX 521 ; N uni2A12 ; G 4472\nU 10771 ; WX 521 ; N uni2A13 ; G 4473\nU 10772 ; WX 521 ; N uni2A14 ; G 4474\nU 10773 ; WX 521 ; N uni2A15 ; G 4475\nU 10774 ; WX 521 ; N uni2A16 ; G 4476\nU 10775 ; WX 521 ; N uni2A17 ; G 4477\nU 10776 ; WX 521 ; N uni2A18 ; G 4478\nU 10777 ; WX 521 ; N uni2A19 ; G 4479\nU 10778 ; WX 521 ; N uni2A1A ; G 4480\nU 10779 ; WX 521 ; N uni2A1B ; G 4481\nU 10780 ; WX 521 ; N uni2A1C ; G 4482\nU 10799 ; WX 838 ; N uni2A2F ; G 4483\nU 10858 ; WX 838 ; N uni2A6A ; G 4484\nU 10859 ; WX 838 ; N uni2A6B ; G 4485\nU 10877 ; WX 838 ; N uni2A7D ; G 4486\nU 10878 ; WX 838 ; N uni2A7E ; G 4487\nU 10879 ; WX 838 ; N uni2A7F ; G 4488\nU 10880 ; WX 838 ; N uni2A80 ; G 4489\nU 10881 ; WX 838 ; N uni2A81 ; G 4490\nU 10882 ; WX 838 ; N uni2A82 ; G 4491\nU 10883 ; WX 838 ; N uni2A83 ; G 4492\nU 10884 ; WX 838 ; N uni2A84 ; G 4493\nU 10885 ; WX 838 ; N uni2A85 ; G 4494\nU 10886 ; WX 838 ; N uni2A86 ; G 4495\nU 10887 ; WX 838 ; N uni2A87 ; G 4496\nU 10888 ; WX 838 ; N uni2A88 ; G 4497\nU 10889 ; WX 838 ; N uni2A89 ; G 4498\nU 10890 ; WX 838 ; N uni2A8A ; G 4499\nU 10891 ; WX 838 ; N uni2A8B ; G 4500\nU 10892 ; WX 838 ; N uni2A8C ; G 4501\nU 10893 ; WX 838 ; N uni2A8D ; G 4502\nU 10894 ; WX 838 ; N uni2A8E ; G 4503\nU 10895 ; WX 838 ; N uni2A8F ; G 4504\nU 10896 ; WX 838 ; N uni2A90 ; G 4505\nU 10897 ; WX 838 ; N uni2A91 ; G 4506\nU 10898 ; WX 838 ; N uni2A92 ; G 4507\nU 10899 ; WX 838 ; N uni2A93 ; G 4508\nU 10900 ; WX 838 ; N uni2A94 ; G 4509\nU 10901 ; WX 838 ; N uni2A95 ; G 4510\nU 10902 ; WX 838 ; N uni2A96 ; G 4511\nU 10903 ; WX 838 ; N uni2A97 ; G 4512\nU 10904 ; WX 838 ; N uni2A98 ; G 4513\nU 10905 ; WX 838 ; N uni2A99 ; G 4514\nU 10906 ; WX 838 ; N uni2A9A ; G 4515\nU 10907 ; WX 838 ; N uni2A9B ; G 4516\nU 10908 ; WX 838 ; N uni2A9C ; G 4517\nU 10909 ; WX 838 ; N uni2A9D ; G 4518\nU 10910 ; WX 838 ; N uni2A9E ; G 4519\nU 10911 ; WX 838 ; N uni2A9F ; G 4520\nU 10912 ; WX 838 ; N uni2AA0 ; G 4521\nU 10926 ; WX 838 ; N uni2AAE ; G 4522\nU 10927 ; WX 838 ; N uni2AAF ; G 4523\nU 10928 ; WX 838 ; N uni2AB0 ; G 4524\nU 10929 ; WX 838 ; N uni2AB1 ; G 4525\nU 10930 ; WX 838 ; N uni2AB2 ; G 4526\nU 10931 ; WX 838 ; N uni2AB3 ; G 4527\nU 10932 ; WX 838 ; N uni2AB4 ; G 4528\nU 10933 ; WX 838 ; N uni2AB5 ; G 4529\nU 10934 ; WX 838 ; N uni2AB6 ; G 4530\nU 10935 ; WX 838 ; N uni2AB7 ; G 4531\nU 10936 ; WX 838 ; N uni2AB8 ; G 4532\nU 10937 ; WX 838 ; N uni2AB9 ; G 4533\nU 10938 ; WX 838 ; N uni2ABA ; G 4534\nU 11001 ; WX 838 ; N uni2AF9 ; G 4535\nU 11002 ; WX 838 ; N uni2AFA ; G 4536\nU 11008 ; WX 838 ; N uni2B00 ; G 4537\nU 11009 ; WX 838 ; N uni2B01 ; G 4538\nU 11010 ; WX 838 ; N uni2B02 ; G 4539\nU 11011 ; WX 838 ; N uni2B03 ; G 4540\nU 11012 ; WX 838 ; N uni2B04 ; G 4541\nU 11013 ; WX 838 ; N uni2B05 ; G 4542\nU 11014 ; WX 838 ; N uni2B06 ; G 4543\nU 11015 ; WX 838 ; N uni2B07 ; G 4544\nU 11016 ; WX 838 ; N uni2B08 ; G 4545\nU 11017 ; WX 838 ; N uni2B09 ; G 4546\nU 11018 ; WX 838 ; N uni2B0A ; G 4547\nU 11019 ; WX 838 ; N uni2B0B ; G 4548\nU 11020 ; WX 838 ; N uni2B0C ; G 4549\nU 11021 ; WX 838 ; N uni2B0D ; G 4550\nU 11022 ; WX 836 ; N uni2B0E ; G 4551\nU 11023 ; WX 836 ; N uni2B0F ; G 4552\nU 11024 ; WX 836 ; N uni2B10 ; G 4553\nU 11025 ; WX 836 ; N uni2B11 ; G 4554\nU 11026 ; WX 945 ; N uni2B12 ; G 4555\nU 11027 ; WX 945 ; N uni2B13 ; G 4556\nU 11028 ; WX 945 ; N uni2B14 ; G 4557\nU 11029 ; WX 945 ; N uni2B15 ; G 4558\nU 11030 ; WX 769 ; N uni2B16 ; G 4559\nU 11031 ; WX 769 ; N uni2B17 ; G 4560\nU 11032 ; WX 769 ; N uni2B18 ; G 4561\nU 11033 ; WX 769 ; N uni2B19 ; G 4562\nU 11034 ; WX 945 ; N uni2B1A ; G 4563\nU 11039 ; WX 869 ; N uni2B1F ; G 4564\nU 11040 ; WX 869 ; N uni2B20 ; G 4565\nU 11041 ; WX 873 ; N uni2B21 ; G 4566\nU 11042 ; WX 873 ; N uni2B22 ; G 4567\nU 11043 ; WX 873 ; N uni2B23 ; G 4568\nU 11044 ; WX 1119 ; N uni2B24 ; G 4569\nU 11091 ; WX 869 ; N uni2B53 ; G 4570\nU 11092 ; WX 869 ; N uni2B54 ; G 4571\nU 11360 ; WX 557 ; N uni2C60 ; G 4572\nU 11361 ; WX 278 ; N uni2C61 ; G 4573\nU 11362 ; WX 557 ; N uni2C62 ; G 4574\nU 11363 ; WX 603 ; N uni2C63 ; G 4575\nU 11364 ; WX 695 ; N uni2C64 ; G 4576\nU 11365 ; WX 613 ; N uni2C65 ; G 4577\nU 11366 ; WX 392 ; N uni2C66 ; G 4578\nU 11367 ; WX 752 ; N uni2C67 ; G 4579\nU 11368 ; WX 634 ; N uni2C68 ; G 4580\nU 11369 ; WX 656 ; N uni2C69 ; G 4581\nU 11370 ; WX 579 ; N uni2C6A ; G 4582\nU 11371 ; WX 685 ; N uni2C6B ; G 4583\nU 11372 ; WX 525 ; N uni2C6C ; G 4584\nU 11373 ; WX 781 ; N uni2C6D ; G 4585\nU 11374 ; WX 863 ; N uni2C6E ; G 4586\nU 11375 ; WX 684 ; N uni2C6F ; G 4587\nU 11376 ; WX 781 ; N uni2C70 ; G 4588\nU 11377 ; WX 734 ; N uni2C71 ; G 4589\nU 11378 ; WX 1128 ; N uni2C72 ; G 4590\nU 11379 ; WX 961 ; N uni2C73 ; G 4591\nU 11380 ; WX 592 ; N uni2C74 ; G 4592\nU 11381 ; WX 654 ; N uni2C75 ; G 4593\nU 11382 ; WX 568 ; N uni2C76 ; G 4594\nU 11383 ; WX 660 ; N uni2C77 ; G 4595\nU 11385 ; WX 414 ; N uni2C79 ; G 4596\nU 11386 ; WX 612 ; N uni2C7A ; G 4597\nU 11387 ; WX 491 ; N uni2C7B ; G 4598\nU 11388 ; WX 175 ; N uni2C7C ; G 4599\nU 11389 ; WX 431 ; N uni2C7D ; G 4600\nU 11390 ; WX 635 ; N uni2C7E ; G 4601\nU 11391 ; WX 685 ; N uni2C7F ; G 4602\nU 11520 ; WX 591 ; N uni2D00 ; G 4603\nU 11521 ; WX 595 ; N uni2D01 ; G 4604\nU 11522 ; WX 564 ; N uni2D02 ; G 4605\nU 11523 ; WX 602 ; N uni2D03 ; G 4606\nU 11524 ; WX 587 ; N uni2D04 ; G 4607\nU 11525 ; WX 911 ; N uni2D05 ; G 4608\nU 11526 ; WX 626 ; N uni2D06 ; G 4609\nU 11527 ; WX 952 ; N uni2D07 ; G 4610\nU 11528 ; WX 595 ; N uni2D08 ; G 4611\nU 11529 ; WX 607 ; N uni2D09 ; G 4612\nU 11530 ; WX 954 ; N uni2D0A ; G 4613\nU 11531 ; WX 620 ; N uni2D0B ; G 4614\nU 11532 ; WX 595 ; N uni2D0C ; G 4615\nU 11533 ; WX 926 ; N uni2D0D ; G 4616\nU 11534 ; WX 595 ; N uni2D0E ; G 4617\nU 11535 ; WX 806 ; N uni2D0F ; G 4618\nU 11536 ; WX 931 ; N uni2D10 ; G 4619\nU 11537 ; WX 584 ; N uni2D11 ; G 4620\nU 11538 ; WX 592 ; N uni2D12 ; G 4621\nU 11539 ; WX 923 ; N uni2D13 ; G 4622\nU 11540 ; WX 953 ; N uni2D14 ; G 4623\nU 11541 ; WX 828 ; N uni2D15 ; G 4624\nU 11542 ; WX 596 ; N uni2D16 ; G 4625\nU 11543 ; WX 595 ; N uni2D17 ; G 4626\nU 11544 ; WX 590 ; N uni2D18 ; G 4627\nU 11545 ; WX 592 ; N uni2D19 ; G 4628\nU 11546 ; WX 592 ; N uni2D1A ; G 4629\nU 11547 ; WX 621 ; N uni2D1B ; G 4630\nU 11548 ; WX 920 ; N uni2D1C ; G 4631\nU 11549 ; WX 589 ; N uni2D1D ; G 4632\nU 11550 ; WX 586 ; N uni2D1E ; G 4633\nU 11551 ; WX 581 ; N uni2D1F ; G 4634\nU 11552 ; WX 914 ; N uni2D20 ; G 4635\nU 11553 ; WX 596 ; N uni2D21 ; G 4636\nU 11554 ; WX 595 ; N uni2D22 ; G 4637\nU 11555 ; WX 592 ; N uni2D23 ; G 4638\nU 11556 ; WX 642 ; N uni2D24 ; G 4639\nU 11557 ; WX 901 ; N uni2D25 ; G 4640\nU 11568 ; WX 646 ; N uni2D30 ; G 4641\nU 11569 ; WX 888 ; N uni2D31 ; G 4642\nU 11570 ; WX 888 ; N uni2D32 ; G 4643\nU 11571 ; WX 682 ; N uni2D33 ; G 4644\nU 11572 ; WX 684 ; N uni2D34 ; G 4645\nU 11573 ; WX 635 ; N uni2D35 ; G 4646\nU 11574 ; WX 562 ; N uni2D36 ; G 4647\nU 11575 ; WX 684 ; N uni2D37 ; G 4648\nU 11576 ; WX 684 ; N uni2D38 ; G 4649\nU 11577 ; WX 632 ; N uni2D39 ; G 4650\nU 11578 ; WX 632 ; N uni2D3A ; G 4651\nU 11579 ; WX 683 ; N uni2D3B ; G 4652\nU 11580 ; WX 875 ; N uni2D3C ; G 4653\nU 11581 ; WX 685 ; N uni2D3D ; G 4654\nU 11582 ; WX 491 ; N uni2D3E ; G 4655\nU 11583 ; WX 685 ; N uni2D3F ; G 4656\nU 11584 ; WX 888 ; N uni2D40 ; G 4657\nU 11585 ; WX 888 ; N uni2D41 ; G 4658\nU 11586 ; WX 300 ; N uni2D42 ; G 4659\nU 11587 ; WX 627 ; N uni2D43 ; G 4660\nU 11588 ; WX 752 ; N uni2D44 ; G 4661\nU 11589 ; WX 656 ; N uni2D45 ; G 4662\nU 11590 ; WX 527 ; N uni2D46 ; G 4663\nU 11591 ; WX 685 ; N uni2D47 ; G 4664\nU 11592 ; WX 645 ; N uni2D48 ; G 4665\nU 11593 ; WX 632 ; N uni2D49 ; G 4666\nU 11594 ; WX 502 ; N uni2D4A ; G 4667\nU 11595 ; WX 953 ; N uni2D4B ; G 4668\nU 11596 ; WX 778 ; N uni2D4C ; G 4669\nU 11597 ; WX 748 ; N uni2D4D ; G 4670\nU 11598 ; WX 621 ; N uni2D4E ; G 4671\nU 11599 ; WX 295 ; N uni2D4F ; G 4672\nU 11600 ; WX 778 ; N uni2D50 ; G 4673\nU 11601 ; WX 295 ; N uni2D51 ; G 4674\nU 11602 ; WX 752 ; N uni2D52 ; G 4675\nU 11603 ; WX 633 ; N uni2D53 ; G 4676\nU 11604 ; WX 888 ; N uni2D54 ; G 4677\nU 11605 ; WX 888 ; N uni2D55 ; G 4678\nU 11606 ; WX 752 ; N uni2D56 ; G 4679\nU 11607 ; WX 320 ; N uni2D57 ; G 4680\nU 11608 ; WX 749 ; N uni2D58 ; G 4681\nU 11609 ; WX 888 ; N uni2D59 ; G 4682\nU 11610 ; WX 888 ; N uni2D5A ; G 4683\nU 11611 ; WX 698 ; N uni2D5B ; G 4684\nU 11612 ; WX 768 ; N uni2D5C ; G 4685\nU 11613 ; WX 685 ; N uni2D5D ; G 4686\nU 11614 ; WX 698 ; N uni2D5E ; G 4687\nU 11615 ; WX 622 ; N uni2D5F ; G 4688\nU 11616 ; WX 684 ; N uni2D60 ; G 4689\nU 11617 ; WX 752 ; N uni2D61 ; G 4690\nU 11618 ; WX 632 ; N uni2D62 ; G 4691\nU 11619 ; WX 788 ; N uni2D63 ; G 4692\nU 11620 ; WX 567 ; N uni2D64 ; G 4693\nU 11621 ; WX 788 ; N uni2D65 ; G 4694\nU 11631 ; WX 515 ; N uni2D6F ; G 4695\nU 11800 ; WX 531 ; N uni2E18 ; G 4696\nU 11807 ; WX 838 ; N uni2E1F ; G 4697\nU 11810 ; WX 390 ; N uni2E22 ; G 4698\nU 11811 ; WX 390 ; N uni2E23 ; G 4699\nU 11812 ; WX 390 ; N uni2E24 ; G 4700\nU 11813 ; WX 390 ; N uni2E25 ; G 4701\nU 11822 ; WX 531 ; N uni2E2E ; G 4702\nU 19904 ; WX 896 ; N uni4DC0 ; G 4703\nU 19905 ; WX 896 ; N uni4DC1 ; G 4704\nU 19906 ; WX 896 ; N uni4DC2 ; G 4705\nU 19907 ; WX 896 ; N uni4DC3 ; G 4706\nU 19908 ; WX 896 ; N uni4DC4 ; G 4707\nU 19909 ; WX 896 ; N uni4DC5 ; G 4708\nU 19910 ; WX 896 ; N uni4DC6 ; G 4709\nU 19911 ; WX 896 ; N uni4DC7 ; G 4710\nU 19912 ; WX 896 ; N uni4DC8 ; G 4711\nU 19913 ; WX 896 ; N uni4DC9 ; G 4712\nU 19914 ; WX 896 ; N uni4DCA ; G 4713\nU 19915 ; WX 896 ; N uni4DCB ; G 4714\nU 19916 ; WX 896 ; N uni4DCC ; G 4715\nU 19917 ; WX 896 ; N uni4DCD ; G 4716\nU 19918 ; WX 896 ; N uni4DCE ; G 4717\nU 19919 ; WX 896 ; N uni4DCF ; G 4718\nU 19920 ; WX 896 ; N uni4DD0 ; G 4719\nU 19921 ; WX 896 ; N uni4DD1 ; G 4720\nU 19922 ; WX 896 ; N uni4DD2 ; G 4721\nU 19923 ; WX 896 ; N uni4DD3 ; G 4722\nU 19924 ; WX 896 ; N uni4DD4 ; G 4723\nU 19925 ; WX 896 ; N uni4DD5 ; G 4724\nU 19926 ; WX 896 ; N uni4DD6 ; G 4725\nU 19927 ; WX 896 ; N uni4DD7 ; G 4726\nU 19928 ; WX 896 ; N uni4DD8 ; G 4727\nU 19929 ; WX 896 ; N uni4DD9 ; G 4728\nU 19930 ; WX 896 ; N uni4DDA ; G 4729\nU 19931 ; WX 896 ; N uni4DDB ; G 4730\nU 19932 ; WX 896 ; N uni4DDC ; G 4731\nU 19933 ; WX 896 ; N uni4DDD ; G 4732\nU 19934 ; WX 896 ; N uni4DDE ; G 4733\nU 19935 ; WX 896 ; N uni4DDF ; G 4734\nU 19936 ; WX 896 ; N uni4DE0 ; G 4735\nU 19937 ; WX 896 ; N uni4DE1 ; G 4736\nU 19938 ; WX 896 ; N uni4DE2 ; G 4737\nU 19939 ; WX 896 ; N uni4DE3 ; G 4738\nU 19940 ; WX 896 ; N uni4DE4 ; G 4739\nU 19941 ; WX 896 ; N uni4DE5 ; G 4740\nU 19942 ; WX 896 ; N uni4DE6 ; G 4741\nU 19943 ; WX 896 ; N uni4DE7 ; G 4742\nU 19944 ; WX 896 ; N uni4DE8 ; G 4743\nU 19945 ; WX 896 ; N uni4DE9 ; G 4744\nU 19946 ; WX 896 ; N uni4DEA ; G 4745\nU 19947 ; WX 896 ; N uni4DEB ; G 4746\nU 19948 ; WX 896 ; N uni4DEC ; G 4747\nU 19949 ; WX 896 ; N uni4DED ; G 4748\nU 19950 ; WX 896 ; N uni4DEE ; G 4749\nU 19951 ; WX 896 ; N uni4DEF ; G 4750\nU 19952 ; WX 896 ; N uni4DF0 ; G 4751\nU 19953 ; WX 896 ; N uni4DF1 ; G 4752\nU 19954 ; WX 896 ; N uni4DF2 ; G 4753\nU 19955 ; WX 896 ; N uni4DF3 ; G 4754\nU 19956 ; WX 896 ; N uni4DF4 ; G 4755\nU 19957 ; WX 896 ; N uni4DF5 ; G 4756\nU 19958 ; WX 896 ; N uni4DF6 ; G 4757\nU 19959 ; WX 896 ; N uni4DF7 ; G 4758\nU 19960 ; WX 896 ; N uni4DF8 ; G 4759\nU 19961 ; WX 896 ; N uni4DF9 ; G 4760\nU 19962 ; WX 896 ; N uni4DFA ; G 4761\nU 19963 ; WX 896 ; N uni4DFB ; G 4762\nU 19964 ; WX 896 ; N uni4DFC ; G 4763\nU 19965 ; WX 896 ; N uni4DFD ; G 4764\nU 19966 ; WX 896 ; N uni4DFE ; G 4765\nU 19967 ; WX 896 ; N uni4DFF ; G 4766\nU 42192 ; WX 686 ; N uniA4D0 ; G 4767\nU 42193 ; WX 603 ; N uniA4D1 ; G 4768\nU 42194 ; WX 603 ; N uniA4D2 ; G 4769\nU 42195 ; WX 770 ; N uniA4D3 ; G 4770\nU 42196 ; WX 611 ; N uniA4D4 ; G 4771\nU 42197 ; WX 611 ; N uniA4D5 ; G 4772\nU 42198 ; WX 775 ; N uniA4D6 ; G 4773\nU 42199 ; WX 656 ; N uniA4D7 ; G 4774\nU 42200 ; WX 656 ; N uniA4D8 ; G 4775\nU 42201 ; WX 512 ; N uniA4D9 ; G 4776\nU 42202 ; WX 698 ; N uniA4DA ; G 4777\nU 42203 ; WX 703 ; N uniA4DB ; G 4778\nU 42204 ; WX 685 ; N uniA4DC ; G 4779\nU 42205 ; WX 575 ; N uniA4DD ; G 4780\nU 42206 ; WX 575 ; N uniA4DE ; G 4781\nU 42207 ; WX 863 ; N uniA4DF ; G 4782\nU 42208 ; WX 748 ; N uniA4E0 ; G 4783\nU 42209 ; WX 557 ; N uniA4E1 ; G 4784\nU 42210 ; WX 635 ; N uniA4E2 ; G 4785\nU 42211 ; WX 695 ; N uniA4E3 ; G 4786\nU 42212 ; WX 695 ; N uniA4E4 ; G 4787\nU 42213 ; WX 684 ; N uniA4E5 ; G 4788\nU 42214 ; WX 684 ; N uniA4E6 ; G 4789\nU 42215 ; WX 752 ; N uniA4E7 ; G 4790\nU 42216 ; WX 775 ; N uniA4E8 ; G 4791\nU 42217 ; WX 512 ; N uniA4E9 ; G 4792\nU 42218 ; WX 989 ; N uniA4EA ; G 4793\nU 42219 ; WX 685 ; N uniA4EB ; G 4794\nU 42220 ; WX 611 ; N uniA4EC ; G 4795\nU 42221 ; WX 686 ; N uniA4ED ; G 4796\nU 42222 ; WX 684 ; N uniA4EE ; G 4797\nU 42223 ; WX 684 ; N uniA4EF ; G 4798\nU 42224 ; WX 632 ; N uniA4F0 ; G 4799\nU 42225 ; WX 632 ; N uniA4F1 ; G 4800\nU 42226 ; WX 295 ; N uniA4F2 ; G 4801\nU 42227 ; WX 787 ; N uniA4F3 ; G 4802\nU 42228 ; WX 732 ; N uniA4F4 ; G 4803\nU 42229 ; WX 732 ; N uniA4F5 ; G 4804\nU 42230 ; WX 557 ; N uniA4F6 ; G 4805\nU 42231 ; WX 767 ; N uniA4F7 ; G 4806\nU 42232 ; WX 300 ; N uniA4F8 ; G 4807\nU 42233 ; WX 300 ; N uniA4F9 ; G 4808\nU 42234 ; WX 596 ; N uniA4FA ; G 4809\nU 42235 ; WX 596 ; N uniA4FB ; G 4810\nU 42236 ; WX 300 ; N uniA4FC ; G 4811\nU 42237 ; WX 300 ; N uniA4FD ; G 4812\nU 42238 ; WX 588 ; N uniA4FE ; G 4813\nU 42239 ; WX 588 ; N uniA4FF ; G 4814\nU 42564 ; WX 635 ; N uniA644 ; G 4815\nU 42565 ; WX 521 ; N uniA645 ; G 4816\nU 42566 ; WX 354 ; N uniA646 ; G 4817\nU 42567 ; WX 338 ; N uniA647 ; G 4818\nU 42572 ; WX 1180 ; N uniA64C ; G 4819\nU 42573 ; WX 1028 ; N uniA64D ; G 4820\nU 42576 ; WX 1029 ; N uniA650 ; G 4821\nU 42577 ; WX 906 ; N uniA651 ; G 4822\nU 42580 ; WX 1080 ; N uniA654 ; G 4823\nU 42581 ; WX 842 ; N uniA655 ; G 4824\nU 42582 ; WX 977 ; N uniA656 ; G 4825\nU 42583 ; WX 843 ; N uniA657 ; G 4826\nU 42594 ; WX 1062 ; N uniA662 ; G 4827\nU 42595 ; WX 912 ; N uniA663 ; G 4828\nU 42596 ; WX 1066 ; N uniA664 ; G 4829\nU 42597 ; WX 901 ; N uniA665 ; G 4830\nU 42598 ; WX 1178 ; N uniA666 ; G 4831\nU 42599 ; WX 1008 ; N uniA667 ; G 4832\nU 42600 ; WX 787 ; N uniA668 ; G 4833\nU 42601 ; WX 612 ; N uniA669 ; G 4834\nU 42602 ; WX 855 ; N uniA66A ; G 4835\nU 42603 ; WX 712 ; N uniA66B ; G 4836\nU 42604 ; WX 1358 ; N uniA66C ; G 4837\nU 42605 ; WX 1019 ; N uniA66D ; G 4838\nU 42606 ; WX 879 ; N uniA66E ; G 4839\nU 42634 ; WX 782 ; N uniA68A ; G 4840\nU 42635 ; WX 685 ; N uniA68B ; G 4841\nU 42636 ; WX 611 ; N uniA68C ; G 4842\nU 42637 ; WX 583 ; N uniA68D ; G 4843\nU 42644 ; WX 686 ; N uniA694 ; G 4844\nU 42645 ; WX 634 ; N uniA695 ; G 4845\nU 42648 ; WX 1358 ; N uniA698 ; G 4846\nU 42649 ; WX 1019 ; N uniA699 ; G 4847\nU 42760 ; WX 493 ; N uniA708 ; G 4848\nU 42761 ; WX 493 ; N uniA709 ; G 4849\nU 42762 ; WX 493 ; N uniA70A ; G 4850\nU 42763 ; WX 493 ; N uniA70B ; G 4851\nU 42764 ; WX 493 ; N uniA70C ; G 4852\nU 42765 ; WX 493 ; N uniA70D ; G 4853\nU 42766 ; WX 493 ; N uniA70E ; G 4854\nU 42767 ; WX 493 ; N uniA70F ; G 4855\nU 42768 ; WX 493 ; N uniA710 ; G 4856\nU 42769 ; WX 493 ; N uniA711 ; G 4857\nU 42770 ; WX 493 ; N uniA712 ; G 4858\nU 42771 ; WX 493 ; N uniA713 ; G 4859\nU 42772 ; WX 493 ; N uniA714 ; G 4860\nU 42773 ; WX 493 ; N uniA715 ; G 4861\nU 42774 ; WX 493 ; N uniA716 ; G 4862\nU 42779 ; WX 369 ; N uniA71B ; G 4863\nU 42780 ; WX 369 ; N uniA71C ; G 4864\nU 42781 ; WX 252 ; N uniA71D ; G 4865\nU 42782 ; WX 252 ; N uniA71E ; G 4866\nU 42783 ; WX 252 ; N uniA71F ; G 4867\nU 42786 ; WX 385 ; N uniA722 ; G 4868\nU 42787 ; WX 356 ; N uniA723 ; G 4869\nU 42788 ; WX 472 ; N uniA724 ; G 4870\nU 42789 ; WX 472 ; N uniA725 ; G 4871\nU 42790 ; WX 752 ; N uniA726 ; G 4872\nU 42791 ; WX 634 ; N uniA727 ; G 4873\nU 42792 ; WX 878 ; N uniA728 ; G 4874\nU 42793 ; WX 709 ; N uniA729 ; G 4875\nU 42794 ; WX 614 ; N uniA72A ; G 4876\nU 42795 ; WX 541 ; N uniA72B ; G 4877\nU 42800 ; WX 491 ; N uniA730 ; G 4878\nU 42801 ; WX 521 ; N uniA731 ; G 4879\nU 42802 ; WX 1250 ; N uniA732 ; G 4880\nU 42803 ; WX 985 ; N uniA733 ; G 4881\nU 42804 ; WX 1203 ; N uniA734 ; G 4882\nU 42805 ; WX 990 ; N uniA735 ; G 4883\nU 42806 ; WX 1142 ; N uniA736 ; G 4884\nU 42807 ; WX 981 ; N uniA737 ; G 4885\nU 42808 ; WX 971 ; N uniA738 ; G 4886\nU 42809 ; WX 818 ; N uniA739 ; G 4887\nU 42810 ; WX 971 ; N uniA73A ; G 4888\nU 42811 ; WX 818 ; N uniA73B ; G 4889\nU 42812 ; WX 959 ; N uniA73C ; G 4890\nU 42813 ; WX 818 ; N uniA73D ; G 4891\nU 42814 ; WX 703 ; N uniA73E ; G 4892\nU 42815 ; WX 549 ; N uniA73F ; G 4893\nU 42816 ; WX 656 ; N uniA740 ; G 4894\nU 42817 ; WX 583 ; N uniA741 ; G 4895\nU 42822 ; WX 680 ; N uniA746 ; G 4896\nU 42823 ; WX 392 ; N uniA747 ; G 4897\nU 42824 ; WX 582 ; N uniA748 ; G 4898\nU 42825 ; WX 427 ; N uniA749 ; G 4899\nU 42826 ; WX 807 ; N uniA74A ; G 4900\nU 42827 ; WX 704 ; N uniA74B ; G 4901\nU 42830 ; WX 1358 ; N uniA74E ; G 4902\nU 42831 ; WX 1019 ; N uniA74F ; G 4903\nU 42832 ; WX 603 ; N uniA750 ; G 4904\nU 42833 ; WX 635 ; N uniA751 ; G 4905\nU 42834 ; WX 734 ; N uniA752 ; G 4906\nU 42835 ; WX 774 ; N uniA753 ; G 4907\nU 42838 ; WX 787 ; N uniA756 ; G 4908\nU 42839 ; WX 635 ; N uniA757 ; G 4909\nU 42852 ; WX 605 ; N uniA764 ; G 4910\nU 42853 ; WX 635 ; N uniA765 ; G 4911\nU 42854 ; WX 605 ; N uniA766 ; G 4912\nU 42855 ; WX 635 ; N uniA767 ; G 4913\nU 42880 ; WX 557 ; N uniA780 ; G 4914\nU 42881 ; WX 278 ; N uniA781 ; G 4915\nU 42882 ; WX 735 ; N uniA782 ; G 4916\nU 42883 ; WX 634 ; N uniA783 ; G 4917\nU 42889 ; WX 337 ; N uniA789 ; G 4918\nU 42890 ; WX 376 ; N uniA78A ; G 4919\nU 42891 ; WX 401 ; N uniA78B ; G 4920\nU 42892 ; WX 275 ; N uniA78C ; G 4921\nU 42893 ; WX 686 ; N uniA78D ; G 4922\nU 42894 ; WX 487 ; N uniA78E ; G 4923\nU 42896 ; WX 772 ; N uniA790 ; G 4924\nU 42897 ; WX 667 ; N uniA791 ; G 4925\nU 42912 ; WX 775 ; N uniA7A0 ; G 4926\nU 42913 ; WX 635 ; N uniA7A1 ; G 4927\nU 42914 ; WX 656 ; N uniA7A2 ; G 4928\nU 42915 ; WX 579 ; N uniA7A3 ; G 4929\nU 42916 ; WX 748 ; N uniA7A4 ; G 4930\nU 42917 ; WX 634 ; N uniA7A5 ; G 4931\nU 42918 ; WX 695 ; N uniA7A6 ; G 4932\nU 42919 ; WX 411 ; N uniA7A7 ; G 4933\nU 42920 ; WX 635 ; N uniA7A8 ; G 4934\nU 42921 ; WX 521 ; N uniA7A9 ; G 4935\nU 42922 ; WX 801 ; N uniA7AA ; G 4936\nU 43000 ; WX 577 ; N uniA7F8 ; G 4937\nU 43001 ; WX 644 ; N uniA7F9 ; G 4938\nU 43002 ; WX 915 ; N uniA7FA ; G 4939\nU 43003 ; WX 575 ; N uniA7FB ; G 4940\nU 43004 ; WX 603 ; N uniA7FC ; G 4941\nU 43005 ; WX 863 ; N uniA7FD ; G 4942\nU 43006 ; WX 295 ; N uniA7FE ; G 4943\nU 43007 ; WX 1199 ; N uniA7FF ; G 4944\nU 61184 ; WX 213 ; N uni02E5.5 ; G 4945\nU 61185 ; WX 238 ; N uni02E6.5 ; G 4946\nU 61186 ; WX 257 ; N uni02E7.5 ; G 4947\nU 61187 ; WX 264 ; N uni02E8.5 ; G 4948\nU 61188 ; WX 267 ; N uni02E9.5 ; G 4949\nU 61189 ; WX 238 ; N uni02E5.4 ; G 4950\nU 61190 ; WX 213 ; N uni02E6.4 ; G 4951\nU 61191 ; WX 238 ; N uni02E7.4 ; G 4952\nU 61192 ; WX 257 ; N uni02E8.4 ; G 4953\nU 61193 ; WX 264 ; N uni02E9.4 ; G 4954\nU 61194 ; WX 257 ; N uni02E5.3 ; G 4955\nU 61195 ; WX 238 ; N uni02E6.3 ; G 4956\nU 61196 ; WX 213 ; N uni02E7.3 ; G 4957\nU 61197 ; WX 238 ; N uni02E8.3 ; G 4958\nU 61198 ; WX 257 ; N uni02E9.3 ; G 4959\nU 61199 ; WX 264 ; N uni02E5.2 ; G 4960\nU 61200 ; WX 257 ; N uni02E6.2 ; G 4961\nU 61201 ; WX 238 ; N uni02E7.2 ; G 4962\nU 61202 ; WX 213 ; N uni02E8.2 ; G 4963\nU 61203 ; WX 238 ; N uni02E9.2 ; G 4964\nU 61204 ; WX 267 ; N uni02E5.1 ; G 4965\nU 61205 ; WX 264 ; N uni02E6.1 ; G 4966\nU 61206 ; WX 257 ; N uni02E7.1 ; G 4967\nU 61207 ; WX 238 ; N uni02E8.1 ; G 4968\nU 61208 ; WX 213 ; N uni02E9.1 ; G 4969\nU 61209 ; WX 275 ; N stem ; G 4970\nU 61440 ; WX 977 ; N uniF000 ; G 4971\nU 61441 ; WX 977 ; N uniF001 ; G 4972\nU 61442 ; WX 977 ; N uniF002 ; G 4973\nU 61443 ; WX 977 ; N uniF003 ; G 4974\nU 62464 ; WX 580 ; N uniF400 ; G 4975\nU 62465 ; WX 580 ; N uniF401 ; G 4976\nU 62466 ; WX 624 ; N uniF402 ; G 4977\nU 62467 ; WX 889 ; N uniF403 ; G 4978\nU 62468 ; WX 585 ; N uniF404 ; G 4979\nU 62469 ; WX 580 ; N uniF405 ; G 4980\nU 62470 ; WX 653 ; N uniF406 ; G 4981\nU 62471 ; WX 882 ; N uniF407 ; G 4982\nU 62472 ; WX 555 ; N uniF408 ; G 4983\nU 62473 ; WX 580 ; N uniF409 ; G 4984\nU 62474 ; WX 1168 ; N uniF40A ; G 4985\nU 62475 ; WX 589 ; N uniF40B ; G 4986\nU 62476 ; WX 590 ; N uniF40C ; G 4987\nU 62477 ; WX 869 ; N uniF40D ; G 4988\nU 62478 ; WX 580 ; N uniF40E ; G 4989\nU 62479 ; WX 589 ; N uniF40F ; G 4990\nU 62480 ; WX 914 ; N uniF410 ; G 4991\nU 62481 ; WX 590 ; N uniF411 ; G 4992\nU 62482 ; WX 731 ; N uniF412 ; G 4993\nU 62483 ; WX 583 ; N uniF413 ; G 4994\nU 62484 ; WX 872 ; N uniF414 ; G 4995\nU 62485 ; WX 589 ; N uniF415 ; G 4996\nU 62486 ; WX 895 ; N uniF416 ; G 4997\nU 62487 ; WX 589 ; N uniF417 ; G 4998\nU 62488 ; WX 589 ; N uniF418 ; G 4999\nU 62489 ; WX 590 ; N uniF419 ; G 5000\nU 62490 ; WX 649 ; N uniF41A ; G 5001\nU 62491 ; WX 589 ; N uniF41B ; G 5002\nU 62492 ; WX 589 ; N uniF41C ; G 5003\nU 62493 ; WX 599 ; N uniF41D ; G 5004\nU 62494 ; WX 590 ; N uniF41E ; G 5005\nU 62495 ; WX 516 ; N uniF41F ; G 5006\nU 62496 ; WX 580 ; N uniF420 ; G 5007\nU 62497 ; WX 584 ; N uniF421 ; G 5008\nU 62498 ; WX 580 ; N uniF422 ; G 5009\nU 62499 ; WX 580 ; N uniF423 ; G 5010\nU 62500 ; WX 581 ; N uniF424 ; G 5011\nU 62501 ; WX 638 ; N uniF425 ; G 5012\nU 62502 ; WX 955 ; N uniF426 ; G 5013\nU 62504 ; WX 931 ; N uniF428 ; G 5014\nU 62505 ; WX 808 ; N uniF429 ; G 5015\nU 62506 ; WX 508 ; N uniF42A ; G 5016\nU 62507 ; WX 508 ; N uniF42B ; G 5017\nU 62508 ; WX 508 ; N uniF42C ; G 5018\nU 62509 ; WX 508 ; N uniF42D ; G 5019\nU 62510 ; WX 508 ; N uniF42E ; G 5020\nU 62511 ; WX 508 ; N uniF42F ; G 5021\nU 62512 ; WX 508 ; N uniF430 ; G 5022\nU 62513 ; WX 508 ; N uniF431 ; G 5023\nU 62514 ; WX 508 ; N uniF432 ; G 5024\nU 62515 ; WX 508 ; N uniF433 ; G 5025\nU 62516 ; WX 518 ; N uniF434 ; G 5026\nU 62517 ; WX 518 ; N uniF435 ; G 5027\nU 62518 ; WX 518 ; N uniF436 ; G 5028\nU 62519 ; WX 787 ; N uniF437 ; G 5029\nU 62520 ; WX 787 ; N uniF438 ; G 5030\nU 62521 ; WX 787 ; N uniF439 ; G 5031\nU 62522 ; WX 787 ; N uniF43A ; G 5032\nU 62523 ; WX 787 ; N uniF43B ; G 5033\nU 62524 ; WX 546 ; N uniF43C ; G 5034\nU 62525 ; WX 546 ; N uniF43D ; G 5035\nU 62526 ; WX 546 ; N uniF43E ; G 5036\nU 62527 ; WX 546 ; N uniF43F ; G 5037\nU 62528 ; WX 546 ; N uniF440 ; G 5038\nU 62529 ; WX 546 ; N uniF441 ; G 5039\nU 63173 ; WX 612 ; N uniF6C5 ; G 5040\nU 64256 ; WX 689 ; N uniFB00 ; G 5041\nU 64257 ; WX 630 ; N fi ; G 5042\nU 64258 ; WX 630 ; N fl ; G 5043\nU 64259 ; WX 967 ; N uniFB03 ; G 5044\nU 64260 ; WX 967 ; N uniFB04 ; G 5045\nU 64261 ; WX 686 ; N uniFB05 ; G 5046\nU 64262 ; WX 861 ; N uniFB06 ; G 5047\nU 64275 ; WX 1202 ; N uniFB13 ; G 5048\nU 64276 ; WX 1202 ; N uniFB14 ; G 5049\nU 64277 ; WX 1196 ; N uniFB15 ; G 5050\nU 64278 ; WX 1186 ; N uniFB16 ; G 5051\nU 64279 ; WX 1529 ; N uniFB17 ; G 5052\nU 64285 ; WX 224 ; N uniFB1D ; G 5053\nU 64286 ; WX 0 ; N uniFB1E ; G 5054\nU 64287 ; WX 331 ; N uniFB1F ; G 5055\nU 64288 ; WX 636 ; N uniFB20 ; G 5056\nU 64289 ; WX 856 ; N uniFB21 ; G 5057\nU 64290 ; WX 774 ; N uniFB22 ; G 5058\nU 64291 ; WX 906 ; N uniFB23 ; G 5059\nU 64292 ; WX 771 ; N uniFB24 ; G 5060\nU 64293 ; WX 843 ; N uniFB25 ; G 5061\nU 64294 ; WX 855 ; N uniFB26 ; G 5062\nU 64295 ; WX 807 ; N uniFB27 ; G 5063\nU 64296 ; WX 875 ; N uniFB28 ; G 5064\nU 64297 ; WX 838 ; N uniFB29 ; G 5065\nU 64298 ; WX 708 ; N uniFB2A ; G 5066\nU 64299 ; WX 708 ; N uniFB2B ; G 5067\nU 64300 ; WX 708 ; N uniFB2C ; G 5068\nU 64301 ; WX 708 ; N uniFB2D ; G 5069\nU 64302 ; WX 668 ; N uniFB2E ; G 5070\nU 64303 ; WX 668 ; N uniFB2F ; G 5071\nU 64304 ; WX 668 ; N uniFB30 ; G 5072\nU 64305 ; WX 578 ; N uniFB31 ; G 5073\nU 64306 ; WX 412 ; N uniFB32 ; G 5074\nU 64307 ; WX 546 ; N uniFB33 ; G 5075\nU 64308 ; WX 653 ; N uniFB34 ; G 5076\nU 64309 ; WX 355 ; N uniFB35 ; G 5077\nU 64310 ; WX 406 ; N uniFB36 ; G 5078\nU 64312 ; WX 648 ; N uniFB38 ; G 5079\nU 64313 ; WX 330 ; N uniFB39 ; G 5080\nU 64314 ; WX 537 ; N uniFB3A ; G 5081\nU 64315 ; WX 529 ; N uniFB3B ; G 5082\nU 64316 ; WX 568 ; N uniFB3C ; G 5083\nU 64318 ; WX 679 ; N uniFB3E ; G 5084\nU 64320 ; WX 399 ; N uniFB40 ; G 5085\nU 64321 ; WX 649 ; N uniFB41 ; G 5086\nU 64323 ; WX 640 ; N uniFB43 ; G 5087\nU 64324 ; WX 625 ; N uniFB44 ; G 5088\nU 64326 ; WX 593 ; N uniFB46 ; G 5089\nU 64327 ; WX 709 ; N uniFB47 ; G 5090\nU 64328 ; WX 564 ; N uniFB48 ; G 5091\nU 64329 ; WX 708 ; N uniFB49 ; G 5092\nU 64330 ; WX 657 ; N uniFB4A ; G 5093\nU 64331 ; WX 272 ; N uniFB4B ; G 5094\nU 64332 ; WX 578 ; N uniFB4C ; G 5095\nU 64333 ; WX 529 ; N uniFB4D ; G 5096\nU 64334 ; WX 625 ; N uniFB4E ; G 5097\nU 64335 ; WX 629 ; N uniFB4F ; G 5098\nU 64338 ; WX 941 ; N uniFB52 ; G 5099\nU 64339 ; WX 982 ; N uniFB53 ; G 5100\nU 64340 ; WX 278 ; N uniFB54 ; G 5101\nU 64341 ; WX 302 ; N uniFB55 ; G 5102\nU 64342 ; WX 941 ; N uniFB56 ; G 5103\nU 64343 ; WX 982 ; N uniFB57 ; G 5104\nU 64344 ; WX 278 ; N uniFB58 ; G 5105\nU 64345 ; WX 302 ; N uniFB59 ; G 5106\nU 64346 ; WX 941 ; N uniFB5A ; G 5107\nU 64347 ; WX 982 ; N uniFB5B ; G 5108\nU 64348 ; WX 278 ; N uniFB5C ; G 5109\nU 64349 ; WX 302 ; N uniFB5D ; G 5110\nU 64350 ; WX 941 ; N uniFB5E ; G 5111\nU 64351 ; WX 982 ; N uniFB5F ; G 5112\nU 64352 ; WX 278 ; N uniFB60 ; G 5113\nU 64353 ; WX 302 ; N uniFB61 ; G 5114\nU 64354 ; WX 941 ; N uniFB62 ; G 5115\nU 64355 ; WX 982 ; N uniFB63 ; G 5116\nU 64356 ; WX 278 ; N uniFB64 ; G 5117\nU 64357 ; WX 302 ; N uniFB65 ; G 5118\nU 64358 ; WX 941 ; N uniFB66 ; G 5119\nU 64359 ; WX 982 ; N uniFB67 ; G 5120\nU 64360 ; WX 278 ; N uniFB68 ; G 5121\nU 64361 ; WX 302 ; N uniFB69 ; G 5122\nU 64362 ; WX 1037 ; N uniFB6A ; G 5123\nU 64363 ; WX 1035 ; N uniFB6B ; G 5124\nU 64364 ; WX 478 ; N uniFB6C ; G 5125\nU 64365 ; WX 506 ; N uniFB6D ; G 5126\nU 64366 ; WX 1037 ; N uniFB6E ; G 5127\nU 64367 ; WX 1035 ; N uniFB6F ; G 5128\nU 64368 ; WX 478 ; N uniFB70 ; G 5129\nU 64369 ; WX 506 ; N uniFB71 ; G 5130\nU 64370 ; WX 646 ; N uniFB72 ; G 5131\nU 64371 ; WX 646 ; N uniFB73 ; G 5132\nU 64372 ; WX 618 ; N uniFB74 ; G 5133\nU 64373 ; WX 646 ; N uniFB75 ; G 5134\nU 64374 ; WX 646 ; N uniFB76 ; G 5135\nU 64375 ; WX 646 ; N uniFB77 ; G 5136\nU 64376 ; WX 618 ; N uniFB78 ; G 5137\nU 64377 ; WX 646 ; N uniFB79 ; G 5138\nU 64378 ; WX 646 ; N uniFB7A ; G 5139\nU 64379 ; WX 646 ; N uniFB7B ; G 5140\nU 64380 ; WX 618 ; N uniFB7C ; G 5141\nU 64381 ; WX 646 ; N uniFB7D ; G 5142\nU 64382 ; WX 646 ; N uniFB7E ; G 5143\nU 64383 ; WX 646 ; N uniFB7F ; G 5144\nU 64384 ; WX 618 ; N uniFB80 ; G 5145\nU 64385 ; WX 646 ; N uniFB81 ; G 5146\nU 64386 ; WX 445 ; N uniFB82 ; G 5147\nU 64387 ; WX 525 ; N uniFB83 ; G 5148\nU 64388 ; WX 445 ; N uniFB84 ; G 5149\nU 64389 ; WX 525 ; N uniFB85 ; G 5150\nU 64390 ; WX 445 ; N uniFB86 ; G 5151\nU 64391 ; WX 525 ; N uniFB87 ; G 5152\nU 64392 ; WX 445 ; N uniFB88 ; G 5153\nU 64393 ; WX 525 ; N uniFB89 ; G 5154\nU 64394 ; WX 483 ; N uniFB8A ; G 5155\nU 64395 ; WX 552 ; N uniFB8B ; G 5156\nU 64396 ; WX 483 ; N uniFB8C ; G 5157\nU 64397 ; WX 552 ; N uniFB8D ; G 5158\nU 64398 ; WX 895 ; N uniFB8E ; G 5159\nU 64399 ; WX 895 ; N uniFB8F ; G 5160\nU 64400 ; WX 476 ; N uniFB90 ; G 5161\nU 64401 ; WX 552 ; N uniFB91 ; G 5162\nU 64402 ; WX 895 ; N uniFB92 ; G 5163\nU 64403 ; WX 895 ; N uniFB93 ; G 5164\nU 64404 ; WX 476 ; N uniFB94 ; G 5165\nU 64405 ; WX 552 ; N uniFB95 ; G 5166\nU 64406 ; WX 895 ; N uniFB96 ; G 5167\nU 64407 ; WX 895 ; N uniFB97 ; G 5168\nU 64408 ; WX 476 ; N uniFB98 ; G 5169\nU 64409 ; WX 552 ; N uniFB99 ; G 5170\nU 64410 ; WX 895 ; N uniFB9A ; G 5171\nU 64411 ; WX 895 ; N uniFB9B ; G 5172\nU 64412 ; WX 476 ; N uniFB9C ; G 5173\nU 64413 ; WX 552 ; N uniFB9D ; G 5174\nU 64414 ; WX 734 ; N uniFB9E ; G 5175\nU 64415 ; WX 761 ; N uniFB9F ; G 5176\nU 64416 ; WX 734 ; N uniFBA0 ; G 5177\nU 64417 ; WX 761 ; N uniFBA1 ; G 5178\nU 64418 ; WX 278 ; N uniFBA2 ; G 5179\nU 64419 ; WX 302 ; N uniFBA3 ; G 5180\nU 64426 ; WX 698 ; N uniFBAA ; G 5181\nU 64427 ; WX 632 ; N uniFBAB ; G 5182\nU 64428 ; WX 527 ; N uniFBAC ; G 5183\nU 64429 ; WX 461 ; N uniFBAD ; G 5184\nU 64467 ; WX 824 ; N uniFBD3 ; G 5185\nU 64468 ; WX 843 ; N uniFBD4 ; G 5186\nU 64469 ; WX 476 ; N uniFBD5 ; G 5187\nU 64470 ; WX 552 ; N uniFBD6 ; G 5188\nU 64471 ; WX 483 ; N uniFBD7 ; G 5189\nU 64472 ; WX 517 ; N uniFBD8 ; G 5190\nU 64473 ; WX 483 ; N uniFBD9 ; G 5191\nU 64474 ; WX 517 ; N uniFBDA ; G 5192\nU 64475 ; WX 483 ; N uniFBDB ; G 5193\nU 64476 ; WX 517 ; N uniFBDC ; G 5194\nU 64478 ; WX 483 ; N uniFBDE ; G 5195\nU 64479 ; WX 517 ; N uniFBDF ; G 5196\nU 64484 ; WX 783 ; N uniFBE4 ; G 5197\nU 64485 ; WX 833 ; N uniFBE5 ; G 5198\nU 64486 ; WX 278 ; N uniFBE6 ; G 5199\nU 64487 ; WX 302 ; N uniFBE7 ; G 5200\nU 64488 ; WX 278 ; N uniFBE8 ; G 5201\nU 64489 ; WX 302 ; N uniFBE9 ; G 5202\nU 64508 ; WX 783 ; N uniFBFC ; G 5203\nU 64509 ; WX 833 ; N uniFBFD ; G 5204\nU 64510 ; WX 278 ; N uniFBFE ; G 5205\nU 64511 ; WX 302 ; N uniFBFF ; G 5206\nU 65024 ; WX 0 ; N uniFE00 ; G 5207\nU 65025 ; WX 0 ; N uniFE01 ; G 5208\nU 65026 ; WX 0 ; N uniFE02 ; G 5209\nU 65027 ; WX 0 ; N uniFE03 ; G 5210\nU 65028 ; WX 0 ; N uniFE04 ; G 5211\nU 65029 ; WX 0 ; N uniFE05 ; G 5212\nU 65030 ; WX 0 ; N uniFE06 ; G 5213\nU 65031 ; WX 0 ; N uniFE07 ; G 5214\nU 65032 ; WX 0 ; N uniFE08 ; G 5215\nU 65033 ; WX 0 ; N uniFE09 ; G 5216\nU 65034 ; WX 0 ; N uniFE0A ; G 5217\nU 65035 ; WX 0 ; N uniFE0B ; G 5218\nU 65036 ; WX 0 ; N uniFE0C ; G 5219\nU 65037 ; WX 0 ; N uniFE0D ; G 5220\nU 65038 ; WX 0 ; N uniFE0E ; G 5221\nU 65039 ; WX 0 ; N uniFE0F ; G 5222\nU 65056 ; WX 0 ; N uniFE20 ; G 5223\nU 65057 ; WX 0 ; N uniFE21 ; G 5224\nU 65058 ; WX 0 ; N uniFE22 ; G 5225\nU 65059 ; WX 0 ; N uniFE23 ; G 5226\nU 65136 ; WX 293 ; N uniFE70 ; G 5227\nU 65137 ; WX 293 ; N uniFE71 ; G 5228\nU 65138 ; WX 293 ; N uniFE72 ; G 5229\nU 65139 ; WX 262 ; N uniFE73 ; G 5230\nU 65140 ; WX 293 ; N uniFE74 ; G 5231\nU 65142 ; WX 293 ; N uniFE76 ; G 5232\nU 65143 ; WX 293 ; N uniFE77 ; G 5233\nU 65144 ; WX 293 ; N uniFE78 ; G 5234\nU 65145 ; WX 293 ; N uniFE79 ; G 5235\nU 65146 ; WX 293 ; N uniFE7A ; G 5236\nU 65147 ; WX 293 ; N uniFE7B ; G 5237\nU 65148 ; WX 293 ; N uniFE7C ; G 5238\nU 65149 ; WX 293 ; N uniFE7D ; G 5239\nU 65150 ; WX 293 ; N uniFE7E ; G 5240\nU 65151 ; WX 293 ; N uniFE7F ; G 5241\nU 65152 ; WX 470 ; N uniFE80 ; G 5242\nU 65153 ; WX 278 ; N uniFE81 ; G 5243\nU 65154 ; WX 305 ; N uniFE82 ; G 5244\nU 65155 ; WX 278 ; N uniFE83 ; G 5245\nU 65156 ; WX 305 ; N uniFE84 ; G 5246\nU 65157 ; WX 483 ; N uniFE85 ; G 5247\nU 65158 ; WX 517 ; N uniFE86 ; G 5248\nU 65159 ; WX 278 ; N uniFE87 ; G 5249\nU 65160 ; WX 305 ; N uniFE88 ; G 5250\nU 65161 ; WX 783 ; N uniFE89 ; G 5251\nU 65162 ; WX 833 ; N uniFE8A ; G 5252\nU 65163 ; WX 278 ; N uniFE8B ; G 5253\nU 65164 ; WX 302 ; N uniFE8C ; G 5254\nU 65165 ; WX 278 ; N uniFE8D ; G 5255\nU 65166 ; WX 305 ; N uniFE8E ; G 5256\nU 65167 ; WX 941 ; N uniFE8F ; G 5257\nU 65168 ; WX 982 ; N uniFE90 ; G 5258\nU 65169 ; WX 278 ; N uniFE91 ; G 5259\nU 65170 ; WX 302 ; N uniFE92 ; G 5260\nU 65171 ; WX 524 ; N uniFE93 ; G 5261\nU 65172 ; WX 536 ; N uniFE94 ; G 5262\nU 65173 ; WX 941 ; N uniFE95 ; G 5263\nU 65174 ; WX 982 ; N uniFE96 ; G 5264\nU 65175 ; WX 278 ; N uniFE97 ; G 5265\nU 65176 ; WX 302 ; N uniFE98 ; G 5266\nU 65177 ; WX 941 ; N uniFE99 ; G 5267\nU 65178 ; WX 982 ; N uniFE9A ; G 5268\nU 65179 ; WX 278 ; N uniFE9B ; G 5269\nU 65180 ; WX 302 ; N uniFE9C ; G 5270\nU 65181 ; WX 646 ; N uniFE9D ; G 5271\nU 65182 ; WX 646 ; N uniFE9E ; G 5272\nU 65183 ; WX 618 ; N uniFE9F ; G 5273\nU 65184 ; WX 646 ; N uniFEA0 ; G 5274\nU 65185 ; WX 646 ; N uniFEA1 ; G 5275\nU 65186 ; WX 646 ; N uniFEA2 ; G 5276\nU 65187 ; WX 618 ; N uniFEA3 ; G 5277\nU 65188 ; WX 646 ; N uniFEA4 ; G 5278\nU 65189 ; WX 646 ; N uniFEA5 ; G 5279\nU 65190 ; WX 646 ; N uniFEA6 ; G 5280\nU 65191 ; WX 618 ; N uniFEA7 ; G 5281\nU 65192 ; WX 646 ; N uniFEA8 ; G 5282\nU 65193 ; WX 445 ; N uniFEA9 ; G 5283\nU 65194 ; WX 525 ; N uniFEAA ; G 5284\nU 65195 ; WX 445 ; N uniFEAB ; G 5285\nU 65196 ; WX 525 ; N uniFEAC ; G 5286\nU 65197 ; WX 483 ; N uniFEAD ; G 5287\nU 65198 ; WX 552 ; N uniFEAE ; G 5288\nU 65199 ; WX 483 ; N uniFEAF ; G 5289\nU 65200 ; WX 552 ; N uniFEB0 ; G 5290\nU 65201 ; WX 1221 ; N uniFEB1 ; G 5291\nU 65202 ; WX 1275 ; N uniFEB2 ; G 5292\nU 65203 ; WX 838 ; N uniFEB3 ; G 5293\nU 65204 ; WX 892 ; N uniFEB4 ; G 5294\nU 65205 ; WX 1221 ; N uniFEB5 ; G 5295\nU 65206 ; WX 1275 ; N uniFEB6 ; G 5296\nU 65207 ; WX 838 ; N uniFEB7 ; G 5297\nU 65208 ; WX 892 ; N uniFEB8 ; G 5298\nU 65209 ; WX 1209 ; N uniFEB9 ; G 5299\nU 65210 ; WX 1225 ; N uniFEBA ; G 5300\nU 65211 ; WX 849 ; N uniFEBB ; G 5301\nU 65212 ; WX 867 ; N uniFEBC ; G 5302\nU 65213 ; WX 1209 ; N uniFEBD ; G 5303\nU 65214 ; WX 1225 ; N uniFEBE ; G 5304\nU 65215 ; WX 849 ; N uniFEBF ; G 5305\nU 65216 ; WX 867 ; N uniFEC0 ; G 5306\nU 65217 ; WX 925 ; N uniFEC1 ; G 5307\nU 65218 ; WX 949 ; N uniFEC2 ; G 5308\nU 65219 ; WX 796 ; N uniFEC3 ; G 5309\nU 65220 ; WX 820 ; N uniFEC4 ; G 5310\nU 65221 ; WX 925 ; N uniFEC5 ; G 5311\nU 65222 ; WX 949 ; N uniFEC6 ; G 5312\nU 65223 ; WX 796 ; N uniFEC7 ; G 5313\nU 65224 ; WX 820 ; N uniFEC8 ; G 5314\nU 65225 ; WX 597 ; N uniFEC9 ; G 5315\nU 65226 ; WX 532 ; N uniFECA ; G 5316\nU 65227 ; WX 597 ; N uniFECB ; G 5317\nU 65228 ; WX 482 ; N uniFECC ; G 5318\nU 65229 ; WX 597 ; N uniFECD ; G 5319\nU 65230 ; WX 532 ; N uniFECE ; G 5320\nU 65231 ; WX 523 ; N uniFECF ; G 5321\nU 65232 ; WX 482 ; N uniFED0 ; G 5322\nU 65233 ; WX 1037 ; N uniFED1 ; G 5323\nU 65234 ; WX 1035 ; N uniFED2 ; G 5324\nU 65235 ; WX 478 ; N uniFED3 ; G 5325\nU 65236 ; WX 506 ; N uniFED4 ; G 5326\nU 65237 ; WX 776 ; N uniFED5 ; G 5327\nU 65238 ; WX 834 ; N uniFED6 ; G 5328\nU 65239 ; WX 478 ; N uniFED7 ; G 5329\nU 65240 ; WX 506 ; N uniFED8 ; G 5330\nU 65241 ; WX 824 ; N uniFED9 ; G 5331\nU 65242 ; WX 843 ; N uniFEDA ; G 5332\nU 65243 ; WX 476 ; N uniFEDB ; G 5333\nU 65244 ; WX 552 ; N uniFEDC ; G 5334\nU 65245 ; WX 727 ; N uniFEDD ; G 5335\nU 65246 ; WX 757 ; N uniFEDE ; G 5336\nU 65247 ; WX 305 ; N uniFEDF ; G 5337\nU 65248 ; WX 331 ; N uniFEE0 ; G 5338\nU 65249 ; WX 619 ; N uniFEE1 ; G 5339\nU 65250 ; WX 666 ; N uniFEE2 ; G 5340\nU 65251 ; WX 536 ; N uniFEE3 ; G 5341\nU 65252 ; WX 578 ; N uniFEE4 ; G 5342\nU 65253 ; WX 734 ; N uniFEE5 ; G 5343\nU 65254 ; WX 761 ; N uniFEE6 ; G 5344\nU 65255 ; WX 278 ; N uniFEE7 ; G 5345\nU 65256 ; WX 302 ; N uniFEE8 ; G 5346\nU 65257 ; WX 524 ; N uniFEE9 ; G 5347\nU 65258 ; WX 536 ; N uniFEEA ; G 5348\nU 65259 ; WX 527 ; N uniFEEB ; G 5349\nU 65260 ; WX 461 ; N uniFEEC ; G 5350\nU 65261 ; WX 483 ; N uniFEED ; G 5351\nU 65262 ; WX 517 ; N uniFEEE ; G 5352\nU 65263 ; WX 783 ; N uniFEEF ; G 5353\nU 65264 ; WX 833 ; N uniFEF0 ; G 5354\nU 65265 ; WX 783 ; N uniFEF1 ; G 5355\nU 65266 ; WX 833 ; N uniFEF2 ; G 5356\nU 65267 ; WX 278 ; N uniFEF3 ; G 5357\nU 65268 ; WX 302 ; N uniFEF4 ; G 5358\nU 65269 ; WX 570 ; N uniFEF5 ; G 5359\nU 65270 ; WX 597 ; N uniFEF6 ; G 5360\nU 65271 ; WX 570 ; N uniFEF7 ; G 5361\nU 65272 ; WX 597 ; N uniFEF8 ; G 5362\nU 65273 ; WX 570 ; N uniFEF9 ; G 5363\nU 65274 ; WX 597 ; N uniFEFA ; G 5364\nU 65275 ; WX 570 ; N uniFEFB ; G 5365\nU 65276 ; WX 597 ; N uniFEFC ; G 5366\nU 65279 ; WX 0 ; N uniFEFF ; G 5367\nU 65529 ; WX 0 ; N uniFFF9 ; G 5368\nU 65530 ; WX 0 ; N uniFFFA ; G 5369\nU 65531 ; WX 0 ; N uniFFFB ; G 5370\nU 65532 ; WX 0 ; N uniFFFC ; G 5371\nU 65533 ; WX 1025 ; N uniFFFD ; G 5372\nEndCharMetrics\nStartKernData \nStartKernPairs 2727\n\nKPX dollar dollar 57\nKPX dollar ampersand -36\nKPX dollar asterisk -36\nKPX dollar two -36\nKPX dollar four -36\nKPX dollar seven -159\nKPX dollar nine -131\nKPX dollar colon -112\nKPX dollar less -159\nKPX dollar F -36\nKPX dollar G -36\nKPX dollar H -36\nKPX dollar I -73\nKPX dollar R -36\nKPX dollar T -36\nKPX dollar W -36\nKPX dollar Y -120\nKPX dollar Z -83\nKPX dollar backslash -139\nKPX dollar m -73\nKPX dollar copyright -36\nKPX dollar ordfeminine -36\nKPX dollar guillemotleft -36\nKPX dollar logicalnot -36\nKPX dollar sfthyphen -36\nKPX dollar acute -36\nKPX dollar mu -36\nKPX dollar paragraph -36\nKPX dollar periodcentered -36\nKPX dollar cedilla -36\nKPX dollar questiondown -139\nKPX dollar Aacute -139\nKPX dollar Acircumflex 57\nKPX dollar Adieresis 57\nKPX dollar AE 57\nKPX dollar Egrave -36\nKPX dollar Eacute -36\nKPX dollar Ecircumflex -36\nKPX dollar Edieresis -36\nKPX dollar Igrave -36\nKPX dollar Iacute -36\nKPX dollar Icircumflex -36\nKPX dollar Idieresis -36\nKPX dollar Ntilde -36\nKPX dollar Oacute -36\nKPX dollar Otilde -36\nKPX dollar multiply -36\nKPX dollar Ugrave -36\nKPX dollar Ucircumflex -36\nKPX dollar Yacute -36\nKPX dollar Thorn -36\nKPX dollar agrave -36\nKPX dollar acircumflex -36\nKPX dollar Dcaron -36\nKPX dollar dcaron -36\nKPX dollar Dcroat -36\nKPX dollar dmacron -36\nKPX dollar Emacron -36\nKPX dollar emacron -36\nKPX dollar Hcircumflex -159\nKPX dollar hcircumflex -36\nKPX dollar Hbar -159\nKPX dollar hbar -36\nKPX dollar Kcommaaccent -112\nKPX dollar kcommaaccent -83\nKPX dollar kgreenlandic -159\nKPX dollar Lacute -139\nKPX dollar lacute -159\nKPX dollar uni0188 -36\nKPX dollar uni01AC -36\nKPX dollar uni01AD -36\nKPX dollar uni01AE -36\nKPX dollar Uhorn -36\nKPX dollar uni01DC -159\nKPX dollar uni01DD -36\nKPX dollar uni01F0 -36\nKPX dollar uni01F3 -36\nKPX dollar uni01F4 -159\nKPX dollar uni01F5 -139\n\nKPX percent ampersand -36\nKPX percent asterisk -36\nKPX percent two -36\nKPX percent six -36\nKPX percent nine -63\nKPX percent colon -73\nKPX percent less -112\nKPX percent m -63\nKPX percent braceright -36\nKPX percent Egrave -36\nKPX percent Ecircumflex -36\nKPX percent Igrave -36\nKPX percent Icircumflex -36\nKPX percent Thorn -36\nKPX percent agrave -36\nKPX percent acircumflex -36\nKPX percent adieresis -36\nKPX percent Dcaron -36\nKPX percent Dcroat -36\nKPX percent Emacron -36\nKPX percent Gcircumflex -36\nKPX percent Gbreve -36\nKPX percent Gdotaccent -36\nKPX percent Gcommaaccent -36\nKPX percent Kcommaaccent -73\nKPX percent kgreenlandic -112\nKPX percent lacute -112\nKPX percent uni01AC -36\nKPX percent uni01AE -36\nKPX percent uni01DA -36\nKPX percent uni01F0 -36\n\nKPX ampersand less -36\nKPX ampersand m -36\nKPX ampersand braceright -36\nKPX ampersand kgreenlandic -36\nKPX ampersand lacute -36\nKPX ampersand uni01F4 -36\n\nKPX quotesingle dollar -36\nKPX quotesingle nine -36\nKPX quotesingle less -112\nKPX quotesingle m -36\nKPX quotesingle braceright -36\nKPX quotesingle Acircumflex -36\nKPX quotesingle Adieresis -36\nKPX quotesingle AE -36\nKPX quotesingle kgreenlandic -112\nKPX quotesingle lacute -112\nKPX quotesingle uni01F4 -112\n\nKPX parenright dollar -188\nKPX parenright six -36\nKPX parenright seven -36\nKPX parenright D -188\nKPX parenright H -112\nKPX parenright L -149\nKPX parenright R -73\nKPX parenright U -149\nKPX parenright X -112\nKPX parenright backslash -188\nKPX parenright cent -188\nKPX parenright sterling -188\nKPX parenright currency -188\nKPX parenright yen -188\nKPX parenright brokenbar -188\nKPX parenright section -188\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -73\nKPX parenright mu -73\nKPX parenright paragraph -73\nKPX parenright periodcentered -73\nKPX parenright cedilla -73\nKPX parenright guillemotright -112\nKPX parenright onequarter -112\nKPX parenright onehalf -112\nKPX parenright threequarters -112\nKPX parenright questiondown -188\nKPX parenright Aacute -188\nKPX parenright Acircumflex -188\nKPX parenright Atilde -188\nKPX parenright Adieresis -188\nKPX parenright Aring -188\nKPX parenright AE -188\nKPX parenright Ccedilla -188\nKPX parenright Otilde -112\nKPX parenright multiply -112\nKPX parenright Ugrave -112\nKPX parenright Ucircumflex -112\nKPX parenright Yacute -112\nKPX parenright ntilde -149\nKPX parenright otilde -149\nKPX parenright dcaron -73\nKPX parenright dmacron -73\nKPX parenright emacron -73\nKPX parenright edotaccent -149\nKPX parenright eogonek -149\nKPX parenright ecaron -149\nKPX parenright Gcircumflex -36\nKPX parenright Gbreve -36\nKPX parenright Gdotaccent -36\nKPX parenright Gcommaaccent -36\nKPX parenright Hcircumflex -36\nKPX parenright Hbar -36\nKPX parenright Itilde -36\nKPX parenright imacron -112\nKPX parenright ibreve -112\nKPX parenright iogonek -112\nKPX parenright dotlessi -112\nKPX parenright ij -112\nKPX parenright jcircumflex -112\nKPX parenright Lacute -188\nKPX parenright uni01AD -73\nKPX parenright Uhorn -73\nKPX parenright uni01DA -36\nKPX parenright uni01DC -36\nKPX parenright uni01F1 -73\nKPX parenright uni01F5 -188\n\nKPX asterisk seven -73\nKPX asterisk less -102\nKPX asterisk m -36\nKPX asterisk braceright -36\nKPX asterisk Hbar -73\nKPX asterisk lacute -102\n\n\nKPX hyphen dollar -36\nKPX hyphen m -36\nKPX hyphen braceright -36\n\nKPX period dollar -36\nKPX period ampersand -112\nKPX period two -112\nKPX period seven -159\nKPX period eight -55\nKPX period colon -73\nKPX period less -73\nKPX period D -36\nKPX period H -102\nKPX period R -102\nKPX period X -102\nKPX period backslash -149\nKPX period m -131\nKPX period cent -36\nKPX period sterling -36\nKPX period currency -36\nKPX period yen -36\nKPX period brokenbar -36\nKPX period section -36\nKPX period ordfeminine -102\nKPX period guillemotleft -102\nKPX period logicalnot -102\nKPX period sfthyphen -102\nKPX period acute -102\nKPX period mu -102\nKPX period paragraph -102\nKPX period periodcentered -102\nKPX period cedilla -102\nKPX period guillemotright -102\nKPX period onequarter -102\nKPX period onehalf -102\nKPX period threequarters -102\nKPX period questiondown -149\nKPX period Aacute -149\nKPX period Egrave -112\nKPX period Icircumflex -112\nKPX period Yacute -102\nKPX period Hbar -159\nKPX period Idot -55\nKPX period dotlessi -102\nKPX period lacute -73\n\nKPX slash dollar 47\nKPX slash two -73\nKPX slash seven -282\nKPX slash eight -102\nKPX slash nine -225\nKPX slash colon -188\nKPX slash less -272\nKPX slash H -36\nKPX slash R -36\nKPX slash X -36\nKPX slash backslash -188\nKPX slash ordfeminine -36\nKPX slash guillemotleft -36\nKPX slash logicalnot -36\nKPX slash sfthyphen -36\nKPX slash acute -36\nKPX slash mu -36\nKPX slash paragraph -36\nKPX slash periodcentered -36\nKPX slash cedilla -36\nKPX slash guillemotright -36\nKPX slash onequarter -36\nKPX slash onehalf -36\nKPX slash threequarters -36\nKPX slash questiondown -188\nKPX slash Aacute -188\nKPX slash Yacute -36\nKPX slash Hbar -282\nKPX slash Idot -102\nKPX slash dotlessi -36\nKPX slash lacute -272\n\nKPX two dollar -36\nKPX two nine -36\nKPX two semicolon -131\nKPX two less -112\nKPX two m -36\nKPX two lacute -112\n\nKPX three dollar -131\nKPX three less -45\nKPX three D -92\nKPX three H -73\nKPX three L -45\nKPX three Q -36\nKPX three R -73\nKPX three U -36\nKPX three V -36\nKPX three X -36\nKPX three m -36\nKPX three cent -92\nKPX three sterling -92\nKPX three currency -92\nKPX three yen -92\nKPX three brokenbar -92\nKPX three section -92\nKPX three ordfeminine -73\nKPX three guillemotleft -73\nKPX three logicalnot -73\nKPX three sfthyphen -73\nKPX three threesuperior -36\nKPX three acute -73\nKPX three mu -73\nKPX three paragraph -73\nKPX three periodcentered -73\nKPX three cedilla -73\nKPX three guillemotright -36\nKPX three onequarter -36\nKPX three onehalf -36\nKPX three threequarters -36\nKPX three Yacute -73\nKPX three Cdotaccent -36\nKPX three edotaccent -36\nKPX three ecaron -36\nKPX three gdotaccent -36\nKPX three gcommaaccent -36\nKPX three dotlessi -36\nKPX three lacute -45\n\n\nKPX five dollar -83\nKPX five ampersand -102\nKPX five seven -149\nKPX five nine -112\nKPX five colon -83\nKPX five less -131\nKPX five D -45\nKPX five H -92\nKPX five R -92\nKPX five X -92\nKPX five backslash -112\nKPX five m -112\nKPX five braceright -36\nKPX five cent -45\nKPX five sterling -45\nKPX five currency -45\nKPX five yen -45\nKPX five brokenbar -45\nKPX five section -45\nKPX five ordfeminine -92\nKPX five guillemotleft -92\nKPX five logicalnot -92\nKPX five sfthyphen -92\nKPX five acute -92\nKPX five mu -92\nKPX five paragraph -92\nKPX five periodcentered -92\nKPX five cedilla -92\nKPX five guillemotright -92\nKPX five onequarter -92\nKPX five onehalf -92\nKPX five threequarters -92\nKPX five questiondown -112\nKPX five Aacute -112\nKPX five Egrave -102\nKPX five Icircumflex -102\nKPX five Yacute -92\nKPX five Hbar -149\nKPX five dotlessi -92\nKPX five lacute -131\n\nKPX six dollar 38\n\nKPX seven dollar -159\nKPX seven ampersand -120\nKPX seven seven -36\nKPX seven D -339\nKPX seven F -348\nKPX seven H -348\nKPX seven L -63\nKPX seven R -348\nKPX seven U -301\nKPX seven V -339\nKPX seven X -311\nKPX seven Z -339\nKPX seven backslash -319\nKPX seven m -188\nKPX seven braceright -112\nKPX seven cent -239\nKPX seven sterling -339\nKPX seven currency -239\nKPX seven yen -239\nKPX seven brokenbar -239\nKPX seven section -239\nKPX seven copyright -348\nKPX seven ordfeminine -288\nKPX seven guillemotleft -348\nKPX seven logicalnot -288\nKPX seven sfthyphen -288\nKPX seven acute -268\nKPX seven mu -348\nKPX seven paragraph -268\nKPX seven periodcentered -268\nKPX seven cedilla -268\nKPX seven guillemotright -281\nKPX seven onequarter -311\nKPX seven onehalf -281\nKPX seven threequarters -281\nKPX seven questiondown -319\nKPX seven Aacute -319\nKPX seven Egrave -120\nKPX seven Eacute -348\nKPX seven Icircumflex -120\nKPX seven Idieresis -348\nKPX seven Yacute -348\nKPX seven edotaccent -301\nKPX seven ecaron -301\nKPX seven gdotaccent -339\nKPX seven gcommaaccent -339\nKPX seven Hbar -36\nKPX seven dotlessi -311\n\nKPX eight equal -36\nKPX eight Ldot -36\n\nKPX nine dollar -131\nKPX nine two -36\nKPX nine D -159\nKPX nine H -159\nKPX nine L -45\nKPX nine R -159\nKPX nine X -139\nKPX nine backslash -55\nKPX nine m -178\nKPX nine braceright -112\nKPX nine cent -159\nKPX nine sterling -159\nKPX nine currency -159\nKPX nine yen -159\nKPX nine brokenbar -159\nKPX nine section -159\nKPX nine ordfeminine -159\nKPX nine guillemotleft -159\nKPX nine logicalnot -159\nKPX nine sfthyphen -159\nKPX nine acute -159\nKPX nine mu -159\nKPX nine paragraph -159\nKPX nine periodcentered -159\nKPX nine cedilla -159\nKPX nine guillemotright -139\nKPX nine onequarter -139\nKPX nine onehalf -139\nKPX nine threequarters -139\nKPX nine questiondown -55\nKPX nine Aacute -55\nKPX nine Yacute -159\nKPX nine dotlessi -139\n\nKPX colon dollar -112\nKPX colon D -131\nKPX colon H -120\nKPX colon L -45\nKPX colon R -120\nKPX colon U -92\nKPX colon X -73\nKPX colon backslash -36\nKPX colon m -112\nKPX colon braceright -36\nKPX colon cent -131\nKPX colon sterling -131\nKPX colon currency -131\nKPX colon yen -131\nKPX colon brokenbar -131\nKPX colon section -131\nKPX colon ordfeminine -120\nKPX colon guillemotleft -120\nKPX colon logicalnot -120\nKPX colon sfthyphen -120\nKPX colon acute -120\nKPX colon mu -120\nKPX colon paragraph -120\nKPX colon periodcentered -120\nKPX colon cedilla -120\nKPX colon guillemotright -73\nKPX colon onequarter -73\nKPX colon onehalf -73\nKPX colon threequarters -73\nKPX colon questiondown -36\nKPX colon Aacute -36\nKPX colon Yacute -120\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -73\n\nKPX semicolon ampersand -149\nKPX semicolon two -131\nKPX semicolon seven -36\nKPX semicolon H -92\nKPX semicolon m -112\nKPX semicolon ordfeminine -92\nKPX semicolon guillemotleft -92\nKPX semicolon logicalnot -92\nKPX semicolon sfthyphen -92\nKPX semicolon Egrave -149\nKPX semicolon Icircumflex -149\nKPX semicolon Yacute -92\nKPX semicolon Hbar -36\n\nKPX less dollar -159\nKPX less ampersand -112\nKPX less two -112\nKPX less D -282\nKPX less H -272\nKPX less L -73\nKPX less R -272\nKPX less X -235\nKPX less m -225\nKPX less braceright -149\nKPX less cent -282\nKPX less sterling -282\nKPX less currency -282\nKPX less yen -282\nKPX less brokenbar -282\nKPX less section -282\nKPX less ordfeminine -272\nKPX less guillemotleft -272\nKPX less logicalnot -272\nKPX less sfthyphen -272\nKPX less acute -272\nKPX less mu -272\nKPX less paragraph -272\nKPX less periodcentered -272\nKPX less cedilla -272\nKPX less guillemotright -235\nKPX less onequarter -235\nKPX less onehalf -235\nKPX less threequarters -235\nKPX less Egrave -112\nKPX less Icircumflex -112\nKPX less Yacute -272\nKPX less dotlessi -235\n\n\nKPX H bracketleft -36\n\nKPX I W -36\nKPX I Z -36\nKPX I backslash -36\nKPX I m -73\nKPX I braceright -36\nKPX I questiondown -36\nKPX I Aacute -36\nKPX I hbar -36\n\nKPX N D -36\nKPX N H -73\nKPX N R -73\nKPX N X -63\nKPX N backslash -73\nKPX N cent -36\nKPX N sterling -36\nKPX N currency -36\nKPX N yen -36\nKPX N brokenbar -36\nKPX N section -36\nKPX N ordfeminine -73\nKPX N guillemotleft -73\nKPX N logicalnot -73\nKPX N sfthyphen -73\nKPX N acute -73\nKPX N mu -73\nKPX N paragraph -73\nKPX N periodcentered -73\nKPX N cedilla -73\nKPX N guillemotright -63\nKPX N onequarter -63\nKPX N onehalf -63\nKPX N threequarters -63\nKPX N questiondown -73\nKPX N Aacute -73\nKPX N Yacute -73\nKPX N dotlessi -63\n\n\nKPX R bracketleft -63\n\nKPX U F -45\nKPX U G -36\nKPX U H -45\nKPX U J -36\nKPX U K -36\nKPX U P -36\nKPX U Q -36\nKPX U R -45\nKPX U T -36\nKPX U U -36\nKPX U bracketleft -55\nKPX U m -73\nKPX U copyright -45\nKPX U ordfeminine -45\nKPX U guillemotleft -45\nKPX U logicalnot -45\nKPX U sfthyphen -45\nKPX U threesuperior -36\nKPX U acute -45\nKPX U mu -45\nKPX U paragraph -45\nKPX U periodcentered -45\nKPX U cedilla -45\nKPX U Eacute -45\nKPX U Idieresis -45\nKPX U Ntilde 72\nKPX U Yacute -45\nKPX U aacute -36\nKPX U Cdotaccent -36\nKPX U edotaccent -36\nKPX U ecaron -36\n\nKPX Y m -36\nKPX Y braceright -36\n\nKPX Z m -36\nKPX Z braceright -36\n\nKPX bracketleft F -36\nKPX bracketleft H -63\nKPX bracketleft R -63\nKPX bracketleft copyright -36\nKPX bracketleft ordfeminine -63\nKPX bracketleft guillemotleft -63\nKPX bracketleft logicalnot -63\nKPX bracketleft sfthyphen -63\nKPX bracketleft acute -63\nKPX bracketleft mu -63\nKPX bracketleft paragraph -63\nKPX bracketleft periodcentered -63\nKPX bracketleft cedilla -63\nKPX bracketleft Eacute -36\nKPX bracketleft Idieresis -36\nKPX bracketleft Yacute -63\n\nKPX backslash m -36\nKPX backslash braceright -36\n\nKPX m percent -36\nKPX m ampersand -36\nKPX m quotesingle -36\nKPX m asterisk -36\nKPX m hyphen -36\nKPX m seven -112\nKPX m nine -112\nKPX m colon -36\nKPX m less -149\nKPX m Y -36\nKPX m Z -36\nKPX m backslash -36\nKPX m questiondown -36\nKPX m Aacute -36\nKPX m Egrave -36\nKPX m Icircumflex -36\nKPX m Eth -36\nKPX m agrave -36\nKPX m Hbar -112\nKPX m lacute -149\n\nKPX braceright dollar -73\nKPX braceright percent -73\nKPX braceright ampersand -36\nKPX braceright quotesingle -36\nKPX braceright hyphen -36\nKPX braceright two -36\nKPX braceright seven -188\nKPX braceright nine -178\nKPX braceright colon -112\nKPX braceright semicolon -112\nKPX braceright less -225\nKPX braceright Y -36\nKPX braceright Z -36\nKPX braceright backslash -36\nKPX braceright questiondown -36\nKPX braceright Aacute -36\nKPX braceright Egrave -36\nKPX braceright Icircumflex -36\nKPX braceright Eth -36\nKPX braceright Hbar -188\nKPX braceright lacute -225\n\n\n\nKPX ordfeminine bracketleft -36\n\nKPX guillemotleft bracketleft -36\n\nKPX logicalnot bracketleft -36\n\nKPX sfthyphen bracketleft -36\n\n\n\nKPX acute bracketleft -63\n\nKPX mu bracketleft -63\n\nKPX paragraph bracketleft -63\n\nKPX periodcentered bracketleft -63\n\nKPX cedilla bracketleft -63\n\nKPX questiondown m -36\nKPX questiondown braceright -36\n\nKPX Aacute m -36\nKPX Aacute braceright -36\n\nKPX Acircumflex dollar 57\nKPX Acircumflex ampersand -36\nKPX Acircumflex asterisk -36\nKPX Acircumflex two -36\nKPX Acircumflex four -36\nKPX Acircumflex seven -159\nKPX Acircumflex nine -131\nKPX Acircumflex colon -112\nKPX Acircumflex less -159\nKPX Acircumflex F -36\nKPX Acircumflex G -36\nKPX Acircumflex H -36\nKPX Acircumflex I -73\nKPX Acircumflex R -36\nKPX Acircumflex T -36\nKPX Acircumflex W -36\nKPX Acircumflex Y -120\nKPX Acircumflex Z -83\nKPX Acircumflex backslash -139\nKPX Acircumflex m -73\nKPX Acircumflex copyright -36\nKPX Acircumflex ordfeminine -36\nKPX Acircumflex guillemotleft -36\nKPX Acircumflex logicalnot -36\nKPX Acircumflex sfthyphen -36\nKPX Acircumflex acute -36\nKPX Acircumflex mu -36\nKPX Acircumflex paragraph -36\nKPX Acircumflex periodcentered -36\nKPX Acircumflex cedilla -36\nKPX Acircumflex questiondown -139\nKPX Acircumflex Aacute -139\nKPX Acircumflex Acircumflex 57\nKPX Acircumflex Adieresis 57\nKPX Acircumflex AE 57\nKPX Acircumflex Egrave -36\nKPX Acircumflex Ecircumflex -36\nKPX Acircumflex Igrave -36\nKPX Acircumflex Iacute -36\nKPX Acircumflex Icircumflex -36\nKPX Acircumflex Ntilde -36\nKPX Acircumflex Oacute -36\nKPX Acircumflex Otilde -36\nKPX Acircumflex multiply -36\nKPX Acircumflex Ugrave -36\nKPX Acircumflex Ucircumflex -36\nKPX Acircumflex Yacute -36\nKPX Acircumflex Thorn -36\nKPX Acircumflex acircumflex -36\nKPX Acircumflex Dcaron -36\nKPX Acircumflex dcaron -36\nKPX Acircumflex Dcroat -36\nKPX Acircumflex dmacron -36\nKPX Acircumflex Emacron -36\nKPX Acircumflex emacron -36\nKPX Acircumflex Hcircumflex -159\nKPX Acircumflex hcircumflex -36\nKPX Acircumflex Hbar -159\nKPX Acircumflex hbar -36\nKPX Acircumflex Kcommaaccent -112\nKPX Acircumflex kcommaaccent -83\nKPX Acircumflex kgreenlandic -159\nKPX Acircumflex Lacute -139\nKPX Acircumflex lacute -159\nKPX Acircumflex uni01F0 -36\nKPX Acircumflex uni01F1 -36\n\nKPX Adieresis dollar 57\nKPX Adieresis ampersand -36\nKPX Adieresis asterisk -36\nKPX Adieresis two -36\nKPX Adieresis four -36\nKPX Adieresis seven -159\nKPX Adieresis nine -131\nKPX Adieresis colon -112\nKPX Adieresis less -159\nKPX Adieresis F -36\nKPX Adieresis G -36\nKPX Adieresis H -36\nKPX Adieresis I -73\nKPX Adieresis R -36\nKPX Adieresis T -36\nKPX Adieresis W -36\nKPX Adieresis Y -120\nKPX Adieresis Z -83\nKPX Adieresis backslash -139\nKPX Adieresis m -73\nKPX Adieresis copyright -36\nKPX Adieresis ordfeminine -36\nKPX Adieresis guillemotleft -36\nKPX Adieresis logicalnot -36\nKPX Adieresis sfthyphen -36\nKPX Adieresis acute -36\nKPX Adieresis mu -36\nKPX Adieresis paragraph -36\nKPX Adieresis periodcentered -36\nKPX Adieresis cedilla -36\nKPX Adieresis questiondown -139\nKPX Adieresis Aacute -139\nKPX Adieresis Acircumflex 57\nKPX Adieresis Adieresis 57\nKPX Adieresis AE 57\nKPX Adieresis Egrave -36\nKPX Adieresis Ecircumflex -36\nKPX Adieresis Igrave -36\nKPX Adieresis Iacute -36\nKPX Adieresis Icircumflex -36\nKPX Adieresis Ntilde -36\nKPX Adieresis Oacute -36\nKPX Adieresis Otilde -36\nKPX Adieresis multiply -36\nKPX Adieresis Ugrave -36\nKPX Adieresis Ucircumflex -36\nKPX Adieresis Yacute -36\nKPX Adieresis Thorn -36\nKPX Adieresis acircumflex -36\nKPX Adieresis Dcaron -36\nKPX Adieresis dcaron -36\nKPX Adieresis Dcroat -36\nKPX Adieresis dmacron -36\nKPX Adieresis Emacron -36\nKPX Adieresis emacron -36\nKPX Adieresis Hcircumflex -159\nKPX Adieresis hcircumflex -36\nKPX Adieresis Hbar -159\nKPX Adieresis hbar -36\nKPX Adieresis Kcommaaccent -112\nKPX Adieresis kcommaaccent -83\nKPX Adieresis kgreenlandic -159\nKPX Adieresis Lacute -139\nKPX Adieresis lacute -159\nKPX Adieresis uni01F0 -36\nKPX Adieresis uni01F1 -36\n\nKPX AE dollar 57\nKPX AE ampersand -36\nKPX AE asterisk -36\nKPX AE two -36\nKPX AE four -36\nKPX AE seven -159\nKPX AE nine -131\nKPX AE colon -112\nKPX AE less -159\nKPX AE F -36\nKPX AE G -36\nKPX AE H -36\nKPX AE I -73\nKPX AE R -36\nKPX AE T -36\nKPX AE W -36\nKPX AE Y -120\nKPX AE Z -83\nKPX AE m -73\nKPX AE copyright -36\nKPX AE ordfeminine -36\nKPX AE guillemotleft -36\nKPX AE logicalnot -36\nKPX AE sfthyphen -36\nKPX AE acute -36\nKPX AE mu -36\nKPX AE paragraph -36\nKPX AE periodcentered -36\nKPX AE cedilla -36\nKPX AE Acircumflex 57\nKPX AE Adieresis 57\nKPX AE AE 57\nKPX AE Egrave -36\nKPX AE Ecircumflex -36\nKPX AE Igrave -36\nKPX AE Iacute -36\nKPX AE Icircumflex -36\nKPX AE Ntilde -36\nKPX AE Oacute -36\nKPX AE Otilde -36\nKPX AE multiply -36\nKPX AE Ugrave -36\nKPX AE Ucircumflex -36\nKPX AE Yacute -36\nKPX AE Thorn -36\nKPX AE acircumflex -36\nKPX AE Dcaron -36\nKPX AE dcaron -36\nKPX AE Dcroat -36\nKPX AE dmacron -36\nKPX AE emacron -36\nKPX AE Hcircumflex -159\nKPX AE hcircumflex -36\nKPX AE Hbar -159\nKPX AE hbar -36\nKPX AE Kcommaaccent -112\nKPX AE kcommaaccent -83\nKPX AE kgreenlandic -159\nKPX AE lacute -159\nKPX AE uni01F0 -36\nKPX AE uni01F1 -36\n\nKPX Egrave less -36\nKPX Egrave m -36\nKPX Egrave braceright -36\nKPX Egrave lacute -36\n\nKPX Icircumflex less -36\nKPX Icircumflex m -36\nKPX Icircumflex braceright -36\nKPX Icircumflex lacute -36\n\nKPX Eth dollar -36\nKPX Eth nine -36\nKPX Eth less -112\nKPX Eth m -36\nKPX Eth braceright -36\nKPX Eth Acircumflex -36\nKPX Eth Adieresis -36\nKPX Eth AE -36\nKPX Eth kgreenlandic -112\nKPX Eth lacute -112\nKPX Eth uni01F4 -112\n\nKPX Ograve dollar -36\nKPX Ograve nine -36\nKPX Ograve less -112\nKPX Ograve m -36\nKPX Ograve braceright -36\nKPX Ograve lacute -112\n\nKPX Yacute bracketleft -36\n\nKPX agrave seven -73\nKPX agrave less -102\nKPX agrave m -36\nKPX agrave braceright -36\nKPX agrave Hbar -73\nKPX agrave lacute -102\n\nKPX ucircumflex dollar 47\nKPX ucircumflex two -73\nKPX ucircumflex seven -282\nKPX ucircumflex eight -102\nKPX ucircumflex nine -225\nKPX ucircumflex colon -188\nKPX ucircumflex less -272\nKPX ucircumflex H -36\nKPX ucircumflex R -36\nKPX ucircumflex X -36\nKPX ucircumflex backslash -188\nKPX ucircumflex ordfeminine -36\nKPX ucircumflex guillemotleft -36\nKPX ucircumflex logicalnot -36\nKPX ucircumflex sfthyphen -36\nKPX ucircumflex acute -36\nKPX ucircumflex mu -36\nKPX ucircumflex paragraph -36\nKPX ucircumflex periodcentered -36\nKPX ucircumflex cedilla -36\nKPX ucircumflex guillemotright -36\nKPX ucircumflex onequarter -36\nKPX ucircumflex onehalf -36\nKPX ucircumflex threequarters -36\nKPX ucircumflex questiondown -188\nKPX ucircumflex Aacute -188\nKPX ucircumflex Yacute -36\nKPX ucircumflex Hbar -282\nKPX ucircumflex Idot -102\nKPX ucircumflex dotlessi -36\nKPX ucircumflex lacute -272\n\nKPX ydieresis dollar 47\nKPX ydieresis two -73\nKPX ydieresis seven -282\nKPX ydieresis eight -102\nKPX ydieresis nine -225\nKPX ydieresis colon -188\nKPX ydieresis less -272\nKPX ydieresis H -36\nKPX ydieresis R -36\nKPX ydieresis X -36\nKPX ydieresis backslash -188\nKPX ydieresis ordfeminine -36\nKPX ydieresis guillemotleft -36\nKPX ydieresis logicalnot -36\nKPX ydieresis sfthyphen -36\nKPX ydieresis acute -36\nKPX ydieresis mu -36\nKPX ydieresis paragraph -36\nKPX ydieresis periodcentered -36\nKPX ydieresis cedilla -36\nKPX ydieresis guillemotright -36\nKPX ydieresis onequarter -36\nKPX ydieresis onehalf -36\nKPX ydieresis threequarters -36\nKPX ydieresis questiondown -188\nKPX ydieresis Aacute -188\nKPX ydieresis Yacute -36\nKPX ydieresis Hbar -282\nKPX ydieresis Idot -102\nKPX ydieresis dotlessi -36\nKPX ydieresis lacute -272\n\nKPX Abreve O -193\n\n\nKPX Edotaccent dollar -83\nKPX Edotaccent ampersand -102\nKPX Edotaccent seven -149\nKPX Edotaccent nine -112\nKPX Edotaccent colon -83\nKPX Edotaccent less -131\nKPX Edotaccent D -45\nKPX Edotaccent H -92\nKPX Edotaccent R -92\nKPX Edotaccent X -92\nKPX Edotaccent backslash -112\nKPX Edotaccent m -112\nKPX Edotaccent braceright -36\nKPX Edotaccent cent -45\nKPX Edotaccent sterling -45\nKPX Edotaccent currency -45\nKPX Edotaccent yen -45\nKPX Edotaccent brokenbar -45\nKPX Edotaccent section -45\nKPX Edotaccent ordfeminine -92\nKPX Edotaccent guillemotleft -92\nKPX Edotaccent logicalnot -92\nKPX Edotaccent sfthyphen -92\nKPX Edotaccent acute -92\nKPX Edotaccent mu -92\nKPX Edotaccent paragraph -92\nKPX Edotaccent periodcentered -92\nKPX Edotaccent cedilla -92\nKPX Edotaccent guillemotright -92\nKPX Edotaccent onequarter -92\nKPX Edotaccent onehalf -92\nKPX Edotaccent threequarters -92\nKPX Edotaccent questiondown -112\nKPX Edotaccent Aacute -112\nKPX Edotaccent Egrave -102\nKPX Edotaccent Icircumflex -102\nKPX Edotaccent Yacute -92\nKPX Edotaccent Hbar -149\nKPX Edotaccent dotlessi -92\nKPX Edotaccent lacute -131\n\nKPX edotaccent F -45\nKPX edotaccent G -36\nKPX edotaccent H -45\nKPX edotaccent J -36\nKPX edotaccent K -36\nKPX edotaccent P -36\nKPX edotaccent Q -36\nKPX edotaccent R -45\nKPX edotaccent T -36\nKPX edotaccent U -36\nKPX edotaccent bracketleft -55\nKPX edotaccent m -73\nKPX edotaccent copyright -45\nKPX edotaccent ordfeminine -45\nKPX edotaccent guillemotleft -45\nKPX edotaccent logicalnot -45\nKPX edotaccent sfthyphen -45\nKPX edotaccent threesuperior -36\nKPX edotaccent acute -45\nKPX edotaccent mu -45\nKPX edotaccent paragraph -45\nKPX edotaccent periodcentered -45\nKPX edotaccent cedilla -45\nKPX edotaccent Eacute -45\nKPX edotaccent Idieresis -45\nKPX edotaccent Ntilde 72\nKPX edotaccent Yacute -45\nKPX edotaccent aacute -36\nKPX edotaccent Cdotaccent -36\nKPX edotaccent edotaccent -36\nKPX edotaccent ecaron -36\n\nKPX Ecaron dollar -83\nKPX Ecaron ampersand -102\nKPX Ecaron seven -149\nKPX Ecaron nine -112\nKPX Ecaron colon -83\nKPX Ecaron less -131\nKPX Ecaron D -45\nKPX Ecaron H -92\nKPX Ecaron R -92\nKPX Ecaron X -92\nKPX Ecaron backslash -112\nKPX Ecaron m -112\nKPX Ecaron braceright -36\nKPX Ecaron cent -45\nKPX Ecaron sterling -45\nKPX Ecaron currency -45\nKPX Ecaron yen -45\nKPX Ecaron brokenbar -45\nKPX Ecaron section -45\nKPX Ecaron ordfeminine -92\nKPX Ecaron guillemotleft -92\nKPX Ecaron logicalnot -92\nKPX Ecaron sfthyphen -92\nKPX Ecaron acute -92\nKPX Ecaron mu -92\nKPX Ecaron paragraph -92\nKPX Ecaron periodcentered -92\nKPX Ecaron cedilla -92\nKPX Ecaron guillemotright -92\nKPX Ecaron onequarter -92\nKPX Ecaron onehalf -92\nKPX Ecaron threequarters -92\nKPX Ecaron questiondown -112\nKPX Ecaron Aacute -112\nKPX Ecaron Egrave -102\nKPX Ecaron Icircumflex -102\nKPX Ecaron Yacute -92\nKPX Ecaron Hbar -149\nKPX Ecaron dotlessi -92\nKPX Ecaron lacute -131\n\nKPX ecaron F -45\nKPX ecaron G -36\nKPX ecaron H -45\nKPX ecaron J -36\nKPX ecaron K -36\nKPX ecaron P -36\nKPX ecaron Q -36\nKPX ecaron R -45\nKPX ecaron T -36\nKPX ecaron U -36\nKPX ecaron bracketleft -55\nKPX ecaron m -73\nKPX ecaron copyright -45\nKPX ecaron ordfeminine -45\nKPX ecaron guillemotleft -45\nKPX ecaron logicalnot -45\nKPX ecaron sfthyphen -45\nKPX ecaron threesuperior -36\nKPX ecaron acute -45\nKPX ecaron mu -45\nKPX ecaron paragraph -45\nKPX ecaron periodcentered -45\nKPX ecaron cedilla -45\nKPX ecaron Eacute -45\nKPX ecaron Idieresis -45\nKPX ecaron Ntilde -36\nKPX ecaron Yacute -45\nKPX ecaron aacute -36\nKPX ecaron Cdotaccent -36\nKPX ecaron edotaccent -36\nKPX ecaron ecaron -36\n\nKPX Gdotaccent dollar 38\n\nKPX Gcommaaccent dollar 38\n\nKPX Hbar dollar -159\nKPX Hbar ampersand -120\nKPX Hbar seven -36\nKPX Hbar D -339\nKPX Hbar F -348\nKPX Hbar H -348\nKPX Hbar L -63\nKPX Hbar R -348\nKPX Hbar U -301\nKPX Hbar V -339\nKPX Hbar X -311\nKPX Hbar Z -339\nKPX Hbar backslash -319\nKPX Hbar m -188\nKPX Hbar braceright -112\nKPX Hbar cent -339\nKPX Hbar sterling -339\nKPX Hbar currency -339\nKPX Hbar yen -339\nKPX Hbar brokenbar -339\nKPX Hbar section -339\nKPX Hbar copyright -348\nKPX Hbar ordfeminine -348\nKPX Hbar guillemotleft -348\nKPX Hbar logicalnot -348\nKPX Hbar sfthyphen -348\nKPX Hbar acute -348\nKPX Hbar mu -348\nKPX Hbar paragraph -348\nKPX Hbar periodcentered -348\nKPX Hbar cedilla -348\nKPX Hbar guillemotright -311\nKPX Hbar onequarter -311\nKPX Hbar onehalf -311\nKPX Hbar threequarters -311\nKPX Hbar questiondown -319\nKPX Hbar Aacute -319\nKPX Hbar Egrave -120\nKPX Hbar Eacute -348\nKPX Hbar Icircumflex -120\nKPX Hbar Idieresis -348\nKPX Hbar Yacute -348\nKPX Hbar edotaccent -301\nKPX Hbar ecaron -301\nKPX Hbar gdotaccent -339\nKPX Hbar gcommaaccent -339\nKPX Hbar Hbar -36\nKPX Hbar dotlessi -311\n\nKPX Idot equal -36\nKPX Idot Ldot -36\n\nKPX lacute dollar -159\nKPX lacute ampersand -112\nKPX lacute two -112\nKPX lacute D -282\nKPX lacute H -272\nKPX lacute L -73\nKPX lacute R -272\nKPX lacute X -235\nKPX lacute m -225\nKPX lacute braceright -149\nKPX lacute cent -282\nKPX lacute sterling -282\nKPX lacute currency -282\nKPX lacute yen -282\nKPX lacute brokenbar -282\nKPX lacute section -282\nKPX lacute ordfeminine -272\nKPX lacute guillemotleft -272\nKPX lacute logicalnot -272\nKPX lacute sfthyphen -272\nKPX lacute acute -272\nKPX lacute mu -272\nKPX lacute paragraph -272\nKPX lacute periodcentered -272\nKPX lacute cedilla -272\nKPX lacute guillemotright -235\nKPX lacute onequarter -235\nKPX lacute onehalf -235\nKPX lacute threequarters -235\nKPX lacute Egrave -112\nKPX lacute Icircumflex -112\nKPX lacute Yacute -272\nKPX lacute dotlessi -235\n\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dejavu_sans_normal_da52e5b8c125dc4342e1d9c6baf20f36.ufm.php",
    "content": "<?php return array (\n  'codeToName' => \n  array (\n    32 => 'space',\n    33 => 'exclam',\n    34 => 'quotedbl',\n    35 => 'numbersign',\n    36 => 'dollar',\n    37 => 'percent',\n    38 => 'ampersand',\n    39 => 'quotesingle',\n    40 => 'parenleft',\n    41 => 'parenright',\n    42 => 'asterisk',\n    43 => 'plus',\n    44 => 'comma',\n    45 => 'hyphen',\n    46 => 'period',\n    47 => 'slash',\n    48 => 'zero',\n    49 => 'one',\n    50 => 'two',\n    51 => 'three',\n    52 => 'four',\n    53 => 'five',\n    54 => 'six',\n    55 => 'seven',\n    56 => 'eight',\n    57 => 'nine',\n    58 => 'colon',\n    59 => 'semicolon',\n    60 => 'less',\n    61 => 'equal',\n    62 => 'greater',\n    63 => 'question',\n    64 => 'at',\n    65 => 'A',\n    66 => 'B',\n    67 => 'C',\n    68 => 'D',\n    69 => 'E',\n    70 => 'F',\n    71 => 'G',\n    72 => 'H',\n    73 => 'I',\n    74 => 'J',\n    75 => 'K',\n    76 => 'L',\n    77 => 'M',\n    78 => 'N',\n    79 => 'O',\n    80 => 'P',\n    81 => 'Q',\n    82 => 'R',\n    83 => 'S',\n    84 => 'T',\n    85 => 'U',\n    86 => 'V',\n    87 => 'W',\n    88 => 'X',\n    89 => 'Y',\n    90 => 'Z',\n    91 => 'bracketleft',\n    92 => 'backslash',\n    93 => 'bracketright',\n    94 => 'asciicircum',\n    95 => 'underscore',\n    96 => 'grave',\n    97 => 'a',\n    98 => 'b',\n    99 => 'c',\n    100 => 'd',\n    101 => 'e',\n    102 => 'f',\n    103 => 'g',\n    104 => 'h',\n    105 => 'i',\n    106 => 'j',\n    107 => 'k',\n    108 => 'l',\n    109 => 'm',\n    110 => 'n',\n    111 => 'o',\n    112 => 'p',\n    113 => 'q',\n    114 => 'r',\n    115 => 's',\n    116 => 't',\n    117 => 'u',\n    118 => 'v',\n    119 => 'w',\n    120 => 'x',\n    121 => 'y',\n    122 => 'z',\n    123 => 'braceleft',\n    124 => 'bar',\n    125 => 'braceright',\n    126 => 'asciitilde',\n    160 => 'nbspace',\n    161 => 'exclamdown',\n    162 => 'cent',\n    163 => 'sterling',\n    164 => 'currency',\n    165 => 'yen',\n    166 => 'brokenbar',\n    167 => 'section',\n    168 => 'dieresis',\n    169 => 'copyright',\n    170 => 'ordfeminine',\n    171 => 'guillemotleft',\n    172 => 'logicalnot',\n    173 => 'sfthyphen',\n    174 => 'registered',\n    175 => 'macron',\n    176 => 'degree',\n    177 => 'plusminus',\n    178 => 'twosuperior',\n    179 => 'threesuperior',\n    180 => 'acute',\n    181 => 'mu',\n    182 => 'paragraph',\n    183 => 'periodcentered',\n    184 => 'cedilla',\n    185 => 'onesuperior',\n    186 => 'ordmasculine',\n    187 => 'guillemotright',\n    188 => 'onequarter',\n    189 => 'onehalf',\n    190 => 'threequarters',\n    191 => 'questiondown',\n    192 => 'Agrave',\n    193 => 'Aacute',\n    194 => 'Acircumflex',\n    195 => 'Atilde',\n    196 => 'Adieresis',\n    197 => 'Aring',\n    198 => 'AE',\n    199 => 'Ccedilla',\n    200 => 'Egrave',\n    201 => 'Eacute',\n    202 => 'Ecircumflex',\n    203 => 'Edieresis',\n    204 => 'Igrave',\n    205 => 'Iacute',\n    206 => 'Icircumflex',\n    207 => 'Idieresis',\n    208 => 'Eth',\n    209 => 'Ntilde',\n    210 => 'Ograve',\n    211 => 'Oacute',\n    212 => 'Ocircumflex',\n    213 => 'Otilde',\n    214 => 'Odieresis',\n    215 => 'multiply',\n    216 => 'Oslash',\n    217 => 'Ugrave',\n    218 => 'Uacute',\n    219 => 'Ucircumflex',\n    220 => 'Udieresis',\n    221 => 'Yacute',\n    222 => 'Thorn',\n    223 => 'germandbls',\n    224 => 'agrave',\n    225 => 'aacute',\n    226 => 'acircumflex',\n    227 => 'atilde',\n    228 => 'adieresis',\n    229 => 'aring',\n    230 => 'ae',\n    231 => 'ccedilla',\n    232 => 'egrave',\n    233 => 'eacute',\n    234 => 'ecircumflex',\n    235 => 'edieresis',\n    236 => 'igrave',\n    237 => 'iacute',\n    238 => 'icircumflex',\n    239 => 'idieresis',\n    240 => 'eth',\n    241 => 'ntilde',\n    242 => 'ograve',\n    243 => 'oacute',\n    244 => 'ocircumflex',\n    245 => 'otilde',\n    246 => 'odieresis',\n    247 => 'divide',\n    248 => 'oslash',\n    249 => 'ugrave',\n    250 => 'uacute',\n    251 => 'ucircumflex',\n    252 => 'udieresis',\n    253 => 'yacute',\n    254 => 'thorn',\n    255 => 'ydieresis',\n    256 => 'Amacron',\n    257 => 'amacron',\n    258 => 'Abreve',\n    259 => 'abreve',\n    260 => 'Aogonek',\n    261 => 'aogonek',\n    262 => 'Cacute',\n    263 => 'cacute',\n    264 => 'Ccircumflex',\n    265 => 'ccircumflex',\n    266 => 'Cdotaccent',\n    267 => 'cdotaccent',\n    268 => 'Ccaron',\n    269 => 'ccaron',\n    270 => 'Dcaron',\n    271 => 'dcaron',\n    272 => 'Dcroat',\n    273 => 'dmacron',\n    274 => 'Emacron',\n    275 => 'emacron',\n    276 => 'Ebreve',\n    277 => 'ebreve',\n    278 => 'Edotaccent',\n    279 => 'edotaccent',\n    280 => 'Eogonek',\n    281 => 'eogonek',\n    282 => 'Ecaron',\n    283 => 'ecaron',\n    284 => 'Gcircumflex',\n    285 => 'gcircumflex',\n    286 => 'Gbreve',\n    287 => 'gbreve',\n    288 => 'Gdotaccent',\n    289 => 'gdotaccent',\n    290 => 'Gcommaaccent',\n    291 => 'gcommaaccent',\n    292 => 'Hcircumflex',\n    293 => 'hcircumflex',\n    294 => 'Hbar',\n    295 => 'hbar',\n    296 => 'Itilde',\n    297 => 'itilde',\n    298 => 'Imacron',\n    299 => 'imacron',\n    300 => 'Ibreve',\n    301 => 'ibreve',\n    302 => 'Iogonek',\n    303 => 'iogonek',\n    304 => 'Idot',\n    305 => 'dotlessi',\n    306 => 'IJ',\n    307 => 'ij',\n    308 => 'Jcircumflex',\n    309 => 'jcircumflex',\n    310 => 'Kcommaaccent',\n    311 => 'kcommaaccent',\n    312 => 'kgreenlandic',\n    313 => 'Lacute',\n    314 => 'lacute',\n    315 => 'Lcommaaccent',\n    316 => 'lcommaaccent',\n    317 => 'Lcaron',\n    318 => 'lcaron',\n    319 => 'Ldot',\n    320 => 'ldot',\n    321 => 'Lslash',\n    322 => 'lslash',\n    323 => 'Nacute',\n    324 => 'nacute',\n    325 => 'Ncommaaccent',\n    326 => 'ncommaaccent',\n    327 => 'Ncaron',\n    328 => 'ncaron',\n    329 => 'napostrophe',\n    330 => 'Eng',\n    331 => 'eng',\n    332 => 'Omacron',\n    333 => 'omacron',\n    334 => 'Obreve',\n    335 => 'obreve',\n    336 => 'Ohungarumlaut',\n    337 => 'ohungarumlaut',\n    338 => 'OE',\n    339 => 'oe',\n    340 => 'Racute',\n    341 => 'racute',\n    342 => 'Rcommaaccent',\n    343 => 'rcommaaccent',\n    344 => 'Rcaron',\n    345 => 'rcaron',\n    346 => 'Sacute',\n    347 => 'sacute',\n    348 => 'Scircumflex',\n    349 => 'scircumflex',\n    350 => 'Scedilla',\n    351 => 'scedilla',\n    352 => 'Scaron',\n    353 => 'scaron',\n    354 => 'Tcommaaccent',\n    355 => 'tcommaaccent',\n    356 => 'Tcaron',\n    357 => 'tcaron',\n    358 => 'Tbar',\n    359 => 'tbar',\n    360 => 'Utilde',\n    361 => 'utilde',\n    362 => 'Umacron',\n    363 => 'umacron',\n    364 => 'Ubreve',\n    365 => 'ubreve',\n    366 => 'Uring',\n    367 => 'uring',\n    368 => 'Uhungarumlaut',\n    369 => 'uhungarumlaut',\n    370 => 'Uogonek',\n    371 => 'uogonek',\n    372 => 'Wcircumflex',\n    373 => 'wcircumflex',\n    374 => 'Ycircumflex',\n    375 => 'ycircumflex',\n    376 => 'Ydieresis',\n    377 => 'Zacute',\n    378 => 'zacute',\n    379 => 'Zdotaccent',\n    380 => 'zdotaccent',\n    381 => 'Zcaron',\n    382 => 'zcaron',\n    383 => 'longs',\n    384 => 'uni0180',\n    385 => 'uni0181',\n    386 => 'uni0182',\n    387 => 'uni0183',\n    388 => 'uni0184',\n    389 => 'uni0185',\n    390 => 'uni0186',\n    391 => 'uni0187',\n    392 => 'uni0188',\n    393 => 'uni0189',\n    394 => 'uni018A',\n    395 => 'uni018B',\n    396 => 'uni018C',\n    397 => 'uni018D',\n    398 => 'uni018E',\n    399 => 'uni018F',\n    400 => 'uni0190',\n    401 => 'uni0191',\n    402 => 'florin',\n    403 => 'uni0193',\n    404 => 'uni0194',\n    405 => 'uni0195',\n    406 => 'uni0196',\n    407 => 'uni0197',\n    408 => 'uni0198',\n    409 => 'uni0199',\n    410 => 'uni019A',\n    411 => 'uni019B',\n    412 => 'uni019C',\n    413 => 'uni019D',\n    414 => 'uni019E',\n    415 => 'uni019F',\n    416 => 'Ohorn',\n    417 => 'ohorn',\n    418 => 'uni01A2',\n    419 => 'uni01A3',\n    420 => 'uni01A4',\n    421 => 'uni01A5',\n    422 => 'uni01A6',\n    423 => 'uni01A7',\n    424 => 'uni01A8',\n    425 => 'uni01A9',\n    426 => 'uni01AA',\n    427 => 'uni01AB',\n    428 => 'uni01AC',\n    429 => 'uni01AD',\n    430 => 'uni01AE',\n    431 => 'Uhorn',\n    432 => 'uhorn',\n    433 => 'uni01B1',\n    434 => 'uni01B2',\n    435 => 'uni01B3',\n    436 => 'uni01B4',\n    437 => 'uni01B5',\n    438 => 'uni01B6',\n    439 => 'uni01B7',\n    440 => 'uni01B8',\n    441 => 'uni01B9',\n    442 => 'uni01BA',\n    443 => 'uni01BB',\n    444 => 'uni01BC',\n    445 => 'uni01BD',\n    446 => 'uni01BE',\n    447 => 'uni01BF',\n    448 => 'uni01C0',\n    449 => 'uni01C1',\n    450 => 'uni01C2',\n    451 => 'uni01C3',\n    452 => 'uni01C4',\n    453 => 'uni01C5',\n    454 => 'uni01C6',\n    455 => 'uni01C7',\n    456 => 'uni01C8',\n    457 => 'uni01C9',\n    458 => 'uni01CA',\n    459 => 'uni01CB',\n    460 => 'uni01CC',\n    461 => 'uni01CD',\n    462 => 'uni01CE',\n    463 => 'uni01CF',\n    464 => 'uni01D0',\n    465 => 'uni01D1',\n    466 => 'uni01D2',\n    467 => 'uni01D3',\n    468 => 'uni01D4',\n    469 => 'uni01D5',\n    470 => 'uni01D6',\n    471 => 'uni01D7',\n    472 => 'uni01D8',\n    473 => 'uni01D9',\n    474 => 'uni01DA',\n    475 => 'uni01DB',\n    476 => 'uni01DC',\n    477 => 'uni01DD',\n    478 => 'uni01DE',\n    479 => 'uni01DF',\n    480 => 'uni01E0',\n    481 => 'uni01E1',\n    482 => 'uni01E2',\n    483 => 'uni01E3',\n    484 => 'uni01E4',\n    485 => 'uni01E5',\n    486 => 'Gcaron',\n    487 => 'gcaron',\n    488 => 'uni01E8',\n    489 => 'uni01E9',\n    490 => 'uni01EA',\n    491 => 'uni01EB',\n    492 => 'uni01EC',\n    493 => 'uni01ED',\n    494 => 'uni01EE',\n    495 => 'uni01EF',\n    496 => 'uni01F0',\n    497 => 'uni01F1',\n    498 => 'uni01F2',\n    499 => 'uni01F3',\n    500 => 'uni01F4',\n    501 => 'uni01F5',\n    502 => 'uni01F6',\n    503 => 'uni01F7',\n    504 => 'uni01F8',\n    505 => 'uni01F9',\n    506 => 'Aringacute',\n    507 => 'aringacute',\n    508 => 'AEacute',\n    509 => 'aeacute',\n    510 => 'Oslashacute',\n    511 => 'oslashacute',\n    512 => 'uni0200',\n    513 => 'uni0201',\n    514 => 'uni0202',\n    515 => 'uni0203',\n    516 => 'uni0204',\n    517 => 'uni0205',\n    518 => 'uni0206',\n    519 => 'uni0207',\n    520 => 'uni0208',\n    521 => 'uni0209',\n    522 => 'uni020A',\n    523 => 'uni020B',\n    524 => 'uni020C',\n    525 => 'uni020D',\n    526 => 'uni020E',\n    527 => 'uni020F',\n    528 => 'uni0210',\n    529 => 'uni0211',\n    530 => 'uni0212',\n    531 => 'uni0213',\n    532 => 'uni0214',\n    533 => 'uni0215',\n    534 => 'uni0216',\n    535 => 'uni0217',\n    536 => 'Scommaaccent',\n    537 => 'scommaaccent',\n    538 => 'uni021A',\n    539 => 'uni021B',\n    540 => 'uni021C',\n    541 => 'uni021D',\n    542 => 'uni021E',\n    543 => 'uni021F',\n    544 => 'uni0220',\n    545 => 'uni0221',\n    546 => 'uni0222',\n    547 => 'uni0223',\n    548 => 'uni0224',\n    549 => 'uni0225',\n    550 => 'uni0226',\n    551 => 'uni0227',\n    552 => 'uni0228',\n    553 => 'uni0229',\n    554 => 'uni022A',\n    555 => 'uni022B',\n    556 => 'uni022C',\n    557 => 'uni022D',\n    558 => 'uni022E',\n    559 => 'uni022F',\n    560 => 'uni0230',\n    561 => 'uni0231',\n    562 => 'uni0232',\n    563 => 'uni0233',\n    564 => 'uni0234',\n    565 => 'uni0235',\n    566 => 'uni0236',\n    567 => 'dotlessj',\n    568 => 'uni0238',\n    569 => 'uni0239',\n    570 => 'uni023A',\n    571 => 'uni023B',\n    572 => 'uni023C',\n    573 => 'uni023D',\n    574 => 'uni023E',\n    575 => 'uni023F',\n    576 => 'uni0240',\n    577 => 'uni0241',\n    578 => 'uni0242',\n    579 => 'uni0243',\n    580 => 'uni0244',\n    581 => 'uni0245',\n    582 => 'uni0246',\n    583 => 'uni0247',\n    584 => 'uni0248',\n    585 => 'uni0249',\n    586 => 'uni024A',\n    587 => 'uni024B',\n    588 => 'uni024C',\n    589 => 'uni024D',\n    590 => 'uni024E',\n    591 => 'uni024F',\n    592 => 'uni0250',\n    593 => 'uni0251',\n    594 => 'uni0252',\n    595 => 'uni0253',\n    596 => 'uni0254',\n    597 => 'uni0255',\n    598 => 'uni0256',\n    599 => 'uni0257',\n    600 => 'uni0258',\n    601 => 'uni0259',\n    602 => 'uni025A',\n    603 => 'uni025B',\n    604 => 'uni025C',\n    605 => 'uni025D',\n    606 => 'uni025E',\n    607 => 'uni025F',\n    608 => 'uni0260',\n    609 => 'uni0261',\n    610 => 'uni0262',\n    611 => 'uni0263',\n    612 => 'uni0264',\n    613 => 'uni0265',\n    614 => 'uni0266',\n    615 => 'uni0267',\n    616 => 'uni0268',\n    617 => 'uni0269',\n    618 => 'uni026A',\n    619 => 'uni026B',\n    620 => 'uni026C',\n    621 => 'uni026D',\n    622 => 'uni026E',\n    623 => 'uni026F',\n    624 => 'uni0270',\n    625 => 'uni0271',\n    626 => 'uni0272',\n    627 => 'uni0273',\n    628 => 'uni0274',\n    629 => 'uni0275',\n    630 => 'uni0276',\n    631 => 'uni0277',\n    632 => 'uni0278',\n    633 => 'uni0279',\n    634 => 'uni027A',\n    635 => 'uni027B',\n    636 => 'uni027C',\n    637 => 'uni027D',\n    638 => 'uni027E',\n    639 => 'uni027F',\n    640 => 'uni0280',\n    641 => 'uni0281',\n    642 => 'uni0282',\n    643 => 'uni0283',\n    644 => 'uni0284',\n    645 => 'uni0285',\n    646 => 'uni0286',\n    647 => 'uni0287',\n    648 => 'uni0288',\n    649 => 'uni0289',\n    650 => 'uni028A',\n    651 => 'uni028B',\n    652 => 'uni028C',\n    653 => 'uni028D',\n    654 => 'uni028E',\n    655 => 'uni028F',\n    656 => 'uni0290',\n    657 => 'uni0291',\n    658 => 'uni0292',\n    659 => 'uni0293',\n    660 => 'uni0294',\n    661 => 'uni0295',\n    662 => 'uni0296',\n    663 => 'uni0297',\n    664 => 'uni0298',\n    665 => 'uni0299',\n    666 => 'uni029A',\n    667 => 'uni029B',\n    668 => 'uni029C',\n    669 => 'uni029D',\n    670 => 'uni029E',\n    671 => 'uni029F',\n    672 => 'uni02A0',\n    673 => 'uni02A1',\n    674 => 'uni02A2',\n    675 => 'uni02A3',\n    676 => 'uni02A4',\n    677 => 'uni02A5',\n    678 => 'uni02A6',\n    679 => 'uni02A7',\n    680 => 'uni02A8',\n    681 => 'uni02A9',\n    682 => 'uni02AA',\n    683 => 'uni02AB',\n    684 => 'uni02AC',\n    685 => 'uni02AD',\n    686 => 'uni02AE',\n    687 => 'uni02AF',\n    688 => 'uni02B0',\n    689 => 'uni02B1',\n    690 => 'uni02B2',\n    691 => 'uni02B3',\n    692 => 'uni02B4',\n    693 => 'uni02B5',\n    694 => 'uni02B6',\n    695 => 'uni02B7',\n    696 => 'uni02B8',\n    697 => 'uni02B9',\n    698 => 'uni02BA',\n    699 => 'uni02BB',\n    700 => 'uni02BC',\n    701 => 'uni02BD',\n    702 => 'uni02BE',\n    703 => 'uni02BF',\n    704 => 'uni02C0',\n    705 => 'uni02C1',\n    706 => 'uni02C2',\n    707 => 'uni02C3',\n    708 => 'uni02C4',\n    709 => 'uni02C5',\n    710 => 'circumflex',\n    711 => 'caron',\n    712 => 'uni02C8',\n    713 => 'uni02C9',\n    714 => 'uni02CA',\n    715 => 'uni02CB',\n    716 => 'uni02CC',\n    717 => 'uni02CD',\n    718 => 'uni02CE',\n    719 => 'uni02CF',\n    720 => 'uni02D0',\n    721 => 'uni02D1',\n    722 => 'uni02D2',\n    723 => 'uni02D3',\n    724 => 'uni02D4',\n    725 => 'uni02D5',\n    726 => 'uni02D6',\n    727 => 'uni02D7',\n    728 => 'breve',\n    729 => 'dotaccent',\n    730 => 'ring',\n    731 => 'ogonek',\n    732 => 'tilde',\n    733 => 'hungarumlaut',\n    734 => 'uni02DE',\n    735 => 'uni02DF',\n    736 => 'uni02E0',\n    737 => 'uni02E1',\n    738 => 'uni02E2',\n    739 => 'uni02E3',\n    740 => 'uni02E4',\n    741 => 'uni02E5',\n    742 => 'uni02E6',\n    743 => 'uni02E7',\n    744 => 'uni02E8',\n    745 => 'uni02E9',\n    748 => 'uni02EC',\n    749 => 'uni02ED',\n    750 => 'uni02EE',\n    755 => 'uni02F3',\n    759 => 'uni02F7',\n    768 => 'gravecomb',\n    769 => 'acutecomb',\n    770 => 'uni0302',\n    771 => 'tildecomb',\n    772 => 'uni0304',\n    773 => 'uni0305',\n    774 => 'uni0306',\n    775 => 'uni0307',\n    776 => 'uni0308',\n    777 => 'hookabovecomb',\n    778 => 'uni030A',\n    779 => 'uni030B',\n    780 => 'uni030C',\n    781 => 'uni030D',\n    782 => 'uni030E',\n    783 => 'uni030F',\n    784 => 'uni0310',\n    785 => 'uni0311',\n    786 => 'uni0312',\n    787 => 'uni0313',\n    788 => 'uni0314',\n    789 => 'uni0315',\n    790 => 'uni0316',\n    791 => 'uni0317',\n    792 => 'uni0318',\n    793 => 'uni0319',\n    794 => 'uni031A',\n    795 => 'uni031B',\n    796 => 'uni031C',\n    797 => 'uni031D',\n    798 => 'uni031E',\n    799 => 'uni031F',\n    800 => 'uni0320',\n    801 => 'uni0321',\n    802 => 'uni0322',\n    803 => 'dotbelowcomb',\n    804 => 'uni0324',\n    805 => 'uni0325',\n    806 => 'uni0326',\n    807 => 'uni0327',\n    808 => 'uni0328',\n    809 => 'uni0329',\n    810 => 'uni032A',\n    811 => 'uni032B',\n    812 => 'uni032C',\n    813 => 'uni032D',\n    814 => 'uni032E',\n    815 => 'uni032F',\n    816 => 'uni0330',\n    817 => 'uni0331',\n    818 => 'uni0332',\n    819 => 'uni0333',\n    820 => 'uni0334',\n    821 => 'uni0335',\n    822 => 'uni0336',\n    823 => 'uni0337',\n    824 => 'uni0338',\n    825 => 'uni0339',\n    826 => 'uni033A',\n    827 => 'uni033B',\n    828 => 'uni033C',\n    829 => 'uni033D',\n    830 => 'uni033E',\n    831 => 'uni033F',\n    832 => 'uni0340',\n    833 => 'uni0341',\n    834 => 'uni0342',\n    835 => 'uni0343',\n    836 => 'uni0344',\n    837 => 'uni0345',\n    838 => 'uni0346',\n    839 => 'uni0347',\n    840 => 'uni0348',\n    841 => 'uni0349',\n    842 => 'uni034A',\n    843 => 'uni034B',\n    844 => 'uni034C',\n    845 => 'uni034D',\n    846 => 'uni034E',\n    847 => 'uni034F',\n    849 => 'uni0351',\n    850 => 'uni0352',\n    851 => 'uni0353',\n    855 => 'uni0357',\n    856 => 'uni0358',\n    858 => 'uni035A',\n    860 => 'uni035C',\n    861 => 'uni035D',\n    862 => 'uni035E',\n    863 => 'uni035F',\n    864 => 'uni0360',\n    865 => 'uni0361',\n    866 => 'uni0362',\n    880 => 'uni0370',\n    881 => 'uni0371',\n    882 => 'uni0372',\n    883 => 'uni0373',\n    884 => 'uni0374',\n    885 => 'uni0375',\n    886 => 'uni0376',\n    887 => 'uni0377',\n    890 => 'uni037A',\n    891 => 'uni037B',\n    892 => 'uni037C',\n    893 => 'uni037D',\n    894 => 'uni037E',\n    895 => 'uni037F',\n    900 => 'tonos',\n    901 => 'dieresistonos',\n    902 => 'Alphatonos',\n    903 => 'anoteleia',\n    904 => 'Epsilontonos',\n    905 => 'Etatonos',\n    906 => 'Iotatonos',\n    908 => 'Omicrontonos',\n    910 => 'Upsilontonos',\n    911 => 'Omegatonos',\n    912 => 'iotadieresistonos',\n    913 => 'Alpha',\n    914 => 'Beta',\n    915 => 'Gamma',\n    916 => 'uni0394',\n    917 => 'Epsilon',\n    918 => 'Zeta',\n    919 => 'Eta',\n    920 => 'Theta',\n    921 => 'Iota',\n    922 => 'Kappa',\n    923 => 'Lambda',\n    924 => 'Mu',\n    925 => 'Nu',\n    926 => 'Xi',\n    927 => 'Omicron',\n    928 => 'Pi',\n    929 => 'Rho',\n    931 => 'Sigma',\n    932 => 'Tau',\n    933 => 'Upsilon',\n    934 => 'Phi',\n    935 => 'Chi',\n    936 => 'Psi',\n    937 => 'Omega',\n    938 => 'Iotadieresis',\n    939 => 'Upsilondieresis',\n    940 => 'alphatonos',\n    941 => 'epsilontonos',\n    942 => 'etatonos',\n    943 => 'iotatonos',\n    944 => 'upsilondieresistonos',\n    945 => 'alpha',\n    946 => 'beta',\n    947 => 'gamma',\n    948 => 'delta',\n    949 => 'epsilon',\n    950 => 'zeta',\n    951 => 'eta',\n    952 => 'theta',\n    953 => 'iota',\n    954 => 'kappa',\n    955 => 'lambda',\n    956 => 'uni03BC',\n    957 => 'nu',\n    958 => 'xi',\n    959 => 'omicron',\n    960 => 'pi',\n    961 => 'rho',\n    962 => 'sigma1',\n    963 => 'sigma',\n    964 => 'tau',\n    965 => 'upsilon',\n    966 => 'phi',\n    967 => 'chi',\n    968 => 'psi',\n    969 => 'omega',\n    970 => 'iotadieresis',\n    971 => 'upsilondieresis',\n    972 => 'omicrontonos',\n    973 => 'upsilontonos',\n    974 => 'omegatonos',\n    975 => 'uni03CF',\n    976 => 'uni03D0',\n    977 => 'theta1',\n    978 => 'Upsilon1',\n    979 => 'uni03D3',\n    980 => 'uni03D4',\n    981 => 'phi1',\n    982 => 'omega1',\n    983 => 'uni03D7',\n    984 => 'uni03D8',\n    985 => 'uni03D9',\n    986 => 'uni03DA',\n    987 => 'uni03DB',\n    988 => 'uni03DC',\n    989 => 'uni03DD',\n    990 => 'uni03DE',\n    991 => 'uni03DF',\n    992 => 'uni03E0',\n    993 => 'uni03E1',\n    994 => 'uni03E2',\n    995 => 'uni03E3',\n    996 => 'uni03E4',\n    997 => 'uni03E5',\n    998 => 'uni03E6',\n    999 => 'uni03E7',\n    1000 => 'uni03E8',\n    1001 => 'uni03E9',\n    1002 => 'uni03EA',\n    1003 => 'uni03EB',\n    1004 => 'uni03EC',\n    1005 => 'uni03ED',\n    1006 => 'uni03EE',\n    1007 => 'uni03EF',\n    1008 => 'uni03F0',\n    1009 => 'uni03F1',\n    1010 => 'uni03F2',\n    1011 => 'uni03F3',\n    1012 => 'uni03F4',\n    1013 => 'uni03F5',\n    1014 => 'uni03F6',\n    1015 => 'uni03F7',\n    1016 => 'uni03F8',\n    1017 => 'uni03F9',\n    1018 => 'uni03FA',\n    1019 => 'uni03FB',\n    1020 => 'uni03FC',\n    1021 => 'uni03FD',\n    1022 => 'uni03FE',\n    1023 => 'uni03FF',\n    1024 => 'uni0400',\n    1025 => 'uni0401',\n    1026 => 'uni0402',\n    1027 => 'uni0403',\n    1028 => 'uni0404',\n    1029 => 'uni0405',\n    1030 => 'uni0406',\n    1031 => 'uni0407',\n    1032 => 'uni0408',\n    1033 => 'uni0409',\n    1034 => 'uni040A',\n    1035 => 'uni040B',\n    1036 => 'uni040C',\n    1037 => 'uni040D',\n    1038 => 'uni040E',\n    1039 => 'uni040F',\n    1040 => 'uni0410',\n    1041 => 'uni0411',\n    1042 => 'uni0412',\n    1043 => 'uni0413',\n    1044 => 'uni0414',\n    1045 => 'uni0415',\n    1046 => 'uni0416',\n    1047 => 'uni0417',\n    1048 => 'uni0418',\n    1049 => 'uni0419',\n    1050 => 'uni041A',\n    1051 => 'uni041B',\n    1052 => 'uni041C',\n    1053 => 'uni041D',\n    1054 => 'uni041E',\n    1055 => 'uni041F',\n    1056 => 'uni0420',\n    1057 => 'uni0421',\n    1058 => 'uni0422',\n    1059 => 'uni0423',\n    1060 => 'uni0424',\n    1061 => 'uni0425',\n    1062 => 'uni0426',\n    1063 => 'uni0427',\n    1064 => 'uni0428',\n    1065 => 'uni0429',\n    1066 => 'uni042A',\n    1067 => 'uni042B',\n    1068 => 'uni042C',\n    1069 => 'uni042D',\n    1070 => 'uni042E',\n    1071 => 'uni042F',\n    1072 => 'uni0430',\n    1073 => 'uni0431',\n    1074 => 'uni0432',\n    1075 => 'uni0433',\n    1076 => 'uni0434',\n    1077 => 'uni0435',\n    1078 => 'uni0436',\n    1079 => 'uni0437',\n    1080 => 'uni0438',\n    1081 => 'uni0439',\n    1082 => 'uni043A',\n    1083 => 'uni043B',\n    1084 => 'uni043C',\n    1085 => 'uni043D',\n    1086 => 'uni043E',\n    1087 => 'uni043F',\n    1088 => 'uni0440',\n    1089 => 'uni0441',\n    1090 => 'uni0442',\n    1091 => 'uni0443',\n    1092 => 'uni0444',\n    1093 => 'uni0445',\n    1094 => 'uni0446',\n    1095 => 'uni0447',\n    1096 => 'uni0448',\n    1097 => 'uni0449',\n    1098 => 'uni044A',\n    1099 => 'uni044B',\n    1100 => 'uni044C',\n    1101 => 'uni044D',\n    1102 => 'uni044E',\n    1103 => 'uni044F',\n    1104 => 'uni0450',\n    1105 => 'uni0451',\n    1106 => 'uni0452',\n    1107 => 'uni0453',\n    1108 => 'uni0454',\n    1109 => 'uni0455',\n    1110 => 'uni0456',\n    1111 => 'uni0457',\n    1112 => 'uni0458',\n    1113 => 'uni0459',\n    1114 => 'uni045A',\n    1115 => 'uni045B',\n    1116 => 'uni045C',\n    1117 => 'uni045D',\n    1118 => 'uni045E',\n    1119 => 'uni045F',\n    1120 => 'uni0460',\n    1121 => 'uni0461',\n    1122 => 'uni0462',\n    1123 => 'uni0463',\n    1124 => 'uni0464',\n    1125 => 'uni0465',\n    1126 => 'uni0466',\n    1127 => 'uni0467',\n    1128 => 'uni0468',\n    1129 => 'uni0469',\n    1130 => 'uni046A',\n    1131 => 'uni046B',\n    1132 => 'uni046C',\n    1133 => 'uni046D',\n    1134 => 'uni046E',\n    1135 => 'uni046F',\n    1136 => 'uni0470',\n    1137 => 'uni0471',\n    1138 => 'uni0472',\n    1139 => 'uni0473',\n    1140 => 'uni0474',\n    1141 => 'uni0475',\n    1142 => 'uni0476',\n    1143 => 'uni0477',\n    1144 => 'uni0478',\n    1145 => 'uni0479',\n    1146 => 'uni047A',\n    1147 => 'uni047B',\n    1148 => 'uni047C',\n    1149 => 'uni047D',\n    1150 => 'uni047E',\n    1151 => 'uni047F',\n    1152 => 'uni0480',\n    1153 => 'uni0481',\n    1154 => 'uni0482',\n    1155 => 'uni0483',\n    1156 => 'uni0484',\n    1157 => 'uni0485',\n    1158 => 'uni0486',\n    1159 => 'uni0487',\n    1160 => 'uni0488',\n    1161 => 'uni0489',\n    1162 => 'uni048A',\n    1163 => 'uni048B',\n    1164 => 'uni048C',\n    1165 => 'uni048D',\n    1166 => 'uni048E',\n    1167 => 'uni048F',\n    1168 => 'uni0490',\n    1169 => 'uni0491',\n    1170 => 'uni0492',\n    1171 => 'uni0493',\n    1172 => 'uni0494',\n    1173 => 'uni0495',\n    1174 => 'uni0496',\n    1175 => 'uni0497',\n    1176 => 'uni0498',\n    1177 => 'uni0499',\n    1178 => 'uni049A',\n    1179 => 'uni049B',\n    1180 => 'uni049C',\n    1181 => 'uni049D',\n    1182 => 'uni049E',\n    1183 => 'uni049F',\n    1184 => 'uni04A0',\n    1185 => 'uni04A1',\n    1186 => 'uni04A2',\n    1187 => 'uni04A3',\n    1188 => 'uni04A4',\n    1189 => 'uni04A5',\n    1190 => 'uni04A6',\n    1191 => 'uni04A7',\n    1192 => 'uni04A8',\n    1193 => 'uni04A9',\n    1194 => 'uni04AA',\n    1195 => 'uni04AB',\n    1196 => 'uni04AC',\n    1197 => 'uni04AD',\n    1198 => 'uni04AE',\n    1199 => 'uni04AF',\n    1200 => 'uni04B0',\n    1201 => 'uni04B1',\n    1202 => 'uni04B2',\n    1203 => 'uni04B3',\n    1204 => 'uni04B4',\n    1205 => 'uni04B5',\n    1206 => 'uni04B6',\n    1207 => 'uni04B7',\n    1208 => 'uni04B8',\n    1209 => 'uni04B9',\n    1210 => 'uni04BA',\n    1211 => 'uni04BB',\n    1212 => 'uni04BC',\n    1213 => 'uni04BD',\n    1214 => 'uni04BE',\n    1215 => 'uni04BF',\n    1216 => 'uni04C0',\n    1217 => 'uni04C1',\n    1218 => 'uni04C2',\n    1219 => 'uni04C3',\n    1220 => 'uni04C4',\n    1221 => 'uni04C5',\n    1222 => 'uni04C6',\n    1223 => 'uni04C7',\n    1224 => 'uni04C8',\n    1225 => 'uni04C9',\n    1226 => 'uni04CA',\n    1227 => 'uni04CB',\n    1228 => 'uni04CC',\n    1229 => 'uni04CD',\n    1230 => 'uni04CE',\n    1231 => 'uni04CF',\n    1232 => 'uni04D0',\n    1233 => 'uni04D1',\n    1234 => 'uni04D2',\n    1235 => 'uni04D3',\n    1236 => 'uni04D4',\n    1237 => 'uni04D5',\n    1238 => 'uni04D6',\n    1239 => 'uni04D7',\n    1240 => 'uni04D8',\n    1241 => 'uni04D9',\n    1242 => 'uni04DA',\n    1243 => 'uni04DB',\n    1244 => 'uni04DC',\n    1245 => 'uni04DD',\n    1246 => 'uni04DE',\n    1247 => 'uni04DF',\n    1248 => 'uni04E0',\n    1249 => 'uni04E1',\n    1250 => 'uni04E2',\n    1251 => 'uni04E3',\n    1252 => 'uni04E4',\n    1253 => 'uni04E5',\n    1254 => 'uni04E6',\n    1255 => 'uni04E7',\n    1256 => 'uni04E8',\n    1257 => 'uni04E9',\n    1258 => 'uni04EA',\n    1259 => 'uni04EB',\n    1260 => 'uni04EC',\n    1261 => 'uni04ED',\n    1262 => 'uni04EE',\n    1263 => 'uni04EF',\n    1264 => 'uni04F0',\n    1265 => 'uni04F1',\n    1266 => 'uni04F2',\n    1267 => 'uni04F3',\n    1268 => 'uni04F4',\n    1269 => 'uni04F5',\n    1270 => 'uni04F6',\n    1271 => 'uni04F7',\n    1272 => 'uni04F8',\n    1273 => 'uni04F9',\n    1274 => 'uni04FA',\n    1275 => 'uni04FB',\n    1276 => 'uni04FC',\n    1277 => 'uni04FD',\n    1278 => 'uni04FE',\n    1279 => 'uni04FF',\n    1280 => 'uni0500',\n    1281 => 'uni0501',\n    1282 => 'uni0502',\n    1283 => 'uni0503',\n    1284 => 'uni0504',\n    1285 => 'uni0505',\n    1286 => 'uni0506',\n    1287 => 'uni0507',\n    1288 => 'uni0508',\n    1289 => 'uni0509',\n    1290 => 'uni050A',\n    1291 => 'uni050B',\n    1292 => 'uni050C',\n    1293 => 'uni050D',\n    1294 => 'uni050E',\n    1295 => 'uni050F',\n    1296 => 'uni0510',\n    1297 => 'uni0511',\n    1298 => 'uni0512',\n    1299 => 'uni0513',\n    1300 => 'uni0514',\n    1301 => 'uni0515',\n    1302 => 'uni0516',\n    1303 => 'uni0517',\n    1304 => 'uni0518',\n    1305 => 'uni0519',\n    1306 => 'uni051A',\n    1307 => 'uni051B',\n    1308 => 'uni051C',\n    1309 => 'uni051D',\n    1310 => 'uni051E',\n    1311 => 'uni051F',\n    1312 => 'uni0520',\n    1313 => 'uni0521',\n    1314 => 'uni0522',\n    1315 => 'uni0523',\n    1316 => 'uni0524',\n    1317 => 'uni0525',\n    1329 => 'uni0531',\n    1330 => 'uni0532',\n    1331 => 'uni0533',\n    1332 => 'uni0534',\n    1333 => 'uni0535',\n    1334 => 'uni0536',\n    1335 => 'uni0537',\n    1336 => 'uni0538',\n    1337 => 'uni0539',\n    1338 => 'uni053A',\n    1339 => 'uni053B',\n    1340 => 'uni053C',\n    1341 => 'uni053D',\n    1342 => 'uni053E',\n    1343 => 'uni053F',\n    1344 => 'uni0540',\n    1345 => 'uni0541',\n    1346 => 'uni0542',\n    1347 => 'uni0543',\n    1348 => 'uni0544',\n    1349 => 'uni0545',\n    1350 => 'uni0546',\n    1351 => 'uni0547',\n    1352 => 'uni0548',\n    1353 => 'uni0549',\n    1354 => 'uni054A',\n    1355 => 'uni054B',\n    1356 => 'uni054C',\n    1357 => 'uni054D',\n    1358 => 'uni054E',\n    1359 => 'uni054F',\n    1360 => 'uni0550',\n    1361 => 'uni0551',\n    1362 => 'uni0552',\n    1363 => 'uni0553',\n    1364 => 'uni0554',\n    1365 => 'uni0555',\n    1366 => 'uni0556',\n    1369 => 'uni0559',\n    1370 => 'uni055A',\n    1371 => 'uni055B',\n    1372 => 'uni055C',\n    1373 => 'uni055D',\n    1374 => 'uni055E',\n    1375 => 'uni055F',\n    1377 => 'uni0561',\n    1378 => 'uni0562',\n    1379 => 'uni0563',\n    1380 => 'uni0564',\n    1381 => 'uni0565',\n    1382 => 'uni0566',\n    1383 => 'uni0567',\n    1384 => 'uni0568',\n    1385 => 'uni0569',\n    1386 => 'uni056A',\n    1387 => 'uni056B',\n    1388 => 'uni056C',\n    1389 => 'uni056D',\n    1390 => 'uni056E',\n    1391 => 'uni056F',\n    1392 => 'uni0570',\n    1393 => 'uni0571',\n    1394 => 'uni0572',\n    1395 => 'uni0573',\n    1396 => 'uni0574',\n    1397 => 'uni0575',\n    1398 => 'uni0576',\n    1399 => 'uni0577',\n    1400 => 'uni0578',\n    1401 => 'uni0579',\n    1402 => 'uni057A',\n    1403 => 'uni057B',\n    1404 => 'uni057C',\n    1405 => 'uni057D',\n    1406 => 'uni057E',\n    1407 => 'uni057F',\n    1408 => 'uni0580',\n    1409 => 'uni0581',\n    1410 => 'uni0582',\n    1411 => 'uni0583',\n    1412 => 'uni0584',\n    1413 => 'uni0585',\n    1414 => 'uni0586',\n    1415 => 'uni0587',\n    1417 => 'uni0589',\n    1418 => 'uni058A',\n    1456 => 'uni05B0',\n    1457 => 'uni05B1',\n    1458 => 'uni05B2',\n    1459 => 'uni05B3',\n    1460 => 'uni05B4',\n    1461 => 'uni05B5',\n    1462 => 'uni05B6',\n    1463 => 'uni05B7',\n    1464 => 'uni05B8',\n    1465 => 'uni05B9',\n    1466 => 'uni05BA',\n    1467 => 'uni05BB',\n    1468 => 'uni05BC',\n    1469 => 'uni05BD',\n    1470 => 'uni05BE',\n    1471 => 'uni05BF',\n    1472 => 'uni05C0',\n    1473 => 'uni05C1',\n    1474 => 'uni05C2',\n    1475 => 'uni05C3',\n    1478 => 'uni05C6',\n    1479 => 'uni05C7',\n    1488 => 'uni05D0',\n    1489 => 'uni05D1',\n    1490 => 'uni05D2',\n    1491 => 'uni05D3',\n    1492 => 'uni05D4',\n    1493 => 'uni05D5',\n    1494 => 'uni05D6',\n    1495 => 'uni05D7',\n    1496 => 'uni05D8',\n    1497 => 'uni05D9',\n    1498 => 'uni05DA',\n    1499 => 'uni05DB',\n    1500 => 'uni05DC',\n    1501 => 'uni05DD',\n    1502 => 'uni05DE',\n    1503 => 'uni05DF',\n    1504 => 'uni05E0',\n    1505 => 'uni05E1',\n    1506 => 'uni05E2',\n    1507 => 'uni05E3',\n    1508 => 'uni05E4',\n    1509 => 'uni05E5',\n    1510 => 'uni05E6',\n    1511 => 'uni05E7',\n    1512 => 'uni05E8',\n    1513 => 'uni05E9',\n    1514 => 'uni05EA',\n    1520 => 'uni05F0',\n    1521 => 'uni05F1',\n    1522 => 'uni05F2',\n    1523 => 'uni05F3',\n    1524 => 'uni05F4',\n    1542 => 'uni0606',\n    1543 => 'uni0607',\n    1545 => 'uni0609',\n    1546 => 'uni060A',\n    1548 => 'uni060C',\n    1557 => 'uni0615',\n    1563 => 'uni061B',\n    1567 => 'uni061F',\n    1569 => 'uni0621',\n    1570 => 'uni0622',\n    1571 => 'uni0623',\n    1572 => 'uni0624',\n    1573 => 'uni0625',\n    1574 => 'uni0626',\n    1575 => 'uni0627',\n    1576 => 'uni0628',\n    1577 => 'uni0629',\n    1578 => 'uni062A',\n    1579 => 'uni062B',\n    1580 => 'uni062C',\n    1581 => 'uni062D',\n    1582 => 'uni062E',\n    1583 => 'uni062F',\n    1584 => 'uni0630',\n    1585 => 'uni0631',\n    1586 => 'uni0632',\n    1587 => 'uni0633',\n    1588 => 'uni0634',\n    1589 => 'uni0635',\n    1590 => 'uni0636',\n    1591 => 'uni0637',\n    1592 => 'uni0638',\n    1593 => 'uni0639',\n    1594 => 'uni063A',\n    1600 => 'uni0640',\n    1601 => 'uni0641',\n    1602 => 'uni0642',\n    1603 => 'uni0643',\n    1604 => 'uni0644',\n    1605 => 'uni0645',\n    1606 => 'uni0646',\n    1607 => 'uni0647',\n    1608 => 'uni0648',\n    1609 => 'uni0649',\n    1610 => 'uni064A',\n    1611 => 'uni064B',\n    1612 => 'uni064C',\n    1613 => 'uni064D',\n    1614 => 'uni064E',\n    1615 => 'uni064F',\n    1616 => 'uni0650',\n    1617 => 'uni0651',\n    1618 => 'uni0652',\n    1619 => 'uni0653',\n    1620 => 'uni0654',\n    1621 => 'uni0655',\n    1623 => 'uni0657',\n    1626 => 'uni065A',\n    1632 => 'uni0660',\n    1633 => 'uni0661',\n    1634 => 'uni0662',\n    1635 => 'uni0663',\n    1636 => 'uni0664',\n    1637 => 'uni0665',\n    1638 => 'uni0666',\n    1639 => 'uni0667',\n    1640 => 'uni0668',\n    1641 => 'uni0669',\n    1642 => 'uni066A',\n    1643 => 'uni066B',\n    1644 => 'uni066C',\n    1645 => 'uni066D',\n    1646 => 'uni066E',\n    1647 => 'uni066F',\n    1648 => 'uni0670',\n    1652 => 'uni0674',\n    1657 => 'uni0679',\n    1658 => 'uni067A',\n    1659 => 'uni067B',\n    1660 => 'uni067C',\n    1661 => 'uni067D',\n    1662 => 'uni067E',\n    1663 => 'uni067F',\n    1664 => 'uni0680',\n    1665 => 'uni0681',\n    1666 => 'uni0682',\n    1667 => 'uni0683',\n    1668 => 'uni0684',\n    1669 => 'uni0685',\n    1670 => 'uni0686',\n    1671 => 'uni0687',\n    1672 => 'uni0688',\n    1673 => 'uni0689',\n    1674 => 'uni068A',\n    1675 => 'uni068B',\n    1676 => 'uni068C',\n    1677 => 'uni068D',\n    1678 => 'uni068E',\n    1679 => 'uni068F',\n    1680 => 'uni0690',\n    1681 => 'uni0691',\n    1682 => 'uni0692',\n    1683 => 'uni0693',\n    1684 => 'uni0694',\n    1685 => 'uni0695',\n    1686 => 'uni0696',\n    1687 => 'uni0697',\n    1688 => 'uni0698',\n    1689 => 'uni0699',\n    1690 => 'uni069A',\n    1691 => 'uni069B',\n    1692 => 'uni069C',\n    1693 => 'uni069D',\n    1694 => 'uni069E',\n    1695 => 'uni069F',\n    1696 => 'uni06A0',\n    1697 => 'uni06A1',\n    1698 => 'uni06A2',\n    1699 => 'uni06A3',\n    1700 => 'uni06A4',\n    1701 => 'uni06A5',\n    1702 => 'uni06A6',\n    1703 => 'uni06A7',\n    1704 => 'uni06A8',\n    1705 => 'uni06A9',\n    1706 => 'uni06AA',\n    1707 => 'uni06AB',\n    1708 => 'uni06AC',\n    1709 => 'uni06AD',\n    1710 => 'uni06AE',\n    1711 => 'uni06AF',\n    1712 => 'uni06B0',\n    1713 => 'uni06B1',\n    1714 => 'uni06B2',\n    1715 => 'uni06B3',\n    1716 => 'uni06B4',\n    1717 => 'uni06B5',\n    1718 => 'uni06B6',\n    1719 => 'uni06B7',\n    1720 => 'uni06B8',\n    1721 => 'uni06B9',\n    1722 => 'uni06BA',\n    1723 => 'uni06BB',\n    1724 => 'uni06BC',\n    1725 => 'uni06BD',\n    1726 => 'uni06BE',\n    1727 => 'uni06BF',\n    1734 => 'uni06C6',\n    1735 => 'uni06C7',\n    1736 => 'uni06C8',\n    1739 => 'uni06CB',\n    1740 => 'uni06CC',\n    1742 => 'uni06CE',\n    1744 => 'uni06D0',\n    1749 => 'uni06D5',\n    1776 => 'uni06F0',\n    1777 => 'uni06F1',\n    1778 => 'uni06F2',\n    1779 => 'uni06F3',\n    1780 => 'uni06F4',\n    1781 => 'uni06F5',\n    1782 => 'uni06F6',\n    1783 => 'uni06F7',\n    1784 => 'uni06F8',\n    1785 => 'uni06F9',\n    1984 => 'uni07C0',\n    1985 => 'uni07C1',\n    1986 => 'uni07C2',\n    1987 => 'uni07C3',\n    1988 => 'uni07C4',\n    1989 => 'uni07C5',\n    1990 => 'uni07C6',\n    1991 => 'uni07C7',\n    1992 => 'uni07C8',\n    1993 => 'uni07C9',\n    1994 => 'uni07CA',\n    1995 => 'uni07CB',\n    1996 => 'uni07CC',\n    1997 => 'uni07CD',\n    1998 => 'uni07CE',\n    1999 => 'uni07CF',\n    2000 => 'uni07D0',\n    2001 => 'uni07D1',\n    2002 => 'uni07D2',\n    2003 => 'uni07D3',\n    2004 => 'uni07D4',\n    2005 => 'uni07D5',\n    2006 => 'uni07D6',\n    2007 => 'uni07D7',\n    2008 => 'uni07D8',\n    2009 => 'uni07D9',\n    2010 => 'uni07DA',\n    2011 => 'uni07DB',\n    2012 => 'uni07DC',\n    2013 => 'uni07DD',\n    2014 => 'uni07DE',\n    2015 => 'uni07DF',\n    2016 => 'uni07E0',\n    2017 => 'uni07E1',\n    2018 => 'uni07E2',\n    2019 => 'uni07E3',\n    2020 => 'uni07E4',\n    2021 => 'uni07E5',\n    2022 => 'uni07E6',\n    2023 => 'uni07E7',\n    2027 => 'uni07EB',\n    2028 => 'uni07EC',\n    2029 => 'uni07ED',\n    2030 => 'uni07EE',\n    2031 => 'uni07EF',\n    2032 => 'uni07F0',\n    2033 => 'uni07F1',\n    2034 => 'uni07F2',\n    2035 => 'uni07F3',\n    2036 => 'uni07F4',\n    2037 => 'uni07F5',\n    2040 => 'uni07F8',\n    2041 => 'uni07F9',\n    2042 => 'uni07FA',\n    3647 => 'uni0E3F',\n    3713 => 'uni0E81',\n    3714 => 'uni0E82',\n    3716 => 'uni0E84',\n    3719 => 'uni0E87',\n    3720 => 'uni0E88',\n    3722 => 'uni0E8A',\n    3725 => 'uni0E8D',\n    3732 => 'uni0E94',\n    3733 => 'uni0E95',\n    3734 => 'uni0E96',\n    3735 => 'uni0E97',\n    3737 => 'uni0E99',\n    3738 => 'uni0E9A',\n    3739 => 'uni0E9B',\n    3740 => 'uni0E9C',\n    3741 => 'uni0E9D',\n    3742 => 'uni0E9E',\n    3743 => 'uni0E9F',\n    3745 => 'uni0EA1',\n    3746 => 'uni0EA2',\n    3747 => 'uni0EA3',\n    3749 => 'uni0EA5',\n    3751 => 'uni0EA7',\n    3754 => 'uni0EAA',\n    3755 => 'uni0EAB',\n    3757 => 'uni0EAD',\n    3758 => 'uni0EAE',\n    3759 => 'uni0EAF',\n    3760 => 'uni0EB0',\n    3761 => 'uni0EB1',\n    3762 => 'uni0EB2',\n    3763 => 'uni0EB3',\n    3764 => 'uni0EB4',\n    3765 => 'uni0EB5',\n    3766 => 'uni0EB6',\n    3767 => 'uni0EB7',\n    3768 => 'uni0EB8',\n    3769 => 'uni0EB9',\n    3771 => 'uni0EBB',\n    3772 => 'uni0EBC',\n    3773 => 'uni0EBD',\n    3776 => 'uni0EC0',\n    3777 => 'uni0EC1',\n    3778 => 'uni0EC2',\n    3779 => 'uni0EC3',\n    3780 => 'uni0EC4',\n    3782 => 'uni0EC6',\n    3784 => 'uni0EC8',\n    3785 => 'uni0EC9',\n    3786 => 'uni0ECA',\n    3787 => 'uni0ECB',\n    3788 => 'uni0ECC',\n    3789 => 'uni0ECD',\n    3792 => 'uni0ED0',\n    3793 => 'uni0ED1',\n    3794 => 'uni0ED2',\n    3795 => 'uni0ED3',\n    3796 => 'uni0ED4',\n    3797 => 'uni0ED5',\n    3798 => 'uni0ED6',\n    3799 => 'uni0ED7',\n    3800 => 'uni0ED8',\n    3801 => 'uni0ED9',\n    3804 => 'uni0EDC',\n    3805 => 'uni0EDD',\n    4256 => 'uni10A0',\n    4257 => 'uni10A1',\n    4258 => 'uni10A2',\n    4259 => 'uni10A3',\n    4260 => 'uni10A4',\n    4261 => 'uni10A5',\n    4262 => 'uni10A6',\n    4263 => 'uni10A7',\n    4264 => 'uni10A8',\n    4265 => 'uni10A9',\n    4266 => 'uni10AA',\n    4267 => 'uni10AB',\n    4268 => 'uni10AC',\n    4269 => 'uni10AD',\n    4270 => 'uni10AE',\n    4271 => 'uni10AF',\n    4272 => 'uni10B0',\n    4273 => 'uni10B1',\n    4274 => 'uni10B2',\n    4275 => 'uni10B3',\n    4276 => 'uni10B4',\n    4277 => 'uni10B5',\n    4278 => 'uni10B6',\n    4279 => 'uni10B7',\n    4280 => 'uni10B8',\n    4281 => 'uni10B9',\n    4282 => 'uni10BA',\n    4283 => 'uni10BB',\n    4284 => 'uni10BC',\n    4285 => 'uni10BD',\n    4286 => 'uni10BE',\n    4287 => 'uni10BF',\n    4288 => 'uni10C0',\n    4289 => 'uni10C1',\n    4290 => 'uni10C2',\n    4291 => 'uni10C3',\n    4292 => 'uni10C4',\n    4293 => 'uni10C5',\n    4304 => 'uni10D0',\n    4305 => 'uni10D1',\n    4306 => 'uni10D2',\n    4307 => 'uni10D3',\n    4308 => 'uni10D4',\n    4309 => 'uni10D5',\n    4310 => 'uni10D6',\n    4311 => 'uni10D7',\n    4312 => 'uni10D8',\n    4313 => 'uni10D9',\n    4314 => 'uni10DA',\n    4315 => 'uni10DB',\n    4316 => 'uni10DC',\n    4317 => 'uni10DD',\n    4318 => 'uni10DE',\n    4319 => 'uni10DF',\n    4320 => 'uni10E0',\n    4321 => 'uni10E1',\n    4322 => 'uni10E2',\n    4323 => 'uni10E3',\n    4324 => 'uni10E4',\n    4325 => 'uni10E5',\n    4326 => 'uni10E6',\n    4327 => 'uni10E7',\n    4328 => 'uni10E8',\n    4329 => 'uni10E9',\n    4330 => 'uni10EA',\n    4331 => 'uni10EB',\n    4332 => 'uni10EC',\n    4333 => 'uni10ED',\n    4334 => 'uni10EE',\n    4335 => 'uni10EF',\n    4336 => 'uni10F0',\n    4337 => 'uni10F1',\n    4338 => 'uni10F2',\n    4339 => 'uni10F3',\n    4340 => 'uni10F4',\n    4341 => 'uni10F5',\n    4342 => 'uni10F6',\n    4343 => 'uni10F7',\n    4344 => 'uni10F8',\n    4345 => 'uni10F9',\n    4346 => 'uni10FA',\n    4347 => 'uni10FB',\n    4348 => 'uni10FC',\n    5121 => 'uni1401',\n    5122 => 'uni1402',\n    5123 => 'uni1403',\n    5124 => 'uni1404',\n    5125 => 'uni1405',\n    5126 => 'uni1406',\n    5127 => 'uni1407',\n    5129 => 'uni1409',\n    5130 => 'uni140A',\n    5131 => 'uni140B',\n    5132 => 'uni140C',\n    5133 => 'uni140D',\n    5134 => 'uni140E',\n    5135 => 'uni140F',\n    5136 => 'uni1410',\n    5137 => 'uni1411',\n    5138 => 'uni1412',\n    5139 => 'uni1413',\n    5140 => 'uni1414',\n    5141 => 'uni1415',\n    5142 => 'uni1416',\n    5143 => 'uni1417',\n    5144 => 'uni1418',\n    5145 => 'uni1419',\n    5146 => 'uni141A',\n    5147 => 'uni141B',\n    5149 => 'uni141D',\n    5150 => 'uni141E',\n    5151 => 'uni141F',\n    5152 => 'uni1420',\n    5153 => 'uni1421',\n    5154 => 'uni1422',\n    5155 => 'uni1423',\n    5156 => 'uni1424',\n    5157 => 'uni1425',\n    5158 => 'uni1426',\n    5159 => 'uni1427',\n    5160 => 'uni1428',\n    5161 => 'uni1429',\n    5162 => 'uni142A',\n    5163 => 'uni142B',\n    5164 => 'uni142C',\n    5165 => 'uni142D',\n    5166 => 'uni142E',\n    5167 => 'uni142F',\n    5168 => 'uni1430',\n    5169 => 'uni1431',\n    5170 => 'uni1432',\n    5171 => 'uni1433',\n    5172 => 'uni1434',\n    5173 => 'uni1435',\n    5175 => 'uni1437',\n    5176 => 'uni1438',\n    5177 => 'uni1439',\n    5178 => 'uni143A',\n    5179 => 'uni143B',\n    5180 => 'uni143C',\n    5181 => 'uni143D',\n    5182 => 'uni143E',\n    5183 => 'uni143F',\n    5184 => 'uni1440',\n    5185 => 'uni1441',\n    5186 => 'uni1442',\n    5187 => 'uni1443',\n    5188 => 'uni1444',\n    5189 => 'uni1445',\n    5190 => 'uni1446',\n    5191 => 'uni1447',\n    5192 => 'uni1448',\n    5193 => 'uni1449',\n    5194 => 'uni144A',\n    5196 => 'uni144C',\n    5197 => 'uni144D',\n    5198 => 'uni144E',\n    5199 => 'uni144F',\n    5200 => 'uni1450',\n    5201 => 'uni1451',\n    5202 => 'uni1452',\n    5204 => 'uni1454',\n    5205 => 'uni1455',\n    5206 => 'uni1456',\n    5207 => 'uni1457',\n    5208 => 'uni1458',\n    5209 => 'uni1459',\n    5210 => 'uni145A',\n    5211 => 'uni145B',\n    5212 => 'uni145C',\n    5213 => 'uni145D',\n    5214 => 'uni145E',\n    5215 => 'uni145F',\n    5216 => 'uni1460',\n    5217 => 'uni1461',\n    5218 => 'uni1462',\n    5219 => 'uni1463',\n    5220 => 'uni1464',\n    5221 => 'uni1465',\n    5222 => 'uni1466',\n    5223 => 'uni1467',\n    5224 => 'uni1468',\n    5225 => 'uni1469',\n    5226 => 'uni146A',\n    5227 => 'uni146B',\n    5228 => 'uni146C',\n    5229 => 'uni146D',\n    5230 => 'uni146E',\n    5231 => 'uni146F',\n    5232 => 'uni1470',\n    5233 => 'uni1471',\n    5234 => 'uni1472',\n    5235 => 'uni1473',\n    5236 => 'uni1474',\n    5237 => 'uni1475',\n    5238 => 'uni1476',\n    5239 => 'uni1477',\n    5240 => 'uni1478',\n    5241 => 'uni1479',\n    5242 => 'uni147A',\n    5243 => 'uni147B',\n    5244 => 'uni147C',\n    5245 => 'uni147D',\n    5246 => 'uni147E',\n    5247 => 'uni147F',\n    5248 => 'uni1480',\n    5249 => 'uni1481',\n    5250 => 'uni1482',\n    5251 => 'uni1483',\n    5252 => 'uni1484',\n    5253 => 'uni1485',\n    5254 => 'uni1486',\n    5255 => 'uni1487',\n    5256 => 'uni1488',\n    5257 => 'uni1489',\n    5258 => 'uni148A',\n    5259 => 'uni148B',\n    5260 => 'uni148C',\n    5261 => 'uni148D',\n    5262 => 'uni148E',\n    5263 => 'uni148F',\n    5264 => 'uni1490',\n    5265 => 'uni1491',\n    5266 => 'uni1492',\n    5267 => 'uni1493',\n    5268 => 'uni1494',\n    5269 => 'uni1495',\n    5270 => 'uni1496',\n    5271 => 'uni1497',\n    5272 => 'uni1498',\n    5273 => 'uni1499',\n    5274 => 'uni149A',\n    5275 => 'uni149B',\n    5276 => 'uni149C',\n    5277 => 'uni149D',\n    5278 => 'uni149E',\n    5279 => 'uni149F',\n    5280 => 'uni14A0',\n    5281 => 'uni14A1',\n    5282 => 'uni14A2',\n    5283 => 'uni14A3',\n    5284 => 'uni14A4',\n    5285 => 'uni14A5',\n    5286 => 'uni14A6',\n    5287 => 'uni14A7',\n    5288 => 'uni14A8',\n    5289 => 'uni14A9',\n    5290 => 'uni14AA',\n    5291 => 'uni14AB',\n    5292 => 'uni14AC',\n    5293 => 'uni14AD',\n    5294 => 'uni14AE',\n    5295 => 'uni14AF',\n    5296 => 'uni14B0',\n    5297 => 'uni14B1',\n    5298 => 'uni14B2',\n    5299 => 'uni14B3',\n    5300 => 'uni14B4',\n    5301 => 'uni14B5',\n    5302 => 'uni14B6',\n    5303 => 'uni14B7',\n    5304 => 'uni14B8',\n    5305 => 'uni14B9',\n    5306 => 'uni14BA',\n    5307 => 'uni14BB',\n    5308 => 'uni14BC',\n    5309 => 'uni14BD',\n    5312 => 'uni14C0',\n    5313 => 'uni14C1',\n    5314 => 'uni14C2',\n    5315 => 'uni14C3',\n    5316 => 'uni14C4',\n    5317 => 'uni14C5',\n    5318 => 'uni14C6',\n    5319 => 'uni14C7',\n    5320 => 'uni14C8',\n    5321 => 'uni14C9',\n    5322 => 'uni14CA',\n    5323 => 'uni14CB',\n    5324 => 'uni14CC',\n    5325 => 'uni14CD',\n    5326 => 'uni14CE',\n    5327 => 'uni14CF',\n    5328 => 'uni14D0',\n    5329 => 'uni14D1',\n    5330 => 'uni14D2',\n    5331 => 'uni14D3',\n    5332 => 'uni14D4',\n    5333 => 'uni14D5',\n    5334 => 'uni14D6',\n    5335 => 'uni14D7',\n    5336 => 'uni14D8',\n    5337 => 'uni14D9',\n    5338 => 'uni14DA',\n    5339 => 'uni14DB',\n    5340 => 'uni14DC',\n    5341 => 'uni14DD',\n    5342 => 'uni14DE',\n    5343 => 'uni14DF',\n    5344 => 'uni14E0',\n    5345 => 'uni14E1',\n    5346 => 'uni14E2',\n    5347 => 'uni14E3',\n    5348 => 'uni14E4',\n    5349 => 'uni14E5',\n    5350 => 'uni14E6',\n    5351 => 'uni14E7',\n    5352 => 'uni14E8',\n    5353 => 'uni14E9',\n    5354 => 'uni14EA',\n    5356 => 'uni14EC',\n    5357 => 'uni14ED',\n    5358 => 'uni14EE',\n    5359 => 'uni14EF',\n    5360 => 'uni14F0',\n    5361 => 'uni14F1',\n    5362 => 'uni14F2',\n    5363 => 'uni14F3',\n    5364 => 'uni14F4',\n    5365 => 'uni14F5',\n    5366 => 'uni14F6',\n    5367 => 'uni14F7',\n    5368 => 'uni14F8',\n    5369 => 'uni14F9',\n    5370 => 'uni14FA',\n    5371 => 'uni14FB',\n    5372 => 'uni14FC',\n    5373 => 'uni14FD',\n    5374 => 'uni14FE',\n    5375 => 'uni14FF',\n    5376 => 'uni1500',\n    5377 => 'uni1501',\n    5378 => 'uni1502',\n    5379 => 'uni1503',\n    5380 => 'uni1504',\n    5381 => 'uni1505',\n    5382 => 'uni1506',\n    5383 => 'uni1507',\n    5392 => 'uni1510',\n    5393 => 'uni1511',\n    5394 => 'uni1512',\n    5395 => 'uni1513',\n    5396 => 'uni1514',\n    5397 => 'uni1515',\n    5398 => 'uni1516',\n    5399 => 'uni1517',\n    5400 => 'uni1518',\n    5401 => 'uni1519',\n    5402 => 'uni151A',\n    5403 => 'uni151B',\n    5404 => 'uni151C',\n    5405 => 'uni151D',\n    5406 => 'uni151E',\n    5407 => 'uni151F',\n    5408 => 'uni1520',\n    5409 => 'uni1521',\n    5410 => 'uni1522',\n    5411 => 'uni1523',\n    5412 => 'uni1524',\n    5413 => 'uni1525',\n    5414 => 'uni1526',\n    5415 => 'uni1527',\n    5416 => 'uni1528',\n    5417 => 'uni1529',\n    5418 => 'uni152A',\n    5419 => 'uni152B',\n    5420 => 'uni152C',\n    5421 => 'uni152D',\n    5422 => 'uni152E',\n    5423 => 'uni152F',\n    5424 => 'uni1530',\n    5425 => 'uni1531',\n    5426 => 'uni1532',\n    5427 => 'uni1533',\n    5428 => 'uni1534',\n    5429 => 'uni1535',\n    5430 => 'uni1536',\n    5431 => 'uni1537',\n    5432 => 'uni1538',\n    5433 => 'uni1539',\n    5434 => 'uni153A',\n    5435 => 'uni153B',\n    5436 => 'uni153C',\n    5437 => 'uni153D',\n    5438 => 'uni153E',\n    5440 => 'uni1540',\n    5441 => 'uni1541',\n    5442 => 'uni1542',\n    5443 => 'uni1543',\n    5444 => 'uni1544',\n    5445 => 'uni1545',\n    5446 => 'uni1546',\n    5447 => 'uni1547',\n    5448 => 'uni1548',\n    5449 => 'uni1549',\n    5450 => 'uni154A',\n    5451 => 'uni154B',\n    5452 => 'uni154C',\n    5453 => 'uni154D',\n    5454 => 'uni154E',\n    5455 => 'uni154F',\n    5456 => 'uni1550',\n    5458 => 'uni1552',\n    5459 => 'uni1553',\n    5460 => 'uni1554',\n    5461 => 'uni1555',\n    5462 => 'uni1556',\n    5463 => 'uni1557',\n    5464 => 'uni1558',\n    5465 => 'uni1559',\n    5466 => 'uni155A',\n    5467 => 'uni155B',\n    5468 => 'uni155C',\n    5469 => 'uni155D',\n    5470 => 'uni155E',\n    5471 => 'uni155F',\n    5472 => 'uni1560',\n    5473 => 'uni1561',\n    5474 => 'uni1562',\n    5475 => 'uni1563',\n    5476 => 'uni1564',\n    5477 => 'uni1565',\n    5478 => 'uni1566',\n    5479 => 'uni1567',\n    5480 => 'uni1568',\n    5481 => 'uni1569',\n    5482 => 'uni156A',\n    5492 => 'uni1574',\n    5493 => 'uni1575',\n    5494 => 'uni1576',\n    5495 => 'uni1577',\n    5496 => 'uni1578',\n    5497 => 'uni1579',\n    5498 => 'uni157A',\n    5499 => 'uni157B',\n    5500 => 'uni157C',\n    5501 => 'uni157D',\n    5502 => 'uni157E',\n    5503 => 'uni157F',\n    5504 => 'uni1580',\n    5505 => 'uni1581',\n    5506 => 'uni1582',\n    5507 => 'uni1583',\n    5508 => 'uni1584',\n    5509 => 'uni1585',\n    5514 => 'uni158A',\n    5515 => 'uni158B',\n    5516 => 'uni158C',\n    5517 => 'uni158D',\n    5518 => 'uni158E',\n    5519 => 'uni158F',\n    5520 => 'uni1590',\n    5521 => 'uni1591',\n    5522 => 'uni1592',\n    5523 => 'uni1593',\n    5524 => 'uni1594',\n    5525 => 'uni1595',\n    5526 => 'uni1596',\n    5536 => 'uni15A0',\n    5537 => 'uni15A1',\n    5538 => 'uni15A2',\n    5539 => 'uni15A3',\n    5540 => 'uni15A4',\n    5541 => 'uni15A5',\n    5542 => 'uni15A6',\n    5543 => 'uni15A7',\n    5544 => 'uni15A8',\n    5545 => 'uni15A9',\n    5546 => 'uni15AA',\n    5547 => 'uni15AB',\n    5548 => 'uni15AC',\n    5549 => 'uni15AD',\n    5550 => 'uni15AE',\n    5551 => 'uni15AF',\n    5598 => 'uni15DE',\n    5601 => 'uni15E1',\n    5702 => 'uni1646',\n    5703 => 'uni1647',\n    5742 => 'uni166E',\n    5743 => 'uni166F',\n    5744 => 'uni1670',\n    5745 => 'uni1671',\n    5746 => 'uni1672',\n    5747 => 'uni1673',\n    5748 => 'uni1674',\n    5749 => 'uni1675',\n    5750 => 'uni1676',\n    5760 => 'uni1680',\n    5761 => 'uni1681',\n    5762 => 'uni1682',\n    5763 => 'uni1683',\n    5764 => 'uni1684',\n    5765 => 'uni1685',\n    5766 => 'uni1686',\n    5767 => 'uni1687',\n    5768 => 'uni1688',\n    5769 => 'uni1689',\n    5770 => 'uni168A',\n    5771 => 'uni168B',\n    5772 => 'uni168C',\n    5773 => 'uni168D',\n    5774 => 'uni168E',\n    5775 => 'uni168F',\n    5776 => 'uni1690',\n    5777 => 'uni1691',\n    5778 => 'uni1692',\n    5779 => 'uni1693',\n    5780 => 'uni1694',\n    5781 => 'uni1695',\n    5782 => 'uni1696',\n    5783 => 'uni1697',\n    5784 => 'uni1698',\n    5785 => 'uni1699',\n    5786 => 'uni169A',\n    5787 => 'uni169B',\n    5788 => 'uni169C',\n    7424 => 'uni1D00',\n    7425 => 'uni1D01',\n    7426 => 'uni1D02',\n    7427 => 'uni1D03',\n    7428 => 'uni1D04',\n    7429 => 'uni1D05',\n    7430 => 'uni1D06',\n    7431 => 'uni1D07',\n    7432 => 'uni1D08',\n    7433 => 'uni1D09',\n    7434 => 'uni1D0A',\n    7435 => 'uni1D0B',\n    7436 => 'uni1D0C',\n    7437 => 'uni1D0D',\n    7438 => 'uni1D0E',\n    7439 => 'uni1D0F',\n    7440 => 'uni1D10',\n    7441 => 'uni1D11',\n    7442 => 'uni1D12',\n    7443 => 'uni1D13',\n    7444 => 'uni1D14',\n    7446 => 'uni1D16',\n    7447 => 'uni1D17',\n    7448 => 'uni1D18',\n    7449 => 'uni1D19',\n    7450 => 'uni1D1A',\n    7451 => 'uni1D1B',\n    7452 => 'uni1D1C',\n    7453 => 'uni1D1D',\n    7454 => 'uni1D1E',\n    7455 => 'uni1D1F',\n    7456 => 'uni1D20',\n    7457 => 'uni1D21',\n    7458 => 'uni1D22',\n    7459 => 'uni1D23',\n    7462 => 'uni1D26',\n    7463 => 'uni1D27',\n    7464 => 'uni1D28',\n    7465 => 'uni1D29',\n    7466 => 'uni1D2A',\n    7467 => 'uni1D2B',\n    7468 => 'uni1D2C',\n    7469 => 'uni1D2D',\n    7470 => 'uni1D2E',\n    7472 => 'uni1D30',\n    7473 => 'uni1D31',\n    7474 => 'uni1D32',\n    7475 => 'uni1D33',\n    7476 => 'uni1D34',\n    7477 => 'uni1D35',\n    7478 => 'uni1D36',\n    7479 => 'uni1D37',\n    7480 => 'uni1D38',\n    7481 => 'uni1D39',\n    7482 => 'uni1D3A',\n    7483 => 'uni1D3B',\n    7484 => 'uni1D3C',\n    7485 => 'uni1D3D',\n    7486 => 'uni1D3E',\n    7487 => 'uni1D3F',\n    7488 => 'uni1D40',\n    7489 => 'uni1D41',\n    7490 => 'uni1D42',\n    7491 => 'uni1D43',\n    7492 => 'uni1D44',\n    7493 => 'uni1D45',\n    7494 => 'uni1D46',\n    7495 => 'uni1D47',\n    7496 => 'uni1D48',\n    7497 => 'uni1D49',\n    7498 => 'uni1D4A',\n    7499 => 'uni1D4B',\n    7500 => 'uni1D4C',\n    7501 => 'uni1D4D',\n    7502 => 'uni1D4E',\n    7503 => 'uni1D4F',\n    7504 => 'uni1D50',\n    7505 => 'uni1D51',\n    7506 => 'uni1D52',\n    7507 => 'uni1D53',\n    7508 => 'uni1D54',\n    7509 => 'uni1D55',\n    7510 => 'uni1D56',\n    7511 => 'uni1D57',\n    7512 => 'uni1D58',\n    7513 => 'uni1D59',\n    7514 => 'uni1D5A',\n    7515 => 'uni1D5B',\n    7517 => 'uni1D5D',\n    7518 => 'uni1D5E',\n    7519 => 'uni1D5F',\n    7520 => 'uni1D60',\n    7521 => 'uni1D61',\n    7522 => 'uni1D62',\n    7523 => 'uni1D63',\n    7524 => 'uni1D64',\n    7525 => 'uni1D65',\n    7526 => 'uni1D66',\n    7527 => 'uni1D67',\n    7528 => 'uni1D68',\n    7529 => 'uni1D69',\n    7530 => 'uni1D6A',\n    7543 => 'uni1D77',\n    7544 => 'uni1D78',\n    7547 => 'uni1D7B',\n    7549 => 'uni1D7D',\n    7557 => 'uni1D85',\n    7579 => 'uni1D9B',\n    7580 => 'uni1D9C',\n    7581 => 'uni1D9D',\n    7582 => 'uni1D9E',\n    7583 => 'uni1D9F',\n    7584 => 'uni1DA0',\n    7585 => 'uni1DA1',\n    7586 => 'uni1DA2',\n    7587 => 'uni1DA3',\n    7588 => 'uni1DA4',\n    7589 => 'uni1DA5',\n    7590 => 'uni1DA6',\n    7591 => 'uni1DA7',\n    7592 => 'uni1DA8',\n    7593 => 'uni1DA9',\n    7594 => 'uni1DAA',\n    7595 => 'uni1DAB',\n    7596 => 'uni1DAC',\n    7597 => 'uni1DAD',\n    7598 => 'uni1DAE',\n    7599 => 'uni1DAF',\n    7600 => 'uni1DB0',\n    7601 => 'uni1DB1',\n    7602 => 'uni1DB2',\n    7603 => 'uni1DB3',\n    7604 => 'uni1DB4',\n    7605 => 'uni1DB5',\n    7606 => 'uni1DB6',\n    7607 => 'uni1DB7',\n    7608 => 'uni1DB8',\n    7609 => 'uni1DB9',\n    7610 => 'uni1DBA',\n    7611 => 'uni1DBB',\n    7612 => 'uni1DBC',\n    7613 => 'uni1DBD',\n    7614 => 'uni1DBE',\n    7615 => 'uni1DBF',\n    7620 => 'uni1DC4',\n    7621 => 'uni1DC5',\n    7622 => 'uni1DC6',\n    7623 => 'uni1DC7',\n    7624 => 'uni1DC8',\n    7625 => 'uni1DC9',\n    7680 => 'uni1E00',\n    7681 => 'uni1E01',\n    7682 => 'uni1E02',\n    7683 => 'uni1E03',\n    7684 => 'uni1E04',\n    7685 => 'uni1E05',\n    7686 => 'uni1E06',\n    7687 => 'uni1E07',\n    7688 => 'uni1E08',\n    7689 => 'uni1E09',\n    7690 => 'uni1E0A',\n    7691 => 'uni1E0B',\n    7692 => 'uni1E0C',\n    7693 => 'uni1E0D',\n    7694 => 'uni1E0E',\n    7695 => 'uni1E0F',\n    7696 => 'uni1E10',\n    7697 => 'uni1E11',\n    7698 => 'uni1E12',\n    7699 => 'uni1E13',\n    7700 => 'uni1E14',\n    7701 => 'uni1E15',\n    7702 => 'uni1E16',\n    7703 => 'uni1E17',\n    7704 => 'uni1E18',\n    7705 => 'uni1E19',\n    7706 => 'uni1E1A',\n    7707 => 'uni1E1B',\n    7708 => 'uni1E1C',\n    7709 => 'uni1E1D',\n    7710 => 'uni1E1E',\n    7711 => 'uni1E1F',\n    7712 => 'uni1E20',\n    7713 => 'uni1E21',\n    7714 => 'uni1E22',\n    7715 => 'uni1E23',\n    7716 => 'uni1E24',\n    7717 => 'uni1E25',\n    7718 => 'uni1E26',\n    7719 => 'uni1E27',\n    7720 => 'uni1E28',\n    7721 => 'uni1E29',\n    7722 => 'uni1E2A',\n    7723 => 'uni1E2B',\n    7724 => 'uni1E2C',\n    7725 => 'uni1E2D',\n    7726 => 'uni1E2E',\n    7727 => 'uni1E2F',\n    7728 => 'uni1E30',\n    7729 => 'uni1E31',\n    7730 => 'uni1E32',\n    7731 => 'uni1E33',\n    7732 => 'uni1E34',\n    7733 => 'uni1E35',\n    7734 => 'uni1E36',\n    7735 => 'uni1E37',\n    7736 => 'uni1E38',\n    7737 => 'uni1E39',\n    7738 => 'uni1E3A',\n    7739 => 'uni1E3B',\n    7740 => 'uni1E3C',\n    7741 => 'uni1E3D',\n    7742 => 'uni1E3E',\n    7743 => 'uni1E3F',\n    7744 => 'uni1E40',\n    7745 => 'uni1E41',\n    7746 => 'uni1E42',\n    7747 => 'uni1E43',\n    7748 => 'uni1E44',\n    7749 => 'uni1E45',\n    7750 => 'uni1E46',\n    7751 => 'uni1E47',\n    7752 => 'uni1E48',\n    7753 => 'uni1E49',\n    7754 => 'uni1E4A',\n    7755 => 'uni1E4B',\n    7756 => 'uni1E4C',\n    7757 => 'uni1E4D',\n    7758 => 'uni1E4E',\n    7759 => 'uni1E4F',\n    7760 => 'uni1E50',\n    7761 => 'uni1E51',\n    7762 => 'uni1E52',\n    7763 => 'uni1E53',\n    7764 => 'uni1E54',\n    7765 => 'uni1E55',\n    7766 => 'uni1E56',\n    7767 => 'uni1E57',\n    7768 => 'uni1E58',\n    7769 => 'uni1E59',\n    7770 => 'uni1E5A',\n    7771 => 'uni1E5B',\n    7772 => 'uni1E5C',\n    7773 => 'uni1E5D',\n    7774 => 'uni1E5E',\n    7775 => 'uni1E5F',\n    7776 => 'uni1E60',\n    7777 => 'uni1E61',\n    7778 => 'uni1E62',\n    7779 => 'uni1E63',\n    7780 => 'uni1E64',\n    7781 => 'uni1E65',\n    7782 => 'uni1E66',\n    7783 => 'uni1E67',\n    7784 => 'uni1E68',\n    7785 => 'uni1E69',\n    7786 => 'uni1E6A',\n    7787 => 'uni1E6B',\n    7788 => 'uni1E6C',\n    7789 => 'uni1E6D',\n    7790 => 'uni1E6E',\n    7791 => 'uni1E6F',\n    7792 => 'uni1E70',\n    7793 => 'uni1E71',\n    7794 => 'uni1E72',\n    7795 => 'uni1E73',\n    7796 => 'uni1E74',\n    7797 => 'uni1E75',\n    7798 => 'uni1E76',\n    7799 => 'uni1E77',\n    7800 => 'uni1E78',\n    7801 => 'uni1E79',\n    7802 => 'uni1E7A',\n    7803 => 'uni1E7B',\n    7804 => 'uni1E7C',\n    7805 => 'uni1E7D',\n    7806 => 'uni1E7E',\n    7807 => 'uni1E7F',\n    7808 => 'Wgrave',\n    7809 => 'wgrave',\n    7810 => 'Wacute',\n    7811 => 'wacute',\n    7812 => 'Wdieresis',\n    7813 => 'wdieresis',\n    7814 => 'uni1E86',\n    7815 => 'uni1E87',\n    7816 => 'uni1E88',\n    7817 => 'uni1E89',\n    7818 => 'uni1E8A',\n    7819 => 'uni1E8B',\n    7820 => 'uni1E8C',\n    7821 => 'uni1E8D',\n    7822 => 'uni1E8E',\n    7823 => 'uni1E8F',\n    7824 => 'uni1E90',\n    7825 => 'uni1E91',\n    7826 => 'uni1E92',\n    7827 => 'uni1E93',\n    7828 => 'uni1E94',\n    7829 => 'uni1E95',\n    7830 => 'uni1E96',\n    7831 => 'uni1E97',\n    7832 => 'uni1E98',\n    7833 => 'uni1E99',\n    7834 => 'uni1E9A',\n    7835 => 'uni1E9B',\n    7836 => 'uni1E9C',\n    7837 => 'uni1E9D',\n    7838 => 'uni1E9E',\n    7839 => 'uni1E9F',\n    7840 => 'uni1EA0',\n    7841 => 'uni1EA1',\n    7842 => 'uni1EA2',\n    7843 => 'uni1EA3',\n    7844 => 'uni1EA4',\n    7845 => 'uni1EA5',\n    7846 => 'uni1EA6',\n    7847 => 'uni1EA7',\n    7848 => 'uni1EA8',\n    7849 => 'uni1EA9',\n    7850 => 'uni1EAA',\n    7851 => 'uni1EAB',\n    7852 => 'uni1EAC',\n    7853 => 'uni1EAD',\n    7854 => 'uni1EAE',\n    7855 => 'uni1EAF',\n    7856 => 'uni1EB0',\n    7857 => 'uni1EB1',\n    7858 => 'uni1EB2',\n    7859 => 'uni1EB3',\n    7860 => 'uni1EB4',\n    7861 => 'uni1EB5',\n    7862 => 'uni1EB6',\n    7863 => 'uni1EB7',\n    7864 => 'uni1EB8',\n    7865 => 'uni1EB9',\n    7866 => 'uni1EBA',\n    7867 => 'uni1EBB',\n    7868 => 'uni1EBC',\n    7869 => 'uni1EBD',\n    7870 => 'uni1EBE',\n    7871 => 'uni1EBF',\n    7872 => 'uni1EC0',\n    7873 => 'uni1EC1',\n    7874 => 'uni1EC2',\n    7875 => 'uni1EC3',\n    7876 => 'uni1EC4',\n    7877 => 'uni1EC5',\n    7878 => 'uni1EC6',\n    7879 => 'uni1EC7',\n    7880 => 'uni1EC8',\n    7881 => 'uni1EC9',\n    7882 => 'uni1ECA',\n    7883 => 'uni1ECB',\n    7884 => 'uni1ECC',\n    7885 => 'uni1ECD',\n    7886 => 'uni1ECE',\n    7887 => 'uni1ECF',\n    7888 => 'uni1ED0',\n    7889 => 'uni1ED1',\n    7890 => 'uni1ED2',\n    7891 => 'uni1ED3',\n    7892 => 'uni1ED4',\n    7893 => 'uni1ED5',\n    7894 => 'uni1ED6',\n    7895 => 'uni1ED7',\n    7896 => 'uni1ED8',\n    7897 => 'uni1ED9',\n    7898 => 'uni1EDA',\n    7899 => 'uni1EDB',\n    7900 => 'uni1EDC',\n    7901 => 'uni1EDD',\n    7902 => 'uni1EDE',\n    7903 => 'uni1EDF',\n    7904 => 'uni1EE0',\n    7905 => 'uni1EE1',\n    7906 => 'uni1EE2',\n    7907 => 'uni1EE3',\n    7908 => 'uni1EE4',\n    7909 => 'uni1EE5',\n    7910 => 'uni1EE6',\n    7911 => 'uni1EE7',\n    7912 => 'uni1EE8',\n    7913 => 'uni1EE9',\n    7914 => 'uni1EEA',\n    7915 => 'uni1EEB',\n    7916 => 'uni1EEC',\n    7917 => 'uni1EED',\n    7918 => 'uni1EEE',\n    7919 => 'uni1EEF',\n    7920 => 'uni1EF0',\n    7921 => 'uni1EF1',\n    7922 => 'Ygrave',\n    7923 => 'ygrave',\n    7924 => 'uni1EF4',\n    7925 => 'uni1EF5',\n    7926 => 'uni1EF6',\n    7927 => 'uni1EF7',\n    7928 => 'uni1EF8',\n    7929 => 'uni1EF9',\n    7930 => 'uni1EFA',\n    7931 => 'uni1EFB',\n    7936 => 'uni1F00',\n    7937 => 'uni1F01',\n    7938 => 'uni1F02',\n    7939 => 'uni1F03',\n    7940 => 'uni1F04',\n    7941 => 'uni1F05',\n    7942 => 'uni1F06',\n    7943 => 'uni1F07',\n    7944 => 'uni1F08',\n    7945 => 'uni1F09',\n    7946 => 'uni1F0A',\n    7947 => 'uni1F0B',\n    7948 => 'uni1F0C',\n    7949 => 'uni1F0D',\n    7950 => 'uni1F0E',\n    7951 => 'uni1F0F',\n    7952 => 'uni1F10',\n    7953 => 'uni1F11',\n    7954 => 'uni1F12',\n    7955 => 'uni1F13',\n    7956 => 'uni1F14',\n    7957 => 'uni1F15',\n    7960 => 'uni1F18',\n    7961 => 'uni1F19',\n    7962 => 'uni1F1A',\n    7963 => 'uni1F1B',\n    7964 => 'uni1F1C',\n    7965 => 'uni1F1D',\n    7968 => 'uni1F20',\n    7969 => 'uni1F21',\n    7970 => 'uni1F22',\n    7971 => 'uni1F23',\n    7972 => 'uni1F24',\n    7973 => 'uni1F25',\n    7974 => 'uni1F26',\n    7975 => 'uni1F27',\n    7976 => 'uni1F28',\n    7977 => 'uni1F29',\n    7978 => 'uni1F2A',\n    7979 => 'uni1F2B',\n    7980 => 'uni1F2C',\n    7981 => 'uni1F2D',\n    7982 => 'uni1F2E',\n    7983 => 'uni1F2F',\n    7984 => 'uni1F30',\n    7985 => 'uni1F31',\n    7986 => 'uni1F32',\n    7987 => 'uni1F33',\n    7988 => 'uni1F34',\n    7989 => 'uni1F35',\n    7990 => 'uni1F36',\n    7991 => 'uni1F37',\n    7992 => 'uni1F38',\n    7993 => 'uni1F39',\n    7994 => 'uni1F3A',\n    7995 => 'uni1F3B',\n    7996 => 'uni1F3C',\n    7997 => 'uni1F3D',\n    7998 => 'uni1F3E',\n    7999 => 'uni1F3F',\n    8000 => 'uni1F40',\n    8001 => 'uni1F41',\n    8002 => 'uni1F42',\n    8003 => 'uni1F43',\n    8004 => 'uni1F44',\n    8005 => 'uni1F45',\n    8008 => 'uni1F48',\n    8009 => 'uni1F49',\n    8010 => 'uni1F4A',\n    8011 => 'uni1F4B',\n    8012 => 'uni1F4C',\n    8013 => 'uni1F4D',\n    8016 => 'uni1F50',\n    8017 => 'uni1F51',\n    8018 => 'uni1F52',\n    8019 => 'uni1F53',\n    8020 => 'uni1F54',\n    8021 => 'uni1F55',\n    8022 => 'uni1F56',\n    8023 => 'uni1F57',\n    8025 => 'uni1F59',\n    8027 => 'uni1F5B',\n    8029 => 'uni1F5D',\n    8031 => 'uni1F5F',\n    8032 => 'uni1F60',\n    8033 => 'uni1F61',\n    8034 => 'uni1F62',\n    8035 => 'uni1F63',\n    8036 => 'uni1F64',\n    8037 => 'uni1F65',\n    8038 => 'uni1F66',\n    8039 => 'uni1F67',\n    8040 => 'uni1F68',\n    8041 => 'uni1F69',\n    8042 => 'uni1F6A',\n    8043 => 'uni1F6B',\n    8044 => 'uni1F6C',\n    8045 => 'uni1F6D',\n    8046 => 'uni1F6E',\n    8047 => 'uni1F6F',\n    8048 => 'uni1F70',\n    8049 => 'uni1F71',\n    8050 => 'uni1F72',\n    8051 => 'uni1F73',\n    8052 => 'uni1F74',\n    8053 => 'uni1F75',\n    8054 => 'uni1F76',\n    8055 => 'uni1F77',\n    8056 => 'uni1F78',\n    8057 => 'uni1F79',\n    8058 => 'uni1F7A',\n    8059 => 'uni1F7B',\n    8060 => 'uni1F7C',\n    8061 => 'uni1F7D',\n    8064 => 'uni1F80',\n    8065 => 'uni1F81',\n    8066 => 'uni1F82',\n    8067 => 'uni1F83',\n    8068 => 'uni1F84',\n    8069 => 'uni1F85',\n    8070 => 'uni1F86',\n    8071 => 'uni1F87',\n    8072 => 'uni1F88',\n    8073 => 'uni1F89',\n    8074 => 'uni1F8A',\n    8075 => 'uni1F8B',\n    8076 => 'uni1F8C',\n    8077 => 'uni1F8D',\n    8078 => 'uni1F8E',\n    8079 => 'uni1F8F',\n    8080 => 'uni1F90',\n    8081 => 'uni1F91',\n    8082 => 'uni1F92',\n    8083 => 'uni1F93',\n    8084 => 'uni1F94',\n    8085 => 'uni1F95',\n    8086 => 'uni1F96',\n    8087 => 'uni1F97',\n    8088 => 'uni1F98',\n    8089 => 'uni1F99',\n    8090 => 'uni1F9A',\n    8091 => 'uni1F9B',\n    8092 => 'uni1F9C',\n    8093 => 'uni1F9D',\n    8094 => 'uni1F9E',\n    8095 => 'uni1F9F',\n    8096 => 'uni1FA0',\n    8097 => 'uni1FA1',\n    8098 => 'uni1FA2',\n    8099 => 'uni1FA3',\n    8100 => 'uni1FA4',\n    8101 => 'uni1FA5',\n    8102 => 'uni1FA6',\n    8103 => 'uni1FA7',\n    8104 => 'uni1FA8',\n    8105 => 'uni1FA9',\n    8106 => 'uni1FAA',\n    8107 => 'uni1FAB',\n    8108 => 'uni1FAC',\n    8109 => 'uni1FAD',\n    8110 => 'uni1FAE',\n    8111 => 'uni1FAF',\n    8112 => 'uni1FB0',\n    8113 => 'uni1FB1',\n    8114 => 'uni1FB2',\n    8115 => 'uni1FB3',\n    8116 => 'uni1FB4',\n    8118 => 'uni1FB6',\n    8119 => 'uni1FB7',\n    8120 => 'uni1FB8',\n    8121 => 'uni1FB9',\n    8122 => 'uni1FBA',\n    8123 => 'uni1FBB',\n    8124 => 'uni1FBC',\n    8125 => 'uni1FBD',\n    8126 => 'uni1FBE',\n    8127 => 'uni1FBF',\n    8128 => 'uni1FC0',\n    8129 => 'uni1FC1',\n    8130 => 'uni1FC2',\n    8131 => 'uni1FC3',\n    8132 => 'uni1FC4',\n    8134 => 'uni1FC6',\n    8135 => 'uni1FC7',\n    8136 => 'uni1FC8',\n    8137 => 'uni1FC9',\n    8138 => 'uni1FCA',\n    8139 => 'uni1FCB',\n    8140 => 'uni1FCC',\n    8141 => 'uni1FCD',\n    8142 => 'uni1FCE',\n    8143 => 'uni1FCF',\n    8144 => 'uni1FD0',\n    8145 => 'uni1FD1',\n    8146 => 'uni1FD2',\n    8147 => 'uni1FD3',\n    8150 => 'uni1FD6',\n    8151 => 'uni1FD7',\n    8152 => 'uni1FD8',\n    8153 => 'uni1FD9',\n    8154 => 'uni1FDA',\n    8155 => 'uni1FDB',\n    8157 => 'uni1FDD',\n    8158 => 'uni1FDE',\n    8159 => 'uni1FDF',\n    8160 => 'uni1FE0',\n    8161 => 'uni1FE1',\n    8162 => 'uni1FE2',\n    8163 => 'uni1FE3',\n    8164 => 'uni1FE4',\n    8165 => 'uni1FE5',\n    8166 => 'uni1FE6',\n    8167 => 'uni1FE7',\n    8168 => 'uni1FE8',\n    8169 => 'uni1FE9',\n    8170 => 'uni1FEA',\n    8171 => 'uni1FEB',\n    8172 => 'uni1FEC',\n    8173 => 'uni1FED',\n    8174 => 'uni1FEE',\n    8175 => 'uni1FEF',\n    8178 => 'uni1FF2',\n    8179 => 'uni1FF3',\n    8180 => 'uni1FF4',\n    8182 => 'uni1FF6',\n    8183 => 'uni1FF7',\n    8184 => 'uni1FF8',\n    8185 => 'uni1FF9',\n    8186 => 'uni1FFA',\n    8187 => 'uni1FFB',\n    8188 => 'uni1FFC',\n    8189 => 'uni1FFD',\n    8190 => 'uni1FFE',\n    8192 => 'uni2000',\n    8193 => 'uni2001',\n    8194 => 'uni2002',\n    8195 => 'uni2003',\n    8196 => 'uni2004',\n    8197 => 'uni2005',\n    8198 => 'uni2006',\n    8199 => 'uni2007',\n    8200 => 'uni2008',\n    8201 => 'uni2009',\n    8202 => 'uni200A',\n    8203 => 'uni200B',\n    8204 => 'uni200C',\n    8205 => 'uni200D',\n    8206 => 'uni200E',\n    8207 => 'uni200F',\n    8208 => 'uni2010',\n    8209 => 'uni2011',\n    8210 => 'figuredash',\n    8211 => 'endash',\n    8212 => 'emdash',\n    8213 => 'uni2015',\n    8214 => 'uni2016',\n    8215 => 'underscoredbl',\n    8216 => 'quoteleft',\n    8217 => 'quoteright',\n    8218 => 'quotesinglbase',\n    8219 => 'quotereversed',\n    8220 => 'quotedblleft',\n    8221 => 'quotedblright',\n    8222 => 'quotedblbase',\n    8223 => 'uni201F',\n    8224 => 'dagger',\n    8225 => 'daggerdbl',\n    8226 => 'bullet',\n    8227 => 'uni2023',\n    8228 => 'onedotenleader',\n    8229 => 'twodotenleader',\n    8230 => 'ellipsis',\n    8231 => 'uni2027',\n    8232 => 'uni2028',\n    8233 => 'uni2029',\n    8234 => 'uni202A',\n    8235 => 'uni202B',\n    8236 => 'uni202C',\n    8237 => 'uni202D',\n    8238 => 'uni202E',\n    8239 => 'uni202F',\n    8240 => 'perthousand',\n    8241 => 'uni2031',\n    8242 => 'minute',\n    8243 => 'second',\n    8244 => 'uni2034',\n    8245 => 'uni2035',\n    8246 => 'uni2036',\n    8247 => 'uni2037',\n    8248 => 'uni2038',\n    8249 => 'guilsinglleft',\n    8250 => 'guilsinglright',\n    8251 => 'uni203B',\n    8252 => 'exclamdbl',\n    8253 => 'uni203D',\n    8254 => 'uni203E',\n    8255 => 'uni203F',\n    8256 => 'uni2040',\n    8257 => 'uni2041',\n    8258 => 'uni2042',\n    8259 => 'uni2043',\n    8260 => 'fraction',\n    8261 => 'uni2045',\n    8262 => 'uni2046',\n    8263 => 'uni2047',\n    8264 => 'uni2048',\n    8265 => 'uni2049',\n    8266 => 'uni204A',\n    8267 => 'uni204B',\n    8268 => 'uni204C',\n    8269 => 'uni204D',\n    8270 => 'uni204E',\n    8271 => 'uni204F',\n    8272 => 'uni2050',\n    8273 => 'uni2051',\n    8274 => 'uni2052',\n    8275 => 'uni2053',\n    8276 => 'uni2054',\n    8277 => 'uni2055',\n    8278 => 'uni2056',\n    8279 => 'uni2057',\n    8280 => 'uni2058',\n    8281 => 'uni2059',\n    8282 => 'uni205A',\n    8283 => 'uni205B',\n    8284 => 'uni205C',\n    8285 => 'uni205D',\n    8286 => 'uni205E',\n    8287 => 'uni205F',\n    8288 => 'uni2060',\n    8289 => 'uni2061',\n    8290 => 'uni2062',\n    8291 => 'uni2063',\n    8292 => 'uni2064',\n    8298 => 'uni206A',\n    8299 => 'uni206B',\n    8300 => 'uni206C',\n    8301 => 'uni206D',\n    8302 => 'uni206E',\n    8303 => 'uni206F',\n    8304 => 'uni2070',\n    8305 => 'uni2071',\n    8308 => 'uni2074',\n    8309 => 'uni2075',\n    8310 => 'uni2076',\n    8311 => 'uni2077',\n    8312 => 'uni2078',\n    8313 => 'uni2079',\n    8314 => 'uni207A',\n    8315 => 'uni207B',\n    8316 => 'uni207C',\n    8317 => 'uni207D',\n    8318 => 'uni207E',\n    8319 => 'uni207F',\n    8320 => 'uni2080',\n    8321 => 'uni2081',\n    8322 => 'uni2082',\n    8323 => 'uni2083',\n    8324 => 'uni2084',\n    8325 => 'uni2085',\n    8326 => 'uni2086',\n    8327 => 'uni2087',\n    8328 => 'uni2088',\n    8329 => 'uni2089',\n    8330 => 'uni208A',\n    8331 => 'uni208B',\n    8332 => 'uni208C',\n    8333 => 'uni208D',\n    8334 => 'uni208E',\n    8336 => 'uni2090',\n    8337 => 'uni2091',\n    8338 => 'uni2092',\n    8339 => 'uni2093',\n    8340 => 'uni2094',\n    8341 => 'uni2095',\n    8342 => 'uni2096',\n    8343 => 'uni2097',\n    8344 => 'uni2098',\n    8345 => 'uni2099',\n    8346 => 'uni209A',\n    8347 => 'uni209B',\n    8348 => 'uni209C',\n    8352 => 'uni20A0',\n    8353 => 'colonmonetary',\n    8354 => 'uni20A2',\n    8355 => 'franc',\n    8356 => 'lira',\n    8357 => 'uni20A5',\n    8358 => 'uni20A6',\n    8359 => 'peseta',\n    8360 => 'uni20A8',\n    8361 => 'uni20A9',\n    8362 => 'uni20AA',\n    8363 => 'dong',\n    8364 => 'Euro',\n    8365 => 'uni20AD',\n    8366 => 'uni20AE',\n    8367 => 'uni20AF',\n    8368 => 'uni20B0',\n    8369 => 'uni20B1',\n    8370 => 'uni20B2',\n    8371 => 'uni20B3',\n    8372 => 'uni20B4',\n    8373 => 'uni20B5',\n    8376 => 'uni20B8',\n    8377 => 'uni20B9',\n    8378 => 'uni20BA',\n    8381 => 'uni20BD',\n    8400 => 'uni20D0',\n    8401 => 'uni20D1',\n    8406 => 'uni20D6',\n    8407 => 'uni20D7',\n    8411 => 'uni20DB',\n    8412 => 'uni20DC',\n    8417 => 'uni20E1',\n    8448 => 'uni2100',\n    8449 => 'uni2101',\n    8450 => 'uni2102',\n    8451 => 'uni2103',\n    8452 => 'uni2104',\n    8453 => 'uni2105',\n    8454 => 'uni2106',\n    8455 => 'uni2107',\n    8456 => 'uni2108',\n    8457 => 'uni2109',\n    8459 => 'uni210B',\n    8460 => 'uni210C',\n    8461 => 'uni210D',\n    8462 => 'uni210E',\n    8463 => 'uni210F',\n    8464 => 'uni2110',\n    8465 => 'Ifraktur',\n    8466 => 'uni2112',\n    8467 => 'uni2113',\n    8468 => 'uni2114',\n    8469 => 'uni2115',\n    8470 => 'uni2116',\n    8471 => 'uni2117',\n    8472 => 'weierstrass',\n    8473 => 'uni2119',\n    8474 => 'uni211A',\n    8475 => 'uni211B',\n    8476 => 'Rfraktur',\n    8477 => 'uni211D',\n    8478 => 'prescription',\n    8479 => 'uni211F',\n    8480 => 'uni2120',\n    8481 => 'uni2121',\n    8482 => 'trademark',\n    8483 => 'uni2123',\n    8484 => 'uni2124',\n    8485 => 'uni2125',\n    8486 => 'uni2126',\n    8487 => 'uni2127',\n    8488 => 'uni2128',\n    8489 => 'uni2129',\n    8490 => 'uni212A',\n    8491 => 'uni212B',\n    8492 => 'uni212C',\n    8493 => 'uni212D',\n    8494 => 'estimated',\n    8495 => 'uni212F',\n    8496 => 'uni2130',\n    8497 => 'uni2131',\n    8498 => 'uni2132',\n    8499 => 'uni2133',\n    8500 => 'uni2134',\n    8501 => 'aleph',\n    8502 => 'uni2136',\n    8503 => 'uni2137',\n    8504 => 'uni2138',\n    8505 => 'uni2139',\n    8506 => 'uni213A',\n    8507 => 'uni213B',\n    8508 => 'uni213C',\n    8509 => 'uni213D',\n    8510 => 'uni213E',\n    8511 => 'uni213F',\n    8512 => 'uni2140',\n    8513 => 'uni2141',\n    8514 => 'uni2142',\n    8515 => 'uni2143',\n    8516 => 'uni2144',\n    8517 => 'uni2145',\n    8518 => 'uni2146',\n    8519 => 'uni2147',\n    8520 => 'uni2148',\n    8521 => 'uni2149',\n    8523 => 'uni214B',\n    8526 => 'uni214E',\n    8528 => 'uni2150',\n    8529 => 'uni2151',\n    8530 => 'uni2152',\n    8531 => 'onethird',\n    8532 => 'twothirds',\n    8533 => 'uni2155',\n    8534 => 'uni2156',\n    8535 => 'uni2157',\n    8536 => 'uni2158',\n    8537 => 'uni2159',\n    8538 => 'uni215A',\n    8539 => 'oneeighth',\n    8540 => 'threeeighths',\n    8541 => 'fiveeighths',\n    8542 => 'seveneighths',\n    8543 => 'uni215F',\n    8544 => 'uni2160',\n    8545 => 'uni2161',\n    8546 => 'uni2162',\n    8547 => 'uni2163',\n    8548 => 'uni2164',\n    8549 => 'uni2165',\n    8550 => 'uni2166',\n    8551 => 'uni2167',\n    8552 => 'uni2168',\n    8553 => 'uni2169',\n    8554 => 'uni216A',\n    8555 => 'uni216B',\n    8556 => 'uni216C',\n    8557 => 'uni216D',\n    8558 => 'uni216E',\n    8559 => 'uni216F',\n    8560 => 'uni2170',\n    8561 => 'uni2171',\n    8562 => 'uni2172',\n    8563 => 'uni2173',\n    8564 => 'uni2174',\n    8565 => 'uni2175',\n    8566 => 'uni2176',\n    8567 => 'uni2177',\n    8568 => 'uni2178',\n    8569 => 'uni2179',\n    8570 => 'uni217A',\n    8571 => 'uni217B',\n    8572 => 'uni217C',\n    8573 => 'uni217D',\n    8574 => 'uni217E',\n    8575 => 'uni217F',\n    8576 => 'uni2180',\n    8577 => 'uni2181',\n    8578 => 'uni2182',\n    8579 => 'uni2183',\n    8580 => 'uni2184',\n    8581 => 'uni2185',\n    8585 => 'uni2189',\n    8592 => 'arrowleft',\n    8593 => 'arrowup',\n    8594 => 'arrowright',\n    8595 => 'arrowdown',\n    8596 => 'arrowboth',\n    8597 => 'arrowupdn',\n    8598 => 'uni2196',\n    8599 => 'uni2197',\n    8600 => 'uni2198',\n    8601 => 'uni2199',\n    8602 => 'uni219A',\n    8603 => 'uni219B',\n    8604 => 'uni219C',\n    8605 => 'uni219D',\n    8606 => 'uni219E',\n    8607 => 'uni219F',\n    8608 => 'uni21A0',\n    8609 => 'uni21A1',\n    8610 => 'uni21A2',\n    8611 => 'uni21A3',\n    8612 => 'uni21A4',\n    8613 => 'uni21A5',\n    8614 => 'uni21A6',\n    8615 => 'uni21A7',\n    8616 => 'arrowupdnbse',\n    8617 => 'uni21A9',\n    8618 => 'uni21AA',\n    8619 => 'uni21AB',\n    8620 => 'uni21AC',\n    8621 => 'uni21AD',\n    8622 => 'uni21AE',\n    8623 => 'uni21AF',\n    8624 => 'uni21B0',\n    8625 => 'uni21B1',\n    8626 => 'uni21B2',\n    8627 => 'uni21B3',\n    8628 => 'uni21B4',\n    8629 => 'carriagereturn',\n    8630 => 'uni21B6',\n    8631 => 'uni21B7',\n    8632 => 'uni21B8',\n    8633 => 'uni21B9',\n    8634 => 'uni21BA',\n    8635 => 'uni21BB',\n    8636 => 'uni21BC',\n    8637 => 'uni21BD',\n    8638 => 'uni21BE',\n    8639 => 'uni21BF',\n    8640 => 'uni21C0',\n    8641 => 'uni21C1',\n    8642 => 'uni21C2',\n    8643 => 'uni21C3',\n    8644 => 'uni21C4',\n    8645 => 'uni21C5',\n    8646 => 'uni21C6',\n    8647 => 'uni21C7',\n    8648 => 'uni21C8',\n    8649 => 'uni21C9',\n    8650 => 'uni21CA',\n    8651 => 'uni21CB',\n    8652 => 'uni21CC',\n    8653 => 'uni21CD',\n    8654 => 'uni21CE',\n    8655 => 'uni21CF',\n    8656 => 'arrowdblleft',\n    8657 => 'arrowdblup',\n    8658 => 'arrowdblright',\n    8659 => 'arrowdbldown',\n    8660 => 'arrowdblboth',\n    8661 => 'uni21D5',\n    8662 => 'uni21D6',\n    8663 => 'uni21D7',\n    8664 => 'uni21D8',\n    8665 => 'uni21D9',\n    8666 => 'uni21DA',\n    8667 => 'uni21DB',\n    8668 => 'uni21DC',\n    8669 => 'uni21DD',\n    8670 => 'uni21DE',\n    8671 => 'uni21DF',\n    8672 => 'uni21E0',\n    8673 => 'uni21E1',\n    8674 => 'uni21E2',\n    8675 => 'uni21E3',\n    8676 => 'uni21E4',\n    8677 => 'uni21E5',\n    8678 => 'uni21E6',\n    8679 => 'uni21E7',\n    8680 => 'uni21E8',\n    8681 => 'uni21E9',\n    8682 => 'uni21EA',\n    8683 => 'uni21EB',\n    8684 => 'uni21EC',\n    8685 => 'uni21ED',\n    8686 => 'uni21EE',\n    8687 => 'uni21EF',\n    8688 => 'uni21F0',\n    8689 => 'uni21F1',\n    8690 => 'uni21F2',\n    8691 => 'uni21F3',\n    8692 => 'uni21F4',\n    8693 => 'uni21F5',\n    8694 => 'uni21F6',\n    8695 => 'uni21F7',\n    8696 => 'uni21F8',\n    8697 => 'uni21F9',\n    8698 => 'uni21FA',\n    8699 => 'uni21FB',\n    8700 => 'uni21FC',\n    8701 => 'uni21FD',\n    8702 => 'uni21FE',\n    8703 => 'uni21FF',\n    8704 => 'universal',\n    8705 => 'uni2201',\n    8706 => 'partialdiff',\n    8707 => 'existential',\n    8708 => 'uni2204',\n    8709 => 'emptyset',\n    8710 => 'increment',\n    8711 => 'gradient',\n    8712 => 'element',\n    8713 => 'notelement',\n    8714 => 'uni220A',\n    8715 => 'suchthat',\n    8716 => 'uni220C',\n    8717 => 'uni220D',\n    8718 => 'uni220E',\n    8719 => 'product',\n    8720 => 'uni2210',\n    8721 => 'summation',\n    8722 => 'minus',\n    8723 => 'uni2213',\n    8724 => 'uni2214',\n    8725 => 'uni2215',\n    8726 => 'uni2216',\n    8727 => 'asteriskmath',\n    8728 => 'uni2218',\n    8729 => 'uni2219',\n    8730 => 'radical',\n    8731 => 'uni221B',\n    8732 => 'uni221C',\n    8733 => 'proportional',\n    8734 => 'infinity',\n    8735 => 'orthogonal',\n    8736 => 'angle',\n    8737 => 'uni2221',\n    8738 => 'uni2222',\n    8739 => 'uni2223',\n    8740 => 'uni2224',\n    8741 => 'uni2225',\n    8742 => 'uni2226',\n    8743 => 'logicaland',\n    8744 => 'logicalor',\n    8745 => 'intersection',\n    8746 => 'union',\n    8747 => 'integral',\n    8748 => 'uni222C',\n    8749 => 'uni222D',\n    8750 => 'uni222E',\n    8751 => 'uni222F',\n    8752 => 'uni2230',\n    8753 => 'uni2231',\n    8754 => 'uni2232',\n    8755 => 'uni2233',\n    8756 => 'therefore',\n    8757 => 'uni2235',\n    8758 => 'uni2236',\n    8759 => 'uni2237',\n    8760 => 'uni2238',\n    8761 => 'uni2239',\n    8762 => 'uni223A',\n    8763 => 'uni223B',\n    8764 => 'similar',\n    8765 => 'uni223D',\n    8766 => 'uni223E',\n    8767 => 'uni223F',\n    8768 => 'uni2240',\n    8769 => 'uni2241',\n    8770 => 'uni2242',\n    8771 => 'uni2243',\n    8772 => 'uni2244',\n    8773 => 'congruent',\n    8774 => 'uni2246',\n    8775 => 'uni2247',\n    8776 => 'approxequal',\n    8777 => 'uni2249',\n    8778 => 'uni224A',\n    8779 => 'uni224B',\n    8780 => 'uni224C',\n    8781 => 'uni224D',\n    8782 => 'uni224E',\n    8783 => 'uni224F',\n    8784 => 'uni2250',\n    8785 => 'uni2251',\n    8786 => 'uni2252',\n    8787 => 'uni2253',\n    8788 => 'uni2254',\n    8789 => 'uni2255',\n    8790 => 'uni2256',\n    8791 => 'uni2257',\n    8792 => 'uni2258',\n    8793 => 'uni2259',\n    8794 => 'uni225A',\n    8795 => 'uni225B',\n    8796 => 'uni225C',\n    8797 => 'uni225D',\n    8798 => 'uni225E',\n    8799 => 'uni225F',\n    8800 => 'notequal',\n    8801 => 'equivalence',\n    8802 => 'uni2262',\n    8803 => 'uni2263',\n    8804 => 'lessequal',\n    8805 => 'greaterequal',\n    8806 => 'uni2266',\n    8807 => 'uni2267',\n    8808 => 'uni2268',\n    8809 => 'uni2269',\n    8810 => 'uni226A',\n    8811 => 'uni226B',\n    8812 => 'uni226C',\n    8813 => 'uni226D',\n    8814 => 'uni226E',\n    8815 => 'uni226F',\n    8816 => 'uni2270',\n    8817 => 'uni2271',\n    8818 => 'uni2272',\n    8819 => 'uni2273',\n    8820 => 'uni2274',\n    8821 => 'uni2275',\n    8822 => 'uni2276',\n    8823 => 'uni2277',\n    8824 => 'uni2278',\n    8825 => 'uni2279',\n    8826 => 'uni227A',\n    8827 => 'uni227B',\n    8828 => 'uni227C',\n    8829 => 'uni227D',\n    8830 => 'uni227E',\n    8831 => 'uni227F',\n    8832 => 'uni2280',\n    8833 => 'uni2281',\n    8834 => 'propersubset',\n    8835 => 'propersuperset',\n    8836 => 'notsubset',\n    8837 => 'uni2285',\n    8838 => 'reflexsubset',\n    8839 => 'reflexsuperset',\n    8840 => 'uni2288',\n    8841 => 'uni2289',\n    8842 => 'uni228A',\n    8843 => 'uni228B',\n    8844 => 'uni228C',\n    8845 => 'uni228D',\n    8846 => 'uni228E',\n    8847 => 'uni228F',\n    8848 => 'uni2290',\n    8849 => 'uni2291',\n    8850 => 'uni2292',\n    8851 => 'uni2293',\n    8852 => 'uni2294',\n    8853 => 'circleplus',\n    8854 => 'uni2296',\n    8855 => 'circlemultiply',\n    8856 => 'uni2298',\n    8857 => 'uni2299',\n    8858 => 'uni229A',\n    8859 => 'uni229B',\n    8860 => 'uni229C',\n    8861 => 'uni229D',\n    8862 => 'uni229E',\n    8863 => 'uni229F',\n    8864 => 'uni22A0',\n    8865 => 'uni22A1',\n    8866 => 'uni22A2',\n    8867 => 'uni22A3',\n    8868 => 'uni22A4',\n    8869 => 'perpendicular',\n    8870 => 'uni22A6',\n    8871 => 'uni22A7',\n    8872 => 'uni22A8',\n    8873 => 'uni22A9',\n    8874 => 'uni22AA',\n    8875 => 'uni22AB',\n    8876 => 'uni22AC',\n    8877 => 'uni22AD',\n    8878 => 'uni22AE',\n    8879 => 'uni22AF',\n    8880 => 'uni22B0',\n    8881 => 'uni22B1',\n    8882 => 'uni22B2',\n    8883 => 'uni22B3',\n    8884 => 'uni22B4',\n    8885 => 'uni22B5',\n    8886 => 'uni22B6',\n    8887 => 'uni22B7',\n    8888 => 'uni22B8',\n    8889 => 'uni22B9',\n    8890 => 'uni22BA',\n    8891 => 'uni22BB',\n    8892 => 'uni22BC',\n    8893 => 'uni22BD',\n    8894 => 'uni22BE',\n    8895 => 'uni22BF',\n    8896 => 'uni22C0',\n    8897 => 'uni22C1',\n    8898 => 'uni22C2',\n    8899 => 'uni22C3',\n    8900 => 'uni22C4',\n    8901 => 'dotmath',\n    8902 => 'uni22C6',\n    8903 => 'uni22C7',\n    8904 => 'uni22C8',\n    8905 => 'uni22C9',\n    8906 => 'uni22CA',\n    8907 => 'uni22CB',\n    8908 => 'uni22CC',\n    8909 => 'uni22CD',\n    8910 => 'uni22CE',\n    8911 => 'uni22CF',\n    8912 => 'uni22D0',\n    8913 => 'uni22D1',\n    8914 => 'uni22D2',\n    8915 => 'uni22D3',\n    8916 => 'uni22D4',\n    8917 => 'uni22D5',\n    8918 => 'uni22D6',\n    8919 => 'uni22D7',\n    8920 => 'uni22D8',\n    8921 => 'uni22D9',\n    8922 => 'uni22DA',\n    8923 => 'uni22DB',\n    8924 => 'uni22DC',\n    8925 => 'uni22DD',\n    8926 => 'uni22DE',\n    8927 => 'uni22DF',\n    8928 => 'uni22E0',\n    8929 => 'uni22E1',\n    8930 => 'uni22E2',\n    8931 => 'uni22E3',\n    8932 => 'uni22E4',\n    8933 => 'uni22E5',\n    8934 => 'uni22E6',\n    8935 => 'uni22E7',\n    8936 => 'uni22E8',\n    8937 => 'uni22E9',\n    8938 => 'uni22EA',\n    8939 => 'uni22EB',\n    8940 => 'uni22EC',\n    8941 => 'uni22ED',\n    8942 => 'uni22EE',\n    8943 => 'uni22EF',\n    8944 => 'uni22F0',\n    8945 => 'uni22F1',\n    8946 => 'uni22F2',\n    8947 => 'uni22F3',\n    8948 => 'uni22F4',\n    8949 => 'uni22F5',\n    8950 => 'uni22F6',\n    8951 => 'uni22F7',\n    8952 => 'uni22F8',\n    8953 => 'uni22F9',\n    8954 => 'uni22FA',\n    8955 => 'uni22FB',\n    8956 => 'uni22FC',\n    8957 => 'uni22FD',\n    8958 => 'uni22FE',\n    8959 => 'uni22FF',\n    8960 => 'uni2300',\n    8961 => 'uni2301',\n    8962 => 'house',\n    8963 => 'uni2303',\n    8964 => 'uni2304',\n    8965 => 'uni2305',\n    8966 => 'uni2306',\n    8967 => 'uni2307',\n    8968 => 'uni2308',\n    8969 => 'uni2309',\n    8970 => 'uni230A',\n    8971 => 'uni230B',\n    8972 => 'uni230C',\n    8973 => 'uni230D',\n    8974 => 'uni230E',\n    8975 => 'uni230F',\n    8976 => 'revlogicalnot',\n    8977 => 'uni2311',\n    8984 => 'uni2318',\n    8985 => 'uni2319',\n    8988 => 'uni231C',\n    8989 => 'uni231D',\n    8990 => 'uni231E',\n    8991 => 'uni231F',\n    8992 => 'integraltp',\n    8993 => 'integralbt',\n    8996 => 'uni2324',\n    8997 => 'uni2325',\n    8998 => 'uni2326',\n    8999 => 'uni2327',\n    9000 => 'uni2328',\n    9003 => 'uni232B',\n    9004 => 'uni232C',\n    9075 => 'uni2373',\n    9076 => 'uni2374',\n    9077 => 'uni2375',\n    9082 => 'uni237A',\n    9085 => 'uni237D',\n    9095 => 'uni2387',\n    9108 => 'uni2394',\n    9115 => 'uni239B',\n    9116 => 'uni239C',\n    9117 => 'uni239D',\n    9118 => 'uni239E',\n    9119 => 'uni239F',\n    9120 => 'uni23A0',\n    9121 => 'uni23A1',\n    9122 => 'uni23A2',\n    9123 => 'uni23A3',\n    9124 => 'uni23A4',\n    9125 => 'uni23A5',\n    9126 => 'uni23A6',\n    9127 => 'uni23A7',\n    9128 => 'uni23A8',\n    9129 => 'uni23A9',\n    9130 => 'uni23AA',\n    9131 => 'uni23AB',\n    9132 => 'uni23AC',\n    9133 => 'uni23AD',\n    9134 => 'uni23AE',\n    9166 => 'uni23CE',\n    9167 => 'uni23CF',\n    9187 => 'uni23E3',\n    9189 => 'uni23E5',\n    9192 => 'uni23E8',\n    9250 => 'uni2422',\n    9251 => 'uni2423',\n    9312 => 'uni2460',\n    9313 => 'uni2461',\n    9314 => 'uni2462',\n    9315 => 'uni2463',\n    9316 => 'uni2464',\n    9317 => 'uni2465',\n    9318 => 'uni2466',\n    9319 => 'uni2467',\n    9320 => 'uni2468',\n    9321 => 'uni2469',\n    9472 => 'SF100000',\n    9473 => 'uni2501',\n    9474 => 'SF110000',\n    9475 => 'uni2503',\n    9476 => 'uni2504',\n    9477 => 'uni2505',\n    9478 => 'uni2506',\n    9479 => 'uni2507',\n    9480 => 'uni2508',\n    9481 => 'uni2509',\n    9482 => 'uni250A',\n    9483 => 'uni250B',\n    9484 => 'SF010000',\n    9485 => 'uni250D',\n    9486 => 'uni250E',\n    9487 => 'uni250F',\n    9488 => 'SF030000',\n    9489 => 'uni2511',\n    9490 => 'uni2512',\n    9491 => 'uni2513',\n    9492 => 'SF020000',\n    9493 => 'uni2515',\n    9494 => 'uni2516',\n    9495 => 'uni2517',\n    9496 => 'SF040000',\n    9497 => 'uni2519',\n    9498 => 'uni251A',\n    9499 => 'uni251B',\n    9500 => 'SF080000',\n    9501 => 'uni251D',\n    9502 => 'uni251E',\n    9503 => 'uni251F',\n    9504 => 'uni2520',\n    9505 => 'uni2521',\n    9506 => 'uni2522',\n    9507 => 'uni2523',\n    9508 => 'SF090000',\n    9509 => 'uni2525',\n    9510 => 'uni2526',\n    9511 => 'uni2527',\n    9512 => 'uni2528',\n    9513 => 'uni2529',\n    9514 => 'uni252A',\n    9515 => 'uni252B',\n    9516 => 'SF060000',\n    9517 => 'uni252D',\n    9518 => 'uni252E',\n    9519 => 'uni252F',\n    9520 => 'uni2530',\n    9521 => 'uni2531',\n    9522 => 'uni2532',\n    9523 => 'uni2533',\n    9524 => 'SF070000',\n    9525 => 'uni2535',\n    9526 => 'uni2536',\n    9527 => 'uni2537',\n    9528 => 'uni2538',\n    9529 => 'uni2539',\n    9530 => 'uni253A',\n    9531 => 'uni253B',\n    9532 => 'SF050000',\n    9533 => 'uni253D',\n    9534 => 'uni253E',\n    9535 => 'uni253F',\n    9536 => 'uni2540',\n    9537 => 'uni2541',\n    9538 => 'uni2542',\n    9539 => 'uni2543',\n    9540 => 'uni2544',\n    9541 => 'uni2545',\n    9542 => 'uni2546',\n    9543 => 'uni2547',\n    9544 => 'uni2548',\n    9545 => 'uni2549',\n    9546 => 'uni254A',\n    9547 => 'uni254B',\n    9548 => 'uni254C',\n    9549 => 'uni254D',\n    9550 => 'uni254E',\n    9551 => 'uni254F',\n    9552 => 'SF430000',\n    9553 => 'SF240000',\n    9554 => 'SF510000',\n    9555 => 'SF520000',\n    9556 => 'SF390000',\n    9557 => 'SF220000',\n    9558 => 'SF210000',\n    9559 => 'SF250000',\n    9560 => 'SF500000',\n    9561 => 'SF490000',\n    9562 => 'SF380000',\n    9563 => 'SF280000',\n    9564 => 'SF270000',\n    9565 => 'SF260000',\n    9566 => 'SF360000',\n    9567 => 'SF370000',\n    9568 => 'SF420000',\n    9569 => 'SF190000',\n    9570 => 'SF200000',\n    9571 => 'SF230000',\n    9572 => 'SF470000',\n    9573 => 'SF480000',\n    9574 => 'SF410000',\n    9575 => 'SF450000',\n    9576 => 'SF460000',\n    9577 => 'SF400000',\n    9578 => 'SF540000',\n    9579 => 'SF530000',\n    9580 => 'SF440000',\n    9581 => 'uni256D',\n    9582 => 'uni256E',\n    9583 => 'uni256F',\n    9584 => 'uni2570',\n    9585 => 'uni2571',\n    9586 => 'uni2572',\n    9587 => 'uni2573',\n    9588 => 'uni2574',\n    9589 => 'uni2575',\n    9590 => 'uni2576',\n    9591 => 'uni2577',\n    9592 => 'uni2578',\n    9593 => 'uni2579',\n    9594 => 'uni257A',\n    9595 => 'uni257B',\n    9596 => 'uni257C',\n    9597 => 'uni257D',\n    9598 => 'uni257E',\n    9599 => 'uni257F',\n    9600 => 'upblock',\n    9601 => 'uni2581',\n    9602 => 'uni2582',\n    9603 => 'uni2583',\n    9604 => 'dnblock',\n    9605 => 'uni2585',\n    9606 => 'uni2586',\n    9607 => 'uni2587',\n    9608 => 'block',\n    9609 => 'uni2589',\n    9610 => 'uni258A',\n    9611 => 'uni258B',\n    9612 => 'lfblock',\n    9613 => 'uni258D',\n    9614 => 'uni258E',\n    9615 => 'uni258F',\n    9616 => 'rtblock',\n    9617 => 'ltshade',\n    9618 => 'shade',\n    9619 => 'dkshade',\n    9620 => 'uni2594',\n    9621 => 'uni2595',\n    9622 => 'uni2596',\n    9623 => 'uni2597',\n    9624 => 'uni2598',\n    9625 => 'uni2599',\n    9626 => 'uni259A',\n    9627 => 'uni259B',\n    9628 => 'uni259C',\n    9629 => 'uni259D',\n    9630 => 'uni259E',\n    9631 => 'uni259F',\n    9632 => 'filledbox',\n    9633 => 'H22073',\n    9634 => 'uni25A2',\n    9635 => 'uni25A3',\n    9636 => 'uni25A4',\n    9637 => 'uni25A5',\n    9638 => 'uni25A6',\n    9639 => 'uni25A7',\n    9640 => 'uni25A8',\n    9641 => 'uni25A9',\n    9642 => 'H18543',\n    9643 => 'H18551',\n    9644 => 'filledrect',\n    9645 => 'uni25AD',\n    9646 => 'uni25AE',\n    9647 => 'uni25AF',\n    9648 => 'uni25B0',\n    9649 => 'uni25B1',\n    9650 => 'triagup',\n    9651 => 'uni25B3',\n    9652 => 'uni25B4',\n    9653 => 'uni25B5',\n    9654 => 'uni25B6',\n    9655 => 'uni25B7',\n    9656 => 'uni25B8',\n    9657 => 'uni25B9',\n    9658 => 'triagrt',\n    9659 => 'uni25BB',\n    9660 => 'triagdn',\n    9661 => 'uni25BD',\n    9662 => 'uni25BE',\n    9663 => 'uni25BF',\n    9664 => 'uni25C0',\n    9665 => 'uni25C1',\n    9666 => 'uni25C2',\n    9667 => 'uni25C3',\n    9668 => 'triaglf',\n    9669 => 'uni25C5',\n    9670 => 'uni25C6',\n    9671 => 'uni25C7',\n    9672 => 'uni25C8',\n    9673 => 'uni25C9',\n    9674 => 'lozenge',\n    9675 => 'circle',\n    9676 => 'uni25CC',\n    9677 => 'uni25CD',\n    9678 => 'uni25CE',\n    9679 => 'H18533',\n    9680 => 'uni25D0',\n    9681 => 'uni25D1',\n    9682 => 'uni25D2',\n    9683 => 'uni25D3',\n    9684 => 'uni25D4',\n    9685 => 'uni25D5',\n    9686 => 'uni25D6',\n    9687 => 'uni25D7',\n    9688 => 'invbullet',\n    9689 => 'invcircle',\n    9690 => 'uni25DA',\n    9691 => 'uni25DB',\n    9692 => 'uni25DC',\n    9693 => 'uni25DD',\n    9694 => 'uni25DE',\n    9695 => 'uni25DF',\n    9696 => 'uni25E0',\n    9697 => 'uni25E1',\n    9698 => 'uni25E2',\n    9699 => 'uni25E3',\n    9700 => 'uni25E4',\n    9701 => 'uni25E5',\n    9702 => 'openbullet',\n    9703 => 'uni25E7',\n    9704 => 'uni25E8',\n    9705 => 'uni25E9',\n    9706 => 'uni25EA',\n    9707 => 'uni25EB',\n    9708 => 'uni25EC',\n    9709 => 'uni25ED',\n    9710 => 'uni25EE',\n    9711 => 'uni25EF',\n    9712 => 'uni25F0',\n    9713 => 'uni25F1',\n    9714 => 'uni25F2',\n    9715 => 'uni25F3',\n    9716 => 'uni25F4',\n    9717 => 'uni25F5',\n    9718 => 'uni25F6',\n    9719 => 'uni25F7',\n    9720 => 'uni25F8',\n    9721 => 'uni25F9',\n    9722 => 'uni25FA',\n    9723 => 'uni25FB',\n    9724 => 'uni25FC',\n    9725 => 'uni25FD',\n    9726 => 'uni25FE',\n    9727 => 'uni25FF',\n    9728 => 'uni2600',\n    9729 => 'uni2601',\n    9730 => 'uni2602',\n    9731 => 'uni2603',\n    9732 => 'uni2604',\n    9733 => 'uni2605',\n    9734 => 'uni2606',\n    9735 => 'uni2607',\n    9736 => 'uni2608',\n    9737 => 'uni2609',\n    9738 => 'uni260A',\n    9739 => 'uni260B',\n    9740 => 'uni260C',\n    9741 => 'uni260D',\n    9742 => 'uni260E',\n    9743 => 'uni260F',\n    9744 => 'uni2610',\n    9745 => 'uni2611',\n    9746 => 'uni2612',\n    9747 => 'uni2613',\n    9748 => 'uni2614',\n    9749 => 'uni2615',\n    9750 => 'uni2616',\n    9751 => 'uni2617',\n    9752 => 'uni2618',\n    9753 => 'uni2619',\n    9754 => 'uni261A',\n    9755 => 'uni261B',\n    9756 => 'uni261C',\n    9757 => 'uni261D',\n    9758 => 'uni261E',\n    9759 => 'uni261F',\n    9760 => 'uni2620',\n    9761 => 'uni2621',\n    9762 => 'uni2622',\n    9763 => 'uni2623',\n    9764 => 'uni2624',\n    9765 => 'uni2625',\n    9766 => 'uni2626',\n    9767 => 'uni2627',\n    9768 => 'uni2628',\n    9769 => 'uni2629',\n    9770 => 'uni262A',\n    9771 => 'uni262B',\n    9772 => 'uni262C',\n    9773 => 'uni262D',\n    9774 => 'uni262E',\n    9775 => 'uni262F',\n    9776 => 'uni2630',\n    9777 => 'uni2631',\n    9778 => 'uni2632',\n    9779 => 'uni2633',\n    9780 => 'uni2634',\n    9781 => 'uni2635',\n    9782 => 'uni2636',\n    9783 => 'uni2637',\n    9784 => 'uni2638',\n    9785 => 'uni2639',\n    9786 => 'smileface',\n    9787 => 'invsmileface',\n    9788 => 'sun',\n    9789 => 'uni263D',\n    9790 => 'uni263E',\n    9791 => 'uni263F',\n    9792 => 'female',\n    9793 => 'uni2641',\n    9794 => 'male',\n    9795 => 'uni2643',\n    9796 => 'uni2644',\n    9797 => 'uni2645',\n    9798 => 'uni2646',\n    9799 => 'uni2647',\n    9800 => 'uni2648',\n    9801 => 'uni2649',\n    9802 => 'uni264A',\n    9803 => 'uni264B',\n    9804 => 'uni264C',\n    9805 => 'uni264D',\n    9806 => 'uni264E',\n    9807 => 'uni264F',\n    9808 => 'uni2650',\n    9809 => 'uni2651',\n    9810 => 'uni2652',\n    9811 => 'uni2653',\n    9812 => 'uni2654',\n    9813 => 'uni2655',\n    9814 => 'uni2656',\n    9815 => 'uni2657',\n    9816 => 'uni2658',\n    9817 => 'uni2659',\n    9818 => 'uni265A',\n    9819 => 'uni265B',\n    9820 => 'uni265C',\n    9821 => 'uni265D',\n    9822 => 'uni265E',\n    9823 => 'uni265F',\n    9824 => 'spade',\n    9825 => 'uni2661',\n    9826 => 'uni2662',\n    9827 => 'club',\n    9828 => 'uni2664',\n    9829 => 'heart',\n    9830 => 'diamond',\n    9831 => 'uni2667',\n    9832 => 'uni2668',\n    9833 => 'uni2669',\n    9834 => 'musicalnote',\n    9835 => 'musicalnotedbl',\n    9836 => 'uni266C',\n    9837 => 'uni266D',\n    9838 => 'uni266E',\n    9839 => 'uni266F',\n    9840 => 'uni2670',\n    9841 => 'uni2671',\n    9842 => 'uni2672',\n    9843 => 'uni2673',\n    9844 => 'uni2674',\n    9845 => 'uni2675',\n    9846 => 'uni2676',\n    9847 => 'uni2677',\n    9848 => 'uni2678',\n    9849 => 'uni2679',\n    9850 => 'uni267A',\n    9851 => 'uni267B',\n    9852 => 'uni267C',\n    9853 => 'uni267D',\n    9854 => 'uni267E',\n    9855 => 'uni267F',\n    9856 => 'uni2680',\n    9857 => 'uni2681',\n    9858 => 'uni2682',\n    9859 => 'uni2683',\n    9860 => 'uni2684',\n    9861 => 'uni2685',\n    9862 => 'uni2686',\n    9863 => 'uni2687',\n    9864 => 'uni2688',\n    9865 => 'uni2689',\n    9866 => 'uni268A',\n    9867 => 'uni268B',\n    9868 => 'uni268C',\n    9869 => 'uni268D',\n    9870 => 'uni268E',\n    9871 => 'uni268F',\n    9872 => 'uni2690',\n    9873 => 'uni2691',\n    9874 => 'uni2692',\n    9875 => 'uni2693',\n    9876 => 'uni2694',\n    9877 => 'uni2695',\n    9878 => 'uni2696',\n    9879 => 'uni2697',\n    9880 => 'uni2698',\n    9881 => 'uni2699',\n    9882 => 'uni269A',\n    9883 => 'uni269B',\n    9884 => 'uni269C',\n    9886 => 'uni269E',\n    9887 => 'uni269F',\n    9888 => 'uni26A0',\n    9889 => 'uni26A1',\n    9890 => 'uni26A2',\n    9891 => 'uni26A3',\n    9892 => 'uni26A4',\n    9893 => 'uni26A5',\n    9894 => 'uni26A6',\n    9895 => 'uni26A7',\n    9896 => 'uni26A8',\n    9897 => 'uni26A9',\n    9898 => 'uni26AA',\n    9899 => 'uni26AB',\n    9900 => 'uni26AC',\n    9901 => 'uni26AD',\n    9902 => 'uni26AE',\n    9903 => 'uni26AF',\n    9904 => 'uni26B0',\n    9905 => 'uni26B1',\n    9906 => 'uni26B2',\n    9907 => 'uni26B3',\n    9908 => 'uni26B4',\n    9909 => 'uni26B5',\n    9910 => 'uni26B6',\n    9911 => 'uni26B7',\n    9912 => 'uni26B8',\n    9920 => 'uni26C0',\n    9921 => 'uni26C1',\n    9922 => 'uni26C2',\n    9923 => 'uni26C3',\n    9954 => 'uni26E2',\n    9985 => 'uni2701',\n    9986 => 'uni2702',\n    9987 => 'uni2703',\n    9988 => 'uni2704',\n    9990 => 'uni2706',\n    9991 => 'uni2707',\n    9992 => 'uni2708',\n    9993 => 'uni2709',\n    9996 => 'uni270C',\n    9997 => 'uni270D',\n    9998 => 'uni270E',\n    9999 => 'uni270F',\n    10000 => 'uni2710',\n    10001 => 'uni2711',\n    10002 => 'uni2712',\n    10003 => 'uni2713',\n    10004 => 'uni2714',\n    10005 => 'uni2715',\n    10006 => 'uni2716',\n    10007 => 'uni2717',\n    10008 => 'uni2718',\n    10009 => 'uni2719',\n    10010 => 'uni271A',\n    10011 => 'uni271B',\n    10012 => 'uni271C',\n    10013 => 'uni271D',\n    10014 => 'uni271E',\n    10015 => 'uni271F',\n    10016 => 'uni2720',\n    10017 => 'uni2721',\n    10018 => 'uni2722',\n    10019 => 'uni2723',\n    10020 => 'uni2724',\n    10021 => 'uni2725',\n    10022 => 'uni2726',\n    10023 => 'uni2727',\n    10025 => 'uni2729',\n    10026 => 'uni272A',\n    10027 => 'uni272B',\n    10028 => 'uni272C',\n    10029 => 'uni272D',\n    10030 => 'uni272E',\n    10031 => 'uni272F',\n    10032 => 'uni2730',\n    10033 => 'uni2731',\n    10034 => 'uni2732',\n    10035 => 'uni2733',\n    10036 => 'uni2734',\n    10037 => 'uni2735',\n    10038 => 'uni2736',\n    10039 => 'uni2737',\n    10040 => 'uni2738',\n    10041 => 'uni2739',\n    10042 => 'uni273A',\n    10043 => 'uni273B',\n    10044 => 'uni273C',\n    10045 => 'uni273D',\n    10046 => 'uni273E',\n    10047 => 'uni273F',\n    10048 => 'uni2740',\n    10049 => 'uni2741',\n    10050 => 'uni2742',\n    10051 => 'uni2743',\n    10052 => 'uni2744',\n    10053 => 'uni2745',\n    10054 => 'uni2746',\n    10055 => 'uni2747',\n    10056 => 'uni2748',\n    10057 => 'uni2749',\n    10058 => 'uni274A',\n    10059 => 'uni274B',\n    10061 => 'uni274D',\n    10063 => 'uni274F',\n    10064 => 'uni2750',\n    10065 => 'uni2751',\n    10066 => 'uni2752',\n    10070 => 'uni2756',\n    10072 => 'uni2758',\n    10073 => 'uni2759',\n    10074 => 'uni275A',\n    10075 => 'uni275B',\n    10076 => 'uni275C',\n    10077 => 'uni275D',\n    10078 => 'uni275E',\n    10081 => 'uni2761',\n    10082 => 'uni2762',\n    10083 => 'uni2763',\n    10084 => 'uni2764',\n    10085 => 'uni2765',\n    10086 => 'uni2766',\n    10087 => 'uni2767',\n    10088 => 'uni2768',\n    10089 => 'uni2769',\n    10090 => 'uni276A',\n    10091 => 'uni276B',\n    10092 => 'uni276C',\n    10093 => 'uni276D',\n    10094 => 'uni276E',\n    10095 => 'uni276F',\n    10096 => 'uni2770',\n    10097 => 'uni2771',\n    10098 => 'uni2772',\n    10099 => 'uni2773',\n    10100 => 'uni2774',\n    10101 => 'uni2775',\n    10102 => 'uni2776',\n    10103 => 'uni2777',\n    10104 => 'uni2778',\n    10105 => 'uni2779',\n    10106 => 'uni277A',\n    10107 => 'uni277B',\n    10108 => 'uni277C',\n    10109 => 'uni277D',\n    10110 => 'uni277E',\n    10111 => 'uni277F',\n    10112 => 'uni2780',\n    10113 => 'uni2781',\n    10114 => 'uni2782',\n    10115 => 'uni2783',\n    10116 => 'uni2784',\n    10117 => 'uni2785',\n    10118 => 'uni2786',\n    10119 => 'uni2787',\n    10120 => 'uni2788',\n    10121 => 'uni2789',\n    10122 => 'uni278A',\n    10123 => 'uni278B',\n    10124 => 'uni278C',\n    10125 => 'uni278D',\n    10126 => 'uni278E',\n    10127 => 'uni278F',\n    10128 => 'uni2790',\n    10129 => 'uni2791',\n    10130 => 'uni2792',\n    10131 => 'uni2793',\n    10132 => 'uni2794',\n    10136 => 'uni2798',\n    10137 => 'uni2799',\n    10138 => 'uni279A',\n    10139 => 'uni279B',\n    10140 => 'uni279C',\n    10141 => 'uni279D',\n    10142 => 'uni279E',\n    10143 => 'uni279F',\n    10144 => 'uni27A0',\n    10145 => 'uni27A1',\n    10146 => 'uni27A2',\n    10147 => 'uni27A3',\n    10148 => 'uni27A4',\n    10149 => 'uni27A5',\n    10150 => 'uni27A6',\n    10151 => 'uni27A7',\n    10152 => 'uni27A8',\n    10153 => 'uni27A9',\n    10154 => 'uni27AA',\n    10155 => 'uni27AB',\n    10156 => 'uni27AC',\n    10157 => 'uni27AD',\n    10158 => 'uni27AE',\n    10159 => 'uni27AF',\n    10161 => 'uni27B1',\n    10162 => 'uni27B2',\n    10163 => 'uni27B3',\n    10164 => 'uni27B4',\n    10165 => 'uni27B5',\n    10166 => 'uni27B6',\n    10167 => 'uni27B7',\n    10168 => 'uni27B8',\n    10169 => 'uni27B9',\n    10170 => 'uni27BA',\n    10171 => 'uni27BB',\n    10172 => 'uni27BC',\n    10173 => 'uni27BD',\n    10174 => 'uni27BE',\n    10181 => 'uni27C5',\n    10182 => 'uni27C6',\n    10208 => 'uni27E0',\n    10214 => 'uni27E6',\n    10215 => 'uni27E7',\n    10216 => 'uni27E8',\n    10217 => 'uni27E9',\n    10218 => 'uni27EA',\n    10219 => 'uni27EB',\n    10224 => 'uni27F0',\n    10225 => 'uni27F1',\n    10226 => 'uni27F2',\n    10227 => 'uni27F3',\n    10228 => 'uni27F4',\n    10229 => 'uni27F5',\n    10230 => 'uni27F6',\n    10231 => 'uni27F7',\n    10232 => 'uni27F8',\n    10233 => 'uni27F9',\n    10234 => 'uni27FA',\n    10235 => 'uni27FB',\n    10236 => 'uni27FC',\n    10237 => 'uni27FD',\n    10238 => 'uni27FE',\n    10239 => 'uni27FF',\n    10240 => 'uni2800',\n    10241 => 'uni2801',\n    10242 => 'uni2802',\n    10243 => 'uni2803',\n    10244 => 'uni2804',\n    10245 => 'uni2805',\n    10246 => 'uni2806',\n    10247 => 'uni2807',\n    10248 => 'uni2808',\n    10249 => 'uni2809',\n    10250 => 'uni280A',\n    10251 => 'uni280B',\n    10252 => 'uni280C',\n    10253 => 'uni280D',\n    10254 => 'uni280E',\n    10255 => 'uni280F',\n    10256 => 'uni2810',\n    10257 => 'uni2811',\n    10258 => 'uni2812',\n    10259 => 'uni2813',\n    10260 => 'uni2814',\n    10261 => 'uni2815',\n    10262 => 'uni2816',\n    10263 => 'uni2817',\n    10264 => 'uni2818',\n    10265 => 'uni2819',\n    10266 => 'uni281A',\n    10267 => 'uni281B',\n    10268 => 'uni281C',\n    10269 => 'uni281D',\n    10270 => 'uni281E',\n    10271 => 'uni281F',\n    10272 => 'uni2820',\n    10273 => 'uni2821',\n    10274 => 'uni2822',\n    10275 => 'uni2823',\n    10276 => 'uni2824',\n    10277 => 'uni2825',\n    10278 => 'uni2826',\n    10279 => 'uni2827',\n    10280 => 'uni2828',\n    10281 => 'uni2829',\n    10282 => 'uni282A',\n    10283 => 'uni282B',\n    10284 => 'uni282C',\n    10285 => 'uni282D',\n    10286 => 'uni282E',\n    10287 => 'uni282F',\n    10288 => 'uni2830',\n    10289 => 'uni2831',\n    10290 => 'uni2832',\n    10291 => 'uni2833',\n    10292 => 'uni2834',\n    10293 => 'uni2835',\n    10294 => 'uni2836',\n    10295 => 'uni2837',\n    10296 => 'uni2838',\n    10297 => 'uni2839',\n    10298 => 'uni283A',\n    10299 => 'uni283B',\n    10300 => 'uni283C',\n    10301 => 'uni283D',\n    10302 => 'uni283E',\n    10303 => 'uni283F',\n    10304 => 'uni2840',\n    10305 => 'uni2841',\n    10306 => 'uni2842',\n    10307 => 'uni2843',\n    10308 => 'uni2844',\n    10309 => 'uni2845',\n    10310 => 'uni2846',\n    10311 => 'uni2847',\n    10312 => 'uni2848',\n    10313 => 'uni2849',\n    10314 => 'uni284A',\n    10315 => 'uni284B',\n    10316 => 'uni284C',\n    10317 => 'uni284D',\n    10318 => 'uni284E',\n    10319 => 'uni284F',\n    10320 => 'uni2850',\n    10321 => 'uni2851',\n    10322 => 'uni2852',\n    10323 => 'uni2853',\n    10324 => 'uni2854',\n    10325 => 'uni2855',\n    10326 => 'uni2856',\n    10327 => 'uni2857',\n    10328 => 'uni2858',\n    10329 => 'uni2859',\n    10330 => 'uni285A',\n    10331 => 'uni285B',\n    10332 => 'uni285C',\n    10333 => 'uni285D',\n    10334 => 'uni285E',\n    10335 => 'uni285F',\n    10336 => 'uni2860',\n    10337 => 'uni2861',\n    10338 => 'uni2862',\n    10339 => 'uni2863',\n    10340 => 'uni2864',\n    10341 => 'uni2865',\n    10342 => 'uni2866',\n    10343 => 'uni2867',\n    10344 => 'uni2868',\n    10345 => 'uni2869',\n    10346 => 'uni286A',\n    10347 => 'uni286B',\n    10348 => 'uni286C',\n    10349 => 'uni286D',\n    10350 => 'uni286E',\n    10351 => 'uni286F',\n    10352 => 'uni2870',\n    10353 => 'uni2871',\n    10354 => 'uni2872',\n    10355 => 'uni2873',\n    10356 => 'uni2874',\n    10357 => 'uni2875',\n    10358 => 'uni2876',\n    10359 => 'uni2877',\n    10360 => 'uni2878',\n    10361 => 'uni2879',\n    10362 => 'uni287A',\n    10363 => 'uni287B',\n    10364 => 'uni287C',\n    10365 => 'uni287D',\n    10366 => 'uni287E',\n    10367 => 'uni287F',\n    10368 => 'uni2880',\n    10369 => 'uni2881',\n    10370 => 'uni2882',\n    10371 => 'uni2883',\n    10372 => 'uni2884',\n    10373 => 'uni2885',\n    10374 => 'uni2886',\n    10375 => 'uni2887',\n    10376 => 'uni2888',\n    10377 => 'uni2889',\n    10378 => 'uni288A',\n    10379 => 'uni288B',\n    10380 => 'uni288C',\n    10381 => 'uni288D',\n    10382 => 'uni288E',\n    10383 => 'uni288F',\n    10384 => 'uni2890',\n    10385 => 'uni2891',\n    10386 => 'uni2892',\n    10387 => 'uni2893',\n    10388 => 'uni2894',\n    10389 => 'uni2895',\n    10390 => 'uni2896',\n    10391 => 'uni2897',\n    10392 => 'uni2898',\n    10393 => 'uni2899',\n    10394 => 'uni289A',\n    10395 => 'uni289B',\n    10396 => 'uni289C',\n    10397 => 'uni289D',\n    10398 => 'uni289E',\n    10399 => 'uni289F',\n    10400 => 'uni28A0',\n    10401 => 'uni28A1',\n    10402 => 'uni28A2',\n    10403 => 'uni28A3',\n    10404 => 'uni28A4',\n    10405 => 'uni28A5',\n    10406 => 'uni28A6',\n    10407 => 'uni28A7',\n    10408 => 'uni28A8',\n    10409 => 'uni28A9',\n    10410 => 'uni28AA',\n    10411 => 'uni28AB',\n    10412 => 'uni28AC',\n    10413 => 'uni28AD',\n    10414 => 'uni28AE',\n    10415 => 'uni28AF',\n    10416 => 'uni28B0',\n    10417 => 'uni28B1',\n    10418 => 'uni28B2',\n    10419 => 'uni28B3',\n    10420 => 'uni28B4',\n    10421 => 'uni28B5',\n    10422 => 'uni28B6',\n    10423 => 'uni28B7',\n    10424 => 'uni28B8',\n    10425 => 'uni28B9',\n    10426 => 'uni28BA',\n    10427 => 'uni28BB',\n    10428 => 'uni28BC',\n    10429 => 'uni28BD',\n    10430 => 'uni28BE',\n    10431 => 'uni28BF',\n    10432 => 'uni28C0',\n    10433 => 'uni28C1',\n    10434 => 'uni28C2',\n    10435 => 'uni28C3',\n    10436 => 'uni28C4',\n    10437 => 'uni28C5',\n    10438 => 'uni28C6',\n    10439 => 'uni28C7',\n    10440 => 'uni28C8',\n    10441 => 'uni28C9',\n    10442 => 'uni28CA',\n    10443 => 'uni28CB',\n    10444 => 'uni28CC',\n    10445 => 'uni28CD',\n    10446 => 'uni28CE',\n    10447 => 'uni28CF',\n    10448 => 'uni28D0',\n    10449 => 'uni28D1',\n    10450 => 'uni28D2',\n    10451 => 'uni28D3',\n    10452 => 'uni28D4',\n    10453 => 'uni28D5',\n    10454 => 'uni28D6',\n    10455 => 'uni28D7',\n    10456 => 'uni28D8',\n    10457 => 'uni28D9',\n    10458 => 'uni28DA',\n    10459 => 'uni28DB',\n    10460 => 'uni28DC',\n    10461 => 'uni28DD',\n    10462 => 'uni28DE',\n    10463 => 'uni28DF',\n    10464 => 'uni28E0',\n    10465 => 'uni28E1',\n    10466 => 'uni28E2',\n    10467 => 'uni28E3',\n    10468 => 'uni28E4',\n    10469 => 'uni28E5',\n    10470 => 'uni28E6',\n    10471 => 'uni28E7',\n    10472 => 'uni28E8',\n    10473 => 'uni28E9',\n    10474 => 'uni28EA',\n    10475 => 'uni28EB',\n    10476 => 'uni28EC',\n    10477 => 'uni28ED',\n    10478 => 'uni28EE',\n    10479 => 'uni28EF',\n    10480 => 'uni28F0',\n    10481 => 'uni28F1',\n    10482 => 'uni28F2',\n    10483 => 'uni28F3',\n    10484 => 'uni28F4',\n    10485 => 'uni28F5',\n    10486 => 'uni28F6',\n    10487 => 'uni28F7',\n    10488 => 'uni28F8',\n    10489 => 'uni28F9',\n    10490 => 'uni28FA',\n    10491 => 'uni28FB',\n    10492 => 'uni28FC',\n    10493 => 'uni28FD',\n    10494 => 'uni28FE',\n    10495 => 'uni28FF',\n    10502 => 'uni2906',\n    10503 => 'uni2907',\n    10506 => 'uni290A',\n    10507 => 'uni290B',\n    10560 => 'uni2940',\n    10561 => 'uni2941',\n    10627 => 'uni2983',\n    10628 => 'uni2984',\n    10702 => 'uni29CE',\n    10703 => 'uni29CF',\n    10704 => 'uni29D0',\n    10705 => 'uni29D1',\n    10706 => 'uni29D2',\n    10707 => 'uni29D3',\n    10708 => 'uni29D4',\n    10709 => 'uni29D5',\n    10731 => 'uni29EB',\n    10746 => 'uni29FA',\n    10747 => 'uni29FB',\n    10752 => 'uni2A00',\n    10753 => 'uni2A01',\n    10754 => 'uni2A02',\n    10764 => 'uni2A0C',\n    10765 => 'uni2A0D',\n    10766 => 'uni2A0E',\n    10767 => 'uni2A0F',\n    10768 => 'uni2A10',\n    10769 => 'uni2A11',\n    10770 => 'uni2A12',\n    10771 => 'uni2A13',\n    10772 => 'uni2A14',\n    10773 => 'uni2A15',\n    10774 => 'uni2A16',\n    10775 => 'uni2A17',\n    10776 => 'uni2A18',\n    10777 => 'uni2A19',\n    10778 => 'uni2A1A',\n    10779 => 'uni2A1B',\n    10780 => 'uni2A1C',\n    10799 => 'uni2A2F',\n    10858 => 'uni2A6A',\n    10859 => 'uni2A6B',\n    10877 => 'uni2A7D',\n    10878 => 'uni2A7E',\n    10879 => 'uni2A7F',\n    10880 => 'uni2A80',\n    10881 => 'uni2A81',\n    10882 => 'uni2A82',\n    10883 => 'uni2A83',\n    10884 => 'uni2A84',\n    10885 => 'uni2A85',\n    10886 => 'uni2A86',\n    10887 => 'uni2A87',\n    10888 => 'uni2A88',\n    10889 => 'uni2A89',\n    10890 => 'uni2A8A',\n    10891 => 'uni2A8B',\n    10892 => 'uni2A8C',\n    10893 => 'uni2A8D',\n    10894 => 'uni2A8E',\n    10895 => 'uni2A8F',\n    10896 => 'uni2A90',\n    10897 => 'uni2A91',\n    10898 => 'uni2A92',\n    10899 => 'uni2A93',\n    10900 => 'uni2A94',\n    10901 => 'uni2A95',\n    10902 => 'uni2A96',\n    10903 => 'uni2A97',\n    10904 => 'uni2A98',\n    10905 => 'uni2A99',\n    10906 => 'uni2A9A',\n    10907 => 'uni2A9B',\n    10908 => 'uni2A9C',\n    10909 => 'uni2A9D',\n    10910 => 'uni2A9E',\n    10911 => 'uni2A9F',\n    10912 => 'uni2AA0',\n    10926 => 'uni2AAE',\n    10927 => 'uni2AAF',\n    10928 => 'uni2AB0',\n    10929 => 'uni2AB1',\n    10930 => 'uni2AB2',\n    10931 => 'uni2AB3',\n    10932 => 'uni2AB4',\n    10933 => 'uni2AB5',\n    10934 => 'uni2AB6',\n    10935 => 'uni2AB7',\n    10936 => 'uni2AB8',\n    10937 => 'uni2AB9',\n    10938 => 'uni2ABA',\n    11001 => 'uni2AF9',\n    11002 => 'uni2AFA',\n    11008 => 'uni2B00',\n    11009 => 'uni2B01',\n    11010 => 'uni2B02',\n    11011 => 'uni2B03',\n    11012 => 'uni2B04',\n    11013 => 'uni2B05',\n    11014 => 'uni2B06',\n    11015 => 'uni2B07',\n    11016 => 'uni2B08',\n    11017 => 'uni2B09',\n    11018 => 'uni2B0A',\n    11019 => 'uni2B0B',\n    11020 => 'uni2B0C',\n    11021 => 'uni2B0D',\n    11022 => 'uni2B0E',\n    11023 => 'uni2B0F',\n    11024 => 'uni2B10',\n    11025 => 'uni2B11',\n    11026 => 'uni2B12',\n    11027 => 'uni2B13',\n    11028 => 'uni2B14',\n    11029 => 'uni2B15',\n    11030 => 'uni2B16',\n    11031 => 'uni2B17',\n    11032 => 'uni2B18',\n    11033 => 'uni2B19',\n    11034 => 'uni2B1A',\n    11039 => 'uni2B1F',\n    11040 => 'uni2B20',\n    11041 => 'uni2B21',\n    11042 => 'uni2B22',\n    11043 => 'uni2B23',\n    11044 => 'uni2B24',\n    11091 => 'uni2B53',\n    11092 => 'uni2B54',\n    11360 => 'uni2C60',\n    11361 => 'uni2C61',\n    11362 => 'uni2C62',\n    11363 => 'uni2C63',\n    11364 => 'uni2C64',\n    11365 => 'uni2C65',\n    11366 => 'uni2C66',\n    11367 => 'uni2C67',\n    11368 => 'uni2C68',\n    11369 => 'uni2C69',\n    11370 => 'uni2C6A',\n    11371 => 'uni2C6B',\n    11372 => 'uni2C6C',\n    11373 => 'uni2C6D',\n    11374 => 'uni2C6E',\n    11375 => 'uni2C6F',\n    11376 => 'uni2C70',\n    11377 => 'uni2C71',\n    11378 => 'uni2C72',\n    11379 => 'uni2C73',\n    11380 => 'uni2C74',\n    11381 => 'uni2C75',\n    11382 => 'uni2C76',\n    11383 => 'uni2C77',\n    11385 => 'uni2C79',\n    11386 => 'uni2C7A',\n    11387 => 'uni2C7B',\n    11388 => 'uni2C7C',\n    11389 => 'uni2C7D',\n    11390 => 'uni2C7E',\n    11391 => 'uni2C7F',\n    11520 => 'uni2D00',\n    11521 => 'uni2D01',\n    11522 => 'uni2D02',\n    11523 => 'uni2D03',\n    11524 => 'uni2D04',\n    11525 => 'uni2D05',\n    11526 => 'uni2D06',\n    11527 => 'uni2D07',\n    11528 => 'uni2D08',\n    11529 => 'uni2D09',\n    11530 => 'uni2D0A',\n    11531 => 'uni2D0B',\n    11532 => 'uni2D0C',\n    11533 => 'uni2D0D',\n    11534 => 'uni2D0E',\n    11535 => 'uni2D0F',\n    11536 => 'uni2D10',\n    11537 => 'uni2D11',\n    11538 => 'uni2D12',\n    11539 => 'uni2D13',\n    11540 => 'uni2D14',\n    11541 => 'uni2D15',\n    11542 => 'uni2D16',\n    11543 => 'uni2D17',\n    11544 => 'uni2D18',\n    11545 => 'uni2D19',\n    11546 => 'uni2D1A',\n    11547 => 'uni2D1B',\n    11548 => 'uni2D1C',\n    11549 => 'uni2D1D',\n    11550 => 'uni2D1E',\n    11551 => 'uni2D1F',\n    11552 => 'uni2D20',\n    11553 => 'uni2D21',\n    11554 => 'uni2D22',\n    11555 => 'uni2D23',\n    11556 => 'uni2D24',\n    11557 => 'uni2D25',\n    11568 => 'uni2D30',\n    11569 => 'uni2D31',\n    11570 => 'uni2D32',\n    11571 => 'uni2D33',\n    11572 => 'uni2D34',\n    11573 => 'uni2D35',\n    11574 => 'uni2D36',\n    11575 => 'uni2D37',\n    11576 => 'uni2D38',\n    11577 => 'uni2D39',\n    11578 => 'uni2D3A',\n    11579 => 'uni2D3B',\n    11580 => 'uni2D3C',\n    11581 => 'uni2D3D',\n    11582 => 'uni2D3E',\n    11583 => 'uni2D3F',\n    11584 => 'uni2D40',\n    11585 => 'uni2D41',\n    11586 => 'uni2D42',\n    11587 => 'uni2D43',\n    11588 => 'uni2D44',\n    11589 => 'uni2D45',\n    11590 => 'uni2D46',\n    11591 => 'uni2D47',\n    11592 => 'uni2D48',\n    11593 => 'uni2D49',\n    11594 => 'uni2D4A',\n    11595 => 'uni2D4B',\n    11596 => 'uni2D4C',\n    11597 => 'uni2D4D',\n    11598 => 'uni2D4E',\n    11599 => 'uni2D4F',\n    11600 => 'uni2D50',\n    11601 => 'uni2D51',\n    11602 => 'uni2D52',\n    11603 => 'uni2D53',\n    11604 => 'uni2D54',\n    11605 => 'uni2D55',\n    11606 => 'uni2D56',\n    11607 => 'uni2D57',\n    11608 => 'uni2D58',\n    11609 => 'uni2D59',\n    11610 => 'uni2D5A',\n    11611 => 'uni2D5B',\n    11612 => 'uni2D5C',\n    11613 => 'uni2D5D',\n    11614 => 'uni2D5E',\n    11615 => 'uni2D5F',\n    11616 => 'uni2D60',\n    11617 => 'uni2D61',\n    11618 => 'uni2D62',\n    11619 => 'uni2D63',\n    11620 => 'uni2D64',\n    11621 => 'uni2D65',\n    11631 => 'uni2D6F',\n    11800 => 'uni2E18',\n    11807 => 'uni2E1F',\n    11810 => 'uni2E22',\n    11811 => 'uni2E23',\n    11812 => 'uni2E24',\n    11813 => 'uni2E25',\n    11822 => 'uni2E2E',\n    19904 => 'uni4DC0',\n    19905 => 'uni4DC1',\n    19906 => 'uni4DC2',\n    19907 => 'uni4DC3',\n    19908 => 'uni4DC4',\n    19909 => 'uni4DC5',\n    19910 => 'uni4DC6',\n    19911 => 'uni4DC7',\n    19912 => 'uni4DC8',\n    19913 => 'uni4DC9',\n    19914 => 'uni4DCA',\n    19915 => 'uni4DCB',\n    19916 => 'uni4DCC',\n    19917 => 'uni4DCD',\n    19918 => 'uni4DCE',\n    19919 => 'uni4DCF',\n    19920 => 'uni4DD0',\n    19921 => 'uni4DD1',\n    19922 => 'uni4DD2',\n    19923 => 'uni4DD3',\n    19924 => 'uni4DD4',\n    19925 => 'uni4DD5',\n    19926 => 'uni4DD6',\n    19927 => 'uni4DD7',\n    19928 => 'uni4DD8',\n    19929 => 'uni4DD9',\n    19930 => 'uni4DDA',\n    19931 => 'uni4DDB',\n    19932 => 'uni4DDC',\n    19933 => 'uni4DDD',\n    19934 => 'uni4DDE',\n    19935 => 'uni4DDF',\n    19936 => 'uni4DE0',\n    19937 => 'uni4DE1',\n    19938 => 'uni4DE2',\n    19939 => 'uni4DE3',\n    19940 => 'uni4DE4',\n    19941 => 'uni4DE5',\n    19942 => 'uni4DE6',\n    19943 => 'uni4DE7',\n    19944 => 'uni4DE8',\n    19945 => 'uni4DE9',\n    19946 => 'uni4DEA',\n    19947 => 'uni4DEB',\n    19948 => 'uni4DEC',\n    19949 => 'uni4DED',\n    19950 => 'uni4DEE',\n    19951 => 'uni4DEF',\n    19952 => 'uni4DF0',\n    19953 => 'uni4DF1',\n    19954 => 'uni4DF2',\n    19955 => 'uni4DF3',\n    19956 => 'uni4DF4',\n    19957 => 'uni4DF5',\n    19958 => 'uni4DF6',\n    19959 => 'uni4DF7',\n    19960 => 'uni4DF8',\n    19961 => 'uni4DF9',\n    19962 => 'uni4DFA',\n    19963 => 'uni4DFB',\n    19964 => 'uni4DFC',\n    19965 => 'uni4DFD',\n    19966 => 'uni4DFE',\n    19967 => 'uni4DFF',\n    42192 => 'uniA4D0',\n    42193 => 'uniA4D1',\n    42194 => 'uniA4D2',\n    42195 => 'uniA4D3',\n    42196 => 'uniA4D4',\n    42197 => 'uniA4D5',\n    42198 => 'uniA4D6',\n    42199 => 'uniA4D7',\n    42200 => 'uniA4D8',\n    42201 => 'uniA4D9',\n    42202 => 'uniA4DA',\n    42203 => 'uniA4DB',\n    42204 => 'uniA4DC',\n    42205 => 'uniA4DD',\n    42206 => 'uniA4DE',\n    42207 => 'uniA4DF',\n    42208 => 'uniA4E0',\n    42209 => 'uniA4E1',\n    42210 => 'uniA4E2',\n    42211 => 'uniA4E3',\n    42212 => 'uniA4E4',\n    42213 => 'uniA4E5',\n    42214 => 'uniA4E6',\n    42215 => 'uniA4E7',\n    42216 => 'uniA4E8',\n    42217 => 'uniA4E9',\n    42218 => 'uniA4EA',\n    42219 => 'uniA4EB',\n    42220 => 'uniA4EC',\n    42221 => 'uniA4ED',\n    42222 => 'uniA4EE',\n    42223 => 'uniA4EF',\n    42224 => 'uniA4F0',\n    42225 => 'uniA4F1',\n    42226 => 'uniA4F2',\n    42227 => 'uniA4F3',\n    42228 => 'uniA4F4',\n    42229 => 'uniA4F5',\n    42230 => 'uniA4F6',\n    42231 => 'uniA4F7',\n    42232 => 'uniA4F8',\n    42233 => 'uniA4F9',\n    42234 => 'uniA4FA',\n    42235 => 'uniA4FB',\n    42236 => 'uniA4FC',\n    42237 => 'uniA4FD',\n    42238 => 'uniA4FE',\n    42239 => 'uniA4FF',\n    42564 => 'uniA644',\n    42565 => 'uniA645',\n    42566 => 'uniA646',\n    42567 => 'uniA647',\n    42572 => 'uniA64C',\n    42573 => 'uniA64D',\n    42576 => 'uniA650',\n    42577 => 'uniA651',\n    42580 => 'uniA654',\n    42581 => 'uniA655',\n    42582 => 'uniA656',\n    42583 => 'uniA657',\n    42594 => 'uniA662',\n    42595 => 'uniA663',\n    42596 => 'uniA664',\n    42597 => 'uniA665',\n    42598 => 'uniA666',\n    42599 => 'uniA667',\n    42600 => 'uniA668',\n    42601 => 'uniA669',\n    42602 => 'uniA66A',\n    42603 => 'uniA66B',\n    42604 => 'uniA66C',\n    42605 => 'uniA66D',\n    42606 => 'uniA66E',\n    42634 => 'uniA68A',\n    42635 => 'uniA68B',\n    42636 => 'uniA68C',\n    42637 => 'uniA68D',\n    42644 => 'uniA694',\n    42645 => 'uniA695',\n    42648 => 'uniA698',\n    42649 => 'uniA699',\n    42760 => 'uniA708',\n    42761 => 'uniA709',\n    42762 => 'uniA70A',\n    42763 => 'uniA70B',\n    42764 => 'uniA70C',\n    42765 => 'uniA70D',\n    42766 => 'uniA70E',\n    42767 => 'uniA70F',\n    42768 => 'uniA710',\n    42769 => 'uniA711',\n    42770 => 'uniA712',\n    42771 => 'uniA713',\n    42772 => 'uniA714',\n    42773 => 'uniA715',\n    42774 => 'uniA716',\n    42779 => 'uniA71B',\n    42780 => 'uniA71C',\n    42781 => 'uniA71D',\n    42782 => 'uniA71E',\n    42783 => 'uniA71F',\n    42786 => 'uniA722',\n    42787 => 'uniA723',\n    42788 => 'uniA724',\n    42789 => 'uniA725',\n    42790 => 'uniA726',\n    42791 => 'uniA727',\n    42792 => 'uniA728',\n    42793 => 'uniA729',\n    42794 => 'uniA72A',\n    42795 => 'uniA72B',\n    42800 => 'uniA730',\n    42801 => 'uniA731',\n    42802 => 'uniA732',\n    42803 => 'uniA733',\n    42804 => 'uniA734',\n    42805 => 'uniA735',\n    42806 => 'uniA736',\n    42807 => 'uniA737',\n    42808 => 'uniA738',\n    42809 => 'uniA739',\n    42810 => 'uniA73A',\n    42811 => 'uniA73B',\n    42812 => 'uniA73C',\n    42813 => 'uniA73D',\n    42814 => 'uniA73E',\n    42815 => 'uniA73F',\n    42816 => 'uniA740',\n    42817 => 'uniA741',\n    42822 => 'uniA746',\n    42823 => 'uniA747',\n    42824 => 'uniA748',\n    42825 => 'uniA749',\n    42826 => 'uniA74A',\n    42827 => 'uniA74B',\n    42830 => 'uniA74E',\n    42831 => 'uniA74F',\n    42832 => 'uniA750',\n    42833 => 'uniA751',\n    42834 => 'uniA752',\n    42835 => 'uniA753',\n    42838 => 'uniA756',\n    42839 => 'uniA757',\n    42852 => 'uniA764',\n    42853 => 'uniA765',\n    42854 => 'uniA766',\n    42855 => 'uniA767',\n    42880 => 'uniA780',\n    42881 => 'uniA781',\n    42882 => 'uniA782',\n    42883 => 'uniA783',\n    42889 => 'uniA789',\n    42890 => 'uniA78A',\n    42891 => 'uniA78B',\n    42892 => 'uniA78C',\n    42893 => 'uniA78D',\n    42894 => 'uniA78E',\n    42896 => 'uniA790',\n    42897 => 'uniA791',\n    42912 => 'uniA7A0',\n    42913 => 'uniA7A1',\n    42914 => 'uniA7A2',\n    42915 => 'uniA7A3',\n    42916 => 'uniA7A4',\n    42917 => 'uniA7A5',\n    42918 => 'uniA7A6',\n    42919 => 'uniA7A7',\n    42920 => 'uniA7A8',\n    42921 => 'uniA7A9',\n    42922 => 'uniA7AA',\n    43000 => 'uniA7F8',\n    43001 => 'uniA7F9',\n    43002 => 'uniA7FA',\n    43003 => 'uniA7FB',\n    43004 => 'uniA7FC',\n    43005 => 'uniA7FD',\n    43006 => 'uniA7FE',\n    43007 => 'uniA7FF',\n    61184 => 'uni02E5.5',\n    61185 => 'uni02E6.5',\n    61186 => 'uni02E7.5',\n    61187 => 'uni02E8.5',\n    61188 => 'uni02E9.5',\n    61189 => 'uni02E5.4',\n    61190 => 'uni02E6.4',\n    61191 => 'uni02E7.4',\n    61192 => 'uni02E8.4',\n    61193 => 'uni02E9.4',\n    61194 => 'uni02E5.3',\n    61195 => 'uni02E6.3',\n    61196 => 'uni02E7.3',\n    61197 => 'uni02E8.3',\n    61198 => 'uni02E9.3',\n    61199 => 'uni02E5.2',\n    61200 => 'uni02E6.2',\n    61201 => 'uni02E7.2',\n    61202 => 'uni02E8.2',\n    61203 => 'uni02E9.2',\n    61204 => 'uni02E5.1',\n    61205 => 'uni02E6.1',\n    61206 => 'uni02E7.1',\n    61207 => 'uni02E8.1',\n    61208 => 'uni02E9.1',\n    61209 => 'stem',\n    61440 => 'uniF000',\n    61441 => 'uniF001',\n    61442 => 'uniF002',\n    61443 => 'uniF003',\n    62464 => 'uniF400',\n    62465 => 'uniF401',\n    62466 => 'uniF402',\n    62467 => 'uniF403',\n    62468 => 'uniF404',\n    62469 => 'uniF405',\n    62470 => 'uniF406',\n    62471 => 'uniF407',\n    62472 => 'uniF408',\n    62473 => 'uniF409',\n    62474 => 'uniF40A',\n    62475 => 'uniF40B',\n    62476 => 'uniF40C',\n    62477 => 'uniF40D',\n    62478 => 'uniF40E',\n    62479 => 'uniF40F',\n    62480 => 'uniF410',\n    62481 => 'uniF411',\n    62482 => 'uniF412',\n    62483 => 'uniF413',\n    62484 => 'uniF414',\n    62485 => 'uniF415',\n    62486 => 'uniF416',\n    62487 => 'uniF417',\n    62488 => 'uniF418',\n    62489 => 'uniF419',\n    62490 => 'uniF41A',\n    62491 => 'uniF41B',\n    62492 => 'uniF41C',\n    62493 => 'uniF41D',\n    62494 => 'uniF41E',\n    62495 => 'uniF41F',\n    62496 => 'uniF420',\n    62497 => 'uniF421',\n    62498 => 'uniF422',\n    62499 => 'uniF423',\n    62500 => 'uniF424',\n    62501 => 'uniF425',\n    62502 => 'uniF426',\n    62504 => 'uniF428',\n    62505 => 'uniF429',\n    62506 => 'uniF42A',\n    62507 => 'uniF42B',\n    62508 => 'uniF42C',\n    62509 => 'uniF42D',\n    62510 => 'uniF42E',\n    62511 => 'uniF42F',\n    62512 => 'uniF430',\n    62513 => 'uniF431',\n    62514 => 'uniF432',\n    62515 => 'uniF433',\n    62516 => 'uniF434',\n    62517 => 'uniF435',\n    62518 => 'uniF436',\n    62519 => 'uniF437',\n    62520 => 'uniF438',\n    62521 => 'uniF439',\n    62522 => 'uniF43A',\n    62523 => 'uniF43B',\n    62524 => 'uniF43C',\n    62525 => 'uniF43D',\n    62526 => 'uniF43E',\n    62527 => 'uniF43F',\n    62528 => 'uniF440',\n    62529 => 'uniF441',\n    63173 => 'uniF6C5',\n    64256 => 'uniFB00',\n    64257 => 'fi',\n    64258 => 'fl',\n    64259 => 'uniFB03',\n    64260 => 'uniFB04',\n    64261 => 'uniFB05',\n    64262 => 'uniFB06',\n    64275 => 'uniFB13',\n    64276 => 'uniFB14',\n    64277 => 'uniFB15',\n    64278 => 'uniFB16',\n    64279 => 'uniFB17',\n    64285 => 'uniFB1D',\n    64286 => 'uniFB1E',\n    64287 => 'uniFB1F',\n    64288 => 'uniFB20',\n    64289 => 'uniFB21',\n    64290 => 'uniFB22',\n    64291 => 'uniFB23',\n    64292 => 'uniFB24',\n    64293 => 'uniFB25',\n    64294 => 'uniFB26',\n    64295 => 'uniFB27',\n    64296 => 'uniFB28',\n    64297 => 'uniFB29',\n    64298 => 'uniFB2A',\n    64299 => 'uniFB2B',\n    64300 => 'uniFB2C',\n    64301 => 'uniFB2D',\n    64302 => 'uniFB2E',\n    64303 => 'uniFB2F',\n    64304 => 'uniFB30',\n    64305 => 'uniFB31',\n    64306 => 'uniFB32',\n    64307 => 'uniFB33',\n    64308 => 'uniFB34',\n    64309 => 'uniFB35',\n    64310 => 'uniFB36',\n    64312 => 'uniFB38',\n    64313 => 'uniFB39',\n    64314 => 'uniFB3A',\n    64315 => 'uniFB3B',\n    64316 => 'uniFB3C',\n    64318 => 'uniFB3E',\n    64320 => 'uniFB40',\n    64321 => 'uniFB41',\n    64323 => 'uniFB43',\n    64324 => 'uniFB44',\n    64326 => 'uniFB46',\n    64327 => 'uniFB47',\n    64328 => 'uniFB48',\n    64329 => 'uniFB49',\n    64330 => 'uniFB4A',\n    64331 => 'uniFB4B',\n    64332 => 'uniFB4C',\n    64333 => 'uniFB4D',\n    64334 => 'uniFB4E',\n    64335 => 'uniFB4F',\n    64338 => 'uniFB52',\n    64339 => 'uniFB53',\n    64340 => 'uniFB54',\n    64341 => 'uniFB55',\n    64342 => 'uniFB56',\n    64343 => 'uniFB57',\n    64344 => 'uniFB58',\n    64345 => 'uniFB59',\n    64346 => 'uniFB5A',\n    64347 => 'uniFB5B',\n    64348 => 'uniFB5C',\n    64349 => 'uniFB5D',\n    64350 => 'uniFB5E',\n    64351 => 'uniFB5F',\n    64352 => 'uniFB60',\n    64353 => 'uniFB61',\n    64354 => 'uniFB62',\n    64355 => 'uniFB63',\n    64356 => 'uniFB64',\n    64357 => 'uniFB65',\n    64358 => 'uniFB66',\n    64359 => 'uniFB67',\n    64360 => 'uniFB68',\n    64361 => 'uniFB69',\n    64362 => 'uniFB6A',\n    64363 => 'uniFB6B',\n    64364 => 'uniFB6C',\n    64365 => 'uniFB6D',\n    64366 => 'uniFB6E',\n    64367 => 'uniFB6F',\n    64368 => 'uniFB70',\n    64369 => 'uniFB71',\n    64370 => 'uniFB72',\n    64371 => 'uniFB73',\n    64372 => 'uniFB74',\n    64373 => 'uniFB75',\n    64374 => 'uniFB76',\n    64375 => 'uniFB77',\n    64376 => 'uniFB78',\n    64377 => 'uniFB79',\n    64378 => 'uniFB7A',\n    64379 => 'uniFB7B',\n    64380 => 'uniFB7C',\n    64381 => 'uniFB7D',\n    64382 => 'uniFB7E',\n    64383 => 'uniFB7F',\n    64384 => 'uniFB80',\n    64385 => 'uniFB81',\n    64386 => 'uniFB82',\n    64387 => 'uniFB83',\n    64388 => 'uniFB84',\n    64389 => 'uniFB85',\n    64390 => 'uniFB86',\n    64391 => 'uniFB87',\n    64392 => 'uniFB88',\n    64393 => 'uniFB89',\n    64394 => 'uniFB8A',\n    64395 => 'uniFB8B',\n    64396 => 'uniFB8C',\n    64397 => 'uniFB8D',\n    64398 => 'uniFB8E',\n    64399 => 'uniFB8F',\n    64400 => 'uniFB90',\n    64401 => 'uniFB91',\n    64402 => 'uniFB92',\n    64403 => 'uniFB93',\n    64404 => 'uniFB94',\n    64405 => 'uniFB95',\n    64406 => 'uniFB96',\n    64407 => 'uniFB97',\n    64408 => 'uniFB98',\n    64409 => 'uniFB99',\n    64410 => 'uniFB9A',\n    64411 => 'uniFB9B',\n    64412 => 'uniFB9C',\n    64413 => 'uniFB9D',\n    64414 => 'uniFB9E',\n    64415 => 'uniFB9F',\n    64416 => 'uniFBA0',\n    64417 => 'uniFBA1',\n    64418 => 'uniFBA2',\n    64419 => 'uniFBA3',\n    64426 => 'uniFBAA',\n    64427 => 'uniFBAB',\n    64428 => 'uniFBAC',\n    64429 => 'uniFBAD',\n    64467 => 'uniFBD3',\n    64468 => 'uniFBD4',\n    64469 => 'uniFBD5',\n    64470 => 'uniFBD6',\n    64471 => 'uniFBD7',\n    64472 => 'uniFBD8',\n    64473 => 'uniFBD9',\n    64474 => 'uniFBDA',\n    64475 => 'uniFBDB',\n    64476 => 'uniFBDC',\n    64478 => 'uniFBDE',\n    64479 => 'uniFBDF',\n    64484 => 'uniFBE4',\n    64485 => 'uniFBE5',\n    64486 => 'uniFBE6',\n    64487 => 'uniFBE7',\n    64488 => 'uniFBE8',\n    64489 => 'uniFBE9',\n    64508 => 'uniFBFC',\n    64509 => 'uniFBFD',\n    64510 => 'uniFBFE',\n    64511 => 'uniFBFF',\n    65024 => 'uniFE00',\n    65025 => 'uniFE01',\n    65026 => 'uniFE02',\n    65027 => 'uniFE03',\n    65028 => 'uniFE04',\n    65029 => 'uniFE05',\n    65030 => 'uniFE06',\n    65031 => 'uniFE07',\n    65032 => 'uniFE08',\n    65033 => 'uniFE09',\n    65034 => 'uniFE0A',\n    65035 => 'uniFE0B',\n    65036 => 'uniFE0C',\n    65037 => 'uniFE0D',\n    65038 => 'uniFE0E',\n    65039 => 'uniFE0F',\n    65056 => 'uniFE20',\n    65057 => 'uniFE21',\n    65058 => 'uniFE22',\n    65059 => 'uniFE23',\n    65136 => 'uniFE70',\n    65137 => 'uniFE71',\n    65138 => 'uniFE72',\n    65139 => 'uniFE73',\n    65140 => 'uniFE74',\n    65142 => 'uniFE76',\n    65143 => 'uniFE77',\n    65144 => 'uniFE78',\n    65145 => 'uniFE79',\n    65146 => 'uniFE7A',\n    65147 => 'uniFE7B',\n    65148 => 'uniFE7C',\n    65149 => 'uniFE7D',\n    65150 => 'uniFE7E',\n    65151 => 'uniFE7F',\n    65152 => 'uniFE80',\n    65153 => 'uniFE81',\n    65154 => 'uniFE82',\n    65155 => 'uniFE83',\n    65156 => 'uniFE84',\n    65157 => 'uniFE85',\n    65158 => 'uniFE86',\n    65159 => 'uniFE87',\n    65160 => 'uniFE88',\n    65161 => 'uniFE89',\n    65162 => 'uniFE8A',\n    65163 => 'uniFE8B',\n    65164 => 'uniFE8C',\n    65165 => 'uniFE8D',\n    65166 => 'uniFE8E',\n    65167 => 'uniFE8F',\n    65168 => 'uniFE90',\n    65169 => 'uniFE91',\n    65170 => 'uniFE92',\n    65171 => 'uniFE93',\n    65172 => 'uniFE94',\n    65173 => 'uniFE95',\n    65174 => 'uniFE96',\n    65175 => 'uniFE97',\n    65176 => 'uniFE98',\n    65177 => 'uniFE99',\n    65178 => 'uniFE9A',\n    65179 => 'uniFE9B',\n    65180 => 'uniFE9C',\n    65181 => 'uniFE9D',\n    65182 => 'uniFE9E',\n    65183 => 'uniFE9F',\n    65184 => 'uniFEA0',\n    65185 => 'uniFEA1',\n    65186 => 'uniFEA2',\n    65187 => 'uniFEA3',\n    65188 => 'uniFEA4',\n    65189 => 'uniFEA5',\n    65190 => 'uniFEA6',\n    65191 => 'uniFEA7',\n    65192 => 'uniFEA8',\n    65193 => 'uniFEA9',\n    65194 => 'uniFEAA',\n    65195 => 'uniFEAB',\n    65196 => 'uniFEAC',\n    65197 => 'uniFEAD',\n    65198 => 'uniFEAE',\n    65199 => 'uniFEAF',\n    65200 => 'uniFEB0',\n    65201 => 'uniFEB1',\n    65202 => 'uniFEB2',\n    65203 => 'uniFEB3',\n    65204 => 'uniFEB4',\n    65205 => 'uniFEB5',\n    65206 => 'uniFEB6',\n    65207 => 'uniFEB7',\n    65208 => 'uniFEB8',\n    65209 => 'uniFEB9',\n    65210 => 'uniFEBA',\n    65211 => 'uniFEBB',\n    65212 => 'uniFEBC',\n    65213 => 'uniFEBD',\n    65214 => 'uniFEBE',\n    65215 => 'uniFEBF',\n    65216 => 'uniFEC0',\n    65217 => 'uniFEC1',\n    65218 => 'uniFEC2',\n    65219 => 'uniFEC3',\n    65220 => 'uniFEC4',\n    65221 => 'uniFEC5',\n    65222 => 'uniFEC6',\n    65223 => 'uniFEC7',\n    65224 => 'uniFEC8',\n    65225 => 'uniFEC9',\n    65226 => 'uniFECA',\n    65227 => 'uniFECB',\n    65228 => 'uniFECC',\n    65229 => 'uniFECD',\n    65230 => 'uniFECE',\n    65231 => 'uniFECF',\n    65232 => 'uniFED0',\n    65233 => 'uniFED1',\n    65234 => 'uniFED2',\n    65235 => 'uniFED3',\n    65236 => 'uniFED4',\n    65237 => 'uniFED5',\n    65238 => 'uniFED6',\n    65239 => 'uniFED7',\n    65240 => 'uniFED8',\n    65241 => 'uniFED9',\n    65242 => 'uniFEDA',\n    65243 => 'uniFEDB',\n    65244 => 'uniFEDC',\n    65245 => 'uniFEDD',\n    65246 => 'uniFEDE',\n    65247 => 'uniFEDF',\n    65248 => 'uniFEE0',\n    65249 => 'uniFEE1',\n    65250 => 'uniFEE2',\n    65251 => 'uniFEE3',\n    65252 => 'uniFEE4',\n    65253 => 'uniFEE5',\n    65254 => 'uniFEE6',\n    65255 => 'uniFEE7',\n    65256 => 'uniFEE8',\n    65257 => 'uniFEE9',\n    65258 => 'uniFEEA',\n    65259 => 'uniFEEB',\n    65260 => 'uniFEEC',\n    65261 => 'uniFEED',\n    65262 => 'uniFEEE',\n    65263 => 'uniFEEF',\n    65264 => 'uniFEF0',\n    65265 => 'uniFEF1',\n    65266 => 'uniFEF2',\n    65267 => 'uniFEF3',\n    65268 => 'uniFEF4',\n    65269 => 'uniFEF5',\n    65270 => 'uniFEF6',\n    65271 => 'uniFEF7',\n    65272 => 'uniFEF8',\n    65273 => 'uniFEF9',\n    65274 => 'uniFEFA',\n    65275 => 'uniFEFB',\n    65276 => 'uniFEFC',\n    65279 => 'uniFEFF',\n    65529 => 'uniFFF9',\n    65530 => 'uniFFFA',\n    65531 => 'uniFFFB',\n    65532 => 'uniFFFC',\n    65533 => 'uniFFFD',\n  ),\n  'isUnicode' => true,\n  'EncodingScheme' => 'FontSpecific',\n  'FontName' => 'DejaVu Sans',\n  'FullName' => 'DejaVu Sans',\n  'Version' => 'Version 2.37',\n  'PostScriptName' => 'DejaVuSans',\n  'Weight' => 'Medium',\n  'ItalicAngle' => '0',\n  'IsFixedPitch' => 'false',\n  'UnderlineThickness' => '44',\n  'UnderlinePosition' => '-63',\n  'FontHeightOffset' => '0',\n  'Ascender' => '928',\n  'Descender' => '-236',\n  'FontBBox' => \n  array (\n    0 => '-1021',\n    1 => '-463',\n    2 => '1793',\n    3 => '1232',\n  ),\n  'StartCharMetrics' => '6253',\n  'C' => \n  array (\n    32 => 318.0,\n    33 => 401.0,\n    34 => 460.0,\n    35 => 838.0,\n    36 => 636.0,\n    37 => 950.0,\n    38 => 780.0,\n    39 => 275.0,\n    40 => 390.0,\n    41 => 390.0,\n    42 => 500.0,\n    43 => 838.0,\n    44 => 318.0,\n    45 => 361.0,\n    46 => 318.0,\n    47 => 337.0,\n    48 => 636.0,\n    49 => 636.0,\n    50 => 636.0,\n    51 => 636.0,\n    52 => 636.0,\n    53 => 636.0,\n    54 => 636.0,\n    55 => 636.0,\n    56 => 636.0,\n    57 => 636.0,\n    58 => 337.0,\n    59 => 337.0,\n    60 => 838.0,\n    61 => 838.0,\n    62 => 838.0,\n    63 => 531.0,\n    64 => 1000.0,\n    65 => 684.0,\n    66 => 686.0,\n    67 => 698.0,\n    68 => 770.0,\n    69 => 632.0,\n    70 => 575.0,\n    71 => 775.0,\n    72 => 752.0,\n    73 => 295.0,\n    74 => 295.0,\n    75 => 656.0,\n    76 => 557.0,\n    77 => 863.0,\n    78 => 748.0,\n    79 => 787.0,\n    80 => 603.0,\n    81 => 787.0,\n    82 => 695.0,\n    83 => 635.0,\n    84 => 611.0,\n    85 => 732.0,\n    86 => 684.0,\n    87 => 989.0,\n    88 => 685.0,\n    89 => 611.0,\n    90 => 685.0,\n    91 => 390.0,\n    92 => 337.0,\n    93 => 390.0,\n    94 => 838.0,\n    95 => 500.0,\n    96 => 500.0,\n    97 => 613.0,\n    98 => 635.0,\n    99 => 550.0,\n    100 => 635.0,\n    101 => 615.0,\n    102 => 352.0,\n    103 => 635.0,\n    104 => 634.0,\n    105 => 278.0,\n    106 => 278.0,\n    107 => 579.0,\n    108 => 278.0,\n    109 => 974.0,\n    110 => 634.0,\n    111 => 612.0,\n    112 => 635.0,\n    113 => 635.0,\n    114 => 411.0,\n    115 => 521.0,\n    116 => 392.0,\n    117 => 634.0,\n    118 => 592.0,\n    119 => 818.0,\n    120 => 592.0,\n    121 => 592.0,\n    122 => 525.0,\n    123 => 636.0,\n    124 => 337.0,\n    125 => 636.0,\n    126 => 838.0,\n    160 => 318.0,\n    161 => 401.0,\n    162 => 636.0,\n    163 => 636.0,\n    164 => 636.0,\n    165 => 636.0,\n    166 => 337.0,\n    167 => 500.0,\n    168 => 500.0,\n    169 => 1000.0,\n    170 => 471.0,\n    171 => 612.0,\n    172 => 838.0,\n    173 => 361.0,\n    174 => 1000.0,\n    175 => 500.0,\n    176 => 500.0,\n    177 => 838.0,\n    178 => 401.0,\n    179 => 401.0,\n    180 => 500.0,\n    181 => 636.0,\n    182 => 636.0,\n    183 => 318.0,\n    184 => 500.0,\n    185 => 401.0,\n    186 => 471.0,\n    187 => 612.0,\n    188 => 969.0,\n    189 => 969.0,\n    190 => 969.0,\n    191 => 531.0,\n    192 => 684.0,\n    193 => 684.0,\n    194 => 684.0,\n    195 => 684.0,\n    196 => 684.0,\n    197 => 684.0,\n    198 => 974.0,\n    199 => 698.0,\n    200 => 632.0,\n    201 => 632.0,\n    202 => 632.0,\n    203 => 632.0,\n    204 => 295.0,\n    205 => 295.0,\n    206 => 295.0,\n    207 => 295.0,\n    208 => 775.0,\n    209 => 748.0,\n    210 => 787.0,\n    211 => 787.0,\n    212 => 787.0,\n    213 => 787.0,\n    214 => 787.0,\n    215 => 838.0,\n    216 => 787.0,\n    217 => 732.0,\n    218 => 732.0,\n    219 => 732.0,\n    220 => 732.0,\n    221 => 611.0,\n    222 => 605.0,\n    223 => 630.0,\n    224 => 613.0,\n    225 => 613.0,\n    226 => 613.0,\n    227 => 613.0,\n    228 => 613.0,\n    229 => 613.0,\n    230 => 982.0,\n    231 => 550.0,\n    232 => 615.0,\n    233 => 615.0,\n    234 => 615.0,\n    235 => 615.0,\n    236 => 278.0,\n    237 => 278.0,\n    238 => 278.0,\n    239 => 278.0,\n    240 => 612.0,\n    241 => 634.0,\n    242 => 612.0,\n    243 => 612.0,\n    244 => 612.0,\n    245 => 612.0,\n    246 => 612.0,\n    247 => 838.0,\n    248 => 612.0,\n    249 => 634.0,\n    250 => 634.0,\n    251 => 634.0,\n    252 => 634.0,\n    253 => 592.0,\n    254 => 635.0,\n    255 => 592.0,\n    256 => 684.0,\n    257 => 613.0,\n    258 => 684.0,\n    259 => 613.0,\n    260 => 684.0,\n    261 => 613.0,\n    262 => 698.0,\n    263 => 550.0,\n    264 => 698.0,\n    265 => 550.0,\n    266 => 698.0,\n    267 => 550.0,\n    268 => 698.0,\n    269 => 550.0,\n    270 => 770.0,\n    271 => 635.0,\n    272 => 775.0,\n    273 => 635.0,\n    274 => 632.0,\n    275 => 615.0,\n    276 => 632.0,\n    277 => 615.0,\n    278 => 632.0,\n    279 => 615.0,\n    280 => 632.0,\n    281 => 615.0,\n    282 => 632.0,\n    283 => 615.0,\n    284 => 775.0,\n    285 => 635.0,\n    286 => 775.0,\n    287 => 635.0,\n    288 => 775.0,\n    289 => 635.0,\n    290 => 775.0,\n    291 => 635.0,\n    292 => 752.0,\n    293 => 634.0,\n    294 => 916.0,\n    295 => 695.0,\n    296 => 295.0,\n    297 => 278.0,\n    298 => 295.0,\n    299 => 278.0,\n    300 => 295.0,\n    301 => 278.0,\n    302 => 295.0,\n    303 => 278.0,\n    304 => 295.0,\n    305 => 278.0,\n    306 => 590.0,\n    307 => 556.0,\n    308 => 295.0,\n    309 => 278.0,\n    310 => 656.0,\n    311 => 579.0,\n    312 => 579.0,\n    313 => 557.0,\n    314 => 278.0,\n    315 => 557.0,\n    316 => 278.0,\n    317 => 557.0,\n    318 => 375.0,\n    319 => 557.0,\n    320 => 342.0,\n    321 => 562.0,\n    322 => 284.0,\n    323 => 748.0,\n    324 => 634.0,\n    325 => 748.0,\n    326 => 634.0,\n    327 => 748.0,\n    328 => 634.0,\n    329 => 813.0,\n    330 => 748.0,\n    331 => 634.0,\n    332 => 787.0,\n    333 => 612.0,\n    334 => 787.0,\n    335 => 612.0,\n    336 => 787.0,\n    337 => 612.0,\n    338 => 1070.0,\n    339 => 1023.0,\n    340 => 695.0,\n    341 => 411.0,\n    342 => 695.0,\n    343 => 411.0,\n    344 => 695.0,\n    345 => 411.0,\n    346 => 635.0,\n    347 => 521.0,\n    348 => 635.0,\n    349 => 521.0,\n    350 => 635.0,\n    351 => 521.0,\n    352 => 635.0,\n    353 => 521.0,\n    354 => 611.0,\n    355 => 392.0,\n    356 => 611.0,\n    357 => 392.0,\n    358 => 611.0,\n    359 => 392.0,\n    360 => 732.0,\n    361 => 634.0,\n    362 => 732.0,\n    363 => 634.0,\n    364 => 732.0,\n    365 => 634.0,\n    366 => 732.0,\n    367 => 634.0,\n    368 => 732.0,\n    369 => 634.0,\n    370 => 732.0,\n    371 => 634.0,\n    372 => 989.0,\n    373 => 818.0,\n    374 => 611.0,\n    375 => 592.0,\n    376 => 611.0,\n    377 => 685.0,\n    378 => 525.0,\n    379 => 685.0,\n    380 => 525.0,\n    381 => 685.0,\n    382 => 525.0,\n    383 => 352.0,\n    384 => 635.0,\n    385 => 735.0,\n    386 => 686.0,\n    387 => 635.0,\n    388 => 686.0,\n    389 => 635.0,\n    390 => 703.0,\n    391 => 698.0,\n    392 => 550.0,\n    393 => 775.0,\n    394 => 819.0,\n    395 => 686.0,\n    396 => 635.0,\n    397 => 612.0,\n    398 => 632.0,\n    399 => 787.0,\n    400 => 614.0,\n    401 => 575.0,\n    402 => 352.0,\n    403 => 775.0,\n    404 => 687.0,\n    405 => 984.0,\n    406 => 354.0,\n    407 => 295.0,\n    408 => 746.0,\n    409 => 579.0,\n    410 => 278.0,\n    411 => 592.0,\n    412 => 974.0,\n    413 => 748.0,\n    414 => 634.0,\n    415 => 787.0,\n    416 => 913.0,\n    417 => 612.0,\n    418 => 949.0,\n    419 => 759.0,\n    420 => 652.0,\n    421 => 635.0,\n    422 => 695.0,\n    423 => 635.0,\n    424 => 521.0,\n    425 => 632.0,\n    426 => 336.0,\n    427 => 392.0,\n    428 => 611.0,\n    429 => 392.0,\n    430 => 611.0,\n    431 => 858.0,\n    432 => 634.0,\n    433 => 764.0,\n    434 => 721.0,\n    435 => 744.0,\n    436 => 730.0,\n    437 => 685.0,\n    438 => 525.0,\n    439 => 666.0,\n    440 => 666.0,\n    441 => 578.0,\n    442 => 525.0,\n    443 => 636.0,\n    444 => 666.0,\n    445 => 578.0,\n    446 => 510.0,\n    447 => 635.0,\n    448 => 295.0,\n    449 => 492.0,\n    450 => 459.0,\n    451 => 295.0,\n    452 => 1422.0,\n    453 => 1299.0,\n    454 => 1154.0,\n    455 => 835.0,\n    456 => 787.0,\n    457 => 457.0,\n    458 => 931.0,\n    459 => 924.0,\n    460 => 797.0,\n    461 => 684.0,\n    462 => 613.0,\n    463 => 295.0,\n    464 => 278.0,\n    465 => 787.0,\n    466 => 612.0,\n    467 => 732.0,\n    468 => 634.0,\n    469 => 732.0,\n    470 => 634.0,\n    471 => 732.0,\n    472 => 634.0,\n    473 => 732.0,\n    474 => 634.0,\n    475 => 732.0,\n    476 => 634.0,\n    477 => 615.0,\n    478 => 684.0,\n    479 => 613.0,\n    480 => 684.0,\n    481 => 613.0,\n    482 => 974.0,\n    483 => 982.0,\n    484 => 775.0,\n    485 => 635.0,\n    486 => 775.0,\n    487 => 635.0,\n    488 => 656.0,\n    489 => 579.0,\n    490 => 787.0,\n    491 => 612.0,\n    492 => 787.0,\n    493 => 612.0,\n    494 => 666.0,\n    495 => 578.0,\n    496 => 278.0,\n    497 => 1422.0,\n    498 => 1299.0,\n    499 => 1154.0,\n    500 => 775.0,\n    501 => 635.0,\n    502 => 1113.0,\n    503 => 682.0,\n    504 => 748.0,\n    505 => 634.0,\n    506 => 684.0,\n    507 => 613.0,\n    508 => 974.0,\n    509 => 982.0,\n    510 => 787.0,\n    511 => 612.0,\n    512 => 684.0,\n    513 => 613.0,\n    514 => 684.0,\n    515 => 613.0,\n    516 => 632.0,\n    517 => 615.0,\n    518 => 632.0,\n    519 => 615.0,\n    520 => 295.0,\n    521 => 278.0,\n    522 => 295.0,\n    523 => 278.0,\n    524 => 787.0,\n    525 => 612.0,\n    526 => 787.0,\n    527 => 612.0,\n    528 => 695.0,\n    529 => 411.0,\n    530 => 695.0,\n    531 => 411.0,\n    532 => 732.0,\n    533 => 634.0,\n    534 => 732.0,\n    535 => 634.0,\n    536 => 635.0,\n    537 => 521.0,\n    538 => 611.0,\n    539 => 392.0,\n    540 => 627.0,\n    541 => 521.0,\n    542 => 752.0,\n    543 => 634.0,\n    544 => 735.0,\n    545 => 838.0,\n    546 => 698.0,\n    547 => 610.0,\n    548 => 685.0,\n    549 => 525.0,\n    550 => 684.0,\n    551 => 613.0,\n    552 => 632.0,\n    553 => 615.0,\n    554 => 787.0,\n    555 => 612.0,\n    556 => 787.0,\n    557 => 612.0,\n    558 => 787.0,\n    559 => 612.0,\n    560 => 787.0,\n    561 => 612.0,\n    562 => 611.0,\n    563 => 592.0,\n    564 => 475.0,\n    565 => 843.0,\n    566 => 477.0,\n    567 => 278.0,\n    568 => 998.0,\n    569 => 998.0,\n    570 => 684.0,\n    571 => 698.0,\n    572 => 550.0,\n    573 => 557.0,\n    574 => 611.0,\n    575 => 521.0,\n    576 => 525.0,\n    577 => 603.0,\n    578 => 479.0,\n    579 => 686.0,\n    580 => 732.0,\n    581 => 684.0,\n    582 => 632.0,\n    583 => 615.0,\n    584 => 295.0,\n    585 => 278.0,\n    586 => 781.0,\n    587 => 635.0,\n    588 => 695.0,\n    589 => 411.0,\n    590 => 611.0,\n    591 => 592.0,\n    592 => 600.0,\n    593 => 635.0,\n    594 => 635.0,\n    595 => 635.0,\n    596 => 549.0,\n    597 => 550.0,\n    598 => 635.0,\n    599 => 696.0,\n    600 => 615.0,\n    601 => 615.0,\n    602 => 819.0,\n    603 => 541.0,\n    604 => 532.0,\n    605 => 775.0,\n    606 => 664.0,\n    607 => 278.0,\n    608 => 696.0,\n    609 => 635.0,\n    610 => 629.0,\n    611 => 596.0,\n    612 => 596.0,\n    613 => 634.0,\n    614 => 634.0,\n    615 => 634.0,\n    616 => 278.0,\n    617 => 338.0,\n    618 => 372.0,\n    619 => 396.0,\n    620 => 487.0,\n    621 => 278.0,\n    622 => 706.0,\n    623 => 974.0,\n    624 => 974.0,\n    625 => 974.0,\n    626 => 646.0,\n    627 => 642.0,\n    628 => 634.0,\n    629 => 612.0,\n    630 => 858.0,\n    631 => 728.0,\n    632 => 660.0,\n    633 => 414.0,\n    634 => 414.0,\n    635 => 414.0,\n    636 => 411.0,\n    637 => 411.0,\n    638 => 530.0,\n    639 => 530.0,\n    640 => 604.0,\n    641 => 604.0,\n    642 => 521.0,\n    643 => 336.0,\n    644 => 336.0,\n    645 => 461.0,\n    646 => 336.0,\n    647 => 392.0,\n    648 => 392.0,\n    649 => 634.0,\n    650 => 618.0,\n    651 => 598.0,\n    652 => 592.0,\n    653 => 818.0,\n    654 => 592.0,\n    655 => 611.0,\n    656 => 525.0,\n    657 => 525.0,\n    658 => 578.0,\n    659 => 578.0,\n    660 => 510.0,\n    661 => 510.0,\n    662 => 510.0,\n    663 => 510.0,\n    664 => 787.0,\n    665 => 580.0,\n    666 => 664.0,\n    667 => 708.0,\n    668 => 654.0,\n    669 => 292.0,\n    670 => 667.0,\n    671 => 507.0,\n    672 => 727.0,\n    673 => 510.0,\n    674 => 510.0,\n    675 => 1014.0,\n    676 => 1058.0,\n    677 => 1013.0,\n    678 => 830.0,\n    679 => 610.0,\n    680 => 778.0,\n    681 => 848.0,\n    682 => 706.0,\n    683 => 654.0,\n    684 => 515.0,\n    685 => 515.0,\n    686 => 661.0,\n    687 => 664.0,\n    688 => 404.0,\n    689 => 399.0,\n    690 => 175.0,\n    691 => 259.0,\n    692 => 295.0,\n    693 => 296.0,\n    694 => 379.0,\n    695 => 515.0,\n    696 => 373.0,\n    697 => 278.0,\n    698 => 460.0,\n    699 => 318.0,\n    700 => 318.0,\n    701 => 318.0,\n    702 => 307.0,\n    703 => 307.0,\n    704 => 370.0,\n    705 => 370.0,\n    706 => 500.0,\n    707 => 500.0,\n    708 => 500.0,\n    709 => 500.0,\n    710 => 500.0,\n    711 => 500.0,\n    712 => 275.0,\n    713 => 500.0,\n    714 => 500.0,\n    715 => 500.0,\n    716 => 275.0,\n    717 => 500.0,\n    718 => 500.0,\n    719 => 500.0,\n    720 => 337.0,\n    721 => 337.0,\n    722 => 307.0,\n    723 => 307.0,\n    724 => 500.0,\n    725 => 500.0,\n    726 => 390.0,\n    727 => 317.0,\n    728 => 500.0,\n    729 => 500.0,\n    730 => 500.0,\n    731 => 500.0,\n    732 => 500.0,\n    733 => 500.0,\n    734 => 315.0,\n    735 => 500.0,\n    736 => 426.0,\n    737 => 166.0,\n    738 => 373.0,\n    739 => 444.0,\n    740 => 370.0,\n    741 => 493.0,\n    742 => 493.0,\n    743 => 493.0,\n    744 => 493.0,\n    745 => 493.0,\n    748 => 500.0,\n    749 => 500.0,\n    750 => 518.0,\n    755 => 500.0,\n    759 => 500.0,\n    768 => 0.0,\n    769 => 0.0,\n    770 => 0.0,\n    771 => 0.0,\n    772 => 0.0,\n    773 => 0.0,\n    774 => 0.0,\n    775 => 0.0,\n    776 => 0.0,\n    777 => 0.0,\n    778 => 0.0,\n    779 => 0.0,\n    780 => 0.0,\n    781 => 0.0,\n    782 => 0.0,\n    783 => 0.0,\n    784 => 0.0,\n    785 => 0.0,\n    786 => 0.0,\n    787 => 0.0,\n    788 => 0.0,\n    789 => 0.0,\n    790 => 0.0,\n    791 => 0.0,\n    792 => 0.0,\n    793 => 0.0,\n    794 => 0.0,\n    795 => 0.0,\n    796 => 0.0,\n    797 => 0.0,\n    798 => 0.0,\n    799 => 0.0,\n    800 => 0.0,\n    801 => 0.0,\n    802 => 0.0,\n    803 => 0.0,\n    804 => 0.0,\n    805 => 0.0,\n    806 => 0.0,\n    807 => 0.0,\n    808 => 0.0,\n    809 => 0.0,\n    810 => 0.0,\n    811 => 0.0,\n    812 => 0.0,\n    813 => 0.0,\n    814 => 0.0,\n    815 => 0.0,\n    816 => 0.0,\n    817 => 0.0,\n    818 => 0.0,\n    819 => 0.0,\n    820 => 0.0,\n    821 => 0.0,\n    822 => 0.0,\n    823 => 0.0,\n    824 => 0.0,\n    825 => 0.0,\n    826 => 0.0,\n    827 => 0.0,\n    828 => 0.0,\n    829 => 0.0,\n    830 => 0.0,\n    831 => 0.0,\n    832 => 0.0,\n    833 => 0.0,\n    834 => 0.0,\n    835 => 0.0,\n    836 => 0.0,\n    837 => 0.0,\n    838 => 0.0,\n    839 => 0.0,\n    840 => 0.0,\n    841 => 0.0,\n    842 => 0.0,\n    843 => 0.0,\n    844 => 0.0,\n    845 => 0.0,\n    846 => 0.0,\n    847 => 0.0,\n    849 => 0.0,\n    850 => 0.0,\n    851 => 0.0,\n    855 => 0.0,\n    856 => 0.0,\n    858 => 0.0,\n    860 => 0.0,\n    861 => 0.0,\n    862 => 0.0,\n    863 => 0.0,\n    864 => 0.0,\n    865 => 0.0,\n    866 => 0.0,\n    880 => 654.0,\n    881 => 568.0,\n    882 => 862.0,\n    883 => 647.0,\n    884 => 278.0,\n    885 => 278.0,\n    886 => 748.0,\n    887 => 650.0,\n    890 => 500.0,\n    891 => 549.0,\n    892 => 550.0,\n    893 => 549.0,\n    894 => 337.0,\n    895 => 295.0,\n    900 => 500.0,\n    901 => 500.0,\n    902 => 692.0,\n    903 => 318.0,\n    904 => 746.0,\n    905 => 871.0,\n    906 => 408.0,\n    908 => 813.0,\n    910 => 825.0,\n    911 => 826.0,\n    912 => 338.0,\n    913 => 684.0,\n    914 => 686.0,\n    915 => 557.0,\n    916 => 684.0,\n    917 => 632.0,\n    918 => 685.0,\n    919 => 752.0,\n    920 => 787.0,\n    921 => 295.0,\n    922 => 656.0,\n    923 => 684.0,\n    924 => 863.0,\n    925 => 748.0,\n    926 => 632.0,\n    927 => 787.0,\n    928 => 752.0,\n    929 => 603.0,\n    931 => 632.0,\n    932 => 611.0,\n    933 => 611.0,\n    934 => 787.0,\n    935 => 685.0,\n    936 => 787.0,\n    937 => 764.0,\n    938 => 295.0,\n    939 => 611.0,\n    940 => 659.0,\n    941 => 541.0,\n    942 => 634.0,\n    943 => 338.0,\n    944 => 579.0,\n    945 => 659.0,\n    946 => 638.0,\n    947 => 592.0,\n    948 => 612.0,\n    949 => 541.0,\n    950 => 544.0,\n    951 => 634.0,\n    952 => 612.0,\n    953 => 338.0,\n    954 => 589.0,\n    955 => 592.0,\n    956 => 636.0,\n    957 => 559.0,\n    958 => 558.0,\n    959 => 612.0,\n    960 => 602.0,\n    961 => 635.0,\n    962 => 587.0,\n    963 => 634.0,\n    964 => 602.0,\n    965 => 579.0,\n    966 => 660.0,\n    967 => 578.0,\n    968 => 660.0,\n    969 => 837.0,\n    970 => 338.0,\n    971 => 579.0,\n    972 => 612.0,\n    973 => 579.0,\n    974 => 837.0,\n    975 => 656.0,\n    976 => 614.0,\n    977 => 619.0,\n    978 => 699.0,\n    979 => 842.0,\n    980 => 699.0,\n    981 => 660.0,\n    982 => 837.0,\n    983 => 664.0,\n    984 => 787.0,\n    985 => 612.0,\n    986 => 648.0,\n    987 => 587.0,\n    988 => 575.0,\n    989 => 458.0,\n    990 => 660.0,\n    991 => 660.0,\n    992 => 865.0,\n    993 => 627.0,\n    994 => 934.0,\n    995 => 837.0,\n    996 => 758.0,\n    997 => 659.0,\n    998 => 792.0,\n    999 => 615.0,\n    1000 => 687.0,\n    1001 => 607.0,\n    1002 => 768.0,\n    1003 => 625.0,\n    1004 => 699.0,\n    1005 => 612.0,\n    1006 => 611.0,\n    1007 => 536.0,\n    1008 => 664.0,\n    1009 => 635.0,\n    1010 => 550.0,\n    1011 => 278.0,\n    1012 => 787.0,\n    1013 => 615.0,\n    1014 => 615.0,\n    1015 => 605.0,\n    1016 => 635.0,\n    1017 => 698.0,\n    1018 => 863.0,\n    1019 => 651.0,\n    1020 => 635.0,\n    1021 => 703.0,\n    1022 => 698.0,\n    1023 => 703.0,\n    1024 => 632.0,\n    1025 => 632.0,\n    1026 => 786.0,\n    1027 => 610.0,\n    1028 => 698.0,\n    1029 => 635.0,\n    1030 => 295.0,\n    1031 => 295.0,\n    1032 => 295.0,\n    1033 => 1094.0,\n    1034 => 1045.0,\n    1035 => 786.0,\n    1036 => 710.0,\n    1037 => 748.0,\n    1038 => 609.0,\n    1039 => 752.0,\n    1040 => 684.0,\n    1041 => 686.0,\n    1042 => 686.0,\n    1043 => 610.0,\n    1044 => 781.0,\n    1045 => 632.0,\n    1046 => 1077.0,\n    1047 => 641.0,\n    1048 => 748.0,\n    1049 => 748.0,\n    1050 => 710.0,\n    1051 => 752.0,\n    1052 => 863.0,\n    1053 => 752.0,\n    1054 => 787.0,\n    1055 => 752.0,\n    1056 => 603.0,\n    1057 => 698.0,\n    1058 => 611.0,\n    1059 => 609.0,\n    1060 => 861.0,\n    1061 => 685.0,\n    1062 => 776.0,\n    1063 => 686.0,\n    1064 => 1069.0,\n    1065 => 1094.0,\n    1066 => 833.0,\n    1067 => 882.0,\n    1068 => 686.0,\n    1069 => 698.0,\n    1070 => 1080.0,\n    1071 => 695.0,\n    1072 => 613.0,\n    1073 => 617.0,\n    1074 => 589.0,\n    1075 => 525.0,\n    1076 => 691.0,\n    1077 => 615.0,\n    1078 => 901.0,\n    1079 => 532.0,\n    1080 => 650.0,\n    1081 => 650.0,\n    1082 => 604.0,\n    1083 => 639.0,\n    1084 => 754.0,\n    1085 => 654.0,\n    1086 => 612.0,\n    1087 => 654.0,\n    1088 => 635.0,\n    1089 => 550.0,\n    1090 => 583.0,\n    1091 => 592.0,\n    1092 => 855.0,\n    1093 => 592.0,\n    1094 => 681.0,\n    1095 => 591.0,\n    1096 => 915.0,\n    1097 => 942.0,\n    1098 => 707.0,\n    1099 => 790.0,\n    1100 => 589.0,\n    1101 => 549.0,\n    1102 => 842.0,\n    1103 => 602.0,\n    1104 => 615.0,\n    1105 => 615.0,\n    1106 => 625.0,\n    1107 => 525.0,\n    1108 => 549.0,\n    1109 => 521.0,\n    1110 => 278.0,\n    1111 => 278.0,\n    1112 => 278.0,\n    1113 => 902.0,\n    1114 => 898.0,\n    1115 => 652.0,\n    1116 => 604.0,\n    1117 => 650.0,\n    1118 => 592.0,\n    1119 => 654.0,\n    1120 => 934.0,\n    1121 => 837.0,\n    1122 => 771.0,\n    1123 => 672.0,\n    1124 => 942.0,\n    1125 => 749.0,\n    1126 => 879.0,\n    1127 => 783.0,\n    1128 => 1160.0,\n    1129 => 1001.0,\n    1130 => 787.0,\n    1131 => 612.0,\n    1132 => 1027.0,\n    1133 => 824.0,\n    1134 => 636.0,\n    1135 => 541.0,\n    1136 => 856.0,\n    1137 => 876.0,\n    1138 => 787.0,\n    1139 => 612.0,\n    1140 => 781.0,\n    1141 => 665.0,\n    1142 => 781.0,\n    1143 => 665.0,\n    1144 => 992.0,\n    1145 => 904.0,\n    1146 => 953.0,\n    1147 => 758.0,\n    1148 => 1180.0,\n    1149 => 1028.0,\n    1150 => 934.0,\n    1151 => 837.0,\n    1152 => 698.0,\n    1153 => 550.0,\n    1154 => 502.0,\n    1155 => 0.0,\n    1156 => 0.0,\n    1157 => 0.0,\n    1158 => 0.0,\n    1159 => 0.0,\n    1160 => 418.0,\n    1161 => 418.0,\n    1162 => 772.0,\n    1163 => 677.0,\n    1164 => 686.0,\n    1165 => 589.0,\n    1166 => 603.0,\n    1167 => 635.0,\n    1168 => 610.0,\n    1169 => 525.0,\n    1170 => 675.0,\n    1171 => 590.0,\n    1172 => 624.0,\n    1173 => 530.0,\n    1174 => 1077.0,\n    1175 => 901.0,\n    1176 => 641.0,\n    1177 => 532.0,\n    1178 => 710.0,\n    1179 => 604.0,\n    1180 => 710.0,\n    1181 => 604.0,\n    1182 => 710.0,\n    1183 => 604.0,\n    1184 => 856.0,\n    1185 => 832.0,\n    1186 => 752.0,\n    1187 => 661.0,\n    1188 => 1014.0,\n    1189 => 877.0,\n    1190 => 1081.0,\n    1191 => 916.0,\n    1192 => 878.0,\n    1193 => 693.0,\n    1194 => 698.0,\n    1195 => 550.0,\n    1196 => 611.0,\n    1197 => 583.0,\n    1198 => 611.0,\n    1199 => 592.0,\n    1200 => 611.0,\n    1201 => 592.0,\n    1202 => 685.0,\n    1203 => 592.0,\n    1204 => 934.0,\n    1205 => 807.0,\n    1206 => 686.0,\n    1207 => 591.0,\n    1208 => 686.0,\n    1209 => 591.0,\n    1210 => 686.0,\n    1211 => 634.0,\n    1212 => 941.0,\n    1213 => 728.0,\n    1214 => 941.0,\n    1215 => 728.0,\n    1216 => 295.0,\n    1217 => 1077.0,\n    1218 => 901.0,\n    1219 => 656.0,\n    1220 => 604.0,\n    1221 => 776.0,\n    1222 => 670.0,\n    1223 => 752.0,\n    1224 => 661.0,\n    1225 => 776.0,\n    1226 => 681.0,\n    1227 => 686.0,\n    1228 => 591.0,\n    1229 => 888.0,\n    1230 => 774.0,\n    1231 => 278.0,\n    1232 => 684.0,\n    1233 => 613.0,\n    1234 => 684.0,\n    1235 => 613.0,\n    1236 => 974.0,\n    1237 => 982.0,\n    1238 => 632.0,\n    1239 => 615.0,\n    1240 => 787.0,\n    1241 => 615.0,\n    1242 => 787.0,\n    1243 => 615.0,\n    1244 => 1077.0,\n    1245 => 901.0,\n    1246 => 641.0,\n    1247 => 532.0,\n    1248 => 666.0,\n    1249 => 578.0,\n    1250 => 748.0,\n    1251 => 650.0,\n    1252 => 748.0,\n    1253 => 650.0,\n    1254 => 787.0,\n    1255 => 612.0,\n    1256 => 787.0,\n    1257 => 612.0,\n    1258 => 787.0,\n    1259 => 612.0,\n    1260 => 698.0,\n    1261 => 549.0,\n    1262 => 609.0,\n    1263 => 592.0,\n    1264 => 609.0,\n    1265 => 592.0,\n    1266 => 609.0,\n    1267 => 592.0,\n    1268 => 686.0,\n    1269 => 591.0,\n    1270 => 610.0,\n    1271 => 525.0,\n    1272 => 882.0,\n    1273 => 790.0,\n    1274 => 675.0,\n    1275 => 590.0,\n    1276 => 685.0,\n    1277 => 592.0,\n    1278 => 685.0,\n    1279 => 592.0,\n    1280 => 686.0,\n    1281 => 589.0,\n    1282 => 1006.0,\n    1283 => 897.0,\n    1284 => 975.0,\n    1285 => 869.0,\n    1286 => 679.0,\n    1287 => 588.0,\n    1288 => 1072.0,\n    1289 => 957.0,\n    1290 => 1113.0,\n    1291 => 967.0,\n    1292 => 775.0,\n    1293 => 660.0,\n    1294 => 773.0,\n    1295 => 711.0,\n    1296 => 614.0,\n    1297 => 541.0,\n    1298 => 752.0,\n    1299 => 639.0,\n    1300 => 1169.0,\n    1301 => 994.0,\n    1302 => 894.0,\n    1303 => 864.0,\n    1304 => 1032.0,\n    1305 => 986.0,\n    1306 => 787.0,\n    1307 => 635.0,\n    1308 => 989.0,\n    1309 => 818.0,\n    1310 => 710.0,\n    1311 => 604.0,\n    1312 => 1081.0,\n    1313 => 905.0,\n    1314 => 1081.0,\n    1315 => 912.0,\n    1316 => 793.0,\n    1317 => 683.0,\n    1329 => 766.0,\n    1330 => 732.0,\n    1331 => 753.0,\n    1332 => 753.0,\n    1333 => 732.0,\n    1334 => 772.0,\n    1335 => 640.0,\n    1336 => 732.0,\n    1337 => 859.0,\n    1338 => 753.0,\n    1339 => 691.0,\n    1340 => 533.0,\n    1341 => 922.0,\n    1342 => 863.0,\n    1343 => 732.0,\n    1344 => 716.0,\n    1345 => 766.0,\n    1346 => 753.0,\n    1347 => 767.0,\n    1348 => 792.0,\n    1349 => 728.0,\n    1350 => 729.0,\n    1351 => 757.0,\n    1352 => 732.0,\n    1353 => 713.0,\n    1354 => 800.0,\n    1355 => 768.0,\n    1356 => 792.0,\n    1357 => 732.0,\n    1358 => 753.0,\n    1359 => 705.0,\n    1360 => 694.0,\n    1361 => 744.0,\n    1362 => 538.0,\n    1363 => 811.0,\n    1364 => 757.0,\n    1365 => 787.0,\n    1366 => 790.0,\n    1369 => 307.0,\n    1370 => 318.0,\n    1371 => 234.0,\n    1372 => 361.0,\n    1373 => 238.0,\n    1374 => 405.0,\n    1375 => 500.0,\n    1377 => 974.0,\n    1378 => 634.0,\n    1379 => 658.0,\n    1380 => 663.0,\n    1381 => 634.0,\n    1382 => 635.0,\n    1383 => 515.0,\n    1384 => 634.0,\n    1385 => 738.0,\n    1386 => 658.0,\n    1387 => 634.0,\n    1388 => 271.0,\n    1389 => 980.0,\n    1390 => 623.0,\n    1391 => 634.0,\n    1392 => 634.0,\n    1393 => 608.0,\n    1394 => 634.0,\n    1395 => 629.0,\n    1396 => 634.0,\n    1397 => 271.0,\n    1398 => 634.0,\n    1399 => 499.0,\n    1400 => 634.0,\n    1401 => 404.0,\n    1402 => 974.0,\n    1403 => 560.0,\n    1404 => 648.0,\n    1405 => 634.0,\n    1406 => 634.0,\n    1407 => 974.0,\n    1408 => 634.0,\n    1409 => 633.0,\n    1410 => 435.0,\n    1411 => 974.0,\n    1412 => 636.0,\n    1413 => 609.0,\n    1414 => 805.0,\n    1415 => 812.0,\n    1417 => 337.0,\n    1418 => 361.0,\n    1456 => 0.0,\n    1457 => 0.0,\n    1458 => 0.0,\n    1459 => 0.0,\n    1460 => 0.0,\n    1461 => 0.0,\n    1462 => 0.0,\n    1463 => 0.0,\n    1464 => 0.0,\n    1465 => 0.0,\n    1466 => 0.0,\n    1467 => 0.0,\n    1468 => 0.0,\n    1469 => 0.0,\n    1470 => 361.0,\n    1471 => 0.0,\n    1472 => 295.0,\n    1473 => 0.0,\n    1474 => 0.0,\n    1475 => 295.0,\n    1478 => 441.0,\n    1479 => 0.0,\n    1488 => 668.0,\n    1489 => 578.0,\n    1490 => 412.0,\n    1491 => 546.0,\n    1492 => 653.0,\n    1493 => 272.0,\n    1494 => 346.0,\n    1495 => 653.0,\n    1496 => 648.0,\n    1497 => 224.0,\n    1498 => 537.0,\n    1499 => 529.0,\n    1500 => 568.0,\n    1501 => 664.0,\n    1502 => 679.0,\n    1503 => 272.0,\n    1504 => 400.0,\n    1505 => 649.0,\n    1506 => 626.0,\n    1507 => 640.0,\n    1508 => 625.0,\n    1509 => 540.0,\n    1510 => 593.0,\n    1511 => 709.0,\n    1512 => 564.0,\n    1513 => 708.0,\n    1514 => 657.0,\n    1520 => 471.0,\n    1521 => 423.0,\n    1522 => 331.0,\n    1523 => 416.0,\n    1524 => 645.0,\n    1542 => 637.0,\n    1543 => 637.0,\n    1545 => 757.0,\n    1546 => 977.0,\n    1548 => 323.0,\n    1557 => 0.0,\n    1563 => 318.0,\n    1567 => 531.0,\n    1569 => 470.0,\n    1570 => 278.0,\n    1571 => 278.0,\n    1572 => 483.0,\n    1573 => 278.0,\n    1574 => 783.0,\n    1575 => 278.0,\n    1576 => 941.0,\n    1577 => 524.0,\n    1578 => 941.0,\n    1579 => 941.0,\n    1580 => 646.0,\n    1581 => 646.0,\n    1582 => 646.0,\n    1583 => 445.0,\n    1584 => 445.0,\n    1585 => 483.0,\n    1586 => 483.0,\n    1587 => 1221.0,\n    1588 => 1221.0,\n    1589 => 1209.0,\n    1590 => 1209.0,\n    1591 => 925.0,\n    1592 => 925.0,\n    1593 => 597.0,\n    1594 => 597.0,\n    1600 => 293.0,\n    1601 => 1037.0,\n    1602 => 776.0,\n    1603 => 824.0,\n    1604 => 727.0,\n    1605 => 619.0,\n    1606 => 734.0,\n    1607 => 524.0,\n    1608 => 483.0,\n    1609 => 783.0,\n    1610 => 783.0,\n    1611 => 0.0,\n    1612 => 0.0,\n    1613 => 0.0,\n    1614 => 0.0,\n    1615 => 0.0,\n    1616 => 0.0,\n    1617 => 0.0,\n    1618 => 0.0,\n    1619 => 0.0,\n    1620 => 0.0,\n    1621 => 0.0,\n    1623 => 0.0,\n    1626 => 500.0,\n    1632 => 537.0,\n    1633 => 537.0,\n    1634 => 537.0,\n    1635 => 537.0,\n    1636 => 537.0,\n    1637 => 537.0,\n    1638 => 537.0,\n    1639 => 537.0,\n    1640 => 537.0,\n    1641 => 537.0,\n    1642 => 537.0,\n    1643 => 325.0,\n    1644 => 318.0,\n    1645 => 545.0,\n    1646 => 941.0,\n    1647 => 776.0,\n    1648 => 0.0,\n    1652 => 292.0,\n    1657 => 941.0,\n    1658 => 941.0,\n    1659 => 941.0,\n    1660 => 941.0,\n    1661 => 941.0,\n    1662 => 941.0,\n    1663 => 941.0,\n    1664 => 941.0,\n    1665 => 646.0,\n    1666 => 646.0,\n    1667 => 646.0,\n    1668 => 646.0,\n    1669 => 646.0,\n    1670 => 646.0,\n    1671 => 646.0,\n    1672 => 445.0,\n    1673 => 445.0,\n    1674 => 445.0,\n    1675 => 445.0,\n    1676 => 445.0,\n    1677 => 445.0,\n    1678 => 445.0,\n    1679 => 445.0,\n    1680 => 445.0,\n    1681 => 483.0,\n    1682 => 483.0,\n    1683 => 498.0,\n    1684 => 530.0,\n    1685 => 610.0,\n    1686 => 530.0,\n    1687 => 483.0,\n    1688 => 483.0,\n    1689 => 483.0,\n    1690 => 1221.0,\n    1691 => 1221.0,\n    1692 => 1221.0,\n    1693 => 1209.0,\n    1694 => 1209.0,\n    1695 => 925.0,\n    1696 => 597.0,\n    1697 => 1037.0,\n    1698 => 1037.0,\n    1699 => 1037.0,\n    1700 => 1037.0,\n    1701 => 1037.0,\n    1702 => 1037.0,\n    1703 => 776.0,\n    1704 => 776.0,\n    1705 => 895.0,\n    1706 => 1054.0,\n    1707 => 895.0,\n    1708 => 824.0,\n    1709 => 824.0,\n    1710 => 824.0,\n    1711 => 895.0,\n    1712 => 895.0,\n    1713 => 895.0,\n    1714 => 895.0,\n    1715 => 895.0,\n    1716 => 895.0,\n    1717 => 727.0,\n    1718 => 727.0,\n    1719 => 727.0,\n    1720 => 727.0,\n    1721 => 734.0,\n    1722 => 734.0,\n    1723 => 734.0,\n    1724 => 734.0,\n    1725 => 734.0,\n    1726 => 698.0,\n    1727 => 646.0,\n    1734 => 483.0,\n    1735 => 483.0,\n    1736 => 483.0,\n    1739 => 483.0,\n    1740 => 783.0,\n    1742 => 783.0,\n    1744 => 783.0,\n    1749 => 524.0,\n    1776 => 537.0,\n    1777 => 537.0,\n    1778 => 537.0,\n    1779 => 537.0,\n    1780 => 537.0,\n    1781 => 537.0,\n    1782 => 537.0,\n    1783 => 537.0,\n    1784 => 537.0,\n    1785 => 537.0,\n    1984 => 636.0,\n    1985 => 636.0,\n    1986 => 636.0,\n    1987 => 636.0,\n    1988 => 636.0,\n    1989 => 636.0,\n    1990 => 636.0,\n    1991 => 636.0,\n    1992 => 636.0,\n    1993 => 636.0,\n    1994 => 278.0,\n    1995 => 571.0,\n    1996 => 424.0,\n    1997 => 592.0,\n    1998 => 654.0,\n    1999 => 654.0,\n    2000 => 594.0,\n    2001 => 654.0,\n    2002 => 829.0,\n    2003 => 438.0,\n    2004 => 438.0,\n    2005 => 559.0,\n    2006 => 612.0,\n    2007 => 350.0,\n    2008 => 959.0,\n    2009 => 473.0,\n    2010 => 783.0,\n    2011 => 654.0,\n    2012 => 625.0,\n    2013 => 734.0,\n    2014 => 530.0,\n    2015 => 724.0,\n    2016 => 473.0,\n    2017 => 625.0,\n    2018 => 594.0,\n    2019 => 530.0,\n    2020 => 530.0,\n    2021 => 522.0,\n    2022 => 594.0,\n    2023 => 594.0,\n    2027 => 0.0,\n    2028 => 0.0,\n    2029 => 0.0,\n    2030 => 0.0,\n    2031 => 0.0,\n    2032 => 0.0,\n    2033 => 0.0,\n    2034 => 0.0,\n    2035 => 0.0,\n    2036 => 313.0,\n    2037 => 313.0,\n    2040 => 560.0,\n    2041 => 560.0,\n    2042 => 361.0,\n    3647 => 636.0,\n    3713 => 670.0,\n    3714 => 684.0,\n    3716 => 688.0,\n    3719 => 482.0,\n    3720 => 628.0,\n    3722 => 684.0,\n    3725 => 688.0,\n    3732 => 669.0,\n    3733 => 642.0,\n    3734 => 645.0,\n    3735 => 655.0,\n    3737 => 659.0,\n    3738 => 625.0,\n    3739 => 625.0,\n    3740 => 745.0,\n    3741 => 767.0,\n    3742 => 687.0,\n    3743 => 687.0,\n    3745 => 702.0,\n    3746 => 688.0,\n    3747 => 684.0,\n    3749 => 649.0,\n    3751 => 632.0,\n    3754 => 703.0,\n    3755 => 819.0,\n    3757 => 633.0,\n    3758 => 684.0,\n    3759 => 788.0,\n    3760 => 632.0,\n    3761 => 0.0,\n    3762 => 539.0,\n    3763 => 539.0,\n    3764 => 0.0,\n    3765 => 0.0,\n    3766 => 0.0,\n    3767 => 0.0,\n    3768 => 0.0,\n    3769 => 0.0,\n    3771 => 0.0,\n    3772 => 0.0,\n    3773 => 663.0,\n    3776 => 375.0,\n    3777 => 657.0,\n    3778 => 460.0,\n    3779 => 547.0,\n    3780 => 491.0,\n    3782 => 674.0,\n    3784 => 0.0,\n    3785 => 0.0,\n    3786 => 0.0,\n    3787 => 0.0,\n    3788 => 0.0,\n    3789 => 0.0,\n    3792 => 636.0,\n    3793 => 641.0,\n    3794 => 641.0,\n    3795 => 670.0,\n    3796 => 625.0,\n    3797 => 625.0,\n    3798 => 703.0,\n    3799 => 670.0,\n    3800 => 674.0,\n    3801 => 677.0,\n    3804 => 1028.0,\n    3805 => 1028.0,\n    4256 => 874.0,\n    4257 => 733.0,\n    4258 => 679.0,\n    4259 => 834.0,\n    4260 => 615.0,\n    4261 => 768.0,\n    4262 => 753.0,\n    4263 => 914.0,\n    4264 => 453.0,\n    4265 => 620.0,\n    4266 => 843.0,\n    4267 => 882.0,\n    4268 => 625.0,\n    4269 => 854.0,\n    4270 => 781.0,\n    4271 => 629.0,\n    4272 => 912.0,\n    4273 => 621.0,\n    4274 => 620.0,\n    4275 => 854.0,\n    4276 => 866.0,\n    4277 => 724.0,\n    4278 => 630.0,\n    4279 => 621.0,\n    4280 => 625.0,\n    4281 => 620.0,\n    4282 => 818.0,\n    4283 => 874.0,\n    4284 => 615.0,\n    4285 => 623.0,\n    4286 => 625.0,\n    4287 => 725.0,\n    4288 => 844.0,\n    4289 => 596.0,\n    4290 => 688.0,\n    4291 => 596.0,\n    4292 => 594.0,\n    4293 => 738.0,\n    4304 => 508.0,\n    4305 => 518.0,\n    4306 => 581.0,\n    4307 => 818.0,\n    4308 => 508.0,\n    4309 => 513.0,\n    4310 => 500.0,\n    4311 => 801.0,\n    4312 => 518.0,\n    4313 => 510.0,\n    4314 => 1064.0,\n    4315 => 522.0,\n    4316 => 522.0,\n    4317 => 786.0,\n    4318 => 508.0,\n    4319 => 518.0,\n    4320 => 796.0,\n    4321 => 522.0,\n    4322 => 654.0,\n    4323 => 522.0,\n    4324 => 825.0,\n    4325 => 513.0,\n    4326 => 786.0,\n    4327 => 518.0,\n    4328 => 518.0,\n    4329 => 522.0,\n    4330 => 571.0,\n    4331 => 522.0,\n    4332 => 518.0,\n    4333 => 520.0,\n    4334 => 522.0,\n    4335 => 454.0,\n    4336 => 508.0,\n    4337 => 518.0,\n    4338 => 508.0,\n    4339 => 508.0,\n    4340 => 518.0,\n    4341 => 554.0,\n    4342 => 828.0,\n    4343 => 552.0,\n    4344 => 508.0,\n    4345 => 571.0,\n    4346 => 508.0,\n    4347 => 448.0,\n    4348 => 324.0,\n    5121 => 684.0,\n    5122 => 684.0,\n    5123 => 684.0,\n    5124 => 684.0,\n    5125 => 769.0,\n    5126 => 769.0,\n    5127 => 769.0,\n    5129 => 769.0,\n    5130 => 769.0,\n    5131 => 769.0,\n    5132 => 835.0,\n    5133 => 834.0,\n    5134 => 835.0,\n    5135 => 834.0,\n    5136 => 835.0,\n    5137 => 834.0,\n    5138 => 967.0,\n    5139 => 1007.0,\n    5140 => 967.0,\n    5141 => 1007.0,\n    5142 => 769.0,\n    5143 => 967.0,\n    5144 => 1007.0,\n    5145 => 967.0,\n    5146 => 1007.0,\n    5147 => 769.0,\n    5149 => 256.0,\n    5150 => 543.0,\n    5151 => 423.0,\n    5152 => 423.0,\n    5153 => 389.0,\n    5154 => 389.0,\n    5155 => 393.0,\n    5156 => 389.0,\n    5157 => 466.0,\n    5158 => 385.0,\n    5159 => 256.0,\n    5160 => 389.0,\n    5161 => 389.0,\n    5162 => 389.0,\n    5163 => 1090.0,\n    5164 => 909.0,\n    5165 => 953.0,\n    5166 => 1117.0,\n    5167 => 684.0,\n    5168 => 684.0,\n    5169 => 684.0,\n    5170 => 684.0,\n    5171 => 729.0,\n    5172 => 729.0,\n    5173 => 729.0,\n    5175 => 729.0,\n    5176 => 729.0,\n    5177 => 729.0,\n    5178 => 835.0,\n    5179 => 684.0,\n    5180 => 835.0,\n    5181 => 834.0,\n    5182 => 835.0,\n    5183 => 834.0,\n    5184 => 967.0,\n    5185 => 1007.0,\n    5186 => 967.0,\n    5187 => 1007.0,\n    5188 => 967.0,\n    5189 => 1007.0,\n    5190 => 967.0,\n    5191 => 1007.0,\n    5192 => 729.0,\n    5193 => 508.0,\n    5194 => 192.0,\n    5196 => 732.0,\n    5197 => 732.0,\n    5198 => 732.0,\n    5199 => 732.0,\n    5200 => 730.0,\n    5201 => 730.0,\n    5202 => 730.0,\n    5204 => 730.0,\n    5205 => 730.0,\n    5206 => 730.0,\n    5207 => 921.0,\n    5208 => 889.0,\n    5209 => 921.0,\n    5210 => 889.0,\n    5211 => 921.0,\n    5212 => 889.0,\n    5213 => 928.0,\n    5214 => 900.0,\n    5215 => 928.0,\n    5216 => 900.0,\n    5217 => 947.0,\n    5218 => 900.0,\n    5219 => 947.0,\n    5220 => 900.0,\n    5221 => 947.0,\n    5222 => 434.0,\n    5223 => 877.0,\n    5224 => 877.0,\n    5225 => 866.0,\n    5226 => 890.0,\n    5227 => 628.0,\n    5228 => 628.0,\n    5229 => 628.0,\n    5230 => 628.0,\n    5231 => 628.0,\n    5232 => 628.0,\n    5233 => 628.0,\n    5234 => 628.0,\n    5235 => 628.0,\n    5236 => 860.0,\n    5237 => 771.0,\n    5238 => 815.0,\n    5239 => 816.0,\n    5240 => 815.0,\n    5241 => 816.0,\n    5242 => 860.0,\n    5243 => 771.0,\n    5244 => 860.0,\n    5245 => 771.0,\n    5246 => 815.0,\n    5247 => 816.0,\n    5248 => 815.0,\n    5249 => 816.0,\n    5250 => 815.0,\n    5251 => 407.0,\n    5252 => 407.0,\n    5253 => 750.0,\n    5254 => 775.0,\n    5255 => 750.0,\n    5256 => 775.0,\n    5257 => 628.0,\n    5258 => 628.0,\n    5259 => 628.0,\n    5260 => 628.0,\n    5261 => 628.0,\n    5262 => 628.0,\n    5263 => 628.0,\n    5264 => 628.0,\n    5265 => 628.0,\n    5266 => 860.0,\n    5267 => 771.0,\n    5268 => 815.0,\n    5269 => 816.0,\n    5270 => 815.0,\n    5271 => 816.0,\n    5272 => 860.0,\n    5273 => 771.0,\n    5274 => 860.0,\n    5275 => 771.0,\n    5276 => 815.0,\n    5277 => 816.0,\n    5278 => 815.0,\n    5279 => 816.0,\n    5280 => 815.0,\n    5281 => 435.0,\n    5282 => 435.0,\n    5283 => 610.0,\n    5284 => 557.0,\n    5285 => 557.0,\n    5286 => 557.0,\n    5287 => 610.0,\n    5288 => 610.0,\n    5289 => 610.0,\n    5290 => 557.0,\n    5291 => 557.0,\n    5292 => 749.0,\n    5293 => 769.0,\n    5294 => 746.0,\n    5295 => 764.0,\n    5296 => 746.0,\n    5297 => 764.0,\n    5298 => 749.0,\n    5299 => 769.0,\n    5300 => 749.0,\n    5301 => 769.0,\n    5302 => 746.0,\n    5303 => 764.0,\n    5304 => 746.0,\n    5305 => 764.0,\n    5306 => 746.0,\n    5307 => 386.0,\n    5308 => 508.0,\n    5309 => 386.0,\n    5312 => 852.0,\n    5313 => 852.0,\n    5314 => 852.0,\n    5315 => 852.0,\n    5316 => 852.0,\n    5317 => 852.0,\n    5318 => 852.0,\n    5319 => 852.0,\n    5320 => 852.0,\n    5321 => 1069.0,\n    5322 => 1035.0,\n    5323 => 1059.0,\n    5324 => 852.0,\n    5325 => 1059.0,\n    5326 => 852.0,\n    5327 => 852.0,\n    5328 => 600.0,\n    5329 => 453.0,\n    5330 => 600.0,\n    5331 => 852.0,\n    5332 => 852.0,\n    5333 => 852.0,\n    5334 => 852.0,\n    5335 => 852.0,\n    5336 => 852.0,\n    5337 => 852.0,\n    5338 => 852.0,\n    5339 => 852.0,\n    5340 => 1069.0,\n    5341 => 1035.0,\n    5342 => 1059.0,\n    5343 => 1030.0,\n    5344 => 1059.0,\n    5345 => 1030.0,\n    5346 => 1069.0,\n    5347 => 1035.0,\n    5348 => 1069.0,\n    5349 => 1035.0,\n    5350 => 1083.0,\n    5351 => 1030.0,\n    5352 => 1083.0,\n    5353 => 1030.0,\n    5354 => 600.0,\n    5356 => 729.0,\n    5357 => 603.0,\n    5358 => 603.0,\n    5359 => 603.0,\n    5360 => 603.0,\n    5361 => 603.0,\n    5362 => 603.0,\n    5363 => 603.0,\n    5364 => 603.0,\n    5365 => 603.0,\n    5366 => 834.0,\n    5367 => 754.0,\n    5368 => 792.0,\n    5369 => 771.0,\n    5370 => 792.0,\n    5371 => 771.0,\n    5372 => 834.0,\n    5373 => 754.0,\n    5374 => 834.0,\n    5375 => 754.0,\n    5376 => 792.0,\n    5377 => 771.0,\n    5378 => 792.0,\n    5379 => 771.0,\n    5380 => 792.0,\n    5381 => 418.0,\n    5382 => 420.0,\n    5383 => 418.0,\n    5392 => 712.0,\n    5393 => 712.0,\n    5394 => 712.0,\n    5395 => 892.0,\n    5396 => 892.0,\n    5397 => 892.0,\n    5398 => 892.0,\n    5399 => 910.0,\n    5400 => 872.0,\n    5401 => 910.0,\n    5402 => 872.0,\n    5403 => 910.0,\n    5404 => 872.0,\n    5405 => 1140.0,\n    5406 => 1100.0,\n    5407 => 1140.0,\n    5408 => 1100.0,\n    5409 => 1140.0,\n    5410 => 1100.0,\n    5411 => 1140.0,\n    5412 => 1100.0,\n    5413 => 641.0,\n    5414 => 627.0,\n    5415 => 627.0,\n    5416 => 627.0,\n    5417 => 627.0,\n    5418 => 627.0,\n    5419 => 627.0,\n    5420 => 627.0,\n    5421 => 627.0,\n    5422 => 627.0,\n    5423 => 844.0,\n    5424 => 781.0,\n    5425 => 816.0,\n    5426 => 818.0,\n    5427 => 816.0,\n    5428 => 818.0,\n    5429 => 844.0,\n    5430 => 781.0,\n    5431 => 844.0,\n    5432 => 781.0,\n    5433 => 816.0,\n    5434 => 818.0,\n    5435 => 816.0,\n    5436 => 818.0,\n    5437 => 816.0,\n    5438 => 418.0,\n    5440 => 389.0,\n    5441 => 484.0,\n    5442 => 916.0,\n    5443 => 916.0,\n    5444 => 916.0,\n    5445 => 916.0,\n    5446 => 916.0,\n    5447 => 916.0,\n    5448 => 603.0,\n    5449 => 603.0,\n    5450 => 603.0,\n    5451 => 603.0,\n    5452 => 603.0,\n    5453 => 603.0,\n    5454 => 834.0,\n    5455 => 754.0,\n    5456 => 418.0,\n    5458 => 729.0,\n    5459 => 684.0,\n    5460 => 684.0,\n    5461 => 684.0,\n    5462 => 684.0,\n    5463 => 726.0,\n    5464 => 726.0,\n    5465 => 726.0,\n    5466 => 726.0,\n    5467 => 924.0,\n    5468 => 1007.0,\n    5469 => 508.0,\n    5470 => 732.0,\n    5471 => 732.0,\n    5472 => 732.0,\n    5473 => 732.0,\n    5474 => 732.0,\n    5475 => 732.0,\n    5476 => 730.0,\n    5477 => 730.0,\n    5478 => 730.0,\n    5479 => 730.0,\n    5480 => 947.0,\n    5481 => 900.0,\n    5482 => 508.0,\n    5492 => 831.0,\n    5493 => 831.0,\n    5494 => 831.0,\n    5495 => 831.0,\n    5496 => 831.0,\n    5497 => 831.0,\n    5498 => 831.0,\n    5499 => 563.0,\n    5500 => 752.0,\n    5501 => 484.0,\n    5502 => 1047.0,\n    5503 => 1047.0,\n    5504 => 1047.0,\n    5505 => 1047.0,\n    5506 => 1047.0,\n    5507 => 1047.0,\n    5508 => 1047.0,\n    5509 => 825.0,\n    5514 => 831.0,\n    5515 => 831.0,\n    5516 => 831.0,\n    5517 => 831.0,\n    5518 => 1259.0,\n    5519 => 1259.0,\n    5520 => 1259.0,\n    5521 => 1002.0,\n    5522 => 1002.0,\n    5523 => 1259.0,\n    5524 => 1259.0,\n    5525 => 700.0,\n    5526 => 1073.0,\n    5536 => 852.0,\n    5537 => 852.0,\n    5538 => 852.0,\n    5539 => 852.0,\n    5540 => 852.0,\n    5541 => 852.0,\n    5542 => 600.0,\n    5543 => 643.0,\n    5544 => 643.0,\n    5545 => 643.0,\n    5546 => 643.0,\n    5547 => 643.0,\n    5548 => 643.0,\n    5549 => 643.0,\n    5550 => 418.0,\n    5551 => 628.0,\n    5598 => 770.0,\n    5601 => 767.0,\n    5702 => 468.0,\n    5703 => 468.0,\n    5742 => 444.0,\n    5743 => 1047.0,\n    5744 => 1310.0,\n    5745 => 1632.0,\n    5746 => 1632.0,\n    5747 => 1375.0,\n    5748 => 1375.0,\n    5749 => 1632.0,\n    5750 => 1632.0,\n    5760 => 477.0,\n    5761 => 493.0,\n    5762 => 712.0,\n    5763 => 931.0,\n    5764 => 1150.0,\n    5765 => 1370.0,\n    5766 => 493.0,\n    5767 => 712.0,\n    5768 => 931.0,\n    5769 => 1150.0,\n    5770 => 1370.0,\n    5771 => 498.0,\n    5772 => 718.0,\n    5773 => 938.0,\n    5774 => 1159.0,\n    5775 => 1379.0,\n    5776 => 493.0,\n    5777 => 712.0,\n    5778 => 930.0,\n    5779 => 1149.0,\n    5780 => 1370.0,\n    5781 => 498.0,\n    5782 => 752.0,\n    5783 => 789.0,\n    5784 => 1205.0,\n    5785 => 1150.0,\n    5786 => 683.0,\n    5787 => 507.0,\n    5788 => 507.0,\n    7424 => 592.0,\n    7425 => 717.0,\n    7426 => 982.0,\n    7427 => 586.0,\n    7428 => 550.0,\n    7429 => 605.0,\n    7430 => 605.0,\n    7431 => 491.0,\n    7432 => 541.0,\n    7433 => 278.0,\n    7434 => 395.0,\n    7435 => 579.0,\n    7436 => 583.0,\n    7437 => 754.0,\n    7438 => 650.0,\n    7439 => 612.0,\n    7440 => 550.0,\n    7441 => 684.0,\n    7442 => 684.0,\n    7443 => 684.0,\n    7444 => 1023.0,\n    7446 => 612.0,\n    7447 => 612.0,\n    7448 => 524.0,\n    7449 => 602.0,\n    7450 => 602.0,\n    7451 => 583.0,\n    7452 => 574.0,\n    7453 => 737.0,\n    7454 => 948.0,\n    7455 => 638.0,\n    7456 => 592.0,\n    7457 => 818.0,\n    7458 => 525.0,\n    7459 => 526.0,\n    7462 => 583.0,\n    7463 => 592.0,\n    7464 => 564.0,\n    7465 => 524.0,\n    7466 => 590.0,\n    7467 => 639.0,\n    7468 => 431.0,\n    7469 => 613.0,\n    7470 => 432.0,\n    7472 => 485.0,\n    7473 => 398.0,\n    7474 => 398.0,\n    7475 => 488.0,\n    7476 => 474.0,\n    7477 => 186.0,\n    7478 => 186.0,\n    7479 => 413.0,\n    7480 => 351.0,\n    7481 => 543.0,\n    7482 => 471.0,\n    7483 => 471.0,\n    7484 => 496.0,\n    7485 => 439.0,\n    7486 => 380.0,\n    7487 => 438.0,\n    7488 => 385.0,\n    7489 => 461.0,\n    7490 => 623.0,\n    7491 => 392.0,\n    7492 => 392.0,\n    7493 => 405.0,\n    7494 => 648.0,\n    7495 => 428.0,\n    7496 => 405.0,\n    7497 => 417.0,\n    7498 => 417.0,\n    7499 => 360.0,\n    7500 => 359.0,\n    7501 => 405.0,\n    7502 => 179.0,\n    7503 => 426.0,\n    7504 => 623.0,\n    7505 => 409.0,\n    7506 => 414.0,\n    7507 => 370.0,\n    7508 => 414.0,\n    7509 => 414.0,\n    7510 => 428.0,\n    7511 => 295.0,\n    7512 => 405.0,\n    7513 => 470.0,\n    7514 => 623.0,\n    7515 => 417.0,\n    7517 => 402.0,\n    7518 => 373.0,\n    7519 => 385.0,\n    7520 => 416.0,\n    7521 => 364.0,\n    7522 => 179.0,\n    7523 => 259.0,\n    7524 => 405.0,\n    7525 => 417.0,\n    7526 => 402.0,\n    7527 => 373.0,\n    7528 => 412.0,\n    7529 => 416.0,\n    7530 => 364.0,\n    7543 => 635.0,\n    7544 => 474.0,\n    7547 => 372.0,\n    7549 => 667.0,\n    7557 => 278.0,\n    7579 => 405.0,\n    7580 => 370.0,\n    7581 => 370.0,\n    7582 => 414.0,\n    7583 => 360.0,\n    7584 => 296.0,\n    7585 => 233.0,\n    7586 => 405.0,\n    7587 => 405.0,\n    7588 => 261.0,\n    7589 => 250.0,\n    7590 => 261.0,\n    7591 => 261.0,\n    7592 => 234.0,\n    7593 => 250.0,\n    7594 => 235.0,\n    7595 => 376.0,\n    7596 => 623.0,\n    7597 => 623.0,\n    7598 => 411.0,\n    7599 => 479.0,\n    7600 => 409.0,\n    7601 => 414.0,\n    7602 => 414.0,\n    7603 => 360.0,\n    7604 => 287.0,\n    7605 => 295.0,\n    7606 => 508.0,\n    7607 => 418.0,\n    7608 => 361.0,\n    7609 => 406.0,\n    7610 => 417.0,\n    7611 => 366.0,\n    7612 => 437.0,\n    7613 => 366.0,\n    7614 => 392.0,\n    7615 => 414.0,\n    7620 => 0.0,\n    7621 => 0.0,\n    7622 => 0.0,\n    7623 => 0.0,\n    7624 => 0.0,\n    7625 => 0.0,\n    7680 => 684.0,\n    7681 => 613.0,\n    7682 => 686.0,\n    7683 => 635.0,\n    7684 => 686.0,\n    7685 => 635.0,\n    7686 => 686.0,\n    7687 => 635.0,\n    7688 => 698.0,\n    7689 => 550.0,\n    7690 => 770.0,\n    7691 => 635.0,\n    7692 => 770.0,\n    7693 => 635.0,\n    7694 => 770.0,\n    7695 => 635.0,\n    7696 => 770.0,\n    7697 => 635.0,\n    7698 => 770.0,\n    7699 => 635.0,\n    7700 => 632.0,\n    7701 => 615.0,\n    7702 => 632.0,\n    7703 => 615.0,\n    7704 => 632.0,\n    7705 => 615.0,\n    7706 => 632.0,\n    7707 => 615.0,\n    7708 => 632.0,\n    7709 => 615.0,\n    7710 => 575.0,\n    7711 => 352.0,\n    7712 => 775.0,\n    7713 => 635.0,\n    7714 => 752.0,\n    7715 => 634.0,\n    7716 => 752.0,\n    7717 => 634.0,\n    7718 => 752.0,\n    7719 => 634.0,\n    7720 => 752.0,\n    7721 => 634.0,\n    7722 => 752.0,\n    7723 => 634.0,\n    7724 => 295.0,\n    7725 => 278.0,\n    7726 => 295.0,\n    7727 => 278.0,\n    7728 => 656.0,\n    7729 => 579.0,\n    7730 => 656.0,\n    7731 => 579.0,\n    7732 => 656.0,\n    7733 => 579.0,\n    7734 => 557.0,\n    7735 => 288.0,\n    7736 => 557.0,\n    7737 => 288.0,\n    7738 => 557.0,\n    7739 => 278.0,\n    7740 => 557.0,\n    7741 => 278.0,\n    7742 => 863.0,\n    7743 => 974.0,\n    7744 => 863.0,\n    7745 => 974.0,\n    7746 => 863.0,\n    7747 => 974.0,\n    7748 => 748.0,\n    7749 => 634.0,\n    7750 => 748.0,\n    7751 => 634.0,\n    7752 => 748.0,\n    7753 => 634.0,\n    7754 => 748.0,\n    7755 => 634.0,\n    7756 => 787.0,\n    7757 => 612.0,\n    7758 => 787.0,\n    7759 => 612.0,\n    7760 => 787.0,\n    7761 => 612.0,\n    7762 => 787.0,\n    7763 => 612.0,\n    7764 => 603.0,\n    7765 => 635.0,\n    7766 => 603.0,\n    7767 => 635.0,\n    7768 => 695.0,\n    7769 => 411.0,\n    7770 => 695.0,\n    7771 => 411.0,\n    7772 => 695.0,\n    7773 => 411.0,\n    7774 => 695.0,\n    7775 => 411.0,\n    7776 => 635.0,\n    7777 => 521.0,\n    7778 => 635.0,\n    7779 => 521.0,\n    7780 => 635.0,\n    7781 => 521.0,\n    7782 => 635.0,\n    7783 => 521.0,\n    7784 => 635.0,\n    7785 => 521.0,\n    7786 => 611.0,\n    7787 => 392.0,\n    7788 => 611.0,\n    7789 => 392.0,\n    7790 => 611.0,\n    7791 => 392.0,\n    7792 => 611.0,\n    7793 => 392.0,\n    7794 => 732.0,\n    7795 => 634.0,\n    7796 => 732.0,\n    7797 => 634.0,\n    7798 => 732.0,\n    7799 => 634.0,\n    7800 => 732.0,\n    7801 => 634.0,\n    7802 => 732.0,\n    7803 => 634.0,\n    7804 => 684.0,\n    7805 => 592.0,\n    7806 => 684.0,\n    7807 => 592.0,\n    7808 => 989.0,\n    7809 => 818.0,\n    7810 => 989.0,\n    7811 => 818.0,\n    7812 => 989.0,\n    7813 => 818.0,\n    7814 => 989.0,\n    7815 => 818.0,\n    7816 => 989.0,\n    7817 => 818.0,\n    7818 => 685.0,\n    7819 => 592.0,\n    7820 => 685.0,\n    7821 => 592.0,\n    7822 => 611.0,\n    7823 => 592.0,\n    7824 => 685.0,\n    7825 => 525.0,\n    7826 => 685.0,\n    7827 => 525.0,\n    7828 => 685.0,\n    7829 => 525.0,\n    7830 => 634.0,\n    7831 => 392.0,\n    7832 => 818.0,\n    7833 => 592.0,\n    7834 => 613.0,\n    7835 => 352.0,\n    7836 => 352.0,\n    7837 => 352.0,\n    7838 => 769.0,\n    7839 => 612.0,\n    7840 => 684.0,\n    7841 => 613.0,\n    7842 => 684.0,\n    7843 => 613.0,\n    7844 => 684.0,\n    7845 => 613.0,\n    7846 => 684.0,\n    7847 => 613.0,\n    7848 => 684.0,\n    7849 => 613.0,\n    7850 => 684.0,\n    7851 => 613.0,\n    7852 => 684.0,\n    7853 => 613.0,\n    7854 => 684.0,\n    7855 => 613.0,\n    7856 => 684.0,\n    7857 => 613.0,\n    7858 => 684.0,\n    7859 => 613.0,\n    7860 => 684.0,\n    7861 => 613.0,\n    7862 => 684.0,\n    7863 => 613.0,\n    7864 => 632.0,\n    7865 => 615.0,\n    7866 => 632.0,\n    7867 => 615.0,\n    7868 => 632.0,\n    7869 => 615.0,\n    7870 => 632.0,\n    7871 => 615.0,\n    7872 => 632.0,\n    7873 => 615.0,\n    7874 => 632.0,\n    7875 => 615.0,\n    7876 => 632.0,\n    7877 => 615.0,\n    7878 => 632.0,\n    7879 => 615.0,\n    7880 => 295.0,\n    7881 => 278.0,\n    7882 => 295.0,\n    7883 => 278.0,\n    7884 => 787.0,\n    7885 => 612.0,\n    7886 => 787.0,\n    7887 => 612.0,\n    7888 => 787.0,\n    7889 => 612.0,\n    7890 => 787.0,\n    7891 => 612.0,\n    7892 => 787.0,\n    7893 => 612.0,\n    7894 => 787.0,\n    7895 => 612.0,\n    7896 => 787.0,\n    7897 => 612.0,\n    7898 => 913.0,\n    7899 => 612.0,\n    7900 => 913.0,\n    7901 => 612.0,\n    7902 => 913.0,\n    7903 => 612.0,\n    7904 => 913.0,\n    7905 => 612.0,\n    7906 => 913.0,\n    7907 => 612.0,\n    7908 => 732.0,\n    7909 => 634.0,\n    7910 => 732.0,\n    7911 => 634.0,\n    7912 => 858.0,\n    7913 => 634.0,\n    7914 => 858.0,\n    7915 => 634.0,\n    7916 => 858.0,\n    7917 => 634.0,\n    7918 => 858.0,\n    7919 => 634.0,\n    7920 => 858.0,\n    7921 => 634.0,\n    7922 => 611.0,\n    7923 => 592.0,\n    7924 => 611.0,\n    7925 => 592.0,\n    7926 => 611.0,\n    7927 => 592.0,\n    7928 => 611.0,\n    7929 => 592.0,\n    7930 => 769.0,\n    7931 => 477.0,\n    7936 => 659.0,\n    7937 => 659.0,\n    7938 => 659.0,\n    7939 => 659.0,\n    7940 => 659.0,\n    7941 => 659.0,\n    7942 => 659.0,\n    7943 => 659.0,\n    7944 => 684.0,\n    7945 => 684.0,\n    7946 => 877.0,\n    7947 => 877.0,\n    7948 => 769.0,\n    7949 => 801.0,\n    7950 => 708.0,\n    7951 => 743.0,\n    7952 => 541.0,\n    7953 => 541.0,\n    7954 => 541.0,\n    7955 => 541.0,\n    7956 => 541.0,\n    7957 => 541.0,\n    7960 => 711.0,\n    7961 => 711.0,\n    7962 => 966.0,\n    7963 => 975.0,\n    7964 => 898.0,\n    7965 => 928.0,\n    7968 => 634.0,\n    7969 => 634.0,\n    7970 => 634.0,\n    7971 => 634.0,\n    7972 => 634.0,\n    7973 => 634.0,\n    7974 => 634.0,\n    7975 => 634.0,\n    7976 => 837.0,\n    7977 => 835.0,\n    7978 => 1086.0,\n    7979 => 1089.0,\n    7980 => 1027.0,\n    7981 => 1051.0,\n    7982 => 934.0,\n    7983 => 947.0,\n    7984 => 338.0,\n    7985 => 338.0,\n    7986 => 338.0,\n    7987 => 338.0,\n    7988 => 338.0,\n    7989 => 338.0,\n    7990 => 338.0,\n    7991 => 338.0,\n    7992 => 380.0,\n    7993 => 374.0,\n    7994 => 635.0,\n    7995 => 635.0,\n    7996 => 570.0,\n    7997 => 600.0,\n    7998 => 489.0,\n    7999 => 493.0,\n    8000 => 612.0,\n    8001 => 612.0,\n    8002 => 612.0,\n    8003 => 612.0,\n    8004 => 612.0,\n    8005 => 612.0,\n    8008 => 804.0,\n    8009 => 848.0,\n    8010 => 1095.0,\n    8011 => 1100.0,\n    8012 => 938.0,\n    8013 => 970.0,\n    8016 => 579.0,\n    8017 => 579.0,\n    8018 => 579.0,\n    8019 => 579.0,\n    8020 => 579.0,\n    8021 => 579.0,\n    8022 => 579.0,\n    8023 => 579.0,\n    8025 => 784.0,\n    8027 => 998.0,\n    8029 => 1012.0,\n    8031 => 897.0,\n    8032 => 837.0,\n    8033 => 837.0,\n    8034 => 837.0,\n    8035 => 837.0,\n    8036 => 837.0,\n    8037 => 837.0,\n    8038 => 837.0,\n    8039 => 837.0,\n    8040 => 802.0,\n    8041 => 843.0,\n    8042 => 1089.0,\n    8043 => 1095.0,\n    8044 => 946.0,\n    8045 => 972.0,\n    8046 => 921.0,\n    8047 => 952.0,\n    8048 => 659.0,\n    8049 => 659.0,\n    8050 => 541.0,\n    8051 => 548.0,\n    8052 => 634.0,\n    8053 => 654.0,\n    8054 => 338.0,\n    8055 => 338.0,\n    8056 => 612.0,\n    8057 => 612.0,\n    8058 => 579.0,\n    8059 => 579.0,\n    8060 => 837.0,\n    8061 => 837.0,\n    8064 => 659.0,\n    8065 => 659.0,\n    8066 => 659.0,\n    8067 => 659.0,\n    8068 => 659.0,\n    8069 => 659.0,\n    8070 => 659.0,\n    8071 => 659.0,\n    8072 => 684.0,\n    8073 => 684.0,\n    8074 => 877.0,\n    8075 => 877.0,\n    8076 => 769.0,\n    8077 => 801.0,\n    8078 => 708.0,\n    8079 => 743.0,\n    8080 => 634.0,\n    8081 => 634.0,\n    8082 => 634.0,\n    8083 => 634.0,\n    8084 => 634.0,\n    8085 => 634.0,\n    8086 => 634.0,\n    8087 => 634.0,\n    8088 => 837.0,\n    8089 => 835.0,\n    8090 => 1086.0,\n    8091 => 1089.0,\n    8092 => 1027.0,\n    8093 => 1051.0,\n    8094 => 934.0,\n    8095 => 947.0,\n    8096 => 837.0,\n    8097 => 837.0,\n    8098 => 837.0,\n    8099 => 837.0,\n    8100 => 837.0,\n    8101 => 837.0,\n    8102 => 837.0,\n    8103 => 837.0,\n    8104 => 802.0,\n    8105 => 843.0,\n    8106 => 1089.0,\n    8107 => 1095.0,\n    8108 => 946.0,\n    8109 => 972.0,\n    8110 => 921.0,\n    8111 => 952.0,\n    8112 => 659.0,\n    8113 => 659.0,\n    8114 => 659.0,\n    8115 => 659.0,\n    8116 => 659.0,\n    8118 => 659.0,\n    8119 => 659.0,\n    8120 => 684.0,\n    8121 => 684.0,\n    8122 => 716.0,\n    8123 => 692.0,\n    8124 => 684.0,\n    8125 => 500.0,\n    8126 => 500.0,\n    8127 => 500.0,\n    8128 => 500.0,\n    8129 => 500.0,\n    8130 => 634.0,\n    8131 => 634.0,\n    8132 => 654.0,\n    8134 => 634.0,\n    8135 => 634.0,\n    8136 => 805.0,\n    8137 => 746.0,\n    8138 => 931.0,\n    8139 => 871.0,\n    8140 => 752.0,\n    8141 => 500.0,\n    8142 => 500.0,\n    8143 => 500.0,\n    8144 => 338.0,\n    8145 => 338.0,\n    8146 => 338.0,\n    8147 => 338.0,\n    8150 => 338.0,\n    8151 => 338.0,\n    8152 => 295.0,\n    8153 => 295.0,\n    8154 => 475.0,\n    8155 => 408.0,\n    8157 => 500.0,\n    8158 => 500.0,\n    8159 => 500.0,\n    8160 => 579.0,\n    8161 => 579.0,\n    8162 => 579.0,\n    8163 => 579.0,\n    8164 => 635.0,\n    8165 => 635.0,\n    8166 => 579.0,\n    8167 => 579.0,\n    8168 => 611.0,\n    8169 => 611.0,\n    8170 => 845.0,\n    8171 => 825.0,\n    8172 => 685.0,\n    8173 => 500.0,\n    8174 => 500.0,\n    8175 => 500.0,\n    8178 => 837.0,\n    8179 => 837.0,\n    8180 => 837.0,\n    8182 => 837.0,\n    8183 => 837.0,\n    8184 => 941.0,\n    8185 => 813.0,\n    8186 => 922.0,\n    8187 => 826.0,\n    8188 => 764.0,\n    8189 => 500.0,\n    8190 => 500.0,\n    8192 => 500.0,\n    8193 => 1000.0,\n    8194 => 500.0,\n    8195 => 1000.0,\n    8196 => 330.0,\n    8197 => 250.0,\n    8198 => 167.0,\n    8199 => 636.0,\n    8200 => 318.0,\n    8201 => 200.0,\n    8202 => 100.0,\n    8203 => 0.0,\n    8204 => 0.0,\n    8205 => 0.0,\n    8206 => 0.0,\n    8207 => 0.0,\n    8208 => 361.0,\n    8209 => 361.0,\n    8210 => 636.0,\n    8211 => 500.0,\n    8212 => 1000.0,\n    8213 => 1000.0,\n    8214 => 500.0,\n    8215 => 500.0,\n    8216 => 318.0,\n    8217 => 318.0,\n    8218 => 318.0,\n    8219 => 318.0,\n    8220 => 518.0,\n    8221 => 518.0,\n    8222 => 518.0,\n    8223 => 518.0,\n    8224 => 500.0,\n    8225 => 500.0,\n    8226 => 590.0,\n    8227 => 590.0,\n    8228 => 334.0,\n    8229 => 667.0,\n    8230 => 1000.0,\n    8231 => 318.0,\n    8232 => 0.0,\n    8233 => 0.0,\n    8234 => 0.0,\n    8235 => 0.0,\n    8236 => 0.0,\n    8237 => 0.0,\n    8238 => 0.0,\n    8239 => 200.0,\n    8240 => 1342.0,\n    8241 => 1735.0,\n    8242 => 227.0,\n    8243 => 374.0,\n    8244 => 520.0,\n    8245 => 227.0,\n    8246 => 374.0,\n    8247 => 520.0,\n    8248 => 339.0,\n    8249 => 400.0,\n    8250 => 400.0,\n    8251 => 838.0,\n    8252 => 485.0,\n    8253 => 531.0,\n    8254 => 500.0,\n    8255 => 804.0,\n    8256 => 804.0,\n    8257 => 250.0,\n    8258 => 1000.0,\n    8259 => 500.0,\n    8260 => 167.0,\n    8261 => 390.0,\n    8262 => 390.0,\n    8263 => 922.0,\n    8264 => 733.0,\n    8265 => 733.0,\n    8266 => 497.0,\n    8267 => 636.0,\n    8268 => 500.0,\n    8269 => 500.0,\n    8270 => 500.0,\n    8271 => 337.0,\n    8272 => 804.0,\n    8273 => 500.0,\n    8274 => 450.0,\n    8275 => 1000.0,\n    8276 => 804.0,\n    8277 => 838.0,\n    8278 => 586.0,\n    8279 => 663.0,\n    8280 => 838.0,\n    8281 => 838.0,\n    8282 => 318.0,\n    8283 => 797.0,\n    8284 => 838.0,\n    8285 => 318.0,\n    8286 => 318.0,\n    8287 => 222.0,\n    8288 => 0.0,\n    8289 => 0.0,\n    8290 => 0.0,\n    8291 => 0.0,\n    8292 => 0.0,\n    8298 => 0.0,\n    8299 => 0.0,\n    8300 => 0.0,\n    8301 => 0.0,\n    8302 => 0.0,\n    8303 => 0.0,\n    8304 => 401.0,\n    8305 => 179.0,\n    8308 => 401.0,\n    8309 => 401.0,\n    8310 => 401.0,\n    8311 => 401.0,\n    8312 => 401.0,\n    8313 => 401.0,\n    8314 => 528.0,\n    8315 => 528.0,\n    8316 => 528.0,\n    8317 => 246.0,\n    8318 => 246.0,\n    8319 => 398.0,\n    8320 => 401.0,\n    8321 => 401.0,\n    8322 => 401.0,\n    8323 => 401.0,\n    8324 => 401.0,\n    8325 => 401.0,\n    8326 => 401.0,\n    8327 => 401.0,\n    8328 => 401.0,\n    8329 => 401.0,\n    8330 => 528.0,\n    8331 => 528.0,\n    8332 => 528.0,\n    8333 => 246.0,\n    8334 => 246.0,\n    8336 => 392.0,\n    8337 => 417.0,\n    8338 => 414.0,\n    8339 => 444.0,\n    8340 => 417.0,\n    8341 => 404.0,\n    8342 => 426.0,\n    8343 => 166.0,\n    8344 => 623.0,\n    8345 => 398.0,\n    8346 => 428.0,\n    8347 => 373.0,\n    8348 => 295.0,\n    8352 => 877.0,\n    8353 => 636.0,\n    8354 => 636.0,\n    8355 => 636.0,\n    8356 => 636.0,\n    8357 => 974.0,\n    8358 => 636.0,\n    8359 => 1272.0,\n    8360 => 1074.0,\n    8361 => 989.0,\n    8362 => 784.0,\n    8363 => 636.0,\n    8364 => 636.0,\n    8365 => 636.0,\n    8366 => 636.0,\n    8367 => 1272.0,\n    8368 => 636.0,\n    8369 => 636.0,\n    8370 => 636.0,\n    8371 => 636.0,\n    8372 => 774.0,\n    8373 => 636.0,\n    8376 => 636.0,\n    8377 => 636.0,\n    8378 => 636.0,\n    8381 => 636.0,\n    8400 => 0.0,\n    8401 => 0.0,\n    8406 => 0.0,\n    8407 => 0.0,\n    8411 => 0.0,\n    8412 => 0.0,\n    8417 => 0.0,\n    8448 => 1019.0,\n    8449 => 1019.0,\n    8450 => 698.0,\n    8451 => 1123.0,\n    8452 => 642.0,\n    8453 => 1019.0,\n    8454 => 1067.0,\n    8455 => 614.0,\n    8456 => 698.0,\n    8457 => 952.0,\n    8459 => 988.0,\n    8460 => 754.0,\n    8461 => 850.0,\n    8462 => 634.0,\n    8463 => 634.0,\n    8464 => 470.0,\n    8465 => 697.0,\n    8466 => 720.0,\n    8467 => 413.0,\n    8468 => 818.0,\n    8469 => 801.0,\n    8470 => 1040.0,\n    8471 => 1000.0,\n    8472 => 697.0,\n    8473 => 701.0,\n    8474 => 787.0,\n    8475 => 798.0,\n    8476 => 814.0,\n    8477 => 792.0,\n    8478 => 896.0,\n    8479 => 684.0,\n    8480 => 1020.0,\n    8481 => 1074.0,\n    8482 => 1000.0,\n    8483 => 684.0,\n    8484 => 745.0,\n    8485 => 578.0,\n    8486 => 764.0,\n    8487 => 764.0,\n    8488 => 616.0,\n    8489 => 338.0,\n    8490 => 656.0,\n    8491 => 684.0,\n    8492 => 786.0,\n    8493 => 703.0,\n    8494 => 854.0,\n    8495 => 592.0,\n    8496 => 605.0,\n    8497 => 786.0,\n    8498 => 575.0,\n    8499 => 1069.0,\n    8500 => 462.0,\n    8501 => 745.0,\n    8502 => 674.0,\n    8503 => 466.0,\n    8504 => 645.0,\n    8505 => 380.0,\n    8506 => 926.0,\n    8507 => 1194.0,\n    8508 => 702.0,\n    8509 => 728.0,\n    8510 => 654.0,\n    8511 => 849.0,\n    8512 => 811.0,\n    8513 => 775.0,\n    8514 => 557.0,\n    8515 => 557.0,\n    8516 => 611.0,\n    8517 => 819.0,\n    8518 => 708.0,\n    8519 => 615.0,\n    8520 => 351.0,\n    8521 => 351.0,\n    8523 => 780.0,\n    8526 => 526.0,\n    8528 => 969.0,\n    8529 => 969.0,\n    8530 => 1370.0,\n    8531 => 969.0,\n    8532 => 969.0,\n    8533 => 969.0,\n    8534 => 969.0,\n    8535 => 969.0,\n    8536 => 969.0,\n    8537 => 969.0,\n    8538 => 969.0,\n    8539 => 969.0,\n    8540 => 969.0,\n    8541 => 969.0,\n    8542 => 969.0,\n    8543 => 568.0,\n    8544 => 295.0,\n    8545 => 492.0,\n    8546 => 689.0,\n    8547 => 923.0,\n    8548 => 684.0,\n    8549 => 922.0,\n    8550 => 1120.0,\n    8551 => 1317.0,\n    8552 => 917.0,\n    8553 => 685.0,\n    8554 => 933.0,\n    8555 => 1131.0,\n    8556 => 557.0,\n    8557 => 698.0,\n    8558 => 770.0,\n    8559 => 863.0,\n    8560 => 278.0,\n    8561 => 458.0,\n    8562 => 637.0,\n    8563 => 812.0,\n    8564 => 592.0,\n    8565 => 811.0,\n    8566 => 991.0,\n    8567 => 1170.0,\n    8568 => 819.0,\n    8569 => 592.0,\n    8570 => 822.0,\n    8571 => 1002.0,\n    8572 => 278.0,\n    8573 => 550.0,\n    8574 => 635.0,\n    8575 => 974.0,\n    8576 => 1245.0,\n    8577 => 770.0,\n    8578 => 1245.0,\n    8579 => 703.0,\n    8580 => 549.0,\n    8581 => 698.0,\n    8585 => 969.0,\n    8592 => 838.0,\n    8593 => 838.0,\n    8594 => 838.0,\n    8595 => 838.0,\n    8596 => 838.0,\n    8597 => 838.0,\n    8598 => 838.0,\n    8599 => 838.0,\n    8600 => 838.0,\n    8601 => 838.0,\n    8602 => 838.0,\n    8603 => 838.0,\n    8604 => 838.0,\n    8605 => 838.0,\n    8606 => 838.0,\n    8607 => 838.0,\n    8608 => 838.0,\n    8609 => 838.0,\n    8610 => 838.0,\n    8611 => 838.0,\n    8612 => 838.0,\n    8613 => 838.0,\n    8614 => 838.0,\n    8615 => 838.0,\n    8616 => 838.0,\n    8617 => 838.0,\n    8618 => 838.0,\n    8619 => 838.0,\n    8620 => 838.0,\n    8621 => 838.0,\n    8622 => 838.0,\n    8623 => 838.0,\n    8624 => 838.0,\n    8625 => 838.0,\n    8626 => 838.0,\n    8627 => 838.0,\n    8628 => 838.0,\n    8629 => 838.0,\n    8630 => 838.0,\n    8631 => 838.0,\n    8632 => 838.0,\n    8633 => 838.0,\n    8634 => 838.0,\n    8635 => 838.0,\n    8636 => 838.0,\n    8637 => 838.0,\n    8638 => 838.0,\n    8639 => 838.0,\n    8640 => 838.0,\n    8641 => 838.0,\n    8642 => 838.0,\n    8643 => 838.0,\n    8644 => 838.0,\n    8645 => 838.0,\n    8646 => 838.0,\n    8647 => 838.0,\n    8648 => 838.0,\n    8649 => 838.0,\n    8650 => 838.0,\n    8651 => 838.0,\n    8652 => 838.0,\n    8653 => 838.0,\n    8654 => 838.0,\n    8655 => 838.0,\n    8656 => 838.0,\n    8657 => 838.0,\n    8658 => 838.0,\n    8659 => 838.0,\n    8660 => 838.0,\n    8661 => 838.0,\n    8662 => 838.0,\n    8663 => 838.0,\n    8664 => 838.0,\n    8665 => 838.0,\n    8666 => 838.0,\n    8667 => 838.0,\n    8668 => 838.0,\n    8669 => 838.0,\n    8670 => 838.0,\n    8671 => 838.0,\n    8672 => 838.0,\n    8673 => 838.0,\n    8674 => 838.0,\n    8675 => 838.0,\n    8676 => 838.0,\n    8677 => 838.0,\n    8678 => 838.0,\n    8679 => 838.0,\n    8680 => 838.0,\n    8681 => 838.0,\n    8682 => 838.0,\n    8683 => 838.0,\n    8684 => 838.0,\n    8685 => 838.0,\n    8686 => 838.0,\n    8687 => 838.0,\n    8688 => 838.0,\n    8689 => 838.0,\n    8690 => 838.0,\n    8691 => 838.0,\n    8692 => 838.0,\n    8693 => 838.0,\n    8694 => 838.0,\n    8695 => 838.0,\n    8696 => 838.0,\n    8697 => 838.0,\n    8698 => 838.0,\n    8699 => 838.0,\n    8700 => 838.0,\n    8701 => 838.0,\n    8702 => 838.0,\n    8703 => 838.0,\n    8704 => 684.0,\n    8705 => 636.0,\n    8706 => 517.0,\n    8707 => 632.0,\n    8708 => 632.0,\n    8709 => 871.0,\n    8710 => 669.0,\n    8711 => 669.0,\n    8712 => 871.0,\n    8713 => 871.0,\n    8714 => 718.0,\n    8715 => 871.0,\n    8716 => 871.0,\n    8717 => 718.0,\n    8718 => 636.0,\n    8719 => 757.0,\n    8720 => 757.0,\n    8721 => 674.0,\n    8722 => 838.0,\n    8723 => 838.0,\n    8724 => 838.0,\n    8725 => 337.0,\n    8726 => 637.0,\n    8727 => 838.0,\n    8728 => 626.0,\n    8729 => 626.0,\n    8730 => 637.0,\n    8731 => 637.0,\n    8732 => 637.0,\n    8733 => 714.0,\n    8734 => 833.0,\n    8735 => 838.0,\n    8736 => 896.0,\n    8737 => 896.0,\n    8738 => 838.0,\n    8739 => 500.0,\n    8740 => 500.0,\n    8741 => 500.0,\n    8742 => 500.0,\n    8743 => 732.0,\n    8744 => 732.0,\n    8745 => 732.0,\n    8746 => 732.0,\n    8747 => 521.0,\n    8748 => 789.0,\n    8749 => 1057.0,\n    8750 => 521.0,\n    8751 => 789.0,\n    8752 => 1057.0,\n    8753 => 521.0,\n    8754 => 521.0,\n    8755 => 521.0,\n    8756 => 636.0,\n    8757 => 636.0,\n    8758 => 260.0,\n    8759 => 636.0,\n    8760 => 838.0,\n    8761 => 838.0,\n    8762 => 838.0,\n    8763 => 838.0,\n    8764 => 838.0,\n    8765 => 838.0,\n    8766 => 838.0,\n    8767 => 838.0,\n    8768 => 375.0,\n    8769 => 838.0,\n    8770 => 838.0,\n    8771 => 838.0,\n    8772 => 838.0,\n    8773 => 838.0,\n    8774 => 838.0,\n    8775 => 838.0,\n    8776 => 838.0,\n    8777 => 838.0,\n    8778 => 838.0,\n    8779 => 838.0,\n    8780 => 838.0,\n    8781 => 838.0,\n    8782 => 838.0,\n    8783 => 838.0,\n    8784 => 838.0,\n    8785 => 838.0,\n    8786 => 839.0,\n    8787 => 839.0,\n    8788 => 1000.0,\n    8789 => 1000.0,\n    8790 => 838.0,\n    8791 => 838.0,\n    8792 => 838.0,\n    8793 => 838.0,\n    8794 => 838.0,\n    8795 => 838.0,\n    8796 => 838.0,\n    8797 => 838.0,\n    8798 => 838.0,\n    8799 => 838.0,\n    8800 => 838.0,\n    8801 => 838.0,\n    8802 => 838.0,\n    8803 => 838.0,\n    8804 => 838.0,\n    8805 => 838.0,\n    8806 => 838.0,\n    8807 => 838.0,\n    8808 => 838.0,\n    8809 => 838.0,\n    8810 => 1047.0,\n    8811 => 1047.0,\n    8812 => 464.0,\n    8813 => 838.0,\n    8814 => 838.0,\n    8815 => 838.0,\n    8816 => 838.0,\n    8817 => 838.0,\n    8818 => 838.0,\n    8819 => 838.0,\n    8820 => 838.0,\n    8821 => 838.0,\n    8822 => 838.0,\n    8823 => 838.0,\n    8824 => 838.0,\n    8825 => 838.0,\n    8826 => 838.0,\n    8827 => 838.0,\n    8828 => 838.0,\n    8829 => 838.0,\n    8830 => 838.0,\n    8831 => 838.0,\n    8832 => 838.0,\n    8833 => 838.0,\n    8834 => 838.0,\n    8835 => 838.0,\n    8836 => 838.0,\n    8837 => 838.0,\n    8838 => 838.0,\n    8839 => 838.0,\n    8840 => 838.0,\n    8841 => 838.0,\n    8842 => 838.0,\n    8843 => 838.0,\n    8844 => 732.0,\n    8845 => 732.0,\n    8846 => 732.0,\n    8847 => 838.0,\n    8848 => 838.0,\n    8849 => 838.0,\n    8850 => 838.0,\n    8851 => 780.0,\n    8852 => 780.0,\n    8853 => 838.0,\n    8854 => 838.0,\n    8855 => 838.0,\n    8856 => 838.0,\n    8857 => 838.0,\n    8858 => 838.0,\n    8859 => 838.0,\n    8860 => 838.0,\n    8861 => 838.0,\n    8862 => 838.0,\n    8863 => 838.0,\n    8864 => 838.0,\n    8865 => 838.0,\n    8866 => 871.0,\n    8867 => 871.0,\n    8868 => 871.0,\n    8869 => 871.0,\n    8870 => 521.0,\n    8871 => 521.0,\n    8872 => 871.0,\n    8873 => 871.0,\n    8874 => 871.0,\n    8875 => 871.0,\n    8876 => 871.0,\n    8877 => 871.0,\n    8878 => 871.0,\n    8879 => 871.0,\n    8880 => 838.0,\n    8881 => 838.0,\n    8882 => 838.0,\n    8883 => 838.0,\n    8884 => 838.0,\n    8885 => 838.0,\n    8886 => 1000.0,\n    8887 => 1000.0,\n    8888 => 838.0,\n    8889 => 838.0,\n    8890 => 521.0,\n    8891 => 732.0,\n    8892 => 732.0,\n    8893 => 732.0,\n    8894 => 838.0,\n    8895 => 838.0,\n    8896 => 820.0,\n    8897 => 820.0,\n    8898 => 820.0,\n    8899 => 820.0,\n    8900 => 626.0,\n    8901 => 318.0,\n    8902 => 626.0,\n    8903 => 838.0,\n    8904 => 1000.0,\n    8905 => 1000.0,\n    8906 => 1000.0,\n    8907 => 1000.0,\n    8908 => 1000.0,\n    8909 => 838.0,\n    8910 => 732.0,\n    8911 => 732.0,\n    8912 => 838.0,\n    8913 => 838.0,\n    8914 => 838.0,\n    8915 => 838.0,\n    8916 => 838.0,\n    8917 => 838.0,\n    8918 => 838.0,\n    8919 => 838.0,\n    8920 => 1422.0,\n    8921 => 1422.0,\n    8922 => 838.0,\n    8923 => 838.0,\n    8924 => 838.0,\n    8925 => 838.0,\n    8926 => 838.0,\n    8927 => 838.0,\n    8928 => 838.0,\n    8929 => 838.0,\n    8930 => 838.0,\n    8931 => 838.0,\n    8932 => 838.0,\n    8933 => 838.0,\n    8934 => 838.0,\n    8935 => 838.0,\n    8936 => 838.0,\n    8937 => 838.0,\n    8938 => 838.0,\n    8939 => 838.0,\n    8940 => 838.0,\n    8941 => 838.0,\n    8942 => 1000.0,\n    8943 => 1000.0,\n    8944 => 1000.0,\n    8945 => 1000.0,\n    8946 => 1000.0,\n    8947 => 871.0,\n    8948 => 718.0,\n    8949 => 871.0,\n    8950 => 871.0,\n    8951 => 718.0,\n    8952 => 871.0,\n    8953 => 871.0,\n    8954 => 1000.0,\n    8955 => 871.0,\n    8956 => 718.0,\n    8957 => 871.0,\n    8958 => 718.0,\n    8959 => 871.0,\n    8960 => 602.0,\n    8961 => 602.0,\n    8962 => 635.0,\n    8963 => 838.0,\n    8964 => 838.0,\n    8965 => 838.0,\n    8966 => 838.0,\n    8967 => 488.0,\n    8968 => 390.0,\n    8969 => 390.0,\n    8970 => 390.0,\n    8971 => 390.0,\n    8972 => 809.0,\n    8973 => 809.0,\n    8974 => 809.0,\n    8975 => 809.0,\n    8976 => 838.0,\n    8977 => 513.0,\n    8984 => 1000.0,\n    8985 => 838.0,\n    8988 => 469.0,\n    8989 => 469.0,\n    8990 => 469.0,\n    8991 => 469.0,\n    8992 => 521.0,\n    8993 => 521.0,\n    8996 => 1152.0,\n    8997 => 1152.0,\n    8998 => 1414.0,\n    8999 => 1152.0,\n    9000 => 1443.0,\n    9003 => 1414.0,\n    9004 => 873.0,\n    9075 => 338.0,\n    9076 => 635.0,\n    9077 => 837.0,\n    9082 => 659.0,\n    9085 => 757.0,\n    9095 => 1152.0,\n    9108 => 873.0,\n    9115 => 500.0,\n    9116 => 500.0,\n    9117 => 500.0,\n    9118 => 500.0,\n    9119 => 500.0,\n    9120 => 500.0,\n    9121 => 500.0,\n    9122 => 500.0,\n    9123 => 500.0,\n    9124 => 500.0,\n    9125 => 500.0,\n    9126 => 500.0,\n    9127 => 750.0,\n    9128 => 750.0,\n    9129 => 750.0,\n    9130 => 750.0,\n    9131 => 750.0,\n    9132 => 750.0,\n    9133 => 750.0,\n    9134 => 521.0,\n    9166 => 838.0,\n    9167 => 945.0,\n    9187 => 873.0,\n    9189 => 769.0,\n    9192 => 636.0,\n    9250 => 635.0,\n    9251 => 635.0,\n    9312 => 896.0,\n    9313 => 896.0,\n    9314 => 896.0,\n    9315 => 896.0,\n    9316 => 896.0,\n    9317 => 896.0,\n    9318 => 896.0,\n    9319 => 896.0,\n    9320 => 896.0,\n    9321 => 896.0,\n    9472 => 602.0,\n    9473 => 602.0,\n    9474 => 602.0,\n    9475 => 602.0,\n    9476 => 602.0,\n    9477 => 602.0,\n    9478 => 602.0,\n    9479 => 602.0,\n    9480 => 602.0,\n    9481 => 602.0,\n    9482 => 602.0,\n    9483 => 602.0,\n    9484 => 602.0,\n    9485 => 602.0,\n    9486 => 602.0,\n    9487 => 602.0,\n    9488 => 602.0,\n    9489 => 602.0,\n    9490 => 602.0,\n    9491 => 602.0,\n    9492 => 602.0,\n    9493 => 602.0,\n    9494 => 602.0,\n    9495 => 602.0,\n    9496 => 602.0,\n    9497 => 602.0,\n    9498 => 602.0,\n    9499 => 602.0,\n    9500 => 602.0,\n    9501 => 602.0,\n    9502 => 602.0,\n    9503 => 602.0,\n    9504 => 602.0,\n    9505 => 602.0,\n    9506 => 602.0,\n    9507 => 602.0,\n    9508 => 602.0,\n    9509 => 602.0,\n    9510 => 602.0,\n    9511 => 602.0,\n    9512 => 602.0,\n    9513 => 602.0,\n    9514 => 602.0,\n    9515 => 602.0,\n    9516 => 602.0,\n    9517 => 602.0,\n    9518 => 602.0,\n    9519 => 602.0,\n    9520 => 602.0,\n    9521 => 602.0,\n    9522 => 602.0,\n    9523 => 602.0,\n    9524 => 602.0,\n    9525 => 602.0,\n    9526 => 602.0,\n    9527 => 602.0,\n    9528 => 602.0,\n    9529 => 602.0,\n    9530 => 602.0,\n    9531 => 602.0,\n    9532 => 602.0,\n    9533 => 602.0,\n    9534 => 602.0,\n    9535 => 602.0,\n    9536 => 602.0,\n    9537 => 602.0,\n    9538 => 602.0,\n    9539 => 602.0,\n    9540 => 602.0,\n    9541 => 602.0,\n    9542 => 602.0,\n    9543 => 602.0,\n    9544 => 602.0,\n    9545 => 602.0,\n    9546 => 602.0,\n    9547 => 602.0,\n    9548 => 602.0,\n    9549 => 602.0,\n    9550 => 602.0,\n    9551 => 602.0,\n    9552 => 602.0,\n    9553 => 602.0,\n    9554 => 602.0,\n    9555 => 602.0,\n    9556 => 602.0,\n    9557 => 602.0,\n    9558 => 602.0,\n    9559 => 602.0,\n    9560 => 602.0,\n    9561 => 602.0,\n    9562 => 602.0,\n    9563 => 602.0,\n    9564 => 602.0,\n    9565 => 602.0,\n    9566 => 602.0,\n    9567 => 602.0,\n    9568 => 602.0,\n    9569 => 602.0,\n    9570 => 602.0,\n    9571 => 602.0,\n    9572 => 602.0,\n    9573 => 602.0,\n    9574 => 602.0,\n    9575 => 602.0,\n    9576 => 602.0,\n    9577 => 602.0,\n    9578 => 602.0,\n    9579 => 602.0,\n    9580 => 602.0,\n    9581 => 602.0,\n    9582 => 602.0,\n    9583 => 602.0,\n    9584 => 602.0,\n    9585 => 602.0,\n    9586 => 602.0,\n    9587 => 602.0,\n    9588 => 602.0,\n    9589 => 602.0,\n    9590 => 602.0,\n    9591 => 602.0,\n    9592 => 602.0,\n    9593 => 602.0,\n    9594 => 602.0,\n    9595 => 602.0,\n    9596 => 602.0,\n    9597 => 602.0,\n    9598 => 602.0,\n    9599 => 602.0,\n    9600 => 769.0,\n    9601 => 769.0,\n    9602 => 769.0,\n    9603 => 769.0,\n    9604 => 769.0,\n    9605 => 769.0,\n    9606 => 769.0,\n    9607 => 769.0,\n    9608 => 769.0,\n    9609 => 769.0,\n    9610 => 769.0,\n    9611 => 769.0,\n    9612 => 769.0,\n    9613 => 769.0,\n    9614 => 769.0,\n    9615 => 769.0,\n    9616 => 769.0,\n    9617 => 769.0,\n    9618 => 769.0,\n    9619 => 769.0,\n    9620 => 769.0,\n    9621 => 769.0,\n    9622 => 769.0,\n    9623 => 769.0,\n    9624 => 769.0,\n    9625 => 769.0,\n    9626 => 769.0,\n    9627 => 769.0,\n    9628 => 769.0,\n    9629 => 769.0,\n    9630 => 769.0,\n    9631 => 769.0,\n    9632 => 945.0,\n    9633 => 945.0,\n    9634 => 945.0,\n    9635 => 945.0,\n    9636 => 945.0,\n    9637 => 945.0,\n    9638 => 945.0,\n    9639 => 945.0,\n    9640 => 945.0,\n    9641 => 945.0,\n    9642 => 678.0,\n    9643 => 678.0,\n    9644 => 945.0,\n    9645 => 945.0,\n    9646 => 550.0,\n    9647 => 550.0,\n    9648 => 769.0,\n    9649 => 769.0,\n    9650 => 769.0,\n    9651 => 769.0,\n    9652 => 502.0,\n    9653 => 502.0,\n    9654 => 769.0,\n    9655 => 769.0,\n    9656 => 502.0,\n    9657 => 502.0,\n    9658 => 769.0,\n    9659 => 769.0,\n    9660 => 769.0,\n    9661 => 769.0,\n    9662 => 502.0,\n    9663 => 502.0,\n    9664 => 769.0,\n    9665 => 769.0,\n    9666 => 502.0,\n    9667 => 502.0,\n    9668 => 769.0,\n    9669 => 769.0,\n    9670 => 769.0,\n    9671 => 769.0,\n    9672 => 769.0,\n    9673 => 873.0,\n    9674 => 494.0,\n    9675 => 873.0,\n    9676 => 873.0,\n    9677 => 873.0,\n    9678 => 873.0,\n    9679 => 873.0,\n    9680 => 873.0,\n    9681 => 873.0,\n    9682 => 873.0,\n    9683 => 873.0,\n    9684 => 873.0,\n    9685 => 873.0,\n    9686 => 527.0,\n    9687 => 527.0,\n    9688 => 791.0,\n    9689 => 970.0,\n    9690 => 970.0,\n    9691 => 970.0,\n    9692 => 387.0,\n    9693 => 387.0,\n    9694 => 387.0,\n    9695 => 387.0,\n    9696 => 873.0,\n    9697 => 873.0,\n    9698 => 769.0,\n    9699 => 769.0,\n    9700 => 769.0,\n    9701 => 769.0,\n    9702 => 590.0,\n    9703 => 945.0,\n    9704 => 945.0,\n    9705 => 945.0,\n    9706 => 945.0,\n    9707 => 945.0,\n    9708 => 769.0,\n    9709 => 769.0,\n    9710 => 769.0,\n    9711 => 1119.0,\n    9712 => 945.0,\n    9713 => 945.0,\n    9714 => 945.0,\n    9715 => 945.0,\n    9716 => 873.0,\n    9717 => 873.0,\n    9718 => 873.0,\n    9719 => 873.0,\n    9720 => 769.0,\n    9721 => 769.0,\n    9722 => 769.0,\n    9723 => 830.0,\n    9724 => 830.0,\n    9725 => 732.0,\n    9726 => 732.0,\n    9727 => 769.0,\n    9728 => 896.0,\n    9729 => 1000.0,\n    9730 => 896.0,\n    9731 => 896.0,\n    9732 => 896.0,\n    9733 => 896.0,\n    9734 => 896.0,\n    9735 => 573.0,\n    9736 => 896.0,\n    9737 => 896.0,\n    9738 => 888.0,\n    9739 => 888.0,\n    9740 => 671.0,\n    9741 => 1013.0,\n    9742 => 1246.0,\n    9743 => 1250.0,\n    9744 => 896.0,\n    9745 => 896.0,\n    9746 => 896.0,\n    9747 => 532.0,\n    9748 => 896.0,\n    9749 => 896.0,\n    9750 => 896.0,\n    9751 => 896.0,\n    9752 => 896.0,\n    9753 => 896.0,\n    9754 => 896.0,\n    9755 => 896.0,\n    9756 => 896.0,\n    9757 => 609.0,\n    9758 => 896.0,\n    9759 => 609.0,\n    9760 => 896.0,\n    9761 => 896.0,\n    9762 => 896.0,\n    9763 => 896.0,\n    9764 => 669.0,\n    9765 => 746.0,\n    9766 => 649.0,\n    9767 => 784.0,\n    9768 => 545.0,\n    9769 => 896.0,\n    9770 => 896.0,\n    9771 => 896.0,\n    9772 => 710.0,\n    9773 => 896.0,\n    9774 => 896.0,\n    9775 => 896.0,\n    9776 => 896.0,\n    9777 => 896.0,\n    9778 => 896.0,\n    9779 => 896.0,\n    9780 => 896.0,\n    9781 => 896.0,\n    9782 => 896.0,\n    9783 => 896.0,\n    9784 => 896.0,\n    9785 => 1042.0,\n    9786 => 1042.0,\n    9787 => 1042.0,\n    9788 => 896.0,\n    9789 => 896.0,\n    9790 => 896.0,\n    9791 => 614.0,\n    9792 => 732.0,\n    9793 => 732.0,\n    9794 => 896.0,\n    9795 => 896.0,\n    9796 => 896.0,\n    9797 => 896.0,\n    9798 => 896.0,\n    9799 => 896.0,\n    9800 => 896.0,\n    9801 => 896.0,\n    9802 => 896.0,\n    9803 => 896.0,\n    9804 => 896.0,\n    9805 => 896.0,\n    9806 => 896.0,\n    9807 => 896.0,\n    9808 => 896.0,\n    9809 => 896.0,\n    9810 => 896.0,\n    9811 => 896.0,\n    9812 => 896.0,\n    9813 => 896.0,\n    9814 => 896.0,\n    9815 => 896.0,\n    9816 => 896.0,\n    9817 => 896.0,\n    9818 => 896.0,\n    9819 => 896.0,\n    9820 => 896.0,\n    9821 => 896.0,\n    9822 => 896.0,\n    9823 => 896.0,\n    9824 => 896.0,\n    9825 => 896.0,\n    9826 => 896.0,\n    9827 => 896.0,\n    9828 => 896.0,\n    9829 => 896.0,\n    9830 => 896.0,\n    9831 => 896.0,\n    9832 => 896.0,\n    9833 => 472.0,\n    9834 => 638.0,\n    9835 => 896.0,\n    9836 => 896.0,\n    9837 => 472.0,\n    9838 => 357.0,\n    9839 => 484.0,\n    9840 => 748.0,\n    9841 => 766.0,\n    9842 => 896.0,\n    9843 => 896.0,\n    9844 => 896.0,\n    9845 => 896.0,\n    9846 => 896.0,\n    9847 => 896.0,\n    9848 => 896.0,\n    9849 => 896.0,\n    9850 => 896.0,\n    9851 => 896.0,\n    9852 => 896.0,\n    9853 => 896.0,\n    9854 => 896.0,\n    9855 => 896.0,\n    9856 => 869.0,\n    9857 => 869.0,\n    9858 => 869.0,\n    9859 => 869.0,\n    9860 => 869.0,\n    9861 => 869.0,\n    9862 => 896.0,\n    9863 => 896.0,\n    9864 => 896.0,\n    9865 => 896.0,\n    9866 => 896.0,\n    9867 => 896.0,\n    9868 => 896.0,\n    9869 => 896.0,\n    9870 => 896.0,\n    9871 => 896.0,\n    9872 => 896.0,\n    9873 => 896.0,\n    9874 => 896.0,\n    9875 => 896.0,\n    9876 => 896.0,\n    9877 => 541.0,\n    9878 => 896.0,\n    9879 => 896.0,\n    9880 => 896.0,\n    9881 => 896.0,\n    9882 => 896.0,\n    9883 => 896.0,\n    9884 => 896.0,\n    9886 => 896.0,\n    9887 => 896.0,\n    9888 => 896.0,\n    9889 => 702.0,\n    9890 => 1004.0,\n    9891 => 1089.0,\n    9892 => 1175.0,\n    9893 => 903.0,\n    9894 => 838.0,\n    9895 => 838.0,\n    9896 => 838.0,\n    9897 => 838.0,\n    9898 => 838.0,\n    9899 => 838.0,\n    9900 => 838.0,\n    9901 => 838.0,\n    9902 => 838.0,\n    9903 => 838.0,\n    9904 => 844.0,\n    9905 => 838.0,\n    9906 => 732.0,\n    9907 => 732.0,\n    9908 => 732.0,\n    9909 => 732.0,\n    9910 => 850.0,\n    9911 => 732.0,\n    9912 => 732.0,\n    9920 => 838.0,\n    9921 => 838.0,\n    9922 => 838.0,\n    9923 => 838.0,\n    9954 => 732.0,\n    9985 => 838.0,\n    9986 => 838.0,\n    9987 => 838.0,\n    9988 => 838.0,\n    9990 => 838.0,\n    9991 => 838.0,\n    9992 => 838.0,\n    9993 => 838.0,\n    9996 => 838.0,\n    9997 => 838.0,\n    9998 => 838.0,\n    9999 => 838.0,\n    10000 => 838.0,\n    10001 => 838.0,\n    10002 => 838.0,\n    10003 => 838.0,\n    10004 => 838.0,\n    10005 => 838.0,\n    10006 => 838.0,\n    10007 => 838.0,\n    10008 => 838.0,\n    10009 => 838.0,\n    10010 => 838.0,\n    10011 => 838.0,\n    10012 => 838.0,\n    10013 => 838.0,\n    10014 => 838.0,\n    10015 => 838.0,\n    10016 => 838.0,\n    10017 => 838.0,\n    10018 => 838.0,\n    10019 => 838.0,\n    10020 => 838.0,\n    10021 => 838.0,\n    10022 => 838.0,\n    10023 => 838.0,\n    10025 => 838.0,\n    10026 => 838.0,\n    10027 => 838.0,\n    10028 => 838.0,\n    10029 => 838.0,\n    10030 => 838.0,\n    10031 => 838.0,\n    10032 => 838.0,\n    10033 => 838.0,\n    10034 => 838.0,\n    10035 => 838.0,\n    10036 => 838.0,\n    10037 => 838.0,\n    10038 => 838.0,\n    10039 => 838.0,\n    10040 => 838.0,\n    10041 => 838.0,\n    10042 => 838.0,\n    10043 => 838.0,\n    10044 => 838.0,\n    10045 => 838.0,\n    10046 => 838.0,\n    10047 => 838.0,\n    10048 => 838.0,\n    10049 => 838.0,\n    10050 => 838.0,\n    10051 => 838.0,\n    10052 => 838.0,\n    10053 => 838.0,\n    10054 => 838.0,\n    10055 => 838.0,\n    10056 => 838.0,\n    10057 => 838.0,\n    10058 => 838.0,\n    10059 => 838.0,\n    10061 => 896.0,\n    10063 => 896.0,\n    10064 => 896.0,\n    10065 => 896.0,\n    10066 => 896.0,\n    10070 => 896.0,\n    10072 => 838.0,\n    10073 => 838.0,\n    10074 => 838.0,\n    10075 => 322.0,\n    10076 => 322.0,\n    10077 => 538.0,\n    10078 => 538.0,\n    10081 => 838.0,\n    10082 => 838.0,\n    10083 => 838.0,\n    10084 => 838.0,\n    10085 => 838.0,\n    10086 => 838.0,\n    10087 => 838.0,\n    10088 => 838.0,\n    10089 => 838.0,\n    10090 => 838.0,\n    10091 => 838.0,\n    10092 => 838.0,\n    10093 => 838.0,\n    10094 => 838.0,\n    10095 => 838.0,\n    10096 => 838.0,\n    10097 => 838.0,\n    10098 => 838.0,\n    10099 => 838.0,\n    10100 => 838.0,\n    10101 => 838.0,\n    10102 => 896.0,\n    10103 => 896.0,\n    10104 => 896.0,\n    10105 => 896.0,\n    10106 => 896.0,\n    10107 => 896.0,\n    10108 => 896.0,\n    10109 => 896.0,\n    10110 => 896.0,\n    10111 => 896.0,\n    10112 => 838.0,\n    10113 => 838.0,\n    10114 => 838.0,\n    10115 => 838.0,\n    10116 => 838.0,\n    10117 => 838.0,\n    10118 => 838.0,\n    10119 => 838.0,\n    10120 => 838.0,\n    10121 => 838.0,\n    10122 => 838.0,\n    10123 => 838.0,\n    10124 => 838.0,\n    10125 => 838.0,\n    10126 => 838.0,\n    10127 => 838.0,\n    10128 => 838.0,\n    10129 => 838.0,\n    10130 => 838.0,\n    10131 => 838.0,\n    10132 => 838.0,\n    10136 => 838.0,\n    10137 => 838.0,\n    10138 => 838.0,\n    10139 => 838.0,\n    10140 => 838.0,\n    10141 => 838.0,\n    10142 => 838.0,\n    10143 => 838.0,\n    10144 => 838.0,\n    10145 => 838.0,\n    10146 => 838.0,\n    10147 => 838.0,\n    10148 => 838.0,\n    10149 => 838.0,\n    10150 => 838.0,\n    10151 => 838.0,\n    10152 => 838.0,\n    10153 => 838.0,\n    10154 => 838.0,\n    10155 => 838.0,\n    10156 => 838.0,\n    10157 => 838.0,\n    10158 => 838.0,\n    10159 => 838.0,\n    10161 => 838.0,\n    10162 => 838.0,\n    10163 => 838.0,\n    10164 => 838.0,\n    10165 => 838.0,\n    10166 => 838.0,\n    10167 => 838.0,\n    10168 => 838.0,\n    10169 => 838.0,\n    10170 => 838.0,\n    10171 => 838.0,\n    10172 => 838.0,\n    10173 => 838.0,\n    10174 => 838.0,\n    10181 => 390.0,\n    10182 => 390.0,\n    10208 => 494.0,\n    10214 => 495.0,\n    10215 => 495.0,\n    10216 => 390.0,\n    10217 => 390.0,\n    10218 => 556.0,\n    10219 => 556.0,\n    10224 => 838.0,\n    10225 => 838.0,\n    10226 => 838.0,\n    10227 => 838.0,\n    10228 => 1157.0,\n    10229 => 1434.0,\n    10230 => 1434.0,\n    10231 => 1434.0,\n    10232 => 1434.0,\n    10233 => 1434.0,\n    10234 => 1434.0,\n    10235 => 1434.0,\n    10236 => 1434.0,\n    10237 => 1434.0,\n    10238 => 1434.0,\n    10239 => 1434.0,\n    10240 => 732.0,\n    10241 => 732.0,\n    10242 => 732.0,\n    10243 => 732.0,\n    10244 => 732.0,\n    10245 => 732.0,\n    10246 => 732.0,\n    10247 => 732.0,\n    10248 => 732.0,\n    10249 => 732.0,\n    10250 => 732.0,\n    10251 => 732.0,\n    10252 => 732.0,\n    10253 => 732.0,\n    10254 => 732.0,\n    10255 => 732.0,\n    10256 => 732.0,\n    10257 => 732.0,\n    10258 => 732.0,\n    10259 => 732.0,\n    10260 => 732.0,\n    10261 => 732.0,\n    10262 => 732.0,\n    10263 => 732.0,\n    10264 => 732.0,\n    10265 => 732.0,\n    10266 => 732.0,\n    10267 => 732.0,\n    10268 => 732.0,\n    10269 => 732.0,\n    10270 => 732.0,\n    10271 => 732.0,\n    10272 => 732.0,\n    10273 => 732.0,\n    10274 => 732.0,\n    10275 => 732.0,\n    10276 => 732.0,\n    10277 => 732.0,\n    10278 => 732.0,\n    10279 => 732.0,\n    10280 => 732.0,\n    10281 => 732.0,\n    10282 => 732.0,\n    10283 => 732.0,\n    10284 => 732.0,\n    10285 => 732.0,\n    10286 => 732.0,\n    10287 => 732.0,\n    10288 => 732.0,\n    10289 => 732.0,\n    10290 => 732.0,\n    10291 => 732.0,\n    10292 => 732.0,\n    10293 => 732.0,\n    10294 => 732.0,\n    10295 => 732.0,\n    10296 => 732.0,\n    10297 => 732.0,\n    10298 => 732.0,\n    10299 => 732.0,\n    10300 => 732.0,\n    10301 => 732.0,\n    10302 => 732.0,\n    10303 => 732.0,\n    10304 => 732.0,\n    10305 => 732.0,\n    10306 => 732.0,\n    10307 => 732.0,\n    10308 => 732.0,\n    10309 => 732.0,\n    10310 => 732.0,\n    10311 => 732.0,\n    10312 => 732.0,\n    10313 => 732.0,\n    10314 => 732.0,\n    10315 => 732.0,\n    10316 => 732.0,\n    10317 => 732.0,\n    10318 => 732.0,\n    10319 => 732.0,\n    10320 => 732.0,\n    10321 => 732.0,\n    10322 => 732.0,\n    10323 => 732.0,\n    10324 => 732.0,\n    10325 => 732.0,\n    10326 => 732.0,\n    10327 => 732.0,\n    10328 => 732.0,\n    10329 => 732.0,\n    10330 => 732.0,\n    10331 => 732.0,\n    10332 => 732.0,\n    10333 => 732.0,\n    10334 => 732.0,\n    10335 => 732.0,\n    10336 => 732.0,\n    10337 => 732.0,\n    10338 => 732.0,\n    10339 => 732.0,\n    10340 => 732.0,\n    10341 => 732.0,\n    10342 => 732.0,\n    10343 => 732.0,\n    10344 => 732.0,\n    10345 => 732.0,\n    10346 => 732.0,\n    10347 => 732.0,\n    10348 => 732.0,\n    10349 => 732.0,\n    10350 => 732.0,\n    10351 => 732.0,\n    10352 => 732.0,\n    10353 => 732.0,\n    10354 => 732.0,\n    10355 => 732.0,\n    10356 => 732.0,\n    10357 => 732.0,\n    10358 => 732.0,\n    10359 => 732.0,\n    10360 => 732.0,\n    10361 => 732.0,\n    10362 => 732.0,\n    10363 => 732.0,\n    10364 => 732.0,\n    10365 => 732.0,\n    10366 => 732.0,\n    10367 => 732.0,\n    10368 => 732.0,\n    10369 => 732.0,\n    10370 => 732.0,\n    10371 => 732.0,\n    10372 => 732.0,\n    10373 => 732.0,\n    10374 => 732.0,\n    10375 => 732.0,\n    10376 => 732.0,\n    10377 => 732.0,\n    10378 => 732.0,\n    10379 => 732.0,\n    10380 => 732.0,\n    10381 => 732.0,\n    10382 => 732.0,\n    10383 => 732.0,\n    10384 => 732.0,\n    10385 => 732.0,\n    10386 => 732.0,\n    10387 => 732.0,\n    10388 => 732.0,\n    10389 => 732.0,\n    10390 => 732.0,\n    10391 => 732.0,\n    10392 => 732.0,\n    10393 => 732.0,\n    10394 => 732.0,\n    10395 => 732.0,\n    10396 => 732.0,\n    10397 => 732.0,\n    10398 => 732.0,\n    10399 => 732.0,\n    10400 => 732.0,\n    10401 => 732.0,\n    10402 => 732.0,\n    10403 => 732.0,\n    10404 => 732.0,\n    10405 => 732.0,\n    10406 => 732.0,\n    10407 => 732.0,\n    10408 => 732.0,\n    10409 => 732.0,\n    10410 => 732.0,\n    10411 => 732.0,\n    10412 => 732.0,\n    10413 => 732.0,\n    10414 => 732.0,\n    10415 => 732.0,\n    10416 => 732.0,\n    10417 => 732.0,\n    10418 => 732.0,\n    10419 => 732.0,\n    10420 => 732.0,\n    10421 => 732.0,\n    10422 => 732.0,\n    10423 => 732.0,\n    10424 => 732.0,\n    10425 => 732.0,\n    10426 => 732.0,\n    10427 => 732.0,\n    10428 => 732.0,\n    10429 => 732.0,\n    10430 => 732.0,\n    10431 => 732.0,\n    10432 => 732.0,\n    10433 => 732.0,\n    10434 => 732.0,\n    10435 => 732.0,\n    10436 => 732.0,\n    10437 => 732.0,\n    10438 => 732.0,\n    10439 => 732.0,\n    10440 => 732.0,\n    10441 => 732.0,\n    10442 => 732.0,\n    10443 => 732.0,\n    10444 => 732.0,\n    10445 => 732.0,\n    10446 => 732.0,\n    10447 => 732.0,\n    10448 => 732.0,\n    10449 => 732.0,\n    10450 => 732.0,\n    10451 => 732.0,\n    10452 => 732.0,\n    10453 => 732.0,\n    10454 => 732.0,\n    10455 => 732.0,\n    10456 => 732.0,\n    10457 => 732.0,\n    10458 => 732.0,\n    10459 => 732.0,\n    10460 => 732.0,\n    10461 => 732.0,\n    10462 => 732.0,\n    10463 => 732.0,\n    10464 => 732.0,\n    10465 => 732.0,\n    10466 => 732.0,\n    10467 => 732.0,\n    10468 => 732.0,\n    10469 => 732.0,\n    10470 => 732.0,\n    10471 => 732.0,\n    10472 => 732.0,\n    10473 => 732.0,\n    10474 => 732.0,\n    10475 => 732.0,\n    10476 => 732.0,\n    10477 => 732.0,\n    10478 => 732.0,\n    10479 => 732.0,\n    10480 => 732.0,\n    10481 => 732.0,\n    10482 => 732.0,\n    10483 => 732.0,\n    10484 => 732.0,\n    10485 => 732.0,\n    10486 => 732.0,\n    10487 => 732.0,\n    10488 => 732.0,\n    10489 => 732.0,\n    10490 => 732.0,\n    10491 => 732.0,\n    10492 => 732.0,\n    10493 => 732.0,\n    10494 => 732.0,\n    10495 => 732.0,\n    10502 => 838.0,\n    10503 => 838.0,\n    10506 => 838.0,\n    10507 => 838.0,\n    10560 => 683.0,\n    10561 => 683.0,\n    10627 => 734.0,\n    10628 => 734.0,\n    10702 => 838.0,\n    10703 => 1000.0,\n    10704 => 1000.0,\n    10705 => 1000.0,\n    10706 => 1000.0,\n    10707 => 1000.0,\n    10708 => 1000.0,\n    10709 => 1000.0,\n    10731 => 494.0,\n    10746 => 838.0,\n    10747 => 838.0,\n    10752 => 1000.0,\n    10753 => 1000.0,\n    10754 => 1000.0,\n    10764 => 1325.0,\n    10765 => 521.0,\n    10766 => 521.0,\n    10767 => 521.0,\n    10768 => 521.0,\n    10769 => 521.0,\n    10770 => 521.0,\n    10771 => 521.0,\n    10772 => 521.0,\n    10773 => 521.0,\n    10774 => 521.0,\n    10775 => 521.0,\n    10776 => 521.0,\n    10777 => 521.0,\n    10778 => 521.0,\n    10779 => 521.0,\n    10780 => 521.0,\n    10799 => 838.0,\n    10858 => 838.0,\n    10859 => 838.0,\n    10877 => 838.0,\n    10878 => 838.0,\n    10879 => 838.0,\n    10880 => 838.0,\n    10881 => 838.0,\n    10882 => 838.0,\n    10883 => 838.0,\n    10884 => 838.0,\n    10885 => 838.0,\n    10886 => 838.0,\n    10887 => 838.0,\n    10888 => 838.0,\n    10889 => 838.0,\n    10890 => 838.0,\n    10891 => 838.0,\n    10892 => 838.0,\n    10893 => 838.0,\n    10894 => 838.0,\n    10895 => 838.0,\n    10896 => 838.0,\n    10897 => 838.0,\n    10898 => 838.0,\n    10899 => 838.0,\n    10900 => 838.0,\n    10901 => 838.0,\n    10902 => 838.0,\n    10903 => 838.0,\n    10904 => 838.0,\n    10905 => 838.0,\n    10906 => 838.0,\n    10907 => 838.0,\n    10908 => 838.0,\n    10909 => 838.0,\n    10910 => 838.0,\n    10911 => 838.0,\n    10912 => 838.0,\n    10926 => 838.0,\n    10927 => 838.0,\n    10928 => 838.0,\n    10929 => 838.0,\n    10930 => 838.0,\n    10931 => 838.0,\n    10932 => 838.0,\n    10933 => 838.0,\n    10934 => 838.0,\n    10935 => 838.0,\n    10936 => 838.0,\n    10937 => 838.0,\n    10938 => 838.0,\n    11001 => 838.0,\n    11002 => 838.0,\n    11008 => 838.0,\n    11009 => 838.0,\n    11010 => 838.0,\n    11011 => 838.0,\n    11012 => 838.0,\n    11013 => 838.0,\n    11014 => 838.0,\n    11015 => 838.0,\n    11016 => 838.0,\n    11017 => 838.0,\n    11018 => 838.0,\n    11019 => 838.0,\n    11020 => 838.0,\n    11021 => 838.0,\n    11022 => 836.0,\n    11023 => 836.0,\n    11024 => 836.0,\n    11025 => 836.0,\n    11026 => 945.0,\n    11027 => 945.0,\n    11028 => 945.0,\n    11029 => 945.0,\n    11030 => 769.0,\n    11031 => 769.0,\n    11032 => 769.0,\n    11033 => 769.0,\n    11034 => 945.0,\n    11039 => 869.0,\n    11040 => 869.0,\n    11041 => 873.0,\n    11042 => 873.0,\n    11043 => 873.0,\n    11044 => 1119.0,\n    11091 => 869.0,\n    11092 => 869.0,\n    11360 => 557.0,\n    11361 => 278.0,\n    11362 => 557.0,\n    11363 => 603.0,\n    11364 => 695.0,\n    11365 => 613.0,\n    11366 => 392.0,\n    11367 => 752.0,\n    11368 => 634.0,\n    11369 => 656.0,\n    11370 => 579.0,\n    11371 => 685.0,\n    11372 => 525.0,\n    11373 => 781.0,\n    11374 => 863.0,\n    11375 => 684.0,\n    11376 => 781.0,\n    11377 => 734.0,\n    11378 => 1128.0,\n    11379 => 961.0,\n    11380 => 592.0,\n    11381 => 654.0,\n    11382 => 568.0,\n    11383 => 660.0,\n    11385 => 414.0,\n    11386 => 612.0,\n    11387 => 491.0,\n    11388 => 175.0,\n    11389 => 431.0,\n    11390 => 635.0,\n    11391 => 685.0,\n    11520 => 591.0,\n    11521 => 595.0,\n    11522 => 564.0,\n    11523 => 602.0,\n    11524 => 587.0,\n    11525 => 911.0,\n    11526 => 626.0,\n    11527 => 952.0,\n    11528 => 595.0,\n    11529 => 607.0,\n    11530 => 954.0,\n    11531 => 620.0,\n    11532 => 595.0,\n    11533 => 926.0,\n    11534 => 595.0,\n    11535 => 806.0,\n    11536 => 931.0,\n    11537 => 584.0,\n    11538 => 592.0,\n    11539 => 923.0,\n    11540 => 953.0,\n    11541 => 828.0,\n    11542 => 596.0,\n    11543 => 595.0,\n    11544 => 590.0,\n    11545 => 592.0,\n    11546 => 592.0,\n    11547 => 621.0,\n    11548 => 920.0,\n    11549 => 589.0,\n    11550 => 586.0,\n    11551 => 581.0,\n    11552 => 914.0,\n    11553 => 596.0,\n    11554 => 595.0,\n    11555 => 592.0,\n    11556 => 642.0,\n    11557 => 901.0,\n    11568 => 646.0,\n    11569 => 888.0,\n    11570 => 888.0,\n    11571 => 682.0,\n    11572 => 684.0,\n    11573 => 635.0,\n    11574 => 562.0,\n    11575 => 684.0,\n    11576 => 684.0,\n    11577 => 632.0,\n    11578 => 632.0,\n    11579 => 683.0,\n    11580 => 875.0,\n    11581 => 685.0,\n    11582 => 491.0,\n    11583 => 685.0,\n    11584 => 888.0,\n    11585 => 888.0,\n    11586 => 300.0,\n    11587 => 627.0,\n    11588 => 752.0,\n    11589 => 656.0,\n    11590 => 527.0,\n    11591 => 685.0,\n    11592 => 645.0,\n    11593 => 632.0,\n    11594 => 502.0,\n    11595 => 953.0,\n    11596 => 778.0,\n    11597 => 748.0,\n    11598 => 621.0,\n    11599 => 295.0,\n    11600 => 778.0,\n    11601 => 295.0,\n    11602 => 752.0,\n    11603 => 633.0,\n    11604 => 888.0,\n    11605 => 888.0,\n    11606 => 752.0,\n    11607 => 320.0,\n    11608 => 749.0,\n    11609 => 888.0,\n    11610 => 888.0,\n    11611 => 698.0,\n    11612 => 768.0,\n    11613 => 685.0,\n    11614 => 698.0,\n    11615 => 622.0,\n    11616 => 684.0,\n    11617 => 752.0,\n    11618 => 632.0,\n    11619 => 788.0,\n    11620 => 567.0,\n    11621 => 788.0,\n    11631 => 515.0,\n    11800 => 531.0,\n    11807 => 838.0,\n    11810 => 390.0,\n    11811 => 390.0,\n    11812 => 390.0,\n    11813 => 390.0,\n    11822 => 531.0,\n    19904 => 896.0,\n    19905 => 896.0,\n    19906 => 896.0,\n    19907 => 896.0,\n    19908 => 896.0,\n    19909 => 896.0,\n    19910 => 896.0,\n    19911 => 896.0,\n    19912 => 896.0,\n    19913 => 896.0,\n    19914 => 896.0,\n    19915 => 896.0,\n    19916 => 896.0,\n    19917 => 896.0,\n    19918 => 896.0,\n    19919 => 896.0,\n    19920 => 896.0,\n    19921 => 896.0,\n    19922 => 896.0,\n    19923 => 896.0,\n    19924 => 896.0,\n    19925 => 896.0,\n    19926 => 896.0,\n    19927 => 896.0,\n    19928 => 896.0,\n    19929 => 896.0,\n    19930 => 896.0,\n    19931 => 896.0,\n    19932 => 896.0,\n    19933 => 896.0,\n    19934 => 896.0,\n    19935 => 896.0,\n    19936 => 896.0,\n    19937 => 896.0,\n    19938 => 896.0,\n    19939 => 896.0,\n    19940 => 896.0,\n    19941 => 896.0,\n    19942 => 896.0,\n    19943 => 896.0,\n    19944 => 896.0,\n    19945 => 896.0,\n    19946 => 896.0,\n    19947 => 896.0,\n    19948 => 896.0,\n    19949 => 896.0,\n    19950 => 896.0,\n    19951 => 896.0,\n    19952 => 896.0,\n    19953 => 896.0,\n    19954 => 896.0,\n    19955 => 896.0,\n    19956 => 896.0,\n    19957 => 896.0,\n    19958 => 896.0,\n    19959 => 896.0,\n    19960 => 896.0,\n    19961 => 896.0,\n    19962 => 896.0,\n    19963 => 896.0,\n    19964 => 896.0,\n    19965 => 896.0,\n    19966 => 896.0,\n    19967 => 896.0,\n    42192 => 686.0,\n    42193 => 603.0,\n    42194 => 603.0,\n    42195 => 770.0,\n    42196 => 611.0,\n    42197 => 611.0,\n    42198 => 775.0,\n    42199 => 656.0,\n    42200 => 656.0,\n    42201 => 512.0,\n    42202 => 698.0,\n    42203 => 703.0,\n    42204 => 685.0,\n    42205 => 575.0,\n    42206 => 575.0,\n    42207 => 863.0,\n    42208 => 748.0,\n    42209 => 557.0,\n    42210 => 635.0,\n    42211 => 695.0,\n    42212 => 695.0,\n    42213 => 684.0,\n    42214 => 684.0,\n    42215 => 752.0,\n    42216 => 775.0,\n    42217 => 512.0,\n    42218 => 989.0,\n    42219 => 685.0,\n    42220 => 611.0,\n    42221 => 686.0,\n    42222 => 684.0,\n    42223 => 684.0,\n    42224 => 632.0,\n    42225 => 632.0,\n    42226 => 295.0,\n    42227 => 787.0,\n    42228 => 732.0,\n    42229 => 732.0,\n    42230 => 557.0,\n    42231 => 767.0,\n    42232 => 300.0,\n    42233 => 300.0,\n    42234 => 596.0,\n    42235 => 596.0,\n    42236 => 300.0,\n    42237 => 300.0,\n    42238 => 588.0,\n    42239 => 588.0,\n    42564 => 635.0,\n    42565 => 521.0,\n    42566 => 354.0,\n    42567 => 338.0,\n    42572 => 1180.0,\n    42573 => 1028.0,\n    42576 => 1029.0,\n    42577 => 906.0,\n    42580 => 1080.0,\n    42581 => 842.0,\n    42582 => 977.0,\n    42583 => 843.0,\n    42594 => 1062.0,\n    42595 => 912.0,\n    42596 => 1066.0,\n    42597 => 901.0,\n    42598 => 1178.0,\n    42599 => 1008.0,\n    42600 => 787.0,\n    42601 => 612.0,\n    42602 => 855.0,\n    42603 => 712.0,\n    42604 => 1358.0,\n    42605 => 1019.0,\n    42606 => 879.0,\n    42634 => 782.0,\n    42635 => 685.0,\n    42636 => 611.0,\n    42637 => 583.0,\n    42644 => 686.0,\n    42645 => 634.0,\n    42648 => 1358.0,\n    42649 => 1019.0,\n    42760 => 493.0,\n    42761 => 493.0,\n    42762 => 493.0,\n    42763 => 493.0,\n    42764 => 493.0,\n    42765 => 493.0,\n    42766 => 493.0,\n    42767 => 493.0,\n    42768 => 493.0,\n    42769 => 493.0,\n    42770 => 493.0,\n    42771 => 493.0,\n    42772 => 493.0,\n    42773 => 493.0,\n    42774 => 493.0,\n    42779 => 369.0,\n    42780 => 369.0,\n    42781 => 252.0,\n    42782 => 252.0,\n    42783 => 252.0,\n    42786 => 385.0,\n    42787 => 356.0,\n    42788 => 472.0,\n    42789 => 472.0,\n    42790 => 752.0,\n    42791 => 634.0,\n    42792 => 878.0,\n    42793 => 709.0,\n    42794 => 614.0,\n    42795 => 541.0,\n    42800 => 491.0,\n    42801 => 521.0,\n    42802 => 1250.0,\n    42803 => 985.0,\n    42804 => 1203.0,\n    42805 => 990.0,\n    42806 => 1142.0,\n    42807 => 981.0,\n    42808 => 971.0,\n    42809 => 818.0,\n    42810 => 971.0,\n    42811 => 818.0,\n    42812 => 959.0,\n    42813 => 818.0,\n    42814 => 703.0,\n    42815 => 549.0,\n    42816 => 656.0,\n    42817 => 583.0,\n    42822 => 680.0,\n    42823 => 392.0,\n    42824 => 582.0,\n    42825 => 427.0,\n    42826 => 807.0,\n    42827 => 704.0,\n    42830 => 1358.0,\n    42831 => 1019.0,\n    42832 => 603.0,\n    42833 => 635.0,\n    42834 => 734.0,\n    42835 => 774.0,\n    42838 => 787.0,\n    42839 => 635.0,\n    42852 => 605.0,\n    42853 => 635.0,\n    42854 => 605.0,\n    42855 => 635.0,\n    42880 => 557.0,\n    42881 => 278.0,\n    42882 => 735.0,\n    42883 => 634.0,\n    42889 => 337.0,\n    42890 => 376.0,\n    42891 => 401.0,\n    42892 => 275.0,\n    42893 => 686.0,\n    42894 => 487.0,\n    42896 => 772.0,\n    42897 => 667.0,\n    42912 => 775.0,\n    42913 => 635.0,\n    42914 => 656.0,\n    42915 => 579.0,\n    42916 => 748.0,\n    42917 => 634.0,\n    42918 => 695.0,\n    42919 => 411.0,\n    42920 => 635.0,\n    42921 => 521.0,\n    42922 => 801.0,\n    43000 => 577.0,\n    43001 => 644.0,\n    43002 => 915.0,\n    43003 => 575.0,\n    43004 => 603.0,\n    43005 => 863.0,\n    43006 => 295.0,\n    43007 => 1199.0,\n    61184 => 213.0,\n    61185 => 238.0,\n    61186 => 257.0,\n    61187 => 264.0,\n    61188 => 267.0,\n    61189 => 238.0,\n    61190 => 213.0,\n    61191 => 238.0,\n    61192 => 257.0,\n    61193 => 264.0,\n    61194 => 257.0,\n    61195 => 238.0,\n    61196 => 213.0,\n    61197 => 238.0,\n    61198 => 257.0,\n    61199 => 264.0,\n    61200 => 257.0,\n    61201 => 238.0,\n    61202 => 213.0,\n    61203 => 238.0,\n    61204 => 267.0,\n    61205 => 264.0,\n    61206 => 257.0,\n    61207 => 238.0,\n    61208 => 213.0,\n    61209 => 275.0,\n    61440 => 977.0,\n    61441 => 977.0,\n    61442 => 977.0,\n    61443 => 977.0,\n    62464 => 580.0,\n    62465 => 580.0,\n    62466 => 624.0,\n    62467 => 889.0,\n    62468 => 585.0,\n    62469 => 580.0,\n    62470 => 653.0,\n    62471 => 882.0,\n    62472 => 555.0,\n    62473 => 580.0,\n    62474 => 1168.0,\n    62475 => 589.0,\n    62476 => 590.0,\n    62477 => 869.0,\n    62478 => 580.0,\n    62479 => 589.0,\n    62480 => 914.0,\n    62481 => 590.0,\n    62482 => 731.0,\n    62483 => 583.0,\n    62484 => 872.0,\n    62485 => 589.0,\n    62486 => 895.0,\n    62487 => 589.0,\n    62488 => 589.0,\n    62489 => 590.0,\n    62490 => 649.0,\n    62491 => 589.0,\n    62492 => 589.0,\n    62493 => 599.0,\n    62494 => 590.0,\n    62495 => 516.0,\n    62496 => 580.0,\n    62497 => 584.0,\n    62498 => 580.0,\n    62499 => 580.0,\n    62500 => 581.0,\n    62501 => 638.0,\n    62502 => 955.0,\n    62504 => 931.0,\n    62505 => 808.0,\n    62506 => 508.0,\n    62507 => 508.0,\n    62508 => 508.0,\n    62509 => 508.0,\n    62510 => 508.0,\n    62511 => 508.0,\n    62512 => 508.0,\n    62513 => 508.0,\n    62514 => 508.0,\n    62515 => 508.0,\n    62516 => 518.0,\n    62517 => 518.0,\n    62518 => 518.0,\n    62519 => 787.0,\n    62520 => 787.0,\n    62521 => 787.0,\n    62522 => 787.0,\n    62523 => 787.0,\n    62524 => 546.0,\n    62525 => 546.0,\n    62526 => 546.0,\n    62527 => 546.0,\n    62528 => 546.0,\n    62529 => 546.0,\n    63173 => 612.0,\n    64256 => 689.0,\n    64257 => 630.0,\n    64258 => 630.0,\n    64259 => 967.0,\n    64260 => 967.0,\n    64261 => 686.0,\n    64262 => 861.0,\n    64275 => 1202.0,\n    64276 => 1202.0,\n    64277 => 1196.0,\n    64278 => 1186.0,\n    64279 => 1529.0,\n    64285 => 224.0,\n    64286 => 0.0,\n    64287 => 331.0,\n    64288 => 636.0,\n    64289 => 856.0,\n    64290 => 774.0,\n    64291 => 906.0,\n    64292 => 771.0,\n    64293 => 843.0,\n    64294 => 855.0,\n    64295 => 807.0,\n    64296 => 875.0,\n    64297 => 838.0,\n    64298 => 708.0,\n    64299 => 708.0,\n    64300 => 708.0,\n    64301 => 708.0,\n    64302 => 668.0,\n    64303 => 668.0,\n    64304 => 668.0,\n    64305 => 578.0,\n    64306 => 412.0,\n    64307 => 546.0,\n    64308 => 653.0,\n    64309 => 355.0,\n    64310 => 406.0,\n    64312 => 648.0,\n    64313 => 330.0,\n    64314 => 537.0,\n    64315 => 529.0,\n    64316 => 568.0,\n    64318 => 679.0,\n    64320 => 399.0,\n    64321 => 649.0,\n    64323 => 640.0,\n    64324 => 625.0,\n    64326 => 593.0,\n    64327 => 709.0,\n    64328 => 564.0,\n    64329 => 708.0,\n    64330 => 657.0,\n    64331 => 272.0,\n    64332 => 578.0,\n    64333 => 529.0,\n    64334 => 625.0,\n    64335 => 629.0,\n    64338 => 941.0,\n    64339 => 982.0,\n    64340 => 278.0,\n    64341 => 302.0,\n    64342 => 941.0,\n    64343 => 982.0,\n    64344 => 278.0,\n    64345 => 302.0,\n    64346 => 941.0,\n    64347 => 982.0,\n    64348 => 278.0,\n    64349 => 302.0,\n    64350 => 941.0,\n    64351 => 982.0,\n    64352 => 278.0,\n    64353 => 302.0,\n    64354 => 941.0,\n    64355 => 982.0,\n    64356 => 278.0,\n    64357 => 302.0,\n    64358 => 941.0,\n    64359 => 982.0,\n    64360 => 278.0,\n    64361 => 302.0,\n    64362 => 1037.0,\n    64363 => 1035.0,\n    64364 => 478.0,\n    64365 => 506.0,\n    64366 => 1037.0,\n    64367 => 1035.0,\n    64368 => 478.0,\n    64369 => 506.0,\n    64370 => 646.0,\n    64371 => 646.0,\n    64372 => 618.0,\n    64373 => 646.0,\n    64374 => 646.0,\n    64375 => 646.0,\n    64376 => 618.0,\n    64377 => 646.0,\n    64378 => 646.0,\n    64379 => 646.0,\n    64380 => 618.0,\n    64381 => 646.0,\n    64382 => 646.0,\n    64383 => 646.0,\n    64384 => 618.0,\n    64385 => 646.0,\n    64386 => 445.0,\n    64387 => 525.0,\n    64388 => 445.0,\n    64389 => 525.0,\n    64390 => 445.0,\n    64391 => 525.0,\n    64392 => 445.0,\n    64393 => 525.0,\n    64394 => 483.0,\n    64395 => 552.0,\n    64396 => 483.0,\n    64397 => 552.0,\n    64398 => 895.0,\n    64399 => 895.0,\n    64400 => 476.0,\n    64401 => 552.0,\n    64402 => 895.0,\n    64403 => 895.0,\n    64404 => 476.0,\n    64405 => 552.0,\n    64406 => 895.0,\n    64407 => 895.0,\n    64408 => 476.0,\n    64409 => 552.0,\n    64410 => 895.0,\n    64411 => 895.0,\n    64412 => 476.0,\n    64413 => 552.0,\n    64414 => 734.0,\n    64415 => 761.0,\n    64416 => 734.0,\n    64417 => 761.0,\n    64418 => 278.0,\n    64419 => 302.0,\n    64426 => 698.0,\n    64427 => 632.0,\n    64428 => 527.0,\n    64429 => 461.0,\n    64467 => 824.0,\n    64468 => 843.0,\n    64469 => 476.0,\n    64470 => 552.0,\n    64471 => 483.0,\n    64472 => 517.0,\n    64473 => 483.0,\n    64474 => 517.0,\n    64475 => 483.0,\n    64476 => 517.0,\n    64478 => 483.0,\n    64479 => 517.0,\n    64484 => 783.0,\n    64485 => 833.0,\n    64486 => 278.0,\n    64487 => 302.0,\n    64488 => 278.0,\n    64489 => 302.0,\n    64508 => 783.0,\n    64509 => 833.0,\n    64510 => 278.0,\n    64511 => 302.0,\n    65024 => 0.0,\n    65025 => 0.0,\n    65026 => 0.0,\n    65027 => 0.0,\n    65028 => 0.0,\n    65029 => 0.0,\n    65030 => 0.0,\n    65031 => 0.0,\n    65032 => 0.0,\n    65033 => 0.0,\n    65034 => 0.0,\n    65035 => 0.0,\n    65036 => 0.0,\n    65037 => 0.0,\n    65038 => 0.0,\n    65039 => 0.0,\n    65056 => 0.0,\n    65057 => 0.0,\n    65058 => 0.0,\n    65059 => 0.0,\n    65136 => 293.0,\n    65137 => 293.0,\n    65138 => 293.0,\n    65139 => 262.0,\n    65140 => 293.0,\n    65142 => 293.0,\n    65143 => 293.0,\n    65144 => 293.0,\n    65145 => 293.0,\n    65146 => 293.0,\n    65147 => 293.0,\n    65148 => 293.0,\n    65149 => 293.0,\n    65150 => 293.0,\n    65151 => 293.0,\n    65152 => 470.0,\n    65153 => 278.0,\n    65154 => 305.0,\n    65155 => 278.0,\n    65156 => 305.0,\n    65157 => 483.0,\n    65158 => 517.0,\n    65159 => 278.0,\n    65160 => 305.0,\n    65161 => 783.0,\n    65162 => 833.0,\n    65163 => 278.0,\n    65164 => 302.0,\n    65165 => 278.0,\n    65166 => 305.0,\n    65167 => 941.0,\n    65168 => 982.0,\n    65169 => 278.0,\n    65170 => 302.0,\n    65171 => 524.0,\n    65172 => 536.0,\n    65173 => 941.0,\n    65174 => 982.0,\n    65175 => 278.0,\n    65176 => 302.0,\n    65177 => 941.0,\n    65178 => 982.0,\n    65179 => 278.0,\n    65180 => 302.0,\n    65181 => 646.0,\n    65182 => 646.0,\n    65183 => 618.0,\n    65184 => 646.0,\n    65185 => 646.0,\n    65186 => 646.0,\n    65187 => 618.0,\n    65188 => 646.0,\n    65189 => 646.0,\n    65190 => 646.0,\n    65191 => 618.0,\n    65192 => 646.0,\n    65193 => 445.0,\n    65194 => 525.0,\n    65195 => 445.0,\n    65196 => 525.0,\n    65197 => 483.0,\n    65198 => 552.0,\n    65199 => 483.0,\n    65200 => 552.0,\n    65201 => 1221.0,\n    65202 => 1275.0,\n    65203 => 838.0,\n    65204 => 892.0,\n    65205 => 1221.0,\n    65206 => 1275.0,\n    65207 => 838.0,\n    65208 => 892.0,\n    65209 => 1209.0,\n    65210 => 1225.0,\n    65211 => 849.0,\n    65212 => 867.0,\n    65213 => 1209.0,\n    65214 => 1225.0,\n    65215 => 849.0,\n    65216 => 867.0,\n    65217 => 925.0,\n    65218 => 949.0,\n    65219 => 796.0,\n    65220 => 820.0,\n    65221 => 925.0,\n    65222 => 949.0,\n    65223 => 796.0,\n    65224 => 820.0,\n    65225 => 597.0,\n    65226 => 532.0,\n    65227 => 597.0,\n    65228 => 482.0,\n    65229 => 597.0,\n    65230 => 532.0,\n    65231 => 523.0,\n    65232 => 482.0,\n    65233 => 1037.0,\n    65234 => 1035.0,\n    65235 => 478.0,\n    65236 => 506.0,\n    65237 => 776.0,\n    65238 => 834.0,\n    65239 => 478.0,\n    65240 => 506.0,\n    65241 => 824.0,\n    65242 => 843.0,\n    65243 => 476.0,\n    65244 => 552.0,\n    65245 => 727.0,\n    65246 => 757.0,\n    65247 => 305.0,\n    65248 => 331.0,\n    65249 => 619.0,\n    65250 => 666.0,\n    65251 => 536.0,\n    65252 => 578.0,\n    65253 => 734.0,\n    65254 => 761.0,\n    65255 => 278.0,\n    65256 => 302.0,\n    65257 => 524.0,\n    65258 => 536.0,\n    65259 => 527.0,\n    65260 => 461.0,\n    65261 => 483.0,\n    65262 => 517.0,\n    65263 => 783.0,\n    65264 => 833.0,\n    65265 => 783.0,\n    65266 => 833.0,\n    65267 => 278.0,\n    65268 => 302.0,\n    65269 => 570.0,\n    65270 => 597.0,\n    65271 => 570.0,\n    65272 => 597.0,\n    65273 => 570.0,\n    65274 => 597.0,\n    65275 => 570.0,\n    65276 => 597.0,\n    65279 => 0.0,\n    65529 => 0.0,\n    65530 => 0.0,\n    65531 => 0.0,\n    65532 => 0.0,\n    65533 => 1025.0,\n  ),\n  'CIDtoGID_Compressed' => true,\n  'CIDtoGID' => 'eJzt3AW087iZOHxJli3LliUZXmZmZmZmZmZmZmZmZmZmZmZmZmb+p3e780230+60M+3sfqvfObIl+ZH82E6cm9yTAPAbaQADHRiAABNQYAEbMOAADgSQwAUe8EEAwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CABSAgSgcQgCUgKkoHkIAVICVKB1CANSAvSgfQgA8gIMoHMIAvICrKB7CAHyAlygdwgD8gL8oH8oAAoCAqBwqAIKAqKgeKgBCgJSoHSoAwoC8qB8qACqAgqgcqgCqgKqoHqoAaoCWr91oMPqQ3qgLqgHqgPGoCGoBFoDJqApqAZaA5agJagFWgN2oC2oB1oDzqAjqAT6Ay6gK6gG+gOeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWAUGA3GgLFgHBgPJoCJYBKYDKaAqWAamA5mgJlgFpgN5oC5YB6YDxaAhWARWAyWgKVgGVgOVoCVYBVYDdaAtWAdWA82gI1gE9gMtoCtYBvYDnaAnWAX2A32gL1gH9gPDoCD4BA4DI6Ao+AYOA5OgJPgFDgNzoCz4Bw4Dy6Ai+ASuAyugKvgGrgOboCb4Ba4De6Au+AeuA8egIfgEXgMnoCn4Bl4Dl6Al+AVeA3egLfgHXgPPoCP4BP4DL6Ar+Ab+A5+QAAhRFCDGOrQgASakEIL2pBBB3IooIQu9KAPAxgOhocRYEQYCUaGUWBUGA1GhzFgTBgLxoZxYFwYD8aHCWBCmAgmhklgUpgMJocpYEqYCqaGaWBamA6mhxlgRpgJZoZZYFaYDWaHOWBOmAvmhnlgXpgP5ocFYEFYCBaGRWBRWAwWhyVgSVgKloZlYFlYDpaHFWBFWAlWhlVgVVgNVoc1YE1YC9aGdWBdWA/Whw1gQ9gINoZNYFPYDDaHLWBL2Aq2hm1gW9gOtocdYEfYCXaGXWBX2A12hz1gT9gL9oZ9YF/YD/aHA+BAOAgOhkPgUDgMDocj4Eg4Co6GY+BYOA6OhxPgRDgJToZT4FQ4DU6HM+BMOAvOhnPgXDgPzocL4EK4CC6GS+BSuAwuhyvgSrgKroZr4Fq4Dq6HG+BGuAluhlvgVrgNboc74E64C+6Ge+BeuA/uhwfgQXgIHoZH4FF4DB6HJ+BJeAqehmfgWXgOnocX4EV4CV6GV+BVeA1ehzfgTXgL3oZ34F14D96HD+BD+Ag+hk/gU/gMPocv4Ev4Cr6Gb+Bb+A6+hx/gR/gJfoZf4Ff4DX6HPxBAECGkIYx0ZCCCTESRhWzEkIM4EkgiF3nIRwEKh8KjCCgiioQioygoKoqGoqMYKCaKhWKjOCguiofiowQoIUqEEqMkKClKhpKjFCglSoVSozQoLUqH0qMMKCPKhDKjLCgryoayoxwoJ8qFcqM8KC/Kh/KjAqggKoQKoyKoKCqGiqMSqCQqhUqjMqgsKofKowqoIqqEKqMqqCqqhqqjGqgmqoVqozqoLqqH6qMGqCFqhBqjJqgpaoaaoxaoJWqFWqM2qC1qh9qjDqgj6oQ6oy6oK+qGuqMeqCfqhXqjPqgv6of6owFoIBqEBqMhaCgahoajEWgkGoVGozFoLBqHxqMJaCKahCajKWgqmoamoxloJpqFZqM5aC6ah+ajBWghWoQWoyV/ui2hpWgZWv6fNym04s/rlf/19oVWodVoDVqL1qH1aAPaiDahzWgL2oq2oe1oB9qJdqHdaA/ai/ah/egAOogOocPoCDqKjqHj6AQ6iU6h0+gMOovOofPoArqILqHL6Aq6iq6h6+gGuoluodvoDrqL7qH76AF6iB6hx+gJeoqeoefoBXqJXqHX6A16i96h9+gD+og+oc/oC/qKvqHv6If2pxcYqCFN+/OLDdb00NIIFaKZGtUszdaY5vydlyeuCU1qruZpvhZo4cL6wmsRtIhaJC2yFuWnuKhaNC26FkOLqcXSYofacUIlrhZPi68l0BJqibTEWhItqZZMS66l0FJqqbTUWhotrZZOS69lCEVm1DJpmbUsWlYtm5Zdy6Hl1HJpubU8Wl4tn5ZfK6AV1ApphbUiWlGtmFZcK6GV1EpppbUyWlmtnFZeq6BV1CpplbUqWlWtmlZdq6HV1GpptbU6Wl2tnlZfa6A11BppjbUmWlOtmdZca6G11FpprbU2WlutndZe66B11DppnbUuWletm9Zd66H11HppvbU+Wl+tn9ZfG6AN1AZpg7Uh2lBtmDZcG6GN1EZpo7Ux2lhtnDZem6BN1CZpk7Up2lRtmjZdm6HN1GZps7U52lxtnjZfW6At1BZpi7Ul2lJtmbZcW6Gt1FZpq7U12lptnbZe26Bt1DZpm7Ut2lZtm7Zd26Ht1HZpu7U92l5tn7ZfO6Ad1A5ph7Uj2lHtmHZcO6Gd1E5pp7Uz2lntnHZeu6Bd1C5pl7Ur2lXtmnZdu6Hd1G5pt7U72l3tnnZfe6A91B5pj7Un2lPtmfZce6G91F5pr7U32lvtnfZe+6B91D5pn7Uv2lftm/Zd+4EBhhhhDWOsYwMTbGKKLWxjhh3MscASu9jDPg5wOBweR8ARcSQcGUfBUXE0HB3HwDFxLBwbx8FxcTwcHyfACXEinBgnwUlxMpwcp8ApcSqcGqfBaXE6nB5nwBlxJpwZZ8FZcTacHefAOXEunBvnwXlxPpwfF8AFcSFcGBfBRXExXByXwCVxKVwal8FlcTlcHlfAFXElXBlXwVVxNVwd18A1cS1cG9fBdXE9XB83wA1xI9wYN8FNcTPcHLfALXEr3Bq3wW1xO9wed8AdcSfcGXfBXXE33B33wD1xL9wb98F9cT/cHw/AA/EgPBgPwUPxMDwcj8Aj8Sg8Go/BY/E4PB5PwBPxJDwZT8FT8TQ8Hc/AM/EsPBvPwXPxPDwfL8AL8SK8GC/BS/EyvByvwCvxKrwar8Fr8Tq8Hm/AG/EmvPmXn4F4C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br4ZNt8tfBvfwXfxPXwfPwi1H+JH+DF+gp/iZ/g5foFf4lf4NX6D3+J3+D3+gD/iT/gz/oK/4m/4O/6hAx3qSNd0rOu6oRPd1Klu6bbOdEfnAOhCl7/+z7//ju7qnu7rgR5OD69H0CPqkfTIehQ9qh5Nj67H0GPqsfTYehw9blhsPD3+X41PoCfUE+mJ9SR6Uj2ZnlxPoafUU+mp9TR6Wj2dnl7PoGfUM+mZ9Sx6Vj2bnl3PoefUc/1sfG49j55Xz6fn/xW5FtALhpaF9MKhZZG/2lr0Z/Vif14XD5USekm9lF5aL6OX1cvp5fUKekW9kl5Zr6JX1avp1fUaek29ll5br6PX1evp9fUGesOfzdRIb6w30ZvqzfTmegu9pd5Kb6230dvq7fT2ege9o95J76x30bvq3fTuoegeYWN6/mx8L7233kfvq/fT++sD9IH6IH2wPkQfqg/Th+sj9JH6qD/Hjf5pxBh9rD5OH69P0Cfqk/TJ+hR9qj5Nn67P0Gfqs/TZ+hx9rj5Pn68v0Bfqi/TF+hJ9qb5MX66v0Ffqq/TV+hp9rb5OX69v0Dfqm/TN+hZ9q75N367v0Hfqu/Td+h59r75P368f0A/qh/TD+hH9qH5MP66f0E/qp/TT+hn9rH5OP69f0C/ql/7iDF/Wr+hXw2rX9Ouh5Y1QufnT1lv//RX8hWt6W7+j39Xv6ff1B/pD/ZH+WH/yz8yj/GvoT/Vn+nP9hf5Sf6W/1t/ob/V3+nv9g/5R/6R/1r/oX/Vv+nf9hwEMaCBDM7ChG4ZBDNOghmXYBjMcgxvCkIZreIb/H7MagRHOCG9EMCIakYzIRhQjqhHNiB62JYYR04j1Rx6xoiiKoiiKoij/Nxmx/+gMQjnEMeKGlvHC6vGNBKFlwrB6or+ISmwkMZIayUK15EYKI6WRykhtpDHShtrpjPRGhtA6Y6hkCovNbGQJLbMa2YzsRg4jp5HLyG3kMfIa+Yz8RgGjYGhbIaOwEfYJi1HUKGYUN0oYJUP1UqFS2ihjlDXKGeWNCmHbKxqVjMpGFaOqUc2obtQwahph/7U0aht1/o0nSVGUX2DUNeoZ9Y0GRkOjkdHYaGI0NZoZzY0WRkujldHaaGO0NdoZ7Y0ORkejk9HZ6GJ0NboZ3Y0eRk+jl9Hb6GP0NfoZ/Y0BxkBj0C/OP9gYYgw1hhnDjRHGSGOUMdoYY4w1xhnjjQnGRGOSMdmYYkw1phnTjRnGTGOWMduYY8w15hnzjQXGQmORsdhYYiw1lhnLjRXGSmOVsdpYY6w11hnr/91nSlEURfmfxdhgbDQ2GZuNLcZWY1uovd3YYew0dhm7jT3GXmOfsd84YBw0DhmHjSPGUeOYcdw4YZwMxZ0yThtnjLPGOeO8ccG4aFwyLhtXjKvGNeO6ccO4adwybht3jLvGPeO+8cB4aDwKjXlsPDGeGs+M58YL46XxynhtvDHeGu+M98YH46PxyfhsfDG+Gt9Ckd+NHwQQSBDRCAaA6MQghJiEEovYhBGHcCKIJC7xiE8CEo6EJxFIRBKJRCZRSFQSjUQnMUhMEovEJnFIXBKPxCcJSEKSiCQmSUhSkowkJylISpKKpCZpSFqSjqQnGUhGkolkJllIVpKNZCc5SE6Si+QmeUheko/kJwVIQVKIFCZFSFFSjBQnJUhJUoqUJmVIWVKOlCcVSEVSiVQmVUhVUo1UJzVITVKL1CZ1SF1Sj9QnDUhD0og0Jk1IU9KMNP/T2SctSEvSirQmbUhb0o60Jx1IR9KJdCZdSFfSjXQnPUhP0ov0Jn1IX9KP9CcDyEAyiAwmQ8hQMowMJyPISDKKjCZjyFgyjownE8hEMik072QyhUwl08h0MoPMJLPIbDKHzCXzyHyygCwki8hisoQsJcvIcrKCrCSryGqyhqwl6/7ro4OsJxvIRrKJbCZbyFayjWwnO8hOsovsJnvIXrKP7CcHyEFyiBwmR8hRcowcJyfISXKKnCZnyFlyjpwnF8hFcolcJlfIVXKNXCc3yE1yi9wmd8jd0Pz3yH3ygDwkj8hj8oQ8Jc/Ic/KCvCSvyGvyhrwl70Ix78kH8pF8Ip/JF/KVfCPfyQ8TmNBEpmZiUzcNk5imSU3LtE1mOib/60e5KUxpuqZn+mZghjPDmxHMiGYkM7IZxYxqRjOjmzHMmD/FxjJjm3HMuGY8M76ZwExoJjITm0nMpGayX5g3uZnCTGmmMlObacy0ZjozvZnBzGhmMjObWcysZrbf73n6C/vOHrbM8a/cx7+TmdPM9d9H/QPz5TbzmHnNfGZ+s4BZ0CxkFv6FmCJmUbOYWdwsYZY0S5mlzTJmWbOcWd6sYFY0K5mVzSpmVbOaWd2sYdY0a5m1zTpmXbOeWd9s8HtmqiiKoiiKoiiK8q9nNjQbmY3NJmZTs5nZ3GxhtjRbma3NNmZbs53Z3uxgdjQ7mZ3NLmbXUGw3s7vZw+xp9jJ7m33MvmY/s785wBxoDjIHh801xBxqDjOHmyPMkeYoc7Q5JtQ31hxnjjcnmBPNSeZkc4o51ZxmTjdnmDPNWeZsc44515xnzjcXmAvNReZic4m51FxmLjdXmCvNVeZqc4251lxnrjc3mBvNTeZmc4u51dxmbjd3hGbeae4yd5t7zL3mPnO/ecA8aB4yD5tHzKPmsb95tMfNE2Hrk6Fy6r9sO/0PnLUz5lnznHnevGBeNC+Zl80r5lXzmnndvGHeNG+Zt8075l3znnnffGA+NB+Zj80n5lPzmfncfGG+NF+Zr8035lvznfne/PDTjB/NT+Zn84v51fz2D13A38j8bv6ggEKKqEYx1alBCTUppRa1KaMO5VRQSV3qUZ8GNBwNTyPQiDQSjUyj0Kg0Go1OY9CYNBaNTePQuDQejU8T0IQ0EU1Mk9CkNBlNTlPQlDQVTU3T0LQ0HU1PM9CMNBPNTLPQrDQbzU5z0Jw0F81N89C8NB/NTwvQgrQQLUyL0KK0GC1OS9CStBQtTcvQsrQcLU8r0Iq0Eq1Mq9CqtBqtTmvQmrQWrU3r0Lq0Hq1PG9CGtBFtTJvQprQZbU5b0Ja0FW1N29C2tB1tTzvQjrQT7Uy70K60G+1Oe9CetBftTfvQvrQf7U8H0IF0EB1Mh9ChdBgdTkfQkXQUHU3H0LF0HB1PJ9CJdBKdTKfQqXQanU5n0Jl0Fp1N59C5dB6dTxfQhXQRXUyX0KV0GV1OV9CVdBVdTdfQtXQdXU830I10E91Mt9CtdBvdTnfQnXQX3U330L10H91PD9CD9BA9TI/Qo/QYPU5P0JP0FD1Nz9Cz9Bw9Ty/Qi/QSvUyv0Kv0Gr1Ob9Cb9Ba9Te/Qu/QevU8f0If0EX1Mn9Cn9Bl9Tl/Ql/QVfU3f0Lf0HX1PP9CP9NN/Xn/6mX6hX+k3+p3+sIAFLWRpFrZ0y7CIZVrUsizbYpZjcUv8Kd6Slmt5lm8FVth36azwVgQrohXJimxFsaJa0azoVgwrphXLim3FseJa8az4VgIroZXISmwlsZJayazkVgorpZXKSm2lsdJa6az0VgYro5XJymxlCZsvq5XNym7lsHJaYZ8FWbmtPFZeK5+V3ypgFbQKhXoKh0qRUCkaKsWs4lYJq6RVyiptlbHKWuWs8lYFq6JVyapsVbGqWtWs6lYNq6ZVy6pt1bHqWvWs+lYDq6HVyGpsNQmbv6nVzGputbBaWq2s1lYbq63VzmpvdbA6Wp2szlYXq6vVzepu9bB6Wr2s3lYfq6/Vz+pvDbAGWoOswdYQa6g1zBpujbBGWqOs0dYYa6w1zhpvTbAmWpOsydYUa6o1zZpuzbBmhvY1y5ptzbHmWvOs+dYCa6G1yFpsLbGWWsus5daK0PaV1iprtbXGWmuts9ZbG6yN1iZrs7XF2mptC8t1u7XD2mntsnZbe0KtvdY+a791wDpoHbIOW0eso9Yx67h1wjppnbJOW2ess9Y563zYuAvWRetSaH3ZumJdta5Z160b1k3rlnU71HfHumvds+5bD6yH1iPrsfXEemo9s55bL6yX1ivrtfXGemu9s95bH6yP1ifrs/XF+mp9s75bP2xgQxvZmo1t3TZsYps2tS3btpnt2NwWtrRd27N9O7DD2eHtCHZEO5Id2Y5iR7Wj2dHtGHZMO5Yd245jx7Xj2fHtBHZCO5Gd2E5iJ7WT2cntFHZKO5Wd2k5jp7XT2entDHZGO5Od2c5iZ7Wz2dntHHZOO5ed285j57Xz2fntAv/fPc0uaBeyC9tF7KJ2Mbu4XSKsr6Rdyi5tl7HL2uXs8nYFu6Jdya5sV7Gr2tXs6nYNu6Zdy65t17Hr2vXs+nYDu6HdyG4cGtfEbmo3s5vbLeyWdiu7td3Gbmu3s9vbHf68r452J7uz3cXuanezu9s97J52L7u33cfua/ez+9sD7IH2IHuwPcQeag8Lix9uj7BHhtVG/Zr7sz3aHvNTfaw97s+18faEn3on/tp7/S/OP8mebE+xp9rT7On2DHumPcueHeqdY8+159nz7QX2QnuRvdheYi+1l9nL7RX2SnuVvdpeY6+119nr7Q32RnuTvdneYm+1t9nb7R32TnuXvdveY++199n77QP2QfuQfdg+Yh+1j9nH7RP2SfuUfdo+Y5+1z9nn7Qv2RfuSfdm+Yl+1r9nX7Rv2TftWaP+3w3K7Eyp37Xv2ffuB/dB+ZD+2n9hP7Wf2c/uF/dJ+Zb+239hv7Xf2e/uD/dH+ZH+2v9hf7W/2d/sHAwwyxDSGmc4MRpjJKLOYzRhzGGeCSeYyj/ksYOFYeBaBRWSR/uOMsMg/Pz8sCovKorHoLAaLyWKx2CwOi8visfgsAUvIErHELAlLypKx5CwFS8lSsdQsDUvL0rH0LAPLyDKxzCwLy8qysewsB8vJcrHcLA/Ly/Kx/KwAK8gKscKsCCvKirHirAQryUqx0qwMK8vKsfKsAqvIKrHKrAqryqqx6qwGq8lqsdqsDqvL6rH6rAFryBqxxqwJa8qaseasBWvJWrHWrA1ry9qx9qwD68g6sc6sC+vKurHurAfryXqx3qwP68v6sf5sABvIBrHBbAgbyoax4WwEG8lGsdFsDBvLxrHxbAKbyCaxyWwKm8qmselsBpvJZrHZbA6by+ax+WwBW8gWscVsCVvKlrHlbAVbyVax1WwNW8vWsfVsA9vINrHNbAvbyrax7WwH28l2sd1sD9vL9rH97AA7yA6xw+wIO8qOsePsBDvJTrHT7Aw7y86x8+wCu8guscvsCrvKrrHr7Aa7yW6x2+wOu8vusfvsAXvIHrHH7Al7yp6x5+wFe8lesdfsDXvL3rH37AP7yD6xz+wL+8q+se/shwMc6CBHc7CjO4ZDHNOhjuXYDnMchzvCkY7reI7vBE44J7wTwYnoRHIiO1GcqE40J7oTw4npxHJiO3GcuE48J76TwEnoJHISO0mcpE4yJ7mTwknppHJSO2mctE46J72TwcnoZHIyO1mcrE42J7uTw8np5HJyO3mcvE4+J79TwCnoFHIKO0Wcok4xp7hTwinplHJKO2Wcsk45p7xTwanoVHIqO1Wcqk41p7pTw6np1HJqO3Wcuk49p77TwGnoNHIaO02cpk4zp7nTwmnptHJaO22ctk47p73TwenodHI6O12crk43p7vTw+np9HJ6O32cvk4/p78zwBnoDHIGO0Ococ4wZ7gzwhnpjHJGO2Ocsc44Z7wzwZnoTHImO1OcqT9/PjjTnOlh6xnOTGeWM9uZ48wNa89z5jsLnIXOorDWYmfJb7kr/d6cpc4y56dfQ3DCfg3BWfkLcav+5gyr/6K1xlnrrHPWOxucjc4mZ7OzxdnqbHO2Ozucnc4uZ7ezx9nr7HP2/8asDzgHf2XkoVA5HFY78tv2+c9wjjp/8x3Xv3zfx50TzknnlHPaOeOcdc45550Lf1Qu/xs5F51LzmXninPVueZcd244N51bzm3njnPXuefcdx44D51HzmPnifPUeeY8d144L51XzmvnjfPWeee8dz44H51Pzmfni/PV+eZ8d35wwCFHXOOY69zghJuccovbnHGHcy645C73uM8DHo6H5xF4RB6JR+ZReFQejUfnMXhMHovH5nF4XB6Px+cJeEKeiCfmSXhSnown5yl4Sp6Kp+ZpeFqejqfnGXhGnoln5ll4Vp6NZ+c5eE6ei+fmeXheno/n5wV4QV6IF+ZFeFFejBfnJXhJXoqX5mV4WV6Ol+cVeEVeiVfmVXhVXo1X5zV4TV6L1+Z1eF1ej9fnDXhD3og35k14U96MN+cteEveirfmbXhb3o635x14R96Jd+ZdeFfejXfnPXhP3ov35n14X96P9+cD+EA+iA/mQ/hQPowP5yP4SD6Kj+Zj+Fg+jo/nE/hEPolP5lP4VD6NT+cz+Ew+i8/mc/hcPo/P5wv4Qr6IL+ZL+FK+jC/nK/hKvoqv5mv4Wr6Or+cb+Ea+iW/mW/hWvo1v5zv4Tr6L7+Z7+F6+j+/nB/hBfogf5kf4UX6MH+cn+El+ip/mZ/hZfo6f5xf4RX6JX+ZX+FV+jV/nN/hNfovf5nf4XX6P3+cP+EP+iD/mT/hT/ow/5y/4S/6Kv+Zv+Fv+jr/nH/hH/ol/5l/4V/6Nf+c/BBBQIKEJLHRhCCJMQYUlbMGEI7gQQgpXeMIXgQgnwosIIqKIJCKLKCKqiCaiixgipoglYos4Iq6IJ+KLBCKhSCQSiyQiqUgmkosUIqVIJVKLNCKtSCfSiwwio8gkMossIqvIJrKLHCKnyCVyizwir8gn8osCoqAoJAqLIqKoKCaKixKipCglSosyoqwoJ8qLCqKiqCQqiyqiqqgmqosaoqaoJWqLOqKuqCfqiwaioWgkGosmoqloJpqLFqKlaCVaizaiLQCinWgvOoiOopPoLLqIrqKb6C56iJ6il+gt+oi+op/oLwaIgWKQGCyGiKFimBguRvzl80+MFKPEaDHml5+dv44Y+5tGjxPjxQQRehchJonJYooIe70X08R0MUPMFLPEbDFHzBXzxHyxQCwUi8RisUQsFcvEcrFCrBSrxGqxRqwV68R6sUFsDI3cJDaLLWKr2Ca2ix1ip9gldos9Yq/YJ/aLA+KgOCQOiyPiqDgmjosT4qQ4JU6LM+KsOCfOiwviorgkLosroXmuhso1cV3cEDf/nGnonYG4Le6Iu+KeuC8eiIdhvY/EY/FEPBXPxHPxQrwUr8Rr8Ua8Fe/Ee/FBfBSfxGfxRXwV38R38UMCCSWSmsRSl4Yk0pRUWtKWTDqSSyGldKUnfRnIcDK8jCAjykgysowio/5HDjKajC5jyJgylowt48i4Mp6MLxPIhDKRTCyTyKQymUwuU8iUMpVMLdPItKER6WR6mUFmlJlkZplFZpXZZHaZQ+aUuWTun18HmUfm/cevnsz3s3p+WUAWlIVkYfnTr3fIorKYLC5LyJKylCwty8iyspwsLyvIirKSrCyryKqymqwua8iaspasLevIurKerC8byIaykWwsm8imsplsLlvIlrKVbC3byLaynWwvO8iOspPsLLvIrrKb7C57yJ6yl+wt+8i+sp/sLwfIgXKQHCyHyKFymBwuR8iRcpQcLcfIsXKcHC8nyIlykpwsp8ipcpqcLmfImXKWnC3nyLlynpwvF8iFcpFcLJfIpXKZXC5XyJVylVwt18i1cp1cLzfIjXKT3Cy3yK1ym9wud8idcpfcLffIvXKf3C8PyIPykDwsj8ij8pg8Lk/Ik/KUPC3PyLPynDwvL8iL8pK8LK/Iq/KavC5vyJvylrwt78i78p68Lx/Ih/KRfCyfyKfymXwuX8iX8pV8Ld/It/KdfC8/yI/yk/wsv8iv8pv8Ln+4wIUucjUXu7pruMQ1Xeparu0y13G5K1zpuq7n+m7ghnPDuxHciG4kN7IbxY3qRnOjuzHcmG4sN7Ybx43rxnPjuwnchG4iN7GbxE3qJnOTuynclG4qN7Wbxk3rpnPTuxncjG4mN7Obxc3qZnOzuzncnG4uN7ebx83r5nPzuwXcgm4ht7BbxC3qFnOLuyXckm4pt7Rbxi3rlnPLuxXcim4lt7Jb5eePJbeqWy1sXd2t8Y8/Ev85bk339/gVxt+aRW33f+C3qdy6bj23vtvAbeg2chu7Tf6BkU3/7tZmbvOf6i3clm6rX4hp7bZx27rt3PZuB7ej28nt7HZxu7rd3O5uD7en28vt/avy6PPrc/79uH3dfr8iqr87wB3oDnIHu0Pcoe4wd7g7wh3pjnJHu2Pcse44d7w7wZ3oTnInu1Pcqe40d7o7w53pznJnu3Pcue48d767wF3oLvo7e1jsLnGXusvc5e4Kd6W7yl3trnHXuuvcP/S7N+4Gd+PPWpvcze4Wd6u7zd3u7nB3urvc3e4ed6+7z93vHnAPuofcw+4R96h7zD3unnBPuqfc0+6Zn0afdc+5590L7kX30i/t63fL+bJ75V85v/K/lXvVveZed2+4N91b7m33jnvXvefedx+4D91H7mP3ifvUfeY+d1+4L91X7mv3TWjEW/ed+9794H50P7mf/+j8/2juF/er+8397v7wgAc95Gke9nTP8IhnetSzPNtjnuNxT3jScz3P873AC+eF9yJ4Eb1IXmQvihfVi+ZF92J4MX9pfi+WF9uL48X14nnxvQReQi+Rl9hL4iX1knnJvRReSi+Vl9pL46X10nnpvQxeRi+Tl9nL4mX1snnZvRxeTi+Xl9vL4+X18nn5vQJeQa+QV9gr4hX1innFvRJeSa+UV9or45X1ynnlf2HvFf7Fp+//HK/iX7QqhS0re1W8ql61v4qt/u/KSlEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVF+G6+GV9Or5dX26nh1vXpefa+B19Br5DX2mnhNvWZec6+F19Jr5bX22nhtvXZee6+D19Hr5HX2unhdvW5ed6+H19Pr5fX2+nh9vX5ef2+AN9Ab5A32hnhDvWHecG+EN9Ib5Y32xnhjvXHeeG+CN9Gb5E32pnhTvWne9D/6+BVFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+f8Pb4Y305vlzfbmeHO9ed58b4G30FvkLfaWeEu9Zd5yb4W30lvlrfbWeGu9dd56b4O30dvkbfa2eFu9bd52b4e309vl7fb2eHu9fd5+74B30DvkHfaOeEe9Y97xP/r4FOVPvBPeSe+Ud/qn9hnvbNj6nHc+bH3Bu+hd8i7/4tgr3lXvmnfdu+Hd9G55t7073l3vnnffe/BP5vLQe+Q99p78Rd9T71nY+rn34p+b9X8H76X3ynvtvfHeeu+8994H76P3yfvsffG+et+87z9F/fCBD33ka39q+djXfcMnvulT3/Jtn/nOf0b63Be+9F3f830/8MP54f0IfkQ/kh/Zj+JH9aP50f0YP8XG9GP5sf04flw/Xlg7vp/AT+gn8hP7ScLaSf1kfytvP7mfwk/pp/pHj9dP7afx0/rpftaT3s/gZ/Qz+Zn9LKFWVj/b3x2f3c/h5/Rz+bn9PH5eP5+f3y/gF/xHs/j38Qv5hf0iflG/mF/cL+GX/KPzURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+XfxS/ml/TJ+Wb+cX96v4Ff0K/mV/Sp+Vb+aX92v4df0a/m1/Tp+Xb+eX99v4Df0G/mN/+icld+P38Rv6jfzm//ReSiKoiiK8u/jt/Bb+q381n4bv63fzm/vd/A7+p38zn4Xv6vfze/u9/B7+r383n4fv6/fz+/vD/AH+oP8wf4Qf6g/zB/uj/BH+qP80f4Yf6w/LjTfeH+CP9Gf5E/2p/hT/Wn+dH+GP9Of5c/25/hz/Xn+fH+Bv9Bf5C/2l/hL/WX+cn/FH30OFEVR/lj+yj86A0VRFEVR/m/wV/mr/TX+Wn+dv97f8DejNvqb/M3+Fn/rz/q2+dv9Hf5Of5e/29/j7/X3+fv9A/5B/5B/2D/iH/WP+cf9E/5J/5R/2j/jn/XP+edDoy74F/1L/mX/Sqh+NVSu+ddDyxv+zdDyln/bv+Pf9e/59/0H/kP/kf84bE9P/Kf+M/+5/8J/6b/yX/tv/Lf+O/+9/8H/6H/yP/tf/K/+N/+7/yMAAQxQoAU40AMjIIEZ0MAK7IAFTsADEcjADbzAD4IgXBA+iBBEDCIFkYMoQdQgWhA9iBHEDGIFsYM4QdwgXhA/SBAkDBIFiYMkQdIgWZA8SBGkDFIFqYM0QdogXZA+yBBkDDIFmYMsQdafn60gW5A9yBHk/P2uUpAryB3kCfIG+YL8QYGgYFAoKBzqLRIU/SmiWFA8KBGUDEoFpX/VjGWCskG5oPzvl6OiKP/bBBWCikGloHJQJagaVAuqBzWCmkGtoHZQJ6gb1Avq/7fjGwQNg0bB/9j/CQdNgqZBs6B50CJUbxm0CloHbYK2QbugfdAh6Bh0CjoHXYKuQbege9Aj6Bn0CnoHfYK+Qb+gfzAgGBgMCgYHQ4KhwbBgeDAiGBmMCkYHY4KxwbhgfDAhmBhMCiYHU4KpwbRgejAjmBnMCmYHc4K5wbxgfrAgWBgsChYHS4KlwbJgebAiWBmsClYHa4K1wbpgfbAh2BhsCjYHW4KtwbZge7Aj2BnsCnYHe4K9wb5gf3AgOBgcCg4HR4KjwbHgeHAiOBmcCk4HZ4KzwbngfHAhuBhcCi4HV4KrwbXgenAjuBncCm4Hd4K7wb3gfvAgeBg8Ch4HT4KnwbPgefAieBm8Cl4Hb4K3wbvgfdjZ+fBHXx/l3y34GHwKPgdfgq9/av0/+/tE7Q==',\n  '_version_' => 6,\n);"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dejavu_sans_normal_ed376817aaa57868462795ac20ea25fb.ufm",
    "content": "StartFontMetrics 4.1\nNotice Converted by PHP-font-lib\nComment https://github.com/PhenX/php-font-lib\nEncodingScheme FontSpecific\nFontName DejaVu Sans\nFontSubfamily Book\nUniqueID DejaVu Sans\nFullName DejaVu Sans\nVersion Version 2.37\nPostScriptName DejaVuSans\nManufacturer DejaVu fonts team\nFontVendorURL http://dejavu.sourceforge.net\nLicenseURL http://dejavu.sourceforge.net/wiki/index.php/License\nPreferredFamily DejaVu Sans\nPreferredSubfamily Book\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nUnderlineThickness 44\nUnderlinePosition -63\nFontHeightOffset 0\nAscender 928\nDescender -236\nFontBBox -1021 -463 1793 1232\nStartCharMetrics 6253\nU 32 ; WX 318 ; N space ; G 3\nU 33 ; WX 401 ; N exclam ; G 4\nU 34 ; WX 460 ; N quotedbl ; G 5\nU 35 ; WX 838 ; N numbersign ; G 6\nU 36 ; WX 636 ; N dollar ; G 7\nU 37 ; WX 950 ; N percent ; G 8\nU 38 ; WX 780 ; N ampersand ; G 9\nU 39 ; WX 275 ; N quotesingle ; G 10\nU 40 ; WX 390 ; N parenleft ; G 11\nU 41 ; WX 390 ; N parenright ; G 12\nU 42 ; WX 500 ; N asterisk ; G 13\nU 43 ; WX 838 ; N plus ; G 14\nU 44 ; WX 318 ; N comma ; G 15\nU 45 ; WX 361 ; N hyphen ; G 16\nU 46 ; WX 318 ; N period ; G 17\nU 47 ; WX 337 ; N slash ; G 18\nU 48 ; WX 636 ; N zero ; G 19\nU 49 ; WX 636 ; N one ; G 20\nU 50 ; WX 636 ; N two ; G 21\nU 51 ; WX 636 ; N three ; G 22\nU 52 ; WX 636 ; N four ; G 23\nU 53 ; WX 636 ; N five ; G 24\nU 54 ; WX 636 ; N six ; G 25\nU 55 ; WX 636 ; N seven ; G 26\nU 56 ; WX 636 ; N eight ; G 27\nU 57 ; WX 636 ; N nine ; G 28\nU 58 ; WX 337 ; N colon ; G 29\nU 59 ; WX 337 ; N semicolon ; G 30\nU 60 ; WX 838 ; N less ; G 31\nU 61 ; WX 838 ; N equal ; G 32\nU 62 ; WX 838 ; N greater ; G 33\nU 63 ; WX 531 ; N question ; G 34\nU 64 ; WX 1000 ; N at ; G 35\nU 65 ; WX 684 ; N A ; G 36\nU 66 ; WX 686 ; N B ; G 37\nU 67 ; WX 698 ; N C ; G 38\nU 68 ; WX 770 ; N D ; G 39\nU 69 ; WX 632 ; N E ; G 40\nU 70 ; WX 575 ; N F ; G 41\nU 71 ; WX 775 ; N G ; G 42\nU 72 ; WX 752 ; N H ; G 43\nU 73 ; WX 295 ; N I ; G 44\nU 74 ; WX 295 ; N J ; G 45\nU 75 ; WX 656 ; N K ; G 46\nU 76 ; WX 557 ; N L ; G 47\nU 77 ; WX 863 ; N M ; G 48\nU 78 ; WX 748 ; N N ; G 49\nU 79 ; WX 787 ; N O ; G 50\nU 80 ; WX 603 ; N P ; G 51\nU 81 ; WX 787 ; N Q ; G 52\nU 82 ; WX 695 ; N R ; G 53\nU 83 ; WX 635 ; N S ; G 54\nU 84 ; WX 611 ; N T ; G 55\nU 85 ; WX 732 ; N U ; G 56\nU 86 ; WX 684 ; N V ; G 57\nU 87 ; WX 989 ; N W ; G 58\nU 88 ; WX 685 ; N X ; G 59\nU 89 ; WX 611 ; N Y ; G 60\nU 90 ; WX 685 ; N Z ; G 61\nU 91 ; WX 390 ; N bracketleft ; G 62\nU 92 ; WX 337 ; N backslash ; G 63\nU 93 ; WX 390 ; N bracketright ; G 64\nU 94 ; WX 838 ; N asciicircum ; G 65\nU 95 ; WX 500 ; N underscore ; G 66\nU 96 ; WX 500 ; N grave ; G 67\nU 97 ; WX 613 ; N a ; G 68\nU 98 ; WX 635 ; N b ; G 69\nU 99 ; WX 550 ; N c ; G 70\nU 100 ; WX 635 ; N d ; G 71\nU 101 ; WX 615 ; N e ; G 72\nU 102 ; WX 352 ; N f ; G 73\nU 103 ; WX 635 ; N g ; G 74\nU 104 ; WX 634 ; N h ; G 75\nU 105 ; WX 278 ; N i ; G 76\nU 106 ; WX 278 ; N j ; G 77\nU 107 ; WX 579 ; N k ; G 78\nU 108 ; WX 278 ; N l ; G 79\nU 109 ; WX 974 ; N m ; G 80\nU 110 ; WX 634 ; N n ; G 81\nU 111 ; WX 612 ; N o ; G 82\nU 112 ; WX 635 ; N p ; G 83\nU 113 ; WX 635 ; N q ; G 84\nU 114 ; WX 411 ; N r ; G 85\nU 115 ; WX 521 ; N s ; G 86\nU 116 ; WX 392 ; N t ; G 87\nU 117 ; WX 634 ; N u ; G 88\nU 118 ; WX 592 ; N v ; G 89\nU 119 ; WX 818 ; N w ; G 90\nU 120 ; WX 592 ; N x ; G 91\nU 121 ; WX 592 ; N y ; G 92\nU 122 ; WX 525 ; N z ; G 93\nU 123 ; WX 636 ; N braceleft ; G 94\nU 124 ; WX 337 ; N bar ; G 95\nU 125 ; WX 636 ; N braceright ; G 96\nU 126 ; WX 838 ; N asciitilde ; G 97\nU 160 ; WX 318 ; N nbspace ; G 98\nU 161 ; WX 401 ; N exclamdown ; G 99\nU 162 ; WX 636 ; N cent ; G 100\nU 163 ; WX 636 ; N sterling ; G 101\nU 164 ; WX 636 ; N currency ; G 102\nU 165 ; WX 636 ; N yen ; G 103\nU 166 ; WX 337 ; N brokenbar ; G 104\nU 167 ; WX 500 ; N section ; G 105\nU 168 ; WX 500 ; N dieresis ; G 106\nU 169 ; WX 1000 ; N copyright ; G 107\nU 170 ; WX 471 ; N ordfeminine ; G 108\nU 171 ; WX 612 ; N guillemotleft ; G 109\nU 172 ; WX 838 ; N logicalnot ; G 110\nU 173 ; WX 361 ; N sfthyphen ; G 111\nU 174 ; WX 1000 ; N registered ; G 112\nU 175 ; WX 500 ; N macron ; G 113\nU 176 ; WX 500 ; N degree ; G 114\nU 177 ; WX 838 ; N plusminus ; G 115\nU 178 ; WX 401 ; N twosuperior ; G 116\nU 179 ; WX 401 ; N threesuperior ; G 117\nU 180 ; WX 500 ; N acute ; G 118\nU 181 ; WX 636 ; N mu ; G 119\nU 182 ; WX 636 ; N paragraph ; G 120\nU 183 ; WX 318 ; N periodcentered ; G 121\nU 184 ; WX 500 ; N cedilla ; G 122\nU 185 ; WX 401 ; N onesuperior ; G 123\nU 186 ; WX 471 ; N ordmasculine ; G 124\nU 187 ; WX 612 ; N guillemotright ; G 125\nU 188 ; WX 969 ; N onequarter ; G 126\nU 189 ; WX 969 ; N onehalf ; G 127\nU 190 ; WX 969 ; N threequarters ; G 128\nU 191 ; WX 531 ; N questiondown ; G 129\nU 192 ; WX 684 ; N Agrave ; G 130\nU 193 ; WX 684 ; N Aacute ; G 131\nU 194 ; WX 684 ; N Acircumflex ; G 132\nU 195 ; WX 684 ; N Atilde ; G 133\nU 196 ; WX 684 ; N Adieresis ; G 134\nU 197 ; WX 684 ; N Aring ; G 135\nU 198 ; WX 974 ; N AE ; G 136\nU 199 ; WX 698 ; N Ccedilla ; G 137\nU 200 ; WX 632 ; N Egrave ; G 138\nU 201 ; WX 632 ; N Eacute ; G 139\nU 202 ; WX 632 ; N Ecircumflex ; G 140\nU 203 ; WX 632 ; N Edieresis ; G 141\nU 204 ; WX 295 ; N Igrave ; G 142\nU 205 ; WX 295 ; N Iacute ; G 143\nU 206 ; WX 295 ; N Icircumflex ; G 144\nU 207 ; WX 295 ; N Idieresis ; G 145\nU 208 ; WX 775 ; N Eth ; G 146\nU 209 ; WX 748 ; N Ntilde ; G 147\nU 210 ; WX 787 ; N Ograve ; G 148\nU 211 ; WX 787 ; N Oacute ; G 149\nU 212 ; WX 787 ; N Ocircumflex ; G 150\nU 213 ; WX 787 ; N Otilde ; G 151\nU 214 ; WX 787 ; N Odieresis ; G 152\nU 215 ; WX 838 ; N multiply ; G 153\nU 216 ; WX 787 ; N Oslash ; G 154\nU 217 ; WX 732 ; N Ugrave ; G 155\nU 218 ; WX 732 ; N Uacute ; G 156\nU 219 ; WX 732 ; N Ucircumflex ; G 157\nU 220 ; WX 732 ; N Udieresis ; G 158\nU 221 ; WX 611 ; N Yacute ; G 159\nU 222 ; WX 605 ; N Thorn ; G 160\nU 223 ; WX 630 ; N germandbls ; G 161\nU 224 ; WX 613 ; N agrave ; G 162\nU 225 ; WX 613 ; N aacute ; G 163\nU 226 ; WX 613 ; N acircumflex ; G 164\nU 227 ; WX 613 ; N atilde ; G 165\nU 228 ; WX 613 ; N adieresis ; G 166\nU 229 ; WX 613 ; N aring ; G 167\nU 230 ; WX 982 ; N ae ; G 168\nU 231 ; WX 550 ; N ccedilla ; G 169\nU 232 ; WX 615 ; N egrave ; G 170\nU 233 ; WX 615 ; N eacute ; G 171\nU 234 ; WX 615 ; N ecircumflex ; G 172\nU 235 ; WX 615 ; N edieresis ; G 173\nU 236 ; WX 278 ; N igrave ; G 174\nU 237 ; WX 278 ; N iacute ; G 175\nU 238 ; WX 278 ; N icircumflex ; G 176\nU 239 ; WX 278 ; N idieresis ; G 177\nU 240 ; WX 612 ; N eth ; G 178\nU 241 ; WX 634 ; N ntilde ; G 179\nU 242 ; WX 612 ; N ograve ; G 180\nU 243 ; WX 612 ; N oacute ; G 181\nU 244 ; WX 612 ; N ocircumflex ; G 182\nU 245 ; WX 612 ; N otilde ; G 183\nU 246 ; WX 612 ; N odieresis ; G 184\nU 247 ; WX 838 ; N divide ; G 185\nU 248 ; WX 612 ; N oslash ; G 186\nU 249 ; WX 634 ; N ugrave ; G 187\nU 250 ; WX 634 ; N uacute ; G 188\nU 251 ; WX 634 ; N ucircumflex ; G 189\nU 252 ; WX 634 ; N udieresis ; G 190\nU 253 ; WX 592 ; N yacute ; G 191\nU 254 ; WX 635 ; N thorn ; G 192\nU 255 ; WX 592 ; N ydieresis ; G 193\nU 256 ; WX 684 ; N Amacron ; G 194\nU 257 ; WX 613 ; N amacron ; G 195\nU 258 ; WX 684 ; N Abreve ; G 196\nU 259 ; WX 613 ; N abreve ; G 197\nU 260 ; WX 684 ; N Aogonek ; G 198\nU 261 ; WX 613 ; N aogonek ; G 199\nU 262 ; WX 698 ; N Cacute ; G 200\nU 263 ; WX 550 ; N cacute ; G 201\nU 264 ; WX 698 ; N Ccircumflex ; G 202\nU 265 ; WX 550 ; N ccircumflex ; G 203\nU 266 ; WX 698 ; N Cdotaccent ; G 204\nU 267 ; WX 550 ; N cdotaccent ; G 205\nU 268 ; WX 698 ; N Ccaron ; G 206\nU 269 ; WX 550 ; N ccaron ; G 207\nU 270 ; WX 770 ; N Dcaron ; G 208\nU 271 ; WX 635 ; N dcaron ; G 209\nU 272 ; WX 775 ; N Dcroat ; G 210\nU 273 ; WX 635 ; N dmacron ; G 211\nU 274 ; WX 632 ; N Emacron ; G 212\nU 275 ; WX 615 ; N emacron ; G 213\nU 276 ; WX 632 ; N Ebreve ; G 214\nU 277 ; WX 615 ; N ebreve ; G 215\nU 278 ; WX 632 ; N Edotaccent ; G 216\nU 279 ; WX 615 ; N edotaccent ; G 217\nU 280 ; WX 632 ; N Eogonek ; G 218\nU 281 ; WX 615 ; N eogonek ; G 219\nU 282 ; WX 632 ; N Ecaron ; G 220\nU 283 ; WX 615 ; N ecaron ; G 221\nU 284 ; WX 775 ; N Gcircumflex ; G 222\nU 285 ; WX 635 ; N gcircumflex ; G 223\nU 286 ; WX 775 ; N Gbreve ; G 224\nU 287 ; WX 635 ; N gbreve ; G 225\nU 288 ; WX 775 ; N Gdotaccent ; G 226\nU 289 ; WX 635 ; N gdotaccent ; G 227\nU 290 ; WX 775 ; N Gcommaaccent ; G 228\nU 291 ; WX 635 ; N gcommaaccent ; G 229\nU 292 ; WX 752 ; N Hcircumflex ; G 230\nU 293 ; WX 634 ; N hcircumflex ; G 231\nU 294 ; WX 916 ; N Hbar ; G 232\nU 295 ; WX 695 ; N hbar ; G 233\nU 296 ; WX 295 ; N Itilde ; G 234\nU 297 ; WX 278 ; N itilde ; G 235\nU 298 ; WX 295 ; N Imacron ; G 236\nU 299 ; WX 278 ; N imacron ; G 237\nU 300 ; WX 295 ; N Ibreve ; G 238\nU 301 ; WX 278 ; N ibreve ; G 239\nU 302 ; WX 295 ; N Iogonek ; G 240\nU 303 ; WX 278 ; N iogonek ; G 241\nU 304 ; WX 295 ; N Idot ; G 242\nU 305 ; WX 278 ; N dotlessi ; G 243\nU 306 ; WX 590 ; N IJ ; G 244\nU 307 ; WX 556 ; N ij ; G 245\nU 308 ; WX 295 ; N Jcircumflex ; G 246\nU 309 ; WX 278 ; N jcircumflex ; G 247\nU 310 ; WX 656 ; N Kcommaaccent ; G 248\nU 311 ; WX 579 ; N kcommaaccent ; G 249\nU 312 ; WX 579 ; N kgreenlandic ; G 250\nU 313 ; WX 557 ; N Lacute ; G 251\nU 314 ; WX 278 ; N lacute ; G 252\nU 315 ; WX 557 ; N Lcommaaccent ; G 253\nU 316 ; WX 278 ; N lcommaaccent ; G 254\nU 317 ; WX 557 ; N Lcaron ; G 255\nU 318 ; WX 375 ; N lcaron ; G 256\nU 319 ; WX 557 ; N Ldot ; G 257\nU 320 ; WX 342 ; N ldot ; G 258\nU 321 ; WX 562 ; N Lslash ; G 259\nU 322 ; WX 284 ; N lslash ; G 260\nU 323 ; WX 748 ; N Nacute ; G 261\nU 324 ; WX 634 ; N nacute ; G 262\nU 325 ; WX 748 ; N Ncommaaccent ; G 263\nU 326 ; WX 634 ; N ncommaaccent ; G 264\nU 327 ; WX 748 ; N Ncaron ; G 265\nU 328 ; WX 634 ; N ncaron ; G 266\nU 329 ; WX 813 ; N napostrophe ; G 267\nU 330 ; WX 748 ; N Eng ; G 268\nU 331 ; WX 634 ; N eng ; G 269\nU 332 ; WX 787 ; N Omacron ; G 270\nU 333 ; WX 612 ; N omacron ; G 271\nU 334 ; WX 787 ; N Obreve ; G 272\nU 335 ; WX 612 ; N obreve ; G 273\nU 336 ; WX 787 ; N Ohungarumlaut ; G 274\nU 337 ; WX 612 ; N ohungarumlaut ; G 275\nU 338 ; WX 1070 ; N OE ; G 276\nU 339 ; WX 1023 ; N oe ; G 277\nU 340 ; WX 695 ; N Racute ; G 278\nU 341 ; WX 411 ; N racute ; G 279\nU 342 ; WX 695 ; N Rcommaaccent ; G 280\nU 343 ; WX 411 ; N rcommaaccent ; G 281\nU 344 ; WX 695 ; N Rcaron ; G 282\nU 345 ; WX 411 ; N rcaron ; G 283\nU 346 ; WX 635 ; N Sacute ; G 284\nU 347 ; WX 521 ; N sacute ; G 285\nU 348 ; WX 635 ; N Scircumflex ; G 286\nU 349 ; WX 521 ; N scircumflex ; G 287\nU 350 ; WX 635 ; N Scedilla ; G 288\nU 351 ; WX 521 ; N scedilla ; G 289\nU 352 ; WX 635 ; N Scaron ; G 290\nU 353 ; WX 521 ; N scaron ; G 291\nU 354 ; WX 611 ; N Tcommaaccent ; G 292\nU 355 ; WX 392 ; N tcommaaccent ; G 293\nU 356 ; WX 611 ; N Tcaron ; G 294\nU 357 ; WX 392 ; N tcaron ; G 295\nU 358 ; WX 611 ; N Tbar ; G 296\nU 359 ; WX 392 ; N tbar ; G 297\nU 360 ; WX 732 ; N Utilde ; G 298\nU 361 ; WX 634 ; N utilde ; G 299\nU 362 ; WX 732 ; N Umacron ; G 300\nU 363 ; WX 634 ; N umacron ; G 301\nU 364 ; WX 732 ; N Ubreve ; G 302\nU 365 ; WX 634 ; N ubreve ; G 303\nU 366 ; WX 732 ; N Uring ; G 304\nU 367 ; WX 634 ; N uring ; G 305\nU 368 ; WX 732 ; N Uhungarumlaut ; G 306\nU 369 ; WX 634 ; N uhungarumlaut ; G 307\nU 370 ; WX 732 ; N Uogonek ; G 308\nU 371 ; WX 634 ; N uogonek ; G 309\nU 372 ; WX 989 ; N Wcircumflex ; G 310\nU 373 ; WX 818 ; N wcircumflex ; G 311\nU 374 ; WX 611 ; N Ycircumflex ; G 312\nU 375 ; WX 592 ; N ycircumflex ; G 313\nU 376 ; WX 611 ; N Ydieresis ; G 314\nU 377 ; WX 685 ; N Zacute ; G 315\nU 378 ; WX 525 ; N zacute ; G 316\nU 379 ; WX 685 ; N Zdotaccent ; G 317\nU 380 ; WX 525 ; N zdotaccent ; G 318\nU 381 ; WX 685 ; N Zcaron ; G 319\nU 382 ; WX 525 ; N zcaron ; G 320\nU 383 ; WX 352 ; N longs ; G 321\nU 384 ; WX 635 ; N uni0180 ; G 322\nU 385 ; WX 735 ; N uni0181 ; G 323\nU 386 ; WX 686 ; N uni0182 ; G 324\nU 387 ; WX 635 ; N uni0183 ; G 325\nU 388 ; WX 686 ; N uni0184 ; G 326\nU 389 ; WX 635 ; N uni0185 ; G 327\nU 390 ; WX 703 ; N uni0186 ; G 328\nU 391 ; WX 698 ; N uni0187 ; G 329\nU 392 ; WX 550 ; N uni0188 ; G 330\nU 393 ; WX 775 ; N uni0189 ; G 331\nU 394 ; WX 819 ; N uni018A ; G 332\nU 395 ; WX 686 ; N uni018B ; G 333\nU 396 ; WX 635 ; N uni018C ; G 334\nU 397 ; WX 612 ; N uni018D ; G 335\nU 398 ; WX 632 ; N uni018E ; G 336\nU 399 ; WX 787 ; N uni018F ; G 337\nU 400 ; WX 614 ; N uni0190 ; G 338\nU 401 ; WX 575 ; N uni0191 ; G 339\nU 402 ; WX 352 ; N florin ; G 340\nU 403 ; WX 775 ; N uni0193 ; G 341\nU 404 ; WX 687 ; N uni0194 ; G 342\nU 405 ; WX 984 ; N uni0195 ; G 343\nU 406 ; WX 354 ; N uni0196 ; G 344\nU 407 ; WX 295 ; N uni0197 ; G 345\nU 408 ; WX 746 ; N uni0198 ; G 346\nU 409 ; WX 579 ; N uni0199 ; G 347\nU 410 ; WX 278 ; N uni019A ; G 348\nU 411 ; WX 592 ; N uni019B ; G 349\nU 412 ; WX 974 ; N uni019C ; G 350\nU 413 ; WX 748 ; N uni019D ; G 351\nU 414 ; WX 634 ; N uni019E ; G 352\nU 415 ; WX 787 ; N uni019F ; G 353\nU 416 ; WX 913 ; N Ohorn ; G 354\nU 417 ; WX 612 ; N ohorn ; G 355\nU 418 ; WX 949 ; N uni01A2 ; G 356\nU 419 ; WX 759 ; N uni01A3 ; G 357\nU 420 ; WX 652 ; N uni01A4 ; G 358\nU 421 ; WX 635 ; N uni01A5 ; G 359\nU 422 ; WX 695 ; N uni01A6 ; G 360\nU 423 ; WX 635 ; N uni01A7 ; G 361\nU 424 ; WX 521 ; N uni01A8 ; G 362\nU 425 ; WX 632 ; N uni01A9 ; G 363\nU 426 ; WX 336 ; N uni01AA ; G 364\nU 427 ; WX 392 ; N uni01AB ; G 365\nU 428 ; WX 611 ; N uni01AC ; G 366\nU 429 ; WX 392 ; N uni01AD ; G 367\nU 430 ; WX 611 ; N uni01AE ; G 368\nU 431 ; WX 858 ; N Uhorn ; G 369\nU 432 ; WX 634 ; N uhorn ; G 370\nU 433 ; WX 764 ; N uni01B1 ; G 371\nU 434 ; WX 721 ; N uni01B2 ; G 372\nU 435 ; WX 744 ; N uni01B3 ; G 373\nU 436 ; WX 730 ; N uni01B4 ; G 374\nU 437 ; WX 685 ; N uni01B5 ; G 375\nU 438 ; WX 525 ; N uni01B6 ; G 376\nU 439 ; WX 666 ; N uni01B7 ; G 377\nU 440 ; WX 666 ; N uni01B8 ; G 378\nU 441 ; WX 578 ; N uni01B9 ; G 379\nU 442 ; WX 525 ; N uni01BA ; G 380\nU 443 ; WX 636 ; N uni01BB ; G 381\nU 444 ; WX 666 ; N uni01BC ; G 382\nU 445 ; WX 578 ; N uni01BD ; G 383\nU 446 ; WX 510 ; N uni01BE ; G 384\nU 447 ; WX 635 ; N uni01BF ; G 385\nU 448 ; WX 295 ; N uni01C0 ; G 386\nU 449 ; WX 492 ; N uni01C1 ; G 387\nU 450 ; WX 459 ; N uni01C2 ; G 388\nU 451 ; WX 295 ; N uni01C3 ; G 389\nU 452 ; WX 1422 ; N uni01C4 ; G 390\nU 453 ; WX 1299 ; N uni01C5 ; G 391\nU 454 ; WX 1154 ; N uni01C6 ; G 392\nU 455 ; WX 835 ; N uni01C7 ; G 393\nU 456 ; WX 787 ; N uni01C8 ; G 394\nU 457 ; WX 457 ; N uni01C9 ; G 395\nU 458 ; WX 931 ; N uni01CA ; G 396\nU 459 ; WX 924 ; N uni01CB ; G 397\nU 460 ; WX 797 ; N uni01CC ; G 398\nU 461 ; WX 684 ; N uni01CD ; G 399\nU 462 ; WX 613 ; N uni01CE ; G 400\nU 463 ; WX 295 ; N uni01CF ; G 401\nU 464 ; WX 278 ; N uni01D0 ; G 402\nU 465 ; WX 787 ; N uni01D1 ; G 403\nU 466 ; WX 612 ; N uni01D2 ; G 404\nU 467 ; WX 732 ; N uni01D3 ; G 405\nU 468 ; WX 634 ; N uni01D4 ; G 406\nU 469 ; WX 732 ; N uni01D5 ; G 407\nU 470 ; WX 634 ; N uni01D6 ; G 408\nU 471 ; WX 732 ; N uni01D7 ; G 409\nU 472 ; WX 634 ; N uni01D8 ; G 410\nU 473 ; WX 732 ; N uni01D9 ; G 411\nU 474 ; WX 634 ; N uni01DA ; G 412\nU 475 ; WX 732 ; N uni01DB ; G 413\nU 476 ; WX 634 ; N uni01DC ; G 414\nU 477 ; WX 615 ; N uni01DD ; G 415\nU 478 ; WX 684 ; N uni01DE ; G 416\nU 479 ; WX 613 ; N uni01DF ; G 417\nU 480 ; WX 684 ; N uni01E0 ; G 418\nU 481 ; WX 613 ; N uni01E1 ; G 419\nU 482 ; WX 974 ; N uni01E2 ; G 420\nU 483 ; WX 982 ; N uni01E3 ; G 421\nU 484 ; WX 775 ; N uni01E4 ; G 422\nU 485 ; WX 635 ; N uni01E5 ; G 423\nU 486 ; WX 775 ; N Gcaron ; G 424\nU 487 ; WX 635 ; N gcaron ; G 425\nU 488 ; WX 656 ; N uni01E8 ; G 426\nU 489 ; WX 579 ; N uni01E9 ; G 427\nU 490 ; WX 787 ; N uni01EA ; G 428\nU 491 ; WX 612 ; N uni01EB ; G 429\nU 492 ; WX 787 ; N uni01EC ; G 430\nU 493 ; WX 612 ; N uni01ED ; G 431\nU 494 ; WX 666 ; N uni01EE ; G 432\nU 495 ; WX 578 ; N uni01EF ; G 433\nU 496 ; WX 278 ; N uni01F0 ; G 434\nU 497 ; WX 1422 ; N uni01F1 ; G 435\nU 498 ; WX 1299 ; N uni01F2 ; G 436\nU 499 ; WX 1154 ; N uni01F3 ; G 437\nU 500 ; WX 775 ; N uni01F4 ; G 438\nU 501 ; WX 635 ; N uni01F5 ; G 439\nU 502 ; WX 1113 ; N uni01F6 ; G 440\nU 503 ; WX 682 ; N uni01F7 ; G 441\nU 504 ; WX 748 ; N uni01F8 ; G 442\nU 505 ; WX 634 ; N uni01F9 ; G 443\nU 506 ; WX 684 ; N Aringacute ; G 444\nU 507 ; WX 613 ; N aringacute ; G 445\nU 508 ; WX 974 ; N AEacute ; G 446\nU 509 ; WX 982 ; N aeacute ; G 447\nU 510 ; WX 787 ; N Oslashacute ; G 448\nU 511 ; WX 612 ; N oslashacute ; G 449\nU 512 ; WX 684 ; N uni0200 ; G 450\nU 513 ; WX 613 ; N uni0201 ; G 451\nU 514 ; WX 684 ; N uni0202 ; G 452\nU 515 ; WX 613 ; N uni0203 ; G 453\nU 516 ; WX 632 ; N uni0204 ; G 454\nU 517 ; WX 615 ; N uni0205 ; G 455\nU 518 ; WX 632 ; N uni0206 ; G 456\nU 519 ; WX 615 ; N uni0207 ; G 457\nU 520 ; WX 295 ; N uni0208 ; G 458\nU 521 ; WX 278 ; N uni0209 ; G 459\nU 522 ; WX 295 ; N uni020A ; G 460\nU 523 ; WX 278 ; N uni020B ; G 461\nU 524 ; WX 787 ; N uni020C ; G 462\nU 525 ; WX 612 ; N uni020D ; G 463\nU 526 ; WX 787 ; N uni020E ; G 464\nU 527 ; WX 612 ; N uni020F ; G 465\nU 528 ; WX 695 ; N uni0210 ; G 466\nU 529 ; WX 411 ; N uni0211 ; G 467\nU 530 ; WX 695 ; N uni0212 ; G 468\nU 531 ; WX 411 ; N uni0213 ; G 469\nU 532 ; WX 732 ; N uni0214 ; G 470\nU 533 ; WX 634 ; N uni0215 ; G 471\nU 534 ; WX 732 ; N uni0216 ; G 472\nU 535 ; WX 634 ; N uni0217 ; G 473\nU 536 ; WX 635 ; N Scommaaccent ; G 474\nU 537 ; WX 521 ; N scommaaccent ; G 475\nU 538 ; WX 611 ; N uni021A ; G 476\nU 539 ; WX 392 ; N uni021B ; G 477\nU 540 ; WX 627 ; N uni021C ; G 478\nU 541 ; WX 521 ; N uni021D ; G 479\nU 542 ; WX 752 ; N uni021E ; G 480\nU 543 ; WX 634 ; N uni021F ; G 481\nU 544 ; WX 735 ; N uni0220 ; G 482\nU 545 ; WX 838 ; N uni0221 ; G 483\nU 546 ; WX 698 ; N uni0222 ; G 484\nU 547 ; WX 610 ; N uni0223 ; G 485\nU 548 ; WX 685 ; N uni0224 ; G 486\nU 549 ; WX 525 ; N uni0225 ; G 487\nU 550 ; WX 684 ; N uni0226 ; G 488\nU 551 ; WX 613 ; N uni0227 ; G 489\nU 552 ; WX 632 ; N uni0228 ; G 490\nU 553 ; WX 615 ; N uni0229 ; G 491\nU 554 ; WX 787 ; N uni022A ; G 492\nU 555 ; WX 612 ; N uni022B ; G 493\nU 556 ; WX 787 ; N uni022C ; G 494\nU 557 ; WX 612 ; N uni022D ; G 495\nU 558 ; WX 787 ; N uni022E ; G 496\nU 559 ; WX 612 ; N uni022F ; G 497\nU 560 ; WX 787 ; N uni0230 ; G 498\nU 561 ; WX 612 ; N uni0231 ; G 499\nU 562 ; WX 611 ; N uni0232 ; G 500\nU 563 ; WX 592 ; N uni0233 ; G 501\nU 564 ; WX 475 ; N uni0234 ; G 502\nU 565 ; WX 843 ; N uni0235 ; G 503\nU 566 ; WX 477 ; N uni0236 ; G 504\nU 567 ; WX 278 ; N dotlessj ; G 505\nU 568 ; WX 998 ; N uni0238 ; G 506\nU 569 ; WX 998 ; N uni0239 ; G 507\nU 570 ; WX 684 ; N uni023A ; G 508\nU 571 ; WX 698 ; N uni023B ; G 509\nU 572 ; WX 550 ; N uni023C ; G 510\nU 573 ; WX 557 ; N uni023D ; G 511\nU 574 ; WX 611 ; N uni023E ; G 512\nU 575 ; WX 521 ; N uni023F ; G 513\nU 576 ; WX 525 ; N uni0240 ; G 514\nU 577 ; WX 603 ; N uni0241 ; G 515\nU 578 ; WX 479 ; N uni0242 ; G 516\nU 579 ; WX 686 ; N uni0243 ; G 517\nU 580 ; WX 732 ; N uni0244 ; G 518\nU 581 ; WX 684 ; N uni0245 ; G 519\nU 582 ; WX 632 ; N uni0246 ; G 520\nU 583 ; WX 615 ; N uni0247 ; G 521\nU 584 ; WX 295 ; N uni0248 ; G 522\nU 585 ; WX 278 ; N uni0249 ; G 523\nU 586 ; WX 781 ; N uni024A ; G 524\nU 587 ; WX 635 ; N uni024B ; G 525\nU 588 ; WX 695 ; N uni024C ; G 526\nU 589 ; WX 411 ; N uni024D ; G 527\nU 590 ; WX 611 ; N uni024E ; G 528\nU 591 ; WX 592 ; N uni024F ; G 529\nU 592 ; WX 600 ; N uni0250 ; G 530\nU 593 ; WX 635 ; N uni0251 ; G 531\nU 594 ; WX 635 ; N uni0252 ; G 532\nU 595 ; WX 635 ; N uni0253 ; G 533\nU 596 ; WX 549 ; N uni0254 ; G 534\nU 597 ; WX 550 ; N uni0255 ; G 535\nU 598 ; WX 635 ; N uni0256 ; G 536\nU 599 ; WX 696 ; N uni0257 ; G 537\nU 600 ; WX 615 ; N uni0258 ; G 538\nU 601 ; WX 615 ; N uni0259 ; G 539\nU 602 ; WX 819 ; N uni025A ; G 540\nU 603 ; WX 541 ; N uni025B ; G 541\nU 604 ; WX 532 ; N uni025C ; G 542\nU 605 ; WX 775 ; N uni025D ; G 543\nU 606 ; WX 664 ; N uni025E ; G 544\nU 607 ; WX 278 ; N uni025F ; G 545\nU 608 ; WX 696 ; N uni0260 ; G 546\nU 609 ; WX 635 ; N uni0261 ; G 547\nU 610 ; WX 629 ; N uni0262 ; G 548\nU 611 ; WX 596 ; N uni0263 ; G 549\nU 612 ; WX 596 ; N uni0264 ; G 550\nU 613 ; WX 634 ; N uni0265 ; G 551\nU 614 ; WX 634 ; N uni0266 ; G 552\nU 615 ; WX 634 ; N uni0267 ; G 553\nU 616 ; WX 278 ; N uni0268 ; G 554\nU 617 ; WX 338 ; N uni0269 ; G 555\nU 618 ; WX 372 ; N uni026A ; G 556\nU 619 ; WX 396 ; N uni026B ; G 557\nU 620 ; WX 487 ; N uni026C ; G 558\nU 621 ; WX 278 ; N uni026D ; G 559\nU 622 ; WX 706 ; N uni026E ; G 560\nU 623 ; WX 974 ; N uni026F ; G 561\nU 624 ; WX 974 ; N uni0270 ; G 562\nU 625 ; WX 974 ; N uni0271 ; G 563\nU 626 ; WX 646 ; N uni0272 ; G 564\nU 627 ; WX 642 ; N uni0273 ; G 565\nU 628 ; WX 634 ; N uni0274 ; G 566\nU 629 ; WX 612 ; N uni0275 ; G 567\nU 630 ; WX 858 ; N uni0276 ; G 568\nU 631 ; WX 728 ; N uni0277 ; G 569\nU 632 ; WX 660 ; N uni0278 ; G 570\nU 633 ; WX 414 ; N uni0279 ; G 571\nU 634 ; WX 414 ; N uni027A ; G 572\nU 635 ; WX 414 ; N uni027B ; G 573\nU 636 ; WX 411 ; N uni027C ; G 574\nU 637 ; WX 411 ; N uni027D ; G 575\nU 638 ; WX 530 ; N uni027E ; G 576\nU 639 ; WX 530 ; N uni027F ; G 577\nU 640 ; WX 604 ; N uni0280 ; G 578\nU 641 ; WX 604 ; N uni0281 ; G 579\nU 642 ; WX 521 ; N uni0282 ; G 580\nU 643 ; WX 336 ; N uni0283 ; G 581\nU 644 ; WX 336 ; N uni0284 ; G 582\nU 645 ; WX 461 ; N uni0285 ; G 583\nU 646 ; WX 336 ; N uni0286 ; G 584\nU 647 ; WX 392 ; N uni0287 ; G 585\nU 648 ; WX 392 ; N uni0288 ; G 586\nU 649 ; WX 634 ; N uni0289 ; G 587\nU 650 ; WX 618 ; N uni028A ; G 588\nU 651 ; WX 598 ; N uni028B ; G 589\nU 652 ; WX 592 ; N uni028C ; G 590\nU 653 ; WX 818 ; N uni028D ; G 591\nU 654 ; WX 592 ; N uni028E ; G 592\nU 655 ; WX 611 ; N uni028F ; G 593\nU 656 ; WX 525 ; N uni0290 ; G 594\nU 657 ; WX 525 ; N uni0291 ; G 595\nU 658 ; WX 578 ; N uni0292 ; G 596\nU 659 ; WX 578 ; N uni0293 ; G 597\nU 660 ; WX 510 ; N uni0294 ; G 598\nU 661 ; WX 510 ; N uni0295 ; G 599\nU 662 ; WX 510 ; N uni0296 ; G 600\nU 663 ; WX 510 ; N uni0297 ; G 601\nU 664 ; WX 787 ; N uni0298 ; G 602\nU 665 ; WX 580 ; N uni0299 ; G 603\nU 666 ; WX 664 ; N uni029A ; G 604\nU 667 ; WX 708 ; N uni029B ; G 605\nU 668 ; WX 654 ; N uni029C ; G 606\nU 669 ; WX 292 ; N uni029D ; G 607\nU 670 ; WX 667 ; N uni029E ; G 608\nU 671 ; WX 507 ; N uni029F ; G 609\nU 672 ; WX 727 ; N uni02A0 ; G 610\nU 673 ; WX 510 ; N uni02A1 ; G 611\nU 674 ; WX 510 ; N uni02A2 ; G 612\nU 675 ; WX 1014 ; N uni02A3 ; G 613\nU 676 ; WX 1058 ; N uni02A4 ; G 614\nU 677 ; WX 1013 ; N uni02A5 ; G 615\nU 678 ; WX 830 ; N uni02A6 ; G 616\nU 679 ; WX 610 ; N uni02A7 ; G 617\nU 680 ; WX 778 ; N uni02A8 ; G 618\nU 681 ; WX 848 ; N uni02A9 ; G 619\nU 682 ; WX 706 ; N uni02AA ; G 620\nU 683 ; WX 654 ; N uni02AB ; G 621\nU 684 ; WX 515 ; N uni02AC ; G 622\nU 685 ; WX 515 ; N uni02AD ; G 623\nU 686 ; WX 661 ; N uni02AE ; G 624\nU 687 ; WX 664 ; N uni02AF ; G 625\nU 688 ; WX 404 ; N uni02B0 ; G 626\nU 689 ; WX 399 ; N uni02B1 ; G 627\nU 690 ; WX 175 ; N uni02B2 ; G 628\nU 691 ; WX 259 ; N uni02B3 ; G 629\nU 692 ; WX 295 ; N uni02B4 ; G 630\nU 693 ; WX 296 ; N uni02B5 ; G 631\nU 694 ; WX 379 ; N uni02B6 ; G 632\nU 695 ; WX 515 ; N uni02B7 ; G 633\nU 696 ; WX 373 ; N uni02B8 ; G 634\nU 697 ; WX 278 ; N uni02B9 ; G 635\nU 698 ; WX 460 ; N uni02BA ; G 636\nU 699 ; WX 318 ; N uni02BB ; G 637\nU 700 ; WX 318 ; N uni02BC ; G 638\nU 701 ; WX 318 ; N uni02BD ; G 639\nU 702 ; WX 307 ; N uni02BE ; G 640\nU 703 ; WX 307 ; N uni02BF ; G 641\nU 704 ; WX 370 ; N uni02C0 ; G 642\nU 705 ; WX 370 ; N uni02C1 ; G 643\nU 706 ; WX 500 ; N uni02C2 ; G 644\nU 707 ; WX 500 ; N uni02C3 ; G 645\nU 708 ; WX 500 ; N uni02C4 ; G 646\nU 709 ; WX 500 ; N uni02C5 ; G 647\nU 710 ; WX 500 ; N circumflex ; G 648\nU 711 ; WX 500 ; N caron ; G 649\nU 712 ; WX 275 ; N uni02C8 ; G 650\nU 713 ; WX 500 ; N uni02C9 ; G 651\nU 714 ; WX 500 ; N uni02CA ; G 652\nU 715 ; WX 500 ; N uni02CB ; G 653\nU 716 ; WX 275 ; N uni02CC ; G 654\nU 717 ; WX 500 ; N uni02CD ; G 655\nU 718 ; WX 500 ; N uni02CE ; G 656\nU 719 ; WX 500 ; N uni02CF ; G 657\nU 720 ; WX 337 ; N uni02D0 ; G 658\nU 721 ; WX 337 ; N uni02D1 ; G 659\nU 722 ; WX 307 ; N uni02D2 ; G 660\nU 723 ; WX 307 ; N uni02D3 ; G 661\nU 724 ; WX 500 ; N uni02D4 ; G 662\nU 725 ; WX 500 ; N uni02D5 ; G 663\nU 726 ; WX 390 ; N uni02D6 ; G 664\nU 727 ; WX 317 ; N uni02D7 ; G 665\nU 728 ; WX 500 ; N breve ; G 666\nU 729 ; WX 500 ; N dotaccent ; G 667\nU 730 ; WX 500 ; N ring ; G 668\nU 731 ; WX 500 ; N ogonek ; G 669\nU 732 ; WX 500 ; N tilde ; G 670\nU 733 ; WX 500 ; N hungarumlaut ; G 671\nU 734 ; WX 315 ; N uni02DE ; G 672\nU 735 ; WX 500 ; N uni02DF ; G 673\nU 736 ; WX 426 ; N uni02E0 ; G 674\nU 737 ; WX 166 ; N uni02E1 ; G 675\nU 738 ; WX 373 ; N uni02E2 ; G 676\nU 739 ; WX 444 ; N uni02E3 ; G 677\nU 740 ; WX 370 ; N uni02E4 ; G 678\nU 741 ; WX 493 ; N uni02E5 ; G 679\nU 742 ; WX 493 ; N uni02E6 ; G 680\nU 743 ; WX 493 ; N uni02E7 ; G 681\nU 744 ; WX 493 ; N uni02E8 ; G 682\nU 745 ; WX 493 ; N uni02E9 ; G 683\nU 748 ; WX 500 ; N uni02EC ; G 684\nU 749 ; WX 500 ; N uni02ED ; G 685\nU 750 ; WX 518 ; N uni02EE ; G 686\nU 755 ; WX 500 ; N uni02F3 ; G 687\nU 759 ; WX 500 ; N uni02F7 ; G 688\nU 768 ; WX 0 ; N gravecomb ; G 689\nU 769 ; WX 0 ; N acutecomb ; G 690\nU 770 ; WX 0 ; N uni0302 ; G 691\nU 771 ; WX 0 ; N tildecomb ; G 692\nU 772 ; WX 0 ; N uni0304 ; G 693\nU 773 ; WX 0 ; N uni0305 ; G 694\nU 774 ; WX 0 ; N uni0306 ; G 695\nU 775 ; WX 0 ; N uni0307 ; G 696\nU 776 ; WX 0 ; N uni0308 ; G 697\nU 777 ; WX 0 ; N hookabovecomb ; G 698\nU 778 ; WX 0 ; N uni030A ; G 699\nU 779 ; WX 0 ; N uni030B ; G 700\nU 780 ; WX 0 ; N uni030C ; G 701\nU 781 ; WX 0 ; N uni030D ; G 702\nU 782 ; WX 0 ; N uni030E ; G 703\nU 783 ; WX 0 ; N uni030F ; G 704\nU 784 ; WX 0 ; N uni0310 ; G 705\nU 785 ; WX 0 ; N uni0311 ; G 706\nU 786 ; WX 0 ; N uni0312 ; G 707\nU 787 ; WX 0 ; N uni0313 ; G 708\nU 788 ; WX 0 ; N uni0314 ; G 709\nU 789 ; WX 0 ; N uni0315 ; G 710\nU 790 ; WX 0 ; N uni0316 ; G 711\nU 791 ; WX 0 ; N uni0317 ; G 712\nU 792 ; WX 0 ; N uni0318 ; G 713\nU 793 ; WX 0 ; N uni0319 ; G 714\nU 794 ; WX 0 ; N uni031A ; G 715\nU 795 ; WX 0 ; N uni031B ; G 716\nU 796 ; WX 0 ; N uni031C ; G 717\nU 797 ; WX 0 ; N uni031D ; G 718\nU 798 ; WX 0 ; N uni031E ; G 719\nU 799 ; WX 0 ; N uni031F ; G 720\nU 800 ; WX 0 ; N uni0320 ; G 721\nU 801 ; WX 0 ; N uni0321 ; G 722\nU 802 ; WX 0 ; N uni0322 ; G 723\nU 803 ; WX 0 ; N dotbelowcomb ; G 724\nU 804 ; WX 0 ; N uni0324 ; G 725\nU 805 ; WX 0 ; N uni0325 ; G 726\nU 806 ; WX 0 ; N uni0326 ; G 727\nU 807 ; WX 0 ; N uni0327 ; G 728\nU 808 ; WX 0 ; N uni0328 ; G 729\nU 809 ; WX 0 ; N uni0329 ; G 730\nU 810 ; WX 0 ; N uni032A ; G 731\nU 811 ; WX 0 ; N uni032B ; G 732\nU 812 ; WX 0 ; N uni032C ; G 733\nU 813 ; WX 0 ; N uni032D ; G 734\nU 814 ; WX 0 ; N uni032E ; G 735\nU 815 ; WX 0 ; N uni032F ; G 736\nU 816 ; WX 0 ; N uni0330 ; G 737\nU 817 ; WX 0 ; N uni0331 ; G 738\nU 818 ; WX 0 ; N uni0332 ; G 739\nU 819 ; WX 0 ; N uni0333 ; G 740\nU 820 ; WX 0 ; N uni0334 ; G 741\nU 821 ; WX 0 ; N uni0335 ; G 742\nU 822 ; WX 0 ; N uni0336 ; G 743\nU 823 ; WX 0 ; N uni0337 ; G 744\nU 824 ; WX 0 ; N uni0338 ; G 745\nU 825 ; WX 0 ; N uni0339 ; G 746\nU 826 ; WX 0 ; N uni033A ; G 747\nU 827 ; WX 0 ; N uni033B ; G 748\nU 828 ; WX 0 ; N uni033C ; G 749\nU 829 ; WX 0 ; N uni033D ; G 750\nU 830 ; WX 0 ; N uni033E ; G 751\nU 831 ; WX 0 ; N uni033F ; G 752\nU 832 ; WX 0 ; N uni0340 ; G 753\nU 833 ; WX 0 ; N uni0341 ; G 754\nU 834 ; WX 0 ; N uni0342 ; G 755\nU 835 ; WX 0 ; N uni0343 ; G 756\nU 836 ; WX 0 ; N uni0344 ; G 757\nU 837 ; WX 0 ; N uni0345 ; G 758\nU 838 ; WX 0 ; N uni0346 ; G 759\nU 839 ; WX 0 ; N uni0347 ; G 760\nU 840 ; WX 0 ; N uni0348 ; G 761\nU 841 ; WX 0 ; N uni0349 ; G 762\nU 842 ; WX 0 ; N uni034A ; G 763\nU 843 ; WX 0 ; N uni034B ; G 764\nU 844 ; WX 0 ; N uni034C ; G 765\nU 845 ; WX 0 ; N uni034D ; G 766\nU 846 ; WX 0 ; N uni034E ; G 767\nU 847 ; WX 0 ; N uni034F ; G 768\nU 849 ; WX 0 ; N uni0351 ; G 769\nU 850 ; WX 0 ; N uni0352 ; G 770\nU 851 ; WX 0 ; N uni0353 ; G 771\nU 855 ; WX 0 ; N uni0357 ; G 772\nU 856 ; WX 0 ; N uni0358 ; G 773\nU 858 ; WX 0 ; N uni035A ; G 774\nU 860 ; WX 0 ; N uni035C ; G 775\nU 861 ; WX 0 ; N uni035D ; G 776\nU 862 ; WX 0 ; N uni035E ; G 777\nU 863 ; WX 0 ; N uni035F ; G 778\nU 864 ; WX 0 ; N uni0360 ; G 779\nU 865 ; WX 0 ; N uni0361 ; G 780\nU 866 ; WX 0 ; N uni0362 ; G 781\nU 880 ; WX 654 ; N uni0370 ; G 782\nU 881 ; WX 568 ; N uni0371 ; G 783\nU 882 ; WX 862 ; N uni0372 ; G 784\nU 883 ; WX 647 ; N uni0373 ; G 785\nU 884 ; WX 278 ; N uni0374 ; G 786\nU 885 ; WX 278 ; N uni0375 ; G 787\nU 886 ; WX 748 ; N uni0376 ; G 788\nU 887 ; WX 650 ; N uni0377 ; G 789\nU 890 ; WX 500 ; N uni037A ; G 790\nU 891 ; WX 549 ; N uni037B ; G 791\nU 892 ; WX 550 ; N uni037C ; G 792\nU 893 ; WX 549 ; N uni037D ; G 793\nU 894 ; WX 337 ; N uni037E ; G 794\nU 895 ; WX 295 ; N uni037F ; G 795\nU 900 ; WX 500 ; N tonos ; G 796\nU 901 ; WX 500 ; N dieresistonos ; G 797\nU 902 ; WX 692 ; N Alphatonos ; G 798\nU 903 ; WX 318 ; N anoteleia ; G 799\nU 904 ; WX 746 ; N Epsilontonos ; G 800\nU 905 ; WX 871 ; N Etatonos ; G 801\nU 906 ; WX 408 ; N Iotatonos ; G 802\nU 908 ; WX 813 ; N Omicrontonos ; G 803\nU 910 ; WX 825 ; N Upsilontonos ; G 804\nU 911 ; WX 826 ; N Omegatonos ; G 805\nU 912 ; WX 338 ; N iotadieresistonos ; G 806\nU 913 ; WX 684 ; N Alpha ; G 807\nU 914 ; WX 686 ; N Beta ; G 808\nU 915 ; WX 557 ; N Gamma ; G 809\nU 916 ; WX 684 ; N uni0394 ; G 810\nU 917 ; WX 632 ; N Epsilon ; G 811\nU 918 ; WX 685 ; N Zeta ; G 812\nU 919 ; WX 752 ; N Eta ; G 813\nU 920 ; WX 787 ; N Theta ; G 814\nU 921 ; WX 295 ; N Iota ; G 815\nU 922 ; WX 656 ; N Kappa ; G 816\nU 923 ; WX 684 ; N Lambda ; G 817\nU 924 ; WX 863 ; N Mu ; G 818\nU 925 ; WX 748 ; N Nu ; G 819\nU 926 ; WX 632 ; N Xi ; G 820\nU 927 ; WX 787 ; N Omicron ; G 821\nU 928 ; WX 752 ; N Pi ; G 822\nU 929 ; WX 603 ; N Rho ; G 823\nU 931 ; WX 632 ; N Sigma ; G 824\nU 932 ; WX 611 ; N Tau ; G 825\nU 933 ; WX 611 ; N Upsilon ; G 826\nU 934 ; WX 787 ; N Phi ; G 827\nU 935 ; WX 685 ; N Chi ; G 828\nU 936 ; WX 787 ; N Psi ; G 829\nU 937 ; WX 764 ; N Omega ; G 830\nU 938 ; WX 295 ; N Iotadieresis ; G 831\nU 939 ; WX 611 ; N Upsilondieresis ; G 832\nU 940 ; WX 659 ; N alphatonos ; G 833\nU 941 ; WX 541 ; N epsilontonos ; G 834\nU 942 ; WX 634 ; N etatonos ; G 835\nU 943 ; WX 338 ; N iotatonos ; G 836\nU 944 ; WX 579 ; N upsilondieresistonos ; G 837\nU 945 ; WX 659 ; N alpha ; G 838\nU 946 ; WX 638 ; N beta ; G 839\nU 947 ; WX 592 ; N gamma ; G 840\nU 948 ; WX 612 ; N delta ; G 841\nU 949 ; WX 541 ; N epsilon ; G 842\nU 950 ; WX 544 ; N zeta ; G 843\nU 951 ; WX 634 ; N eta ; G 844\nU 952 ; WX 612 ; N theta ; G 845\nU 953 ; WX 338 ; N iota ; G 846\nU 954 ; WX 589 ; N kappa ; G 847\nU 955 ; WX 592 ; N lambda ; G 848\nU 956 ; WX 636 ; N uni03BC ; G 849\nU 957 ; WX 559 ; N nu ; G 850\nU 958 ; WX 558 ; N xi ; G 851\nU 959 ; WX 612 ; N omicron ; G 852\nU 960 ; WX 602 ; N pi ; G 853\nU 961 ; WX 635 ; N rho ; G 854\nU 962 ; WX 587 ; N sigma1 ; G 855\nU 963 ; WX 634 ; N sigma ; G 856\nU 964 ; WX 602 ; N tau ; G 857\nU 965 ; WX 579 ; N upsilon ; G 858\nU 966 ; WX 660 ; N phi ; G 859\nU 967 ; WX 578 ; N chi ; G 860\nU 968 ; WX 660 ; N psi ; G 861\nU 969 ; WX 837 ; N omega ; G 862\nU 970 ; WX 338 ; N iotadieresis ; G 863\nU 971 ; WX 579 ; N upsilondieresis ; G 864\nU 972 ; WX 612 ; N omicrontonos ; G 865\nU 973 ; WX 579 ; N upsilontonos ; G 866\nU 974 ; WX 837 ; N omegatonos ; G 867\nU 975 ; WX 656 ; N uni03CF ; G 868\nU 976 ; WX 614 ; N uni03D0 ; G 869\nU 977 ; WX 619 ; N theta1 ; G 870\nU 978 ; WX 699 ; N Upsilon1 ; G 871\nU 979 ; WX 842 ; N uni03D3 ; G 872\nU 980 ; WX 699 ; N uni03D4 ; G 873\nU 981 ; WX 660 ; N phi1 ; G 874\nU 982 ; WX 837 ; N omega1 ; G 875\nU 983 ; WX 664 ; N uni03D7 ; G 876\nU 984 ; WX 787 ; N uni03D8 ; G 877\nU 985 ; WX 612 ; N uni03D9 ; G 878\nU 986 ; WX 648 ; N uni03DA ; G 879\nU 987 ; WX 587 ; N uni03DB ; G 880\nU 988 ; WX 575 ; N uni03DC ; G 881\nU 989 ; WX 458 ; N uni03DD ; G 882\nU 990 ; WX 660 ; N uni03DE ; G 883\nU 991 ; WX 660 ; N uni03DF ; G 884\nU 992 ; WX 865 ; N uni03E0 ; G 885\nU 993 ; WX 627 ; N uni03E1 ; G 886\nU 994 ; WX 934 ; N uni03E2 ; G 887\nU 995 ; WX 837 ; N uni03E3 ; G 888\nU 996 ; WX 758 ; N uni03E4 ; G 889\nU 997 ; WX 659 ; N uni03E5 ; G 890\nU 998 ; WX 792 ; N uni03E6 ; G 891\nU 999 ; WX 615 ; N uni03E7 ; G 892\nU 1000 ; WX 687 ; N uni03E8 ; G 893\nU 1001 ; WX 607 ; N uni03E9 ; G 894\nU 1002 ; WX 768 ; N uni03EA ; G 895\nU 1003 ; WX 625 ; N uni03EB ; G 896\nU 1004 ; WX 699 ; N uni03EC ; G 897\nU 1005 ; WX 612 ; N uni03ED ; G 898\nU 1006 ; WX 611 ; N uni03EE ; G 899\nU 1007 ; WX 536 ; N uni03EF ; G 900\nU 1008 ; WX 664 ; N uni03F0 ; G 901\nU 1009 ; WX 635 ; N uni03F1 ; G 902\nU 1010 ; WX 550 ; N uni03F2 ; G 903\nU 1011 ; WX 278 ; N uni03F3 ; G 904\nU 1012 ; WX 787 ; N uni03F4 ; G 905\nU 1013 ; WX 615 ; N uni03F5 ; G 906\nU 1014 ; WX 615 ; N uni03F6 ; G 907\nU 1015 ; WX 605 ; N uni03F7 ; G 908\nU 1016 ; WX 635 ; N uni03F8 ; G 909\nU 1017 ; WX 698 ; N uni03F9 ; G 910\nU 1018 ; WX 863 ; N uni03FA ; G 911\nU 1019 ; WX 651 ; N uni03FB ; G 912\nU 1020 ; WX 635 ; N uni03FC ; G 913\nU 1021 ; WX 703 ; N uni03FD ; G 914\nU 1022 ; WX 698 ; N uni03FE ; G 915\nU 1023 ; WX 703 ; N uni03FF ; G 916\nU 1024 ; WX 632 ; N uni0400 ; G 917\nU 1025 ; WX 632 ; N uni0401 ; G 918\nU 1026 ; WX 786 ; N uni0402 ; G 919\nU 1027 ; WX 610 ; N uni0403 ; G 920\nU 1028 ; WX 698 ; N uni0404 ; G 921\nU 1029 ; WX 635 ; N uni0405 ; G 922\nU 1030 ; WX 295 ; N uni0406 ; G 923\nU 1031 ; WX 295 ; N uni0407 ; G 924\nU 1032 ; WX 295 ; N uni0408 ; G 925\nU 1033 ; WX 1094 ; N uni0409 ; G 926\nU 1034 ; WX 1045 ; N uni040A ; G 927\nU 1035 ; WX 786 ; N uni040B ; G 928\nU 1036 ; WX 710 ; N uni040C ; G 929\nU 1037 ; WX 748 ; N uni040D ; G 930\nU 1038 ; WX 609 ; N uni040E ; G 931\nU 1039 ; WX 752 ; N uni040F ; G 932\nU 1040 ; WX 684 ; N uni0410 ; G 933\nU 1041 ; WX 686 ; N uni0411 ; G 934\nU 1042 ; WX 686 ; N uni0412 ; G 935\nU 1043 ; WX 610 ; N uni0413 ; G 936\nU 1044 ; WX 781 ; N uni0414 ; G 937\nU 1045 ; WX 632 ; N uni0415 ; G 938\nU 1046 ; WX 1077 ; N uni0416 ; G 939\nU 1047 ; WX 641 ; N uni0417 ; G 940\nU 1048 ; WX 748 ; N uni0418 ; G 941\nU 1049 ; WX 748 ; N uni0419 ; G 942\nU 1050 ; WX 710 ; N uni041A ; G 943\nU 1051 ; WX 752 ; N uni041B ; G 944\nU 1052 ; WX 863 ; N uni041C ; G 945\nU 1053 ; WX 752 ; N uni041D ; G 946\nU 1054 ; WX 787 ; N uni041E ; G 947\nU 1055 ; WX 752 ; N uni041F ; G 948\nU 1056 ; WX 603 ; N uni0420 ; G 949\nU 1057 ; WX 698 ; N uni0421 ; G 950\nU 1058 ; WX 611 ; N uni0422 ; G 951\nU 1059 ; WX 609 ; N uni0423 ; G 952\nU 1060 ; WX 861 ; N uni0424 ; G 953\nU 1061 ; WX 685 ; N uni0425 ; G 954\nU 1062 ; WX 776 ; N uni0426 ; G 955\nU 1063 ; WX 686 ; N uni0427 ; G 956\nU 1064 ; WX 1069 ; N uni0428 ; G 957\nU 1065 ; WX 1094 ; N uni0429 ; G 958\nU 1066 ; WX 833 ; N uni042A ; G 959\nU 1067 ; WX 882 ; N uni042B ; G 960\nU 1068 ; WX 686 ; N uni042C ; G 961\nU 1069 ; WX 698 ; N uni042D ; G 962\nU 1070 ; WX 1080 ; N uni042E ; G 963\nU 1071 ; WX 695 ; N uni042F ; G 964\nU 1072 ; WX 613 ; N uni0430 ; G 965\nU 1073 ; WX 617 ; N uni0431 ; G 966\nU 1074 ; WX 589 ; N uni0432 ; G 967\nU 1075 ; WX 525 ; N uni0433 ; G 968\nU 1076 ; WX 691 ; N uni0434 ; G 969\nU 1077 ; WX 615 ; N uni0435 ; G 970\nU 1078 ; WX 901 ; N uni0436 ; G 971\nU 1079 ; WX 532 ; N uni0437 ; G 972\nU 1080 ; WX 650 ; N uni0438 ; G 973\nU 1081 ; WX 650 ; N uni0439 ; G 974\nU 1082 ; WX 604 ; N uni043A ; G 975\nU 1083 ; WX 639 ; N uni043B ; G 976\nU 1084 ; WX 754 ; N uni043C ; G 977\nU 1085 ; WX 654 ; N uni043D ; G 978\nU 1086 ; WX 612 ; N uni043E ; G 979\nU 1087 ; WX 654 ; N uni043F ; G 980\nU 1088 ; WX 635 ; N uni0440 ; G 981\nU 1089 ; WX 550 ; N uni0441 ; G 982\nU 1090 ; WX 583 ; N uni0442 ; G 983\nU 1091 ; WX 592 ; N uni0443 ; G 984\nU 1092 ; WX 855 ; N uni0444 ; G 985\nU 1093 ; WX 592 ; N uni0445 ; G 986\nU 1094 ; WX 681 ; N uni0446 ; G 987\nU 1095 ; WX 591 ; N uni0447 ; G 988\nU 1096 ; WX 915 ; N uni0448 ; G 989\nU 1097 ; WX 942 ; N uni0449 ; G 990\nU 1098 ; WX 707 ; N uni044A ; G 991\nU 1099 ; WX 790 ; N uni044B ; G 992\nU 1100 ; WX 589 ; N uni044C ; G 993\nU 1101 ; WX 549 ; N uni044D ; G 994\nU 1102 ; WX 842 ; N uni044E ; G 995\nU 1103 ; WX 602 ; N uni044F ; G 996\nU 1104 ; WX 615 ; N uni0450 ; G 997\nU 1105 ; WX 615 ; N uni0451 ; G 998\nU 1106 ; WX 625 ; N uni0452 ; G 999\nU 1107 ; WX 525 ; N uni0453 ; G 1000\nU 1108 ; WX 549 ; N uni0454 ; G 1001\nU 1109 ; WX 521 ; N uni0455 ; G 1002\nU 1110 ; WX 278 ; N uni0456 ; G 1003\nU 1111 ; WX 278 ; N uni0457 ; G 1004\nU 1112 ; WX 278 ; N uni0458 ; G 1005\nU 1113 ; WX 902 ; N uni0459 ; G 1006\nU 1114 ; WX 898 ; N uni045A ; G 1007\nU 1115 ; WX 652 ; N uni045B ; G 1008\nU 1116 ; WX 604 ; N uni045C ; G 1009\nU 1117 ; WX 650 ; N uni045D ; G 1010\nU 1118 ; WX 592 ; N uni045E ; G 1011\nU 1119 ; WX 654 ; N uni045F ; G 1012\nU 1120 ; WX 934 ; N uni0460 ; G 1013\nU 1121 ; WX 837 ; N uni0461 ; G 1014\nU 1122 ; WX 771 ; N uni0462 ; G 1015\nU 1123 ; WX 672 ; N uni0463 ; G 1016\nU 1124 ; WX 942 ; N uni0464 ; G 1017\nU 1125 ; WX 749 ; N uni0465 ; G 1018\nU 1126 ; WX 879 ; N uni0466 ; G 1019\nU 1127 ; WX 783 ; N uni0467 ; G 1020\nU 1128 ; WX 1160 ; N uni0468 ; G 1021\nU 1129 ; WX 1001 ; N uni0469 ; G 1022\nU 1130 ; WX 787 ; N uni046A ; G 1023\nU 1131 ; WX 612 ; N uni046B ; G 1024\nU 1132 ; WX 1027 ; N uni046C ; G 1025\nU 1133 ; WX 824 ; N uni046D ; G 1026\nU 1134 ; WX 636 ; N uni046E ; G 1027\nU 1135 ; WX 541 ; N uni046F ; G 1028\nU 1136 ; WX 856 ; N uni0470 ; G 1029\nU 1137 ; WX 876 ; N uni0471 ; G 1030\nU 1138 ; WX 787 ; N uni0472 ; G 1031\nU 1139 ; WX 612 ; N uni0473 ; G 1032\nU 1140 ; WX 781 ; N uni0474 ; G 1033\nU 1141 ; WX 665 ; N uni0475 ; G 1034\nU 1142 ; WX 781 ; N uni0476 ; G 1035\nU 1143 ; WX 665 ; N uni0477 ; G 1036\nU 1144 ; WX 992 ; N uni0478 ; G 1037\nU 1145 ; WX 904 ; N uni0479 ; G 1038\nU 1146 ; WX 953 ; N uni047A ; G 1039\nU 1147 ; WX 758 ; N uni047B ; G 1040\nU 1148 ; WX 1180 ; N uni047C ; G 1041\nU 1149 ; WX 1028 ; N uni047D ; G 1042\nU 1150 ; WX 934 ; N uni047E ; G 1043\nU 1151 ; WX 837 ; N uni047F ; G 1044\nU 1152 ; WX 698 ; N uni0480 ; G 1045\nU 1153 ; WX 550 ; N uni0481 ; G 1046\nU 1154 ; WX 502 ; N uni0482 ; G 1047\nU 1155 ; WX 0 ; N uni0483 ; G 1048\nU 1156 ; WX 0 ; N uni0484 ; G 1049\nU 1157 ; WX 0 ; N uni0485 ; G 1050\nU 1158 ; WX 0 ; N uni0486 ; G 1051\nU 1159 ; WX 0 ; N uni0487 ; G 1052\nU 1160 ; WX 418 ; N uni0488 ; G 1053\nU 1161 ; WX 418 ; N uni0489 ; G 1054\nU 1162 ; WX 772 ; N uni048A ; G 1055\nU 1163 ; WX 677 ; N uni048B ; G 1056\nU 1164 ; WX 686 ; N uni048C ; G 1057\nU 1165 ; WX 589 ; N uni048D ; G 1058\nU 1166 ; WX 603 ; N uni048E ; G 1059\nU 1167 ; WX 635 ; N uni048F ; G 1060\nU 1168 ; WX 610 ; N uni0490 ; G 1061\nU 1169 ; WX 525 ; N uni0491 ; G 1062\nU 1170 ; WX 675 ; N uni0492 ; G 1063\nU 1171 ; WX 590 ; N uni0493 ; G 1064\nU 1172 ; WX 624 ; N uni0494 ; G 1065\nU 1173 ; WX 530 ; N uni0495 ; G 1066\nU 1174 ; WX 1077 ; N uni0496 ; G 1067\nU 1175 ; WX 901 ; N uni0497 ; G 1068\nU 1176 ; WX 641 ; N uni0498 ; G 1069\nU 1177 ; WX 532 ; N uni0499 ; G 1070\nU 1178 ; WX 710 ; N uni049A ; G 1071\nU 1179 ; WX 604 ; N uni049B ; G 1072\nU 1180 ; WX 710 ; N uni049C ; G 1073\nU 1181 ; WX 604 ; N uni049D ; G 1074\nU 1182 ; WX 710 ; N uni049E ; G 1075\nU 1183 ; WX 604 ; N uni049F ; G 1076\nU 1184 ; WX 856 ; N uni04A0 ; G 1077\nU 1185 ; WX 832 ; N uni04A1 ; G 1078\nU 1186 ; WX 752 ; N uni04A2 ; G 1079\nU 1187 ; WX 661 ; N uni04A3 ; G 1080\nU 1188 ; WX 1014 ; N uni04A4 ; G 1081\nU 1189 ; WX 877 ; N uni04A5 ; G 1082\nU 1190 ; WX 1081 ; N uni04A6 ; G 1083\nU 1191 ; WX 916 ; N uni04A7 ; G 1084\nU 1192 ; WX 878 ; N uni04A8 ; G 1085\nU 1193 ; WX 693 ; N uni04A9 ; G 1086\nU 1194 ; WX 698 ; N uni04AA ; G 1087\nU 1195 ; WX 550 ; N uni04AB ; G 1088\nU 1196 ; WX 611 ; N uni04AC ; G 1089\nU 1197 ; WX 583 ; N uni04AD ; G 1090\nU 1198 ; WX 611 ; N uni04AE ; G 1091\nU 1199 ; WX 592 ; N uni04AF ; G 1092\nU 1200 ; WX 611 ; N uni04B0 ; G 1093\nU 1201 ; WX 592 ; N uni04B1 ; G 1094\nU 1202 ; WX 685 ; N uni04B2 ; G 1095\nU 1203 ; WX 592 ; N uni04B3 ; G 1096\nU 1204 ; WX 934 ; N uni04B4 ; G 1097\nU 1205 ; WX 807 ; N uni04B5 ; G 1098\nU 1206 ; WX 686 ; N uni04B6 ; G 1099\nU 1207 ; WX 591 ; N uni04B7 ; G 1100\nU 1208 ; WX 686 ; N uni04B8 ; G 1101\nU 1209 ; WX 591 ; N uni04B9 ; G 1102\nU 1210 ; WX 686 ; N uni04BA ; G 1103\nU 1211 ; WX 634 ; N uni04BB ; G 1104\nU 1212 ; WX 941 ; N uni04BC ; G 1105\nU 1213 ; WX 728 ; N uni04BD ; G 1106\nU 1214 ; WX 941 ; N uni04BE ; G 1107\nU 1215 ; WX 728 ; N uni04BF ; G 1108\nU 1216 ; WX 295 ; N uni04C0 ; G 1109\nU 1217 ; WX 1077 ; N uni04C1 ; G 1110\nU 1218 ; WX 901 ; N uni04C2 ; G 1111\nU 1219 ; WX 656 ; N uni04C3 ; G 1112\nU 1220 ; WX 604 ; N uni04C4 ; G 1113\nU 1221 ; WX 776 ; N uni04C5 ; G 1114\nU 1222 ; WX 670 ; N uni04C6 ; G 1115\nU 1223 ; WX 752 ; N uni04C7 ; G 1116\nU 1224 ; WX 661 ; N uni04C8 ; G 1117\nU 1225 ; WX 776 ; N uni04C9 ; G 1118\nU 1226 ; WX 681 ; N uni04CA ; G 1119\nU 1227 ; WX 686 ; N uni04CB ; G 1120\nU 1228 ; WX 591 ; N uni04CC ; G 1121\nU 1229 ; WX 888 ; N uni04CD ; G 1122\nU 1230 ; WX 774 ; N uni04CE ; G 1123\nU 1231 ; WX 278 ; N uni04CF ; G 1124\nU 1232 ; WX 684 ; N uni04D0 ; G 1125\nU 1233 ; WX 613 ; N uni04D1 ; G 1126\nU 1234 ; WX 684 ; N uni04D2 ; G 1127\nU 1235 ; WX 613 ; N uni04D3 ; G 1128\nU 1236 ; WX 974 ; N uni04D4 ; G 1129\nU 1237 ; WX 982 ; N uni04D5 ; G 1130\nU 1238 ; WX 632 ; N uni04D6 ; G 1131\nU 1239 ; WX 615 ; N uni04D7 ; G 1132\nU 1240 ; WX 787 ; N uni04D8 ; G 1133\nU 1241 ; WX 615 ; N uni04D9 ; G 1134\nU 1242 ; WX 787 ; N uni04DA ; G 1135\nU 1243 ; WX 615 ; N uni04DB ; G 1136\nU 1244 ; WX 1077 ; N uni04DC ; G 1137\nU 1245 ; WX 901 ; N uni04DD ; G 1138\nU 1246 ; WX 641 ; N uni04DE ; G 1139\nU 1247 ; WX 532 ; N uni04DF ; G 1140\nU 1248 ; WX 666 ; N uni04E0 ; G 1141\nU 1249 ; WX 578 ; N uni04E1 ; G 1142\nU 1250 ; WX 748 ; N uni04E2 ; G 1143\nU 1251 ; WX 650 ; N uni04E3 ; G 1144\nU 1252 ; WX 748 ; N uni04E4 ; G 1145\nU 1253 ; WX 650 ; N uni04E5 ; G 1146\nU 1254 ; WX 787 ; N uni04E6 ; G 1147\nU 1255 ; WX 612 ; N uni04E7 ; G 1148\nU 1256 ; WX 787 ; N uni04E8 ; G 1149\nU 1257 ; WX 612 ; N uni04E9 ; G 1150\nU 1258 ; WX 787 ; N uni04EA ; G 1151\nU 1259 ; WX 612 ; N uni04EB ; G 1152\nU 1260 ; WX 698 ; N uni04EC ; G 1153\nU 1261 ; WX 549 ; N uni04ED ; G 1154\nU 1262 ; WX 609 ; N uni04EE ; G 1155\nU 1263 ; WX 592 ; N uni04EF ; G 1156\nU 1264 ; WX 609 ; N uni04F0 ; G 1157\nU 1265 ; WX 592 ; N uni04F1 ; G 1158\nU 1266 ; WX 609 ; N uni04F2 ; G 1159\nU 1267 ; WX 592 ; N uni04F3 ; G 1160\nU 1268 ; WX 686 ; N uni04F4 ; G 1161\nU 1269 ; WX 591 ; N uni04F5 ; G 1162\nU 1270 ; WX 610 ; N uni04F6 ; G 1163\nU 1271 ; WX 525 ; N uni04F7 ; G 1164\nU 1272 ; WX 882 ; N uni04F8 ; G 1165\nU 1273 ; WX 790 ; N uni04F9 ; G 1166\nU 1274 ; WX 675 ; N uni04FA ; G 1167\nU 1275 ; WX 590 ; N uni04FB ; G 1168\nU 1276 ; WX 685 ; N uni04FC ; G 1169\nU 1277 ; WX 592 ; N uni04FD ; G 1170\nU 1278 ; WX 685 ; N uni04FE ; G 1171\nU 1279 ; WX 592 ; N uni04FF ; G 1172\nU 1280 ; WX 686 ; N uni0500 ; G 1173\nU 1281 ; WX 589 ; N uni0501 ; G 1174\nU 1282 ; WX 1006 ; N uni0502 ; G 1175\nU 1283 ; WX 897 ; N uni0503 ; G 1176\nU 1284 ; WX 975 ; N uni0504 ; G 1177\nU 1285 ; WX 869 ; N uni0505 ; G 1178\nU 1286 ; WX 679 ; N uni0506 ; G 1179\nU 1287 ; WX 588 ; N uni0507 ; G 1180\nU 1288 ; WX 1072 ; N uni0508 ; G 1181\nU 1289 ; WX 957 ; N uni0509 ; G 1182\nU 1290 ; WX 1113 ; N uni050A ; G 1183\nU 1291 ; WX 967 ; N uni050B ; G 1184\nU 1292 ; WX 775 ; N uni050C ; G 1185\nU 1293 ; WX 660 ; N uni050D ; G 1186\nU 1294 ; WX 773 ; N uni050E ; G 1187\nU 1295 ; WX 711 ; N uni050F ; G 1188\nU 1296 ; WX 614 ; N uni0510 ; G 1189\nU 1297 ; WX 541 ; N uni0511 ; G 1190\nU 1298 ; WX 752 ; N uni0512 ; G 1191\nU 1299 ; WX 639 ; N uni0513 ; G 1192\nU 1300 ; WX 1169 ; N uni0514 ; G 1193\nU 1301 ; WX 994 ; N uni0515 ; G 1194\nU 1302 ; WX 894 ; N uni0516 ; G 1195\nU 1303 ; WX 864 ; N uni0517 ; G 1196\nU 1304 ; WX 1032 ; N uni0518 ; G 1197\nU 1305 ; WX 986 ; N uni0519 ; G 1198\nU 1306 ; WX 787 ; N uni051A ; G 1199\nU 1307 ; WX 635 ; N uni051B ; G 1200\nU 1308 ; WX 989 ; N uni051C ; G 1201\nU 1309 ; WX 818 ; N uni051D ; G 1202\nU 1310 ; WX 710 ; N uni051E ; G 1203\nU 1311 ; WX 604 ; N uni051F ; G 1204\nU 1312 ; WX 1081 ; N uni0520 ; G 1205\nU 1313 ; WX 905 ; N uni0521 ; G 1206\nU 1314 ; WX 1081 ; N uni0522 ; G 1207\nU 1315 ; WX 912 ; N uni0523 ; G 1208\nU 1316 ; WX 793 ; N uni0524 ; G 1209\nU 1317 ; WX 683 ; N uni0525 ; G 1210\nU 1329 ; WX 766 ; N uni0531 ; G 1211\nU 1330 ; WX 732 ; N uni0532 ; G 1212\nU 1331 ; WX 753 ; N uni0533 ; G 1213\nU 1332 ; WX 753 ; N uni0534 ; G 1214\nU 1333 ; WX 732 ; N uni0535 ; G 1215\nU 1334 ; WX 772 ; N uni0536 ; G 1216\nU 1335 ; WX 640 ; N uni0537 ; G 1217\nU 1336 ; WX 732 ; N uni0538 ; G 1218\nU 1337 ; WX 859 ; N uni0539 ; G 1219\nU 1338 ; WX 753 ; N uni053A ; G 1220\nU 1339 ; WX 691 ; N uni053B ; G 1221\nU 1340 ; WX 533 ; N uni053C ; G 1222\nU 1341 ; WX 922 ; N uni053D ; G 1223\nU 1342 ; WX 863 ; N uni053E ; G 1224\nU 1343 ; WX 732 ; N uni053F ; G 1225\nU 1344 ; WX 716 ; N uni0540 ; G 1226\nU 1345 ; WX 766 ; N uni0541 ; G 1227\nU 1346 ; WX 753 ; N uni0542 ; G 1228\nU 1347 ; WX 767 ; N uni0543 ; G 1229\nU 1348 ; WX 792 ; N uni0544 ; G 1230\nU 1349 ; WX 728 ; N uni0545 ; G 1231\nU 1350 ; WX 729 ; N uni0546 ; G 1232\nU 1351 ; WX 757 ; N uni0547 ; G 1233\nU 1352 ; WX 732 ; N uni0548 ; G 1234\nU 1353 ; WX 713 ; N uni0549 ; G 1235\nU 1354 ; WX 800 ; N uni054A ; G 1236\nU 1355 ; WX 768 ; N uni054B ; G 1237\nU 1356 ; WX 792 ; N uni054C ; G 1238\nU 1357 ; WX 732 ; N uni054D ; G 1239\nU 1358 ; WX 753 ; N uni054E ; G 1240\nU 1359 ; WX 705 ; N uni054F ; G 1241\nU 1360 ; WX 694 ; N uni0550 ; G 1242\nU 1361 ; WX 744 ; N uni0551 ; G 1243\nU 1362 ; WX 538 ; N uni0552 ; G 1244\nU 1363 ; WX 811 ; N uni0553 ; G 1245\nU 1364 ; WX 757 ; N uni0554 ; G 1246\nU 1365 ; WX 787 ; N uni0555 ; G 1247\nU 1366 ; WX 790 ; N uni0556 ; G 1248\nU 1369 ; WX 307 ; N uni0559 ; G 1249\nU 1370 ; WX 318 ; N uni055A ; G 1250\nU 1371 ; WX 234 ; N uni055B ; G 1251\nU 1372 ; WX 361 ; N uni055C ; G 1252\nU 1373 ; WX 238 ; N uni055D ; G 1253\nU 1374 ; WX 405 ; N uni055E ; G 1254\nU 1375 ; WX 500 ; N uni055F ; G 1255\nU 1377 ; WX 974 ; N uni0561 ; G 1256\nU 1378 ; WX 634 ; N uni0562 ; G 1257\nU 1379 ; WX 658 ; N uni0563 ; G 1258\nU 1380 ; WX 663 ; N uni0564 ; G 1259\nU 1381 ; WX 634 ; N uni0565 ; G 1260\nU 1382 ; WX 635 ; N uni0566 ; G 1261\nU 1383 ; WX 515 ; N uni0567 ; G 1262\nU 1384 ; WX 634 ; N uni0568 ; G 1263\nU 1385 ; WX 738 ; N uni0569 ; G 1264\nU 1386 ; WX 658 ; N uni056A ; G 1265\nU 1387 ; WX 634 ; N uni056B ; G 1266\nU 1388 ; WX 271 ; N uni056C ; G 1267\nU 1389 ; WX 980 ; N uni056D ; G 1268\nU 1390 ; WX 623 ; N uni056E ; G 1269\nU 1391 ; WX 634 ; N uni056F ; G 1270\nU 1392 ; WX 634 ; N uni0570 ; G 1271\nU 1393 ; WX 608 ; N uni0571 ; G 1272\nU 1394 ; WX 634 ; N uni0572 ; G 1273\nU 1395 ; WX 629 ; N uni0573 ; G 1274\nU 1396 ; WX 634 ; N uni0574 ; G 1275\nU 1397 ; WX 271 ; N uni0575 ; G 1276\nU 1398 ; WX 634 ; N uni0576 ; G 1277\nU 1399 ; WX 499 ; N uni0577 ; G 1278\nU 1400 ; WX 634 ; N uni0578 ; G 1279\nU 1401 ; WX 404 ; N uni0579 ; G 1280\nU 1402 ; WX 974 ; N uni057A ; G 1281\nU 1403 ; WX 560 ; N uni057B ; G 1282\nU 1404 ; WX 648 ; N uni057C ; G 1283\nU 1405 ; WX 634 ; N uni057D ; G 1284\nU 1406 ; WX 634 ; N uni057E ; G 1285\nU 1407 ; WX 974 ; N uni057F ; G 1286\nU 1408 ; WX 634 ; N uni0580 ; G 1287\nU 1409 ; WX 633 ; N uni0581 ; G 1288\nU 1410 ; WX 435 ; N uni0582 ; G 1289\nU 1411 ; WX 974 ; N uni0583 ; G 1290\nU 1412 ; WX 636 ; N uni0584 ; G 1291\nU 1413 ; WX 609 ; N uni0585 ; G 1292\nU 1414 ; WX 805 ; N uni0586 ; G 1293\nU 1415 ; WX 812 ; N uni0587 ; G 1294\nU 1417 ; WX 337 ; N uni0589 ; G 1295\nU 1418 ; WX 361 ; N uni058A ; G 1296\nU 1456 ; WX 0 ; N uni05B0 ; G 1297\nU 1457 ; WX 0 ; N uni05B1 ; G 1298\nU 1458 ; WX 0 ; N uni05B2 ; G 1299\nU 1459 ; WX 0 ; N uni05B3 ; G 1300\nU 1460 ; WX 0 ; N uni05B4 ; G 1301\nU 1461 ; WX 0 ; N uni05B5 ; G 1302\nU 1462 ; WX 0 ; N uni05B6 ; G 1303\nU 1463 ; WX 0 ; N uni05B7 ; G 1304\nU 1464 ; WX 0 ; N uni05B8 ; G 1305\nU 1465 ; WX 0 ; N uni05B9 ; G 1306\nU 1466 ; WX 0 ; N uni05BA ; G 1307\nU 1467 ; WX 0 ; N uni05BB ; G 1308\nU 1468 ; WX 0 ; N uni05BC ; G 1309\nU 1469 ; WX 0 ; N uni05BD ; G 1310\nU 1470 ; WX 361 ; N uni05BE ; G 1311\nU 1471 ; WX 0 ; N uni05BF ; G 1312\nU 1472 ; WX 295 ; N uni05C0 ; G 1313\nU 1473 ; WX 0 ; N uni05C1 ; G 1314\nU 1474 ; WX 0 ; N uni05C2 ; G 1315\nU 1475 ; WX 295 ; N uni05C3 ; G 1316\nU 1478 ; WX 441 ; N uni05C6 ; G 1317\nU 1479 ; WX 0 ; N uni05C7 ; G 1318\nU 1488 ; WX 668 ; N uni05D0 ; G 1319\nU 1489 ; WX 578 ; N uni05D1 ; G 1320\nU 1490 ; WX 412 ; N uni05D2 ; G 1321\nU 1491 ; WX 546 ; N uni05D3 ; G 1322\nU 1492 ; WX 653 ; N uni05D4 ; G 1323\nU 1493 ; WX 272 ; N uni05D5 ; G 1324\nU 1494 ; WX 346 ; N uni05D6 ; G 1325\nU 1495 ; WX 653 ; N uni05D7 ; G 1326\nU 1496 ; WX 648 ; N uni05D8 ; G 1327\nU 1497 ; WX 224 ; N uni05D9 ; G 1328\nU 1498 ; WX 537 ; N uni05DA ; G 1329\nU 1499 ; WX 529 ; N uni05DB ; G 1330\nU 1500 ; WX 568 ; N uni05DC ; G 1331\nU 1501 ; WX 664 ; N uni05DD ; G 1332\nU 1502 ; WX 679 ; N uni05DE ; G 1333\nU 1503 ; WX 272 ; N uni05DF ; G 1334\nU 1504 ; WX 400 ; N uni05E0 ; G 1335\nU 1505 ; WX 649 ; N uni05E1 ; G 1336\nU 1506 ; WX 626 ; N uni05E2 ; G 1337\nU 1507 ; WX 640 ; N uni05E3 ; G 1338\nU 1508 ; WX 625 ; N uni05E4 ; G 1339\nU 1509 ; WX 540 ; N uni05E5 ; G 1340\nU 1510 ; WX 593 ; N uni05E6 ; G 1341\nU 1511 ; WX 709 ; N uni05E7 ; G 1342\nU 1512 ; WX 564 ; N uni05E8 ; G 1343\nU 1513 ; WX 708 ; N uni05E9 ; G 1344\nU 1514 ; WX 657 ; N uni05EA ; G 1345\nU 1520 ; WX 471 ; N uni05F0 ; G 1346\nU 1521 ; WX 423 ; N uni05F1 ; G 1347\nU 1522 ; WX 331 ; N uni05F2 ; G 1348\nU 1523 ; WX 416 ; N uni05F3 ; G 1349\nU 1524 ; WX 645 ; N uni05F4 ; G 1350\nU 1542 ; WX 637 ; N uni0606 ; G 1351\nU 1543 ; WX 637 ; N uni0607 ; G 1352\nU 1545 ; WX 757 ; N uni0609 ; G 1353\nU 1546 ; WX 977 ; N uni060A ; G 1354\nU 1548 ; WX 323 ; N uni060C ; G 1355\nU 1557 ; WX 0 ; N uni0615 ; G 1356\nU 1563 ; WX 318 ; N uni061B ; G 1357\nU 1567 ; WX 531 ; N uni061F ; G 1358\nU 1569 ; WX 470 ; N uni0621 ; G 1359\nU 1570 ; WX 278 ; N uni0622 ; G 1360\nU 1571 ; WX 278 ; N uni0623 ; G 1361\nU 1572 ; WX 483 ; N uni0624 ; G 1362\nU 1573 ; WX 278 ; N uni0625 ; G 1363\nU 1574 ; WX 783 ; N uni0626 ; G 1364\nU 1575 ; WX 278 ; N uni0627 ; G 1365\nU 1576 ; WX 941 ; N uni0628 ; G 1366\nU 1577 ; WX 524 ; N uni0629 ; G 1367\nU 1578 ; WX 941 ; N uni062A ; G 1368\nU 1579 ; WX 941 ; N uni062B ; G 1369\nU 1580 ; WX 646 ; N uni062C ; G 1370\nU 1581 ; WX 646 ; N uni062D ; G 1371\nU 1582 ; WX 646 ; N uni062E ; G 1372\nU 1583 ; WX 445 ; N uni062F ; G 1373\nU 1584 ; WX 445 ; N uni0630 ; G 1374\nU 1585 ; WX 483 ; N uni0631 ; G 1375\nU 1586 ; WX 483 ; N uni0632 ; G 1376\nU 1587 ; WX 1221 ; N uni0633 ; G 1377\nU 1588 ; WX 1221 ; N uni0634 ; G 1378\nU 1589 ; WX 1209 ; N uni0635 ; G 1379\nU 1590 ; WX 1209 ; N uni0636 ; G 1380\nU 1591 ; WX 925 ; N uni0637 ; G 1381\nU 1592 ; WX 925 ; N uni0638 ; G 1382\nU 1593 ; WX 597 ; N uni0639 ; G 1383\nU 1594 ; WX 597 ; N uni063A ; G 1384\nU 1600 ; WX 293 ; N uni0640 ; G 1385\nU 1601 ; WX 1037 ; N uni0641 ; G 1386\nU 1602 ; WX 776 ; N uni0642 ; G 1387\nU 1603 ; WX 824 ; N uni0643 ; G 1388\nU 1604 ; WX 727 ; N uni0644 ; G 1389\nU 1605 ; WX 619 ; N uni0645 ; G 1390\nU 1606 ; WX 734 ; N uni0646 ; G 1391\nU 1607 ; WX 524 ; N uni0647 ; G 1392\nU 1608 ; WX 483 ; N uni0648 ; G 1393\nU 1609 ; WX 783 ; N uni0649 ; G 1394\nU 1610 ; WX 783 ; N uni064A ; G 1395\nU 1611 ; WX 0 ; N uni064B ; G 1396\nU 1612 ; WX 0 ; N uni064C ; G 1397\nU 1613 ; WX 0 ; N uni064D ; G 1398\nU 1614 ; WX 0 ; N uni064E ; G 1399\nU 1615 ; WX 0 ; N uni064F ; G 1400\nU 1616 ; WX 0 ; N uni0650 ; G 1401\nU 1617 ; WX 0 ; N uni0651 ; G 1402\nU 1618 ; WX 0 ; N uni0652 ; G 1403\nU 1619 ; WX 0 ; N uni0653 ; G 1404\nU 1620 ; WX 0 ; N uni0654 ; G 1405\nU 1621 ; WX 0 ; N uni0655 ; G 1406\nU 1623 ; WX 0 ; N uni0657 ; G 1407\nU 1626 ; WX 500 ; N uni065A ; G 1408\nU 1632 ; WX 537 ; N uni0660 ; G 1409\nU 1633 ; WX 537 ; N uni0661 ; G 1410\nU 1634 ; WX 537 ; N uni0662 ; G 1411\nU 1635 ; WX 537 ; N uni0663 ; G 1412\nU 1636 ; WX 537 ; N uni0664 ; G 1413\nU 1637 ; WX 537 ; N uni0665 ; G 1414\nU 1638 ; WX 537 ; N uni0666 ; G 1415\nU 1639 ; WX 537 ; N uni0667 ; G 1416\nU 1640 ; WX 537 ; N uni0668 ; G 1417\nU 1641 ; WX 537 ; N uni0669 ; G 1418\nU 1642 ; WX 537 ; N uni066A ; G 1419\nU 1643 ; WX 325 ; N uni066B ; G 1420\nU 1644 ; WX 318 ; N uni066C ; G 1421\nU 1645 ; WX 545 ; N uni066D ; G 1422\nU 1646 ; WX 941 ; N uni066E ; G 1423\nU 1647 ; WX 776 ; N uni066F ; G 1424\nU 1648 ; WX 0 ; N uni0670 ; G 1425\nU 1652 ; WX 292 ; N uni0674 ; G 1426\nU 1657 ; WX 941 ; N uni0679 ; G 1427\nU 1658 ; WX 941 ; N uni067A ; G 1428\nU 1659 ; WX 941 ; N uni067B ; G 1429\nU 1660 ; WX 941 ; N uni067C ; G 1430\nU 1661 ; WX 941 ; N uni067D ; G 1431\nU 1662 ; WX 941 ; N uni067E ; G 1432\nU 1663 ; WX 941 ; N uni067F ; G 1433\nU 1664 ; WX 941 ; N uni0680 ; G 1434\nU 1665 ; WX 646 ; N uni0681 ; G 1435\nU 1666 ; WX 646 ; N uni0682 ; G 1436\nU 1667 ; WX 646 ; N uni0683 ; G 1437\nU 1668 ; WX 646 ; N uni0684 ; G 1438\nU 1669 ; WX 646 ; N uni0685 ; G 1439\nU 1670 ; WX 646 ; N uni0686 ; G 1440\nU 1671 ; WX 646 ; N uni0687 ; G 1441\nU 1672 ; WX 445 ; N uni0688 ; G 1442\nU 1673 ; WX 445 ; N uni0689 ; G 1443\nU 1674 ; WX 445 ; N uni068A ; G 1444\nU 1675 ; WX 445 ; N uni068B ; G 1445\nU 1676 ; WX 445 ; N uni068C ; G 1446\nU 1677 ; WX 445 ; N uni068D ; G 1447\nU 1678 ; WX 445 ; N uni068E ; G 1448\nU 1679 ; WX 445 ; N uni068F ; G 1449\nU 1680 ; WX 445 ; N uni0690 ; G 1450\nU 1681 ; WX 483 ; N uni0691 ; G 1451\nU 1682 ; WX 483 ; N uni0692 ; G 1452\nU 1683 ; WX 498 ; N uni0693 ; G 1453\nU 1684 ; WX 530 ; N uni0694 ; G 1454\nU 1685 ; WX 610 ; N uni0695 ; G 1455\nU 1686 ; WX 530 ; N uni0696 ; G 1456\nU 1687 ; WX 483 ; N uni0697 ; G 1457\nU 1688 ; WX 483 ; N uni0698 ; G 1458\nU 1689 ; WX 483 ; N uni0699 ; G 1459\nU 1690 ; WX 1221 ; N uni069A ; G 1460\nU 1691 ; WX 1221 ; N uni069B ; G 1461\nU 1692 ; WX 1221 ; N uni069C ; G 1462\nU 1693 ; WX 1209 ; N uni069D ; G 1463\nU 1694 ; WX 1209 ; N uni069E ; G 1464\nU 1695 ; WX 925 ; N uni069F ; G 1465\nU 1696 ; WX 597 ; N uni06A0 ; G 1466\nU 1697 ; WX 1037 ; N uni06A1 ; G 1467\nU 1698 ; WX 1037 ; N uni06A2 ; G 1468\nU 1699 ; WX 1037 ; N uni06A3 ; G 1469\nU 1700 ; WX 1037 ; N uni06A4 ; G 1470\nU 1701 ; WX 1037 ; N uni06A5 ; G 1471\nU 1702 ; WX 1037 ; N uni06A6 ; G 1472\nU 1703 ; WX 776 ; N uni06A7 ; G 1473\nU 1704 ; WX 776 ; N uni06A8 ; G 1474\nU 1705 ; WX 895 ; N uni06A9 ; G 1475\nU 1706 ; WX 1054 ; N uni06AA ; G 1476\nU 1707 ; WX 895 ; N uni06AB ; G 1477\nU 1708 ; WX 824 ; N uni06AC ; G 1478\nU 1709 ; WX 824 ; N uni06AD ; G 1479\nU 1710 ; WX 824 ; N uni06AE ; G 1480\nU 1711 ; WX 895 ; N uni06AF ; G 1481\nU 1712 ; WX 895 ; N uni06B0 ; G 1482\nU 1713 ; WX 895 ; N uni06B1 ; G 1483\nU 1714 ; WX 895 ; N uni06B2 ; G 1484\nU 1715 ; WX 895 ; N uni06B3 ; G 1485\nU 1716 ; WX 895 ; N uni06B4 ; G 1486\nU 1717 ; WX 727 ; N uni06B5 ; G 1487\nU 1718 ; WX 727 ; N uni06B6 ; G 1488\nU 1719 ; WX 727 ; N uni06B7 ; G 1489\nU 1720 ; WX 727 ; N uni06B8 ; G 1490\nU 1721 ; WX 734 ; N uni06B9 ; G 1491\nU 1722 ; WX 734 ; N uni06BA ; G 1492\nU 1723 ; WX 734 ; N uni06BB ; G 1493\nU 1724 ; WX 734 ; N uni06BC ; G 1494\nU 1725 ; WX 734 ; N uni06BD ; G 1495\nU 1726 ; WX 698 ; N uni06BE ; G 1496\nU 1727 ; WX 646 ; N uni06BF ; G 1497\nU 1734 ; WX 483 ; N uni06C6 ; G 1498\nU 1735 ; WX 483 ; N uni06C7 ; G 1499\nU 1736 ; WX 483 ; N uni06C8 ; G 1500\nU 1739 ; WX 483 ; N uni06CB ; G 1501\nU 1740 ; WX 783 ; N uni06CC ; G 1502\nU 1742 ; WX 783 ; N uni06CE ; G 1503\nU 1744 ; WX 783 ; N uni06D0 ; G 1504\nU 1749 ; WX 524 ; N uni06D5 ; G 1505\nU 1776 ; WX 537 ; N uni06F0 ; G 1506\nU 1777 ; WX 537 ; N uni06F1 ; G 1507\nU 1778 ; WX 537 ; N uni06F2 ; G 1508\nU 1779 ; WX 537 ; N uni06F3 ; G 1509\nU 1780 ; WX 537 ; N uni06F4 ; G 1510\nU 1781 ; WX 537 ; N uni06F5 ; G 1511\nU 1782 ; WX 537 ; N uni06F6 ; G 1512\nU 1783 ; WX 537 ; N uni06F7 ; G 1513\nU 1784 ; WX 537 ; N uni06F8 ; G 1514\nU 1785 ; WX 537 ; N uni06F9 ; G 1515\nU 1984 ; WX 636 ; N uni07C0 ; G 1516\nU 1985 ; WX 636 ; N uni07C1 ; G 1517\nU 1986 ; WX 636 ; N uni07C2 ; G 1518\nU 1987 ; WX 636 ; N uni07C3 ; G 1519\nU 1988 ; WX 636 ; N uni07C4 ; G 1520\nU 1989 ; WX 636 ; N uni07C5 ; G 1521\nU 1990 ; WX 636 ; N uni07C6 ; G 1522\nU 1991 ; WX 636 ; N uni07C7 ; G 1523\nU 1992 ; WX 636 ; N uni07C8 ; G 1524\nU 1993 ; WX 636 ; N uni07C9 ; G 1525\nU 1994 ; WX 278 ; N uni07CA ; G 1526\nU 1995 ; WX 571 ; N uni07CB ; G 1527\nU 1996 ; WX 424 ; N uni07CC ; G 1528\nU 1997 ; WX 592 ; N uni07CD ; G 1529\nU 1998 ; WX 654 ; N uni07CE ; G 1530\nU 1999 ; WX 654 ; N uni07CF ; G 1531\nU 2000 ; WX 594 ; N uni07D0 ; G 1532\nU 2001 ; WX 654 ; N uni07D1 ; G 1533\nU 2002 ; WX 829 ; N uni07D2 ; G 1534\nU 2003 ; WX 438 ; N uni07D3 ; G 1535\nU 2004 ; WX 438 ; N uni07D4 ; G 1536\nU 2005 ; WX 559 ; N uni07D5 ; G 1537\nU 2006 ; WX 612 ; N uni07D6 ; G 1538\nU 2007 ; WX 350 ; N uni07D7 ; G 1539\nU 2008 ; WX 959 ; N uni07D8 ; G 1540\nU 2009 ; WX 473 ; N uni07D9 ; G 1541\nU 2010 ; WX 783 ; N uni07DA ; G 1542\nU 2011 ; WX 654 ; N uni07DB ; G 1543\nU 2012 ; WX 625 ; N uni07DC ; G 1544\nU 2013 ; WX 734 ; N uni07DD ; G 1545\nU 2014 ; WX 530 ; N uni07DE ; G 1546\nU 2015 ; WX 724 ; N uni07DF ; G 1547\nU 2016 ; WX 473 ; N uni07E0 ; G 1548\nU 2017 ; WX 625 ; N uni07E1 ; G 1549\nU 2018 ; WX 594 ; N uni07E2 ; G 1550\nU 2019 ; WX 530 ; N uni07E3 ; G 1551\nU 2020 ; WX 530 ; N uni07E4 ; G 1552\nU 2021 ; WX 522 ; N uni07E5 ; G 1553\nU 2022 ; WX 594 ; N uni07E6 ; G 1554\nU 2023 ; WX 594 ; N uni07E7 ; G 1555\nU 2027 ; WX 0 ; N uni07EB ; G 1556\nU 2028 ; WX 0 ; N uni07EC ; G 1557\nU 2029 ; WX 0 ; N uni07ED ; G 1558\nU 2030 ; WX 0 ; N uni07EE ; G 1559\nU 2031 ; WX 0 ; N uni07EF ; G 1560\nU 2032 ; WX 0 ; N uni07F0 ; G 1561\nU 2033 ; WX 0 ; N uni07F1 ; G 1562\nU 2034 ; WX 0 ; N uni07F2 ; G 1563\nU 2035 ; WX 0 ; N uni07F3 ; G 1564\nU 2036 ; WX 313 ; N uni07F4 ; G 1565\nU 2037 ; WX 313 ; N uni07F5 ; G 1566\nU 2040 ; WX 560 ; N uni07F8 ; G 1567\nU 2041 ; WX 560 ; N uni07F9 ; G 1568\nU 2042 ; WX 361 ; N uni07FA ; G 1569\nU 3647 ; WX 636 ; N uni0E3F ; G 1570\nU 3713 ; WX 670 ; N uni0E81 ; G 1571\nU 3714 ; WX 684 ; N uni0E82 ; G 1572\nU 3716 ; WX 688 ; N uni0E84 ; G 1573\nU 3719 ; WX 482 ; N uni0E87 ; G 1574\nU 3720 ; WX 628 ; N uni0E88 ; G 1575\nU 3722 ; WX 684 ; N uni0E8A ; G 1576\nU 3725 ; WX 688 ; N uni0E8D ; G 1577\nU 3732 ; WX 669 ; N uni0E94 ; G 1578\nU 3733 ; WX 642 ; N uni0E95 ; G 1579\nU 3734 ; WX 645 ; N uni0E96 ; G 1580\nU 3735 ; WX 655 ; N uni0E97 ; G 1581\nU 3737 ; WX 659 ; N uni0E99 ; G 1582\nU 3738 ; WX 625 ; N uni0E9A ; G 1583\nU 3739 ; WX 625 ; N uni0E9B ; G 1584\nU 3740 ; WX 745 ; N uni0E9C ; G 1585\nU 3741 ; WX 767 ; N uni0E9D ; G 1586\nU 3742 ; WX 687 ; N uni0E9E ; G 1587\nU 3743 ; WX 687 ; N uni0E9F ; G 1588\nU 3745 ; WX 702 ; N uni0EA1 ; G 1589\nU 3746 ; WX 688 ; N uni0EA2 ; G 1590\nU 3747 ; WX 684 ; N uni0EA3 ; G 1591\nU 3749 ; WX 649 ; N uni0EA5 ; G 1592\nU 3751 ; WX 632 ; N uni0EA7 ; G 1593\nU 3754 ; WX 703 ; N uni0EAA ; G 1594\nU 3755 ; WX 819 ; N uni0EAB ; G 1595\nU 3757 ; WX 633 ; N uni0EAD ; G 1596\nU 3758 ; WX 684 ; N uni0EAE ; G 1597\nU 3759 ; WX 788 ; N uni0EAF ; G 1598\nU 3760 ; WX 632 ; N uni0EB0 ; G 1599\nU 3761 ; WX 0 ; N uni0EB1 ; G 1600\nU 3762 ; WX 539 ; N uni0EB2 ; G 1601\nU 3763 ; WX 539 ; N uni0EB3 ; G 1602\nU 3764 ; WX 0 ; N uni0EB4 ; G 1603\nU 3765 ; WX 0 ; N uni0EB5 ; G 1604\nU 3766 ; WX 0 ; N uni0EB6 ; G 1605\nU 3767 ; WX 0 ; N uni0EB7 ; G 1606\nU 3768 ; WX 0 ; N uni0EB8 ; G 1607\nU 3769 ; WX 0 ; N uni0EB9 ; G 1608\nU 3771 ; WX 0 ; N uni0EBB ; G 1609\nU 3772 ; WX 0 ; N uni0EBC ; G 1610\nU 3773 ; WX 663 ; N uni0EBD ; G 1611\nU 3776 ; WX 375 ; N uni0EC0 ; G 1612\nU 3777 ; WX 657 ; N uni0EC1 ; G 1613\nU 3778 ; WX 460 ; N uni0EC2 ; G 1614\nU 3779 ; WX 547 ; N uni0EC3 ; G 1615\nU 3780 ; WX 491 ; N uni0EC4 ; G 1616\nU 3782 ; WX 674 ; N uni0EC6 ; G 1617\nU 3784 ; WX 0 ; N uni0EC8 ; G 1618\nU 3785 ; WX 0 ; N uni0EC9 ; G 1619\nU 3786 ; WX 0 ; N uni0ECA ; G 1620\nU 3787 ; WX 0 ; N uni0ECB ; G 1621\nU 3788 ; WX 0 ; N uni0ECC ; G 1622\nU 3789 ; WX 0 ; N uni0ECD ; G 1623\nU 3792 ; WX 636 ; N uni0ED0 ; G 1624\nU 3793 ; WX 641 ; N uni0ED1 ; G 1625\nU 3794 ; WX 641 ; N uni0ED2 ; G 1626\nU 3795 ; WX 670 ; N uni0ED3 ; G 1627\nU 3796 ; WX 625 ; N uni0ED4 ; G 1628\nU 3797 ; WX 625 ; N uni0ED5 ; G 1629\nU 3798 ; WX 703 ; N uni0ED6 ; G 1630\nU 3799 ; WX 670 ; N uni0ED7 ; G 1631\nU 3800 ; WX 674 ; N uni0ED8 ; G 1632\nU 3801 ; WX 677 ; N uni0ED9 ; G 1633\nU 3804 ; WX 1028 ; N uni0EDC ; G 1634\nU 3805 ; WX 1028 ; N uni0EDD ; G 1635\nU 4256 ; WX 874 ; N uni10A0 ; G 1636\nU 4257 ; WX 733 ; N uni10A1 ; G 1637\nU 4258 ; WX 679 ; N uni10A2 ; G 1638\nU 4259 ; WX 834 ; N uni10A3 ; G 1639\nU 4260 ; WX 615 ; N uni10A4 ; G 1640\nU 4261 ; WX 768 ; N uni10A5 ; G 1641\nU 4262 ; WX 753 ; N uni10A6 ; G 1642\nU 4263 ; WX 914 ; N uni10A7 ; G 1643\nU 4264 ; WX 453 ; N uni10A8 ; G 1644\nU 4265 ; WX 620 ; N uni10A9 ; G 1645\nU 4266 ; WX 843 ; N uni10AA ; G 1646\nU 4267 ; WX 882 ; N uni10AB ; G 1647\nU 4268 ; WX 625 ; N uni10AC ; G 1648\nU 4269 ; WX 854 ; N uni10AD ; G 1649\nU 4270 ; WX 781 ; N uni10AE ; G 1650\nU 4271 ; WX 629 ; N uni10AF ; G 1651\nU 4272 ; WX 912 ; N uni10B0 ; G 1652\nU 4273 ; WX 621 ; N uni10B1 ; G 1653\nU 4274 ; WX 620 ; N uni10B2 ; G 1654\nU 4275 ; WX 854 ; N uni10B3 ; G 1655\nU 4276 ; WX 866 ; N uni10B4 ; G 1656\nU 4277 ; WX 724 ; N uni10B5 ; G 1657\nU 4278 ; WX 630 ; N uni10B6 ; G 1658\nU 4279 ; WX 621 ; N uni10B7 ; G 1659\nU 4280 ; WX 625 ; N uni10B8 ; G 1660\nU 4281 ; WX 620 ; N uni10B9 ; G 1661\nU 4282 ; WX 818 ; N uni10BA ; G 1662\nU 4283 ; WX 874 ; N uni10BB ; G 1663\nU 4284 ; WX 615 ; N uni10BC ; G 1664\nU 4285 ; WX 623 ; N uni10BD ; G 1665\nU 4286 ; WX 625 ; N uni10BE ; G 1666\nU 4287 ; WX 725 ; N uni10BF ; G 1667\nU 4288 ; WX 844 ; N uni10C0 ; G 1668\nU 4289 ; WX 596 ; N uni10C1 ; G 1669\nU 4290 ; WX 688 ; N uni10C2 ; G 1670\nU 4291 ; WX 596 ; N uni10C3 ; G 1671\nU 4292 ; WX 594 ; N uni10C4 ; G 1672\nU 4293 ; WX 738 ; N uni10C5 ; G 1673\nU 4304 ; WX 508 ; N uni10D0 ; G 1674\nU 4305 ; WX 518 ; N uni10D1 ; G 1675\nU 4306 ; WX 581 ; N uni10D2 ; G 1676\nU 4307 ; WX 818 ; N uni10D3 ; G 1677\nU 4308 ; WX 508 ; N uni10D4 ; G 1678\nU 4309 ; WX 513 ; N uni10D5 ; G 1679\nU 4310 ; WX 500 ; N uni10D6 ; G 1680\nU 4311 ; WX 801 ; N uni10D7 ; G 1681\nU 4312 ; WX 518 ; N uni10D8 ; G 1682\nU 4313 ; WX 510 ; N uni10D9 ; G 1683\nU 4314 ; WX 1064 ; N uni10DA ; G 1684\nU 4315 ; WX 522 ; N uni10DB ; G 1685\nU 4316 ; WX 522 ; N uni10DC ; G 1686\nU 4317 ; WX 786 ; N uni10DD ; G 1687\nU 4318 ; WX 508 ; N uni10DE ; G 1688\nU 4319 ; WX 518 ; N uni10DF ; G 1689\nU 4320 ; WX 796 ; N uni10E0 ; G 1690\nU 4321 ; WX 522 ; N uni10E1 ; G 1691\nU 4322 ; WX 654 ; N uni10E2 ; G 1692\nU 4323 ; WX 522 ; N uni10E3 ; G 1693\nU 4324 ; WX 825 ; N uni10E4 ; G 1694\nU 4325 ; WX 513 ; N uni10E5 ; G 1695\nU 4326 ; WX 786 ; N uni10E6 ; G 1696\nU 4327 ; WX 518 ; N uni10E7 ; G 1697\nU 4328 ; WX 518 ; N uni10E8 ; G 1698\nU 4329 ; WX 522 ; N uni10E9 ; G 1699\nU 4330 ; WX 571 ; N uni10EA ; G 1700\nU 4331 ; WX 522 ; N uni10EB ; G 1701\nU 4332 ; WX 518 ; N uni10EC ; G 1702\nU 4333 ; WX 520 ; N uni10ED ; G 1703\nU 4334 ; WX 522 ; N uni10EE ; G 1704\nU 4335 ; WX 454 ; N uni10EF ; G 1705\nU 4336 ; WX 508 ; N uni10F0 ; G 1706\nU 4337 ; WX 518 ; N uni10F1 ; G 1707\nU 4338 ; WX 508 ; N uni10F2 ; G 1708\nU 4339 ; WX 508 ; N uni10F3 ; G 1709\nU 4340 ; WX 518 ; N uni10F4 ; G 1710\nU 4341 ; WX 554 ; N uni10F5 ; G 1711\nU 4342 ; WX 828 ; N uni10F6 ; G 1712\nU 4343 ; WX 552 ; N uni10F7 ; G 1713\nU 4344 ; WX 508 ; N uni10F8 ; G 1714\nU 4345 ; WX 571 ; N uni10F9 ; G 1715\nU 4346 ; WX 508 ; N uni10FA ; G 1716\nU 4347 ; WX 448 ; N uni10FB ; G 1717\nU 4348 ; WX 324 ; N uni10FC ; G 1718\nU 5121 ; WX 684 ; N uni1401 ; G 1719\nU 5122 ; WX 684 ; N uni1402 ; G 1720\nU 5123 ; WX 684 ; N uni1403 ; G 1721\nU 5124 ; WX 684 ; N uni1404 ; G 1722\nU 5125 ; WX 769 ; N uni1405 ; G 1723\nU 5126 ; WX 769 ; N uni1406 ; G 1724\nU 5127 ; WX 769 ; N uni1407 ; G 1725\nU 5129 ; WX 769 ; N uni1409 ; G 1726\nU 5130 ; WX 769 ; N uni140A ; G 1727\nU 5131 ; WX 769 ; N uni140B ; G 1728\nU 5132 ; WX 835 ; N uni140C ; G 1729\nU 5133 ; WX 834 ; N uni140D ; G 1730\nU 5134 ; WX 835 ; N uni140E ; G 1731\nU 5135 ; WX 834 ; N uni140F ; G 1732\nU 5136 ; WX 835 ; N uni1410 ; G 1733\nU 5137 ; WX 834 ; N uni1411 ; G 1734\nU 5138 ; WX 967 ; N uni1412 ; G 1735\nU 5139 ; WX 1007 ; N uni1413 ; G 1736\nU 5140 ; WX 967 ; N uni1414 ; G 1737\nU 5141 ; WX 1007 ; N uni1415 ; G 1738\nU 5142 ; WX 769 ; N uni1416 ; G 1739\nU 5143 ; WX 967 ; N uni1417 ; G 1740\nU 5144 ; WX 1007 ; N uni1418 ; G 1741\nU 5145 ; WX 967 ; N uni1419 ; G 1742\nU 5146 ; WX 1007 ; N uni141A ; G 1743\nU 5147 ; WX 769 ; N uni141B ; G 1744\nU 5149 ; WX 256 ; N uni141D ; G 1745\nU 5150 ; WX 543 ; N uni141E ; G 1746\nU 5151 ; WX 423 ; N uni141F ; G 1747\nU 5152 ; WX 423 ; N uni1420 ; G 1748\nU 5153 ; WX 389 ; N uni1421 ; G 1749\nU 5154 ; WX 389 ; N uni1422 ; G 1750\nU 5155 ; WX 393 ; N uni1423 ; G 1751\nU 5156 ; WX 389 ; N uni1424 ; G 1752\nU 5157 ; WX 466 ; N uni1425 ; G 1753\nU 5158 ; WX 385 ; N uni1426 ; G 1754\nU 5159 ; WX 256 ; N uni1427 ; G 1755\nU 5160 ; WX 389 ; N uni1428 ; G 1756\nU 5161 ; WX 389 ; N uni1429 ; G 1757\nU 5162 ; WX 389 ; N uni142A ; G 1758\nU 5163 ; WX 1090 ; N uni142B ; G 1759\nU 5164 ; WX 909 ; N uni142C ; G 1760\nU 5165 ; WX 953 ; N uni142D ; G 1761\nU 5166 ; WX 1117 ; N uni142E ; G 1762\nU 5167 ; WX 684 ; N uni142F ; G 1763\nU 5168 ; WX 684 ; N uni1430 ; G 1764\nU 5169 ; WX 684 ; N uni1431 ; G 1765\nU 5170 ; WX 684 ; N uni1432 ; G 1766\nU 5171 ; WX 729 ; N uni1433 ; G 1767\nU 5172 ; WX 729 ; N uni1434 ; G 1768\nU 5173 ; WX 729 ; N uni1435 ; G 1769\nU 5175 ; WX 729 ; N uni1437 ; G 1770\nU 5176 ; WX 729 ; N uni1438 ; G 1771\nU 5177 ; WX 729 ; N uni1439 ; G 1772\nU 5178 ; WX 835 ; N uni143A ; G 1773\nU 5179 ; WX 684 ; N uni143B ; G 1774\nU 5180 ; WX 835 ; N uni143C ; G 1775\nU 5181 ; WX 834 ; N uni143D ; G 1776\nU 5182 ; WX 835 ; N uni143E ; G 1777\nU 5183 ; WX 834 ; N uni143F ; G 1778\nU 5184 ; WX 967 ; N uni1440 ; G 1779\nU 5185 ; WX 1007 ; N uni1441 ; G 1780\nU 5186 ; WX 967 ; N uni1442 ; G 1781\nU 5187 ; WX 1007 ; N uni1443 ; G 1782\nU 5188 ; WX 967 ; N uni1444 ; G 1783\nU 5189 ; WX 1007 ; N uni1445 ; G 1784\nU 5190 ; WX 967 ; N uni1446 ; G 1785\nU 5191 ; WX 1007 ; N uni1447 ; G 1786\nU 5192 ; WX 729 ; N uni1448 ; G 1787\nU 5193 ; WX 508 ; N uni1449 ; G 1788\nU 5194 ; WX 192 ; N uni144A ; G 1789\nU 5196 ; WX 732 ; N uni144C ; G 1790\nU 5197 ; WX 732 ; N uni144D ; G 1791\nU 5198 ; WX 732 ; N uni144E ; G 1792\nU 5199 ; WX 732 ; N uni144F ; G 1793\nU 5200 ; WX 730 ; N uni1450 ; G 1794\nU 5201 ; WX 730 ; N uni1451 ; G 1795\nU 5202 ; WX 730 ; N uni1452 ; G 1796\nU 5204 ; WX 730 ; N uni1454 ; G 1797\nU 5205 ; WX 730 ; N uni1455 ; G 1798\nU 5206 ; WX 730 ; N uni1456 ; G 1799\nU 5207 ; WX 921 ; N uni1457 ; G 1800\nU 5208 ; WX 889 ; N uni1458 ; G 1801\nU 5209 ; WX 921 ; N uni1459 ; G 1802\nU 5210 ; WX 889 ; N uni145A ; G 1803\nU 5211 ; WX 921 ; N uni145B ; G 1804\nU 5212 ; WX 889 ; N uni145C ; G 1805\nU 5213 ; WX 928 ; N uni145D ; G 1806\nU 5214 ; WX 900 ; N uni145E ; G 1807\nU 5215 ; WX 928 ; N uni145F ; G 1808\nU 5216 ; WX 900 ; N uni1460 ; G 1809\nU 5217 ; WX 947 ; N uni1461 ; G 1810\nU 5218 ; WX 900 ; N uni1462 ; G 1811\nU 5219 ; WX 947 ; N uni1463 ; G 1812\nU 5220 ; WX 900 ; N uni1464 ; G 1813\nU 5221 ; WX 947 ; N uni1465 ; G 1814\nU 5222 ; WX 434 ; N uni1466 ; G 1815\nU 5223 ; WX 877 ; N uni1467 ; G 1816\nU 5224 ; WX 877 ; N uni1468 ; G 1817\nU 5225 ; WX 866 ; N uni1469 ; G 1818\nU 5226 ; WX 890 ; N uni146A ; G 1819\nU 5227 ; WX 628 ; N uni146B ; G 1820\nU 5228 ; WX 628 ; N uni146C ; G 1821\nU 5229 ; WX 628 ; N uni146D ; G 1822\nU 5230 ; WX 628 ; N uni146E ; G 1823\nU 5231 ; WX 628 ; N uni146F ; G 1824\nU 5232 ; WX 628 ; N uni1470 ; G 1825\nU 5233 ; WX 628 ; N uni1471 ; G 1826\nU 5234 ; WX 628 ; N uni1472 ; G 1827\nU 5235 ; WX 628 ; N uni1473 ; G 1828\nU 5236 ; WX 860 ; N uni1474 ; G 1829\nU 5237 ; WX 771 ; N uni1475 ; G 1830\nU 5238 ; WX 815 ; N uni1476 ; G 1831\nU 5239 ; WX 816 ; N uni1477 ; G 1832\nU 5240 ; WX 815 ; N uni1478 ; G 1833\nU 5241 ; WX 816 ; N uni1479 ; G 1834\nU 5242 ; WX 860 ; N uni147A ; G 1835\nU 5243 ; WX 771 ; N uni147B ; G 1836\nU 5244 ; WX 860 ; N uni147C ; G 1837\nU 5245 ; WX 771 ; N uni147D ; G 1838\nU 5246 ; WX 815 ; N uni147E ; G 1839\nU 5247 ; WX 816 ; N uni147F ; G 1840\nU 5248 ; WX 815 ; N uni1480 ; G 1841\nU 5249 ; WX 816 ; N uni1481 ; G 1842\nU 5250 ; WX 815 ; N uni1482 ; G 1843\nU 5251 ; WX 407 ; N uni1483 ; G 1844\nU 5252 ; WX 407 ; N uni1484 ; G 1845\nU 5253 ; WX 750 ; N uni1485 ; G 1846\nU 5254 ; WX 775 ; N uni1486 ; G 1847\nU 5255 ; WX 750 ; N uni1487 ; G 1848\nU 5256 ; WX 775 ; N uni1488 ; G 1849\nU 5257 ; WX 628 ; N uni1489 ; G 1850\nU 5258 ; WX 628 ; N uni148A ; G 1851\nU 5259 ; WX 628 ; N uni148B ; G 1852\nU 5260 ; WX 628 ; N uni148C ; G 1853\nU 5261 ; WX 628 ; N uni148D ; G 1854\nU 5262 ; WX 628 ; N uni148E ; G 1855\nU 5263 ; WX 628 ; N uni148F ; G 1856\nU 5264 ; WX 628 ; N uni1490 ; G 1857\nU 5265 ; WX 628 ; N uni1491 ; G 1858\nU 5266 ; WX 860 ; N uni1492 ; G 1859\nU 5267 ; WX 771 ; N uni1493 ; G 1860\nU 5268 ; WX 815 ; N uni1494 ; G 1861\nU 5269 ; WX 816 ; N uni1495 ; G 1862\nU 5270 ; WX 815 ; N uni1496 ; G 1863\nU 5271 ; WX 816 ; N uni1497 ; G 1864\nU 5272 ; WX 860 ; N uni1498 ; G 1865\nU 5273 ; WX 771 ; N uni1499 ; G 1866\nU 5274 ; WX 860 ; N uni149A ; G 1867\nU 5275 ; WX 771 ; N uni149B ; G 1868\nU 5276 ; WX 815 ; N uni149C ; G 1869\nU 5277 ; WX 816 ; N uni149D ; G 1870\nU 5278 ; WX 815 ; N uni149E ; G 1871\nU 5279 ; WX 816 ; N uni149F ; G 1872\nU 5280 ; WX 815 ; N uni14A0 ; G 1873\nU 5281 ; WX 435 ; N uni14A1 ; G 1874\nU 5282 ; WX 435 ; N uni14A2 ; G 1875\nU 5283 ; WX 610 ; N uni14A3 ; G 1876\nU 5284 ; WX 557 ; N uni14A4 ; G 1877\nU 5285 ; WX 557 ; N uni14A5 ; G 1878\nU 5286 ; WX 557 ; N uni14A6 ; G 1879\nU 5287 ; WX 610 ; N uni14A7 ; G 1880\nU 5288 ; WX 610 ; N uni14A8 ; G 1881\nU 5289 ; WX 610 ; N uni14A9 ; G 1882\nU 5290 ; WX 557 ; N uni14AA ; G 1883\nU 5291 ; WX 557 ; N uni14AB ; G 1884\nU 5292 ; WX 749 ; N uni14AC ; G 1885\nU 5293 ; WX 769 ; N uni14AD ; G 1886\nU 5294 ; WX 746 ; N uni14AE ; G 1887\nU 5295 ; WX 764 ; N uni14AF ; G 1888\nU 5296 ; WX 746 ; N uni14B0 ; G 1889\nU 5297 ; WX 764 ; N uni14B1 ; G 1890\nU 5298 ; WX 749 ; N uni14B2 ; G 1891\nU 5299 ; WX 769 ; N uni14B3 ; G 1892\nU 5300 ; WX 749 ; N uni14B4 ; G 1893\nU 5301 ; WX 769 ; N uni14B5 ; G 1894\nU 5302 ; WX 746 ; N uni14B6 ; G 1895\nU 5303 ; WX 764 ; N uni14B7 ; G 1896\nU 5304 ; WX 746 ; N uni14B8 ; G 1897\nU 5305 ; WX 764 ; N uni14B9 ; G 1898\nU 5306 ; WX 746 ; N uni14BA ; G 1899\nU 5307 ; WX 386 ; N uni14BB ; G 1900\nU 5308 ; WX 508 ; N uni14BC ; G 1901\nU 5309 ; WX 386 ; N uni14BD ; G 1902\nU 5312 ; WX 852 ; N uni14C0 ; G 1903\nU 5313 ; WX 852 ; N uni14C1 ; G 1904\nU 5314 ; WX 852 ; N uni14C2 ; G 1905\nU 5315 ; WX 852 ; N uni14C3 ; G 1906\nU 5316 ; WX 852 ; N uni14C4 ; G 1907\nU 5317 ; WX 852 ; N uni14C5 ; G 1908\nU 5318 ; WX 852 ; N uni14C6 ; G 1909\nU 5319 ; WX 852 ; N uni14C7 ; G 1910\nU 5320 ; WX 852 ; N uni14C8 ; G 1911\nU 5321 ; WX 1069 ; N uni14C9 ; G 1912\nU 5322 ; WX 1035 ; N uni14CA ; G 1913\nU 5323 ; WX 1059 ; N uni14CB ; G 1914\nU 5324 ; WX 852 ; N uni14CC ; G 1915\nU 5325 ; WX 1059 ; N uni14CD ; G 1916\nU 5326 ; WX 852 ; N uni14CE ; G 1917\nU 5327 ; WX 852 ; N uni14CF ; G 1918\nU 5328 ; WX 600 ; N uni14D0 ; G 1919\nU 5329 ; WX 453 ; N uni14D1 ; G 1920\nU 5330 ; WX 600 ; N uni14D2 ; G 1921\nU 5331 ; WX 852 ; N uni14D3 ; G 1922\nU 5332 ; WX 852 ; N uni14D4 ; G 1923\nU 5333 ; WX 852 ; N uni14D5 ; G 1924\nU 5334 ; WX 852 ; N uni14D6 ; G 1925\nU 5335 ; WX 852 ; N uni14D7 ; G 1926\nU 5336 ; WX 852 ; N uni14D8 ; G 1927\nU 5337 ; WX 852 ; N uni14D9 ; G 1928\nU 5338 ; WX 852 ; N uni14DA ; G 1929\nU 5339 ; WX 852 ; N uni14DB ; G 1930\nU 5340 ; WX 1069 ; N uni14DC ; G 1931\nU 5341 ; WX 1035 ; N uni14DD ; G 1932\nU 5342 ; WX 1059 ; N uni14DE ; G 1933\nU 5343 ; WX 1030 ; N uni14DF ; G 1934\nU 5344 ; WX 1059 ; N uni14E0 ; G 1935\nU 5345 ; WX 1030 ; N uni14E1 ; G 1936\nU 5346 ; WX 1069 ; N uni14E2 ; G 1937\nU 5347 ; WX 1035 ; N uni14E3 ; G 1938\nU 5348 ; WX 1069 ; N uni14E4 ; G 1939\nU 5349 ; WX 1035 ; N uni14E5 ; G 1940\nU 5350 ; WX 1083 ; N uni14E6 ; G 1941\nU 5351 ; WX 1030 ; N uni14E7 ; G 1942\nU 5352 ; WX 1083 ; N uni14E8 ; G 1943\nU 5353 ; WX 1030 ; N uni14E9 ; G 1944\nU 5354 ; WX 600 ; N uni14EA ; G 1945\nU 5356 ; WX 729 ; N uni14EC ; G 1946\nU 5357 ; WX 603 ; N uni14ED ; G 1947\nU 5358 ; WX 603 ; N uni14EE ; G 1948\nU 5359 ; WX 603 ; N uni14EF ; G 1949\nU 5360 ; WX 603 ; N uni14F0 ; G 1950\nU 5361 ; WX 603 ; N uni14F1 ; G 1951\nU 5362 ; WX 603 ; N uni14F2 ; G 1952\nU 5363 ; WX 603 ; N uni14F3 ; G 1953\nU 5364 ; WX 603 ; N uni14F4 ; G 1954\nU 5365 ; WX 603 ; N uni14F5 ; G 1955\nU 5366 ; WX 834 ; N uni14F6 ; G 1956\nU 5367 ; WX 754 ; N uni14F7 ; G 1957\nU 5368 ; WX 792 ; N uni14F8 ; G 1958\nU 5369 ; WX 771 ; N uni14F9 ; G 1959\nU 5370 ; WX 792 ; N uni14FA ; G 1960\nU 5371 ; WX 771 ; N uni14FB ; G 1961\nU 5372 ; WX 834 ; N uni14FC ; G 1962\nU 5373 ; WX 754 ; N uni14FD ; G 1963\nU 5374 ; WX 834 ; N uni14FE ; G 1964\nU 5375 ; WX 754 ; N uni14FF ; G 1965\nU 5376 ; WX 792 ; N uni1500 ; G 1966\nU 5377 ; WX 771 ; N uni1501 ; G 1967\nU 5378 ; WX 792 ; N uni1502 ; G 1968\nU 5379 ; WX 771 ; N uni1503 ; G 1969\nU 5380 ; WX 792 ; N uni1504 ; G 1970\nU 5381 ; WX 418 ; N uni1505 ; G 1971\nU 5382 ; WX 420 ; N uni1506 ; G 1972\nU 5383 ; WX 418 ; N uni1507 ; G 1973\nU 5392 ; WX 712 ; N uni1510 ; G 1974\nU 5393 ; WX 712 ; N uni1511 ; G 1975\nU 5394 ; WX 712 ; N uni1512 ; G 1976\nU 5395 ; WX 892 ; N uni1513 ; G 1977\nU 5396 ; WX 892 ; N uni1514 ; G 1978\nU 5397 ; WX 892 ; N uni1515 ; G 1979\nU 5398 ; WX 892 ; N uni1516 ; G 1980\nU 5399 ; WX 910 ; N uni1517 ; G 1981\nU 5400 ; WX 872 ; N uni1518 ; G 1982\nU 5401 ; WX 910 ; N uni1519 ; G 1983\nU 5402 ; WX 872 ; N uni151A ; G 1984\nU 5403 ; WX 910 ; N uni151B ; G 1985\nU 5404 ; WX 872 ; N uni151C ; G 1986\nU 5405 ; WX 1140 ; N uni151D ; G 1987\nU 5406 ; WX 1100 ; N uni151E ; G 1988\nU 5407 ; WX 1140 ; N uni151F ; G 1989\nU 5408 ; WX 1100 ; N uni1520 ; G 1990\nU 5409 ; WX 1140 ; N uni1521 ; G 1991\nU 5410 ; WX 1100 ; N uni1522 ; G 1992\nU 5411 ; WX 1140 ; N uni1523 ; G 1993\nU 5412 ; WX 1100 ; N uni1524 ; G 1994\nU 5413 ; WX 641 ; N uni1525 ; G 1995\nU 5414 ; WX 627 ; N uni1526 ; G 1996\nU 5415 ; WX 627 ; N uni1527 ; G 1997\nU 5416 ; WX 627 ; N uni1528 ; G 1998\nU 5417 ; WX 627 ; N uni1529 ; G 1999\nU 5418 ; WX 627 ; N uni152A ; G 2000\nU 5419 ; WX 627 ; N uni152B ; G 2001\nU 5420 ; WX 627 ; N uni152C ; G 2002\nU 5421 ; WX 627 ; N uni152D ; G 2003\nU 5422 ; WX 627 ; N uni152E ; G 2004\nU 5423 ; WX 844 ; N uni152F ; G 2005\nU 5424 ; WX 781 ; N uni1530 ; G 2006\nU 5425 ; WX 816 ; N uni1531 ; G 2007\nU 5426 ; WX 818 ; N uni1532 ; G 2008\nU 5427 ; WX 816 ; N uni1533 ; G 2009\nU 5428 ; WX 818 ; N uni1534 ; G 2010\nU 5429 ; WX 844 ; N uni1535 ; G 2011\nU 5430 ; WX 781 ; N uni1536 ; G 2012\nU 5431 ; WX 844 ; N uni1537 ; G 2013\nU 5432 ; WX 781 ; N uni1538 ; G 2014\nU 5433 ; WX 816 ; N uni1539 ; G 2015\nU 5434 ; WX 818 ; N uni153A ; G 2016\nU 5435 ; WX 816 ; N uni153B ; G 2017\nU 5436 ; WX 818 ; N uni153C ; G 2018\nU 5437 ; WX 816 ; N uni153D ; G 2019\nU 5438 ; WX 418 ; N uni153E ; G 2020\nU 5440 ; WX 389 ; N uni1540 ; G 2021\nU 5441 ; WX 484 ; N uni1541 ; G 2022\nU 5442 ; WX 916 ; N uni1542 ; G 2023\nU 5443 ; WX 916 ; N uni1543 ; G 2024\nU 5444 ; WX 916 ; N uni1544 ; G 2025\nU 5445 ; WX 916 ; N uni1545 ; G 2026\nU 5446 ; WX 916 ; N uni1546 ; G 2027\nU 5447 ; WX 916 ; N uni1547 ; G 2028\nU 5448 ; WX 603 ; N uni1548 ; G 2029\nU 5449 ; WX 603 ; N uni1549 ; G 2030\nU 5450 ; WX 603 ; N uni154A ; G 2031\nU 5451 ; WX 603 ; N uni154B ; G 2032\nU 5452 ; WX 603 ; N uni154C ; G 2033\nU 5453 ; WX 603 ; N uni154D ; G 2034\nU 5454 ; WX 834 ; N uni154E ; G 2035\nU 5455 ; WX 754 ; N uni154F ; G 2036\nU 5456 ; WX 418 ; N uni1550 ; G 2037\nU 5458 ; WX 729 ; N uni1552 ; G 2038\nU 5459 ; WX 684 ; N uni1553 ; G 2039\nU 5460 ; WX 684 ; N uni1554 ; G 2040\nU 5461 ; WX 684 ; N uni1555 ; G 2041\nU 5462 ; WX 684 ; N uni1556 ; G 2042\nU 5463 ; WX 726 ; N uni1557 ; G 2043\nU 5464 ; WX 726 ; N uni1558 ; G 2044\nU 5465 ; WX 726 ; N uni1559 ; G 2045\nU 5466 ; WX 726 ; N uni155A ; G 2046\nU 5467 ; WX 924 ; N uni155B ; G 2047\nU 5468 ; WX 1007 ; N uni155C ; G 2048\nU 5469 ; WX 508 ; N uni155D ; G 2049\nU 5470 ; WX 732 ; N uni155E ; G 2050\nU 5471 ; WX 732 ; N uni155F ; G 2051\nU 5472 ; WX 732 ; N uni1560 ; G 2052\nU 5473 ; WX 732 ; N uni1561 ; G 2053\nU 5474 ; WX 732 ; N uni1562 ; G 2054\nU 5475 ; WX 732 ; N uni1563 ; G 2055\nU 5476 ; WX 730 ; N uni1564 ; G 2056\nU 5477 ; WX 730 ; N uni1565 ; G 2057\nU 5478 ; WX 730 ; N uni1566 ; G 2058\nU 5479 ; WX 730 ; N uni1567 ; G 2059\nU 5480 ; WX 947 ; N uni1568 ; G 2060\nU 5481 ; WX 900 ; N uni1569 ; G 2061\nU 5482 ; WX 508 ; N uni156A ; G 2062\nU 5492 ; WX 831 ; N uni1574 ; G 2063\nU 5493 ; WX 831 ; N uni1575 ; G 2064\nU 5494 ; WX 831 ; N uni1576 ; G 2065\nU 5495 ; WX 831 ; N uni1577 ; G 2066\nU 5496 ; WX 831 ; N uni1578 ; G 2067\nU 5497 ; WX 831 ; N uni1579 ; G 2068\nU 5498 ; WX 831 ; N uni157A ; G 2069\nU 5499 ; WX 563 ; N uni157B ; G 2070\nU 5500 ; WX 752 ; N uni157C ; G 2071\nU 5501 ; WX 484 ; N uni157D ; G 2072\nU 5502 ; WX 1047 ; N uni157E ; G 2073\nU 5503 ; WX 1047 ; N uni157F ; G 2074\nU 5504 ; WX 1047 ; N uni1580 ; G 2075\nU 5505 ; WX 1047 ; N uni1581 ; G 2076\nU 5506 ; WX 1047 ; N uni1582 ; G 2077\nU 5507 ; WX 1047 ; N uni1583 ; G 2078\nU 5508 ; WX 1047 ; N uni1584 ; G 2079\nU 5509 ; WX 825 ; N uni1585 ; G 2080\nU 5514 ; WX 831 ; N uni158A ; G 2081\nU 5515 ; WX 831 ; N uni158B ; G 2082\nU 5516 ; WX 831 ; N uni158C ; G 2083\nU 5517 ; WX 831 ; N uni158D ; G 2084\nU 5518 ; WX 1259 ; N uni158E ; G 2085\nU 5519 ; WX 1259 ; N uni158F ; G 2086\nU 5520 ; WX 1259 ; N uni1590 ; G 2087\nU 5521 ; WX 1002 ; N uni1591 ; G 2088\nU 5522 ; WX 1002 ; N uni1592 ; G 2089\nU 5523 ; WX 1259 ; N uni1593 ; G 2090\nU 5524 ; WX 1259 ; N uni1594 ; G 2091\nU 5525 ; WX 700 ; N uni1595 ; G 2092\nU 5526 ; WX 1073 ; N uni1596 ; G 2093\nU 5536 ; WX 852 ; N uni15A0 ; G 2094\nU 5537 ; WX 852 ; N uni15A1 ; G 2095\nU 5538 ; WX 852 ; N uni15A2 ; G 2096\nU 5539 ; WX 852 ; N uni15A3 ; G 2097\nU 5540 ; WX 852 ; N uni15A4 ; G 2098\nU 5541 ; WX 852 ; N uni15A5 ; G 2099\nU 5542 ; WX 600 ; N uni15A6 ; G 2100\nU 5543 ; WX 643 ; N uni15A7 ; G 2101\nU 5544 ; WX 643 ; N uni15A8 ; G 2102\nU 5545 ; WX 643 ; N uni15A9 ; G 2103\nU 5546 ; WX 643 ; N uni15AA ; G 2104\nU 5547 ; WX 643 ; N uni15AB ; G 2105\nU 5548 ; WX 643 ; N uni15AC ; G 2106\nU 5549 ; WX 643 ; N uni15AD ; G 2107\nU 5550 ; WX 418 ; N uni15AE ; G 2108\nU 5551 ; WX 628 ; N uni15AF ; G 2109\nU 5598 ; WX 770 ; N uni15DE ; G 2110\nU 5601 ; WX 767 ; N uni15E1 ; G 2111\nU 5702 ; WX 468 ; N uni1646 ; G 2112\nU 5703 ; WX 468 ; N uni1647 ; G 2113\nU 5742 ; WX 444 ; N uni166E ; G 2114\nU 5743 ; WX 1047 ; N uni166F ; G 2115\nU 5744 ; WX 1310 ; N uni1670 ; G 2116\nU 5745 ; WX 1632 ; N uni1671 ; G 2117\nU 5746 ; WX 1632 ; N uni1672 ; G 2118\nU 5747 ; WX 1375 ; N uni1673 ; G 2119\nU 5748 ; WX 1375 ; N uni1674 ; G 2120\nU 5749 ; WX 1632 ; N uni1675 ; G 2121\nU 5750 ; WX 1632 ; N uni1676 ; G 2122\nU 5760 ; WX 477 ; N uni1680 ; G 2123\nU 5761 ; WX 493 ; N uni1681 ; G 2124\nU 5762 ; WX 712 ; N uni1682 ; G 2125\nU 5763 ; WX 931 ; N uni1683 ; G 2126\nU 5764 ; WX 1150 ; N uni1684 ; G 2127\nU 5765 ; WX 1370 ; N uni1685 ; G 2128\nU 5766 ; WX 493 ; N uni1686 ; G 2129\nU 5767 ; WX 712 ; N uni1687 ; G 2130\nU 5768 ; WX 931 ; N uni1688 ; G 2131\nU 5769 ; WX 1150 ; N uni1689 ; G 2132\nU 5770 ; WX 1370 ; N uni168A ; G 2133\nU 5771 ; WX 498 ; N uni168B ; G 2134\nU 5772 ; WX 718 ; N uni168C ; G 2135\nU 5773 ; WX 938 ; N uni168D ; G 2136\nU 5774 ; WX 1159 ; N uni168E ; G 2137\nU 5775 ; WX 1379 ; N uni168F ; G 2138\nU 5776 ; WX 493 ; N uni1690 ; G 2139\nU 5777 ; WX 712 ; N uni1691 ; G 2140\nU 5778 ; WX 930 ; N uni1692 ; G 2141\nU 5779 ; WX 1149 ; N uni1693 ; G 2142\nU 5780 ; WX 1370 ; N uni1694 ; G 2143\nU 5781 ; WX 498 ; N uni1695 ; G 2144\nU 5782 ; WX 752 ; N uni1696 ; G 2145\nU 5783 ; WX 789 ; N uni1697 ; G 2146\nU 5784 ; WX 1205 ; N uni1698 ; G 2147\nU 5785 ; WX 1150 ; N uni1699 ; G 2148\nU 5786 ; WX 683 ; N uni169A ; G 2149\nU 5787 ; WX 507 ; N uni169B ; G 2150\nU 5788 ; WX 507 ; N uni169C ; G 2151\nU 7424 ; WX 592 ; N uni1D00 ; G 2152\nU 7425 ; WX 717 ; N uni1D01 ; G 2153\nU 7426 ; WX 982 ; N uni1D02 ; G 2154\nU 7427 ; WX 586 ; N uni1D03 ; G 2155\nU 7428 ; WX 550 ; N uni1D04 ; G 2156\nU 7429 ; WX 605 ; N uni1D05 ; G 2157\nU 7430 ; WX 605 ; N uni1D06 ; G 2158\nU 7431 ; WX 491 ; N uni1D07 ; G 2159\nU 7432 ; WX 541 ; N uni1D08 ; G 2160\nU 7433 ; WX 278 ; N uni1D09 ; G 2161\nU 7434 ; WX 395 ; N uni1D0A ; G 2162\nU 7435 ; WX 579 ; N uni1D0B ; G 2163\nU 7436 ; WX 583 ; N uni1D0C ; G 2164\nU 7437 ; WX 754 ; N uni1D0D ; G 2165\nU 7438 ; WX 650 ; N uni1D0E ; G 2166\nU 7439 ; WX 612 ; N uni1D0F ; G 2167\nU 7440 ; WX 550 ; N uni1D10 ; G 2168\nU 7441 ; WX 684 ; N uni1D11 ; G 2169\nU 7442 ; WX 684 ; N uni1D12 ; G 2170\nU 7443 ; WX 684 ; N uni1D13 ; G 2171\nU 7444 ; WX 1023 ; N uni1D14 ; G 2172\nU 7446 ; WX 612 ; N uni1D16 ; G 2173\nU 7447 ; WX 612 ; N uni1D17 ; G 2174\nU 7448 ; WX 524 ; N uni1D18 ; G 2175\nU 7449 ; WX 602 ; N uni1D19 ; G 2176\nU 7450 ; WX 602 ; N uni1D1A ; G 2177\nU 7451 ; WX 583 ; N uni1D1B ; G 2178\nU 7452 ; WX 574 ; N uni1D1C ; G 2179\nU 7453 ; WX 737 ; N uni1D1D ; G 2180\nU 7454 ; WX 948 ; N uni1D1E ; G 2181\nU 7455 ; WX 638 ; N uni1D1F ; G 2182\nU 7456 ; WX 592 ; N uni1D20 ; G 2183\nU 7457 ; WX 818 ; N uni1D21 ; G 2184\nU 7458 ; WX 525 ; N uni1D22 ; G 2185\nU 7459 ; WX 526 ; N uni1D23 ; G 2186\nU 7462 ; WX 583 ; N uni1D26 ; G 2187\nU 7463 ; WX 592 ; N uni1D27 ; G 2188\nU 7464 ; WX 564 ; N uni1D28 ; G 2189\nU 7465 ; WX 524 ; N uni1D29 ; G 2190\nU 7466 ; WX 590 ; N uni1D2A ; G 2191\nU 7467 ; WX 639 ; N uni1D2B ; G 2192\nU 7468 ; WX 431 ; N uni1D2C ; G 2193\nU 7469 ; WX 613 ; N uni1D2D ; G 2194\nU 7470 ; WX 432 ; N uni1D2E ; G 2195\nU 7472 ; WX 485 ; N uni1D30 ; G 2196\nU 7473 ; WX 398 ; N uni1D31 ; G 2197\nU 7474 ; WX 398 ; N uni1D32 ; G 2198\nU 7475 ; WX 488 ; N uni1D33 ; G 2199\nU 7476 ; WX 474 ; N uni1D34 ; G 2200\nU 7477 ; WX 186 ; N uni1D35 ; G 2201\nU 7478 ; WX 186 ; N uni1D36 ; G 2202\nU 7479 ; WX 413 ; N uni1D37 ; G 2203\nU 7480 ; WX 351 ; N uni1D38 ; G 2204\nU 7481 ; WX 543 ; N uni1D39 ; G 2205\nU 7482 ; WX 471 ; N uni1D3A ; G 2206\nU 7483 ; WX 471 ; N uni1D3B ; G 2207\nU 7484 ; WX 496 ; N uni1D3C ; G 2208\nU 7485 ; WX 439 ; N uni1D3D ; G 2209\nU 7486 ; WX 380 ; N uni1D3E ; G 2210\nU 7487 ; WX 438 ; N uni1D3F ; G 2211\nU 7488 ; WX 385 ; N uni1D40 ; G 2212\nU 7489 ; WX 461 ; N uni1D41 ; G 2213\nU 7490 ; WX 623 ; N uni1D42 ; G 2214\nU 7491 ; WX 392 ; N uni1D43 ; G 2215\nU 7492 ; WX 392 ; N uni1D44 ; G 2216\nU 7493 ; WX 405 ; N uni1D45 ; G 2217\nU 7494 ; WX 648 ; N uni1D46 ; G 2218\nU 7495 ; WX 428 ; N uni1D47 ; G 2219\nU 7496 ; WX 405 ; N uni1D48 ; G 2220\nU 7497 ; WX 417 ; N uni1D49 ; G 2221\nU 7498 ; WX 417 ; N uni1D4A ; G 2222\nU 7499 ; WX 360 ; N uni1D4B ; G 2223\nU 7500 ; WX 359 ; N uni1D4C ; G 2224\nU 7501 ; WX 405 ; N uni1D4D ; G 2225\nU 7502 ; WX 179 ; N uni1D4E ; G 2226\nU 7503 ; WX 426 ; N uni1D4F ; G 2227\nU 7504 ; WX 623 ; N uni1D50 ; G 2228\nU 7505 ; WX 409 ; N uni1D51 ; G 2229\nU 7506 ; WX 414 ; N uni1D52 ; G 2230\nU 7507 ; WX 370 ; N uni1D53 ; G 2231\nU 7508 ; WX 414 ; N uni1D54 ; G 2232\nU 7509 ; WX 414 ; N uni1D55 ; G 2233\nU 7510 ; WX 428 ; N uni1D56 ; G 2234\nU 7511 ; WX 295 ; N uni1D57 ; G 2235\nU 7512 ; WX 405 ; N uni1D58 ; G 2236\nU 7513 ; WX 470 ; N uni1D59 ; G 2237\nU 7514 ; WX 623 ; N uni1D5A ; G 2238\nU 7515 ; WX 417 ; N uni1D5B ; G 2239\nU 7517 ; WX 402 ; N uni1D5D ; G 2240\nU 7518 ; WX 373 ; N uni1D5E ; G 2241\nU 7519 ; WX 385 ; N uni1D5F ; G 2242\nU 7520 ; WX 416 ; N uni1D60 ; G 2243\nU 7521 ; WX 364 ; N uni1D61 ; G 2244\nU 7522 ; WX 179 ; N uni1D62 ; G 2245\nU 7523 ; WX 259 ; N uni1D63 ; G 2246\nU 7524 ; WX 405 ; N uni1D64 ; G 2247\nU 7525 ; WX 417 ; N uni1D65 ; G 2248\nU 7526 ; WX 402 ; N uni1D66 ; G 2249\nU 7527 ; WX 373 ; N uni1D67 ; G 2250\nU 7528 ; WX 412 ; N uni1D68 ; G 2251\nU 7529 ; WX 416 ; N uni1D69 ; G 2252\nU 7530 ; WX 364 ; N uni1D6A ; G 2253\nU 7543 ; WX 635 ; N uni1D77 ; G 2254\nU 7544 ; WX 474 ; N uni1D78 ; G 2255\nU 7547 ; WX 372 ; N uni1D7B ; G 2256\nU 7549 ; WX 667 ; N uni1D7D ; G 2257\nU 7557 ; WX 278 ; N uni1D85 ; G 2258\nU 7579 ; WX 405 ; N uni1D9B ; G 2259\nU 7580 ; WX 370 ; N uni1D9C ; G 2260\nU 7581 ; WX 370 ; N uni1D9D ; G 2261\nU 7582 ; WX 414 ; N uni1D9E ; G 2262\nU 7583 ; WX 360 ; N uni1D9F ; G 2263\nU 7584 ; WX 296 ; N uni1DA0 ; G 2264\nU 7585 ; WX 233 ; N uni1DA1 ; G 2265\nU 7586 ; WX 405 ; N uni1DA2 ; G 2266\nU 7587 ; WX 405 ; N uni1DA3 ; G 2267\nU 7588 ; WX 261 ; N uni1DA4 ; G 2268\nU 7589 ; WX 250 ; N uni1DA5 ; G 2269\nU 7590 ; WX 261 ; N uni1DA6 ; G 2270\nU 7591 ; WX 261 ; N uni1DA7 ; G 2271\nU 7592 ; WX 234 ; N uni1DA8 ; G 2272\nU 7593 ; WX 250 ; N uni1DA9 ; G 2273\nU 7594 ; WX 235 ; N uni1DAA ; G 2274\nU 7595 ; WX 376 ; N uni1DAB ; G 2275\nU 7596 ; WX 623 ; N uni1DAC ; G 2276\nU 7597 ; WX 623 ; N uni1DAD ; G 2277\nU 7598 ; WX 411 ; N uni1DAE ; G 2278\nU 7599 ; WX 479 ; N uni1DAF ; G 2279\nU 7600 ; WX 409 ; N uni1DB0 ; G 2280\nU 7601 ; WX 414 ; N uni1DB1 ; G 2281\nU 7602 ; WX 414 ; N uni1DB2 ; G 2282\nU 7603 ; WX 360 ; N uni1DB3 ; G 2283\nU 7604 ; WX 287 ; N uni1DB4 ; G 2284\nU 7605 ; WX 295 ; N uni1DB5 ; G 2285\nU 7606 ; WX 508 ; N uni1DB6 ; G 2286\nU 7607 ; WX 418 ; N uni1DB7 ; G 2287\nU 7608 ; WX 361 ; N uni1DB8 ; G 2288\nU 7609 ; WX 406 ; N uni1DB9 ; G 2289\nU 7610 ; WX 417 ; N uni1DBA ; G 2290\nU 7611 ; WX 366 ; N uni1DBB ; G 2291\nU 7612 ; WX 437 ; N uni1DBC ; G 2292\nU 7613 ; WX 366 ; N uni1DBD ; G 2293\nU 7614 ; WX 392 ; N uni1DBE ; G 2294\nU 7615 ; WX 414 ; N uni1DBF ; G 2295\nU 7620 ; WX 0 ; N uni1DC4 ; G 2296\nU 7621 ; WX 0 ; N uni1DC5 ; G 2297\nU 7622 ; WX 0 ; N uni1DC6 ; G 2298\nU 7623 ; WX 0 ; N uni1DC7 ; G 2299\nU 7624 ; WX 0 ; N uni1DC8 ; G 2300\nU 7625 ; WX 0 ; N uni1DC9 ; G 2301\nU 7680 ; WX 684 ; N uni1E00 ; G 2302\nU 7681 ; WX 613 ; N uni1E01 ; G 2303\nU 7682 ; WX 686 ; N uni1E02 ; G 2304\nU 7683 ; WX 635 ; N uni1E03 ; G 2305\nU 7684 ; WX 686 ; N uni1E04 ; G 2306\nU 7685 ; WX 635 ; N uni1E05 ; G 2307\nU 7686 ; WX 686 ; N uni1E06 ; G 2308\nU 7687 ; WX 635 ; N uni1E07 ; G 2309\nU 7688 ; WX 698 ; N uni1E08 ; G 2310\nU 7689 ; WX 550 ; N uni1E09 ; G 2311\nU 7690 ; WX 770 ; N uni1E0A ; G 2312\nU 7691 ; WX 635 ; N uni1E0B ; G 2313\nU 7692 ; WX 770 ; N uni1E0C ; G 2314\nU 7693 ; WX 635 ; N uni1E0D ; G 2315\nU 7694 ; WX 770 ; N uni1E0E ; G 2316\nU 7695 ; WX 635 ; N uni1E0F ; G 2317\nU 7696 ; WX 770 ; N uni1E10 ; G 2318\nU 7697 ; WX 635 ; N uni1E11 ; G 2319\nU 7698 ; WX 770 ; N uni1E12 ; G 2320\nU 7699 ; WX 635 ; N uni1E13 ; G 2321\nU 7700 ; WX 632 ; N uni1E14 ; G 2322\nU 7701 ; WX 615 ; N uni1E15 ; G 2323\nU 7702 ; WX 632 ; N uni1E16 ; G 2324\nU 7703 ; WX 615 ; N uni1E17 ; G 2325\nU 7704 ; WX 632 ; N uni1E18 ; G 2326\nU 7705 ; WX 615 ; N uni1E19 ; G 2327\nU 7706 ; WX 632 ; N uni1E1A ; G 2328\nU 7707 ; WX 615 ; N uni1E1B ; G 2329\nU 7708 ; WX 632 ; N uni1E1C ; G 2330\nU 7709 ; WX 615 ; N uni1E1D ; G 2331\nU 7710 ; WX 575 ; N uni1E1E ; G 2332\nU 7711 ; WX 352 ; N uni1E1F ; G 2333\nU 7712 ; WX 775 ; N uni1E20 ; G 2334\nU 7713 ; WX 635 ; N uni1E21 ; G 2335\nU 7714 ; WX 752 ; N uni1E22 ; G 2336\nU 7715 ; WX 634 ; N uni1E23 ; G 2337\nU 7716 ; WX 752 ; N uni1E24 ; G 2338\nU 7717 ; WX 634 ; N uni1E25 ; G 2339\nU 7718 ; WX 752 ; N uni1E26 ; G 2340\nU 7719 ; WX 634 ; N uni1E27 ; G 2341\nU 7720 ; WX 752 ; N uni1E28 ; G 2342\nU 7721 ; WX 634 ; N uni1E29 ; G 2343\nU 7722 ; WX 752 ; N uni1E2A ; G 2344\nU 7723 ; WX 634 ; N uni1E2B ; G 2345\nU 7724 ; WX 295 ; N uni1E2C ; G 2346\nU 7725 ; WX 278 ; N uni1E2D ; G 2347\nU 7726 ; WX 295 ; N uni1E2E ; G 2348\nU 7727 ; WX 278 ; N uni1E2F ; G 2349\nU 7728 ; WX 656 ; N uni1E30 ; G 2350\nU 7729 ; WX 579 ; N uni1E31 ; G 2351\nU 7730 ; WX 656 ; N uni1E32 ; G 2352\nU 7731 ; WX 579 ; N uni1E33 ; G 2353\nU 7732 ; WX 656 ; N uni1E34 ; G 2354\nU 7733 ; WX 579 ; N uni1E35 ; G 2355\nU 7734 ; WX 557 ; N uni1E36 ; G 2356\nU 7735 ; WX 288 ; N uni1E37 ; G 2357\nU 7736 ; WX 557 ; N uni1E38 ; G 2358\nU 7737 ; WX 288 ; N uni1E39 ; G 2359\nU 7738 ; WX 557 ; N uni1E3A ; G 2360\nU 7739 ; WX 278 ; N uni1E3B ; G 2361\nU 7740 ; WX 557 ; N uni1E3C ; G 2362\nU 7741 ; WX 278 ; N uni1E3D ; G 2363\nU 7742 ; WX 863 ; N uni1E3E ; G 2364\nU 7743 ; WX 974 ; N uni1E3F ; G 2365\nU 7744 ; WX 863 ; N uni1E40 ; G 2366\nU 7745 ; WX 974 ; N uni1E41 ; G 2367\nU 7746 ; WX 863 ; N uni1E42 ; G 2368\nU 7747 ; WX 974 ; N uni1E43 ; G 2369\nU 7748 ; WX 748 ; N uni1E44 ; G 2370\nU 7749 ; WX 634 ; N uni1E45 ; G 2371\nU 7750 ; WX 748 ; N uni1E46 ; G 2372\nU 7751 ; WX 634 ; N uni1E47 ; G 2373\nU 7752 ; WX 748 ; N uni1E48 ; G 2374\nU 7753 ; WX 634 ; N uni1E49 ; G 2375\nU 7754 ; WX 748 ; N uni1E4A ; G 2376\nU 7755 ; WX 634 ; N uni1E4B ; G 2377\nU 7756 ; WX 787 ; N uni1E4C ; G 2378\nU 7757 ; WX 612 ; N uni1E4D ; G 2379\nU 7758 ; WX 787 ; N uni1E4E ; G 2380\nU 7759 ; WX 612 ; N uni1E4F ; G 2381\nU 7760 ; WX 787 ; N uni1E50 ; G 2382\nU 7761 ; WX 612 ; N uni1E51 ; G 2383\nU 7762 ; WX 787 ; N uni1E52 ; G 2384\nU 7763 ; WX 612 ; N uni1E53 ; G 2385\nU 7764 ; WX 603 ; N uni1E54 ; G 2386\nU 7765 ; WX 635 ; N uni1E55 ; G 2387\nU 7766 ; WX 603 ; N uni1E56 ; G 2388\nU 7767 ; WX 635 ; N uni1E57 ; G 2389\nU 7768 ; WX 695 ; N uni1E58 ; G 2390\nU 7769 ; WX 411 ; N uni1E59 ; G 2391\nU 7770 ; WX 695 ; N uni1E5A ; G 2392\nU 7771 ; WX 411 ; N uni1E5B ; G 2393\nU 7772 ; WX 695 ; N uni1E5C ; G 2394\nU 7773 ; WX 411 ; N uni1E5D ; G 2395\nU 7774 ; WX 695 ; N uni1E5E ; G 2396\nU 7775 ; WX 411 ; N uni1E5F ; G 2397\nU 7776 ; WX 635 ; N uni1E60 ; G 2398\nU 7777 ; WX 521 ; N uni1E61 ; G 2399\nU 7778 ; WX 635 ; N uni1E62 ; G 2400\nU 7779 ; WX 521 ; N uni1E63 ; G 2401\nU 7780 ; WX 635 ; N uni1E64 ; G 2402\nU 7781 ; WX 521 ; N uni1E65 ; G 2403\nU 7782 ; WX 635 ; N uni1E66 ; G 2404\nU 7783 ; WX 521 ; N uni1E67 ; G 2405\nU 7784 ; WX 635 ; N uni1E68 ; G 2406\nU 7785 ; WX 521 ; N uni1E69 ; G 2407\nU 7786 ; WX 611 ; N uni1E6A ; G 2408\nU 7787 ; WX 392 ; N uni1E6B ; G 2409\nU 7788 ; WX 611 ; N uni1E6C ; G 2410\nU 7789 ; WX 392 ; N uni1E6D ; G 2411\nU 7790 ; WX 611 ; N uni1E6E ; G 2412\nU 7791 ; WX 392 ; N uni1E6F ; G 2413\nU 7792 ; WX 611 ; N uni1E70 ; G 2414\nU 7793 ; WX 392 ; N uni1E71 ; G 2415\nU 7794 ; WX 732 ; N uni1E72 ; G 2416\nU 7795 ; WX 634 ; N uni1E73 ; G 2417\nU 7796 ; WX 732 ; N uni1E74 ; G 2418\nU 7797 ; WX 634 ; N uni1E75 ; G 2419\nU 7798 ; WX 732 ; N uni1E76 ; G 2420\nU 7799 ; WX 634 ; N uni1E77 ; G 2421\nU 7800 ; WX 732 ; N uni1E78 ; G 2422\nU 7801 ; WX 634 ; N uni1E79 ; G 2423\nU 7802 ; WX 732 ; N uni1E7A ; G 2424\nU 7803 ; WX 634 ; N uni1E7B ; G 2425\nU 7804 ; WX 684 ; N uni1E7C ; G 2426\nU 7805 ; WX 592 ; N uni1E7D ; G 2427\nU 7806 ; WX 684 ; N uni1E7E ; G 2428\nU 7807 ; WX 592 ; N uni1E7F ; G 2429\nU 7808 ; WX 989 ; N Wgrave ; G 2430\nU 7809 ; WX 818 ; N wgrave ; G 2431\nU 7810 ; WX 989 ; N Wacute ; G 2432\nU 7811 ; WX 818 ; N wacute ; G 2433\nU 7812 ; WX 989 ; N Wdieresis ; G 2434\nU 7813 ; WX 818 ; N wdieresis ; G 2435\nU 7814 ; WX 989 ; N uni1E86 ; G 2436\nU 7815 ; WX 818 ; N uni1E87 ; G 2437\nU 7816 ; WX 989 ; N uni1E88 ; G 2438\nU 7817 ; WX 818 ; N uni1E89 ; G 2439\nU 7818 ; WX 685 ; N uni1E8A ; G 2440\nU 7819 ; WX 592 ; N uni1E8B ; G 2441\nU 7820 ; WX 685 ; N uni1E8C ; G 2442\nU 7821 ; WX 592 ; N uni1E8D ; G 2443\nU 7822 ; WX 611 ; N uni1E8E ; G 2444\nU 7823 ; WX 592 ; N uni1E8F ; G 2445\nU 7824 ; WX 685 ; N uni1E90 ; G 2446\nU 7825 ; WX 525 ; N uni1E91 ; G 2447\nU 7826 ; WX 685 ; N uni1E92 ; G 2448\nU 7827 ; WX 525 ; N uni1E93 ; G 2449\nU 7828 ; WX 685 ; N uni1E94 ; G 2450\nU 7829 ; WX 525 ; N uni1E95 ; G 2451\nU 7830 ; WX 634 ; N uni1E96 ; G 2452\nU 7831 ; WX 392 ; N uni1E97 ; G 2453\nU 7832 ; WX 818 ; N uni1E98 ; G 2454\nU 7833 ; WX 592 ; N uni1E99 ; G 2455\nU 7834 ; WX 613 ; N uni1E9A ; G 2456\nU 7835 ; WX 352 ; N uni1E9B ; G 2457\nU 7836 ; WX 352 ; N uni1E9C ; G 2458\nU 7837 ; WX 352 ; N uni1E9D ; G 2459\nU 7838 ; WX 769 ; N uni1E9E ; G 2460\nU 7839 ; WX 612 ; N uni1E9F ; G 2461\nU 7840 ; WX 684 ; N uni1EA0 ; G 2462\nU 7841 ; WX 613 ; N uni1EA1 ; G 2463\nU 7842 ; WX 684 ; N uni1EA2 ; G 2464\nU 7843 ; WX 613 ; N uni1EA3 ; G 2465\nU 7844 ; WX 684 ; N uni1EA4 ; G 2466\nU 7845 ; WX 613 ; N uni1EA5 ; G 2467\nU 7846 ; WX 684 ; N uni1EA6 ; G 2468\nU 7847 ; WX 613 ; N uni1EA7 ; G 2469\nU 7848 ; WX 684 ; N uni1EA8 ; G 2470\nU 7849 ; WX 613 ; N uni1EA9 ; G 2471\nU 7850 ; WX 684 ; N uni1EAA ; G 2472\nU 7851 ; WX 613 ; N uni1EAB ; G 2473\nU 7852 ; WX 684 ; N uni1EAC ; G 2474\nU 7853 ; WX 613 ; N uni1EAD ; G 2475\nU 7854 ; WX 684 ; N uni1EAE ; G 2476\nU 7855 ; WX 613 ; N uni1EAF ; G 2477\nU 7856 ; WX 684 ; N uni1EB0 ; G 2478\nU 7857 ; WX 613 ; N uni1EB1 ; G 2479\nU 7858 ; WX 684 ; N uni1EB2 ; G 2480\nU 7859 ; WX 613 ; N uni1EB3 ; G 2481\nU 7860 ; WX 684 ; N uni1EB4 ; G 2482\nU 7861 ; WX 613 ; N uni1EB5 ; G 2483\nU 7862 ; WX 684 ; N uni1EB6 ; G 2484\nU 7863 ; WX 613 ; N uni1EB7 ; G 2485\nU 7864 ; WX 632 ; N uni1EB8 ; G 2486\nU 7865 ; WX 615 ; N uni1EB9 ; G 2487\nU 7866 ; WX 632 ; N uni1EBA ; G 2488\nU 7867 ; WX 615 ; N uni1EBB ; G 2489\nU 7868 ; WX 632 ; N uni1EBC ; G 2490\nU 7869 ; WX 615 ; N uni1EBD ; G 2491\nU 7870 ; WX 632 ; N uni1EBE ; G 2492\nU 7871 ; WX 615 ; N uni1EBF ; G 2493\nU 7872 ; WX 632 ; N uni1EC0 ; G 2494\nU 7873 ; WX 615 ; N uni1EC1 ; G 2495\nU 7874 ; WX 632 ; N uni1EC2 ; G 2496\nU 7875 ; WX 615 ; N uni1EC3 ; G 2497\nU 7876 ; WX 632 ; N uni1EC4 ; G 2498\nU 7877 ; WX 615 ; N uni1EC5 ; G 2499\nU 7878 ; WX 632 ; N uni1EC6 ; G 2500\nU 7879 ; WX 615 ; N uni1EC7 ; G 2501\nU 7880 ; WX 295 ; N uni1EC8 ; G 2502\nU 7881 ; WX 278 ; N uni1EC9 ; G 2503\nU 7882 ; WX 295 ; N uni1ECA ; G 2504\nU 7883 ; WX 278 ; N uni1ECB ; G 2505\nU 7884 ; WX 787 ; N uni1ECC ; G 2506\nU 7885 ; WX 612 ; N uni1ECD ; G 2507\nU 7886 ; WX 787 ; N uni1ECE ; G 2508\nU 7887 ; WX 612 ; N uni1ECF ; G 2509\nU 7888 ; WX 787 ; N uni1ED0 ; G 2510\nU 7889 ; WX 612 ; N uni1ED1 ; G 2511\nU 7890 ; WX 787 ; N uni1ED2 ; G 2512\nU 7891 ; WX 612 ; N uni1ED3 ; G 2513\nU 7892 ; WX 787 ; N uni1ED4 ; G 2514\nU 7893 ; WX 612 ; N uni1ED5 ; G 2515\nU 7894 ; WX 787 ; N uni1ED6 ; G 2516\nU 7895 ; WX 612 ; N uni1ED7 ; G 2517\nU 7896 ; WX 787 ; N uni1ED8 ; G 2518\nU 7897 ; WX 612 ; N uni1ED9 ; G 2519\nU 7898 ; WX 913 ; N uni1EDA ; G 2520\nU 7899 ; WX 612 ; N uni1EDB ; G 2521\nU 7900 ; WX 913 ; N uni1EDC ; G 2522\nU 7901 ; WX 612 ; N uni1EDD ; G 2523\nU 7902 ; WX 913 ; N uni1EDE ; G 2524\nU 7903 ; WX 612 ; N uni1EDF ; G 2525\nU 7904 ; WX 913 ; N uni1EE0 ; G 2526\nU 7905 ; WX 612 ; N uni1EE1 ; G 2527\nU 7906 ; WX 913 ; N uni1EE2 ; G 2528\nU 7907 ; WX 612 ; N uni1EE3 ; G 2529\nU 7908 ; WX 732 ; N uni1EE4 ; G 2530\nU 7909 ; WX 634 ; N uni1EE5 ; G 2531\nU 7910 ; WX 732 ; N uni1EE6 ; G 2532\nU 7911 ; WX 634 ; N uni1EE7 ; G 2533\nU 7912 ; WX 858 ; N uni1EE8 ; G 2534\nU 7913 ; WX 634 ; N uni1EE9 ; G 2535\nU 7914 ; WX 858 ; N uni1EEA ; G 2536\nU 7915 ; WX 634 ; N uni1EEB ; G 2537\nU 7916 ; WX 858 ; N uni1EEC ; G 2538\nU 7917 ; WX 634 ; N uni1EED ; G 2539\nU 7918 ; WX 858 ; N uni1EEE ; G 2540\nU 7919 ; WX 634 ; N uni1EEF ; G 2541\nU 7920 ; WX 858 ; N uni1EF0 ; G 2542\nU 7921 ; WX 634 ; N uni1EF1 ; G 2543\nU 7922 ; WX 611 ; N Ygrave ; G 2544\nU 7923 ; WX 592 ; N ygrave ; G 2545\nU 7924 ; WX 611 ; N uni1EF4 ; G 2546\nU 7925 ; WX 592 ; N uni1EF5 ; G 2547\nU 7926 ; WX 611 ; N uni1EF6 ; G 2548\nU 7927 ; WX 592 ; N uni1EF7 ; G 2549\nU 7928 ; WX 611 ; N uni1EF8 ; G 2550\nU 7929 ; WX 592 ; N uni1EF9 ; G 2551\nU 7930 ; WX 769 ; N uni1EFA ; G 2552\nU 7931 ; WX 477 ; N uni1EFB ; G 2553\nU 7936 ; WX 659 ; N uni1F00 ; G 2554\nU 7937 ; WX 659 ; N uni1F01 ; G 2555\nU 7938 ; WX 659 ; N uni1F02 ; G 2556\nU 7939 ; WX 659 ; N uni1F03 ; G 2557\nU 7940 ; WX 659 ; N uni1F04 ; G 2558\nU 7941 ; WX 659 ; N uni1F05 ; G 2559\nU 7942 ; WX 659 ; N uni1F06 ; G 2560\nU 7943 ; WX 659 ; N uni1F07 ; G 2561\nU 7944 ; WX 684 ; N uni1F08 ; G 2562\nU 7945 ; WX 684 ; N uni1F09 ; G 2563\nU 7946 ; WX 877 ; N uni1F0A ; G 2564\nU 7947 ; WX 877 ; N uni1F0B ; G 2565\nU 7948 ; WX 769 ; N uni1F0C ; G 2566\nU 7949 ; WX 801 ; N uni1F0D ; G 2567\nU 7950 ; WX 708 ; N uni1F0E ; G 2568\nU 7951 ; WX 743 ; N uni1F0F ; G 2569\nU 7952 ; WX 541 ; N uni1F10 ; G 2570\nU 7953 ; WX 541 ; N uni1F11 ; G 2571\nU 7954 ; WX 541 ; N uni1F12 ; G 2572\nU 7955 ; WX 541 ; N uni1F13 ; G 2573\nU 7956 ; WX 541 ; N uni1F14 ; G 2574\nU 7957 ; WX 541 ; N uni1F15 ; G 2575\nU 7960 ; WX 711 ; N uni1F18 ; G 2576\nU 7961 ; WX 711 ; N uni1F19 ; G 2577\nU 7962 ; WX 966 ; N uni1F1A ; G 2578\nU 7963 ; WX 975 ; N uni1F1B ; G 2579\nU 7964 ; WX 898 ; N uni1F1C ; G 2580\nU 7965 ; WX 928 ; N uni1F1D ; G 2581\nU 7968 ; WX 634 ; N uni1F20 ; G 2582\nU 7969 ; WX 634 ; N uni1F21 ; G 2583\nU 7970 ; WX 634 ; N uni1F22 ; G 2584\nU 7971 ; WX 634 ; N uni1F23 ; G 2585\nU 7972 ; WX 634 ; N uni1F24 ; G 2586\nU 7973 ; WX 634 ; N uni1F25 ; G 2587\nU 7974 ; WX 634 ; N uni1F26 ; G 2588\nU 7975 ; WX 634 ; N uni1F27 ; G 2589\nU 7976 ; WX 837 ; N uni1F28 ; G 2590\nU 7977 ; WX 835 ; N uni1F29 ; G 2591\nU 7978 ; WX 1086 ; N uni1F2A ; G 2592\nU 7979 ; WX 1089 ; N uni1F2B ; G 2593\nU 7980 ; WX 1027 ; N uni1F2C ; G 2594\nU 7981 ; WX 1051 ; N uni1F2D ; G 2595\nU 7982 ; WX 934 ; N uni1F2E ; G 2596\nU 7983 ; WX 947 ; N uni1F2F ; G 2597\nU 7984 ; WX 338 ; N uni1F30 ; G 2598\nU 7985 ; WX 338 ; N uni1F31 ; G 2599\nU 7986 ; WX 338 ; N uni1F32 ; G 2600\nU 7987 ; WX 338 ; N uni1F33 ; G 2601\nU 7988 ; WX 338 ; N uni1F34 ; G 2602\nU 7989 ; WX 338 ; N uni1F35 ; G 2603\nU 7990 ; WX 338 ; N uni1F36 ; G 2604\nU 7991 ; WX 338 ; N uni1F37 ; G 2605\nU 7992 ; WX 380 ; N uni1F38 ; G 2606\nU 7993 ; WX 374 ; N uni1F39 ; G 2607\nU 7994 ; WX 635 ; N uni1F3A ; G 2608\nU 7995 ; WX 635 ; N uni1F3B ; G 2609\nU 7996 ; WX 570 ; N uni1F3C ; G 2610\nU 7997 ; WX 600 ; N uni1F3D ; G 2611\nU 7998 ; WX 489 ; N uni1F3E ; G 2612\nU 7999 ; WX 493 ; N uni1F3F ; G 2613\nU 8000 ; WX 612 ; N uni1F40 ; G 2614\nU 8001 ; WX 612 ; N uni1F41 ; G 2615\nU 8002 ; WX 612 ; N uni1F42 ; G 2616\nU 8003 ; WX 612 ; N uni1F43 ; G 2617\nU 8004 ; WX 612 ; N uni1F44 ; G 2618\nU 8005 ; WX 612 ; N uni1F45 ; G 2619\nU 8008 ; WX 804 ; N uni1F48 ; G 2620\nU 8009 ; WX 848 ; N uni1F49 ; G 2621\nU 8010 ; WX 1095 ; N uni1F4A ; G 2622\nU 8011 ; WX 1100 ; N uni1F4B ; G 2623\nU 8012 ; WX 938 ; N uni1F4C ; G 2624\nU 8013 ; WX 970 ; N uni1F4D ; G 2625\nU 8016 ; WX 579 ; N uni1F50 ; G 2626\nU 8017 ; WX 579 ; N uni1F51 ; G 2627\nU 8018 ; WX 579 ; N uni1F52 ; G 2628\nU 8019 ; WX 579 ; N uni1F53 ; G 2629\nU 8020 ; WX 579 ; N uni1F54 ; G 2630\nU 8021 ; WX 579 ; N uni1F55 ; G 2631\nU 8022 ; WX 579 ; N uni1F56 ; G 2632\nU 8023 ; WX 579 ; N uni1F57 ; G 2633\nU 8025 ; WX 784 ; N uni1F59 ; G 2634\nU 8027 ; WX 998 ; N uni1F5B ; G 2635\nU 8029 ; WX 1012 ; N uni1F5D ; G 2636\nU 8031 ; WX 897 ; N uni1F5F ; G 2637\nU 8032 ; WX 837 ; N uni1F60 ; G 2638\nU 8033 ; WX 837 ; N uni1F61 ; G 2639\nU 8034 ; WX 837 ; N uni1F62 ; G 2640\nU 8035 ; WX 837 ; N uni1F63 ; G 2641\nU 8036 ; WX 837 ; N uni1F64 ; G 2642\nU 8037 ; WX 837 ; N uni1F65 ; G 2643\nU 8038 ; WX 837 ; N uni1F66 ; G 2644\nU 8039 ; WX 837 ; N uni1F67 ; G 2645\nU 8040 ; WX 802 ; N uni1F68 ; G 2646\nU 8041 ; WX 843 ; N uni1F69 ; G 2647\nU 8042 ; WX 1089 ; N uni1F6A ; G 2648\nU 8043 ; WX 1095 ; N uni1F6B ; G 2649\nU 8044 ; WX 946 ; N uni1F6C ; G 2650\nU 8045 ; WX 972 ; N uni1F6D ; G 2651\nU 8046 ; WX 921 ; N uni1F6E ; G 2652\nU 8047 ; WX 952 ; N uni1F6F ; G 2653\nU 8048 ; WX 659 ; N uni1F70 ; G 2654\nU 8049 ; WX 659 ; N uni1F71 ; G 2655\nU 8050 ; WX 541 ; N uni1F72 ; G 2656\nU 8051 ; WX 548 ; N uni1F73 ; G 2657\nU 8052 ; WX 634 ; N uni1F74 ; G 2658\nU 8053 ; WX 654 ; N uni1F75 ; G 2659\nU 8054 ; WX 338 ; N uni1F76 ; G 2660\nU 8055 ; WX 338 ; N uni1F77 ; G 2661\nU 8056 ; WX 612 ; N uni1F78 ; G 2662\nU 8057 ; WX 612 ; N uni1F79 ; G 2663\nU 8058 ; WX 579 ; N uni1F7A ; G 2664\nU 8059 ; WX 579 ; N uni1F7B ; G 2665\nU 8060 ; WX 837 ; N uni1F7C ; G 2666\nU 8061 ; WX 837 ; N uni1F7D ; G 2667\nU 8064 ; WX 659 ; N uni1F80 ; G 2668\nU 8065 ; WX 659 ; N uni1F81 ; G 2669\nU 8066 ; WX 659 ; N uni1F82 ; G 2670\nU 8067 ; WX 659 ; N uni1F83 ; G 2671\nU 8068 ; WX 659 ; N uni1F84 ; G 2672\nU 8069 ; WX 659 ; N uni1F85 ; G 2673\nU 8070 ; WX 659 ; N uni1F86 ; G 2674\nU 8071 ; WX 659 ; N uni1F87 ; G 2675\nU 8072 ; WX 684 ; N uni1F88 ; G 2676\nU 8073 ; WX 684 ; N uni1F89 ; G 2677\nU 8074 ; WX 877 ; N uni1F8A ; G 2678\nU 8075 ; WX 877 ; N uni1F8B ; G 2679\nU 8076 ; WX 769 ; N uni1F8C ; G 2680\nU 8077 ; WX 801 ; N uni1F8D ; G 2681\nU 8078 ; WX 708 ; N uni1F8E ; G 2682\nU 8079 ; WX 743 ; N uni1F8F ; G 2683\nU 8080 ; WX 634 ; N uni1F90 ; G 2684\nU 8081 ; WX 634 ; N uni1F91 ; G 2685\nU 8082 ; WX 634 ; N uni1F92 ; G 2686\nU 8083 ; WX 634 ; N uni1F93 ; G 2687\nU 8084 ; WX 634 ; N uni1F94 ; G 2688\nU 8085 ; WX 634 ; N uni1F95 ; G 2689\nU 8086 ; WX 634 ; N uni1F96 ; G 2690\nU 8087 ; WX 634 ; N uni1F97 ; G 2691\nU 8088 ; WX 837 ; N uni1F98 ; G 2692\nU 8089 ; WX 835 ; N uni1F99 ; G 2693\nU 8090 ; WX 1086 ; N uni1F9A ; G 2694\nU 8091 ; WX 1089 ; N uni1F9B ; G 2695\nU 8092 ; WX 1027 ; N uni1F9C ; G 2696\nU 8093 ; WX 1051 ; N uni1F9D ; G 2697\nU 8094 ; WX 934 ; N uni1F9E ; G 2698\nU 8095 ; WX 947 ; N uni1F9F ; G 2699\nU 8096 ; WX 837 ; N uni1FA0 ; G 2700\nU 8097 ; WX 837 ; N uni1FA1 ; G 2701\nU 8098 ; WX 837 ; N uni1FA2 ; G 2702\nU 8099 ; WX 837 ; N uni1FA3 ; G 2703\nU 8100 ; WX 837 ; N uni1FA4 ; G 2704\nU 8101 ; WX 837 ; N uni1FA5 ; G 2705\nU 8102 ; WX 837 ; N uni1FA6 ; G 2706\nU 8103 ; WX 837 ; N uni1FA7 ; G 2707\nU 8104 ; WX 802 ; N uni1FA8 ; G 2708\nU 8105 ; WX 843 ; N uni1FA9 ; G 2709\nU 8106 ; WX 1089 ; N uni1FAA ; G 2710\nU 8107 ; WX 1095 ; N uni1FAB ; G 2711\nU 8108 ; WX 946 ; N uni1FAC ; G 2712\nU 8109 ; WX 972 ; N uni1FAD ; G 2713\nU 8110 ; WX 921 ; N uni1FAE ; G 2714\nU 8111 ; WX 952 ; N uni1FAF ; G 2715\nU 8112 ; WX 659 ; N uni1FB0 ; G 2716\nU 8113 ; WX 659 ; N uni1FB1 ; G 2717\nU 8114 ; WX 659 ; N uni1FB2 ; G 2718\nU 8115 ; WX 659 ; N uni1FB3 ; G 2719\nU 8116 ; WX 659 ; N uni1FB4 ; G 2720\nU 8118 ; WX 659 ; N uni1FB6 ; G 2721\nU 8119 ; WX 659 ; N uni1FB7 ; G 2722\nU 8120 ; WX 684 ; N uni1FB8 ; G 2723\nU 8121 ; WX 684 ; N uni1FB9 ; G 2724\nU 8122 ; WX 716 ; N uni1FBA ; G 2725\nU 8123 ; WX 692 ; N uni1FBB ; G 2726\nU 8124 ; WX 684 ; N uni1FBC ; G 2727\nU 8125 ; WX 500 ; N uni1FBD ; G 2728\nU 8126 ; WX 500 ; N uni1FBE ; G 2729\nU 8127 ; WX 500 ; N uni1FBF ; G 2730\nU 8128 ; WX 500 ; N uni1FC0 ; G 2731\nU 8129 ; WX 500 ; N uni1FC1 ; G 2732\nU 8130 ; WX 634 ; N uni1FC2 ; G 2733\nU 8131 ; WX 634 ; N uni1FC3 ; G 2734\nU 8132 ; WX 654 ; N uni1FC4 ; G 2735\nU 8134 ; WX 634 ; N uni1FC6 ; G 2736\nU 8135 ; WX 634 ; N uni1FC7 ; G 2737\nU 8136 ; WX 805 ; N uni1FC8 ; G 2738\nU 8137 ; WX 746 ; N uni1FC9 ; G 2739\nU 8138 ; WX 931 ; N uni1FCA ; G 2740\nU 8139 ; WX 871 ; N uni1FCB ; G 2741\nU 8140 ; WX 752 ; N uni1FCC ; G 2742\nU 8141 ; WX 500 ; N uni1FCD ; G 2743\nU 8142 ; WX 500 ; N uni1FCE ; G 2744\nU 8143 ; WX 500 ; N uni1FCF ; G 2745\nU 8144 ; WX 338 ; N uni1FD0 ; G 2746\nU 8145 ; WX 338 ; N uni1FD1 ; G 2747\nU 8146 ; WX 338 ; N uni1FD2 ; G 2748\nU 8147 ; WX 338 ; N uni1FD3 ; G 2749\nU 8150 ; WX 338 ; N uni1FD6 ; G 2750\nU 8151 ; WX 338 ; N uni1FD7 ; G 2751\nU 8152 ; WX 295 ; N uni1FD8 ; G 2752\nU 8153 ; WX 295 ; N uni1FD9 ; G 2753\nU 8154 ; WX 475 ; N uni1FDA ; G 2754\nU 8155 ; WX 408 ; N uni1FDB ; G 2755\nU 8157 ; WX 500 ; N uni1FDD ; G 2756\nU 8158 ; WX 500 ; N uni1FDE ; G 2757\nU 8159 ; WX 500 ; N uni1FDF ; G 2758\nU 8160 ; WX 579 ; N uni1FE0 ; G 2759\nU 8161 ; WX 579 ; N uni1FE1 ; G 2760\nU 8162 ; WX 579 ; N uni1FE2 ; G 2761\nU 8163 ; WX 579 ; N uni1FE3 ; G 2762\nU 8164 ; WX 635 ; N uni1FE4 ; G 2763\nU 8165 ; WX 635 ; N uni1FE5 ; G 2764\nU 8166 ; WX 579 ; N uni1FE6 ; G 2765\nU 8167 ; WX 579 ; N uni1FE7 ; G 2766\nU 8168 ; WX 611 ; N uni1FE8 ; G 2767\nU 8169 ; WX 611 ; N uni1FE9 ; G 2768\nU 8170 ; WX 845 ; N uni1FEA ; G 2769\nU 8171 ; WX 825 ; N uni1FEB ; G 2770\nU 8172 ; WX 685 ; N uni1FEC ; G 2771\nU 8173 ; WX 500 ; N uni1FED ; G 2772\nU 8174 ; WX 500 ; N uni1FEE ; G 2773\nU 8175 ; WX 500 ; N uni1FEF ; G 2774\nU 8178 ; WX 837 ; N uni1FF2 ; G 2775\nU 8179 ; WX 837 ; N uni1FF3 ; G 2776\nU 8180 ; WX 837 ; N uni1FF4 ; G 2777\nU 8182 ; WX 837 ; N uni1FF6 ; G 2778\nU 8183 ; WX 837 ; N uni1FF7 ; G 2779\nU 8184 ; WX 941 ; N uni1FF8 ; G 2780\nU 8185 ; WX 813 ; N uni1FF9 ; G 2781\nU 8186 ; WX 922 ; N uni1FFA ; G 2782\nU 8187 ; WX 826 ; N uni1FFB ; G 2783\nU 8188 ; WX 764 ; N uni1FFC ; G 2784\nU 8189 ; WX 500 ; N uni1FFD ; G 2785\nU 8190 ; WX 500 ; N uni1FFE ; G 2786\nU 8192 ; WX 500 ; N uni2000 ; G 2787\nU 8193 ; WX 1000 ; N uni2001 ; G 2788\nU 8194 ; WX 500 ; N uni2002 ; G 2789\nU 8195 ; WX 1000 ; N uni2003 ; G 2790\nU 8196 ; WX 330 ; N uni2004 ; G 2791\nU 8197 ; WX 250 ; N uni2005 ; G 2792\nU 8198 ; WX 167 ; N uni2006 ; G 2793\nU 8199 ; WX 636 ; N uni2007 ; G 2794\nU 8200 ; WX 318 ; N uni2008 ; G 2795\nU 8201 ; WX 200 ; N uni2009 ; G 2796\nU 8202 ; WX 100 ; N uni200A ; G 2797\nU 8203 ; WX 0 ; N uni200B ; G 2798\nU 8204 ; WX 0 ; N uni200C ; G 2799\nU 8205 ; WX 0 ; N uni200D ; G 2800\nU 8206 ; WX 0 ; N uni200E ; G 2801\nU 8207 ; WX 0 ; N uni200F ; G 2802\nU 8208 ; WX 361 ; N uni2010 ; G 2803\nU 8209 ; WX 361 ; N uni2011 ; G 2804\nU 8210 ; WX 636 ; N figuredash ; G 2805\nU 8211 ; WX 500 ; N endash ; G 2806\nU 8212 ; WX 1000 ; N emdash ; G 2807\nU 8213 ; WX 1000 ; N uni2015 ; G 2808\nU 8214 ; WX 500 ; N uni2016 ; G 2809\nU 8215 ; WX 500 ; N underscoredbl ; G 2810\nU 8216 ; WX 318 ; N quoteleft ; G 2811\nU 8217 ; WX 318 ; N quoteright ; G 2812\nU 8218 ; WX 318 ; N quotesinglbase ; G 2813\nU 8219 ; WX 318 ; N quotereversed ; G 2814\nU 8220 ; WX 518 ; N quotedblleft ; G 2815\nU 8221 ; WX 518 ; N quotedblright ; G 2816\nU 8222 ; WX 518 ; N quotedblbase ; G 2817\nU 8223 ; WX 518 ; N uni201F ; G 2818\nU 8224 ; WX 500 ; N dagger ; G 2819\nU 8225 ; WX 500 ; N daggerdbl ; G 2820\nU 8226 ; WX 590 ; N bullet ; G 2821\nU 8227 ; WX 590 ; N uni2023 ; G 2822\nU 8228 ; WX 334 ; N onedotenleader ; G 2823\nU 8229 ; WX 667 ; N twodotenleader ; G 2824\nU 8230 ; WX 1000 ; N ellipsis ; G 2825\nU 8231 ; WX 318 ; N uni2027 ; G 2826\nU 8232 ; WX 0 ; N uni2028 ; G 2827\nU 8233 ; WX 0 ; N uni2029 ; G 2828\nU 8234 ; WX 0 ; N uni202A ; G 2829\nU 8235 ; WX 0 ; N uni202B ; G 2830\nU 8236 ; WX 0 ; N uni202C ; G 2831\nU 8237 ; WX 0 ; N uni202D ; G 2832\nU 8238 ; WX 0 ; N uni202E ; G 2833\nU 8239 ; WX 200 ; N uni202F ; G 2834\nU 8240 ; WX 1342 ; N perthousand ; G 2835\nU 8241 ; WX 1735 ; N uni2031 ; G 2836\nU 8242 ; WX 227 ; N minute ; G 2837\nU 8243 ; WX 374 ; N second ; G 2838\nU 8244 ; WX 520 ; N uni2034 ; G 2839\nU 8245 ; WX 227 ; N uni2035 ; G 2840\nU 8246 ; WX 374 ; N uni2036 ; G 2841\nU 8247 ; WX 520 ; N uni2037 ; G 2842\nU 8248 ; WX 339 ; N uni2038 ; G 2843\nU 8249 ; WX 400 ; N guilsinglleft ; G 2844\nU 8250 ; WX 400 ; N guilsinglright ; G 2845\nU 8251 ; WX 838 ; N uni203B ; G 2846\nU 8252 ; WX 485 ; N exclamdbl ; G 2847\nU 8253 ; WX 531 ; N uni203D ; G 2848\nU 8254 ; WX 500 ; N uni203E ; G 2849\nU 8255 ; WX 804 ; N uni203F ; G 2850\nU 8256 ; WX 804 ; N uni2040 ; G 2851\nU 8257 ; WX 250 ; N uni2041 ; G 2852\nU 8258 ; WX 1000 ; N uni2042 ; G 2853\nU 8259 ; WX 500 ; N uni2043 ; G 2854\nU 8260 ; WX 167 ; N fraction ; G 2855\nU 8261 ; WX 390 ; N uni2045 ; G 2856\nU 8262 ; WX 390 ; N uni2046 ; G 2857\nU 8263 ; WX 922 ; N uni2047 ; G 2858\nU 8264 ; WX 733 ; N uni2048 ; G 2859\nU 8265 ; WX 733 ; N uni2049 ; G 2860\nU 8266 ; WX 497 ; N uni204A ; G 2861\nU 8267 ; WX 636 ; N uni204B ; G 2862\nU 8268 ; WX 500 ; N uni204C ; G 2863\nU 8269 ; WX 500 ; N uni204D ; G 2864\nU 8270 ; WX 500 ; N uni204E ; G 2865\nU 8271 ; WX 337 ; N uni204F ; G 2866\nU 8272 ; WX 804 ; N uni2050 ; G 2867\nU 8273 ; WX 500 ; N uni2051 ; G 2868\nU 8274 ; WX 450 ; N uni2052 ; G 2869\nU 8275 ; WX 1000 ; N uni2053 ; G 2870\nU 8276 ; WX 804 ; N uni2054 ; G 2871\nU 8277 ; WX 838 ; N uni2055 ; G 2872\nU 8278 ; WX 586 ; N uni2056 ; G 2873\nU 8279 ; WX 663 ; N uni2057 ; G 2874\nU 8280 ; WX 838 ; N uni2058 ; G 2875\nU 8281 ; WX 838 ; N uni2059 ; G 2876\nU 8282 ; WX 318 ; N uni205A ; G 2877\nU 8283 ; WX 797 ; N uni205B ; G 2878\nU 8284 ; WX 838 ; N uni205C ; G 2879\nU 8285 ; WX 318 ; N uni205D ; G 2880\nU 8286 ; WX 318 ; N uni205E ; G 2881\nU 8287 ; WX 222 ; N uni205F ; G 2882\nU 8288 ; WX 0 ; N uni2060 ; G 2883\nU 8289 ; WX 0 ; N uni2061 ; G 2884\nU 8290 ; WX 0 ; N uni2062 ; G 2885\nU 8291 ; WX 0 ; N uni2063 ; G 2886\nU 8292 ; WX 0 ; N uni2064 ; G 2887\nU 8298 ; WX 0 ; N uni206A ; G 2888\nU 8299 ; WX 0 ; N uni206B ; G 2889\nU 8300 ; WX 0 ; N uni206C ; G 2890\nU 8301 ; WX 0 ; N uni206D ; G 2891\nU 8302 ; WX 0 ; N uni206E ; G 2892\nU 8303 ; WX 0 ; N uni206F ; G 2893\nU 8304 ; WX 401 ; N uni2070 ; G 2894\nU 8305 ; WX 179 ; N uni2071 ; G 2895\nU 8308 ; WX 401 ; N uni2074 ; G 2896\nU 8309 ; WX 401 ; N uni2075 ; G 2897\nU 8310 ; WX 401 ; N uni2076 ; G 2898\nU 8311 ; WX 401 ; N uni2077 ; G 2899\nU 8312 ; WX 401 ; N uni2078 ; G 2900\nU 8313 ; WX 401 ; N uni2079 ; G 2901\nU 8314 ; WX 528 ; N uni207A ; G 2902\nU 8315 ; WX 528 ; N uni207B ; G 2903\nU 8316 ; WX 528 ; N uni207C ; G 2904\nU 8317 ; WX 246 ; N uni207D ; G 2905\nU 8318 ; WX 246 ; N uni207E ; G 2906\nU 8319 ; WX 398 ; N uni207F ; G 2907\nU 8320 ; WX 401 ; N uni2080 ; G 2908\nU 8321 ; WX 401 ; N uni2081 ; G 2909\nU 8322 ; WX 401 ; N uni2082 ; G 2910\nU 8323 ; WX 401 ; N uni2083 ; G 2911\nU 8324 ; WX 401 ; N uni2084 ; G 2912\nU 8325 ; WX 401 ; N uni2085 ; G 2913\nU 8326 ; WX 401 ; N uni2086 ; G 2914\nU 8327 ; WX 401 ; N uni2087 ; G 2915\nU 8328 ; WX 401 ; N uni2088 ; G 2916\nU 8329 ; WX 401 ; N uni2089 ; G 2917\nU 8330 ; WX 528 ; N uni208A ; G 2918\nU 8331 ; WX 528 ; N uni208B ; G 2919\nU 8332 ; WX 528 ; N uni208C ; G 2920\nU 8333 ; WX 246 ; N uni208D ; G 2921\nU 8334 ; WX 246 ; N uni208E ; G 2922\nU 8336 ; WX 392 ; N uni2090 ; G 2923\nU 8337 ; WX 417 ; N uni2091 ; G 2924\nU 8338 ; WX 414 ; N uni2092 ; G 2925\nU 8339 ; WX 444 ; N uni2093 ; G 2926\nU 8340 ; WX 417 ; N uni2094 ; G 2927\nU 8341 ; WX 404 ; N uni2095 ; G 2928\nU 8342 ; WX 426 ; N uni2096 ; G 2929\nU 8343 ; WX 166 ; N uni2097 ; G 2930\nU 8344 ; WX 623 ; N uni2098 ; G 2931\nU 8345 ; WX 398 ; N uni2099 ; G 2932\nU 8346 ; WX 428 ; N uni209A ; G 2933\nU 8347 ; WX 373 ; N uni209B ; G 2934\nU 8348 ; WX 295 ; N uni209C ; G 2935\nU 8352 ; WX 877 ; N uni20A0 ; G 2936\nU 8353 ; WX 636 ; N colonmonetary ; G 2937\nU 8354 ; WX 636 ; N uni20A2 ; G 2938\nU 8355 ; WX 636 ; N franc ; G 2939\nU 8356 ; WX 636 ; N lira ; G 2940\nU 8357 ; WX 974 ; N uni20A5 ; G 2941\nU 8358 ; WX 636 ; N uni20A6 ; G 2942\nU 8359 ; WX 1272 ; N peseta ; G 2943\nU 8360 ; WX 1074 ; N uni20A8 ; G 2944\nU 8361 ; WX 989 ; N uni20A9 ; G 2945\nU 8362 ; WX 784 ; N uni20AA ; G 2946\nU 8363 ; WX 636 ; N dong ; G 2947\nU 8364 ; WX 636 ; N Euro ; G 2948\nU 8365 ; WX 636 ; N uni20AD ; G 2949\nU 8366 ; WX 636 ; N uni20AE ; G 2950\nU 8367 ; WX 1272 ; N uni20AF ; G 2951\nU 8368 ; WX 636 ; N uni20B0 ; G 2952\nU 8369 ; WX 636 ; N uni20B1 ; G 2953\nU 8370 ; WX 636 ; N uni20B2 ; G 2954\nU 8371 ; WX 636 ; N uni20B3 ; G 2955\nU 8372 ; WX 774 ; N uni20B4 ; G 2956\nU 8373 ; WX 636 ; N uni20B5 ; G 2957\nU 8376 ; WX 636 ; N uni20B8 ; G 2958\nU 8377 ; WX 636 ; N uni20B9 ; G 2959\nU 8378 ; WX 636 ; N uni20BA ; G 2960\nU 8381 ; WX 636 ; N uni20BD ; G 2961\nU 8400 ; WX 0 ; N uni20D0 ; G 2962\nU 8401 ; WX 0 ; N uni20D1 ; G 2963\nU 8406 ; WX 0 ; N uni20D6 ; G 2964\nU 8407 ; WX 0 ; N uni20D7 ; G 2965\nU 8411 ; WX 0 ; N uni20DB ; G 2966\nU 8412 ; WX 0 ; N uni20DC ; G 2967\nU 8417 ; WX 0 ; N uni20E1 ; G 2968\nU 8448 ; WX 1019 ; N uni2100 ; G 2969\nU 8449 ; WX 1019 ; N uni2101 ; G 2970\nU 8450 ; WX 698 ; N uni2102 ; G 2971\nU 8451 ; WX 1123 ; N uni2103 ; G 2972\nU 8452 ; WX 642 ; N uni2104 ; G 2973\nU 8453 ; WX 1019 ; N uni2105 ; G 2974\nU 8454 ; WX 1067 ; N uni2106 ; G 2975\nU 8455 ; WX 614 ; N uni2107 ; G 2976\nU 8456 ; WX 698 ; N uni2108 ; G 2977\nU 8457 ; WX 952 ; N uni2109 ; G 2978\nU 8459 ; WX 988 ; N uni210B ; G 2979\nU 8460 ; WX 754 ; N uni210C ; G 2980\nU 8461 ; WX 850 ; N uni210D ; G 2981\nU 8462 ; WX 634 ; N uni210E ; G 2982\nU 8463 ; WX 634 ; N uni210F ; G 2983\nU 8464 ; WX 470 ; N uni2110 ; G 2984\nU 8465 ; WX 697 ; N Ifraktur ; G 2985\nU 8466 ; WX 720 ; N uni2112 ; G 2986\nU 8467 ; WX 413 ; N uni2113 ; G 2987\nU 8468 ; WX 818 ; N uni2114 ; G 2988\nU 8469 ; WX 801 ; N uni2115 ; G 2989\nU 8470 ; WX 1040 ; N uni2116 ; G 2990\nU 8471 ; WX 1000 ; N uni2117 ; G 2991\nU 8472 ; WX 697 ; N weierstrass ; G 2992\nU 8473 ; WX 701 ; N uni2119 ; G 2993\nU 8474 ; WX 787 ; N uni211A ; G 2994\nU 8475 ; WX 798 ; N uni211B ; G 2995\nU 8476 ; WX 814 ; N Rfraktur ; G 2996\nU 8477 ; WX 792 ; N uni211D ; G 2997\nU 8478 ; WX 896 ; N prescription ; G 2998\nU 8479 ; WX 684 ; N uni211F ; G 2999\nU 8480 ; WX 1020 ; N uni2120 ; G 3000\nU 8481 ; WX 1074 ; N uni2121 ; G 3001\nU 8482 ; WX 1000 ; N trademark ; G 3002\nU 8483 ; WX 684 ; N uni2123 ; G 3003\nU 8484 ; WX 745 ; N uni2124 ; G 3004\nU 8485 ; WX 578 ; N uni2125 ; G 3005\nU 8486 ; WX 764 ; N uni2126 ; G 3006\nU 8487 ; WX 764 ; N uni2127 ; G 3007\nU 8488 ; WX 616 ; N uni2128 ; G 3008\nU 8489 ; WX 338 ; N uni2129 ; G 3009\nU 8490 ; WX 656 ; N uni212A ; G 3010\nU 8491 ; WX 684 ; N uni212B ; G 3011\nU 8492 ; WX 786 ; N uni212C ; G 3012\nU 8493 ; WX 703 ; N uni212D ; G 3013\nU 8494 ; WX 854 ; N estimated ; G 3014\nU 8495 ; WX 592 ; N uni212F ; G 3015\nU 8496 ; WX 605 ; N uni2130 ; G 3016\nU 8497 ; WX 786 ; N uni2131 ; G 3017\nU 8498 ; WX 575 ; N uni2132 ; G 3018\nU 8499 ; WX 1069 ; N uni2133 ; G 3019\nU 8500 ; WX 462 ; N uni2134 ; G 3020\nU 8501 ; WX 745 ; N aleph ; G 3021\nU 8502 ; WX 674 ; N uni2136 ; G 3022\nU 8503 ; WX 466 ; N uni2137 ; G 3023\nU 8504 ; WX 645 ; N uni2138 ; G 3024\nU 8505 ; WX 380 ; N uni2139 ; G 3025\nU 8506 ; WX 926 ; N uni213A ; G 3026\nU 8507 ; WX 1194 ; N uni213B ; G 3027\nU 8508 ; WX 702 ; N uni213C ; G 3028\nU 8509 ; WX 728 ; N uni213D ; G 3029\nU 8510 ; WX 654 ; N uni213E ; G 3030\nU 8511 ; WX 849 ; N uni213F ; G 3031\nU 8512 ; WX 811 ; N uni2140 ; G 3032\nU 8513 ; WX 775 ; N uni2141 ; G 3033\nU 8514 ; WX 557 ; N uni2142 ; G 3034\nU 8515 ; WX 557 ; N uni2143 ; G 3035\nU 8516 ; WX 611 ; N uni2144 ; G 3036\nU 8517 ; WX 819 ; N uni2145 ; G 3037\nU 8518 ; WX 708 ; N uni2146 ; G 3038\nU 8519 ; WX 615 ; N uni2147 ; G 3039\nU 8520 ; WX 351 ; N uni2148 ; G 3040\nU 8521 ; WX 351 ; N uni2149 ; G 3041\nU 8523 ; WX 780 ; N uni214B ; G 3042\nU 8526 ; WX 526 ; N uni214E ; G 3043\nU 8528 ; WX 969 ; N uni2150 ; G 3044\nU 8529 ; WX 969 ; N uni2151 ; G 3045\nU 8530 ; WX 1370 ; N uni2152 ; G 3046\nU 8531 ; WX 969 ; N onethird ; G 3047\nU 8532 ; WX 969 ; N twothirds ; G 3048\nU 8533 ; WX 969 ; N uni2155 ; G 3049\nU 8534 ; WX 969 ; N uni2156 ; G 3050\nU 8535 ; WX 969 ; N uni2157 ; G 3051\nU 8536 ; WX 969 ; N uni2158 ; G 3052\nU 8537 ; WX 969 ; N uni2159 ; G 3053\nU 8538 ; WX 969 ; N uni215A ; G 3054\nU 8539 ; WX 969 ; N oneeighth ; G 3055\nU 8540 ; WX 969 ; N threeeighths ; G 3056\nU 8541 ; WX 969 ; N fiveeighths ; G 3057\nU 8542 ; WX 969 ; N seveneighths ; G 3058\nU 8543 ; WX 568 ; N uni215F ; G 3059\nU 8544 ; WX 295 ; N uni2160 ; G 3060\nU 8545 ; WX 492 ; N uni2161 ; G 3061\nU 8546 ; WX 689 ; N uni2162 ; G 3062\nU 8547 ; WX 923 ; N uni2163 ; G 3063\nU 8548 ; WX 684 ; N uni2164 ; G 3064\nU 8549 ; WX 922 ; N uni2165 ; G 3065\nU 8550 ; WX 1120 ; N uni2166 ; G 3066\nU 8551 ; WX 1317 ; N uni2167 ; G 3067\nU 8552 ; WX 917 ; N uni2168 ; G 3068\nU 8553 ; WX 685 ; N uni2169 ; G 3069\nU 8554 ; WX 933 ; N uni216A ; G 3070\nU 8555 ; WX 1131 ; N uni216B ; G 3071\nU 8556 ; WX 557 ; N uni216C ; G 3072\nU 8557 ; WX 698 ; N uni216D ; G 3073\nU 8558 ; WX 770 ; N uni216E ; G 3074\nU 8559 ; WX 863 ; N uni216F ; G 3075\nU 8560 ; WX 278 ; N uni2170 ; G 3076\nU 8561 ; WX 458 ; N uni2171 ; G 3077\nU 8562 ; WX 637 ; N uni2172 ; G 3078\nU 8563 ; WX 812 ; N uni2173 ; G 3079\nU 8564 ; WX 592 ; N uni2174 ; G 3080\nU 8565 ; WX 811 ; N uni2175 ; G 3081\nU 8566 ; WX 991 ; N uni2176 ; G 3082\nU 8567 ; WX 1170 ; N uni2177 ; G 3083\nU 8568 ; WX 819 ; N uni2178 ; G 3084\nU 8569 ; WX 592 ; N uni2179 ; G 3085\nU 8570 ; WX 822 ; N uni217A ; G 3086\nU 8571 ; WX 1002 ; N uni217B ; G 3087\nU 8572 ; WX 278 ; N uni217C ; G 3088\nU 8573 ; WX 550 ; N uni217D ; G 3089\nU 8574 ; WX 635 ; N uni217E ; G 3090\nU 8575 ; WX 974 ; N uni217F ; G 3091\nU 8576 ; WX 1245 ; N uni2180 ; G 3092\nU 8577 ; WX 770 ; N uni2181 ; G 3093\nU 8578 ; WX 1245 ; N uni2182 ; G 3094\nU 8579 ; WX 703 ; N uni2183 ; G 3095\nU 8580 ; WX 549 ; N uni2184 ; G 3096\nU 8581 ; WX 698 ; N uni2185 ; G 3097\nU 8585 ; WX 969 ; N uni2189 ; G 3098\nU 8592 ; WX 838 ; N arrowleft ; G 3099\nU 8593 ; WX 838 ; N arrowup ; G 3100\nU 8594 ; WX 838 ; N arrowright ; G 3101\nU 8595 ; WX 838 ; N arrowdown ; G 3102\nU 8596 ; WX 838 ; N arrowboth ; G 3103\nU 8597 ; WX 838 ; N arrowupdn ; G 3104\nU 8598 ; WX 838 ; N uni2196 ; G 3105\nU 8599 ; WX 838 ; N uni2197 ; G 3106\nU 8600 ; WX 838 ; N uni2198 ; G 3107\nU 8601 ; WX 838 ; N uni2199 ; G 3108\nU 8602 ; WX 838 ; N uni219A ; G 3109\nU 8603 ; WX 838 ; N uni219B ; G 3110\nU 8604 ; WX 838 ; N uni219C ; G 3111\nU 8605 ; WX 838 ; N uni219D ; G 3112\nU 8606 ; WX 838 ; N uni219E ; G 3113\nU 8607 ; WX 838 ; N uni219F ; G 3114\nU 8608 ; WX 838 ; N uni21A0 ; G 3115\nU 8609 ; WX 838 ; N uni21A1 ; G 3116\nU 8610 ; WX 838 ; N uni21A2 ; G 3117\nU 8611 ; WX 838 ; N uni21A3 ; G 3118\nU 8612 ; WX 838 ; N uni21A4 ; G 3119\nU 8613 ; WX 838 ; N uni21A5 ; G 3120\nU 8614 ; WX 838 ; N uni21A6 ; G 3121\nU 8615 ; WX 838 ; N uni21A7 ; G 3122\nU 8616 ; WX 838 ; N arrowupdnbse ; G 3123\nU 8617 ; WX 838 ; N uni21A9 ; G 3124\nU 8618 ; WX 838 ; N uni21AA ; G 3125\nU 8619 ; WX 838 ; N uni21AB ; G 3126\nU 8620 ; WX 838 ; N uni21AC ; G 3127\nU 8621 ; WX 838 ; N uni21AD ; G 3128\nU 8622 ; WX 838 ; N uni21AE ; G 3129\nU 8623 ; WX 838 ; N uni21AF ; G 3130\nU 8624 ; WX 838 ; N uni21B0 ; G 3131\nU 8625 ; WX 838 ; N uni21B1 ; G 3132\nU 8626 ; WX 838 ; N uni21B2 ; G 3133\nU 8627 ; WX 838 ; N uni21B3 ; G 3134\nU 8628 ; WX 838 ; N uni21B4 ; G 3135\nU 8629 ; WX 838 ; N carriagereturn ; G 3136\nU 8630 ; WX 838 ; N uni21B6 ; G 3137\nU 8631 ; WX 838 ; N uni21B7 ; G 3138\nU 8632 ; WX 838 ; N uni21B8 ; G 3139\nU 8633 ; WX 838 ; N uni21B9 ; G 3140\nU 8634 ; WX 838 ; N uni21BA ; G 3141\nU 8635 ; WX 838 ; N uni21BB ; G 3142\nU 8636 ; WX 838 ; N uni21BC ; G 3143\nU 8637 ; WX 838 ; N uni21BD ; G 3144\nU 8638 ; WX 838 ; N uni21BE ; G 3145\nU 8639 ; WX 838 ; N uni21BF ; G 3146\nU 8640 ; WX 838 ; N uni21C0 ; G 3147\nU 8641 ; WX 838 ; N uni21C1 ; G 3148\nU 8642 ; WX 838 ; N uni21C2 ; G 3149\nU 8643 ; WX 838 ; N uni21C3 ; G 3150\nU 8644 ; WX 838 ; N uni21C4 ; G 3151\nU 8645 ; WX 838 ; N uni21C5 ; G 3152\nU 8646 ; WX 838 ; N uni21C6 ; G 3153\nU 8647 ; WX 838 ; N uni21C7 ; G 3154\nU 8648 ; WX 838 ; N uni21C8 ; G 3155\nU 8649 ; WX 838 ; N uni21C9 ; G 3156\nU 8650 ; WX 838 ; N uni21CA ; G 3157\nU 8651 ; WX 838 ; N uni21CB ; G 3158\nU 8652 ; WX 838 ; N uni21CC ; G 3159\nU 8653 ; WX 838 ; N uni21CD ; G 3160\nU 8654 ; WX 838 ; N uni21CE ; G 3161\nU 8655 ; WX 838 ; N uni21CF ; G 3162\nU 8656 ; WX 838 ; N arrowdblleft ; G 3163\nU 8657 ; WX 838 ; N arrowdblup ; G 3164\nU 8658 ; WX 838 ; N arrowdblright ; G 3165\nU 8659 ; WX 838 ; N arrowdbldown ; G 3166\nU 8660 ; WX 838 ; N arrowdblboth ; G 3167\nU 8661 ; WX 838 ; N uni21D5 ; G 3168\nU 8662 ; WX 838 ; N uni21D6 ; G 3169\nU 8663 ; WX 838 ; N uni21D7 ; G 3170\nU 8664 ; WX 838 ; N uni21D8 ; G 3171\nU 8665 ; WX 838 ; N uni21D9 ; G 3172\nU 8666 ; WX 838 ; N uni21DA ; G 3173\nU 8667 ; WX 838 ; N uni21DB ; G 3174\nU 8668 ; WX 838 ; N uni21DC ; G 3175\nU 8669 ; WX 838 ; N uni21DD ; G 3176\nU 8670 ; WX 838 ; N uni21DE ; G 3177\nU 8671 ; WX 838 ; N uni21DF ; G 3178\nU 8672 ; WX 838 ; N uni21E0 ; G 3179\nU 8673 ; WX 838 ; N uni21E1 ; G 3180\nU 8674 ; WX 838 ; N uni21E2 ; G 3181\nU 8675 ; WX 838 ; N uni21E3 ; G 3182\nU 8676 ; WX 838 ; N uni21E4 ; G 3183\nU 8677 ; WX 838 ; N uni21E5 ; G 3184\nU 8678 ; WX 838 ; N uni21E6 ; G 3185\nU 8679 ; WX 838 ; N uni21E7 ; G 3186\nU 8680 ; WX 838 ; N uni21E8 ; G 3187\nU 8681 ; WX 838 ; N uni21E9 ; G 3188\nU 8682 ; WX 838 ; N uni21EA ; G 3189\nU 8683 ; WX 838 ; N uni21EB ; G 3190\nU 8684 ; WX 838 ; N uni21EC ; G 3191\nU 8685 ; WX 838 ; N uni21ED ; G 3192\nU 8686 ; WX 838 ; N uni21EE ; G 3193\nU 8687 ; WX 838 ; N uni21EF ; G 3194\nU 8688 ; WX 838 ; N uni21F0 ; G 3195\nU 8689 ; WX 838 ; N uni21F1 ; G 3196\nU 8690 ; WX 838 ; N uni21F2 ; G 3197\nU 8691 ; WX 838 ; N uni21F3 ; G 3198\nU 8692 ; WX 838 ; N uni21F4 ; G 3199\nU 8693 ; WX 838 ; N uni21F5 ; G 3200\nU 8694 ; WX 838 ; N uni21F6 ; G 3201\nU 8695 ; WX 838 ; N uni21F7 ; G 3202\nU 8696 ; WX 838 ; N uni21F8 ; G 3203\nU 8697 ; WX 838 ; N uni21F9 ; G 3204\nU 8698 ; WX 838 ; N uni21FA ; G 3205\nU 8699 ; WX 838 ; N uni21FB ; G 3206\nU 8700 ; WX 838 ; N uni21FC ; G 3207\nU 8701 ; WX 838 ; N uni21FD ; G 3208\nU 8702 ; WX 838 ; N uni21FE ; G 3209\nU 8703 ; WX 838 ; N uni21FF ; G 3210\nU 8704 ; WX 684 ; N universal ; G 3211\nU 8705 ; WX 636 ; N uni2201 ; G 3212\nU 8706 ; WX 517 ; N partialdiff ; G 3213\nU 8707 ; WX 632 ; N existential ; G 3214\nU 8708 ; WX 632 ; N uni2204 ; G 3215\nU 8709 ; WX 871 ; N emptyset ; G 3216\nU 8710 ; WX 669 ; N increment ; G 3217\nU 8711 ; WX 669 ; N gradient ; G 3218\nU 8712 ; WX 871 ; N element ; G 3219\nU 8713 ; WX 871 ; N notelement ; G 3220\nU 8714 ; WX 718 ; N uni220A ; G 3221\nU 8715 ; WX 871 ; N suchthat ; G 3222\nU 8716 ; WX 871 ; N uni220C ; G 3223\nU 8717 ; WX 718 ; N uni220D ; G 3224\nU 8718 ; WX 636 ; N uni220E ; G 3225\nU 8719 ; WX 757 ; N product ; G 3226\nU 8720 ; WX 757 ; N uni2210 ; G 3227\nU 8721 ; WX 674 ; N summation ; G 3228\nU 8722 ; WX 838 ; N minus ; G 3229\nU 8723 ; WX 838 ; N uni2213 ; G 3230\nU 8724 ; WX 838 ; N uni2214 ; G 3231\nU 8725 ; WX 337 ; N uni2215 ; G 3232\nU 8726 ; WX 637 ; N uni2216 ; G 3233\nU 8727 ; WX 838 ; N asteriskmath ; G 3234\nU 8728 ; WX 626 ; N uni2218 ; G 3235\nU 8729 ; WX 626 ; N uni2219 ; G 3236\nU 8730 ; WX 637 ; N radical ; G 3237\nU 8731 ; WX 637 ; N uni221B ; G 3238\nU 8732 ; WX 637 ; N uni221C ; G 3239\nU 8733 ; WX 714 ; N proportional ; G 3240\nU 8734 ; WX 833 ; N infinity ; G 3241\nU 8735 ; WX 838 ; N orthogonal ; G 3242\nU 8736 ; WX 896 ; N angle ; G 3243\nU 8737 ; WX 896 ; N uni2221 ; G 3244\nU 8738 ; WX 838 ; N uni2222 ; G 3245\nU 8739 ; WX 500 ; N uni2223 ; G 3246\nU 8740 ; WX 500 ; N uni2224 ; G 3247\nU 8741 ; WX 500 ; N uni2225 ; G 3248\nU 8742 ; WX 500 ; N uni2226 ; G 3249\nU 8743 ; WX 732 ; N logicaland ; G 3250\nU 8744 ; WX 732 ; N logicalor ; G 3251\nU 8745 ; WX 732 ; N intersection ; G 3252\nU 8746 ; WX 732 ; N union ; G 3253\nU 8747 ; WX 521 ; N integral ; G 3254\nU 8748 ; WX 789 ; N uni222C ; G 3255\nU 8749 ; WX 1057 ; N uni222D ; G 3256\nU 8750 ; WX 521 ; N uni222E ; G 3257\nU 8751 ; WX 789 ; N uni222F ; G 3258\nU 8752 ; WX 1057 ; N uni2230 ; G 3259\nU 8753 ; WX 521 ; N uni2231 ; G 3260\nU 8754 ; WX 521 ; N uni2232 ; G 3261\nU 8755 ; WX 521 ; N uni2233 ; G 3262\nU 8756 ; WX 636 ; N therefore ; G 3263\nU 8757 ; WX 636 ; N uni2235 ; G 3264\nU 8758 ; WX 260 ; N uni2236 ; G 3265\nU 8759 ; WX 636 ; N uni2237 ; G 3266\nU 8760 ; WX 838 ; N uni2238 ; G 3267\nU 8761 ; WX 838 ; N uni2239 ; G 3268\nU 8762 ; WX 838 ; N uni223A ; G 3269\nU 8763 ; WX 838 ; N uni223B ; G 3270\nU 8764 ; WX 838 ; N similar ; G 3271\nU 8765 ; WX 838 ; N uni223D ; G 3272\nU 8766 ; WX 838 ; N uni223E ; G 3273\nU 8767 ; WX 838 ; N uni223F ; G 3274\nU 8768 ; WX 375 ; N uni2240 ; G 3275\nU 8769 ; WX 838 ; N uni2241 ; G 3276\nU 8770 ; WX 838 ; N uni2242 ; G 3277\nU 8771 ; WX 838 ; N uni2243 ; G 3278\nU 8772 ; WX 838 ; N uni2244 ; G 3279\nU 8773 ; WX 838 ; N congruent ; G 3280\nU 8774 ; WX 838 ; N uni2246 ; G 3281\nU 8775 ; WX 838 ; N uni2247 ; G 3282\nU 8776 ; WX 838 ; N approxequal ; G 3283\nU 8777 ; WX 838 ; N uni2249 ; G 3284\nU 8778 ; WX 838 ; N uni224A ; G 3285\nU 8779 ; WX 838 ; N uni224B ; G 3286\nU 8780 ; WX 838 ; N uni224C ; G 3287\nU 8781 ; WX 838 ; N uni224D ; G 3288\nU 8782 ; WX 838 ; N uni224E ; G 3289\nU 8783 ; WX 838 ; N uni224F ; G 3290\nU 8784 ; WX 838 ; N uni2250 ; G 3291\nU 8785 ; WX 838 ; N uni2251 ; G 3292\nU 8786 ; WX 839 ; N uni2252 ; G 3293\nU 8787 ; WX 839 ; N uni2253 ; G 3294\nU 8788 ; WX 1000 ; N uni2254 ; G 3295\nU 8789 ; WX 1000 ; N uni2255 ; G 3296\nU 8790 ; WX 838 ; N uni2256 ; G 3297\nU 8791 ; WX 838 ; N uni2257 ; G 3298\nU 8792 ; WX 838 ; N uni2258 ; G 3299\nU 8793 ; WX 838 ; N uni2259 ; G 3300\nU 8794 ; WX 838 ; N uni225A ; G 3301\nU 8795 ; WX 838 ; N uni225B ; G 3302\nU 8796 ; WX 838 ; N uni225C ; G 3303\nU 8797 ; WX 838 ; N uni225D ; G 3304\nU 8798 ; WX 838 ; N uni225E ; G 3305\nU 8799 ; WX 838 ; N uni225F ; G 3306\nU 8800 ; WX 838 ; N notequal ; G 3307\nU 8801 ; WX 838 ; N equivalence ; G 3308\nU 8802 ; WX 838 ; N uni2262 ; G 3309\nU 8803 ; WX 838 ; N uni2263 ; G 3310\nU 8804 ; WX 838 ; N lessequal ; G 3311\nU 8805 ; WX 838 ; N greaterequal ; G 3312\nU 8806 ; WX 838 ; N uni2266 ; G 3313\nU 8807 ; WX 838 ; N uni2267 ; G 3314\nU 8808 ; WX 838 ; N uni2268 ; G 3315\nU 8809 ; WX 838 ; N uni2269 ; G 3316\nU 8810 ; WX 1047 ; N uni226A ; G 3317\nU 8811 ; WX 1047 ; N uni226B ; G 3318\nU 8812 ; WX 464 ; N uni226C ; G 3319\nU 8813 ; WX 838 ; N uni226D ; G 3320\nU 8814 ; WX 838 ; N uni226E ; G 3321\nU 8815 ; WX 838 ; N uni226F ; G 3322\nU 8816 ; WX 838 ; N uni2270 ; G 3323\nU 8817 ; WX 838 ; N uni2271 ; G 3324\nU 8818 ; WX 838 ; N uni2272 ; G 3325\nU 8819 ; WX 838 ; N uni2273 ; G 3326\nU 8820 ; WX 838 ; N uni2274 ; G 3327\nU 8821 ; WX 838 ; N uni2275 ; G 3328\nU 8822 ; WX 838 ; N uni2276 ; G 3329\nU 8823 ; WX 838 ; N uni2277 ; G 3330\nU 8824 ; WX 838 ; N uni2278 ; G 3331\nU 8825 ; WX 838 ; N uni2279 ; G 3332\nU 8826 ; WX 838 ; N uni227A ; G 3333\nU 8827 ; WX 838 ; N uni227B ; G 3334\nU 8828 ; WX 838 ; N uni227C ; G 3335\nU 8829 ; WX 838 ; N uni227D ; G 3336\nU 8830 ; WX 838 ; N uni227E ; G 3337\nU 8831 ; WX 838 ; N uni227F ; G 3338\nU 8832 ; WX 838 ; N uni2280 ; G 3339\nU 8833 ; WX 838 ; N uni2281 ; G 3340\nU 8834 ; WX 838 ; N propersubset ; G 3341\nU 8835 ; WX 838 ; N propersuperset ; G 3342\nU 8836 ; WX 838 ; N notsubset ; G 3343\nU 8837 ; WX 838 ; N uni2285 ; G 3344\nU 8838 ; WX 838 ; N reflexsubset ; G 3345\nU 8839 ; WX 838 ; N reflexsuperset ; G 3346\nU 8840 ; WX 838 ; N uni2288 ; G 3347\nU 8841 ; WX 838 ; N uni2289 ; G 3348\nU 8842 ; WX 838 ; N uni228A ; G 3349\nU 8843 ; WX 838 ; N uni228B ; G 3350\nU 8844 ; WX 732 ; N uni228C ; G 3351\nU 8845 ; WX 732 ; N uni228D ; G 3352\nU 8846 ; WX 732 ; N uni228E ; G 3353\nU 8847 ; WX 838 ; N uni228F ; G 3354\nU 8848 ; WX 838 ; N uni2290 ; G 3355\nU 8849 ; WX 838 ; N uni2291 ; G 3356\nU 8850 ; WX 838 ; N uni2292 ; G 3357\nU 8851 ; WX 780 ; N uni2293 ; G 3358\nU 8852 ; WX 780 ; N uni2294 ; G 3359\nU 8853 ; WX 838 ; N circleplus ; G 3360\nU 8854 ; WX 838 ; N uni2296 ; G 3361\nU 8855 ; WX 838 ; N circlemultiply ; G 3362\nU 8856 ; WX 838 ; N uni2298 ; G 3363\nU 8857 ; WX 838 ; N uni2299 ; G 3364\nU 8858 ; WX 838 ; N uni229A ; G 3365\nU 8859 ; WX 838 ; N uni229B ; G 3366\nU 8860 ; WX 838 ; N uni229C ; G 3367\nU 8861 ; WX 838 ; N uni229D ; G 3368\nU 8862 ; WX 838 ; N uni229E ; G 3369\nU 8863 ; WX 838 ; N uni229F ; G 3370\nU 8864 ; WX 838 ; N uni22A0 ; G 3371\nU 8865 ; WX 838 ; N uni22A1 ; G 3372\nU 8866 ; WX 871 ; N uni22A2 ; G 3373\nU 8867 ; WX 871 ; N uni22A3 ; G 3374\nU 8868 ; WX 871 ; N uni22A4 ; G 3375\nU 8869 ; WX 871 ; N perpendicular ; G 3376\nU 8870 ; WX 521 ; N uni22A6 ; G 3377\nU 8871 ; WX 521 ; N uni22A7 ; G 3378\nU 8872 ; WX 871 ; N uni22A8 ; G 3379\nU 8873 ; WX 871 ; N uni22A9 ; G 3380\nU 8874 ; WX 871 ; N uni22AA ; G 3381\nU 8875 ; WX 871 ; N uni22AB ; G 3382\nU 8876 ; WX 871 ; N uni22AC ; G 3383\nU 8877 ; WX 871 ; N uni22AD ; G 3384\nU 8878 ; WX 871 ; N uni22AE ; G 3385\nU 8879 ; WX 871 ; N uni22AF ; G 3386\nU 8880 ; WX 838 ; N uni22B0 ; G 3387\nU 8881 ; WX 838 ; N uni22B1 ; G 3388\nU 8882 ; WX 838 ; N uni22B2 ; G 3389\nU 8883 ; WX 838 ; N uni22B3 ; G 3390\nU 8884 ; WX 838 ; N uni22B4 ; G 3391\nU 8885 ; WX 838 ; N uni22B5 ; G 3392\nU 8886 ; WX 1000 ; N uni22B6 ; G 3393\nU 8887 ; WX 1000 ; N uni22B7 ; G 3394\nU 8888 ; WX 838 ; N uni22B8 ; G 3395\nU 8889 ; WX 838 ; N uni22B9 ; G 3396\nU 8890 ; WX 521 ; N uni22BA ; G 3397\nU 8891 ; WX 732 ; N uni22BB ; G 3398\nU 8892 ; WX 732 ; N uni22BC ; G 3399\nU 8893 ; WX 732 ; N uni22BD ; G 3400\nU 8894 ; WX 838 ; N uni22BE ; G 3401\nU 8895 ; WX 838 ; N uni22BF ; G 3402\nU 8896 ; WX 820 ; N uni22C0 ; G 3403\nU 8897 ; WX 820 ; N uni22C1 ; G 3404\nU 8898 ; WX 820 ; N uni22C2 ; G 3405\nU 8899 ; WX 820 ; N uni22C3 ; G 3406\nU 8900 ; WX 626 ; N uni22C4 ; G 3407\nU 8901 ; WX 318 ; N dotmath ; G 3408\nU 8902 ; WX 626 ; N uni22C6 ; G 3409\nU 8903 ; WX 838 ; N uni22C7 ; G 3410\nU 8904 ; WX 1000 ; N uni22C8 ; G 3411\nU 8905 ; WX 1000 ; N uni22C9 ; G 3412\nU 8906 ; WX 1000 ; N uni22CA ; G 3413\nU 8907 ; WX 1000 ; N uni22CB ; G 3414\nU 8908 ; WX 1000 ; N uni22CC ; G 3415\nU 8909 ; WX 838 ; N uni22CD ; G 3416\nU 8910 ; WX 732 ; N uni22CE ; G 3417\nU 8911 ; WX 732 ; N uni22CF ; G 3418\nU 8912 ; WX 838 ; N uni22D0 ; G 3419\nU 8913 ; WX 838 ; N uni22D1 ; G 3420\nU 8914 ; WX 838 ; N uni22D2 ; G 3421\nU 8915 ; WX 838 ; N uni22D3 ; G 3422\nU 8916 ; WX 838 ; N uni22D4 ; G 3423\nU 8917 ; WX 838 ; N uni22D5 ; G 3424\nU 8918 ; WX 838 ; N uni22D6 ; G 3425\nU 8919 ; WX 838 ; N uni22D7 ; G 3426\nU 8920 ; WX 1422 ; N uni22D8 ; G 3427\nU 8921 ; WX 1422 ; N uni22D9 ; G 3428\nU 8922 ; WX 838 ; N uni22DA ; G 3429\nU 8923 ; WX 838 ; N uni22DB ; G 3430\nU 8924 ; WX 838 ; N uni22DC ; G 3431\nU 8925 ; WX 838 ; N uni22DD ; G 3432\nU 8926 ; WX 838 ; N uni22DE ; G 3433\nU 8927 ; WX 838 ; N uni22DF ; G 3434\nU 8928 ; WX 838 ; N uni22E0 ; G 3435\nU 8929 ; WX 838 ; N uni22E1 ; G 3436\nU 8930 ; WX 838 ; N uni22E2 ; G 3437\nU 8931 ; WX 838 ; N uni22E3 ; G 3438\nU 8932 ; WX 838 ; N uni22E4 ; G 3439\nU 8933 ; WX 838 ; N uni22E5 ; G 3440\nU 8934 ; WX 838 ; N uni22E6 ; G 3441\nU 8935 ; WX 838 ; N uni22E7 ; G 3442\nU 8936 ; WX 838 ; N uni22E8 ; G 3443\nU 8937 ; WX 838 ; N uni22E9 ; G 3444\nU 8938 ; WX 838 ; N uni22EA ; G 3445\nU 8939 ; WX 838 ; N uni22EB ; G 3446\nU 8940 ; WX 838 ; N uni22EC ; G 3447\nU 8941 ; WX 838 ; N uni22ED ; G 3448\nU 8942 ; WX 1000 ; N uni22EE ; G 3449\nU 8943 ; WX 1000 ; N uni22EF ; G 3450\nU 8944 ; WX 1000 ; N uni22F0 ; G 3451\nU 8945 ; WX 1000 ; N uni22F1 ; G 3452\nU 8946 ; WX 1000 ; N uni22F2 ; G 3453\nU 8947 ; WX 871 ; N uni22F3 ; G 3454\nU 8948 ; WX 718 ; N uni22F4 ; G 3455\nU 8949 ; WX 871 ; N uni22F5 ; G 3456\nU 8950 ; WX 871 ; N uni22F6 ; G 3457\nU 8951 ; WX 718 ; N uni22F7 ; G 3458\nU 8952 ; WX 871 ; N uni22F8 ; G 3459\nU 8953 ; WX 871 ; N uni22F9 ; G 3460\nU 8954 ; WX 1000 ; N uni22FA ; G 3461\nU 8955 ; WX 871 ; N uni22FB ; G 3462\nU 8956 ; WX 718 ; N uni22FC ; G 3463\nU 8957 ; WX 871 ; N uni22FD ; G 3464\nU 8958 ; WX 718 ; N uni22FE ; G 3465\nU 8959 ; WX 871 ; N uni22FF ; G 3466\nU 8960 ; WX 602 ; N uni2300 ; G 3467\nU 8961 ; WX 602 ; N uni2301 ; G 3468\nU 8962 ; WX 635 ; N house ; G 3469\nU 8963 ; WX 838 ; N uni2303 ; G 3470\nU 8964 ; WX 838 ; N uni2304 ; G 3471\nU 8965 ; WX 838 ; N uni2305 ; G 3472\nU 8966 ; WX 838 ; N uni2306 ; G 3473\nU 8967 ; WX 488 ; N uni2307 ; G 3474\nU 8968 ; WX 390 ; N uni2308 ; G 3475\nU 8969 ; WX 390 ; N uni2309 ; G 3476\nU 8970 ; WX 390 ; N uni230A ; G 3477\nU 8971 ; WX 390 ; N uni230B ; G 3478\nU 8972 ; WX 809 ; N uni230C ; G 3479\nU 8973 ; WX 809 ; N uni230D ; G 3480\nU 8974 ; WX 809 ; N uni230E ; G 3481\nU 8975 ; WX 809 ; N uni230F ; G 3482\nU 8976 ; WX 838 ; N revlogicalnot ; G 3483\nU 8977 ; WX 513 ; N uni2311 ; G 3484\nU 8984 ; WX 1000 ; N uni2318 ; G 3485\nU 8985 ; WX 838 ; N uni2319 ; G 3486\nU 8988 ; WX 469 ; N uni231C ; G 3487\nU 8989 ; WX 469 ; N uni231D ; G 3488\nU 8990 ; WX 469 ; N uni231E ; G 3489\nU 8991 ; WX 469 ; N uni231F ; G 3490\nU 8992 ; WX 521 ; N integraltp ; G 3491\nU 8993 ; WX 521 ; N integralbt ; G 3492\nU 8996 ; WX 1152 ; N uni2324 ; G 3493\nU 8997 ; WX 1152 ; N uni2325 ; G 3494\nU 8998 ; WX 1414 ; N uni2326 ; G 3495\nU 8999 ; WX 1152 ; N uni2327 ; G 3496\nU 9000 ; WX 1443 ; N uni2328 ; G 3497\nU 9003 ; WX 1414 ; N uni232B ; G 3498\nU 9004 ; WX 873 ; N uni232C ; G 3499\nU 9075 ; WX 338 ; N uni2373 ; G 3500\nU 9076 ; WX 635 ; N uni2374 ; G 3501\nU 9077 ; WX 837 ; N uni2375 ; G 3502\nU 9082 ; WX 659 ; N uni237A ; G 3503\nU 9085 ; WX 757 ; N uni237D ; G 3504\nU 9095 ; WX 1152 ; N uni2387 ; G 3505\nU 9108 ; WX 873 ; N uni2394 ; G 3506\nU 9115 ; WX 500 ; N uni239B ; G 3507\nU 9116 ; WX 500 ; N uni239C ; G 3508\nU 9117 ; WX 500 ; N uni239D ; G 3509\nU 9118 ; WX 500 ; N uni239E ; G 3510\nU 9119 ; WX 500 ; N uni239F ; G 3511\nU 9120 ; WX 500 ; N uni23A0 ; G 3512\nU 9121 ; WX 500 ; N uni23A1 ; G 3513\nU 9122 ; WX 500 ; N uni23A2 ; G 3514\nU 9123 ; WX 500 ; N uni23A3 ; G 3515\nU 9124 ; WX 500 ; N uni23A4 ; G 3516\nU 9125 ; WX 500 ; N uni23A5 ; G 3517\nU 9126 ; WX 500 ; N uni23A6 ; G 3518\nU 9127 ; WX 750 ; N uni23A7 ; G 3519\nU 9128 ; WX 750 ; N uni23A8 ; G 3520\nU 9129 ; WX 750 ; N uni23A9 ; G 3521\nU 9130 ; WX 750 ; N uni23AA ; G 3522\nU 9131 ; WX 750 ; N uni23AB ; G 3523\nU 9132 ; WX 750 ; N uni23AC ; G 3524\nU 9133 ; WX 750 ; N uni23AD ; G 3525\nU 9134 ; WX 521 ; N uni23AE ; G 3526\nU 9166 ; WX 838 ; N uni23CE ; G 3527\nU 9167 ; WX 945 ; N uni23CF ; G 3528\nU 9187 ; WX 873 ; N uni23E3 ; G 3529\nU 9189 ; WX 769 ; N uni23E5 ; G 3530\nU 9192 ; WX 636 ; N uni23E8 ; G 3531\nU 9250 ; WX 635 ; N uni2422 ; G 3532\nU 9251 ; WX 635 ; N uni2423 ; G 3533\nU 9312 ; WX 896 ; N uni2460 ; G 3534\nU 9313 ; WX 896 ; N uni2461 ; G 3535\nU 9314 ; WX 896 ; N uni2462 ; G 3536\nU 9315 ; WX 896 ; N uni2463 ; G 3537\nU 9316 ; WX 896 ; N uni2464 ; G 3538\nU 9317 ; WX 896 ; N uni2465 ; G 3539\nU 9318 ; WX 896 ; N uni2466 ; G 3540\nU 9319 ; WX 896 ; N uni2467 ; G 3541\nU 9320 ; WX 896 ; N uni2468 ; G 3542\nU 9321 ; WX 896 ; N uni2469 ; G 3543\nU 9472 ; WX 602 ; N SF100000 ; G 3544\nU 9473 ; WX 602 ; N uni2501 ; G 3545\nU 9474 ; WX 602 ; N SF110000 ; G 3546\nU 9475 ; WX 602 ; N uni2503 ; G 3547\nU 9476 ; WX 602 ; N uni2504 ; G 3548\nU 9477 ; WX 602 ; N uni2505 ; G 3549\nU 9478 ; WX 602 ; N uni2506 ; G 3550\nU 9479 ; WX 602 ; N uni2507 ; G 3551\nU 9480 ; WX 602 ; N uni2508 ; G 3552\nU 9481 ; WX 602 ; N uni2509 ; G 3553\nU 9482 ; WX 602 ; N uni250A ; G 3554\nU 9483 ; WX 602 ; N uni250B ; G 3555\nU 9484 ; WX 602 ; N SF010000 ; G 3556\nU 9485 ; WX 602 ; N uni250D ; G 3557\nU 9486 ; WX 602 ; N uni250E ; G 3558\nU 9487 ; WX 602 ; N uni250F ; G 3559\nU 9488 ; WX 602 ; N SF030000 ; G 3560\nU 9489 ; WX 602 ; N uni2511 ; G 3561\nU 9490 ; WX 602 ; N uni2512 ; G 3562\nU 9491 ; WX 602 ; N uni2513 ; G 3563\nU 9492 ; WX 602 ; N SF020000 ; G 3564\nU 9493 ; WX 602 ; N uni2515 ; G 3565\nU 9494 ; WX 602 ; N uni2516 ; G 3566\nU 9495 ; WX 602 ; N uni2517 ; G 3567\nU 9496 ; WX 602 ; N SF040000 ; G 3568\nU 9497 ; WX 602 ; N uni2519 ; G 3569\nU 9498 ; WX 602 ; N uni251A ; G 3570\nU 9499 ; WX 602 ; N uni251B ; G 3571\nU 9500 ; WX 602 ; N SF080000 ; G 3572\nU 9501 ; WX 602 ; N uni251D ; G 3573\nU 9502 ; WX 602 ; N uni251E ; G 3574\nU 9503 ; WX 602 ; N uni251F ; G 3575\nU 9504 ; WX 602 ; N uni2520 ; G 3576\nU 9505 ; WX 602 ; N uni2521 ; G 3577\nU 9506 ; WX 602 ; N uni2522 ; G 3578\nU 9507 ; WX 602 ; N uni2523 ; G 3579\nU 9508 ; WX 602 ; N SF090000 ; G 3580\nU 9509 ; WX 602 ; N uni2525 ; G 3581\nU 9510 ; WX 602 ; N uni2526 ; G 3582\nU 9511 ; WX 602 ; N uni2527 ; G 3583\nU 9512 ; WX 602 ; N uni2528 ; G 3584\nU 9513 ; WX 602 ; N uni2529 ; G 3585\nU 9514 ; WX 602 ; N uni252A ; G 3586\nU 9515 ; WX 602 ; N uni252B ; G 3587\nU 9516 ; WX 602 ; N SF060000 ; G 3588\nU 9517 ; WX 602 ; N uni252D ; G 3589\nU 9518 ; WX 602 ; N uni252E ; G 3590\nU 9519 ; WX 602 ; N uni252F ; G 3591\nU 9520 ; WX 602 ; N uni2530 ; G 3592\nU 9521 ; WX 602 ; N uni2531 ; G 3593\nU 9522 ; WX 602 ; N uni2532 ; G 3594\nU 9523 ; WX 602 ; N uni2533 ; G 3595\nU 9524 ; WX 602 ; N SF070000 ; G 3596\nU 9525 ; WX 602 ; N uni2535 ; G 3597\nU 9526 ; WX 602 ; N uni2536 ; G 3598\nU 9527 ; WX 602 ; N uni2537 ; G 3599\nU 9528 ; WX 602 ; N uni2538 ; G 3600\nU 9529 ; WX 602 ; N uni2539 ; G 3601\nU 9530 ; WX 602 ; N uni253A ; G 3602\nU 9531 ; WX 602 ; N uni253B ; G 3603\nU 9532 ; WX 602 ; N SF050000 ; G 3604\nU 9533 ; WX 602 ; N uni253D ; G 3605\nU 9534 ; WX 602 ; N uni253E ; G 3606\nU 9535 ; WX 602 ; N uni253F ; G 3607\nU 9536 ; WX 602 ; N uni2540 ; G 3608\nU 9537 ; WX 602 ; N uni2541 ; G 3609\nU 9538 ; WX 602 ; N uni2542 ; G 3610\nU 9539 ; WX 602 ; N uni2543 ; G 3611\nU 9540 ; WX 602 ; N uni2544 ; G 3612\nU 9541 ; WX 602 ; N uni2545 ; G 3613\nU 9542 ; WX 602 ; N uni2546 ; G 3614\nU 9543 ; WX 602 ; N uni2547 ; G 3615\nU 9544 ; WX 602 ; N uni2548 ; G 3616\nU 9545 ; WX 602 ; N uni2549 ; G 3617\nU 9546 ; WX 602 ; N uni254A ; G 3618\nU 9547 ; WX 602 ; N uni254B ; G 3619\nU 9548 ; WX 602 ; N uni254C ; G 3620\nU 9549 ; WX 602 ; N uni254D ; G 3621\nU 9550 ; WX 602 ; N uni254E ; G 3622\nU 9551 ; WX 602 ; N uni254F ; G 3623\nU 9552 ; WX 602 ; N SF430000 ; G 3624\nU 9553 ; WX 602 ; N SF240000 ; G 3625\nU 9554 ; WX 602 ; N SF510000 ; G 3626\nU 9555 ; WX 602 ; N SF520000 ; G 3627\nU 9556 ; WX 602 ; N SF390000 ; G 3628\nU 9557 ; WX 602 ; N SF220000 ; G 3629\nU 9558 ; WX 602 ; N SF210000 ; G 3630\nU 9559 ; WX 602 ; N SF250000 ; G 3631\nU 9560 ; WX 602 ; N SF500000 ; G 3632\nU 9561 ; WX 602 ; N SF490000 ; G 3633\nU 9562 ; WX 602 ; N SF380000 ; G 3634\nU 9563 ; WX 602 ; N SF280000 ; G 3635\nU 9564 ; WX 602 ; N SF270000 ; G 3636\nU 9565 ; WX 602 ; N SF260000 ; G 3637\nU 9566 ; WX 602 ; N SF360000 ; G 3638\nU 9567 ; WX 602 ; N SF370000 ; G 3639\nU 9568 ; WX 602 ; N SF420000 ; G 3640\nU 9569 ; WX 602 ; N SF190000 ; G 3641\nU 9570 ; WX 602 ; N SF200000 ; G 3642\nU 9571 ; WX 602 ; N SF230000 ; G 3643\nU 9572 ; WX 602 ; N SF470000 ; G 3644\nU 9573 ; WX 602 ; N SF480000 ; G 3645\nU 9574 ; WX 602 ; N SF410000 ; G 3646\nU 9575 ; WX 602 ; N SF450000 ; G 3647\nU 9576 ; WX 602 ; N SF460000 ; G 3648\nU 9577 ; WX 602 ; N SF400000 ; G 3649\nU 9578 ; WX 602 ; N SF540000 ; G 3650\nU 9579 ; WX 602 ; N SF530000 ; G 3651\nU 9580 ; WX 602 ; N SF440000 ; G 3652\nU 9581 ; WX 602 ; N uni256D ; G 3653\nU 9582 ; WX 602 ; N uni256E ; G 3654\nU 9583 ; WX 602 ; N uni256F ; G 3655\nU 9584 ; WX 602 ; N uni2570 ; G 3656\nU 9585 ; WX 602 ; N uni2571 ; G 3657\nU 9586 ; WX 602 ; N uni2572 ; G 3658\nU 9587 ; WX 602 ; N uni2573 ; G 3659\nU 9588 ; WX 602 ; N uni2574 ; G 3660\nU 9589 ; WX 602 ; N uni2575 ; G 3661\nU 9590 ; WX 602 ; N uni2576 ; G 3662\nU 9591 ; WX 602 ; N uni2577 ; G 3663\nU 9592 ; WX 602 ; N uni2578 ; G 3664\nU 9593 ; WX 602 ; N uni2579 ; G 3665\nU 9594 ; WX 602 ; N uni257A ; G 3666\nU 9595 ; WX 602 ; N uni257B ; G 3667\nU 9596 ; WX 602 ; N uni257C ; G 3668\nU 9597 ; WX 602 ; N uni257D ; G 3669\nU 9598 ; WX 602 ; N uni257E ; G 3670\nU 9599 ; WX 602 ; N uni257F ; G 3671\nU 9600 ; WX 769 ; N upblock ; G 3672\nU 9601 ; WX 769 ; N uni2581 ; G 3673\nU 9602 ; WX 769 ; N uni2582 ; G 3674\nU 9603 ; WX 769 ; N uni2583 ; G 3675\nU 9604 ; WX 769 ; N dnblock ; G 3676\nU 9605 ; WX 769 ; N uni2585 ; G 3677\nU 9606 ; WX 769 ; N uni2586 ; G 3678\nU 9607 ; WX 769 ; N uni2587 ; G 3679\nU 9608 ; WX 769 ; N block ; G 3680\nU 9609 ; WX 769 ; N uni2589 ; G 3681\nU 9610 ; WX 769 ; N uni258A ; G 3682\nU 9611 ; WX 769 ; N uni258B ; G 3683\nU 9612 ; WX 769 ; N lfblock ; G 3684\nU 9613 ; WX 769 ; N uni258D ; G 3685\nU 9614 ; WX 769 ; N uni258E ; G 3686\nU 9615 ; WX 769 ; N uni258F ; G 3687\nU 9616 ; WX 769 ; N rtblock ; G 3688\nU 9617 ; WX 769 ; N ltshade ; G 3689\nU 9618 ; WX 769 ; N shade ; G 3690\nU 9619 ; WX 769 ; N dkshade ; G 3691\nU 9620 ; WX 769 ; N uni2594 ; G 3692\nU 9621 ; WX 769 ; N uni2595 ; G 3693\nU 9622 ; WX 769 ; N uni2596 ; G 3694\nU 9623 ; WX 769 ; N uni2597 ; G 3695\nU 9624 ; WX 769 ; N uni2598 ; G 3696\nU 9625 ; WX 769 ; N uni2599 ; G 3697\nU 9626 ; WX 769 ; N uni259A ; G 3698\nU 9627 ; WX 769 ; N uni259B ; G 3699\nU 9628 ; WX 769 ; N uni259C ; G 3700\nU 9629 ; WX 769 ; N uni259D ; G 3701\nU 9630 ; WX 769 ; N uni259E ; G 3702\nU 9631 ; WX 769 ; N uni259F ; G 3703\nU 9632 ; WX 945 ; N filledbox ; G 3704\nU 9633 ; WX 945 ; N H22073 ; G 3705\nU 9634 ; WX 945 ; N uni25A2 ; G 3706\nU 9635 ; WX 945 ; N uni25A3 ; G 3707\nU 9636 ; WX 945 ; N uni25A4 ; G 3708\nU 9637 ; WX 945 ; N uni25A5 ; G 3709\nU 9638 ; WX 945 ; N uni25A6 ; G 3710\nU 9639 ; WX 945 ; N uni25A7 ; G 3711\nU 9640 ; WX 945 ; N uni25A8 ; G 3712\nU 9641 ; WX 945 ; N uni25A9 ; G 3713\nU 9642 ; WX 678 ; N H18543 ; G 3714\nU 9643 ; WX 678 ; N H18551 ; G 3715\nU 9644 ; WX 945 ; N filledrect ; G 3716\nU 9645 ; WX 945 ; N uni25AD ; G 3717\nU 9646 ; WX 550 ; N uni25AE ; G 3718\nU 9647 ; WX 550 ; N uni25AF ; G 3719\nU 9648 ; WX 769 ; N uni25B0 ; G 3720\nU 9649 ; WX 769 ; N uni25B1 ; G 3721\nU 9650 ; WX 769 ; N triagup ; G 3722\nU 9651 ; WX 769 ; N uni25B3 ; G 3723\nU 9652 ; WX 502 ; N uni25B4 ; G 3724\nU 9653 ; WX 502 ; N uni25B5 ; G 3725\nU 9654 ; WX 769 ; N uni25B6 ; G 3726\nU 9655 ; WX 769 ; N uni25B7 ; G 3727\nU 9656 ; WX 502 ; N uni25B8 ; G 3728\nU 9657 ; WX 502 ; N uni25B9 ; G 3729\nU 9658 ; WX 769 ; N triagrt ; G 3730\nU 9659 ; WX 769 ; N uni25BB ; G 3731\nU 9660 ; WX 769 ; N triagdn ; G 3732\nU 9661 ; WX 769 ; N uni25BD ; G 3733\nU 9662 ; WX 502 ; N uni25BE ; G 3734\nU 9663 ; WX 502 ; N uni25BF ; G 3735\nU 9664 ; WX 769 ; N uni25C0 ; G 3736\nU 9665 ; WX 769 ; N uni25C1 ; G 3737\nU 9666 ; WX 502 ; N uni25C2 ; G 3738\nU 9667 ; WX 502 ; N uni25C3 ; G 3739\nU 9668 ; WX 769 ; N triaglf ; G 3740\nU 9669 ; WX 769 ; N uni25C5 ; G 3741\nU 9670 ; WX 769 ; N uni25C6 ; G 3742\nU 9671 ; WX 769 ; N uni25C7 ; G 3743\nU 9672 ; WX 769 ; N uni25C8 ; G 3744\nU 9673 ; WX 873 ; N uni25C9 ; G 3745\nU 9674 ; WX 494 ; N lozenge ; G 3746\nU 9675 ; WX 873 ; N circle ; G 3747\nU 9676 ; WX 873 ; N uni25CC ; G 3748\nU 9677 ; WX 873 ; N uni25CD ; G 3749\nU 9678 ; WX 873 ; N uni25CE ; G 3750\nU 9679 ; WX 873 ; N H18533 ; G 3751\nU 9680 ; WX 873 ; N uni25D0 ; G 3752\nU 9681 ; WX 873 ; N uni25D1 ; G 3753\nU 9682 ; WX 873 ; N uni25D2 ; G 3754\nU 9683 ; WX 873 ; N uni25D3 ; G 3755\nU 9684 ; WX 873 ; N uni25D4 ; G 3756\nU 9685 ; WX 873 ; N uni25D5 ; G 3757\nU 9686 ; WX 527 ; N uni25D6 ; G 3758\nU 9687 ; WX 527 ; N uni25D7 ; G 3759\nU 9688 ; WX 791 ; N invbullet ; G 3760\nU 9689 ; WX 970 ; N invcircle ; G 3761\nU 9690 ; WX 970 ; N uni25DA ; G 3762\nU 9691 ; WX 970 ; N uni25DB ; G 3763\nU 9692 ; WX 387 ; N uni25DC ; G 3764\nU 9693 ; WX 387 ; N uni25DD ; G 3765\nU 9694 ; WX 387 ; N uni25DE ; G 3766\nU 9695 ; WX 387 ; N uni25DF ; G 3767\nU 9696 ; WX 873 ; N uni25E0 ; G 3768\nU 9697 ; WX 873 ; N uni25E1 ; G 3769\nU 9698 ; WX 769 ; N uni25E2 ; G 3770\nU 9699 ; WX 769 ; N uni25E3 ; G 3771\nU 9700 ; WX 769 ; N uni25E4 ; G 3772\nU 9701 ; WX 769 ; N uni25E5 ; G 3773\nU 9702 ; WX 590 ; N openbullet ; G 3774\nU 9703 ; WX 945 ; N uni25E7 ; G 3775\nU 9704 ; WX 945 ; N uni25E8 ; G 3776\nU 9705 ; WX 945 ; N uni25E9 ; G 3777\nU 9706 ; WX 945 ; N uni25EA ; G 3778\nU 9707 ; WX 945 ; N uni25EB ; G 3779\nU 9708 ; WX 769 ; N uni25EC ; G 3780\nU 9709 ; WX 769 ; N uni25ED ; G 3781\nU 9710 ; WX 769 ; N uni25EE ; G 3782\nU 9711 ; WX 1119 ; N uni25EF ; G 3783\nU 9712 ; WX 945 ; N uni25F0 ; G 3784\nU 9713 ; WX 945 ; N uni25F1 ; G 3785\nU 9714 ; WX 945 ; N uni25F2 ; G 3786\nU 9715 ; WX 945 ; N uni25F3 ; G 3787\nU 9716 ; WX 873 ; N uni25F4 ; G 3788\nU 9717 ; WX 873 ; N uni25F5 ; G 3789\nU 9718 ; WX 873 ; N uni25F6 ; G 3790\nU 9719 ; WX 873 ; N uni25F7 ; G 3791\nU 9720 ; WX 769 ; N uni25F8 ; G 3792\nU 9721 ; WX 769 ; N uni25F9 ; G 3793\nU 9722 ; WX 769 ; N uni25FA ; G 3794\nU 9723 ; WX 830 ; N uni25FB ; G 3795\nU 9724 ; WX 830 ; N uni25FC ; G 3796\nU 9725 ; WX 732 ; N uni25FD ; G 3797\nU 9726 ; WX 732 ; N uni25FE ; G 3798\nU 9727 ; WX 769 ; N uni25FF ; G 3799\nU 9728 ; WX 896 ; N uni2600 ; G 3800\nU 9729 ; WX 1000 ; N uni2601 ; G 3801\nU 9730 ; WX 896 ; N uni2602 ; G 3802\nU 9731 ; WX 896 ; N uni2603 ; G 3803\nU 9732 ; WX 896 ; N uni2604 ; G 3804\nU 9733 ; WX 896 ; N uni2605 ; G 3805\nU 9734 ; WX 896 ; N uni2606 ; G 3806\nU 9735 ; WX 573 ; N uni2607 ; G 3807\nU 9736 ; WX 896 ; N uni2608 ; G 3808\nU 9737 ; WX 896 ; N uni2609 ; G 3809\nU 9738 ; WX 888 ; N uni260A ; G 3810\nU 9739 ; WX 888 ; N uni260B ; G 3811\nU 9740 ; WX 671 ; N uni260C ; G 3812\nU 9741 ; WX 1013 ; N uni260D ; G 3813\nU 9742 ; WX 1246 ; N uni260E ; G 3814\nU 9743 ; WX 1250 ; N uni260F ; G 3815\nU 9744 ; WX 896 ; N uni2610 ; G 3816\nU 9745 ; WX 896 ; N uni2611 ; G 3817\nU 9746 ; WX 896 ; N uni2612 ; G 3818\nU 9747 ; WX 532 ; N uni2613 ; G 3819\nU 9748 ; WX 896 ; N uni2614 ; G 3820\nU 9749 ; WX 896 ; N uni2615 ; G 3821\nU 9750 ; WX 896 ; N uni2616 ; G 3822\nU 9751 ; WX 896 ; N uni2617 ; G 3823\nU 9752 ; WX 896 ; N uni2618 ; G 3824\nU 9753 ; WX 896 ; N uni2619 ; G 3825\nU 9754 ; WX 896 ; N uni261A ; G 3826\nU 9755 ; WX 896 ; N uni261B ; G 3827\nU 9756 ; WX 896 ; N uni261C ; G 3828\nU 9757 ; WX 609 ; N uni261D ; G 3829\nU 9758 ; WX 896 ; N uni261E ; G 3830\nU 9759 ; WX 609 ; N uni261F ; G 3831\nU 9760 ; WX 896 ; N uni2620 ; G 3832\nU 9761 ; WX 896 ; N uni2621 ; G 3833\nU 9762 ; WX 896 ; N uni2622 ; G 3834\nU 9763 ; WX 896 ; N uni2623 ; G 3835\nU 9764 ; WX 669 ; N uni2624 ; G 3836\nU 9765 ; WX 746 ; N uni2625 ; G 3837\nU 9766 ; WX 649 ; N uni2626 ; G 3838\nU 9767 ; WX 784 ; N uni2627 ; G 3839\nU 9768 ; WX 545 ; N uni2628 ; G 3840\nU 9769 ; WX 896 ; N uni2629 ; G 3841\nU 9770 ; WX 896 ; N uni262A ; G 3842\nU 9771 ; WX 896 ; N uni262B ; G 3843\nU 9772 ; WX 710 ; N uni262C ; G 3844\nU 9773 ; WX 896 ; N uni262D ; G 3845\nU 9774 ; WX 896 ; N uni262E ; G 3846\nU 9775 ; WX 896 ; N uni262F ; G 3847\nU 9776 ; WX 896 ; N uni2630 ; G 3848\nU 9777 ; WX 896 ; N uni2631 ; G 3849\nU 9778 ; WX 896 ; N uni2632 ; G 3850\nU 9779 ; WX 896 ; N uni2633 ; G 3851\nU 9780 ; WX 896 ; N uni2634 ; G 3852\nU 9781 ; WX 896 ; N uni2635 ; G 3853\nU 9782 ; WX 896 ; N uni2636 ; G 3854\nU 9783 ; WX 896 ; N uni2637 ; G 3855\nU 9784 ; WX 896 ; N uni2638 ; G 3856\nU 9785 ; WX 1042 ; N uni2639 ; G 3857\nU 9786 ; WX 1042 ; N smileface ; G 3858\nU 9787 ; WX 1042 ; N invsmileface ; G 3859\nU 9788 ; WX 896 ; N sun ; G 3860\nU 9789 ; WX 896 ; N uni263D ; G 3861\nU 9790 ; WX 896 ; N uni263E ; G 3862\nU 9791 ; WX 614 ; N uni263F ; G 3863\nU 9792 ; WX 732 ; N female ; G 3864\nU 9793 ; WX 732 ; N uni2641 ; G 3865\nU 9794 ; WX 896 ; N male ; G 3866\nU 9795 ; WX 896 ; N uni2643 ; G 3867\nU 9796 ; WX 896 ; N uni2644 ; G 3868\nU 9797 ; WX 896 ; N uni2645 ; G 3869\nU 9798 ; WX 896 ; N uni2646 ; G 3870\nU 9799 ; WX 896 ; N uni2647 ; G 3871\nU 9800 ; WX 896 ; N uni2648 ; G 3872\nU 9801 ; WX 896 ; N uni2649 ; G 3873\nU 9802 ; WX 896 ; N uni264A ; G 3874\nU 9803 ; WX 896 ; N uni264B ; G 3875\nU 9804 ; WX 896 ; N uni264C ; G 3876\nU 9805 ; WX 896 ; N uni264D ; G 3877\nU 9806 ; WX 896 ; N uni264E ; G 3878\nU 9807 ; WX 896 ; N uni264F ; G 3879\nU 9808 ; WX 896 ; N uni2650 ; G 3880\nU 9809 ; WX 896 ; N uni2651 ; G 3881\nU 9810 ; WX 896 ; N uni2652 ; G 3882\nU 9811 ; WX 896 ; N uni2653 ; G 3883\nU 9812 ; WX 896 ; N uni2654 ; G 3884\nU 9813 ; WX 896 ; N uni2655 ; G 3885\nU 9814 ; WX 896 ; N uni2656 ; G 3886\nU 9815 ; WX 896 ; N uni2657 ; G 3887\nU 9816 ; WX 896 ; N uni2658 ; G 3888\nU 9817 ; WX 896 ; N uni2659 ; G 3889\nU 9818 ; WX 896 ; N uni265A ; G 3890\nU 9819 ; WX 896 ; N uni265B ; G 3891\nU 9820 ; WX 896 ; N uni265C ; G 3892\nU 9821 ; WX 896 ; N uni265D ; G 3893\nU 9822 ; WX 896 ; N uni265E ; G 3894\nU 9823 ; WX 896 ; N uni265F ; G 3895\nU 9824 ; WX 896 ; N spade ; G 3896\nU 9825 ; WX 896 ; N uni2661 ; G 3897\nU 9826 ; WX 896 ; N uni2662 ; G 3898\nU 9827 ; WX 896 ; N club ; G 3899\nU 9828 ; WX 896 ; N uni2664 ; G 3900\nU 9829 ; WX 896 ; N heart ; G 3901\nU 9830 ; WX 896 ; N diamond ; G 3902\nU 9831 ; WX 896 ; N uni2667 ; G 3903\nU 9832 ; WX 896 ; N uni2668 ; G 3904\nU 9833 ; WX 472 ; N uni2669 ; G 3905\nU 9834 ; WX 638 ; N musicalnote ; G 3906\nU 9835 ; WX 896 ; N musicalnotedbl ; G 3907\nU 9836 ; WX 896 ; N uni266C ; G 3908\nU 9837 ; WX 472 ; N uni266D ; G 3909\nU 9838 ; WX 357 ; N uni266E ; G 3910\nU 9839 ; WX 484 ; N uni266F ; G 3911\nU 9840 ; WX 748 ; N uni2670 ; G 3912\nU 9841 ; WX 766 ; N uni2671 ; G 3913\nU 9842 ; WX 896 ; N uni2672 ; G 3914\nU 9843 ; WX 896 ; N uni2673 ; G 3915\nU 9844 ; WX 896 ; N uni2674 ; G 3916\nU 9845 ; WX 896 ; N uni2675 ; G 3917\nU 9846 ; WX 896 ; N uni2676 ; G 3918\nU 9847 ; WX 896 ; N uni2677 ; G 3919\nU 9848 ; WX 896 ; N uni2678 ; G 3920\nU 9849 ; WX 896 ; N uni2679 ; G 3921\nU 9850 ; WX 896 ; N uni267A ; G 3922\nU 9851 ; WX 896 ; N uni267B ; G 3923\nU 9852 ; WX 896 ; N uni267C ; G 3924\nU 9853 ; WX 896 ; N uni267D ; G 3925\nU 9854 ; WX 896 ; N uni267E ; G 3926\nU 9855 ; WX 896 ; N uni267F ; G 3927\nU 9856 ; WX 869 ; N uni2680 ; G 3928\nU 9857 ; WX 869 ; N uni2681 ; G 3929\nU 9858 ; WX 869 ; N uni2682 ; G 3930\nU 9859 ; WX 869 ; N uni2683 ; G 3931\nU 9860 ; WX 869 ; N uni2684 ; G 3932\nU 9861 ; WX 869 ; N uni2685 ; G 3933\nU 9862 ; WX 896 ; N uni2686 ; G 3934\nU 9863 ; WX 896 ; N uni2687 ; G 3935\nU 9864 ; WX 896 ; N uni2688 ; G 3936\nU 9865 ; WX 896 ; N uni2689 ; G 3937\nU 9866 ; WX 896 ; N uni268A ; G 3938\nU 9867 ; WX 896 ; N uni268B ; G 3939\nU 9868 ; WX 896 ; N uni268C ; G 3940\nU 9869 ; WX 896 ; N uni268D ; G 3941\nU 9870 ; WX 896 ; N uni268E ; G 3942\nU 9871 ; WX 896 ; N uni268F ; G 3943\nU 9872 ; WX 896 ; N uni2690 ; G 3944\nU 9873 ; WX 896 ; N uni2691 ; G 3945\nU 9874 ; WX 896 ; N uni2692 ; G 3946\nU 9875 ; WX 896 ; N uni2693 ; G 3947\nU 9876 ; WX 896 ; N uni2694 ; G 3948\nU 9877 ; WX 541 ; N uni2695 ; G 3949\nU 9878 ; WX 896 ; N uni2696 ; G 3950\nU 9879 ; WX 896 ; N uni2697 ; G 3951\nU 9880 ; WX 896 ; N uni2698 ; G 3952\nU 9881 ; WX 896 ; N uni2699 ; G 3953\nU 9882 ; WX 896 ; N uni269A ; G 3954\nU 9883 ; WX 896 ; N uni269B ; G 3955\nU 9884 ; WX 896 ; N uni269C ; G 3956\nU 9886 ; WX 896 ; N uni269E ; G 3957\nU 9887 ; WX 896 ; N uni269F ; G 3958\nU 9888 ; WX 896 ; N uni26A0 ; G 3959\nU 9889 ; WX 702 ; N uni26A1 ; G 3960\nU 9890 ; WX 1004 ; N uni26A2 ; G 3961\nU 9891 ; WX 1089 ; N uni26A3 ; G 3962\nU 9892 ; WX 1175 ; N uni26A4 ; G 3963\nU 9893 ; WX 903 ; N uni26A5 ; G 3964\nU 9894 ; WX 838 ; N uni26A6 ; G 3965\nU 9895 ; WX 838 ; N uni26A7 ; G 3966\nU 9896 ; WX 838 ; N uni26A8 ; G 3967\nU 9897 ; WX 838 ; N uni26A9 ; G 3968\nU 9898 ; WX 838 ; N uni26AA ; G 3969\nU 9899 ; WX 838 ; N uni26AB ; G 3970\nU 9900 ; WX 838 ; N uni26AC ; G 3971\nU 9901 ; WX 838 ; N uni26AD ; G 3972\nU 9902 ; WX 838 ; N uni26AE ; G 3973\nU 9903 ; WX 838 ; N uni26AF ; G 3974\nU 9904 ; WX 844 ; N uni26B0 ; G 3975\nU 9905 ; WX 838 ; N uni26B1 ; G 3976\nU 9906 ; WX 732 ; N uni26B2 ; G 3977\nU 9907 ; WX 732 ; N uni26B3 ; G 3978\nU 9908 ; WX 732 ; N uni26B4 ; G 3979\nU 9909 ; WX 732 ; N uni26B5 ; G 3980\nU 9910 ; WX 850 ; N uni26B6 ; G 3981\nU 9911 ; WX 732 ; N uni26B7 ; G 3982\nU 9912 ; WX 732 ; N uni26B8 ; G 3983\nU 9920 ; WX 838 ; N uni26C0 ; G 3984\nU 9921 ; WX 838 ; N uni26C1 ; G 3985\nU 9922 ; WX 838 ; N uni26C2 ; G 3986\nU 9923 ; WX 838 ; N uni26C3 ; G 3987\nU 9954 ; WX 732 ; N uni26E2 ; G 3988\nU 9985 ; WX 838 ; N uni2701 ; G 3989\nU 9986 ; WX 838 ; N uni2702 ; G 3990\nU 9987 ; WX 838 ; N uni2703 ; G 3991\nU 9988 ; WX 838 ; N uni2704 ; G 3992\nU 9990 ; WX 838 ; N uni2706 ; G 3993\nU 9991 ; WX 838 ; N uni2707 ; G 3994\nU 9992 ; WX 838 ; N uni2708 ; G 3995\nU 9993 ; WX 838 ; N uni2709 ; G 3996\nU 9996 ; WX 838 ; N uni270C ; G 3997\nU 9997 ; WX 838 ; N uni270D ; G 3998\nU 9998 ; WX 838 ; N uni270E ; G 3999\nU 9999 ; WX 838 ; N uni270F ; G 4000\nU 10000 ; WX 838 ; N uni2710 ; G 4001\nU 10001 ; WX 838 ; N uni2711 ; G 4002\nU 10002 ; WX 838 ; N uni2712 ; G 4003\nU 10003 ; WX 838 ; N uni2713 ; G 4004\nU 10004 ; WX 838 ; N uni2714 ; G 4005\nU 10005 ; WX 838 ; N uni2715 ; G 4006\nU 10006 ; WX 838 ; N uni2716 ; G 4007\nU 10007 ; WX 838 ; N uni2717 ; G 4008\nU 10008 ; WX 838 ; N uni2718 ; G 4009\nU 10009 ; WX 838 ; N uni2719 ; G 4010\nU 10010 ; WX 838 ; N uni271A ; G 4011\nU 10011 ; WX 838 ; N uni271B ; G 4012\nU 10012 ; WX 838 ; N uni271C ; G 4013\nU 10013 ; WX 838 ; N uni271D ; G 4014\nU 10014 ; WX 838 ; N uni271E ; G 4015\nU 10015 ; WX 838 ; N uni271F ; G 4016\nU 10016 ; WX 838 ; N uni2720 ; G 4017\nU 10017 ; WX 838 ; N uni2721 ; G 4018\nU 10018 ; WX 838 ; N uni2722 ; G 4019\nU 10019 ; WX 838 ; N uni2723 ; G 4020\nU 10020 ; WX 838 ; N uni2724 ; G 4021\nU 10021 ; WX 838 ; N uni2725 ; G 4022\nU 10022 ; WX 838 ; N uni2726 ; G 4023\nU 10023 ; WX 838 ; N uni2727 ; G 4024\nU 10025 ; WX 838 ; N uni2729 ; G 4025\nU 10026 ; WX 838 ; N uni272A ; G 4026\nU 10027 ; WX 838 ; N uni272B ; G 4027\nU 10028 ; WX 838 ; N uni272C ; G 4028\nU 10029 ; WX 838 ; N uni272D ; G 4029\nU 10030 ; WX 838 ; N uni272E ; G 4030\nU 10031 ; WX 838 ; N uni272F ; G 4031\nU 10032 ; WX 838 ; N uni2730 ; G 4032\nU 10033 ; WX 838 ; N uni2731 ; G 4033\nU 10034 ; WX 838 ; N uni2732 ; G 4034\nU 10035 ; WX 838 ; N uni2733 ; G 4035\nU 10036 ; WX 838 ; N uni2734 ; G 4036\nU 10037 ; WX 838 ; N uni2735 ; G 4037\nU 10038 ; WX 838 ; N uni2736 ; G 4038\nU 10039 ; WX 838 ; N uni2737 ; G 4039\nU 10040 ; WX 838 ; N uni2738 ; G 4040\nU 10041 ; WX 838 ; N uni2739 ; G 4041\nU 10042 ; WX 838 ; N uni273A ; G 4042\nU 10043 ; WX 838 ; N uni273B ; G 4043\nU 10044 ; WX 838 ; N uni273C ; G 4044\nU 10045 ; WX 838 ; N uni273D ; G 4045\nU 10046 ; WX 838 ; N uni273E ; G 4046\nU 10047 ; WX 838 ; N uni273F ; G 4047\nU 10048 ; WX 838 ; N uni2740 ; G 4048\nU 10049 ; WX 838 ; N uni2741 ; G 4049\nU 10050 ; WX 838 ; N uni2742 ; G 4050\nU 10051 ; WX 838 ; N uni2743 ; G 4051\nU 10052 ; WX 838 ; N uni2744 ; G 4052\nU 10053 ; WX 838 ; N uni2745 ; G 4053\nU 10054 ; WX 838 ; N uni2746 ; G 4054\nU 10055 ; WX 838 ; N uni2747 ; G 4055\nU 10056 ; WX 838 ; N uni2748 ; G 4056\nU 10057 ; WX 838 ; N uni2749 ; G 4057\nU 10058 ; WX 838 ; N uni274A ; G 4058\nU 10059 ; WX 838 ; N uni274B ; G 4059\nU 10061 ; WX 896 ; N uni274D ; G 4060\nU 10063 ; WX 896 ; N uni274F ; G 4061\nU 10064 ; WX 896 ; N uni2750 ; G 4062\nU 10065 ; WX 896 ; N uni2751 ; G 4063\nU 10066 ; WX 896 ; N uni2752 ; G 4064\nU 10070 ; WX 896 ; N uni2756 ; G 4065\nU 10072 ; WX 838 ; N uni2758 ; G 4066\nU 10073 ; WX 838 ; N uni2759 ; G 4067\nU 10074 ; WX 838 ; N uni275A ; G 4068\nU 10075 ; WX 322 ; N uni275B ; G 4069\nU 10076 ; WX 322 ; N uni275C ; G 4070\nU 10077 ; WX 538 ; N uni275D ; G 4071\nU 10078 ; WX 538 ; N uni275E ; G 4072\nU 10081 ; WX 838 ; N uni2761 ; G 4073\nU 10082 ; WX 838 ; N uni2762 ; G 4074\nU 10083 ; WX 838 ; N uni2763 ; G 4075\nU 10084 ; WX 838 ; N uni2764 ; G 4076\nU 10085 ; WX 838 ; N uni2765 ; G 4077\nU 10086 ; WX 838 ; N uni2766 ; G 4078\nU 10087 ; WX 838 ; N uni2767 ; G 4079\nU 10088 ; WX 838 ; N uni2768 ; G 4080\nU 10089 ; WX 838 ; N uni2769 ; G 4081\nU 10090 ; WX 838 ; N uni276A ; G 4082\nU 10091 ; WX 838 ; N uni276B ; G 4083\nU 10092 ; WX 838 ; N uni276C ; G 4084\nU 10093 ; WX 838 ; N uni276D ; G 4085\nU 10094 ; WX 838 ; N uni276E ; G 4086\nU 10095 ; WX 838 ; N uni276F ; G 4087\nU 10096 ; WX 838 ; N uni2770 ; G 4088\nU 10097 ; WX 838 ; N uni2771 ; G 4089\nU 10098 ; WX 838 ; N uni2772 ; G 4090\nU 10099 ; WX 838 ; N uni2773 ; G 4091\nU 10100 ; WX 838 ; N uni2774 ; G 4092\nU 10101 ; WX 838 ; N uni2775 ; G 4093\nU 10102 ; WX 896 ; N uni2776 ; G 4094\nU 10103 ; WX 896 ; N uni2777 ; G 4095\nU 10104 ; WX 896 ; N uni2778 ; G 4096\nU 10105 ; WX 896 ; N uni2779 ; G 4097\nU 10106 ; WX 896 ; N uni277A ; G 4098\nU 10107 ; WX 896 ; N uni277B ; G 4099\nU 10108 ; WX 896 ; N uni277C ; G 4100\nU 10109 ; WX 896 ; N uni277D ; G 4101\nU 10110 ; WX 896 ; N uni277E ; G 4102\nU 10111 ; WX 896 ; N uni277F ; G 4103\nU 10112 ; WX 838 ; N uni2780 ; G 4104\nU 10113 ; WX 838 ; N uni2781 ; G 4105\nU 10114 ; WX 838 ; N uni2782 ; G 4106\nU 10115 ; WX 838 ; N uni2783 ; G 4107\nU 10116 ; WX 838 ; N uni2784 ; G 4108\nU 10117 ; WX 838 ; N uni2785 ; G 4109\nU 10118 ; WX 838 ; N uni2786 ; G 4110\nU 10119 ; WX 838 ; N uni2787 ; G 4111\nU 10120 ; WX 838 ; N uni2788 ; G 4112\nU 10121 ; WX 838 ; N uni2789 ; G 4113\nU 10122 ; WX 838 ; N uni278A ; G 4114\nU 10123 ; WX 838 ; N uni278B ; G 4115\nU 10124 ; WX 838 ; N uni278C ; G 4116\nU 10125 ; WX 838 ; N uni278D ; G 4117\nU 10126 ; WX 838 ; N uni278E ; G 4118\nU 10127 ; WX 838 ; N uni278F ; G 4119\nU 10128 ; WX 838 ; N uni2790 ; G 4120\nU 10129 ; WX 838 ; N uni2791 ; G 4121\nU 10130 ; WX 838 ; N uni2792 ; G 4122\nU 10131 ; WX 838 ; N uni2793 ; G 4123\nU 10132 ; WX 838 ; N uni2794 ; G 4124\nU 10136 ; WX 838 ; N uni2798 ; G 4125\nU 10137 ; WX 838 ; N uni2799 ; G 4126\nU 10138 ; WX 838 ; N uni279A ; G 4127\nU 10139 ; WX 838 ; N uni279B ; G 4128\nU 10140 ; WX 838 ; N uni279C ; G 4129\nU 10141 ; WX 838 ; N uni279D ; G 4130\nU 10142 ; WX 838 ; N uni279E ; G 4131\nU 10143 ; WX 838 ; N uni279F ; G 4132\nU 10144 ; WX 838 ; N uni27A0 ; G 4133\nU 10145 ; WX 838 ; N uni27A1 ; G 4134\nU 10146 ; WX 838 ; N uni27A2 ; G 4135\nU 10147 ; WX 838 ; N uni27A3 ; G 4136\nU 10148 ; WX 838 ; N uni27A4 ; G 4137\nU 10149 ; WX 838 ; N uni27A5 ; G 4138\nU 10150 ; WX 838 ; N uni27A6 ; G 4139\nU 10151 ; WX 838 ; N uni27A7 ; G 4140\nU 10152 ; WX 838 ; N uni27A8 ; G 4141\nU 10153 ; WX 838 ; N uni27A9 ; G 4142\nU 10154 ; WX 838 ; N uni27AA ; G 4143\nU 10155 ; WX 838 ; N uni27AB ; G 4144\nU 10156 ; WX 838 ; N uni27AC ; G 4145\nU 10157 ; WX 838 ; N uni27AD ; G 4146\nU 10158 ; WX 838 ; N uni27AE ; G 4147\nU 10159 ; WX 838 ; N uni27AF ; G 4148\nU 10161 ; WX 838 ; N uni27B1 ; G 4149\nU 10162 ; WX 838 ; N uni27B2 ; G 4150\nU 10163 ; WX 838 ; N uni27B3 ; G 4151\nU 10164 ; WX 838 ; N uni27B4 ; G 4152\nU 10165 ; WX 838 ; N uni27B5 ; G 4153\nU 10166 ; WX 838 ; N uni27B6 ; G 4154\nU 10167 ; WX 838 ; N uni27B7 ; G 4155\nU 10168 ; WX 838 ; N uni27B8 ; G 4156\nU 10169 ; WX 838 ; N uni27B9 ; G 4157\nU 10170 ; WX 838 ; N uni27BA ; G 4158\nU 10171 ; WX 838 ; N uni27BB ; G 4159\nU 10172 ; WX 838 ; N uni27BC ; G 4160\nU 10173 ; WX 838 ; N uni27BD ; G 4161\nU 10174 ; WX 838 ; N uni27BE ; G 4162\nU 10181 ; WX 390 ; N uni27C5 ; G 4163\nU 10182 ; WX 390 ; N uni27C6 ; G 4164\nU 10208 ; WX 494 ; N uni27E0 ; G 4165\nU 10214 ; WX 495 ; N uni27E6 ; G 4166\nU 10215 ; WX 495 ; N uni27E7 ; G 4167\nU 10216 ; WX 390 ; N uni27E8 ; G 4168\nU 10217 ; WX 390 ; N uni27E9 ; G 4169\nU 10218 ; WX 556 ; N uni27EA ; G 4170\nU 10219 ; WX 556 ; N uni27EB ; G 4171\nU 10224 ; WX 838 ; N uni27F0 ; G 4172\nU 10225 ; WX 838 ; N uni27F1 ; G 4173\nU 10226 ; WX 838 ; N uni27F2 ; G 4174\nU 10227 ; WX 838 ; N uni27F3 ; G 4175\nU 10228 ; WX 1157 ; N uni27F4 ; G 4176\nU 10229 ; WX 1434 ; N uni27F5 ; G 4177\nU 10230 ; WX 1434 ; N uni27F6 ; G 4178\nU 10231 ; WX 1434 ; N uni27F7 ; G 4179\nU 10232 ; WX 1434 ; N uni27F8 ; G 4180\nU 10233 ; WX 1434 ; N uni27F9 ; G 4181\nU 10234 ; WX 1434 ; N uni27FA ; G 4182\nU 10235 ; WX 1434 ; N uni27FB ; G 4183\nU 10236 ; WX 1434 ; N uni27FC ; G 4184\nU 10237 ; WX 1434 ; N uni27FD ; G 4185\nU 10238 ; WX 1434 ; N uni27FE ; G 4186\nU 10239 ; WX 1434 ; N uni27FF ; G 4187\nU 10240 ; WX 732 ; N uni2800 ; G 4188\nU 10241 ; WX 732 ; N uni2801 ; G 4189\nU 10242 ; WX 732 ; N uni2802 ; G 4190\nU 10243 ; WX 732 ; N uni2803 ; G 4191\nU 10244 ; WX 732 ; N uni2804 ; G 4192\nU 10245 ; WX 732 ; N uni2805 ; G 4193\nU 10246 ; WX 732 ; N uni2806 ; G 4194\nU 10247 ; WX 732 ; N uni2807 ; G 4195\nU 10248 ; WX 732 ; N uni2808 ; G 4196\nU 10249 ; WX 732 ; N uni2809 ; G 4197\nU 10250 ; WX 732 ; N uni280A ; G 4198\nU 10251 ; WX 732 ; N uni280B ; G 4199\nU 10252 ; WX 732 ; N uni280C ; G 4200\nU 10253 ; WX 732 ; N uni280D ; G 4201\nU 10254 ; WX 732 ; N uni280E ; G 4202\nU 10255 ; WX 732 ; N uni280F ; G 4203\nU 10256 ; WX 732 ; N uni2810 ; G 4204\nU 10257 ; WX 732 ; N uni2811 ; G 4205\nU 10258 ; WX 732 ; N uni2812 ; G 4206\nU 10259 ; WX 732 ; N uni2813 ; G 4207\nU 10260 ; WX 732 ; N uni2814 ; G 4208\nU 10261 ; WX 732 ; N uni2815 ; G 4209\nU 10262 ; WX 732 ; N uni2816 ; G 4210\nU 10263 ; WX 732 ; N uni2817 ; G 4211\nU 10264 ; WX 732 ; N uni2818 ; G 4212\nU 10265 ; WX 732 ; N uni2819 ; G 4213\nU 10266 ; WX 732 ; N uni281A ; G 4214\nU 10267 ; WX 732 ; N uni281B ; G 4215\nU 10268 ; WX 732 ; N uni281C ; G 4216\nU 10269 ; WX 732 ; N uni281D ; G 4217\nU 10270 ; WX 732 ; N uni281E ; G 4218\nU 10271 ; WX 732 ; N uni281F ; G 4219\nU 10272 ; WX 732 ; N uni2820 ; G 4220\nU 10273 ; WX 732 ; N uni2821 ; G 4221\nU 10274 ; WX 732 ; N uni2822 ; G 4222\nU 10275 ; WX 732 ; N uni2823 ; G 4223\nU 10276 ; WX 732 ; N uni2824 ; G 4224\nU 10277 ; WX 732 ; N uni2825 ; G 4225\nU 10278 ; WX 732 ; N uni2826 ; G 4226\nU 10279 ; WX 732 ; N uni2827 ; G 4227\nU 10280 ; WX 732 ; N uni2828 ; G 4228\nU 10281 ; WX 732 ; N uni2829 ; G 4229\nU 10282 ; WX 732 ; N uni282A ; G 4230\nU 10283 ; WX 732 ; N uni282B ; G 4231\nU 10284 ; WX 732 ; N uni282C ; G 4232\nU 10285 ; WX 732 ; N uni282D ; G 4233\nU 10286 ; WX 732 ; N uni282E ; G 4234\nU 10287 ; WX 732 ; N uni282F ; G 4235\nU 10288 ; WX 732 ; N uni2830 ; G 4236\nU 10289 ; WX 732 ; N uni2831 ; G 4237\nU 10290 ; WX 732 ; N uni2832 ; G 4238\nU 10291 ; WX 732 ; N uni2833 ; G 4239\nU 10292 ; WX 732 ; N uni2834 ; G 4240\nU 10293 ; WX 732 ; N uni2835 ; G 4241\nU 10294 ; WX 732 ; N uni2836 ; G 4242\nU 10295 ; WX 732 ; N uni2837 ; G 4243\nU 10296 ; WX 732 ; N uni2838 ; G 4244\nU 10297 ; WX 732 ; N uni2839 ; G 4245\nU 10298 ; WX 732 ; N uni283A ; G 4246\nU 10299 ; WX 732 ; N uni283B ; G 4247\nU 10300 ; WX 732 ; N uni283C ; G 4248\nU 10301 ; WX 732 ; N uni283D ; G 4249\nU 10302 ; WX 732 ; N uni283E ; G 4250\nU 10303 ; WX 732 ; N uni283F ; G 4251\nU 10304 ; WX 732 ; N uni2840 ; G 4252\nU 10305 ; WX 732 ; N uni2841 ; G 4253\nU 10306 ; WX 732 ; N uni2842 ; G 4254\nU 10307 ; WX 732 ; N uni2843 ; G 4255\nU 10308 ; WX 732 ; N uni2844 ; G 4256\nU 10309 ; WX 732 ; N uni2845 ; G 4257\nU 10310 ; WX 732 ; N uni2846 ; G 4258\nU 10311 ; WX 732 ; N uni2847 ; G 4259\nU 10312 ; WX 732 ; N uni2848 ; G 4260\nU 10313 ; WX 732 ; N uni2849 ; G 4261\nU 10314 ; WX 732 ; N uni284A ; G 4262\nU 10315 ; WX 732 ; N uni284B ; G 4263\nU 10316 ; WX 732 ; N uni284C ; G 4264\nU 10317 ; WX 732 ; N uni284D ; G 4265\nU 10318 ; WX 732 ; N uni284E ; G 4266\nU 10319 ; WX 732 ; N uni284F ; G 4267\nU 10320 ; WX 732 ; N uni2850 ; G 4268\nU 10321 ; WX 732 ; N uni2851 ; G 4269\nU 10322 ; WX 732 ; N uni2852 ; G 4270\nU 10323 ; WX 732 ; N uni2853 ; G 4271\nU 10324 ; WX 732 ; N uni2854 ; G 4272\nU 10325 ; WX 732 ; N uni2855 ; G 4273\nU 10326 ; WX 732 ; N uni2856 ; G 4274\nU 10327 ; WX 732 ; N uni2857 ; G 4275\nU 10328 ; WX 732 ; N uni2858 ; G 4276\nU 10329 ; WX 732 ; N uni2859 ; G 4277\nU 10330 ; WX 732 ; N uni285A ; G 4278\nU 10331 ; WX 732 ; N uni285B ; G 4279\nU 10332 ; WX 732 ; N uni285C ; G 4280\nU 10333 ; WX 732 ; N uni285D ; G 4281\nU 10334 ; WX 732 ; N uni285E ; G 4282\nU 10335 ; WX 732 ; N uni285F ; G 4283\nU 10336 ; WX 732 ; N uni2860 ; G 4284\nU 10337 ; WX 732 ; N uni2861 ; G 4285\nU 10338 ; WX 732 ; N uni2862 ; G 4286\nU 10339 ; WX 732 ; N uni2863 ; G 4287\nU 10340 ; WX 732 ; N uni2864 ; G 4288\nU 10341 ; WX 732 ; N uni2865 ; G 4289\nU 10342 ; WX 732 ; N uni2866 ; G 4290\nU 10343 ; WX 732 ; N uni2867 ; G 4291\nU 10344 ; WX 732 ; N uni2868 ; G 4292\nU 10345 ; WX 732 ; N uni2869 ; G 4293\nU 10346 ; WX 732 ; N uni286A ; G 4294\nU 10347 ; WX 732 ; N uni286B ; G 4295\nU 10348 ; WX 732 ; N uni286C ; G 4296\nU 10349 ; WX 732 ; N uni286D ; G 4297\nU 10350 ; WX 732 ; N uni286E ; G 4298\nU 10351 ; WX 732 ; N uni286F ; G 4299\nU 10352 ; WX 732 ; N uni2870 ; G 4300\nU 10353 ; WX 732 ; N uni2871 ; G 4301\nU 10354 ; WX 732 ; N uni2872 ; G 4302\nU 10355 ; WX 732 ; N uni2873 ; G 4303\nU 10356 ; WX 732 ; N uni2874 ; G 4304\nU 10357 ; WX 732 ; N uni2875 ; G 4305\nU 10358 ; WX 732 ; N uni2876 ; G 4306\nU 10359 ; WX 732 ; N uni2877 ; G 4307\nU 10360 ; WX 732 ; N uni2878 ; G 4308\nU 10361 ; WX 732 ; N uni2879 ; G 4309\nU 10362 ; WX 732 ; N uni287A ; G 4310\nU 10363 ; WX 732 ; N uni287B ; G 4311\nU 10364 ; WX 732 ; N uni287C ; G 4312\nU 10365 ; WX 732 ; N uni287D ; G 4313\nU 10366 ; WX 732 ; N uni287E ; G 4314\nU 10367 ; WX 732 ; N uni287F ; G 4315\nU 10368 ; WX 732 ; N uni2880 ; G 4316\nU 10369 ; WX 732 ; N uni2881 ; G 4317\nU 10370 ; WX 732 ; N uni2882 ; G 4318\nU 10371 ; WX 732 ; N uni2883 ; G 4319\nU 10372 ; WX 732 ; N uni2884 ; G 4320\nU 10373 ; WX 732 ; N uni2885 ; G 4321\nU 10374 ; WX 732 ; N uni2886 ; G 4322\nU 10375 ; WX 732 ; N uni2887 ; G 4323\nU 10376 ; WX 732 ; N uni2888 ; G 4324\nU 10377 ; WX 732 ; N uni2889 ; G 4325\nU 10378 ; WX 732 ; N uni288A ; G 4326\nU 10379 ; WX 732 ; N uni288B ; G 4327\nU 10380 ; WX 732 ; N uni288C ; G 4328\nU 10381 ; WX 732 ; N uni288D ; G 4329\nU 10382 ; WX 732 ; N uni288E ; G 4330\nU 10383 ; WX 732 ; N uni288F ; G 4331\nU 10384 ; WX 732 ; N uni2890 ; G 4332\nU 10385 ; WX 732 ; N uni2891 ; G 4333\nU 10386 ; WX 732 ; N uni2892 ; G 4334\nU 10387 ; WX 732 ; N uni2893 ; G 4335\nU 10388 ; WX 732 ; N uni2894 ; G 4336\nU 10389 ; WX 732 ; N uni2895 ; G 4337\nU 10390 ; WX 732 ; N uni2896 ; G 4338\nU 10391 ; WX 732 ; N uni2897 ; G 4339\nU 10392 ; WX 732 ; N uni2898 ; G 4340\nU 10393 ; WX 732 ; N uni2899 ; G 4341\nU 10394 ; WX 732 ; N uni289A ; G 4342\nU 10395 ; WX 732 ; N uni289B ; G 4343\nU 10396 ; WX 732 ; N uni289C ; G 4344\nU 10397 ; WX 732 ; N uni289D ; G 4345\nU 10398 ; WX 732 ; N uni289E ; G 4346\nU 10399 ; WX 732 ; N uni289F ; G 4347\nU 10400 ; WX 732 ; N uni28A0 ; G 4348\nU 10401 ; WX 732 ; N uni28A1 ; G 4349\nU 10402 ; WX 732 ; N uni28A2 ; G 4350\nU 10403 ; WX 732 ; N uni28A3 ; G 4351\nU 10404 ; WX 732 ; N uni28A4 ; G 4352\nU 10405 ; WX 732 ; N uni28A5 ; G 4353\nU 10406 ; WX 732 ; N uni28A6 ; G 4354\nU 10407 ; WX 732 ; N uni28A7 ; G 4355\nU 10408 ; WX 732 ; N uni28A8 ; G 4356\nU 10409 ; WX 732 ; N uni28A9 ; G 4357\nU 10410 ; WX 732 ; N uni28AA ; G 4358\nU 10411 ; WX 732 ; N uni28AB ; G 4359\nU 10412 ; WX 732 ; N uni28AC ; G 4360\nU 10413 ; WX 732 ; N uni28AD ; G 4361\nU 10414 ; WX 732 ; N uni28AE ; G 4362\nU 10415 ; WX 732 ; N uni28AF ; G 4363\nU 10416 ; WX 732 ; N uni28B0 ; G 4364\nU 10417 ; WX 732 ; N uni28B1 ; G 4365\nU 10418 ; WX 732 ; N uni28B2 ; G 4366\nU 10419 ; WX 732 ; N uni28B3 ; G 4367\nU 10420 ; WX 732 ; N uni28B4 ; G 4368\nU 10421 ; WX 732 ; N uni28B5 ; G 4369\nU 10422 ; WX 732 ; N uni28B6 ; G 4370\nU 10423 ; WX 732 ; N uni28B7 ; G 4371\nU 10424 ; WX 732 ; N uni28B8 ; G 4372\nU 10425 ; WX 732 ; N uni28B9 ; G 4373\nU 10426 ; WX 732 ; N uni28BA ; G 4374\nU 10427 ; WX 732 ; N uni28BB ; G 4375\nU 10428 ; WX 732 ; N uni28BC ; G 4376\nU 10429 ; WX 732 ; N uni28BD ; G 4377\nU 10430 ; WX 732 ; N uni28BE ; G 4378\nU 10431 ; WX 732 ; N uni28BF ; G 4379\nU 10432 ; WX 732 ; N uni28C0 ; G 4380\nU 10433 ; WX 732 ; N uni28C1 ; G 4381\nU 10434 ; WX 732 ; N uni28C2 ; G 4382\nU 10435 ; WX 732 ; N uni28C3 ; G 4383\nU 10436 ; WX 732 ; N uni28C4 ; G 4384\nU 10437 ; WX 732 ; N uni28C5 ; G 4385\nU 10438 ; WX 732 ; N uni28C6 ; G 4386\nU 10439 ; WX 732 ; N uni28C7 ; G 4387\nU 10440 ; WX 732 ; N uni28C8 ; G 4388\nU 10441 ; WX 732 ; N uni28C9 ; G 4389\nU 10442 ; WX 732 ; N uni28CA ; G 4390\nU 10443 ; WX 732 ; N uni28CB ; G 4391\nU 10444 ; WX 732 ; N uni28CC ; G 4392\nU 10445 ; WX 732 ; N uni28CD ; G 4393\nU 10446 ; WX 732 ; N uni28CE ; G 4394\nU 10447 ; WX 732 ; N uni28CF ; G 4395\nU 10448 ; WX 732 ; N uni28D0 ; G 4396\nU 10449 ; WX 732 ; N uni28D1 ; G 4397\nU 10450 ; WX 732 ; N uni28D2 ; G 4398\nU 10451 ; WX 732 ; N uni28D3 ; G 4399\nU 10452 ; WX 732 ; N uni28D4 ; G 4400\nU 10453 ; WX 732 ; N uni28D5 ; G 4401\nU 10454 ; WX 732 ; N uni28D6 ; G 4402\nU 10455 ; WX 732 ; N uni28D7 ; G 4403\nU 10456 ; WX 732 ; N uni28D8 ; G 4404\nU 10457 ; WX 732 ; N uni28D9 ; G 4405\nU 10458 ; WX 732 ; N uni28DA ; G 4406\nU 10459 ; WX 732 ; N uni28DB ; G 4407\nU 10460 ; WX 732 ; N uni28DC ; G 4408\nU 10461 ; WX 732 ; N uni28DD ; G 4409\nU 10462 ; WX 732 ; N uni28DE ; G 4410\nU 10463 ; WX 732 ; N uni28DF ; G 4411\nU 10464 ; WX 732 ; N uni28E0 ; G 4412\nU 10465 ; WX 732 ; N uni28E1 ; G 4413\nU 10466 ; WX 732 ; N uni28E2 ; G 4414\nU 10467 ; WX 732 ; N uni28E3 ; G 4415\nU 10468 ; WX 732 ; N uni28E4 ; G 4416\nU 10469 ; WX 732 ; N uni28E5 ; G 4417\nU 10470 ; WX 732 ; N uni28E6 ; G 4418\nU 10471 ; WX 732 ; N uni28E7 ; G 4419\nU 10472 ; WX 732 ; N uni28E8 ; G 4420\nU 10473 ; WX 732 ; N uni28E9 ; G 4421\nU 10474 ; WX 732 ; N uni28EA ; G 4422\nU 10475 ; WX 732 ; N uni28EB ; G 4423\nU 10476 ; WX 732 ; N uni28EC ; G 4424\nU 10477 ; WX 732 ; N uni28ED ; G 4425\nU 10478 ; WX 732 ; N uni28EE ; G 4426\nU 10479 ; WX 732 ; N uni28EF ; G 4427\nU 10480 ; WX 732 ; N uni28F0 ; G 4428\nU 10481 ; WX 732 ; N uni28F1 ; G 4429\nU 10482 ; WX 732 ; N uni28F2 ; G 4430\nU 10483 ; WX 732 ; N uni28F3 ; G 4431\nU 10484 ; WX 732 ; N uni28F4 ; G 4432\nU 10485 ; WX 732 ; N uni28F5 ; G 4433\nU 10486 ; WX 732 ; N uni28F6 ; G 4434\nU 10487 ; WX 732 ; N uni28F7 ; G 4435\nU 10488 ; WX 732 ; N uni28F8 ; G 4436\nU 10489 ; WX 732 ; N uni28F9 ; G 4437\nU 10490 ; WX 732 ; N uni28FA ; G 4438\nU 10491 ; WX 732 ; N uni28FB ; G 4439\nU 10492 ; WX 732 ; N uni28FC ; G 4440\nU 10493 ; WX 732 ; N uni28FD ; G 4441\nU 10494 ; WX 732 ; N uni28FE ; G 4442\nU 10495 ; WX 732 ; N uni28FF ; G 4443\nU 10502 ; WX 838 ; N uni2906 ; G 4444\nU 10503 ; WX 838 ; N uni2907 ; G 4445\nU 10506 ; WX 838 ; N uni290A ; G 4446\nU 10507 ; WX 838 ; N uni290B ; G 4447\nU 10560 ; WX 683 ; N uni2940 ; G 4448\nU 10561 ; WX 683 ; N uni2941 ; G 4449\nU 10627 ; WX 734 ; N uni2983 ; G 4450\nU 10628 ; WX 734 ; N uni2984 ; G 4451\nU 10702 ; WX 838 ; N uni29CE ; G 4452\nU 10703 ; WX 1000 ; N uni29CF ; G 4453\nU 10704 ; WX 1000 ; N uni29D0 ; G 4454\nU 10705 ; WX 1000 ; N uni29D1 ; G 4455\nU 10706 ; WX 1000 ; N uni29D2 ; G 4456\nU 10707 ; WX 1000 ; N uni29D3 ; G 4457\nU 10708 ; WX 1000 ; N uni29D4 ; G 4458\nU 10709 ; WX 1000 ; N uni29D5 ; G 4459\nU 10731 ; WX 494 ; N uni29EB ; G 4460\nU 10746 ; WX 838 ; N uni29FA ; G 4461\nU 10747 ; WX 838 ; N uni29FB ; G 4462\nU 10752 ; WX 1000 ; N uni2A00 ; G 4463\nU 10753 ; WX 1000 ; N uni2A01 ; G 4464\nU 10754 ; WX 1000 ; N uni2A02 ; G 4465\nU 10764 ; WX 1325 ; N uni2A0C ; G 4466\nU 10765 ; WX 521 ; N uni2A0D ; G 4467\nU 10766 ; WX 521 ; N uni2A0E ; G 4468\nU 10767 ; WX 521 ; N uni2A0F ; G 4469\nU 10768 ; WX 521 ; N uni2A10 ; G 4470\nU 10769 ; WX 521 ; N uni2A11 ; G 4471\nU 10770 ; WX 521 ; N uni2A12 ; G 4472\nU 10771 ; WX 521 ; N uni2A13 ; G 4473\nU 10772 ; WX 521 ; N uni2A14 ; G 4474\nU 10773 ; WX 521 ; N uni2A15 ; G 4475\nU 10774 ; WX 521 ; N uni2A16 ; G 4476\nU 10775 ; WX 521 ; N uni2A17 ; G 4477\nU 10776 ; WX 521 ; N uni2A18 ; G 4478\nU 10777 ; WX 521 ; N uni2A19 ; G 4479\nU 10778 ; WX 521 ; N uni2A1A ; G 4480\nU 10779 ; WX 521 ; N uni2A1B ; G 4481\nU 10780 ; WX 521 ; N uni2A1C ; G 4482\nU 10799 ; WX 838 ; N uni2A2F ; G 4483\nU 10858 ; WX 838 ; N uni2A6A ; G 4484\nU 10859 ; WX 838 ; N uni2A6B ; G 4485\nU 10877 ; WX 838 ; N uni2A7D ; G 4486\nU 10878 ; WX 838 ; N uni2A7E ; G 4487\nU 10879 ; WX 838 ; N uni2A7F ; G 4488\nU 10880 ; WX 838 ; N uni2A80 ; G 4489\nU 10881 ; WX 838 ; N uni2A81 ; G 4490\nU 10882 ; WX 838 ; N uni2A82 ; G 4491\nU 10883 ; WX 838 ; N uni2A83 ; G 4492\nU 10884 ; WX 838 ; N uni2A84 ; G 4493\nU 10885 ; WX 838 ; N uni2A85 ; G 4494\nU 10886 ; WX 838 ; N uni2A86 ; G 4495\nU 10887 ; WX 838 ; N uni2A87 ; G 4496\nU 10888 ; WX 838 ; N uni2A88 ; G 4497\nU 10889 ; WX 838 ; N uni2A89 ; G 4498\nU 10890 ; WX 838 ; N uni2A8A ; G 4499\nU 10891 ; WX 838 ; N uni2A8B ; G 4500\nU 10892 ; WX 838 ; N uni2A8C ; G 4501\nU 10893 ; WX 838 ; N uni2A8D ; G 4502\nU 10894 ; WX 838 ; N uni2A8E ; G 4503\nU 10895 ; WX 838 ; N uni2A8F ; G 4504\nU 10896 ; WX 838 ; N uni2A90 ; G 4505\nU 10897 ; WX 838 ; N uni2A91 ; G 4506\nU 10898 ; WX 838 ; N uni2A92 ; G 4507\nU 10899 ; WX 838 ; N uni2A93 ; G 4508\nU 10900 ; WX 838 ; N uni2A94 ; G 4509\nU 10901 ; WX 838 ; N uni2A95 ; G 4510\nU 10902 ; WX 838 ; N uni2A96 ; G 4511\nU 10903 ; WX 838 ; N uni2A97 ; G 4512\nU 10904 ; WX 838 ; N uni2A98 ; G 4513\nU 10905 ; WX 838 ; N uni2A99 ; G 4514\nU 10906 ; WX 838 ; N uni2A9A ; G 4515\nU 10907 ; WX 838 ; N uni2A9B ; G 4516\nU 10908 ; WX 838 ; N uni2A9C ; G 4517\nU 10909 ; WX 838 ; N uni2A9D ; G 4518\nU 10910 ; WX 838 ; N uni2A9E ; G 4519\nU 10911 ; WX 838 ; N uni2A9F ; G 4520\nU 10912 ; WX 838 ; N uni2AA0 ; G 4521\nU 10926 ; WX 838 ; N uni2AAE ; G 4522\nU 10927 ; WX 838 ; N uni2AAF ; G 4523\nU 10928 ; WX 838 ; N uni2AB0 ; G 4524\nU 10929 ; WX 838 ; N uni2AB1 ; G 4525\nU 10930 ; WX 838 ; N uni2AB2 ; G 4526\nU 10931 ; WX 838 ; N uni2AB3 ; G 4527\nU 10932 ; WX 838 ; N uni2AB4 ; G 4528\nU 10933 ; WX 838 ; N uni2AB5 ; G 4529\nU 10934 ; WX 838 ; N uni2AB6 ; G 4530\nU 10935 ; WX 838 ; N uni2AB7 ; G 4531\nU 10936 ; WX 838 ; N uni2AB8 ; G 4532\nU 10937 ; WX 838 ; N uni2AB9 ; G 4533\nU 10938 ; WX 838 ; N uni2ABA ; G 4534\nU 11001 ; WX 838 ; N uni2AF9 ; G 4535\nU 11002 ; WX 838 ; N uni2AFA ; G 4536\nU 11008 ; WX 838 ; N uni2B00 ; G 4537\nU 11009 ; WX 838 ; N uni2B01 ; G 4538\nU 11010 ; WX 838 ; N uni2B02 ; G 4539\nU 11011 ; WX 838 ; N uni2B03 ; G 4540\nU 11012 ; WX 838 ; N uni2B04 ; G 4541\nU 11013 ; WX 838 ; N uni2B05 ; G 4542\nU 11014 ; WX 838 ; N uni2B06 ; G 4543\nU 11015 ; WX 838 ; N uni2B07 ; G 4544\nU 11016 ; WX 838 ; N uni2B08 ; G 4545\nU 11017 ; WX 838 ; N uni2B09 ; G 4546\nU 11018 ; WX 838 ; N uni2B0A ; G 4547\nU 11019 ; WX 838 ; N uni2B0B ; G 4548\nU 11020 ; WX 838 ; N uni2B0C ; G 4549\nU 11021 ; WX 838 ; N uni2B0D ; G 4550\nU 11022 ; WX 836 ; N uni2B0E ; G 4551\nU 11023 ; WX 836 ; N uni2B0F ; G 4552\nU 11024 ; WX 836 ; N uni2B10 ; G 4553\nU 11025 ; WX 836 ; N uni2B11 ; G 4554\nU 11026 ; WX 945 ; N uni2B12 ; G 4555\nU 11027 ; WX 945 ; N uni2B13 ; G 4556\nU 11028 ; WX 945 ; N uni2B14 ; G 4557\nU 11029 ; WX 945 ; N uni2B15 ; G 4558\nU 11030 ; WX 769 ; N uni2B16 ; G 4559\nU 11031 ; WX 769 ; N uni2B17 ; G 4560\nU 11032 ; WX 769 ; N uni2B18 ; G 4561\nU 11033 ; WX 769 ; N uni2B19 ; G 4562\nU 11034 ; WX 945 ; N uni2B1A ; G 4563\nU 11039 ; WX 869 ; N uni2B1F ; G 4564\nU 11040 ; WX 869 ; N uni2B20 ; G 4565\nU 11041 ; WX 873 ; N uni2B21 ; G 4566\nU 11042 ; WX 873 ; N uni2B22 ; G 4567\nU 11043 ; WX 873 ; N uni2B23 ; G 4568\nU 11044 ; WX 1119 ; N uni2B24 ; G 4569\nU 11091 ; WX 869 ; N uni2B53 ; G 4570\nU 11092 ; WX 869 ; N uni2B54 ; G 4571\nU 11360 ; WX 557 ; N uni2C60 ; G 4572\nU 11361 ; WX 278 ; N uni2C61 ; G 4573\nU 11362 ; WX 557 ; N uni2C62 ; G 4574\nU 11363 ; WX 603 ; N uni2C63 ; G 4575\nU 11364 ; WX 695 ; N uni2C64 ; G 4576\nU 11365 ; WX 613 ; N uni2C65 ; G 4577\nU 11366 ; WX 392 ; N uni2C66 ; G 4578\nU 11367 ; WX 752 ; N uni2C67 ; G 4579\nU 11368 ; WX 634 ; N uni2C68 ; G 4580\nU 11369 ; WX 656 ; N uni2C69 ; G 4581\nU 11370 ; WX 579 ; N uni2C6A ; G 4582\nU 11371 ; WX 685 ; N uni2C6B ; G 4583\nU 11372 ; WX 525 ; N uni2C6C ; G 4584\nU 11373 ; WX 781 ; N uni2C6D ; G 4585\nU 11374 ; WX 863 ; N uni2C6E ; G 4586\nU 11375 ; WX 684 ; N uni2C6F ; G 4587\nU 11376 ; WX 781 ; N uni2C70 ; G 4588\nU 11377 ; WX 734 ; N uni2C71 ; G 4589\nU 11378 ; WX 1128 ; N uni2C72 ; G 4590\nU 11379 ; WX 961 ; N uni2C73 ; G 4591\nU 11380 ; WX 592 ; N uni2C74 ; G 4592\nU 11381 ; WX 654 ; N uni2C75 ; G 4593\nU 11382 ; WX 568 ; N uni2C76 ; G 4594\nU 11383 ; WX 660 ; N uni2C77 ; G 4595\nU 11385 ; WX 414 ; N uni2C79 ; G 4596\nU 11386 ; WX 612 ; N uni2C7A ; G 4597\nU 11387 ; WX 491 ; N uni2C7B ; G 4598\nU 11388 ; WX 175 ; N uni2C7C ; G 4599\nU 11389 ; WX 431 ; N uni2C7D ; G 4600\nU 11390 ; WX 635 ; N uni2C7E ; G 4601\nU 11391 ; WX 685 ; N uni2C7F ; G 4602\nU 11520 ; WX 591 ; N uni2D00 ; G 4603\nU 11521 ; WX 595 ; N uni2D01 ; G 4604\nU 11522 ; WX 564 ; N uni2D02 ; G 4605\nU 11523 ; WX 602 ; N uni2D03 ; G 4606\nU 11524 ; WX 587 ; N uni2D04 ; G 4607\nU 11525 ; WX 911 ; N uni2D05 ; G 4608\nU 11526 ; WX 626 ; N uni2D06 ; G 4609\nU 11527 ; WX 952 ; N uni2D07 ; G 4610\nU 11528 ; WX 595 ; N uni2D08 ; G 4611\nU 11529 ; WX 607 ; N uni2D09 ; G 4612\nU 11530 ; WX 954 ; N uni2D0A ; G 4613\nU 11531 ; WX 620 ; N uni2D0B ; G 4614\nU 11532 ; WX 595 ; N uni2D0C ; G 4615\nU 11533 ; WX 926 ; N uni2D0D ; G 4616\nU 11534 ; WX 595 ; N uni2D0E ; G 4617\nU 11535 ; WX 806 ; N uni2D0F ; G 4618\nU 11536 ; WX 931 ; N uni2D10 ; G 4619\nU 11537 ; WX 584 ; N uni2D11 ; G 4620\nU 11538 ; WX 592 ; N uni2D12 ; G 4621\nU 11539 ; WX 923 ; N uni2D13 ; G 4622\nU 11540 ; WX 953 ; N uni2D14 ; G 4623\nU 11541 ; WX 828 ; N uni2D15 ; G 4624\nU 11542 ; WX 596 ; N uni2D16 ; G 4625\nU 11543 ; WX 595 ; N uni2D17 ; G 4626\nU 11544 ; WX 590 ; N uni2D18 ; G 4627\nU 11545 ; WX 592 ; N uni2D19 ; G 4628\nU 11546 ; WX 592 ; N uni2D1A ; G 4629\nU 11547 ; WX 621 ; N uni2D1B ; G 4630\nU 11548 ; WX 920 ; N uni2D1C ; G 4631\nU 11549 ; WX 589 ; N uni2D1D ; G 4632\nU 11550 ; WX 586 ; N uni2D1E ; G 4633\nU 11551 ; WX 581 ; N uni2D1F ; G 4634\nU 11552 ; WX 914 ; N uni2D20 ; G 4635\nU 11553 ; WX 596 ; N uni2D21 ; G 4636\nU 11554 ; WX 595 ; N uni2D22 ; G 4637\nU 11555 ; WX 592 ; N uni2D23 ; G 4638\nU 11556 ; WX 642 ; N uni2D24 ; G 4639\nU 11557 ; WX 901 ; N uni2D25 ; G 4640\nU 11568 ; WX 646 ; N uni2D30 ; G 4641\nU 11569 ; WX 888 ; N uni2D31 ; G 4642\nU 11570 ; WX 888 ; N uni2D32 ; G 4643\nU 11571 ; WX 682 ; N uni2D33 ; G 4644\nU 11572 ; WX 684 ; N uni2D34 ; G 4645\nU 11573 ; WX 635 ; N uni2D35 ; G 4646\nU 11574 ; WX 562 ; N uni2D36 ; G 4647\nU 11575 ; WX 684 ; N uni2D37 ; G 4648\nU 11576 ; WX 684 ; N uni2D38 ; G 4649\nU 11577 ; WX 632 ; N uni2D39 ; G 4650\nU 11578 ; WX 632 ; N uni2D3A ; G 4651\nU 11579 ; WX 683 ; N uni2D3B ; G 4652\nU 11580 ; WX 875 ; N uni2D3C ; G 4653\nU 11581 ; WX 685 ; N uni2D3D ; G 4654\nU 11582 ; WX 491 ; N uni2D3E ; G 4655\nU 11583 ; WX 685 ; N uni2D3F ; G 4656\nU 11584 ; WX 888 ; N uni2D40 ; G 4657\nU 11585 ; WX 888 ; N uni2D41 ; G 4658\nU 11586 ; WX 300 ; N uni2D42 ; G 4659\nU 11587 ; WX 627 ; N uni2D43 ; G 4660\nU 11588 ; WX 752 ; N uni2D44 ; G 4661\nU 11589 ; WX 656 ; N uni2D45 ; G 4662\nU 11590 ; WX 527 ; N uni2D46 ; G 4663\nU 11591 ; WX 685 ; N uni2D47 ; G 4664\nU 11592 ; WX 645 ; N uni2D48 ; G 4665\nU 11593 ; WX 632 ; N uni2D49 ; G 4666\nU 11594 ; WX 502 ; N uni2D4A ; G 4667\nU 11595 ; WX 953 ; N uni2D4B ; G 4668\nU 11596 ; WX 778 ; N uni2D4C ; G 4669\nU 11597 ; WX 748 ; N uni2D4D ; G 4670\nU 11598 ; WX 621 ; N uni2D4E ; G 4671\nU 11599 ; WX 295 ; N uni2D4F ; G 4672\nU 11600 ; WX 778 ; N uni2D50 ; G 4673\nU 11601 ; WX 295 ; N uni2D51 ; G 4674\nU 11602 ; WX 752 ; N uni2D52 ; G 4675\nU 11603 ; WX 633 ; N uni2D53 ; G 4676\nU 11604 ; WX 888 ; N uni2D54 ; G 4677\nU 11605 ; WX 888 ; N uni2D55 ; G 4678\nU 11606 ; WX 752 ; N uni2D56 ; G 4679\nU 11607 ; WX 320 ; N uni2D57 ; G 4680\nU 11608 ; WX 749 ; N uni2D58 ; G 4681\nU 11609 ; WX 888 ; N uni2D59 ; G 4682\nU 11610 ; WX 888 ; N uni2D5A ; G 4683\nU 11611 ; WX 698 ; N uni2D5B ; G 4684\nU 11612 ; WX 768 ; N uni2D5C ; G 4685\nU 11613 ; WX 685 ; N uni2D5D ; G 4686\nU 11614 ; WX 698 ; N uni2D5E ; G 4687\nU 11615 ; WX 622 ; N uni2D5F ; G 4688\nU 11616 ; WX 684 ; N uni2D60 ; G 4689\nU 11617 ; WX 752 ; N uni2D61 ; G 4690\nU 11618 ; WX 632 ; N uni2D62 ; G 4691\nU 11619 ; WX 788 ; N uni2D63 ; G 4692\nU 11620 ; WX 567 ; N uni2D64 ; G 4693\nU 11621 ; WX 788 ; N uni2D65 ; G 4694\nU 11631 ; WX 515 ; N uni2D6F ; G 4695\nU 11800 ; WX 531 ; N uni2E18 ; G 4696\nU 11807 ; WX 838 ; N uni2E1F ; G 4697\nU 11810 ; WX 390 ; N uni2E22 ; G 4698\nU 11811 ; WX 390 ; N uni2E23 ; G 4699\nU 11812 ; WX 390 ; N uni2E24 ; G 4700\nU 11813 ; WX 390 ; N uni2E25 ; G 4701\nU 11822 ; WX 531 ; N uni2E2E ; G 4702\nU 19904 ; WX 896 ; N uni4DC0 ; G 4703\nU 19905 ; WX 896 ; N uni4DC1 ; G 4704\nU 19906 ; WX 896 ; N uni4DC2 ; G 4705\nU 19907 ; WX 896 ; N uni4DC3 ; G 4706\nU 19908 ; WX 896 ; N uni4DC4 ; G 4707\nU 19909 ; WX 896 ; N uni4DC5 ; G 4708\nU 19910 ; WX 896 ; N uni4DC6 ; G 4709\nU 19911 ; WX 896 ; N uni4DC7 ; G 4710\nU 19912 ; WX 896 ; N uni4DC8 ; G 4711\nU 19913 ; WX 896 ; N uni4DC9 ; G 4712\nU 19914 ; WX 896 ; N uni4DCA ; G 4713\nU 19915 ; WX 896 ; N uni4DCB ; G 4714\nU 19916 ; WX 896 ; N uni4DCC ; G 4715\nU 19917 ; WX 896 ; N uni4DCD ; G 4716\nU 19918 ; WX 896 ; N uni4DCE ; G 4717\nU 19919 ; WX 896 ; N uni4DCF ; G 4718\nU 19920 ; WX 896 ; N uni4DD0 ; G 4719\nU 19921 ; WX 896 ; N uni4DD1 ; G 4720\nU 19922 ; WX 896 ; N uni4DD2 ; G 4721\nU 19923 ; WX 896 ; N uni4DD3 ; G 4722\nU 19924 ; WX 896 ; N uni4DD4 ; G 4723\nU 19925 ; WX 896 ; N uni4DD5 ; G 4724\nU 19926 ; WX 896 ; N uni4DD6 ; G 4725\nU 19927 ; WX 896 ; N uni4DD7 ; G 4726\nU 19928 ; WX 896 ; N uni4DD8 ; G 4727\nU 19929 ; WX 896 ; N uni4DD9 ; G 4728\nU 19930 ; WX 896 ; N uni4DDA ; G 4729\nU 19931 ; WX 896 ; N uni4DDB ; G 4730\nU 19932 ; WX 896 ; N uni4DDC ; G 4731\nU 19933 ; WX 896 ; N uni4DDD ; G 4732\nU 19934 ; WX 896 ; N uni4DDE ; G 4733\nU 19935 ; WX 896 ; N uni4DDF ; G 4734\nU 19936 ; WX 896 ; N uni4DE0 ; G 4735\nU 19937 ; WX 896 ; N uni4DE1 ; G 4736\nU 19938 ; WX 896 ; N uni4DE2 ; G 4737\nU 19939 ; WX 896 ; N uni4DE3 ; G 4738\nU 19940 ; WX 896 ; N uni4DE4 ; G 4739\nU 19941 ; WX 896 ; N uni4DE5 ; G 4740\nU 19942 ; WX 896 ; N uni4DE6 ; G 4741\nU 19943 ; WX 896 ; N uni4DE7 ; G 4742\nU 19944 ; WX 896 ; N uni4DE8 ; G 4743\nU 19945 ; WX 896 ; N uni4DE9 ; G 4744\nU 19946 ; WX 896 ; N uni4DEA ; G 4745\nU 19947 ; WX 896 ; N uni4DEB ; G 4746\nU 19948 ; WX 896 ; N uni4DEC ; G 4747\nU 19949 ; WX 896 ; N uni4DED ; G 4748\nU 19950 ; WX 896 ; N uni4DEE ; G 4749\nU 19951 ; WX 896 ; N uni4DEF ; G 4750\nU 19952 ; WX 896 ; N uni4DF0 ; G 4751\nU 19953 ; WX 896 ; N uni4DF1 ; G 4752\nU 19954 ; WX 896 ; N uni4DF2 ; G 4753\nU 19955 ; WX 896 ; N uni4DF3 ; G 4754\nU 19956 ; WX 896 ; N uni4DF4 ; G 4755\nU 19957 ; WX 896 ; N uni4DF5 ; G 4756\nU 19958 ; WX 896 ; N uni4DF6 ; G 4757\nU 19959 ; WX 896 ; N uni4DF7 ; G 4758\nU 19960 ; WX 896 ; N uni4DF8 ; G 4759\nU 19961 ; WX 896 ; N uni4DF9 ; G 4760\nU 19962 ; WX 896 ; N uni4DFA ; G 4761\nU 19963 ; WX 896 ; N uni4DFB ; G 4762\nU 19964 ; WX 896 ; N uni4DFC ; G 4763\nU 19965 ; WX 896 ; N uni4DFD ; G 4764\nU 19966 ; WX 896 ; N uni4DFE ; G 4765\nU 19967 ; WX 896 ; N uni4DFF ; G 4766\nU 42192 ; WX 686 ; N uniA4D0 ; G 4767\nU 42193 ; WX 603 ; N uniA4D1 ; G 4768\nU 42194 ; WX 603 ; N uniA4D2 ; G 4769\nU 42195 ; WX 770 ; N uniA4D3 ; G 4770\nU 42196 ; WX 611 ; N uniA4D4 ; G 4771\nU 42197 ; WX 611 ; N uniA4D5 ; G 4772\nU 42198 ; WX 775 ; N uniA4D6 ; G 4773\nU 42199 ; WX 656 ; N uniA4D7 ; G 4774\nU 42200 ; WX 656 ; N uniA4D8 ; G 4775\nU 42201 ; WX 512 ; N uniA4D9 ; G 4776\nU 42202 ; WX 698 ; N uniA4DA ; G 4777\nU 42203 ; WX 703 ; N uniA4DB ; G 4778\nU 42204 ; WX 685 ; N uniA4DC ; G 4779\nU 42205 ; WX 575 ; N uniA4DD ; G 4780\nU 42206 ; WX 575 ; N uniA4DE ; G 4781\nU 42207 ; WX 863 ; N uniA4DF ; G 4782\nU 42208 ; WX 748 ; N uniA4E0 ; G 4783\nU 42209 ; WX 557 ; N uniA4E1 ; G 4784\nU 42210 ; WX 635 ; N uniA4E2 ; G 4785\nU 42211 ; WX 695 ; N uniA4E3 ; G 4786\nU 42212 ; WX 695 ; N uniA4E4 ; G 4787\nU 42213 ; WX 684 ; N uniA4E5 ; G 4788\nU 42214 ; WX 684 ; N uniA4E6 ; G 4789\nU 42215 ; WX 752 ; N uniA4E7 ; G 4790\nU 42216 ; WX 775 ; N uniA4E8 ; G 4791\nU 42217 ; WX 512 ; N uniA4E9 ; G 4792\nU 42218 ; WX 989 ; N uniA4EA ; G 4793\nU 42219 ; WX 685 ; N uniA4EB ; G 4794\nU 42220 ; WX 611 ; N uniA4EC ; G 4795\nU 42221 ; WX 686 ; N uniA4ED ; G 4796\nU 42222 ; WX 684 ; N uniA4EE ; G 4797\nU 42223 ; WX 684 ; N uniA4EF ; G 4798\nU 42224 ; WX 632 ; N uniA4F0 ; G 4799\nU 42225 ; WX 632 ; N uniA4F1 ; G 4800\nU 42226 ; WX 295 ; N uniA4F2 ; G 4801\nU 42227 ; WX 787 ; N uniA4F3 ; G 4802\nU 42228 ; WX 732 ; N uniA4F4 ; G 4803\nU 42229 ; WX 732 ; N uniA4F5 ; G 4804\nU 42230 ; WX 557 ; N uniA4F6 ; G 4805\nU 42231 ; WX 767 ; N uniA4F7 ; G 4806\nU 42232 ; WX 300 ; N uniA4F8 ; G 4807\nU 42233 ; WX 300 ; N uniA4F9 ; G 4808\nU 42234 ; WX 596 ; N uniA4FA ; G 4809\nU 42235 ; WX 596 ; N uniA4FB ; G 4810\nU 42236 ; WX 300 ; N uniA4FC ; G 4811\nU 42237 ; WX 300 ; N uniA4FD ; G 4812\nU 42238 ; WX 588 ; N uniA4FE ; G 4813\nU 42239 ; WX 588 ; N uniA4FF ; G 4814\nU 42564 ; WX 635 ; N uniA644 ; G 4815\nU 42565 ; WX 521 ; N uniA645 ; G 4816\nU 42566 ; WX 354 ; N uniA646 ; G 4817\nU 42567 ; WX 338 ; N uniA647 ; G 4818\nU 42572 ; WX 1180 ; N uniA64C ; G 4819\nU 42573 ; WX 1028 ; N uniA64D ; G 4820\nU 42576 ; WX 1029 ; N uniA650 ; G 4821\nU 42577 ; WX 906 ; N uniA651 ; G 4822\nU 42580 ; WX 1080 ; N uniA654 ; G 4823\nU 42581 ; WX 842 ; N uniA655 ; G 4824\nU 42582 ; WX 977 ; N uniA656 ; G 4825\nU 42583 ; WX 843 ; N uniA657 ; G 4826\nU 42594 ; WX 1062 ; N uniA662 ; G 4827\nU 42595 ; WX 912 ; N uniA663 ; G 4828\nU 42596 ; WX 1066 ; N uniA664 ; G 4829\nU 42597 ; WX 901 ; N uniA665 ; G 4830\nU 42598 ; WX 1178 ; N uniA666 ; G 4831\nU 42599 ; WX 1008 ; N uniA667 ; G 4832\nU 42600 ; WX 787 ; N uniA668 ; G 4833\nU 42601 ; WX 612 ; N uniA669 ; G 4834\nU 42602 ; WX 855 ; N uniA66A ; G 4835\nU 42603 ; WX 712 ; N uniA66B ; G 4836\nU 42604 ; WX 1358 ; N uniA66C ; G 4837\nU 42605 ; WX 1019 ; N uniA66D ; G 4838\nU 42606 ; WX 879 ; N uniA66E ; G 4839\nU 42634 ; WX 782 ; N uniA68A ; G 4840\nU 42635 ; WX 685 ; N uniA68B ; G 4841\nU 42636 ; WX 611 ; N uniA68C ; G 4842\nU 42637 ; WX 583 ; N uniA68D ; G 4843\nU 42644 ; WX 686 ; N uniA694 ; G 4844\nU 42645 ; WX 634 ; N uniA695 ; G 4845\nU 42648 ; WX 1358 ; N uniA698 ; G 4846\nU 42649 ; WX 1019 ; N uniA699 ; G 4847\nU 42760 ; WX 493 ; N uniA708 ; G 4848\nU 42761 ; WX 493 ; N uniA709 ; G 4849\nU 42762 ; WX 493 ; N uniA70A ; G 4850\nU 42763 ; WX 493 ; N uniA70B ; G 4851\nU 42764 ; WX 493 ; N uniA70C ; G 4852\nU 42765 ; WX 493 ; N uniA70D ; G 4853\nU 42766 ; WX 493 ; N uniA70E ; G 4854\nU 42767 ; WX 493 ; N uniA70F ; G 4855\nU 42768 ; WX 493 ; N uniA710 ; G 4856\nU 42769 ; WX 493 ; N uniA711 ; G 4857\nU 42770 ; WX 493 ; N uniA712 ; G 4858\nU 42771 ; WX 493 ; N uniA713 ; G 4859\nU 42772 ; WX 493 ; N uniA714 ; G 4860\nU 42773 ; WX 493 ; N uniA715 ; G 4861\nU 42774 ; WX 493 ; N uniA716 ; G 4862\nU 42779 ; WX 369 ; N uniA71B ; G 4863\nU 42780 ; WX 369 ; N uniA71C ; G 4864\nU 42781 ; WX 252 ; N uniA71D ; G 4865\nU 42782 ; WX 252 ; N uniA71E ; G 4866\nU 42783 ; WX 252 ; N uniA71F ; G 4867\nU 42786 ; WX 385 ; N uniA722 ; G 4868\nU 42787 ; WX 356 ; N uniA723 ; G 4869\nU 42788 ; WX 472 ; N uniA724 ; G 4870\nU 42789 ; WX 472 ; N uniA725 ; G 4871\nU 42790 ; WX 752 ; N uniA726 ; G 4872\nU 42791 ; WX 634 ; N uniA727 ; G 4873\nU 42792 ; WX 878 ; N uniA728 ; G 4874\nU 42793 ; WX 709 ; N uniA729 ; G 4875\nU 42794 ; WX 614 ; N uniA72A ; G 4876\nU 42795 ; WX 541 ; N uniA72B ; G 4877\nU 42800 ; WX 491 ; N uniA730 ; G 4878\nU 42801 ; WX 521 ; N uniA731 ; G 4879\nU 42802 ; WX 1250 ; N uniA732 ; G 4880\nU 42803 ; WX 985 ; N uniA733 ; G 4881\nU 42804 ; WX 1203 ; N uniA734 ; G 4882\nU 42805 ; WX 990 ; N uniA735 ; G 4883\nU 42806 ; WX 1142 ; N uniA736 ; G 4884\nU 42807 ; WX 981 ; N uniA737 ; G 4885\nU 42808 ; WX 971 ; N uniA738 ; G 4886\nU 42809 ; WX 818 ; N uniA739 ; G 4887\nU 42810 ; WX 971 ; N uniA73A ; G 4888\nU 42811 ; WX 818 ; N uniA73B ; G 4889\nU 42812 ; WX 959 ; N uniA73C ; G 4890\nU 42813 ; WX 818 ; N uniA73D ; G 4891\nU 42814 ; WX 703 ; N uniA73E ; G 4892\nU 42815 ; WX 549 ; N uniA73F ; G 4893\nU 42816 ; WX 656 ; N uniA740 ; G 4894\nU 42817 ; WX 583 ; N uniA741 ; G 4895\nU 42822 ; WX 680 ; N uniA746 ; G 4896\nU 42823 ; WX 392 ; N uniA747 ; G 4897\nU 42824 ; WX 582 ; N uniA748 ; G 4898\nU 42825 ; WX 427 ; N uniA749 ; G 4899\nU 42826 ; WX 807 ; N uniA74A ; G 4900\nU 42827 ; WX 704 ; N uniA74B ; G 4901\nU 42830 ; WX 1358 ; N uniA74E ; G 4902\nU 42831 ; WX 1019 ; N uniA74F ; G 4903\nU 42832 ; WX 603 ; N uniA750 ; G 4904\nU 42833 ; WX 635 ; N uniA751 ; G 4905\nU 42834 ; WX 734 ; N uniA752 ; G 4906\nU 42835 ; WX 774 ; N uniA753 ; G 4907\nU 42838 ; WX 787 ; N uniA756 ; G 4908\nU 42839 ; WX 635 ; N uniA757 ; G 4909\nU 42852 ; WX 605 ; N uniA764 ; G 4910\nU 42853 ; WX 635 ; N uniA765 ; G 4911\nU 42854 ; WX 605 ; N uniA766 ; G 4912\nU 42855 ; WX 635 ; N uniA767 ; G 4913\nU 42880 ; WX 557 ; N uniA780 ; G 4914\nU 42881 ; WX 278 ; N uniA781 ; G 4915\nU 42882 ; WX 735 ; N uniA782 ; G 4916\nU 42883 ; WX 634 ; N uniA783 ; G 4917\nU 42889 ; WX 337 ; N uniA789 ; G 4918\nU 42890 ; WX 376 ; N uniA78A ; G 4919\nU 42891 ; WX 401 ; N uniA78B ; G 4920\nU 42892 ; WX 275 ; N uniA78C ; G 4921\nU 42893 ; WX 686 ; N uniA78D ; G 4922\nU 42894 ; WX 487 ; N uniA78E ; G 4923\nU 42896 ; WX 772 ; N uniA790 ; G 4924\nU 42897 ; WX 667 ; N uniA791 ; G 4925\nU 42912 ; WX 775 ; N uniA7A0 ; G 4926\nU 42913 ; WX 635 ; N uniA7A1 ; G 4927\nU 42914 ; WX 656 ; N uniA7A2 ; G 4928\nU 42915 ; WX 579 ; N uniA7A3 ; G 4929\nU 42916 ; WX 748 ; N uniA7A4 ; G 4930\nU 42917 ; WX 634 ; N uniA7A5 ; G 4931\nU 42918 ; WX 695 ; N uniA7A6 ; G 4932\nU 42919 ; WX 411 ; N uniA7A7 ; G 4933\nU 42920 ; WX 635 ; N uniA7A8 ; G 4934\nU 42921 ; WX 521 ; N uniA7A9 ; G 4935\nU 42922 ; WX 801 ; N uniA7AA ; G 4936\nU 43000 ; WX 577 ; N uniA7F8 ; G 4937\nU 43001 ; WX 644 ; N uniA7F9 ; G 4938\nU 43002 ; WX 915 ; N uniA7FA ; G 4939\nU 43003 ; WX 575 ; N uniA7FB ; G 4940\nU 43004 ; WX 603 ; N uniA7FC ; G 4941\nU 43005 ; WX 863 ; N uniA7FD ; G 4942\nU 43006 ; WX 295 ; N uniA7FE ; G 4943\nU 43007 ; WX 1199 ; N uniA7FF ; G 4944\nU 61184 ; WX 213 ; N uni02E5.5 ; G 4945\nU 61185 ; WX 238 ; N uni02E6.5 ; G 4946\nU 61186 ; WX 257 ; N uni02E7.5 ; G 4947\nU 61187 ; WX 264 ; N uni02E8.5 ; G 4948\nU 61188 ; WX 267 ; N uni02E9.5 ; G 4949\nU 61189 ; WX 238 ; N uni02E5.4 ; G 4950\nU 61190 ; WX 213 ; N uni02E6.4 ; G 4951\nU 61191 ; WX 238 ; N uni02E7.4 ; G 4952\nU 61192 ; WX 257 ; N uni02E8.4 ; G 4953\nU 61193 ; WX 264 ; N uni02E9.4 ; G 4954\nU 61194 ; WX 257 ; N uni02E5.3 ; G 4955\nU 61195 ; WX 238 ; N uni02E6.3 ; G 4956\nU 61196 ; WX 213 ; N uni02E7.3 ; G 4957\nU 61197 ; WX 238 ; N uni02E8.3 ; G 4958\nU 61198 ; WX 257 ; N uni02E9.3 ; G 4959\nU 61199 ; WX 264 ; N uni02E5.2 ; G 4960\nU 61200 ; WX 257 ; N uni02E6.2 ; G 4961\nU 61201 ; WX 238 ; N uni02E7.2 ; G 4962\nU 61202 ; WX 213 ; N uni02E8.2 ; G 4963\nU 61203 ; WX 238 ; N uni02E9.2 ; G 4964\nU 61204 ; WX 267 ; N uni02E5.1 ; G 4965\nU 61205 ; WX 264 ; N uni02E6.1 ; G 4966\nU 61206 ; WX 257 ; N uni02E7.1 ; G 4967\nU 61207 ; WX 238 ; N uni02E8.1 ; G 4968\nU 61208 ; WX 213 ; N uni02E9.1 ; G 4969\nU 61209 ; WX 275 ; N stem ; G 4970\nU 61440 ; WX 977 ; N uniF000 ; G 4971\nU 61441 ; WX 977 ; N uniF001 ; G 4972\nU 61442 ; WX 977 ; N uniF002 ; G 4973\nU 61443 ; WX 977 ; N uniF003 ; G 4974\nU 62464 ; WX 580 ; N uniF400 ; G 4975\nU 62465 ; WX 580 ; N uniF401 ; G 4976\nU 62466 ; WX 624 ; N uniF402 ; G 4977\nU 62467 ; WX 889 ; N uniF403 ; G 4978\nU 62468 ; WX 585 ; N uniF404 ; G 4979\nU 62469 ; WX 580 ; N uniF405 ; G 4980\nU 62470 ; WX 653 ; N uniF406 ; G 4981\nU 62471 ; WX 882 ; N uniF407 ; G 4982\nU 62472 ; WX 555 ; N uniF408 ; G 4983\nU 62473 ; WX 580 ; N uniF409 ; G 4984\nU 62474 ; WX 1168 ; N uniF40A ; G 4985\nU 62475 ; WX 589 ; N uniF40B ; G 4986\nU 62476 ; WX 590 ; N uniF40C ; G 4987\nU 62477 ; WX 869 ; N uniF40D ; G 4988\nU 62478 ; WX 580 ; N uniF40E ; G 4989\nU 62479 ; WX 589 ; N uniF40F ; G 4990\nU 62480 ; WX 914 ; N uniF410 ; G 4991\nU 62481 ; WX 590 ; N uniF411 ; G 4992\nU 62482 ; WX 731 ; N uniF412 ; G 4993\nU 62483 ; WX 583 ; N uniF413 ; G 4994\nU 62484 ; WX 872 ; N uniF414 ; G 4995\nU 62485 ; WX 589 ; N uniF415 ; G 4996\nU 62486 ; WX 895 ; N uniF416 ; G 4997\nU 62487 ; WX 589 ; N uniF417 ; G 4998\nU 62488 ; WX 589 ; N uniF418 ; G 4999\nU 62489 ; WX 590 ; N uniF419 ; G 5000\nU 62490 ; WX 649 ; N uniF41A ; G 5001\nU 62491 ; WX 589 ; N uniF41B ; G 5002\nU 62492 ; WX 589 ; N uniF41C ; G 5003\nU 62493 ; WX 599 ; N uniF41D ; G 5004\nU 62494 ; WX 590 ; N uniF41E ; G 5005\nU 62495 ; WX 516 ; N uniF41F ; G 5006\nU 62496 ; WX 580 ; N uniF420 ; G 5007\nU 62497 ; WX 584 ; N uniF421 ; G 5008\nU 62498 ; WX 580 ; N uniF422 ; G 5009\nU 62499 ; WX 580 ; N uniF423 ; G 5010\nU 62500 ; WX 581 ; N uniF424 ; G 5011\nU 62501 ; WX 638 ; N uniF425 ; G 5012\nU 62502 ; WX 955 ; N uniF426 ; G 5013\nU 62504 ; WX 931 ; N uniF428 ; G 5014\nU 62505 ; WX 808 ; N uniF429 ; G 5015\nU 62506 ; WX 508 ; N uniF42A ; G 5016\nU 62507 ; WX 508 ; N uniF42B ; G 5017\nU 62508 ; WX 508 ; N uniF42C ; G 5018\nU 62509 ; WX 508 ; N uniF42D ; G 5019\nU 62510 ; WX 508 ; N uniF42E ; G 5020\nU 62511 ; WX 508 ; N uniF42F ; G 5021\nU 62512 ; WX 508 ; N uniF430 ; G 5022\nU 62513 ; WX 508 ; N uniF431 ; G 5023\nU 62514 ; WX 508 ; N uniF432 ; G 5024\nU 62515 ; WX 508 ; N uniF433 ; G 5025\nU 62516 ; WX 518 ; N uniF434 ; G 5026\nU 62517 ; WX 518 ; N uniF435 ; G 5027\nU 62518 ; WX 518 ; N uniF436 ; G 5028\nU 62519 ; WX 787 ; N uniF437 ; G 5029\nU 62520 ; WX 787 ; N uniF438 ; G 5030\nU 62521 ; WX 787 ; N uniF439 ; G 5031\nU 62522 ; WX 787 ; N uniF43A ; G 5032\nU 62523 ; WX 787 ; N uniF43B ; G 5033\nU 62524 ; WX 546 ; N uniF43C ; G 5034\nU 62525 ; WX 546 ; N uniF43D ; G 5035\nU 62526 ; WX 546 ; N uniF43E ; G 5036\nU 62527 ; WX 546 ; N uniF43F ; G 5037\nU 62528 ; WX 546 ; N uniF440 ; G 5038\nU 62529 ; WX 546 ; N uniF441 ; G 5039\nU 63173 ; WX 612 ; N uniF6C5 ; G 5040\nU 64256 ; WX 689 ; N uniFB00 ; G 5041\nU 64257 ; WX 630 ; N fi ; G 5042\nU 64258 ; WX 630 ; N fl ; G 5043\nU 64259 ; WX 967 ; N uniFB03 ; G 5044\nU 64260 ; WX 967 ; N uniFB04 ; G 5045\nU 64261 ; WX 686 ; N uniFB05 ; G 5046\nU 64262 ; WX 861 ; N uniFB06 ; G 5047\nU 64275 ; WX 1202 ; N uniFB13 ; G 5048\nU 64276 ; WX 1202 ; N uniFB14 ; G 5049\nU 64277 ; WX 1196 ; N uniFB15 ; G 5050\nU 64278 ; WX 1186 ; N uniFB16 ; G 5051\nU 64279 ; WX 1529 ; N uniFB17 ; G 5052\nU 64285 ; WX 224 ; N uniFB1D ; G 5053\nU 64286 ; WX 0 ; N uniFB1E ; G 5054\nU 64287 ; WX 331 ; N uniFB1F ; G 5055\nU 64288 ; WX 636 ; N uniFB20 ; G 5056\nU 64289 ; WX 856 ; N uniFB21 ; G 5057\nU 64290 ; WX 774 ; N uniFB22 ; G 5058\nU 64291 ; WX 906 ; N uniFB23 ; G 5059\nU 64292 ; WX 771 ; N uniFB24 ; G 5060\nU 64293 ; WX 843 ; N uniFB25 ; G 5061\nU 64294 ; WX 855 ; N uniFB26 ; G 5062\nU 64295 ; WX 807 ; N uniFB27 ; G 5063\nU 64296 ; WX 875 ; N uniFB28 ; G 5064\nU 64297 ; WX 838 ; N uniFB29 ; G 5065\nU 64298 ; WX 708 ; N uniFB2A ; G 5066\nU 64299 ; WX 708 ; N uniFB2B ; G 5067\nU 64300 ; WX 708 ; N uniFB2C ; G 5068\nU 64301 ; WX 708 ; N uniFB2D ; G 5069\nU 64302 ; WX 668 ; N uniFB2E ; G 5070\nU 64303 ; WX 668 ; N uniFB2F ; G 5071\nU 64304 ; WX 668 ; N uniFB30 ; G 5072\nU 64305 ; WX 578 ; N uniFB31 ; G 5073\nU 64306 ; WX 412 ; N uniFB32 ; G 5074\nU 64307 ; WX 546 ; N uniFB33 ; G 5075\nU 64308 ; WX 653 ; N uniFB34 ; G 5076\nU 64309 ; WX 355 ; N uniFB35 ; G 5077\nU 64310 ; WX 406 ; N uniFB36 ; G 5078\nU 64312 ; WX 648 ; N uniFB38 ; G 5079\nU 64313 ; WX 330 ; N uniFB39 ; G 5080\nU 64314 ; WX 537 ; N uniFB3A ; G 5081\nU 64315 ; WX 529 ; N uniFB3B ; G 5082\nU 64316 ; WX 568 ; N uniFB3C ; G 5083\nU 64318 ; WX 679 ; N uniFB3E ; G 5084\nU 64320 ; WX 399 ; N uniFB40 ; G 5085\nU 64321 ; WX 649 ; N uniFB41 ; G 5086\nU 64323 ; WX 640 ; N uniFB43 ; G 5087\nU 64324 ; WX 625 ; N uniFB44 ; G 5088\nU 64326 ; WX 593 ; N uniFB46 ; G 5089\nU 64327 ; WX 709 ; N uniFB47 ; G 5090\nU 64328 ; WX 564 ; N uniFB48 ; G 5091\nU 64329 ; WX 708 ; N uniFB49 ; G 5092\nU 64330 ; WX 657 ; N uniFB4A ; G 5093\nU 64331 ; WX 272 ; N uniFB4B ; G 5094\nU 64332 ; WX 578 ; N uniFB4C ; G 5095\nU 64333 ; WX 529 ; N uniFB4D ; G 5096\nU 64334 ; WX 625 ; N uniFB4E ; G 5097\nU 64335 ; WX 629 ; N uniFB4F ; G 5098\nU 64338 ; WX 941 ; N uniFB52 ; G 5099\nU 64339 ; WX 982 ; N uniFB53 ; G 5100\nU 64340 ; WX 278 ; N uniFB54 ; G 5101\nU 64341 ; WX 302 ; N uniFB55 ; G 5102\nU 64342 ; WX 941 ; N uniFB56 ; G 5103\nU 64343 ; WX 982 ; N uniFB57 ; G 5104\nU 64344 ; WX 278 ; N uniFB58 ; G 5105\nU 64345 ; WX 302 ; N uniFB59 ; G 5106\nU 64346 ; WX 941 ; N uniFB5A ; G 5107\nU 64347 ; WX 982 ; N uniFB5B ; G 5108\nU 64348 ; WX 278 ; N uniFB5C ; G 5109\nU 64349 ; WX 302 ; N uniFB5D ; G 5110\nU 64350 ; WX 941 ; N uniFB5E ; G 5111\nU 64351 ; WX 982 ; N uniFB5F ; G 5112\nU 64352 ; WX 278 ; N uniFB60 ; G 5113\nU 64353 ; WX 302 ; N uniFB61 ; G 5114\nU 64354 ; WX 941 ; N uniFB62 ; G 5115\nU 64355 ; WX 982 ; N uniFB63 ; G 5116\nU 64356 ; WX 278 ; N uniFB64 ; G 5117\nU 64357 ; WX 302 ; N uniFB65 ; G 5118\nU 64358 ; WX 941 ; N uniFB66 ; G 5119\nU 64359 ; WX 982 ; N uniFB67 ; G 5120\nU 64360 ; WX 278 ; N uniFB68 ; G 5121\nU 64361 ; WX 302 ; N uniFB69 ; G 5122\nU 64362 ; WX 1037 ; N uniFB6A ; G 5123\nU 64363 ; WX 1035 ; N uniFB6B ; G 5124\nU 64364 ; WX 478 ; N uniFB6C ; G 5125\nU 64365 ; WX 506 ; N uniFB6D ; G 5126\nU 64366 ; WX 1037 ; N uniFB6E ; G 5127\nU 64367 ; WX 1035 ; N uniFB6F ; G 5128\nU 64368 ; WX 478 ; N uniFB70 ; G 5129\nU 64369 ; WX 506 ; N uniFB71 ; G 5130\nU 64370 ; WX 646 ; N uniFB72 ; G 5131\nU 64371 ; WX 646 ; N uniFB73 ; G 5132\nU 64372 ; WX 618 ; N uniFB74 ; G 5133\nU 64373 ; WX 646 ; N uniFB75 ; G 5134\nU 64374 ; WX 646 ; N uniFB76 ; G 5135\nU 64375 ; WX 646 ; N uniFB77 ; G 5136\nU 64376 ; WX 618 ; N uniFB78 ; G 5137\nU 64377 ; WX 646 ; N uniFB79 ; G 5138\nU 64378 ; WX 646 ; N uniFB7A ; G 5139\nU 64379 ; WX 646 ; N uniFB7B ; G 5140\nU 64380 ; WX 618 ; N uniFB7C ; G 5141\nU 64381 ; WX 646 ; N uniFB7D ; G 5142\nU 64382 ; WX 646 ; N uniFB7E ; G 5143\nU 64383 ; WX 646 ; N uniFB7F ; G 5144\nU 64384 ; WX 618 ; N uniFB80 ; G 5145\nU 64385 ; WX 646 ; N uniFB81 ; G 5146\nU 64386 ; WX 445 ; N uniFB82 ; G 5147\nU 64387 ; WX 525 ; N uniFB83 ; G 5148\nU 64388 ; WX 445 ; N uniFB84 ; G 5149\nU 64389 ; WX 525 ; N uniFB85 ; G 5150\nU 64390 ; WX 445 ; N uniFB86 ; G 5151\nU 64391 ; WX 525 ; N uniFB87 ; G 5152\nU 64392 ; WX 445 ; N uniFB88 ; G 5153\nU 64393 ; WX 525 ; N uniFB89 ; G 5154\nU 64394 ; WX 483 ; N uniFB8A ; G 5155\nU 64395 ; WX 552 ; N uniFB8B ; G 5156\nU 64396 ; WX 483 ; N uniFB8C ; G 5157\nU 64397 ; WX 552 ; N uniFB8D ; G 5158\nU 64398 ; WX 895 ; N uniFB8E ; G 5159\nU 64399 ; WX 895 ; N uniFB8F ; G 5160\nU 64400 ; WX 476 ; N uniFB90 ; G 5161\nU 64401 ; WX 552 ; N uniFB91 ; G 5162\nU 64402 ; WX 895 ; N uniFB92 ; G 5163\nU 64403 ; WX 895 ; N uniFB93 ; G 5164\nU 64404 ; WX 476 ; N uniFB94 ; G 5165\nU 64405 ; WX 552 ; N uniFB95 ; G 5166\nU 64406 ; WX 895 ; N uniFB96 ; G 5167\nU 64407 ; WX 895 ; N uniFB97 ; G 5168\nU 64408 ; WX 476 ; N uniFB98 ; G 5169\nU 64409 ; WX 552 ; N uniFB99 ; G 5170\nU 64410 ; WX 895 ; N uniFB9A ; G 5171\nU 64411 ; WX 895 ; N uniFB9B ; G 5172\nU 64412 ; WX 476 ; N uniFB9C ; G 5173\nU 64413 ; WX 552 ; N uniFB9D ; G 5174\nU 64414 ; WX 734 ; N uniFB9E ; G 5175\nU 64415 ; WX 761 ; N uniFB9F ; G 5176\nU 64416 ; WX 734 ; N uniFBA0 ; G 5177\nU 64417 ; WX 761 ; N uniFBA1 ; G 5178\nU 64418 ; WX 278 ; N uniFBA2 ; G 5179\nU 64419 ; WX 302 ; N uniFBA3 ; G 5180\nU 64426 ; WX 698 ; N uniFBAA ; G 5181\nU 64427 ; WX 632 ; N uniFBAB ; G 5182\nU 64428 ; WX 527 ; N uniFBAC ; G 5183\nU 64429 ; WX 461 ; N uniFBAD ; G 5184\nU 64467 ; WX 824 ; N uniFBD3 ; G 5185\nU 64468 ; WX 843 ; N uniFBD4 ; G 5186\nU 64469 ; WX 476 ; N uniFBD5 ; G 5187\nU 64470 ; WX 552 ; N uniFBD6 ; G 5188\nU 64471 ; WX 483 ; N uniFBD7 ; G 5189\nU 64472 ; WX 517 ; N uniFBD8 ; G 5190\nU 64473 ; WX 483 ; N uniFBD9 ; G 5191\nU 64474 ; WX 517 ; N uniFBDA ; G 5192\nU 64475 ; WX 483 ; N uniFBDB ; G 5193\nU 64476 ; WX 517 ; N uniFBDC ; G 5194\nU 64478 ; WX 483 ; N uniFBDE ; G 5195\nU 64479 ; WX 517 ; N uniFBDF ; G 5196\nU 64484 ; WX 783 ; N uniFBE4 ; G 5197\nU 64485 ; WX 833 ; N uniFBE5 ; G 5198\nU 64486 ; WX 278 ; N uniFBE6 ; G 5199\nU 64487 ; WX 302 ; N uniFBE7 ; G 5200\nU 64488 ; WX 278 ; N uniFBE8 ; G 5201\nU 64489 ; WX 302 ; N uniFBE9 ; G 5202\nU 64508 ; WX 783 ; N uniFBFC ; G 5203\nU 64509 ; WX 833 ; N uniFBFD ; G 5204\nU 64510 ; WX 278 ; N uniFBFE ; G 5205\nU 64511 ; WX 302 ; N uniFBFF ; G 5206\nU 65024 ; WX 0 ; N uniFE00 ; G 5207\nU 65025 ; WX 0 ; N uniFE01 ; G 5208\nU 65026 ; WX 0 ; N uniFE02 ; G 5209\nU 65027 ; WX 0 ; N uniFE03 ; G 5210\nU 65028 ; WX 0 ; N uniFE04 ; G 5211\nU 65029 ; WX 0 ; N uniFE05 ; G 5212\nU 65030 ; WX 0 ; N uniFE06 ; G 5213\nU 65031 ; WX 0 ; N uniFE07 ; G 5214\nU 65032 ; WX 0 ; N uniFE08 ; G 5215\nU 65033 ; WX 0 ; N uniFE09 ; G 5216\nU 65034 ; WX 0 ; N uniFE0A ; G 5217\nU 65035 ; WX 0 ; N uniFE0B ; G 5218\nU 65036 ; WX 0 ; N uniFE0C ; G 5219\nU 65037 ; WX 0 ; N uniFE0D ; G 5220\nU 65038 ; WX 0 ; N uniFE0E ; G 5221\nU 65039 ; WX 0 ; N uniFE0F ; G 5222\nU 65056 ; WX 0 ; N uniFE20 ; G 5223\nU 65057 ; WX 0 ; N uniFE21 ; G 5224\nU 65058 ; WX 0 ; N uniFE22 ; G 5225\nU 65059 ; WX 0 ; N uniFE23 ; G 5226\nU 65136 ; WX 293 ; N uniFE70 ; G 5227\nU 65137 ; WX 293 ; N uniFE71 ; G 5228\nU 65138 ; WX 293 ; N uniFE72 ; G 5229\nU 65139 ; WX 262 ; N uniFE73 ; G 5230\nU 65140 ; WX 293 ; N uniFE74 ; G 5231\nU 65142 ; WX 293 ; N uniFE76 ; G 5232\nU 65143 ; WX 293 ; N uniFE77 ; G 5233\nU 65144 ; WX 293 ; N uniFE78 ; G 5234\nU 65145 ; WX 293 ; N uniFE79 ; G 5235\nU 65146 ; WX 293 ; N uniFE7A ; G 5236\nU 65147 ; WX 293 ; N uniFE7B ; G 5237\nU 65148 ; WX 293 ; N uniFE7C ; G 5238\nU 65149 ; WX 293 ; N uniFE7D ; G 5239\nU 65150 ; WX 293 ; N uniFE7E ; G 5240\nU 65151 ; WX 293 ; N uniFE7F ; G 5241\nU 65152 ; WX 470 ; N uniFE80 ; G 5242\nU 65153 ; WX 278 ; N uniFE81 ; G 5243\nU 65154 ; WX 305 ; N uniFE82 ; G 5244\nU 65155 ; WX 278 ; N uniFE83 ; G 5245\nU 65156 ; WX 305 ; N uniFE84 ; G 5246\nU 65157 ; WX 483 ; N uniFE85 ; G 5247\nU 65158 ; WX 517 ; N uniFE86 ; G 5248\nU 65159 ; WX 278 ; N uniFE87 ; G 5249\nU 65160 ; WX 305 ; N uniFE88 ; G 5250\nU 65161 ; WX 783 ; N uniFE89 ; G 5251\nU 65162 ; WX 833 ; N uniFE8A ; G 5252\nU 65163 ; WX 278 ; N uniFE8B ; G 5253\nU 65164 ; WX 302 ; N uniFE8C ; G 5254\nU 65165 ; WX 278 ; N uniFE8D ; G 5255\nU 65166 ; WX 305 ; N uniFE8E ; G 5256\nU 65167 ; WX 941 ; N uniFE8F ; G 5257\nU 65168 ; WX 982 ; N uniFE90 ; G 5258\nU 65169 ; WX 278 ; N uniFE91 ; G 5259\nU 65170 ; WX 302 ; N uniFE92 ; G 5260\nU 65171 ; WX 524 ; N uniFE93 ; G 5261\nU 65172 ; WX 536 ; N uniFE94 ; G 5262\nU 65173 ; WX 941 ; N uniFE95 ; G 5263\nU 65174 ; WX 982 ; N uniFE96 ; G 5264\nU 65175 ; WX 278 ; N uniFE97 ; G 5265\nU 65176 ; WX 302 ; N uniFE98 ; G 5266\nU 65177 ; WX 941 ; N uniFE99 ; G 5267\nU 65178 ; WX 982 ; N uniFE9A ; G 5268\nU 65179 ; WX 278 ; N uniFE9B ; G 5269\nU 65180 ; WX 302 ; N uniFE9C ; G 5270\nU 65181 ; WX 646 ; N uniFE9D ; G 5271\nU 65182 ; WX 646 ; N uniFE9E ; G 5272\nU 65183 ; WX 618 ; N uniFE9F ; G 5273\nU 65184 ; WX 646 ; N uniFEA0 ; G 5274\nU 65185 ; WX 646 ; N uniFEA1 ; G 5275\nU 65186 ; WX 646 ; N uniFEA2 ; G 5276\nU 65187 ; WX 618 ; N uniFEA3 ; G 5277\nU 65188 ; WX 646 ; N uniFEA4 ; G 5278\nU 65189 ; WX 646 ; N uniFEA5 ; G 5279\nU 65190 ; WX 646 ; N uniFEA6 ; G 5280\nU 65191 ; WX 618 ; N uniFEA7 ; G 5281\nU 65192 ; WX 646 ; N uniFEA8 ; G 5282\nU 65193 ; WX 445 ; N uniFEA9 ; G 5283\nU 65194 ; WX 525 ; N uniFEAA ; G 5284\nU 65195 ; WX 445 ; N uniFEAB ; G 5285\nU 65196 ; WX 525 ; N uniFEAC ; G 5286\nU 65197 ; WX 483 ; N uniFEAD ; G 5287\nU 65198 ; WX 552 ; N uniFEAE ; G 5288\nU 65199 ; WX 483 ; N uniFEAF ; G 5289\nU 65200 ; WX 552 ; N uniFEB0 ; G 5290\nU 65201 ; WX 1221 ; N uniFEB1 ; G 5291\nU 65202 ; WX 1275 ; N uniFEB2 ; G 5292\nU 65203 ; WX 838 ; N uniFEB3 ; G 5293\nU 65204 ; WX 892 ; N uniFEB4 ; G 5294\nU 65205 ; WX 1221 ; N uniFEB5 ; G 5295\nU 65206 ; WX 1275 ; N uniFEB6 ; G 5296\nU 65207 ; WX 838 ; N uniFEB7 ; G 5297\nU 65208 ; WX 892 ; N uniFEB8 ; G 5298\nU 65209 ; WX 1209 ; N uniFEB9 ; G 5299\nU 65210 ; WX 1225 ; N uniFEBA ; G 5300\nU 65211 ; WX 849 ; N uniFEBB ; G 5301\nU 65212 ; WX 867 ; N uniFEBC ; G 5302\nU 65213 ; WX 1209 ; N uniFEBD ; G 5303\nU 65214 ; WX 1225 ; N uniFEBE ; G 5304\nU 65215 ; WX 849 ; N uniFEBF ; G 5305\nU 65216 ; WX 867 ; N uniFEC0 ; G 5306\nU 65217 ; WX 925 ; N uniFEC1 ; G 5307\nU 65218 ; WX 949 ; N uniFEC2 ; G 5308\nU 65219 ; WX 796 ; N uniFEC3 ; G 5309\nU 65220 ; WX 820 ; N uniFEC4 ; G 5310\nU 65221 ; WX 925 ; N uniFEC5 ; G 5311\nU 65222 ; WX 949 ; N uniFEC6 ; G 5312\nU 65223 ; WX 796 ; N uniFEC7 ; G 5313\nU 65224 ; WX 820 ; N uniFEC8 ; G 5314\nU 65225 ; WX 597 ; N uniFEC9 ; G 5315\nU 65226 ; WX 532 ; N uniFECA ; G 5316\nU 65227 ; WX 597 ; N uniFECB ; G 5317\nU 65228 ; WX 482 ; N uniFECC ; G 5318\nU 65229 ; WX 597 ; N uniFECD ; G 5319\nU 65230 ; WX 532 ; N uniFECE ; G 5320\nU 65231 ; WX 523 ; N uniFECF ; G 5321\nU 65232 ; WX 482 ; N uniFED0 ; G 5322\nU 65233 ; WX 1037 ; N uniFED1 ; G 5323\nU 65234 ; WX 1035 ; N uniFED2 ; G 5324\nU 65235 ; WX 478 ; N uniFED3 ; G 5325\nU 65236 ; WX 506 ; N uniFED4 ; G 5326\nU 65237 ; WX 776 ; N uniFED5 ; G 5327\nU 65238 ; WX 834 ; N uniFED6 ; G 5328\nU 65239 ; WX 478 ; N uniFED7 ; G 5329\nU 65240 ; WX 506 ; N uniFED8 ; G 5330\nU 65241 ; WX 824 ; N uniFED9 ; G 5331\nU 65242 ; WX 843 ; N uniFEDA ; G 5332\nU 65243 ; WX 476 ; N uniFEDB ; G 5333\nU 65244 ; WX 552 ; N uniFEDC ; G 5334\nU 65245 ; WX 727 ; N uniFEDD ; G 5335\nU 65246 ; WX 757 ; N uniFEDE ; G 5336\nU 65247 ; WX 305 ; N uniFEDF ; G 5337\nU 65248 ; WX 331 ; N uniFEE0 ; G 5338\nU 65249 ; WX 619 ; N uniFEE1 ; G 5339\nU 65250 ; WX 666 ; N uniFEE2 ; G 5340\nU 65251 ; WX 536 ; N uniFEE3 ; G 5341\nU 65252 ; WX 578 ; N uniFEE4 ; G 5342\nU 65253 ; WX 734 ; N uniFEE5 ; G 5343\nU 65254 ; WX 761 ; N uniFEE6 ; G 5344\nU 65255 ; WX 278 ; N uniFEE7 ; G 5345\nU 65256 ; WX 302 ; N uniFEE8 ; G 5346\nU 65257 ; WX 524 ; N uniFEE9 ; G 5347\nU 65258 ; WX 536 ; N uniFEEA ; G 5348\nU 65259 ; WX 527 ; N uniFEEB ; G 5349\nU 65260 ; WX 461 ; N uniFEEC ; G 5350\nU 65261 ; WX 483 ; N uniFEED ; G 5351\nU 65262 ; WX 517 ; N uniFEEE ; G 5352\nU 65263 ; WX 783 ; N uniFEEF ; G 5353\nU 65264 ; WX 833 ; N uniFEF0 ; G 5354\nU 65265 ; WX 783 ; N uniFEF1 ; G 5355\nU 65266 ; WX 833 ; N uniFEF2 ; G 5356\nU 65267 ; WX 278 ; N uniFEF3 ; G 5357\nU 65268 ; WX 302 ; N uniFEF4 ; G 5358\nU 65269 ; WX 570 ; N uniFEF5 ; G 5359\nU 65270 ; WX 597 ; N uniFEF6 ; G 5360\nU 65271 ; WX 570 ; N uniFEF7 ; G 5361\nU 65272 ; WX 597 ; N uniFEF8 ; G 5362\nU 65273 ; WX 570 ; N uniFEF9 ; G 5363\nU 65274 ; WX 597 ; N uniFEFA ; G 5364\nU 65275 ; WX 570 ; N uniFEFB ; G 5365\nU 65276 ; WX 597 ; N uniFEFC ; G 5366\nU 65279 ; WX 0 ; N uniFEFF ; G 5367\nU 65529 ; WX 0 ; N uniFFF9 ; G 5368\nU 65530 ; WX 0 ; N uniFFFA ; G 5369\nU 65531 ; WX 0 ; N uniFFFB ; G 5370\nU 65532 ; WX 0 ; N uniFFFC ; G 5371\nU 65533 ; WX 1025 ; N uniFFFD ; G 5372\nEndCharMetrics\nStartKernData \nStartKernPairs 2727\n\nKPX dollar dollar 57\nKPX dollar ampersand -36\nKPX dollar asterisk -36\nKPX dollar two -36\nKPX dollar four -36\nKPX dollar seven -159\nKPX dollar nine -131\nKPX dollar colon -112\nKPX dollar less -159\nKPX dollar F -36\nKPX dollar G -36\nKPX dollar H -36\nKPX dollar I -73\nKPX dollar R -36\nKPX dollar T -36\nKPX dollar W -36\nKPX dollar Y -120\nKPX dollar Z -83\nKPX dollar backslash -139\nKPX dollar m -73\nKPX dollar copyright -36\nKPX dollar ordfeminine -36\nKPX dollar guillemotleft -36\nKPX dollar logicalnot -36\nKPX dollar sfthyphen -36\nKPX dollar acute -36\nKPX dollar mu -36\nKPX dollar paragraph -36\nKPX dollar periodcentered -36\nKPX dollar cedilla -36\nKPX dollar questiondown -139\nKPX dollar Aacute -139\nKPX dollar Acircumflex 57\nKPX dollar Adieresis 57\nKPX dollar AE 57\nKPX dollar Egrave -36\nKPX dollar Eacute -36\nKPX dollar Ecircumflex -36\nKPX dollar Edieresis -36\nKPX dollar Igrave -36\nKPX dollar Iacute -36\nKPX dollar Icircumflex -36\nKPX dollar Idieresis -36\nKPX dollar Ntilde -36\nKPX dollar Oacute -36\nKPX dollar Otilde -36\nKPX dollar multiply -36\nKPX dollar Ugrave -36\nKPX dollar Ucircumflex -36\nKPX dollar Yacute -36\nKPX dollar Thorn -36\nKPX dollar agrave -36\nKPX dollar acircumflex -36\nKPX dollar Dcaron -36\nKPX dollar dcaron -36\nKPX dollar Dcroat -36\nKPX dollar dmacron -36\nKPX dollar Emacron -36\nKPX dollar emacron -36\nKPX dollar Hcircumflex -159\nKPX dollar hcircumflex -36\nKPX dollar Hbar -159\nKPX dollar hbar -36\nKPX dollar Kcommaaccent -112\nKPX dollar kcommaaccent -83\nKPX dollar kgreenlandic -159\nKPX dollar Lacute -139\nKPX dollar lacute -159\nKPX dollar uni0188 -36\nKPX dollar uni01AC -36\nKPX dollar uni01AD -36\nKPX dollar uni01AE -36\nKPX dollar Uhorn -36\nKPX dollar uni01DC -159\nKPX dollar uni01DD -36\nKPX dollar uni01F0 -36\nKPX dollar uni01F3 -36\nKPX dollar uni01F4 -159\nKPX dollar uni01F5 -139\n\nKPX percent ampersand -36\nKPX percent asterisk -36\nKPX percent two -36\nKPX percent six -36\nKPX percent nine -63\nKPX percent colon -73\nKPX percent less -112\nKPX percent m -63\nKPX percent braceright -36\nKPX percent Egrave -36\nKPX percent Ecircumflex -36\nKPX percent Igrave -36\nKPX percent Icircumflex -36\nKPX percent Thorn -36\nKPX percent agrave -36\nKPX percent acircumflex -36\nKPX percent adieresis -36\nKPX percent Dcaron -36\nKPX percent Dcroat -36\nKPX percent Emacron -36\nKPX percent Gcircumflex -36\nKPX percent Gbreve -36\nKPX percent Gdotaccent -36\nKPX percent Gcommaaccent -36\nKPX percent Kcommaaccent -73\nKPX percent kgreenlandic -112\nKPX percent lacute -112\nKPX percent uni01AC -36\nKPX percent uni01AE -36\nKPX percent uni01DA -36\nKPX percent uni01F0 -36\n\nKPX ampersand less -36\nKPX ampersand m -36\nKPX ampersand braceright -36\nKPX ampersand kgreenlandic -36\nKPX ampersand lacute -36\nKPX ampersand uni01F4 -36\n\nKPX quotesingle dollar -36\nKPX quotesingle nine -36\nKPX quotesingle less -112\nKPX quotesingle m -36\nKPX quotesingle braceright -36\nKPX quotesingle Acircumflex -36\nKPX quotesingle Adieresis -36\nKPX quotesingle AE -36\nKPX quotesingle kgreenlandic -112\nKPX quotesingle lacute -112\nKPX quotesingle uni01F4 -112\n\nKPX parenright dollar -188\nKPX parenright six -36\nKPX parenright seven -36\nKPX parenright D -188\nKPX parenright H -112\nKPX parenright L -149\nKPX parenright R -73\nKPX parenright U -149\nKPX parenright X -112\nKPX parenright backslash -188\nKPX parenright cent -188\nKPX parenright sterling -188\nKPX parenright currency -188\nKPX parenright yen -188\nKPX parenright brokenbar -188\nKPX parenright section -188\nKPX parenright ordfeminine -112\nKPX parenright guillemotleft -112\nKPX parenright logicalnot -112\nKPX parenright sfthyphen -112\nKPX parenright acute -73\nKPX parenright mu -73\nKPX parenright paragraph -73\nKPX parenright periodcentered -73\nKPX parenright cedilla -73\nKPX parenright guillemotright -112\nKPX parenright onequarter -112\nKPX parenright onehalf -112\nKPX parenright threequarters -112\nKPX parenright questiondown -188\nKPX parenright Aacute -188\nKPX parenright Acircumflex -188\nKPX parenright Atilde -188\nKPX parenright Adieresis -188\nKPX parenright Aring -188\nKPX parenright AE -188\nKPX parenright Ccedilla -188\nKPX parenright Otilde -112\nKPX parenright multiply -112\nKPX parenright Ugrave -112\nKPX parenright Ucircumflex -112\nKPX parenright Yacute -112\nKPX parenright ntilde -149\nKPX parenright otilde -149\nKPX parenright dcaron -73\nKPX parenright dmacron -73\nKPX parenright emacron -73\nKPX parenright edotaccent -149\nKPX parenright eogonek -149\nKPX parenright ecaron -149\nKPX parenright Gcircumflex -36\nKPX parenright Gbreve -36\nKPX parenright Gdotaccent -36\nKPX parenright Gcommaaccent -36\nKPX parenright Hcircumflex -36\nKPX parenright Hbar -36\nKPX parenright Itilde -36\nKPX parenright imacron -112\nKPX parenright ibreve -112\nKPX parenright iogonek -112\nKPX parenright dotlessi -112\nKPX parenright ij -112\nKPX parenright jcircumflex -112\nKPX parenright Lacute -188\nKPX parenright uni01AD -73\nKPX parenright Uhorn -73\nKPX parenright uni01DA -36\nKPX parenright uni01DC -36\nKPX parenright uni01F1 -73\nKPX parenright uni01F5 -188\n\nKPX asterisk seven -73\nKPX asterisk less -102\nKPX asterisk m -36\nKPX asterisk braceright -36\nKPX asterisk Hbar -73\nKPX asterisk lacute -102\n\n\nKPX hyphen dollar -36\nKPX hyphen m -36\nKPX hyphen braceright -36\n\nKPX period dollar -36\nKPX period ampersand -112\nKPX period two -112\nKPX period seven -159\nKPX period eight -55\nKPX period colon -73\nKPX period less -73\nKPX period D -36\nKPX period H -102\nKPX period R -102\nKPX period X -102\nKPX period backslash -149\nKPX period m -131\nKPX period cent -36\nKPX period sterling -36\nKPX period currency -36\nKPX period yen -36\nKPX period brokenbar -36\nKPX period section -36\nKPX period ordfeminine -102\nKPX period guillemotleft -102\nKPX period logicalnot -102\nKPX period sfthyphen -102\nKPX period acute -102\nKPX period mu -102\nKPX period paragraph -102\nKPX period periodcentered -102\nKPX period cedilla -102\nKPX period guillemotright -102\nKPX period onequarter -102\nKPX period onehalf -102\nKPX period threequarters -102\nKPX period questiondown -149\nKPX period Aacute -149\nKPX period Egrave -112\nKPX period Icircumflex -112\nKPX period Yacute -102\nKPX period Hbar -159\nKPX period Idot -55\nKPX period dotlessi -102\nKPX period lacute -73\n\nKPX slash dollar 47\nKPX slash two -73\nKPX slash seven -282\nKPX slash eight -102\nKPX slash nine -225\nKPX slash colon -188\nKPX slash less -272\nKPX slash H -36\nKPX slash R -36\nKPX slash X -36\nKPX slash backslash -188\nKPX slash ordfeminine -36\nKPX slash guillemotleft -36\nKPX slash logicalnot -36\nKPX slash sfthyphen -36\nKPX slash acute -36\nKPX slash mu -36\nKPX slash paragraph -36\nKPX slash periodcentered -36\nKPX slash cedilla -36\nKPX slash guillemotright -36\nKPX slash onequarter -36\nKPX slash onehalf -36\nKPX slash threequarters -36\nKPX slash questiondown -188\nKPX slash Aacute -188\nKPX slash Yacute -36\nKPX slash Hbar -282\nKPX slash Idot -102\nKPX slash dotlessi -36\nKPX slash lacute -272\n\nKPX two dollar -36\nKPX two nine -36\nKPX two semicolon -131\nKPX two less -112\nKPX two m -36\nKPX two lacute -112\n\nKPX three dollar -131\nKPX three less -45\nKPX three D -92\nKPX three H -73\nKPX three L -45\nKPX three Q -36\nKPX three R -73\nKPX three U -36\nKPX three V -36\nKPX three X -36\nKPX three m -36\nKPX three cent -92\nKPX three sterling -92\nKPX three currency -92\nKPX three yen -92\nKPX three brokenbar -92\nKPX three section -92\nKPX three ordfeminine -73\nKPX three guillemotleft -73\nKPX three logicalnot -73\nKPX three sfthyphen -73\nKPX three threesuperior -36\nKPX three acute -73\nKPX three mu -73\nKPX three paragraph -73\nKPX three periodcentered -73\nKPX three cedilla -73\nKPX three guillemotright -36\nKPX three onequarter -36\nKPX three onehalf -36\nKPX three threequarters -36\nKPX three Yacute -73\nKPX three Cdotaccent -36\nKPX three edotaccent -36\nKPX three ecaron -36\nKPX three gdotaccent -36\nKPX three gcommaaccent -36\nKPX three dotlessi -36\nKPX three lacute -45\n\n\nKPX five dollar -83\nKPX five ampersand -102\nKPX five seven -149\nKPX five nine -112\nKPX five colon -83\nKPX five less -131\nKPX five D -45\nKPX five H -92\nKPX five R -92\nKPX five X -92\nKPX five backslash -112\nKPX five m -112\nKPX five braceright -36\nKPX five cent -45\nKPX five sterling -45\nKPX five currency -45\nKPX five yen -45\nKPX five brokenbar -45\nKPX five section -45\nKPX five ordfeminine -92\nKPX five guillemotleft -92\nKPX five logicalnot -92\nKPX five sfthyphen -92\nKPX five acute -92\nKPX five mu -92\nKPX five paragraph -92\nKPX five periodcentered -92\nKPX five cedilla -92\nKPX five guillemotright -92\nKPX five onequarter -92\nKPX five onehalf -92\nKPX five threequarters -92\nKPX five questiondown -112\nKPX five Aacute -112\nKPX five Egrave -102\nKPX five Icircumflex -102\nKPX five Yacute -92\nKPX five Hbar -149\nKPX five dotlessi -92\nKPX five lacute -131\n\nKPX six dollar 38\n\nKPX seven dollar -159\nKPX seven ampersand -120\nKPX seven seven -36\nKPX seven D -339\nKPX seven F -348\nKPX seven H -348\nKPX seven L -63\nKPX seven R -348\nKPX seven U -301\nKPX seven V -339\nKPX seven X -311\nKPX seven Z -339\nKPX seven backslash -319\nKPX seven m -188\nKPX seven braceright -112\nKPX seven cent -239\nKPX seven sterling -339\nKPX seven currency -239\nKPX seven yen -239\nKPX seven brokenbar -239\nKPX seven section -239\nKPX seven copyright -348\nKPX seven ordfeminine -288\nKPX seven guillemotleft -348\nKPX seven logicalnot -288\nKPX seven sfthyphen -288\nKPX seven acute -268\nKPX seven mu -348\nKPX seven paragraph -268\nKPX seven periodcentered -268\nKPX seven cedilla -268\nKPX seven guillemotright -281\nKPX seven onequarter -311\nKPX seven onehalf -281\nKPX seven threequarters -281\nKPX seven questiondown -319\nKPX seven Aacute -319\nKPX seven Egrave -120\nKPX seven Eacute -348\nKPX seven Icircumflex -120\nKPX seven Idieresis -348\nKPX seven Yacute -348\nKPX seven edotaccent -301\nKPX seven ecaron -301\nKPX seven gdotaccent -339\nKPX seven gcommaaccent -339\nKPX seven Hbar -36\nKPX seven dotlessi -311\n\nKPX eight equal -36\nKPX eight Ldot -36\n\nKPX nine dollar -131\nKPX nine two -36\nKPX nine D -159\nKPX nine H -159\nKPX nine L -45\nKPX nine R -159\nKPX nine X -139\nKPX nine backslash -55\nKPX nine m -178\nKPX nine braceright -112\nKPX nine cent -159\nKPX nine sterling -159\nKPX nine currency -159\nKPX nine yen -159\nKPX nine brokenbar -159\nKPX nine section -159\nKPX nine ordfeminine -159\nKPX nine guillemotleft -159\nKPX nine logicalnot -159\nKPX nine sfthyphen -159\nKPX nine acute -159\nKPX nine mu -159\nKPX nine paragraph -159\nKPX nine periodcentered -159\nKPX nine cedilla -159\nKPX nine guillemotright -139\nKPX nine onequarter -139\nKPX nine onehalf -139\nKPX nine threequarters -139\nKPX nine questiondown -55\nKPX nine Aacute -55\nKPX nine Yacute -159\nKPX nine dotlessi -139\n\nKPX colon dollar -112\nKPX colon D -131\nKPX colon H -120\nKPX colon L -45\nKPX colon R -120\nKPX colon U -92\nKPX colon X -73\nKPX colon backslash -36\nKPX colon m -112\nKPX colon braceright -36\nKPX colon cent -131\nKPX colon sterling -131\nKPX colon currency -131\nKPX colon yen -131\nKPX colon brokenbar -131\nKPX colon section -131\nKPX colon ordfeminine -120\nKPX colon guillemotleft -120\nKPX colon logicalnot -120\nKPX colon sfthyphen -120\nKPX colon acute -120\nKPX colon mu -120\nKPX colon paragraph -120\nKPX colon periodcentered -120\nKPX colon cedilla -120\nKPX colon guillemotright -73\nKPX colon onequarter -73\nKPX colon onehalf -73\nKPX colon threequarters -73\nKPX colon questiondown -36\nKPX colon Aacute -36\nKPX colon Yacute -120\nKPX colon edotaccent -92\nKPX colon ecaron -92\nKPX colon dotlessi -73\n\nKPX semicolon ampersand -149\nKPX semicolon two -131\nKPX semicolon seven -36\nKPX semicolon H -92\nKPX semicolon m -112\nKPX semicolon ordfeminine -92\nKPX semicolon guillemotleft -92\nKPX semicolon logicalnot -92\nKPX semicolon sfthyphen -92\nKPX semicolon Egrave -149\nKPX semicolon Icircumflex -149\nKPX semicolon Yacute -92\nKPX semicolon Hbar -36\n\nKPX less dollar -159\nKPX less ampersand -112\nKPX less two -112\nKPX less D -282\nKPX less H -272\nKPX less L -73\nKPX less R -272\nKPX less X -235\nKPX less m -225\nKPX less braceright -149\nKPX less cent -282\nKPX less sterling -282\nKPX less currency -282\nKPX less yen -282\nKPX less brokenbar -282\nKPX less section -282\nKPX less ordfeminine -272\nKPX less guillemotleft -272\nKPX less logicalnot -272\nKPX less sfthyphen -272\nKPX less acute -272\nKPX less mu -272\nKPX less paragraph -272\nKPX less periodcentered -272\nKPX less cedilla -272\nKPX less guillemotright -235\nKPX less onequarter -235\nKPX less onehalf -235\nKPX less threequarters -235\nKPX less Egrave -112\nKPX less Icircumflex -112\nKPX less Yacute -272\nKPX less dotlessi -235\n\n\nKPX H bracketleft -36\n\nKPX I W -36\nKPX I Z -36\nKPX I backslash -36\nKPX I m -73\nKPX I braceright -36\nKPX I questiondown -36\nKPX I Aacute -36\nKPX I hbar -36\n\nKPX N D -36\nKPX N H -73\nKPX N R -73\nKPX N X -63\nKPX N backslash -73\nKPX N cent -36\nKPX N sterling -36\nKPX N currency -36\nKPX N yen -36\nKPX N brokenbar -36\nKPX N section -36\nKPX N ordfeminine -73\nKPX N guillemotleft -73\nKPX N logicalnot -73\nKPX N sfthyphen -73\nKPX N acute -73\nKPX N mu -73\nKPX N paragraph -73\nKPX N periodcentered -73\nKPX N cedilla -73\nKPX N guillemotright -63\nKPX N onequarter -63\nKPX N onehalf -63\nKPX N threequarters -63\nKPX N questiondown -73\nKPX N Aacute -73\nKPX N Yacute -73\nKPX N dotlessi -63\n\n\nKPX R bracketleft -63\n\nKPX U F -45\nKPX U G -36\nKPX U H -45\nKPX U J -36\nKPX U K -36\nKPX U P -36\nKPX U Q -36\nKPX U R -45\nKPX U T -36\nKPX U U -36\nKPX U bracketleft -55\nKPX U m -73\nKPX U copyright -45\nKPX U ordfeminine -45\nKPX U guillemotleft -45\nKPX U logicalnot -45\nKPX U sfthyphen -45\nKPX U threesuperior -36\nKPX U acute -45\nKPX U mu -45\nKPX U paragraph -45\nKPX U periodcentered -45\nKPX U cedilla -45\nKPX U Eacute -45\nKPX U Idieresis -45\nKPX U Ntilde 72\nKPX U Yacute -45\nKPX U aacute -36\nKPX U Cdotaccent -36\nKPX U edotaccent -36\nKPX U ecaron -36\n\nKPX Y m -36\nKPX Y braceright -36\n\nKPX Z m -36\nKPX Z braceright -36\n\nKPX bracketleft F -36\nKPX bracketleft H -63\nKPX bracketleft R -63\nKPX bracketleft copyright -36\nKPX bracketleft ordfeminine -63\nKPX bracketleft guillemotleft -63\nKPX bracketleft logicalnot -63\nKPX bracketleft sfthyphen -63\nKPX bracketleft acute -63\nKPX bracketleft mu -63\nKPX bracketleft paragraph -63\nKPX bracketleft periodcentered -63\nKPX bracketleft cedilla -63\nKPX bracketleft Eacute -36\nKPX bracketleft Idieresis -36\nKPX bracketleft Yacute -63\n\nKPX backslash m -36\nKPX backslash braceright -36\n\nKPX m percent -36\nKPX m ampersand -36\nKPX m quotesingle -36\nKPX m asterisk -36\nKPX m hyphen -36\nKPX m seven -112\nKPX m nine -112\nKPX m colon -36\nKPX m less -149\nKPX m Y -36\nKPX m Z -36\nKPX m backslash -36\nKPX m questiondown -36\nKPX m Aacute -36\nKPX m Egrave -36\nKPX m Icircumflex -36\nKPX m Eth -36\nKPX m agrave -36\nKPX m Hbar -112\nKPX m lacute -149\n\nKPX braceright dollar -73\nKPX braceright percent -73\nKPX braceright ampersand -36\nKPX braceright quotesingle -36\nKPX braceright hyphen -36\nKPX braceright two -36\nKPX braceright seven -188\nKPX braceright nine -178\nKPX braceright colon -112\nKPX braceright semicolon -112\nKPX braceright less -225\nKPX braceright Y -36\nKPX braceright Z -36\nKPX braceright backslash -36\nKPX braceright questiondown -36\nKPX braceright Aacute -36\nKPX braceright Egrave -36\nKPX braceright Icircumflex -36\nKPX braceright Eth -36\nKPX braceright Hbar -188\nKPX braceright lacute -225\n\n\n\nKPX ordfeminine bracketleft -36\n\nKPX guillemotleft bracketleft -36\n\nKPX logicalnot bracketleft -36\n\nKPX sfthyphen bracketleft -36\n\n\n\nKPX acute bracketleft -63\n\nKPX mu bracketleft -63\n\nKPX paragraph bracketleft -63\n\nKPX periodcentered bracketleft -63\n\nKPX cedilla bracketleft -63\n\nKPX questiondown m -36\nKPX questiondown braceright -36\n\nKPX Aacute m -36\nKPX Aacute braceright -36\n\nKPX Acircumflex dollar 57\nKPX Acircumflex ampersand -36\nKPX Acircumflex asterisk -36\nKPX Acircumflex two -36\nKPX Acircumflex four -36\nKPX Acircumflex seven -159\nKPX Acircumflex nine -131\nKPX Acircumflex colon -112\nKPX Acircumflex less -159\nKPX Acircumflex F -36\nKPX Acircumflex G -36\nKPX Acircumflex H -36\nKPX Acircumflex I -73\nKPX Acircumflex R -36\nKPX Acircumflex T -36\nKPX Acircumflex W -36\nKPX Acircumflex Y -120\nKPX Acircumflex Z -83\nKPX Acircumflex backslash -139\nKPX Acircumflex m -73\nKPX Acircumflex copyright -36\nKPX Acircumflex ordfeminine -36\nKPX Acircumflex guillemotleft -36\nKPX Acircumflex logicalnot -36\nKPX Acircumflex sfthyphen -36\nKPX Acircumflex acute -36\nKPX Acircumflex mu -36\nKPX Acircumflex paragraph -36\nKPX Acircumflex periodcentered -36\nKPX Acircumflex cedilla -36\nKPX Acircumflex questiondown -139\nKPX Acircumflex Aacute -139\nKPX Acircumflex Acircumflex 57\nKPX Acircumflex Adieresis 57\nKPX Acircumflex AE 57\nKPX Acircumflex Egrave -36\nKPX Acircumflex Ecircumflex -36\nKPX Acircumflex Igrave -36\nKPX Acircumflex Iacute -36\nKPX Acircumflex Icircumflex -36\nKPX Acircumflex Ntilde -36\nKPX Acircumflex Oacute -36\nKPX Acircumflex Otilde -36\nKPX Acircumflex multiply -36\nKPX Acircumflex Ugrave -36\nKPX Acircumflex Ucircumflex -36\nKPX Acircumflex Yacute -36\nKPX Acircumflex Thorn -36\nKPX Acircumflex acircumflex -36\nKPX Acircumflex Dcaron -36\nKPX Acircumflex dcaron -36\nKPX Acircumflex Dcroat -36\nKPX Acircumflex dmacron -36\nKPX Acircumflex Emacron -36\nKPX Acircumflex emacron -36\nKPX Acircumflex Hcircumflex -159\nKPX Acircumflex hcircumflex -36\nKPX Acircumflex Hbar -159\nKPX Acircumflex hbar -36\nKPX Acircumflex Kcommaaccent -112\nKPX Acircumflex kcommaaccent -83\nKPX Acircumflex kgreenlandic -159\nKPX Acircumflex Lacute -139\nKPX Acircumflex lacute -159\nKPX Acircumflex uni01F0 -36\nKPX Acircumflex uni01F1 -36\n\nKPX Adieresis dollar 57\nKPX Adieresis ampersand -36\nKPX Adieresis asterisk -36\nKPX Adieresis two -36\nKPX Adieresis four -36\nKPX Adieresis seven -159\nKPX Adieresis nine -131\nKPX Adieresis colon -112\nKPX Adieresis less -159\nKPX Adieresis F -36\nKPX Adieresis G -36\nKPX Adieresis H -36\nKPX Adieresis I -73\nKPX Adieresis R -36\nKPX Adieresis T -36\nKPX Adieresis W -36\nKPX Adieresis Y -120\nKPX Adieresis Z -83\nKPX Adieresis backslash -139\nKPX Adieresis m -73\nKPX Adieresis copyright -36\nKPX Adieresis ordfeminine -36\nKPX Adieresis guillemotleft -36\nKPX Adieresis logicalnot -36\nKPX Adieresis sfthyphen -36\nKPX Adieresis acute -36\nKPX Adieresis mu -36\nKPX Adieresis paragraph -36\nKPX Adieresis periodcentered -36\nKPX Adieresis cedilla -36\nKPX Adieresis questiondown -139\nKPX Adieresis Aacute -139\nKPX Adieresis Acircumflex 57\nKPX Adieresis Adieresis 57\nKPX Adieresis AE 57\nKPX Adieresis Egrave -36\nKPX Adieresis Ecircumflex -36\nKPX Adieresis Igrave -36\nKPX Adieresis Iacute -36\nKPX Adieresis Icircumflex -36\nKPX Adieresis Ntilde -36\nKPX Adieresis Oacute -36\nKPX Adieresis Otilde -36\nKPX Adieresis multiply -36\nKPX Adieresis Ugrave -36\nKPX Adieresis Ucircumflex -36\nKPX Adieresis Yacute -36\nKPX Adieresis Thorn -36\nKPX Adieresis acircumflex -36\nKPX Adieresis Dcaron -36\nKPX Adieresis dcaron -36\nKPX Adieresis Dcroat -36\nKPX Adieresis dmacron -36\nKPX Adieresis Emacron -36\nKPX Adieresis emacron -36\nKPX Adieresis Hcircumflex -159\nKPX Adieresis hcircumflex -36\nKPX Adieresis Hbar -159\nKPX Adieresis hbar -36\nKPX Adieresis Kcommaaccent -112\nKPX Adieresis kcommaaccent -83\nKPX Adieresis kgreenlandic -159\nKPX Adieresis Lacute -139\nKPX Adieresis lacute -159\nKPX Adieresis uni01F0 -36\nKPX Adieresis uni01F1 -36\n\nKPX AE dollar 57\nKPX AE ampersand -36\nKPX AE asterisk -36\nKPX AE two -36\nKPX AE four -36\nKPX AE seven -159\nKPX AE nine -131\nKPX AE colon -112\nKPX AE less -159\nKPX AE F -36\nKPX AE G -36\nKPX AE H -36\nKPX AE I -73\nKPX AE R -36\nKPX AE T -36\nKPX AE W -36\nKPX AE Y -120\nKPX AE Z -83\nKPX AE m -73\nKPX AE copyright -36\nKPX AE ordfeminine -36\nKPX AE guillemotleft -36\nKPX AE logicalnot -36\nKPX AE sfthyphen -36\nKPX AE acute -36\nKPX AE mu -36\nKPX AE paragraph -36\nKPX AE periodcentered -36\nKPX AE cedilla -36\nKPX AE Acircumflex 57\nKPX AE Adieresis 57\nKPX AE AE 57\nKPX AE Egrave -36\nKPX AE Ecircumflex -36\nKPX AE Igrave -36\nKPX AE Iacute -36\nKPX AE Icircumflex -36\nKPX AE Ntilde -36\nKPX AE Oacute -36\nKPX AE Otilde -36\nKPX AE multiply -36\nKPX AE Ugrave -36\nKPX AE Ucircumflex -36\nKPX AE Yacute -36\nKPX AE Thorn -36\nKPX AE acircumflex -36\nKPX AE Dcaron -36\nKPX AE dcaron -36\nKPX AE Dcroat -36\nKPX AE dmacron -36\nKPX AE emacron -36\nKPX AE Hcircumflex -159\nKPX AE hcircumflex -36\nKPX AE Hbar -159\nKPX AE hbar -36\nKPX AE Kcommaaccent -112\nKPX AE kcommaaccent -83\nKPX AE kgreenlandic -159\nKPX AE lacute -159\nKPX AE uni01F0 -36\nKPX AE uni01F1 -36\n\nKPX Egrave less -36\nKPX Egrave m -36\nKPX Egrave braceright -36\nKPX Egrave lacute -36\n\nKPX Icircumflex less -36\nKPX Icircumflex m -36\nKPX Icircumflex braceright -36\nKPX Icircumflex lacute -36\n\nKPX Eth dollar -36\nKPX Eth nine -36\nKPX Eth less -112\nKPX Eth m -36\nKPX Eth braceright -36\nKPX Eth Acircumflex -36\nKPX Eth Adieresis -36\nKPX Eth AE -36\nKPX Eth kgreenlandic -112\nKPX Eth lacute -112\nKPX Eth uni01F4 -112\n\nKPX Ograve dollar -36\nKPX Ograve nine -36\nKPX Ograve less -112\nKPX Ograve m -36\nKPX Ograve braceright -36\nKPX Ograve lacute -112\n\nKPX Yacute bracketleft -36\n\nKPX agrave seven -73\nKPX agrave less -102\nKPX agrave m -36\nKPX agrave braceright -36\nKPX agrave Hbar -73\nKPX agrave lacute -102\n\nKPX ucircumflex dollar 47\nKPX ucircumflex two -73\nKPX ucircumflex seven -282\nKPX ucircumflex eight -102\nKPX ucircumflex nine -225\nKPX ucircumflex colon -188\nKPX ucircumflex less -272\nKPX ucircumflex H -36\nKPX ucircumflex R -36\nKPX ucircumflex X -36\nKPX ucircumflex backslash -188\nKPX ucircumflex ordfeminine -36\nKPX ucircumflex guillemotleft -36\nKPX ucircumflex logicalnot -36\nKPX ucircumflex sfthyphen -36\nKPX ucircumflex acute -36\nKPX ucircumflex mu -36\nKPX ucircumflex paragraph -36\nKPX ucircumflex periodcentered -36\nKPX ucircumflex cedilla -36\nKPX ucircumflex guillemotright -36\nKPX ucircumflex onequarter -36\nKPX ucircumflex onehalf -36\nKPX ucircumflex threequarters -36\nKPX ucircumflex questiondown -188\nKPX ucircumflex Aacute -188\nKPX ucircumflex Yacute -36\nKPX ucircumflex Hbar -282\nKPX ucircumflex Idot -102\nKPX ucircumflex dotlessi -36\nKPX ucircumflex lacute -272\n\nKPX ydieresis dollar 47\nKPX ydieresis two -73\nKPX ydieresis seven -282\nKPX ydieresis eight -102\nKPX ydieresis nine -225\nKPX ydieresis colon -188\nKPX ydieresis less -272\nKPX ydieresis H -36\nKPX ydieresis R -36\nKPX ydieresis X -36\nKPX ydieresis backslash -188\nKPX ydieresis ordfeminine -36\nKPX ydieresis guillemotleft -36\nKPX ydieresis logicalnot -36\nKPX ydieresis sfthyphen -36\nKPX ydieresis acute -36\nKPX ydieresis mu -36\nKPX ydieresis paragraph -36\nKPX ydieresis periodcentered -36\nKPX ydieresis cedilla -36\nKPX ydieresis guillemotright -36\nKPX ydieresis onequarter -36\nKPX ydieresis onehalf -36\nKPX ydieresis threequarters -36\nKPX ydieresis questiondown -188\nKPX ydieresis Aacute -188\nKPX ydieresis Yacute -36\nKPX ydieresis Hbar -282\nKPX ydieresis Idot -102\nKPX ydieresis dotlessi -36\nKPX ydieresis lacute -272\n\nKPX Abreve O -193\n\n\nKPX Edotaccent dollar -83\nKPX Edotaccent ampersand -102\nKPX Edotaccent seven -149\nKPX Edotaccent nine -112\nKPX Edotaccent colon -83\nKPX Edotaccent less -131\nKPX Edotaccent D -45\nKPX Edotaccent H -92\nKPX Edotaccent R -92\nKPX Edotaccent X -92\nKPX Edotaccent backslash -112\nKPX Edotaccent m -112\nKPX Edotaccent braceright -36\nKPX Edotaccent cent -45\nKPX Edotaccent sterling -45\nKPX Edotaccent currency -45\nKPX Edotaccent yen -45\nKPX Edotaccent brokenbar -45\nKPX Edotaccent section -45\nKPX Edotaccent ordfeminine -92\nKPX Edotaccent guillemotleft -92\nKPX Edotaccent logicalnot -92\nKPX Edotaccent sfthyphen -92\nKPX Edotaccent acute -92\nKPX Edotaccent mu -92\nKPX Edotaccent paragraph -92\nKPX Edotaccent periodcentered -92\nKPX Edotaccent cedilla -92\nKPX Edotaccent guillemotright -92\nKPX Edotaccent onequarter -92\nKPX Edotaccent onehalf -92\nKPX Edotaccent threequarters -92\nKPX Edotaccent questiondown -112\nKPX Edotaccent Aacute -112\nKPX Edotaccent Egrave -102\nKPX Edotaccent Icircumflex -102\nKPX Edotaccent Yacute -92\nKPX Edotaccent Hbar -149\nKPX Edotaccent dotlessi -92\nKPX Edotaccent lacute -131\n\nKPX edotaccent F -45\nKPX edotaccent G -36\nKPX edotaccent H -45\nKPX edotaccent J -36\nKPX edotaccent K -36\nKPX edotaccent P -36\nKPX edotaccent Q -36\nKPX edotaccent R -45\nKPX edotaccent T -36\nKPX edotaccent U -36\nKPX edotaccent bracketleft -55\nKPX edotaccent m -73\nKPX edotaccent copyright -45\nKPX edotaccent ordfeminine -45\nKPX edotaccent guillemotleft -45\nKPX edotaccent logicalnot -45\nKPX edotaccent sfthyphen -45\nKPX edotaccent threesuperior -36\nKPX edotaccent acute -45\nKPX edotaccent mu -45\nKPX edotaccent paragraph -45\nKPX edotaccent periodcentered -45\nKPX edotaccent cedilla -45\nKPX edotaccent Eacute -45\nKPX edotaccent Idieresis -45\nKPX edotaccent Ntilde 72\nKPX edotaccent Yacute -45\nKPX edotaccent aacute -36\nKPX edotaccent Cdotaccent -36\nKPX edotaccent edotaccent -36\nKPX edotaccent ecaron -36\n\nKPX Ecaron dollar -83\nKPX Ecaron ampersand -102\nKPX Ecaron seven -149\nKPX Ecaron nine -112\nKPX Ecaron colon -83\nKPX Ecaron less -131\nKPX Ecaron D -45\nKPX Ecaron H -92\nKPX Ecaron R -92\nKPX Ecaron X -92\nKPX Ecaron backslash -112\nKPX Ecaron m -112\nKPX Ecaron braceright -36\nKPX Ecaron cent -45\nKPX Ecaron sterling -45\nKPX Ecaron currency -45\nKPX Ecaron yen -45\nKPX Ecaron brokenbar -45\nKPX Ecaron section -45\nKPX Ecaron ordfeminine -92\nKPX Ecaron guillemotleft -92\nKPX Ecaron logicalnot -92\nKPX Ecaron sfthyphen -92\nKPX Ecaron acute -92\nKPX Ecaron mu -92\nKPX Ecaron paragraph -92\nKPX Ecaron periodcentered -92\nKPX Ecaron cedilla -92\nKPX Ecaron guillemotright -92\nKPX Ecaron onequarter -92\nKPX Ecaron onehalf -92\nKPX Ecaron threequarters -92\nKPX Ecaron questiondown -112\nKPX Ecaron Aacute -112\nKPX Ecaron Egrave -102\nKPX Ecaron Icircumflex -102\nKPX Ecaron Yacute -92\nKPX Ecaron Hbar -149\nKPX Ecaron dotlessi -92\nKPX Ecaron lacute -131\n\nKPX ecaron F -45\nKPX ecaron G -36\nKPX ecaron H -45\nKPX ecaron J -36\nKPX ecaron K -36\nKPX ecaron P -36\nKPX ecaron Q -36\nKPX ecaron R -45\nKPX ecaron T -36\nKPX ecaron U -36\nKPX ecaron bracketleft -55\nKPX ecaron m -73\nKPX ecaron copyright -45\nKPX ecaron ordfeminine -45\nKPX ecaron guillemotleft -45\nKPX ecaron logicalnot -45\nKPX ecaron sfthyphen -45\nKPX ecaron threesuperior -36\nKPX ecaron acute -45\nKPX ecaron mu -45\nKPX ecaron paragraph -45\nKPX ecaron periodcentered -45\nKPX ecaron cedilla -45\nKPX ecaron Eacute -45\nKPX ecaron Idieresis -45\nKPX ecaron Ntilde -36\nKPX ecaron Yacute -45\nKPX ecaron aacute -36\nKPX ecaron Cdotaccent -36\nKPX ecaron edotaccent -36\nKPX ecaron ecaron -36\n\nKPX Gdotaccent dollar 38\n\nKPX Gcommaaccent dollar 38\n\nKPX Hbar dollar -159\nKPX Hbar ampersand -120\nKPX Hbar seven -36\nKPX Hbar D -339\nKPX Hbar F -348\nKPX Hbar H -348\nKPX Hbar L -63\nKPX Hbar R -348\nKPX Hbar U -301\nKPX Hbar V -339\nKPX Hbar X -311\nKPX Hbar Z -339\nKPX Hbar backslash -319\nKPX Hbar m -188\nKPX Hbar braceright -112\nKPX Hbar cent -339\nKPX Hbar sterling -339\nKPX Hbar currency -339\nKPX Hbar yen -339\nKPX Hbar brokenbar -339\nKPX Hbar section -339\nKPX Hbar copyright -348\nKPX Hbar ordfeminine -348\nKPX Hbar guillemotleft -348\nKPX Hbar logicalnot -348\nKPX Hbar sfthyphen -348\nKPX Hbar acute -348\nKPX Hbar mu -348\nKPX Hbar paragraph -348\nKPX Hbar periodcentered -348\nKPX Hbar cedilla -348\nKPX Hbar guillemotright -311\nKPX Hbar onequarter -311\nKPX Hbar onehalf -311\nKPX Hbar threequarters -311\nKPX Hbar questiondown -319\nKPX Hbar Aacute -319\nKPX Hbar Egrave -120\nKPX Hbar Eacute -348\nKPX Hbar Icircumflex -120\nKPX Hbar Idieresis -348\nKPX Hbar Yacute -348\nKPX Hbar edotaccent -301\nKPX Hbar ecaron -301\nKPX Hbar gdotaccent -339\nKPX Hbar gcommaaccent -339\nKPX Hbar Hbar -36\nKPX Hbar dotlessi -311\n\nKPX Idot equal -36\nKPX Idot Ldot -36\n\nKPX lacute dollar -159\nKPX lacute ampersand -112\nKPX lacute two -112\nKPX lacute D -282\nKPX lacute H -272\nKPX lacute L -73\nKPX lacute R -272\nKPX lacute X -235\nKPX lacute m -225\nKPX lacute braceright -149\nKPX lacute cent -282\nKPX lacute sterling -282\nKPX lacute currency -282\nKPX lacute yen -282\nKPX lacute brokenbar -282\nKPX lacute section -282\nKPX lacute ordfeminine -272\nKPX lacute guillemotleft -272\nKPX lacute logicalnot -272\nKPX lacute sfthyphen -272\nKPX lacute acute -272\nKPX lacute mu -272\nKPX lacute paragraph -272\nKPX lacute periodcentered -272\nKPX lacute cedilla -272\nKPX lacute guillemotright -235\nKPX lacute onequarter -235\nKPX lacute onehalf -235\nKPX lacute threequarters -235\nKPX lacute Egrave -112\nKPX lacute Icircumflex -112\nKPX lacute Yacute -272\nKPX lacute dotlessi -235\n\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dejavu_sans_normal_ed376817aaa57868462795ac20ea25fb.ufm.php",
    "content": "<?php return array (\n  'codeToName' => \n  array (\n    32 => 'space',\n    33 => 'exclam',\n    34 => 'quotedbl',\n    35 => 'numbersign',\n    36 => 'dollar',\n    37 => 'percent',\n    38 => 'ampersand',\n    39 => 'quotesingle',\n    40 => 'parenleft',\n    41 => 'parenright',\n    42 => 'asterisk',\n    43 => 'plus',\n    44 => 'comma',\n    45 => 'hyphen',\n    46 => 'period',\n    47 => 'slash',\n    48 => 'zero',\n    49 => 'one',\n    50 => 'two',\n    51 => 'three',\n    52 => 'four',\n    53 => 'five',\n    54 => 'six',\n    55 => 'seven',\n    56 => 'eight',\n    57 => 'nine',\n    58 => 'colon',\n    59 => 'semicolon',\n    60 => 'less',\n    61 => 'equal',\n    62 => 'greater',\n    63 => 'question',\n    64 => 'at',\n    65 => 'A',\n    66 => 'B',\n    67 => 'C',\n    68 => 'D',\n    69 => 'E',\n    70 => 'F',\n    71 => 'G',\n    72 => 'H',\n    73 => 'I',\n    74 => 'J',\n    75 => 'K',\n    76 => 'L',\n    77 => 'M',\n    78 => 'N',\n    79 => 'O',\n    80 => 'P',\n    81 => 'Q',\n    82 => 'R',\n    83 => 'S',\n    84 => 'T',\n    85 => 'U',\n    86 => 'V',\n    87 => 'W',\n    88 => 'X',\n    89 => 'Y',\n    90 => 'Z',\n    91 => 'bracketleft',\n    92 => 'backslash',\n    93 => 'bracketright',\n    94 => 'asciicircum',\n    95 => 'underscore',\n    96 => 'grave',\n    97 => 'a',\n    98 => 'b',\n    99 => 'c',\n    100 => 'd',\n    101 => 'e',\n    102 => 'f',\n    103 => 'g',\n    104 => 'h',\n    105 => 'i',\n    106 => 'j',\n    107 => 'k',\n    108 => 'l',\n    109 => 'm',\n    110 => 'n',\n    111 => 'o',\n    112 => 'p',\n    113 => 'q',\n    114 => 'r',\n    115 => 's',\n    116 => 't',\n    117 => 'u',\n    118 => 'v',\n    119 => 'w',\n    120 => 'x',\n    121 => 'y',\n    122 => 'z',\n    123 => 'braceleft',\n    124 => 'bar',\n    125 => 'braceright',\n    126 => 'asciitilde',\n    160 => 'nbspace',\n    161 => 'exclamdown',\n    162 => 'cent',\n    163 => 'sterling',\n    164 => 'currency',\n    165 => 'yen',\n    166 => 'brokenbar',\n    167 => 'section',\n    168 => 'dieresis',\n    169 => 'copyright',\n    170 => 'ordfeminine',\n    171 => 'guillemotleft',\n    172 => 'logicalnot',\n    173 => 'sfthyphen',\n    174 => 'registered',\n    175 => 'macron',\n    176 => 'degree',\n    177 => 'plusminus',\n    178 => 'twosuperior',\n    179 => 'threesuperior',\n    180 => 'acute',\n    181 => 'mu',\n    182 => 'paragraph',\n    183 => 'periodcentered',\n    184 => 'cedilla',\n    185 => 'onesuperior',\n    186 => 'ordmasculine',\n    187 => 'guillemotright',\n    188 => 'onequarter',\n    189 => 'onehalf',\n    190 => 'threequarters',\n    191 => 'questiondown',\n    192 => 'Agrave',\n    193 => 'Aacute',\n    194 => 'Acircumflex',\n    195 => 'Atilde',\n    196 => 'Adieresis',\n    197 => 'Aring',\n    198 => 'AE',\n    199 => 'Ccedilla',\n    200 => 'Egrave',\n    201 => 'Eacute',\n    202 => 'Ecircumflex',\n    203 => 'Edieresis',\n    204 => 'Igrave',\n    205 => 'Iacute',\n    206 => 'Icircumflex',\n    207 => 'Idieresis',\n    208 => 'Eth',\n    209 => 'Ntilde',\n    210 => 'Ograve',\n    211 => 'Oacute',\n    212 => 'Ocircumflex',\n    213 => 'Otilde',\n    214 => 'Odieresis',\n    215 => 'multiply',\n    216 => 'Oslash',\n    217 => 'Ugrave',\n    218 => 'Uacute',\n    219 => 'Ucircumflex',\n    220 => 'Udieresis',\n    221 => 'Yacute',\n    222 => 'Thorn',\n    223 => 'germandbls',\n    224 => 'agrave',\n    225 => 'aacute',\n    226 => 'acircumflex',\n    227 => 'atilde',\n    228 => 'adieresis',\n    229 => 'aring',\n    230 => 'ae',\n    231 => 'ccedilla',\n    232 => 'egrave',\n    233 => 'eacute',\n    234 => 'ecircumflex',\n    235 => 'edieresis',\n    236 => 'igrave',\n    237 => 'iacute',\n    238 => 'icircumflex',\n    239 => 'idieresis',\n    240 => 'eth',\n    241 => 'ntilde',\n    242 => 'ograve',\n    243 => 'oacute',\n    244 => 'ocircumflex',\n    245 => 'otilde',\n    246 => 'odieresis',\n    247 => 'divide',\n    248 => 'oslash',\n    249 => 'ugrave',\n    250 => 'uacute',\n    251 => 'ucircumflex',\n    252 => 'udieresis',\n    253 => 'yacute',\n    254 => 'thorn',\n    255 => 'ydieresis',\n    256 => 'Amacron',\n    257 => 'amacron',\n    258 => 'Abreve',\n    259 => 'abreve',\n    260 => 'Aogonek',\n    261 => 'aogonek',\n    262 => 'Cacute',\n    263 => 'cacute',\n    264 => 'Ccircumflex',\n    265 => 'ccircumflex',\n    266 => 'Cdotaccent',\n    267 => 'cdotaccent',\n    268 => 'Ccaron',\n    269 => 'ccaron',\n    270 => 'Dcaron',\n    271 => 'dcaron',\n    272 => 'Dcroat',\n    273 => 'dmacron',\n    274 => 'Emacron',\n    275 => 'emacron',\n    276 => 'Ebreve',\n    277 => 'ebreve',\n    278 => 'Edotaccent',\n    279 => 'edotaccent',\n    280 => 'Eogonek',\n    281 => 'eogonek',\n    282 => 'Ecaron',\n    283 => 'ecaron',\n    284 => 'Gcircumflex',\n    285 => 'gcircumflex',\n    286 => 'Gbreve',\n    287 => 'gbreve',\n    288 => 'Gdotaccent',\n    289 => 'gdotaccent',\n    290 => 'Gcommaaccent',\n    291 => 'gcommaaccent',\n    292 => 'Hcircumflex',\n    293 => 'hcircumflex',\n    294 => 'Hbar',\n    295 => 'hbar',\n    296 => 'Itilde',\n    297 => 'itilde',\n    298 => 'Imacron',\n    299 => 'imacron',\n    300 => 'Ibreve',\n    301 => 'ibreve',\n    302 => 'Iogonek',\n    303 => 'iogonek',\n    304 => 'Idot',\n    305 => 'dotlessi',\n    306 => 'IJ',\n    307 => 'ij',\n    308 => 'Jcircumflex',\n    309 => 'jcircumflex',\n    310 => 'Kcommaaccent',\n    311 => 'kcommaaccent',\n    312 => 'kgreenlandic',\n    313 => 'Lacute',\n    314 => 'lacute',\n    315 => 'Lcommaaccent',\n    316 => 'lcommaaccent',\n    317 => 'Lcaron',\n    318 => 'lcaron',\n    319 => 'Ldot',\n    320 => 'ldot',\n    321 => 'Lslash',\n    322 => 'lslash',\n    323 => 'Nacute',\n    324 => 'nacute',\n    325 => 'Ncommaaccent',\n    326 => 'ncommaaccent',\n    327 => 'Ncaron',\n    328 => 'ncaron',\n    329 => 'napostrophe',\n    330 => 'Eng',\n    331 => 'eng',\n    332 => 'Omacron',\n    333 => 'omacron',\n    334 => 'Obreve',\n    335 => 'obreve',\n    336 => 'Ohungarumlaut',\n    337 => 'ohungarumlaut',\n    338 => 'OE',\n    339 => 'oe',\n    340 => 'Racute',\n    341 => 'racute',\n    342 => 'Rcommaaccent',\n    343 => 'rcommaaccent',\n    344 => 'Rcaron',\n    345 => 'rcaron',\n    346 => 'Sacute',\n    347 => 'sacute',\n    348 => 'Scircumflex',\n    349 => 'scircumflex',\n    350 => 'Scedilla',\n    351 => 'scedilla',\n    352 => 'Scaron',\n    353 => 'scaron',\n    354 => 'Tcommaaccent',\n    355 => 'tcommaaccent',\n    356 => 'Tcaron',\n    357 => 'tcaron',\n    358 => 'Tbar',\n    359 => 'tbar',\n    360 => 'Utilde',\n    361 => 'utilde',\n    362 => 'Umacron',\n    363 => 'umacron',\n    364 => 'Ubreve',\n    365 => 'ubreve',\n    366 => 'Uring',\n    367 => 'uring',\n    368 => 'Uhungarumlaut',\n    369 => 'uhungarumlaut',\n    370 => 'Uogonek',\n    371 => 'uogonek',\n    372 => 'Wcircumflex',\n    373 => 'wcircumflex',\n    374 => 'Ycircumflex',\n    375 => 'ycircumflex',\n    376 => 'Ydieresis',\n    377 => 'Zacute',\n    378 => 'zacute',\n    379 => 'Zdotaccent',\n    380 => 'zdotaccent',\n    381 => 'Zcaron',\n    382 => 'zcaron',\n    383 => 'longs',\n    384 => 'uni0180',\n    385 => 'uni0181',\n    386 => 'uni0182',\n    387 => 'uni0183',\n    388 => 'uni0184',\n    389 => 'uni0185',\n    390 => 'uni0186',\n    391 => 'uni0187',\n    392 => 'uni0188',\n    393 => 'uni0189',\n    394 => 'uni018A',\n    395 => 'uni018B',\n    396 => 'uni018C',\n    397 => 'uni018D',\n    398 => 'uni018E',\n    399 => 'uni018F',\n    400 => 'uni0190',\n    401 => 'uni0191',\n    402 => 'florin',\n    403 => 'uni0193',\n    404 => 'uni0194',\n    405 => 'uni0195',\n    406 => 'uni0196',\n    407 => 'uni0197',\n    408 => 'uni0198',\n    409 => 'uni0199',\n    410 => 'uni019A',\n    411 => 'uni019B',\n    412 => 'uni019C',\n    413 => 'uni019D',\n    414 => 'uni019E',\n    415 => 'uni019F',\n    416 => 'Ohorn',\n    417 => 'ohorn',\n    418 => 'uni01A2',\n    419 => 'uni01A3',\n    420 => 'uni01A4',\n    421 => 'uni01A5',\n    422 => 'uni01A6',\n    423 => 'uni01A7',\n    424 => 'uni01A8',\n    425 => 'uni01A9',\n    426 => 'uni01AA',\n    427 => 'uni01AB',\n    428 => 'uni01AC',\n    429 => 'uni01AD',\n    430 => 'uni01AE',\n    431 => 'Uhorn',\n    432 => 'uhorn',\n    433 => 'uni01B1',\n    434 => 'uni01B2',\n    435 => 'uni01B3',\n    436 => 'uni01B4',\n    437 => 'uni01B5',\n    438 => 'uni01B6',\n    439 => 'uni01B7',\n    440 => 'uni01B8',\n    441 => 'uni01B9',\n    442 => 'uni01BA',\n    443 => 'uni01BB',\n    444 => 'uni01BC',\n    445 => 'uni01BD',\n    446 => 'uni01BE',\n    447 => 'uni01BF',\n    448 => 'uni01C0',\n    449 => 'uni01C1',\n    450 => 'uni01C2',\n    451 => 'uni01C3',\n    452 => 'uni01C4',\n    453 => 'uni01C5',\n    454 => 'uni01C6',\n    455 => 'uni01C7',\n    456 => 'uni01C8',\n    457 => 'uni01C9',\n    458 => 'uni01CA',\n    459 => 'uni01CB',\n    460 => 'uni01CC',\n    461 => 'uni01CD',\n    462 => 'uni01CE',\n    463 => 'uni01CF',\n    464 => 'uni01D0',\n    465 => 'uni01D1',\n    466 => 'uni01D2',\n    467 => 'uni01D3',\n    468 => 'uni01D4',\n    469 => 'uni01D5',\n    470 => 'uni01D6',\n    471 => 'uni01D7',\n    472 => 'uni01D8',\n    473 => 'uni01D9',\n    474 => 'uni01DA',\n    475 => 'uni01DB',\n    476 => 'uni01DC',\n    477 => 'uni01DD',\n    478 => 'uni01DE',\n    479 => 'uni01DF',\n    480 => 'uni01E0',\n    481 => 'uni01E1',\n    482 => 'uni01E2',\n    483 => 'uni01E3',\n    484 => 'uni01E4',\n    485 => 'uni01E5',\n    486 => 'Gcaron',\n    487 => 'gcaron',\n    488 => 'uni01E8',\n    489 => 'uni01E9',\n    490 => 'uni01EA',\n    491 => 'uni01EB',\n    492 => 'uni01EC',\n    493 => 'uni01ED',\n    494 => 'uni01EE',\n    495 => 'uni01EF',\n    496 => 'uni01F0',\n    497 => 'uni01F1',\n    498 => 'uni01F2',\n    499 => 'uni01F3',\n    500 => 'uni01F4',\n    501 => 'uni01F5',\n    502 => 'uni01F6',\n    503 => 'uni01F7',\n    504 => 'uni01F8',\n    505 => 'uni01F9',\n    506 => 'Aringacute',\n    507 => 'aringacute',\n    508 => 'AEacute',\n    509 => 'aeacute',\n    510 => 'Oslashacute',\n    511 => 'oslashacute',\n    512 => 'uni0200',\n    513 => 'uni0201',\n    514 => 'uni0202',\n    515 => 'uni0203',\n    516 => 'uni0204',\n    517 => 'uni0205',\n    518 => 'uni0206',\n    519 => 'uni0207',\n    520 => 'uni0208',\n    521 => 'uni0209',\n    522 => 'uni020A',\n    523 => 'uni020B',\n    524 => 'uni020C',\n    525 => 'uni020D',\n    526 => 'uni020E',\n    527 => 'uni020F',\n    528 => 'uni0210',\n    529 => 'uni0211',\n    530 => 'uni0212',\n    531 => 'uni0213',\n    532 => 'uni0214',\n    533 => 'uni0215',\n    534 => 'uni0216',\n    535 => 'uni0217',\n    536 => 'Scommaaccent',\n    537 => 'scommaaccent',\n    538 => 'uni021A',\n    539 => 'uni021B',\n    540 => 'uni021C',\n    541 => 'uni021D',\n    542 => 'uni021E',\n    543 => 'uni021F',\n    544 => 'uni0220',\n    545 => 'uni0221',\n    546 => 'uni0222',\n    547 => 'uni0223',\n    548 => 'uni0224',\n    549 => 'uni0225',\n    550 => 'uni0226',\n    551 => 'uni0227',\n    552 => 'uni0228',\n    553 => 'uni0229',\n    554 => 'uni022A',\n    555 => 'uni022B',\n    556 => 'uni022C',\n    557 => 'uni022D',\n    558 => 'uni022E',\n    559 => 'uni022F',\n    560 => 'uni0230',\n    561 => 'uni0231',\n    562 => 'uni0232',\n    563 => 'uni0233',\n    564 => 'uni0234',\n    565 => 'uni0235',\n    566 => 'uni0236',\n    567 => 'dotlessj',\n    568 => 'uni0238',\n    569 => 'uni0239',\n    570 => 'uni023A',\n    571 => 'uni023B',\n    572 => 'uni023C',\n    573 => 'uni023D',\n    574 => 'uni023E',\n    575 => 'uni023F',\n    576 => 'uni0240',\n    577 => 'uni0241',\n    578 => 'uni0242',\n    579 => 'uni0243',\n    580 => 'uni0244',\n    581 => 'uni0245',\n    582 => 'uni0246',\n    583 => 'uni0247',\n    584 => 'uni0248',\n    585 => 'uni0249',\n    586 => 'uni024A',\n    587 => 'uni024B',\n    588 => 'uni024C',\n    589 => 'uni024D',\n    590 => 'uni024E',\n    591 => 'uni024F',\n    592 => 'uni0250',\n    593 => 'uni0251',\n    594 => 'uni0252',\n    595 => 'uni0253',\n    596 => 'uni0254',\n    597 => 'uni0255',\n    598 => 'uni0256',\n    599 => 'uni0257',\n    600 => 'uni0258',\n    601 => 'uni0259',\n    602 => 'uni025A',\n    603 => 'uni025B',\n    604 => 'uni025C',\n    605 => 'uni025D',\n    606 => 'uni025E',\n    607 => 'uni025F',\n    608 => 'uni0260',\n    609 => 'uni0261',\n    610 => 'uni0262',\n    611 => 'uni0263',\n    612 => 'uni0264',\n    613 => 'uni0265',\n    614 => 'uni0266',\n    615 => 'uni0267',\n    616 => 'uni0268',\n    617 => 'uni0269',\n    618 => 'uni026A',\n    619 => 'uni026B',\n    620 => 'uni026C',\n    621 => 'uni026D',\n    622 => 'uni026E',\n    623 => 'uni026F',\n    624 => 'uni0270',\n    625 => 'uni0271',\n    626 => 'uni0272',\n    627 => 'uni0273',\n    628 => 'uni0274',\n    629 => 'uni0275',\n    630 => 'uni0276',\n    631 => 'uni0277',\n    632 => 'uni0278',\n    633 => 'uni0279',\n    634 => 'uni027A',\n    635 => 'uni027B',\n    636 => 'uni027C',\n    637 => 'uni027D',\n    638 => 'uni027E',\n    639 => 'uni027F',\n    640 => 'uni0280',\n    641 => 'uni0281',\n    642 => 'uni0282',\n    643 => 'uni0283',\n    644 => 'uni0284',\n    645 => 'uni0285',\n    646 => 'uni0286',\n    647 => 'uni0287',\n    648 => 'uni0288',\n    649 => 'uni0289',\n    650 => 'uni028A',\n    651 => 'uni028B',\n    652 => 'uni028C',\n    653 => 'uni028D',\n    654 => 'uni028E',\n    655 => 'uni028F',\n    656 => 'uni0290',\n    657 => 'uni0291',\n    658 => 'uni0292',\n    659 => 'uni0293',\n    660 => 'uni0294',\n    661 => 'uni0295',\n    662 => 'uni0296',\n    663 => 'uni0297',\n    664 => 'uni0298',\n    665 => 'uni0299',\n    666 => 'uni029A',\n    667 => 'uni029B',\n    668 => 'uni029C',\n    669 => 'uni029D',\n    670 => 'uni029E',\n    671 => 'uni029F',\n    672 => 'uni02A0',\n    673 => 'uni02A1',\n    674 => 'uni02A2',\n    675 => 'uni02A3',\n    676 => 'uni02A4',\n    677 => 'uni02A5',\n    678 => 'uni02A6',\n    679 => 'uni02A7',\n    680 => 'uni02A8',\n    681 => 'uni02A9',\n    682 => 'uni02AA',\n    683 => 'uni02AB',\n    684 => 'uni02AC',\n    685 => 'uni02AD',\n    686 => 'uni02AE',\n    687 => 'uni02AF',\n    688 => 'uni02B0',\n    689 => 'uni02B1',\n    690 => 'uni02B2',\n    691 => 'uni02B3',\n    692 => 'uni02B4',\n    693 => 'uni02B5',\n    694 => 'uni02B6',\n    695 => 'uni02B7',\n    696 => 'uni02B8',\n    697 => 'uni02B9',\n    698 => 'uni02BA',\n    699 => 'uni02BB',\n    700 => 'uni02BC',\n    701 => 'uni02BD',\n    702 => 'uni02BE',\n    703 => 'uni02BF',\n    704 => 'uni02C0',\n    705 => 'uni02C1',\n    706 => 'uni02C2',\n    707 => 'uni02C3',\n    708 => 'uni02C4',\n    709 => 'uni02C5',\n    710 => 'circumflex',\n    711 => 'caron',\n    712 => 'uni02C8',\n    713 => 'uni02C9',\n    714 => 'uni02CA',\n    715 => 'uni02CB',\n    716 => 'uni02CC',\n    717 => 'uni02CD',\n    718 => 'uni02CE',\n    719 => 'uni02CF',\n    720 => 'uni02D0',\n    721 => 'uni02D1',\n    722 => 'uni02D2',\n    723 => 'uni02D3',\n    724 => 'uni02D4',\n    725 => 'uni02D5',\n    726 => 'uni02D6',\n    727 => 'uni02D7',\n    728 => 'breve',\n    729 => 'dotaccent',\n    730 => 'ring',\n    731 => 'ogonek',\n    732 => 'tilde',\n    733 => 'hungarumlaut',\n    734 => 'uni02DE',\n    735 => 'uni02DF',\n    736 => 'uni02E0',\n    737 => 'uni02E1',\n    738 => 'uni02E2',\n    739 => 'uni02E3',\n    740 => 'uni02E4',\n    741 => 'uni02E5',\n    742 => 'uni02E6',\n    743 => 'uni02E7',\n    744 => 'uni02E8',\n    745 => 'uni02E9',\n    748 => 'uni02EC',\n    749 => 'uni02ED',\n    750 => 'uni02EE',\n    755 => 'uni02F3',\n    759 => 'uni02F7',\n    768 => 'gravecomb',\n    769 => 'acutecomb',\n    770 => 'uni0302',\n    771 => 'tildecomb',\n    772 => 'uni0304',\n    773 => 'uni0305',\n    774 => 'uni0306',\n    775 => 'uni0307',\n    776 => 'uni0308',\n    777 => 'hookabovecomb',\n    778 => 'uni030A',\n    779 => 'uni030B',\n    780 => 'uni030C',\n    781 => 'uni030D',\n    782 => 'uni030E',\n    783 => 'uni030F',\n    784 => 'uni0310',\n    785 => 'uni0311',\n    786 => 'uni0312',\n    787 => 'uni0313',\n    788 => 'uni0314',\n    789 => 'uni0315',\n    790 => 'uni0316',\n    791 => 'uni0317',\n    792 => 'uni0318',\n    793 => 'uni0319',\n    794 => 'uni031A',\n    795 => 'uni031B',\n    796 => 'uni031C',\n    797 => 'uni031D',\n    798 => 'uni031E',\n    799 => 'uni031F',\n    800 => 'uni0320',\n    801 => 'uni0321',\n    802 => 'uni0322',\n    803 => 'dotbelowcomb',\n    804 => 'uni0324',\n    805 => 'uni0325',\n    806 => 'uni0326',\n    807 => 'uni0327',\n    808 => 'uni0328',\n    809 => 'uni0329',\n    810 => 'uni032A',\n    811 => 'uni032B',\n    812 => 'uni032C',\n    813 => 'uni032D',\n    814 => 'uni032E',\n    815 => 'uni032F',\n    816 => 'uni0330',\n    817 => 'uni0331',\n    818 => 'uni0332',\n    819 => 'uni0333',\n    820 => 'uni0334',\n    821 => 'uni0335',\n    822 => 'uni0336',\n    823 => 'uni0337',\n    824 => 'uni0338',\n    825 => 'uni0339',\n    826 => 'uni033A',\n    827 => 'uni033B',\n    828 => 'uni033C',\n    829 => 'uni033D',\n    830 => 'uni033E',\n    831 => 'uni033F',\n    832 => 'uni0340',\n    833 => 'uni0341',\n    834 => 'uni0342',\n    835 => 'uni0343',\n    836 => 'uni0344',\n    837 => 'uni0345',\n    838 => 'uni0346',\n    839 => 'uni0347',\n    840 => 'uni0348',\n    841 => 'uni0349',\n    842 => 'uni034A',\n    843 => 'uni034B',\n    844 => 'uni034C',\n    845 => 'uni034D',\n    846 => 'uni034E',\n    847 => 'uni034F',\n    849 => 'uni0351',\n    850 => 'uni0352',\n    851 => 'uni0353',\n    855 => 'uni0357',\n    856 => 'uni0358',\n    858 => 'uni035A',\n    860 => 'uni035C',\n    861 => 'uni035D',\n    862 => 'uni035E',\n    863 => 'uni035F',\n    864 => 'uni0360',\n    865 => 'uni0361',\n    866 => 'uni0362',\n    880 => 'uni0370',\n    881 => 'uni0371',\n    882 => 'uni0372',\n    883 => 'uni0373',\n    884 => 'uni0374',\n    885 => 'uni0375',\n    886 => 'uni0376',\n    887 => 'uni0377',\n    890 => 'uni037A',\n    891 => 'uni037B',\n    892 => 'uni037C',\n    893 => 'uni037D',\n    894 => 'uni037E',\n    895 => 'uni037F',\n    900 => 'tonos',\n    901 => 'dieresistonos',\n    902 => 'Alphatonos',\n    903 => 'anoteleia',\n    904 => 'Epsilontonos',\n    905 => 'Etatonos',\n    906 => 'Iotatonos',\n    908 => 'Omicrontonos',\n    910 => 'Upsilontonos',\n    911 => 'Omegatonos',\n    912 => 'iotadieresistonos',\n    913 => 'Alpha',\n    914 => 'Beta',\n    915 => 'Gamma',\n    916 => 'uni0394',\n    917 => 'Epsilon',\n    918 => 'Zeta',\n    919 => 'Eta',\n    920 => 'Theta',\n    921 => 'Iota',\n    922 => 'Kappa',\n    923 => 'Lambda',\n    924 => 'Mu',\n    925 => 'Nu',\n    926 => 'Xi',\n    927 => 'Omicron',\n    928 => 'Pi',\n    929 => 'Rho',\n    931 => 'Sigma',\n    932 => 'Tau',\n    933 => 'Upsilon',\n    934 => 'Phi',\n    935 => 'Chi',\n    936 => 'Psi',\n    937 => 'Omega',\n    938 => 'Iotadieresis',\n    939 => 'Upsilondieresis',\n    940 => 'alphatonos',\n    941 => 'epsilontonos',\n    942 => 'etatonos',\n    943 => 'iotatonos',\n    944 => 'upsilondieresistonos',\n    945 => 'alpha',\n    946 => 'beta',\n    947 => 'gamma',\n    948 => 'delta',\n    949 => 'epsilon',\n    950 => 'zeta',\n    951 => 'eta',\n    952 => 'theta',\n    953 => 'iota',\n    954 => 'kappa',\n    955 => 'lambda',\n    956 => 'uni03BC',\n    957 => 'nu',\n    958 => 'xi',\n    959 => 'omicron',\n    960 => 'pi',\n    961 => 'rho',\n    962 => 'sigma1',\n    963 => 'sigma',\n    964 => 'tau',\n    965 => 'upsilon',\n    966 => 'phi',\n    967 => 'chi',\n    968 => 'psi',\n    969 => 'omega',\n    970 => 'iotadieresis',\n    971 => 'upsilondieresis',\n    972 => 'omicrontonos',\n    973 => 'upsilontonos',\n    974 => 'omegatonos',\n    975 => 'uni03CF',\n    976 => 'uni03D0',\n    977 => 'theta1',\n    978 => 'Upsilon1',\n    979 => 'uni03D3',\n    980 => 'uni03D4',\n    981 => 'phi1',\n    982 => 'omega1',\n    983 => 'uni03D7',\n    984 => 'uni03D8',\n    985 => 'uni03D9',\n    986 => 'uni03DA',\n    987 => 'uni03DB',\n    988 => 'uni03DC',\n    989 => 'uni03DD',\n    990 => 'uni03DE',\n    991 => 'uni03DF',\n    992 => 'uni03E0',\n    993 => 'uni03E1',\n    994 => 'uni03E2',\n    995 => 'uni03E3',\n    996 => 'uni03E4',\n    997 => 'uni03E5',\n    998 => 'uni03E6',\n    999 => 'uni03E7',\n    1000 => 'uni03E8',\n    1001 => 'uni03E9',\n    1002 => 'uni03EA',\n    1003 => 'uni03EB',\n    1004 => 'uni03EC',\n    1005 => 'uni03ED',\n    1006 => 'uni03EE',\n    1007 => 'uni03EF',\n    1008 => 'uni03F0',\n    1009 => 'uni03F1',\n    1010 => 'uni03F2',\n    1011 => 'uni03F3',\n    1012 => 'uni03F4',\n    1013 => 'uni03F5',\n    1014 => 'uni03F6',\n    1015 => 'uni03F7',\n    1016 => 'uni03F8',\n    1017 => 'uni03F9',\n    1018 => 'uni03FA',\n    1019 => 'uni03FB',\n    1020 => 'uni03FC',\n    1021 => 'uni03FD',\n    1022 => 'uni03FE',\n    1023 => 'uni03FF',\n    1024 => 'uni0400',\n    1025 => 'uni0401',\n    1026 => 'uni0402',\n    1027 => 'uni0403',\n    1028 => 'uni0404',\n    1029 => 'uni0405',\n    1030 => 'uni0406',\n    1031 => 'uni0407',\n    1032 => 'uni0408',\n    1033 => 'uni0409',\n    1034 => 'uni040A',\n    1035 => 'uni040B',\n    1036 => 'uni040C',\n    1037 => 'uni040D',\n    1038 => 'uni040E',\n    1039 => 'uni040F',\n    1040 => 'uni0410',\n    1041 => 'uni0411',\n    1042 => 'uni0412',\n    1043 => 'uni0413',\n    1044 => 'uni0414',\n    1045 => 'uni0415',\n    1046 => 'uni0416',\n    1047 => 'uni0417',\n    1048 => 'uni0418',\n    1049 => 'uni0419',\n    1050 => 'uni041A',\n    1051 => 'uni041B',\n    1052 => 'uni041C',\n    1053 => 'uni041D',\n    1054 => 'uni041E',\n    1055 => 'uni041F',\n    1056 => 'uni0420',\n    1057 => 'uni0421',\n    1058 => 'uni0422',\n    1059 => 'uni0423',\n    1060 => 'uni0424',\n    1061 => 'uni0425',\n    1062 => 'uni0426',\n    1063 => 'uni0427',\n    1064 => 'uni0428',\n    1065 => 'uni0429',\n    1066 => 'uni042A',\n    1067 => 'uni042B',\n    1068 => 'uni042C',\n    1069 => 'uni042D',\n    1070 => 'uni042E',\n    1071 => 'uni042F',\n    1072 => 'uni0430',\n    1073 => 'uni0431',\n    1074 => 'uni0432',\n    1075 => 'uni0433',\n    1076 => 'uni0434',\n    1077 => 'uni0435',\n    1078 => 'uni0436',\n    1079 => 'uni0437',\n    1080 => 'uni0438',\n    1081 => 'uni0439',\n    1082 => 'uni043A',\n    1083 => 'uni043B',\n    1084 => 'uni043C',\n    1085 => 'uni043D',\n    1086 => 'uni043E',\n    1087 => 'uni043F',\n    1088 => 'uni0440',\n    1089 => 'uni0441',\n    1090 => 'uni0442',\n    1091 => 'uni0443',\n    1092 => 'uni0444',\n    1093 => 'uni0445',\n    1094 => 'uni0446',\n    1095 => 'uni0447',\n    1096 => 'uni0448',\n    1097 => 'uni0449',\n    1098 => 'uni044A',\n    1099 => 'uni044B',\n    1100 => 'uni044C',\n    1101 => 'uni044D',\n    1102 => 'uni044E',\n    1103 => 'uni044F',\n    1104 => 'uni0450',\n    1105 => 'uni0451',\n    1106 => 'uni0452',\n    1107 => 'uni0453',\n    1108 => 'uni0454',\n    1109 => 'uni0455',\n    1110 => 'uni0456',\n    1111 => 'uni0457',\n    1112 => 'uni0458',\n    1113 => 'uni0459',\n    1114 => 'uni045A',\n    1115 => 'uni045B',\n    1116 => 'uni045C',\n    1117 => 'uni045D',\n    1118 => 'uni045E',\n    1119 => 'uni045F',\n    1120 => 'uni0460',\n    1121 => 'uni0461',\n    1122 => 'uni0462',\n    1123 => 'uni0463',\n    1124 => 'uni0464',\n    1125 => 'uni0465',\n    1126 => 'uni0466',\n    1127 => 'uni0467',\n    1128 => 'uni0468',\n    1129 => 'uni0469',\n    1130 => 'uni046A',\n    1131 => 'uni046B',\n    1132 => 'uni046C',\n    1133 => 'uni046D',\n    1134 => 'uni046E',\n    1135 => 'uni046F',\n    1136 => 'uni0470',\n    1137 => 'uni0471',\n    1138 => 'uni0472',\n    1139 => 'uni0473',\n    1140 => 'uni0474',\n    1141 => 'uni0475',\n    1142 => 'uni0476',\n    1143 => 'uni0477',\n    1144 => 'uni0478',\n    1145 => 'uni0479',\n    1146 => 'uni047A',\n    1147 => 'uni047B',\n    1148 => 'uni047C',\n    1149 => 'uni047D',\n    1150 => 'uni047E',\n    1151 => 'uni047F',\n    1152 => 'uni0480',\n    1153 => 'uni0481',\n    1154 => 'uni0482',\n    1155 => 'uni0483',\n    1156 => 'uni0484',\n    1157 => 'uni0485',\n    1158 => 'uni0486',\n    1159 => 'uni0487',\n    1160 => 'uni0488',\n    1161 => 'uni0489',\n    1162 => 'uni048A',\n    1163 => 'uni048B',\n    1164 => 'uni048C',\n    1165 => 'uni048D',\n    1166 => 'uni048E',\n    1167 => 'uni048F',\n    1168 => 'uni0490',\n    1169 => 'uni0491',\n    1170 => 'uni0492',\n    1171 => 'uni0493',\n    1172 => 'uni0494',\n    1173 => 'uni0495',\n    1174 => 'uni0496',\n    1175 => 'uni0497',\n    1176 => 'uni0498',\n    1177 => 'uni0499',\n    1178 => 'uni049A',\n    1179 => 'uni049B',\n    1180 => 'uni049C',\n    1181 => 'uni049D',\n    1182 => 'uni049E',\n    1183 => 'uni049F',\n    1184 => 'uni04A0',\n    1185 => 'uni04A1',\n    1186 => 'uni04A2',\n    1187 => 'uni04A3',\n    1188 => 'uni04A4',\n    1189 => 'uni04A5',\n    1190 => 'uni04A6',\n    1191 => 'uni04A7',\n    1192 => 'uni04A8',\n    1193 => 'uni04A9',\n    1194 => 'uni04AA',\n    1195 => 'uni04AB',\n    1196 => 'uni04AC',\n    1197 => 'uni04AD',\n    1198 => 'uni04AE',\n    1199 => 'uni04AF',\n    1200 => 'uni04B0',\n    1201 => 'uni04B1',\n    1202 => 'uni04B2',\n    1203 => 'uni04B3',\n    1204 => 'uni04B4',\n    1205 => 'uni04B5',\n    1206 => 'uni04B6',\n    1207 => 'uni04B7',\n    1208 => 'uni04B8',\n    1209 => 'uni04B9',\n    1210 => 'uni04BA',\n    1211 => 'uni04BB',\n    1212 => 'uni04BC',\n    1213 => 'uni04BD',\n    1214 => 'uni04BE',\n    1215 => 'uni04BF',\n    1216 => 'uni04C0',\n    1217 => 'uni04C1',\n    1218 => 'uni04C2',\n    1219 => 'uni04C3',\n    1220 => 'uni04C4',\n    1221 => 'uni04C5',\n    1222 => 'uni04C6',\n    1223 => 'uni04C7',\n    1224 => 'uni04C8',\n    1225 => 'uni04C9',\n    1226 => 'uni04CA',\n    1227 => 'uni04CB',\n    1228 => 'uni04CC',\n    1229 => 'uni04CD',\n    1230 => 'uni04CE',\n    1231 => 'uni04CF',\n    1232 => 'uni04D0',\n    1233 => 'uni04D1',\n    1234 => 'uni04D2',\n    1235 => 'uni04D3',\n    1236 => 'uni04D4',\n    1237 => 'uni04D5',\n    1238 => 'uni04D6',\n    1239 => 'uni04D7',\n    1240 => 'uni04D8',\n    1241 => 'uni04D9',\n    1242 => 'uni04DA',\n    1243 => 'uni04DB',\n    1244 => 'uni04DC',\n    1245 => 'uni04DD',\n    1246 => 'uni04DE',\n    1247 => 'uni04DF',\n    1248 => 'uni04E0',\n    1249 => 'uni04E1',\n    1250 => 'uni04E2',\n    1251 => 'uni04E3',\n    1252 => 'uni04E4',\n    1253 => 'uni04E5',\n    1254 => 'uni04E6',\n    1255 => 'uni04E7',\n    1256 => 'uni04E8',\n    1257 => 'uni04E9',\n    1258 => 'uni04EA',\n    1259 => 'uni04EB',\n    1260 => 'uni04EC',\n    1261 => 'uni04ED',\n    1262 => 'uni04EE',\n    1263 => 'uni04EF',\n    1264 => 'uni04F0',\n    1265 => 'uni04F1',\n    1266 => 'uni04F2',\n    1267 => 'uni04F3',\n    1268 => 'uni04F4',\n    1269 => 'uni04F5',\n    1270 => 'uni04F6',\n    1271 => 'uni04F7',\n    1272 => 'uni04F8',\n    1273 => 'uni04F9',\n    1274 => 'uni04FA',\n    1275 => 'uni04FB',\n    1276 => 'uni04FC',\n    1277 => 'uni04FD',\n    1278 => 'uni04FE',\n    1279 => 'uni04FF',\n    1280 => 'uni0500',\n    1281 => 'uni0501',\n    1282 => 'uni0502',\n    1283 => 'uni0503',\n    1284 => 'uni0504',\n    1285 => 'uni0505',\n    1286 => 'uni0506',\n    1287 => 'uni0507',\n    1288 => 'uni0508',\n    1289 => 'uni0509',\n    1290 => 'uni050A',\n    1291 => 'uni050B',\n    1292 => 'uni050C',\n    1293 => 'uni050D',\n    1294 => 'uni050E',\n    1295 => 'uni050F',\n    1296 => 'uni0510',\n    1297 => 'uni0511',\n    1298 => 'uni0512',\n    1299 => 'uni0513',\n    1300 => 'uni0514',\n    1301 => 'uni0515',\n    1302 => 'uni0516',\n    1303 => 'uni0517',\n    1304 => 'uni0518',\n    1305 => 'uni0519',\n    1306 => 'uni051A',\n    1307 => 'uni051B',\n    1308 => 'uni051C',\n    1309 => 'uni051D',\n    1310 => 'uni051E',\n    1311 => 'uni051F',\n    1312 => 'uni0520',\n    1313 => 'uni0521',\n    1314 => 'uni0522',\n    1315 => 'uni0523',\n    1316 => 'uni0524',\n    1317 => 'uni0525',\n    1329 => 'uni0531',\n    1330 => 'uni0532',\n    1331 => 'uni0533',\n    1332 => 'uni0534',\n    1333 => 'uni0535',\n    1334 => 'uni0536',\n    1335 => 'uni0537',\n    1336 => 'uni0538',\n    1337 => 'uni0539',\n    1338 => 'uni053A',\n    1339 => 'uni053B',\n    1340 => 'uni053C',\n    1341 => 'uni053D',\n    1342 => 'uni053E',\n    1343 => 'uni053F',\n    1344 => 'uni0540',\n    1345 => 'uni0541',\n    1346 => 'uni0542',\n    1347 => 'uni0543',\n    1348 => 'uni0544',\n    1349 => 'uni0545',\n    1350 => 'uni0546',\n    1351 => 'uni0547',\n    1352 => 'uni0548',\n    1353 => 'uni0549',\n    1354 => 'uni054A',\n    1355 => 'uni054B',\n    1356 => 'uni054C',\n    1357 => 'uni054D',\n    1358 => 'uni054E',\n    1359 => 'uni054F',\n    1360 => 'uni0550',\n    1361 => 'uni0551',\n    1362 => 'uni0552',\n    1363 => 'uni0553',\n    1364 => 'uni0554',\n    1365 => 'uni0555',\n    1366 => 'uni0556',\n    1369 => 'uni0559',\n    1370 => 'uni055A',\n    1371 => 'uni055B',\n    1372 => 'uni055C',\n    1373 => 'uni055D',\n    1374 => 'uni055E',\n    1375 => 'uni055F',\n    1377 => 'uni0561',\n    1378 => 'uni0562',\n    1379 => 'uni0563',\n    1380 => 'uni0564',\n    1381 => 'uni0565',\n    1382 => 'uni0566',\n    1383 => 'uni0567',\n    1384 => 'uni0568',\n    1385 => 'uni0569',\n    1386 => 'uni056A',\n    1387 => 'uni056B',\n    1388 => 'uni056C',\n    1389 => 'uni056D',\n    1390 => 'uni056E',\n    1391 => 'uni056F',\n    1392 => 'uni0570',\n    1393 => 'uni0571',\n    1394 => 'uni0572',\n    1395 => 'uni0573',\n    1396 => 'uni0574',\n    1397 => 'uni0575',\n    1398 => 'uni0576',\n    1399 => 'uni0577',\n    1400 => 'uni0578',\n    1401 => 'uni0579',\n    1402 => 'uni057A',\n    1403 => 'uni057B',\n    1404 => 'uni057C',\n    1405 => 'uni057D',\n    1406 => 'uni057E',\n    1407 => 'uni057F',\n    1408 => 'uni0580',\n    1409 => 'uni0581',\n    1410 => 'uni0582',\n    1411 => 'uni0583',\n    1412 => 'uni0584',\n    1413 => 'uni0585',\n    1414 => 'uni0586',\n    1415 => 'uni0587',\n    1417 => 'uni0589',\n    1418 => 'uni058A',\n    1456 => 'uni05B0',\n    1457 => 'uni05B1',\n    1458 => 'uni05B2',\n    1459 => 'uni05B3',\n    1460 => 'uni05B4',\n    1461 => 'uni05B5',\n    1462 => 'uni05B6',\n    1463 => 'uni05B7',\n    1464 => 'uni05B8',\n    1465 => 'uni05B9',\n    1466 => 'uni05BA',\n    1467 => 'uni05BB',\n    1468 => 'uni05BC',\n    1469 => 'uni05BD',\n    1470 => 'uni05BE',\n    1471 => 'uni05BF',\n    1472 => 'uni05C0',\n    1473 => 'uni05C1',\n    1474 => 'uni05C2',\n    1475 => 'uni05C3',\n    1478 => 'uni05C6',\n    1479 => 'uni05C7',\n    1488 => 'uni05D0',\n    1489 => 'uni05D1',\n    1490 => 'uni05D2',\n    1491 => 'uni05D3',\n    1492 => 'uni05D4',\n    1493 => 'uni05D5',\n    1494 => 'uni05D6',\n    1495 => 'uni05D7',\n    1496 => 'uni05D8',\n    1497 => 'uni05D9',\n    1498 => 'uni05DA',\n    1499 => 'uni05DB',\n    1500 => 'uni05DC',\n    1501 => 'uni05DD',\n    1502 => 'uni05DE',\n    1503 => 'uni05DF',\n    1504 => 'uni05E0',\n    1505 => 'uni05E1',\n    1506 => 'uni05E2',\n    1507 => 'uni05E3',\n    1508 => 'uni05E4',\n    1509 => 'uni05E5',\n    1510 => 'uni05E6',\n    1511 => 'uni05E7',\n    1512 => 'uni05E8',\n    1513 => 'uni05E9',\n    1514 => 'uni05EA',\n    1520 => 'uni05F0',\n    1521 => 'uni05F1',\n    1522 => 'uni05F2',\n    1523 => 'uni05F3',\n    1524 => 'uni05F4',\n    1542 => 'uni0606',\n    1543 => 'uni0607',\n    1545 => 'uni0609',\n    1546 => 'uni060A',\n    1548 => 'uni060C',\n    1557 => 'uni0615',\n    1563 => 'uni061B',\n    1567 => 'uni061F',\n    1569 => 'uni0621',\n    1570 => 'uni0622',\n    1571 => 'uni0623',\n    1572 => 'uni0624',\n    1573 => 'uni0625',\n    1574 => 'uni0626',\n    1575 => 'uni0627',\n    1576 => 'uni0628',\n    1577 => 'uni0629',\n    1578 => 'uni062A',\n    1579 => 'uni062B',\n    1580 => 'uni062C',\n    1581 => 'uni062D',\n    1582 => 'uni062E',\n    1583 => 'uni062F',\n    1584 => 'uni0630',\n    1585 => 'uni0631',\n    1586 => 'uni0632',\n    1587 => 'uni0633',\n    1588 => 'uni0634',\n    1589 => 'uni0635',\n    1590 => 'uni0636',\n    1591 => 'uni0637',\n    1592 => 'uni0638',\n    1593 => 'uni0639',\n    1594 => 'uni063A',\n    1600 => 'uni0640',\n    1601 => 'uni0641',\n    1602 => 'uni0642',\n    1603 => 'uni0643',\n    1604 => 'uni0644',\n    1605 => 'uni0645',\n    1606 => 'uni0646',\n    1607 => 'uni0647',\n    1608 => 'uni0648',\n    1609 => 'uni0649',\n    1610 => 'uni064A',\n    1611 => 'uni064B',\n    1612 => 'uni064C',\n    1613 => 'uni064D',\n    1614 => 'uni064E',\n    1615 => 'uni064F',\n    1616 => 'uni0650',\n    1617 => 'uni0651',\n    1618 => 'uni0652',\n    1619 => 'uni0653',\n    1620 => 'uni0654',\n    1621 => 'uni0655',\n    1623 => 'uni0657',\n    1626 => 'uni065A',\n    1632 => 'uni0660',\n    1633 => 'uni0661',\n    1634 => 'uni0662',\n    1635 => 'uni0663',\n    1636 => 'uni0664',\n    1637 => 'uni0665',\n    1638 => 'uni0666',\n    1639 => 'uni0667',\n    1640 => 'uni0668',\n    1641 => 'uni0669',\n    1642 => 'uni066A',\n    1643 => 'uni066B',\n    1644 => 'uni066C',\n    1645 => 'uni066D',\n    1646 => 'uni066E',\n    1647 => 'uni066F',\n    1648 => 'uni0670',\n    1652 => 'uni0674',\n    1657 => 'uni0679',\n    1658 => 'uni067A',\n    1659 => 'uni067B',\n    1660 => 'uni067C',\n    1661 => 'uni067D',\n    1662 => 'uni067E',\n    1663 => 'uni067F',\n    1664 => 'uni0680',\n    1665 => 'uni0681',\n    1666 => 'uni0682',\n    1667 => 'uni0683',\n    1668 => 'uni0684',\n    1669 => 'uni0685',\n    1670 => 'uni0686',\n    1671 => 'uni0687',\n    1672 => 'uni0688',\n    1673 => 'uni0689',\n    1674 => 'uni068A',\n    1675 => 'uni068B',\n    1676 => 'uni068C',\n    1677 => 'uni068D',\n    1678 => 'uni068E',\n    1679 => 'uni068F',\n    1680 => 'uni0690',\n    1681 => 'uni0691',\n    1682 => 'uni0692',\n    1683 => 'uni0693',\n    1684 => 'uni0694',\n    1685 => 'uni0695',\n    1686 => 'uni0696',\n    1687 => 'uni0697',\n    1688 => 'uni0698',\n    1689 => 'uni0699',\n    1690 => 'uni069A',\n    1691 => 'uni069B',\n    1692 => 'uni069C',\n    1693 => 'uni069D',\n    1694 => 'uni069E',\n    1695 => 'uni069F',\n    1696 => 'uni06A0',\n    1697 => 'uni06A1',\n    1698 => 'uni06A2',\n    1699 => 'uni06A3',\n    1700 => 'uni06A4',\n    1701 => 'uni06A5',\n    1702 => 'uni06A6',\n    1703 => 'uni06A7',\n    1704 => 'uni06A8',\n    1705 => 'uni06A9',\n    1706 => 'uni06AA',\n    1707 => 'uni06AB',\n    1708 => 'uni06AC',\n    1709 => 'uni06AD',\n    1710 => 'uni06AE',\n    1711 => 'uni06AF',\n    1712 => 'uni06B0',\n    1713 => 'uni06B1',\n    1714 => 'uni06B2',\n    1715 => 'uni06B3',\n    1716 => 'uni06B4',\n    1717 => 'uni06B5',\n    1718 => 'uni06B6',\n    1719 => 'uni06B7',\n    1720 => 'uni06B8',\n    1721 => 'uni06B9',\n    1722 => 'uni06BA',\n    1723 => 'uni06BB',\n    1724 => 'uni06BC',\n    1725 => 'uni06BD',\n    1726 => 'uni06BE',\n    1727 => 'uni06BF',\n    1734 => 'uni06C6',\n    1735 => 'uni06C7',\n    1736 => 'uni06C8',\n    1739 => 'uni06CB',\n    1740 => 'uni06CC',\n    1742 => 'uni06CE',\n    1744 => 'uni06D0',\n    1749 => 'uni06D5',\n    1776 => 'uni06F0',\n    1777 => 'uni06F1',\n    1778 => 'uni06F2',\n    1779 => 'uni06F3',\n    1780 => 'uni06F4',\n    1781 => 'uni06F5',\n    1782 => 'uni06F6',\n    1783 => 'uni06F7',\n    1784 => 'uni06F8',\n    1785 => 'uni06F9',\n    1984 => 'uni07C0',\n    1985 => 'uni07C1',\n    1986 => 'uni07C2',\n    1987 => 'uni07C3',\n    1988 => 'uni07C4',\n    1989 => 'uni07C5',\n    1990 => 'uni07C6',\n    1991 => 'uni07C7',\n    1992 => 'uni07C8',\n    1993 => 'uni07C9',\n    1994 => 'uni07CA',\n    1995 => 'uni07CB',\n    1996 => 'uni07CC',\n    1997 => 'uni07CD',\n    1998 => 'uni07CE',\n    1999 => 'uni07CF',\n    2000 => 'uni07D0',\n    2001 => 'uni07D1',\n    2002 => 'uni07D2',\n    2003 => 'uni07D3',\n    2004 => 'uni07D4',\n    2005 => 'uni07D5',\n    2006 => 'uni07D6',\n    2007 => 'uni07D7',\n    2008 => 'uni07D8',\n    2009 => 'uni07D9',\n    2010 => 'uni07DA',\n    2011 => 'uni07DB',\n    2012 => 'uni07DC',\n    2013 => 'uni07DD',\n    2014 => 'uni07DE',\n    2015 => 'uni07DF',\n    2016 => 'uni07E0',\n    2017 => 'uni07E1',\n    2018 => 'uni07E2',\n    2019 => 'uni07E3',\n    2020 => 'uni07E4',\n    2021 => 'uni07E5',\n    2022 => 'uni07E6',\n    2023 => 'uni07E7',\n    2027 => 'uni07EB',\n    2028 => 'uni07EC',\n    2029 => 'uni07ED',\n    2030 => 'uni07EE',\n    2031 => 'uni07EF',\n    2032 => 'uni07F0',\n    2033 => 'uni07F1',\n    2034 => 'uni07F2',\n    2035 => 'uni07F3',\n    2036 => 'uni07F4',\n    2037 => 'uni07F5',\n    2040 => 'uni07F8',\n    2041 => 'uni07F9',\n    2042 => 'uni07FA',\n    3647 => 'uni0E3F',\n    3713 => 'uni0E81',\n    3714 => 'uni0E82',\n    3716 => 'uni0E84',\n    3719 => 'uni0E87',\n    3720 => 'uni0E88',\n    3722 => 'uni0E8A',\n    3725 => 'uni0E8D',\n    3732 => 'uni0E94',\n    3733 => 'uni0E95',\n    3734 => 'uni0E96',\n    3735 => 'uni0E97',\n    3737 => 'uni0E99',\n    3738 => 'uni0E9A',\n    3739 => 'uni0E9B',\n    3740 => 'uni0E9C',\n    3741 => 'uni0E9D',\n    3742 => 'uni0E9E',\n    3743 => 'uni0E9F',\n    3745 => 'uni0EA1',\n    3746 => 'uni0EA2',\n    3747 => 'uni0EA3',\n    3749 => 'uni0EA5',\n    3751 => 'uni0EA7',\n    3754 => 'uni0EAA',\n    3755 => 'uni0EAB',\n    3757 => 'uni0EAD',\n    3758 => 'uni0EAE',\n    3759 => 'uni0EAF',\n    3760 => 'uni0EB0',\n    3761 => 'uni0EB1',\n    3762 => 'uni0EB2',\n    3763 => 'uni0EB3',\n    3764 => 'uni0EB4',\n    3765 => 'uni0EB5',\n    3766 => 'uni0EB6',\n    3767 => 'uni0EB7',\n    3768 => 'uni0EB8',\n    3769 => 'uni0EB9',\n    3771 => 'uni0EBB',\n    3772 => 'uni0EBC',\n    3773 => 'uni0EBD',\n    3776 => 'uni0EC0',\n    3777 => 'uni0EC1',\n    3778 => 'uni0EC2',\n    3779 => 'uni0EC3',\n    3780 => 'uni0EC4',\n    3782 => 'uni0EC6',\n    3784 => 'uni0EC8',\n    3785 => 'uni0EC9',\n    3786 => 'uni0ECA',\n    3787 => 'uni0ECB',\n    3788 => 'uni0ECC',\n    3789 => 'uni0ECD',\n    3792 => 'uni0ED0',\n    3793 => 'uni0ED1',\n    3794 => 'uni0ED2',\n    3795 => 'uni0ED3',\n    3796 => 'uni0ED4',\n    3797 => 'uni0ED5',\n    3798 => 'uni0ED6',\n    3799 => 'uni0ED7',\n    3800 => 'uni0ED8',\n    3801 => 'uni0ED9',\n    3804 => 'uni0EDC',\n    3805 => 'uni0EDD',\n    4256 => 'uni10A0',\n    4257 => 'uni10A1',\n    4258 => 'uni10A2',\n    4259 => 'uni10A3',\n    4260 => 'uni10A4',\n    4261 => 'uni10A5',\n    4262 => 'uni10A6',\n    4263 => 'uni10A7',\n    4264 => 'uni10A8',\n    4265 => 'uni10A9',\n    4266 => 'uni10AA',\n    4267 => 'uni10AB',\n    4268 => 'uni10AC',\n    4269 => 'uni10AD',\n    4270 => 'uni10AE',\n    4271 => 'uni10AF',\n    4272 => 'uni10B0',\n    4273 => 'uni10B1',\n    4274 => 'uni10B2',\n    4275 => 'uni10B3',\n    4276 => 'uni10B4',\n    4277 => 'uni10B5',\n    4278 => 'uni10B6',\n    4279 => 'uni10B7',\n    4280 => 'uni10B8',\n    4281 => 'uni10B9',\n    4282 => 'uni10BA',\n    4283 => 'uni10BB',\n    4284 => 'uni10BC',\n    4285 => 'uni10BD',\n    4286 => 'uni10BE',\n    4287 => 'uni10BF',\n    4288 => 'uni10C0',\n    4289 => 'uni10C1',\n    4290 => 'uni10C2',\n    4291 => 'uni10C3',\n    4292 => 'uni10C4',\n    4293 => 'uni10C5',\n    4304 => 'uni10D0',\n    4305 => 'uni10D1',\n    4306 => 'uni10D2',\n    4307 => 'uni10D3',\n    4308 => 'uni10D4',\n    4309 => 'uni10D5',\n    4310 => 'uni10D6',\n    4311 => 'uni10D7',\n    4312 => 'uni10D8',\n    4313 => 'uni10D9',\n    4314 => 'uni10DA',\n    4315 => 'uni10DB',\n    4316 => 'uni10DC',\n    4317 => 'uni10DD',\n    4318 => 'uni10DE',\n    4319 => 'uni10DF',\n    4320 => 'uni10E0',\n    4321 => 'uni10E1',\n    4322 => 'uni10E2',\n    4323 => 'uni10E3',\n    4324 => 'uni10E4',\n    4325 => 'uni10E5',\n    4326 => 'uni10E6',\n    4327 => 'uni10E7',\n    4328 => 'uni10E8',\n    4329 => 'uni10E9',\n    4330 => 'uni10EA',\n    4331 => 'uni10EB',\n    4332 => 'uni10EC',\n    4333 => 'uni10ED',\n    4334 => 'uni10EE',\n    4335 => 'uni10EF',\n    4336 => 'uni10F0',\n    4337 => 'uni10F1',\n    4338 => 'uni10F2',\n    4339 => 'uni10F3',\n    4340 => 'uni10F4',\n    4341 => 'uni10F5',\n    4342 => 'uni10F6',\n    4343 => 'uni10F7',\n    4344 => 'uni10F8',\n    4345 => 'uni10F9',\n    4346 => 'uni10FA',\n    4347 => 'uni10FB',\n    4348 => 'uni10FC',\n    5121 => 'uni1401',\n    5122 => 'uni1402',\n    5123 => 'uni1403',\n    5124 => 'uni1404',\n    5125 => 'uni1405',\n    5126 => 'uni1406',\n    5127 => 'uni1407',\n    5129 => 'uni1409',\n    5130 => 'uni140A',\n    5131 => 'uni140B',\n    5132 => 'uni140C',\n    5133 => 'uni140D',\n    5134 => 'uni140E',\n    5135 => 'uni140F',\n    5136 => 'uni1410',\n    5137 => 'uni1411',\n    5138 => 'uni1412',\n    5139 => 'uni1413',\n    5140 => 'uni1414',\n    5141 => 'uni1415',\n    5142 => 'uni1416',\n    5143 => 'uni1417',\n    5144 => 'uni1418',\n    5145 => 'uni1419',\n    5146 => 'uni141A',\n    5147 => 'uni141B',\n    5149 => 'uni141D',\n    5150 => 'uni141E',\n    5151 => 'uni141F',\n    5152 => 'uni1420',\n    5153 => 'uni1421',\n    5154 => 'uni1422',\n    5155 => 'uni1423',\n    5156 => 'uni1424',\n    5157 => 'uni1425',\n    5158 => 'uni1426',\n    5159 => 'uni1427',\n    5160 => 'uni1428',\n    5161 => 'uni1429',\n    5162 => 'uni142A',\n    5163 => 'uni142B',\n    5164 => 'uni142C',\n    5165 => 'uni142D',\n    5166 => 'uni142E',\n    5167 => 'uni142F',\n    5168 => 'uni1430',\n    5169 => 'uni1431',\n    5170 => 'uni1432',\n    5171 => 'uni1433',\n    5172 => 'uni1434',\n    5173 => 'uni1435',\n    5175 => 'uni1437',\n    5176 => 'uni1438',\n    5177 => 'uni1439',\n    5178 => 'uni143A',\n    5179 => 'uni143B',\n    5180 => 'uni143C',\n    5181 => 'uni143D',\n    5182 => 'uni143E',\n    5183 => 'uni143F',\n    5184 => 'uni1440',\n    5185 => 'uni1441',\n    5186 => 'uni1442',\n    5187 => 'uni1443',\n    5188 => 'uni1444',\n    5189 => 'uni1445',\n    5190 => 'uni1446',\n    5191 => 'uni1447',\n    5192 => 'uni1448',\n    5193 => 'uni1449',\n    5194 => 'uni144A',\n    5196 => 'uni144C',\n    5197 => 'uni144D',\n    5198 => 'uni144E',\n    5199 => 'uni144F',\n    5200 => 'uni1450',\n    5201 => 'uni1451',\n    5202 => 'uni1452',\n    5204 => 'uni1454',\n    5205 => 'uni1455',\n    5206 => 'uni1456',\n    5207 => 'uni1457',\n    5208 => 'uni1458',\n    5209 => 'uni1459',\n    5210 => 'uni145A',\n    5211 => 'uni145B',\n    5212 => 'uni145C',\n    5213 => 'uni145D',\n    5214 => 'uni145E',\n    5215 => 'uni145F',\n    5216 => 'uni1460',\n    5217 => 'uni1461',\n    5218 => 'uni1462',\n    5219 => 'uni1463',\n    5220 => 'uni1464',\n    5221 => 'uni1465',\n    5222 => 'uni1466',\n    5223 => 'uni1467',\n    5224 => 'uni1468',\n    5225 => 'uni1469',\n    5226 => 'uni146A',\n    5227 => 'uni146B',\n    5228 => 'uni146C',\n    5229 => 'uni146D',\n    5230 => 'uni146E',\n    5231 => 'uni146F',\n    5232 => 'uni1470',\n    5233 => 'uni1471',\n    5234 => 'uni1472',\n    5235 => 'uni1473',\n    5236 => 'uni1474',\n    5237 => 'uni1475',\n    5238 => 'uni1476',\n    5239 => 'uni1477',\n    5240 => 'uni1478',\n    5241 => 'uni1479',\n    5242 => 'uni147A',\n    5243 => 'uni147B',\n    5244 => 'uni147C',\n    5245 => 'uni147D',\n    5246 => 'uni147E',\n    5247 => 'uni147F',\n    5248 => 'uni1480',\n    5249 => 'uni1481',\n    5250 => 'uni1482',\n    5251 => 'uni1483',\n    5252 => 'uni1484',\n    5253 => 'uni1485',\n    5254 => 'uni1486',\n    5255 => 'uni1487',\n    5256 => 'uni1488',\n    5257 => 'uni1489',\n    5258 => 'uni148A',\n    5259 => 'uni148B',\n    5260 => 'uni148C',\n    5261 => 'uni148D',\n    5262 => 'uni148E',\n    5263 => 'uni148F',\n    5264 => 'uni1490',\n    5265 => 'uni1491',\n    5266 => 'uni1492',\n    5267 => 'uni1493',\n    5268 => 'uni1494',\n    5269 => 'uni1495',\n    5270 => 'uni1496',\n    5271 => 'uni1497',\n    5272 => 'uni1498',\n    5273 => 'uni1499',\n    5274 => 'uni149A',\n    5275 => 'uni149B',\n    5276 => 'uni149C',\n    5277 => 'uni149D',\n    5278 => 'uni149E',\n    5279 => 'uni149F',\n    5280 => 'uni14A0',\n    5281 => 'uni14A1',\n    5282 => 'uni14A2',\n    5283 => 'uni14A3',\n    5284 => 'uni14A4',\n    5285 => 'uni14A5',\n    5286 => 'uni14A6',\n    5287 => 'uni14A7',\n    5288 => 'uni14A8',\n    5289 => 'uni14A9',\n    5290 => 'uni14AA',\n    5291 => 'uni14AB',\n    5292 => 'uni14AC',\n    5293 => 'uni14AD',\n    5294 => 'uni14AE',\n    5295 => 'uni14AF',\n    5296 => 'uni14B0',\n    5297 => 'uni14B1',\n    5298 => 'uni14B2',\n    5299 => 'uni14B3',\n    5300 => 'uni14B4',\n    5301 => 'uni14B5',\n    5302 => 'uni14B6',\n    5303 => 'uni14B7',\n    5304 => 'uni14B8',\n    5305 => 'uni14B9',\n    5306 => 'uni14BA',\n    5307 => 'uni14BB',\n    5308 => 'uni14BC',\n    5309 => 'uni14BD',\n    5312 => 'uni14C0',\n    5313 => 'uni14C1',\n    5314 => 'uni14C2',\n    5315 => 'uni14C3',\n    5316 => 'uni14C4',\n    5317 => 'uni14C5',\n    5318 => 'uni14C6',\n    5319 => 'uni14C7',\n    5320 => 'uni14C8',\n    5321 => 'uni14C9',\n    5322 => 'uni14CA',\n    5323 => 'uni14CB',\n    5324 => 'uni14CC',\n    5325 => 'uni14CD',\n    5326 => 'uni14CE',\n    5327 => 'uni14CF',\n    5328 => 'uni14D0',\n    5329 => 'uni14D1',\n    5330 => 'uni14D2',\n    5331 => 'uni14D3',\n    5332 => 'uni14D4',\n    5333 => 'uni14D5',\n    5334 => 'uni14D6',\n    5335 => 'uni14D7',\n    5336 => 'uni14D8',\n    5337 => 'uni14D9',\n    5338 => 'uni14DA',\n    5339 => 'uni14DB',\n    5340 => 'uni14DC',\n    5341 => 'uni14DD',\n    5342 => 'uni14DE',\n    5343 => 'uni14DF',\n    5344 => 'uni14E0',\n    5345 => 'uni14E1',\n    5346 => 'uni14E2',\n    5347 => 'uni14E3',\n    5348 => 'uni14E4',\n    5349 => 'uni14E5',\n    5350 => 'uni14E6',\n    5351 => 'uni14E7',\n    5352 => 'uni14E8',\n    5353 => 'uni14E9',\n    5354 => 'uni14EA',\n    5356 => 'uni14EC',\n    5357 => 'uni14ED',\n    5358 => 'uni14EE',\n    5359 => 'uni14EF',\n    5360 => 'uni14F0',\n    5361 => 'uni14F1',\n    5362 => 'uni14F2',\n    5363 => 'uni14F3',\n    5364 => 'uni14F4',\n    5365 => 'uni14F5',\n    5366 => 'uni14F6',\n    5367 => 'uni14F7',\n    5368 => 'uni14F8',\n    5369 => 'uni14F9',\n    5370 => 'uni14FA',\n    5371 => 'uni14FB',\n    5372 => 'uni14FC',\n    5373 => 'uni14FD',\n    5374 => 'uni14FE',\n    5375 => 'uni14FF',\n    5376 => 'uni1500',\n    5377 => 'uni1501',\n    5378 => 'uni1502',\n    5379 => 'uni1503',\n    5380 => 'uni1504',\n    5381 => 'uni1505',\n    5382 => 'uni1506',\n    5383 => 'uni1507',\n    5392 => 'uni1510',\n    5393 => 'uni1511',\n    5394 => 'uni1512',\n    5395 => 'uni1513',\n    5396 => 'uni1514',\n    5397 => 'uni1515',\n    5398 => 'uni1516',\n    5399 => 'uni1517',\n    5400 => 'uni1518',\n    5401 => 'uni1519',\n    5402 => 'uni151A',\n    5403 => 'uni151B',\n    5404 => 'uni151C',\n    5405 => 'uni151D',\n    5406 => 'uni151E',\n    5407 => 'uni151F',\n    5408 => 'uni1520',\n    5409 => 'uni1521',\n    5410 => 'uni1522',\n    5411 => 'uni1523',\n    5412 => 'uni1524',\n    5413 => 'uni1525',\n    5414 => 'uni1526',\n    5415 => 'uni1527',\n    5416 => 'uni1528',\n    5417 => 'uni1529',\n    5418 => 'uni152A',\n    5419 => 'uni152B',\n    5420 => 'uni152C',\n    5421 => 'uni152D',\n    5422 => 'uni152E',\n    5423 => 'uni152F',\n    5424 => 'uni1530',\n    5425 => 'uni1531',\n    5426 => 'uni1532',\n    5427 => 'uni1533',\n    5428 => 'uni1534',\n    5429 => 'uni1535',\n    5430 => 'uni1536',\n    5431 => 'uni1537',\n    5432 => 'uni1538',\n    5433 => 'uni1539',\n    5434 => 'uni153A',\n    5435 => 'uni153B',\n    5436 => 'uni153C',\n    5437 => 'uni153D',\n    5438 => 'uni153E',\n    5440 => 'uni1540',\n    5441 => 'uni1541',\n    5442 => 'uni1542',\n    5443 => 'uni1543',\n    5444 => 'uni1544',\n    5445 => 'uni1545',\n    5446 => 'uni1546',\n    5447 => 'uni1547',\n    5448 => 'uni1548',\n    5449 => 'uni1549',\n    5450 => 'uni154A',\n    5451 => 'uni154B',\n    5452 => 'uni154C',\n    5453 => 'uni154D',\n    5454 => 'uni154E',\n    5455 => 'uni154F',\n    5456 => 'uni1550',\n    5458 => 'uni1552',\n    5459 => 'uni1553',\n    5460 => 'uni1554',\n    5461 => 'uni1555',\n    5462 => 'uni1556',\n    5463 => 'uni1557',\n    5464 => 'uni1558',\n    5465 => 'uni1559',\n    5466 => 'uni155A',\n    5467 => 'uni155B',\n    5468 => 'uni155C',\n    5469 => 'uni155D',\n    5470 => 'uni155E',\n    5471 => 'uni155F',\n    5472 => 'uni1560',\n    5473 => 'uni1561',\n    5474 => 'uni1562',\n    5475 => 'uni1563',\n    5476 => 'uni1564',\n    5477 => 'uni1565',\n    5478 => 'uni1566',\n    5479 => 'uni1567',\n    5480 => 'uni1568',\n    5481 => 'uni1569',\n    5482 => 'uni156A',\n    5492 => 'uni1574',\n    5493 => 'uni1575',\n    5494 => 'uni1576',\n    5495 => 'uni1577',\n    5496 => 'uni1578',\n    5497 => 'uni1579',\n    5498 => 'uni157A',\n    5499 => 'uni157B',\n    5500 => 'uni157C',\n    5501 => 'uni157D',\n    5502 => 'uni157E',\n    5503 => 'uni157F',\n    5504 => 'uni1580',\n    5505 => 'uni1581',\n    5506 => 'uni1582',\n    5507 => 'uni1583',\n    5508 => 'uni1584',\n    5509 => 'uni1585',\n    5514 => 'uni158A',\n    5515 => 'uni158B',\n    5516 => 'uni158C',\n    5517 => 'uni158D',\n    5518 => 'uni158E',\n    5519 => 'uni158F',\n    5520 => 'uni1590',\n    5521 => 'uni1591',\n    5522 => 'uni1592',\n    5523 => 'uni1593',\n    5524 => 'uni1594',\n    5525 => 'uni1595',\n    5526 => 'uni1596',\n    5536 => 'uni15A0',\n    5537 => 'uni15A1',\n    5538 => 'uni15A2',\n    5539 => 'uni15A3',\n    5540 => 'uni15A4',\n    5541 => 'uni15A5',\n    5542 => 'uni15A6',\n    5543 => 'uni15A7',\n    5544 => 'uni15A8',\n    5545 => 'uni15A9',\n    5546 => 'uni15AA',\n    5547 => 'uni15AB',\n    5548 => 'uni15AC',\n    5549 => 'uni15AD',\n    5550 => 'uni15AE',\n    5551 => 'uni15AF',\n    5598 => 'uni15DE',\n    5601 => 'uni15E1',\n    5702 => 'uni1646',\n    5703 => 'uni1647',\n    5742 => 'uni166E',\n    5743 => 'uni166F',\n    5744 => 'uni1670',\n    5745 => 'uni1671',\n    5746 => 'uni1672',\n    5747 => 'uni1673',\n    5748 => 'uni1674',\n    5749 => 'uni1675',\n    5750 => 'uni1676',\n    5760 => 'uni1680',\n    5761 => 'uni1681',\n    5762 => 'uni1682',\n    5763 => 'uni1683',\n    5764 => 'uni1684',\n    5765 => 'uni1685',\n    5766 => 'uni1686',\n    5767 => 'uni1687',\n    5768 => 'uni1688',\n    5769 => 'uni1689',\n    5770 => 'uni168A',\n    5771 => 'uni168B',\n    5772 => 'uni168C',\n    5773 => 'uni168D',\n    5774 => 'uni168E',\n    5775 => 'uni168F',\n    5776 => 'uni1690',\n    5777 => 'uni1691',\n    5778 => 'uni1692',\n    5779 => 'uni1693',\n    5780 => 'uni1694',\n    5781 => 'uni1695',\n    5782 => 'uni1696',\n    5783 => 'uni1697',\n    5784 => 'uni1698',\n    5785 => 'uni1699',\n    5786 => 'uni169A',\n    5787 => 'uni169B',\n    5788 => 'uni169C',\n    7424 => 'uni1D00',\n    7425 => 'uni1D01',\n    7426 => 'uni1D02',\n    7427 => 'uni1D03',\n    7428 => 'uni1D04',\n    7429 => 'uni1D05',\n    7430 => 'uni1D06',\n    7431 => 'uni1D07',\n    7432 => 'uni1D08',\n    7433 => 'uni1D09',\n    7434 => 'uni1D0A',\n    7435 => 'uni1D0B',\n    7436 => 'uni1D0C',\n    7437 => 'uni1D0D',\n    7438 => 'uni1D0E',\n    7439 => 'uni1D0F',\n    7440 => 'uni1D10',\n    7441 => 'uni1D11',\n    7442 => 'uni1D12',\n    7443 => 'uni1D13',\n    7444 => 'uni1D14',\n    7446 => 'uni1D16',\n    7447 => 'uni1D17',\n    7448 => 'uni1D18',\n    7449 => 'uni1D19',\n    7450 => 'uni1D1A',\n    7451 => 'uni1D1B',\n    7452 => 'uni1D1C',\n    7453 => 'uni1D1D',\n    7454 => 'uni1D1E',\n    7455 => 'uni1D1F',\n    7456 => 'uni1D20',\n    7457 => 'uni1D21',\n    7458 => 'uni1D22',\n    7459 => 'uni1D23',\n    7462 => 'uni1D26',\n    7463 => 'uni1D27',\n    7464 => 'uni1D28',\n    7465 => 'uni1D29',\n    7466 => 'uni1D2A',\n    7467 => 'uni1D2B',\n    7468 => 'uni1D2C',\n    7469 => 'uni1D2D',\n    7470 => 'uni1D2E',\n    7472 => 'uni1D30',\n    7473 => 'uni1D31',\n    7474 => 'uni1D32',\n    7475 => 'uni1D33',\n    7476 => 'uni1D34',\n    7477 => 'uni1D35',\n    7478 => 'uni1D36',\n    7479 => 'uni1D37',\n    7480 => 'uni1D38',\n    7481 => 'uni1D39',\n    7482 => 'uni1D3A',\n    7483 => 'uni1D3B',\n    7484 => 'uni1D3C',\n    7485 => 'uni1D3D',\n    7486 => 'uni1D3E',\n    7487 => 'uni1D3F',\n    7488 => 'uni1D40',\n    7489 => 'uni1D41',\n    7490 => 'uni1D42',\n    7491 => 'uni1D43',\n    7492 => 'uni1D44',\n    7493 => 'uni1D45',\n    7494 => 'uni1D46',\n    7495 => 'uni1D47',\n    7496 => 'uni1D48',\n    7497 => 'uni1D49',\n    7498 => 'uni1D4A',\n    7499 => 'uni1D4B',\n    7500 => 'uni1D4C',\n    7501 => 'uni1D4D',\n    7502 => 'uni1D4E',\n    7503 => 'uni1D4F',\n    7504 => 'uni1D50',\n    7505 => 'uni1D51',\n    7506 => 'uni1D52',\n    7507 => 'uni1D53',\n    7508 => 'uni1D54',\n    7509 => 'uni1D55',\n    7510 => 'uni1D56',\n    7511 => 'uni1D57',\n    7512 => 'uni1D58',\n    7513 => 'uni1D59',\n    7514 => 'uni1D5A',\n    7515 => 'uni1D5B',\n    7517 => 'uni1D5D',\n    7518 => 'uni1D5E',\n    7519 => 'uni1D5F',\n    7520 => 'uni1D60',\n    7521 => 'uni1D61',\n    7522 => 'uni1D62',\n    7523 => 'uni1D63',\n    7524 => 'uni1D64',\n    7525 => 'uni1D65',\n    7526 => 'uni1D66',\n    7527 => 'uni1D67',\n    7528 => 'uni1D68',\n    7529 => 'uni1D69',\n    7530 => 'uni1D6A',\n    7543 => 'uni1D77',\n    7544 => 'uni1D78',\n    7547 => 'uni1D7B',\n    7549 => 'uni1D7D',\n    7557 => 'uni1D85',\n    7579 => 'uni1D9B',\n    7580 => 'uni1D9C',\n    7581 => 'uni1D9D',\n    7582 => 'uni1D9E',\n    7583 => 'uni1D9F',\n    7584 => 'uni1DA0',\n    7585 => 'uni1DA1',\n    7586 => 'uni1DA2',\n    7587 => 'uni1DA3',\n    7588 => 'uni1DA4',\n    7589 => 'uni1DA5',\n    7590 => 'uni1DA6',\n    7591 => 'uni1DA7',\n    7592 => 'uni1DA8',\n    7593 => 'uni1DA9',\n    7594 => 'uni1DAA',\n    7595 => 'uni1DAB',\n    7596 => 'uni1DAC',\n    7597 => 'uni1DAD',\n    7598 => 'uni1DAE',\n    7599 => 'uni1DAF',\n    7600 => 'uni1DB0',\n    7601 => 'uni1DB1',\n    7602 => 'uni1DB2',\n    7603 => 'uni1DB3',\n    7604 => 'uni1DB4',\n    7605 => 'uni1DB5',\n    7606 => 'uni1DB6',\n    7607 => 'uni1DB7',\n    7608 => 'uni1DB8',\n    7609 => 'uni1DB9',\n    7610 => 'uni1DBA',\n    7611 => 'uni1DBB',\n    7612 => 'uni1DBC',\n    7613 => 'uni1DBD',\n    7614 => 'uni1DBE',\n    7615 => 'uni1DBF',\n    7620 => 'uni1DC4',\n    7621 => 'uni1DC5',\n    7622 => 'uni1DC6',\n    7623 => 'uni1DC7',\n    7624 => 'uni1DC8',\n    7625 => 'uni1DC9',\n    7680 => 'uni1E00',\n    7681 => 'uni1E01',\n    7682 => 'uni1E02',\n    7683 => 'uni1E03',\n    7684 => 'uni1E04',\n    7685 => 'uni1E05',\n    7686 => 'uni1E06',\n    7687 => 'uni1E07',\n    7688 => 'uni1E08',\n    7689 => 'uni1E09',\n    7690 => 'uni1E0A',\n    7691 => 'uni1E0B',\n    7692 => 'uni1E0C',\n    7693 => 'uni1E0D',\n    7694 => 'uni1E0E',\n    7695 => 'uni1E0F',\n    7696 => 'uni1E10',\n    7697 => 'uni1E11',\n    7698 => 'uni1E12',\n    7699 => 'uni1E13',\n    7700 => 'uni1E14',\n    7701 => 'uni1E15',\n    7702 => 'uni1E16',\n    7703 => 'uni1E17',\n    7704 => 'uni1E18',\n    7705 => 'uni1E19',\n    7706 => 'uni1E1A',\n    7707 => 'uni1E1B',\n    7708 => 'uni1E1C',\n    7709 => 'uni1E1D',\n    7710 => 'uni1E1E',\n    7711 => 'uni1E1F',\n    7712 => 'uni1E20',\n    7713 => 'uni1E21',\n    7714 => 'uni1E22',\n    7715 => 'uni1E23',\n    7716 => 'uni1E24',\n    7717 => 'uni1E25',\n    7718 => 'uni1E26',\n    7719 => 'uni1E27',\n    7720 => 'uni1E28',\n    7721 => 'uni1E29',\n    7722 => 'uni1E2A',\n    7723 => 'uni1E2B',\n    7724 => 'uni1E2C',\n    7725 => 'uni1E2D',\n    7726 => 'uni1E2E',\n    7727 => 'uni1E2F',\n    7728 => 'uni1E30',\n    7729 => 'uni1E31',\n    7730 => 'uni1E32',\n    7731 => 'uni1E33',\n    7732 => 'uni1E34',\n    7733 => 'uni1E35',\n    7734 => 'uni1E36',\n    7735 => 'uni1E37',\n    7736 => 'uni1E38',\n    7737 => 'uni1E39',\n    7738 => 'uni1E3A',\n    7739 => 'uni1E3B',\n    7740 => 'uni1E3C',\n    7741 => 'uni1E3D',\n    7742 => 'uni1E3E',\n    7743 => 'uni1E3F',\n    7744 => 'uni1E40',\n    7745 => 'uni1E41',\n    7746 => 'uni1E42',\n    7747 => 'uni1E43',\n    7748 => 'uni1E44',\n    7749 => 'uni1E45',\n    7750 => 'uni1E46',\n    7751 => 'uni1E47',\n    7752 => 'uni1E48',\n    7753 => 'uni1E49',\n    7754 => 'uni1E4A',\n    7755 => 'uni1E4B',\n    7756 => 'uni1E4C',\n    7757 => 'uni1E4D',\n    7758 => 'uni1E4E',\n    7759 => 'uni1E4F',\n    7760 => 'uni1E50',\n    7761 => 'uni1E51',\n    7762 => 'uni1E52',\n    7763 => 'uni1E53',\n    7764 => 'uni1E54',\n    7765 => 'uni1E55',\n    7766 => 'uni1E56',\n    7767 => 'uni1E57',\n    7768 => 'uni1E58',\n    7769 => 'uni1E59',\n    7770 => 'uni1E5A',\n    7771 => 'uni1E5B',\n    7772 => 'uni1E5C',\n    7773 => 'uni1E5D',\n    7774 => 'uni1E5E',\n    7775 => 'uni1E5F',\n    7776 => 'uni1E60',\n    7777 => 'uni1E61',\n    7778 => 'uni1E62',\n    7779 => 'uni1E63',\n    7780 => 'uni1E64',\n    7781 => 'uni1E65',\n    7782 => 'uni1E66',\n    7783 => 'uni1E67',\n    7784 => 'uni1E68',\n    7785 => 'uni1E69',\n    7786 => 'uni1E6A',\n    7787 => 'uni1E6B',\n    7788 => 'uni1E6C',\n    7789 => 'uni1E6D',\n    7790 => 'uni1E6E',\n    7791 => 'uni1E6F',\n    7792 => 'uni1E70',\n    7793 => 'uni1E71',\n    7794 => 'uni1E72',\n    7795 => 'uni1E73',\n    7796 => 'uni1E74',\n    7797 => 'uni1E75',\n    7798 => 'uni1E76',\n    7799 => 'uni1E77',\n    7800 => 'uni1E78',\n    7801 => 'uni1E79',\n    7802 => 'uni1E7A',\n    7803 => 'uni1E7B',\n    7804 => 'uni1E7C',\n    7805 => 'uni1E7D',\n    7806 => 'uni1E7E',\n    7807 => 'uni1E7F',\n    7808 => 'Wgrave',\n    7809 => 'wgrave',\n    7810 => 'Wacute',\n    7811 => 'wacute',\n    7812 => 'Wdieresis',\n    7813 => 'wdieresis',\n    7814 => 'uni1E86',\n    7815 => 'uni1E87',\n    7816 => 'uni1E88',\n    7817 => 'uni1E89',\n    7818 => 'uni1E8A',\n    7819 => 'uni1E8B',\n    7820 => 'uni1E8C',\n    7821 => 'uni1E8D',\n    7822 => 'uni1E8E',\n    7823 => 'uni1E8F',\n    7824 => 'uni1E90',\n    7825 => 'uni1E91',\n    7826 => 'uni1E92',\n    7827 => 'uni1E93',\n    7828 => 'uni1E94',\n    7829 => 'uni1E95',\n    7830 => 'uni1E96',\n    7831 => 'uni1E97',\n    7832 => 'uni1E98',\n    7833 => 'uni1E99',\n    7834 => 'uni1E9A',\n    7835 => 'uni1E9B',\n    7836 => 'uni1E9C',\n    7837 => 'uni1E9D',\n    7838 => 'uni1E9E',\n    7839 => 'uni1E9F',\n    7840 => 'uni1EA0',\n    7841 => 'uni1EA1',\n    7842 => 'uni1EA2',\n    7843 => 'uni1EA3',\n    7844 => 'uni1EA4',\n    7845 => 'uni1EA5',\n    7846 => 'uni1EA6',\n    7847 => 'uni1EA7',\n    7848 => 'uni1EA8',\n    7849 => 'uni1EA9',\n    7850 => 'uni1EAA',\n    7851 => 'uni1EAB',\n    7852 => 'uni1EAC',\n    7853 => 'uni1EAD',\n    7854 => 'uni1EAE',\n    7855 => 'uni1EAF',\n    7856 => 'uni1EB0',\n    7857 => 'uni1EB1',\n    7858 => 'uni1EB2',\n    7859 => 'uni1EB3',\n    7860 => 'uni1EB4',\n    7861 => 'uni1EB5',\n    7862 => 'uni1EB6',\n    7863 => 'uni1EB7',\n    7864 => 'uni1EB8',\n    7865 => 'uni1EB9',\n    7866 => 'uni1EBA',\n    7867 => 'uni1EBB',\n    7868 => 'uni1EBC',\n    7869 => 'uni1EBD',\n    7870 => 'uni1EBE',\n    7871 => 'uni1EBF',\n    7872 => 'uni1EC0',\n    7873 => 'uni1EC1',\n    7874 => 'uni1EC2',\n    7875 => 'uni1EC3',\n    7876 => 'uni1EC4',\n    7877 => 'uni1EC5',\n    7878 => 'uni1EC6',\n    7879 => 'uni1EC7',\n    7880 => 'uni1EC8',\n    7881 => 'uni1EC9',\n    7882 => 'uni1ECA',\n    7883 => 'uni1ECB',\n    7884 => 'uni1ECC',\n    7885 => 'uni1ECD',\n    7886 => 'uni1ECE',\n    7887 => 'uni1ECF',\n    7888 => 'uni1ED0',\n    7889 => 'uni1ED1',\n    7890 => 'uni1ED2',\n    7891 => 'uni1ED3',\n    7892 => 'uni1ED4',\n    7893 => 'uni1ED5',\n    7894 => 'uni1ED6',\n    7895 => 'uni1ED7',\n    7896 => 'uni1ED8',\n    7897 => 'uni1ED9',\n    7898 => 'uni1EDA',\n    7899 => 'uni1EDB',\n    7900 => 'uni1EDC',\n    7901 => 'uni1EDD',\n    7902 => 'uni1EDE',\n    7903 => 'uni1EDF',\n    7904 => 'uni1EE0',\n    7905 => 'uni1EE1',\n    7906 => 'uni1EE2',\n    7907 => 'uni1EE3',\n    7908 => 'uni1EE4',\n    7909 => 'uni1EE5',\n    7910 => 'uni1EE6',\n    7911 => 'uni1EE7',\n    7912 => 'uni1EE8',\n    7913 => 'uni1EE9',\n    7914 => 'uni1EEA',\n    7915 => 'uni1EEB',\n    7916 => 'uni1EEC',\n    7917 => 'uni1EED',\n    7918 => 'uni1EEE',\n    7919 => 'uni1EEF',\n    7920 => 'uni1EF0',\n    7921 => 'uni1EF1',\n    7922 => 'Ygrave',\n    7923 => 'ygrave',\n    7924 => 'uni1EF4',\n    7925 => 'uni1EF5',\n    7926 => 'uni1EF6',\n    7927 => 'uni1EF7',\n    7928 => 'uni1EF8',\n    7929 => 'uni1EF9',\n    7930 => 'uni1EFA',\n    7931 => 'uni1EFB',\n    7936 => 'uni1F00',\n    7937 => 'uni1F01',\n    7938 => 'uni1F02',\n    7939 => 'uni1F03',\n    7940 => 'uni1F04',\n    7941 => 'uni1F05',\n    7942 => 'uni1F06',\n    7943 => 'uni1F07',\n    7944 => 'uni1F08',\n    7945 => 'uni1F09',\n    7946 => 'uni1F0A',\n    7947 => 'uni1F0B',\n    7948 => 'uni1F0C',\n    7949 => 'uni1F0D',\n    7950 => 'uni1F0E',\n    7951 => 'uni1F0F',\n    7952 => 'uni1F10',\n    7953 => 'uni1F11',\n    7954 => 'uni1F12',\n    7955 => 'uni1F13',\n    7956 => 'uni1F14',\n    7957 => 'uni1F15',\n    7960 => 'uni1F18',\n    7961 => 'uni1F19',\n    7962 => 'uni1F1A',\n    7963 => 'uni1F1B',\n    7964 => 'uni1F1C',\n    7965 => 'uni1F1D',\n    7968 => 'uni1F20',\n    7969 => 'uni1F21',\n    7970 => 'uni1F22',\n    7971 => 'uni1F23',\n    7972 => 'uni1F24',\n    7973 => 'uni1F25',\n    7974 => 'uni1F26',\n    7975 => 'uni1F27',\n    7976 => 'uni1F28',\n    7977 => 'uni1F29',\n    7978 => 'uni1F2A',\n    7979 => 'uni1F2B',\n    7980 => 'uni1F2C',\n    7981 => 'uni1F2D',\n    7982 => 'uni1F2E',\n    7983 => 'uni1F2F',\n    7984 => 'uni1F30',\n    7985 => 'uni1F31',\n    7986 => 'uni1F32',\n    7987 => 'uni1F33',\n    7988 => 'uni1F34',\n    7989 => 'uni1F35',\n    7990 => 'uni1F36',\n    7991 => 'uni1F37',\n    7992 => 'uni1F38',\n    7993 => 'uni1F39',\n    7994 => 'uni1F3A',\n    7995 => 'uni1F3B',\n    7996 => 'uni1F3C',\n    7997 => 'uni1F3D',\n    7998 => 'uni1F3E',\n    7999 => 'uni1F3F',\n    8000 => 'uni1F40',\n    8001 => 'uni1F41',\n    8002 => 'uni1F42',\n    8003 => 'uni1F43',\n    8004 => 'uni1F44',\n    8005 => 'uni1F45',\n    8008 => 'uni1F48',\n    8009 => 'uni1F49',\n    8010 => 'uni1F4A',\n    8011 => 'uni1F4B',\n    8012 => 'uni1F4C',\n    8013 => 'uni1F4D',\n    8016 => 'uni1F50',\n    8017 => 'uni1F51',\n    8018 => 'uni1F52',\n    8019 => 'uni1F53',\n    8020 => 'uni1F54',\n    8021 => 'uni1F55',\n    8022 => 'uni1F56',\n    8023 => 'uni1F57',\n    8025 => 'uni1F59',\n    8027 => 'uni1F5B',\n    8029 => 'uni1F5D',\n    8031 => 'uni1F5F',\n    8032 => 'uni1F60',\n    8033 => 'uni1F61',\n    8034 => 'uni1F62',\n    8035 => 'uni1F63',\n    8036 => 'uni1F64',\n    8037 => 'uni1F65',\n    8038 => 'uni1F66',\n    8039 => 'uni1F67',\n    8040 => 'uni1F68',\n    8041 => 'uni1F69',\n    8042 => 'uni1F6A',\n    8043 => 'uni1F6B',\n    8044 => 'uni1F6C',\n    8045 => 'uni1F6D',\n    8046 => 'uni1F6E',\n    8047 => 'uni1F6F',\n    8048 => 'uni1F70',\n    8049 => 'uni1F71',\n    8050 => 'uni1F72',\n    8051 => 'uni1F73',\n    8052 => 'uni1F74',\n    8053 => 'uni1F75',\n    8054 => 'uni1F76',\n    8055 => 'uni1F77',\n    8056 => 'uni1F78',\n    8057 => 'uni1F79',\n    8058 => 'uni1F7A',\n    8059 => 'uni1F7B',\n    8060 => 'uni1F7C',\n    8061 => 'uni1F7D',\n    8064 => 'uni1F80',\n    8065 => 'uni1F81',\n    8066 => 'uni1F82',\n    8067 => 'uni1F83',\n    8068 => 'uni1F84',\n    8069 => 'uni1F85',\n    8070 => 'uni1F86',\n    8071 => 'uni1F87',\n    8072 => 'uni1F88',\n    8073 => 'uni1F89',\n    8074 => 'uni1F8A',\n    8075 => 'uni1F8B',\n    8076 => 'uni1F8C',\n    8077 => 'uni1F8D',\n    8078 => 'uni1F8E',\n    8079 => 'uni1F8F',\n    8080 => 'uni1F90',\n    8081 => 'uni1F91',\n    8082 => 'uni1F92',\n    8083 => 'uni1F93',\n    8084 => 'uni1F94',\n    8085 => 'uni1F95',\n    8086 => 'uni1F96',\n    8087 => 'uni1F97',\n    8088 => 'uni1F98',\n    8089 => 'uni1F99',\n    8090 => 'uni1F9A',\n    8091 => 'uni1F9B',\n    8092 => 'uni1F9C',\n    8093 => 'uni1F9D',\n    8094 => 'uni1F9E',\n    8095 => 'uni1F9F',\n    8096 => 'uni1FA0',\n    8097 => 'uni1FA1',\n    8098 => 'uni1FA2',\n    8099 => 'uni1FA3',\n    8100 => 'uni1FA4',\n    8101 => 'uni1FA5',\n    8102 => 'uni1FA6',\n    8103 => 'uni1FA7',\n    8104 => 'uni1FA8',\n    8105 => 'uni1FA9',\n    8106 => 'uni1FAA',\n    8107 => 'uni1FAB',\n    8108 => 'uni1FAC',\n    8109 => 'uni1FAD',\n    8110 => 'uni1FAE',\n    8111 => 'uni1FAF',\n    8112 => 'uni1FB0',\n    8113 => 'uni1FB1',\n    8114 => 'uni1FB2',\n    8115 => 'uni1FB3',\n    8116 => 'uni1FB4',\n    8118 => 'uni1FB6',\n    8119 => 'uni1FB7',\n    8120 => 'uni1FB8',\n    8121 => 'uni1FB9',\n    8122 => 'uni1FBA',\n    8123 => 'uni1FBB',\n    8124 => 'uni1FBC',\n    8125 => 'uni1FBD',\n    8126 => 'uni1FBE',\n    8127 => 'uni1FBF',\n    8128 => 'uni1FC0',\n    8129 => 'uni1FC1',\n    8130 => 'uni1FC2',\n    8131 => 'uni1FC3',\n    8132 => 'uni1FC4',\n    8134 => 'uni1FC6',\n    8135 => 'uni1FC7',\n    8136 => 'uni1FC8',\n    8137 => 'uni1FC9',\n    8138 => 'uni1FCA',\n    8139 => 'uni1FCB',\n    8140 => 'uni1FCC',\n    8141 => 'uni1FCD',\n    8142 => 'uni1FCE',\n    8143 => 'uni1FCF',\n    8144 => 'uni1FD0',\n    8145 => 'uni1FD1',\n    8146 => 'uni1FD2',\n    8147 => 'uni1FD3',\n    8150 => 'uni1FD6',\n    8151 => 'uni1FD7',\n    8152 => 'uni1FD8',\n    8153 => 'uni1FD9',\n    8154 => 'uni1FDA',\n    8155 => 'uni1FDB',\n    8157 => 'uni1FDD',\n    8158 => 'uni1FDE',\n    8159 => 'uni1FDF',\n    8160 => 'uni1FE0',\n    8161 => 'uni1FE1',\n    8162 => 'uni1FE2',\n    8163 => 'uni1FE3',\n    8164 => 'uni1FE4',\n    8165 => 'uni1FE5',\n    8166 => 'uni1FE6',\n    8167 => 'uni1FE7',\n    8168 => 'uni1FE8',\n    8169 => 'uni1FE9',\n    8170 => 'uni1FEA',\n    8171 => 'uni1FEB',\n    8172 => 'uni1FEC',\n    8173 => 'uni1FED',\n    8174 => 'uni1FEE',\n    8175 => 'uni1FEF',\n    8178 => 'uni1FF2',\n    8179 => 'uni1FF3',\n    8180 => 'uni1FF4',\n    8182 => 'uni1FF6',\n    8183 => 'uni1FF7',\n    8184 => 'uni1FF8',\n    8185 => 'uni1FF9',\n    8186 => 'uni1FFA',\n    8187 => 'uni1FFB',\n    8188 => 'uni1FFC',\n    8189 => 'uni1FFD',\n    8190 => 'uni1FFE',\n    8192 => 'uni2000',\n    8193 => 'uni2001',\n    8194 => 'uni2002',\n    8195 => 'uni2003',\n    8196 => 'uni2004',\n    8197 => 'uni2005',\n    8198 => 'uni2006',\n    8199 => 'uni2007',\n    8200 => 'uni2008',\n    8201 => 'uni2009',\n    8202 => 'uni200A',\n    8203 => 'uni200B',\n    8204 => 'uni200C',\n    8205 => 'uni200D',\n    8206 => 'uni200E',\n    8207 => 'uni200F',\n    8208 => 'uni2010',\n    8209 => 'uni2011',\n    8210 => 'figuredash',\n    8211 => 'endash',\n    8212 => 'emdash',\n    8213 => 'uni2015',\n    8214 => 'uni2016',\n    8215 => 'underscoredbl',\n    8216 => 'quoteleft',\n    8217 => 'quoteright',\n    8218 => 'quotesinglbase',\n    8219 => 'quotereversed',\n    8220 => 'quotedblleft',\n    8221 => 'quotedblright',\n    8222 => 'quotedblbase',\n    8223 => 'uni201F',\n    8224 => 'dagger',\n    8225 => 'daggerdbl',\n    8226 => 'bullet',\n    8227 => 'uni2023',\n    8228 => 'onedotenleader',\n    8229 => 'twodotenleader',\n    8230 => 'ellipsis',\n    8231 => 'uni2027',\n    8232 => 'uni2028',\n    8233 => 'uni2029',\n    8234 => 'uni202A',\n    8235 => 'uni202B',\n    8236 => 'uni202C',\n    8237 => 'uni202D',\n    8238 => 'uni202E',\n    8239 => 'uni202F',\n    8240 => 'perthousand',\n    8241 => 'uni2031',\n    8242 => 'minute',\n    8243 => 'second',\n    8244 => 'uni2034',\n    8245 => 'uni2035',\n    8246 => 'uni2036',\n    8247 => 'uni2037',\n    8248 => 'uni2038',\n    8249 => 'guilsinglleft',\n    8250 => 'guilsinglright',\n    8251 => 'uni203B',\n    8252 => 'exclamdbl',\n    8253 => 'uni203D',\n    8254 => 'uni203E',\n    8255 => 'uni203F',\n    8256 => 'uni2040',\n    8257 => 'uni2041',\n    8258 => 'uni2042',\n    8259 => 'uni2043',\n    8260 => 'fraction',\n    8261 => 'uni2045',\n    8262 => 'uni2046',\n    8263 => 'uni2047',\n    8264 => 'uni2048',\n    8265 => 'uni2049',\n    8266 => 'uni204A',\n    8267 => 'uni204B',\n    8268 => 'uni204C',\n    8269 => 'uni204D',\n    8270 => 'uni204E',\n    8271 => 'uni204F',\n    8272 => 'uni2050',\n    8273 => 'uni2051',\n    8274 => 'uni2052',\n    8275 => 'uni2053',\n    8276 => 'uni2054',\n    8277 => 'uni2055',\n    8278 => 'uni2056',\n    8279 => 'uni2057',\n    8280 => 'uni2058',\n    8281 => 'uni2059',\n    8282 => 'uni205A',\n    8283 => 'uni205B',\n    8284 => 'uni205C',\n    8285 => 'uni205D',\n    8286 => 'uni205E',\n    8287 => 'uni205F',\n    8288 => 'uni2060',\n    8289 => 'uni2061',\n    8290 => 'uni2062',\n    8291 => 'uni2063',\n    8292 => 'uni2064',\n    8298 => 'uni206A',\n    8299 => 'uni206B',\n    8300 => 'uni206C',\n    8301 => 'uni206D',\n    8302 => 'uni206E',\n    8303 => 'uni206F',\n    8304 => 'uni2070',\n    8305 => 'uni2071',\n    8308 => 'uni2074',\n    8309 => 'uni2075',\n    8310 => 'uni2076',\n    8311 => 'uni2077',\n    8312 => 'uni2078',\n    8313 => 'uni2079',\n    8314 => 'uni207A',\n    8315 => 'uni207B',\n    8316 => 'uni207C',\n    8317 => 'uni207D',\n    8318 => 'uni207E',\n    8319 => 'uni207F',\n    8320 => 'uni2080',\n    8321 => 'uni2081',\n    8322 => 'uni2082',\n    8323 => 'uni2083',\n    8324 => 'uni2084',\n    8325 => 'uni2085',\n    8326 => 'uni2086',\n    8327 => 'uni2087',\n    8328 => 'uni2088',\n    8329 => 'uni2089',\n    8330 => 'uni208A',\n    8331 => 'uni208B',\n    8332 => 'uni208C',\n    8333 => 'uni208D',\n    8334 => 'uni208E',\n    8336 => 'uni2090',\n    8337 => 'uni2091',\n    8338 => 'uni2092',\n    8339 => 'uni2093',\n    8340 => 'uni2094',\n    8341 => 'uni2095',\n    8342 => 'uni2096',\n    8343 => 'uni2097',\n    8344 => 'uni2098',\n    8345 => 'uni2099',\n    8346 => 'uni209A',\n    8347 => 'uni209B',\n    8348 => 'uni209C',\n    8352 => 'uni20A0',\n    8353 => 'colonmonetary',\n    8354 => 'uni20A2',\n    8355 => 'franc',\n    8356 => 'lira',\n    8357 => 'uni20A5',\n    8358 => 'uni20A6',\n    8359 => 'peseta',\n    8360 => 'uni20A8',\n    8361 => 'uni20A9',\n    8362 => 'uni20AA',\n    8363 => 'dong',\n    8364 => 'Euro',\n    8365 => 'uni20AD',\n    8366 => 'uni20AE',\n    8367 => 'uni20AF',\n    8368 => 'uni20B0',\n    8369 => 'uni20B1',\n    8370 => 'uni20B2',\n    8371 => 'uni20B3',\n    8372 => 'uni20B4',\n    8373 => 'uni20B5',\n    8376 => 'uni20B8',\n    8377 => 'uni20B9',\n    8378 => 'uni20BA',\n    8381 => 'uni20BD',\n    8400 => 'uni20D0',\n    8401 => 'uni20D1',\n    8406 => 'uni20D6',\n    8407 => 'uni20D7',\n    8411 => 'uni20DB',\n    8412 => 'uni20DC',\n    8417 => 'uni20E1',\n    8448 => 'uni2100',\n    8449 => 'uni2101',\n    8450 => 'uni2102',\n    8451 => 'uni2103',\n    8452 => 'uni2104',\n    8453 => 'uni2105',\n    8454 => 'uni2106',\n    8455 => 'uni2107',\n    8456 => 'uni2108',\n    8457 => 'uni2109',\n    8459 => 'uni210B',\n    8460 => 'uni210C',\n    8461 => 'uni210D',\n    8462 => 'uni210E',\n    8463 => 'uni210F',\n    8464 => 'uni2110',\n    8465 => 'Ifraktur',\n    8466 => 'uni2112',\n    8467 => 'uni2113',\n    8468 => 'uni2114',\n    8469 => 'uni2115',\n    8470 => 'uni2116',\n    8471 => 'uni2117',\n    8472 => 'weierstrass',\n    8473 => 'uni2119',\n    8474 => 'uni211A',\n    8475 => 'uni211B',\n    8476 => 'Rfraktur',\n    8477 => 'uni211D',\n    8478 => 'prescription',\n    8479 => 'uni211F',\n    8480 => 'uni2120',\n    8481 => 'uni2121',\n    8482 => 'trademark',\n    8483 => 'uni2123',\n    8484 => 'uni2124',\n    8485 => 'uni2125',\n    8486 => 'uni2126',\n    8487 => 'uni2127',\n    8488 => 'uni2128',\n    8489 => 'uni2129',\n    8490 => 'uni212A',\n    8491 => 'uni212B',\n    8492 => 'uni212C',\n    8493 => 'uni212D',\n    8494 => 'estimated',\n    8495 => 'uni212F',\n    8496 => 'uni2130',\n    8497 => 'uni2131',\n    8498 => 'uni2132',\n    8499 => 'uni2133',\n    8500 => 'uni2134',\n    8501 => 'aleph',\n    8502 => 'uni2136',\n    8503 => 'uni2137',\n    8504 => 'uni2138',\n    8505 => 'uni2139',\n    8506 => 'uni213A',\n    8507 => 'uni213B',\n    8508 => 'uni213C',\n    8509 => 'uni213D',\n    8510 => 'uni213E',\n    8511 => 'uni213F',\n    8512 => 'uni2140',\n    8513 => 'uni2141',\n    8514 => 'uni2142',\n    8515 => 'uni2143',\n    8516 => 'uni2144',\n    8517 => 'uni2145',\n    8518 => 'uni2146',\n    8519 => 'uni2147',\n    8520 => 'uni2148',\n    8521 => 'uni2149',\n    8523 => 'uni214B',\n    8526 => 'uni214E',\n    8528 => 'uni2150',\n    8529 => 'uni2151',\n    8530 => 'uni2152',\n    8531 => 'onethird',\n    8532 => 'twothirds',\n    8533 => 'uni2155',\n    8534 => 'uni2156',\n    8535 => 'uni2157',\n    8536 => 'uni2158',\n    8537 => 'uni2159',\n    8538 => 'uni215A',\n    8539 => 'oneeighth',\n    8540 => 'threeeighths',\n    8541 => 'fiveeighths',\n    8542 => 'seveneighths',\n    8543 => 'uni215F',\n    8544 => 'uni2160',\n    8545 => 'uni2161',\n    8546 => 'uni2162',\n    8547 => 'uni2163',\n    8548 => 'uni2164',\n    8549 => 'uni2165',\n    8550 => 'uni2166',\n    8551 => 'uni2167',\n    8552 => 'uni2168',\n    8553 => 'uni2169',\n    8554 => 'uni216A',\n    8555 => 'uni216B',\n    8556 => 'uni216C',\n    8557 => 'uni216D',\n    8558 => 'uni216E',\n    8559 => 'uni216F',\n    8560 => 'uni2170',\n    8561 => 'uni2171',\n    8562 => 'uni2172',\n    8563 => 'uni2173',\n    8564 => 'uni2174',\n    8565 => 'uni2175',\n    8566 => 'uni2176',\n    8567 => 'uni2177',\n    8568 => 'uni2178',\n    8569 => 'uni2179',\n    8570 => 'uni217A',\n    8571 => 'uni217B',\n    8572 => 'uni217C',\n    8573 => 'uni217D',\n    8574 => 'uni217E',\n    8575 => 'uni217F',\n    8576 => 'uni2180',\n    8577 => 'uni2181',\n    8578 => 'uni2182',\n    8579 => 'uni2183',\n    8580 => 'uni2184',\n    8581 => 'uni2185',\n    8585 => 'uni2189',\n    8592 => 'arrowleft',\n    8593 => 'arrowup',\n    8594 => 'arrowright',\n    8595 => 'arrowdown',\n    8596 => 'arrowboth',\n    8597 => 'arrowupdn',\n    8598 => 'uni2196',\n    8599 => 'uni2197',\n    8600 => 'uni2198',\n    8601 => 'uni2199',\n    8602 => 'uni219A',\n    8603 => 'uni219B',\n    8604 => 'uni219C',\n    8605 => 'uni219D',\n    8606 => 'uni219E',\n    8607 => 'uni219F',\n    8608 => 'uni21A0',\n    8609 => 'uni21A1',\n    8610 => 'uni21A2',\n    8611 => 'uni21A3',\n    8612 => 'uni21A4',\n    8613 => 'uni21A5',\n    8614 => 'uni21A6',\n    8615 => 'uni21A7',\n    8616 => 'arrowupdnbse',\n    8617 => 'uni21A9',\n    8618 => 'uni21AA',\n    8619 => 'uni21AB',\n    8620 => 'uni21AC',\n    8621 => 'uni21AD',\n    8622 => 'uni21AE',\n    8623 => 'uni21AF',\n    8624 => 'uni21B0',\n    8625 => 'uni21B1',\n    8626 => 'uni21B2',\n    8627 => 'uni21B3',\n    8628 => 'uni21B4',\n    8629 => 'carriagereturn',\n    8630 => 'uni21B6',\n    8631 => 'uni21B7',\n    8632 => 'uni21B8',\n    8633 => 'uni21B9',\n    8634 => 'uni21BA',\n    8635 => 'uni21BB',\n    8636 => 'uni21BC',\n    8637 => 'uni21BD',\n    8638 => 'uni21BE',\n    8639 => 'uni21BF',\n    8640 => 'uni21C0',\n    8641 => 'uni21C1',\n    8642 => 'uni21C2',\n    8643 => 'uni21C3',\n    8644 => 'uni21C4',\n    8645 => 'uni21C5',\n    8646 => 'uni21C6',\n    8647 => 'uni21C7',\n    8648 => 'uni21C8',\n    8649 => 'uni21C9',\n    8650 => 'uni21CA',\n    8651 => 'uni21CB',\n    8652 => 'uni21CC',\n    8653 => 'uni21CD',\n    8654 => 'uni21CE',\n    8655 => 'uni21CF',\n    8656 => 'arrowdblleft',\n    8657 => 'arrowdblup',\n    8658 => 'arrowdblright',\n    8659 => 'arrowdbldown',\n    8660 => 'arrowdblboth',\n    8661 => 'uni21D5',\n    8662 => 'uni21D6',\n    8663 => 'uni21D7',\n    8664 => 'uni21D8',\n    8665 => 'uni21D9',\n    8666 => 'uni21DA',\n    8667 => 'uni21DB',\n    8668 => 'uni21DC',\n    8669 => 'uni21DD',\n    8670 => 'uni21DE',\n    8671 => 'uni21DF',\n    8672 => 'uni21E0',\n    8673 => 'uni21E1',\n    8674 => 'uni21E2',\n    8675 => 'uni21E3',\n    8676 => 'uni21E4',\n    8677 => 'uni21E5',\n    8678 => 'uni21E6',\n    8679 => 'uni21E7',\n    8680 => 'uni21E8',\n    8681 => 'uni21E9',\n    8682 => 'uni21EA',\n    8683 => 'uni21EB',\n    8684 => 'uni21EC',\n    8685 => 'uni21ED',\n    8686 => 'uni21EE',\n    8687 => 'uni21EF',\n    8688 => 'uni21F0',\n    8689 => 'uni21F1',\n    8690 => 'uni21F2',\n    8691 => 'uni21F3',\n    8692 => 'uni21F4',\n    8693 => 'uni21F5',\n    8694 => 'uni21F6',\n    8695 => 'uni21F7',\n    8696 => 'uni21F8',\n    8697 => 'uni21F9',\n    8698 => 'uni21FA',\n    8699 => 'uni21FB',\n    8700 => 'uni21FC',\n    8701 => 'uni21FD',\n    8702 => 'uni21FE',\n    8703 => 'uni21FF',\n    8704 => 'universal',\n    8705 => 'uni2201',\n    8706 => 'partialdiff',\n    8707 => 'existential',\n    8708 => 'uni2204',\n    8709 => 'emptyset',\n    8710 => 'increment',\n    8711 => 'gradient',\n    8712 => 'element',\n    8713 => 'notelement',\n    8714 => 'uni220A',\n    8715 => 'suchthat',\n    8716 => 'uni220C',\n    8717 => 'uni220D',\n    8718 => 'uni220E',\n    8719 => 'product',\n    8720 => 'uni2210',\n    8721 => 'summation',\n    8722 => 'minus',\n    8723 => 'uni2213',\n    8724 => 'uni2214',\n    8725 => 'uni2215',\n    8726 => 'uni2216',\n    8727 => 'asteriskmath',\n    8728 => 'uni2218',\n    8729 => 'uni2219',\n    8730 => 'radical',\n    8731 => 'uni221B',\n    8732 => 'uni221C',\n    8733 => 'proportional',\n    8734 => 'infinity',\n    8735 => 'orthogonal',\n    8736 => 'angle',\n    8737 => 'uni2221',\n    8738 => 'uni2222',\n    8739 => 'uni2223',\n    8740 => 'uni2224',\n    8741 => 'uni2225',\n    8742 => 'uni2226',\n    8743 => 'logicaland',\n    8744 => 'logicalor',\n    8745 => 'intersection',\n    8746 => 'union',\n    8747 => 'integral',\n    8748 => 'uni222C',\n    8749 => 'uni222D',\n    8750 => 'uni222E',\n    8751 => 'uni222F',\n    8752 => 'uni2230',\n    8753 => 'uni2231',\n    8754 => 'uni2232',\n    8755 => 'uni2233',\n    8756 => 'therefore',\n    8757 => 'uni2235',\n    8758 => 'uni2236',\n    8759 => 'uni2237',\n    8760 => 'uni2238',\n    8761 => 'uni2239',\n    8762 => 'uni223A',\n    8763 => 'uni223B',\n    8764 => 'similar',\n    8765 => 'uni223D',\n    8766 => 'uni223E',\n    8767 => 'uni223F',\n    8768 => 'uni2240',\n    8769 => 'uni2241',\n    8770 => 'uni2242',\n    8771 => 'uni2243',\n    8772 => 'uni2244',\n    8773 => 'congruent',\n    8774 => 'uni2246',\n    8775 => 'uni2247',\n    8776 => 'approxequal',\n    8777 => 'uni2249',\n    8778 => 'uni224A',\n    8779 => 'uni224B',\n    8780 => 'uni224C',\n    8781 => 'uni224D',\n    8782 => 'uni224E',\n    8783 => 'uni224F',\n    8784 => 'uni2250',\n    8785 => 'uni2251',\n    8786 => 'uni2252',\n    8787 => 'uni2253',\n    8788 => 'uni2254',\n    8789 => 'uni2255',\n    8790 => 'uni2256',\n    8791 => 'uni2257',\n    8792 => 'uni2258',\n    8793 => 'uni2259',\n    8794 => 'uni225A',\n    8795 => 'uni225B',\n    8796 => 'uni225C',\n    8797 => 'uni225D',\n    8798 => 'uni225E',\n    8799 => 'uni225F',\n    8800 => 'notequal',\n    8801 => 'equivalence',\n    8802 => 'uni2262',\n    8803 => 'uni2263',\n    8804 => 'lessequal',\n    8805 => 'greaterequal',\n    8806 => 'uni2266',\n    8807 => 'uni2267',\n    8808 => 'uni2268',\n    8809 => 'uni2269',\n    8810 => 'uni226A',\n    8811 => 'uni226B',\n    8812 => 'uni226C',\n    8813 => 'uni226D',\n    8814 => 'uni226E',\n    8815 => 'uni226F',\n    8816 => 'uni2270',\n    8817 => 'uni2271',\n    8818 => 'uni2272',\n    8819 => 'uni2273',\n    8820 => 'uni2274',\n    8821 => 'uni2275',\n    8822 => 'uni2276',\n    8823 => 'uni2277',\n    8824 => 'uni2278',\n    8825 => 'uni2279',\n    8826 => 'uni227A',\n    8827 => 'uni227B',\n    8828 => 'uni227C',\n    8829 => 'uni227D',\n    8830 => 'uni227E',\n    8831 => 'uni227F',\n    8832 => 'uni2280',\n    8833 => 'uni2281',\n    8834 => 'propersubset',\n    8835 => 'propersuperset',\n    8836 => 'notsubset',\n    8837 => 'uni2285',\n    8838 => 'reflexsubset',\n    8839 => 'reflexsuperset',\n    8840 => 'uni2288',\n    8841 => 'uni2289',\n    8842 => 'uni228A',\n    8843 => 'uni228B',\n    8844 => 'uni228C',\n    8845 => 'uni228D',\n    8846 => 'uni228E',\n    8847 => 'uni228F',\n    8848 => 'uni2290',\n    8849 => 'uni2291',\n    8850 => 'uni2292',\n    8851 => 'uni2293',\n    8852 => 'uni2294',\n    8853 => 'circleplus',\n    8854 => 'uni2296',\n    8855 => 'circlemultiply',\n    8856 => 'uni2298',\n    8857 => 'uni2299',\n    8858 => 'uni229A',\n    8859 => 'uni229B',\n    8860 => 'uni229C',\n    8861 => 'uni229D',\n    8862 => 'uni229E',\n    8863 => 'uni229F',\n    8864 => 'uni22A0',\n    8865 => 'uni22A1',\n    8866 => 'uni22A2',\n    8867 => 'uni22A3',\n    8868 => 'uni22A4',\n    8869 => 'perpendicular',\n    8870 => 'uni22A6',\n    8871 => 'uni22A7',\n    8872 => 'uni22A8',\n    8873 => 'uni22A9',\n    8874 => 'uni22AA',\n    8875 => 'uni22AB',\n    8876 => 'uni22AC',\n    8877 => 'uni22AD',\n    8878 => 'uni22AE',\n    8879 => 'uni22AF',\n    8880 => 'uni22B0',\n    8881 => 'uni22B1',\n    8882 => 'uni22B2',\n    8883 => 'uni22B3',\n    8884 => 'uni22B4',\n    8885 => 'uni22B5',\n    8886 => 'uni22B6',\n    8887 => 'uni22B7',\n    8888 => 'uni22B8',\n    8889 => 'uni22B9',\n    8890 => 'uni22BA',\n    8891 => 'uni22BB',\n    8892 => 'uni22BC',\n    8893 => 'uni22BD',\n    8894 => 'uni22BE',\n    8895 => 'uni22BF',\n    8896 => 'uni22C0',\n    8897 => 'uni22C1',\n    8898 => 'uni22C2',\n    8899 => 'uni22C3',\n    8900 => 'uni22C4',\n    8901 => 'dotmath',\n    8902 => 'uni22C6',\n    8903 => 'uni22C7',\n    8904 => 'uni22C8',\n    8905 => 'uni22C9',\n    8906 => 'uni22CA',\n    8907 => 'uni22CB',\n    8908 => 'uni22CC',\n    8909 => 'uni22CD',\n    8910 => 'uni22CE',\n    8911 => 'uni22CF',\n    8912 => 'uni22D0',\n    8913 => 'uni22D1',\n    8914 => 'uni22D2',\n    8915 => 'uni22D3',\n    8916 => 'uni22D4',\n    8917 => 'uni22D5',\n    8918 => 'uni22D6',\n    8919 => 'uni22D7',\n    8920 => 'uni22D8',\n    8921 => 'uni22D9',\n    8922 => 'uni22DA',\n    8923 => 'uni22DB',\n    8924 => 'uni22DC',\n    8925 => 'uni22DD',\n    8926 => 'uni22DE',\n    8927 => 'uni22DF',\n    8928 => 'uni22E0',\n    8929 => 'uni22E1',\n    8930 => 'uni22E2',\n    8931 => 'uni22E3',\n    8932 => 'uni22E4',\n    8933 => 'uni22E5',\n    8934 => 'uni22E6',\n    8935 => 'uni22E7',\n    8936 => 'uni22E8',\n    8937 => 'uni22E9',\n    8938 => 'uni22EA',\n    8939 => 'uni22EB',\n    8940 => 'uni22EC',\n    8941 => 'uni22ED',\n    8942 => 'uni22EE',\n    8943 => 'uni22EF',\n    8944 => 'uni22F0',\n    8945 => 'uni22F1',\n    8946 => 'uni22F2',\n    8947 => 'uni22F3',\n    8948 => 'uni22F4',\n    8949 => 'uni22F5',\n    8950 => 'uni22F6',\n    8951 => 'uni22F7',\n    8952 => 'uni22F8',\n    8953 => 'uni22F9',\n    8954 => 'uni22FA',\n    8955 => 'uni22FB',\n    8956 => 'uni22FC',\n    8957 => 'uni22FD',\n    8958 => 'uni22FE',\n    8959 => 'uni22FF',\n    8960 => 'uni2300',\n    8961 => 'uni2301',\n    8962 => 'house',\n    8963 => 'uni2303',\n    8964 => 'uni2304',\n    8965 => 'uni2305',\n    8966 => 'uni2306',\n    8967 => 'uni2307',\n    8968 => 'uni2308',\n    8969 => 'uni2309',\n    8970 => 'uni230A',\n    8971 => 'uni230B',\n    8972 => 'uni230C',\n    8973 => 'uni230D',\n    8974 => 'uni230E',\n    8975 => 'uni230F',\n    8976 => 'revlogicalnot',\n    8977 => 'uni2311',\n    8984 => 'uni2318',\n    8985 => 'uni2319',\n    8988 => 'uni231C',\n    8989 => 'uni231D',\n    8990 => 'uni231E',\n    8991 => 'uni231F',\n    8992 => 'integraltp',\n    8993 => 'integralbt',\n    8996 => 'uni2324',\n    8997 => 'uni2325',\n    8998 => 'uni2326',\n    8999 => 'uni2327',\n    9000 => 'uni2328',\n    9003 => 'uni232B',\n    9004 => 'uni232C',\n    9075 => 'uni2373',\n    9076 => 'uni2374',\n    9077 => 'uni2375',\n    9082 => 'uni237A',\n    9085 => 'uni237D',\n    9095 => 'uni2387',\n    9108 => 'uni2394',\n    9115 => 'uni239B',\n    9116 => 'uni239C',\n    9117 => 'uni239D',\n    9118 => 'uni239E',\n    9119 => 'uni239F',\n    9120 => 'uni23A0',\n    9121 => 'uni23A1',\n    9122 => 'uni23A2',\n    9123 => 'uni23A3',\n    9124 => 'uni23A4',\n    9125 => 'uni23A5',\n    9126 => 'uni23A6',\n    9127 => 'uni23A7',\n    9128 => 'uni23A8',\n    9129 => 'uni23A9',\n    9130 => 'uni23AA',\n    9131 => 'uni23AB',\n    9132 => 'uni23AC',\n    9133 => 'uni23AD',\n    9134 => 'uni23AE',\n    9166 => 'uni23CE',\n    9167 => 'uni23CF',\n    9187 => 'uni23E3',\n    9189 => 'uni23E5',\n    9192 => 'uni23E8',\n    9250 => 'uni2422',\n    9251 => 'uni2423',\n    9312 => 'uni2460',\n    9313 => 'uni2461',\n    9314 => 'uni2462',\n    9315 => 'uni2463',\n    9316 => 'uni2464',\n    9317 => 'uni2465',\n    9318 => 'uni2466',\n    9319 => 'uni2467',\n    9320 => 'uni2468',\n    9321 => 'uni2469',\n    9472 => 'SF100000',\n    9473 => 'uni2501',\n    9474 => 'SF110000',\n    9475 => 'uni2503',\n    9476 => 'uni2504',\n    9477 => 'uni2505',\n    9478 => 'uni2506',\n    9479 => 'uni2507',\n    9480 => 'uni2508',\n    9481 => 'uni2509',\n    9482 => 'uni250A',\n    9483 => 'uni250B',\n    9484 => 'SF010000',\n    9485 => 'uni250D',\n    9486 => 'uni250E',\n    9487 => 'uni250F',\n    9488 => 'SF030000',\n    9489 => 'uni2511',\n    9490 => 'uni2512',\n    9491 => 'uni2513',\n    9492 => 'SF020000',\n    9493 => 'uni2515',\n    9494 => 'uni2516',\n    9495 => 'uni2517',\n    9496 => 'SF040000',\n    9497 => 'uni2519',\n    9498 => 'uni251A',\n    9499 => 'uni251B',\n    9500 => 'SF080000',\n    9501 => 'uni251D',\n    9502 => 'uni251E',\n    9503 => 'uni251F',\n    9504 => 'uni2520',\n    9505 => 'uni2521',\n    9506 => 'uni2522',\n    9507 => 'uni2523',\n    9508 => 'SF090000',\n    9509 => 'uni2525',\n    9510 => 'uni2526',\n    9511 => 'uni2527',\n    9512 => 'uni2528',\n    9513 => 'uni2529',\n    9514 => 'uni252A',\n    9515 => 'uni252B',\n    9516 => 'SF060000',\n    9517 => 'uni252D',\n    9518 => 'uni252E',\n    9519 => 'uni252F',\n    9520 => 'uni2530',\n    9521 => 'uni2531',\n    9522 => 'uni2532',\n    9523 => 'uni2533',\n    9524 => 'SF070000',\n    9525 => 'uni2535',\n    9526 => 'uni2536',\n    9527 => 'uni2537',\n    9528 => 'uni2538',\n    9529 => 'uni2539',\n    9530 => 'uni253A',\n    9531 => 'uni253B',\n    9532 => 'SF050000',\n    9533 => 'uni253D',\n    9534 => 'uni253E',\n    9535 => 'uni253F',\n    9536 => 'uni2540',\n    9537 => 'uni2541',\n    9538 => 'uni2542',\n    9539 => 'uni2543',\n    9540 => 'uni2544',\n    9541 => 'uni2545',\n    9542 => 'uni2546',\n    9543 => 'uni2547',\n    9544 => 'uni2548',\n    9545 => 'uni2549',\n    9546 => 'uni254A',\n    9547 => 'uni254B',\n    9548 => 'uni254C',\n    9549 => 'uni254D',\n    9550 => 'uni254E',\n    9551 => 'uni254F',\n    9552 => 'SF430000',\n    9553 => 'SF240000',\n    9554 => 'SF510000',\n    9555 => 'SF520000',\n    9556 => 'SF390000',\n    9557 => 'SF220000',\n    9558 => 'SF210000',\n    9559 => 'SF250000',\n    9560 => 'SF500000',\n    9561 => 'SF490000',\n    9562 => 'SF380000',\n    9563 => 'SF280000',\n    9564 => 'SF270000',\n    9565 => 'SF260000',\n    9566 => 'SF360000',\n    9567 => 'SF370000',\n    9568 => 'SF420000',\n    9569 => 'SF190000',\n    9570 => 'SF200000',\n    9571 => 'SF230000',\n    9572 => 'SF470000',\n    9573 => 'SF480000',\n    9574 => 'SF410000',\n    9575 => 'SF450000',\n    9576 => 'SF460000',\n    9577 => 'SF400000',\n    9578 => 'SF540000',\n    9579 => 'SF530000',\n    9580 => 'SF440000',\n    9581 => 'uni256D',\n    9582 => 'uni256E',\n    9583 => 'uni256F',\n    9584 => 'uni2570',\n    9585 => 'uni2571',\n    9586 => 'uni2572',\n    9587 => 'uni2573',\n    9588 => 'uni2574',\n    9589 => 'uni2575',\n    9590 => 'uni2576',\n    9591 => 'uni2577',\n    9592 => 'uni2578',\n    9593 => 'uni2579',\n    9594 => 'uni257A',\n    9595 => 'uni257B',\n    9596 => 'uni257C',\n    9597 => 'uni257D',\n    9598 => 'uni257E',\n    9599 => 'uni257F',\n    9600 => 'upblock',\n    9601 => 'uni2581',\n    9602 => 'uni2582',\n    9603 => 'uni2583',\n    9604 => 'dnblock',\n    9605 => 'uni2585',\n    9606 => 'uni2586',\n    9607 => 'uni2587',\n    9608 => 'block',\n    9609 => 'uni2589',\n    9610 => 'uni258A',\n    9611 => 'uni258B',\n    9612 => 'lfblock',\n    9613 => 'uni258D',\n    9614 => 'uni258E',\n    9615 => 'uni258F',\n    9616 => 'rtblock',\n    9617 => 'ltshade',\n    9618 => 'shade',\n    9619 => 'dkshade',\n    9620 => 'uni2594',\n    9621 => 'uni2595',\n    9622 => 'uni2596',\n    9623 => 'uni2597',\n    9624 => 'uni2598',\n    9625 => 'uni2599',\n    9626 => 'uni259A',\n    9627 => 'uni259B',\n    9628 => 'uni259C',\n    9629 => 'uni259D',\n    9630 => 'uni259E',\n    9631 => 'uni259F',\n    9632 => 'filledbox',\n    9633 => 'H22073',\n    9634 => 'uni25A2',\n    9635 => 'uni25A3',\n    9636 => 'uni25A4',\n    9637 => 'uni25A5',\n    9638 => 'uni25A6',\n    9639 => 'uni25A7',\n    9640 => 'uni25A8',\n    9641 => 'uni25A9',\n    9642 => 'H18543',\n    9643 => 'H18551',\n    9644 => 'filledrect',\n    9645 => 'uni25AD',\n    9646 => 'uni25AE',\n    9647 => 'uni25AF',\n    9648 => 'uni25B0',\n    9649 => 'uni25B1',\n    9650 => 'triagup',\n    9651 => 'uni25B3',\n    9652 => 'uni25B4',\n    9653 => 'uni25B5',\n    9654 => 'uni25B6',\n    9655 => 'uni25B7',\n    9656 => 'uni25B8',\n    9657 => 'uni25B9',\n    9658 => 'triagrt',\n    9659 => 'uni25BB',\n    9660 => 'triagdn',\n    9661 => 'uni25BD',\n    9662 => 'uni25BE',\n    9663 => 'uni25BF',\n    9664 => 'uni25C0',\n    9665 => 'uni25C1',\n    9666 => 'uni25C2',\n    9667 => 'uni25C3',\n    9668 => 'triaglf',\n    9669 => 'uni25C5',\n    9670 => 'uni25C6',\n    9671 => 'uni25C7',\n    9672 => 'uni25C8',\n    9673 => 'uni25C9',\n    9674 => 'lozenge',\n    9675 => 'circle',\n    9676 => 'uni25CC',\n    9677 => 'uni25CD',\n    9678 => 'uni25CE',\n    9679 => 'H18533',\n    9680 => 'uni25D0',\n    9681 => 'uni25D1',\n    9682 => 'uni25D2',\n    9683 => 'uni25D3',\n    9684 => 'uni25D4',\n    9685 => 'uni25D5',\n    9686 => 'uni25D6',\n    9687 => 'uni25D7',\n    9688 => 'invbullet',\n    9689 => 'invcircle',\n    9690 => 'uni25DA',\n    9691 => 'uni25DB',\n    9692 => 'uni25DC',\n    9693 => 'uni25DD',\n    9694 => 'uni25DE',\n    9695 => 'uni25DF',\n    9696 => 'uni25E0',\n    9697 => 'uni25E1',\n    9698 => 'uni25E2',\n    9699 => 'uni25E3',\n    9700 => 'uni25E4',\n    9701 => 'uni25E5',\n    9702 => 'openbullet',\n    9703 => 'uni25E7',\n    9704 => 'uni25E8',\n    9705 => 'uni25E9',\n    9706 => 'uni25EA',\n    9707 => 'uni25EB',\n    9708 => 'uni25EC',\n    9709 => 'uni25ED',\n    9710 => 'uni25EE',\n    9711 => 'uni25EF',\n    9712 => 'uni25F0',\n    9713 => 'uni25F1',\n    9714 => 'uni25F2',\n    9715 => 'uni25F3',\n    9716 => 'uni25F4',\n    9717 => 'uni25F5',\n    9718 => 'uni25F6',\n    9719 => 'uni25F7',\n    9720 => 'uni25F8',\n    9721 => 'uni25F9',\n    9722 => 'uni25FA',\n    9723 => 'uni25FB',\n    9724 => 'uni25FC',\n    9725 => 'uni25FD',\n    9726 => 'uni25FE',\n    9727 => 'uni25FF',\n    9728 => 'uni2600',\n    9729 => 'uni2601',\n    9730 => 'uni2602',\n    9731 => 'uni2603',\n    9732 => 'uni2604',\n    9733 => 'uni2605',\n    9734 => 'uni2606',\n    9735 => 'uni2607',\n    9736 => 'uni2608',\n    9737 => 'uni2609',\n    9738 => 'uni260A',\n    9739 => 'uni260B',\n    9740 => 'uni260C',\n    9741 => 'uni260D',\n    9742 => 'uni260E',\n    9743 => 'uni260F',\n    9744 => 'uni2610',\n    9745 => 'uni2611',\n    9746 => 'uni2612',\n    9747 => 'uni2613',\n    9748 => 'uni2614',\n    9749 => 'uni2615',\n    9750 => 'uni2616',\n    9751 => 'uni2617',\n    9752 => 'uni2618',\n    9753 => 'uni2619',\n    9754 => 'uni261A',\n    9755 => 'uni261B',\n    9756 => 'uni261C',\n    9757 => 'uni261D',\n    9758 => 'uni261E',\n    9759 => 'uni261F',\n    9760 => 'uni2620',\n    9761 => 'uni2621',\n    9762 => 'uni2622',\n    9763 => 'uni2623',\n    9764 => 'uni2624',\n    9765 => 'uni2625',\n    9766 => 'uni2626',\n    9767 => 'uni2627',\n    9768 => 'uni2628',\n    9769 => 'uni2629',\n    9770 => 'uni262A',\n    9771 => 'uni262B',\n    9772 => 'uni262C',\n    9773 => 'uni262D',\n    9774 => 'uni262E',\n    9775 => 'uni262F',\n    9776 => 'uni2630',\n    9777 => 'uni2631',\n    9778 => 'uni2632',\n    9779 => 'uni2633',\n    9780 => 'uni2634',\n    9781 => 'uni2635',\n    9782 => 'uni2636',\n    9783 => 'uni2637',\n    9784 => 'uni2638',\n    9785 => 'uni2639',\n    9786 => 'smileface',\n    9787 => 'invsmileface',\n    9788 => 'sun',\n    9789 => 'uni263D',\n    9790 => 'uni263E',\n    9791 => 'uni263F',\n    9792 => 'female',\n    9793 => 'uni2641',\n    9794 => 'male',\n    9795 => 'uni2643',\n    9796 => 'uni2644',\n    9797 => 'uni2645',\n    9798 => 'uni2646',\n    9799 => 'uni2647',\n    9800 => 'uni2648',\n    9801 => 'uni2649',\n    9802 => 'uni264A',\n    9803 => 'uni264B',\n    9804 => 'uni264C',\n    9805 => 'uni264D',\n    9806 => 'uni264E',\n    9807 => 'uni264F',\n    9808 => 'uni2650',\n    9809 => 'uni2651',\n    9810 => 'uni2652',\n    9811 => 'uni2653',\n    9812 => 'uni2654',\n    9813 => 'uni2655',\n    9814 => 'uni2656',\n    9815 => 'uni2657',\n    9816 => 'uni2658',\n    9817 => 'uni2659',\n    9818 => 'uni265A',\n    9819 => 'uni265B',\n    9820 => 'uni265C',\n    9821 => 'uni265D',\n    9822 => 'uni265E',\n    9823 => 'uni265F',\n    9824 => 'spade',\n    9825 => 'uni2661',\n    9826 => 'uni2662',\n    9827 => 'club',\n    9828 => 'uni2664',\n    9829 => 'heart',\n    9830 => 'diamond',\n    9831 => 'uni2667',\n    9832 => 'uni2668',\n    9833 => 'uni2669',\n    9834 => 'musicalnote',\n    9835 => 'musicalnotedbl',\n    9836 => 'uni266C',\n    9837 => 'uni266D',\n    9838 => 'uni266E',\n    9839 => 'uni266F',\n    9840 => 'uni2670',\n    9841 => 'uni2671',\n    9842 => 'uni2672',\n    9843 => 'uni2673',\n    9844 => 'uni2674',\n    9845 => 'uni2675',\n    9846 => 'uni2676',\n    9847 => 'uni2677',\n    9848 => 'uni2678',\n    9849 => 'uni2679',\n    9850 => 'uni267A',\n    9851 => 'uni267B',\n    9852 => 'uni267C',\n    9853 => 'uni267D',\n    9854 => 'uni267E',\n    9855 => 'uni267F',\n    9856 => 'uni2680',\n    9857 => 'uni2681',\n    9858 => 'uni2682',\n    9859 => 'uni2683',\n    9860 => 'uni2684',\n    9861 => 'uni2685',\n    9862 => 'uni2686',\n    9863 => 'uni2687',\n    9864 => 'uni2688',\n    9865 => 'uni2689',\n    9866 => 'uni268A',\n    9867 => 'uni268B',\n    9868 => 'uni268C',\n    9869 => 'uni268D',\n    9870 => 'uni268E',\n    9871 => 'uni268F',\n    9872 => 'uni2690',\n    9873 => 'uni2691',\n    9874 => 'uni2692',\n    9875 => 'uni2693',\n    9876 => 'uni2694',\n    9877 => 'uni2695',\n    9878 => 'uni2696',\n    9879 => 'uni2697',\n    9880 => 'uni2698',\n    9881 => 'uni2699',\n    9882 => 'uni269A',\n    9883 => 'uni269B',\n    9884 => 'uni269C',\n    9886 => 'uni269E',\n    9887 => 'uni269F',\n    9888 => 'uni26A0',\n    9889 => 'uni26A1',\n    9890 => 'uni26A2',\n    9891 => 'uni26A3',\n    9892 => 'uni26A4',\n    9893 => 'uni26A5',\n    9894 => 'uni26A6',\n    9895 => 'uni26A7',\n    9896 => 'uni26A8',\n    9897 => 'uni26A9',\n    9898 => 'uni26AA',\n    9899 => 'uni26AB',\n    9900 => 'uni26AC',\n    9901 => 'uni26AD',\n    9902 => 'uni26AE',\n    9903 => 'uni26AF',\n    9904 => 'uni26B0',\n    9905 => 'uni26B1',\n    9906 => 'uni26B2',\n    9907 => 'uni26B3',\n    9908 => 'uni26B4',\n    9909 => 'uni26B5',\n    9910 => 'uni26B6',\n    9911 => 'uni26B7',\n    9912 => 'uni26B8',\n    9920 => 'uni26C0',\n    9921 => 'uni26C1',\n    9922 => 'uni26C2',\n    9923 => 'uni26C3',\n    9954 => 'uni26E2',\n    9985 => 'uni2701',\n    9986 => 'uni2702',\n    9987 => 'uni2703',\n    9988 => 'uni2704',\n    9990 => 'uni2706',\n    9991 => 'uni2707',\n    9992 => 'uni2708',\n    9993 => 'uni2709',\n    9996 => 'uni270C',\n    9997 => 'uni270D',\n    9998 => 'uni270E',\n    9999 => 'uni270F',\n    10000 => 'uni2710',\n    10001 => 'uni2711',\n    10002 => 'uni2712',\n    10003 => 'uni2713',\n    10004 => 'uni2714',\n    10005 => 'uni2715',\n    10006 => 'uni2716',\n    10007 => 'uni2717',\n    10008 => 'uni2718',\n    10009 => 'uni2719',\n    10010 => 'uni271A',\n    10011 => 'uni271B',\n    10012 => 'uni271C',\n    10013 => 'uni271D',\n    10014 => 'uni271E',\n    10015 => 'uni271F',\n    10016 => 'uni2720',\n    10017 => 'uni2721',\n    10018 => 'uni2722',\n    10019 => 'uni2723',\n    10020 => 'uni2724',\n    10021 => 'uni2725',\n    10022 => 'uni2726',\n    10023 => 'uni2727',\n    10025 => 'uni2729',\n    10026 => 'uni272A',\n    10027 => 'uni272B',\n    10028 => 'uni272C',\n    10029 => 'uni272D',\n    10030 => 'uni272E',\n    10031 => 'uni272F',\n    10032 => 'uni2730',\n    10033 => 'uni2731',\n    10034 => 'uni2732',\n    10035 => 'uni2733',\n    10036 => 'uni2734',\n    10037 => 'uni2735',\n    10038 => 'uni2736',\n    10039 => 'uni2737',\n    10040 => 'uni2738',\n    10041 => 'uni2739',\n    10042 => 'uni273A',\n    10043 => 'uni273B',\n    10044 => 'uni273C',\n    10045 => 'uni273D',\n    10046 => 'uni273E',\n    10047 => 'uni273F',\n    10048 => 'uni2740',\n    10049 => 'uni2741',\n    10050 => 'uni2742',\n    10051 => 'uni2743',\n    10052 => 'uni2744',\n    10053 => 'uni2745',\n    10054 => 'uni2746',\n    10055 => 'uni2747',\n    10056 => 'uni2748',\n    10057 => 'uni2749',\n    10058 => 'uni274A',\n    10059 => 'uni274B',\n    10061 => 'uni274D',\n    10063 => 'uni274F',\n    10064 => 'uni2750',\n    10065 => 'uni2751',\n    10066 => 'uni2752',\n    10070 => 'uni2756',\n    10072 => 'uni2758',\n    10073 => 'uni2759',\n    10074 => 'uni275A',\n    10075 => 'uni275B',\n    10076 => 'uni275C',\n    10077 => 'uni275D',\n    10078 => 'uni275E',\n    10081 => 'uni2761',\n    10082 => 'uni2762',\n    10083 => 'uni2763',\n    10084 => 'uni2764',\n    10085 => 'uni2765',\n    10086 => 'uni2766',\n    10087 => 'uni2767',\n    10088 => 'uni2768',\n    10089 => 'uni2769',\n    10090 => 'uni276A',\n    10091 => 'uni276B',\n    10092 => 'uni276C',\n    10093 => 'uni276D',\n    10094 => 'uni276E',\n    10095 => 'uni276F',\n    10096 => 'uni2770',\n    10097 => 'uni2771',\n    10098 => 'uni2772',\n    10099 => 'uni2773',\n    10100 => 'uni2774',\n    10101 => 'uni2775',\n    10102 => 'uni2776',\n    10103 => 'uni2777',\n    10104 => 'uni2778',\n    10105 => 'uni2779',\n    10106 => 'uni277A',\n    10107 => 'uni277B',\n    10108 => 'uni277C',\n    10109 => 'uni277D',\n    10110 => 'uni277E',\n    10111 => 'uni277F',\n    10112 => 'uni2780',\n    10113 => 'uni2781',\n    10114 => 'uni2782',\n    10115 => 'uni2783',\n    10116 => 'uni2784',\n    10117 => 'uni2785',\n    10118 => 'uni2786',\n    10119 => 'uni2787',\n    10120 => 'uni2788',\n    10121 => 'uni2789',\n    10122 => 'uni278A',\n    10123 => 'uni278B',\n    10124 => 'uni278C',\n    10125 => 'uni278D',\n    10126 => 'uni278E',\n    10127 => 'uni278F',\n    10128 => 'uni2790',\n    10129 => 'uni2791',\n    10130 => 'uni2792',\n    10131 => 'uni2793',\n    10132 => 'uni2794',\n    10136 => 'uni2798',\n    10137 => 'uni2799',\n    10138 => 'uni279A',\n    10139 => 'uni279B',\n    10140 => 'uni279C',\n    10141 => 'uni279D',\n    10142 => 'uni279E',\n    10143 => 'uni279F',\n    10144 => 'uni27A0',\n    10145 => 'uni27A1',\n    10146 => 'uni27A2',\n    10147 => 'uni27A3',\n    10148 => 'uni27A4',\n    10149 => 'uni27A5',\n    10150 => 'uni27A6',\n    10151 => 'uni27A7',\n    10152 => 'uni27A8',\n    10153 => 'uni27A9',\n    10154 => 'uni27AA',\n    10155 => 'uni27AB',\n    10156 => 'uni27AC',\n    10157 => 'uni27AD',\n    10158 => 'uni27AE',\n    10159 => 'uni27AF',\n    10161 => 'uni27B1',\n    10162 => 'uni27B2',\n    10163 => 'uni27B3',\n    10164 => 'uni27B4',\n    10165 => 'uni27B5',\n    10166 => 'uni27B6',\n    10167 => 'uni27B7',\n    10168 => 'uni27B8',\n    10169 => 'uni27B9',\n    10170 => 'uni27BA',\n    10171 => 'uni27BB',\n    10172 => 'uni27BC',\n    10173 => 'uni27BD',\n    10174 => 'uni27BE',\n    10181 => 'uni27C5',\n    10182 => 'uni27C6',\n    10208 => 'uni27E0',\n    10214 => 'uni27E6',\n    10215 => 'uni27E7',\n    10216 => 'uni27E8',\n    10217 => 'uni27E9',\n    10218 => 'uni27EA',\n    10219 => 'uni27EB',\n    10224 => 'uni27F0',\n    10225 => 'uni27F1',\n    10226 => 'uni27F2',\n    10227 => 'uni27F3',\n    10228 => 'uni27F4',\n    10229 => 'uni27F5',\n    10230 => 'uni27F6',\n    10231 => 'uni27F7',\n    10232 => 'uni27F8',\n    10233 => 'uni27F9',\n    10234 => 'uni27FA',\n    10235 => 'uni27FB',\n    10236 => 'uni27FC',\n    10237 => 'uni27FD',\n    10238 => 'uni27FE',\n    10239 => 'uni27FF',\n    10240 => 'uni2800',\n    10241 => 'uni2801',\n    10242 => 'uni2802',\n    10243 => 'uni2803',\n    10244 => 'uni2804',\n    10245 => 'uni2805',\n    10246 => 'uni2806',\n    10247 => 'uni2807',\n    10248 => 'uni2808',\n    10249 => 'uni2809',\n    10250 => 'uni280A',\n    10251 => 'uni280B',\n    10252 => 'uni280C',\n    10253 => 'uni280D',\n    10254 => 'uni280E',\n    10255 => 'uni280F',\n    10256 => 'uni2810',\n    10257 => 'uni2811',\n    10258 => 'uni2812',\n    10259 => 'uni2813',\n    10260 => 'uni2814',\n    10261 => 'uni2815',\n    10262 => 'uni2816',\n    10263 => 'uni2817',\n    10264 => 'uni2818',\n    10265 => 'uni2819',\n    10266 => 'uni281A',\n    10267 => 'uni281B',\n    10268 => 'uni281C',\n    10269 => 'uni281D',\n    10270 => 'uni281E',\n    10271 => 'uni281F',\n    10272 => 'uni2820',\n    10273 => 'uni2821',\n    10274 => 'uni2822',\n    10275 => 'uni2823',\n    10276 => 'uni2824',\n    10277 => 'uni2825',\n    10278 => 'uni2826',\n    10279 => 'uni2827',\n    10280 => 'uni2828',\n    10281 => 'uni2829',\n    10282 => 'uni282A',\n    10283 => 'uni282B',\n    10284 => 'uni282C',\n    10285 => 'uni282D',\n    10286 => 'uni282E',\n    10287 => 'uni282F',\n    10288 => 'uni2830',\n    10289 => 'uni2831',\n    10290 => 'uni2832',\n    10291 => 'uni2833',\n    10292 => 'uni2834',\n    10293 => 'uni2835',\n    10294 => 'uni2836',\n    10295 => 'uni2837',\n    10296 => 'uni2838',\n    10297 => 'uni2839',\n    10298 => 'uni283A',\n    10299 => 'uni283B',\n    10300 => 'uni283C',\n    10301 => 'uni283D',\n    10302 => 'uni283E',\n    10303 => 'uni283F',\n    10304 => 'uni2840',\n    10305 => 'uni2841',\n    10306 => 'uni2842',\n    10307 => 'uni2843',\n    10308 => 'uni2844',\n    10309 => 'uni2845',\n    10310 => 'uni2846',\n    10311 => 'uni2847',\n    10312 => 'uni2848',\n    10313 => 'uni2849',\n    10314 => 'uni284A',\n    10315 => 'uni284B',\n    10316 => 'uni284C',\n    10317 => 'uni284D',\n    10318 => 'uni284E',\n    10319 => 'uni284F',\n    10320 => 'uni2850',\n    10321 => 'uni2851',\n    10322 => 'uni2852',\n    10323 => 'uni2853',\n    10324 => 'uni2854',\n    10325 => 'uni2855',\n    10326 => 'uni2856',\n    10327 => 'uni2857',\n    10328 => 'uni2858',\n    10329 => 'uni2859',\n    10330 => 'uni285A',\n    10331 => 'uni285B',\n    10332 => 'uni285C',\n    10333 => 'uni285D',\n    10334 => 'uni285E',\n    10335 => 'uni285F',\n    10336 => 'uni2860',\n    10337 => 'uni2861',\n    10338 => 'uni2862',\n    10339 => 'uni2863',\n    10340 => 'uni2864',\n    10341 => 'uni2865',\n    10342 => 'uni2866',\n    10343 => 'uni2867',\n    10344 => 'uni2868',\n    10345 => 'uni2869',\n    10346 => 'uni286A',\n    10347 => 'uni286B',\n    10348 => 'uni286C',\n    10349 => 'uni286D',\n    10350 => 'uni286E',\n    10351 => 'uni286F',\n    10352 => 'uni2870',\n    10353 => 'uni2871',\n    10354 => 'uni2872',\n    10355 => 'uni2873',\n    10356 => 'uni2874',\n    10357 => 'uni2875',\n    10358 => 'uni2876',\n    10359 => 'uni2877',\n    10360 => 'uni2878',\n    10361 => 'uni2879',\n    10362 => 'uni287A',\n    10363 => 'uni287B',\n    10364 => 'uni287C',\n    10365 => 'uni287D',\n    10366 => 'uni287E',\n    10367 => 'uni287F',\n    10368 => 'uni2880',\n    10369 => 'uni2881',\n    10370 => 'uni2882',\n    10371 => 'uni2883',\n    10372 => 'uni2884',\n    10373 => 'uni2885',\n    10374 => 'uni2886',\n    10375 => 'uni2887',\n    10376 => 'uni2888',\n    10377 => 'uni2889',\n    10378 => 'uni288A',\n    10379 => 'uni288B',\n    10380 => 'uni288C',\n    10381 => 'uni288D',\n    10382 => 'uni288E',\n    10383 => 'uni288F',\n    10384 => 'uni2890',\n    10385 => 'uni2891',\n    10386 => 'uni2892',\n    10387 => 'uni2893',\n    10388 => 'uni2894',\n    10389 => 'uni2895',\n    10390 => 'uni2896',\n    10391 => 'uni2897',\n    10392 => 'uni2898',\n    10393 => 'uni2899',\n    10394 => 'uni289A',\n    10395 => 'uni289B',\n    10396 => 'uni289C',\n    10397 => 'uni289D',\n    10398 => 'uni289E',\n    10399 => 'uni289F',\n    10400 => 'uni28A0',\n    10401 => 'uni28A1',\n    10402 => 'uni28A2',\n    10403 => 'uni28A3',\n    10404 => 'uni28A4',\n    10405 => 'uni28A5',\n    10406 => 'uni28A6',\n    10407 => 'uni28A7',\n    10408 => 'uni28A8',\n    10409 => 'uni28A9',\n    10410 => 'uni28AA',\n    10411 => 'uni28AB',\n    10412 => 'uni28AC',\n    10413 => 'uni28AD',\n    10414 => 'uni28AE',\n    10415 => 'uni28AF',\n    10416 => 'uni28B0',\n    10417 => 'uni28B1',\n    10418 => 'uni28B2',\n    10419 => 'uni28B3',\n    10420 => 'uni28B4',\n    10421 => 'uni28B5',\n    10422 => 'uni28B6',\n    10423 => 'uni28B7',\n    10424 => 'uni28B8',\n    10425 => 'uni28B9',\n    10426 => 'uni28BA',\n    10427 => 'uni28BB',\n    10428 => 'uni28BC',\n    10429 => 'uni28BD',\n    10430 => 'uni28BE',\n    10431 => 'uni28BF',\n    10432 => 'uni28C0',\n    10433 => 'uni28C1',\n    10434 => 'uni28C2',\n    10435 => 'uni28C3',\n    10436 => 'uni28C4',\n    10437 => 'uni28C5',\n    10438 => 'uni28C6',\n    10439 => 'uni28C7',\n    10440 => 'uni28C8',\n    10441 => 'uni28C9',\n    10442 => 'uni28CA',\n    10443 => 'uni28CB',\n    10444 => 'uni28CC',\n    10445 => 'uni28CD',\n    10446 => 'uni28CE',\n    10447 => 'uni28CF',\n    10448 => 'uni28D0',\n    10449 => 'uni28D1',\n    10450 => 'uni28D2',\n    10451 => 'uni28D3',\n    10452 => 'uni28D4',\n    10453 => 'uni28D5',\n    10454 => 'uni28D6',\n    10455 => 'uni28D7',\n    10456 => 'uni28D8',\n    10457 => 'uni28D9',\n    10458 => 'uni28DA',\n    10459 => 'uni28DB',\n    10460 => 'uni28DC',\n    10461 => 'uni28DD',\n    10462 => 'uni28DE',\n    10463 => 'uni28DF',\n    10464 => 'uni28E0',\n    10465 => 'uni28E1',\n    10466 => 'uni28E2',\n    10467 => 'uni28E3',\n    10468 => 'uni28E4',\n    10469 => 'uni28E5',\n    10470 => 'uni28E6',\n    10471 => 'uni28E7',\n    10472 => 'uni28E8',\n    10473 => 'uni28E9',\n    10474 => 'uni28EA',\n    10475 => 'uni28EB',\n    10476 => 'uni28EC',\n    10477 => 'uni28ED',\n    10478 => 'uni28EE',\n    10479 => 'uni28EF',\n    10480 => 'uni28F0',\n    10481 => 'uni28F1',\n    10482 => 'uni28F2',\n    10483 => 'uni28F3',\n    10484 => 'uni28F4',\n    10485 => 'uni28F5',\n    10486 => 'uni28F6',\n    10487 => 'uni28F7',\n    10488 => 'uni28F8',\n    10489 => 'uni28F9',\n    10490 => 'uni28FA',\n    10491 => 'uni28FB',\n    10492 => 'uni28FC',\n    10493 => 'uni28FD',\n    10494 => 'uni28FE',\n    10495 => 'uni28FF',\n    10502 => 'uni2906',\n    10503 => 'uni2907',\n    10506 => 'uni290A',\n    10507 => 'uni290B',\n    10560 => 'uni2940',\n    10561 => 'uni2941',\n    10627 => 'uni2983',\n    10628 => 'uni2984',\n    10702 => 'uni29CE',\n    10703 => 'uni29CF',\n    10704 => 'uni29D0',\n    10705 => 'uni29D1',\n    10706 => 'uni29D2',\n    10707 => 'uni29D3',\n    10708 => 'uni29D4',\n    10709 => 'uni29D5',\n    10731 => 'uni29EB',\n    10746 => 'uni29FA',\n    10747 => 'uni29FB',\n    10752 => 'uni2A00',\n    10753 => 'uni2A01',\n    10754 => 'uni2A02',\n    10764 => 'uni2A0C',\n    10765 => 'uni2A0D',\n    10766 => 'uni2A0E',\n    10767 => 'uni2A0F',\n    10768 => 'uni2A10',\n    10769 => 'uni2A11',\n    10770 => 'uni2A12',\n    10771 => 'uni2A13',\n    10772 => 'uni2A14',\n    10773 => 'uni2A15',\n    10774 => 'uni2A16',\n    10775 => 'uni2A17',\n    10776 => 'uni2A18',\n    10777 => 'uni2A19',\n    10778 => 'uni2A1A',\n    10779 => 'uni2A1B',\n    10780 => 'uni2A1C',\n    10799 => 'uni2A2F',\n    10858 => 'uni2A6A',\n    10859 => 'uni2A6B',\n    10877 => 'uni2A7D',\n    10878 => 'uni2A7E',\n    10879 => 'uni2A7F',\n    10880 => 'uni2A80',\n    10881 => 'uni2A81',\n    10882 => 'uni2A82',\n    10883 => 'uni2A83',\n    10884 => 'uni2A84',\n    10885 => 'uni2A85',\n    10886 => 'uni2A86',\n    10887 => 'uni2A87',\n    10888 => 'uni2A88',\n    10889 => 'uni2A89',\n    10890 => 'uni2A8A',\n    10891 => 'uni2A8B',\n    10892 => 'uni2A8C',\n    10893 => 'uni2A8D',\n    10894 => 'uni2A8E',\n    10895 => 'uni2A8F',\n    10896 => 'uni2A90',\n    10897 => 'uni2A91',\n    10898 => 'uni2A92',\n    10899 => 'uni2A93',\n    10900 => 'uni2A94',\n    10901 => 'uni2A95',\n    10902 => 'uni2A96',\n    10903 => 'uni2A97',\n    10904 => 'uni2A98',\n    10905 => 'uni2A99',\n    10906 => 'uni2A9A',\n    10907 => 'uni2A9B',\n    10908 => 'uni2A9C',\n    10909 => 'uni2A9D',\n    10910 => 'uni2A9E',\n    10911 => 'uni2A9F',\n    10912 => 'uni2AA0',\n    10926 => 'uni2AAE',\n    10927 => 'uni2AAF',\n    10928 => 'uni2AB0',\n    10929 => 'uni2AB1',\n    10930 => 'uni2AB2',\n    10931 => 'uni2AB3',\n    10932 => 'uni2AB4',\n    10933 => 'uni2AB5',\n    10934 => 'uni2AB6',\n    10935 => 'uni2AB7',\n    10936 => 'uni2AB8',\n    10937 => 'uni2AB9',\n    10938 => 'uni2ABA',\n    11001 => 'uni2AF9',\n    11002 => 'uni2AFA',\n    11008 => 'uni2B00',\n    11009 => 'uni2B01',\n    11010 => 'uni2B02',\n    11011 => 'uni2B03',\n    11012 => 'uni2B04',\n    11013 => 'uni2B05',\n    11014 => 'uni2B06',\n    11015 => 'uni2B07',\n    11016 => 'uni2B08',\n    11017 => 'uni2B09',\n    11018 => 'uni2B0A',\n    11019 => 'uni2B0B',\n    11020 => 'uni2B0C',\n    11021 => 'uni2B0D',\n    11022 => 'uni2B0E',\n    11023 => 'uni2B0F',\n    11024 => 'uni2B10',\n    11025 => 'uni2B11',\n    11026 => 'uni2B12',\n    11027 => 'uni2B13',\n    11028 => 'uni2B14',\n    11029 => 'uni2B15',\n    11030 => 'uni2B16',\n    11031 => 'uni2B17',\n    11032 => 'uni2B18',\n    11033 => 'uni2B19',\n    11034 => 'uni2B1A',\n    11039 => 'uni2B1F',\n    11040 => 'uni2B20',\n    11041 => 'uni2B21',\n    11042 => 'uni2B22',\n    11043 => 'uni2B23',\n    11044 => 'uni2B24',\n    11091 => 'uni2B53',\n    11092 => 'uni2B54',\n    11360 => 'uni2C60',\n    11361 => 'uni2C61',\n    11362 => 'uni2C62',\n    11363 => 'uni2C63',\n    11364 => 'uni2C64',\n    11365 => 'uni2C65',\n    11366 => 'uni2C66',\n    11367 => 'uni2C67',\n    11368 => 'uni2C68',\n    11369 => 'uni2C69',\n    11370 => 'uni2C6A',\n    11371 => 'uni2C6B',\n    11372 => 'uni2C6C',\n    11373 => 'uni2C6D',\n    11374 => 'uni2C6E',\n    11375 => 'uni2C6F',\n    11376 => 'uni2C70',\n    11377 => 'uni2C71',\n    11378 => 'uni2C72',\n    11379 => 'uni2C73',\n    11380 => 'uni2C74',\n    11381 => 'uni2C75',\n    11382 => 'uni2C76',\n    11383 => 'uni2C77',\n    11385 => 'uni2C79',\n    11386 => 'uni2C7A',\n    11387 => 'uni2C7B',\n    11388 => 'uni2C7C',\n    11389 => 'uni2C7D',\n    11390 => 'uni2C7E',\n    11391 => 'uni2C7F',\n    11520 => 'uni2D00',\n    11521 => 'uni2D01',\n    11522 => 'uni2D02',\n    11523 => 'uni2D03',\n    11524 => 'uni2D04',\n    11525 => 'uni2D05',\n    11526 => 'uni2D06',\n    11527 => 'uni2D07',\n    11528 => 'uni2D08',\n    11529 => 'uni2D09',\n    11530 => 'uni2D0A',\n    11531 => 'uni2D0B',\n    11532 => 'uni2D0C',\n    11533 => 'uni2D0D',\n    11534 => 'uni2D0E',\n    11535 => 'uni2D0F',\n    11536 => 'uni2D10',\n    11537 => 'uni2D11',\n    11538 => 'uni2D12',\n    11539 => 'uni2D13',\n    11540 => 'uni2D14',\n    11541 => 'uni2D15',\n    11542 => 'uni2D16',\n    11543 => 'uni2D17',\n    11544 => 'uni2D18',\n    11545 => 'uni2D19',\n    11546 => 'uni2D1A',\n    11547 => 'uni2D1B',\n    11548 => 'uni2D1C',\n    11549 => 'uni2D1D',\n    11550 => 'uni2D1E',\n    11551 => 'uni2D1F',\n    11552 => 'uni2D20',\n    11553 => 'uni2D21',\n    11554 => 'uni2D22',\n    11555 => 'uni2D23',\n    11556 => 'uni2D24',\n    11557 => 'uni2D25',\n    11568 => 'uni2D30',\n    11569 => 'uni2D31',\n    11570 => 'uni2D32',\n    11571 => 'uni2D33',\n    11572 => 'uni2D34',\n    11573 => 'uni2D35',\n    11574 => 'uni2D36',\n    11575 => 'uni2D37',\n    11576 => 'uni2D38',\n    11577 => 'uni2D39',\n    11578 => 'uni2D3A',\n    11579 => 'uni2D3B',\n    11580 => 'uni2D3C',\n    11581 => 'uni2D3D',\n    11582 => 'uni2D3E',\n    11583 => 'uni2D3F',\n    11584 => 'uni2D40',\n    11585 => 'uni2D41',\n    11586 => 'uni2D42',\n    11587 => 'uni2D43',\n    11588 => 'uni2D44',\n    11589 => 'uni2D45',\n    11590 => 'uni2D46',\n    11591 => 'uni2D47',\n    11592 => 'uni2D48',\n    11593 => 'uni2D49',\n    11594 => 'uni2D4A',\n    11595 => 'uni2D4B',\n    11596 => 'uni2D4C',\n    11597 => 'uni2D4D',\n    11598 => 'uni2D4E',\n    11599 => 'uni2D4F',\n    11600 => 'uni2D50',\n    11601 => 'uni2D51',\n    11602 => 'uni2D52',\n    11603 => 'uni2D53',\n    11604 => 'uni2D54',\n    11605 => 'uni2D55',\n    11606 => 'uni2D56',\n    11607 => 'uni2D57',\n    11608 => 'uni2D58',\n    11609 => 'uni2D59',\n    11610 => 'uni2D5A',\n    11611 => 'uni2D5B',\n    11612 => 'uni2D5C',\n    11613 => 'uni2D5D',\n    11614 => 'uni2D5E',\n    11615 => 'uni2D5F',\n    11616 => 'uni2D60',\n    11617 => 'uni2D61',\n    11618 => 'uni2D62',\n    11619 => 'uni2D63',\n    11620 => 'uni2D64',\n    11621 => 'uni2D65',\n    11631 => 'uni2D6F',\n    11800 => 'uni2E18',\n    11807 => 'uni2E1F',\n    11810 => 'uni2E22',\n    11811 => 'uni2E23',\n    11812 => 'uni2E24',\n    11813 => 'uni2E25',\n    11822 => 'uni2E2E',\n    19904 => 'uni4DC0',\n    19905 => 'uni4DC1',\n    19906 => 'uni4DC2',\n    19907 => 'uni4DC3',\n    19908 => 'uni4DC4',\n    19909 => 'uni4DC5',\n    19910 => 'uni4DC6',\n    19911 => 'uni4DC7',\n    19912 => 'uni4DC8',\n    19913 => 'uni4DC9',\n    19914 => 'uni4DCA',\n    19915 => 'uni4DCB',\n    19916 => 'uni4DCC',\n    19917 => 'uni4DCD',\n    19918 => 'uni4DCE',\n    19919 => 'uni4DCF',\n    19920 => 'uni4DD0',\n    19921 => 'uni4DD1',\n    19922 => 'uni4DD2',\n    19923 => 'uni4DD3',\n    19924 => 'uni4DD4',\n    19925 => 'uni4DD5',\n    19926 => 'uni4DD6',\n    19927 => 'uni4DD7',\n    19928 => 'uni4DD8',\n    19929 => 'uni4DD9',\n    19930 => 'uni4DDA',\n    19931 => 'uni4DDB',\n    19932 => 'uni4DDC',\n    19933 => 'uni4DDD',\n    19934 => 'uni4DDE',\n    19935 => 'uni4DDF',\n    19936 => 'uni4DE0',\n    19937 => 'uni4DE1',\n    19938 => 'uni4DE2',\n    19939 => 'uni4DE3',\n    19940 => 'uni4DE4',\n    19941 => 'uni4DE5',\n    19942 => 'uni4DE6',\n    19943 => 'uni4DE7',\n    19944 => 'uni4DE8',\n    19945 => 'uni4DE9',\n    19946 => 'uni4DEA',\n    19947 => 'uni4DEB',\n    19948 => 'uni4DEC',\n    19949 => 'uni4DED',\n    19950 => 'uni4DEE',\n    19951 => 'uni4DEF',\n    19952 => 'uni4DF0',\n    19953 => 'uni4DF1',\n    19954 => 'uni4DF2',\n    19955 => 'uni4DF3',\n    19956 => 'uni4DF4',\n    19957 => 'uni4DF5',\n    19958 => 'uni4DF6',\n    19959 => 'uni4DF7',\n    19960 => 'uni4DF8',\n    19961 => 'uni4DF9',\n    19962 => 'uni4DFA',\n    19963 => 'uni4DFB',\n    19964 => 'uni4DFC',\n    19965 => 'uni4DFD',\n    19966 => 'uni4DFE',\n    19967 => 'uni4DFF',\n    42192 => 'uniA4D0',\n    42193 => 'uniA4D1',\n    42194 => 'uniA4D2',\n    42195 => 'uniA4D3',\n    42196 => 'uniA4D4',\n    42197 => 'uniA4D5',\n    42198 => 'uniA4D6',\n    42199 => 'uniA4D7',\n    42200 => 'uniA4D8',\n    42201 => 'uniA4D9',\n    42202 => 'uniA4DA',\n    42203 => 'uniA4DB',\n    42204 => 'uniA4DC',\n    42205 => 'uniA4DD',\n    42206 => 'uniA4DE',\n    42207 => 'uniA4DF',\n    42208 => 'uniA4E0',\n    42209 => 'uniA4E1',\n    42210 => 'uniA4E2',\n    42211 => 'uniA4E3',\n    42212 => 'uniA4E4',\n    42213 => 'uniA4E5',\n    42214 => 'uniA4E6',\n    42215 => 'uniA4E7',\n    42216 => 'uniA4E8',\n    42217 => 'uniA4E9',\n    42218 => 'uniA4EA',\n    42219 => 'uniA4EB',\n    42220 => 'uniA4EC',\n    42221 => 'uniA4ED',\n    42222 => 'uniA4EE',\n    42223 => 'uniA4EF',\n    42224 => 'uniA4F0',\n    42225 => 'uniA4F1',\n    42226 => 'uniA4F2',\n    42227 => 'uniA4F3',\n    42228 => 'uniA4F4',\n    42229 => 'uniA4F5',\n    42230 => 'uniA4F6',\n    42231 => 'uniA4F7',\n    42232 => 'uniA4F8',\n    42233 => 'uniA4F9',\n    42234 => 'uniA4FA',\n    42235 => 'uniA4FB',\n    42236 => 'uniA4FC',\n    42237 => 'uniA4FD',\n    42238 => 'uniA4FE',\n    42239 => 'uniA4FF',\n    42564 => 'uniA644',\n    42565 => 'uniA645',\n    42566 => 'uniA646',\n    42567 => 'uniA647',\n    42572 => 'uniA64C',\n    42573 => 'uniA64D',\n    42576 => 'uniA650',\n    42577 => 'uniA651',\n    42580 => 'uniA654',\n    42581 => 'uniA655',\n    42582 => 'uniA656',\n    42583 => 'uniA657',\n    42594 => 'uniA662',\n    42595 => 'uniA663',\n    42596 => 'uniA664',\n    42597 => 'uniA665',\n    42598 => 'uniA666',\n    42599 => 'uniA667',\n    42600 => 'uniA668',\n    42601 => 'uniA669',\n    42602 => 'uniA66A',\n    42603 => 'uniA66B',\n    42604 => 'uniA66C',\n    42605 => 'uniA66D',\n    42606 => 'uniA66E',\n    42634 => 'uniA68A',\n    42635 => 'uniA68B',\n    42636 => 'uniA68C',\n    42637 => 'uniA68D',\n    42644 => 'uniA694',\n    42645 => 'uniA695',\n    42648 => 'uniA698',\n    42649 => 'uniA699',\n    42760 => 'uniA708',\n    42761 => 'uniA709',\n    42762 => 'uniA70A',\n    42763 => 'uniA70B',\n    42764 => 'uniA70C',\n    42765 => 'uniA70D',\n    42766 => 'uniA70E',\n    42767 => 'uniA70F',\n    42768 => 'uniA710',\n    42769 => 'uniA711',\n    42770 => 'uniA712',\n    42771 => 'uniA713',\n    42772 => 'uniA714',\n    42773 => 'uniA715',\n    42774 => 'uniA716',\n    42779 => 'uniA71B',\n    42780 => 'uniA71C',\n    42781 => 'uniA71D',\n    42782 => 'uniA71E',\n    42783 => 'uniA71F',\n    42786 => 'uniA722',\n    42787 => 'uniA723',\n    42788 => 'uniA724',\n    42789 => 'uniA725',\n    42790 => 'uniA726',\n    42791 => 'uniA727',\n    42792 => 'uniA728',\n    42793 => 'uniA729',\n    42794 => 'uniA72A',\n    42795 => 'uniA72B',\n    42800 => 'uniA730',\n    42801 => 'uniA731',\n    42802 => 'uniA732',\n    42803 => 'uniA733',\n    42804 => 'uniA734',\n    42805 => 'uniA735',\n    42806 => 'uniA736',\n    42807 => 'uniA737',\n    42808 => 'uniA738',\n    42809 => 'uniA739',\n    42810 => 'uniA73A',\n    42811 => 'uniA73B',\n    42812 => 'uniA73C',\n    42813 => 'uniA73D',\n    42814 => 'uniA73E',\n    42815 => 'uniA73F',\n    42816 => 'uniA740',\n    42817 => 'uniA741',\n    42822 => 'uniA746',\n    42823 => 'uniA747',\n    42824 => 'uniA748',\n    42825 => 'uniA749',\n    42826 => 'uniA74A',\n    42827 => 'uniA74B',\n    42830 => 'uniA74E',\n    42831 => 'uniA74F',\n    42832 => 'uniA750',\n    42833 => 'uniA751',\n    42834 => 'uniA752',\n    42835 => 'uniA753',\n    42838 => 'uniA756',\n    42839 => 'uniA757',\n    42852 => 'uniA764',\n    42853 => 'uniA765',\n    42854 => 'uniA766',\n    42855 => 'uniA767',\n    42880 => 'uniA780',\n    42881 => 'uniA781',\n    42882 => 'uniA782',\n    42883 => 'uniA783',\n    42889 => 'uniA789',\n    42890 => 'uniA78A',\n    42891 => 'uniA78B',\n    42892 => 'uniA78C',\n    42893 => 'uniA78D',\n    42894 => 'uniA78E',\n    42896 => 'uniA790',\n    42897 => 'uniA791',\n    42912 => 'uniA7A0',\n    42913 => 'uniA7A1',\n    42914 => 'uniA7A2',\n    42915 => 'uniA7A3',\n    42916 => 'uniA7A4',\n    42917 => 'uniA7A5',\n    42918 => 'uniA7A6',\n    42919 => 'uniA7A7',\n    42920 => 'uniA7A8',\n    42921 => 'uniA7A9',\n    42922 => 'uniA7AA',\n    43000 => 'uniA7F8',\n    43001 => 'uniA7F9',\n    43002 => 'uniA7FA',\n    43003 => 'uniA7FB',\n    43004 => 'uniA7FC',\n    43005 => 'uniA7FD',\n    43006 => 'uniA7FE',\n    43007 => 'uniA7FF',\n    61184 => 'uni02E5.5',\n    61185 => 'uni02E6.5',\n    61186 => 'uni02E7.5',\n    61187 => 'uni02E8.5',\n    61188 => 'uni02E9.5',\n    61189 => 'uni02E5.4',\n    61190 => 'uni02E6.4',\n    61191 => 'uni02E7.4',\n    61192 => 'uni02E8.4',\n    61193 => 'uni02E9.4',\n    61194 => 'uni02E5.3',\n    61195 => 'uni02E6.3',\n    61196 => 'uni02E7.3',\n    61197 => 'uni02E8.3',\n    61198 => 'uni02E9.3',\n    61199 => 'uni02E5.2',\n    61200 => 'uni02E6.2',\n    61201 => 'uni02E7.2',\n    61202 => 'uni02E8.2',\n    61203 => 'uni02E9.2',\n    61204 => 'uni02E5.1',\n    61205 => 'uni02E6.1',\n    61206 => 'uni02E7.1',\n    61207 => 'uni02E8.1',\n    61208 => 'uni02E9.1',\n    61209 => 'stem',\n    61440 => 'uniF000',\n    61441 => 'uniF001',\n    61442 => 'uniF002',\n    61443 => 'uniF003',\n    62464 => 'uniF400',\n    62465 => 'uniF401',\n    62466 => 'uniF402',\n    62467 => 'uniF403',\n    62468 => 'uniF404',\n    62469 => 'uniF405',\n    62470 => 'uniF406',\n    62471 => 'uniF407',\n    62472 => 'uniF408',\n    62473 => 'uniF409',\n    62474 => 'uniF40A',\n    62475 => 'uniF40B',\n    62476 => 'uniF40C',\n    62477 => 'uniF40D',\n    62478 => 'uniF40E',\n    62479 => 'uniF40F',\n    62480 => 'uniF410',\n    62481 => 'uniF411',\n    62482 => 'uniF412',\n    62483 => 'uniF413',\n    62484 => 'uniF414',\n    62485 => 'uniF415',\n    62486 => 'uniF416',\n    62487 => 'uniF417',\n    62488 => 'uniF418',\n    62489 => 'uniF419',\n    62490 => 'uniF41A',\n    62491 => 'uniF41B',\n    62492 => 'uniF41C',\n    62493 => 'uniF41D',\n    62494 => 'uniF41E',\n    62495 => 'uniF41F',\n    62496 => 'uniF420',\n    62497 => 'uniF421',\n    62498 => 'uniF422',\n    62499 => 'uniF423',\n    62500 => 'uniF424',\n    62501 => 'uniF425',\n    62502 => 'uniF426',\n    62504 => 'uniF428',\n    62505 => 'uniF429',\n    62506 => 'uniF42A',\n    62507 => 'uniF42B',\n    62508 => 'uniF42C',\n    62509 => 'uniF42D',\n    62510 => 'uniF42E',\n    62511 => 'uniF42F',\n    62512 => 'uniF430',\n    62513 => 'uniF431',\n    62514 => 'uniF432',\n    62515 => 'uniF433',\n    62516 => 'uniF434',\n    62517 => 'uniF435',\n    62518 => 'uniF436',\n    62519 => 'uniF437',\n    62520 => 'uniF438',\n    62521 => 'uniF439',\n    62522 => 'uniF43A',\n    62523 => 'uniF43B',\n    62524 => 'uniF43C',\n    62525 => 'uniF43D',\n    62526 => 'uniF43E',\n    62527 => 'uniF43F',\n    62528 => 'uniF440',\n    62529 => 'uniF441',\n    63173 => 'uniF6C5',\n    64256 => 'uniFB00',\n    64257 => 'fi',\n    64258 => 'fl',\n    64259 => 'uniFB03',\n    64260 => 'uniFB04',\n    64261 => 'uniFB05',\n    64262 => 'uniFB06',\n    64275 => 'uniFB13',\n    64276 => 'uniFB14',\n    64277 => 'uniFB15',\n    64278 => 'uniFB16',\n    64279 => 'uniFB17',\n    64285 => 'uniFB1D',\n    64286 => 'uniFB1E',\n    64287 => 'uniFB1F',\n    64288 => 'uniFB20',\n    64289 => 'uniFB21',\n    64290 => 'uniFB22',\n    64291 => 'uniFB23',\n    64292 => 'uniFB24',\n    64293 => 'uniFB25',\n    64294 => 'uniFB26',\n    64295 => 'uniFB27',\n    64296 => 'uniFB28',\n    64297 => 'uniFB29',\n    64298 => 'uniFB2A',\n    64299 => 'uniFB2B',\n    64300 => 'uniFB2C',\n    64301 => 'uniFB2D',\n    64302 => 'uniFB2E',\n    64303 => 'uniFB2F',\n    64304 => 'uniFB30',\n    64305 => 'uniFB31',\n    64306 => 'uniFB32',\n    64307 => 'uniFB33',\n    64308 => 'uniFB34',\n    64309 => 'uniFB35',\n    64310 => 'uniFB36',\n    64312 => 'uniFB38',\n    64313 => 'uniFB39',\n    64314 => 'uniFB3A',\n    64315 => 'uniFB3B',\n    64316 => 'uniFB3C',\n    64318 => 'uniFB3E',\n    64320 => 'uniFB40',\n    64321 => 'uniFB41',\n    64323 => 'uniFB43',\n    64324 => 'uniFB44',\n    64326 => 'uniFB46',\n    64327 => 'uniFB47',\n    64328 => 'uniFB48',\n    64329 => 'uniFB49',\n    64330 => 'uniFB4A',\n    64331 => 'uniFB4B',\n    64332 => 'uniFB4C',\n    64333 => 'uniFB4D',\n    64334 => 'uniFB4E',\n    64335 => 'uniFB4F',\n    64338 => 'uniFB52',\n    64339 => 'uniFB53',\n    64340 => 'uniFB54',\n    64341 => 'uniFB55',\n    64342 => 'uniFB56',\n    64343 => 'uniFB57',\n    64344 => 'uniFB58',\n    64345 => 'uniFB59',\n    64346 => 'uniFB5A',\n    64347 => 'uniFB5B',\n    64348 => 'uniFB5C',\n    64349 => 'uniFB5D',\n    64350 => 'uniFB5E',\n    64351 => 'uniFB5F',\n    64352 => 'uniFB60',\n    64353 => 'uniFB61',\n    64354 => 'uniFB62',\n    64355 => 'uniFB63',\n    64356 => 'uniFB64',\n    64357 => 'uniFB65',\n    64358 => 'uniFB66',\n    64359 => 'uniFB67',\n    64360 => 'uniFB68',\n    64361 => 'uniFB69',\n    64362 => 'uniFB6A',\n    64363 => 'uniFB6B',\n    64364 => 'uniFB6C',\n    64365 => 'uniFB6D',\n    64366 => 'uniFB6E',\n    64367 => 'uniFB6F',\n    64368 => 'uniFB70',\n    64369 => 'uniFB71',\n    64370 => 'uniFB72',\n    64371 => 'uniFB73',\n    64372 => 'uniFB74',\n    64373 => 'uniFB75',\n    64374 => 'uniFB76',\n    64375 => 'uniFB77',\n    64376 => 'uniFB78',\n    64377 => 'uniFB79',\n    64378 => 'uniFB7A',\n    64379 => 'uniFB7B',\n    64380 => 'uniFB7C',\n    64381 => 'uniFB7D',\n    64382 => 'uniFB7E',\n    64383 => 'uniFB7F',\n    64384 => 'uniFB80',\n    64385 => 'uniFB81',\n    64386 => 'uniFB82',\n    64387 => 'uniFB83',\n    64388 => 'uniFB84',\n    64389 => 'uniFB85',\n    64390 => 'uniFB86',\n    64391 => 'uniFB87',\n    64392 => 'uniFB88',\n    64393 => 'uniFB89',\n    64394 => 'uniFB8A',\n    64395 => 'uniFB8B',\n    64396 => 'uniFB8C',\n    64397 => 'uniFB8D',\n    64398 => 'uniFB8E',\n    64399 => 'uniFB8F',\n    64400 => 'uniFB90',\n    64401 => 'uniFB91',\n    64402 => 'uniFB92',\n    64403 => 'uniFB93',\n    64404 => 'uniFB94',\n    64405 => 'uniFB95',\n    64406 => 'uniFB96',\n    64407 => 'uniFB97',\n    64408 => 'uniFB98',\n    64409 => 'uniFB99',\n    64410 => 'uniFB9A',\n    64411 => 'uniFB9B',\n    64412 => 'uniFB9C',\n    64413 => 'uniFB9D',\n    64414 => 'uniFB9E',\n    64415 => 'uniFB9F',\n    64416 => 'uniFBA0',\n    64417 => 'uniFBA1',\n    64418 => 'uniFBA2',\n    64419 => 'uniFBA3',\n    64426 => 'uniFBAA',\n    64427 => 'uniFBAB',\n    64428 => 'uniFBAC',\n    64429 => 'uniFBAD',\n    64467 => 'uniFBD3',\n    64468 => 'uniFBD4',\n    64469 => 'uniFBD5',\n    64470 => 'uniFBD6',\n    64471 => 'uniFBD7',\n    64472 => 'uniFBD8',\n    64473 => 'uniFBD9',\n    64474 => 'uniFBDA',\n    64475 => 'uniFBDB',\n    64476 => 'uniFBDC',\n    64478 => 'uniFBDE',\n    64479 => 'uniFBDF',\n    64484 => 'uniFBE4',\n    64485 => 'uniFBE5',\n    64486 => 'uniFBE6',\n    64487 => 'uniFBE7',\n    64488 => 'uniFBE8',\n    64489 => 'uniFBE9',\n    64508 => 'uniFBFC',\n    64509 => 'uniFBFD',\n    64510 => 'uniFBFE',\n    64511 => 'uniFBFF',\n    65024 => 'uniFE00',\n    65025 => 'uniFE01',\n    65026 => 'uniFE02',\n    65027 => 'uniFE03',\n    65028 => 'uniFE04',\n    65029 => 'uniFE05',\n    65030 => 'uniFE06',\n    65031 => 'uniFE07',\n    65032 => 'uniFE08',\n    65033 => 'uniFE09',\n    65034 => 'uniFE0A',\n    65035 => 'uniFE0B',\n    65036 => 'uniFE0C',\n    65037 => 'uniFE0D',\n    65038 => 'uniFE0E',\n    65039 => 'uniFE0F',\n    65056 => 'uniFE20',\n    65057 => 'uniFE21',\n    65058 => 'uniFE22',\n    65059 => 'uniFE23',\n    65136 => 'uniFE70',\n    65137 => 'uniFE71',\n    65138 => 'uniFE72',\n    65139 => 'uniFE73',\n    65140 => 'uniFE74',\n    65142 => 'uniFE76',\n    65143 => 'uniFE77',\n    65144 => 'uniFE78',\n    65145 => 'uniFE79',\n    65146 => 'uniFE7A',\n    65147 => 'uniFE7B',\n    65148 => 'uniFE7C',\n    65149 => 'uniFE7D',\n    65150 => 'uniFE7E',\n    65151 => 'uniFE7F',\n    65152 => 'uniFE80',\n    65153 => 'uniFE81',\n    65154 => 'uniFE82',\n    65155 => 'uniFE83',\n    65156 => 'uniFE84',\n    65157 => 'uniFE85',\n    65158 => 'uniFE86',\n    65159 => 'uniFE87',\n    65160 => 'uniFE88',\n    65161 => 'uniFE89',\n    65162 => 'uniFE8A',\n    65163 => 'uniFE8B',\n    65164 => 'uniFE8C',\n    65165 => 'uniFE8D',\n    65166 => 'uniFE8E',\n    65167 => 'uniFE8F',\n    65168 => 'uniFE90',\n    65169 => 'uniFE91',\n    65170 => 'uniFE92',\n    65171 => 'uniFE93',\n    65172 => 'uniFE94',\n    65173 => 'uniFE95',\n    65174 => 'uniFE96',\n    65175 => 'uniFE97',\n    65176 => 'uniFE98',\n    65177 => 'uniFE99',\n    65178 => 'uniFE9A',\n    65179 => 'uniFE9B',\n    65180 => 'uniFE9C',\n    65181 => 'uniFE9D',\n    65182 => 'uniFE9E',\n    65183 => 'uniFE9F',\n    65184 => 'uniFEA0',\n    65185 => 'uniFEA1',\n    65186 => 'uniFEA2',\n    65187 => 'uniFEA3',\n    65188 => 'uniFEA4',\n    65189 => 'uniFEA5',\n    65190 => 'uniFEA6',\n    65191 => 'uniFEA7',\n    65192 => 'uniFEA8',\n    65193 => 'uniFEA9',\n    65194 => 'uniFEAA',\n    65195 => 'uniFEAB',\n    65196 => 'uniFEAC',\n    65197 => 'uniFEAD',\n    65198 => 'uniFEAE',\n    65199 => 'uniFEAF',\n    65200 => 'uniFEB0',\n    65201 => 'uniFEB1',\n    65202 => 'uniFEB2',\n    65203 => 'uniFEB3',\n    65204 => 'uniFEB4',\n    65205 => 'uniFEB5',\n    65206 => 'uniFEB6',\n    65207 => 'uniFEB7',\n    65208 => 'uniFEB8',\n    65209 => 'uniFEB9',\n    65210 => 'uniFEBA',\n    65211 => 'uniFEBB',\n    65212 => 'uniFEBC',\n    65213 => 'uniFEBD',\n    65214 => 'uniFEBE',\n    65215 => 'uniFEBF',\n    65216 => 'uniFEC0',\n    65217 => 'uniFEC1',\n    65218 => 'uniFEC2',\n    65219 => 'uniFEC3',\n    65220 => 'uniFEC4',\n    65221 => 'uniFEC5',\n    65222 => 'uniFEC6',\n    65223 => 'uniFEC7',\n    65224 => 'uniFEC8',\n    65225 => 'uniFEC9',\n    65226 => 'uniFECA',\n    65227 => 'uniFECB',\n    65228 => 'uniFECC',\n    65229 => 'uniFECD',\n    65230 => 'uniFECE',\n    65231 => 'uniFECF',\n    65232 => 'uniFED0',\n    65233 => 'uniFED1',\n    65234 => 'uniFED2',\n    65235 => 'uniFED3',\n    65236 => 'uniFED4',\n    65237 => 'uniFED5',\n    65238 => 'uniFED6',\n    65239 => 'uniFED7',\n    65240 => 'uniFED8',\n    65241 => 'uniFED9',\n    65242 => 'uniFEDA',\n    65243 => 'uniFEDB',\n    65244 => 'uniFEDC',\n    65245 => 'uniFEDD',\n    65246 => 'uniFEDE',\n    65247 => 'uniFEDF',\n    65248 => 'uniFEE0',\n    65249 => 'uniFEE1',\n    65250 => 'uniFEE2',\n    65251 => 'uniFEE3',\n    65252 => 'uniFEE4',\n    65253 => 'uniFEE5',\n    65254 => 'uniFEE6',\n    65255 => 'uniFEE7',\n    65256 => 'uniFEE8',\n    65257 => 'uniFEE9',\n    65258 => 'uniFEEA',\n    65259 => 'uniFEEB',\n    65260 => 'uniFEEC',\n    65261 => 'uniFEED',\n    65262 => 'uniFEEE',\n    65263 => 'uniFEEF',\n    65264 => 'uniFEF0',\n    65265 => 'uniFEF1',\n    65266 => 'uniFEF2',\n    65267 => 'uniFEF3',\n    65268 => 'uniFEF4',\n    65269 => 'uniFEF5',\n    65270 => 'uniFEF6',\n    65271 => 'uniFEF7',\n    65272 => 'uniFEF8',\n    65273 => 'uniFEF9',\n    65274 => 'uniFEFA',\n    65275 => 'uniFEFB',\n    65276 => 'uniFEFC',\n    65279 => 'uniFEFF',\n    65529 => 'uniFFF9',\n    65530 => 'uniFFFA',\n    65531 => 'uniFFFB',\n    65532 => 'uniFFFC',\n    65533 => 'uniFFFD',\n  ),\n  'isUnicode' => true,\n  'EncodingScheme' => 'FontSpecific',\n  'FontName' => 'DejaVu Sans',\n  'FullName' => 'DejaVu Sans',\n  'Version' => 'Version 2.37',\n  'PostScriptName' => 'DejaVuSans',\n  'Weight' => 'Medium',\n  'ItalicAngle' => '0',\n  'IsFixedPitch' => 'false',\n  'UnderlineThickness' => '44',\n  'UnderlinePosition' => '-63',\n  'FontHeightOffset' => '0',\n  'Ascender' => '928',\n  'Descender' => '-236',\n  'FontBBox' => \n  array (\n    0 => '-1021',\n    1 => '-463',\n    2 => '1793',\n    3 => '1232',\n  ),\n  'StartCharMetrics' => '6253',\n  'C' => \n  array (\n    32 => 318.0,\n    33 => 401.0,\n    34 => 460.0,\n    35 => 838.0,\n    36 => 636.0,\n    37 => 950.0,\n    38 => 780.0,\n    39 => 275.0,\n    40 => 390.0,\n    41 => 390.0,\n    42 => 500.0,\n    43 => 838.0,\n    44 => 318.0,\n    45 => 361.0,\n    46 => 318.0,\n    47 => 337.0,\n    48 => 636.0,\n    49 => 636.0,\n    50 => 636.0,\n    51 => 636.0,\n    52 => 636.0,\n    53 => 636.0,\n    54 => 636.0,\n    55 => 636.0,\n    56 => 636.0,\n    57 => 636.0,\n    58 => 337.0,\n    59 => 337.0,\n    60 => 838.0,\n    61 => 838.0,\n    62 => 838.0,\n    63 => 531.0,\n    64 => 1000.0,\n    65 => 684.0,\n    66 => 686.0,\n    67 => 698.0,\n    68 => 770.0,\n    69 => 632.0,\n    70 => 575.0,\n    71 => 775.0,\n    72 => 752.0,\n    73 => 295.0,\n    74 => 295.0,\n    75 => 656.0,\n    76 => 557.0,\n    77 => 863.0,\n    78 => 748.0,\n    79 => 787.0,\n    80 => 603.0,\n    81 => 787.0,\n    82 => 695.0,\n    83 => 635.0,\n    84 => 611.0,\n    85 => 732.0,\n    86 => 684.0,\n    87 => 989.0,\n    88 => 685.0,\n    89 => 611.0,\n    90 => 685.0,\n    91 => 390.0,\n    92 => 337.0,\n    93 => 390.0,\n    94 => 838.0,\n    95 => 500.0,\n    96 => 500.0,\n    97 => 613.0,\n    98 => 635.0,\n    99 => 550.0,\n    100 => 635.0,\n    101 => 615.0,\n    102 => 352.0,\n    103 => 635.0,\n    104 => 634.0,\n    105 => 278.0,\n    106 => 278.0,\n    107 => 579.0,\n    108 => 278.0,\n    109 => 974.0,\n    110 => 634.0,\n    111 => 612.0,\n    112 => 635.0,\n    113 => 635.0,\n    114 => 411.0,\n    115 => 521.0,\n    116 => 392.0,\n    117 => 634.0,\n    118 => 592.0,\n    119 => 818.0,\n    120 => 592.0,\n    121 => 592.0,\n    122 => 525.0,\n    123 => 636.0,\n    124 => 337.0,\n    125 => 636.0,\n    126 => 838.0,\n    160 => 318.0,\n    161 => 401.0,\n    162 => 636.0,\n    163 => 636.0,\n    164 => 636.0,\n    165 => 636.0,\n    166 => 337.0,\n    167 => 500.0,\n    168 => 500.0,\n    169 => 1000.0,\n    170 => 471.0,\n    171 => 612.0,\n    172 => 838.0,\n    173 => 361.0,\n    174 => 1000.0,\n    175 => 500.0,\n    176 => 500.0,\n    177 => 838.0,\n    178 => 401.0,\n    179 => 401.0,\n    180 => 500.0,\n    181 => 636.0,\n    182 => 636.0,\n    183 => 318.0,\n    184 => 500.0,\n    185 => 401.0,\n    186 => 471.0,\n    187 => 612.0,\n    188 => 969.0,\n    189 => 969.0,\n    190 => 969.0,\n    191 => 531.0,\n    192 => 684.0,\n    193 => 684.0,\n    194 => 684.0,\n    195 => 684.0,\n    196 => 684.0,\n    197 => 684.0,\n    198 => 974.0,\n    199 => 698.0,\n    200 => 632.0,\n    201 => 632.0,\n    202 => 632.0,\n    203 => 632.0,\n    204 => 295.0,\n    205 => 295.0,\n    206 => 295.0,\n    207 => 295.0,\n    208 => 775.0,\n    209 => 748.0,\n    210 => 787.0,\n    211 => 787.0,\n    212 => 787.0,\n    213 => 787.0,\n    214 => 787.0,\n    215 => 838.0,\n    216 => 787.0,\n    217 => 732.0,\n    218 => 732.0,\n    219 => 732.0,\n    220 => 732.0,\n    221 => 611.0,\n    222 => 605.0,\n    223 => 630.0,\n    224 => 613.0,\n    225 => 613.0,\n    226 => 613.0,\n    227 => 613.0,\n    228 => 613.0,\n    229 => 613.0,\n    230 => 982.0,\n    231 => 550.0,\n    232 => 615.0,\n    233 => 615.0,\n    234 => 615.0,\n    235 => 615.0,\n    236 => 278.0,\n    237 => 278.0,\n    238 => 278.0,\n    239 => 278.0,\n    240 => 612.0,\n    241 => 634.0,\n    242 => 612.0,\n    243 => 612.0,\n    244 => 612.0,\n    245 => 612.0,\n    246 => 612.0,\n    247 => 838.0,\n    248 => 612.0,\n    249 => 634.0,\n    250 => 634.0,\n    251 => 634.0,\n    252 => 634.0,\n    253 => 592.0,\n    254 => 635.0,\n    255 => 592.0,\n    256 => 684.0,\n    257 => 613.0,\n    258 => 684.0,\n    259 => 613.0,\n    260 => 684.0,\n    261 => 613.0,\n    262 => 698.0,\n    263 => 550.0,\n    264 => 698.0,\n    265 => 550.0,\n    266 => 698.0,\n    267 => 550.0,\n    268 => 698.0,\n    269 => 550.0,\n    270 => 770.0,\n    271 => 635.0,\n    272 => 775.0,\n    273 => 635.0,\n    274 => 632.0,\n    275 => 615.0,\n    276 => 632.0,\n    277 => 615.0,\n    278 => 632.0,\n    279 => 615.0,\n    280 => 632.0,\n    281 => 615.0,\n    282 => 632.0,\n    283 => 615.0,\n    284 => 775.0,\n    285 => 635.0,\n    286 => 775.0,\n    287 => 635.0,\n    288 => 775.0,\n    289 => 635.0,\n    290 => 775.0,\n    291 => 635.0,\n    292 => 752.0,\n    293 => 634.0,\n    294 => 916.0,\n    295 => 695.0,\n    296 => 295.0,\n    297 => 278.0,\n    298 => 295.0,\n    299 => 278.0,\n    300 => 295.0,\n    301 => 278.0,\n    302 => 295.0,\n    303 => 278.0,\n    304 => 295.0,\n    305 => 278.0,\n    306 => 590.0,\n    307 => 556.0,\n    308 => 295.0,\n    309 => 278.0,\n    310 => 656.0,\n    311 => 579.0,\n    312 => 579.0,\n    313 => 557.0,\n    314 => 278.0,\n    315 => 557.0,\n    316 => 278.0,\n    317 => 557.0,\n    318 => 375.0,\n    319 => 557.0,\n    320 => 342.0,\n    321 => 562.0,\n    322 => 284.0,\n    323 => 748.0,\n    324 => 634.0,\n    325 => 748.0,\n    326 => 634.0,\n    327 => 748.0,\n    328 => 634.0,\n    329 => 813.0,\n    330 => 748.0,\n    331 => 634.0,\n    332 => 787.0,\n    333 => 612.0,\n    334 => 787.0,\n    335 => 612.0,\n    336 => 787.0,\n    337 => 612.0,\n    338 => 1070.0,\n    339 => 1023.0,\n    340 => 695.0,\n    341 => 411.0,\n    342 => 695.0,\n    343 => 411.0,\n    344 => 695.0,\n    345 => 411.0,\n    346 => 635.0,\n    347 => 521.0,\n    348 => 635.0,\n    349 => 521.0,\n    350 => 635.0,\n    351 => 521.0,\n    352 => 635.0,\n    353 => 521.0,\n    354 => 611.0,\n    355 => 392.0,\n    356 => 611.0,\n    357 => 392.0,\n    358 => 611.0,\n    359 => 392.0,\n    360 => 732.0,\n    361 => 634.0,\n    362 => 732.0,\n    363 => 634.0,\n    364 => 732.0,\n    365 => 634.0,\n    366 => 732.0,\n    367 => 634.0,\n    368 => 732.0,\n    369 => 634.0,\n    370 => 732.0,\n    371 => 634.0,\n    372 => 989.0,\n    373 => 818.0,\n    374 => 611.0,\n    375 => 592.0,\n    376 => 611.0,\n    377 => 685.0,\n    378 => 525.0,\n    379 => 685.0,\n    380 => 525.0,\n    381 => 685.0,\n    382 => 525.0,\n    383 => 352.0,\n    384 => 635.0,\n    385 => 735.0,\n    386 => 686.0,\n    387 => 635.0,\n    388 => 686.0,\n    389 => 635.0,\n    390 => 703.0,\n    391 => 698.0,\n    392 => 550.0,\n    393 => 775.0,\n    394 => 819.0,\n    395 => 686.0,\n    396 => 635.0,\n    397 => 612.0,\n    398 => 632.0,\n    399 => 787.0,\n    400 => 614.0,\n    401 => 575.0,\n    402 => 352.0,\n    403 => 775.0,\n    404 => 687.0,\n    405 => 984.0,\n    406 => 354.0,\n    407 => 295.0,\n    408 => 746.0,\n    409 => 579.0,\n    410 => 278.0,\n    411 => 592.0,\n    412 => 974.0,\n    413 => 748.0,\n    414 => 634.0,\n    415 => 787.0,\n    416 => 913.0,\n    417 => 612.0,\n    418 => 949.0,\n    419 => 759.0,\n    420 => 652.0,\n    421 => 635.0,\n    422 => 695.0,\n    423 => 635.0,\n    424 => 521.0,\n    425 => 632.0,\n    426 => 336.0,\n    427 => 392.0,\n    428 => 611.0,\n    429 => 392.0,\n    430 => 611.0,\n    431 => 858.0,\n    432 => 634.0,\n    433 => 764.0,\n    434 => 721.0,\n    435 => 744.0,\n    436 => 730.0,\n    437 => 685.0,\n    438 => 525.0,\n    439 => 666.0,\n    440 => 666.0,\n    441 => 578.0,\n    442 => 525.0,\n    443 => 636.0,\n    444 => 666.0,\n    445 => 578.0,\n    446 => 510.0,\n    447 => 635.0,\n    448 => 295.0,\n    449 => 492.0,\n    450 => 459.0,\n    451 => 295.0,\n    452 => 1422.0,\n    453 => 1299.0,\n    454 => 1154.0,\n    455 => 835.0,\n    456 => 787.0,\n    457 => 457.0,\n    458 => 931.0,\n    459 => 924.0,\n    460 => 797.0,\n    461 => 684.0,\n    462 => 613.0,\n    463 => 295.0,\n    464 => 278.0,\n    465 => 787.0,\n    466 => 612.0,\n    467 => 732.0,\n    468 => 634.0,\n    469 => 732.0,\n    470 => 634.0,\n    471 => 732.0,\n    472 => 634.0,\n    473 => 732.0,\n    474 => 634.0,\n    475 => 732.0,\n    476 => 634.0,\n    477 => 615.0,\n    478 => 684.0,\n    479 => 613.0,\n    480 => 684.0,\n    481 => 613.0,\n    482 => 974.0,\n    483 => 982.0,\n    484 => 775.0,\n    485 => 635.0,\n    486 => 775.0,\n    487 => 635.0,\n    488 => 656.0,\n    489 => 579.0,\n    490 => 787.0,\n    491 => 612.0,\n    492 => 787.0,\n    493 => 612.0,\n    494 => 666.0,\n    495 => 578.0,\n    496 => 278.0,\n    497 => 1422.0,\n    498 => 1299.0,\n    499 => 1154.0,\n    500 => 775.0,\n    501 => 635.0,\n    502 => 1113.0,\n    503 => 682.0,\n    504 => 748.0,\n    505 => 634.0,\n    506 => 684.0,\n    507 => 613.0,\n    508 => 974.0,\n    509 => 982.0,\n    510 => 787.0,\n    511 => 612.0,\n    512 => 684.0,\n    513 => 613.0,\n    514 => 684.0,\n    515 => 613.0,\n    516 => 632.0,\n    517 => 615.0,\n    518 => 632.0,\n    519 => 615.0,\n    520 => 295.0,\n    521 => 278.0,\n    522 => 295.0,\n    523 => 278.0,\n    524 => 787.0,\n    525 => 612.0,\n    526 => 787.0,\n    527 => 612.0,\n    528 => 695.0,\n    529 => 411.0,\n    530 => 695.0,\n    531 => 411.0,\n    532 => 732.0,\n    533 => 634.0,\n    534 => 732.0,\n    535 => 634.0,\n    536 => 635.0,\n    537 => 521.0,\n    538 => 611.0,\n    539 => 392.0,\n    540 => 627.0,\n    541 => 521.0,\n    542 => 752.0,\n    543 => 634.0,\n    544 => 735.0,\n    545 => 838.0,\n    546 => 698.0,\n    547 => 610.0,\n    548 => 685.0,\n    549 => 525.0,\n    550 => 684.0,\n    551 => 613.0,\n    552 => 632.0,\n    553 => 615.0,\n    554 => 787.0,\n    555 => 612.0,\n    556 => 787.0,\n    557 => 612.0,\n    558 => 787.0,\n    559 => 612.0,\n    560 => 787.0,\n    561 => 612.0,\n    562 => 611.0,\n    563 => 592.0,\n    564 => 475.0,\n    565 => 843.0,\n    566 => 477.0,\n    567 => 278.0,\n    568 => 998.0,\n    569 => 998.0,\n    570 => 684.0,\n    571 => 698.0,\n    572 => 550.0,\n    573 => 557.0,\n    574 => 611.0,\n    575 => 521.0,\n    576 => 525.0,\n    577 => 603.0,\n    578 => 479.0,\n    579 => 686.0,\n    580 => 732.0,\n    581 => 684.0,\n    582 => 632.0,\n    583 => 615.0,\n    584 => 295.0,\n    585 => 278.0,\n    586 => 781.0,\n    587 => 635.0,\n    588 => 695.0,\n    589 => 411.0,\n    590 => 611.0,\n    591 => 592.0,\n    592 => 600.0,\n    593 => 635.0,\n    594 => 635.0,\n    595 => 635.0,\n    596 => 549.0,\n    597 => 550.0,\n    598 => 635.0,\n    599 => 696.0,\n    600 => 615.0,\n    601 => 615.0,\n    602 => 819.0,\n    603 => 541.0,\n    604 => 532.0,\n    605 => 775.0,\n    606 => 664.0,\n    607 => 278.0,\n    608 => 696.0,\n    609 => 635.0,\n    610 => 629.0,\n    611 => 596.0,\n    612 => 596.0,\n    613 => 634.0,\n    614 => 634.0,\n    615 => 634.0,\n    616 => 278.0,\n    617 => 338.0,\n    618 => 372.0,\n    619 => 396.0,\n    620 => 487.0,\n    621 => 278.0,\n    622 => 706.0,\n    623 => 974.0,\n    624 => 974.0,\n    625 => 974.0,\n    626 => 646.0,\n    627 => 642.0,\n    628 => 634.0,\n    629 => 612.0,\n    630 => 858.0,\n    631 => 728.0,\n    632 => 660.0,\n    633 => 414.0,\n    634 => 414.0,\n    635 => 414.0,\n    636 => 411.0,\n    637 => 411.0,\n    638 => 530.0,\n    639 => 530.0,\n    640 => 604.0,\n    641 => 604.0,\n    642 => 521.0,\n    643 => 336.0,\n    644 => 336.0,\n    645 => 461.0,\n    646 => 336.0,\n    647 => 392.0,\n    648 => 392.0,\n    649 => 634.0,\n    650 => 618.0,\n    651 => 598.0,\n    652 => 592.0,\n    653 => 818.0,\n    654 => 592.0,\n    655 => 611.0,\n    656 => 525.0,\n    657 => 525.0,\n    658 => 578.0,\n    659 => 578.0,\n    660 => 510.0,\n    661 => 510.0,\n    662 => 510.0,\n    663 => 510.0,\n    664 => 787.0,\n    665 => 580.0,\n    666 => 664.0,\n    667 => 708.0,\n    668 => 654.0,\n    669 => 292.0,\n    670 => 667.0,\n    671 => 507.0,\n    672 => 727.0,\n    673 => 510.0,\n    674 => 510.0,\n    675 => 1014.0,\n    676 => 1058.0,\n    677 => 1013.0,\n    678 => 830.0,\n    679 => 610.0,\n    680 => 778.0,\n    681 => 848.0,\n    682 => 706.0,\n    683 => 654.0,\n    684 => 515.0,\n    685 => 515.0,\n    686 => 661.0,\n    687 => 664.0,\n    688 => 404.0,\n    689 => 399.0,\n    690 => 175.0,\n    691 => 259.0,\n    692 => 295.0,\n    693 => 296.0,\n    694 => 379.0,\n    695 => 515.0,\n    696 => 373.0,\n    697 => 278.0,\n    698 => 460.0,\n    699 => 318.0,\n    700 => 318.0,\n    701 => 318.0,\n    702 => 307.0,\n    703 => 307.0,\n    704 => 370.0,\n    705 => 370.0,\n    706 => 500.0,\n    707 => 500.0,\n    708 => 500.0,\n    709 => 500.0,\n    710 => 500.0,\n    711 => 500.0,\n    712 => 275.0,\n    713 => 500.0,\n    714 => 500.0,\n    715 => 500.0,\n    716 => 275.0,\n    717 => 500.0,\n    718 => 500.0,\n    719 => 500.0,\n    720 => 337.0,\n    721 => 337.0,\n    722 => 307.0,\n    723 => 307.0,\n    724 => 500.0,\n    725 => 500.0,\n    726 => 390.0,\n    727 => 317.0,\n    728 => 500.0,\n    729 => 500.0,\n    730 => 500.0,\n    731 => 500.0,\n    732 => 500.0,\n    733 => 500.0,\n    734 => 315.0,\n    735 => 500.0,\n    736 => 426.0,\n    737 => 166.0,\n    738 => 373.0,\n    739 => 444.0,\n    740 => 370.0,\n    741 => 493.0,\n    742 => 493.0,\n    743 => 493.0,\n    744 => 493.0,\n    745 => 493.0,\n    748 => 500.0,\n    749 => 500.0,\n    750 => 518.0,\n    755 => 500.0,\n    759 => 500.0,\n    768 => 0.0,\n    769 => 0.0,\n    770 => 0.0,\n    771 => 0.0,\n    772 => 0.0,\n    773 => 0.0,\n    774 => 0.0,\n    775 => 0.0,\n    776 => 0.0,\n    777 => 0.0,\n    778 => 0.0,\n    779 => 0.0,\n    780 => 0.0,\n    781 => 0.0,\n    782 => 0.0,\n    783 => 0.0,\n    784 => 0.0,\n    785 => 0.0,\n    786 => 0.0,\n    787 => 0.0,\n    788 => 0.0,\n    789 => 0.0,\n    790 => 0.0,\n    791 => 0.0,\n    792 => 0.0,\n    793 => 0.0,\n    794 => 0.0,\n    795 => 0.0,\n    796 => 0.0,\n    797 => 0.0,\n    798 => 0.0,\n    799 => 0.0,\n    800 => 0.0,\n    801 => 0.0,\n    802 => 0.0,\n    803 => 0.0,\n    804 => 0.0,\n    805 => 0.0,\n    806 => 0.0,\n    807 => 0.0,\n    808 => 0.0,\n    809 => 0.0,\n    810 => 0.0,\n    811 => 0.0,\n    812 => 0.0,\n    813 => 0.0,\n    814 => 0.0,\n    815 => 0.0,\n    816 => 0.0,\n    817 => 0.0,\n    818 => 0.0,\n    819 => 0.0,\n    820 => 0.0,\n    821 => 0.0,\n    822 => 0.0,\n    823 => 0.0,\n    824 => 0.0,\n    825 => 0.0,\n    826 => 0.0,\n    827 => 0.0,\n    828 => 0.0,\n    829 => 0.0,\n    830 => 0.0,\n    831 => 0.0,\n    832 => 0.0,\n    833 => 0.0,\n    834 => 0.0,\n    835 => 0.0,\n    836 => 0.0,\n    837 => 0.0,\n    838 => 0.0,\n    839 => 0.0,\n    840 => 0.0,\n    841 => 0.0,\n    842 => 0.0,\n    843 => 0.0,\n    844 => 0.0,\n    845 => 0.0,\n    846 => 0.0,\n    847 => 0.0,\n    849 => 0.0,\n    850 => 0.0,\n    851 => 0.0,\n    855 => 0.0,\n    856 => 0.0,\n    858 => 0.0,\n    860 => 0.0,\n    861 => 0.0,\n    862 => 0.0,\n    863 => 0.0,\n    864 => 0.0,\n    865 => 0.0,\n    866 => 0.0,\n    880 => 654.0,\n    881 => 568.0,\n    882 => 862.0,\n    883 => 647.0,\n    884 => 278.0,\n    885 => 278.0,\n    886 => 748.0,\n    887 => 650.0,\n    890 => 500.0,\n    891 => 549.0,\n    892 => 550.0,\n    893 => 549.0,\n    894 => 337.0,\n    895 => 295.0,\n    900 => 500.0,\n    901 => 500.0,\n    902 => 692.0,\n    903 => 318.0,\n    904 => 746.0,\n    905 => 871.0,\n    906 => 408.0,\n    908 => 813.0,\n    910 => 825.0,\n    911 => 826.0,\n    912 => 338.0,\n    913 => 684.0,\n    914 => 686.0,\n    915 => 557.0,\n    916 => 684.0,\n    917 => 632.0,\n    918 => 685.0,\n    919 => 752.0,\n    920 => 787.0,\n    921 => 295.0,\n    922 => 656.0,\n    923 => 684.0,\n    924 => 863.0,\n    925 => 748.0,\n    926 => 632.0,\n    927 => 787.0,\n    928 => 752.0,\n    929 => 603.0,\n    931 => 632.0,\n    932 => 611.0,\n    933 => 611.0,\n    934 => 787.0,\n    935 => 685.0,\n    936 => 787.0,\n    937 => 764.0,\n    938 => 295.0,\n    939 => 611.0,\n    940 => 659.0,\n    941 => 541.0,\n    942 => 634.0,\n    943 => 338.0,\n    944 => 579.0,\n    945 => 659.0,\n    946 => 638.0,\n    947 => 592.0,\n    948 => 612.0,\n    949 => 541.0,\n    950 => 544.0,\n    951 => 634.0,\n    952 => 612.0,\n    953 => 338.0,\n    954 => 589.0,\n    955 => 592.0,\n    956 => 636.0,\n    957 => 559.0,\n    958 => 558.0,\n    959 => 612.0,\n    960 => 602.0,\n    961 => 635.0,\n    962 => 587.0,\n    963 => 634.0,\n    964 => 602.0,\n    965 => 579.0,\n    966 => 660.0,\n    967 => 578.0,\n    968 => 660.0,\n    969 => 837.0,\n    970 => 338.0,\n    971 => 579.0,\n    972 => 612.0,\n    973 => 579.0,\n    974 => 837.0,\n    975 => 656.0,\n    976 => 614.0,\n    977 => 619.0,\n    978 => 699.0,\n    979 => 842.0,\n    980 => 699.0,\n    981 => 660.0,\n    982 => 837.0,\n    983 => 664.0,\n    984 => 787.0,\n    985 => 612.0,\n    986 => 648.0,\n    987 => 587.0,\n    988 => 575.0,\n    989 => 458.0,\n    990 => 660.0,\n    991 => 660.0,\n    992 => 865.0,\n    993 => 627.0,\n    994 => 934.0,\n    995 => 837.0,\n    996 => 758.0,\n    997 => 659.0,\n    998 => 792.0,\n    999 => 615.0,\n    1000 => 687.0,\n    1001 => 607.0,\n    1002 => 768.0,\n    1003 => 625.0,\n    1004 => 699.0,\n    1005 => 612.0,\n    1006 => 611.0,\n    1007 => 536.0,\n    1008 => 664.0,\n    1009 => 635.0,\n    1010 => 550.0,\n    1011 => 278.0,\n    1012 => 787.0,\n    1013 => 615.0,\n    1014 => 615.0,\n    1015 => 605.0,\n    1016 => 635.0,\n    1017 => 698.0,\n    1018 => 863.0,\n    1019 => 651.0,\n    1020 => 635.0,\n    1021 => 703.0,\n    1022 => 698.0,\n    1023 => 703.0,\n    1024 => 632.0,\n    1025 => 632.0,\n    1026 => 786.0,\n    1027 => 610.0,\n    1028 => 698.0,\n    1029 => 635.0,\n    1030 => 295.0,\n    1031 => 295.0,\n    1032 => 295.0,\n    1033 => 1094.0,\n    1034 => 1045.0,\n    1035 => 786.0,\n    1036 => 710.0,\n    1037 => 748.0,\n    1038 => 609.0,\n    1039 => 752.0,\n    1040 => 684.0,\n    1041 => 686.0,\n    1042 => 686.0,\n    1043 => 610.0,\n    1044 => 781.0,\n    1045 => 632.0,\n    1046 => 1077.0,\n    1047 => 641.0,\n    1048 => 748.0,\n    1049 => 748.0,\n    1050 => 710.0,\n    1051 => 752.0,\n    1052 => 863.0,\n    1053 => 752.0,\n    1054 => 787.0,\n    1055 => 752.0,\n    1056 => 603.0,\n    1057 => 698.0,\n    1058 => 611.0,\n    1059 => 609.0,\n    1060 => 861.0,\n    1061 => 685.0,\n    1062 => 776.0,\n    1063 => 686.0,\n    1064 => 1069.0,\n    1065 => 1094.0,\n    1066 => 833.0,\n    1067 => 882.0,\n    1068 => 686.0,\n    1069 => 698.0,\n    1070 => 1080.0,\n    1071 => 695.0,\n    1072 => 613.0,\n    1073 => 617.0,\n    1074 => 589.0,\n    1075 => 525.0,\n    1076 => 691.0,\n    1077 => 615.0,\n    1078 => 901.0,\n    1079 => 532.0,\n    1080 => 650.0,\n    1081 => 650.0,\n    1082 => 604.0,\n    1083 => 639.0,\n    1084 => 754.0,\n    1085 => 654.0,\n    1086 => 612.0,\n    1087 => 654.0,\n    1088 => 635.0,\n    1089 => 550.0,\n    1090 => 583.0,\n    1091 => 592.0,\n    1092 => 855.0,\n    1093 => 592.0,\n    1094 => 681.0,\n    1095 => 591.0,\n    1096 => 915.0,\n    1097 => 942.0,\n    1098 => 707.0,\n    1099 => 790.0,\n    1100 => 589.0,\n    1101 => 549.0,\n    1102 => 842.0,\n    1103 => 602.0,\n    1104 => 615.0,\n    1105 => 615.0,\n    1106 => 625.0,\n    1107 => 525.0,\n    1108 => 549.0,\n    1109 => 521.0,\n    1110 => 278.0,\n    1111 => 278.0,\n    1112 => 278.0,\n    1113 => 902.0,\n    1114 => 898.0,\n    1115 => 652.0,\n    1116 => 604.0,\n    1117 => 650.0,\n    1118 => 592.0,\n    1119 => 654.0,\n    1120 => 934.0,\n    1121 => 837.0,\n    1122 => 771.0,\n    1123 => 672.0,\n    1124 => 942.0,\n    1125 => 749.0,\n    1126 => 879.0,\n    1127 => 783.0,\n    1128 => 1160.0,\n    1129 => 1001.0,\n    1130 => 787.0,\n    1131 => 612.0,\n    1132 => 1027.0,\n    1133 => 824.0,\n    1134 => 636.0,\n    1135 => 541.0,\n    1136 => 856.0,\n    1137 => 876.0,\n    1138 => 787.0,\n    1139 => 612.0,\n    1140 => 781.0,\n    1141 => 665.0,\n    1142 => 781.0,\n    1143 => 665.0,\n    1144 => 992.0,\n    1145 => 904.0,\n    1146 => 953.0,\n    1147 => 758.0,\n    1148 => 1180.0,\n    1149 => 1028.0,\n    1150 => 934.0,\n    1151 => 837.0,\n    1152 => 698.0,\n    1153 => 550.0,\n    1154 => 502.0,\n    1155 => 0.0,\n    1156 => 0.0,\n    1157 => 0.0,\n    1158 => 0.0,\n    1159 => 0.0,\n    1160 => 418.0,\n    1161 => 418.0,\n    1162 => 772.0,\n    1163 => 677.0,\n    1164 => 686.0,\n    1165 => 589.0,\n    1166 => 603.0,\n    1167 => 635.0,\n    1168 => 610.0,\n    1169 => 525.0,\n    1170 => 675.0,\n    1171 => 590.0,\n    1172 => 624.0,\n    1173 => 530.0,\n    1174 => 1077.0,\n    1175 => 901.0,\n    1176 => 641.0,\n    1177 => 532.0,\n    1178 => 710.0,\n    1179 => 604.0,\n    1180 => 710.0,\n    1181 => 604.0,\n    1182 => 710.0,\n    1183 => 604.0,\n    1184 => 856.0,\n    1185 => 832.0,\n    1186 => 752.0,\n    1187 => 661.0,\n    1188 => 1014.0,\n    1189 => 877.0,\n    1190 => 1081.0,\n    1191 => 916.0,\n    1192 => 878.0,\n    1193 => 693.0,\n    1194 => 698.0,\n    1195 => 550.0,\n    1196 => 611.0,\n    1197 => 583.0,\n    1198 => 611.0,\n    1199 => 592.0,\n    1200 => 611.0,\n    1201 => 592.0,\n    1202 => 685.0,\n    1203 => 592.0,\n    1204 => 934.0,\n    1205 => 807.0,\n    1206 => 686.0,\n    1207 => 591.0,\n    1208 => 686.0,\n    1209 => 591.0,\n    1210 => 686.0,\n    1211 => 634.0,\n    1212 => 941.0,\n    1213 => 728.0,\n    1214 => 941.0,\n    1215 => 728.0,\n    1216 => 295.0,\n    1217 => 1077.0,\n    1218 => 901.0,\n    1219 => 656.0,\n    1220 => 604.0,\n    1221 => 776.0,\n    1222 => 670.0,\n    1223 => 752.0,\n    1224 => 661.0,\n    1225 => 776.0,\n    1226 => 681.0,\n    1227 => 686.0,\n    1228 => 591.0,\n    1229 => 888.0,\n    1230 => 774.0,\n    1231 => 278.0,\n    1232 => 684.0,\n    1233 => 613.0,\n    1234 => 684.0,\n    1235 => 613.0,\n    1236 => 974.0,\n    1237 => 982.0,\n    1238 => 632.0,\n    1239 => 615.0,\n    1240 => 787.0,\n    1241 => 615.0,\n    1242 => 787.0,\n    1243 => 615.0,\n    1244 => 1077.0,\n    1245 => 901.0,\n    1246 => 641.0,\n    1247 => 532.0,\n    1248 => 666.0,\n    1249 => 578.0,\n    1250 => 748.0,\n    1251 => 650.0,\n    1252 => 748.0,\n    1253 => 650.0,\n    1254 => 787.0,\n    1255 => 612.0,\n    1256 => 787.0,\n    1257 => 612.0,\n    1258 => 787.0,\n    1259 => 612.0,\n    1260 => 698.0,\n    1261 => 549.0,\n    1262 => 609.0,\n    1263 => 592.0,\n    1264 => 609.0,\n    1265 => 592.0,\n    1266 => 609.0,\n    1267 => 592.0,\n    1268 => 686.0,\n    1269 => 591.0,\n    1270 => 610.0,\n    1271 => 525.0,\n    1272 => 882.0,\n    1273 => 790.0,\n    1274 => 675.0,\n    1275 => 590.0,\n    1276 => 685.0,\n    1277 => 592.0,\n    1278 => 685.0,\n    1279 => 592.0,\n    1280 => 686.0,\n    1281 => 589.0,\n    1282 => 1006.0,\n    1283 => 897.0,\n    1284 => 975.0,\n    1285 => 869.0,\n    1286 => 679.0,\n    1287 => 588.0,\n    1288 => 1072.0,\n    1289 => 957.0,\n    1290 => 1113.0,\n    1291 => 967.0,\n    1292 => 775.0,\n    1293 => 660.0,\n    1294 => 773.0,\n    1295 => 711.0,\n    1296 => 614.0,\n    1297 => 541.0,\n    1298 => 752.0,\n    1299 => 639.0,\n    1300 => 1169.0,\n    1301 => 994.0,\n    1302 => 894.0,\n    1303 => 864.0,\n    1304 => 1032.0,\n    1305 => 986.0,\n    1306 => 787.0,\n    1307 => 635.0,\n    1308 => 989.0,\n    1309 => 818.0,\n    1310 => 710.0,\n    1311 => 604.0,\n    1312 => 1081.0,\n    1313 => 905.0,\n    1314 => 1081.0,\n    1315 => 912.0,\n    1316 => 793.0,\n    1317 => 683.0,\n    1329 => 766.0,\n    1330 => 732.0,\n    1331 => 753.0,\n    1332 => 753.0,\n    1333 => 732.0,\n    1334 => 772.0,\n    1335 => 640.0,\n    1336 => 732.0,\n    1337 => 859.0,\n    1338 => 753.0,\n    1339 => 691.0,\n    1340 => 533.0,\n    1341 => 922.0,\n    1342 => 863.0,\n    1343 => 732.0,\n    1344 => 716.0,\n    1345 => 766.0,\n    1346 => 753.0,\n    1347 => 767.0,\n    1348 => 792.0,\n    1349 => 728.0,\n    1350 => 729.0,\n    1351 => 757.0,\n    1352 => 732.0,\n    1353 => 713.0,\n    1354 => 800.0,\n    1355 => 768.0,\n    1356 => 792.0,\n    1357 => 732.0,\n    1358 => 753.0,\n    1359 => 705.0,\n    1360 => 694.0,\n    1361 => 744.0,\n    1362 => 538.0,\n    1363 => 811.0,\n    1364 => 757.0,\n    1365 => 787.0,\n    1366 => 790.0,\n    1369 => 307.0,\n    1370 => 318.0,\n    1371 => 234.0,\n    1372 => 361.0,\n    1373 => 238.0,\n    1374 => 405.0,\n    1375 => 500.0,\n    1377 => 974.0,\n    1378 => 634.0,\n    1379 => 658.0,\n    1380 => 663.0,\n    1381 => 634.0,\n    1382 => 635.0,\n    1383 => 515.0,\n    1384 => 634.0,\n    1385 => 738.0,\n    1386 => 658.0,\n    1387 => 634.0,\n    1388 => 271.0,\n    1389 => 980.0,\n    1390 => 623.0,\n    1391 => 634.0,\n    1392 => 634.0,\n    1393 => 608.0,\n    1394 => 634.0,\n    1395 => 629.0,\n    1396 => 634.0,\n    1397 => 271.0,\n    1398 => 634.0,\n    1399 => 499.0,\n    1400 => 634.0,\n    1401 => 404.0,\n    1402 => 974.0,\n    1403 => 560.0,\n    1404 => 648.0,\n    1405 => 634.0,\n    1406 => 634.0,\n    1407 => 974.0,\n    1408 => 634.0,\n    1409 => 633.0,\n    1410 => 435.0,\n    1411 => 974.0,\n    1412 => 636.0,\n    1413 => 609.0,\n    1414 => 805.0,\n    1415 => 812.0,\n    1417 => 337.0,\n    1418 => 361.0,\n    1456 => 0.0,\n    1457 => 0.0,\n    1458 => 0.0,\n    1459 => 0.0,\n    1460 => 0.0,\n    1461 => 0.0,\n    1462 => 0.0,\n    1463 => 0.0,\n    1464 => 0.0,\n    1465 => 0.0,\n    1466 => 0.0,\n    1467 => 0.0,\n    1468 => 0.0,\n    1469 => 0.0,\n    1470 => 361.0,\n    1471 => 0.0,\n    1472 => 295.0,\n    1473 => 0.0,\n    1474 => 0.0,\n    1475 => 295.0,\n    1478 => 441.0,\n    1479 => 0.0,\n    1488 => 668.0,\n    1489 => 578.0,\n    1490 => 412.0,\n    1491 => 546.0,\n    1492 => 653.0,\n    1493 => 272.0,\n    1494 => 346.0,\n    1495 => 653.0,\n    1496 => 648.0,\n    1497 => 224.0,\n    1498 => 537.0,\n    1499 => 529.0,\n    1500 => 568.0,\n    1501 => 664.0,\n    1502 => 679.0,\n    1503 => 272.0,\n    1504 => 400.0,\n    1505 => 649.0,\n    1506 => 626.0,\n    1507 => 640.0,\n    1508 => 625.0,\n    1509 => 540.0,\n    1510 => 593.0,\n    1511 => 709.0,\n    1512 => 564.0,\n    1513 => 708.0,\n    1514 => 657.0,\n    1520 => 471.0,\n    1521 => 423.0,\n    1522 => 331.0,\n    1523 => 416.0,\n    1524 => 645.0,\n    1542 => 637.0,\n    1543 => 637.0,\n    1545 => 757.0,\n    1546 => 977.0,\n    1548 => 323.0,\n    1557 => 0.0,\n    1563 => 318.0,\n    1567 => 531.0,\n    1569 => 470.0,\n    1570 => 278.0,\n    1571 => 278.0,\n    1572 => 483.0,\n    1573 => 278.0,\n    1574 => 783.0,\n    1575 => 278.0,\n    1576 => 941.0,\n    1577 => 524.0,\n    1578 => 941.0,\n    1579 => 941.0,\n    1580 => 646.0,\n    1581 => 646.0,\n    1582 => 646.0,\n    1583 => 445.0,\n    1584 => 445.0,\n    1585 => 483.0,\n    1586 => 483.0,\n    1587 => 1221.0,\n    1588 => 1221.0,\n    1589 => 1209.0,\n    1590 => 1209.0,\n    1591 => 925.0,\n    1592 => 925.0,\n    1593 => 597.0,\n    1594 => 597.0,\n    1600 => 293.0,\n    1601 => 1037.0,\n    1602 => 776.0,\n    1603 => 824.0,\n    1604 => 727.0,\n    1605 => 619.0,\n    1606 => 734.0,\n    1607 => 524.0,\n    1608 => 483.0,\n    1609 => 783.0,\n    1610 => 783.0,\n    1611 => 0.0,\n    1612 => 0.0,\n    1613 => 0.0,\n    1614 => 0.0,\n    1615 => 0.0,\n    1616 => 0.0,\n    1617 => 0.0,\n    1618 => 0.0,\n    1619 => 0.0,\n    1620 => 0.0,\n    1621 => 0.0,\n    1623 => 0.0,\n    1626 => 500.0,\n    1632 => 537.0,\n    1633 => 537.0,\n    1634 => 537.0,\n    1635 => 537.0,\n    1636 => 537.0,\n    1637 => 537.0,\n    1638 => 537.0,\n    1639 => 537.0,\n    1640 => 537.0,\n    1641 => 537.0,\n    1642 => 537.0,\n    1643 => 325.0,\n    1644 => 318.0,\n    1645 => 545.0,\n    1646 => 941.0,\n    1647 => 776.0,\n    1648 => 0.0,\n    1652 => 292.0,\n    1657 => 941.0,\n    1658 => 941.0,\n    1659 => 941.0,\n    1660 => 941.0,\n    1661 => 941.0,\n    1662 => 941.0,\n    1663 => 941.0,\n    1664 => 941.0,\n    1665 => 646.0,\n    1666 => 646.0,\n    1667 => 646.0,\n    1668 => 646.0,\n    1669 => 646.0,\n    1670 => 646.0,\n    1671 => 646.0,\n    1672 => 445.0,\n    1673 => 445.0,\n    1674 => 445.0,\n    1675 => 445.0,\n    1676 => 445.0,\n    1677 => 445.0,\n    1678 => 445.0,\n    1679 => 445.0,\n    1680 => 445.0,\n    1681 => 483.0,\n    1682 => 483.0,\n    1683 => 498.0,\n    1684 => 530.0,\n    1685 => 610.0,\n    1686 => 530.0,\n    1687 => 483.0,\n    1688 => 483.0,\n    1689 => 483.0,\n    1690 => 1221.0,\n    1691 => 1221.0,\n    1692 => 1221.0,\n    1693 => 1209.0,\n    1694 => 1209.0,\n    1695 => 925.0,\n    1696 => 597.0,\n    1697 => 1037.0,\n    1698 => 1037.0,\n    1699 => 1037.0,\n    1700 => 1037.0,\n    1701 => 1037.0,\n    1702 => 1037.0,\n    1703 => 776.0,\n    1704 => 776.0,\n    1705 => 895.0,\n    1706 => 1054.0,\n    1707 => 895.0,\n    1708 => 824.0,\n    1709 => 824.0,\n    1710 => 824.0,\n    1711 => 895.0,\n    1712 => 895.0,\n    1713 => 895.0,\n    1714 => 895.0,\n    1715 => 895.0,\n    1716 => 895.0,\n    1717 => 727.0,\n    1718 => 727.0,\n    1719 => 727.0,\n    1720 => 727.0,\n    1721 => 734.0,\n    1722 => 734.0,\n    1723 => 734.0,\n    1724 => 734.0,\n    1725 => 734.0,\n    1726 => 698.0,\n    1727 => 646.0,\n    1734 => 483.0,\n    1735 => 483.0,\n    1736 => 483.0,\n    1739 => 483.0,\n    1740 => 783.0,\n    1742 => 783.0,\n    1744 => 783.0,\n    1749 => 524.0,\n    1776 => 537.0,\n    1777 => 537.0,\n    1778 => 537.0,\n    1779 => 537.0,\n    1780 => 537.0,\n    1781 => 537.0,\n    1782 => 537.0,\n    1783 => 537.0,\n    1784 => 537.0,\n    1785 => 537.0,\n    1984 => 636.0,\n    1985 => 636.0,\n    1986 => 636.0,\n    1987 => 636.0,\n    1988 => 636.0,\n    1989 => 636.0,\n    1990 => 636.0,\n    1991 => 636.0,\n    1992 => 636.0,\n    1993 => 636.0,\n    1994 => 278.0,\n    1995 => 571.0,\n    1996 => 424.0,\n    1997 => 592.0,\n    1998 => 654.0,\n    1999 => 654.0,\n    2000 => 594.0,\n    2001 => 654.0,\n    2002 => 829.0,\n    2003 => 438.0,\n    2004 => 438.0,\n    2005 => 559.0,\n    2006 => 612.0,\n    2007 => 350.0,\n    2008 => 959.0,\n    2009 => 473.0,\n    2010 => 783.0,\n    2011 => 654.0,\n    2012 => 625.0,\n    2013 => 734.0,\n    2014 => 530.0,\n    2015 => 724.0,\n    2016 => 473.0,\n    2017 => 625.0,\n    2018 => 594.0,\n    2019 => 530.0,\n    2020 => 530.0,\n    2021 => 522.0,\n    2022 => 594.0,\n    2023 => 594.0,\n    2027 => 0.0,\n    2028 => 0.0,\n    2029 => 0.0,\n    2030 => 0.0,\n    2031 => 0.0,\n    2032 => 0.0,\n    2033 => 0.0,\n    2034 => 0.0,\n    2035 => 0.0,\n    2036 => 313.0,\n    2037 => 313.0,\n    2040 => 560.0,\n    2041 => 560.0,\n    2042 => 361.0,\n    3647 => 636.0,\n    3713 => 670.0,\n    3714 => 684.0,\n    3716 => 688.0,\n    3719 => 482.0,\n    3720 => 628.0,\n    3722 => 684.0,\n    3725 => 688.0,\n    3732 => 669.0,\n    3733 => 642.0,\n    3734 => 645.0,\n    3735 => 655.0,\n    3737 => 659.0,\n    3738 => 625.0,\n    3739 => 625.0,\n    3740 => 745.0,\n    3741 => 767.0,\n    3742 => 687.0,\n    3743 => 687.0,\n    3745 => 702.0,\n    3746 => 688.0,\n    3747 => 684.0,\n    3749 => 649.0,\n    3751 => 632.0,\n    3754 => 703.0,\n    3755 => 819.0,\n    3757 => 633.0,\n    3758 => 684.0,\n    3759 => 788.0,\n    3760 => 632.0,\n    3761 => 0.0,\n    3762 => 539.0,\n    3763 => 539.0,\n    3764 => 0.0,\n    3765 => 0.0,\n    3766 => 0.0,\n    3767 => 0.0,\n    3768 => 0.0,\n    3769 => 0.0,\n    3771 => 0.0,\n    3772 => 0.0,\n    3773 => 663.0,\n    3776 => 375.0,\n    3777 => 657.0,\n    3778 => 460.0,\n    3779 => 547.0,\n    3780 => 491.0,\n    3782 => 674.0,\n    3784 => 0.0,\n    3785 => 0.0,\n    3786 => 0.0,\n    3787 => 0.0,\n    3788 => 0.0,\n    3789 => 0.0,\n    3792 => 636.0,\n    3793 => 641.0,\n    3794 => 641.0,\n    3795 => 670.0,\n    3796 => 625.0,\n    3797 => 625.0,\n    3798 => 703.0,\n    3799 => 670.0,\n    3800 => 674.0,\n    3801 => 677.0,\n    3804 => 1028.0,\n    3805 => 1028.0,\n    4256 => 874.0,\n    4257 => 733.0,\n    4258 => 679.0,\n    4259 => 834.0,\n    4260 => 615.0,\n    4261 => 768.0,\n    4262 => 753.0,\n    4263 => 914.0,\n    4264 => 453.0,\n    4265 => 620.0,\n    4266 => 843.0,\n    4267 => 882.0,\n    4268 => 625.0,\n    4269 => 854.0,\n    4270 => 781.0,\n    4271 => 629.0,\n    4272 => 912.0,\n    4273 => 621.0,\n    4274 => 620.0,\n    4275 => 854.0,\n    4276 => 866.0,\n    4277 => 724.0,\n    4278 => 630.0,\n    4279 => 621.0,\n    4280 => 625.0,\n    4281 => 620.0,\n    4282 => 818.0,\n    4283 => 874.0,\n    4284 => 615.0,\n    4285 => 623.0,\n    4286 => 625.0,\n    4287 => 725.0,\n    4288 => 844.0,\n    4289 => 596.0,\n    4290 => 688.0,\n    4291 => 596.0,\n    4292 => 594.0,\n    4293 => 738.0,\n    4304 => 508.0,\n    4305 => 518.0,\n    4306 => 581.0,\n    4307 => 818.0,\n    4308 => 508.0,\n    4309 => 513.0,\n    4310 => 500.0,\n    4311 => 801.0,\n    4312 => 518.0,\n    4313 => 510.0,\n    4314 => 1064.0,\n    4315 => 522.0,\n    4316 => 522.0,\n    4317 => 786.0,\n    4318 => 508.0,\n    4319 => 518.0,\n    4320 => 796.0,\n    4321 => 522.0,\n    4322 => 654.0,\n    4323 => 522.0,\n    4324 => 825.0,\n    4325 => 513.0,\n    4326 => 786.0,\n    4327 => 518.0,\n    4328 => 518.0,\n    4329 => 522.0,\n    4330 => 571.0,\n    4331 => 522.0,\n    4332 => 518.0,\n    4333 => 520.0,\n    4334 => 522.0,\n    4335 => 454.0,\n    4336 => 508.0,\n    4337 => 518.0,\n    4338 => 508.0,\n    4339 => 508.0,\n    4340 => 518.0,\n    4341 => 554.0,\n    4342 => 828.0,\n    4343 => 552.0,\n    4344 => 508.0,\n    4345 => 571.0,\n    4346 => 508.0,\n    4347 => 448.0,\n    4348 => 324.0,\n    5121 => 684.0,\n    5122 => 684.0,\n    5123 => 684.0,\n    5124 => 684.0,\n    5125 => 769.0,\n    5126 => 769.0,\n    5127 => 769.0,\n    5129 => 769.0,\n    5130 => 769.0,\n    5131 => 769.0,\n    5132 => 835.0,\n    5133 => 834.0,\n    5134 => 835.0,\n    5135 => 834.0,\n    5136 => 835.0,\n    5137 => 834.0,\n    5138 => 967.0,\n    5139 => 1007.0,\n    5140 => 967.0,\n    5141 => 1007.0,\n    5142 => 769.0,\n    5143 => 967.0,\n    5144 => 1007.0,\n    5145 => 967.0,\n    5146 => 1007.0,\n    5147 => 769.0,\n    5149 => 256.0,\n    5150 => 543.0,\n    5151 => 423.0,\n    5152 => 423.0,\n    5153 => 389.0,\n    5154 => 389.0,\n    5155 => 393.0,\n    5156 => 389.0,\n    5157 => 466.0,\n    5158 => 385.0,\n    5159 => 256.0,\n    5160 => 389.0,\n    5161 => 389.0,\n    5162 => 389.0,\n    5163 => 1090.0,\n    5164 => 909.0,\n    5165 => 953.0,\n    5166 => 1117.0,\n    5167 => 684.0,\n    5168 => 684.0,\n    5169 => 684.0,\n    5170 => 684.0,\n    5171 => 729.0,\n    5172 => 729.0,\n    5173 => 729.0,\n    5175 => 729.0,\n    5176 => 729.0,\n    5177 => 729.0,\n    5178 => 835.0,\n    5179 => 684.0,\n    5180 => 835.0,\n    5181 => 834.0,\n    5182 => 835.0,\n    5183 => 834.0,\n    5184 => 967.0,\n    5185 => 1007.0,\n    5186 => 967.0,\n    5187 => 1007.0,\n    5188 => 967.0,\n    5189 => 1007.0,\n    5190 => 967.0,\n    5191 => 1007.0,\n    5192 => 729.0,\n    5193 => 508.0,\n    5194 => 192.0,\n    5196 => 732.0,\n    5197 => 732.0,\n    5198 => 732.0,\n    5199 => 732.0,\n    5200 => 730.0,\n    5201 => 730.0,\n    5202 => 730.0,\n    5204 => 730.0,\n    5205 => 730.0,\n    5206 => 730.0,\n    5207 => 921.0,\n    5208 => 889.0,\n    5209 => 921.0,\n    5210 => 889.0,\n    5211 => 921.0,\n    5212 => 889.0,\n    5213 => 928.0,\n    5214 => 900.0,\n    5215 => 928.0,\n    5216 => 900.0,\n    5217 => 947.0,\n    5218 => 900.0,\n    5219 => 947.0,\n    5220 => 900.0,\n    5221 => 947.0,\n    5222 => 434.0,\n    5223 => 877.0,\n    5224 => 877.0,\n    5225 => 866.0,\n    5226 => 890.0,\n    5227 => 628.0,\n    5228 => 628.0,\n    5229 => 628.0,\n    5230 => 628.0,\n    5231 => 628.0,\n    5232 => 628.0,\n    5233 => 628.0,\n    5234 => 628.0,\n    5235 => 628.0,\n    5236 => 860.0,\n    5237 => 771.0,\n    5238 => 815.0,\n    5239 => 816.0,\n    5240 => 815.0,\n    5241 => 816.0,\n    5242 => 860.0,\n    5243 => 771.0,\n    5244 => 860.0,\n    5245 => 771.0,\n    5246 => 815.0,\n    5247 => 816.0,\n    5248 => 815.0,\n    5249 => 816.0,\n    5250 => 815.0,\n    5251 => 407.0,\n    5252 => 407.0,\n    5253 => 750.0,\n    5254 => 775.0,\n    5255 => 750.0,\n    5256 => 775.0,\n    5257 => 628.0,\n    5258 => 628.0,\n    5259 => 628.0,\n    5260 => 628.0,\n    5261 => 628.0,\n    5262 => 628.0,\n    5263 => 628.0,\n    5264 => 628.0,\n    5265 => 628.0,\n    5266 => 860.0,\n    5267 => 771.0,\n    5268 => 815.0,\n    5269 => 816.0,\n    5270 => 815.0,\n    5271 => 816.0,\n    5272 => 860.0,\n    5273 => 771.0,\n    5274 => 860.0,\n    5275 => 771.0,\n    5276 => 815.0,\n    5277 => 816.0,\n    5278 => 815.0,\n    5279 => 816.0,\n    5280 => 815.0,\n    5281 => 435.0,\n    5282 => 435.0,\n    5283 => 610.0,\n    5284 => 557.0,\n    5285 => 557.0,\n    5286 => 557.0,\n    5287 => 610.0,\n    5288 => 610.0,\n    5289 => 610.0,\n    5290 => 557.0,\n    5291 => 557.0,\n    5292 => 749.0,\n    5293 => 769.0,\n    5294 => 746.0,\n    5295 => 764.0,\n    5296 => 746.0,\n    5297 => 764.0,\n    5298 => 749.0,\n    5299 => 769.0,\n    5300 => 749.0,\n    5301 => 769.0,\n    5302 => 746.0,\n    5303 => 764.0,\n    5304 => 746.0,\n    5305 => 764.0,\n    5306 => 746.0,\n    5307 => 386.0,\n    5308 => 508.0,\n    5309 => 386.0,\n    5312 => 852.0,\n    5313 => 852.0,\n    5314 => 852.0,\n    5315 => 852.0,\n    5316 => 852.0,\n    5317 => 852.0,\n    5318 => 852.0,\n    5319 => 852.0,\n    5320 => 852.0,\n    5321 => 1069.0,\n    5322 => 1035.0,\n    5323 => 1059.0,\n    5324 => 852.0,\n    5325 => 1059.0,\n    5326 => 852.0,\n    5327 => 852.0,\n    5328 => 600.0,\n    5329 => 453.0,\n    5330 => 600.0,\n    5331 => 852.0,\n    5332 => 852.0,\n    5333 => 852.0,\n    5334 => 852.0,\n    5335 => 852.0,\n    5336 => 852.0,\n    5337 => 852.0,\n    5338 => 852.0,\n    5339 => 852.0,\n    5340 => 1069.0,\n    5341 => 1035.0,\n    5342 => 1059.0,\n    5343 => 1030.0,\n    5344 => 1059.0,\n    5345 => 1030.0,\n    5346 => 1069.0,\n    5347 => 1035.0,\n    5348 => 1069.0,\n    5349 => 1035.0,\n    5350 => 1083.0,\n    5351 => 1030.0,\n    5352 => 1083.0,\n    5353 => 1030.0,\n    5354 => 600.0,\n    5356 => 729.0,\n    5357 => 603.0,\n    5358 => 603.0,\n    5359 => 603.0,\n    5360 => 603.0,\n    5361 => 603.0,\n    5362 => 603.0,\n    5363 => 603.0,\n    5364 => 603.0,\n    5365 => 603.0,\n    5366 => 834.0,\n    5367 => 754.0,\n    5368 => 792.0,\n    5369 => 771.0,\n    5370 => 792.0,\n    5371 => 771.0,\n    5372 => 834.0,\n    5373 => 754.0,\n    5374 => 834.0,\n    5375 => 754.0,\n    5376 => 792.0,\n    5377 => 771.0,\n    5378 => 792.0,\n    5379 => 771.0,\n    5380 => 792.0,\n    5381 => 418.0,\n    5382 => 420.0,\n    5383 => 418.0,\n    5392 => 712.0,\n    5393 => 712.0,\n    5394 => 712.0,\n    5395 => 892.0,\n    5396 => 892.0,\n    5397 => 892.0,\n    5398 => 892.0,\n    5399 => 910.0,\n    5400 => 872.0,\n    5401 => 910.0,\n    5402 => 872.0,\n    5403 => 910.0,\n    5404 => 872.0,\n    5405 => 1140.0,\n    5406 => 1100.0,\n    5407 => 1140.0,\n    5408 => 1100.0,\n    5409 => 1140.0,\n    5410 => 1100.0,\n    5411 => 1140.0,\n    5412 => 1100.0,\n    5413 => 641.0,\n    5414 => 627.0,\n    5415 => 627.0,\n    5416 => 627.0,\n    5417 => 627.0,\n    5418 => 627.0,\n    5419 => 627.0,\n    5420 => 627.0,\n    5421 => 627.0,\n    5422 => 627.0,\n    5423 => 844.0,\n    5424 => 781.0,\n    5425 => 816.0,\n    5426 => 818.0,\n    5427 => 816.0,\n    5428 => 818.0,\n    5429 => 844.0,\n    5430 => 781.0,\n    5431 => 844.0,\n    5432 => 781.0,\n    5433 => 816.0,\n    5434 => 818.0,\n    5435 => 816.0,\n    5436 => 818.0,\n    5437 => 816.0,\n    5438 => 418.0,\n    5440 => 389.0,\n    5441 => 484.0,\n    5442 => 916.0,\n    5443 => 916.0,\n    5444 => 916.0,\n    5445 => 916.0,\n    5446 => 916.0,\n    5447 => 916.0,\n    5448 => 603.0,\n    5449 => 603.0,\n    5450 => 603.0,\n    5451 => 603.0,\n    5452 => 603.0,\n    5453 => 603.0,\n    5454 => 834.0,\n    5455 => 754.0,\n    5456 => 418.0,\n    5458 => 729.0,\n    5459 => 684.0,\n    5460 => 684.0,\n    5461 => 684.0,\n    5462 => 684.0,\n    5463 => 726.0,\n    5464 => 726.0,\n    5465 => 726.0,\n    5466 => 726.0,\n    5467 => 924.0,\n    5468 => 1007.0,\n    5469 => 508.0,\n    5470 => 732.0,\n    5471 => 732.0,\n    5472 => 732.0,\n    5473 => 732.0,\n    5474 => 732.0,\n    5475 => 732.0,\n    5476 => 730.0,\n    5477 => 730.0,\n    5478 => 730.0,\n    5479 => 730.0,\n    5480 => 947.0,\n    5481 => 900.0,\n    5482 => 508.0,\n    5492 => 831.0,\n    5493 => 831.0,\n    5494 => 831.0,\n    5495 => 831.0,\n    5496 => 831.0,\n    5497 => 831.0,\n    5498 => 831.0,\n    5499 => 563.0,\n    5500 => 752.0,\n    5501 => 484.0,\n    5502 => 1047.0,\n    5503 => 1047.0,\n    5504 => 1047.0,\n    5505 => 1047.0,\n    5506 => 1047.0,\n    5507 => 1047.0,\n    5508 => 1047.0,\n    5509 => 825.0,\n    5514 => 831.0,\n    5515 => 831.0,\n    5516 => 831.0,\n    5517 => 831.0,\n    5518 => 1259.0,\n    5519 => 1259.0,\n    5520 => 1259.0,\n    5521 => 1002.0,\n    5522 => 1002.0,\n    5523 => 1259.0,\n    5524 => 1259.0,\n    5525 => 700.0,\n    5526 => 1073.0,\n    5536 => 852.0,\n    5537 => 852.0,\n    5538 => 852.0,\n    5539 => 852.0,\n    5540 => 852.0,\n    5541 => 852.0,\n    5542 => 600.0,\n    5543 => 643.0,\n    5544 => 643.0,\n    5545 => 643.0,\n    5546 => 643.0,\n    5547 => 643.0,\n    5548 => 643.0,\n    5549 => 643.0,\n    5550 => 418.0,\n    5551 => 628.0,\n    5598 => 770.0,\n    5601 => 767.0,\n    5702 => 468.0,\n    5703 => 468.0,\n    5742 => 444.0,\n    5743 => 1047.0,\n    5744 => 1310.0,\n    5745 => 1632.0,\n    5746 => 1632.0,\n    5747 => 1375.0,\n    5748 => 1375.0,\n    5749 => 1632.0,\n    5750 => 1632.0,\n    5760 => 477.0,\n    5761 => 493.0,\n    5762 => 712.0,\n    5763 => 931.0,\n    5764 => 1150.0,\n    5765 => 1370.0,\n    5766 => 493.0,\n    5767 => 712.0,\n    5768 => 931.0,\n    5769 => 1150.0,\n    5770 => 1370.0,\n    5771 => 498.0,\n    5772 => 718.0,\n    5773 => 938.0,\n    5774 => 1159.0,\n    5775 => 1379.0,\n    5776 => 493.0,\n    5777 => 712.0,\n    5778 => 930.0,\n    5779 => 1149.0,\n    5780 => 1370.0,\n    5781 => 498.0,\n    5782 => 752.0,\n    5783 => 789.0,\n    5784 => 1205.0,\n    5785 => 1150.0,\n    5786 => 683.0,\n    5787 => 507.0,\n    5788 => 507.0,\n    7424 => 592.0,\n    7425 => 717.0,\n    7426 => 982.0,\n    7427 => 586.0,\n    7428 => 550.0,\n    7429 => 605.0,\n    7430 => 605.0,\n    7431 => 491.0,\n    7432 => 541.0,\n    7433 => 278.0,\n    7434 => 395.0,\n    7435 => 579.0,\n    7436 => 583.0,\n    7437 => 754.0,\n    7438 => 650.0,\n    7439 => 612.0,\n    7440 => 550.0,\n    7441 => 684.0,\n    7442 => 684.0,\n    7443 => 684.0,\n    7444 => 1023.0,\n    7446 => 612.0,\n    7447 => 612.0,\n    7448 => 524.0,\n    7449 => 602.0,\n    7450 => 602.0,\n    7451 => 583.0,\n    7452 => 574.0,\n    7453 => 737.0,\n    7454 => 948.0,\n    7455 => 638.0,\n    7456 => 592.0,\n    7457 => 818.0,\n    7458 => 525.0,\n    7459 => 526.0,\n    7462 => 583.0,\n    7463 => 592.0,\n    7464 => 564.0,\n    7465 => 524.0,\n    7466 => 590.0,\n    7467 => 639.0,\n    7468 => 431.0,\n    7469 => 613.0,\n    7470 => 432.0,\n    7472 => 485.0,\n    7473 => 398.0,\n    7474 => 398.0,\n    7475 => 488.0,\n    7476 => 474.0,\n    7477 => 186.0,\n    7478 => 186.0,\n    7479 => 413.0,\n    7480 => 351.0,\n    7481 => 543.0,\n    7482 => 471.0,\n    7483 => 471.0,\n    7484 => 496.0,\n    7485 => 439.0,\n    7486 => 380.0,\n    7487 => 438.0,\n    7488 => 385.0,\n    7489 => 461.0,\n    7490 => 623.0,\n    7491 => 392.0,\n    7492 => 392.0,\n    7493 => 405.0,\n    7494 => 648.0,\n    7495 => 428.0,\n    7496 => 405.0,\n    7497 => 417.0,\n    7498 => 417.0,\n    7499 => 360.0,\n    7500 => 359.0,\n    7501 => 405.0,\n    7502 => 179.0,\n    7503 => 426.0,\n    7504 => 623.0,\n    7505 => 409.0,\n    7506 => 414.0,\n    7507 => 370.0,\n    7508 => 414.0,\n    7509 => 414.0,\n    7510 => 428.0,\n    7511 => 295.0,\n    7512 => 405.0,\n    7513 => 470.0,\n    7514 => 623.0,\n    7515 => 417.0,\n    7517 => 402.0,\n    7518 => 373.0,\n    7519 => 385.0,\n    7520 => 416.0,\n    7521 => 364.0,\n    7522 => 179.0,\n    7523 => 259.0,\n    7524 => 405.0,\n    7525 => 417.0,\n    7526 => 402.0,\n    7527 => 373.0,\n    7528 => 412.0,\n    7529 => 416.0,\n    7530 => 364.0,\n    7543 => 635.0,\n    7544 => 474.0,\n    7547 => 372.0,\n    7549 => 667.0,\n    7557 => 278.0,\n    7579 => 405.0,\n    7580 => 370.0,\n    7581 => 370.0,\n    7582 => 414.0,\n    7583 => 360.0,\n    7584 => 296.0,\n    7585 => 233.0,\n    7586 => 405.0,\n    7587 => 405.0,\n    7588 => 261.0,\n    7589 => 250.0,\n    7590 => 261.0,\n    7591 => 261.0,\n    7592 => 234.0,\n    7593 => 250.0,\n    7594 => 235.0,\n    7595 => 376.0,\n    7596 => 623.0,\n    7597 => 623.0,\n    7598 => 411.0,\n    7599 => 479.0,\n    7600 => 409.0,\n    7601 => 414.0,\n    7602 => 414.0,\n    7603 => 360.0,\n    7604 => 287.0,\n    7605 => 295.0,\n    7606 => 508.0,\n    7607 => 418.0,\n    7608 => 361.0,\n    7609 => 406.0,\n    7610 => 417.0,\n    7611 => 366.0,\n    7612 => 437.0,\n    7613 => 366.0,\n    7614 => 392.0,\n    7615 => 414.0,\n    7620 => 0.0,\n    7621 => 0.0,\n    7622 => 0.0,\n    7623 => 0.0,\n    7624 => 0.0,\n    7625 => 0.0,\n    7680 => 684.0,\n    7681 => 613.0,\n    7682 => 686.0,\n    7683 => 635.0,\n    7684 => 686.0,\n    7685 => 635.0,\n    7686 => 686.0,\n    7687 => 635.0,\n    7688 => 698.0,\n    7689 => 550.0,\n    7690 => 770.0,\n    7691 => 635.0,\n    7692 => 770.0,\n    7693 => 635.0,\n    7694 => 770.0,\n    7695 => 635.0,\n    7696 => 770.0,\n    7697 => 635.0,\n    7698 => 770.0,\n    7699 => 635.0,\n    7700 => 632.0,\n    7701 => 615.0,\n    7702 => 632.0,\n    7703 => 615.0,\n    7704 => 632.0,\n    7705 => 615.0,\n    7706 => 632.0,\n    7707 => 615.0,\n    7708 => 632.0,\n    7709 => 615.0,\n    7710 => 575.0,\n    7711 => 352.0,\n    7712 => 775.0,\n    7713 => 635.0,\n    7714 => 752.0,\n    7715 => 634.0,\n    7716 => 752.0,\n    7717 => 634.0,\n    7718 => 752.0,\n    7719 => 634.0,\n    7720 => 752.0,\n    7721 => 634.0,\n    7722 => 752.0,\n    7723 => 634.0,\n    7724 => 295.0,\n    7725 => 278.0,\n    7726 => 295.0,\n    7727 => 278.0,\n    7728 => 656.0,\n    7729 => 579.0,\n    7730 => 656.0,\n    7731 => 579.0,\n    7732 => 656.0,\n    7733 => 579.0,\n    7734 => 557.0,\n    7735 => 288.0,\n    7736 => 557.0,\n    7737 => 288.0,\n    7738 => 557.0,\n    7739 => 278.0,\n    7740 => 557.0,\n    7741 => 278.0,\n    7742 => 863.0,\n    7743 => 974.0,\n    7744 => 863.0,\n    7745 => 974.0,\n    7746 => 863.0,\n    7747 => 974.0,\n    7748 => 748.0,\n    7749 => 634.0,\n    7750 => 748.0,\n    7751 => 634.0,\n    7752 => 748.0,\n    7753 => 634.0,\n    7754 => 748.0,\n    7755 => 634.0,\n    7756 => 787.0,\n    7757 => 612.0,\n    7758 => 787.0,\n    7759 => 612.0,\n    7760 => 787.0,\n    7761 => 612.0,\n    7762 => 787.0,\n    7763 => 612.0,\n    7764 => 603.0,\n    7765 => 635.0,\n    7766 => 603.0,\n    7767 => 635.0,\n    7768 => 695.0,\n    7769 => 411.0,\n    7770 => 695.0,\n    7771 => 411.0,\n    7772 => 695.0,\n    7773 => 411.0,\n    7774 => 695.0,\n    7775 => 411.0,\n    7776 => 635.0,\n    7777 => 521.0,\n    7778 => 635.0,\n    7779 => 521.0,\n    7780 => 635.0,\n    7781 => 521.0,\n    7782 => 635.0,\n    7783 => 521.0,\n    7784 => 635.0,\n    7785 => 521.0,\n    7786 => 611.0,\n    7787 => 392.0,\n    7788 => 611.0,\n    7789 => 392.0,\n    7790 => 611.0,\n    7791 => 392.0,\n    7792 => 611.0,\n    7793 => 392.0,\n    7794 => 732.0,\n    7795 => 634.0,\n    7796 => 732.0,\n    7797 => 634.0,\n    7798 => 732.0,\n    7799 => 634.0,\n    7800 => 732.0,\n    7801 => 634.0,\n    7802 => 732.0,\n    7803 => 634.0,\n    7804 => 684.0,\n    7805 => 592.0,\n    7806 => 684.0,\n    7807 => 592.0,\n    7808 => 989.0,\n    7809 => 818.0,\n    7810 => 989.0,\n    7811 => 818.0,\n    7812 => 989.0,\n    7813 => 818.0,\n    7814 => 989.0,\n    7815 => 818.0,\n    7816 => 989.0,\n    7817 => 818.0,\n    7818 => 685.0,\n    7819 => 592.0,\n    7820 => 685.0,\n    7821 => 592.0,\n    7822 => 611.0,\n    7823 => 592.0,\n    7824 => 685.0,\n    7825 => 525.0,\n    7826 => 685.0,\n    7827 => 525.0,\n    7828 => 685.0,\n    7829 => 525.0,\n    7830 => 634.0,\n    7831 => 392.0,\n    7832 => 818.0,\n    7833 => 592.0,\n    7834 => 613.0,\n    7835 => 352.0,\n    7836 => 352.0,\n    7837 => 352.0,\n    7838 => 769.0,\n    7839 => 612.0,\n    7840 => 684.0,\n    7841 => 613.0,\n    7842 => 684.0,\n    7843 => 613.0,\n    7844 => 684.0,\n    7845 => 613.0,\n    7846 => 684.0,\n    7847 => 613.0,\n    7848 => 684.0,\n    7849 => 613.0,\n    7850 => 684.0,\n    7851 => 613.0,\n    7852 => 684.0,\n    7853 => 613.0,\n    7854 => 684.0,\n    7855 => 613.0,\n    7856 => 684.0,\n    7857 => 613.0,\n    7858 => 684.0,\n    7859 => 613.0,\n    7860 => 684.0,\n    7861 => 613.0,\n    7862 => 684.0,\n    7863 => 613.0,\n    7864 => 632.0,\n    7865 => 615.0,\n    7866 => 632.0,\n    7867 => 615.0,\n    7868 => 632.0,\n    7869 => 615.0,\n    7870 => 632.0,\n    7871 => 615.0,\n    7872 => 632.0,\n    7873 => 615.0,\n    7874 => 632.0,\n    7875 => 615.0,\n    7876 => 632.0,\n    7877 => 615.0,\n    7878 => 632.0,\n    7879 => 615.0,\n    7880 => 295.0,\n    7881 => 278.0,\n    7882 => 295.0,\n    7883 => 278.0,\n    7884 => 787.0,\n    7885 => 612.0,\n    7886 => 787.0,\n    7887 => 612.0,\n    7888 => 787.0,\n    7889 => 612.0,\n    7890 => 787.0,\n    7891 => 612.0,\n    7892 => 787.0,\n    7893 => 612.0,\n    7894 => 787.0,\n    7895 => 612.0,\n    7896 => 787.0,\n    7897 => 612.0,\n    7898 => 913.0,\n    7899 => 612.0,\n    7900 => 913.0,\n    7901 => 612.0,\n    7902 => 913.0,\n    7903 => 612.0,\n    7904 => 913.0,\n    7905 => 612.0,\n    7906 => 913.0,\n    7907 => 612.0,\n    7908 => 732.0,\n    7909 => 634.0,\n    7910 => 732.0,\n    7911 => 634.0,\n    7912 => 858.0,\n    7913 => 634.0,\n    7914 => 858.0,\n    7915 => 634.0,\n    7916 => 858.0,\n    7917 => 634.0,\n    7918 => 858.0,\n    7919 => 634.0,\n    7920 => 858.0,\n    7921 => 634.0,\n    7922 => 611.0,\n    7923 => 592.0,\n    7924 => 611.0,\n    7925 => 592.0,\n    7926 => 611.0,\n    7927 => 592.0,\n    7928 => 611.0,\n    7929 => 592.0,\n    7930 => 769.0,\n    7931 => 477.0,\n    7936 => 659.0,\n    7937 => 659.0,\n    7938 => 659.0,\n    7939 => 659.0,\n    7940 => 659.0,\n    7941 => 659.0,\n    7942 => 659.0,\n    7943 => 659.0,\n    7944 => 684.0,\n    7945 => 684.0,\n    7946 => 877.0,\n    7947 => 877.0,\n    7948 => 769.0,\n    7949 => 801.0,\n    7950 => 708.0,\n    7951 => 743.0,\n    7952 => 541.0,\n    7953 => 541.0,\n    7954 => 541.0,\n    7955 => 541.0,\n    7956 => 541.0,\n    7957 => 541.0,\n    7960 => 711.0,\n    7961 => 711.0,\n    7962 => 966.0,\n    7963 => 975.0,\n    7964 => 898.0,\n    7965 => 928.0,\n    7968 => 634.0,\n    7969 => 634.0,\n    7970 => 634.0,\n    7971 => 634.0,\n    7972 => 634.0,\n    7973 => 634.0,\n    7974 => 634.0,\n    7975 => 634.0,\n    7976 => 837.0,\n    7977 => 835.0,\n    7978 => 1086.0,\n    7979 => 1089.0,\n    7980 => 1027.0,\n    7981 => 1051.0,\n    7982 => 934.0,\n    7983 => 947.0,\n    7984 => 338.0,\n    7985 => 338.0,\n    7986 => 338.0,\n    7987 => 338.0,\n    7988 => 338.0,\n    7989 => 338.0,\n    7990 => 338.0,\n    7991 => 338.0,\n    7992 => 380.0,\n    7993 => 374.0,\n    7994 => 635.0,\n    7995 => 635.0,\n    7996 => 570.0,\n    7997 => 600.0,\n    7998 => 489.0,\n    7999 => 493.0,\n    8000 => 612.0,\n    8001 => 612.0,\n    8002 => 612.0,\n    8003 => 612.0,\n    8004 => 612.0,\n    8005 => 612.0,\n    8008 => 804.0,\n    8009 => 848.0,\n    8010 => 1095.0,\n    8011 => 1100.0,\n    8012 => 938.0,\n    8013 => 970.0,\n    8016 => 579.0,\n    8017 => 579.0,\n    8018 => 579.0,\n    8019 => 579.0,\n    8020 => 579.0,\n    8021 => 579.0,\n    8022 => 579.0,\n    8023 => 579.0,\n    8025 => 784.0,\n    8027 => 998.0,\n    8029 => 1012.0,\n    8031 => 897.0,\n    8032 => 837.0,\n    8033 => 837.0,\n    8034 => 837.0,\n    8035 => 837.0,\n    8036 => 837.0,\n    8037 => 837.0,\n    8038 => 837.0,\n    8039 => 837.0,\n    8040 => 802.0,\n    8041 => 843.0,\n    8042 => 1089.0,\n    8043 => 1095.0,\n    8044 => 946.0,\n    8045 => 972.0,\n    8046 => 921.0,\n    8047 => 952.0,\n    8048 => 659.0,\n    8049 => 659.0,\n    8050 => 541.0,\n    8051 => 548.0,\n    8052 => 634.0,\n    8053 => 654.0,\n    8054 => 338.0,\n    8055 => 338.0,\n    8056 => 612.0,\n    8057 => 612.0,\n    8058 => 579.0,\n    8059 => 579.0,\n    8060 => 837.0,\n    8061 => 837.0,\n    8064 => 659.0,\n    8065 => 659.0,\n    8066 => 659.0,\n    8067 => 659.0,\n    8068 => 659.0,\n    8069 => 659.0,\n    8070 => 659.0,\n    8071 => 659.0,\n    8072 => 684.0,\n    8073 => 684.0,\n    8074 => 877.0,\n    8075 => 877.0,\n    8076 => 769.0,\n    8077 => 801.0,\n    8078 => 708.0,\n    8079 => 743.0,\n    8080 => 634.0,\n    8081 => 634.0,\n    8082 => 634.0,\n    8083 => 634.0,\n    8084 => 634.0,\n    8085 => 634.0,\n    8086 => 634.0,\n    8087 => 634.0,\n    8088 => 837.0,\n    8089 => 835.0,\n    8090 => 1086.0,\n    8091 => 1089.0,\n    8092 => 1027.0,\n    8093 => 1051.0,\n    8094 => 934.0,\n    8095 => 947.0,\n    8096 => 837.0,\n    8097 => 837.0,\n    8098 => 837.0,\n    8099 => 837.0,\n    8100 => 837.0,\n    8101 => 837.0,\n    8102 => 837.0,\n    8103 => 837.0,\n    8104 => 802.0,\n    8105 => 843.0,\n    8106 => 1089.0,\n    8107 => 1095.0,\n    8108 => 946.0,\n    8109 => 972.0,\n    8110 => 921.0,\n    8111 => 952.0,\n    8112 => 659.0,\n    8113 => 659.0,\n    8114 => 659.0,\n    8115 => 659.0,\n    8116 => 659.0,\n    8118 => 659.0,\n    8119 => 659.0,\n    8120 => 684.0,\n    8121 => 684.0,\n    8122 => 716.0,\n    8123 => 692.0,\n    8124 => 684.0,\n    8125 => 500.0,\n    8126 => 500.0,\n    8127 => 500.0,\n    8128 => 500.0,\n    8129 => 500.0,\n    8130 => 634.0,\n    8131 => 634.0,\n    8132 => 654.0,\n    8134 => 634.0,\n    8135 => 634.0,\n    8136 => 805.0,\n    8137 => 746.0,\n    8138 => 931.0,\n    8139 => 871.0,\n    8140 => 752.0,\n    8141 => 500.0,\n    8142 => 500.0,\n    8143 => 500.0,\n    8144 => 338.0,\n    8145 => 338.0,\n    8146 => 338.0,\n    8147 => 338.0,\n    8150 => 338.0,\n    8151 => 338.0,\n    8152 => 295.0,\n    8153 => 295.0,\n    8154 => 475.0,\n    8155 => 408.0,\n    8157 => 500.0,\n    8158 => 500.0,\n    8159 => 500.0,\n    8160 => 579.0,\n    8161 => 579.0,\n    8162 => 579.0,\n    8163 => 579.0,\n    8164 => 635.0,\n    8165 => 635.0,\n    8166 => 579.0,\n    8167 => 579.0,\n    8168 => 611.0,\n    8169 => 611.0,\n    8170 => 845.0,\n    8171 => 825.0,\n    8172 => 685.0,\n    8173 => 500.0,\n    8174 => 500.0,\n    8175 => 500.0,\n    8178 => 837.0,\n    8179 => 837.0,\n    8180 => 837.0,\n    8182 => 837.0,\n    8183 => 837.0,\n    8184 => 941.0,\n    8185 => 813.0,\n    8186 => 922.0,\n    8187 => 826.0,\n    8188 => 764.0,\n    8189 => 500.0,\n    8190 => 500.0,\n    8192 => 500.0,\n    8193 => 1000.0,\n    8194 => 500.0,\n    8195 => 1000.0,\n    8196 => 330.0,\n    8197 => 250.0,\n    8198 => 167.0,\n    8199 => 636.0,\n    8200 => 318.0,\n    8201 => 200.0,\n    8202 => 100.0,\n    8203 => 0.0,\n    8204 => 0.0,\n    8205 => 0.0,\n    8206 => 0.0,\n    8207 => 0.0,\n    8208 => 361.0,\n    8209 => 361.0,\n    8210 => 636.0,\n    8211 => 500.0,\n    8212 => 1000.0,\n    8213 => 1000.0,\n    8214 => 500.0,\n    8215 => 500.0,\n    8216 => 318.0,\n    8217 => 318.0,\n    8218 => 318.0,\n    8219 => 318.0,\n    8220 => 518.0,\n    8221 => 518.0,\n    8222 => 518.0,\n    8223 => 518.0,\n    8224 => 500.0,\n    8225 => 500.0,\n    8226 => 590.0,\n    8227 => 590.0,\n    8228 => 334.0,\n    8229 => 667.0,\n    8230 => 1000.0,\n    8231 => 318.0,\n    8232 => 0.0,\n    8233 => 0.0,\n    8234 => 0.0,\n    8235 => 0.0,\n    8236 => 0.0,\n    8237 => 0.0,\n    8238 => 0.0,\n    8239 => 200.0,\n    8240 => 1342.0,\n    8241 => 1735.0,\n    8242 => 227.0,\n    8243 => 374.0,\n    8244 => 520.0,\n    8245 => 227.0,\n    8246 => 374.0,\n    8247 => 520.0,\n    8248 => 339.0,\n    8249 => 400.0,\n    8250 => 400.0,\n    8251 => 838.0,\n    8252 => 485.0,\n    8253 => 531.0,\n    8254 => 500.0,\n    8255 => 804.0,\n    8256 => 804.0,\n    8257 => 250.0,\n    8258 => 1000.0,\n    8259 => 500.0,\n    8260 => 167.0,\n    8261 => 390.0,\n    8262 => 390.0,\n    8263 => 922.0,\n    8264 => 733.0,\n    8265 => 733.0,\n    8266 => 497.0,\n    8267 => 636.0,\n    8268 => 500.0,\n    8269 => 500.0,\n    8270 => 500.0,\n    8271 => 337.0,\n    8272 => 804.0,\n    8273 => 500.0,\n    8274 => 450.0,\n    8275 => 1000.0,\n    8276 => 804.0,\n    8277 => 838.0,\n    8278 => 586.0,\n    8279 => 663.0,\n    8280 => 838.0,\n    8281 => 838.0,\n    8282 => 318.0,\n    8283 => 797.0,\n    8284 => 838.0,\n    8285 => 318.0,\n    8286 => 318.0,\n    8287 => 222.0,\n    8288 => 0.0,\n    8289 => 0.0,\n    8290 => 0.0,\n    8291 => 0.0,\n    8292 => 0.0,\n    8298 => 0.0,\n    8299 => 0.0,\n    8300 => 0.0,\n    8301 => 0.0,\n    8302 => 0.0,\n    8303 => 0.0,\n    8304 => 401.0,\n    8305 => 179.0,\n    8308 => 401.0,\n    8309 => 401.0,\n    8310 => 401.0,\n    8311 => 401.0,\n    8312 => 401.0,\n    8313 => 401.0,\n    8314 => 528.0,\n    8315 => 528.0,\n    8316 => 528.0,\n    8317 => 246.0,\n    8318 => 246.0,\n    8319 => 398.0,\n    8320 => 401.0,\n    8321 => 401.0,\n    8322 => 401.0,\n    8323 => 401.0,\n    8324 => 401.0,\n    8325 => 401.0,\n    8326 => 401.0,\n    8327 => 401.0,\n    8328 => 401.0,\n    8329 => 401.0,\n    8330 => 528.0,\n    8331 => 528.0,\n    8332 => 528.0,\n    8333 => 246.0,\n    8334 => 246.0,\n    8336 => 392.0,\n    8337 => 417.0,\n    8338 => 414.0,\n    8339 => 444.0,\n    8340 => 417.0,\n    8341 => 404.0,\n    8342 => 426.0,\n    8343 => 166.0,\n    8344 => 623.0,\n    8345 => 398.0,\n    8346 => 428.0,\n    8347 => 373.0,\n    8348 => 295.0,\n    8352 => 877.0,\n    8353 => 636.0,\n    8354 => 636.0,\n    8355 => 636.0,\n    8356 => 636.0,\n    8357 => 974.0,\n    8358 => 636.0,\n    8359 => 1272.0,\n    8360 => 1074.0,\n    8361 => 989.0,\n    8362 => 784.0,\n    8363 => 636.0,\n    8364 => 636.0,\n    8365 => 636.0,\n    8366 => 636.0,\n    8367 => 1272.0,\n    8368 => 636.0,\n    8369 => 636.0,\n    8370 => 636.0,\n    8371 => 636.0,\n    8372 => 774.0,\n    8373 => 636.0,\n    8376 => 636.0,\n    8377 => 636.0,\n    8378 => 636.0,\n    8381 => 636.0,\n    8400 => 0.0,\n    8401 => 0.0,\n    8406 => 0.0,\n    8407 => 0.0,\n    8411 => 0.0,\n    8412 => 0.0,\n    8417 => 0.0,\n    8448 => 1019.0,\n    8449 => 1019.0,\n    8450 => 698.0,\n    8451 => 1123.0,\n    8452 => 642.0,\n    8453 => 1019.0,\n    8454 => 1067.0,\n    8455 => 614.0,\n    8456 => 698.0,\n    8457 => 952.0,\n    8459 => 988.0,\n    8460 => 754.0,\n    8461 => 850.0,\n    8462 => 634.0,\n    8463 => 634.0,\n    8464 => 470.0,\n    8465 => 697.0,\n    8466 => 720.0,\n    8467 => 413.0,\n    8468 => 818.0,\n    8469 => 801.0,\n    8470 => 1040.0,\n    8471 => 1000.0,\n    8472 => 697.0,\n    8473 => 701.0,\n    8474 => 787.0,\n    8475 => 798.0,\n    8476 => 814.0,\n    8477 => 792.0,\n    8478 => 896.0,\n    8479 => 684.0,\n    8480 => 1020.0,\n    8481 => 1074.0,\n    8482 => 1000.0,\n    8483 => 684.0,\n    8484 => 745.0,\n    8485 => 578.0,\n    8486 => 764.0,\n    8487 => 764.0,\n    8488 => 616.0,\n    8489 => 338.0,\n    8490 => 656.0,\n    8491 => 684.0,\n    8492 => 786.0,\n    8493 => 703.0,\n    8494 => 854.0,\n    8495 => 592.0,\n    8496 => 605.0,\n    8497 => 786.0,\n    8498 => 575.0,\n    8499 => 1069.0,\n    8500 => 462.0,\n    8501 => 745.0,\n    8502 => 674.0,\n    8503 => 466.0,\n    8504 => 645.0,\n    8505 => 380.0,\n    8506 => 926.0,\n    8507 => 1194.0,\n    8508 => 702.0,\n    8509 => 728.0,\n    8510 => 654.0,\n    8511 => 849.0,\n    8512 => 811.0,\n    8513 => 775.0,\n    8514 => 557.0,\n    8515 => 557.0,\n    8516 => 611.0,\n    8517 => 819.0,\n    8518 => 708.0,\n    8519 => 615.0,\n    8520 => 351.0,\n    8521 => 351.0,\n    8523 => 780.0,\n    8526 => 526.0,\n    8528 => 969.0,\n    8529 => 969.0,\n    8530 => 1370.0,\n    8531 => 969.0,\n    8532 => 969.0,\n    8533 => 969.0,\n    8534 => 969.0,\n    8535 => 969.0,\n    8536 => 969.0,\n    8537 => 969.0,\n    8538 => 969.0,\n    8539 => 969.0,\n    8540 => 969.0,\n    8541 => 969.0,\n    8542 => 969.0,\n    8543 => 568.0,\n    8544 => 295.0,\n    8545 => 492.0,\n    8546 => 689.0,\n    8547 => 923.0,\n    8548 => 684.0,\n    8549 => 922.0,\n    8550 => 1120.0,\n    8551 => 1317.0,\n    8552 => 917.0,\n    8553 => 685.0,\n    8554 => 933.0,\n    8555 => 1131.0,\n    8556 => 557.0,\n    8557 => 698.0,\n    8558 => 770.0,\n    8559 => 863.0,\n    8560 => 278.0,\n    8561 => 458.0,\n    8562 => 637.0,\n    8563 => 812.0,\n    8564 => 592.0,\n    8565 => 811.0,\n    8566 => 991.0,\n    8567 => 1170.0,\n    8568 => 819.0,\n    8569 => 592.0,\n    8570 => 822.0,\n    8571 => 1002.0,\n    8572 => 278.0,\n    8573 => 550.0,\n    8574 => 635.0,\n    8575 => 974.0,\n    8576 => 1245.0,\n    8577 => 770.0,\n    8578 => 1245.0,\n    8579 => 703.0,\n    8580 => 549.0,\n    8581 => 698.0,\n    8585 => 969.0,\n    8592 => 838.0,\n    8593 => 838.0,\n    8594 => 838.0,\n    8595 => 838.0,\n    8596 => 838.0,\n    8597 => 838.0,\n    8598 => 838.0,\n    8599 => 838.0,\n    8600 => 838.0,\n    8601 => 838.0,\n    8602 => 838.0,\n    8603 => 838.0,\n    8604 => 838.0,\n    8605 => 838.0,\n    8606 => 838.0,\n    8607 => 838.0,\n    8608 => 838.0,\n    8609 => 838.0,\n    8610 => 838.0,\n    8611 => 838.0,\n    8612 => 838.0,\n    8613 => 838.0,\n    8614 => 838.0,\n    8615 => 838.0,\n    8616 => 838.0,\n    8617 => 838.0,\n    8618 => 838.0,\n    8619 => 838.0,\n    8620 => 838.0,\n    8621 => 838.0,\n    8622 => 838.0,\n    8623 => 838.0,\n    8624 => 838.0,\n    8625 => 838.0,\n    8626 => 838.0,\n    8627 => 838.0,\n    8628 => 838.0,\n    8629 => 838.0,\n    8630 => 838.0,\n    8631 => 838.0,\n    8632 => 838.0,\n    8633 => 838.0,\n    8634 => 838.0,\n    8635 => 838.0,\n    8636 => 838.0,\n    8637 => 838.0,\n    8638 => 838.0,\n    8639 => 838.0,\n    8640 => 838.0,\n    8641 => 838.0,\n    8642 => 838.0,\n    8643 => 838.0,\n    8644 => 838.0,\n    8645 => 838.0,\n    8646 => 838.0,\n    8647 => 838.0,\n    8648 => 838.0,\n    8649 => 838.0,\n    8650 => 838.0,\n    8651 => 838.0,\n    8652 => 838.0,\n    8653 => 838.0,\n    8654 => 838.0,\n    8655 => 838.0,\n    8656 => 838.0,\n    8657 => 838.0,\n    8658 => 838.0,\n    8659 => 838.0,\n    8660 => 838.0,\n    8661 => 838.0,\n    8662 => 838.0,\n    8663 => 838.0,\n    8664 => 838.0,\n    8665 => 838.0,\n    8666 => 838.0,\n    8667 => 838.0,\n    8668 => 838.0,\n    8669 => 838.0,\n    8670 => 838.0,\n    8671 => 838.0,\n    8672 => 838.0,\n    8673 => 838.0,\n    8674 => 838.0,\n    8675 => 838.0,\n    8676 => 838.0,\n    8677 => 838.0,\n    8678 => 838.0,\n    8679 => 838.0,\n    8680 => 838.0,\n    8681 => 838.0,\n    8682 => 838.0,\n    8683 => 838.0,\n    8684 => 838.0,\n    8685 => 838.0,\n    8686 => 838.0,\n    8687 => 838.0,\n    8688 => 838.0,\n    8689 => 838.0,\n    8690 => 838.0,\n    8691 => 838.0,\n    8692 => 838.0,\n    8693 => 838.0,\n    8694 => 838.0,\n    8695 => 838.0,\n    8696 => 838.0,\n    8697 => 838.0,\n    8698 => 838.0,\n    8699 => 838.0,\n    8700 => 838.0,\n    8701 => 838.0,\n    8702 => 838.0,\n    8703 => 838.0,\n    8704 => 684.0,\n    8705 => 636.0,\n    8706 => 517.0,\n    8707 => 632.0,\n    8708 => 632.0,\n    8709 => 871.0,\n    8710 => 669.0,\n    8711 => 669.0,\n    8712 => 871.0,\n    8713 => 871.0,\n    8714 => 718.0,\n    8715 => 871.0,\n    8716 => 871.0,\n    8717 => 718.0,\n    8718 => 636.0,\n    8719 => 757.0,\n    8720 => 757.0,\n    8721 => 674.0,\n    8722 => 838.0,\n    8723 => 838.0,\n    8724 => 838.0,\n    8725 => 337.0,\n    8726 => 637.0,\n    8727 => 838.0,\n    8728 => 626.0,\n    8729 => 626.0,\n    8730 => 637.0,\n    8731 => 637.0,\n    8732 => 637.0,\n    8733 => 714.0,\n    8734 => 833.0,\n    8735 => 838.0,\n    8736 => 896.0,\n    8737 => 896.0,\n    8738 => 838.0,\n    8739 => 500.0,\n    8740 => 500.0,\n    8741 => 500.0,\n    8742 => 500.0,\n    8743 => 732.0,\n    8744 => 732.0,\n    8745 => 732.0,\n    8746 => 732.0,\n    8747 => 521.0,\n    8748 => 789.0,\n    8749 => 1057.0,\n    8750 => 521.0,\n    8751 => 789.0,\n    8752 => 1057.0,\n    8753 => 521.0,\n    8754 => 521.0,\n    8755 => 521.0,\n    8756 => 636.0,\n    8757 => 636.0,\n    8758 => 260.0,\n    8759 => 636.0,\n    8760 => 838.0,\n    8761 => 838.0,\n    8762 => 838.0,\n    8763 => 838.0,\n    8764 => 838.0,\n    8765 => 838.0,\n    8766 => 838.0,\n    8767 => 838.0,\n    8768 => 375.0,\n    8769 => 838.0,\n    8770 => 838.0,\n    8771 => 838.0,\n    8772 => 838.0,\n    8773 => 838.0,\n    8774 => 838.0,\n    8775 => 838.0,\n    8776 => 838.0,\n    8777 => 838.0,\n    8778 => 838.0,\n    8779 => 838.0,\n    8780 => 838.0,\n    8781 => 838.0,\n    8782 => 838.0,\n    8783 => 838.0,\n    8784 => 838.0,\n    8785 => 838.0,\n    8786 => 839.0,\n    8787 => 839.0,\n    8788 => 1000.0,\n    8789 => 1000.0,\n    8790 => 838.0,\n    8791 => 838.0,\n    8792 => 838.0,\n    8793 => 838.0,\n    8794 => 838.0,\n    8795 => 838.0,\n    8796 => 838.0,\n    8797 => 838.0,\n    8798 => 838.0,\n    8799 => 838.0,\n    8800 => 838.0,\n    8801 => 838.0,\n    8802 => 838.0,\n    8803 => 838.0,\n    8804 => 838.0,\n    8805 => 838.0,\n    8806 => 838.0,\n    8807 => 838.0,\n    8808 => 838.0,\n    8809 => 838.0,\n    8810 => 1047.0,\n    8811 => 1047.0,\n    8812 => 464.0,\n    8813 => 838.0,\n    8814 => 838.0,\n    8815 => 838.0,\n    8816 => 838.0,\n    8817 => 838.0,\n    8818 => 838.0,\n    8819 => 838.0,\n    8820 => 838.0,\n    8821 => 838.0,\n    8822 => 838.0,\n    8823 => 838.0,\n    8824 => 838.0,\n    8825 => 838.0,\n    8826 => 838.0,\n    8827 => 838.0,\n    8828 => 838.0,\n    8829 => 838.0,\n    8830 => 838.0,\n    8831 => 838.0,\n    8832 => 838.0,\n    8833 => 838.0,\n    8834 => 838.0,\n    8835 => 838.0,\n    8836 => 838.0,\n    8837 => 838.0,\n    8838 => 838.0,\n    8839 => 838.0,\n    8840 => 838.0,\n    8841 => 838.0,\n    8842 => 838.0,\n    8843 => 838.0,\n    8844 => 732.0,\n    8845 => 732.0,\n    8846 => 732.0,\n    8847 => 838.0,\n    8848 => 838.0,\n    8849 => 838.0,\n    8850 => 838.0,\n    8851 => 780.0,\n    8852 => 780.0,\n    8853 => 838.0,\n    8854 => 838.0,\n    8855 => 838.0,\n    8856 => 838.0,\n    8857 => 838.0,\n    8858 => 838.0,\n    8859 => 838.0,\n    8860 => 838.0,\n    8861 => 838.0,\n    8862 => 838.0,\n    8863 => 838.0,\n    8864 => 838.0,\n    8865 => 838.0,\n    8866 => 871.0,\n    8867 => 871.0,\n    8868 => 871.0,\n    8869 => 871.0,\n    8870 => 521.0,\n    8871 => 521.0,\n    8872 => 871.0,\n    8873 => 871.0,\n    8874 => 871.0,\n    8875 => 871.0,\n    8876 => 871.0,\n    8877 => 871.0,\n    8878 => 871.0,\n    8879 => 871.0,\n    8880 => 838.0,\n    8881 => 838.0,\n    8882 => 838.0,\n    8883 => 838.0,\n    8884 => 838.0,\n    8885 => 838.0,\n    8886 => 1000.0,\n    8887 => 1000.0,\n    8888 => 838.0,\n    8889 => 838.0,\n    8890 => 521.0,\n    8891 => 732.0,\n    8892 => 732.0,\n    8893 => 732.0,\n    8894 => 838.0,\n    8895 => 838.0,\n    8896 => 820.0,\n    8897 => 820.0,\n    8898 => 820.0,\n    8899 => 820.0,\n    8900 => 626.0,\n    8901 => 318.0,\n    8902 => 626.0,\n    8903 => 838.0,\n    8904 => 1000.0,\n    8905 => 1000.0,\n    8906 => 1000.0,\n    8907 => 1000.0,\n    8908 => 1000.0,\n    8909 => 838.0,\n    8910 => 732.0,\n    8911 => 732.0,\n    8912 => 838.0,\n    8913 => 838.0,\n    8914 => 838.0,\n    8915 => 838.0,\n    8916 => 838.0,\n    8917 => 838.0,\n    8918 => 838.0,\n    8919 => 838.0,\n    8920 => 1422.0,\n    8921 => 1422.0,\n    8922 => 838.0,\n    8923 => 838.0,\n    8924 => 838.0,\n    8925 => 838.0,\n    8926 => 838.0,\n    8927 => 838.0,\n    8928 => 838.0,\n    8929 => 838.0,\n    8930 => 838.0,\n    8931 => 838.0,\n    8932 => 838.0,\n    8933 => 838.0,\n    8934 => 838.0,\n    8935 => 838.0,\n    8936 => 838.0,\n    8937 => 838.0,\n    8938 => 838.0,\n    8939 => 838.0,\n    8940 => 838.0,\n    8941 => 838.0,\n    8942 => 1000.0,\n    8943 => 1000.0,\n    8944 => 1000.0,\n    8945 => 1000.0,\n    8946 => 1000.0,\n    8947 => 871.0,\n    8948 => 718.0,\n    8949 => 871.0,\n    8950 => 871.0,\n    8951 => 718.0,\n    8952 => 871.0,\n    8953 => 871.0,\n    8954 => 1000.0,\n    8955 => 871.0,\n    8956 => 718.0,\n    8957 => 871.0,\n    8958 => 718.0,\n    8959 => 871.0,\n    8960 => 602.0,\n    8961 => 602.0,\n    8962 => 635.0,\n    8963 => 838.0,\n    8964 => 838.0,\n    8965 => 838.0,\n    8966 => 838.0,\n    8967 => 488.0,\n    8968 => 390.0,\n    8969 => 390.0,\n    8970 => 390.0,\n    8971 => 390.0,\n    8972 => 809.0,\n    8973 => 809.0,\n    8974 => 809.0,\n    8975 => 809.0,\n    8976 => 838.0,\n    8977 => 513.0,\n    8984 => 1000.0,\n    8985 => 838.0,\n    8988 => 469.0,\n    8989 => 469.0,\n    8990 => 469.0,\n    8991 => 469.0,\n    8992 => 521.0,\n    8993 => 521.0,\n    8996 => 1152.0,\n    8997 => 1152.0,\n    8998 => 1414.0,\n    8999 => 1152.0,\n    9000 => 1443.0,\n    9003 => 1414.0,\n    9004 => 873.0,\n    9075 => 338.0,\n    9076 => 635.0,\n    9077 => 837.0,\n    9082 => 659.0,\n    9085 => 757.0,\n    9095 => 1152.0,\n    9108 => 873.0,\n    9115 => 500.0,\n    9116 => 500.0,\n    9117 => 500.0,\n    9118 => 500.0,\n    9119 => 500.0,\n    9120 => 500.0,\n    9121 => 500.0,\n    9122 => 500.0,\n    9123 => 500.0,\n    9124 => 500.0,\n    9125 => 500.0,\n    9126 => 500.0,\n    9127 => 750.0,\n    9128 => 750.0,\n    9129 => 750.0,\n    9130 => 750.0,\n    9131 => 750.0,\n    9132 => 750.0,\n    9133 => 750.0,\n    9134 => 521.0,\n    9166 => 838.0,\n    9167 => 945.0,\n    9187 => 873.0,\n    9189 => 769.0,\n    9192 => 636.0,\n    9250 => 635.0,\n    9251 => 635.0,\n    9312 => 896.0,\n    9313 => 896.0,\n    9314 => 896.0,\n    9315 => 896.0,\n    9316 => 896.0,\n    9317 => 896.0,\n    9318 => 896.0,\n    9319 => 896.0,\n    9320 => 896.0,\n    9321 => 896.0,\n    9472 => 602.0,\n    9473 => 602.0,\n    9474 => 602.0,\n    9475 => 602.0,\n    9476 => 602.0,\n    9477 => 602.0,\n    9478 => 602.0,\n    9479 => 602.0,\n    9480 => 602.0,\n    9481 => 602.0,\n    9482 => 602.0,\n    9483 => 602.0,\n    9484 => 602.0,\n    9485 => 602.0,\n    9486 => 602.0,\n    9487 => 602.0,\n    9488 => 602.0,\n    9489 => 602.0,\n    9490 => 602.0,\n    9491 => 602.0,\n    9492 => 602.0,\n    9493 => 602.0,\n    9494 => 602.0,\n    9495 => 602.0,\n    9496 => 602.0,\n    9497 => 602.0,\n    9498 => 602.0,\n    9499 => 602.0,\n    9500 => 602.0,\n    9501 => 602.0,\n    9502 => 602.0,\n    9503 => 602.0,\n    9504 => 602.0,\n    9505 => 602.0,\n    9506 => 602.0,\n    9507 => 602.0,\n    9508 => 602.0,\n    9509 => 602.0,\n    9510 => 602.0,\n    9511 => 602.0,\n    9512 => 602.0,\n    9513 => 602.0,\n    9514 => 602.0,\n    9515 => 602.0,\n    9516 => 602.0,\n    9517 => 602.0,\n    9518 => 602.0,\n    9519 => 602.0,\n    9520 => 602.0,\n    9521 => 602.0,\n    9522 => 602.0,\n    9523 => 602.0,\n    9524 => 602.0,\n    9525 => 602.0,\n    9526 => 602.0,\n    9527 => 602.0,\n    9528 => 602.0,\n    9529 => 602.0,\n    9530 => 602.0,\n    9531 => 602.0,\n    9532 => 602.0,\n    9533 => 602.0,\n    9534 => 602.0,\n    9535 => 602.0,\n    9536 => 602.0,\n    9537 => 602.0,\n    9538 => 602.0,\n    9539 => 602.0,\n    9540 => 602.0,\n    9541 => 602.0,\n    9542 => 602.0,\n    9543 => 602.0,\n    9544 => 602.0,\n    9545 => 602.0,\n    9546 => 602.0,\n    9547 => 602.0,\n    9548 => 602.0,\n    9549 => 602.0,\n    9550 => 602.0,\n    9551 => 602.0,\n    9552 => 602.0,\n    9553 => 602.0,\n    9554 => 602.0,\n    9555 => 602.0,\n    9556 => 602.0,\n    9557 => 602.0,\n    9558 => 602.0,\n    9559 => 602.0,\n    9560 => 602.0,\n    9561 => 602.0,\n    9562 => 602.0,\n    9563 => 602.0,\n    9564 => 602.0,\n    9565 => 602.0,\n    9566 => 602.0,\n    9567 => 602.0,\n    9568 => 602.0,\n    9569 => 602.0,\n    9570 => 602.0,\n    9571 => 602.0,\n    9572 => 602.0,\n    9573 => 602.0,\n    9574 => 602.0,\n    9575 => 602.0,\n    9576 => 602.0,\n    9577 => 602.0,\n    9578 => 602.0,\n    9579 => 602.0,\n    9580 => 602.0,\n    9581 => 602.0,\n    9582 => 602.0,\n    9583 => 602.0,\n    9584 => 602.0,\n    9585 => 602.0,\n    9586 => 602.0,\n    9587 => 602.0,\n    9588 => 602.0,\n    9589 => 602.0,\n    9590 => 602.0,\n    9591 => 602.0,\n    9592 => 602.0,\n    9593 => 602.0,\n    9594 => 602.0,\n    9595 => 602.0,\n    9596 => 602.0,\n    9597 => 602.0,\n    9598 => 602.0,\n    9599 => 602.0,\n    9600 => 769.0,\n    9601 => 769.0,\n    9602 => 769.0,\n    9603 => 769.0,\n    9604 => 769.0,\n    9605 => 769.0,\n    9606 => 769.0,\n    9607 => 769.0,\n    9608 => 769.0,\n    9609 => 769.0,\n    9610 => 769.0,\n    9611 => 769.0,\n    9612 => 769.0,\n    9613 => 769.0,\n    9614 => 769.0,\n    9615 => 769.0,\n    9616 => 769.0,\n    9617 => 769.0,\n    9618 => 769.0,\n    9619 => 769.0,\n    9620 => 769.0,\n    9621 => 769.0,\n    9622 => 769.0,\n    9623 => 769.0,\n    9624 => 769.0,\n    9625 => 769.0,\n    9626 => 769.0,\n    9627 => 769.0,\n    9628 => 769.0,\n    9629 => 769.0,\n    9630 => 769.0,\n    9631 => 769.0,\n    9632 => 945.0,\n    9633 => 945.0,\n    9634 => 945.0,\n    9635 => 945.0,\n    9636 => 945.0,\n    9637 => 945.0,\n    9638 => 945.0,\n    9639 => 945.0,\n    9640 => 945.0,\n    9641 => 945.0,\n    9642 => 678.0,\n    9643 => 678.0,\n    9644 => 945.0,\n    9645 => 945.0,\n    9646 => 550.0,\n    9647 => 550.0,\n    9648 => 769.0,\n    9649 => 769.0,\n    9650 => 769.0,\n    9651 => 769.0,\n    9652 => 502.0,\n    9653 => 502.0,\n    9654 => 769.0,\n    9655 => 769.0,\n    9656 => 502.0,\n    9657 => 502.0,\n    9658 => 769.0,\n    9659 => 769.0,\n    9660 => 769.0,\n    9661 => 769.0,\n    9662 => 502.0,\n    9663 => 502.0,\n    9664 => 769.0,\n    9665 => 769.0,\n    9666 => 502.0,\n    9667 => 502.0,\n    9668 => 769.0,\n    9669 => 769.0,\n    9670 => 769.0,\n    9671 => 769.0,\n    9672 => 769.0,\n    9673 => 873.0,\n    9674 => 494.0,\n    9675 => 873.0,\n    9676 => 873.0,\n    9677 => 873.0,\n    9678 => 873.0,\n    9679 => 873.0,\n    9680 => 873.0,\n    9681 => 873.0,\n    9682 => 873.0,\n    9683 => 873.0,\n    9684 => 873.0,\n    9685 => 873.0,\n    9686 => 527.0,\n    9687 => 527.0,\n    9688 => 791.0,\n    9689 => 970.0,\n    9690 => 970.0,\n    9691 => 970.0,\n    9692 => 387.0,\n    9693 => 387.0,\n    9694 => 387.0,\n    9695 => 387.0,\n    9696 => 873.0,\n    9697 => 873.0,\n    9698 => 769.0,\n    9699 => 769.0,\n    9700 => 769.0,\n    9701 => 769.0,\n    9702 => 590.0,\n    9703 => 945.0,\n    9704 => 945.0,\n    9705 => 945.0,\n    9706 => 945.0,\n    9707 => 945.0,\n    9708 => 769.0,\n    9709 => 769.0,\n    9710 => 769.0,\n    9711 => 1119.0,\n    9712 => 945.0,\n    9713 => 945.0,\n    9714 => 945.0,\n    9715 => 945.0,\n    9716 => 873.0,\n    9717 => 873.0,\n    9718 => 873.0,\n    9719 => 873.0,\n    9720 => 769.0,\n    9721 => 769.0,\n    9722 => 769.0,\n    9723 => 830.0,\n    9724 => 830.0,\n    9725 => 732.0,\n    9726 => 732.0,\n    9727 => 769.0,\n    9728 => 896.0,\n    9729 => 1000.0,\n    9730 => 896.0,\n    9731 => 896.0,\n    9732 => 896.0,\n    9733 => 896.0,\n    9734 => 896.0,\n    9735 => 573.0,\n    9736 => 896.0,\n    9737 => 896.0,\n    9738 => 888.0,\n    9739 => 888.0,\n    9740 => 671.0,\n    9741 => 1013.0,\n    9742 => 1246.0,\n    9743 => 1250.0,\n    9744 => 896.0,\n    9745 => 896.0,\n    9746 => 896.0,\n    9747 => 532.0,\n    9748 => 896.0,\n    9749 => 896.0,\n    9750 => 896.0,\n    9751 => 896.0,\n    9752 => 896.0,\n    9753 => 896.0,\n    9754 => 896.0,\n    9755 => 896.0,\n    9756 => 896.0,\n    9757 => 609.0,\n    9758 => 896.0,\n    9759 => 609.0,\n    9760 => 896.0,\n    9761 => 896.0,\n    9762 => 896.0,\n    9763 => 896.0,\n    9764 => 669.0,\n    9765 => 746.0,\n    9766 => 649.0,\n    9767 => 784.0,\n    9768 => 545.0,\n    9769 => 896.0,\n    9770 => 896.0,\n    9771 => 896.0,\n    9772 => 710.0,\n    9773 => 896.0,\n    9774 => 896.0,\n    9775 => 896.0,\n    9776 => 896.0,\n    9777 => 896.0,\n    9778 => 896.0,\n    9779 => 896.0,\n    9780 => 896.0,\n    9781 => 896.0,\n    9782 => 896.0,\n    9783 => 896.0,\n    9784 => 896.0,\n    9785 => 1042.0,\n    9786 => 1042.0,\n    9787 => 1042.0,\n    9788 => 896.0,\n    9789 => 896.0,\n    9790 => 896.0,\n    9791 => 614.0,\n    9792 => 732.0,\n    9793 => 732.0,\n    9794 => 896.0,\n    9795 => 896.0,\n    9796 => 896.0,\n    9797 => 896.0,\n    9798 => 896.0,\n    9799 => 896.0,\n    9800 => 896.0,\n    9801 => 896.0,\n    9802 => 896.0,\n    9803 => 896.0,\n    9804 => 896.0,\n    9805 => 896.0,\n    9806 => 896.0,\n    9807 => 896.0,\n    9808 => 896.0,\n    9809 => 896.0,\n    9810 => 896.0,\n    9811 => 896.0,\n    9812 => 896.0,\n    9813 => 896.0,\n    9814 => 896.0,\n    9815 => 896.0,\n    9816 => 896.0,\n    9817 => 896.0,\n    9818 => 896.0,\n    9819 => 896.0,\n    9820 => 896.0,\n    9821 => 896.0,\n    9822 => 896.0,\n    9823 => 896.0,\n    9824 => 896.0,\n    9825 => 896.0,\n    9826 => 896.0,\n    9827 => 896.0,\n    9828 => 896.0,\n    9829 => 896.0,\n    9830 => 896.0,\n    9831 => 896.0,\n    9832 => 896.0,\n    9833 => 472.0,\n    9834 => 638.0,\n    9835 => 896.0,\n    9836 => 896.0,\n    9837 => 472.0,\n    9838 => 357.0,\n    9839 => 484.0,\n    9840 => 748.0,\n    9841 => 766.0,\n    9842 => 896.0,\n    9843 => 896.0,\n    9844 => 896.0,\n    9845 => 896.0,\n    9846 => 896.0,\n    9847 => 896.0,\n    9848 => 896.0,\n    9849 => 896.0,\n    9850 => 896.0,\n    9851 => 896.0,\n    9852 => 896.0,\n    9853 => 896.0,\n    9854 => 896.0,\n    9855 => 896.0,\n    9856 => 869.0,\n    9857 => 869.0,\n    9858 => 869.0,\n    9859 => 869.0,\n    9860 => 869.0,\n    9861 => 869.0,\n    9862 => 896.0,\n    9863 => 896.0,\n    9864 => 896.0,\n    9865 => 896.0,\n    9866 => 896.0,\n    9867 => 896.0,\n    9868 => 896.0,\n    9869 => 896.0,\n    9870 => 896.0,\n    9871 => 896.0,\n    9872 => 896.0,\n    9873 => 896.0,\n    9874 => 896.0,\n    9875 => 896.0,\n    9876 => 896.0,\n    9877 => 541.0,\n    9878 => 896.0,\n    9879 => 896.0,\n    9880 => 896.0,\n    9881 => 896.0,\n    9882 => 896.0,\n    9883 => 896.0,\n    9884 => 896.0,\n    9886 => 896.0,\n    9887 => 896.0,\n    9888 => 896.0,\n    9889 => 702.0,\n    9890 => 1004.0,\n    9891 => 1089.0,\n    9892 => 1175.0,\n    9893 => 903.0,\n    9894 => 838.0,\n    9895 => 838.0,\n    9896 => 838.0,\n    9897 => 838.0,\n    9898 => 838.0,\n    9899 => 838.0,\n    9900 => 838.0,\n    9901 => 838.0,\n    9902 => 838.0,\n    9903 => 838.0,\n    9904 => 844.0,\n    9905 => 838.0,\n    9906 => 732.0,\n    9907 => 732.0,\n    9908 => 732.0,\n    9909 => 732.0,\n    9910 => 850.0,\n    9911 => 732.0,\n    9912 => 732.0,\n    9920 => 838.0,\n    9921 => 838.0,\n    9922 => 838.0,\n    9923 => 838.0,\n    9954 => 732.0,\n    9985 => 838.0,\n    9986 => 838.0,\n    9987 => 838.0,\n    9988 => 838.0,\n    9990 => 838.0,\n    9991 => 838.0,\n    9992 => 838.0,\n    9993 => 838.0,\n    9996 => 838.0,\n    9997 => 838.0,\n    9998 => 838.0,\n    9999 => 838.0,\n    10000 => 838.0,\n    10001 => 838.0,\n    10002 => 838.0,\n    10003 => 838.0,\n    10004 => 838.0,\n    10005 => 838.0,\n    10006 => 838.0,\n    10007 => 838.0,\n    10008 => 838.0,\n    10009 => 838.0,\n    10010 => 838.0,\n    10011 => 838.0,\n    10012 => 838.0,\n    10013 => 838.0,\n    10014 => 838.0,\n    10015 => 838.0,\n    10016 => 838.0,\n    10017 => 838.0,\n    10018 => 838.0,\n    10019 => 838.0,\n    10020 => 838.0,\n    10021 => 838.0,\n    10022 => 838.0,\n    10023 => 838.0,\n    10025 => 838.0,\n    10026 => 838.0,\n    10027 => 838.0,\n    10028 => 838.0,\n    10029 => 838.0,\n    10030 => 838.0,\n    10031 => 838.0,\n    10032 => 838.0,\n    10033 => 838.0,\n    10034 => 838.0,\n    10035 => 838.0,\n    10036 => 838.0,\n    10037 => 838.0,\n    10038 => 838.0,\n    10039 => 838.0,\n    10040 => 838.0,\n    10041 => 838.0,\n    10042 => 838.0,\n    10043 => 838.0,\n    10044 => 838.0,\n    10045 => 838.0,\n    10046 => 838.0,\n    10047 => 838.0,\n    10048 => 838.0,\n    10049 => 838.0,\n    10050 => 838.0,\n    10051 => 838.0,\n    10052 => 838.0,\n    10053 => 838.0,\n    10054 => 838.0,\n    10055 => 838.0,\n    10056 => 838.0,\n    10057 => 838.0,\n    10058 => 838.0,\n    10059 => 838.0,\n    10061 => 896.0,\n    10063 => 896.0,\n    10064 => 896.0,\n    10065 => 896.0,\n    10066 => 896.0,\n    10070 => 896.0,\n    10072 => 838.0,\n    10073 => 838.0,\n    10074 => 838.0,\n    10075 => 322.0,\n    10076 => 322.0,\n    10077 => 538.0,\n    10078 => 538.0,\n    10081 => 838.0,\n    10082 => 838.0,\n    10083 => 838.0,\n    10084 => 838.0,\n    10085 => 838.0,\n    10086 => 838.0,\n    10087 => 838.0,\n    10088 => 838.0,\n    10089 => 838.0,\n    10090 => 838.0,\n    10091 => 838.0,\n    10092 => 838.0,\n    10093 => 838.0,\n    10094 => 838.0,\n    10095 => 838.0,\n    10096 => 838.0,\n    10097 => 838.0,\n    10098 => 838.0,\n    10099 => 838.0,\n    10100 => 838.0,\n    10101 => 838.0,\n    10102 => 896.0,\n    10103 => 896.0,\n    10104 => 896.0,\n    10105 => 896.0,\n    10106 => 896.0,\n    10107 => 896.0,\n    10108 => 896.0,\n    10109 => 896.0,\n    10110 => 896.0,\n    10111 => 896.0,\n    10112 => 838.0,\n    10113 => 838.0,\n    10114 => 838.0,\n    10115 => 838.0,\n    10116 => 838.0,\n    10117 => 838.0,\n    10118 => 838.0,\n    10119 => 838.0,\n    10120 => 838.0,\n    10121 => 838.0,\n    10122 => 838.0,\n    10123 => 838.0,\n    10124 => 838.0,\n    10125 => 838.0,\n    10126 => 838.0,\n    10127 => 838.0,\n    10128 => 838.0,\n    10129 => 838.0,\n    10130 => 838.0,\n    10131 => 838.0,\n    10132 => 838.0,\n    10136 => 838.0,\n    10137 => 838.0,\n    10138 => 838.0,\n    10139 => 838.0,\n    10140 => 838.0,\n    10141 => 838.0,\n    10142 => 838.0,\n    10143 => 838.0,\n    10144 => 838.0,\n    10145 => 838.0,\n    10146 => 838.0,\n    10147 => 838.0,\n    10148 => 838.0,\n    10149 => 838.0,\n    10150 => 838.0,\n    10151 => 838.0,\n    10152 => 838.0,\n    10153 => 838.0,\n    10154 => 838.0,\n    10155 => 838.0,\n    10156 => 838.0,\n    10157 => 838.0,\n    10158 => 838.0,\n    10159 => 838.0,\n    10161 => 838.0,\n    10162 => 838.0,\n    10163 => 838.0,\n    10164 => 838.0,\n    10165 => 838.0,\n    10166 => 838.0,\n    10167 => 838.0,\n    10168 => 838.0,\n    10169 => 838.0,\n    10170 => 838.0,\n    10171 => 838.0,\n    10172 => 838.0,\n    10173 => 838.0,\n    10174 => 838.0,\n    10181 => 390.0,\n    10182 => 390.0,\n    10208 => 494.0,\n    10214 => 495.0,\n    10215 => 495.0,\n    10216 => 390.0,\n    10217 => 390.0,\n    10218 => 556.0,\n    10219 => 556.0,\n    10224 => 838.0,\n    10225 => 838.0,\n    10226 => 838.0,\n    10227 => 838.0,\n    10228 => 1157.0,\n    10229 => 1434.0,\n    10230 => 1434.0,\n    10231 => 1434.0,\n    10232 => 1434.0,\n    10233 => 1434.0,\n    10234 => 1434.0,\n    10235 => 1434.0,\n    10236 => 1434.0,\n    10237 => 1434.0,\n    10238 => 1434.0,\n    10239 => 1434.0,\n    10240 => 732.0,\n    10241 => 732.0,\n    10242 => 732.0,\n    10243 => 732.0,\n    10244 => 732.0,\n    10245 => 732.0,\n    10246 => 732.0,\n    10247 => 732.0,\n    10248 => 732.0,\n    10249 => 732.0,\n    10250 => 732.0,\n    10251 => 732.0,\n    10252 => 732.0,\n    10253 => 732.0,\n    10254 => 732.0,\n    10255 => 732.0,\n    10256 => 732.0,\n    10257 => 732.0,\n    10258 => 732.0,\n    10259 => 732.0,\n    10260 => 732.0,\n    10261 => 732.0,\n    10262 => 732.0,\n    10263 => 732.0,\n    10264 => 732.0,\n    10265 => 732.0,\n    10266 => 732.0,\n    10267 => 732.0,\n    10268 => 732.0,\n    10269 => 732.0,\n    10270 => 732.0,\n    10271 => 732.0,\n    10272 => 732.0,\n    10273 => 732.0,\n    10274 => 732.0,\n    10275 => 732.0,\n    10276 => 732.0,\n    10277 => 732.0,\n    10278 => 732.0,\n    10279 => 732.0,\n    10280 => 732.0,\n    10281 => 732.0,\n    10282 => 732.0,\n    10283 => 732.0,\n    10284 => 732.0,\n    10285 => 732.0,\n    10286 => 732.0,\n    10287 => 732.0,\n    10288 => 732.0,\n    10289 => 732.0,\n    10290 => 732.0,\n    10291 => 732.0,\n    10292 => 732.0,\n    10293 => 732.0,\n    10294 => 732.0,\n    10295 => 732.0,\n    10296 => 732.0,\n    10297 => 732.0,\n    10298 => 732.0,\n    10299 => 732.0,\n    10300 => 732.0,\n    10301 => 732.0,\n    10302 => 732.0,\n    10303 => 732.0,\n    10304 => 732.0,\n    10305 => 732.0,\n    10306 => 732.0,\n    10307 => 732.0,\n    10308 => 732.0,\n    10309 => 732.0,\n    10310 => 732.0,\n    10311 => 732.0,\n    10312 => 732.0,\n    10313 => 732.0,\n    10314 => 732.0,\n    10315 => 732.0,\n    10316 => 732.0,\n    10317 => 732.0,\n    10318 => 732.0,\n    10319 => 732.0,\n    10320 => 732.0,\n    10321 => 732.0,\n    10322 => 732.0,\n    10323 => 732.0,\n    10324 => 732.0,\n    10325 => 732.0,\n    10326 => 732.0,\n    10327 => 732.0,\n    10328 => 732.0,\n    10329 => 732.0,\n    10330 => 732.0,\n    10331 => 732.0,\n    10332 => 732.0,\n    10333 => 732.0,\n    10334 => 732.0,\n    10335 => 732.0,\n    10336 => 732.0,\n    10337 => 732.0,\n    10338 => 732.0,\n    10339 => 732.0,\n    10340 => 732.0,\n    10341 => 732.0,\n    10342 => 732.0,\n    10343 => 732.0,\n    10344 => 732.0,\n    10345 => 732.0,\n    10346 => 732.0,\n    10347 => 732.0,\n    10348 => 732.0,\n    10349 => 732.0,\n    10350 => 732.0,\n    10351 => 732.0,\n    10352 => 732.0,\n    10353 => 732.0,\n    10354 => 732.0,\n    10355 => 732.0,\n    10356 => 732.0,\n    10357 => 732.0,\n    10358 => 732.0,\n    10359 => 732.0,\n    10360 => 732.0,\n    10361 => 732.0,\n    10362 => 732.0,\n    10363 => 732.0,\n    10364 => 732.0,\n    10365 => 732.0,\n    10366 => 732.0,\n    10367 => 732.0,\n    10368 => 732.0,\n    10369 => 732.0,\n    10370 => 732.0,\n    10371 => 732.0,\n    10372 => 732.0,\n    10373 => 732.0,\n    10374 => 732.0,\n    10375 => 732.0,\n    10376 => 732.0,\n    10377 => 732.0,\n    10378 => 732.0,\n    10379 => 732.0,\n    10380 => 732.0,\n    10381 => 732.0,\n    10382 => 732.0,\n    10383 => 732.0,\n    10384 => 732.0,\n    10385 => 732.0,\n    10386 => 732.0,\n    10387 => 732.0,\n    10388 => 732.0,\n    10389 => 732.0,\n    10390 => 732.0,\n    10391 => 732.0,\n    10392 => 732.0,\n    10393 => 732.0,\n    10394 => 732.0,\n    10395 => 732.0,\n    10396 => 732.0,\n    10397 => 732.0,\n    10398 => 732.0,\n    10399 => 732.0,\n    10400 => 732.0,\n    10401 => 732.0,\n    10402 => 732.0,\n    10403 => 732.0,\n    10404 => 732.0,\n    10405 => 732.0,\n    10406 => 732.0,\n    10407 => 732.0,\n    10408 => 732.0,\n    10409 => 732.0,\n    10410 => 732.0,\n    10411 => 732.0,\n    10412 => 732.0,\n    10413 => 732.0,\n    10414 => 732.0,\n    10415 => 732.0,\n    10416 => 732.0,\n    10417 => 732.0,\n    10418 => 732.0,\n    10419 => 732.0,\n    10420 => 732.0,\n    10421 => 732.0,\n    10422 => 732.0,\n    10423 => 732.0,\n    10424 => 732.0,\n    10425 => 732.0,\n    10426 => 732.0,\n    10427 => 732.0,\n    10428 => 732.0,\n    10429 => 732.0,\n    10430 => 732.0,\n    10431 => 732.0,\n    10432 => 732.0,\n    10433 => 732.0,\n    10434 => 732.0,\n    10435 => 732.0,\n    10436 => 732.0,\n    10437 => 732.0,\n    10438 => 732.0,\n    10439 => 732.0,\n    10440 => 732.0,\n    10441 => 732.0,\n    10442 => 732.0,\n    10443 => 732.0,\n    10444 => 732.0,\n    10445 => 732.0,\n    10446 => 732.0,\n    10447 => 732.0,\n    10448 => 732.0,\n    10449 => 732.0,\n    10450 => 732.0,\n    10451 => 732.0,\n    10452 => 732.0,\n    10453 => 732.0,\n    10454 => 732.0,\n    10455 => 732.0,\n    10456 => 732.0,\n    10457 => 732.0,\n    10458 => 732.0,\n    10459 => 732.0,\n    10460 => 732.0,\n    10461 => 732.0,\n    10462 => 732.0,\n    10463 => 732.0,\n    10464 => 732.0,\n    10465 => 732.0,\n    10466 => 732.0,\n    10467 => 732.0,\n    10468 => 732.0,\n    10469 => 732.0,\n    10470 => 732.0,\n    10471 => 732.0,\n    10472 => 732.0,\n    10473 => 732.0,\n    10474 => 732.0,\n    10475 => 732.0,\n    10476 => 732.0,\n    10477 => 732.0,\n    10478 => 732.0,\n    10479 => 732.0,\n    10480 => 732.0,\n    10481 => 732.0,\n    10482 => 732.0,\n    10483 => 732.0,\n    10484 => 732.0,\n    10485 => 732.0,\n    10486 => 732.0,\n    10487 => 732.0,\n    10488 => 732.0,\n    10489 => 732.0,\n    10490 => 732.0,\n    10491 => 732.0,\n    10492 => 732.0,\n    10493 => 732.0,\n    10494 => 732.0,\n    10495 => 732.0,\n    10502 => 838.0,\n    10503 => 838.0,\n    10506 => 838.0,\n    10507 => 838.0,\n    10560 => 683.0,\n    10561 => 683.0,\n    10627 => 734.0,\n    10628 => 734.0,\n    10702 => 838.0,\n    10703 => 1000.0,\n    10704 => 1000.0,\n    10705 => 1000.0,\n    10706 => 1000.0,\n    10707 => 1000.0,\n    10708 => 1000.0,\n    10709 => 1000.0,\n    10731 => 494.0,\n    10746 => 838.0,\n    10747 => 838.0,\n    10752 => 1000.0,\n    10753 => 1000.0,\n    10754 => 1000.0,\n    10764 => 1325.0,\n    10765 => 521.0,\n    10766 => 521.0,\n    10767 => 521.0,\n    10768 => 521.0,\n    10769 => 521.0,\n    10770 => 521.0,\n    10771 => 521.0,\n    10772 => 521.0,\n    10773 => 521.0,\n    10774 => 521.0,\n    10775 => 521.0,\n    10776 => 521.0,\n    10777 => 521.0,\n    10778 => 521.0,\n    10779 => 521.0,\n    10780 => 521.0,\n    10799 => 838.0,\n    10858 => 838.0,\n    10859 => 838.0,\n    10877 => 838.0,\n    10878 => 838.0,\n    10879 => 838.0,\n    10880 => 838.0,\n    10881 => 838.0,\n    10882 => 838.0,\n    10883 => 838.0,\n    10884 => 838.0,\n    10885 => 838.0,\n    10886 => 838.0,\n    10887 => 838.0,\n    10888 => 838.0,\n    10889 => 838.0,\n    10890 => 838.0,\n    10891 => 838.0,\n    10892 => 838.0,\n    10893 => 838.0,\n    10894 => 838.0,\n    10895 => 838.0,\n    10896 => 838.0,\n    10897 => 838.0,\n    10898 => 838.0,\n    10899 => 838.0,\n    10900 => 838.0,\n    10901 => 838.0,\n    10902 => 838.0,\n    10903 => 838.0,\n    10904 => 838.0,\n    10905 => 838.0,\n    10906 => 838.0,\n    10907 => 838.0,\n    10908 => 838.0,\n    10909 => 838.0,\n    10910 => 838.0,\n    10911 => 838.0,\n    10912 => 838.0,\n    10926 => 838.0,\n    10927 => 838.0,\n    10928 => 838.0,\n    10929 => 838.0,\n    10930 => 838.0,\n    10931 => 838.0,\n    10932 => 838.0,\n    10933 => 838.0,\n    10934 => 838.0,\n    10935 => 838.0,\n    10936 => 838.0,\n    10937 => 838.0,\n    10938 => 838.0,\n    11001 => 838.0,\n    11002 => 838.0,\n    11008 => 838.0,\n    11009 => 838.0,\n    11010 => 838.0,\n    11011 => 838.0,\n    11012 => 838.0,\n    11013 => 838.0,\n    11014 => 838.0,\n    11015 => 838.0,\n    11016 => 838.0,\n    11017 => 838.0,\n    11018 => 838.0,\n    11019 => 838.0,\n    11020 => 838.0,\n    11021 => 838.0,\n    11022 => 836.0,\n    11023 => 836.0,\n    11024 => 836.0,\n    11025 => 836.0,\n    11026 => 945.0,\n    11027 => 945.0,\n    11028 => 945.0,\n    11029 => 945.0,\n    11030 => 769.0,\n    11031 => 769.0,\n    11032 => 769.0,\n    11033 => 769.0,\n    11034 => 945.0,\n    11039 => 869.0,\n    11040 => 869.0,\n    11041 => 873.0,\n    11042 => 873.0,\n    11043 => 873.0,\n    11044 => 1119.0,\n    11091 => 869.0,\n    11092 => 869.0,\n    11360 => 557.0,\n    11361 => 278.0,\n    11362 => 557.0,\n    11363 => 603.0,\n    11364 => 695.0,\n    11365 => 613.0,\n    11366 => 392.0,\n    11367 => 752.0,\n    11368 => 634.0,\n    11369 => 656.0,\n    11370 => 579.0,\n    11371 => 685.0,\n    11372 => 525.0,\n    11373 => 781.0,\n    11374 => 863.0,\n    11375 => 684.0,\n    11376 => 781.0,\n    11377 => 734.0,\n    11378 => 1128.0,\n    11379 => 961.0,\n    11380 => 592.0,\n    11381 => 654.0,\n    11382 => 568.0,\n    11383 => 660.0,\n    11385 => 414.0,\n    11386 => 612.0,\n    11387 => 491.0,\n    11388 => 175.0,\n    11389 => 431.0,\n    11390 => 635.0,\n    11391 => 685.0,\n    11520 => 591.0,\n    11521 => 595.0,\n    11522 => 564.0,\n    11523 => 602.0,\n    11524 => 587.0,\n    11525 => 911.0,\n    11526 => 626.0,\n    11527 => 952.0,\n    11528 => 595.0,\n    11529 => 607.0,\n    11530 => 954.0,\n    11531 => 620.0,\n    11532 => 595.0,\n    11533 => 926.0,\n    11534 => 595.0,\n    11535 => 806.0,\n    11536 => 931.0,\n    11537 => 584.0,\n    11538 => 592.0,\n    11539 => 923.0,\n    11540 => 953.0,\n    11541 => 828.0,\n    11542 => 596.0,\n    11543 => 595.0,\n    11544 => 590.0,\n    11545 => 592.0,\n    11546 => 592.0,\n    11547 => 621.0,\n    11548 => 920.0,\n    11549 => 589.0,\n    11550 => 586.0,\n    11551 => 581.0,\n    11552 => 914.0,\n    11553 => 596.0,\n    11554 => 595.0,\n    11555 => 592.0,\n    11556 => 642.0,\n    11557 => 901.0,\n    11568 => 646.0,\n    11569 => 888.0,\n    11570 => 888.0,\n    11571 => 682.0,\n    11572 => 684.0,\n    11573 => 635.0,\n    11574 => 562.0,\n    11575 => 684.0,\n    11576 => 684.0,\n    11577 => 632.0,\n    11578 => 632.0,\n    11579 => 683.0,\n    11580 => 875.0,\n    11581 => 685.0,\n    11582 => 491.0,\n    11583 => 685.0,\n    11584 => 888.0,\n    11585 => 888.0,\n    11586 => 300.0,\n    11587 => 627.0,\n    11588 => 752.0,\n    11589 => 656.0,\n    11590 => 527.0,\n    11591 => 685.0,\n    11592 => 645.0,\n    11593 => 632.0,\n    11594 => 502.0,\n    11595 => 953.0,\n    11596 => 778.0,\n    11597 => 748.0,\n    11598 => 621.0,\n    11599 => 295.0,\n    11600 => 778.0,\n    11601 => 295.0,\n    11602 => 752.0,\n    11603 => 633.0,\n    11604 => 888.0,\n    11605 => 888.0,\n    11606 => 752.0,\n    11607 => 320.0,\n    11608 => 749.0,\n    11609 => 888.0,\n    11610 => 888.0,\n    11611 => 698.0,\n    11612 => 768.0,\n    11613 => 685.0,\n    11614 => 698.0,\n    11615 => 622.0,\n    11616 => 684.0,\n    11617 => 752.0,\n    11618 => 632.0,\n    11619 => 788.0,\n    11620 => 567.0,\n    11621 => 788.0,\n    11631 => 515.0,\n    11800 => 531.0,\n    11807 => 838.0,\n    11810 => 390.0,\n    11811 => 390.0,\n    11812 => 390.0,\n    11813 => 390.0,\n    11822 => 531.0,\n    19904 => 896.0,\n    19905 => 896.0,\n    19906 => 896.0,\n    19907 => 896.0,\n    19908 => 896.0,\n    19909 => 896.0,\n    19910 => 896.0,\n    19911 => 896.0,\n    19912 => 896.0,\n    19913 => 896.0,\n    19914 => 896.0,\n    19915 => 896.0,\n    19916 => 896.0,\n    19917 => 896.0,\n    19918 => 896.0,\n    19919 => 896.0,\n    19920 => 896.0,\n    19921 => 896.0,\n    19922 => 896.0,\n    19923 => 896.0,\n    19924 => 896.0,\n    19925 => 896.0,\n    19926 => 896.0,\n    19927 => 896.0,\n    19928 => 896.0,\n    19929 => 896.0,\n    19930 => 896.0,\n    19931 => 896.0,\n    19932 => 896.0,\n    19933 => 896.0,\n    19934 => 896.0,\n    19935 => 896.0,\n    19936 => 896.0,\n    19937 => 896.0,\n    19938 => 896.0,\n    19939 => 896.0,\n    19940 => 896.0,\n    19941 => 896.0,\n    19942 => 896.0,\n    19943 => 896.0,\n    19944 => 896.0,\n    19945 => 896.0,\n    19946 => 896.0,\n    19947 => 896.0,\n    19948 => 896.0,\n    19949 => 896.0,\n    19950 => 896.0,\n    19951 => 896.0,\n    19952 => 896.0,\n    19953 => 896.0,\n    19954 => 896.0,\n    19955 => 896.0,\n    19956 => 896.0,\n    19957 => 896.0,\n    19958 => 896.0,\n    19959 => 896.0,\n    19960 => 896.0,\n    19961 => 896.0,\n    19962 => 896.0,\n    19963 => 896.0,\n    19964 => 896.0,\n    19965 => 896.0,\n    19966 => 896.0,\n    19967 => 896.0,\n    42192 => 686.0,\n    42193 => 603.0,\n    42194 => 603.0,\n    42195 => 770.0,\n    42196 => 611.0,\n    42197 => 611.0,\n    42198 => 775.0,\n    42199 => 656.0,\n    42200 => 656.0,\n    42201 => 512.0,\n    42202 => 698.0,\n    42203 => 703.0,\n    42204 => 685.0,\n    42205 => 575.0,\n    42206 => 575.0,\n    42207 => 863.0,\n    42208 => 748.0,\n    42209 => 557.0,\n    42210 => 635.0,\n    42211 => 695.0,\n    42212 => 695.0,\n    42213 => 684.0,\n    42214 => 684.0,\n    42215 => 752.0,\n    42216 => 775.0,\n    42217 => 512.0,\n    42218 => 989.0,\n    42219 => 685.0,\n    42220 => 611.0,\n    42221 => 686.0,\n    42222 => 684.0,\n    42223 => 684.0,\n    42224 => 632.0,\n    42225 => 632.0,\n    42226 => 295.0,\n    42227 => 787.0,\n    42228 => 732.0,\n    42229 => 732.0,\n    42230 => 557.0,\n    42231 => 767.0,\n    42232 => 300.0,\n    42233 => 300.0,\n    42234 => 596.0,\n    42235 => 596.0,\n    42236 => 300.0,\n    42237 => 300.0,\n    42238 => 588.0,\n    42239 => 588.0,\n    42564 => 635.0,\n    42565 => 521.0,\n    42566 => 354.0,\n    42567 => 338.0,\n    42572 => 1180.0,\n    42573 => 1028.0,\n    42576 => 1029.0,\n    42577 => 906.0,\n    42580 => 1080.0,\n    42581 => 842.0,\n    42582 => 977.0,\n    42583 => 843.0,\n    42594 => 1062.0,\n    42595 => 912.0,\n    42596 => 1066.0,\n    42597 => 901.0,\n    42598 => 1178.0,\n    42599 => 1008.0,\n    42600 => 787.0,\n    42601 => 612.0,\n    42602 => 855.0,\n    42603 => 712.0,\n    42604 => 1358.0,\n    42605 => 1019.0,\n    42606 => 879.0,\n    42634 => 782.0,\n    42635 => 685.0,\n    42636 => 611.0,\n    42637 => 583.0,\n    42644 => 686.0,\n    42645 => 634.0,\n    42648 => 1358.0,\n    42649 => 1019.0,\n    42760 => 493.0,\n    42761 => 493.0,\n    42762 => 493.0,\n    42763 => 493.0,\n    42764 => 493.0,\n    42765 => 493.0,\n    42766 => 493.0,\n    42767 => 493.0,\n    42768 => 493.0,\n    42769 => 493.0,\n    42770 => 493.0,\n    42771 => 493.0,\n    42772 => 493.0,\n    42773 => 493.0,\n    42774 => 493.0,\n    42779 => 369.0,\n    42780 => 369.0,\n    42781 => 252.0,\n    42782 => 252.0,\n    42783 => 252.0,\n    42786 => 385.0,\n    42787 => 356.0,\n    42788 => 472.0,\n    42789 => 472.0,\n    42790 => 752.0,\n    42791 => 634.0,\n    42792 => 878.0,\n    42793 => 709.0,\n    42794 => 614.0,\n    42795 => 541.0,\n    42800 => 491.0,\n    42801 => 521.0,\n    42802 => 1250.0,\n    42803 => 985.0,\n    42804 => 1203.0,\n    42805 => 990.0,\n    42806 => 1142.0,\n    42807 => 981.0,\n    42808 => 971.0,\n    42809 => 818.0,\n    42810 => 971.0,\n    42811 => 818.0,\n    42812 => 959.0,\n    42813 => 818.0,\n    42814 => 703.0,\n    42815 => 549.0,\n    42816 => 656.0,\n    42817 => 583.0,\n    42822 => 680.0,\n    42823 => 392.0,\n    42824 => 582.0,\n    42825 => 427.0,\n    42826 => 807.0,\n    42827 => 704.0,\n    42830 => 1358.0,\n    42831 => 1019.0,\n    42832 => 603.0,\n    42833 => 635.0,\n    42834 => 734.0,\n    42835 => 774.0,\n    42838 => 787.0,\n    42839 => 635.0,\n    42852 => 605.0,\n    42853 => 635.0,\n    42854 => 605.0,\n    42855 => 635.0,\n    42880 => 557.0,\n    42881 => 278.0,\n    42882 => 735.0,\n    42883 => 634.0,\n    42889 => 337.0,\n    42890 => 376.0,\n    42891 => 401.0,\n    42892 => 275.0,\n    42893 => 686.0,\n    42894 => 487.0,\n    42896 => 772.0,\n    42897 => 667.0,\n    42912 => 775.0,\n    42913 => 635.0,\n    42914 => 656.0,\n    42915 => 579.0,\n    42916 => 748.0,\n    42917 => 634.0,\n    42918 => 695.0,\n    42919 => 411.0,\n    42920 => 635.0,\n    42921 => 521.0,\n    42922 => 801.0,\n    43000 => 577.0,\n    43001 => 644.0,\n    43002 => 915.0,\n    43003 => 575.0,\n    43004 => 603.0,\n    43005 => 863.0,\n    43006 => 295.0,\n    43007 => 1199.0,\n    61184 => 213.0,\n    61185 => 238.0,\n    61186 => 257.0,\n    61187 => 264.0,\n    61188 => 267.0,\n    61189 => 238.0,\n    61190 => 213.0,\n    61191 => 238.0,\n    61192 => 257.0,\n    61193 => 264.0,\n    61194 => 257.0,\n    61195 => 238.0,\n    61196 => 213.0,\n    61197 => 238.0,\n    61198 => 257.0,\n    61199 => 264.0,\n    61200 => 257.0,\n    61201 => 238.0,\n    61202 => 213.0,\n    61203 => 238.0,\n    61204 => 267.0,\n    61205 => 264.0,\n    61206 => 257.0,\n    61207 => 238.0,\n    61208 => 213.0,\n    61209 => 275.0,\n    61440 => 977.0,\n    61441 => 977.0,\n    61442 => 977.0,\n    61443 => 977.0,\n    62464 => 580.0,\n    62465 => 580.0,\n    62466 => 624.0,\n    62467 => 889.0,\n    62468 => 585.0,\n    62469 => 580.0,\n    62470 => 653.0,\n    62471 => 882.0,\n    62472 => 555.0,\n    62473 => 580.0,\n    62474 => 1168.0,\n    62475 => 589.0,\n    62476 => 590.0,\n    62477 => 869.0,\n    62478 => 580.0,\n    62479 => 589.0,\n    62480 => 914.0,\n    62481 => 590.0,\n    62482 => 731.0,\n    62483 => 583.0,\n    62484 => 872.0,\n    62485 => 589.0,\n    62486 => 895.0,\n    62487 => 589.0,\n    62488 => 589.0,\n    62489 => 590.0,\n    62490 => 649.0,\n    62491 => 589.0,\n    62492 => 589.0,\n    62493 => 599.0,\n    62494 => 590.0,\n    62495 => 516.0,\n    62496 => 580.0,\n    62497 => 584.0,\n    62498 => 580.0,\n    62499 => 580.0,\n    62500 => 581.0,\n    62501 => 638.0,\n    62502 => 955.0,\n    62504 => 931.0,\n    62505 => 808.0,\n    62506 => 508.0,\n    62507 => 508.0,\n    62508 => 508.0,\n    62509 => 508.0,\n    62510 => 508.0,\n    62511 => 508.0,\n    62512 => 508.0,\n    62513 => 508.0,\n    62514 => 508.0,\n    62515 => 508.0,\n    62516 => 518.0,\n    62517 => 518.0,\n    62518 => 518.0,\n    62519 => 787.0,\n    62520 => 787.0,\n    62521 => 787.0,\n    62522 => 787.0,\n    62523 => 787.0,\n    62524 => 546.0,\n    62525 => 546.0,\n    62526 => 546.0,\n    62527 => 546.0,\n    62528 => 546.0,\n    62529 => 546.0,\n    63173 => 612.0,\n    64256 => 689.0,\n    64257 => 630.0,\n    64258 => 630.0,\n    64259 => 967.0,\n    64260 => 967.0,\n    64261 => 686.0,\n    64262 => 861.0,\n    64275 => 1202.0,\n    64276 => 1202.0,\n    64277 => 1196.0,\n    64278 => 1186.0,\n    64279 => 1529.0,\n    64285 => 224.0,\n    64286 => 0.0,\n    64287 => 331.0,\n    64288 => 636.0,\n    64289 => 856.0,\n    64290 => 774.0,\n    64291 => 906.0,\n    64292 => 771.0,\n    64293 => 843.0,\n    64294 => 855.0,\n    64295 => 807.0,\n    64296 => 875.0,\n    64297 => 838.0,\n    64298 => 708.0,\n    64299 => 708.0,\n    64300 => 708.0,\n    64301 => 708.0,\n    64302 => 668.0,\n    64303 => 668.0,\n    64304 => 668.0,\n    64305 => 578.0,\n    64306 => 412.0,\n    64307 => 546.0,\n    64308 => 653.0,\n    64309 => 355.0,\n    64310 => 406.0,\n    64312 => 648.0,\n    64313 => 330.0,\n    64314 => 537.0,\n    64315 => 529.0,\n    64316 => 568.0,\n    64318 => 679.0,\n    64320 => 399.0,\n    64321 => 649.0,\n    64323 => 640.0,\n    64324 => 625.0,\n    64326 => 593.0,\n    64327 => 709.0,\n    64328 => 564.0,\n    64329 => 708.0,\n    64330 => 657.0,\n    64331 => 272.0,\n    64332 => 578.0,\n    64333 => 529.0,\n    64334 => 625.0,\n    64335 => 629.0,\n    64338 => 941.0,\n    64339 => 982.0,\n    64340 => 278.0,\n    64341 => 302.0,\n    64342 => 941.0,\n    64343 => 982.0,\n    64344 => 278.0,\n    64345 => 302.0,\n    64346 => 941.0,\n    64347 => 982.0,\n    64348 => 278.0,\n    64349 => 302.0,\n    64350 => 941.0,\n    64351 => 982.0,\n    64352 => 278.0,\n    64353 => 302.0,\n    64354 => 941.0,\n    64355 => 982.0,\n    64356 => 278.0,\n    64357 => 302.0,\n    64358 => 941.0,\n    64359 => 982.0,\n    64360 => 278.0,\n    64361 => 302.0,\n    64362 => 1037.0,\n    64363 => 1035.0,\n    64364 => 478.0,\n    64365 => 506.0,\n    64366 => 1037.0,\n    64367 => 1035.0,\n    64368 => 478.0,\n    64369 => 506.0,\n    64370 => 646.0,\n    64371 => 646.0,\n    64372 => 618.0,\n    64373 => 646.0,\n    64374 => 646.0,\n    64375 => 646.0,\n    64376 => 618.0,\n    64377 => 646.0,\n    64378 => 646.0,\n    64379 => 646.0,\n    64380 => 618.0,\n    64381 => 646.0,\n    64382 => 646.0,\n    64383 => 646.0,\n    64384 => 618.0,\n    64385 => 646.0,\n    64386 => 445.0,\n    64387 => 525.0,\n    64388 => 445.0,\n    64389 => 525.0,\n    64390 => 445.0,\n    64391 => 525.0,\n    64392 => 445.0,\n    64393 => 525.0,\n    64394 => 483.0,\n    64395 => 552.0,\n    64396 => 483.0,\n    64397 => 552.0,\n    64398 => 895.0,\n    64399 => 895.0,\n    64400 => 476.0,\n    64401 => 552.0,\n    64402 => 895.0,\n    64403 => 895.0,\n    64404 => 476.0,\n    64405 => 552.0,\n    64406 => 895.0,\n    64407 => 895.0,\n    64408 => 476.0,\n    64409 => 552.0,\n    64410 => 895.0,\n    64411 => 895.0,\n    64412 => 476.0,\n    64413 => 552.0,\n    64414 => 734.0,\n    64415 => 761.0,\n    64416 => 734.0,\n    64417 => 761.0,\n    64418 => 278.0,\n    64419 => 302.0,\n    64426 => 698.0,\n    64427 => 632.0,\n    64428 => 527.0,\n    64429 => 461.0,\n    64467 => 824.0,\n    64468 => 843.0,\n    64469 => 476.0,\n    64470 => 552.0,\n    64471 => 483.0,\n    64472 => 517.0,\n    64473 => 483.0,\n    64474 => 517.0,\n    64475 => 483.0,\n    64476 => 517.0,\n    64478 => 483.0,\n    64479 => 517.0,\n    64484 => 783.0,\n    64485 => 833.0,\n    64486 => 278.0,\n    64487 => 302.0,\n    64488 => 278.0,\n    64489 => 302.0,\n    64508 => 783.0,\n    64509 => 833.0,\n    64510 => 278.0,\n    64511 => 302.0,\n    65024 => 0.0,\n    65025 => 0.0,\n    65026 => 0.0,\n    65027 => 0.0,\n    65028 => 0.0,\n    65029 => 0.0,\n    65030 => 0.0,\n    65031 => 0.0,\n    65032 => 0.0,\n    65033 => 0.0,\n    65034 => 0.0,\n    65035 => 0.0,\n    65036 => 0.0,\n    65037 => 0.0,\n    65038 => 0.0,\n    65039 => 0.0,\n    65056 => 0.0,\n    65057 => 0.0,\n    65058 => 0.0,\n    65059 => 0.0,\n    65136 => 293.0,\n    65137 => 293.0,\n    65138 => 293.0,\n    65139 => 262.0,\n    65140 => 293.0,\n    65142 => 293.0,\n    65143 => 293.0,\n    65144 => 293.0,\n    65145 => 293.0,\n    65146 => 293.0,\n    65147 => 293.0,\n    65148 => 293.0,\n    65149 => 293.0,\n    65150 => 293.0,\n    65151 => 293.0,\n    65152 => 470.0,\n    65153 => 278.0,\n    65154 => 305.0,\n    65155 => 278.0,\n    65156 => 305.0,\n    65157 => 483.0,\n    65158 => 517.0,\n    65159 => 278.0,\n    65160 => 305.0,\n    65161 => 783.0,\n    65162 => 833.0,\n    65163 => 278.0,\n    65164 => 302.0,\n    65165 => 278.0,\n    65166 => 305.0,\n    65167 => 941.0,\n    65168 => 982.0,\n    65169 => 278.0,\n    65170 => 302.0,\n    65171 => 524.0,\n    65172 => 536.0,\n    65173 => 941.0,\n    65174 => 982.0,\n    65175 => 278.0,\n    65176 => 302.0,\n    65177 => 941.0,\n    65178 => 982.0,\n    65179 => 278.0,\n    65180 => 302.0,\n    65181 => 646.0,\n    65182 => 646.0,\n    65183 => 618.0,\n    65184 => 646.0,\n    65185 => 646.0,\n    65186 => 646.0,\n    65187 => 618.0,\n    65188 => 646.0,\n    65189 => 646.0,\n    65190 => 646.0,\n    65191 => 618.0,\n    65192 => 646.0,\n    65193 => 445.0,\n    65194 => 525.0,\n    65195 => 445.0,\n    65196 => 525.0,\n    65197 => 483.0,\n    65198 => 552.0,\n    65199 => 483.0,\n    65200 => 552.0,\n    65201 => 1221.0,\n    65202 => 1275.0,\n    65203 => 838.0,\n    65204 => 892.0,\n    65205 => 1221.0,\n    65206 => 1275.0,\n    65207 => 838.0,\n    65208 => 892.0,\n    65209 => 1209.0,\n    65210 => 1225.0,\n    65211 => 849.0,\n    65212 => 867.0,\n    65213 => 1209.0,\n    65214 => 1225.0,\n    65215 => 849.0,\n    65216 => 867.0,\n    65217 => 925.0,\n    65218 => 949.0,\n    65219 => 796.0,\n    65220 => 820.0,\n    65221 => 925.0,\n    65222 => 949.0,\n    65223 => 796.0,\n    65224 => 820.0,\n    65225 => 597.0,\n    65226 => 532.0,\n    65227 => 597.0,\n    65228 => 482.0,\n    65229 => 597.0,\n    65230 => 532.0,\n    65231 => 523.0,\n    65232 => 482.0,\n    65233 => 1037.0,\n    65234 => 1035.0,\n    65235 => 478.0,\n    65236 => 506.0,\n    65237 => 776.0,\n    65238 => 834.0,\n    65239 => 478.0,\n    65240 => 506.0,\n    65241 => 824.0,\n    65242 => 843.0,\n    65243 => 476.0,\n    65244 => 552.0,\n    65245 => 727.0,\n    65246 => 757.0,\n    65247 => 305.0,\n    65248 => 331.0,\n    65249 => 619.0,\n    65250 => 666.0,\n    65251 => 536.0,\n    65252 => 578.0,\n    65253 => 734.0,\n    65254 => 761.0,\n    65255 => 278.0,\n    65256 => 302.0,\n    65257 => 524.0,\n    65258 => 536.0,\n    65259 => 527.0,\n    65260 => 461.0,\n    65261 => 483.0,\n    65262 => 517.0,\n    65263 => 783.0,\n    65264 => 833.0,\n    65265 => 783.0,\n    65266 => 833.0,\n    65267 => 278.0,\n    65268 => 302.0,\n    65269 => 570.0,\n    65270 => 597.0,\n    65271 => 570.0,\n    65272 => 597.0,\n    65273 => 570.0,\n    65274 => 597.0,\n    65275 => 570.0,\n    65276 => 597.0,\n    65279 => 0.0,\n    65529 => 0.0,\n    65530 => 0.0,\n    65531 => 0.0,\n    65532 => 0.0,\n    65533 => 1025.0,\n  ),\n  'CIDtoGID_Compressed' => true,\n  'CIDtoGID' => 'eJzt3AW087iZOHxJli3LliUZXmZmZmZmZmZmZmZmZmZmZmZmZmb+p3e780230+60M+3sfqvfObIl+ZH82E6cm9yTAPAbaQADHRiAABNQYAEbMOAADgSQwAUe8EEAwoHwIAKICCKByCAKiAqigeggBogJYoHYIA6IC+KB+CABSAgSgcQgCUgKkoHkIAVICVKB1CANSAvSgfQgA8gIMoHMIAvICrKB7CAHyAlygdwgD8gL8oH8oAAoCAqBwqAIKAqKgeKgBCgJSoHSoAwoC8qB8qACqAgqgcqgCqgKqoHqoAaoCWr91oMPqQ3qgLqgHqgPGoCGoBFoDJqApqAZaA5agJagFWgN2oC2oB1oDzqAjqAT6Ay6gK6gG+gOeoCeoBfoDfqAvqAf6A8GgIFgEBgMhoChYBgYDkaAkWAUGA3GgLFgHBgPJoCJYBKYDKaAqWAamA5mgJlgFpgN5oC5YB6YDxaAhWARWAyWgKVgGVgOVoCVYBVYDdaAtWAdWA82gI1gE9gMtoCtYBvYDnaAnWAX2A32gL1gH9gPDoCD4BA4DI6Ao+AYOA5OgJPgFDgNzoCz4Bw4Dy6Ai+ASuAyugKvgGrgOboCb4Ba4De6Au+AeuA8egIfgEXgMnoCn4Bl4Dl6Al+AVeA3egLfgHXgPPoCP4BP4DL6Ar+Ab+A5+QAAhRFCDGOrQgASakEIL2pBBB3IooIQu9KAPAxgOhocRYEQYCUaGUWBUGA1GhzFgTBgLxoZxYFwYD8aHCWBCmAgmhklgUpgMJocpYEqYCqaGaWBamA6mhxlgRpgJZoZZYFaYDWaHOWBOmAvmhnlgXpgP5ocFYEFYCBaGRWBRWAwWhyVgSVgKloZlYFlYDpaHFWBFWAlWhlVgVVgNVoc1YE1YC9aGdWBdWA/Whw1gQ9gINoZNYFPYDDaHLWBL2Aq2hm1gW9gOtocdYEfYCXaGXWBX2A12hz1gT9gL9oZ9YF/YD/aHA+BAOAgOhkPgUDgMDocj4Eg4Co6GY+BYOA6OhxPgRDgJToZT4FQ4DU6HM+BMOAvOhnPgXDgPzocL4EK4CC6GS+BSuAwuhyvgSrgKroZr4Fq4Dq6HG+BGuAluhlvgVrgNboc74E64C+6Ge+BeuA/uhwfgQXgIHoZH4FF4DB6HJ+BJeAqehmfgWXgOnocX4EV4CV6GV+BVeA1ehzfgTXgL3oZ34F14D96HD+BD+Ag+hk/gU/gMPocv4Ev4Cr6Gb+Bb+A6+hx/gR/gJfoZf4Ff4DX6HPxBAECGkIYx0ZCCCTESRhWzEkIM4EkgiF3nIRwEKh8KjCCgiioQioygoKoqGoqMYKCaKhWKjOCguiofiowQoIUqEEqMkKClKhpKjFCglSoVSozQoLUqH0qMMKCPKhDKjLCgryoayoxwoJ8qFcqM8KC/Kh/KjAqggKoQKoyKoKCqGiqMSqCQqhUqjMqgsKofKowqoIqqEKqMqqCqqhqqjGqgmqoVqozqoLqqH6qMGqCFqhBqjJqgpaoaaoxaoJWqFWqM2qC1qh9qjDqgj6oQ6oy6oK+qGuqMeqCfqhXqjPqgv6of6owFoIBqEBqMhaCgahoajEWgkGoVGozFoLBqHxqMJaCKahCajKWgqmoamoxloJpqFZqM5aC6ah+ajBWghWoQWoyV/ui2hpWgZWv6fNym04s/rlf/19oVWodVoDVqL1qH1aAPaiDahzWgL2oq2oe1oB9qJdqHdaA/ai/ah/egAOogOocPoCDqKjqHj6AQ6iU6h0+gMOovOofPoArqILqHL6Aq6iq6h6+gGuoluodvoDrqL7qH76AF6iB6hx+gJeoqeoefoBXqJXqHX6A16i96h9+gD+og+oc/oC/qKvqHv6If2pxcYqCFN+/OLDdb00NIIFaKZGtUszdaY5vydlyeuCU1qruZpvhZo4cL6wmsRtIhaJC2yFuWnuKhaNC26FkOLqcXSYofacUIlrhZPi68l0BJqibTEWhItqZZMS66l0FJqqbTUWhotrZZOS69lCEVm1DJpmbUsWlYtm5Zdy6Hl1HJpubU8Wl4tn5ZfK6AV1ApphbUiWlGtmFZcK6GV1EpppbUyWlmtnFZeq6BV1CpplbUqWlWtmlZdq6HV1GpptbU6Wl2tnlZfa6A11BppjbUmWlOtmdZca6G11FpprbU2WlutndZe66B11DppnbUuWletm9Zd66H11HppvbU+Wl+tn9ZfG6AN1AZpg7Uh2lBtmDZcG6GN1EZpo7Ux2lhtnDZem6BN1CZpk7Up2lRtmjZdm6HN1GZps7U52lxtnjZfW6At1BZpi7Ul2lJtmbZcW6Gt1FZpq7U12lptnbZe26Bt1DZpm7Ut2lZtm7Zd26Ht1HZpu7U92l5tn7ZfO6Ad1A5ph7Uj2lHtmHZcO6Gd1E5pp7Uz2lntnHZeu6Bd1C5pl7Ur2lXtmnZdu6Hd1G5pt7U72l3tnnZfe6A91B5pj7Un2lPtmfZce6G91F5pr7U32lvtnfZe+6B91D5pn7Uv2lftm/Zd+4EBhhhhDWOsYwMTbGKKLWxjhh3MscASu9jDPg5wOBweR8ARcSQcGUfBUXE0HB3HwDFxLBwbx8FxcTwcHyfACXEinBgnwUlxMpwcp8ApcSqcGqfBaXE6nB5nwBlxJpwZZ8FZcTacHefAOXEunBvnwXlxPpwfF8AFcSFcGBfBRXExXByXwCVxKVwal8FlcTlcHlfAFXElXBlXwVVxNVwd18A1cS1cG9fBdXE9XB83wA1xI9wYN8FNcTPcHLfALXEr3Bq3wW1xO9wed8AdcSfcGXfBXXE33B33wD1xL9wb98F9cT/cHw/AA/EgPBgPwUPxMDwcj8Aj8Sg8Go/BY/E4PB5PwBPxJDwZT8FT8TQ8Hc/AM/EsPBvPwXPxPDwfL8AL8SK8GC/BS/EyvByvwCvxKrwar8Fr8Tq8Hm/AG/EmvPmXn4F4C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br4ZNt8tfBvfwXfxPXwfPwi1H+JH+DF+gp/iZ/g5foFf4lf4NX6D3+J3+D3+gD/iT/gz/oK/4m/4O/6hAx3qSNd0rOu6oRPd1Klu6bbOdEfnAOhCl7/+z7//ju7qnu7rgR5OD69H0CPqkfTIehQ9qh5Nj67H0GPqsfTYehw9blhsPD3+X41PoCfUE+mJ9SR6Uj2ZnlxPoafUU+mp9TR6Wj2dnl7PoGfUM+mZ9Sx6Vj2bnl3PoefUc/1sfG49j55Xz6fn/xW5FtALhpaF9MKhZZG/2lr0Z/Vif14XD5USekm9lF5aL6OX1cvp5fUKekW9kl5Zr6JX1avp1fUaek29ll5br6PX1evp9fUGesOfzdRIb6w30ZvqzfTmegu9pd5Kb6230dvq7fT2ege9o95J76x30bvq3fTuoegeYWN6/mx8L7233kfvq/fT++sD9IH6IH2wPkQfqg/Th+sj9JH6qD/Hjf5pxBh9rD5OH69P0Cfqk/TJ+hR9qj5Nn67P0Gfqs/TZ+hx9rj5Pn68v0Bfqi/TF+hJ9qb5MX66v0Ffqq/TV+hp9rb5OX69v0Dfqm/TN+hZ9q75N367v0Hfqu/Td+h59r75P368f0A/qh/TD+hH9qH5MP66f0E/qp/TT+hn9rH5OP69f0C/ql/7iDF/Wr+hXw2rX9Ouh5Y1QufnT1lv//RX8hWt6W7+j39Xv6ff1B/pD/ZH+WH/yz8yj/GvoT/Vn+nP9hf5Sf6W/1t/ob/V3+nv9g/5R/6R/1r/oX/Vv+nf9hwEMaCBDM7ChG4ZBDNOghmXYBjMcgxvCkIZreIb/H7MagRHOCG9EMCIakYzIRhQjqhHNiB62JYYR04j1Rx6xoiiKoiiKoij/Nxmx/+gMQjnEMeKGlvHC6vGNBKFlwrB6or+ISmwkMZIayUK15EYKI6WRykhtpDHShtrpjPRGhtA6Y6hkCovNbGQJLbMa2YzsRg4jp5HLyG3kMfIa+Yz8RgGjYGhbIaOwEfYJi1HUKGYUN0oYJUP1UqFS2ihjlDXKGeWNCmHbKxqVjMpGFaOqUc2obtQwahph/7U0aht1/o0nSVGUX2DUNeoZ9Y0GRkOjkdHYaGI0NZoZzY0WRkujldHaaGO0NdoZ7Y0ORkejk9HZ6GJ0NboZ3Y0eRk+jl9Hb6GP0NfoZ/Y0BxkBj0C/OP9gYYgw1hhnDjRHGSGOUMdoYY4w1xhnjjQnGRGOSMdmYYkw1phnTjRnGTGOWMduYY8w15hnzjQXGQmORsdhYYiw1lhnLjRXGSmOVsdpYY6w11hnr/91nSlEURfmfxdhgbDQ2GZuNLcZWY1uovd3YYew0dhm7jT3GXmOfsd84YBw0DhmHjSPGUeOYcdw4YZwMxZ0yThtnjLPGOeO8ccG4aFwyLhtXjKvGNeO6ccO4adwybht3jLvGPeO+8cB4aDwKjXlsPDGeGs+M58YL46XxynhtvDHeGu+M98YH46PxyfhsfDG+Gt9Ckd+NHwQQSBDRCAaA6MQghJiEEovYhBGHcCKIJC7xiE8CEo6EJxFIRBKJRCZRSFQSjUQnMUhMEovEJnFIXBKPxCcJSEKSiCQmSUhSkowkJylISpKKpCZpSFqSjqQnGUhGkolkJllIVpKNZCc5SE6Si+QmeUheko/kJwVIQVKIFCZFSFFSjBQnJUhJUoqUJmVIWVKOlCcVSEVSiVQmVUhVUo1UJzVITVKL1CZ1SF1Sj9QnDUhD0og0Jk1IU9KMNP/T2SctSEvSirQmbUhb0o60Jx1IR9KJdCZdSFfSjXQnPUhP0ov0Jn1IX9KP9CcDyEAyiAwmQ8hQMowMJyPISDKKjCZjyFgyjownE8hEMik072QyhUwl08h0MoPMJLPIbDKHzCXzyHyygCwki8hisoQsJcvIcrKCrCSryGqyhqwl6/7ro4OsJxvIRrKJbCZbyFayjWwnO8hOsovsJnvIXrKP7CcHyEFyiBwmR8hRcowcJyfISXKKnCZnyFlyjpwnF8hFcolcJlfIVXKNXCc3yE1yi9wmd8jd0Pz3yH3ygDwkj8hj8oQ8Jc/Ic/KCvCSvyGvyhrwl70Ix78kH8pF8Ip/JF/KVfCPfyQ8TmNBEpmZiUzcNk5imSU3LtE1mOib/60e5KUxpuqZn+mZghjPDmxHMiGYkM7IZxYxqRjOjmzHMmD/FxjJjm3HMuGY8M76ZwExoJjITm0nMpGayX5g3uZnCTGmmMlObacy0ZjozvZnBzGhmMjObWcysZrbf73n6C/vOHrbM8a/cx7+TmdPM9d9H/QPz5TbzmHnNfGZ+s4BZ0CxkFv6FmCJmUbOYWdwsYZY0S5mlzTJmWbOcWd6sYFY0K5mVzSpmVbOaWd2sYdY0a5m1zTpmXbOeWd9s8HtmqiiKoiiKoiiK8q9nNjQbmY3NJmZTs5nZ3GxhtjRbma3NNmZbs53Z3uxgdjQ7mZ3NLmbXUGw3s7vZw+xp9jJ7m33MvmY/s785wBxoDjIHh801xBxqDjOHmyPMkeYoc7Q5JtQ31hxnjjcnmBPNSeZkc4o51ZxmTjdnmDPNWeZsc44515xnzjcXmAvNReZic4m51FxmLjdXmCvNVeZqc4251lxnrjc3mBvNTeZmc4u51dxmbjd3hGbeae4yd5t7zL3mPnO/ecA8aB4yD5tHzKPmsb95tMfNE2Hrk6Fy6r9sO/0PnLUz5lnznHnevGBeNC+Zl80r5lXzmnndvGHeNG+Zt8075l3znnnffGA+NB+Zj80n5lPzmfncfGG+NF+Zr8035lvznfne/PDTjB/NT+Zn84v51fz2D13A38j8bv6ggEKKqEYx1alBCTUppRa1KaMO5VRQSV3qUZ8GNBwNTyPQiDQSjUyj0Kg0Go1OY9CYNBaNTePQuDQejU8T0IQ0EU1Mk9CkNBlNTlPQlDQVTU3T0LQ0HU1PM9CMNBPNTLPQrDQbzU5z0Jw0F81N89C8NB/NTwvQgrQQLUyL0KK0GC1OS9CStBQtTcvQsrQcLU8r0Iq0Eq1Mq9CqtBqtTmvQmrQWrU3r0Lq0Hq1PG9CGtBFtTJvQprQZbU5b0Ja0FW1N29C2tB1tTzvQjrQT7Uy70K60G+1Oe9CetBftTfvQvrQf7U8H0IF0EB1Mh9ChdBgdTkfQkXQUHU3H0LF0HB1PJ9CJdBKdTKfQqXQanU5n0Jl0Fp1N59C5dB6dTxfQhXQRXUyX0KV0GV1OV9CVdBVdTdfQtXQdXU830I10E91Mt9CtdBvdTnfQnXQX3U330L10H91PD9CD9BA9TI/Qo/QYPU5P0JP0FD1Nz9Cz9Bw9Ty/Qi/QSvUyv0Kv0Gr1Ob9Cb9Ba9Te/Qu/QevU8f0If0EX1Mn9Cn9Bl9Tl/Ql/QVfU3f0Lf0HX1PP9CP9NN/Xn/6mX6hX+k3+p3+sIAFLWRpFrZ0y7CIZVrUsizbYpZjcUv8Kd6Slmt5lm8FVth36azwVgQrohXJimxFsaJa0azoVgwrphXLim3FseJa8az4VgIroZXISmwlsZJayazkVgorpZXKSm2lsdJa6az0VgYro5XJymxlCZsvq5XNym7lsHJaYZ8FWbmtPFZeK5+V3ypgFbQKhXoKh0qRUCkaKsWs4lYJq6RVyiptlbHKWuWs8lYFq6JVyapsVbGqWtWs6lYNq6ZVy6pt1bHqWvWs+lYDq6HVyGpsNQmbv6nVzGputbBaWq2s1lYbq63VzmpvdbA6Wp2szlYXq6vVzepu9bB6Wr2s3lYfq6/Vz+pvDbAGWoOswdYQa6g1zBpujbBGWqOs0dYYa6w1zhpvTbAmWpOsydYUa6o1zZpuzbBmhvY1y5ptzbHmWvOs+dYCa6G1yFpsLbGWWsus5daK0PaV1iprtbXGWmuts9ZbG6yN1iZrs7XF2mptC8t1u7XD2mntsnZbe0KtvdY+a791wDpoHbIOW0eso9Yx67h1wjppnbJOW2ess9Y563zYuAvWRetSaH3ZumJdta5Z160b1k3rlnU71HfHumvds+5bD6yH1iPrsfXEemo9s55bL6yX1ivrtfXGemu9s95bH6yP1ifrs/XF+mp9s75bP2xgQxvZmo1t3TZsYps2tS3btpnt2NwWtrRd27N9O7DD2eHtCHZEO5Id2Y5iR7Wj2dHtGHZMO5Yd245jx7Xj2fHtBHZCO5Gd2E5iJ7WT2cntFHZKO5Wd2k5jp7XT2entDHZGO5Od2c5iZ7Wz2dntHHZOO5ed285j57Xz2fntAv/fPc0uaBeyC9tF7KJ2Mbu4XSKsr6Rdyi5tl7HL2uXs8nYFu6Jdya5sV7Gr2tXs6nYNu6Zdy65t17Hr2vXs+nYDu6HdyG4cGtfEbmo3s5vbLeyWdiu7td3Gbmu3s9vbHf68r452J7uz3cXuanezu9s97J52L7u33cfua/ez+9sD7IH2IHuwPcQeag8Lix9uj7BHhtVG/Zr7sz3aHvNTfaw97s+18faEn3on/tp7/S/OP8mebE+xp9rT7On2DHumPcueHeqdY8+159nz7QX2QnuRvdheYi+1l9nL7RX2SnuVvdpeY6+119nr7Q32RnuTvdneYm+1t9nb7R32TnuXvdveY++199n77QP2QfuQfdg+Yh+1j9nH7RP2SfuUfdo+Y5+1z9nn7Qv2RfuSfdm+Yl+1r9nX7Rv2TftWaP+3w3K7Eyp37Xv2ffuB/dB+ZD+2n9hP7Wf2c/uF/dJ+Zb+239hv7Xf2e/uD/dH+ZH+2v9hf7W/2d/sHAwwyxDSGmc4MRpjJKLOYzRhzGGeCSeYyj/ksYOFYeBaBRWSR/uOMsMg/Pz8sCovKorHoLAaLyWKx2CwOi8visfgsAUvIErHELAlLypKx5CwFS8lSsdQsDUvL0rH0LAPLyDKxzCwLy8qysewsB8vJcrHcLA/Ly/Kx/KwAK8gKscKsCCvKirHirAQryUqx0qwMK8vKsfKsAqvIKrHKrAqryqqx6qwGq8lqsdqsDqvL6rH6rAFryBqxxqwJa8qaseasBWvJWrHWrA1ry9qx9qwD68g6sc6sC+vKurHurAfryXqx3qwP68v6sf5sABvIBrHBbAgbyoax4WwEG8lGsdFsDBvLxrHxbAKbyCaxyWwKm8qmselsBpvJZrHZbA6by+ax+WwBW8gWscVsCVvKlrHlbAVbyVax1WwNW8vWsfVsA9vINrHNbAvbyrax7WwH28l2sd1sD9vL9rH97AA7yA6xw+wIO8qOsePsBDvJTrHT7Aw7y86x8+wCu8guscvsCrvKrrHr7Aa7yW6x2+wOu8vusfvsAXvIHrHH7Al7yp6x5+wFe8lesdfsDXvL3rH37AP7yD6xz+wL+8q+se/shwMc6CBHc7CjO4ZDHNOhjuXYDnMchzvCkY7reI7vBE44J7wTwYnoRHIiO1GcqE40J7oTw4npxHJiO3GcuE48J76TwEnoJHISO0mcpE4yJ7mTwknppHJSO2mctE46J72TwcnoZHIyO1mcrE42J7uTw8np5HJyO3mcvE4+J79TwCnoFHIKO0Wcok4xp7hTwinplHJKO2Wcsk45p7xTwanoVHIqO1Wcqk41p7pTw6np1HJqO3Wcuk49p77TwGnoNHIaO02cpk4zp7nTwmnptHJaO22ctk47p73TwenodHI6O12crk43p7vTw+np9HJ6O32cvk4/p78zwBnoDHIGO0Ococ4wZ7gzwhnpjHJGO2Ocsc44Z7wzwZnoTHImO1OcqT9/PjjTnOlh6xnOTGeWM9uZ48wNa89z5jsLnIXOorDWYmfJb7kr/d6cpc4y56dfQ3DCfg3BWfkLcav+5gyr/6K1xlnrrHPWOxucjc4mZ7OzxdnqbHO2Ozucnc4uZ7ezx9nr7HP2/8asDzgHf2XkoVA5HFY78tv2+c9wjjp/8x3Xv3zfx50TzknnlHPaOeOcdc45550Lf1Qu/xs5F51LzmXninPVueZcd244N51bzm3njnPXuefcdx44D51HzmPnifPUeeY8d144L51XzmvnjfPWeee8dz44H51Pzmfni/PV+eZ8d35wwCFHXOOY69zghJuccovbnHGHcy645C73uM8DHo6H5xF4RB6JR+ZReFQejUfnMXhMHovH5nF4XB6Px+cJeEKeiCfmSXhSnown5yl4Sp6Kp+ZpeFqejqfnGXhGnoln5ll4Vp6NZ+c5eE6ei+fmeXheno/n5wV4QV6IF+ZFeFFejBfnJXhJXoqX5mV4WV6Ol+cVeEVeiVfmVXhVXo1X5zV4TV6L1+Z1eF1ej9fnDXhD3og35k14U96MN+cteEveirfmbXhb3o635x14R96Jd+ZdeFfejXfnPXhP3ov35n14X96P9+cD+EA+iA/mQ/hQPowP5yP4SD6Kj+Zj+Fg+jo/nE/hEPolP5lP4VD6NT+cz+Ew+i8/mc/hcPo/P5wv4Qr6IL+ZL+FK+jC/nK/hKvoqv5mv4Wr6Or+cb+Ea+iW/mW/hWvo1v5zv4Tr6L7+Z7+F6+j+/nB/hBfogf5kf4UX6MH+cn+El+ip/mZ/hZfo6f5xf4RX6JX+ZX+FV+jV/nN/hNfovf5nf4XX6P3+cP+EP+iD/mT/hT/ow/5y/4S/6Kv+Zv+Fv+jr/nH/hH/ol/5l/4V/6Nf+c/BBBQIKEJLHRhCCJMQYUlbMGEI7gQQgpXeMIXgQgnwosIIqKIJCKLKCKqiCaiixgipoglYos4Iq6IJ+KLBCKhSCQSiyQiqUgmkosUIqVIJVKLNCKtSCfSiwwio8gkMossIqvIJrKLHCKnyCVyizwir8gn8osCoqAoJAqLIqKoKCaKixKipCglSosyoqwoJ8qLCqKiqCQqiyqiqqgmqosaoqaoJWqLOqKuqCfqiwaioWgkGosmoqloJpqLFqKlaCVaizaiLQCinWgvOoiOopPoLLqIrqKb6C56iJ6il+gt+oi+op/oLwaIgWKQGCyGiKFimBguRvzl80+MFKPEaDHml5+dv44Y+5tGjxPjxQQRehchJonJYooIe70X08R0MUPMFLPEbDFHzBXzxHyxQCwUi8RisUQsFcvEcrFCrBSrxGqxRqwV68R6sUFsDI3cJDaLLWKr2Ca2ix1ip9gldos9Yq/YJ/aLA+KgOCQOiyPiqDgmjosT4qQ4JU6LM+KsOCfOiwviorgkLosroXmuhso1cV3cEDf/nGnonYG4Le6Iu+KeuC8eiIdhvY/EY/FEPBXPxHPxQrwUr8Rr8Ua8Fe/Ee/FBfBSfxGfxRXwV38R38UMCCSWSmsRSl4Yk0pRUWtKWTDqSSyGldKUnfRnIcDK8jCAjykgysowio/5HDjKajC5jyJgylowt48i4Mp6MLxPIhDKRTCyTyKQymUwuU8iUMpVMLdPItKER6WR6mUFmlJlkZplFZpXZZHaZQ+aUuWTun18HmUfm/cevnsz3s3p+WUAWlIVkYfnTr3fIorKYLC5LyJKylCwty8iyspwsLyvIirKSrCyryKqymqwua8iaspasLevIurKerC8byIaykWwsm8imsplsLlvIlrKVbC3byLaynWwvO8iOspPsLLvIrrKb7C57yJ6yl+wt+8i+sp/sLwfIgXKQHCyHyKFymBwuR8iRcpQcLcfIsXKcHC8nyIlykpwsp8ipcpqcLmfImXKWnC3nyLlynpwvF8iFcpFcLJfIpXKZXC5XyJVylVwt18i1cp1cLzfIjXKT3Cy3yK1ym9wud8idcpfcLffIvXKf3C8PyIPykDwsj8ij8pg8Lk/Ik/KUPC3PyLPynDwvL8iL8pK8LK/Iq/KavC5vyJvylrwt78i78p68Lx/Ih/KRfCyfyKfymXwuX8iX8pV8Ld/It/KdfC8/yI/yk/wsv8iv8pv8Ln+4wIUucjUXu7pruMQ1Xeparu0y13G5K1zpuq7n+m7ghnPDuxHciG4kN7IbxY3qRnOjuzHcmG4sN7Ybx43rxnPjuwnchG4iN7GbxE3qJnOTuynclG4qN7Wbxk3rpnPTuxncjG4mN7Obxc3qZnOzuzncnG4uN7ebx83r5nPzuwXcgm4ht7BbxC3qFnOLuyXckm4pt7Rbxi3rlnPLuxXcim4lt7Jb5eePJbeqWy1sXd2t8Y8/Ev85bk339/gVxt+aRW33f+C3qdy6bj23vtvAbeg2chu7Tf6BkU3/7tZmbvOf6i3clm6rX4hp7bZx27rt3PZuB7ej28nt7HZxu7rd3O5uD7en28vt/avy6PPrc/79uH3dfr8iqr87wB3oDnIHu0Pcoe4wd7g7wh3pjnJHu2Pcse44d7w7wZ3oTnInu1Pcqe40d7o7w53pznJnu3Pcue48d767wF3oLvo7e1jsLnGXusvc5e4Kd6W7yl3trnHXuuvcP/S7N+4Gd+PPWpvcze4Wd6u7zd3u7nB3urvc3e4ed6+7z93vHnAPuofcw+4R96h7zD3unnBPuqfc0+6Zn0afdc+5590L7kX30i/t63fL+bJ75V85v/K/lXvVveZed2+4N91b7m33jnvXvefedx+4D91H7mP3ifvUfeY+d1+4L91X7mv3TWjEW/ed+9794H50P7mf/+j8/2juF/er+8397v7wgAc95Gke9nTP8IhnetSzPNtjnuNxT3jScz3P873AC+eF9yJ4Eb1IXmQvihfVi+ZF92J4MX9pfi+WF9uL48X14nnxvQReQi+Rl9hL4iX1knnJvRReSi+Vl9pL46X10nnpvQxeRi+Tl9nL4mX1snnZvRxeTi+Xl9vL4+X18nn5vQJeQa+QV9gr4hX1innFvRJeSa+UV9or45X1ynnlf2HvFf7Fp+//HK/iX7QqhS0re1W8ql61v4qt/u/KSlEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVF+G6+GV9Or5dX26nh1vXpefa+B19Br5DX2mnhNvWZec6+F19Jr5bX22nhtvXZee6+D19Hr5HX2unhdvW5ed6+H19Pr5fX2+nh9vX5ef2+AN9Ab5A32hnhDvWHecG+EN9Ib5Y32xnhjvXHeeG+CN9Gb5E32pnhTvWne9D/6+BVFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+f8Pb4Y305vlzfbmeHO9ed58b4G30FvkLfaWeEu9Zd5yb4W30lvlrfbWeGu9dd56b4O30dvkbfa2eFu9bd52b4e309vl7fb2eHu9fd5+74B30DvkHfaOeEe9Y97xP/r4FOVPvBPeSe+Ud/qn9hnvbNj6nHc+bH3Bu+hd8i7/4tgr3lXvmnfdu+Hd9G55t7073l3vnnffe/BP5vLQe+Q99p78Rd9T71nY+rn34p+b9X8H76X3ynvtvfHeeu+8994H76P3yfvsffG+et+87z9F/fCBD33ka39q+djXfcMnvulT3/Jtn/nOf0b63Be+9F3f830/8MP54f0IfkQ/kh/Zj+JH9aP50f0YP8XG9GP5sf04flw/Xlg7vp/AT+gn8hP7ScLaSf1kfytvP7mfwk/pp/pHj9dP7afx0/rpftaT3s/gZ/Qz+Zn9LKFWVj/b3x2f3c/h5/Rz+bn9PH5eP5+f3y/gF/xHs/j38Qv5hf0iflG/mF/cL+GX/KPzURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF+XfxS/ml/TJ+Wb+cX96v4Ff0K/mV/Sp+Vb+aX92v4df0a/m1/Tp+Xb+eX99v4Df0G/mN/+icld+P38Rv6jfzm//ReSiKoiiK8u/jt/Bb+q381n4bv63fzm/vd/A7+p38zn4Xv6vfze/u9/B7+r383n4fv6/fz+/vD/AH+oP8wf4Qf6g/zB/uj/BH+qP80f4Yf6w/LjTfeH+CP9Gf5E/2p/hT/Wn+dH+GP9Of5c/25/hz/Xn+fH+Bv9Bf5C/2l/hL/WX+cn/FH30OFEVR/lj+yj86A0VRFEVR/m/wV/mr/TX+Wn+dv97f8DejNvqb/M3+Fn/rz/q2+dv9Hf5Of5e/29/j7/X3+fv9A/5B/5B/2D/iH/WP+cf9E/5J/5R/2j/jn/XP+edDoy74F/1L/mX/Sqh+NVSu+ddDyxv+zdDyln/bv+Pf9e/59/0H/kP/kf84bE9P/Kf+M/+5/8J/6b/yX/tv/Lf+O/+9/8H/6H/yP/tf/K/+N/+7/yMAAQxQoAU40AMjIIEZ0MAK7IAFTsADEcjADbzAD4IgXBA+iBBEDCIFkYMoQdQgWhA9iBHEDGIFsYM4QdwgXhA/SBAkDBIFiYMkQdIgWZA8SBGkDFIFqYM0QdogXZA+yBBkDDIFmYMsQdafn60gW5A9yBHk/P2uUpAryB3kCfIG+YL8QYGgYFAoKBzqLRIU/SmiWFA8KBGUDEoFpX/VjGWCskG5oPzvl6OiKP/bBBWCikGloHJQJagaVAuqBzWCmkGtoHZQJ6gb1Avq/7fjGwQNg0bB/9j/CQdNgqZBs6B50CJUbxm0CloHbYK2QbugfdAh6Bh0CjoHXYKuQbege9Aj6Bn0CnoHfYK+Qb+gfzAgGBgMCgYHQ4KhwbBgeDAiGBmMCkYHY4KxwbhgfDAhmBhMCiYHU4KpwbRgejAjmBnMCmYHc4K5wbxgfrAgWBgsChYHS4KlwbJgebAiWBmsClYHa4K1wbpgfbAh2BhsCjYHW4KtwbZge7Aj2BnsCnYHe4K9wb5gf3AgOBgcCg4HR4KjwbHgeHAiOBmcCk4HZ4KzwbngfHAhuBhcCi4HV4KrwbXgenAjuBncCm4Hd4K7wb3gfvAgeBg8Ch4HT4KnwbPgefAieBm8Cl4Hb4K3wbvgfdjZ+fBHXx/l3y34GHwKPgdfgq9/av0/+/tE7Q==',\n  '_version_' => 6,\n);"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dompdf_font_family_cache.dist.php",
    "content": "<?php\nreturn function ($rootDir) {\n    $distFontDir = $rootDir . '/lib/fonts';\n    return [\n        'sans-serif' =>\n            [\n                'normal' => $distFontDir . '/Helvetica',\n                'bold' => $distFontDir . '/Helvetica-Bold',\n                'italic' => $distFontDir . '/Helvetica-Oblique',\n                'bold_italic' => $distFontDir . '/Helvetica-BoldOblique'\n            ],\n        'times' =>\n            [\n                'normal' => $distFontDir . '/Times-Roman',\n                'bold' => $distFontDir . '/Times-Bold',\n                'italic' => $distFontDir . '/Times-Italic',\n                'bold_italic' => $distFontDir . '/Times-BoldItalic'\n            ],\n        'times-roman' =>\n            [\n                'normal' => $distFontDir . '/Times-Roman',\n                'bold' => $distFontDir . '/Times-Bold',\n                'italic' => $distFontDir . '/Times-Italic',\n                'bold_italic' => $distFontDir . '/Times-BoldItalic'\n            ],\n        'courier' =>\n            [\n                'normal' => $distFontDir . '/Courier',\n                'bold' => $distFontDir . '/Courier-Bold',\n                'italic' => $distFontDir . '/Courier-Oblique',\n                'bold_italic' => $distFontDir . '/Courier-BoldOblique'\n            ],\n        'helvetica' =>\n            [\n                'normal' => $distFontDir . '/Helvetica',\n                'bold' => $distFontDir . '/Helvetica-Bold',\n                'italic' => $distFontDir . '/Helvetica-Oblique',\n                'bold_italic' => $distFontDir . '/Helvetica-BoldOblique'\n            ],\n        'zapfdingbats' =>\n            [\n                'normal' => $distFontDir . '/ZapfDingbats',\n                'bold' => $distFontDir . '/ZapfDingbats',\n                'italic' => $distFontDir . '/ZapfDingbats',\n                'bold_italic' => $distFontDir . '/ZapfDingbats'\n            ],\n        'symbol' =>\n            [\n                'normal' => $distFontDir . '/Symbol',\n                'bold' => $distFontDir . '/Symbol',\n                'italic' => $distFontDir . '/Symbol',\n                'bold_italic' => $distFontDir . '/Symbol'\n            ],\n        'serif' =>\n            [\n                'normal' => $distFontDir . '/Times-Roman',\n                'bold' => $distFontDir . '/Times-Bold',\n                'italic' => $distFontDir . '/Times-Italic',\n                'bold_italic' => $distFontDir . '/Times-BoldItalic'\n            ],\n        'monospace' =>\n            [\n                'normal' => $distFontDir . '/Courier',\n                'bold' => $distFontDir . '/Courier-Bold',\n                'italic' => $distFontDir . '/Courier-Oblique',\n                'bold_italic' => $distFontDir . '/Courier-BoldOblique'\n            ],\n        'fixed' =>\n            [\n                'normal' => $distFontDir . '/Courier',\n                'bold' => $distFontDir . '/Courier-Bold',\n                'italic' => $distFontDir . '/Courier-Oblique',\n                'bold_italic' => $distFontDir . '/Courier-BoldOblique'\n            ],\n        'dejavu sans' =>\n            [\n                'bold' => $distFontDir . '/DejaVuSans-Bold',\n                'bold_italic' => $distFontDir . '/DejaVuSans-BoldOblique',\n                'italic' => $distFontDir . '/DejaVuSans-Oblique',\n                'normal' => $distFontDir . '/DejaVuSans'\n            ],\n        'dejavu sans mono' =>\n            [\n                'bold' => $distFontDir . '/DejaVuSansMono-Bold',\n                'bold_italic' => $distFontDir . '/DejaVuSansMono-BoldOblique',\n                'italic' => $distFontDir . '/DejaVuSansMono-Oblique',\n                'normal' => $distFontDir . '/DejaVuSansMono'\n            ],\n        'dejavu serif' =>\n            [\n                'bold' => $distFontDir . '/DejaVuSerif-Bold',\n                'bold_italic' => $distFontDir . '/DejaVuSerif-BoldItalic',\n                'italic' => $distFontDir . '/DejaVuSerif-Italic',\n                'normal' => $distFontDir . '/DejaVuSerif'\n            ]\n    ];\n};\n"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/dompdf_font_family_cache.php",
    "content": "<?php return function ($fontDir, $rootDir) {\nreturn array (\n  'sans-serif' => array(\n    'normal' => $fontDir . '/Helvetica',\n    'bold' => $fontDir . '/Helvetica-Bold',\n    'italic' => $fontDir . '/Helvetica-Oblique',\n    'bold_italic' => $fontDir . '/Helvetica-BoldOblique',\n  ),\n  'times' => array(\n    'normal' => $fontDir . '/Times-Roman',\n    'bold' => $fontDir . '/Times-Bold',\n    'italic' => $fontDir . '/Times-Italic',\n    'bold_italic' => $fontDir . '/Times-BoldItalic',\n  ),\n  'times-roman' => array(\n    'normal' => $fontDir . '/Times-Roman',\n    'bold' => $fontDir . '/Times-Bold',\n    'italic' => $fontDir . '/Times-Italic',\n    'bold_italic' => $fontDir . '/Times-BoldItalic',\n  ),\n  'courier' => array(\n    'normal' => $fontDir . '/Courier',\n    'bold' => $fontDir . '/Courier-Bold',\n    'italic' => $fontDir . '/Courier-Oblique',\n    'bold_italic' => $fontDir . '/Courier-BoldOblique',\n  ),\n  'helvetica' => array(\n    'normal' => $fontDir . '/Helvetica',\n    'bold' => $fontDir . '/Helvetica-Bold',\n    'italic' => $fontDir . '/Helvetica-Oblique',\n    'bold_italic' => $fontDir . '/Helvetica-BoldOblique',\n  ),\n  'zapfdingbats' => array(\n    'normal' => $fontDir . '/ZapfDingbats',\n    'bold' => $fontDir . '/ZapfDingbats',\n    'italic' => $fontDir . '/ZapfDingbats',\n    'bold_italic' => $fontDir . '/ZapfDingbats',\n  ),\n  'symbol' => array(\n    'normal' => $fontDir . '/Symbol',\n    'bold' => $fontDir . '/Symbol',\n    'italic' => $fontDir . '/Symbol',\n    'bold_italic' => $fontDir . '/Symbol',\n  ),\n  'serif' => array(\n    'normal' => $fontDir . '/Times-Roman',\n    'bold' => $fontDir . '/Times-Bold',\n    'italic' => $fontDir . '/Times-Italic',\n    'bold_italic' => $fontDir . '/Times-BoldItalic',\n  ),\n  'monospace' => array(\n    'normal' => $fontDir . '/Courier',\n    'bold' => $fontDir . '/Courier-Bold',\n    'italic' => $fontDir . '/Courier-Oblique',\n    'bold_italic' => $fontDir . '/Courier-BoldOblique',\n  ),\n  'fixed' => array(\n    'normal' => $fontDir . '/Courier',\n    'bold' => $fontDir . '/Courier-Bold',\n    'italic' => $fontDir . '/Courier-Oblique',\n    'bold_italic' => $fontDir . '/Courier-BoldOblique',\n  ),\n  'dejavu sans' => array(\n    'bold' => $fontDir . '/DejaVuSans-Bold',\n    'bold_italic' => $fontDir . '/DejaVuSans-BoldOblique',\n    'italic' => $fontDir . '/DejaVuSans-Oblique',\n    'normal' => $fontDir . '/dejavu_sans_normal_da52e5b8c125dc4342e1d9c6baf20f36',\n  ),\n  'dejavu sans mono' => array(\n    'bold' => $fontDir . '/DejaVuSansMono-Bold',\n    'bold_italic' => $fontDir . '/DejaVuSansMono-BoldOblique',\n    'italic' => $fontDir . '/DejaVuSansMono-Oblique',\n    'normal' => $fontDir . '/DejaVuSansMono',\n  ),\n  'dejavu serif' => array(\n    'bold' => $fontDir . '/DejaVuSerif-Bold',\n    'bold_italic' => $fontDir . '/DejaVuSerif-BoldItalic',\n    'italic' => $fontDir . '/DejaVuSerif-Italic',\n    'normal' => $fontDir . '/DejaVuSerif',\n  ),\n  'firefly' => array(\n    'normal' => $fontDir . '/firefly_normal_84575c6dbadbc0835bceff4be9182054',\n  ),\n);\n}; ?>"
  },
  {
    "path": "application/libraries/dompdf/lib/fonts/mustRead.html",
    "content": "<html>\n\t<head>\n\t\t<meta http-equiv=\"content-type\" content=\"text/html;charset=iso-8859-1\">\n\t\t<meta name=\"generator\" content=\"Adobe GoLive 4\">\n\t\t<title>Core 14 AFM Files - ReadMe</title>\n\t</head>\n\t<body bgcolor=\"white\">\n\t\t<font color=\"white\">or</font>\n\t\t<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\">\n\t\t\t<tr>\n\t\t\t\t<td width=\"40\"></td>\n\t\t\t\t<td width=\"300\">This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. <font color=\"white\">Col</font></td>\n\t\t\t</tr>\n\t\t</table>\n\t\t<p>Source <a href=\"http://www.adobe.com/devnet/font/#pcfi\">http://www.adobe.com/devnet/font/#pcfi</a></p>\n</body>\n</html>"
  },
  {
    "path": "application/libraries/dompdf/lib/html5lib/Data.php",
    "content": "<?php\n\n// warning: this file is encoded in UTF-8!\n\nclass HTML5_Data\n{\n\n    // at some point this should be moved to a .ser file. Another\n    // possible optimization is to give UTF-8 bytes, not Unicode\n    // codepoints\n    // XXX: Not quite sure why it's named this; this is\n    // actually the numeric entity dereference table.\n    protected static $realCodepointTable = [\n        0x00 => 0xFFFD, // REPLACEMENT CHARACTER\n        0x0D => 0x000A, // LINE FEED (LF)\n        0x80 => 0x20AC, // EURO SIGN ('€')\n        0x81 => 0x0081, // <control>\n        0x82 => 0x201A, // SINGLE LOW-9 QUOTATION MARK ('‚')\n        0x83 => 0x0192, // LATIN SMALL LETTER F WITH HOOK ('ƒ')\n        0x84 => 0x201E, // DOUBLE LOW-9 QUOTATION MARK ('„')\n        0x85 => 0x2026, // HORIZONTAL ELLIPSIS ('…')\n        0x86 => 0x2020, // DAGGER ('†')\n        0x87 => 0x2021, // DOUBLE DAGGER ('‡')\n        0x88 => 0x02C6, // MODIFIER LETTER CIRCUMFLEX ACCENT ('ˆ')\n        0x89 => 0x2030, // PER MILLE SIGN ('‰')\n        0x8A => 0x0160, // LATIN CAPITAL LETTER S WITH CARON ('Š')\n        0x8B => 0x2039, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK ('‹')\n        0x8C => 0x0152, // LATIN CAPITAL LIGATURE OE ('Œ')\n        0x8D => 0x008D, // <control>\n        0x8E => 0x017D, // LATIN CAPITAL LETTER Z WITH CARON ('Ž')\n        0x8F => 0x008F, // <control>\n        0x90 => 0x0090, // <control>\n        0x91 => 0x2018, // LEFT SINGLE QUOTATION MARK ('‘')\n        0x92 => 0x2019, // RIGHT SINGLE QUOTATION MARK ('’')\n        0x93 => 0x201C, // LEFT DOUBLE QUOTATION MARK ('“')\n        0x94 => 0x201D, // RIGHT DOUBLE QUOTATION MARK ('”')\n        0x95 => 0x2022, // BULLET ('•')\n        0x96 => 0x2013, // EN DASH ('–')\n        0x97 => 0x2014, // EM DASH ('—')\n        0x98 => 0x02DC, // SMALL TILDE ('˜')\n        0x99 => 0x2122, // TRADE MARK SIGN ('™')\n        0x9A => 0x0161, // LATIN SMALL LETTER S WITH CARON ('š')\n        0x9B => 0x203A, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK ('›')\n        0x9C => 0x0153, // LATIN SMALL LIGATURE OE ('œ')\n        0x9D => 0x009D, // <control>\n        0x9E => 0x017E, // LATIN SMALL LETTER Z WITH CARON ('ž')\n        0x9F => 0x0178, // LATIN CAPITAL LETTER Y WITH DIAERESIS ('Ÿ')\n    ];\n\n    protected static $namedCharacterReferences;\n\n    protected static $namedCharacterReferenceMaxLength;\n\n    /**\n     * Returns the \"real\" Unicode codepoint of a malformed character\n     * reference.\n     */\n    public static function getRealCodepoint($ref) {\n        if (!isset(self::$realCodepointTable[$ref])) {\n            return false;\n        } else {\n            return self::$realCodepointTable[$ref];\n        }\n    }\n\n    public static function getNamedCharacterReferences() {\n        if (!self::$namedCharacterReferences) {\n            self::$namedCharacterReferences = unserialize(\n                file_get_contents(dirname(__FILE__) . '/named-character-references.ser'));\n        }\n        return self::$namedCharacterReferences;\n    }\n\n    /**\n     * Converts a Unicode codepoint to sequence of UTF-8 bytes.\n     * @note Shamelessly stolen from HTML Purifier, which is also\n     *       shamelessly stolen from Feyd (which is in public domain).\n     */\n    public static function utf8chr($code) {\n        /* We don't care: we live dangerously\n         * if($code > 0x10FFFF or $code < 0x0 or\n          ($code >= 0xD800 and $code <= 0xDFFF) ) {\n            // bits are set outside the \"valid\" range as defined\n            // by UNICODE 4.1.0\n            return \"\\xEF\\xBF\\xBD\";\n          }*/\n\n        $y = $z = $w = 0;\n        if ($code < 0x80) {\n            // regular ASCII character\n            $x = $code;\n        } else {\n            // set up bits for UTF-8\n            $x = ($code & 0x3F) | 0x80;\n            if ($code < 0x800) {\n               $y = (($code & 0x7FF) >> 6) | 0xC0;\n            } else {\n                $y = (($code & 0xFC0) >> 6) | 0x80;\n                if ($code < 0x10000) {\n                    $z = (($code >> 12) & 0x0F) | 0xE0;\n                } else {\n                    $z = (($code >> 12) & 0x3F) | 0x80;\n                    $w = (($code >> 18) & 0x07) | 0xF0;\n                }\n            }\n        }\n        // set up the actual character\n        $ret = '';\n        if ($w) {\n            $ret .= chr($w);\n        }\n        if ($z) {\n            $ret .= chr($z);\n        }\n        if ($y) {\n            $ret .= chr($y);\n        }\n        $ret .= chr($x);\n\n        return $ret;\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/html5lib/InputStream.php",
    "content": "<?php\n\n/*\n\nCopyright 2009 Geoffrey Sneddon <http://gsnedders.com/>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n// Some conventions:\n// /* */ indicates verbatim text from the HTML 5 specification\n// // indicates regular comments\n\nclass HTML5_InputStream {\n    /**\n     * The string data we're parsing.\n     */\n    private $data;\n\n    /**\n     * The current integer byte position we are in $data\n     */\n    private $char;\n\n    /**\n     * Length of $data; when $char === $data, we are at the end-of-file.\n     */\n    private $EOF;\n\n    /**\n     * Parse errors.\n     */\n    public $errors = [];\n\n    /**\n     * @param $data | Data to parse\n     * @throws Exception\n     */\n    public function __construct($data) {\n\n        /* Given an encoding, the bytes in the input stream must be\n        converted to Unicode characters for the tokeniser, as\n        described by the rules for that encoding, except that the\n        leading U+FEFF BYTE ORDER MARK character, if any, must not\n        be stripped by the encoding layer (it is stripped by the rule below).\n\n        Bytes or sequences of bytes in the original byte stream that\n        could not be converted to Unicode characters must be converted\n        to U+FFFD REPLACEMENT CHARACTER code points. */\n\n        // XXX currently assuming input data is UTF-8; once we\n        // build encoding detection this will no longer be the case\n        //\n        // We previously had an mbstring implementation here, but that\n        // implementation is heavily non-conforming, so it's been\n        // omitted.\n        if (extension_loaded('iconv')) {\n            // non-conforming\n            $data = @iconv('UTF-8', 'UTF-8//IGNORE', $data);\n        } else {\n            // we can make a conforming native implementation\n            throw new Exception('Not implemented, please install iconv');\n        }\n\n        /* One leading U+FEFF BYTE ORDER MARK character must be\n        ignored if any are present. */\n        if (substr($data, 0, 3) === \"\\xEF\\xBB\\xBF\") {\n            $data = substr($data, 3);\n        }\n\n        /* All U+0000 NULL characters in the input must be replaced\n        by U+FFFD REPLACEMENT CHARACTERs. Any occurrences of such\n        characters is a parse error. */\n        for ($i = 0, $count = substr_count($data, \"\\0\"); $i < $count; $i++) {\n            $this->errors[] = [\n                'type' => HTML5_Tokenizer::PARSEERROR,\n                'data' => 'null-character'\n            ];\n        }\n        /* U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED\n        (LF) characters are treated specially. Any CR characters\n        that are followed by LF characters must be removed, and any\n        CR characters not followed by LF characters must be converted\n        to LF characters. Thus, newlines in HTML DOMs are represented\n        by LF characters, and there are never any CR characters in the\n        input to the tokenization stage. */\n        $data = str_replace(\n            [\n                \"\\0\",\n                \"\\r\\n\",\n                \"\\r\"\n            ],\n            [\n                \"\\xEF\\xBF\\xBD\",\n                \"\\n\",\n                \"\\n\"\n            ],\n            $data\n        );\n\n        /* Any occurrences of any characters in the ranges U+0001 to\n        U+0008, U+000B,  U+000E to U+001F,  U+007F  to U+009F,\n        U+D800 to U+DFFF , U+FDD0 to U+FDEF, and\n        characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF,\n        U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE,\n        U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF,\n        U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE,\n        U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and\n        U+10FFFF are parse errors. (These are all control characters\n        or permanently undefined Unicode characters.) */\n        // Check PCRE is loaded.\n        if (extension_loaded('pcre')) {\n            $count = preg_match_all(\n                '/(?:\n                    [\\x01-\\x08\\x0B\\x0E-\\x1F\\x7F] # U+0001 to U+0008, U+000B,  U+000E to U+001F and U+007F\n                |\n                    \\xC2[\\x80-\\x9F] # U+0080 to U+009F\n                |\n                    \\xED(?:\\xA0[\\x80-\\xFF]|[\\xA1-\\xBE][\\x00-\\xFF]|\\xBF[\\x00-\\xBF]) # U+D800 to U+DFFFF\n                |\n                    \\xEF\\xB7[\\x90-\\xAF] # U+FDD0 to U+FDEF\n                |\n                    \\xEF\\xBF[\\xBE\\xBF] # U+FFFE and U+FFFF\n                |\n                    [\\xF0-\\xF4][\\x8F-\\xBF]\\xBF[\\xBE\\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16})\n                )/x',\n                $data,\n                $matches\n            );\n            for ($i = 0; $i < $count; $i++) {\n                $this->errors[] = [\n                    'type' => HTML5_Tokenizer::PARSEERROR,\n                    'data' => 'invalid-codepoint'\n                ];\n            }\n        } else {\n            // XXX: Need non-PCRE impl, probably using substr_count\n        }\n\n        $this->data = $data;\n        $this->char = 0;\n        $this->EOF  = strlen($data);\n    }\n\n    /**\n     * Returns the current line that the tokenizer is at.\n     *\n     * @return int\n     */\n    public function getCurrentLine() {\n        // Check the string isn't empty\n        if ($this->EOF) {\n            // Add one to $this->char because we want the number for the next\n            // byte to be processed.\n            return substr_count($this->data, \"\\n\", 0, min($this->char, $this->EOF)) + 1;\n        } else {\n            // If the string is empty, we are on the first line (sorta).\n            return 1;\n        }\n    }\n\n    /**\n     * Returns the current column of the current line that the tokenizer is at.\n     *\n     * @return int\n     */\n    public function getColumnOffset() {\n        // strrpos is weird, and the offset needs to be negative for what we\n        // want (i.e., the last \\n before $this->char). This needs to not have\n        // one (to make it point to the next character, the one we want the\n        // position of) added to it because strrpos's behaviour includes the\n        // final offset byte.\n        $lastLine = strrpos($this->data, \"\\n\", $this->char - 1 - strlen($this->data));\n\n        // However, for here we want the length up until the next byte to be\n        // processed, so add one to the current byte ($this->char).\n        if ($lastLine !== false) {\n            $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine);\n        } else {\n            $findLengthOf = substr($this->data, 0, $this->char);\n        }\n\n        // Get the length for the string we need.\n        if (extension_loaded('iconv')) {\n            return iconv_strlen($findLengthOf, 'utf-8');\n        } elseif (extension_loaded('mbstring')) {\n            return mb_strlen($findLengthOf, 'utf-8');\n        } elseif (extension_loaded('xml')) {\n            return strlen(utf8_decode($findLengthOf));\n        } else {\n            $count = count_chars($findLengthOf);\n            // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range)\n            // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range)\n            return array_sum(array_slice($count, 0, 0x80)) +\n                   array_sum(array_slice($count, 0xC2, 0x33));\n        }\n    }\n\n    /**\n     * Retrieve the currently consume character.\n     * @note This performs bounds checking\n     *\n     * @return bool|string\n     */\n    public function char() {\n        return ($this->char++ < $this->EOF)\n            ? $this->data[$this->char - 1]\n            : false;\n    }\n\n    /**\n     * Get all characters until EOF.\n     * @note This performs bounds checking\n     *\n     * @return string|bool\n     */\n    public function remainingChars() {\n        if ($this->char < $this->EOF) {\n            $data = substr($this->data, $this->char);\n            $this->char = $this->EOF;\n            return $data;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Matches as far as possible until we reach a certain set of bytes\n     * and returns the matched substring.\n     *\n     * @param $bytes | Bytes to match.\n     * @param null $max\n     * @return bool|string\n     */\n    public function charsUntil($bytes, $max = null) {\n        if ($this->char < $this->EOF) {\n            if ($max === 0 || $max) {\n                $len = strcspn($this->data, $bytes, $this->char, $max);\n            } else {\n                $len = strcspn($this->data, $bytes, $this->char);\n            }\n            $string = (string) substr($this->data, $this->char, $len);\n            $this->char += $len;\n            return $string;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Matches as far as possible with a certain set of bytes\n     * and returns the matched substring.\n     *\n     * @param $bytes | Bytes to match.\n     * @param null $max\n     * @return bool|string\n     */\n    public function charsWhile($bytes, $max = null) {\n        if ($this->char < $this->EOF) {\n            if ($max === 0 || $max) {\n                $len = strspn($this->data, $bytes, $this->char, $max);\n            } else {\n                $len = strspn($this->data, $bytes, $this->char);\n            }\n            $string = (string) substr($this->data, $this->char, $len);\n            $this->char += $len;\n            return $string;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Unconsume one character.\n     */\n    public function unget() {\n        if ($this->char <= $this->EOF) {\n            $this->char--;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/html5lib/Parser.php",
    "content": "<?php\n\nrequire_once dirname(__FILE__) . '/Data.php';\nrequire_once dirname(__FILE__) . '/InputStream.php';\nrequire_once dirname(__FILE__) . '/TreeBuilder.php';\nrequire_once dirname(__FILE__) . '/Tokenizer.php';\n\n/**\n * Outwards facing interface for HTML5.\n */\nclass HTML5_Parser\n{\n    /**\n     * Parses a full HTML document.\n     * @param $text | HTML text to parse\n     * @param $builder | Custom builder implementation\n     * @return DOMDocument|DOMNodeList Parsed HTML as DOMDocument\n     */\n    public static function parse($text, $builder = null) {\n        $tokenizer = new HTML5_Tokenizer($text, $builder);\n        $tokenizer->parse();\n        return $tokenizer->save();\n    }\n\n    /**\n     * Parses an HTML fragment.\n     * @param $text | HTML text to parse\n     * @param $context String name of context element to pretend parsing is in.\n     * @param $builder | Custom builder implementation\n     * @return DOMDocument|DOMNodeList Parsed HTML as DOMDocument\n     */\n    public static function parseFragment($text, $context = null, $builder = null) {\n        $tokenizer = new HTML5_Tokenizer($text, $builder);\n        $tokenizer->parseFragment($context);\n        return $tokenizer->save();\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/html5lib/Tokenizer.php",
    "content": "<?php\n\n/*\n\nCopyright 2007 Jeroen van der Meer <http://jero.net/>\nCopyright 2008 Edward Z. Yang <http://htmlpurifier.org/>\nCopyright 2009 Geoffrey Sneddon <http://gsnedders.com/>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n// Some conventions:\n// /* */ indicates verbatim text from the HTML 5 specification\n// // indicates regular comments\n\n// all flags are in hyphenated form\n\nclass HTML5_Tokenizer {\n    /**\n     * @var HTML5_InputStream\n     *\n     * Points to an InputStream object.\n     */\n    protected $stream;\n\n    /**\n     * @var HTML5_TreeBuilder\n     *\n     * Tree builder that the tokenizer emits token to.\n     */\n    private $tree;\n\n    /**\n     * @var int\n     *\n     * Current content model we are parsing as.\n     */\n    protected $content_model;\n\n    /**\n     * Current token that is being built, but not yet emitted. Also\n     * is the last token emitted, if applicable.\n     */\n    protected $token;\n\n    // These are constants describing the content model\n    const PCDATA    = 0;\n    const RCDATA    = 1;\n    const CDATA     = 2;\n    const PLAINTEXT = 3;\n\n    // These are constants describing tokens\n    // XXX should probably be moved somewhere else, probably the\n    // HTML5 class.\n    const DOCTYPE        = 0;\n    const STARTTAG       = 1;\n    const ENDTAG         = 2;\n    const COMMENT        = 3;\n    const CHARACTER      = 4;\n    const SPACECHARACTER = 5;\n    const EOF            = 6;\n    const PARSEERROR     = 7;\n\n    // These are constants representing bunches of characters.\n    const ALPHA       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n    const UPPER_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    const LOWER_ALPHA = 'abcdefghijklmnopqrstuvwxyz';\n    const DIGIT       = '0123456789';\n    const HEX         = '0123456789ABCDEFabcdef';\n    const WHITESPACE  = \"\\t\\n\\x0c \";\n\n    /**\n     * @param $data | Data to parse\n     * @param HTML5_TreeBuilder|null $builder\n     */\n    public function __construct($data, $builder = null) {\n        $this->stream = new HTML5_InputStream($data);\n        if (!$builder) {\n            $this->tree = new HTML5_TreeBuilder;\n        } else {\n            $this->tree = $builder;\n        }\n        $this->content_model = self::PCDATA;\n    }\n\n    /**\n     * @param null $context\n     */\n    public function parseFragment($context = null) {\n        $this->tree->setupContext($context);\n        if ($this->tree->content_model) {\n            $this->content_model = $this->tree->content_model;\n            $this->tree->content_model = null;\n        }\n        $this->parse();\n    }\n\n    // XXX maybe convert this into an iterator? regardless, this function\n    // and the save function should go into a Parser facade of some sort\n    /**\n     * Performs the actual parsing of the document.\n     */\n    public function parse() {\n        // Current state\n        $state = 'data';\n        // This is used to avoid having to have look-behind in the data state.\n        $lastFourChars = '';\n        /**\n         * Escape flag as specified by the HTML5 specification: \"used to\n         * control the behavior of the tokeniser. It is either true or\n         * false, and initially must be set to the false state.\"\n         */\n        $escape = false;\n        //echo \"\\n\\n\";\n        while($state !== null) {\n\n            /*echo $state . ' ';\n            switch ($this->content_model) {\n                case self::PCDATA: echo 'PCDATA'; break;\n                case self::RCDATA: echo 'RCDATA'; break;\n                case self::CDATA: echo 'CDATA'; break;\n                case self::PLAINTEXT: echo 'PLAINTEXT'; break;\n            }\n            if ($escape) echo \" escape\";\n            echo \"\\n\";*/\n\n            switch($state) {\n                case 'data':\n\n                    /* Consume the next input character */\n                    $char = $this->stream->char();\n                    $lastFourChars .= $char;\n                    if (strlen($lastFourChars) > 4) {\n                        $lastFourChars = substr($lastFourChars, -4);\n                    }\n\n                    // see below for meaning\n                    $hyp_cond =\n                        !$escape &&\n                        (\n                            $this->content_model === self::RCDATA ||\n                            $this->content_model === self::CDATA\n                        );\n                    $amp_cond =\n                        !$escape &&\n                        (\n                            $this->content_model === self::PCDATA ||\n                            $this->content_model === self::RCDATA\n                        );\n                    $lt_cond =\n                        $this->content_model === self::PCDATA ||\n                        (\n                            (\n                                $this->content_model === self::RCDATA ||\n                                $this->content_model === self::CDATA\n                             ) &&\n                             !$escape\n                        );\n                    $gt_cond =\n                        $escape &&\n                        (\n                            $this->content_model === self::RCDATA ||\n                            $this->content_model === self::CDATA\n                        );\n\n                    if ($char === '&' && $amp_cond === true) {\n                        /* U+0026 AMPERSAND (&)\n                        When the content model flag is set to one of the PCDATA or RCDATA\n                        states and the escape flag is false: switch to the\n                        character reference data state. Otherwise: treat it as per\n                        the \"anything else\" entry below. */\n                        $state = 'character reference data';\n\n                    } elseif (\n                        $char === '-' &&\n                        $hyp_cond === true &&\n                        $lastFourChars === '<!--'\n                    ) {\n                        /*\n                        U+002D HYPHEN-MINUS (-)\n                        If the content model flag is set to either the RCDATA state or\n                        the CDATA state, and the escape flag is false, and there are at\n                        least three characters before this one in the input stream, and the\n                        last four characters in the input stream, including this one, are\n                        U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,\n                        and U+002D HYPHEN-MINUS (\"<!--\"), then set the escape flag to true. */\n                        $escape = true;\n\n                        /* In any case, emit the input character as a character token. Stay\n                        in the data state. */\n                        $this->emitToken([\n                            'type' => self::CHARACTER,\n                            'data' => '-'\n                        ]);\n                        // We do the \"any case\" part as part of \"anything else\".\n\n                    /* U+003C LESS-THAN SIGN (<) */\n                    } elseif ($char === '<' && $lt_cond === true) {\n                        /* When the content model flag is set to the PCDATA state: switch\n                        to the tag open state.\n\n                        When the content model flag is set to either the RCDATA state or\n                        the CDATA state and the escape flag is false: switch to the tag\n                        open state.\n\n                        Otherwise: treat it as per the \"anything else\" entry below. */\n                        $state = 'tag open';\n\n                    /* U+003E GREATER-THAN SIGN (>) */\n                    } elseif (\n                        $char === '>' &&\n                        $gt_cond === true &&\n                        substr($lastFourChars, 1) === '-->'\n                    ) {\n                        /* If the content model flag is set to either the RCDATA state or\n                        the CDATA state, and the escape flag is true, and the last three\n                        characters in the input stream including this one are U+002D\n                        HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN (\"-->\"),\n                        set the escape flag to false. */\n                        $escape = false;\n\n                        /* In any case, emit the input character as a character token.\n                        Stay in the data state. */\n                        $this->emitToken([\n                            'type' => self::CHARACTER,\n                            'data' => '>'\n                        ]);\n                        // We do the \"any case\" part as part of \"anything else\".\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Emit an end-of-file token. */\n                        $state = null;\n                        $this->tree->emitToken([\n                            'type' => self::EOF\n                        ]);\n\n                    } elseif ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        // Directly after emitting a token you switch back to the \"data\n                        // state\". At that point spaceCharacters are important so they are\n                        // emitted separately.\n                        $chars = $this->stream->charsWhile(self::WHITESPACE);\n                        $this->emitToken([\n                            'type' => self::SPACECHARACTER,\n                            'data' => $char . $chars\n                        ]);\n                        $lastFourChars .= $chars;\n                        if (strlen($lastFourChars) > 4) {\n                            $lastFourChars = substr($lastFourChars, -4);\n                        }\n                    } else {\n                        /* Anything else\n                        THIS IS AN OPTIMIZATION: Get as many character that\n                        otherwise would also be treated as a character token and emit it\n                        as a single character token. Stay in the data state. */\n\n                        $mask = '';\n                        if ($hyp_cond === true) {\n                            $mask .= '-';\n                        }\n                        if ($amp_cond === true) {\n                            $mask .= '&';\n                        }\n                        if ($lt_cond === true) {\n                            $mask .= '<';\n                        }\n                        if ($gt_cond === true) {\n                            $mask .= '>';\n                        }\n\n                        if ($mask === '') {\n                            $chars = $this->stream->remainingChars();\n                        } else {\n                            $chars = $this->stream->charsUntil($mask);\n                        }\n\n                        $this->emitToken([\n                            'type' => self::CHARACTER,\n                            'data' => $char . $chars\n                        ]);\n\n                        $lastFourChars .= $chars;\n                        if (strlen($lastFourChars) > 4) {\n                            $lastFourChars = substr($lastFourChars, -4);\n                        }\n\n                        $state = 'data';\n                    }\n                break;\n\n                case 'character reference data':\n                    /* (This cannot happen if the content model flag\n                    is set to the CDATA state.) */\n\n                    /* Attempt to consume a character reference, with no\n                    additional allowed character. */\n                    $entity = $this->consumeCharacterReference();\n\n                    /* If nothing is returned, emit a U+0026 AMPERSAND\n                    character token. Otherwise, emit the character token that\n                    was returned. */\n                    // This is all done when consuming the character reference.\n                    $this->emitToken([\n                        'type' => self::CHARACTER,\n                        'data' => $entity\n                    ]);\n\n                    /* Finally, switch to the data state. */\n                    $state = 'data';\n                break;\n\n                case 'tag open':\n                    $char = $this->stream->char();\n\n                    switch ($this->content_model) {\n                        case self::RCDATA:\n                        case self::CDATA:\n                            /* Consume the next input character. If it is a\n                            U+002F SOLIDUS (/) character, switch to the close\n                            tag open state. Otherwise, emit a U+003C LESS-THAN\n                            SIGN character token and reconsume the current input\n                            character in the data state. */\n                            // We consumed above.\n\n                            if ($char === '/') {\n                                $state = 'close tag open';\n                            } else {\n                                $this->emitToken([\n                                    'type' => self::CHARACTER,\n                                    'data' => '<'\n                                ]);\n\n                                $this->stream->unget();\n\n                                $state = 'data';\n                            }\n                        break;\n\n                        case self::PCDATA:\n                            /* If the content model flag is set to the PCDATA state\n                            Consume the next input character: */\n                            // We consumed above.\n\n                            if ($char === '!') {\n                                /* U+0021 EXCLAMATION MARK (!)\n                                Switch to the markup declaration open state. */\n                                $state = 'markup declaration open';\n\n                            } elseif ($char === '/') {\n                                /* U+002F SOLIDUS (/)\n                                Switch to the close tag open state. */\n                                $state = 'close tag open';\n\n                            } elseif ('A' <= $char && $char <= 'Z') {\n                                /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z\n                                Create a new start tag token, set its tag name to the lowercase\n                                version of the input character (add 0x0020 to the character's code\n                                point), then switch to the tag name state. (Don't emit the token\n                                yet; further details will be filled in before it is emitted.) */\n                                $this->token = [\n                                    'name'  => strtolower($char),\n                                    'type'  => self::STARTTAG,\n                                    'attr'  => []\n                                ];\n\n                                $state = 'tag name';\n\n                            } elseif ('a' <= $char && $char <= 'z') {\n                                /* U+0061 LATIN SMALL LETTER A through to U+007A LATIN SMALL LETTER Z\n                                Create a new start tag token, set its tag name to the input\n                                character, then switch to the tag name state. (Don't emit\n                                the token yet; further details will be filled in before it\n                                is emitted.) */\n                                $this->token = [\n                                    'name'  => $char,\n                                    'type'  => self::STARTTAG,\n                                    'attr'  => []\n                                ];\n\n                                $state = 'tag name';\n\n                            } elseif ($char === '>') {\n                                /* U+003E GREATER-THAN SIGN (>)\n                                Parse error. Emit a U+003C LESS-THAN SIGN character token and a\n                                U+003E GREATER-THAN SIGN character token. Switch to the data state. */\n                                $this->emitToken([\n                                    'type' => self::PARSEERROR,\n                                    'data' => 'expected-tag-name-but-got-right-bracket'\n                                ]);\n                                $this->emitToken([\n                                    'type' => self::CHARACTER,\n                                    'data' => '<>'\n                                ]);\n\n                                $state = 'data';\n\n                            } elseif ($char === '?') {\n                                /* U+003F QUESTION MARK (?)\n                                Parse error. Switch to the bogus comment state. */\n                                $this->emitToken([\n                                    'type' => self::PARSEERROR,\n                                    'data' => 'expected-tag-name-but-got-question-mark'\n                                ]);\n                                $this->token = [\n                                    'data' => '?',\n                                    'type' => self::COMMENT\n                                ];\n                                $state = 'bogus comment';\n\n                            } else {\n                                /* Anything else\n                                Parse error. Emit a U+003C LESS-THAN SIGN character token and\n                                reconsume the current input character in the data state. */\n                                $this->emitToken([\n                                    'type' => self::PARSEERROR,\n                                    'data' => 'expected-tag-name'\n                                ]);\n                                $this->emitToken([\n                                    'type' => self::CHARACTER,\n                                    'data' => '<'\n                                ]);\n\n                                $state = 'data';\n                                $this->stream->unget();\n                            }\n                        break;\n                    }\n                break;\n\n                case 'close tag open':\n                    if (\n                        $this->content_model === self::RCDATA ||\n                        $this->content_model === self::CDATA\n                    ) {\n                        /* If the content model flag is set to the RCDATA or CDATA\n                        states... */\n                        $name = strtolower($this->stream->charsWhile(self::ALPHA));\n                        $following = $this->stream->char();\n                        $this->stream->unget();\n                        if (\n                            !$this->token ||\n                            $this->token['name'] !== $name ||\n                            $this->token['name'] === $name && !in_array($following, [\"\\x09\", \"\\x0A\", \"\\x0C\", \"\\x20\", \"\\x3E\", \"\\x2F\", false])\n                        ) {\n                            /* if no start tag token has ever been emitted by this instance\n                            of the tokenizer (fragment case), or, if the next few\n                            characters do not match the tag name of the last start tag\n                            token emitted (compared in an ASCII case-insensitive manner),\n                            or if they do but they are not immediately followed by one of\n                            the following characters:\n\n                                * U+0009 CHARACTER TABULATION\n                                * U+000A LINE FEED (LF)\n                                * U+000C FORM FEED (FF)\n                                * U+0020 SPACE\n                                * U+003E GREATER-THAN SIGN (>)\n                                * U+002F SOLIDUS (/)\n                                * EOF\n\n                            ...then emit a U+003C LESS-THAN SIGN character token, a\n                            U+002F SOLIDUS character token, and switch to the data\n                            state to process the next input character. */\n                            // XXX: Probably ought to replace in_array with $following === x ||...\n\n                            // We also need to emit $name now we've consumed that, as we\n                            // know it'll just be emitted as a character token.\n                            $this->emitToken([\n                                'type' => self::CHARACTER,\n                                'data' => '</' . $name\n                            ]);\n\n                            $state = 'data';\n                        } else {\n                            // This matches what would happen if we actually did the\n                            // otherwise below (but we can't because we've consumed too\n                            // much).\n\n                            // Start the end tag token with the name we already have.\n                            $this->token = [\n                                'name'  => $name,\n                                'type'  => self::ENDTAG\n                            ];\n\n                            // Change to tag name state.\n                            $state = 'tag name';\n                        }\n                    } elseif ($this->content_model === self::PCDATA) {\n                        /* Otherwise, if the content model flag is set to the PCDATA\n                        state [...]: */\n                        $char = $this->stream->char();\n\n                        if ('A' <= $char && $char <= 'Z') {\n                            /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z\n                            Create a new end tag token, set its tag name to the lowercase version\n                            of the input character (add 0x0020 to the character's code point), then\n                            switch to the tag name state. (Don't emit the token yet; further details\n                            will be filled in before it is emitted.) */\n                            $this->token = [\n                                'name'  => strtolower($char),\n                                'type'  => self::ENDTAG\n                            ];\n\n                            $state = 'tag name';\n\n                        } elseif ('a' <= $char && $char <= 'z') {\n                            /* U+0061 LATIN SMALL LETTER A through to U+007A LATIN SMALL LETTER Z\n                            Create a new end tag token, set its tag name to the\n                            input character, then switch to the tag name state.\n                            (Don't emit the token yet; further details will be\n                            filled in before it is emitted.) */\n                            $this->token = [\n                                'name'  => $char,\n                                'type'  => self::ENDTAG\n                            ];\n\n                            $state = 'tag name';\n\n                        } elseif ($char === '>') {\n                            /* U+003E GREATER-THAN SIGN (>)\n                            Parse error. Switch to the data state. */\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'expected-closing-tag-but-got-right-bracket'\n                            ]);\n                            $state = 'data';\n\n                        } elseif ($char === false) {\n                            /* EOF\n                            Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F\n                            SOLIDUS character token. Reconsume the EOF character in the data state. */\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'expected-closing-tag-but-got-eof'\n                            ]);\n                            $this->emitToken([\n                                'type' => self::CHARACTER,\n                                'data' => '</'\n                            ]);\n\n                            $this->stream->unget();\n                            $state = 'data';\n\n                        } else {\n                            /* Parse error. Switch to the bogus comment state. */\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'expected-closing-tag-but-got-char'\n                            ]);\n                            $this->token = [\n                                'data' => $char,\n                                'type' => self::COMMENT\n                            ];\n                            $state = 'bogus comment';\n                        }\n                    }\n                break;\n\n                case 'tag name':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                        U+000A LINE FEED (LF)\n                        U+000C FORM FEED (FF)\n                        U+0020 SPACE\n                        Switch to the before attribute name state. */\n                        $state = 'before attribute name';\n\n                    } elseif ($char === '/') {\n                        /* U+002F SOLIDUS (/)\n                        Switch to the self-closing start tag state. */\n                        $state = 'self-closing start tag';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current tag token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ('A' <= $char && $char <= 'Z') {\n                        /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z\n                        Append the lowercase version of the current input\n                        character (add 0x0020 to the character's code point) to\n                        the current tag token's tag name. Stay in the tag name state. */\n                        $chars = $this->stream->charsWhile(self::UPPER_ALPHA);\n\n                        $this->token['name'] .= strtolower($char . $chars);\n                        $state = 'tag name';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-tag-name'\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current tag token's tag name.\n                        Stay in the tag name state. */\n                        $chars = $this->stream->charsUntil(\"\\t\\n\\x0C />\" . self::UPPER_ALPHA);\n\n                        $this->token['name'] .= $char . $chars;\n                        $state = 'tag name';\n                    }\n                break;\n\n                case 'before attribute name':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    // this conditional is optimized, check bottom\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                        U+000A LINE FEED (LF)\n                        U+000C FORM FEED (FF)\n                        U+0020 SPACE\n                        Stay in the before attribute name state. */\n                        $state = 'before attribute name';\n\n                    } elseif ($char === '/') {\n                        /* U+002F SOLIDUS (/)\n                        Switch to the self-closing start tag state. */\n                        $state = 'self-closing start tag';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current tag token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ('A' <= $char && $char <= 'Z') {\n                        /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z\n                        Start a new attribute in the current tag token. Set that\n                        attribute's name to the lowercase version of the current\n                        input character (add 0x0020 to the character's code\n                        point), and its value to the empty string. Switch to the\n                        attribute name state.*/\n                        $this->token['attr'][] = [\n                            'name'  => strtolower($char),\n                            'value' => ''\n                        ];\n\n                        $state = 'attribute name';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-attribute-name-but-got-eof'\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* U+0022 QUOTATION MARK (\")\n                           U+0027 APOSTROPHE (')\n                           U+003C LESS-THAN SIGN (<)\n                           U+003D EQUALS SIGN (=)\n                        Parse error. Treat it as per the \"anything else\" entry\n                        below. */\n                        if ($char === '\"' || $char === \"'\" || $char === '<' || $char === '=') {\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'invalid-character-in-attribute-name'\n                            ]);\n                        }\n\n                        /* Anything else\n                        Start a new attribute in the current tag token. Set that attribute's\n                        name to the current input character, and its value to the empty string.\n                        Switch to the attribute name state. */\n                        $this->token['attr'][] = [\n                            'name'  => $char,\n                            'value' => ''\n                        ];\n\n                        $state = 'attribute name';\n                    }\n                break;\n\n                case 'attribute name':\n                    // Consume the next input character:\n                    $char = $this->stream->char();\n\n                    // this conditional is optimized, check bottom\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                        U+000A LINE FEED (LF)\n                        U+000C FORM FEED (FF)\n                        U+0020 SPACE\n                        Switch to the after attribute name state. */\n                        $state = 'after attribute name';\n\n                    } elseif ($char === '/') {\n                        /* U+002F SOLIDUS (/)\n                        Switch to the self-closing start tag state. */\n                        $state = 'self-closing start tag';\n\n                    } elseif ($char === '=') {\n                        /* U+003D EQUALS SIGN (=)\n                        Switch to the before attribute value state. */\n                        $state = 'before attribute value';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current tag token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ('A' <= $char && $char <= 'Z') {\n                        /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z\n                        Append the lowercase version of the current input\n                        character (add 0x0020 to the character's code point) to\n                        the current attribute's name. Stay in the attribute name\n                        state. */\n                        $chars = $this->stream->charsWhile(self::UPPER_ALPHA);\n\n                        $last = count($this->token['attr']) - 1;\n                        $this->token['attr'][$last]['name'] .= strtolower($char . $chars);\n\n                        $state = 'attribute name';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-attribute-name'\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* U+0022 QUOTATION MARK (\")\n                           U+0027 APOSTROPHE (')\n                           U+003C LESS-THAN SIGN (<)\n                        Parse error. Treat it as per the \"anything else\"\n                        entry below. */\n                        if ($char === '\"' || $char === \"'\" || $char === '<') {\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'invalid-character-in-attribute-name'\n                            ]);\n                        }\n\n                        /* Anything else\n                        Append the current input character to the current attribute's name.\n                        Stay in the attribute name state. */\n                        $chars = $this->stream->charsUntil(\"\\t\\n\\x0C /=>\\\"'\" . self::UPPER_ALPHA);\n\n                        $last = count($this->token['attr']) - 1;\n                        $this->token['attr'][$last]['name'] .= $char . $chars;\n\n                        $state = 'attribute name';\n                    }\n\n                    /* When the user agent leaves the attribute name state\n                    (and before emitting the tag token, if appropriate), the\n                    complete attribute's name must be compared to the other\n                    attributes on the same token; if there is already an\n                    attribute on the token with the exact same name, then this\n                    is a parse error and the new attribute must be dropped, along\n                    with the value that gets associated with it (if any). */\n                    // this might be implemented in the emitToken method\n                break;\n\n                case 'after attribute name':\n                    // Consume the next input character:\n                    $char = $this->stream->char();\n\n                    // this is an optimized conditional, check the bottom\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                        U+000A LINE FEED (LF)\n                        U+000C FORM FEED (FF)\n                        U+0020 SPACE\n                        Stay in the after attribute name state. */\n                        $state = 'after attribute name';\n\n                    } elseif ($char === '/') {\n                        /* U+002F SOLIDUS (/)\n                        Switch to the self-closing start tag state. */\n                        $state = 'self-closing start tag';\n\n                    } elseif ($char === '=') {\n                        /* U+003D EQUALS SIGN (=)\n                        Switch to the before attribute value state. */\n                        $state = 'before attribute value';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current tag token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ('A' <= $char && $char <= 'Z') {\n                        /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z\n                        Start a new attribute in the current tag token. Set that\n                        attribute's name to the lowercase version of the current\n                        input character (add 0x0020 to the character's code\n                        point), and its value to the empty string. Switch to the\n                        attribute name state. */\n                        $this->token['attr'][] = [\n                            'name'  => strtolower($char),\n                            'value' => ''\n                        ];\n\n                        $state = 'attribute name';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-end-of-tag-but-got-eof'\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* U+0022 QUOTATION MARK (\")\n                           U+0027 APOSTROPHE (')\n                           U+003C LESS-THAN SIGN(<)\n                        Parse error. Treat it as per the \"anything else\"\n                        entry below. */\n                        if ($char === '\"' || $char === \"'\" || $char === \"<\") {\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'invalid-character-after-attribute-name'\n                            ]);\n                        }\n\n                        /* Anything else\n                        Start a new attribute in the current tag token. Set that attribute's\n                        name to the current input character, and its value to the empty string.\n                        Switch to the attribute name state. */\n                        $this->token['attr'][] = [\n                            'name'  => $char,\n                            'value' => ''\n                        ];\n\n                        $state = 'attribute name';\n                    }\n                break;\n\n                case 'before attribute value':\n                    // Consume the next input character:\n                    $char = $this->stream->char();\n\n                    // this is an optimized conditional\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                        U+000A LINE FEED (LF)\n                        U+000C FORM FEED (FF)\n                        U+0020 SPACE\n                        Stay in the before attribute value state. */\n                        $state = 'before attribute value';\n\n                    } elseif ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Switch to the attribute value (double-quoted) state. */\n                        $state = 'attribute value (double-quoted)';\n\n                    } elseif ($char === '&') {\n                        /* U+0026 AMPERSAND (&)\n                        Switch to the attribute value (unquoted) state and reconsume\n                        this input character. */\n                        $this->stream->unget();\n                        $state = 'attribute value (unquoted)';\n\n                    } elseif ($char === '\\'') {\n                        /* U+0027 APOSTROPHE (')\n                        Switch to the attribute value (single-quoted) state. */\n                        $state = 'attribute value (single-quoted)';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Emit the current tag token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-attribute-value-but-got-right-bracket'\n                        ]);\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-attribute-value-but-got-eof'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* U+003D EQUALS SIGN (=)\n                         * U+003C LESS-THAN SIGN (<)\n                        Parse error. Treat it as per the \"anything else\" entry below. */\n                        if ($char === '=' || $char === '<') {\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'equals-in-unquoted-attribute-value'\n                            ]);\n                        }\n\n                        /* Anything else\n                        Append the current input character to the current attribute's value.\n                        Switch to the attribute value (unquoted) state. */\n                        $last = count($this->token['attr']) - 1;\n                        $this->token['attr'][$last]['value'] .= $char;\n\n                        $state = 'attribute value (unquoted)';\n                    }\n                break;\n\n                case 'attribute value (double-quoted)':\n                    // Consume the next input character:\n                    $char = $this->stream->char();\n\n                    if ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Switch to the after attribute value (quoted) state. */\n                        $state = 'after attribute value (quoted)';\n\n                    } elseif ($char === '&') {\n                        /* U+0026 AMPERSAND (&)\n                        Switch to the character reference in attribute value\n                        state, with the additional allowed character\n                        being U+0022 QUOTATION MARK (\"). */\n                        $this->characterReferenceInAttributeValue('\"');\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-attribute-value-double-quote'\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current attribute's value.\n                        Stay in the attribute value (double-quoted) state. */\n                        $chars = $this->stream->charsUntil('\"&');\n\n                        $last = count($this->token['attr']) - 1;\n                        $this->token['attr'][$last]['value'] .= $char . $chars;\n\n                        $state = 'attribute value (double-quoted)';\n                    }\n                break;\n\n                case 'attribute value (single-quoted)':\n                    // Consume the next input character:\n                    $char = $this->stream->char();\n\n                    if ($char === \"'\") {\n                        /* U+0022 QUOTATION MARK (')\n                        Switch to the after attribute value state. */\n                        $state = 'after attribute value (quoted)';\n\n                    } elseif ($char === '&') {\n                        /* U+0026 AMPERSAND (&)\n                        Switch to the entity in attribute value state. */\n                        $this->characterReferenceInAttributeValue(\"'\");\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-attribute-value-single-quote'\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current attribute's value.\n                        Stay in the attribute value (single-quoted) state. */\n                        $chars = $this->stream->charsUntil(\"'&\");\n\n                        $last = count($this->token['attr']) - 1;\n                        $this->token['attr'][$last]['value'] .= $char . $chars;\n\n                        $state = 'attribute value (single-quoted)';\n                    }\n                break;\n\n                case 'attribute value (unquoted)':\n                    // Consume the next input character:\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                        U+000A LINE FEED (LF)\n                        U+000C FORM FEED (FF)\n                        U+0020 SPACE\n                        Switch to the before attribute name state. */\n                        $state = 'before attribute name';\n\n                    } elseif ($char === '&') {\n                        /* U+0026 AMPERSAND (&)\n                        Switch to the entity in attribute value state, with the\n                        additional allowed character  being U+003E\n                        GREATER-THAN SIGN (>). */\n                        $this->characterReferenceInAttributeValue('>');\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current tag token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-attribute-value-no-quotes'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* U+0022 QUOTATION MARK (\")\n                           U+0027 APOSTROPHE (')\n                           U+003C LESS-THAN SIGN (<)\n                           U+003D EQUALS SIGN (=)\n                        Parse error. Treat it as per the \"anything else\"\n                        entry below. */\n                        if ($char === '\"' || $char === \"'\" || $char === '=' || $char == '<') {\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'unexpected-character-in-unquoted-attribute-value'\n                            ]);\n                        }\n\n                        /* Anything else\n                        Append the current input character to the current attribute's value.\n                        Stay in the attribute value (unquoted) state. */\n                        $chars = $this->stream->charsUntil(\"\\t\\n\\x0c &>\\\"'=\");\n\n                        $last = count($this->token['attr']) - 1;\n                        $this->token['attr'][$last]['value'] .= $char . $chars;\n\n                        $state = 'attribute value (unquoted)';\n                    }\n                break;\n\n                case 'after attribute value (quoted)':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Switch to the before attribute name state. */\n                        $state = 'before attribute name';\n\n                    } elseif ($char === '/') {\n                        /* U+002F SOLIDUS (/)\n                        Switch to the self-closing start tag state. */\n                        $state = 'self-closing start tag';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current tag token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-EOF-after-attribute-value'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Parse error. Reconsume the character in the before attribute\n                        name state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-character-after-attribute-value'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'before attribute name';\n                    }\n                break;\n\n                case 'self-closing start tag':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Set the self-closing flag of the current tag token.\n                        Emit the current tag token. Switch to the data state. */\n                        // not sure if this is the name we want\n                        $this->token['self-closing'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Reconsume the EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-eof-after-self-closing'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Parse error. Reconsume the character in the before attribute name state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-character-after-self-closing'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'before attribute name';\n                    }\n                break;\n\n                case 'bogus comment':\n                    /* (This can only happen if the content model flag is set to the PCDATA state.) */\n                    /* Consume every character up to the first U+003E GREATER-THAN SIGN\n                    character (>) or the end of the file (EOF), whichever comes first. Emit\n                    a comment token whose data is the concatenation of all the characters\n                    starting from and including the character that caused the state machine\n                    to switch into the bogus comment state, up to and including the last\n                    consumed character before the U+003E character, if any, or up to the\n                    end of the file otherwise. (If the comment was started by the end of\n                    the file (EOF), the token is empty.) */\n                    $this->token['data'] .= (string) $this->stream->charsUntil('>');\n                    $this->stream->char();\n\n                    $this->emitToken($this->token);\n\n                    /* Switch to the data state. */\n                    $state = 'data';\n                break;\n\n                case 'markup declaration open':\n                    // Consume for below\n                    $hyphens = $this->stream->charsWhile('-', 2);\n                    if ($hyphens === '-') {\n                        $this->stream->unget();\n                    }\n                    if ($hyphens !== '--') {\n                        $alpha = $this->stream->charsWhile(self::ALPHA, 7);\n                    }\n\n                    /* If the next two characters are both U+002D HYPHEN-MINUS (-)\n                    characters, consume those two characters, create a comment token whose\n                    data is the empty string, and switch to the comment state. */\n                    if ($hyphens === '--') {\n                        $state = 'comment start';\n                        $this->token = [\n                            'data' => '',\n                            'type' => self::COMMENT\n                        ];\n\n                    /* Otherwise if the next seven characters are a case-insensitive match\n                    for the word \"DOCTYPE\", then consume those characters and switch to the\n                    DOCTYPE state. */\n                    } elseif (strtoupper($alpha) === 'DOCTYPE') {\n                        $state = 'DOCTYPE';\n\n                    // XXX not implemented\n                    /* Otherwise, if the insertion mode is \"in foreign content\"\n                    and the current node is not an element in the HTML namespace\n                    and the next seven characters are an ASCII case-sensitive\n                    match for the string \"[CDATA[\" (the five uppercase letters\n                    \"CDATA\" with a U+005B LEFT SQUARE BRACKET character before\n                    and after), then consume those characters and switch to the\n                    CDATA section state (which is unrelated to the content model\n                    flag's CDATA state). */\n\n                    /* Otherwise, is is a parse error. Switch to the bogus comment state.\n                    The next character that is consumed, if any, is the first character\n                    that will be in the comment. */\n                    } else {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-dashes-or-doctype'\n                        ]);\n                        $this->token = [\n                            'data' => (string) $alpha,\n                            'type' => self::COMMENT\n                        ];\n                        $state = 'bogus comment';\n                    }\n                break;\n\n                case 'comment start':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '-') {\n                        /* U+002D HYPHEN-MINUS (-)\n                        Switch to the comment start dash state. */\n                        $state = 'comment start dash';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Emit the comment token. Switch to the\n                        data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'incorrect-comment'\n                        ]);\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Emit the comment token. Reconsume the\n                        EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-comment'\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Append the input character to the comment token's\n                        data. Switch to the comment state. */\n                        $this->token['data'] .= $char;\n                        $state = 'comment';\n                    }\n                break;\n\n                case 'comment start dash':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n                    if ($char === '-') {\n                        /* U+002D HYPHEN-MINUS (-)\n                        Switch to the comment end state */\n                        $state = 'comment end';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Emit the comment token. Switch to the\n                        data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'incorrect-comment'\n                        ]);\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* Parse error. Emit the comment token. Reconsume the\n                        EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-comment'\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        $this->token['data'] .= '-' . $char;\n                        $state = 'comment';\n                    }\n                break;\n\n                case 'comment':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '-') {\n                        /* U+002D HYPHEN-MINUS (-)\n                        Switch to the comment end dash state */\n                        $state = 'comment end dash';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Emit the comment token. Reconsume the EOF character\n                        in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-comment'\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Append the input character to the comment token's data. Stay in\n                        the comment state. */\n                        $chars = $this->stream->charsUntil('-');\n\n                        $this->token['data'] .= $char . $chars;\n                    }\n                break;\n\n                case 'comment end dash':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '-') {\n                        /* U+002D HYPHEN-MINUS (-)\n                        Switch to the comment end state  */\n                        $state = 'comment end';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Emit the comment token. Reconsume the EOF character\n                        in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-comment-end-dash'\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Append a U+002D HYPHEN-MINUS (-) character and the input\n                        character to the comment token's data. Switch to the comment state. */\n                        $this->token['data'] .= '-'.$char;\n                        $state = 'comment';\n                    }\n                break;\n\n                case 'comment end':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the comment token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === '-') {\n                        /* U+002D HYPHEN-MINUS (-)\n                        Parse error. Append a U+002D HYPHEN-MINUS (-) character\n                        to the comment token's data. Stay in the comment end\n                        state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-dash-after-double-dash-in-comment'\n                        ]);\n                        $this->token['data'] .= '-';\n\n                    } elseif ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0a\" || $char === ' ') {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-space-after-double-dash-in-comment'\n                        ]);\n                        $this->token['data'] .= '--' . $char;\n                        $state = 'comment end space';\n\n                    } elseif ($char === '!') {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-bang-after-double-dash-in-comment'\n                        ]);\n                        $state = 'comment end bang';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Emit the comment token. Reconsume the\n                        EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-comment-double-dash'\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Parse error. Append two U+002D HYPHEN-MINUS (-)\n                        characters and the input character to the comment token's\n                        data. Switch to the comment state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-char-in-comment'\n                        ]);\n                        $this->token['data'] .= '--'.$char;\n                        $state = 'comment';\n                    }\n                break;\n\n                case 'comment end bang':\n                    $char = $this->stream->char();\n                    if ($char === '>') {\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === \"-\") {\n                        $this->token['data'] .= '--!';\n                        $state = 'comment end dash';\n                    } elseif ($char === false) {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-comment-end-bang'\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        $this->token['data'] .= '--!' . $char;\n                        $state = 'comment';\n                    }\n                break;\n\n                case 'comment end space':\n                    $char = $this->stream->char();\n                    if ($char === '>') {\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === '-') {\n                        $state = 'comment end dash';\n                    } elseif ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        $this->token['data'] .= $char;\n                    } elseif ($char === false) {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-eof-in-comment-end-space',\n                        ]);\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        $this->token['data'] .= $char;\n                        $state = 'comment';\n                    }\n                break;\n\n                case 'DOCTYPE':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Switch to the before DOCTYPE name state. */\n                        $state = 'before DOCTYPE name';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Create a new DOCTYPE token. Set its\n                        force-quirks flag to on. Emit the token. Reconsume the\n                        EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'need-space-after-doctype-but-got-eof'\n                        ]);\n                        $this->emitToken([\n                            'name' => '',\n                            'type' => self::DOCTYPE,\n                            'force-quirks' => true,\n                            'error' => true\n                        ]);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Parse error. Reconsume the current character in the\n                        before DOCTYPE name state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'need-space-after-doctype'\n                        ]);\n                        $this->stream->unget();\n                        $state = 'before DOCTYPE name';\n                    }\n                break;\n\n                case 'before DOCTYPE name':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Stay in the before DOCTYPE name state. */\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Create a new DOCTYPE token. Set its\n                        force-quirks flag to on. Emit the token. Switch to the\n                        data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-doctype-name-but-got-right-bracket'\n                        ]);\n                        $this->emitToken([\n                            'name' => '',\n                            'type' => self::DOCTYPE,\n                            'force-quirks' => true,\n                            'error' => true\n                        ]);\n\n                        $state = 'data';\n\n                    } elseif ('A' <= $char && $char <= 'Z') {\n                        /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z\n                        Create a new DOCTYPE token. Set the token's name to the\n                        lowercase version of the input character (add 0x0020 to\n                        the character's code point). Switch to the DOCTYPE name\n                        state. */\n                        $this->token = [\n                            'name' => strtolower($char),\n                            'type' => self::DOCTYPE,\n                            'error' => true\n                        ];\n\n                        $state = 'DOCTYPE name';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Create a new DOCTYPE token. Set its\n                        force-quirks flag to on. Emit the token. Reconsume the\n                        EOF character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'expected-doctype-name-but-got-eof'\n                        ]);\n                        $this->emitToken([\n                            'name' => '',\n                            'type' => self::DOCTYPE,\n                            'force-quirks' => true,\n                            'error' => true\n                        ]);\n\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Create a new DOCTYPE token. Set the token's name to the\n                        current input character. Switch to the DOCTYPE name state. */\n                        $this->token = [\n                            'name' => $char,\n                            'type' => self::DOCTYPE,\n                            'error' => true\n                        ];\n\n                        $state = 'DOCTYPE name';\n                    }\n                break;\n\n                case 'DOCTYPE name':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Switch to the after DOCTYPE name state. */\n                        $state = 'after DOCTYPE name';\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current DOCTYPE token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ('A' <= $char && $char <= 'Z') {\n                        /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z\n                        Append the lowercase version of the input character\n                        (add 0x0020 to the character's code point) to the current\n                        DOCTYPE token's name. Stay in the DOCTYPE name state. */\n                        $this->token['name'] .= strtolower($char);\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype-name'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current\n                        DOCTYPE token's name. Stay in the DOCTYPE name state. */\n                        $this->token['name'] .= $char;\n                    }\n\n                    // XXX this is probably some sort of quirks mode designation,\n                    // check tree-builder to be sure. In general 'error' needs\n                    // to be specc'ified, this probably means removing it at the end\n                    $this->token['error'] = ($this->token['name'] === 'HTML')\n                        ? false\n                        : true;\n                break;\n\n                case 'after DOCTYPE name':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Stay in the after DOCTYPE name state. */\n\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current DOCTYPE token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else */\n\n                        $nextSix = strtoupper($char . $this->stream->charsWhile(self::ALPHA, 5));\n                        if ($nextSix === 'PUBLIC') {\n                            /* If the next six characters are an ASCII\n                            case-insensitive match for the word \"PUBLIC\", then\n                            consume those characters and switch to the before\n                            DOCTYPE public identifier state. */\n                            $state = 'before DOCTYPE public identifier';\n\n                        } elseif ($nextSix === 'SYSTEM') {\n                            /* Otherwise, if the next six characters are an ASCII\n                            case-insensitive match for the word \"SYSTEM\", then\n                            consume those characters and switch to the before\n                            DOCTYPE system identifier state. */\n                            $state = 'before DOCTYPE system identifier';\n\n                        } else {\n                            /* Otherwise, this is the parse error. Set the DOCTYPE\n                            token's force-quirks flag to on. Switch to the bogus\n                            DOCTYPE state. */\n                            $this->emitToken([\n                                'type' => self::PARSEERROR,\n                                'data' => 'expected-space-or-right-bracket-in-doctype'\n                            ]);\n                            $this->token['force-quirks'] = true;\n                            $this->token['error'] = true;\n                            $state = 'bogus DOCTYPE';\n                        }\n                    }\n                break;\n\n                case 'before DOCTYPE public identifier':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Stay in the before DOCTYPE public identifier state. */\n                    } elseif ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Set the DOCTYPE token's public identifier to the empty\n                        string (not missing), then switch to the DOCTYPE public\n                        identifier (double-quoted) state. */\n                        $this->token['public'] = '';\n                        $state = 'DOCTYPE public identifier (double-quoted)';\n                    } elseif ($char === \"'\") {\n                        /* U+0027 APOSTROPHE (')\n                        Set the DOCTYPE token's public identifier to the empty\n                        string (not missing), then switch to the DOCTYPE public\n                        identifier (single-quoted) state. */\n                        $this->token['public'] = '';\n                        $state = 'DOCTYPE public identifier (single-quoted)';\n                    } elseif ($char === '>') {\n                        /* Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-end-of-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* Parse error. Set the DOCTYPE token's force-quirks\n                        flag to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Switch to the bogus DOCTYPE state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-char-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $state = 'bogus DOCTYPE';\n                    }\n                break;\n\n                case 'DOCTYPE public identifier (double-quoted)':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Switch to the after DOCTYPE public identifier state. */\n                        $state = 'after DOCTYPE public identifier';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-end-of-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current\n                        DOCTYPE token's public identifier. Stay in the DOCTYPE\n                        public identifier (double-quoted) state. */\n                        $this->token['public'] .= $char;\n                    }\n                break;\n\n                case 'DOCTYPE public identifier (single-quoted)':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"'\") {\n                        /* U+0027 APOSTROPHE (')\n                        Switch to the after DOCTYPE public identifier state. */\n                        $state = 'after DOCTYPE public identifier';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-end-of-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current\n                        DOCTYPE token's public identifier. Stay in the DOCTYPE\n                        public identifier (double-quoted) state. */\n                        $this->token['public'] .= $char;\n                    }\n                break;\n\n                case 'after DOCTYPE public identifier':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Stay in the after DOCTYPE public identifier state. */\n                    } elseif ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Set the DOCTYPE token's system identifier to the\n                        empty string (not missing), then switch to the DOCTYPE\n                        system identifier (double-quoted) state. */\n                        $this->token['system'] = '';\n                        $state = 'DOCTYPE system identifier (double-quoted)';\n                    } elseif ($char === \"'\") {\n                        /* U+0027 APOSTROPHE (')\n                        Set the DOCTYPE token's system identifier to the\n                        empty string (not missing), then switch to the DOCTYPE\n                        system identifier (single-quoted) state. */\n                        $this->token['system'] = '';\n                        $state = 'DOCTYPE system identifier (single-quoted)';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current DOCTYPE token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* Parse error. Set the DOCTYPE token's force-quirks\n                        flag to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Switch to the bogus DOCTYPE state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-char-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $state = 'bogus DOCTYPE';\n                    }\n                break;\n\n                case 'before DOCTYPE system identifier':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Stay in the before DOCTYPE system identifier state. */\n                    } elseif ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Set the DOCTYPE token's system identifier to the empty\n                        string (not missing), then switch to the DOCTYPE system\n                        identifier (double-quoted) state. */\n                        $this->token['system'] = '';\n                        $state = 'DOCTYPE system identifier (double-quoted)';\n                    } elseif ($char === \"'\") {\n                        /* U+0027 APOSTROPHE (')\n                        Set the DOCTYPE token's system identifier to the empty\n                        string (not missing), then switch to the DOCTYPE system\n                        identifier (single-quoted) state. */\n                        $this->token['system'] = '';\n                        $state = 'DOCTYPE system identifier (single-quoted)';\n                    } elseif ($char === '>') {\n                        /* Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-char-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* Parse error. Set the DOCTYPE token's force-quirks\n                        flag to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Switch to the bogus DOCTYPE state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-char-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $state = 'bogus DOCTYPE';\n                    }\n                break;\n\n                case 'DOCTYPE system identifier (double-quoted)':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '\"') {\n                        /* U+0022 QUOTATION MARK (\")\n                        Switch to the after DOCTYPE system identifier state. */\n                        $state = 'after DOCTYPE system identifier';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-end-of-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current\n                        DOCTYPE token's system identifier. Stay in the DOCTYPE\n                        system identifier (double-quoted) state. */\n                        $this->token['system'] .= $char;\n                    }\n                break;\n\n                case 'DOCTYPE system identifier (single-quoted)':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"'\") {\n                        /* U+0027 APOSTROPHE (')\n                        Switch to the after DOCTYPE system identifier state. */\n                        $state = 'after DOCTYPE system identifier';\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Switch to the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-end-of-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* EOF\n                        Parse error. Set the DOCTYPE token's force-quirks flag\n                        to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Append the current input character to the current\n                        DOCTYPE token's system identifier. Stay in the DOCTYPE\n                        system identifier (double-quoted) state. */\n                        $this->token['system'] .= $char;\n                    }\n                break;\n\n                case 'after DOCTYPE system identifier':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === \"\\t\" || $char === \"\\n\" || $char === \"\\x0c\" || $char === ' ') {\n                        /* U+0009 CHARACTER TABULATION\n                           U+000A LINE FEED (LF)\n                           U+000C FORM FEED (FF)\n                           U+0020 SPACE\n                        Stay in the after DOCTYPE system identifier state. */\n                    } elseif ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the current DOCTYPE token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n                    } elseif ($char === false) {\n                        /* Parse error. Set the DOCTYPE token's force-quirks\n                        flag to on. Emit that DOCTYPE token. Reconsume the EOF\n                        character in the data state. */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'eof-in-doctype'\n                        ]);\n                        $this->token['force-quirks'] = true;\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n                    } else {\n                        /* Anything else\n                        Parse error. Switch to the bogus DOCTYPE state.\n                        (This does not set the DOCTYPE token's force-quirks\n                        flag to on.) */\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'unexpected-char-in-doctype'\n                        ]);\n                        $state = 'bogus DOCTYPE';\n                    }\n                break;\n\n                case 'bogus DOCTYPE':\n                    /* Consume the next input character: */\n                    $char = $this->stream->char();\n\n                    if ($char === '>') {\n                        /* U+003E GREATER-THAN SIGN (>)\n                        Emit the DOCTYPE token. Switch to the data state. */\n                        $this->emitToken($this->token);\n                        $state = 'data';\n\n                    } elseif ($char === false) {\n                        /* EOF\n                        Emit the DOCTYPE token. Reconsume the EOF character in\n                        the data state. */\n                        $this->emitToken($this->token);\n                        $this->stream->unget();\n                        $state = 'data';\n\n                    } else {\n                        /* Anything else\n                        Stay in the bogus DOCTYPE state. */\n                    }\n                break;\n\n                // case 'cdataSection':\n            }\n        }\n    }\n\n    /**\n     * Returns a serialized representation of the tree.\n     *\n     * @return DOMDocument|DOMNodeList\n     */\n    public function save() {\n        return $this->tree->save();\n    }\n\n    /**\n     * @return HTML5_TreeBuilder The tree\n     */\n    public function getTree()\n    {\n        return $this->tree;\n    }\n\n\n    /**\n     * Returns the input stream.\n     *\n     * @return HTML5_InputStream\n     */\n    public function stream() {\n        return $this->stream;\n    }\n\n    /**\n     * @param bool $allowed\n     * @param bool $inattr\n     * @return string\n     */\n    private function consumeCharacterReference($allowed = false, $inattr = false) {\n        // This goes quite far against spec, and is far closer to the Python\n        // impl., mainly because we don't do the large unconsuming the spec\n        // requires.\n\n        // All consumed characters.\n        $chars = $this->stream->char();\n\n        /* This section defines how to consume a character\n        reference. This definition is used when parsing character\n        references in text and in attributes.\n\n        The behavior depends on the identity of the next character\n        (the one immediately after the U+0026 AMPERSAND character): */\n\n        if (\n            $chars[0] === \"\\x09\" ||\n            $chars[0] === \"\\x0A\" ||\n            $chars[0] === \"\\x0C\" ||\n            $chars[0] === \"\\x20\" ||\n            $chars[0] === '<' ||\n            $chars[0] === '&' ||\n            $chars === false ||\n            $chars[0] === $allowed\n        ) {\n            /* U+0009 CHARACTER TABULATION\n               U+000A LINE FEED (LF)\n               U+000C FORM FEED (FF)\n               U+0020 SPACE\n               U+003C LESS-THAN SIGN\n               U+0026 AMPERSAND\n               EOF\n               The additional allowed character, if there is one\n            Not a character reference. No characters are consumed,\n            and nothing is returned. (This is not an error, either.) */\n            // We already consumed, so unconsume.\n            $this->stream->unget();\n            return '&';\n        } elseif ($chars[0] === '#') {\n            /* Consume the U+0023 NUMBER SIGN. */\n            // Um, yeah, we already did that.\n            /* The behavior further depends on the character after\n            the U+0023 NUMBER SIGN: */\n            $chars .= $this->stream->char();\n            if (isset($chars[1]) && ($chars[1] === 'x' || $chars[1] === 'X')) {\n                /* U+0078 LATIN SMALL LETTER X\n                   U+0058 LATIN CAPITAL LETTER X */\n                /* Consume the X. */\n                // Um, yeah, we already did that.\n                /* Follow the steps below, but using the range of\n                characters U+0030 DIGIT ZERO through to U+0039 DIGIT\n                NINE, U+0061 LATIN SMALL LETTER A through to U+0066\n                LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER\n                A, through to U+0046 LATIN CAPITAL LETTER F (in other\n                words, 0123456789, ABCDEF, abcdef). */\n                $char_class = self::HEX;\n                /* When it comes to interpreting the\n                number, interpret it as a hexadecimal number. */\n                $hex = true;\n            } else {\n                /* Anything else */\n                // Unconsume because we shouldn't have consumed this.\n                $chars = $chars[0];\n                $this->stream->unget();\n                /* Follow the steps below, but using the range of\n                characters U+0030 DIGIT ZERO through to U+0039 DIGIT\n                NINE (i.e. just 0123456789). */\n                $char_class = self::DIGIT;\n                /* When it comes to interpreting the number,\n                interpret it as a decimal number. */\n                $hex = false;\n            }\n\n            /* Consume as many characters as match the range of characters given above. */\n            $consumed = $this->stream->charsWhile($char_class);\n            if ($consumed === '' || $consumed === false) {\n                /* If no characters match the range, then don't consume\n                any characters (and unconsume the U+0023 NUMBER SIGN\n                character and, if appropriate, the X character). This\n                is a parse error; nothing is returned. */\n                $this->emitToken([\n                    'type' => self::PARSEERROR,\n                    'data' => 'expected-numeric-entity'\n                ]);\n                return '&' . $chars;\n            } else {\n                /* Otherwise, if the next character is a U+003B SEMICOLON,\n                consume that too. If it isn't, there is a parse error. */\n                if ($this->stream->char() !== ';') {\n                    $this->stream->unget();\n                    $this->emitToken([\n                        'type' => self::PARSEERROR,\n                        'data' => 'numeric-entity-without-semicolon'\n                    ]);\n                }\n\n                /* If one or more characters match the range, then take\n                them all and interpret the string of characters as a number\n                (either hexadecimal or decimal as appropriate). */\n                $codepoint = $hex ? hexdec($consumed) : (int) $consumed;\n\n                /* If that number is one of the numbers in the first column\n                of the following table, then this is a parse error. Find the\n                row with that number in the first column, and return a\n                character token for the Unicode character given in the\n                second column of that row. */\n                $new_codepoint = HTML5_Data::getRealCodepoint($codepoint);\n                if ($new_codepoint) {\n                    $this->emitToken([\n                        'type' => self::PARSEERROR,\n                        'data' => 'illegal-windows-1252-entity'\n                    ]);\n                    return HTML5_Data::utf8chr($new_codepoint);\n                } else {\n                    /* Otherwise, if the number is greater than 0x10FFFF, then\n                     * this is a parse error. Return a U+FFFD REPLACEMENT\n                     * CHARACTER. */\n                    if ($codepoint > 0x10FFFF) {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'overlong-character-entity' // XXX probably not correct\n                        ]);\n                        return \"\\xEF\\xBF\\xBD\";\n                    }\n                    /* Otherwise, return a character token for the Unicode\n                     * character whose code point is that number.  If the\n                     * number is in the range 0x0001 to 0x0008,    0x000E to\n                     * 0x001F,  0x007F  to 0x009F, 0xD800 to 0xDFFF, 0xFDD0 to\n                     * 0xFDEF, or is one of 0x000B, 0xFFFE, 0xFFFF, 0x1FFFE,\n                     * 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE,\n                     * 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE,\n                     * 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE,\n                     * 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,\n                     * 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE,\n                     * or 0x10FFFF, then this is a parse error. */\n                    // && has higher precedence than ||\n                    if (\n                        $codepoint >= 0x0000 && $codepoint <= 0x0008 ||\n                        $codepoint === 0x000B ||\n                        $codepoint >= 0x000E && $codepoint <= 0x001F ||\n                        $codepoint >= 0x007F && $codepoint <= 0x009F ||\n                        $codepoint >= 0xD800 && $codepoint <= 0xDFFF ||\n                        $codepoint >= 0xFDD0 && $codepoint <= 0xFDEF ||\n                        ($codepoint & 0xFFFE) === 0xFFFE ||\n                        $codepoint == 0x10FFFF || $codepoint == 0x10FFFE\n                    ) {\n                        $this->emitToken([\n                            'type' => self::PARSEERROR,\n                            'data' => 'illegal-codepoint-for-numeric-entity'\n                        ]);\n                    }\n                    return HTML5_Data::utf8chr($codepoint);\n                }\n            }\n        } else {\n            /* Anything else */\n\n            /* Consume the maximum number of characters possible,\n            with the consumed characters matching one of the\n            identifiers in the first column of the named character\n            references table (in a case-sensitive manner). */\n            // What we actually do here is consume as much as we can while it\n            // matches the start of one of the identifiers in the first column.\n\n            $refs = HTML5_Data::getNamedCharacterReferences();\n\n            // Get the longest string which is the start of an identifier\n            // ($chars) as well as the longest identifier which matches ($id)\n            // and its codepoint ($codepoint).\n            $codepoint = false;\n            $char = $chars;\n            while ($char !== false && isset($refs[$char])) {\n                $refs = $refs[$char];\n                if (isset($refs['codepoint'])) {\n                    $id = $chars;\n                    $codepoint = $refs['codepoint'];\n                }\n                $chars .= $char = $this->stream->char();\n            }\n\n            // Unconsume the one character we just took which caused the while\n            // statement to fail. This could be anything and could cause state\n            // changes (as if it matches the while loop it must be\n            // alphanumeric so we can just concat it to whatever we get later).\n            $this->stream->unget();\n            if ($char !== false) {\n                $chars = substr($chars, 0, -1);\n            }\n\n            /* If no match can be made, then this is a parse error.\n            No characters are consumed, and nothing is returned. */\n            if (!$codepoint) {\n                $this->emitToken([\n                    'type' => self::PARSEERROR,\n                    'data' => 'expected-named-entity'\n                ]);\n                return '&' . $chars;\n            }\n\n            /* If the last character matched is not a U+003B SEMICOLON\n            (;), there is a parse error. */\n            $semicolon = true;\n            if (substr($id, -1) !== ';') {\n                $this->emitToken([\n                    'type' => self::PARSEERROR,\n                    'data' => 'named-entity-without-semicolon'\n                ]);\n                $semicolon = false;\n            }\n\n            /* If the character reference is being consumed as part of\n            an attribute, and the last character matched is not a\n            U+003B SEMICOLON (;), and the next character is in the\n            range U+0030 DIGIT ZERO to U+0039 DIGIT NINE, U+0041\n            LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL LETTER Z,\n            or U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z,\n            then, for historical reasons, all the characters that were\n            matched after the U+0026 AMPERSAND (&) must be unconsumed,\n            and nothing is returned. */\n            if ($inattr && !$semicolon) {\n                // The next character is either the next character in $chars or in the stream.\n                if (strlen($chars) > strlen($id)) {\n                    $next = substr($chars, strlen($id), 1);\n                } else {\n                    $next = $this->stream->char();\n                    $this->stream->unget();\n                }\n                if (\n                    '0' <= $next && $next <= '9' ||\n                    'A' <= $next && $next <= 'Z' ||\n                    'a' <= $next && $next <= 'z'\n                ) {\n                    return '&' . $chars;\n                }\n            }\n\n            /* Otherwise, return a character token for the character\n            corresponding to the character reference name (as given\n            by the second column of the named character references table). */\n            return HTML5_Data::utf8chr($codepoint) . substr($chars, strlen($id));\n        }\n    }\n\n    /**\n     * @param bool $allowed\n     */\n    private function characterReferenceInAttributeValue($allowed = false) {\n        /* Attempt to consume a character reference. */\n        $entity = $this->consumeCharacterReference($allowed, true);\n\n        /* If nothing is returned, append a U+0026 AMPERSAND\n        character to the current attribute's value.\n\n        Otherwise, append the returned character token to the\n        current attribute's value. */\n        $char = (!$entity)\n            ? '&'\n            : $entity;\n\n        $last = count($this->token['attr']) - 1;\n        $this->token['attr'][$last]['value'] .= $char;\n\n        /* Finally, switch back to the attribute value state that you\n        were in when were switched into this state. */\n    }\n\n    /**\n     * Emits a token, passing it on to the tree builder.\n     *\n     * @param $token\n     * @param bool $checkStream\n     * @param bool $dry\n     */\n    protected function emitToken($token, $checkStream = true, $dry = false) {\n        if ($checkStream === true) {\n            // Emit errors from input stream.\n            while ($this->stream->errors) {\n                $this->emitToken(array_shift($this->stream->errors), false);\n            }\n        }\n        if ($token['type'] === self::ENDTAG && !empty($token['attr'])) {\n            for ($i = 0; $i < count($token['attr']); $i++) {\n                $this->emitToken([\n                    'type' => self::PARSEERROR,\n                    'data' => 'attributes-in-end-tag'\n                ]);\n            }\n        }\n        if ($token['type'] === self::ENDTAG && !empty($token['self-closing'])) {\n            $this->emitToken([\n                'type' => self::PARSEERROR,\n                'data' => 'self-closing-flag-on-end-tag',\n            ]);\n        }\n        if ($token['type'] === self::STARTTAG) {\n            // This could be changed to actually pass the tree-builder a hash\n            $hash = [];\n            foreach ($token['attr'] as $keypair) {\n                if (isset($hash[$keypair['name']])) {\n                    $this->emitToken([\n                        'type' => self::PARSEERROR,\n                        'data' => 'duplicate-attribute',\n                    ]);\n                } else {\n                    $hash[$keypair['name']] = $keypair['value'];\n                }\n            }\n        }\n\n        if ($dry === false) {\n            // the current structure of attributes is not a terribly good one\n            $this->tree->emitToken($token);\n        }\n\n        if ($dry === false && is_int($this->tree->content_model)) {\n            $this->content_model = $this->tree->content_model;\n            $this->tree->content_model = null;\n\n        } elseif ($token['type'] === self::ENDTAG) {\n            $this->content_model = self::PCDATA;\n        }\n    }\n}\n\n"
  },
  {
    "path": "application/libraries/dompdf/lib/html5lib/TreeBuilder.php",
    "content": "<?php\n\n/*\n\nCopyright 2007 Jeroen van der Meer <http://jero.net/>\nCopyright 2009 Edward Z. Yang <edwardzyang@thewritingpot.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n// Tags for FIX ME!!!: (in order of priority)\n//      XXX - should be fixed NAO!\n//      XERROR - with regards to parse errors\n//      XSCRIPT - with regards to scripting mode\n//      XENCODING - with regards to encoding (for reparsing tests)\n//      XDOM - DOM specific code (tagName is explicitly not marked).\n//          this is not (yet) in helper functions.\n\nclass HTML5_TreeBuilder {\n    public $stack = [];\n    public $content_model;\n\n    private $mode;\n    private $original_mode;\n    private $secondary_mode;\n    private $dom;\n    // Whether or not normal insertion of nodes should actually foster\n    // parent (used in one case in spec)\n    private $foster_parent = false;\n    private $a_formatting  = [];\n\n    private $head_pointer = null;\n    private $form_pointer = null;\n\n    private $flag_frameset_ok = true;\n    private $flag_force_quirks = false;\n    private $ignored = false;\n    private $quirks_mode = null;\n    // this gets to 2 when we want to ignore the next lf character, and\n    // is decrement at the beginning of each processed token (this way,\n    // code can check for (bool)$ignore_lf_token, but it phases out\n    // appropriately)\n    private $ignore_lf_token = 0;\n    private $fragment = false;\n    private $root;\n\n    private $scoping = ['applet','button','caption','html','marquee','object','table','td','th', 'svg:foreignObject'];\n    private $formatting = ['a','b','big','code','em','font','i','nobr','s','small','strike','strong','tt','u'];\n    // dl and ds are speculative\n    private $special = ['address','area','article','aside','base','basefont','bgsound',\n    'blockquote','body','br','center','col','colgroup','command','dc','dd','details','dir','div','dl','ds',\n    'dt','embed','fieldset','figure','footer','form','frame','frameset','h1','h2','h3','h4','h5',\n    'h6','head','header','hgroup','hr','iframe','img','input','isindex','li','link',\n    'listing','menu','meta','nav','noembed','noframes','noscript','ol',\n    'p','param','plaintext','pre','script','select','spacer','style',\n    'tbody','textarea','tfoot','thead','title','tr','ul','wbr'];\n\n    private $pendingTableCharacters;\n    private $pendingTableCharactersDirty;\n\n    // Tree construction modes\n    const INITIAL           = 0;\n    const BEFORE_HTML       = 1;\n    const BEFORE_HEAD       = 2;\n    const IN_HEAD           = 3;\n    const IN_HEAD_NOSCRIPT  = 4;\n    const AFTER_HEAD        = 5;\n    const IN_BODY           = 6;\n    const IN_CDATA_RCDATA   = 7;\n    const IN_TABLE          = 8;\n    const IN_TABLE_TEXT     = 9;\n    const IN_CAPTION        = 10;\n    const IN_COLUMN_GROUP   = 11;\n    const IN_TABLE_BODY     = 12;\n    const IN_ROW            = 13;\n    const IN_CELL           = 14;\n    const IN_SELECT         = 15;\n    const IN_SELECT_IN_TABLE= 16;\n    const IN_FOREIGN_CONTENT= 17;\n    const AFTER_BODY        = 18;\n    const IN_FRAMESET       = 19;\n    const AFTER_FRAMESET    = 20;\n    const AFTER_AFTER_BODY  = 21;\n    const AFTER_AFTER_FRAMESET = 22;\n\n    /**\n     * Converts a magic number to a readable name. Use for debugging.\n     */\n    private function strConst($number) {\n        static $lookup;\n        if (!$lookup) {\n            $lookup = [];\n            $r = new ReflectionClass('HTML5_TreeBuilder');\n            $consts = $r->getConstants();\n            foreach ($consts as $const => $num) {\n                if (!is_int($num)) {\n                    continue;\n                }\n                $lookup[$num] = $const;\n            }\n        }\n        return $lookup[$number];\n    }\n\n    // The different types of elements.\n    const SPECIAL    = 100;\n    const SCOPING    = 101;\n    const FORMATTING = 102;\n    const PHRASING   = 103;\n\n    // Quirks modes in $quirks_mode\n    const NO_QUIRKS             = 200;\n    const QUIRKS_MODE           = 201;\n    const LIMITED_QUIRKS_MODE   = 202;\n\n    // Marker to be placed in $a_formatting\n    const MARKER     = 300;\n\n    // Namespaces for foreign content\n    const NS_HTML   = null; // to prevent DOM from requiring NS on everything\n    const NS_MATHML = 'http://www.w3.org/1998/Math/MathML';\n    const NS_SVG    = 'http://www.w3.org/2000/svg';\n    const NS_XLINK  = 'http://www.w3.org/1999/xlink';\n    const NS_XML    = 'http://www.w3.org/XML/1998/namespace';\n    const NS_XMLNS  = 'http://www.w3.org/2000/xmlns/';\n\n    // Different types of scopes to test for elements\n    const SCOPE = 0;\n    const SCOPE_LISTITEM = 1;\n    const SCOPE_TABLE = 2;\n\n    /**\n     * HTML5_TreeBuilder constructor.\n     */\n    public function __construct() {\n        $this->mode = self::INITIAL;\n        $this->dom = new DOMDocument;\n\n        $this->dom->encoding = 'UTF-8';\n        $this->dom->preserveWhiteSpace = true;\n        $this->dom->substituteEntities = true;\n        $this->dom->strictErrorChecking = false;\n    }\n\n    public function getQuirksMode(){\n      return $this->quirks_mode;\n    }\n\n    /**\n     * Process tag tokens\n     *\n     * @param $token\n     * @param null $mode\n     */\n    public function emitToken($token, $mode = null) {\n        // XXX: ignore parse errors... why are we emitting them, again?\n        if ($token['type'] === HTML5_Tokenizer::PARSEERROR) {\n            return;\n        }\n        if ($mode === null) {\n            $mode = $this->mode;\n        }\n\n        /*\n        $backtrace = debug_backtrace();\n        if ($backtrace[1]['class'] !== 'HTML5_TreeBuilder') echo \"--\\n\";\n        echo $this->strConst($mode);\n        if ($this->original_mode) echo \" (originally \".$this->strConst($this->original_mode).\")\";\n        echo \"\\n  \";\n        token_dump($token);\n        $this->printStack();\n        $this->printActiveFormattingElements();\n        if ($this->foster_parent) echo \"  -> this is a foster parent mode\\n\";\n        if ($this->flag_frameset_ok) echo \"  -> frameset ok\\n\";\n        */\n\n        if ($this->ignore_lf_token) {\n            $this->ignore_lf_token--;\n        }\n        $this->ignored = false;\n\n        switch ($mode) {\n            case self::INITIAL:\n\n                /* A character token that is one of U+0009 CHARACTER TABULATION,\n                 * U+000A LINE FEED (LF), U+000C FORM FEED (FF),  or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Ignore the token. */\n                    $this->ignored = true;\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    if (\n                        $token['name'] !== 'html' || !empty($token['public']) ||\n                        !empty($token['system']) || $token !== 'about:legacy-compat'\n                    ) {\n                        /* If the DOCTYPE token's name is not a case-sensitive match\n                         * for the string \"html\", or if the token's public identifier\n                         * is not missing, or if the token's system identifier is\n                         * neither missing nor a case-sensitive match for the string\n                         * \"about:legacy-compat\", then there is a parse error (this\n                         * is the DOCTYPE parse error). */\n                        // DOCTYPE parse error\n                    }\n                    /* Append a DocumentType node to the Document node, with the name\n                     * attribute set to the name given in the DOCTYPE token, or the\n                     * empty string if the name was missing; the publicId attribute\n                     * set to the public identifier given in the DOCTYPE token, or\n                     * the empty string if the public identifier was missing; the\n                     * systemId attribute set to the system identifier given in the\n                     * DOCTYPE token, or the empty string if the system identifier\n                     * was missing; and the other attributes specific to\n                     * DocumentType objects set to null and empty lists as\n                     * appropriate. Associate the DocumentType node with the\n                     * Document object so that it is returned as the value of the\n                     * doctype attribute of the Document object. */\n                    if (!isset($token['public'])) {\n                        $token['public'] = null;\n                    }\n                    if (!isset($token['system'])) {\n                        $token['system'] = null;\n                    }\n                    // XDOM\n                    // Yes this is hacky. I'm kind of annoyed that I can't appendChild\n                    // a doctype to DOMDocument. Maybe I haven't chanted the right\n                    // syllables.\n                    $impl = new DOMImplementation();\n                    // This call can fail for particularly pathological cases (namely,\n                    // the qualifiedName parameter ($token['name']) could be missing.\n                    if ($token['name']) {\n                        $doctype = $impl->createDocumentType($token['name'], $token['public'], $token['system']);\n                        $this->dom->appendChild($doctype);\n                    } else {\n                        // It looks like libxml's not actually *able* to express this case.\n                        // So... don't.\n                        $this->dom->emptyDoctype = true;\n                    }\n                    $public = is_null($token['public']) ? false : strtolower($token['public']);\n                    $system = is_null($token['system']) ? false : strtolower($token['system']);\n                    $publicStartsWithForQuirks = [\n                     \"+//silmaril//dtd html pro v0r11 19970101//\",\n                     \"-//advasoft ltd//dtd html 3.0 aswedit + extensions//\",\n                     \"-//as//dtd html 3.0 aswedit + extensions//\",\n                     \"-//ietf//dtd html 2.0 level 1//\",\n                     \"-//ietf//dtd html 2.0 level 2//\",\n                     \"-//ietf//dtd html 2.0 strict level 1//\",\n                     \"-//ietf//dtd html 2.0 strict level 2//\",\n                     \"-//ietf//dtd html 2.0 strict//\",\n                     \"-//ietf//dtd html 2.0//\",\n                     \"-//ietf//dtd html 2.1e//\",\n                     \"-//ietf//dtd html 3.0//\",\n                     \"-//ietf//dtd html 3.2 final//\",\n                     \"-//ietf//dtd html 3.2//\",\n                     \"-//ietf//dtd html 3//\",\n                     \"-//ietf//dtd html level 0//\",\n                     \"-//ietf//dtd html level 1//\",\n                     \"-//ietf//dtd html level 2//\",\n                     \"-//ietf//dtd html level 3//\",\n                     \"-//ietf//dtd html strict level 0//\",\n                     \"-//ietf//dtd html strict level 1//\",\n                     \"-//ietf//dtd html strict level 2//\",\n                     \"-//ietf//dtd html strict level 3//\",\n                     \"-//ietf//dtd html strict//\",\n                     \"-//ietf//dtd html//\",\n                     \"-//metrius//dtd metrius presentational//\",\n                     \"-//microsoft//dtd internet explorer 2.0 html strict//\",\n                     \"-//microsoft//dtd internet explorer 2.0 html//\",\n                     \"-//microsoft//dtd internet explorer 2.0 tables//\",\n                     \"-//microsoft//dtd internet explorer 3.0 html strict//\",\n                     \"-//microsoft//dtd internet explorer 3.0 html//\",\n                     \"-//microsoft//dtd internet explorer 3.0 tables//\",\n                     \"-//netscape comm. corp.//dtd html//\",\n                     \"-//netscape comm. corp.//dtd strict html//\",\n                     \"-//o'reilly and associates//dtd html 2.0//\",\n                     \"-//o'reilly and associates//dtd html extended 1.0//\",\n                     \"-//o'reilly and associates//dtd html extended relaxed 1.0//\",\n                     \"-//spyglass//dtd html 2.0 extended//\",\n                     \"-//sq//dtd html 2.0 hotmetal + extensions//\",\n                     \"-//sun microsystems corp.//dtd hotjava html//\",\n                     \"-//sun microsystems corp.//dtd hotjava strict html//\",\n                     \"-//w3c//dtd html 3 1995-03-24//\",\n                     \"-//w3c//dtd html 3.2 draft//\",\n                     \"-//w3c//dtd html 3.2 final//\",\n                     \"-//w3c//dtd html 3.2//\",\n                     \"-//w3c//dtd html 3.2s draft//\",\n                     \"-//w3c//dtd html 4.0 frameset//\",\n                     \"-//w3c//dtd html 4.0 transitional//\",\n                     \"-//w3c//dtd html experimental 19960712//\",\n                     \"-//w3c//dtd html experimental 970421//\",\n                     \"-//w3c//dtd w3 html//\",\n                     \"-//w3o//dtd w3 html 3.0//\",\n                     \"-//webtechs//dtd mozilla html 2.0//\",\n                     \"-//webtechs//dtd mozilla html//\",\n                    ];\n                    $publicSetToForQuirks = [\n                     \"-//w3o//dtd w3 html strict 3.0//\",\n                     \"-/w3c/dtd html 4.0 transitional/en\",\n                     \"html\",\n                    ];\n                    $publicStartsWithAndSystemForQuirks = [\n                     \"-//w3c//dtd html 4.01 frameset//\",\n                     \"-//w3c//dtd html 4.01 transitional//\",\n                    ];\n                    $publicStartsWithForLimitedQuirks = [\n                     \"-//w3c//dtd xhtml 1.0 frameset//\",\n                     \"-//w3c//dtd xhtml 1.0 transitional//\",\n                    ];\n                    $publicStartsWithAndSystemForLimitedQuirks = [\n                     \"-//w3c//dtd html 4.01 frameset//\",\n                     \"-//w3c//dtd html 4.01 transitional//\",\n                    ];\n                    // first, do easy checks\n                    if (\n                        !empty($token['force-quirks']) ||\n                        strtolower($token['name']) !== 'html'\n                    ) {\n                        $this->quirks_mode = self::QUIRKS_MODE;\n                    } else {\n                        do {\n                            if ($system) {\n                                foreach ($publicStartsWithAndSystemForQuirks as $x) {\n                                    if (strncmp($public, $x, strlen($x)) === 0) {\n                                        $this->quirks_mode = self::QUIRKS_MODE;\n                                        break;\n                                    }\n                                }\n                                if (!is_null($this->quirks_mode)) {\n                                    break;\n                                }\n                                foreach ($publicStartsWithAndSystemForLimitedQuirks as $x) {\n                                    if (strncmp($public, $x, strlen($x)) === 0) {\n                                        $this->quirks_mode = self::LIMITED_QUIRKS_MODE;\n                                        break;\n                                    }\n                                }\n                                if (!is_null($this->quirks_mode)) {\n                                    break;\n                                }\n                            }\n                            foreach ($publicSetToForQuirks as $x) {\n                                if ($public === $x) {\n                                    $this->quirks_mode = self::QUIRKS_MODE;\n                                    break;\n                                }\n                            }\n                            if (!is_null($this->quirks_mode)) {\n                                break;\n                            }\n                            foreach ($publicStartsWithForLimitedQuirks as $x) {\n                                if (strncmp($public, $x, strlen($x)) === 0) {\n                                    $this->quirks_mode = self::LIMITED_QUIRKS_MODE;\n                                }\n                            }\n                            if (!is_null($this->quirks_mode)) {\n                                break;\n                            }\n                            if ($system === \"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd\") {\n                                $this->quirks_mode = self::QUIRKS_MODE;\n                                break;\n                            }\n                            foreach ($publicStartsWithForQuirks as $x) {\n                                if (strncmp($public, $x, strlen($x)) === 0) {\n                                    $this->quirks_mode = self::QUIRKS_MODE;\n                                    break;\n                                }\n                            }\n                            if (is_null($this->quirks_mode)) {\n                                $this->quirks_mode = self::NO_QUIRKS;\n                            }\n                        } while (false);\n                    }\n                    $this->mode = self::BEFORE_HTML;\n                } else {\n                    // parse error\n                    /* Switch the insertion mode to \"before html\", then reprocess the\n                     * current token. */\n                    $this->mode = self::BEFORE_HTML;\n                    $this->quirks_mode = self::QUIRKS_MODE;\n                    $this->emitToken($token);\n                }\n                break;\n\n            case self::BEFORE_HTML:\n                /* A DOCTYPE token */\n                if ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // Parse error. Ignore the token.\n                    $this->ignored = true;\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the Document object with the data\n                    attribute set to the data given in the comment token. */\n                    // XDOM\n                    $comment = $this->dom->createComment($token['data']);\n                    $this->dom->appendChild($comment);\n\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                or U+0020 SPACE */\n                } elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Ignore the token. */\n                    $this->ignored = true;\n\n                /* A start tag whose tag name is \"html\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] == 'html') {\n                    /* Create an element for the token in the HTML namespace. Append it\n                     * to the Document  object. Put this element in the stack of open\n                     * elements. */\n                    // XDOM\n                    $html = $this->insertElement($token, false);\n                    $this->dom->appendChild($html);\n                    $this->stack[] = $html;\n\n                    $this->mode = self::BEFORE_HEAD;\n\n                } else {\n                    /* Create an html element. Append it to the Document object. Put\n                     * this element in the stack of open elements. */\n                    // XDOM\n                    $html = $this->dom->createElementNS(self::NS_HTML, 'html');\n                    $this->dom->appendChild($html);\n                    $this->stack[] = $html;\n\n                    /* Switch the insertion mode to \"before head\", then reprocess the\n                     * current token. */\n                    $this->mode = self::BEFORE_HEAD;\n                    $this->emitToken($token);\n                }\n                break;\n\n            case self::BEFORE_HEAD:\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Ignore the token. */\n                    $this->ignored = true;\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data attribute\n                    set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                /* A DOCTYPE token */\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    /* Parse error. Ignore the token */\n                    $this->ignored = true;\n                    // parse error\n\n                /* A start tag token with the tag name \"html\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    /* Process the token using the rules for the \"in body\"\n                     * insertion mode. */\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* A start tag token with the tag name \"head\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') {\n                    /* Insert an HTML element for the token. */\n                    $element = $this->insertElement($token);\n\n                    /* Set the head element pointer to this new element node. */\n                    $this->head_pointer = $element;\n\n                    /* Change the insertion mode to \"in head\". */\n                    $this->mode = self::IN_HEAD;\n\n                /* An end tag whose tag name is one of: \"head\", \"body\", \"html\", \"br\" */\n                } elseif (\n                    $token['type'] === HTML5_Tokenizer::ENDTAG && (\n                        $token['name'] === 'head' || $token['name'] === 'body' ||\n                        $token['name'] === 'html' || $token['name'] === 'br'\n                )) {\n                    /* Act as if a start tag token with the tag name \"head\" and no\n                     * attributes had been seen, then reprocess the current token. */\n                    $this->emitToken([\n                        'name' => 'head',\n                        'type' => HTML5_Tokenizer::STARTTAG,\n                        'attr' => []\n                    ]);\n                    $this->emitToken($token);\n\n                /* Any other end tag */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n\n                } else {\n                    /* Act as if a start tag token with the tag name \"head\" and no\n                     * attributes had been seen, then reprocess the current token.\n                     * Note: This will result in an empty head element being\n                     * generated, with the current token being reprocessed in the\n                     * \"after head\" insertion mode. */\n                    $this->emitToken([\n                        'name' => 'head',\n                        'type' => HTML5_Tokenizer::STARTTAG,\n                        'attr' => []\n                    ]);\n                    $this->emitToken($token);\n                }\n                break;\n\n            case self::IN_HEAD:\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                or U+0020 SPACE. */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Insert the character into the current node. */\n                    $this->insertText($token['data']);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data attribute\n                    set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                /* A DOCTYPE token */\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n                    // parse error\n\n                /* A start tag whose tag name is \"html\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* A start tag whose tag name is one of: \"base\", \"command\", \"link\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                ($token['name'] === 'base' || $token['name'] === 'command' ||\n                $token['name'] === 'link')) {\n                    /* Insert an HTML element for the token. Immediately pop the\n                     * current node off the stack of open elements. */\n                    $this->insertElement($token);\n                    array_pop($this->stack);\n\n                    // YYY: Acknowledge the token's self-closing flag, if it is set.\n\n                /* A start tag whose tag name is \"meta\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'meta') {\n                    /* Insert an HTML element for the token. Immediately pop the\n                     * current node off the stack of open elements. */\n                    $this->insertElement($token);\n                    array_pop($this->stack);\n\n                    // XERROR: Acknowledge the token's self-closing flag, if it is set.\n\n                    // XENCODING: If the element has a charset attribute, and its value is a\n                    // supported encoding, and the confidence is currently tentative,\n                    // then change the encoding to the encoding given by the value of\n                    // the charset attribute.\n                    //\n                    // Otherwise, if the element has a content attribute, and applying\n                    // the algorithm for extracting an encoding from a Content-Type to\n                    // its value returns a supported encoding encoding, and the\n                    // confidence is currently tentative, then change the encoding to\n                    // the encoding encoding.\n\n                /* A start tag with the tag name \"title\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'title') {\n                    $this->insertRCDATAElement($token);\n\n                /* A start tag whose tag name is \"noscript\", if the scripting flag is enabled, or\n                 * A start tag whose tag name is one of: \"noframes\", \"style\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                ($token['name'] === 'noscript' || $token['name'] === 'noframes' || $token['name'] === 'style')) {\n                    // XSCRIPT: Scripting flag not respected\n                    $this->insertCDATAElement($token);\n\n                // XSCRIPT: Scripting flag disable not implemented\n\n                /* A start tag with the tag name \"script\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') {\n                    /* 1. Create an element for the token in the HTML namespace. */\n                    $node = $this->insertElement($token, false);\n\n                    /* 2. Mark the element as being \"parser-inserted\" */\n                    // Uhhh... XSCRIPT\n\n                    /* 3. If the parser was originally created for the HTML\n                     * fragment parsing algorithm, then mark the script element as\n                     * \"already executed\". (fragment case) */\n                    // ditto... XSCRIPT\n\n                    /* 4. Append the new element to the current node  and push it onto\n                     * the stack of open elements.  */\n                    end($this->stack)->appendChild($node);\n                    $this->stack[] = $node;\n                    // I guess we could squash these together\n\n                    /* 6. Let the original insertion mode be the current insertion mode. */\n                    $this->original_mode = $this->mode;\n                    /* 7. Switch the insertion mode to \"in CDATA/RCDATA\" */\n                    $this->mode = self::IN_CDATA_RCDATA;\n                    /* 5. Switch the tokeniser's content model flag to the CDATA state. */\n                    $this->content_model = HTML5_Tokenizer::CDATA;\n\n                /* An end tag with the tag name \"head\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'head') {\n                    /* Pop the current node (which will be the head element) off the stack of open elements. */\n                    array_pop($this->stack);\n\n                    /* Change the insertion mode to \"after head\". */\n                    $this->mode = self::AFTER_HEAD;\n\n                // Slight logic inversion here to minimize duplication\n                /* A start tag with the tag name \"head\". */\n                /* An end tag whose tag name is not one of: \"body\", \"html\", \"br\" */\n                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') ||\n                ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] !== 'html' &&\n                $token['name'] !== 'body' && $token['name'] !== 'br')) {\n                    // Parse error. Ignore the token.\n                    $this->ignored = true;\n\n                /* Anything else */\n                } else {\n                    /* Act as if an end tag token with the tag name \"head\" had been\n                     * seen, and reprocess the current token. */\n                    $this->emitToken([\n                        'name' => 'head',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n\n                    /* Then, reprocess the current token. */\n                    $this->emitToken($token);\n                }\n                break;\n\n            case self::IN_HEAD_NOSCRIPT:\n                if ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'noscript') {\n                    /* Pop the current node (which will be a noscript element) from the\n                     * stack of open elements; the new current node will be a head\n                     * element. */\n                    array_pop($this->stack);\n                    $this->mode = self::IN_HEAD;\n                } elseif (\n                    ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) ||\n                    ($token['type'] === HTML5_Tokenizer::COMMENT) ||\n                    ($token['type'] === HTML5_Tokenizer::STARTTAG && (\n                        $token['name'] === 'link' || $token['name'] === 'meta' ||\n                        $token['name'] === 'noframes' || $token['name'] === 'style'))) {\n                    $this->processWithRulesFor($token, self::IN_HEAD);\n                // inverted logic\n                } elseif (\n                    ($token['type'] === HTML5_Tokenizer::STARTTAG && (\n                        $token['name'] === 'head' || $token['name'] === 'noscript')) ||\n                    ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                        $token['name'] !== 'br')) {\n                    // parse error\n                } else {\n                    // parse error\n                    $this->emitToken([\n                        'type' => HTML5_Tokenizer::ENDTAG,\n                        'name' => 'noscript',\n                    ]);\n                    $this->emitToken($token);\n                }\n                break;\n\n            case self::AFTER_HEAD:\n                /* Handle the token as follows: */\n\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Append the character to the current node. */\n                    $this->insertText($token['data']);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data attribute\n                    set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* A start tag token with the tag name \"body\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'body') {\n                    $this->insertElement($token);\n\n                    /* Set the frameset-ok flag to \"not ok\". */\n                    $this->flag_frameset_ok = false;\n\n                    /* Change the insertion mode to \"in body\". */\n                    $this->mode = self::IN_BODY;\n\n                /* A start tag token with the tag name \"frameset\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'frameset') {\n                    /* Insert a frameset element for the token. */\n                    $this->insertElement($token);\n\n                    /* Change the insertion mode to \"in frameset\". */\n                    $this->mode = self::IN_FRAMESET;\n\n                /* A start tag token whose tag name is one of: \"base\", \"link\", \"meta\",\n                \"script\", \"style\", \"title\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],\n                ['base', 'link', 'meta', 'noframes', 'script', 'style', 'title'])) {\n                    // parse error\n                    /* Push the node pointed to by the head element pointer onto the\n                     * stack of open elements. */\n                    $this->stack[] = $this->head_pointer;\n                    $this->processWithRulesFor($token, self::IN_HEAD);\n                    array_splice($this->stack, array_search($this->head_pointer, $this->stack, true), 1);\n\n                // inversion of specification\n                } elseif (\n                ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') ||\n                ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                    $token['name'] !== 'body' && $token['name'] !== 'html' &&\n                    $token['name'] !== 'br')) {\n                    // parse error\n\n                /* Anything else */\n                } else {\n                    $this->emitToken([\n                        'name' => 'body',\n                        'type' => HTML5_Tokenizer::STARTTAG,\n                        'attr' => []\n                    ]);\n                    $this->flag_frameset_ok = true;\n                    $this->emitToken($token);\n                }\n                break;\n\n            case self::IN_BODY:\n                /* Handle the token as follows: */\n\n                switch($token['type']) {\n                    /* A character token */\n                    case HTML5_Tokenizer::CHARACTER:\n                    case HTML5_Tokenizer::SPACECHARACTER:\n                        /* Reconstruct the active formatting elements, if any. */\n                        $this->reconstructActiveFormattingElements();\n\n                        /* Append the token's character to the current node. */\n                        $this->insertText($token['data']);\n\n                        /* If the token is not one of U+0009 CHARACTER TABULATION,\n                         * U+000A LINE FEED (LF), U+000C FORM FEED (FF),  or U+0020\n                         * SPACE, then set the frameset-ok flag to \"not ok\". */\n                        // i.e., if any of the characters is not whitespace\n                        if (strlen($token['data']) !== strspn($token['data'], HTML5_Tokenizer::WHITESPACE)) {\n                            $this->flag_frameset_ok = false;\n                        }\n                    break;\n\n                    /* A comment token */\n                    case HTML5_Tokenizer::COMMENT:\n                        /* Append a Comment node to the current node with the data\n                        attribute set to the data given in the comment token. */\n                        $this->insertComment($token['data']);\n                    break;\n\n                    case HTML5_Tokenizer::DOCTYPE:\n                        // parse error\n                    break;\n\n                    case HTML5_Tokenizer::EOF:\n                        // parse error\n                    break;\n\n                    case HTML5_Tokenizer::STARTTAG:\n                    switch($token['name']) {\n                        case 'html':\n                            // parse error\n                            /* For each attribute on the token, check to see if the\n                             * attribute is already present on the top element of the\n                             * stack of open elements. If it is not, add the attribute\n                             * and its corresponding value to that element. */\n                            foreach($token['attr'] as $attr) {\n                                if (!$this->stack[0]->hasAttribute($attr['name'])) {\n                                    $this->stack[0]->setAttribute($attr['name'], $attr['value']);\n                                }\n                            }\n                        break;\n\n                        case 'base': case 'command': case 'link': case 'meta': case 'noframes':\n                        case 'script': case 'style': case 'title':\n                            /* Process the token as if the insertion mode had been \"in\n                            head\". */\n                            $this->processWithRulesFor($token, self::IN_HEAD);\n                        break;\n\n                        /* A start tag token with the tag name \"body\" */\n                        case 'body':\n                            /* Parse error. If the second element on the stack of open\n                            elements is not a body element, or, if the stack of open\n                            elements has only one node on it, then ignore the token.\n                            (fragment case) */\n                            if (count($this->stack) === 1 || $this->stack[1]->tagName !== 'body') {\n                                $this->ignored = true;\n                                // Ignore\n\n                            /* Otherwise, for each attribute on the token, check to see\n                            if the attribute is already present on the body element (the\n                            second element)    on the stack of open elements. If it is not,\n                            add the attribute and its corresponding value to that\n                            element. */\n                            } else {\n                                foreach($token['attr'] as $attr) {\n                                    if (!$this->stack[1]->hasAttribute($attr['name'])) {\n                                        $this->stack[1]->setAttribute($attr['name'], $attr['value']);\n                                    }\n                                }\n                            }\n                        break;\n\n                        case 'frameset':\n                            // parse error\n                            /* If the second element on the stack of open elements is\n                             * not a body element, or, if the stack of open elements\n                             * has only one node on it, then ignore the token.\n                             * (fragment case) */\n                            if (count($this->stack) === 1 || $this->stack[1]->tagName !== 'body') {\n                                $this->ignored = true;\n                                // Ignore\n                            } elseif (!$this->flag_frameset_ok) {\n                                $this->ignored = true;\n                                // Ignore\n                            } else {\n                                /* 1. Remove the second element on the stack of open\n                                 * elements from its parent node, if it has one.  */\n                                if ($this->stack[1]->parentNode) {\n                                    $this->stack[1]->parentNode->removeChild($this->stack[1]);\n                                }\n\n                                /* 2. Pop all the nodes from the bottom of the stack of\n                                 * open elements, from the current node up to the root\n                                 * html element. */\n                                array_splice($this->stack, 1);\n\n                                $this->insertElement($token);\n                                $this->mode = self::IN_FRAMESET;\n                            }\n                        break;\n\n                        // in spec, there is a diversion here\n\n                        case 'address': case 'article': case 'aside': case 'blockquote':\n                        case 'center': case 'datagrid': case 'details': case 'dir':\n                        case 'div': case 'dl': case 'fieldset': case 'figure': case 'footer':\n                        case 'header': case 'hgroup': case 'menu': case 'nav':\n                        case 'ol': case 'p': case 'section': case 'ul':\n                            /* If the stack of open elements has a p element in scope,\n                            then act as if an end tag with the tag name p had been\n                            seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n                        break;\n\n                        /* A start tag whose tag name is one of: \"h1\", \"h2\", \"h3\", \"h4\",\n                        \"h5\", \"h6\" */\n                        case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':\n                            /* If the stack of open elements has a p  element in scope,\n                            then act as if an end tag with the tag name p had been seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* If the current node is an element whose tag name is one\n                             * of \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", or \"h6\", then this is a\n                             * parse error; pop the current node off the stack of open\n                             * elements. */\n                            $peek = array_pop($this->stack);\n                            if (in_array($peek->tagName, [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"])) {\n                                // parse error\n                            } else {\n                                $this->stack[] = $peek;\n                            }\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n                        break;\n\n                        case 'pre': case 'listing':\n                            /* If the stack of open elements has a p  element in scope,\n                            then act as if an end tag with the tag name p had been seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n                            $this->insertElement($token);\n                            /* If the next token is a U+000A LINE FEED (LF) character\n                             * token, then ignore that token and move on to the next\n                             * one. (Newlines at the start of pre blocks are ignored as\n                             * an authoring convenience.) */\n                            $this->ignore_lf_token = 2;\n                            $this->flag_frameset_ok = false;\n                        break;\n\n                        /* A start tag whose tag name is \"form\" */\n                        case 'form':\n                            /* If the form element pointer is not null, ignore the\n                            token with a parse error. */\n                            if ($this->form_pointer !== null) {\n                                $this->ignored = true;\n                                // Ignore.\n\n                            /* Otherwise: */\n                            } else {\n                                /* If the stack of open elements has a p element in\n                                scope, then act as if an end tag with the tag name p\n                                had been seen. */\n                                if ($this->elementInScope('p')) {\n                                    $this->emitToken([\n                                        'name' => 'p',\n                                        'type' => HTML5_Tokenizer::ENDTAG\n                                    ]);\n                                }\n\n                                /* Insert an HTML element for the token, and set the\n                                form element pointer to point to the element created. */\n                                $element = $this->insertElement($token);\n                                $this->form_pointer = $element;\n                            }\n                        break;\n\n                        // condensed specification\n                        case 'li': case 'dc': case 'dd': case 'ds': case 'dt':\n                            /* 1. Set the frameset-ok flag to \"not ok\". */\n                            $this->flag_frameset_ok = false;\n\n                            $stack_length = count($this->stack) - 1;\n                            for($n = $stack_length; 0 <= $n; $n--) {\n                                /* 2. Initialise node to be the current node (the\n                                bottommost node of the stack). */\n                                $stop = false;\n                                $node = $this->stack[$n];\n                                $cat  = $this->getElementCategory($node);\n\n                                // for case 'li':\n                                /* 3. If node is an li element, then act as if an end\n                                 * tag with the tag name \"li\" had been seen, then jump\n                                 * to the last step.  */\n                                // for case 'dc': case 'dd': case 'ds': case 'dt':\n                                /* If node is a dc, dd, ds or dt element, then act as if an end\n                                 * tag with the same tag name as node had been seen, then\n                                 * jump to the last step. */\n                                if (($token['name'] === 'li' && $node->tagName === 'li') ||\n                                ($token['name'] !== 'li' && ($node->tagName == 'dc' || $node->tagName === 'dd' || $node->tagName == 'ds' || $node->tagName === 'dt'))) { // limited conditional\n                                    $this->emitToken([\n                                        'type' => HTML5_Tokenizer::ENDTAG,\n                                        'name' => $node->tagName,\n                                    ]);\n                                    break;\n                                }\n\n                                /* 4. If node is not in the formatting category, and is\n                                not    in the phrasing category, and is not an address,\n                                div or p element, then stop this algorithm. */\n                                if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&\n                                $node->tagName !== 'address' && $node->tagName !== 'div' &&\n                                $node->tagName !== 'p') {\n                                    break;\n                                }\n\n                                /* 5. Otherwise, set node to the previous entry in the\n                                 * stack of open elements and return to step 2. */\n                            }\n\n                            /* 6. This is the last step. */\n\n                            /* If the stack of open elements has a p  element in scope,\n                            then act as if an end tag with the tag name p had been\n                            seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Finally, insert an HTML element with the same tag\n                            name as the    token's. */\n                            $this->insertElement($token);\n                        break;\n\n                        /* A start tag token whose tag name is \"plaintext\" */\n                        case 'plaintext':\n                            /* If the stack of open elements has a p  element in scope,\n                            then act as if an end tag with the tag name p had been\n                            seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            $this->content_model = HTML5_Tokenizer::PLAINTEXT;\n                        break;\n\n                        // more diversions\n\n                        /* A start tag whose tag name is \"a\" */\n                        case 'a':\n                            /* If the list of active formatting elements contains\n                            an element whose tag name is \"a\" between the end of the\n                            list and the last marker on the list (or the start of\n                            the list if there is no marker on the list), then this\n                            is a parse error; act as if an end tag with the tag name\n                            \"a\" had been seen, then remove that element from the list\n                            of active formatting elements and the stack of open\n                            elements if the end tag didn't already remove it (it\n                            might not have if the element is not in table scope). */\n                            $leng = count($this->a_formatting);\n\n                            for ($n = $leng - 1; $n >= 0; $n--) {\n                                if ($this->a_formatting[$n] === self::MARKER) {\n                                    break;\n\n                                } elseif ($this->a_formatting[$n]->tagName === 'a') {\n                                    $a = $this->a_formatting[$n];\n                                    $this->emitToken([\n                                        'name' => 'a',\n                                        'type' => HTML5_Tokenizer::ENDTAG\n                                    ]);\n                                    if (in_array($a, $this->a_formatting)) {\n                                        $a_i = array_search($a, $this->a_formatting, true);\n                                        if ($a_i !== false) {\n                                            array_splice($this->a_formatting, $a_i, 1);\n                                        }\n                                    }\n                                    if (in_array($a, $this->stack)) {\n                                        $a_i = array_search($a, $this->stack, true);\n                                        if ($a_i !== false) {\n                                            array_splice($this->stack, $a_i, 1);\n                                        }\n                                    }\n                                    break;\n                                }\n                            }\n\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* Insert an HTML element for the token. */\n                            $el = $this->insertElement($token);\n\n                            /* Add that element to the list of active formatting\n                            elements. */\n                            $this->a_formatting[] = $el;\n                        break;\n\n                        case 'b': case 'big': case 'code': case 'em': case 'font': case 'i':\n                        case 's': case 'small': case 'strike':\n                        case 'strong': case 'tt': case 'u':\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* Insert an HTML element for the token. */\n                            $el = $this->insertElement($token);\n\n                            /* Add that element to the list of active formatting\n                            elements. */\n                            $this->a_formatting[] = $el;\n                        break;\n\n                        case 'nobr':\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* If the stack of open elements has a nobr element in\n                             * scope, then this is a parse error; act as if an end tag\n                             * with the tag name \"nobr\" had been seen, then once again\n                             * reconstruct the active formatting elements, if any. */\n                            if ($this->elementInScope('nobr')) {\n                                $this->emitToken([\n                                    'name' => 'nobr',\n                                    'type' => HTML5_Tokenizer::ENDTAG,\n                                ]);\n                                $this->reconstructActiveFormattingElements();\n                            }\n\n                            /* Insert an HTML element for the token. */\n                            $el = $this->insertElement($token);\n\n                            /* Add that element to the list of active formatting\n                            elements. */\n                            $this->a_formatting[] = $el;\n                        break;\n\n                        // another diversion\n\n                        /* A start tag token whose tag name is \"button\" */\n                        case 'button':\n                            /* If the stack of open elements has a button element in scope,\n                            then this is a parse error; act as if an end tag with the tag\n                            name \"button\" had been seen, then reprocess the token. (We don't\n                            do that. Unnecessary.) (I hope you're right! -- ezyang) */\n                            if ($this->elementInScope('button')) {\n                                $this->emitToken([\n                                    'name' => 'button',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            /* Insert a marker at the end of the list of active\n                            formatting elements. */\n                            $this->a_formatting[] = self::MARKER;\n\n                            $this->flag_frameset_ok = false;\n                        break;\n\n                        case 'applet': case 'marquee': case 'object':\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            /* Insert a marker at the end of the list of active\n                            formatting elements. */\n                            $this->a_formatting[] = self::MARKER;\n\n                            $this->flag_frameset_ok = false;\n                        break;\n\n                        // spec diversion\n\n                        /* A start tag whose tag name is \"table\" */\n                        case 'table':\n                            /* If the Document is not set to quirks mode, and the\n                             * stack of open elements has a p element in scope, then\n                             * act as if an end tag with the tag name \"p\" had been\n                             * seen. */\n                            if ($this->quirks_mode !== self::QUIRKS_MODE &&\n                            $this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            $this->flag_frameset_ok = false;\n\n                            /* Change the insertion mode to \"in table\". */\n                            $this->mode = self::IN_TABLE;\n                        break;\n\n                        /* A start tag whose tag name is one of: \"area\", \"basefont\",\n                        \"bgsound\", \"br\", \"embed\", \"img\", \"param\", \"spacer\", \"wbr\" */\n                        case 'area': case 'basefont': case 'bgsound': case 'br':\n                        case 'embed': case 'img': case 'input': case 'keygen': case 'spacer':\n                        case 'wbr':\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            /* Immediately pop the current node off the stack of open elements. */\n                            array_pop($this->stack);\n\n                            // YYY: Acknowledge the token's self-closing flag, if it is set.\n\n                            $this->flag_frameset_ok = false;\n                        break;\n\n                        case 'param': case 'source':\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            /* Immediately pop the current node off the stack of open elements. */\n                            array_pop($this->stack);\n\n                            // YYY: Acknowledge the token's self-closing flag, if it is set.\n                        break;\n\n                        /* A start tag whose tag name is \"hr\" */\n                        case 'hr':\n                            /* If the stack of open elements has a p element in scope,\n                            then act as if an end tag with the tag name p had been seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            /* Immediately pop the current node off the stack of open elements. */\n                            array_pop($this->stack);\n\n                            // YYY: Acknowledge the token's self-closing flag, if it is set.\n\n                            $this->flag_frameset_ok = false;\n                        break;\n\n                        /* A start tag whose tag name is \"image\" */\n                        case 'image':\n                            /* Parse error. Change the token's tag name to \"img\" and\n                            reprocess it. (Don't ask.) */\n                            $token['name'] = 'img';\n                            $this->emitToken($token);\n                        break;\n\n                        /* A start tag whose tag name is \"isindex\" */\n                        case 'isindex':\n                            /* Parse error. */\n\n                            /* If the form element pointer is not null,\n                            then ignore the token. */\n                            if ($this->form_pointer === null) {\n                                /* Act as if a start tag token with the tag name \"form\" had\n                                been seen. */\n                                /* If the token has an attribute called \"action\", set\n                                 * the action attribute on the resulting form\n                                 * element to the value of the \"action\" attribute of\n                                 * the token. */\n                                $attr = [];\n                                $action = $this->getAttr($token, 'action');\n                                if ($action !== false) {\n                                    $attr[] = ['name' => 'action', 'value' => $action];\n                                }\n                                $this->emitToken([\n                                    'name' => 'form',\n                                    'type' => HTML5_Tokenizer::STARTTAG,\n                                    'attr' => $attr\n                                ]);\n\n                                /* Act as if a start tag token with the tag name \"hr\" had\n                                been seen. */\n                                $this->emitToken([\n                                    'name' => 'hr',\n                                    'type' => HTML5_Tokenizer::STARTTAG,\n                                    'attr' => []\n                                ]);\n\n                                /* Act as if a start tag token with the tag name \"label\"\n                                had been seen. */\n                                $this->emitToken([\n                                    'name' => 'label',\n                                    'type' => HTML5_Tokenizer::STARTTAG,\n                                    'attr' => []\n                                ]);\n\n                                /* Act as if a stream of character tokens had been seen. */\n                                $prompt = $this->getAttr($token, 'prompt');\n                                if ($prompt === false) {\n                                    $prompt = 'This is a searchable index. '.\n                                    'Insert your search keywords here: ';\n                                }\n                                $this->emitToken([\n                                    'data' => $prompt,\n                                    'type' => HTML5_Tokenizer::CHARACTER,\n                                ]);\n\n                                /* Act as if a start tag token with the tag name \"input\"\n                                had been seen, with all the attributes from the \"isindex\"\n                                token, except with the \"name\" attribute set to the value\n                                \"isindex\" (ignoring any explicit \"name\" attribute). */\n                                $attr = [];\n                                foreach ($token['attr'] as $keypair) {\n                                    if ($keypair['name'] === 'name' || $keypair['name'] === 'action' ||\n                                        $keypair['name'] === 'prompt') {\n                                        continue;\n                                    }\n                                    $attr[] = $keypair;\n                                }\n                                $attr[] = ['name' => 'name', 'value' => 'isindex'];\n\n                                $this->emitToken([\n                                    'name' => 'input',\n                                    'type' => HTML5_Tokenizer::STARTTAG,\n                                    'attr' => $attr\n                                ]);\n\n                                /* Act as if an end tag token with the tag name \"label\"\n                                had been seen. */\n                                $this->emitToken([\n                                    'name' => 'label',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n\n                                /* Act as if a start tag token with the tag name \"hr\" had\n                                been seen. */\n                                $this->emitToken([\n                                    'name' => 'hr',\n                                    'type' => HTML5_Tokenizer::STARTTAG\n                                ]);\n\n                                /* Act as if an end tag token with the tag name \"form\" had\n                                been seen. */\n                                $this->emitToken([\n                                    'name' => 'form',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            } else {\n                                $this->ignored = true;\n                            }\n                        break;\n\n                        /* A start tag whose tag name is \"textarea\" */\n                        case 'textarea':\n                            $this->insertElement($token);\n\n                            /* If the next token is a U+000A LINE FEED (LF)\n                             * character token, then ignore that token and move on to\n                             * the next one. (Newlines at the start of textarea\n                             * elements are ignored as an authoring convenience.)\n                             * need flag, see also <pre> */\n                            $this->ignore_lf_token = 2;\n\n                            $this->original_mode = $this->mode;\n                            $this->flag_frameset_ok = false;\n                            $this->mode = self::IN_CDATA_RCDATA;\n\n                            /* Switch the tokeniser's content model flag to the\n                            RCDATA state. */\n                            $this->content_model = HTML5_Tokenizer::RCDATA;\n                        break;\n\n                        /* A start tag token whose tag name is \"xmp\" */\n                        case 'xmp':\n                            /* If the stack of open elements has a p element in\n                            scope, then act as if an end tag with the tag name\n                            \"p\" has been seen. */\n                            if ($this->elementInScope('p')) {\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::ENDTAG\n                                ]);\n                            }\n\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            $this->flag_frameset_ok = false;\n\n                            $this->insertCDATAElement($token);\n                        break;\n\n                        case 'iframe':\n                            $this->flag_frameset_ok = false;\n                            $this->insertCDATAElement($token);\n                        break;\n\n                        case 'noembed': case 'noscript':\n                            // XSCRIPT: should check scripting flag\n                            $this->insertCDATAElement($token);\n                        break;\n\n                        /* A start tag whose tag name is \"select\" */\n                        case 'select':\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            /* Insert an HTML element for the token. */\n                            $this->insertElement($token);\n\n                            $this->flag_frameset_ok = false;\n\n                            /* If the insertion mode is one of in table\", \"in caption\",\n                             * \"in column group\", \"in table body\", \"in row\", or \"in\n                             * cell\", then switch the insertion mode to \"in select in\n                             * table\". Otherwise, switch the insertion mode  to \"in\n                             * select\". */\n                            if (\n                                $this->mode === self::IN_TABLE || $this->mode === self::IN_CAPTION ||\n                                $this->mode === self::IN_COLUMN_GROUP || $this->mode ==+self::IN_TABLE_BODY ||\n                                $this->mode === self::IN_ROW || $this->mode === self::IN_CELL\n                            ) {\n                                $this->mode = self::IN_SELECT_IN_TABLE;\n                            } else {\n                                $this->mode = self::IN_SELECT;\n                            }\n                        break;\n\n                        case 'option': case 'optgroup':\n                            if ($this->elementInScope('option')) {\n                                $this->emitToken([\n                                    'name' => 'option',\n                                    'type' => HTML5_Tokenizer::ENDTAG,\n                                ]);\n                            }\n                            $this->reconstructActiveFormattingElements();\n                            $this->insertElement($token);\n                        break;\n\n                        case 'rp': case 'rt':\n                            /* If the stack of open elements has a ruby element in scope, then generate\n                             * implied end tags. If the current node is not then a ruby element, this is\n                             * a parse error; pop all the nodes from the current node up to the node\n                             * immediately before the bottommost ruby element on the stack of open elements.\n                             */\n                            if ($this->elementInScope('ruby')) {\n                                $this->generateImpliedEndTags();\n                            }\n                            $peek = false;\n                            do {\n                                /*if ($peek) {\n                                    // parse error\n                                }*/\n                                $peek = array_pop($this->stack);\n                            } while ($peek->tagName !== 'ruby');\n                            $this->stack[] = $peek; // we popped one too many\n                            $this->insertElement($token);\n                        break;\n\n                        // spec diversion\n\n                        case 'math':\n                            $this->reconstructActiveFormattingElements();\n                            $token = $this->adjustMathMLAttributes($token);\n                            $token = $this->adjustForeignAttributes($token);\n                            $this->insertForeignElement($token, self::NS_MATHML);\n                            if (isset($token['self-closing'])) {\n                                // XERROR: acknowledge the token's self-closing flag\n                                array_pop($this->stack);\n                            }\n                            if ($this->mode !== self::IN_FOREIGN_CONTENT) {\n                                $this->secondary_mode = $this->mode;\n                                $this->mode = self::IN_FOREIGN_CONTENT;\n                            }\n                        break;\n\n                        case 'svg':\n                            $this->reconstructActiveFormattingElements();\n                            $token = $this->adjustSVGAttributes($token);\n                            $token = $this->adjustForeignAttributes($token);\n                            $this->insertForeignElement($token, self::NS_SVG);\n                            if (isset($token['self-closing'])) {\n                                // XERROR: acknowledge the token's self-closing flag\n                                array_pop($this->stack);\n                            }\n                            if ($this->mode !== self::IN_FOREIGN_CONTENT) {\n                                $this->secondary_mode = $this->mode;\n                                $this->mode = self::IN_FOREIGN_CONTENT;\n                            }\n                        break;\n\n                        case 'caption': case 'col': case 'colgroup': case 'frame': case 'head':\n                        case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': case 'tr':\n                            // parse error\n                        break;\n\n                        /* A start tag token not covered by the previous entries */\n                        default:\n                            /* Reconstruct the active formatting elements, if any. */\n                            $this->reconstructActiveFormattingElements();\n\n                            $this->insertElement($token);\n                            /* This element will be a phrasing  element. */\n                        break;\n                    }\n                    break;\n\n                    case HTML5_Tokenizer::ENDTAG:\n                    switch ($token['name']) {\n                        /* An end tag with the tag name \"body\" */\n                        case 'body':\n                            /* If the stack of open elements does not have a body\n                             * element in scope, this is a parse error; ignore the\n                             * token. */\n                            if (!$this->elementInScope('body')) {\n                                $this->ignored = true;\n\n                            /* Otherwise, if there is a node in the stack of open\n                             * elements that is not either a dc element, a dd element,\n                             * a ds element, a dt element, an li element, an optgroup\n                             * element, an option element, a p element, an rp element,\n                             * an rt element, a tbody element, a td element, a tfoot\n                             * element, a th element, a thead element, a tr element,\n                             * the body element, or the html element, then this is a\n                             * parse error.\n                             */\n                            } else {\n                                // XERROR: implement this check for parse error\n                            }\n\n                            /* Change the insertion mode to \"after body\". */\n                            $this->mode = self::AFTER_BODY;\n                        break;\n\n                        /* An end tag with the tag name \"html\" */\n                        case 'html':\n                            /* Act as if an end tag with tag name \"body\" had been seen,\n                            then, if that token wasn't ignored, reprocess the current\n                            token. */\n                            $this->emitToken([\n                                'name' => 'body',\n                                'type' => HTML5_Tokenizer::ENDTAG\n                            ]);\n\n                            if (!$this->ignored) {\n                                $this->emitToken($token);\n                            }\n                        break;\n\n                        case 'address': case 'article': case 'aside': case 'blockquote':\n                        case 'center': case 'datagrid': case 'details': case 'dir':\n                        case 'div': case 'dl': case 'fieldset': case 'footer':\n                        case 'header': case 'hgroup': case 'listing': case 'menu':\n                        case 'nav': case 'ol': case 'pre': case 'section': case 'ul':\n                            /* If the stack of open elements has an element in scope\n                            with the same tag name as that of the token, then generate\n                            implied end tags. */\n                            if ($this->elementInScope($token['name'])) {\n                                $this->generateImpliedEndTags();\n\n                                /* Now, if the current node is not an element with\n                                the same tag name as that of the token, then this\n                                is a parse error. */\n                                // XERROR: implement parse error logic\n\n                                /* If the stack of open elements has an element in\n                                scope with the same tag name as that of the token,\n                                then pop elements from this stack until an element\n                                with that tag name has been popped from the stack. */\n                                do {\n                                    $node = array_pop($this->stack);\n                                } while ($node->tagName !== $token['name']);\n                            } else {\n                                // parse error\n                            }\n                        break;\n\n                        /* An end tag whose tag name is \"form\" */\n                        case 'form':\n                            /* Let node be the element that the form element pointer is set to. */\n                            $node = $this->form_pointer;\n                            /* Set the form element pointer  to null. */\n                            $this->form_pointer = null;\n                            /* If node is null or the stack of open elements does not\n                                * have node in scope, then this is a parse error; ignore the token. */\n                            if ($node === null || !in_array($node, $this->stack)) {\n                                // parse error\n                                $this->ignored = true;\n                            } else {\n                                /* 1. Generate implied end tags. */\n                                $this->generateImpliedEndTags();\n                                /* 2. If the current node is not node, then this is a parse error.  */\n                                if (end($this->stack) !== $node) {\n                                    // parse error\n                                }\n                                /* 3. Remove node from the stack of open elements. */\n                                array_splice($this->stack, array_search($node, $this->stack, true), 1);\n                            }\n\n                        break;\n\n                        /* An end tag whose tag name is \"p\" */\n                        case 'p':\n                            /* If the stack of open elements has a p element in scope,\n                            then generate implied end tags, except for p elements. */\n                            if ($this->elementInScope('p')) {\n                                /* Generate implied end tags, except for elements with\n                                 * the same tag name as the token. */\n                                $this->generateImpliedEndTags(['p']);\n\n                                /* If the current node is not a p element, then this is\n                                a parse error. */\n                                // XERROR: implement\n\n                                /* Pop elements from the stack of open elements  until\n                                 * an element with the same tag name as the token has\n                                 * been popped from the stack. */\n                                do {\n                                    $node = array_pop($this->stack);\n                                } while ($node->tagName !== 'p');\n\n                            } else {\n                                // parse error\n                                $this->emitToken([\n                                    'name' => 'p',\n                                    'type' => HTML5_Tokenizer::STARTTAG,\n                                ]);\n                                $this->emitToken($token);\n                            }\n                        break;\n\n                        /* An end tag whose tag name is \"li\" */\n                        case 'li':\n                            /* If the stack of open elements does not have an element\n                             * in list item scope with the same tag name as that of the\n                             * token, then this is a parse error; ignore the token. */\n                            if ($this->elementInScope($token['name'], self::SCOPE_LISTITEM)) {\n                                /* Generate implied end tags, except for elements with the\n                                 * same tag name as the token. */\n                                $this->generateImpliedEndTags([$token['name']]);\n                                /* If the current node is not an element with the same tag\n                                 * name as that of the token, then this is a parse error. */\n                                // XERROR: parse error\n                                /* Pop elements from the stack of open elements  until an\n                                 * element with the same tag name as the token has been\n                                 * popped from the stack. */\n                                do {\n                                    $node = array_pop($this->stack);\n                                } while ($node->tagName !== $token['name']);\n                            }\n                            /*else {\n                                // XERROR: parse error\n                            }*/\n                        break;\n\n                        /* An end tag whose tag name is \"dc\", \"dd\", \"ds\", \"dt\" */\n                        case 'dc': case 'dd': case 'ds': case 'dt':\n                            if ($this->elementInScope($token['name'])) {\n                                $this->generateImpliedEndTags([$token['name']]);\n\n                                /* If the current node is not an element with the same\n                                tag name as the token, then this is a parse error. */\n                                // XERROR: implement parse error\n\n                                /* Pop elements from the stack of open elements  until\n                                 * an element with the same tag name as the token has\n                                 * been popped from the stack. */\n                                do {\n                                    $node = array_pop($this->stack);\n                                } while ($node->tagName !== $token['name']);\n                            }\n                            /*else {\n                                // XERROR: parse error\n                            }*/\n                        break;\n\n                        /* An end tag whose tag name is one of: \"h1\", \"h2\", \"h3\", \"h4\",\n                        \"h5\", \"h6\" */\n                        case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':\n                            $elements = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n                            /* If the stack of open elements has in scope an element whose\n                            tag name is one of \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", or \"h6\", then\n                            generate implied end tags. */\n                            if ($this->elementInScope($elements)) {\n                                $this->generateImpliedEndTags();\n\n                                /* Now, if the current node is not an element with the same\n                                tag name as that of the token, then this is a parse error. */\n                                // XERROR: implement parse error\n\n                                /* If the stack of open elements has in scope an element\n                                whose tag name is one of \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", or\n                                \"h6\", then pop elements from the stack until an element\n                                with one of those tag names has been popped from the stack. */\n                                do {\n                                    $node = array_pop($this->stack);\n                                } while (!in_array($node->tagName, $elements));\n                            }\n                            /*else {\n                                // parse error\n                            }*/\n                        break;\n\n                        /* An end tag whose tag name is one of: \"a\", \"b\", \"big\", \"em\",\n                        \"font\", \"i\", \"nobr\", \"s\", \"small\", \"strike\", \"strong\", \"tt\", \"u\" */\n                        case 'a': case 'b': case 'big': case 'code': case 'em': case 'font':\n                        case 'i': case 'nobr': case 's': case 'small': case 'strike':\n                        case 'strong': case 'tt': case 'u':\n                            // XERROR: generally speaking this needs parse error logic\n                            /* 1. Let the formatting element be the last element in\n                            the list of active formatting elements that:\n                                * is between the end of the list and the last scope\n                                marker in the list, if any, or the start of the list\n                                otherwise, and\n                                * has the same tag name as the token.\n                            */\n                            while (true) {\n                                for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {\n                                    if ($this->a_formatting[$a] === self::MARKER) {\n                                        break;\n                                    } elseif ($this->a_formatting[$a]->tagName === $token['name']) {\n                                        $formatting_element = $this->a_formatting[$a];\n                                        $in_stack = in_array($formatting_element, $this->stack, true);\n                                        $fe_af_pos = $a;\n                                        break;\n                                    }\n                                }\n\n                                /* If there is no such node, or, if that node is\n                                also in the stack of open elements but the element\n                                is not in scope, then this is a parse error. Abort\n                                these steps. The token is ignored. */\n                                if (\n                                    !isset($formatting_element) || (\n                                        $in_stack &&\n                                        !$this->elementInScope($token['name'])\n                                    )\n                                ) {\n                                    $this->ignored = true;\n                                    break;\n\n                                /* Otherwise, if there is such a node, but that node\n                                is not in the stack of open elements, then this is a\n                                parse error; remove the element from the list, and\n                                abort these steps. */\n                                } elseif (isset($formatting_element) && !$in_stack) {\n                                    unset($this->a_formatting[$fe_af_pos]);\n                                    $this->a_formatting = array_merge($this->a_formatting);\n                                    break;\n                                }\n\n                                /* Otherwise, there is a formatting element and that\n                                 * element is in the stack and is in scope. If the\n                                 * element is not the current node, this is a parse\n                                 * error. In any case, proceed with the algorithm as\n                                 * written in the following steps. */\n                                // XERROR: implement me\n\n                                /* 2. Let the furthest block be the topmost node in the\n                                stack of open elements that is lower in the stack\n                                than the formatting element, and is not an element in\n                                the phrasing or formatting categories. There might\n                                not be one. */\n                                $fe_s_pos = array_search($formatting_element, $this->stack, true);\n                                $length = count($this->stack);\n\n                                for ($s = $fe_s_pos + 1; $s < $length; $s++) {\n                                    $category = $this->getElementCategory($this->stack[$s]);\n\n                                    if ($category !== self::PHRASING && $category !== self::FORMATTING) {\n                                        $furthest_block = $this->stack[$s];\n                                        break;\n                                    }\n                                }\n\n                                /* 3. If there is no furthest block, then the UA must\n                                skip the subsequent steps and instead just pop all\n                                the nodes from the bottom of the stack of open\n                                elements, from the current node up to the formatting\n                                element, and remove the formatting element from the\n                                list of active formatting elements. */\n                                if (!isset($furthest_block)) {\n                                    for ($n = $length - 1; $n >= $fe_s_pos; $n--) {\n                                        array_pop($this->stack);\n                                    }\n\n                                    unset($this->a_formatting[$fe_af_pos]);\n                                    $this->a_formatting = array_merge($this->a_formatting);\n                                    break;\n                                }\n\n                                /* 4. Let the common ancestor be the element\n                                immediately above the formatting element in the stack\n                                of open elements. */\n                                $common_ancestor = $this->stack[$fe_s_pos - 1];\n\n                                /* 5. Let a bookmark note the position of the\n                                formatting element in the list of active formatting\n                                elements relative to the elements on either side\n                                of it in the list. */\n                                $bookmark = $fe_af_pos;\n\n                                /* 6. Let node and last node  be the furthest block.\n                                Follow these steps: */\n                                $node = $furthest_block;\n                                $last_node = $furthest_block;\n\n                                while (true) {\n                                    for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {\n                                        /* 6.1 Let node be the element immediately\n                                        prior to node in the stack of open elements. */\n                                        $node = $this->stack[$n];\n\n                                        /* 6.2 If node is not in the list of active\n                                        formatting elements, then remove node from\n                                        the stack of open elements and then go back\n                                        to step 1. */\n                                        if (!in_array($node, $this->a_formatting, true)) {\n                                            array_splice($this->stack, $n, 1);\n                                        } else {\n                                            break;\n                                        }\n                                    }\n\n                                    /* 6.3 Otherwise, if node is the formatting\n                                    element, then go to the next step in the overall\n                                    algorithm. */\n                                    if ($node === $formatting_element) {\n                                        break;\n\n                                    /* 6.4 Otherwise, if last node is the furthest\n                                    block, then move the aforementioned bookmark to\n                                    be immediately after the node in the list of\n                                    active formatting elements. */\n                                    } elseif ($last_node === $furthest_block) {\n                                        $bookmark = array_search($node, $this->a_formatting, true) + 1;\n                                    }\n\n                                    /* 6.5 Create an element for the token for which\n                                     * the element node was created, replace the entry\n                                     * for node in the list of active formatting\n                                     * elements with an entry for the new element,\n                                     * replace the entry for node in the stack of open\n                                     * elements with an entry for the new element, and\n                                     * let node be the new element. */\n                                    // we don't know what the token is anymore\n                                    // XDOM\n                                    $clone = $node->cloneNode();\n                                    $a_pos = array_search($node, $this->a_formatting, true);\n                                    $s_pos = array_search($node, $this->stack, true);\n                                    $this->a_formatting[$a_pos] = $clone;\n                                    $this->stack[$s_pos] = $clone;\n                                    $node = $clone;\n\n                                    /* 6.6 Insert last node into node, first removing\n                                    it from its previous parent node if any. */\n                                    // XDOM\n                                    if ($last_node->parentNode !== null) {\n                                        $last_node->parentNode->removeChild($last_node);\n                                    }\n\n                                    // XDOM\n                                    $node->appendChild($last_node);\n\n                                    /* 6.7 Let last node be node. */\n                                    $last_node = $node;\n\n                                    /* 6.8 Return to step 1 of this inner set of steps. */\n                                }\n\n                                /* 7. If the common ancestor node is a table, tbody,\n                                 * tfoot, thead, or tr element, then, foster parent\n                                 * whatever last node ended up being in the previous\n                                 * step, first removing it from its previous parent\n                                 * node if any. */\n                                // XDOM\n                                if ($last_node->parentNode) { // common step\n                                    $last_node->parentNode->removeChild($last_node);\n                                }\n                                if (in_array($common_ancestor->tagName, ['table', 'tbody', 'tfoot', 'thead', 'tr'])) {\n                                    $this->fosterParent($last_node);\n                                /* Otherwise, append whatever last node  ended up being\n                                 * in the previous step to the common ancestor node,\n                                 * first removing it from its previous parent node if\n                                 * any. */\n                                } else {\n                                    // XDOM\n                                    $common_ancestor->appendChild($last_node);\n                                }\n\n                                /* 8. Create an element for the token for which the\n                                 * formatting element was created. */\n                                // XDOM\n                                $clone = $formatting_element->cloneNode();\n\n                                /* 9. Take all of the child nodes of the furthest\n                                block and append them to the element created in the\n                                last step. */\n                                // XDOM\n                                while ($furthest_block->hasChildNodes()) {\n                                    $child = $furthest_block->firstChild;\n                                    $furthest_block->removeChild($child);\n                                    $clone->appendChild($child);\n                                }\n\n                                /* 10. Append that clone to the furthest block. */\n                                // XDOM\n                                $furthest_block->appendChild($clone);\n\n                                /* 11. Remove the formatting element from the list\n                                of active formatting elements, and insert the new element\n                                into the list of active formatting elements at the\n                                position of the aforementioned bookmark. */\n                                $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);\n                                array_splice($this->a_formatting, $fe_af_pos, 1);\n\n                                $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);\n                                $af_part2 = array_slice($this->a_formatting, $bookmark);\n                                $this->a_formatting = array_merge($af_part1, [$clone], $af_part2);\n\n                                /* 12. Remove the formatting element from the stack\n                                of open elements, and insert the new element into the stack\n                                of open elements immediately below the position of the\n                                furthest block in that stack. */\n                                $fe_s_pos = array_search($formatting_element, $this->stack, true);\n                                array_splice($this->stack, $fe_s_pos, 1);\n\n                                $fb_s_pos = array_search($furthest_block, $this->stack, true);\n                                $s_part1 = array_slice($this->stack, 0, $fb_s_pos + 1);\n                                $s_part2 = array_slice($this->stack, $fb_s_pos + 1);\n                                $this->stack = array_merge($s_part1, [$clone], $s_part2);\n\n                                /* 13. Jump back to step 1 in this series of steps. */\n                                unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);\n                            }\n                        break;\n\n                        case 'applet': case 'button': case 'marquee': case 'object':\n                            /* If the stack of open elements has an element in scope whose\n                            tag name matches the tag name of the token, then generate implied\n                            tags. */\n                            if ($this->elementInScope($token['name'])) {\n                                $this->generateImpliedEndTags();\n\n                                /* Now, if the current node is not an element with the same\n                                tag name as the token, then this is a parse error. */\n                                // XERROR: implement logic\n\n                                /* Pop elements from the stack of open elements  until\n                                 * an element with the same tag name as the token has\n                                 * been popped from the stack. */\n                                do {\n                                    $node = array_pop($this->stack);\n                                } while ($node->tagName !== $token['name']);\n\n                                /* Clear the list of active formatting elements up to the\n                                 * last marker. */\n                                $keys = array_keys($this->a_formatting, self::MARKER, true);\n                                $marker = end($keys);\n\n                                for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {\n                                    array_pop($this->a_formatting);\n                                }\n                            }\n                            /*else {\n                                // parse error\n                            }*/\n                        break;\n\n                        case 'br':\n                            // Parse error\n                            $this->emitToken([\n                                'name' => 'br',\n                                'type' => HTML5_Tokenizer::STARTTAG,\n                            ]);\n                        break;\n\n                        /* An end tag token not covered by the previous entries */\n                        default:\n                            for ($n = count($this->stack) - 1; $n >= 0; $n--) {\n                                /* Initialise node to be the current node (the bottommost\n                                node of the stack). */\n                                $node = $this->stack[$n];\n\n                                /* If node has the same tag name as the end tag token,\n                                then: */\n                                if ($token['name'] === $node->tagName) {\n                                    /* Generate implied end tags. */\n                                    $this->generateImpliedEndTags();\n\n                                    /* If the tag name of the end tag token does not\n                                    match the tag name of the current node, this is a\n                                    parse error. */\n                                    // XERROR: implement this\n\n                                    /* Pop all the nodes from the current node up to\n                                    node, including node, then stop these steps. */\n                                    // XSKETCHY\n                                    do {\n                                        $pop = array_pop($this->stack);\n                                    } while ($pop !== $node);\n                                    break;\n                                } else {\n                                    $category = $this->getElementCategory($node);\n\n                                    if ($category !== self::FORMATTING && $category !== self::PHRASING) {\n                                        /* Otherwise, if node is in neither the formatting\n                                        category nor the phrasing category, then this is a\n                                        parse error. Stop this algorithm. The end tag token\n                                        is ignored. */\n                                        $this->ignored = true;\n                                        break;\n                                        // parse error\n                                    }\n                                }\n                                /* Set node to the previous entry in the stack of open elements. Loop. */\n                            }\n                        break;\n                    }\n                    break;\n                }\n                break;\n\n            case self::IN_CDATA_RCDATA:\n                if (\n                    $token['type'] === HTML5_Tokenizer::CHARACTER ||\n                    $token['type'] === HTML5_Tokenizer::SPACECHARACTER\n                ) {\n                    $this->insertText($token['data']);\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    // parse error\n                    /* If the current node is a script  element, mark the script\n                     * element as \"already executed\". */\n                    // probably not necessary\n                    array_pop($this->stack);\n                    $this->mode = $this->original_mode;\n                    $this->emitToken($token);\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'script') {\n                    array_pop($this->stack);\n                    $this->mode = $this->original_mode;\n                    // we're ignoring all of the execution stuff\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) {\n                    array_pop($this->stack);\n                    $this->mode = $this->original_mode;\n                }\n            break;\n\n            case self::IN_TABLE:\n                $clear = ['html', 'table'];\n\n                /* A character token */\n                if ($token['type'] === HTML5_Tokenizer::CHARACTER ||\n                    $token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Let the pending table character tokens\n                     * be an empty list of tokens. */\n                    $this->pendingTableCharacters = \"\";\n                    $this->pendingTableCharactersDirty = false;\n                    /* Let the original insertion mode be the current\n                     * insertion mode. */\n                    $this->original_mode = $this->mode;\n                    /* Switch the insertion mode to\n                     * \"in table text\" and\n                     * reprocess the token. */\n                    $this->mode = self::IN_TABLE_TEXT;\n                    $this->emitToken($token);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data\n                    attribute set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n\n                /* A start tag whose tag name is \"caption\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'caption') {\n                    /* Clear the stack back to a table context. */\n                    $this->clearStackToTableContext($clear);\n\n                    /* Insert a marker at the end of the list of active\n                    formatting elements. */\n                    $this->a_formatting[] = self::MARKER;\n\n                    /* Insert an HTML element for the token, then switch the\n                    insertion mode to \"in caption\". */\n                    $this->insertElement($token);\n                    $this->mode = self::IN_CAPTION;\n\n                /* A start tag whose tag name is \"colgroup\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'colgroup') {\n                    /* Clear the stack back to a table context. */\n                    $this->clearStackToTableContext($clear);\n\n                    /* Insert an HTML element for the token, then switch the\n                    insertion mode to \"in column group\". */\n                    $this->insertElement($token);\n                    $this->mode = self::IN_COLUMN_GROUP;\n\n                /* A start tag whose tag name is \"col\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'col') {\n                    $this->emitToken([\n                        'name' => 'colgroup',\n                        'type' => HTML5_Tokenizer::STARTTAG,\n                        'attr' => []\n                    ]);\n\n                    $this->emitToken($token);\n\n                /* A start tag whose tag name is one of: \"tbody\", \"tfoot\", \"thead\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],\n                ['tbody', 'tfoot', 'thead'])) {\n                    /* Clear the stack back to a table context. */\n                    $this->clearStackToTableContext($clear);\n\n                    /* Insert an HTML element for the token, then switch the insertion\n                    mode to \"in table body\". */\n                    $this->insertElement($token);\n                    $this->mode = self::IN_TABLE_BODY;\n\n                /* A start tag whose tag name is one of: \"td\", \"th\", \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                in_array($token['name'], ['td', 'th', 'tr'])) {\n                    /* Act as if a start tag token with the tag name \"tbody\" had been\n                    seen, then reprocess the current token. */\n                    $this->emitToken([\n                        'name' => 'tbody',\n                        'type' => HTML5_Tokenizer::STARTTAG,\n                        'attr' => []\n                    ]);\n\n                    $this->emitToken($token);\n\n                /* A start tag whose tag name is \"table\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'table') {\n                    /* Parse error. Act as if an end tag token with the tag name \"table\"\n                    had been seen, then, if that token wasn't ignored, reprocess the\n                    current token. */\n                    $this->emitToken([\n                        'name' => 'table',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n\n                    if (!$this->ignored) {\n                        $this->emitToken($token);\n                    }\n\n                /* An end tag whose tag name is \"table\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'table') {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as the token, this is a parse error.\n                    Ignore the token. (fragment case) */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        $this->ignored = true;\n                    } else {\n                        do {\n                            $node = array_pop($this->stack);\n                        } while ($node->tagName !== 'table');\n\n                        /* Reset the insertion mode appropriately. */\n                        $this->resetInsertionMode();\n                    }\n\n                /* An end tag whose tag name is one of: \"body\", \"caption\", \"col\",\n                \"colgroup\", \"html\", \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],\n                ['body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td',\n                'tfoot', 'th', 'thead', 'tr'])) {\n                    // Parse error. Ignore the token.\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                ($token['name'] === 'style' || $token['name'] === 'script')) {\n                    $this->processWithRulesFor($token, self::IN_HEAD);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'input' &&\n                // assignment is intentional\n                /* If the token does not have an attribute with the name \"type\", or\n                 * if it does, but that attribute's value is not an ASCII\n                 * case-insensitive match for the string \"hidden\", then: act as\n                 * described in the \"anything else\" entry below. */\n                ($type = $this->getAttr($token, 'type')) && strtolower($type) === 'hidden') {\n                    // I.e., if its an input with the type attribute == 'hidden'\n                    /* Otherwise */\n                    // parse error\n                    $this->insertElement($token);\n                    array_pop($this->stack);\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    /* If the current node is not the root html element, then this is a parse error. */\n                    if (end($this->stack)->tagName !== 'html') {\n                        // Note: It can only be the current node in the fragment case.\n                        // parse error\n                    }\n                    /* Stop parsing. */\n                /* Anything else */\n                } else {\n                    /* Parse error. Process the token as if the insertion mode was \"in\n                    body\", with the following exception: */\n\n                    $old = $this->foster_parent;\n                    $this->foster_parent = true;\n                    $this->processWithRulesFor($token, self::IN_BODY);\n                    $this->foster_parent = $old;\n                }\n            break;\n\n            case self::IN_TABLE_TEXT:\n                /* A character token */\n                if ($token['type'] === HTML5_Tokenizer::CHARACTER) {\n                    /* Append the character token to the pending table\n                     * character tokens list. */\n                    $this->pendingTableCharacters .= $token['data'];\n                    $this->pendingTableCharactersDirty = true;\n                } elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    $this->pendingTableCharacters .= $token['data'];\n                /* Anything else */\n                } else {\n                    if ($this->pendingTableCharacters !== '' && is_string($this->pendingTableCharacters)) {\n                        /* If any of the tokens in the pending table character tokens list\n                         * are character tokens that are not one of U+0009 CHARACTER\n                         * TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), or\n                         * U+0020 SPACE, then reprocess those character tokens using the\n                         * rules given in the \"anything else\" entry in the in table\"\n                         * insertion mode.*/\n                        if ($this->pendingTableCharactersDirty) {\n                            /* Parse error. Process the token using the rules for the\n                             * \"in body\" insertion mode, except that if the current\n                             * node is a table, tbody, tfoot, thead, or tr element,\n                             * then, whenever a node would be inserted into the current\n                             * node, it must instead be foster parented. */\n                            // XERROR\n                            $old = $this->foster_parent;\n                            $this->foster_parent = true;\n                            $text_token = [\n                                'type' => HTML5_Tokenizer::CHARACTER,\n                                'data' => $this->pendingTableCharacters,\n                            ];\n                            $this->processWithRulesFor($text_token, self::IN_BODY);\n                            $this->foster_parent = $old;\n\n                        /* Otherwise, insert the characters given by the pending table\n                         * character tokens list into the current node. */\n                        } else {\n                            $this->insertText($this->pendingTableCharacters);\n                        }\n                        $this->pendingTableCharacters = null;\n                        $this->pendingTableCharactersNull = null;\n                    }\n\n                    /* Switch the insertion mode to the original insertion mode and\n                     * reprocess the token.\n                     */\n                    $this->mode = $this->original_mode;\n                    $this->emitToken($token);\n                }\n            break;\n\n            case self::IN_CAPTION:\n                /* An end tag whose tag name is \"caption\" */\n                if ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'caption') {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as the token, this is a parse error.\n                    Ignore the token. (fragment case) */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        $this->ignored = true;\n                        // Ignore\n\n                    /* Otherwise: */\n                    } else {\n                        /* Generate implied end tags. */\n                        $this->generateImpliedEndTags();\n\n                        /* Now, if the current node is not a caption element, then this\n                        is a parse error. */\n                        // XERROR: implement\n\n                        /* Pop elements from this stack until a caption element has\n                        been popped from the stack. */\n                        do {\n                            $node = array_pop($this->stack);\n                        } while ($node->tagName !== 'caption');\n\n                        /* Clear the list of active formatting elements up to the last\n                        marker. */\n                        $this->clearTheActiveFormattingElementsUpToTheLastMarker();\n\n                        /* Switch the insertion mode to \"in table\". */\n                        $this->mode = self::IN_TABLE;\n                    }\n\n                /* A start tag whose tag name is one of: \"caption\", \"col\", \"colgroup\",\n                \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\", or an end tag whose tag\n                name is \"table\" */\n                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],\n                ['caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',\n                'thead', 'tr'])) || ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'table')) {\n                    /* Parse error. Act as if an end tag with the tag name \"caption\"\n                    had been seen, then, if that token wasn't ignored, reprocess the\n                    current token. */\n                    $this->emitToken([\n                        'name' => 'caption',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n\n                    if (!$this->ignored) {\n                        $this->emitToken($token);\n                    }\n\n                /* An end tag whose tag name is one of: \"body\", \"col\", \"colgroup\",\n                \"html\", \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],\n                ['body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th',\n                'thead', 'tr'])) {\n                    // Parse error. Ignore the token.\n                    $this->ignored = true;\n                } else {\n                    /* Process the token as if the insertion mode was \"in body\". */\n                    $this->processWithRulesFor($token, self::IN_BODY);\n                }\n            break;\n\n            case self::IN_COLUMN_GROUP:\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Append the character to the current node. */\n                    $this->insertText($token['data']);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data\n                    attribute set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* A start tag whose tag name is \"col\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'col') {\n                    /* Insert a col element for the token. Immediately pop the current\n                    node off the stack of open elements. */\n                    $this->insertElement($token);\n                    array_pop($this->stack);\n                    // XERROR: Acknowledge the token's self-closing flag, if it is set.\n\n                /* An end tag whose tag name is \"colgroup\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'colgroup') {\n                    /* If the current node is the root html element, then this is a\n                    parse error, ignore the token. (fragment case) */\n                    if (end($this->stack)->tagName === 'html') {\n                        $this->ignored = true;\n\n                    /* Otherwise, pop the current node (which will be a colgroup\n                    element) from the stack of open elements. Switch the insertion\n                    mode to \"in table\". */\n                    } else {\n                        array_pop($this->stack);\n                        $this->mode = self::IN_TABLE;\n                    }\n\n                /* An end tag whose tag name is \"col\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'col') {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n\n                /* An end-of-file token */\n                /* If the current node is the root html  element */\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF && end($this->stack)->tagName === 'html') {\n                    /* Stop parsing */\n\n                /* Anything else */\n                } else {\n                    /* Act as if an end tag with the tag name \"colgroup\" had been seen,\n                    and then, if that token wasn't ignored, reprocess the current token. */\n                    $this->emitToken([\n                        'name' => 'colgroup',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n\n                    if (!$this->ignored) {\n                        $this->emitToken($token);\n                    }\n                }\n            break;\n\n            case self::IN_TABLE_BODY:\n                $clear = ['tbody', 'tfoot', 'thead', 'html'];\n\n                /* A start tag whose tag name is \"tr\" */\n                if ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'tr') {\n                    /* Clear the stack back to a table body context. */\n                    $this->clearStackToTableContext($clear);\n\n                    /* Insert a tr element for the token, then switch the insertion\n                    mode to \"in row\". */\n                    $this->insertElement($token);\n                    $this->mode = self::IN_ROW;\n\n                /* A start tag whose tag name is one of: \"th\", \"td\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                ($token['name'] === 'th' ||    $token['name'] === 'td')) {\n                    /* Parse error. Act as if a start tag with the tag name \"tr\" had\n                    been seen, then reprocess the current token. */\n                    $this->emitToken([\n                        'name' => 'tr',\n                        'type' => HTML5_Tokenizer::STARTTAG,\n                        'attr' => []\n                    ]);\n\n                    $this->emitToken($token);\n\n                /* An end tag whose tag name is one of: \"tbody\", \"tfoot\", \"thead\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                in_array($token['name'], ['tbody', 'tfoot', 'thead'])) {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as the token, this is a parse error.\n                    Ignore the token. */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        // Parse error\n                        $this->ignored = true;\n\n                    /* Otherwise: */\n                    } else {\n                        /* Clear the stack back to a table body context. */\n                        $this->clearStackToTableContext($clear);\n\n                        /* Pop the current node from the stack of open elements. Switch\n                        the insertion mode to \"in table\". */\n                        array_pop($this->stack);\n                        $this->mode = self::IN_TABLE;\n                    }\n\n                /* A start tag whose tag name is one of: \"caption\", \"col\", \"colgroup\",\n                \"tbody\", \"tfoot\", \"thead\", or an end tag whose tag name is \"table\" */\n                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],\n                ['caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead'])) ||\n                ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) {\n                    /* If the stack of open elements does not have a tbody, thead, or\n                    tfoot element in table scope, this is a parse error. Ignore the\n                    token. (fragment case) */\n                    if (!$this->elementInScope(['tbody', 'thead', 'tfoot'], self::SCOPE_TABLE)) {\n                        // parse error\n                        $this->ignored = true;\n\n                    /* Otherwise: */\n                    } else {\n                        /* Clear the stack back to a table body context. */\n                        $this->clearStackToTableContext($clear);\n\n                        /* Act as if an end tag with the same tag name as the current\n                        node (\"tbody\", \"tfoot\", or \"thead\") had been seen, then\n                        reprocess the current token. */\n                        $this->emitToken([\n                            'name' => end($this->stack)->tagName,\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n\n                        $this->emitToken($token);\n                    }\n\n                /* An end tag whose tag name is one of: \"body\", \"caption\", \"col\",\n                \"colgroup\", \"html\", \"td\", \"th\", \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],\n                ['body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'])) {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n\n                /* Anything else */\n                } else {\n                    /* Process the token as if the insertion mode was \"in table\". */\n                    $this->processWithRulesFor($token, self::IN_TABLE);\n                }\n            break;\n\n            case self::IN_ROW:\n                $clear = ['tr', 'html'];\n\n                /* A start tag whose tag name is one of: \"th\", \"td\" */\n                if ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                ($token['name'] === 'th' || $token['name'] === 'td')) {\n                    /* Clear the stack back to a table row context. */\n                    $this->clearStackToTableContext($clear);\n\n                    /* Insert an HTML element for the token, then switch the insertion\n                    mode to \"in cell\". */\n                    $this->insertElement($token);\n                    $this->mode = self::IN_CELL;\n\n                    /* Insert a marker at the end of the list of active formatting\n                    elements. */\n                    $this->a_formatting[] = self::MARKER;\n\n                /* An end tag whose tag name is \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'tr') {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as the token, this is a parse error.\n                    Ignore the token. (fragment case) */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        // Ignore.\n                        $this->ignored = true;\n                    } else {\n                        /* Clear the stack back to a table row context. */\n                        $this->clearStackToTableContext($clear);\n\n                        /* Pop the current node (which will be a tr element) from the\n                        stack of open elements. Switch the insertion mode to \"in table\n                        body\". */\n                        array_pop($this->stack);\n                        $this->mode = self::IN_TABLE_BODY;\n                    }\n\n                /* A start tag whose tag name is one of: \"caption\", \"col\", \"colgroup\",\n                \"tbody\", \"tfoot\", \"thead\", \"tr\" or an end tag whose tag name is \"table\" */\n                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],\n                ['caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'])) ||\n                ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) {\n                    /* Act as if an end tag with the tag name \"tr\" had been seen, then,\n                    if that token wasn't ignored, reprocess the current token. */\n                    $this->emitToken([\n                        'name' => 'tr',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n                    if (!$this->ignored) {\n                        $this->emitToken($token);\n                    }\n\n                /* An end tag whose tag name is one of: \"tbody\", \"tfoot\", \"thead\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                in_array($token['name'], ['tbody', 'tfoot', 'thead'])) {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as the token, this is a parse error.\n                    Ignore the token. */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        $this->ignored = true;\n\n                    /* Otherwise: */\n                    } else {\n                        /* Otherwise, act as if an end tag with the tag name \"tr\" had\n                        been seen, then reprocess the current token. */\n                        $this->emitToken([\n                            'name' => 'tr',\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n\n                        $this->emitToken($token);\n                    }\n\n                /* An end tag whose tag name is one of: \"body\", \"caption\", \"col\",\n                \"colgroup\", \"html\", \"td\", \"th\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],\n                ['body', 'caption', 'col', 'colgroup', 'html', 'td', 'th'])) {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n\n                /* Anything else */\n                } else {\n                    /* Process the token as if the insertion mode was \"in table\". */\n                    $this->processWithRulesFor($token, self::IN_TABLE);\n                }\n            break;\n\n            case self::IN_CELL:\n                /* An end tag whose tag name is one of: \"td\", \"th\" */\n                if ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                ($token['name'] === 'td' || $token['name'] === 'th')) {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as that of the token, then this is a\n                    parse error and the token must be ignored. */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        $this->ignored = true;\n\n                    /* Otherwise: */\n                    } else {\n                        /* Generate implied end tags, except for elements with the same\n                        tag name as the token. */\n                        $this->generateImpliedEndTags([$token['name']]);\n\n                        /* Now, if the current node is not an element with the same tag\n                        name as the token, then this is a parse error. */\n                        // XERROR: Implement parse error code\n\n                        /* Pop elements from this stack until an element with the same\n                        tag name as the token has been popped from the stack. */\n                        do {\n                            $node = array_pop($this->stack);\n                        } while ($node->tagName !== $token['name']);\n\n                        /* Clear the list of active formatting elements up to the last\n                        marker. */\n                        $this->clearTheActiveFormattingElementsUpToTheLastMarker();\n\n                        /* Switch the insertion mode to \"in row\". (The current node\n                        will be a tr element at this point.) */\n                        $this->mode = self::IN_ROW;\n                    }\n\n                /* A start tag whose tag name is one of: \"caption\", \"col\", \"colgroup\",\n                \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],\n                ['caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',\n                'thead', 'tr'])) {\n                    /* If the stack of open elements does not have a td or th element\n                    in table scope, then this is a parse error; ignore the token.\n                    (fragment case) */\n                    if (!$this->elementInScope(['td', 'th'], self::SCOPE_TABLE)) {\n                        // parse error\n                        $this->ignored = true;\n\n                    /* Otherwise, close the cell (see below) and reprocess the current\n                    token. */\n                    } else {\n                        $this->closeCell();\n                        $this->emitToken($token);\n                    }\n\n                /* An end tag whose tag name is one of: \"body\", \"caption\", \"col\",\n                \"colgroup\", \"html\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],\n                ['body', 'caption', 'col', 'colgroup', 'html'])) {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n\n                /* An end tag whose tag name is one of: \"table\", \"tbody\", \"tfoot\",\n                \"thead\", \"tr\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],\n                ['table', 'tbody', 'tfoot', 'thead', 'tr'])) {\n                    /* If the stack of open elements does not have a td or th element\n                    in table scope, then this is a parse error; ignore the token.\n                    (innerHTML case) */\n                    if (!$this->elementInScope(['td', 'th'], self::SCOPE_TABLE)) {\n                        // Parse error\n                        $this->ignored = true;\n\n                    /* Otherwise, close the cell (see below) and reprocess the current\n                    token. */\n                    } else {\n                        $this->closeCell();\n                        $this->emitToken($token);\n                    }\n\n                /* Anything else */\n                } else {\n                    /* Process the token as if the insertion mode was \"in body\". */\n                    $this->processWithRulesFor($token, self::IN_BODY);\n                }\n            break;\n\n            case self::IN_SELECT:\n                /* Handle the token as follows: */\n\n                /* A character token */\n                if (\n                    $token['type'] === HTML5_Tokenizer::CHARACTER ||\n                    $token['type'] === HTML5_Tokenizer::SPACECHARACTER\n                ) {\n                    /* Append the token's character to the current node. */\n                    $this->insertText($token['data']);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data\n                    attribute set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* A start tag token whose tag name is \"option\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'option') {\n                    /* If the current node is an option element, act as if an end tag\n                    with the tag name \"option\" had been seen. */\n                    if (end($this->stack)->tagName === 'option') {\n                        $this->emitToken([\n                            'name' => 'option',\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n                    }\n\n                    /* Insert an HTML element for the token. */\n                    $this->insertElement($token);\n\n                /* A start tag token whose tag name is \"optgroup\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'optgroup') {\n                    /* If the current node is an option element, act as if an end tag\n                    with the tag name \"option\" had been seen. */\n                    if (end($this->stack)->tagName === 'option') {\n                        $this->emitToken([\n                            'name' => 'option',\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n                    }\n\n                    /* If the current node is an optgroup element, act as if an end tag\n                    with the tag name \"optgroup\" had been seen. */\n                    if (end($this->stack)->tagName === 'optgroup') {\n                        $this->emitToken([\n                            'name' => 'optgroup',\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n                    }\n\n                    /* Insert an HTML element for the token. */\n                    $this->insertElement($token);\n\n                /* An end tag token whose tag name is \"optgroup\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'optgroup') {\n                    /* First, if the current node is an option element, and the node\n                    immediately before it in the stack of open elements is an optgroup\n                    element, then act as if an end tag with the tag name \"option\" had\n                    been seen. */\n                    $elements_in_stack = count($this->stack);\n\n                    if ($this->stack[$elements_in_stack - 1]->tagName === 'option' &&\n                    $this->stack[$elements_in_stack - 2]->tagName === 'optgroup') {\n                        $this->emitToken([\n                            'name' => 'option',\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n                    }\n\n                    /* If the current node is an optgroup element, then pop that node\n                    from the stack of open elements. Otherwise, this is a parse error,\n                    ignore the token. */\n                    if (end($this->stack)->tagName === 'optgroup') {\n                        array_pop($this->stack);\n                    } else {\n                        // parse error\n                        $this->ignored = true;\n                    }\n\n                /* An end tag token whose tag name is \"option\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'option') {\n                    /* If the current node is an option element, then pop that node\n                    from the stack of open elements. Otherwise, this is a parse error,\n                    ignore the token. */\n                    if (end($this->stack)->tagName === 'option') {\n                        array_pop($this->stack);\n                    } else {\n                        // parse error\n                        $this->ignored = true;\n                    }\n\n                /* An end tag whose tag name is \"select\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'select') {\n                    /* If the stack of open elements does not have an element in table\n                    scope with the same tag name as the token, this is a parse error.\n                    Ignore the token. (fragment case) */\n                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        $this->ignored = true;\n                        // parse error\n\n                    /* Otherwise: */\n                    } else {\n                        /* Pop elements from the stack of open elements until a select\n                        element has been popped from the stack. */\n                        do {\n                            $node = array_pop($this->stack);\n                        } while ($node->tagName !== 'select');\n\n                        /* Reset the insertion mode appropriately. */\n                        $this->resetInsertionMode();\n                    }\n\n                /* A start tag whose tag name is \"select\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'select') {\n                    /* Parse error. Act as if the token had been an end tag with the\n                    tag name \"select\" instead. */\n                    $this->emitToken([\n                        'name' => 'select',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                ($token['name'] === 'input' || $token['name'] === 'keygen' ||  $token['name'] === 'textarea')) {\n                    // parse error\n                    $this->emitToken([\n                        'name' => 'select',\n                        'type' => HTML5_Tokenizer::ENDTAG\n                    ]);\n                    $this->emitToken($token);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') {\n                    $this->processWithRulesFor($token, self::IN_HEAD);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    // XERROR: If the current node is not the root html element, then this is a parse error.\n                    /* Stop parsing */\n\n                /* Anything else */\n                } else {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n                }\n            break;\n\n            case self::IN_SELECT_IN_TABLE:\n\n                if ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                in_array($token['name'], ['caption', 'table', 'tbody',\n                'tfoot', 'thead', 'tr', 'td', 'th'])) {\n                    // parse error\n                    $this->emitToken([\n                        'name' => 'select',\n                        'type' => HTML5_Tokenizer::ENDTAG,\n                    ]);\n                    $this->emitToken($token);\n\n                /* An end tag whose tag name is one of: \"caption\", \"table\", \"tbody\",\n                \"tfoot\", \"thead\", \"tr\", \"td\", \"th\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                in_array($token['name'], ['caption', 'table', 'tbody', 'tfoot', 'thead', 'tr', 'td', 'th']))  {\n                    /* Parse error. */\n                    // parse error\n\n                    /* If the stack of open elements has an element in table scope with\n                    the same tag name as that of the token, then act as if an end tag\n                    with the tag name \"select\" had been seen, and reprocess the token.\n                    Otherwise, ignore the token. */\n                    if ($this->elementInScope($token['name'], self::SCOPE_TABLE)) {\n                        $this->emitToken([\n                            'name' => 'select',\n                            'type' => HTML5_Tokenizer::ENDTAG\n                        ]);\n\n                        $this->emitToken($token);\n                    } else {\n                        $this->ignored = true;\n                    }\n                } else {\n                    $this->processWithRulesFor($token, self::IN_SELECT);\n                }\n            break;\n\n            case self::IN_FOREIGN_CONTENT:\n                if ($token['type'] === HTML5_Tokenizer::CHARACTER ||\n                $token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    $this->insertText($token['data']);\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    $this->insertComment($token['data']);\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // XERROR: parse error\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'script' && end($this->stack)->tagName === 'script' &&\n                // XDOM\n                end($this->stack)->namespaceURI === self::NS_SVG) {\n                    array_pop($this->stack);\n                    // a bunch of script running mumbo jumbo\n                } elseif (\n                    ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                        ((\n                            $token['name'] !== 'mglyph' &&\n                            $token['name'] !== 'malignmark' &&\n                            // XDOM\n                            end($this->stack)->namespaceURI === self::NS_MATHML &&\n                            in_array(end($this->stack)->tagName, ['mi', 'mo', 'mn', 'ms', 'mtext'])\n                        ) ||\n                        (\n                            $token['name'] === 'svg' &&\n                            // XDOM\n                            end($this->stack)->namespaceURI === self::NS_MATHML &&\n                            end($this->stack)->tagName === 'annotation-xml'\n                        ) ||\n                        (\n                            // XDOM\n                            end($this->stack)->namespaceURI === self::NS_SVG &&\n                            in_array(end($this->stack)->tagName, ['foreignObject', 'desc', 'title'])\n                        ) ||\n                        (\n                            // XSKETCHY && XDOM\n                            end($this->stack)->namespaceURI === self::NS_HTML\n                        ))\n                    ) || $token['type'] === HTML5_Tokenizer::ENDTAG\n                ) {\n                    $this->processWithRulesFor($token, $this->secondary_mode);\n                    /* If, after doing so, the insertion mode is still \"in foreign\n                     * content\", but there is no element in scope that has a namespace\n                     * other than the HTML namespace, switch the insertion mode to the\n                     * secondary insertion mode. */\n                    if ($this->mode === self::IN_FOREIGN_CONTENT) {\n                        $found = false;\n                        // this basically duplicates elementInScope()\n                        for ($i = count($this->stack) - 1; $i >= 0; $i--) {\n                            // XDOM\n                            $node = $this->stack[$i];\n                            if ($node->namespaceURI !== self::NS_HTML) {\n                                $found = true;\n                                break;\n                            } elseif (in_array($node->tagName, ['table', 'html',\n                            'applet', 'caption', 'td', 'th', 'button', 'marquee',\n                            'object']) || ($node->tagName === 'foreignObject' &&\n                            $node->namespaceURI === self::NS_SVG)) {\n                                break;\n                            }\n                        }\n                        if (!$found) {\n                            $this->mode = $this->secondary_mode;\n                        }\n                    }\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF || (\n                $token['type'] === HTML5_Tokenizer::STARTTAG &&\n                (in_array($token['name'], ['b', \"big\", \"blockquote\", \"body\", \"br\",\n                \"center\", \"code\", \"dc\", \"dd\", \"div\", \"dl\", \"ds\", \"dt\", \"em\", \"embed\", \"h1\", \"h2\",\n                \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"hr\", \"i\", \"img\", \"li\", \"listing\",\n                \"menu\", \"meta\", \"nobr\", \"ol\", \"p\", \"pre\", \"ruby\", \"s\",  \"small\",\n                \"span\", \"strong\", \"strike\",  \"sub\", \"sup\", \"table\", \"tt\", \"u\", \"ul\",\n                \"var\"]) || ($token['name'] === 'font' && ($this->getAttr($token, 'color') ||\n                $this->getAttr($token, 'face') || $this->getAttr($token, 'size')))))) {\n                    // XERROR: parse error\n                    do {\n                        $node = array_pop($this->stack);\n                        // XDOM\n                    } while ($node->namespaceURI !== self::NS_HTML);\n                    $this->stack[] = $node;\n                    $this->mode = $this->secondary_mode;\n                    $this->emitToken($token);\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG) {\n                    static $svg_lookup = [\n                        'altglyph' => 'altGlyph',\n                        'altglyphdef' => 'altGlyphDef',\n                        'altglyphitem' => 'altGlyphItem',\n                        'animatecolor' => 'animateColor',\n                        'animatemotion' => 'animateMotion',\n                        'animatetransform' => 'animateTransform',\n                        'clippath' => 'clipPath',\n                        'feblend' => 'feBlend',\n                        'fecolormatrix' => 'feColorMatrix',\n                        'fecomponenttransfer' => 'feComponentTransfer',\n                        'fecomposite' => 'feComposite',\n                        'feconvolvematrix' => 'feConvolveMatrix',\n                        'fediffuselighting' => 'feDiffuseLighting',\n                        'fedisplacementmap' => 'feDisplacementMap',\n                        'fedistantlight' => 'feDistantLight',\n                        'feflood' => 'feFlood',\n                        'fefunca' => 'feFuncA',\n                        'fefuncb' => 'feFuncB',\n                        'fefuncg' => 'feFuncG',\n                        'fefuncr' => 'feFuncR',\n                        'fegaussianblur' => 'feGaussianBlur',\n                        'feimage' => 'feImage',\n                        'femerge' => 'feMerge',\n                        'femergenode' => 'feMergeNode',\n                        'femorphology' => 'feMorphology',\n                        'feoffset' => 'feOffset',\n                        'fepointlight' => 'fePointLight',\n                        'fespecularlighting' => 'feSpecularLighting',\n                        'fespotlight' => 'feSpotLight',\n                        'fetile' => 'feTile',\n                        'feturbulence' => 'feTurbulence',\n                        'foreignobject' => 'foreignObject',\n                        'glyphref' => 'glyphRef',\n                        'lineargradient' => 'linearGradient',\n                        'radialgradient' => 'radialGradient',\n                        'textpath' => 'textPath',\n                    ];\n                    // XDOM\n                    $current = end($this->stack);\n                    if ($current->namespaceURI === self::NS_MATHML) {\n                        $token = $this->adjustMathMLAttributes($token);\n                    }\n                    if ($current->namespaceURI === self::NS_SVG &&\n                    isset($svg_lookup[$token['name']])) {\n                        $token['name'] = $svg_lookup[$token['name']];\n                    }\n                    if ($current->namespaceURI === self::NS_SVG) {\n                        $token = $this->adjustSVGAttributes($token);\n                    }\n                    $token = $this->adjustForeignAttributes($token);\n                    $this->insertForeignElement($token, $current->namespaceURI);\n                    if (isset($token['self-closing'])) {\n                        array_pop($this->stack);\n                        // XERROR: acknowledge self-closing flag\n                    }\n                }\n            break;\n\n            case self::AFTER_BODY:\n                /* Handle the token as follows: */\n\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Process the token as it would be processed if the insertion mode\n                    was \"in body\". */\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the first element in the stack of open\n                    elements (the html element), with the data attribute set to the\n                    data given in the comment token. */\n                    // XDOM\n                    $comment = $this->dom->createComment($token['data']);\n                    $this->stack[0]->appendChild($comment);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* An end tag with the tag name \"html\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'html') {\n                    /*     If the parser was originally created as part of the HTML\n                     *     fragment parsing algorithm, this is a parse error; ignore\n                     *     the token. (fragment case) */\n                    $this->ignored = true;\n                    // XERROR: implement this\n\n                    $this->mode = self::AFTER_AFTER_BODY;\n\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    /* Stop parsing */\n\n                /* Anything else */\n                } else {\n                    /* Parse error. Set the insertion mode to \"in body\" and reprocess\n                    the token. */\n                    $this->mode = self::IN_BODY;\n                    $this->emitToken($token);\n                }\n            break;\n\n            case self::IN_FRAMESET:\n                /* Handle the token as follows: */\n\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Append the character to the current node. */\n                    $this->insertText($token['data']);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data\n                    attribute set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n\n                /* A start tag with the tag name \"frameset\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'frameset') {\n                    $this->insertElement($token);\n\n                /* An end tag with the tag name \"frameset\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'frameset') {\n                    /* If the current node is the root html element, then this is a\n                    parse error; ignore the token. (fragment case) */\n                    if (end($this->stack)->tagName === 'html') {\n                        $this->ignored = true;\n                        // Parse error\n\n                    } else {\n                        /* Otherwise, pop the current node from the stack of open\n                        elements. */\n                        array_pop($this->stack);\n\n                        /* If the parser was not originally created as part of the HTML\n                         * fragment parsing algorithm  (fragment case), and the current\n                         * node is no longer a frameset element, then switch the\n                         * insertion mode to \"after frameset\". */\n                        $this->mode = self::AFTER_FRAMESET;\n                    }\n\n                /* A start tag with the tag name \"frame\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'frame') {\n                    /* Insert an HTML element for the token. */\n                    $this->insertElement($token);\n\n                    /* Immediately pop the current node off the stack of open elements. */\n                    array_pop($this->stack);\n\n                    // XERROR: Acknowledge the token's self-closing flag, if it is set.\n\n                /* A start tag with the tag name \"noframes\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'noframes') {\n                    /* Process the token using the rules for the \"in head\" insertion mode. */\n                    $this->processwithRulesFor($token, self::IN_HEAD);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    // XERROR: If the current node is not the root html element, then this is a parse error.\n                    /* Stop parsing */\n                /* Anything else */\n                } else {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n                }\n            break;\n\n            case self::AFTER_FRAMESET:\n                /* Handle the token as follows: */\n\n                /* A character token that is one of one of U+0009 CHARACTER TABULATION,\n                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),\n                U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */\n                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {\n                    /* Append the character to the current node. */\n                    $this->insertText($token['data']);\n\n                /* A comment token */\n                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the current node with the data\n                    attribute set to the data given in the comment token. */\n                    $this->insertComment($token['data']);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {\n                    // parse error\n\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* An end tag with the tag name \"html\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&\n                $token['name'] === 'html') {\n                    $this->mode = self::AFTER_AFTER_FRAMESET;\n\n                /* A start tag with the tag name \"noframes\" */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&\n                $token['name'] === 'noframes') {\n                    $this->processWithRulesFor($token, self::IN_HEAD);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    /* Stop parsing */\n\n                /* Anything else */\n                } else {\n                    /* Parse error. Ignore the token. */\n                    $this->ignored = true;\n                }\n            break;\n\n            case self::AFTER_AFTER_BODY:\n                /* A comment token */\n                if ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the Document object with the data\n                    attribute set to the data given in the comment token. */\n                    // XDOM\n                    $comment = $this->dom->createComment($token['data']);\n                    $this->dom->appendChild($comment);\n\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE ||\n                $token['type'] === HTML5_Tokenizer::SPACECHARACTER ||\n                ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* An end-of-file token */\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    /* OMG DONE!! */\n                } else {\n                    // parse error\n                    $this->mode = self::IN_BODY;\n                    $this->emitToken($token);\n                }\n            break;\n\n            case self::AFTER_AFTER_FRAMESET:\n                /* A comment token */\n                if ($token['type'] === HTML5_Tokenizer::COMMENT) {\n                    /* Append a Comment node to the Document object with the data\n                    attribute set to the data given in the comment token. */\n                    // XDOM\n                    $comment = $this->dom->createComment($token['data']);\n                    $this->dom->appendChild($comment);\n                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE ||\n                $token['type'] === HTML5_Tokenizer::SPACECHARACTER ||\n                ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) {\n                    $this->processWithRulesFor($token, self::IN_BODY);\n\n                /* An end-of-file token */\n                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {\n                    /* OMG DONE!! */\n                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'nofrmaes') {\n                    $this->processWithRulesFor($token, self::IN_HEAD);\n                } else {\n                    // parse error\n                }\n            break;\n        }\n    }\n\n    private function insertElement($token, $append = true) {\n        $el = $this->dom->createElementNS(self::NS_HTML, $token['name']);\n\n        if (!empty($token['attr'])) {\n            foreach ($token['attr'] as $attr) {\n                if (!$el->hasAttribute($attr['name']) && preg_match(\"/^[a-zA-Z_:]/\", $attr['name'])) {\n                    $el->setAttribute($attr['name'], $attr['value']);\n                }\n            }\n        }\n        if ($append) {\n            $this->appendToRealParent($el);\n            $this->stack[] = $el;\n        }\n\n        return $el;\n    }\n\n    /**\n     * @param $data\n     */\n    private function insertText($data) {\n        if ($data === '') {\n            return;\n        }\n        if ($this->ignore_lf_token) {\n            if ($data[0] === \"\\n\") {\n                $data = substr($data, 1);\n                if ($data === false) {\n                    return;\n                }\n            }\n        }\n        $text = $this->dom->createTextNode($data);\n        $this->appendToRealParent($text);\n    }\n\n    /**\n     * @param $data\n     */\n    private function insertComment($data) {\n        $comment = $this->dom->createComment($data);\n        $this->appendToRealParent($comment);\n    }\n\n    /**\n     * @param $node\n     */\n    private function appendToRealParent($node) {\n        // this is only for the foster_parent case\n        /* If the current node is a table, tbody, tfoot, thead, or tr\n        element, then, whenever a node would be inserted into the current\n        node, it must instead be inserted into the foster parent element. */\n        if (\n            !$this->foster_parent ||\n            !in_array(\n                end($this->stack)->tagName,\n                ['table', 'tbody', 'tfoot', 'thead', 'tr']\n            )\n        ) {\n            end($this->stack)->appendChild($node);\n        } else {\n            $this->fosterParent($node);\n        }\n    }\n\n    /**\n     * @param $el\n     * @param int $scope\n     * @return bool|null\n     */\n    private function elementInScope($el, $scope = self::SCOPE) {\n        if (is_array($el)) {\n            foreach($el as $element) {\n                if ($this->elementInScope($element, $scope)) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        $leng = count($this->stack);\n\n        for ($n = 0; $n < $leng; $n++) {\n            /* 1. Initialise node to be the current node (the bottommost node of\n            the stack). */\n            $node = $this->stack[$leng - 1 - $n];\n\n            if ($node->tagName === $el) {\n                /* 2. If node is the target node, terminate in a match state. */\n                return true;\n\n                // We've expanded the logic for these states a little differently;\n                // Hixie's refactoring into \"specific scope\" is more general, but\n                // this \"gets the job done\"\n\n            // these are the common states for all scopes\n            } elseif ($node->tagName === 'table' || $node->tagName === 'html') {\n                return false;\n\n            // these are valid for \"in scope\" and \"in list item scope\"\n            } elseif ($scope !== self::SCOPE_TABLE &&\n            (in_array($node->tagName, ['applet', 'caption', 'td',\n                'th', 'button', 'marquee', 'object']) ||\n                $node->tagName === 'foreignObject' && $node->namespaceURI === self::NS_SVG)) {\n                return false;\n\n\n            // these are valid for \"in list item scope\"\n            } elseif ($scope === self::SCOPE_LISTITEM && in_array($node->tagName, ['ol', 'ul'])) {\n                return false;\n            }\n\n            /* Otherwise, set node to the previous entry in the stack of open\n            elements and return to step 2. (This will never fail, since the loop\n            will always terminate in the previous step if the top of the stack\n            is reached.) */\n        }\n\n        // To fix warning. This never happens or should return true/false\n        return null;\n    }\n\n    /**\n     * @return bool\n     */\n    private function reconstructActiveFormattingElements() {\n        /* 1. If there are no entries in the list of active formatting elements,\n        then there is nothing to reconstruct; stop this algorithm. */\n        $formatting_elements = count($this->a_formatting);\n\n        if ($formatting_elements === 0) {\n            return false;\n        }\n\n        /* 3. Let entry be the last (most recently added) element in the list\n        of active formatting elements. */\n        $entry = end($this->a_formatting);\n\n        /* 2. If the last (most recently added) entry in the list of active\n        formatting elements is a marker, or if it is an element that is in the\n        stack of open elements, then there is nothing to reconstruct; stop this\n        algorithm. */\n        if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {\n            return false;\n        }\n\n        for ($a = $formatting_elements - 1; $a >= 0; true) {\n            /* 4. If there are no entries before entry in the list of active\n            formatting elements, then jump to step 8. */\n            if ($a === 0) {\n                $step_seven = false;\n                break;\n            }\n\n            /* 5. Let entry be the entry one earlier than entry in the list of\n            active formatting elements. */\n            $a--;\n            $entry = $this->a_formatting[$a];\n\n            /* 6. If entry is neither a marker nor an element that is also in\n            thetack of open elements, go to step 4. */\n            if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {\n                break;\n            }\n        }\n\n        while (true) {\n            /* 7. Let entry be the element one later than entry in the list of\n            active formatting elements. */\n            if (isset($step_seven) && $step_seven === true) {\n                $a++;\n                $entry = $this->a_formatting[$a];\n            }\n\n            /* 8. Perform a shallow clone of the element entry to obtain clone. */\n            $clone = $entry->cloneNode();\n\n            /* 9. Append clone to the current node and push it onto the stack\n            of open elements  so that it is the new current node. */\n            $this->appendToRealParent($clone);\n            $this->stack[] = $clone;\n\n            /* 10. Replace the entry for entry in the list with an entry for\n            clone. */\n            $this->a_formatting[$a] = $clone;\n\n            /* 11. If the entry for clone in the list of active formatting\n            elements is not the last entry in the list, return to step 7. */\n            if (end($this->a_formatting) !== $clone) {\n                $step_seven = true;\n            } else {\n                break;\n            }\n        }\n\n        // Return value not in use ATM. Would just make sense to also return true here.\n        return true;\n    }\n\n    /**\n     *\n     */\n    private function clearTheActiveFormattingElementsUpToTheLastMarker() {\n        /* When the steps below require the UA to clear the list of active\n        formatting elements up to the last marker, the UA must perform the\n        following steps: */\n\n        while (true) {\n            /* 1. Let entry be the last (most recently added) entry in the list\n            of active formatting elements. */\n            $entry = end($this->a_formatting);\n\n            /* 2. Remove entry from the list of active formatting elements. */\n            array_pop($this->a_formatting);\n\n            /* 3. If entry was a marker, then stop the algorithm at this point.\n            The list has been cleared up to the last marker. */\n            if ($entry === self::MARKER) {\n                break;\n            }\n        }\n    }\n\n    /**\n     * @param array $exclude\n     */\n    private function generateImpliedEndTags($exclude = []) {\n        /* When the steps below require the UA to generate implied end tags,\n         * then, while the current node is a dc element, a dd element, a ds\n         * element, a dt element, an li element, an option element, an optgroup\n         * element, a p element, an rp element, or an rt element, the UA must\n         * pop the current node off the stack of open elements. */\n        $node = end($this->stack);\n        $elements = array_diff(['dc', 'dd', 'ds', 'dt', 'li', 'p', 'td', 'th', 'tr'], $exclude);\n\n        while (in_array(end($this->stack)->tagName, $elements)) {\n            array_pop($this->stack);\n        }\n    }\n\n    /**\n     * @param $node\n     * @return int\n     */\n    private function getElementCategory($node) {\n        if (!is_object($node)) {\n            debug_print_backtrace();\n        }\n        $name = $node->tagName;\n        if (in_array($name, $this->special)) {\n            return self::SPECIAL;\n        } elseif (in_array($name, $this->scoping)) {\n            return self::SCOPING;\n        } elseif (in_array($name, $this->formatting)) {\n            return self::FORMATTING;\n        } else {\n            return self::PHRASING;\n        }\n    }\n\n    /**\n     * @param $elements\n     */\n    private function clearStackToTableContext($elements) {\n        /* When the steps above require the UA to clear the stack back to a\n        table context, it means that the UA must, while the current node is not\n        a table element or an html element, pop elements from the stack of open\n        elements. */\n        while (true) {\n            $name = end($this->stack)->tagName;\n\n            if (in_array($name, $elements)) {\n                break;\n            } else {\n                array_pop($this->stack);\n            }\n        }\n    }\n\n    /**\n     * @param null $context\n     */\n    private function resetInsertionMode($context = null) {\n        /* 1. Let last be false. */\n        $last = false;\n        $leng = count($this->stack);\n\n        for ($n = $leng - 1; $n >= 0; $n--) {\n            /* 2. Let node be the last node in the stack of open elements. */\n            $node = $this->stack[$n];\n\n            /* 3. If node is the first node in the stack of open elements, then\n             * set last to true and set node to the context  element. (fragment\n             * case) */\n            if ($this->stack[0]->isSameNode($node)) {\n                $last = true;\n                $node = $context;\n            }\n\n            /* 4. If node is a select element, then switch the insertion mode to\n            \"in select\" and abort these steps. (fragment case) */\n            if ($node->tagName === 'select') {\n                $this->mode = self::IN_SELECT;\n                break;\n\n            /* 5. If node is a td or th element, then switch the insertion mode\n            to \"in cell\" and abort these steps. */\n            } elseif ($node->tagName === 'td' || $node->nodeName === 'th') {\n                $this->mode = self::IN_CELL;\n                break;\n\n            /* 6. If node is a tr element, then switch the insertion mode to\n            \"in    row\" and abort these steps. */\n            } elseif ($node->tagName === 'tr') {\n                $this->mode = self::IN_ROW;\n                break;\n\n            /* 7. If node is a tbody, thead, or tfoot element, then switch the\n            insertion mode to \"in table body\" and abort these steps. */\n            } elseif (in_array($node->tagName, ['tbody', 'thead', 'tfoot'])) {\n                $this->mode = self::IN_TABLE_BODY;\n                break;\n\n            /* 8. If node is a caption element, then switch the insertion mode\n            to \"in caption\" and abort these steps. */\n            } elseif ($node->tagName === 'caption') {\n                $this->mode = self::IN_CAPTION;\n                break;\n\n            /* 9. If node is a colgroup element, then switch the insertion mode\n            to \"in column group\" and abort these steps. (innerHTML case) */\n            } elseif ($node->tagName === 'colgroup') {\n                $this->mode = self::IN_COLUMN_GROUP;\n                break;\n\n            /* 10. If node is a table element, then switch the insertion mode\n            to \"in table\" and abort these steps. */\n            } elseif ($node->tagName === 'table') {\n                $this->mode = self::IN_TABLE;\n                break;\n\n            /* 11. If node is an element from the MathML namespace or the SVG\n             * namespace, then switch the insertion mode to \"in foreign\n             * content\", let the secondary insertion mode be \"in body\", and\n             * abort these steps. */\n            } elseif ($node->namespaceURI === self::NS_SVG ||\n            $node->namespaceURI === self::NS_MATHML) {\n                $this->mode = self::IN_FOREIGN_CONTENT;\n                $this->secondary_mode = self::IN_BODY;\n                break;\n\n            /* 12. If node is a head element, then switch the insertion mode\n            to \"in body\" (\"in body\"! not \"in head\"!) and abort these steps.\n            (fragment case) */\n            } elseif ($node->tagName === 'head') {\n                $this->mode = self::IN_BODY;\n                break;\n\n            /* 13. If node is a body element, then switch the insertion mode to\n            \"in body\" and abort these steps. */\n            } elseif ($node->tagName === 'body') {\n                $this->mode = self::IN_BODY;\n                break;\n\n            /* 14. If node is a frameset element, then switch the insertion\n            mode to \"in frameset\" and abort these steps. (fragment case) */\n            } elseif ($node->tagName === 'frameset') {\n                $this->mode = self::IN_FRAMESET;\n                break;\n\n            /* 15. If node is an html element, then: if the head element\n            pointer is null, switch the insertion mode to \"before head\",\n            otherwise, switch the insertion mode to \"after head\". In either\n            case, abort these steps. (fragment case) */\n            } elseif ($node->tagName === 'html') {\n                $this->mode = ($this->head_pointer === null)\n                    ? self::BEFORE_HEAD\n                    : self::AFTER_HEAD;\n\n                break;\n\n            /* 16. If last is true, then set the insertion mode to \"in body\"\n            and    abort these steps. (fragment case) */\n            } elseif ($last) {\n                $this->mode = self::IN_BODY;\n                break;\n            }\n        }\n    }\n\n    /**\n     *\n     */\n    private function closeCell() {\n        /* If the stack of open elements has a td or th element in table scope,\n        then act as if an end tag token with that tag name had been seen. */\n        foreach (['td', 'th'] as $cell) {\n            if ($this->elementInScope($cell, self::SCOPE_TABLE)) {\n                $this->emitToken([\n                    'name' => $cell,\n                    'type' => HTML5_Tokenizer::ENDTAG\n                ]);\n\n                break;\n            }\n        }\n    }\n\n    /**\n     * @param $token\n     * @param $mode\n     */\n    private function processWithRulesFor($token, $mode) {\n        /* \"using the rules for the m insertion mode\", where m is one of these\n         * modes, the user agent must use the rules described under the m\n         * insertion mode's section, but must leave the insertion mode\n         * unchanged unless the rules in m themselves switch the insertion mode\n         * to a new value. */\n        $this->emitToken($token, $mode);\n    }\n\n    /**\n     * @param $token\n     */\n    private function insertCDATAElement($token) {\n        $this->insertElement($token);\n        $this->original_mode = $this->mode;\n        $this->mode = self::IN_CDATA_RCDATA;\n        $this->content_model = HTML5_Tokenizer::CDATA;\n    }\n\n    /**\n     * @param $token\n     */\n    private function insertRCDATAElement($token) {\n        $this->insertElement($token);\n        $this->original_mode = $this->mode;\n        $this->mode = self::IN_CDATA_RCDATA;\n        $this->content_model = HTML5_Tokenizer::RCDATA;\n    }\n\n    /**\n     * @param $token\n     * @param $key\n     * @return bool\n     */\n    private function getAttr($token, $key) {\n        if (!isset($token['attr'])) {\n            return false;\n        }\n        $ret = false;\n        foreach ($token['attr'] as $keypair) {\n            if ($keypair['name'] === $key) {\n                $ret = $keypair['value'];\n            }\n        }\n        return $ret;\n    }\n\n    /**\n     * @return mixed\n     */\n    private function getCurrentTable() {\n        /* The current table is the last table  element in the stack of open\n         * elements, if there is one. If there is no table element in the stack\n         * of open elements (fragment case), then the current table is the\n         * first element in the stack of open elements (the html element). */\n        for ($i = count($this->stack) - 1; $i >= 0; $i--) {\n            if ($this->stack[$i]->tagName === 'table') {\n                return $this->stack[$i];\n            }\n        }\n        return $this->stack[0];\n    }\n\n    /**\n     * @return mixed\n     */\n    private function getFosterParent() {\n        /* The foster parent element is the parent element of the last\n        table element in the stack of open elements, if there is a\n        table element and it has such a parent element. If there is no\n        table element in the stack of open elements (innerHTML case),\n        then the foster parent element is the first element in the\n        stack of open elements (the html  element). Otherwise, if there\n        is a table element in the stack of open elements, but the last\n        table element in the stack of open elements has no parent, or\n        its parent node is not an element, then the foster parent\n        element is the element before the last table element in the\n        stack of open elements. */\n        for ($n = count($this->stack) - 1; $n >= 0; $n--) {\n            if ($this->stack[$n]->tagName === 'table') {\n                $table = $this->stack[$n];\n                break;\n            }\n        }\n\n        if (isset($table) && $table->parentNode !== null) {\n            return $table->parentNode;\n\n        } elseif (!isset($table)) {\n            return $this->stack[0];\n\n        } elseif (isset($table) && ($table->parentNode === null ||\n        $table->parentNode->nodeType !== XML_ELEMENT_NODE)) {\n            return $this->stack[$n - 1];\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $node\n     */\n    public function fosterParent($node) {\n        $foster_parent = $this->getFosterParent();\n        $table = $this->getCurrentTable(); // almost equivalent to last table element, except it can be html\n        /* When a node node is to be foster parented, the node node must be\n         * be inserted into the foster parent element. */\n        /* If the foster parent element is the parent element of the last table\n         * element in the stack of open elements, then node must be inserted\n         * immediately before the last table element in the stack of open\n         * elements in the foster parent element; otherwise, node must be\n         * appended to the foster parent element. */\n        if ($table->tagName === 'table' && $table->parentNode->isSameNode($foster_parent)) {\n            $foster_parent->insertBefore($node, $table);\n        } else {\n            $foster_parent->appendChild($node);\n        }\n    }\n\n    /**\n     * For debugging, prints the stack\n     */\n    private function printStack() {\n        $names = [];\n        foreach ($this->stack as $i => $element) {\n            $names[] = $element->tagName;\n        }\n        echo \"  -> stack [\" . implode(', ', $names) . \"]\\n\";\n    }\n\n    /**\n     * For debugging, prints active formatting elements\n     */\n    private function printActiveFormattingElements() {\n        if (!$this->a_formatting) {\n            return;\n        }\n        $names = [];\n        foreach ($this->a_formatting as $node) {\n            if ($node === self::MARKER) {\n                $names[] = 'MARKER';\n            } else {\n                $names[] = $node->tagName;\n            }\n        }\n        echo \"  -> active formatting [\" . implode(', ', $names) . \"]\\n\";\n    }\n\n    /**\n     * @return bool\n     */\n    public function currentTableIsTainted() {\n        return !empty($this->getCurrentTable()->tainted);\n    }\n\n    /**\n     * Sets up the tree constructor for building a fragment.\n     *\n     * @param null $context\n     */\n    public function setupContext($context = null) {\n        $this->fragment = true;\n        if ($context) {\n            $context = $this->dom->createElementNS(self::NS_HTML, $context);\n            /* 4.1. Set the HTML parser's tokenization  stage's content model\n             * flag according to the context element, as follows: */\n            switch ($context->tagName) {\n                case 'title': case 'textarea':\n                    $this->content_model = HTML5_Tokenizer::RCDATA;\n                    break;\n                case 'style': case 'script': case 'xmp': case 'iframe':\n                case 'noembed': case 'noframes':\n                    $this->content_model = HTML5_Tokenizer::CDATA;\n                    break;\n                case 'noscript':\n                    // XSCRIPT: assuming scripting is enabled\n                    $this->content_model = HTML5_Tokenizer::CDATA;\n                    break;\n                case 'plaintext':\n                    $this->content_model = HTML5_Tokenizer::PLAINTEXT;\n                    break;\n            }\n            /* 4.2. Let root be a new html element with no attributes. */\n            $root = $this->dom->createElementNS(self::NS_HTML, 'html');\n            $this->root = $root;\n            /* 4.3 Append the element root to the Document node created above. */\n            $this->dom->appendChild($root);\n            /* 4.4 Set up the parser's stack of open elements so that it\n             * contains just the single element root. */\n            $this->stack = [$root];\n            /* 4.5 Reset the parser's insertion mode appropriately. */\n            $this->resetInsertionMode($context);\n            /* 4.6 Set the parser's form element pointer  to the nearest node\n             * to the context element that is a form element (going straight up\n             * the ancestor chain, and including the element itself, if it is a\n             * form element), or, if there is no such form element, to null. */\n            $node = $context;\n            do {\n                if ($node->tagName === 'form') {\n                    $this->form_pointer = $node;\n                    break;\n                }\n            } while ($node = $node->parentNode);\n        }\n    }\n\n    /**\n     * @param $token\n     * @return mixed\n     */\n    public function adjustMathMLAttributes($token) {\n        foreach ($token['attr'] as &$kp) {\n            if ($kp['name'] === 'definitionurl') {\n                $kp['name'] = 'definitionURL';\n            }\n        }\n        return $token;\n    }\n\n    /**\n     * @param $token\n     * @return mixed\n     */\n    public function adjustSVGAttributes($token) {\n        static $lookup = [\n            'attributename' => 'attributeName',\n            'attributetype' => 'attributeType',\n            'basefrequency' => 'baseFrequency',\n            'baseprofile' => 'baseProfile',\n            'calcmode' => 'calcMode',\n            'clippathunits' => 'clipPathUnits',\n            'contentscripttype' => 'contentScriptType',\n            'contentstyletype' => 'contentStyleType',\n            'diffuseconstant' => 'diffuseConstant',\n            'edgemode' => 'edgeMode',\n            'externalresourcesrequired' => 'externalResourcesRequired',\n            'filterres' => 'filterRes',\n            'filterunits' => 'filterUnits',\n            'glyphref' => 'glyphRef',\n            'gradienttransform' => 'gradientTransform',\n            'gradientunits' => 'gradientUnits',\n            'kernelmatrix' => 'kernelMatrix',\n            'kernelunitlength' => 'kernelUnitLength',\n            'keypoints' => 'keyPoints',\n            'keysplines' => 'keySplines',\n            'keytimes' => 'keyTimes',\n            'lengthadjust' => 'lengthAdjust',\n            'limitingconeangle' => 'limitingConeAngle',\n            'markerheight' => 'markerHeight',\n            'markerunits' => 'markerUnits',\n            'markerwidth' => 'markerWidth',\n            'maskcontentunits' => 'maskContentUnits',\n            'maskunits' => 'maskUnits',\n            'numoctaves' => 'numOctaves',\n            'pathlength' => 'pathLength',\n            'patterncontentunits' => 'patternContentUnits',\n            'patterntransform' => 'patternTransform',\n            'patternunits' => 'patternUnits',\n            'pointsatx' => 'pointsAtX',\n            'pointsaty' => 'pointsAtY',\n            'pointsatz' => 'pointsAtZ',\n            'preservealpha' => 'preserveAlpha',\n            'preserveaspectratio' => 'preserveAspectRatio',\n            'primitiveunits' => 'primitiveUnits',\n            'refx' => 'refX',\n            'refy' => 'refY',\n            'repeatcount' => 'repeatCount',\n            'repeatdur' => 'repeatDur',\n            'requiredextensions' => 'requiredExtensions',\n            'requiredfeatures' => 'requiredFeatures',\n            'specularconstant' => 'specularConstant',\n            'specularexponent' => 'specularExponent',\n            'spreadmethod' => 'spreadMethod',\n            'startoffset' => 'startOffset',\n            'stddeviation' => 'stdDeviation',\n            'stitchtiles' => 'stitchTiles',\n            'surfacescale' => 'surfaceScale',\n            'systemlanguage' => 'systemLanguage',\n            'tablevalues' => 'tableValues',\n            'targetx' => 'targetX',\n            'targety' => 'targetY',\n            'textlength' => 'textLength',\n            'viewbox' => 'viewBox',\n            'viewtarget' => 'viewTarget',\n            'xchannelselector' => 'xChannelSelector',\n            'ychannelselector' => 'yChannelSelector',\n            'zoomandpan' => 'zoomAndPan',\n        ];\n        foreach ($token['attr'] as &$kp) {\n            if (isset($lookup[$kp['name']])) {\n                $kp['name'] = $lookup[$kp['name']];\n            }\n        }\n        return $token;\n    }\n\n    /**\n     * @param $token\n     * @return mixed\n     */\n    public function adjustForeignAttributes($token) {\n        static $lookup = [\n            'xlink:actuate' => ['xlink', 'actuate', self::NS_XLINK],\n            'xlink:arcrole' => ['xlink', 'arcrole', self::NS_XLINK],\n            'xlink:href' => ['xlink', 'href', self::NS_XLINK],\n            'xlink:role' => ['xlink', 'role', self::NS_XLINK],\n            'xlink:show' => ['xlink', 'show', self::NS_XLINK],\n            'xlink:title' => ['xlink', 'title', self::NS_XLINK],\n            'xlink:type' => ['xlink', 'type', self::NS_XLINK],\n            'xml:base' => ['xml', 'base', self::NS_XML],\n            'xml:lang' => ['xml', 'lang', self::NS_XML],\n            'xml:space' => ['xml', 'space', self::NS_XML],\n            'xmlns' => [null, 'xmlns', self::NS_XMLNS],\n            'xmlns:xlink' => ['xmlns', 'xlink', self::NS_XMLNS],\n        ];\n        foreach ($token['attr'] as &$kp) {\n            if (isset($lookup[$kp['name']])) {\n                $kp['name'] = $lookup[$kp['name']];\n            }\n        }\n        return $token;\n    }\n\n    /**\n     * @param $token\n     * @param $namespaceURI\n     */\n    public function insertForeignElement($token, $namespaceURI) {\n        $el = $this->dom->createElementNS($namespaceURI, $token['name']);\n\n        if (!empty($token['attr'])) {\n            foreach ($token['attr'] as $kp) {\n                $attr = $kp['name'];\n                if (is_array($attr)) {\n                    $ns = $attr[2];\n                    $attr = $attr[1];\n                } else {\n                    $ns = self::NS_HTML;\n                }\n                if (!$el->hasAttributeNS($ns, $attr)) {\n                    // XSKETCHY: work around godawful libxml bug\n                    if ($ns === self::NS_XLINK) {\n                        $el->setAttribute('xlink:'.$attr, $kp['value']);\n                    } elseif ($ns === self::NS_HTML) {\n                        // Another godawful libxml bug\n                        $el->setAttribute($attr, $kp['value']);\n                    } else {\n                        $el->setAttributeNS($ns, $attr, $kp['value']);\n                    }\n                }\n            }\n        }\n        $this->appendToRealParent($el);\n        $this->stack[] = $el;\n        // XERROR: see below\n        /* If the newly created element has an xmlns attribute in the XMLNS\n         * namespace  whose value is not exactly the same as the element's\n         * namespace, that is a parse error. Similarly, if the newly created\n         * element has an xmlns:xlink attribute in the XMLNS namespace whose\n         * value is not the XLink Namespace, that is a parse error. */\n    }\n\n    /**\n     * @return DOMDocument|DOMNodeList\n     */\n    public function save() {\n        $this->dom->normalize();\n        if (!$this->fragment) {\n            return $this->dom;\n        } else {\n            if ($this->root) {\n                return $this->root->childNodes;\n            } else {\n                return $this->dom->childNodes;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "application/libraries/dompdf/lib/html5lib/named-character-references.ser",
    "content": "a:52:{s:1:\"A\";a:16:{s:1:\"E\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:198;}s:9:\"codepoint\";i:198;}}}}s:1:\"M\";a:1:{s:1:\"P\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:38;}s:9:\"codepoint\";i:38;}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:193;}s:9:\"codepoint\";i:193;}}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:258;}}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:194;}s:9:\"codepoint\";i:194;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1040;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120068;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:192;}s:9:\"codepoint\";i:192;}}}}}s:1:\"l\";a:1:{s:1:\"p\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:913;}}}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:256;}}}}}s:1:\"n\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10835;}}}s:1:\"o\";a:2:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:260;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120120;}}}}s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"y\";a:1:{s:1:\"F\";a:1:{s:1:\"u\";a:1:{s:1:\"n\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8289;}}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:197;}s:9:\"codepoint\";i:197;}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119964;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8788;}}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:195;}s:9:\"codepoint\";i:195;}}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:196;}s:9:\"codepoint\";i:196;}}}}s:1:\"B\";a:8:{s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8726;}}}}}}}}s:1:\"r\";a:2:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10983;}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8966;}}}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1041;}}}s:1:\"e\";a:3:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8757;}}}}}}s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8492;}}}}}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:914;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120069;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120121;}}}}s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:728;}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8492;}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8782;}}}}}}}s:1:\"C\";a:14:{s:1:\"H\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1063;}}}}s:1:\"O\";a:1:{s:1:\"P\";a:1:{s:1:\"Y\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:169;}s:9:\"codepoint\";i:169;}}}s:1:\"a\";a:3:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:262;}}}}}s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8914;}s:1:\"i\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"D\";a:1:{s:1:\"i\";a:1:{s:1:\"f\";a:1:{s:1:\"f\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"D\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8517;}}}}}}}}}}}}}}}}}}}s:1:\"y\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"y\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8493;}}}}}}}s:1:\"c\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:268;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:199;}s:9:\"codepoint\";i:199;}}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:264;}}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8752;}}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:266;}}}}s:1:\"e\";a:2:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:184;}}}}}}s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:183;}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8493;}}}s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:935;}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:4:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8857;}}}}s:1:\"M\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8854;}}}}}}s:1:\"P\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8853;}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8855;}}}}}}}}}}}s:1:\"l\";a:1:{s:1:\"o\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"w\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"C\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"I\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8754;}}}}}}}}}}}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"C\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"l\";a:1:{s:1:\"y\";a:2:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"Q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8221;}}}}}}}}}}}}s:1:\"Q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8217;}}}}}}}}}}}}}}}s:1:\"o\";a:4:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8759;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10868;}}}}}s:1:\"n\";a:3:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8801;}}}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8751;}}}}s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"I\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8750;}}}}}}}}}}}}}}s:1:\"p\";a:2:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8450;}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"d\";a:1:{s:1:\"u\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8720;}}}}}}}}s:1:\"u\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"C\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"w\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"C\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"I\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8755;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10799;}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119966;}}}}s:1:\"u\";a:1:{s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8915;}s:1:\"C\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8781;}}}}}}}s:1:\"D\";a:11:{s:1:\"D\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8517;}s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"h\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10513;}}}}}}}}s:1:\"J\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1026;}}}}s:1:\"S\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1029;}}}}s:1:\"Z\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1039;}}}}s:1:\"a\";a:3:{s:1:\"g\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8225;}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8609;}}}s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10980;}}}}}s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:270;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1044;}}}s:1:\"e\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8711;}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:916;}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120071;}}}s:1:\"i\";a:2:{s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:4:{s:1:\"A\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:180;}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:2:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:729;}}s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"A\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:733;}}}}}}}}}}}}s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:96;}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:732;}}}}}}}}}}}}}}s:1:\"m\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8900;}}}}}}s:1:\"f\";a:1:{s:1:\"f\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"D\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8518;}}}}}}}}}}}}}s:1:\"o\";a:4:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120123;}}}s:1:\"t\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:168;}s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8412;}}}}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8784;}}}}}}}s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:6:{s:1:\"C\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"I\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8751;}}}}}}}}}}}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:2:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:168;}}s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8659;}}}}}}}}}}s:1:\"L\";a:2:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:3:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8656;}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8660;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10980;}}}}}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:2:{s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10232;}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10234;}}}}}}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10233;}}}}}}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8658;}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8872;}}}}}}}}}s:1:\"U\";a:1:{s:1:\"p\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8657;}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8661;}}}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8741;}}}}}}}}}}}}}}}}s:1:\"w\";a:1:{s:1:\"n\";a:6:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8595;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10515;}}}}s:1:\"U\";a:1:{s:1:\"p\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8693;}}}}}}}}}}}}}s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:785;}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:3:{s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10576;}}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10590;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8637;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10582;}}}}}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:2:{s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10591;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8641;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10583;}}}}}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8868;}s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8615;}}}}}}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8659;}}}}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119967;}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:272;}}}}}}}s:1:\"E\";a:16:{s:1:\"N\";a:1:{s:1:\"G\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:330;}}}s:1:\"T\";a:1:{s:1:\"H\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:208;}s:9:\"codepoint\";i:208;}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:201;}s:9:\"codepoint\";i:201;}}}}}s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:282;}}}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:202;}s:9:\"codepoint\";i:202;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1069;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:278;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120072;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:200;}s:9:\"codepoint\";i:200;}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8712;}}}}}}}s:1:\"m\";a:2:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:274;}}}}s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:2:{s:1:\"S\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"S\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9723;}}}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"y\";a:1:{s:1:\"S\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"S\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9643;}}}}}}}}}}}}}}}}}}}}s:1:\"o\";a:2:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:280;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120124;}}}}s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:917;}}}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:2:{s:1:\"a\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10869;}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8770;}}}}}}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8652;}}}}}}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8496;}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10867;}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:919;}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:203;}s:9:\"codepoint\";i:203;}}}s:1:\"x\";a:2:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8707;}}}}}s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8519;}}}}}}}}}}}}}s:1:\"F\";a:5:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1060;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120073;}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:2:{s:1:\"S\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"S\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9724;}}}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"y\";a:1:{s:1:\"S\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"S\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9642;}}}}}}}}}}}}}}}}}}}}}s:1:\"o\";a:3:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120125;}}}s:1:\"r\";a:1:{s:1:\"A\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8704;}}}}}s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8497;}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8497;}}}}}s:1:\"G\";a:12:{s:1:\"J\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1027;}}}}s:1:\"T\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:62;}s:9:\"codepoint\";i:62;}s:1:\"a\";a:1:{s:1:\"m\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:915;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:988;}}}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:286;}}}}}}s:1:\"c\";a:3:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:290;}}}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:284;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1043;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:288;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120074;}}}s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8921;}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120126;}}}}s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:6:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8805;}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8923;}}}}}}}}}}s:1:\"F\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8807;}}}}}}}}}}s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10914;}}}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8823;}}}}}s:1:\"S\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10878;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8819;}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119970;}}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8811;}}}s:1:\"H\";a:8:{s:1:\"A\";a:1:{s:1:\"R\";a:1:{s:1:\"D\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1066;}}}}}}s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:711;}}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:94;}}}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:292;}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8460;}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"b\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8459;}}}}}}}}}}}}s:1:\"o\";a:2:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8461;}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"z\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"L\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9472;}}}}}}}}}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8459;}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:294;}}}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:2:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"H\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8782;}}}}}}}}}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8783;}}}}}}}}}}s:1:\"I\";a:14:{s:1:\"E\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1045;}}}}s:1:\"J\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:306;}}}}}s:1:\"O\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1025;}}}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:205;}s:9:\"codepoint\";i:205;}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:206;}s:9:\"codepoint\";i:206;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1048;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:304;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8465;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:204;}s:9:\"codepoint\";i:204;}}}}}s:1:\"m\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8465;}s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:298;}}}s:1:\"g\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"y\";a:1:{s:1:\"I\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8520;}}}}}}}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8658;}}}}}}}s:1:\"n\";a:2:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8748;}s:1:\"e\";a:2:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8747;}}}}}s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8898;}}}}}}}}}}}s:1:\"v\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\"C\";a:1:{s:1:\"o\";a:1:{s:1:\"m\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8291;}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8290;}}}}}}}}}}}}}}s:1:\"o\";a:3:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:302;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120128;}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:921;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8464;}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:296;}}}}}}s:1:\"u\";a:2:{s:1:\"k\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1030;}}}}s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:207;}s:9:\"codepoint\";i:207;}}}}s:1:\"J\";a:5:{s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:308;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1049;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120077;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120129;}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119973;}}}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1032;}}}}}}s:1:\"u\";a:1:{s:1:\"k\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1028;}}}}}}s:1:\"K\";a:7:{s:1:\"H\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1061;}}}}s:1:\"J\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1036;}}}}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:922;}}}}}s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:310;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1050;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120078;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120130;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119974;}}}}}s:1:\"L\";a:11:{s:1:\"J\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1033;}}}}s:1:\"T\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:60;}s:9:\"codepoint\";i:60;}s:1:\"a\";a:5:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:313;}}}}}s:1:\"m\";a:1:{s:1:\"b\";a:1:{s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:923;}}}}}s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10218;}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8466;}}}}}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8606;}}}}s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:317;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:315;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1051;}}}s:1:\"e\";a:2:{s:1:\"f\";a:1:{s:1:\"t\";a:10:{s:1:\"A\";a:2:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10216;}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8592;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8676;}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8646;}}}}}}}}}}}}}}}}s:1:\"C\";a:1:{s:1:\"e\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8968;}}}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:2:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10214;}}}}}}}}}}}}s:1:\"w\";a:1:{s:1:\"n\";a:2:{s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10593;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8643;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10585;}}}}}}}}}}}}}}s:1:\"F\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8970;}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8596;}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10574;}}}}}}}}}}}}s:1:\"T\";a:2:{s:1:\"e\";a:1:{s:1:\"e\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8867;}s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8612;}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10586;}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8882;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10703;}}}}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8884;}}}}}}}}}}}}}}s:1:\"U\";a:1:{s:1:\"p\";a:3:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10577;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10592;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8639;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10584;}}}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8636;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10578;}}}}}}}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8656;}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8660;}}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"s\";a:6:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8922;}}}}}}}}}}}}}s:1:\"F\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8806;}}}}}}}}}}s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8822;}}}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10913;}}}}}s:1:\"S\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10877;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8818;}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120079;}}}s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8920;}s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8666;}}}}}}}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:319;}}}}}}s:1:\"o\";a:3:{s:1:\"n\";a:1:{s:1:\"g\";a:4:{s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10229;}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10231;}}}}}}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10230;}}}}}}}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10232;}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10234;}}}}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10233;}}}}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120131;}}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:2:{s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8601;}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8600;}}}}}}}}}}}}}}}s:1:\"s\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8466;}}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8624;}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:321;}}}}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8810;}}}s:1:\"M\";a:8:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10501;}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1052;}}}s:1:\"e\";a:2:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8287;}}}}}}}}}}s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8499;}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120080;}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\"P\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8723;}}}}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120132;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8499;}}}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:924;}}}s:1:\"N\";a:9:{s:1:\"J\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1034;}}}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:323;}}}}}}s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:327;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:325;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1053;}}}s:1:\"e\";a:3:{s:1:\"g\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:3:{s:1:\"M\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8203;}}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"h\";a:1:{s:1:\"i\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8203;}}}}}}}}s:1:\"n\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8203;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"y\";a:1:{s:1:\"T\";a:1:{s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8203;}}}}}}}}}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:2:{s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8811;}}}}}}}}}}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8810;}}}}}}}}}}}}}s:1:\"w\";a:1:{s:1:\"L\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10;}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120081;}}}s:1:\"o\";a:4:{s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8288;}}}}}}s:1:\"n\";a:1:{s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"k\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:160;}}}}}}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8469;}}}s:1:\"t\";a:11:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10988;}s:1:\"C\";a:2:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8802;}}}}}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\"C\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8813;}}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8742;}}}}}}}}}}}}}}}}}}s:1:\"E\";a:3:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8713;}}}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8800;}}}}}s:1:\"x\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8708;}}}}}}}s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8815;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8817;}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8825;}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8821;}}}}}}}}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:2:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"T\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8938;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8940;}}}}}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"s\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8814;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8816;}}}}}}s:1:\"G\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8824;}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8820;}}}}}}}}}}s:1:\"P\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8832;}s:1:\"S\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8928;}}}}}}}}}}}}}}}}}}}s:1:\"R\";a:2:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"E\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8716;}}}}}}}}}}}}}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"T\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8939;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8941;}}}}}}}}}}}}}}}}}}}s:1:\"S\";a:2:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"S\";a:1:{s:1:\"u\";a:2:{s:1:\"b\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8930;}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8931;}}}}}}}}}}}}}}}}}}}s:1:\"u\";a:3:{s:1:\"b\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8840;}}}}}}}}}}s:1:\"c\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8833;}s:1:\"S\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8929;}}}}}}}}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8841;}}}}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8769;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8772;}}}}}}s:1:\"F\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8775;}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8777;}}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8740;}}}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119977;}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:209;}s:9:\"codepoint\";i:209;}}}}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:925;}}}s:1:\"O\";a:14:{s:1:\"E\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:338;}}}}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:211;}s:9:\"codepoint\";i:211;}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:212;}s:9:\"codepoint\";i:212;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1054;}}}s:1:\"d\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:336;}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120082;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:210;}s:9:\"codepoint\";i:210;}}}}}s:1:\"m\";a:3:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:332;}}}}s:1:\"e\";a:1:{s:1:\"g\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:937;}}}}s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:927;}}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120134;}}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"C\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"l\";a:1:{s:1:\"y\";a:2:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"Q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8220;}}}}}}}}}}}}s:1:\"Q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8216;}}}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10836;}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119978;}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:216;}s:9:\"codepoint\";i:216;}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:2:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:213;}s:9:\"codepoint\";i:213;}}}s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10807;}}}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:214;}s:9:\"codepoint\";i:214;}}}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:2:{s:1:\"B\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:175;}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9182;}}s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9140;}}}}}}}}s:1:\"P\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9180;}}}}}}}}}}}}}}}}s:1:\"P\";a:9:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"D\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8706;}}}}}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1055;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120083;}}}s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:934;}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:928;}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\"M\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:177;}}}}}}}}}s:1:\"o\";a:2:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8460;}}}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8473;}}}}s:1:\"r\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10939;}s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8826;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10927;}}}}}}s:1:\"S\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8828;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8830;}}}}}}}}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8243;}}}}s:1:\"o\";a:2:{s:1:\"d\";a:1:{s:1:\"u\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8719;}}}}}s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8759;}s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8733;}}}}}}}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119979;}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:936;}}}}s:1:\"Q\";a:4:{s:1:\"U\";a:1:{s:1:\"O\";a:1:{s:1:\"T\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:34;}s:9:\"codepoint\";i:34;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120084;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8474;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119980;}}}}}s:1:\"R\";a:12:{s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10512;}}}}}s:1:\"E\";a:1:{s:1:\"G\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:174;}s:9:\"codepoint\";i:174;}}s:1:\"a\";a:3:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:340;}}}}}s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10219;}}}s:1:\"r\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8608;}s:1:\"t\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10518;}}}}}}s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:344;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:342;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1056;}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8476;}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:2:{s:1:\"E\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8715;}}}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8651;}}}}}}}}}}}}s:1:\"U\";a:1:{s:1:\"p\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10607;}}}}}}}}}}}}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8476;}}}s:1:\"h\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:929;}}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:8:{s:1:\"A\";a:2:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10217;}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8594;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8677;}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8644;}}}}}}}}}}}}}}}s:1:\"C\";a:1:{s:1:\"e\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8969;}}}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:2:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"B\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10215;}}}}}}}}}}}}s:1:\"w\";a:1:{s:1:\"n\";a:2:{s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10589;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8642;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10581;}}}}}}}}}}}}}}s:1:\"F\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8971;}}}}}}s:1:\"T\";a:2:{s:1:\"e\";a:1:{s:1:\"e\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8866;}s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8614;}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10587;}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8883;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10704;}}}}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8885;}}}}}}}}}}}}}}s:1:\"U\";a:1:{s:1:\"p\";a:3:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10575;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10588;}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8638;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10580;}}}}}}}}}}}}s:1:\"V\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8640;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10579;}}}}}}}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8658;}}}}}}}}}}s:1:\"o\";a:2:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8477;}}}s:1:\"u\";a:1:{s:1:\"n\";a:1:{s:1:\"d\";a:1:{s:1:\"I\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10608;}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8667;}}}}}}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8475;}}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8625;}}}s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"D\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"y\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10740;}}}}}}}}}}}}s:1:\"S\";a:13:{s:1:\"H\";a:2:{s:1:\"C\";a:1:{s:1:\"H\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1065;}}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1064;}}}}s:1:\"O\";a:1:{s:1:\"F\";a:1:{s:1:\"T\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1068;}}}}}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:346;}}}}}}s:1:\"c\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10940;}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:352;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:350;}}}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:348;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1057;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120086;}}}s:1:\"h\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:4:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8595;}}}}}}}}}}s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8592;}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8594;}}}}}}}}}}}s:1:\"U\";a:1:{s:1:\"p\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8593;}}}}}}}}}}}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:931;}}}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"C\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8728;}}}}}}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120138;}}}}s:1:\"q\";a:2:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8730;}}}s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9633;}s:1:\"I\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8851;}}}}}}}}}}}}}s:1:\"S\";a:1:{s:1:\"u\";a:2:{s:1:\"b\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8847;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8849;}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8848;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8850;}}}}}}}}}}}}}}s:1:\"U\";a:1:{s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8852;}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119982;}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8902;}}}}s:1:\"u\";a:4:{s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8912;}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8912;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8838;}}}}}}}}}}s:1:\"c\";a:2:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"s\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8827;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10928;}}}}}}s:1:\"S\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8829;}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8831;}}}}}}}}}}}s:1:\"h\";a:1:{s:1:\"T\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8715;}}}}}}}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8721;}}s:1:\"p\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8913;}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8835;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8839;}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8913;}}}}}}}s:1:\"T\";a:11:{s:1:\"H\";a:1:{s:1:\"O\";a:1:{s:1:\"R\";a:1:{s:1:\"N\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:222;}s:9:\"codepoint\";i:222;}}}}s:1:\"R\";a:1:{s:1:\"A\";a:1:{s:1:\"D\";a:1:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8482;}}}}}s:1:\"S\";a:2:{s:1:\"H\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1035;}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1062;}}}}s:1:\"a\";a:2:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9;}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:932;}}}s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:356;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:354;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1058;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120087;}}}s:1:\"h\";a:2:{s:1:\"e\";a:2:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8756;}}}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:920;}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8201;}}}}}}}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8764;}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8771;}}}}}}s:1:\"F\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8773;}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8776;}}}}}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120139;}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8411;}}}}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119983;}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:358;}}}}}}}s:1:\"U\";a:14:{s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:218;}s:9:\"codepoint\";i:218;}}}}s:1:\"r\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8607;}s:1:\"o\";a:1:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10569;}}}}}}}}s:1:\"b\";a:1:{s:1:\"r\";a:2:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1038;}}}s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:364;}}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:219;}s:9:\"codepoint\";i:219;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1059;}}}s:1:\"d\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:368;}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120088;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:217;}s:9:\"codepoint\";i:217;}}}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:362;}}}}}s:1:\"n\";a:2:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:2:{s:1:\"B\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:818;}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9183;}}s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9141;}}}}}}}}s:1:\"P\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9181;}}}}}}}}}}}}}}}s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8899;}s:1:\"P\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8846;}}}}}}}}}s:1:\"o\";a:2:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:370;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120140;}}}}s:1:\"p\";a:8:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8593;}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10514;}}}}s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8645;}}}}}}}}}}}}}}}s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8597;}}}}}}}}}}s:1:\"E\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10606;}}}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8869;}s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8613;}}}}}}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8657;}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8661;}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:2:{s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8598;}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8599;}}}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:978;}s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:933;}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:366;}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119984;}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:360;}}}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:220;}s:9:\"codepoint\";i:220;}}}}s:1:\"V\";a:9:{s:1:\"D\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8875;}}}}}s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10987;}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1042;}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8873;}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10982;}}}}}}s:1:\"e\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8897;}}s:1:\"r\";a:3:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8214;}}}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8214;}s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:4:{s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8739;}}}}s:1:\"L\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:124;}}}}}s:1:\"S\";a:1:{s:1:\"e\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10072;}}}}}}}}}}s:1:\"T\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8768;}}}}}}}}}}}s:1:\"y\";a:1:{s:1:\"T\";a:1:{s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8202;}}}}}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120089;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120141;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119985;}}}}s:1:\"v\";a:1:{s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8874;}}}}}}}s:1:\"W\";a:5:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:372;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8896;}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120090;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120142;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119986;}}}}}s:1:\"X\";a:4:{s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120091;}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:926;}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120143;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119987;}}}}}s:1:\"Y\";a:9:{s:1:\"A\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1071;}}}}s:1:\"I\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1031;}}}}s:1:\"U\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1070;}}}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:221;}s:9:\"codepoint\";i:221;}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:374;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1067;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120092;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120144;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119988;}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:376;}}}}}s:1:\"Z\";a:8:{s:1:\"H\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1046;}}}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:377;}}}}}}s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:381;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1047;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:379;}}}}s:1:\"e\";a:2:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"W\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"S\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8203;}}}}}}}}}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:918;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8488;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8484;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119989;}}}}}s:1:\"a\";a:16:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:225;}s:9:\"codepoint\";i:225;}}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:259;}}}}}}s:1:\"c\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8766;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8767;}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:226;}s:9:\"codepoint\";i:226;}}}s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:180;}s:9:\"codepoint\";i:180;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1072;}}}s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:230;}s:9:\"codepoint\";i:230;}}}}s:1:\"f\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8289;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120094;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:224;}s:9:\"codepoint\";i:224;}}}}}s:1:\"l\";a:2:{s:1:\"e\";a:2:{s:1:\"f\";a:1:{s:1:\"s\";a:1:{s:1:\"y\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8501;}}}}}s:1:\"p\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8501;}}}}s:1:\"p\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:945;}}}}}s:1:\"m\";a:2:{s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:257;}}}s:1:\"l\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10815;}}}}s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:38;}s:9:\"codepoint\";i:38;}}s:1:\"n\";a:2:{s:1:\"d\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8743;}s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10837;}}}}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10844;}}s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10840;}}}}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10842;}}}s:1:\"g\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8736;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10660;}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8736;}}}s:1:\"m\";a:1:{s:1:\"s\";a:1:{s:1:\"d\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8737;}s:1:\"a\";a:8:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10664;}}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10665;}}s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10666;}}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10667;}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10668;}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10669;}}s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10670;}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10671;}}}}}}s:1:\"r\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8735;}s:1:\"v\";a:1:{s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8894;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10653;}}}}}}s:1:\"s\";a:2:{s:1:\"p\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8738;}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8491;}}}s:1:\"z\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9084;}}}}}}}s:1:\"o\";a:2:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:261;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120146;}}}}s:1:\"p\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8776;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10864;}}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10863;}}}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8778;}}s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8779;}}}s:1:\"o\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:39;}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8776;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8778;}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:229;}s:9:\"codepoint\";i:229;}}}}s:1:\"s\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119990;}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:42;}}s:1:\"y\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8776;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8781;}}}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:227;}s:9:\"codepoint\";i:227;}}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:228;}s:9:\"codepoint\";i:228;}}}s:1:\"w\";a:2:{s:1:\"c\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8755;}}}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10769;}}}}}}s:1:\"b\";a:16:{s:1:\"N\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10989;}}}}s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:4:{s:1:\"c\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8780;}}}}}s:1:\"e\";a:1:{s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1014;}}}}}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8245;}}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8765;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8909;}}}}}}}}s:1:\"r\";a:2:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8893;}}}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8965;}s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8965;}}}}}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9141;}s:1:\"t\";a:1:{s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9142;}}}}}}}}s:1:\"c\";a:2:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8780;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1073;}}}s:1:\"d\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8222;}}}}}s:1:\"e\";a:5:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8757;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8757;}}}}}}s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10672;}}}}}}s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1014;}}}}s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8492;}}}}}s:1:\"t\";a:3:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:946;}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8502;}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8812;}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120095;}}}s:1:\"i\";a:1:{s:1:\"g\";a:7:{s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8898;}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9711;}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8899;}}}}s:1:\"o\";a:3:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10752;}}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10753;}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10754;}}}}}}}s:1:\"s\";a:2:{s:1:\"q\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10758;}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9733;}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9661;}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9651;}}}}}}}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10756;}}}}}}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8897;}}}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8896;}}}}}}}}s:1:\"k\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10509;}}}}}}s:1:\"l\";a:3:{s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:3:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"z\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10731;}}}}}}}}s:1:\"s\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9642;}}}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9652;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9662;}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9666;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9656;}}}}}}}}}}}}}}}}s:1:\"n\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9251;}}}}s:1:\"k\";a:2:{i:1;a:2:{i:2;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9618;}}i:4;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9617;}}}i:3;a:1:{i:4;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9619;}}}}s:1:\"o\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9608;}}}}}s:1:\"n\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8976;}}}}s:1:\"o\";a:4:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120147;}}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8869;}s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8869;}}}}}s:1:\"w\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8904;}}}}}s:1:\"x\";a:12:{s:1:\"D\";a:4:{s:1:\"L\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9559;}}s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9556;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9558;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9555;}}}s:1:\"H\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9552;}s:1:\"D\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9574;}}s:1:\"U\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9577;}}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9572;}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9575;}}}s:1:\"U\";a:4:{s:1:\"L\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9565;}}s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9562;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9564;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9561;}}}s:1:\"V\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9553;}s:1:\"H\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9580;}}s:1:\"L\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9571;}}s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9568;}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9579;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9570;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9567;}}}s:1:\"b\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10697;}}}}s:1:\"d\";a:4:{s:1:\"L\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9557;}}s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9554;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9488;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9484;}}}s:1:\"h\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9472;}s:1:\"D\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9573;}}s:1:\"U\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9576;}}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9516;}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9524;}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8863;}}}}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8862;}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8864;}}}}}}s:1:\"u\";a:4:{s:1:\"L\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9563;}}s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9560;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9496;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9492;}}}s:1:\"v\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9474;}s:1:\"H\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9578;}}s:1:\"L\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9569;}}s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9566;}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9532;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9508;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9500;}}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8245;}}}}}}s:1:\"r\";a:2:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:728;}}}}s:1:\"v\";a:1:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:166;}s:9:\"codepoint\";i:166;}}}}}s:1:\"s\";a:4:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119991;}}}s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8271;}}}}s:1:\"i\";a:1:{s:1:\"m\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8765;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8909;}}}}s:1:\"o\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:92;}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10693;}}}}}s:1:\"u\";a:2:{s:1:\"l\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8226;}s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8226;}}}}}s:1:\"m\";a:1:{s:1:\"p\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8782;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10926;}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8783;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8783;}}}}}}}s:1:\"c\";a:15:{s:1:\"a\";a:3:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:263;}}}}}s:1:\"p\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8745;}s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10820;}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10825;}}}}}}s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10827;}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10823;}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10816;}}}}}s:1:\"r\";a:2:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8257;}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:711;}}}}}s:1:\"c\";a:4:{s:1:\"a\";a:2:{s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10829;}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:269;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:231;}s:9:\"codepoint\";i:231;}}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:265;}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10828;}s:1:\"s\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10832;}}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:267;}}}}s:1:\"e\";a:3:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:184;}s:9:\"codepoint\";i:184;}}}s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10674;}}}}}}s:1:\"n\";a:1:{s:1:\"t\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:162;}s:9:\"codepoint\";i:162;s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:183;}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120096;}}}s:1:\"h\";a:3:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1095;}}}s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"k\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10003;}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10003;}}}}}}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:967;}}}s:1:\"i\";a:1:{s:1:\"r\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9675;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10691;}}s:1:\"c\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:710;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8791;}}}s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8634;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8635;}}}}}}}}}}}s:1:\"d\";a:5:{s:1:\"R\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:174;}}s:1:\"S\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9416;}}s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8859;}}}}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8858;}}}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8861;}}}}}}}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8791;}}s:1:\"f\";a:1:{s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10768;}}}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10991;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10690;}}}}}}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9827;}s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9827;}}}}}}}}s:1:\"o\";a:4:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:58;}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8788;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8788;}}}}}}s:1:\"m\";a:2:{s:1:\"m\";a:1:{s:1:\"a\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:44;}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:64;}}}}s:1:\"p\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8705;}s:1:\"f\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8728;}}}s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8705;}}}}}s:1:\"x\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8450;}}}}}}}}s:1:\"n\";a:2:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8773;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10861;}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8750;}}}}}s:1:\"p\";a:3:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120148;}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8720;}}}}s:1:\"y\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:169;}s:9:\"codepoint\";i:169;s:1:\"s\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8471;}}}}}}s:1:\"r\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8629;}}}}s:1:\"o\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10007;}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119992;}}}s:1:\"u\";a:2:{s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10959;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10961;}}}s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10960;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10962;}}}}}s:1:\"t\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8943;}}}}}s:1:\"u\";a:7:{s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:2:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10552;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10549;}}}}}}s:1:\"e\";a:2:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8926;}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8927;}}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8630;}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10557;}}}}}}s:1:\"p\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8746;}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10824;}}}}}}s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10822;}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10826;}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8845;}}}}s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10821;}}}}s:1:\"r\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8631;}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10556;}}}}}s:1:\"l\";a:1:{s:1:\"y\";a:3:{s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8926;}}}}}s:1:\"s\";a:1:{s:1:\"u\";a:1:{s:1:\"c\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8927;}}}}}}}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8910;}}}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8911;}}}}}}}}s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:164;}s:9:\"codepoint\";i:164;}}}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8630;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8631;}}}}}}}}}}}}}}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8910;}}}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8911;}}}}}s:1:\"w\";a:2:{s:1:\"c\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8754;}}}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8753;}}}}}s:1:\"y\";a:1:{s:1:\"l\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9005;}}}}}}}s:1:\"d\";a:19:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8659;}}}}s:1:\"H\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10597;}}}}s:1:\"a\";a:4:{s:1:\"g\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8224;}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8504;}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8595;}}}s:1:\"s\";a:1:{s:1:\"h\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8208;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8867;}}}}}s:1:\"b\";a:2:{s:1:\"k\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10511;}}}}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:733;}}}}}s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:271;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1076;}}}s:1:\"d\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8518;}s:1:\"a\";a:2:{s:1:\"g\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8225;}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8650;}}}}s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10871;}}}}}}}s:1:\"e\";a:3:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:176;}s:9:\"codepoint\";i:176;}s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:948;}}}}s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10673;}}}}}}}s:1:\"f\";a:2:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10623;}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120097;}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8643;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8642;}}}}}s:1:\"i\";a:5:{s:1:\"a\";a:1:{s:1:\"m\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8900;}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"d\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8900;}s:1:\"s\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9830;}}}}}}}}s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9830;}}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:168;}}s:1:\"g\";a:1:{s:1:\"a\";a:1:{s:1:\"m\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:989;}}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8946;}}}}s:1:\"v\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:247;}s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:247;}s:9:\"codepoint\";i:247;s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8903;}}}}}}}}}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8903;}}}}}}s:1:\"j\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1106;}}}}s:1:\"l\";a:1:{s:1:\"c\";a:2:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8990;}}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8973;}}}}}}s:1:\"o\";a:5:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:36;}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120149;}}}s:1:\"t\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:729;}s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8784;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8785;}}}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8760;}}}}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8724;}}}}}s:1:\"s\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8865;}}}}}}}}s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8966;}}}}}}}}}}}}}s:1:\"w\";a:1:{s:1:\"n\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8595;}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8650;}}}}}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8643;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8642;}}}}}}}}}}}}}}}}s:1:\"r\";a:2:{s:1:\"b\";a:1:{s:1:\"k\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10512;}}}}}}}s:1:\"c\";a:2:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8991;}}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8972;}}}}}}s:1:\"s\";a:3:{s:1:\"c\";a:2:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119993;}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1109;}}}s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10742;}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:273;}}}}}}s:1:\"t\";a:2:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8945;}}}}s:1:\"r\";a:1:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9663;}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9662;}}}}}s:1:\"u\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8693;}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10607;}}}}}s:1:\"w\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10662;}}}}}}}s:1:\"z\";a:2:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1119;}}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10239;}}}}}}}}}s:1:\"e\";a:18:{s:1:\"D\";a:2:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10871;}}}}s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8785;}}}}s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:233;}s:9:\"codepoint\";i:233;}}}}s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10862;}}}}}}s:1:\"c\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:283;}}}}}s:1:\"i\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8790;}s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:234;}s:9:\"codepoint\";i:234;}}}s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8789;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1101;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:279;}}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8519;}}s:1:\"f\";a:2:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8786;}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120098;}}}s:1:\"g\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10906;}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:232;}s:9:\"codepoint\";i:232;}}}}s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10902;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10904;}}}}}}s:1:\"l\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10905;}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9191;}}}}}}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8467;}}s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10901;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10903;}}}}}}s:1:\"m\";a:3:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:275;}}}}s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8709;}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8709;}}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8709;}}}}}s:1:\"s\";a:1:{s:1:\"p\";a:2:{i:1;a:2:{i:3;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8196;}}i:4;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8197;}}}s:1:\";\";a:1:{s:9:\"codepoint\";i:8195;}}}}s:1:\"n\";a:2:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:331;}}s:1:\"s\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8194;}}}}s:1:\"o\";a:2:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:281;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120150;}}}}s:1:\"p\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8917;}s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10723;}}}}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10865;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1013;}s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:949;}}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:949;}}}}}s:1:\"q\";a:4:{s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8790;}}}}s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8789;}}}}}}s:1:\"s\";a:2:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8770;}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:2:{s:1:\"g\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10902;}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10901;}}}}}}}}}}s:1:\"u\";a:3:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:61;}}}}s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8799;}}}}s:1:\"i\";a:1:{s:1:\"v\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8801;}s:1:\"D\";a:1:{s:1:\"D\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10872;}}}}}}s:1:\"v\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10725;}}}}}}}}s:1:\"r\";a:2:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8787;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10609;}}}}}s:1:\"s\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8495;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8784;}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8770;}}}}s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:951;}}s:1:\"h\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:240;}s:9:\"codepoint\";i:240;}}s:1:\"u\";a:2:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:235;}s:9:\"codepoint\";i:235;}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8364;}}}}s:1:\"x\";a:3:{s:1:\"c\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:33;}}}s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8707;}}}}s:1:\"p\";a:2:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8496;}}}}}}}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8519;}}}}}}}}}}}}}s:1:\"f\";a:11:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8786;}}}}}}}}}}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1092;}}}s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9792;}}}}}}s:1:\"f\";a:3:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:64259;}}}}}s:1:\"l\";a:2:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:64256;}}}s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:64260;}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120099;}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:64257;}}}}}s:1:\"l\";a:3:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9837;}}}s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:64258;}}}}s:1:\"t\";a:1:{s:1:\"n\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9649;}}}}}s:1:\"n\";a:1:{s:1:\"o\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:402;}}}}s:1:\"o\";a:2:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120151;}}}s:1:\"r\";a:2:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8704;}}}}s:1:\"k\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8916;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10969;}}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10765;}}}}}}}}s:1:\"r\";a:2:{s:1:\"a\";a:2:{s:1:\"c\";a:6:{i:1;a:6:{i:2;a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:189;}s:9:\"codepoint\";i:189;}i:3;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8531;}}i:4;a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:188;}s:9:\"codepoint\";i:188;}i:5;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8533;}}i:6;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8537;}}i:8;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8539;}}}i:2;a:2:{i:3;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8532;}}i:5;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8534;}}}i:3;a:3:{i:4;a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:190;}s:9:\"codepoint\";i:190;}i:5;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8535;}}i:8;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8540;}}}i:4;a:1:{i:5;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8536;}}}i:5;a:2:{i:6;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8538;}}i:8;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8541;}}}i:7;a:1:{i:8;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8542;}}}}s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8260;}}}}s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8994;}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119995;}}}}}s:1:\"g\";a:16:{s:1:\"E\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8807;}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10892;}}}s:1:\"a\";a:3:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:501;}}}}}s:1:\"m\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:947;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:989;}}}}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10886;}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:287;}}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:285;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1075;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:289;}}}}s:1:\"e\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8805;}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8923;}}s:1:\"q\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8805;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8807;}}s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10878;}}}}}}}s:1:\"s\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10878;}s:1:\"c\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10921;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10880;}s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10882;}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10884;}}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10900;}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120100;}}}s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8811;}s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8921;}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8503;}}}}}s:1:\"j\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1107;}}}}s:1:\"l\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8823;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10898;}}s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10917;}}s:1:\"j\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10916;}}}s:1:\"n\";a:4:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8809;}}s:1:\"a\";a:1:{s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10890;}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10890;}}}}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10888;}s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10888;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8809;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8935;}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120152;}}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:96;}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8458;}}}s:1:\"i\";a:1:{s:1:\"m\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8819;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10894;}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10896;}}}}}s:1:\"t\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:62;}s:9:\"codepoint\";i:62;s:1:\"c\";a:2:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10919;}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10874;}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8919;}}}}s:1:\"l\";a:1:{s:1:\"P\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10645;}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10876;}}}}}}s:1:\"r\";a:5:{s:1:\"a\";a:2:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10886;}}}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10616;}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8919;}}}}s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8923;}}}}}s:1:\"q\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10892;}}}}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8823;}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8819;}}}}}}}s:1:\"h\";a:10:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8660;}}}}s:1:\"a\";a:4:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8202;}}}}}s:1:\"l\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:189;}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8459;}}}}}s:1:\"r\";a:2:{s:1:\"d\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1098;}}}}s:1:\"r\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8596;}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10568;}}}}s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8621;}}}}}s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8463;}}}}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:293;}}}}}s:1:\"e\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9829;}s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9829;}}}}}}}}s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8230;}}}}}s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8889;}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120101;}}}s:1:\"k\";a:1:{s:1:\"s\";a:2:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10533;}}}}}}s:1:\"w\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10534;}}}}}}}}s:1:\"o\";a:5:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8703;}}}}s:1:\"m\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8763;}}}}}s:1:\"o\";a:1:{s:1:\"k\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8617;}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8618;}}}}}}}}}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120153;}}}s:1:\"r\";a:1:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8213;}}}}}}s:1:\"s\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119997;}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8463;}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:295;}}}}}}s:1:\"y\";a:2:{s:1:\"b\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8259;}}}}}s:1:\"p\";a:1:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8208;}}}}}}}s:1:\"i\";a:15:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:237;}s:9:\"codepoint\";i:237;}}}}}s:1:\"c\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8291;}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:238;}s:9:\"codepoint\";i:238;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1080;}}}s:1:\"e\";a:2:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1077;}}}s:1:\"x\";a:1:{s:1:\"c\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:161;}s:9:\"codepoint\";i:161;}}}}s:1:\"f\";a:2:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8660;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120102;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:236;}s:9:\"codepoint\";i:236;}}}}}s:1:\"i\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8520;}s:1:\"i\";a:2:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10764;}}}}s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8749;}}}}s:1:\"n\";a:1:{s:1:\"f\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10716;}}}}}s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8489;}}}}}s:1:\"j\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:307;}}}}}s:1:\"m\";a:3:{s:1:\"a\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:299;}}}s:1:\"g\";a:3:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8465;}}s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8464;}}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8465;}}}}}}s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:305;}}}}s:1:\"o\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8887;}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:437;}}}}}s:1:\"n\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8712;}s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8453;}}}}}s:1:\"f\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8734;}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10717;}}}}}}}s:1:\"o\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:305;}}}}}s:1:\"t\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8747;}s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8890;}}}}s:1:\"e\";a:2:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8484;}}}}}s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8890;}}}}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10775;}}}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10812;}}}}}}}s:1:\"o\";a:4:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1105;}}}s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:303;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120154;}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:953;}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10812;}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:191;}s:9:\"codepoint\";i:191;}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119998;}}}s:1:\"i\";a:1:{s:1:\"n\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8712;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8953;}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8949;}}}}s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8948;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8947;}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8712;}}}}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8290;}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:297;}}}}}}s:1:\"u\";a:2:{s:1:\"k\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1110;}}}}s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:239;}s:9:\"codepoint\";i:239;}}}}s:1:\"j\";a:6:{s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:309;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1081;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120103;}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:567;}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120155;}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:119999;}}}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1112;}}}}}}s:1:\"u\";a:1:{s:1:\"k\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1108;}}}}}}s:1:\"k\";a:8:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:954;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1008;}}}}}}s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:311;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1082;}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120104;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:312;}}}}}}s:1:\"h\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1093;}}}}s:1:\"j\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1116;}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120156;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120000;}}}}}s:1:\"l\";a:22:{s:1:\"A\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8666;}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8656;}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10523;}}}}}}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10510;}}}}}s:1:\"E\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8806;}s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10891;}}}s:1:\"H\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10594;}}}}s:1:\"a\";a:9:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:314;}}}}}s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10676;}}}}}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8466;}}}}}s:1:\"m\";a:1:{s:1:\"b\";a:1:{s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:955;}}}}}s:1:\"n\";a:1:{s:1:\"g\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10216;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10641;}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10216;}}}}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10885;}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:171;}s:9:\"codepoint\";i:171;}}}s:1:\"r\";a:1:{s:1:\"r\";a:8:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8592;}s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8676;}s:1:\"f\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10527;}}}}s:1:\"f\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10525;}}}s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8617;}}}s:1:\"l\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8619;}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10553;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10611;}}}}s:1:\"t\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8610;}}}}}s:1:\"t\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10923;}s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10521;}}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10925;}}}}s:1:\"b\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10508;}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10098;}}}}s:1:\"r\";a:2:{s:1:\"a\";a:1:{s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:123;}}s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:91;}}}}s:1:\"k\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10635;}}s:1:\"s\";a:1:{s:1:\"l\";a:2:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10639;}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10637;}}}}}}}s:1:\"c\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:318;}}}}}s:1:\"e\";a:2:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:316;}}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8968;}}}}s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:123;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1083;}}}s:1:\"d\";a:4:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10550;}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8220;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8222;}}}}}s:1:\"r\";a:2:{s:1:\"d\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10599;}}}}}s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10571;}}}}}}}s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8626;}}}}s:1:\"e\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8804;}s:1:\"f\";a:1:{s:1:\"t\";a:5:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8592;}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8610;}}}}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8637;}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8636;}}}}}}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8647;}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8596;}s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8646;}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8651;}}}}}}}}}s:1:\"s\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8621;}}}}}}}}}}}}}}}}s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8907;}}}}}}}}}}}}}s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8922;}}s:1:\"q\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8804;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8806;}}s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10877;}}}}}}}s:1:\"s\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10877;}s:1:\"c\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10920;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10879;}s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10881;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10883;}}}}}}s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10899;}}}}s:1:\"s\";a:5:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10885;}}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8918;}}}}s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\"g\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8922;}}}}s:1:\"q\";a:1:{s:1:\"g\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10891;}}}}}}}s:1:\"g\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8822;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8818;}}}}}}}s:1:\"f\";a:3:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10620;}}}}}s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8970;}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120105;}}}s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8822;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10897;}}}s:1:\"h\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8637;}}s:1:\"u\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8636;}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10602;}}}}}s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9604;}}}}}s:1:\"j\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1113;}}}}s:1:\"l\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8810;}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8647;}}}}s:1:\"c\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8990;}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10603;}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9722;}}}}}s:1:\"m\";a:2:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:320;}}}}}s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9136;}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9136;}}}}}}}}}}s:1:\"n\";a:4:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8808;}}s:1:\"a\";a:1:{s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10889;}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10889;}}}}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10887;}s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10887;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8808;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8934;}}}}}s:1:\"o\";a:8:{s:1:\"a\";a:2:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10220;}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8701;}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10214;}}}}s:1:\"n\";a:1:{s:1:\"g\";a:3:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10229;}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10231;}}}}}}}}}}}}}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10236;}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10230;}}}}}}}}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8619;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8620;}}}}}}}}}}}}}s:1:\"p\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10629;}}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120157;}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10797;}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10804;}}}}}}s:1:\"w\";a:2:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8727;}}}}s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:95;}}}}}s:1:\"z\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9674;}s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9674;}}}}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10731;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:40;}s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10643;}}}}}}s:1:\"r\";a:5:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8646;}}}}s:1:\"c\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8991;}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8651;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10605;}}}}}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8206;}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8895;}}}}}s:1:\"s\";a:6:{s:1:\"a\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8249;}}}}}s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120001;}}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8624;}}s:1:\"i\";a:1:{s:1:\"m\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8818;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10893;}}s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10895;}}}}s:1:\"q\";a:2:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:91;}}s:1:\"u\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8216;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8218;}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:322;}}}}}}s:1:\"t\";a:9:{s:1:\";\";a:1:{s:9:\"codepoint\";i:60;}s:9:\"codepoint\";i:60;s:1:\"c\";a:2:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10918;}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10873;}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8918;}}}}s:1:\"h\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8907;}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8905;}}}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10614;}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10875;}}}}}}s:1:\"r\";a:2:{s:1:\"P\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10646;}}}}s:1:\"i\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9667;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8884;}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9666;}}}}}s:1:\"u\";a:1:{s:1:\"r\";a:2:{s:1:\"d\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10570;}}}}}}s:1:\"u\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10598;}}}}}}}}s:1:\"m\";a:14:{s:1:\"D\";a:1:{s:1:\"D\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8762;}}}}}s:1:\"a\";a:4:{s:1:\"c\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:175;}s:9:\"codepoint\";i:175;}}s:1:\"l\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9794;}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10016;}s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10016;}}}}}}s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8614;}s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8614;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8615;}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8612;}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8613;}}}}}}}s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9646;}}}}}}s:1:\"c\";a:2:{s:1:\"o\";a:1:{s:1:\"m\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10793;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1084;}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8212;}}}}}s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8737;}}}}}}}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120106;}}}s:1:\"h\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8487;}}}s:1:\"i\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:181;}s:9:\"codepoint\";i:181;}}}s:1:\"d\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8739;}s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:42;}}}}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10992;}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:183;}s:9:\"codepoint\";i:183;}}}}s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8722;}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8863;}}s:1:\"d\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8760;}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10794;}}}}}}}s:1:\"l\";a:2:{s:1:\"c\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10971;}}}s:1:\"d\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8230;}}}}s:1:\"n\";a:1:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8723;}}}}}}s:1:\"o\";a:2:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8871;}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120158;}}}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8723;}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120002;}}}s:1:\"t\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8766;}}}}}}s:1:\"u\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:956;}s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8888;}}}}}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8888;}}}}}}s:1:\"n\";a:23:{s:1:\"L\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8653;}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8654;}}}}}}}}}}}}}}}s:1:\"R\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8655;}}}}}}}}}}}s:1:\"V\";a:2:{s:1:\"D\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8879;}}}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8878;}}}}}}s:1:\"a\";a:4:{s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8711;}}}}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:324;}}}}}s:1:\"p\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8777;}s:1:\"o\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:329;}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8777;}}}}}}s:1:\"t\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9838;}s:1:\"a\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9838;}s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8469;}}}}}}}}s:1:\"b\";a:1:{s:1:\"s\";a:1:{s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:160;}s:9:\"codepoint\";i:160;}}}s:1:\"c\";a:5:{s:1:\"a\";a:2:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10819;}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:328;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:326;}}}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8775;}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10818;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1085;}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8211;}}}}}s:1:\"e\";a:6:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8800;}s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8663;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10532;}}}s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8599;}s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8599;}}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8802;}}}}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10536;}}}}}s:1:\"x\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8708;}s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8708;}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120107;}}}s:1:\"g\";a:3:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8817;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8817;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8821;}}}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8815;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8815;}}}}s:1:\"h\";a:3:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8654;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8622;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10994;}}}}}s:1:\"i\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8715;}s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8956;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8954;}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8715;}}}s:1:\"j\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1114;}}}}s:1:\"l\";a:6:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8653;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8602;}}}}s:1:\"d\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8229;}}}s:1:\"e\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8816;}s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8602;}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8622;}}}}}}}}}}}}}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8816;}}s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8814;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8820;}}}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8814;}s:1:\"r\";a:1:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8938;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8940;}}}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8740;}}}}s:1:\"o\";a:2:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120159;}}}s:1:\"t\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:172;}s:9:\"codepoint\";i:172;s:1:\"i\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8713;}s:1:\"v\";a:3:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8713;}}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8951;}}s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8950;}}}}}s:1:\"n\";a:1:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8716;}s:1:\"v\";a:3:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8716;}}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8958;}}s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8957;}}}}}}}s:1:\"p\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8742;}s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8742;}}}}}}}}s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10772;}}}}}}s:1:\"r\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8832;}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8928;}}}}s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8832;}}}}}s:1:\"r\";a:4:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8655;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8603;}}}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8603;}}}}}}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8939;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8941;}}}}}}s:1:\"s\";a:7:{s:1:\"c\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8833;}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8929;}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120003;}}}s:1:\"h\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:2:{s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8740;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8742;}}}}}}}}}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8769;}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8772;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8772;}}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8740;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8742;}}}}s:1:\"q\";a:1:{s:1:\"s\";a:1:{s:1:\"u\";a:2:{s:1:\"b\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8930;}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8931;}}}}}}s:1:\"u\";a:3:{s:1:\"b\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8836;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8840;}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8840;}}}}}}}s:1:\"c\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8833;}}}s:1:\"p\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8837;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8841;}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8841;}}}}}}}}}s:1:\"t\";a:4:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8825;}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:241;}s:9:\"codepoint\";i:241;}}}}s:1:\"l\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8824;}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8938;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8940;}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8939;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8941;}}}}}}}}}}}}}}}}s:1:\"u\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:957;}s:1:\"m\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:35;}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8470;}}}}s:1:\"s\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8199;}}}}}s:1:\"v\";a:6:{s:1:\"D\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8877;}}}}}s:1:\"H\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10500;}}}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8876;}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"f\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10718;}}}}}}s:1:\"l\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10498;}}}}}s:1:\"r\";a:1:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10499;}}}}}}s:1:\"w\";a:3:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8662;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10531;}}}s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8598;}s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8598;}}}}}}s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10535;}}}}}}}s:1:\"o\";a:18:{s:1:\"S\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9416;}}s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:243;}s:9:\"codepoint\";i:243;}}}}s:1:\"s\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8859;}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8858;}s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:244;}s:9:\"codepoint\";i:244;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1086;}}}s:1:\"d\";a:5:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8861;}}}}s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:337;}}}}}s:1:\"i\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10808;}}}s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8857;}}}s:1:\"s\";a:1:{s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10684;}}}}}}s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:339;}}}}}s:1:\"f\";a:2:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10687;}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120108;}}}s:1:\"g\";a:3:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:731;}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:242;}s:9:\"codepoint\";i:242;}}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10689;}}}s:1:\"h\";a:2:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10677;}}}}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8486;}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8750;}}}}s:1:\"l\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8634;}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10686;}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"s\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10683;}}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8254;}}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10688;}}}s:1:\"m\";a:3:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:333;}}}}s:1:\"e\";a:1:{s:1:\"g\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:969;}}}}s:1:\"i\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:959;}}}}}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10678;}}s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8854;}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120160;}}}}s:1:\"p\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10679;}}}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10681;}}}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8853;}}}}}s:1:\"r\";a:7:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8744;}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8635;}}}}s:1:\"d\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10845;}s:1:\"e\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8500;}s:1:\"o\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8500;}}}}}s:1:\"f\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:170;}s:9:\"codepoint\";i:170;}s:1:\"m\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:186;}s:9:\"codepoint\";i:186;}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8886;}}}}}s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10838;}}}s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10839;}}}}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10843;}}}s:1:\"s\";a:3:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8500;}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:248;}s:9:\"codepoint\";i:248;}}}}s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8856;}}}}s:1:\"t\";a:1:{s:1:\"i\";a:2:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:245;}s:9:\"codepoint\";i:245;}}}s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8855;}s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10806;}}}}}}}}s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:246;}s:9:\"codepoint\";i:246;}}}s:1:\"v\";a:1:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9021;}}}}}}s:1:\"p\";a:12:{s:1:\"a\";a:1:{s:1:\"r\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8741;}s:1:\"a\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:182;}s:9:\"codepoint\";i:182;s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8741;}}}}}}s:1:\"s\";a:2:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10995;}}}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:11005;}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8706;}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1087;}}}s:1:\"e\";a:1:{s:1:\"r\";a:5:{s:1:\"c\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:37;}}}}s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:46;}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8240;}}}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8869;}}s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\"n\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8241;}}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120109;}}}s:1:\"h\";a:3:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:966;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:966;}}}s:1:\"m\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8499;}}}}}s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9742;}}}}}s:1:\"i\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:960;}s:1:\"t\";a:1:{s:1:\"c\";a:1:{s:1:\"h\";a:1:{s:1:\"f\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8916;}}}}}}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:982;}}}s:1:\"l\";a:2:{s:1:\"a\";a:1:{s:1:\"n\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8463;}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8462;}}}}s:1:\"k\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8463;}}}}}s:1:\"u\";a:1:{s:1:\"s\";a:9:{s:1:\";\";a:1:{s:9:\"codepoint\";i:43;}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10787;}}}}}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8862;}}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10786;}}}}s:1:\"d\";a:2:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8724;}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10789;}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10866;}}s:1:\"m\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:177;}s:9:\"codepoint\";i:177;}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10790;}}}}s:1:\"t\";a:1:{s:1:\"w\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10791;}}}}}}}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:177;}}s:1:\"o\";a:3:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10773;}}}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120161;}}}s:1:\"u\";a:1:{s:1:\"n\";a:1:{s:1:\"d\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:163;}s:9:\"codepoint\";i:163;}}}}s:1:\"r\";a:10:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8826;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10931;}}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10935;}}}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8828;}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10927;}s:1:\"c\";a:6:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8826;}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10935;}}}}}}}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"l\";a:1:{s:1:\"y\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8828;}}}}}}}}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10927;}}}s:1:\"n\";a:3:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10937;}}}}}}}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10933;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8936;}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8830;}}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8242;}s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8473;}}}}}s:1:\"n\";a:3:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10933;}}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10937;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8936;}}}}}s:1:\"o\";a:3:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8719;}}s:1:\"f\";a:3:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9006;}}}}}s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8978;}}}}}s:1:\"s\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8979;}}}}}}s:1:\"p\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8733;}s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8733;}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8830;}}}}s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8880;}}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120005;}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:968;}}}s:1:\"u\";a:1:{s:1:\"n\";a:1:{s:1:\"c\";a:1:{s:1:\"s\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8200;}}}}}}}s:1:\"q\";a:6:{s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120110;}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10764;}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120162;}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8279;}}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120006;}}}}s:1:\"u\";a:3:{s:1:\"a\";a:1:{s:1:\"t\";a:2:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8461;}}}}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10774;}}}}}}s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:63;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8799;}}}}}}s:1:\"o\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:34;}s:9:\"codepoint\";i:34;}}}}s:1:\"r\";a:21:{s:1:\"A\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8667;}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8658;}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10524;}}}}}}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10511;}}}}}s:1:\"H\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10596;}}}}s:1:\"a\";a:7:{s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10714;}}s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:341;}}}}}s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8730;}}}}s:1:\"e\";a:1:{s:1:\"m\";a:1:{s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"y\";a:1:{s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10675;}}}}}}}s:1:\"n\";a:1:{s:1:\"g\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10217;}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10642;}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10661;}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10217;}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:187;}s:9:\"codepoint\";i:187;}}}s:1:\"r\";a:1:{s:1:\"r\";a:11:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8594;}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10613;}}}s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8677;}s:1:\"f\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10528;}}}}s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10547;}}s:1:\"f\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10526;}}}s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8618;}}}s:1:\"l\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8620;}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10565;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10612;}}}}s:1:\"t\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8611;}}}s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8605;}}}}s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10522;}}}}s:1:\"i\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8758;}s:1:\"n\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8474;}}}}}}}}}s:1:\"b\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10509;}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10099;}}}}s:1:\"r\";a:2:{s:1:\"a\";a:1:{s:1:\"c\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:125;}}s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:93;}}}}s:1:\"k\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10636;}}s:1:\"s\";a:1:{s:1:\"l\";a:2:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10638;}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10640;}}}}}}}s:1:\"c\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:345;}}}}}s:1:\"e\";a:2:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:343;}}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8969;}}}}s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:125;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1088;}}}s:1:\"d\";a:4:{s:1:\"c\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10551;}}}s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10601;}}}}}}s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8221;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8221;}}}}}s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8627;}}}}s:1:\"e\";a:3:{s:1:\"a\";a:1:{s:1:\"l\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8476;}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8475;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8476;}}}}}s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8477;}}}}s:1:\"c\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9645;}}}s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:174;}s:9:\"codepoint\";i:174;}}s:1:\"f\";a:3:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10621;}}}}}s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8971;}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120111;}}}s:1:\"h\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8641;}}s:1:\"u\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8640;}s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10604;}}}}}s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:961;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1009;}}}}s:1:\"i\";a:3:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:6:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8594;}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8611;}}}}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8641;}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8640;}}}}}}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8644;}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8652;}}}}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8649;}}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8605;}}}}}}}}}}}s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8908;}}}}}}}}}}}}}}s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:730;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8787;}}}}}}}}}}}}s:1:\"l\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8644;}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8652;}}}}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8207;}}}s:1:\"m\";a:1:{s:1:\"o\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9137;}s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9137;}}}}}}}}}}s:1:\"n\";a:1:{s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10990;}}}}}s:1:\"o\";a:4:{s:1:\"a\";a:2:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10221;}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8702;}}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10215;}}}}s:1:\"p\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10630;}}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120163;}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10798;}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10805;}}}}}}}s:1:\"p\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:41;}s:1:\"g\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10644;}}}}}s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10770;}}}}}}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8649;}}}}}s:1:\"s\";a:4:{s:1:\"a\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8250;}}}}}s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120007;}}}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8625;}}s:1:\"q\";a:2:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:93;}}s:1:\"u\";a:1:{s:1:\"o\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8217;}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8217;}}}}}}s:1:\"t\";a:3:{s:1:\"h\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8908;}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8906;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9657;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8885;}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9656;}}s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10702;}}}}}}}}s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10600;}}}}}}}s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8478;}}}s:1:\"s\";a:19:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:347;}}}}}}s:1:\"b\";a:1:{s:1:\"q\";a:1:{s:1:\"u\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8218;}}}}}s:1:\"c\";a:10:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8827;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10932;}}s:1:\"a\";a:2:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10936;}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:353;}}}}}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8829;}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10928;}s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:351;}}}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:349;}}}}s:1:\"n\";a:3:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10934;}}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10938;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8937;}}}}}s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10771;}}}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8831;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1089;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8901;}s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8865;}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10854;}}}}}s:1:\"e\";a:7:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8664;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10533;}}}s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8600;}s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8600;}}}}}}s:1:\"c\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:167;}s:9:\"codepoint\";i:167;}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:59;}}}s:1:\"s\";a:1:{s:1:\"w\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10537;}}}}}s:1:\"t\";a:1:{s:1:\"m\";a:2:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8726;}}}}}s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8726;}}}}s:1:\"x\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10038;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120112;}s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8994;}}}}}}s:1:\"h\";a:4:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9839;}}}}s:1:\"c\";a:2:{s:1:\"h\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1097;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1096;}}}s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:2:{s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8739;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8741;}}}}}}}}}}}}s:1:\"y\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:173;}s:9:\"codepoint\";i:173;}}s:1:\"i\";a:2:{s:1:\"g\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:963;}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:962;}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:962;}}}}}s:1:\"m\";a:8:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8764;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10858;}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8771;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8771;}}}s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10910;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10912;}}}s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10909;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10911;}}}s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8774;}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10788;}}}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10610;}}}}}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8592;}}}}}s:1:\"m\";a:4:{s:1:\"a\";a:2:{s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8726;}}}}}}}}}}}s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10803;}}}}}s:1:\"e\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"s\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10724;}}}}}}}s:1:\"i\";a:2:{s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8739;}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8995;}}}}s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10922;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10924;}}}}s:1:\"o\";a:3:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1100;}}}}}s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:47;}s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10692;}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9023;}}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120164;}}}}s:1:\"p\";a:1:{s:1:\"a\";a:2:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9824;}s:1:\"u\";a:1:{s:1:\"i\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9824;}}}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8741;}}}}s:1:\"q\";a:3:{s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8851;}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8852;}}}}s:1:\"s\";a:1:{s:1:\"u\";a:2:{s:1:\"b\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8847;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8849;}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8847;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8849;}}}}}}}s:1:\"p\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8848;}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8850;}}s:1:\"s\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8848;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8850;}}}}}}}}}s:1:\"u\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9633;}s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9633;}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9642;}}}}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9642;}}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8594;}}}}}s:1:\"s\";a:4:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120008;}}}s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"m\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8726;}}}}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8995;}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8902;}}}}}}s:1:\"t\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9734;}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9733;}}}}s:1:\"r\";a:2:{s:1:\"a\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:2:{s:1:\"e\";a:1:{s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1013;}}}}}}}}s:1:\"p\";a:1:{s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:981;}}}}}}}}}s:1:\"n\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:175;}}}}}s:1:\"u\";a:5:{s:1:\"b\";a:9:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8834;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10949;}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10941;}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8838;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10947;}}}}}s:1:\"m\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10945;}}}}}s:1:\"n\";a:2:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10955;}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8842;}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10943;}}}}}s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10617;}}}}}s:1:\"s\";a:3:{s:1:\"e\";a:1:{s:1:\"t\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8834;}s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8838;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10949;}}}}s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8842;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10955;}}}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10951;}}}s:1:\"u\";a:2:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10965;}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10963;}}}}}s:1:\"c\";a:1:{s:1:\"c\";a:6:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8827;}s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10936;}}}}}}}s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"r\";a:1:{s:1:\"l\";a:1:{s:1:\"y\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8829;}}}}}}}}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10928;}}}s:1:\"n\";a:3:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10938;}}}}}}}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10934;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8937;}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8831;}}}}}}s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8721;}}s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9834;}}}s:1:\"p\";a:13:{i:1;a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:185;}s:9:\"codepoint\";i:185;}i:2;a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:178;}s:9:\"codepoint\";i:178;}i:3;a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:179;}s:9:\"codepoint\";i:179;}s:1:\";\";a:1:{s:9:\"codepoint\";i:8835;}s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10950;}}s:1:\"d\";a:2:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10942;}}}s:1:\"s\";a:1:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10968;}}}}}s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8839;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10948;}}}}}s:1:\"h\";a:1:{s:1:\"s\";a:1:{s:1:\"u\";a:1:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10967;}}}}}s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10619;}}}}}s:1:\"m\";a:1:{s:1:\"u\";a:1:{s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10946;}}}}}s:1:\"n\";a:2:{s:1:\"E\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10956;}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8843;}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10944;}}}}}s:1:\"s\";a:3:{s:1:\"e\";a:1:{s:1:\"t\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8835;}s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8839;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10950;}}}}s:1:\"n\";a:1:{s:1:\"e\";a:1:{s:1:\"q\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8843;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10956;}}}}}}}s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10952;}}}s:1:\"u\";a:2:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10964;}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10966;}}}}}}s:1:\"w\";a:3:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8665;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"h\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10534;}}}s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8601;}s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8601;}}}}}}s:1:\"n\";a:1:{s:1:\"w\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10538;}}}}}}s:1:\"z\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:223;}s:9:\"codepoint\";i:223;}}}}}s:1:\"t\";a:13:{s:1:\"a\";a:2:{s:1:\"r\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8982;}}}}}s:1:\"u\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:964;}}}s:1:\"b\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9140;}}}}s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:357;}}}}}s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:355;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1090;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8411;}}}}s:1:\"e\";a:1:{s:1:\"l\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8981;}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120113;}}}s:1:\"h\";a:4:{s:1:\"e\";a:2:{s:1:\"r\";a:1:{s:1:\"e\";a:2:{i:4;a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8756;}}s:1:\"f\";a:1:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8756;}}}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:952;}s:1:\"s\";a:1:{s:1:\"y\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:977;}}}}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:977;}}}}}s:1:\"i\";a:2:{s:1:\"c\";a:1:{s:1:\"k\";a:2:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"x\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8776;}}}}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8764;}}}}}}s:1:\"n\";a:1:{s:1:\"s\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8201;}}}}}s:1:\"k\";a:2:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8776;}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8764;}}}}}s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:254;}s:9:\"codepoint\";i:254;}}}}s:1:\"i\";a:3:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:732;}}}}s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\"s\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:215;}s:9:\"codepoint\";i:215;s:1:\"b\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8864;}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10801;}}}}s:1:\"d\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10800;}}}}}s:1:\"n\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8749;}}}}s:1:\"o\";a:3:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10536;}}}s:1:\"p\";a:4:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8868;}s:1:\"b\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9014;}}}}s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10993;}}}}s:1:\"f\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120165;}s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10970;}}}}}}s:1:\"s\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10537;}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8244;}}}}}}s:1:\"r\";a:3:{s:1:\"a\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8482;}}}}s:1:\"i\";a:7:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:5:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9653;}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9663;}}}}}s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9667;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8884;}}}}}}}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8796;}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9657;}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8885;}}}}}}}}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9708;}}}}s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8796;}}s:1:\"m\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10810;}}}}}}s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10809;}}}}}s:1:\"s\";a:1:{s:1:\"b\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10701;}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10811;}}}}}}s:1:\"p\";a:1:{s:1:\"e\";a:1:{s:1:\"z\";a:1:{s:1:\"i\";a:1:{s:1:\"u\";a:1:{s:1:\"m\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9186;}}}}}}}}s:1:\"s\";a:3:{s:1:\"c\";a:2:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120009;}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1094;}}}s:1:\"h\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1115;}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:359;}}}}}}s:1:\"w\";a:2:{s:1:\"i\";a:1:{s:1:\"x\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8812;}}}}s:1:\"o\";a:1:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"d\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8606;}}}}}}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8608;}}}}}}}}}}}}}}}}}}s:1:\"u\";a:18:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8657;}}}}s:1:\"H\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10595;}}}}s:1:\"a\";a:2:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:250;}s:9:\"codepoint\";i:250;}}}}s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8593;}}}}s:1:\"b\";a:1:{s:1:\"r\";a:2:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1118;}}}s:1:\"e\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:365;}}}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:251;}s:9:\"codepoint\";i:251;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1091;}}}s:1:\"d\";a:3:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8645;}}}}s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:369;}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10606;}}}}}s:1:\"f\";a:2:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10622;}}}}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120114;}}}s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"v\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:249;}s:9:\"codepoint\";i:249;}}}}}s:1:\"h\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\"l\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8639;}}s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8638;}}}}s:1:\"b\";a:1:{s:1:\"l\";a:1:{s:1:\"k\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9600;}}}}}s:1:\"l\";a:2:{s:1:\"c\";a:2:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8988;}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8988;}}}}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8975;}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9720;}}}}}s:1:\"m\";a:2:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:363;}}}}s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:168;}s:9:\"codepoint\";i:168;}}s:1:\"o\";a:2:{s:1:\"g\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:371;}}}}s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120166;}}}}s:1:\"p\";a:6:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8593;}}}}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"n\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8597;}}}}}}}}}}s:1:\"h\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\"o\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8639;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8638;}}}}}}}}}}}}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8846;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:965;}s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:978;}}s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:965;}}}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"w\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8648;}}}}}}}}}}s:1:\"r\";a:3:{s:1:\"c\";a:2:{s:1:\"o\";a:1:{s:1:\"r\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8989;}s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8989;}}}}}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8974;}}}}}s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:367;}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9721;}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120010;}}}}s:1:\"t\";a:3:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8944;}}}}s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"d\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:361;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9653;}s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9652;}}}}}s:1:\"u\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8648;}}}}s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:252;}s:9:\"codepoint\";i:252;}}}s:1:\"w\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10663;}}}}}}}}s:1:\"v\";a:14:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8661;}}}}s:1:\"B\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10984;}s:1:\"v\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10985;}}}}}s:1:\"D\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8872;}}}}}s:1:\"a\";a:2:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10652;}}}}}s:1:\"r\";a:7:{s:1:\"e\";a:1:{s:1:\"p\";a:1:{s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"l\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:949;}}}}}}}}s:1:\"k\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\"p\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1008;}}}}}}s:1:\"n\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8709;}}}}}}}}s:1:\"p\";a:3:{s:1:\"h\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:966;}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:982;}}s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"t\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8733;}}}}}}}s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8597;}s:1:\"h\";a:1:{s:1:\"o\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1009;}}}}s:1:\"s\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:962;}}}}}}s:1:\"t\";a:2:{s:1:\"h\";a:1:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:977;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"a\";a:1:{s:1:\"n\";a:1:{s:1:\"g\";a:1:{s:1:\"l\";a:1:{s:1:\"e\";a:2:{s:1:\"l\";a:1:{s:1:\"e\";a:1:{s:1:\"f\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8882;}}}}}s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"h\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8883;}}}}}}}}}}}}}}}}s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1074;}}}s:1:\"d\";a:1:{s:1:\"a\";a:1:{s:1:\"s\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8866;}}}}}s:1:\"e\";a:3:{s:1:\"e\";a:3:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8744;}s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8891;}}}}s:1:\"e\";a:1:{s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8794;}}}}s:1:\"l\";a:1:{s:1:\"l\";a:1:{s:1:\"i\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8942;}}}}}s:1:\"r\";a:2:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:124;}}}}s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:124;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120115;}}}s:1:\"l\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8882;}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120167;}}}}s:1:\"p\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8733;}}}}}s:1:\"r\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8883;}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120011;}}}}s:1:\"z\";a:1:{s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"z\";a:1:{s:1:\"a\";a:1:{s:1:\"g\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10650;}}}}}}}}s:1:\"w\";a:7:{s:1:\"c\";a:1:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:373;}}}}}s:1:\"e\";a:2:{s:1:\"d\";a:2:{s:1:\"b\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10847;}}}}s:1:\"g\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8743;}s:1:\"q\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8793;}}}}}s:1:\"i\";a:1:{s:1:\"e\";a:1:{s:1:\"r\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8472;}}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120116;}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120168;}}}}s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8472;}}s:1:\"r\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8768;}s:1:\"e\";a:1:{s:1:\"a\";a:1:{s:1:\"t\";a:1:{s:1:\"h\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8768;}}}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120012;}}}}}s:1:\"x\";a:14:{s:1:\"c\";a:3:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8898;}}}s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9711;}}}}s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8899;}}}}s:1:\"d\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9661;}}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120117;}}}s:1:\"h\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10234;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10231;}}}}}s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:958;}}s:1:\"l\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10232;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10229;}}}}}s:1:\"m\";a:1:{s:1:\"a\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10236;}}}}s:1:\"n\";a:1:{s:1:\"i\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8955;}}}}s:1:\"o\";a:3:{s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10752;}}}}s:1:\"p\";a:2:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120169;}}s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10753;}}}}}s:1:\"t\";a:1:{s:1:\"i\";a:1:{s:1:\"m\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10754;}}}}}}s:1:\"r\";a:2:{s:1:\"A\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10233;}}}}s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10230;}}}}}s:1:\"s\";a:2:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120013;}}}s:1:\"q\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"p\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10758;}}}}}}s:1:\"u\";a:2:{s:1:\"p\";a:1:{s:1:\"l\";a:1:{s:1:\"u\";a:1:{s:1:\"s\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:10756;}}}}}s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"i\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:9651;}}}}}s:1:\"v\";a:1:{s:1:\"e\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8897;}}}}s:1:\"w\";a:1:{s:1:\"e\";a:1:{s:1:\"d\";a:1:{s:1:\"g\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8896;}}}}}}}s:1:\"y\";a:8:{s:1:\"a\";a:1:{s:1:\"c\";a:2:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:253;}s:9:\"codepoint\";i:253;}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1103;}}}}s:1:\"c\";a:2:{s:1:\"i\";a:1:{s:1:\"r\";a:1:{s:1:\"c\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:375;}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1099;}}}s:1:\"e\";a:1:{s:1:\"n\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:165;}s:9:\"codepoint\";i:165;}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120118;}}}s:1:\"i\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1111;}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120170;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120014;}}}}s:1:\"u\";a:2:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1102;}}}s:1:\"m\";a:1:{s:1:\"l\";a:2:{s:1:\";\";a:1:{s:9:\"codepoint\";i:255;}s:9:\"codepoint\";i:255;}}}}s:1:\"z\";a:10:{s:1:\"a\";a:1:{s:1:\"c\";a:1:{s:1:\"u\";a:1:{s:1:\"t\";a:1:{s:1:\"e\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:378;}}}}}}s:1:\"c\";a:2:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"o\";a:1:{s:1:\"n\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:382;}}}}}s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1079;}}}s:1:\"d\";a:1:{s:1:\"o\";a:1:{s:1:\"t\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:380;}}}}s:1:\"e\";a:2:{s:1:\"e\";a:1:{s:1:\"t\";a:1:{s:1:\"r\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8488;}}}}}s:1:\"t\";a:1:{s:1:\"a\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:950;}}}}s:1:\"f\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120119;}}}s:1:\"h\";a:1:{s:1:\"c\";a:1:{s:1:\"y\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:1078;}}}}s:1:\"i\";a:1:{s:1:\"g\";a:1:{s:1:\"r\";a:1:{s:1:\"a\";a:1:{s:1:\"r\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8669;}}}}}}}s:1:\"o\";a:1:{s:1:\"p\";a:1:{s:1:\"f\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120171;}}}}s:1:\"s\";a:1:{s:1:\"c\";a:1:{s:1:\"r\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:120015;}}}}s:1:\"w\";a:2:{s:1:\"j\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8205;}}s:1:\"n\";a:1:{s:1:\"j\";a:1:{s:1:\";\";a:1:{s:9:\"codepoint\";i:8204;}}}}}}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/CHANGELOG.md",
    "content": "# Revision History\n\n## 8.4.0\n\n### Features\n\n* Support for PHP 8.x\n* PHPDoc annotations\n* Allow usage of CSS variables inside color functions (by parsing them as regular functions)\n* Use PSR-12 code style\n* *No deprecations*\n\n### Bugfixes\n\n* Improved handling of whitespace in `calc()`\n* Fix parsing units whose prefix is also a valid unit, like `vmin`\n* Allow passing an object to `CSSList#replace`\n* Fix PHP 7.3 warnings\n* Correctly parse keyframes with `%`\n* Don’t convert large numbers to scientific notation\n* Allow a file to end after an `@import`\n* Preserve case of CSS variables as specced\n* Allow identifiers to use escapes the same way as strings\n* No longer use `eval` for the comparison in `getSelectorsBySpecificity`, in case it gets passed untrusted input (CVE-2020-13756). Also fixed in 8.3.1, 8.2.1, 8.1.1, 8.0.1, 7.0.4, 6.0.2, 5.2.1, 5.1.3, 5.0.9, 4.0.1, 3.0.1, 2.0.1, 1.0.1.\n* Prevent an infinite loop when parsing invalid grid line names\n* Remove invalid unit `vm`\n* Retain rule order after expanding shorthands\n\n### Backwards-incompatible changes\n\n* PHP ≥ 5.6 is now required\n* HHVM compatibility target dropped\n\n## 8.3.0 (2019-02-22)\n\n* Refactor parsing logic to mostly reside in the class files whose data structure is to be parsed (this should eventually allow us to unit-test specific parts of the parsing logic individually).\n* Fix error in parsing `calc` expessions when the first operand is a negative number, thanks to @raxbg.\n* Support parsing CSS4 colors in hex notation with alpha values, thanks to @raxbg.\n* Swallow more errors in lenient mode, thanks to @raxbg.\n* Allow specifying arbitrary strings to output before and after declaration blocks, thanks to @westonruter.\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 8.2.0 (2018-07-13)\n\n* Support parsing `calc()`, thanks to @raxbg.\n* Support parsing grid-lines, again thanks to @raxbg.\n* Support parsing legacy IE filters (`progid:`) in lenient mode, thanks to @FMCorz\n* Performance improvements parsing large files, again thanks to @FMCorz\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 8.1.0 (2016-07-19)\n\n* Comments are no longer silently ignored but stored with the object with which they appear (no render support, though). Thanks to @FMCorz.\n* The IE hacks using `\\0` and `\\9` can now be parsed (and rendered) in lenient mode. Thanks (again) to @FMCorz.\n* Media queries with or without spaces before the query are parsed. Still no *real* parsing support, though. Sorry…\n* PHPUnit is now listed as a dev-dependency in composer.json.\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 8.0.0 (2016-06-30)\n\n* Store source CSS line numbers in tokens and parsing exceptions.\n* *No deprecations*\n\n### Backwards-incompatible changes\n\n* Unrecoverable parser errors throw an exception of type `Sabberworm\\CSS\\Parsing\\SourceException` instead of `\\Exception`.\n\n## 7.0.3 (2016-04-27)\n\n* Fixed parsing empty CSS when multibyte is off\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 7.0.2 (2016-02-11)\n\n* 150 time performance boost thanks to @[ossinkine](https://github.com/ossinkine)\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 7.0.1 (2015-12-25)\n\n* No more suppressed `E_NOTICE`\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 7.0.0 (2015-08-24)\n\n* Compatibility with PHP 7. Well timed, eh?\n* *No deprecations*\n\n### Backwards-incompatible changes\n\n* The `Sabberworm\\CSS\\Value\\String` class has been renamed to `Sabberworm\\CSS\\Value\\CSSString`.\n\n## 6.0.1 (2015-08-24)\n\n* Remove some declarations in interfaces incompatible with PHP 5.3 (< 5.3.9)\n* *No deprecations*\n\n## 6.0.0 (2014-07-03)\n\n* Format output using Sabberworm\\CSS\\OutputFormat\n* *No backwards-incompatible changes*\n\n### Deprecations\n\n* The parse() method replaces __toString with an optional argument (instance of the OutputFormat class)\n\n## 5.2.0 (2014-06-30)\n\n* Support removing a selector from a declaration block using `$oBlock->removeSelector($mSelector)`\n* Introduce a specialized exception (Sabberworm\\CSS\\Parsing\\OuputException) for exceptions during output rendering\n\n* *No deprecations*\n\n#### Backwards-incompatible changes\n\n* Outputting a declaration block that has no selectors throws an OuputException instead of outputting an invalid ` {…}` into the CSS document.\n\n## 5.1.2 (2013-10-30)\n\n* Remove the use of consumeUntil in comment parsing. This makes it possible to parse comments such as `/** Perfectly valid **/`\n* Add fr relative size unit\n* Fix some issues with HHVM\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.1.1 (2013-10-28)\n\n* Updated CHANGELOG.md to reflect changes since 5.0.4\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.1.0 (2013-10-24)\n\n* Performance enhancements by Michael M Slusarz\n* More rescue entry points for lenient parsing (unexpected tokens between declaration blocks and unclosed comments)\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.8 (2013-08-15)\n\n* Make default settings’ multibyte parsing option dependent on whether or not the mbstring extension is actually installed.\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.7 (2013-08-04)\n\n* Fix broken decimal point output optimization\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.6 (2013-05-31)\n\n* Fix broken unit test\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.5 (2013-04-17)\n\n* Initial support for lenient parsing (setting this parser option will catch some exceptions internally and recover the parser’s state as neatly as possible).\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.4 (2013-03-21)\n\n* Don’t output floats with locale-aware separator chars\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.3 (2013-03-21)\n\n* More size units recognized\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.2 (2013-03-21)\n\n* CHANGELOG.md file added to distribution\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.1 (2013-03-20)\n\n* Internal cleanup\n* *No backwards-incompatible changes*\n* *No deprecations*\n\n## 5.0.0 (2013-03-20)\n\n* Correctly parse all known CSS 3 units (including Hz and kHz).\n* Output RGB colors in short (#aaa or #ababab) notation\n* Be case-insensitive when parsing identifiers.\n* *No deprecations*\n\n### Backwards-incompatible changes\n\n* `Sabberworm\\CSS\\Value\\Color`’s `__toString` method overrides `CSSList`’s to maybe return something other than `type(value, …)` (see above).\n\n## 4.0.0 (2013-03-19)\n\n* Support for more @-rules\n* Generic interface `Sabberworm\\CSS\\Property\\AtRule`, implemented by all @-rule classes\n* *No deprecations*\n\n### Backwards-incompatible changes\n\n* `Sabberworm\\CSS\\RuleSet\\AtRule` renamed to `Sabberworm\\CSS\\RuleSet\\AtRuleSet`\n* `Sabberworm\\CSS\\CSSList\\MediaQuery` renamed to `Sabberworm\\CSS\\RuleSet\\CSSList\\AtRuleBlockList` with differing semantics and API (which also works for other block-list-based @-rules like `@supports`).\n\n## 3.0.0 (2013-03-06)\n\n* Support for lenient parsing (on by default)\n* *No deprecations*\n\n### Backwards-incompatible changes\n\n* All properties (like whether or not to use `mb_`-functions, which default charset to use and – new – whether or not to be forgiving when parsing) are now encapsulated in an instance of `Sabberworm\\CSS\\Settings` which can be passed as the second argument to `Sabberworm\\CSS\\Parser->__construct()`.\n* Specifying a charset as the second argument to `Sabberworm\\CSS\\Parser->__construct()` is no longer supported. Use `Sabberworm\\CSS\\Settings::create()->withDefaultCharset('some-charset')` instead.\n* Setting `Sabberworm\\CSS\\Parser->bUseMbFunctions` has no effect. Use `Sabberworm\\CSS\\Settings::create()->withMultibyteSupport(true/false)` instead.\n* `Sabberworm\\CSS\\Parser->parse()` may throw a `Sabberworm\\CSS\\Parsing\\UnexpectedTokenException` when in strict parsing mode.\n\n## 2.0.0 (2013-01-29)\n\n* Allow multiple rules of the same type per rule set\n\n### Backwards-incompatible changes\n\n* `Sabberworm\\CSS\\RuleSet->getRules()` returns an index-based array instead of an associative array. Use `Sabberworm\\CSS\\RuleSet->getRulesAssoc()` (which eliminates duplicate rules and lets the later rule of the same name win).\n* `Sabberworm\\CSS\\RuleSet->removeRule()` works as it did before except when passed an instance of `Sabberworm\\CSS\\Rule\\Rule`, in which case it would only remove the exact rule given instead of all the rules of the same type. To get the old behaviour, use `Sabberworm\\CSS\\RuleSet->removeRule($oRule->getRule()`;\n\n## 1.0\n\nInitial release of a stable public API.\n\n## 0.9\n\nLast version not to use PSR-0 project organization semantics.\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2011 Raphael Schweikert, https://www.sabberworm.com/\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/README.md",
    "content": "# PHP CSS Parser\n\n[![Build Status](https://github.com/sabberworm/PHP-CSS-Parser/workflows/CI/badge.svg?branch=master)](https://github.com/sabberworm/PHP-CSS-Parser/actions/)\n\nA Parser for CSS Files written in PHP. Allows extraction of CSS files into a data structure, manipulation of said structure and output as (optimized) CSS.\n\n## Usage\n\n### Installation using Composer\n\n```bash\ncomposer require sabberworm/php-css-parser\n```\n\n### Extraction\n\nTo use the CSS Parser, create a new instance. The constructor takes the following form:\n\n```php\nnew \\Sabberworm\\CSS\\Parser($css);\n```\n\nTo read a file, for example, you’d do the following:\n\n```php\n$parser = new \\Sabberworm\\CSS\\Parser(file_get_contents('somefile.css'));\n$cssDocument = $parser->parse();\n```\n\nThe resulting CSS document structure can be manipulated prior to being output.\n\n### Options\n\n#### Charset\n\nThe charset option is used only if no `@charset` declaration is found in the CSS file. UTF-8 is the default, so you won’t have to create a settings object at all if you don’t intend to change that.\n\n```php\n$settings = \\Sabberworm\\CSS\\Settings::create()\n    ->withDefaultCharset('windows-1252');\n$parser = new \\Sabberworm\\CSS\\Parser($css, $settings);\n```\n\n#### Strict parsing\n\nTo have the parser choke on invalid rules, supply a thusly configured `\\Sabberworm\\CSS\\Settings` object:\n\n```php\n$parser = new \\Sabberworm\\CSS\\Parser(\n    file_get_contents('somefile.css'),\n    \\Sabberworm\\CSS\\Settings::create()->beStrict()\n);\n```\n\n#### Disable multibyte functions\n\nTo achieve faster parsing, you can choose to have PHP-CSS-Parser use regular string functions instead of `mb_*` functions. This should work fine in most cases, even for UTF-8 files, as all the multibyte characters are in string literals. Still it’s not recommended using this with input you have no control over as it’s not thoroughly covered by test cases.\n\n```php\n$settings = \\Sabberworm\\CSS\\Settings::create()->withMultibyteSupport(false);\n$parser = new \\Sabberworm\\CSS\\Parser($css, $settings);\n```\n\n### Manipulation\n\nThe resulting data structure consists mainly of five basic types: `CSSList`, `RuleSet`, `Rule`, `Selector` and `Value`. There are two additional types used: `Import` and `Charset`, which you won’t use often.\n\n#### CSSList\n\n`CSSList` represents a generic CSS container, most likely containing declaration blocks (rule sets with a selector), but it may also contain at-rules, charset declarations, etc. `CSSList` has the following concrete subtypes:\n\n* `Document` – representing the root of a CSS file.\n* `MediaQuery` – represents a subsection of a `CSSList` that only applies to an output device matching the contained media query.\n\nTo access the items stored in a `CSSList` – like the document you got back when calling `$parser->parse()` –, use `getContents()`, then iterate over that collection and use instanceof to check whether you’re dealing with another `CSSList`, a `RuleSet`, a `Import` or a `Charset`.\n\nTo append a new item (selector, media query, etc.) to an existing `CSSList`, construct it using the constructor for this class and use the `append($oItem)` method.\n\n#### RuleSet\n\n`RuleSet` is a container for individual rules. The most common form of a rule set is one constrained by a selector. The following concrete subtypes exist:\n\n* `AtRuleSet` – for generic at-rules which do not match the ones specifically mentioned like `@import`, `@charset` or `@media`. A common example for this is `@font-face`.\n* `DeclarationBlock` – a `RuleSet` constrained by a `Selector`; contains an array of selector objects (comma-separated in the CSS) as well as the rules to be applied to the matching elements.\n\nNote: A `CSSList` can contain other `CSSList`s (and `Import`s as well as a `Charset`), while a `RuleSet` can only contain `Rule`s.\n\nIf you want to manipulate a `RuleSet`, use the methods `addRule(Rule $rule)`, `getRules()` and `removeRule($rule)` (which accepts either a `Rule` instance or a rule name; optionally suffixed by a dash to remove all related rules).\n\n#### Rule\n\n`Rule`s just have a key (the rule) and a value. These values are all instances of a `Value`.\n\n#### Value\n\n`Value` is an abstract class that only defines the `render` method. The concrete subclasses for atomic value types are:\n\n* `Size` – consists of a numeric `size` value and a unit.\n* `Color` – colors can be input in the form #rrggbb, #rgb or schema(val1, val2, …) but are always stored as an array of ('s' => val1, 'c' => val2, 'h' => val3, …) and output in the second form.\n* `CSSString` – this is just a wrapper for quoted strings to distinguish them from keywords; always output with double quotes.\n* `URL` – URLs in CSS; always output in URL(\"\") notation.\n\nThere is another abstract subclass of `Value`, `ValueList`. A `ValueList` represents a lists of `Value`s, separated by some separation character (mostly `,`, whitespace, or `/`). There are two types of `ValueList`s:\n\n* `RuleValueList` – The default type, used to represent all multi-valued rules like `font: bold 12px/3 Helvetica, Verdana, sans-serif;` (where the value would be a whitespace-separated list of the primitive value `bold`, a slash-separated list and a comma-separated list).\n* `CSSFunction` – A special kind of value that also contains a function name and where the values are the function’s arguments. Also handles equals-sign-separated argument lists like `filter: alpha(opacity=90);`.\n\n#### Convenience methods\n\nThere are a few convenience methods on Document to ease finding, manipulating and deleting rules:\n\n* `getAllDeclarationBlocks()` – does what it says; no matter how deeply nested your selectors are. Aliased as `getAllSelectors()`.\n* `getAllRuleSets()` – does what it says; no matter how deeply nested your rule sets are.\n* `getAllValues()` – finds all `Value` objects inside `Rule`s.\n\n## To-Do\n\n* More convenience methods (like `selectorsWithElement($sId/Class/TagName)`, `attributesOfType($type)`, `removeAttributesOfType($type)`)\n* Real multibyte support. Currently, only multibyte charsets whose first 255 code points take up only one byte and are identical with ASCII are supported (yes, UTF-8 fits this description).\n* Named color support (using `Color` instead of an anonymous string literal)\n\n## Use cases\n\n### Use `Parser` to prepend an ID to all selectors\n\n```php\n$myId = \"#my_id\";\n$parser = new \\Sabberworm\\CSS\\Parser($css);\n$cssDocument = $parser->parse();\nforeach ($cssDocument->getAllDeclarationBlocks() as $block) {\n    foreach ($block->getSelectors() as $selector) {\n        // Loop over all selector parts (the comma-separated strings in a\n        // selector) and prepend the ID.\n        $selector->setSelector($myId.' '.$selector->getSelector());\n    }\n}\n```\n\n### Shrink all absolute sizes to half\n\n```php\n$parser = new \\Sabberworm\\CSS\\Parser($css);\n$cssDocument = $parser->parse();\nforeach ($cssDocument->getAllValues() as $value) {\n    if ($value instanceof CSSSize && !$value->isRelative()) {\n        $value->setSize($value->getSize() / 2);\n    }\n}\n```\n\n### Remove unwanted rules\n\n```php\n$parser = new \\Sabberworm\\CSS\\Parser($css);\n$cssDocument = $parser->parse();\nforeach($cssDocument->getAllRuleSets() as $oRuleSet) {\n    // Note that the added dash will make this remove all rules starting with\n    // `font-` (like `font-size`, `font-weight`, etc.) as well as a potential\n    // `font-rule`.\n    $oRuleSet->removeRule('font-'); \n    $oRuleSet->removeRule('cursor');\n}\n```\n\n### Output\n\nTo output the entire CSS document into a variable, just use `->render()`:\n\n```php\n$parser = new \\Sabberworm\\CSS\\Parser(file_get_contents('somefile.css'));\n$cssDocument = $parser->parse();\nprint $cssDocument->render();\n```\n\nIf you want to format the output, pass an instance of type `\\Sabberworm\\CSS\\OutputFormat`:\n\n```php\n$format = \\Sabberworm\\CSS\\OutputFormat::create()\n    ->indentWithSpaces(4)->setSpaceBetweenRules(\"\\n\");\nprint $cssDocument->render($format);\n```\n\nOr use one of the predefined formats:\n\n```php\nprint $cssDocument->render(Sabberworm\\CSS\\OutputFormat::createPretty());\nprint $cssDocument->render(Sabberworm\\CSS\\OutputFormat::createCompact());\n```\n\nTo see what you can do with output formatting, look at the tests in `tests/OutputFormatTest.php`.\n\n## Examples\n\n### Example 1 (At-Rules)\n\n#### Input\n\n```css\n@charset \"utf-8\";\n\n@font-face {\n  font-family: \"CrassRoots\";\n  src: url(\"../media/cr.ttf\");\n}\n\nhtml, body {\n    font-size: 1.6em;\n}\n\n@keyframes mymove {\n    from { top: 0px; }\n    to { top: 200px; }\n}\n\n```\n\n#### Structure (`var_dump()`)\n\n```php\nclass Sabberworm\\CSS\\CSSList\\Document#4 (2) {\n  protected $aContents =>\n  array(4) {\n    [0] =>\n    class Sabberworm\\CSS\\Property\\Charset#6 (2) {\n      private $sCharset =>\n      class Sabberworm\\CSS\\Value\\CSSString#5 (2) {\n        private $sString =>\n        string(5) \"utf-8\"\n        protected $iLineNo =>\n        int(1)\n      }\n      protected $iLineNo =>\n      int(1)\n    }\n    [1] =>\n    class Sabberworm\\CSS\\RuleSet\\AtRuleSet#7 (4) {\n      private $sType =>\n      string(9) \"font-face\"\n      private $sArgs =>\n      string(0) \"\"\n      private $aRules =>\n      array(2) {\n        'font-family' =>\n        array(1) {\n          [0] =>\n          class Sabberworm\\CSS\\Rule\\Rule#8 (4) {\n            private $sRule =>\n            string(11) \"font-family\"\n            private $mValue =>\n            class Sabberworm\\CSS\\Value\\CSSString#9 (2) {\n              private $sString =>\n              string(10) \"CrassRoots\"\n              protected $iLineNo =>\n              int(4)\n            }\n            private $bIsImportant =>\n            bool(false)\n            protected $iLineNo =>\n            int(4)\n          }\n        }\n        'src' =>\n        array(1) {\n          [0] =>\n          class Sabberworm\\CSS\\Rule\\Rule#10 (4) {\n            private $sRule =>\n            string(3) \"src\"\n            private $mValue =>\n            class Sabberworm\\CSS\\Value\\URL#11 (2) {\n              private $oURL =>\n              class Sabberworm\\CSS\\Value\\CSSString#12 (2) {\n                private $sString =>\n                string(15) \"../media/cr.ttf\"\n                protected $iLineNo =>\n                int(5)\n              }\n              protected $iLineNo =>\n              int(5)\n            }\n            private $bIsImportant =>\n            bool(false)\n            protected $iLineNo =>\n            int(5)\n          }\n        }\n      }\n      protected $iLineNo =>\n      int(3)\n    }\n    [2] =>\n    class Sabberworm\\CSS\\RuleSet\\DeclarationBlock#13 (3) {\n      private $aSelectors =>\n      array(2) {\n        [0] =>\n        class Sabberworm\\CSS\\Property\\Selector#14 (2) {\n          private $sSelector =>\n          string(4) \"html\"\n          private $iSpecificity =>\n          NULL\n        }\n        [1] =>\n        class Sabberworm\\CSS\\Property\\Selector#15 (2) {\n          private $sSelector =>\n          string(4) \"body\"\n          private $iSpecificity =>\n          NULL\n        }\n      }\n      private $aRules =>\n      array(1) {\n        'font-size' =>\n        array(1) {\n          [0] =>\n          class Sabberworm\\CSS\\Rule\\Rule#16 (4) {\n            private $sRule =>\n            string(9) \"font-size\"\n            private $mValue =>\n            class Sabberworm\\CSS\\Value\\Size#17 (4) {\n              private $fSize =>\n              double(1.6)\n              private $sUnit =>\n              string(2) \"em\"\n              private $bIsColorComponent =>\n              bool(false)\n              protected $iLineNo =>\n              int(9)\n            }\n            private $bIsImportant =>\n            bool(false)\n            protected $iLineNo =>\n            int(9)\n          }\n        }\n      }\n      protected $iLineNo =>\n      int(8)\n    }\n    [3] =>\n    class Sabberworm\\CSS\\CSSList\\KeyFrame#18 (4) {\n      private $vendorKeyFrame =>\n      string(9) \"keyframes\"\n      private $animationName =>\n      string(6) \"mymove\"\n      protected $aContents =>\n      array(2) {\n        [0] =>\n        class Sabberworm\\CSS\\RuleSet\\DeclarationBlock#19 (3) {\n          private $aSelectors =>\n          array(1) {\n            [0] =>\n            class Sabberworm\\CSS\\Property\\Selector#20 (2) {\n              private $sSelector =>\n              string(4) \"from\"\n              private $iSpecificity =>\n              NULL\n            }\n          }\n          private $aRules =>\n          array(1) {\n            'top' =>\n            array(1) {\n              [0] =>\n              class Sabberworm\\CSS\\Rule\\Rule#21 (4) {\n                private $sRule =>\n                string(3) \"top\"\n                private $mValue =>\n                class Sabberworm\\CSS\\Value\\Size#22 (4) {\n                  private $fSize =>\n                  double(0)\n                  private $sUnit =>\n                  string(2) \"px\"\n                  private $bIsColorComponent =>\n                  bool(false)\n                  protected $iLineNo =>\n                  int(13)\n                }\n                private $bIsImportant =>\n                bool(false)\n                protected $iLineNo =>\n                int(13)\n              }\n            }\n          }\n          protected $iLineNo =>\n          int(13)\n        }\n        [1] =>\n        class Sabberworm\\CSS\\RuleSet\\DeclarationBlock#23 (3) {\n          private $aSelectors =>\n          array(1) {\n            [0] =>\n            class Sabberworm\\CSS\\Property\\Selector#24 (2) {\n              private $sSelector =>\n              string(2) \"to\"\n              private $iSpecificity =>\n              NULL\n            }\n          }\n          private $aRules =>\n          array(1) {\n            'top' =>\n            array(1) {\n              [0] =>\n              class Sabberworm\\CSS\\Rule\\Rule#25 (4) {\n                private $sRule =>\n                string(3) \"top\"\n                private $mValue =>\n                class Sabberworm\\CSS\\Value\\Size#26 (4) {\n                  private $fSize =>\n                  double(200)\n                  private $sUnit =>\n                  string(2) \"px\"\n                  private $bIsColorComponent =>\n                  bool(false)\n                  protected $iLineNo =>\n                  int(14)\n                }\n                private $bIsImportant =>\n                bool(false)\n                protected $iLineNo =>\n                int(14)\n              }\n            }\n          }\n          protected $iLineNo =>\n          int(14)\n        }\n      }\n      protected $iLineNo =>\n      int(12)\n    }\n  }\n  protected $iLineNo =>\n  int(1)\n}\n\n```\n\n#### Output (`render()`)\n\n```css\n@charset \"utf-8\";\n@font-face {font-family: \"CrassRoots\";src: url(\"../media/cr.ttf\");}\nhtml, body {font-size: 1.6em;}\n@keyframes mymove {from {top: 0px;} to {top: 200px;}}\n```\n\n### Example 2 (Values)\n\n#### Input\n\n```css\n#header {\n    margin: 10px 2em 1cm 2%;\n    font-family: Verdana, Helvetica, \"Gill Sans\", sans-serif;\n    color: red !important;\n}\n\n```\n\n#### Structure (`var_dump()`)\n\n```php\nclass Sabberworm\\CSS\\CSSList\\Document#4 (2) {\n  protected $aContents =>\n  array(1) {\n    [0] =>\n    class Sabberworm\\CSS\\RuleSet\\DeclarationBlock#5 (3) {\n      private $aSelectors =>\n      array(1) {\n        [0] =>\n        class Sabberworm\\CSS\\Property\\Selector#6 (2) {\n          private $sSelector =>\n          string(7) \"#header\"\n          private $iSpecificity =>\n          NULL\n        }\n      }\n      private $aRules =>\n      array(3) {\n        'margin' =>\n        array(1) {\n          [0] =>\n          class Sabberworm\\CSS\\Rule\\Rule#7 (4) {\n            private $sRule =>\n            string(6) \"margin\"\n            private $mValue =>\n            class Sabberworm\\CSS\\Value\\RuleValueList#12 (3) {\n              protected $aComponents =>\n              array(4) {\n                [0] =>\n                class Sabberworm\\CSS\\Value\\Size#8 (4) {\n                  private $fSize =>\n                  double(10)\n                  private $sUnit =>\n                  string(2) \"px\"\n                  private $bIsColorComponent =>\n                  bool(false)\n                  protected $iLineNo =>\n                  int(2)\n                }\n                [1] =>\n                class Sabberworm\\CSS\\Value\\Size#9 (4) {\n                  private $fSize =>\n                  double(2)\n                  private $sUnit =>\n                  string(2) \"em\"\n                  private $bIsColorComponent =>\n                  bool(false)\n                  protected $iLineNo =>\n                  int(2)\n                }\n                [2] =>\n                class Sabberworm\\CSS\\Value\\Size#10 (4) {\n                  private $fSize =>\n                  double(1)\n                  private $sUnit =>\n                  string(2) \"cm\"\n                  private $bIsColorComponent =>\n                  bool(false)\n                  protected $iLineNo =>\n                  int(2)\n                }\n                [3] =>\n                class Sabberworm\\CSS\\Value\\Size#11 (4) {\n                  private $fSize =>\n                  double(2)\n                  private $sUnit =>\n                  string(1) \"%\"\n                  private $bIsColorComponent =>\n                  bool(false)\n                  protected $iLineNo =>\n                  int(2)\n                }\n              }\n              protected $sSeparator =>\n              string(1) \" \"\n              protected $iLineNo =>\n              int(2)\n            }\n            private $bIsImportant =>\n            bool(false)\n            protected $iLineNo =>\n            int(2)\n          }\n        }\n        'font-family' =>\n        array(1) {\n          [0] =>\n          class Sabberworm\\CSS\\Rule\\Rule#13 (4) {\n            private $sRule =>\n            string(11) \"font-family\"\n            private $mValue =>\n            class Sabberworm\\CSS\\Value\\RuleValueList#15 (3) {\n              protected $aComponents =>\n              array(4) {\n                [0] =>\n                string(7) \"Verdana\"\n                [1] =>\n                string(9) \"Helvetica\"\n                [2] =>\n                class Sabberworm\\CSS\\Value\\CSSString#14 (2) {\n                  private $sString =>\n                  string(9) \"Gill Sans\"\n                  protected $iLineNo =>\n                  int(3)\n                }\n                [3] =>\n                string(10) \"sans-serif\"\n              }\n              protected $sSeparator =>\n              string(1) \",\"\n              protected $iLineNo =>\n              int(3)\n            }\n            private $bIsImportant =>\n            bool(false)\n            protected $iLineNo =>\n            int(3)\n          }\n        }\n        'color' =>\n        array(1) {\n          [0] =>\n          class Sabberworm\\CSS\\Rule\\Rule#16 (4) {\n            private $sRule =>\n            string(5) \"color\"\n            private $mValue =>\n            string(3) \"red\"\n            private $bIsImportant =>\n            bool(true)\n            protected $iLineNo =>\n            int(4)\n          }\n        }\n      }\n      protected $iLineNo =>\n      int(1)\n    }\n  }\n  protected $iLineNo =>\n  int(1)\n}\n\n```\n\n#### Output (`render()`)\n\n```css\n#header {margin: 10px 2em 1cm 2%;font-family: Verdana,Helvetica,\"Gill Sans\",sans-serif;color: red !important;}\n```\n\n## Contributors/Thanks to\n\n* [oliverklee](https://github.com/oliverklee) for lots of refactorings, code modernizations and CI integrations\n* [raxbg](https://github.com/raxbg) for contributions to parse `calc`, grid lines, and various bugfixes.\n* [westonruter](https://github.com/westonruter) for bugfixes and improvements.\n* [FMCorz](https://github.com/FMCorz) for many patches and suggestions, for being able to parse comments and IE hacks (in lenient mode).\n* [Lullabot](https://github.com/Lullabot) for a patch that allows to know the line number for each parsed token.\n* [ju1ius](https://github.com/ju1ius) for the specificity parsing code and the ability to expand/compact shorthand properties.\n* [ossinkine](https://github.com/ossinkine) for a 150 time performance boost.\n* [GaryJones](https://github.com/GaryJones) for lots of input and [https://css-specificity.info/](https://css-specificity.info/).\n* [docteurklein](https://github.com/docteurklein) for output formatting and `CSSList->remove()` inspiration.\n* [nicolopignatelli](https://github.com/nicolopignatelli) for PSR-0 compatibility.\n* [diegoembarcadero](https://github.com/diegoembarcadero) for keyframe at-rule parsing.\n* [goetas](https://github.com/goetas) for @namespace at-rule support.\n* [View full list](https://github.com/sabberworm/PHP-CSS-Parser/contributors)\n\n## Misc\n\n* Legacy Support: The latest pre-PSR-0 version of this project can be checked with the `0.9.0` tag.\n* Running Tests: To run all unit tests for this project, run `composer install` to install phpunit and use `./vendor/bin/phpunit`.\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/composer.json",
    "content": "{\n    \"name\": \"sabberworm/php-css-parser\",\n    \"type\": \"library\",\n    \"description\": \"Parser for CSS Files written in PHP\",\n    \"keywords\": [\n        \"parser\",\n        \"css\",\n        \"stylesheet\"\n    ],\n    \"homepage\": \"https://www.sabberworm.com/blog/2010/6/10/php-css-parser\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Raphael Schweikert\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.6.20\",\n        \"ext-iconv\": \"*\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^4.8.36\",\n        \"codacy/coverage\": \"^1.4\"\n    },\n    \"suggest\": {\n        \"ext-mbstring\": \"for parsing UTF-8 CSS\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Sabberworm\\\\CSS\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Sabberworm\\\\CSS\\\\Tests\\\\\": \"tests/\"\n        }\n    },\n    \"scripts\": {\n        \"ci\": [\n            \"@ci:static\"\n        ],\n        \"ci:php:fixer\": \"@php ./.phive/php-cs-fixer.phar --config=config/php-cs-fixer.php fix --dry-run -v --show-progress=dots bin src tests\",\n        \"ci:php:sniffer\": \"@php ./.phive/phpcs.phar --standard=config/phpcs.xml bin src tests\",\n        \"ci:php:stan\": \"@php ./.phive/phpstan.phar --configuration=config/phpstan.neon\",\n        \"ci:static\": [\n            \"@ci:php:fixer\",\n            \"@ci:php:sniffer\",\n            \"@ci:php:stan\"\n        ],\n        \"fix:php\": [\n            \"@fix:php:fixer\",\n            \"@fix:php:sniffer\"\n        ],\n        \"fix:php:fixer\": \"@php ./.phive/php-cs-fixer.phar --config=config/php-cs-fixer.php fix bin src tests\",\n        \"fix:php:sniffer\": \"@php ./.phive/phpcbf.phar --standard=config/phpcs.xml bin src tests\",\n        \"phpstan:baseline\": \"@php ./.phive/phpstan.phar --configuration=config/phpstan.neon --generate-baseline=config/phpstan-baseline.neon\"\n    },\n    \"scripts-descriptions\": {\n        \"ci\": \"Runs all dynamic and static code checks (i.e. currently, only the static checks).\",\n        \"ci:php:fixer\": \"Checks the code style with PHP CS Fixer.\",\n        \"ci:php:sniffer\": \"Checks the code style with PHP_CodeSniffer.\",\n        \"ci:php:stan\": \"Checks the types with PHPStan.\",\n        \"ci:static\": \"Runs all static code analysis checks for the code.\",\n        \"fix:php\": \"Autofixes all autofixable issues in the PHP code.\",\n        \"fix:php:fixer\": \"Fixes autofixable issues found by PHP CS Fixer.\",\n        \"fix:php:sniffer\": \"Fixes autofixable issues found by PHP_CodeSniffer.\",\n        \"phpstand:baseline\": \"Updates the PHPStan baseline file to match the code.\"\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/CSSList/AtRuleBlockList.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\CSSList;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Property\\AtRule;\n\n/**\n * A `BlockList` constructed by an unknown at-rule. `@media` rules are rendered into `AtRuleBlockList` objects.\n */\nclass AtRuleBlockList extends CSSBlockList implements AtRule\n{\n    /**\n     * @var string\n     */\n    private $sType;\n\n    /**\n     * @var string\n     */\n    private $sArgs;\n\n    /**\n     * @param string $sType\n     * @param string $sArgs\n     * @param int $iLineNo\n     */\n    public function __construct($sType, $sArgs = '', $iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        $this->sType = $sType;\n        $this->sArgs = $sArgs;\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleName()\n    {\n        return $this->sType;\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleArgs()\n    {\n        return $this->sArgs;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sArgs = $this->sArgs;\n        if ($sArgs) {\n            $sArgs = ' ' . $sArgs;\n        }\n        $sResult = $oOutputFormat->sBeforeAtRuleBlock;\n        $sResult .= \"@{$this->sType}$sArgs{$oOutputFormat->spaceBeforeOpeningBrace()}{\";\n        $sResult .= parent::render($oOutputFormat);\n        $sResult .= '}';\n        $sResult .= $oOutputFormat->sAfterAtRuleBlock;\n        return $sResult;\n    }\n\n    /**\n     * @return bool\n     */\n    public function isRootList()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/CSSList/CSSBlockList.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\CSSList;\n\nuse Sabberworm\\CSS\\Property\\Selector;\nuse Sabberworm\\CSS\\Rule\\Rule;\nuse Sabberworm\\CSS\\RuleSet\\DeclarationBlock;\nuse Sabberworm\\CSS\\RuleSet\\RuleSet;\nuse Sabberworm\\CSS\\Value\\CSSFunction;\nuse Sabberworm\\CSS\\Value\\Value;\nuse Sabberworm\\CSS\\Value\\ValueList;\n\n/**\n * A `CSSBlockList` is a `CSSList` whose `DeclarationBlock`s are guaranteed to contain valid declaration blocks or\n * at-rules.\n *\n * Most `CSSList`s conform to this category but some at-rules (such as `@keyframes`) do not.\n */\nabstract class CSSBlockList extends CSSList\n{\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n    }\n\n    /**\n     * @param array<int, DeclarationBlock> $aResult\n     *\n     * @return void\n     */\n    protected function allDeclarationBlocks(array &$aResult)\n    {\n        foreach ($this->aContents as $mContent) {\n            if ($mContent instanceof DeclarationBlock) {\n                $aResult[] = $mContent;\n            } elseif ($mContent instanceof CSSBlockList) {\n                $mContent->allDeclarationBlocks($aResult);\n            }\n        }\n    }\n\n    /**\n     * @param array<int, RuleSet> $aResult\n     *\n     * @return void\n     */\n    protected function allRuleSets(array &$aResult)\n    {\n        foreach ($this->aContents as $mContent) {\n            if ($mContent instanceof RuleSet) {\n                $aResult[] = $mContent;\n            } elseif ($mContent instanceof CSSBlockList) {\n                $mContent->allRuleSets($aResult);\n            }\n        }\n    }\n\n    /**\n     * @param CSSList|Rule|RuleSet|Value $oElement\n     * @param array<int, Value> $aResult\n     * @param string|null $sSearchString\n     * @param bool $bSearchInFunctionArguments\n     *\n     * @return void\n     */\n    protected function allValues($oElement, array &$aResult, $sSearchString = null, $bSearchInFunctionArguments = false)\n    {\n        if ($oElement instanceof CSSBlockList) {\n            foreach ($oElement->getContents() as $oContent) {\n                $this->allValues($oContent, $aResult, $sSearchString, $bSearchInFunctionArguments);\n            }\n        } elseif ($oElement instanceof RuleSet) {\n            foreach ($oElement->getRules($sSearchString) as $oRule) {\n                $this->allValues($oRule, $aResult, $sSearchString, $bSearchInFunctionArguments);\n            }\n        } elseif ($oElement instanceof Rule) {\n            $this->allValues($oElement->getValue(), $aResult, $sSearchString, $bSearchInFunctionArguments);\n        } elseif ($oElement instanceof ValueList) {\n            if ($bSearchInFunctionArguments || !($oElement instanceof CSSFunction)) {\n                foreach ($oElement->getListComponents() as $mComponent) {\n                    $this->allValues($mComponent, $aResult, $sSearchString, $bSearchInFunctionArguments);\n                }\n            }\n        } else {\n            // Non-List `Value` or `CSSString` (CSS identifier)\n            $aResult[] = $oElement;\n        }\n    }\n\n    /**\n     * @param array<int, Selector> $aResult\n     * @param string|null $sSpecificitySearch\n     *\n     * @return void\n     */\n    protected function allSelectors(array &$aResult, $sSpecificitySearch = null)\n    {\n        /** @var array<int, DeclarationBlock> $aDeclarationBlocks */\n        $aDeclarationBlocks = [];\n        $this->allDeclarationBlocks($aDeclarationBlocks);\n        foreach ($aDeclarationBlocks as $oBlock) {\n            foreach ($oBlock->getSelectors() as $oSelector) {\n                if ($sSpecificitySearch === null) {\n                    $aResult[] = $oSelector;\n                } else {\n                    $sComparator = '===';\n                    $aSpecificitySearch = explode(' ', $sSpecificitySearch);\n                    $iTargetSpecificity = $aSpecificitySearch[0];\n                    if (count($aSpecificitySearch) > 1) {\n                        $sComparator = $aSpecificitySearch[0];\n                        $iTargetSpecificity = $aSpecificitySearch[1];\n                    }\n                    $iTargetSpecificity = (int)$iTargetSpecificity;\n                    $iSelectorSpecificity = $oSelector->getSpecificity();\n                    $bMatches = false;\n                    switch ($sComparator) {\n                        case '<=':\n                            $bMatches = $iSelectorSpecificity <= $iTargetSpecificity;\n                            break;\n                        case '<':\n                            $bMatches = $iSelectorSpecificity < $iTargetSpecificity;\n                            break;\n                        case '>=':\n                            $bMatches = $iSelectorSpecificity >= $iTargetSpecificity;\n                            break;\n                        case '>':\n                            $bMatches = $iSelectorSpecificity > $iTargetSpecificity;\n                            break;\n                        default:\n                            $bMatches = $iSelectorSpecificity === $iTargetSpecificity;\n                            break;\n                    }\n                    if ($bMatches) {\n                        $aResult[] = $oSelector;\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/CSSList/CSSList.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\CSSList;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\Comment\\Commentable;\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\SourceException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\nuse Sabberworm\\CSS\\Property\\AtRule;\nuse Sabberworm\\CSS\\Property\\Charset;\nuse Sabberworm\\CSS\\Property\\CSSNamespace;\nuse Sabberworm\\CSS\\Property\\Import;\nuse Sabberworm\\CSS\\Property\\Selector;\nuse Sabberworm\\CSS\\Renderable;\nuse Sabberworm\\CSS\\RuleSet\\AtRuleSet;\nuse Sabberworm\\CSS\\RuleSet\\DeclarationBlock;\nuse Sabberworm\\CSS\\RuleSet\\RuleSet;\nuse Sabberworm\\CSS\\Settings;\nuse Sabberworm\\CSS\\Value\\CSSString;\nuse Sabberworm\\CSS\\Value\\URL;\nuse Sabberworm\\CSS\\Value\\Value;\n\n/**\n * A `CSSList` is the most generic container available. Its contents include `RuleSet` as well as other `CSSList`\n * objects.\n *\n * Also, it may contain `Import` and `Charset` objects stemming from at-rules.\n */\nabstract class CSSList implements Renderable, Commentable\n{\n    /**\n     * @var array<array-key, Comment>\n     */\n    protected $aComments;\n\n    /**\n     * @var array<int, RuleSet|CSSList|Import|Charset>\n     */\n    protected $aContents;\n\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        $this->aComments = [];\n        $this->aContents = [];\n        $this->iLineNo = $iLineNo;\n    }\n\n    /**\n     * @return void\n     *\n     * @throws UnexpectedTokenException\n     * @throws SourceException\n     */\n    public static function parseList(ParserState $oParserState, CSSList $oList)\n    {\n        $bIsRoot = $oList instanceof Document;\n        if (is_string($oParserState)) {\n            $oParserState = new ParserState($oParserState, Settings::create());\n        }\n        $bLenientParsing = $oParserState->getSettings()->bLenientParsing;\n        while (!$oParserState->isEnd()) {\n            $comments = $oParserState->consumeWhiteSpace();\n            $oListItem = null;\n            if ($bLenientParsing) {\n                try {\n                    $oListItem = self::parseListItem($oParserState, $oList);\n                } catch (UnexpectedTokenException $e) {\n                    $oListItem = false;\n                }\n            } else {\n                $oListItem = self::parseListItem($oParserState, $oList);\n            }\n            if ($oListItem === null) {\n                // List parsing finished\n                return;\n            }\n            if ($oListItem) {\n                $oListItem->setComments($comments);\n                $oList->append($oListItem);\n            }\n            $oParserState->consumeWhiteSpace();\n        }\n        if (!$bIsRoot && !$bLenientParsing) {\n            throw new SourceException(\"Unexpected end of document\", $oParserState->currentLine());\n        }\n    }\n\n    /**\n     * @return AtRuleBlockList|KeyFrame|Charset|CSSNamespace|Import|AtRuleSet|DeclarationBlock|null|false\n     *\n     * @throws SourceException\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    private static function parseListItem(ParserState $oParserState, CSSList $oList)\n    {\n        $bIsRoot = $oList instanceof Document;\n        if ($oParserState->comes('@')) {\n            $oAtRule = self::parseAtRule($oParserState);\n            if ($oAtRule instanceof Charset) {\n                if (!$bIsRoot) {\n                    throw new UnexpectedTokenException(\n                        '@charset may only occur in root document',\n                        '',\n                        'custom',\n                        $oParserState->currentLine()\n                    );\n                }\n                if (count($oList->getContents()) > 0) {\n                    throw new UnexpectedTokenException(\n                        '@charset must be the first parseable token in a document',\n                        '',\n                        'custom',\n                        $oParserState->currentLine()\n                    );\n                }\n                $oParserState->setCharset($oAtRule->getCharset()->getString());\n            }\n            return $oAtRule;\n        } elseif ($oParserState->comes('}')) {\n            if (!$oParserState->getSettings()->bLenientParsing) {\n                throw new UnexpectedTokenException('CSS selector', '}', 'identifier', $oParserState->currentLine());\n            } else {\n                if ($bIsRoot) {\n                    if ($oParserState->getSettings()->bLenientParsing) {\n                        return DeclarationBlock::parse($oParserState);\n                    } else {\n                        throw new SourceException(\"Unopened {\", $oParserState->currentLine());\n                    }\n                } else {\n                    return null;\n                }\n            }\n        } else {\n            return DeclarationBlock::parse($oParserState, $oList);\n        }\n    }\n\n    /**\n     * @param ParserState $oParserState\n     *\n     * @return AtRuleBlockList|KeyFrame|Charset|CSSNamespace|Import|AtRuleSet|null\n     *\n     * @throws SourceException\n     * @throws UnexpectedTokenException\n     * @throws UnexpectedEOFException\n     */\n    private static function parseAtRule(ParserState $oParserState)\n    {\n        $oParserState->consume('@');\n        $sIdentifier = $oParserState->parseIdentifier();\n        $iIdentifierLineNum = $oParserState->currentLine();\n        $oParserState->consumeWhiteSpace();\n        if ($sIdentifier === 'import') {\n            $oLocation = URL::parse($oParserState);\n            $oParserState->consumeWhiteSpace();\n            $sMediaQuery = null;\n            if (!$oParserState->comes(';')) {\n                $sMediaQuery = trim($oParserState->consumeUntil([';', ParserState::EOF]));\n            }\n            $oParserState->consumeUntil([';', ParserState::EOF], true, true);\n            return new Import($oLocation, $sMediaQuery ?: null, $iIdentifierLineNum);\n        } elseif ($sIdentifier === 'charset') {\n            $sCharset = CSSString::parse($oParserState);\n            $oParserState->consumeWhiteSpace();\n            $oParserState->consumeUntil([';', ParserState::EOF], true, true);\n            return new Charset($sCharset, $iIdentifierLineNum);\n        } elseif (self::identifierIs($sIdentifier, 'keyframes')) {\n            $oResult = new KeyFrame($iIdentifierLineNum);\n            $oResult->setVendorKeyFrame($sIdentifier);\n            $oResult->setAnimationName(trim($oParserState->consumeUntil('{', false, true)));\n            CSSList::parseList($oParserState, $oResult);\n            if ($oParserState->comes('}')) {\n                $oParserState->consume('}');\n            }\n            return $oResult;\n        } elseif ($sIdentifier === 'namespace') {\n            $sPrefix = null;\n            $mUrl = Value::parsePrimitiveValue($oParserState);\n            if (!$oParserState->comes(';')) {\n                $sPrefix = $mUrl;\n                $mUrl = Value::parsePrimitiveValue($oParserState);\n            }\n            $oParserState->consumeUntil([';', ParserState::EOF], true, true);\n            if ($sPrefix !== null && !is_string($sPrefix)) {\n                throw new UnexpectedTokenException('Wrong namespace prefix', $sPrefix, 'custom', $iIdentifierLineNum);\n            }\n            if (!($mUrl instanceof CSSString || $mUrl instanceof URL)) {\n                throw new UnexpectedTokenException(\n                    'Wrong namespace url of invalid type',\n                    $mUrl,\n                    'custom',\n                    $iIdentifierLineNum\n                );\n            }\n            return new CSSNamespace($mUrl, $sPrefix, $iIdentifierLineNum);\n        } else {\n            // Unknown other at rule (font-face or such)\n            $sArgs = trim($oParserState->consumeUntil('{', false, true));\n            if (substr_count($sArgs, \"(\") != substr_count($sArgs, \")\")) {\n                if ($oParserState->getSettings()->bLenientParsing) {\n                    return null;\n                } else {\n                    throw new SourceException(\"Unmatched brace count in media query\", $oParserState->currentLine());\n                }\n            }\n            $bUseRuleSet = true;\n            foreach (explode('/', AtRule::BLOCK_RULES) as $sBlockRuleName) {\n                if (self::identifierIs($sIdentifier, $sBlockRuleName)) {\n                    $bUseRuleSet = false;\n                    break;\n                }\n            }\n            if ($bUseRuleSet) {\n                $oAtRule = new AtRuleSet($sIdentifier, $sArgs, $iIdentifierLineNum);\n                RuleSet::parseRuleSet($oParserState, $oAtRule);\n            } else {\n                $oAtRule = new AtRuleBlockList($sIdentifier, $sArgs, $iIdentifierLineNum);\n                CSSList::parseList($oParserState, $oAtRule);\n                if ($oParserState->comes('}')) {\n                    $oParserState->consume('}');\n                }\n            }\n            return $oAtRule;\n        }\n    }\n\n    /**\n     * Tests an identifier for a given value. Since identifiers are all keywords, they can be vendor-prefixed.\n     * We need to check for these versions too.\n     *\n     * @param string $sIdentifier\n     * @param string $sMatch\n     *\n     * @return bool\n     */\n    private static function identifierIs($sIdentifier, $sMatch)\n    {\n        return (strcasecmp($sIdentifier, $sMatch) === 0)\n            ?: preg_match(\"/^(-\\\\w+-)?$sMatch$/i\", $sIdentifier) === 1;\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * Prepends an item to the list of contents.\n     *\n     * @param RuleSet|CSSList|Import|Charset $oItem\n     *\n     * @return void\n     */\n    public function prepend($oItem)\n    {\n        array_unshift($this->aContents, $oItem);\n    }\n\n    /**\n     * Appends an item to tje list of contents.\n     *\n     * @param RuleSet|CSSList|Import|Charset $oItem\n     *\n     * @return void\n     */\n    public function append($oItem)\n    {\n        $this->aContents[] = $oItem;\n    }\n\n    /**\n     * Splices the list of contents.\n     *\n     * @param int $iOffset\n     * @param int $iLength\n     * @param array<int, RuleSet|CSSList|Import|Charset> $mReplacement\n     *\n     * @return void\n     */\n    public function splice($iOffset, $iLength = null, $mReplacement = null)\n    {\n        array_splice($this->aContents, $iOffset, $iLength, $mReplacement);\n    }\n\n    /**\n     * Removes an item from the CSS list.\n     *\n     * @param RuleSet|Import|Charset|CSSList $oItemToRemove\n     *        May be a RuleSet (most likely a DeclarationBlock), a Import,\n     *        a Charset or another CSSList (most likely a MediaQuery)\n     *\n     * @return bool whether the item was removed\n     */\n    public function remove($oItemToRemove)\n    {\n        $iKey = array_search($oItemToRemove, $this->aContents, true);\n        if ($iKey !== false) {\n            unset($this->aContents[$iKey]);\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Replaces an item from the CSS list.\n     *\n     * @param RuleSet|Import|Charset|CSSList $oOldItem\n     *        May be a `RuleSet` (most likely a `DeclarationBlock`), an `Import`, a `Charset`\n     *        or another `CSSList` (most likely a `MediaQuery`)\n     *\n     * @return bool\n     */\n    public function replace($oOldItem, $mNewItem)\n    {\n        $iKey = array_search($oOldItem, $this->aContents, true);\n        if ($iKey !== false) {\n            if (is_array($mNewItem)) {\n                array_splice($this->aContents, $iKey, 1, $mNewItem);\n            } else {\n                array_splice($this->aContents, $iKey, 1, [$mNewItem]);\n            }\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * @param array<int, RuleSet|Import|Charset|CSSList> $aContents\n     */\n    public function setContents(array $aContents)\n    {\n        $this->aContents = [];\n        foreach ($aContents as $content) {\n            $this->append($content);\n        }\n    }\n\n    /**\n     * Removes a declaration block from the CSS list if it matches all given selectors.\n     *\n     * @param DeclarationBlock|array<array-key, Selector>|string $mSelector the selectors to match\n     * @param bool $bRemoveAll whether to stop at the first declaration block found or remove all blocks\n     *\n     * @return void\n     */\n    public function removeDeclarationBlockBySelector($mSelector, $bRemoveAll = false)\n    {\n        if ($mSelector instanceof DeclarationBlock) {\n            $mSelector = $mSelector->getSelectors();\n        }\n        if (!is_array($mSelector)) {\n            $mSelector = explode(',', $mSelector);\n        }\n        foreach ($mSelector as $iKey => &$mSel) {\n            if (!($mSel instanceof Selector)) {\n                if (!Selector::isValid($mSel)) {\n                    throw new UnexpectedTokenException(\n                        \"Selector did not match '\" . Selector::SELECTOR_VALIDATION_RX . \"'.\",\n                        $mSel,\n                        \"custom\"\n                    );\n                }\n                $mSel = new Selector($mSel);\n            }\n        }\n        foreach ($this->aContents as $iKey => $mItem) {\n            if (!($mItem instanceof DeclarationBlock)) {\n                continue;\n            }\n            if ($mItem->getSelectors() == $mSelector) {\n                unset($this->aContents[$iKey]);\n                if (!$bRemoveAll) {\n                    return;\n                }\n            }\n        }\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sResult = '';\n        $bIsFirst = true;\n        $oNextLevel = $oOutputFormat;\n        if (!$this->isRootList()) {\n            $oNextLevel = $oOutputFormat->nextLevel();\n        }\n        foreach ($this->aContents as $oContent) {\n            $sRendered = $oOutputFormat->safely(function () use ($oNextLevel, $oContent) {\n                return $oContent->render($oNextLevel);\n            });\n            if ($sRendered === null) {\n                continue;\n            }\n            if ($bIsFirst) {\n                $bIsFirst = false;\n                $sResult .= $oNextLevel->spaceBeforeBlocks();\n            } else {\n                $sResult .= $oNextLevel->spaceBetweenBlocks();\n            }\n            $sResult .= $sRendered;\n        }\n\n        if (!$bIsFirst) {\n            // Had some output\n            $sResult .= $oOutputFormat->spaceAfterBlocks();\n        }\n\n        return $sResult;\n    }\n\n    /**\n     * Return true if the list can not be further outdented. Only important when rendering.\n     *\n     * @return bool\n     */\n    abstract public function isRootList();\n\n    /**\n     * @return array<int, RuleSet|Import|Charset|CSSList>\n     */\n    public function getContents()\n    {\n        return $this->aContents;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments)\n    {\n        $this->aComments = array_merge($this->aComments, $aComments);\n    }\n\n    /**\n     * @return array<array-key, Comment>\n     */\n    public function getComments()\n    {\n        return $this->aComments;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments)\n    {\n        $this->aComments = $aComments;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/CSSList/Document.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\CSSList;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\SourceException;\nuse Sabberworm\\CSS\\Property\\Selector;\nuse Sabberworm\\CSS\\RuleSet\\DeclarationBlock;\nuse Sabberworm\\CSS\\RuleSet\\RuleSet;\nuse Sabberworm\\CSS\\Value\\Value;\n\n/**\n * The root `CSSList` of a parsed file. Contains all top-level CSS contents, mostly declaration blocks,\n * but also any at-rules encountered.\n */\nclass Document extends CSSBlockList\n{\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n    }\n\n    /**\n     * @return Document\n     *\n     * @throws SourceException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $oDocument = new Document($oParserState->currentLine());\n        CSSList::parseList($oParserState, $oDocument);\n        return $oDocument;\n    }\n\n    /**\n     * Gets all `DeclarationBlock` objects recursively.\n     *\n     * @return array<int, DeclarationBlock>\n     */\n    public function getAllDeclarationBlocks()\n    {\n        /** @var array<int, DeclarationBlock> $aResult */\n        $aResult = [];\n        $this->allDeclarationBlocks($aResult);\n        return $aResult;\n    }\n\n    /**\n     * Gets all `DeclarationBlock` objects recursively.\n     *\n     * @return array<int, DeclarationBlock>\n     *\n     * @deprecated will be removed in version 9.0; use `getAllDeclarationBlocks()` instead\n     */\n    public function getAllSelectors()\n    {\n        return $this->getAllDeclarationBlocks();\n    }\n\n    /**\n     * Returns all `RuleSet` objects found recursively in the tree.\n     *\n     * @return array<int, RuleSet>\n     */\n    public function getAllRuleSets()\n    {\n        /** @var array<int, RuleSet> $aResult */\n        $aResult = [];\n        $this->allRuleSets($aResult);\n        return $aResult;\n    }\n\n    /**\n     * Returns all `Value` objects found recursively in the tree.\n     *\n     * @param CSSList|RuleSet|string $mElement\n     *        the `CSSList` or `RuleSet` to start the search from (defaults to the whole document).\n     *        If a string is given, it is used as rule name filter.\n     * @param bool $bSearchInFunctionArguments whether to also return Value objects used as Function arguments.\n     *\n     * @return array<int, Value>\n     *\n     * @see RuleSet->getRules()\n     */\n    public function getAllValues($mElement = null, $bSearchInFunctionArguments = false)\n    {\n        $sSearchString = null;\n        if ($mElement === null) {\n            $mElement = $this;\n        } elseif (is_string($mElement)) {\n            $sSearchString = $mElement;\n            $mElement = $this;\n        }\n        /** @var array<int, Value> $aResult */\n        $aResult = [];\n        $this->allValues($mElement, $aResult, $sSearchString, $bSearchInFunctionArguments);\n        return $aResult;\n    }\n\n    /**\n     * Returns all `Selector` objects found recursively in the tree.\n     *\n     * Note that this does not yield the full `DeclarationBlock` that the selector belongs to\n     * (and, currently, there is no way to get to that).\n     *\n     * @param string|null $sSpecificitySearch\n     *        An optional filter by specificity.\n     *        May contain a comparison operator and a number or just a number (defaults to \"==\").\n     *\n     * @return array<int, Selector>\n     * @example `getSelectorsBySpecificity('>= 100')`\n     *\n     */\n    public function getSelectorsBySpecificity($sSpecificitySearch = null)\n    {\n        /** @var array<int, Selector> $aResult */\n        $aResult = [];\n        $this->allSelectors($aResult, $sSpecificitySearch);\n        return $aResult;\n    }\n\n    /**\n     * Expands all shorthand properties to their long value.\n     *\n     * @return void\n     */\n    public function expandShorthands()\n    {\n        foreach ($this->getAllDeclarationBlocks() as $oDeclaration) {\n            $oDeclaration->expandShorthands();\n        }\n    }\n\n    /**\n     * Create shorthands properties whenever possible.\n     *\n     * @return void\n     */\n    public function createShorthands()\n    {\n        foreach ($this->getAllDeclarationBlocks() as $oDeclaration) {\n            $oDeclaration->createShorthands();\n        }\n    }\n\n    /**\n     * Overrides `render()` to make format argument optional.\n     *\n     * @param OutputFormat|null $oOutputFormat\n     *\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat = null)\n    {\n        if ($oOutputFormat === null) {\n            $oOutputFormat = new OutputFormat();\n        }\n        return parent::render($oOutputFormat);\n    }\n\n    /**\n     * @return bool\n     */\n    public function isRootList()\n    {\n        return true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/CSSList/KeyFrame.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\CSSList;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Property\\AtRule;\n\nclass KeyFrame extends CSSList implements AtRule\n{\n    /**\n     * @var string|null\n     */\n    private $vendorKeyFrame;\n\n    /**\n     * @var string|null\n     */\n    private $animationName;\n\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        $this->vendorKeyFrame = null;\n        $this->animationName = null;\n    }\n\n    /**\n     * @param string $vendorKeyFrame\n     */\n    public function setVendorKeyFrame($vendorKeyFrame)\n    {\n        $this->vendorKeyFrame = $vendorKeyFrame;\n    }\n\n    /**\n     * @return string|null\n     */\n    public function getVendorKeyFrame()\n    {\n        return $this->vendorKeyFrame;\n    }\n\n    /**\n     * @param string $animationName\n     */\n    public function setAnimationName($animationName)\n    {\n        $this->animationName = $animationName;\n    }\n\n    /**\n     * @return string|null\n     */\n    public function getAnimationName()\n    {\n        return $this->animationName;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sResult = \"@{$this->vendorKeyFrame} {$this->animationName}{$oOutputFormat->spaceBeforeOpeningBrace()}{\";\n        $sResult .= parent::render($oOutputFormat);\n        $sResult .= '}';\n        return $sResult;\n    }\n\n    /**\n     * @return bool\n     */\n    public function isRootList()\n    {\n        return false;\n    }\n\n    /**\n     * @return string|null\n     */\n    public function atRuleName()\n    {\n        return $this->vendorKeyFrame;\n    }\n\n    /**\n     * @return string|null\n     */\n    public function atRuleArgs()\n    {\n        return $this->animationName;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Comment/Comment.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Comment;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Renderable;\n\nclass Comment implements Renderable\n{\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @var string\n     */\n    protected $sComment;\n\n    /**\n     * @param string $sComment\n     * @param int $iLineNo\n     */\n    public function __construct($sComment = '', $iLineNo = 0)\n    {\n        $this->sComment = $sComment;\n        $this->iLineNo = $iLineNo;\n    }\n\n    /**\n     * @return string\n     */\n    public function getComment()\n    {\n        return $this->sComment;\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @param string $sComment\n     *\n     * @return void\n     */\n    public function setComment($sComment)\n    {\n        $this->sComment = $sComment;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return '/*' . $this->sComment . '*/';\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Comment/Commentable.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Comment;\n\ninterface Commentable\n{\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments);\n\n    /**\n     * @return array<array-key, Comment>\n     */\n    public function getComments();\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments);\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/OutputFormat.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS;\n\n/**\n * Class OutputFormat\n *\n * @method OutputFormat setSemicolonAfterLastRule(bool $bSemicolonAfterLastRule) Set whether semicolons are added after\n *     last rule.\n */\nclass OutputFormat\n{\n    /**\n     * Value format: `\"` means double-quote, `'` means single-quote\n     *\n     * @var string\n     */\n    public $sStringQuotingType = '\"';\n\n    /**\n     * Output RGB colors in hash notation if possible\n     *\n     * @var string\n     */\n    public $bRGBHashNotation = true;\n\n    /**\n     * Declaration format\n     *\n     * Semicolon after the last rule of a declaration block can be omitted. To do that, set this false.\n     *\n     * @var bool\n     */\n    public $bSemicolonAfterLastRule = true;\n\n    /**\n     * Spacing\n     * Note that these strings are not sanity-checked: the value should only consist of whitespace\n     * Any newline character will be indented according to the current level.\n     * The triples (After, Before, Between) can be set using a wildcard (e.g. `$oFormat->set('Space*Rules', \"\\n\");`)\n     */\n    public $sSpaceAfterRuleName = ' ';\n\n    /**\n     * @var string\n     */\n    public $sSpaceBeforeRules = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceAfterRules = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceBetweenRules = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceBeforeBlocks = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceAfterBlocks = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceBetweenBlocks = \"\\n\";\n\n    /**\n     * Content injected in and around at-rule blocks.\n     *\n     * @var string\n     */\n    public $sBeforeAtRuleBlock = '';\n\n    /**\n     * @var string\n     */\n    public $sAfterAtRuleBlock = '';\n\n    /**\n     * This is what’s printed before and after the comma if a declaration block contains multiple selectors.\n     *\n     * @var string\n     */\n    public $sSpaceBeforeSelectorSeparator = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceAfterSelectorSeparator = ' ';\n\n    /**\n     * This is what’s printed after the comma of value lists\n     *\n     * @var string\n     */\n    public $sSpaceBeforeListArgumentSeparator = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceAfterListArgumentSeparator = '';\n\n    /**\n     * @var string\n     */\n    public $sSpaceBeforeOpeningBrace = ' ';\n\n    /**\n     * Content injected in and around declaration blocks.\n     *\n     * @var string\n     */\n    public $sBeforeDeclarationBlock = '';\n\n    /**\n     * @var string\n     */\n    public $sAfterDeclarationBlockSelectors = '';\n\n    /**\n     * @var string\n     */\n    public $sAfterDeclarationBlock = '';\n\n    /**\n     * Indentation character(s) per level. Only applicable if newlines are used in any of the spacing settings.\n     *\n     * @var string\n     */\n    public $sIndentation = \"\\t\";\n\n    /**\n     * Output exceptions.\n     *\n     * @var bool\n     */\n    public $bIgnoreExceptions = false;\n\n    /**\n     * @var OutputFormatter|null\n     */\n    private $oFormatter = null;\n\n    /**\n     * @var OutputFormat|null\n     */\n    private $oNextLevelFormat = null;\n\n    /**\n     * @var int\n     */\n    private $iIndentationLevel = 0;\n\n    public function __construct()\n    {\n    }\n\n    /**\n     * @param string $sName\n     *\n     * @return string|null\n     */\n    public function get($sName)\n    {\n        $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i'];\n        foreach ($aVarPrefixes as $sPrefix) {\n            $sFieldName = $sPrefix . ucfirst($sName);\n            if (isset($this->$sFieldName)) {\n                return $this->$sFieldName;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * @param array<array-key, string>|string $aNames\n     * @param mixed $mValue\n     *\n     * @return self|false\n     */\n    public function set($aNames, $mValue)\n    {\n        $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i'];\n        if (is_string($aNames) && strpos($aNames, '*') !== false) {\n            $aNames =\n                [\n                    str_replace('*', 'Before', $aNames),\n                    str_replace('*', 'Between', $aNames),\n                    str_replace('*', 'After', $aNames),\n                ];\n        } elseif (!is_array($aNames)) {\n            $aNames = [$aNames];\n        }\n        foreach ($aVarPrefixes as $sPrefix) {\n            $bDidReplace = false;\n            foreach ($aNames as $sName) {\n                $sFieldName = $sPrefix . ucfirst($sName);\n                if (isset($this->$sFieldName)) {\n                    $this->$sFieldName = $mValue;\n                    $bDidReplace = true;\n                }\n            }\n            if ($bDidReplace) {\n                return $this;\n            }\n        }\n        // Break the chain so the user knows this option is invalid\n        return false;\n    }\n\n    /**\n     * @param string $sMethodName\n     * @param array<array-key, mixed> $aArguments\n     *\n     * @return mixed\n     *\n     * @throws \\Exception\n     */\n    public function __call($sMethodName, array $aArguments)\n    {\n        if (strpos($sMethodName, 'set') === 0) {\n            return $this->set(substr($sMethodName, 3), $aArguments[0]);\n        } elseif (strpos($sMethodName, 'get') === 0) {\n            return $this->get(substr($sMethodName, 3));\n        } elseif (method_exists(OutputFormatter::class, $sMethodName)) {\n            return call_user_func_array([$this->getFormatter(), $sMethodName], $aArguments);\n        } else {\n            throw new \\Exception('Unknown OutputFormat method called: ' . $sMethodName);\n        }\n    }\n\n    /**\n     * @param int $iNumber\n     *\n     * @return self\n     */\n    public function indentWithTabs($iNumber = 1)\n    {\n        return $this->setIndentation(str_repeat(\"\\t\", $iNumber));\n    }\n\n    /**\n     * @param int $iNumber\n     *\n     * @return self\n     */\n    public function indentWithSpaces($iNumber = 2)\n    {\n        return $this->setIndentation(str_repeat(\" \", $iNumber));\n    }\n\n    /**\n     * @return OutputFormat\n     */\n    public function nextLevel()\n    {\n        if ($this->oNextLevelFormat === null) {\n            $this->oNextLevelFormat = clone $this;\n            $this->oNextLevelFormat->iIndentationLevel++;\n            $this->oNextLevelFormat->oFormatter = null;\n        }\n        return $this->oNextLevelFormat;\n    }\n\n    /**\n     * @return void\n     */\n    public function beLenient()\n    {\n        $this->bIgnoreExceptions = true;\n    }\n\n    /**\n     * @return OutputFormatter\n     */\n    public function getFormatter()\n    {\n        if ($this->oFormatter === null) {\n            $this->oFormatter = new OutputFormatter($this);\n        }\n        return $this->oFormatter;\n    }\n\n    /**\n     * @return int\n     */\n    public function level()\n    {\n        return $this->iIndentationLevel;\n    }\n\n    /**\n     * Creates an instance of this class without any particular formatting settings.\n     *\n     * @return self\n     */\n    public static function create()\n    {\n        return new OutputFormat();\n    }\n\n    /**\n     * Creates an instance of this class with a preset for compact formatting.\n     *\n     * @return self\n     */\n    public static function createCompact()\n    {\n        $format = self::create();\n        $format->set('Space*Rules', \"\")->set('Space*Blocks', \"\")->setSpaceAfterRuleName('')\n            ->setSpaceBeforeOpeningBrace('')->setSpaceAfterSelectorSeparator('');\n        return $format;\n    }\n\n    /**\n     * Creates an instance of this class with a preset for pretty formatting.\n     *\n     * @return self\n     */\n    public static function createPretty()\n    {\n        $format = self::create();\n        $format->set('Space*Rules', \"\\n\")->set('Space*Blocks', \"\\n\")\n            ->setSpaceBetweenBlocks(\"\\n\\n\")->set('SpaceAfterListArgumentSeparator', ['default' => '', ',' => ' ']);\n        return $format;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/OutputFormatter.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS;\n\nuse Sabberworm\\CSS\\Parsing\\OutputException;\n\nclass OutputFormatter\n{\n    /**\n     * @var OutputFormat\n     */\n    private $oFormat;\n\n    public function __construct(OutputFormat $oFormat)\n    {\n        $this->oFormat = $oFormat;\n    }\n\n    /**\n     * @param string $sName\n     * @param string|null $sType\n     *\n     * @return string\n     */\n    public function space($sName, $sType = null)\n    {\n        $sSpaceString = $this->oFormat->get(\"Space$sName\");\n        // If $sSpaceString is an array, we have multiple values configured\n        // depending on the type of object the space applies to\n        if (is_array($sSpaceString)) {\n            if ($sType !== null && isset($sSpaceString[$sType])) {\n                $sSpaceString = $sSpaceString[$sType];\n            } else {\n                $sSpaceString = reset($sSpaceString);\n            }\n        }\n        return $this->prepareSpace($sSpaceString);\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceAfterRuleName()\n    {\n        return $this->space('AfterRuleName');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceBeforeRules()\n    {\n        return $this->space('BeforeRules');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceAfterRules()\n    {\n        return $this->space('AfterRules');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceBetweenRules()\n    {\n        return $this->space('BetweenRules');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceBeforeBlocks()\n    {\n        return $this->space('BeforeBlocks');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceAfterBlocks()\n    {\n        return $this->space('AfterBlocks');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceBetweenBlocks()\n    {\n        return $this->space('BetweenBlocks');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceBeforeSelectorSeparator()\n    {\n        return $this->space('BeforeSelectorSeparator');\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceAfterSelectorSeparator()\n    {\n        return $this->space('AfterSelectorSeparator');\n    }\n\n    /**\n     * @param string $sSeparator\n     *\n     * @return string\n     */\n    public function spaceBeforeListArgumentSeparator($sSeparator)\n    {\n        return $this->space('BeforeListArgumentSeparator', $sSeparator);\n    }\n\n    /**\n     * @param string $sSeparator\n     *\n     * @return string\n     */\n    public function spaceAfterListArgumentSeparator($sSeparator)\n    {\n        return $this->space('AfterListArgumentSeparator', $sSeparator);\n    }\n\n    /**\n     * @return string\n     */\n    public function spaceBeforeOpeningBrace()\n    {\n        return $this->space('BeforeOpeningBrace');\n    }\n\n    /**\n     * Runs the given code, either swallowing or passing exceptions, depending on the `bIgnoreExceptions` setting.\n     *\n     * @param string $cCode the name of the function to call\n     *\n     * @return string|null\n     */\n    public function safely($cCode)\n    {\n        if ($this->oFormat->get('IgnoreExceptions')) {\n            // If output exceptions are ignored, run the code with exception guards\n            try {\n                return $cCode();\n            } catch (OutputException $e) {\n                return null;\n            } // Do nothing\n        } else {\n            // Run the code as-is\n            return $cCode();\n        }\n    }\n\n    /**\n     * Clone of the `implode` function, but calls `render` with the current output format instead of `__toString()`.\n     *\n     * @param string $sSeparator\n     * @param array<array-key, Renderable|string> $aValues\n     * @param bool $bIncreaseLevel\n     *\n     * @return string\n     */\n    public function implode($sSeparator, array $aValues, $bIncreaseLevel = false)\n    {\n        $sResult = '';\n        $oFormat = $this->oFormat;\n        if ($bIncreaseLevel) {\n            $oFormat = $oFormat->nextLevel();\n        }\n        $bIsFirst = true;\n        foreach ($aValues as $mValue) {\n            if ($bIsFirst) {\n                $bIsFirst = false;\n            } else {\n                $sResult .= $sSeparator;\n            }\n            if ($mValue instanceof Renderable) {\n                $sResult .= $mValue->render($oFormat);\n            } else {\n                $sResult .= $mValue;\n            }\n        }\n        return $sResult;\n    }\n\n    /**\n     * @param string $sString\n     *\n     * @return string\n     */\n    public function removeLastSemicolon($sString)\n    {\n        if ($this->oFormat->get('SemicolonAfterLastRule')) {\n            return $sString;\n        }\n        $sString = explode(';', $sString);\n        if (count($sString) < 2) {\n            return $sString[0];\n        }\n        $sLast = array_pop($sString);\n        $sNextToLast = array_pop($sString);\n        array_push($sString, $sNextToLast . $sLast);\n        return implode(';', $sString);\n    }\n\n    /**\n     * @param string $sSpaceString\n     *\n     * @return string\n     */\n    private function prepareSpace($sSpaceString)\n    {\n        return str_replace(\"\\n\", \"\\n\" . $this->indent(), $sSpaceString);\n    }\n\n    /**\n     * @return string\n     */\n    private function indent()\n    {\n        return str_repeat($this->oFormat->sIndentation, $this->oFormat->level());\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Parser.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS;\n\nuse Sabberworm\\CSS\\CSSList\\Document;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\SourceException;\n\n/**\n * This class parses CSS from text into a data structure.\n */\nclass Parser\n{\n    /**\n     * @var ParserState\n     */\n    private $oParserState;\n\n    /**\n     * @param string $sText\n     * @param Settings|null $oParserSettings\n     * @param int $iLineNo the line number (starting from 1, not from 0)\n     */\n    public function __construct($sText, Settings $oParserSettings = null, $iLineNo = 1)\n    {\n        if ($oParserSettings === null) {\n            $oParserSettings = Settings::create();\n        }\n        $this->oParserState = new ParserState($sText, $oParserSettings, $iLineNo);\n    }\n\n    /**\n     * @param string $sCharset\n     *\n     * @return void\n     */\n    public function setCharset($sCharset)\n    {\n        $this->oParserState->setCharset($sCharset);\n    }\n\n    /**\n     * @return void\n     */\n    public function getCharset()\n    {\n        // Note: The `return` statement is missing here. This is a bug that needs to be fixed.\n        $this->oParserState->getCharset();\n    }\n\n    /**\n     * @return Document\n     *\n     * @throws SourceException\n     */\n    public function parse()\n    {\n        return Document::parse($this->oParserState);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Parsing/OutputException.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Parsing;\n\n/**\n * Thrown if the CSS parser attempts to print something invalid.\n */\nclass OutputException extends SourceException\n{\n    /**\n     * @param string $sMessage\n     * @param int $iLineNo\n     */\n    public function __construct($sMessage, $iLineNo = 0)\n    {\n        parent::__construct($sMessage, $iLineNo);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Parsing/ParserState.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Parsing;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\Settings;\n\nclass ParserState\n{\n    /**\n     * @var null\n     */\n    const EOF = null;\n\n    /**\n     * @var Settings\n     */\n    private $oParserSettings;\n\n    /**\n     * @var string\n     */\n    private $sText;\n\n    /**\n     * @var array<int, string>\n     */\n    private $aText;\n\n    /**\n     * @var int\n     */\n    private $iCurrentPosition;\n\n    /**\n     * @var string\n     */\n    private $sCharset;\n\n    /**\n     * @var int\n     */\n    private $iLength;\n\n    /**\n     * @var int\n     */\n    private $iLineNo;\n\n    /**\n     * @param string $sText\n     * @param int $iLineNo\n     */\n    public function __construct($sText, Settings $oParserSettings, $iLineNo = 1)\n    {\n        $this->oParserSettings = $oParserSettings;\n        $this->sText = $sText;\n        $this->iCurrentPosition = 0;\n        $this->iLineNo = $iLineNo;\n        $this->setCharset($this->oParserSettings->sDefaultCharset);\n    }\n\n    /**\n     * @param string $sCharset\n     *\n     * @return void\n     */\n    public function setCharset($sCharset)\n    {\n        $this->sCharset = $sCharset;\n        $this->aText = $this->strsplit($this->sText);\n        if (is_array($this->aText)) {\n            $this->iLength = count($this->aText);\n        }\n    }\n\n    /**\n     * @return string\n     */\n    public function getCharset()\n    {\n        return $this->sCharset;\n    }\n\n    /**\n     * @return int\n     */\n    public function currentLine()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @return int\n     */\n    public function currentColumn()\n    {\n        return $this->iCurrentPosition;\n    }\n\n    /**\n     * @return Settings\n     */\n    public function getSettings()\n    {\n        return $this->oParserSettings;\n    }\n\n    /**\n     * @param bool $bIgnoreCase\n     *\n     * @return string\n     *\n     * @throws UnexpectedTokenException\n     */\n    public function parseIdentifier($bIgnoreCase = true)\n    {\n        $sResult = $this->parseCharacter(true);\n        if ($sResult === null) {\n            throw new UnexpectedTokenException($sResult, $this->peek(5), 'identifier', $this->iLineNo);\n        }\n        $sCharacter = null;\n        while (($sCharacter = $this->parseCharacter(true)) !== null) {\n            if (preg_match('/[a-zA-Z0-9\\x{00A0}-\\x{FFFF}_-]/Sux', $sCharacter)) {\n                $sResult .= $sCharacter;\n            } else {\n                $sResult .= '\\\\' . $sCharacter;\n            }\n        }\n        if ($bIgnoreCase) {\n            $sResult = $this->strtolower($sResult);\n        }\n        return $sResult;\n    }\n\n    /**\n     * @param bool $bIsForIdentifier\n     *\n     * @return string|null\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public function parseCharacter($bIsForIdentifier)\n    {\n        if ($this->peek() === '\\\\') {\n            if (\n                $bIsForIdentifier && $this->oParserSettings->bLenientParsing\n                && ($this->comes('\\0') || $this->comes('\\9'))\n            ) {\n                // Non-strings can contain \\0 or \\9 which is an IE hack supported in lenient parsing.\n                return null;\n            }\n            $this->consume('\\\\');\n            if ($this->comes('\\n') || $this->comes('\\r')) {\n                return '';\n            }\n            if (preg_match('/[0-9a-fA-F]/Su', $this->peek()) === 0) {\n                return $this->consume(1);\n            }\n            $sUnicode = $this->consumeExpression('/^[0-9a-fA-F]{1,6}/u', 6);\n            if ($this->strlen($sUnicode) < 6) {\n                // Consume whitespace after incomplete unicode escape\n                if (preg_match('/\\\\s/isSu', $this->peek())) {\n                    if ($this->comes('\\r\\n')) {\n                        $this->consume(2);\n                    } else {\n                        $this->consume(1);\n                    }\n                }\n            }\n            $iUnicode = intval($sUnicode, 16);\n            $sUtf32 = \"\";\n            for ($i = 0; $i < 4; ++$i) {\n                $sUtf32 .= chr($iUnicode & 0xff);\n                $iUnicode = $iUnicode >> 8;\n            }\n            return iconv('utf-32le', $this->sCharset, $sUtf32);\n        }\n        if ($bIsForIdentifier) {\n            $peek = ord($this->peek());\n            // Ranges: a-z A-Z 0-9 - _\n            if (\n                ($peek >= 97 && $peek <= 122)\n                || ($peek >= 65 && $peek <= 90)\n                || ($peek >= 48 && $peek <= 57)\n                || ($peek === 45)\n                || ($peek === 95)\n                || ($peek > 0xa1)\n            ) {\n                return $this->consume(1);\n            }\n        } else {\n            return $this->consume(1);\n        }\n        return null;\n    }\n\n    /**\n     * @return array<int, Comment>|void\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public function consumeWhiteSpace()\n    {\n        $comments = [];\n        do {\n            while (preg_match('/\\\\s/isSu', $this->peek()) === 1) {\n                $this->consume(1);\n            }\n            if ($this->oParserSettings->bLenientParsing) {\n                try {\n                    $oComment = $this->consumeComment();\n                } catch (UnexpectedEOFException $e) {\n                    $this->iCurrentPosition = $this->iLength;\n                    return;\n                }\n            } else {\n                $oComment = $this->consumeComment();\n            }\n            if ($oComment !== false) {\n                $comments[] = $oComment;\n            }\n        } while ($oComment !== false);\n        return $comments;\n    }\n\n    /**\n     * @param string $sString\n     * @param bool $bCaseInsensitive\n     *\n     * @return bool\n     */\n    public function comes($sString, $bCaseInsensitive = false)\n    {\n        $sPeek = $this->peek(strlen($sString));\n        return ($sPeek == '')\n            ? false\n            : $this->streql($sPeek, $sString, $bCaseInsensitive);\n    }\n\n    /**\n     * @param int $iLength\n     * @param int $iOffset\n     *\n     * @return string\n     */\n    public function peek($iLength = 1, $iOffset = 0)\n    {\n        $iOffset += $this->iCurrentPosition;\n        if ($iOffset >= $this->iLength) {\n            return '';\n        }\n        return $this->substr($iOffset, $iLength);\n    }\n\n    /**\n     * @param int $mValue\n     *\n     * @return string\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public function consume($mValue = 1)\n    {\n        if (is_string($mValue)) {\n            $iLineCount = substr_count($mValue, \"\\n\");\n            $iLength = $this->strlen($mValue);\n            if (!$this->streql($this->substr($this->iCurrentPosition, $iLength), $mValue)) {\n                throw new UnexpectedTokenException($mValue, $this->peek(max($iLength, 5)), $this->iLineNo);\n            }\n            $this->iLineNo += $iLineCount;\n            $this->iCurrentPosition += $this->strlen($mValue);\n            return $mValue;\n        } else {\n            if ($this->iCurrentPosition + $mValue > $this->iLength) {\n                throw new UnexpectedEOFException($mValue, $this->peek(5), 'count', $this->iLineNo);\n            }\n            $sResult = $this->substr($this->iCurrentPosition, $mValue);\n            $iLineCount = substr_count($sResult, \"\\n\");\n            $this->iLineNo += $iLineCount;\n            $this->iCurrentPosition += $mValue;\n            return $sResult;\n        }\n    }\n\n    /**\n     * @param string $mExpression\n     * @param int|null $iMaxLength\n     *\n     * @return string\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public function consumeExpression($mExpression, $iMaxLength = null)\n    {\n        $aMatches = null;\n        $sInput = $iMaxLength !== null ? $this->peek($iMaxLength) : $this->inputLeft();\n        if (preg_match($mExpression, $sInput, $aMatches, PREG_OFFSET_CAPTURE) === 1) {\n            return $this->consume($aMatches[0][0]);\n        }\n        throw new UnexpectedTokenException($mExpression, $this->peek(5), 'expression', $this->iLineNo);\n    }\n\n    /**\n     * @return Comment|false\n     */\n    public function consumeComment()\n    {\n        $mComment = false;\n        if ($this->comes('/*')) {\n            $iLineNo = $this->iLineNo;\n            $this->consume(1);\n            $mComment = '';\n            while (($char = $this->consume(1)) !== '') {\n                $mComment .= $char;\n                if ($this->comes('*/')) {\n                    $this->consume(2);\n                    break;\n                }\n            }\n        }\n\n        if ($mComment !== false) {\n            // We skip the * which was included in the comment.\n            return new Comment(substr($mComment, 1), $iLineNo);\n        }\n\n        return $mComment;\n    }\n\n    /**\n     * @return bool\n     */\n    public function isEnd()\n    {\n        return $this->iCurrentPosition >= $this->iLength;\n    }\n\n    /**\n     * @param array<array-key, string>|string $aEnd\n     * @param string $bIncludeEnd\n     * @param string $consumeEnd\n     * @param array<int, Comment> $comments\n     *\n     * @return string\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public function consumeUntil($aEnd, $bIncludeEnd = false, $consumeEnd = false, array &$comments = [])\n    {\n        $aEnd = is_array($aEnd) ? $aEnd : [$aEnd];\n        $out = '';\n        $start = $this->iCurrentPosition;\n\n        while (!$this->isEnd()) {\n            $char = $this->consume(1);\n            if (in_array($char, $aEnd)) {\n                if ($bIncludeEnd) {\n                    $out .= $char;\n                } elseif (!$consumeEnd) {\n                    $this->iCurrentPosition -= $this->strlen($char);\n                }\n                return $out;\n            }\n            $out .= $char;\n            if ($comment = $this->consumeComment()) {\n                $comments[] = $comment;\n            }\n        }\n\n        if (in_array(self::EOF, $aEnd)) {\n            return $out;\n        }\n\n        $this->iCurrentPosition = $start;\n        throw new UnexpectedEOFException(\n            'One of (\"' . implode('\",\"', $aEnd) . '\")',\n            $this->peek(5),\n            'search',\n            $this->iLineNo\n        );\n    }\n\n    /**\n     * @return string\n     */\n    private function inputLeft()\n    {\n        return $this->substr($this->iCurrentPosition, -1);\n    }\n\n    /**\n     * @param string $sString1\n     * @param string $sString2\n     * @param bool $bCaseInsensitive\n     *\n     * @return bool\n     */\n    public function streql($sString1, $sString2, $bCaseInsensitive = true)\n    {\n        if ($bCaseInsensitive) {\n            return $this->strtolower($sString1) === $this->strtolower($sString2);\n        } else {\n            return $sString1 === $sString2;\n        }\n    }\n\n    /**\n     * @param int $iAmount\n     *\n     * @return void\n     */\n    public function backtrack($iAmount)\n    {\n        $this->iCurrentPosition -= $iAmount;\n    }\n\n    /**\n     * @param string $sString\n     *\n     * @return int\n     */\n    public function strlen($sString)\n    {\n        if ($this->oParserSettings->bMultibyteSupport) {\n            return mb_strlen($sString, $this->sCharset);\n        } else {\n            return strlen($sString);\n        }\n    }\n\n    /**\n     * @param int $iStart\n     * @param int $iLength\n     *\n     * @return string\n     */\n    private function substr($iStart, $iLength)\n    {\n        if ($iLength < 0) {\n            $iLength = $this->iLength - $iStart + $iLength;\n        }\n        if ($iStart + $iLength > $this->iLength) {\n            $iLength = $this->iLength - $iStart;\n        }\n        $sResult = '';\n        while ($iLength > 0) {\n            $sResult .= $this->aText[$iStart];\n            $iStart++;\n            $iLength--;\n        }\n        return $sResult;\n    }\n\n    /**\n     * @param string $sString\n     *\n     * @return string\n     */\n    private function strtolower($sString)\n    {\n        if ($this->oParserSettings->bMultibyteSupport) {\n            return mb_strtolower($sString, $this->sCharset);\n        } else {\n            return strtolower($sString);\n        }\n    }\n\n    /**\n     * @param string $sString\n     *\n     * @return array<int, string>\n     */\n    private function strsplit($sString)\n    {\n        if ($this->oParserSettings->bMultibyteSupport) {\n            if ($this->streql($this->sCharset, 'utf-8')) {\n                return preg_split('//u', $sString, -1, PREG_SPLIT_NO_EMPTY);\n            } else {\n                $iLength = mb_strlen($sString, $this->sCharset);\n                $aResult = [];\n                for ($i = 0; $i < $iLength; ++$i) {\n                    $aResult[] = mb_substr($sString, $i, 1, $this->sCharset);\n                }\n                return $aResult;\n            }\n        } else {\n            if ($sString === '') {\n                return [];\n            } else {\n                return str_split($sString);\n            }\n        }\n    }\n\n    /**\n     * @param string $sString\n     * @param string $sNeedle\n     * @param int $iOffset\n     *\n     * @return int|false\n     */\n    private function strpos($sString, $sNeedle, $iOffset)\n    {\n        if ($this->oParserSettings->bMultibyteSupport) {\n            return mb_strpos($sString, $sNeedle, $iOffset, $this->sCharset);\n        } else {\n            return strpos($sString, $sNeedle, $iOffset);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Parsing/SourceException.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Parsing;\n\nclass SourceException extends \\Exception\n{\n    /**\n     * @var int\n     */\n    private $iLineNo;\n\n    /**\n     * @param string $sMessage\n     * @param int $iLineNo\n     */\n    public function __construct($sMessage, $iLineNo = 0)\n    {\n        $this->iLineNo = $iLineNo;\n        if (!empty($iLineNo)) {\n            $sMessage .= \" [line no: $iLineNo]\";\n        }\n        parent::__construct($sMessage);\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Parsing/UnexpectedEOFException.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Parsing;\n\n/**\n * Thrown if the CSS parser encounters end of file it did not expect.\n *\n * Extends `UnexpectedTokenException` in order to preserve backwards compatibility.\n */\nclass UnexpectedEOFException extends UnexpectedTokenException\n{\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Parsing/UnexpectedTokenException.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Parsing;\n\n/**\n * Thrown if the CSS parser encounters a token it did not expect.\n */\nclass UnexpectedTokenException extends SourceException\n{\n    /**\n     * @var string\n     */\n    private $sExpected;\n\n    /**\n     * @var string\n     */\n    private $sFound;\n\n    /**\n     * Possible values: literal, identifier, count, expression, search\n     *\n     * @var string\n     */\n    private $sMatchType;\n\n    /**\n     * @param string $sExpected\n     * @param string $sFound\n     * @param string $sMatchType\n     * @param int $iLineNo\n     */\n    public function __construct($sExpected, $sFound, $sMatchType = 'literal', $iLineNo = 0)\n    {\n        $this->sExpected = $sExpected;\n        $this->sFound = $sFound;\n        $this->sMatchType = $sMatchType;\n        $sMessage = \"Token “{$sExpected}” ({$sMatchType}) not found. Got “{$sFound}”.\";\n        if ($this->sMatchType === 'search') {\n            $sMessage = \"Search for “{$sExpected}” returned no results. Context: “{$sFound}”.\";\n        } elseif ($this->sMatchType === 'count') {\n            $sMessage = \"Next token was expected to have {$sExpected} chars. Context: “{$sFound}”.\";\n        } elseif ($this->sMatchType === 'identifier') {\n            $sMessage = \"Identifier expected. Got “{$sFound}”\";\n        } elseif ($this->sMatchType === 'custom') {\n            $sMessage = trim(\"$sExpected $sFound\");\n        }\n\n        parent::__construct($sMessage, $iLineNo);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Property/AtRule.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Property;\n\nuse Sabberworm\\CSS\\Comment\\Commentable;\nuse Sabberworm\\CSS\\Renderable;\n\ninterface AtRule extends Renderable, Commentable\n{\n    /**\n     * Since there are more set rules than block rules,\n     * we’re whitelisting the block rules and have anything else be treated as a set rule.\n     *\n     * @var string\n     */\n    const BLOCK_RULES = 'media/document/supports/region-style/font-feature-values';\n\n    /**\n     * … and more font-specific ones (to be used inside font-feature-values)\n     *\n     * @var string\n     */\n    const SET_RULES = 'font-face/counter-style/page/swash/styleset/annotation';\n\n    /**\n     * @return string|null\n     */\n    public function atRuleName();\n\n    /**\n     * @return string|null\n     */\n    public function atRuleArgs();\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Property/CSSNamespace.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Property;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\OutputFormat;\n\n/**\n * `CSSNamespace` represents an `@namespace` rule.\n */\nclass CSSNamespace implements AtRule\n{\n    /**\n     * @var string\n     */\n    private $mUrl;\n\n    /**\n     * @var string\n     */\n    private $sPrefix;\n\n    /**\n     * @var int\n     */\n    private $iLineNo;\n\n    /**\n     * @var array<array-key, Comment>\n     */\n    protected $aComments;\n\n    /**\n     * @param string $mUrl\n     * @param string|null $sPrefix\n     * @param int $iLineNo\n     */\n    public function __construct($mUrl, $sPrefix = null, $iLineNo = 0)\n    {\n        $this->mUrl = $mUrl;\n        $this->sPrefix = $sPrefix;\n        $this->iLineNo = $iLineNo;\n        $this->aComments = [];\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return '@namespace ' . ($this->sPrefix === null ? '' : $this->sPrefix . ' ')\n            . $this->mUrl->render($oOutputFormat) . ';';\n    }\n\n    /**\n     * @return string\n     */\n    public function getUrl()\n    {\n        return $this->mUrl;\n    }\n\n    /**\n     * @return string|null\n     */\n    public function getPrefix()\n    {\n        return $this->sPrefix;\n    }\n\n    /**\n     * @param string $mUrl\n     *\n     * @return void\n     */\n    public function setUrl($mUrl)\n    {\n        $this->mUrl = $mUrl;\n    }\n\n    /**\n     * @param string $sPrefix\n     *\n     * @return void\n     */\n    public function setPrefix($sPrefix)\n    {\n        $this->sPrefix = $sPrefix;\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleName()\n    {\n        return 'namespace';\n    }\n\n    /**\n     * @return array<int, string>\n     */\n    public function atRuleArgs()\n    {\n        $aResult = [$this->mUrl];\n        if ($this->sPrefix) {\n            array_unshift($aResult, $this->sPrefix);\n        }\n        return $aResult;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments)\n    {\n        $this->aComments = array_merge($this->aComments, $aComments);\n    }\n\n    /**\n     * @return array<array-key, Comment>\n     */\n    public function getComments()\n    {\n        return $this->aComments;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments)\n    {\n        $this->aComments = $aComments;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Property/Charset.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Property;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\OutputFormat;\n\n/**\n * Class representing an `@charset` rule.\n *\n * The following restrictions apply:\n * - May not be found in any CSSList other than the Document.\n * - May only appear at the very top of a Document’s contents.\n * - Must not appear more than once.\n */\nclass Charset implements AtRule\n{\n    /**\n     * @var string\n     */\n    private $sCharset;\n\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @var array<array-key, Comment>\n     */\n    protected $aComments;\n\n    /**\n     * @param string $sCharset\n     * @param int $iLineNo\n     */\n    public function __construct($sCharset, $iLineNo = 0)\n    {\n        $this->sCharset = $sCharset;\n        $this->iLineNo = $iLineNo;\n        $this->aComments = [];\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @param string $sCharset\n     *\n     * @return void\n     */\n    public function setCharset($sCharset)\n    {\n        $this->sCharset = $sCharset;\n    }\n\n    /**\n     * @return string\n     */\n    public function getCharset()\n    {\n        return $this->sCharset;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return \"@charset {$this->sCharset->render($oOutputFormat)};\";\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleName()\n    {\n        return 'charset';\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleArgs()\n    {\n        return $this->sCharset;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments)\n    {\n        $this->aComments = array_merge($this->aComments, $aComments);\n    }\n\n    /**\n     * @return array<array-key, Comment>\n     */\n    public function getComments()\n    {\n        return $this->aComments;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments)\n    {\n        $this->aComments = $aComments;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Property/Import.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Property;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Value\\URL;\n\n/**\n * Class representing an `@import` rule.\n */\nclass Import implements AtRule\n{\n    /**\n     * @var URL\n     */\n    private $oLocation;\n\n    /**\n     * @var string\n     */\n    private $sMediaQuery;\n\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @var array<array-key, Comment>\n     */\n    protected $aComments;\n\n    /**\n     * @param URL $oLocation\n     * @param string $sMediaQuery\n     * @param int $iLineNo\n     */\n    public function __construct(URL $oLocation, $sMediaQuery, $iLineNo = 0)\n    {\n        $this->oLocation = $oLocation;\n        $this->sMediaQuery = $sMediaQuery;\n        $this->iLineNo = $iLineNo;\n        $this->aComments = [];\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @param URL $oLocation\n     *\n     * @return void\n     */\n    public function setLocation($oLocation)\n    {\n        $this->oLocation = $oLocation;\n    }\n\n    /**\n     * @return URL\n     */\n    public function getLocation()\n    {\n        return $this->oLocation;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return \"@import \" . $this->oLocation->render($oOutputFormat)\n            . ($this->sMediaQuery === null ? '' : ' ' . $this->sMediaQuery) . ';';\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleName()\n    {\n        return 'import';\n    }\n\n    /**\n     * @return array<int, URL|string>\n     */\n    public function atRuleArgs()\n    {\n        $aResult = [$this->oLocation];\n        if ($this->sMediaQuery) {\n            array_push($aResult, $this->sMediaQuery);\n        }\n        return $aResult;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments)\n    {\n        $this->aComments = array_merge($this->aComments, $aComments);\n    }\n\n    /**\n     * @return array<array-key, Comment>\n     */\n    public function getComments()\n    {\n        return $this->aComments;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments)\n    {\n        $this->aComments = $aComments;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Property/KeyframeSelector.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Property;\n\nclass KeyframeSelector extends Selector\n{\n    /**\n     * regexp for specificity calculations\n     *\n     * @var string\n     */\n    const SELECTOR_VALIDATION_RX = '/\n    ^(\n        (?:\n            [a-zA-Z0-9\\x{00A0}-\\x{FFFF}_^$|*=\"\\'~\\[\\]()\\-\\s\\.:#+>]* # any sequence of valid unescaped characters\n            (?:\\\\\\\\.)?                                              # a single escaped character\n            (?:([\\'\"]).*?(?<!\\\\\\\\)\\2)?                              # a quoted text like [id=\"example\"]\n        )*\n    )|\n    (\\d+%)                                                          # keyframe animation progress percentage (e.g. 50%)\n    $\n    /ux';\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Property/Selector.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Property;\n\n/**\n * Class representing a single CSS selector. Selectors have to be split by the comma prior to being passed into this\n * class.\n */\nclass Selector\n{\n    /**\n     * regexp for specificity calculations\n     *\n     * @var string\n     */\n    const NON_ID_ATTRIBUTES_AND_PSEUDO_CLASSES_RX = '/\n        (\\.[\\w]+)                   # classes\n        |\n        \\[(\\w+)                     # attributes\n        |\n        (\\:(                        # pseudo classes\n            link|visited|active\n            |hover|focus\n            |lang\n            |target\n            |enabled|disabled|checked|indeterminate\n            |root\n            |nth-child|nth-last-child|nth-of-type|nth-last-of-type\n            |first-child|last-child|first-of-type|last-of-type\n            |only-child|only-of-type\n            |empty|contains\n        ))\n        /ix';\n\n    /**\n     * regexp for specificity calculations\n     *\n     * @var string\n     */\n    const ELEMENTS_AND_PSEUDO_ELEMENTS_RX = '/\n        ((^|[\\s\\+\\>\\~]+)[\\w]+   # elements\n        |\n        \\:{1,2}(                # pseudo-elements\n            after|before|first-letter|first-line|selection\n        ))\n        /ix';\n\n    /**\n     * regexp for specificity calculations\n     *\n     * @var string\n     */\n    const SELECTOR_VALIDATION_RX = '/\n        ^(\n            (?:\n                [a-zA-Z0-9\\x{00A0}-\\x{FFFF}_^$|*=\"\\'~\\[\\]()\\-\\s\\.:#+>]* # any sequence of valid unescaped characters\n                (?:\\\\\\\\.)?                                              # a single escaped character\n                (?:([\\'\"]).*?(?<!\\\\\\\\)\\2)?                              # a quoted text like [id=\"example\"]\n            )*\n        )$\n        /ux';\n\n    /**\n     * @var string\n     */\n    private $sSelector;\n\n    /**\n     * @var int|null\n     */\n    private $iSpecificity;\n\n    /**\n     * @param string $sSelector\n     *\n     * @return bool\n     */\n    public static function isValid($sSelector)\n    {\n        return preg_match(static::SELECTOR_VALIDATION_RX, $sSelector);\n    }\n\n    /**\n     * @param string $sSelector\n     * @param bool $bCalculateSpecificity\n     */\n    public function __construct($sSelector, $bCalculateSpecificity = false)\n    {\n        $this->setSelector($sSelector);\n        if ($bCalculateSpecificity) {\n            $this->getSpecificity();\n        }\n    }\n\n    /**\n     * @return string\n     */\n    public function getSelector()\n    {\n        return $this->sSelector;\n    }\n\n    /**\n     * @param string $sSelector\n     *\n     * @return void\n     */\n    public function setSelector($sSelector)\n    {\n        $this->sSelector = trim($sSelector);\n        $this->iSpecificity = null;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->getSelector();\n    }\n\n    /**\n     * @return int\n     */\n    public function getSpecificity()\n    {\n        if ($this->iSpecificity === null) {\n            $a = 0;\n            /// @todo should exclude \\# as well as \"#\"\n            $aMatches = null;\n            $b = substr_count($this->sSelector, '#');\n            $c = preg_match_all(self::NON_ID_ATTRIBUTES_AND_PSEUDO_CLASSES_RX, $this->sSelector, $aMatches);\n            $d = preg_match_all(self::ELEMENTS_AND_PSEUDO_ELEMENTS_RX, $this->sSelector, $aMatches);\n            $this->iSpecificity = ($a * 1000) + ($b * 100) + ($c * 10) + $d;\n        }\n        return $this->iSpecificity;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Renderable.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS;\n\ninterface Renderable\n{\n    /**\n     * @return string\n     */\n    public function __toString();\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat);\n\n    /**\n     * @return int\n     */\n    public function getLineNo();\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Rule/Rule.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Rule;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\Comment\\Commentable;\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\nuse Sabberworm\\CSS\\Renderable;\nuse Sabberworm\\CSS\\Value\\RuleValueList;\nuse Sabberworm\\CSS\\Value\\Value;\n\n/**\n * RuleSets contains Rule objects which always have a key and a value.\n * In CSS, Rules are expressed as follows: “key: value[0][0] value[0][1], value[1][0] value[1][1];”\n */\nclass Rule implements Renderable, Commentable\n{\n    /**\n     * @var string\n     */\n    private $sRule;\n\n    /**\n     * @var RuleValueList|null\n     */\n    private $mValue;\n\n    /**\n     * @var bool\n     */\n    private $bIsImportant;\n\n    /**\n     * @var array<int, int>\n     */\n    private $aIeHack;\n\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @var int\n     */\n    protected $iColNo;\n\n    /**\n     * @var array<array-key, Comment>\n     */\n    protected $aComments;\n\n    /**\n     * @param string $sRule\n     * @param int $iLineNo\n     * @param int $iColNo\n     */\n    public function __construct($sRule, $iLineNo = 0, $iColNo = 0)\n    {\n        $this->sRule = $sRule;\n        $this->mValue = null;\n        $this->bIsImportant = false;\n        $this->aIeHack = [];\n        $this->iLineNo = $iLineNo;\n        $this->iColNo = $iColNo;\n        $this->aComments = [];\n    }\n\n    /**\n     * @return Rule\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $aComments = $oParserState->consumeWhiteSpace();\n        $oRule = new Rule(\n            $oParserState->parseIdentifier(!$oParserState->comes(\"--\")),\n            $oParserState->currentLine(),\n            $oParserState->currentColumn()\n        );\n        $oRule->setComments($aComments);\n        $oRule->addComments($oParserState->consumeWhiteSpace());\n        $oParserState->consume(':');\n        $oValue = Value::parseValue($oParserState, self::listDelimiterForRule($oRule->getRule()));\n        $oRule->setValue($oValue);\n        if ($oParserState->getSettings()->bLenientParsing) {\n            while ($oParserState->comes('\\\\')) {\n                $oParserState->consume('\\\\');\n                $oRule->addIeHack($oParserState->consume());\n                $oParserState->consumeWhiteSpace();\n            }\n        }\n        $oParserState->consumeWhiteSpace();\n        if ($oParserState->comes('!')) {\n            $oParserState->consume('!');\n            $oParserState->consumeWhiteSpace();\n            $oParserState->consume('important');\n            $oRule->setIsImportant(true);\n        }\n        $oParserState->consumeWhiteSpace();\n        while ($oParserState->comes(';')) {\n            $oParserState->consume(';');\n        }\n        $oParserState->consumeWhiteSpace();\n\n        return $oRule;\n    }\n\n    /**\n     * @param string $sRule\n     *\n     * @return array<int, string>\n     */\n    private static function listDelimiterForRule($sRule)\n    {\n        if (preg_match('/^font($|-)/', $sRule)) {\n            return [',', '/', ' '];\n        }\n        return [',', ' ', '/'];\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @return int\n     */\n    public function getColNo()\n    {\n        return $this->iColNo;\n    }\n\n    /**\n     * @param int $iLine\n     * @param int $iColumn\n     *\n     * @return void\n     */\n    public function setPosition($iLine, $iColumn)\n    {\n        $this->iColNo = $iColumn;\n        $this->iLineNo = $iLine;\n    }\n\n    /**\n     * @param string $sRule\n     *\n     * @return void\n     */\n    public function setRule($sRule)\n    {\n        $this->sRule = $sRule;\n    }\n\n    /**\n     * @return string\n     */\n    public function getRule()\n    {\n        return $this->sRule;\n    }\n\n    /**\n     * @return RuleValueList|null\n     */\n    public function getValue()\n    {\n        return $this->mValue;\n    }\n\n    /**\n     * @param RuleValueList|null $mValue\n     *\n     * @return void\n     */\n    public function setValue($mValue)\n    {\n        $this->mValue = $mValue;\n    }\n\n    /**\n     * @param array<array-key, array<array-key, RuleValueList>> $aSpaceSeparatedValues\n     *\n     * @return RuleValueList\n     *\n     * @deprecated will be removed in version 9.0\n     *             Old-Style 2-dimensional array given. Retained for (some) backwards-compatibility.\n     *             Use `setValue()` instead and wrap the value inside a RuleValueList if necessary.\n     */\n    public function setValues(array $aSpaceSeparatedValues)\n    {\n        $oSpaceSeparatedList = null;\n        if (count($aSpaceSeparatedValues) > 1) {\n            $oSpaceSeparatedList = new RuleValueList(' ', $this->iLineNo);\n        }\n        foreach ($aSpaceSeparatedValues as $aCommaSeparatedValues) {\n            $oCommaSeparatedList = null;\n            if (count($aCommaSeparatedValues) > 1) {\n                $oCommaSeparatedList = new RuleValueList(',', $this->iLineNo);\n            }\n            foreach ($aCommaSeparatedValues as $mValue) {\n                if (!$oSpaceSeparatedList && !$oCommaSeparatedList) {\n                    $this->mValue = $mValue;\n                    return $mValue;\n                }\n                if ($oCommaSeparatedList) {\n                    $oCommaSeparatedList->addListComponent($mValue);\n                } else {\n                    $oSpaceSeparatedList->addListComponent($mValue);\n                }\n            }\n            if (!$oSpaceSeparatedList) {\n                $this->mValue = $oCommaSeparatedList;\n                return $oCommaSeparatedList;\n            } else {\n                $oSpaceSeparatedList->addListComponent($oCommaSeparatedList);\n            }\n        }\n        $this->mValue = $oSpaceSeparatedList;\n        return $oSpaceSeparatedList;\n    }\n\n    /**\n     * @return array<int, array<int, RuleValueList>>\n     *\n     * @deprecated will be removed in version 9.0\n     *             Old-Style 2-dimensional array returned. Retained for (some) backwards-compatibility.\n     *             Use `getValue()` instead and check for the existence of a (nested set of) ValueList object(s).\n     */\n    public function getValues()\n    {\n        if (!$this->mValue instanceof RuleValueList) {\n            return [[$this->mValue]];\n        }\n        if ($this->mValue->getListSeparator() === ',') {\n            return [$this->mValue->getListComponents()];\n        }\n        $aResult = [];\n        foreach ($this->mValue->getListComponents() as $mValue) {\n            if (!$mValue instanceof RuleValueList || $mValue->getListSeparator() !== ',') {\n                $aResult[] = [$mValue];\n                continue;\n            }\n            if ($this->mValue->getListSeparator() === ' ' || count($aResult) === 0) {\n                $aResult[] = [];\n            }\n            foreach ($mValue->getListComponents() as $mValue) {\n                $aResult[count($aResult) - 1][] = $mValue;\n            }\n        }\n        return $aResult;\n    }\n\n    /**\n     * Adds a value to the existing value. Value will be appended if a `RuleValueList` exists of the given type.\n     * Otherwise, the existing value will be wrapped by one.\n     *\n     * @param RuleValueList|array<int, RuleValueList> $mValue\n     * @param string $sType\n     *\n     * @return void\n     */\n    public function addValue($mValue, $sType = ' ')\n    {\n        if (!is_array($mValue)) {\n            $mValue = [$mValue];\n        }\n        if (!$this->mValue instanceof RuleValueList || $this->mValue->getListSeparator() !== $sType) {\n            $mCurrentValue = $this->mValue;\n            $this->mValue = new RuleValueList($sType, $this->iLineNo);\n            if ($mCurrentValue) {\n                $this->mValue->addListComponent($mCurrentValue);\n            }\n        }\n        foreach ($mValue as $mValueItem) {\n            $this->mValue->addListComponent($mValueItem);\n        }\n    }\n\n    /**\n     * @param int $iModifier\n     *\n     * @return void\n     */\n    public function addIeHack($iModifier)\n    {\n        $this->aIeHack[] = $iModifier;\n    }\n\n    /**\n     * @param array<int, int> $aModifiers\n     *\n     * @return void\n     */\n    public function setIeHack(array $aModifiers)\n    {\n        $this->aIeHack = $aModifiers;\n    }\n\n    /**\n     * @return array<int, int>\n     */\n    public function getIeHack()\n    {\n        return $this->aIeHack;\n    }\n\n    /**\n     * @param bool $bIsImportant\n     *\n     * @return void\n     */\n    public function setIsImportant($bIsImportant)\n    {\n        $this->bIsImportant = $bIsImportant;\n    }\n\n    /**\n     * @return bool\n     */\n    public function getIsImportant()\n    {\n        return $this->bIsImportant;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sResult = \"{$this->sRule}:{$oOutputFormat->spaceAfterRuleName()}\";\n        if ($this->mValue instanceof Value) { //Can also be a ValueList\n            $sResult .= $this->mValue->render($oOutputFormat);\n        } else {\n            $sResult .= $this->mValue;\n        }\n        if (!empty($this->aIeHack)) {\n            $sResult .= ' \\\\' . implode('\\\\', $this->aIeHack);\n        }\n        if ($this->bIsImportant) {\n            $sResult .= ' !important';\n        }\n        $sResult .= ';';\n        return $sResult;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments)\n    {\n        $this->aComments = array_merge($this->aComments, $aComments);\n    }\n\n    /**\n     * @return array<array-key, Comment>\n     */\n    public function getComments()\n    {\n        return $this->aComments;\n    }\n\n    /**\n     * @param array<array-key, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments)\n    {\n        $this->aComments = $aComments;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/RuleSet/AtRuleSet.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\RuleSet;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Property\\AtRule;\n\n/**\n * A RuleSet constructed by an unknown at-rule. `@font-face` rules are rendered into AtRuleSet objects.\n */\nclass AtRuleSet extends RuleSet implements AtRule\n{\n    /**\n     * @var string\n     */\n    private $sType;\n\n    /**\n     * @var string\n     */\n    private $sArgs;\n\n    /**\n     * @param string $sType\n     * @param string $sArgs\n     * @param int $iLineNo\n     */\n    public function __construct($sType, $sArgs = '', $iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        $this->sType = $sType;\n        $this->sArgs = $sArgs;\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleName()\n    {\n        return $this->sType;\n    }\n\n    /**\n     * @return string\n     */\n    public function atRuleArgs()\n    {\n        return $this->sArgs;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sArgs = $this->sArgs;\n        if ($sArgs) {\n            $sArgs = ' ' . $sArgs;\n        }\n        $sResult = \"@{$this->sType}$sArgs{$oOutputFormat->spaceBeforeOpeningBrace()}{\";\n        $sResult .= parent::render($oOutputFormat);\n        $sResult .= '}';\n        return $sResult;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/RuleSet/DeclarationBlock.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\RuleSet;\n\nuse Sabberworm\\CSS\\CSSList\\CSSList;\nuse Sabberworm\\CSS\\CSSList\\KeyFrame;\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\OutputException;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\nuse Sabberworm\\CSS\\Property\\KeyframeSelector;\nuse Sabberworm\\CSS\\Property\\Selector;\nuse Sabberworm\\CSS\\Rule\\Rule;\nuse Sabberworm\\CSS\\Value\\Color;\nuse Sabberworm\\CSS\\Value\\RuleValueList;\nuse Sabberworm\\CSS\\Value\\Size;\nuse Sabberworm\\CSS\\Value\\URL;\nuse Sabberworm\\CSS\\Value\\Value;\n\n/**\n * Declaration blocks are the parts of a CSS file which denote the rules belonging to a selector.\n *\n * Declaration blocks usually appear directly inside a `Document` or another `CSSList` (mostly a `MediaQuery`).\n */\nclass DeclarationBlock extends RuleSet\n{\n    /**\n     * @var array<int, Selector|string>\n     */\n    private $aSelectors;\n\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        $this->aSelectors = [];\n    }\n\n    /**\n     * @param CSSList|null $oList\n     *\n     * @return DeclarationBlock|false\n     *\n     * @throws UnexpectedTokenException\n     * @throws UnexpectedEOFException\n     */\n    public static function parse(ParserState $oParserState, $oList = null)\n    {\n        $aComments = [];\n        $oResult = new DeclarationBlock($oParserState->currentLine());\n        try {\n            $aSelectorParts = [];\n            $sStringWrapperChar = false;\n            do {\n                $aSelectorParts[] = $oParserState->consume(1)\n                    . $oParserState->consumeUntil(['{', '}', '\\'', '\"'], false, false, $aComments);\n                if (in_array($oParserState->peek(), ['\\'', '\"']) && substr(end($aSelectorParts), -1) != \"\\\\\") {\n                    if ($sStringWrapperChar === false) {\n                        $sStringWrapperChar = $oParserState->peek();\n                    } elseif ($sStringWrapperChar == $oParserState->peek()) {\n                        $sStringWrapperChar = false;\n                    }\n                }\n            } while (!in_array($oParserState->peek(), ['{', '}']) || $sStringWrapperChar !== false);\n            $oResult->setSelectors(implode('', $aSelectorParts), $oList);\n            if ($oParserState->comes('{')) {\n                $oParserState->consume(1);\n            }\n        } catch (UnexpectedTokenException $e) {\n            if ($oParserState->getSettings()->bLenientParsing) {\n                if (!$oParserState->comes('}')) {\n                    $oParserState->consumeUntil('}', false, true);\n                }\n                return false;\n            } else {\n                throw $e;\n            }\n        }\n        $oResult->setComments($aComments);\n        RuleSet::parseRuleSet($oParserState, $oResult);\n        return $oResult;\n    }\n\n    /**\n     * @param array<int, Selector|string>|string $mSelector\n     * @param CSSList|null $oList\n     *\n     * @throws UnexpectedTokenException\n     */\n    public function setSelectors($mSelector, $oList = null)\n    {\n        if (is_array($mSelector)) {\n            $this->aSelectors = $mSelector;\n        } else {\n            $this->aSelectors = explode(',', $mSelector);\n        }\n        foreach ($this->aSelectors as $iKey => $mSelector) {\n            if (!($mSelector instanceof Selector)) {\n                if ($oList === null || !($oList instanceof KeyFrame)) {\n                    if (!Selector::isValid($mSelector)) {\n                        throw new UnexpectedTokenException(\n                            \"Selector did not match '\" . Selector::SELECTOR_VALIDATION_RX . \"'.\",\n                            $mSelector,\n                            \"custom\"\n                        );\n                    }\n                    $this->aSelectors[$iKey] = new Selector($mSelector);\n                } else {\n                    if (!KeyframeSelector::isValid($mSelector)) {\n                        throw new UnexpectedTokenException(\n                            \"Selector did not match '\" . KeyframeSelector::SELECTOR_VALIDATION_RX . \"'.\",\n                            $mSelector,\n                            \"custom\"\n                        );\n                    }\n                    $this->aSelectors[$iKey] = new KeyframeSelector($mSelector);\n                }\n            }\n        }\n    }\n\n    /**\n     * Remove one of the selectors of the block.\n     *\n     * @param Selector|string $mSelector\n     *\n     * @return bool\n     */\n    public function removeSelector($mSelector)\n    {\n        if ($mSelector instanceof Selector) {\n            $mSelector = $mSelector->getSelector();\n        }\n        foreach ($this->aSelectors as $iKey => $oSelector) {\n            if ($oSelector->getSelector() === $mSelector) {\n                unset($this->aSelectors[$iKey]);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @return array<int, Selector|string>\n     *\n     * @deprecated will be removed in version 9.0; use `getSelectors()` instead\n     */\n    public function getSelector()\n    {\n        return $this->getSelectors();\n    }\n\n    /**\n     * @param Selector|string $mSelector\n     * @param CSSList|null $oList\n     *\n     * @return void\n     *\n     * @deprecated will be removed in version 9.0; use `setSelectors()` instead\n     */\n    public function setSelector($mSelector, $oList = null)\n    {\n        $this->setSelectors($mSelector, $oList);\n    }\n\n    /**\n     * @return array<int, Selector|string>\n     */\n    public function getSelectors()\n    {\n        return $this->aSelectors;\n    }\n\n    /**\n     * Splits shorthand declarations (e.g. `margin` or `font`) into their constituent parts.\n     *\n     * @return void\n     */\n    public function expandShorthands()\n    {\n        // border must be expanded before dimensions\n        $this->expandBorderShorthand();\n        $this->expandDimensionsShorthand();\n        $this->expandFontShorthand();\n        $this->expandBackgroundShorthand();\n        $this->expandListStyleShorthand();\n    }\n\n    /**\n     * Creates shorthand declarations (e.g. `margin` or `font`) whenever possible.\n     *\n     * @return void\n     */\n    public function createShorthands()\n    {\n        $this->createBackgroundShorthand();\n        $this->createDimensionsShorthand();\n        // border must be shortened after dimensions\n        $this->createBorderShorthand();\n        $this->createFontShorthand();\n        $this->createListStyleShorthand();\n    }\n\n    /**\n     * Splits shorthand border declarations (e.g. `border: 1px red;`).\n     *\n     * Additional splitting happens in expandDimensionsShorthand.\n     *\n     * Multiple borders are not yet supported as of 3.\n     *\n     * @return void\n     */\n    public function expandBorderShorthand()\n    {\n        $aBorderRules = [\n            'border',\n            'border-left',\n            'border-right',\n            'border-top',\n            'border-bottom',\n        ];\n        $aBorderSizes = [\n            'thin',\n            'medium',\n            'thick',\n        ];\n        $aRules = $this->getRulesAssoc();\n        foreach ($aBorderRules as $sBorderRule) {\n            if (!isset($aRules[$sBorderRule])) {\n                continue;\n            }\n            $oRule = $aRules[$sBorderRule];\n            $mRuleValue = $oRule->getValue();\n            $aValues = [];\n            if (!$mRuleValue instanceof RuleValueList) {\n                $aValues[] = $mRuleValue;\n            } else {\n                $aValues = $mRuleValue->getListComponents();\n            }\n            foreach ($aValues as $mValue) {\n                if ($mValue instanceof Value) {\n                    $mNewValue = clone $mValue;\n                } else {\n                    $mNewValue = $mValue;\n                }\n                if ($mValue instanceof Size) {\n                    $sNewRuleName = $sBorderRule . \"-width\";\n                } elseif ($mValue instanceof Color) {\n                    $sNewRuleName = $sBorderRule . \"-color\";\n                } else {\n                    if (in_array($mValue, $aBorderSizes)) {\n                        $sNewRuleName = $sBorderRule . \"-width\";\n                    } else {\n                        $sNewRuleName = $sBorderRule . \"-style\";\n                    }\n                }\n                $oNewRule = new Rule($sNewRuleName, $oRule->getLineNo(), $oRule->getColNo());\n                $oNewRule->setIsImportant($oRule->getIsImportant());\n                $oNewRule->addValue([$mNewValue]);\n                $this->addRule($oNewRule);\n            }\n            $this->removeRule($sBorderRule);\n        }\n    }\n\n    /**\n     * Splits shorthand dimensional declarations (e.g. `margin: 0px auto;`)\n     * into their constituent parts.\n     *\n     * Handles `margin`, `padding`, `border-color`, `border-style` and `border-width`.\n     *\n     * @return void\n     */\n    public function expandDimensionsShorthand()\n    {\n        $aExpansions = [\n            'margin' => 'margin-%s',\n            'padding' => 'padding-%s',\n            'border-color' => 'border-%s-color',\n            'border-style' => 'border-%s-style',\n            'border-width' => 'border-%s-width',\n        ];\n        $aRules = $this->getRulesAssoc();\n        foreach ($aExpansions as $sProperty => $sExpanded) {\n            if (!isset($aRules[$sProperty])) {\n                continue;\n            }\n            $oRule = $aRules[$sProperty];\n            $mRuleValue = $oRule->getValue();\n            $aValues = [];\n            if (!$mRuleValue instanceof RuleValueList) {\n                $aValues[] = $mRuleValue;\n            } else {\n                $aValues = $mRuleValue->getListComponents();\n            }\n            $top = $right = $bottom = $left = null;\n            switch (count($aValues)) {\n                case 1:\n                    $top = $right = $bottom = $left = $aValues[0];\n                    break;\n                case 2:\n                    $top = $bottom = $aValues[0];\n                    $left = $right = $aValues[1];\n                    break;\n                case 3:\n                    $top = $aValues[0];\n                    $left = $right = $aValues[1];\n                    $bottom = $aValues[2];\n                    break;\n                case 4:\n                    $top = $aValues[0];\n                    $right = $aValues[1];\n                    $bottom = $aValues[2];\n                    $left = $aValues[3];\n                    break;\n            }\n            foreach (['top', 'right', 'bottom', 'left'] as $sPosition) {\n                $oNewRule = new Rule(sprintf($sExpanded, $sPosition), $oRule->getLineNo(), $oRule->getColNo());\n                $oNewRule->setIsImportant($oRule->getIsImportant());\n                $oNewRule->addValue(${$sPosition});\n                $this->addRule($oNewRule);\n            }\n            $this->removeRule($sProperty);\n        }\n    }\n\n    /**\n     * Converts shorthand font declarations\n     * (e.g. `font: 300 italic 11px/14px verdana, helvetica, sans-serif;`)\n     * into their constituent parts.\n     *\n     * @return void\n     */\n    public function expandFontShorthand()\n    {\n        $aRules = $this->getRulesAssoc();\n        if (!isset($aRules['font'])) {\n            return;\n        }\n        $oRule = $aRules['font'];\n        // reset properties to 'normal' per http://www.w3.org/TR/21/fonts.html#font-shorthand\n        $aFontProperties = [\n            'font-style' => 'normal',\n            'font-variant' => 'normal',\n            'font-weight' => 'normal',\n            'font-size' => 'normal',\n            'line-height' => 'normal',\n        ];\n        $mRuleValue = $oRule->getValue();\n        $aValues = [];\n        if (!$mRuleValue instanceof RuleValueList) {\n            $aValues[] = $mRuleValue;\n        } else {\n            $aValues = $mRuleValue->getListComponents();\n        }\n        foreach ($aValues as $mValue) {\n            if (!$mValue instanceof Value) {\n                $mValue = mb_strtolower($mValue);\n            }\n            if (in_array($mValue, ['normal', 'inherit'])) {\n                foreach (['font-style', 'font-weight', 'font-variant'] as $sProperty) {\n                    if (!isset($aFontProperties[$sProperty])) {\n                        $aFontProperties[$sProperty] = $mValue;\n                    }\n                }\n            } elseif (in_array($mValue, ['italic', 'oblique'])) {\n                $aFontProperties['font-style'] = $mValue;\n            } elseif ($mValue == 'small-caps') {\n                $aFontProperties['font-variant'] = $mValue;\n            } elseif (\n                in_array($mValue, ['bold', 'bolder', 'lighter'])\n                || ($mValue instanceof Size\n                    && in_array($mValue->getSize(), range(100, 900, 100)))\n            ) {\n                $aFontProperties['font-weight'] = $mValue;\n            } elseif ($mValue instanceof RuleValueList && $mValue->getListSeparator() == '/') {\n                list($oSize, $oHeight) = $mValue->getListComponents();\n                $aFontProperties['font-size'] = $oSize;\n                $aFontProperties['line-height'] = $oHeight;\n            } elseif ($mValue instanceof Size && $mValue->getUnit() !== null) {\n                $aFontProperties['font-size'] = $mValue;\n            } else {\n                $aFontProperties['font-family'] = $mValue;\n            }\n        }\n        foreach ($aFontProperties as $sProperty => $mValue) {\n            $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo());\n            $oNewRule->addValue($mValue);\n            $oNewRule->setIsImportant($oRule->getIsImportant());\n            $this->addRule($oNewRule);\n        }\n        $this->removeRule('font');\n    }\n\n    /**\n     * Converts shorthand background declarations\n     * (e.g. `background: url(\"chess.png\") gray 50% repeat fixed;`)\n     * into their constituent parts.\n     *\n     * @see http://www.w3.org/TR/21/colors.html#propdef-background\n     *\n     * @return void\n     */\n    public function expandBackgroundShorthand()\n    {\n        $aRules = $this->getRulesAssoc();\n        if (!isset($aRules['background'])) {\n            return;\n        }\n        $oRule = $aRules['background'];\n        $aBgProperties = [\n            'background-color' => ['transparent'],\n            'background-image' => ['none'],\n            'background-repeat' => ['repeat'],\n            'background-attachment' => ['scroll'],\n            'background-position' => [\n                new Size(0, '%', null, false, $this->iLineNo),\n                new Size(0, '%', null, false, $this->iLineNo),\n            ],\n        ];\n        $mRuleValue = $oRule->getValue();\n        $aValues = [];\n        if (!$mRuleValue instanceof RuleValueList) {\n            $aValues[] = $mRuleValue;\n        } else {\n            $aValues = $mRuleValue->getListComponents();\n        }\n        if (count($aValues) == 1 && $aValues[0] == 'inherit') {\n            foreach ($aBgProperties as $sProperty => $mValue) {\n                $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo());\n                $oNewRule->addValue('inherit');\n                $oNewRule->setIsImportant($oRule->getIsImportant());\n                $this->addRule($oNewRule);\n            }\n            $this->removeRule('background');\n            return;\n        }\n        $iNumBgPos = 0;\n        foreach ($aValues as $mValue) {\n            if (!$mValue instanceof Value) {\n                $mValue = mb_strtolower($mValue);\n            }\n            if ($mValue instanceof URL) {\n                $aBgProperties['background-image'] = $mValue;\n            } elseif ($mValue instanceof Color) {\n                $aBgProperties['background-color'] = $mValue;\n            } elseif (in_array($mValue, ['scroll', 'fixed'])) {\n                $aBgProperties['background-attachment'] = $mValue;\n            } elseif (in_array($mValue, ['repeat', 'no-repeat', 'repeat-x', 'repeat-y'])) {\n                $aBgProperties['background-repeat'] = $mValue;\n            } elseif (\n                in_array($mValue, ['left', 'center', 'right', 'top', 'bottom'])\n                || $mValue instanceof Size\n            ) {\n                if ($iNumBgPos == 0) {\n                    $aBgProperties['background-position'][0] = $mValue;\n                    $aBgProperties['background-position'][1] = 'center';\n                } else {\n                    $aBgProperties['background-position'][$iNumBgPos] = $mValue;\n                }\n                $iNumBgPos++;\n            }\n        }\n        foreach ($aBgProperties as $sProperty => $mValue) {\n            $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo());\n            $oNewRule->setIsImportant($oRule->getIsImportant());\n            $oNewRule->addValue($mValue);\n            $this->addRule($oNewRule);\n        }\n        $this->removeRule('background');\n    }\n\n    /**\n     * @return void\n     */\n    public function expandListStyleShorthand()\n    {\n        $aListProperties = [\n            'list-style-type' => 'disc',\n            'list-style-position' => 'outside',\n            'list-style-image' => 'none',\n        ];\n        $aListStyleTypes = [\n            'none',\n            'disc',\n            'circle',\n            'square',\n            'decimal-leading-zero',\n            'decimal',\n            'lower-roman',\n            'upper-roman',\n            'lower-greek',\n            'lower-alpha',\n            'lower-latin',\n            'upper-alpha',\n            'upper-latin',\n            'hebrew',\n            'armenian',\n            'georgian',\n            'cjk-ideographic',\n            'hiragana',\n            'hira-gana-iroha',\n            'katakana-iroha',\n            'katakana',\n        ];\n        $aListStylePositions = [\n            'inside',\n            'outside',\n        ];\n        $aRules = $this->getRulesAssoc();\n        if (!isset($aRules['list-style'])) {\n            return;\n        }\n        $oRule = $aRules['list-style'];\n        $mRuleValue = $oRule->getValue();\n        $aValues = [];\n        if (!$mRuleValue instanceof RuleValueList) {\n            $aValues[] = $mRuleValue;\n        } else {\n            $aValues = $mRuleValue->getListComponents();\n        }\n        if (count($aValues) == 1 && $aValues[0] == 'inherit') {\n            foreach ($aListProperties as $sProperty => $mValue) {\n                $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo());\n                $oNewRule->addValue('inherit');\n                $oNewRule->setIsImportant($oRule->getIsImportant());\n                $this->addRule($oNewRule);\n            }\n            $this->removeRule('list-style');\n            return;\n        }\n        foreach ($aValues as $mValue) {\n            if (!$mValue instanceof Value) {\n                $mValue = mb_strtolower($mValue);\n            }\n            if ($mValue instanceof Url) {\n                $aListProperties['list-style-image'] = $mValue;\n            } elseif (in_array($mValue, $aListStyleTypes)) {\n                $aListProperties['list-style-types'] = $mValue;\n            } elseif (in_array($mValue, $aListStylePositions)) {\n                $aListProperties['list-style-position'] = $mValue;\n            }\n        }\n        foreach ($aListProperties as $sProperty => $mValue) {\n            $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo());\n            $oNewRule->setIsImportant($oRule->getIsImportant());\n            $oNewRule->addValue($mValue);\n            $this->addRule($oNewRule);\n        }\n        $this->removeRule('list-style');\n    }\n\n    /**\n     * @param array<array-key, string> $aProperties\n     * @param string $sShorthand\n     *\n     * @return void\n     */\n    public function createShorthandProperties(array $aProperties, $sShorthand)\n    {\n        $aRules = $this->getRulesAssoc();\n        $aNewValues = [];\n        foreach ($aProperties as $sProperty) {\n            if (!isset($aRules[$sProperty])) {\n                continue;\n            }\n            $oRule = $aRules[$sProperty];\n            if (!$oRule->getIsImportant()) {\n                $mRuleValue = $oRule->getValue();\n                $aValues = [];\n                if (!$mRuleValue instanceof RuleValueList) {\n                    $aValues[] = $mRuleValue;\n                } else {\n                    $aValues = $mRuleValue->getListComponents();\n                }\n                foreach ($aValues as $mValue) {\n                    $aNewValues[] = $mValue;\n                }\n                $this->removeRule($sProperty);\n            }\n        }\n        if (count($aNewValues)) {\n            $oNewRule = new Rule($sShorthand, $oRule->getLineNo(), $oRule->getColNo());\n            foreach ($aNewValues as $mValue) {\n                $oNewRule->addValue($mValue);\n            }\n            $this->addRule($oNewRule);\n        }\n    }\n\n    /**\n     * @return void\n     */\n    public function createBackgroundShorthand()\n    {\n        $aProperties = [\n            'background-color',\n            'background-image',\n            'background-repeat',\n            'background-position',\n            'background-attachment',\n        ];\n        $this->createShorthandProperties($aProperties, 'background');\n    }\n\n    /**\n     * @return void\n     */\n    public function createListStyleShorthand()\n    {\n        $aProperties = [\n            'list-style-type',\n            'list-style-position',\n            'list-style-image',\n        ];\n        $this->createShorthandProperties($aProperties, 'list-style');\n    }\n\n    /**\n     * Combines `border-color`, `border-style` and `border-width` into `border`.\n     *\n     * Should be run after `create_dimensions_shorthand`!\n     *\n     * @return void\n     */\n    public function createBorderShorthand()\n    {\n        $aProperties = [\n            'border-width',\n            'border-style',\n            'border-color',\n        ];\n        $this->createShorthandProperties($aProperties, 'border');\n    }\n\n    /**\n     * Looks for long format CSS dimensional properties\n     * (margin, padding, border-color, border-style and border-width)\n     * and converts them into shorthand CSS properties.\n     *\n     * @return void\n     */\n    public function createDimensionsShorthand()\n    {\n        $aPositions = ['top', 'right', 'bottom', 'left'];\n        $aExpansions = [\n            'margin' => 'margin-%s',\n            'padding' => 'padding-%s',\n            'border-color' => 'border-%s-color',\n            'border-style' => 'border-%s-style',\n            'border-width' => 'border-%s-width',\n        ];\n        $aRules = $this->getRulesAssoc();\n        foreach ($aExpansions as $sProperty => $sExpanded) {\n            $aFoldable = [];\n            foreach ($aRules as $sRuleName => $oRule) {\n                foreach ($aPositions as $sPosition) {\n                    if ($sRuleName == sprintf($sExpanded, $sPosition)) {\n                        $aFoldable[$sRuleName] = $oRule;\n                    }\n                }\n            }\n            // All four dimensions must be present\n            if (count($aFoldable) == 4) {\n                $aValues = [];\n                foreach ($aPositions as $sPosition) {\n                    $oRule = $aRules[sprintf($sExpanded, $sPosition)];\n                    $mRuleValue = $oRule->getValue();\n                    $aRuleValues = [];\n                    if (!$mRuleValue instanceof RuleValueList) {\n                        $aRuleValues[] = $mRuleValue;\n                    } else {\n                        $aRuleValues = $mRuleValue->getListComponents();\n                    }\n                    $aValues[$sPosition] = $aRuleValues;\n                }\n                $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo());\n                if ((string)$aValues['left'][0] == (string)$aValues['right'][0]) {\n                    if ((string)$aValues['top'][0] == (string)$aValues['bottom'][0]) {\n                        if ((string)$aValues['top'][0] == (string)$aValues['left'][0]) {\n                            // All 4 sides are equal\n                            $oNewRule->addValue($aValues['top']);\n                        } else {\n                            // Top and bottom are equal, left and right are equal\n                            $oNewRule->addValue($aValues['top']);\n                            $oNewRule->addValue($aValues['left']);\n                        }\n                    } else {\n                        // Only left and right are equal\n                        $oNewRule->addValue($aValues['top']);\n                        $oNewRule->addValue($aValues['left']);\n                        $oNewRule->addValue($aValues['bottom']);\n                    }\n                } else {\n                    // No sides are equal\n                    $oNewRule->addValue($aValues['top']);\n                    $oNewRule->addValue($aValues['left']);\n                    $oNewRule->addValue($aValues['bottom']);\n                    $oNewRule->addValue($aValues['right']);\n                }\n                $this->addRule($oNewRule);\n                foreach ($aPositions as $sPosition) {\n                    $this->removeRule(sprintf($sExpanded, $sPosition));\n                }\n            }\n        }\n    }\n\n    /**\n     * Looks for long format CSS font properties (e.g. `font-weight`) and\n     * tries to convert them into a shorthand CSS `font` property.\n     *\n     * At least `font-size` AND `font-family` must be present in order to create a shorthand declaration.\n     *\n     * @return void\n     */\n    public function createFontShorthand()\n    {\n        $aFontProperties = [\n            'font-style',\n            'font-variant',\n            'font-weight',\n            'font-size',\n            'line-height',\n            'font-family',\n        ];\n        $aRules = $this->getRulesAssoc();\n        if (!isset($aRules['font-size']) || !isset($aRules['font-family'])) {\n            return;\n        }\n        $oOldRule = isset($aRules['font-size']) ? $aRules['font-size'] : $aRules['font-family'];\n        $oNewRule = new Rule('font', $oOldRule->getLineNo(), $oOldRule->getColNo());\n        unset($oOldRule);\n        foreach (['font-style', 'font-variant', 'font-weight'] as $sProperty) {\n            if (isset($aRules[$sProperty])) {\n                $oRule = $aRules[$sProperty];\n                $mRuleValue = $oRule->getValue();\n                $aValues = [];\n                if (!$mRuleValue instanceof RuleValueList) {\n                    $aValues[] = $mRuleValue;\n                } else {\n                    $aValues = $mRuleValue->getListComponents();\n                }\n                if ($aValues[0] !== 'normal') {\n                    $oNewRule->addValue($aValues[0]);\n                }\n            }\n        }\n        // Get the font-size value\n        $oRule = $aRules['font-size'];\n        $mRuleValue = $oRule->getValue();\n        $aFSValues = [];\n        if (!$mRuleValue instanceof RuleValueList) {\n            $aFSValues[] = $mRuleValue;\n        } else {\n            $aFSValues = $mRuleValue->getListComponents();\n        }\n        // But wait to know if we have line-height to add it\n        if (isset($aRules['line-height'])) {\n            $oRule = $aRules['line-height'];\n            $mRuleValue = $oRule->getValue();\n            $aLHValues = [];\n            if (!$mRuleValue instanceof RuleValueList) {\n                $aLHValues[] = $mRuleValue;\n            } else {\n                $aLHValues = $mRuleValue->getListComponents();\n            }\n            if ($aLHValues[0] !== 'normal') {\n                $val = new RuleValueList('/', $this->iLineNo);\n                $val->addListComponent($aFSValues[0]);\n                $val->addListComponent($aLHValues[0]);\n                $oNewRule->addValue($val);\n            }\n        } else {\n            $oNewRule->addValue($aFSValues[0]);\n        }\n        $oRule = $aRules['font-family'];\n        $mRuleValue = $oRule->getValue();\n        $aFFValues = [];\n        if (!$mRuleValue instanceof RuleValueList) {\n            $aFFValues[] = $mRuleValue;\n        } else {\n            $aFFValues = $mRuleValue->getListComponents();\n        }\n        $oFFValue = new RuleValueList(',', $this->iLineNo);\n        $oFFValue->setListComponents($aFFValues);\n        $oNewRule->addValue($oFFValue);\n\n        $this->addRule($oNewRule);\n        foreach ($aFontProperties as $sProperty) {\n            $this->removeRule($sProperty);\n        }\n    }\n\n    /**\n     * @return string\n     *\n     * @throws OutputException\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     *\n     * @throws OutputException\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        if (count($this->aSelectors) === 0) {\n            // If all the selectors have been removed, this declaration block becomes invalid\n            throw new OutputException(\"Attempt to print declaration block with missing selector\", $this->iLineNo);\n        }\n        $sResult = $oOutputFormat->sBeforeDeclarationBlock;\n        $sResult .= $oOutputFormat->implode(\n            $oOutputFormat->spaceBeforeSelectorSeparator() . ',' . $oOutputFormat->spaceAfterSelectorSeparator(),\n            $this->aSelectors\n        );\n        $sResult .= $oOutputFormat->sAfterDeclarationBlockSelectors;\n        $sResult .= $oOutputFormat->spaceBeforeOpeningBrace() . '{';\n        $sResult .= parent::render($oOutputFormat);\n        $sResult .= '}';\n        $sResult .= $oOutputFormat->sAfterDeclarationBlock;\n        return $sResult;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/RuleSet/RuleSet.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\RuleSet;\n\nuse Sabberworm\\CSS\\Comment\\Comment;\nuse Sabberworm\\CSS\\Comment\\Commentable;\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\nuse Sabberworm\\CSS\\Renderable;\nuse Sabberworm\\CSS\\Rule\\Rule;\n\n/**\n * RuleSet is a generic superclass denoting rules. The typical example for rule sets are declaration block.\n * However, unknown At-Rules (like `@font-face`) are also rule sets.\n */\nabstract class RuleSet implements Renderable, Commentable\n{\n    /**\n     * @var array<string, Rule>\n     */\n    private $aRules;\n\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @var array<array-key, Comment>\n     */\n    protected $aComments;\n\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        $this->aRules = [];\n        $this->iLineNo = $iLineNo;\n        $this->aComments = [];\n    }\n\n    /**\n     * @return void\n     *\n     * @throws UnexpectedTokenException\n     * @throws UnexpectedEOFException\n     */\n    public static function parseRuleSet(ParserState $oParserState, RuleSet $oRuleSet)\n    {\n        while ($oParserState->comes(';')) {\n            $oParserState->consume(';');\n        }\n        while (!$oParserState->comes('}')) {\n            $oRule = null;\n            if ($oParserState->getSettings()->bLenientParsing) {\n                try {\n                    $oRule = Rule::parse($oParserState);\n                } catch (UnexpectedTokenException $e) {\n                    try {\n                        $sConsume = $oParserState->consumeUntil([\"\\n\", \";\", '}'], true);\n                        // We need to “unfind” the matches to the end of the ruleSet as this will be matched later\n                        if ($oParserState->streql(substr($sConsume, -1), '}')) {\n                            $oParserState->backtrack(1);\n                        } else {\n                            while ($oParserState->comes(';')) {\n                                $oParserState->consume(';');\n                            }\n                        }\n                    } catch (UnexpectedTokenException $e) {\n                        // We’ve reached the end of the document. Just close the RuleSet.\n                        return;\n                    }\n                }\n            } else {\n                $oRule = Rule::parse($oParserState);\n            }\n            if ($oRule) {\n                $oRuleSet->addRule($oRule);\n            }\n        }\n        $oParserState->consume('}');\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n\n    /**\n     * @param Rule|null $oSibling\n     *\n     * @return void\n     */\n    public function addRule(Rule $oRule, Rule $oSibling = null)\n    {\n        $sRule = $oRule->getRule();\n        if (!isset($this->aRules[$sRule])) {\n            $this->aRules[$sRule] = [];\n        }\n\n        $iPosition = count($this->aRules[$sRule]);\n\n        if ($oSibling !== null) {\n            $iSiblingPos = array_search($oSibling, $this->aRules[$sRule], true);\n            if ($iSiblingPos !== false) {\n                $iPosition = $iSiblingPos;\n                $oRule->setPosition($oSibling->getLineNo(), $oSibling->getColNo() - 1);\n            }\n        }\n        if ($oRule->getLineNo() === 0 && $oRule->getColNo() === 0) {\n            //this node is added manually, give it the next best line\n            $rules = $this->getRules();\n            $pos = count($rules);\n            if ($pos > 0) {\n                $last = $rules[$pos - 1];\n                $oRule->setPosition($last->getLineNo() + 1, 0);\n            }\n        }\n\n        array_splice($this->aRules[$sRule], $iPosition, 0, [$oRule]);\n    }\n\n    /**\n     * Returns all rules matching the given rule name\n     *\n     * @example $oRuleSet->getRules('font') // returns array(0 => $oRule, …) or array().\n     *\n     * @example $oRuleSet->getRules('font-')\n     *          //returns an array of all rules either beginning with font- or matching font.\n     *\n     * @param Rule|string|null $mRule\n     *        Pattern to search for. If null, returns all rules.\n     *        If the pattern ends with a dash, all rules starting with the pattern are returned\n     *        as well as one matching the pattern with the dash excluded.\n     *        Passing a Rule behaves like calling `getRules($mRule->getRule())`.\n     *\n     * @return array<int, Rule>\n     */\n    public function getRules($mRule = null)\n    {\n        if ($mRule instanceof Rule) {\n            $mRule = $mRule->getRule();\n        }\n        /** @var array<int, Rule> $aResult */\n        $aResult = [];\n        foreach ($this->aRules as $sName => $aRules) {\n            // Either no search rule is given or the search rule matches the found rule exactly\n            // or the search rule ends in “-” and the found rule starts with the search rule.\n            if (\n                !$mRule || $sName === $mRule\n                || (\n                    strrpos($mRule, '-') === strlen($mRule) - strlen('-')\n                    && (strpos($sName, $mRule) === 0 || $sName === substr($mRule, 0, -1))\n                )\n            ) {\n                $aResult = array_merge($aResult, $aRules);\n            }\n        }\n        usort($aResult, function (Rule $first, Rule $second) {\n            if ($first->getLineNo() === $second->getLineNo()) {\n                return $first->getColNo() - $second->getColNo();\n            }\n            return $first->getLineNo() - $second->getLineNo();\n        });\n        return $aResult;\n    }\n\n    /**\n     * Overrides all the rules of this set.\n     *\n     * @param array<array-key, Rule> $aRules The rules to override with.\n     *\n     * @return void\n     */\n    public function setRules(array $aRules)\n    {\n        $this->aRules = [];\n        foreach ($aRules as $rule) {\n            $this->addRule($rule);\n        }\n    }\n\n    /**\n     * Returns all rules matching the given pattern and returns them in an associative array with the rule’s name\n     * as keys. This method exists mainly for backwards-compatibility and is really only partially useful.\n     *\n     * Note: This method loses some information: Calling this (with an argument of `background-`) on a declaration block\n     * like `{ background-color: green; background-color; rgba(0, 127, 0, 0.7); }` will only yield an associative array\n     * containing the rgba-valued rule while `getRules()` would yield an indexed array containing both.\n     *\n     * @param Rule|string|null $mRule $mRule\n     *        Pattern to search for. If null, returns all rules. If the pattern ends with a dash,\n     *        all rules starting with the pattern are returned as well as one matching the pattern with the dash\n     *        excluded. Passing a Rule behaves like calling `getRules($mRule->getRule())`.\n     *\n     * @return array<string, Rule>\n     */\n    public function getRulesAssoc($mRule = null)\n    {\n        /** @var array<string, Rule> $aResult */\n        $aResult = [];\n        foreach ($this->getRules($mRule) as $oRule) {\n            $aResult[$oRule->getRule()] = $oRule;\n        }\n        return $aResult;\n    }\n\n    /**\n     * Removes a rule from this RuleSet. This accepts all the possible values that `getRules()` accepts.\n     *\n     * If given a Rule, it will only remove this particular rule (by identity).\n     * If given a name, it will remove all rules by that name.\n     *\n     * Note: this is different from pre-v.2.0 behaviour of PHP-CSS-Parser, where passing a Rule instance would\n     * remove all rules with the same name. To get the old behaviour, use `removeRule($oRule->getRule())`.\n     *\n     * @param Rule|string|null $mRule\n     *        pattern to remove. If $mRule is null, all rules are removed. If the pattern ends in a dash,\n     *        all rules starting with the pattern are removed as well as one matching the pattern with the dash\n     *        excluded. Passing a Rule behaves matches by identity.\n     *\n     * @return void\n     */\n    public function removeRule($mRule)\n    {\n        if ($mRule instanceof Rule) {\n            $sRule = $mRule->getRule();\n            if (!isset($this->aRules[$sRule])) {\n                return;\n            }\n            foreach ($this->aRules[$sRule] as $iKey => $oRule) {\n                if ($oRule === $mRule) {\n                    unset($this->aRules[$sRule][$iKey]);\n                }\n            }\n        } else {\n            foreach ($this->aRules as $sName => $aRules) {\n                // Either no search rule is given or the search rule matches the found rule exactly\n                // or the search rule ends in “-” and the found rule starts with the search rule or equals it\n                // (without the trailing dash).\n                if (\n                    !$mRule || $sName === $mRule\n                    || (strrpos($mRule, '-') === strlen($mRule) - strlen('-')\n                        && (strpos($sName, $mRule) === 0 || $sName === substr($mRule, 0, -1)))\n                ) {\n                    unset($this->aRules[$sName]);\n                }\n            }\n        }\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sResult = '';\n        $bIsFirst = true;\n        foreach ($this->aRules as $aRules) {\n            foreach ($aRules as $oRule) {\n                $sRendered = $oOutputFormat->safely(function () use ($oRule, $oOutputFormat) {\n                    return $oRule->render($oOutputFormat->nextLevel());\n                });\n                if ($sRendered === null) {\n                    continue;\n                }\n                if ($bIsFirst) {\n                    $bIsFirst = false;\n                    $sResult .= $oOutputFormat->nextLevel()->spaceBeforeRules();\n                } else {\n                    $sResult .= $oOutputFormat->nextLevel()->spaceBetweenRules();\n                }\n                $sResult .= $sRendered;\n            }\n        }\n\n        if (!$bIsFirst) {\n            // Had some output\n            $sResult .= $oOutputFormat->spaceAfterRules();\n        }\n\n        return $oOutputFormat->removeLastSemicolon($sResult);\n    }\n\n    /**\n     * @param array<string, Comment> $aComments\n     *\n     * @return void\n     */\n    public function addComments(array $aComments)\n    {\n        $this->aComments = array_merge($this->aComments, $aComments);\n    }\n\n    /**\n     * @return array<string, Comment>\n     */\n    public function getComments()\n    {\n        return $this->aComments;\n    }\n\n    /**\n     * @param array<string, Comment> $aComments\n     *\n     * @return void\n     */\n    public function setComments(array $aComments)\n    {\n        $this->aComments = $aComments;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Settings.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS;\n\n/**\n * Parser settings class.\n *\n * Configure parser behaviour here.\n */\nclass Settings\n{\n    /**\n     * Multi-byte string support.\n     * If true (mbstring extension must be enabled), will use (slower) `mb_strlen`, `mb_convert_case`, `mb_substr`\n     * and `mb_strpos` functions. Otherwise, the normal (ASCII-Only) functions will be used.\n     *\n     * @var bool\n     */\n    public $bMultibyteSupport;\n\n    /**\n     * The default charset for the CSS if no `@charset` rule is found. Defaults to utf-8.\n     *\n     * @var string\n     */\n    public $sDefaultCharset = 'utf-8';\n\n    /**\n     * Lenient parsing. When used (which is true by default), the parser will not choke\n     * on unexpected tokens but simply ignore them.\n     *\n     * @var bool\n     */\n    public $bLenientParsing = true;\n\n    private function __construct()\n    {\n        $this->bMultibyteSupport = extension_loaded('mbstring');\n    }\n\n    /**\n     * @return self new instance\n     */\n    public static function create()\n    {\n        return new Settings();\n    }\n\n    /**\n     * @param bool $bMultibyteSupport\n     *\n     * @return self fluent interface\n     */\n    public function withMultibyteSupport($bMultibyteSupport = true)\n    {\n        $this->bMultibyteSupport = $bMultibyteSupport;\n        return $this;\n    }\n\n    /**\n     * @param string $sDefaultCharset\n     *\n     * @return self fluent interface\n     */\n    public function withDefaultCharset($sDefaultCharset)\n    {\n        $this->sDefaultCharset = $sDefaultCharset;\n        return $this;\n    }\n\n    /**\n     * @param bool $bLenientParsing\n     *\n     * @return self fluent interface\n     */\n    public function withLenientParsing($bLenientParsing = true)\n    {\n        $this->bLenientParsing = $bLenientParsing;\n        return $this;\n    }\n\n    /**\n     * @return self fluent interface\n     */\n    public function beStrict()\n    {\n        return $this->withLenientParsing(false);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/CSSFunction.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\n\nclass CSSFunction extends ValueList\n{\n    /**\n     * @var string\n     */\n    protected $sName;\n\n    /**\n     * @param string $sName\n     * @param RuleValueList|array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aArguments\n     * @param string $sSeparator\n     * @param int $iLineNo\n     */\n    public function __construct($sName, $aArguments, $sSeparator = ',', $iLineNo = 0)\n    {\n        if ($aArguments instanceof RuleValueList) {\n            $sSeparator = $aArguments->getListSeparator();\n            $aArguments = $aArguments->getListComponents();\n        }\n        $this->sName = $sName;\n        $this->iLineNo = $iLineNo;\n        parent::__construct($aArguments, $sSeparator, $iLineNo);\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->sName;\n    }\n\n    /**\n     * @param string $sName\n     *\n     * @return void\n     */\n    public function setName($sName)\n    {\n        $this->sName = $sName;\n    }\n\n    /**\n     * @return array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string>\n     */\n    public function getArguments()\n    {\n        return $this->aComponents;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $aArguments = parent::render($oOutputFormat);\n        return \"{$this->sName}({$aArguments})\";\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/CSSString.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\SourceException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\n\nclass CSSString extends PrimitiveValue\n{\n    /**\n     * @var string\n     */\n    private $sString;\n\n    /**\n     * @param string $sString\n     * @param int $iLineNo\n     */\n    public function __construct($sString, $iLineNo = 0)\n    {\n        $this->sString = $sString;\n        parent::__construct($iLineNo);\n    }\n\n    /**\n     * @return CSSString\n     *\n     * @throws SourceException\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $sBegin = $oParserState->peek();\n        $sQuote = null;\n        if ($sBegin === \"'\") {\n            $sQuote = \"'\";\n        } elseif ($sBegin === '\"') {\n            $sQuote = '\"';\n        }\n        if ($sQuote !== null) {\n            $oParserState->consume($sQuote);\n        }\n        $sResult = \"\";\n        $sContent = null;\n        if ($sQuote === null) {\n            // Unquoted strings end in whitespace or with braces, brackets, parentheses\n            while (!preg_match('/[\\\\s{}()<>\\\\[\\\\]]/isu', $oParserState->peek())) {\n                $sResult .= $oParserState->parseCharacter(false);\n            }\n        } else {\n            while (!$oParserState->comes($sQuote)) {\n                $sContent = $oParserState->parseCharacter(false);\n                if ($sContent === null) {\n                    throw new SourceException(\n                        \"Non-well-formed quoted string {$oParserState->peek(3)}\",\n                        $oParserState->currentLine()\n                    );\n                }\n                $sResult .= $sContent;\n            }\n            $oParserState->consume($sQuote);\n        }\n        return new CSSString($sResult, $oParserState->currentLine());\n    }\n\n    /**\n     * @param string $sString\n     *\n     * @return void\n     */\n    public function setString($sString)\n    {\n        $this->sString = $sString;\n    }\n\n    /**\n     * @return string\n     */\n    public function getString()\n    {\n        return $this->sString;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $sString = addslashes($this->sString);\n        $sString = str_replace(\"\\n\", '\\A', $sString);\n        return $oOutputFormat->getStringQuotingType() . $sString . $oOutputFormat->getStringQuotingType();\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/CalcFunction.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\n\nclass CalcFunction extends CSSFunction\n{\n    /**\n     * @var int\n     */\n    const T_OPERAND = 1;\n\n    /**\n     * @var int\n     */\n    const T_OPERATOR = 2;\n\n    /**\n     * @return CalcFunction\n     *\n     * @throws UnexpectedTokenException\n     * @throws UnexpectedEOFException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $aOperators = ['+', '-', '*', '/'];\n        $sFunction = trim($oParserState->consumeUntil('(', false, true));\n        $oCalcList = new CalcRuleValueList($oParserState->currentLine());\n        $oList = new RuleValueList(',', $oParserState->currentLine());\n        $iNestingLevel = 0;\n        $iLastComponentType = null;\n        while (!$oParserState->comes(')') || $iNestingLevel > 0) {\n            $oParserState->consumeWhiteSpace();\n            if ($oParserState->comes('(')) {\n                $iNestingLevel++;\n                $oCalcList->addListComponent($oParserState->consume(1));\n                $oParserState->consumeWhiteSpace();\n                continue;\n            } elseif ($oParserState->comes(')')) {\n                $iNestingLevel--;\n                $oCalcList->addListComponent($oParserState->consume(1));\n                $oParserState->consumeWhiteSpace();\n                continue;\n            }\n            if ($iLastComponentType != CalcFunction::T_OPERAND) {\n                $oVal = Value::parsePrimitiveValue($oParserState);\n                $oCalcList->addListComponent($oVal);\n                $iLastComponentType = CalcFunction::T_OPERAND;\n            } else {\n                if (in_array($oParserState->peek(), $aOperators)) {\n                    if (($oParserState->comes('-') || $oParserState->comes('+'))) {\n                        if (\n                            $oParserState->peek(1, -1) != ' '\n                            || !($oParserState->comes('- ')\n                                || $oParserState->comes('+ '))\n                        ) {\n                            throw new UnexpectedTokenException(\n                                \" {$oParserState->peek()} \",\n                                $oParserState->peek(1, -1) . $oParserState->peek(2),\n                                'literal',\n                                $oParserState->currentLine()\n                            );\n                        }\n                    }\n                    $oCalcList->addListComponent($oParserState->consume(1));\n                    $iLastComponentType = CalcFunction::T_OPERATOR;\n                } else {\n                    throw new UnexpectedTokenException(\n                        sprintf(\n                            'Next token was expected to be an operand of type %s. Instead \"%s\" was found.',\n                            implode(', ', $aOperators),\n                            $oVal\n                        ),\n                        '',\n                        'custom',\n                        $oParserState->currentLine()\n                    );\n                }\n            }\n            $oParserState->consumeWhiteSpace();\n        }\n        $oList->addListComponent($oCalcList);\n        $oParserState->consume(')');\n        return new CalcFunction($sFunction, $oList, ',', $oParserState->currentLine());\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/CalcRuleValueList.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\n\nclass CalcRuleValueList extends RuleValueList\n{\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        parent::__construct(',', $iLineNo);\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return $oOutputFormat->implode(' ', $this->aComponents);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/Color.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\n\nclass Color extends CSSFunction\n{\n    /**\n     * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aColor\n     * @param int $iLineNo\n     */\n    public function __construct(array $aColor, $iLineNo = 0)\n    {\n        parent::__construct(implode('', array_keys($aColor)), $aColor, ',', $iLineNo);\n    }\n\n    /**\n     * @return Color|CSSFunction\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $aColor = [];\n        if ($oParserState->comes('#')) {\n            $oParserState->consume('#');\n            $sValue = $oParserState->parseIdentifier(false);\n            if ($oParserState->strlen($sValue) === 3) {\n                $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2];\n            } elseif ($oParserState->strlen($sValue) === 4) {\n                $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2] . $sValue[3]\n                    . $sValue[3];\n            }\n\n            if ($oParserState->strlen($sValue) === 8) {\n                $aColor = [\n                    'r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()),\n                    'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()),\n                    'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()),\n                    'a' => new Size(\n                        round(self::mapRange(intval($sValue[6] . $sValue[7], 16), 0, 255, 0, 1), 2),\n                        null,\n                        true,\n                        $oParserState->currentLine()\n                    ),\n                ];\n            } else {\n                $aColor = [\n                    'r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()),\n                    'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()),\n                    'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()),\n                ];\n            }\n        } else {\n            $sColorMode = $oParserState->parseIdentifier(true);\n            $oParserState->consumeWhiteSpace();\n            $oParserState->consume('(');\n\n            $bContainsVar = false;\n            $iLength = $oParserState->strlen($sColorMode);\n            for ($i = 0; $i < $iLength; ++$i) {\n                $oParserState->consumeWhiteSpace();\n                if ($oParserState->comes('var')) {\n                    $aColor[$sColorMode[$i]] = CSSFunction::parseIdentifierOrFunction($oParserState);\n                    $bContainsVar = true;\n                } else {\n                    $aColor[$sColorMode[$i]] = Size::parse($oParserState, true);\n                }\n\n                if ($bContainsVar && $oParserState->comes(')')) {\n                    // With a var argument the function can have fewer arguments\n                    break;\n                }\n\n                $oParserState->consumeWhiteSpace();\n                if ($i < ($iLength - 1)) {\n                    $oParserState->consume(',');\n                }\n            }\n            $oParserState->consume(')');\n\n            if ($bContainsVar) {\n                return new CSSFunction($sColorMode, array_values($aColor), ',', $oParserState->currentLine());\n            }\n        }\n        return new Color($aColor, $oParserState->currentLine());\n    }\n\n    /**\n     * @param float $fVal\n     * @param float $fFromMin\n     * @param float $fFromMax\n     * @param float $fToMin\n     * @param float $fToMax\n     *\n     * @return float\n     */\n    private static function mapRange($fVal, $fFromMin, $fFromMax, $fToMin, $fToMax)\n    {\n        $fFromRange = $fFromMax - $fFromMin;\n        $fToRange = $fToMax - $fToMin;\n        $fMultiplier = $fToRange / $fFromRange;\n        $fNewVal = $fVal - $fFromMin;\n        $fNewVal *= $fMultiplier;\n        return $fNewVal + $fToMin;\n    }\n\n    /**\n     * @return array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string>\n     */\n    public function getColor()\n    {\n        return $this->aComponents;\n    }\n\n    /**\n     * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aColor\n     *\n     * @return void\n     */\n    public function setColor(array $aColor)\n    {\n        $this->setName(implode('', array_keys($aColor)));\n        $this->aComponents = $aColor;\n    }\n\n    /**\n     * @return string\n     */\n    public function getColorDescription()\n    {\n        return $this->getName();\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        // Shorthand RGB color values\n        if ($oOutputFormat->getRGBHashNotation() && implode('', array_keys($this->aComponents)) === 'rgb') {\n            $sResult = sprintf(\n                '%02x%02x%02x',\n                $this->aComponents['r']->getSize(),\n                $this->aComponents['g']->getSize(),\n                $this->aComponents['b']->getSize()\n            );\n            return '#' . (($sResult[0] == $sResult[1]) && ($sResult[2] == $sResult[3]) && ($sResult[4] == $sResult[5])\n                    ? \"$sResult[0]$sResult[2]$sResult[4]\" : $sResult);\n        }\n        return parent::render($oOutputFormat);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/LineName.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\n\nclass LineName extends ValueList\n{\n    /**\n     * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aComponents\n     * @param int $iLineNo\n     */\n    public function __construct(array $aComponents = [], $iLineNo = 0)\n    {\n        parent::__construct($aComponents, ' ', $iLineNo);\n    }\n\n    /**\n     * @return LineName\n     *\n     * @throws UnexpectedTokenException\n     * @throws UnexpectedEOFException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $oParserState->consume('[');\n        $oParserState->consumeWhiteSpace();\n        $aNames = [];\n        do {\n            if ($oParserState->getSettings()->bLenientParsing) {\n                try {\n                    $aNames[] = $oParserState->parseIdentifier();\n                } catch (UnexpectedTokenException $e) {\n                    if (!$oParserState->comes(']')) {\n                        throw $e;\n                    }\n                }\n            } else {\n                $aNames[] = $oParserState->parseIdentifier();\n            }\n            $oParserState->consumeWhiteSpace();\n        } while (!$oParserState->comes(']'));\n        $oParserState->consume(']');\n        return new LineName($aNames, $oParserState->currentLine());\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return '[' . parent::render(OutputFormat::createCompact()) . ']';\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/PrimitiveValue.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nabstract class PrimitiveValue extends Value\n{\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/RuleValueList.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nclass RuleValueList extends ValueList\n{\n    /**\n     * @param string $sSeparator\n     * @param int $iLineNo\n     */\n    public function __construct($sSeparator = ',', $iLineNo = 0)\n    {\n        parent::__construct([], $sSeparator, $iLineNo);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/Size.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\n\nclass Size extends PrimitiveValue\n{\n    /**\n     * vh/vw/vm(ax)/vmin/rem are absolute insofar as they don’t scale to the immediate parent (only the viewport)\n     *\n     * @var array<int, string>\n     */\n    const ABSOLUTE_SIZE_UNITS = ['px', 'cm', 'mm', 'mozmm', 'in', 'pt', 'pc', 'vh', 'vw', 'vmin', 'vmax', 'rem'];\n\n    /**\n     * @var array<int, string>\n     */\n    const RELATIVE_SIZE_UNITS = ['%', 'em', 'ex', 'ch', 'fr'];\n\n    /**\n     * @var array<int, string>\n     */\n    const NON_SIZE_UNITS = ['deg', 'grad', 'rad', 's', 'ms', 'turns', 'Hz', 'kHz'];\n\n    /**\n     * @var array<int, array<string, string>>|null\n     */\n    private static $SIZE_UNITS = null;\n\n    /**\n     * @var float\n     */\n    private $fSize;\n\n    /**\n     * @var string|null\n     */\n    private $sUnit;\n\n    /**\n     * @var bool\n     */\n    private $bIsColorComponent;\n\n    /**\n     * @param float|int|string $fSize\n     * @param string|null $sUnit\n     * @param bool $bIsColorComponent\n     * @param int $iLineNo\n     */\n    public function __construct($fSize, $sUnit = null, $bIsColorComponent = false, $iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        $this->fSize = (float)$fSize;\n        $this->sUnit = $sUnit;\n        $this->bIsColorComponent = $bIsColorComponent;\n    }\n\n    /**\n     * @param bool $bIsColorComponent\n     *\n     * @return Size\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public static function parse(ParserState $oParserState, $bIsColorComponent = false)\n    {\n        $sSize = '';\n        if ($oParserState->comes('-')) {\n            $sSize .= $oParserState->consume('-');\n        }\n        while (is_numeric($oParserState->peek()) || $oParserState->comes('.')) {\n            if ($oParserState->comes('.')) {\n                $sSize .= $oParserState->consume('.');\n            } else {\n                $sSize .= $oParserState->consume(1);\n            }\n        }\n\n        $sUnit = null;\n        $aSizeUnits = self::getSizeUnits();\n        foreach ($aSizeUnits as $iLength => &$aValues) {\n            $sKey = strtolower($oParserState->peek($iLength));\n            if (array_key_exists($sKey, $aValues)) {\n                if (($sUnit = $aValues[$sKey]) !== null) {\n                    $oParserState->consume($iLength);\n                    break;\n                }\n            }\n        }\n        return new Size((float)$sSize, $sUnit, $bIsColorComponent, $oParserState->currentLine());\n    }\n\n    /**\n     * @return array<int, array<string, string>>\n     */\n    private static function getSizeUnits()\n    {\n        if (!is_array(self::$SIZE_UNITS)) {\n            self::$SIZE_UNITS = [];\n            foreach (array_merge(self::ABSOLUTE_SIZE_UNITS, self::RELATIVE_SIZE_UNITS, self::NON_SIZE_UNITS) as $val) {\n                $iSize = strlen($val);\n                if (!isset(self::$SIZE_UNITS[$iSize])) {\n                    self::$SIZE_UNITS[$iSize] = [];\n                }\n                self::$SIZE_UNITS[$iSize][strtolower($val)] = $val;\n            }\n\n            krsort(self::$SIZE_UNITS, SORT_NUMERIC);\n        }\n\n        return self::$SIZE_UNITS;\n    }\n\n    /**\n     * @param string $sUnit\n     *\n     * @return void\n     */\n    public function setUnit($sUnit)\n    {\n        $this->sUnit = $sUnit;\n    }\n\n    /**\n     * @return string|null\n     */\n    public function getUnit()\n    {\n        return $this->sUnit;\n    }\n\n    /**\n     * @param float|int|string $fSize\n     */\n    public function setSize($fSize)\n    {\n        $this->fSize = (float)$fSize;\n    }\n\n    /**\n     * @return float\n     */\n    public function getSize()\n    {\n        return $this->fSize;\n    }\n\n    /**\n     * @return bool\n     */\n    public function isColorComponent()\n    {\n        return $this->bIsColorComponent;\n    }\n\n    /**\n     * Returns whether the number stored in this Size really represents a size (as in a length of something on screen).\n     *\n     * @return false if the unit an angle, a duration, a frequency or the number is a component in a Color object.\n     */\n    public function isSize()\n    {\n        if (in_array($this->sUnit, self::NON_SIZE_UNITS, true)) {\n            return false;\n        }\n        return !$this->isColorComponent();\n    }\n\n    /**\n     * @return bool\n     */\n    public function isRelative()\n    {\n        if (in_array($this->sUnit, self::RELATIVE_SIZE_UNITS, true)) {\n            return true;\n        }\n        if ($this->sUnit === null && $this->fSize != 0) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        $l = localeconv();\n        $sPoint = preg_quote($l['decimal_point'], '/');\n        $sSize = preg_match(\"/[\\d\\.]+e[+-]?\\d+/i\", (string)$this->fSize)\n            ? preg_replace(\"/$sPoint?0+$/\", \"\", sprintf(\"%f\", $this->fSize)) : $this->fSize;\n        return preg_replace([\"/$sPoint/\", \"/^(-?)0\\./\"], ['.', '$1.'], $sSize)\n            . ($this->sUnit === null ? '' : $this->sUnit);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/URL.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\SourceException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\n\nclass URL extends PrimitiveValue\n{\n    /**\n     * @var CSSString\n     */\n    private $oURL;\n\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct(CSSString $oURL, $iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        $this->oURL = $oURL;\n    }\n\n    /**\n     * @return URL\n     *\n     * @throws SourceException\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public static function parse(ParserState $oParserState)\n    {\n        $bUseUrl = $oParserState->comes('url', true);\n        if ($bUseUrl) {\n            $oParserState->consume('url');\n            $oParserState->consumeWhiteSpace();\n            $oParserState->consume('(');\n        }\n        $oParserState->consumeWhiteSpace();\n        $oResult = new URL(CSSString::parse($oParserState), $oParserState->currentLine());\n        if ($bUseUrl) {\n            $oParserState->consumeWhiteSpace();\n            $oParserState->consume(')');\n        }\n        return $oResult;\n    }\n\n    /**\n     * @return void\n     */\n    public function setURL(CSSString $oURL)\n    {\n        $this->oURL = $oURL;\n    }\n\n    /**\n     * @return CSSString\n     */\n    public function getURL()\n    {\n        return $this->oURL;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return \"url({$this->oURL->render($oOutputFormat)})\";\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/Value.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\Parsing\\ParserState;\nuse Sabberworm\\CSS\\Parsing\\SourceException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedEOFException;\nuse Sabberworm\\CSS\\Parsing\\UnexpectedTokenException;\nuse Sabberworm\\CSS\\Renderable;\n\nabstract class Value implements Renderable\n{\n    /**\n     * @var int\n     */\n    protected $iLineNo;\n\n    /**\n     * @param int $iLineNo\n     */\n    public function __construct($iLineNo = 0)\n    {\n        $this->iLineNo = $iLineNo;\n    }\n\n    /**\n     * @param array<array-key, string> $aListDelimiters\n     *\n     * @return RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string\n     *\n     * @throws UnexpectedTokenException\n     * @throws UnexpectedEOFException\n     */\n    public static function parseValue(ParserState $oParserState, array $aListDelimiters = [])\n    {\n        /** @var array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aStack */\n        $aStack = [];\n        $oParserState->consumeWhiteSpace();\n        //Build a list of delimiters and parsed values\n        while (\n            !($oParserState->comes('}') || $oParserState->comes(';') || $oParserState->comes('!')\n            || $oParserState->comes(')')\n            || $oParserState->comes('\\\\'))\n        ) {\n            if (count($aStack) > 0) {\n                $bFoundDelimiter = false;\n                foreach ($aListDelimiters as $sDelimiter) {\n                    if ($oParserState->comes($sDelimiter)) {\n                        array_push($aStack, $oParserState->consume($sDelimiter));\n                        $oParserState->consumeWhiteSpace();\n                        $bFoundDelimiter = true;\n                        break;\n                    }\n                }\n                if (!$bFoundDelimiter) {\n                    //Whitespace was the list delimiter\n                    array_push($aStack, ' ');\n                }\n            }\n            array_push($aStack, self::parsePrimitiveValue($oParserState));\n            $oParserState->consumeWhiteSpace();\n        }\n        // Convert the list to list objects\n        foreach ($aListDelimiters as $sDelimiter) {\n            if (count($aStack) === 1) {\n                return $aStack[0];\n            }\n            $iStartPosition = null;\n            while (($iStartPosition = array_search($sDelimiter, $aStack, true)) !== false) {\n                $iLength = 2; //Number of elements to be joined\n                for ($i = $iStartPosition + 2; $i < count($aStack); $i += 2, ++$iLength) {\n                    if ($sDelimiter !== $aStack[$i]) {\n                        break;\n                    }\n                }\n                $oList = new RuleValueList($sDelimiter, $oParserState->currentLine());\n                for ($i = $iStartPosition - 1; $i - $iStartPosition + 1 < $iLength * 2; $i += 2) {\n                    $oList->addListComponent($aStack[$i]);\n                }\n                array_splice($aStack, $iStartPosition - 1, $iLength * 2 - 1, [$oList]);\n            }\n        }\n        if (!isset($aStack[0])) {\n            throw new UnexpectedTokenException(\n                \" {$oParserState->peek()} \",\n                $oParserState->peek(1, -1) . $oParserState->peek(2),\n                'literal',\n                $oParserState->currentLine()\n            );\n        }\n        return $aStack[0];\n    }\n\n    /**\n     * @param bool $bIgnoreCase\n     *\n     * @return CSSFunction|string\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    public static function parseIdentifierOrFunction(ParserState $oParserState, $bIgnoreCase = false)\n    {\n        $sResult = $oParserState->parseIdentifier($bIgnoreCase);\n\n        if ($oParserState->comes('(')) {\n            $oParserState->consume('(');\n            $aArguments = Value::parseValue($oParserState, ['=', ' ', ',']);\n            $sResult = new CSSFunction($sResult, $aArguments, ',', $oParserState->currentLine());\n            $oParserState->consume(')');\n        }\n\n        return $sResult;\n    }\n\n    /**\n     * @return CSSFunction|CSSString|LineName|Size|URL|string\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     * @throws SourceException\n     */\n    public static function parsePrimitiveValue(ParserState $oParserState)\n    {\n        $oValue = null;\n        $oParserState->consumeWhiteSpace();\n        if (\n            is_numeric($oParserState->peek())\n            || ($oParserState->comes('-.')\n                && is_numeric($oParserState->peek(1, 2)))\n            || (($oParserState->comes('-') || $oParserState->comes('.')) && is_numeric($oParserState->peek(1, 1)))\n        ) {\n            $oValue = Size::parse($oParserState);\n        } elseif ($oParserState->comes('#') || $oParserState->comes('rgb', true) || $oParserState->comes('hsl', true)) {\n            $oValue = Color::parse($oParserState);\n        } elseif ($oParserState->comes('url', true)) {\n            $oValue = URL::parse($oParserState);\n        } elseif (\n            $oParserState->comes('calc', true) || $oParserState->comes('-webkit-calc', true)\n            || $oParserState->comes('-moz-calc', true)\n        ) {\n            $oValue = CalcFunction::parse($oParserState);\n        } elseif ($oParserState->comes(\"'\") || $oParserState->comes('\"')) {\n            $oValue = CSSString::parse($oParserState);\n        } elseif ($oParserState->comes(\"progid:\") && $oParserState->getSettings()->bLenientParsing) {\n            $oValue = self::parseMicrosoftFilter($oParserState);\n        } elseif ($oParserState->comes(\"[\")) {\n            $oValue = LineName::parse($oParserState);\n        } elseif ($oParserState->comes(\"U+\")) {\n            $oValue = self::parseUnicodeRangeValue($oParserState);\n        } else {\n            $oValue = self::parseIdentifierOrFunction($oParserState);\n        }\n        $oParserState->consumeWhiteSpace();\n        return $oValue;\n    }\n\n    /**\n     * @return CSSFunction\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    private static function parseMicrosoftFilter(ParserState $oParserState)\n    {\n        $sFunction = $oParserState->consumeUntil('(', false, true);\n        $aArguments = Value::parseValue($oParserState, [',', '=']);\n        return new CSSFunction($sFunction, $aArguments, ',', $oParserState->currentLine());\n    }\n\n    /**\n     * @return string\n     *\n     * @throws UnexpectedEOFException\n     * @throws UnexpectedTokenException\n     */\n    private static function parseUnicodeRangeValue(ParserState $oParserState)\n    {\n        $iCodepointMaxLength = 6; // Code points outside BMP can use up to six digits\n        $sRange = \"\";\n        $oParserState->consume(\"U+\");\n        do {\n            if ($oParserState->comes('-')) {\n                $iCodepointMaxLength = 13; // Max length is 2 six digit code points + the dash(-) between them\n            }\n            $sRange .= $oParserState->consume(1);\n        } while (strlen($sRange) < $iCodepointMaxLength && preg_match(\"/[A-Fa-f0-9\\?-]/\", $oParserState->peek()));\n        return \"U+{$sRange}\";\n    }\n\n    /**\n     * @return int\n     */\n    public function getLineNo()\n    {\n        return $this->iLineNo;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-css-parser/src/Value/ValueList.php",
    "content": "<?php\n\nnamespace Sabberworm\\CSS\\Value;\n\nuse Sabberworm\\CSS\\OutputFormat;\n\nabstract class ValueList extends Value\n{\n    /**\n     * @var array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string>\n     */\n    protected $aComponents;\n\n    /**\n     * @var string\n     */\n    protected $sSeparator;\n\n    /**\n     * phpcs:ignore Generic.Files.LineLength\n     * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string>|RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string $aComponents\n     * @param string $sSeparator\n     * @param int $iLineNo\n     */\n    public function __construct($aComponents = [], $sSeparator = ',', $iLineNo = 0)\n    {\n        parent::__construct($iLineNo);\n        if (!is_array($aComponents)) {\n            $aComponents = [$aComponents];\n        }\n        $this->aComponents = $aComponents;\n        $this->sSeparator = $sSeparator;\n    }\n\n    /**\n     * @param RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string $mComponent\n     *\n     * @return void\n     */\n    public function addListComponent($mComponent)\n    {\n        $this->aComponents[] = $mComponent;\n    }\n\n    /**\n     * @return array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string>\n     */\n    public function getListComponents()\n    {\n        return $this->aComponents;\n    }\n\n    /**\n     * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aComponents\n     *\n     * @return void\n     */\n    public function setListComponents(array $aComponents)\n    {\n        $this->aComponents = $aComponents;\n    }\n\n    /**\n     * @return string\n     */\n    public function getListSeparator()\n    {\n        return $this->sSeparator;\n    }\n\n    /**\n     * @param string $sSeparator\n     *\n     * @return void\n     */\n    public function setListSeparator($sSeparator)\n    {\n        $this->sSeparator = $sSeparator;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->render(new OutputFormat());\n    }\n\n    /**\n     * @return string\n     */\n    public function render(OutputFormat $oOutputFormat)\n    {\n        return $oOutputFormat->implode(\n            $oOutputFormat->spaceBeforeListArgumentSeparator($this->sSeparator) . $this->sSeparator\n            . $oOutputFormat->spaceAfterListArgumentSeparator($this->sSeparator),\n            $this->aComponents\n        );\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/.htaccess",
    "content": "#deny from all"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/LICENSE",
    "content": "      GNU LESSER GENERAL PUBLIC LICENSE\n           Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n          Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n      GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n          NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES."
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/README.md",
    "content": "[![PHPUnit tests](https://github.com/dompdf/php-font-lib/actions/workflows/phpunit.yml/badge.svg)](https://github.com/dompdf/php-font-lib/actions/workflows/phpunit.yml)\n\n# PHP Font Lib\n\nThis library can be used to:\n * Read TrueType, OpenType (with TrueType glyphs), WOFF font files\n * Extract basic info (name, style, etc)\n * Extract advanced info (horizontal metrics, glyph names, glyph shapes, etc)\n * Make an Adobe Font Metrics (AFM) file from a font\n\nYou can find a demo GUI [here](http://pxd.me/php-font-lib/www/font_explorer.html).\n\nThis project was initiated by the need to read font files in the [DOMPDF project](https://github.com/dompdf/dompdf).\n\nUsage Example\n-------------\n\n```\n$font = \\FontLib\\Font::load('../../fontfile.ttf');\n$font->parse();  // for getFontWeight() to work this call must be done first!\necho $font->getFontName() .'<br>';\necho $font->getFontSubfamily() .'<br>';\necho $font->getFontSubfamilyID() .'<br>';\necho $font->getFontFullName() .'<br>';\necho $font->getFontVersion() .'<br>';\necho $font->getFontWeight() .'<br>';\necho $font->getFontPostscriptName() .'<br>';\n```\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/bower.json",
    "content": "{\n  \"name\": \"php-font-lib\",\n  \"version\": \"0.3.1\",\n  \"license\": \"LGPL-3.0\",  \n  \"keywords\": [\n    \"font\",\n    \"parse\",\n    \"export\",\n    \"truetype\",\n    \"opentype\",\n    \"woff\"\n  ],\n  \"homepage\": \"https://github.com/PhenX/php-font-lib\",\n  \"_release\": \"0.3.1\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v0.3.1\",\n    \"commit\": \"d13682b7e27d14a6323c441426f3dde1cd86c751\"\n  },\n  \"_source\": \"https://github.com/PhenX/php-font-lib.git\",\n  \"_target\": \"*\",\n  \"_originalSource\": \"https://github.com/PhenX/php-font-lib.git\"\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/composer.json",
    "content": "{\n    \"name\": \"phenx/php-font-lib\",\n    \"type\": \"library\",\n    \"description\": \"A library to read, parse, export and make subsets of different types of font files.\",\n    \"homepage\": \"https://github.com/PhenX/php-font-lib\",\n    \"license\": \"LGPL-3.0\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Ménager\",\n            \"email\": \"fabien.menager@gmail.com\"\n        }\n    ],\n    \"autoload\": {\n        \"psr-4\": {\n            \"FontLib\\\\\": \"src/FontLib\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"FontLib\\\\Tests\\\\\": \"tests/FontLib\"\n        }\n    },\n    \"config\": {\n        \"bin-dir\": \"bin\"\n    },\n    \"require\": {\n        \"ext-mbstring\": \"*\"\n    },\n    \"require-dev\": {\n        \"symfony/phpunit-bridge\" : \"^3 || ^4 || ^5\"\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/index.php",
    "content": "<?php header(\"Location: www/\"); ?>"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/AdobeFontMetrics.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib;\n\nuse FontLib\\Table\\Type\\name;\nuse FontLib\\TrueType\\File;\n\n/**\n * Adobe Font Metrics file creation utility class.\n *\n * @package php-font-lib\n */\nclass AdobeFontMetrics {\n  private $f;\n\n  /**\n   * @var File\n   */\n  private $font;\n\n  function __construct(File $font) {\n    $this->font = $font;\n  }\n\n  function write($file, $encoding = null) {\n    $map_data = array();\n\n    if ($encoding) {\n      $encoding = preg_replace(\"/[^a-z0-9-_]/\", \"\", $encoding);\n      $map_file = dirname(__FILE__) . \"/../maps/$encoding.map\";\n      if (!file_exists($map_file)) {\n        throw new \\Exception(\"Unknown encoding ($encoding)\");\n      }\n\n      $map      = new EncodingMap($map_file);\n      $map_data = $map->parse();\n    }\n\n    $this->f = fopen($file, \"w+\");\n\n    $font = $this->font;\n\n    $this->startSection(\"FontMetrics\", 4.1);\n    $this->addPair(\"Notice\", \"Converted by PHP-font-lib\");\n    $this->addPair(\"Comment\", \"https://github.com/PhenX/php-font-lib\");\n\n    $encoding_scheme = ($encoding ? $encoding : \"FontSpecific\");\n    $this->addPair(\"EncodingScheme\", $encoding_scheme);\n\n    $records = $font->getData(\"name\", \"records\");\n    foreach ($records as $id => $record) {\n      if (!isset(name::$nameIdCodes[$id]) || preg_match(\"/[\\r\\n]/\", $record->string)) {\n        continue;\n      }\n\n      $this->addPair(name::$nameIdCodes[$id], $record->string);\n    }\n\n    $os2 = $font->getData(\"OS/2\");\n    $this->addPair(\"Weight\", ($os2[\"usWeightClass\"] > 400 ? \"Bold\" : \"Medium\"));\n\n    $post = $font->getData(\"post\");\n    $this->addPair(\"ItalicAngle\", $post[\"italicAngle\"]);\n    $this->addPair(\"IsFixedPitch\", ($post[\"isFixedPitch\"] ? \"true\" : \"false\"));\n    $this->addPair(\"UnderlineThickness\", $font->normalizeFUnit($post[\"underlineThickness\"]));\n    $this->addPair(\"UnderlinePosition\", $font->normalizeFUnit($post[\"underlinePosition\"]));\n\n    $hhea = $font->getData(\"hhea\");\n\n    if (isset($hhea[\"ascent\"])) {\n      $this->addPair(\"FontHeightOffset\", $font->normalizeFUnit($hhea[\"lineGap\"]));\n      $this->addPair(\"Ascender\", $font->normalizeFUnit($hhea[\"ascent\"]));\n      $this->addPair(\"Descender\", $font->normalizeFUnit($hhea[\"descent\"]));\n    }\n    else {\n      $this->addPair(\"FontHeightOffset\", $font->normalizeFUnit($os2[\"typoLineGap\"]));\n      $this->addPair(\"Ascender\", $font->normalizeFUnit($os2[\"typoAscender\"]));\n      $this->addPair(\"Descender\", -abs($font->normalizeFUnit($os2[\"typoDescender\"])));\n    }\n\n    $head = $font->getData(\"head\");\n    $this->addArray(\"FontBBox\", array(\n      $font->normalizeFUnit($head[\"xMin\"]),\n      $font->normalizeFUnit($head[\"yMin\"]),\n      $font->normalizeFUnit($head[\"xMax\"]),\n      $font->normalizeFUnit($head[\"yMax\"]),\n    ));\n\n    $glyphIndexArray = $font->getUnicodeCharMap();\n\n    if ($glyphIndexArray) {\n      $hmtx  = $font->getData(\"hmtx\");\n      $names = $font->getData(\"post\", \"names\");\n\n      $this->startSection(\"CharMetrics\", count($hmtx));\n\n      if ($encoding) {\n        foreach ($map_data as $code => $value) {\n          list($c, $name) = $value;\n\n          if (!isset($glyphIndexArray[$c])) {\n            continue;\n          }\n\n          $g = $glyphIndexArray[$c];\n\n          if (!isset($hmtx[$g])) {\n            $hmtx[$g] = $hmtx[0];\n          }\n\n          $this->addMetric(array(\n            \"C\"  => ($code > 255 ? -1 : $code),\n            \"WX\" => $font->normalizeFUnit($hmtx[$g][0]),\n            \"N\"  => $name,\n          ));\n        }\n      }\n      else {\n        foreach ($glyphIndexArray as $c => $g) {\n          if (!isset($hmtx[$g])) {\n            $hmtx[$g] = $hmtx[0];\n          }\n\n          $this->addMetric(array(\n            \"U\"  => $c,\n            \"WX\" => $font->normalizeFUnit($hmtx[$g][0]),\n            \"N\"  => (isset($names[$g]) ? $names[$g] : sprintf(\"uni%04x\", $c)),\n            \"G\"  => $g,\n          ));\n        }\n      }\n\n      $this->endSection(\"CharMetrics\");\n\n      $kern = $font->getData(\"kern\", \"subtable\");\n      $tree = is_array($kern) ? $kern[\"tree\"] : null;\n\n      if (!$encoding && is_array($tree)) {\n        $this->startSection(\"KernData\");\n        $this->startSection(\"KernPairs\", count($tree, COUNT_RECURSIVE) - count($tree));\n\n        foreach ($tree as $left => $values) {\n          if (!is_array($values)) {\n            continue;\n          }\n          if (!isset($glyphIndexArray[$left])) {\n            continue;\n          }\n\n          $left_gid = $glyphIndexArray[$left];\n\n          if (!isset($names[$left_gid])) {\n            continue;\n          }\n\n          $left_name = $names[$left_gid];\n\n          $this->addLine(\"\");\n\n          foreach ($values as $right => $value) {\n            if (!isset($glyphIndexArray[$right])) {\n              continue;\n            }\n\n            $right_gid = $glyphIndexArray[$right];\n\n            if (!isset($names[$right_gid])) {\n              continue;\n            }\n\n            $right_name = $names[$right_gid];\n            $this->addPair(\"KPX\", \"$left_name $right_name $value\");\n          }\n        }\n\n        $this->endSection(\"KernPairs\");\n        $this->endSection(\"KernData\");\n      }\n    }\n\n    $this->endSection(\"FontMetrics\");\n  }\n\n  function addLine($line) {\n    fwrite($this->f, \"$line\\n\");\n  }\n\n  function addPair($key, $value) {\n    $this->addLine(\"$key $value\");\n  }\n\n  function addArray($key, $array) {\n    $this->addLine(\"$key \" . implode(\" \", $array));\n  }\n\n  function addMetric($data) {\n    $array = array();\n    foreach ($data as $key => $value) {\n      $array[] = \"$key $value\";\n    }\n    $this->addLine(implode(\" ; \", $array));\n  }\n\n  function startSection($name, $value = \"\") {\n    $this->addLine(\"Start$name $value\");\n  }\n\n  function endSection($name) {\n    $this->addLine(\"End$name\");\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Autoloader.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Mnager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib;\n\n/**\n * Autoloads FontLib classes\n *\n * @package php-font-lib\n */\nclass Autoloader {\n  const PREFIX = 'FontLib';\n\n  /**\n   * Register the autoloader\n   */\n  public static function register() {\n    spl_autoload_register(array(new self, 'autoload'));\n  }\n\n  /**\n   * Autoloader\n   *\n   * @param string\n   */\n  public static function autoload($class) {\n    $prefixLength = strlen(self::PREFIX);\n    if (0 === strncmp(self::PREFIX, $class, $prefixLength)) {\n      $file = str_replace('\\\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength));\n      $file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php');\n      if (file_exists($file)) {\n        require_once $file;\n      }\n    }\n  }\n}\n\nAutoloader::register();"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/BinaryStream.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib;\n\n/**\n * Generic font file binary stream.\n *\n * @package php-font-lib\n */\nclass BinaryStream {\n  /**\n   * @var resource The file pointer\n   */\n  protected $f;\n\n  const uint8        = 1;\n  const  int8        = 2;\n  const uint16       = 3;\n  const  int16       = 4;\n  const uint32       = 5;\n  const  int32       = 6;\n  const shortFrac    = 7;\n  const Fixed        = 8;\n  const  FWord       = 9;\n  const uFWord       = 10;\n  const F2Dot14      = 11;\n  const longDateTime = 12;\n  const char         = 13;\n\n  const modeRead      = \"rb\";\n  const modeWrite     = \"wb\";\n  const modeReadWrite = \"rb+\";\n\n  static function backtrace() {\n    var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));\n  }\n\n  /**\n   * Open a font file in read mode\n   *\n   * @param string $filename The file name of the font to open\n   *\n   * @return bool\n   */\n  public function load($filename) {\n    return $this->open($filename, self::modeRead);\n  }\n\n  /**\n   * Open a font file in a chosen mode\n   *\n   * @param string $filename The file name of the font to open\n   * @param string $mode     The opening mode\n   *\n   * @throws \\Exception\n   * @return bool\n   */\n  public function open($filename, $mode = self::modeRead) {\n    if (!in_array($mode, array(self::modeRead, self::modeWrite, self::modeReadWrite))) {\n      throw new \\Exception(\"Unknown file open mode\");\n    }\n\n    $this->f = fopen($filename, $mode);\n\n    return $this->f != false;\n  }\n\n  /**\n   * Close the internal file pointer\n   */\n  public function close() {\n    return fclose($this->f) != false;\n  }\n\n  /**\n   * Change the internal file pointer\n   *\n   * @param resource $fp\n   *\n   * @throws \\Exception\n   */\n  public function setFile($fp) {\n    if (!is_resource($fp)) {\n      throw new \\Exception('$fp is not a valid resource');\n    }\n\n    $this->f = $fp;\n  }\n\n  /**\n   * Create a temporary file in write mode\n   *\n   * @param bool $allow_memory Allow in-memory files\n   *\n   * @return resource the temporary file pointer resource\n   */\n  public static function getTempFile($allow_memory = true) {\n    $f = null;\n\n    if ($allow_memory) {\n      $f = fopen(\"php://temp\", \"rb+\");\n    }\n    else {\n      $f = fopen(tempnam(sys_get_temp_dir(), \"fnt\"), \"rb+\");\n    }\n\n    return $f;\n  }\n\n  /**\n   * Move the internal file pinter to $offset bytes\n   *\n   * @param int $offset\n   *\n   * @return bool True if the $offset position exists in the file\n   */\n  public function seek($offset) {\n    return fseek($this->f, $offset, SEEK_SET) == 0;\n  }\n\n  /**\n   * Gives the current position in the file\n   *\n   * @return int The current position\n   */\n  public function pos() {\n    return ftell($this->f);\n  }\n\n  public function skip($n) {\n    fseek($this->f, $n, SEEK_CUR);\n  }\n\n  /**\n   * @param int $n The number of bytes to read\n   *\n   * @return string\n   */\n  public function read($n) {\n    if ($n < 1) {\n      return \"\";\n    }\n\n    return (string) fread($this->f, $n);\n  }\n\n  public function write($data, $length = null) {\n    if ($data === null || $data === \"\" || $data === false) {\n      return 0;\n    }\n\n    return fwrite($this->f, $data, $length);\n  }\n\n  public function readUInt8() {\n    return ord($this->read(1));\n  }\n\n  public function readUInt8Many($count) {\n    return array_values(unpack(\"C*\", $this->read($count)));\n  }\n\n  public function writeUInt8($data) {\n    return $this->write(chr($data), 1);\n  }\n\n  public function readInt8() {\n    $v = $this->readUInt8();\n\n    if ($v >= 0x80) {\n      $v -= 0x100;\n    }\n\n    return $v;\n  }\n\n  public function readInt8Many($count) {\n    return array_values(unpack(\"c*\", $this->read($count)));\n  }\n\n  public function writeInt8($data) {\n    if ($data < 0) {\n      $data += 0x100;\n    }\n\n    return $this->writeUInt8($data);\n  }\n\n  public function readUInt16() {\n    $a = unpack(\"nn\", $this->read(2));\n\n    return $a[\"n\"];\n  }\n\n  public function readUInt16Many($count) {\n    return array_values(unpack(\"n*\", $this->read($count * 2)));\n  }\n\n  public function readUFWord() {\n    return $this->readUInt16();\n  }\n\n  public function writeUInt16($data) {\n    return $this->write(pack(\"n\", $data), 2);\n  }\n\n  public function writeUFWord($data) {\n    return $this->writeUInt16($data);\n  }\n\n  public function readInt16() {\n    $a = unpack(\"nn\", $this->read(2));\n    $v = $a[\"n\"];\n\n    if ($v >= 0x8000) {\n      $v -= 0x10000;\n    }\n\n    return $v;\n  }\n\n  public function readInt16Many($count) {\n    $vals = array_values(unpack(\"n*\", $this->read($count * 2)));\n    foreach ($vals as &$v) {\n      if ($v >= 0x8000) {\n        $v -= 0x10000;\n      }\n    }\n\n    return $vals;\n  }\n\n  public function readFWord() {\n    return $this->readInt16();\n  }\n\n  public function writeInt16($data) {\n    if ($data < 0) {\n      $data += 0x10000;\n    }\n\n    return $this->writeUInt16($data);\n  }\n\n  public function writeFWord($data) {\n    return $this->writeInt16($data);\n  }\n\n  public function readUInt32() {\n    $a = unpack(\"NN\", $this->read(4));\n\n    return $a[\"N\"];\n  }\n\n  public function writeUInt32($data) {\n    return $this->write(pack(\"N\", $data), 4);\n  }\n\n  public function readFixed() {\n    $d  = $this->readInt16();\n    $d2 = $this->readUInt16();\n\n    return round($d + $d2 / 0x10000, 4);\n  }\n\n  public function writeFixed($data) {\n    $left  = floor($data);\n    $right = ($data - $left) * 0x10000;\n\n    return $this->writeInt16($left) + $this->writeUInt16($right);\n  }\n\n  public function readLongDateTime() {\n    $this->readUInt32(); // ignored\n    $date = $this->readUInt32() - 2082844800;\n    \n    # PHP_INT_MIN isn't defined in PHP < 7.0\n    $php_int_min = defined(\"PHP_INT_MIN\") ? PHP_INT_MIN : ~PHP_INT_MAX;\n\n    if (is_string($date) || $date > PHP_INT_MAX || $date < $php_int_min) {\n      $date = 0;\n    }\n\n    return date(\"Y-m-d H:i:s\", $date);\n  }\n\n  public function writeLongDateTime($data) {\n    $date = strtotime($data);\n    $date += 2082844800;\n\n    return $this->writeUInt32(0) + $this->writeUInt32($date);\n  }\n\n  public function unpack($def) {\n    $d = array();\n    foreach ($def as $name => $type) {\n      $d[$name] = $this->r($type);\n    }\n\n    return $d;\n  }\n\n  public function pack($def, $data) {\n    $bytes = 0;\n    foreach ($def as $name => $type) {\n      $bytes += $this->w($type, $data[$name]);\n    }\n\n    return $bytes;\n  }\n\n  /**\n   * Read a data of type $type in the file from the current position\n   *\n   * @param mixed $type The data type to read\n   *\n   * @return mixed The data that was read\n   */\n  public function r($type) {\n    switch ($type) {\n      case self::uint8:\n        return $this->readUInt8();\n      case self::int8:\n        return $this->readInt8();\n      case self::uint16:\n        return $this->readUInt16();\n      case self::int16:\n        return $this->readInt16();\n      case self::uint32:\n        return $this->readUInt32();\n      case self::int32:\n        return $this->readUInt32();\n      case self::shortFrac:\n        return $this->readFixed();\n      case self::Fixed:\n        return $this->readFixed();\n      case self::FWord:\n        return $this->readInt16();\n      case self::uFWord:\n        return $this->readUInt16();\n      case self::F2Dot14:\n        return $this->readInt16();\n      case self::longDateTime:\n        return $this->readLongDateTime();\n      case self::char:\n        return $this->read(1);\n      default:\n        if (is_array($type)) {\n          if ($type[0] == self::char) {\n            return $this->read($type[1]);\n          }\n          if ($type[0] == self::uint16) {\n            return $this->readUInt16Many($type[1]);\n          }\n          if ($type[0] == self::int16) {\n            return $this->readInt16Many($type[1]);\n          }\n          if ($type[0] == self::uint8) {\n            return $this->readUInt8Many($type[1]);\n          }\n          if ($type[0] == self::int8) {\n            return $this->readInt8Many($type[1]);\n          }\n\n          $ret = array();\n          for ($i = 0; $i < $type[1]; $i++) {\n            $ret[] = $this->r($type[0]);\n          }\n\n          return $ret;\n        }\n\n        return null;\n    }\n  }\n\n  /**\n   * Write $data of type $type in the file from the current position\n   *\n   * @param mixed $type The data type to write\n   * @param mixed $data The data to write\n   *\n   * @return int The number of bytes read\n   */\n  public function w($type, $data) {\n    switch ($type) {\n      case self::uint8:\n        return $this->writeUInt8($data);\n      case self::int8:\n        return $this->writeInt8($data);\n      case self::uint16:\n        return $this->writeUInt16($data);\n      case self::int16:\n        return $this->writeInt16($data);\n      case self::uint32:\n        return $this->writeUInt32($data);\n      case self::int32:\n        return $this->writeUInt32($data);\n      case self::shortFrac:\n        return $this->writeFixed($data);\n      case self::Fixed:\n        return $this->writeFixed($data);\n      case self::FWord:\n        return $this->writeInt16($data);\n      case self::uFWord:\n        return $this->writeUInt16($data);\n      case self::F2Dot14:\n        return $this->writeInt16($data);\n      case self::longDateTime:\n        return $this->writeLongDateTime($data);\n      case self::char:\n        return $this->write($data, 1);\n      default:\n        if (is_array($type)) {\n          if ($type[0] == self::char) {\n            return $this->write($data, $type[1]);\n          }\n\n          $ret = 0;\n          for ($i = 0; $i < $type[1]; $i++) {\n            if (isset($data[$i])) {\n              $ret += $this->w($type[0], $data[$i]);\n            }\n          }\n\n          return $ret;\n        }\n\n        return null;\n    }\n  }\n\n  /**\n   * Converts a Uint32 value to string\n   *\n   * @param int $uint32\n   *\n   * @return string The string\n   */\n  public function convertUInt32ToStr($uint32) {\n    return chr(($uint32 >> 24) & 0xFF) . chr(($uint32 >> 16) & 0xFF) . chr(($uint32 >> 8) & 0xFF) . chr($uint32 & 0xFF);\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/EOT/File.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\EOT;\n\n/**\n * EOT font file.\n *\n * @package php-font-lib\n */\nclass File extends \\FontLib\\TrueType\\File {\n  const TTEMBED_SUBSET                   = 0x00000001;\n  const TTEMBED_TTCOMPRESSED             = 0x00000004;\n  const TTEMBED_FAILIFVARIATIONSIMULATED = 0x00000010;\n  const TTMBED_EMBEDEUDC                 = 0x00000020;\n  const TTEMBED_VALIDATIONTESTS          = 0x00000040; // Deprecated\n  const TTEMBED_WEBOBJECT      = 0x00000080;\n  const TTEMBED_XORENCRYPTDATA = 0x10000000;\n\n  /**\n   * @var Header\n   */\n  public $header;\n\n  function parseHeader() {\n    if (!empty($this->header)) {\n      return;\n    }\n\n    $this->header = new Header($this);\n    $this->header->parse();\n  }\n\n  function parse() {\n    $this->parseHeader();\n\n    $flags = $this->header->data[\"Flags\"];\n\n    if ($flags & self::TTEMBED_TTCOMPRESSED) {\n      $mtx_version    = $this->readUInt8();\n      $mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();\n      $mtx_offset_1   = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();\n      $mtx_offset_2   = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();\n      /*\n      var_dump(\"$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2\");\n\n      $pos = $this->pos();\n      $size = $mtx_offset_1 - $pos;\n      var_dump(\"pos: $pos\");\n      var_dump(\"size: $size\");*/\n    }\n\n    if ($flags & self::TTEMBED_XORENCRYPTDATA) {\n      // Process XOR\n    }\n    // TODO Read font data ...\n  }\n\n  /**\n   * Little endian version of the read method\n   *\n   * @param int $n The number of bytes to read\n   *\n   * @return string\n   */\n  public function read($n) {\n    if ($n < 1) {\n      return \"\";\n    }\n\n    $string = (string) fread($this->f, $n);\n    $chunks = mb_str_split($string, 2, '8bit');\n    $chunks = array_map(\"strrev\", $chunks);\n    return implode(\"\", $chunks);\n  }\n\n  public function readUInt32() {\n    $uint32 = parent::readUInt32();\n\n    return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000;\n  }\n\n  /**\n   * Get font copyright\n   *\n   * @return string|null\n   */\n  function getFontCopyright() {\n    return null;\n  }\n\n  /**\n   * Get font name\n   *\n   * @return string|null\n   */\n  function getFontName() {\n    return $this->header->data[\"FamilyName\"];\n  }\n\n  /**\n   * Get font subfamily\n   *\n   * @return string|null\n   */\n  function getFontSubfamily() {\n    return $this->header->data[\"StyleName\"];\n  }\n\n  /**\n   * Get font subfamily ID\n   *\n   * @return string|null\n   */\n  function getFontSubfamilyID() {\n    return $this->header->data[\"StyleName\"];\n  }\n\n  /**\n   * Get font full name\n   *\n   * @return string|null\n   */\n  function getFontFullName() {\n    return $this->header->data[\"FullName\"];\n  }\n\n  /**\n   * Get font version\n   *\n   * @return string|null\n   */\n  function getFontVersion() {\n    return $this->header->data[\"VersionName\"];\n  }\n\n  /**\n   * Get font weight\n   *\n   * @return string|null\n   */\n  function getFontWeight() {\n    return $this->header->data[\"Weight\"];\n  }\n\n  /**\n   * Get font Postscript name\n   *\n   * @return string|null\n   */\n  function getFontPostscriptName() {\n    return null;\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/EOT/Header.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\EOT;\n\nuse Exception;\nuse FontLib\\Font;\n\n/**\n * TrueType font file header.\n *\n * @package php-font-lib\n *\n * @property File $font\n */\nclass Header extends \\FontLib\\Header {\n  protected $def = array(\n    \"format\"        => self::uint32,\n    \"numTables\"     => self::uint16,\n    \"searchRange\"   => self::uint16,\n    \"entrySelector\" => self::uint16,\n    \"rangeShift\"    => self::uint16,\n  );\n\n  public function parse() {\n    $font = $this->font;\n\n    $this->data = $font->unpack(array(\n      \"EOTSize\"            => self::uint32,\n      \"FontDataSize\"       => self::uint32,\n      \"Version\"            => self::uint32,\n      \"Flags\"              => self::uint32,\n      \"FontPANOSE\"         => array(self::uint8, 10),\n      \"Charset\"            => self::uint8,\n      \"Italic\"             => self::uint8,\n      \"Weight\"             => self::uint32,\n      \"fsType\"             => self::uint16,\n      \"MagicNumber\"        => self::uint16,\n      \"UnicodeRange1\"      => self::uint32,\n      \"UnicodeRange2\"      => self::uint32,\n      \"UnicodeRange3\"      => self::uint32,\n      \"UnicodeRange4\"      => self::uint32,\n      \"CodePageRange1\"     => self::uint32,\n      \"CodePageRange2\"     => self::uint32,\n      \"CheckSumAdjustment\" => self::uint32,\n      \"Reserved1\"          => self::uint32,\n      \"Reserved2\"          => self::uint32,\n      \"Reserved3\"          => self::uint32,\n      \"Reserved4\"          => self::uint32,\n    ));\n\n    $this->data[\"Padding1\"] = $font->readUInt16();\n    $this->readString(\"FamilyName\");\n\n    $this->data[\"Padding2\"] = $font->readUInt16();\n    $this->readString(\"StyleName\");\n\n    $this->data[\"Padding3\"] = $font->readUInt16();\n    $this->readString(\"VersionName\");\n\n    $this->data[\"Padding4\"] = $font->readUInt16();\n    $this->readString(\"FullName\");\n\n    switch ($this->data[\"Version\"]) {\n      default:\n        throw new Exception(\"Unknown EOT version \" . $this->data[\"Version\"]);\n\n      case 0x00010000:\n        // Nothing to do more\n        break;\n\n      case 0x00020001:\n        $this->data[\"Padding5\"] = $font->readUInt16();\n        $this->readString(\"RootString\");\n        break;\n\n      case 0x00020002:\n        $this->data[\"Padding5\"] = $font->readUInt16();\n        $this->readString(\"RootString\");\n\n        $this->data[\"RootStringCheckSum\"] = $font->readUInt32();\n        $this->data[\"EUDCCodePage\"]       = $font->readUInt32();\n\n        $this->data[\"Padding6\"] = $font->readUInt16();\n        $this->readString(\"Signature\");\n\n        $this->data[\"EUDCFlags\"]    = $font->readUInt32();\n        $this->data[\"EUDCFontSize\"] = $font->readUInt32();\n        break;\n    }\n\n    if (!empty($this->data[\"RootString\"])) {\n      $this->data[\"RootString\"] = explode(\"\\0\", $this->data[\"RootString\"]);\n    }\n  }\n\n  private function readString($name) {\n    $font = $this->font;\n    $size = $font->readUInt16();\n\n    $this->data[\"{$name}Size\"] = $size;\n    $this->data[$name]         = Font::UTF16ToUTF8($font->read($size));\n  }\n\n  public function encode() {\n    //return $this->font->pack($this->def, $this->data);\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/EncodingMap.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib;\n\n/**\n * Encoding map used to map a code point to a Unicode char.\n *\n * @package php-font-lib\n */\nclass EncodingMap {\n  private $f;\n\n  function __construct($file) {\n    $this->f = fopen($file, \"r\");\n  }\n\n  function parse() {\n    $map = array();\n\n    while ($line = fgets($this->f)) {\n      if (preg_match('/^[\\!\\=]([0-9A-F]{2,})\\s+U\\+([0-9A-F]{2})([0-9A-F]{2})\\s+([^\\s]+)/', $line, $matches)) {\n        $unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]);\n        $map[hexdec($matches[1])] = array($unicode, $matches[4]);\n      }\n    }\n\n    ksort($map);\n\n    return $map;\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Exception/FontNotFoundException.php",
    "content": "<?php\n\nnamespace FontLib\\Exception;\n\nclass FontNotFoundException extends \\Exception\n{\n    public function __construct($fontPath)\n    {\n        $this->message = 'Font not found in: ' . $fontPath;\n    }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Font.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib;\n\nuse FontLib\\Exception\\FontNotFoundException;\n\n/**\n * Generic font file.\n *\n * @package php-font-lib\n */\nclass Font {\n  static $debug = false;\n\n  /**\n   * @param string $file The font file\n   *\n   * @return TrueType\\File|null $file\n   */\n  public static function load($file) {\n      if(!file_exists($file)){\n          throw new FontNotFoundException($file);\n      }\n\n    $header = file_get_contents($file, false, null, 0, 4);\n    $class  = null;\n\n    switch ($header) {\n      case \"\\x00\\x01\\x00\\x00\":\n      case \"true\":\n      case \"typ1\":\n        $class = \"TrueType\\\\File\";\n        break;\n\n      case \"OTTO\":\n        $class = \"OpenType\\\\File\";\n        break;\n\n      case \"wOFF\":\n        $class = \"WOFF\\\\File\";\n        break;\n\n      case \"ttcf\":\n        $class = \"TrueType\\\\Collection\";\n        break;\n\n      // Unknown type or EOT\n      default:\n        $magicNumber = file_get_contents($file, false, null, 34, 2);\n\n        if ($magicNumber === \"LP\") {\n          $class = \"EOT\\\\File\";\n        }\n    }\n\n    if ($class) {\n      $class = \"FontLib\\\\$class\";\n\n      /** @var TrueType\\File $obj */\n      $obj = new $class;\n      $obj->load($file);\n\n      return $obj;\n    }\n\n    return null;\n  }\n\n  static function d($str) {\n    if (!self::$debug) {\n      return;\n    }\n    echo \"$str\\n\";\n  }\n\n  static function UTF16ToUTF8($str) {\n    return mb_convert_encoding($str, \"utf-8\", \"utf-16\");\n  }\n\n  static function UTF8ToUTF16($str) {\n    return mb_convert_encoding($str, \"utf-16\", \"utf-8\");\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Glyph/Outline.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $\n */\nnamespace FontLib\\Glyph;\n\nuse FontLib\\Table\\Type\\glyf;\nuse FontLib\\TrueType\\File;\nuse FontLib\\BinaryStream;\n\n/**\n * `glyf` font table.\n *\n * @package php-font-lib\n */\nclass Outline extends BinaryStream {\n  /**\n   * @var \\FontLib\\Table\\Type\\glyf\n   */\n  protected $table;\n\n  protected $offset;\n  protected $size;\n\n  // Data\n  public $numberOfContours;\n  public $xMin;\n  public $yMin;\n  public $xMax;\n  public $yMax;\n\n  /**\n   * @var string|null\n   */\n  public $raw;\n\n  /**\n   * @param glyf $table\n   * @param                 $offset\n   * @param                 $size\n   *\n   * @return Outline\n   */\n  static function init(glyf $table, $offset, $size, BinaryStream $font) {\n    $font->seek($offset);\n\n    if ($font->readInt16() > -1) {\n      /** @var OutlineSimple $glyph */\n      $glyph = new OutlineSimple($table, $offset, $size);\n    }\n    else {\n      /** @var OutlineComposite $glyph */\n      $glyph = new OutlineComposite($table, $offset, $size);\n    }\n\n    $glyph->parse($font);\n\n    return $glyph;\n  }\n\n  /**\n   * @return File\n   */\n  function getFont() {\n    return $this->table->getFont();\n  }\n\n  function __construct(glyf $table, $offset = null, $size = null) {\n    $this->table  = $table;\n    $this->offset = $offset;\n    $this->size   = $size;\n  }\n\n  function parse(BinaryStream $font) {\n    $font->seek($this->offset);\n\n      $this->raw = $font->read($this->size);\n  }\n\n  function parseData() {\n    $font = $this->getFont();\n    $font->seek($this->offset);\n\n    $this->numberOfContours = $font->readInt16();\n    $this->xMin             = $font->readFWord();\n    $this->yMin             = $font->readFWord();\n    $this->xMax             = $font->readFWord();\n    $this->yMax             = $font->readFWord();\n  }\n\n  function encode() {\n    $font = $this->getFont();\n\n    return $font->write($this->raw, mb_strlen((string) $this->raw, '8bit'));\n  }\n\n  function getSVGContours() {\n    // Inherit\n  }\n\n  function getGlyphIDs() {\n    return array();\n  }\n}\n\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Glyph/OutlineComponent.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $\n */\n\nnamespace FontLib\\Glyph;\n/**\n * Glyph outline component\n *\n * @package php-font-lib\n */\nclass OutlineComponent {\n  public $flags;\n  public $glyphIndex;\n  public $a, $b, $c, $d, $e, $f;\n  public $point_compound;\n  public $point_component;\n  public $instructions;\n\n  function getMatrix() {\n    return array(\n      $this->a, $this->b,\n      $this->c, $this->d,\n      $this->e, $this->f,\n    );\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Glyph/OutlineComposite.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $\n */\n\nnamespace FontLib\\Glyph;\n\n/**\n * Composite glyph outline\n *\n * @package php-font-lib\n */\nclass OutlineComposite extends Outline {\n  const ARG_1_AND_2_ARE_WORDS    = 0x0001;\n  const ARGS_ARE_XY_VALUES       = 0x0002;\n  const ROUND_XY_TO_GRID         = 0x0004;\n  const WE_HAVE_A_SCALE          = 0x0008;\n  const MORE_COMPONENTS          = 0x0020;\n  const WE_HAVE_AN_X_AND_Y_SCALE = 0x0040;\n  const WE_HAVE_A_TWO_BY_TWO     = 0x0080;\n  const WE_HAVE_INSTRUCTIONS     = 0x0100;\n  const USE_MY_METRICS           = 0x0200;\n  const OVERLAP_COMPOUND         = 0x0400;\n\n  /**\n   * @var OutlineComponent[]\n   */\n  public $components = array();\n\n  function getGlyphIDs() {\n    if (empty($this->components)) {\n      $this->parseData();\n    }\n\n    $glyphIDs = array();\n    foreach ($this->components as $_component) {\n      $glyphIDs[] = $_component->glyphIndex;\n\n      $_glyph   = $this->table->data[$_component->glyphIndex];\n\n      if ($_glyph !== $this) {\n        $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());\n      }\n    }\n\n    return $glyphIDs;\n  }\n\n  /*function parse() {\n    //$this->parseData();\n  }*/\n\n  function parseData() {\n    parent::parseData();\n\n    $font = $this->getFont();\n\n    do {\n      $flags      = $font->readUInt16();\n      $glyphIndex = $font->readUInt16();\n\n      $a = 1.0;\n      $b = 0.0;\n      $c = 0.0;\n      $d = 1.0;\n      $e = 0.0;\n      $f = 0.0;\n\n      $point_compound  = null;\n      $point_component = null;\n\n      $instructions = null;\n\n      if ($flags & self::ARG_1_AND_2_ARE_WORDS) {\n        if ($flags & self::ARGS_ARE_XY_VALUES) {\n          $e = $font->readInt16();\n          $f = $font->readInt16();\n        }\n        else {\n          $point_compound  = $font->readUInt16();\n          $point_component = $font->readUInt16();\n        }\n      }\n      else {\n        if ($flags & self::ARGS_ARE_XY_VALUES) {\n          $e = $font->readInt8();\n          $f = $font->readInt8();\n        }\n        else {\n          $point_compound  = $font->readUInt8();\n          $point_component = $font->readUInt8();\n        }\n      }\n\n      if ($flags & self::WE_HAVE_A_SCALE) {\n        $a = $d = $font->readInt16();\n      }\n      elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {\n        $a = $font->readInt16();\n        $d = $font->readInt16();\n      }\n      elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {\n        $a = $font->readInt16();\n        $b = $font->readInt16();\n        $c = $font->readInt16();\n        $d = $font->readInt16();\n      }\n\n      //if ($flags & self::WE_HAVE_INSTRUCTIONS) {\n      //\n      //}\n\n      $component                  = new OutlineComponent();\n      $component->flags           = $flags;\n      $component->glyphIndex      = $glyphIndex;\n      $component->a               = $a;\n      $component->b               = $b;\n      $component->c               = $c;\n      $component->d               = $d;\n      $component->e               = $e;\n      $component->f               = $f;\n      $component->point_compound  = $point_compound;\n      $component->point_component = $point_component;\n      $component->instructions    = $instructions;\n\n      $this->components[] = $component;\n    } while ($flags & self::MORE_COMPONENTS);\n  }\n\n  function encode() {\n    $font = $this->getFont();\n\n    $gids = $font->getSubset();\n\n    $size = $font->writeInt16(-1);\n    $size += $font->writeFWord($this->xMin);\n    $size += $font->writeFWord($this->yMin);\n    $size += $font->writeFWord($this->xMax);\n    $size += $font->writeFWord($this->yMax);\n\n    foreach ($this->components as $_i => $_component) {\n      $flags = 0;\n      if ($_component->point_component === null && $_component->point_compound === null) {\n        $flags |= self::ARGS_ARE_XY_VALUES;\n\n        if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) {\n          $flags |= self::ARG_1_AND_2_ARE_WORDS;\n        }\n      }\n      elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) {\n        $flags |= self::ARG_1_AND_2_ARE_WORDS;\n      }\n\n      if ($_component->b == 0 && $_component->c == 0) {\n        if ($_component->a == $_component->d) {\n          if ($_component->a != 1.0) {\n            $flags |= self::WE_HAVE_A_SCALE;\n          }\n        }\n        else {\n          $flags |= self::WE_HAVE_AN_X_AND_Y_SCALE;\n        }\n      }\n      else {\n        $flags |= self::WE_HAVE_A_TWO_BY_TWO;\n      }\n\n      if ($_i < count($this->components) - 1) {\n        $flags |= self::MORE_COMPONENTS;\n      }\n\n      $size += $font->writeUInt16($flags);\n\n      $new_gid = array_search($_component->glyphIndex, $gids);\n      $size += $font->writeUInt16($new_gid);\n\n      if ($flags & self::ARG_1_AND_2_ARE_WORDS) {\n        if ($flags & self::ARGS_ARE_XY_VALUES) {\n          $size += $font->writeInt16($_component->e);\n          $size += $font->writeInt16($_component->f);\n        }\n        else {\n          $size += $font->writeUInt16($_component->point_compound);\n          $size += $font->writeUInt16($_component->point_component);\n        }\n      }\n      else {\n        if ($flags & self::ARGS_ARE_XY_VALUES) {\n          $size += $font->writeInt8($_component->e);\n          $size += $font->writeInt8($_component->f);\n        }\n        else {\n          $size += $font->writeUInt8($_component->point_compound);\n          $size += $font->writeUInt8($_component->point_component);\n        }\n      }\n\n      if ($flags & self::WE_HAVE_A_SCALE) {\n        $size += $font->writeInt16($_component->a);\n      }\n      elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {\n        $size += $font->writeInt16($_component->a);\n        $size += $font->writeInt16($_component->d);\n      }\n      elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {\n        $size += $font->writeInt16($_component->a);\n        $size += $font->writeInt16($_component->b);\n        $size += $font->writeInt16($_component->c);\n        $size += $font->writeInt16($_component->d);\n      }\n    }\n\n    return $size;\n  }\n\n  public function getSVGContours() {\n    $contours = array();\n\n    /** @var \\FontLib\\Table\\Type\\glyf $glyph_data */\n    $glyph_data = $this->getFont()->getTableObject(\"glyf\");\n\n    /** @var Outline[] $glyphs */\n    $glyphs = $glyph_data->data;\n\n    foreach ($this->components as $component) {\n      $_glyph = $glyphs[$component->glyphIndex];\n\n      if ($_glyph !== $this) {\n        $contours[] = array(\n          \"contours\"  => $_glyph->getSVGContours(),\n          \"transform\" => $component->getMatrix(),\n        );\n      }\n    }\n\n    return $contours;\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Glyph/OutlineSimple.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $\n */\n\nnamespace FontLib\\Glyph;\n\n/**\n * `glyf` font table.\n *\n * @package php-font-lib\n */\nclass OutlineSimple extends Outline {\n  const ON_CURVE       = 0x01;\n  const X_SHORT_VECTOR = 0x02;\n  const Y_SHORT_VECTOR = 0x04;\n  const REPEAT         = 0x08;\n  const THIS_X_IS_SAME = 0x10;\n  const THIS_Y_IS_SAME = 0x20;\n\n  public $instructions;\n  public $points;\n\n  function parseData() {\n    parent::parseData();\n\n    if (!$this->size) {\n      return;\n    }\n\n    $font = $this->getFont();\n\n    $noc = $this->numberOfContours;\n\n    if ($noc == 0) {\n      return;\n    }\n\n    $endPtsOfContours = $font->r(array(self::uint16, $noc));\n\n    $instructionLength  = $font->readUInt16();\n    $this->instructions = $font->r(array(self::uint8, $instructionLength));\n\n    $count = $endPtsOfContours[$noc - 1] + 1;\n\n    // Flags\n    $flags = array();\n    for ($index = 0; $index < $count; $index++) {\n      $flags[$index] = $font->readUInt8();\n\n      if ($flags[$index] & self::REPEAT) {\n        $repeats = $font->readUInt8();\n\n        for ($i = 1; $i <= $repeats; $i++) {\n          $flags[$index + $i] = $flags[$index];\n        }\n\n        $index += $repeats;\n      }\n    }\n\n    $points = array();\n    foreach ($flags as $i => $flag) {\n      $points[$i][\"onCurve\"]      = $flag & self::ON_CURVE;\n      $points[$i][\"endOfContour\"] = in_array($i, $endPtsOfContours);\n    }\n\n    // X Coords\n    $x = 0;\n    for ($i = 0; $i < $count; $i++) {\n      $flag = $flags[$i];\n\n      if ($flag & self::THIS_X_IS_SAME) {\n        if ($flag & self::X_SHORT_VECTOR) {\n          $x += $font->readUInt8();\n        }\n      }\n      else {\n        if ($flag & self::X_SHORT_VECTOR) {\n          $x -= $font->readUInt8();\n        }\n        else {\n          $x += $font->readInt16();\n        }\n      }\n\n      $points[$i][\"x\"] = $x;\n    }\n\n    // Y Coords\n    $y = 0;\n    for ($i = 0; $i < $count; $i++) {\n      $flag = $flags[$i];\n\n      if ($flag & self::THIS_Y_IS_SAME) {\n        if ($flag & self::Y_SHORT_VECTOR) {\n          $y += $font->readUInt8();\n        }\n      }\n      else {\n        if ($flag & self::Y_SHORT_VECTOR) {\n          $y -= $font->readUInt8();\n        }\n        else {\n          $y += $font->readInt16();\n        }\n      }\n\n      $points[$i][\"y\"] = $y;\n    }\n\n    $this->points = $points;\n  }\n\n  public function splitSVGPath($path) {\n    preg_match_all('/([a-z])|(-?\\d+(?:\\.\\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER);\n\n    return $matches[0];\n  }\n\n  public function makePoints($path) {\n    $path = $this->splitSVGPath($path);\n    $l    = count($path);\n    $i    = 0;\n\n    $points = array();\n\n    while ($i < $l) {\n      switch ($path[$i]) {\n        // moveTo\n        case \"M\":\n          $points[] = array(\n            \"onCurve\"      => true,\n            \"x\"            => $path[++$i],\n            \"y\"            => $path[++$i],\n            \"endOfContour\" => false,\n          );\n          break;\n\n        // lineTo\n        case \"L\":\n          $points[] = array(\n            \"onCurve\"      => true,\n            \"x\"            => $path[++$i],\n            \"y\"            => $path[++$i],\n            \"endOfContour\" => false,\n          );\n          break;\n\n        // quadraticCurveTo\n        case \"Q\":\n          $points[] = array(\n            \"onCurve\"      => false,\n            \"x\"            => $path[++$i],\n            \"y\"            => $path[++$i],\n            \"endOfContour\" => false,\n          );\n          $points[] = array(\n            \"onCurve\"      => true,\n            \"x\"            => $path[++$i],\n            \"y\"            => $path[++$i],\n            \"endOfContour\" => false,\n          );\n          break;\n\n        // closePath\n        /** @noinspection PhpMissingBreakStatementInspection */\n        case \"z\":\n          $points[count($points) - 1][\"endOfContour\"] = true;\n\n        default:\n          $i++;\n          break;\n      }\n    }\n\n    return $points;\n  }\n\n  function encode() {\n    if (empty($this->points)) {\n      return parent::encode();\n    }\n\n    return $this->size = $this->encodePoints($this->points);\n  }\n\n  public function encodePoints($points) {\n    $endPtsOfContours = array();\n    $flags            = array();\n    $coords_x         = array();\n    $coords_y         = array();\n\n    $last_x = 0;\n    $last_y = 0;\n    $xMin   = $yMin = 0xFFFF;\n    $xMax   = $yMax = -0xFFFF;\n    foreach ($points as $i => $point) {\n      $flag = 0;\n      if ($point[\"onCurve\"]) {\n        $flag |= self::ON_CURVE;\n      }\n\n      if ($point[\"endOfContour\"]) {\n        $endPtsOfContours[] = $i;\n      }\n\n      // Simplified, we could do some optimizations\n      if ($point[\"x\"] == $last_x) {\n        $flag |= self::THIS_X_IS_SAME;\n      }\n      else {\n        $x          = intval($point[\"x\"]);\n        $xMin       = min($x, $xMin);\n        $xMax       = max($x, $xMax);\n        $coords_x[] = $x - $last_x; // int16\n      }\n\n      // Simplified, we could do some optimizations\n      if ($point[\"y\"] == $last_y) {\n        $flag |= self::THIS_Y_IS_SAME;\n      }\n      else {\n        $y          = intval($point[\"y\"]);\n        $yMin       = min($y, $yMin);\n        $yMax       = max($y, $yMax);\n        $coords_y[] = $y - $last_y; // int16\n      }\n\n      $flags[] = $flag;\n      $last_x  = $point[\"x\"];\n      $last_y  = $point[\"y\"];\n    }\n\n    $font = $this->getFont();\n\n    $l = 0;\n    $l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours\n    $l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin\n    $l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin\n    $l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax\n    $l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax\n\n    // Simple glyf\n    $l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours\n    $l += $font->writeUInt16(0); // instructionLength\n    $l += $font->w(array(self::uint8, count($flags)), $flags); // flags\n    $l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates\n    $l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates\n    return $l;\n  }\n\n  public function getSVGContours($points = null) {\n    $path = \"\";\n\n    if (!$points) {\n      if (empty($this->points)) {\n        $this->parseData();\n      }\n\n      $points = $this->points;\n    }\n\n    $length     = (empty($points) ? 0 : count($points));\n    $firstIndex = 0;\n    $count      = 0;\n\n    for ($i = 0; $i < $length; $i++) {\n      $count++;\n\n      if ($points[$i][\"endOfContour\"]) {\n        $path .= $this->getSVGPath($points, $firstIndex, $count);\n        $firstIndex = $i + 1;\n        $count      = 0;\n      }\n    }\n\n    return $path;\n  }\n\n  protected function getSVGPath($points, $startIndex, $count) {\n    $offset = 0;\n    $path   = \"\";\n\n    while ($offset < $count) {\n      $point    = $points[$startIndex + $offset % $count];\n      $point_p1 = $points[$startIndex + ($offset + 1) % $count];\n\n      if ($offset == 0) {\n        $path .= \"M{$point['x']},{$point['y']} \";\n      }\n\n      if ($point[\"onCurve\"]) {\n        if ($point_p1[\"onCurve\"]) {\n          $path .= \"L{$point_p1['x']},{$point_p1['y']} \";\n          $offset++;\n        }\n        else {\n          $point_p2 = $points[$startIndex + ($offset + 2) % $count];\n\n          if ($point_p2[\"onCurve\"]) {\n            $path .= \"Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} \";\n          }\n          else {\n            $path .= \"Q{$point_p1['x']},{$point_p1['y']},\" . $this->midValue($point_p1['x'], $point_p2['x']) . \",\" . $this->midValue($point_p1['y'], $point_p2['y']) . \" \";\n          }\n\n          $offset += 2;\n        }\n      }\n      else {\n        if ($point_p1[\"onCurve\"]) {\n          $path .= \"Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} \";\n        }\n        else {\n          $path .= \"Q{$point['x']},{$point['y']},\" . $this->midValue($point['x'], $point_p1['x']) . \",\" . $this->midValue($point['y'], $point_p1['y']) . \" \";\n        }\n\n        $offset++;\n      }\n    }\n\n    $path .= \"z \";\n\n    return $path;\n  }\n\n  function midValue($a, $b) {\n    return $a + ($b - $a) / 2;\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Header.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace FontLib;\n\nuse FontLib\\TrueType\\File;\n\n/**\n * Font header container.\n *\n * @package php-font-lib\n */\nabstract class Header extends BinaryStream {\n  /**\n   * @var File\n   */\n  protected $font;\n  protected $def = array();\n\n  public $data;\n\n  public function __construct(File $font) {\n    $this->font = $font;\n  }\n\n  public function encode() {\n    return $this->font->pack($this->def, $this->data);\n  }\n\n  public function parse() {\n    $this->data = $this->font->unpack($this->def);\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/OpenType/File.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\OpenType;\n\n/**\n * Open Type font, the same as a TrueType one.\n *\n * @package php-font-lib\n */\nclass File extends \\FontLib\\TrueType\\File {\n  //\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/OpenType/TableDirectoryEntry.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\OpenType;\n\n/**\n * Open Type Table directory entry, the same as a TrueType one.\n *\n * @package php-font-lib\n */\nclass TableDirectoryEntry extends \\FontLib\\TrueType\\TableDirectoryEntry {\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/DirectoryEntry.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace FontLib\\Table;\n\nuse FontLib\\TrueType\\File;\nuse FontLib\\Font;\nuse FontLib\\BinaryStream;\n\n/**\n * Generic Font table directory entry.\n *\n * @package php-font-lib\n */\nclass DirectoryEntry extends BinaryStream {\n  /**\n   * @var File\n   */\n  protected $font;\n\n  /**\n   * @var Table\n   */\n  protected $font_table;\n\n  public $entryLength = 4;\n\n  public $tag;\n  public $checksum;\n  public $offset;\n  public $length;\n\n  protected $origF;\n\n  /**\n   * @param string $data\n   *\n   * @return int\n   */\n  static function computeChecksum($data) {\n    $len = mb_strlen($data, '8bit');\n    $mod = $len % 4;\n\n    if ($mod) {\n      $data = str_pad($data, $len + (4 - $mod), \"\\0\");\n    }\n\n    $len = mb_strlen($data, '8bit');\n\n    $hi = 0x0000;\n    $lo = 0x0000;\n\n    for ($i = 0; $i < $len; $i += 4) {\n      $hi += (ord($data[$i]) << 8) + ord($data[$i + 1]);\n      $lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]);\n      $hi += $lo >> 16;\n      $lo = $lo & 0xFFFF;\n      $hi = $hi & 0xFFFF;\n    }\n\n    return ($hi << 8) + $lo;\n  }\n\n  function __construct(File $font) {\n    $this->font = $font;\n    $this->f    = $font->f;\n  }\n\n  function parse() {\n    $this->tag = $this->font->read(4);\n  }\n\n  function open($filename, $mode = self::modeRead) {\n    // void\n  }\n\n  function setTable(Table $font_table) {\n    $this->font_table = $font_table;\n  }\n\n  function encode($entry_offset) {\n    Font::d(\"\\n==== $this->tag ====\");\n    //Font::d(\"Entry offset  = $entry_offset\");\n\n    $data = $this->font_table;\n    $font = $this->font;\n\n    $table_offset = $font->pos();\n    $this->offset = $table_offset;\n    $table_length = $data->encode();\n\n    $font->seek($table_offset);\n    $table_data = $font->read($table_length);\n\n    $font->seek($entry_offset);\n\n    $font->write($this->tag, 4);\n    $font->writeUInt32(self::computeChecksum($table_data));\n    $font->writeUInt32($table_offset);\n    $font->writeUInt32($table_length);\n\n    Font::d(\"Bytes written = $table_length\");\n\n    $font->seek($table_offset + $table_length);\n  }\n\n  /**\n   * @return File\n   */\n  function getFont() {\n    return $this->font;\n  }\n\n  function startRead() {\n    $this->font->seek($this->offset);\n  }\n\n  function endRead() {\n    //\n  }\n\n  function startWrite() {\n    $this->font->seek($this->offset);\n  }\n\n  function endWrite() {\n    //\n  }\n}\n\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Table.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace FontLib\\Table;\n\nuse FontLib\\TrueType\\File;\nuse FontLib\\Font;\nuse FontLib\\BinaryStream;\n\n/**\n * Generic font table.\n *\n * @package php-font-lib\n */\nclass Table extends BinaryStream {\n  /**\n   * @var DirectoryEntry\n   */\n  protected $entry;\n  protected $def = array();\n\n  public $data;\n\n  final public function __construct(DirectoryEntry $entry) {\n    $this->entry = $entry;\n    $entry->setTable($this);\n  }\n\n  /**\n   * @return File\n   */\n  public function getFont() {\n    return $this->entry->getFont();\n  }\n\n  protected function _encode() {\n    if (empty($this->data)) {\n      Font::d(\"  >> Table is empty\");\n\n      return 0;\n    }\n\n    return $this->getFont()->pack($this->def, $this->data);\n  }\n\n  protected function _parse() {\n    $this->data = $this->getFont()->unpack($this->def);\n  }\n\n  protected function _parseRaw() {\n    $this->data = $this->getFont()->read($this->entry->length);\n  }\n\n  protected function _encodeRaw() {\n    return $this->getFont()->write($this->data, $this->entry->length);\n  }\n\n  public function toHTML() {\n    return \"<pre>\" . var_export($this->data, true) . \"</pre>\";\n  }\n\n  final public function encode() {\n    $this->entry->startWrite();\n\n    if (false && empty($this->def)) {\n      $length = $this->_encodeRaw();\n    }\n    else {\n      $length = $this->_encode();\n    }\n\n    $this->entry->endWrite();\n\n    return $length;\n  }\n\n  final public function parse() {\n    $this->entry->startRead();\n\n    if (false && empty($this->def)) {\n      $this->_parseRaw();\n    }\n    else {\n      $this->_parse();\n    }\n\n    $this->entry->endRead();\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/cmap.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `cmap` font table.\n *\n * @package php-font-lib\n */\nclass cmap extends Table {\n  private static $header_format = array(\n    \"version\"         => self::uint16,\n    \"numberSubtables\" => self::uint16,\n  );\n\n  private static $subtable_header_format = array(\n    \"platformID\"         => self::uint16,\n    \"platformSpecificID\" => self::uint16,\n    \"offset\"             => self::uint32,\n  );\n\n  private static $subtable_v4_format = array(\n    \"length\"        => self::uint16,\n    \"language\"      => self::uint16,\n    \"segCountX2\"    => self::uint16,\n    \"searchRange\"   => self::uint16,\n    \"entrySelector\" => self::uint16,\n    \"rangeShift\"    => self::uint16,\n  );\n\n  private static $subtable_v12_format = array(\n    \"length\"        => self::uint32,\n    \"language\"      => self::uint32,\n    \"ngroups\"    => self::uint32\n  );\n\n  protected function _parse() {\n    $font = $this->getFont();\n\n    $cmap_offset = $font->pos();\n\n    $data = $font->unpack(self::$header_format);\n\n    $subtables = array();\n    for ($i = 0; $i < $data[\"numberSubtables\"]; $i++) {\n      $subtables[] = $font->unpack(self::$subtable_header_format);\n    }\n\n    $data[\"subtables\"] = $subtables;\n\n    foreach ($data[\"subtables\"] as $i => &$subtable) {\n      $font->seek($cmap_offset + $subtable[\"offset\"]);\n\n      $subtable[\"format\"] = $font->readUInt16();\n\n      // @todo Only CMAP version 4 and 12\n      if (($subtable[\"format\"] != 4) && ($subtable[\"format\"] != 12)) {\n        unset($data[\"subtables\"][$i]);\n        $data[\"numberSubtables\"]--;\n        continue;\n      }\n\n      if ($subtable[\"format\"] == 12) {\n\n        $font->readUInt16();\n\n        $subtable += $font->unpack(self::$subtable_v12_format);\n\n        $glyphIndexArray = array();\n        $endCodes = array();\n        $startCodes = array();\n\n        for ($p = 0; $p < $subtable['ngroups']; $p++) {\n\n          $startCode = $startCodes[] = $font->readUInt32();\n          $endCode = $endCodes[] = $font->readUInt32();\n          $startGlyphCode = $font->readUInt32();\n\n          for ($c = $startCode; $c <= $endCode; $c++) {\n            $glyphIndexArray[$c] = $startGlyphCode;\n            $startGlyphCode++;\n          }\n        }\n\n        $subtable += array(\n          \"startCode\" => $startCodes,\n          \"endCode\" => $endCodes,\n          \"glyphIndexArray\" => $glyphIndexArray,\n        );\n\n      }\n      else if ($subtable[\"format\"] == 4) {\n\n        $subtable += $font->unpack(self::$subtable_v4_format);\n\n        $segCount             = $subtable[\"segCountX2\"] / 2;\n        $subtable[\"segCount\"] = $segCount;\n\n        $endCode = $font->readUInt16Many($segCount);\n\n        $font->readUInt16(); // reservedPad\n\n        $startCode = $font->readUInt16Many($segCount);\n        $idDelta   = $font->readInt16Many($segCount);\n\n        $ro_start      = $font->pos();\n        $idRangeOffset = $font->readUInt16Many($segCount);\n\n        $glyphIndexArray = array();\n        for ($i = 0; $i < $segCount; $i++) {\n          $c1 = $startCode[$i];\n          $c2 = $endCode[$i];\n          $d  = $idDelta[$i];\n          $ro = $idRangeOffset[$i];\n\n          if ($ro > 0) {\n            $font->seek($subtable[\"offset\"] + 2 * $i + $ro);\n          }\n\n          for ($c = $c1; $c <= $c2; $c++) {\n            if ($ro == 0) {\n              $gid = ($c + $d) & 0xFFFF;\n            }\n            else {\n              $offset = ($c - $c1) * 2 + $ro;\n              $offset = $ro_start + 2 * $i + $offset;\n\n              $font->seek($offset);\n              $gid = $font->readUInt16();\n\n              if ($gid != 0) {\n                $gid = ($gid + $d) & 0xFFFF;\n              }\n            }\n\n            if ($gid > 0) {\n              $glyphIndexArray[$c] = $gid;\n            }\n          }\n        }\n\n        $subtable += array(\n          \"endCode\"         => $endCode,\n          \"startCode\"       => $startCode,\n          \"idDelta\"         => $idDelta,\n          \"idRangeOffset\"   => $idRangeOffset,\n          \"glyphIndexArray\" => $glyphIndexArray,\n        );\n      }\n    }\n\n    $this->data = $data;\n  }\n\n  function _encode() {\n    $font = $this->getFont();\n\n    $subset          = $font->getSubset();\n    $glyphIndexArray = $font->getUnicodeCharMap();\n\n    $newGlyphIndexArray = array();\n    foreach ($glyphIndexArray as $code => $gid) {\n      $new_gid = array_search($gid, $subset);\n      if ($new_gid !== false) {\n        $newGlyphIndexArray[$code] = $new_gid;\n      }\n    }\n\n    ksort($newGlyphIndexArray); // Sort by char code\n\n    $segments = array();\n\n    $i        = -1;\n    $prevCode = 0xFFFF;\n    $prevGid  = 0xFFFF;\n\n    foreach ($newGlyphIndexArray as $code => $gid) {\n      if (\n        $prevCode + 1 != $code ||\n        $prevGid + 1 != $gid\n      ) {\n        $i++;\n        $segments[$i] = array();\n      }\n\n      $segments[$i][] = array($code, $gid);\n\n      $prevCode = $code;\n      $prevGid  = $gid;\n    }\n\n    $segments[][] = array(0xFFFF, 0xFFFF);\n\n    $startCode = array();\n    $endCode   = array();\n    $idDelta   = array();\n\n    foreach ($segments as $codes) {\n      $start = reset($codes);\n      $end   = end($codes);\n\n      $startCode[] = $start[0];\n      $endCode[]   = $end[0];\n      $idDelta[]   = $start[1] - $start[0];\n    }\n\n    $segCount      = count($startCode);\n    $idRangeOffset = array_fill(0, $segCount, 0);\n\n    $searchRange   = 1;\n    $entrySelector = 0;\n    while ($searchRange * 2 <= $segCount) {\n      $searchRange *= 2;\n      $entrySelector++;\n    }\n    $searchRange *= 2;\n    $rangeShift = $segCount * 2 - $searchRange;\n\n    $subtables = array(\n      array(\n        // header\n        \"platformID\"         => 3, // Unicode\n        \"platformSpecificID\" => 1,\n        \"offset\"             => null,\n\n        // subtable\n        \"format\"             => 4,\n        \"length\"             => null,\n        \"language\"           => 0,\n        \"segCount\"           => $segCount,\n        \"segCountX2\"         => $segCount * 2,\n        \"searchRange\"        => $searchRange,\n        \"entrySelector\"      => $entrySelector,\n        \"rangeShift\"         => $rangeShift,\n        \"startCode\"          => $startCode,\n        \"endCode\"            => $endCode,\n        \"idDelta\"            => $idDelta,\n        \"idRangeOffset\"      => $idRangeOffset,\n        \"glyphIndexArray\"    => $newGlyphIndexArray,\n      )\n    );\n\n    $data = array(\n      \"version\"         => 0,\n      \"numberSubtables\" => count($subtables),\n      \"subtables\"       => $subtables,\n    );\n\n    $length = $font->pack(self::$header_format, $data);\n\n    $subtable_headers_size   = $data[\"numberSubtables\"] * 8; // size of self::$subtable_header_format\n    $subtable_headers_offset = $font->pos();\n\n    $length += $font->write(str_repeat(\"\\0\", $subtable_headers_size), $subtable_headers_size);\n\n    // write subtables data\n    foreach ($data[\"subtables\"] as $i => $subtable) {\n      $length_before                   = $length;\n      $data[\"subtables\"][$i][\"offset\"] = $length;\n\n      $length += $font->writeUInt16($subtable[\"format\"]);\n\n      $before_subheader = $font->pos();\n      $length += $font->pack(self::$subtable_v4_format, $subtable);\n\n      $segCount = $subtable[\"segCount\"];\n      $length += $font->w(array(self::uint16, $segCount), $subtable[\"endCode\"]);\n      $length += $font->writeUInt16(0); // reservedPad\n      $length += $font->w(array(self::uint16, $segCount), $subtable[\"startCode\"]);\n      $length += $font->w(array(self::int16, $segCount), $subtable[\"idDelta\"]);\n      $length += $font->w(array(self::uint16, $segCount), $subtable[\"idRangeOffset\"]);\n      $length += $font->w(array(self::uint16, $segCount), array_values($subtable[\"glyphIndexArray\"]));\n\n      $after_subtable = $font->pos();\n\n      $subtable[\"length\"] = $length - $length_before;\n      $font->seek($before_subheader);\n      $length += $font->pack(self::$subtable_v4_format, $subtable);\n\n      $font->seek($after_subtable);\n    }\n\n    // write subtables headers\n    $font->seek($subtable_headers_offset);\n    foreach ($data[\"subtables\"] as $subtable) {\n      $font->pack(self::$subtable_header_format, $subtable);\n    }\n\n    return $length;\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/glyf.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\n\nuse FontLib\\Table\\Table;\nuse FontLib\\Glyph\\Outline;\nuse FontLib\\Glyph\\OutlineSimple;\n\n/**\n * `glyf` font table.\n *\n * @package php-font-lib\n * @property Outline[] $data\n */\nclass glyf extends Table {\n  protected function _parse() {\n    $font   = $this->getFont();\n    $offset = $font->pos();\n\n    $loca      = $font->getData(\"loca\");\n    $real_loca = array_slice($loca, 0, -1); // Not the last dummy loca entry\n\n    $data = array();\n\n    foreach ($real_loca as $gid => $location) {\n      $_offset    = $offset + $loca[$gid];\n      $_size      = $loca[$gid + 1] - $loca[$gid];\n      $data[$gid] = Outline::init($this, $_offset, $_size, $font);\n    }\n\n    $this->data = $data;\n  }\n\n  public function getGlyphIDs($gids = array()) {\n    $glyphIDs = array();\n\n    foreach ($gids as $_gid) {\n      $_glyph   = $this->data[$_gid];\n      $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());\n    }\n\n    return array_unique(array_merge($gids, $glyphIDs));\n  }\n\n  public function toHTML() {\n    $max  = 160;\n    $font = $this->getFont();\n\n    $head      = $font->getData(\"head\");\n    $head_json = json_encode($head);\n\n    $os2      = $font->getData(\"OS/2\");\n    $os2_json = json_encode($os2);\n\n    $hmtx      = $font->getData(\"hmtx\");\n    $hmtx_json = json_encode($hmtx);\n\n    $names           = $font->getData(\"post\", \"names\");\n    $glyphIndexArray = array_flip($font->getUnicodeCharMap());\n\n    $width  = (abs($head[\"xMin\"]) + $head[\"xMax\"]);\n    $height = (abs($head[\"yMin\"]) + $head[\"yMax\"]);\n\n    $ratio = 1;\n    if ($width > $max || $height > $max) {\n      $ratio  = max($width, $height) / $max;\n      $width  = round($width / $ratio);\n      $height = round($height / $ratio);\n    }\n\n    $n = 500;\n\n    $s = \"<h3>\" . \"Only the first $n simple glyphs are shown (\" . count($this->data) . \" total)\n    <div class='glyph-view simple'>Simple glyph</div>\n    <div class='glyph-view composite'>Composite glyph</div>\n    Zoom: <input type='range' value='100' max='400' onchange='Glyph.resize(this.value)' />\n    </h3>\n    <script>\n      Glyph.ratio  = $ratio;\n      Glyph.head   = $head_json;\n      Glyph.os2    = $os2_json;\n      Glyph.hmtx   = $hmtx_json;\n      Glyph.width  = $width;\n      Glyph.height = $height;\n    </script>\";\n\n    foreach ($this->data as $g => $glyph) {\n      if ($n-- <= 0) {\n        break;\n      }\n\n      $glyph->parseData();\n\n      $shape      = array(\n        \"SVGContours\" => $glyph->getSVGContours(),\n        \"xMin\"        => $glyph->xMin,\n        \"yMin\"        => $glyph->yMin,\n        \"xMax\"        => $glyph->xMax,\n        \"yMax\"        => $glyph->yMax,\n      );\n      $shape_json = json_encode($shape);\n\n      $type = ($glyph instanceof OutlineSimple ? \"simple\" : \"composite\");\n      $char = isset($glyphIndexArray[$g]) ? $glyphIndexArray[$g] : 0;\n      $name = isset($names[$g]) ? $names[$g] : sprintf(\"uni%04x\", $char);\n      $char = $char ? \"&#{$glyphIndexArray[$g]};\" : \"\";\n\n      $s .= \"<div class='glyph-view $type' id='glyph-$g'>\n              <span class='glyph-id'>$g</span>\n              <span class='char'>$char</span>\n              <span class='char-name'>$name</span>\n              \";\n\n      if ($type == \"composite\") {\n        foreach ($glyph->getGlyphIDs() as $_id) {\n          $s .= \"<a href='#glyph-$_id' class='glyph-component-id'>$_id</a> \";\n        }\n      }\n\n      $s .= \"<br />\n            <canvas width='$width' height='$height' id='glyph-canvas-$g'></canvas>\n            </div>\n            <script>Glyph.glyphs.push([$g,$shape_json]);</script>\";\n    }\n\n    return $s;\n  }\n\n\n  protected function _encode() {\n    $font   = $this->getFont();\n    $subset = $font->getSubset();\n    $data   = $this->data;\n\n    $loca = array();\n\n    $length = 0;\n    foreach ($subset as $gid) {\n      $loca[] = $length;\n      $length += $data[$gid]->encode();\n    }\n\n    $loca[]                             = $length; // dummy loca\n    $font->getTableObject(\"loca\")->data = $loca;\n\n    return $length;\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/head.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\nuse Exception;\n\n/**\n * `head` font table.\n *\n * @package php-font-lib\n */\nclass head extends Table {\n  protected $def = array(\n    \"tableVersion\"       => self::Fixed,\n    \"fontRevision\"       => self::Fixed,\n    \"checkSumAdjustment\" => self::uint32,\n    \"magicNumber\"        => self::uint32,\n    \"flags\"              => self::uint16,\n    \"unitsPerEm\"         => self::uint16,\n    \"created\"            => self::longDateTime,\n    \"modified\"           => self::longDateTime,\n    \"xMin\"               => self::FWord,\n    \"yMin\"               => self::FWord,\n    \"xMax\"               => self::FWord,\n    \"yMax\"               => self::FWord,\n    \"macStyle\"           => self::uint16,\n    \"lowestRecPPEM\"      => self::uint16,\n    \"fontDirectionHint\"  => self::int16,\n    \"indexToLocFormat\"   => self::int16,\n    \"glyphDataFormat\"    => self::int16,\n  );\n\n  protected function _parse() {\n    parent::_parse();\n\n    if ($this->data[\"magicNumber\"] != 0x5F0F3CF5) {\n      throw new Exception(\"Incorrect magic number (\" . dechex($this->data[\"magicNumber\"]) . \")\");\n    }\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/hhea.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `hhea` font table.\n *\n * @package php-font-lib\n */\nclass hhea extends Table {\n  protected $def = array(\n    \"version\"             => self::Fixed,\n    \"ascent\"              => self::FWord,\n    \"descent\"             => self::FWord,\n    \"lineGap\"             => self::FWord,\n    \"advanceWidthMax\"     => self::uFWord,\n    \"minLeftSideBearing\"  => self::FWord,\n    \"minRightSideBearing\" => self::FWord,\n    \"xMaxExtent\"          => self::FWord,\n    \"caretSlopeRise\"      => self::int16,\n    \"caretSlopeRun\"       => self::int16,\n    \"caretOffset\"         => self::FWord,\n    self::int16,\n    self::int16,\n    self::int16,\n    self::int16,\n    \"metricDataFormat\"    => self::int16,\n    \"numOfLongHorMetrics\" => self::uint16,\n  );\n\n  function _encode() {\n    $font                              = $this->getFont();\n    $this->data[\"numOfLongHorMetrics\"] = count($font->getSubset());\n\n    return parent::_encode();\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/hmtx.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `hmtx` font table.\n *\n * @package php-font-lib\n */\nclass hmtx extends Table {\n  protected function _parse() {\n    $font   = $this->getFont();\n    $offset = $font->pos();\n\n    $numOfLongHorMetrics = $font->getData(\"hhea\", \"numOfLongHorMetrics\");\n    $numGlyphs           = $font->getData(\"maxp\", \"numGlyphs\");\n\n    $font->seek($offset);\n\n    $data = array();\n    $metrics = $font->readUInt16Many($numOfLongHorMetrics * 2);\n    for ($gid = 0, $mid = 0; $gid < $numOfLongHorMetrics; $gid++) {\n      $advanceWidth    = isset($metrics[$mid]) ? $metrics[$mid] : 0;\n      $mid += 1;\n      $leftSideBearing = isset($metrics[$mid]) ? $metrics[$mid] : 0;\n      $mid += 1;\n      $data[$gid]      = array($advanceWidth, $leftSideBearing);\n    }\n\n    if ($numOfLongHorMetrics < $numGlyphs) {\n      $lastWidth = end($data);\n      $data      = array_pad($data, $numGlyphs, $lastWidth);\n    }\n\n    $this->data = $data;\n  }\n\n  protected function _encode() {\n    $font   = $this->getFont();\n    $subset = $font->getSubset();\n    $data   = $this->data;\n\n    $length = 0;\n\n    foreach ($subset as $gid) {\n      $length += $font->writeUInt16($data[$gid][0]);\n      $length += $font->writeUInt16($data[$gid][1]);\n    }\n\n    return $length;\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/kern.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `kern` font table.\n *\n * @package php-font-lib\n */\nclass kern extends Table {\n  protected function _parse() {\n    $font = $this->getFont();\n\n    $data = $font->unpack(array(\n      \"version\"         => self::uint16,\n      \"nTables\"         => self::uint16,\n\n      // only the first subtable will be parsed\n      \"subtableVersion\" => self::uint16,\n      \"length\"          => self::uint16,\n      \"coverage\"        => self::uint16,\n    ));\n\n    $data[\"format\"] = ($data[\"coverage\"] >> 8);\n\n    $subtable = array();\n\n    switch ($data[\"format\"]) {\n      case 0:\n        $subtable = $font->unpack(array(\n          \"nPairs\"        => self::uint16,\n          \"searchRange\"   => self::uint16,\n          \"entrySelector\" => self::uint16,\n          \"rangeShift\"    => self::uint16,\n        ));\n\n        $pairs = array();\n        $tree  = array();\n\n        $values = $font->readUInt16Many($subtable[\"nPairs\"] * 3);\n        for ($i = 0, $idx = 0; $i < $subtable[\"nPairs\"]; $i++) {\n          $left  = $values[$idx++];\n          $right = $values[$idx++];\n          $value = $values[$idx++];\n\n          if ($value >= 0x8000) {\n            $value -= 0x10000;\n          }\n\n          $pairs[] = array(\n            \"left\"  => $left,\n            \"right\" => $right,\n            \"value\" => $value,\n          );\n\n          $tree[$left][$right] = $value;\n        }\n\n        //$subtable[\"pairs\"] = $pairs;\n        $subtable[\"tree\"] = $tree;\n        break;\n\n      case 1:\n      case 2:\n      case 3:\n        break;\n    }\n\n    $data[\"subtable\"] = $subtable;\n\n    $this->data = $data;\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/loca.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `loca` font table.\n *\n * @package php-font-lib\n */\nclass loca extends Table {\n  protected function _parse() {\n    $font   = $this->getFont();\n    $offset = $font->pos();\n\n    $indexToLocFormat = $font->getData(\"head\", \"indexToLocFormat\");\n    $numGlyphs        = $font->getData(\"maxp\", \"numGlyphs\");\n\n    $font->seek($offset);\n\n    $data = array();\n\n    // 2 bytes\n    if ($indexToLocFormat == 0) {\n      $d   = $font->read(($numGlyphs + 1) * 2);\n      $loc = unpack(\"n*\", $d);\n\n      for ($i = 0; $i <= $numGlyphs; $i++) {\n        $data[] = isset($loc[$i + 1]) ?  $loc[$i + 1] * 2 : 0;\n      }\n    }\n\n    // 4 bytes\n    else {\n      if ($indexToLocFormat == 1) {\n        $d   = $font->read(($numGlyphs + 1) * 4);\n        $loc = unpack(\"N*\", $d);\n\n        for ($i = 0; $i <= $numGlyphs; $i++) {\n          $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] : 0;\n        }\n      }\n    }\n\n    $this->data = $data;\n  }\n\n  function _encode() {\n    $font = $this->getFont();\n    $data = $this->data;\n\n    $indexToLocFormat = $font->getData(\"head\", \"indexToLocFormat\");\n    $numGlyphs        = $font->getData(\"maxp\", \"numGlyphs\");\n    $length           = 0;\n\n    // 2 bytes\n    if ($indexToLocFormat == 0) {\n      for ($i = 0; $i <= $numGlyphs; $i++) {\n        $length += $font->writeUInt16($data[$i] / 2);\n      }\n    }\n\n    // 4 bytes\n    else {\n      if ($indexToLocFormat == 1) {\n        for ($i = 0; $i <= $numGlyphs; $i++) {\n          $length += $font->writeUInt32($data[$i]);\n        }\n      }\n    }\n\n    return $length;\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/maxp.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `maxp` font table.\n *\n * @package php-font-lib\n */\nclass maxp extends Table {\n  protected $def = array(\n    \"version\"               => self::Fixed,\n    \"numGlyphs\"             => self::uint16,\n    \"maxPoints\"             => self::uint16,\n    \"maxContours\"           => self::uint16,\n    \"maxComponentPoints\"    => self::uint16,\n    \"maxComponentContours\"  => self::uint16,\n    \"maxZones\"              => self::uint16,\n    \"maxTwilightPoints\"     => self::uint16,\n    \"maxStorage\"            => self::uint16,\n    \"maxFunctionDefs\"       => self::uint16,\n    \"maxInstructionDefs\"    => self::uint16,\n    \"maxStackElements\"      => self::uint16,\n    \"maxSizeOfInstructions\" => self::uint16,\n    \"maxComponentElements\"  => self::uint16,\n    \"maxComponentDepth\"     => self::uint16,\n  );\n\n  function _encode() {\n    $font                    = $this->getFont();\n    $this->data[\"numGlyphs\"] = count($font->getSubset());\n\n    return parent::_encode();\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/name.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\n\nuse FontLib\\Table\\Table;\nuse FontLib\\Font;\n\n/**\n * `name` font table.\n *\n * @package php-font-lib\n */\nclass name extends Table {\n  private static $header_format = array(\n    \"format\"       => self::uint16,\n    \"count\"        => self::uint16,\n    \"stringOffset\" => self::uint16,\n  );\n\n  const NAME_COPYRIGHT          = 0;\n  const NAME_NAME               = 1;\n  const NAME_SUBFAMILY          = 2;\n  const NAME_SUBFAMILY_ID       = 3;\n  const NAME_FULL_NAME          = 4;\n  const NAME_VERSION            = 5;\n  const NAME_POSTSCRIPT_NAME    = 6;\n  const NAME_TRADEMARK          = 7;\n  const NAME_MANUFACTURER       = 8;\n  const NAME_DESIGNER           = 9;\n  const NAME_DESCRIPTION        = 10;\n  const NAME_VENDOR_URL         = 11;\n  const NAME_DESIGNER_URL       = 12;\n  const NAME_LICENSE            = 13;\n  const NAME_LICENSE_URL        = 14;\n  const NAME_PREFERRE_FAMILY    = 16;\n  const NAME_PREFERRE_SUBFAMILY = 17;\n  const NAME_COMPAT_FULL_NAME   = 18;\n  const NAME_SAMPLE_TEXT        = 19;\n\n  static $nameIdCodes = array(\n    0  => \"Copyright\",\n    1  => \"FontName\",\n    2  => \"FontSubfamily\",\n    3  => \"UniqueID\",\n    4  => \"FullName\",\n    5  => \"Version\",\n    6  => \"PostScriptName\",\n    7  => \"Trademark\",\n    8  => \"Manufacturer\",\n    9  => \"Designer\",\n    10 => \"Description\",\n    11 => \"FontVendorURL\",\n    12 => \"FontDesignerURL\",\n    13 => \"LicenseDescription\",\n    14 => \"LicenseURL\",\n    // 15\n    16 => \"PreferredFamily\",\n    17 => \"PreferredSubfamily\",\n    18 => \"CompatibleFullName\",\n    19 => \"SampleText\",\n  );\n\n  static $platforms = array(\n    0 => \"Unicode\",\n    1 => \"Macintosh\",\n    // 2 =>  Reserved\n    3 => \"Microsoft\",\n  );\n\n  static $platformSpecific = array(\n    // Unicode\n    0 => array(\n      0 => \"Default semantics\",\n      1 => \"Version 1.1 semantics\",\n      2 => \"ISO 10646 1993 semantics (deprecated)\",\n      3 => \"Unicode 2.0 or later semantics\",\n    ),\n\n    // Macintosh\n    1 => array(\n      0  => \"Roman\",\n      1  => \"Japanese\",\n      2  => \"Traditional Chinese\",\n      3  => \"Korean\",\n      4  => \"Arabic\",\n      5  => \"Hebrew\",\n      6  => \"Greek\",\n      7  => \"Russian\",\n      8  => \"RSymbol\",\n      9  => \"Devanagari\",\n      10 => \"Gurmukhi\",\n      11 => \"Gujarati\",\n      12 => \"Oriya\",\n      13 => \"Bengali\",\n      14 => \"Tamil\",\n      15 => \"Telugu\",\n      16 => \"Kannada\",\n      17 => \"Malayalam\",\n      18 => \"Sinhalese\",\n      19 => \"Burmese\",\n      20 => \"Khmer\",\n      21 => \"Thai\",\n      22 => \"Laotian\",\n      23 => \"Georgian\",\n      24 => \"Armenian\",\n      25 => \"Simplified Chinese\",\n      26 => \"Tibetan\",\n      27 => \"Mongolian\",\n      28 => \"Geez\",\n      29 => \"Slavic\",\n      30 => \"Vietnamese\",\n      31 => \"Sindhi\",\n    ),\n\n    // Microsoft\n    3 => array(\n      0  => \"Symbol\",\n      1  => \"Unicode BMP (UCS-2)\",\n      2  => \"ShiftJIS\",\n      3  => \"PRC\",\n      4  => \"Big5\",\n      5  => \"Wansung\",\n      6  => \"Johab\",\n      //  7 => Reserved\n      //  8 => Reserved\n      //  9 => Reserved\n      10 => \"Unicode UCS-4\",\n    ),\n  );\n\n  protected function _parse() {\n    $font = $this->getFont();\n\n    $tableOffset = $font->pos();\n\n    $data = $font->unpack(self::$header_format);\n\n    $records = array();\n    for ($i = 0; $i < $data[\"count\"]; $i++) {\n      $record      = new nameRecord();\n      $record_data = $font->unpack(nameRecord::$format);\n      $record->map($record_data);\n\n      $records[] = $record;\n    }\n\n    $names = array();\n    foreach ($records as $record) {\n      $font->seek($tableOffset + $data[\"stringOffset\"] + $record->offset);\n      $s                      = $font->read($record->length);\n      $record->string         = Font::UTF16ToUTF8($s);\n      $names[$record->nameID] = $record;\n    }\n\n    $data[\"records\"] = $names;\n\n    $this->data = $data;\n  }\n\n  protected function _encode() {\n    $font = $this->getFont();\n\n    /** @var nameRecord[] $records */\n    $records       = $this->data[\"records\"];\n    $count_records = count($records);\n\n    $this->data[\"count\"]        = $count_records;\n    $this->data[\"stringOffset\"] = 6 + $count_records * 12; // 6 => uint16 * 3, 12 => sizeof self::$record_format\n\n    $length = $font->pack(self::$header_format, $this->data);\n\n    $offset = 0;\n    foreach ($records as $record) {\n      $record->length = mb_strlen($record->getUTF16(), \"8bit\");\n      $record->offset = $offset;\n      $offset += $record->length;\n      $length += $font->pack(nameRecord::$format, (array)$record);\n    }\n\n    foreach ($records as $record) {\n      $str = $record->getUTF16();\n      $length += $font->write($str, mb_strlen($str, \"8bit\"));\n    }\n\n    return $length;\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/nameRecord.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace FontLib\\Table\\Type;\n\nuse FontLib\\Font;\nuse FontLib\\BinaryStream;\n\n/**\n * Font table name record.\n *\n * @package php-font-lib\n */\nclass nameRecord extends BinaryStream {\n  public $platformID;\n  public $platformSpecificID;\n  public $languageID;\n  public $nameID;\n  public $length;\n  public $offset;\n  public $string;\n\n  public static $format = array(\n    \"platformID\"         => self::uint16,\n    \"platformSpecificID\" => self::uint16,\n    \"languageID\"         => self::uint16,\n    \"nameID\"             => self::uint16,\n    \"length\"             => self::uint16,\n    \"offset\"             => self::uint16,\n  );\n\n  public function map($data) {\n    foreach ($data as $key => $value) {\n      $this->$key = $value;\n    }\n  }\n\n  public function getUTF8() {\n    return $this->string;\n  }\n\n  public function getUTF16() {\n    return Font::UTF8ToUTF16($this->string);\n  }\n\n  function __toString() {\n    return $this->string;\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/os2.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\n\n/**\n * `OS/2` font table.\n *\n * @package php-font-lib\n */\nclass os2 extends Table {\n  protected $def = array(\n    \"version\"             => self::uint16,\n    \"xAvgCharWidth\"       => self::int16,\n    \"usWeightClass\"       => self::uint16,\n    \"usWidthClass\"        => self::uint16,\n    \"fsType\"              => self::int16,\n    \"ySubscriptXSize\"     => self::int16,\n    \"ySubscriptYSize\"     => self::int16,\n    \"ySubscriptXOffset\"   => self::int16,\n    \"ySubscriptYOffset\"   => self::int16,\n    \"ySuperscriptXSize\"   => self::int16,\n    \"ySuperscriptYSize\"   => self::int16,\n    \"ySuperscriptXOffset\" => self::int16,\n    \"ySuperscriptYOffset\" => self::int16,\n    \"yStrikeoutSize\"      => self::int16,\n    \"yStrikeoutPosition\"  => self::int16,\n    \"sFamilyClass\"        => self::int16,\n    \"panose\"              => array(self::uint8, 10),\n    \"ulCharRange\"         => array(self::uint32, 4),\n    \"achVendID\"           => array(self::char, 4),\n    \"fsSelection\"         => self::uint16,\n    \"fsFirstCharIndex\"    => self::uint16,\n    \"fsLastCharIndex\"     => self::uint16,\n    \"typoAscender\"        => self::int16,\n    \"typoDescender\"       => self::int16,\n    \"typoLineGap\"         => self::int16,\n    \"winAscent\"           => self::int16,\n    \"winDescent\"          => self::int16,\n  );\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/Table/Type/post.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\Table\\Type;\nuse FontLib\\Table\\Table;\nuse FontLib\\TrueType\\File;\n\n/**\n * `post` font table.\n *\n * @package php-font-lib\n */\nclass post extends Table {\n  protected $def = array(\n    \"format\"             => self::Fixed,\n    \"italicAngle\"        => self::Fixed,\n    \"underlinePosition\"  => self::FWord,\n    \"underlineThickness\" => self::FWord,\n    \"isFixedPitch\"       => self::uint32,\n    \"minMemType42\"       => self::uint32,\n    \"maxMemType42\"       => self::uint32,\n    \"minMemType1\"        => self::uint32,\n    \"maxMemType1\"        => self::uint32,\n  );\n\n  protected function _parse() {\n    $font = $this->getFont();\n    $data = $font->unpack($this->def);\n\n    $names = array();\n\n    switch ($data[\"format\"]) {\n      case 1:\n        $names = File::$macCharNames;\n        break;\n\n      case 2:\n        $data[\"numberOfGlyphs\"] = $font->readUInt16();\n\n        $glyphNameIndex = $font->readUInt16Many($data[\"numberOfGlyphs\"]);\n\n        $data[\"glyphNameIndex\"] = $glyphNameIndex;\n\n        $namesPascal = array();\n        for ($i = 0; $i < $data[\"numberOfGlyphs\"]; $i++) {\n          $len           = $font->readUInt8();\n          $namesPascal[] = $font->read($len);\n        }\n\n        foreach ($glyphNameIndex as $g => $index) {\n          if ($index < 258) {\n            $names[$g] = File::$macCharNames[$index];\n          }\n          else {\n            if (array_key_exists($index - 258, $namesPascal)) {\n              $names[$g] = $namesPascal[$index - 258];\n            }\n          }\n        }\n\n        break;\n\n      case 2.5:\n        // TODO\n        break;\n\n      case 3:\n        // nothing\n        break;\n\n      case 4:\n        // TODO\n        break;\n    }\n\n    $data[\"names\"] = $names;\n\n    $this->data = $data;\n  }\n\n  function _encode() {\n    $font           = $this->getFont();\n    $data           = $this->data;\n    $data[\"format\"] = 3;\n\n    $length = $font->pack($this->def, $data);\n\n    return $length;\n    /*\n    $subset = $font->getSubset();\n\n    switch($data[\"format\"]) {\n      case 1:\n        // nothing to do\n      break;\n\n      case 2:\n        $old_names = $data[\"names\"];\n\n        $glyphNameIndex = range(0, count($subset));\n\n        $names = array();\n        foreach($subset as $gid) {\n          $names[] = $data[\"names\"][$data[\"glyphNameIndex\"][$gid]];\n        }\n\n        $numberOfGlyphs = count($names);\n        $length += $font->writeUInt16($numberOfGlyphs);\n\n        foreach($glyphNameIndex as $gni) {\n          $length += $font->writeUInt16($gni);\n        }\n\n        //$names = array_slice($names, 257);\n        foreach($names as $name) {\n          $len = strlen($name);\n          $length += $font->writeUInt8($len);\n          $length += $font->write($name, $len);\n        }\n\n      break;\n\n      case 2.5:\n        // TODO\n      break;\n\n      case 3:\n        // nothing\n      break;\n\n      case 4:\n        // TODO\n      break;\n    }\n\n    return $length;*/\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/TrueType/Collection.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\TrueType;\n\nuse Countable;\nuse FontLib\\BinaryStream;\nuse Iterator;\nuse OutOfBoundsException;\n\n/**\n * TrueType collection font file.\n *\n * @package php-font-lib\n */\nclass Collection extends BinaryStream implements Iterator, Countable {\n  /**\n   * Current iterator position.\n   *\n   * @var integer\n   */\n  private $position = 0;\n\n  protected $collectionOffsets = array();\n  protected $collection = array();\n  protected $version;\n  protected $numFonts;\n\n  function parse() {\n    if (isset($this->numFonts)) {\n      return;\n    }\n\n    $this->read(4); // tag name\n\n    $this->version  = $this->readFixed();\n    $this->numFonts = $this->readUInt32();\n\n    for ($i = 0; $i < $this->numFonts; $i++) {\n      $this->collectionOffsets[] = $this->readUInt32();\n    }\n  }\n\n  /**\n   * @param int $fontId\n   *\n   * @throws OutOfBoundsException\n   * @return File\n   */\n  function getFont($fontId) {\n    $this->parse();\n\n    if (!isset($this->collectionOffsets[$fontId])) {\n      throw new OutOfBoundsException();\n    }\n\n    if (isset($this->collection[$fontId])) {\n      return $this->collection[$fontId];\n    }\n\n    $font    = new File();\n    $font->f = $this->f;\n    $font->setTableOffset($this->collectionOffsets[$fontId]);\n\n    return $this->collection[$fontId] = $font;\n  }\n\n  function current() {\n    return $this->getFont($this->position);\n  }\n\n  function key() {\n    return $this->position;\n  }\n\n  function next() {\n    return ++$this->position;\n  }\n\n  function rewind() {\n    $this->position = 0;\n  }\n\n  function valid() {\n    $this->parse();\n\n    return isset($this->collectionOffsets[$this->position]);\n  }\n\n  function count() {\n    $this->parse();\n\n    return $this->numFonts;\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/TrueType/File.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\TrueType;\n\nuse FontLib\\AdobeFontMetrics;\nuse FontLib\\Font;\nuse FontLib\\BinaryStream;\nuse FontLib\\Table\\Table;\nuse FontLib\\Table\\DirectoryEntry;\nuse FontLib\\Table\\Type\\glyf;\nuse FontLib\\Table\\Type\\name;\nuse FontLib\\Table\\Type\\nameRecord;\n\n/**\n * TrueType font file.\n *\n * @package php-font-lib\n */\nclass File extends BinaryStream {\n  /**\n   * @var Header\n   */\n  public $header = array();\n\n  private $tableOffset = 0; // Used for TTC\n\n  private static $raw = false;\n\n  protected $directory = array();\n  protected $data = array();\n\n  protected $glyph_subset = array();\n\n  public $glyph_all = array();\n\n  static $macCharNames = array(\n    \".notdef\", \".null\", \"CR\",\n    \"space\", \"exclam\", \"quotedbl\", \"numbersign\",\n    \"dollar\", \"percent\", \"ampersand\", \"quotesingle\",\n    \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n    \"comma\", \"hyphen\", \"period\", \"slash\",\n    \"zero\", \"one\", \"two\", \"three\",\n    \"four\", \"five\", \"six\", \"seven\",\n    \"eight\", \"nine\", \"colon\", \"semicolon\",\n    \"less\", \"equal\", \"greater\", \"question\",\n    \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\",\n    \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\",\n    \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\",\n    \"X\", \"Y\", \"Z\", \"bracketleft\",\n    \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n    \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n    \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\",\n    \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\",\n    \"x\", \"y\", \"z\", \"braceleft\",\n    \"bar\", \"braceright\", \"asciitilde\", \"Adieresis\",\n    \"Aring\", \"Ccedilla\", \"Eacute\", \"Ntilde\",\n    \"Odieresis\", \"Udieresis\", \"aacute\", \"agrave\",\n    \"acircumflex\", \"adieresis\", \"atilde\", \"aring\",\n    \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\",\n    \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\",\n    \"idieresis\", \"ntilde\", \"oacute\", \"ograve\",\n    \"ocircumflex\", \"odieresis\", \"otilde\", \"uacute\",\n    \"ugrave\", \"ucircumflex\", \"udieresis\", \"dagger\",\n    \"degree\", \"cent\", \"sterling\", \"section\",\n    \"bullet\", \"paragraph\", \"germandbls\", \"registered\",\n    \"copyright\", \"trademark\", \"acute\", \"dieresis\",\n    \"notequal\", \"AE\", \"Oslash\", \"infinity\",\n    \"plusminus\", \"lessequal\", \"greaterequal\", \"yen\",\n    \"mu\", \"partialdiff\", \"summation\", \"product\",\n    \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\",\n    \"Omega\", \"ae\", \"oslash\", \"questiondown\",\n    \"exclamdown\", \"logicalnot\", \"radical\", \"florin\",\n    \"approxequal\", \"increment\", \"guillemotleft\", \"guillemotright\",\n    \"ellipsis\", \"nbspace\", \"Agrave\", \"Atilde\",\n    \"Otilde\", \"OE\", \"oe\", \"endash\",\n    \"emdash\", \"quotedblleft\", \"quotedblright\", \"quoteleft\",\n    \"quoteright\", \"divide\", \"lozenge\", \"ydieresis\",\n    \"Ydieresis\", \"fraction\", \"currency\", \"guilsinglleft\",\n    \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\",\n    \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\",\n    \"Acircumflex\", \"Ecircumflex\", \"Aacute\", \"Edieresis\",\n    \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\",\n    \"Igrave\", \"Oacute\", \"Ocircumflex\", \"applelogo\",\n    \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\",\n    \"dotlessi\", \"circumflex\", \"tilde\", \"macron\",\n    \"breve\", \"dotaccent\", \"ring\", \"cedilla\",\n    \"hungarumlaut\", \"ogonek\", \"caron\", \"Lslash\",\n    \"lslash\", \"Scaron\", \"scaron\", \"Zcaron\",\n    \"zcaron\", \"brokenbar\", \"Eth\", \"eth\",\n    \"Yacute\", \"yacute\", \"Thorn\", \"thorn\",\n    \"minus\", \"multiply\", \"onesuperior\", \"twosuperior\",\n    \"threesuperior\", \"onehalf\", \"onequarter\", \"threequarters\",\n    \"franc\", \"Gbreve\", \"gbreve\", \"Idot\",\n    \"Scedilla\", \"scedilla\", \"Cacute\", \"cacute\",\n    \"Ccaron\", \"ccaron\", \"dmacron\"\n  );\n\n  function getTable() {\n    $this->parseTableEntries();\n\n    return $this->directory;\n  }\n\n  function setTableOffset($offset) {\n    $this->tableOffset = $offset;\n  }\n\n  function parse() {\n    $this->parseTableEntries();\n\n    $this->data = array();\n\n    foreach ($this->directory as $tag => $table) {\n      if (empty($this->data[$tag])) {\n        $this->readTable($tag);\n      }\n    }\n  }\n\n  function utf8toUnicode($str) {\n    $len = mb_strlen($str, '8bit');\n    $out = array();\n\n    for ($i = 0; $i < $len; $i++) {\n      $uni = -1;\n      $h   = ord($str[$i]);\n\n      if ($h <= 0x7F) {\n        $uni = $h;\n      }\n      elseif ($h >= 0xC2) {\n        if (($h <= 0xDF) && ($i < $len - 1)) {\n          $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F);\n        }\n        elseif (($h <= 0xEF) && ($i < $len - 2)) {\n          $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F);\n        }\n        elseif (($h <= 0xF4) && ($i < $len - 3)) {\n          $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F);\n        }\n      }\n\n      if ($uni >= 0) {\n        $out[] = $uni;\n      }\n    }\n\n    return $out;\n  }\n\n  function getUnicodeCharMap() {\n    $subtable = null;\n    foreach ($this->getData(\"cmap\", \"subtables\") as $_subtable) {\n      if ($_subtable[\"platformID\"] == 0 || $_subtable[\"platformID\"] == 3 && $_subtable[\"platformSpecificID\"] == 1) {\n        $subtable = $_subtable;\n        break;\n      }\n    }\n\n    if ($subtable) {\n      return $subtable[\"glyphIndexArray\"];\n    }\n\n    return null;\n  }\n\n  function setSubset($subset) {\n    if (!is_array($subset)) {\n      $subset = $this->utf8toUnicode($subset);\n    }\n\n    $subset = array_unique($subset);\n\n    $glyphIndexArray = $this->getUnicodeCharMap();\n\n    if (!$glyphIndexArray) {\n      return;\n    }\n\n    $gids = array(\n      0, // .notdef\n      1, // .null\n    );\n\n    foreach ($subset as $code) {\n      if (!isset($glyphIndexArray[$code])) {\n        continue;\n      }\n\n      $gid        = $glyphIndexArray[$code];\n      $gids[$gid] = $gid;\n    }\n\n    /** @var glyf $glyf */\n    $glyf = $this->getTableObject(\"glyf\");\n    $gids = $glyf->getGlyphIDs($gids);\n\n    sort($gids);\n\n    $this->glyph_subset = $gids;\n    $this->glyph_all    = array_values($glyphIndexArray); // FIXME\n  }\n\n  function getSubset() {\n    if (empty($this->glyph_subset)) {\n      return $this->glyph_all;\n    }\n\n    return $this->glyph_subset;\n  }\n\n  function encode($tags = array()) {\n    if (!self::$raw) {\n      $tags = array_merge(array(\"head\", \"hhea\", \"cmap\", \"hmtx\", \"maxp\", \"glyf\", \"loca\", \"name\", \"post\"), $tags);\n    }\n    else {\n      $tags = array_keys($this->directory);\n    }\n\n    $num_tables = count($tags);\n    $n          = 16; // @todo\n\n    Font::d(\"Tables : \" . implode(\", \", $tags));\n\n    /** @var DirectoryEntry[] $entries */\n    $entries = array();\n    foreach ($tags as $tag) {\n      if (!isset($this->directory[$tag])) {\n        Font::d(\"  >> '$tag' table doesn't exist\");\n        continue;\n      }\n\n      $entries[$tag] = $this->directory[$tag];\n    }\n\n    $this->header->data[\"numTables\"] = $num_tables;\n    $this->header->encode();\n\n    $directory_offset = $this->pos();\n    $offset           = $directory_offset + $num_tables * $n;\n    $this->seek($offset);\n\n    $i = 0;\n    foreach ($entries as $entry) {\n      $entry->encode($directory_offset + $i * $n);\n      $i++;\n    }\n  }\n\n  function parseHeader() {\n    if (!empty($this->header)) {\n      return;\n    }\n\n    $this->seek($this->tableOffset);\n\n    $this->header = new Header($this);\n    $this->header->parse();\n  }\n\n  function getFontType(){\n    $class_parts = explode(\"\\\\\", get_class($this));\n    return $class_parts[1];\n  }\n\n  function parseTableEntries() {\n    $this->parseHeader();\n\n    if (!empty($this->directory)) {\n      return;\n    }\n\n    if (empty($this->header->data[\"numTables\"])) {\n      return;\n    }\n\n\n    $type = $this->getFontType();\n    $class = \"FontLib\\\\$type\\\\TableDirectoryEntry\";\n\n    for ($i = 0; $i < $this->header->data[\"numTables\"]; $i++) {\n      /** @var TableDirectoryEntry $entry */\n      $entry = new $class($this);\n      $entry->parse();\n\n      $this->directory[$entry->tag] = $entry;\n    }\n  }\n\n  function normalizeFUnit($value, $base = 1000) {\n    return round($value * ($base / $this->getData(\"head\", \"unitsPerEm\")));\n  }\n\n  protected function readTable($tag) {\n    $this->parseTableEntries();\n\n    if (!self::$raw) {\n      $name_canon = preg_replace(\"/[^a-z0-9]/\", \"\", strtolower($tag));\n\n      $class = \"FontLib\\\\Table\\\\Type\\\\$name_canon\";\n\n      if (!isset($this->directory[$tag]) || !@class_exists($class)) {\n        return;\n      }\n    }\n    else {\n      $class = \"FontLib\\\\Table\\\\Table\";\n    }\n\n    /** @var Table $table */\n    $table = new $class($this->directory[$tag]);\n    $table->parse();\n\n    $this->data[$tag] = $table;\n  }\n\n  /**\n   * @param $name\n   *\n   * @return Table\n   */\n  public function getTableObject($name) {\n    return $this->data[$name];\n  }\n\n  public function setTableObject($name, Table $data) {\n    $this->data[$name] = $data;\n  }\n\n  public function getData($name, $key = null) {\n    $this->parseTableEntries();\n\n    if (empty($this->data[$name])) {\n      $this->readTable($name);\n    }\n\n    if (!isset($this->data[$name])) {\n      return null;\n    }\n\n    if (!$key) {\n      return $this->data[$name]->data;\n    }\n    else {\n      return $this->data[$name]->data[$key];\n    }\n  }\n\n  function addDirectoryEntry(DirectoryEntry $entry) {\n    $this->directory[$entry->tag] = $entry;\n  }\n\n  function saveAdobeFontMetrics($file, $encoding = null) {\n    $afm = new AdobeFontMetrics($this);\n    $afm->write($file, $encoding);\n  }\n\n  /**\n   * Get a specific name table string value from its ID\n   *\n   * @param int $nameID The name ID\n   *\n   * @return string|null\n   */\n  function getNameTableString($nameID) {\n    /** @var nameRecord[] $records */\n    $records = $this->getData(\"name\", \"records\");\n\n    if (!isset($records[$nameID])) {\n      return null;\n    }\n\n    return $records[$nameID]->string;\n  }\n\n  /**\n   * Get font copyright\n   *\n   * @return string|null\n   */\n  function getFontCopyright() {\n    return $this->getNameTableString(name::NAME_COPYRIGHT);\n  }\n\n  /**\n   * Get font name\n   *\n   * @return string|null\n   */\n  function getFontName() {\n    return $this->getNameTableString(name::NAME_NAME);\n  }\n\n  /**\n   * Get font subfamily\n   *\n   * @return string|null\n   */\n  function getFontSubfamily() {\n    return $this->getNameTableString(name::NAME_SUBFAMILY);\n  }\n\n  /**\n   * Get font subfamily ID\n   *\n   * @return string|null\n   */\n  function getFontSubfamilyID() {\n    return $this->getNameTableString(name::NAME_SUBFAMILY_ID);\n  }\n\n  /**\n   * Get font full name\n   *\n   * @return string|null\n   */\n  function getFontFullName() {\n    return $this->getNameTableString(name::NAME_FULL_NAME);\n  }\n\n  /**\n   * Get font version\n   *\n   * @return string|null\n   */\n  function getFontVersion() {\n    return $this->getNameTableString(name::NAME_VERSION);\n  }\n\n  /**\n   * Get font weight\n   *\n   * @return string|null\n   */\n  function getFontWeight() {\n    return $this->getTableObject(\"OS/2\")->data[\"usWeightClass\"];\n  }\n\n  /**\n   * Get font Postscript name\n   *\n   * @return string|null\n   */\n  function getFontPostscriptName() {\n    return $this->getNameTableString(name::NAME_POSTSCRIPT_NAME);\n  }\n\n  function reduce() {\n    $names_to_keep = array(\n      name::NAME_COPYRIGHT,\n      name::NAME_NAME,\n      name::NAME_SUBFAMILY,\n      name::NAME_SUBFAMILY_ID,\n      name::NAME_FULL_NAME,\n      name::NAME_VERSION,\n      name::NAME_POSTSCRIPT_NAME,\n    );\n\n    foreach ($this->data[\"name\"]->data[\"records\"] as $id => $rec) {\n      if (!in_array($id, $names_to_keep)) {\n        unset($this->data[\"name\"]->data[\"records\"][$id]);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/TrueType/Header.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\TrueType;\n\n/**\n * TrueType font file header.\n *\n * @package php-font-lib\n */\nclass Header extends \\FontLib\\Header {\n  protected $def = array(\n    \"format\"        => self::uint32,\n    \"numTables\"     => self::uint16,\n    \"searchRange\"   => self::uint16,\n    \"entrySelector\" => self::uint16,\n    \"rangeShift\"    => self::uint16,\n  );\n\n  public function parse() {\n    parent::parse();\n\n    $format                   = $this->data[\"format\"];\n    $this->data[\"formatText\"] = $this->convertUInt32ToStr($format);\n  }\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\TrueType;\n\nuse FontLib\\Table\\DirectoryEntry;\n\n/**\n * TrueType table directory entry.\n *\n * @package php-font-lib\n */\nclass TableDirectoryEntry extends DirectoryEntry {\n  function __construct(File $font) {\n    parent::__construct($font);\n  }\n\n  function parse() {\n    parent::parse();\n\n    $font           = $this->font;\n    $this->checksum = $font->readUInt32();\n    $this->offset   = $font->readUInt32();\n    $this->length   = $font->readUInt32();\n    $this->entryLength += 12;\n  }\n}\n\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/WOFF/File.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\WOFF;\n\nuse FontLib\\Table\\DirectoryEntry;\n\n/**\n * WOFF font file.\n *\n * @package php-font-lib\n *\n * @property TableDirectoryEntry[] $directory\n */\nclass File extends \\FontLib\\TrueType\\File {\n  function parseHeader() {\n    if (!empty($this->header)) {\n      return;\n    }\n\n    $this->header = new Header($this);\n    $this->header->parse();\n  }\n\n  public function load($file) {\n    parent::load($file);\n\n    $this->parseTableEntries();\n    $dataOffset = $this->pos() + count($this->directory) * 20;\n\n    $fw = $this->getTempFile(false);\n    $fr = $this->f;\n\n    $this->f = $fw;\n    $offset  = $this->header->encode();\n\n    foreach ($this->directory as $entry) {\n      // Read ...\n      $this->f = $fr;\n      $this->seek($entry->offset);\n      $data = $this->read($entry->length);\n\n      if ($entry->length < $entry->origLength) {\n        $data = (string) gzuncompress($data);\n      }\n\n      // Prepare data ...\n      $length        = mb_strlen($data, '8bit');\n      $entry->length = $entry->origLength = $length;\n      $entry->offset = $dataOffset;\n\n      // Write ...\n      $this->f = $fw;\n\n      // Woff Entry\n      $this->seek($offset);\n      $offset += $this->write($entry->tag, 4); // tag\n      $offset += $this->writeUInt32($dataOffset); // offset\n      $offset += $this->writeUInt32($length); // length\n      $offset += $this->writeUInt32($length); // origLength\n      $offset += $this->writeUInt32(DirectoryEntry::computeChecksum($data)); // checksum\n\n      // Data\n      $this->seek($dataOffset);\n      $dataOffset += $this->write($data, $length);\n    }\n\n    $this->f = $fw;\n    $this->seek(0);\n\n    // Need to re-parse this, don't know why\n    $this->header    = null;\n    $this->directory = array();\n    $this->parseTableEntries();\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/WOFF/Header.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\WOFF;\n\n/**\n * WOFF font file header.\n *\n * @package php-font-lib\n */\nclass Header extends \\FontLib\\TrueType\\Header {\n  protected $def = array(\n    \"format\"         => self::uint32,\n    \"flavor\"         => self::uint32,\n    \"length\"         => self::uint32,\n    \"numTables\"      => self::uint16,\n    self::uint16,\n    \"totalSfntSize\"  => self::uint32,\n    \"majorVersion\"   => self::uint16,\n    \"minorVersion\"   => self::uint16,\n    \"metaOffset\"     => self::uint32,\n    \"metaLength\"     => self::uint32,\n    \"metaOrigLength\" => self::uint32,\n    \"privOffset\"     => self::uint32,\n    \"privLength\"     => self::uint32,\n  );\n}"
  },
  {
    "path": "application/libraries/dompdf/lib/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php",
    "content": "<?php\n/**\n * @package php-font-lib\n * @link    https://github.com/PhenX/php-font-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace FontLib\\WOFF;\n\nuse FontLib\\Table\\DirectoryEntry;\n\n/**\n * WOFF font file table directory entry.\n *\n * @package php-font-lib\n */\nclass TableDirectoryEntry extends DirectoryEntry {\n  public $origLength;\n\n  function __construct(File $font) {\n    parent::__construct($font);\n  }\n\n  function parse() {\n    parent::parse();\n\n    $font             = $this->font;\n    $this->offset     = $font->readUInt32();\n    $this->length     = $font->readUInt32();\n    $this->origLength = $font->readUInt32();\n    $this->checksum   = $font->readUInt32();\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/COPYING",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/COPYING.GPL",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/README.md",
    "content": "# SVG file parsing / rendering library\n\n[![Build Status](https://travis-ci.org/PhenX/php-svg-lib.svg?branch=master)](https://travis-ci.org/PhenX/php-svg-lib)\n[![Coverage Status](https://coveralls.io/repos/PhenX/php-svg-lib/badge.svg)](https://coveralls.io/r/PhenX/php-svg-lib)\n\n\n[![Latest Stable Version](https://poser.pugx.org/phenx/php-svg-lib/v/stable)](https://packagist.org/packages/phenx/php-svg-lib) \n[![Total Downloads](https://poser.pugx.org/phenx/php-svg-lib/downloads)](https://packagist.org/packages/phenx/php-svg-lib) \n[![Latest Unstable Version](https://poser.pugx.org/phenx/php-svg-lib/v/unstable)](https://packagist.org/packages/phenx/php-svg-lib) \n[![License](https://poser.pugx.org/phenx/php-svg-lib/license)](https://packagist.org/packages/phenx/php-svg-lib)\n\nThe main purpose of this lib is to rasterize SVG to a surface which can be an image or a PDF for example, through a `\\Svg\\Surface` PHP interface.\n\nThis project was initialized by the need to render SVG documents inside PDF files for the [DomPdf](http://dompdf.github.io) project."
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/composer.json",
    "content": "{\n  \"name\": \"phenx/php-svg-lib\",\n  \"type\": \"library\",\n  \"description\": \"A library to read, parse and export to PDF SVG files.\",\n  \"homepage\": \"https://github.com/PhenX/php-svg-lib\",\n  \"license\": \"LGPL-3.0\",\n  \"authors\": [\n    {\n      \"name\": \"Fabien Ménager\",\n      \"email\": \"fabien.menager@gmail.com\"\n    }\n  ],\n  \"autoload\": {\n    \"psr-4\": {\n      \"Svg\\\\\": \"src/Svg\"\n    }\n  },\n  \"autoload-dev\": {\n    \"psr-4\": {\n      \"Svg\\\\Tests\\\\\": \"tests/Svg\"\n    }\n  },\n  \"require\": {\n    \"php\": \"^7.4 || ^8.0\",\n    \"sabberworm/php-css-parser\": \"^8.3\"\n  },\n  \"require-dev\": {\n    \"phpunit/phpunit\": \"^9.5\"\n  }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/DefaultStyle.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg;\n\nclass DefaultStyle extends Style\n{\n    public $color = '';\n    public $opacity = 1.0;\n    public $display = 'inline';\n\n    public $fill = 'black';\n    public $fillOpacity = 1.0;\n    public $fillRule = 'nonzero';\n\n    public $stroke = 'none';\n    public $strokeOpacity = 1.0;\n    public $strokeLinecap = 'butt';\n    public $strokeLinejoin = 'miter';\n    public $strokeMiterlimit = 4;\n    public $strokeWidth = 1.0;\n    public $strokeDasharray = 0;\n    public $strokeDashoffset = 0;\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Document.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg;\n\nuse Svg\\Surface\\SurfaceInterface;\nuse Svg\\Tag\\AbstractTag;\nuse Svg\\Tag\\Anchor;\nuse Svg\\Tag\\Circle;\nuse Svg\\Tag\\Ellipse;\nuse Svg\\Tag\\Group;\nuse Svg\\Tag\\ClipPath;\nuse Svg\\Tag\\Image;\nuse Svg\\Tag\\Line;\nuse Svg\\Tag\\LinearGradient;\nuse Svg\\Tag\\Path;\nuse Svg\\Tag\\Polygon;\nuse Svg\\Tag\\Polyline;\nuse Svg\\Tag\\Rect;\nuse Svg\\Tag\\Stop;\nuse Svg\\Tag\\Text;\nuse Svg\\Tag\\StyleTag;\nuse Svg\\Tag\\UseTag;\n\nclass Document extends AbstractTag\n{\n    protected $filename;\n    public $inDefs = false;\n\n    protected $x;\n    protected $y;\n    protected $width;\n    protected $height;\n\n    protected $subPathInit;\n    protected $pathBBox;\n    protected $viewBox;\n\n    /** @var SurfaceInterface */\n    protected $surface;\n\n    /** @var AbstractTag[] */\n    protected $stack = array();\n\n    /** @var AbstractTag[] */\n    protected $defs = array();\n\n    /** @var \\Sabberworm\\CSS\\CSSList\\Document[] */\n    protected $styleSheets = array();\n\n    public function loadFile($filename)\n    {\n        $this->filename = $filename;\n    }\n\n    protected function initParser() {\n        $parser = xml_parser_create(\"utf-8\");\n        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);\n        xml_set_element_handler(\n            $parser,\n            array($this, \"_tagStart\"),\n            array($this, \"_tagEnd\")\n        );\n        xml_set_character_data_handler(\n            $parser,\n            array($this, \"_charData\")\n        );\n\n        return $parser;\n    }\n\n    public function __construct() {\n\n    }\n\n    /**\n     * @return SurfaceInterface\n     */\n    public function getSurface()\n    {\n        return $this->surface;\n    }\n\n    public function getStack()\n    {\n        return $this->stack;\n    }\n\n    public function getWidth()\n    {\n        return $this->width;\n    }\n\n    public function getHeight()\n    {\n        return $this->height;\n    }\n\n    public function getDimensions() {\n        $rootAttributes = null;\n\n        $parser = xml_parser_create(\"utf-8\");\n        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);\n        xml_set_element_handler(\n            $parser,\n            function ($parser, $name, $attributes) use (&$rootAttributes) {\n                if ($name === \"svg\" && $rootAttributes === null) {\n                    $attributes = array_change_key_case($attributes, CASE_LOWER);\n\n                    $rootAttributes = $attributes;\n                }\n            },\n            function ($parser, $name) {}\n        );\n\n        $fp = fopen($this->filename, \"r\");\n        while ($line = fread($fp, 8192)) {\n            xml_parse($parser, $line, false);\n\n            if ($rootAttributes !== null) {\n                break;\n            }\n        }\n\n        xml_parser_free($parser);\n\n        return $this->handleSizeAttributes($rootAttributes);\n    }\n\n    public function handleSizeAttributes($attributes){\n        if ($this->width === null) {\n            if (isset($attributes[\"width\"])) {\n                $width = Style::convertSize($attributes[\"width\"], 400);\n                $this->width  = $width;\n            }\n\n            if (isset($attributes[\"height\"])) {\n                $height = Style::convertSize($attributes[\"height\"], 300);\n                $this->height = $height;\n            }\n\n            if (isset($attributes['viewbox'])) {\n                $viewBox = preg_split('/[\\s,]+/is', trim($attributes['viewbox']));\n                if (count($viewBox) == 4) {\n                    $this->x = $viewBox[0];\n                    $this->y = $viewBox[1];\n\n                    if (!$this->width) {\n                        $this->width = $viewBox[2];\n                    }\n                    if (!$this->height) {\n                        $this->height = $viewBox[3];\n                    }\n                }\n            }\n        }\n\n        return array(\n            0        => $this->width,\n            1        => $this->height,\n\n            \"width\"  => $this->width,\n            \"height\" => $this->height,\n        );\n    }\n\n    public function getDocument(){\n        return $this;\n    }\n\n    /**\n     * Append a style sheet\n     *\n     * @param \\Sabberworm\\CSS\\CSSList\\Document $stylesheet\n     */\n    public function appendStyleSheet($stylesheet) {\n        $this->styleSheets[] = $stylesheet;\n    }\n\n    /**\n     * Get the document style sheets\n     *\n     * @return \\Sabberworm\\CSS\\CSSList\\Document[]\n     */\n    public function getStyleSheets() {\n        return $this->styleSheets;\n    }\n\n    protected function before($attributes)\n    {\n        $surface = $this->getSurface();\n\n        $style = new DefaultStyle();\n        $style->inherit($this);\n        $style->fromAttributes($attributes);\n\n        $this->setStyle($style);\n\n        $surface->setStyle($style);\n    }\n\n    public function render(SurfaceInterface $surface)\n    {\n        $this->inDefs = false;\n        $this->surface = $surface;\n\n        $parser = $this->initParser();\n\n        if ($this->x || $this->y) {\n            $surface->translate(-$this->x, -$this->y);\n        }\n\n        $fp = fopen($this->filename, \"r\");\n        while ($line = fread($fp, 8192)) {\n            xml_parse($parser, $line, false);\n        }\n\n        xml_parse($parser, \"\", true);\n\n        xml_parser_free($parser);\n    }\n\n    protected function svgOffset($attributes)\n    {\n        $this->attributes = $attributes;\n\n        $this->handleSizeAttributes($attributes);\n    }\n\n    public function getDef($id) {\n        $id = ltrim($id, \"#\");\n\n        return isset($this->defs[$id]) ? $this->defs[$id] : null;\n    }\n\n    private function _tagStart($parser, $name, $attributes)\n    {\n        $this->x = 0;\n        $this->y = 0;\n\n        $tag = null;\n\n        $attributes = array_change_key_case($attributes, CASE_LOWER);\n\n        switch (strtolower($name)) {\n            case 'defs':\n                $this->inDefs = true;\n                return;\n\n            case 'svg':\n                if (count($this->attributes)) {\n                    $tag = new Group($this, $name);\n                }\n                else {\n                    $tag = $this;\n                    $this->svgOffset($attributes);\n                }\n                break;\n\n            case 'path':\n                $tag = new Path($this, $name);\n                break;\n\n            case 'rect':\n                $tag = new Rect($this, $name);\n                break;\n\n            case 'circle':\n                $tag = new Circle($this, $name);\n                break;\n\n            case 'ellipse':\n                $tag = new Ellipse($this, $name);\n                break;\n\n            case 'image':\n                $tag = new Image($this, $name);\n                break;\n\n            case 'line':\n                $tag = new Line($this, $name);\n                break;\n\n            case 'polyline':\n                $tag = new Polyline($this, $name);\n                break;\n\n            case 'polygon':\n                $tag = new Polygon($this, $name);\n                break;\n\n            case 'lineargradient':\n                $tag = new LinearGradient($this, $name);\n                break;\n\n            case 'radialgradient':\n                $tag = new LinearGradient($this, $name);\n                break;\n\n            case 'stop':\n                $tag = new Stop($this, $name);\n                break;\n\n            case 'style':\n                $tag = new StyleTag($this, $name);\n                break;\n\n            case 'a':\n                $tag = new Anchor($this, $name);\n                break;\n\n            case 'g':\n            case 'symbol':\n                $tag = new Group($this, $name);\n                break;\n\n            case 'clippath':\n                $tag = new ClipPath($this, $name);\n                break;\n\n            case 'use':\n                $tag = new UseTag($this, $name);\n                break;\n\n            case 'text':\n                $tag = new Text($this, $name);\n                break;\n\n            case 'desc':\n                return;\n        }\n\n        if ($tag) {\n            if (isset($attributes[\"id\"])) {\n                $this->defs[$attributes[\"id\"]] = $tag;\n            }\n            else {\n                /** @var AbstractTag $top */\n                $top = end($this->stack);\n                if ($top && $top != $tag) {\n                    $top->children[] = $tag;\n                }\n            }\n\n            $this->stack[] = $tag;\n\n            $tag->handle($attributes);\n        }\n    }\n\n    function _charData($parser, $data)\n    {\n        $stack_top = end($this->stack);\n\n        if ($stack_top instanceof Text || $stack_top instanceof StyleTag) {\n            $stack_top->appendText($data);\n        }\n    }\n\n    function _tagEnd($parser, $name)\n    {\n        /** @var AbstractTag $tag */\n        $tag = null;\n        switch (strtolower($name)) {\n            case 'defs':\n                $this->inDefs = false;\n                return;\n\n            case 'svg':\n            case 'path':\n            case 'rect':\n            case 'circle':\n            case 'ellipse':\n            case 'image':\n            case 'line':\n            case 'polyline':\n            case 'polygon':\n            case 'radialgradient':\n            case 'lineargradient':\n            case 'stop':\n            case 'style':\n            case 'text':\n            case 'g':\n            case 'symbol':\n            case 'clippath':\n            case 'use':\n            case 'a':\n                $tag = array_pop($this->stack);\n                break;\n        }\n\n        if (!$this->inDefs && $tag) {\n            $tag->handleEnd();\n        }\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Gradient/Stop.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Gradient;\n\nclass Stop\n{\n    public $offset;\n    public $color;\n    public $opacity = 1.0;\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Style.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg;\n\nuse Svg\\Tag\\AbstractTag;\n\nclass Style\n{\n    const TYPE_COLOR = 1;\n    const TYPE_LENGTH = 2;\n    const TYPE_NAME = 3;\n    const TYPE_ANGLE = 4;\n    const TYPE_NUMBER = 5;\n\n    public $color;\n    public $opacity;\n    public $display;\n\n    public $fill;\n    public $fillOpacity;\n    public $fillRule;\n\n    public $stroke;\n    public $strokeOpacity;\n    public $strokeLinecap;\n    public $strokeLinejoin;\n    public $strokeMiterlimit;\n    public $strokeWidth;\n    public $strokeDasharray;\n    public $strokeDashoffset;\n\n    public $fontFamily = 'serif';\n    public $fontSize = 12;\n    public $fontWeight = 'normal';\n    public $fontStyle = 'normal';\n    public $textAnchor = 'start';\n\n    protected function getStyleMap()\n    {\n        return array(\n            'color'             => array('color', self::TYPE_COLOR),\n            'opacity'           => array('opacity', self::TYPE_NUMBER),\n            'display'           => array('display', self::TYPE_NAME),\n\n            'fill'              => array('fill', self::TYPE_COLOR),\n            'fill-opacity'      => array('fillOpacity', self::TYPE_NUMBER),\n            'fill-rule'         => array('fillRule', self::TYPE_NAME),\n\n            'stroke'            => array('stroke', self::TYPE_COLOR),\n            'stroke-dasharray'  => array('strokeDasharray', self::TYPE_NAME),\n            'stroke-dashoffset' => array('strokeDashoffset', self::TYPE_NUMBER),\n            'stroke-linecap'    => array('strokeLinecap', self::TYPE_NAME),\n            'stroke-linejoin'   => array('strokeLinejoin', self::TYPE_NAME),\n            'stroke-miterlimit' => array('strokeMiterlimit', self::TYPE_NUMBER),\n            'stroke-opacity'    => array('strokeOpacity', self::TYPE_NUMBER),\n            'stroke-width'      => array('strokeWidth', self::TYPE_NUMBER),\n\n            'font-family'       => array('fontFamily', self::TYPE_NAME),\n            'font-size'         => array('fontSize', self::TYPE_NUMBER),\n            'font-weight'       => array('fontWeight', self::TYPE_NAME),\n            'font-style'        => array('fontStyle', self::TYPE_NAME),\n            'text-anchor'       => array('textAnchor', self::TYPE_NAME),\n        );\n    }\n\n    /**\n     * @param $attributes\n     *\n     * @return Style\n     */\n    public function fromAttributes($attributes)\n    {\n        $this->fillStyles($attributes);\n\n        if (isset($attributes[\"style\"])) {\n            $styles = self::parseCssStyle($attributes[\"style\"]);\n            $this->fillStyles($styles);\n        }\n    }\n\n    public function inherit(AbstractTag $tag) {\n        $group = $tag->getParentGroup();\n        if ($group) {\n            $parent_style = $group->getStyle();\n\n            foreach ($parent_style as $_key => $_value) {\n                if ($_value !== null) {\n                    $this->$_key = $_value;\n                }\n            }\n        }\n    }\n\n    public function fromStyleSheets(AbstractTag $tag, $attributes) {\n        $class = isset($attributes[\"class\"]) ? preg_split('/\\s+/', trim($attributes[\"class\"])) : null;\n\n        $stylesheets = $tag->getDocument()->getStyleSheets();\n\n        $styles = array();\n\n        foreach ($stylesheets as $_sc) {\n\n            /** @var \\Sabberworm\\CSS\\RuleSet\\DeclarationBlock $_decl */\n            foreach ($_sc->getAllDeclarationBlocks() as $_decl) {\n\n                /** @var \\Sabberworm\\CSS\\Property\\Selector $_selector */\n                foreach ($_decl->getSelectors() as $_selector) {\n                    $_selector = $_selector->getSelector();\n\n                    // Match class name\n                    if ($class !== null) {\n                        foreach ($class as $_class) {\n                            if ($_selector === \".$_class\") {\n                                /** @var \\Sabberworm\\CSS\\Rule\\Rule $_rule */\n                                foreach ($_decl->getRules() as $_rule) {\n                                    $styles[$_rule->getRule()] = $_rule->getValue() . \"\";\n                                }\n\n                                break 2;\n                            }\n                        }\n                    }\n\n                    // Match tag name\n                    if ($_selector === $tag->tagName) {\n                        /** @var \\Sabberworm\\CSS\\Rule\\Rule $_rule */\n                        foreach ($_decl->getRules() as $_rule) {\n                            $styles[$_rule->getRule()] = $_rule->getValue() . \"\";\n                        }\n\n                        break;\n                    }\n                }\n            }\n        }\n\n        $this->fillStyles($styles);\n    }\n\n    protected function fillStyles($styles)\n    {\n        foreach ($this->getStyleMap() as $from => $spec) {\n            if (isset($styles[$from])) {\n                list($to, $type) = $spec;\n                $value = null;\n                switch ($type) {\n                    case self::TYPE_COLOR:\n                        $value = self::parseColor($styles[$from]);\n                        break;\n\n                    case self::TYPE_NUMBER:\n                        $value = ($styles[$from] === null) ? null : (float)$styles[$from];\n                        break;\n\n                    default:\n                        $value = $styles[$from];\n                }\n\n                if ($value !== null) {\n                    $this->$to = $value;\n                }\n            }\n        }\n    }\n\n    static function parseColor($color)\n    {\n        $color = strtolower(trim($color));\n\n        $parts = preg_split('/[^,]\\s+/', $color, 2);\n\n        if (count($parts) == 2) {\n            $color = $parts[1];\n        }\n        else {\n            $color = $parts[0];\n        }\n\n        if ($color === \"none\") {\n            return \"none\";\n        }\n\n        // SVG color name\n        if (isset(self::$colorNames[$color])) {\n            return self::parseHexColor(self::$colorNames[$color]);\n        }\n\n        // Hex color\n        if ($color[0] === \"#\") {\n            return self::parseHexColor($color);\n        }\n\n        // RGB color\n        if (strpos($color, \"rgb\") !== false) {\n            return self::getTriplet($color);\n        }\n\n        // RGB color\n        if (strpos($color, \"hsl\") !== false) {\n            $triplet = self::getTriplet($color, true);\n\n            if ($triplet == null) {\n                return null;\n            }\n\n            list($h, $s, $l) = $triplet;\n\n            $r = $l;\n            $g = $l;\n            $b = $l;\n            $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s);\n            if ($v > 0) {\n                $m = $l + $l - $v;\n                $sv = ($v - $m) / $v;\n                $h *= 6.0;\n                $sextant = floor($h);\n                $fract = $h - $sextant;\n                $vsf = $v * $sv * $fract;\n                $mid1 = $m + $vsf;\n                $mid2 = $v - $vsf;\n\n                switch ($sextant) {\n                    case 0:\n                        $r = $v;\n                        $g = $mid1;\n                        $b = $m;\n                        break;\n                    case 1:\n                        $r = $mid2;\n                        $g = $v;\n                        $b = $m;\n                        break;\n                    case 2:\n                        $r = $m;\n                        $g = $v;\n                        $b = $mid1;\n                        break;\n                    case 3:\n                        $r = $m;\n                        $g = $mid2;\n                        $b = $v;\n                        break;\n                    case 4:\n                        $r = $mid1;\n                        $g = $m;\n                        $b = $v;\n                        break;\n                    case 5:\n                        $r = $v;\n                        $g = $m;\n                        $b = $mid2;\n                        break;\n                }\n            }\n\n            return array(\n                $r * 255.0,\n                $g * 255.0,\n                $b * 255.0,\n            );\n        }\n\n        // Gradient\n        if (strpos($color, \"url(#\") !== false) {\n            $i = strpos($color, \"(\");\n            $j = strpos($color, \")\");\n\n            // Bad url format\n            if ($i === false || $j === false) {\n                return null;\n            }\n\n            return trim(substr($color, $i + 1, $j - $i - 1));\n        }\n\n        return null;\n    }\n\n    static function getTriplet($color, $percent = false) {\n        $i = strpos($color, \"(\");\n        $j = strpos($color, \")\");\n\n        // Bad color value\n        if ($i === false || $j === false) {\n            return null;\n        }\n\n        $triplet = preg_split(\"/\\\\s*,\\\\s*/\", trim(substr($color, $i + 1, $j - $i - 1)));\n\n        if (count($triplet) != 3) {\n            return null;\n        }\n\n        foreach (array_keys($triplet) as $c) {\n            $triplet[$c] = trim($triplet[$c]);\n\n            if ($percent) {\n                if ($triplet[$c][strlen($triplet[$c]) - 1] === \"%\") {\n                    $triplet[$c] = floatval($triplet[$c]) / 100;\n                }\n                else {\n                    $triplet[$c] = $triplet[$c] / 255;\n                }\n            }\n            else {\n                if ($triplet[$c][strlen($triplet[$c]) - 1] === \"%\") {\n                    $triplet[$c] = round(floatval($triplet[$c]) * 2.55);\n                }\n            }\n        }\n\n        return $triplet;\n    }\n\n    static function parseHexColor($hex)\n    {\n        $c = array(0, 0, 0);\n\n        // #FFFFFF\n        if (isset($hex[6])) {\n            $c[0] = hexdec(substr($hex, 1, 2));\n            $c[1] = hexdec(substr($hex, 3, 2));\n            $c[2] = hexdec(substr($hex, 5, 2));\n        } else {\n            $c[0] = hexdec($hex[1] . $hex[1]);\n            $c[1] = hexdec($hex[2] . $hex[2]);\n            $c[2] = hexdec($hex[3] . $hex[3]);\n        }\n\n        return $c;\n    }\n\n    /**\n     * Simple CSS parser\n     *\n     * @param $style\n     *\n     * @return array\n     */\n    static function parseCssStyle($style)\n    {\n        $matches = array();\n        preg_match_all(\"/([a-z-]+)\\\\s*:\\\\s*([^;$]+)/si\", $style, $matches, PREG_SET_ORDER);\n\n        $styles = array();\n        foreach ($matches as $match) {\n            $styles[$match[1]] = $match[2];\n        }\n\n        return $styles;\n    }\n\n    /**\n     * Convert a size to a float\n     *\n     * @param string $size          SVG size\n     * @param float  $dpi           DPI\n     * @param float  $referenceSize Reference size\n     *\n     * @return float|null\n     */\n    static function convertSize($size, $referenceSize = 11.0, $dpi = 96.0) {\n        $size = trim(strtolower($size));\n\n        if (is_numeric($size)) {\n            return $size;\n        }\n\n        if ($pos = strpos($size, \"px\")) {\n            return floatval(substr($size, 0, $pos));\n        }\n\n        if ($pos = strpos($size, \"pt\")) {\n            return floatval(substr($size, 0, $pos));\n        }\n\n        if ($pos = strpos($size, \"cm\")) {\n            return floatval(substr($size, 0, $pos)) * $dpi;\n        }\n\n        if ($pos = strpos($size, \"%\")) {\n            return $referenceSize * substr($size, 0, $pos) / 100;\n        }\n\n        if ($pos = strpos($size, \"em\")) {\n            return $referenceSize * substr($size, 0, $pos);\n        }\n\n        // TODO cm, mm, pc, in, etc\n\n        return null;\n    }\n\n    static $colorNames = array(\n        'antiquewhite'         => '#FAEBD7',\n        'aqua'                 => '#00FFFF',\n        'aquamarine'           => '#7FFFD4',\n        'beige'                => '#F5F5DC',\n        'black'                => '#000000',\n        'blue'                 => '#0000FF',\n        'brown'                => '#A52A2A',\n        'cadetblue'            => '#5F9EA0',\n        'chocolate'            => '#D2691E',\n        'cornflowerblue'       => '#6495ED',\n        'crimson'              => '#DC143C',\n        'darkblue'             => '#00008B',\n        'darkgoldenrod'        => '#B8860B',\n        'darkgreen'            => '#006400',\n        'darkmagenta'          => '#8B008B',\n        'darkorange'           => '#FF8C00',\n        'darkred'              => '#8B0000',\n        'darkseagreen'         => '#8FBC8F',\n        'darkslategray'        => '#2F4F4F',\n        'darkviolet'           => '#9400D3',\n        'deepskyblue'          => '#00BFFF',\n        'dodgerblue'           => '#1E90FF',\n        'firebrick'            => '#B22222',\n        'forestgreen'          => '#228B22',\n        'fuchsia'              => '#FF00FF',\n        'gainsboro'            => '#DCDCDC',\n        'gold'                 => '#FFD700',\n        'gray'                 => '#808080',\n        'green'                => '#008000',\n        'greenyellow'          => '#ADFF2F',\n        'hotpink'              => '#FF69B4',\n        'indigo'               => '#4B0082',\n        'khaki'                => '#F0E68C',\n        'lavenderblush'        => '#FFF0F5',\n        'lemonchiffon'         => '#FFFACD',\n        'lightcoral'           => '#F08080',\n        'lightgoldenrodyellow' => '#FAFAD2',\n        'lightgreen'           => '#90EE90',\n        'lightsalmon'          => '#FFA07A',\n        'lightskyblue'         => '#87CEFA',\n        'lightslategray'       => '#778899',\n        'lightyellow'          => '#FFFFE0',\n        'lime'                 => '#00FF00',\n        'limegreen'            => '#32CD32',\n        'magenta'              => '#FF00FF',\n        'maroon'               => '#800000',\n        'mediumaquamarine'     => '#66CDAA',\n        'mediumorchid'         => '#BA55D3',\n        'mediumseagreen'       => '#3CB371',\n        'mediumspringgreen'    => '#00FA9A',\n        'mediumvioletred'      => '#C71585',\n        'midnightblue'         => '#191970',\n        'mintcream'            => '#F5FFFA',\n        'moccasin'             => '#FFE4B5',\n        'navy'                 => '#000080',\n        'olive'                => '#808000',\n        'orange'               => '#FFA500',\n        'orchid'               => '#DA70D6',\n        'palegreen'            => '#98FB98',\n        'palevioletred'        => '#D87093',\n        'peachpuff'            => '#FFDAB9',\n        'pink'                 => '#FFC0CB',\n        'powderblue'           => '#B0E0E6',\n        'purple'               => '#800080',\n        'red'                  => '#FF0000',\n        'royalblue'            => '#4169E1',\n        'salmon'               => '#FA8072',\n        'seagreen'             => '#2E8B57',\n        'sienna'               => '#A0522D',\n        'silver'               => '#C0C0C0',\n        'skyblue'              => '#87CEEB',\n        'slategray'            => '#708090',\n        'springgreen'          => '#00FF7F',\n        'steelblue'            => '#4682B4',\n        'tan'                  => '#D2B48C',\n        'teal'                 => '#008080',\n        'thistle'              => '#D8BFD8',\n        'turquoise'            => '#40E0D0',\n        'violetred'            => '#D02090',\n        'white'                => '#FFFFFF',\n        'yellow'               => '#FFFF00',\n        'aliceblue'            => '#f0f8ff',\n        'azure'                => '#f0ffff',\n        'bisque'               => '#ffe4c4',\n        'blanchedalmond'       => '#ffebcd',\n        'blueviolet'           => '#8a2be2',\n        'burlywood'            => '#deb887',\n        'chartreuse'           => '#7fff00',\n        'coral'                => '#ff7f50',\n        'cornsilk'             => '#fff8dc',\n        'cyan'                 => '#00ffff',\n        'darkcyan'             => '#008b8b',\n        'darkgray'             => '#a9a9a9',\n        'darkgrey'             => '#a9a9a9',\n        'darkkhaki'            => '#bdb76b',\n        'darkolivegreen'       => '#556b2f',\n        'darkorchid'           => '#9932cc',\n        'darksalmon'           => '#e9967a',\n        'darkslateblue'        => '#483d8b',\n        'darkslategrey'        => '#2f4f4f',\n        'darkturquoise'        => '#00ced1',\n        'deeppink'             => '#ff1493',\n        'dimgray'              => '#696969',\n        'dimgrey'              => '#696969',\n        'floralwhite'          => '#fffaf0',\n        'ghostwhite'           => '#f8f8ff',\n        'goldenrod'            => '#daa520',\n        'grey'                 => '#808080',\n        'honeydew'             => '#f0fff0',\n        'indianred'            => '#cd5c5c',\n        'ivory'                => '#fffff0',\n        'lavender'             => '#e6e6fa',\n        'lawngreen'            => '#7cfc00',\n        'lightblue'            => '#add8e6',\n        'lightcyan'            => '#e0ffff',\n        'lightgray'            => '#d3d3d3',\n        'lightgrey'            => '#d3d3d3',\n        'lightpink'            => '#ffb6c1',\n        'lightseagreen'        => '#20b2aa',\n        'lightslategrey'       => '#778899',\n        'lightsteelblue'       => '#b0c4de',\n        'linen'                => '#faf0e6',\n        'mediumblue'           => '#0000cd',\n        'mediumpurple'         => '#9370db',\n        'mediumslateblue'      => '#7b68ee',\n        'mediumturquoise'      => '#48d1cc',\n        'mistyrose'            => '#ffe4e1',\n        'navajowhite'          => '#ffdead',\n        'oldlace'              => '#fdf5e6',\n        'olivedrab'            => '#6b8e23',\n        'orangered'            => '#ff4500',\n        'palegoldenrod'        => '#eee8aa',\n        'paleturquoise'        => '#afeeee',\n        'papayawhip'           => '#ffefd5',\n        'peru'                 => '#cd853f',\n        'plum'                 => '#dda0dd',\n        'rosybrown'            => '#bc8f8f',\n        'saddlebrown'          => '#8b4513',\n        'sandybrown'           => '#f4a460',\n        'seashell'             => '#fff5ee',\n        'slateblue'            => '#6a5acd',\n        'slategrey'            => '#708090',\n        'snow'                 => '#fffafa',\n        'tomato'               => '#ff6347',\n        'violet'               => '#ee82ee',\n        'wheat'                => '#f5deb3',\n        'whitesmoke'           => '#f5f5f5',\n        'yellowgreen'          => '#9acd32',\n    );\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Surface/CPdf.php",
    "content": "<?php\n/**\n * A PHP class to provide the basic functionality to create a pdf document without\n * any requirement for additional modules.\n *\n * Extended by Orion Richardson to support Unicode / UTF-8 characters using\n * TCPDF and others as a guide.\n *\n * @author  Wayne Munro <pdf@ros.co.nz>\n * @author  Orion Richardson <orionr@yahoo.com>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Ryan H. Masten <ryan.masten@gmail.com>\n * @author  Brian Sweeney <eclecticgeek@gmail.com>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license Public Domain http://creativecommons.org/licenses/publicdomain/\n * @package Cpdf\n */\n\nnamespace Svg\\Surface;\n\nclass CPdf\n{\n\n    /**\n     * @var integer The current number of pdf objects in the document\n     */\n    public $numObj = 0;\n\n    /**\n     * @var array This array contains all of the pdf objects, ready for final assembly\n     */\n    public $objects = array();\n\n    /**\n     * @var integer The objectId (number within the objects array) of the document catalog\n     */\n    public $catalogId;\n\n    /**\n     * @var array Array carrying information about the fonts that the system currently knows about\n     * Used to ensure that a font is not loaded twice, among other things\n     */\n    public $fonts = array();\n\n    /**\n     * @var string The default font metrics file to use if no other font has been loaded.\n     * The path to the directory containing the font metrics should be included\n     */\n    public $defaultFont = './fonts/Helvetica.afm';\n\n    /**\n     * @string A record of the current font\n     */\n    public $currentFont = '';\n\n    /**\n     * @var string The current base font\n     */\n    public $currentBaseFont = '';\n\n    /**\n     * @var integer The number of the current font within the font array\n     */\n    public $currentFontNum = 0;\n\n    /**\n     * @var integer\n     */\n    public $currentNode;\n\n    /**\n     * @var integer Object number of the current page\n     */\n    public $currentPage;\n\n    /**\n     * @var integer Object number of the currently active contents block\n     */\n    public $currentContents;\n\n    /**\n     * @var integer Number of fonts within the system\n     */\n    public $numFonts = 0;\n\n    /**\n     * @var integer Number of graphic state resources used\n     */\n    private $numStates = 0;\n\n    /**\n     * @var array Current color for fill operations, defaults to inactive value,\n     * all three components should be between 0 and 1 inclusive when active\n     */\n    public $currentColor = null;\n\n    /**\n     * @var string Fill rule (nonzero or evenodd)\n     */\n    public $fillRule = \"nonzero\";\n\n    /**\n     * @var array Current color for stroke operations (lines etc.)\n     */\n    public $currentStrokeColor = null;\n\n    /**\n     * @var string Current style that lines are drawn in\n     */\n    public $currentLineStyle = '';\n\n    /**\n     * @var array Current line transparency (partial graphics state)\n     */\n    public $currentLineTransparency = array(\"mode\" => \"Normal\", \"opacity\" => 1.0);\n\n    /**\n     * array Current fill transparency (partial graphics state)\n     */\n    public $currentFillTransparency = array(\"mode\" => \"Normal\", \"opacity\" => 1.0);\n\n    /**\n     * @var array An array which is used to save the state of the document, mainly the colors and styles\n     * it is used to temporarily change to another state, the change back to what it was before\n     */\n    public $stateStack = array();\n\n    /**\n     * @var integer Number of elements within the state stack\n     */\n    public $nStateStack = 0;\n\n    /**\n     * @var integer Number of page objects within the document\n     */\n    public $numPages = 0;\n\n    /**\n     * @var array Object Id storage stack\n     */\n    public $stack = array();\n\n    /**\n     * @var integer Number of elements within the object Id storage stack\n     */\n    public $nStack = 0;\n\n    /**\n     * an array which contains information about the objects which are not firmly attached to pages\n     * these have been added with the addObject function\n     */\n    public $looseObjects = array();\n\n    /**\n     * array contains infomation about how the loose objects are to be added to the document\n     */\n    public $addLooseObjects = array();\n\n    /**\n     * @var integer The objectId of the information object for the document\n     * this contains authorship, title etc.\n     */\n    public $infoObject = 0;\n\n    /**\n     * @var integer Number of images being tracked within the document\n     */\n    public $numImages = 0;\n\n    /**\n     * @var array An array containing options about the document\n     * it defaults to turning on the compression of the objects\n     */\n    public $options = array('compression' => true);\n\n    /**\n     * @var integer The objectId of the first page of the document\n     */\n    public $firstPageId;\n\n    /**\n     * @var float Used to track the last used value of the inter-word spacing, this is so that it is known\n     * when the spacing is changed.\n     */\n    public $wordSpaceAdjust = 0;\n\n    /**\n     * @var float Used to track the last used value of the inter-letter spacing, this is so that it is known\n     * when the spacing is changed.\n     */\n    public $charSpaceAdjust = 0;\n\n    /**\n     * @var integer The object Id of the procset object\n     */\n    public $procsetObjectId;\n\n    /**\n     * @var array Store the information about the relationship between font families\n     * this used so that the code knows which font is the bold version of another font, etc.\n     * the value of this array is initialised in the constructor function.\n     */\n    public $fontFamilies = array();\n\n    /**\n     * @var string Folder for php serialized formats of font metrics files.\n     * If empty string, use same folder as original metrics files.\n     * This can be passed in from class creator.\n     * If this folder does not exist or is not writable, Cpdf will be **much** slower.\n     * Because of potential trouble with php safe mode, folder cannot be created at runtime.\n     */\n    public $fontcache = '';\n\n    /**\n     * @var integer The version of the font metrics cache file.\n     * This value must be manually incremented whenever the internal font data structure is modified.\n     */\n    public $fontcacheVersion = 6;\n\n    /**\n     * @var string Temporary folder.\n     * If empty string, will attempty system tmp folder.\n     * This can be passed in from class creator.\n     * Only used for conversion of gd images to jpeg images.\n     */\n    public $tmp = '';\n\n    /**\n     * @var string Track if the current font is bolded or italicised\n     */\n    public $currentTextState = '';\n\n    /**\n     * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information\n     */\n    public $messages = '';\n\n    /**\n     * @var string The ancryption array for the document encryption is stored here\n     */\n    public $arc4 = '';\n\n    /**\n     * @var integer The object Id of the encryption information\n     */\n    public $arc4_objnum = 0;\n\n    /**\n     * @var string The file identifier, used to uniquely identify a pdf document\n     */\n    public $fileIdentifier = '';\n\n    /**\n     * @var boolean A flag to say if a document is to be encrypted or not\n     */\n    public $encrypted = false;\n\n    /**\n     * @var string The encryption key for the encryption of all the document content (structure is not encrypted)\n     */\n    public $encryptionKey = '';\n\n    /**\n     * @var array Array which forms a stack to keep track of nested callback functions\n     */\n    public $callback = array();\n\n    /**\n     * @var integer The number of callback functions in the callback array\n     */\n    public $nCallback = 0;\n\n    /**\n     * @var array Store label->id pairs for named destinations, these will be used to replace internal links\n     * done this way so that destinations can be defined after the location that links to them\n     */\n    public $destinations = array();\n\n    /**\n     * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the\n     * publiciables within the class, so that the user can rollback at will (from each 'start' command)\n     * note that this includes the objects array, so these can be large.\n     */\n    public $checkpoint = '';\n\n    /**\n     * @var array Table of Image origin filenames and image labels which were already added with o_image().\n     * Allows to merge identical images\n     */\n    public $imagelist = array();\n\n    /**\n     * @var boolean Whether the text passed in should be treated as Unicode or just local character set.\n     */\n    public $isUnicode = false;\n\n    /**\n     * @var string the JavaScript code of the document\n     */\n    public $javascript = '';\n\n    /**\n     * @var boolean whether the compression is possible\n     */\n    protected $compressionReady = false;\n\n    /**\n     * @var array Current page size\n     */\n    protected $currentPageSize = array(\"width\" => 0, \"height\" => 0);\n\n    /**\n     * @var array All the chars that will be required in the font subsets\n     */\n    protected $stringSubsets = array();\n\n    /**\n     * @var string The target internal encoding\n     */\n    static protected $targetEncoding = 'iso-8859-1';\n\n    /**\n     * @var array The list of the core fonts\n     */\n    static protected $coreFonts = array(\n        'courier',\n        'courier-bold',\n        'courier-oblique',\n        'courier-boldoblique',\n        'helvetica',\n        'helvetica-bold',\n        'helvetica-oblique',\n        'helvetica-boldoblique',\n        'times-roman',\n        'times-bold',\n        'times-italic',\n        'times-bolditalic',\n        'symbol',\n        'zapfdingbats'\n    );\n\n    /**\n     * Class constructor\n     * This will start a new document\n     *\n     * @param array   $pageSize  Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero.\n     * @param boolean $isUnicode Whether text will be treated as Unicode or not.\n     * @param string  $fontcache The font cache folder\n     * @param string  $tmp       The temporary folder\n     */\n    function __construct($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '')\n    {\n        $this->isUnicode = $isUnicode;\n        $this->fontcache = $fontcache;\n        $this->tmp = ($tmp === '') ? sys_get_temp_dir() : $tmp;\n        $this->newDocument($pageSize);\n\n        $this->compressionReady = function_exists('gzcompress');\n\n        if (in_array('Windows-1252', mb_list_encodings())) {\n            self::$targetEncoding = 'Windows-1252';\n        }\n\n        // also initialize the font families that are known about already\n        $this->setFontFamily('init');\n        //  $this->fileIdentifier = md5('xxxxxxxx'.time());\n    }\n\n    /**\n     * Document object methods (internal use only)\n     *\n     * There is about one object method for each type of object in the pdf document\n     * Each function has the same call list ($id,$action,$options).\n     * $id = the object ID of the object, or what it is to be if it is being created\n     * $action = a string specifying the action to be performed, though ALL must support:\n     *           'new' - create the object with the id $id\n     *           'out' - produce the output for the pdf object\n     * $options = optional, a string or array containing the various parameters for the object\n     *\n     * These, in conjunction with the output function are the ONLY way for output to be produced\n     * within the pdf 'file'.\n     */\n\n    /**\n     * Destination object, used to specify the location for the user to jump to, presently on opening\n     */\n    protected function o_destination($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'destination', 'info' => array());\n                $tmp = '';\n                switch ($options['type']) {\n                    case 'XYZ':\n                    case 'FitR':\n                        $tmp = ' ' . $options['p3'] . $tmp;\n                    case 'FitH':\n                    case 'FitV':\n                    case 'FitBH':\n                    case 'FitBV':\n                        $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp;\n                    case 'Fit':\n                    case 'FitB':\n                        $tmp = $options['type'] . $tmp;\n                        $this->objects[$id]['info']['string'] = $tmp;\n                        $this->objects[$id]['info']['page'] = $options['page'];\n                }\n                break;\n\n            case 'out':\n                $tmp = $o['info'];\n                $res = \"\\n$id 0 obj\\n\" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . \"]\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * set the viewer preferences\n     */\n    protected function o_viewerPreferences($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'viewerPreferences', 'info' => array());\n                break;\n\n            case 'add':\n                foreach ($options as $k => $v) {\n                    switch ($k) {\n                        case 'HideToolbar':\n                        case 'HideMenubar':\n                        case 'HideWindowUI':\n                        case 'FitWindow':\n                        case 'CenterWindow':\n                        case 'NonFullScreenPageMode':\n                        case 'Direction':\n                            $o['info'][$k] = $v;\n                            break;\n                    }\n                }\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< \";\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n                $res .= \"\\n>>\\n\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * define the document catalog, the overall controller for the document\n     */\n    protected function o_catalog($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'catalog', 'info' => array());\n                $this->catalogId = $id;\n                break;\n\n            case 'outlines':\n            case 'pages':\n            case 'openHere':\n            case 'javascript':\n                $o['info'][$action] = $options;\n                break;\n\n            case 'viewerPreferences':\n                if (!isset($o['info']['viewerPreferences'])) {\n                    $this->numObj++;\n                    $this->o_viewerPreferences($this->numObj, 'new');\n                    $o['info']['viewerPreferences'] = $this->numObj;\n                }\n\n                $vp = $o['info']['viewerPreferences'];\n                $this->o_viewerPreferences($vp, 'add', $options);\n\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Catalog\";\n\n                foreach ($o['info'] as $k => $v) {\n                    switch ($k) {\n                        case 'outlines':\n                            $res .= \"\\n/Outlines $v 0 R\";\n                            break;\n\n                        case 'pages':\n                            $res .= \"\\n/Pages $v 0 R\";\n                            break;\n\n                        case 'viewerPreferences':\n                            $res .= \"\\n/ViewerPreferences $v 0 R\";\n                            break;\n\n                        case 'openHere':\n                            $res .= \"\\n/OpenAction $v 0 R\";\n                            break;\n\n                        case 'javascript':\n                            $res .= \"\\n/Names <</JavaScript $v 0 R>>\";\n                            break;\n                    }\n                }\n\n                $res .= \" >>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * object which is a parent to the pages in the document\n     */\n    protected function o_pages($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'pages', 'info' => array());\n                $this->o_catalog($this->catalogId, 'pages', $id);\n                break;\n\n            case 'page':\n                if (!is_array($options)) {\n                    // then it will just be the id of the new page\n                    $o['info']['pages'][] = $options;\n                } else {\n                    // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative\n                    // and pos is either 'before' or 'after', saying where this page will fit.\n                    if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) {\n                        $i = array_search($options['rid'], $o['info']['pages']);\n                        if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) {\n\n                            // then there is a match\n                            // make a space\n                            switch ($options['pos']) {\n                                case 'before':\n                                    $k = $i;\n                                    break;\n\n                                case 'after':\n                                    $k = $i + 1;\n                                    break;\n\n                                default:\n                                    $k = -1;\n                                    break;\n                            }\n\n                            if ($k >= 0) {\n                                for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) {\n                                    $o['info']['pages'][$j + 1] = $o['info']['pages'][$j];\n                                }\n\n                                $o['info']['pages'][$k] = $options['id'];\n                            }\n                        }\n                    }\n                }\n                break;\n\n            case 'procset':\n                $o['info']['procset'] = $options;\n                break;\n\n            case 'mediaBox':\n                $o['info']['mediaBox'] = $options;\n                // which should be an array of 4 numbers\n                $this->currentPageSize = array('width' => $options[2], 'height' => $options[3]);\n                break;\n\n            case 'font':\n                $o['info']['fonts'][] = array('objNum' => $options['objNum'], 'fontNum' => $options['fontNum']);\n                break;\n\n            case 'extGState':\n                $o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']);\n                break;\n\n            case 'xObject':\n                $o['info']['xObjects'][] = array('objNum' => $options['objNum'], 'label' => $options['label']);\n                break;\n\n            case 'out':\n                if (count($o['info']['pages'])) {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Pages\\n/Kids [\";\n                    foreach ($o['info']['pages'] as $v) {\n                        $res .= \"$v 0 R\\n\";\n                    }\n\n                    $res .= \"]\\n/Count \" . count($this->objects[$id]['info']['pages']);\n\n                    if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) ||\n                        isset($o['info']['procset']) ||\n                        (isset($o['info']['extGStates']) && count($o['info']['extGStates']))\n                    ) {\n                        $res .= \"\\n/Resources <<\";\n\n                        if (isset($o['info']['procset'])) {\n                            $res .= \"\\n/ProcSet \" . $o['info']['procset'] . \" 0 R\";\n                        }\n\n                        if (isset($o['info']['fonts']) && count($o['info']['fonts'])) {\n                            $res .= \"\\n/Font << \";\n                            foreach ($o['info']['fonts'] as $finfo) {\n                                $res .= \"\\n/F\" . $finfo['fontNum'] . \" \" . $finfo['objNum'] . \" 0 R\";\n                            }\n                            $res .= \"\\n>>\";\n                        }\n\n                        if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) {\n                            $res .= \"\\n/XObject << \";\n                            foreach ($o['info']['xObjects'] as $finfo) {\n                                $res .= \"\\n/\" . $finfo['label'] . \" \" . $finfo['objNum'] . \" 0 R\";\n                            }\n                            $res .= \"\\n>>\";\n                        }\n\n                        if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) {\n                            $res .= \"\\n/ExtGState << \";\n                            foreach ($o['info']['extGStates'] as $gstate) {\n                                $res .= \"\\n/GS\" . $gstate['stateNum'] . \" \" . $gstate['objNum'] . \" 0 R\";\n                            }\n                            $res .= \"\\n>>\";\n                        }\n\n                        $res .= \"\\n>>\";\n                        if (isset($o['info']['mediaBox'])) {\n                            $tmp = $o['info']['mediaBox'];\n                            $res .= \"\\n/MediaBox [\" . sprintf(\n                                    '%.3F %.3F %.3F %.3F',\n                                    $tmp[0],\n                                    $tmp[1],\n                                    $tmp[2],\n                                    $tmp[3]\n                                ) . ']';\n                        }\n                    }\n\n                    $res .= \"\\n >>\\nendobj\";\n                } else {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Pages\\n/Count 0\\n>>\\nendobj\";\n                }\n\n                return $res;\n        }\n    }\n\n    /**\n     * define the outlines in the doc, empty for now\n     */\n    protected function o_outlines($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'outlines', 'info' => array('outlines' => array()));\n                $this->o_catalog($this->catalogId, 'outlines', $id);\n                break;\n\n            case 'outline':\n                $o['info']['outlines'][] = $options;\n                break;\n\n            case 'out':\n                if (count($o['info']['outlines'])) {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Outlines /Kids [\";\n                    foreach ($o['info']['outlines'] as $v) {\n                        $res .= \"$v 0 R \";\n                    }\n\n                    $res .= \"] /Count \" . count($o['info']['outlines']) . \" >>\\nendobj\";\n                } else {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Outlines /Count 0 >>\\nendobj\";\n                }\n\n                return $res;\n        }\n    }\n\n    /**\n     * an object to hold the font description\n     */\n    protected function o_font($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array(\n                    't'    => 'font',\n                    'info' => array(\n                        'name'         => $options['name'],\n                        'fontFileName' => $options['fontFileName'],\n                        'SubType'      => 'Type1'\n                    )\n                );\n                $fontNum = $this->numFonts;\n                $this->objects[$id]['info']['fontNum'] = $fontNum;\n\n                // deal with the encoding and the differences\n                if (isset($options['differences'])) {\n                    // then we'll need an encoding dictionary\n                    $this->numObj++;\n                    $this->o_fontEncoding($this->numObj, 'new', $options);\n                    $this->objects[$id]['info']['encodingDictionary'] = $this->numObj;\n                } else {\n                    if (isset($options['encoding'])) {\n                        // we can specify encoding here\n                        switch ($options['encoding']) {\n                            case 'WinAnsiEncoding':\n                            case 'MacRomanEncoding':\n                            case 'MacExpertEncoding':\n                                $this->objects[$id]['info']['encoding'] = $options['encoding'];\n                                break;\n\n                            case 'none':\n                                break;\n\n                            default:\n                                $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';\n                                break;\n                        }\n                    } else {\n                        $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';\n                    }\n                }\n\n                if ($this->fonts[$options['fontFileName']]['isUnicode']) {\n                    // For Unicode fonts, we need to incorporate font data into\n                    // sub-sections that are linked from the primary font section.\n                    // Look at o_fontGIDtoCID and o_fontDescendentCID functions\n                    // for more informaiton.\n                    //\n                    // All of this code is adapted from the excellent changes made to\n                    // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)\n\n                    $toUnicodeId = ++$this->numObj;\n                    $this->o_contents($toUnicodeId, 'new', 'raw');\n                    $this->objects[$id]['info']['toUnicode'] = $toUnicodeId;\n\n                    $stream = <<<EOT\n/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo\n<</Registry (Adobe)\n/Ordering (UCS)\n/Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000> <FFFF>\nendcodespacerange\n1 beginbfrange\n<0000> <FFFF> <0000>\nendbfrange\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend\nEOT;\n\n                    $res = \"<</Length \" . mb_strlen($stream, '8bit') . \" >>\\n\";\n                    $res .= \"stream\\n\" . $stream . \"endstream\";\n\n                    $this->objects[$toUnicodeId]['c'] = $res;\n\n                    $cidFontId = ++$this->numObj;\n                    $this->o_fontDescendentCID($cidFontId, 'new', $options);\n                    $this->objects[$id]['info']['cidFont'] = $cidFontId;\n                }\n\n                // also tell the pages node about the new font\n                $this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id));\n                break;\n\n            case 'add':\n                foreach ($options as $k => $v) {\n                    switch ($k) {\n                        case 'BaseFont':\n                            $o['info']['name'] = $v;\n                            break;\n                        case 'FirstChar':\n                        case 'LastChar':\n                        case 'Widths':\n                        case 'FontDescriptor':\n                        case 'SubType':\n                            $this->addMessage('o_font ' . $k . \" : \" . $v);\n                            $o['info'][$k] = $v;\n                            break;\n                    }\n                }\n\n                // pass values down to descendent font\n                if (isset($o['info']['cidFont'])) {\n                    $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $options);\n                }\n                break;\n\n            case 'out':\n                if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) {\n                    // For Unicode fonts, we need to incorporate font data into\n                    // sub-sections that are linked from the primary font section.\n                    // Look at o_fontGIDtoCID and o_fontDescendentCID functions\n                    // for more informaiton.\n                    //\n                    // All of this code is adapted from the excellent changes made to\n                    // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)\n\n                    $res = \"\\n$id 0 obj\\n<</Type /Font\\n/Subtype /Type0\\n\";\n                    $res .= \"/BaseFont /\" . $o['info']['name'] . \"\\n\";\n\n                    // The horizontal identity mapping for 2-byte CIDs; may be used\n                    // with CIDFonts using any Registry, Ordering, and Supplement values.\n                    $res .= \"/Encoding /Identity-H\\n\";\n                    $res .= \"/DescendantFonts [\" . $o['info']['cidFont'] . \" 0 R]\\n\";\n                    $res .= \"/ToUnicode \" . $o['info']['toUnicode'] . \" 0 R\\n\";\n                    $res .= \">>\\n\";\n                    $res .= \"endobj\";\n                } else {\n                    $res = \"\\n$id 0 obj\\n<< /Type /Font\\n/Subtype /\" . $o['info']['SubType'] . \"\\n\";\n                    $res .= \"/Name /F\" . $o['info']['fontNum'] . \"\\n\";\n                    $res .= \"/BaseFont /\" . $o['info']['name'] . \"\\n\";\n\n                    if (isset($o['info']['encodingDictionary'])) {\n                        // then place a reference to the dictionary\n                        $res .= \"/Encoding \" . $o['info']['encodingDictionary'] . \" 0 R\\n\";\n                    } else {\n                        if (isset($o['info']['encoding'])) {\n                            // use the specified encoding\n                            $res .= \"/Encoding /\" . $o['info']['encoding'] . \"\\n\";\n                        }\n                    }\n\n                    if (isset($o['info']['FirstChar'])) {\n                        $res .= \"/FirstChar \" . $o['info']['FirstChar'] . \"\\n\";\n                    }\n\n                    if (isset($o['info']['LastChar'])) {\n                        $res .= \"/LastChar \" . $o['info']['LastChar'] . \"\\n\";\n                    }\n\n                    if (isset($o['info']['Widths'])) {\n                        $res .= \"/Widths \" . $o['info']['Widths'] . \" 0 R\\n\";\n                    }\n\n                    if (isset($o['info']['FontDescriptor'])) {\n                        $res .= \"/FontDescriptor \" . $o['info']['FontDescriptor'] . \" 0 R\\n\";\n                    }\n\n                    $res .= \">>\\n\";\n                    $res .= \"endobj\";\n                }\n\n                return $res;\n        }\n    }\n\n    /**\n     * a font descriptor, needed for including additional fonts\n     */\n    protected function o_fontDescriptor($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'fontDescriptor', 'info' => $options);\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /FontDescriptor\\n\";\n                foreach ($o['info'] as $label => $value) {\n                    switch ($label) {\n                        case 'Ascent':\n                        case 'CapHeight':\n                        case 'Descent':\n                        case 'Flags':\n                        case 'ItalicAngle':\n                        case 'StemV':\n                        case 'AvgWidth':\n                        case 'Leading':\n                        case 'MaxWidth':\n                        case 'MissingWidth':\n                        case 'StemH':\n                        case 'XHeight':\n                        case 'CharSet':\n                            if (mb_strlen($value, '8bit')) {\n                                $res .= \"/$label $value\\n\";\n                            }\n\n                            break;\n                        case 'FontFile':\n                        case 'FontFile2':\n                        case 'FontFile3':\n                            $res .= \"/$label $value 0 R\\n\";\n                            break;\n\n                        case 'FontBBox':\n                            $res .= \"/$label [$value[0] $value[1] $value[2] $value[3]]\\n\";\n                            break;\n\n                        case 'FontName':\n                            $res .= \"/$label /$value\\n\";\n                            break;\n                    }\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * the font encoding\n     */\n    protected function o_fontEncoding($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                // the options array should contain 'differences' and maybe 'encoding'\n                $this->objects[$id] = array('t' => 'fontEncoding', 'info' => $options);\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Encoding\\n\";\n                if (!isset($o['info']['encoding'])) {\n                    $o['info']['encoding'] = 'WinAnsiEncoding';\n                }\n\n                if ($o['info']['encoding'] !== 'none') {\n                    $res .= \"/BaseEncoding /\" . $o['info']['encoding'] . \"\\n\";\n                }\n\n                $res .= \"/Differences \\n[\";\n\n                $onum = -100;\n\n                foreach ($o['info']['differences'] as $num => $label) {\n                    if ($num != $onum + 1) {\n                        // we cannot make use of consecutive numbering\n                        $res .= \"\\n$num /$label\";\n                    } else {\n                        $res .= \" /$label\";\n                    }\n\n                    $onum = $num;\n                }\n\n                $res .= \"\\n]\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * a descendent cid font, needed for unicode fonts\n     */\n    protected function o_fontDescendentCID($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'fontDescendentCID', 'info' => $options);\n\n                // we need a CID system info section\n                $cidSystemInfoId = ++$this->numObj;\n                $this->o_contents($cidSystemInfoId, 'new', 'raw');\n                $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId;\n                $res = \"<</Registry (Adobe)\\n\"; // A string identifying an issuer of character collections\n                $res .= \"/Ordering (UCS)\\n\"; // A string that uniquely names a character collection issued by a specific registry\n                $res .= \"/Supplement 0\\n\"; // The supplement number of the character collection.\n                $res .= \">>\";\n                $this->objects[$cidSystemInfoId]['c'] = $res;\n\n                // and a CID to GID map\n                $cidToGidMapId = ++$this->numObj;\n                $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options);\n                $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId;\n                break;\n\n            case 'add':\n                foreach ($options as $k => $v) {\n                    switch ($k) {\n                        case 'BaseFont':\n                            $o['info']['name'] = $v;\n                            break;\n\n                        case 'FirstChar':\n                        case 'LastChar':\n                        case 'MissingWidth':\n                        case 'FontDescriptor':\n                        case 'SubType':\n                            $this->addMessage(\"o_fontDescendentCID $k : $v\");\n                            $o['info'][$k] = $v;\n                            break;\n                    }\n                }\n\n                // pass values down to cid to gid map\n                $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options);\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n\";\n                $res .= \"<</Type /Font\\n\";\n                $res .= \"/Subtype /CIDFontType2\\n\";\n                $res .= \"/BaseFont /\" . $o['info']['name'] . \"\\n\";\n                $res .= \"/CIDSystemInfo \" . $o['info']['cidSystemInfo'] . \" 0 R\\n\";\n//      if (isset($o['info']['FirstChar'])) {\n//        $res.= \"/FirstChar \".$o['info']['FirstChar'].\"\\n\";\n//      }\n\n//      if (isset($o['info']['LastChar'])) {\n//        $res.= \"/LastChar \".$o['info']['LastChar'].\"\\n\";\n//      }\n                if (isset($o['info']['FontDescriptor'])) {\n                    $res .= \"/FontDescriptor \" . $o['info']['FontDescriptor'] . \" 0 R\\n\";\n                }\n\n                if (isset($o['info']['MissingWidth'])) {\n                    $res .= \"/DW \" . $o['info']['MissingWidth'] . \"\\n\";\n                }\n\n                if (isset($o['info']['fontFileName']) && isset($this->fonts[$o['info']['fontFileName']]['CIDWidths'])) {\n                    $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths'];\n                    $w = '';\n                    foreach ($cid_widths as $cid => $width) {\n                        $w .= \"$cid [$width] \";\n                    }\n                    $res .= \"/W [$w]\\n\";\n                }\n\n                $res .= \"/CIDToGIDMap \" . $o['info']['cidToGidMap'] . \" 0 R\\n\";\n                $res .= \">>\\n\";\n                $res .= \"endobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * a font glyph to character map, needed for unicode fonts\n     */\n    protected function o_fontGIDtoCIDMap($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'fontGIDtoCIDMap', 'info' => $options);\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n\";\n                $fontFileName = $o['info']['fontFileName'];\n                $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']);\n\n                $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) &&\n                    $this->fonts[$fontFileName]['CIDtoGID_Compressed'];\n\n                if (!$compressed && isset($o['raw'])) {\n                    $res .= $tmp;\n                } else {\n                    $res .= \"<<\";\n\n                    if (!$compressed && $this->compressionReady && $this->options['compression']) {\n                        // then implement ZLIB based compression on this content stream\n                        $compressed = true;\n                        $tmp = gzcompress($tmp, 6);\n                    }\n                    if ($compressed) {\n                        $res .= \"\\n/Filter /FlateDecode\";\n                    }\n\n                    $res .= \"\\n/Length \" . mb_strlen($tmp, '8bit') . \">>\\nstream\\n$tmp\\nendstream\";\n                }\n\n                $res .= \"\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * the document procset, solves some problems with printing to old PS printers\n     */\n    protected function o_procset($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'procset', 'info' => array('PDF' => 1, 'Text' => 1));\n                $this->o_pages($this->currentNode, 'procset', $id);\n                $this->procsetObjectId = $id;\n                break;\n\n            case 'add':\n                // this is to add new items to the procset list, despite the fact that this is considered\n                // obselete, the items are required for printing to some postscript printers\n                switch ($options) {\n                    case 'ImageB':\n                    case 'ImageC':\n                    case 'ImageI':\n                        $o['info'][$options] = 1;\n                        break;\n                }\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n[\";\n                foreach ($o['info'] as $label => $val) {\n                    $res .= \"/$label \";\n                }\n                $res .= \"]\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * define the document information\n     */\n    protected function o_info($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->infoObject = $id;\n                $date = 'D:' . @date('Ymd');\n                $this->objects[$id] = array(\n                    't'    => 'info',\n                    'info' => array(\n                        'Creator'      => 'R and OS php pdf writer, http://www.ros.co.nz',\n                        'CreationDate' => $date\n                    )\n                );\n                break;\n            case 'Title':\n            case 'Author':\n            case 'Subject':\n            case 'Keywords':\n            case 'Creator':\n            case 'Producer':\n            case 'CreationDate':\n            case 'ModDate':\n            case 'Trapped':\n                $o['info'][$action] = $options;\n                break;\n\n            case 'out':\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                }\n\n                $res = \"\\n$id 0 obj\\n<<\\n\";\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"/$k (\";\n\n                    if ($this->encrypted) {\n                        $v = $this->ARC4($v);\n                    } // dates must be outputted as-is, without Unicode transformations\n                    elseif (!in_array($k, array('CreationDate', 'ModDate'))) {\n                        $v = $this->filterText($v);\n                    }\n\n                    $res .= $v;\n                    $res .= \")\\n\";\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * an action object, used to link to URLS initially\n     */\n    protected function o_action($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                if (is_array($options)) {\n                    $this->objects[$id] = array('t' => 'action', 'info' => $options, 'type' => $options['type']);\n                } else {\n                    // then assume a URI action\n                    $this->objects[$id] = array('t' => 'action', 'info' => $options, 'type' => 'URI');\n                }\n                break;\n\n            case 'out':\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                }\n\n                $res = \"\\n$id 0 obj\\n<< /Type /Action\";\n                switch ($o['type']) {\n                    case 'ilink':\n                        if (!isset($this->destinations[(string)$o['info']['label']])) {\n                            break;\n                        }\n\n                        // there will be an 'label' setting, this is the name of the destination\n                        $res .= \"\\n/S /GoTo\\n/D \" . $this->destinations[(string)$o['info']['label']] . \" 0 R\";\n                        break;\n\n                    case 'URI':\n                        $res .= \"\\n/S /URI\\n/URI (\";\n                        if ($this->encrypted) {\n                            $res .= $this->filterText($this->ARC4($o['info']), true, false);\n                        } else {\n                            $res .= $this->filterText($o['info'], true, false);\n                        }\n\n                        $res .= \")\";\n                        break;\n                }\n\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * an annotation object, this will add an annotation to the current page.\n     * initially will support just link annotations\n     */\n    protected function o_annotation($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                // add the annotation to the current page\n                $pageId = $this->currentPage;\n                $this->o_page($pageId, 'annot', $id);\n\n                // and add the action object which is going to be required\n                switch ($options['type']) {\n                    case 'link':\n                        $this->objects[$id] = array('t' => 'annotation', 'info' => $options);\n                        $this->numObj++;\n                        $this->o_action($this->numObj, 'new', $options['url']);\n                        $this->objects[$id]['info']['actionId'] = $this->numObj;\n                        break;\n\n                    case 'ilink':\n                        // this is to a named internal link\n                        $label = $options['label'];\n                        $this->objects[$id] = array('t' => 'annotation', 'info' => $options);\n                        $this->numObj++;\n                        $this->o_action($this->numObj, 'new', array('type' => 'ilink', 'label' => $label));\n                        $this->objects[$id]['info']['actionId'] = $this->numObj;\n                        break;\n                }\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Annot\";\n                switch ($o['info']['type']) {\n                    case 'link':\n                    case 'ilink':\n                        $res .= \"\\n/Subtype /Link\";\n                        break;\n                }\n                $res .= \"\\n/A \" . $o['info']['actionId'] . \" 0 R\";\n                $res .= \"\\n/Border [0 0 0]\";\n                $res .= \"\\n/H /I\";\n                $res .= \"\\n/Rect [ \";\n\n                foreach ($o['info']['rect'] as $v) {\n                    $res .= sprintf(\"%.4F \", $v);\n                }\n\n                $res .= \"]\";\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * a page object, it also creates a contents object to hold its contents\n     */\n    protected function o_page($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->numPages++;\n                $this->objects[$id] = array(\n                    't'    => 'page',\n                    'info' => array(\n                        'parent'  => $this->currentNode,\n                        'pageNum' => $this->numPages\n                    )\n                );\n\n                if (is_array($options)) {\n                    // then this must be a page insertion, array should contain 'rid','pos'=[before|after]\n                    $options['id'] = $id;\n                    $this->o_pages($this->currentNode, 'page', $options);\n                } else {\n                    $this->o_pages($this->currentNode, 'page', $id);\n                }\n\n                $this->currentPage = $id;\n                //make a contents object to go with this page\n                $this->numObj++;\n                $this->o_contents($this->numObj, 'new', $id);\n                $this->currentContents = $this->numObj;\n                $this->objects[$id]['info']['contents'] = array();\n                $this->objects[$id]['info']['contents'][] = $this->numObj;\n\n                $match = ($this->numPages % 2 ? 'odd' : 'even');\n                foreach ($this->addLooseObjects as $oId => $target) {\n                    if ($target === 'all' || $match === $target) {\n                        $this->objects[$id]['info']['contents'][] = $oId;\n                    }\n                }\n                break;\n\n            case 'content':\n                $o['info']['contents'][] = $options;\n                break;\n\n            case 'annot':\n                // add an annotation to this page\n                if (!isset($o['info']['annot'])) {\n                    $o['info']['annot'] = array();\n                }\n\n                // $options should contain the id of the annotation dictionary\n                $o['info']['annot'][] = $options;\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< /Type /Page\";\n                $res .= \"\\n/Parent \" . $o['info']['parent'] . \" 0 R\";\n\n                if (isset($o['info']['annot'])) {\n                    $res .= \"\\n/Annots [\";\n                    foreach ($o['info']['annot'] as $aId) {\n                        $res .= \" $aId 0 R\";\n                    }\n                    $res .= \" ]\";\n                }\n\n                $count = count($o['info']['contents']);\n                if ($count == 1) {\n                    $res .= \"\\n/Contents \" . $o['info']['contents'][0] . \" 0 R\";\n                } else {\n                    if ($count > 1) {\n                        $res .= \"\\n/Contents [\\n\";\n\n                        // reverse the page contents so added objects are below normal content\n                        //foreach (array_reverse($o['info']['contents']) as $cId) {\n                        // Back to normal now that I've got transparency working --Benj\n                        foreach ($o['info']['contents'] as $cId) {\n                            $res .= \"$cId 0 R\\n\";\n                        }\n                        $res .= \"]\";\n                    }\n                }\n\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * the contents objects hold all of the content which appears on pages\n     */\n    protected function o_contents($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array('t' => 'contents', 'c' => '', 'info' => array());\n                if (mb_strlen($options, '8bit') && intval($options)) {\n                    // then this contents is the primary for a page\n                    $this->objects[$id]['onPage'] = $options;\n                } else {\n                    if ($options === 'raw') {\n                        // then this page contains some other type of system object\n                        $this->objects[$id]['raw'] = 1;\n                    }\n                }\n                break;\n\n            case 'add':\n                // add more options to the decleration\n                foreach ($options as $k => $v) {\n                    $o['info'][$k] = $v;\n                }\n\n            case 'out':\n                $tmp = $o['c'];\n                $res = \"\\n$id 0 obj\\n\";\n\n                if (isset($this->objects[$id]['raw'])) {\n                    $res .= $tmp;\n                } else {\n                    $res .= \"<<\";\n                    if ($this->compressionReady && $this->options['compression']) {\n                        // then implement ZLIB based compression on this content stream\n                        $res .= \" /Filter /FlateDecode\";\n                        $tmp = gzcompress($tmp, 6);\n                    }\n\n                    if ($this->encrypted) {\n                        $this->encryptInit($id);\n                        $tmp = $this->ARC4($tmp);\n                    }\n\n                    foreach ($o['info'] as $k => $v) {\n                        $res .= \"\\n/$k $v\";\n                    }\n\n                    $res .= \"\\n/Length \" . mb_strlen($tmp, '8bit') . \" >>\\nstream\\n$tmp\\nendstream\";\n                }\n\n                $res .= \"\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    protected function o_embedjs($id, $action)\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array(\n                    't'    => 'embedjs',\n                    'info' => array(\n                        'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]'\n                    )\n                );\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< \";\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    protected function o_javascript($id, $action, $code = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                $this->objects[$id] = array(\n                    't'    => 'javascript',\n                    'info' => array(\n                        'S'  => '/JavaScript',\n                        'JS' => '(' . $this->filterText($code) . ')',\n                    )\n                );\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<< \";\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * an image object, will be an XObject in the document, includes description and data\n     */\n    protected function o_image($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                // make the new object\n                $this->objects[$id] = array('t' => 'image', 'data' => &$options['data'], 'info' => array());\n\n                $info =& $this->objects[$id]['info'];\n\n                $info['Type'] = '/XObject';\n                $info['Subtype'] = '/Image';\n                $info['Width'] = $options['iw'];\n                $info['Height'] = $options['ih'];\n\n                if (isset($options['masked']) && $options['masked']) {\n                    $info['SMask'] = ($this->numObj - 1) . ' 0 R';\n                }\n\n                if (!isset($options['type']) || $options['type'] === 'jpg') {\n                    if (!isset($options['channels'])) {\n                        $options['channels'] = 3;\n                    }\n\n                    switch ($options['channels']) {\n                        case  1:\n                            $info['ColorSpace'] = '/DeviceGray';\n                            break;\n                        case  4:\n                            $info['ColorSpace'] = '/DeviceCMYK';\n                            break;\n                        default:\n                            $info['ColorSpace'] = '/DeviceRGB';\n                            break;\n                    }\n\n                    if ($info['ColorSpace'] === '/DeviceCMYK') {\n                        $info['Decode'] = '[1 0 1 0 1 0 1 0]';\n                    }\n\n                    $info['Filter'] = '/DCTDecode';\n                    $info['BitsPerComponent'] = 8;\n                } else {\n                    if ($options['type'] === 'png') {\n                        $info['Filter'] = '/FlateDecode';\n                        $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>';\n\n                        if ($options['isMask']) {\n                            $info['ColorSpace'] = '/DeviceGray';\n                        } else {\n                            if (mb_strlen($options['pdata'], '8bit')) {\n                                $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' ';\n                                $this->numObj++;\n                                $this->o_contents($this->numObj, 'new');\n                                $this->objects[$this->numObj]['c'] = $options['pdata'];\n                                $tmp .= $this->numObj . ' 0 R';\n                                $tmp .= ' ]';\n                                $info['ColorSpace'] = $tmp;\n\n                                if (isset($options['transparency'])) {\n                                    $transparency = $options['transparency'];\n                                    switch ($transparency['type']) {\n                                        case 'indexed':\n                                            $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n\n                                        case 'color-key':\n                                            $tmp = ' [ ' .\n                                                $transparency['r'] . ' ' . $transparency['r'] .\n                                                $transparency['g'] . ' ' . $transparency['g'] .\n                                                $transparency['b'] . ' ' . $transparency['b'] .\n                                                ' ] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n                                    }\n                                }\n                            } else {\n                                if (isset($options['transparency'])) {\n                                    $transparency = $options['transparency'];\n\n                                    switch ($transparency['type']) {\n                                        case 'indexed':\n                                            $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n\n                                        case 'color-key':\n                                            $tmp = ' [ ' .\n                                                $transparency['r'] . ' ' . $transparency['r'] . ' ' .\n                                                $transparency['g'] . ' ' . $transparency['g'] . ' ' .\n                                                $transparency['b'] . ' ' . $transparency['b'] .\n                                                ' ] ';\n                                            $info['Mask'] = $tmp;\n                                            break;\n                                    }\n                                }\n                                $info['ColorSpace'] = '/' . $options['color'];\n                            }\n                        }\n\n                        $info['BitsPerComponent'] = $options['bitsPerComponent'];\n                    }\n                }\n\n                // assign it a place in the named resource dictionary as an external object, according to\n                // the label passed in with it.\n                $this->o_pages($this->currentNode, 'xObject', array('label' => $options['label'], 'objNum' => $id));\n\n                // also make sure that we have the right procset object for it.\n                $this->o_procset($this->procsetObjectId, 'add', 'ImageC');\n                break;\n\n            case 'out':\n                $tmp = &$o['data'];\n                $res = \"\\n$id 0 obj\\n<<\";\n\n                foreach ($o['info'] as $k => $v) {\n                    $res .= \"\\n/$k $v\";\n                }\n\n                if ($this->encrypted) {\n                    $this->encryptInit($id);\n                    $tmp = $this->ARC4($tmp);\n                }\n\n                $res .= \"\\n/Length \" . mb_strlen($tmp, '8bit') . \">>\\nstream\\n$tmp\\nendstream\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * graphics state object\n     */\n    protected function o_extGState($id, $action, $options = \"\")\n    {\n        static $valid_params = array(\n            \"LW\",\n            \"LC\",\n            \"LC\",\n            \"LJ\",\n            \"ML\",\n            \"D\",\n            \"RI\",\n            \"OP\",\n            \"op\",\n            \"OPM\",\n            \"Font\",\n            \"BG\",\n            \"BG2\",\n            \"UCR\",\n            \"TR\",\n            \"TR2\",\n            \"HT\",\n            \"FL\",\n            \"SM\",\n            \"SA\",\n            \"BM\",\n            \"SMask\",\n            \"CA\",\n            \"ca\",\n            \"AIS\",\n            \"TK\"\n        );\n\n        if ($action !== \"new\") {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case \"new\":\n                $this->objects[$id] = array('t' => 'extGState', 'info' => $options);\n\n                // Tell the pages about the new resource\n                $this->numStates++;\n                $this->o_pages($this->currentNode, 'extGState', array(\"objNum\" => $id, \"stateNum\" => $this->numStates));\n                break;\n\n            case \"out\":\n                $res = \"\\n$id 0 obj\\n<< /Type /ExtGState\\n\";\n\n                foreach ($o[\"info\"] as $k => $v) {\n                    if (!in_array($k, $valid_params)) {\n                        continue;\n                    }\n                    $res .= \"/$k $v\\n\";\n                }\n\n                $res .= \">>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * encryption object.\n     */\n    protected function o_encryption($id, $action, $options = '')\n    {\n        if ($action !== 'new') {\n            $o = &$this->objects[$id];\n        }\n\n        switch ($action) {\n            case 'new':\n                // make the new object\n                $this->objects[$id] = array('t' => 'encryption', 'info' => $options);\n                $this->arc4_objnum = $id;\n\n                // figure out the additional paramaters required\n                $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41)\n                    . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08)\n                    . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80)\n                    . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A);\n\n                $len = mb_strlen($options['owner'], '8bit');\n\n                if ($len > 32) {\n                    $owner = substr($options['owner'], 0, 32);\n                } else {\n                    if ($len < 32) {\n                        $owner = $options['owner'] . substr($pad, 0, 32 - $len);\n                    } else {\n                        $owner = $options['owner'];\n                    }\n                }\n\n                $len = mb_strlen($options['user'], '8bit');\n                if ($len > 32) {\n                    $user = substr($options['user'], 0, 32);\n                } else {\n                    if ($len < 32) {\n                        $user = $options['user'] . substr($pad, 0, 32 - $len);\n                    } else {\n                        $user = $options['user'];\n                    }\n                }\n\n                $tmp = $this->md5_16($owner);\n                $okey = substr($tmp, 0, 5);\n                $this->ARC4_init($okey);\n                $ovalue = $this->ARC4($user);\n                $this->objects[$id]['info']['O'] = $ovalue;\n\n                // now make the u value, phew.\n                $tmp = $this->md5_16(\n                    $user . $ovalue . chr($options['p']) . chr(255) . chr(255) . chr(255) . $this->fileIdentifier\n                );\n\n                $ukey = substr($tmp, 0, 5);\n                $this->ARC4_init($ukey);\n                $this->encryptionKey = $ukey;\n                $this->encrypted = true;\n                $uvalue = $this->ARC4($pad);\n                $this->objects[$id]['info']['U'] = $uvalue;\n                $this->encryptionKey = $ukey;\n                // initialize the arc4 array\n                break;\n\n            case 'out':\n                $res = \"\\n$id 0 obj\\n<<\";\n                $res .= \"\\n/Filter /Standard\";\n                $res .= \"\\n/V 1\";\n                $res .= \"\\n/R 2\";\n                $res .= \"\\n/O (\" . $this->filterText($o['info']['O'], true, false) . ')';\n                $res .= \"\\n/U (\" . $this->filterText($o['info']['U'], true, false) . ')';\n                // and the p-value needs to be converted to account for the twos-complement approach\n                $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1;\n                $res .= \"\\n/P \" . ($o['info']['p']);\n                $res .= \"\\n>>\\nendobj\";\n\n                return $res;\n        }\n    }\n\n    /**\n     * ARC4 functions\n     * A series of function to implement ARC4 encoding in PHP\n     */\n\n    /**\n     * calculate the 16 byte version of the 128 bit md5 digest of the string\n     */\n    function md5_16($string)\n    {\n        $tmp = md5($string);\n        $out = '';\n        for ($i = 0; $i <= 30; $i = $i + 2) {\n            $out .= chr(hexdec(substr($tmp, $i, 2)));\n        }\n\n        return $out;\n    }\n\n    /**\n     * initialize the encryption for processing a particular object\n     */\n    function encryptInit($id)\n    {\n        $tmp = $this->encryptionKey;\n        $hex = dechex($id);\n        if (mb_strlen($hex, '8bit') < 6) {\n            $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex;\n        }\n        $tmp .= chr(hexdec(substr($hex, 4, 2))) . chr(hexdec(substr($hex, 2, 2))) . chr(\n                hexdec(substr($hex, 0, 2))\n            ) . chr(0) . chr(0);\n        $key = $this->md5_16($tmp);\n        $this->ARC4_init(substr($key, 0, 10));\n    }\n\n    /**\n     * initialize the ARC4 encryption\n     */\n    function ARC4_init($key = '')\n    {\n        $this->arc4 = '';\n\n        // setup the control array\n        if (mb_strlen($key, '8bit') == 0) {\n            return;\n        }\n\n        $k = '';\n        while (mb_strlen($k, '8bit') < 256) {\n            $k .= $key;\n        }\n\n        $k = substr($k, 0, 256);\n        for ($i = 0; $i < 256; $i++) {\n            $this->arc4 .= chr($i);\n        }\n\n        $j = 0;\n\n        for ($i = 0; $i < 256; $i++) {\n            $t = $this->arc4[$i];\n            $j = ($j + ord($t) + ord($k[$i])) % 256;\n            $this->arc4[$i] = $this->arc4[$j];\n            $this->arc4[$j] = $t;\n        }\n    }\n\n    /**\n     * ARC4 encrypt a text string\n     */\n    function ARC4($text)\n    {\n        $len = mb_strlen($text, '8bit');\n        $a = 0;\n        $b = 0;\n        $c = $this->arc4;\n        $out = '';\n        for ($i = 0; $i < $len; $i++) {\n            $a = ($a + 1) % 256;\n            $t = $c[$a];\n            $b = ($b + ord($t)) % 256;\n            $c[$a] = $c[$b];\n            $c[$b] = $t;\n            $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]);\n            $out .= chr(ord($text[$i]) ^ $k);\n        }\n\n        return $out;\n    }\n\n    /**\n     * functions which can be called to adjust or add to the document\n     */\n\n    /**\n     * add a link in the document to an external URL\n     */\n    function addLink($url, $x0, $y0, $x1, $y1)\n    {\n        $this->numObj++;\n        $info = array('type' => 'link', 'url' => $url, 'rect' => array($x0, $y0, $x1, $y1));\n        $this->o_annotation($this->numObj, 'new', $info);\n    }\n\n    /**\n     * add a link in the document to an internal destination (ie. within the document)\n     */\n    function addInternalLink($label, $x0, $y0, $x1, $y1)\n    {\n        $this->numObj++;\n        $info = array('type' => 'ilink', 'label' => $label, 'rect' => array($x0, $y0, $x1, $y1));\n        $this->o_annotation($this->numObj, 'new', $info);\n    }\n\n    /**\n     * set the encryption of the document\n     * can be used to turn it on and/or set the passwords which it will have.\n     * also the functions that the user will have are set here, such as print, modify, add\n     */\n    function setEncryption($userPass = '', $ownerPass = '', $pc = array())\n    {\n        $p = bindec(\"11000000\");\n\n        $options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32);\n\n        foreach ($pc as $k => $v) {\n            if ($v && isset($options[$k])) {\n                $p += $options[$k];\n            } else {\n                if (isset($options[$v])) {\n                    $p += $options[$v];\n                }\n            }\n        }\n\n        // implement encryption on the document\n        if ($this->arc4_objnum == 0) {\n            // then the block does not exist already, add it.\n            $this->numObj++;\n            if (mb_strlen($ownerPass) == 0) {\n                $ownerPass = $userPass;\n            }\n\n            $this->o_encryption($this->numObj, 'new', array('user' => $userPass, 'owner' => $ownerPass, 'p' => $p));\n        }\n    }\n\n    /**\n     * should be used for internal checks, not implemented as yet\n     */\n    function checkAllHere()\n    {\n    }\n\n    /**\n     * return the pdf stream as a string returned from the function\n     */\n    function output($debug = false)\n    {\n        if ($debug) {\n            // turn compression off\n            $this->options['compression'] = false;\n        }\n\n        if ($this->javascript) {\n            $this->numObj++;\n\n            $js_id = $this->numObj;\n            $this->o_embedjs($js_id, 'new');\n            $this->o_javascript(++$this->numObj, 'new', $this->javascript);\n\n            $id = $this->catalogId;\n\n            $this->o_catalog($id, 'javascript', $js_id);\n        }\n\n        if ($this->arc4_objnum) {\n            $this->ARC4_init($this->encryptionKey);\n        }\n\n        $this->checkAllHere();\n\n        $xref = array();\n        $content = '%PDF-1.3';\n        $pos = mb_strlen($content, '8bit');\n\n        foreach ($this->objects as $k => $v) {\n            $tmp = 'o_' . $v['t'];\n            $cont = $this->$tmp($k, 'out');\n            $content .= $cont;\n            $xref[] = $pos;\n            $pos += mb_strlen($cont, '8bit');\n        }\n\n        $content .= \"\\nxref\\n0 \" . (count($xref) + 1) . \"\\n0000000000 65535 f \\n\";\n\n        foreach ($xref as $p) {\n            $content .= str_pad($p, 10, \"0\", STR_PAD_LEFT) . \" 00000 n \\n\";\n        }\n\n        $content .= \"trailer\\n<<\\n/Size \" . (count($xref) + 1) . \"\\n/Root 1 0 R\\n/Info $this->infoObject 0 R\\n\";\n\n        // if encryption has been applied to this document then add the marker for this dictionary\n        if ($this->arc4_objnum > 0) {\n            $content .= \"/Encrypt $this->arc4_objnum 0 R\\n\";\n        }\n\n        if (mb_strlen($this->fileIdentifier, '8bit')) {\n            $content .= \"/ID[<$this->fileIdentifier><$this->fileIdentifier>]\\n\";\n        }\n\n        // account for \\n added at start of xref table\n        $pos++;\n\n        $content .= \">>\\nstartxref\\n$pos\\n%%EOF\\n\";\n\n        return $content;\n    }\n\n    /**\n     * intialize a new document\n     * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum\n     * this function is called automatically by the constructor function\n     */\n    private function newDocument($pageSize = array(0, 0, 612, 792))\n    {\n        $this->numObj = 0;\n        $this->objects = array();\n\n        $this->numObj++;\n        $this->o_catalog($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_outlines($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_pages($this->numObj, 'new');\n\n        $this->o_pages($this->numObj, 'mediaBox', $pageSize);\n        $this->currentNode = 3;\n\n        $this->numObj++;\n        $this->o_procset($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_info($this->numObj, 'new');\n\n        $this->numObj++;\n        $this->o_page($this->numObj, 'new');\n\n        // need to store the first page id as there is no way to get it to the user during\n        // startup\n        $this->firstPageId = $this->currentContents;\n    }\n\n    /**\n     * open the font file and return a php structure containing it.\n     * first check if this one has been done before and saved in a form more suited to php\n     * note that if a php serialized version does not exist it will try and make one, but will\n     * require write access to the directory to do it... it is MUCH faster to have these serialized\n     * files.\n     */\n    private function openFont($font)\n    {\n        // assume that $font contains the path and file but not the extension\n        $pos = strrpos($font, '/');\n\n        if ($pos === false) {\n            $dir = './';\n            $name = $font;\n        } else {\n            $dir = substr($font, 0, $pos + 1);\n            $name = substr($font, $pos + 1);\n        }\n\n        $fontcache = $this->fontcache;\n        if ($fontcache == '') {\n            $fontcache = $dir;\n        }\n\n        //$name       filename without folder and extension of font metrics\n        //$dir      folder of font metrics\n        //$fontcache  folder of runtime created php serialized version of font metrics.\n        //            If this is not given, the same folder as the font metrics will be used.\n        //            Storing and reusing serialized versions improves speed much\n\n        $this->addMessage(\"openFont: $font - $name\");\n\n        if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) {\n            $metrics_name = \"$name.afm\";\n        } else {\n            $metrics_name = \"$name.ufm\";\n        }\n\n        $cache_name = \"$metrics_name.php\";\n        $this->addMessage(\"metrics: $metrics_name, cache: $cache_name\");\n\n        if (file_exists($fontcache . $cache_name)) {\n            $this->addMessage(\"openFont: php file exists $fontcache$cache_name\");\n            $this->fonts[$font] = require($fontcache . $cache_name);\n\n            if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) {\n                // if the font file is old, then clear it out and prepare for re-creation\n                $this->addMessage('openFont: clear out, make way for new version.');\n                $this->fonts[$font] = null;\n                unset($this->fonts[$font]);\n            }\n        } else {\n            $old_cache_name = \"php_$metrics_name\";\n            if (file_exists($fontcache . $old_cache_name)) {\n                $this->addMessage(\n                    \"openFont: php file doesn't exist $fontcache$cache_name, creating it from the old format\"\n                );\n                $old_cache = file_get_contents($fontcache . $old_cache_name);\n                file_put_contents($fontcache . $cache_name, '<?php return ' . $old_cache . ';');\n\n                return $this->openFont($font);\n            }\n        }\n\n        if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) {\n            // then rebuild the php_<font>.afm file from the <font>.afm file\n            $this->addMessage(\"openFont: build php file from $dir$metrics_name\");\n            $data = array();\n\n            // 20 => 'space'\n            $data['codeToName'] = array();\n\n            // Since we're not going to enable Unicode for the core fonts we need to use a font-based\n            // setting for Unicode support rather than a global setting.\n            $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm');\n\n            $cidtogid = '';\n            if ($data['isUnicode']) {\n                $cidtogid = str_pad('', 256 * 256 * 2, \"\\x00\");\n            }\n\n            $file = file($dir . $metrics_name);\n\n            foreach ($file as $rowA) {\n                $row = trim($rowA);\n                $pos = strpos($row, ' ');\n\n                if ($pos) {\n                    // then there must be some keyword\n                    $key = substr($row, 0, $pos);\n                    switch ($key) {\n                        case 'FontName':\n                        case 'FullName':\n                        case 'FamilyName':\n                        case 'PostScriptName':\n                        case 'Weight':\n                        case 'ItalicAngle':\n                        case 'IsFixedPitch':\n                        case 'CharacterSet':\n                        case 'UnderlinePosition':\n                        case 'UnderlineThickness':\n                        case 'Version':\n                        case 'EncodingScheme':\n                        case 'CapHeight':\n                        case 'XHeight':\n                        case 'Ascender':\n                        case 'Descender':\n                        case 'StdHW':\n                        case 'StdVW':\n                        case 'StartCharMetrics':\n                        case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font.  Otherwise it's too big.\n                            $data[$key] = trim(substr($row, $pos));\n                            break;\n\n                        case 'FontBBox':\n                            $data[$key] = explode(' ', trim(substr($row, $pos)));\n                            break;\n\n                        //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;\n                        case 'C': // Found in AFM files\n                            $bits = explode(';', trim($row));\n                            $dtmp = array();\n\n                            foreach ($bits as $bit) {\n                                $bits2 = explode(' ', trim($bit));\n                                if (mb_strlen($bits2[0], '8bit') == 0) {\n                                    continue;\n                                }\n\n                                if (count($bits2) > 2) {\n                                    $dtmp[$bits2[0]] = array();\n                                    for ($i = 1; $i < count($bits2); $i++) {\n                                        $dtmp[$bits2[0]][] = $bits2[$i];\n                                    }\n                                } else {\n                                    if (count($bits2) == 2) {\n                                        $dtmp[$bits2[0]] = $bits2[1];\n                                    }\n                                }\n                            }\n\n                            $c = (int)$dtmp['C'];\n                            $n = $dtmp['N'];\n                            $width = floatval($dtmp['WX']);\n\n                            if ($c >= 0) {\n                                if ($c != hexdec($n)) {\n                                    $data['codeToName'][$c] = $n;\n                                }\n                                $data['C'][$c] = $width;\n                            } else {\n                                $data['C'][$n] = $width;\n                            }\n\n                            if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {\n                                $data['MissingWidth'] = $width;\n                            }\n\n                            break;\n\n                        // U 827 ; WX 0 ; N squaresubnosp ; G 675 ;\n                        case 'U': // Found in UFM files\n                            if (!$data['isUnicode']) {\n                                break;\n                            }\n\n                            $bits = explode(';', trim($row));\n                            $dtmp = array();\n\n                            foreach ($bits as $bit) {\n                                $bits2 = explode(' ', trim($bit));\n                                if (mb_strlen($bits2[0], '8bit') === 0) {\n                                    continue;\n                                }\n\n                                if (count($bits2) > 2) {\n                                    $dtmp[$bits2[0]] = array();\n                                    for ($i = 1; $i < count($bits2); $i++) {\n                                        $dtmp[$bits2[0]][] = $bits2[$i];\n                                    }\n                                } else {\n                                    if (count($bits2) == 2) {\n                                        $dtmp[$bits2[0]] = $bits2[1];\n                                    }\n                                }\n                            }\n\n                            $c = (int)$dtmp['U'];\n                            $n = $dtmp['N'];\n                            $glyph = $dtmp['G'];\n                            $width = floatval($dtmp['WX']);\n\n                            if ($c >= 0) {\n                                // Set values in CID to GID map\n                                if ($c >= 0 && $c < 0xFFFF && $glyph) {\n                                    $cidtogid[$c * 2] = chr($glyph >> 8);\n                                    $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF);\n                                }\n\n                                if ($c != hexdec($n)) {\n                                    $data['codeToName'][$c] = $n;\n                                }\n                                $data['C'][$c] = $width;\n                            } else {\n                                $data['C'][$n] = $width;\n                            }\n\n                            if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {\n                                $data['MissingWidth'] = $width;\n                            }\n\n                            break;\n\n                        case 'KPX':\n                            break; // don't include them as they are not used yet\n                            //KPX Adieresis yacute -40\n                            $bits = explode(' ', trim($row));\n                            $data['KPX'][$bits[1]][$bits[2]] = $bits[3];\n                            break;\n                    }\n                }\n            }\n\n            if ($this->compressionReady && $this->options['compression']) {\n                // then implement ZLIB based compression on CIDtoGID string\n                $data['CIDtoGID_Compressed'] = true;\n                $cidtogid = gzcompress($cidtogid, 6);\n            }\n            $data['CIDtoGID'] = base64_encode($cidtogid);\n            $data['_version_'] = $this->fontcacheVersion;\n            $this->fonts[$font] = $data;\n\n            //Because of potential trouble with php safe mode, expect that the folder already exists.\n            //If not existing, this will hit performance because of missing cached results.\n            if (is_dir(substr($fontcache, 0, -1)) && is_writable(substr($fontcache, 0, -1))) {\n                file_put_contents($fontcache . $cache_name, '<?php return ' . var_export($data, true) . ';');\n            }\n            $data = null;\n        }\n\n        if (!isset($this->fonts[$font])) {\n            $this->addMessage(\"openFont: no font file found for $font. Do you need to run load_font.php?\");\n        }\n\n        //pre_r($this->messages);\n    }\n\n    /**\n     * if the font is not loaded then load it and make the required object\n     * else just make it the current font\n     * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding'\n     * note that encoding='none' will need to be used for symbolic fonts\n     * and 'differences' => an array of mappings between numbers 0->255 and character names.\n     *\n     */\n    function selectFont($fontName, $encoding = '', $set = true)\n    {\n        $ext = substr($fontName, -4);\n        if ($ext === '.afm' || $ext === '.ufm') {\n            $fontName = substr($fontName, 0, mb_strlen($fontName) - 4);\n        }\n\n        if (!isset($this->fonts[$fontName])) {\n            $this->addMessage(\"selectFont: selecting - $fontName - $encoding, $set\");\n\n            // load the file\n            $this->openFont($fontName);\n\n            if (isset($this->fonts[$fontName])) {\n                $this->numObj++;\n                $this->numFonts++;\n\n                $font = &$this->fonts[$fontName];\n\n                //$this->numFonts = md5($fontName);\n                $pos = strrpos($fontName, '/');\n                //      $dir = substr($fontName,0,$pos+1);\n                $name = substr($fontName, $pos + 1);\n                $options = array('name' => $name, 'fontFileName' => $fontName);\n\n                if (is_array($encoding)) {\n                    // then encoding and differences might be set\n                    if (isset($encoding['encoding'])) {\n                        $options['encoding'] = $encoding['encoding'];\n                    }\n\n                    if (isset($encoding['differences'])) {\n                        $options['differences'] = $encoding['differences'];\n                    }\n                } else {\n                    if (mb_strlen($encoding, '8bit')) {\n                        // then perhaps only the encoding has been set\n                        $options['encoding'] = $encoding;\n                    }\n                }\n\n                $fontObj = $this->numObj;\n                $this->o_font($this->numObj, 'new', $options);\n                $font['fontNum'] = $this->numFonts;\n\n                // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there\n                // should be for all non-basic fonts), then load it into an object and put the\n                // references into the font object\n                $basefile = $fontName;\n\n                $fbtype = '';\n                if (file_exists(\"$basefile.pfb\")) {\n                    $fbtype = 'pfb';\n                } else {\n                    if (file_exists(\"$basefile.ttf\")) {\n                        $fbtype = 'ttf';\n                    }\n                }\n\n                $fbfile = \"$basefile.$fbtype\";\n\n                //      $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb';\n                //      $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf';\n                $this->addMessage('selectFont: checking for - ' . $fbfile);\n\n                // OAR - I don't understand this old check\n                // if (substr($fontName, -4) ===  '.afm' &&  strlen($fbtype)) {\n                if ($fbtype) {\n                    $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName'];\n                    //        $fontObj = $this->numObj;\n                    $this->addMessage(\"selectFont: adding font file - $fbfile - $adobeFontName\");\n\n                    // find the array of font widths, and put that into an object.\n                    $firstChar = -1;\n                    $lastChar = 0;\n                    $widths = array();\n                    $cid_widths = array();\n\n                    foreach ($font['C'] as $num => $d) {\n                        if (intval($num) > 0 || $num == '0') {\n                            if (!$font['isUnicode']) {\n                                // With Unicode, widths array isn't used\n                                if ($lastChar > 0 && $num > $lastChar + 1) {\n                                    for ($i = $lastChar + 1; $i < $num; $i++) {\n                                        $widths[] = 0;\n                                    }\n                                }\n                            }\n\n                            $widths[] = $d;\n\n                            if ($font['isUnicode']) {\n                                $cid_widths[$num] = $d;\n                            }\n\n                            if ($firstChar == -1) {\n                                $firstChar = $num;\n                            }\n\n                            $lastChar = $num;\n                        }\n                    }\n\n                    // also need to adjust the widths for the differences array\n                    if (isset($options['differences'])) {\n                        foreach ($options['differences'] as $charNum => $charName) {\n                            if ($charNum > $lastChar) {\n                                if (!$font['isUnicode']) {\n                                    // With Unicode, widths array isn't used\n                                    for ($i = $lastChar + 1; $i <= $charNum; $i++) {\n                                        $widths[] = 0;\n                                    }\n                                }\n\n                                $lastChar = $charNum;\n                            }\n\n                            if (isset($font['C'][$charName])) {\n                                $widths[$charNum - $firstChar] = $font['C'][$charName];\n                                if ($font['isUnicode']) {\n                                    $cid_widths[$charName] = $font['C'][$charName];\n                                }\n                            }\n                        }\n                    }\n\n                    if ($font['isUnicode']) {\n                        $font['CIDWidths'] = $cid_widths;\n                    }\n\n                    $this->addMessage('selectFont: FirstChar = ' . $firstChar);\n                    $this->addMessage('selectFont: LastChar = ' . $lastChar);\n\n                    $widthid = -1;\n\n                    if (!$font['isUnicode']) {\n                        // With Unicode, widths array isn't used\n\n                        $this->numObj++;\n                        $this->o_contents($this->numObj, 'new', 'raw');\n                        $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']';\n                        $widthid = $this->numObj;\n                    }\n\n                    $missing_width = 500;\n                    $stemV = 70;\n\n                    if (isset($font['MissingWidth'])) {\n                        $missing_width = $font['MissingWidth'];\n                    }\n                    if (isset($font['StdVW'])) {\n                        $stemV = $font['StdVW'];\n                    } else {\n                        if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) {\n                            $stemV = 120;\n                        }\n                    }\n\n                    // load the pfb file, and put that into an object too.\n                    // note that pdf supports only binary format type 1 font files, though there is a\n                    // simple utility to convert them from pfa to pfb.\n                    // FIXME: should we move font subset creation to CPDF::output? See notes in issue #750.\n                    if (!$this->isUnicode || $fbtype !== 'ttf' || empty($this->stringSubsets)) {\n                        $data = file_get_contents($fbfile);\n                    } else {\n                        $this->stringSubsets[$fontName][] = 32; // Force space if not in yet\n\n                        $subset = $this->stringSubsets[$fontName];\n                        sort($subset);\n\n                        // Load font\n                        $font_obj = Font::load($fbfile);\n                        $font_obj->parse();\n\n                        // Define subset\n                        $font_obj->setSubset($subset);\n                        $font_obj->reduce();\n\n                        // Write new font\n                        $tmp_name = \"$fbfile.tmp.\" . uniqid();\n                        $font_obj->open($tmp_name, Font_Binary_Stream::modeWrite);\n                        $font_obj->encode(array(\"OS/2\"));\n                        $font_obj->close();\n\n                        // Parse the new font to get cid2gid and widths\n                        $font_obj = Font::load($tmp_name);\n\n                        // Find Unicode char map table\n                        $subtable = null;\n                        foreach ($font_obj->getData(\"cmap\", \"subtables\") as $_subtable) {\n                            if ($_subtable[\"platformID\"] == 0 || $_subtable[\"platformID\"] == 3 && $_subtable[\"platformSpecificID\"] == 1) {\n                                $subtable = $_subtable;\n                                break;\n                            }\n                        }\n\n                        if ($subtable) {\n                            $glyphIndexArray = $subtable[\"glyphIndexArray\"];\n                            $hmtx = $font_obj->getData(\"hmtx\");\n\n                            unset($glyphIndexArray[0xFFFF]);\n\n                            $cidtogid = str_pad('', max(array_keys($glyphIndexArray)) * 2 + 1, \"\\x00\");\n                            $font['CIDWidths'] = array();\n                            foreach ($glyphIndexArray as $cid => $gid) {\n                                if ($cid >= 0 && $cid < 0xFFFF && $gid) {\n                                    $cidtogid[$cid * 2] = chr($gid >> 8);\n                                    $cidtogid[$cid * 2 + 1] = chr($gid & 0xFF);\n                                }\n\n                                $width = $font_obj->normalizeFUnit(isset($hmtx[$gid]) ? $hmtx[$gid][0] : $hmtx[0][0]);\n                                $font['CIDWidths'][$cid] = $width;\n                            }\n\n                            $font['CIDtoGID'] = base64_encode(gzcompress($cidtogid));\n                            $font['CIDtoGID_Compressed'] = true;\n\n                            $data = file_get_contents($tmp_name);\n                        } else {\n                            $data = file_get_contents($fbfile);\n                        }\n\n                        $font_obj->close();\n                        unlink($tmp_name);\n                    }\n\n                    // create the font descriptor\n                    $this->numObj++;\n                    $fontDescriptorId = $this->numObj;\n\n                    $this->numObj++;\n                    $pfbid = $this->numObj;\n\n                    // determine flags (more than a little flakey, hopefully will not matter much)\n                    $flags = 0;\n\n                    if ($font['ItalicAngle'] != 0) {\n                        $flags += pow(2, 6);\n                    }\n\n                    if ($font['IsFixedPitch'] === 'true') {\n                        $flags += 1;\n                    }\n\n                    $flags += pow(2, 5); // assume non-sybolic\n                    $list = array(\n                        'Ascent'       => 'Ascender',\n                        'CapHeight'    => 'CapHeight',\n                        'MissingWidth' => 'MissingWidth',\n                        'Descent'      => 'Descender',\n                        'FontBBox'     => 'FontBBox',\n                        'ItalicAngle'  => 'ItalicAngle'\n                    );\n                    $fdopt = array(\n                        'Flags'    => $flags,\n                        'FontName' => $adobeFontName,\n                        'StemV'    => $stemV\n                    );\n\n                    foreach ($list as $k => $v) {\n                        if (isset($font[$v])) {\n                            $fdopt[$k] = $font[$v];\n                        }\n                    }\n\n                    if ($fbtype === 'pfb') {\n                        $fdopt['FontFile'] = $pfbid;\n                    } else {\n                        if ($fbtype === 'ttf') {\n                            $fdopt['FontFile2'] = $pfbid;\n                        }\n                    }\n\n                    $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt);\n\n                    // embed the font program\n                    $this->o_contents($this->numObj, 'new');\n                    $this->objects[$pfbid]['c'] .= $data;\n\n                    // determine the cruicial lengths within this file\n                    if ($fbtype === 'pfb') {\n                        $l1 = strpos($data, 'eexec') + 6;\n                        $l2 = strpos($data, '00000000') - $l1;\n                        $l3 = mb_strlen($data, '8bit') - $l2 - $l1;\n                        $this->o_contents(\n                            $this->numObj,\n                            'add',\n                            array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3)\n                        );\n                    } else {\n                        if ($fbtype == 'ttf') {\n                            $l1 = mb_strlen($data, '8bit');\n                            $this->o_contents($this->numObj, 'add', array('Length1' => $l1));\n                        }\n                    }\n\n                    // tell the font object about all this new stuff\n                    $tmp = array(\n                        'BaseFont'       => $adobeFontName,\n                        'MissingWidth'   => $missing_width,\n                        'Widths'         => $widthid,\n                        'FirstChar'      => $firstChar,\n                        'LastChar'       => $lastChar,\n                        'FontDescriptor' => $fontDescriptorId\n                    );\n\n                    if ($fbtype === 'ttf') {\n                        $tmp['SubType'] = 'TrueType';\n                    }\n\n                    $this->addMessage(\"adding extra info to font.($fontObj)\");\n\n                    foreach ($tmp as $fk => $fv) {\n                        $this->addMessage(\"$fk : $fv\");\n                    }\n\n                    $this->o_font($fontObj, 'add', $tmp);\n                } else {\n                    $this->addMessage(\n                        'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts'\n                    );\n                }\n\n                // also set the differences here, note that this means that these will take effect only the\n                //first time that a font is selected, else they are ignored\n                if (isset($options['differences'])) {\n                    $font['differences'] = $options['differences'];\n                }\n            }\n        }\n\n        if ($set && isset($this->fonts[$fontName])) {\n            // so if for some reason the font was not set in the last one then it will not be selected\n            $this->currentBaseFont = $fontName;\n\n            // the next lines mean that if a new font is selected, then the current text state will be\n            // applied to it as well.\n            $this->currentFont = $this->currentBaseFont;\n            $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];\n\n            //$this->setCurrentFont();\n        }\n\n        return $this->currentFontNum;\n        //return $this->numObj;\n    }\n\n    /**\n     * sets up the current font, based on the font families, and the current text state\n     * note that this system is quite flexible, a bold-italic font can be completely different to a\n     * italic-bold font, and even bold-bold will have to be defined within the family to have meaning\n     * This function is to be called whenever the currentTextState is changed, it will update\n     * the currentFont setting to whatever the appropriatte family one is.\n     * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont\n     * This function will change the currentFont to whatever it should be, but will not change the\n     * currentBaseFont.\n     */\n    private function setCurrentFont()\n    {\n        //   if (strlen($this->currentBaseFont) == 0){\n        //     // then assume an initial font\n        //     $this->selectFont($this->defaultFont);\n        //   }\n        //   $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1);\n        //   if (strlen($this->currentTextState)\n        //     && isset($this->fontFamilies[$cf])\n        //       && isset($this->fontFamilies[$cf][$this->currentTextState])){\n        //     // then we are in some state or another\n        //     // and this font has a family, and the current setting exists within it\n        //     // select the font, then return it\n        //     $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState];\n        //     $this->selectFont($nf,'',0);\n        //     $this->currentFont = $nf;\n        //     $this->currentFontNum = $this->fonts[$nf]['fontNum'];\n        //   } else {\n        //     // the this font must not have the right family member for the current state\n        //     // simply assume the base font\n        $this->currentFont = $this->currentBaseFont;\n        $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];\n        //  }\n    }\n\n    /**\n     * function for the user to find out what the ID is of the first page that was created during\n     * startup - useful if they wish to add something to it later.\n     */\n    function getFirstPageId()\n    {\n        return $this->firstPageId;\n    }\n\n    /**\n     * add content to the currently active object\n     */\n    private function addContent($content)\n    {\n        $this->objects[$this->currentContents]['c'] .= $content;\n    }\n\n    /**\n     * sets the color for fill operations\n     */\n    function setColor($color, $force = false)\n    {\n        $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);\n\n        if (!$force && $this->currentColor == $new_color) {\n            return;\n        }\n\n        if (isset($new_color[3])) {\n            //$this->currentColor = $new_color;\n            $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F %.3F k\", $this->currentColor));\n        } else {\n            if (isset($new_color[2])) {\n                //$this->currentColor = $new_color;\n                $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F rg\", $new_color));\n            }\n        }\n    }\n\n    /**\n     * sets the color for fill operations\n     */\n    function setFillRule($fillRule)\n    {\n        if (!in_array($fillRule, array(\"nonzero\", \"evenodd\"))) {\n            return;\n        }\n\n        $this->fillRule = $fillRule;\n    }\n\n    /**\n     * sets the color for stroke operations\n     */\n    function setStrokeColor($color, $force = false)\n    {\n        $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);\n\n        if (!$force && $this->currentStrokeColor == $new_color) {\n            return;\n        }\n\n        if (isset($new_color[3])) {\n            //$this->currentStrokeColor = $new_color;\n            $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F %.3F K\", $this->currentStrokeColor));\n        } else {\n            if (isset($new_color[2])) {\n                //$this->currentStrokeColor = $new_color;\n                $this->addContent(vsprintf(\"\\n%.3F %.3F %.3F RG\", $new_color));\n            }\n        }\n    }\n\n    /**\n     * Set the graphics state for compositions\n     */\n    function setGraphicsState($parameters)\n    {\n        // Create a new graphics state object\n        // FIXME: should actually keep track of states that have already been created...\n        $this->numObj++;\n        $this->o_extGState($this->numObj, 'new', $parameters);\n        $this->addContent(\"\\n/GS$this->numStates gs\");\n    }\n\n    /**\n     * Set current blend mode & opacity for lines.\n     *\n     * Valid blend modes are:\n     *\n     * Normal, Multiply, Screen, Overlay, Darken, Lighten,\n     * ColorDogde, ColorBurn, HardLight, SoftLight, Difference,\n     * Exclusion\n     *\n     * @param string $mode    the blend mode to use\n     * @param float  $opacity 0.0 fully transparent, 1.0 fully opaque\n     */\n    function setLineTransparency($mode, $opacity)\n    {\n        static $blend_modes = array(\n            \"Normal\",\n            \"Multiply\",\n            \"Screen\",\n            \"Overlay\",\n            \"Darken\",\n            \"Lighten\",\n            \"ColorDogde\",\n            \"ColorBurn\",\n            \"HardLight\",\n            \"SoftLight\",\n            \"Difference\",\n            \"Exclusion\"\n        );\n\n        if (!in_array($mode, $blend_modes)) {\n            $mode = \"Normal\";\n        }\n\n        if (is_null($this->currentLineTransparency)) {\n            $this->currentLineTransparency = [];\n        }\n\n        if ($mode === (key_exists('mode', $this->currentLineTransparency) ?\n            $this->currentLineTransparency['mode'] : '') &&\n            $opacity === (key_exists('opacity', $this->currentLineTransparency) ?\n            $this->currentLineTransparency[\"opacity\"] : '')) {\n            return;\n        }\n\n        $this->currentLineTransparency[\"mode\"] = $mode;\n        $this->currentLineTransparency[\"opacity\"] = $opacity;\n\n        $options = array(\n            \"BM\" => \"/$mode\",\n            \"CA\" => (float)$opacity\n        );\n\n        $this->setGraphicsState($options);\n    }\n\n    /**\n     * Set current blend mode & opacity for filled objects.\n     *\n     * Valid blend modes are:\n     *\n     * Normal, Multiply, Screen, Overlay, Darken, Lighten,\n     * ColorDogde, ColorBurn, HardLight, SoftLight, Difference,\n     * Exclusion\n     *\n     * @param string $mode    the blend mode to use\n     * @param float  $opacity 0.0 fully transparent, 1.0 fully opaque\n     */\n    function setFillTransparency($mode, $opacity)\n    {\n        static $blend_modes = array(\n            \"Normal\",\n            \"Multiply\",\n            \"Screen\",\n            \"Overlay\",\n            \"Darken\",\n            \"Lighten\",\n            \"ColorDogde\",\n            \"ColorBurn\",\n            \"HardLight\",\n            \"SoftLight\",\n            \"Difference\",\n            \"Exclusion\"\n        );\n\n        if (!in_array($mode, $blend_modes)) {\n            $mode = \"Normal\";\n        }\n\n        if (is_null($this->currentFillTransparency)) {\n            $this->currentFillTransparency = [];\n        }\n\n        if ($mode === (key_exists('mode', $this->currentFillTransparency) ?\n            $this->currentFillTransparency['mode'] : '') &&\n            $opacity === (key_exists('opacity', $this->currentFillTransparency) ?\n            $this->currentFillTransparency[\"opacity\"] : '')) {\n            return;\n        }\n\n        $this->currentFillTransparency[\"mode\"] = $mode;\n        $this->currentFillTransparency[\"opacity\"] = $opacity;\n\n        $options = array(\n            \"BM\" => \"/$mode\",\n            \"ca\" => (float)$opacity,\n        );\n\n        $this->setGraphicsState($options);\n    }\n\n    function lineTo($x, $y)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F l\", $x, $y));\n    }\n\n    function moveTo($x, $y)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F m\", $x, $y));\n    }\n\n    /**\n     * draw a bezier curve based on 4 control points\n     */\n    function curveTo($x1, $y1, $x2, $y2, $x3, $y3)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F %.3F %.3F c\", $x1, $y1, $x2, $y2, $x3, $y3));\n    }\n\n    /**\n     * draw a bezier curve based on 4 control points\n     */\n    function quadTo($cpx, $cpy, $x, $y)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F v\", $cpx, $cpy, $x, $y));\n    }\n\n    function closePath()\n    {\n        $this->addContent(' h');\n    }\n\n    function endPath()\n    {\n        $this->addContent(' n');\n    }\n\n    /**\n     * draw an ellipse\n     * note that the part and filled ellipse are just special cases of this function\n     *\n     * draws an ellipse in the current line style\n     * centered at $x0,$y0, radii $r1,$r2\n     * if $r2 is not set, then a circle is drawn\n     * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse.\n     * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a\n     * pretty crappy shape at 2, as we are approximating with bezier curves.\n     */\n    function ellipse(\n        $x0,\n        $y0,\n        $r1,\n        $r2 = 0,\n        $angle = 0,\n        $nSeg = 8,\n        $astart = 0,\n        $afinish = 360,\n        $close = true,\n        $fill = false,\n        $stroke = true,\n        $incomplete = false\n    ) {\n        if ($r1 == 0) {\n            return;\n        }\n\n        if ($r2 == 0) {\n            $r2 = $r1;\n        }\n\n        if ($nSeg < 2) {\n            $nSeg = 2;\n        }\n\n        $astart = deg2rad((float)$astart);\n        $afinish = deg2rad((float)$afinish);\n        $totalAngle = $afinish - $astart;\n\n        $dt = $totalAngle / $nSeg;\n        $dtm = $dt / 3;\n\n        if ($angle != 0) {\n            $a = -1 * deg2rad((float)$angle);\n\n            $this->addContent(\n                sprintf(\"\\n q %.3F %.3F %.3F %.3F %.3F %.3F cm\", cos($a), -sin($a), sin($a), cos($a), $x0, $y0)\n            );\n\n            $x0 = 0;\n            $y0 = 0;\n        }\n\n        $t1 = $astart;\n        $a0 = $x0 + $r1 * cos($t1);\n        $b0 = $y0 + $r2 * sin($t1);\n        $c0 = -$r1 * sin($t1);\n        $d0 = $r2 * cos($t1);\n\n        if (!$incomplete) {\n            $this->addContent(sprintf(\"\\n%.3F %.3F m \", $a0, $b0));\n        }\n\n        for ($i = 1; $i <= $nSeg; $i++) {\n            // draw this bit of the total curve\n            $t1 = $i * $dt + $astart;\n            $a1 = $x0 + $r1 * cos($t1);\n            $b1 = $y0 + $r2 * sin($t1);\n            $c1 = -$r1 * sin($t1);\n            $d1 = $r2 * cos($t1);\n\n            $this->addContent(\n                sprintf(\n                    \"\\n%.3F %.3F %.3F %.3F %.3F %.3F c\",\n                    ($a0 + $c0 * $dtm),\n                    ($b0 + $d0 * $dtm),\n                    ($a1 - $c1 * $dtm),\n                    ($b1 - $d1 * $dtm),\n                    $a1,\n                    $b1\n                )\n            );\n\n            $a0 = $a1;\n            $b0 = $b1;\n            $c0 = $c1;\n            $d0 = $d1;\n        }\n\n        if (!$incomplete) {\n            if ($fill) {\n                $this->addContent(' f');\n            }\n\n            if ($stroke) {\n                if ($close) {\n                    $this->addContent(' s'); // small 's' signifies closing the path as well\n                } else {\n                    $this->addContent(' S');\n                }\n            }\n        }\n\n        if ($angle != 0) {\n            $this->addContent(' Q');\n        }\n    }\n\n    /**\n     * this sets the line drawing style.\n     * width, is the thickness of the line in user units\n     * cap is the type of cap to put on the line, values can be 'butt','round','square'\n     *    where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the\n     *    end of the line.\n     * join can be 'miter', 'round', 'bevel'\n     * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the\n     *   on and off dashes.\n     *   (2) represents 2 on, 2 off, 2 on , 2 off ...\n     *   (2,1) is 2 on, 1 off, 2 on, 1 off.. etc\n     * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts.\n     */\n    function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0)\n    {\n        // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day\n        $string = '';\n\n        if ($width > 0) {\n            $string .= sprintf(\"%.3F w\", $width);\n        }\n\n        $ca = array('butt' => 0, 'round' => 1, 'square' => 2);\n\n        if (isset($ca[$cap])) {\n            $string .= \" $ca[$cap] J\";\n        }\n\n        $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2);\n\n        if (isset($ja[$join])) {\n            $string .= \" $ja[$join] j\";\n        }\n\n        if (is_array($dash)) {\n            $string .= ' [ ' . implode(' ', $dash) . \" ] $phase d\";\n        }\n\n        $this->currentLineStyle = $string;\n        $this->addContent(\"\\n$string\");\n    }\n\n    function rect($x1, $y1, $width, $height)\n    {\n        $this->addContent(sprintf(\"\\n%.3F %.3F %.3F %.3F re\", $x1, $y1, $width, $height));\n    }\n\n    function stroke()\n    {\n        $this->addContent(\"\\nS\");\n    }\n\n    function fill()\n    {\n        $this->addContent(\"\\nf\".($this->fillRule === \"evenodd\" ? \"*\" : \"\"));\n    }\n\n    function fillStroke()\n    {\n        $this->addContent(\"\\nb\".($this->fillRule === \"evenodd\" ? \"*\" : \"\"));\n    }\n\n    /**\n     * save the current graphic state\n     */\n    function save()\n    {\n        $this->addContent(\"\\nq\");\n    }\n\n    /**\n     * restore the last graphic state\n     */\n    function restore()\n    {\n        $this->addContent(\"\\nQ\");\n    }\n\n    /**\n     * scale\n     *\n     * @param float $s_x scaling factor for width as percent\n     * @param float $s_y scaling factor for height as percent\n     * @param float $x   Origin abscisse\n     * @param float $y   Origin ordinate\n     */\n    function scale($s_x, $s_y, $x, $y)\n    {\n        $y = $this->currentPageSize[\"height\"] - $y;\n\n        $tm = array(\n            $s_x,            0,\n            0,               $s_y,\n            $x * (1 - $s_x), $y * (1 - $s_y)\n        );\n\n        $this->transform($tm);\n    }\n\n    /**\n     * translate\n     *\n     * @param float $t_x movement to the right\n     * @param float $t_y movement to the bottom\n     */\n    function translate($t_x, $t_y)\n    {\n        $tm = array(\n            1,    0,\n            0,    1,\n            $t_x, -$t_y\n        );\n\n        $this->transform($tm);\n    }\n\n    /**\n     * rotate\n     *\n     * @param float $angle angle in degrees for counter-clockwise rotation\n     * @param float $x     Origin abscisse\n     * @param float $y     Origin ordinate\n     */\n    function rotate($angle, $x, $y)\n    {\n        $y = $this->currentPageSize[\"height\"] - $y;\n\n        $a = deg2rad($angle);\n        $cos_a = cos($a);\n        $sin_a = sin($a);\n\n        $tm = array(\n            $cos_a,                         -$sin_a,\n            $sin_a,                         $cos_a,\n            $x - $sin_a * $y - $cos_a * $x, $y - $cos_a * $y + $sin_a * $x,\n        );\n\n        $this->transform($tm);\n    }\n\n    /**\n     * skew\n     *\n     * @param float $angle_x\n     * @param float $angle_y\n     * @param float $x Origin abscisse\n     * @param float $y Origin ordinate\n     */\n    function skew($angle_x, $angle_y, $x, $y)\n    {\n        $y = $this->currentPageSize[\"height\"] - $y;\n\n        $tan_x = tan(deg2rad($angle_x));\n        $tan_y = tan(deg2rad($angle_y));\n\n        $tm = array(\n            1,           -$tan_y,\n            -$tan_x,     1,\n            $tan_x * $y, $tan_y * $x,\n        );\n\n        $this->transform($tm);\n    }\n\n    /**\n     * apply graphic transformations\n     *\n     * @param array $tm transformation matrix\n     */\n    function transform($tm)\n    {\n        $this->addContent(vsprintf(\"\\n %.3F %.3F %.3F %.3F %.3F %.3F cm\", $tm));\n    }\n\n    /**\n     * add a new page to the document\n     * this also makes the new page the current active object\n     */\n    function newPage($insert = 0, $id = 0, $pos = 'after')\n    {\n        // if there is a state saved, then go up the stack closing them\n        // then on the new page, re-open them with the right setings\n\n        if ($this->nStateStack) {\n            for ($i = $this->nStateStack; $i >= 1; $i--) {\n                $this->restoreState($i);\n            }\n        }\n\n        $this->numObj++;\n\n        if ($insert) {\n            // the id from the ezPdf class is the id of the contents of the page, not the page object itself\n            // query that object to find the parent\n            $rid = $this->objects[$id]['onPage'];\n            $opt = array('rid' => $rid, 'pos' => $pos);\n            $this->o_page($this->numObj, 'new', $opt);\n        } else {\n            $this->o_page($this->numObj, 'new');\n        }\n\n        // if there is a stack saved, then put that onto the page\n        if ($this->nStateStack) {\n            for ($i = 1; $i <= $this->nStateStack; $i++) {\n                $this->saveState($i);\n            }\n        }\n\n        // and if there has been a stroke or fill color set, then transfer them\n        if (isset($this->currentColor)) {\n            $this->setColor($this->currentColor, true);\n        }\n\n        if (isset($this->currentStrokeColor)) {\n            $this->setStrokeColor($this->currentStrokeColor, true);\n        }\n\n        // if there is a line style set, then put this in too\n        if (mb_strlen($this->currentLineStyle, '8bit')) {\n            $this->addContent(\"\\n$this->currentLineStyle\");\n        }\n\n        // the call to the o_page object set currentContents to the present page, so this can be returned as the page id\n        return $this->currentContents;\n    }\n\n    /**\n     * output the pdf code, streaming it to the browser\n     * the relevant headers are set so that hopefully the browser will recognise it\n     */\n    function stream($options = '')\n    {\n        // setting the options allows the adjustment of the headers\n        // values at the moment are:\n        // 'Content-Disposition' => 'filename'  - sets the filename, though not too sure how well this will\n        //        work as in my trial the browser seems to use the filename of the php file with .pdf on the end\n        // 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this header is not included, off by default\n        //    this header seems to have caused some problems despite tha fact that it is supposed to solve\n        //    them, so I am leaving it off by default.\n        // 'compress' = > 1 or 0 - apply content stream compression, this is on (1) by default\n        // 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog\n        if (!is_array($options)) {\n            $options = array();\n        }\n\n        if (headers_sent()) {\n            die(\"Unable to stream pdf: headers already sent\");\n        }\n\n        $debug = empty($options['compression']);\n        $tmp = ltrim($this->output($debug));\n\n        header(\"Cache-Control: private\");\n        header(\"Content-type: application/pdf\");\n\n        //FIXME: I don't know that this is sufficient for determining content length (i.e. what about transport compression?)\n        header(\"Content-Length: \" . mb_strlen($tmp, '8bit'));\n        $fileName = (isset($options['Content-Disposition']) ? $options['Content-Disposition'] : 'file.pdf');\n\n        if (!isset($options[\"Attachment\"])) {\n            $options[\"Attachment\"] = true;\n        }\n\n        $attachment = $options[\"Attachment\"] ? \"attachment\" : \"inline\";\n\n        // detect the character encoding of the incoming file\n        $encoding = mb_detect_encoding($fileName);\n        $fallbackfilename = mb_convert_encoding($fileName, \"ISO-8859-1\", $encoding);\n        $encodedfallbackfilename = rawurlencode($fallbackfilename);\n        $encodedfilename = rawurlencode($fileName);\n\n        header(\n            \"Content-Disposition: $attachment; filename=\" . $encodedfallbackfilename . \"; filename*=UTF-8''$encodedfilename\"\n        );\n\n        if (isset($options['Accept-Ranges']) && $options['Accept-Ranges'] == 1) {\n            //FIXME: Is this the correct value ... spec says 1#range-unit\n            header(\"Accept-Ranges: \" . mb_strlen($tmp, '8bit'));\n        }\n\n        echo $tmp;\n        flush();\n    }\n\n    /**\n     * return the height in units of the current font in the given size\n     */\n    function getFontHeight($size)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $font = $this->fonts[$this->currentFont];\n\n        // for the current font, and the given size, what is the height of the font in user units\n        if (isset($font['Ascender']) && isset($font['Descender'])) {\n            $h = $font['Ascender'] - $font['Descender'];\n        } else {\n            $h = $font['FontBBox'][3] - $font['FontBBox'][1];\n        }\n\n        // have to adjust by a font offset for Windows fonts.  unfortunately it looks like\n        // the bounding box calculations are wrong and I don't know why.\n        if (isset($font['FontHeightOffset'])) {\n            // For CourierNew from Windows this needs to be -646 to match the\n            // Adobe native Courier font.\n            //\n            // For FreeMono from GNU this needs to be -337 to match the\n            // Courier font.\n            //\n            // Both have been added manually to the .afm and .ufm files.\n            $h += (int)$font['FontHeightOffset'];\n        }\n\n        return $size * $h / 1000;\n    }\n\n    function getFontXHeight($size)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $font = $this->fonts[$this->currentFont];\n\n        // for the current font, and the given size, what is the height of the font in user units\n        if (isset($font['XHeight'])) {\n            $xh = $font['Ascender'] - $font['Descender'];\n        } else {\n            $xh = $this->getFontHeight($size) / 2;\n        }\n\n        return $size * $xh / 1000;\n    }\n\n    /**\n     * return the font descender, this will normally return a negative number\n     * if you add this number to the baseline, you get the level of the bottom of the font\n     * it is in the pdf user units\n     */\n    function getFontDescender($size)\n    {\n        // note that this will most likely return a negative value\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        //$h = $this->fonts[$this->currentFont]['FontBBox'][1];\n        $h = $this->fonts[$this->currentFont]['Descender'];\n\n        return $size * $h / 1000;\n    }\n\n    /**\n     * filter the text, this is applied to all text just before being inserted into the pdf document\n     * it escapes the various things that need to be escaped, and so on\n     *\n     * @access private\n     */\n    function filterText($text, $bom = true, $convert_encoding = true)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        if ($convert_encoding) {\n            $cf = $this->currentFont;\n            if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) {\n                //$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');\n                $text = $this->utf8toUtf16BE($text, $bom);\n            } else {\n                //$text = html_entity_decode($text, ENT_QUOTES);\n                $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8');\n            }\n        }\n\n        // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290)\n        return strtr($text, array(')' => '\\\\)', '(' => '\\\\(', '\\\\' => '\\\\\\\\', chr(13) => '\\r'));\n    }\n\n    /**\n     * given a start position and information about how text is to be laid out, calculate where\n     * on the page the text will end\n     */\n    private function getTextPosition($x, $y, $angle, $size, $wa, $text)\n    {\n        // given this information return an array containing x and y for the end position as elements 0 and 1\n        $w = $this->getTextWidth($size, $text);\n\n        // need to adjust for the number of spaces in this text\n        $words = explode(' ', $text);\n        $nspaces = count($words) - 1;\n        $w += $wa * $nspaces;\n        $a = deg2rad((float)$angle);\n\n        return array(cos($a) * $w + $x, -sin($a) * $w + $y);\n    }\n\n    /**\n     * Callback method used by smallCaps\n     *\n     * @param array $matches\n     *\n     * @return string\n     */\n    function toUpper($matches)\n    {\n        return mb_strtoupper($matches[0]);\n    }\n\n    function concatMatches($matches)\n    {\n        $str = \"\";\n        foreach ($matches as $match) {\n            $str .= $match[0];\n        }\n\n        return $str;\n    }\n\n    /**\n     * add text to the document, at a specified location, size and angle on the page\n     */\n    function registerText($font, $text)\n    {\n        if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) {\n            return;\n        }\n\n        if (!isset($this->stringSubsets[$font])) {\n            $this->stringSubsets[$font] = array();\n        }\n\n        $this->stringSubsets[$font] = array_unique(\n            array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text))\n        );\n    }\n\n    /**\n     * add text to the document, at a specified location, size and angle on the page\n     */\n    function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false)\n    {\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $text = str_replace(array(\"\\r\", \"\\n\"), \"\", $text);\n\n        if ($smallCaps) {\n            preg_match_all(\"/(\\P{Ll}+)/u\", $text, $matches, PREG_SET_ORDER);\n            $lower = $this->concatMatches($matches);\n            d($lower);\n\n            preg_match_all(\"/(\\p{Ll}+)/u\", $text, $matches, PREG_SET_ORDER);\n            $other = $this->concatMatches($matches);\n            d($other);\n\n            //$text = preg_replace_callback(\"/\\p{Ll}/u\", array($this, \"toUpper\"), $text);\n        }\n\n        // if there are any open callbacks, then they should be called, to show the start of the line\n        if ($this->nCallback > 0) {\n            for ($i = $this->nCallback; $i > 0; $i--) {\n                // call each function\n                $info = array(\n                    'x'         => $x,\n                    'y'         => $y,\n                    'angle'     => $angle,\n                    'status'    => 'sol',\n                    'p'         => $this->callback[$i]['p'],\n                    'nCallback' => $this->callback[$i]['nCallback'],\n                    'height'    => $this->callback[$i]['height'],\n                    'descender' => $this->callback[$i]['descender']\n                );\n\n                $func = $this->callback[$i]['f'];\n                $this->$func($info);\n            }\n        }\n\n        if ($angle == 0) {\n            $this->addContent(sprintf(\"\\nBT %.3F %.3F Td\", $x, $y));\n        } else {\n            $a = deg2rad((float)$angle);\n            $this->addContent(\n                sprintf(\"\\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm\", cos($a), -sin($a), sin($a), cos($a), $x, $y)\n            );\n        }\n\n        if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust) {\n            $this->wordSpaceAdjust = $wordSpaceAdjust;\n            $this->addContent(sprintf(\" %.3F Tw\", $wordSpaceAdjust));\n        }\n\n        if ($charSpaceAdjust != 0 || $charSpaceAdjust != $this->charSpaceAdjust) {\n            $this->charSpaceAdjust = $charSpaceAdjust;\n            $this->addContent(sprintf(\" %.3F Tc\", $charSpaceAdjust));\n        }\n\n        $len = mb_strlen($text);\n        $start = 0;\n\n        if ($start < $len) {\n            $part = $text; // OAR - Don't need this anymore, given that $start always equals zero.  substr($text, $start);\n            $place_text = $this->filterText($part, false);\n            // modify unicode text so that extra word spacing is manually implemented (bug #)\n            $cf = $this->currentFont;\n            if ($this->fonts[$cf]['isUnicode'] && $wordSpaceAdjust != 0) {\n                $space_scale = 1000 / $size;\n                //$place_text = str_replace(' ', ') ( ) '.($this->getTextWidth($size, chr(32), $wordSpaceAdjust)*-75).' (', $place_text);\n                $place_text = str_replace(' ', ' ) ' . (-round($space_scale * $wordSpaceAdjust)) . ' (', $place_text);\n            }\n            $this->addContent(\" /F$this->currentFontNum \" . sprintf('%.1F Tf ', $size));\n            $this->addContent(\" [($place_text)] TJ\");\n        }\n\n        $this->addContent(' ET');\n\n        // if there are any open callbacks, then they should be called, to show the end of the line\n        if ($this->nCallback > 0) {\n            for ($i = $this->nCallback; $i > 0; $i--) {\n                // call each function\n                $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text);\n                $info = array(\n                    'x'         => $tmp[0],\n                    'y'         => $tmp[1],\n                    'angle'     => $angle,\n                    'status'    => 'eol',\n                    'p'         => $this->callback[$i]['p'],\n                    'nCallback' => $this->callback[$i]['nCallback'],\n                    'height'    => $this->callback[$i]['height'],\n                    'descender' => $this->callback[$i]['descender']\n                );\n                $func = $this->callback[$i]['f'];\n                $this->$func($info);\n            }\n        }\n    }\n\n    /**\n     * calculate how wide a given text string will be on a page, at a given size.\n     * this can be called externally, but is also used by the other class functions\n     */\n    function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0)\n    {\n        static $ord_cache = array();\n\n        // this function should not change any of the settings, though it will need to\n        // track any directives which change during calculation, so copy them at the start\n        // and put them back at the end.\n        $store_currentTextState = $this->currentTextState;\n\n        if (!$this->numFonts) {\n            $this->selectFont($this->defaultFont);\n        }\n\n        $text = str_replace(array(\"\\r\", \"\\n\"), \"\", $text);\n\n        // converts a number or a float to a string so it can get the width\n        $text = \"$text\";\n\n        // hmm, this is where it all starts to get tricky - use the font information to\n        // calculate the width of each character, add them up and convert to user units\n        $w = 0;\n        $cf = $this->currentFont;\n        $current_font = $this->fonts[$cf];\n        $space_scale = 1000 / ($size > 0 ? $size : 1);\n        $n_spaces = 0;\n\n        if ($current_font['isUnicode']) {\n            // for Unicode, use the code points array to calculate width rather\n            // than just the string itself\n            $unicode = $this->utf8toCodePointsArray($text);\n\n            foreach ($unicode as $char) {\n                // check if we have to replace character\n                if (isset($current_font['differences'][$char])) {\n                    $char = $current_font['differences'][$char];\n                }\n\n                if (isset($current_font['C'][$char])) {\n                    $char_width = $current_font['C'][$char];\n\n                    // add the character width\n                    $w += $char_width;\n\n                    // add additional padding for space\n                    if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') {  // Space\n                        $w += $word_spacing * $space_scale;\n                        $n_spaces++;\n                    }\n                }\n            }\n\n            // add additionnal char spacing\n            if ($char_spacing != 0) {\n                $w += $char_spacing * $space_scale * (count($unicode) + $n_spaces);\n            }\n\n        } else {\n            // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252\n            if ($this->isUnicode) {\n                $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8');\n            }\n\n            $len = mb_strlen($text, 'Windows-1252');\n\n            for ($i = 0; $i < $len; $i++) {\n                $c = $text[$i];\n                $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c));\n\n                // check if we have to replace character\n                if (isset($current_font['differences'][$char])) {\n                    $char = $current_font['differences'][$char];\n                }\n\n                if (isset($current_font['C'][$char])) {\n                    $char_width = $current_font['C'][$char];\n\n                    // add the character width\n                    $w += $char_width;\n\n                    // add additional padding for space\n                    if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') {  // Space\n                        $w += $word_spacing * $space_scale;\n                        $n_spaces++;\n                    }\n                }\n            }\n\n            // add additionnal char spacing\n            if ($char_spacing != 0) {\n                $w += $char_spacing * $space_scale * ($len + $n_spaces);\n            }\n        }\n\n        $this->currentTextState = $store_currentTextState;\n        $this->setCurrentFont();\n\n        return $w * $size / 1000;\n    }\n\n    /**\n     * this will be called at a new page to return the state to what it was on the\n     * end of the previous page, before the stack was closed down\n     * This is to get around not being able to have open 'q' across pages\n     *\n     */\n    function saveState($pageEnd = 0)\n    {\n        if ($pageEnd) {\n            // this will be called at a new page to return the state to what it was on the\n            // end of the previous page, before the stack was closed down\n            // This is to get around not being able to have open 'q' across pages\n            $opt = $this->stateStack[$pageEnd];\n            // ok to use this as stack starts numbering at 1\n            $this->setColor($opt['col'], true);\n            $this->setStrokeColor($opt['str'], true);\n            $this->addContent(\"\\n\" . $opt['lin']);\n            //    $this->currentLineStyle = $opt['lin'];\n        } else {\n            $this->nStateStack++;\n            $this->stateStack[$this->nStateStack] = array(\n                'col' => $this->currentColor,\n                'str' => $this->currentStrokeColor,\n                'lin' => $this->currentLineStyle\n            );\n        }\n\n        $this->save();\n    }\n\n    /**\n     * restore a previously saved state\n     */\n    function restoreState($pageEnd = 0)\n    {\n        if (!$pageEnd) {\n            $n = $this->nStateStack;\n            $this->currentColor = $this->stateStack[$n]['col'];\n            $this->currentStrokeColor = $this->stateStack[$n]['str'];\n            $this->addContent(\"\\n\" . $this->stateStack[$n]['lin']);\n            $this->currentLineStyle = $this->stateStack[$n]['lin'];\n            $this->stateStack[$n] = null;\n            unset($this->stateStack[$n]);\n            $this->nStateStack--;\n        }\n\n        $this->restore();\n    }\n\n    /**\n     * make a loose object, the output will go into this object, until it is closed, then will revert to\n     * the current one.\n     * this object will not appear until it is included within a page.\n     * the function will return the object number\n     */\n    function openObject()\n    {\n        $this->nStack++;\n        $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);\n        // add a new object of the content type, to hold the data flow\n        $this->numObj++;\n        $this->o_contents($this->numObj, 'new');\n        $this->currentContents = $this->numObj;\n        $this->looseObjects[$this->numObj] = 1;\n\n        return $this->numObj;\n    }\n\n    /**\n     * open an existing object for editing\n     */\n    function reopenObject($id)\n    {\n        $this->nStack++;\n        $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);\n        $this->currentContents = $id;\n\n        // also if this object is the primary contents for a page, then set the current page to its parent\n        if (isset($this->objects[$id]['onPage'])) {\n            $this->currentPage = $this->objects[$id]['onPage'];\n        }\n    }\n\n    /**\n     * close an object\n     */\n    function closeObject()\n    {\n        // close the object, as long as there was one open in the first place, which will be indicated by\n        // an objectId on the stack.\n        if ($this->nStack > 0) {\n            $this->currentContents = $this->stack[$this->nStack]['c'];\n            $this->currentPage = $this->stack[$this->nStack]['p'];\n            $this->nStack--;\n            // easier to probably not worry about removing the old entries, they will be overwritten\n            // if there are new ones.\n        }\n    }\n\n    /**\n     * stop an object from appearing on pages from this point on\n     */\n    function stopObject($id)\n    {\n        // if an object has been appearing on pages up to now, then stop it, this page will\n        // be the last one that could contian it.\n        if (isset($this->addLooseObjects[$id])) {\n            $this->addLooseObjects[$id] = '';\n        }\n    }\n\n    /**\n     * after an object has been created, it wil only show if it has been added, using this function.\n     */\n    function addObject($id, $options = 'add')\n    {\n        // add the specified object to the page\n        if (isset($this->looseObjects[$id]) && $this->currentContents != $id) {\n            // then it is a valid object, and it is not being added to itself\n            switch ($options) {\n                case 'all':\n                    // then this object is to be added to this page (done in the next block) and\n                    // all future new pages.\n                    $this->addLooseObjects[$id] = 'all';\n\n                case 'add':\n                    if (isset($this->objects[$this->currentContents]['onPage'])) {\n                        // then the destination contents is the primary for the page\n                        // (though this object is actually added to that page)\n                        $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id);\n                    }\n                    break;\n\n                case 'even':\n                    $this->addLooseObjects[$id] = 'even';\n                    $pageObjectId = $this->objects[$this->currentContents]['onPage'];\n                    if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) {\n                        $this->addObject($id);\n                        // hacky huh :)\n                    }\n                    break;\n\n                case 'odd':\n                    $this->addLooseObjects[$id] = 'odd';\n                    $pageObjectId = $this->objects[$this->currentContents]['onPage'];\n                    if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) {\n                        $this->addObject($id);\n                        // hacky huh :)\n                    }\n                    break;\n\n                case 'next':\n                    $this->addLooseObjects[$id] = 'all';\n                    break;\n\n                case 'nexteven':\n                    $this->addLooseObjects[$id] = 'even';\n                    break;\n\n                case 'nextodd':\n                    $this->addLooseObjects[$id] = 'odd';\n                    break;\n            }\n        }\n    }\n\n    /**\n     * return a storable representation of a specific object\n     */\n    function serializeObject($id)\n    {\n        if (array_key_exists($id, $this->objects)) {\n            return serialize($this->objects[$id]);\n        }\n    }\n\n    /**\n     * restore an object from its stored representation.  returns its new object id.\n     */\n    function restoreSerializedObject($obj)\n    {\n        $obj_id = $this->openObject();\n        $this->objects[$obj_id] = unserialize($obj);\n        $this->closeObject();\n\n        return $obj_id;\n    }\n\n    /**\n     * add content to the documents info object\n     */\n    function addInfo($label, $value = 0)\n    {\n        // this will only work if the label is one of the valid ones.\n        // modify this so that arrays can be passed as well.\n        // if $label is an array then assume that it is key => value pairs\n        // else assume that they are both scalar, anything else will probably error\n        if (is_array($label)) {\n            foreach ($label as $l => $v) {\n                $this->o_info($this->infoObject, $l, $v);\n            }\n        } else {\n            $this->o_info($this->infoObject, $label, $value);\n        }\n    }\n\n    /**\n     * set the viewer preferences of the document, it is up to the browser to obey these.\n     */\n    function setPreferences($label, $value = 0)\n    {\n        // this will only work if the label is one of the valid ones.\n        if (is_array($label)) {\n            foreach ($label as $l => $v) {\n                $this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v));\n            }\n        } else {\n            $this->o_catalog($this->catalogId, 'viewerPreferences', array($label => $value));\n        }\n    }\n\n    /**\n     * extract an integer from a position in a byte stream\n     */\n    private function getBytes(&$data, $pos, $num)\n    {\n        // return the integer represented by $num bytes from $pos within $data\n        $ret = 0;\n        for ($i = 0; $i < $num; $i++) {\n            $ret *= 256;\n            $ret += ord($data[$pos + $i]);\n        }\n\n        return $ret;\n    }\n\n    /**\n     * Check if image already added to pdf image directory.\n     * If yes, need not to create again (pass empty data)\n     */\n    function image_iscached($imgname)\n    {\n        return isset($this->imagelist[$imgname]);\n    }\n\n    /**\n     * add a PNG image into the document, from a GD object\n     * this should work with remote files\n     *\n     * @param string   $file    The PNG file\n     * @param float    $x       X position\n     * @param float    $y       Y position\n     * @param float    $w       Width\n     * @param float    $h       Height\n     * @param resource $img     A GD resource\n     * @param bool     $is_mask true if the image is a mask\n     * @param bool     $mask    true if the image is masked\n     */\n    function addImagePng($file, $x, $y, $w = 0.0, $h = 0.0, &$img, $is_mask = false, $mask = null)\n    {\n        if (!function_exists(\"imagepng\")) {\n            throw new Exception(\"The PHP GD extension is required, but is not installed.\");\n        }\n\n        //if already cached, need not to read again\n        if (isset($this->imagelist[$file])) {\n            $data = null;\n        } else {\n            // Example for transparency handling on new image. Retain for current image\n            // $tIndex = imagecolortransparent($img);\n            // if ($tIndex > 0) {\n            //   $tColor    = imagecolorsforindex($img, $tIndex);\n            //   $new_tIndex    = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']);\n            //   imagefill($new_img, 0, 0, $new_tIndex);\n            //   imagecolortransparent($new_img, $new_tIndex);\n            // }\n            // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn\n            //imagealphablending($img, true);\n\n            //default, but explicitely set to ensure pdf compatibility\n            imagesavealpha($img, false/*!$is_mask && !$mask*/);\n\n            $error = 0;\n\n            ob_start();\n            @imagepng($img);\n            $data = ob_get_clean();\n\n            if ($data == '') {\n                $error = 1;\n                $errormsg = 'trouble writing file from GD';\n            }\n\n            if ($error) {\n                $this->addMessage('PNG error - (' . $file . ') ' . $errormsg);\n\n                return;\n            }\n        }  //End isset($this->imagelist[$file]) (png Duplicate removal)\n\n        $this->addPngFromBuf($file, $x, $y, $w, $h, $data, $is_mask, $mask);\n    }\n\n    protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte)\n    {\n        // generate images\n        $img = imagecreatefrompng($file);\n\n        if ($img === false) {\n            return;\n        }\n\n        // FIXME The pixel transformation doesn't work well with 8bit PNGs\n        $eight_bit = ($byte & 4) !== 4;\n\n        $wpx = imagesx($img);\n        $hpx = imagesy($img);\n\n        imagesavealpha($img, false);\n\n        // create temp alpha file\n        $tempfile_alpha = tempnam($this->tmp, \"cpdf_img_\");\n        @unlink($tempfile_alpha);\n        $tempfile_alpha = \"$tempfile_alpha.png\";\n\n        // create temp plain file\n        $tempfile_plain = tempnam($this->tmp, \"cpdf_img_\");\n        @unlink($tempfile_plain);\n        $tempfile_plain = \"$tempfile_plain.png\";\n\n        $imgalpha = imagecreate($wpx, $hpx);\n        imagesavealpha($imgalpha, false);\n\n        // generate gray scale palette (0 -> 255)\n        for ($c = 0; $c < 256; ++$c) {\n            imagecolorallocate($imgalpha, $c, $c, $c);\n        }\n\n        // Use PECL gmagick + Graphics Magic to process transparent PNG images\n        if (extension_loaded(\"gmagick\")) {\n            $gmagick = new Gmagick($file);\n            $gmagick->setimageformat('png');\n\n            // Get opacity channel (negative of alpha channel)\n            $alpha_channel_neg = clone $gmagick;\n            $alpha_channel_neg->separateimagechannel(Gmagick::CHANNEL_OPACITY);\n\n            // Negate opacity channel\n            $alpha_channel = new Gmagick();\n            $alpha_channel->newimage($wpx, $hpx, \"#FFFFFF\", \"png\");\n            $alpha_channel->compositeimage($alpha_channel_neg, Gmagick::COMPOSITE_DIFFERENCE, 0, 0);\n            $alpha_channel->separateimagechannel(Gmagick::CHANNEL_RED);\n            $alpha_channel->writeimage($tempfile_alpha);\n\n            // Cast to 8bit+palette\n            $imgalpha_ = imagecreatefrompng($tempfile_alpha);\n            imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx);\n            imagedestroy($imgalpha_);\n            imagepng($imgalpha, $tempfile_alpha);\n\n            // Make opaque image\n            $color_channels = new Gmagick();\n            $color_channels->newimage($wpx, $hpx, \"#FFFFFF\", \"png\");\n            $color_channels->compositeimage($gmagick, Gmagick::COMPOSITE_COPYRED, 0, 0);\n            $color_channels->compositeimage($gmagick, Gmagick::COMPOSITE_COPYGREEN, 0, 0);\n            $color_channels->compositeimage($gmagick, Gmagick::COMPOSITE_COPYBLUE, 0, 0);\n            $color_channels->writeimage($tempfile_plain);\n\n            $imgplain = imagecreatefrompng($tempfile_plain);\n        } // Use PECL imagick + ImageMagic to process transparent PNG images\n        elseif (extension_loaded(\"imagick\")) {\n            // Native cloning was added to pecl-imagick in svn commit 263814\n            // the first version containing it was 3.0.1RC1\n            static $imagickClonable = null;\n            if ($imagickClonable === null) {\n                $imagickClonable = version_compare(phpversion('imagick'), '3.0.1rc1') > 0;\n            }\n\n            $imagick = new Imagick($file);\n            $imagick->setFormat('png');\n\n            // Get opacity channel (negative of alpha channel)\n            $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone();\n            $alpha_channel->separateImageChannel(Imagick::CHANNEL_ALPHA);\n            $alpha_channel->negateImage(true);\n            $alpha_channel->writeImage($tempfile_alpha);\n\n            // Cast to 8bit+palette\n            $imgalpha_ = imagecreatefrompng($tempfile_alpha);\n            imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx);\n            imagedestroy($imgalpha_);\n            imagepng($imgalpha, $tempfile_alpha);\n\n            // Make opaque image\n            $color_channels = new Imagick();\n            $color_channels->newImage($wpx, $hpx, \"#FFFFFF\", \"png\");\n            $color_channels->compositeImage($imagick, Imagick::COMPOSITE_COPYRED, 0, 0);\n            $color_channels->compositeImage($imagick, Imagick::COMPOSITE_COPYGREEN, 0, 0);\n            $color_channels->compositeImage($imagick, Imagick::COMPOSITE_COPYBLUE, 0, 0);\n            $color_channels->writeImage($tempfile_plain);\n\n            $imgplain = imagecreatefrompng($tempfile_plain);\n        } else {\n            // allocated colors cache\n            $allocated_colors = array();\n\n            // extract alpha channel\n            for ($xpx = 0; $xpx < $wpx; ++$xpx) {\n                for ($ypx = 0; $ypx < $hpx; ++$ypx) {\n                    $color = imagecolorat($img, $xpx, $ypx);\n                    $col = imagecolorsforindex($img, $color);\n                    $alpha = $col['alpha'];\n\n                    if ($eight_bit) {\n                        // with gamma correction\n                        $gammacorr = 2.2;\n                        $pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255;\n                    } else {\n                        // without gamma correction\n                        $pixel = (127 - $alpha) * 2;\n\n                        $key = $col['red'] . $col['green'] . $col['blue'];\n\n                        if (!isset($allocated_colors[$key])) {\n                            $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']);\n                            $allocated_colors[$key] = $pixel_img;\n                        } else {\n                            $pixel_img = $allocated_colors[$key];\n                        }\n\n                        imagesetpixel($img, $xpx, $ypx, $pixel_img);\n                    }\n\n                    imagesetpixel($imgalpha, $xpx, $ypx, $pixel);\n                }\n            }\n\n            // extract image without alpha channel\n            $imgplain = imagecreatetruecolor($wpx, $hpx);\n            imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx);\n            imagedestroy($img);\n\n            imagepng($imgalpha, $tempfile_alpha);\n            imagepng($imgplain, $tempfile_plain);\n        }\n\n        // embed mask image\n        $this->addImagePng($tempfile_alpha, $x, $y, $w, $h, $imgalpha, true);\n        imagedestroy($imgalpha);\n\n        // embed image, masked with previously embedded mask\n        $this->addImagePng($tempfile_plain, $x, $y, $w, $h, $imgplain, false, true);\n        imagedestroy($imgplain);\n\n        // remove temp files\n        unlink($tempfile_alpha);\n        unlink($tempfile_plain);\n    }\n\n    /**\n     * add a PNG image into the document, from a file\n     * this should work with remote files\n     */\n    function addPngFromFile($file, $x, $y, $w = 0, $h = 0)\n    {\n        if (!function_exists(\"imagecreatefrompng\")) {\n            throw new Exception(\"The PHP GD extension is required, but is not installed.\");\n        }\n\n        //if already cached, need not to read again\n        if (isset($this->imagelist[$file])) {\n            $img = null;\n        } else {\n            $info = file_get_contents($file, false, null, 24, 5);\n            $meta = unpack(\"CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod\", $info);\n            $bit_depth = $meta[\"bitDepth\"];\n            $color_type = $meta[\"colorType\"];\n\n            // http://www.w3.org/TR/PNG/#11IHDR\n            // 3 => indexed\n            // 4 => greyscale with alpha\n            // 6 => fullcolor with alpha\n            $is_alpha = in_array($color_type, array(4, 6)) || ($color_type == 3 && $bit_depth != 4);\n\n            if ($is_alpha) { // exclude grayscale alpha\n                return $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type);\n            }\n\n            //png files typically contain an alpha channel.\n            //pdf file format or class.pdf does not support alpha blending.\n            //on alpha blended images, more transparent areas have a color near black.\n            //This appears in the result on not storing the alpha channel.\n            //Correct would be the box background image or its parent when transparent.\n            //But this would make the image dependent on the background.\n            //Therefore create an image with white background and copy in\n            //A more natural background than black is white.\n            //Therefore create an empty image with white background and merge the\n            //image in with alpha blending.\n            $imgtmp = @imagecreatefrompng($file);\n            if (!$imgtmp) {\n                return;\n            }\n            $sx = imagesx($imgtmp);\n            $sy = imagesy($imgtmp);\n            $img = imagecreatetruecolor($sx, $sy);\n            imagealphablending($img, true);\n\n            // @todo is it still needed ??\n            $ti = imagecolortransparent($imgtmp);\n            if ($ti >= 0) {\n                $tc = imagecolorsforindex($imgtmp, $ti);\n                $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']);\n                imagefill($img, 0, 0, $ti);\n                imagecolortransparent($img, $ti);\n            } else {\n                imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255));\n            }\n\n            imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy);\n            imagedestroy($imgtmp);\n        }\n        $this->addImagePng($file, $x, $y, $w, $h, $img);\n\n        if ($img) {\n            imagedestroy($img);\n        }\n    }\n\n    /**\n     * add a PNG image into the document, from a memory buffer of the file\n     */\n    function addPngFromBuf($file, $x, $y, $w = 0.0, $h = 0.0, &$data, $is_mask = false, $mask = null)\n    {\n        if (isset($this->imagelist[$file])) {\n            $data = null;\n            $info['width'] = $this->imagelist[$file]['w'];\n            $info['height'] = $this->imagelist[$file]['h'];\n            $label = $this->imagelist[$file]['label'];\n        } else {\n            if ($data == null) {\n                $this->addMessage('addPngFromBuf error - data not present!');\n\n                return;\n            }\n\n            $error = 0;\n\n            if (!$error) {\n                $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10);\n\n                if (mb_substr($data, 0, 8, '8bit') != $header) {\n                    $error = 1;\n\n                    $errormsg = 'this file does not have a valid header';\n                }\n            }\n\n            if (!$error) {\n                // set pointer\n                $p = 8;\n                $len = mb_strlen($data, '8bit');\n\n                // cycle through the file, identifying chunks\n                $haveHeader = 0;\n                $info = array();\n                $idata = '';\n                $pdata = '';\n\n                while ($p < $len) {\n                    $chunkLen = $this->getBytes($data, $p, 4);\n                    $chunkType = mb_substr($data, $p + 4, 4, '8bit');\n\n                    switch ($chunkType) {\n                        case 'IHDR':\n                            // this is where all the file information comes from\n                            $info['width'] = $this->getBytes($data, $p + 8, 4);\n                            $info['height'] = $this->getBytes($data, $p + 12, 4);\n                            $info['bitDepth'] = ord($data[$p + 16]);\n                            $info['colorType'] = ord($data[$p + 17]);\n                            $info['compressionMethod'] = ord($data[$p + 18]);\n                            $info['filterMethod'] = ord($data[$p + 19]);\n                            $info['interlaceMethod'] = ord($data[$p + 20]);\n\n                            //print_r($info);\n                            $haveHeader = 1;\n                            if ($info['compressionMethod'] != 0) {\n                                $error = 1;\n\n                                //debugpng\n                                if (DEBUGPNG) {\n                                    print '[addPngFromFile unsupported compression method ' . $file . ']';\n                                }\n\n                                $errormsg = 'unsupported compression method';\n                            }\n\n                            if ($info['filterMethod'] != 0) {\n                                $error = 1;\n\n                                //debugpng\n                                if (DEBUGPNG) {\n                                    print '[addPngFromFile unsupported filter method ' . $file . ']';\n                                }\n\n                                $errormsg = 'unsupported filter method';\n                            }\n                            break;\n\n                        case 'PLTE':\n                            $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit');\n                            break;\n\n                        case 'IDAT':\n                            $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit');\n                            break;\n\n                        case 'tRNS':\n                            //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk\n                            //print \"tRNS found, color type = \".$info['colorType'].\"\\n\";\n                            $transparency = array();\n\n                            switch ($info['colorType']) {\n                                // indexed color, rbg\n                                case 3:\n                                    /* corresponding to entries in the plte chunk\n                 Alpha for palette index 0: 1 byte\n                 Alpha for palette index 1: 1 byte\n                 ...etc...\n                */\n                                    // there will be one entry for each palette entry. up until the last non-opaque entry.\n                                    // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent)\n                                    $transparency['type'] = 'indexed';\n                                    $trans = 0;\n\n                                    for ($i = $chunkLen; $i >= 0; $i--) {\n                                        if (ord($data[$p + 8 + $i]) == 0) {\n                                            $trans = $i;\n                                        }\n                                    }\n\n                                    $transparency['data'] = $trans;\n                                    break;\n\n                                // grayscale\n                                case 0:\n                                    /* corresponding to entries in the plte chunk\n                 Gray: 2 bytes, range 0 .. (2^bitdepth)-1\n                */\n                                    //            $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale\n                                    $transparency['type'] = 'indexed';\n                                    $transparency['data'] = ord($data[$p + 8 + 1]);\n                                    break;\n\n                                // truecolor\n                                case 2:\n                                    /* corresponding to entries in the plte chunk\n                 Red: 2 bytes, range 0 .. (2^bitdepth)-1\n                 Green: 2 bytes, range 0 .. (2^bitdepth)-1\n                 Blue: 2 bytes, range 0 .. (2^bitdepth)-1\n                */\n                                    $transparency['r'] = $this->getBytes($data, $p + 8, 2);\n                                    // r from truecolor\n                                    $transparency['g'] = $this->getBytes($data, $p + 10, 2);\n                                    // g from truecolor\n                                    $transparency['b'] = $this->getBytes($data, $p + 12, 2);\n                                    // b from truecolor\n\n                                    $transparency['type'] = 'color-key';\n                                    break;\n\n                                //unsupported transparency type\n                                default:\n                                    if (DEBUGPNG) {\n                                        print '[addPngFromFile unsupported transparency type ' . $file . ']';\n                                    }\n                                    break;\n                            }\n\n                            // KS End new code\n                            break;\n\n                        default:\n                            break;\n                    }\n\n                    $p += $chunkLen + 12;\n                }\n\n                if (!$haveHeader) {\n                    $error = 1;\n\n                    //debugpng\n                    if (DEBUGPNG) {\n                        print '[addPngFromFile information header is missing ' . $file . ']';\n                    }\n\n                    $errormsg = 'information header is missing';\n                }\n\n                if (isset($info['interlaceMethod']) && $info['interlaceMethod']) {\n                    $error = 1;\n\n                    //debugpng\n                    if (DEBUGPNG) {\n                        print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']';\n                    }\n\n                    $errormsg = 'There appears to be no support for interlaced images in pdf.';\n                }\n            }\n\n            if (!$error && $info['bitDepth'] > 8) {\n                $error = 1;\n\n                //debugpng\n                if (DEBUGPNG) {\n                    print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']';\n                }\n\n                $errormsg = 'only bit depth of 8 or less is supported';\n            }\n\n            if (!$error) {\n                switch ($info['colorType']) {\n                    case 3:\n                        $color = 'DeviceRGB';\n                        $ncolor = 1;\n                        break;\n\n                    case 2:\n                        $color = 'DeviceRGB';\n                        $ncolor = 3;\n                        break;\n\n                    case 0:\n                        $color = 'DeviceGray';\n                        $ncolor = 1;\n                        break;\n\n                    default:\n                        $error = 1;\n\n                        //debugpng\n                        if (DEBUGPNG) {\n                            print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']';\n                        }\n\n                        $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.';\n                }\n            }\n\n            if ($error) {\n                $this->addMessage('PNG error - (' . $file . ') ' . $errormsg);\n\n                return;\n            }\n\n            //print_r($info);\n            // so this image is ok... add it in.\n            $this->numImages++;\n            $im = $this->numImages;\n            $label = \"I$im\";\n            $this->numObj++;\n\n            //  $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width']));\n            $options = array(\n                'label'            => $label,\n                'data'             => $idata,\n                'bitsPerComponent' => $info['bitDepth'],\n                'pdata'            => $pdata,\n                'iw'               => $info['width'],\n                'ih'               => $info['height'],\n                'type'             => 'png',\n                'color'            => $color,\n                'ncolor'           => $ncolor,\n                'masked'           => $mask,\n                'isMask'           => $is_mask\n            );\n\n            if (isset($transparency)) {\n                $options['transparency'] = $transparency;\n            }\n\n            $this->o_image($this->numObj, 'new', $options);\n            $this->imagelist[$file] = array('label' => $label, 'w' => $info['width'], 'h' => $info['height']);\n        }\n\n        if ($is_mask) {\n            return;\n        }\n\n        if ($w <= 0 && $h <= 0) {\n            $w = $info['width'];\n            $h = $info['height'];\n        }\n\n        if ($w <= 0) {\n            $w = $h / $info['height'] * $info['width'];\n        }\n\n        if ($h <= 0) {\n            $h = $w * $info['height'] / $info['width'];\n        }\n\n        $this->addContent(sprintf(\"\\nq\\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\\nQ\", $w, $h, $x, $y, $label));\n    }\n\n    /**\n     * add a JPEG image into the document, from a file\n     */\n    function addJpegFromFile($img, $x, $y, $w = 0, $h = 0)\n    {\n        // attempt to add a jpeg image straight from a file, using no GD commands\n        // note that this function is unable to operate on a remote file.\n\n        if (!file_exists($img)) {\n            return;\n        }\n\n        if ($this->image_iscached($img)) {\n            $data = null;\n            $imageWidth = $this->imagelist[$img]['w'];\n            $imageHeight = $this->imagelist[$img]['h'];\n            $channels = $this->imagelist[$img]['c'];\n        } else {\n            $tmp = getimagesize($img);\n            $imageWidth = $tmp[0];\n            $imageHeight = $tmp[1];\n\n            if (isset($tmp['channels'])) {\n                $channels = $tmp['channels'];\n            } else {\n                $channels = 3;\n            }\n\n            $data = file_get_contents($img);\n        }\n\n        if ($w <= 0 && $h <= 0) {\n            $w = $imageWidth;\n        }\n\n        if ($w == 0) {\n            $w = $h / $imageHeight * $imageWidth;\n        }\n\n        if ($h == 0) {\n            $h = $w * $imageHeight / $imageWidth;\n        }\n\n        $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img);\n    }\n\n    /**\n     * common code used by the two JPEG adding functions\n     */\n    private function addJpegImage_common(\n        &$data,\n        $x,\n        $y,\n        $w = 0,\n        $h = 0,\n        $imageWidth,\n        $imageHeight,\n        $channels = 3,\n        $imgname\n    ) {\n        if ($this->image_iscached($imgname)) {\n            $label = $this->imagelist[$imgname]['label'];\n            //debugpng\n            //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']';\n\n        } else {\n            if ($data == null) {\n                $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!');\n\n                return;\n            }\n\n            // note that this function is not to be called externally\n            // it is just the common code between the GD and the file options\n            $this->numImages++;\n            $im = $this->numImages;\n            $label = \"I$im\";\n            $this->numObj++;\n\n            $this->o_image(\n                $this->numObj,\n                'new',\n                array(\n                    'label'    => $label,\n                    'data'     => &$data,\n                    'iw'       => $imageWidth,\n                    'ih'       => $imageHeight,\n                    'channels' => $channels\n                )\n            );\n\n            $this->imagelist[$imgname] = array(\n                'label' => $label,\n                'w'     => $imageWidth,\n                'h'     => $imageHeight,\n                'c'     => $channels\n            );\n        }\n\n        $this->addContent(sprintf(\"\\nq\\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\\nQ \", $w, $h, $x, $y, $label));\n    }\n\n    /**\n     * specify where the document should open when it first starts\n     */\n    function openHere($style, $a = 0, $b = 0, $c = 0)\n    {\n        // this function will open the document at a specified page, in a specified style\n        // the values for style, and the required paramters are:\n        // 'XYZ'  left, top, zoom\n        // 'Fit'\n        // 'FitH' top\n        // 'FitV' left\n        // 'FitR' left,bottom,right\n        // 'FitB'\n        // 'FitBH' top\n        // 'FitBV' left\n        $this->numObj++;\n        $this->o_destination(\n            $this->numObj,\n            'new',\n            array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)\n        );\n        $id = $this->catalogId;\n        $this->o_catalog($id, 'openHere', $this->numObj);\n    }\n\n    /**\n     * Add JavaScript code to the PDF document\n     *\n     * @param string $code\n     *\n     * @return void\n     */\n    function addJavascript($code)\n    {\n        $this->javascript .= $code;\n    }\n\n    /**\n     * create a labelled destination within the document\n     */\n    function addDestination($label, $style, $a = 0, $b = 0, $c = 0)\n    {\n        // associates the given label with the destination, it is done this way so that a destination can be specified after\n        // it has been linked to\n        // styles are the same as the 'openHere' function\n        $this->numObj++;\n        $this->o_destination(\n            $this->numObj,\n            'new',\n            array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)\n        );\n        $id = $this->numObj;\n\n        // store the label->idf relationship, note that this means that labels can be used only once\n        $this->destinations[\"$label\"] = $id;\n    }\n\n    /**\n     * define font families, this is used to initialize the font families for the default fonts\n     * and for the user to add new ones for their fonts. The default bahavious can be overridden should\n     * that be desired.\n     */\n    function setFontFamily($family, $options = '')\n    {\n        if (!is_array($options)) {\n            if ($family === 'init') {\n                // set the known family groups\n                // these font families will be used to enable bold and italic markers to be included\n                // within text streams. html forms will be used... <b></b> <i></i>\n                $this->fontFamilies['Helvetica.afm'] =\n                    array(\n                        'b'  => 'Helvetica-Bold.afm',\n                        'i'  => 'Helvetica-Oblique.afm',\n                        'bi' => 'Helvetica-BoldOblique.afm',\n                        'ib' => 'Helvetica-BoldOblique.afm'\n                    );\n\n                $this->fontFamilies['Courier.afm'] =\n                    array(\n                        'b'  => 'Courier-Bold.afm',\n                        'i'  => 'Courier-Oblique.afm',\n                        'bi' => 'Courier-BoldOblique.afm',\n                        'ib' => 'Courier-BoldOblique.afm'\n                    );\n\n                $this->fontFamilies['Times-Roman.afm'] =\n                    array(\n                        'b'  => 'Times-Bold.afm',\n                        'i'  => 'Times-Italic.afm',\n                        'bi' => 'Times-BoldItalic.afm',\n                        'ib' => 'Times-BoldItalic.afm'\n                    );\n            }\n        } else {\n\n            // the user is trying to set a font family\n            // note that this can also be used to set the base ones to something else\n            if (mb_strlen($family)) {\n                $this->fontFamilies[$family] = $options;\n            }\n        }\n    }\n\n    /**\n     * used to add messages for use in debugging\n     */\n    function addMessage($message)\n    {\n        $this->messages .= $message . \"\\n\";\n    }\n\n    /**\n     * a few functions which should allow the document to be treated transactionally.\n     */\n    function transaction($action)\n    {\n        switch ($action) {\n            case 'start':\n                // store all the data away into the checkpoint variable\n                $data = get_object_vars($this);\n                $this->checkpoint = $data;\n                unset($data);\n                break;\n\n            case 'commit':\n                if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) {\n                    $tmp = $this->checkpoint['checkpoint'];\n                    $this->checkpoint = $tmp;\n                    unset($tmp);\n                } else {\n                    $this->checkpoint = '';\n                }\n                break;\n\n            case 'rewind':\n                // do not destroy the current checkpoint, but move us back to the state then, so that we can try again\n                if (is_array($this->checkpoint)) {\n                    // can only abort if were inside a checkpoint\n                    $tmp = $this->checkpoint;\n\n                    foreach ($tmp as $k => $v) {\n                        if ($k !== 'checkpoint') {\n                            $this->$k = $v;\n                        }\n                    }\n                    unset($tmp);\n                }\n                break;\n\n            case 'abort':\n                if (is_array($this->checkpoint)) {\n                    // can only abort if were inside a checkpoint\n                    $tmp = $this->checkpoint;\n                    foreach ($tmp as $k => $v) {\n                        $this->$k = $v;\n                    }\n                    unset($tmp);\n                }\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Surface;\n\nuse Svg\\Document;\nuse Svg\\Style;\n\nclass SurfaceCpdf implements SurfaceInterface\n{\n    const DEBUG = false;\n\n    /** @var \\Svg\\Surface\\CPdf */\n    private $canvas;\n\n    private $width;\n    private $height;\n\n    /** @var Style */\n    private $style;\n\n    public function __construct(Document $doc, $canvas = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $dimensions = $doc->getDimensions();\n        $w = $dimensions[\"width\"];\n        $h = $dimensions[\"height\"];\n\n        if (!$canvas) {\n            $canvas = new \\Svg\\Surface\\CPdf(array(0, 0, $w, $h));\n            $refl = new \\ReflectionClass($canvas);\n            $canvas->fontcache = realpath(dirname($refl->getFileName()) . \"/../../fonts/\").\"/\";\n        }\n\n        // Flip PDF coordinate system so that the origin is in\n        // the top left rather than the bottom left\n        $canvas->transform(array(\n            1,  0,\n            0, -1,\n            0, $h\n        ));\n\n        $this->width  = $w;\n        $this->height = $h;\n\n        $this->canvas = $canvas;\n    }\n\n    function out()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        return $this->canvas->output();\n    }\n\n    public function save()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->save();\n    }\n\n    public function restore()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->restore();\n    }\n\n    public function scale($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->transform($x, 0, 0, $y, 0, 0);\n    }\n\n    public function rotate($angle)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $a = deg2rad($angle);\n        $cos_a = cos($a);\n        $sin_a = sin($a);\n\n        $this->transform(\n            $cos_a,                         $sin_a,\n            -$sin_a,                         $cos_a,\n            0, 0\n        );\n    }\n\n    public function translate($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->transform(\n            1,  0,\n            0,  1,\n            $x, $y\n        );\n    }\n\n    public function transform($a, $b, $c, $d, $e, $f)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->canvas->transform(array($a, $b, $c, $d, $e, $f));\n    }\n\n    public function beginPath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        // TODO: Implement beginPath() method.\n    }\n\n    public function closePath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->closePath();\n    }\n\n    public function fillStroke()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->fillStroke();\n    }\n\n    public function clip()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->clip();\n    }\n\n    public function fillText($text, $x, $y, $maxWidth = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->addText($x, $y, $this->style->fontSize, $text);\n    }\n\n    public function strokeText($text, $x, $y, $maxWidth = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->addText($x, $y, $this->style->fontSize, $text);\n    }\n\n    public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        if (strpos($image, \"data:\") === 0) {\n            $parts = explode(',', $image, 2);\n\n            $data = $parts[1];\n            $base64 = false;\n\n            $token = strtok($parts[0], ';');\n            while ($token !== false) {\n                if ($token == 'base64') {\n                    $base64 = true;\n                }\n\n                $token = strtok(';');\n            }\n\n            if ($base64) {\n                $data = base64_decode($data);\n            }\n        }\n        else {\n            $data = file_get_contents($image);\n        }\n\n        $image = tempnam(sys_get_temp_dir(), \"svg\");\n        file_put_contents($image, $data);\n\n        $img = $this->image($image, $sx, $sy, $sw, $sh, \"normal\");\n\n\n        unlink($image);\n    }\n\n    public static function getimagesize($filename)\n    {\n        static $cache = array();\n\n        if (isset($cache[$filename])) {\n            return $cache[$filename];\n        }\n\n        list($width, $height, $type) = getimagesize($filename);\n\n        if ($width == null || $height == null) {\n            $data = file_get_contents($filename, null, null, 0, 26);\n\n            if (substr($data, 0, 2) === \"BM\") {\n                $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data);\n                $width = (int)$meta['width'];\n                $height = (int)$meta['height'];\n                $type = IMAGETYPE_BMP;\n            }\n        }\n\n        return $cache[$filename] = array($width, $height, $type);\n    }\n\n    function image($img, $x, $y, $w, $h, $resolution = \"normal\")\n    {\n        list($width, $height, $type) = $this->getimagesize($img);\n\n        switch ($type) {\n            case IMAGETYPE_JPEG:\n                $this->canvas->addJpegFromFile($img, $x, $y - $h, $w, $h);\n                break;\n\n            case IMAGETYPE_GIF:\n            case IMAGETYPE_BMP:\n                // @todo use cache for BMP and GIF\n                $img = $this->_convert_gif_bmp_to_png($img, $type);\n\n            case IMAGETYPE_PNG:\n                $this->canvas->addPngFromFile($img, $x, $y - $h, $w, $h);\n                break;\n\n            default:\n        }\n    }\n\n    public function lineTo($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->lineTo($x, $y);\n    }\n\n    public function moveTo($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->moveTo($x, $y);\n    }\n\n    public function quadraticCurveTo($cpx, $cpy, $x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        // FIXME not accurate\n        $this->canvas->quadTo($cpx, $cpy, $x, $y);\n    }\n\n    public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->curveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y);\n    }\n\n    public function arcTo($x1, $y1, $x2, $y2, $radius)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n    }\n\n    public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, $startAngle, $endAngle, false, false, false, true);\n    }\n\n    public function circle($x, $y, $radius)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, 0, 360, true, false, false, false);\n    }\n\n    public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->ellipse($x, $y, $radiusX, $radiusY, 0, 8, 0, 360, false, false, false, false);\n    }\n\n    public function fillRect($x, $y, $w, $h)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->rect($x, $y, $w, $h);\n        $this->fill();\n    }\n\n    public function rect($x, $y, $w, $h, $rx = 0, $ry = 0)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $canvas = $this->canvas;\n\n        if ($rx <= 0.000001/* && $ry <= 0.000001*/) {\n            $canvas->rect($x, $y, $w, $h);\n\n            return;\n        }\n\n        $rx = min($rx, $w / 2);\n        $rx = min($rx, $h / 2);\n\n        /* Define a path for a rectangle with corners rounded by a given radius.\n         * Start from the lower left corner and proceed counterclockwise.\n         */\n        $this->moveTo($x + $rx, $y);\n\n        /* Start of the arc segment in the lower right corner */\n        $this->lineTo($x + $w - $rx, $y);\n\n        /* Arc segment in the lower right corner */\n        $this->arc($x + $w - $rx, $y + $rx, $rx, 270, 360);\n\n        /* Start of the arc segment in the upper right corner */\n        $this->lineTo($x + $w, $y + $h - $rx );\n\n        /* Arc segment in the upper right corner */\n        $this->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90);\n\n        /* Start of the arc segment in the upper left corner */\n        $this->lineTo($x + $rx, $y + $h);\n\n        /* Arc segment in the upper left corner */\n        $this->arc($x + $rx, $y + $h - $rx, $rx, 90, 180);\n\n        /* Start of the arc segment in the lower left corner */\n        $this->lineTo($x , $y + $rx);\n\n        /* Arc segment in the lower left corner */\n        $this->arc($x + $rx, $y + $rx, $rx, 180, 270);\n    }\n\n    public function fill()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->fill();\n    }\n\n    public function strokeRect($x, $y, $w, $h)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->rect($x, $y, $w, $h);\n        $this->stroke();\n    }\n\n    public function stroke()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->stroke();\n    }\n\n    public function endPath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->endPath();\n    }\n\n    public function measureText($text)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $style = $this->getStyle();\n        $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight);\n\n        return $this->canvas->getTextWidth($this->getStyle()->fontSize, $text);\n    }\n\n    public function getStyle()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        return $this->style;\n    }\n\n    public function setStyle(Style $style)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->style = $style;\n        $canvas = $this->canvas;\n\n        if (is_array($style->stroke) && $stroke = $style->stroke) {\n            $canvas->setStrokeColor(array((float)$stroke[0]/255, (float)$stroke[1]/255, (float)$stroke[2]/255), true);\n        }\n\n        if (is_array($style->fill) && $fill = $style->fill) {\n            $canvas->setColor(array((float)$fill[0]/255, (float)$fill[1]/255, (float)$fill[2]/255), true);\n        }\n\n        if ($fillRule = strtolower($style->fillRule)) {\n            $canvas->setFillRule($fillRule);\n        }\n\n        $opacity = $style->opacity;\n        if ($opacity !== null && $opacity < 1.0) {\n            $canvas->setLineTransparency(\"Normal\", $opacity);\n            $canvas->currentLineTransparency = null;\n\n            $canvas->setFillTransparency(\"Normal\", $opacity);\n            $canvas->currentFillTransparency = null;\n        }\n        else {\n            $fillOpacity = $style->fillOpacity;\n            if ($fillOpacity !== null && $fillOpacity < 1.0) {\n                $canvas->setFillTransparency(\"Normal\", $fillOpacity);\n                $canvas->currentFillTransparency = null;\n            }\n\n            $strokeOpacity = $style->strokeOpacity;\n            if ($strokeOpacity !== null && $strokeOpacity < 1.0) {\n                $canvas->setLineTransparency(\"Normal\", $strokeOpacity);\n                $canvas->currentLineTransparency = null;\n            }\n        }\n\n        $dashArray = null;\n        if ($style->strokeDasharray) {\n            $dashArray = preg_split('/\\s*,\\s*/', $style->strokeDasharray);\n        }\n\n\n        $phase=0;\n        if ($style->strokeDashoffset) {\n           $phase = $style->strokeDashoffset;\n        }\n\n\n        $canvas->setLineStyle(\n            $style->strokeWidth,\n            $style->strokeLinecap,\n            $style->strokeLinejoin,\n            $dashArray,\n            $phase\n        );\n\n        $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight);\n    }\n\n    public function setFont($family, $style, $weight)\n    {\n        $map = array(\n            \"serif\"      => \"Times\",\n            \"sans-serif\" => \"Helvetica\",\n            \"fantasy\"    => \"Symbol\",\n            \"cursive\"    => \"Times\",\n            \"monospace\"  => \"Courier\",\n\n            \"arial\"      => \"Helvetica\",\n            \"verdana\"    => \"Helvetica\",\n        );\n\n        $styleMap = array(\n            'Helvetica' => array(\n                'b'  => 'Helvetica-Bold',\n                'i'  => 'Helvetica-Oblique',\n                'bi' => 'Helvetica-BoldOblique',\n            ),\n            'Courier' => array(\n                'b'  => 'Courier-Bold',\n                'i'  => 'Courier-Oblique',\n                'bi' => 'Courier-BoldOblique',\n            ),\n            'Times' => array(\n                ''   => 'Times-Roman',\n                'b'  => 'Times-Bold',\n                'i'  => 'Times-Italic',\n                'bi' => 'Times-BoldItalic',\n            ),\n        );\n\n        $family = strtolower($family);\n        $style  = strtolower($style);\n        $weight = strtolower($weight);\n\n        if (isset($map[$family])) {\n            $family = $map[$family];\n        }\n\n        if (isset($styleMap[$family])) {\n            $key = \"\";\n\n            if ($weight === \"bold\" || $weight === \"bolder\" || (is_numeric($weight) && $weight >= 600)) {\n                $key .= \"b\";\n            }\n\n            if ($style === \"italic\" || $style === \"oblique\") {\n                $key .= \"i\";\n            }\n\n            if (isset($styleMap[$family][$key])) {\n                $family = $styleMap[$family][$key];\n            }\n        }\n\n        $this->canvas->selectFont(\"$family.afm\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Surface/SurfaceGmagick.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Surface;\n\nuse Svg\\Style;\n\nclass SurfaceGmagick implements SurfaceInterface\n{\n    const DEBUG = false;\n\n    /** @var \\GmagickDraw */\n    private $canvas;\n\n    private $width;\n    private $height;\n\n    /** @var Style */\n    private $style;\n\n    public function __construct($w, $h)\n    {\n        if (self::DEBUG) {\n            echo __FUNCTION__ . \"\\n\";\n        }\n        $this->width = $w;\n        $this->height = $h;\n\n        $canvas = new \\GmagickDraw();\n\n        $this->canvas = $canvas;\n    }\n\n    function out()\n    {\n        if (self::DEBUG) {\n            echo __FUNCTION__ . \"\\n\";\n        }\n\n        $image = new \\Gmagick();\n        $image->newimage($this->width, $this->height);\n        $image->drawimage($this->canvas);\n\n        $tmp = tempnam(sys_get_temp_dir(), \"gm\");\n\n        $image->write($tmp);\n\n        return file_get_contents($tmp);\n    }\n\n    public function save()\n    {\n        if (self::DEBUG) {\n            echo __FUNCTION__ . \"\\n\";\n        }\n        $this->canvas->save();\n    }\n\n    public function restore()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->restore();\n    }\n\n    public function scale($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->scale($x, $y);\n    }\n\n    public function rotate($angle)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->rotate($angle);\n    }\n\n    public function translate($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->translate($x, $y);\n    }\n\n    public function transform($a, $b, $c, $d, $e, $f)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->concat($a, $b, $c, $d, $e, $f);\n    }\n\n    public function beginPath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        // TODO: Implement beginPath() method.\n    }\n\n    public function closePath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->closepath();\n    }\n\n    public function fillStroke()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->fill_stroke();\n    }\n\n    public function clip()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->clip();\n    }\n\n    public function fillText($text, $x, $y, $maxWidth = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->set_text_pos($x, $y);\n        $this->canvas->show($text);\n    }\n\n    public function strokeText($text, $x, $y, $maxWidth = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        // TODO: Implement drawImage() method.\n    }\n\n    public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        if (strpos($image, \"data:\") === 0) {\n            $data = substr($image, strpos($image, \";\") + 1);\n            if (strpos($data, \"base64\") === 0) {\n                $data = base64_decode(substr($data, 7));\n            }\n\n            $image = tempnam(sys_get_temp_dir(), \"svg\");\n            file_put_contents($image, $data);\n        }\n\n        $img = $this->canvas->load_image(\"auto\", $image, \"\");\n\n        $sy = $sy - $sh;\n        $this->canvas->fit_image($img, $sx, $sy, 'boxsize={' . \"$sw $sh\" . '} fitmethod=entire');\n    }\n\n    public function lineTo($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->lineto($x, $y);\n    }\n\n    public function moveTo($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->moveto($x, $y);\n    }\n\n    public function quadraticCurveTo($cpx, $cpy, $x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        // TODO: Implement quadraticCurveTo() method.\n    }\n\n    public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->curveto($cp1x, $cp1y, $cp2x, $cp2y, $x, $y);\n    }\n\n    public function arcTo($x1, $y1, $x2, $y2, $radius)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n    }\n\n    public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->arc($x, $y, $radius, $startAngle, $endAngle);\n    }\n\n    public function circle($x, $y, $radius)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->circle($x, $y, $radius);\n    }\n\n    public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->ellipse($x, $y, $radiusX, $radiusY);\n    }\n\n    public function fillRect($x, $y, $w, $h)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->rect($x, $y, $w, $h);\n        $this->fill();\n    }\n\n    public function rect($x, $y, $w, $h, $rx = 0, $ry = 0)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->rect($x, $y, $w, $h);\n    }\n\n    public function fill()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->fill();\n    }\n\n    public function strokeRect($x, $y, $w, $h)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->rect($x, $y, $w, $h);\n        $this->stroke();\n    }\n\n    public function stroke()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->stroke();\n    }\n\n    public function endPath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        //$this->canvas->endPath();\n    }\n\n    public function measureText($text)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $style = $this->getStyle();\n        $font = $this->getFont($style->fontFamily, $style->fontStyle);\n\n        return $this->canvas->stringwidth($text, $font, $this->getStyle()->fontSize);\n    }\n\n    public function getStyle()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        return $this->style;\n    }\n\n    public function setStyle(Style $style)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->style = $style;\n        $canvas = $this->canvas;\n\n        if (is_array($style->stroke) && $stroke = $style->stroke) {\n            $canvas->setcolor(\"stroke\", \"rgb\", $stroke[0] / 255, $stroke[1] / 255, $stroke[2] / 255, null);\n        }\n\n        if (is_array($style->fill) && $fill = $style->fill) {\n           // $canvas->setcolor(\"fill\", \"rgb\", $fill[0] / 255, $fill[1] / 255, $fill[2] / 255, null);\n        }\n\n        $opts = array();\n        if ($style->strokeWidth > 0.000001) {\n            $opts[] = \"linewidth=$style->strokeWidth\";\n        }\n\n        if (in_array($style->strokeLinecap, array(\"butt\", \"round\", \"projecting\"))) {\n            $opts[] = \"linecap=$style->strokeLinecap\";\n        }\n\n        if (in_array($style->strokeLinejoin, array(\"miter\", \"round\", \"bevel\"))) {\n            $opts[] = \"linejoin=$style->strokeLinejoin\";\n        }\n\n        $canvas->set_graphics_option(implode(\" \", $opts));\n\n        $font = $this->getFont($style->fontFamily, $style->fontStyle);\n        $canvas->setfont($font, $style->fontSize);\n    }\n\n    private function getFont($family, $style)\n    {\n        $map = array(\n            \"serif\"      => \"Times\",\n            \"sans-serif\" => \"Helvetica\",\n            \"fantasy\"    => \"Symbol\",\n            \"cursive\"    => \"serif\",\n            \"monospance\" => \"Courier\",\n        );\n\n        $family = strtolower($family);\n        if (isset($map[$family])) {\n            $family = $map[$family];\n        }\n\n        return $this->canvas->load_font($family, \"unicode\", \"fontstyle=$style\");\n    }\n\n    public function setFont($family, $style, $weight)\n    {\n        // TODO: Implement setFont() method.\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Surface/SurfaceInterface.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Surface;\n\nuse Svg\\Style;\n\n/**\n * Interface Surface, like CanvasRenderingContext2D\n *\n * @package Svg\n */\ninterface SurfaceInterface\n{\n    public function save();\n\n    public function restore();\n\n    // transformations (default transform is the identity matrix)\n    public function scale($x, $y);\n\n    public function rotate($angle);\n\n    public function translate($x, $y);\n\n    public function transform($a, $b, $c, $d, $e, $f);\n\n    // path ends\n    public function beginPath();\n\n    public function closePath();\n\n    public function fill();\n\n    public function stroke();\n\n    public function endPath();\n\n    public function fillStroke();\n\n    public function clip();\n\n    // text (see also the CanvasDrawingStyles interface)\n    public function fillText($text, $x, $y, $maxWidth = null);\n\n    public function strokeText($text, $x, $y, $maxWidth = null);\n\n    public function measureText($text);\n\n    // drawing images\n    public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null);\n\n    // paths\n    public function lineTo($x, $y);\n\n    public function moveTo($x, $y);\n\n    public function quadraticCurveTo($cpx, $cpy, $x, $y);\n\n    public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y);\n\n    public function arcTo($x1, $y1, $x2, $y2, $radius);\n\n    public function circle($x, $y, $radius);\n\n    public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false);\n\n    public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise);\n\n    // Rectangle\n    public function rect($x, $y, $w, $h, $rx = 0, $ry = 0);\n\n    public function fillRect($x, $y, $w, $h);\n\n    public function strokeRect($x, $y, $w, $h);\n\n    public function setStyle(Style $style);\n\n    /**\n     * @return Style\n     */\n    public function getStyle();\n\n    public function setFont($family, $style, $weight);\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Surface/SurfacePDFLib.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Surface;\n\nuse Svg\\Style;\nuse Svg\\Document;\n\nclass SurfacePDFLib implements SurfaceInterface\n{\n    const DEBUG = false;\n\n    private $canvas;\n\n    private $width;\n    private $height;\n\n    /** @var Style */\n    private $style;\n\n    public function __construct(Document $doc, $canvas = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $dimensions = $doc->getDimensions();\n        $w = $dimensions[\"width\"];\n        $h = $dimensions[\"height\"];\n\n        if (!$canvas) {\n            $canvas = new \\PDFlib();\n\n            /* all strings are expected as utf8 */\n            $canvas->set_option(\"stringformat=utf8\");\n            $canvas->set_option(\"errorpolicy=return\");\n\n            /*  open new PDF file; insert a file name to create the PDF on disk */\n            if ($canvas->begin_document(\"\", \"\") == 0) {\n                die(\"Error: \" . $canvas->get_errmsg());\n            }\n            $canvas->set_info(\"Creator\", \"PDFlib starter sample\");\n            $canvas->set_info(\"Title\", \"starter_graphics\");\n\n            $canvas->begin_page_ext($w, $h, \"\");\n        }\n\n        // Flip PDF coordinate system so that the origin is in\n        // the top left rather than the bottom left\n        $canvas->setmatrix(\n            1, 0,\n            0, -1,\n            0, $h\n        );\n\n        $this->width  = $w;\n        $this->height = $h;\n\n        $this->canvas = $canvas;\n    }\n\n    function out()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->canvas->end_page_ext(\"\");\n        $this->canvas->end_document(\"\");\n\n        return $this->canvas->get_buffer();\n    }\n\n    public function save()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->save();\n    }\n\n    public function restore()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->restore();\n    }\n\n    public function scale($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->scale($x, $y);\n    }\n\n    public function rotate($angle)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->rotate($angle);\n    }\n\n    public function translate($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->translate($x, $y);\n    }\n\n    public function transform($a, $b, $c, $d, $e, $f)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->concat($a, $b, $c, $d, $e, $f);\n    }\n\n    public function beginPath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        // TODO: Implement beginPath() method.\n    }\n\n    public function closePath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->closepath();\n    }\n\n    public function fillStroke()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->fill_stroke();\n    }\n\n    public function clip()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->clip();\n    }\n\n    public function fillText($text, $x, $y, $maxWidth = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->set_text_pos($x, $y);\n        $this->canvas->show($text);\n    }\n\n    public function strokeText($text, $x, $y, $maxWidth = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        // TODO: Implement drawImage() method.\n    }\n\n    public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        if (strpos($image, \"data:\") === 0) {\n            $data = substr($image, strpos($image, \";\") + 1);\n            if (strpos($data, \"base64\") === 0) {\n                $data = base64_decode(substr($data, 7));\n            }\n        }\n        else {\n            $data = file_get_contents($image);\n        }\n\n        $image = tempnam(sys_get_temp_dir(), \"svg\");\n        file_put_contents($image, $data);\n\n        $img = $this->canvas->load_image(\"auto\", $image, \"\");\n\n        $sy = $sy - $sh;\n        $this->canvas->fit_image($img, $sx, $sy, 'boxsize={' . \"$sw $sh\" . '} fitmethod=entire');\n\n        unlink($image);\n    }\n\n    public function lineTo($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->lineto($x, $y);\n    }\n\n    public function moveTo($x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->moveto($x, $y);\n    }\n\n    public function quadraticCurveTo($cpx, $cpy, $x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        // FIXME not accurate\n        $this->canvas->curveTo($cpx, $cpy, $cpx, $cpy, $x, $y);\n    }\n\n    public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->curveto($cp1x, $cp1y, $cp2x, $cp2y, $x, $y);\n    }\n\n    public function arcTo($x1, $y1, $x2, $y2, $radius)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n    }\n\n    public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->arc($x, $y, $radius, $startAngle, $endAngle);\n    }\n\n    public function circle($x, $y, $radius)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->circle($x, $y, $radius);\n    }\n\n    public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->ellipse($x, $y, $radiusX, $radiusY);\n    }\n\n    public function fillRect($x, $y, $w, $h)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->rect($x, $y, $w, $h);\n        $this->fill();\n    }\n\n    public function rect($x, $y, $w, $h, $rx = 0, $ry = 0)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $canvas = $this->canvas;\n\n        if ($rx <= 0.000001/* && $ry <= 0.000001*/) {\n            $canvas->rect($x, $y, $w, $h);\n\n            return;\n        }\n\n        /* Define a path for a rectangle with corners rounded by a given radius.\n         * Start from the lower left corner and proceed counterclockwise.\n         */\n        $canvas->moveto($x + $rx, $y);\n\n        /* Start of the arc segment in the lower right corner */\n        $canvas->lineto($x + $w - $rx, $y);\n\n        /* Arc segment in the lower right corner */\n        $canvas->arc($x + $w - $rx, $y + $rx, $rx, 270, 360);\n\n        /* Start of the arc segment in the upper right corner */\n        $canvas->lineto($x + $w, $y + $h - $rx );\n\n        /* Arc segment in the upper right corner */\n        $canvas->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90);\n\n        /* Start of the arc segment in the upper left corner */\n        $canvas->lineto($x + $rx, $y + $h);\n\n        /* Arc segment in the upper left corner */\n        $canvas->arc($x + $rx, $y + $h - $rx, $rx, 90, 180);\n\n        /* Start of the arc segment in the lower left corner */\n        $canvas->lineto($x , $y + $rx);\n\n        /* Arc segment in the lower left corner */\n        $canvas->arc($x + $rx, $y + $rx, $rx, 180, 270);\n    }\n\n    public function fill()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->fill();\n    }\n\n    public function strokeRect($x, $y, $w, $h)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->rect($x, $y, $w, $h);\n        $this->stroke();\n    }\n\n    public function stroke()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->stroke();\n    }\n\n    public function endPath()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $this->canvas->endPath();\n    }\n\n    public function measureText($text)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        $style = $this->getStyle();\n        $font = $this->getFont($style->fontFamily, $style->fontStyle);\n\n        return $this->canvas->stringwidth($text, $font, $this->getStyle()->fontSize);\n    }\n\n    public function getStyle()\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n        return $this->style;\n    }\n\n    public function setStyle(Style $style)\n    {\n        if (self::DEBUG) echo __FUNCTION__ . \"\\n\";\n\n        $this->style = $style;\n        $canvas = $this->canvas;\n\n        if ($stroke = $style->stroke && is_array($style->stroke)) {\n            $canvas->setcolor(\n                \"stroke\",\n                \"rgb\",\n                $stroke[0] / 255,\n                $stroke[1] / 255,\n                $stroke[2] / 255,\n                null\n            );\n        }\n\n        if ($fill = $style->fill && is_array($style->fill)) {\n            $canvas->setcolor(\n                \"fill\",\n                \"rgb\",\n                $fill[0] / 255,\n                $fill[1] / 255,\n                $fill[2] / 255,\n                null\n            );\n        }\n\n        if ($fillRule = strtolower($style->fillRule)) {\n            $map = array(\n                \"nonzero\" => \"winding\",\n                \"evenodd\" => \"evenodd\",\n            );\n\n            if (isset($map[$fillRule])) {\n                $fillRule = $map[$fillRule];\n\n                $canvas->set_parameter(\"fillrule\", $fillRule);\n            }\n        }\n\n        $opts = array();\n        if ($style->strokeWidth > 0.000001) {\n            $opts[] = \"linewidth=$style->strokeWidth\";\n        }\n\n        if (in_array($style->strokeLinecap, array(\"butt\", \"round\", \"projecting\"))) {\n            $opts[] = \"linecap=$style->strokeLinecap\";\n        }\n\n        if (in_array($style->strokeLinejoin, array(\"miter\", \"round\", \"bevel\"))) {\n            $opts[] = \"linejoin=$style->strokeLinejoin\";\n        }\n\n        $canvas->set_graphics_option(implode(\" \", $opts));\n\n        $opts = array();\n        $opacity = $style->opacity;\n        if ($opacity !== null && $opacity < 1.0) {\n            $opts[] = \"opacityfill=$opacity\";\n            $opts[] = \"opacitystroke=$opacity\";\n        }\n        else {\n            $fillOpacity = $style->fillOpacity;\n            if ($fillOpacity !== null && $fillOpacity < 1.0) {\n                $opts[] = \"opacityfill=$fillOpacity\";\n            }\n\n            $strokeOpacity = $style->strokeOpacity;\n            if ($strokeOpacity !== null && $strokeOpacity < 1.0) {\n                $opts[] = \"opacitystroke=$strokeOpacity\";\n            }\n        }\n\n        if (count($opts)) {\n            $gs = $canvas->create_gstate(implode(\" \", $opts));\n            $canvas->set_gstate($gs);\n        }\n\n        $font = $this->getFont($style->fontFamily, $style->fontStyle);\n        if ($font) {\n            $canvas->setfont($font, $style->fontSize);\n        }\n    }\n\n    private function getFont($family, $style)\n    {\n        $map = array(\n            \"serif\"      => \"Times\",\n            \"sans-serif\" => \"Helvetica\",\n            \"fantasy\"    => \"Symbol\",\n            \"cursive\"    => \"Times\",\n            \"monospace\"  => \"Courier\",\n\n            \"arial\"      => \"Helvetica\",\n            \"verdana\"    => \"Helvetica\",\n        );\n\n        $family = strtolower($family);\n        if (isset($map[$family])) {\n            $family = $map[$family];\n        }\n\n        return $this->canvas->load_font($family, \"unicode\", \"fontstyle=$style\");\n    }\n\n    public function setFont($family, $style, $weight)\n    {\n        // TODO: Implement setFont() method.\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/AbstractTag.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nuse Svg\\Document;\nuse Svg\\Style;\n\nabstract class AbstractTag\n{\n    /** @var Document */\n    protected $document;\n\n    public $tagName;\n\n    /** @var Style */\n    protected $style;\n\n    protected $attributes = array();\n\n    protected $hasShape = true;\n\n    /** @var self[] */\n    protected $children = array();\n\n    public function __construct(Document $document, $tagName)\n    {\n        $this->document = $document;\n        $this->tagName = $tagName;\n    }\n\n    public function getDocument(){\n        return $this->document;\n    }\n\n    /**\n     * @return Group|null\n     */\n    public function getParentGroup() {\n        $stack = $this->getDocument()->getStack();\n        for ($i = count($stack)-2; $i >= 0; $i--) {\n            $tag = $stack[$i];\n\n            if ($tag instanceof Group || $tag instanceof Document) {\n                return $tag;\n            }\n        }\n\n        return null;\n    }\n\n    public function handle($attributes)\n    {\n        $this->attributes = $attributes;\n\n        if (!$this->getDocument()->inDefs) {\n            $this->before($attributes);\n            $this->start($attributes);\n        }\n    }\n\n    public function handleEnd()\n    {\n        if (!$this->getDocument()->inDefs) {\n            $this->end();\n            $this->after();\n        }\n    }\n\n    protected function before($attributes)\n    {\n    }\n\n    protected function start($attributes)\n    {\n    }\n\n    protected function end()\n    {\n    }\n\n    protected function after()\n    {\n    }\n\n    public function getAttributes()\n    {\n        return $this->attributes;\n    }\n\n    protected function setStyle(Style $style)\n    {\n        $this->style = $style;\n\n        if ($style->display === \"none\") {\n            $this->hasShape = false;\n        }\n    }\n\n    /**\n     * @return Style\n     */\n    public function getStyle()\n    {\n        return $this->style;\n    }\n\n    /**\n     * Make a style object from the tag and its attributes\n     *\n     * @param array $attributes\n     *\n     * @return Style\n     */\n    protected function makeStyle($attributes) {\n        $style = new Style();\n        $style->inherit($this);\n        $style->fromStyleSheets($this, $attributes);\n        $style->fromAttributes($attributes);\n\n        return $style;\n    }\n\n    protected function applyTransform($attributes)\n    {\n\n        if (isset($attributes[\"transform\"])) {\n            $surface = $this->document->getSurface();\n\n            $transform = $attributes[\"transform\"];\n\n            $match = array();\n            preg_match_all(\n                '/(matrix|translate|scale|rotate|skewX|skewY)\\((.*?)\\)/is',\n                $transform,\n                $match,\n                PREG_SET_ORDER\n            );\n\n            $transformations = array();\n            if (count($match[0])) {\n                foreach ($match as $_match) {\n                    $arguments = preg_split('/[ ,]+/', $_match[2]);\n                    array_unshift($arguments, $_match[1]);\n                    $transformations[] = $arguments;\n                }\n            }\n\n            foreach ($transformations as $t) {\n                switch ($t[0]) {\n                    case \"matrix\":\n                        $surface->transform($t[1], $t[2], $t[3], $t[4], $t[5], $t[6]);\n                        break;\n\n                    case \"translate\":\n                        $surface->translate($t[1], isset($t[2]) ? $t[2] : 0);\n                        break;\n\n                    case \"scale\":\n                        $surface->scale($t[1], isset($t[2]) ? $t[2] : $t[1]);\n                        break;\n\n                    case \"rotate\":\n                        if (isset($t[2])) {\n                            $t[3] = isset($t[3]) ? $t[3] : 0;\n                            $surface->translate($t[2], $t[3]);\n                            $surface->rotate($t[1]);\n                            $surface->translate(-$t[2], -$t[3]);\n                        } else {\n                            $surface->rotate($t[1]);\n                        }\n                        break;\n\n                    case \"skewX\":\n                        $surface->skewX($t[1]);\n                        break;\n\n                    case \"skewY\":\n                        $surface->skewY($t[1]);\n                        break;\n                }\n            }\n        }\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Anchor.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Anchor extends Group\n{\n\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Circle.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Circle extends Shape\n{\n    protected $cx = 0;\n    protected $cy = 0;\n    protected $r;\n\n    public function start($attributes)\n    {\n        if (isset($attributes['cx'])) {\n            $this->cx = $attributes['cx'];\n        }\n        if (isset($attributes['cy'])) {\n            $this->cy = $attributes['cy'];\n        }\n        if (isset($attributes['r'])) {\n            $this->r = $attributes['r'];\n        }\n\n        $this->document->getSurface()->circle($this->cx, $this->cy, $this->r);\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/ClipPath.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nuse Svg\\Style;\n\nclass ClipPath extends AbstractTag\n{\n    protected function before($attributes)\n    {\n        $surface = $this->document->getSurface();\n\n        $surface->save();\n\n        $style = $this->makeStyle($attributes);\n\n        $this->setStyle($style);\n        $surface->setStyle($style);\n\n        $this->applyTransform($attributes);\n    }\n\n    protected function after()\n    {\n        $this->document->getSurface()->restore();\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Ellipse.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Ellipse extends Shape\n{\n    protected $cx = 0;\n    protected $cy = 0;\n    protected $rx = 0;\n    protected $ry = 0;\n\n    public function start($attributes)\n    {\n        parent::start($attributes);\n\n        if (isset($attributes['cx'])) {\n            $this->cx = $attributes['cx'];\n        }\n        if (isset($attributes['cy'])) {\n            $this->cy = $attributes['cy'];\n        }\n        if (isset($attributes['rx'])) {\n            $this->rx = $attributes['rx'];\n        }\n        if (isset($attributes['ry'])) {\n            $this->ry = $attributes['ry'];\n        }\n\n        $this->document->getSurface()->ellipse($this->cx, $this->cy, $this->rx, $this->ry, 0, 0, 360, false);\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Group.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nuse Svg\\Style;\n\nclass Group extends AbstractTag\n{\n    protected function before($attributes)\n    {\n        $surface = $this->document->getSurface();\n\n        $surface->save();\n\n        $style = $this->makeStyle($attributes);\n\n        $this->setStyle($style);\n        $surface->setStyle($style);\n\n        $this->applyTransform($attributes);\n    }\n\n    protected function after()\n    {\n        $this->document->getSurface()->restore();\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Image.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Image extends AbstractTag\n{\n    protected $x = 0;\n    protected $y = 0;\n    protected $width = 0;\n    protected $height = 0;\n    protected $href = null;\n\n    protected function before($attributes)\n    {\n        parent::before($attributes);\n\n        $surface = $this->document->getSurface();\n        $surface->save();\n\n        $this->applyTransform($attributes);\n    }\n\n    public function start($attributes)\n    {\n        $document = $this->document;\n        $height = $this->document->getHeight();\n        $this->y = $height;\n\n        if (isset($attributes['x'])) {\n            $this->x = $attributes['x'];\n        }\n        if (isset($attributes['y'])) {\n            $this->y = $height - $attributes['y'];\n        }\n\n        if (isset($attributes['width'])) {\n            $this->width = $attributes['width'];\n        }\n        if (isset($attributes['height'])) {\n            $this->height = $attributes['height'];\n        }\n\n        if (isset($attributes['xlink:href'])) {\n            $this->href = $attributes['xlink:href'];\n        }\n\n        $document->getSurface()->transform(1, 0, 0, -1, 0, $height);\n\n        $document->getSurface()->drawImage($this->href, $this->x, $this->y, $this->width, $this->height);\n    }\n\n    protected function after()\n    {\n        $this->document->getSurface()->restore();\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Line.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Line extends Shape\n{\n    protected $x1 = 0;\n    protected $y1 = 0;\n\n    protected $x2 = 0;\n    protected $y2 = 0;\n\n    public function start($attributes)\n    {\n        if (isset($attributes['x1'])) {\n            $this->x1 = $attributes['x1'];\n        }\n        if (isset($attributes['y1'])) {\n            $this->y1 = $attributes['y1'];\n        }\n        if (isset($attributes['x2'])) {\n            $this->x2 = $attributes['x2'];\n        }\n        if (isset($attributes['y2'])) {\n            $this->y2 = $attributes['y2'];\n        }\n\n        $surface = $this->document->getSurface();\n        $surface->moveTo($this->x1, $this->y1);\n        $surface->lineTo($this->x2, $this->y2);\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/LinearGradient.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\n\nuse Svg\\Gradient;\nuse Svg\\Style;\n\nclass LinearGradient extends AbstractTag\n{\n    protected $x1;\n    protected $y1;\n    protected $x2;\n    protected $y2;\n\n    /** @var Gradient\\Stop[] */\n    protected $stops = array();\n\n    public function start($attributes)\n    {\n        parent::start($attributes);\n\n        if (isset($attributes['x1'])) {\n            $this->x1 = $attributes['x1'];\n        }\n        if (isset($attributes['y1'])) {\n            $this->y1 = $attributes['y1'];\n        }\n        if (isset($attributes['x2'])) {\n            $this->x2 = $attributes['x2'];\n        }\n        if (isset($attributes['y2'])) {\n            $this->y2 = $attributes['y2'];\n        }\n    }\n\n    public function getStops() {\n        if (empty($this->stops)) {\n            foreach ($this->children as $_child) {\n                if ($_child->tagName != \"stop\") {\n                    continue;\n                }\n\n                $_stop = new Gradient\\Stop();\n                $_attributes = $_child->attributes;\n\n                // Style\n                if (isset($_attributes[\"style\"])) {\n                    $_style = Style::parseCssStyle($_attributes[\"style\"]);\n\n                    if (isset($_style[\"stop-color\"])) {\n                        $_stop->color = Style::parseColor($_style[\"stop-color\"]);\n                    }\n\n                    if (isset($_style[\"stop-opacity\"])) {\n                        $_stop->opacity = max(0, min(1.0, $_style[\"stop-opacity\"]));\n                    }\n                }\n\n                // Attributes\n                if (isset($_attributes[\"offset\"])) {\n                    $_stop->offset = $_attributes[\"offset\"];\n                }\n                if (isset($_attributes[\"stop-color\"])) {\n                    $_stop->color = Style::parseColor($_attributes[\"stop-color\"]);\n                }\n                if (isset($_attributes[\"stop-opacity\"])) {\n                    $_stop->opacity = max(0, min(1.0, $_attributes[\"stop-opacity\"]));\n                }\n\n                $this->stops[] = $_stop;\n            }\n        }\n\n        return $this->stops;\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Path.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nuse Svg\\Surface\\SurfaceInterface;\n\nclass Path extends Shape\n{\n    // kindly borrowed from fabric.util.parsePath.\n    /* @see https://github.com/fabricjs/fabric.js/blob/master/src/util/path.js#L664 */\n    const NUMBER_PATTERN = '([-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?)\\s*';\n    const COMMA_PATTERN = '(?:\\s+,?\\s*|,\\s*)?';\n    const FLAG_PATTERN = '([01])';\n    const ARC_REGEXP = '/'\n        . self::NUMBER_PATTERN\n        . self::COMMA_PATTERN\n        . self::NUMBER_PATTERN\n        . self::COMMA_PATTERN\n        . self::NUMBER_PATTERN\n        . self::COMMA_PATTERN\n        . self::FLAG_PATTERN\n        . self::COMMA_PATTERN\n        . self::FLAG_PATTERN\n        . self::COMMA_PATTERN\n        . self::NUMBER_PATTERN\n        . self::COMMA_PATTERN\n        . self::NUMBER_PATTERN\n        . '/';\n\n    static $commandLengths = array(\n        'm' => 2,\n        'l' => 2,\n        'h' => 1,\n        'v' => 1,\n        'c' => 6,\n        's' => 4,\n        'q' => 4,\n        't' => 2,\n        'a' => 7,\n    );\n\n    static $repeatedCommands = array(\n        'm' => 'l',\n        'M' => 'L',\n    );\n\n    public static function parse(string $commandSequence): array\n    {\n        $commands = array();\n        preg_match_all('/([MZLHVCSQTAmzlhvcsqta])([eE ,\\-.\\d]+)*/', $commandSequence, $commands, PREG_SET_ORDER);\n        \n        $path = array();\n        foreach ($commands as $c) {\n            if (count($c) == 3) {\n                $commandLower = strtolower($c[1]);\n\n                // arcs have special flags that apparently don't require spaces.\n                if ($commandLower === 'a' && preg_match_all(static::ARC_REGEXP, $c[2], $matches)) {\n                    $numberOfMatches = count($matches[0]);\n                    for ($k = 0; $k < $numberOfMatches; ++$k) {\n                        $path[] = [\n                            $c[1],\n                            $matches[1][$k],\n                            $matches[2][$k],\n                            $matches[3][$k],\n                            $matches[4][$k],\n                            $matches[5][$k],\n                            $matches[6][$k],\n                            $matches[7][$k],\n                        ];\n                    }\n                    continue;\n                }\n\n                $arguments = array();\n                preg_match_all('/([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:e[-+]?\\d+)?)/i', $c[2], $arguments, PREG_PATTERN_ORDER);\n                $item = $arguments[0];\n\n                if (\n                    isset(self::$commandLengths[$commandLower]) &&\n                    ($commandLength = self::$commandLengths[$commandLower]) &&\n                    count($item) > $commandLength\n                ) {\n                    $repeatedCommand = isset(self::$repeatedCommands[$c[1]]) ? self::$repeatedCommands[$c[1]] : $c[1];\n                    $command = $c[1];\n\n                    for ($k = 0, $klen = count($item); $k < $klen; $k += $commandLength) {\n                        $_item = array_slice($item, $k, $k + $commandLength);\n                        array_unshift($_item, $command);\n                        $path[] = $_item;\n\n                        $command = $repeatedCommand;\n                    }\n                } else {\n                    array_unshift($item, $c[1]);\n                    $path[] = $item;\n                }\n\n            } else {\n                $item = array($c[1]);\n\n                $path[] = $item;\n            }\n        }\n\n        return $path;\n    }\n\n    public function start($attributes)\n    {\n        if (!isset($attributes['d'])) {\n            $this->hasShape = false;\n\n            return;\n        }\n\n        $path = static::parse($attributes['d']);\n        $surface = $this->document->getSurface();\n\n        // From https://github.com/kangax/fabric.js/blob/master/src/shapes/path.class.js\n        $current = null; // current instruction\n        $previous = null;\n        $subpathStartX = 0;\n        $subpathStartY = 0;\n        $x = 0; // current x\n        $y = 0; // current y\n        $controlX = 0; // current control point x\n        $controlY = 0; // current control point y\n        $tempX = null;\n        $tempY = null;\n        $tempControlX = null;\n        $tempControlY = null;\n        $l = 0; //-((this.width / 2) + $this.pathOffset.x),\n        $t = 0; //-((this.height / 2) + $this.pathOffset.y),\n        $methodName = null;\n\n        foreach ($path as $current) {\n            switch ($current[0]) { // first letter\n                case 'l': // lineto, relative\n                    $x += $current[1];\n                    $y += $current[2];\n                    $surface->lineTo($x + $l, $y + $t);\n                    break;\n\n                case 'L': // lineto, absolute\n                    $x = $current[1];\n                    $y = $current[2];\n                    $surface->lineTo($x + $l, $y + $t);\n                    break;\n\n                case 'h': // horizontal lineto, relative\n                    $x += $current[1];\n                    $surface->lineTo($x + $l, $y + $t);\n                    break;\n\n                case 'H': // horizontal lineto, absolute\n                    $x = $current[1];\n                    $surface->lineTo($x + $l, $y + $t);\n                    break;\n\n                case 'v': // vertical lineto, relative\n                    $y += $current[1];\n                    $surface->lineTo($x + $l, $y + $t);\n                    break;\n\n                case 'V': // verical lineto, absolute\n                    $y = $current[1];\n                    $surface->lineTo($x + $l, $y + $t);\n                    break;\n\n                case 'm': // moveTo, relative\n                    $x += $current[1];\n                    $y += $current[2];\n                    $subpathStartX = $x;\n                    $subpathStartY = $y;\n                    $surface->moveTo($x + $l, $y + $t);\n                    break;\n\n                case 'M': // moveTo, absolute\n                    $x = $current[1];\n                    $y = $current[2];\n                    $subpathStartX = $x;\n                    $subpathStartY = $y;\n                    $surface->moveTo($x + $l, $y + $t);\n                    break;\n\n                case 'c': // bezierCurveTo, relative\n                    $tempX = $x + $current[5];\n                    $tempY = $y + $current[6];\n                    $controlX = $x + $current[3];\n                    $controlY = $y + $current[4];\n                    $surface->bezierCurveTo(\n                        $x + $current[1] + $l, // x1\n                        $y + $current[2] + $t, // y1\n                        $controlX + $l, // x2\n                        $controlY + $t, // y2\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    $x = $tempX;\n                    $y = $tempY;\n                    break;\n\n                case 'C': // bezierCurveTo, absolute\n                    $x = $current[5];\n                    $y = $current[6];\n                    $controlX = $current[3];\n                    $controlY = $current[4];\n                    $surface->bezierCurveTo(\n                        $current[1] + $l,\n                        $current[2] + $t,\n                        $controlX + $l,\n                        $controlY + $t,\n                        $x + $l,\n                        $y + $t\n                    );\n                    break;\n\n                case 's': // shorthand cubic bezierCurveTo, relative\n\n                    // transform to absolute x,y\n                    $tempX = $x + $current[3];\n                    $tempY = $y + $current[4];\n\n                    if (!preg_match('/[CcSs]/', $previous[0])) {\n                        // If there is no previous command or if the previous command was not a C, c, S, or s,\n                        // the control point is coincident with the current point\n                        $controlX = $x;\n                        $controlY = $y;\n                    } else {\n                        // calculate reflection of previous control points\n                        $controlX = 2 * $x - $controlX;\n                        $controlY = 2 * $y - $controlY;\n                    }\n\n                    $surface->bezierCurveTo(\n                        $controlX + $l,\n                        $controlY + $t,\n                        $x + $current[1] + $l,\n                        $y + $current[2] + $t,\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    // set control point to 2nd one of this command\n                    // \"... the first control point is assumed to be\n                    // the reflection of the second control point on\n                    // the previous command relative to the current point.\"\n                    $controlX = $x + $current[1];\n                    $controlY = $y + $current[2];\n\n                    $x = $tempX;\n                    $y = $tempY;\n                    break;\n\n                case 'S': // shorthand cubic bezierCurveTo, absolute\n                    $tempX = $current[3];\n                    $tempY = $current[4];\n\n                    if (!preg_match('/[CcSs]/', $previous[0])) {\n                        // If there is no previous command or if the previous command was not a C, c, S, or s,\n                        // the control point is coincident with the current point\n                        $controlX = $x;\n                        $controlY = $y;\n                    } else {\n                        // calculate reflection of previous control points\n                        $controlX = 2 * $x - $controlX;\n                        $controlY = 2 * $y - $controlY;\n                    }\n\n                    $surface->bezierCurveTo(\n                        $controlX + $l,\n                        $controlY + $t,\n                        $current[1] + $l,\n                        $current[2] + $t,\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    $x = $tempX;\n                    $y = $tempY;\n\n                    // set control point to 2nd one of this command\n                    // \"... the first control point is assumed to be\n                    // the reflection of the second control point on\n                    // the previous command relative to the current point.\"\n                    $controlX = $current[1];\n                    $controlY = $current[2];\n\n                    break;\n\n                case 'q': // quadraticCurveTo, relative\n                    // transform to absolute x,y\n                    $tempX = $x + $current[3];\n                    $tempY = $y + $current[4];\n\n                    $controlX = $x + $current[1];\n                    $controlY = $y + $current[2];\n\n                    $surface->quadraticCurveTo(\n                        $controlX + $l,\n                        $controlY + $t,\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    $x = $tempX;\n                    $y = $tempY;\n                    break;\n\n                case 'Q': // quadraticCurveTo, absolute\n                    $tempX = $current[3];\n                    $tempY = $current[4];\n\n                    $surface->quadraticCurveTo(\n                        $current[1] + $l,\n                        $current[2] + $t,\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    $x = $tempX;\n                    $y = $tempY;\n                    $controlX = $current[1];\n                    $controlY = $current[2];\n                    break;\n\n                case 't': // shorthand quadraticCurveTo, relative\n\n                    // transform to absolute x,y\n                    $tempX = $x + $current[1];\n                    $tempY = $y + $current[2];\n\n                    if (preg_match(\"/[QqTt]/\", $previous[0])) {\n                        // If there is no previous command or if the previous command was not a Q, q, T or t,\n                        // assume the control point is coincident with the current point\n                        $controlX = $x;\n                        $controlY = $y;\n                    } else {\n                        if ($previous[0] === 't') {\n                            // calculate reflection of previous control points for t\n                            $controlX = 2 * $x - $tempControlX;\n                            $controlY = 2 * $y - $tempControlY;\n                        } else {\n                            if ($previous[0] === 'q') {\n                                // calculate reflection of previous control points for q\n                                $controlX = 2 * $x - $controlX;\n                                $controlY = 2 * $y - $controlY;\n                            }\n                        }\n                    }\n\n                    $tempControlX = $controlX;\n                    $tempControlY = $controlY;\n\n                    $surface->quadraticCurveTo(\n                        $controlX + $l,\n                        $controlY + $t,\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    $x = $tempX;\n                    $y = $tempY;\n                    $controlX = $x + $current[1];\n                    $controlY = $y + $current[2];\n                    break;\n\n                case 'T':\n                    $tempX = $current[1];\n                    $tempY = $current[2];\n\n                    // calculate reflection of previous control points\n                    $controlX = 2 * $x - $controlX;\n                    $controlY = 2 * $y - $controlY;\n                    $surface->quadraticCurveTo(\n                        $controlX + $l,\n                        $controlY + $t,\n                        $tempX + $l,\n                        $tempY + $t\n                    );\n                    $x = $tempX;\n                    $y = $tempY;\n                    break;\n\n                case 'a':\n                    // TODO: optimize this\n                    $this->drawArc(\n                        $surface,\n                        $x + $l,\n                        $y + $t,\n                        array(\n                            $current[1],\n                            $current[2],\n                            $current[3],\n                            $current[4],\n                            $current[5],\n                            $current[6] + $x + $l,\n                            $current[7] + $y + $t\n                        )\n                    );\n                    $x += $current[6];\n                    $y += $current[7];\n                    break;\n\n                case 'A':\n                    // TODO: optimize this\n                    $this->drawArc(\n                        $surface,\n                        $x + $l,\n                        $y + $t,\n                        array(\n                            $current[1],\n                            $current[2],\n                            $current[3],\n                            $current[4],\n                            $current[5],\n                            $current[6] + $l,\n                            $current[7] + $t\n                        )\n                    );\n                    $x = $current[6];\n                    $y = $current[7];\n                    break;\n\n                case 'z':\n                case 'Z':\n                    $x = $subpathStartX;\n                    $y = $subpathStartY;\n                    $surface->closePath();\n                    break;\n            }\n            $previous = $current;\n        }\n    }\n\n    function drawArc(SurfaceInterface $surface, $fx, $fy, $coords)\n    {\n        $rx = $coords[0];\n        $ry = $coords[1];\n        $rot = $coords[2];\n        $large = $coords[3];\n        $sweep = $coords[4];\n        $tx = $coords[5];\n        $ty = $coords[6];\n        $segs = array(\n            array(),\n            array(),\n            array(),\n            array(),\n        );\n\n        $segsNorm = $this->arcToSegments($tx - $fx, $ty - $fy, $rx, $ry, $large, $sweep, $rot);\n\n        for ($i = 0, $len = count($segsNorm); $i < $len; $i++) {\n            $segs[$i][0] = $segsNorm[$i][0] + $fx;\n            $segs[$i][1] = $segsNorm[$i][1] + $fy;\n            $segs[$i][2] = $segsNorm[$i][2] + $fx;\n            $segs[$i][3] = $segsNorm[$i][3] + $fy;\n            $segs[$i][4] = $segsNorm[$i][4] + $fx;\n            $segs[$i][5] = $segsNorm[$i][5] + $fy;\n\n            call_user_func_array(array($surface, \"bezierCurveTo\"), $segs[$i]);\n        }\n    }\n\n    function arcToSegments($toX, $toY, $rx, $ry, $large, $sweep, $rotateX)\n    {\n        $th = $rotateX * M_PI / 180;\n        $sinTh = sin($th);\n        $cosTh = cos($th);\n        $fromX = 0;\n        $fromY = 0;\n\n        $rx = abs($rx);\n        $ry = abs($ry);\n\n        $px = -$cosTh * $toX * 0.5 - $sinTh * $toY * 0.5;\n        $py = -$cosTh * $toY * 0.5 + $sinTh * $toX * 0.5;\n        $rx2 = $rx * $rx;\n        $ry2 = $ry * $ry;\n        $py2 = $py * $py;\n        $px2 = $px * $px;\n        $pl = $rx2 * $ry2 - $rx2 * $py2 - $ry2 * $px2;\n        $root = 0;\n\n        if ($pl < 0) {\n            $s = sqrt(1 - $pl / ($rx2 * $ry2));\n            $rx *= $s;\n            $ry *= $s;\n        } else {\n            $root = ($large == $sweep ? -1.0 : 1.0) * sqrt($pl / ($rx2 * $py2 + $ry2 * $px2));\n        }\n\n        $cx = $root * $rx * $py / $ry;\n        $cy = -$root * $ry * $px / $rx;\n        $cx1 = $cosTh * $cx - $sinTh * $cy + $toX * 0.5;\n        $cy1 = $sinTh * $cx + $cosTh * $cy + $toY * 0.5;\n        $mTheta = $this->calcVectorAngle(1, 0, ($px - $cx) / $rx, ($py - $cy) / $ry);\n        $dtheta = $this->calcVectorAngle(($px - $cx) / $rx, ($py - $cy) / $ry, (-$px - $cx) / $rx, (-$py - $cy) / $ry);\n\n        if ($sweep == 0 && $dtheta > 0) {\n            $dtheta -= 2 * M_PI;\n        } else {\n            if ($sweep == 1 && $dtheta < 0) {\n                $dtheta += 2 * M_PI;\n            }\n        }\n\n        // $Convert $into $cubic $bezier $segments <= 90deg\n        $segments = ceil(abs($dtheta / M_PI * 2));\n        $result = array();\n        $mDelta = $dtheta / $segments;\n        $mT = 8 / 3 * sin($mDelta / 4) * sin($mDelta / 4) / sin($mDelta / 2);\n        $th3 = $mTheta + $mDelta;\n\n        for ($i = 0; $i < $segments; $i++) {\n            $result[$i] = $this->segmentToBezier(\n                $mTheta,\n                $th3,\n                $cosTh,\n                $sinTh,\n                $rx,\n                $ry,\n                $cx1,\n                $cy1,\n                $mT,\n                $fromX,\n                $fromY\n            );\n            $fromX = $result[$i][4];\n            $fromY = $result[$i][5];\n            $mTheta = $th3;\n            $th3 += $mDelta;\n        }\n\n        return $result;\n    }\n\n    function segmentToBezier($th2, $th3, $cosTh, $sinTh, $rx, $ry, $cx1, $cy1, $mT, $fromX, $fromY)\n    {\n        $costh2 = cos($th2);\n        $sinth2 = sin($th2);\n        $costh3 = cos($th3);\n        $sinth3 = sin($th3);\n        $toX = $cosTh * $rx * $costh3 - $sinTh * $ry * $sinth3 + $cx1;\n        $toY = $sinTh * $rx * $costh3 + $cosTh * $ry * $sinth3 + $cy1;\n        $cp1X = $fromX + $mT * (-$cosTh * $rx * $sinth2 - $sinTh * $ry * $costh2);\n        $cp1Y = $fromY + $mT * (-$sinTh * $rx * $sinth2 + $cosTh * $ry * $costh2);\n        $cp2X = $toX + $mT * ($cosTh * $rx * $sinth3 + $sinTh * $ry * $costh3);\n        $cp2Y = $toY + $mT * ($sinTh * $rx * $sinth3 - $cosTh * $ry * $costh3);\n\n        return array(\n            $cp1X,\n            $cp1Y,\n            $cp2X,\n            $cp2Y,\n            $toX,\n            $toY\n        );\n    }\n\n    function calcVectorAngle($ux, $uy, $vx, $vy)\n    {\n        $ta = atan2($uy, $ux);\n        $tb = atan2($vy, $vx);\n        if ($tb >= $ta) {\n            return $tb - $ta;\n        } else {\n            return 2 * M_PI - ($ta - $tb);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Polygon.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Polygon extends Shape\n{\n    public function start($attributes)\n    {\n        $tmp = array();\n        preg_match_all('/([\\-]*[0-9\\.]+)/', $attributes['points'], $tmp);\n\n        $points = $tmp[0];\n        $count = count($points);\n\n        $surface = $this->document->getSurface();\n        list($x, $y) = $points;\n        $surface->moveTo($x, $y);\n\n        for ($i = 2; $i < $count; $i += 2) {\n            $x = $points[$i];\n            $y = $points[$i + 1];\n            $surface->lineTo($x, $y);\n        }\n\n        $surface->closePath();\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Polyline.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Polyline extends Shape\n{\n    public function start($attributes)\n    {\n        $tmp = array();\n        preg_match_all('/([\\-]*[0-9\\.]+)/', $attributes['points'], $tmp);\n\n        $points = $tmp[0];\n        $count = count($points);\n\n        $surface = $this->document->getSurface();\n        list($x, $y) = $points;\n        $surface->moveTo($x, $y);\n\n        for ($i = 2; $i < $count; $i += 2) {\n            $x = $points[$i];\n            $y = $points[$i + 1];\n            $surface->lineTo($x, $y);\n        }\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/RadialGradient.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass RadialGradient extends AbstractTag\n{\n    public function start($attributes)\n    {\n\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Rect.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Rect extends Shape\n{\n    protected $x = 0;\n    protected $y = 0;\n    protected $width = 0;\n    protected $height = 0;\n    protected $rx = 0;\n    protected $ry = 0;\n\n    public function start($attributes)\n    {\n        if (isset($attributes['x'])) {\n            $this->x = $attributes['x'];\n        }\n        if (isset($attributes['y'])) {\n            $this->y = $attributes['y'];\n        }\n\n        if (isset($attributes['width'])) {\n            if ('%' === substr($attributes['width'], -1)) {\n                $factor = substr($attributes['width'], 0, -1) / 100;\n                $this->width = $this->document->getWidth() * $factor;\n            } else {\n                $this->width = $attributes['width'];\n            }\n        }\n        if (isset($attributes['height'])) {\n            if ('%' === substr($attributes['height'], -1)) {\n                $factor = substr($attributes['height'], 0, -1) / 100;\n                $this->height = $this->document->getHeight() * $factor;\n            } else {\n                $this->height = $attributes['height'];\n            }\n        }\n\n        if (isset($attributes['rx'])) {\n            $this->rx = $attributes['rx'];\n        }\n        if (isset($attributes['ry'])) {\n            $this->ry = $attributes['ry'];\n        }\n\n        $this->document->getSurface()->rect($this->x, $this->y, $this->width, $this->height, $this->rx, $this->ry);\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Shape.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nuse Svg\\Style;\n\nclass Shape extends AbstractTag\n{\n    protected function before($attributes)\n    {\n        $surface = $this->document->getSurface();\n\n        $surface->save();\n\n        $style = $this->makeStyle($attributes);\n\n        $this->setStyle($style);\n        $surface->setStyle($style);\n\n        $this->applyTransform($attributes);\n    }\n\n    protected function after()\n    {\n        $surface = $this->document->getSurface();\n\n        if ($this->hasShape) {\n            $style = $surface->getStyle();\n\n            $fill   = $style->fill   && is_array($style->fill);\n            $stroke = $style->stroke && is_array($style->stroke);\n\n            if ($fill) {\n                if ($stroke) {\n                    $surface->fillStroke();\n                } else {\n//                    if (is_string($style->fill)) {\n//                        /** @var LinearGradient|RadialGradient $gradient */\n//                        $gradient = $this->getDocument()->getDef($style->fill);\n//\n//                        var_dump($gradient->getStops());\n//                    }\n\n                    $surface->fill();\n                }\n            }\n            elseif ($stroke) {\n                $surface->stroke();\n            }\n            else {\n                $surface->endPath();\n            }\n        }\n\n        $surface->restore();\n    }\n} "
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Stop.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Stop extends AbstractTag\n{\n    public function start($attributes)\n    {\n\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/StyleTag.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nuse Sabberworm\\CSS;\n\nclass StyleTag extends AbstractTag\n{\n    protected $text = \"\";\n\n    public function end()\n    {\n        $parser = new CSS\\Parser($this->text);\n        $this->document->appendStyleSheet($parser->parse());\n    }\n\n    public function appendText($text)\n    {\n        $this->text .= $text;\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/Text.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass Text extends Shape\n{\n    protected $x = 0;\n    protected $y = 0;\n    protected $text = \"\";\n\n    public function start($attributes)\n    {\n        $document = $this->document;\n        $height = $this->document->getHeight();\n        $this->y = $height;\n\n        if (isset($attributes['x'])) {\n            $this->x = $attributes['x'];\n        }\n        if (isset($attributes['y'])) {\n            $this->y = $height - $attributes['y'];\n        }\n\n        $document->getSurface()->transform(1, 0, 0, -1, 0, $height);\n    }\n\n    public function end()\n    {\n        $surface = $this->document->getSurface();\n        $x = $this->x;\n        $y = $this->y;\n        $style = $surface->getStyle();\n        $surface->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight);\n\n        switch ($style->textAnchor) {\n            case \"middle\":\n                $width = $surface->measureText($this->text);\n                $x -= $width / 2;\n                break;\n\n            case \"end\":\n                $width = $surface->measureText($this->text);\n                $x -= $width;\n                break;\n        }\n\n        $surface->fillText($this->getText(), $x, $y);\n    }\n\n    protected function after()\n    {\n        $this->document->getSurface()->restore();\n    }\n\n    public function appendText($text)\n    {\n        $this->text .= $text;\n    }\n\n    public function getText()\n    {\n        return trim($this->text);\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/Svg/Tag/UseTag.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nnamespace Svg\\Tag;\n\nclass UseTag extends AbstractTag\n{\n    protected $x = 0;\n    protected $y = 0;\n    protected $width;\n    protected $height;\n\n    /** @var AbstractTag */\n    protected $reference;\n\n    protected function before($attributes)\n    {\n        if (isset($attributes['x'])) {\n            $this->x = $attributes['x'];\n        }\n        if (isset($attributes['y'])) {\n            $this->y = $attributes['y'];\n        }\n\n        if (isset($attributes['width'])) {\n            $this->width = $attributes['width'];\n        }\n        if (isset($attributes['height'])) {\n            $this->height = $attributes['height'];\n        }\n\n        parent::before($attributes);\n\n        $document = $this->getDocument();\n\n        $link = $attributes[\"xlink:href\"];\n        $this->reference = $document->getDef($link);\n\n        if ($this->reference) {\n            $this->reference->before($attributes);\n        }\n\n        $surface = $document->getSurface();\n        $surface->save();\n\n        $surface->translate($this->x, $this->y);\n    }\n\n    protected function after() {\n        parent::after();\n\n        if ($this->reference) {\n            $this->reference->after();\n        }\n\n        $this->getDocument()->getSurface()->restore();\n    }\n\n    public function handle($attributes)\n    {\n        parent::handle($attributes);\n\n        if (!$this->reference) {\n            return;\n        }\n\n        $attributes = array_merge($this->reference->attributes, $attributes);\n\n        $this->reference->handle($attributes);\n\n        foreach ($this->reference->children as $_child) {\n            $_attributes = array_merge($_child->attributes, $attributes);\n            $_child->handle($_attributes);\n        }\n    }\n\n    public function handleEnd()\n    {\n        parent::handleEnd();\n\n        if (!$this->reference) {\n            return;\n        }\n\n        $this->reference->handleEnd();\n\n        foreach ($this->reference->children as $_child) {\n            $_child->handleEnd();\n        }\n    }\n} \n"
  },
  {
    "path": "application/libraries/dompdf/lib/php-svg-lib/src/autoload.php",
    "content": "<?php\n/**\n * @package php-svg-lib\n * @link    http://github.com/PhenX/php-svg-lib\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html\n */\n\nspl_autoload_register(function($class) {\n  if (0 === strpos($class, \"Svg\")) {\n    $file = str_replace('\\\\', DIRECTORY_SEPARATOR, $class);\n    $file = realpath(__DIR__ . DIRECTORY_SEPARATOR . $file . '.php');\n    if (file_exists($file)) {\n      include_once $file;\n    }\n  }\n});"
  },
  {
    "path": "application/libraries/dompdf/lib/res/html.css",
    "content": "/**\n * dompdf default stylesheet.\n *\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Blake Ross <BlakeR1234@aol.com>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n *\n * Portions from Mozilla\n * @link https://dxr.mozilla.org/mozilla-central/source/layout/style/res/html.css\n * @license http://mozilla.org/MPL/2.0/ Mozilla Public License, v. 2.0 \n *\n * Portions from W3C\n * @link https://drafts.csswg.org/css-ui-3/#default-style-sheet\n *\n */\n\n@page {\n  margin: 1.2cm;\n}\n\nhtml {\n  display: -dompdf-page !important;\n  counter-reset: page;\n}\n\n/* blocks */\n\narticle,\naside,\ndetails,\ndiv,\ndt,\nfigcaption,\nfooter,\nform,\nheader,\nhgroup,\nmain,\nnav,\nnoscript,\nsection,\nsummary {\n  display: block;\n}\n\nbody {\n  page-break-before: avoid;\n  display: block !important;\n  counter-increment: page;\n}\n\np, dl, multicol {\n  display: block;\n  margin: 1em 0;\n}\n\ndd {\n  display: block;\n  margin-left: 40px;\n}\n\nblockquote, figure {\n  display: block;\n  margin: 1em 40px;\n}\n\naddress {\n  display: block;\n  font-style: italic;\n}\n\ncenter {\n  display: block;\n  text-align: center;\n}\n\nblockquote[type=cite] {\n  display: block;\n  margin: 1em 0;\n  padding-left: 1em;\n  border-left: solid;\n  border-color: blue;\n  border-width: thin;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  display: block;\n  font-weight: bold;\n}\n\nh1 {\n  font-size: 2em;\n  margin: .67em 0;\n}\n\nh2 {\n  font-size: 1.5em;\n  margin: .83em 0;\n}\n\nh3 {\n  font-size: 1.17em;\n  margin: 1em 0;\n}\n\nh4 {\n  margin: 1.33em 0;\n}\n\nh5 {\n  font-size: 0.83em;\n  margin: 1.67em 0;\n}\n\nh6 {\n  font-size: 0.67em;\n  margin: 2.33em 0;\n}\n\nlisting {\n  display: block;\n  font-family: fixed;\n  font-size: medium;\n  white-space: pre;\n  margin: 1em 0;\n}\n\nplaintext, pre, xmp {\n  display: block;\n  font-family: fixed;\n  white-space: pre;\n  margin: 1em 0;\n}\n\n/* tables */\n\ntable {\n  display: table;\n  border-spacing: 2px;\n  border-collapse: separate;\n  margin-top: 0;\n  margin-bottom: 0;\n  text-indent: 0;\n  text-align: left; /* quirk */\n}\n\ntable[border] {\n  border-style: outset;\n  border-color: gray;\n}\n\n/* This won't work (???) */\n/*\ntable[border] td,\ntable[border] th {\n  border: 1pt solid grey;\n}*/\n\n/* make sure backgrounds are inherited in tables  -- see bug 4510 */\ntd, th, tr {\n  background-color: inherit;\n  background-image: inherit;\n  background-image-resolution: inherit;\n  background-position: inherit;\n  background-repeat: inherit;\n  background-size: inherit;\n}\n\n/* caption inherits from table not table-outer */\ncaption {\n  display: table-caption;\n  text-align: center;\n}\n\ntr {\n  display: table-row;\n  vertical-align: inherit;\n}\n\ncol {\n  display: table-column;\n}\n\ncolgroup {\n  display: table-column-group;\n}\n\ntbody {\n  display: table-row-group;\n  vertical-align: middle;\n}\n\nthead {\n  display: table-header-group;\n  vertical-align: middle;\n}\n\ntfoot {\n  display: table-footer-group;\n  vertical-align: middle;\n}\n\n/* To simulate tbody auto-insertion */\ntable > tr {\n  vertical-align: middle;\n}\n\ntd {\n  display: table-cell;\n  vertical-align: inherit;\n  text-align: inherit;\n  padding: 1px;\n}\n\nth {\n  display: table-cell;\n  vertical-align: inherit;\n  text-align: center;\n  font-weight: bold;\n  padding: 1px;\n}\n\n/* inlines */\nq {\n  quotes: '\"' '\"' \"'\" \"'\"; /* FIXME only the first level is used */\n}\n\nq:before {\n  content: open-quote;\n}\n\nq:after {\n  content: close-quote;\n}\n\n:link {\n  color: #00c;\n  text-decoration: underline;\n}\n\nb, strong {\n  font-weight: bolder;\n}\n\ni, cite, em, var, dfn {\n  font-style: italic;\n}\n\ntt, code, kbd, samp {\n  font-family: fixed;\n}\n\nu, ins {\n  text-decoration: underline;\n}\n\ns, strike, del {\n  text-decoration: line-through;\n}\n\nbig {\n  font-size: larger;\n}\n\nsmall {\n  font-size: smaller;\n}\n\nsub {\n  vertical-align: sub;\n  font-size: smaller;\n  line-height: normal;\n}\n\nsup {\n  vertical-align: super;\n  font-size: smaller;\n  line-height: normal;\n}\n\nnobr {\n  white-space: nowrap;\n}\n\nmark {\n  background: yellow;\n  color: black;\n}\n\n/* titles */\n\nabbr[title], acronym[title] {\n  text-decoration: dotted underline;\n}\n\n/* lists */\n\nul, menu, dir {\n  display: block;\n  list-style-type: disc;\n  margin: 1em 0;\n  padding-left: 40px;\n}\n\nol {\n  display: block;\n  list-style-type: decimal;\n  margin: 1em 0;\n  padding-left: 40px;\n}\n\nli {\n  display: list-item;\n}\n\n/*li:before {\n  display: -dompdf-list-bullet !important;\n  content: counter(-dompdf-default-counter) \". \";\n  padding-right: 0.5em;\n}*/\n\n/* nested lists have no top/bottom margins */\n:matches(ul, ol, dir, menu, dl) ul,\n:matches(ul, ol, dir, menu, dl) ol,\n:matches(ul, ol, dir, menu, dl) dir,\n:matches(ul, ol, dir, menu, dl) menu,\n:matches(ul, ol, dir, menu, dl) dl {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n/* 2 deep unordered lists use a circle */\n:matches(ul, ol, dir, menu) ul,\n:matches(ul, ol, dir, menu) ul,\n:matches(ul, ol, dir, menu) ul,\n:matches(ul, ol, dir, menu) ul {\n  list-style-type: circle;\n}\n\n/* 3 deep (or more) unordered lists use a square */\n:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) ul,\n:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) menu,\n:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) dir {\n  list-style-type: square;\n}\n\n/* forms */\n/* From https://drafts.csswg.org/css-ui-3/#default-style-sheet */\nform {\n  display: block;\n}\n\ninput, button, select {\n  display: inline-block;\n  font-family: sans-serif;\n}\n\ninput[type=text],\ninput[type=password],\nselect {\n  width: 12em;\n}\n\ninput[type=text],\ninput[type=password],\ninput[type=button],\ninput[type=submit],\ninput[type=reset],\ninput[type=file],\nbutton,\ntextarea,\nselect {\n  background: #FFF;\n  border: 1px solid #999;\n  padding: 2px;\n  margin: 2px;\n}\n\ninput[type=button],\ninput[type=submit],\ninput[type=reset],\ninput[type=file],\nbutton {\n  background: #CCC;\n  text-align: center;\n}\n\ninput[type=file] {\n  width: 8em;\n}\n\ninput[type=text]:before,\ninput[type=button]:before,\ninput[type=submit]:before,\ninput[type=reset]:before {\n  content: attr(value);\n}\n\ninput[type=file]:before {\n  content: \"Choose a file\";\n}\n\ninput[type=password][value]:before {\n  font-family: \"DejaVu Sans\" !important;\n  content: \"\\2022\\2022\\2022\\2022\\2022\\2022\\2022\\2022\";\n  line-height: 1em;\n}\n\ninput[type=checkbox],\ninput[type=radio],\nselect:after {\n  font-family: \"DejaVu Sans\" !important;\n  font-size: 18px;\n  line-height: 1;\n}\n\ninput[type=checkbox]:before {\n  content: \"\\2610\";\n}\n\ninput[type=checkbox][checked]:before {\n  content: \"\\2611\";\n}\n\ninput[type=radio]:before {\n  content: \"\\25CB\";\n}\n\ninput[type=radio][checked]:before {\n  content: \"\\25C9\";\n}\n\ntextarea {\n  display: block;\n  height: 3em;\n  overflow: hidden;\n  font-family: monospace;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n}\n\nselect {\n  position: relative!important;\n  overflow: hidden!important;\n}\n\nselect:after {\n  position: absolute;\n  right: 0;\n  top: 0;\n  height: 5em;\n  width: 1.4em;\n  text-align: center;\n  background: #CCC;\n  content: \"\\25BE\";\n}\n\nselect option {\n  display: none;\n}\n\nselect option[selected] {\n  display: inline;\n}\n\nfieldset {\n  display: block;\n  margin: 0.6em 2px 2px;\n  padding: 0.75em;\n  border: 1pt groove #666;\n  position: relative;\n}\n\nfieldset > legend {\n  position: absolute;\n  top: -0.6em;\n  left: 0.75em;\n  padding: 0 0.3em;\n  background: white;\n}\n\nlegend {\n  display: inline-block;\n}\n\n/* leafs */\n\nhr {\n  display: block;\n  height: 0;\n  border: 1px inset;\n  margin: 0.5em auto 0.5em auto;\n}\n\nhr[size=\"1\"] {\n  border-style: solid none none none;\n}\n\niframe {\n  border: 2px inset;\n}\n\nnoframes {\n  display: block;\n}\n\nbr {\n  display: -dompdf-br;\n}\n\nimg, img_generated {\n  display: -dompdf-image !important;\n}\n\ndompdf_generated {\n  display: inline;\n}\n\n/* hidden elements */\narea, base, basefont, head, meta, script, style, title,\nnoembed, param {\n  display: none;\n  -dompdf-keep: yes;\n}\n"
  },
  {
    "path": "application/libraries/dompdf/phpcs.xml",
    "content": "<?xml version=\"1.0\"?>\n<!--suppress XmlUnboundNsPrefix -->\n<ruleset name=\"PHP-SDK\">\n <description>Coding standard ruleset based on the PSR-2 coding standard.</description>\n <rule ref=\"PSR2\"/>\n <rule ref=\"Generic.Files.LineLength.TooLong\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR1.Files.SideEffects.FoundWithSymbols\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR1.Methods.CamelCapsMethodName.NotCamelCaps\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Methods.MethodDeclaration.Underscore\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Classes.PropertyDeclaration.Underscore\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.Scope.MethodScope.Missing\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Classes.PropertyDeclaration.ScopeMissing\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.ControlStructures.SwitchDeclaration.TerminatingComment\">\n  <severity>0</severity>\n </rule>\n <!-- These can be fixed automatically by phpcbf -->\n <rule ref=\"Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpenBrace\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.ControlStructures.ControlStructureSpacing.SpacingAfterOpenBrace\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.ControlStructures.ControlStructureSpacing.SpaceBeforeCloseBrace\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.ControlStructures.ControlSignature.SpaceAfterCloseBrace\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Generic.ControlStructures.InlineControlStructure.NotAllowed\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.ControlStructures.ElseIfDeclaration.NotAllowed\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.ControlStructures.SwitchDeclaration.BodyOnNextLineCASE\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Classes.ClassDeclaration.CloseBraceAfterBody\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Methods.FunctionCallSignature.CloseBracketLine\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Methods.FunctionCallSignature.Indent\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Methods.FunctionCallSignature.ContentAfterOpenBracket\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"PSR2.Methods.FunctionCallSignature.MultipleArguments\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.Functions.MultiLineFunctionDeclaration.SpaceAfterFunction\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.Functions.MultiLineFunctionDeclaration.ContentAfterBrace\">\n  <severity>0</severity>\n </rule>\n <rule ref=\"Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine\">\n  <severity>0</severity>\n </rule>\n</ruleset>\n"
  },
  {
    "path": "application/libraries/dompdf/phpunit.xml.dist",
    "content": "<?xml version=\"1.0\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" backupGlobals=\"false\" backupStaticAttributes=\"false\" bootstrap=\"vendor/autoload.php\" colors=\"true\" convertErrorsToExceptions=\"true\" convertNoticesToExceptions=\"true\" convertWarningsToExceptions=\"true\" processIsolation=\"false\" stopOnFailure=\"false\" xsi:noNamespaceSchemaLocation=\"https://schema.phpunit.de/9.3/phpunit.xsd\">\n  <testsuites>\n    <testsuite name=\"Dompdf Test Suite\">\n      <directory>tests</directory>\n    </testsuite>\n  </testsuites>\n</phpunit>\n"
  },
  {
    "path": "application/libraries/dompdf/src/Adapter/CPDF.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Orion Richardson <orionr@yahoo.com>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\n// FIXME: Need to sanity check inputs to this class\nnamespace Dompdf\\Adapter;\n\nuse Dompdf\\Canvas;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Exception;\nuse Dompdf\\Image\\Cache;\nuse Dompdf\\PhpEvaluator;\nuse FontLib\\Exception\\FontNotFoundException;\n\n/**\n * PDF rendering interface\n *\n * Dompdf\\Adapter\\CPDF provides a simple stateless interface to the stateful one\n * provided by the Cpdf class.\n *\n * Unless otherwise mentioned, all dimensions are in points (1/72 in).  The\n * coordinate origin is in the top left corner, and y values increase\n * downwards.\n *\n * See {@link http://www.ros.co.nz/pdf/} for more complete documentation\n * on the underlying {@link Cpdf} class.\n *\n * @package dompdf\n */\nclass CPDF implements Canvas\n{\n\n    /**\n     * Dimensions of paper sizes in points\n     *\n     * @var array;\n     */\n    static $PAPER_SIZES = [\n        \"4a0\" => [0, 0, 4767.87, 6740.79],\n        \"2a0\" => [0, 0, 3370.39, 4767.87],\n        \"a0\" => [0, 0, 2383.94, 3370.39],\n        \"a1\" => [0, 0, 1683.78, 2383.94],\n        \"a2\" => [0, 0, 1190.55, 1683.78],\n        \"a3\" => [0, 0, 841.89, 1190.55],\n        \"a4\" => [0, 0, 595.28, 841.89],\n        \"a5\" => [0, 0, 419.53, 595.28],\n        \"a6\" => [0, 0, 297.64, 419.53],\n        \"a7\" => [0, 0, 209.76, 297.64],\n        \"a8\" => [0, 0, 147.40, 209.76],\n        \"a9\" => [0, 0, 104.88, 147.40],\n        \"a10\" => [0, 0, 73.70, 104.88],\n        \"b0\" => [0, 0, 2834.65, 4008.19],\n        \"b1\" => [0, 0, 2004.09, 2834.65],\n        \"b2\" => [0, 0, 1417.32, 2004.09],\n        \"b3\" => [0, 0, 1000.63, 1417.32],\n        \"b4\" => [0, 0, 708.66, 1000.63],\n        \"b5\" => [0, 0, 498.90, 708.66],\n        \"b6\" => [0, 0, 354.33, 498.90],\n        \"b7\" => [0, 0, 249.45, 354.33],\n        \"b8\" => [0, 0, 175.75, 249.45],\n        \"b9\" => [0, 0, 124.72, 175.75],\n        \"b10\" => [0, 0, 87.87, 124.72],\n        \"c0\" => [0, 0, 2599.37, 3676.54],\n        \"c1\" => [0, 0, 1836.85, 2599.37],\n        \"c2\" => [0, 0, 1298.27, 1836.85],\n        \"c3\" => [0, 0, 918.43, 1298.27],\n        \"c4\" => [0, 0, 649.13, 918.43],\n        \"c5\" => [0, 0, 459.21, 649.13],\n        \"c6\" => [0, 0, 323.15, 459.21],\n        \"c7\" => [0, 0, 229.61, 323.15],\n        \"c8\" => [0, 0, 161.57, 229.61],\n        \"c9\" => [0, 0, 113.39, 161.57],\n        \"c10\" => [0, 0, 79.37, 113.39],\n        \"ra0\" => [0, 0, 2437.80, 3458.27],\n        \"ra1\" => [0, 0, 1729.13, 2437.80],\n        \"ra2\" => [0, 0, 1218.90, 1729.13],\n        \"ra3\" => [0, 0, 864.57, 1218.90],\n        \"ra4\" => [0, 0, 609.45, 864.57],\n        \"sra0\" => [0, 0, 2551.18, 3628.35],\n        \"sra1\" => [0, 0, 1814.17, 2551.18],\n        \"sra2\" => [0, 0, 1275.59, 1814.17],\n        \"sra3\" => [0, 0, 907.09, 1275.59],\n        \"sra4\" => [0, 0, 637.80, 907.09],\n        \"letter\" => [0, 0, 612.00, 792.00],\n        \"half-letter\" => [0, 0, 396.00, 612.00],\n        \"legal\" => [0, 0, 612.00, 1008.00],\n        \"ledger\" => [0, 0, 1224.00, 792.00],\n        \"tabloid\" => [0, 0, 792.00, 1224.00],\n        \"executive\" => [0, 0, 521.86, 756.00],\n        \"folio\" => [0, 0, 612.00, 936.00],\n        \"commercial #10 envelope\" => [0, 0, 684, 297],\n        \"catalog #10 1/2 envelope\" => [0, 0, 648, 864],\n        \"8.5x11\" => [0, 0, 612.00, 792.00],\n        \"8.5x14\" => [0, 0, 612.00, 1008.0],\n        \"11x17\" => [0, 0, 792.00, 1224.00],\n    ];\n\n    /**\n     * The Dompdf object\n     *\n     * @var Dompdf\n     */\n    protected $_dompdf;\n\n    /**\n     * Instance of Cpdf class\n     *\n     * @var \\Dompdf\\Cpdf\n     */\n    protected $_pdf;\n\n    /**\n     * PDF width, in points\n     *\n     * @var float\n     */\n    protected $_width;\n\n    /**\n     * PDF height, in points\n     *\n     * @var float;\n     */\n    protected $_height;\n\n    /**\n     * Current page number\n     *\n     * @var int\n     */\n    protected $_page_number;\n\n    /**\n     * Total number of pages\n     *\n     * @var int\n     */\n    protected $_page_count;\n\n    /**\n     * Text to display on every page\n     *\n     * @var array\n     */\n    protected $_page_text;\n\n    /**\n     * Array of pages for accessing after rendering is initially complete\n     *\n     * @var array\n     */\n    protected $_pages;\n\n    /**\n     * Array of temporary cached images to be deleted when processing is complete\n     *\n     * @var array\n     */\n    protected $_image_cache;\n\n    /**\n     * Currently-applied opacity level (0 - 1)\n     *\n     * @var float\n     */\n    protected $_current_opacity = 1;\n\n    /**\n     * Class constructor\n     *\n     * @param mixed $paper The size of paper to use in this PDF ({@link CPDF::$PAPER_SIZES})\n     * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')\n     * @param Dompdf $dompdf The Dompdf instance\n     */\n    public function __construct($paper = \"letter\", $orientation = \"portrait\", Dompdf $dompdf = null)\n    {\n        if (is_array($paper)) {\n            $size = $paper;\n        } else if (isset(self::$PAPER_SIZES[mb_strtolower($paper)])) {\n            $size = self::$PAPER_SIZES[mb_strtolower($paper)];\n        } else {\n            $size = self::$PAPER_SIZES[\"letter\"];\n        }\n\n        if (mb_strtolower($orientation) === \"landscape\") {\n            [$size[2], $size[3]] = [$size[3], $size[2]];\n        }\n\n        if ($dompdf === null) {\n            $this->_dompdf = new Dompdf();\n        } else {\n            $this->_dompdf = $dompdf;\n        }\n\n        $this->_pdf = new \\Dompdf\\Cpdf(\n            $size,\n            true,\n            $this->_dompdf->getOptions()->getFontCache(),\n            $this->_dompdf->getOptions()->getTempDir()\n        );\n\n        $this->_pdf->addInfo(\"Producer\", sprintf(\"%s + CPDF\", $this->_dompdf->version));\n        $time = substr_replace(date('YmdHisO'), '\\'', -2, 0) . '\\'';\n        $this->_pdf->addInfo(\"CreationDate\", \"D:$time\");\n        $this->_pdf->addInfo(\"ModDate\", \"D:$time\");\n\n        $this->_width = $size[2] - $size[0];\n        $this->_height = $size[3] - $size[1];\n\n        $this->_page_number = $this->_page_count = 1;\n        $this->_page_text = [];\n\n        $this->_pages = [$this->_pdf->getFirstPageId()];\n\n        $this->_image_cache = [];\n    }\n\n    /**\n     * @return Dompdf\n     */\n    public function get_dompdf()\n    {\n        return $this->_dompdf;\n    }\n\n    /**\n     * Class destructor\n     *\n     * Deletes all temporary image files\n     */\n    public function __destruct()\n    {\n        foreach ($this->_image_cache as $img) {\n            // The file might be already deleted by 3rd party tmp cleaner,\n            // the file might not have been created at all\n            // (if image outputting commands failed)\n            // or because the destructor was called twice accidentally.\n            if (!file_exists($img)) {\n                continue;\n            }\n\n            if ($this->_dompdf->getOptions()->getDebugPng()) {\n                print '[__destruct unlink ' . $img . ']';\n            }\n            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {\n                unlink($img);\n            }\n        }\n    }\n\n    /**\n     * Returns the Cpdf instance\n     *\n     * @return \\Dompdf\\Cpdf\n     */\n    public function get_cpdf()\n    {\n        return $this->_pdf;\n    }\n\n    /**\n     * Add meta information to the PDF\n     *\n     * @param string $label label of the value (Creator, Producer, etc.)\n     * @param string $value the text to set\n     */\n    public function add_info($label, $value)\n    {\n        $this->_pdf->addInfo($label, $value);\n    }\n\n    /**\n     * Opens a new 'object'\n     *\n     * While an object is open, all drawing actions are recorded in the object,\n     * as opposed to being drawn on the current page.  Objects can be added\n     * later to a specific page or to several pages.\n     *\n     * The return value is an integer ID for the new object.\n     *\n     * @see CPDF::close_object()\n     * @see CPDF::add_object()\n     *\n     * @return int\n     */\n    public function open_object()\n    {\n        $ret = $this->_pdf->openObject();\n        $this->_pdf->saveState();\n        return $ret;\n    }\n\n    /**\n     * Reopens an existing 'object'\n     *\n     * @see CPDF::open_object()\n     * @param int $object the ID of a previously opened object\n     */\n    public function reopen_object($object)\n    {\n        $this->_pdf->reopenObject($object);\n        $this->_pdf->saveState();\n    }\n\n    /**\n     * Closes the current 'object'\n     *\n     * @see CPDF::open_object()\n     */\n    public function close_object()\n    {\n        $this->_pdf->restoreState();\n        $this->_pdf->closeObject();\n    }\n\n    /**\n     * Adds a specified 'object' to the document\n     *\n     * $object int specifying an object created with {@link\n     * CPDF::open_object()}.  $where can be one of:\n     * - 'add' add to current page only\n     * - 'all' add to every page from the current one onwards\n     * - 'odd' add to all odd numbered pages from now on\n     * - 'even' add to all even numbered pages from now on\n     * - 'next' add the object to the next page only\n     * - 'nextodd' add to all odd numbered pages from the next one\n     * - 'nexteven' add to all even numbered pages from the next one\n     *\n     * @see Cpdf::addObject()\n     *\n     * @param int $object\n     * @param string $where\n     */\n    public function add_object($object, $where = 'all')\n    {\n        $this->_pdf->addObject($object, $where);\n    }\n\n    /**\n     * Stops the specified 'object' from appearing in the document.\n     *\n     * The object will stop being displayed on the page following the current\n     * one.\n     *\n     * @param int $object\n     */\n    public function stop_object($object)\n    {\n        $this->_pdf->stopObject($object);\n    }\n\n    /**\n     * @access private\n     */\n    public function serialize_object($id)\n    {\n        // Serialize the pdf object's current state for retrieval later\n        return $this->_pdf->serializeObject($id);\n    }\n\n    /**\n     * @access private\n     */\n    public function reopen_serialized_object($obj)\n    {\n        return $this->_pdf->restoreSerializedObject($obj);\n    }\n\n    //........................................................................\n\n    /**\n     * Returns the PDF's width in points\n     * @return float\n     */\n    public function get_width()\n    {\n        return $this->_width;\n    }\n\n    /**\n     * Returns the PDF's height in points\n     * @return float\n     */\n    public function get_height()\n    {\n        return $this->_height;\n    }\n\n    /**\n     * Returns the current page number\n     * @return int\n     */\n    public function get_page_number()\n    {\n        return $this->_page_number;\n    }\n\n    /**\n     * Returns the total number of pages in the document\n     * @return int\n     */\n    public function get_page_count()\n    {\n        return $this->_page_count;\n    }\n\n    /**\n     * Sets the current page number\n     *\n     * @param int $num\n     */\n    public function set_page_number($num)\n    {\n        $this->_page_number = $num;\n    }\n\n    /**\n     * Sets the page count\n     *\n     * @param int $count\n     */\n    public function set_page_count($count)\n    {\n        $this->_page_count = $count;\n    }\n\n    /**\n     * Sets the stroke color\n     *\n     * See {@link Style::set_color()} for the format of the color array.\n     * @param array $color\n     */\n    protected function _set_stroke_color($color)\n    {\n        $this->_pdf->setStrokeColor($color);\n        $alpha = isset($color[\"alpha\"]) ? $color[\"alpha\"] : 1;\n        if ($this->_current_opacity != 1) {\n            $alpha *= $this->_current_opacity;\n        }\n        $this->_set_line_transparency(\"Normal\", $alpha);\n    }\n\n    /**\n     * Sets the fill colour\n     *\n     * See {@link Style::set_color()} for the format of the colour array.\n     * @param array $color\n     */\n    protected function _set_fill_color($color)\n    {\n        $this->_pdf->setColor($color);\n        $alpha = isset($color[\"alpha\"]) ? $color[\"alpha\"] : 1;\n        if ($this->_current_opacity) {\n            $alpha *= $this->_current_opacity;\n        }\n        $this->_set_fill_transparency(\"Normal\", $alpha);\n    }\n\n    /**\n     * Sets line transparency\n     * @see Cpdf::setLineTransparency()\n     *\n     * Valid blend modes are (case-sensitive):\n     *\n     * Normal, Multiply, Screen, Overlay, Darken, Lighten,\n     * ColorDodge, ColorBurn, HardLight, SoftLight, Difference,\n     * Exclusion\n     *\n     * @param string $mode the blending mode to use\n     * @param float $opacity 0.0 fully transparent, 1.0 fully opaque\n     */\n    protected function _set_line_transparency($mode, $opacity)\n    {\n        $this->_pdf->setLineTransparency($mode, $opacity);\n    }\n\n    /**\n     * Sets fill transparency\n     * @see Cpdf::setFillTransparency()\n     *\n     * Valid blend modes are (case-sensitive):\n     *\n     * Normal, Multiply, Screen, Overlay, Darken, Lighten,\n     * ColorDogde, ColorBurn, HardLight, SoftLight, Difference,\n     * Exclusion\n     *\n     * @param string $mode the blending mode to use\n     * @param float $opacity 0.0 fully transparent, 1.0 fully opaque\n     */\n    protected function _set_fill_transparency($mode, $opacity)\n    {\n        $this->_pdf->setFillTransparency($mode, $opacity);\n    }\n\n    /**\n     * Sets the line style\n     *\n     * @see Cpdf::setLineStyle()\n     *\n     * @param float $width\n     * @param string $cap\n     * @param string $join\n     * @param array $dash\n     */\n    protected function _set_line_style($width, $cap, $join, $dash)\n    {\n        $this->_pdf->setLineStyle($width, $cap, $join, $dash);\n    }\n\n    /**\n     * Sets the opacity\n     *\n     * @param $opacity\n     * @param $mode\n     */\n    public function set_opacity($opacity, $mode = \"Normal\")\n    {\n        $this->_set_line_transparency($mode, $opacity);\n        $this->_set_fill_transparency($mode, $opacity);\n        $this->_current_opacity = $opacity;\n    }\n\n    public function set_default_view($view, $options = [])\n    {\n        array_unshift($options, $view);\n        call_user_func_array([$this->_pdf, \"openHere\"], $options);\n    }\n\n    /**\n     * Remaps y coords from 4th to 1st quadrant\n     *\n     * @param float $y\n     * @return float\n     */\n    protected function y($y)\n    {\n        return $this->_height - $y;\n    }\n\n    /**\n     * Canvas implementation\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $x2\n     * @param float $y2\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function line($x1, $y1, $x2, $y2, $color, $width, $style = [])\n    {\n        $this->_set_stroke_color($color);\n        $this->_set_line_style($width, \"butt\", \"\", $style);\n\n        $this->_pdf->line($x1, $this->y($y1),\n            $x2, $this->y($y2));\n        $this->_set_line_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * Draw line at the specified coordinates on every page.\n     *\n     * See {@link Style::munge_color()} for the format of the colour array.\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $x2\n     * @param float $y2\n     * @param array $color\n     * @param float $width\n     * @param array $style optional\n     */\n    public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = [])\n    {\n        $_t = 'line';\n        $this->_page_text[] = compact('_t', 'x1', 'y1', 'x2', 'y2', 'color', 'width', 'style');\n    }\n\n    /**\n     * @param float $x\n     * @param float $y\n     * @param float $r1\n     * @param float $r2\n     * @param float $astart\n     * @param float $aend\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = [])\n    {\n        $this->_set_stroke_color($color);\n        $this->_set_line_style($width, \"butt\", \"\", $style);\n\n        $this->_pdf->ellipse($x, $this->y($y), $r1, $r2, 0, 8, $astart, $aend, false, false, true, false);\n        $this->_set_line_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * Convert image to a PNG image\n     *\n     * @param string $image_url\n     * @param int $type\n     *\n     * @throws Exception\n     * @return string The url of the newly converted image\n     */\n    protected function _convert_to_png($image_url, $type)\n    {\n        $func_name = \"imagecreatefrom$type\";\n\n        if (!function_exists($func_name)) {\n            if (!method_exists(Helpers::class, $func_name)) {\n                throw new Exception(\"Function $func_name() not found.  Cannot convert $type image: $image_url.  Please install the image PHP extension.\");\n            }\n            $func_name = \"\\\\Dompdf\\\\Helpers::\" . $func_name;\n        }\n\n        set_error_handler([Helpers::class, 'record_warnings']);\n\n        try {\n            $im = call_user_func($func_name, $image_url);\n\n            if ($im) {\n                imageinterlace($im, false);\n\n                $tmp_dir = $this->_dompdf->getOptions()->getTempDir();\n                $tmp_name = @tempnam($tmp_dir, \"{$type}dompdf_img_\");\n                @unlink($tmp_name);\n                $filename = \"$tmp_name.png\";\n                $this->_image_cache[] = $filename;\n\n                imagepng($im, $filename);\n                imagedestroy($im);\n            } else {\n                $filename = Cache::$broken_image;\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $filename;\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function rectangle($x1, $y1, $w, $h, $color, $width, $style = [])\n    {\n        $this->_set_stroke_color($color);\n        $this->_set_line_style($width, \"butt\", \"\", $style);\n        $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h);\n        $this->_set_line_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     */\n    public function filled_rectangle($x1, $y1, $w, $h, $color)\n    {\n        $this->_set_fill_color($color);\n        $this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h);\n        $this->_set_fill_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     */\n    public function clipping_rectangle($x1, $y1, $w, $h)\n    {\n        $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h);\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param float $rTL\n     * @param float $rTR\n     * @param float $rBR\n     * @param float $rBL\n     */\n    public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)\n    {\n        $this->_pdf->clippingRectangleRounded($x1, $this->y($y1) - $h, $w, $h, $rTL, $rTR, $rBR, $rBL);\n    }\n\n    /**\n     *\n     */\n    public function clipping_end()\n    {\n        $this->_pdf->clippingEnd();\n    }\n\n    /**\n     *\n     */\n    public function save()\n    {\n        $this->_pdf->saveState();\n    }\n\n    /**\n     *\n     */\n    public function restore()\n    {\n        $this->_pdf->restoreState();\n    }\n\n    /**\n     * @param $angle\n     * @param $x\n     * @param $y\n     */\n    public function rotate($angle, $x, $y)\n    {\n        $this->_pdf->rotate($angle, $x, $y);\n    }\n\n    /**\n     * @param $angle_x\n     * @param $angle_y\n     * @param $x\n     * @param $y\n     */\n    public function skew($angle_x, $angle_y, $x, $y)\n    {\n        $this->_pdf->skew($angle_x, $angle_y, $x, $y);\n    }\n\n    /**\n     * @param $s_x\n     * @param $s_y\n     * @param $x\n     * @param $y\n     */\n    public function scale($s_x, $s_y, $x, $y)\n    {\n        $this->_pdf->scale($s_x, $s_y, $x, $y);\n    }\n\n    /**\n     * @param $t_x\n     * @param $t_y\n     */\n    public function translate($t_x, $t_y)\n    {\n        $this->_pdf->translate($t_x, $t_y);\n    }\n\n    /**\n     * @param $a\n     * @param $b\n     * @param $c\n     * @param $d\n     * @param $e\n     * @param $f\n     */\n    public function transform($a, $b, $c, $d, $e, $f)\n    {\n        $this->_pdf->transform([$a, $b, $c, $d, $e, $f]);\n    }\n\n    /**\n     * @param array $points\n     * @param array $color\n     * @param null $width\n     * @param array $style\n     * @param bool $fill\n     */\n    public function polygon($points, $color, $width = null, $style = [], $fill = false)\n    {\n        $this->_set_fill_color($color);\n        $this->_set_stroke_color($color);\n\n        // Adjust y values\n        for ($i = 1; $i < count($points); $i += 2) {\n            $points[$i] = $this->y($points[$i]);\n        }\n\n        $this->_pdf->polygon($points, count($points) / 2, $fill);\n\n        $this->_set_fill_transparency(\"Normal\", $this->_current_opacity);\n        $this->_set_line_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * @param float $x\n     * @param float $y\n     * @param float $r1\n     * @param array $color\n     * @param null $width\n     * @param null $style\n     * @param bool $fill\n     */\n    public function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false)\n    {\n        $this->_set_fill_color($color);\n        $this->_set_stroke_color($color);\n\n        if (!$fill && isset($width)) {\n            $this->_set_line_style($width, \"round\", \"round\", $style);\n        }\n\n        $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill);\n\n        $this->_set_fill_transparency(\"Normal\", $this->_current_opacity);\n        $this->_set_line_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * @param string $img\n     * @param float $x\n     * @param float $y\n     * @param int $w\n     * @param int $h\n     * @param string $resolution\n     */\n    public function image($img, $x, $y, $w, $h, $resolution = \"normal\")\n    {\n        [$width, $height, $type] = Helpers::dompdf_getimagesize($img, $this->get_dompdf()->getHttpContext());\n\n        $debug_png = $this->_dompdf->getOptions()->getDebugPng();\n\n        if ($debug_png) {\n            print \"[image:$img|$width|$height|$type]\";\n        }\n\n        switch ($type) {\n            case \"jpeg\":\n                if ($debug_png) {\n                    print '!!!jpg!!!';\n                }\n                $this->_pdf->addJpegFromFile($img, $x, $this->y($y) - $h, $w, $h);\n                break;\n\n            case \"webp\":\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case \"gif\":\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case \"bmp\":\n                if ($debug_png) print \"!!!{$type}!!!\";\n                // @todo use cache for converted images (BMP/GIF/WebP)\n                $img = $this->_convert_to_png($img, $type);\n\n            case \"png\":\n                if ($debug_png) print '!!!png!!!';\n\n                $this->_pdf->addPngFromFile($img, $x, $this->y($y) - $h, $w, $h);\n                break;\n\n            case \"svg\":\n                if ($debug_png) print '!!!SVG!!!';\n\n                $this->_pdf->addSvgFromFile($img, $x, $this->y($y) - $h, $w, $h);\n                break;\n\n            default:\n                if ($debug_png) print '!!!unknown!!!';\n        }\n    }\n\n    public function select($x, $y, $w, $h, $font, $size, $color = [0, 0, 0], $opts = [])\n    {\n        $pdf = $this->_pdf;\n\n        $font .= \".afm\";\n        $pdf->selectFont($font);\n\n        if (!isset($pdf->acroFormId)) {\n            $pdf->addForm();\n        }\n\n        $ft = \\Dompdf\\Cpdf::ACROFORM_FIELD_CHOICE;\n        $ff = \\Dompdf\\Cpdf::ACROFORM_FIELD_CHOICE_COMBO;\n\n        $id = $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color);\n        $pdf->setFormFieldOpt($id, $opts);\n    }\n\n    public function textarea($x, $y, $w, $h, $font, $size, $color = [0, 0, 0])\n    {\n        $pdf = $this->_pdf;\n\n        $font .= \".afm\";\n        $pdf->selectFont($font);\n\n        if (!isset($pdf->acroFormId)) {\n            $pdf->addForm();\n        }\n\n        $ft = \\Dompdf\\Cpdf::ACROFORM_FIELD_TEXT;\n        $ff = \\Dompdf\\Cpdf::ACROFORM_FIELD_TEXT_MULTILINE;\n\n        $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color);\n    }\n\n    public function input($x, $y, $w, $h, $type, $font, $size, $color = [0, 0, 0])\n    {\n        $pdf = $this->_pdf;\n\n        $font .= \".afm\";\n        $pdf->selectFont($font);\n\n        if (!isset($pdf->acroFormId)) {\n            $pdf->addForm();\n        }\n\n        $ft = \\Dompdf\\Cpdf::ACROFORM_FIELD_TEXT;\n        $ff = 0;\n\n        switch ($type) {\n            case 'text':\n                $ft = \\Dompdf\\Cpdf::ACROFORM_FIELD_TEXT;\n                break;\n            case 'password':\n                $ft = \\Dompdf\\Cpdf::ACROFORM_FIELD_TEXT;\n                $ff = \\Dompdf\\Cpdf::ACROFORM_FIELD_TEXT_PASSWORD;\n                break;\n            case 'submit':\n                $ft = \\Dompdf\\Cpdf::ACROFORM_FIELD_BUTTON;\n                break;\n        }\n\n        $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color);\n    }\n\n    /**\n     * @param float $x\n     * @param float $y\n     * @param string $text\n     * @param string $font\n     * @param float $size\n     * @param array $color\n     * @param float $word_space\n     * @param float $char_space\n     * @param float $angle\n     */\n    public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)\n    {\n        $pdf = $this->_pdf;\n\n        $this->_set_fill_color($color);\n\n        $is_font_subsetting = $this->_dompdf->getOptions()->getIsFontSubsettingEnabled();\n        $pdf->selectFont($font . '.afm', '', true, $is_font_subsetting);\n\n        $pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size), $size, $text, $angle, $word_space, $char_space);\n\n        $this->_set_fill_transparency(\"Normal\", $this->_current_opacity);\n    }\n\n    /**\n     * @param string $code\n     */\n    public function javascript($code)\n    {\n        $this->_pdf->addJavascript($code);\n    }\n\n    //........................................................................\n\n    /**\n     * Add a named destination (similar to <a name=\"foo\">...</a> in html)\n     *\n     * @param string $anchorname The name of the named destination\n     */\n    public function add_named_dest($anchorname)\n    {\n        $this->_pdf->addDestination($anchorname, \"Fit\");\n    }\n\n    /**\n     * Add a link to the pdf\n     *\n     * @param string $url The url to link to\n     * @param float $x The x position of the link\n     * @param float $y The y position of the link\n     * @param float $width The width of the link\n     * @param float $height The height of the link\n     */\n    public function add_link($url, $x, $y, $width, $height)\n    {\n        $y = $this->y($y) - $height;\n\n        if (strpos($url, '#') === 0) {\n            // Local link\n            $name = substr($url, 1);\n            if ($name) {\n                $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height);\n            }\n        } else {\n            $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height);\n        }\n    }\n\n    /**\n     * @param string $text\n     * @param string $font\n     * @param float $size\n     * @param float $word_spacing\n     * @param float $char_spacing\n     * @return float\n     */\n    public function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0)\n    {\n        $this->_pdf->selectFont($font, '', true, $this->_dompdf->getOptions()->getIsFontSubsettingEnabled());\n        return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing);\n    }\n\n    /**\n     * @param string $font\n     * @param float $size\n     * @return float|int\n     * @throws FontNotFoundException\n     */\n    public function get_font_height($font, $size)\n    {\n        $options = $this->_dompdf->getOptions();\n        $this->_pdf->selectFont($font, '', true, $options->getIsFontSubsettingEnabled());\n\n        return $this->_pdf->getFontHeight($size) * $options->getFontHeightRatio();\n    }\n\n    /*function get_font_x_height($font, $size) {\n      $this->_pdf->selectFont($font);\n      $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();\n      return $this->_pdf->getFontXHeight($size) * $ratio;\n    }*/\n\n    /**\n     * @param string $font\n     * @param float $size\n     * @return float\n     */\n    public function get_font_baseline($font, $size)\n    {\n        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();\n        return $this->get_font_height($font, $size) / $ratio;\n    }\n\n    /**\n     * Writes text at the specified x and y coordinates on every page\n     *\n     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced\n     * with their current values.\n     *\n     * See {@link Style::munge_color()} for the format of the colour array.\n     *\n     * @param float $x\n     * @param float $y\n     * @param string $text the text to write\n     * @param string $font the font file to use\n     * @param float $size the font size, in points\n     * @param array $color\n     * @param float $word_space word spacing adjustment\n     * @param float $char_space char spacing adjustment\n     * @param float $angle angle to write the text at, measured CW starting from the x-axis\n     */\n    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)\n    {\n        $_t = \"text\";\n        $this->_page_text[] = compact(\"_t\", \"x\", \"y\", \"text\", \"font\", \"size\", \"color\", \"word_space\", \"char_space\", \"angle\");\n    }\n\n    /**\n     * Processes a script on every page\n     *\n     * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available.\n     *\n     * This function can be used to add page numbers to all pages\n     * after the first one, for example.\n     *\n     * @param string $code the script code\n     * @param string $type the language type for script\n     */\n    public function page_script($code, $type = \"text/php\")\n    {\n        $_t = \"script\";\n        $this->_page_text[] = compact(\"_t\", \"code\", \"type\");\n    }\n\n    /**\n     * @return int\n     */\n    public function new_page()\n    {\n        $this->_page_number++;\n        $this->_page_count++;\n\n        $ret = $this->_pdf->newPage();\n        $this->_pages[] = $ret;\n        return $ret;\n    }\n\n    /**\n     * Add text to each page after rendering is complete\n     */\n    protected function _add_page_text()\n    {\n        if (!count($this->_page_text)) {\n            return;\n        }\n\n        $page_number = 1;\n        $eval = null;\n\n        foreach ($this->_pages as $pid) {\n            $this->reopen_object($pid);\n\n            foreach ($this->_page_text as $pt) {\n                extract($pt);\n\n                switch ($_t) {\n                    case \"text\":\n                        $text = str_replace([\"{PAGE_NUM}\", \"{PAGE_COUNT}\"],\n                            [$page_number, $this->_page_count], $text);\n                        $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);\n                        break;\n\n                    case \"script\":\n                        if (!$eval) {\n                            $eval = new PhpEvaluator($this);\n                        }\n                        $eval->evaluate($code, ['PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count]);\n                        break;\n\n                    case 'line':\n                        $this->line($x1, $y1, $x2, $y2, $color, $width, $style);\n                        break;\n                }\n            }\n\n            $this->close_object();\n            $page_number++;\n        }\n    }\n\n    /**\n     * Streams the PDF to the client.\n     *\n     * @param string $filename The filename to present to the client.\n     * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).\n     */\n    public function stream($filename = \"document.pdf\", $options = [])\n    {\n        if (headers_sent()) {\n            die(\"Unable to stream pdf: headers already sent\");\n        }\n\n        if (!isset($options[\"compress\"])) $options[\"compress\"] = true;\n        if (!isset($options[\"Attachment\"])) $options[\"Attachment\"] = true;\n\n        $this->_add_page_text();\n\n        $debug = !$options['compress'];\n        $tmp = ltrim($this->_pdf->output($debug));\n\n        header(\"Cache-Control: private\");\n        header(\"Content-Type: application/pdf\");\n        header(\"Content-Length: \" . mb_strlen($tmp, \"8bit\"));\n\n        $filename = str_replace([\"\\n\", \"'\"], \"\", basename($filename, \".pdf\")) . \".pdf\";\n        $attachment = $options[\"Attachment\"] ? \"attachment\" : \"inline\";\n        header(Helpers::buildContentDispositionHeader($attachment, $filename));\n\n        echo $tmp;\n        flush();\n    }\n\n    /**\n     * Returns the PDF as a string.\n     *\n     * @param array $options Associative array: 'compress' => 1 or 0 (default 1).\n     * @return string\n     */\n    public function output($options = [])\n    {\n        if (!isset($options[\"compress\"])) $options[\"compress\"] = true;\n\n        $this->_add_page_text();\n\n        $debug = !$options['compress'];\n\n        return $this->_pdf->output($debug);\n    }\n\n    /**\n     * Returns logging messages generated by the Cpdf class\n     *\n     * @return string\n     */\n    public function get_messages()\n    {\n        return $this->_pdf->messages;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Adapter/GD.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Adapter;\n\nuse Dompdf\\Canvas;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Image\\Cache;\nuse Dompdf\\Helpers;\n\n/**\n * Image rendering interface\n *\n * Renders to an image format supported by GD (jpeg, gif, png, xpm).\n * Not super-useful day-to-day but handy nonetheless\n *\n * @package dompdf\n */\nclass GD implements Canvas\n{\n    /**\n     * @var Dompdf\n     */\n    protected $_dompdf;\n\n    /**\n     * Resource handle for the image\n     *\n     * @var resource\n     */\n    protected $_img;\n\n    /**\n     * Resource handle for the image\n     *\n     * @var resource[]\n     */\n    protected $_imgs;\n\n    /**\n     * Apparent canvas width in pixels\n     *\n     * @var int\n     */\n    protected $_width;\n\n    /**\n     * Apparent canvas height in pixels\n     *\n     * @var int\n     */\n    protected $_height;\n\n    /**\n     * Actual image width in pixels\n     *\n     * @var int\n     */\n    protected $_actual_width;\n\n    /**\n     * Actual image height in pixels\n     *\n     * @var int\n     */\n    protected $_actual_height;\n\n    /**\n     * Current page number\n     *\n     * @var int\n     */\n    protected $_page_number;\n\n    /**\n     * Total number of pages\n     *\n     * @var int\n     */\n    protected $_page_count;\n\n    /**\n     * Image antialias factor\n     *\n     * @var float\n     */\n    protected $_aa_factor;\n\n    /**\n     * Allocated colors\n     *\n     * @var array\n     */\n    protected $_colors;\n\n    /**\n     * Background color\n     *\n     * @var int\n     */\n    protected $_bg_color;\n\n    /**\n     * Background color array\n     *\n     * @var int\n     */\n    protected $_bg_color_array;\n\n    /**\n     * Actual DPI\n     *\n     * @var int\n     */\n    protected $dpi;\n\n    /**\n     * Amount to scale font sizes\n     *\n     * Font sizes are 72 DPI, GD internally uses 96. Scale them proportionally.\n     * 72 / 96 = 0.75.\n     *\n     * @var float\n     */\n    const FONT_SCALE = 0.75;\n\n    /**\n     * Class constructor\n     *\n     * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or \"letter\", \"legal\", etc.\n     * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')\n     * @param Dompdf $dompdf\n     * @param float $aa_factor Anti-aliasing factor, 1 for no AA\n     * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1\n     */\n    public function __construct($size = 'letter', $orientation = \"portrait\", Dompdf $dompdf = null, $aa_factor = 1.0, $bg_color = [1, 1, 1, 0])\n    {\n\n        if (!is_array($size)) {\n            $size = strtolower($size);\n\n            if (isset(CPDF::$PAPER_SIZES[$size])) {\n                $size = CPDF::$PAPER_SIZES[$size];\n            } else {\n                $size = CPDF::$PAPER_SIZES[\"letter\"];\n            }\n        }\n\n        if (strtolower($orientation) === \"landscape\") {\n            list($size[2], $size[3]) = [$size[3], $size[2]];\n        }\n\n        if ($dompdf === null) {\n            $this->_dompdf = new Dompdf();\n        } else {\n            $this->_dompdf = $dompdf;\n        }\n\n        $this->dpi = $this->get_dompdf()->getOptions()->getDpi();\n\n        if ($aa_factor < 1) {\n            $aa_factor = 1;\n        }\n\n        $this->_aa_factor = $aa_factor;\n\n        $size[2] *= $aa_factor;\n        $size[3] *= $aa_factor;\n\n        $this->_width = $size[2] - $size[0];\n        $this->_height = $size[3] - $size[1];\n\n        $this->_actual_width = $this->_upscale($this->_width);\n        $this->_actual_height = $this->_upscale($this->_height);\n\n        $this->_page_number = $this->_page_count = 0;\n        $this->_page_text = [];\n\n        if (is_null($bg_color) || !is_array($bg_color)) {\n            // Pure white bg\n            $bg_color = [1, 1, 1, 0];\n        }\n\n        $this->_bg_color_array = $bg_color;\n\n        $this->new_page();\n    }\n\n    /**\n     * @return Dompdf\n     */\n    public function get_dompdf()\n    {\n        return $this->_dompdf;\n    }\n\n    /**\n     * Return the GF image resource\n     *\n     * @return resource\n     */\n    public function get_image()\n    {\n        return $this->_img;\n    }\n\n    /**\n     * Return the image's width in pixels\n     *\n     * @return float\n     */\n    public function get_width()\n    {\n        return $this->_width / $this->_aa_factor;\n    }\n\n    /**\n     * Return the image's height in pixels\n     *\n     * @return float\n     */\n    public function get_height()\n    {\n        return $this->_height / $this->_aa_factor;\n    }\n\n    /**\n     * Returns the current page number\n     * @return int\n     */\n    public function get_page_number()\n    {\n        return $this->_page_number;\n    }\n\n    /**\n     * Returns the total number of pages in the document\n     * @return int\n     */\n    public function get_page_count()\n    {\n        return $this->_page_count;\n    }\n\n    /**\n     * Sets the current page number\n     *\n     * @param int $num\n     */\n    public function set_page_number($num)\n    {\n        $this->_page_number = $num;\n    }\n\n    /**\n     * Sets the page count\n     *\n     * @param int $count\n     */\n    public function set_page_count($count)\n    {\n        $this->_page_count = $count;\n    }\n\n    /**\n     * Sets the opacity\n     *\n     * @param $opacity\n     * @param $mode\n     */\n    public function set_opacity($opacity, $mode = \"Normal\")\n    {\n        // FIXME\n    }\n\n    /**\n     * Allocate a new color.  Allocate with GD as needed and store\n     * previously allocated colors in $this->_colors.\n     *\n     * @param array $color The new current color\n     * @return int           The allocated color\n     */\n    protected function _allocate_color($color)\n    {\n        $a = isset($color[\"alpha\"]) ? $color[\"alpha\"] : 1;\n\n        if (isset($color[\"c\"])) {\n            $color = Helpers::cmyk_to_rgb($color);\n        }\n\n        list($r, $g, $b) = $color;\n\n        $r *= 255;\n        $g *= 255;\n        $b *= 255;\n        $a = 127 - ($a * 127);\n\n        // Clip values\n        $r = $r > 255 ? 255 : $r;\n        $g = $g > 255 ? 255 : $g;\n        $b = $b > 255 ? 255 : $b;\n        $a = $a > 127 ? 127 : $a;\n\n        $r = $r < 0 ? 0 : $r;\n        $g = $g < 0 ? 0 : $g;\n        $b = $b < 0 ? 0 : $b;\n        $a = $a < 0 ? 0 : $a;\n\n        $key = sprintf(\"#%02X%02X%02X%02X\", $r, $g, $b, $a);\n\n        if (isset($this->_colors[$key])) {\n            return $this->_colors[$key];\n        }\n\n        if ($a != 0) {\n            $this->_colors[$key] = imagecolorallocatealpha($this->get_image(), $r, $g, $b, $a);\n        } else {\n            $this->_colors[$key] = imagecolorallocate($this->get_image(), $r, $g, $b);\n        }\n\n        return $this->_colors[$key];\n    }\n\n    /**\n     * Scales value up to the current canvas DPI from 72 DPI\n     *\n     * @param float $length\n     * @return float\n     */\n    protected function _upscale($length)\n    {\n        return ($length * $this->dpi) / 72 * $this->_aa_factor;\n    }\n\n    /**\n     * Scales value down from the current canvas DPI to 72 DPI\n     *\n     * @param float $length\n     * @return float\n     */\n    protected function _downscale($length)\n    {\n        return ($length / $this->dpi * 72) / $this->_aa_factor;\n    }\n\n    /**\n     * Draws a line from x1,y1 to x2,y2\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the format of the\n     * $style parameter (aka dash).\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $x2\n     * @param float $y2\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function line($x1, $y1, $x2, $y2, $color, $width, $style = null)\n    {\n\n        // Scale by the AA factor and DPI\n        $x1 = $this->_upscale($x1);\n        $y1 = $this->_upscale($y1);\n        $x2 = $this->_upscale($x2);\n        $y2 = $this->_upscale($y2);\n        $width = $this->_upscale($width);\n\n        $c = $this->_allocate_color($color);\n\n        // Convert the style array if required\n        if (is_array($style) && count($style) > 0) {\n            $gd_style = [];\n\n            if (count($style) == 1) {\n                for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {\n                    $gd_style[] = $c;\n                }\n\n                for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {\n                    $gd_style[] = $this->_bg_color;\n                }\n            } else {\n                $i = 0;\n                foreach ($style as $length) {\n                    if ($i % 2 == 0) {\n                        // 'On' pattern\n                        for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {\n                            $gd_style[] = $c;\n                        }\n\n                    } else {\n                        // Off pattern\n                        for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {\n                            $gd_style[] = $this->_bg_color;\n                        }\n                    }\n                    $i++;\n                }\n            }\n\n            if (!empty($gd_style)) {\n                imagesetstyle($this->get_image(), $gd_style);\n                $c = IMG_COLOR_STYLED;\n            }\n        }\n\n        imagesetthickness($this->get_image(), $width);\n\n        imageline($this->get_image(), $x1, $y1, $x2, $y2, $c);\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $r1\n     * @param float $r2\n     * @param float $astart\n     * @param float $aend\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = [])\n    {\n        // @todo\n    }\n\n    /**\n     * Draws a rectangle at x1,y1 with width w and height h\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the $style\n     * parameter (aka dash)\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function rectangle($x1, $y1, $w, $h, $color, $width, $style = null)\n    {\n\n        // Scale by the AA factor and DPI\n        $x1 = $this->_upscale($x1);\n        $y1 = $this->_upscale($y1);\n        $w = $this->_upscale($w);\n        $h = $this->_upscale($h);\n        $width = $this->_upscale($width);\n\n        $c = $this->_allocate_color($color);\n\n        // Convert the style array if required\n        if (is_array($style) && count($style) > 0) {\n            $gd_style = [];\n\n            foreach ($style as $length) {\n                for ($i = 0; $i < $length; $i++) {\n                    $gd_style[] = $c;\n                }\n            }\n\n            if (!empty($gd_style)) {\n                imagesetstyle($this->get_image(), $gd_style);\n                $c = IMG_COLOR_STYLED;\n            }\n        }\n\n        imagesetthickness($this->get_image(), $width);\n\n        imagerectangle($this->get_image(), $x1, $y1, $x1 + $w, $y1 + $h, $c);\n    }\n\n    /**\n     * Draws a filled rectangle at x1,y1 with width w and height h\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     */\n    public function filled_rectangle($x1, $y1, $w, $h, $color)\n    {\n        // Scale by the AA factor and DPI\n        $x1 = $this->_upscale($x1);\n        $y1 = $this->_upscale($y1);\n        $w = $this->_upscale($w);\n        $h = $this->_upscale($h);\n\n        $c = $this->_allocate_color($color);\n\n        imagefilledrectangle($this->get_image(), $x1, $y1, $x1 + $w, $y1 + $h, $c);\n    }\n\n    /**\n     * Starts a clipping rectangle at x1,y1 with width w and height h\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     */\n    public function clipping_rectangle($x1, $y1, $w, $h)\n    {\n        // @todo\n    }\n\n    public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)\n    {\n        // @todo\n    }\n\n    /**\n     * Ends the last clipping shape\n     */\n    public function clipping_end()\n    {\n        // @todo\n    }\n\n    /**\n     *\n     */\n    public function save()\n    {\n        $this->get_dompdf()->getOptions()->setDpi(72);\n    }\n\n    /**\n     *\n     */\n    public function restore()\n    {\n        $this->get_dompdf()->getOptions()->setDpi($this->dpi);\n    }\n\n    /**\n     * @param $angle\n     * @param $x\n     * @param $y\n     */\n    public function rotate($angle, $x, $y)\n    {\n        // @todo\n    }\n\n    /**\n     * @param $angle_x\n     * @param $angle_y\n     * @param $x\n     * @param $y\n     */\n    public function skew($angle_x, $angle_y, $x, $y)\n    {\n        // @todo\n    }\n\n    /**\n     * @param $s_x\n     * @param $s_y\n     * @param $x\n     * @param $y\n     */\n    public function scale($s_x, $s_y, $x, $y)\n    {\n        // @todo\n    }\n\n    /**\n     * @param $t_x\n     * @param $t_y\n     */\n    public function translate($t_x, $t_y)\n    {\n        // @todo\n    }\n\n    /**\n     * @param $a\n     * @param $b\n     * @param $c\n     * @param $d\n     * @param $e\n     * @param $f\n     */\n    public function transform($a, $b, $c, $d, $e, $f)\n    {\n        // @todo\n    }\n\n    /**\n     * Draws a polygon\n     *\n     * The polygon is formed by joining all the points stored in the $points\n     * array.  $points has the following structure:\n     * <code>\n     * array(0 => x1,\n     *       1 => y1,\n     *       2 => x2,\n     *       3 => y2,\n     *       ...\n     *       );\n     * </code>\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the $style\n     * parameter (aka dash)\n     *\n     * @param array $points\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     * @param bool $fill Fills the polygon if true\n     */\n    public function polygon($points, $color, $width = null, $style = null, $fill = false)\n    {\n\n        // Scale each point by the AA factor and DPI\n        foreach (array_keys($points) as $i) {\n            $points[$i] = $this->_upscale($points[$i]);\n        }\n\n        $c = $this->_allocate_color($color);\n\n        // Convert the style array if required\n        if (is_array($style) && count($style) > 0 && !$fill) {\n            $gd_style = [];\n\n            foreach ($style as $length) {\n                for ($i = 0; $i < $length; $i++) {\n                    $gd_style[] = $c;\n                }\n            }\n\n            if (!empty($gd_style)) {\n                imagesetstyle($this->get_image(), $gd_style);\n                $c = IMG_COLOR_STYLED;\n            }\n        }\n\n        imagesetthickness($this->get_image(), $width);\n\n        if ($fill) {\n            imagefilledpolygon($this->get_image(), $points, count($points) / 2, $c);\n        } else {\n            imagepolygon($this->get_image(), $points, count($points) / 2, $c);\n        }\n    }\n\n    /**\n     * Draws a circle at $x,$y with radius $r\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the $style\n     * parameter (aka dash)\n     *\n     * @param float $x\n     * @param float $y\n     * @param float $r\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     * @param bool $fill Fills the circle if true\n     */\n    public function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false)\n    {\n        // Scale by the AA factor and DPI\n        $x = $this->_upscale($x);\n        $y = $this->_upscale($y);\n        $r = $this->_upscale($r);\n\n        $c = $this->_allocate_color($color);\n\n        // Convert the style array if required\n        if (is_array($style) && count($style) > 0 && !$fill) {\n            $gd_style = [];\n\n            foreach ($style as $length) {\n                for ($i = 0; $i < $length; $i++) {\n                    $gd_style[] = $c;\n                }\n            }\n\n            if (!empty($gd_style)) {\n                imagesetstyle($this->get_image(), $gd_style);\n                $c = IMG_COLOR_STYLED;\n            }\n        }\n\n        imagesetthickness($this->get_image(), $width);\n\n        if ($fill) {\n            imagefilledellipse($this->get_image(), $x, $y, $r, $r, $c);\n        } else {\n            imageellipse($this->get_image(), $x, $y, $r, $r, $c);\n        }\n    }\n\n    /**\n     * Add an image to the pdf.\n     * The image is placed at the specified x and y coordinates with the\n     * given width and height.\n     *\n     * @param string $img_url the path to the image\n     * @param float $x x position\n     * @param float $y y position\n     * @param int $w width (in pixels)\n     * @param int $h height (in pixels)\n     * @param string $resolution\n     * @return void\n     *\n     * @throws \\Exception\n     * @internal param string $img_type the type (e.g. extension) of the image\n     */\n    public function image($img_url, $x, $y, $w, $h, $resolution = \"normal\")\n    {\n        $img_type = Cache::detect_type($img_url, $this->get_dompdf()->getHttpContext());\n\n        if (!$img_type) {\n            return;\n        }\n\n        $func_name = \"imagecreatefrom$img_type\";\n        if (!function_exists($func_name)) {\n            if (!method_exists(\"Dompdf\\Helpers\", $func_name)) {\n                throw new \\Exception(\"Function $func_name() not found.  Cannot convert $img_type image: $img_url.  Please install the image PHP extension.\");\n            }\n            $func_name = \"\\\\Dompdf\\\\Helpers::\" . $func_name;\n        }\n        $src = @call_user_func($func_name, $img_url);\n\n        if (!$src) {\n            return; // Probably should add to $_dompdf_errors or whatever here\n        }\n\n        // Scale by the AA factor and DPI\n        $x = $this->_upscale($x);\n        $y = $this->_upscale($y);\n\n        $w = $this->_upscale($w);\n        $h = $this->_upscale($h);\n\n        $img_w = imagesx($src);\n        $img_h = imagesy($src);\n\n        imagecopyresampled($this->get_image(), $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h);\n    }\n\n    /**\n     * Writes text at the specified x and y coordinates\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float $x\n     * @param float $y\n     * @param string $text the text to write\n     * @param string $font the font file to use\n     * @param float $size the font size, in points\n     * @param array $color\n     * @param float $word_spacing word spacing adjustment\n     * @param float $char_spacing\n     * @param float $angle Text angle\n     *\n     * @return void\n     */\n    public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_spacing = 0.0, $char_spacing = 0.0, $angle = 0.0)\n    {\n        // Scale by the AA factor and DPI\n        $x = $this->_upscale($x);\n        $y = $this->_upscale($y);\n        $size = $this->_upscale($size) * self::FONT_SCALE;\n\n        $h = $this->get_font_height_actual($font, $size);\n        $c = $this->_allocate_color($color);\n\n        // imagettftext() converts numeric entities to their respective\n        // character. Preserve any originally double encoded entities to be\n        // represented as is.\n        // eg: &amp;#160; will render &#160; rather than its character.\n        $text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&#38;\\1', $text);\n\n        $text = mb_encode_numericentity($text, [0x0080, 0xff, 0, 0xff], 'UTF-8');\n\n        $font = $this->get_ttf_file($font);\n\n        // FIXME: word spacing\n        imagettftext($this->get_image(), $size, $angle, $x, $y + $h, $c, $font, $text);\n    }\n\n    public function javascript($code)\n    {\n        // Not implemented\n    }\n\n    /**\n     * Add a named destination (similar to <a name=\"foo\">...</a> in html)\n     *\n     * @param string $anchorname The name of the named destination\n     */\n    public function add_named_dest($anchorname)\n    {\n        // Not implemented\n    }\n\n    /**\n     * Add a link to the pdf\n     *\n     * @param string $url The url to link to\n     * @param float $x The x position of the link\n     * @param float $y The y position of the link\n     * @param float $width The width of the link\n     * @param float $height The height of the link\n     */\n    public function add_link($url, $x, $y, $width, $height)\n    {\n        // Not implemented\n    }\n\n    /**\n     * Add meta information to the PDF\n     *\n     * @param string $label label of the value (Creator, Producer, etc.)\n     * @param string $value the text to set\n     */\n    public function add_info($label, $value)\n    {\n        // N/A\n    }\n\n    /**\n     * @param string $view\n     * @param array $options\n     */\n    public function set_default_view($view, $options = [])\n    {\n        // N/A\n    }\n\n    /**\n     * Calculates text size, in points\n     *\n     * @param string $text the text to be sized\n     * @param string $font the desired font\n     * @param float $size the desired font size\n     * @param float $word_spacing word spacing, if any\n     * @param float $char_spacing char spacing, if any\n     *\n     * @return float\n     */\n    public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0)\n    {\n        $font = $this->get_ttf_file($font);\n        $size = $this->_upscale($size) * self::FONT_SCALE;\n\n        // imagettfbbox() converts numeric entities to their respective\n        // character. Preserve any originally double encoded entities to be\n        // represented as is.\n        // eg: &amp;#160; will render &#160; rather than its character.\n        $text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&#38;\\1', $text);\n\n        $text = mb_encode_numericentity($text, [0x0080, 0xffff, 0, 0xffff], 'UTF-8');\n\n        // FIXME: word spacing\n        list($x1, , $x2) = imagettfbbox($size, 0, $font, $text);\n\n        // Add additional 1pt to prevent text overflow issues\n        return $this->_downscale($x2 - $x1) + 1;\n    }\n\n    /**\n     * @param $font\n     * @return string\n     */\n    public function get_ttf_file($font)\n    {\n        if ( stripos($font, \".ttf\") === false ) {\n            $font .= \".ttf\";\n        }\n\n        if (!file_exists($font)) {\n            $font_metrics = $this->_dompdf->getFontMetrics();\n            $font = $font_metrics->getFont($this->_dompdf->getOptions()->getDefaultFont()) . \".ttf\";\n            if (!file_exists($font)) {\n                if (strpos($font, \"mono\")) {\n                    $font = $font_metrics->getFont(\"DejaVu Mono\") . \".ttf\";\n                } elseif (strpos($font, \"sans\") !== false) {\n                    $font = $font_metrics->getFont(\"DejaVu Sans\") . \".ttf\";\n                } elseif (strpos($font, \"serif\")) {\n                    $font = $font_metrics->getFont(\"DejaVu Serif\") . \".ttf\";\n                } else {\n                    $font = $font_metrics->getFont(\"DejaVu Sans\") . \".ttf\";\n                }\n            }\n        }\n\n        return $font;\n    }\n\n    /**\n     * Calculates font height, in points\n     *\n     * @param string $font\n     * @param float $size\n     * @return float\n     */\n    public function get_font_height($font, $size)\n    {\n        $size = $this->_upscale($size) * self::FONT_SCALE;\n\n        $height = $this->get_font_height_actual($font, $size);\n\n        return $this->_downscale($height);\n    }\n\n    protected function get_font_height_actual($font, $size)\n    {\n        $font = $this->get_ttf_file($font);\n        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();\n\n        // FIXME: word spacing\n        list(, $y2, , , , $y1) = imagettfbbox($size, 0, $font, \"MXjpqytfhl\"); // Test string with ascenders, descenders and caps\n        return ($y2 - $y1) * $ratio;\n    }\n\n    /**\n     * @param string $font\n     * @param float $size\n     * @return float\n     */\n    public function get_font_baseline($font, $size)\n    {\n        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();\n        return $this->get_font_height($font, $size) / $ratio;\n    }\n\n    /**\n     * Starts a new page\n     *\n     * Subsequent drawing operations will appear on the new page.\n     */\n    public function new_page()\n    {\n        $this->_page_number++;\n        $this->_page_count++;\n\n        $this->_img = imagecreatetruecolor($this->_actual_width, $this->_actual_height);\n\n        $this->_bg_color = $this->_allocate_color($this->_bg_color_array);\n        imagealphablending($this->_img, true);\n        imagesavealpha($this->_img, true);\n        imagefill($this->_img, 0, 0, $this->_bg_color);\n\n        $this->_imgs[] = $this->_img;\n    }\n\n    public function open_object()\n    {\n        // N/A\n    }\n\n    public function close_object()\n    {\n        // N/A\n    }\n\n    public function add_object()\n    {\n        // N/A\n    }\n\n    /**\n     * Writes text at the specified x and y coordinates on every page\n     *\n     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced\n     * with their current values.\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float  $x\n     * @param float  $y\n     * @param string $text       the text to write\n     * @param string $font       the font file to use\n     * @param float  $size       the font size, in points\n     * @param array  $color\n     * @param float  $word_space word spacing adjustment\n     * @param float  $char_space char spacing adjustment\n     * @param float  $angle      angle to write the text at, measured CW starting from the x-axis\n     */\n    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)\n    {\n        // N/A\n    }\n\n    public function page_line()\n    {\n        // N/A\n    }\n\n    /**\n     * Streams the image to the client.\n     *\n     * @param string $filename The filename to present to the client.\n     * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only);\n     *     'page' => Number of the page to output (defaults to the first); 'Attachment': 1 or 0 (default 1).\n     */\n    public function stream($filename, $options = [])\n    {\n        if (headers_sent()) {\n            die(\"Unable to stream image: headers already sent\");\n        }\n\n        if (!isset($options[\"type\"])) $options[\"type\"] = \"png\";\n        if (!isset($options[\"Attachment\"])) $options[\"Attachment\"] = true;\n        $type = strtolower($options[\"type\"]);\n\n        switch ($type) {\n            case \"jpg\":\n            case \"jpeg\":\n                $contentType = \"image/jpeg\";\n                $extension = \".jpg\";\n                break;\n            case \"png\":\n            default:\n                $contentType = \"image/png\";\n                $extension = \".png\";\n                break;\n        }\n\n        header(\"Cache-Control: private\");\n        header(\"Content-Type: $contentType\");\n\n        $filename = str_replace([\"\\n\", \"'\"], \"\", basename($filename, \".$type\")) . $extension;\n        $attachment = $options[\"Attachment\"] ? \"attachment\" : \"inline\";\n        header(Helpers::buildContentDispositionHeader($attachment, $filename));\n\n        $this->_output($options);\n        flush();\n    }\n\n    /**\n     * Returns the image as a string.\n     *\n     * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only);\n     *     'page' => Number of the page to output (defaults to the first).\n     * @return string\n     */\n    public function output($options = [])\n    {\n        ob_start();\n\n        $this->_output($options);\n\n        return ob_get_clean();\n    }\n\n    /**\n     * Outputs the image stream directly.\n     *\n     * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only);\n     *     'page' => Number of the page to output (defaults to the first).\n     */\n    protected function _output($options = [])\n    {\n        if (!isset($options[\"type\"])) $options[\"type\"] = \"png\";\n        if (!isset($options[\"page\"])) $options[\"page\"] = 1;\n        $type = strtolower($options[\"type\"]);\n\n        if (isset($this->_imgs[$options[\"page\"] - 1])) {\n            $img = $this->_imgs[$options[\"page\"] - 1];\n        } else {\n            $img = $this->_imgs[0];\n        }\n\n        // Perform any antialiasing\n        if ($this->_aa_factor != 1) {\n            $dst_w = $this->_actual_width / $this->_aa_factor;\n            $dst_h = $this->_actual_height / $this->_aa_factor;\n            $dst = imagecreatetruecolor($dst_w, $dst_h);\n            imagecopyresampled($dst, $img, 0, 0, 0, 0,\n                $dst_w, $dst_h,\n                $this->_actual_width, $this->_actual_height);\n        } else {\n            $dst = $img;\n        }\n\n        switch ($type) {\n            case \"jpg\":\n            case \"jpeg\":\n                if (!isset($options[\"quality\"])) {\n                    $options[\"quality\"] = 75;\n                }\n\n                imagejpeg($dst, null, $options[\"quality\"]);\n                break;\n            case \"png\":\n            default:\n                imagepng($dst);\n                break;\n        }\n\n        if ($this->_aa_factor != 1) {\n            imagedestroy($dst);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Adapter/PDFLib.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Adapter;\n\nuse Dompdf\\Canvas;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Exception;\nuse Dompdf\\Image\\Cache;\nuse Dompdf\\PhpEvaluator;\n\n/**\n * PDF rendering interface\n *\n * Dompdf\\Adapter\\PDFLib provides a simple, stateless interface to the one\n * provided by PDFLib.\n *\n * Unless otherwise mentioned, all dimensions are in points (1/72 in).\n * The coordinate origin is in the top left corner and y values\n * increase downwards.\n *\n * See {@link http://www.pdflib.com/} for more complete documentation\n * on the underlying PDFlib functions.\n *\n * @package dompdf\n */\nclass PDFLib implements Canvas\n{\n\n    /**\n     * Dimensions of paper sizes in points\n     *\n     * @var array;\n     */\n    public static $PAPER_SIZES = []; // Set to Dompdf\\Adapter\\CPDF::$PAPER_SIZES below.\n\n    /**\n     * Whether to create PDFs in memory or on disk\n     *\n     * @var bool\n     */\n    static $IN_MEMORY = true;\n\n    /**\n     * Saves the major version of PDFLib for compatibility requests\n     *\n     * @var null|int\n     */\n    protected static $MAJOR_VERSION = null;\n\n\n    /**\n     * Transforms the list of native fonts into PDFLib compatible names (casesensitive)\n     *\n     * @var array\n     */\n    public static $nativeFontsTpPDFLib = [\n        \"courier\"               => \"Courier\",\n        \"courier-bold\"          => \"Courier-Bold\",\n        \"courier-oblique\"       => \"Courier-Oblique\",\n        \"courier-boldoblique\"   => \"Courier-BoldOblique\",\n        \"helvetica\"             => \"Helvetica\",\n        \"helvetica-bold\"        => \"Helvetica-Bold\",\n        \"helvetica-oblique\"     => \"Helvetica-Oblique\",\n        \"helvetica-boldoblique\" => \"Helvetica-BoldOblique\",\n        \"times\"                 => \"Times-Roman\",\n        \"times-roman\"           => \"Times-Roman\",\n        \"times-bold\"            => \"Times-Bold\",\n        \"times-italic\"          => \"Times-Italic\",\n        \"times-bolditalic\"      => \"Times-BoldItalic\",\n        \"symbol\"                => \"Symbol\",\n        \"zapfdinbats\"           => \"ZapfDingbats\",\n        \"zapfdingbats\"          => \"ZapfDingbats\",\n    ];\n\n    /**\n     * @var \\Dompdf\\Dompdf\n     */\n    protected $_dompdf;\n\n    /**\n     * Instance of PDFLib class\n     *\n     * @var \\PDFLib\n     */\n    protected $_pdf;\n\n    /**\n     * Name of temporary file used for PDFs created on disk\n     *\n     * @var string\n     */\n    protected $_file;\n\n    /**\n     * PDF width, in points\n     *\n     * @var float\n     */\n    protected $_width;\n\n    /**\n     * PDF height, in points\n     *\n     * @var float\n     */\n    protected $_height;\n\n    /**\n     * Last fill color used\n     *\n     * @var array\n     */\n    protected $_last_fill_color;\n\n    /**\n     * Last stroke color used\n     *\n     * @var array\n     */\n    protected $_last_stroke_color;\n\n    /**\n     * The current opacity level\n     *\n     * @var array\n     */\n    protected $_current_opacity;\n\n    /**\n     * Cache of image handles\n     *\n     * @var array\n     */\n    protected $_imgs;\n\n    /**\n     * Cache of font handles\n     *\n     * @var array\n     */\n    protected $_fonts;\n\n    /**\n     * Cache of fontFile checks\n     *\n     * @var array\n     */\n    protected $_fontsFiles;\n\n    /**\n     * List of objects (templates) to add to multiple pages\n     *\n     * @var array\n     */\n    protected $_objs;\n\n    /**\n     * List of gstate objects created for this PDF (for reuse)\n     *\n     * @var array\n     */\n    protected $_gstates = [];\n\n    /**\n     * Current page number\n     *\n     * @var int\n     */\n    protected $_page_number;\n\n    /**\n     * Total number of pages\n     *\n     * @var int\n     */\n    protected $_page_count;\n\n    /**\n     * Text to display on every page\n     *\n     * @var array\n     */\n    protected $_page_text;\n\n    /**\n     * Array of pages for accesing after rendering is initially complete\n     *\n     * @var array\n     */\n    protected $_pages;\n\n    /**\n     * Class constructor\n     *\n     * @param string|array $paper The size of paper to use either a string (see {@link Dompdf\\Adapter\\CPDF::$PAPER_SIZES}) or\n     *                            an array(xmin,ymin,xmax,ymax)\n     * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')\n     * @param Dompdf $dompdf\n     */\n    public function __construct($paper = \"letter\", $orientation = \"portrait\", Dompdf $dompdf = null)\n    {\n        if (is_array($paper)) {\n            $size = $paper;\n        } elseif (isset(self::$PAPER_SIZES[mb_strtolower($paper)])) {\n            $size = self::$PAPER_SIZES[mb_strtolower($paper)];\n        } else {\n            $size = self::$PAPER_SIZES[\"letter\"];\n        }\n\n        if (mb_strtolower($orientation) === \"landscape\") {\n            list($size[2], $size[3]) = [$size[3], $size[2]];\n        }\n\n        $this->_width = $size[2] - $size[0];\n        $this->_height = $size[3] - $size[1];\n\n        if ($dompdf === null) {\n            $this->_dompdf = new Dompdf();\n        } else {\n            $this->_dompdf = $dompdf;\n        }\n\n        $this->_pdf = new \\PDFLib();\n\n        $license = $dompdf->getOptions()->getPdflibLicense();\n        if (strlen($license) > 0) {\n            $this->setPDFLibParameter(\"license\", $license);\n        }\n\n        $this->setPDFLibParameter(\"textformat\", \"utf8\");\n        if ($this->getPDFLibMajorVersion() >= 7) {\n            $this->setPDFLibParameter(\"errorpolicy\", \"return\");\n            //            $this->_pdf->set_option('logging={filename=' . \\APP_PATH . '/logs/pdflib.log classes={api=1 warning=2}}');\n            //            $this->_pdf->set_option('errorpolicy=exception');\n        } else {\n            $this->setPDFLibParameter(\"fontwarning\", \"false\");\n        }\n\n        $searchPath = $this->_dompdf->getOptions()->getFontDir();\n        if (empty($searchPath) === false) {\n            $this->_pdf->set_option('searchpath={' . $searchPath . '}');\n        }\n\n        // fetch PDFLib version information for the producer field\n        $this->_pdf->set_info(\"Producer Addendum\", sprintf(\"%s + PDFLib %s\", $dompdf->version, $this->getPDFLibMajorVersion()));\n\n        // Silence pedantic warnings about missing TZ settings\n        $tz = @date_default_timezone_get();\n        date_default_timezone_set(\"UTC\");\n        $this->_pdf->set_info(\"Date\", date(\"Y-m-d\"));\n        date_default_timezone_set($tz);\n\n        if (self::$IN_MEMORY) {\n            $this->_pdf->begin_document(\"\", \"\");\n        } else {\n            $tmp_dir = $this->_dompdf->getOptions()->getTempDir();\n            $tmp_name = @tempnam($tmp_dir, \"libdompdf_pdf_\");\n            @unlink($tmp_name);\n            $this->_file = \"$tmp_name.pdf\";\n            $this->_pdf->begin_document($this->_file, \"\");\n        }\n\n        $this->_pdf->begin_page_ext($this->_width, $this->_height, \"\");\n\n        $this->_page_number = $this->_page_count = 1;\n        $this->_page_text = [];\n\n        $this->_imgs = [];\n        $this->_fonts = [];\n        $this->_objs = [];\n    }\n\n    /**\n     * @return Dompdf\n     */\n    function get_dompdf()\n    {\n        return $this->_dompdf;\n    }\n\n    /**\n     * Close the pdf\n     */\n    protected function _close()\n    {\n        $this->_place_objects();\n\n        // Close all pages\n        $this->_pdf->suspend_page(\"\");\n        for ($p = 1; $p <= $this->_page_count; $p++) {\n            $this->_pdf->resume_page(\"pagenumber=$p\");\n            $this->_pdf->end_page_ext(\"\");\n        }\n\n        $this->_pdf->end_document(\"\");\n    }\n\n\n    /**\n     * Returns the PDFLib instance\n     *\n     * @return PDFLib\n     */\n    public function get_pdflib()\n    {\n        return $this->_pdf;\n    }\n\n    /**\n     * Add meta information to the PDF\n     *\n     * @param string $label label of the value (Creator, Producter, etc.)\n     * @param string $value the text to set\n     */\n    public function add_info($label, $value)\n    {\n        $this->_pdf->set_info($label, $value);\n    }\n\n    /**\n     * Opens a new 'object' (template in PDFLib-speak)\n     *\n     * While an object is open, all drawing actions are recorded to the\n     * object instead of being drawn on the current page.  Objects can\n     * be added later to a specific page or to several pages.\n     *\n     * The return value is an integer ID for the new object.\n     *\n     * @see PDFLib::close_object()\n     * @see PDFLib::add_object()\n     *\n     * @return int\n     */\n    public function open_object()\n    {\n        $this->_pdf->suspend_page(\"\");\n        if ($this->getPDFLibMajorVersion() >= 7) {\n            $ret = $this->_pdf->begin_template_ext($this->_width, $this->_height, null);\n        } else {\n            $ret = $this->_pdf->begin_template($this->_width, $this->_height);\n        }\n        $this->_pdf->save();\n        $this->_objs[$ret] = [\"start_page\" => $this->_page_number];\n\n        return $ret;\n    }\n\n    /**\n     * Reopen an existing object (NOT IMPLEMENTED)\n     * PDFLib does not seem to support reopening templates.\n     *\n     * @param int $object the ID of a previously opened object\n     *\n     * @throws Exception\n     * @return void\n     */\n    public function reopen_object($object)\n    {\n        throw new Exception(\"PDFLib does not support reopening objects.\");\n    }\n\n    /**\n     * Close the current template\n     *\n     * @see PDFLib::open_object()\n     */\n    public function close_object()\n    {\n        $this->_pdf->restore();\n        if ($this->getPDFLibMajorVersion() >= 7) {\n            $this->_pdf->end_template_ext($this->_width, $this->_height);\n        } else {\n            $this->_pdf->end_template();\n        }\n        $this->_pdf->resume_page(\"pagenumber=\" . $this->_page_number);\n    }\n\n    /**\n     * Adds the specified object to the document\n     *\n     * $where can be one of:\n     * - 'add' add to current page only\n     * - 'all' add to every page from the current one onwards\n     * - 'odd' add to all odd numbered pages from now on\n     * - 'even' add to all even numbered pages from now on\n     * - 'next' add the object to the next page only\n     * - 'nextodd' add to all odd numbered pages from the next one\n     * - 'nexteven' add to all even numbered pages from the next one\n     *\n     * @param int    $object the object handle returned by open_object()\n     * @param string $where\n     */\n    public function add_object($object, $where = 'all')\n    {\n\n        if (mb_strpos($where, \"next\") !== false) {\n            $this->_objs[$object][\"start_page\"]++;\n            $where = str_replace(\"next\", \"\", $where);\n            if ($where == \"\") {\n                $where = \"add\";\n            }\n        }\n\n        $this->_objs[$object][\"where\"] = $where;\n    }\n\n    /**\n     * Stops the specified template from appearing in the document.\n     *\n     * The object will stop being displayed on the page following the\n     * current one.\n     *\n     * @param int $object\n     */\n    public function stop_object($object)\n    {\n\n        if (!isset($this->_objs[$object])) {\n            return;\n        }\n\n        $start = $this->_objs[$object][\"start_page\"];\n        $where = $this->_objs[$object][\"where\"];\n\n        // Place the object on this page if required\n        if ($this->_page_number >= $start &&\n            (($this->_page_number % 2 == 0 && $where === \"even\") ||\n                ($this->_page_number % 2 == 1 && $where === \"odd\") ||\n                ($where === \"all\"))\n        ) {\n            $this->_pdf->fit_image($object, 0, 0, \"\");\n        }\n\n        $this->_objs[$object] = null;\n        unset($this->_objs[$object]);\n    }\n\n    /**\n     * Add all active objects to the current page\n     */\n    protected function _place_objects()\n    {\n\n        foreach ($this->_objs as $obj => $props) {\n            $start = $props[\"start_page\"];\n            $where = $props[\"where\"];\n\n            // Place the object on this page if required\n            if ($this->_page_number >= $start &&\n                (($this->_page_number % 2 == 0 && $where === \"even\") ||\n                    ($this->_page_number % 2 == 1 && $where === \"odd\") ||\n                    ($where === \"all\"))\n            ) {\n                $this->_pdf->fit_image($obj, 0, 0, \"\");\n            }\n        }\n    }\n\n    /**\n     * @return float|mixed\n     */\n    public function get_width()\n    {\n        return $this->_width;\n    }\n\n    /**\n     * @return float|mixed\n     */\n    public function get_height()\n    {\n        return $this->_height;\n    }\n\n    /**\n     * @return int\n     */\n    public function get_page_number()\n    {\n        return $this->_page_number;\n    }\n\n    /**\n     * @return int\n     */\n    public function get_page_count()\n    {\n        return $this->_page_count;\n    }\n\n    /**\n     * @param $num\n     */\n    public function set_page_number($num)\n    {\n        $this->_page_number = (int)$num;\n    }\n\n    /**\n     * @param int $count\n     */\n    public function set_page_count($count)\n    {\n        $this->_page_count = (int)$count;\n    }\n\n    /**\n     * Sets the line style\n     *\n     * @param float  $width\n     * @param        $cap\n     * @param string $join\n     * @param array  $dash\n     *\n     * @return void\n     */\n    protected function _set_line_style($width, $cap, $join, $dash)\n    {\n        if (!is_array($dash)) {\n            $dash = array();\n        }\n\n        if (count($dash) == 1) {\n            $dash[] = $dash[0];\n        }\n\n        if ($this->getPDFLibMajorVersion() >= 9) {\n            if (count($dash) > 1) {\n                $this->_pdf->set_graphics_option(\"dasharray={\" . implode(\" \", $dash) . \"}\");\n            } else {\n                $this->_pdf->set_graphics_option(\"dasharray=none\");\n            }\n        } else {\n            if (count($dash) > 1) {\n                $this->_pdf->setdashpattern(\"dasharray={\" . implode(\" \", $dash) . \"}\");\n            } else {\n                $this->_pdf->setdash(0, 0);\n            }\n        }\n\n        switch ($join) {\n            case \"miter\":\n                if ($this->getPDFLibMajorVersion() >= 9) {\n                    $this->_pdf->set_graphics_option('linejoin=0');\n                } else {\n                    $this->_pdf->setlinejoin(0);\n                }\n                break;\n\n            case \"round\":\n                if ($this->getPDFLibMajorVersion() >= 9) {\n                    $this->_pdf->set_graphics_option('linejoin=1');\n                } else {\n                    $this->_pdf->setlinejoin(1);\n                }\n                break;\n\n            case \"bevel\":\n                if ($this->getPDFLibMajorVersion() >= 9) {\n                    $this->_pdf->set_graphics_option('linejoin=2');\n                } else {\n                    $this->_pdf->setlinejoin(2);\n                }\n                break;\n\n            default:\n                break;\n        }\n\n        switch ($cap) {\n            case \"butt\":\n                if ($this->getPDFLibMajorVersion() >= 9) {\n                    $this->_pdf->set_graphics_option('linecap=0');\n                } else {\n                    $this->_pdf->setlinecap(0);\n                }\n                break;\n\n            case \"round\":\n                if ($this->getPDFLibMajorVersion() >= 9) {\n                    $this->_pdf->set_graphics_option('linecap=1');\n                } else {\n                    $this->_pdf->setlinecap(1);\n                }\n                break;\n\n            case \"square\":\n                if ($this->getPDFLibMajorVersion() >= 9) {\n                    $this->_pdf->set_graphics_option('linecap=2');\n                } else {\n                    $this->_pdf->setlinecap(2);\n                }\n                break;\n\n            default:\n                break;\n        }\n\n        $this->_pdf->setlinewidth($width);\n    }\n\n    /**\n     * Sets the line color\n     *\n     * @param array $color array(r,g,b)\n     */\n    protected function _set_stroke_color($color)\n    {\n        // TODO: we should check the current PDF stroke color\n        // instead of the cached value\n        if ($this->_last_stroke_color == $color) {\n            // FIXME: do nothing, this optimization is broken by the\n            // stroke being set as a side effect of other operations\n            //return;\n        }\n\n        $alpha = isset($color[\"alpha\"]) ? $color[\"alpha\"] : 1;\n        if (isset($this->_current_opacity)) {\n            $alpha *= $this->_current_opacity;\n        }\n\n        $this->_last_stroke_color = $color;\n\n        if (isset($color[3])) {\n            $type = \"cmyk\";\n            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], $color[3]];\n        } elseif (isset($color[2])) {\n            $type = \"rgb\";\n            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], null];\n        } else {\n            $type = \"gray\";\n            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], null, null];\n        }\n\n        $this->_set_stroke_opacity($alpha, \"Normal\");\n        $this->_pdf->setcolor(\"stroke\", $type, $c1, $c2, $c3, $c4);\n    }\n\n    /**\n     * Sets the fill color\n     *\n     * @param array $color array(r,g,b)\n     */\n    protected function _set_fill_color($color)\n    {\n        // TODO: we should check the current PDF fill color\n        // instead of the cached value\n        if ($this->_last_fill_color == $color) {\n            // FIXME: do nothing, this optimization is broken by the\n            // fill being set as a side effect of other operations\n            //return;\n        }\n\n        $alpha = isset($color[\"alpha\"]) ? $color[\"alpha\"] : 1;\n        if (isset($this->_current_opacity)) {\n            $alpha *= $this->_current_opacity;\n        }\n\n        $this->_last_fill_color = $color;\n\n        if (isset($color[3])) {\n            $type = \"cmyk\";\n            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], $color[3]];\n        } elseif (isset($color[2])) {\n            $type = \"rgb\";\n            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], null];\n        } else {\n            $type = \"gray\";\n            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], null, null];\n        }\n\n        $this->_set_fill_opacity($alpha, \"Normal\");\n        $this->_pdf->setcolor(\"fill\", $type, $c1, $c2, $c3, $c4);\n    }\n\n    /**\n     * Sets the fill opacity\n     *\n     * @param $opacity\n     * @param $mode\n     */\n    public function _set_fill_opacity($opacity, $mode = \"Normal\")\n    {\n        if ($mode === \"Normal\" && is_null($opacity) === false) {\n            $this->_set_gstate(\"opacityfill=$opacity\");\n        }\n    }\n\n    /**\n     * Sets the stroke opacity\n     *\n     * @param $opacity\n     * @param $mode\n     */\n    public function _set_stroke_opacity($opacity, $mode = \"Normal\")\n    {\n        if ($mode === \"Normal\" && is_null($opacity) === false) {\n            $this->_set_gstate(\"opacitystroke=$opacity\");\n        }\n    }\n\n    /**\n     * Sets the opacity\n     *\n     * @param $opacity\n     * @param $mode\n     */\n    public function set_opacity($opacity, $mode = \"Normal\")\n    {\n        if ($mode === \"Normal\" && is_null($opacity) === false) {\n            $this->_set_gstate(\"opacityfill=$opacity opacitystroke=$opacity\");\n            $this->_current_opacity = $opacity;\n        }\n    }\n\n    /**\n     * Sets the gstate\n     *\n     * @param $gstate_options\n     * @return int\n     */\n    public function _set_gstate($gstate_options)\n    {\n        if (($gstate = array_search($gstate_options, $this->_gstates)) === false) {\n            $gstate = $this->_pdf->create_gstate($gstate_options);\n            $this->_gstates[$gstate] = $gstate_options;\n        }\n\n        return $this->_pdf->set_gstate($gstate);\n    }\n\n    public function set_default_view($view, $options = [])\n    {\n        // TODO\n        // http://www.pdflib.com/fileadmin/pdflib/pdf/manuals/PDFlib-8.0.2-API-reference.pdf\n        /**\n         * fitheight Fit the page height to the window, with the x coordinate left at the left edge of the window.\n         * fitrect Fit the rectangle specified by left, bottom, right, and top to the window.\n         * fitvisible Fit the visible contents of the page (the ArtBox) to the window.\n         * fitvisibleheight Fit the visible contents of the page to the window with the x coordinate left at the left edge of the window.\n         * fitvisiblewidth Fit the visible contents of the page to the window with the y coordinate top at the top edge of the window.\n         * fitwidth Fit the page width to the window, with the y coordinate top at the top edge of the window.\n         * fitwindow Fit the complete page to the window.\n         * fixed\n         */\n        //$this->setPDFLibParameter(\"openaction\", $view);\n    }\n\n    /**\n     * Loads a specific font and stores the corresponding descriptor.\n     *\n     * @param string $font\n     * @param string $encoding\n     * @param string $options\n     *\n     * @return int the font descriptor for the font\n     */\n    protected function _load_font($font, $encoding = null, $options = \"\")\n    {\n        // Fix for PDFLibs case-sensitive font names\n        $baseFont = basename($font);\n        $isNativeFont = false;\n        if (isset(self::$nativeFontsTpPDFLib[$baseFont])) {\n            $font = self::$nativeFontsTpPDFLib[$baseFont];\n            $isNativeFont = true;\n        }\n\n        // Check if the font is a native PDF font\n        // Embed non-native fonts\n        $test = strtolower($baseFont);\n        if (in_array($test, DOMPDF::$nativeFonts)) {\n            $font = basename($font);\n        } else {\n            // Embed non-native fonts\n            $options .= \" embedding=true\";\n        }\n\n        $options .= \" autosubsetting=\" . ($this->_dompdf->getOptions()->getIsFontSubsettingEnabled() === false ? \"false\" : \"true\");\n\n        if (is_null($encoding)) {\n            // Unicode encoding is only available for the commerical\n            // version of PDFlib and not PDFlib-Lite\n            if (strlen($this->_dompdf->getOptions()->getPdflibLicense()) > 0) {\n                $encoding = \"unicode\";\n            } else {\n                $encoding = \"auto\";\n            }\n        }\n\n        $key = \"$font:$encoding:$options\";\n        if (isset($this->_fonts[$key])) {\n            return $this->_fonts[$key];\n        }\n\n        // Native fonts are build in, just load it\n        if ($isNativeFont) {\n            $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options);\n\n            return $this->_fonts[$key];\n        }\n\n        $fontOutline = $this->getPDFLibParameter(\"FontOutline\", 1);\n        if ($fontOutline === \"\" || $fontOutline <= 0) {\n            $families = $this->_dompdf->getFontMetrics()->getFontFamilies();\n            foreach ($families as $files) {\n                foreach ($files as $file) {\n                    $face = basename($file);\n                    $afm = null;\n\n                    if (isset($this->_fontsFiles[$face])) {\n                        continue;\n                    }\n\n                    // Prefer ttfs to afms\n                    if (file_exists(\"$file.ttf\")) {\n                        $outline = \"$file.ttf\";\n                    } elseif (file_exists(\"$file.TTF\")) {\n                        $outline = \"$file.TTF\";\n                    } elseif (file_exists(\"$file.pfb\")) {\n                        $outline = \"$file.pfb\";\n                        if (file_exists(\"$file.afm\")) {\n                            $afm = \"$file.afm\";\n                        }\n                    } elseif (file_exists(\"$file.PFB\")) {\n                        $outline = \"$file.PFB\";\n                        if (file_exists(\"$file.AFM\")) {\n                            $afm = \"$file.AFM\";\n                        }\n                    } else {\n                        continue;\n                    }\n\n                    $this->_fontsFiles[$face] = true;\n\n                    if ($this->getPDFLibMajorVersion() >= 9) {\n                        $this->setPDFLibParameter(\"FontOutline\", '{' . \"$face=$outline\" . '}');\n                    } else {\n                        $this->setPDFLibParameter(\"FontOutline\", \"\\{$face\\}=\\{$outline\\}\");\n                    }\n\n                    if (is_null($afm)) {\n                        continue;\n                    }\n                    if ($this->getPDFLibMajorVersion() >= 9) {\n                        $this->setPDFLibParameter(\"FontAFM\", '{' . \"$face=$afm\" . '}');\n                    } else {\n                        $this->setPDFLibParameter(\"FontAFM\", \"\\{$face\\}=\\{$afm\\}\");\n                    }\n                }\n            }\n        }\n\n        $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options);\n\n        return $this->_fonts[$key];\n    }\n\n    /**\n     * Remaps y coords from 4th to 1st quadrant\n     *\n     * @param float $y\n     * @return float\n     */\n    protected function y($y)\n    {\n        return $this->_height - $y;\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $x2\n     * @param float $y2\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function line($x1, $y1, $x2, $y2, $color, $width, $style = null)\n    {\n        $this->_set_line_style($width, \"butt\", \"\", $style);\n        $this->_set_stroke_color($color);\n\n        $y1 = $this->y($y1);\n        $y2 = $this->y($y2);\n\n        $this->_pdf->moveto($x1, $y1);\n        $this->_pdf->lineto($x2, $y2);\n        $this->_pdf->stroke();\n\n        $this->_set_stroke_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * Draw line at the specified coordinates on every page.\n     *\n     * See {@link Style::munge_color()} for the format of the colour array.\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $x2\n     * @param float $y2\n     * @param array $color\n     * @param float $width\n     * @param array $style optional\n     */\n    public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = [])\n    {\n        $_t = 'line';\n        $this->_page_text[] = compact('_t', 'x1', 'y1', 'x2', 'y2', 'color', 'width', 'style');\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $r1\n     * @param float $r2\n     * @param float $astart\n     * @param float $aend\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    public function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = [])\n    {\n        $this->_set_line_style($width, \"butt\", \"\", $style);\n        $this->_set_stroke_color($color);\n\n        $y1 = $this->y($y1);\n\n        $this->_pdf->arc($x1, $y1, $r1, $astart, $aend);\n        $this->_pdf->stroke();\n\n        $this->_set_stroke_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     * @param float $width\n     * @param null  $style\n     */\n    public function rectangle($x1, $y1, $w, $h, $color, $width, $style = null)\n    {\n        $this->_set_stroke_color($color);\n        $this->_set_line_style($width, \"butt\", \"\", $style);\n\n        $y1 = $this->y($y1) - $h;\n\n        $this->_pdf->rect($x1, $y1, $w, $h);\n        $this->_pdf->stroke();\n\n        $this->_set_stroke_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     */\n    public function filled_rectangle($x1, $y1, $w, $h, $color)\n    {\n        $this->_set_fill_color($color);\n\n        $y1 = $this->y($y1) - $h;\n\n        $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h));\n        $this->_pdf->fill();\n\n        $this->_set_fill_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     */\n    public function clipping_rectangle($x1, $y1, $w, $h)\n    {\n        $this->_pdf->save();\n\n        $y1 = $this->y($y1) - $h;\n\n        $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h));\n        $this->_pdf->clip();\n    }\n\n    /**\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param float $rTL\n     * @param float $rTR\n     * @param float $rBR\n     * @param float $rBL\n     */\n    public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)\n    {\n        if ($this->getPDFLibMajorVersion() < 9) {\n            //TODO: add PDFLib7 support\n            $this->clipping_rectangle($x1, $y1, $w, $h);\n            return;\n        }\n\n        $this->_pdf->save();\n\n        // we use 0,0 for the base coordinates for the path points\n        // since we're drawing the path at the $x1,$y1 coordinates\n\n        $path = 0;\n        //start: left edge, top end\n        $path = $this->_pdf->add_path_point($path, 0, 0 - $rTL + $h, \"move\", \"\");\n        // line: left edge, bottom end\n        $path = $this->_pdf->add_path_point($path, 0, 0 + $rBL, \"line\", \"\");\n        // curve: bottom-left corner\n        $path = $this->_pdf->add_path_point($path, 0 + $rBL, 0, \"elliptical\", \"radius=$rBL clockwise=false\");\n        // line: bottom edge, left end\n        $path = $this->_pdf->add_path_point($path, 0 - $rBR + $w, 0, \"line\", \"\");\n        // curve: bottom-right corner\n        $path = $this->_pdf->add_path_point($path, 0 + $w, 0 + $rBR, \"elliptical\", \"radius=$rBR clockwise=false\");\n        // line: right edge, top end\n        $path = $this->_pdf->add_path_point($path, 0 + $w, 0 - $rTR + $h, \"line\", \"\");\n        // curve: top-right corner\n        $path = $this->_pdf->add_path_point($path, 0 - $rTR + $w, 0 +$h, \"elliptical\", \"radius=$rTR clockwise=false\");\n        // line: top edge, left end\n        $path = $this->_pdf->add_path_point($path, 0 + $rTL, 0 + $h, \"line\", \"\");\n        // curve: top-left corner\n        $path = $this->_pdf->add_path_point($path, 0, 0 - $rTL + $h, \"elliptical\", \"radius=$rTL clockwise=false\");\n        $this->_pdf->draw_path($path, $x1, $this->_height-$y1-$h, \"clip=true\");\n    }\n\n    /**\n     *\n     */\n    public function clipping_end()\n    {\n        $this->_pdf->restore();\n    }\n\n    /**\n     *\n     */\n    public function save()\n    {\n        $this->_pdf->save();\n    }\n\n    function restore()\n    {\n        $this->_pdf->restore();\n    }\n\n    /**\n     * @param $angle\n     * @param $x\n     * @param $y\n     */\n    public function rotate($angle, $x, $y)\n    {\n        $pdf = $this->_pdf;\n        $pdf->translate($x, $this->_height - $y);\n        $pdf->rotate(-$angle);\n        $pdf->translate(-$x, -$this->_height + $y);\n    }\n\n    /**\n     * @param $angle_x\n     * @param $angle_y\n     * @param $x\n     * @param $y\n     */\n    public function skew($angle_x, $angle_y, $x, $y)\n    {\n        $pdf = $this->_pdf;\n        $pdf->translate($x, $this->_height - $y);\n        $pdf->skew($angle_y, $angle_x); // Needs to be inverted\n        $pdf->translate(-$x, -$this->_height + $y);\n    }\n\n    /**\n     * @param $s_x\n     * @param $s_y\n     * @param $x\n     * @param $y\n     */\n    public function scale($s_x, $s_y, $x, $y)\n    {\n        $pdf = $this->_pdf;\n        $pdf->translate($x, $this->_height - $y);\n        $pdf->scale($s_x, $s_y);\n        $pdf->translate(-$x, -$this->_height + $y);\n    }\n\n    /**\n     * @param $t_x\n     * @param $t_y\n     */\n    public function translate($t_x, $t_y)\n    {\n        $this->_pdf->translate($t_x, -$t_y);\n    }\n\n    /**\n     * @param $a\n     * @param $b\n     * @param $c\n     * @param $d\n     * @param $e\n     * @param $f\n     */\n    public function transform($a, $b, $c, $d, $e, $f)\n    {\n        $this->_pdf->concat($a, $b, $c, $d, $e, $f);\n    }\n\n    /**\n     * @param array $points\n     * @param array $color\n     * @param null  $width\n     * @param null  $style\n     * @param bool  $fill\n     */\n    public function polygon($points, $color, $width = null, $style = null, $fill = false)\n    {\n        $this->_set_fill_color($color);\n        $this->_set_stroke_color($color);\n\n        if (!$fill && isset($width)) {\n            $this->_set_line_style($width, \"square\", \"miter\", $style);\n        }\n\n        $y = $this->y(array_pop($points));\n        $x = array_pop($points);\n        $this->_pdf->moveto($x, $y);\n\n        while (count($points) > 1) {\n            $y = $this->y(array_pop($points));\n            $x = array_pop($points);\n            $this->_pdf->lineto($x, $y);\n        }\n\n        if ($fill) {\n            $this->_pdf->fill();\n        } else {\n            $this->_pdf->closepath_stroke();\n        }\n\n        $this->_set_fill_opacity($this->_current_opacity, \"Normal\");\n        $this->_set_stroke_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * @param float $x\n     * @param float $y\n     * @param float $r\n     * @param array $color\n     * @param null  $width\n     * @param null  $style\n     * @param bool  $fill\n     */\n    public function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false)\n    {\n        $this->_set_fill_color($color);\n        $this->_set_stroke_color($color);\n\n        if (!$fill && isset($width)) {\n            $this->_set_line_style($width, \"round\", \"round\", $style);\n        }\n\n        $y = $this->y($y);\n\n        $this->_pdf->circle($x, $y, $r);\n\n        if ($fill) {\n            $this->_pdf->fill();\n        } else {\n            $this->_pdf->stroke();\n        }\n\n        $this->_set_fill_opacity($this->_current_opacity, \"Normal\");\n        $this->_set_stroke_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * @param string $img_url\n     * @param float  $x\n     * @param float  $y\n     * @param int    $w\n     * @param int    $h\n     * @param string $resolution\n     */\n    public function image($img_url, $x, $y, $w, $h, $resolution = \"normal\")\n    {\n        $w = (int)$w;\n        $h = (int)$h;\n\n        $img_type = Cache::detect_type($img_url, $this->get_dompdf()->getHttpContext());\n\n        if (!isset($this->_imgs[$img_url])) {\n            if (strtolower($img_type) === \"svg\") {\n                //FIXME: PDFLib loads SVG but returns error message \"Function must not be called in 'page' scope\"\n                $image_load_response = $this->_pdf->load_graphics($img_type, $img_url, \"\");\n            } else {\n                $image_load_response = $this->_pdf->load_image($img_type, $img_url, \"\");\n            }\n            if ($image_load_response === 0) {\n                //TODO: should do something with the error message\n                $error = $this->_pdf->get_errmsg();\n                return;\n            }\n            $this->_imgs[$img_url] = $image_load_response;\n        }\n\n        $img = $this->_imgs[$img_url];\n\n        $y = $this->y($y) - $h;\n        if (strtolower($img_type) === \"svg\") {\n            $this->_pdf->fit_graphics($img, $x, $y, 'boxsize={' . \"$w $h\" . '} fitmethod=entire');\n        } else {\n            $this->_pdf->fit_image($img, $x, $y, 'boxsize={' . \"$w $h\" . '} fitmethod=entire');\n        }\n    }\n\n    /**\n     * @param float  $x\n     * @param float  $y\n     * @param string $text\n     * @param string $font\n     * @param float  $size\n     * @param array  $color\n     * @param int    $word_spacing\n     * @param int    $char_spacing\n     * @param int    $angle\n     */\n    public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_spacing = 0, $char_spacing = 0, $angle = 0)\n    {\n        $fh = $this->_load_font($font);\n\n        $this->_pdf->setfont($fh, $size);\n        $this->_set_fill_color($color);\n\n        $y = $this->y($y) - $this->get_font_height($font, $size);\n\n        $word_spacing = (float)$word_spacing;\n        $char_spacing = (float)$char_spacing;\n        $angle = -(float)$angle;\n\n        $this->_pdf->fit_textline($text, $x, $y, \"rotate=$angle wordspacing=$word_spacing charspacing=$char_spacing \");\n\n        $this->_set_fill_opacity($this->_current_opacity, \"Normal\");\n    }\n\n    /**\n     * @param string $code\n     */\n    public function javascript($code)\n    {\n        if (strlen($this->_dompdf->getOptions()->getPdflibLicense()) > 0) {\n            $this->_pdf->create_action(\"JavaScript\", $code);\n        }\n    }\n\n    /**\n     * Add a named destination (similar to <a name=\"foo\">...</a> in html)\n     *\n     * @param string $anchorname The name of the named destination\n     */\n    public function add_named_dest($anchorname)\n    {\n        $this->_pdf->add_nameddest($anchorname, \"\");\n    }\n\n    /**\n     * Add a link to the pdf\n     *\n     * @param string $url    The url to link to\n     * @param float  $x      The x position of the link\n     * @param float  $y      The y position of the link\n     * @param float  $width  The width of the link\n     * @param float  $height The height of the link\n     */\n    public function add_link($url, $x, $y, $width, $height)\n    {\n        $y = $this->y($y) - $height;\n        if (strpos($url, '#') === 0) {\n            // Local link\n            $name = substr($url, 1);\n            if ($name) {\n                $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link',\n                    \"contents={$url} destname=\" . substr($url, 1) . \" linewidth=0\");\n            }\n        } else {\n            list($proto, $host, $path, $file) = Helpers::explode_url($url);\n\n            if ($proto == \"\" || $proto === \"file://\") {\n                return; // Local links are not allowed\n            }\n            $url = Helpers::build_url($proto, $host, $path, $file);\n            $url = '{' . rawurldecode($url) . '}';\n\n            $action = $this->_pdf->create_action(\"URI\", \"url=\" . $url);\n            $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', \"contents={$url} action={activate=$action} linewidth=0\");\n        }\n    }\n\n    /**\n     * @param string $text\n     * @param string $font\n     * @param float  $size\n     * @param float  $word_spacing\n     * @param float  $letter_spacing\n     * @return mixed\n     */\n    public function get_text_width($text, $font, $size, $word_spacing = 0, $letter_spacing = 0)\n    {\n        $fh = $this->_load_font($font);\n\n        // Determine the additional width due to extra spacing\n        $num_spaces = mb_substr_count($text, \" \");\n        $delta = $word_spacing * $num_spaces;\n\n        if ($letter_spacing) {\n            $num_chars = mb_strlen($text);\n            $delta += $num_chars * $letter_spacing;\n        }\n\n        return $this->_pdf->stringwidth($text, $fh, $size) + $delta;\n    }\n\n    /**\n     * @param string $font\n     * @param float  $size\n     * @return float\n     */\n    public function get_font_height($font, $size)\n    {\n        $fh = $this->_load_font($font);\n\n        $this->_pdf->setfont($fh, $size);\n\n        $asc = $this->_pdf->info_font($fh, \"ascender\", \"fontsize=$size\");\n        $desc = $this->_pdf->info_font($fh, \"descender\", \"fontsize=$size\");\n\n        // $desc is usually < 0,\n        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();\n\n        return (abs($asc) + abs($desc)) * $ratio;\n    }\n\n    /**\n     * @param string $font\n     * @param float  $size\n     * @return float\n     */\n    public function get_font_baseline($font, $size)\n    {\n        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();\n\n        return $this->get_font_height($font, $size) / $ratio * 1.1;\n    }\n\n    /**\n     * Writes text at the specified x and y coordinates on every page\n     *\n     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced\n     * with their current values.\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float  $x\n     * @param float  $y\n     * @param string $text       the text to write\n     * @param string $font       the font file to use\n     * @param float  $size       the font size, in points\n     * @param array  $color\n     * @param float  $word_space word spacing adjustment\n     * @param float  $char_space char spacing adjustment\n     * @param float  $angle      angle to write the text at, measured CW starting from the x-axis\n     */\n    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)\n    {\n        $_t = \"text\";\n        $this->_page_text[] = compact(\"_t\", \"x\", \"y\", \"text\", \"font\", \"size\", \"color\", \"word_space\", \"char_space\", \"angle\");\n    }\n\n    //........................................................................\n\n    /**\n     * Processes a script on every page\n     *\n     * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available.\n     *\n     * This function can be used to add page numbers to all pages\n     * after the first one, for example.\n     *\n     * @param string $code the script code\n     * @param string $type the language type for script\n     */\n    public function page_script($code, $type = \"text/php\")\n    {\n        $_t = \"script\";\n        $this->_page_text[] = compact(\"_t\", \"code\", \"type\");\n    }\n\n    /**\n     *\n     */\n    public function new_page()\n    {\n        // Add objects to the current page\n        $this->_place_objects();\n\n        $this->_pdf->suspend_page(\"\");\n        $this->_pdf->begin_page_ext($this->_width, $this->_height, \"\");\n        $this->_page_number = ++$this->_page_count;\n    }\n\n    /**\n     * Add text to each page after rendering is complete\n     */\n    protected function _add_page_text()\n    {\n        if (count($this->_page_text) === 0) {\n            return;\n        }\n\n        $eval = null;\n        $this->_pdf->suspend_page(\"\");\n\n        for ($p = 1; $p <= $this->_page_count; $p++) {\n            $this->_pdf->resume_page(\"pagenumber=$p\");\n\n            foreach ($this->_page_text as $pt) {\n                extract($pt);\n\n                switch ($_t) {\n                    case \"text\":\n                        $text = str_replace([\"{PAGE_NUM}\", \"{PAGE_COUNT}\"],\n                            [$p, $this->_page_count], $text);\n                        $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);\n                        break;\n\n                    case \"script\":\n                        if (!$eval) {\n                            $eval = new PHPEvaluator($this);\n                        }\n                        $eval->evaluate($code, ['PAGE_NUM' => $p, 'PAGE_COUNT' => $this->_page_count]);\n                        break;\n\n                    case 'line':\n                        $this->line($x1, $y1, $x2, $y2, $color, $width, $style);\n                        break;\n\n                }\n            }\n\n            $this->_pdf->suspend_page(\"\");\n        }\n\n        $this->_pdf->resume_page(\"pagenumber=\" . $this->_page_number);\n    }\n\n    /**\n     * Streams the PDF to the client.\n     *\n     * @param string $filename The filename to present to the client.\n     * @param array  $options  Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).\n     * @throws Exception\n     */\n    public function stream($filename = \"document.pdf\", $options = [])\n    {\n        if (headers_sent()) {\n            die(\"Unable to stream pdf: headers already sent\");\n        }\n\n        if (!isset($options[\"compress\"])) {\n            $options[\"compress\"] = true;\n        }\n        if (!isset($options[\"Attachment\"])) {\n            $options[\"Attachment\"] = true;\n        }\n\n        $this->_add_page_text();\n\n        if ($options[\"compress\"]) {\n            $this->setPDFLibValue(\"compress\", 6);\n        } else {\n            $this->setPDFLibValue(\"compress\", 0);\n        }\n\n        $this->_close();\n\n        $data = \"\";\n\n        if (self::$IN_MEMORY) {\n            $data = $this->_pdf->get_buffer();\n            $size = mb_strlen($data, \"8bit\");\n        } else {\n            $size = filesize($this->_file);\n        }\n\n        header(\"Cache-Control: private\");\n        header(\"Content-Type: application/pdf\");\n        header(\"Content-Length: \" . $size);\n\n        $filename = str_replace([\"\\n\", \"'\"], \"\", basename($filename, \".pdf\")) . \".pdf\";\n        $attachment = $options[\"Attachment\"] ? \"attachment\" : \"inline\";\n        header(Helpers::buildContentDispositionHeader($attachment, $filename));\n\n        if (self::$IN_MEMORY) {\n            echo $data;\n        } else {\n            // Chunked readfile()\n            $chunk = (1 << 21); // 2 MB\n            $fh = fopen($this->_file, \"rb\");\n            if (!$fh) {\n                throw new Exception(\"Unable to load temporary PDF file: \" . $this->_file);\n            }\n\n            while (!feof($fh)) {\n                echo fread($fh, $chunk);\n            }\n            fclose($fh);\n\n            //debugpng\n            if ($this->_dompdf->getOptions()->getDebugPng()) {\n                print '[pdflib stream unlink ' . $this->_file . ']';\n            }\n            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {\n                unlink($this->_file);\n            }\n            $this->_file = null;\n            unset($this->_file);\n        }\n\n        flush();\n    }\n\n    /**\n     * Returns the PDF as a string.\n     *\n     * @param array $options Associative array: 'compress' => 1 or 0 (default 1).\n     * @return string\n     */\n    public function output($options = [])\n    {\n        if (!isset($options[\"compress\"])) {\n            $options[\"compress\"] = true;\n        }\n\n        $this->_add_page_text();\n\n        if ($options[\"compress\"]) {\n            $this->setPDFLibValue(\"compress\", 6);\n        } else {\n            $this->setPDFLibValue(\"compress\", 0);\n        }\n\n        $this->_close();\n\n        if (self::$IN_MEMORY) {\n            $data = $this->_pdf->get_buffer();\n        } else {\n            $data = file_get_contents($this->_file);\n\n            //debugpng\n            if ($this->_dompdf->getOptions()->getDebugPng()) {\n                print '[pdflib output unlink ' . $this->_file . ']';\n            }\n            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {\n                unlink($this->_file);\n            }\n            $this->_file = null;\n            unset($this->_file);\n        }\n\n        return $data;\n    }\n\n    /**\n     * @param string $keyword\n     * @param string $optlist\n     * @return mixed\n     */\n    protected function getPDFLibParameter($keyword, $optlist = \"\")\n    {\n        if ($this->getPDFLibMajorVersion() >= 9) {\n            return $this->_pdf->get_option($keyword, \"\");\n        }\n\n        return $this->_pdf->get_parameter($keyword, $optlist);\n    }\n\n    /**\n     * @param string $keyword\n     * @param string $value\n     * @return mixed\n     */\n    protected function setPDFLibParameter($keyword, $value)\n    {\n        if ($this->getPDFLibMajorVersion() >= 9) {\n            return $this->_pdf->set_option($keyword . \"=\" . $value);\n        }\n\n        return $this->_pdf->set_parameter($keyword, $value);\n    }\n\n    /**\n     * @param string $keyword\n     * @param string $optlist\n     * @return mixed\n     */\n    protected function getPDFLibValue($keyword, $optlist = \"\")\n    {\n        if ($this->getPDFLibMajorVersion() >= 9) {\n            return $this->getPDFLibParameter($keyword, $optlist);\n        }\n\n        return $this->_pdf->get_value($keyword);\n    }\n\n    /**\n     * @param string $keyword\n     * @param string $value\n     * @return mixed\n     */\n    protected function setPDFLibValue($keyword, $value)\n    {\n        if ($this->getPDFLibMajorVersion() >= 9) {\n            return $this->setPDFLibParameter($keyword, $value);\n        }\n\n        return $this->_pdf->set_value($keyword, $value);\n    }\n\n    /**\n     * @return int\n     */\n    protected function getPDFLibMajorVersion()\n    {\n        if (is_null(self::$MAJOR_VERSION)) {\n            if (method_exists($this->_pdf, \"get_option\")) {\n                self::$MAJOR_VERSION = abs(intval($this->_pdf->get_option(\"major\", \"\")));\n            } else {\n                self::$MAJOR_VERSION = abs(intval($this->_pdf->get_value(\"major\", \"\")));\n            }\n        }\n\n        return self::$MAJOR_VERSION;\n    }\n}\n\n// Workaround for idiotic limitation on statics...\nPDFLib::$PAPER_SIZES = CPDF::$PAPER_SIZES;\n"
  },
  {
    "path": "application/libraries/dompdf/src/Autoloader.php",
    "content": "<?php\nnamespace Dompdf;\n\n/**\n * Autoloads Dompdf classes\n *\n * @package Dompdf\n */\nclass Autoloader\n{\n    const PREFIX = 'Dompdf';\n\n    /**\n     * Register the autoloader\n     */\n    public static function register()\n    {\n        spl_autoload_register([new self, 'autoload']);\n    }\n\n    /**\n     * Autoloader\n     *\n     * @param string\n     */\n    public static function autoload($class)\n    {\n        if ($class === 'Dompdf\\Cpdf') {\n            require_once __DIR__ . \"/../lib/Cpdf.php\";\n            return;\n        }\n\n        $prefixLength = strlen(self::PREFIX);\n        if (0 === strncmp(self::PREFIX, $class, $prefixLength)) {\n            $file = str_replace('\\\\', '/', substr($class, $prefixLength));\n            $file = realpath(__DIR__ . (empty($file) ? '' : '/') . $file . '.php');\n            if (file_exists($file)) {\n                require_once $file;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Canvas.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf;\n\n/**\n * Main rendering interface\n *\n * Currently {@link Dompdf\\Adapter\\CPDF}, {@link Dompdf\\Adapter\\PDFLib}, and {@link Dompdf\\Adapter\\GD}\n * implement this interface.\n *\n * Implementations should measure x and y increasing to the left and down,\n * respectively, with the origin in the top left corner.  Implementations\n * are free to use a unit other than points for length, but I can't\n * guarantee that the results will look any good.\n *\n * @package dompdf\n */\ninterface Canvas\n{\n    function __construct($paper = \"letter\", $orientation = \"portrait\", Dompdf $dompdf = null);\n\n    /**\n     * @return Dompdf\n     */\n    function get_dompdf();\n\n    /**\n     * Returns the current page number\n     *\n     * @return int\n     */\n    function get_page_number();\n\n    /**\n     * Returns the total number of pages\n     *\n     * @return int\n     */\n    function get_page_count();\n\n    /**\n     * Sets the total number of pages\n     *\n     * @param int $count\n     */\n    function set_page_count($count);\n\n    /**\n     * Draws a line from x1,y1 to x2,y2\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the format of the\n     * $style parameter (aka dash).\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $x2\n     * @param float $y2\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    function line($x1, $y1, $x2, $y2, $color, $width, $style = null);\n\n    /**\n     * Draws a rectangle at x1,y1 with width w and height h\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the $style\n     * parameter (aka dash)\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     */\n    function rectangle($x1, $y1, $w, $h, $color, $width, $style = null);\n\n    /**\n     * Draws a filled rectangle at x1,y1 with width w and height h\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param array $color\n     */\n    function filled_rectangle($x1, $y1, $w, $h, $color);\n\n    /**\n     * Starts a clipping rectangle at x1,y1 with width w and height h\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     */\n    function clipping_rectangle($x1, $y1, $w, $h);\n\n    /**\n     * Starts a rounded clipping rectangle at x1,y1 with width w and height h\n     *\n     * @param float $x1\n     * @param float $y1\n     * @param float $w\n     * @param float $h\n     * @param float $tl\n     * @param float $tr\n     * @param float $br\n     * @param float $bl\n     *\n     * @return\n     */\n    function clipping_roundrectangle($x1, $y1, $w, $h, $tl, $tr, $br, $bl);\n\n    /**\n     * Ends the last clipping shape\n     */\n    function clipping_end();\n\n    /**\n     * Writes text at the specified x and y coordinates on every page\n     *\n     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced\n     * with their current values.\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float  $x\n     * @param float  $y\n     * @param string $text       the text to write\n     * @param string $font       the font file to use\n     * @param float  $size       the font size, in points\n     * @param array  $color\n     * @param float  $word_space word spacing adjustment\n     * @param float  $char_space char spacing adjustment\n     * @param float  $angle      angle to write the text at, measured CW starting from the x-axis\n     */\n    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0);\n\n    /**\n     * Save current state\n     */\n    function save();\n\n    /**\n     * Restore last state\n     */\n    function restore();\n\n    /**\n     * Rotate\n     *\n     * @param float $angle angle in degrees for counter-clockwise rotation\n     * @param float $x     Origin abscissa\n     * @param float $y     Origin ordinate\n     */\n    function rotate($angle, $x, $y);\n\n    /**\n     * Skew\n     *\n     * @param float $angle_x\n     * @param float $angle_y\n     * @param float $x Origin abscissa\n     * @param float $y Origin ordinate\n     */\n    function skew($angle_x, $angle_y, $x, $y);\n\n    /**\n     * Scale\n     *\n     * @param float $s_x scaling factor for width as percent\n     * @param float $s_y scaling factor for height as percent\n     * @param float $x   Origin abscissa\n     * @param float $y   Origin ordinate\n     */\n    function scale($s_x, $s_y, $x, $y);\n\n    /**\n     * Translate\n     *\n     * @param float $t_x movement to the right\n     * @param float $t_y movement to the bottom\n     */\n    function translate($t_x, $t_y);\n\n    /**\n     * Transform\n     *\n     * @param $a\n     * @param $b\n     * @param $c\n     * @param $d\n     * @param $e\n     * @param $f\n     * @return\n     */\n    function transform($a, $b, $c, $d, $e, $f);\n\n    /**\n     * Draws a polygon\n     *\n     * The polygon is formed by joining all the points stored in the $points\n     * array.  $points has the following structure:\n     * <code>\n     * array(0 => x1,\n     *       1 => y1,\n     *       2 => x2,\n     *       3 => y2,\n     *       ...\n     *       );\n     * </code>\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the $style\n     * parameter (aka dash)\n     *\n     * @param array $points\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     * @param bool $fill Fills the polygon if true\n     */\n    function polygon($points, $color, $width = null, $style = null, $fill = false);\n\n    /**\n     * Draws a circle at $x,$y with radius $r\n     *\n     * See {@link Style::munge_color()} for the format of the color array.\n     * See {@link Cpdf::setLineStyle()} for a description of the $style\n     * parameter (aka dash)\n     *\n     * @param float $x\n     * @param float $y\n     * @param float $r\n     * @param array $color\n     * @param float $width\n     * @param array $style\n     * @param bool $fill Fills the circle if true\n     */\n    function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false);\n\n    /**\n     * Add an image to the pdf.\n     *\n     * The image is placed at the specified x and y coordinates with the\n     * given width and height.\n     *\n     * @param string $img_url the path to the image\n     * @param float $x x position\n     * @param float $y y position\n     * @param int $w width (in pixels)\n     * @param int $h height (in pixels)\n     * @param string $resolution The resolution of the image\n     */\n    function image($img_url, $x, $y, $w, $h, $resolution = \"normal\");\n\n    /**\n     * Add an arc to the PDF\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float $x X coordinate of the arc\n     * @param float $y Y coordinate of the arc\n     * @param float $r1 Radius 1\n     * @param float $r2 Radius 2\n     * @param float $astart Start angle in degrees\n     * @param float $aend End angle in degrees\n     * @param array $color Color\n     * @param float $width\n     * @param array $style\n     */\n    function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = []);\n\n    /**\n     * Writes text at the specified x and y coordinates\n     * See {@link Style::munge_color()} for the format of the color array.\n     *\n     * @param float $x\n     * @param float $y\n     * @param string $text the text to write\n     * @param string $font the font file to use\n     * @param float $size the font size, in points\n     * @param array $color\n     * @param float $word_space word spacing adjustment\n     * @param float $char_space char spacing adjustment\n     * @param float $angle angle\n     */\n    function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0);\n\n    /**\n     * Add a named destination (similar to <a name=\"foo\">...</a> in html)\n     *\n     * @param string $anchorname The name of the named destination\n     */\n    function add_named_dest($anchorname);\n\n    /**\n     * Add a link to the pdf\n     *\n     * @param string $url The url to link to\n     * @param float $x The x position of the link\n     * @param float $y The y position of the link\n     * @param float $width The width of the link\n     * @param float $height The height of the link\n     */\n    function add_link($url, $x, $y, $width, $height);\n\n    /**\n     * Add meta information to the pdf\n     *\n     * @param string $name Label of the value (Creator, Producer, etc.)\n     * @param string $value The text to set\n     */\n    function add_info($name, $value);\n\n    /**\n     * Calculates text size, in points\n     *\n     * @param string $text the text to be sized\n     * @param string $font the desired font\n     * @param float $size the desired font size\n     * @param float $word_spacing word spacing, if any\n     * @param float $char_spacing char spacing, if any\n     *\n     * @return float\n     */\n    function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0);\n\n    /**\n     * Calculates font height, in points\n     *\n     * @param string $font\n     * @param float $size\n     *\n     * @return float\n     */\n    function get_font_height($font, $size);\n\n    /**\n     * Calculates font baseline, in points\n     *\n     * @param string $font\n     * @param float $size\n     *\n     * @return float\n     */\n    function get_font_baseline($font, $size);\n\n    /**\n     * Returns the PDF's width in points\n     *\n     * @return float\n     */\n    function get_width();\n\n\n    /**\n     * Return the image's height in pixels\n     *\n     * @return float\n     */\n    function get_height();\n\n    /**\n     * Returns the font x-height, in points\n     *\n     * @param string $font\n     * @param float $size\n     *\n     * @return float\n     */\n    //function get_font_x_height($font, $size);\n\n    /**\n     * Sets the opacity\n     *\n     * @param float $opacity\n     * @param string $mode\n     */\n    function set_opacity($opacity, $mode = \"Normal\");\n\n    /**\n     * Sets the default view\n     *\n     * @param string $view\n     * 'XYZ'  left, top, zoom\n     * 'Fit'\n     * 'FitH' top\n     * 'FitV' left\n     * 'FitR' left,bottom,right\n     * 'FitB'\n     * 'FitBH' top\n     * 'FitBV' left\n     * @param array $options\n     *\n     * @return void\n     */\n    function set_default_view($view, $options = []);\n\n    /**\n     * @param string $script\n     *\n     * @return void\n     */\n    function javascript($script);\n\n    /**\n     * Starts a new page\n     *\n     * Subsequent drawing operations will appear on the new page.\n     */\n    function new_page();\n\n    /**\n     * Streams the PDF directly to the browser.\n     *\n     * @param string $filename The filename to present to the browser.\n     * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).\n     */\n    function stream($filename, $options = []);\n\n    /**\n     * Returns the PDF as a string.\n     *\n     * @param array $options Associative array: 'compress' => 1 or 0 (default 1).\n     * @return string\n     */\n    function output($options = []);\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/CanvasFactory.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\n/**\n * Create canvas instances\n *\n * The canvas factory creates canvas instances based on the\n * availability of rendering backends and config options.\n *\n * @package dompdf\n */\nclass CanvasFactory\n{\n    /**\n     * Constructor is private: this is a static class\n     */\n    private function __construct()\n    {\n    }\n\n    /**\n     * @param Dompdf $dompdf\n     * @param string|array $paper\n     * @param string $orientation\n     * @param string $class\n     *\n     * @return Canvas\n     */\n    static function get_instance(Dompdf $dompdf, $paper = null, $orientation = null, $class = null)\n    {\n        $backend = strtolower($dompdf->getOptions()->getPdfBackend());\n\n        if (isset($class) && class_exists($class, false)) {\n            $class .= \"_Adapter\";\n        } else {\n            if (($backend === \"auto\" || $backend === \"pdflib\") &&\n                class_exists(\"PDFLib\", false)\n            ) {\n                $class = \"Dompdf\\\\Adapter\\\\PDFLib\";\n            }\n\n            else {\n                if ($backend === \"gd\" && extension_loaded('gd')) {\n                    $class = \"Dompdf\\\\Adapter\\\\GD\";\n                } else {\n                    $class = \"Dompdf\\\\Adapter\\\\CPDF\";\n                }\n            }\n        }\n\n        return new $class($paper, $orientation, $dompdf);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Cellmap.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\nuse Dompdf\\FrameDecorator\\Table as TableFrameDecorator;\nuse Dompdf\\FrameDecorator\\TableCell as TableCellFrameDecorator;\n\n/**\n * Maps table cells to the table grid.\n *\n * This class resolves borders in tables with collapsed borders and helps\n * place row & column spanned table cells.\n *\n * @package dompdf\n */\nclass Cellmap\n{\n    /**\n     * Border style weight lookup for collapsed border resolution.\n     *\n     * @var array\n     */\n    protected static $_BORDER_STYLE_SCORE = [\n        \"inset\"  => 1,\n        \"groove\" => 2,\n        \"outset\" => 3,\n        \"ridge\"  => 4,\n        \"dotted\" => 5,\n        \"dashed\" => 6,\n        \"solid\"  => 7,\n        \"double\" => 8,\n        \"hidden\" => 9,\n        \"none\"   => 0,\n    ];\n\n    /**\n     * The table object this cellmap is attached to.\n     *\n     * @var TableFrameDecorator\n     */\n    protected $_table;\n\n    /**\n     * The total number of rows in the table\n     *\n     * @var int\n     */\n    protected $_num_rows;\n\n    /**\n     * The total number of columns in the table\n     *\n     * @var int\n     */\n    protected $_num_cols;\n\n    /**\n     * 2D array mapping <row,column> to frames\n     *\n     * @var Frame[][]\n     */\n    protected $_cells;\n\n    /**\n     * 1D array of column dimensions\n     *\n     * @var array\n     */\n    protected $_columns;\n\n    /**\n     * 1D array of row dimensions\n     *\n     * @var array\n     */\n    protected $_rows;\n\n    /**\n     * 2D array of border specs\n     *\n     * @var array\n     */\n    protected $_borders;\n\n    /**\n     * 1D Array mapping frames to (multiple) <row, col> pairs, keyed on frame_id.\n     *\n     * @var Frame[]\n     */\n    protected $_frames;\n\n    /**\n     * Current column when adding cells, 0-based\n     *\n     * @var int\n     */\n    private $__col;\n\n    /**\n     * Current row when adding cells, 0-based\n     *\n     * @var int\n     */\n    private $__row;\n\n    /**\n     * Tells whether the columns' width can be modified\n     *\n     * @var bool\n     */\n    private $_columns_locked = false;\n\n    /**\n     * Tells whether the table has table-layout:fixed\n     *\n     * @var bool\n     */\n    private $_fixed_layout = false;\n\n    /**\n     * @param TableFrameDecorator $table\n     */\n    public function __construct(TableFrameDecorator $table)\n    {\n        $this->_table = $table;\n        $this->reset();\n    }\n\n    /**\n     *\n     */\n    public function reset()\n    {\n        $this->_num_rows = 0;\n        $this->_num_cols = 0;\n\n        $this->_cells = [];\n        $this->_frames = [];\n\n        if (!$this->_columns_locked) {\n            $this->_columns = [];\n        }\n\n        $this->_rows = [];\n\n        $this->_borders = [];\n\n        $this->__col = $this->__row = 0;\n    }\n\n    /**\n     *\n     */\n    public function lock_columns()\n    {\n        $this->_columns_locked = true;\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_columns_locked()\n    {\n        return $this->_columns_locked;\n    }\n\n    /**\n     * @param $fixed\n     */\n    public function set_layout_fixed($fixed)\n    {\n        $this->_fixed_layout = $fixed;\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_layout_fixed()\n    {\n        return $this->_fixed_layout;\n    }\n\n    /**\n     * @return int\n     */\n    public function get_num_rows()\n    {\n        return $this->_num_rows;\n    }\n\n    /**\n     * @return int\n     */\n    public function get_num_cols()\n    {\n        return $this->_num_cols;\n    }\n\n    /**\n     * @return array\n     */\n    public function &get_columns()\n    {\n        return $this->_columns;\n    }\n\n    /**\n     * @param $columns\n     */\n    public function set_columns($columns)\n    {\n        $this->_columns = $columns;\n    }\n\n    /**\n     * @param int $i\n     *\n     * @return mixed\n     */\n    public function &get_column($i)\n    {\n        if (!isset($this->_columns[$i])) {\n            $this->_columns[$i] = [\n                \"x\"          => 0,\n                \"min-width\"  => 0,\n                \"max-width\"  => 0,\n                \"used-width\" => null,\n                \"absolute\"   => 0,\n                \"percent\"    => 0,\n                \"auto\"       => true,\n            ];\n        }\n\n        return $this->_columns[$i];\n    }\n\n    /**\n     * @return array\n     */\n    public function &get_rows()\n    {\n        return $this->_rows;\n    }\n\n    /**\n     * @param int $j\n     *\n     * @return mixed\n     */\n    public function &get_row($j)\n    {\n        if (!isset($this->_rows[$j])) {\n            $this->_rows[$j] = [\n                \"y\"            => 0,\n                \"first-column\" => 0,\n                \"height\"       => null,\n            ];\n        }\n\n        return $this->_rows[$j];\n    }\n\n    /**\n     * @param int $i\n     * @param int $j\n     * @param mixed $h_v\n     * @param null|mixed $prop\n     *\n     * @return mixed\n     */\n    public function get_border($i, $j, $h_v, $prop = null)\n    {\n        if (!isset($this->_borders[$i][$j][$h_v])) {\n            $this->_borders[$i][$j][$h_v] = [\n                \"width\" => 0,\n                \"style\" => \"solid\",\n                \"color\" => \"black\",\n            ];\n        }\n\n        if (isset($prop)) {\n            return $this->_borders[$i][$j][$h_v][$prop];\n        }\n\n        return $this->_borders[$i][$j][$h_v];\n    }\n\n    /**\n     * @param int $i\n     * @param int $j\n     *\n     * @return array\n     */\n    public function get_border_properties($i, $j)\n    {\n        return [\n            \"top\"    => $this->get_border($i, $j, \"horizontal\"),\n            \"right\"  => $this->get_border($i, $j + 1, \"vertical\"),\n            \"bottom\" => $this->get_border($i + 1, $j, \"horizontal\"),\n            \"left\"   => $this->get_border($i, $j, \"vertical\"),\n        ];\n    }\n\n    /**\n     * @param Frame $frame\n     *\n     * @return array|null\n     */\n    public function get_spanned_cells(Frame $frame)\n    {\n        $key = $frame->get_id();\n\n        if (isset($this->_frames[$key])) {\n            return $this->_frames[$key];\n        }\n\n        return null;\n    }\n\n    /**\n     * @param Frame $frame\n     *\n     * @return bool\n     */\n    public function frame_exists_in_cellmap(Frame $frame)\n    {\n        $key = $frame->get_id();\n\n        return isset($this->_frames[$key]);\n    }\n\n    /**\n     * @param Frame $frame\n     *\n     * @return array\n     * @throws Exception\n     */\n    public function get_frame_position(Frame $frame)\n    {\n        global $_dompdf_warnings;\n\n        $key = $frame->get_id();\n\n        if (!isset($this->_frames[$key])) {\n            throw new Exception(\"Frame not found in cellmap\");\n        }\n\n        // Positions are stored relative to the table position\n        [$table_x, $table_y] = $this->_table->get_position();\n        $col = $this->_frames[$key][\"columns\"][0];\n        $row = $this->_frames[$key][\"rows\"][0];\n\n        if (!isset($this->_columns[$col])) {\n            $_dompdf_warnings[] = \"Frame not found in columns array.  Check your table layout for missing or extra TDs.\";\n            $x = $table_x;\n        } else {\n            $x = $table_x + $this->_columns[$col][\"x\"];\n        }\n\n        if (!isset($this->_rows[$row])) {\n            $_dompdf_warnings[] = \"Frame not found in row array.  Check your table layout for missing or extra TDs.\";\n            $y = $table_y;\n        } else {\n            $y = $table_y + $this->_rows[$row][\"y\"];\n        }\n\n        return [$x, $y, \"x\" => $x, \"y\" => $y];\n    }\n\n    /**\n     * @param Frame $frame\n     *\n     * @return int\n     * @throws Exception\n     */\n    public function get_frame_width(Frame $frame)\n    {\n        $key = $frame->get_id();\n\n        if (!isset($this->_frames[$key])) {\n            throw new Exception(\"Frame not found in cellmap\");\n        }\n\n        $cols = $this->_frames[$key][\"columns\"];\n        $w = 0;\n        foreach ($cols as $i) {\n            $w += $this->_columns[$i][\"used-width\"];\n        }\n\n        return $w;\n    }\n\n    /**\n     * @param Frame $frame\n     *\n     * @return int\n     * @throws Exception\n     * @throws Exception\n     */\n    public function get_frame_height(Frame $frame)\n    {\n        $key = $frame->get_id();\n\n        if (!isset($this->_frames[$key])) {\n            throw new Exception(\"Frame not found in cellmap\");\n        }\n\n        $rows = $this->_frames[$key][\"rows\"];\n        $h = 0;\n        foreach ($rows as $i) {\n            if (!isset($this->_rows[$i])) {\n                throw new Exception(\"The row #$i could not be found, please file an issue in the tracker with the HTML code\");\n            }\n\n            $h += $this->_rows[$i][\"height\"];\n        }\n\n        return $h;\n    }\n\n    /**\n     * @param int $j\n     * @param mixed $width\n     */\n    public function set_column_width($j, $width)\n    {\n        if ($this->_columns_locked) {\n            return;\n        }\n\n        $col =& $this->get_column($j);\n        $col[\"used-width\"] = $width;\n        $next_col =& $this->get_column($j + 1);\n        $next_col[\"x\"] = $col[\"x\"] + $width;\n    }\n\n    /**\n     * @param int $i\n     * @param long $height\n     */\n    public function set_row_height($i, $height)\n    {\n        $row =& $this->get_row($i);\n        if ($height > $row[\"height\"]) {\n            $row[\"height\"] = $height;\n        }\n        $next_row =& $this->get_row($i + 1);\n        $next_row[\"y\"] = $row[\"y\"] + $row[\"height\"];\n    }\n\n    /**\n     * @param int $i\n     * @param int $j\n     * @param mixed $h_v\n     * @param mixed $border_spec\n     *\n     * @return mixed\n     */\n    protected function _resolve_border($i, $j, $h_v, $border_spec)\n    {\n        $n_width = $border_spec[\"width\"];\n        $n_style = $border_spec[\"style\"];\n\n        if (!isset($this->_borders[$i][$j][$h_v])) {\n            $this->_borders[$i][$j][$h_v] = $border_spec;\n\n            return $this->_borders[$i][$j][$h_v][\"width\"];\n        }\n\n        $border = & $this->_borders[$i][$j][$h_v];\n\n        $o_width = $border[\"width\"];\n        $o_style = $border[\"style\"];\n\n        if (($n_style === \"hidden\" ||\n                $n_width > $o_width ||\n                $o_style === \"none\")\n\n            or\n\n            ($o_width == $n_width &&\n                in_array($n_style, self::$_BORDER_STYLE_SCORE) &&\n                self::$_BORDER_STYLE_SCORE[$n_style] > self::$_BORDER_STYLE_SCORE[$o_style])\n        ) {\n            $border = $border_spec;\n        }\n\n        return $border[\"width\"];\n    }\n\n    /**\n     * @param Frame $frame\n     */\n    public function add_frame(Frame $frame)\n    {\n        $style = $frame->get_style();\n        $display = $style->display;\n\n        $collapse = $this->_table->get_style()->border_collapse == \"collapse\";\n\n        // Recursively add the frames within tables, table-row-groups and table-rows\n        if ($display === \"table-row\" ||\n            $display === \"table\" ||\n            $display === \"inline-table\" ||\n            in_array($display, TableFrameDecorator::$ROW_GROUPS)\n        ) {\n            $start_row = $this->__row;\n            foreach ($frame->get_children() as $child) {\n                // Ignore all Text frames and :before/:after pseudo-selector elements.\n                if (!($child instanceof FrameDecorator\\Text) && $child->get_node()->nodeName !== 'dompdf_generated') {\n                    $this->add_frame($child);\n                }\n            }\n\n            if ($display === \"table-row\") {\n                $this->add_row();\n            }\n\n            $num_rows = $this->__row - $start_row - 1;\n            $key = $frame->get_id();\n\n            // Row groups always span across the entire table\n            $this->_frames[$key][\"columns\"] = range(0, max(0, $this->_num_cols - 1));\n            $this->_frames[$key][\"rows\"] = range($start_row, max(0, $this->__row - 1));\n            $this->_frames[$key][\"frame\"] = $frame;\n\n            if ($display !== \"table-row\" && $collapse) {\n                $bp = $style->get_border_properties();\n\n                // Resolve the borders\n                for ($i = 0; $i < $num_rows + 1; $i++) {\n                    $this->_resolve_border($start_row + $i, 0, \"vertical\", $bp[\"left\"]);\n                    $this->_resolve_border($start_row + $i, $this->_num_cols, \"vertical\", $bp[\"right\"]);\n                }\n\n                for ($j = 0; $j < $this->_num_cols; $j++) {\n                    $this->_resolve_border($start_row, $j, \"horizontal\", $bp[\"top\"]);\n                    $this->_resolve_border($this->__row, $j, \"horizontal\", $bp[\"bottom\"]);\n                }\n            }\n            return;\n        }\n\n        $node = $frame->get_node();\n\n        // Determine where this cell is going\n        $colspan = max((int) $node->getAttribute(\"colspan\"), 1);\n        $rowspan = max((int) $node->getAttribute(\"rowspan\"), 1);\n\n        $key = $frame->get_id();\n\n        $bp = $style->get_border_properties();\n\n\n        // Add the frame to the cellmap\n        $max_left = $max_right = 0;\n\n        // Find the next available column (fix by Ciro Mondueri)\n        $ac = $this->__col;\n        while (isset($this->_cells[$this->__row][$ac])) {\n            $ac++;\n        }\n\n        $this->__col = $ac;\n\n        // Rows:\n        for ($i = 0; $i < $rowspan; $i++) {\n            $row = $this->__row + $i;\n\n            $this->_frames[$key][\"rows\"][] = $row;\n\n            for ($j = 0; $j < $colspan; $j++) {\n                $this->_cells[$row][$this->__col + $j] = $frame;\n            }\n\n            if ($collapse) {\n                // Resolve vertical borders\n                $max_left = max($max_left, $this->_resolve_border($row, $this->__col, \"vertical\", $bp[\"left\"]));\n                $max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, \"vertical\", $bp[\"right\"]));\n            }\n        }\n\n        $max_top = $max_bottom = 0;\n\n        // Columns:\n        for ($j = 0; $j < $colspan; $j++) {\n            $col = $this->__col + $j;\n            $this->_frames[$key][\"columns\"][] = $col;\n\n            if ($collapse) {\n                // Resolve horizontal borders\n                $max_top = max($max_top, $this->_resolve_border($this->__row, $col, \"horizontal\", $bp[\"top\"]));\n                $max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, \"horizontal\", $bp[\"bottom\"]));\n            }\n        }\n\n        $this->_frames[$key][\"frame\"] = $frame;\n\n        // Handle separated border model\n        if (!$collapse) {\n            list($h, $v) = $this->_table->get_style()->border_spacing;\n\n            // Border spacing is effectively a margin between cells\n            $v = $style->length_in_pt($v);\n            if (is_numeric($v)) {\n                $v = $v / 2;\n            }\n            $h = $style->length_in_pt($h);\n            if (is_numeric($h)) {\n                $h = $h / 2;\n            }\n            $style->margin = \"$v $h\";\n\n            // The additional 1/2 width gets added to the table proper\n        } else {\n            // Drop the frame's actual border\n            $style->border_left_width = $max_left / 2;\n            $style->border_right_width = $max_right / 2;\n            $style->border_top_width = $max_top / 2;\n            $style->border_bottom_width = $max_bottom / 2;\n            $style->margin = \"none\";\n        }\n\n        if (!$this->_columns_locked) {\n            // Resolve the frame's width\n            if ($this->_fixed_layout) {\n                list($frame_min, $frame_max) = [0, 10e-10];\n            } else {\n                list($frame_min, $frame_max) = $frame->get_min_max_width();\n            }\n\n            $min_width = $style->min_width;\n            $max_width = $style->max_width;\n\n            if ($min_width !== \"auto\" && !Helpers::is_percent($min_width)) {\n                $specified_min = (float) $style->length_in_pt($min_width);\n                $frame_min = max($frame_min, $specified_min);\n                $frame_max = max($frame_max, $frame_min);\n            }\n\n            if ($max_width !== \"none\" && !Helpers::is_percent($max_width)) {\n                // `min-width` takes precedence over `max-width` here\n                $specified_max = (float) $style->length_in_pt($max_width);\n                $frame_max = max(min($frame_max, $specified_max), $specified_min ?? 0);\n                $frame_min = min($frame_min, $frame_max);\n            }\n\n            $width = $style->width;\n\n            $val = null;\n            if (Helpers::is_percent($width) && $colspan === 1) {\n                $var = \"percent\";\n                $val = (float)rtrim($width, \"% \");\n            } else if ($width !== \"auto\" && $colspan === 1) {\n                $var = \"absolute\";\n                $val = $style->length_in_pt($frame_min);\n            }\n\n            $min = 0;\n            $max = 0;\n            for ($cs = 0; $cs < $colspan; $cs++) {\n\n                // Resolve the frame's width(s) with other cells\n                $col =& $this->get_column($this->__col + $cs);\n\n                // Note: $var is either 'percent' or 'absolute'.  We compare the\n                // requested percentage or absolute values with the existing widths\n                // and adjust accordingly.\n                if (isset($var) && $val > $col[$var]) {\n                    $col[$var] = $val;\n                    $col[\"auto\"] = false;\n                }\n\n                $min += $col[\"min-width\"];\n                $max += $col[\"max-width\"];\n            }\n\n            if ($frame_min > $min && $colspan === 1) {\n                // The frame needs more space.  Expand each sub-column\n                // FIXME try to avoid putting this dummy value when table-layout:fixed\n                $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_min - $min));\n                for ($c = 0; $c < $colspan; $c++) {\n                    $col =& $this->get_column($this->__col + $c);\n                    $col[\"min-width\"] += $inc;\n                }\n            }\n\n            if ($frame_max > $max) {\n                // FIXME try to avoid putting this dummy value when table-layout:fixed\n                $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_max - $max) / $colspan);\n                for ($c = 0; $c < $colspan; $c++) {\n                    $col =& $this->get_column($this->__col + $c);\n                    $col[\"max-width\"] += $inc;\n                }\n            }\n        }\n\n        $this->__col += $colspan;\n        if ($this->__col > $this->_num_cols) {\n            $this->_num_cols = $this->__col;\n        }\n    }\n\n    /**\n     *\n     */\n    public function add_row()\n    {\n        $this->__row++;\n        $this->_num_rows++;\n\n        // Find the next available column\n        $i = 0;\n        while (isset($this->_cells[$this->__row][$i])) {\n            $i++;\n        }\n\n        $this->__col = $i;\n    }\n\n    /**\n     * Remove a row from the cellmap.\n     *\n     * @param Frame\n     */\n    public function remove_row(Frame $row)\n    {\n        $key = $row->get_id();\n        if (!isset($this->_frames[$key])) {\n            return; // Presumably this row has alredy been removed\n        }\n\n        $this->__row = $this->_num_rows--;\n\n        $rows = $this->_frames[$key][\"rows\"];\n        $columns = $this->_frames[$key][\"columns\"];\n\n        // Remove all frames from this row\n        foreach ($rows as $r) {\n            foreach ($columns as $c) {\n                if (isset($this->_cells[$r][$c])) {\n                    $id = $this->_cells[$r][$c]->get_id();\n\n                    $this->_cells[$r][$c] = null;\n                    unset($this->_cells[$r][$c]);\n\n                    // has multiple rows?\n                    if (isset($this->_frames[$id]) && count($this->_frames[$id][\"rows\"]) > 1) {\n                        // remove just the desired row, but leave the frame\n                        if (($row_key = array_search($r, $this->_frames[$id][\"rows\"])) !== false) {\n                            unset($this->_frames[$id][\"rows\"][$row_key]);\n                        }\n                        continue;\n                    }\n\n                    $this->_frames[$id] = null;\n                    unset($this->_frames[$id]);\n                }\n            }\n\n            $this->_rows[$r] = null;\n            unset($this->_rows[$r]);\n        }\n\n        $this->_frames[$key] = null;\n        unset($this->_frames[$key]);\n    }\n\n    /**\n     * Remove a row group from the cellmap.\n     *\n     * @param Frame $group The group to remove\n     */\n    public function remove_row_group(Frame $group)\n    {\n        $key = $group->get_id();\n        if (!isset($this->_frames[$key])) {\n            return; // Presumably this row has alredy been removed\n        }\n\n        $iter = $group->get_first_child();\n        while ($iter) {\n            $this->remove_row($iter);\n            $iter = $iter->get_next_sibling();\n        }\n\n        $this->_frames[$key] = null;\n        unset($this->_frames[$key]);\n    }\n\n    /**\n     * Update a row group after rows have been removed\n     *\n     * @param Frame $group    The group to update\n     * @param Frame $last_row The last row in the row group\n     */\n    public function update_row_group(Frame $group, Frame $last_row)\n    {\n        $g_key = $group->get_id();\n        $r_key = $last_row->get_id();\n\n        $r_rows = $this->_frames[$g_key][\"rows\"];\n        $this->_frames[$g_key][\"rows\"] = range($this->_frames[$g_key][\"rows\"][0], end($r_rows));\n    }\n\n    /**\n     *\n     */\n    public function assign_x_positions()\n    {\n        // Pre-condition: widths must be resolved and assigned to columns and\n        // column[0][\"x\"] must be set.\n\n        if ($this->_columns_locked) {\n            return;\n        }\n\n        $x = $this->_columns[0][\"x\"];\n        foreach (array_keys($this->_columns) as $j) {\n            $this->_columns[$j][\"x\"] = $x;\n            $x += $this->_columns[$j][\"used-width\"];\n        }\n    }\n\n    /**\n     *\n     */\n    public function assign_frame_heights()\n    {\n        // Pre-condition: widths and heights of each column & row must be\n        // calcluated\n        foreach ($this->_frames as $arr) {\n            $frame = $arr[\"frame\"];\n\n            $h = 0;\n            foreach ($arr[\"rows\"] as $row) {\n                if (!isset($this->_rows[$row])) {\n                    // The row has been removed because of a page split, so skip it.\n                    continue;\n                }\n\n                $h += $this->_rows[$row][\"height\"];\n            }\n\n            if ($frame instanceof TableCellFrameDecorator) {\n                $frame->set_cell_height($h);\n            } else {\n                $frame->get_style()->height = $h;\n            }\n        }\n    }\n\n    /**\n     * Re-adjust frame height if the table height is larger than its content\n     */\n    public function set_frame_heights($table_height, $content_height)\n    {\n        // Distribute the increased height proportionally amongst each row\n        foreach ($this->_frames as $arr) {\n            $frame = $arr[\"frame\"];\n\n            $h = 0;\n            foreach ($arr[\"rows\"] as $row) {\n                if (!isset($this->_rows[$row])) {\n                    continue;\n                }\n\n                $h += $this->_rows[$row][\"height\"];\n            }\n\n            if ($content_height > 0) {\n                $new_height = ($h / $content_height) * $table_height;\n            } else {\n                $new_height = 0;\n            }\n\n            if ($frame instanceof TableCellFrameDecorator) {\n                $frame->set_cell_height($new_height);\n            } else {\n                $frame->get_style()->height = $new_height;\n            }\n        }\n    }\n\n    /**\n     * Used for debugging:\n     *\n     * @return string\n     */\n    public function __toString()\n    {\n        $str = \"\";\n        $str .= \"Columns:<br/>\";\n        $str .= Helpers::pre_r($this->_columns, true);\n        $str .= \"Rows:<br/>\";\n        $str .= Helpers::pre_r($this->_rows, true);\n\n        $str .= \"Frames:<br/>\";\n        $arr = [];\n        foreach ($this->_frames as $key => $val) {\n            $arr[$key] = [\"columns\" => $val[\"columns\"], \"rows\" => $val[\"rows\"]];\n        }\n\n        $str .= Helpers::pre_r($arr, true);\n\n        if (php_sapi_name() == \"cli\") {\n            $str = strip_tags(str_replace([\"<br/>\", \"<b>\", \"</b>\"],\n                [\"\\n\", chr(27) . \"[01;33m\", chr(27) . \"[0m\"],\n                $str));\n        }\n\n        return $str;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Css/AttributeTranslator.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Css;\n\nuse Dompdf\\Frame;\n\n/**\n * Translates HTML 4.0 attributes into CSS rules\n *\n * @package dompdf\n */\nclass AttributeTranslator\n{\n    static $_style_attr = \"_html_style_attribute\";\n\n    // Munged data originally from\n    // http://www.w3.org/TR/REC-html40/index/attributes.html\n    // http://www.cs.tut.fi/~jkorpela/html2css.html\n    private static $__ATTRIBUTE_LOOKUP = [\n        //'caption' => array ( 'align' => '', ),\n        'img' => [\n            'align' => [\n                'bottom' => 'vertical-align: baseline;',\n                'middle' => 'vertical-align: middle;',\n                'top' => 'vertical-align: top;',\n                'left' => 'float: left;',\n                'right' => 'float: right;'\n            ],\n            'border' => 'border: %0.2Fpx solid;',\n            'height' => 'height: %spx;',\n            'hspace' => 'padding-left: %1$0.2Fpx; padding-right: %1$0.2Fpx;',\n            'vspace' => 'padding-top: %1$0.2Fpx; padding-bottom: %1$0.2Fpx;',\n            'width' => 'width: %spx;',\n        ],\n        'table' => [\n            'align' => [\n                'left' => 'margin-left: 0; margin-right: auto;',\n                'center' => 'margin-left: auto; margin-right: auto;',\n                'right' => 'margin-left: auto; margin-right: 0;'\n            ],\n            'bgcolor' => 'background-color: %s;',\n            'border' => '!set_table_border',\n            'cellpadding' => '!set_table_cellpadding', //'border-spacing: %0.2F; border-collapse: separate;',\n            'cellspacing' => '!set_table_cellspacing',\n            'frame' => [\n                'void' => 'border-style: none;',\n                'above' => 'border-top-style: solid;',\n                'below' => 'border-bottom-style: solid;',\n                'hsides' => 'border-left-style: solid; border-right-style: solid;',\n                'vsides' => 'border-top-style: solid; border-bottom-style: solid;',\n                'lhs' => 'border-left-style: solid;',\n                'rhs' => 'border-right-style: solid;',\n                'box' => 'border-style: solid;',\n                'border' => 'border-style: solid;'\n            ],\n            'rules' => '!set_table_rules',\n            'width' => 'width: %s;',\n        ],\n        'hr' => [\n            'align' => '!set_hr_align', // Need to grab width to set 'left' & 'right' correctly\n            'noshade' => 'border-style: solid;',\n            'size' => '!set_hr_size', //'border-width: %0.2F px;',\n            'width' => 'width: %s;',\n        ],\n        'div' => [\n            'align' => 'text-align: %s;',\n        ],\n        'h1' => [\n            'align' => 'text-align: %s;',\n        ],\n        'h2' => [\n            'align' => 'text-align: %s;',\n        ],\n        'h3' => [\n            'align' => 'text-align: %s;',\n        ],\n        'h4' => [\n            'align' => 'text-align: %s;',\n        ],\n        'h5' => [\n            'align' => 'text-align: %s;',\n        ],\n        'h6' => [\n            'align' => 'text-align: %s;',\n        ],\n        //TODO: translate more form element attributes\n        'input' => [\n            'size' => '!set_input_width'\n        ],\n        'p' => [\n            'align' => 'text-align: %s;',\n        ],\n//    'col' => array(\n//      'align'  => '',\n//      'valign' => '',\n//    ),\n//    'colgroup' => array(\n//      'align'  => '',\n//      'valign' => '',\n//    ),\n        'tbody' => [\n            'align' => '!set_table_row_align',\n            'valign' => '!set_table_row_valign',\n        ],\n        'td' => [\n            'align' => 'text-align: %s;',\n            'bgcolor' => '!set_background_color',\n            'height' => 'height: %s;',\n            'nowrap' => 'white-space: nowrap;',\n            'valign' => 'vertical-align: %s;',\n            'width' => 'width: %s;',\n        ],\n        'tfoot' => [\n            'align' => '!set_table_row_align',\n            'valign' => '!set_table_row_valign',\n        ],\n        'th' => [\n            'align' => 'text-align: %s;',\n            'bgcolor' => '!set_background_color',\n            'height' => 'height: %s;',\n            'nowrap' => 'white-space: nowrap;',\n            'valign' => 'vertical-align: %s;',\n            'width' => 'width: %s;',\n        ],\n        'thead' => [\n            'align' => '!set_table_row_align',\n            'valign' => '!set_table_row_valign',\n        ],\n        'tr' => [\n            'align' => '!set_table_row_align',\n            'bgcolor' => '!set_table_row_bgcolor',\n            'valign' => '!set_table_row_valign',\n        ],\n        'body' => [\n            'background' => 'background-image: url(%s);',\n            'bgcolor' => '!set_background_color',\n            'link' => '!set_body_link',\n            'text' => '!set_color',\n        ],\n        'br' => [\n            'clear' => 'clear: %s;',\n        ],\n        'basefont' => [\n            'color' => '!set_color',\n            'face' => 'font-family: %s;',\n            'size' => '!set_basefont_size',\n        ],\n        'font' => [\n            'color' => '!set_color',\n            'face' => 'font-family: %s;',\n            'size' => '!set_font_size',\n        ],\n        'dir' => [\n            'compact' => 'margin: 0.5em 0;',\n        ],\n        'dl' => [\n            'compact' => 'margin: 0.5em 0;',\n        ],\n        'menu' => [\n            'compact' => 'margin: 0.5em 0;',\n        ],\n        'ol' => [\n            'compact' => 'margin: 0.5em 0;',\n            'start' => 'counter-reset: -dompdf-default-counter %d;',\n            'type' => 'list-style-type: %s;',\n        ],\n        'ul' => [\n            'compact' => 'margin: 0.5em 0;',\n            'type' => 'list-style-type: %s;',\n        ],\n        'li' => [\n            'type' => 'list-style-type: %s;',\n            'value' => 'counter-reset: -dompdf-default-counter %d;',\n        ],\n        'pre' => [\n            'width' => 'width: %s;',\n        ],\n    ];\n\n    protected static $_last_basefont_size = 3;\n    protected static $_font_size_lookup = [\n        // For basefont support\n        -3 => \"4pt\",\n        -2 => \"5pt\",\n        -1 => \"6pt\",\n        0 => \"7pt\",\n\n        1 => \"8pt\",\n        2 => \"10pt\",\n        3 => \"12pt\",\n        4 => \"14pt\",\n        5 => \"18pt\",\n        6 => \"24pt\",\n        7 => \"34pt\",\n\n        // For basefont support\n        8 => \"48pt\",\n        9 => \"44pt\",\n        10 => \"52pt\",\n        11 => \"60pt\",\n    ];\n\n    /**\n     * @param Frame $frame\n     */\n    static function translate_attributes(Frame $frame)\n    {\n        $node = $frame->get_node();\n        $tag = $node->nodeName;\n\n        if (!isset(self::$__ATTRIBUTE_LOOKUP[$tag])) {\n            return;\n        }\n\n        $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag];\n        $attrs = $node->attributes;\n        $style = rtrim($node->getAttribute(self::$_style_attr), \"; \");\n        if ($style != \"\") {\n            $style .= \";\";\n        }\n\n        foreach ($attrs as $attr => $attr_node) {\n            if (!isset($valid_attrs[$attr])) {\n                continue;\n            }\n\n            $value = $attr_node->value;\n\n            $target = $valid_attrs[$attr];\n\n            // Look up $value in $target, if $target is an array:\n            if (is_array($target)) {\n                if (isset($target[$value])) {\n                    $style .= \" \" . self::_resolve_target($node, $target[$value], $value);\n                }\n            } else {\n                // otherwise use target directly\n                $style .= \" \" . self::_resolve_target($node, $target, $value);\n            }\n        }\n\n        if (!is_null($style)) {\n            $style = ltrim($style);\n            $node->setAttribute(self::$_style_attr, $style);\n        }\n    }\n\n    /**\n     * @param \\DOMNode $node\n     * @param string $target\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _resolve_target(\\DOMNode $node, $target, $value)\n    {\n        if ($target[0] === \"!\") {\n            // Function call\n            $func = \"_\" . mb_substr($target, 1);\n\n            return self::$func($node, $value);\n        }\n\n        return $value ? sprintf($target, $value) : \"\";\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $new_style\n     */\n    static function append_style(\\DOMElement $node, $new_style)\n    {\n        $style = rtrim($node->getAttribute(self::$_style_attr), \";\");\n        $style .= $new_style;\n        $style = ltrim($style, \";\");\n        $node->setAttribute(self::$_style_attr, $style);\n    }\n\n    /**\n     * @param \\DOMNode $node\n     *\n     * @return \\DOMNodeList|\\DOMElement[]\n     */\n    protected static function get_cell_list(\\DOMNode $node)\n    {\n        $xpath = new \\DOMXpath($node->ownerDocument);\n\n        switch ($node->nodeName) {\n            default:\n            case \"table\":\n                $query = \"tr/td | thead/tr/td | tbody/tr/td | tfoot/tr/td | tr/th | thead/tr/th | tbody/tr/th | tfoot/tr/th\";\n                break;\n\n            case \"tbody\":\n            case \"tfoot\":\n            case \"thead\":\n                $query = \"tr/td | tr/th\";\n                break;\n\n            case \"tr\":\n                $query = \"td | th\";\n                break;\n        }\n\n        return $xpath->query($query, $node);\n    }\n\n    /**\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _get_valid_color($value)\n    {\n        if (preg_match('/^#?([0-9A-F]{6})$/i', $value, $matches)) {\n            $value = \"#$matches[1]\";\n        }\n\n        return $value;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _set_color(\\DOMElement $node, $value)\n    {\n        $value = self::_get_valid_color($value);\n\n        return \"color: $value;\";\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _set_background_color(\\DOMElement $node, $value)\n    {\n        $value = self::_get_valid_color($value);\n\n        return \"background-color: $value;\";\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null\n     */\n    protected static function _set_table_cellpadding(\\DOMElement $node, $value)\n    {\n        $cell_list = self::get_cell_list($node);\n\n        foreach ($cell_list as $cell) {\n            self::append_style($cell, \"; padding: {$value}px;\");\n        }\n\n        return null;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _set_table_border(\\DOMElement $node, $value)\n    {\n        $cell_list = self::get_cell_list($node);\n\n        foreach ($cell_list as $cell) {\n            $style = rtrim($cell->getAttribute(self::$_style_attr));\n            $style .= \"; border-width: \" . ($value > 0 ? 1 : 0) . \"pt; border-style: inset;\";\n            $style = ltrim($style, \";\");\n            $cell->setAttribute(self::$_style_attr, $style);\n        }\n\n        $style = rtrim($node->getAttribute(self::$_style_attr), \";\");\n        $style .= \"; border-width: $value\" . \"px; \";\n\n        return ltrim($style, \"; \");\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _set_table_cellspacing(\\DOMElement $node, $value)\n    {\n        $style = rtrim($node->getAttribute(self::$_style_attr), \";\");\n\n        if ($value == 0) {\n            $style .= \"; border-collapse: collapse;\";\n        } else {\n            $style .= \"; border-spacing: {$value}px; border-collapse: separate;\";\n        }\n\n        return ltrim($style, \";\");\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null|string\n     */\n    protected static function _set_table_rules(\\DOMElement $node, $value)\n    {\n        $new_style = \"; border-collapse: collapse;\";\n\n        switch ($value) {\n            case \"none\":\n                $new_style .= \"border-style: none;\";\n                break;\n\n            case \"groups\":\n                // FIXME: unsupported\n                return null;\n\n            case \"rows\":\n                $new_style .= \"border-style: solid none solid none; border-width: 1px; \";\n                break;\n\n            case \"cols\":\n                $new_style .= \"border-style: none solid none solid; border-width: 1px; \";\n                break;\n\n            case \"all\":\n                $new_style .= \"border-style: solid; border-width: 1px; \";\n                break;\n\n            default:\n                // Invalid value\n                return null;\n        }\n\n        $cell_list = self::get_cell_list($node);\n\n        foreach ($cell_list as $cell) {\n            $style = $cell->getAttribute(self::$_style_attr);\n            $style .= $new_style;\n            $cell->setAttribute(self::$_style_attr, $style);\n        }\n\n        $style = rtrim($node->getAttribute(self::$_style_attr), \";\");\n        $style .= \"; border-collapse: collapse; \";\n\n        return ltrim($style, \"; \");\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _set_hr_size(\\DOMElement $node, $value)\n    {\n        $style = rtrim($node->getAttribute(self::$_style_attr), \";\");\n        $style .= \"; border-width: \" . max(0, $value - 2) . \"; \";\n\n        return ltrim($style, \"; \");\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null|string\n     */\n    protected static function _set_hr_align(\\DOMElement $node, $value)\n    {\n        $style = rtrim($node->getAttribute(self::$_style_attr), \";\");\n        $width = $node->getAttribute(\"width\");\n\n        if ($width == \"\") {\n            $width = \"100%\";\n        }\n\n        $remainder = 100 - (double)rtrim($width, \"% \");\n\n        switch ($value) {\n            case \"left\":\n                $style .= \"; margin-right: $remainder %;\";\n                break;\n\n            case \"right\":\n                $style .= \"; margin-left: $remainder %;\";\n                break;\n\n            case \"center\":\n                $style .= \"; margin-left: auto; margin-right: auto;\";\n                break;\n\n            default:\n                return null;\n        }\n\n        return ltrim($style, \"; \");\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null|string\n     */\n    protected static function _set_input_width(\\DOMElement $node, $value)\n    {\n        if (empty($value)) { return null; }\n\n        if ($node->hasAttribute(\"type\") && in_array(strtolower($node->getAttribute(\"type\")), [\"text\",\"password\"])) {\n            return sprintf(\"width: %Fem\", (((int)$value * .65)+2));\n        } else {\n            return sprintf(\"width: %upx;\", (int)$value);\n        }\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null\n     */\n    protected static function _set_table_row_align(\\DOMElement $node, $value)\n    {\n        $cell_list = self::get_cell_list($node);\n\n        foreach ($cell_list as $cell) {\n            self::append_style($cell, \"; text-align: $value;\");\n        }\n\n        return null;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null\n     */\n    protected static function _set_table_row_valign(\\DOMElement $node, $value)\n    {\n        $cell_list = self::get_cell_list($node);\n\n        foreach ($cell_list as $cell) {\n            self::append_style($cell, \"; vertical-align: $value;\");\n        }\n\n        return null;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null\n     */\n    protected static function _set_table_row_bgcolor(\\DOMElement $node, $value)\n    {\n        $cell_list = self::get_cell_list($node);\n        $value = self::_get_valid_color($value);\n\n        foreach ($cell_list as $cell) {\n            self::append_style($cell, \"; background-color: $value;\");\n        }\n\n        return null;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null\n     */\n    protected static function _set_body_link(\\DOMElement $node, $value)\n    {\n        $a_list = $node->getElementsByTagName(\"a\");\n        $value = self::_get_valid_color($value);\n\n        foreach ($a_list as $a) {\n            self::append_style($a, \"; color: $value;\");\n        }\n\n        return null;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return null\n     */\n    protected static function _set_basefont_size(\\DOMElement $node, $value)\n    {\n        // FIXME: ? we don't actually set the font size of anything here, just\n        // the base size for later modification by <font> tags.\n        self::$_last_basefont_size = $value;\n\n        return null;\n    }\n\n    /**\n     * @param \\DOMElement $node\n     * @param string $value\n     *\n     * @return string\n     */\n    protected static function _set_font_size(\\DOMElement $node, $value)\n    {\n        $style = $node->getAttribute(self::$_style_attr);\n\n        if ($value[0] === \"-\" || $value[0] === \"+\") {\n            $value = self::$_last_basefont_size + (int)$value;\n        }\n\n        if (isset(self::$_font_size_lookup[$value])) {\n            $style .= \"; font-size: \" . self::$_font_size_lookup[$value] . \";\";\n        } else {\n            $style .= \"; font-size: $value;\";\n        }\n\n        return ltrim($style, \"; \");\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Css/Color.php",
    "content": "<?php\n\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Css;\n\nuse Dompdf\\Helpers;\n\nclass Color\n{\n    static $cssColorNames = [\n        \"aliceblue\" => \"F0F8FF\",\n        \"antiquewhite\" => \"FAEBD7\",\n        \"aqua\" => \"00FFFF\",\n        \"aquamarine\" => \"7FFFD4\",\n        \"azure\" => \"F0FFFF\",\n        \"beige\" => \"F5F5DC\",\n        \"bisque\" => \"FFE4C4\",\n        \"black\" => \"000000\",\n        \"blanchedalmond\" => \"FFEBCD\",\n        \"blue\" => \"0000FF\",\n        \"blueviolet\" => \"8A2BE2\",\n        \"brown\" => \"A52A2A\",\n        \"burlywood\" => \"DEB887\",\n        \"cadetblue\" => \"5F9EA0\",\n        \"chartreuse\" => \"7FFF00\",\n        \"chocolate\" => \"D2691E\",\n        \"coral\" => \"FF7F50\",\n        \"cornflowerblue\" => \"6495ED\",\n        \"cornsilk\" => \"FFF8DC\",\n        \"crimson\" => \"DC143C\",\n        \"cyan\" => \"00FFFF\",\n        \"darkblue\" => \"00008B\",\n        \"darkcyan\" => \"008B8B\",\n        \"darkgoldenrod\" => \"B8860B\",\n        \"darkgray\" => \"A9A9A9\",\n        \"darkgreen\" => \"006400\",\n        \"darkgrey\" => \"A9A9A9\",\n        \"darkkhaki\" => \"BDB76B\",\n        \"darkmagenta\" => \"8B008B\",\n        \"darkolivegreen\" => \"556B2F\",\n        \"darkorange\" => \"FF8C00\",\n        \"darkorchid\" => \"9932CC\",\n        \"darkred\" => \"8B0000\",\n        \"darksalmon\" => \"E9967A\",\n        \"darkseagreen\" => \"8FBC8F\",\n        \"darkslateblue\" => \"483D8B\",\n        \"darkslategray\" => \"2F4F4F\",\n        \"darkslategrey\" => \"2F4F4F\",\n        \"darkturquoise\" => \"00CED1\",\n        \"darkviolet\" => \"9400D3\",\n        \"deeppink\" => \"FF1493\",\n        \"deepskyblue\" => \"00BFFF\",\n        \"dimgray\" => \"696969\",\n        \"dimgrey\" => \"696969\",\n        \"dodgerblue\" => \"1E90FF\",\n        \"firebrick\" => \"B22222\",\n        \"floralwhite\" => \"FFFAF0\",\n        \"forestgreen\" => \"228B22\",\n        \"fuchsia\" => \"FF00FF\",\n        \"gainsboro\" => \"DCDCDC\",\n        \"ghostwhite\" => \"F8F8FF\",\n        \"gold\" => \"FFD700\",\n        \"goldenrod\" => \"DAA520\",\n        \"gray\" => \"808080\",\n        \"green\" => \"008000\",\n        \"greenyellow\" => \"ADFF2F\",\n        \"grey\" => \"808080\",\n        \"honeydew\" => \"F0FFF0\",\n        \"hotpink\" => \"FF69B4\",\n        \"indianred\" => \"CD5C5C\",\n        \"indigo\" => \"4B0082\",\n        \"ivory\" => \"FFFFF0\",\n        \"khaki\" => \"F0E68C\",\n        \"lavender\" => \"E6E6FA\",\n        \"lavenderblush\" => \"FFF0F5\",\n        \"lawngreen\" => \"7CFC00\",\n        \"lemonchiffon\" => \"FFFACD\",\n        \"lightblue\" => \"ADD8E6\",\n        \"lightcoral\" => \"F08080\",\n        \"lightcyan\" => \"E0FFFF\",\n        \"lightgoldenrodyellow\" => \"FAFAD2\",\n        \"lightgray\" => \"D3D3D3\",\n        \"lightgreen\" => \"90EE90\",\n        \"lightgrey\" => \"D3D3D3\",\n        \"lightpink\" => \"FFB6C1\",\n        \"lightsalmon\" => \"FFA07A\",\n        \"lightseagreen\" => \"20B2AA\",\n        \"lightskyblue\" => \"87CEFA\",\n        \"lightslategray\" => \"778899\",\n        \"lightslategrey\" => \"778899\",\n        \"lightsteelblue\" => \"B0C4DE\",\n        \"lightyellow\" => \"FFFFE0\",\n        \"lime\" => \"00FF00\",\n        \"limegreen\" => \"32CD32\",\n        \"linen\" => \"FAF0E6\",\n        \"magenta\" => \"FF00FF\",\n        \"maroon\" => \"800000\",\n        \"mediumaquamarine\" => \"66CDAA\",\n        \"mediumblue\" => \"0000CD\",\n        \"mediumorchid\" => \"BA55D3\",\n        \"mediumpurple\" => \"9370DB\",\n        \"mediumseagreen\" => \"3CB371\",\n        \"mediumslateblue\" => \"7B68EE\",\n        \"mediumspringgreen\" => \"00FA9A\",\n        \"mediumturquoise\" => \"48D1CC\",\n        \"mediumvioletred\" => \"C71585\",\n        \"midnightblue\" => \"191970\",\n        \"mintcream\" => \"F5FFFA\",\n        \"mistyrose\" => \"FFE4E1\",\n        \"moccasin\" => \"FFE4B5\",\n        \"navajowhite\" => \"FFDEAD\",\n        \"navy\" => \"000080\",\n        \"oldlace\" => \"FDF5E6\",\n        \"olive\" => \"808000\",\n        \"olivedrab\" => \"6B8E23\",\n        \"orange\" => \"FFA500\",\n        \"orangered\" => \"FF4500\",\n        \"orchid\" => \"DA70D6\",\n        \"palegoldenrod\" => \"EEE8AA\",\n        \"palegreen\" => \"98FB98\",\n        \"paleturquoise\" => \"AFEEEE\",\n        \"palevioletred\" => \"DB7093\",\n        \"papayawhip\" => \"FFEFD5\",\n        \"peachpuff\" => \"FFDAB9\",\n        \"peru\" => \"CD853F\",\n        \"pink\" => \"FFC0CB\",\n        \"plum\" => \"DDA0DD\",\n        \"powderblue\" => \"B0E0E6\",\n        \"purple\" => \"800080\",\n        \"red\" => \"FF0000\",\n        \"rosybrown\" => \"BC8F8F\",\n        \"royalblue\" => \"4169E1\",\n        \"saddlebrown\" => \"8B4513\",\n        \"salmon\" => \"FA8072\",\n        \"sandybrown\" => \"F4A460\",\n        \"seagreen\" => \"2E8B57\",\n        \"seashell\" => \"FFF5EE\",\n        \"sienna\" => \"A0522D\",\n        \"silver\" => \"C0C0C0\",\n        \"skyblue\" => \"87CEEB\",\n        \"slateblue\" => \"6A5ACD\",\n        \"slategray\" => \"708090\",\n        \"slategrey\" => \"708090\",\n        \"snow\" => \"FFFAFA\",\n        \"springgreen\" => \"00FF7F\",\n        \"steelblue\" => \"4682B4\",\n        \"tan\" => \"D2B48C\",\n        \"teal\" => \"008080\",\n        \"thistle\" => \"D8BFD8\",\n        \"tomato\" => \"FF6347\",\n        \"turquoise\" => \"40E0D0\",\n        \"violet\" => \"EE82EE\",\n        \"wheat\" => \"F5DEB3\",\n        \"white\" => \"FFFFFF\",\n        \"whitesmoke\" => \"F5F5F5\",\n        \"yellow\" => \"FFFF00\",\n        \"yellowgreen\" => \"9ACD32\",\n    ];\n\n    /**\n     * @param $color\n     * @return array|mixed|null|string\n     */\n    static function parse($color)\n    {\n        if ($color === null) {\n            return null;\n        }\n\n        if (is_array($color)) {\n            // Assume the array has the right format...\n            // FIXME: should/could verify this.\n            return $color;\n        }\n\n        static $cache = [];\n\n        $color = strtolower($color);\n        $alpha = 1.0;\n\n        if (isset($cache[$color])) {\n            return $cache[$color];\n        }\n\n        if (in_array($color, [\"transparent\", \"inherit\"])) {\n            return $cache[$color] = $color;\n        }\n\n        if (isset(self::$cssColorNames[$color])) {\n            return $cache[$color] = self::getArray(self::$cssColorNames[$color]);\n        }\n\n        $length = mb_strlen($color);\n\n        // #rgb format\n        if ($length == 4 && $color[0] === \"#\") {\n            return $cache[$color] = self::getArray($color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3]);\n        } // #rgba format\n        else if ($length == 5 && $color[0] === \"#\") {\n            if (ctype_xdigit($color[4])) {\n                $alpha = round(hexdec($color[4] . $color[4])/255, 2);\n            }\n            return $cache[$color] = self::getArray($color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3], $alpha);\n        } // #rrggbb format\n        else if ($length == 7 && $color[0] === \"#\") {\n            return $cache[$color] = self::getArray(mb_substr($color, 1, 6));\n        } // #rrggbbaa format\n        else if ($length == 9 && $color[0] === \"#\") {\n            if (ctype_xdigit(mb_substr($color, 7, 2))) {\n                $alpha = round(hexdec(mb_substr($color, 7, 2))/255, 2);\n            }\n            return $cache[$color] = self::getArray(mb_substr($color, 1, 6), $alpha);\n        } // rgb( r,g,b ) / rgba( r,g,b,α ) format\n        else if (mb_strpos($color, \"rgb\") !== false) {\n            $i = mb_strpos($color, \"(\");\n            $j = mb_strpos($color, \")\");\n\n            // Bad color value\n            if ($i === false || $j === false) {\n                return null;\n            }\n\n            $triplet = explode(\",\", mb_substr($color, $i + 1, $j - $i - 1));\n\n            // alpha transparency\n            // FIXME: not currently using transparency\n            if (count($triplet) == 4) {\n                $alpha = (trim(array_pop($triplet)));\n                if (Helpers::is_percent($alpha)) {\n                    $alpha = round((float)$alpha / 100, 2);\n                }\n                $alpha = (float)$alpha;\n                // bad value, set to fully opaque\n                if ($alpha > 1.0 || $alpha < 0.0) {\n                    $alpha = 1.0;\n                }\n            }\n\n            if (count($triplet) != 3) {\n                return null;\n            }\n\n            foreach (array_keys($triplet) as $c) {\n                $triplet[$c] = trim($triplet[$c]);\n\n                if (Helpers::is_percent($triplet[$c])) {\n                    $triplet[$c] = round((float)$triplet[$c] * 2.55);\n                }\n            }\n\n            return $cache[$color] = self::getArray(vsprintf(\"%02X%02X%02X\", $triplet), $alpha);\n\n        }\n\n        // cmyk( c,m,y,k ) format\n        // http://www.w3.org/TR/css3-gcpm/#cmyk-colors\n        else if (mb_strpos($color, \"cmyk\") !== false) {\n            $i = mb_strpos($color, \"(\");\n            $j = mb_strpos($color, \")\");\n\n            // Bad color value\n            if ($i === false || $j === false) {\n                return null;\n            }\n\n            $values = explode(\",\", mb_substr($color, $i + 1, $j - $i - 1));\n\n            if (count($values) != 4) {\n                return null;\n            }\n\n            $values = array_map(function($c) {\n                return min(1.0, max(0.0, floatval(trim($c))));\n            }, $values);\n\n            return $cache[$color] = self::getArray($values);\n        }\n\n        return self::getArray($color);\n    }\n\n    /**\n     * @param $color\n     * @param float $alpha\n     * @return array\n     */\n    static function getArray($color, $alpha = 1.0)\n    {\n        $c = [null, null, null, null, \"alpha\" => $alpha, \"hex\" => null];\n\n        if (is_array($color)) {\n            $c = $color;\n            $c[\"c\"] = $c[0];\n            $c[\"m\"] = $c[1];\n            $c[\"y\"] = $c[2];\n            $c[\"k\"] = $c[3];\n            $c[\"alpha\"] = $alpha;\n            $c[\"hex\"] = \"cmyk($c[0],$c[1],$c[2],$c[3])\";\n        } else {\n            if (ctype_xdigit($color) === false || mb_strlen($color) !== 6) {\n                // invalid color value ... expected 6-character hex\n                return $c;\n            }\n            $c[0] = hexdec(mb_substr($color, 0, 2)) / 0xff;\n            $c[1] = hexdec(mb_substr($color, 2, 2)) / 0xff;\n            $c[2] = hexdec(mb_substr($color, 4, 2)) / 0xff;\n            $c[\"r\"] = $c[0];\n            $c[\"g\"] = $c[1];\n            $c[\"b\"] = $c[2];\n            $c[\"alpha\"] = $alpha;\n            $c[\"hex\"] = sprintf(\"#%s%02X\", $color, round($alpha * 255));\n        }\n\n        return $c;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Css/Style.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Css;\n\nuse Dompdf\\Adapter\\CPDF;\nuse Dompdf\\Exception;\nuse Dompdf\\FontMetrics;\nuse Dompdf\\Frame;\n\n/**\n * Represents CSS properties.\n *\n * The Style class is responsible for handling and storing CSS properties.\n * It includes methods to resolve colors and lengths, as well as getters &\n * setters for many CSS properties.\n *\n * Actual CSS parsing is performed in the {@link Stylesheet} class.\n *\n * @package dompdf\n */\nclass Style\n{\n\n    const CSS_IDENTIFIER = \"-?[_a-zA-Z]+[_a-zA-Z0-9-]*\";\n    const CSS_INTEGER = \"-?\\d+\";\n\n    /**\n     * Default font size, in points.\n     *\n     * @var float\n     */\n    static $default_font_size = 12;\n\n    /**\n     * Default line height, as a fraction of the font size.\n     *\n     * @var float\n     */\n    static $default_line_height = 1.2;\n\n    /**\n     * Default \"absolute\" font sizes relative to the default font-size\n     * http://www.w3.org/TR/css3-fonts/#font-size-the-font-size-property\n     * @var array<float>\n     */\n    static $font_size_keywords = [\n        \"xx-small\" => 0.6, // 3/5\n        \"x-small\" => 0.75, // 3/4\n        \"small\" => 0.889, // 8/9\n        \"medium\" => 1, // 1\n        \"large\" => 1.2, // 6/5\n        \"x-large\" => 1.5, // 3/2\n        \"xx-large\" => 2.0, // 2/1\n    ];\n\n    /**\n     * List of valid text-align keywords.  Should also really be a constant.\n     *\n     * @var array\n     */\n    static $text_align_keywords = [\"left\", \"right\", \"center\", \"justify\"];\n\n    /**\n     * List of valid vertical-align keywords.  Should also really be a constant.\n     *\n     * @var array\n     */\n    static $vertical_align_keywords = [\"baseline\", \"bottom\", \"middle\", \"sub\",\n        \"super\", \"text-bottom\", \"text-top\", \"top\"];\n\n    /**\n     * List of all block-level (outer) display types.\n     * * https://www.w3.org/TR/css-display-3/#display-type\n     * * https://www.w3.org/TR/css-display-3/#block-level\n     */\n    public const BLOCK_LEVEL_TYPES = [\n        \"block\",\n        // \"flow-root\",\n        \"list-item\",\n        \"flex\",\n        // \"grid\",\n        \"table\"\n    ];\n\n    /**\n     * List of all inline-level (outer) display types.\n     * * https://www.w3.org/TR/css-display-3/#display-type\n     * * https://www.w3.org/TR/css-display-3/#inline-level\n     */\n    public const INLINE_LEVEL_TYPES = [\n        \"inline\",\n        \"inline-block\",\n        \"inline-flex\",\n        // \"inline-grid\",\n        \"inline-table\"\n    ];\n\n    /**\n     * List of all inline (inner) display types.  Should really be a constant.\n     *\n     * @var array\n     */\n    static $INLINE_TYPES = [\"inline\"];\n\n    /**\n     * List of all block (inner) display types.  Should really be a constant.\n     *\n     * @var array\n     */\n    static $BLOCK_TYPES = [\"block\", \"inline-block\", \"table-cell\", \"list-item\"];\n\n    /**\n     * List of all table (inner) display types.  Should really be a constant.\n     *\n     * @var array\n     */\n    static $TABLE_TYPES = [\"table\", \"inline-table\"];\n\n    /**\n     * List of all positioned types.  Should really be a constant.\n     *\n     * @var array\n     */\n    static $POSITIONNED_TYPES = [\"relative\", \"absolute\", \"fixed\"];\n\n    /**\n     * List of valid border styles.  Should also really be a constant.\n     *\n     * @var array\n     */\n    static $BORDER_STYLES = [\"none\", \"hidden\", \"dotted\", \"dashed\", \"solid\",\n        \"double\", \"groove\", \"ridge\", \"inset\", \"outset\"];\n\n    /**\n     * List of CSS shorthand properties\n     *\n     * @var array\n     */\n    protected static $_props_shorthand = [\"background\", \"border\",\n        \"border_bottom\", \"border_color\", \"border_left\", \"border_radius\",\n        \"border_right\", \"border_style\", \"border_top\", \"border_width\",\n        \"flex\", \"font\", \"list_style\", \"margin\", \"padding\"];\n\n    /**\n     * Default style values.\n     *\n     * @link http://www.w3.org/TR/CSS21/propidx.html\n     *\n     * @var array\n     */\n    protected static $_defaults = null;\n\n    /**\n     * List of inherited properties\n     *\n     * @link http://www.w3.org/TR/CSS21/propidx.html\n     *\n     * @var array\n     */\n    protected static $_inherited = null;\n\n    /**\n     * Caches method_exists result\n     *\n     * @var array<bool>\n     */\n    protected static $_methods_cache = [];\n\n    /**\n     * The stylesheet this style belongs to\n     *\n     * @see Stylesheet\n     * @var Stylesheet\n     */\n    protected $_stylesheet; // stylesheet this style is attached to\n\n    /**\n     * Media queries attached to the style\n     *\n     * @var int\n     */\n    protected $_media_queries;\n\n    /**\n     * Main array of all CSS properties & values\n     *\n     * @var array\n     */\n    protected $_props = [];\n\n    /* var instead of protected would allow access outside of class */\n    protected $_important_props = [];\n\n    /**\n     * The computed values of the CSS property\n     *\n     * @var array\n     */\n    protected $_props_computed = [];\n\n    protected static $_dependency_map = [\n        \"border_top_style\" => [\n            \"border_top_width\"\n        ],\n        \"border_bottom_style\" => [\n            \"border_bottom_width\"\n        ],\n        \"border_left_style\" => [\n            \"border_left_width\"\n        ],\n        \"border_right_style\" => [\n            \"border_right_width\"\n        ],\n        \"direction\" => [\n            \"text_align\"\n        ],\n        \"font_size\" => [\n            \"background_position\",\n            \"background_size\",\n            \"border_top_width\",\n            \"border_right_width\",\n            \"border_bottom_width\",\n            \"border_left_width\",\n            \"line_height\",\n            \"margin_top\",\n            \"margin_right\",\n            \"margin_bottom\",\n            \"margin_left\",\n            \"outline_width\",\n            \"outline_offset\",\n            \"padding_top\",\n            \"padding_right\",\n            \"padding_bottom\",\n            \"padding_left\"\n        ],\n        \"outline_style\" => [\n            \"outline_width\"\n        ]\n    ];\n\n    /**\n     * The used values of the CSS property\n     *\n     * @var array\n     */\n    protected $_prop_cache = [];\n\n    /**\n     * Font size of parent element in document tree.  Used for relative font\n     * size resolution.\n     *\n     * @var float\n     */\n    protected $_parent_font_size;\n\n    /**\n     * @var Frame\n     */\n    protected $_frame;\n\n    /**\n     * The origin of the style\n     *\n     * @var int\n     */\n    protected $_origin = Stylesheet::ORIG_AUTHOR;\n\n    // private members\n    /**\n     * The computed bottom spacing\n     */\n    private $_computed_bottom_spacing = null;\n\n    /**\n     * @var bool\n     */\n    private $has_border_radius_cache = null;\n\n    /**\n     * @var array\n     */\n    private $resolved_border_radius = null;\n\n    /**\n     * @deprecated\n     * @var bool\n     */\n    public $_has_border_radius = false;\n\n    /**\n     * @var FontMetrics\n     */\n    private $fontMetrics;\n\n    /**\n     * Class constructor\n     *\n     * @param Stylesheet $stylesheet the stylesheet this Style is associated with.\n     * @param int $origin\n     */\n    public function __construct(Stylesheet $stylesheet, $origin = Stylesheet::ORIG_AUTHOR)\n    {\n        $this->setFontMetrics($stylesheet->getFontMetrics());\n\n        $this->_props = [];\n        $this->_important_props = [];\n        $this->_stylesheet = $stylesheet;\n        $this->_media_queries = [];\n        $this->_origin = $origin;\n        $this->_parent_font_size = null;\n\n        if (!isset(self::$_defaults)) {\n\n            // Shorthand\n            $d =& self::$_defaults;\n\n            // All CSS 2.1 properties, and their default values\n            $d[\"azimuth\"] = \"center\";\n            $d[\"background_attachment\"] = \"scroll\";\n            $d[\"background_color\"] = \"transparent\";\n            $d[\"background_image\"] = \"none\";\n            $d[\"background_image_resolution\"] = \"normal\";\n            $d[\"background_position\"] = \"0% 0%\";\n            $d[\"background_repeat\"] = \"repeat\";\n            $d[\"background\"] = \"\";\n            $d[\"border_collapse\"] = \"separate\";\n            $d[\"border_color\"] = \"\";\n            $d[\"border_spacing\"] = \"0\";\n            $d[\"border_style\"] = \"\";\n            $d[\"border_top\"] = \"\";\n            $d[\"border_right\"] = \"\";\n            $d[\"border_bottom\"] = \"\";\n            $d[\"border_left\"] = \"\";\n            $d[\"border_top_color\"] = \"\";\n            $d[\"border_right_color\"] = \"\";\n            $d[\"border_bottom_color\"] = \"\";\n            $d[\"border_left_color\"] = \"\";\n            $d[\"border_top_style\"] = \"none\";\n            $d[\"border_right_style\"] = \"none\";\n            $d[\"border_bottom_style\"] = \"none\";\n            $d[\"border_left_style\"] = \"none\";\n            $d[\"border_top_width\"] = \"medium\";\n            $d[\"border_right_width\"] = \"medium\";\n            $d[\"border_bottom_width\"] = \"medium\";\n            $d[\"border_left_width\"] = \"medium\";\n            $d[\"border_width\"] = \"medium\";\n            $d[\"border_bottom_left_radius\"] = \"\";\n            $d[\"border_bottom_right_radius\"] = \"\";\n            $d[\"border_top_left_radius\"] = \"\";\n            $d[\"border_top_right_radius\"] = \"\";\n            $d[\"border_radius\"] = \"\";\n            $d[\"border\"] = \"\";\n            $d[\"bottom\"] = \"auto\";\n            $d[\"caption_side\"] = \"top\";\n            $d[\"clear\"] = \"none\";\n            $d[\"clip\"] = \"auto\";\n            $d[\"color\"] = \"#000000\";\n            $d[\"content\"] = \"normal\";\n            $d[\"counter_increment\"] = \"none\";\n            $d[\"counter_reset\"] = \"none\";\n            $d[\"cue_after\"] = \"none\";\n            $d[\"cue_before\"] = \"none\";\n            $d[\"cue\"] = \"\";\n            $d[\"cursor\"] = \"auto\";\n            $d[\"direction\"] = \"ltr\";\n            $d[\"display\"] = \"inline\";\n            $d[\"elevation\"] = \"level\";\n            $d[\"empty_cells\"] = \"show\";\n            $d[\"float\"] = \"none\";\n            $d[\"font_family\"] = $stylesheet->get_dompdf()->getOptions()->getDefaultFont();\n            $d[\"font_size\"] = \"medium\";\n            $d[\"font_style\"] = \"normal\";\n            $d[\"font_variant\"] = \"normal\";\n            $d[\"font_weight\"] = \"normal\";\n            $d[\"font\"] = \"\";\n            $d[\"height\"] = \"auto\";\n            $d[\"image_resolution\"] = \"normal\";\n            $d[\"left\"] = \"auto\";\n            $d[\"letter_spacing\"] = \"normal\";\n            $d[\"line_height\"] = \"normal\";\n            $d[\"list_style_image\"] = \"none\";\n            $d[\"list_style_position\"] = \"outside\";\n            $d[\"list_style_type\"] = \"disc\";\n            $d[\"list_style\"] = \"\";\n            $d[\"margin_right\"] = \"0\";\n            $d[\"margin_left\"] = \"0\";\n            $d[\"margin_top\"] = \"0\";\n            $d[\"margin_bottom\"] = \"0\";\n            $d[\"margin\"] = \"\";\n            $d[\"max_height\"] = \"none\";\n            $d[\"max_width\"] = \"none\";\n            $d[\"min_height\"] = \"0\";\n            $d[\"min_width\"] = \"0\";\n            $d[\"orphans\"] = \"2\";\n            $d[\"outline_color\"] = \"\"; // \"invert\" special color is not supported\n            $d[\"outline_style\"] = \"none\";\n            $d[\"outline_width\"] = \"medium\";\n            $d[\"outline_offset\"] = \"0\";\n            $d[\"outline\"] = \"\";\n            $d[\"overflow\"] = \"visible\";\n            $d[\"overflow_wrap\"] = \"normal\";\n            $d[\"padding_top\"] = \"0\";\n            $d[\"padding_right\"] = \"0\";\n            $d[\"padding_bottom\"] = \"0\";\n            $d[\"padding_left\"] = \"0\";\n            $d[\"padding\"] = \"\";\n            $d[\"page_break_after\"] = \"auto\";\n            $d[\"page_break_before\"] = \"auto\";\n            $d[\"page_break_inside\"] = \"auto\";\n            $d[\"pause_after\"] = \"0\";\n            $d[\"pause_before\"] = \"0\";\n            $d[\"pause\"] = \"\";\n            $d[\"pitch_range\"] = \"50\";\n            $d[\"pitch\"] = \"medium\";\n            $d[\"play_during\"] = \"auto\";\n            $d[\"position\"] = \"static\";\n            $d[\"quotes\"] = \"\";\n            $d[\"richness\"] = \"50\";\n            $d[\"right\"] = \"auto\";\n            $d[\"size\"] = \"auto\"; // @page\n            $d[\"speak_header\"] = \"once\";\n            $d[\"speak_numeral\"] = \"continuous\";\n            $d[\"speak_punctuation\"] = \"none\";\n            $d[\"speak\"] = \"normal\";\n            $d[\"speech_rate\"] = \"medium\";\n            $d[\"stress\"] = \"50\";\n            $d[\"table_layout\"] = \"auto\";\n            $d[\"text_align\"] = \"\";\n            $d[\"text_decoration\"] = \"none\";\n            $d[\"text_indent\"] = \"0\";\n            $d[\"text_transform\"] = \"none\";\n            $d[\"top\"] = \"auto\";\n            $d[\"unicode_bidi\"] = \"normal\";\n            $d[\"vertical_align\"] = \"baseline\";\n            $d[\"visibility\"] = \"visible\";\n            $d[\"voice_family\"] = \"\";\n            $d[\"volume\"] = \"medium\";\n            $d[\"white_space\"] = \"normal\";\n            $d[\"widows\"] = \"2\";\n            $d[\"width\"] = \"auto\";\n            $d[\"word_spacing\"] = \"normal\";\n            $d[\"z_index\"] = \"auto\";\n\n            // CSS3\n            $d[\"opacity\"] = \"1.0\";\n            $d[\"background_size\"] = \"auto auto\";\n            $d[\"transform\"] = \"none\";\n            $d[\"transform_origin\"] = \"50% 50%\";\n\n            // for @font-face\n            $d[\"src\"] = \"\";\n            $d[\"unicode_range\"] = \"\";\n\n            // vendor-prefixed properties\n            $d[\"_dompdf_background_image_resolution\"] = &$d[\"background_image_resolution\"];\n            $d[\"_dompdf_image_resolution\"] = &$d[\"image_resolution\"];\n            $d[\"_dompdf_keep\"] = \"\";\n            $d[\"_webkit_transform\"] = &$d[\"transform\"];\n            $d[\"_webkit_transform_origin\"] = &$d[\"transform_origin\"];\n\n            // Properties that inherit by default\n            self::$_inherited = [\n                \"azimuth\",\n                \"background_image_resolution\",\n                \"border_collapse\",\n                \"border_spacing\",\n                \"caption_side\",\n                \"color\",\n                \"cursor\",\n                \"direction\",\n                \"elevation\",\n                \"empty_cells\",\n                \"font_family\",\n                \"font_size\",\n                \"font_style\",\n                \"font_variant\",\n                \"font_weight\",\n                \"font\",\n                \"image_resolution\",\n                \"letter_spacing\",\n                \"line_height\",\n                \"list_style_image\",\n                \"list_style_position\",\n                \"list_style_type\",\n                \"list_style\",\n                \"orphans\",\n                \"overflow_wrap\",\n                \"pitch_range\",\n                \"pitch\",\n                \"quotes\",\n                \"richness\",\n                \"speak_header\",\n                \"speak_numeral\",\n                \"speak_punctuation\",\n                \"speak\",\n                \"speech_rate\",\n                \"stress\",\n                \"text_align\",\n                \"text_indent\",\n                \"text_transform\",\n                \"visibility\",\n                \"voice_family\",\n                \"volume\",\n                \"white_space\",\n                \"widows\",\n                \"word_spacing\",\n            ];\n        }\n    }\n\n    /**\n     * \"Destructor\": forcibly free all references held by this object\n     */\n    function dispose()\n    {\n    }\n\n    /**\n     * @param $media_queries\n     */\n    function set_media_queries($media_queries)\n    {\n        $this->_media_queries = $media_queries;\n    }\n\n    /**\n     * @return array|int\n     */\n    function get_media_queries()\n    {\n        return $this->_media_queries;\n    }\n\n    /**\n     * @param Frame $frame\n     */\n    function set_frame(Frame $frame)\n    {\n        $this->_frame = $frame;\n    }\n\n    /**\n     * @return Frame\n     */\n    function get_frame()\n    {\n        return $this->_frame;\n    }\n\n    /**\n     * @param $origin\n     */\n    function set_origin($origin)\n    {\n        $this->_origin = $origin;\n    }\n\n    /**\n     * @return int\n     */\n    function get_origin()\n    {\n        return $this->_origin;\n    }\n\n    /**\n     * returns the {@link Stylesheet} this Style is associated with.\n     *\n     * @return Stylesheet\n     */\n    function get_stylesheet()\n    {\n        return $this->_stylesheet;\n    }\n\n    /**\n     * Converts any CSS length value into an absolute length in points.\n     *\n     * length_in_pt() takes a single length (e.g. '1em') or an array of\n     * lengths and returns an absolute length.  If an array is passed, then\n     * the return value is the sum of all elements. If any of the lengths\n     * provided are \"auto\" or \"none\" then that value is returned.\n     *\n     * If a reference size is not provided, the default font size is used\n     * ({@link Style::$default_font_size}).\n     *\n     * @param float|string|array $length the numeric length (or string measurement) or array of lengths to resolve\n     * @param float $ref_size an absolute reference size to resolve percentage lengths\n     * @return float|string\n     */\n    function length_in_pt($length, $ref_size = null)\n    {\n        static $cache = [];\n\n        if (!isset($ref_size)) {\n            $ref_size = $this->__get(\"font_size\");\n        }\n\n        if (!is_array($length)) {\n            $key = $length . \"/$ref_size\";\n            //Early check on cache, before converting $length to array\n            if (isset($cache[$key])) {\n                return $cache[$key];\n            }\n            $length = [$length];\n        } else {\n            $key = implode(\"@\", $length) . \"/$ref_size\";\n            if (isset($cache[$key])) {\n                return $cache[$key];\n            }\n        }\n\n        $ret = 0;\n        foreach ($length as $l) {\n\n            if ($l === \"auto\") {\n                return \"auto\";\n            }\n\n            if ($l === \"none\") {\n                return \"none\";\n            }\n\n            // Assume numeric values are already in points\n            if (is_numeric($l)) {\n                $ret += $l;\n                continue;\n            }\n\n            if ($l === \"normal\") {\n                $ret += (float)$ref_size;\n                continue;\n            }\n\n            // Border lengths\n            if ($l === \"thin\") {\n                $ret += 0.5;\n                continue;\n            }\n\n            if ($l === \"medium\") {\n                $ret += 1.5;\n                continue;\n            }\n\n            if ($l === \"thick\") {\n                $ret += 2.5;\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"px\")) !== false) {\n                $dpi = $this->_stylesheet->get_dompdf()->getOptions()->getDpi();\n                $ret += ((float)mb_substr($l, 0, $i) * 72) / $dpi;\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"pt\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i);\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"%\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) / 100 * (float)$ref_size;\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"rem\")) !== false) {\n                if ($this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style() === null) {\n                    // Interpreting it as \"em\", see https://github.com/dompdf/dompdf/issues/1406\n                    $ret += (float)mb_substr($l, 0, $i) * $this->__get(\"font_size\");\n                } else {\n                    $ret += (float)mb_substr($l, 0, $i) * $this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style()->font_size;\n                }\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"em\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) * $this->__get(\"font_size\");\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"cm\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) * 72 / 2.54;\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"mm\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) * 72 / 25.4;\n                continue;\n            }\n\n            // FIXME: em:ex ratio?\n            if (($i = mb_stripos($l, \"ex\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) * $this->__get(\"font_size\") / 2;\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"in\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) * 72;\n                continue;\n            }\n\n            if (($i = mb_stripos($l, \"pc\")) !== false) {\n                $ret += (float)mb_substr($l, 0, $i) * 12;\n                continue;\n            }\n\n            // Bogus value\n            $ret += (float)$ref_size;\n        }\n\n        return $cache[$key] = $ret;\n    }\n\n\n    /**\n     * Set inherited properties in this style using values in $parent\n     *\n     * @param Style $parent\n     *\n     * @return Style\n     */\n    function inherit(Style $parent)\n    {\n        // Set parent font size, changes affect font size of the element\n        if ($this->_parent_font_size !== $parent->font_size) {\n            $this->_parent_font_size = $parent->font_size;\n            if (isset($this->_props[\"font_size\"])) {\n                $this->__set(\"font_size\", $this->_props[\"font_size\"]);\n            }\n        }\n\n        foreach (self::$_inherited as $prop) {\n            // don't inherit shorthand properties, the specific properties will inherit\n            if (in_array($prop, self::$_props_shorthand) === true) {\n                continue;\n            }\n\n            //inherit the !important property also.\n            //if local property is also !important, don't inherit.\n\n            if (isset($parent->_props_computed[$prop]) &&\n                (\n                    !isset($this->_props[$prop])\n                    || (isset($parent->_important_props[$prop]) && !isset($this->_important_props[$prop]))\n                )\n            ) {\n                if (isset($parent->_important_props[$prop])) {\n                    $this->_important_props[$prop] = true;\n                }\n                if (isset($parent->_props_computed[$prop])) {\n                    $this->__set($prop, $parent->_props_computed[$prop]);\n                } else {\n                    // parent prop not set, use the default\n                    $this->__set($prop, self::$_defaults[$prop]);\n                }\n            }\n        }\n\n        foreach ($this->_props as $prop => $value) {\n            // don't inherit shorthand properties, the specific properties will inherit\n            if (in_array($prop, self::$_props_shorthand) === true) {\n                continue;\n            }\n            if ($value === \"inherit\") {\n                if (isset($parent->_important_props[$prop])) {\n                    $this->_important_props[$prop] = true;\n                }\n                //do not assign direct, but\n                //implicite assignment through __set, redirect to specialized, get value with __get\n                //This is for computing defaults if the parent setting is also missing.\n                //Therefore do not directly assign the value without __set\n                //set _important_props before that to be able to propagate.\n                //see __set and __get, on all assignments clear cache!\n                //$this->_prop_cache[$prop] = null;\n                //$this->_props[$prop] = $parent->_props[$prop];\n                //props_set for more obvious explicite assignment not implemented, because\n                //too many implicite uses.\n                // $this->props_set($prop, $parent->$prop);\n                if (isset($parent->_props_computed[$prop])) {\n                    $this->__set($prop, $parent->_props_computed[$prop]);\n                } else {\n                    // parent prop not set, use the default\n                    $this->__set($prop, self::$_defaults[$prop]);\n                }\n                // set the specified prop back to \"inherit\"\n                $this->_props[$prop] = \"inherit\";\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Override properties in this style with those in $style\n     *\n     * @param Style $style\n     */\n    function merge(Style $style)\n    {\n        //treat the !important attribute\n        //if old rule has !important attribute, override with new rule only if\n        //the new rule is also !important\n        foreach ($style->_props as $prop => $val) {\n            $can_merge = false;\n            if (isset($style->_important_props[$prop])) {\n                $this->_important_props[$prop] = true;\n                $can_merge = true;\n            } else if (isset($val) && !isset($this->_important_props[$prop])) {\n                $can_merge = true;\n            }\n\n            if ($can_merge) {\n                // Clear out \"inherit\" shorthand properties if a more specific property value has been set\n                $shorthands = array_filter(self::$_props_shorthand, function ($el) use ($prop) {\n                    return (strpos($prop, $el . \"_\") !== false);\n                });\n                foreach ($shorthands as $shorthand) {\n                    if (array_key_exists($shorthand, $this->_props) && $this->_props[$shorthand] === \"inherit\") {\n                        unset($this->_props[$shorthand]);\n                        unset($this->_props_computed[$shorthand]);\n                        unset($this->_prop_cache[$shorthand]);\n                    }\n                }\n                //FIXME: temporary hack around lack of persistence of base href for URLs\n                if (($prop === \"background_image\" || $prop === \"list_style_image\") && isset($style->_props_computed[$prop])) {\n                    $this->__set($prop, $style->_props_computed[$prop]);\n                } else {\n                    // computed value not set, recompute use the specified value\n                    $this->__set($prop, $val);\n                }\n            }\n        }\n    }\n\n    /**\n     * Returns an array(r, g, b, \"r\"=> r, \"g\"=>g, \"b\"=>b, \"hex\"=>\"#rrggbb\")\n     * based on the provided CSS color value.\n     *\n     * @param string $color\n     * @return array\n     */\n    function munge_color($color)\n    {\n        return Color::parse($color);\n    }\n\n    /* direct access to _important_props array from outside would work only when declared as\n     * 'var $_important_props;' instead of 'protected $_important_props;'\n     * Don't call _set/__get on missing attribute. Therefore need a special access.\n     * Assume that __set will be also called when this is called, so do not check validity again.\n     * Only created, if !important exists -> always set true.\n     */\n    function important_set($prop)\n    {\n        $prop = str_replace(\"-\", \"_\", $prop);\n        $this->_important_props[$prop] = true;\n    }\n\n    /**\n     * @param $prop\n     * @return bool\n     */\n    function important_get($prop)\n    {\n        return isset($this->_important_props[$prop]);\n    }\n\n    /**\n     * PHP5 overloaded setter\n     *\n     * This function along with {@link Style::__get()} permit a user of the\n     * Style class to access any (CSS) property using the following syntax:\n     * <code>\n     *  Style->margin_top = \"1em\";\n     *  echo (Style->margin_top);\n     * </code>\n     *\n     * __set() automatically calls the provided set function, if one exists,\n     * otherwise it sets the property directly.  Typically, __set() is not\n     * called directly from outside of this class.\n     *\n     * On each modification clear cache to return accurate setting.\n     * Also affects direct settings not using __set\n     * For easier finding all assignments, attempted to allowing only explicite assignment:\n     * Very many uses, e.g. AbstractFrameReflower.php -> for now leave as it is\n     * function __set($prop, $val) {\n     *   throw new Exception(\"Implicit replacement of assignment by __set.  Not good.\");\n     * }\n     * function props_set($prop, $val) { ... }\n     *\n     * @param string $prop the property to set\n     * @param mixed $val the value of the property\n     *\n     */\n    function __set($prop, $val)\n    {\n        $prop = str_replace(\"-\", \"_\", $prop);\n\n        // Legacy property aliases\n        if ($prop === \"word_wrap\") {\n            $prop = \"overflow_wrap\";\n        }\n\n        if (!isset(self::$_defaults[$prop])) {\n            global $_dompdf_warnings;\n            $_dompdf_warnings[] = \"'$prop' is not a recognized CSS property.\";\n            return;\n        }\n\n        if ($prop !== \"content\" && is_string($val) && strlen($val) > 5 && mb_strpos($val, \"url\") === false) {\n            $val = mb_strtolower(trim(str_replace([\"\\n\", \"\\t\"], [\" \"], $val)));\n            $val = preg_replace(\"/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S\", \"\\\\1\\\\2\", $val);\n        }\n\n        $this->_props[$prop] = $val;\n        $this->_props_computed[$prop] = null;\n        $this->_prop_cache[$prop] = null;\n\n        $method = \"set_$prop\";\n\n        if (!isset(self::$_methods_cache[$method])) {\n            self::$_methods_cache[$method] = method_exists($this, $method);\n        }\n\n        if (self::$_methods_cache[$method]) {\n            $this->$method($val);\n        }\n        if (isset($this->_props_computed[$prop]) === false && isset($val) && $val !== '' && $val !== 'inherit') {\n            $this->_props_computed[$prop] = $val;\n        }\n\n        if (isset($this->_props_computed[$prop])) {\n            //FIXME: need to catch for circular dependencies because oops\n            if (array_key_exists($prop, self::$_dependency_map)) {\n                foreach (self::$_dependency_map[$prop] as $dependent) {\n                    if (isset($this->_props[$dependent]) === true) {\n                        $this->__set($dependent, $this->_props[$dependent]);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * PHP5 overloaded getter\n     * Along with {@link Style::__set()} __get() provides access to all CSS\n     * properties directly.  Typically __get() is not called directly outside\n     * of this class.\n     * On each modification clear cache to return accurate setting.\n     * Also affects direct settings not using __set\n     *\n     * @param string $prop\n     *\n     * @return mixed\n     * @throws Exception\n     */\n    function __get($prop)\n    {\n        // Legacy property aliases\n        if ($prop === \"word_wrap\") {\n            $prop = \"overflow_wrap\";\n        }\n\n        //FIXME: need to get shorthand from component properties\n        if (!isset(self::$_defaults[$prop])) {\n            throw new Exception(\"'$prop' is not a recognized CSS property.\");\n        }\n\n        if (isset($this->_prop_cache[$prop])) {\n            return $this->_prop_cache[$prop];\n        }\n\n        $method = \"get_$prop\";\n\n        $retval = null;\n\n        // Preview the value based on the default if the property is not cached\n        // and the computed value has not yet been set.\n        $reset_value = false;\n        $specified_value = null;\n        $computed_value = null;\n        if (!isset($this->_prop_cache[$prop]) && !isset($this->_props_computed[$prop])) {\n            $reset_value = true;\n            if (isset($this->_props[$prop])) {\n                $specified_value = $this->_props[$prop];\n            }\n            if (isset($this->_props_computed[$prop])) {\n                $computed_value = $this->_props_computed[$prop];\n            }\n            if (empty($this->_props[$prop]) || $this->_props[$prop] === \"inherit\") {\n                $this->__set($prop, self::$_defaults[$prop]);\n            }\n            if (empty($this->_props_computed[$prop])) {\n                // computed value should be set if the property is set, we'll recalculate it\n                $this->__set($prop, $this->_props[$prop]);\n            }\n        }\n\n        if (!isset(self::$_methods_cache[$method])) {\n            self::$_methods_cache[$method] = method_exists($this, $method);\n        }\n\n        if (self::$_methods_cache[$method]) {\n            $retval = $this->_prop_cache[$prop] = $this->$method();\n        }\n\n        if (!isset($retval)) {\n            $retval = $this->_prop_cache[$prop] = $this->_props_computed[$prop];\n        }\n\n        // When previewing the value reset the specified and computed properties\n        // so that we don't interfere with inheritance.\n        if ($reset_value) {\n            $this->_props[$prop] = $specified_value;\n            $this->_props_computed[$prop] = $computed_value;\n        }\n\n        return $retval;\n    }\n\n    /**\n     * Sets the property value without calculating the computed value\n     *\n     * @param $prop\n     * @param $val\n     */\n    function set_prop($prop, $val)\n    {\n        $prop = str_replace(\"-\", \"_\", $prop);\n\n        // Legacy property aliases\n        if ($prop === \"word_wrap\") {\n            $prop = \"overflow_wrap\";\n        }\n\n        if (!isset(self::$_defaults[$prop])) {\n            global $_dompdf_warnings;\n            $_dompdf_warnings[] = \"'$prop' is not a recognized CSS property.\";\n            return;\n        }\n\n        if ($prop !== \"content\" && is_string($val) && strlen($val) > 5 && mb_strpos($val, \"url\") === false) {\n            $val = mb_strtolower(trim(str_replace([\"\\n\", \"\\t\"], [\" \"], $val)));\n            $val = preg_replace(\"/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S\", \"\\\\1\\\\2\", $val);\n        }\n\n        $this->_props[$prop] = $val;\n        $this->_props_computed[$prop] = null;\n        $this->_prop_cache[$prop] = null;\n\n        //FIXME: this doesn't work for shorthand properties\n    }\n\n    /**\n     * Similar to __get() without storing the result. Useful for accessing\n     * properties while loading stylesheets.\n     *\n     * @param $prop\n     * @return string\n     * @throws Exception\n     */\n    function get_prop($prop)\n    {\n        // Legacy property aliases\n        if ($prop === \"word_wrap\") {\n            $prop = \"overflow_wrap\";\n        }\n\n        if (!isset(self::$_defaults[$prop])) {\n            throw new Exception(\"'$prop' is not a recognized CSS property.\");\n        }\n\n        $method = \"get_$prop\";\n\n        // Fall back on defaults if property is not set\n        if (!isset($this->_props_computed[$prop])) {\n            return self::$_defaults[$prop];\n        }\n\n        if (method_exists($this, $method)) {\n            return $this->$method();\n        }\n\n        return $this->_props[$prop];\n    }\n\n    /**\n     * Calculates the computed value of the CSS properties that have been set (the specified properties)\n     */\n    function compute_props()\n    {\n        foreach ($this->_props as $prop => $val) {\n            if (in_array($prop, self::$_props_shorthand) === false) {\n                $this->__set($prop, $val);\n            }\n        }\n    }\n\n    /**\n     * @param float $cbw The width of the containing block.\n     * @return float|null|string\n     */\n    function computed_bottom_spacing(float $cbw)\n    {\n        // Caching the bottom spacing independently of the given width is a bit\n        // iffy, but should be okay, as the containing block should only\n        // potentially change after a page break, and the style is reset in that\n        // case\n        if ($this->_computed_bottom_spacing !== null) {\n            return $this->_computed_bottom_spacing;\n        }\n        return $this->_computed_bottom_spacing = $this->length_in_pt(\n            [\n                $this->margin_bottom,\n                $this->padding_bottom,\n                $this->border_bottom_width\n            ],\n            $cbw\n        );\n    }\n\n    /**\n     * @return string\n     */\n    function get_font_family_raw()\n    {\n        return trim($this->_props[\"font_family\"], \" \\t\\n\\r\\x0B\\\"'\");\n    }\n\n    /**\n     * Getter for the 'font-family' CSS property.\n     * Uses the {@link FontMetrics} class to resolve the font family into an\n     * actual font file.\n     *\n     * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family\n     * @throws Exception\n     *\n     * @return string\n     */\n    function get_font_family()\n    {\n        //TODO: we should be using the calculated prop rather than perform the entire family parsing operation again\n\n        $DEBUGCSS = $this->_stylesheet->get_dompdf()->getOptions()->getDebugCss();\n\n        // Select the appropriate font.  First determine the subtype, then check\n        // the specified font-families for a candidate.\n\n        // Resolve font-weight\n        $weight = $this->__get(\"font_weight\");\n        if ($weight === 'bold') {\n            $weight = 700;\n        } elseif (preg_match('/^[0-9]+$/', $weight, $match)) {\n            $weight = (int)$match[0];\n        } else {\n            $weight = 400;\n        }\n\n        // Resolve font-style\n        $font_style = $this->__get(\"font_style\");\n        $subtype = $this->getFontMetrics()->getType($weight . ' ' . $font_style);\n\n        $families = preg_split(\"/\\s*,\\s*/\", $this->_props_computed[\"font_family\"]);\n\n        $font = null;\n        foreach ($families as $family) {\n            //remove leading and trailing string delimiters, e.g. on font names with spaces;\n            //remove leading and trailing whitespace\n            $family = trim($family, \" \\t\\n\\r\\x0B\\\"'\");\n            if ($DEBUGCSS) {\n                print '(' . $family . ')';\n            }\n            $font = $this->getFontMetrics()->getFont($family, $subtype);\n\n            if ($font) {\n                if ($DEBUGCSS) {\n                    print \"<pre>[get_font_family:\";\n                    print '(' . $this->_props_computed[\"font_family\"] . '.' . $font_style . '.' . $weight . '.' . $subtype . ')';\n                    print '(' . $font . \")get_font_family]\\n</pre>\";\n                }\n                return $font;\n            }\n        }\n\n        $family = null;\n        if ($DEBUGCSS) {\n            print '(default)';\n        }\n        $font = $this->getFontMetrics()->getFont($family, $subtype);\n\n        if ($font) {\n            if ($DEBUGCSS) {\n                print '(' . $font . \")get_font_family]\\n</pre>\";\n            }\n            return $font;\n        }\n\n        throw new Exception(\"Unable to find a suitable font replacement for: '\" . $this->_props_computed[\"font_family\"] . \"'\");\n    }\n\n    /**\n     * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing\n     * @return float\n     */\n    function get_word_spacing()\n    {\n        $word_spacing = $this->_props_computed[\"word_spacing\"];\n\n        if ($word_spacing === \"normal\") {\n            return 0;\n        }\n\n        if (strpos($word_spacing, \"%\") !== false) {\n            return $word_spacing;\n        }\n\n        return (float)$this->length_in_pt($word_spacing, $this->__get(\"font_size\"));\n    }\n\n    /**\n     * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing\n     * @return float\n     */\n    function get_letter_spacing()\n    {\n        $letter_spacing = $this->_props_computed[\"letter_spacing\"];\n\n        if ($letter_spacing === \"normal\") {\n            return 0;\n        }\n\n        return (float)$this->length_in_pt($letter_spacing, $this->__get(\"font_size\"));\n    }\n\n    /**\n     * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height\n     * @return float\n     */\n    function get_line_height()\n    {\n        $line_height = $this->_props_computed[\"line_height\"];\n\n        if ($line_height === \"normal\") {\n            return self::$default_line_height * $this->__get(\"font_size\");\n        }\n\n        if (is_numeric($line_height)) {\n            return $line_height * $this->__get(\"font_size\");\n        }\n\n        return (float)$this->length_in_pt($line_height, $this->__get(\"font_size\"));\n    }\n\n    /**\n     * Returns the color as an array\n     *\n     * The array has the following format:\n     * <code>array(r,g,b, \"r\" => r, \"g\" => g, \"b\" => b, \"hex\" => \"#rrggbb\")</code>\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color\n     * @return array\n     */\n    function get_color()\n    {\n        return $this->munge_color($this->_props_computed[\"color\"]);\n    }\n\n    /**\n     * Returns the background color as an array\n     *\n     * The returned array has the same format as {@link Style::get_color()}\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color\n     * @return array\n     */\n    function get_background_color()\n    {\n        return $this->munge_color($this->_props_computed[\"background_color\"]);\n    }\n\n    /**\n     * Returns the background image URI, or \"none\"\n     *\n     * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-image\n     * @return string\n     */\n    function get_background_image()\n    {\n        return $this->_stylesheet->resolve_url($this->_props_computed[\"background_image\"]);\n    }\n\n    /**\n     * Returns the background position as an array\n     *\n     * The returned array has the following format:\n     * <code>array(x,y, \"x\" => x, \"y\" => y)</code>\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position\n     * @return array\n     */\n    function get_background_position()\n    {\n        if (strpos($this->_props_computed[\"background_position\"], \" \") === false) {\n            $this->__set(\"background_position\", $this->_props[\"background_position\"]);\n        }\n        $tmp = explode(\" \", $this->_props_computed[\"background_position\"]);\n\n        return [\n            0 => $tmp[0], \"x\" => $tmp[0],\n            1 => $tmp[1], \"y\" => $tmp[1],\n        ];\n    }\n\n\n    /**\n     * Returns the background size as an array\n     *\n     * The return value has one of the following formats:\n     * <code>\"cover\"</code>\n     * <code>\"contain\"</code>\n     * <code>array(width,height)</code>\n     *\n     * @link https://www.w3.org/TR/css3-background/#background-size\n     * @return string|array\n     */\n    function get_background_size()\n    {\n        switch ($this->_props_computed[\"background_size\"]) {\n            case \"cover\":\n                return \"cover\";\n            case \"contain\":\n                return \"contain\";\n            default:\n                break;\n        }\n\n        if (strpos($this->_props_computed[\"background_size\"], \" \") === false) {\n            $this->__set(\"background_size\", $this->_props[\"background_size\"]);\n        }\n        $result = explode(\" \", $this->_props_computed[\"background_size\"]);\n        return [$result[0], $result[1]];\n    }\n\n    /**#@+\n     * Returns the border color as an array\n     *\n     * See {@link Style::get_color()}\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties\n     * @return array\n     */\n    function get_border_top_color()\n    {\n        return $this->munge_color($this->_props_computed[\"border_top_color\"]);\n    }\n\n    /**\n     * @return array\n     */\n    function get_border_right_color()\n    {\n        return $this->munge_color($this->_props_computed[\"border_right_color\"]);\n    }\n\n    /**\n     * @return array\n     */\n    function get_border_bottom_color()\n    {\n        return $this->munge_color($this->_props_computed[\"border_bottom_color\"]);\n    }\n\n    /**\n     * @return array\n     */\n    function get_border_left_color()\n    {\n        return $this->munge_color($this->_props_computed[\"border_left_color\"]);\n    }\n\n    /**#@-*/\n\n    /**\n     * Return an array of all border properties.\n     *\n     * The returned array has the following structure:\n     * <code>\n     * array(\"top\" => array(\"width\" => [border-width],\n     *                      \"style\" => [border-style],\n     *                      \"color\" => [border-color (array)]),\n     *       \"bottom\" ... )\n     * </code>\n     *\n     * @return array\n     */\n    function get_border_properties()\n    {\n        return [\n            \"top\" => [\n                \"width\" => $this->__get(\"border_top_width\"),\n                \"style\" => $this->__get(\"border_top_style\"),\n                \"color\" => $this->__get(\"border_top_color\"),\n            ],\n            \"bottom\" => [\n                \"width\" => $this->__get(\"border_bottom_width\"),\n                \"style\" => $this->__get(\"border_bottom_style\"),\n                \"color\" => $this->__get(\"border_bottom_color\"),\n            ],\n            \"right\" => [\n                \"width\" => $this->__get(\"border_right_width\"),\n                \"style\" => $this->__get(\"border_right_style\"),\n                \"color\" => $this->__get(\"border_right_color\"),\n            ],\n            \"left\" => [\n                \"width\" => $this->__get(\"border_left_width\"),\n                \"style\" => $this->__get(\"border_left_style\"),\n                \"color\" => $this->__get(\"border_left_color\"),\n            ],\n        ];\n    }\n\n    /**\n     * Return a single border property\n     *\n     * @param string $side\n     *\n     * @return mixed\n     */\n    protected function _get_border($side)\n    {\n        $color = $this->__get(\"border_\" . $side . \"_color\");\n\n        return $this->__get(\"border_\" . $side . \"_width\") . \" \" .\n            $this->__get(\"border_\" . $side . \"_style\") . \" \" . (is_array($color) ? $color[\"hex\"] : $color);\n    }\n\n    /**#@+\n     * Return full border properties as a string\n     *\n     * Border properties are returned just as specified in CSS:\n     * <pre>[width] [style] [color]</pre>\n     * e.g. \"1px solid blue\"\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties\n     * @return string\n     */\n    function get_border_top()\n    {\n        return $this->_get_border(\"top\");\n    }\n\n    /**\n     * @return mixed\n     */\n    function get_border_right()\n    {\n        return $this->_get_border(\"right\");\n    }\n\n    /**\n     * @return mixed\n     */\n    function get_border_bottom()\n    {\n        return $this->_get_border(\"bottom\");\n    }\n\n    /**\n     * @return mixed\n     */\n    function get_border_left()\n    {\n        return $this->_get_border(\"left\");\n    }\n\n    private function _get_width($prop)\n    {\n        //TODO: should be handled in setter\n        if (strpos($this->_props_computed[$prop], \"%\") !== false) {\n            // calculate against width of containing block, needs to be done outside the style class\n            return $this->_props_computed[$prop];\n        }\n        return $this->length_in_pt($this->_props_computed[$prop], $this->__get(\"font_size\"));\n    }\n\n    function get_margin_top()\n    {\n        return $this->_get_width(\"margin_top\");\n    }\n\n    function get_margin_right()\n    {\n        return $this->_get_width(\"margin_right\");\n    }\n\n    function get_margin_bottom()\n    {\n        return $this->_get_width(\"margin_bottom\");\n    }\n\n    function get_margin_left()\n    {\n        return $this->_get_width(\"margin_left\");\n    }\n\n    function get_padding_top()\n    {\n        return $this->_get_width(\"padding_top\");\n    }\n\n    function get_padding_right()\n    {\n        return $this->_get_width(\"padding_right\");\n    }\n\n    function get_padding_bottom()\n    {\n        return $this->_get_width(\"padding_bottom\");\n    }\n\n    function get_padding_left()\n    {\n        return $this->_get_width(\"padding_left\");\n    }\n\n    /**\n     * @deprecated\n     * @param float $w\n     * @param float $h\n     * @return float[]\n     */\n    function get_computed_border_radius($w, $h)\n    {\n        return $this->resolve_border_radius([0, 0, $w, $h]);\n    }\n\n    public function has_border_radius(): bool\n    {\n        if (isset($this->has_border_radius_cache)) {\n            return $this->has_border_radius_cache;\n        }\n\n        // Use a fixed ref size here. We don't know the border-box width here\n        // and font size might be 0. Since we are only interested in whether\n        // there is any border radius at all, this should do\n        $tl = (float) $this->length_in_pt($this->border_top_left_radius, 10);\n        $tr = (float) $this->length_in_pt($this->border_top_right_radius, 10);\n        $br = (float) $this->length_in_pt($this->border_bottom_right_radius, 10);\n        $bl = (float) $this->length_in_pt($this->border_bottom_left_radius, 10);\n\n        $this->has_border_radius_cache = $tl + $tr + $br + $bl > 0;\n        return $this->has_border_radius_cache;\n    }\n\n    /**\n     * Get the final border-radius values to use.\n     *\n     * Percentage values are resolved relative to the width of the border box.\n     * The border radius is additionally scaled for the given render box, and\n     * constrained by its width and height.\n     *\n     * @param float[]      $border_box The border box of the frame.\n     * @param float[]|null $render_box The box to resolve the border radius for.\n     *\n     * @return float[] A 4-tuple of top-left, top-right, bottom-right, and bottom-left radius.\n     */\n    public function resolve_border_radius(\n        array $border_box,\n        ?array $render_box = null\n    ): array {\n        $render_box = $render_box ?? $border_box;\n        $use_cache = $render_box === $border_box;\n\n        if ($use_cache && isset($this->resolved_border_radius)) {\n            return $this->resolved_border_radius;\n        }\n\n        [$x, $y, $w, $h] = $border_box;\n\n        // Resolve percentages relative to width, as long as we have no support\n        // for per-axis radii\n        $tl = (float) $this->length_in_pt($this->border_top_left_radius, $w);\n        $tr = (float) $this->length_in_pt($this->border_top_right_radius, $w);\n        $br = (float) $this->length_in_pt($this->border_bottom_right_radius, $w);\n        $bl = (float) $this->length_in_pt($this->border_bottom_left_radius, $w);\n\n        if ($tl + $tr + $br + $bl > 0) {\n            [$rx, $ry, $rw, $rh] = $render_box;\n\n            $t_offset = $y - $ry;\n            $r_offset = $rx + $rw - $x - $w;\n            $b_offset = $ry + $rh - $y - $h;\n            $l_offset = $x - $rx;\n\n            if ($tl > 0) {\n                $tl = max($tl + ($t_offset + $l_offset) / 2, 0);\n            }\n            if ($tr > 0) {\n                $tr = max($tr + ($t_offset + $r_offset) / 2, 0);\n            }\n            if ($br > 0) {\n                $br = max($br + ($b_offset + $r_offset) / 2, 0);\n            }\n            if ($bl > 0) {\n                $bl = max($bl + ($b_offset + $l_offset) / 2, 0);\n            }\n\n            if ($tl + $bl > $rh) {\n                $f = $rh / ($tl + $bl);\n                $tl = $f * $tl;\n                $bl = $f * $bl;\n            }\n            if ($tr + $br > $rh) {\n                $f = $rh / ($tr + $br);\n                $tr = $f * $tr;\n                $br = $f * $br;\n            }\n            if ($tl + $tr > $rw) {\n                $f = $rw / ($tl + $tr);\n                $tl = $f * $tl;\n                $tr = $f * $tr;\n            }\n            if ($bl + $br > $rw) {\n                $f = $rw / ($bl + $br);\n                $bl = $f * $bl;\n                $br = $f * $br;\n            }\n        }\n\n        $values = [$tl, $tr, $br, $bl];\n\n        if ($use_cache) {\n            $this->resolved_border_radius = $values;\n        }\n\n        return $values;\n    }\n\n    /**\n     * Returns the outline color as an array\n     *\n     * See {@link Style::get_color()}\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties\n     * @return array\n     */\n    function get_outline_color()\n    {\n        return $this->munge_color($this->_props_computed[\"outline_color\"]);\n    }\n\n    /**#@+\n     * Returns the outline width, as it is currently stored\n     * @return float|string\n     */\n    function get_outline_width()\n    {\n        $style = $this->__get(\"outline_style\");\n        return $style !== \"none\" && $style !== \"hidden\" ? $this->length_in_pt($this->_props_computed[\"outline_width\"]) : 0;\n    }\n\n    /**#@+\n     * Return full outline properties as a string\n     *\n     * Outline properties are returned just as specified in CSS:\n     * <pre>[width] [style] [color]</pre>\n     * e.g. \"1px solid blue\"\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties\n     * @return string\n     */\n    function get_outline()\n    {\n        $color = $this->__get(\"outline_color\");\n        return\n            $this->__get(\"outline_width\") . \" \" .\n            $this->__get(\"outline_style\") . \" \" .\n            (is_array($color) ? $color[\"hex\"] : $color);\n    }\n    /**#@-*/\n\n    /**\n     * Returns border spacing as an array\n     *\n     * The array has the format (h_space,v_space)\n     *\n     * @link http://www.w3.org/TR/CSS21/tables.html#propdef-border-spacing\n     * @return array\n     */\n    function get_border_spacing()\n    {\n        $arr = explode(\" \", $this->_props_computed[\"border_spacing\"]);\n        if (count($arr) == 1) {\n            $arr[1] = $arr[0];\n        }\n        return $arr;\n    }\n\n    /**\n     * Returns the list style image URI, or \"none\"\n     *\n     * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image\n     * @return string\n     */\n    function get_list_style_image()\n    {\n        return $this->_stylesheet->resolve_url($this->_props_computed[\"list_style_image\"]);\n    }\n\n    /**\n     * @param $val\n     */\n    function get_counter_increment()\n    {\n        $val = trim($this->_props_computed[\"counter_increment\"]);\n        $value = null;\n\n        if (in_array($val, [\"none\", \"inherit\"])) {\n            $value = $val;\n        } else {\n            if (preg_match_all(\"/(\" . self::CSS_IDENTIFIER . \")(?:\\s+(\" . self::CSS_INTEGER . \"))?/\", $val, $matches, PREG_SET_ORDER)) {\n                $value = [];\n                foreach ($matches as $match) {\n                    $value[$match[1]] = isset($match[2]) ? $match[2] : 1;\n                }\n            }\n        }\n        return $value;\n    }\n\n\n    /*==============================*/\n\n    /*\n     !important attribute\n     For basic functionality of the !important attribute with overloading\n     of several styles of an element, changes in inherit(), merge() and _parse_properties()\n     are sufficient [helpers var $_important_props, __construct(), important_set(), important_get()]\n\n     Only for combined attributes extra treatment needed. See below.\n\n     div { border: 1px red; }\n     div { border: solid; } // Not combined! Only one occurrence of same style per context\n     //\n     div { border: 1px red; }\n     div a { border: solid; } // Adding to border style ok by inheritance\n     //\n     div { border-style: solid; } // Adding to border style ok because of different styles\n     div { border: 1px red; }\n     //\n     div { border-style: solid; !important} // border: overrides, even though not !important\n     div { border: 1px dashed red; }\n     //\n     div { border: 1px red; !important }\n     div a { border-style: solid; } // Need to override because not set\n\n     Special treatment:\n     At individual property like border-top-width need to check whether overriding value is also !important.\n     Also store the !important condition for later overrides.\n     Since not known who is initiating the override, need to get passed !important as parameter.\n     !important Parameter taken as in the original style in the css file.\n     When property border !important given, do not mark subsets like border_style as important. Only\n     individual properties.\n\n     Note:\n     Setting individual property directly from css with e.g. set_border_top_style() is not needed, because\n     missing set functions handled by a generic handler __set(), including the !important.\n     Setting individual property of as sub-property is handled below.\n\n     Implementation see at _set_style_side_type()\n     Callers _set_style_sides_type(), _set_style_type, _set_style_type_important()\n\n     Related functionality for background, padding, margin, font, list_style\n    */\n\n    /**\n     * Generalized set function for individual attribute of combined style.\n     * With check for !important\n     * Applicable for background, border, padding, margin, font, list_style\n     *\n     * Note: $type has a leading underscore (or is empty), the others not.\n     *\n     * @param $style\n     * @param $side\n     * @param $type\n     * @param $val\n     * @param $important\n     */\n    protected function _set_style_side_type($style, $side, $type, $val, $important)\n    {\n        $prop = $style;\n        if (!empty($side)) {\n            $prop .= \"_\" . $side;\n        };\n        if (!empty($type)) {\n            $prop .= \"_\" . $type;\n        };\n        $this->_props[$prop] = $val;\n        $this->_prop_cache[$prop] = null;\n\n        if ($val === \"inherit\") {\n            $this->_props_computed[$prop] = null;\n            return;\n        }\n\n        if (!isset($this->_important_props[$prop]) || $important) {\n            $val_computed = (float)$this->length_in_pt($val);\n            if ($side === \"bottom\") {\n                $this->_computed_bottom_spacing = null; //reset computed cache, border style can disable/enable border calculations\n            }\n            if ($important) {\n                $this->_important_props[$prop] = true;\n            }\n\n            if ($val_computed < 0 && ($style === \"border\" || $style === \"padding\" || $style === \"outline\")) {\n                $this->_props[$prop] = null; // passed-in value is invalid\n            } else if (\n                (($style === \"border\" || $style === \"outline\") && $type === \"width\" && strpos($val, \"%\") !== false)\n                ||\n                ($style === \"padding\" && strpos($val, \"%\") !== false)\n                ||\n                ($style === \"margin\" && (strpos($val, \"%\") !== false || $val === \"auto\"))\n            ) {\n                $this->_props_computed[$prop] = $val;\n            } elseif (($style === \"border\" || $style === \"outline\") && $type === \"width\" && strpos($val, \"%\") === false) {\n                $line_style_prop = $style;\n                if (!empty($side)) {\n                    $line_style_prop .= \"_\" . $side;\n                };\n                $line_style_prop .= \"_style\";\n                $line_style = $this->__get($line_style_prop);\n                $this->_props_computed[$prop] = ($line_style !== \"none\" && $line_style !== \"hidden\" ? $val_computed : 0);\n            } elseif (($style === \"margin\" || $style === \"padding\")) {\n                $this->_props_computed[$prop] = ($val !== \"none\" && $val !== \"hidden\" ? $val_computed : 0);\n            } elseif ($type === \"color\") {\n                $this->set_prop_color($prop, $val);\n            } elseif (!empty($val)) {\n                $this->_props_computed[$prop] = $val;\n            }\n        }\n    }\n\n    /**\n     * @param $style\n     * @param $top\n     * @param $right\n     * @param $bottom\n     * @param $left\n     * @param $type\n     * @param $important\n     */\n    protected function _set_style_sides_type($style, $top, $right, $bottom, $left, $type, $important)\n    {\n        $this->_set_style_side_type($style, 'top', $type, $top, $important);\n        $this->_set_style_side_type($style, 'right', $type, $right, $important);\n        $this->_set_style_side_type($style, 'bottom', $type, $bottom, $important);\n        $this->_set_style_side_type($style, 'left', $type, $left, $important);\n    }\n\n    /**\n     * @param $style\n     * @param $type\n     * @param $val\n     * @param $important\n     */\n    protected function _set_style_type($style, $type, $val, $important)\n    {\n        $val = preg_replace(\"/\\s*\\,\\s*/\", \",\", $val); // when rgb() has spaces\n        $arr = explode(\" \", $val);\n\n        switch (count($arr)) {\n            case 1:\n                $this->_set_style_sides_type($style, $arr[0], $arr[0], $arr[0], $arr[0], $type, $important);\n                break;\n            case 2:\n                $this->_set_style_sides_type($style, $arr[0], $arr[1], $arr[0], $arr[1], $type, $important);\n                break;\n            case 3:\n                $this->_set_style_sides_type($style, $arr[0], $arr[1], $arr[2], $arr[1], $type, $important);\n                break;\n            case 4:\n                $this->_set_style_sides_type($style, $arr[0], $arr[1], $arr[2], $arr[3], $type, $important);\n                break;\n        }\n    }\n\n    /**\n     * @param $style\n     * @param $type\n     * @param $val\n     */\n    protected function _set_style_type_important($style, $type, $val)\n    {\n        $this->_set_style_type($style, $type, $val, isset($this->_important_props[$style . $type]));\n    }\n\n    /**\n     * Anyway only called if _important matches and is assigned\n     * E.g. _set_style_side_type($style,$side,'',str_replace(\"none\", \"0px\", $val),isset($this->_important_props[$style.'_'.$side]));\n     *\n     * @param $style\n     * @param $side\n     * @param $val\n     */\n    protected function _set_style_side_width_important($style, $side, $val)\n    {\n        $this->_set_style_side_type($style, $side, \"\", $val, isset($this->_important_props[$style . $side]));\n    }\n\n    /**\n     * @param $style\n     * @param $val\n     * @param $important\n     */\n    protected function _set_style($style, $val, $important)\n    {\n        if (!isset($this->_important_props[$style]) || $important) {\n            if ($important) {\n                $this->_important_props[$style] = true;\n            }\n            $this->__set($style, $val);\n        }\n    }\n\n    /*======================*/\n\n    protected function set_prop_color($prop, $color)\n    {\n        $munged_color = $this->munge_color($color);\n\n        if (is_null($munged_color)) {\n            return;\n        }\n\n        $this->_props[$prop] = $color;\n        $this->_props_computed[$prop] = null;\n        $this->_prop_cache[$prop] = null;\n\n        $this->_props_computed[$prop] = (is_array($munged_color) ? $munged_color[\"hex\"] : $munged_color);\n    }\n\n    /**\n     * Sets color\n     *\n     * The color parameter can be any valid CSS color value\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color\n     * @param string $color\n     */\n    function set_color($color)\n    {\n        $this->set_prop_color(\"color\", $color);\n    }\n\n    /**\n     * Sets the background color\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color\n     * @param string $color\n     */\n    function set_background_color($color)\n    {\n        $this->set_prop_color(\"background_color\", $color);\n    }\n\n    /**\n     * Set the background image url\n     * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-image\n     *\n     * @param string $val\n     */\n    function set_background_image($val)\n    {\n        $this->_props[\"background_image\"] = $val;\n        $parsed_val = $this->_stylesheet->resolve_url($val);\n        if ($parsed_val === \"none\") {\n            $this->_props_computed[\"background_image\"] = \"none\";\n        } else {\n            $this->_props_computed[\"background_image\"] = \"url(\" . $parsed_val . \")\";\n        }\n        $this->_prop_cache[\"background_image\"] = null;\n    }\n\n    /**\n     * Sets the background repeat\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat\n     * @param string $val\n     */\n    function set_background_repeat($val)\n    {\n        $this->_props[\"background_repeat\"] = $val;\n        $this->_props_computed[\"background_repeat\"] = null;\n        $this->_prop_cache[\"background_repeat\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        $this->_props_computed[\"background_repeat\"] = $val;\n    }\n\n    /**\n     * Sets the background attachment\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment\n     * @param string $val\n     */\n    function set_background_attachment($val)\n    {\n        $this->_props[\"background_attachment\"] = $val;\n        $this->_props_computed[\"background_attachment\"] = null;\n        $this->_prop_cache[\"background_attachment\"] = null;\n        \n        if ($val === 'inherit') {\n            return;\n        }\n\n        $this->_props_computed[\"background_attachment\"] = $val;\n    }\n\n    /**\n     * Sets the background position\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position\n     * @param string $val\n     */\n    function set_background_position($val)\n    {\n        $this->_props[\"background_position\"] = $val;\n\n        $tmp = explode(\" \", $val);\n\n        switch ($tmp[0]) {\n            case \"left\":\n                $x = \"0%\";\n                break;\n\n            case \"right\":\n                $x = \"100%\";\n                break;\n\n            case \"top\":\n                $y = \"0%\";\n                break;\n\n            case \"bottom\":\n                $y = \"100%\";\n                break;\n\n            case \"center\":\n                $x = \"50%\";\n                $y = \"50%\";\n                break;\n\n            default:\n                $x = $tmp[0];\n                break;\n        }\n\n        if (isset($tmp[1])) {\n            switch ($tmp[1]) {\n                case \"left\":\n                    $x = \"0%\";\n                    break;\n\n                case \"right\":\n                    $x = \"100%\";\n                    break;\n\n                case \"top\":\n                    $y = \"0%\";\n                    break;\n\n                case \"bottom\":\n                    $y = \"100%\";\n                    break;\n\n                case \"center\":\n                    if ($tmp[0] === \"left\" || $tmp[0] === \"right\" || $tmp[0] === \"center\") {\n                        $y = \"50%\";\n                    } else {\n                        $x = \"50%\";\n                    }\n                    break;\n\n                default:\n                    $y = $tmp[1];\n                    break;\n            }\n        } else {\n            $y = \"50%\";\n        }\n\n        if (!isset($x)) {\n            $x = \"0%\";\n        }\n\n        if (!isset($y)) {\n            $y = \"0%\";\n        }\n        \n        $this->_props_computed[\"background_position\"] = \"$x $y\";\n        $this->_prop_cache[\"background_position\"] = null;\n    }\n\n    /**\n     * Sets the background size\n     *\n     * @link https://www.w3.org/TR/css3-background/#background-size\n     * @param string $val\n     */\n    function set_background_size($val)\n    {\n        $this->_props[\"background_size\"] = $val;\n        $this->_prop_cache[\"background_size\"] = null;\n\n        $result = explode(\" \", $val);\n        $width = $result[0];\n\n        switch ($width) {\n            case \"cover\":\n            case \"contain\":\n                $this->_props_computed[\"background_size\"] = $width;\n                return;\n            case \"inherit\":\n                return;\n        }\n\n        if ($width !== \"auto\" && strpos($width, \"%\") === false) {\n            $width = (float)$this->length_in_pt($width);\n        }\n\n        $height = $result[1] ?? \"auto\";\n        if ($height !== \"auto\" && strpos($height, \"%\") === false) {\n            $height = (float)$this->length_in_pt($height);\n        }\n\n        $this->_props_computed[\"background_size\"] = \"$width $height\";\n    }\n\n    /**\n     * Sets the background - combined options\n     *\n     * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background\n     * @param string $val\n     */\n    function set_background($val)\n    {\n        $val = trim($val);\n        $important = isset($this->_important_props[\"background\"]);\n\n        if ($val === \"none\") {\n            $this->_set_style(\"background_image\", \"none\", $important);\n            $this->_set_style(\"background_color\", \"transparent\", $important);\n        } else {\n            $pos = [];\n            $tmp = preg_replace(\"/\\s*\\,\\s*/\", \",\", $val); // when rgb() has spaces\n            $tmp = preg_split(\"/\\s+/\", $tmp);\n\n            foreach ($tmp as $attr) {\n                if (mb_substr($attr, 0, 3) === \"url\" || $attr === \"none\") {\n                    $this->_set_style(\"background_image\", $attr, $important);\n                } elseif ($attr === \"fixed\" || $attr === \"scroll\") {\n                    $this->_set_style(\"background_attachment\", $attr, $important);\n                } elseif ($attr === \"repeat\" || $attr === \"repeat-x\" || $attr === \"repeat-y\" || $attr === \"no-repeat\") {\n                    $this->_set_style(\"background_repeat\", $attr, $important);\n                } elseif (($col = $this->munge_color($attr)) != null) {\n                    $this->_set_style(\"background_color\", is_array($col) ? $col[\"hex\"] : $col, $important);\n                } else {\n                    $pos[] = $attr;\n                }\n            }\n\n            if (count($pos)) {\n                $this->_set_style(\"background_position\", implode(\" \", $pos), $important);\n            }\n        }\n\n        //see __set and __get, on all assignments clear cache, not needed on direct set through __set\n        $this->_props[\"background\"] = $val;\n        $this->_props_computed[\"background\"] = null;\n        $this->_prop_cache[\"background\"] = null;\n    }\n\n    /**\n     * Sets the font size\n     *\n     * $size can be any acceptable CSS size\n     *\n     * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size\n     * @param string|float $size\n     */\n    function set_font_size($size)\n    {\n        $this->_props[\"font_size\"] = $size;\n        $this->_props_computed[\"font_size\"] = null;\n        $this->_prop_cache[\"font_size\"] = null;\n\n        if ($size === \"inherit\") {\n            return;\n        }\n        if (!isset($this->_parent_font_size)) {\n            $this->_parent_font_size = self::$default_font_size;\n        }\n\n        switch ((string)$size) {\n            case \"xx-small\":\n            case \"x-small\":\n            case \"small\":\n            case \"medium\":\n            case \"large\":\n            case \"x-large\":\n            case \"xx-large\":\n                $fs = self::$default_font_size * self::$font_size_keywords[$size];\n                break;\n\n            case \"smaller\":\n                $fs = 8 / 9 * $this->_parent_font_size;\n                break;\n\n            case \"larger\":\n                $fs = 6 / 5 * $this->_parent_font_size;\n                break;\n\n            default:\n                $fs = $size;\n                break;\n        }\n\n        // length_in_pt uses the font size if units are em or ex (and, potentially, rem) so we'll calculate in the method\n        if (($i = mb_strpos($fs, \"rem\")) !== false) {\n            if ($this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style() === null) {\n                // Interpreting it as \"em\", see https://github.com/dompdf/dompdf/issues/1406\n                $fs = (float)mb_substr($fs, 0, $i) * $this->_parent_font_size;\n            } else {\n                $fs = (float)mb_substr($fs, 0, $i) * $this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style()->font_size;\n            }\n        } elseif (($i = mb_strpos($fs, \"em\")) !== false) {\n            $fs = (float)mb_substr($fs, 0, $i) * $this->_parent_font_size;\n        } elseif (($i = mb_strpos($fs, \"ex\")) !== false) {\n            $fs = (float)mb_substr($fs, 0, $i) * $this->_parent_font_size / 2;\n        } else {\n            //FIXME: prefer just calling length_in_pt, when we provide a ref size to length_in_pt should em and ex use that instead of the current font size?\n            $fs = (float)$this->length_in_pt($fs, $this->_parent_font_size);\n        }\n\n        $this->_props_computed[\"font_size\"] = $fs;\n    }\n\n    /**\n     * Sets the font weight\n     *\n     * @param string|int $weight\n     */\n    function set_font_weight($weight)\n    {\n        $this->_props[\"font_weight\"] = $weight;\n        $this->_props_computed[\"font_weight\"] = null;\n        $this->_prop_cache[\"font_weight\"] = null;\n\n        $computed_weight = $weight;\n\n        if ($weight === \"bolder\") {\n            //TODO: One font weight heavier than the parent element (among the available weights of the font).\n            $computed_weight = \"bold\";\n        } elseif ($weight === \"lighter\") {\n            //TODO: One font weight lighter than the parent element (among the available weights of the font).\n            $computed_weight = \"normal\";\n        }\n\n        $this->_props_computed[\"font_weight\"] = $computed_weight;\n    }\n\n    /**\n     * Sets the font style\n     *\n     * combined attributes\n     * set individual attributes also, respecting !important mark\n     * exactly this order, separate by space. Multiple fonts separated by comma:\n     * font-style, font-variant, font-weight, font-size, line-height, font-family\n     *\n     * Other than with border and list, existing partial attributes should\n     * reset when starting here, even when not mentioned.\n     * If individual attribute is !important and explicit or implicit replacement is not,\n     * keep individual attribute\n     *\n     * require whitespace as delimiters for single value attributes\n     * On delimiter \"/\" treat first as font height, second as line height\n     * treat all remaining at the end of line as font\n     * font-style, font-variant, font-weight, font-size, line-height, font-family\n     *\n     * missing font-size and font-family might be not allowed, but accept it here and\n     * use default (medium size, empty font name)\n     *\n     * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style\n     * @param $val\n     */\n    function set_font($val)\n    {\n        //see __set and __get, on all assignments clear cache, not needed on direct set through __set\n        $this->_prop_cache[\"font\"] = null;\n        $this->_props[\"font\"] = $val;\n        $this->_props_computed[\"font\"] = null;\n\n        $important = isset($this->_important_props[\"font\"]);\n\n        if (strtolower($val) === \"inherit\") {\n            $this->_set_style(\"font_family\", \"inherit\", $important);\n            $this->_set_style(\"font_size\", \"inherit\", $important);\n            $this->_set_style(\"font_style\", \"inherit\", $important);\n            $this->_set_style(\"font_variant\", \"inherit\", $important);\n            $this->_set_style(\"font_weight\", \"inherit\", $important);\n            $this->_set_style(\"line_height\", \"inherit\", $important);\n            return;\n        }\n\n        if (preg_match(\"/^(italic|oblique|normal)\\s*(.*)$/i\", $val, $match)) {\n            $this->_set_style(\"font_style\", $match[1], $important);\n            $val = $match[2];\n        }\n\n        if (preg_match(\"/^(small-caps|normal)\\s*(.*)$/i\", $val, $match)) {\n            $this->_set_style(\"font_variant\", $match[1], $important);\n            $val = $match[2];\n        }\n\n        //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip!\n        if (preg_match(\"/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\\s*(.*)$/i\", $val, $match) &&\n            !preg_match(\"/^(?:pt|px|pc|em|ex|in|cm|mm|%)/\", $match[2])\n        ) {\n            $this->_set_style(\"font_weight\", $match[1], $important);\n            $val = $match[2];\n        }\n\n        if (preg_match(\"/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|\\d+\\s*(?:pt|px|pc|em|ex|in|cm|mm|%))(?:\\/|\\s*)(.*)$/i\", $val, $match)) {\n            $this->_set_style(\"font_size\", $match[1], $important);\n            $val = $match[2];\n            if (preg_match(\"/^(?:\\/|\\s*)(\\d+\\s*(?:pt|px|pc|em|ex|in|cm|mm|%)?)\\s*(.*)$/i\", $val, $match)) {\n                $this->_set_style(\"line_height\", $match[1], $important);\n                $val = $match[2];\n            }\n        }\n\n        if (strlen($val) != 0) {\n            $this->_set_style(\"font_family\", $val, $important);\n        }\n    }\n\n    /**\n     * Sets the text alignment\n     *\n     * If no alignment is set on the element and the direction is rtl then\n     * the property is set to \"right\", otherwise it is set to \"left\".\n     *\n     * @link https://www.w3.org/TR/CSS21/text.html#propdef-text-align\n     */\n    public function set_text_align($val)\n    {\n        $alignment = \"\";\n        if (in_array($val, self::$text_align_keywords)) {\n            $alignment = $val;\n        }\n        if ($alignment === \"\") {\n            $alignment = \"left\";\n            if ($this->__get(\"direction\") === \"rtl\") {\n                $alignment = \"right\";\n            }\n\n        }\n        $this->_props_computed[\"text_align\"] = $alignment;\n    }\n    \n    /**\n     * Sets word spacing property\n     *\n     * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing\n     * @param $val\n     */\n    function set_word_spacing($val)\n    {\n        $this->_props[\"word_spacing\"] = $val;\n        $this->_props_computed[\"word_spacing\"] = null;\n        $this->_prop_cache[\"word_spacing\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        if ($val === \"normal\" || strpos($val, \"%\") !== false) {\n            $this->_props_computed[\"word_spacing\"] = $val;\n        } else {\n            $this->_props_computed[\"word_spacing\"] = ((float)$this->length_in_pt($val, $this->__get(\"font_size\"))) . \"pt\";\n        }\n    }\n\n    /**\n     * Sets letter spacing property\n     *\n     * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing\n     * @param $val\n     */\n    function set_letter_spacing($val)\n    {\n        $this->_props[\"letter_spacing\"] = $val;\n        $this->_props_computed[\"letter_spacing\"] = null;\n        $this->_prop_cache[\"letter_spacing\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        if ($val === \"normal\") {\n            $this->_props_computed[\"letter_spacing\"] = $val;\n        } else {\n            $this->_props_computed[\"letter_spacing\"] = ((float)$this->length_in_pt($val, $this->__get(\"font_size\"))) . \"pt\";\n        }\n    }\n\n    /**\n     * Sets line height property\n     *\n     * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height\n     * @param $val\n     */\n    function set_line_height($val)\n    {\n        $this->_props[\"line_height\"] = $val;\n        $this->_props_computed[\"line_height\"] = null;\n        $this->_prop_cache[\"line_height\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        if ($val === \"normal\" || is_numeric($val)) {\n            $this->_props_computed[\"line_height\"] = $val;\n        } else {\n            $this->_props_computed[\"line_height\"] = ((float)$this->length_in_pt($val, $this->__get(\"font_size\"))) . \"pt\";\n        }\n    }\n\n    /**\n     * Sets page break properties\n     *\n     * @link http://www.w3.org/TR/CSS21/page.html#page-breaks\n     * @param string $break\n     */\n    function set_page_break_before($break)\n    {\n        $this->_props[\"page_break_before\"] = $break;\n        $this->_props_computed[\"page_break_before\"] = null;\n        $this->_prop_cache[\"page_break_before\"] = null;\n\n        if ($break === 'inherit') {\n            return;\n        }\n\n        if ($break === \"left\" || $break === \"right\") {\n            $break = \"always\";\n        }\n\n        $this->_props_computed[\"page_break_before\"] = $break;\n    }\n\n    /**\n     * @param $break\n     */\n    function set_page_break_after($break)\n    {\n        $this->_props[\"page_break_after\"] = $break;\n        $this->_props_computed[\"page_break_after\"] = null;\n        $this->_prop_cache[\"page_break_after\"] = null;\n\n        if ($break === 'inherit') {\n            return;\n        }\n\n        if ($break === \"left\" || $break === \"right\") {\n            $break = \"always\";\n        }\n\n        $this->_props_computed[\"page_break_after\"] = $break;\n    }\n\n    /**\n     * Sets the margin size\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#margin-properties\n     * @param $val\n     */\n    function set_margin_top($val)\n    {\n        $this->_set_style_side_width_important('margin', 'top', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_margin_right($val)\n    {\n        $this->_set_style_side_width_important('margin', 'right', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_margin_bottom($val)\n    {\n        $this->_set_style_side_width_important('margin', 'bottom', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_margin_left($val)\n    {\n        $this->_set_style_side_width_important('margin', 'left', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_margin($val)\n    {\n        $this->_set_style_type_important('margin', '', $val);\n    }\n\n    /**\n     * Sets the padding size\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#padding-properties\n     * @param $val\n     */\n    function set_padding_top($val)\n    {\n        $this->_set_style_side_width_important('padding', 'top', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_padding_right($val)\n    {\n        $this->_set_style_side_width_important('padding', 'right', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_padding_bottom($val)\n    {\n        $this->_set_style_side_width_important('padding', 'bottom', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_padding_left($val)\n    {\n        $this->_set_style_side_width_important('padding', 'left', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_padding($val)\n    {\n        $this->_set_style_type_important('padding', '', $val);\n    }\n    /**#@-*/\n\n    /**\n     * Sets a single border\n     *\n     * @param string $side\n     * @param string $border_spec ([width] [style] [color])\n     * @param boolean $important\n     */\n    protected function _set_border($side, $border_spec, $important)\n    {\n        $border_spec = preg_replace(\"/\\s*\\,\\s*/\", \",\", $border_spec);\n        $arr = explode(\" \", $border_spec);\n\n        foreach ($arr as $value) {\n            $value = trim($value);\n            $prop = \"\";\n            if (strtolower($value) === \"inherit\") {\n                $this->__set(\"border_${side}_color\", \"inherit\");\n                $this->__set(\"border_${side}_style\", \"inherit\");\n                $this->__set(\"border_${side}_width\", \"inherit\");\n                continue;\n            } elseif (in_array($value, self::$BORDER_STYLES)) {\n                $prop = \"border_${side}_style\";\n            } elseif ($value === \"0\" || preg_match(\"/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/\", $value)) {\n                $prop = \"border_${side}_width\";\n            } else {\n                // must be color\n                $prop = \"border_${side}_color\";\n            }\n\n            if ($important) {\n                $this->_important_props[$prop] = true;\n            }\n            $this->__set($prop, $value);\n        }\n    }\n\n    /**\n     * Sets the border styles\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#border-properties\n     * @param string $val\n     */\n    function set_border_top($val)\n    {\n        $this->_set_border(\"top\", $val, isset($this->_important_props['border_top']));\n    }\n\n    function set_border_top_color($val)\n    {\n        $color = $val;\n        if ($val === \"\") {\n            $color = $this->__get(\"color\");\n        }\n        $this->_set_style_side_type('border', 'top', 'color', $color, isset($this->_important_props['border_top_color']));\n    }\n\n    function set_border_top_style($val)\n    {\n        $this->_set_style_side_type('border', 'top', 'style', $val, isset($this->_important_props['border_top_style']));\n    }\n\n    function set_border_top_width($val)\n    {\n        $this->_set_style_side_type('border', 'top', 'width', $val, isset($this->_important_props['border_top_width']));\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_right($val)\n    {\n        $this->_set_border(\"right\", $val, isset($this->_important_props['border_right']));\n    }\n\n    function set_border_right_color($val)\n    {\n        $color = $val;\n        if ($val === \"\") {\n            $color = $this->__get(\"color\");\n        }\n        $this->_set_style_side_type('border', 'right', 'color', $color, isset($this->_important_props['border_right_color']));\n    }\n\n    function set_border_right_style($val)\n    {\n        $this->_set_style_side_type('border', 'right', 'style', $val, isset($this->_important_props['border_right_style']));\n    }\n\n    function set_border_right_width($val)\n    {\n        $this->_set_style_side_type('border', 'right', 'width', $val, isset($this->_important_props['border_right_width']));\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_bottom($val)\n    {\n        $this->_set_border(\"bottom\", $val, isset($this->_important_props['border_bottom']));\n    }\n\n    function set_border_bottom_color($val)\n    {\n        $color = $val;\n        if ($val === \"\") {\n            $color = $this->__get(\"color\");\n        }\n        $this->_set_style_side_type('border', 'bottom', 'color', $color, isset($this->_important_props['border_bottom_color']));\n    }\n\n    function set_border_bottom_style($val)\n    {\n        $this->_set_style_side_type('border', 'bottom', 'style', $val, isset($this->_important_props['border_bottom_style']));\n    }\n\n    function set_border_bottom_width($val)\n    {\n        $this->_set_style_side_type('border', 'bottom', 'width', $val, isset($this->_important_props['border_bottom_width']));\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_left($val)\n    {\n        $this->_set_border(\"left\", $val, isset($this->_important_props['border_left']));\n    }\n\n    function set_border_left_color($val)\n    {\n        $color = $val;\n        if ($val === \"\") {\n            $color = $this->__get(\"color\");\n        }\n        $this->_set_style_side_type('border', 'left', 'color', $color, isset($this->_important_props['border_left_color']));\n    }\n\n    function set_border_left_style($val)\n    {\n        $this->_set_style_side_type('border', 'left', 'style', $val, isset($this->_important_props['border_left_style']));\n    }\n\n    function set_border_left_width($val)\n    {\n        $this->_set_style_side_type('border', 'left', 'width', $val, isset($this->_important_props['border_left_width']));\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border($val)\n    {\n        $important = isset($this->_important_props[\"border\"]);\n\n        $this->_set_border(\"top\", $val, $important);\n        $this->_set_border(\"right\", $val, $important);\n        $this->_set_border(\"bottom\", $val, $important);\n        $this->_set_border(\"left\", $val, $important);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_width($val)\n    {\n        $this->_set_style_type_important('border', 'width', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_color($val)\n    {\n        $this->_set_style_type_important('border', 'color', $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_style($val)\n    {\n        $this->_set_style_type_important('border', 'style', $val);\n    }\n\n    /**\n     * Sets the border radius size\n     *\n     * http://www.w3.org/TR/css3-background/#corners\n     *\n     * @param $val\n     */\n    function set_border_top_left_radius($val)\n    {\n        $this->_set_border_radius_corner($val, \"top_left\");\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_top_right_radius($val)\n    {\n        $this->_set_border_radius_corner($val, \"top_right\");\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_bottom_left_radius($val)\n    {\n        $this->_set_border_radius_corner($val, \"bottom_left\");\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_bottom_right_radius($val)\n    {\n        $this->_set_border_radius_corner($val, \"bottom_right\");\n    }\n\n    /**\n     * @param $val\n     */\n    function set_border_radius($val)\n    {\n        $val = preg_replace(\"/\\s*\\,\\s*/\", \",\", $val); // when border-radius has spaces\n        $arr = explode(\" \", $val);\n\n        switch (count($arr)) {\n            case 1:\n                $this->_set_border_radii($arr[0], $arr[0], $arr[0], $arr[0]);\n                break;\n            case 2:\n                $this->_set_border_radii($arr[0], $arr[1], $arr[0], $arr[1]);\n                break;\n            case 3:\n                $this->_set_border_radii($arr[0], $arr[1], $arr[2], $arr[1]);\n                break;\n            case 4:\n                $this->_set_border_radii($arr[0], $arr[1], $arr[2], $arr[3]);\n                break;\n        }\n    }\n\n    /**\n     * @param $val1\n     * @param $val2\n     * @param $val3\n     * @param $val4\n     */\n    protected function _set_border_radii($val1, $val2, $val3, $val4)\n    {\n        $this->_set_border_radius_corner($val1, \"top_left\");\n        $this->_set_border_radius_corner($val2, \"top_right\");\n        $this->_set_border_radius_corner($val3, \"bottom_right\");\n        $this->_set_border_radius_corner($val4, \"bottom_left\");\n    }\n\n    /**\n     * @param $val\n     * @param $corner\n     */\n    protected function _set_border_radius_corner($val, $corner)\n    {\n        $this->has_border_radius_cache = null;\n        $this->_has_border_radius = true;\n\n        $this->_props[\"border_\" . $corner . \"_radius\"] = $val;\n        $this->_props_computed[\"border_\" . $corner . \"_radius\"] = null;\n        $this->_prop_cache[\"border_\" . $corner . \"_radius\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        $this->_props_computed[\"border_\" . $corner . \"_radius\"] = $val;\n    }\n\n    /**\n     * @return float|int|string\n     */\n    function get_border_top_left_radius()\n    {\n        return $this->_get_border_radius_corner(\"top_left\");\n    }\n\n    /**\n     * @return float|int|string\n     */\n    function get_border_top_right_radius()\n    {\n        return $this->_get_border_radius_corner(\"top_right\");\n    }\n\n    /**\n     * @return float|int|string\n     */\n    function get_border_bottom_left_radius()\n    {\n        return $this->_get_border_radius_corner(\"bottom_left\");\n    }\n\n    /**\n     * @return float|int|string\n     */\n    function get_border_bottom_right_radius()\n    {\n        return $this->_get_border_radius_corner(\"bottom_right\");\n    }\n\n    /**\n     * @param $corner\n     * @return float|int|string\n     */\n    protected function _get_border_radius_corner($corner)\n    {\n        $prop = \"border_\" . $corner . \"_radius\";\n\n        if (!isset($this->_props_computed[$prop]) || empty($this->_props_computed[$prop])) {\n            return 0;\n        }\n\n        return $this->_props_computed[$prop];\n    }\n\n    /**\n     * Sets the outline styles\n     *\n     * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines\n     * @param string $val\n     */\n    function set_outline($val)\n    {\n        $important = isset($this->_important_props[\"outline\"]);\n\n        $props = [\n            \"outline_style\",\n            \"outline_width\",\n            \"outline_color\",\n        ];\n\n        foreach ($props as $prop) {\n            $_val = self::$_defaults[$prop];\n\n            if (!isset($this->_important_props[$prop]) || $important) {\n                //see __set and __get, on all assignments clear cache!\n                $this->_prop_cache[$prop] = null;\n                if ($important) {\n                    $this->_important_props[$prop] = true;\n                }\n                $this->_props[$prop] = $_val;\n            }\n        }\n\n        $val = preg_replace(\"/\\s*\\,\\s*/\", \",\", $val); // when rgb() has spaces\n        $arr = explode(\" \", $val);\n        foreach ($arr as $value) {\n            $value = trim($value);\n\n            if (in_array($value, self::$BORDER_STYLES)) {\n                $this->__set(\"outline_style\", $value);\n            } else if ($value === \"0\" || preg_match(\"/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/\", $value)) {\n                $this->__set(\"outline_width\", $value);\n            } else {\n                // must be color\n                $this->__set(\"outline_color\", $value);\n            }\n        }\n\n        //see __set and __get, on all assignments clear cache, not needed on direct set through __set\n        $this->_props[\"outline\"] = $val;\n        $this->_props_computed[\"outline\"] = null;\n        $this->_prop_cache[\"outline\"] = null;\n    }\n\n    /**\n     * @param $val\n     */\n    function set_outline_width($val)\n    {\n        $this->_set_style_side_type(\"outline\", null, \"width\", $val, isset($this->_important_props[\"outline_width\"]));\n    }\n\n    /**\n     * @param $val\n     */\n    function set_outline_color($val)\n    {\n        $color = $val;\n        if ($val === \"\") {\n            $color = $this->__get(\"color\");\n        }\n        $this->_set_style_side_type(\"outline\", null, \"color\", $color, isset($this->_important_props[\"outline_color\"]));\n    }\n\n    /**\n     * @param $val\n     */\n    function set_outline_style($val)\n    {\n        $this->_set_style_side_type(\"outline\", null, \"style\", $val, isset($this->_important_props[\"outline_style\"]));\n    }\n\n    /**\n     * Sets the border spacing\n     *\n     * @link http://www.w3.org/TR/CSS21/box.html#border-properties\n     * @param float $val\n     */\n    function set_border_spacing($val)\n    {\n        $arr = explode(\" \", $val);\n\n        if (count($arr) == 1) {\n            $arr[1] = $arr[0];\n        }\n\n        $this->_props[\"border_spacing\"] = $val;\n        $this->_props_computed[\"border_spacing\"] = null;\n        $this->_prop_cache[\"border_spacing\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        $this->_props_computed[\"border_spacing\"] = \"$arr[0] $arr[1]\";\n    }\n\n    /**\n     * Sets the list style image\n     *\n     * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image\n     * @param $val\n     */\n    function set_list_style_image($val)\n    {\n        $this->_props[\"list_style_image\"] = $val;\n        $parsed_val = $this->_stylesheet->resolve_url($val);\n        if ($parsed_val === \"none\") {\n            $this->_props_computed[\"list_style_image\"] = \"none\";\n        } else {\n            $this->_props_computed[\"list_style_image\"] = \"url(\" . $parsed_val . \")\";\n        }\n        $this->_prop_cache[\"list_style_image\"] = null;\n    }\n\n    /**\n     * Sets the list style\n     *\n     * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style\n     * @param $val\n     */\n    function set_list_style($val)\n    {\n        $important = isset($this->_important_props[\"list_style\"]);\n        $arr = explode(\" \", str_replace(\",\", \" \", $val));\n\n        static $types = [\n            \"disc\", \"circle\", \"square\",\n            \"decimal-leading-zero\", \"decimal\", \"1\",\n            \"lower-roman\", \"upper-roman\", \"a\", \"A\",\n            \"lower-greek\",\n            \"lower-latin\", \"upper-latin\",\n            \"lower-alpha\", \"upper-alpha\",\n            \"armenian\", \"georgian\", \"hebrew\",\n            \"cjk-ideographic\", \"hiragana\", \"katakana\",\n            \"hiragana-iroha\", \"katakana-iroha\", \"none\"\n        ];\n\n        static $positions = [\"inside\", \"outside\"];\n\n        foreach ($arr as $value) {\n            /* http://www.w3.org/TR/CSS21/generate.html#list-style\n             * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none'\n             */\n            if ($value === \"none\") {\n                $this->_set_style(\"list_style_type\", $value, $important);\n                $this->_set_style(\"list_style_image\", $value, $important);\n                continue;\n            }\n\n            //On setting or merging or inheriting list_style_image as well as list_style_type,\n            //and url exists, then url has precedence, otherwise fall back to list_style_type\n            //Firefox is wrong here (list_style_image gets overwritten on explicit list_style_type)\n            //Internet Explorer 7/8 and dompdf is right.\n\n            if (mb_substr($value, 0, 3) === \"url\") {\n                $this->_set_style(\"list_style_image\", $value, $important);\n                continue;\n            }\n\n            if (in_array($value, $types)) {\n                $this->_set_style(\"list_style_type\", $value, $important);\n            } else if (in_array($value, $positions)) {\n                $this->_set_style(\"list_style_position\", $value, $important);\n            }\n        }\n\n        $this->_props[\"list_style\"] = $val;\n        $this->_props_computed[\"list_style\"] = null;\n        $this->_prop_cache[\"list_style\"] = null;\n    }\n\n    /**\n     * @param $val\n     */\n    function set_size($val)\n    {\n        $this->_props[\"size\"] = $val;\n        $this->_props_computed[\"size\"] = null;\n        $this->_prop_cache[\"size\"] = null;\n\n        $length_re = \"/(\\d+\\s*(?:pt|px|pc|em|ex|in|cm|mm|%))/\";\n\n        $val = mb_strtolower($val);\n\n        if ($val === \"auto\") {\n            $this->_props[\"size\"] = $val;\n            return;\n        }\n\n        $parts = preg_split(\"/\\s+/\", $val);\n\n        $computed = [];\n        if (preg_match($length_re, $parts[0])) {\n            $computed[] = $this->length_in_pt($parts[0]);\n\n            if (isset($parts[1]) && preg_match($length_re, $parts[1])) {\n                $computed[] = $this->length_in_pt($parts[1]);\n            } else {\n                $computed[] = $computed[0];\n            }\n\n            if (isset($parts[2]) && $parts[2] === \"landscape\") {\n                $computed = array_reverse($computed);\n            }\n        } elseif (isset(CPDF::$PAPER_SIZES[$parts[0]])) {\n            $computed = array_slice(CPDF::$PAPER_SIZES[$parts[0]], 2, 2);\n\n            if (isset($parts[1]) && $parts[1] === \"landscape\") {\n                $computed = array_reverse($computed);\n            }\n        } else {\n            return;\n        }\n\n        $this->_props_computed[\"size\"] = $computed;\n    }\n\n    /**\n     * Gets the CSS3 transform property\n     *\n     * @link http://www.w3.org/TR/css3-2d-transforms/#transform-property\n     * @return array|null\n     */\n    function get_transform()\n    {\n        //TODO: should be handled in setter (lengths set to absolute)\n\n        $number = \"\\s*([^,\\s]+)\\s*\";\n        $tr_value = \"\\s*([^,\\s]+)\\s*\";\n        $angle = \"\\s*([^,\\s]+(?:deg|rad)?)\\s*\";\n\n        if (!preg_match_all(\"/[a-z]+\\([^\\)]+\\)/i\", $this->_props_computed[\"transform\"], $parts, PREG_SET_ORDER)) {\n            return null;\n        }\n\n        $functions = [\n            //\"matrix\"     => \"\\($number,$number,$number,$number,$number,$number\\)\",\n\n            \"translate\" => \"\\($tr_value(?:,$tr_value)?\\)\",\n            \"translateX\" => \"\\($tr_value\\)\",\n            \"translateY\" => \"\\($tr_value\\)\",\n\n            \"scale\" => \"\\($number(?:,$number)?\\)\",\n            \"scaleX\" => \"\\($number\\)\",\n            \"scaleY\" => \"\\($number\\)\",\n\n            \"rotate\" => \"\\($angle\\)\",\n\n            \"skew\" => \"\\($angle(?:,$angle)?\\)\",\n            \"skewX\" => \"\\($angle\\)\",\n            \"skewY\" => \"\\($angle\\)\",\n        ];\n\n        $transforms = [];\n\n        foreach ($parts as $part) {\n            $t = $part[0];\n\n            foreach ($functions as $name => $pattern) {\n                if (preg_match(\"/$name\\s*$pattern/i\", $t, $matches)) {\n                    $values = array_slice($matches, 1);\n\n                    switch ($name) {\n                        // <angle> units\n                        case \"rotate\":\n                        case \"skew\":\n                        case \"skewX\":\n                        case \"skewY\":\n\n                            foreach ($values as $i => $value) {\n                                if (strpos($value, \"rad\")) {\n                                    $values[$i] = rad2deg(floatval($value));\n                                } else {\n                                    $values[$i] = floatval($value);\n                                }\n                            }\n\n                            switch ($name) {\n                                case \"skew\":\n                                    if (!isset($values[1])) {\n                                        $values[1] = 0;\n                                    }\n                                    break;\n                                case \"skewX\":\n                                    $name = \"skew\";\n                                    $values = [$values[0], 0];\n                                    break;\n                                case \"skewY\":\n                                    $name = \"skew\";\n                                    $values = [0, $values[0]];\n                                    break;\n                            }\n                            break;\n\n                        // <translation-value> units\n                        case \"translate\":\n                            $values[0] = $this->length_in_pt($values[0], (float)$this->length_in_pt($this->width));\n\n                            if (isset($values[1])) {\n                                $values[1] = $this->length_in_pt($values[1], (float)$this->length_in_pt($this->height));\n                            } else {\n                                $values[1] = 0;\n                            }\n                            break;\n\n                        case \"translateX\":\n                            $name = \"translate\";\n                            $values = [$this->length_in_pt($values[0], (float)$this->length_in_pt($this->width)), 0];\n                            break;\n\n                        case \"translateY\":\n                            $name = \"translate\";\n                            $values = [0, $this->length_in_pt($values[0], (float)$this->length_in_pt($this->height))];\n                            break;\n\n                        // <number> units\n                        case \"scale\":\n                            if (!isset($values[1])) {\n                                $values[1] = $values[0];\n                            }\n                            break;\n\n                        case \"scaleX\":\n                            $name = \"scale\";\n                            $values = [$values[0], 1.0];\n                            break;\n\n                        case \"scaleY\":\n                            $name = \"scale\";\n                            $values = [1.0, $values[0]];\n                            break;\n                    }\n\n                    $transforms[] = [\n                        $name,\n                        $values,\n                    ];\n                }\n            }\n        }\n\n        return $transforms;\n    }\n\n    /**\n     * @param $val\n     */\n    function set_transform($val)\n    {\n        //see __set and __get, on all assignments clear cache, not needed on direct set through __set\n        $this->_props[\"transform\"] = $val;\n        $this->_props_computed[\"transform\"] = null;\n        $this->_prop_cache[\"transform\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n        \n        $this->_props_computed[\"transform\"] = $val;\n    }\n\n    /**\n     * @param $val\n     */\n    function set__webkit_transform($val)\n    {\n        $this->__set(\"transform\", $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set__webkit_transform_origin($val)\n    {\n        $this->__set(\"transform_origin\", $val);\n    }\n\n    /**\n     * Sets the CSS3 transform-origin property\n     *\n     * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin\n     * @param string $val\n     */\n    function set_transform_origin($val)\n    {\n        $this->_props[\"transform_origin\"] = $val;\n        $this->_props_computed[\"transform_origin\"] = null;\n        $this->_prop_cache[\"transform_origin\"] = null;\n\n        if ($val === 'inherit') {\n            return;\n        }\n\n        $this->_props_computed[\"transform_origin\"] = $val;\n    }\n\n    /**\n     * Gets the CSS3 transform-origin property\n     *\n     * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin\n     * @return mixed[]\n     */\n    function get_transform_origin()\n    {\n        //TODO: should be handled in setter\n        \n        $values = preg_split(\"/\\s+/\", $this->_props_computed['transform_origin']);\n\n        $values = array_map(function ($value) {\n            if (in_array($value, [\"top\", \"left\"])) {\n                return 0;\n            } else if (in_array($value, [\"bottom\", \"right\"])) {\n                return \"100%\";\n            } else {\n                return $value;\n            }\n        }, $values);\n\n        if (!isset($values[1])) {\n            $values[1] = $values[0];\n        }\n\n        return $values;\n    }\n\n    /**\n     * @param $val\n     * @return null\n     */\n    protected function parse_image_resolution($val)\n    {\n        // If exif data could be get:\n        // $re = '/^\\s*(\\d+|normal|auto)(?:\\s*,\\s*(\\d+|normal))?\\s*$/';\n\n        $re = '/^\\s*(\\d+|normal|auto)\\s*$/';\n\n        if (!preg_match($re, $val, $matches)) {\n            return null;\n        }\n\n        return $matches[1];\n    }\n\n    /**\n     * auto | normal | dpi\n     *\n     * @param $val\n     */\n    function set_background_image_resolution($val)\n    {\n        $this->_props[\"background_image_resolution\"] = $val;\n        $this->_props_computed[\"background_image_resolution\"] = null;\n        $this->_prop_cache[\"background_image_resolution\"] = null;\n\n        $parsed = $this->parse_image_resolution($val);\n\n        $this->_props_computed[\"background_image_resolution\"] = $parsed;\n    }\n\n    /**\n     * auto | normal | dpi\n     *\n     * @param $val\n     */\n    function set_image_resolution($val)\n    {\n        $this->_props[\"image_resolution\"] = $val;\n        $this->_props_computed[\"image_resolution\"] = null;\n        $this->_prop_cache[\"image_resolution\"] = null;\n\n        $parsed = $this->parse_image_resolution($val);\n\n        $this->_props_computed[\"image_resolution\"] = $parsed;\n    }\n\n    /**\n     * @param $val\n     */\n    function set__dompdf_background_image_resolution($val)\n    {\n        $this->__set(\"background_image_resolution\", $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set__dompdf_image_resolution($val)\n    {\n        $this->__set(\"image_resolution\", $val);\n    }\n\n    /**\n     * @param $val\n     */\n    function set_z_index($val)\n    {\n        $this->_props[\"z_index\"] = $val;\n        $this->_props_computed[\"z_index\"] = null;\n        $this->_prop_cache[\"z_index\"] = null;\n\n        if ($val !== \"auto\" && round($val) != $val) {\n            return;\n        }\n\n        $this->_props_computed[\"z_index\"] = $val;\n    }\n\n    /**\n     * @param FontMetrics $fontMetrics\n     * @return $this\n     */\n    public function setFontMetrics(FontMetrics $fontMetrics)\n    {\n        $this->fontMetrics = $fontMetrics;\n        return $this;\n    }\n\n    /**\n     * @return FontMetrics\n     */\n    public function getFontMetrics()\n    {\n        return $this->fontMetrics;\n    }\n\n    /**\n     * Generate a string representation of the Style\n     *\n     * This dumps the entire property array into a string via print_r.  Useful\n     * for debugging.\n     *\n     * @return string\n     */\n    /*DEBUGCSS print: see below additional debugging util*/\n    function __toString()\n    {\n        return print_r(array_merge([\"parent_font_size\" => $this->_parent_font_size],\n            $this->_props), true);\n    }\n\n    /*DEBUGCSS*/\n    function debug_print()\n    {\n        print \"    parent_font_size:\" . $this->_parent_font_size . \";\\n\";\n        print \"    Props [\\n\";\n        print \"      specified [\\n\";\n        foreach ($this->_props as $prop => $val) {\n            print '        ' . $prop . ': ' . preg_replace(\"/\\r\\n/\", ' ', print_r($val, true));\n            if (isset($this->_important_props[$prop])) {\n                print ' !important';\n            }\n            print \";\\n\";\n        }\n        print \"      ]\\n\";\n        print \"      computed [\\n\";\n        foreach ($this->_props_computed as $prop => $val) {\n            print '        ' . $prop . ': ' . preg_replace(\"/\\r\\n/\", ' ', print_r($val, true));\n            print \";\\n\";\n        }\n        print \"      ]\\n\";\n        print \"      cached [\\n\";\n        foreach ($this->_prop_cache as $prop => $val) {\n            print '        ' . $prop . ': ' . preg_replace(\"/\\r\\n/\", ' ', print_r($val, true));\n            print \";\\n\";\n        }\n        print \"      ]\\n\";\n        print \"    ]\\n\";\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Css/Stylesheet.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Css;\n\nuse DOMElement;\nuse DOMXPath;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Exception;\nuse Dompdf\\FontMetrics;\nuse Dompdf\\Frame\\FrameTree;\n\n/**\n * The master stylesheet class\n *\n * The Stylesheet class is responsible for parsing stylesheets and style\n * tags/attributes.  It also acts as a registry of the individual Style\n * objects generated by the current set of loaded CSS files and style\n * elements.\n *\n * @see Style\n * @package dompdf\n */\nclass Stylesheet\n{\n    /**\n     * The location of the default built-in CSS file.\n     */\n    const DEFAULT_STYLESHEET = \"/lib/res/html.css\";\n\n    /**\n     * User agent stylesheet origin\n     *\n     * @var int\n     */\n    const ORIG_UA = 1;\n\n    /**\n     * User normal stylesheet origin\n     *\n     * @var int\n     */\n    const ORIG_USER = 2;\n\n    /**\n     * Author normal stylesheet origin\n     *\n     * @var int\n     */\n    const ORIG_AUTHOR = 3;\n\n    /*\n     * The highest possible specificity is 0x01000000 (and that is only for author\n     * stylesheets, as it is for inline styles). Origin precedence can be achieved by\n     * adding multiples of 0x10000000 to the actual specificity. Important\n     * declarations are handled in Style; though technically they should be handled\n     * here so that user important declarations can be made to take precedence over\n     * user important declarations, this doesn't matter in practice as Dompdf does\n     * not support user stylesheets, and user agent stylesheets can not include\n     * important declarations.\n     */\n    private static $_stylesheet_origins = [\n        self::ORIG_UA => 0x00000000, // user agent declarations\n        self::ORIG_USER => 0x10000000, // user normal declarations\n        self::ORIG_AUTHOR => 0x30000000, // author normal declarations\n    ];\n\n    /*\n     * Non-CSS presentational hints (i.e. HTML 4 attributes) are handled as if added\n     * to the beginning of an author stylesheet, i.e. anything in author stylesheets\n     * should override them.\n     */\n    const SPEC_NON_CSS = 0x20000000;\n\n    /**\n     * Current dompdf instance\n     *\n     * @var Dompdf\n     */\n    private $_dompdf;\n\n    /**\n     * Array of currently defined styles\n     *\n     * @var Style[]\n     */\n    private $_styles;\n\n    /**\n     * Base protocol of the document being parsed\n     * Used to handle relative urls.\n     *\n     * @var string\n     */\n    private $_protocol;\n\n    /**\n     * Base hostname of the document being parsed\n     * Used to handle relative urls.\n     *\n     * @var string\n     */\n    private $_base_host;\n\n    /**\n     * Base path of the document being parsed\n     * Used to handle relative urls.\n     *\n     * @var string\n     */\n    private $_base_path;\n\n    /**\n     * The styles defined by @page rules\n     *\n     * @var array<Style>\n     */\n    private $_page_styles;\n\n    /**\n     * List of loaded files, used to prevent recursion\n     *\n     * @var array\n     */\n    private $_loaded_files;\n\n    /**\n     * Current stylesheet origin\n     *\n     * @var int\n     */\n    private $_current_origin = self::ORIG_UA;\n\n    /**\n     * Accepted CSS media types\n     * List of types and parsing rules for future extensions:\n     * http://www.w3.org/TR/REC-html40/types.html\n     *   screen, tty, tv, projection, handheld, print, braille, aural, all\n     * The following are non standard extensions for undocumented specific environments.\n     *   static, visual, bitmap, paged, dompdf\n     * Note, even though the generated pdf file is intended for print output,\n     * the desired content might be different (e.g. screen or projection view of html file).\n     * Therefore allow specification of content by dompdf setting Options::defaultMediaType.\n     * If given, replace media \"print\" by Options::defaultMediaType.\n     * (Previous version $ACCEPTED_MEDIA_TYPES = $ACCEPTED_GENERIC_MEDIA_TYPES + $ACCEPTED_DEFAULT_MEDIA_TYPE)\n     */\n    static $ACCEPTED_DEFAULT_MEDIA_TYPE = \"print\";\n    static $ACCEPTED_GENERIC_MEDIA_TYPES = [\"all\", \"static\", \"visual\", \"bitmap\", \"paged\", \"dompdf\"];\n    static $VALID_MEDIA_TYPES = [\"all\", \"aural\", \"bitmap\", \"braille\", \"dompdf\", \"embossed\", \"handheld\", \"paged\", \"print\", \"projection\", \"screen\", \"speech\", \"static\", \"tty\", \"tv\", \"visual\"];\n\n    /**\n     * @var FontMetrics\n     */\n    private $fontMetrics;\n\n    /**\n     * The class constructor.\n     *\n     * The base protocol, host & path are initialized to those of\n     * the current script.\n     */\n    function __construct(Dompdf $dompdf)\n    {\n        $this->_dompdf = $dompdf;\n        $this->setFontMetrics($dompdf->getFontMetrics());\n        $this->_styles = [];\n        $this->_loaded_files = [];\n        $script = __FILE__;\n        if (isset($_SERVER[\"SCRIPT_FILENAME\"])) {\n            $script = $_SERVER[\"SCRIPT_FILENAME\"];\n        }\n        list($this->_protocol, $this->_base_host, $this->_base_path) = Helpers::explode_url($script);\n        $this->_page_styles = [\"base\" => new Style($this)];\n    }\n\n    /**\n     * Set the base protocol\n     *\n     * @param string $protocol\n     */\n    function set_protocol($protocol)\n    {\n        $this->_protocol = $protocol;\n    }\n\n    /**\n     * Set the base host\n     *\n     * @param string $host\n     */\n    function set_host($host)\n    {\n        $this->_base_host = $host;\n    }\n\n    /**\n     * Set the base path\n     *\n     * @param string $path\n     */\n    function set_base_path($path)\n    {\n        $this->_base_path = $path;\n    }\n\n    /**\n     * Return the Dompdf object\n     *\n     * @return Dompdf\n     */\n    function get_dompdf()\n    {\n        return $this->_dompdf;\n    }\n\n    /**\n     * Return the base protocol for this stylesheet\n     *\n     * @return string\n     */\n    function get_protocol()\n    {\n        return $this->_protocol;\n    }\n\n    /**\n     * Return the base host for this stylesheet\n     *\n     * @return string\n     */\n    function get_host()\n    {\n        return $this->_base_host;\n    }\n\n    /**\n     * Return the base path for this stylesheet\n     *\n     * @return string\n     */\n    function get_base_path()\n    {\n        return $this->_base_path;\n    }\n\n    /**\n     * Return the array of page styles\n     *\n     * @return Style[]\n     */\n    function get_page_styles()\n    {\n        return $this->_page_styles;\n    }\n\n    /**\n     * Add a new Style object to the stylesheet\n     * add_style() adds a new Style object to the current stylesheet, or\n     * merges a new Style with an existing one.\n     *\n     * @param string $key the Style's selector\n     * @param Style $style the Style to be added\n     *\n     * @throws \\Dompdf\\Exception\n     */\n    function add_style($key, Style $style)\n    {\n        if (!is_string($key)) {\n            throw new Exception(\"CSS rule must be keyed by a string.\");\n        }\n\n        if (!isset($this->_styles[$key])) {\n            $this->_styles[$key] = [];\n        }\n        $new_style = clone $style;\n        $new_style->set_origin($this->_current_origin);\n        $this->_styles[$key][] = $new_style;\n    }\n\n    /**\n     * lookup a specific Style collection\n     *\n     * lookup() returns the Style collection specified by $key, or null if the Style is\n     * not found.\n     *\n     * @param string $key the selector of the requested Style\n     * @return Style\n     *\n     * @Fixme _styles is a two dimensional array. It should produce wrong results\n     */\n    function lookup($key)\n    {\n        if (!isset($this->_styles[$key])) {\n            return null;\n        }\n\n        return $this->_styles[$key];\n    }\n\n    /**\n     * create a new Style object associated with this stylesheet\n     *\n     * @param Style $parent The style of this style's parent in the DOM tree\n     * @return Style\n     */\n    function create_style(Style $parent = null)\n    {\n        if ($parent == null) {\n            $parent = $this;\n        }\n        return new Style($parent, $this->_current_origin);\n    }\n\n    /**\n     * load and parse a CSS string\n     *\n     * @param string $css\n     * @param int $origin\n     */\n    function load_css(&$css, $origin = self::ORIG_AUTHOR)\n    {\n        if ($origin) {\n            $this->_current_origin = $origin;\n        }\n        $this->_parse_css($css);\n    }\n\n\n    /**\n     * load and parse a CSS file\n     *\n     * @param string $file\n     * @param int $origin\n     */\n    function load_css_file($file, $origin = self::ORIG_AUTHOR)\n    {\n        if ($origin) {\n            $this->_current_origin = $origin;\n        }\n\n        // Prevent circular references\n        if (isset($this->_loaded_files[$file])) {\n            return;\n        }\n\n        $this->_loaded_files[$file] = true;\n\n        if (strpos($file, \"data:\") === 0) {\n            $parsed = Helpers::parse_data_uri($file);\n            $css = $parsed[\"data\"];\n        } else {\n            $parsed_url = Helpers::explode_url($file);\n\n            list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url;\n\n            $file = Helpers::build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename);\n\n            $options = $this->_dompdf->getOptions();\n            // Download the remote file\n            if (!$options->isRemoteEnabled() && ($this->_protocol != \"\" && $this->_protocol !== \"file://\")) {\n                Helpers::record_warnings(E_USER_WARNING, \"Remote CSS resource '$file' referenced, but remote file download is disabled.\", __FILE__, __LINE__);\n                return;\n            }\n            if ($this->_protocol == \"\" || $this->_protocol === \"file://\") {\n                $realfile = realpath($file);\n\n                $rootDir = realpath($options->getRootDir());\n                if (strpos($realfile, $rootDir) !== 0) {\n                    $chroot = $options->getChroot();\n                    $chrootValid = false;\n                    foreach ($chroot as $chrootPath) {\n                        $chrootPath = realpath($chrootPath);\n                        if ($chrootPath !== false && strpos($realfile, $chrootPath) === 0) {\n                            $chrootValid = true;\n                            break;\n                        }\n                    }\n                    if ($chrootValid !== true) {\n                        Helpers::record_warnings(E_USER_WARNING, \"Permission denied on $file. The file could not be found under the paths specified by Options::chroot.\", __FILE__, __LINE__);\n                        return;\n                    }\n                }\n\n                if (!$realfile) {\n                    Helpers::record_warnings(E_USER_WARNING, \"File '$realfile' not found.\", __FILE__, __LINE__);\n                    return;\n                }\n\n                $file = $realfile;\n            }\n            \n            list($css, $http_response_header) = Helpers::getFileContent($file, $this->_dompdf->getHttpContext());\n\n            $good_mime_type = true;\n\n            // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/\n            if (isset($http_response_header) && !$this->_dompdf->getQuirksmode()) {\n                foreach ($http_response_header as $_header) {\n                    if (preg_match(\"@Content-Type:\\s*([\\w/]+)@i\", $_header, $matches) &&\n                        ($matches[1] !== \"text/css\")\n                    ) {\n                        $good_mime_type = false;\n                    }\n                }\n            }\n\n            if (!$good_mime_type || empty($css)) {\n                Helpers::record_warnings(E_USER_WARNING, \"Unable to load css file $file\", __FILE__, __LINE__);\n                return;\n            }\n        }\n\n        $this->_parse_css($css);\n    }\n\n    /**\n     * @link http://www.w3.org/TR/CSS21/cascade.html#specificity\n     *\n     * @param string $selector\n     * @param int $origin :\n     *    - Stylesheet::ORIG_UA: user agent style sheet\n     *    - Stylesheet::ORIG_USER: user style sheet\n     *    - Stylesheet::ORIG_AUTHOR: author style sheet\n     *\n     * @return int\n     */\n    private function _specificity($selector, $origin = self::ORIG_AUTHOR)\n    {\n        // http://www.w3.org/TR/CSS21/cascade.html#specificity\n        // ignoring the \":\" pseudoclass modifiers\n        // also ignored in _css_selector_to_xpath\n\n        $a = ($selector === \"!attr\") ? 1 : 0;\n\n        $b = min(mb_substr_count($selector, \"#\"), 255);\n\n        $c = min(mb_substr_count($selector, \".\") +\n            mb_substr_count($selector, \"[\"), 255);\n\n        $d = min(mb_substr_count($selector, \" \") +\n            mb_substr_count($selector, \">\") +\n            mb_substr_count($selector, \"+\") +\n            mb_substr_count($selector, \"~\") -\n            mb_substr_count($selector, \"~=\"), 255);\n\n        //If a normal element name is at the beginning of the string,\n        //a leading whitespace might have been removed on whitespace collapsing and removal\n        //therefore there might be one whitespace less as selected element names\n        //this can lead to a too small specificity\n        //see _css_selector_to_xpath\n\n        if (!in_array($selector[0], [\" \", \">\", \".\", \"#\", \"+\", \"~\", \":\", \"[\"]) && $selector !== \"*\") {\n            $d++;\n        }\n\n        if ($this->_dompdf->getOptions()->getDebugCss()) {\n            /*DEBUGCSS*/\n            print \"<pre>\\n\";\n            /*DEBUGCSS*/\n            printf(\"_specificity(): 0x%08x \\\"%s\\\"\\n\", self::$_stylesheet_origins[$origin] + (($a << 24) | ($b << 16) | ($c << 8) | ($d)), $selector);\n            /*DEBUGCSS*/\n            print \"</pre>\";\n        }\n\n        return self::$_stylesheet_origins[$origin] + (($a << 24) | ($b << 16) | ($c << 8) | ($d));\n    }\n\n    /**\n     * Converts a CSS selector to an XPath query.\n     *\n     * @param string $selector\n     * @param bool $first_pass\n     *\n     * @throws Exception\n     * @return array\n     */\n    private function _css_selector_to_xpath(string $selector, bool $first_pass = false): array\n    {\n        // Collapse white space and strip whitespace around delimiters\n        //$search = array(\"/\\\\s+/\", \"/\\\\s+([.>#+:])\\\\s+/\");\n        //$replace = array(\" \", \"\\\\1\");\n        //$selector = preg_replace($search, $replace, trim($selector));\n\n        // Initial query (non-absolute)\n        $query = \"//\";\n\n        // Will contain :before and :after\n        $pseudo_elements = [];\n\n        // Will contain :link, etc\n        $pseudo_classes = [];\n\n        // Parse the selector\n        //$s = preg_split(\"/([ :>.#+])/\", $selector, -1, PREG_SPLIT_DELIM_CAPTURE);\n\n        $delimiters = [\" \", \">\", \".\", \"#\", \"+\", \"~\", \":\", \"[\", \"(\"];\n\n        // Add an implicit * at the beginning of the selector\n        // if it begins with an attribute selector\n        if ($selector[0] === \"[\") {\n            $selector = \"*$selector\";\n        }\n\n        // Add an implicit space at the beginning of the selector if there is no\n        // delimiter there already.\n        if (!in_array($selector[0], $delimiters)) {\n            $selector = \" $selector\";\n        }\n\n        $tok = \"\";\n        $len = mb_strlen($selector);\n        $i = 0;\n\n        while ($i < $len) {\n\n            $s = $selector[$i];\n            $i++;\n\n            // Eat characters up to the next delimiter\n            $tok = \"\";\n            $in_attr = false;\n            $in_func = false;\n\n            while ($i < $len) {\n                $c = $selector[$i];\n                $c_prev = $selector[$i - 1];\n\n                if (!$in_func && !$in_attr && in_array($c, $delimiters) && !(($c == $c_prev) == \":\")) {\n                    break;\n                }\n\n                if ($c_prev === \"[\") {\n                    $in_attr = true;\n                }\n                if ($c_prev === \"(\") {\n                    $in_func = true;\n                }\n\n                $tok .= $selector[$i++];\n\n                if ($in_attr && $c === \"]\") {\n                    $in_attr = false;\n                    break;\n                }\n                if ($in_func && $c === \")\") {\n                    $in_func = false;\n                    break;\n                }\n            }\n\n            switch ($s) {\n\n                case \" \":\n                case \">\":\n                    // All elements matching the next token that are direct children of\n                    // the current token\n                    $expr = $s === \" \" ? \"descendant\" : \"child\";\n\n                    if (mb_substr($query, -1, 1) !== \"/\") {\n                        $query .= \"/\";\n                    }\n\n                    // Tag names are case-insensitive\n                    $tok = strtolower($tok);\n\n                    if (!$tok) {\n                        $tok = \"*\";\n                    }\n\n                    $query .= \"$expr::$tok\";\n                    $tok = \"\";\n                    break;\n\n                case \".\":\n                case \"#\":\n                    // All elements matching the current token with a class/id equal to\n                    // the _next_ token.\n\n                    $attr = $s === \".\" ? \"class\" : \"id\";\n\n                    // empty class/id == *\n                    if (mb_substr($query, -1, 1) === \"/\") {\n                        $query .= \"*\";\n                    }\n\n                    // Match multiple classes: $tok contains the current selected\n                    // class.  Search for class attributes with class=\"$tok\",\n                    // class=\".* $tok .*\" and class=\".* $tok\"\n\n                    // This doesn't work because libxml only supports XPath 1.0...\n                    //$query .= \"[matches(@$attr,\\\"^${tok}\\$|^${tok}[ ]+|[ ]+${tok}\\$|[ ]+${tok}[ ]+\\\")]\";\n\n                    // Query improvement by Michael Sheakoski <michael@mjsdigital.com>:\n                    $query .= \"[contains(concat(' ', @$attr, ' '), concat(' ', '$tok', ' '))]\";\n                    $tok = \"\";\n                    break;\n\n                case \"+\":\n                case \"~\":\n                    // Next-sibling combinator\n                    // Subsequent-sibling combinator\n                    // https://www.w3.org/TR/selectors-3/#sibling-combinators\n                    if (mb_substr($query, -1, 1) !== \"/\") {\n                        $query .= \"/\";\n                    }\n\n                    // Tag names are case-insensitive\n                    $tok = strtolower($tok);\n\n                    if (!$tok) {\n                        $tok = \"*\";\n                    }\n\n                    $query .= \"following-sibling::$tok\";\n\n                    if ($s === \"+\") {\n                        $query .= \"[1]\";\n                    }\n\n                    $tok = \"\";\n                    break;\n\n                case \":\":\n                    $i2 = $i - strlen($tok) - 2; // the char before \":\"\n                    if (($i2 < 0 || !isset($selector[$i2]) || (in_array($selector[$i2], $delimiters) && $selector[$i2] != \":\")) && substr($query, -1) != \"*\") {\n                        $query .= \"*\";\n                    }\n\n                    $last = false;\n\n                    // Pseudo-classes\n                    switch ($tok) {\n\n                        case \"first-child\":\n                            $query .= \"[1]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"last-child\":\n                            $query .= \"[not(following-sibling::*)]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"first-of-type\":\n                            $query .= \"[position() = 1]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"last-of-type\":\n                            $query .= \"[position() = last()]\";\n                            $tok = \"\";\n                            break;\n\n                        // an+b, n, odd, and even\n                        /** @noinspection PhpMissingBreakStatementInspection */\n                        case \"nth-last-of-type\":\n                            $last = true;\n                        case \"nth-of-type\":\n                            //FIXME: this fix-up is pretty ugly, would parsing the selector in reverse work better generally?\n                            $descendant_delimeter = strrpos($query, \"::\");\n                            $isChild = substr($query, $descendant_delimeter-5, 5) == \"child\";\n                            $el = substr($query, $descendant_delimeter+2);\n                            $query = substr($query, 0, strrpos($query, \"/\")) . ($isChild ? \"/\" : \"//\") . $el;\n\n                            $pseudo_classes[$tok] = true;\n                            $p = $i + 1;\n                            $nth = trim(mb_substr($selector, $p, strpos($selector, \")\", $i) - $p));\n\n                            // 1\n                            if (preg_match(\"/^\\d+$/\", $nth)) {\n                                $condition = \"position() = $nth\";\n                            } // odd\n                            elseif ($nth === \"odd\") {\n                                $condition = \"(position() mod 2) = 1\";\n                            } // even\n                            elseif ($nth === \"even\") {\n                                $condition = \"(position() mod 2) = 0\";\n                            } // an+b\n                            else {\n                                $condition = $this->_selector_an_plus_b($nth, $last);\n                            }\n\n                            $query .= \"[$condition]\";\n                            $tok = \"\";\n                            break;\n                        /** @noinspection PhpMissingBreakStatementInspection */\n                        case \"nth-last-child\":\n                            $last = true;\n                        case \"nth-child\":\n                            //FIXME: this fix-up is pretty ugly, would parsing the selector in reverse work better generally?\n                            $descendant_delimeter = strrpos($query, \"::\");\n                            $isChild = substr($query, $descendant_delimeter-5, 5) == \"child\";\n                            $el = substr($query, $descendant_delimeter+2);\n                            $query = substr($query, 0, strrpos($query, \"/\")) . ($isChild ? \"/\" : \"//\") . \"*\";\n\n                            $pseudo_classes[$tok] = true;\n                            $p = $i + 1;\n                            $nth = trim(mb_substr($selector, $p, strpos($selector, \")\", $i) - $p));\n\n                            // 1\n                            if (preg_match(\"/^\\d+$/\", $nth)) {\n                                $condition = \"position() = $nth\";\n                            } // odd\n                            elseif ($nth === \"odd\") {\n                                $condition = \"(position() mod 2) = 1\";\n                            } // even\n                            elseif ($nth === \"even\") {\n                                $condition = \"(position() mod 2) = 0\";\n                            } // an+b\n                            else {\n                                $condition = $this->_selector_an_plus_b($nth, $last);\n                            }\n\n                            $query .= \"[$condition]\";\n                            if ($el != \"*\") {\n                                $query .= \"[name() = '$el']\";\n                            }\n                            $tok = \"\";\n                            break;\n\n                        //TODO: bit of a hack attempt at matches support, currently only matches against elements\n                        case \"matches\":\n                            $pseudo_classes[$tok] = true;\n                            $p = $i + 1;\n                            $matchList = trim(mb_substr($selector, $p, strpos($selector, \")\", $i) - $p));\n\n                            // Tag names are case-insensitive\n                            $elements = array_map(\"trim\", explode(\",\", strtolower($matchList)));\n                            foreach ($elements as &$element) {\n                                $element = \"name() = '$element'\";\n                            }\n\n                            $query .= \"[\" . implode(\" or \", $elements) . \"]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"link\":\n                            $query .= \"[@href]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"first-line\":\n                        case \":first-line\":\n                        case \"first-letter\":\n                        case \":first-letter\":\n                            // TODO\n                            $el = trim($tok, \":\");\n                            $pseudo_elements[$el] = true;\n                            break;\n\n                            // N/A\n                        case \"focus\":\n                        case \"active\":\n                        case \"hover\":\n                        case \"visited\":\n                            $query .= \"[false()]\";\n                            $tok = \"\";\n                            break;\n\n                        /* Pseudo-elements */\n                        case \"before\":\n                        case \":before\":\n                        case \"after\":\n                        case \":after\":\n                            $pos = trim($tok, \":\");\n                            $pseudo_elements[$pos] = true;\n                            if (!$first_pass) {\n                                $query .= \"/*[@$pos]\";\n                            }\n\n                            $tok = \"\";\n                            break;\n\n                        case \"empty\":\n                            $query .= \"[not(*) and not(normalize-space())]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"disabled\":\n                        case \"checked\":\n                            $query .= \"[@$tok]\";\n                            $tok = \"\";\n                            break;\n\n                        case \"enabled\":\n                            $query .= \"[not(@disabled)]\";\n                            $tok = \"\";\n                            break;\n\n                        // the selector is not handled, until we support all possible selectors force an empty set (silent failure)\n                        default:\n                            $query = \"/../..\"; // go up two levels because generated content starts on the body element\n                            $tok = \"\";\n                            break;\n                    }\n\n                    break;\n\n                case \"[\":\n                    // Attribute selectors.  All with an attribute matching the following token(s)\n                    // https://www.w3.org/TR/selectors-3/#attribute-selectors\n                    $attr_delimiters = [\"=\", \"]\", \"~\", \"|\", \"$\", \"^\", \"*\"];\n                    $tok_len = mb_strlen($tok);\n                    $j = 0;\n\n                    $attr = \"\";\n                    $op = \"\";\n                    $value = \"\";\n\n                    while ($j < $tok_len) {\n                        if (in_array($tok[$j], $attr_delimiters)) {\n                            break;\n                        }\n                        $attr .= $tok[$j++];\n                    }\n\n                    switch ($tok[$j]) {\n\n                        case \"~\":\n                        case \"|\":\n                        case \"$\":\n                        case \"^\":\n                        case \"*\":\n                            $op .= $tok[$j++];\n\n                            if ($tok[$j] !== \"=\") {\n                                throw new Exception(\"Invalid CSS selector syntax: invalid attribute selector: $selector\");\n                            }\n\n                            $op .= $tok[$j];\n                            break;\n\n                        case \"=\":\n                            $op = \"=\";\n                            break;\n\n                    }\n\n                    // Read the attribute value, if required\n                    if ($op != \"\") {\n                        $j++;\n                        while ($j < $tok_len) {\n                            if ($tok[$j] === \"]\") {\n                                break;\n                            }\n                            $value .= $tok[$j++];\n                        }\n                    }\n\n                    if ($attr == \"\") {\n                        throw new Exception(\"Invalid CSS selector syntax: missing attribute name\");\n                    }\n\n                    $value = trim($value, \"\\\"'\");\n\n                    switch ($op) {\n\n                        case \"\":\n                            $query .= \"[@$attr]\";\n                            break;\n\n                        case \"=\":\n                            $query .= \"[@$attr=\\\"$value\\\"]\";\n                            break;\n\n                        case \"~=\":\n                            // FIXME: this will break if $value contains quoted strings\n                            // (e.g. [type~=\"a b c\" \"d e f\"])\n                            // FIXME: Don't match anything if value contains\n                            // whitespace or is the empty string\n                            $query .= \"[contains(concat(' ', @$attr, ' '), concat(' ', '$value', ' '))]\";\n                            break;\n\n                        case \"|=\":\n                            $values = explode(\"-\", $value);\n                            $query .= \"[\";\n\n                            foreach ($values as $val) {\n                                $query .= \"starts-with(@$attr, \\\"$val\\\") or \";\n                            }\n\n                            $query = rtrim($query, \" or \") . \"]\";\n                            break;\n\n                        case \"$=\":\n                            $query .= \"[substring(@$attr, string-length(@$attr)-\" . (strlen($value) - 1) . \")=\\\"$value\\\"]\";\n                            break;\n\n                        case \"^=\":\n                            $query .= \"[starts-with(@$attr,\\\"$value\\\")]\";\n                            break;\n\n                        case \"*=\":\n                            $query .= \"[contains(@$attr,\\\"$value\\\")]\";\n                            break;\n                    }\n\n                    break;\n            }\n        }\n        $i++;\n\n//       case \":\":\n//         // Pseudo selectors: ignore for now.  Partially handled directly\n//         // below.\n\n//         // Skip until the next special character, leaving the token as-is\n//         while ( $i < $len ) {\n//           if ( in_array($selector[$i], $delimiters) )\n//             break;\n//           $i++;\n//         }\n//         break;\n\n//       default:\n//         // Add the character to the token\n//         $tok .= $selector[$i++];\n//         break;\n//       }\n\n//    }\n\n\n        // Trim the trailing '/' from the query\n        if (mb_strlen($query) > 2) {\n            $query = rtrim($query, \"/\");\n        }\n\n        return ['query' => $query, 'pseudo_elements' => $pseudo_elements];\n    }\n\n    /**\n     * https://github.com/tenderlove/nokogiri/blob/master/lib/nokogiri/css/xpath_visitor.rb\n     *\n     * @param $expr\n     * @param bool $last\n     * @return string\n     */\n    protected function _selector_an_plus_b($expr, $last = false)\n    {\n        $expr = preg_replace(\"/\\s/\", \"\", $expr);\n        if (!preg_match(\"/^(?P<a>-?[0-9]*)?n(?P<b>[-+]?[0-9]+)?$/\", $expr, $matches)) {\n            return \"false()\";\n        }\n\n        $a = ((isset($matches[\"a\"]) && $matches[\"a\"] !== \"\") ? intval($matches[\"a\"]) : 1);\n        $b = ((isset($matches[\"b\"]) && $matches[\"b\"] !== \"\") ? intval($matches[\"b\"]) : 0);\n\n        $position = ($last ? \"(last()-position()+1)\" : \"position()\");\n\n        if ($b == 0) {\n            return \"($position mod $a) = 0\";\n        } else {\n            $compare = (($a < 0) ? \"<=\" : \">=\");\n            $b2 = -$b;\n            if ($b2 >= 0) {\n                $b2 = \"+$b2\";\n            }\n            return \"($position $compare $b) and ((($position $b2) mod \" . abs($a) . \") = 0)\";\n        }\n    }\n\n    /**\n     * applies all current styles to a particular document tree\n     *\n     * apply_styles() applies all currently loaded styles to the provided\n     * {@link FrameTree}.  Aside from parsing CSS, this is the main purpose\n     * of this class.\n     *\n     * @param \\Dompdf\\Frame\\FrameTree $tree\n     */\n    function apply_styles(FrameTree $tree)\n    {\n        // Use XPath to select nodes.  This would be easier if we could attach\n        // Frame objects directly to DOMNodes using the setUserData() method, but\n        // we can't do that just yet.  Instead, we set a _node attribute_ in\n        // Frame->set_id() and use that as a handle on the Frame object via\n        // FrameTree::$_registry.\n\n        // We create a scratch array of styles indexed by frame id.  Once all\n        // styles have been assigned, we order the cached styles by specificity\n        // and create a final style object to assign to the frame.\n\n        // FIXME: this is not particularly robust...\n\n        $styles = [];\n        $xp = new DOMXPath($tree->get_dom());\n        $DEBUGCSS = $this->_dompdf->getOptions()->getDebugCss();\n\n        // Add generated content\n        foreach ($this->_styles as $selector => $selector_styles) {\n            /** @var Style $style */\n            foreach ($selector_styles as $style) {\n                if (strpos($selector, \":before\") === false && strpos($selector, \":after\") === false) {\n                    continue;\n                }\n\n                $query = $this->_css_selector_to_xpath($selector, true);\n\n                // Retrieve the nodes, limit to body for generated content\n                //TODO: If we use a context node can we remove the leading dot?\n                $nodes = @$xp->query('.' . $query[\"query\"]);\n                if ($nodes === false) {\n                    Helpers::record_warnings(E_USER_WARNING, \"The CSS selector '$selector' is not valid\", __FILE__, __LINE__);\n                    continue;\n                }\n\n                /** @var \\DOMElement $node */\n                foreach ($nodes as $node) {\n                    // Only DOMElements get styles\n                    if ($node->nodeType != XML_ELEMENT_NODE) {\n                        continue;\n                    }\n\n                    foreach (array_keys($query[\"pseudo_elements\"], true, true) as $pos) {\n                        // Do not add a new pseudo element if another one already matched\n                        if ($node->hasAttribute(\"dompdf_{$pos}_frame_id\")) {\n                            continue;\n                        }\n\n                        if (($src = $this->resolve_url($style->get_prop('content'))) !== \"none\") {\n                            $new_node = $node->ownerDocument->createElement(\"img_generated\");\n                            $new_node->setAttribute(\"src\", $src);\n                        } else {\n                            $new_node = $node->ownerDocument->createElement(\"dompdf_generated\");\n                        }\n\n                        $new_node->setAttribute($pos, $pos);\n                        $new_frame_id = $tree->insert_node($node, $new_node, $pos);\n                        $node->setAttribute(\"dompdf_{$pos}_frame_id\", $new_frame_id);\n                    }\n                }\n            }\n        }\n\n        // Apply all styles in stylesheet\n        foreach ($this->_styles as $selector => $selector_styles) {\n            /** @var Style $style */\n            foreach ($selector_styles as $style) {\n                $query = $this->_css_selector_to_xpath($selector);\n\n                // Retrieve the nodes\n                $nodes = @$xp->query($query[\"query\"]);\n                if ($nodes === false) {\n                    Helpers::record_warnings(E_USER_WARNING, \"The CSS selector '$selector' is not valid\", __FILE__, __LINE__);\n                    continue;\n                }\n\n                $spec = $this->_specificity($selector, $style->get_origin());\n\n                foreach ($nodes as $node) {\n                    // Retrieve the node id\n                    // Only DOMElements get styles\n                    if ($node->nodeType != XML_ELEMENT_NODE) {\n                        continue;\n                    }\n\n                    $id = $node->getAttribute(\"frame_id\");\n\n                    // Assign the current style to the scratch array\n                    $styles[$id][$spec][] = $style;\n                }\n            }\n        }\n\n        // Set the page width, height, and orientation based on the canvas paper size\n        $canvas = $this->_dompdf->getCanvas();\n        $paper_width = $canvas->get_width();\n        $paper_height = $canvas->get_height();\n        $paper_orientation = ($paper_width > $paper_height ? \"landscape\" : \"portrait\");\n\n        if ($this->_page_styles[\"base\"] && is_array($this->_page_styles[\"base\"]->size)) {\n            $paper_width = $this->_page_styles['base']->size[0];\n            $paper_height = $this->_page_styles['base']->size[1];\n            $paper_orientation = ($paper_width > $paper_height ? \"landscape\" : \"portrait\");\n        }\n\n        // Now create the styles and assign them to the appropriate frames. (We\n        // iterate over the tree using an implicit FrameTree iterator.)\n        $root_flg = false;\n        foreach ($tree->get_frames() as $frame) {\n            // Helpers::pre_r($frame->get_node()->nodeName . \":\");\n            if (!$root_flg && $this->_page_styles[\"base\"]) {\n                $style = $this->_page_styles[\"base\"];\n            } else {\n                $style = $this->create_style();\n            }\n\n            // Find nearest DOMElement parent\n            $p = $frame;\n            while ($p = $p->get_parent()) {\n                if ($p->get_node()->nodeType == XML_ELEMENT_NODE) {\n                    break;\n                }\n            }\n\n            // Styles can only be applied directly to DOMElements; anonymous\n            // frames inherit from their parent\n            if ($frame->get_node()->nodeType != XML_ELEMENT_NODE) {\n                if ($p) {\n                    $style->inherit($p->get_style());\n                }\n\n                $frame->set_style($style);\n                continue;\n            }\n\n            $id = $frame->get_id();\n\n            // Handle HTML 4.0 attributes\n            AttributeTranslator::translate_attributes($frame);\n            if (($str = $frame->get_node()->getAttribute(AttributeTranslator::$_style_attr)) !== \"\") {\n                $styles[$id][self::SPEC_NON_CSS][] = $this->_parse_properties($str);\n            }\n\n            // Locate any additional style attributes\n            if (($str = $frame->get_node()->getAttribute(\"style\")) !== \"\") {\n                // Destroy CSS comments\n                $str = preg_replace(\"'/\\*.*?\\*/'si\", \"\", $str);\n\n                $spec = $this->_specificity(\"!attr\", self::ORIG_AUTHOR);\n                $styles[$id][$spec][] = $this->_parse_properties($str);\n            }\n\n            // Grab the applicable styles\n            if (isset($styles[$id])) {\n\n                /** @var array[][] $applied_styles */\n                $applied_styles = $styles[$id];\n\n                // Sort by specificity\n                ksort($applied_styles);\n\n                if ($DEBUGCSS) {\n                    $debug_nodename = $frame->get_node()->nodeName;\n                    print \"<pre>\\n$debug_nodename [\\n\";\n                    foreach ($applied_styles as $spec => $arr) {\n                        printf(\"  specificity 0x%08x\\n\", $spec);\n                        /** @var Style $s */\n                        foreach ($arr as $s) {\n                            print \"  [\\n\";\n                            $s->debug_print();\n                            print \"  ]\\n\";\n                        }\n                    }\n                }\n\n                // Merge the new styles with the inherited styles\n                $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;\n                $acceptedmedia[] = $this->_dompdf->getOptions()->getDefaultMediaType();\n                foreach ($applied_styles as $arr) {\n                    /** @var Style $s */\n                    foreach ($arr as $s) {\n                        $media_queries = $s->get_media_queries();\n                        foreach ($media_queries as $media_query) {\n                            list($media_query_feature, $media_query_value) = $media_query;\n                            // if any of the Style's media queries fail then do not apply the style\n                            //TODO: When the media query logic is fully developed we should not apply the Style when any of the media queries fail or are bad, per https://www.w3.org/TR/css3-mediaqueries/#error-handling\n                            if (in_array($media_query_feature, self::$VALID_MEDIA_TYPES)) {\n                                if ((strlen($media_query_feature) === 0 && !in_array($media_query, $acceptedmedia)) || (in_array($media_query, $acceptedmedia) && $media_query_value == \"not\")) {\n                                    continue (3);\n                                }\n                            } else {\n                                switch ($media_query_feature) {\n                                    case \"height\":\n                                        if ($paper_height !== (float)$style->length_in_pt($media_query_value)) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    case \"min-height\":\n                                        if ($paper_height < (float)$style->length_in_pt($media_query_value)) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    case \"max-height\":\n                                        if ($paper_height > (float)$style->length_in_pt($media_query_value)) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    case \"width\":\n                                        if ($paper_width !== (float)$style->length_in_pt($media_query_value)) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    case \"min-width\":\n                                        //if (min($paper_width, $media_query_width) === $paper_width) {\n                                        if ($paper_width < (float)$style->length_in_pt($media_query_value)) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    case \"max-width\":\n                                        //if (max($paper_width, $media_query_width) === $paper_width) {\n                                        if ($paper_width > (float)$style->length_in_pt($media_query_value)) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    case \"orientation\":\n                                        if ($paper_orientation !== $media_query_value) {\n                                            continue (3);\n                                        }\n                                        break;\n                                    default:\n                                        Helpers::record_warnings(E_USER_WARNING, \"Unknown media query: $media_query_feature\", __FILE__, __LINE__);\n                                        break;\n                                }\n                            }\n                        }\n\n                        $style->merge($s);\n                    }\n                }\n            }\n\n            // Inherit parent's styles if parent exists\n            if ($p) {\n                if ($DEBUGCSS) {\n                    print \"  inherit [\\n\";\n                    $p->get_style()->debug_print();\n                    print \"  ]\\n\";\n                }\n                $style->inherit($p->get_style());\n            }\n\n            if ($DEBUGCSS) {\n                print \"  DomElementStyle [\\n\";\n                $style->debug_print();\n                print \"  ]\\n\";\n                print \"]\\n</pre>\";\n            }\n\n            /*DEBUGCSS print: see below different print debugging method\n            Helpers::pre_r($frame->get_node()->nodeName . \":\");\n            echo \"<pre>\";\n            echo $style;\n            echo \"</pre>\";*/\n            $frame->set_style($style);\n\n            if (!$root_flg && $this->_page_styles[\"base\"]) {\n                $root_flg = true;\n\n                // set the page width, height, and orientation based on the parsed page style\n                if ($style->size !== \"auto\") {\n                    list($paper_width, $paper_height) = $style->size;\n                }\n                $paper_width = $paper_width - (float)$style->length_in_pt($style->margin_left) - (float)$style->length_in_pt($style->margin_right);\n                $paper_height = $paper_height - (float)$style->length_in_pt($style->margin_top) - (float)$style->length_in_pt($style->margin_bottom);\n                $paper_orientation = ($paper_width > $paper_height ? \"landscape\" : \"portrait\");\n            }\n        }\n\n        // We're done!  Clean out the registry of all styles since we\n        // won't be needing this later.\n        foreach (array_keys($this->_styles) as $key) {\n            $this->_styles[$key] = null;\n            unset($this->_styles[$key]);\n        }\n    }\n\n    /**\n     * parse a CSS string using a regex parser\n     * Called by {@link Stylesheet::parse_css()}\n     *\n     * @param string $str\n     *\n     * @throws Exception\n     */\n    private function _parse_css($str)\n    {\n        $str = trim($str);\n\n        // Destroy comments and remove HTML comments\n        $css = preg_replace([\n            \"'/\\*.*?\\*/'si\",\n            \"/^<!--/\",\n            \"/-->$/\"\n        ], \"\", $str);\n\n        // FIXME: handle '{' within strings, e.g. [attr=\"string {}\"]\n\n        // Something more legible:\n        $re =\n            \"/\\s*                                   # Skip leading whitespace                             \\n\" .\n            \"( @([^\\s{]+)\\s*([^{;]*) (?:;|({)) )?   # Match @rules followed by ';' or '{'                 \\n\" .\n            \"(?(1)                                  # Only parse sub-sections if we're in an @rule...     \\n\" .\n            \"  (?(4)                                # ...and if there was a leading '{'                   \\n\" .\n            \"    \\s*( (?:(?>[^{}]+) ({)?            # Parse rulesets and individual @page rules           \\n\" .\n            \"            (?(6) (?>[^}]*) }) \\s*)+?                                                        \\n\" .\n            \"       )                                                                                     \\n\" .\n            \"   })                                  # Balancing '}'                                       \\n\" .\n            \"|                                      # Branch to match regular rules (not preceded by '@') \\n\" .\n            \"([^{]*{[^}]*}))                        # Parse normal rulesets                               \\n\" .\n            \"/xs\";\n\n        if (preg_match_all($re, $css, $matches, PREG_SET_ORDER) === false) {\n            // An error occurred\n            throw new Exception(\"Error parsing css file: preg_match_all() failed.\");\n        }\n\n        // After matching, the array indices are set as follows:\n        //\n        // [0] => complete text of match\n        // [1] => contains '@import ...;' or '@media {' if applicable\n        // [2] => text following @ for cases where [1] is set\n        // [3] => media types or full text following '@import ...;'\n        // [4] => '{', if present\n        // [5] => rulesets within media rules\n        // [6] => '{', within media rules\n        // [7] => individual rules, outside of media rules\n        //\n\n        $media_query_regex = \"/(?:((only|not)?\\s*(\" . implode(\"|\", self::$VALID_MEDIA_TYPES) . \"))|(\\s*\\(\\s*((?:(min|max)-)?([\\w\\-]+))\\s*(?:\\:\\s*(.*?)\\s*)?\\)))/isx\";\n\n        //Helpers::pre_r($matches);\n        foreach ($matches as $match) {\n            $match[2] = trim($match[2]);\n\n            if ($match[2] !== \"\") {\n                // Handle @rules\n                switch ($match[2]) {\n\n                    case \"import\":\n                        $this->_parse_import($match[3]);\n                        break;\n\n                    case \"media\":\n                        $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;\n                        $acceptedmedia[] = $this->_dompdf->getOptions()->getDefaultMediaType();\n\n                        $media_queries = preg_split(\"/\\s*,\\s*/\", mb_strtolower(trim($match[3])));\n                        foreach ($media_queries as $media_query) {\n                            if (in_array($media_query, $acceptedmedia)) {\n                                //if we have a media type match go ahead and parse the stylesheet\n                                $this->_parse_sections($match[5]);\n                                break;\n                            } elseif (!in_array($media_query, self::$VALID_MEDIA_TYPES)) {\n                                // otherwise conditionally parse the stylesheet assuming there are parseable media queries\n                                if (preg_match_all($media_query_regex, $media_query, $media_query_matches, PREG_SET_ORDER) !== false) {\n                                    $mq = [];\n                                    foreach ($media_query_matches as $media_query_match) {\n                                        if (empty($media_query_match[1]) === false) {\n                                            $media_query_feature = strtolower($media_query_match[3]);\n                                            $media_query_value = strtolower($media_query_match[2]);\n                                            $mq[] = [$media_query_feature, $media_query_value];\n                                        } else if (empty($media_query_match[4]) === false) {\n                                            $media_query_feature = strtolower($media_query_match[5]);\n                                            $media_query_value = (array_key_exists(8, $media_query_match) ? strtolower($media_query_match[8]) : null);\n                                            $mq[] = [$media_query_feature, $media_query_value];\n                                        }\n                                    }\n                                    $this->_parse_sections($match[5], $mq);\n                                    break;\n                                }\n                            }\n                        }\n                        break;\n\n                    case \"page\":\n                        //This handles @page to be applied to page oriented media\n                        //Note: This has a reduced syntax:\n                        //@page { margin:1cm; color:blue; }\n                        //Not a sequence of styles like a full.css, but only the properties\n                        //of a single style, which is applied to the very first \"root\" frame before\n                        //processing other styles of the frame.\n                        //Working properties:\n                        // margin (for margin around edge of paper)\n                        // font-family (default font of pages)\n                        // color (default text color of pages)\n                        //Non working properties:\n                        // border\n                        // padding\n                        // background-color\n                        //Todo:Reason is unknown\n                        //Other properties (like further font or border attributes) not tested.\n                        //If a border or background color around each paper sheet is desired,\n                        //assign it to the <body> tag, possibly only for the css of the correct media type.\n\n                        // If the page has a name, skip the style.\n                        $page_selector = trim($match[3]);\n\n                        $key = null;\n                        switch ($page_selector) {\n                            case \"\":\n                                $key = \"base\";\n                                break;\n\n                            case \":left\":\n                            case \":right\":\n                            case \":odd\":\n                            case \":even\":\n                            /** @noinspection PhpMissingBreakStatementInspection */\n                            case \":first\":\n                                $key = $page_selector;\n                                break;\n\n                            default:\n                                break 2;\n                        }\n\n                        // Store the style for later...\n                        if (empty($this->_page_styles[$key])) {\n                            $this->_page_styles[$key] = $this->_parse_properties($match[5]);\n                        } else {\n                            $this->_page_styles[$key]->merge($this->_parse_properties($match[5]));\n                        }\n                        break;\n\n                    case \"font-face\":\n                        $this->_parse_font_face($match[5]);\n                        break;\n\n                    default:\n                        // ignore everything else\n                        break;\n                }\n\n                continue;\n            }\n\n            if ($match[7] !== \"\") {\n                $this->_parse_sections($match[7]);\n            }\n        }\n    }\n\n    /**\n     * Resolve the given `url()` declaration to an absolute URL.\n     *\n     * @param string|null $val The declaration to resolve in the context of the stylesheet.\n     * @return string The resolved URL, or `none`, if the value is `none`,\n     *         invalid, or points to a non-existent local file.\n     */\n    public function resolve_url($val): string\n    {\n        $DEBUGCSS = $this->_dompdf->getOptions()->getDebugCss();\n        $parsed_url = \"none\";\n\n        if (empty($val) || $val === \"none\") {\n            $path = \"none\";\n        } elseif (mb_strpos($val, \"url\") === false) {\n            $path = \"none\"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none\n        } else {\n            $val = preg_replace(\"/url\\(\\s*['\\\"]?([^'\\\")]+)['\\\"]?\\s*\\)/\", \"\\\\1\", trim($val));\n\n            // Resolve the url now in the context of the current stylesheet\n            $parsed_url = Helpers::explode_url($val);\n            $path = Helpers::build_url($this->_protocol,\n                $this->_base_host,\n                $this->_base_path,\n                $val);\n            if (($parsed_url[\"protocol\"] == \"\" || $parsed_url[\"protocol\"] == \"file://\") && ($this->_protocol == \"\" || $this->_protocol == \"file://\")) {\n                $path = realpath($path);\n                // If realpath returns FALSE then specifically state that there is no background image\n                if ($path === false) {\n                    $path = \"none\";\n                }\n            }\n        }\n        if ($DEBUGCSS) {\n            print \"<pre>[_image\\n\";\n            print_r($parsed_url);\n            print $this->_protocol . \"\\n\" . $this->_base_path . \"\\n\" . $path . \"\\n\";\n            print \"_image]</pre>\";\n        }\n        return $path;\n    }\n\n    /**\n     * parse @import{} sections\n     *\n     * @param string $url the url of the imported CSS file\n     */\n    private function _parse_import($url)\n    {\n        $arr = preg_split(\"/[\\s\\n,]/\", $url, -1, PREG_SPLIT_NO_EMPTY);\n        $url = array_shift($arr);\n        $accept = false;\n\n        if (count($arr) > 0) {\n            $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;\n            $acceptedmedia[] = $this->_dompdf->getOptions()->getDefaultMediaType();\n\n            // @import url media_type [media_type...]\n            foreach ($arr as $type) {\n                if (in_array(mb_strtolower(trim($type)), $acceptedmedia)) {\n                    $accept = true;\n                    break;\n                }\n            }\n\n        } else {\n            // unconditional import\n            $accept = true;\n        }\n\n        if ($accept) {\n            // Store our current base url properties in case the new url is elsewhere\n            $protocol = $this->_protocol;\n            $host = $this->_base_host;\n            $path = $this->_base_path;\n\n            // $url = str_replace(array('\"',\"url\", \"(\", \")\"), \"\", $url);\n            // If the protocol is php, assume that we will import using file://\n            // $url = Helpers::build_url($protocol == \"php://\" ? \"file://\" : $protocol, $host, $path, $url);\n            // Above does not work for subfolders and absolute urls.\n            // Todo: As above, do we need to replace php or file to an empty protocol for local files?\n\n            $url = $this->resolve_url($url);\n\n            $this->load_css_file($url);\n\n            // Restore the current base url\n            $this->_protocol = $protocol;\n            $this->_base_host = $host;\n            $this->_base_path = $path;\n        }\n    }\n\n    /**\n     * parse @font-face{} sections\n     * http://www.w3.org/TR/css3-fonts/#the-font-face-rule\n     *\n     * @param string $str CSS @font-face rules\n     */\n    private function _parse_font_face($str)\n    {\n        $descriptors = $this->_parse_properties($str);\n\n        preg_match_all(\"/(url|local)\\s*\\([\\\"\\']?([^\\\"\\'\\)]+)[\\\"\\']?\\)\\s*(format\\s*\\([\\\"\\']?([^\\\"\\'\\)]+)[\\\"\\']?\\))?/i\", $descriptors->src, $src);\n\n        $sources = [];\n        $valid_sources = [];\n\n        foreach ($src[0] as $i => $value) {\n            $source = [\n                \"local\" => strtolower($src[1][$i]) === \"local\",\n                \"uri\" => $src[2][$i],\n                \"format\" => strtolower($src[4][$i]),\n                \"path\" => Helpers::build_url($this->_protocol, $this->_base_host, $this->_base_path, $src[2][$i]),\n            ];\n\n            if (!$source[\"local\"] && in_array($source[\"format\"], [\"\", \"truetype\"])) {\n                $valid_sources[] = $source;\n            }\n\n            $sources[] = $source;\n        }\n\n        // No valid sources\n        if (empty($valid_sources)) {\n            return;\n        }\n\n        $style = [\n            \"family\" => $descriptors->get_font_family_raw(),\n            \"weight\" => $descriptors->font_weight,\n            \"style\" => $descriptors->font_style,\n        ];\n\n        $this->getFontMetrics()->registerFont($style, $valid_sources[0][\"path\"], $this->_dompdf->getHttpContext());\n    }\n\n    /**\n     * parse regular CSS blocks\n     *\n     * _parse_properties() creates a new Style object based on the provided\n     * CSS rules.\n     *\n     * @param string $str CSS rules\n     * @return Style\n     */\n    private function _parse_properties($str)\n    {\n        $properties = preg_split(\"/;(?=(?:[^\\(]*\\([^\\)]*\\))*(?![^\\)]*\\)))/\", $str);\n        $DEBUGCSS = $this->_dompdf->getOptions()->getDebugCss();\n\n        if ($DEBUGCSS) {\n            print '[_parse_properties';\n        }\n\n        // Create the style\n        $style = new Style($this, Stylesheet::ORIG_AUTHOR);\n\n        foreach ($properties as $prop) {\n            // If the $prop contains an url, the regex may be wrong\n            // @todo: fix the regex so that it works every time\n            /*if (strpos($prop, \"url(\") === false) {\n              if (preg_match(\"/([a-z-]+)\\s*:\\s*[^:]+$/i\", $prop, $m))\n                $prop = $m[0];\n            }*/\n            //A css property can have \" ! important\" appended (whitespace optional)\n            //strip this off to decode core of the property correctly.\n            //Pass on in the style to allow proper handling:\n            //!important properties can only be overridden by other !important ones.\n            //$style->$prop_name = is a shortcut of $style->__set($prop_name,$value);.\n            //If no specific set function available, set _props[\"prop_name\"]\n            //style is always copied completely, or $_props handled separately\n            //Therefore set a _important_props[\"prop_name\"]=true to indicate the modifier\n\n            /* Instead of short code, prefer the typical case with fast code\n          $important = preg_match(\"/(.*?)!\\s*important/\",$prop,$match);\n            if ( $important ) {\n              $prop = $match[1];\n            }\n            $prop = trim($prop);\n            */\n            if ($DEBUGCSS) print '(';\n\n            $important = false;\n            $prop = trim($prop);\n\n            if (substr($prop, -9) === 'important') {\n                $prop_tmp = rtrim(substr($prop, 0, -9));\n\n                if (substr($prop_tmp, -1) === '!') {\n                    $prop = rtrim(substr($prop_tmp, 0, -1));\n                    $important = true;\n                }\n            }\n\n            if ($prop === \"\") {\n                if ($DEBUGCSS) print 'empty)';\n                continue;\n            }\n\n            $i = mb_strpos($prop, \":\");\n            if ($i === false) {\n                if ($DEBUGCSS) print 'novalue' . $prop . ')';\n                continue;\n            }\n\n            $prop_name = rtrim(mb_strtolower(mb_substr($prop, 0, $i)));\n            $value = ltrim(mb_substr($prop, $i + 1));\n            if ($DEBUGCSS) print $prop_name . ':=' . $value . ($important ? '!IMPORTANT' : '') . ')';\n            //New style, anyway empty\n            //if ($important || !$style->important_get($prop_name) ) {\n            //$style->$prop_name = array($value,$important);\n            //assignment might be replaced by overloading through __set,\n            //and overloaded functions might check _important_props,\n            //therefore set _important_props first.\n            if ($important) {\n                $style->important_set($prop_name);\n            }\n            //For easier debugging, don't use overloading of assignments with __set\n            $style->$prop_name = $value;\n        }\n        if ($DEBUGCSS) print '_parse_properties]';\n\n        return $style;\n    }\n\n    /**\n     * parse selector + rulesets\n     *\n     * @param string $str CSS selectors and rulesets\n     * @param array $media_queries\n     */\n    private function _parse_sections($str, $media_queries = [])\n    {\n        // Pre-process: collapse all whitespace and strip whitespace around '>',\n        // '.', ':', '+', '~', '#'\n\n        $patterns = [\"/[\\\\s\\n]+/\", \"/\\\\s+([>.:+~#])\\\\s+/\"];\n        $replacements = [\" \", \"\\\\1\"];\n        $str = preg_replace($patterns, $replacements, $str);\n        $DEBUGCSS = $this->_dompdf->getOptions()->getDebugCss();\n\n        $sections = explode(\"}\", $str);\n        if ($DEBUGCSS) print '[_parse_sections';\n        foreach ($sections as $sect) {\n            $i = mb_strpos($sect, \"{\");\n            if ($i === false) { continue; }\n\n            //$selectors = explode(\",\", mb_substr($sect, 0, $i));\n            $selectors = preg_split(\"/,(?![^\\(]*\\))/\", mb_substr($sect, 0, $i), 0, PREG_SPLIT_NO_EMPTY);\n            if ($DEBUGCSS) print '[section';\n\n            $style = $this->_parse_properties(trim(mb_substr($sect, $i + 1)));\n\n            // Assign it to the selected elements\n            foreach ($selectors as $selector) {\n                $selector = trim($selector);\n\n                if ($selector == \"\") {\n                    if ($DEBUGCSS) print '#empty#';\n                    continue;\n                }\n                if ($DEBUGCSS) print '#' . $selector . '#';\n                //if ($DEBUGCSS) { if (strpos($selector,'p') !== false) print '!!!p!!!#'; }\n\n                //FIXME: tag the selector with a hash of the media query to separate it from non-conditional styles (?), xpath comments are probably not what we want to do here\n                if (count($media_queries) > 0) {\n                    $style->set_media_queries($media_queries);\n                }\n                $this->add_style($selector, $style);\n            }\n\n            if ($DEBUGCSS) {\n                print 'section]';\n            }\n        }\n\n        if ($DEBUGCSS) {\n            print \"_parse_sections]\\n\";\n        }\n    }\n\n    /**\n     * @return string\n     */\n    public function getDefaultStylesheet()\n    {\n        $options = $this->_dompdf->getOptions();\n        $rootDir = realpath($options->getRootDir());\n        return $rootDir . self::DEFAULT_STYLESHEET;\n    }\n\n    /**\n     * @param FontMetrics $fontMetrics\n     * @return $this\n     */\n    public function setFontMetrics(FontMetrics $fontMetrics)\n    {\n        $this->fontMetrics = $fontMetrics;\n        return $this;\n    }\n\n    /**\n     * @return FontMetrics\n     */\n    public function getFontMetrics()\n    {\n        return $this->fontMetrics;\n    }\n\n    /**\n     * dumps the entire stylesheet as a string\n     *\n     * Generates a string of each selector and associated style in the\n     * Stylesheet.  Useful for debugging.\n     *\n     * @return string\n     */\n    function __toString()\n    {\n        $str = \"\";\n        foreach ($this->_styles as $selector => $selector_styles) {\n            /** @var Style $style */\n            foreach ($selector_styles as $style) {\n                $str .= \"$selector => \" . $style->__toString() . \"\\n\";\n            }\n        }\n\n        return $str;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Dompdf.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\nuse DOMDocument;\nuse DOMNode;\nuse Dompdf\\Adapter\\CPDF;\nuse DOMXPath;\nuse Dompdf\\Frame\\Factory;\nuse Dompdf\\Frame\\FrameTree;\nuse HTML5_Tokenizer;\nuse HTML5_TreeBuilder;\nuse Dompdf\\Image\\Cache;\nuse Dompdf\\Css\\Stylesheet;\nuse Dompdf\\Helpers;\n\n/**\n * Dompdf - PHP5 HTML to PDF renderer\n *\n * Dompdf loads HTML and does its best to render it as a PDF.  It gets its\n * name from the new DomDocument PHP5 extension.  Source HTML is first\n * parsed by a DomDocument object.  Dompdf takes the resulting DOM tree and\n * attaches a {@link Frame} object to each node.  {@link Frame} objects store\n * positioning and layout information and each has a reference to a {@link\n * Style} object.\n *\n * Style information is loaded and parsed (see {@link Stylesheet}) and is\n * applied to the frames in the tree by using XPath.  CSS selectors are\n * converted into XPath queries, and the computed {@link Style} objects are\n * applied to the {@link Frame}s.\n *\n * {@link Frame}s are then decorated (in the design pattern sense of the\n * word) based on their CSS display property ({@link\n * http://www.w3.org/TR/CSS21/visuren.html#propdef-display}).\n * Frame_Decorators augment the basic {@link Frame} class by adding\n * additional properties and methods specific to the particular type of\n * {@link Frame}.  For example, in the CSS layout model, block frames\n * (display: block;) contain line boxes that are usually filled with text or\n * other inline frames.  The Block therefore adds a $lines\n * property as well as methods to add {@link Frame}s to lines and to add\n * additional lines.  {@link Frame}s also are attached to specific\n * AbstractPositioner and {@link AbstractFrameReflower} objects that contain the\n * positioining and layout algorithm for a specific type of frame,\n * respectively.  This is an application of the Strategy pattern.\n *\n * Layout, or reflow, proceeds recursively (post-order) starting at the root\n * of the document.  Space constraints (containing block width & height) are\n * pushed down, and resolved positions and sizes bubble up.  Thus, every\n * {@link Frame} in the document tree is traversed once (except for tables\n * which use a two-pass layout algorithm).  If you are interested in the\n * details, see the reflow() method of the Reflower classes.\n *\n * Rendering is relatively straightforward once layout is complete. {@link\n * Frame}s are rendered using an adapted {@link Cpdf} class, originally\n * written by Wayne Munro, http://www.ros.co.nz/pdf/.  (Some performance\n * related changes have been made to the original {@link Cpdf} class, and\n * the {@link Dompdf\\Adapter\\CPDF} class provides a simple, stateless interface to\n * PDF generation.)  PDFLib support has now also been added, via the {@link\n * Dompdf\\Adapter\\PDFLib}.\n *\n *\n * @package dompdf\n */\nclass Dompdf\n{\n    /**\n     * Version string for dompdf\n     *\n     * @var string\n     */\n    private $version = 'dompdf';\n\n    /**\n     * DomDocument representing the HTML document\n     *\n     * @var DOMDocument\n     */\n    private $dom;\n\n    /**\n     * FrameTree derived from the DOM tree\n     *\n     * @var FrameTree\n     */\n    private $tree;\n\n    /**\n     * Stylesheet for the document\n     *\n     * @var Stylesheet\n     */\n    private $css;\n\n    /**\n     * Actual PDF renderer\n     *\n     * @var Canvas\n     */\n    private $canvas;\n\n    /**\n     * Desired paper size ('letter', 'legal', 'A4', etc.)\n     *\n     * @var string|array\n     */\n    private $paperSize;\n\n    /**\n     * Paper orientation ('portrait' or 'landscape')\n     *\n     * @var string\n     */\n    private $paperOrientation = \"portrait\";\n\n    /**\n     * Callbacks on new page and new element\n     *\n     * @var array\n     */\n    private $callbacks = [];\n\n    /**\n     * Experimental caching capability\n     *\n     * @var string\n     */\n    private $cacheId;\n\n    /**\n     * Base hostname\n     *\n     * Used for relative paths/urls\n     * @var string\n     */\n    private $baseHost = \"\";\n\n    /**\n     * Absolute base path\n     *\n     * Used for relative paths/urls\n     * @var string\n     */\n    private $basePath = \"\";\n\n    /**\n     * Protocol used to request file (file://, http://, etc)\n     *\n     * @var string\n     */\n    private $protocol;\n\n    /**\n     * HTTP context created with stream_context_create()\n     * Will be used for file_get_contents\n     *\n     * @var resource\n     */\n    private $httpContext;\n\n    /**\n     * Timestamp of the script start time\n     *\n     * @var int\n     */\n    private $startTime = null;\n\n    /**\n     * The system's locale\n     *\n     * @var string\n     */\n    private $systemLocale = null;\n\n    /**\n     * The system's mbstring internal encoding\n     *\n     * @var string\n     */\n    private $mbstringEncoding = null;\n\n    /**\n     * The system's PCRE JIT configuration\n     *\n     * @var string\n     */\n    private $pcreJit = null;\n\n    /**\n     * The default view of the PDF in the viewer\n     *\n     * @var string\n     */\n    private $defaultView = \"Fit\";\n\n    /**\n     * The default view options of the PDF in the viewer\n     *\n     * @var array\n     */\n    private $defaultViewOptions = [];\n\n    /**\n     * Tells whether the DOM document is in quirksmode (experimental)\n     *\n     * @var bool\n     */\n    private $quirksmode = false;\n\n    /**\n    * Protocol whitelist\n    *\n    * Protocols and PHP wrappers allowed in URLs. Full support is not\n    * guaranteed for the protocols/wrappers contained in this array.\n    *\n    * @var array\n    */\n    private $allowedProtocols = [null, \"\", \"file://\", \"http://\", \"https://\"];\n\n    /**\n    * Local file extension whitelist\n    *\n    * File extensions supported by dompdf for local files.\n    *\n    * @var array\n    */\n    private $allowedLocalFileExtensions = [\"htm\", \"html\"];\n\n    /**\n     * @var array\n     */\n    private $messages = [];\n\n    /**\n     * @var Options\n     */\n    private $options;\n\n    /**\n     * @var FontMetrics\n     */\n    private $fontMetrics;\n\n    /**\n     * The list of built-in fonts\n     *\n     * @var array\n     * @deprecated\n     */\n    public static $native_fonts = [\n        \"courier\", \"courier-bold\", \"courier-oblique\", \"courier-boldoblique\",\n        \"helvetica\", \"helvetica-bold\", \"helvetica-oblique\", \"helvetica-boldoblique\",\n        \"times-roman\", \"times-bold\", \"times-italic\", \"times-bolditalic\",\n        \"symbol\", \"zapfdinbats\"\n    ];\n\n    /**\n     * The list of built-in fonts\n     *\n     * @var array\n     */\n    public static $nativeFonts = [\n        \"courier\", \"courier-bold\", \"courier-oblique\", \"courier-boldoblique\",\n        \"helvetica\", \"helvetica-bold\", \"helvetica-oblique\", \"helvetica-boldoblique\",\n        \"times-roman\", \"times-bold\", \"times-italic\", \"times-bolditalic\",\n        \"symbol\", \"zapfdinbats\"\n    ];\n\n    /**\n     * Class constructor\n     *\n     * @param array|Options $options\n     */\n    public function __construct($options = null)\n    {\n        if (isset($options) && $options instanceof Options) {\n            $this->setOptions($options);\n        } elseif (is_array($options)) {\n            $this->setOptions(new Options($options));\n        } else {\n            $this->setOptions(new Options());\n        }\n\n        $versionFile = realpath(__DIR__ . '/../VERSION');\n        if (file_exists($versionFile) && ($version = trim(file_get_contents($versionFile))) !== false && $version !== '$Format:<%h>$') {\n            $this->version = sprintf('dompdf %s', $version);\n        }\n\n        $this->setPhpConfig();\n\n        $this->paperSize = $this->options->getDefaultPaperSize();\n        $this->paperOrientation = $this->options->getDefaultPaperOrientation();\n\n        $this->setCanvas(CanvasFactory::get_instance($this, $this->paperSize, $this->paperOrientation));\n        $this->setFontMetrics(new FontMetrics($this->getCanvas(), $this->getOptions()));\n        $this->css = new Stylesheet($this);\n\n        $this->restorePhpConfig();\n    }\n\n    /**\n     * Save the system's existing locale, PCRE JIT, and MBString encoding\n     * configuration and configure the system for Dompdf processing\n     */\n    private function setPhpConfig()\n    {\n        if (sprintf('%.1f', 1.0) !== '1.0') {\n            $this->systemLocale = setlocale(LC_NUMERIC, \"0\");\n            setlocale(LC_NUMERIC, \"C\");\n        }\n\n        if (version_compare(PHP_VERSION, '7.0.0') >= 0) {\n            $this->pcreJit = @ini_get('pcre.jit');\n            @ini_set('pcre.jit', '0');\n        }\n\n        $this->mbstringEncoding = mb_internal_encoding();\n        mb_internal_encoding('UTF-8');\n    }\n\n    /**\n     * Restore the system's locale configuration\n     */\n    private function restorePhpConfig()\n    {\n        if (!empty($this->systemLocale)) {\n            setlocale(LC_NUMERIC, $this->systemLocale);\n            $this->systemLocale = null;\n        }\n\n        if (!empty($this->pcreJit)) {\n            @ini_set('pcre.jit', $this->pcreJit);\n            $this->pcreJit = null;\n        }\n\n        if (!empty($this->mbstringEncoding)) {\n            mb_internal_encoding($this->mbstringEncoding);\n            $this->mbstringEncoding = null;\n        }\n    }\n\n    /**\n     * @param $file\n     * @deprecated\n     */\n    public function load_html_file($file)\n    {\n        $this->loadHtmlFile($file);\n    }\n\n    /**\n     * Loads an HTML file\n     * Parse errors are stored in the global array _dompdf_warnings.\n     *\n     * @param string $file a filename or url to load\n     * @param string $encoding Encoding of $file\n     *\n     * @throws Exception\n     */\n    public function loadHtmlFile($file, $encoding = null)\n    {\n        $this->setPhpConfig();\n\n        if (!$this->protocol && !$this->baseHost && !$this->basePath) {\n            [$this->protocol, $this->baseHost, $this->basePath] = Helpers::explode_url($file);\n        }\n        $protocol = strtolower($this->protocol);\n        \n        $uri = Helpers::build_url($this->protocol, $this->baseHost, $this->basePath, $file);\n\n        if ( !in_array($protocol, $this->allowedProtocols) ) {\n            throw new Exception(\"Permission denied on $file. The communication protocol is not supported.\");\n        }\n\n        if (!$this->options->isRemoteEnabled() && ($protocol != \"\" && $protocol !== \"file://\")) {\n            throw new Exception(\"Remote file requested, but remote file download is disabled.\");\n        }\n\n        if ($protocol == \"\" || $protocol === \"file://\") {\n            $realfile = realpath($uri);\n\n            $chroot = $this->options->getChroot();\n            $chrootValid = false;\n            foreach ($chroot as $chrootPath) {\n                $chrootPath = realpath($chrootPath);\n                if ($chrootPath !== false && strpos($realfile, $chrootPath) === 0) {\n                    $chrootValid = true;\n                    break;\n                }\n            }\n            if ($chrootValid !== true) {\n                throw new Exception(\"Permission denied on $file. The file could not be found under the paths specified by Options::chroot.\");\n            }\n\n            $ext = strtolower(pathinfo($realfile, PATHINFO_EXTENSION));\n            if (!in_array($ext, $this->allowedLocalFileExtensions)) {\n                throw new Exception(\"Permission denied on $file. This file extension is forbidden\");\n            }\n\n            if (!$realfile) {\n                throw new Exception(\"File '$file' not found.\");\n            }\n\n            $uri = $realfile;\n        }\n\n        [$contents, $http_response_header] = Helpers::getFileContent($uri, $this->httpContext);\n        if (empty($contents)) {\n            throw new Exception(\"File '$file' not found.\");\n        }\n\n        // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/\n        if (isset($http_response_header)) {\n            foreach ($http_response_header as $_header) {\n                if (preg_match(\"@Content-Type:\\s*[\\w/]+;\\s*?charset=([^\\s]+)@i\", $_header, $matches)) {\n                    $encoding = strtoupper($matches[1]);\n                    break;\n                }\n            }\n        }\n\n        $this->restorePhpConfig();\n\n        $this->loadHtml($contents, $encoding);\n    }\n\n    /**\n     * @param string $str\n     * @param string $encoding\n     * @deprecated\n     */\n    public function load_html($str, $encoding = null)\n    {\n        $this->loadHtml($str, $encoding);\n    }\n\n    public function loadDOM($doc, $quirksmode = false) {\n        // Remove #text children nodes in nodes that shouldn't have\n        $tag_names = [\"html\", \"head\", \"table\", \"tbody\", \"thead\", \"tfoot\", \"tr\"];\n        foreach ($tag_names as $tag_name) {\n            $nodes = $doc->getElementsByTagName($tag_name);\n\n            foreach ($nodes as $node) {\n                self::removeTextNodes($node);\n            }\n        }\n\n        $this->dom = $doc;\n        $this->quirksmode = $quirksmode;\n        $this->tree = new FrameTree($this->dom);\n    }\n\n    /**\n     * Loads an HTML string\n     * Parse errors are stored in the global array _dompdf_warnings.\n     *\n     * @param string $str HTML text to load\n     * @param string $encoding Encoding of $str\n     */\n    public function loadHtml($str, $encoding = null)\n    {\n        $this->setPhpConfig();\n\n        // Determine character encoding when $encoding parameter not used\n        if ($encoding === null) {\n            mb_detect_order('auto');\n            if (($encoding = mb_detect_encoding($str, null, true)) === false) {\n\n                //\"auto\" is expanded to \"ASCII,JIS,UTF-8,EUC-JP,SJIS\"\n                $encoding = \"auto\";\n            }\n        }\n\n        if (in_array(strtoupper($encoding), array('UTF-8','UTF8')) === false) {\n            $str = mb_convert_encoding($str, 'UTF-8', $encoding);\n\n            //Update encoding after converting\n            $encoding = 'UTF-8';\n        }\n\n        $metatags = [\n            '@<meta\\s+http-equiv=\"Content-Type\"\\s+content=\"(?:[\\w/]+)(?:;\\s*?charset=([^\\s\"]+))?@i',\n            '@<meta\\s+content=\"(?:[\\w/]+)(?:;\\s*?charset=([^\\s\"]+))\"?\\s+http-equiv=\"Content-Type\"@i',\n            '@<meta [^>]*charset\\s*=\\s*[\"\\']?\\s*([^\"\\' ]+)@i',\n        ];\n        foreach ($metatags as $metatag) {\n            if (preg_match($metatag, $str, $matches)) {\n                if (isset($matches[1]) && in_array($matches[1], mb_list_encodings())) {\n                    $document_encoding = $matches[1];\n                    break;\n                }\n            }\n        }\n        if (isset($document_encoding) && in_array(strtoupper($document_encoding), ['UTF-8','UTF8']) === false) {\n            $str = preg_replace('/charset=([^\\s\"]+)/i', 'charset=UTF-8', $str);\n        } elseif (isset($document_encoding) === false && strpos($str, '<head>') !== false) {\n            $str = str_replace('<head>', '<head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">', $str);\n        } elseif (isset($document_encoding) === false) {\n            $str = '<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">' . $str;\n        }\n\n        // remove BOM mark from UTF-8, it's treated as document text by DOMDocument\n        // FIXME: roll this into the encoding detection using UTF-8/16/32 BOM (http://us2.php.net/manual/en/function.mb-detect-encoding.php#91051)?\n        if (substr($str, 0, 3) == chr(0xEF) . chr(0xBB) . chr(0xBF)) {\n            $str = substr($str, 3);\n        }\n\n        // Store parsing warnings as messages\n        set_error_handler([Helpers::class, 'record_warnings']);\n\n        try {\n            // @todo Take the quirksmode into account\n            // http://hsivonen.iki.fi/doctype/\n            // https://developer.mozilla.org/en/mozilla's_quirks_mode\n            $quirksmode = false;\n\n            if ($this->options->isHtml5ParserEnabled() && class_exists(HTML5_Tokenizer::class)) {\n                $tokenizer = new HTML5_Tokenizer($str);\n                $tokenizer->parse();\n                $doc = $tokenizer->save();\n\n                $quirksmode = ($tokenizer->getTree()->getQuirksMode() > HTML5_TreeBuilder::NO_QUIRKS);\n            } else {\n                // loadHTML assumes ISO-8859-1 unless otherwise specified on the HTML document header.\n                // http://devzone.zend.com/1538/php-dom-xml-extension-encoding-processing/ (see #4)\n                // http://stackoverflow.com/a/11310258/264628\n                $doc = new DOMDocument(\"1.0\", $encoding);\n                $doc->preserveWhiteSpace = true;\n                $doc->loadHTML($str);\n                $doc->encoding = $encoding;\n\n                // If some text is before the doctype, we are in quirksmode\n                if (preg_match(\"/^(.+)<!doctype/i\", ltrim($str), $matches)) {\n                    $quirksmode = true;\n                } // If no doctype is provided, we are in quirksmode\n                elseif (!preg_match(\"/^<!doctype/i\", ltrim($str), $matches)) {\n                    $quirksmode = true;\n                } else {\n                    // HTML5 <!DOCTYPE html>\n                    if (!$doc->doctype->publicId && !$doc->doctype->systemId) {\n                        $quirksmode = false;\n                    }\n\n                    // not XHTML\n                    if (!preg_match(\"/xhtml/i\", $doc->doctype->publicId)) {\n                        $quirksmode = true;\n                    }\n                }\n            }\n\n            $this->loadDOM($doc, $quirksmode);\n        } finally {\n            restore_error_handler();\n            $this->restorePhpConfig();\n        }\n    }\n\n    /**\n     * @param DOMNode $node\n     * @deprecated\n     */\n    public static function remove_text_nodes(DOMNode $node)\n    {\n        self::removeTextNodes($node);\n    }\n\n    /**\n     * @param DOMNode $node\n     */\n    public static function removeTextNodes(DOMNode $node)\n    {\n        $children = [];\n        for ($i = 0; $i < $node->childNodes->length; $i++) {\n            $child = $node->childNodes->item($i);\n            if ($child->nodeName === \"#text\") {\n                $children[] = $child;\n            }\n        }\n\n        foreach ($children as $child) {\n            $node->removeChild($child);\n        }\n    }\n\n    /**\n     * Builds the {@link FrameTree}, loads any CSS and applies the styles to\n     * the {@link FrameTree}\n     */\n    private function processHtml()\n    {\n        $this->tree->build_tree();\n\n        $this->css->load_css_file($this->css->getDefaultStylesheet(), Stylesheet::ORIG_UA);\n\n        $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES;\n        $acceptedmedia[] = $this->options->getDefaultMediaType();\n\n        // <base href=\"\" />\n        $base_nodes = $this->dom->getElementsByTagName(\"base\");\n        if ($base_nodes->length && ($href = $base_nodes->item(0)->getAttribute(\"href\"))) {\n            [$this->protocol, $this->baseHost, $this->basePath] = Helpers::explode_url($href);\n        }\n\n        // Set the base path of the Stylesheet to that of the file being processed\n        $this->css->set_protocol($this->protocol);\n        $this->css->set_host($this->baseHost);\n        $this->css->set_base_path($this->basePath);\n\n        // Get all the stylesheets so that they are processed in document order\n        $xpath = new DOMXPath($this->dom);\n        $stylesheets = $xpath->query(\"//*[name() = 'link' or name() = 'style']\");\n\n        /** @var \\DOMElement $tag */\n        foreach ($stylesheets as $tag) {\n            switch (strtolower($tag->nodeName)) {\n                // load <link rel=\"STYLESHEET\" ... /> tags\n                case \"link\":\n                    if (mb_strtolower(stripos($tag->getAttribute(\"rel\"), \"stylesheet\") !== false) || // may be \"appendix stylesheet\"\n                        mb_strtolower($tag->getAttribute(\"type\")) === \"text/css\"\n                    ) {\n                        //Check if the css file is for an accepted media type\n                        //media not given then always valid\n                        $formedialist = preg_split(\"/[\\s\\n,]/\", $tag->getAttribute(\"media\"), -1, PREG_SPLIT_NO_EMPTY);\n                        if (count($formedialist) > 0) {\n                            $accept = false;\n                            foreach ($formedialist as $type) {\n                                if (in_array(mb_strtolower(trim($type)), $acceptedmedia)) {\n                                    $accept = true;\n                                    break;\n                                }\n                            }\n\n                            if (!$accept) {\n                                //found at least one mediatype, but none of the accepted ones\n                                //Skip this css file.\n                                break;\n                            }\n                        }\n\n                        $url = $tag->getAttribute(\"href\");\n                        $url = Helpers::build_url($this->protocol, $this->baseHost, $this->basePath, $url);\n\n                        $this->css->load_css_file($url, Stylesheet::ORIG_AUTHOR);\n                    }\n                    break;\n\n                // load <style> tags\n                case \"style\":\n                    // Accept all <style> tags by default (note this is contrary to W3C\n                    // HTML 4.0 spec:\n                    // http://www.w3.org/TR/REC-html40/present/styles.html#adef-media\n                    // which states that the default media type is 'screen'\n                    if ($tag->hasAttributes() &&\n                        ($media = $tag->getAttribute(\"media\")) &&\n                        !in_array($media, $acceptedmedia)\n                    ) {\n                        break;\n                    }\n\n                    $css = \"\";\n                    if ($tag->hasChildNodes()) {\n                        $child = $tag->firstChild;\n                        while ($child) {\n                            $css .= $child->nodeValue; // Handle <style><!-- blah --></style>\n                            $child = $child->nextSibling;\n                        }\n                    } else {\n                        $css = $tag->nodeValue;\n                    }\n\n                    // Set the base path of the Stylesheet to that of the file being processed\n                    $this->css->set_protocol($this->protocol);\n                    $this->css->set_host($this->baseHost);\n                    $this->css->set_base_path($this->basePath);\n\n                    $this->css->load_css($css, Stylesheet::ORIG_AUTHOR);\n                    break;\n            }\n\n            // Set the base path of the Stylesheet to that of the file being processed\n            $this->css->set_protocol($this->protocol);\n            $this->css->set_host($this->baseHost);\n            $this->css->set_base_path($this->basePath);\n        }\n    }\n\n    /**\n     * @param string $cacheId\n     * @deprecated\n     */\n    public function enable_caching($cacheId)\n    {\n        $this->enableCaching($cacheId);\n    }\n\n    /**\n     * Enable experimental caching capability\n     *\n     * @param string $cacheId\n     */\n    public function enableCaching($cacheId)\n    {\n        $this->cacheId = $cacheId;\n    }\n\n    /**\n     * @param string $value\n     * @return bool\n     * @deprecated\n     */\n    public function parse_default_view($value)\n    {\n        return $this->parseDefaultView($value);\n    }\n\n    /**\n     * @param string $value\n     * @return bool\n     */\n    public function parseDefaultView($value)\n    {\n        $valid = [\"XYZ\", \"Fit\", \"FitH\", \"FitV\", \"FitR\", \"FitB\", \"FitBH\", \"FitBV\"];\n\n        $options = preg_split(\"/\\s*,\\s*/\", trim($value));\n        $defaultView = array_shift($options);\n\n        if (!in_array($defaultView, $valid)) {\n            return false;\n        }\n\n        $this->setDefaultView($defaultView, $options);\n        return true;\n    }\n\n    /**\n     * Renders the HTML to PDF\n     */\n    public function render()\n    {\n        $this->setPhpConfig();\n        $options = $this->options;\n\n        $logOutputFile = $options->getLogOutputFile();\n        if ($logOutputFile) {\n            if (!file_exists($logOutputFile) && is_writable(dirname($logOutputFile))) {\n                touch($logOutputFile);\n            }\n\n            $this->startTime = microtime(true);\n            if (is_writable($logOutputFile)) {\n                ob_start();\n            }\n        }\n\n        $this->processHtml();\n\n        $this->css->apply_styles($this->tree);\n\n        // @page style rules : size, margins\n        $pageStyles = $this->css->get_page_styles();\n        $basePageStyle = $pageStyles[\"base\"];\n        unset($pageStyles[\"base\"]);\n\n        foreach ($pageStyles as $pageStyle) {\n            $pageStyle->inherit($basePageStyle);\n        }\n\n        $defaultOptionPaperSize = $this->getPaperSize($options->getDefaultPaperSize());\n        // If there is a CSS defined paper size compare to the paper size used to create the canvas to determine a\n        // recreation need\n        if (is_array($basePageStyle->size)) {\n            $basePageStyleSize = $basePageStyle->size;\n            $this->setPaper([0, 0, $basePageStyleSize[0], $basePageStyleSize[1]]);\n        }\n\n        $paperSize = $this->getPaperSize();\n        if (\n            $defaultOptionPaperSize[2] !== $paperSize[2] ||\n            $defaultOptionPaperSize[3] !== $paperSize[3] ||\n            $options->getDefaultPaperOrientation() !== $this->paperOrientation\n        ) {\n            $this->setCanvas(CanvasFactory::get_instance($this, $this->paperSize, $this->paperOrientation));\n            $this->fontMetrics->setCanvas($this->getCanvas());\n        }\n\n        $canvas = $this->getCanvas();\n\n        $root = null;\n\n        foreach ($this->tree->get_frames() as $frame) {\n            // Set up the root frame\n            if (is_null($root)) {\n                $root = Factory::decorate_root($this->tree->get_root(), $this);\n                continue;\n            }\n\n            // Create the appropriate decorators, reflowers & positioners.\n            Factory::decorate_frame($frame, $this, $root);\n        }\n\n        // Add meta information\n        $title = $this->dom->getElementsByTagName(\"title\");\n        if ($title->length) {\n            $canvas->add_info(\"Title\", trim($title->item(0)->nodeValue));\n        }\n\n        $metas = $this->dom->getElementsByTagName(\"meta\");\n        $labels = [\n            \"author\" => \"Author\",\n            \"keywords\" => \"Keywords\",\n            \"description\" => \"Subject\",\n        ];\n        /** @var \\DOMElement $meta */\n        foreach ($metas as $meta) {\n            $name = mb_strtolower($meta->getAttribute(\"name\"));\n            $value = trim($meta->getAttribute(\"content\"));\n\n            if (isset($labels[$name])) {\n                $canvas->add_info($labels[$name], $value);\n                continue;\n            }\n\n            if ($name === \"dompdf.view\" && $this->parseDefaultView($value)) {\n                $canvas->set_default_view($this->defaultView, $this->defaultViewOptions);\n            }\n        }\n\n        $root->set_containing_block(0, 0, $canvas->get_width(), $canvas->get_height());\n        $root->set_renderer(new Renderer($this));\n\n        // This is where the magic happens:\n        $root->reflow();\n\n        // Clean up cached images\n        Cache::clear();\n\n        global $_dompdf_warnings, $_dompdf_show_warnings;\n        if ($_dompdf_show_warnings && isset($_dompdf_warnings)) {\n            echo '<b>Dompdf Warnings</b><br><pre>';\n            foreach ($_dompdf_warnings as $msg) {\n                echo $msg . \"\\n\";\n            }\n\n            if ($canvas instanceof CPDF) {\n                echo $canvas->get_cpdf()->messages;\n            }\n            echo '</pre>';\n            flush();\n        }\n\n        if ($logOutputFile && is_writable($logOutputFile)) {\n            $this->write_log();\n            ob_end_clean();\n        }\n\n        $this->restorePhpConfig();\n    }\n\n    /**\n     * Add meta information to the PDF after rendering\n     */\n    public function add_info($label, $value)\n    {\n        $canvas = $this->getCanvas();\n        if (!is_null($canvas)) {\n            $canvas->add_info($label, $value);\n        }\n    }\n\n    /**\n     * Writes the output buffer in the log file\n     *\n     * @return void\n     */\n    private function write_log()\n    {\n        $log_output_file = $this->getOptions()->getLogOutputFile();\n        if (!$log_output_file || !is_writable($log_output_file)) {\n            return;\n        }\n\n        $frames = Frame::$ID_COUNTER;\n        $memory = memory_get_peak_usage(true) / 1024;\n        $time = (microtime(true) - $this->startTime) * 1000;\n\n        $out = sprintf(\n            \"<span style='color: #000' title='Frames'>%6d</span>\" .\n            \"<span style='color: #009' title='Memory'>%10.2f KB</span>\" .\n            \"<span style='color: #900' title='Time'>%10.2f ms</span>\" .\n            \"<span  title='Quirksmode'>  \" .\n            ($this->quirksmode ? \"<span style='color: #d00'> ON</span>\" : \"<span style='color: #0d0'>OFF</span>\") .\n            \"</span><br />\", $frames, $memory, $time);\n\n        $out .= ob_get_contents();\n        ob_clean();\n\n        file_put_contents($log_output_file, $out);\n    }\n\n    /**\n     * Streams the PDF to the client.\n     *\n     * The file will open a download dialog by default. The options\n     * parameter controls the output. Accepted options (array keys) are:\n     *\n     * 'compress' = > 1 (=default) or 0:\n     *   Apply content stream compression\n     *\n     * 'Attachment' => 1 (=default) or 0:\n     *   Set the 'Content-Disposition:' HTTP header to 'attachment'\n     *   (thereby causing the browser to open a download dialog)\n     *\n     * @param string $filename the name of the streamed file\n     * @param array $options header options (see above)\n     */\n    public function stream($filename = \"document.pdf\", $options = [])\n    {\n        $this->setPhpConfig();\n\n        $canvas = $this->getCanvas();\n        if (!is_null($canvas)) {\n            $canvas->stream($filename, $options);\n        }\n\n        $this->restorePhpConfig();\n    }\n\n    /**\n     * Returns the PDF as a string.\n     *\n     * The options parameter controls the output. Accepted options are:\n     *\n     * 'compress' = > 1 or 0 - apply content stream compression, this is\n     *    on (1) by default\n     *\n     * @param array $options options (see above)\n     *\n     * @return string|null\n     */\n    public function output($options = [])\n    {\n        $this->setPhpConfig();\n\n        $canvas = $this->getCanvas();\n        if (is_null($canvas)) {\n            return null;\n        }\n\n        $output = $canvas->output($options);\n\n        $this->restorePhpConfig();\n\n        return $output;\n    }\n\n    /**\n     * @return string\n     * @deprecated\n     */\n    public function output_html()\n    {\n        return $this->outputHtml();\n    }\n\n    /**\n     * Returns the underlying HTML document as a string\n     *\n     * @return string\n     */\n    public function outputHtml()\n    {\n        return $this->dom->saveHTML();\n    }\n\n    /**\n     * Get the dompdf option value\n     *\n     * @param string $key\n     * @return mixed\n     * @deprecated\n     */\n    public function get_option($key)\n    {\n        return $this->options->get($key);\n    }\n\n    /**\n     * @param string $key\n     * @param mixed $value\n     * @return $this\n     * @deprecated\n     */\n    public function set_option($key, $value)\n    {\n        $this->options->set($key, $value);\n        return $this;\n    }\n\n    /**\n     * @param array $options\n     * @return $this\n     * @deprecated\n     */\n    public function set_options(array $options)\n    {\n        $this->options->set($options);\n        return $this;\n    }\n\n    /**\n     * @param string $size\n     * @param string $orientation\n     * @deprecated\n     */\n    public function set_paper($size, $orientation = \"portrait\")\n    {\n        $this->setPaper($size, $orientation);\n    }\n\n    /**\n     * Sets the paper size & orientation\n     *\n     * @param string|array $size 'letter', 'legal', 'A4', etc. {@link Dompdf\\Adapter\\CPDF::$PAPER_SIZES}\n     * @param string $orientation 'portrait' or 'landscape'\n     * @return $this\n     */\n    public function setPaper($size, $orientation = \"portrait\")\n    {\n        $this->paperSize = $size;\n        $this->paperOrientation = $orientation;\n        return $this;\n    }\n\n    /**\n     * Gets the paper size\n     *\n     * @param null|string|array $paperSize\n     * @return int[] A four-element integer array\n     */\n    public function getPaperSize($paperSize = null)\n    {\n        $size = $paperSize !== null ? $paperSize : $this->paperSize;\n        if (is_array($size)) {\n            return $size;\n        } else if (isset(Adapter\\CPDF::$PAPER_SIZES[mb_strtolower($size)])) {\n            return Adapter\\CPDF::$PAPER_SIZES[mb_strtolower($size)];\n        } else {\n            return Adapter\\CPDF::$PAPER_SIZES[\"letter\"];\n        }\n    }\n\n    /**\n     * Gets the paper orientation\n     *\n     * @return string Either \"portrait\" or \"landscape\"\n     */\n    public function getPaperOrientation()\n    {\n        return $this->paperOrientation;\n    }\n\n    /**\n     * @param FrameTree $tree\n     * @return $this\n     */\n    public function setTree(FrameTree $tree)\n    {\n        $this->tree = $tree;\n        return $this;\n    }\n\n    /**\n     * @return FrameTree\n     * @deprecated\n     */\n    public function get_tree()\n    {\n        return $this->getTree();\n    }\n\n    /**\n     * Returns the underlying {@link FrameTree} object\n     *\n     * @return FrameTree\n     */\n    public function getTree()\n    {\n        return $this->tree;\n    }\n\n    /**\n     * @param string $protocol\n     * @return $this\n     * @deprecated\n     */\n    public function set_protocol($protocol)\n    {\n        return $this->setProtocol($protocol);\n    }\n\n    /**\n     * Sets the protocol to use\n     * FIXME validate these\n     *\n     * @param string $protocol\n     * @return $this\n     */\n    public function setProtocol($protocol)\n    {\n        $this->protocol = $protocol;\n        return $this;\n    }\n\n    /**\n     * @return string\n     * @deprecated\n     */\n    public function get_protocol()\n    {\n        return $this->getProtocol();\n    }\n\n    /**\n     * Returns the protocol in use\n     *\n     * @return string\n     */\n    public function getProtocol()\n    {\n        return $this->protocol;\n    }\n\n    /**\n     * @param string $host\n     * @deprecated\n     */\n    public function set_host($host)\n    {\n        $this->setBaseHost($host);\n    }\n\n    /**\n     * Sets the base hostname\n     *\n     * @param string $baseHost\n     * @return $this\n     */\n    public function setBaseHost($baseHost)\n    {\n        $this->baseHost = $baseHost;\n        return $this;\n    }\n\n    /**\n     * @return string\n     * @deprecated\n     */\n    public function get_host()\n    {\n        return $this->getBaseHost();\n    }\n\n    /**\n     * Returns the base hostname\n     *\n     * @return string\n     */\n    public function getBaseHost()\n    {\n        return $this->baseHost;\n    }\n\n    /**\n     * Sets the base path\n     *\n     * @param string $path\n     * @deprecated\n     */\n    public function set_base_path($path)\n    {\n        $this->setBasePath($path);\n    }\n\n    /**\n     * Sets the base path\n     *\n     * @param string $basePath\n     * @return $this\n     */\n    public function setBasePath($basePath)\n    {\n        $this->basePath = $basePath;\n        return $this;\n    }\n\n    /**\n     * @return string\n     * @deprecated\n     */\n    public function get_base_path()\n    {\n        return $this->getBasePath();\n    }\n\n    /**\n     * Returns the base path\n     *\n     * @return string\n     */\n    public function getBasePath()\n    {\n        return $this->basePath;\n    }\n\n    /**\n     * @param string $default_view The default document view\n     * @param array $options The view's options\n     * @return $this\n     * @deprecated\n     */\n    public function set_default_view($default_view, $options)\n    {\n        return $this->setDefaultView($default_view, $options);\n    }\n\n    /**\n     * Sets the default view\n     *\n     * @param string $defaultView The default document view\n     * @param array $options The view's options\n     * @return $this\n     */\n    public function setDefaultView($defaultView, $options)\n    {\n        $this->defaultView = $defaultView;\n        $this->defaultViewOptions = $options;\n        return $this;\n    }\n\n    /**\n     * @param resource $http_context\n     * @return $this\n     * @deprecated\n     */\n    public function set_http_context($http_context)\n    {\n        return $this->setHttpContext($http_context);\n    }\n\n    /**\n     * Sets the HTTP context\n     *\n     * @param resource $httpContext\n     * @return $this\n     */\n    public function setHttpContext($httpContext)\n    {\n        $this->httpContext = $httpContext;\n        return $this;\n    }\n\n    /**\n     * @return resource\n     * @deprecated\n     */\n    public function get_http_context()\n    {\n        return $this->getHttpContext();\n    }\n\n    /**\n     * Returns the HTTP context\n     *\n     * @return resource\n     */\n    public function getHttpContext()\n    {\n        return $this->httpContext;\n    }\n\n    /**\n     * @param Canvas $canvas\n     * @return $this\n     */\n    public function setCanvas(Canvas $canvas)\n    {\n        $this->canvas = $canvas;\n        return $this;\n    }\n\n    /**\n     * @return Canvas\n     * @deprecated\n     */\n    public function get_canvas()\n    {\n        return $this->getCanvas();\n    }\n\n    /**\n     * Return the underlying Canvas instance (e.g. Dompdf\\Adapter\\CPDF, Dompdf\\Adapter\\GD)\n     *\n     * @return Canvas\n     */\n    public function getCanvas()\n    {\n        return $this->canvas;\n    }\n\n    /**\n     * @param Stylesheet $css\n     * @return $this\n     */\n    public function setCss(Stylesheet $css)\n    {\n        $this->css = $css;\n        return $this;\n    }\n\n    /**\n     * @return Stylesheet\n     * @deprecated\n     */\n    public function get_css()\n    {\n        return $this->getCss();\n    }\n\n    /**\n     * Returns the stylesheet\n     *\n     * @return Stylesheet\n     */\n    public function getCss()\n    {\n        return $this->css;\n    }\n\n    /**\n     * @param DOMDocument $dom\n     * @return $this\n     */\n    public function setDom(DOMDocument $dom)\n    {\n        $this->dom = $dom;\n        return $this;\n    }\n\n    /**\n     * @return DOMDocument\n     * @deprecated\n     */\n    public function get_dom()\n    {\n        return $this->getDom();\n    }\n\n    /**\n     * @return DOMDocument\n     */\n    public function getDom()\n    {\n        return $this->dom;\n    }\n\n    /**\n     * @param Options $options\n     * @return $this\n     */\n    public function setOptions(Options $options)\n    {\n        $this->options = $options;\n        $fontMetrics = $this->getFontMetrics();\n        if (isset($fontMetrics)) {\n            $fontMetrics->setOptions($options);\n        }\n        return $this;\n    }\n\n    /**\n     * @return Options\n     */\n    public function getOptions()\n    {\n        return $this->options;\n    }\n\n    /**\n     * @return array\n     * @deprecated\n     */\n    public function get_callbacks()\n    {\n        return $this->getCallbacks();\n    }\n\n    /**\n     * Returns the callbacks array\n     *\n     * @return array\n     */\n    public function getCallbacks()\n    {\n        return $this->callbacks;\n    }\n\n    /**\n     * @param array $callbacks the set of callbacks to set\n     * @deprecated\n     */\n    public function set_callbacks($callbacks)\n    {\n        $this->setCallbacks($callbacks);\n    }\n\n    /**\n     * Sets callbacks for events like rendering of pages and elements.\n     * The callbacks array contains arrays with 'event' set to 'begin_page',\n     * 'end_page', 'begin_frame', or 'end_frame' and 'f' set to a function or\n     * object plus method to be called.\n     *\n     * The function 'f' must take an array as argument, which contains info\n     * about the event.\n     *\n     * @param array $callbacks the set of callbacks to set\n     */\n    public function setCallbacks($callbacks)\n    {\n        if (is_array($callbacks)) {\n            $this->callbacks = [];\n            foreach ($callbacks as $c) {\n                if (is_array($c) && isset($c['event']) && isset($c['f'])) {\n                    $event = $c['event'];\n                    $f = $c['f'];\n                    if (is_callable($f) && is_string($event)) {\n                        $this->callbacks[$event][] = $f;\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * @return boolean\n     * @deprecated\n     */\n    public function get_quirksmode()\n    {\n        return $this->getQuirksmode();\n    }\n\n    /**\n     * Get the quirks mode\n     *\n     * @return boolean true if quirks mode is active\n     */\n    public function getQuirksmode()\n    {\n        return $this->quirksmode;\n    }\n\n    /**\n     * @param FontMetrics $fontMetrics\n     * @return $this\n     */\n    public function setFontMetrics(FontMetrics $fontMetrics)\n    {\n        $this->fontMetrics = $fontMetrics;\n        return $this;\n    }\n\n    /**\n     * @return FontMetrics\n     */\n    public function getFontMetrics()\n    {\n        return $this->fontMetrics;\n    }\n\n    /**\n     * PHP5 overloaded getter\n     * Along with {@link Dompdf::__set()} __get() provides access to all\n     * properties directly.  Typically __get() is not called directly outside\n     * of this class.\n     *\n     * @param string $prop\n     *\n     * @throws Exception\n     * @return mixed\n     */\n    function __get($prop)\n    {\n        switch ($prop) {\n            case 'version':\n                return $this->version;\n            default:\n                throw new Exception('Invalid property: ' . $prop);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Exception/ImageException.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Exception;\n\nuse Dompdf\\Exception;\n\n/**\n * Image exception thrown by DOMPDF\n *\n * @package dompdf\n */\nclass ImageException extends Exception\n{\n\n    /**\n     * Class constructor\n     *\n     * @param string $message Error message\n     * @param int $code       Error code\n     */\n    function __construct($message = null, $code = 0)\n    {\n        parent::__construct($message, $code);\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Exception.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf;\n\n/**\n * Standard exception thrown by DOMPDF classes\n *\n * @package dompdf\n */\nclass Exception extends \\Exception\n{\n\n    /**\n     * Class constructor\n     *\n     * @param string $message Error message\n     * @param int $code       Error code\n     */\n    public function __construct($message = null, $code = 0)\n    {\n        parent::__construct($message, $code);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FontMetrics.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf;\n\nuse FontLib\\Font;\n\n/**\n * The font metrics class\n *\n * This class provides information about fonts and text.  It can resolve\n * font names into actual installed font files, as well as determine the\n * size of text in a particular font and size.\n *\n * @static\n * @package dompdf\n */\nclass FontMetrics\n{\n    /**\n     * Name of the font cache file\n     *\n     * This file must be writable by the webserver process only to update it\n     * with save_font_families() after adding the .afm file references of a new font family\n     * with FontMetrics::saveFontFamilies().\n     * This is typically done only from command line with load_font.php on converting\n     * ttf fonts to ufm with php-font-lib.\n     */\n    const CACHE_FILE = \"dompdf_font_family_cache.php\";\n\n    /**\n     * @var Canvas\n     * @deprecated\n     */\n    protected $pdf;\n\n    /**\n     * Underlying {@link Canvas} object to perform text size calculations\n     *\n     * @var Canvas\n     */\n    protected $canvas;\n\n    /**\n     * Array of font family names to font files\n     *\n     * Usually cached by the {@link load_font.php} script\n     *\n     * @var array\n     */\n    protected $fontLookup = [];\n\n    /**\n     * @var Options\n     */\n    private $options;\n\n    /**\n     * Class initialization\n     */\n    public function __construct(Canvas $canvas, Options $options)\n    {\n        $this->setCanvas($canvas);\n        $this->setOptions($options);\n        $this->loadFontFamilies();\n    }\n\n    /**\n     * @deprecated\n     */\n    public function save_font_families()\n    {\n        $this->saveFontFamilies();\n    }\n\n    /**\n     * Saves the stored font family cache\n     *\n     * The name and location of the cache file are determined by {@link\n     * FontMetrics::CACHE_FILE}. This file should be writable by the\n     * webserver process.\n     *\n     * @see FontMetrics::loadFontFamilies()\n     */\n    public function saveFontFamilies()\n    {\n        // replace the path to the DOMPDF font directories with the corresponding constants (allows for more portability)\n        $cacheData = sprintf(\"<?php return function (%s, %s) {%s\", '$fontDir', '$rootDir', PHP_EOL);\n        $cacheData .= sprintf(\"return array (%s\", PHP_EOL);\n        foreach ($this->fontLookup as $family => $variants) {\n            $cacheData .= sprintf(\"  '%s' => array(%s\", addslashes($family), PHP_EOL);\n            foreach ($variants as $variant => $path) {\n                $path = sprintf(\"'%s'\", $path);\n                $path = str_replace('\\'' . $this->options->getFontDir(), '$fontDir . \\'', $path);\n                $path = str_replace('\\'' . $this->options->getRootDir(), '$rootDir . \\'', $path);\n                $cacheData .= sprintf(\"    '%s' => %s,%s\", $variant, $path, PHP_EOL);\n            }\n            $cacheData .= sprintf(\"  ),%s\", PHP_EOL);\n        }\n        $cacheData .= \");\" . PHP_EOL;\n        $cacheData .= \"}; ?>\";\n        file_put_contents($this->getCacheFile(), $cacheData);\n    }\n\n    /**\n     * @deprecated\n     */\n    public function load_font_families()\n    {\n        $this->loadFontFamilies();\n    }\n\n    /**\n     * Loads the stored font family cache\n     *\n     * @see FontMetrics::saveFontFamilies()\n     */\n    public function loadFontFamilies()\n    {\n        $fontDir = $this->options->getFontDir();\n        $rootDir = $this->options->getRootDir();\n\n        // FIXME: temporarily define constants for cache files <= v0.6.2\n        if (!defined(\"DOMPDF_DIR\")) { define(\"DOMPDF_DIR\", $rootDir); }\n        if (!defined(\"DOMPDF_FONT_DIR\")) { define(\"DOMPDF_FONT_DIR\", $fontDir); }\n\n        $file = $rootDir . \"/lib/fonts/dompdf_font_family_cache.dist.php\";\n        $distFontsClosure = require $file;\n        $distFonts = $distFontsClosure($rootDir);\n\n        if (!is_readable($this->getCacheFile())) {\n            $this->fontLookup = $distFonts;\n            return;\n        }\n\n        $cacheDataClosure = require $this->getCacheFile();\n        $cacheData = is_array($cacheDataClosure) ? $cacheDataClosure : $cacheDataClosure($fontDir, $rootDir);\n\n        $this->fontLookup = [];\n        if (is_array($this->fontLookup)) {\n            foreach ($cacheData as $key => $value) {\n                $this->fontLookup[stripslashes($key)] = $value;\n            }\n        }\n\n        // Merge provided fonts\n        $this->fontLookup += $distFonts;\n    }\n\n    /**\n     * @param array $style\n     * @param string $remote_file\n     * @param resource $context\n     * @return bool\n     * @deprecated\n     */\n    public function register_font($style, $remote_file, $context = null)\n    {\n        return $this->registerFont($style, $remote_file);\n    }\n\n    /**\n     * @param array $style\n     * @param string $remoteFile\n     * @param resource $context\n     * @return bool\n     */\n    public function registerFont($style, $remoteFile, $context = null)\n    {\n        $fontname = mb_strtolower($style[\"family\"]);\n        $families = $this->getFontFamilies();\n\n        $entry = [];\n        if (isset($families[$fontname])) {\n            $entry = $families[$fontname];\n        }\n\n        $styleString = $this->getType(\"{$style['weight']} {$style['style']}\");\n\n        $fontDir = $this->options->getFontDir();\n        $remoteHash = md5($remoteFile);\n\n        $prefix = $fontname . \"_\" . $styleString;\n        $prefix = trim($prefix, \"-\");\n        if (function_exists('iconv')) {\n            $prefix = @iconv('utf-8', 'us-ascii//TRANSLIT', $prefix);\n        }\n        $prefix_encoding = mb_detect_encoding($prefix, mb_detect_order(), true);\n        $substchar = mb_substitute_character();\n        mb_substitute_character(0x005F);\n        $prefix = mb_convert_encoding($prefix, \"ISO-8859-1\", $prefix_encoding);\n        mb_substitute_character($substchar);\n        $prefix = preg_replace(\"[\\W]\", \"_\", $prefix);\n        $prefix = preg_replace(\"/[^-_\\w]+/\", \"\", $prefix);\n\n        $localFile = $fontDir . \"/\" . $prefix . \"_\" . $remoteHash;\n\n        if (isset($entry[$styleString]) && $localFile == $entry[$styleString]) {\n            return true;\n        }\n\n        $cacheEntry = $localFile;\n        $localFile .= \".\".strtolower(pathinfo(parse_url($remoteFile, PHP_URL_PATH), PATHINFO_EXTENSION));\n\n        $entry[$styleString] = $cacheEntry;\n\n        // Download the remote file\n        [$protocol, $baseHost, $basePath] = Helpers::explode_url($remoteFile);\n        if (!$this->options->isRemoteEnabled() && ($protocol != \"\" && $protocol !== \"file://\")) {\n            Helpers::record_warnings(E_USER_WARNING, \"Remote font resource $remoteFile referenced, but remote file download is disabled.\", __FILE__, __LINE__);\n            return false;\n        }\n        if ($protocol == \"\" || $protocol === \"file://\") {\n            $realfile = realpath($remoteFile);\n\n            $rootDir = realpath($this->options->getRootDir());\n            if (strpos($realfile, $rootDir) !== 0) {\n                $chroot = $this->options->getChroot();\n                $chrootValid = false;\n                foreach ($chroot as $chrootPath) {\n                    $chrootPath = realpath($chrootPath);\n                    if ($chrootPath !== false && strpos($realfile, $chrootPath) === 0) {\n                        $chrootValid = true;\n                        break;\n                    }\n                }\n                if ($chrootValid !== true) {\n                    Helpers::record_warnings(E_USER_WARNING, \"Permission denied on $remoteFile. The file could not be found under the paths specified by Options::chroot.\", __FILE__, __LINE__);\n                    return false;\n                }\n            }\n\n            if (!$realfile) {\n                Helpers::record_warnings(E_USER_WARNING, \"File '$realfile' not found.\", __FILE__, __LINE__);\n                return false;\n            }\n\n            $remoteFile = $realfile;\n        }\n        list($remoteFileContent, $http_response_header) = @Helpers::getFileContent($remoteFile, $context);\n        if (empty($remoteFileContent)) {\n            return false;\n        }\n\n        $localTempFile = @tempnam($this->options->get(\"tempDir\"), \"dompdf-font-\");\n        file_put_contents($localTempFile, $remoteFileContent);\n\n        $font = Font::load($localTempFile);\n\n        if (!$font) {\n            unlink($localTempFile);\n            return false;\n        }\n\n        $font->parse();\n        $font->saveAdobeFontMetrics(\"$cacheEntry.ufm\");\n        $font->close();\n\n        unlink($localTempFile);\n\n        if ( !file_exists(\"$cacheEntry.ufm\") ) {\n            return false;\n        }\n\n        // Save the changes\n        file_put_contents($localFile, $remoteFileContent);\n\n        if ( !file_exists($localFile) ) {\n            unlink(\"$cacheEntry.ufm\");\n            return false;\n        }\n\n        $this->setFontFamily($fontname, $entry);\n        $this->saveFontFamilies();\n\n        return true;\n    }\n\n    /**\n     * @param $text\n     * @param $font\n     * @param $size\n     * @param float $word_spacing\n     * @param float $char_spacing\n     * @return float\n     * @deprecated\n     */\n    public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0)\n    {\n        //return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing);\n        return $this->getTextWidth($text, $font, $size, $word_spacing, $char_spacing);\n    }\n\n    /**\n     * Calculates text size, in points\n     *\n     * @param string $text the text to be sized\n     * @param string $font the desired font\n     * @param float $size  the desired font size\n     * @param float $wordSpacing\n     * @param float $charSpacing\n     *\n     * @internal param float $spacing word spacing, if any\n     * @return float\n     */\n    public function getTextWidth($text, $font, $size, $wordSpacing = 0.0, $charSpacing = 0.0)\n    {\n        // @todo Make sure this cache is efficient before enabling it\n        static $cache = [];\n\n        if ($text === \"\") {\n            return 0;\n        }\n\n        // Don't cache long strings\n        $useCache = !isset($text[50]); // Faster than strlen\n\n        // Text-size calculations depend on the canvas used. Make sure to not\n        // return wrong values when switching canvas backends\n        $canvasClass = get_class($this->canvas);\n        $key = \"$canvasClass/$font/$size/$wordSpacing/$charSpacing\";\n\n        if ($useCache && isset($cache[$key][$text])) {\n            return $cache[$key][$text];\n        }\n\n        $width = $this->canvas->get_text_width($text, $font, $size, $wordSpacing, $charSpacing);\n\n        if ($useCache) {\n            $cache[$key][$text] = $width;\n        }\n\n        return $width;\n    }\n\n    /**\n     * @param $font\n     * @param $size\n     * @return float\n     * @deprecated\n     */\n    public function get_font_height($font, $size)\n    {\n        return $this->getFontHeight($font, $size);\n    }\n\n    /**\n     * Calculates font height\n     *\n     * @param string $font\n     * @param float $size\n     *\n     * @return float\n     */\n    public function getFontHeight($font, $size)\n    {\n        return $this->canvas->get_font_height($font, $size);\n    }\n\n    /**\n     * @param $family_raw\n     * @param string $subtype_raw\n     * @return string\n     * @deprecated\n     */\n    public function get_font($family_raw, $subtype_raw = \"normal\")\n    {\n        return $this->getFont($family_raw, $subtype_raw);\n    }\n\n    /**\n     * Resolves a font family & subtype into an actual font file\n     * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'.  If\n     * the particular font family has no suitable font file, the default font\n     * ({@link Options::defaultFont}) is used.  The font file returned\n     * is the absolute pathname to the font file on the system.\n     *\n     * @param string $familyRaw\n     * @param string $subtypeRaw\n     *\n     * @return string\n     */\n    public function getFont($familyRaw, $subtypeRaw = \"normal\")\n    {\n        static $cache = [];\n\n        if (isset($cache[$familyRaw][$subtypeRaw])) {\n            return $cache[$familyRaw][$subtypeRaw];\n        }\n\n        /* Allow calling for various fonts in search path. Therefore not immediately\n         * return replacement on non match.\n         * Only when called with NULL try replacement.\n         * When this is also missing there is really trouble.\n         * If only the subtype fails, nevertheless return failure.\n         * Only on checking the fallback font, check various subtypes on same font.\n         */\n\n        $subtype = strtolower($subtypeRaw);\n\n        if ($familyRaw) {\n            $family = str_replace([\"'\", '\"'], \"\", strtolower($familyRaw));\n\n            if (isset($this->fontLookup[$family][$subtype])) {\n                return $cache[$familyRaw][$subtypeRaw] = $this->fontLookup[$family][$subtype];\n            }\n\n            return null;\n        }\n\n        $family = \"serif\";\n\n        if (isset($this->fontLookup[$family][$subtype])) {\n            return $cache[$familyRaw][$subtypeRaw] = $this->fontLookup[$family][$subtype];\n        }\n\n        if (!isset($this->fontLookup[$family])) {\n            return null;\n        }\n\n        $family = $this->fontLookup[$family];\n\n        foreach ($family as $sub => $font) {\n            if (strpos($subtype, $sub) !== false) {\n                return $cache[$familyRaw][$subtypeRaw] = $font;\n            }\n        }\n\n        if ($subtype !== \"normal\") {\n            foreach ($family as $sub => $font) {\n                if ($sub !== \"normal\") {\n                    return $cache[$familyRaw][$subtypeRaw] = $font;\n                }\n            }\n        }\n\n        $subtype = \"normal\";\n\n        if (isset($family[$subtype])) {\n            return $cache[$familyRaw][$subtypeRaw] = $family[$subtype];\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $family\n     * @return null|string\n     * @deprecated\n     */\n    public function get_family($family)\n    {\n        return $this->getFamily($family);\n    }\n\n    /**\n     * @param string $family\n     * @return null|string\n     */\n    public function getFamily($family)\n    {\n        $family = str_replace([\"'\", '\"'], \"\", mb_strtolower($family));\n\n        if (isset($this->fontLookup[$family])) {\n            return $this->fontLookup[$family];\n        }\n\n        return null;\n    }\n\n    /**\n     * @param $type\n     * @return string\n     * @deprecated\n     */\n    public function get_type($type)\n    {\n        return $this->getType($type);\n    }\n\n    /**\n     * @param string $type\n     * @return string\n     */\n    public function getType($type)\n    {\n        if (preg_match('/bold/i', $type)) {\n            $weight = 700;\n        } elseif (preg_match('/([1-9]00)/', $type, $match)) {\n            $weight = (int)$match[0];\n        } else {\n            $weight = 400;\n        }\n        $weight = $weight === 400 ? 'normal' : $weight;\n        $weight = $weight === 700 ? 'bold' : $weight;\n\n        $style = preg_match('/italic|oblique/i', $type) ? 'italic' : null;\n\n        if ($weight === 'normal' && $style !== null) {\n            return $style;\n        }\n\n        return $style === null\n            ? $weight\n            : $weight.'_'.$style;\n    }\n\n    /**\n     * @return array\n     * @deprecated\n     */\n    public function get_font_families()\n    {\n        return $this->getFontFamilies();\n    }\n\n    /**\n     * Returns the current font lookup table\n     *\n     * @return array\n     */\n    public function getFontFamilies()\n    {\n        return $this->fontLookup;\n    }\n\n    /**\n     * @param string $fontname\n     * @param mixed $entry\n     * @deprecated\n     */\n    public function set_font_family($fontname, $entry)\n    {\n        $this->setFontFamily($fontname, $entry);\n    }\n\n    /**\n     * @param string $fontname\n     * @param mixed $entry\n     */\n    public function setFontFamily($fontname, $entry)\n    {\n        $this->fontLookup[mb_strtolower($fontname)] = $entry;\n    }\n\n    /**\n     * @return string\n     */\n    public function getCacheFile()\n    {\n        return $this->options->getFontDir() . '/' . self::CACHE_FILE;\n    }\n\n    /**\n     * @param Options $options\n     * @return $this\n     */\n    public function setOptions(Options $options)\n    {\n        $this->options = $options;\n        return $this;\n    }\n\n    /**\n     * @return Options\n     */\n    public function getOptions()\n    {\n        return $this->options;\n    }\n\n    /**\n     * @param Canvas $canvas\n     * @return $this\n     */\n    public function setCanvas(Canvas $canvas)\n    {\n        $this->canvas = $canvas;\n        // Still write deprecated pdf for now. It might be used by a parent class.\n        $this->pdf = $canvas;\n        return $this;\n    }\n\n    /**\n     * @return Canvas\n     */\n    public function getCanvas()\n    {\n        return $this->canvas;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame/Factory.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Frame;\n\nuse Dompdf\\Css\\Style;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Exception;\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\nuse DOMXPath;\nuse Dompdf\\FrameDecorator\\Page as PageFrameDecorator;\nuse Dompdf\\FrameReflower\\Page as PageFrameReflower;\nuse Dompdf\\Positioner\\AbstractPositioner;\n\n/**\n * Contains frame decorating logic\n *\n * This class is responsible for assigning the correct {@link AbstractFrameDecorator},\n * {@link AbstractPositioner}, and {@link AbstractFrameReflower} objects to {@link Frame}\n * objects.  This is determined primarily by the Frame's display type, but\n * also by the Frame's node's type (e.g. DomElement vs. #text)\n *\n * @access  private\n * @package dompdf\n */\nclass Factory\n{\n\n     /**\n     * Array of positioners for specific frame types\n     *\n     * @var AbstractPositioner[]\n     */\n    protected static $_positioners;\n\n    /**\n     * Decorate the root Frame\n     *\n     * @param $root   Frame The frame to decorate\n     * @param $dompdf Dompdf The dompdf instance\n     *\n     * @return PageFrameDecorator\n     */\n    static function decorate_root(Frame $root, Dompdf $dompdf)\n    {\n        $frame = new PageFrameDecorator($root, $dompdf);\n        $frame->set_reflower(new PageFrameReflower($frame));\n        $root->set_decorator($frame);\n\n        return $frame;\n    }\n\n    /**\n     * Decorate a Frame\n     *\n     * @param Frame $frame   The frame to decorate\n     * @param Dompdf $dompdf The dompdf instance\n     * @param Frame $root    The root of the frame\n     *\n     * @throws Exception\n     * @return AbstractFrameDecorator\n     * FIXME: this is admittedly a little smelly...\n     */\n    static function decorate_frame(Frame $frame, Dompdf $dompdf, Frame $root = null)\n    {\n        $style = $frame->get_style();\n        $display = $style->display;\n\n        // Floating (and more generally out-of-flow) elements are blocks\n        // https://www.w3.org/TR/CSS21/visuren.html#dis-pos-flo\n        if (!$frame->is_in_flow()\n            && in_array($display, Style::INLINE_LEVEL_TYPES, true)\n        ) {\n            switch ($display) {\n                case \"inline-flex\":\n                    $display = \"flex\";\n                    break;\n                case \"inline-table\":\n                    $display = \"table\";\n                    break;\n                default:\n                    $display = \"block\";\n            }\n\n            // The original style needs to be modified, too, here, as the style\n            // gets reset to the original style after a page break\n            $frame->get_original_style()->display = $display;\n            $style->display = $display;\n        }\n\n        switch ($display) {\n\n            case \"flex\": //FIXME: display type not yet supported\n            case \"table-caption\": //FIXME: display type not yet supported\n            case \"block\":\n                $positioner = \"Block\";\n                $decorator = \"Block\";\n                $reflower = \"Block\";\n                break;\n\n            case \"inline-flex\": //FIXME: display type not yet supported\n            case \"inline-block\":\n                $positioner = \"Inline\";\n                $decorator = \"Block\";\n                $reflower = \"Block\";\n                break;\n\n            case \"inline\":\n                $positioner = \"Inline\";\n                if ($frame->is_text_node()) {\n                    $decorator = \"Text\";\n                    $reflower = \"Text\";\n                } else {\n                    if ($style->float !== \"none\") {\n                        $decorator = \"Block\";\n                        $reflower = \"Block\";\n                    } else {\n                        $decorator = \"Inline\";\n                        $reflower = \"Inline\";\n                    }\n                }\n                break;\n\n            case \"table\":\n                $positioner = \"Block\";\n                $decorator = \"Table\";\n                $reflower = \"Table\";\n                break;\n\n            case \"inline-table\":\n                $positioner = \"Inline\";\n                $decorator = \"Table\";\n                $reflower = \"Table\";\n                break;\n\n            case \"table-row-group\":\n            case \"table-header-group\":\n            case \"table-footer-group\":\n                $positioner = \"NullPositioner\";\n                $decorator = \"TableRowGroup\";\n                $reflower = \"TableRowGroup\";\n                break;\n\n            case \"table-row\":\n                $positioner = \"NullPositioner\";\n                $decorator = \"TableRow\";\n                $reflower = \"TableRow\";\n                break;\n\n            case \"table-cell\":\n                $positioner = \"TableCell\";\n                $decorator = \"TableCell\";\n                $reflower = \"TableCell\";\n                break;\n\n            case \"list-item\":\n                $positioner = \"Block\";\n                $decorator = \"Block\";\n                $reflower = \"Block\";\n                break;\n\n            case \"-dompdf-list-bullet\":\n                if ($style->list_style_position === \"inside\") {\n                    $positioner = \"Inline\";\n                } else {\n                    $positioner = \"ListBullet\";\n                }\n\n                if ($style->list_style_image !== \"none\") {\n                    $decorator = \"ListBulletImage\";\n                } else {\n                    $decorator = \"ListBullet\";\n                }\n\n                $reflower = \"ListBullet\";\n                break;\n\n            case \"-dompdf-image\":\n                $positioner = \"Inline\";\n                $decorator = \"Image\";\n                $reflower = \"Image\";\n                break;\n\n            case \"-dompdf-br\":\n                $positioner = \"Inline\";\n                $decorator = \"Inline\";\n                $reflower = \"Inline\";\n                break;\n\n            default:\n                // FIXME: should throw some sort of warning or something?\n            case \"none\":\n                if ($style->_dompdf_keep !== \"yes\") {\n                    // Remove the node and the frame\n                    $frame->get_parent()->remove_child($frame);\n                    return;\n                }\n\n                $positioner = \"NullPositioner\";\n                $decorator = \"NullFrameDecorator\";\n                $reflower = \"NullFrameReflower\";\n                break;\n        }\n\n        // Handle CSS position\n        $position = $style->position;\n\n        if ($position === \"absolute\") {\n            $positioner = \"Absolute\";\n        } else {\n            if ($position === \"fixed\") {\n                $positioner = \"Fixed\";\n            }\n        }\n\n        $node = $frame->get_node();\n\n        // Handle nodeName\n        if ($node->nodeName === \"img\") {\n            $style->display = \"-dompdf-image\";\n            $decorator = \"Image\";\n            $reflower = \"Image\";\n        }\n\n        $decorator  = \"Dompdf\\\\FrameDecorator\\\\$decorator\";\n        $reflower   = \"Dompdf\\\\FrameReflower\\\\$reflower\";\n\n        /** @var AbstractFrameDecorator $deco */\n        $deco = new $decorator($frame, $dompdf);\n\n        $deco->set_positioner(self::getPositionerInstance($positioner));\n        $deco->set_reflower(new $reflower($deco, $dompdf->getFontMetrics()));\n\n        if ($root) {\n            $deco->set_root($root);\n        }\n\n        if ($display === \"list-item\") {\n            // Insert a list-bullet frame\n            $xml = $dompdf->getDom();\n            $bullet_node = $xml->createElement(\"bullet\"); // arbitrary choice\n            $b_f = new Frame($bullet_node);\n\n            $node = $frame->get_node();\n            $parent_node = $node->parentNode;\n\n            if ($parent_node) {\n                if (!$parent_node->hasAttribute(\"dompdf-children-count\")) {\n                    $xpath = new DOMXPath($xml);\n                    $count = $xpath->query(\"li\", $parent_node)->length;\n                    $parent_node->setAttribute(\"dompdf-children-count\", $count);\n                }\n\n                if (is_numeric($node->getAttribute(\"value\"))) {\n                    $index = intval($node->getAttribute(\"value\"));\n                } else {\n                    if (!$parent_node->hasAttribute(\"dompdf-counter\")) {\n                        $index = ($parent_node->hasAttribute(\"start\") ? $parent_node->getAttribute(\"start\") : 1);\n                    } else {\n                        $index = (int)$parent_node->getAttribute(\"dompdf-counter\") + 1;\n                    }\n                }\n\n                $parent_node->setAttribute(\"dompdf-counter\", $index);\n                $bullet_node->setAttribute(\"dompdf-counter\", $index);\n            }\n\n            $new_style = $dompdf->getCss()->create_style();\n            $new_style->display = \"-dompdf-list-bullet\";\n            $new_style->inherit($style);\n            $b_f->set_style($new_style);\n\n            $deco->prepend_child(Factory::decorate_frame($b_f, $dompdf, $root));\n        }\n\n        return $deco;\n    }\n\n    /**\n     * Creates Positioners\n     *\n     * @param string $type type of positioner to use\n     * @return AbstractPositioner\n     */\n    protected static function getPositionerInstance($type)\n    {\n        if (!isset(self::$_positioners[$type])) {\n            $class = '\\\\Dompdf\\\\Positioner\\\\'.$type;\n            self::$_positioners[$type] = new $class();\n        }\n        return self::$_positioners[$type];\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame/FrameList.php",
    "content": "<?php\nnamespace Dompdf\\Frame;\n\nuse Dompdf\\Frame;\nuse IteratorAggregate;\n\n/**\n * Linked-list IteratorAggregate\n *\n * @access private\n * @package dompdf\n */\nclass FrameList implements IteratorAggregate\n{\n    /**\n     * @var Frame\n     */\n    protected $_frame;\n\n    /**\n     * @param Frame $frame\n     */\n    function __construct($frame)\n    {\n        $this->_frame = $frame;\n    }\n\n    /**\n     * @return FrameListIterator\n     */\n    function getIterator()\n    {\n        return new FrameListIterator($this->_frame);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame/FrameListIterator.php",
    "content": "<?php\nnamespace Dompdf\\Frame;\n\nuse Iterator;\nuse Dompdf\\Frame;\n\n/**\n * Linked-list Iterator\n *\n * Returns children in order and allows for list to change during iteration,\n * provided the changes occur to or after the current element\n *\n * @access private\n * @package dompdf\n */\nclass FrameListIterator implements Iterator\n{\n\n    /**\n     * @var Frame\n     */\n    protected $_parent;\n\n    /**\n     * @var Frame\n     */\n    protected $_cur;\n\n    /**\n     * @var int\n     */\n    protected $_num;\n\n    /**\n     * @param Frame $frame\n     */\n    public function __construct(Frame $frame)\n    {\n        $this->_parent = $frame;\n        $this->_cur = $frame->get_first_child();\n        $this->_num = 0;\n    }\n\n    /**\n     *\n     */\n    public function rewind()\n    {\n        $this->_cur = $this->_parent->get_first_child();\n        $this->_num = 0;\n    }\n\n    /**\n     * @return bool\n     */\n    public function valid()\n    {\n        return isset($this->_cur); // && ($this->_cur->get_prev_sibling() === $this->_prev);\n    }\n\n    /**\n     * @return int\n     */\n    public function key()\n    {\n        return $this->_num;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function current()\n    {\n        return $this->_cur;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function next()\n    {\n        $ret = $this->_cur;\n        if (!$ret) {\n            return null;\n        }\n\n        $this->_cur = $this->_cur->get_next_sibling();\n        $this->_num++;\n        return $ret;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame/FrameTree.php",
    "content": "<?php\n\nnamespace Dompdf\\Frame;\n\nuse DOMDocument;\nuse DOMNode;\nuse DOMElement;\nuse DOMXPath;\n\nuse Dompdf\\Exception;\nuse Dompdf\\Frame;\n\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\n/**\n * Represents an entire document as a tree of frames\n *\n * The FrameTree consists of {@link Frame} objects each tied to specific\n * DOMNode objects in a specific DomDocument.  The FrameTree has the same\n * structure as the DomDocument, but adds additional capabilities for\n * styling and layout.\n *\n * @package dompdf\n */\nclass FrameTree\n{\n    /**\n     * Tags to ignore while parsing the tree\n     *\n     * @var array\n     */\n    protected static $HIDDEN_TAGS = [\n        \"area\",\n        \"base\",\n        \"basefont\",\n        \"head\",\n        \"style\",\n        \"meta\",\n        \"title\",\n        \"colgroup\",\n        \"noembed\",\n        \"param\",\n        \"#comment\"\n    ];\n\n    /**\n     * The main DomDocument\n     *\n     * @see http://ca2.php.net/manual/en/ref.dom.php\n     * @var DOMDocument\n     */\n    protected $_dom;\n\n    /**\n     * The root node of the FrameTree.\n     *\n     * @var Frame\n     */\n    protected $_root;\n\n    /**\n     * Subtrees of absolutely positioned elements\n     *\n     * @var array of Frames\n     */\n    protected $_absolute_frames;\n\n    /**\n     * A mapping of {@link Frame} objects to DOMNode objects\n     *\n     * @var array\n     */\n    protected $_registry;\n\n    /**\n     * Class constructor\n     *\n     * @param DOMDocument $dom the main DomDocument object representing the current html document\n     */\n    public function __construct(DomDocument $dom)\n    {\n        $this->_dom = $dom;\n        $this->_root = null;\n        $this->_registry = [];\n    }\n\n    /**\n     * Returns the DOMDocument object representing the current html document\n     *\n     * @return DOMDocument\n     */\n    public function get_dom()\n    {\n        return $this->_dom;\n    }\n\n    /**\n     * Returns the root frame of the tree\n     *\n     * @return Frame\n     */\n    public function get_root()\n    {\n        return $this->_root;\n    }\n\n    /**\n     * Returns a specific frame given its id\n     *\n     * @param string $id\n     *\n     * @return Frame|null\n     */\n    public function get_frame($id)\n    {\n        return isset($this->_registry[$id]) ? $this->_registry[$id] : null;\n    }\n\n    /**\n     * Returns a post-order iterator for all frames in the tree\n     *\n     * @return FrameTreeList|Frame[]\n     */\n    public function get_frames()\n    {\n        return new FrameTreeList($this->_root);\n    }\n\n    /**\n     * Builds the tree\n     */\n    public function build_tree()\n    {\n        $html = $this->_dom->getElementsByTagName(\"html\")->item(0);\n        if (is_null($html)) {\n            $html = $this->_dom->firstChild;\n        }\n\n        if (is_null($html)) {\n            throw new Exception(\"Requested HTML document contains no data.\");\n        }\n\n        $this->fix_tables();\n\n        $this->_root = $this->_build_tree_r($html);\n    }\n\n    /**\n     * Adds missing TBODYs around TR\n     */\n    protected function fix_tables()\n    {\n        $xp = new DOMXPath($this->_dom);\n\n        // Move table caption before the table\n        // FIXME find a better way to deal with it...\n        $captions = $xp->query('//table/caption');\n        foreach ($captions as $caption) {\n            $table = $caption->parentNode;\n            $table->parentNode->insertBefore($caption, $table);\n        }\n\n        $firstRows = $xp->query('//table/tr[1]');\n        /** @var DOMElement $tableChild */\n        foreach ($firstRows as $tableChild) {\n            $tbody = $this->_dom->createElement('tbody');\n            $tableNode = $tableChild->parentNode;\n            do {\n                if ($tableChild->nodeName === 'tr') {\n                    $tmpNode = $tableChild;\n                    $tableChild = $tableChild->nextSibling;\n                    $tableNode->removeChild($tmpNode);\n                    $tbody->appendChild($tmpNode);\n                } else {\n                    if ($tbody->hasChildNodes() === true) {\n                        $tableNode->insertBefore($tbody, $tableChild);\n                        $tbody = $this->_dom->createElement('tbody');\n                    }\n                    $tableChild = $tableChild->nextSibling;\n                }\n            } while ($tableChild);\n            if ($tbody->hasChildNodes() === true) {\n                $tableNode->appendChild($tbody);\n            }\n        }\n    }\n\n    // FIXME: temporary hack, preferably we will improve rendering of sequential #text nodes\n    /**\n     * Remove a child from a node\n     *\n     * Remove a child from a node. If the removed node results in two\n     * adjacent #text nodes then combine them.\n     *\n     * @param DOMNode $node the current DOMNode being considered\n     * @param array $children an array of nodes that are the children of $node\n     * @param int $index index from the $children array of the node to remove\n     */\n    protected function _remove_node(DOMNode $node, array &$children, $index)\n    {\n        $child = $children[$index];\n        $previousChild = $child->previousSibling;\n        $nextChild = $child->nextSibling;\n        $node->removeChild($child);\n        if (isset($previousChild, $nextChild)) {\n            if ($previousChild->nodeName === \"#text\" && $nextChild->nodeName === \"#text\") {\n                $previousChild->nodeValue .= $nextChild->nodeValue;\n                $this->_remove_node($node, $children, $index+1);\n            }\n        }\n        array_splice($children, $index, 1);\n    }\n\n    /**\n     * Recursively adds {@link Frame} objects to the tree\n     *\n     * Recursively build a tree of Frame objects based on a dom tree.\n     * No layout information is calculated at this time, although the\n     * tree may be adjusted (i.e. nodes and frames for generated content\n     * and images may be created).\n     *\n     * @param DOMNode $node the current DOMNode being considered\n     *\n     * @return Frame\n     */\n    protected function _build_tree_r(DOMNode $node)\n    {\n        $frame = new Frame($node);\n        $id = $frame->get_id();\n        $this->_registry[$id] = $frame;\n\n        if (!$node->hasChildNodes()) {\n            return $frame;\n        }\n\n        // Store the children in an array so that the tree can be modified\n        $children = [];\n        $length = $node->childNodes->length;\n        for ($i = 0; $i < $length; $i++) {\n            $children[] = $node->childNodes->item($i);\n        }\n        $index = 0;\n        // INFO: We don't advance $index if a node is removed to avoid skipping nodes\n        while ($index < count($children)) {\n            $child = $children[$index];\n            $nodeName = strtolower($child->nodeName);\n\n            // Skip non-displaying nodes\n            if (in_array($nodeName, self::$HIDDEN_TAGS)) {\n                if ($nodeName !== \"head\" && $nodeName !== \"style\") {\n                    $this->_remove_node($node, $children, $index);\n                } else {\n                    $index++;\n                }\n                continue;\n            }\n            // Skip empty text nodes\n            if ($nodeName === \"#text\" && $child->nodeValue === \"\") {\n                $this->_remove_node($node, $children, $index);\n                continue;\n            }\n            // Skip empty image nodes\n            if ($nodeName === \"img\" && $child->getAttribute(\"src\") === \"\") {\n                $this->_remove_node($node, $children, $index);\n                continue;\n            }\n\n            if (is_object($child)) {\n                $frame->append_child($this->_build_tree_r($child), false);\n            }\n            $index++;\n        }\n\n        return $frame;\n    }\n\n    /**\n     * @param DOMElement $node\n     * @param DOMElement $new_node\n     * @param string $pos\n     *\n     * @return mixed\n     */\n    public function insert_node(DOMElement $node, DOMElement $new_node, $pos)\n    {\n        if ($pos === \"after\" || !$node->firstChild) {\n            $node->appendChild($new_node);\n        } else {\n            $node->insertBefore($new_node, $node->firstChild);\n        }\n\n        $this->_build_tree_r($new_node);\n\n        $frame_id = $new_node->getAttribute(\"frame_id\");\n        $frame = $this->get_frame($frame_id);\n\n        $parent_id = $node->getAttribute(\"frame_id\");\n        $parent = $this->get_frame($parent_id);\n\n        if ($parent) {\n            if ($pos === \"before\") {\n                $parent->prepend_child($frame, false);\n            } else {\n                $parent->append_child($frame, false);\n            }\n        }\n\n        return $frame_id;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame/FrameTreeIterator.php",
    "content": "<?php\nnamespace Dompdf\\Frame;\n\nuse Iterator;\nuse Dompdf\\Frame;\n\n/**\n * Pre-order Iterator\n *\n * Returns frames in preorder traversal order (parent then children)\n *\n * @access private\n * @package dompdf\n */\nclass FrameTreeIterator implements Iterator\n{\n    /**\n     * @var Frame\n     */\n    protected $_root;\n\n    /**\n     * @var array\n     */\n    protected $_stack = [];\n\n    /**\n     * @var int\n     */\n    protected $_num;\n\n    /**\n     * @param Frame $root\n     */\n    public function __construct(Frame $root)\n    {\n        $this->_stack[] = $this->_root = $root;\n        $this->_num = 0;\n    }\n\n    /**\n     *\n     */\n    public function rewind()\n    {\n        $this->_stack = [$this->_root];\n        $this->_num = 0;\n    }\n\n    /**\n     * @return bool\n     */\n    public function valid()\n    {\n        return count($this->_stack) > 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function key()\n    {\n        return $this->_num;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function current()\n    {\n        return end($this->_stack);\n    }\n\n    /**\n     * @return Frame\n     */\n    public function next()\n    {\n        $b = end($this->_stack);\n\n        // Pop last element\n        unset($this->_stack[key($this->_stack)]);\n        $this->_num++;\n\n        // Push all children onto the stack in reverse order\n        if ($c = $b->get_last_child()) {\n            $this->_stack[] = $c;\n            while ($c = $c->get_prev_sibling()) {\n                $this->_stack[] = $c;\n            }\n        }\n\n        return $b;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame/FrameTreeList.php",
    "content": "<?php\nnamespace Dompdf\\Frame;\n\nuse IteratorAggregate;\nuse Dompdf\\Frame;\n\n/**\n * Pre-order IteratorAggregate\n *\n * @access private\n * @package dompdf\n */\nclass FrameTreeList implements IteratorAggregate\n{\n    /**\n     * @var \\Dompdf\\Frame\n     */\n    protected $_root;\n\n    /**\n     * @param \\Dompdf\\Frame $root\n     */\n    public function __construct(Frame $root)\n    {\n        $this->_root = $root;\n    }\n\n    /**\n     * @return FrameTreeIterator\n     */\n    public function getIterator()\n    {\n        return new FrameTreeIterator($this->_root);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Frame.php",
    "content": "<?php\n\nnamespace Dompdf;\n\nuse Dompdf\\Css\\Style;\nuse Dompdf\\Frame\\FrameList;\n\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\n/**\n * The main Frame class\n *\n * This class represents a single HTML element.  This class stores\n * positioning information as well as containing block location and\n * dimensions. Style information for the element is stored in a {@link\n * Style} object. Tree structure is maintained via the parent & children\n * links.\n *\n * @package dompdf\n */\nclass Frame\n{\n    const WS_TEXT = 1;\n    const WS_SPACE = 2;\n\n    /**\n     * The DOMElement or DOMText object this frame represents\n     *\n     * @var \\DOMElement|\\DOMText\n     */\n    protected $_node;\n\n    /**\n     * Unique identifier for this frame.  Used to reference this frame\n     * via the node.\n     *\n     * @var int\n     */\n    protected $_id;\n\n    /**\n     * Unique id counter\n     *\n     * @var int\n     */\n    public static $ID_COUNTER = 0; /*protected*/\n\n    /**\n     * This frame's calculated style\n     *\n     * @var Style\n     */\n    protected $_style;\n\n    /**\n     * This frame's original style.  Needed for cases where frames are\n     * split across pages.\n     *\n     * @var Style\n     */\n    protected $_original_style;\n\n    /**\n     * This frame's parent in the document tree.\n     *\n     * @var Frame\n     */\n    protected $_parent;\n\n    /**\n     * This frame's children\n     *\n     * @var Frame[]\n     */\n    protected $_frame_list;\n\n    /**\n     * This frame's first child.  All children are handled as a\n     * doubly-linked list.\n     *\n     * @var Frame\n     */\n    protected $_first_child;\n\n    /**\n     * This frame's last child.\n     *\n     * @var Frame\n     */\n    protected $_last_child;\n\n    /**\n     * This frame's previous sibling in the document tree.\n     *\n     * @var Frame\n     */\n    protected $_prev_sibling;\n\n    /**\n     * This frame's next sibling in the document tree.\n     *\n     * @var Frame\n     */\n    protected $_next_sibling;\n\n    /**\n     * This frame's containing block (used in layout): array(x, y, w, h)\n     *\n     * @var float[]\n     */\n    protected $_containing_block;\n\n    /**\n     * Position on the page of the top-left corner of the margin box of\n     * this frame: array(x,y)\n     *\n     * @var float[]\n     */\n    protected $_position;\n\n    /**\n     * Absolute opacity of this frame\n     *\n     * @var float\n     */\n    protected $_opacity;\n\n    /**\n     * This frame's decorator\n     *\n     * @var \\Dompdf\\FrameDecorator\\AbstractFrameDecorator\n     */\n    protected $_decorator;\n\n    /**\n     * This frame's containing line box\n     *\n     * @var LineBox\n     */\n    protected $_containing_line;\n\n    /**\n     * @var array\n     */\n    protected $_is_cache = [];\n\n    /**\n     * Tells whether the frame was already pushed to the next page\n     *\n     * @var bool\n     */\n    public $_already_pushed = false;\n\n    /**\n     * @var bool\n     */\n    public $_float_next_line = false;\n\n    /**\n     * Whether the frame is a split-off frame\n     *\n     * @var bool\n     */\n    public $_splitted;\n\n    /**\n     * @var int\n     */\n    public static $_ws_state = self::WS_SPACE;\n\n    /**\n     * Class constructor\n     *\n     * @param \\DOMNode $node the DOMNode this frame represents\n     */\n    public function __construct(\\DOMNode $node)\n    {\n        $this->_node = $node;\n\n        $this->_parent = null;\n        $this->_first_child = null;\n        $this->_last_child = null;\n        $this->_prev_sibling = $this->_next_sibling = null;\n\n        $this->_style = null;\n        $this->_original_style = null;\n\n        $this->_containing_block = [\n            \"x\" => null,\n            \"y\" => null,\n            \"w\" => null,\n            \"h\" => null,\n        ];\n\n        $this->_containing_block[0] =& $this->_containing_block[\"x\"];\n        $this->_containing_block[1] =& $this->_containing_block[\"y\"];\n        $this->_containing_block[2] =& $this->_containing_block[\"w\"];\n        $this->_containing_block[3] =& $this->_containing_block[\"h\"];\n\n        $this->_position = [\n            \"x\" => null,\n            \"y\" => null,\n        ];\n\n        $this->_position[0] =& $this->_position[\"x\"];\n        $this->_position[1] =& $this->_position[\"y\"];\n\n        $this->_opacity = 1.0;\n        $this->_decorator = null;\n\n        $this->set_id(self::$ID_COUNTER++);\n    }\n\n    /**\n     * WIP : preprocessing to remove all the unused whitespace\n     */\n    protected function ws_trim()\n    {\n        if ($this->ws_keep()) {\n            return;\n        }\n\n        if (self::$_ws_state === self::WS_SPACE) {\n            $node = $this->_node;\n\n            if ($node->nodeName === \"#text\" && !empty($node->nodeValue)) {\n                $node->nodeValue = preg_replace(\"/[ \\t\\r\\n\\f]+/u\", \" \", trim($node->nodeValue));\n                self::$_ws_state = self::WS_TEXT;\n            }\n        }\n    }\n\n    /**\n     * @return bool\n     */\n    protected function ws_keep()\n    {\n        $whitespace = $this->get_style()->white_space;\n\n        return in_array($whitespace, [\"pre\", \"pre-wrap\", \"pre-line\"]);\n    }\n\n    /**\n     * @return bool\n     */\n    protected function ws_is_text()\n    {\n        $node = $this->get_node();\n\n        if ($node->nodeName === \"img\") {\n            return true;\n        }\n\n        if (!$this->is_in_flow()) {\n            return false;\n        }\n\n        if ($this->is_text_node()) {\n            return trim($node->nodeValue) !== \"\";\n        }\n\n        return true;\n    }\n\n    /**\n     * \"Destructor\": forcibly free all references held by this frame\n     *\n     * @param bool $recursive if true, call dispose on all children\n     */\n    public function dispose($recursive = false)\n    {\n        if ($recursive) {\n            while ($child = $this->_first_child) {\n                $child->dispose(true);\n            }\n        }\n\n        // Remove this frame from the tree\n        if ($this->_prev_sibling) {\n            $this->_prev_sibling->_next_sibling = $this->_next_sibling;\n        }\n\n        if ($this->_next_sibling) {\n            $this->_next_sibling->_prev_sibling = $this->_prev_sibling;\n        }\n\n        if ($this->_parent && $this->_parent->_first_child === $this) {\n            $this->_parent->_first_child = $this->_next_sibling;\n        }\n\n        if ($this->_parent && $this->_parent->_last_child === $this) {\n            $this->_parent->_last_child = $this->_prev_sibling;\n        }\n\n        if ($this->_parent) {\n            $this->_parent->get_node()->removeChild($this->_node);\n        }\n\n        $this->_style->dispose();\n        $this->_style = null;\n        unset($this->_style);\n\n        $this->_original_style->dispose();\n        $this->_original_style = null;\n        unset($this->_original_style);\n    }\n\n    /**\n     * Re-initialize the frame\n     */\n    public function reset()\n    {\n        $this->_position[\"x\"] = null;\n        $this->_position[\"y\"] = null;\n\n        $this->_containing_block[\"x\"] = null;\n        $this->_containing_block[\"y\"] = null;\n        $this->_containing_block[\"w\"] = null;\n        $this->_containing_block[\"h\"] = null;\n\n        $this->_style = null;\n        unset($this->_style);\n        $this->_style = clone $this->_original_style;\n    }\n\n    /**\n     * @return \\DOMElement|\\DOMText\n     */\n    public function get_node()\n    {\n        return $this->_node;\n    }\n\n    /**\n     * @return int\n     */\n    public function get_id()\n    {\n        return $this->_id;\n    }\n\n    /**\n     * @return Style\n     */\n    public function get_style()\n    {\n        return $this->_style;\n    }\n\n    /**\n     * @return Style\n     */\n    public function get_original_style()\n    {\n        return $this->_original_style;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function get_parent()\n    {\n        return $this->_parent;\n    }\n\n    /**\n     * @return \\Dompdf\\FrameDecorator\\AbstractFrameDecorator\n     */\n    public function get_decorator()\n    {\n        return $this->_decorator;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function get_first_child()\n    {\n        return $this->_first_child;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function get_last_child()\n    {\n        return $this->_last_child;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function get_prev_sibling()\n    {\n        return $this->_prev_sibling;\n    }\n\n    /**\n     * @return Frame\n     */\n    public function get_next_sibling()\n    {\n        return $this->_next_sibling;\n    }\n\n    /**\n     * @return FrameList|Frame[]\n     */\n    public function get_children()\n    {\n        if (isset($this->_frame_list)) {\n            return $this->_frame_list;\n        }\n\n        $this->_frame_list = new FrameList($this);\n\n        return $this->_frame_list;\n    }\n\n    // Layout property accessors\n\n    /**\n     * Containing block dimensions\n     *\n     * @param string|null $i The key of the wanted containing block's dimension (x, y, w, h)\n     *\n     * @return float[]|float\n     */\n    public function get_containing_block($i = null)\n    {\n        if (isset($i)) {\n            return $this->_containing_block[$i];\n        }\n\n        return $this->_containing_block;\n    }\n\n    /**\n     * Block position\n     *\n     * @param string|null $i The key of the wanted position value (x, y)\n     *\n     * @return float[]|float\n     */\n    public function get_position($i = null)\n    {\n        if (isset($i)) {\n            return $this->_position[$i];\n        }\n\n        return $this->_position;\n    }\n\n    //........................................................................\n\n    /**\n     * Return the width of the margin box of the frame, in pt.  Meaningless\n     * unless the width has been calculated properly.\n     *\n     * @return float\n     */\n    public function get_margin_width(): float\n    {\n        $style = $this->_style;\n\n        return (float)$style->length_in_pt([\n            $style->width,\n            $style->margin_left,\n            $style->margin_right,\n            $style->border_left_width,\n            $style->border_right_width,\n            $style->padding_left,\n            $style->padding_right\n        ], $this->_containing_block[\"w\"]);\n    }\n\n    /**\n     * Return the height of the margin box of the frame, in pt.  Meaningless\n     * unless the height has been calculated properly.\n     *\n     * @return float\n     */\n    public function get_margin_height(): float\n    {\n        $style = $this->_style;\n\n        return (float)$style->length_in_pt(\n            [\n                $style->height,\n                (float)$style->length_in_pt(\n                    [\n                        $style->border_top_width,\n                        $style->border_bottom_width,\n                        $style->margin_top,\n                        $style->margin_bottom,\n                        $style->padding_top,\n                        $style->padding_bottom\n                    ], $this->_containing_block[\"w\"]\n                )\n            ],\n            $this->_containing_block[\"h\"]\n        );\n    }\n\n    /**\n     * Return the content box (x,y,w,h) of the frame.\n     *\n     * Width and height might be reported as 0 if they have not been resolved\n     * yet.\n     *\n     * @return float[]\n     */\n    public function get_content_box(): array\n    {\n        $style = $this->_style;\n        $cb = $this->_containing_block;\n\n        $x = $this->_position[\"x\"] +\n            (float)$style->length_in_pt(\n                [\n                    $style->margin_left,\n                    $style->border_left_width,\n                    $style->padding_left\n                ],\n                $cb[\"w\"]\n            );\n\n        $y = $this->_position[\"y\"] +\n            (float)$style->length_in_pt(\n                [\n                    $style->margin_top,\n                    $style->border_top_width,\n                    $style->padding_top\n                ], $cb[\"w\"]\n            );\n\n        $w = (float)$style->length_in_pt($style->width, $cb[\"w\"]);\n\n        $h = (float)$style->length_in_pt($style->height, $cb[\"h\"]);\n\n        return [0 => $x, \"x\" => $x,\n            1 => $y, \"y\" => $y,\n            2 => $w, \"w\" => $w,\n            3 => $h, \"h\" => $h];\n    }\n\n    /**\n     * Return the padding box (x,y,w,h) of the frame.\n     *\n     * Width and height might be reported as 0 if they have not been resolved\n     * yet.\n     *\n     * @return float[]\n     */\n    public function get_padding_box(): array\n    {\n        $style = $this->_style;\n        $cb = $this->_containing_block;\n\n        $x = $this->_position[\"x\"] +\n            (float)$style->length_in_pt(\n                [\n                    $style->margin_left,\n                    $style->border_left_width\n                ],\n                $cb[\"w\"]\n            );\n\n        $y = $this->_position[\"y\"] +\n            (float)$style->length_in_pt(\n                [\n                    $style->margin_top,\n                    $style->border_top_width\n                ],\n                $cb[\"h\"]\n            );\n\n        $w = (float)$style->length_in_pt(\n                [\n                    $style->padding_left,\n                    $style->width,\n                    $style->padding_right\n                ],\n                $cb[\"w\"]\n            );\n\n        $h = (float)$style->length_in_pt(\n                [\n                    $style->padding_top,\n                    $style->padding_bottom,\n                    $style->length_in_pt($style->height, $cb[\"h\"])\n                ],\n                $cb[\"w\"]\n            );\n\n        return [0 => $x, \"x\" => $x,\n            1 => $y, \"y\" => $y,\n            2 => $w, \"w\" => $w,\n            3 => $h, \"h\" => $h];\n    }\n\n    /**\n     * Return the border box of the frame.\n     *\n     * Width and height might be reported as 0 if they have not been resolved\n     * yet.\n     *\n     * @return float[]\n     */\n    public function get_border_box(): array\n    {\n        $style = $this->_style;\n        $cb = $this->_containing_block;\n\n        $x = $this->_position[\"x\"] + (float)$style->length_in_pt($style->margin_left, $cb[\"w\"]);\n\n        $y = $this->_position[\"y\"] + (float)$style->length_in_pt($style->margin_top, $cb[\"w\"]);\n\n        $w = (float)$style->length_in_pt(\n            [\n                $style->border_left_width,\n                $style->padding_left,\n                $style->width,\n                $style->padding_right,\n                $style->border_right_width\n            ],\n            $cb[\"w\"]\n        );\n\n        $h = (float)$style->length_in_pt(\n            [\n                $style->border_top_width,\n                $style->padding_top,\n                $style->padding_bottom,\n                $style->border_bottom_width,\n                $style->length_in_pt($style->height, $cb[\"h\"])\n            ],\n            $cb[\"w\"]\n        );\n\n        return [0 => $x, \"x\" => $x,\n            1 => $y, \"y\" => $y,\n            2 => $w, \"w\" => $w,\n            3 => $h, \"h\" => $h];\n    }\n\n    /**\n     * @param null $opacity\n     *\n     * @return float\n     */\n    public function get_opacity($opacity = null)\n    {\n        if ($opacity !== null) {\n            $this->set_opacity($opacity);\n        }\n\n        return $this->_opacity;\n    }\n\n    /**\n     * @return LineBox\n     */\n    public function &get_containing_line()\n    {\n        return $this->_containing_line;\n    }\n\n    //........................................................................\n    // Set methods\n\n    /**\n     * @param int $id\n     */\n    public function set_id($id)\n    {\n        $this->_id = $id;\n\n        // We can only set attributes of DOMElement objects (nodeType == 1).\n        // Since these are the only objects that we can assign CSS rules to,\n        // this shortcoming is okay.\n        if ($this->_node->nodeType == XML_ELEMENT_NODE) {\n            $this->_node->setAttribute(\"frame_id\", $id);\n        }\n    }\n\n    /**\n     * @param Style $style\n     */\n    public function set_style(Style $style)\n    {\n        if (is_null($this->_style)) {\n            $this->_original_style = clone $style;\n        }\n\n        //$style->set_frame($this);\n        $this->_style = $style;\n    }\n\n    /**\n     * @param \\Dompdf\\FrameDecorator\\AbstractFrameDecorator $decorator\n     */\n    public function set_decorator(FrameDecorator\\AbstractFrameDecorator $decorator)\n    {\n        $this->_decorator = $decorator;\n    }\n\n    /**\n     * @param float|float[]|null $x\n     * @param float|null $y\n     * @param float|null $w\n     * @param float|null $h\n     */\n    public function set_containing_block($x = null, $y = null, $w = null, $h = null)\n    {\n        if (is_array($x)) {\n            foreach ($x as $key => $val) {\n                $$key = $val;\n            }\n        }\n\n        if (is_numeric($x)) {\n            $this->_containing_block[\"x\"] = $x;\n        }\n\n        if (is_numeric($y)) {\n            $this->_containing_block[\"y\"] = $y;\n        }\n\n        if (is_numeric($w)) {\n            $this->_containing_block[\"w\"] = $w;\n        }\n\n        if (is_numeric($h)) {\n            $this->_containing_block[\"h\"] = $h;\n        }\n    }\n\n    /**\n     * @param float|float[]|null $x\n     * @param float|null $y\n     */\n    public function set_position($x = null, $y = null)\n    {\n        if (is_array($x)) {\n            list($x, $y) = [$x[\"x\"], $x[\"y\"]];\n        }\n\n        if (is_numeric($x)) {\n            $this->_position[\"x\"] = $x;\n        }\n\n        if (is_numeric($y)) {\n            $this->_position[\"y\"] = $y;\n        }\n    }\n\n    /**\n     * @param $opacity\n     */\n    public function set_opacity($opacity)\n    {\n        $parent = $this->get_parent();\n        $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0);\n        $this->_opacity = $base_opacity * $opacity;\n    }\n\n    /**\n     * @param LineBox $line\n     */\n    public function set_containing_line(LineBox $line)\n    {\n        $this->_containing_line = $line;\n    }\n\n    /**\n     * Indicates if the margin height is auto sized\n     *\n     * @return bool\n     */\n    public function is_auto_height()\n    {\n        $style = $this->_style;\n\n        return in_array(\n            \"auto\",\n            [\n                $style->height,\n                $style->margin_top,\n                $style->margin_bottom,\n                $style->border_top_width,\n                $style->border_bottom_width,\n                $style->padding_top,\n                $style->padding_bottom,\n                $this->_containing_block[\"h\"]\n            ],\n            true\n        );\n    }\n\n    /**\n     * Indicates if the margin width is auto sized\n     *\n     * @return bool\n     */\n    public function is_auto_width()\n    {\n        $style = $this->_style;\n\n        return in_array(\n            \"auto\",\n            [\n                $style->width,\n                $style->margin_left,\n                $style->margin_right,\n                $style->border_left_width,\n                $style->border_right_width,\n                $style->padding_left,\n                $style->padding_right,\n                $this->_containing_block[\"w\"]\n            ],\n            true\n        );\n    }\n\n    /**\n     * Tells if the frame is a text node\n     *\n     * @return bool\n     */\n    public function is_text_node()\n    {\n        if (isset($this->_is_cache[\"text_node\"])) {\n            return $this->_is_cache[\"text_node\"];\n        }\n\n        return $this->_is_cache[\"text_node\"] = ($this->get_node()->nodeName === \"#text\");\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_positionned()\n    {\n        if (isset($this->_is_cache[\"positionned\"])) {\n            return $this->_is_cache[\"positionned\"];\n        }\n\n        $position = $this->get_style()->position;\n\n        return $this->_is_cache[\"positionned\"] = in_array($position, Style::$POSITIONNED_TYPES, true);\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_absolute()\n    {\n        if (isset($this->_is_cache[\"absolute\"])) {\n            return $this->_is_cache[\"absolute\"];\n        }\n\n        $position = $this->get_style()->position;\n\n        return $this->_is_cache[\"absolute\"] = ($position === \"absolute\" || $position === \"fixed\");\n    }\n\n    /**\n     * Whether the frame is a block container.\n     *\n     * @return bool\n     */\n    public function is_block()\n    {\n        if (isset($this->_is_cache[\"block\"])) {\n            return $this->_is_cache[\"block\"];\n        }\n\n        return $this->_is_cache[\"block\"] = in_array($this->get_style()->display, Style::$BLOCK_TYPES, true);\n    }\n\n    /**\n     * Whether the frame has a block-level display type.\n     *\n     * @return bool\n     */\n    public function is_block_level(): bool\n    {\n        if (isset($this->_is_cache[\"block_level\"])) {\n            return $this->_is_cache[\"block_level\"];\n        }\n\n        $display = $this->get_style()->display;\n\n        return $this->_is_cache[\"block_level\"] = in_array($display, Style::BLOCK_LEVEL_TYPES, true);\n    }\n\n    /**\n     * Whether the frame has an inline-level display type.\n     *\n     * @return bool\n     */\n    public function is_inline_level(): bool\n    {\n        if (isset($this->_is_cache[\"inline_level\"])) {\n            return $this->_is_cache[\"inline_level\"];\n        }\n\n        $display = $this->get_style()->display;\n\n        return $this->_is_cache[\"inline_level\"] = in_array($display, Style::INLINE_LEVEL_TYPES, true);\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_inline_block()\n    {\n        if (isset($this->_is_cache[\"inline_block\"])) {\n            return $this->_is_cache[\"inline_block\"];\n        }\n\n        return $this->_is_cache[\"inline_block\"] = ($this->get_style()->display === \"inline-block\");\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_in_flow()\n    {\n        if (isset($this->_is_cache[\"in_flow\"])) {\n            return $this->_is_cache[\"in_flow\"];\n        }\n\n        return $this->_is_cache[\"in_flow\"] = !($this->get_style()->float !== \"none\" || $this->is_absolute());\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_pre()\n    {\n        if (isset($this->_is_cache[\"pre\"])) {\n            return $this->_is_cache[\"pre\"];\n        }\n\n        $white_space = $this->get_style()->white_space;\n\n        return $this->_is_cache[\"pre\"] = in_array($white_space, [\"pre\", \"pre-wrap\"], true);\n    }\n\n    /**\n     * @return bool\n     */\n    public function is_table()\n    {\n        if (isset($this->_is_cache[\"table\"])) {\n            return $this->_is_cache[\"table\"];\n        }\n\n        $display = $this->get_style()->display;\n\n        return $this->_is_cache[\"table\"] = in_array($display, Style::$TABLE_TYPES, true);\n    }\n\n\n    /**\n     * Inserts a new child at the beginning of the Frame\n     *\n     * @param Frame $child       The new Frame to insert\n     * @param bool  $update_node Whether or not to update the DOM\n     */\n    public function prepend_child(Frame $child, $update_node = true)\n    {\n        if ($update_node) {\n            $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null);\n        }\n\n        // Remove the child from its parent\n        if ($child->_parent) {\n            $child->_parent->remove_child($child, false);\n        }\n\n        $child->_parent = $this;\n        $child->_prev_sibling = null;\n\n        // Handle the first child\n        if (!$this->_first_child) {\n            $this->_first_child = $child;\n            $this->_last_child = $child;\n            $child->_next_sibling = null;\n        } else {\n            $this->_first_child->_prev_sibling = $child;\n            $child->_next_sibling = $this->_first_child;\n            $this->_first_child = $child;\n        }\n    }\n\n    /**\n     * Inserts a new child at the end of the Frame\n     *\n     * @param Frame $child       The new Frame to insert\n     * @param bool  $update_node Whether or not to update the DOM\n     */\n    public function append_child(Frame $child, $update_node = true)\n    {\n        if ($update_node) {\n            $this->_node->appendChild($child->_node);\n        }\n\n        // Remove the child from its parent\n        if ($child->_parent) {\n            $child->_parent->remove_child($child, false);\n        }\n\n        $child->_parent = $this;\n        $decorator = $child->get_decorator();\n        // force an update to the cached parent\n        if ($decorator !== null) {\n            $decorator->get_parent(false);\n        }\n        $child->_next_sibling = null;\n\n        // Handle the first child\n        if (!$this->_last_child) {\n            $this->_first_child = $child;\n            $this->_last_child = $child;\n            $child->_prev_sibling = null;\n        } else {\n            $this->_last_child->_next_sibling = $child;\n            $child->_prev_sibling = $this->_last_child;\n            $this->_last_child = $child;\n        }\n    }\n\n    /**\n     * Inserts a new child immediately before the specified frame\n     *\n     * @param Frame $new_child   The new Frame to insert\n     * @param Frame $ref         The Frame after the new Frame\n     * @param bool  $update_node Whether or not to update the DOM\n     *\n     * @throws Exception\n     */\n    public function insert_child_before(Frame $new_child, Frame $ref, $update_node = true)\n    {\n        if ($ref === $this->_first_child) {\n            $this->prepend_child($new_child, $update_node);\n\n            return;\n        }\n\n        if (is_null($ref)) {\n            $this->append_child($new_child, $update_node);\n\n            return;\n        }\n\n        if ($ref->_parent !== $this) {\n            throw new Exception(\"Reference child is not a child of this node.\");\n        }\n\n        // Update the node\n        if ($update_node) {\n            $this->_node->insertBefore($new_child->_node, $ref->_node);\n        }\n\n        // Remove the child from its parent\n        if ($new_child->_parent) {\n            $new_child->_parent->remove_child($new_child, false);\n        }\n\n        $new_child->_parent = $this;\n        $new_child->_next_sibling = $ref;\n        $new_child->_prev_sibling = $ref->_prev_sibling;\n\n        if ($ref->_prev_sibling) {\n            $ref->_prev_sibling->_next_sibling = $new_child;\n        }\n\n        $ref->_prev_sibling = $new_child;\n    }\n\n    /**\n     * Inserts a new child immediately after the specified frame\n     *\n     * @param Frame $new_child   The new Frame to insert\n     * @param Frame $ref         The Frame before the new Frame\n     * @param bool  $update_node Whether or not to update the DOM\n     *\n     * @throws Exception\n     */\n    public function insert_child_after(Frame $new_child, Frame $ref, $update_node = true)\n    {\n        if ($ref === $this->_last_child) {\n            $this->append_child($new_child, $update_node);\n\n            return;\n        }\n\n        if (is_null($ref)) {\n            $this->prepend_child($new_child, $update_node);\n\n            return;\n        }\n\n        if ($ref->_parent !== $this) {\n            throw new Exception(\"Reference child is not a child of this node.\");\n        }\n\n        // Update the node\n        if ($update_node) {\n            if ($ref->_next_sibling) {\n                $next_node = $ref->_next_sibling->_node;\n                $this->_node->insertBefore($new_child->_node, $next_node);\n            } else {\n                $new_child->_node = $this->_node->appendChild($new_child->_node);\n            }\n        }\n\n        // Remove the child from its parent\n        if ($new_child->_parent) {\n            $new_child->_parent->remove_child($new_child, false);\n        }\n\n        $new_child->_parent = $this;\n        $new_child->_prev_sibling = $ref;\n        $new_child->_next_sibling = $ref->_next_sibling;\n\n        if ($ref->_next_sibling) {\n            $ref->_next_sibling->_prev_sibling = $new_child;\n        }\n\n        $ref->_next_sibling = $new_child;\n    }\n\n    /**\n     * Remove a child frame\n     *\n     * @param Frame $child\n     * @param bool  $update_node Whether or not to remove the DOM node\n     *\n     * @throws Exception\n     * @return Frame The removed child frame\n     */\n    public function remove_child(Frame $child, $update_node = true)\n    {\n        if ($child->_parent !== $this) {\n            throw new Exception(\"Child not found in this frame\");\n        }\n\n        if ($update_node) {\n            $this->_node->removeChild($child->_node);\n        }\n\n        if ($child === $this->_first_child) {\n            $this->_first_child = $child->_next_sibling;\n        }\n\n        if ($child === $this->_last_child) {\n            $this->_last_child = $child->_prev_sibling;\n        }\n\n        if ($child->_prev_sibling) {\n            $child->_prev_sibling->_next_sibling = $child->_next_sibling;\n        }\n\n        if ($child->_next_sibling) {\n            $child->_next_sibling->_prev_sibling = $child->_prev_sibling;\n        }\n\n        $child->_next_sibling = null;\n        $child->_prev_sibling = null;\n        $child->_parent = null;\n\n        return $child;\n    }\n\n    //........................................................................\n\n    // Debugging function:\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        // Skip empty text frames\n//     if ( $this->is_text_node() &&\n//          preg_replace(\"/\\s/\", \"\", $this->_node->data) === \"\" )\n//       return \"\";\n\n\n        $str = \"<b>\" . $this->_node->nodeName . \":</b><br/>\";\n        //$str .= spl_object_hash($this->_node) . \"<br/>\";\n        $str .= \"Id: \" . $this->get_id() . \"<br/>\";\n        $str .= \"Class: \" . get_class($this) . \"<br/>\";\n\n        if ($this->is_text_node()) {\n            $tmp = htmlspecialchars($this->_node->nodeValue);\n            $str .= \"<pre>'\" . mb_substr($tmp, 0, 70) .\n                (mb_strlen($tmp) > 70 ? \"...\" : \"\") . \"'</pre>\";\n        } elseif ($css_class = $this->_node->getAttribute(\"class\")) {\n            $str .= \"CSS class: '$css_class'<br/>\";\n        }\n\n        if ($this->_parent) {\n            $str .= \"\\nParent:\" . $this->_parent->_node->nodeName .\n                \" (\" . spl_object_hash($this->_parent->_node) . \") \" .\n                \"<br/>\";\n        }\n\n        if ($this->_prev_sibling) {\n            $str .= \"Prev: \" . $this->_prev_sibling->_node->nodeName .\n                \" (\" . spl_object_hash($this->_prev_sibling->_node) . \") \" .\n                \"<br/>\";\n        }\n\n        if ($this->_next_sibling) {\n            $str .= \"Next: \" . $this->_next_sibling->_node->nodeName .\n                \" (\" . spl_object_hash($this->_next_sibling->_node) . \") \" .\n                \"<br/>\";\n        }\n\n        $d = $this->get_decorator();\n        while ($d && $d != $d->get_decorator()) {\n            $str .= \"Decorator: \" . get_class($d) . \"<br/>\";\n            $d = $d->get_decorator();\n        }\n\n        $str .= \"Position: \" . Helpers::pre_r($this->_position, true);\n        $str .= \"\\nContaining block: \" . Helpers::pre_r($this->_containing_block, true);\n        $str .= \"\\nMargin width: \" . Helpers::pre_r($this->get_margin_width(), true);\n        $str .= \"\\nMargin height: \" . Helpers::pre_r($this->get_margin_height(), true);\n\n        $str .= \"\\nStyle: <pre>\" . $this->_style->__toString() . \"</pre>\";\n\n        if ($this->_decorator instanceof FrameDecorator\\Block) {\n            $str .= \"Lines:<pre>\";\n            foreach ($this->_decorator->get_line_boxes() as $line) {\n                foreach ($line->get_frames() as $frame) {\n                    if ($frame instanceof FrameDecorator\\Text) {\n                        $str .= \"\\ntext: \";\n                        $str .= \"'\" . htmlspecialchars($frame->get_text()) . \"'\";\n                    } else {\n                        $str .= \"\\nBlock: \" . $frame->get_node()->nodeName . \" (\" . spl_object_hash($frame->get_node()) . \")\";\n                    }\n                }\n\n                $str .=\n                    \"\\ny => \" . $line->y . \"\\n\" .\n                    \"w => \" . $line->w . \"\\n\" .\n                    \"h => \" . $line->h . \"\\n\" .\n                    \"left => \" . $line->left . \"\\n\" .\n                    \"right => \" . $line->right . \"\\n\";\n            }\n            $str .= \"</pre>\";\n        }\n\n        $str .= \"\\n\";\n        if (php_sapi_name() === \"cli\") {\n            $str = strip_tags(str_replace([\"<br/>\", \"<b>\", \"</b>\"],\n                [\"\\n\", \"\", \"\"],\n                $str));\n        }\n\n        return $str;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/AbstractFrameDecorator.php",
    "content": "<?php\n\nnamespace Dompdf\\FrameDecorator;\n\nuse DOMElement;\nuse DOMNode;\nuse DOMText;\nuse Dompdf\\Helpers;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\Frame\\FrameTreeList;\nuse Dompdf\\Frame\\Factory;\nuse Dompdf\\FrameReflower\\AbstractFrameReflower;\nuse Dompdf\\Css\\Style;\nuse Dompdf\\Positioner\\AbstractPositioner;\nuse Dompdf\\Exception;\n\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\n/**\n * Base AbstractFrameDecorator class\n *\n * @package dompdf\n */\nabstract class AbstractFrameDecorator extends Frame\n{\n    const DEFAULT_COUNTER = \"-dompdf-default-counter\";\n\n    /**\n     * array([id] => counter_value) (for generated content)\n     *\n     * @var array\n     */\n    public $_counters = [];\n\n    /**\n     * The root node of the DOM tree\n     *\n     * @var Frame\n     */\n    protected $_root;\n\n    /**\n     * The decorated frame\n     *\n     * @var Frame\n     */\n    protected $_frame;\n\n    /**\n     * AbstractPositioner object used to position this frame (Strategy pattern)\n     *\n     * @var AbstractPositioner\n     */\n    protected $_positioner;\n\n    /**\n     * Reflower object used to calculate frame dimensions (Strategy pattern)\n     *\n     * @var AbstractFrameReflower\n     */\n    protected $_reflower;\n\n    /**\n     * Reference to the current dompdf instance\n     *\n     * @var Dompdf\n     */\n    protected $_dompdf;\n\n    /**\n     * First block parent\n     *\n     * @var Block\n     */\n    private $_block_parent;\n\n    /**\n     * First positioned parent (position: relative | absolute | fixed)\n     *\n     * @var AbstractFrameDecorator\n     */\n    private $_positionned_parent;\n\n    /**\n     * Cache for the get_parent while loop results\n     *\n     * @var Frame\n     */\n    private $_cached_parent;\n\n    /**\n     * Whether generated content and counters have been set.\n     *\n     * @var bool\n     */\n    public $content_set = false;\n\n    /**\n     * Whether the frame has been split\n     *\n     * @var bool\n     */\n    public $is_split = false;\n\n    /**\n     * Class constructor\n     *\n     * @param Frame $frame   The decoration target\n     * @param Dompdf $dompdf The Dompdf object\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        $this->_frame = $frame;\n        $this->_root = null;\n        $this->_dompdf = $dompdf;\n        $frame->set_decorator($this);\n    }\n\n    /**\n     * \"Destructor\": forcibly free all references held by this object\n     *\n     * @param bool $recursive if true, call dispose on all children\n     */\n    function dispose($recursive = false)\n    {\n        if ($recursive) {\n            while ($child = $this->get_first_child()) {\n                $child->dispose(true);\n            }\n        }\n\n        $this->_root = null;\n        unset($this->_root);\n\n        $this->_frame->dispose(true);\n        $this->_frame = null;\n        unset($this->_frame);\n\n        $this->_positioner = null;\n        unset($this->_positioner);\n\n        $this->_reflower = null;\n        unset($this->_reflower);\n    }\n\n    /**\n     * Return a copy of this frame with $node as its node\n     *\n     * @param DOMNode $node\n     *\n     * @return AbstractFrameDecorator\n     */\n    function copy(DOMNode $node)\n    {\n        $frame = new Frame($node);\n        $frame->set_style(clone $this->_frame->get_original_style());\n\n        if ($node instanceof DOMElement && $node->hasAttribute(\"id\")) {\n            $node->setAttribute(\"data-dompdf-original-id\", $node->getAttribute(\"id\"));\n            $node->removeAttribute(\"id\");\n        }\n\n        return Factory::decorate_frame($frame, $this->_dompdf, $this->_root);\n    }\n\n    /**\n     * Create a deep copy: copy this node and all children\n     *\n     * @return AbstractFrameDecorator\n     */\n    function deep_copy()\n    {\n        $node = $this->_frame->get_node()->cloneNode();\n        $frame = new Frame($node);\n        $frame->set_style(clone $this->_frame->get_original_style());\n\n        if ($node instanceof DOMElement && $node->hasAttribute(\"id\")) {\n            $node->setAttribute(\"data-dompdf-original-id\", $node->getAttribute(\"id\"));\n            $node->removeAttribute(\"id\");\n        }\n\n        $deco = Factory::decorate_frame($frame, $this->_dompdf, $this->_root);\n\n        foreach ($this->get_children() as $child) {\n            $deco->append_child($child->deep_copy());\n        }\n\n        return $deco;\n    }\n\n    function reset()\n    {\n        $this->_frame->reset();\n        $this->_reflower->reset();\n        $this->reset_generated_content();\n        $this->revert_counter_increment();\n\n        $this->content_set = false;\n        $this->_counters = [];\n\n        // clear parent lookup caches\n        $this->_cached_parent = null;\n        $this->_block_parent = null;\n        $this->_positionned_parent = null;\n\n        // Reset all children\n        foreach ($this->get_children() as $child) {\n            $child->reset();\n        }\n    }\n\n    /**\n     * If this represents a generated node then child nodes represent generated\n     * content. Remove the children since the content will be generated next\n     * time this frame is reflowed.\n     */\n    protected function reset_generated_content(): void\n    {\n        if ($this->content_set\n            && $this->get_node()->nodeName === \"dompdf_generated\"\n            && $this->get_style()->content !== \"normal\"\n            && $this->get_style()->content !== \"none\"\n        ) {\n            foreach ($this->get_children() as $child) {\n                $this->remove_child($child);\n            }\n        }\n    }\n\n    /**\n     * Decrement any counters that were incremented on the current node, unless\n     * that node is the body.\n     */\n    protected function revert_counter_increment(): void\n    {\n        if ($this->content_set\n            && $this->get_node()->nodeName !== \"body\"\n            && ($decrement = $this->get_style()->counter_increment) !== \"none\"\n        ) {\n            $this->decrement_counters($decrement);\n        }\n    }\n\n    // Getters -----------\n\n    function get_id()\n    {\n        return $this->_frame->get_id();\n    }\n\n    /**\n     * @return Frame\n     */\n    function get_frame()\n    {\n        return $this->_frame;\n    }\n\n    function get_node()\n    {\n        return $this->_frame->get_node();\n    }\n\n    function get_style()\n    {\n        return $this->_frame->get_style();\n    }\n\n    function get_original_style()\n    {\n        return $this->_frame->get_original_style();\n    }\n\n    function get_containing_block($i = null)\n    {\n        return $this->_frame->get_containing_block($i);\n    }\n\n    function get_position($i = null)\n    {\n        return $this->_frame->get_position($i);\n    }\n\n    /**\n     * @return Dompdf\n     */\n    function get_dompdf()\n    {\n        return $this->_dompdf;\n    }\n\n    public function get_margin_width(): float\n    {\n        return $this->_frame->get_margin_width();\n    }\n\n    public function get_margin_height(): float\n    {\n        return $this->_frame->get_margin_height();\n    }\n\n    public function get_content_box(): array\n    {\n        return $this->_frame->get_content_box();\n    }\n\n    public function get_padding_box(): array\n    {\n        return $this->_frame->get_padding_box();\n    }\n\n    public function get_border_box(): array\n    {\n        return $this->_frame->get_border_box();\n    }\n\n    function set_id($id)\n    {\n        $this->_frame->set_id($id);\n    }\n\n    function set_style(Style $style)\n    {\n        $this->_frame->set_style($style);\n    }\n\n    function set_containing_block($x = null, $y = null, $w = null, $h = null)\n    {\n        $this->_frame->set_containing_block($x, $y, $w, $h);\n    }\n\n    function set_position($x = null, $y = null)\n    {\n        $this->_frame->set_position($x, $y);\n    }\n\n    function is_auto_height()\n    {\n        return $this->_frame->is_auto_height();\n    }\n\n    function is_auto_width()\n    {\n        return $this->_frame->is_auto_width();\n    }\n\n    function __toString()\n    {\n        return $this->_frame->__toString();\n    }\n\n    function prepend_child(Frame $child, $update_node = true)\n    {\n        while ($child instanceof AbstractFrameDecorator) {\n            $child = $child->_frame;\n        }\n\n        $this->_frame->prepend_child($child, $update_node);\n    }\n\n    function append_child(Frame $child, $update_node = true)\n    {\n        while ($child instanceof AbstractFrameDecorator) {\n            $child = $child->_frame;\n        }\n\n        $this->_frame->append_child($child, $update_node);\n    }\n\n    function insert_child_before(Frame $new_child, Frame $ref, $update_node = true)\n    {\n        while ($new_child instanceof AbstractFrameDecorator) {\n            $new_child = $new_child->_frame;\n        }\n\n        if ($ref instanceof AbstractFrameDecorator) {\n            $ref = $ref->_frame;\n        }\n\n        $this->_frame->insert_child_before($new_child, $ref, $update_node);\n    }\n\n    function insert_child_after(Frame $new_child, Frame $ref, $update_node = true)\n    {\n        $insert_frame = $new_child;\n        while ($insert_frame instanceof AbstractFrameDecorator) {\n            $insert_frame = $insert_frame->_frame;\n        }\n\n        $reference_frame = $ref;\n        while ($reference_frame instanceof AbstractFrameDecorator) {\n            $reference_frame = $reference_frame->_frame;\n        }\n\n        $this->_frame->insert_child_after($insert_frame, $reference_frame, $update_node);\n    }\n\n    function remove_child(Frame $child, $update_node = true)\n    {\n        while ($child instanceof AbstractFrameDecorator) {\n            $child = $child->_frame;\n        }\n\n        return $this->_frame->remove_child($child, $update_node);\n    }\n\n    /**\n     * @param bool $use_cache\n     * @return AbstractFrameDecorator\n     */\n    function get_parent($use_cache = true)\n    {\n        if ($use_cache && $this->_cached_parent) {\n            return $this->_cached_parent;\n        }\n        $p = $this->_frame->get_parent();\n        if ($p && $deco = $p->get_decorator()) {\n            while ($tmp = $deco->get_decorator()) {\n                $deco = $tmp;\n            }\n\n            return $this->_cached_parent = $deco;\n        } else {\n            return $this->_cached_parent = $p;\n        }\n    }\n\n    /**\n     * @return AbstractFrameDecorator\n     */\n    function get_first_child()\n    {\n        $c = $this->_frame->get_first_child();\n        if ($c && $deco = $c->get_decorator()) {\n            while ($tmp = $deco->get_decorator()) {\n                $deco = $tmp;\n            }\n\n            return $deco;\n        } else {\n            if ($c) {\n                return $c;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * @return AbstractFrameDecorator\n     */\n    function get_last_child()\n    {\n        $c = $this->_frame->get_last_child();\n        if ($c && $deco = $c->get_decorator()) {\n            while ($tmp = $deco->get_decorator()) {\n                $deco = $tmp;\n            }\n\n            return $deco;\n        } else {\n            if ($c) {\n                return $c;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * @return AbstractFrameDecorator\n     */\n    function get_prev_sibling()\n    {\n        $s = $this->_frame->get_prev_sibling();\n        if ($s && $deco = $s->get_decorator()) {\n            while ($tmp = $deco->get_decorator()) {\n                $deco = $tmp;\n            }\n\n            return $deco;\n        } else {\n            if ($s) {\n                return $s;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * @return AbstractFrameDecorator\n     */\n    function get_next_sibling()\n    {\n        $s = $this->_frame->get_next_sibling();\n        if ($s && $deco = $s->get_decorator()) {\n            while ($tmp = $deco->get_decorator()) {\n                $deco = $tmp;\n            }\n\n            return $deco;\n        } else {\n            if ($s) {\n                return $s;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * @return FrameTreeList\n     */\n    function get_subtree()\n    {\n        return new FrameTreeList($this);\n    }\n\n    function set_positioner(AbstractPositioner $posn)\n    {\n        $this->_positioner = $posn;\n        if ($this->_frame instanceof AbstractFrameDecorator) {\n            $this->_frame->set_positioner($posn);\n        }\n    }\n\n    function set_reflower(AbstractFrameReflower $reflower)\n    {\n        $this->_reflower = $reflower;\n        if ($this->_frame instanceof AbstractFrameDecorator) {\n            $this->_frame->set_reflower($reflower);\n        }\n    }\n\n    /**\n     * @return AbstractPositioner\n     */\n    function get_positioner()\n    {\n        return $this->_positioner;\n    }\n\n    /**\n     * @return AbstractFrameReflower\n     */\n    function get_reflower()\n    {\n        return $this->_reflower;\n    }\n\n    /**\n     * @param Frame $root\n     */\n    function set_root(Frame $root)\n    {\n        $this->_root = $root;\n\n        if ($this->_frame instanceof AbstractFrameDecorator) {\n            $this->_frame->set_root($root);\n        }\n    }\n\n    /**\n     * @return Page\n     */\n    function get_root()\n    {\n        return $this->_root;\n    }\n\n    /**\n     * @return Block\n     */\n    function find_block_parent()\n    {\n        // Find our nearest block level parent\n        if (isset($this->_block_parent)) {\n            return $this->_block_parent;\n        }\n\n        $p = $this->get_parent();\n\n        while ($p) {\n            if ($p->is_block()) {\n                break;\n            }\n\n            $p = $p->get_parent();\n        }\n\n        return $this->_block_parent = $p;\n    }\n\n    /**\n     * @return AbstractFrameDecorator\n     */\n    function find_positionned_parent()\n    {\n        // Find our nearest relative positioned parent\n        if (isset($this->_positionned_parent)) {\n            return $this->_positionned_parent;\n        }\n\n        $p = $this->get_parent();\n        while ($p) {\n            if ($p->is_positionned()) {\n                break;\n            }\n\n            $p = $p->get_parent();\n        }\n\n        if (!$p) {\n            $p = $this->_root;\n        }\n\n        return $this->_positionned_parent = $p;\n    }\n\n    /**\n     * Split this frame at $child.\n     * The current frame is cloned and $child and all children following\n     * $child are added to the clone.  The clone is then passed to the\n     * current frame's parent->split() method.\n     *\n     * @param Frame|null $child\n     * @param bool $page_break\n     * @param bool $forced Whether the page break is forced.\n     *\n     * @throws Exception\n     */\n    public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void\n    {\n        if (is_null($child)) {\n            $this->get_parent()->split($this, $page_break, $forced);\n            return;\n        }\n\n        if ($child->get_parent() !== $this) {\n            throw new Exception(\"Unable to split: frame is not a child of this one.\");\n        }\n\n        $this->revert_counter_increment();\n        $node = $this->_frame->get_node();\n        $split = $this->copy($node->cloneNode());\n\n        $style = $this->_frame->get_style();\n        $split_style = $split->get_original_style();\n\n        // Truncate the box decoration at the split, except for the body\n        if ($node->nodeName !== \"body\") {\n            // Style reset on the first and second parts\n            $style->margin_bottom = 0;\n            $style->padding_bottom = 0;\n            $style->border_bottom = 0;\n            $style->border_bottom_left_radius = 0;\n            $style->border_bottom_right_radius = 0;\n\n            // second\n            $split_style->margin_top = 0;\n            $split_style->padding_top = 0;\n            $split_style->border_top = 0;\n            $split_style->border_top_left_radius = 0;\n            $split_style->border_top_right_radius = 0;\n            $split_style->page_break_before = \"auto\";\n        }\n\n        $split_style->text_indent = 0;\n        $split_style->counter_reset = \"none\";\n\n        $split->set_style(clone $split_style);\n        $this->is_split = true;\n        $split->_splitted = true;\n        $split->_already_pushed = true;\n\n        $this->get_parent()->insert_child_after($split, $this);\n\n        if ($this instanceof Block) {\n            // Remove the frames that will be moved to the new split node from\n            // the line boxes\n            $this->remove_frames_from_line($child);\n\n            // recalculate the float offsets after paging\n            foreach ($this->get_line_boxes() as $line_box) {\n                $line_box->get_float_offsets();\n            }\n        }\n\n        if (!$forced) {\n            // Reset top margin in case of an unforced page break\n            // https://www.w3.org/TR/CSS21/page.html#allowed-page-breaks\n            $child->get_original_style()->margin_top = 0;\n        }\n\n        // Add $child and all following siblings to the new split node\n        $iter = $child;\n        while ($iter) {\n            $frame = $iter;\n            $iter = $iter->get_next_sibling();\n            $frame->reset();\n            $frame->_parent = $split;\n            $split->append_child($frame);\n\n            // recalculate the float offsets\n            if ($frame instanceof Block) {\n                foreach ($frame->get_line_boxes() as $line_box) {\n                    $line_box->get_float_offsets();\n                }\n            }\n        }\n\n        $this->get_parent()->split($split, $page_break, $forced);\n\n        // Preserve the current counter values. This must be done after the\n        // parent split, as counters get reset on frame reset\n        $split->_counters = $this->_counters;\n    }\n\n    /**\n     * @param string $id\n     * @param int $value\n     */\n    function reset_counter($id = self::DEFAULT_COUNTER, $value = 0)\n    {\n        $this->get_parent()->_counters[$id] = intval($value);\n    }\n\n    /**\n     * @param $counters\n     */\n    function decrement_counters($counters)\n    {\n        foreach ($counters as $id => $increment) {\n            $this->increment_counter($id, intval($increment) * -1);\n        }\n    }\n\n    /**\n     * @param $counters\n     */\n    function increment_counters($counters)\n    {\n        foreach ($counters as $id => $increment) {\n            $this->increment_counter($id, intval($increment));\n        }\n    }\n\n    /**\n     * @param string $id\n     * @param int $increment\n     */\n    function increment_counter($id = self::DEFAULT_COUNTER, $increment = 1)\n    {\n        $counter_frame = $this->lookup_counter_frame($id);\n\n        if ($counter_frame) {\n            if (!isset($counter_frame->_counters[$id])) {\n                $counter_frame->_counters[$id] = 0;\n            }\n\n            $counter_frame->_counters[$id] += $increment;\n        }\n    }\n\n    /**\n     * @param string $id\n     * @return AbstractFrameDecorator|null\n     */\n    function lookup_counter_frame($id = self::DEFAULT_COUNTER)\n    {\n        $f = $this->get_parent();\n\n        while ($f) {\n            if (isset($f->_counters[$id])) {\n                return $f;\n            }\n            $fp = $f->get_parent();\n\n            if (!$fp) {\n                return $f;\n            }\n\n            $f = $fp;\n        }\n\n        return null;\n    }\n\n    /**\n     * @param string $id\n     * @param string $type\n     * @return bool|string\n     *\n     * TODO: What version is the best : this one or the one in ListBullet ?\n     */\n    function counter_value($id = self::DEFAULT_COUNTER, $type = \"decimal\")\n    {\n        $type = mb_strtolower($type);\n\n        if (!isset($this->_counters[$id])) {\n            $this->_counters[$id] = 0;\n        }\n\n        $value = $this->_counters[$id];\n\n        switch ($type) {\n            default:\n            case \"decimal\":\n                return $value;\n\n            case \"decimal-leading-zero\":\n                return str_pad($value, 2, \"0\", STR_PAD_LEFT);\n\n            case \"lower-roman\":\n                return Helpers::dec2roman($value);\n\n            case \"upper-roman\":\n                return mb_strtoupper(Helpers::dec2roman($value));\n\n            case \"lower-latin\":\n            case \"lower-alpha\":\n                return chr((($value - 1) % 26) + ord('a'));\n\n            case \"upper-latin\":\n            case \"upper-alpha\":\n                return chr((($value - 1) % 26) + ord('A'));\n\n            case \"lower-greek\":\n                return Helpers::unichr($value + 944);\n\n            case \"upper-greek\":\n                return Helpers::unichr($value + 912);\n        }\n    }\n\n    final function position()\n    {\n        $this->_positioner->position($this);\n    }\n\n    /**\n     * @param float $offset_x\n     * @param float $offset_y\n     * @param bool $ignore_self\n     */\n    final function move($offset_x, $offset_y, $ignore_self = false)\n    {\n        $this->_positioner->move($this, $offset_x, $offset_y, $ignore_self);\n    }\n\n    /**\n     * @param Block|null $block\n     */\n    final function reflow(Block $block = null)\n    {\n        // Uncomment this to see the frames before they're laid out, instead of\n        // during rendering.\n        //echo $this->_frame; flush();\n        $this->_reflower->reflow($block);\n    }\n\n    /**\n     * @return array\n     */\n    final function get_min_max_width(): array\n    {\n        return $this->_reflower->get_min_max_width();\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/Block.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\LineBox;\nuse Dompdf\\FrameReflower\\Text as TextFrameReflower;\n\n/**\n * Decorates frames for block layout\n *\n * @access  private\n * @package dompdf\n */\nclass Block extends AbstractFrameDecorator\n{\n    /**\n     * Current line index\n     *\n     * @var int\n     */\n    protected $_cl;\n\n    /**\n     * The block's line boxes\n     *\n     * @var LineBox[]\n     */\n    protected $_line_boxes;\n\n    /**\n     * Block constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n\n        $this->_line_boxes = [new LineBox($this)];\n        $this->_cl = 0;\n    }\n\n    /**\n     *\n     */\n    function reset()\n    {\n        parent::reset();\n\n        $this->_line_boxes = [new LineBox($this)];\n        $this->_cl = 0;\n    }\n\n    /**\n     * @return LineBox\n     */\n    function get_current_line_box()\n    {\n        return $this->_line_boxes[$this->_cl];\n    }\n\n    /**\n     * @return int\n     */\n    function get_current_line_number()\n    {\n        return $this->_cl;\n    }\n\n    /**\n     * @return LineBox[]\n     */\n    function get_line_boxes()\n    {\n        return $this->_line_boxes;\n    }\n\n    /**\n     * @param int $line_number\n     * @return int\n     */\n    function set_current_line_number($line_number)\n    {\n        $line_boxes_count = count($this->_line_boxes);\n        $cl = max(min($line_number, $line_boxes_count), 0);\n        return ($this->_cl = $cl);\n    }\n\n    /**\n     * @param int $i\n     */\n    function clear_line($i)\n    {\n        if (isset($this->_line_boxes[$i])) {\n            unset($this->_line_boxes[$i]);\n        }\n    }\n\n    /**\n     * @param Frame $frame\n     */\n    function add_frame_to_line(Frame $frame)\n    {\n        if (!$frame->is_in_flow()) {\n            return;\n        }\n\n        $style = $frame->get_style();\n\n        $frame->set_containing_line($this->_line_boxes[$this->_cl]);\n\n        /*\n        // Adds a new line after a block, only if certain conditions are met\n        if ((($frame instanceof Inline && $frame->get_node()->nodeName !== \"br\") ||\n              $frame instanceof Text && trim($frame->get_text())) &&\n            ($frame->get_prev_sibling() && $frame->get_prev_sibling()->get_style()->display === \"block\" &&\n             $this->_line_boxes[$this->_cl]->w > 0 )) {\n\n               $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame );\n               $this->add_line();\n\n               // Add each child of the inline frame to the line individually\n               foreach ($frame->get_children() as $child)\n                 $this->add_frame_to_line( $child );\n        }\n        else*/\n\n        // Handle inline frames (which are effectively wrappers)\n        if ($frame instanceof Inline) {\n            // Handle line breaks\n            if ($frame->get_node()->nodeName === \"br\") {\n                $this->maximize_line_height($style->line_height, $frame);\n                $this->add_line(true);\n\n                $next = $frame->get_next_sibling();\n                $p = $frame->get_parent();\n\n                if ($next && $p instanceof Inline) {\n                    $p->split($next);\n                }\n            }\n\n            return;\n        }\n\n        // Trim leading text if this is an empty line.  Kinda a hack to put it here,\n        // but what can you do...\n        if ($this->get_current_line_box()->w == 0 &&\n            $frame->is_text_node() &&\n            !$frame->is_pre()\n        ) {\n            $frame->set_text(ltrim($frame->get_text()));\n            $frame->recalculate_width();\n        }\n\n        $w = $frame->get_margin_width();\n\n        // FIXME: Why? Doesn't quite seem to be the correct thing to do,\n        // but does appear to be necessary. Hack to handle wrapped white space?\n        if ($w == 0 && $frame->get_node()->nodeName !== \"hr\" && !$frame->is_pre()) {\n            return;\n        }\n\n        // Debugging code:\n        /*\n        Helpers::pre_r(\"\\n<h3>Adding frame to line:</h3>\");\n\n        //    Helpers::pre_r(\"Me: \" . $this->get_node()->nodeName . \" (\" . spl_object_hash($this->get_node()) . \")\");\n        //    Helpers::pre_r(\"Node: \" . $frame->get_node()->nodeName . \" (\" . spl_object_hash($frame->get_node()) . \")\");\n        if ( $frame->is_text_node() )\n          Helpers::pre_r('\"'.$frame->get_node()->nodeValue.'\"');\n\n        Helpers::pre_r(\"Line width: \" . $this->_line_boxes[$this->_cl]->w);\n        Helpers::pre_r(\"Frame: \" . get_class($frame));\n        Helpers::pre_r(\"Frame width: \"  . $w);\n        Helpers::pre_r(\"Frame height: \" . $frame->get_margin_height());\n        Helpers::pre_r(\"Containing block width: \" . $this->get_containing_block(\"w\"));\n        */\n        // End debugging\n\n        $current_line = $this->_line_boxes[$this->_cl];\n        $current_line->add_frame($frame);\n\n        if ($frame->is_text_node()) {\n            $trimmed = trim($frame->get_text());\n\n            if ($trimmed !== \"\") {\n                // split the text into words (used to determine spacing between words on justified lines)\n                // The regex splits on everything that's a separator (^\\S double negative), excluding nbsp (\\xa0)\n                // This currently excludes the \"narrow nbsp\" character\n                $words = preg_split('/[^\\S\\xA0]+/u', $trimmed);\n                $current_line->wc += count($words);\n            }\n        }\n\n        $this->increase_line_width($w);\n        $this->maximize_line_height($frame->get_margin_height(), $frame);\n    }\n\n    /**\n     * Remove the given frame and all following frames and lines from the block.\n     *\n     * @param Frame $frame\n     */\n    public function remove_frames_from_line(Frame $frame): void\n    {\n        // Inline frames are not added to line boxes themselves, only their\n        // text frame children\n        $actualFrame = $frame;\n        while ($actualFrame !== null && $actualFrame instanceof Inline) {\n            $actualFrame = $actualFrame->get_first_child();\n        }\n\n        if ($actualFrame === null) {\n            return;\n        }\n\n        // Search backwards through the lines for $frame\n        $frame = $actualFrame;\n        $i = $this->_cl;\n        $j = null;\n\n        while ($i > 0) {\n            $line = $this->_line_boxes[$i];\n            foreach ($line->get_frames() as $index => $f) {\n                if ($frame === $f) {\n                    $j = $index;\n                    break 2;\n                }\n            }\n            $i--;\n        }\n\n        if ($j === null) {\n            return;\n        }\n\n        // Remove all lines that follow\n        for ($k = $this->_cl; $k > $i; $k--) {\n            unset($this->_line_boxes[$k]);\n        }\n\n        // Remove the line, if it is empty\n        if ($j > 0) {\n            $line->remove_frames($j);\n        } else {\n            unset($this->_line_boxes[$i]);\n        }\n\n        // Reset array indices\n        $this->_line_boxes = array_values($this->_line_boxes);\n        $this->_cl = count($this->_line_boxes) - 1;\n    }\n\n    /**\n     * @param float $w\n     */\n    function increase_line_width($w)\n    {\n        $this->_line_boxes[$this->_cl]->w += $w;\n    }\n\n    /**\n     * @param float $val\n     * @param Frame $frame\n     */\n    function maximize_line_height($val, Frame $frame)\n    {\n        if ($val > $this->_line_boxes[$this->_cl]->h) {\n            $this->_line_boxes[$this->_cl]->tallest_frame = $frame;\n            $this->_line_boxes[$this->_cl]->h = $val;\n        }\n    }\n\n    /**\n     * @param bool $br\n     */\n    function add_line(bool $br = false)\n    {\n        $line = $this->_line_boxes[$this->_cl];\n        $frames = $line->get_frames();\n\n        if (count($frames) > 0) {\n            $last_frame = $frames[count($frames) - 1];\n            $reflower = $last_frame->get_reflower();\n\n            if ($reflower instanceof TextFrameReflower\n                && !$last_frame->is_pre()\n            ) {\n                $reflower->trim_trailing_ws();\n                $line->recalculate_width();\n            }\n        }\n\n        $line->br = $br;\n        $y = $line->y + $line->h;\n\n        $new_line = new LineBox($this, $y);\n\n        $this->_line_boxes[++$this->_cl] = $new_line;\n    }\n\n    //........................................................................\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/Image.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\Image\\Cache;\n\n/**\n * Decorates frames for image layout and rendering\n *\n * @package dompdf\n */\nclass Image extends AbstractFrameDecorator\n{\n\n    /**\n     * The path to the image file (note that remote images are\n     * downloaded locally to Options:tempDir).\n     *\n     * @var string\n     */\n    protected $_image_url;\n\n    /**\n     * The image's file error message\n     *\n     * @var string\n     */\n    protected $_image_msg;\n\n    /**\n     * Class constructor\n     *\n     * @param Frame $frame the frame to decorate\n     * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls)\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n        $url = $frame->get_node()->getAttribute(\"src\");\n\n        $debug_png = $dompdf->getOptions()->getDebugPng();\n        if ($debug_png) {\n            print '[__construct ' . $url . ']';\n        }\n\n        list($this->_image_url, /*$type*/, $this->_image_msg) = Cache::resolve_url(\n            $url,\n            $dompdf->getProtocol(),\n            $dompdf->getBaseHost(),\n            $dompdf->getBasePath(),\n            $dompdf\n        );\n\n        if (Cache::is_broken($this->_image_url) &&\n            $alt = $frame->get_node()->getAttribute(\"alt\")\n        ) {\n            $style = $frame->get_style();\n            $style->width = (4 / 3) * $dompdf->getFontMetrics()->getTextWidth($alt, $style->font_family, $style->font_size, $style->word_spacing);\n            $style->height = $dompdf->getFontMetrics()->getFontHeight($style->font_family, $style->font_size);\n        }\n    }\n\n    /**\n     * Return the image's url\n     *\n     * @return string The url of this image\n     */\n    function get_image_url()\n    {\n        return $this->_image_url;\n    }\n\n    /**\n     * Return the image's error message\n     *\n     * @return string The image's error message\n     */\n    function get_image_msg()\n    {\n        return $this->_image_msg;\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/Inline.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\Exception;\n\n/**\n * Decorates frames for inline layout\n *\n * @access  private\n * @package dompdf\n */\nclass Inline extends AbstractFrameDecorator\n{\n\n    /**\n     * Inline constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n    }\n\n    /**\n     * Vertical padding, border, and margin do not apply when determining the\n     * height for inline frames.\n     *\n     * http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced\n     *\n     * The vertical padding, border and margin of an inline, non-replaced box\n     * start at the top and bottom of the content area, not the\n     * 'line-height'. But only the 'line-height' is used to calculate the\n     * height of the line box.\n     *\n     * @return float\n     */\n    public function get_margin_height(): float\n    {\n        $style = $this->get_style();\n        $font = $style->font_family;\n        $size = $style->font_size;\n        $fontHeight = $this->_dompdf->getFontMetrics()->getFontHeight($font, $size);\n\n        return ($style->line_height / ($size > 0 ? $size : 1)) * $fontHeight;\n    }\n\n    public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void\n    {\n        if (is_null($child)) {\n            $this->get_parent()->split($this, $page_break, $forced);\n            return;\n        }\n\n        if ($child->get_parent() !== $this) {\n            throw new Exception(\"Unable to split: frame is not a child of this one.\");\n        }\n\n        $this->revert_counter_increment();\n        $node = $this->_frame->get_node();\n        $split = $this->copy($node->cloneNode());\n        // if this is a generated node don't propagate the content style\n        if ($split->get_node()->nodeName == \"dompdf_generated\") {\n            $split->get_style()->content = \"normal\";\n        }\n        $this->get_parent()->insert_child_after($split, $this);\n\n        // Unset the current node's right style properties\n        $style = $this->_frame->get_style();\n        $style->margin_right = 0;\n        $style->padding_right = 0;\n        $style->border_right_width = 0;\n\n        // Unset the split node's left style properties since we don't want them\n        // to propagate\n        $style = $split->get_style();\n        $style->margin_left = 0;\n        $style->padding_left = 0;\n        $style->border_left_width = 0;\n\n        //On continuation of inline element on next line,\n        //don't repeat non-vertically repeatable background images\n        //See e.g. in testcase image_variants, long descriptions\n        if (($url = $style->background_image) && $url !== \"none\"\n            && ($repeat = $style->background_repeat) && $repeat !== \"repeat\" && $repeat !== \"repeat-y\"\n        ) {\n            $style->background_image = \"none\";\n        }\n\n        // Add $child and all following siblings to the new split node\n        $iter = $child;\n        while ($iter) {\n            $frame = $iter;\n            $iter = $iter->get_next_sibling();\n            $frame->reset();\n            $split->append_child($frame);\n        }\n\n        $parent = $this->get_parent();\n\n        if ($page_break) {\n            $parent->split($split, $page_break, $forced);\n        } elseif ($parent instanceof Inline) {\n            $parent->split($split);\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/ListBullet.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\n\n/**\n * Decorates frames for list bullet rendering\n *\n * @package dompdf\n */\nclass ListBullet extends AbstractFrameDecorator\n{\n\n    const BULLET_PADDING = 1; // Distance from bullet to text in pt\n    // As fraction of font size (including descent). See also DECO_THICKNESS.\n    const BULLET_THICKNESS = 0.04; // Thickness of bullet outline. Screen: 0.08, print: better less, e.g. 0.04\n    const BULLET_DESCENT = 0.3; //descent of font below baseline. Todo: Guessed for now.\n    const BULLET_SIZE = 0.35; // bullet diameter. For now 0.5 of font_size without descent.\n\n    static $BULLET_TYPES = [\"disc\", \"circle\", \"square\"];\n\n    /**\n     * ListBullet constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n    }\n\n    /**\n     * @return float\n     */\n    public function get_margin_width(): float\n    {\n        $style = $this->_frame->get_style();\n\n        if ($style->list_style_type === \"none\") {\n            return 0.0;\n        }\n\n        return $style->font_size * self::BULLET_SIZE + 2 * self::BULLET_PADDING;\n    }\n\n    /**\n     * hits only on \"inset\" lists items, to increase height of box\n     *\n     * @return float\n     */\n    public function get_margin_height(): float\n    {\n        $style = $this->_frame->get_style();\n\n        if ($style->list_style_type === \"none\") {\n            return 0.0;\n        }\n\n        return $style->font_size * self::BULLET_SIZE + 2 * self::BULLET_PADDING;\n    }\n\n    /**\n     * @return float|int\n     */\n    function get_width()\n    {\n        return $this->get_margin_width();\n    }\n\n    /**\n     * @return float|int\n     */\n    function get_height()\n    {\n        return $this->get_margin_height();\n    }\n\n    //........................................................................\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/ListBulletImage.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\Helpers;\nuse Dompdf\\Image\\Cache;\n\n/**\n * Decorates frames for list bullets with custom images\n *\n * @package dompdf\n */\nclass ListBulletImage extends AbstractFrameDecorator\n{\n\n    /**\n     * The underlying image frame\n     *\n     * @var Image\n     */\n    protected $_img;\n\n    /**\n     * The image's width in pixels\n     *\n     * @var int\n     */\n    protected $_width;\n\n    /**\n     * The image's height in pixels\n     *\n     * @var int\n     */\n    protected $_height;\n\n    /**\n     * Class constructor\n     *\n     * @param Frame $frame   the bullet frame to decorate\n     * @param Dompdf $dompdf the document's dompdf object\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        $style = $frame->get_style();\n        $url = $style->list_style_image;\n        $frame->get_node()->setAttribute(\"src\", $url);\n        $this->_img = new Image($frame, $dompdf);\n        parent::__construct($this->_img, $dompdf);\n\n        if (Cache::is_broken($this->_img->get_image_url())) {\n            $width = 0;\n            $height = 0;\n        } else {\n            list($width, $height) = Helpers::dompdf_getimagesize($this->_img->get_image_url(), $dompdf->getHttpContext());\n        }\n\n        // Resample the bullet image to be consistent with 'auto' sized images\n        // See also Image::get_min_max_width\n        // Tested php ver: value measured in px, suffix \"px\" not in value: rtrim unnecessary.\n        $dpi = $this->_dompdf->getOptions()->getDpi();\n        $this->_width = ((float)rtrim($width, \"px\") * 72) / $dpi;\n        $this->_height = ((float)rtrim($height, \"px\") * 72) / $dpi;\n\n        //If an image is taller as the containing block/box, the box should be extended.\n        //Neighbour elements are overwriting the overlapping image areas.\n        //Todo: Where can the box size be extended?\n        //Code below has no effect.\n        //See block_frame_reflower _calculate_restricted_height\n        //See generated_frame_reflower, Dompdf:render() \"list-item\", \"-dompdf-list-bullet\"S.\n        //Leave for now\n        //if ($style->min_height < $this->_height ) {\n        //  $style->min_height = $this->_height;\n        //}\n        //$style->height = \"auto\";\n    }\n\n    /**\n     * Return the bullet's width\n     *\n     * @return int\n     */\n    function get_width()\n    {\n        //ignore image width, use same width as on predefined bullet ListBullet\n        //for proper alignment of bullet image and text. Allow image to not fitting on left border.\n        //This controls the distance between bullet image and text\n        //return $this->_width;\n        return $this->_frame->get_style()->font_size * ListBullet::BULLET_SIZE +\n        2 * ListBullet::BULLET_PADDING;\n    }\n\n    /**\n     * Return the bullet's height\n     *\n     * @return int\n     */\n    function get_height()\n    {\n        //based on image height\n        if ($this->_height == 0) {\n            $style = $this->_frame->get_style();\n\n            if ($style->list_style_type === \"none\") {\n                return 0;\n            }\n    \n            return $style->font_size * ListBullet::BULLET_SIZE + 2 * ListBullet::BULLET_PADDING;\n        } else {\n            return $this->_height;\n        }\n    }\n\n    /**\n     * Override get_margin_width\n     *\n     * @return int\n     */\n    public function get_margin_width(): float\n    {\n        //ignore image width, use same width as on predefined bullet ListBullet\n        //for proper alignment of bullet image and text. Allow image to not fitting on left border.\n        //This controls the extra indentation of text to make room for the bullet image.\n        //Here use actual image size, not predefined bullet size\n        //return $this->_frame->get_style()->font_size*ListBullet::BULLET_SIZE +\n        //  2 * ListBullet::BULLET_PADDING;\n\n        // Small hack to prevent indenting of list text\n        // Image might not exist, then position like on list_bullet_frame_decorator fallback to none.\n        if ($this->_frame->get_style()->list_style_position === \"outside\" || $this->_width == 0) {\n            return 0.0;\n        }\n        //This aligns the \"inside\" image position with the text.\n        //The text starts to the right of the image.\n        //Between the image and the text there is an added margin of image width.\n        //Where this comes from is unknown.\n        //The corresponding ListBullet sets a smaller margin. bullet size?\n        return $this->_width + 2 * ListBullet::BULLET_PADDING;\n    }\n\n    /**\n     * Override get_margin_height()\n     *\n     * @return float\n     */\n    public function get_margin_height(): float\n    {\n        //Hits only on \"inset\" lists items, to increase height of box\n        //based on image height\n        return $this->_height + 2 * ListBullet::BULLET_PADDING;\n    }\n\n    /**\n     * Return image url\n     *\n     * @return string\n     */\n    function get_image_url()\n    {\n        return $this->_img->get_image_url();\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/NullFrameDecorator.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\n\n/**\n * Dummy decorator\n *\n * @package dompdf\n */\nclass NullFrameDecorator extends AbstractFrameDecorator\n{\n    /**\n     * NullFrameDecorator constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n        $style = $this->_frame->get_style();\n        $style->width = 0;\n        $style->height = 0;\n        $style->margin = 0;\n        $style->padding = 0;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/Page.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Frame;\nuse Dompdf\\Renderer;\n\n/**\n * Decorates frames for page layout\n *\n * @access  private\n * @package dompdf\n */\nclass Page extends AbstractFrameDecorator\n{\n    /**\n     * The y value of the bottom edge of the page area.\n     *\n     * https://www.w3.org/TR/CSS21/page.html#page-margins\n     *\n     * @var float\n     */\n    protected $bottom_page_edge;\n\n    /**\n     * Flag indicating page is full.\n     *\n     * @var bool\n     */\n    protected $_page_full;\n\n    /**\n     * Number of tables currently being reflowed\n     *\n     * @var int\n     */\n    protected $_in_table;\n\n    /**\n     * The pdf renderer\n     *\n     * @var Renderer\n     */\n    protected $_renderer;\n\n    /**\n     * This page's floating frames\n     *\n     * @var array\n     */\n    protected $_floating_frames = [];\n\n    //........................................................................\n\n    /**\n     * Class constructor\n     *\n     * @param Frame $frame the frame to decorate\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n        $this->_page_full = false;\n        $this->_in_table = 0;\n        $this->bottom_page_edge = null;\n    }\n\n    /**\n     * Set the renderer used for this pdf\n     *\n     * @param Renderer $renderer the renderer to use\n     */\n    function set_renderer($renderer)\n    {\n        $this->_renderer = $renderer;\n    }\n\n    /**\n     * Return the renderer used for this pdf\n     *\n     * @return Renderer\n     */\n    function get_renderer()\n    {\n        return $this->_renderer;\n    }\n\n    /**\n     * Set the frame's containing block.  Overridden to set $this->bottom_page_edge.\n     *\n     * @param float $x\n     * @param float $y\n     * @param float $w\n     * @param float $h\n     */\n    function set_containing_block($x = null, $y = null, $w = null, $h = null)\n    {\n        parent::set_containing_block($x, $y, $w, $h);\n\n        if (isset($h)) {\n            $style = $this->get_style();\n            $margin_bottom = (float) $style->length_in_pt($style->margin_bottom, $h);\n            $this->bottom_page_edge = $h - $margin_bottom;\n        }\n    }\n\n    /**\n     * Returns true if the page is full and is no longer accepting frames.\n     *\n     * @return bool\n     */\n    function is_full()\n    {\n        return $this->_page_full;\n    }\n\n    /**\n     * Start a new page by resetting the full flag.\n     */\n    function next_page()\n    {\n        $this->_floating_frames = [];\n        $this->_renderer->new_page();\n        $this->_page_full = false;\n    }\n\n    /**\n     * Indicate to the page that a table is currently being reflowed.\n     */\n    function table_reflow_start()\n    {\n        $this->_in_table++;\n    }\n\n    /**\n     * Indicate to the page that table reflow is finished.\n     */\n    function table_reflow_end()\n    {\n        $this->_in_table--;\n    }\n\n    /**\n     * Return whether we are currently in a nested table or not\n     *\n     * @return bool\n     */\n    function in_nested_table()\n    {\n        return $this->_in_table > 1;\n    }\n\n    /**\n     * Check if a forced page break is required before $frame.  This uses the\n     * frame's page_break_before property as well as the preceding frame's\n     * page_break_after property.\n     *\n     * @link http://www.w3.org/TR/CSS21/page.html#forced\n     *\n     * @param AbstractFrameDecorator $frame the frame to check\n     *\n     * @return bool true if a page break occurred\n     */\n    function check_forced_page_break(Frame $frame)\n    {\n        // Skip check if page is already split and for the body\n        if ($this->_page_full || $frame->get_node()->nodeName === \"body\") {\n            return false;\n        }\n\n        $page_breaks = [\"always\", \"left\", \"right\"];\n        $style = $frame->get_style();\n\n        if (($frame->is_block_level() || $style->display === \"table-row\")\n            && in_array($style->page_break_before, $page_breaks, true)\n        ) {\n            // Prevent cascading splits\n            $frame->split(null, true, true);\n            // We have to grab the style again here because split() resets\n            // $frame->style to the frame's original style.\n            $frame->get_style()->page_break_before = \"auto\";\n            $this->_page_full = true;\n            $frame->_already_pushed = true;\n\n            return true;\n        }\n\n        // Find the preceding block-level sibling (or table row). Inline\n        // elements are treated as if wrapped in an anonymous block container\n        // here. See https://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level\n        $prev = $frame->get_prev_sibling();\n        while ($prev && (($prev->is_text_node() && $prev->get_node()->nodeValue === \"\")\n            || $prev->get_node()->nodeName === \"bullet\")\n        ) {\n            $prev = $prev->get_prev_sibling();\n        }\n\n        if ($prev && ($prev->is_block_level() || $prev->get_style()->display === \"table-row\")) {\n            if (in_array($prev->get_style()->page_break_after, $page_breaks, true)) {\n                // Prevent cascading splits\n                $frame->split(null, true, true);\n                $prev->get_style()->page_break_after = \"auto\";\n                $this->_page_full = true;\n                $frame->_already_pushed = true;\n\n                return true;\n            }\n\n            $prev_last_child = $prev->get_last_child();\n            while ($prev_last_child && (($prev_last_child->is_text_node() && $prev_last_child->get_node()->nodeValue === \"\")\n                || $prev_last_child->get_node()->nodeName === \"bullet\")\n            ) {\n                $prev_last_child = $prev_last_child->get_prev_sibling();\n            }\n\n            if ($prev_last_child\n                && $prev_last_child->is_block_level()\n                && in_array($prev_last_child->get_style()->page_break_after, $page_breaks, true)\n            ) {\n                $frame->split(null, true, true);\n                $prev_last_child->get_style()->page_break_after = \"auto\";\n                $this->_page_full = true;\n                $frame->_already_pushed = true;\n\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Check for a gap between the top content edge of a frame and its child\n     * content.\n     *\n     * Additionally, the top margin, border, and padding of the frame must fit\n     * on the current page.\n     *\n     * @param float $childPos The top margin or line-box edge of the child content.\n     * @param Frame $frame The parent frame to check.\n     * @return bool\n     */\n    protected function hasGap(float $childPos, Frame $frame): bool\n    {\n        $style = $frame->get_style();\n        $cbw = $frame->get_containing_block(\"w\");\n        $contentEdge = $frame->get_position(\"y\") + (float) $style->length_in_pt([\n            $style->margin_top,\n            $style->border_top_width,\n            $style->padding_top\n        ], $cbw);\n\n        return $childPos > $contentEdge && $contentEdge <= $this->bottom_page_edge;\n    }\n\n    /**\n     * Determine if a page break is allowed before $frame\n     * http://www.w3.org/TR/CSS21/page.html#allowed-page-breaks\n     *\n     * In the normal flow, page breaks can occur at the following places:\n     *\n     *    1. In the vertical margin between block boxes. When an\n     *    unforced page break occurs here, the used values of the\n     *    relevant 'margin-top' and 'margin-bottom' properties are set\n     *    to '0'. When a forced page break occurs here, the used value\n     *    of the relevant 'margin-bottom' property is set to '0'; the\n     *    relevant 'margin-top' used value may either be set to '0' or\n     *    retained.\n     *    2. Between line boxes inside a block container box.\n     *    3. Between the content edge of a block container box and the\n     *    outer edges of its child content (margin edges of block-level\n     *    children or line box edges for inline-level children) if there\n     *    is a (non-zero) gap between them.\n     *\n     * These breaks are subject to the following rules:\n     *\n     *   * Rule A: Breaking at (1) is allowed only if the\n     *     'page-break-after' and 'page-break-before' properties of all\n     *     the elements generating boxes that meet at this margin allow\n     *     it, which is when at least one of them has the value\n     *     'always', 'left', or 'right', or when all of them are 'auto'.\n     *\n     *   * Rule B: However, if all of them are 'auto' and a common\n     *     ancestor of all the elements has a 'page-break-inside' value\n     *     of 'avoid', then breaking here is not allowed.\n     *\n     *   * Rule C: Breaking at (2) is allowed only if the number of line\n     *     boxes between the break and the start of the enclosing block\n     *     box is the value of 'orphans' or more, and the number of line\n     *     boxes between the break and the end of the box is the value\n     *     of 'widows' or more.\n     *\n     *   * Rule D: In addition, breaking at (2) or (3) is allowed only\n     *     if the 'page-break-inside' property of the element and all\n     *     its ancestors is 'auto'.\n     *\n     * If the above does not provide enough break points to keep content\n     * from overflowing the page boxes, then rules A, B and D are\n     * dropped in order to find additional breakpoints.\n     *\n     * If that still does not lead to sufficient break points, rule C is\n     * dropped as well, to find still more break points.\n     *\n     * We also allow breaks between table rows.\n     *\n     * @param AbstractFrameDecorator $frame the frame to check\n     *\n     * @return bool true if a break is allowed, false otherwise\n     */\n    protected function _page_break_allowed(Frame $frame)\n    {\n        Helpers::dompdf_debug(\"page-break\", \"_page_break_allowed(\" . $frame->get_node()->nodeName . \")\");\n        $display = $frame->get_style()->display;\n\n        // Block Frames (1):\n        if ($frame->is_block_level() || $display === \"-dompdf-image\") {\n\n            // Avoid breaks within table-cells\n            if ($this->_in_table > ($display === \"table\" ? 1 : 0)) {\n                Helpers::dompdf_debug(\"page-break\", \"In table: \" . $this->_in_table);\n\n                return false;\n            }\n\n            // Rule A\n            if ($frame->get_style()->page_break_before === \"avoid\") {\n                Helpers::dompdf_debug(\"page-break\", \"before: avoid\");\n\n                return false;\n            }\n\n            // Find the preceding block-level sibling. Inline elements are\n            // treated as if wrapped in an anonymous block container here. See\n            // https://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level\n            $prev = $frame->get_prev_sibling();\n            while ($prev && (($prev->is_text_node() && $prev->get_node()->nodeValue === \"\")\n                || $prev->get_node()->nodeName === \"bullet\")\n            ) {\n                $prev = $prev->get_prev_sibling();\n            }\n\n            // Does the previous element allow a page break after?\n            if ($prev && ($prev->is_block_level() || $prev->get_style()->display === \"-dompdf-image\")\n                && $prev->get_style()->page_break_after === \"avoid\"\n            ) {\n                Helpers::dompdf_debug(\"page-break\", \"after: avoid\");\n\n                return false;\n            }\n\n            // Rules B & D\n            $parent = $frame->get_parent();\n            $p = $parent;\n            while ($p) {\n                if ($p->get_style()->page_break_inside === \"avoid\") {\n                    Helpers::dompdf_debug(\"page-break\", \"parent->inside: avoid\");\n\n                    return false;\n                }\n                $p = $p->find_block_parent();\n            }\n\n            // To prevent cascading page breaks when a top-level element has\n            // page-break-inside: avoid, ensure that at least one frame is\n            // on the page before splitting.\n            if ($parent->get_node()->nodeName === \"body\" && !$prev) {\n                // We are the body's first child\n                Helpers::dompdf_debug(\"page-break\", \"Body's first child.\");\n\n                return false;\n            }\n\n            // Check for a possible type (3) break\n            if (!$prev && $parent && !$this->hasGap($frame->get_position(\"y\"), $parent)) {\n                Helpers::dompdf_debug(\"page-break\", \"First block-level frame, no gap\");\n\n                return false;\n            }\n\n            Helpers::dompdf_debug(\"page-break\", \"block: break allowed\");\n\n            return true;\n\n        } // Inline frames (2):\n        else {\n            if ($frame->is_inline_level()) {\n\n                // Avoid breaks within table-cells\n                if ($this->_in_table) {\n                    Helpers::dompdf_debug(\"page-break\", \"In table: \" . $this->_in_table);\n\n                    return false;\n                }\n\n                // Rule C\n                $block_parent = $frame->find_block_parent();\n                $parent_style = $block_parent->get_style();\n                // The line number of the frame can be less than the current\n                // number of line boxes, in case we are backtracking. As long as\n                // we are not checking for widows yet, just checking against the\n                // number of line boxes is sufficient in most cases, though.\n                if (count($block_parent->get_line_boxes()) <= $parent_style->orphans) {\n                    Helpers::dompdf_debug(\"page-break\", \"orphans\");\n\n                    return false;\n                }\n\n                // FIXME: Checking widows is tricky without having laid out the\n                // remaining line boxes.  Just ignore it for now...\n\n                // Rule D\n                $p = $block_parent;\n                while ($p) {\n                    if ($p->get_style()->page_break_inside === \"avoid\") {\n                        Helpers::dompdf_debug(\"page-break\", \"parent->inside: avoid\");\n\n                        return false;\n                    }\n                    $p = $p->find_block_parent();\n                }\n\n                // To prevent cascading page breaks when a top-level element has\n                // page-break-inside: avoid, ensure that at least one frame with\n                // some content is on the page before splitting.\n                $prev = $frame->get_prev_sibling();\n                while ($prev && ($prev->is_text_node() && trim($prev->get_node()->nodeValue) == \"\")) {\n                    $prev = $prev->get_prev_sibling();\n                }\n\n                if ($block_parent->get_node()->nodeName === \"body\" && !$prev) {\n                    // We are the body's first child\n                    Helpers::dompdf_debug(\"page-break\", \"Body's first child.\");\n\n                    return false;\n                }\n\n                Helpers::dompdf_debug(\"page-break\", \"inline: break allowed\");\n\n                return true;\n\n            // Table-rows\n            } else {\n                if ($display === \"table-row\") {\n\n                    // If this is a nested table, prevent the page from breaking\n                    if ($this->_in_table > 1) {\n                        Helpers::dompdf_debug(\"page-break\", \"table: nested table\");\n\n                        return false;\n                    }\n\n                    // Rule A (table row)\n                    if ($frame->get_style()->page_break_before === \"avoid\") {\n                        Helpers::dompdf_debug(\"page-break\", \"before: avoid\");\n\n                        return false;\n                    }\n\n                    // Find the preceding row\n                    $prev = $frame->get_prev_sibling();\n\n                    if (!$prev) {\n                        $prev_group = $frame->get_parent()->get_prev_sibling();\n\n                        if ($prev_group\n                            && in_array($prev_group->get_style()->display, Table::$ROW_GROUPS, true)\n                        ) {\n                            $prev = $prev_group->get_last_child();\n                        }\n                    }\n\n                    // Check if a page break is allowed after the preceding row\n                    if ($prev && $prev->get_style()->page_break_after === \"avoid\") {\n                        Helpers::dompdf_debug(\"page-break\", \"after: avoid\");\n\n                        return false;\n                    }\n\n                    // Avoid breaking before the first row of a table\n                    if (!$prev) {\n                        Helpers::dompdf_debug(\"page-break\", \"table: first-row\");\n\n                        return false;\n                    }\n\n                    // Rule B (table row)\n                    // Check if the page_break_inside property is not 'avoid'\n                    // for the parent table or any of its ancestors\n                    $table = Table::find_parent_table($frame);\n\n                    $p = $table;\n                    while ($p) {\n                        if ($p->get_style()->page_break_inside === \"avoid\") {\n                            Helpers::dompdf_debug(\"page-break\", \"parent->inside: avoid\");\n\n                            return false;\n                        }\n                        $p = $p->find_block_parent();\n                    }\n\n                    Helpers::dompdf_debug(\"page-break\", \"table-row: break allowed\");\n\n                    return true;\n                } else {\n                    if (in_array($display, Table::$ROW_GROUPS, true)) {\n\n                        // Disallow breaks at row-groups: only split at row boundaries\n                        return false;\n\n                    } else {\n                        Helpers::dompdf_debug(\"page-break\", \"? \" . $display);\n\n                        return false;\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Check if $frame will fit on the page.  If the frame does not fit,\n     * the frame tree is modified so that a page break occurs in the\n     * correct location.\n     *\n     * @param AbstractFrameDecorator $frame the frame to check\n     *\n     * @return bool\n     */\n    function check_page_break(Frame $frame)\n    {\n        if ($this->_page_full || $frame->_already_pushed\n            // Never check for breaks on empty text nodes\n            || ($frame->is_text_node() && $frame->get_node()->nodeValue === \"\")\n        ) {\n            return false;\n        }\n\n        $p = $frame;\n        do {\n            $display = $p->get_style()->display;\n            if ($display == \"table-row\") {\n                if ($p->_already_pushed) { return false; }\n            }\n        } while ($p = $p->get_parent());\n\n        // If the frame is absolute or fixed it shouldn't break\n        $p = $frame;\n        do {\n            if ($p->is_absolute()) {\n                return false;\n            }\n        } while ($p = $p->get_parent());\n\n        $margin_height = $frame->get_margin_height();\n\n        // Determine the frame's maximum y value\n        $max_y = (float)$frame->get_position(\"y\") + $margin_height;\n\n        // If a split is to occur here, then the bottom margins & paddings of all\n        // parents of $frame must fit on the page as well:\n        $p = $frame->get_parent();\n        while ($p && $p !== $this) {\n            $cbw = $p->get_containing_block(\"w\");\n            $max_y += (float) $p->get_style()->computed_bottom_spacing($cbw);\n            $p = $p->get_parent();\n        }\n\n        // Check if $frame flows off the page\n        if ($max_y <= $this->bottom_page_edge) {\n            // no: do nothing\n            return false;\n        }\n\n        Helpers::dompdf_debug(\"page-break\", \"check_page_break\");\n        Helpers::dompdf_debug(\"page-break\", \"in_table: \" . $this->_in_table);\n\n        // yes: determine page break location\n        $iter = $frame;\n        $flg = false;\n        $pushed_flg = false;\n\n        $in_table = $this->_in_table;\n\n        Helpers::dompdf_debug(\"page-break\", \"Starting search\");\n        while ($iter) {\n            // echo \"\\nbacktrack: \" .$iter->get_node()->nodeName .\" \".spl_object_hash($iter->get_node()). \"\";\n            if ($iter === $this) {\n                Helpers::dompdf_debug(\"page-break\", \"reached root.\");\n                // We've reached the root in our search.  Just split at $frame.\n                break;\n            }\n\n            if ($iter->_already_pushed) {\n                $pushed_flg = true;\n            } elseif ($this->_page_break_allowed($iter)) {\n                Helpers::dompdf_debug(\"page-break\", \"break allowed, splitting.\");\n                $iter->split(null, true);\n                $this->_page_full = true;\n                $this->_in_table = $in_table;\n                $iter->_already_pushed = true;\n                $frame->_already_pushed = true;\n\n                return true;\n            }\n\n            if (!$flg && $next = $iter->get_last_child()) {\n                Helpers::dompdf_debug(\"page-break\", \"following last child.\");\n\n                if ($next->is_table()) {\n                    $this->_in_table++;\n                }\n\n                $iter = $next;\n                $pushed_flg = false;\n                continue;\n            }\n\n            if ($pushed_flg) {\n                // The frame was already pushed, avoid breaking on a previous page\n                break;\n            }\n\n            $next = $iter->get_prev_sibling();\n            // Skip empty text nodes\n            while ($next && $next->is_text_node() && $next->get_node()->nodeValue === \"\") {\n                $next = $next->get_prev_sibling();\n            }\n\n            if ($next) {\n                Helpers::dompdf_debug(\"page-break\", \"following prev sibling.\");\n\n                if ($next->is_table() && !$iter->is_table()) {\n                    $this->_in_table++;\n                } else if (!$next->is_table() && $iter->is_table()) {\n                    $this->_in_table--;\n                }\n\n                $iter = $next;\n                $flg = false;\n                continue;\n            }\n\n            if ($next = $iter->get_parent()) {\n                Helpers::dompdf_debug(\"page-break\", \"following parent.\");\n\n                if ($iter->is_table()) {\n                    $this->_in_table--;\n                }\n\n                $iter = $next;\n                $flg = true;\n                continue;\n            }\n\n            break;\n        }\n\n        $this->_in_table = $in_table;\n\n        // No valid page break found.  Just break at $frame.\n        Helpers::dompdf_debug(\"page-break\", \"no valid break found, just splitting.\");\n\n        // If we are in a table, backtrack to the nearest top-level table row\n        if ($this->_in_table) {\n            $iter = $frame;\n            while ($iter && $iter->get_style()->display !== \"table-row\" && $iter->get_style()->display !== 'table-row-group' && $iter->_already_pushed === false) {\n                $iter = $iter->get_parent();\n            }\n\n            if ($iter) {\n                $iter->split(null, true);\n                $iter->_already_pushed = true;\n            } else {\n                return false;\n            }\n        } else {\n            $frame->split(null, true);\n        }\n\n        $this->_page_full = true;\n        $frame->_already_pushed = true;\n\n        return true;\n    }\n\n    //........................................................................\n\n    public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void\n    {\n        // Do nothing\n    }\n\n    /**\n     * Add a floating frame\n     *\n     * @param Frame $frame\n     *\n     * @return void\n     */\n    function add_floating_frame(Frame $frame)\n    {\n        array_unshift($this->_floating_frames, $frame);\n    }\n\n    /**\n     * @return Frame[]\n     */\n    function get_floating_frames()\n    {\n        return $this->_floating_frames;\n    }\n\n    /**\n     * @param $key\n     */\n    public function remove_floating_frame($key)\n    {\n        unset($this->_floating_frames[$key]);\n    }\n\n    /**\n     * @param Frame $child\n     * @return int|mixed\n     */\n    public function get_lowest_float_offset(Frame $child)\n    {\n        $style = $child->get_style();\n        $side = $style->clear;\n        $float = $style->float;\n\n        $y = 0;\n\n        if ($float === \"none\") {\n            foreach ($this->_floating_frames as $key => $frame) {\n                if ($side === \"both\" || $frame->get_style()->float === $side) {\n                    $y = max($y, $frame->get_position(\"y\") + $frame->get_margin_height());\n                }\n                $this->remove_floating_frame($key);\n            }\n        }\n\n        if ($y > 0) {\n            $y++; // add 1px buffer from float\n        }\n\n        return $y;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/Table.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Cellmap;\nuse DOMNode;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\Frame\\Factory;\n\n/**\n * Decorates Frames for table layout\n *\n * @package dompdf\n */\nclass Table extends AbstractFrameDecorator\n{\n    public static $VALID_CHILDREN = [\n        \"table-row-group\",\n        \"table-row\",\n        \"table-header-group\",\n        \"table-footer-group\",\n        \"table-column\",\n        \"table-column-group\",\n        \"table-caption\",\n        \"table-cell\"\n    ];\n\n    public static $ROW_GROUPS = [\n        \"table-row-group\",\n        \"table-header-group\",\n        \"table-footer-group\"\n    ];\n\n    /**\n     * The Cellmap object for this table.  The cellmap maps table cells\n     * to rows and columns, and aids in calculating column widths.\n     *\n     * @var Cellmap\n     */\n    protected $_cellmap;\n\n    /**\n     * The minimum width of the table, in pt\n     *\n     * @var float\n     */\n    protected $_min_width;\n\n    /**\n     * The maximum width of the table, in pt\n     *\n     * @var float\n     */\n    protected $_max_width;\n\n    /**\n     * Table header rows.  Each table header is duplicated when a table\n     * spans pages.\n     *\n     * @var TableRowGroup[]\n     */\n    protected $_headers;\n\n    /**\n     * Table footer rows.  Each table footer is duplicated when a table\n     * spans pages.\n     *\n     * @var TableRowGroup[]\n     */\n    protected $_footers;\n\n    /**\n     * Class constructor\n     *\n     * @param Frame $frame the frame to decorate\n     * @param Dompdf $dompdf\n     */\n    public function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n        $this->_cellmap = new Cellmap($this);\n\n        if ($frame->get_style()->table_layout === \"fixed\") {\n            $this->_cellmap->set_layout_fixed(true);\n        }\n\n        $this->_min_width = null;\n        $this->_max_width = null;\n        $this->_headers = [];\n        $this->_footers = [];\n    }\n\n    public function reset()\n    {\n        parent::reset();\n        $this->_cellmap->reset();\n        $this->_min_width = null;\n        $this->_max_width = null;\n        $this->_headers = [];\n        $this->_footers = [];\n        $this->_reflower->reset();\n    }\n\n    //........................................................................\n\n    /**\n     * Split the table at $row.  $row and all subsequent rows will be\n     * added to the clone.  This method is overridden in order to remove\n     * frames from the cellmap properly.\n     */\n    public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void\n    {\n        if (is_null($child)) {\n            parent::split($child, $page_break, $forced);\n            return;\n        }\n\n        // If $child is a header or if it is the first non-header row, do\n        // not duplicate headers, simply move the table to the next page.\n        if (count($this->_headers)\n            && !in_array($child, $this->_headers, true)\n            && !in_array($child->get_prev_sibling(), $this->_headers, true)\n        ) {\n            $first_header = null;\n\n            // Insert copies of the table headers before $child\n            foreach ($this->_headers as $header) {\n\n                $new_header = $header->deep_copy();\n\n                if (is_null($first_header)) {\n                    $first_header = $new_header;\n                }\n\n                $this->insert_child_before($new_header, $child);\n            }\n\n            parent::split($first_header, $page_break, $forced);\n\n        } elseif (in_array($child->get_style()->display, self::$ROW_GROUPS, true)) {\n\n            // Individual rows should have already been handled\n            parent::split($child, $page_break, $forced);\n\n        } else {\n\n            $iter = $child;\n\n            while ($iter) {\n                $this->_cellmap->remove_row($iter);\n                $iter = $iter->get_next_sibling();\n            }\n\n            parent::split($child, $page_break, $forced);\n        }\n    }\n\n    public function copy(DOMNode $node)\n    {\n        $deco = parent::copy($node);\n\n        // In order to keep columns' widths through pages\n        $deco->_cellmap->set_columns($this->_cellmap->get_columns());\n        $deco->_cellmap->lock_columns();\n\n        return $deco;\n    }\n\n    /**\n     * Static function to locate the parent table of a frame\n     *\n     * @param Frame $frame\n     *\n     * @return Table the table that is an ancestor of $frame\n     */\n    public static function find_parent_table(Frame $frame)\n    {\n        while ($frame = $frame->get_parent()) {\n            if ($frame->is_table()) {\n                break;\n            }\n        }\n\n        return $frame;\n    }\n\n    /**\n     * Return this table's Cellmap\n     *\n     * @return Cellmap\n     */\n    public function get_cellmap()\n    {\n        return $this->_cellmap;\n    }\n\n    /**\n     * Return the minimum width of this table\n     *\n     * @return float\n     */\n    public function get_min_width()\n    {\n        return $this->_min_width;\n    }\n\n    /**\n     * Return the maximum width of this table\n     *\n     * @return float\n     */\n    public function get_max_width()\n    {\n        return $this->_max_width;\n    }\n\n    /**\n     * Set the minimum width of the table\n     *\n     * @param float $width the new minimum width\n     */\n    public function set_min_width($width)\n    {\n        $this->_min_width = $width;\n    }\n\n    /**\n     * Set the maximum width of the table\n     *\n     * @param float $width the new maximum width\n     */\n    public function set_max_width($width)\n    {\n        $this->_max_width = $width;\n    }\n\n    /**\n     * Restructure tree so that the table has the correct structure.\n     * Invalid children (i.e. all non-table-rows) are moved below the\n     * table.\n     *\n     * @fixme #1363 Method has some bugs. $table_row has not been initialized and lookup most likely could return an\n     * array of Style instead a Style Object\n     */\n    public function normalise()\n    {\n        // Store frames generated by invalid tags and move them outside the table\n        $erroneous_frames = [];\n        $anon_row = false;\n        $iter = $this->get_first_child();\n        while ($iter) {\n            $child = $iter;\n            $iter = $iter->get_next_sibling();\n\n            $display = $child->get_style()->display;\n\n            if ($anon_row) {\n\n                if ($display === \"table-row\") {\n                    // Add the previous anonymous row\n                    $this->insert_child_before($table_row, $child);\n\n                    $table_row->normalise();\n                    $child->normalise();\n                    $this->_cellmap->add_row();\n                    $anon_row = false;\n                    continue;\n                }\n\n                // add the child to the anonymous row\n                $table_row->append_child($child);\n                continue;\n\n            } else {\n\n                if ($display === \"table-row\") {\n                    $child->normalise();\n                    continue;\n                }\n\n                if ($display === \"table-cell\") {\n                    $css = $this->get_style()->get_stylesheet();\n\n                    // Create an anonymous table row group\n                    $tbody = $this->get_node()->ownerDocument->createElement(\"tbody\");\n\n                    $frame = new Frame($tbody);\n\n                    $style = $css->create_style();\n                    $style->inherit($this->get_style());\n\n                    // Lookup styles for tbody tags.  If the user wants styles to work\n                    // better, they should make the tbody explicit... I'm not going to\n                    // try to guess what they intended.\n                    if ($tbody_style = $css->lookup(\"tbody\")) {\n                        $style->merge($tbody_style);\n                    }\n                    $style->display = 'table-row-group';\n\n                    // Okay, I have absolutely no idea why I need this clone here, but\n                    // if it's omitted, php (as of 2004-07-28) segfaults.\n                    $frame->set_style($style);\n                    $table_row_group = Factory::decorate_frame($frame, $this->_dompdf, $this->_root);\n\n                    // Create an anonymous table row\n                    $tr = $this->get_node()->ownerDocument->createElement(\"tr\");\n\n                    $frame = new Frame($tr);\n\n                    $style = $css->create_style();\n                    $style->inherit($this->get_style());\n\n                    // Lookup styles for tr tags.  If the user wants styles to work\n                    // better, they should make the tr explicit... I'm not going to\n                    // try to guess what they intended.\n                    if ($tr_style = $css->lookup(\"tr\")) {\n                        $style->merge($tr_style);\n                    }\n                    $style->display = 'table-row';\n\n                    // Okay, I have absolutely no idea why I need this clone here, but\n                    // if it's omitted, php (as of 2004-07-28) segfaults.\n                    $frame->set_style(clone $style);\n                    $table_row = Factory::decorate_frame($frame, $this->_dompdf, $this->_root);\n\n                    // Add the cell to the row\n                    $table_row->append_child($child, true);\n\n                    // Add the tr to the tbody\n                    $table_row_group->append_child($table_row, true);\n\n                    $anon_row = true;\n                    continue;\n                }\n\n                if (!in_array($display, self::$VALID_CHILDREN)) {\n                    $erroneous_frames[] = $child;\n                    continue;\n                }\n\n                // Normalise other table parts (i.e. row groups)\n                foreach ($child->get_children() as $grandchild) {\n                    if ($grandchild->get_style()->display === \"table-row\") {\n                        $grandchild->normalise();\n                    }\n                }\n\n                // Add headers and footers\n                if ($display === \"table-header-group\") {\n                    $this->_headers[] = $child;\n                } elseif ($display === \"table-footer-group\") {\n                    $this->_footers[] = $child;\n                }\n            }\n        }\n\n        if ($anon_row && $table_row_group instanceof AbstractFrameDecorator) {\n            // Add the row to the table\n            $this->_frame->append_child($table_row_group->_frame);\n            $table_row->normalise();\n        }\n\n        foreach ($erroneous_frames as $frame) {\n            $this->move_after($frame);\n        }\n    }\n\n    //........................................................................\n\n    /**\n     * Moves the specified frame and it's corresponding node outside of\n     * the table.\n     *\n     * @param Frame $frame the frame to move\n     */\n    public function move_after(Frame $frame)\n    {\n        $this->get_parent()->insert_child_after($frame, $this);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/TableCell.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\n\n/**\n * Decorates table cells for layout\n *\n * @package dompdf\n */\nclass TableCell extends BlockFrameDecorator\n{\n\n    protected $_resolved_borders;\n    protected $_content_height;\n\n    //........................................................................\n\n    /**\n     * TableCell constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n        $this->_resolved_borders = [];\n        $this->_content_height = 0;\n    }\n\n    //........................................................................\n\n    function reset()\n    {\n        parent::reset();\n        $this->_resolved_borders = [];\n        $this->_content_height = 0;\n        $this->_frame->reset();\n    }\n\n    /**\n     * @return int\n     */\n    function get_content_height()\n    {\n        return $this->_content_height;\n    }\n\n    /**\n     * @param $height\n     */\n    function set_content_height($height)\n    {\n        $this->_content_height = $height;\n    }\n\n    /**\n     * @param $height\n     */\n    function set_cell_height($height)\n    {\n        $style = $this->get_style();\n        $v_space = (float)$style->length_in_pt(\n            [\n                $style->margin_top,\n                $style->padding_top,\n                $style->border_top_width,\n                $style->border_bottom_width,\n                $style->padding_bottom,\n                $style->margin_bottom\n            ],\n            (float)$style->length_in_pt($style->height)\n        );\n\n        $new_height = $height - $v_space;\n        $style->height = $new_height;\n\n        if ($new_height > $this->_content_height) {\n            $y_offset = 0;\n\n            // Adjust our vertical alignment\n            switch ($style->vertical_align) {\n                default:\n                case \"baseline\":\n                    // FIXME: this isn't right\n\n                case \"top\":\n                    // Don't need to do anything\n                    return;\n\n                case \"middle\":\n                    $y_offset = ($new_height - $this->_content_height) / 2;\n                    break;\n\n                case \"bottom\":\n                    $y_offset = $new_height - $this->_content_height;\n                    break;\n            }\n\n            if ($y_offset) {\n                // Move our children\n                foreach ($this->get_line_boxes() as $line) {\n                    foreach ($line->get_frames() as $frame) {\n                        $frame->move(0, $y_offset);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * @param $side\n     * @param $border_spec\n     */\n    function set_resolved_border($side, $border_spec)\n    {\n        $this->_resolved_borders[$side] = $border_spec;\n    }\n\n    /**\n     * @param $side\n     * @return mixed\n     */\n    function get_resolved_border($side)\n    {\n        return $this->_resolved_borders[$side];\n    }\n\n    /**\n     * @return array\n     */\n    function get_resolved_borders()\n    {\n        return $this->_resolved_borders;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/TableRow.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Table as TableFrameDecorator;\n\n/**\n * Decorates Frames for table row layout\n *\n * @package dompdf\n */\nclass TableRow extends AbstractFrameDecorator\n{\n    /**\n     * TableRow constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n    }\n\n    //........................................................................\n\n    /**\n     * Remove all non table-cell frames from this row and move them after\n     * the table.\n     */\n    function normalise()\n    {\n        // Find our table parent\n        $p = TableFrameDecorator::find_parent_table($this);\n\n        $erroneous_frames = [];\n        foreach ($this->get_children() as $child) {\n            $display = $child->get_style()->display;\n\n            if ($display !== \"table-cell\") {\n                $erroneous_frames[] = $child;\n            }\n        }\n\n        //  dump the extra nodes after the table.\n        foreach ($erroneous_frames as $frame) {\n            $p->move_after($frame);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/TableRowGroup.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\n\n/**\n * Table row group decorator\n *\n * Overrides split() method for tbody, thead & tfoot elements\n *\n * @package dompdf\n */\nclass TableRowGroup extends AbstractFrameDecorator\n{\n\n    /**\n     * Class constructor\n     *\n     * @param Frame $frame   Frame to decorate\n     * @param Dompdf $dompdf Current dompdf instance\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        parent::__construct($frame, $dompdf);\n    }\n\n    /**\n     * Split the row group at the given child and remove all subsequent child\n     * rows and all subsequent row groups from the cellmap.\n     */\n    public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void\n    {\n        if (is_null($child)) {\n            parent::split($child, $page_break, $forced);\n            return;\n        }\n\n        // Remove child & all subsequent rows from the cellmap\n        $cellmap = $this->get_parent()->get_cellmap();\n        $iter = $child;\n\n        while ($iter) {\n            $cellmap->remove_row($iter);\n            $iter = $iter->get_next_sibling();\n        }\n\n        // Remove all subsequent row groups from the cellmap\n        $iter = $this->get_next_sibling();\n\n        while ($iter) {\n            $cellmap->remove_row_group($iter);\n            $iter = $iter->get_next_sibling();\n        }\n\n        // If we are splitting at the first child remove the\n        // table-row-group from the cellmap as well\n        if ($child === $this->get_first_child()) {\n            $cellmap->remove_row_group($this);\n            parent::split(null, $page_break, $forced);\n            return;\n        }\n\n        $cellmap->update_row_group($this, $child->get_prev_sibling());\n        parent::split($child, $page_break, $forced);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameDecorator/Text.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Brian Sweeney <eclecticgeek@gmail.com>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameDecorator;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Frame;\nuse Dompdf\\Exception;\n\n/**\n * Decorates Frame objects for text layout\n *\n * @access  private\n * @package dompdf\n */\nclass Text extends AbstractFrameDecorator\n{\n    /**\n     * @var float|null\n     */\n    protected $_text_spacing;\n\n    /**\n     * Text constructor.\n     * @param Frame $frame\n     * @param Dompdf $dompdf\n     * @throws Exception\n     */\n    function __construct(Frame $frame, Dompdf $dompdf)\n    {\n        if (!$frame->is_text_node()) {\n            throw new Exception(\"Text_Decorator can only be applied to #text nodes.\");\n        }\n\n        parent::__construct($frame, $dompdf);\n        $this->_text_spacing = null;\n    }\n\n    function reset()\n    {\n        parent::reset();\n        $this->_text_spacing = null;\n    }\n\n    // Accessor methods\n\n    /**\n     * @return float|null\n     */\n    function get_text_spacing()\n    {\n        return $this->_text_spacing;\n    }\n\n    /**\n     * @return string\n     */\n    function get_text()\n    {\n        // FIXME: this should be in a child class (and is incorrect)\n//    if ( $this->_frame->get_style()->content !== \"normal\" ) {\n//      $this->_frame->get_node()->data = $this->_frame->get_style()->content;\n//      $this->_frame->get_style()->content = \"normal\";\n//    }\n\n//      Helpers::pre_r(\"---\");\n//      $style = $this->_frame->get_style();\n//      var_dump($text = $this->_frame->get_node()->data);\n//      var_dump($asc = utf8_decode($text));\n//      for ($i = 0; $i < strlen($asc); $i++)\n//        Helpers::pre_r(\"$i: \" . $asc[$i] . \" - \" . ord($asc[$i]));\n//      Helpers::pre_r(\"width: \" . $this->_dompdf->getFontMetrics()->getTextWidth($text, $style->font_family, $style->font_size));\n\n        return $this->_frame->get_node()->data;\n    }\n\n    //........................................................................\n\n    /**\n     * Vertical padding, border, and margin do not apply when determining the\n     * height for inline frames.\n     *\n     * http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced\n     *\n     * The vertical padding, border and margin of an inline, non-replaced box\n     * start at the top and bottom of the content area, not the\n     * 'line-height'. But only the 'line-height' is used to calculate the\n     * height of the line box.\n     *\n     * @return float\n     */\n    public function get_margin_height(): float\n    {\n        // This function is also called in add_frame_to_line() and is used to\n        // determine the line height\n        $style = $this->get_style();\n        $font = $style->font_family;\n        $size = $style->font_size;\n        $fontHeight = $this->_dompdf->getFontMetrics()->getFontHeight($font, $size);\n\n        return ($style->line_height / ($size > 0 ? $size : 1)) * $fontHeight;\n    }\n\n    public function get_padding_box(): array\n    {\n        $style = $this->_frame->get_style();\n        $pb = $this->_frame->get_padding_box();\n        $pb[3] = $pb[\"h\"] = (float) $style->length_in_pt($style->height);\n        return $pb;\n    }\n\n    /**\n     * @param float $spacing\n     */\n    function set_text_spacing($spacing)\n    {\n        $style = $this->_frame->get_style();\n\n        $this->_text_spacing = $spacing;\n        $char_spacing = (float)$style->length_in_pt($style->letter_spacing);\n\n        // Re-adjust our width to account for the change in spacing\n        $style->width = $this->_dompdf->getFontMetrics()->getTextWidth($this->get_text(), $style->font_family, $style->font_size, $spacing, $char_spacing);\n    }\n\n    /**\n     *  Recalculate the text width\n     *\n     * @return float\n     */\n    function recalculate_width()\n    {\n        $style = $this->get_style();\n        $text = $this->get_text();\n        $size = $style->font_size;\n        $font = $style->font_family;\n        $word_spacing = (float)$style->length_in_pt($style->word_spacing);\n        $char_spacing = (float)$style->length_in_pt($style->letter_spacing);\n\n        return $style->width = $this->_dompdf->getFontMetrics()->getTextWidth($text, $font, $size, $word_spacing, $char_spacing);\n    }\n\n    // Text manipulation methods\n\n    /**\n     * split the text in this frame at the offset specified.  The remaining\n     * text is added a sibling frame following this one and is returned.\n     *\n     * @param int $offset\n     * @return Frame|null\n     */\n    function split_text($offset)\n    {\n        if ($offset == 0) {\n            return null;\n        }\n\n        $split = $this->_frame->get_node()->splitText($offset);\n        if ($split === false) {\n            return null;\n        }\n        \n        $deco = $this->copy($split);\n\n        $p = $this->get_parent();\n        $p->insert_child_after($deco, $this, false);\n\n        if ($p instanceof Inline) {\n            $p->split($deco);\n        }\n\n        return $deco;\n    }\n\n    /**\n     * @param int $offset\n     * @param int $count\n     */\n    function delete_text($offset, $count)\n    {\n        $this->_frame->get_node()->deleteData($offset, $count);\n    }\n\n    /**\n     * @param string $text\n     */\n    function set_text($text)\n    {\n        $this->_frame->get_node()->data = $text;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/AbstractFrameReflower.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block;\nuse Dompdf\\Frame\\Factory;\n\n/**\n * Base reflower class\n *\n * Reflower objects are responsible for determining the width and height of\n * individual frames.  They also create line and page breaks as necessary.\n *\n * @package dompdf\n */\nabstract class AbstractFrameReflower\n{\n\n    /**\n     * Frame for this reflower\n     *\n     * @var Frame\n     */\n    protected $_frame;\n\n    /**\n     * Cached min/max (content) size\n     *\n     * @var array\n     */\n    protected $_min_max_cache;\n\n    /**\n     * AbstractFrameReflower constructor.\n     * @param Frame $frame\n     */\n    function __construct(Frame $frame)\n    {\n        $this->_frame = $frame;\n        $this->_min_max_cache = null;\n    }\n\n    function dispose()\n    {\n    }\n\n    /**\n     * @return Dompdf\n     */\n    function get_dompdf()\n    {\n        return $this->_frame->get_dompdf();\n    }\n\n    public function reset(): void\n    {\n        $this->_min_max_cache = null;\n    }\n\n    /**\n     * Determine the actual containing block for absolute and fixed position.\n     *\n     * https://www.w3.org/TR/CSS21/visudet.html#containing-block-details\n     */\n    protected function determine_absolute_containing_block(): void\n    {\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n\n        switch ($style->position) {\n            case \"absolute\":\n                $parent = $frame->find_positionned_parent();\n                if ($parent !== $frame->get_root()) {\n                    $parent_style = $parent->get_style();\n                    $parent_padding_box = $parent->get_padding_box();\n                    //FIXME: an accurate measure of the positioned parent height\n                    //       is not possible until reflow has completed;\n                    //       we'll fall back to the parent's containing block,\n                    //       which is wrong for auto-height parents\n                    if ($parent_style->height === \"auto\") {\n                        $parent_containing_block = $parent->get_containing_block();\n                        $containing_block_height = $parent_containing_block[\"h\"] -\n                            (float)$parent_style->length_in_pt([\n                                $parent_style->margin_top,\n                                $parent_style->margin_bottom,\n                                $parent_style->border_top_width,\n                                $parent_style->border_bottom_width\n                            ], $parent_containing_block[\"w\"]);\n                    } else {\n                        $containing_block_height = $parent_padding_box[\"h\"];\n                    }\n                    $frame->set_containing_block($parent_padding_box[\"x\"], $parent_padding_box[\"y\"], $parent_padding_box[\"w\"], $containing_block_height);\n                    break;\n                }\n            case \"fixed\":\n                $initial_cb = $frame->get_root()->get_first_child()->get_containing_block();\n                $frame->set_containing_block($initial_cb[\"x\"], $initial_cb[\"y\"], $initial_cb[\"w\"], $initial_cb[\"h\"]);\n                break;\n            default:\n                // Nothing to do, containing block already set via parent\n                break;\n        }\n    }\n\n    /**\n     * Collapse frames margins\n     * http://www.w3.org/TR/CSS21/box.html#collapsing-margins\n     */\n    protected function _collapse_margins()\n    {\n        $frame = $this->_frame;\n\n        // Margins of float/absolutely positioned/inline-level elements do not collapse\n        if (!$frame->is_in_flow() || $frame->is_inline_level()\n            || $frame->get_root() === $frame || $frame->get_parent() === $frame->get_root()\n        ) {\n            return;\n        }\n\n        $cb = $frame->get_containing_block();\n        $style = $frame->get_style();\n\n        $t = $style->length_in_pt($style->margin_top, $cb[\"w\"]);\n        $b = $style->length_in_pt($style->margin_bottom, $cb[\"w\"]);\n\n        // Handle 'auto' values\n        if ($t === \"auto\") {\n            $style->margin_top = 0;\n            $t = 0;\n        }\n\n        if ($b === \"auto\") {\n            $style->margin_bottom = 0;\n            $b = 0;\n        }\n\n        // Collapse vertical margins:\n        $n = $frame->get_next_sibling();\n        if ( $n && !($n->is_block_level() && $n->is_in_flow()) ) {\n            while ($n = $n->get_next_sibling()) {\n                if ($n->is_block_level() && $n->is_in_flow()) {\n                    break;\n                }\n\n                if (!$n->get_first_child()) {\n                    $n = null;\n                    break;\n                }\n            }\n        }\n\n        if ($n) {\n            $n_style = $n->get_style();\n            $n_t = (float)$n_style->length_in_pt($n_style->margin_top, $cb[\"w\"]);\n\n            $b = $this->_get_collapsed_margin_length($b, $n_t);\n            $style->margin_bottom = $b;\n            $n_style->margin_top = 0;\n        }\n\n        // Collapse our first child's margin, if there is no border or padding\n        if ($style->border_top_width == 0 && $style->length_in_pt($style->padding_top) == 0) {\n            $f = $this->_frame->get_first_child();\n            if ( $f && !($f->is_block_level() && $f->is_in_flow()) ) {\n                while ($f = $f->get_next_sibling()) {\n                    if ($f->is_block_level() && $f->is_in_flow()) {\n                        break;\n                    }\n\n                    if (!$f->get_first_child()) {\n                        $f = null;\n                        break;\n                    }\n                }\n            }\n\n            // Margins are collapsed only between block-level boxes\n            if ($f) {\n                $f_style = $f->get_style();\n                $f_t = (float)$f_style->length_in_pt($f_style->margin_top, $cb[\"w\"]);\n\n                $t = $this->_get_collapsed_margin_length($t, $f_t);\n                $style->margin_top = $t;\n                $f_style->margin_top = 0;\n            }\n        }\n\n        // Collapse our last child's margin, if there is no border or padding\n        if ($style->border_bottom_width == 0 && $style->length_in_pt($style->padding_bottom) == 0) {\n            $l = $this->_frame->get_last_child();\n            if ( $l && !($l->is_block_level() && $l->is_in_flow()) ) {\n                while ($l = $l->get_prev_sibling()) {\n                    if ($l->is_block_level() && $l->is_in_flow()) {\n                        break;\n                    }\n\n                    if (!$l->get_last_child()) {\n                        $l = null;\n                        break;\n                    }\n                }\n            }\n\n            // Margins are collapsed only between block-level boxes\n            if ($l) {\n                $l_style = $l->get_style();\n                $l_b = (float)$l_style->length_in_pt($l_style->margin_bottom, $cb[\"w\"]);\n\n                $b = $this->_get_collapsed_margin_length($b, $l_b);\n                $style->margin_bottom = $b;\n                $l_style->margin_bottom = 0;\n            }\n        }\n    }\n\n    /**\n     * Get the combined (collapsed) length of two adjoining margins.\n     *\n     * See http://www.w3.org/TR/CSS21/box.html#collapsing-margins.\n     *\n     * @param float $length1\n     * @param float $length2\n     * @return float\n     */\n    private function _get_collapsed_margin_length($length1, $length2)\n    {\n        if ($length1 < 0 && $length2 < 0) {\n            return min($length1, $length2); // min(x, y) = - max(abs(x), abs(y)), if x < 0 && y < 0\n        }\n        \n        if ($length1 < 0 || $length2 < 0) {\n            return $length1 + $length2; // x + y = x - abs(y), if y < 0\n        }\n        \n        return max($length1, $length2);\n    }\n\n    /**\n     * Handle relative positioning according to\n     * https://www.w3.org/TR/CSS21/visuren.html#relative-positioning.\n     *\n     * @param Frame $frame The frame to handle.\n     */\n    protected function position_relative(Frame $frame): void\n    {\n        $style = $frame->get_style();\n\n        if ($style->position === \"relative\") {\n            $cb = $frame->get_containing_block();\n            $top = $style->length_in_pt($style->top, $cb[\"h\"]);\n            $right = $style->length_in_pt($style->right, $cb[\"w\"]);\n            $bottom = $style->length_in_pt($style->bottom, $cb[\"h\"]);\n            $left = $style->length_in_pt($style->left, $cb[\"w\"]);\n\n            // FIXME RTL case:\n            // if ($left !== \"auto\" && $right !== \"auto\") $left = -$right;\n            if ($left === \"auto\" && $right === \"auto\") {\n                $left = 0;\n            } elseif ($left === \"auto\") {\n                $left = -(float) $right;\n            }\n\n            if ($top === \"auto\" && $bottom === \"auto\") {\n                $top = 0;\n            } elseif ($top === \"auto\") {\n                $top = -(float) $bottom;\n            }\n\n            $frame->move((float) $left, (float) $top);\n        }\n    }\n\n    /**\n     * @param Block|null $block\n     * @return mixed\n     */\n    abstract function reflow(Block $block = null);\n\n    /**\n     * Get the minimum and maximum width of the content of this frame.\n     *\n     * @return array An array [0 => min, 1 => max, \"min\" => min, \"max\" => max]\n     * of the min and max width.\n     */\n    function get_min_max_content_width(): array\n    {\n        if (!is_null($this->_min_max_cache)) {\n            return $this->_min_max_cache;\n        }\n\n        $cb_w = $this->_frame->get_containing_block(\"w\");\n        $style = $this->_frame->get_style();\n\n        // Ignore percentage values for a specified width here, as the\n        // containing block is not defined yet\n        $display = $style->display;\n        $width = $style->width;\n        $fixed_width = $width !== \"auto\" && !Helpers::is_percent($width);\n\n        // If the frame has a specified width, then we don't need to check its\n        // children. Table cells are handled slightly differently below\n        if ($fixed_width && $display !== \"inline\" && $display !== \"table-cell\") {\n            $width = (float) $style->length_in_pt($width, $cb_w);\n            return $this->_min_max_cache = [$width, $width, \"min\" => $width, \"max\" => $width];\n        }\n\n        $low = [];\n        $high = [];\n\n        for ($iter = $this->_frame->get_children()->getIterator(); $iter->valid(); $iter->next()) {\n            $inline_min = 0;\n            $inline_max = 0;\n\n            // Add all adjacent inline widths together to calculate max width\n            while ($iter->valid() && ($iter->current()->is_inline_level() || $iter->current()->get_style()->display === \"-dompdf-image\")) {\n                $child = $iter->current();\n                $child->get_reflower()->_set_content();\n                $minmax = $child->get_min_max_width();\n\n                if (in_array($child->get_style()->white_space, [\"pre\", \"nowrap\"], true)) {\n                    $inline_min += $minmax[\"min\"];\n                } else {\n                    $low[] = $minmax[\"min\"];\n                }\n\n                $inline_max += $minmax[\"max\"];\n                $iter->next();\n            }\n\n            if ($inline_min > 0) {\n                $low[] = $inline_min;\n            }\n            if ($inline_max > 0) {\n                $high[] = $inline_max;\n            }\n\n            // Skip children with absolute position\n            if ($iter->valid() && !$iter->current()->is_absolute()) {\n                $child = $iter->current();\n                $child->get_reflower()->_set_content();\n                list($low[], $high[]) = $child->get_min_max_width();\n            }\n        }\n        $min = count($low) ? max($low) : 0;\n        $max = count($high) ? max($high) : 0;\n\n        // For table cells: Use specified width if it is greater than the\n        // minimum defined by the content\n        if ($fixed_width && $display === \"table-cell\") {\n            $width = (float) $style->length_in_pt($width, $cb_w);\n            $min = max($width, $min);\n            $max = $min;\n        }\n\n        return $this->_min_max_cache = [$min, $max, \"min\" => $min, \"max\" => $max];\n    }\n\n    /**\n     * Required for table layout: Get the minimum and maximum width of this\n     * frame.  This provides a basic implementation.  Child classes should\n     * override this if necessary.\n     *\n     * @return array An array [0 => min, 1 => max, \"min\" => min, \"max\" => max]\n     * of the min and max width.\n     */\n    function get_min_max_width(): array\n    {\n        $style = $this->_frame->get_style();\n\n        // Account for margins & padding\n        $dims = [$style->padding_left,\n            $style->padding_right,\n            $style->border_left_width,\n            $style->border_right_width,\n            $style->margin_left,\n            $style->margin_right];\n\n        $cb_w = $this->_frame->get_containing_block(\"w\");\n        $delta = (float)$style->length_in_pt($dims, $cb_w);\n\n        [$min, $max] = $this->get_min_max_content_width();\n\n        $min += $delta;\n        $max += $delta;\n        return [$min, $max, \"min\" => $min, \"max\" => $max];\n    }\n\n    /**\n     * Parses a CSS string containing quotes and escaped hex characters\n     *\n     * @param $string string The CSS string to parse\n     * @param $single_trim\n     * @return string\n     */\n    protected function _parse_string($string, $single_trim = false)\n    {\n        if ($single_trim) {\n            $string = preg_replace('/^[\\\"\\']/', \"\", $string);\n            $string = preg_replace('/[\\\"\\']$/', \"\", $string);\n        } else {\n            $string = trim($string, \"'\\\"\");\n        }\n\n        $string = str_replace([\"\\\\\\n\", '\\\\\"', \"\\\\'\"],\n            [\"\", '\"', \"'\"], $string);\n\n        // Convert escaped hex characters into ascii characters (e.g. \\A => newline)\n        $string = preg_replace_callback(\"/\\\\\\\\([0-9a-fA-F]{0,6})/\",\n            function ($matches) { return \\Dompdf\\Helpers::unichr(hexdec($matches[1])); },\n            $string);\n        return $string;\n    }\n\n    /**\n     * Parses a CSS \"quotes\" property\n     *\n     * @return array|null An array of pairs of quotes\n     */\n    protected function _parse_quotes()\n    {\n        // Matches quote types\n        $re = '/(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")/';\n\n        $quotes = $this->_frame->get_style()->quotes;\n\n        // split on spaces, except within quotes\n        if (!preg_match_all($re, \"$quotes\", $matches, PREG_SET_ORDER)) {\n            return null;\n        }\n\n        $quotes_array = [];\n        foreach ($matches as $_quote) {\n            $quotes_array[] = $this->_parse_string($_quote[0], true);\n        }\n\n        if (empty($quotes_array)) {\n            $quotes_array = ['\"', '\"'];\n        }\n\n        return array_chunk($quotes_array, 2);\n    }\n\n    /**\n     * Parses the CSS \"content\" property\n     *\n     * @return string|null The resulting string\n     */\n    protected function _parse_content()\n    {\n        // Matches generated content\n        $re = \"/\\n\" .\n            \"\\s(counters?\\\\([^)]*\\\\))|\\n\" .\n            \"\\A(counters?\\\\([^)]*\\\\))|\\n\" .\n            \"\\s([\\\"']) ( (?:[^\\\"']|\\\\\\\\[\\\"'])+ )(?<!\\\\\\\\)\\\\3|\\n\" .\n            \"\\A([\\\"']) ( (?:[^\\\"']|\\\\\\\\[\\\"'])+ )(?<!\\\\\\\\)\\\\5|\\n\" .\n            \"\\s([^\\s\\\"']+)|\\n\" .\n            \"\\A([^\\s\\\"']+)\\n\" .\n            \"/xi\";\n\n        $content = $this->_frame->get_style()->content;\n\n        $quotes = $this->_parse_quotes();\n\n        // split on spaces, except within quotes\n        if (!preg_match_all($re, $content, $matches, PREG_SET_ORDER)) {\n            return null;\n        }\n\n        $text = \"\";\n\n        foreach ($matches as $match) {\n            if (isset($match[2]) && $match[2] !== \"\") {\n                $match[1] = $match[2];\n            }\n\n            if (isset($match[6]) && $match[6] !== \"\") {\n                $match[4] = $match[6];\n            }\n\n            if (isset($match[8]) && $match[8] !== \"\") {\n                $match[7] = $match[8];\n            }\n\n            if (isset($match[1]) && $match[1] !== \"\") {\n                // counters?(...)\n                $match[1] = mb_strtolower(trim($match[1]));\n\n                // Handle counter() references:\n                // http://www.w3.org/TR/CSS21/generate.html#content\n\n                $i = mb_strpos($match[1], \")\");\n                if ($i === false) {\n                    continue;\n                }\n\n                preg_match('/(counters?)(^\\()*?\\(\\s*([^\\s,]+)\\s*(,\\s*[\"\\']?([^\"\\'\\)]*)[\"\\']?\\s*(,\\s*([^\\s)]+)\\s*)?)?\\)/i', $match[1], $args);\n                $counter_id = $args[3];\n                if (strtolower($args[1]) == 'counter') {\n                    // counter(name [,style])\n                    if (isset($args[5])) {\n                        $type = trim($args[5]);\n                    } else {\n                        $type = null;\n                    }\n                    $p = $this->_frame->lookup_counter_frame($counter_id);\n\n                    $text .= $p->counter_value($counter_id, $type);\n\n                } else if (strtolower($args[1]) == 'counters') {\n                    // counters(name, string [,style])\n                    if (isset($args[5])) {\n                        $string = $this->_parse_string($args[5]);\n                    } else {\n                        $string = \"\";\n                    }\n\n                    if (isset($args[7])) {\n                        $type = trim($args[7]);\n                    } else {\n                        $type = null;\n                    }\n\n                    $p = $this->_frame->lookup_counter_frame($counter_id);\n                    $tmp = [];\n                    while ($p) {\n                        // We only want to use the counter values when they actually increment the counter\n                        if (array_key_exists($counter_id, $p->_counters)) {\n                            array_unshift($tmp, $p->counter_value($counter_id, $type));\n                        }\n                        $p = $p->lookup_counter_frame($counter_id);\n                    }\n                    $text .= implode($string, $tmp);\n                } else {\n                    // countertops?\n                    continue;\n                }\n\n            } else if (isset($match[4]) && $match[4] !== \"\") {\n                // String match\n                $text .= $this->_parse_string($match[4]);\n            } else if (isset($match[7]) && $match[7] !== \"\") {\n                // Directive match\n\n                if ($match[7] === \"open-quote\") {\n                    // FIXME: do something here\n                    $text .= $quotes[0][0];\n                } else if ($match[7] === \"close-quote\") {\n                    // FIXME: do something else here\n                    $text .= $quotes[0][1];\n                } else if ($match[7] === \"no-open-quote\") {\n                    // FIXME:\n                } else if ($match[7] === \"no-close-quote\") {\n                    // FIXME:\n                } else if (mb_strpos($match[7], \"attr(\") === 0) {\n                    $i = mb_strpos($match[7], \")\");\n                    if ($i === false) {\n                        continue;\n                    }\n\n                    $attr = mb_substr($match[7], 5, $i - 5);\n                    if ($attr == \"\") {\n                        continue;\n                    }\n\n                    $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr);\n                } else {\n                    continue;\n                }\n            }\n        }\n\n        return $text;\n    }\n\n    /**\n     * Sets the generated content of a generated frame\n     */\n    protected function _set_content()\n    {\n        $frame = $this->_frame;\n\n        if ($frame->content_set) {\n            return;\n        }\n\n        $style = $frame->get_style();\n\n        if ($style->counter_reset && ($reset = $style->counter_reset) !== \"none\") {\n            $vars = preg_split('/\\s+/', trim($reset), 2);\n            $frame->reset_counter($vars[0], isset($vars[1]) ? $vars[1] : 0);\n        }\n\n        if ($style->counter_increment && ($increment = $style->counter_increment) !== \"none\") {\n            $frame->increment_counters($increment);\n        }\n\n        if ($style->content && $frame->get_node()->nodeName === \"dompdf_generated\") {\n            $content = $this->_parse_content();\n            $node = $frame->get_node()->ownerDocument->createTextNode($content);\n\n            $new_style = $style->get_stylesheet()->create_style();\n            $new_style->inherit($style);\n\n            $new_frame = new Frame($node);\n            $new_frame->set_style($new_style);\n\n            Factory::decorate_frame($new_frame, $frame->get_dompdf(), $frame->get_root());\n            $frame->append_child($new_frame);\n        }\n\n        $frame->content_set = true;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/Block.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\TableCell as TableCellFrameDecorator;\nuse Dompdf\\FrameDecorator\\Text as TextFrameDecorator;\nuse Dompdf\\Positioner\\Inline as InlinePositioner;\nuse Dompdf\\Exception;\nuse Dompdf\\Css\\Style;\n\n/**\n * Reflows block frames\n *\n * @package dompdf\n */\nclass Block extends AbstractFrameReflower\n{\n    // Minimum line width to justify, as fraction of available width\n    const MIN_JUSTIFY_WIDTH = 0.80;\n\n    /**\n     * @var BlockFrameDecorator\n     */\n    protected $_frame;\n\n    function __construct(BlockFrameDecorator $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     *  Calculate the ideal used value for the width property as per:\n     *  http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins\n     *\n     * @param float $width\n     *\n     * @return array\n     */\n    protected function _calculate_width($width)\n    {\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n        $absolute = $frame->is_absolute();\n\n        $cb = $frame->get_containing_block();\n        $w = $cb[\"w\"];\n\n        $rm = $style->length_in_pt($style->margin_right, $w);\n        $lm = $style->length_in_pt($style->margin_left, $w);\n\n        $left = $style->length_in_pt($style->left, $w);\n        $right = $style->length_in_pt($style->right, $w);\n\n        // Handle 'auto' values\n        $dims = [$style->border_left_width,\n            $style->border_right_width,\n            $style->padding_left,\n            $style->padding_right,\n            $width !== \"auto\" ? $width : 0,\n            $rm !== \"auto\" ? $rm : 0,\n            $lm !== \"auto\" ? $lm : 0];\n\n        // absolutely positioned boxes take the 'left' and 'right' properties into account\n        if ($absolute) {\n            $dims[] = $left !== \"auto\" ? $left : 0;\n            $dims[] = $right !== \"auto\" ? $right : 0;\n        }\n\n        $sum = (float)$style->length_in_pt($dims, $w);\n\n        // Compare to the containing block\n        $diff = $w - $sum;\n\n        if ($absolute) {\n            // Absolutely positioned\n            // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width\n\n            if ($width === \"auto\" || $left === \"auto\" || $right === \"auto\") {\n                // \"all of the three are 'auto'\" logic + otherwise case\n                if ($lm === \"auto\") {\n                    $lm = 0;\n                }\n                if ($rm === \"auto\") {\n                    $rm = 0;\n                }\n\n                $block_parent = $frame->find_block_parent();\n                $parent_content = $block_parent->get_content_box();\n                $line = $block_parent->get_current_line_box();\n\n                // TODO: This is the in-flow inline position. Use the in-flow\n                // block position if the original display type is block-level\n                $inflow_x = $parent_content[\"x\"] - $cb[\"x\"] + $line->left + $line->w;\n\n                if ($width === \"auto\" && $left === \"auto\" && $right === \"auto\") {\n                    // rule 3, per instruction preceding rule set\n                    // shrink-to-fit width\n                    $left = $inflow_x;\n                    [$min, $max] = $this->get_min_max_content_width();\n                    $width = min(max($min, $diff - $left), $max);\n                    $right = $diff - $left - $width;\n                } elseif ($width === \"auto\" && $left === \"auto\") {\n                    // rule 1\n                    // shrink-to-fit width\n                    [$min, $max] = $this->get_min_max_content_width();\n                    $width = min(max($min, $diff), $max);\n                    $left = $diff - $width;\n                } elseif ($width === \"auto\" && $right === \"auto\") {\n                    // rule 3\n                    // shrink-to-fit width\n                    [$min, $max] = $this->get_min_max_content_width();\n                    $width = min(max($min, $diff), $max);\n                    $right = $diff - $width;\n                } elseif ($left === \"auto\" && $right === \"auto\") {\n                    // rule 2\n                    $left = $inflow_x;\n                    $right = $diff - $left;\n                } elseif ($left === \"auto\") {\n                    // rule 4\n                    $left = $diff;\n                } elseif ($width === \"auto\") {\n                    // rule 5\n                    $width = max($diff, 0);\n                } else {\n                    // $right === \"auto\"\n                    // rule 6\n                    $right = $diff;\n                }\n            } else {\n                // \"none of the three are 'auto'\" logic described in paragraph preceding the rules\n                if ($diff >= 0) {\n                    if ($lm === \"auto\" && $rm === \"auto\") {\n                        $lm = $rm = $diff / 2;\n                    } elseif ($lm === \"auto\") {\n                        $lm = $diff;\n                    } elseif ($rm === \"auto\") {\n                        $rm = $diff;\n                    }\n                } else {\n                    // over-constrained, solve for right\n                    $right = $right + $diff;\n\n                    if ($lm === \"auto\") {\n                        $lm = 0;\n                    }\n                    if ($rm === \"auto\") {\n                        $rm = 0;\n                    }\n                }\n            }\n        } elseif ($style->float !== \"none\" || $style->display === \"inline-block\") {\n            // Shrink-to-fit width for float and inline block\n            // https://www.w3.org/TR/CSS21/visudet.html#float-width\n            // https://www.w3.org/TR/CSS21/visudet.html#inlineblock-width\n\n            if ($width === \"auto\") {\n                [$min, $max] = $this->get_min_max_content_width();\n                $width = min(max($min, $diff), $max);\n            }\n            if ($lm === \"auto\") {\n                $lm = 0;\n            }\n            if ($rm === \"auto\") {\n                $rm = 0;\n            }\n        } else {\n            // Block-level, normal flow\n            // https://www.w3.org/TR/CSS21/visudet.html#blockwidth\n\n            if ($diff >= 0) {\n                // Find auto properties and get them to take up the slack\n                if ($width === \"auto\") {\n                    $width = $diff;\n\n                    if ($lm === \"auto\") {\n                        $lm = 0;\n                    }\n                    if ($rm === \"auto\") {\n                        $rm = 0;\n                    }\n                } elseif ($lm === \"auto\" && $rm === \"auto\") {\n                    $lm = $rm = $diff / 2;\n                } elseif ($lm === \"auto\") {\n                    $lm = $diff;\n                } elseif ($rm === \"auto\") {\n                    $rm = $diff;\n                }\n            } else {\n                // We are over constrained--set margin-right to the difference\n                $rm = $rm + $diff;\n\n                if ($width === \"auto\") {\n                    $width = 0;\n                }\n                if ($lm === \"auto\") {\n                    $lm = 0;\n                }\n                if ($rm === \"auto\") {\n                    $rm = 0;\n                }\n            }\n        }\n\n        return [\n            \"width\" => $width,\n            \"margin_left\" => $lm,\n            \"margin_right\" => $rm,\n            \"left\" => $left,\n            \"right\" => $right,\n        ];\n    }\n\n    /**\n     * Call the above function, but resolve max/min widths\n     *\n     * @throws Exception\n     * @return array\n     */\n    protected function _calculate_restricted_width()\n    {\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n        $cb = $frame->get_containing_block();\n\n        if (!isset($cb[\"w\"])) {\n            throw new Exception(\"Box property calculation requires containing block width\");\n        }\n\n        $width = $style->length_in_pt($style->width, $cb[\"w\"]);\n\n        $calculate_width = $this->_calculate_width($width);\n        $margin_left = $calculate_width['margin_left'];\n        $margin_right = $calculate_width['margin_right'];\n        $width =  $calculate_width['width'];\n        $left =  $calculate_width['left'];\n        $right =  $calculate_width['right'];\n\n        // Handle min/max width\n        // https://www.w3.org/TR/CSS21/visudet.html#min-max-widths\n        $min_width = $style->length_in_pt($style->min_width, $cb[\"w\"]);\n        $max_width = $style->length_in_pt($style->max_width, $cb[\"w\"]);\n\n        if ($max_width !== \"none\" && $width > $max_width) {\n            extract($this->_calculate_width($max_width));\n        }\n\n        if ($width < $min_width) {\n            $calculate_width = $this->_calculate_width($min_width);\n            $margin_left = $calculate_width['margin_left'];\n            $margin_right = $calculate_width['margin_right'];\n            $width =  $calculate_width['width'];\n            $left =  $calculate_width['left'];\n            $right =  $calculate_width['right'];\n        }\n\n        return [$width, $margin_left, $margin_right, $left, $right];\n    }\n\n    /**\n     * Determine the unrestricted height of content within the block\n     * not by adding each line's height, but by getting the last line's position.\n     * This because lines could have been pushed lower by a clearing element.\n     *\n     * @return float\n     */\n    protected function _calculate_content_height()\n    {\n        $height = 0;\n        $lines = $this->_frame->get_line_boxes();\n        if (count($lines) > 0) {\n            $last_line = end($lines);\n            $content_box = $this->_frame->get_content_box();\n            $height = $last_line->y + $last_line->h - $content_box[\"y\"];\n        }\n        return $height;\n    }\n\n    /**\n     * Determine the frame's restricted height\n     *\n     * @return array\n     */\n    protected function _calculate_restricted_height()\n    {\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n        $content_height = $this->_calculate_content_height();\n        $cb = $frame->get_containing_block();\n\n        $height = $style->length_in_pt($style->height, $cb[\"h\"]);\n        $margin_top = $style->length_in_pt($style->margin_top, $cb[\"w\"]);\n        $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb[\"w\"]);\n\n        $top = $style->length_in_pt($style->top, $cb[\"h\"]);\n        $bottom = $style->length_in_pt($style->bottom, $cb[\"h\"]);\n\n        if ($frame->is_absolute()) {\n            // Absolutely positioned\n            // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height\n\n            $h_dims = [\n                $top !== \"auto\" ? $top : 0,\n                $height !== \"auto\" ? $height : 0,\n                $bottom !== \"auto\" ? $bottom : 0\n            ];\n            $w_dims = [\n                $style->margin_top !== \"auto\" ? $style->margin_top : 0,\n                $style->padding_top,\n                $style->border_top_width,\n                $style->border_bottom_width,\n                $style->padding_bottom,\n                $style->margin_bottom !== \"auto\" ? $style->margin_bottom : 0\n            ];\n\n            $sum = (float)$style->length_in_pt($h_dims, $cb[\"h\"])\n                + (float)$style->length_in_pt($w_dims, $cb[\"w\"]);\n\n            $diff = $cb[\"h\"] - $sum;\n\n            if ($height === \"auto\" || $top === \"auto\" || $bottom === \"auto\") {\n                // \"all of the three are 'auto'\" logic + otherwise case\n                if ($margin_top === \"auto\") {\n                    $margin_top = 0;\n                }\n                if ($margin_bottom === \"auto\") {\n                    $margin_bottom = 0;\n                }\n\n                $block_parent = $frame->find_block_parent();\n                $current_line = $block_parent->get_current_line_box();\n\n                // TODO: This is the in-flow inline position. Use the in-flow\n                // block position if the original display type is block-level\n                $inflow_y = $current_line->y - $cb[\"y\"];\n\n                if ($height === \"auto\" && $top === \"auto\" && $bottom === \"auto\") {\n                    // rule 3, per instruction preceding rule set\n                    $top = $inflow_y;\n                    $height = $content_height;\n                    $bottom = $diff - $top - $height;\n                } elseif ($height === \"auto\" && $top === \"auto\") {\n                    // rule 1\n                    $height = $content_height;\n                    $top = $diff - $height;\n                } elseif ($height === \"auto\" && $bottom === \"auto\") {\n                    // rule 3\n                    $height = $content_height;\n                    $bottom = $diff - $height;\n                } elseif ($top === \"auto\" && $bottom === \"auto\") {\n                    // rule 2\n                    $top = $inflow_y;\n                    $bottom = $diff - $top;\n                } elseif ($top === \"auto\") {\n                    // rule 4\n                    $top = $diff;\n                } elseif ($height === \"auto\") {\n                    // rule 5\n                    $height = max($diff, 0);\n                } else {\n                    // $bottom === \"auto\"\n                    // rule 6\n                    $bottom = $diff;\n                }\n            } else {\n                // \"none of the three are 'auto'\" logic described in paragraph preceding the rules\n                if ($diff >= 0) {\n                    if ($margin_top === \"auto\" && $margin_bottom === \"auto\") {\n                        $margin_top = $margin_bottom = $diff / 2;\n                    } elseif ($margin_top === \"auto\") {\n                        $margin_top = $diff;\n                    } elseif ($margin_bottom === \"auto\") {\n                        $margin_bottom = $diff;\n                    }\n                } else {\n                    // over-constrained, solve for bottom\n                    $bottom = $bottom + $diff;\n\n                    if ($margin_top === \"auto\") {\n                        $margin_top = 0;\n                    }\n                    if ($margin_bottom === \"auto\") {\n                        $margin_bottom = 0;\n                    }\n                }\n            }\n        } else {\n            // http://www.w3.org/TR/CSS21/visudet.html#normal-block\n            // http://www.w3.org/TR/CSS21/visudet.html#block-root-margin\n\n            if ($height === \"auto\") {\n                $height = $content_height;\n            }\n            if ($margin_top === \"auto\") {\n                $margin_top = 0;\n            }\n            if ($margin_bottom === \"auto\") {\n                $margin_bottom = 0;\n            }\n\n            // FIXME: this should probably be moved to a separate function as per\n            // _calculate_restricted_width\n\n            $min_height = $style->min_height;\n            $max_height = $style->max_height;\n\n            if (isset($cb[\"h\"])) {\n                $min_height = $style->length_in_pt($min_height, $cb[\"h\"]);\n                $max_height = $style->length_in_pt($max_height, $cb[\"h\"]);\n            } else if (isset($cb[\"w\"])) {\n                if (mb_strpos($min_height, \"%\") !== false) {\n                    $min_height = 0;\n                } else {\n                    $min_height = $style->length_in_pt($min_height, $cb[\"w\"]);\n                }\n\n                if (mb_strpos($max_height, \"%\") !== false) {\n                    $max_height = \"none\";\n                } else {\n                    $max_height = $style->length_in_pt($max_height, $cb[\"w\"]);\n                }\n            }\n\n            if ($max_height !== \"none\" && $max_height !== \"auto\" && $height > (float)$max_height) {\n                $height = $max_height;\n            }\n\n            if ($height < (float)$min_height) {\n                $height = $min_height;\n            }\n        }\n\n        return [$height, $margin_top, $margin_bottom, $top, $bottom];\n    }\n\n    /**\n     * Adjust the justification of each of our lines.\n     * http://www.w3.org/TR/CSS21/text.html#propdef-text-align\n     */\n    protected function _text_align()\n    {\n        $style = $this->_frame->get_style();\n        $w = $this->_frame->get_containing_block(\"w\");\n        $width = (float)$style->length_in_pt($style->width, $w);\n        $text_indent = (float)$style->length_in_pt($style->text_indent, $w);\n\n        switch ($style->text_align) {\n            default:\n            case \"left\":\n                foreach ($this->_frame->get_line_boxes() as $line) {\n                    if (!$line->inline || !$line->left) {\n                        continue;\n                    }\n\n                    foreach ($line->get_frames() as $frame) {\n                        if ($frame->get_positioner() instanceof InlinePositioner) {\n                            $frame->move($line->left, 0);\n                        }\n                    }\n                }\n                break;\n\n            case \"right\":\n                foreach ($this->_frame->get_line_boxes() as $i => $line) {\n                    if (!$line->inline) {\n                        continue;\n                    }\n\n                    // Move each child over by $dx\n                    $indent = $i === 0 ? $text_indent : 0;\n                    $dx = $width - $line->w - $line->right - $indent;\n\n                    foreach ($line->get_frames() as $frame) {\n                        if ($frame->get_positioner() instanceof InlinePositioner) {\n                            $frame->move($dx, 0);\n                        }\n                    }\n                }\n                break;\n\n            case \"justify\":\n                // We justify all lines except the last one, unless the frame\n                // has been split, in which case the actual last line is part of\n                // the split-off frame\n                $lines = $this->_frame->get_line_boxes();\n                $last_line_index = $this->_frame->is_split ? null : count($lines) - 1;\n\n                foreach ($lines as $i => $line) {\n                    if (!$line->inline) {\n                        continue;\n                    }\n\n                    if ($line->left) {\n                        foreach ($line->get_frames() as $frame) {\n                            if ($frame->get_positioner() instanceof InlinePositioner) {\n                                $frame->move($line->left, 0);\n                            }\n                        }\n                    }\n\n                    if ($line->br || $i === $last_line_index) {\n                        continue;\n                    }\n\n                    $other_frame_count = 0;\n\n                    foreach ($line->get_frames() as $frame) {\n                        if (!($frame instanceof TextFrameDecorator)) {\n                            $other_frame_count++;\n                        }\n                    }\n\n                    $word_count = $line->wc + $other_frame_count;\n\n                    // Set the spacing for each child\n                    if ($word_count > 1) {\n                        $indent = $i === 0 ? $text_indent : 0;\n                        $spacing = ($width - $line->get_width() - $indent) / ($word_count - 1);\n                    } else {\n                        $spacing = 0;\n                    }\n\n                    $dx = 0;\n                    foreach ($line->get_frames() as $frame) {\n                        if ($frame instanceof TextFrameDecorator) {\n                            $text = $frame->get_text();\n                            $spaces = mb_substr_count($text, \" \");\n\n                            $frame->move($dx, 0);\n                            $frame->set_text_spacing($spacing);\n\n                            $dx += $spaces * $spacing;\n                        } else {\n                            $frame->move($dx, 0);\n                        }\n                    }\n\n                    // The line (should) now occupy the entire width\n                    $line->w = $width;\n                }\n                break;\n\n            case \"center\":\n            case \"centre\":\n                foreach ($this->_frame->get_line_boxes() as $i => $line) {\n                    if (!$line->inline) {\n                        continue;\n                    }\n\n                    // Centre each line by moving each frame in the line by:\n                    $indent = $i === 0 ? $text_indent : 0;\n                    $dx = ($width + $line->left - $line->w - $line->right - $indent) / 2;\n\n                    foreach ($line->get_frames() as $frame) {\n                        if ($frame->get_positioner() instanceof InlinePositioner) {\n                            $frame->move($dx, 0);\n                        }\n                    }\n                }\n                break;\n        }\n    }\n\n    /**\n     * Align inline children vertically.\n     * Aligns each child vertically after each line is reflowed\n     */\n    function vertical_align()\n    {\n        $canvas = null;\n\n        foreach ($this->_frame->get_line_boxes() as $line) {\n\n            $height = $line->h;\n\n            foreach ($line->get_frames() as $frame) {\n                $style = $frame->get_style();\n                $isInlineBlock = (\n                    '-dompdf-image' === $style->display\n                    || 'inline-block' === $style->display\n                    || 'inline-table' === $style->display\n                );\n                if (!$isInlineBlock && $style->display !== \"inline\") {\n                    continue;\n                }\n\n                if (!isset($canvas)) {\n                    $canvas = $frame->get_root()->get_dompdf()->getCanvas();\n                }\n\n                $baseline = $canvas->get_font_baseline($style->font_family, $style->font_size);\n                $y_offset = 0;\n\n                //FIXME: The 0.8 ratio applied to the height is arbitrary (used to accommodate descenders?)\n                if ($isInlineBlock) {\n                    $lineFrames = $line->get_frames();\n                    if (count($lineFrames) == 1) {\n                        continue;\n                    }\n                    $frameBox = $frame->get_border_box();\n                    $imageHeightDiff = $height * 0.8 - $frameBox['h'];\n\n                    $align = $frame->get_style()->vertical_align;\n                    if (in_array($align, Style::$vertical_align_keywords) === true) {\n                        switch ($align) {\n                            case \"middle\":\n                                $y_offset = $imageHeightDiff / 2;\n                                break;\n\n                            case \"sub\":\n                                $y_offset = 0.3 * $height + $imageHeightDiff;\n                                break;\n\n                            case \"super\":\n                                $y_offset = -0.2 * $height + $imageHeightDiff;\n                                break;\n\n                            case \"text-top\": // FIXME: this should be the height of the frame minus the height of the text\n                                $y_offset = $height - $style->line_height;\n                                break;\n\n                            case \"top\":\n                                break;\n\n                            case \"text-bottom\": // FIXME: align bottom of image with the descender?\n                            case \"bottom\":\n                                $y_offset = 0.3 * $height + $imageHeightDiff;\n                                break;\n\n                            case \"baseline\":\n                            default:\n                                $y_offset = $imageHeightDiff;\n                                break;\n                        }\n                    } else {\n                        $y_offset = $baseline - (float)$style->length_in_pt($align, $style->font_size) - $frameBox['h'];\n                    }\n                } else {\n                    $parent = $frame->get_parent();\n                    if ($parent instanceof TableCellFrameDecorator) {\n                        $align = \"baseline\";\n                    } else {\n                        $align = $parent->get_style()->vertical_align;\n                    }\n                    if (in_array($align, Style::$vertical_align_keywords) === true) {\n                        switch ($align) {\n                            case \"middle\":\n                                $y_offset = ($height * 0.8 - $baseline) / 2;\n                                break;\n\n                            case \"sub\":\n                                $y_offset = $height * 0.8 - $baseline * 0.5;\n                                break;\n\n                            case \"super\":\n                                $y_offset = $height * 0.8 - $baseline * 1.4;\n                                break;\n\n                            case \"text-top\":\n                            case \"top\": // Not strictly accurate, but good enough for now\n                                break;\n\n                            case \"text-bottom\":\n                            case \"bottom\":\n                                $y_offset = $height * 0.8 - $baseline;\n                                break;\n\n                            case \"baseline\":\n                            default:\n                                $y_offset = $height * 0.8 - $baseline;\n                                break;\n                        }\n                    } else {\n                        $y_offset = $height * 0.8 - $baseline - (float)$style->length_in_pt($align, $style->font_size);\n                    }\n                }\n\n                if ($y_offset !== 0) {\n                    $frame->move(0, $y_offset);\n                }\n            }\n        }\n    }\n\n    /**\n     * @param Frame $child\n     */\n    function process_clear(Frame $child)\n    {\n        $child_style = $child->get_style();\n        $root = $this->_frame->get_root();\n\n        // Handle \"clear\"\n        if ($child_style->clear !== \"none\") {\n            //TODO: this is a WIP for handling clear/float frames that are in between inline frames\n            if ($child->get_prev_sibling() !== null) {\n                $this->_frame->add_line();\n            }\n            if ($child_style->float !== \"none\" && $child->get_next_sibling()) {\n                $this->_frame->set_current_line_number($this->_frame->get_current_line_number() - 1);\n            }\n\n            $lowest_y = $root->get_lowest_float_offset($child);\n\n            // If a float is still applying, we handle it\n            if ($lowest_y) {\n                if ($child->is_in_flow()) {\n                    $line_box = $this->_frame->get_current_line_box();\n                    $line_box->y = $lowest_y + $child->get_margin_height();\n                    $line_box->left = 0;\n                    $line_box->right = 0;\n                }\n\n                $child->move(0, $lowest_y - $child->get_position(\"y\"));\n            }\n        }\n    }\n\n    /**\n     * @param Frame $child\n     * @param float $cb_x\n     * @param float $cb_w\n     */\n    function process_float(Frame $child, $cb_x, $cb_w)\n    {\n        $child_style = $child->get_style();\n        $root = $this->_frame->get_root();\n\n        // Handle \"float\"\n        if ($child_style->float !== \"none\") {\n            $root->add_floating_frame($child);\n\n            // Remove next frame's beginning whitespace\n            $next = $child->get_next_sibling();\n            if ($next && $next instanceof TextFrameDecorator) {\n                $next->set_text(ltrim($next->get_text()));\n            }\n\n            $line_box = $this->_frame->get_current_line_box();\n            list($old_x, $old_y) = $child->get_position();\n\n            $float_x = $cb_x;\n            $float_y = $old_y;\n            $float_w = $child->get_margin_width();\n\n            if ($child_style->clear === \"none\") {\n                switch ($child_style->float) {\n                    case \"left\":\n                        $float_x += $line_box->left;\n                        break;\n                    case \"right\":\n                        $float_x += ($cb_w - $line_box->right - $float_w);\n                        break;\n                }\n            } else {\n                if ($child_style->float === \"right\") {\n                    $float_x += ($cb_w - $float_w);\n                }\n            }\n\n            if ($cb_w < $float_x + $float_w - $old_x) {\n                // TODO handle when floating elements don't fit\n            }\n\n            $line_box->get_float_offsets();\n\n            if ($child->_float_next_line) {\n                $float_y += $line_box->h;\n            }\n\n            $child->set_position($float_x, $float_y);\n            $child->move($float_x - $old_x, $float_y - $old_y, true);\n        }\n    }\n\n    /**\n     * @param BlockFrameDecorator $block\n     * @return mixed|void\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n\n        // Check if a page break is forced\n        $page = $this->_frame->get_root();\n        $page->check_forced_page_break($this->_frame);\n\n        // Bail if the page is full\n        if ($page->is_full()) {\n            return;\n        }\n\n        $this->determine_absolute_containing_block();\n\n        // Generated content\n        $this->_set_content();\n\n        // Collapse margins if required\n        $this->_collapse_margins();\n\n        $style = $this->_frame->get_style();\n        $cb = $this->_frame->get_containing_block();\n\n        // Determine the constraints imposed by this frame: calculate the width\n        // of the content area:\n        list($width, $left_margin, $right_margin, $left, $right) = $this->_calculate_restricted_width();\n\n        // Store the calculated properties\n        $style->width = $width;\n        $style->margin_left = $left_margin;\n        $style->margin_right = $right_margin;\n        $style->left = $left;\n        $style->right = $right;\n\n        $margin_top = $style->length_in_pt($style->margin_top, $cb[\"w\"]);\n        $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb[\"w\"]);\n\n        $auto_top = $style->top === \"auto\";\n        $auto_margin_top = $margin_top === \"auto\";\n\n        // Update the position\n        $this->_frame->position();\n        list($x, $y) = $this->_frame->get_position();\n\n        // Adjust the first line based on the text-indent property\n        $indent = (float)$style->length_in_pt($style->text_indent, $cb[\"w\"]);\n        $this->_frame->increase_line_width($indent);\n\n        // Determine the content edge\n        $top = (float)$style->length_in_pt([\n            $margin_top !== \"auto\" ? $margin_top : 0,\n            $style->border_top_width,\n            $style->padding_top\n        ], $cb[\"w\"]);\n        $bottom = (float)$style->length_in_pt([\n            $margin_bottom !== \"auto\" ? $margin_bottom : 0,\n            $style->border_bottom_width,\n            $style->padding_bottom\n        ], $cb[\"w\"]);\n\n        $cb_x = $x + (float)$left_margin + (float)$style->length_in_pt([$style->border_left_width,\n                $style->padding_left], $cb[\"w\"]);\n\n        $cb_y = $y + $top;\n\n        $height = $style->length_in_pt($style->height, $cb[\"h\"]);\n        if ($height === \"auto\") {\n            $height = ($cb[\"h\"] + $cb[\"y\"]) - $bottom - $cb_y;\n        }\n\n        // Set the y position of the first line in this block\n        $line_box = $this->_frame->get_current_line_box();\n        $line_box->y = $cb_y;\n        $line_box->get_float_offsets();\n\n        // Set the containing blocks and reflow each child\n        foreach ($this->_frame->get_children() as $child) {\n\n            // Bail out if the page is full\n            if ($page->is_full()) {\n                break;\n            }\n\n            $child->set_containing_block($cb_x, $cb_y, $width, $height);\n\n            $this->process_clear($child);\n\n            $child->reflow($this->_frame);\n\n            // Don't add the child to the line if a page break has occurred\n            if ($page->check_page_break($child)) {\n                break;\n            }\n\n            $this->process_float($child, $cb_x, $width);\n        }\n\n        // Determine our height\n        list($height, $margin_top, $margin_bottom, $top, $bottom) = $this->_calculate_restricted_height();\n        $style->height = $height;\n        $style->margin_top = $margin_top;\n        $style->margin_bottom = $margin_bottom;\n        $style->top = $top;\n        $style->bottom = $bottom;\n\n        if ($this->_frame->is_absolute()) {\n            if ($auto_top) {\n                $this->_frame->move(0, $top);\n            }\n            if ($auto_margin_top) {\n                $this->_frame->move(0, $margin_top, true);\n            }\n        }\n\n        $this->_text_align();\n        $this->vertical_align();\n\n        // Handle relative positioning\n        foreach ($this->_frame->get_children() as $child) {\n            $this->position_relative($child);\n        }\n\n        if ($block && $this->_frame->is_in_flow()) {\n            $block->add_frame_to_line($this->_frame);\n\n            if ($this->_frame->is_block_level()) {\n                $block->add_line();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/Image.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\Frame;\nuse Dompdf\\Helpers;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Image as ImageFrameDecorator;\n\n/**\n * Image reflower class\n *\n * @package dompdf\n */\nclass Image extends AbstractFrameReflower\n{\n\n    /**\n     * Image constructor.\n     * @param ImageFrameDecorator $frame\n     */\n    function __construct(ImageFrameDecorator $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $this->determine_absolute_containing_block();\n\n        //FLOAT\n        //$frame = $this->_frame;\n        //$page = $frame->get_root();\n\n        //if ($frame->get_style()->float !== \"none\" ) {\n        //  $page->add_floating_frame($this);\n        //}\n\n        // Set the frame's width\n        $this->get_min_max_width();\n        $this->resolve_margins();\n\n        $this->_frame->position();\n\n        if ($block) {\n            $block->add_frame_to_line($this->_frame);\n        }\n    }\n\n    function get_min_max_width(): array\n    {\n        $frame = $this->_frame;\n\n        if ($this->get_dompdf()->getOptions()->getDebugPng()) {\n            // Determine the image's size. Time consuming. Only when really needed?\n            list($img_width, $img_height) = Helpers::dompdf_getimagesize($frame->get_image_url(), $this->get_dompdf()->getHttpContext());\n            print \"get_min_max_width() \" .\n                $frame->get_style()->width . ' ' .\n                $frame->get_style()->height . ';' .\n                $frame->get_parent()->get_style()->width . \" \" .\n                $frame->get_parent()->get_style()->height . \";\" .\n                $frame->get_parent()->get_parent()->get_style()->width . ' ' .\n                $frame->get_parent()->get_parent()->get_style()->height . ';' .\n                $img_width . ' ' .\n                $img_height . '|';\n        }\n\n        $style = $frame->get_style();\n\n        $width_forced = true;\n        $height_forced = true;\n\n        //own style auto or invalid value: use natural size in px\n        //own style value: ignore suffix text including unit, use given number as px\n        //own style %: walk up parent chain until found available space in pt; fill available space\n        //\n        //special ignored unit: e.g. 10ex: e treated as exponent; x ignored; 10e completely invalid ->like auto\n\n        $width = $this->get_size($frame, 'width');\n        $height = $this->get_size($frame, 'height');\n\n        if ($width === 'auto' || $height === 'auto') {\n            // Determine the image's size. Time consuming. Only when really needed!\n            list($img_width, $img_height) = Helpers::dompdf_getimagesize($frame->get_image_url(), $this->get_dompdf()->getHttpContext());\n\n            // don't treat 0 as error. Can be downscaled or can be catched elsewhere if image not readable.\n            // Resample according to px per inch\n            // See also ListBulletImage::__construct\n            if ($width === 'auto' && $height === 'auto') {\n                $dpi = $frame->get_dompdf()->getOptions()->getDpi();\n                $width = (float)($img_width * 72) / $dpi;\n                $height = (float)($img_height * 72) / $dpi;\n                $width_forced = false;\n                $height_forced = false;\n            } elseif ($height === 'auto') {\n                $height_forced = false;\n                $height = ($width / $img_width) * $img_height; //keep aspect ratio\n            } else {\n                $width_forced = false;\n                $width = ($height / $img_height) * $img_width; //keep aspect ratio\n            }\n        }\n\n        // Handle min/max width/height\n        if ($style->min_width !== \"none\" ||\n            $style->max_width !== \"none\" ||\n            $style->min_height !== \"none\" ||\n            $style->max_height !== \"none\"\n        ) {\n\n            list( /*$x*/, /*$y*/, $w, $h) = $frame->get_containing_block();\n\n            $min_width = $style->length_in_pt($style->min_width, $w);\n            $max_width = $style->length_in_pt($style->max_width, $w);\n            $min_height = $style->length_in_pt($style->min_height, $h);\n            $max_height = $style->length_in_pt($style->max_height, $h);\n\n            if ($max_width !== \"none\" && $max_width !== \"auto\" && $width > (float)$max_width) {\n                if (!$height_forced) {\n                    $height *= (float)$max_width / $width;\n                }\n\n                $width = (float)$max_width;\n            }\n\n            if ($min_width !== \"none\" && $min_width !== \"auto\" && $width < (float)$min_width) {\n                if (!$height_forced) {\n                    $height *= (float)$min_width / $width;\n                }\n\n                $width = (float)$min_width;\n            }\n\n            if ($max_height !== \"none\" && $max_height !== \"auto\" && $height > (float)$max_height) {\n                if (!$width_forced) {\n                    $width *= (float)$max_height / $height;\n                }\n\n                $height = (float)$max_height;\n            }\n\n            if ($min_height !== \"none\" && $min_height !== \"auto\" && $height < (float)$min_height) {\n                if (!$width_forced) {\n                    $width *= (float)$min_height / $height;\n                }\n\n                $height = (float)$min_height;\n            }\n        }\n\n        if ($this->get_dompdf()->getOptions()->getDebugPng()) {\n            print $width . ' ' . $height . ';';\n        }\n\n        $style->width = $width;\n        $style->height = $height;\n\n        $style->min_width = \"none\";\n        $style->max_width = \"none\";\n        $style->min_height = \"none\";\n        $style->max_height = \"none\";\n\n        return [$width, $width, \"min\" => $width, \"max\" => $width];\n    }\n\n    protected function resolve_margins(): void\n    {\n        // Only handle the inline case for now\n        // https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-width\n        // https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height\n        $style = $this->_frame->get_style();\n\n        if ($style->margin_left === \"auto\") {\n            $style->margin_left = 0;\n        }\n        if ($style->margin_right === \"auto\") {\n            $style->margin_right = 0;\n        }\n        if ($style->margin_top === \"auto\") {\n            $style->margin_top = 0;\n        }\n        if ($style->margin_bottom === \"auto\") {\n            $style->margin_bottom = 0;\n        }\n    }\n\n    private function get_size(Frame $f, string $type)\n    {\n        $ref_stack = [];\n        $result_size = 0.0;\n        do {\n            $f_style = $f->get_style();\n            $current_size = $f_style->$type;\n            if (Helpers::is_percent($current_size)) {\n                $ref_stack[] = str_replace('%px', '%', $current_size);\n            } else {\n                // auto is a valid first result. In case of previous percentage values we need a real size\n                if ($current_size !== 'auto' || count($ref_stack) === 0) {\n                    $result_size = $f_style->length_in_pt($current_size);\n                    break;\n                }\n            }\n        } while (($f = $f->get_parent()));\n\n        // if we built a percentage stack walk up to find the real size\n        if (count($ref_stack) > 0) {\n            while (($ref = array_pop($ref_stack))) {\n                $result_size = $f_style->length_in_pt($ref, $result_size);\n            }\n        }\n\n        return $result_size;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/Inline.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Text as TextFrameDecorator;\nuse Dompdf\\FrameReflower\\Text as TextFrameReflower;\n\n/**\n * Reflows inline frames\n *\n * @package dompdf\n */\nclass Inline extends AbstractFrameReflower\n{\n\n    /**\n     * Inline constructor.\n     * @param Frame $frame\n     */\n    function __construct(Frame $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $frame = $this->_frame;\n\n        // Check if a page break is forced\n        $page = $frame->get_root();\n        $page->check_forced_page_break($frame);\n\n        if ($page->is_full()) {\n            return;\n        }\n\n        $style = $frame->get_style();\n\n        // Generated content\n        $this->_set_content();\n\n        // Resolve auto margins\n        // https://www.w3.org/TR/CSS21/visudet.html#inline-width\n        // https://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced\n        if ($style->margin_left === \"auto\") {\n            $style->margin_left = 0;\n        }\n        if ($style->margin_right === \"auto\") {\n            $style->margin_right = 0;\n        }\n        if ($style->margin_top === \"auto\") {\n            $style->margin_top = 0;\n        }\n        if ($style->margin_bottom === \"auto\") {\n            $style->margin_bottom = 0;\n        }\n\n        // Add our margin, padding & border to the first and last children\n        if (($f = $frame->get_first_child()) && $f instanceof TextFrameDecorator) {\n            $f_style = $f->get_style();\n            $f_style->margin_left = $style->margin_left;\n            $f_style->padding_left = $style->padding_left;\n            $f_style->border_left = $style->border_left;\n        }\n\n        if (($l = $frame->get_last_child()) && $l instanceof TextFrameDecorator) {\n            $l_style = $l->get_style();\n            $l_style->margin_right = $style->margin_right;\n            $l_style->padding_right = $style->padding_right;\n            $l_style->border_right = $style->border_right;\n        }\n\n        $frame->position();\n\n        $cb = $frame->get_containing_block();\n\n        if ($block) {\n            $block->add_frame_to_line($this->_frame);\n        }\n\n        // Set the containing blocks and reflow each child.  The containing\n        // block is not changed by line boxes.\n        foreach ($frame->get_children() as $child) {\n            $child->set_containing_block($cb);\n            $child->reflow($block);\n        }\n\n        // Handle relative positioning\n        foreach ($this->_frame->get_children() as $child) {\n            $this->position_relative($child);\n        }\n    }\n\n    /**\n     * Get the minimum width needed for the first line of the frame, including\n     * the margin box.\n     *\n     * @return array A pair of values: The minimum width, and whether it\n     * includes the right margin box because the entire frame is covered.\n     */\n    public function get_min_first_line_width(): array\n    {\n        // FIXME This should not be completely correct: White-space styling\n        // might affect the layout, such that several children have to be\n        // considered. The right way to do this would probably be a (partial)\n        // reflow of the frame\n        $frame = $this->_frame;\n        $firstChild = $frame->get_first_child();\n\n        if ($firstChild === null) {\n            return [0.0, true];\n        }\n\n        $hasSibling = $firstChild->get_next_sibling() !== null;\n        $reflower = $firstChild->get_reflower();\n\n        if ($reflower instanceof TextFrameReflower) {\n            [$min, $includesAll, $childDelta] = $reflower->get_min_first_line_width();\n            $applyRightWidths = $includesAll && !$hasSibling;\n        } elseif ($reflower instanceof self) {\n            [$min, $includesAll] = $reflower->get_min_first_line_width();\n            $applyRightWidths = $includesAll && !$hasSibling;\n        } else {\n            [$min] = $reflower->get_min_max_width();\n            $applyRightWidths = !$hasSibling;\n        }\n\n        // Because currently margin, border, and padding are not handled on the\n        // inline frame itself, but applied to first resp. last text child, we\n        // only want to add these here if they have not been applied to the\n        // children yet (which can happen in case of nested inline children)\n        $style = $frame->get_style();\n        $line_width = $frame->get_containing_block(\"w\");\n        $widths = $applyRightWidths ? [\n            $style->margin_left,\n            $style->border_left_width,\n            $style->padding_left,\n            $style->padding_right,\n            $style->border_right_width,\n            $style->margin_right\n        ] : [\n            $style->margin_left,\n            $style->border_left_width,\n            $style->padding_left\n        ];\n        $delta = isset($childDelta) && $childDelta === 0.0\n            ? (float) $style->length_in_pt($widths, $line_width)\n            : 0.0;\n\n        return [$min + $delta, $applyRightWidths];\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/ListBullet.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\n\n/**\n * Reflows list bullets\n *\n * @package dompdf\n */\nclass ListBullet extends AbstractFrameReflower\n{\n\n    /**\n     * ListBullet constructor.\n     * @param AbstractFrameDecorator $frame\n     */\n    function __construct(AbstractFrameDecorator $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $style = $this->_frame->get_style();\n\n        $style->width = $this->_frame->get_width();\n        $this->_frame->position();\n\n        if ($style->list_style_position === \"inside\") {\n            $p = $this->_frame->find_block_parent();\n            $p->add_frame_to_line($this->_frame);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/NullFrameReflower.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\n\n/**\n * Dummy reflower\n *\n * @package dompdf\n */\nclass NullFrameReflower extends AbstractFrameReflower\n{\n\n    /**\n     * NullFrameReflower constructor.\n     * @param Frame $frame\n     */\n    function __construct(Frame $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        return;\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/Page.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Page as PageFrameDecorator;\n\n/**\n * Reflows pages\n *\n * @package dompdf\n */\nclass Page extends AbstractFrameReflower\n{\n\n    /**\n     * Cache of the callbacks array\n     *\n     * @var array\n     */\n    private $_callbacks;\n\n    /**\n     * Cache of the canvas\n     *\n     * @var \\Dompdf\\Canvas\n     */\n    private $_canvas;\n\n    /**\n     * Page constructor.\n     * @param PageFrameDecorator $frame\n     */\n    function __construct(PageFrameDecorator $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param Frame $frame\n     * @param $page_number\n     */\n    function apply_page_style(Frame $frame, $page_number)\n    {\n        $style = $frame->get_style();\n        $page_styles = $style->get_stylesheet()->get_page_styles();\n\n        // http://www.w3.org/TR/CSS21/page.html#page-selectors\n        if (count($page_styles) > 1) {\n            $odd = $page_number % 2 == 1;\n            $first = $page_number == 1;\n\n            $style = clone $page_styles[\"base\"];\n\n            // FIXME RTL\n            if ($odd && isset($page_styles[\":right\"])) {\n                $style->merge($page_styles[\":right\"]);\n            }\n\n            if ($odd && isset($page_styles[\":odd\"])) {\n                $style->merge($page_styles[\":odd\"]);\n            }\n\n            // FIXME RTL\n            if (!$odd && isset($page_styles[\":left\"])) {\n                $style->merge($page_styles[\":left\"]);\n            }\n\n            if (!$odd && isset($page_styles[\":even\"])) {\n                $style->merge($page_styles[\":even\"]);\n            }\n\n            if ($first && isset($page_styles[\":first\"])) {\n                $style->merge($page_styles[\":first\"]);\n            }\n\n            $frame->set_style($style);\n        }\n    }\n\n    /**\n     * Paged layout:\n     * http://www.w3.org/TR/CSS21/page.html\n     *\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $fixed_children = [];\n        $prev_child = null;\n        $child = $this->_frame->get_first_child();\n        $current_page = 0;\n\n        while ($child) {\n            $this->apply_page_style($this->_frame, $current_page + 1);\n\n            $style = $this->_frame->get_style();\n\n            // Pages are only concerned with margins\n            $cb = $this->_frame->get_containing_block();\n            $left = (float)$style->length_in_pt($style->margin_left, $cb[\"w\"]);\n            $right = (float)$style->length_in_pt($style->margin_right, $cb[\"w\"]);\n            $top = (float)$style->length_in_pt($style->margin_top, $cb[\"h\"]);\n            $bottom = (float)$style->length_in_pt($style->margin_bottom, $cb[\"h\"]);\n\n            $content_x = $cb[\"x\"] + $left;\n            $content_y = $cb[\"y\"] + $top;\n            $content_width = $cb[\"w\"] - $left - $right;\n            $content_height = $cb[\"h\"] - $top - $bottom;\n\n            // Only if it's the first page, we save the nodes with a fixed position\n            if ($current_page == 0) {\n                $children = $child->get_children();\n                foreach ($children as $onechild) {\n                    if ($onechild->get_style()->position === \"fixed\") {\n                        $fixed_children[] = $onechild->deep_copy();\n                    }\n                }\n                $fixed_children = array_reverse($fixed_children);\n            }\n\n            $child->set_containing_block($content_x, $content_y, $content_width, $content_height);\n\n            // Check for begin reflow callback\n            $this->_check_callbacks(\"begin_page_reflow\", $child);\n\n            //Insert a copy of each node which have a fixed position\n            if ($current_page >= 1) {\n                foreach ($fixed_children as $fixed_child) {\n                    $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child());\n                }\n            }\n\n            $child->reflow();\n            $next_child = $child->get_next_sibling();\n\n            // Check for begin render callback\n            $this->_check_callbacks(\"begin_page_render\", $child);\n\n            // Render the page\n            $this->_frame->get_renderer()->render($child);\n\n            // Check for end render callback\n            $this->_check_callbacks(\"end_page_render\", $child);\n\n            if ($next_child) {\n                $this->_frame->next_page();\n            }\n\n            // Wait to dispose of all frames on the previous page\n            // so callback will have access to them\n            if ($prev_child) {\n                $prev_child->dispose(true);\n            }\n            $prev_child = $child;\n            $child = $next_child;\n            $current_page++;\n        }\n\n        // Dispose of previous page if it still exists\n        if ($prev_child) {\n            $prev_child->dispose(true);\n        }\n    }\n\n    /**\n     * Check for callbacks that need to be performed when a given event\n     * gets triggered on a page\n     *\n     * @param string $event the type of event\n     * @param Frame $frame  the frame that event is triggered on\n     */\n    protected function _check_callbacks($event, $frame)\n    {\n        if (!isset($this->_callbacks)) {\n            $dompdf = $this->_frame->get_dompdf();\n            $this->_callbacks = $dompdf->getCallbacks();\n            $this->_canvas = $dompdf->getCanvas();\n        }\n\n        if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) {\n            $info = [\n                0 => $this->_canvas, \"canvas\" => $this->_canvas,\n                1 => $frame,         \"frame\"  => $frame,\n            ];\n            $fs = $this->_callbacks[$event];\n            foreach ($fs as $f) {\n                if (is_callable($f)) {\n                    if (is_array($f)) {\n                        $f[0]->{$f[1]}($info);\n                    } else {\n                        $f($info);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/Table.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Table as TableFrameDecorator;\n\n/**\n * Reflows tables\n *\n * @access  private\n * @package dompdf\n */\nclass Table extends AbstractFrameReflower\n{\n    /**\n     * Frame for this reflower\n     *\n     * @var TableFrameDecorator\n     */\n    protected $_frame;\n\n    /**\n     * Cache of results between call to get_min_max_width and assign_widths\n     *\n     * @var array\n     */\n    protected $_state;\n\n    /**\n     * Table constructor.\n     * @param TableFrameDecorator $frame\n     */\n    function __construct(TableFrameDecorator $frame)\n    {\n        $this->_state = null;\n        parent::__construct($frame);\n    }\n\n    /**\n     * State is held here so it needs to be reset along with the decorator\n     */\n    public function reset(): void\n    {\n        parent::reset();\n        $this->_state = null;\n        $this->_min_max_cache = null;\n    }\n\n    protected function _assign_widths()\n    {\n        $style = $this->_frame->get_style();\n\n        // Find the min/max width of the table and sort the columns into\n        // absolute/percent/auto arrays\n        $delta = $this->_state[\"width_delta\"];\n        $min_width = $this->_state[\"min_width\"];\n        $max_width = $this->_state[\"max_width\"];\n        $percent_used = $this->_state[\"percent_used\"];\n        $absolute_used = $this->_state[\"absolute_used\"];\n        $auto_min = $this->_state[\"auto_min\"];\n\n        $absolute =& $this->_state[\"absolute\"];\n        $percent =& $this->_state[\"percent\"];\n        $auto =& $this->_state[\"auto\"];\n\n        // Determine the actual width of the table (excluding borders and\n        // padding)\n        $cb = $this->_frame->get_containing_block();\n        $columns =& $this->_frame->get_cellmap()->get_columns();\n\n        $width = $style->width;\n        $min_table_width = (float) $style->length_in_pt($style->min_width, $cb[\"w\"]) - $delta;\n\n        if ($width !== \"auto\") {\n            $preferred_width = (float) $style->length_in_pt($width, $cb[\"w\"]) - $delta;\n\n            if ($preferred_width < $min_table_width) {\n                $preferred_width = $min_table_width;\n            }\n\n            if ($preferred_width > $min_width) {\n                $width = $preferred_width;\n            } else {\n                $width = $min_width;\n            }\n\n        } else {\n            if ($max_width + $delta < $cb[\"w\"]) {\n                $width = $max_width;\n            } else if ($cb[\"w\"] - $delta > $min_width) {\n                $width = $cb[\"w\"] - $delta;\n            } else {\n                $width = $min_width;\n            }\n\n            if ($width < $min_table_width) {\n                $width = $min_table_width;\n            }\n\n        }\n\n        // Store our resolved width\n        $style->width = $width;\n\n        $cellmap = $this->_frame->get_cellmap();\n\n        if ($cellmap->is_columns_locked()) {\n            return;\n        }\n\n        // If the whole table fits on the page, then assign each column it's max width\n        if ($width == $max_width) {\n            foreach (array_keys($columns) as $i) {\n                $cellmap->set_column_width($i, $columns[$i][\"max-width\"]);\n            }\n\n            return;\n        }\n\n        // Determine leftover and assign it evenly to all columns\n        if ($width > $min_width) {\n            // We have four cases to deal with:\n            //\n            // 1. All columns are auto--no widths have been specified.  In this\n            // case we distribute extra space across all columns weighted by max-width.\n            //\n            // 2. Only absolute widths have been specified.  In this case we\n            // distribute any extra space equally among 'width: auto' columns, or all\n            // columns if no auto columns have been specified.\n            //\n            // 3. Only percentage widths have been specified.  In this case we\n            // normalize the percentage values and distribute any remaining % to\n            // width: auto columns.  We then proceed to assign widths as fractions\n            // of the table width.\n            //\n            // 4. Both absolute and percentage widths have been specified.\n\n            // Case 1:\n            if ($absolute_used == 0 && $percent_used == 0) {\n                $increment = $width - $min_width;\n\n                foreach (array_keys($columns) as $i) {\n                    $cellmap->set_column_width($i, $columns[$i][\"min-width\"] + $increment * ($columns[$i][\"max-width\"] / $max_width));\n                }\n                return;\n            }\n\n            // Case 2\n            if ($absolute_used > 0 && $percent_used == 0) {\n                if (count($auto) > 0) {\n                    $increment = ($width - $auto_min - $absolute_used) / count($auto);\n                } else {\n                    $increment = 0;\n                }\n\n                // Use the absolutely specified width or the increment\n                foreach (array_keys($columns) as $i) {\n                    if ($columns[$i][\"absolute\"] > 0 && count($auto)) {\n                        $cellmap->set_column_width($i, $columns[$i][\"min-width\"]);\n                    } else if (count($auto)) {\n                        $cellmap->set_column_width($i, $columns[$i][\"min-width\"] + $increment);\n                    } else {\n                        // All absolute columns\n                        $increment = ($width - $absolute_used) * $columns[$i][\"absolute\"] / $absolute_used;\n\n                        $cellmap->set_column_width($i, $columns[$i][\"min-width\"] + $increment);\n                    }\n\n                }\n                return;\n            }\n\n            // Case 3:\n            if ($absolute_used == 0 && $percent_used > 0) {\n                // Scale percent values if the total percentage is > 100, or if\n                // all values are specified as percentages\n                if ($percent_used > 100 || count($auto) == 0) {\n                    $scale = 100 / $percent_used;\n                } else {\n                    $scale = 1;\n                }\n\n                // Account for the minimum space used by the unassigned auto\n                // columns and the percentage columns following the current one\n                $used_width = $auto_min;\n                $percent_min = 0;\n\n                foreach ($percent as $i) {\n                    $percent_min += $columns[$i][\"min-width\"];\n                }\n\n                foreach ($percent as $i) {\n                    $min = $columns[$i][\"min-width\"];\n                    $percent_min -= $min;\n                    $slack = $width - $used_width - $percent_min;\n\n                    $columns[$i][\"percent\"] *= $scale;\n                    $w = min($columns[$i][\"percent\"] * $width / 100, $slack);\n\n                    if ($w < $min) {\n                        $w = $min;\n                    }\n\n                    $cellmap->set_column_width($i, $w);\n                    $used_width += $w;\n\n                }\n\n                // This works because $used_width includes the min-width of each\n                // unassigned column\n                if (count($auto) > 0) {\n                    $increment = ($width - $used_width) / count($auto);\n\n                    foreach ($auto as $i) {\n                        $cellmap->set_column_width($i, $columns[$i][\"min-width\"] + $increment);\n                    }\n\n                }\n                return;\n            }\n\n            // Case 4:\n            // First-come, first served\n            if ($absolute_used > 0 && $percent_used > 0) {\n                // Scale percent values if the total percentage is > 100 or\n                // there are no auto values to take up slack\n                if ($percent_used > 100 || count($auto) == 0) {\n                    $scale = 100 / $percent_used;\n                } else {\n                    $scale = 1;\n                }\n\n                // Account for the minimum space used by the unassigned auto\n                // columns, by the columns with absolute widths, and the\n                // percentage columns following the current one\n                $used_width = $auto_min;\n\n                foreach ($absolute as $i) {\n                    $cellmap->set_column_width($i, $columns[$i][\"min-width\"]);\n                    $used_width += $columns[$i][\"min-width\"];\n                }\n\n                $percent_min = 0;\n\n                foreach ($percent as $i) {\n                    $percent_min += $columns[$i][\"min-width\"];\n                }\n\n                foreach ($percent as $i) {\n                    $min = $columns[$i][\"min-width\"];\n                    $percent_min -= $min;\n                    $slack = $width - $used_width - $percent_min;\n\n                    $columns[$i][\"percent\"] *= $scale;\n                    $w = min($columns[$i][\"percent\"] * $width / 100, $slack);\n\n                    if ($w < $min) {\n                        $w = $min;\n                    }\n\n                    $cellmap->set_column_width($i, $w);\n                    $used_width += $w;\n                }\n\n                if (count($auto) > 0) {\n                    $increment = ($width - $used_width) / count($auto);\n\n                    foreach ($auto as $i) {\n                        $cellmap->set_column_width($i, $columns[$i][\"min-width\"] + $increment);\n                    }\n                }\n                return;\n            }\n        } else { // we are over constrained\n            // Each column gets its minimum width\n            foreach (array_keys($columns) as $i) {\n                $cellmap->set_column_width($i, $columns[$i][\"min-width\"]);\n            }\n        }\n    }\n\n    /**\n     * Determine the frame's height based on min/max height\n     *\n     * @return float|int|mixed|string\n     */\n    protected function _calculate_height()\n    {\n        $style = $this->_frame->get_style();\n        $height = $style->height;\n\n        $cellmap = $this->_frame->get_cellmap();\n        $cellmap->assign_frame_heights();\n        $rows = $cellmap->get_rows();\n\n        // Determine our content height\n        $content_height = 0;\n        foreach ($rows as $r) {\n            $content_height += $r[\"height\"];\n        }\n\n        $cb = $this->_frame->get_containing_block();\n\n        if (!($style->overflow === \"visible\" ||\n            ($style->overflow === \"hidden\" && $height === \"auto\"))\n        ) {\n            // Only handle min/max height if the height is independent of the frame's content\n\n            $min_height = $style->min_height;\n            $max_height = $style->max_height;\n\n            if (isset($cb[\"h\"])) {\n                $min_height = $style->length_in_pt($min_height, $cb[\"h\"]);\n                $max_height = $style->length_in_pt($max_height, $cb[\"h\"]);\n\n            } else if (isset($cb[\"w\"])) {\n                if (mb_strpos($min_height, \"%\") !== false) {\n                    $min_height = 0;\n                } else {\n                    $min_height = $style->length_in_pt($min_height, $cb[\"w\"]);\n                }\n                if (mb_strpos($max_height, \"%\") !== false) {\n                    $max_height = \"none\";\n                } else {\n                    $max_height = $style->length_in_pt($max_height, $cb[\"w\"]);\n                }\n            }\n\n            if ($max_height !== \"none\" && $max_height !== \"auto\" && $height > (float)$max_height) {\n                $height = $max_height;\n            }\n\n            if ($height < (float)$min_height) {\n                $height = $min_height;\n            }\n        } else {\n            // Use the content height or the height value, whichever is greater\n            if ($height !== \"auto\") {\n                $height = $style->length_in_pt($height, $cb[\"h\"]);\n\n                if ($height <= $content_height) {\n                    $height = $content_height;\n                } else {\n                    $cellmap->set_frame_heights($height, $content_height);\n                }\n            } else {\n                $height = $content_height;\n            }\n        }\n\n        return $height;\n    }\n\n    /**\n     * @param BlockFrameDecorator $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        /** @var TableFrameDecorator */\n        $frame = $this->_frame;\n\n        // Check if a page break is forced\n        $page = $frame->get_root();\n        $page->check_forced_page_break($frame);\n\n        // Bail if the page is full\n        if ($page->is_full()) {\n            return;\n        }\n\n        // Let the page know that we're reflowing a table so that splits\n        // are suppressed (simply setting page-break-inside: avoid won't\n        // work because we may have an arbitrary number of block elements\n        // inside tds.)\n        $page->table_reflow_start();\n\n        $this->determine_absolute_containing_block();\n\n        // Generated content\n        $this->_set_content();\n\n        // Collapse vertical margins, if required\n        $this->_collapse_margins();\n\n        // Table layout algorithm:\n        // http://www.w3.org/TR/CSS21/tables.html#auto-table-layout\n\n        if (is_null($this->_state)) {\n            $this->get_min_max_width();\n        }\n\n        $cb = $frame->get_containing_block();\n        $style = $frame->get_style();\n\n        // This is slightly inexact, but should be okay.  Add half the\n        // border-spacing to the table as padding.  The other half is added to\n        // the cells themselves.\n        if ($style->border_collapse === \"separate\") {\n            list($h, $v) = $style->border_spacing;\n\n            $v = (float)$style->length_in_pt($v) / 2;\n            $h = (float)$style->length_in_pt($h) / 2;\n\n            $style->padding_left = (float)$style->length_in_pt($style->padding_left, $cb[\"w\"]) + $h;\n            $style->padding_right = (float)$style->length_in_pt($style->padding_right, $cb[\"w\"]) + $h;\n            $style->padding_top = (float)$style->length_in_pt($style->padding_top, $cb[\"w\"]) + $v;\n            $style->padding_bottom = (float)$style->length_in_pt($style->padding_bottom, $cb[\"w\"]) + $v;\n        }\n\n        $this->_assign_widths();\n\n        // Adjust left & right margins, if they are auto\n        $delta = $this->_state[\"width_delta\"];\n        $width = $style->width;\n        $left = $style->length_in_pt($style->margin_left, $cb[\"w\"]);\n        $right = $style->length_in_pt($style->margin_right, $cb[\"w\"]);\n\n        $diff = (float) $cb[\"w\"] - (float) $width - $delta;\n\n        if ($left === \"auto\" && $right === \"auto\") {\n            if ($diff < 0) {\n                $left = 0;\n                $right = $diff;\n            } else {\n                $left = $right = $diff / 2;\n            }\n        } else {\n            if ($left === \"auto\") {\n                $left = max($diff - $right, 0);\n            }\n            if ($right === \"auto\") {\n                $right = max($diff - $left, 0);\n            }\n        }\n\n        $style->margin_left = $left;\n        $style->margin_right = $right;\n\n        $frame->position();\n        list($x, $y) = $frame->get_position();\n\n        // Determine the content edge\n        $offset_x = (float)$left + (float)$style->length_in_pt([\n            $style->padding_left,\n            $style->border_left_width\n        ], $cb[\"w\"]);\n        $offset_y = (float)$style->length_in_pt([\n            $style->margin_top,\n            $style->border_top_width,\n            $style->padding_top\n        ], $cb[\"w\"]);\n        $content_x = $x + $offset_x;\n        $content_y = $y + $offset_y;\n\n        if (isset($cb[\"h\"])) {\n            $h = $cb[\"h\"];\n        } else {\n            $h = null;\n        }\n\n        $cellmap = $frame->get_cellmap();\n        $col =& $cellmap->get_column(0);\n        $col[\"x\"] = $offset_x;\n\n        $row =& $cellmap->get_row(0);\n        $row[\"y\"] = $offset_y;\n\n        $cellmap->assign_x_positions();\n\n        // Set the containing block of each child & reflow\n        foreach ($frame->get_children() as $child) {\n            // Bail if the page is full\n            if (!$page->in_nested_table() && $page->is_full()) {\n                break;\n            }\n\n            $child->set_containing_block($content_x, $content_y, $width, $h);\n            $child->reflow();\n\n            if (!$page->in_nested_table()) {\n                // Check if a split has occurred\n                $page->check_page_break($child);\n            }\n\n        }\n\n        // Assign heights to our cells:\n        $style->height = $this->_calculate_height();\n\n        if ($style->border_collapse === \"collapse\") {\n            // Unset our borders because our cells are now using them\n            $style->border_style = \"none\";\n        }\n\n        $page->table_reflow_end();\n\n        // Debugging:\n        //echo ($this->_frame->get_cellmap());\n\n        if ($block && $frame->is_in_flow()) {\n            $block->add_frame_to_line($frame);\n\n            if ($frame->is_block_level()) {\n                $block->add_line();\n            }\n        }\n    }\n\n    function get_min_max_width(): array\n    {\n        if (!is_null($this->_min_max_cache)) {\n            return $this->_min_max_cache;\n        }\n\n        $style = $this->_frame->get_style();\n\n        $this->_frame->normalise();\n\n        // Add the cells to the cellmap (this will calculate column widths as\n        // frames are added)\n        $this->_frame->get_cellmap()->add_frame($this->_frame);\n\n        // Find the min/max width of the table and sort the columns into\n        // absolute/percent/auto arrays\n        $this->_state = [];\n        $this->_state[\"min_width\"] = 0;\n        $this->_state[\"max_width\"] = 0;\n\n        $this->_state[\"percent_used\"] = 0;\n        $this->_state[\"absolute_used\"] = 0;\n        $this->_state[\"auto_min\"] = 0;\n\n        $this->_state[\"absolute\"] = [];\n        $this->_state[\"percent\"] = [];\n        $this->_state[\"auto\"] = [];\n\n        $columns =& $this->_frame->get_cellmap()->get_columns();\n        foreach (array_keys($columns) as $i) {\n            $this->_state[\"min_width\"] += $columns[$i][\"min-width\"];\n            $this->_state[\"max_width\"] += $columns[$i][\"max-width\"];\n\n            if ($columns[$i][\"absolute\"] > 0) {\n                $this->_state[\"absolute\"][] = $i;\n                $this->_state[\"absolute_used\"] += $columns[$i][\"absolute\"];\n            } else if ($columns[$i][\"percent\"] > 0) {\n                $this->_state[\"percent\"][] = $i;\n                $this->_state[\"percent_used\"] += $columns[$i][\"percent\"];\n            } else {\n                $this->_state[\"auto\"][] = $i;\n                $this->_state[\"auto_min\"] += $columns[$i][\"min-width\"];\n            }\n        }\n\n        // Account for margins, borders, padding, and border spacing\n        $cb_w = $this->_frame->get_containing_block(\"w\");\n        $lm = (float) $style->length_in_pt($style->margin_left, $cb_w);\n        $rm = (float) $style->length_in_pt($style->margin_right, $cb_w);\n\n        $dims = [\n            $style->border_left_width,\n            $style->border_right_width,\n            $style->padding_left,\n            $style->padding_right\n        ];\n\n        if ($style->border_collapse !== \"collapse\") {\n            list($dims[]) = $style->border_spacing;\n        }\n\n        $delta = (float) $style->length_in_pt($dims, $cb_w);\n\n        $this->_state[\"width_delta\"] = $delta;\n\n        $min_width = $this->_state[\"min_width\"] + $delta + $lm + $rm;\n        $max_width = $this->_state[\"max_width\"] + $delta + $lm + $rm;\n\n        return $this->_min_max_cache = [\n            $min_width,\n            $max_width,\n            \"min\" => $min_width,\n            \"max\" => $max_width\n        ];\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/TableCell.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Table as TableFrameDecorator;\n\n/**\n * Reflows table cells\n *\n * @package dompdf\n */\nclass TableCell extends Block\n{\n    /**\n     * TableCell constructor.\n     * @param BlockFrameDecorator $frame\n     */\n    function __construct(BlockFrameDecorator $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $style = $this->_frame->get_style();\n\n        $table = TableFrameDecorator::find_parent_table($this->_frame);\n        $cellmap = $table->get_cellmap();\n\n        list($x, $y) = $cellmap->get_frame_position($this->_frame);\n        $this->_frame->set_position($x, $y);\n\n        $cells = $cellmap->get_spanned_cells($this->_frame);\n\n        $w = 0;\n        foreach ($cells[\"columns\"] as $i) {\n            $col = $cellmap->get_column($i);\n            $w += $col[\"used-width\"];\n        }\n\n        //FIXME?\n        $h = $this->_frame->get_containing_block(\"h\");\n\n        $left_space = (float)$style->length_in_pt([$style->margin_left,\n                $style->padding_left,\n                $style->border_left_width],\n            $w);\n\n        $right_space = (float)$style->length_in_pt([$style->padding_right,\n                $style->margin_right,\n                $style->border_right_width],\n            $w);\n\n        $top_space = (float)$style->length_in_pt([$style->margin_top,\n                $style->padding_top,\n                $style->border_top_width],\n            $h);\n        $bottom_space = (float)$style->length_in_pt([$style->margin_bottom,\n                $style->padding_bottom,\n                $style->border_bottom_width],\n            $h);\n\n        $style->width = $cb_w = $w - $left_space - $right_space;\n\n        $content_x = $x + $left_space;\n        $content_y = $line_y = $y + $top_space;\n\n        // Adjust the first line based on the text-indent property\n        $indent = (float)$style->length_in_pt($style->text_indent, $w);\n        $this->_frame->increase_line_width($indent);\n\n        $page = $this->_frame->get_root();\n\n        // Set the y position of the first line in the cell\n        $line_box = $this->_frame->get_current_line_box();\n        $line_box->y = $line_y;\n\n        // Set the containing blocks and reflow each child\n        foreach ($this->_frame->get_children() as $child) {\n            if ($page->is_full()) {\n                break;\n            }\n\n            $child->set_containing_block($content_x, $content_y, $cb_w, $h);\n            $this->process_clear($child);\n            $child->reflow($this->_frame);\n            $this->process_float($child, $x + $left_space, $w - $right_space - $left_space);\n        }\n\n        // Determine our height\n        $style_height = (float)$style->length_in_pt($style->height, $h);\n\n        $this->_frame->set_content_height($this->_calculate_content_height());\n\n        $height = max($style_height, (float)$this->_frame->get_content_height());\n\n        // Let the cellmap know our height\n        $cell_height = $height / count($cells[\"rows\"]);\n\n        if ($style_height <= $height) {\n            $cell_height += $top_space + $bottom_space;\n        }\n\n        foreach ($cells[\"rows\"] as $i) {\n            $cellmap->set_row_height($i, $cell_height);\n        }\n\n        $style->height = $height;\n        $this->_text_align();\n        $this->vertical_align();\n\n        // Handle relative positioning\n        foreach ($this->_frame->get_children() as $child) {\n            $this->position_relative($child);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/TableRow.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Table as TableFrameDecorator;\nuse Dompdf\\FrameDecorator\\TableRow as TableRowFrameDecorator;\nuse Dompdf\\Exception;\n\n/**\n * Reflows table rows\n *\n * @package dompdf\n */\nclass TableRow extends AbstractFrameReflower\n{\n    /**\n     * TableRow constructor.\n     * @param TableRowFrameDecorator $frame\n     */\n    function __construct(TableRowFrameDecorator $frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        /** @var TableRowFrameDecorator */\n        $frame = $this->_frame;\n\n        // Check if a page break is forced\n        $page = $frame->get_root();\n        $page->check_forced_page_break($frame);\n\n        // Bail if the page is full\n        if ($page->is_full()) {\n            return;\n        }\n\n        $this->_frame->position();\n        $style = $this->_frame->get_style();\n        $cb = $this->_frame->get_containing_block();\n\n        foreach ($this->_frame->get_children() as $child) {\n            if ($page->is_full()) {\n                return;\n            }\n\n            $child->set_containing_block($cb);\n            $child->reflow();\n        }\n\n        if ($page->is_full()) {\n            return;\n        }\n\n        $table = TableFrameDecorator::find_parent_table($this->_frame);\n        $cellmap = $table->get_cellmap();\n        $style->width = $cellmap->get_frame_width($this->_frame);\n        $style->height = $cellmap->get_frame_height($this->_frame);\n\n        $this->_frame->set_position($cellmap->get_frame_position($this->_frame));\n    }\n\n    /**\n     * @throws Exception\n     */\n    function get_min_max_width(): array\n    {\n        throw new Exception(\"Min/max width is undefined for table rows\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/TableRowGroup.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Table as TableFrameDecorator;\n\n/**\n * Reflows table row groups (e.g. tbody tags)\n *\n * @package dompdf\n */\nclass TableRowGroup extends AbstractFrameReflower\n{\n\n    /**\n     * TableRowGroup constructor.\n     * @param \\Dompdf\\Frame $frame\n     */\n    function __construct($frame)\n    {\n        parent::__construct($frame);\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $page = $this->_frame->get_root();\n\n        $style = $this->_frame->get_style();\n\n        // Our width is equal to the width of our parent table\n        $table = TableFrameDecorator::find_parent_table($this->_frame);\n\n        $cb = $this->_frame->get_containing_block();\n\n        foreach ($this->_frame->get_children() as $child) {\n            // Bail if the page is full\n            if ($page->is_full()) {\n                return;\n            }\n\n            $child->set_containing_block($cb[\"x\"], $cb[\"y\"], $cb[\"w\"], $cb[\"h\"]);\n            $child->reflow();\n\n            // Check if a split has occured\n            $page->check_page_break($child);\n        }\n\n        if ($page->is_full()) {\n            return;\n        }\n\n        $cellmap = $table->get_cellmap();\n        $style->width = $cellmap->get_frame_width($this->_frame);\n        $style->height = $cellmap->get_frame_height($this->_frame);\n\n        $this->_frame->set_position($cellmap->get_frame_position($this->_frame));\n\n        if ($table->get_style()->border_collapse === \"collapse\") {\n            // Unset our borders because our cells are now using them\n            $style->border_style = \"none\";\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/FrameReflower/Text.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\FrameReflower;\n\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\FrameDecorator\\Inline as InlineFrameDecorator;\nuse Dompdf\\FrameDecorator\\Text as TextFrameDecorator;\nuse Dompdf\\FontMetrics;\nuse Dompdf\\Helpers;\n\n/**\n * Reflows text frames.\n *\n * @package dompdf\n */\nclass Text extends AbstractFrameReflower\n{\n    /**\n     * PHP string representation of HTML entity <shy>\n     */\n    const SOFT_HYPHEN = \"\\xC2\\xAD\";\n\n    /**\n     * The regex splits on everything that's a separator (^\\S double negative),\n     * excluding nbsp (\\xa0).\n     * This currently excludes the \"narrow nbsp\" character.\n     */\n    public static $_whitespace_pattern = '/([^\\S\\xA0]+)/u';\n\n    /**\n     * The regex splits on everything that's a separator (^\\S double negative),\n     * excluding nbsp (\\xa0), plus dashes.\n     * This currently excludes the \"narrow nbsp\" character.\n     */\n    public static $_wordbreak_pattern = '/([^\\S\\xA0]+|\\-+|\\xAD+)/u';\n\n    /**\n     * @var BlockFrameDecorator\n     */\n    protected $_block_parent; // Nearest block-level ancestor\n\n    /**\n     * @var TextFrameDecorator\n     */\n    protected $_frame;\n\n    /**\n     * Saves trailing whitespace trimmed after a line break, so it can be\n     * restored when needed.\n     * @var string|null\n     */\n    protected $trailingWs = null;\n\n    /**\n     * @var FontMetrics\n     */\n    private $fontMetrics;\n\n    /**\n     * @param TextFrameDecorator $frame\n     * @param FontMetrics $fontMetrics\n     */\n    public function __construct(TextFrameDecorator $frame, FontMetrics $fontMetrics)\n    {\n        parent::__construct($frame);\n        $this->setFontMetrics($fontMetrics);\n    }\n\n    /**\n     * @param string $text\n     * @return string\n     */\n    protected function _collapse_white_space(string $text): string\n    {\n        return preg_replace(self::$_whitespace_pattern, \" \", $text) ?? \"\";\n    }\n\n    /**\n     * @param string $text\n     * @return bool|int\n     */\n    protected function _line_break($text)\n    {\n        $style = $this->_frame->get_style();\n        $size = $style->font_size;\n        $font = $style->font_family;\n        $current_line = $this->_block_parent->get_current_line_box();\n\n        // Determine the available width\n        $line_width = $this->_frame->get_containing_block(\"w\");\n        $current_line_width = $current_line->left + $current_line->w + $current_line->right;\n\n        $available_width = $line_width - $current_line_width;\n\n        // Account for word-spacing\n        $word_spacing = (float)$style->length_in_pt($style->word_spacing);\n        $char_spacing = (float)$style->length_in_pt($style->letter_spacing);\n\n        // Determine the frame width including margin, padding & border\n        $visible_text = preg_replace('/\\xAD/u', '', $text);\n        $text_width = $this->getFontMetrics()->getTextWidth($visible_text, $font, $size, $word_spacing, $char_spacing);\n        $mbp_width =\n            (float)$style->length_in_pt([$style->margin_left,\n                $style->border_left_width,\n                $style->padding_left,\n                $style->padding_right,\n                $style->border_right_width,\n                $style->margin_right], $line_width);\n\n        $frame_width = $text_width + $mbp_width;\n\n// Debugging:\n//    Helpers::pre_r(\"Text: '\" . htmlspecialchars($text). \"'\");\n//    Helpers::pre_r(\"width: \" .$frame_width);\n//    Helpers::pre_r(\"textwidth + delta: $text_width + $mbp_width\");\n//    Helpers::pre_r(\"font-size: $size\");\n//    Helpers::pre_r(\"cb[w]: \" .$line_width);\n//    Helpers::pre_r(\"available width: \" . $available_width);\n//    Helpers::pre_r(\"current line width: \" . $current_line_width);\n\n//     Helpers::pre_r($words);\n\n        if ($frame_width <= $available_width) {\n            return false;\n        }\n\n        // split the text into words\n        $words = preg_split(self::$_wordbreak_pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE);\n        $wc = count($words);\n\n        // Determine the split point\n        $width = 0;\n        $str = \"\";\n        reset($words);\n\n        $shy_width = $this->getFontMetrics()->getTextWidth(self::SOFT_HYPHEN, $font, $size);\n\n        // @todo support <wbr>\n        for ($i = 0; $i < $wc; $i += 2) {\n            $word = $words[$i] . (isset($words[$i + 1]) ? $words[$i + 1] : \"\");\n            $word_width = $this->getFontMetrics()->getTextWidth($word, $font, $size, $word_spacing, $char_spacing);\n            if ($width + $word_width + $mbp_width > $available_width) {\n                // If the previous split happened by soft hyphen, we have to append its width again\n                // because the last hyphen of a line won't be removed.\n                if (isset($words[$i - 1]) && self::SOFT_HYPHEN === $words[$i - 1]) {\n                    $width += $shy_width;\n                }\n                break;\n            }\n\n            // If the word is splitted by soft hyphen, but no line break is needed\n            // we have to reduce the width. But the str is not modified, otherwise\n            // the wrong offset is calculated at the end of this method.\n            if (isset($words[$i + 1]) && self::SOFT_HYPHEN === $words[$i + 1]) {\n                $width += $word_width - $shy_width;\n            } else {\n                $width += $word_width;\n            }\n            $str .= $word;\n        }\n\n        // https://www.w3.org/TR/css-text-3/#overflow-wrap-property\n        $wrap = $style->overflow_wrap;\n        $break_word = $wrap === \"anywhere\" || $wrap === \"break-word\";\n\n        // The first word has overflowed.   Force it onto the line\n        if ($current_line_width == 0 && $width == 0) {\n            $s = \"\";\n            $last_width = 0;\n\n            if ($break_word) {\n                for ($j = 0; $j < strlen($word); $j++) {\n                    $s .= $word[$j];\n                    $_width = $this->getFontMetrics()->getTextWidth($s, $font, $size, $word_spacing, $char_spacing);\n                    if ($_width > $available_width) {\n                        break;\n                    }\n\n                    $last_width = $_width;\n                }\n            }\n\n            if ($break_word && $last_width > 0) {\n                //$width += $last_width;\n                $str .= substr($s, 0, -1);\n            } else {\n                //$width += $word_width;\n                $str .= $word;\n            }\n        }\n\n        $offset = mb_strlen($str);\n\n        // More debugging:\n        //     var_dump($str);\n        //     print_r(\"Width: \". $width);\n        //     print_r(\"Offset: \" . $offset);\n\n        return $offset;\n    }\n\n    //........................................................................\n\n    /**\n     * @param string $text\n     * @return bool|int\n     */\n    protected function _newline_break($text)\n    {\n        if (($i = mb_strpos($text, \"\\n\")) === false) {\n            return false;\n        }\n\n        return $i + 1;\n    }\n\n    protected function _layout_line(): bool\n    {\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n        $text = $frame->get_text();\n        $size = $style->font_size;\n        $font = $style->font_family;\n\n        // Determine the text height\n        $style->height = $this->getFontMetrics()->getFontHeight($font, $size);\n\n        $split = false;\n        $add_line = false;\n\n        // Handle text transform:\n        // http://www.w3.org/TR/CSS21/text.html#propdef-text-transform\n        switch (strtolower($style->text_transform)) {\n            default:\n                break;\n            case \"capitalize\":\n                $text = Helpers::mb_ucwords($text);\n                break;\n            case \"uppercase\":\n                $text = mb_convert_case($text, MB_CASE_UPPER);\n                break;\n            case \"lowercase\":\n                $text = mb_convert_case($text, MB_CASE_LOWER);\n                break;\n        }\n\n        // Handle white-space property:\n        // http://www.w3.org/TR/CSS21/text.html#propdef-white-space\n        switch ($style->white_space) {\n            default:\n            case \"normal\":\n                $text = $this->_collapse_white_space($text);\n\n                if ($text === \"\") {\n                    break;\n                }\n\n                $split = $this->_line_break($text);\n                break;\n\n            case \"nowrap\":\n                $text = $this->_collapse_white_space($text);\n                break;\n\n            case \"pre\":\n                $split = $this->_newline_break($text);\n                $add_line = $split !== false;\n                break;\n\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case \"pre-line\":\n                // Collapse white-space except for \\n\n                $text = preg_replace(\"/[ \\t]+/u\", \" \", $text);\n\n                if ($text === \"\") {\n                    break;\n                }\n            case \"pre-wrap\":\n                $split = $this->_newline_break($text);\n\n                if (($tmp = $this->_line_break($text)) !== false) {\n                    if ($split === false || $tmp < $split) {\n                        $split = $tmp;\n                    } else {\n                        $add_line = true;\n                    }\n                } elseif ($split !== false) {\n                    $add_line = true;\n                }\n\n                break;\n        }\n\n        $frame->set_text($text);\n\n        if ($split !== false) {\n            // Handle edge cases\n            if ($split === 0 && !$frame->is_pre() && trim($text) === \"\") {\n                $frame->set_text(\"\");\n            } elseif ($split === 0) {\n                $prev = $frame->get_prev_sibling();\n                $p = $frame->get_parent();\n\n                if ($prev && $p instanceof InlineFrameDecorator) {\n                    $p->split($frame);\n                }\n\n                // Trim newlines from the beginning of the line\n                //$this->_frame->set_text(ltrim($text, \"\\n\\r\"));\n\n                $this->_block_parent->maximize_line_height($frame->get_margin_height(), $frame);\n                $this->_block_parent->add_line();\n                $frame->position();\n\n                // Layout the new line\n                $add_line = $this->_layout_line();\n            } elseif ($split < mb_strlen($text)) {\n                // Split the line if required\n                $frame->split_text($split);\n\n                // Remove inner soft hyphens\n                $t = $frame->get_text();\n                $shyPosition = mb_strpos($t, self::SOFT_HYPHEN);\n                if (false !== $shyPosition && $shyPosition < mb_strlen($t) - 1) {\n                    $t = str_replace(self::SOFT_HYPHEN, '', mb_substr($t, 0, -1)) . mb_substr($t, -1);\n                    $frame->set_text($t);\n                }\n            }\n        } elseif ($text !== \"\") {\n            // Remove empty space from start and end of line, but only where there isn't an inline sibling\n            // and the parent node isn't an inline element with siblings\n            // FIXME: Include non-breaking spaces?\n            $t = $text;\n            $parent = $frame->get_parent();\n            $is_inline_frame = $parent instanceof InlineFrameDecorator;\n\n            if ((!$is_inline_frame && !$frame->get_next_sibling()) /* ||\n            ( $is_inline_frame && !$parent->get_next_sibling())*/\n            ) { // fails <b>BOLD <u>UNDERLINED</u></b> becomes <b>BOLD<u>UNDERLINED</u></b>\n                $t = rtrim($t);\n            }\n\n            if ((!$is_inline_frame && !$frame->get_prev_sibling()) /* ||\n            ( $is_inline_frame && !$parent->get_prev_sibling())*/\n            ) { //  <span><span>A<span>B</span> C</span></span> fails (the whitespace is removed)\n                $t = ltrim($t);\n            }\n\n            // Remove soft hyphens\n            $t = str_replace(self::SOFT_HYPHEN, '', $t);\n            $frame->set_text($t);\n        }\n\n        // Set our new width\n        $frame->recalculate_width();\n\n        return $add_line;\n    }\n\n    /**\n     * @param BlockFrameDecorator|null $block\n     */\n    function reflow(BlockFrameDecorator $block = null)\n    {\n        $frame = $this->_frame;\n        $page = $frame->get_root();\n        $page->check_forced_page_break($this->_frame);\n\n        if ($page->is_full()) {\n            return;\n        }\n\n        $this->_block_parent = /*isset($block) ? $block : */\n        $frame->find_block_parent();\n\n        // Left trim the text if this is the first text on the line and we're\n        // collapsing white space\n//     if ( $this->_block_parent->get_current_line()->w == 0 &&\n//          ($frame->get_style()->white_space !== \"pre\" ||\n//           $frame->get_style()->white_space !== \"pre-wrap\") ) {\n//       $frame->set_text( ltrim( $frame->get_text() ) );\n//     }\n\n        $frame->position();\n\n        $add_line = $this->_layout_line();\n\n        if ($block) {\n            $block->add_frame_to_line($frame);\n\n            if ($add_line === true) {\n                $block->add_line();\n            }\n        }\n    }\n\n    /**\n     * Trim trailing whitespace from the frame text.\n     */\n    public function trim_trailing_ws(): void\n    {\n        $frame = $this->_frame;\n        $text = $frame->get_text();\n        $trailing = mb_substr($text, -1);\n\n        if (preg_match(self::$_whitespace_pattern, $trailing)) {\n            $this->trailingWs = $trailing;\n            $frame->set_text(mb_substr($text, 0, -1));\n            $frame->recalculate_width();\n        }\n    }\n\n    public function reset(): void\n    {\n        parent::reset();\n\n        // Restore trimmed trailing whitespace, as the frame will go through\n        // another reflow and line breaks might be different after a split\n        if ($this->trailingWs !== null) {\n            $text = $this->_frame->get_text();\n            $this->_frame->set_text($text . $this->trailingWs);\n            $this->trailingWs = null;\n        }\n    }\n\n    //........................................................................\n\n    function get_min_max_width(): array\n    {\n        /*if ( !is_null($this->_min_max_cache)  )\n          return $this->_min_max_cache;*/\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n        $this->_block_parent = $frame->find_block_parent();\n        $line_width = $frame->get_containing_block(\"w\");\n        $fontMetrics = $this->getFontMetrics();\n\n        $str = $text = $frame->get_text();\n        $size = $style->font_size;\n        $font = $style->font_family;\n\n        $word_spacing = (float)$style->length_in_pt($style->word_spacing);\n        $char_spacing = (float)$style->length_in_pt($style->letter_spacing);\n\n        // determine minimum text width based on the whitespace setting\n        switch ($style->white_space) {\n            default:\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case \"normal\":\n                $str = $this->_collapse_white_space($str);\n            case \"pre-wrap\":\n            case \"pre-line\":\n                // Find the longest word (i.e. minimum length)\n                // split the text into words\n                $words = array_flip(preg_split(self::$_wordbreak_pattern, $str, -1, PREG_SPLIT_DELIM_CAPTURE));\n                array_walk($words, function(&$chunked_text_width, $chunked_text) use ($fontMetrics, $font, $size, $word_spacing, $char_spacing) {\n                    $chunked_text_width = $fontMetrics->getTextWidth($chunked_text, $font, $size, $word_spacing, $char_spacing);\n                });\n\n                arsort($words);\n                $min = reset($words);\n                break;\n\n            case \"pre\":\n                $lines = array_flip(preg_split(\"/\\R/u\", $str));\n                array_walk($lines, function(&$chunked_text_width, $chunked_text) use ($fontMetrics, $font, $size, $word_spacing, $char_spacing) {\n                    $chunked_text_width = $fontMetrics->getTextWidth($chunked_text, $font, $size, $word_spacing, $char_spacing);\n                });\n\n                arsort($lines);\n                $min = reset($lines);\n                break;\n\n            case \"nowrap\":\n                $min = $fontMetrics->getTextWidth($this->_collapse_white_space($str), $font, $size, $word_spacing, $char_spacing);\n                break;\n        }\n\n        // clean up the frame text based on the whitespace setting and use to determine maximum text width\n        switch ($style->white_space) {\n            default:\n            case \"normal\":\n            case \"nowrap\":\n                $str = $this->_collapse_white_space($text);\n                break;\n\n            case \"pre-line\":\n                $str = preg_replace(\"/[ \\t]+/u\", \" \", $text);\n                break;\n\n            case \"pre-wrap\":\n                // Find the longest word (i.e. minimum length)\n                $lines = array_flip(preg_split(\"/\\R/u\", $text));\n                array_walk($lines, function(&$chunked_text_width, $chunked_text) use ($fontMetrics, $font, $size, $word_spacing, $char_spacing) {\n                    $chunked_text_width = $fontMetrics->getTextWidth($chunked_text, $font, $size, $word_spacing, $char_spacing);\n                });\n                arsort($lines);\n                reset($lines);\n                $str = key($lines);\n                break;\n        }\n        $max = $fontMetrics->getTextWidth($str, $font, $size, $word_spacing, $char_spacing);\n\n        $delta = (float)$style->length_in_pt([$style->margin_left,\n            $style->border_left_width,\n            $style->padding_left,\n            $style->padding_right,\n            $style->border_right_width,\n            $style->margin_right], $line_width);\n        $min += $delta;\n        $min_word = $min;\n        $max += $delta;\n\n        // https://www.w3.org/TR/css-text-3/#overflow-wrap-property\n        if ($style->overflow_wrap === \"anywhere\"\n            && !in_array($style->white_space, [\"pre\", \"nowrap\"], true)\n        ) {\n            // If it is allowed to break words, the min width is the widest character.\n            // But for performance reasons, we only check the first character.\n            $char = mb_substr($str, 0, 1);\n            $min_char = $fontMetrics->getTextWidth($char, $font, $size, $word_spacing, $char_spacing);\n            $min = $delta + $min_char;\n        }\n\n        return $this->_min_max_cache = [$min, $max, $min_word, \"min\" => $min, \"max\" => $max, 'min_word' => $min_word];\n    }\n\n    /**\n     * Get the minimum width needed for the the first line of the text.\n     *\n     * @return array A triple of values: The minimum width, whether that\n     * includes all text of the frame, and the margin-box delta of the width.\n     */\n    public function get_min_first_line_width(): array\n    {\n        $frame = $this->_frame;\n        $style = $frame->get_style();\n        $line_width = $frame->get_containing_block(\"w\");\n        $fontMetrics = $this->getFontMetrics();\n\n        $str = $frame->get_node()->textContent;\n        $size = $style->font_size;\n        $font = $style->font_family;\n\n        $word_spacing = (float)$style->length_in_pt($style->word_spacing);\n        $char_spacing = (float)$style->length_in_pt($style->letter_spacing);\n\n        // https://www.w3.org/TR/css-text-3/#overflow-wrap-property\n        if ($style->overflow_wrap === \"anywhere\"\n            && !in_array($style->white_space, [\"pre\", \"nowrap\"], true)\n        ) {\n            // If it is allowed to break words, the min width is the widest character.\n            // But for performance reasons, we only check the first character.\n            $char = mb_substr($str, 0, 1);\n            $min = $fontMetrics->getTextWidth($char, $font, $size, $word_spacing, $char_spacing);\n            $includesAll = mb_strlen($str) <= 1;\n        } else {\n            switch ($style->white_space) {\n                default:\n                /** @noinspection PhpMissingBreakStatementInspection */\n                // no break\n                case \"normal\":\n                    $str = $this->_collapse_white_space($str);\n                    // no break\n                case \"pre-wrap\":\n                case \"pre-line\":\n                    // Find the first word\n                    $words = preg_split(self::$_wordbreak_pattern, $str, 2, PREG_SPLIT_DELIM_CAPTURE);\n                    // `_line_break()` also considers trailing whitespace for\n                    // checking the width\n                    $firstWord = $words[0] . ($words[1] ?? \"\");\n                    $min = $fontMetrics->getTextWidth($firstWord, $font, $size, $word_spacing, $char_spacing);\n                    $includesAll = count($words) <= 2;\n                    break;\n\n                case \"pre\":\n                    $lines = preg_split(\"/\\R/u\", $str, 2);\n                    $min = $fontMetrics->getTextWidth($lines[0], $font, $size, $word_spacing, $char_spacing);\n                    $includesAll = count($lines) <= 1;\n                    break;\n\n                case \"nowrap\":\n                    $min = $fontMetrics->getTextWidth($this->_collapse_white_space($str), $font, $size, $word_spacing, $char_spacing);\n                    $includesAll = true;\n                    break;\n            }\n        }\n\n        $widths = $includesAll ? [\n            $style->margin_left,\n            $style->border_left_width,\n            $style->padding_left,\n            $style->padding_right,\n            $style->border_right_width,\n            $style->margin_right\n        ] : [\n            $style->margin_left,\n            $style->border_left_width,\n            $style->padding_left\n        ];\n        $delta = (float) $style->length_in_pt($widths, $line_width);\n\n        return [$min + $delta, $includesAll, $delta];\n    }\n\n    /**\n     * @param FontMetrics $fontMetrics\n     * @return $this\n     */\n    public function setFontMetrics(FontMetrics $fontMetrics)\n    {\n        $this->fontMetrics = $fontMetrics;\n        return $this;\n    }\n\n    /**\n     * @return FontMetrics\n     */\n    public function getFontMetrics()\n    {\n        return $this->fontMetrics;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Helpers.php",
    "content": "<?php\nnamespace Dompdf;\n\nclass Helpers\n{\n    /**\n     * print_r wrapper for html/cli output\n     *\n     * Wraps print_r() output in < pre > tags if the current sapi is not 'cli'.\n     * Returns the output string instead of displaying it if $return is true.\n     *\n     * @param mixed $mixed variable or expression to display\n     * @param bool $return\n     *\n     * @return string|null\n     */\n    public static function pre_r($mixed, $return = false)\n    {\n        if ($return) {\n            return \"<pre>\" . print_r($mixed, true) . \"</pre>\";\n        }\n\n        if (php_sapi_name() !== \"cli\") {\n            echo \"<pre>\";\n        }\n\n        print_r($mixed);\n\n        if (php_sapi_name() !== \"cli\") {\n            echo \"</pre>\";\n        } else {\n            echo \"\\n\";\n        }\n\n        flush();\n\n        return null;\n    }\n\n    /**\n     * builds a full url given a protocol, hostname, base path and url\n     *\n     * @param string $protocol\n     * @param string $host\n     * @param string $base_path\n     * @param string $url\n     * @return string\n     *\n     * Initially the trailing slash of $base_path was optional, and conditionally appended.\n     * However on dynamically created sites, where the page is given as url parameter,\n     * the base path might not end with an url.\n     * Therefore do not append a slash, and **require** the $base_url to ending in a slash\n     * when needed.\n     * Vice versa, on using the local file system path of a file, make sure that the slash\n     * is appended (o.k. also for Windows)\n     */\n    public static function build_url($protocol, $host, $base_path, $url)\n    {\n        $protocol = mb_strtolower($protocol);\n        if (strlen($url) == 0) {\n            //return $protocol . $host . rtrim($base_path, \"/\\\\\") . \"/\";\n            return $protocol . $host . $base_path;\n        }\n\n        // Is the url already fully qualified, a Data URI, or a reference to a named anchor?\n        // File-protocol URLs may require additional processing (e.g. for URLs with a relative path)\n        if ((mb_strpos($url, \"://\") !== false && substr($url, 0, 7) !== \"file://\") || mb_substr($url, 0, 1) === \"#\" || mb_strpos($url, \"data:\") === 0 || mb_strpos($url, \"mailto:\") === 0 || mb_strpos($url, \"tel:\") === 0) {\n            return $url;\n        }\n\n        if (strpos($url, \"file://\") === 0) {\n            $url = substr($url, 7);\n            $protocol = \"\";\n        }\n\n        $ret = \"\";\n        if ($protocol != \"file://\") {\n            $ret = $protocol;\n        }\n\n        if (!in_array(mb_strtolower($protocol), [\"http://\", \"https://\", \"ftp://\", \"ftps://\"])) {\n            //On Windows local file, an abs path can begin also with a '\\' or a drive letter and colon\n            //drive: followed by a relative path would be a drive specific default folder.\n            //not known in php app code, treat as abs path\n            //($url[1] !== ':' || ($url[2]!=='\\\\' && $url[2]!=='/'))\n            if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || (mb_strlen($url) > 1 && $url[0] !== '\\\\' && $url[1] !== ':'))) {\n                // For rel path and local access we ignore the host, and run the path through realpath()\n                $ret .= realpath($base_path) . '/';\n            }\n            $ret .= $url;\n            $ret = preg_replace('/\\?(.*)$/', \"\", $ret);\n            return $ret;\n        }\n\n        // Protocol relative urls (e.g. \"//example.org/style.css\")\n        if (strpos($url, '//') === 0) {\n            $ret .= substr($url, 2);\n            //remote urls with backslash in html/css are not really correct, but lets be genereous\n        } elseif ($url[0] === '/' || $url[0] === '\\\\') {\n            // Absolute path\n            $ret .= $host . $url;\n        } else {\n            // Relative path\n            //$base_path = $base_path !== \"\" ? rtrim($base_path, \"/\\\\\") . \"/\" : \"\";\n            $ret .= $host . $base_path . $url;\n        }\n\n        // URL should now be complete, final cleanup\n        $parsed_url = parse_url($ret);\n\n        // reproduced from https://www.php.net/manual/en/function.parse-url.php#106731\n        $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';\n        $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';\n        $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';\n        $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';\n        $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';\n        $pass     = ($user || $pass) ? \"$pass@\" : '';\n        $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';\n        $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';\n        $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';\n        \n        // partially reproduced from https://stackoverflow.com/a/1243431/264628\n        /* replace '//' or '/./' or '/foo/../' with '/' */\n        $re = array('#(/\\.?/)#', '#/(?!\\.\\.)[^/]+/\\.\\./#');\n        for ($n=1; $n>0; $path=preg_replace($re, '/', $path, -1, $n)) {}\n\n        $ret = \"$scheme$user$pass$host$port$path$query$fragment\";\n\n        return $ret;\n    }\n\n    /**\n     * Builds a HTTP Content-Disposition header string using `$dispositionType`\n     * and `$filename`.\n     *\n     * If the filename contains any characters not in the ISO-8859-1 character\n     * set, a fallback filename will be included for clients not supporting the\n     * `filename*` parameter.\n     *\n     * @param string $dispositionType\n     * @param string $filename\n     * @return string\n     */\n    public static function buildContentDispositionHeader($dispositionType, $filename)\n    {\n        $encoding = mb_detect_encoding($filename);\n        $fallbackfilename = mb_convert_encoding($filename, \"ISO-8859-1\", $encoding);\n        $fallbackfilename = str_replace(\"\\\"\", \"\", $fallbackfilename);\n        $encodedfilename = rawurlencode($filename);\n\n        $contentDisposition = \"Content-Disposition: $dispositionType; filename=\\\"$fallbackfilename\\\"\";\n        if ($fallbackfilename !== $filename) {\n            $contentDisposition .= \"; filename*=UTF-8''$encodedfilename\";\n        }\n\n        return $contentDisposition;\n    }\n\n    /**\n     * Converts decimal numbers to roman numerals.\n     *\n     * As numbers larger than 3999 (and smaller than 1) cannot be represented in\n     * the standard form of roman numerals, those are left in decimal form.\n     *\n     * See https://en.wikipedia.org/wiki/Roman_numerals#Standard_form\n     *\n     * @param int|string $num\n     *\n     * @throws Exception\n     * @return string\n     */\n    public static function dec2roman($num): string\n    {\n\n        static $ones = [\"\", \"i\", \"ii\", \"iii\", \"iv\", \"v\", \"vi\", \"vii\", \"viii\", \"ix\"];\n        static $tens = [\"\", \"x\", \"xx\", \"xxx\", \"xl\", \"l\", \"lx\", \"lxx\", \"lxxx\", \"xc\"];\n        static $hund = [\"\", \"c\", \"cc\", \"ccc\", \"cd\", \"d\", \"dc\", \"dcc\", \"dccc\", \"cm\"];\n        static $thou = [\"\", \"m\", \"mm\", \"mmm\"];\n\n        if (!is_numeric($num)) {\n            throw new Exception(\"dec2roman() requires a numeric argument.\");\n        }\n\n        if ($num >= 4000 || $num <= 0) {\n            return (string) $num;\n        }\n\n        $num = strrev((string)$num);\n\n        $ret = \"\";\n        switch (mb_strlen($num)) {\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 4:\n                $ret .= $thou[$num[3]];\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 3:\n                $ret .= $hund[$num[2]];\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 2:\n                $ret .= $tens[$num[1]];\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 1:\n                $ret .= $ones[$num[0]];\n            default:\n                break;\n        }\n\n        return $ret;\n    }\n\n    /**\n     * Determines whether $value is a percentage or not\n     *\n     * @param float $value\n     *\n     * @return bool\n     */\n    public static function is_percent($value)\n    {\n        return false !== mb_strpos($value, \"%\");\n    }\n\n    /**\n     * Parses a data URI scheme\n     * http://en.wikipedia.org/wiki/Data_URI_scheme\n     *\n     * @param string $data_uri The data URI to parse\n     *\n     * @return array|bool The result with charset, mime type and decoded data\n     */\n    public static function parse_data_uri($data_uri)\n    {\n        if (!preg_match('/^data:(?P<mime>[a-z0-9\\/+-.]+)(;charset=(?P<charset>[a-z0-9-])+)?(?P<base64>;base64)?\\,(?P<data>.*)?/is', $data_uri, $match)) {\n            return false;\n        }\n\n        $match['data'] = rawurldecode($match['data']);\n        $result = [\n            'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII',\n            'mime' => $match['mime'] ? $match['mime'] : 'text/plain',\n            'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'],\n        ];\n\n        return $result;\n    }\n\n    /**\n     * Encodes a Uniform Resource Identifier (URI) by replacing non-alphanumeric\n     * characters with a percent (%) sign followed by two hex digits, excepting\n     * characters in the URI reserved character set.\n     *\n     * Assumes that the URI is a complete URI, so does not encode reserved\n     * characters that have special meaning in the URI.\n     *\n     * Simulates the encodeURI function available in JavaScript\n     * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI\n     *\n     * Source: http://stackoverflow.com/q/4929584/264628\n     *\n     * @param string $uri The URI to encode\n     * @return string The original URL with special characters encoded\n     */\n    public static function encodeURI($uri) {\n        $unescaped = [\n            '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',\n            '%2A'=>'*', '%27'=>\"'\", '%28'=>'(', '%29'=>')'\n        ];\n        $reserved = [\n            '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':',\n            '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$'\n        ];\n        $score = [\n            '%23'=>'#'\n        ];\n        return strtr(rawurlencode(rawurldecode($uri)), array_merge($reserved, $unescaped, $score));\n    }\n\n    /**\n     * Decoder for RLE8 compression in windows bitmaps\n     * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp\n     *\n     * @param string $str Data to decode\n     * @param int $width Image width\n     *\n     * @return string\n     */\n    public static function rle8_decode($str, $width)\n    {\n        $lineWidth = $width + (3 - ($width - 1) % 4);\n        $out = '';\n        $cnt = strlen($str);\n\n        for ($i = 0; $i < $cnt; $i++) {\n            $o = ord($str[$i]);\n            switch ($o) {\n                case 0: # ESCAPE\n                    $i++;\n                    switch (ord($str[$i])) {\n                        case 0: # NEW LINE\n                            $padCnt = $lineWidth - strlen($out) % $lineWidth;\n                            if ($padCnt < $lineWidth) {\n                                $out .= str_repeat(chr(0), $padCnt); # pad line\n                            }\n                            break;\n                        case 1: # END OF FILE\n                            $padCnt = $lineWidth - strlen($out) % $lineWidth;\n                            if ($padCnt < $lineWidth) {\n                                $out .= str_repeat(chr(0), $padCnt); # pad line\n                            }\n                            break 3;\n                        case 2: # DELTA\n                            $i += 2;\n                            break;\n                        default: # ABSOLUTE MODE\n                            $num = ord($str[$i]);\n                            for ($j = 0; $j < $num; $j++) {\n                                $out .= $str[++$i];\n                            }\n                            if ($num % 2) {\n                                $i++;\n                            }\n                    }\n                    break;\n                default:\n                    $out .= str_repeat($str[++$i], $o);\n            }\n        }\n        return $out;\n    }\n\n    /**\n     * Decoder for RLE4 compression in windows bitmaps\n     * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp\n     *\n     * @param string $str Data to decode\n     * @param int $width Image width\n     *\n     * @return string\n     */\n    public static function rle4_decode($str, $width)\n    {\n        $w = floor($width / 2) + ($width % 2);\n        $lineWidth = $w + (3 - (($width - 1) / 2) % 4);\n        $pixels = [];\n        $cnt = strlen($str);\n        $c = 0;\n\n        for ($i = 0; $i < $cnt; $i++) {\n            $o = ord($str[$i]);\n            switch ($o) {\n                case 0: # ESCAPE\n                    $i++;\n                    switch (ord($str[$i])) {\n                        case 0: # NEW LINE\n                            while (count($pixels) % $lineWidth != 0) {\n                                $pixels[] = 0;\n                            }\n                            break;\n                        case 1: # END OF FILE\n                            while (count($pixels) % $lineWidth != 0) {\n                                $pixels[] = 0;\n                            }\n                            break 3;\n                        case 2: # DELTA\n                            $i += 2;\n                            break;\n                        default: # ABSOLUTE MODE\n                            $num = ord($str[$i]);\n                            for ($j = 0; $j < $num; $j++) {\n                                if ($j % 2 == 0) {\n                                    $c = ord($str[++$i]);\n                                    $pixels[] = ($c & 240) >> 4;\n                                } else {\n                                    $pixels[] = $c & 15;\n                                }\n                            }\n\n                            if ($num % 2 == 0) {\n                                $i++;\n                            }\n                    }\n                    break;\n                default:\n                    $c = ord($str[++$i]);\n                    for ($j = 0; $j < $o; $j++) {\n                        $pixels[] = ($j % 2 == 0 ? ($c & 240) >> 4 : $c & 15);\n                    }\n            }\n        }\n\n        $out = '';\n        if (count($pixels) % 2) {\n            $pixels[] = 0;\n        }\n\n        $cnt = count($pixels) / 2;\n\n        for ($i = 0; $i < $cnt; $i++) {\n            $out .= chr(16 * $pixels[2 * $i] + $pixels[2 * $i + 1]);\n        }\n\n        return $out;\n    }\n\n    /**\n     * parse a full url or pathname and return an array(protocol, host, path,\n     * file + query + fragment)\n     *\n     * @param string $url\n     * @return array\n     */\n    public static function explode_url($url)\n    {\n        $protocol = \"\";\n        $host = \"\";\n        $path = \"\";\n        $file = \"\";\n\n        $arr = parse_url($url);\n        if ( isset($arr[\"scheme\"]) ) {\n            $arr[\"scheme\"] = mb_strtolower($arr[\"scheme\"]);\n        }\n\n        // Exclude windows drive letters...\n        if (isset($arr[\"scheme\"]) && $arr[\"scheme\"] !== \"file\" && strlen($arr[\"scheme\"]) > 1) {\n            $protocol = $arr[\"scheme\"] . \"://\";\n\n            if (isset($arr[\"user\"])) {\n                $host .= $arr[\"user\"];\n\n                if (isset($arr[\"pass\"])) {\n                    $host .= \":\" . $arr[\"pass\"];\n                }\n\n                $host .= \"@\";\n            }\n\n            if (isset($arr[\"host\"])) {\n                $host .= $arr[\"host\"];\n            }\n\n            if (isset($arr[\"port\"])) {\n                $host .= \":\" . $arr[\"port\"];\n            }\n\n            if (isset($arr[\"path\"]) && $arr[\"path\"] !== \"\") {\n                // Do we have a trailing slash?\n                if ($arr[\"path\"][mb_strlen($arr[\"path\"]) - 1] === \"/\") {\n                    $path = $arr[\"path\"];\n                    $file = \"\";\n                } else {\n                    $path = rtrim(dirname($arr[\"path\"]), '/\\\\') . \"/\";\n                    $file = basename($arr[\"path\"]);\n                }\n            }\n\n            if (isset($arr[\"query\"])) {\n                $file .= \"?\" . $arr[\"query\"];\n            }\n\n            if (isset($arr[\"fragment\"])) {\n                $file .= \"#\" . $arr[\"fragment\"];\n            }\n\n        } else {\n\n            $i = mb_stripos($url, \"file://\");\n            if ($i !== false) {\n                $url = mb_substr($url, $i + 7);\n            }\n\n            $protocol = \"\"; // \"file://\"; ? why doesn't this work... It's because of\n            // network filenames like //COMPU/SHARENAME\n\n            $host = \"\"; // localhost, really\n            $file = basename($url);\n\n            $path = dirname($url);\n\n            // Check that the path exists\n            if ($path !== false) {\n                $path .= '/';\n\n            } else {\n                // generate a url to access the file if no real path found.\n                $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';\n\n                $host = isset($_SERVER[\"HTTP_HOST\"]) ? $_SERVER[\"HTTP_HOST\"] : php_uname(\"n\");\n\n                if (substr($arr[\"path\"], 0, 1) === '/') {\n                    $path = dirname($arr[\"path\"]);\n                } else {\n                    $path = '/' . rtrim(dirname($_SERVER[\"SCRIPT_NAME\"]), '/') . '/' . $arr[\"path\"];\n                }\n            }\n        }\n\n        $ret = [$protocol, $host, $path, $file,\n            \"protocol\" => $protocol,\n            \"host\" => $host,\n            \"path\" => $path,\n            \"file\" => $file];\n        return $ret;\n    }\n\n    /**\n     * Print debug messages\n     *\n     * @param string $type The type of debug messages to print\n     * @param string $msg The message to show\n     */\n    public static function dompdf_debug($type, $msg)\n    {\n        global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug;\n        if (isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug)) {\n            $arr = debug_backtrace();\n\n            echo basename($arr[0][\"file\"]) . \" (\" . $arr[0][\"line\"] . \"): \" . $arr[1][\"function\"] . \": \";\n            Helpers::pre_r($msg);\n        }\n    }\n\n    /**\n     * Stores warnings in an array for display later\n     * This function allows warnings generated by the DomDocument parser\n     * and CSS loader ({@link Stylesheet}) to be captured and displayed\n     * later.  Without this function, errors are displayed immediately and\n     * PDF streaming is impossible.\n     * @see http://www.php.net/manual/en/function.set-error_handler.php\n     *\n     * @param int $errno\n     * @param string $errstr\n     * @param string $errfile\n     * @param string $errline\n     *\n     * @throws Exception\n     */\n    public static function record_warnings($errno, $errstr, $errfile, $errline)\n    {\n        // Not a warning or notice\n        if (!($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING | E_STRICT | E_DEPRECATED | E_USER_DEPRECATED))) {\n            throw new Exception($errstr . \" $errno\");\n        }\n\n        global $_dompdf_warnings;\n        global $_dompdf_show_warnings;\n\n        if ($_dompdf_show_warnings) {\n            echo $errstr . \"\\n\";\n        }\n\n        $_dompdf_warnings[] = $errstr;\n    }\n\n    /**\n     * @param $c\n     * @return bool|string\n     */\n    public static function unichr($c)\n    {\n        if ($c <= 0x7F) {\n            return chr($c);\n        } else if ($c <= 0x7FF) {\n            return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);\n        } else if ($c <= 0xFFFF) {\n            return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)\n            . chr(0x80 | $c & 0x3F);\n        } else if ($c <= 0x10FFFF) {\n            return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)\n            . chr(0x80 | $c >> 6 & 0x3F)\n            . chr(0x80 | $c & 0x3F);\n        }\n        return false;\n    }\n\n    /**\n     * Converts a CMYK color to RGB\n     *\n     * @param float|float[] $c\n     * @param float $m\n     * @param float $y\n     * @param float $k\n     *\n     * @return float[]\n     */\n    public static function cmyk_to_rgb($c, $m = null, $y = null, $k = null)\n    {\n        if (is_array($c)) {\n            [$c, $m, $y, $k] = $c;\n        }\n\n        $c *= 255;\n        $m *= 255;\n        $y *= 255;\n        $k *= 255;\n\n        $r = (1 - round(2.55 * ($c + $k)));\n        $g = (1 - round(2.55 * ($m + $k)));\n        $b = (1 - round(2.55 * ($y + $k)));\n\n        if ($r < 0) {\n            $r = 0;\n        }\n        if ($g < 0) {\n            $g = 0;\n        }\n        if ($b < 0) {\n            $b = 0;\n        }\n\n        return [\n            $r, $g, $b,\n            \"r\" => $r, \"g\" => $g, \"b\" => $b\n        ];\n    }\n\n    /**\n     * getimagesize doesn't give a good size for 32bit BMP image v5\n     *\n     * @param string $filename\n     * @param resource $context\n     * @return array The same format as getimagesize($filename)\n     */\n    public static function dompdf_getimagesize($filename, $context = null)\n    {\n        static $cache = [];\n\n        if (isset($cache[$filename])) {\n            return $cache[$filename];\n        }\n\n        [$width, $height, $type] = getimagesize($filename);\n\n        // Custom types\n        $types = [\n            IMAGETYPE_JPEG => \"jpeg\",\n            IMAGETYPE_GIF  => \"gif\",\n            IMAGETYPE_BMP  => \"bmp\",\n            IMAGETYPE_PNG  => \"png\",\n            IMAGETYPE_WEBP => \"webp\",\n        ];\n\n        $type = isset($types[$type]) ? $types[$type] : null;\n\n        if ($width == null || $height == null) {\n            [$data, $headers] = Helpers::getFileContent($filename, $context);\n\n            if (!empty($data)) {\n                if (substr($data, 0, 2) === \"BM\") {\n                    $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data);\n                    $width = (int)$meta['width'];\n                    $height = (int)$meta['height'];\n                    $type = \"bmp\";\n                } else {\n                    if (strpos($data, \"<svg\") !== false) {\n                        $doc = new \\Svg\\Document();\n                        $doc->loadFile($filename);\n\n                        [$width, $height] = $doc->getDimensions();\n                        $type = \"svg\";\n                    }\n                }\n            }\n        }\n\n        return $cache[$filename] = [$width, $height, $type];\n    }\n\n    /**\n     * Credit goes to mgutt\n     * http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm\n     * Modified by Fabien Menager to support RGB555 BMP format\n     */\n    public static function imagecreatefrombmp($filename, $context = null)\n    {\n        if (!function_exists(\"imagecreatetruecolor\")) {\n            trigger_error(\"The PHP GD extension is required, but is not installed.\", E_ERROR);\n            return false;\n        }\n\n        // version 1.00\n        if (!($fh = fopen($filename, 'rb'))) {\n            trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING);\n            return false;\n        }\n\n        $bytes_read = 0;\n\n        // read file header\n        $meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14));\n\n        // check for bitmap\n        if ($meta['type'] != 19778) {\n            trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING);\n            return false;\n        }\n\n        // read image header\n        $meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40));\n        $bytes_read += 40;\n\n        // read additional bitfield header\n        if ($meta['compression'] == 3) {\n            $meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12));\n            $bytes_read += 12;\n        }\n\n        // set bytes and padding\n        $meta['bytes'] = $meta['bits'] / 8;\n        $meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4) - floor($meta['width'] * $meta['bytes'] / 4)));\n        if ($meta['decal'] == 4) {\n            $meta['decal'] = 0;\n        }\n\n        // obtain imagesize\n        if ($meta['imagesize'] < 1) {\n            $meta['imagesize'] = $meta['filesize'] - $meta['offset'];\n            // in rare cases filesize is equal to offset so we need to read physical size\n            if ($meta['imagesize'] < 1) {\n                $meta['imagesize'] = @filesize($filename) - $meta['offset'];\n                if ($meta['imagesize'] < 1) {\n                    trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING);\n                    return false;\n                }\n            }\n        }\n\n        // calculate colors\n        $meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors'];\n\n        // read color palette\n        $palette = [];\n        if ($meta['bits'] < 16) {\n            $palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4));\n            // in rare cases the color value is signed\n            if ($palette[1] < 0) {\n                foreach ($palette as $i => $color) {\n                    $palette[$i] = $color + 16777216;\n                }\n            }\n        }\n\n        // ignore extra bitmap headers\n        if ($meta['headersize'] > $bytes_read) {\n            fread($fh, $meta['headersize'] - $bytes_read);\n        }\n\n        // create gd image\n        $im = imagecreatetruecolor($meta['width'], $meta['height']);\n        $data = fread($fh, $meta['imagesize']);\n\n        // uncompress data\n        switch ($meta['compression']) {\n            case 1:\n                $data = Helpers::rle8_decode($data, $meta['width']);\n                break;\n            case 2:\n                $data = Helpers::rle4_decode($data, $meta['width']);\n                break;\n        }\n\n        $p = 0;\n        $vide = chr(0);\n        $y = $meta['height'] - 1;\n        $error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!';\n\n        // loop through the image data beginning with the lower left corner\n        while ($y >= 0) {\n            $x = 0;\n            while ($x < $meta['width']) {\n                switch ($meta['bits']) {\n                    case 32:\n                    case 24:\n                        if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) {\n                            trigger_error($error, E_USER_WARNING);\n                            return $im;\n                        }\n                        $color = unpack('V', $part . $vide);\n                        break;\n                    case 16:\n                        if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) {\n                            trigger_error($error, E_USER_WARNING);\n                            return $im;\n                        }\n                        $color = unpack('v', $part);\n\n                        if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) {\n                            $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555\n                        } else {\n                            $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565\n                        }\n                        break;\n                    case 8:\n                        $color = unpack('n', $vide . substr($data, $p, 1));\n                        $color[1] = $palette[$color[1] + 1];\n                        break;\n                    case 4:\n                        $color = unpack('n', $vide . substr($data, floor($p), 1));\n                        $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F;\n                        $color[1] = $palette[$color[1] + 1];\n                        break;\n                    case 1:\n                        $color = unpack('n', $vide . substr($data, floor($p), 1));\n                        switch (($p * 8) % 8) {\n                            case 0:\n                                $color[1] = $color[1] >> 7;\n                                break;\n                            case 1:\n                                $color[1] = ($color[1] & 0x40) >> 6;\n                                break;\n                            case 2:\n                                $color[1] = ($color[1] & 0x20) >> 5;\n                                break;\n                            case 3:\n                                $color[1] = ($color[1] & 0x10) >> 4;\n                                break;\n                            case 4:\n                                $color[1] = ($color[1] & 0x8) >> 3;\n                                break;\n                            case 5:\n                                $color[1] = ($color[1] & 0x4) >> 2;\n                                break;\n                            case 6:\n                                $color[1] = ($color[1] & 0x2) >> 1;\n                                break;\n                            case 7:\n                                $color[1] = ($color[1] & 0x1);\n                                break;\n                        }\n                        $color[1] = $palette[$color[1] + 1];\n                        break;\n                    default:\n                        trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING);\n                        return false;\n                }\n                imagesetpixel($im, $x, $y, $color[1]);\n                $x++;\n                $p += $meta['bytes'];\n            }\n            $y--;\n            $p += $meta['decal'];\n        }\n        fclose($fh);\n        return $im;\n    }\n\n    /**\n     * Gets the content of the file at the specified path using one of\n     * the following methods, in preferential order:\n     *  - file_get_contents: if allow_url_fopen is true or the file is local\n     *  - curl: if allow_url_fopen is false and curl is available\n     *\n     * @param string $uri\n     * @param resource $context (ignored if curl is used)\n     * @param int $offset\n     * @param int $maxlen (ignored if curl is used)\n     * @return string[]\n     */\n    public static function getFileContent($uri, $context = null, $offset = 0, $maxlen = null)\n    {\n        $content = null;\n        $headers = null;\n        [$proto, $host, $path, $file] = Helpers::explode_url($uri);\n        $is_local_path = ($proto == '' || $proto === 'file://');\n\n        set_error_handler([self::class, 'record_warnings']);\n\n        try {\n            if ($is_local_path || ini_get('allow_url_fopen')) {\n                if ($is_local_path === false) {\n                    $uri = Helpers::encodeURI($uri);\n                }\n                if (isset($maxlen)) {\n                    $result = file_get_contents($uri, null, $context, $offset, $maxlen);\n                } else {\n                    $result = file_get_contents($uri, null, $context, $offset);\n                }\n                if ($result !== false) {\n                    $content = $result;\n                }\n                if (isset($http_response_header)) {\n                    $headers = $http_response_header;\n                }\n\n            } elseif (function_exists('curl_exec')) {\n                $curl = curl_init($uri);\n\n                //TODO: use $context to define additional curl options\n                curl_setopt($curl, CURLOPT_TIMEOUT, 10);\n                curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);\n                curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);\n                curl_setopt($curl, CURLOPT_HEADER, true);\n                if ($offset > 0) {\n                    curl_setopt($curl, CURLOPT_RESUME_FROM, $offset);\n                }\n\n                $data = curl_exec($curl);\n\n                if ($data !== false && !curl_errno($curl)) {\n                    switch ($http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE)) {\n                        case 200:\n                            $raw_headers = substr($data, 0, curl_getinfo($curl, CURLINFO_HEADER_SIZE));\n                            $headers = preg_split(\"/[\\n\\r]+/\", trim($raw_headers));\n                            $content = substr($data, curl_getinfo($curl, CURLINFO_HEADER_SIZE));\n                            break;\n                    }\n                }\n                curl_close($curl);\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return [$content, $headers];\n    }\n\n    public static function mb_ucwords($str) {\n        $max_len = mb_strlen($str);\n        if ($max_len === 1) {\n            return mb_strtoupper($str);\n        }\n\n        $str = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1);\n\n        foreach ([' ', '.', ',', '!', '?', '-', '+'] as $s) {\n            $pos = 0;\n            while (($pos = mb_strpos($str, $s, $pos)) !== false) {\n                $pos++;\n                // Nothing to do if the separator is the last char of the string\n                if ($pos !== false && $pos < $max_len) {\n                    // If the char we want to upper is the last char there is nothing to append behind\n                    if ($pos + 1 < $max_len) {\n                        $str = mb_substr($str, 0, $pos) . mb_strtoupper(mb_substr($str, $pos, 1)) . mb_substr($str, $pos + 1);\n                    } else {\n                        $str = mb_substr($str, 0, $pos) . mb_strtoupper(mb_substr($str, $pos, 1));\n                    }\n                }\n            }\n        }\n\n        return $str;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Image/Cache.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Image;\n\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Exception\\ImageException;\n\n/**\n * Static class that resolves image urls and downloads and caches\n * remote images if required.\n *\n * @package dompdf\n */\nclass Cache\n{\n    /**\n     * Array of downloaded images.  Cached so that identical images are\n     * not needlessly downloaded.\n     *\n     * @var array\n     */\n    protected static $_cache = [];\n\n    /**\n     * The url to the \"broken image\" used when images can't be loaded\n     *\n     * @var string\n     */\n    public static $broken_image = \"data:image/svg+xml;charset=utf8,%3C?xml version='1.0'?%3E%3Csvg width='64' height='64' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Crect stroke='%23666666' id='svg_1' height='60.499994' width='60.166667' y='1.666669' x='1.999998' stroke-width='1.5' fill='none'/%3E%3Cline stroke-linecap='null' stroke-linejoin='null' id='svg_3' y2='59.333253' x2='59.749916' y1='4.333415' x1='4.250079' stroke-width='1.5' stroke='%23999999' fill='none'/%3E%3Cline stroke-linecap='null' stroke-linejoin='null' id='svg_4' y2='59.999665' x2='4.062838' y1='3.750342' x1='60.062164' stroke-width='1.5' stroke='%23999999' fill='none'/%3E%3C/g%3E%3C/svg%3E\";\n\n    public static $error_message = \"Image not found or type unknown\";\n    \n    /**\n     * Current dompdf instance\n     *\n     * @var Dompdf\n     */\n    protected static $_dompdf;\n\n    /**\n     * Resolve and fetch an image for use.\n     *\n     * @param string $url       The url of the image\n     * @param string $protocol  Default protocol if none specified in $url\n     * @param string $host      Default host if none specified in $url\n     * @param string $base_path Default path if none specified in $url\n     * @param Dompdf $dompdf    The Dompdf instance\n     *\n     * @throws ImageException\n     * @return array             An array with two elements: The local path to the image and the image extension\n     */\n    static function resolve_url($url, $protocol, $host, $base_path, Dompdf $dompdf)\n    {\n        self::$_dompdf = $dompdf;\n        \n        $protocol = mb_strtolower($protocol);\n        $parsed_url = Helpers::explode_url($url);\n        $message = null;\n\n        $remote = ($protocol && $protocol !== \"file://\") || ($parsed_url['protocol'] != \"\");\n\n        $data_uri = strpos($parsed_url['protocol'], \"data:\") === 0;\n        $full_url = null;\n        $enable_remote = $dompdf->getOptions()->getIsRemoteEnabled();\n        $tempfile = false;\n\n        try {\n\n            // Remote not allowed and is not DataURI\n            if (!$enable_remote && $remote && !$data_uri) {\n                throw new ImageException(\"Remote file access is disabled.\", E_WARNING);\n            }\n            \n            // remote allowed or DataURI\n            if (($enable_remote && $remote) || $data_uri) {\n                // Download remote files to a temporary directory\n                $full_url = Helpers::build_url($protocol, $host, $base_path, $url);\n\n                // From cache\n                if (isset(self::$_cache[$full_url])) {\n                    $resolved_url = self::$_cache[$full_url];\n                } // From remote\n                else {\n                    $tmp_dir = $dompdf->getOptions()->getTempDir();\n                    if (($resolved_url = @tempnam($tmp_dir, \"ca_dompdf_img_\")) === false) {\n                        throw new ImageException(\"Unable to create temporary image in \" . $tmp_dir, E_WARNING);\n                    }\n                    $tempfile = $resolved_url;\n                    $image = \"\";\n\n                    if ($data_uri) {\n                        if ($parsed_data_uri = Helpers::parse_data_uri($url)) {\n                            $image = $parsed_data_uri['data'];\n                        }\n                    } else {\n                        list($image, $http_response_header) = Helpers::getFileContent($full_url, $dompdf->getHttpContext());\n                    }\n\n                    // Image not found or invalid\n                    if (empty($image)) {\n                        $msg = ($data_uri ? \"Data-URI could not be parsed\" : \"Image not found\");\n                        throw new ImageException($msg, E_WARNING);\n                    } // Image found, put in cache and process\n                    else {\n                        //e.g. fetch.php?media=url.jpg&cache=1\n                        //- Image file name might be one of the dynamic parts of the url, don't strip off!\n                        //- a remote url does not need to have a file extension at all\n                        //- local cached file does not have a matching file extension\n                        //Therefore get image type from the content\n                        if (@file_put_contents($resolved_url, $image) === false) {\n                            throw new ImageException(\"Unable to create temporary image in \" . $tmp_dir, E_WARNING);\n                        }\n                    }\n                }\n            } // Not remote, local image\n            else {\n                $resolved_url = Helpers::build_url($protocol, $host, $base_path, $url);\n\n                if ($protocol == \"\" || $protocol === \"file://\") {\n                    $realfile = realpath($resolved_url);\n        \n                    $rootDir = realpath($dompdf->getOptions()->getRootDir());\n                    if (strpos($realfile, $rootDir) !== 0) {\n                        $chroot = $dompdf->getOptions()->getChroot();\n                        $chrootValid = false;\n                        foreach ($chroot as $chrootPath) {\n                            $chrootPath = realpath($chrootPath);\n                            if ($chrootPath !== false && strpos($realfile, $chrootPath) === 0) {\n                                $chrootValid = true;\n                                break;\n                            }\n                        }\n                        if ($chrootValid !== true) {\n                            throw new ImageException(\"Permission denied on $resolved_url. The file could not be found under the paths specified by Options::chroot.\", E_WARNING);\n                        }\n                    }\n        \n                    if (!$realfile) {\n                        throw new ImageException(\"File '$realfile' not found.\", E_WARNING);\n                    }\n        \n                    $resolved_url = $realfile;\n                }\n            }\n\n            // Check if the local file is readable\n            if (!is_readable($resolved_url) || !filesize($resolved_url)) {\n                throw new ImageException(\"Image not readable or empty\", E_WARNING);\n            } // Check is the file is an image\n            else {\n                list($width, $height, $type) = Helpers::dompdf_getimagesize($resolved_url, $dompdf->getHttpContext());\n\n                // Known image type\n                if ($width && $height && in_array($type, [\"gif\", \"png\", \"jpeg\", \"bmp\", \"svg\",\"webp\"])) {\n                    //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup.\n                    //Only execute on successful caching of remote image.\n                    if ($enable_remote && $remote || $data_uri) {\n                        self::$_cache[$full_url] = $resolved_url;\n                    }\n                } // Unknown image type\n                else {\n                    throw new ImageException(\"Image type unknown\", E_WARNING);\n                }\n            }\n        } catch (ImageException $e) {\n            if ($tempfile) {\n                unlink($tempfile);\n            }\n            $resolved_url = self::$broken_image;\n            $type = \"png\";\n            $message = self::$error_message;\n            Helpers::record_warnings($e->getCode(), $e->getMessage() . \" \\n $url\", $e->getFile(), $e->getLine());\n            self::$_cache[$full_url] = $resolved_url;\n        }\n\n        return [$resolved_url, $type, $message];\n    }\n\n    /**\n     * Unlink all cached images (i.e. temporary images either downloaded\n     * or converted) except for the bundled \"broken image\"\n     */\n    static function clear()\n    {\n        if (empty(self::$_cache) || self::$_dompdf->getOptions()->getDebugKeepTemp()) {\n            return;\n        }\n\n        foreach (self::$_cache as $file) {\n            if ($file === self::$broken_image) {\n                continue;\n            }\n            if (self::$_dompdf->getOptions()->getDebugPng()) {\n                print \"[clear unlink $file]\";\n            }\n            unlink($file);\n        }\n\n        self::$_cache = [];\n    }\n\n    static function detect_type($file, $context = null)\n    {\n        list(, , $type) = Helpers::dompdf_getimagesize($file, $context);\n\n        return $type;\n    }\n\n    static function is_broken($url)\n    {\n        return $url === self::$broken_image;\n    }\n}\n\nif (file_exists(realpath(__DIR__ . \"/../../lib/res/broken_image.svg\"))) {\n    Cache::$broken_image = realpath(__DIR__ . \"/../../lib/res/broken_image.svg\");\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/JavascriptEmbedder.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\n/**\n * Embeds Javascript into the PDF document\n *\n * @package dompdf\n */\nclass JavascriptEmbedder\n{\n\n    /**\n     * @var Dompdf\n     */\n    protected $_dompdf;\n\n    /**\n     * JavascriptEmbedder constructor.\n     *\n     * @param Dompdf $dompdf\n     */\n    public function __construct(Dompdf $dompdf)\n    {\n        $this->_dompdf = $dompdf;\n    }\n\n    /**\n     * @param $script\n     */\n    public function insert($script)\n    {\n        $this->_dompdf->getCanvas()->javascript($script);\n    }\n\n    /**\n     * @param Frame $frame\n     */\n    public function render(Frame $frame)\n    {\n        if (!$this->_dompdf->getOptions()->getIsJavascriptEnabled()) {\n            return;\n        }\n\n        $this->insert($frame->get_node()->nodeValue);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/LineBox.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\nuse Dompdf\\FrameDecorator\\Block;\nuse Dompdf\\FrameDecorator\\Page;\nuse Dompdf\\Positioner\\Inline as InlinePositioner;\n\n/**\n * The line box class\n *\n * This class represents a line box\n * http://www.w3.org/TR/CSS2/visuren.html#line-box\n *\n * @package dompdf\n */\nclass LineBox\n{\n\n    /**\n     * @var Block\n     */\n    protected $_block_frame;\n\n    /**\n     * @var AbstractFrameDecorator[]\n     */\n    protected $_frames = [];\n\n    /**\n     * @var int\n     */\n    public $wc = 0;\n\n    /**\n     * @var float\n     */\n    public $y = null;\n\n    /**\n     * @var float\n     */\n    public $w = 0.0;\n\n    /**\n     * @var float\n     */\n    public $h = 0.0;\n\n    /**\n     * @var float\n     */\n    public $left = 0.0;\n\n    /**\n     * @var float\n     */\n    public $right = 0.0;\n\n    /**\n     * @var AbstractFrameDecorator\n     */\n    public $tallest_frame = null;\n\n    /**\n     * @var bool[]\n     */\n    public $floating_blocks = [];\n\n    /**\n     * @var bool\n     */\n    public $br = false;\n\n    /**\n     * Whether the line box contains any inline-positioned frames.\n     *\n     * @var bool\n     */\n    public $inline = false;\n\n    /**\n     * Class constructor\n     *\n     * @param Block $frame the Block containing this line\n     * @param int $y\n     */\n    public function __construct(Block $frame, $y = 0)\n    {\n        $this->_block_frame = $frame;\n        $this->_frames = [];\n        $this->y = $y;\n\n        $this->get_float_offsets();\n    }\n\n    /**\n     * Returns the floating elements inside the first floating parent\n     *\n     * @param Page $root\n     *\n     * @return Frame[]\n     */\n    public function get_floats_inside(Page $root)\n    {\n        $floating_frames = $root->get_floating_frames();\n\n        if (count($floating_frames) == 0) {\n            return $floating_frames;\n        }\n\n        // Find nearest floating element\n        $p = $this->_block_frame;\n        while ($p->get_style()->float === \"none\") {\n            $parent = $p->get_parent();\n\n            if (!$parent) {\n                break;\n            }\n\n            $p = $parent;\n        }\n\n        if ($p == $root) {\n            return $floating_frames;\n        }\n\n        $parent = $p;\n\n        $childs = [];\n\n        foreach ($floating_frames as $_floating) {\n            $p = $_floating->get_parent();\n\n            while (($p = $p->get_parent()) && $p !== $parent);\n\n            if ($p) {\n                $childs[] = $p;\n            }\n        }\n\n        return $childs;\n    }\n\n    public function get_float_offsets()\n    {\n        static $anti_infinite_loop = 10000; // FIXME smelly hack\n\n        $reflower = $this->_block_frame->get_reflower();\n\n        if (!$reflower) {\n            return;\n        }\n\n        $cb_w = null;\n\n        $block = $this->_block_frame;\n        $root = $block->get_root();\n\n        if (!$root) {\n            return;\n        }\n\n        $style = $this->_block_frame->get_style();\n        $floating_frames = $this->get_floats_inside($root);\n        $inside_left_floating_width = 0;\n        $inside_right_floating_width = 0;\n        $outside_left_floating_width = 0;\n        $outside_right_floating_width = 0;\n\n        foreach ($floating_frames as $child_key => $floating_frame) {\n            $floating_frame_parent = $floating_frame->get_parent();\n            $id = $floating_frame->get_id();\n\n            if (isset($this->floating_blocks[$id])) {\n                continue;\n            }\n\n            $float = $floating_frame->get_style()->float;\n            $floating_width = $floating_frame->get_margin_width();\n\n            if (!$cb_w) {\n                $cb_w = $floating_frame->get_containing_block(\"w\");\n            }\n\n            $line_w = $this->get_width();\n\n            if (!$floating_frame->_float_next_line && ($cb_w <= $line_w + $floating_width) && ($cb_w > $line_w)) {\n                $floating_frame->_float_next_line = true;\n                continue;\n            }\n\n            // If the child is still shifted by the floating element\n            if ($anti_infinite_loop-- > 0 &&\n                $floating_frame->get_position(\"y\") + $floating_frame->get_margin_height() >= $this->y &&\n                $block->get_position(\"x\") + $block->get_margin_width() >= $floating_frame->get_position(\"x\")\n            ) {\n                if ($float === \"left\") {\n                    if ($floating_frame_parent === $this->_block_frame) {\n                        $inside_left_floating_width += $floating_width;\n                    } else {\n                        $outside_left_floating_width += $floating_width;\n                    }\n                } elseif ($float === \"right\") {\n                    if ($floating_frame_parent === $this->_block_frame) {\n                        $inside_right_floating_width += $floating_width;\n                    } else {\n                        $outside_right_floating_width += $floating_width;\n                    }\n                }\n\n                $this->floating_blocks[$id] = true;\n            } // else, the floating element won't shift anymore\n            else {\n                $root->remove_floating_frame($child_key);\n            }\n        }\n\n        $this->left += $inside_left_floating_width;\n        if ($outside_left_floating_width > 0 && $outside_left_floating_width > ((float)$style->length_in_pt($style->margin_left) + (float)$style->length_in_pt($style->padding_left))) {\n            $this->left += $outside_left_floating_width - (float)$style->length_in_pt($style->margin_left) - (float)$style->length_in_pt($style->padding_left);\n        }\n        $this->right += $inside_right_floating_width;\n        if ($outside_right_floating_width > 0 && $outside_right_floating_width > ((float)$style->length_in_pt($style->margin_left) + (float)$style->length_in_pt($style->padding_right))) {\n            $this->right += $outside_right_floating_width - (float)$style->length_in_pt($style->margin_right) - (float)$style->length_in_pt($style->padding_right);\n        }\n    }\n\n    /**\n     * @return float\n     */\n    public function get_width()\n    {\n        return $this->left + $this->w + $this->right;\n    }\n\n    /**\n     * @return Block\n     */\n    public function get_block_frame()\n    {\n        return $this->_block_frame;\n    }\n\n    /**\n     * @return AbstractFrameDecorator[]\n     */\n    function &get_frames()\n    {\n        return $this->_frames;\n    }\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    public function add_frame(Frame $frame)\n    {\n        $this->_frames[] = $frame;\n\n        if ($frame->get_positioner() instanceof InlinePositioner) {\n            $this->inline = true;\n        }\n    }\n\n    /**\n     * Remove the frame at the given index and all following frames from the\n     * line.\n     *\n     * @param int $index\n     */\n    public function remove_frames(int $index): void\n    {\n        $lastIndex = count($this->_frames) - 1;\n\n        if ($index < 0 || $index > $lastIndex) {\n            return;\n        }\n\n        for ($i = $lastIndex; $i >= $index; $i--) {\n            $f = $this->_frames[$i];\n            unset($this->_frames[$i]);\n            $this->w -= $f->get_margin_width();\n        }\n\n        // Reset array indices\n        $this->_frames = array_values($this->_frames);\n\n        // Recalculate the height of the line\n        $h = 0.0;\n        $this->inline = false;\n\n        foreach ($this->_frames as $f) {\n            $h = max($h, $f->get_margin_height());\n\n            if ($f->get_positioner() instanceof InlinePositioner) {\n                $this->inline = true;\n            }\n        }\n\n        $this->h = $h;\n    }\n\n    /**\n     * Recalculate LineBox width based on the contained frames total width.\n     *\n     * @return float\n     */\n    public function recalculate_width()\n    {\n        $width = 0;\n\n        foreach ($this->_frames as $frame) {\n            $width += $frame->get_margin_width();\n        }\n\n        return $this->w = $width;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        $props = [\"wc\", \"y\", \"w\", \"h\", \"left\", \"right\", \"br\"];\n        $s = \"\";\n        foreach ($props as $prop) {\n            $s .= \"$prop: \" . $this->$prop . \"\\n\";\n        }\n        $s .= count($this->_frames) . \" frames\\n\";\n\n        return $s;\n    }\n}\n\n/*\nclass LineBoxList implements Iterator {\n  private $_p = 0;\n  private $_lines = array();\n\n}\n*/\n"
  },
  {
    "path": "application/libraries/dompdf/src/Options.php",
    "content": "<?php\nnamespace Dompdf;\n\nclass Options\n{\n    /**\n     * The root of your DOMPDF installation\n     *\n     * @var string\n     */\n    private $rootDir;\n\n    /**\n     * The location of a temporary directory.\n     *\n     * The directory specified must be writable by the webserver process.\n     * The temporary directory is required to download remote images and when\n     * using the PFDLib back end.\n     *\n     * @var string\n     */\n    private $tempDir;\n\n    /**\n     * The location of the DOMPDF font directory\n     *\n     * The location of the directory where DOMPDF will store fonts and font metrics\n     * Note: This directory must exist and be writable by the webserver process.\n     *\n     * @var string\n     */\n    private $fontDir;\n\n    /**\n     * The location of the DOMPDF font cache directory\n     *\n     * This directory contains the cached font metrics for the fonts used by DOMPDF.\n     * This directory can be the same as $fontDir\n     *\n     * Note: This directory must exist and be writable by the webserver process.\n     *\n     * @var string\n     */\n    private $fontCache;\n\n    /**\n     * dompdf's \"chroot\"\n     *\n     * Prevents dompdf from accessing system files or other files on the webserver.\n     * All local files opened by dompdf must be in a subdirectory of this directory\n     * or array of directories.\n     * DO NOT set it to '/' since this could allow an attacker to use dompdf to\n     * read any files on the server.  This should be an absolute path.\n     *\n     * ==== IMPORTANT ====\n     * This setting may increase the risk of system exploit. Do not change\n     * this settings without understanding the consequences. Additional\n     * documentation is available on the dompdf wiki at:\n     * https://github.com/dompdf/dompdf/wiki\n     *\n     * @var array\n     */\n    private $chroot;\n\n    /**\n     * @var string\n     */\n    private $logOutputFile;\n\n    /**\n     * html target media view which should be rendered into pdf.\n     * List of types and parsing rules for future extensions:\n     * http://www.w3.org/TR/REC-html40/types.html\n     *   screen, tty, tv, projection, handheld, print, braille, aural, all\n     * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3.\n     * Note, even though the generated pdf file is intended for print output,\n     * the desired content might be different (e.g. screen or projection view of html file).\n     * Therefore allow specification of content here.\n     *\n     * @var string\n     */\n    private $defaultMediaType = \"screen\";\n\n    /**\n     * The default paper size.\n     *\n     * North America standard is \"letter\"; other countries generally \"a4\"\n     * @see \\Dompdf\\Adapter\\CPDF::PAPER_SIZES for valid sizes\n     *\n     * @var string\n     */\n    private $defaultPaperSize = \"letter\";\n\n    /**\n     * The default paper orientation.\n     *\n     * The orientation of the page (portrait or landscape).\n     *\n     * @var string\n     */\n    private $defaultPaperOrientation = \"portrait\";\n\n    /**\n     * The default font family\n     *\n     * Used if no suitable fonts can be found. This must exist in the font folder.\n     *\n     * @var string\n     */\n    private $defaultFont = \"serif\";\n\n    /**\n     * Image DPI setting\n     *\n     * This setting determines the default DPI setting for images and fonts.  The\n     * DPI may be overridden for inline images by explicitly setting the\n     * image's width & height style attributes (i.e. if the image's native\n     * width is 600 pixels and you specify the image's width as 72 points,\n     * the image will have a DPI of 600 in the rendered PDF.  The DPI of\n     * background images can not be overridden and is controlled entirely\n     * via this parameter.\n     *\n     * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI).\n     * If a size in html is given as px (or without unit as image size),\n     * this tells the corresponding size in pt at 72 DPI.\n     * This adjusts the relative sizes to be similar to the rendering of the\n     * html page in a reference browser.\n     *\n     * In pdf, always 1 pt = 1/72 inch\n     *\n     * @var int\n     */\n    private $dpi = 96;\n\n    /**\n     * A ratio applied to the fonts height to be more like browsers' line height\n     *\n     * @var float\n     */\n    private $fontHeightRatio = 1.1;\n\n    /**\n     * Enable embedded PHP\n     *\n     * If this setting is set to true then DOMPDF will automatically evaluate\n     * embedded PHP contained within <script type=\"text/php\"> ... </script> tags.\n     *\n     * ==== IMPORTANT ====\n     * Enabling this for documents you do not trust (e.g. arbitrary remote html\n     * pages) is a security risk. Embedded scripts are run with the same level of\n     * system access available to dompdf. Set this option to false (recommended)\n     * if you wish to process untrusted documents.\n     *\n     * This setting may increase the risk of system exploit. Do not change\n     * this settings without understanding the consequences. Additional\n     * documentation is available on the dompdf wiki at:\n     * https://github.com/dompdf/dompdf/wiki\n     *\n     * @var bool\n     */\n    private $isPhpEnabled = false;\n\n    /**\n     * Enable remote file access\n     *\n     * If this setting is set to true, DOMPDF will access remote sites for\n     * images and CSS files as required.\n     *\n     * ==== IMPORTANT ====\n     * This can be a security risk, in particular in combination with isPhpEnabled and\n     * allowing remote html code to be passed to $dompdf = new DOMPDF(); $dompdf->load_html(...);\n     * This allows anonymous users to download legally doubtful internet content which on\n     * tracing back appears to being downloaded by your server, or allows malicious php code\n     * in remote html pages to be executed by your server with your account privileges.\n     *\n     * This setting may increase the risk of system exploit. Do not change\n     * this settings without understanding the consequences. Additional\n     * documentation is available on the dompdf wiki at:\n     * https://github.com/dompdf/dompdf/wiki\n     *\n     * @var bool\n     */\n    private $isRemoteEnabled = false;\n\n    /**\n     * Enable inline Javascript\n     *\n     * If this setting is set to true then DOMPDF will automatically insert\n     * JavaScript code contained within <script type=\"text/javascript\"> ... </script> tags.\n     *\n     * @var bool\n     */\n    private $isJavascriptEnabled = true;\n\n    /**\n     * Use the more-than-experimental HTML5 Lib parser\n     *\n     * @var bool\n     */\n    private $isHtml5ParserEnabled = false;\n\n    /**\n     * Whether to enable font subsetting or not.\n     *\n     * @var bool\n     */\n    private $isFontSubsettingEnabled = true;\n\n    /**\n     * @var bool\n     */\n    private $debugPng = false;\n\n    /**\n     * @var bool\n     */\n    private $debugKeepTemp = false;\n\n    /**\n     * @var bool\n     */\n    private $debugCss = false;\n\n    /**\n     * @var bool\n     */\n    private $debugLayout = false;\n\n    /**\n     * @var bool\n     */\n    private $debugLayoutLines = true;\n\n    /**\n     * @var bool\n     */\n    private $debugLayoutBlocks = true;\n\n    /**\n     * @var bool\n     */\n    private $debugLayoutInline = true;\n\n    /**\n     * @var bool\n     */\n    private $debugLayoutPaddingBox = true;\n\n    /**\n     * The PDF rendering backend to use\n     *\n     * Valid settings are 'PDFLib', 'CPDF', 'GD', and 'auto'. 'auto' will\n     * look for PDFLib and use it if found, or if not it will fall back on\n     * CPDF. 'GD' renders PDFs to graphic files. {@link Dompdf\\CanvasFactory}\n     * ultimately determines which rendering class to instantiate\n     * based on this setting.\n     *\n     * @var string\n     */\n    private $pdfBackend = \"CPDF\";\n\n    /**\n     * PDFlib license key\n     *\n     * If you are using a licensed, commercial version of PDFlib, specify\n     * your license key here.  If you are using PDFlib-Lite or are evaluating\n     * the commercial version of PDFlib, comment out this setting.\n     *\n     * @link http://www.pdflib.com\n     *\n     * If pdflib present in web server and auto or selected explicitly above,\n     * a real license code must exist!\n     *\n     * @var string\n     */\n    private $pdflibLicense = \"\";\n\n    /**\n     * @param array $attributes\n     */\n    public function __construct(array $attributes = null)\n    {\n        $rootDir = realpath(__DIR__ . \"/../\");\n        $this->setChroot(array($rootDir));\n        $this->setRootDir($rootDir);\n        $this->setTempDir(sys_get_temp_dir());\n        $this->setFontDir($rootDir . \"/lib/fonts\");\n        $this->setFontCache($this->getFontDir());\n        $this->setLogOutputFile($this->getTempDir() . \"/log.htm\");\n\n        if (null !== $attributes) {\n            $this->set($attributes);\n        }\n    }\n\n    /**\n     * @param array|string $attributes\n     * @param null|mixed $value\n     * @return $this\n     */\n    public function set($attributes, $value = null)\n    {\n        if (!is_array($attributes)) {\n            $attributes = [$attributes => $value];\n        }\n        foreach ($attributes as $key => $value) {\n            if ($key === 'tempDir' || $key === 'temp_dir') {\n                $this->setTempDir($value);\n            } elseif ($key === 'fontDir' || $key === 'font_dir') {\n                $this->setFontDir($value);\n            } elseif ($key === 'fontCache' || $key === 'font_cache') {\n                $this->setFontCache($value);\n            } elseif ($key === 'chroot') {\n                $this->setChroot($value);\n            } elseif ($key === 'logOutputFile' || $key === 'log_output_file') {\n                $this->setLogOutputFile($value);\n            } elseif ($key === 'defaultMediaType' || $key === 'default_media_type') {\n                $this->setDefaultMediaType($value);\n            } elseif ($key === 'defaultPaperSize' || $key === 'default_paper_size') {\n                $this->setDefaultPaperSize($value);\n            } elseif ($key === 'defaultPaperOrientation' || $key === 'default_paper_orientation') {\n                $this->setDefaultPaperOrientation($value);\n            } elseif ($key === 'defaultFont' || $key === 'default_font') {\n                $this->setDefaultFont($value);\n            } elseif ($key === 'dpi') {\n                $this->setDpi($value);\n            } elseif ($key === 'fontHeightRatio' || $key === 'font_height_ratio') {\n                $this->setFontHeightRatio($value);\n            } elseif ($key === 'isPhpEnabled' || $key === 'is_php_enabled' || $key === 'enable_php') {\n                $this->setIsPhpEnabled($value);\n            } elseif ($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') {\n                $this->setIsRemoteEnabled($value);\n            } elseif ($key === 'isJavascriptEnabled' || $key === 'is_javascript_enabled' || $key === 'enable_javascript') {\n                $this->setIsJavascriptEnabled($value);\n            } elseif ($key === 'isHtml5ParserEnabled' || $key === 'is_html5_parser_enabled' || $key === 'enable_html5_parser') {\n                $this->setIsHtml5ParserEnabled($value);\n            } elseif ($key === 'isFontSubsettingEnabled' || $key === 'is_font_subsetting_enabled' || $key === 'enable_font_subsetting') {\n                $this->setIsFontSubsettingEnabled($value);\n            } elseif ($key === 'debugPng' || $key === 'debug_png') {\n                $this->setDebugPng($value);\n            } elseif ($key === 'debugKeepTemp' || $key === 'debug_keep_temp') {\n                $this->setDebugKeepTemp($value);\n            } elseif ($key === 'debugCss' || $key === 'debug_css') {\n                $this->setDebugCss($value);\n            } elseif ($key === 'debugLayout' || $key === 'debug_layout') {\n                $this->setDebugLayout($value);\n            } elseif ($key === 'debugLayoutLines' || $key === 'debug_layout_lines') {\n                $this->setDebugLayoutLines($value);\n            } elseif ($key === 'debugLayoutBlocks' || $key === 'debug_layout_blocks') {\n                $this->setDebugLayoutBlocks($value);\n            } elseif ($key === 'debugLayoutInline' || $key === 'debug_layout_inline') {\n                $this->setDebugLayoutInline($value);\n            } elseif ($key === 'debugLayoutPaddingBox' || $key === 'debug_layout_padding_box') {\n                $this->setDebugLayoutPaddingBox($value);\n            } elseif ($key === 'pdfBackend' || $key === 'pdf_backend') {\n                $this->setPdfBackend($value);\n            } elseif ($key === 'pdflibLicense' || $key === 'pdflib_license') {\n                $this->setPdflibLicense($value);\n            }\n        }\n        return $this;\n    }\n\n    /**\n     * @param string $key\n     * @return mixed\n     */\n    public function get($key)\n    {\n        if ($key === 'tempDir' || $key === 'temp_dir') {\n            return $this->getTempDir();\n        } elseif ($key === 'fontDir' || $key === 'font_dir') {\n            return $this->getFontDir();\n        } elseif ($key === 'fontCache' || $key === 'font_cache') {\n            return $this->getFontCache();\n        } elseif ($key === 'chroot') {\n            return $this->getChroot();\n        } elseif ($key === 'logOutputFile' || $key === 'log_output_file') {\n            return $this->getLogOutputFile();\n        } elseif ($key === 'defaultMediaType' || $key === 'default_media_type') {\n            return $this->getDefaultMediaType();\n        } elseif ($key === 'defaultPaperSize' || $key === 'default_paper_size') {\n            return $this->getDefaultPaperSize();\n        } elseif ($key === 'defaultPaperOrientation' || $key === 'default_paper_orientation') {\n            return $this->getDefaultPaperOrientation();\n        } elseif ($key === 'defaultFont' || $key === 'default_font') {\n            return $this->getDefaultFont();\n        } elseif ($key === 'dpi') {\n            return $this->getDpi();\n        } elseif ($key === 'fontHeightRatio' || $key === 'font_height_ratio') {\n            return $this->getFontHeightRatio();\n        } elseif ($key === 'isPhpEnabled' || $key === 'is_php_enabled' || $key === 'enable_php') {\n            return $this->getIsPhpEnabled();\n        } elseif ($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') {\n            return $this->getIsRemoteEnabled();\n        } elseif ($key === 'isJavascriptEnabled' || $key === 'is_javascript_enabled' || $key === 'enable_javascript') {\n            return $this->getIsJavascriptEnabled();\n        } elseif ($key === 'isHtml5ParserEnabled' || $key === 'is_html5_parser_enabled' || $key === 'enable_html5_parser') {\n            return $this->getIsHtml5ParserEnabled();\n        } elseif ($key === 'isFontSubsettingEnabled' || $key === 'is_font_subsetting_enabled' || $key === 'enable_font_subsetting') {\n            return $this->getIsFontSubsettingEnabled();\n        } elseif ($key === 'debugPng' || $key === 'debug_png') {\n            return $this->getDebugPng();\n        } elseif ($key === 'debugKeepTemp' || $key === 'debug_keep_temp') {\n            return $this->getDebugKeepTemp();\n        } elseif ($key === 'debugCss' || $key === 'debug_css') {\n            return $this->getDebugCss();\n        } elseif ($key === 'debugLayout' || $key === 'debug_layout') {\n            return $this->getDebugLayout();\n        } elseif ($key === 'debugLayoutLines' || $key === 'debug_layout_lines') {\n            return $this->getDebugLayoutLines();\n        } elseif ($key === 'debugLayoutBlocks' || $key === 'debug_layout_blocks') {\n            return $this->getDebugLayoutBlocks();\n        } elseif ($key === 'debugLayoutInline' || $key === 'debug_layout_inline') {\n            return $this->getDebugLayoutInline();\n        } elseif ($key === 'debugLayoutPaddingBox' || $key === 'debug_layout_padding_box') {\n            return $this->getDebugLayoutPaddingBox();\n        } elseif ($key === 'pdfBackend' || $key === 'pdf_backend') {\n            return $this->getPdfBackend();\n        } elseif ($key === 'pdflibLicense' || $key === 'pdflib_license') {\n            return $this->getPdflibLicense();\n        }\n        return null;\n    }\n\n    /**\n     * @param string $pdfBackend\n     * @return $this\n     */\n    public function setPdfBackend($pdfBackend)\n    {\n        $this->pdfBackend = $pdfBackend;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getPdfBackend()\n    {\n        return $this->pdfBackend;\n    }\n\n    /**\n     * @param string $pdflibLicense\n     * @return $this\n     */\n    public function setPdflibLicense($pdflibLicense)\n    {\n        $this->pdflibLicense = $pdflibLicense;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getPdflibLicense()\n    {\n        return $this->pdflibLicense;\n    }\n\n    /**\n     * @param array|string $chroot\n     * @return $this\n     */\n    public function setChroot($chroot, $delimiter = ',')\n    {\n        if (is_string($chroot)) {\n            $this->chroot = explode($delimiter, $chroot);\n        } elseif (is_array($chroot)) {\n            $this->chroot = $chroot;\n        }\n        return $this;\n    }\n\n    /**\n     * @return array\n     */\n    public function getChroot()\n    {\n        $chroot = [];\n        if (is_array($this->chroot)) {\n            $chroot = $this->chroot;\n        }\n        return $chroot;\n    }\n\n    /**\n     * @param boolean $debugCss\n     * @return $this\n     */\n    public function setDebugCss($debugCss)\n    {\n        $this->debugCss = $debugCss;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugCss()\n    {\n        return $this->debugCss;\n    }\n\n    /**\n     * @param boolean $debugKeepTemp\n     * @return $this\n     */\n    public function setDebugKeepTemp($debugKeepTemp)\n    {\n        $this->debugKeepTemp = $debugKeepTemp;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugKeepTemp()\n    {\n        return $this->debugKeepTemp;\n    }\n\n    /**\n     * @param boolean $debugLayout\n     * @return $this\n     */\n    public function setDebugLayout($debugLayout)\n    {\n        $this->debugLayout = $debugLayout;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugLayout()\n    {\n        return $this->debugLayout;\n    }\n\n    /**\n     * @param boolean $debugLayoutBlocks\n     * @return $this\n     */\n    public function setDebugLayoutBlocks($debugLayoutBlocks)\n    {\n        $this->debugLayoutBlocks = $debugLayoutBlocks;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugLayoutBlocks()\n    {\n        return $this->debugLayoutBlocks;\n    }\n\n    /**\n     * @param boolean $debugLayoutInline\n     * @return $this\n     */\n    public function setDebugLayoutInline($debugLayoutInline)\n    {\n        $this->debugLayoutInline = $debugLayoutInline;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugLayoutInline()\n    {\n        return $this->debugLayoutInline;\n    }\n\n    /**\n     * @param boolean $debugLayoutLines\n     * @return $this\n     */\n    public function setDebugLayoutLines($debugLayoutLines)\n    {\n        $this->debugLayoutLines = $debugLayoutLines;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugLayoutLines()\n    {\n        return $this->debugLayoutLines;\n    }\n\n    /**\n     * @param boolean $debugLayoutPaddingBox\n     * @return $this\n     */\n    public function setDebugLayoutPaddingBox($debugLayoutPaddingBox)\n    {\n        $this->debugLayoutPaddingBox = $debugLayoutPaddingBox;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugLayoutPaddingBox()\n    {\n        return $this->debugLayoutPaddingBox;\n    }\n\n    /**\n     * @param boolean $debugPng\n     * @return $this\n     */\n    public function setDebugPng($debugPng)\n    {\n        $this->debugPng = $debugPng;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getDebugPng()\n    {\n        return $this->debugPng;\n    }\n\n    /**\n     * @param string $defaultFont\n     * @return $this\n     */\n    public function setDefaultFont($defaultFont)\n    {\n        $this->defaultFont = $defaultFont;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getDefaultFont()\n    {\n        return $this->defaultFont;\n    }\n\n    /**\n     * @param string $defaultMediaType\n     * @return $this\n     */\n    public function setDefaultMediaType($defaultMediaType)\n    {\n        $this->defaultMediaType = $defaultMediaType;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getDefaultMediaType()\n    {\n        return $this->defaultMediaType;\n    }\n\n    /**\n     * @param string $defaultPaperSize\n     * @return $this\n     */\n    public function setDefaultPaperSize($defaultPaperSize)\n    {\n        $this->defaultPaperSize = $defaultPaperSize;\n        return $this;\n    }\n\n    /**\n     * @param string $defaultPaperOrientation\n     * @return $this\n     */\n    public function setDefaultPaperOrientation($defaultPaperOrientation)\n    {\n        $this->defaultPaperOrientation = $defaultPaperOrientation;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getDefaultPaperSize()\n    {\n        return $this->defaultPaperSize;\n    }\n\n    /**\n     * @return string\n     */\n    public function getDefaultPaperOrientation()\n    {\n        return $this->defaultPaperOrientation;\n    }\n\n    /**\n     * @param int $dpi\n     * @return $this\n     */\n    public function setDpi($dpi)\n    {\n        $this->dpi = $dpi;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function getDpi()\n    {\n        return $this->dpi;\n    }\n\n    /**\n     * @param string $fontCache\n     * @return $this\n     */\n    public function setFontCache($fontCache)\n    {\n        $this->fontCache = $fontCache;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getFontCache()\n    {\n        return $this->fontCache;\n    }\n\n    /**\n     * @param string $fontDir\n     * @return $this\n     */\n    public function setFontDir($fontDir)\n    {\n        $this->fontDir = $fontDir;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getFontDir()\n    {\n        return $this->fontDir;\n    }\n\n    /**\n     * @param float $fontHeightRatio\n     * @return $this\n     */\n    public function setFontHeightRatio($fontHeightRatio)\n    {\n        $this->fontHeightRatio = $fontHeightRatio;\n        return $this;\n    }\n\n    /**\n     * @return float\n     */\n    public function getFontHeightRatio()\n    {\n        return $this->fontHeightRatio;\n    }\n\n    /**\n     * @param boolean $isFontSubsettingEnabled\n     * @return $this\n     */\n    public function setIsFontSubsettingEnabled($isFontSubsettingEnabled)\n    {\n        $this->isFontSubsettingEnabled = $isFontSubsettingEnabled;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getIsFontSubsettingEnabled()\n    {\n        return $this->isFontSubsettingEnabled;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isFontSubsettingEnabled()\n    {\n        return $this->getIsFontSubsettingEnabled();\n    }\n\n    /**\n     * @param boolean $isHtml5ParserEnabled\n     * @return $this\n     */\n    public function setIsHtml5ParserEnabled($isHtml5ParserEnabled)\n    {\n        $this->isHtml5ParserEnabled = $isHtml5ParserEnabled;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getIsHtml5ParserEnabled()\n    {\n        return $this->isHtml5ParserEnabled;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isHtml5ParserEnabled()\n    {\n        return $this->getIsHtml5ParserEnabled();\n    }\n\n    /**\n     * @param boolean $isJavascriptEnabled\n     * @return $this\n     */\n    public function setIsJavascriptEnabled($isJavascriptEnabled)\n    {\n        $this->isJavascriptEnabled = $isJavascriptEnabled;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getIsJavascriptEnabled()\n    {\n        return $this->isJavascriptEnabled;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isJavascriptEnabled()\n    {\n        return $this->getIsJavascriptEnabled();\n    }\n\n    /**\n     * @param boolean $isPhpEnabled\n     * @return $this\n     */\n    public function setIsPhpEnabled($isPhpEnabled)\n    {\n        $this->isPhpEnabled = $isPhpEnabled;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getIsPhpEnabled()\n    {\n        return $this->isPhpEnabled;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isPhpEnabled()\n    {\n        return $this->getIsPhpEnabled();\n    }\n\n    /**\n     * @param boolean $isRemoteEnabled\n     * @return $this\n     */\n    public function setIsRemoteEnabled($isRemoteEnabled)\n    {\n        $this->isRemoteEnabled = $isRemoteEnabled;\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function getIsRemoteEnabled()\n    {\n        return $this->isRemoteEnabled;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isRemoteEnabled()\n    {\n        return $this->getIsRemoteEnabled();\n    }\n\n    /**\n     * @param string $logOutputFile\n     * @return $this\n     */\n    public function setLogOutputFile($logOutputFile)\n    {\n        $this->logOutputFile = $logOutputFile;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getLogOutputFile()\n    {\n        return $this->logOutputFile;\n    }\n\n    /**\n     * @param string $tempDir\n     * @return $this\n     */\n    public function setTempDir($tempDir)\n    {\n        $this->tempDir = $tempDir;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getTempDir()\n    {\n        return $this->tempDir;\n    }\n\n    /**\n     * @param string $rootDir\n     * @return $this\n     */\n    public function setRootDir($rootDir)\n    {\n        $this->rootDir = $rootDir;\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getRootDir()\n    {\n        return $this->rootDir;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/PhpEvaluator.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\n/**\n * Executes inline PHP code during the rendering process\n *\n * @package dompdf\n */\nclass PhpEvaluator\n{\n\n    /**\n     * @var Canvas\n     */\n    protected $_canvas;\n\n    /**\n     * PhpEvaluator constructor.\n     * @param Canvas $canvas\n     */\n    public function __construct(Canvas $canvas)\n    {\n        $this->_canvas = $canvas;\n    }\n\n    /**\n     * @param $code\n     * @param array $vars\n     */\n    public function evaluate($code, $vars = [])\n    {\n        if (!$this->_canvas->get_dompdf()->getOptions()->getIsPhpEnabled()) {\n            return;\n        }\n\n        // Set up some variables for the inline code\n        $pdf = $this->_canvas;\n        $fontMetrics = $pdf->get_dompdf()->getFontMetrics();\n        $PAGE_NUM = $pdf->get_page_number();\n        $PAGE_COUNT = $pdf->get_page_count();\n\n        // Override those variables if passed in\n        foreach ($vars as $k => $v) {\n            $$k = $v;\n        }\n\n        eval($code);\n    }\n\n    /**\n     * @param Frame $frame\n     */\n    public function render(Frame $frame)\n    {\n        $this->evaluate($frame->get_node()->nodeValue);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/Absolute.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\nuse Dompdf\\FrameReflower\\Block;\n\n/**\n * Positions absolutely positioned frames\n */\nclass Absolute extends AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n        if ($frame->get_reflower() instanceof Block) {\n            $style = $frame->get_style();\n            [$cbx, $cby, $cbw, $cbh] = $frame->get_containing_block();\n\n            // If the `top` value is `auto`, the frame will be repositioned\n            // after its height has been resolved\n            $left = (float) $style->length_in_pt($style->left, $cbw);\n            $top = (float) $style->length_in_pt($style->top, $cbh);\n\n            $frame->set_position($cbx + $left, $cby + $top);\n        } else {\n            // Legacy positioning logic for image and table frames\n            // TODO: Resolve dimensions, margins, and offsets similar to the\n            // block case in the reflowers and use the simplified logic above\n            $style = $frame->get_style();\n            $block_parent = $frame->find_block_parent();\n            $current_line = $block_parent->get_current_line_box();\n    \n            list($x, $y, $w, $h) = $frame->get_containing_block();\n            $inflow_x = $block_parent->get_content_box()[\"x\"] + $current_line->left + $current_line->w;\n            $inflow_y = $current_line->y;\n\n            $top = $style->length_in_pt($style->top, $h);\n            $right = $style->length_in_pt($style->right, $w);\n            $bottom = $style->length_in_pt($style->bottom, $h);\n            $left = $style->length_in_pt($style->left, $w);\n\n            list($width, $height) = [$frame->get_margin_width(), $frame->get_margin_height()];\n\n            $orig_style = $frame->get_original_style();\n            $orig_width = $orig_style->width;\n            $orig_height = $orig_style->height;\n\n            /****************************\n             *\n             * Width auto:\n             * ____________| left=auto | left=fixed |\n             * right=auto  |     A     |     B      |\n             * right=fixed |     C     |     D      |\n             *\n             * Width fixed:\n             * ____________| left=auto | left=fixed |\n             * right=auto  |     E     |     F      |\n             * right=fixed |     G     |     H      |\n             *****************************/\n\n            if ($left === \"auto\") {\n                if ($right === \"auto\") {\n                    // A or E - Keep the frame at the same position\n                    $x = $inflow_x;\n                } else {\n                    if ($orig_width === \"auto\") {\n                        // C\n                        $x += $w - $width - $right;\n                    } else {\n                        // G\n                        $x += $w - $width - $right;\n                    }\n                }\n            } else {\n                if ($right === \"auto\") {\n                    // B or F\n                    $x += (float)$left;\n                } else {\n                    if ($orig_width === \"auto\") {\n                        // D - TODO change width\n                        $x += (float)$left;\n                    } else {\n                        // H - Everything is fixed: left + width win\n                        $x += (float)$left;\n                    }\n                }\n            }\n\n            // The same vertically\n            if ($top === \"auto\") {\n                if ($bottom === \"auto\") {\n                    // A or E - Keep the frame at the same position\n                    $y = $inflow_y;\n                } else {\n                    if ($orig_height === \"auto\") {\n                        // C\n                        $y += (float)$h - $height - (float)$bottom;\n                    } else {\n                        // G\n                        $y += (float)$h - $height - (float)$bottom;\n                    }\n                }\n            } else {\n                if ($bottom === \"auto\") {\n                    // B or F\n                    $y += (float)$top;\n                } else {\n                    if ($orig_height === \"auto\") {\n                        // D - TODO change height\n                        $y += (float)$top;\n                    } else {\n                        // H - Everything is fixed: top + height win\n                        $y += (float)$top;\n                    }\n                }\n            }\n\n            $frame->set_position($x, $y);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/AbstractPositioner.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\n\n/**\n * Base AbstractPositioner class\n *\n * Defines postioner interface\n *\n * @access  private\n * @package dompdf\n */\nabstract class AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     * @return mixed\n     */\n    abstract function position(AbstractFrameDecorator $frame);\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     * @param float $offset_x\n     * @param float $offset_y\n     * @param bool $ignore_self\n     */\n    function move(AbstractFrameDecorator $frame, $offset_x, $offset_y, $ignore_self = false)\n    {\n        list($x, $y) = $frame->get_position();\n\n        if (!$ignore_self) {\n            $frame->set_position($x + $offset_x, $y + $offset_y);\n        }\n\n        foreach ($frame->get_children() as $child) {\n            $child->move($offset_x, $offset_y);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/Block.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\n\n/**\n * Positions block frames\n *\n * @access  private\n * @package dompdf\n */\nclass Block extends AbstractPositioner\n{\n\n    function position(AbstractFrameDecorator $frame)\n    {\n        $style = $frame->get_style();\n        $cb = $frame->get_containing_block();\n        $p = $frame->find_block_parent();\n\n        if ($p) {\n            $float = $style->float;\n\n            if (!$float || $float === \"none\") {\n                $p->add_line(true);\n            }\n            $y = $p->get_current_line_box()->y;\n        } else {\n            $y = $cb[\"y\"];\n        }\n\n        $x = $cb[\"x\"];\n\n        $frame->set_position($x, $y);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/Fixed.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\nuse Dompdf\\FrameReflower\\Block;\n\n/**\n * Positions fixely positioned frames\n */\nclass Fixed extends Absolute\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n        if ($frame->get_reflower() instanceof Block) {\n            parent::position($frame);\n        } else {\n            // Legacy positioning logic for image and table frames\n            // TODO: Resolve dimensions, margins, and offsets similar to the\n            // block case in the reflowers and use the simplified logic above\n            $style = $frame->get_original_style();\n            $root = $frame->get_root();\n            $initialcb = $root->get_containing_block();\n            $initialcb_style = $root->get_style();\n\n            $p = $frame->find_block_parent();\n            if ($p) {\n                $p->add_line();\n            }\n            // Compute the margins of the @page style\n            $margin_top = (float)$initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb[\"h\"]);\n            $margin_right = (float)$initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb[\"w\"]);\n            $margin_bottom = (float)$initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb[\"h\"]);\n            $margin_left = (float)$initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb[\"w\"]);\n\n            // The needed computed style of the element\n            $height = (float)$style->length_in_pt($style->height, $initialcb[\"h\"]);\n            $width = (float)$style->length_in_pt($style->width, $initialcb[\"w\"]);\n\n            $top = $style->length_in_pt($style->top, $initialcb[\"h\"]);\n            $right = $style->length_in_pt($style->right, $initialcb[\"w\"]);\n            $bottom = $style->length_in_pt($style->bottom, $initialcb[\"h\"]);\n            $left = $style->length_in_pt($style->left, $initialcb[\"w\"]);\n\n            $y = $margin_top;\n            if (isset($top)) {\n                $y = (float)$top + $margin_top;\n                if ($top === \"auto\") {\n                    $y = $margin_top;\n                    if (isset($bottom) && $bottom !== \"auto\") {\n                        $y = $initialcb[\"h\"] - $bottom - $margin_bottom;\n                        if ($frame->is_auto_height()) {\n                            $y -= $height;\n                        } else {\n                            $y -= $frame->get_margin_height();\n                        }\n                    }\n                }\n            }\n\n            $x = $margin_left;\n            if (isset($left)) {\n                $x = (float)$left + $margin_left;\n                if ($left === \"auto\") {\n                    $x = $margin_left;\n                    if (isset($right) && $right !== \"auto\") {\n                        $x = $initialcb[\"w\"] - $right - $margin_right;\n                        if ($frame->is_auto_width()) {\n                            $x -= $width;\n                        } else {\n                            $x -= $frame->get_margin_width();\n                        }\n                    }\n                }\n            }\n\n            $frame->set_position($x, $y);\n\n            $children = $frame->get_children();\n            foreach ($children as $child) {\n                $child->set_position($x, $y);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/Inline.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\nuse Dompdf\\FrameReflower\\Inline as InlineFrameReflower;\nuse Dompdf\\Exception;\n\n/**\n * Positions inline frames\n *\n * @package dompdf\n */\nclass Inline extends AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     * @throws Exception\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n        // Find our nearest block level parent and access its lines property\n        $p = $frame->find_block_parent();\n\n        // Debugging code:\n\n        // Helpers::pre_r(\"\\nPositioning:\");\n        // Helpers::pre_r(\"Me: \" . $frame->get_node()->nodeName . \" (\" . spl_object_hash($frame->get_node()) . \")\");\n        // Helpers::pre_r(\"Parent: \" . $p->get_node()->nodeName . \" (\" . spl_object_hash($p->get_node()) . \")\");\n\n        // End debugging\n\n        if (!$p) {\n            throw new Exception(\"No block-level parent found.  Not good.\");\n        }\n\n        $cb = $frame->get_containing_block();\n        $line = $p->get_current_line_box();\n\n        if ($frame->is_text_node() || $frame->get_node()->nodeName === \"br\") {\n            $frame->set_position($cb[\"x\"] + $line->w, $line->y);\n            return;\n        }\n\n        $reflower = $frame->get_reflower();\n\n        if ($reflower instanceof InlineFrameReflower) {\n            [$min] = $reflower->get_min_first_line_width();\n\n            // If no parts of the inline frame fit in the current line, it\n            // should break to a new line\n            if ($min > ($cb[\"w\"] - $line->left - $line->w - $line->right)) {\n                $p->add_line();\n                $line = $p->get_current_line_box();\n            }\n        } else {\n            // Atomic inline boxes and replaced inline elements\n            // (inline-block, inline-table, img etc.)\n            $width = $frame->get_margin_width();\n\n            if ($width > ($cb[\"w\"] - $line->left - $line->w - $line->right)) {\n                $p->add_line();\n                $line = $p->get_current_line_box();\n            }\n        }\n\n        $frame->set_position($cb[\"x\"] + $line->w, $line->y);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/ListBullet.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\n\n/**\n * Positions list bullets\n *\n * @package dompdf\n */\nclass ListBullet extends AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n\n        // Bullets & friends are positioned an absolute distance to the left of\n        // the content edge of their parent element\n        $cb = $frame->get_containing_block();\n\n        // Note: this differs from most frames in that we must position\n        // ourselves after determining our width\n        $x = $cb[\"x\"] - $frame->get_width();\n\n        $p = $frame->find_block_parent();\n\n        $y = $p->get_current_line_box()->y;\n\n        // This is a bit of a hack...\n        $n = $frame->get_next_sibling();\n        if ($n) {\n            $style = $n->get_style();\n            $line_height = $style->line_height;\n            // TODO: should offset take into account the line height of the next sibling (per previous logic)?\n            // $offset = (float)$style->length_in_pt($line_height, $n->get_containing_block(\"h\")) - $frame->get_height();\n            $offset = $line_height - $frame->get_height();\n            $y += $offset / 2;\n        }\n\n        // Now the position is the left top of the block which should be marked with the bullet.\n        // We tried to find out the y of the start of the first text character within the block.\n        // But the top margin/padding does not fit, neither from this nor from the next sibling\n        // The \"bit of a hack\" above does not work also.\n\n        // Instead let's position the bullet vertically centered to the block which should be marked.\n        // But for get_next_sibling() the get_containing_block is all zero, and for find_block_parent()\n        // the get_containing_block is paper width and the entire list as height.\n\n        // if ($p) {\n        //   //$cb = $n->get_containing_block();\n        //   $cb = $p->get_containing_block();\n        //   $y += $cb[\"h\"]/2;\n        // print 'cb:'.$cb[\"x\"].':'.$cb[\"y\"].':'.$cb[\"w\"].':'.$cb[\"h\"].':';\n        // }\n\n        // Todo:\n        // For now give up on the above. Use Guesswork with font y-pos in the middle of the line spacing\n\n        /*$style = $p->get_style();\n        $font_size = $style->font_size;\n        $line_height = (float)$style->length_in_pt($style->line_height, $font_size);\n        $y += ($line_height - $font_size) / 2;    */\n\n        //Position is x-end y-top of character position of the bullet.\n        $frame->set_position($x, $y);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/NullPositioner.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\n\n/**\n * Dummy positioner\n *\n * @package dompdf\n */\nclass NullPositioner extends AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n        return;\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/TableCell.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\nuse Dompdf\\FrameDecorator\\Table;\n\n/**\n * Positions table cells\n *\n * @package dompdf\n */\nclass TableCell extends AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n        $table = Table::find_parent_table($frame);\n        $cellmap = $table->get_cellmap();\n        $frame->set_position($cellmap->get_frame_position($frame));\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Positioner/TableRow.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\n\nnamespace Dompdf\\Positioner;\n\nuse Dompdf\\FrameDecorator\\AbstractFrameDecorator;\n\n/**\n * Positions table rows\n *\n * @package dompdf\n */\nclass TableRow extends AbstractPositioner\n{\n\n    /**\n     * @param AbstractFrameDecorator $frame\n     */\n    function position(AbstractFrameDecorator $frame)\n    {\n        $cb = $frame->get_containing_block();\n        $p = $frame->get_prev_sibling();\n\n        if ($p) {\n            $y = $p->get_position(\"y\") + $p->get_margin_height();\n        } else {\n            $y = $cb[\"y\"];\n        }\n        $frame->set_position($cb[\"x\"], $y);\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/AbstractRenderer.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Adapter\\CPDF;\nuse Dompdf\\Css\\Color;\nuse Dompdf\\Css\\Style;\nuse Dompdf\\Dompdf;\nuse Dompdf\\Helpers;\nuse Dompdf\\Frame;\nuse Dompdf\\Image\\Cache;\n\n/**\n * Base renderer class\n *\n * @package dompdf\n */\nabstract class AbstractRenderer\n{\n\n    /**\n     * Rendering backend\n     *\n     * @var \\Dompdf\\Canvas\n     */\n    protected $_canvas;\n\n    /**\n     * Current dompdf instance\n     *\n     * @var Dompdf\n     */\n    protected $_dompdf;\n\n    /**\n     * Class constructor\n     *\n     * @param Dompdf $dompdf The current dompdf instance\n     */\n    function __construct(Dompdf $dompdf)\n    {\n        $this->_dompdf = $dompdf;\n        $this->_canvas = $dompdf->getCanvas();\n    }\n\n    /**\n     * Render a frame.\n     *\n     * Specialized in child classes\n     *\n     * @param Frame $frame The frame to render\n     */\n    abstract function render(Frame $frame);\n\n    /**\n     * Render a background image over a rectangular area\n     *\n     * @param string $url   The background image to load\n     * @param float $x      The left edge of the rectangular area\n     * @param float $y      The top edge of the rectangular area\n     * @param float $width  The width of the rectangular area\n     * @param float $height The height of the rectangular area\n     * @param Style $style  The associated Style object\n     *\n     * @throws \\Exception\n     */\n    protected function _background_image($url, $x, $y, $width, $height, $style)\n    {\n        if (!function_exists(\"imagecreatetruecolor\")) {\n            throw new \\Exception(\"The PHP GD extension is required, but is not installed.\");\n        }\n\n        $sheet = $style->get_stylesheet();\n\n        // Skip degenerate cases\n        if ($width == 0 || $height == 0) {\n            return;\n        }\n\n        $box_width = $width;\n        $box_height = $height;\n\n        //debugpng\n        if ($this->_dompdf->getOptions()->getDebugPng()) {\n            print '[_background_image ' . $url . ']';\n        }\n\n        list($img, $type, /*$msg*/) = Cache::resolve_url(\n            $url,\n            $sheet->get_protocol(),\n            $sheet->get_host(),\n            $sheet->get_base_path(),\n            $this->_dompdf\n        );\n\n        // Bail if the image is no good\n        if (Cache::is_broken($img)) {\n            return;\n        }\n\n        //Try to optimize away reading and composing of same background multiple times\n        //Postponing read with imagecreatefrom   ...()\n        //final composition parameters and name not known yet\n        //Therefore read dimension directly from file, instead of creating gd object first.\n        //$img_w = imagesx($src); $img_h = imagesy($src);\n\n        list($img_w, $img_h) = Helpers::dompdf_getimagesize($img, $this->_dompdf->getHttpContext());\n        if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) {\n            return;\n        }\n\n        // save for later check if file needs to be resized.\n        $org_img_w = $img_w;\n        $org_img_h = $img_h;\n\n        $repeat = $style->background_repeat;\n        $dpi = $this->_dompdf->getOptions()->getDpi();\n\n        //Increase background resolution and dependent box size according to image resolution to be placed in\n        //Then image can be copied in without resize\n        $bg_width = round((float)($width * $dpi) / 72);\n        $bg_height = round((float)($height * $dpi) / 72);\n\n        list($img_w, $img_h) = $this->_resize_background_image(\n            $img_w,\n            $img_h,\n            $bg_width,\n            $bg_height,\n            $style->background_size,\n            $dpi\n        );\n        //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel\n\n        list($bg_x, $bg_y) = $style->background_position;\n\n        if (Helpers::is_percent($bg_x)) {\n            // The point $bg_x % from the left edge of the image is placed\n            // $bg_x % from the left edge of the background rectangle\n            $p = ((float)$bg_x) / 100.0;\n            $x1 = $p * $img_w;\n            $x2 = $p * $bg_width;\n\n            $bg_x = $x2 - $x1;\n        } else {\n            $bg_x = (float)($style->length_in_pt($bg_x) * $dpi) / 72;\n        }\n\n        $bg_x = round($bg_x + (float)$style->length_in_pt($style->border_left_width) * $dpi / 72);\n\n        if (Helpers::is_percent($bg_y)) {\n            // The point $bg_y % from the left edge of the image is placed\n            // $bg_y % from the left edge of the background rectangle\n            $p = ((float)$bg_y) / 100.0;\n            $y1 = $p * $img_h;\n            $y2 = $p * $bg_height;\n\n            $bg_y = $y2 - $y1;\n        } else {\n            $bg_y = (float)($style->length_in_pt($bg_y) * $dpi) / 72;\n        }\n\n        $bg_y = round($bg_y + (float)$style->length_in_pt($style->border_top_width) * $dpi / 72);\n\n        //clip background to the image area on partial repeat. Nothing to do if img off area\n        //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area\n        //On no repeat with positive offset: move size/start to have offset==0\n        //Handle x/y Dimensions separately\n\n        if ($repeat !== \"repeat\" && $repeat !== \"repeat-x\") {\n            //No repeat x\n            if ($bg_x < 0) {\n                $bg_width = $img_w + $bg_x;\n            } else {\n                $x += ($bg_x * 72) / $dpi;\n                $bg_width = $bg_width - $bg_x;\n                if ($bg_width > $img_w) {\n                    $bg_width = $img_w;\n                }\n                $bg_x = 0;\n            }\n\n            if ($bg_width <= 0) {\n                return;\n            }\n\n            $width = (float)($bg_width * 72) / $dpi;\n        } else {\n            //repeat x\n            if ($bg_x < 0) {\n                $bg_x = -((-$bg_x) % $img_w);\n            } else {\n                $bg_x = $bg_x % $img_w;\n                if ($bg_x > 0) {\n                    $bg_x -= $img_w;\n                }\n            }\n        }\n\n        if ($repeat !== \"repeat\" && $repeat !== \"repeat-y\") {\n            //no repeat y\n            if ($bg_y < 0) {\n                $bg_height = $img_h + $bg_y;\n            } else {\n                $y += ($bg_y * 72) / $dpi;\n                $bg_height = $bg_height - $bg_y;\n                if ($bg_height > $img_h) {\n                    $bg_height = $img_h;\n                }\n                $bg_y = 0;\n            }\n            if ($bg_height <= 0) {\n                return;\n            }\n            $height = (float)($bg_height * 72) / $dpi;\n        } else {\n            //repeat y\n            if ($bg_y < 0) {\n                $bg_y = -((-$bg_y) % $img_h);\n            } else {\n                $bg_y = $bg_y % $img_h;\n                if ($bg_y > 0) {\n                    $bg_y -= $img_h;\n                }\n            }\n        }\n\n        //Optimization, if repeat has no effect\n        if ($repeat === \"repeat\" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) {\n            $repeat = \"repeat-x\";\n        }\n\n        if ($repeat === \"repeat\" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) {\n            $repeat = \"repeat-y\";\n        }\n\n        if (($repeat === \"repeat-x\" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) ||\n            ($repeat === \"repeat-y\" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height)\n        ) {\n            $repeat = \"no-repeat\";\n        }\n\n        //Use filename as indicator only\n        //different names for different variants to have different copies in the pdf\n        //This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color[\"hex\"] : $bg_color)\n        //Note: Here, bg_* are the start values, not end values after going through the tile loops!\n\n        $filedummy = $img;\n\n        $is_png = false;\n        $filedummy .= '_' . $bg_width . '_' . $bg_height . '_' . $bg_x . '_' . $bg_y . '_' . $repeat;\n\n        //Optimization to avoid multiple times rendering the same image.\n        //If check functions are existing and identical image already cached,\n        //then skip creation of duplicate, because it is not needed by addImagePng\n        if ($this->_canvas instanceof CPDF && $this->_canvas->get_cpdf()->image_iscached($filedummy)) {\n            $bg = null;\n        } else {\n            // Create a new image to fit over the background rectangle\n            $bg = imagecreatetruecolor($bg_width, $bg_height);\n\n            switch (strtolower($type)) {\n                case \"png\":\n                    $is_png = true;\n                    imagesavealpha($bg, true);\n                    imagealphablending($bg, false);\n                    $src = imagecreatefrompng($img);\n                    break;\n\n                case \"jpeg\":\n                    $src = imagecreatefromjpeg($img);\n                    break;\n\n                case \"webp\":\n                    $src = imagecreatefromwebp($img);\n                    break;\n\n                case \"gif\":\n                    $src = imagecreatefromgif($img);\n                    break;\n\n                case \"bmp\":\n                    $src = Helpers::imagecreatefrombmp($img);\n                    break;\n\n                default:\n                    return; // Unsupported image type\n            }\n\n            if ($src == null) {\n                return;\n            }\n\n            if ($img_w != $org_img_w || $img_h != $org_img_h) {\n                $newSrc = imagescale($src, $img_w, $img_h);\n                imagedestroy($src);\n                $src = $newSrc;\n            }\n\n            if ($src == null) {\n                return;\n            }\n\n            //Background color if box is not relevant here\n            //Non transparent image: box clipped to real size. Background non relevant.\n            //Transparent image: The image controls the transparency and lets shine through whatever background.\n            //However on transparent image preset the composed image with the transparency color,\n            //to keep the transparency when copying over the non transparent parts of the tiles.\n            $ti = imagecolortransparent($src);\n            $palletsize = imagecolorstotal($src);\n\n            if ($ti >= 0 && $ti < $palletsize) {\n                $tc = imagecolorsforindex($src, $ti);\n                $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']);\n                imagefill($bg, 0, 0, $ti);\n                imagecolortransparent($bg, $ti);\n            }\n\n            //This has only an effect for the non repeatable dimension.\n            //compute start of src and dest coordinates of the single copy\n            if ($bg_x < 0) {\n                $dst_x = 0;\n                $src_x = -$bg_x;\n            } else {\n                $src_x = 0;\n                $dst_x = $bg_x;\n            }\n\n            if ($bg_y < 0) {\n                $dst_y = 0;\n                $src_y = -$bg_y;\n            } else {\n                $src_y = 0;\n                $dst_y = $bg_y;\n            }\n\n            //For historical reasons exchange meanings of variables:\n            //start_* will be the start values, while bg_* will be the temporary start values in the loops\n            $start_x = $bg_x;\n            $start_y = $bg_y;\n\n            // Copy regions from the source image to the background\n            if ($repeat === \"no-repeat\") {\n                // Simply place the image on the background\n                imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h);\n\n            } else if ($repeat === \"repeat-x\") {\n                for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) {\n                    if ($bg_x < 0) {\n                        $dst_x = 0;\n                        $src_x = -$bg_x;\n                        $w = $img_w + $bg_x;\n                    } else {\n                        $dst_x = $bg_x;\n                        $src_x = 0;\n                        $w = $img_w;\n                    }\n                    imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h);\n                }\n            } else if ($repeat === \"repeat-y\") {\n\n                for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) {\n                    if ($bg_y < 0) {\n                        $dst_y = 0;\n                        $src_y = -$bg_y;\n                        $h = $img_h + $bg_y;\n                    } else {\n                        $dst_y = $bg_y;\n                        $src_y = 0;\n                        $h = $img_h;\n                    }\n                    imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h);\n                }\n            } else if ($repeat === \"repeat\") {\n                for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) {\n                    for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) {\n                        if ($bg_x < 0) {\n                            $dst_x = 0;\n                            $src_x = -$bg_x;\n                            $w = $img_w + $bg_x;\n                        } else {\n                            $dst_x = $bg_x;\n                            $src_x = 0;\n                            $w = $img_w;\n                        }\n\n                        if ($bg_y < 0) {\n                            $dst_y = 0;\n                            $src_y = -$bg_y;\n                            $h = $img_h + $bg_y;\n                        } else {\n                            $dst_y = $bg_y;\n                            $src_y = 0;\n                            $h = $img_h;\n                        }\n                        imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h);\n                    }\n                }\n            } else {\n                print 'Unknown repeat!';\n            }\n\n            imagedestroy($src);\n\n        } /* End optimize away creation of duplicates */\n\n        $this->_canvas->clipping_rectangle($x, $y, $box_width, $box_height);\n\n        //img: image url string\n        //img_w, img_h: original image size in px\n        //width, height: box size in pt\n        //bg_width, bg_height: box size in px\n        //x, y: left/top edge of box on page in pt\n        //start_x, start_y: placement of image relative to pattern\n        //$repeat: repeat mode\n        //$bg: GD object of result image\n        //$src: GD object of original image\n        //When using cpdf and optimization to direct png creation from gd object is available,\n        //don't create temp file, but place gd object directly into the pdf\n        if (!$is_png && $this->_canvas instanceof CPDF) {\n            // Note: CPDF_Adapter image converts y position\n            $this->_canvas->get_cpdf()->addImagePng($bg, $filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height);\n        } else {\n            $tmp_dir = $this->_dompdf->getOptions()->getTempDir();\n            $tmp_name = @tempnam($tmp_dir, \"bg_dompdf_img_\");\n            @unlink($tmp_name);\n            $tmp_file = \"$tmp_name.png\";\n\n            //debugpng\n            if ($this->_dompdf->getOptions()->getDebugPng()) {\n                print '[_background_image ' . $tmp_file . ']';\n            }\n\n            imagepng($bg, $tmp_file);\n            $this->_canvas->image($tmp_file, $x, $y, $width, $height);\n            imagedestroy($bg);\n\n            //debugpng\n            if ($this->_dompdf->getOptions()->getDebugPng()) {\n                print '[_background_image unlink ' . $tmp_file . ']';\n            }\n\n            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {\n                unlink($tmp_file);\n            }\n        }\n\n        $this->_canvas->clipping_end();\n    }\n\n    /**\n     * @param $style\n     * @param $width\n     * @return array\n     */\n    protected function _get_dash_pattern($style, $width)\n    {\n        $pattern = [];\n\n        switch ($style) {\n            default:\n                /*case \"solid\":\n                case \"double\":\n                case \"groove\":\n                case \"inset\":\n                case \"outset\":\n                case \"ridge\":*/\n            case \"none\":\n                break;\n\n            case \"dotted\":\n                if ($width <= 1) {\n                    $pattern = [$width, $width * 2];\n                } else {\n                    $pattern = [$width];\n                }\n                break;\n\n            case \"dashed\":\n                $pattern = [3 * $width];\n                break;\n        }\n\n        return $pattern;\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        return;\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_hidden($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        return;\n    }\n\n    // Border rendering functions\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, \"dotted\", $r1, $r2);\n    }\n\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, \"dashed\", $r1, $r2);\n    }\n\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        // TODO: Solve rendering where one corner is beveled (radius == 0), one corner isn't.\n        if ($corner_style !== \"bevel\" || $r1 > 0 || $r2 > 0) {\n            // do it the simple way\n            $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, \"solid\", $r1, $r2);\n            return;\n        }\n\n        list($top, $right, $bottom, $left) = $widths;\n\n        // All this polygon business is for beveled corners...\n        switch ($side) {\n            case \"top\":\n                $points = [$x, $y,\n                    $x + $length, $y,\n                    $x + $length - $right, $y + $top,\n                    $x + $left, $y + $top];\n                $this->_canvas->polygon($points, $color, null, null, true);\n                break;\n\n            case \"bottom\":\n                $points = [$x, $y,\n                    $x + $length, $y,\n                    $x + $length - $right, $y - $bottom,\n                    $x + $left, $y - $bottom];\n                $this->_canvas->polygon($points, $color, null, null, true);\n                break;\n\n            case \"left\":\n                $points = [$x, $y,\n                    $x, $y + $length,\n                    $x + $left, $y + $length - $bottom,\n                    $x + $left, $y + $top];\n                $this->_canvas->polygon($points, $color, null, null, true);\n                break;\n\n            case \"right\":\n                $points = [$x, $y,\n                    $x, $y + $length,\n                    $x - $right, $y + $length - $bottom,\n                    $x - $right, $y + $top];\n                $this->_canvas->polygon($points, $color, null, null, true);\n                break;\n\n            default:\n                return;\n        }\n    }\n\n    /**\n     * @param $side\n     * @param $ratio\n     * @param $top\n     * @param $right\n     * @param $bottom\n     * @param $left\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $r1\n     * @param $r2\n     */\n    protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2)\n    {\n        switch ($side) {\n            case \"top\":\n                $r1 -= $left * $ratio;\n                $r2 -= $right * $ratio;\n                $x += $left * $ratio;\n                $y += $top * $ratio;\n                $length -= $left * $ratio + $right * $ratio;\n                break;\n\n            case \"bottom\":\n                $r1 -= $right * $ratio;\n                $r2 -= $left * $ratio;\n                $x += $left * $ratio;\n                $y -= $bottom * $ratio;\n                $length -= $left * $ratio + $right * $ratio;\n                break;\n\n            case \"left\":\n                $r1 -= $top * $ratio;\n                $r2 -= $bottom * $ratio;\n                $x += $left * $ratio;\n                $y += $top * $ratio;\n                $length -= $top * $ratio + $bottom * $ratio;\n                break;\n\n            case \"right\":\n                $r1 -= $bottom * $ratio;\n                $r2 -= $top * $ratio;\n                $x -= $right * $ratio;\n                $y += $top * $ratio;\n                $length -= $top * $ratio + $bottom * $ratio;\n                break;\n\n            default:\n                return;\n        }\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        list($top, $right, $bottom, $left) = $widths;\n\n        $third_widths = [$top / 3, $right / 3, $bottom / 3, $left / 3];\n\n        // draw the outer border\n        $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2);\n\n        $this->_apply_ratio($side, 2 / 3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2);\n\n        $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2);\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        list($top, $right, $bottom, $left) = $widths;\n\n        $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2];\n\n        $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);\n\n        $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2);\n\n        $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        list($top, $right, $bottom, $left) = $widths;\n\n        $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2];\n\n        $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);\n\n        $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2);\n\n        $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);\n    }\n\n    /**\n     * @param $c\n     * @return mixed\n     */\n    protected function _tint($c)\n    {\n        if (!is_numeric($c)) {\n            return $c;\n        }\n\n        return min(1, $c + 0.16);\n    }\n\n    /**\n     * @param $c\n     * @return mixed\n     */\n    protected function _shade($c)\n    {\n        if (!is_numeric($c)) {\n            return $c;\n        }\n\n        return max(0, $c - 0.33);\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        switch ($side) {\n            case \"top\":\n            case \"left\":\n                $shade = array_map([$this, \"_shade\"], $color);\n                $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2);\n                break;\n\n            case \"bottom\":\n            case \"right\":\n                $tint = array_map([$this, \"_tint\"], $color);\n                $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2);\n                break;\n\n            default:\n                return;\n        }\n    }\n\n    /**\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param int $r1\n     * @param int $r2\n     */\n    protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $r1 = 0, $r2 = 0)\n    {\n        switch ($side) {\n            case \"top\":\n            case \"left\":\n                $tint = array_map([$this, \"_tint\"], $color);\n                $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2);\n                break;\n\n            case \"bottom\":\n            case \"right\":\n                $shade = array_map([$this, \"_shade\"], $color);\n                $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2);\n                break;\n\n            default:\n                return;\n        }\n    }\n\n    /**\n     * Draws a solid, dotted, or dashed line, observing the border radius\n     *\n     * @param $x\n     * @param $y\n     * @param $length\n     * @param $color\n     * @param $widths\n     * @param $side\n     * @param string $corner_style\n     * @param $pattern_name\n     * @param int $r1\n     * @param int $r2\n     *\n     * @var $top\n     */\n    protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = \"bevel\", $pattern_name = \"none\", $r1 = 0, $r2 = 0)\n    {\n        /** used by $$side */\n        list($top, $right, $bottom, $left) = $widths;\n        $width = $$side;\n\n        $pattern = $this->_get_dash_pattern($pattern_name, $width);\n\n        $half_width = $width / 2;\n        $r1 -= $half_width;\n        $r2 -= $half_width;\n        $adjust = $r1 / 80;\n        $length -= $width;\n\n        switch ($side) {\n            case \"top\":\n                $x += $half_width;\n                $y += $half_width;\n\n                if ($r1 > 0) {\n                    $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 90 - $adjust, 135 + $adjust, $color, $width, $pattern);\n                }\n\n                $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern);\n\n                if ($r2 > 0) {\n                    $this->_canvas->arc($x + $length - $r2, $y + $r2, $r2, $r2, 45 - $adjust, 90 + $adjust, $color, $width, $pattern);\n                }\n                break;\n\n            case \"bottom\":\n                $x += $half_width;\n                $y -= $half_width;\n\n                if ($r1 > 0) {\n                    $this->_canvas->arc($x + $r1, $y - $r1, $r1, $r1, 225 - $adjust, 270 + $adjust, $color, $width, $pattern);\n                }\n\n                $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern);\n\n                if ($r2 > 0) {\n                    $this->_canvas->arc($x + $length - $r2, $y - $r2, $r2, $r2, 270 - $adjust, 315 + $adjust, $color, $width, $pattern);\n                }\n                break;\n\n            case \"left\":\n                $y += $half_width;\n                $x += $half_width;\n\n                if ($r1 > 0) {\n                    $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 135 - $adjust, 180 + $adjust, $color, $width, $pattern);\n                }\n\n                $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern);\n\n                if ($r2 > 0) {\n                    $this->_canvas->arc($x + $r2, $y + $length - $r2, $r2, $r2, 180 - $adjust, 225 + $adjust, $color, $width, $pattern);\n                }\n                break;\n\n            case \"right\":\n                $y += $half_width;\n                $x -= $half_width;\n\n                if ($r1 > 0) {\n                    $this->_canvas->arc($x - $r1, $y + $r1, $r1, $r1, 0 - $adjust, 45 + $adjust, $color, $width, $pattern);\n                }\n\n                $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern);\n\n                if ($r2 > 0) {\n                    $this->_canvas->arc($x - $r2, $y + $length - $r2, $r2, $r2, 315 - $adjust, 360 + $adjust, $color, $width, $pattern);\n                }\n                break;\n        }\n    }\n\n    /**\n     * @param $opacity\n     */\n    protected function _set_opacity($opacity)\n    {\n        if (is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0) {\n            $this->_canvas->set_opacity($opacity);\n        }\n    }\n\n    /**\n     * @param array $box\n     * @param string $color\n     * @param array $style\n     */\n    protected function _debug_layout($box, $color = \"red\", $style = [])\n    {\n        $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], Color::parse($color), 0.1, $style);\n    }\n\n    /**\n     * @param float $img_width\n     * @param float $img_height\n     * @param float $container_width\n     * @param float $container_height\n     * @param array|string $bg_resize\n     * @param int $dpi\n     * @return array\n     */\n    protected function _resize_background_image(\n        $img_width,\n        $img_height,\n        $container_width,\n        $container_height,\n        $bg_resize,\n        $dpi\n    ) {\n        // We got two some specific numbers and/or auto definitions\n        if (is_array($bg_resize)) {\n            $is_auto_width = $bg_resize[0] === 'auto';\n            if ($is_auto_width) {\n                $new_img_width = $img_width;\n            } else {\n                $new_img_width = $bg_resize[0];\n                if (Helpers::is_percent($new_img_width)) {\n                    $new_img_width = round(($container_width / 100) * (float)$new_img_width);\n                } else {\n                    $new_img_width = round($new_img_width * $dpi / 72);\n                }\n            }\n\n            $is_auto_height = $bg_resize[1] === 'auto';\n            if ($is_auto_height) {\n                $new_img_height = $img_height;\n            } else {\n                $new_img_height = $bg_resize[1];\n                if (Helpers::is_percent($new_img_height)) {\n                    $new_img_height = round(($container_height / 100) * (float)$new_img_height);\n                } else {\n                    $new_img_height = round($new_img_height * $dpi / 72);\n                }\n            }\n\n            // if one of both was set to auto the other one needs to scale proportionally\n            if ($is_auto_width !== $is_auto_height) {\n                if ($is_auto_height) {\n                    $new_img_height = round($new_img_width * ($img_height / $img_width));\n                } else {\n                    $new_img_width = round($new_img_height * ($img_width / $img_height));\n                }\n            }\n        } else {\n            $container_ratio = $container_height / $container_width;\n\n            if ($bg_resize === 'cover' || $bg_resize === 'contain') {\n                $img_ratio = $img_height / $img_width;\n\n                if (\n                    ($bg_resize === 'cover' && $container_ratio > $img_ratio) ||\n                    ($bg_resize === 'contain' && $container_ratio < $img_ratio)\n                ) {\n                    $new_img_height = $container_height;\n                    $new_img_width = round($container_height / $img_ratio);\n                } else {\n                    $new_img_width = $container_width;\n                    $new_img_height = round($container_width * $img_ratio);\n                }\n            } else {\n                $new_img_width = $img_width;\n                $new_img_height = $img_height;\n            }\n        }\n\n        return [$new_img_width, $new_img_height];\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/Block.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Block as BlockFrameDecorator;\nuse Dompdf\\Helpers;\n\n/**\n * Renders block frames\n *\n * @package dompdf\n */\nclass Block extends AbstractRenderer\n{\n\n    /**\n     * @param Frame $frame\n     */\n    function render(Frame $frame)\n    {\n        $style = $frame->get_style();\n        $node = $frame->get_node();\n        $dompdf = $this->_dompdf;\n\n        $this->_set_opacity($frame->get_opacity($style->opacity));\n\n        [$x, $y, $w, $h] = $frame->get_border_box();\n\n        if ($node->nodeName === \"body\") {\n            $h = $frame->get_containing_block(\"h\") - (float)$style->length_in_pt([\n                        $style->margin_top,\n                        $style->border_top_width,\n                        $style->border_bottom_width,\n                        $style->margin_bottom],\n                    (float)$style->length_in_pt($style->width));\n        }\n\n        $border_box = [$x, $y, $w, $h];\n\n        // Draw our background, border and content\n        $this->_render_background($frame, $border_box);\n        $this->_render_border($frame, $border_box);\n        $this->_render_outline($frame, $border_box);\n\n        // Handle anchors & links\n        if ($node->nodeName === \"a\" && $href = $node->getAttribute(\"href\")) {\n            $href = Helpers::build_url($dompdf->getProtocol(), $dompdf->getBaseHost(), $dompdf->getBasePath(), $href);\n            $this->_canvas->add_link($href, $x, $y, $w, $h);\n        }\n\n        $id = $frame->get_node()->getAttribute(\"id\");\n        if (strlen($id) > 0) {\n            $this->_canvas->add_named_dest($id);\n        }\n\n        $this->debugBlockLayout($frame, \"red\", false);\n    }\n\n    /**\n     * @param Frame $frame\n     * @param float[] $border_box\n     */\n    protected function _render_background(Frame $frame, array $border_box): void\n    {\n        $style = $frame->get_style();\n        [$x, $y, $w, $h] = $border_box;\n\n        if ($style->has_border_radius()) {\n            [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box);\n            $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl);\n        }\n\n        if (($bg = $style->background_color) !== \"transparent\") {\n            $this->_canvas->filled_rectangle($x, $y, $w, $h, $bg);\n        }\n\n        if (($url = $style->background_image) && $url !== \"none\") {\n            $this->_background_image($url, $x, $y, $w, $h, $style);\n        }\n\n        if ($style->has_border_radius()) {\n            $this->_canvas->clipping_end();\n        }\n    }\n\n    /**\n     * @param Frame $frame\n     * @param float[] $border_box\n     * @param string $corner_style\n     */\n    protected function _render_border(Frame $frame, array $border_box, string $corner_style = \"bevel\"): void\n    {\n        $style = $frame->get_style();\n        $bp = $style->get_border_properties();\n        [$x, $y, $w, $h] = $border_box;\n        [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box);\n\n        // Short-cut: If all the borders are \"solid\" with the same color and style, and no radius, we'd better draw a rectangle\n        if (\n            in_array($bp[\"top\"][\"style\"], [\"solid\", \"dashed\", \"dotted\"]) &&\n            $bp[\"top\"] == $bp[\"right\"] &&\n            $bp[\"right\"] == $bp[\"bottom\"] &&\n            $bp[\"bottom\"] == $bp[\"left\"] &&\n            !$style->has_border_radius()\n        ) {\n            $props = $bp[\"top\"];\n            if ($props[\"color\"] === \"transparent\" || $props[\"width\"] <= 0) {\n                return;\n            }\n\n            $width = (float)$style->length_in_pt($props[\"width\"]);\n            $pattern = $this->_get_dash_pattern($props[\"style\"], $width);\n            $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props[\"color\"], $width, $pattern);\n            return;\n        }\n\n        // Do it the long way\n        $widths = [\n            (float)$style->length_in_pt($bp[\"top\"][\"width\"]),\n            (float)$style->length_in_pt($bp[\"right\"][\"width\"]),\n            (float)$style->length_in_pt($bp[\"bottom\"][\"width\"]),\n            (float)$style->length_in_pt($bp[\"left\"][\"width\"])\n        ];\n\n        foreach ($bp as $side => $props) {\n            list($x, $y, $w, $h) = $border_box;\n            $length = 0;\n            $r1 = 0;\n            $r2 = 0;\n\n            if (!$props[\"style\"] ||\n                $props[\"style\"] === \"none\" ||\n                $props[\"width\"] <= 0 ||\n                $props[\"color\"] == \"transparent\"\n            ) {\n                continue;\n            }\n\n            switch ($side) {\n                case \"top\":\n                    $length = $w;\n                    $r1 = $tl;\n                    $r2 = $tr;\n                    break;\n\n                case \"bottom\":\n                    $length = $w;\n                    $y += $h;\n                    $r1 = $bl;\n                    $r2 = $br;\n                    break;\n\n                case \"left\":\n                    $length = $h;\n                    $r1 = $tl;\n                    $r2 = $bl;\n                    break;\n\n                case \"right\":\n                    $length = $h;\n                    $x += $w;\n                    $r1 = $tr;\n                    $r2 = $br;\n                    break;\n                default:\n                    break;\n            }\n            $method = \"_border_\" . $props[\"style\"];\n\n            // draw rounded corners\n            $this->$method($x, $y, $length, $props[\"color\"], $widths, $side, $corner_style, $r1, $r2);\n        }\n    }\n\n    /**\n     * @param Frame $frame\n     * @param float[] $border_box\n     * @param string $corner_style\n     */\n    protected function _render_outline(Frame $frame, array $border_box, string $corner_style = \"bevel\"): void\n    {\n        $style = $frame->get_style();\n\n        $width = (float) $style->length_in_pt($style->outline_width);\n        $outline_style = $style->outline_style;\n        $color = $style->outline_color;\n\n        if (!$outline_style || $outline_style === \"none\" || $color === \"transparent\" || $width <= 0) {\n            return;\n        }\n\n        $offset = (float) $style->length_in_pt($style->outline_offset);\n\n        [$x, $y, $w, $h] = $border_box;\n        $d = $width + $offset;\n        $outline_box = [$x - $d, $y - $d, $w + $d * 2, $h + $d * 2];\n        [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $outline_box);\n\n        $x -= $offset;\n        $y -= $offset;\n        $w += $offset * 2;\n        $h += $offset * 2;\n\n        // For a simple outline, we can draw a rectangle\n        if (in_array($outline_style, [\"solid\", \"dashed\", \"dotted\"], true)\n            && !$style->has_border_radius()\n        ) {\n            $x -= $width / 2;\n            $y -= $width / 2;\n            $w += $width;\n            $h += $width;\n\n            $pattern = $this->_get_dash_pattern($outline_style, $width);\n            $this->_canvas->rectangle($x, $y, $w, $h, $color, $width, $pattern);\n            return;\n        }\n\n        $x -= $width;\n        $y -= $width;\n        $w += $width * 2;\n        $h += $width * 2;\n\n        $method = \"_border_\" . $outline_style;\n        $widths = array_fill(0, 4, $width);\n        $sides = [\"top\", \"right\", \"left\", \"bottom\"];\n\n        foreach ($sides as $side) {\n            switch ($side) {\n                case \"top\":\n                    $length = $w;\n                    $side_x = $x;\n                    $side_y = $y;\n                    $r1 = $tl;\n                    $r2 = $tr;\n                    break;\n\n                case \"bottom\":\n                    $length = $w;\n                    $side_x = $x;\n                    $side_y = $y + $h;\n                    $r1 = $bl;\n                    $r2 = $br;\n                    break;\n\n                case \"left\":\n                    $length = $h;\n                    $side_x = $x;\n                    $side_y = $y;\n                    $r1 = $tl;\n                    $r2 = $bl;\n                    break;\n\n                case \"right\":\n                    $length = $h;\n                    $side_x = $x + $w;\n                    $side_y = $y;\n                    $r1 = $tr;\n                    $r2 = $br;\n                    break;\n\n                default:\n                    break;\n            }\n\n            $this->$method($side_x, $side_y, $length, $color, $widths, $side, $corner_style, $r1, $r2);\n        }\n    }\n\n    protected function debugBlockLayout(Frame $frame, ?string $color, bool $lines = false): void\n    {\n        $options = $this->_dompdf->getOptions();\n        $debugLayout = $options->getDebugLayout();\n\n        if (!$debugLayout) {\n            return;\n        }\n\n        if ($color && $options->getDebugLayoutBlocks()) {\n            $this->_debug_layout($frame->get_border_box(), $color);\n\n            if ($options->getDebugLayoutPaddingBox()) {\n                $this->_debug_layout($frame->get_padding_box(), $color, [0.5, 0.5]);\n            }\n        }\n\n        if ($lines && $options->getDebugLayoutLines() && $frame instanceof BlockFrameDecorator) {\n            [$cx, , $cw] = $frame->get_content_box();\n\n            foreach ($frame->get_line_boxes() as $line) {\n                $lw = $cw - $line->left - $line->right;\n                $this->_debug_layout([$cx + $line->left, $line->y, $lw, $line->h], \"orange\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/Image.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Frame;\nuse Dompdf\\Image\\Cache;\n\n/**\n * Image renderer\n *\n * @access  private\n * @package dompdf\n */\nclass Image extends Block\n{\n\n    /**\n     * @param Frame $frame\n     */\n    function render(Frame $frame)\n    {\n        // Render background & borders\n        $style = $frame->get_style();\n        $border_box = $frame->get_border_box();\n        [, , $bw, $bh] = $border_box;\n\n        if ($bw === 0.0 || $bh === 0.0) {\n            return;\n        }\n\n        $this->_set_opacity($frame->get_opacity($style->opacity));\n\n        $this->_render_background($frame, $border_box);\n        $this->_render_border($frame, $border_box);\n        $this->_render_outline($frame, $border_box);\n\n        $content_box = $frame->get_content_box();\n        [$x, $y, $w, $h] = $content_box;\n\n        if ($style->has_border_radius()) {\n            [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $content_box);\n            $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl);\n        }\n\n        $src = $frame->get_image_url();\n        $alt = null;\n\n        if (Cache::is_broken($src) &&\n            $alt = $frame->get_node()->getAttribute(\"alt\")\n        ) {\n            $font = $style->font_family;\n            $size = $style->font_size;\n            $spacing = $style->word_spacing;\n            $this->_canvas->text(\n                $x,\n                $y,\n                $alt,\n                $font,\n                $size,\n                $style->color,\n                $spacing\n            );\n        } else {\n            $this->_canvas->image($src, $x, $y, $w, $h, $style->image_resolution);\n        }\n\n        if ($style->has_border_radius()) {\n            $this->_canvas->clipping_end();\n        }\n\n        if ($msg = $frame->get_image_msg()) {\n            $parts = preg_split(\"/\\s*\\n\\s*/\", $msg);\n            $height = 10;\n            $_y = $alt ? $y + $h - count($parts) * $height : $y;\n\n            foreach ($parts as $i => $_part) {\n                $this->_canvas->text($x, $_y + $i * $height, $_part, \"times\", $height * 0.8, [0.5, 0.5, 0.5]);\n            }\n        }\n\n        $id = $frame->get_node()->getAttribute(\"id\");\n        if (strlen($id) > 0) {\n            $this->_canvas->add_named_dest($id);\n        }\n\n        $this->debugBlockLayout($frame, \"blue\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/Inline.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Frame;\nuse Dompdf\\Helpers;\n\n/**\n * Renders inline frames\n *\n * @access  private\n * @package dompdf\n */\nclass Inline extends AbstractRenderer\n{\n    function render(Frame $frame)\n    {\n        if (!$frame->get_first_child()) {\n            return; // No children, no service\n        }\n\n        $style = $frame->get_style();\n        $dompdf = $this->_dompdf;\n\n        // Draw the left border if applicable\n        $bp = $style->get_border_properties();\n        $widths = [\n            (float)$style->length_in_pt($bp[\"top\"][\"width\"]),\n            (float)$style->length_in_pt($bp[\"right\"][\"width\"]),\n            (float)$style->length_in_pt($bp[\"bottom\"][\"width\"]),\n            (float)$style->length_in_pt($bp[\"left\"][\"width\"])\n        ];\n\n        // Draw the background & border behind each child.  To do this we need\n        // to figure out just how much space each child takes:\n        list($x, $y) = $frame->get_first_child()->get_position();\n\n        $this->_set_opacity($frame->get_opacity($style->opacity));\n\n        $do_debug_layout_line = $dompdf->getOptions()->getDebugLayout()\n            && $dompdf->getOptions()->getDebugLayoutInline();\n\n        list($w, $h) = $this->get_child_size($frame, $do_debug_layout_line);\n\n        // make sure the border and background start inside the left margin\n        $left_margin = (float)$style->length_in_pt($style->margin_left);\n        $x += $left_margin;\n\n        // Handle the last child\n        if (($bg = $style->background_color) !== \"transparent\") {\n            $this->_canvas->filled_rectangle($x + $widths[3], $y + $widths[0], $w, $h, $bg);\n        }\n\n        //On continuation lines (after line break) of inline elements, the style got copied.\n        //But a non repeatable background image should not be repeated on the next line.\n        //But removing the background image above has never an effect, and removing it below\n        //removes it always, even on the initial line.\n        //Need to handle it elsewhere, e.g. on certain ...clone()... usages.\n        // Repeat not given: default is Style::__construct\n        // ... && (!($repeat = $style->background_repeat) || $repeat === \"repeat\" ...\n        //different position? $this->_background_image($url, $x, $y, $w, $h, $style);\n        if (($url = $style->background_image) && $url !== \"none\") {\n            $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style);\n        }\n\n        // Add the border widths\n        $w += (float)$widths[1] + (float)$widths[3];\n        $h += (float)$widths[0] + (float)$widths[2];\n\n        // If this is the first row, draw the left border too\n        if ($bp[\"left\"][\"style\"] !== \"none\" && $bp[\"left\"][\"color\"] !== \"transparent\" && $widths[3] > 0) {\n            $method = \"_border_\" . $bp[\"left\"][\"style\"];\n            $this->$method($x, $y, $h, $bp[\"left\"][\"color\"], $widths, \"left\");\n        }\n\n        // Draw the top & bottom borders\n        if ($bp[\"top\"][\"style\"] !== \"none\" && $bp[\"top\"][\"color\"] !== \"transparent\" && $widths[0] > 0) {\n            $method = \"_border_\" . $bp[\"top\"][\"style\"];\n            $this->$method($x, $y, $w, $bp[\"top\"][\"color\"], $widths, \"top\");\n        }\n\n        if ($bp[\"bottom\"][\"style\"] !== \"none\" && $bp[\"bottom\"][\"color\"] !== \"transparent\" && $widths[2] > 0) {\n            $method = \"_border_\" . $bp[\"bottom\"][\"style\"];\n            $this->$method($x, $y + $h, $w, $bp[\"bottom\"][\"color\"], $widths, \"bottom\");\n        }\n\n        // Helpers::var_dump(get_class($frame->get_next_sibling()));\n        // $last_row = get_class($frame->get_next_sibling()) !== 'Inline';\n        // Draw the right border if this is the last row\n        if ($bp[\"right\"][\"style\"] !== \"none\" && $bp[\"right\"][\"color\"] !== \"transparent\" && $widths[1] > 0) {\n            $method = \"_border_\" . $bp[\"right\"][\"style\"];\n            $this->$method($x + $w, $y, $h, $bp[\"right\"][\"color\"], $widths, \"right\");\n        }\n\n        $node = $frame->get_node();\n        $id = $node->getAttribute(\"id\");\n        if (strlen($id) > 0) {\n            $this->_canvas->add_named_dest($id);\n        }\n\n        // Only two levels of links frames\n        $is_link_node = $node->nodeName === \"a\";\n        if ($is_link_node) {\n            if (($name = $node->getAttribute(\"name\"))) {\n                $this->_canvas->add_named_dest($name);\n            }\n        }\n\n        if ($frame->get_parent() && $frame->get_parent()->get_node()->nodeName === \"a\") {\n            $link_node = $frame->get_parent()->get_node();\n        }\n\n        // Handle anchors & links\n        if ($is_link_node) {\n            if ($href = $node->getAttribute(\"href\")) {\n                $href = Helpers::build_url($dompdf->getProtocol(), $dompdf->getBaseHost(), $dompdf->getBasePath(), $href);\n                $this->_canvas->add_link($href, $x, $y, $w, $h);\n            }\n        }\n    }\n\n    protected function get_child_size(Frame $frame, bool $do_debug_layout_line): array\n    {\n        $w = 0.0;\n        $h = 0.0;\n\n        foreach ($frame->get_children() as $child) {\n            if ($child->get_node()->nodeValue === \" \" && $child->get_prev_sibling() && !$child->get_next_sibling()) {\n                break;\n            }\n\n            $style = $child->get_style();\n            list(, , $child_w, $child_h) = $child->get_padding_box();\n\n            $child_h2 = 0.0;\n\n            if ($style->width === \"auto\") {\n                list($child_w, $child_h2) = $this->get_child_size($child, $do_debug_layout_line);\n            }\n\n            if ($style->height === \"auto\") {\n                list(, $child_h2) = $this->get_child_size($child, $do_debug_layout_line);\n            }\n\n            $w += $child_w;\n            $h = max($h, $child_h, $child_h2);\n\n            if ($do_debug_layout_line) {\n                $this->_debug_layout($child->get_border_box(), \"blue\");\n\n                if ($this->_dompdf->getOptions()->getDebugLayoutPaddingBox()) {\n                    $this->_debug_layout($child->get_padding_box(), \"blue\", [0.5, 0.5]);\n                }\n            }\n        }\n\n        return [$w, $h];\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/ListBullet.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Helpers;\nuse Dompdf\\Frame;\nuse Dompdf\\Image\\Cache;\nuse Dompdf\\FrameDecorator\\ListBullet as ListBulletFrameDecorator;\n\n/**\n * Renders list bullets\n *\n * @access  private\n * @package dompdf\n */\nclass ListBullet extends AbstractRenderer\n{\n    /**\n     * @param $type\n     * @return mixed|string\n     */\n    static function get_counter_chars($type)\n    {\n        static $cache = [];\n\n        if (isset($cache[$type])) {\n            return $cache[$type];\n        }\n\n        $uppercase = false;\n        $text = \"\";\n\n        switch ($type) {\n            case \"decimal-leading-zero\":\n            case \"decimal\":\n            case \"1\":\n                return \"0123456789\";\n\n            case \"upper-alpha\":\n            case \"upper-latin\":\n            case \"A\":\n                $uppercase = true;\n            case \"lower-alpha\":\n            case \"lower-latin\":\n            case \"a\":\n                $text = \"abcdefghijklmnopqrstuvwxyz\";\n                break;\n\n            case \"upper-roman\":\n            case \"I\":\n                $uppercase = true;\n            case \"lower-roman\":\n            case \"i\":\n                $text = \"ivxlcdm\";\n                break;\n\n            case \"lower-greek\":\n                for ($i = 0; $i < 24; $i++) {\n                    $text .= Helpers::unichr($i + 944);\n                }\n                break;\n        }\n\n        if ($uppercase) {\n            $text = strtoupper($text);\n        }\n\n        return $cache[$type] = \"$text.\";\n    }\n\n    /**\n     * @param int $n\n     * @param string $type\n     * @param int|null $pad\n     *\n     * @return string\n     */\n    private function make_counter($n, $type, $pad = null)\n    {\n        $n = intval($n);\n        $text = \"\";\n        $uppercase = false;\n\n        switch ($type) {\n            case \"decimal-leading-zero\":\n            case \"decimal\":\n            case \"1\":\n                if ($pad) {\n                    $text = str_pad($n, $pad, \"0\", STR_PAD_LEFT);\n                } else {\n                    $text = $n;\n                }\n                break;\n\n            case \"upper-alpha\":\n            case \"upper-latin\":\n            case \"A\":\n                $uppercase = true;\n            case \"lower-alpha\":\n            case \"lower-latin\":\n            case \"a\":\n                $text = chr((($n - 1) % 26) + ord('a'));\n                break;\n\n            case \"upper-roman\":\n            case \"I\":\n                $uppercase = true;\n            case \"lower-roman\":\n            case \"i\":\n                $text = Helpers::dec2roman($n);\n                break;\n\n            case \"lower-greek\":\n                $text = Helpers::unichr($n + 944);\n                break;\n        }\n\n        if ($uppercase) {\n            $text = strtoupper($text);\n        }\n\n        return \"$text.\";\n    }\n\n    /**\n     * @param Frame $frame\n     */\n    function render(Frame $frame)\n    {\n        $style = $frame->get_style();\n        $font_size = $style->font_size;\n        $line_height = $style->line_height;\n\n        $this->_set_opacity($frame->get_opacity($style->opacity));\n\n        $li = $frame->get_parent();\n\n        // Don't render bullets twice if if was split\n        if ($li->_splitted) {\n            return;\n        }\n\n        // Handle list-style-image\n        // If list style image is requested but missing, fall back to predefined types\n        if ($style->list_style_image !== \"none\" && !Cache::is_broken($img = $frame->get_image_url())) {\n            list($x, $y) = $frame->get_position();\n\n            //For expected size and aspect, instead of box size, use image natural size scaled to DPI.\n            // Resample the bullet image to be consistent with 'auto' sized images\n            // See also Image::get_min_max_width\n            // Tested php ver: value measured in px, suffix \"px\" not in value: rtrim unnecessary.\n            //$w = $frame->get_width();\n            //$h = $frame->get_height();\n            list($width, $height) = Helpers::dompdf_getimagesize($img, $this->_dompdf->getHttpContext());\n            $dpi = $this->_dompdf->getOptions()->getDpi();\n            $w = ((float)rtrim($width, \"px\") * 72) / $dpi;\n            $h = ((float)rtrim($height, \"px\") * 72) / $dpi;\n\n            $x -= $w;\n            $y -= ($line_height - $font_size) / 2; //Reverse hinting of list_bullet_positioner\n\n            $this->_canvas->image($img, $x, $y, $w, $h);\n        } else {\n            $bullet_style = $style->list_style_type;\n\n            $fill = false;\n\n            switch ($bullet_style) {\n                default:\n                /** @noinspection PhpMissingBreakStatementInspection */\n                case \"disc\":\n                    $fill = true;\n\n                case \"circle\":\n                    list($x, $y) = $frame->get_position();\n                    $r = ($font_size * (ListBulletFrameDecorator::BULLET_SIZE /*-ListBulletFrameDecorator::BULLET_THICKNESS*/)) / 2;\n                    $x -= $font_size * (ListBulletFrameDecorator::BULLET_SIZE / 2);\n                    $y += ($font_size * (1 - ListBulletFrameDecorator::BULLET_DESCENT)) / 2;\n                    $o = $font_size * ListBulletFrameDecorator::BULLET_THICKNESS;\n                    $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $fill);\n                    break;\n\n                case \"square\":\n                    list($x, $y) = $frame->get_position();\n                    $w = $font_size * ListBulletFrameDecorator::BULLET_SIZE;\n                    $x -= $w;\n                    $y += ($font_size * (1 - ListBulletFrameDecorator::BULLET_DESCENT - ListBulletFrameDecorator::BULLET_SIZE)) / 2;\n                    $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color);\n                    break;\n\n                case \"decimal-leading-zero\":\n                case \"decimal\":\n                case \"lower-alpha\":\n                case \"lower-latin\":\n                case \"lower-roman\":\n                case \"lower-greek\":\n                case \"upper-alpha\":\n                case \"upper-latin\":\n                case \"upper-roman\":\n                case \"1\": // HTML 4.0 compatibility\n                case \"a\":\n                case \"i\":\n                case \"A\":\n                case \"I\":\n                    $pad = null;\n                    if ($bullet_style === \"decimal-leading-zero\") {\n                        $pad = strlen($li->get_parent()->get_node()->getAttribute(\"dompdf-children-count\"));\n                    }\n\n                    $node = $frame->get_node();\n\n                    if (!$node->hasAttribute(\"dompdf-counter\")) {\n                        return;\n                    }\n\n                    $index = $node->getAttribute(\"dompdf-counter\");\n                    $text = $this->make_counter($index, $bullet_style, $pad);\n\n                    if (trim($text) == \"\") {\n                        return;\n                    }\n\n                    $spacing = 0;\n                    $font_family = $style->font_family;\n\n                    // Out-of-flow list items do not have a containing line\n                    $line = $li->get_containing_line();\n                    $x = $frame->get_position(\"x\");\n                    $y = $line ? $line->y : $li->get_position(\"y\");\n\n                    $x -= $this->_dompdf->getFontMetrics()->getTextWidth($text, $font_family, $font_size, $spacing);\n\n                    // Take line-height into account\n                    // TODO: should the line height take into account the line height of the containing block (per previous logic)\n                    // $line_height = (float)$style->length_in_pt($style->line_height, $frame->get_containing_block(\"h\"));\n                    $line_height = $style->line_height;\n                    $y += ($line_height - $font_size) / 4; // FIXME I thought it should be 2, but 4 gives better results\n\n                    $this->_canvas->text($x, $y, $text,\n                        $font_family, $font_size,\n                        $style->color, $spacing);\n\n                case \"none\":\n                    break;\n            }\n        }\n\n        $id = $frame->get_node()->getAttribute(\"id\");\n        if (strlen($id) > 0) {\n            $this->_canvas->add_named_dest($id);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/TableCell.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Frame;\nuse Dompdf\\FrameDecorator\\Table;\n\n/**\n * Renders table cells\n *\n * @package dompdf\n */\nclass TableCell extends Block\n{\n\n    /**\n     * @param Frame $frame\n     */\n    function render(Frame $frame)\n    {\n        $style = $frame->get_style();\n\n        if (trim($frame->get_node()->nodeValue) === \"\" && $style->empty_cells === \"hide\") {\n            return;\n        }\n\n        $this->_set_opacity($frame->get_opacity($style->opacity));\n\n        $border_box = $frame->get_border_box();\n        $table = Table::find_parent_table($frame);\n\n        if ($table->get_style()->border_collapse !== \"collapse\") {\n            $this->_render_background($frame, $border_box);\n            $this->_render_border($frame, $border_box);\n            $this->_render_outline($frame, $border_box);\n        } else {\n            // The collapsed case is slightly complicated...\n\n            $cells = $table->get_cellmap()->get_spanned_cells($frame);\n\n            if (is_null($cells)) {\n                return;\n            }\n\n            // Render the background to the padding box, as the cells are\n            // rendered individually one after another, and we don't want the\n            // background to overlap an adjacent border\n            $padding_box = $frame->get_padding_box();\n\n            $this->_render_background($frame, $padding_box);\n            $this->_render_collapsed_border($frame, $table);\n\n            // FIXME: Outline should be drawn over other cells\n            $this->_render_outline($frame, $border_box);\n        }\n\n        $id = $frame->get_node()->getAttribute(\"id\");\n        if (strlen($id) > 0) {\n            $this->_canvas->add_named_dest($id);\n        }\n\n        // $this->debugBlockLayout($frame, \"red\", false);\n    }\n\n    /**\n     * @param Frame $frame\n     * @param Table $table\n     */\n    protected function _render_collapsed_border(Frame $frame, Table $table): void\n    {\n        $cellmap = $table->get_cellmap();\n        $cells = $cellmap->get_spanned_cells($frame);\n        $num_rows = $cellmap->get_num_rows();\n        $num_cols = $cellmap->get_num_cols();\n\n        [$table_x, $table_y] = $table->get_position();\n\n        // Determine the top row spanned by this cell\n        $i = $cells[\"rows\"][0];\n        $top_row = $cellmap->get_row($i);\n\n        // Determine if this cell borders on the bottom of the table.  If so,\n        // then we draw its bottom border.  Otherwise the next row down will\n        // draw its top border instead.\n        if (in_array($num_rows - 1, $cells[\"rows\"])) {\n            $draw_bottom = true;\n            $bottom_row = $cellmap->get_row($num_rows - 1);\n        } else {\n            $draw_bottom = false;\n        }\n\n        // Draw the horizontal borders\n        foreach ($cells[\"columns\"] as $j) {\n            $bp = $cellmap->get_border_properties($i, $j);\n            $col = $cellmap->get_column($j);\n\n            $x = $table_x + $col[\"x\"] - $bp[\"left\"][\"width\"] / 2;\n            $y = $table_y + $top_row[\"y\"] - $bp[\"top\"][\"width\"] / 2;\n            $w = $col[\"used-width\"] + ($bp[\"left\"][\"width\"] + $bp[\"right\"][\"width\"]) / 2;\n\n            if ($bp[\"top\"][\"width\"] > 0) {\n                $widths = [\n                    (float)$bp[\"top\"][\"width\"],\n                    (float)$bp[\"right\"][\"width\"],\n                    (float)$bp[\"bottom\"][\"width\"],\n                    (float)$bp[\"left\"][\"width\"]\n                ];\n\n                $method = \"_border_\" . $bp[\"top\"][\"style\"];\n                $this->$method($x, $y, $w, $bp[\"top\"][\"color\"], $widths, \"top\", \"square\");\n            }\n\n            if ($draw_bottom) {\n                $bp = $cellmap->get_border_properties($num_rows - 1, $j);\n                if ($bp[\"bottom\"][\"width\"] <= 0) {\n                    continue;\n                }\n                \n                $widths = [\n                    (float)$bp[\"top\"][\"width\"],\n                    (float)$bp[\"right\"][\"width\"],\n                    (float)$bp[\"bottom\"][\"width\"],\n                    (float)$bp[\"left\"][\"width\"]\n                ];\n\n                $y = $table_y + $bottom_row[\"y\"] + $bottom_row[\"height\"] + $bp[\"bottom\"][\"width\"] / 2;\n\n                $method = \"_border_\" . $bp[\"bottom\"][\"style\"];\n                $this->$method($x, $y, $w, $bp[\"bottom\"][\"color\"], $widths, \"bottom\", \"square\");\n            }\n        }\n\n        $j = $cells[\"columns\"][0];\n        $left_col = $cellmap->get_column($j);\n\n        if (in_array($num_cols - 1, $cells[\"columns\"])) {\n            $draw_right = true;\n            $right_col = $cellmap->get_column($num_cols - 1);\n        } else {\n            $draw_right = false;\n        }\n\n        // Draw the vertical borders\n        foreach ($cells[\"rows\"] as $i) {\n            $bp = $cellmap->get_border_properties($i, $j);\n            $row = $cellmap->get_row($i);\n\n            $x = $table_x + $left_col[\"x\"] - $bp[\"left\"][\"width\"] / 2;\n            $y = $table_y + $row[\"y\"] - $bp[\"top\"][\"width\"] / 2;\n            $h = $row[\"height\"] + ($bp[\"top\"][\"width\"] + $bp[\"bottom\"][\"width\"]) / 2;\n\n            if ($bp[\"left\"][\"width\"] > 0) {\n                $widths = [\n                    (float)$bp[\"top\"][\"width\"],\n                    (float)$bp[\"right\"][\"width\"],\n                    (float)$bp[\"bottom\"][\"width\"],\n                    (float)$bp[\"left\"][\"width\"]\n                ];\n\n                $method = \"_border_\" . $bp[\"left\"][\"style\"];\n                $this->$method($x, $y, $h, $bp[\"left\"][\"color\"], $widths, \"left\", \"square\");\n            }\n\n            if ($draw_right) {\n                $bp = $cellmap->get_border_properties($i, $num_cols - 1);\n                if ($bp[\"right\"][\"width\"] <= 0) {\n                    continue;\n                }\n\n                $widths = [\n                    (float)$bp[\"top\"][\"width\"],\n                    (float)$bp[\"right\"][\"width\"],\n                    (float)$bp[\"bottom\"][\"width\"],\n                    (float)$bp[\"left\"][\"width\"]\n                ];\n\n                $x = $table_x + $right_col[\"x\"] + $right_col[\"used-width\"] + $bp[\"right\"][\"width\"] / 2;\n\n                $method = \"_border_\" . $bp[\"right\"][\"style\"];\n                $this->$method($x, $y, $h, $bp[\"right\"][\"color\"], $widths, \"right\", \"square\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/TableRowGroup.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Frame;\n\n/**\n * Renders block frames\n *\n * @package dompdf\n */\nclass TableRowGroup extends Block\n{\n\n    /**\n     * @param Frame $frame\n     */\n    function render(Frame $frame)\n    {\n        $style = $frame->get_style();\n\n        $this->_set_opacity($frame->get_opacity($style->opacity));\n\n        $border_box = $frame->get_border_box();\n\n        $this->_render_border($frame, $border_box);\n        $this->_render_outline($frame, $border_box);\n\n        $id = $frame->get_node()->getAttribute(\"id\");\n        if (strlen($id) > 0) {\n            $this->_canvas->add_named_dest($id);\n        }\n\n        $this->debugBlockLayout($frame, \"red\");\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer/Text.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @author  Helmut Tischer <htischer@weihenstephan.org>\n * @author  Fabien Ménager <fabien.menager@gmail.com>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf\\Renderer;\n\nuse Dompdf\\Adapter\\CPDF;\nuse Dompdf\\Frame;\n\n/**\n * Renders text frames\n *\n * @package dompdf\n */\nclass Text extends AbstractRenderer\n{\n    /** Thickness of underline. Screen: 0.08, print: better less, e.g. 0.04 */\n    const DECO_THICKNESS = 0.02;\n\n    //Tweaking if $base and $descent are not accurate.\n    //Check method_exists( $this->_canvas, \"get_cpdf\" )\n    //- For cpdf these can and must stay 0, because font metrics are used directly.\n    //- For other renderers, if different values are wanted, separate the parameter sets.\n    //  But $size and $size-$height seem to be accurate enough\n\n    /** Relative to bottom of text, as fraction of height */\n    const UNDERLINE_OFFSET = 0.0;\n\n    /** Relative to top of text */\n    const OVERLINE_OFFSET = 0.0;\n\n    /** Relative to centre of text. */\n    const LINETHROUGH_OFFSET = 0.0;\n\n    /** How far to extend lines past either end, in pt */\n    const DECO_EXTENSION = 0.0;\n\n    /**\n     * @param \\Dompdf\\FrameDecorator\\Text $frame\n     */\n    function render(Frame $frame)\n    {\n        $text = $frame->get_text();\n        if (trim($text) === \"\") {\n            return;\n        }\n\n        $style = $frame->get_style();\n        list($x, $y) = $frame->get_position();\n        $cb = $frame->get_containing_block();\n\n        if (($ml = $style->margin_left) === \"auto\" || $ml === \"none\") {\n            $ml = 0;\n        }\n\n        if (($pl = $style->padding_left) === \"auto\" || $pl === \"none\") {\n            $pl = 0;\n        }\n\n        if (($bl = $style->border_left_width) === \"auto\" || $bl === \"none\") {\n            $bl = 0;\n        }\n\n        $x += (float)$style->length_in_pt([$ml, $pl, $bl], $cb[\"w\"]);\n\n        $font = $style->font_family;\n        $size = $style->font_size;\n        $frame_font_size = $frame->get_dompdf()->getFontMetrics()->getFontHeight($font, $size);\n        $word_spacing = $frame->get_text_spacing() + (float)$style->length_in_pt($style->word_spacing);\n        $char_spacing = (float)$style->length_in_pt($style->letter_spacing);\n        $width = $style->width;\n\n        /*$text = str_replace(\n          array(\"{PAGE_NUM}\"),\n          array($this->_canvas->get_page_number()),\n          $text\n        );*/\n\n        $this->_canvas->text($x, $y, $text,\n            $font, $size,\n            $style->color, $word_spacing, $char_spacing);\n\n        $line = $frame->get_containing_line();\n\n        // FIXME Instead of using the tallest frame to position,\n        // the decoration, the text should be well placed\n        if (false && $line->tallest_frame) {\n            $base_frame = $line->tallest_frame;\n            $style = $base_frame->get_style();\n            $size = $style->font_size;\n        }\n\n        $line_thickness = $size * self::DECO_THICKNESS;\n        $underline_offset = $size * self::UNDERLINE_OFFSET;\n        $overline_offset = $size * self::OVERLINE_OFFSET;\n        $linethrough_offset = $size * self::LINETHROUGH_OFFSET;\n        $underline_position = -0.08;\n\n        if ($this->_canvas instanceof CPDF) {\n            $cpdf_font = $this->_canvas->get_cpdf()->fonts[$style->font_family];\n\n            if (isset($cpdf_font[\"UnderlinePosition\"])) {\n                $underline_position = $cpdf_font[\"UnderlinePosition\"] / 1000;\n            }\n\n            if (isset($cpdf_font[\"UnderlineThickness\"])) {\n                $line_thickness = $size * ($cpdf_font[\"UnderlineThickness\"] / 1000);\n            }\n        }\n\n        $descent = $size * $underline_position;\n        $base = $frame_font_size;\n\n        // Handle text decoration:\n        // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration\n\n        // Draw all applicable text-decorations.  Start with the root and work our way down.\n        $p = $frame;\n        $stack = [];\n        while ($p = $p->get_parent()) {\n            $stack[] = $p;\n        }\n\n        while (isset($stack[0])) {\n            $f = array_pop($stack);\n\n            if (($text_deco = $f->get_style()->text_decoration) === \"none\") {\n                continue;\n            }\n\n            $deco_y = $y; //$line->y;\n            $color = $f->get_style()->color;\n\n            switch ($text_deco) {\n                default:\n                    continue 2;\n\n                case \"underline\":\n                    $deco_y += $base - $descent + $underline_offset + $line_thickness / 2;\n                    break;\n\n                case \"overline\":\n                    $deco_y += $overline_offset + $line_thickness / 2;\n                    break;\n\n                case \"line-through\":\n                    $deco_y += $base * 0.7 + $linethrough_offset;\n                    break;\n            }\n\n            $dx = 0;\n            $x1 = $x - self::DECO_EXTENSION;\n            $x2 = $x + (float)$width + $dx + self::DECO_EXTENSION;\n            $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $line_thickness);\n        }\n\n        if ($this->_dompdf->getOptions()->getDebugLayout() && $this->_dompdf->getOptions()->getDebugLayoutLines()) {\n            $text_width = $this->_dompdf->getFontMetrics()->getTextWidth($text, $font, $size, $word_spacing, $char_spacing);\n            $this->_debug_layout([$x, $y, $text_width, $frame_font_size], \"orange\", [0.5, 0.5]);\n        }\n    }\n}\n"
  },
  {
    "path": "application/libraries/dompdf/src/Renderer.php",
    "content": "<?php\n/**\n * @package dompdf\n * @link    http://dompdf.github.com/\n * @author  Benj Carson <benjcarson@digitaljunkies.ca>\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n */\nnamespace Dompdf;\n\nuse Dompdf\\Renderer\\AbstractRenderer;\nuse Dompdf\\Renderer\\Block;\nuse Dompdf\\Renderer\\Image;\nuse Dompdf\\Renderer\\ListBullet;\nuse Dompdf\\Renderer\\TableCell;\nuse Dompdf\\Renderer\\TableRowGroup;\nuse Dompdf\\Renderer\\Text;\n\n/**\n * Concrete renderer\n *\n * Instantiates several specific renderers in order to render any given frame.\n *\n * @package dompdf\n */\nclass Renderer extends AbstractRenderer\n{\n\n    /**\n     * Array of renderers for specific frame types\n     *\n     * @var AbstractRenderer[]\n     */\n    protected $_renderers;\n\n    /**\n     * Cache of the callbacks array\n     *\n     * @var array\n     */\n    private $_callbacks;\n\n    /**\n     * Advance the canvas to the next page\n     */\n    function new_page()\n    {\n        $this->_canvas->new_page();\n    }\n\n    /**\n     * Render frames recursively\n     *\n     * @param Frame $frame the frame to render\n     */\n    public function render(Frame $frame)\n    {\n        global $_dompdf_debug;\n\n        $this->_check_callbacks(\"begin_frame\", $frame);\n\n        if ($_dompdf_debug) {\n            echo $frame;\n            flush();\n        }\n\n        $style = $frame->get_style();\n\n        if (in_array($style->visibility, [\"hidden\", \"collapse\"])) {\n            return;\n        }\n\n        $display = $style->display;\n\n        // Starts the CSS transformation\n        if ($style->transform && is_array($style->transform)) {\n            $this->_canvas->save();\n            list($x, $y) = $frame->get_padding_box();\n            $origin = $style->transform_origin;\n\n            foreach ($style->transform as $transform) {\n                list($function, $values) = $transform;\n                if ($function === \"matrix\") {\n                    $function = \"transform\";\n                }\n\n                $values = array_map(\"floatval\", $values);\n                $values[] = $x + (float)$style->length_in_pt($origin[0], (float)$style->length_in_pt($style->width));\n                $values[] = $y + (float)$style->length_in_pt($origin[1], (float)$style->length_in_pt($style->height));\n\n                call_user_func_array([$this->_canvas, $function], $values);\n            }\n        }\n\n        switch ($display) {\n\n            case \"block\":\n            case \"list-item\":\n            case \"inline-block\":\n            case \"table\":\n            case \"inline-table\":\n                $this->_render_frame(\"block\", $frame);\n                break;\n\n            case \"inline\":\n                if ($frame->is_text_node()) {\n                    $this->_render_frame(\"text\", $frame);\n                } else {\n                    $this->_render_frame(\"inline\", $frame);\n                }\n                break;\n\n            case \"table-cell\":\n                $this->_render_frame(\"table-cell\", $frame);\n                break;\n\n            case \"table-row-group\":\n            case \"table-header-group\":\n            case \"table-footer-group\":\n                $this->_render_frame(\"table-row-group\", $frame);\n                break;\n\n            case \"-dompdf-list-bullet\":\n                $this->_render_frame(\"list-bullet\", $frame);\n                break;\n\n            case \"-dompdf-image\":\n                $this->_render_frame(\"image\", $frame);\n                break;\n\n            case \"none\":\n                $node = $frame->get_node();\n\n                if ($node->nodeName === \"script\") {\n                    if ($node->getAttribute(\"type\") === \"text/php\" ||\n                        $node->getAttribute(\"language\") === \"php\"\n                    ) {\n                        // Evaluate embedded php scripts\n                        $this->_render_frame(\"php\", $frame);\n                    } elseif ($node->getAttribute(\"type\") === \"text/javascript\" ||\n                        $node->getAttribute(\"language\") === \"javascript\"\n                    ) {\n                        // Insert JavaScript\n                        $this->_render_frame(\"javascript\", $frame);\n                    }\n                }\n\n                // Don't render children, so skip to next iter\n                return;\n\n            default:\n                break;\n\n        }\n\n        // Starts the overflow: hidden box\n        if ($style->overflow === \"hidden\") {\n            $padding_box = $frame->get_padding_box();\n            [$x, $y, $w, $h] = $padding_box;\n            $style = $frame->get_style();\n\n            if ($style->has_border_radius()) {\n                $border_box = $frame->get_border_box();\n                [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $padding_box);\n                $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl);\n            } else {\n                $this->_canvas->clipping_rectangle($x, $y, $w, $h);\n            }\n        }\n\n        $stack = [];\n\n        foreach ($frame->get_children() as $child) {\n            // < 0 : negative z-index\n            // = 0 : no z-index, no stacking context\n            // = 1 : stacking context without z-index\n            // > 1 : z-index\n            $child_style = $child->get_style();\n            $child_z_index = $child_style->z_index;\n            $z_index = 0;\n\n            if ($child_z_index !== \"auto\") {\n                $z_index = intval($child_z_index) + 1;\n            } elseif ($child_style->float !== \"none\" || $child->is_positionned()) {\n                $z_index = 1;\n            }\n\n            $stack[$z_index][] = $child;\n        }\n\n        ksort($stack);\n\n        foreach ($stack as $by_index) {\n            foreach ($by_index as $child) {\n                $this->render($child);\n            }\n        }\n\n        // Ends the overflow: hidden box\n        if ($style->overflow === \"hidden\") {\n            $this->_canvas->clipping_end();\n        }\n\n        if ($style->transform && is_array($style->transform)) {\n            $this->_canvas->restore();\n        }\n\n        // Check for end frame callback\n        $this->_check_callbacks(\"end_frame\", $frame);\n    }\n\n    /**\n     * Check for callbacks that need to be performed when a given event\n     * gets triggered on a frame\n     *\n     * @param string $event the type of event\n     * @param Frame $frame  the frame that event is triggered on\n     */\n    protected function _check_callbacks($event, $frame)\n    {\n        if (!isset($this->_callbacks)) {\n            $this->_callbacks = $this->_dompdf->getCallbacks();\n        }\n\n        if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) {\n            $info = [0 => $this->_canvas, \"canvas\" => $this->_canvas,\n                1 => $frame, \"frame\" => $frame];\n            $fs = $this->_callbacks[$event];\n            foreach ($fs as $f) {\n                if (is_callable($f)) {\n                    if (is_array($f)) {\n                        $f[0]->{$f[1]}($info);\n                    } else {\n                        $f($info);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Render a single frame\n     *\n     * Creates Renderer objects on demand\n     *\n     * @param string $type type of renderer to use\n     * @param Frame $frame the frame to render\n     */\n    protected function _render_frame($type, $frame)\n    {\n\n        if (!isset($this->_renderers[$type])) {\n\n            switch ($type) {\n                case \"block\":\n                    $this->_renderers[$type] = new Block($this->_dompdf);\n                    break;\n\n                case \"inline\":\n                    $this->_renderers[$type] = new Renderer\\Inline($this->_dompdf);\n                    break;\n\n                case \"text\":\n                    $this->_renderers[$type] = new Text($this->_dompdf);\n                    break;\n\n                case \"image\":\n                    $this->_renderers[$type] = new Image($this->_dompdf);\n                    break;\n\n                case \"table-cell\":\n                    $this->_renderers[$type] = new TableCell($this->_dompdf);\n                    break;\n\n                case \"table-row-group\":\n                    $this->_renderers[$type] = new TableRowGroup($this->_dompdf);\n                    break;\n\n                case \"list-bullet\":\n                    $this->_renderers[$type] = new ListBullet($this->_dompdf);\n                    break;\n\n                case \"php\":\n                    $this->_renderers[$type] = new PhpEvaluator($this->_canvas);\n                    break;\n\n                case \"javascript\":\n                    $this->_renderers[$type] = new JavascriptEmbedder($this->_dompdf);\n                    break;\n\n            }\n        }\n\n        $this->_renderers[$type]->render($frame);\n    }\n}\n"
  },
  {
    "path": "application/libraries/exporters/ExcelExport.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n * ExcelExport class \n * For export invoices to excel file\n */\n\nclass ExcelExport\n{\n\n    private $from;\n    private $to;\n    private $invReadableTypes;\n    private $fsize;\n    private $CI;\n\n    public function __construct()\n    {\n        $this->CI = & get_instance();\n        $this->setInvTypes($this->CI->config->item('inv_readable_types'));\n    }\n\n    // wait for invoices array\n    public function getExcelFileFromInovoicesArray($invoices)\n    {\n        $this->generateExcel($invoices);\n    }\n\n    public function setDates($from, $to)\n    {\n        $this->from = $from;\n        $this->to = $to;\n    }\n\n    private function setInvTypes($invReadableTypes)\n    {\n        $this->invReadableTypes = $invReadableTypes;\n    }\n\n    private function generateExcel($invoices)\n    {\n        ob_clean();\n\n        require 'application/libraries/PHPExcel/PHPExcel.php';\n        $objPHPExcel = new PHPExcel();\n        $objPHPExcel->setActiveSheetIndex(0);\n        $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Invoice Number');\n        $objPHPExcel->getActiveSheet()->SetCellValue('B1', 'Invoice Type');\n        $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Client Name');\n        $objPHPExcel->getActiveSheet()->SetCellValue('D1', 'Client Address');\n        $objPHPExcel->getActiveSheet()->SetCellValue('E1', 'Client Bulstat/PIN');\n        $objPHPExcel->getActiveSheet()->SetCellValue('F1', 'Client Vat Number');\n        $objPHPExcel->getActiveSheet()->SetCellValue('G1', 'Client Accountable person');\n        $objPHPExcel->getActiveSheet()->SetCellValue('H1', 'Date of issue');\n        $objPHPExcel->getActiveSheet()->SetCellValue('I1', 'Date Tax Event');\n        $objPHPExcel->getActiveSheet()->SetCellValue('J1', 'Invoice Amount');\n        $objPHPExcel->getActiveSheet()->SetCellValue('K1', 'Discount');\n        $objPHPExcel->getActiveSheet()->SetCellValue('L1', 'Tax Base');\n        $objPHPExcel->getActiveSheet()->SetCellValue('M1', 'Vat Sum');\n        $objPHPExcel->getActiveSheet()->SetCellValue('N1', 'Total');\n        $objPHPExcel->getActiveSheet()->SetCellValue('O1', 'Currency');\n        $objPHPExcel->getActiveSheet()->SetCellValue('P1', 'Payment Type');\n        $objPHPExcel->getActiveSheet()->SetCellValue('Q1', 'Payment status');\n        $objPHPExcel->getActiveSheet()->SetCellValue('R1', 'Compiled');\n        $objPHPExcel->getActiveSheet()->SetCellValue('S1', 'Sended');\n        $objPHPExcel->getActiveSheet()->SetCellValue('T1', 'Received');\n        $objPHPExcel->getActiveSheet()->SetCellValue('U1', 'Date of receive');\n        $objPHPExcel->getActiveSheet()->SetCellValue('V1', 'Return reason');\n        $objPHPExcel->getActiveSheet()->SetCellValue('W1', 'Date created');\n        $objPHPExcel->getActiveSheet()->SetCellValue('X1', 'Vat Reason');\n        $objPHPExcel->getActiveSheet()->SetCellValue('Y1', 'Remarks');\n        $objPHPExcel->getActiveSheet()->SetCellValue('Z1', 'Maturity date');\n        foreach (range('A', 'Z') as $columnID) {\n            $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);\n        }\n        $objPHPExcel->getActiveSheet()->getStyle('A1:Z1')->getFont()->setBold(true);\n\n        $i = 2;\n        foreach ($invoices as $invoice) {\n            $objPHPExcel->getActiveSheet()->SetCellValue('A' . $i, $invoice['inv_number']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('B' . $i, $this->invReadableTypes[$invoice['inv_type']]);\n            $objPHPExcel->getActiveSheet()->SetCellValue('C' . $i, $invoice['client']['client_name']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('D' . $i, $invoice['client']['client_address']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('E' . $i, $invoice['client']['is_to_person'] != 1 ? $invoice['client']['client_bulstat'] : $invoice['client']['client_ident_num']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('F' . $i, $invoice['client']['vat_number']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('G' . $i, $invoice['client']['accountable_person']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('H' . $i, date('d.m.Y', $invoice['date_create']));\n            $objPHPExcel->getActiveSheet()->SetCellValue('I' . $i, date('d.m.Y', $invoice['date_tax_event']));\n            $objPHPExcel->getActiveSheet()->SetCellValue('J' . $i, $invoice['invoice_amount']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('K' . $i, $invoice['discount']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('L' . $i, $invoice['tax_base']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('M' . $i, $invoice['vat_sum']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('N' . $i, $invoice['final_total']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('O' . $i, $invoice['inv_currency']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('P' . $i, $invoice['payment_method']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('Q' . $i, $invoice['payment_status']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('R' . $i, $invoice['composed']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('S' . $i, $invoice['status'] == 'sended' || $invoice['status'] == 'received' ? 1 : 0);\n            $objPHPExcel->getActiveSheet()->SetCellValue('T' . $i, $invoice['status'] == 'received' ? 1 : 0);\n            $objPHPExcel->getActiveSheet()->SetCellValue('U' . $i, $invoice['date_received'] != 0 ? date('d.m.Y', $invoice['date_received']) : '');\n            $objPHPExcel->getActiveSheet()->SetCellValue('V' . $i, $invoice['return_reason']);\n            $objPHPExcel->getActiveSheet()->SetCellValue('W' . $i, date('d.m.Y', $invoice['created']));\n            $objPHPExcel->getActiveSheet()->SetCellValue('X' . $i, html_entity_decode($invoice['no_vat_reason']));\n            $objPHPExcel->getActiveSheet()->SetCellValue('Y' . $i, html_entity_decode($invoice['remarks']));\n            $objPHPExcel->getActiveSheet()->SetCellValue('Z' . $i, $invoice['have_maturity_date'] == 1 ? date('d.m.Y', $invoice['maturity_date']) : '');\n            $i++;\n        }\n\n        $exW = new PHPExcel_Writer_Excel5($objPHPExcel);\n        $tmpname = tempnam(\"/tmp\", \"EXCEL_\");\n        if ($tmpname === false) {\n            log_message('error', 'Was not able to generate a temporary file for excel export in system /tmp for user - ' . print_r($_SESSION['user_login'], true));\n        }\n        $exW->save($tmpname);\n        $this->fsize = filesize($tmpname);\n\n        $this->getXmlHeaders();\n\n        readfile($tmpname);\n        unlink($tmpname);\n        exit;\n    }\n\n    private function getXmlHeaders()\n    {\n        $filename = 'export_invoices.xls';\n        if ($this->from != null && $this->to != null) {\n            $this->from = date('d.m.Y', $this->from);\n            $this->to = date('d.m.Y', $this->to);\n            $filename = 'export_invoices_from_' . $this->from . '_to_' . $this->to . '.xls';\n        }\n        header(\"Pragma: public\");\n        header(\"Expires: 0\");\n        header(\"Cache-Control: must-revalidate, post-check=0, pre-check=0\");\n        header(\"Cache-Control: public\");\n        header(\"Content-Description: File Transfer\");\n        header(\"Content-Type: application/octet-stream\");\n        header(\"Content-Disposition: attachment; filename=\\\"\" . $filename . \"\\\"\");\n        header(\"Content-Transfer-Encoding: binary\");\n        header(\"Content-Length: \" . $this->fsize);\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/exporters/XmlExport.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n * XmlExport class \n * For export invoices to xml file\n */\n\nclass XmlExport\n{\n\n    private $from;\n    private $to;\n    private $invReadableTypes;\n\n    public function __construct()\n    {\n        $this->CI = & get_instance();\n        $this->setInvTypes($this->CI->config->item('inv_readable_types'));\n    }\n\n    // wait for invoices array\n    public function getXmlFileFromInvoicesArray($invoices)\n    {\n        $this->getXmlStructure($invoices);\n    }\n\n    public function setDates($from, $to)\n    {\n        $this->from = $from;\n        $this->to = $to;\n    }\n\n    private function setInvTypes($invReadableTypes)\n    {\n        $this->invReadableTypes = $invReadableTypes;\n    }\n\n    private function getXmlStructure($invoices)\n    {\n        ob_clean();\n        $this->getXmlHeaders();\n\n\n\n        echo '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<invoices>';\n        foreach ($invoices as $invoice) {\n            ?>\n            <invoice>\n                <type><?= $this->invReadableTypes[$invoice['inv_type']] ?></type>\n                <status><?= $invoice['status'] ?></status>\n                <number><?= $invoice['inv_number'] ?></number>\n                <currency><?= $invoice['inv_currency'] ?></currency>\n                <created><?= $invoice['date_create'] ?></created>\n                <tax_event_date><?= $invoice['date_tax_event'] ?></tax_event_date>\n                <cash_accounting><?= $invoice['cash_accounting'] ?></cash_accounting>\n                <have_maturity_date><?= $invoice['have_maturity_date'] ?></have_maturity_date>\n                <maturity_date><?= $invoice['maturity_date'] ?></maturity_date>\n                <remarks><?= htmlspecialchars($invoice['remarks'], ENT_XML1, 'UTF-8') ?></remarks>\n                <payment_method><?= $invoice['payment_method'] ?></payment_method>\n                <payment_status><?= $invoice['payment_status'] ?></payment_status>\n                <to_inv_number><?= $invoice['to_inv_number'] ?></to_inv_number>\n                <to_inv_date><?= $invoice['to_inv_date'] ?></to_inv_date>\n                <invoice_amount><?= $invoice['invoice_amount'] ?></invoice_amount>\n                <discount><?= $invoice['discount'] ?></discount>\n                <discount_type><?= $invoice['discount_type'] ?></discount_type>\n                <tax_base><?= $invoice['tax_base'] ?></tax_base>\n                <vat_percent><?= $invoice['vat_percent'] ?></vat_percent>\n                <vat_sum><?= $invoice['vat_sum'] ?></vat_sum>\n                <no_vat><?= $invoice['no_vat'] ?></no_vat>\n                <no_vat_reason><?= htmlspecialchars($invoice['no_vat_reason'], ENT_XML1, 'UTF-8') ?></no_vat_reason>\n                <final_total><?= $invoice['final_total'] ?></final_total>\n                <composed><?= $invoice['composed'] ?></composed>\n                <schiffer><?= $invoice['schiffer'] ?></schiffer> \n                <firm>\n                    <name><?= $invoice['firm']['name'] ?></name>\n                    <bulstat><?= $invoice['firm']['bulstat'] ?></bulstat>\n                    <address><?= $invoice['firm']['address'] ?></address>\n                    <city><?= $invoice['firm']['city'] ?></city>\n                    <accountable_person><?= $invoice['firm']['accountable_person'] ?></accountable_person>\n                </firm>\n                <client>\n                    <name><?= htmlspecialchars($invoice['client']['client_name'], ENT_XML1, 'UTF-8') ?></name>\n                    <is_person><?= $invoice['client']['is_to_person'] ?></is_person>\n                    <bulstat><?= $invoice['client']['client_bulstat'] ?></bulstat> \n                    <is_client_vat_registered><?= $invoice['client']['client_vat_registered'] ?></is_client_vat_registered> \n                    <vat_number><?= $invoice['client']['vat_number'] ?></vat_number> \n                    <client_ident_num><?= $invoice['client']['client_ident_num'] ?></client_ident_num>\n                    <client_address><?= htmlspecialchars($invoice['client']['client_address'], ENT_XML1, 'UTF-8') ?></client_address>\n                    <client_city><?= $invoice['client']['client_city'] ?></client_city>\n                    <client_country><?= $invoice['client']['client_country'] ?></client_country>\n                    <accountable_person><?= $invoice['client']['accountable_person'] ?></accountable_person>\n                    <recipient_name><?= $invoice['client']['accountable_person'] ?></recipient_name>\n                </client>\n                <items>\n                    <?php foreach ($invoice['items'] as $item) { ?>\n                        <item>\n                            <name><?= htmlspecialchars($item['name'], ENT_XML1, 'UTF-8') ?></name>\n                            <quantity><?= $item['quantity'] ?></quantity>\n                            <quantity_type><?= $item['quantity_type'] ?></quantity_type>\n                            <single_price><?= $item['single_price'] ?></single_price>\n                            <total_price><?= $item['total_price'] ?></total_price>\n                            <position><?= $item['position'] ?></position>\n                        </item>\n                    <?php } ?>\n                </items>\n            </invoice>\n            <?php\n        }\n        echo '</invoices>';\n        exit();\n    }\n\n    private function getXmlHeaders()\n    {\n        $filename = 'export_invoices.xml';\n        if ($this->from != null && $this->to != null) {\n            $this->from = date('d.m.Y', $this->from);\n            $this->to = date('d.m.Y', $this->to);\n            $filename = 'export_invoices_from_' . $this->from . '_to_' . $this->to . '.xml';\n        }\n        header('Content-Type: application/xml; charset=UTF-8');\n        header('Content-Disposition: attachment; filename=' . $filename);\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/importers/UniversalXmlImport.php",
    "content": "<?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/*\n * UniversalXmlImport class\n */\n\nclass UniversalXmlImport\n{\n\n    private $CI;\n    private $invoicesForImport = array();\n    private $invReadableTypes;\n\n    public function __construct()\n    {\n        $this->CI = & get_instance();\n        $this->setInvTypes($this->CI->config->item('inv_readable_types'));\n        $this->CI->load->model(array('NewInvoiceModel', 'ImportExportModel', 'ManagefirmsModel'));\n    }\n\n    private function setInvTypes($invReadableTypes)\n    {\n        $this->invReadableTypes = $invReadableTypes;\n    }\n\n    public function importFile($file)\n    {\n        $xmlobj = simplexml_load_file($file);\n        if ($xmlobj === false) {\n            $this->CI->session->set_flashdata('resultAction', lang('try_to_import_wrong_file_format'));\n            redirect(lang_url('user/import-export'));\n        }\n        $this->parseObject($xmlobj);\n        // Save Inoivces\n        $this->CI->ImportExportModel->setInvoicesFromImport($this->invoicesForImport);\n        // Return to view\n        return $this->invoicesForImport;\n    }\n\n    private function parseObject($xmlobj)\n    {\n        $invTypesKeys = array_flip($this->invReadableTypes);\n\n        $errors = array();\n        // check for head note\n        if (!isset($xmlobj->invoice)) {\n            $this->CI->session->set_flashdata('resultAction', lang('no_invoice_note_in_xml_import'));\n            redirect(lang_url('user/import-export'));\n        }\n\n        /*\n         * Lets parse\n         * And check for errоrs\n         */\n        $row = 1;\n        foreach ($xmlobj->invoice as $invoice) {\n            $errors = array();\n            $inv = array();\n\n            if (!in_array($invoice->type, $this->invReadableTypes)) {\n                $errors[] = lang('imp_invalid_inv_type');\n            }\n\n            $isFreeNumber = $this->CI->NewInvoiceModel->checkIsFreeInvoiceNumber((string) $invoice->number, $invTypesKeys[(string) $invoice->type]);\n            if ($isFreeNumber === false) {\n                $errors[] = lang('imp_inv_number_taken');\n            }\n\n            if (!isset($invoice->created) || strtotime(date('d.m.Y', (string) $invoice->created)) == false) {\n                $errors[] = lang('imp_wrong_date_created');\n            }\n\n\n            if (!isset($invoice->tax_event_date) || strtotime(date('d.m.Y', (string) $invoice->tax_event_date)) == false) {\n                $errors[] = lang('imp_wrong_date_tax_event');\n            }\n\n            if (!isset($invoice->have_maturity_date) || $invoice->have_maturity_date == 1) {\n                if (!isset($invoice->maturity_date) || strtotime(date('d.m.Y', (string) $invoice->maturity_date)) == false) {\n                    $errors[] = lang('imp_wrong_date_maturity');\n                }\n            }\n\n            if ($invTypesKeys[(string) $invoice->type] == 'debit' || $invTypesKeys[(string) $invoice->type] == 'credit') {\n                if (!isset($invoice->to_inv_date) || strtotime(date('d.m.Y', (string) $invoice->to_inv_date)) == false) {\n                    $errors[] = lang('imp_to_inv_date_wrong');\n                }\n            }\n\n            if (!isset($invoice->client->name) || mb_strlen((string) $invoice->client->name) == 0) {\n                $errors[] = lang('imp_no_client_name');\n            }\n\n            if (!isset($invoice->client->client_address) || mb_strlen((string) $invoice->client->client_address) == 0) {\n                $errors[] = lang('imp_no_client_addr');\n            }\n\n            if (!isset($invoice->items->item)) {\n                $errors[] = lang('imp_no_items');\n            } else {\n                $rowItem = 1;\n                foreach ($invoice->items->item as $item) {\n                    if (mb_strlen((string) $item->name) == 0) {\n                        $errors[] = str_replace('%rowNum%', $rowItem, lang('imp_no_item_name'));\n                    }\n                    if ((float) $item->quantity == 0 || mb_strlen((string) $item->quantity) == 0) {\n                        $errors[] = str_replace('%rowNum%', $rowItem, lang('imp_no_item_quantity'));\n                    }\n                    $rowItem ++;\n                }\n            }\n\n            /*\n             * Error checks finish\n             * Now Push all to inv array\n             */\n            $inv['inv_type'] = $invTypesKeys[(string) $invoice->type];\n            $inv['status'] = (string) $invoice->status;\n            $inv['inv_number'] = (string) $invoice->number;\n            $inv['inv_currency'] = (string) $invoice->currency;\n            $inv['created'] = (string) $invoice->created;\n            $inv['tax_event_date'] = (string) $invoice->tax_event_date;\n            $inv['cash_accounting'] = (int) $invoice->cash_accounting == 1 ? 1 : 0;\n            $inv['have_maturity_date'] = (int) $invoice->have_maturity_date == 1 ? 1 : 0;\n            $inv['maturity_date'] = (string) $invoice->maturity_date;\n            $inv['remarks'] = (string) $invoice->remarks;\n            $inv['payment_method'] = (string) $invoice->payment_method;\n            $inv['payment_status'] = (string) $invoice->payment_status;\n            $inv['to_inv_number'] = (int) $invoice->to_inv_number;\n            $inv['to_inv_date'] = (int) $invoice->to_inv_date;\n            $inv['invoice_amount'] = (float) $invoice->invoice_amount;\n            $inv['discount'] = (float) $invoice->discount;\n            $inv['discount_type'] = (string) $invoice->discount_type;\n            $inv['tax_base'] = (float) $invoice->tax_base;\n            $inv['vat_percent'] = (float) $invoice->vat_percent;\n            $inv['vat_sum'] = (float) $invoice->vat_sum;\n            $inv['no_vat'] = (int) $invoice->no_vat == 1 ? 1 : 0;\n            $inv['no_vat_reason'] = (string) $invoice->no_vat_reason;\n            $inv['final_total'] = (float) $invoice->final_total;\n            $inv['userInfo']['employee']['name'] = 'aasd';\n            $inv['userInfo']['employee']['schiffer'] = (string) $invoice->schiffer;\n            $inv['client_name'] = (string) $invoice->client->name;\n            $inv['is_person'] = (int) $invoice->client->is_person == 1 ? 1 : 0;\n            $inv['client_bulstat'] = (string) $invoice->client->bulstat;\n            $inv['client_vat_registered'] = (int) $invoice->client->is_client_vat_registered == 1 ? 1 : 0;\n            $inv['vat_number'] = (string) $invoice->client->vat_number;\n            $inv['client_ident_num'] = (string) $invoice->client->client_ident_num;\n            $inv['client_address'] = (string) $invoice->client->client_address;\n            $inv['client_city'] = (string) $invoice->client->client_city;\n            $inv['client_country'] = (string) $invoice->client->client_country;\n            $inv['accountable_person'] = (string) $invoice->client->accountable_person;\n            $inv['recipient_name'] = (string) $invoice->client->recipient_name;\n            $rowTrans = $this->CI->ManagefirmsModel->getMyCompanyDefaultTranslation(SELECTED_COMPANY_ID);\n            $inv['invoice_firm_translation'] = $rowTrans['id'];\n            $inv['invoice_translation'] = (int) $invoice->inv_lang;\n\n            if (isset($invoice->items->item)) {\n                $i = 0;\n                $ii = 1;\n                foreach ($invoice->items->item as $item) {\n                    $inv['item_from_list'][$i] = $ii;\n                    $inv['is_item_update'][$i] = 0;\n                    $inv['items_names'][$i] = (string) $item->name;\n                    $inv['items_quantities'][$i] = (float) $item->quantity;\n                    $inv['items_quantity_types'][$i] = (string) $item->quantity_type;\n                    $inv['items_prices'][$i] = (float) $item->single_price;\n                    $inv['items_totals'][$i] = (float) $item->total_price;\n                    $i++;\n                    $ii++;\n                }\n            }\n            $this->invoicesForImport[$row]['inv'] = $inv;\n            $this->invoicesForImport[$row]['errors'] = $errors;\n            $row ++;\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/libraries/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/models/PublicModel.php",
    "content": "<?php\n\nclass PublicModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function getOneLanguage($myLang)\n    {\n        $this->db->select('*');\n        $this->db->where('abbr', $myLang);\n        $result = $this->db->get('languages');\n        return $result->row_array();\n    }\n\n    public function checkUserFreeEmail($email)\n    {\n        $this->db->where('enabled', 1);\n        $this->db->where('email', $email);\n        $num = $this->db->count_all_results('users');\n        if ($num > 0) {\n            return lang('registered_by_user');\n        }\n        return true;\n    }\n\n    public function registerUser($post)\n    {\n        $this->db->trans_begin();\n        if (!$this->db->insert('users', array(\n                    'email' => $post['email'],\n                    'password' => password_hash($post['password'], PASSWORD_DEFAULT),\n                    'ip_address' => $post['ip_address'],\n                    'time_registered' => time()\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        $user_id = $this->db->insert_id();\n        $this->insertOptionsTables($user_id);\n        $this->addFirstFreePlan($user_id);\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            return false;\n        } else {\n            $this->db->trans_commit();\n            return true;\n        }\n\n        return false;\n    }\n\n    /*\n     * Default system options for every user\n     * they are named - value stores\n     */\n\n    private function insertOptionsTables($user_id)\n    {\n        $data = array(\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_invRoundTo',\n                'value' => '2'\n            ),\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_invCalculator',\n                'value' => '1'\n            ),\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_pagination',\n                'value' => '20'\n            ),\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_movementRoundTo',\n                'value' => '2'\n            ),\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_movementCalculator',\n                'value' => '1'\n            ),\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_negativeQuantities',\n                'value' => '1'\n            )\n            ,\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_protocolCalculator',\n                'value' => '1'\n            )\n            ,\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_protocolRoundTo',\n                'value' => '1'\n            ),\n            array(\n                'for_user' => $user_id,\n                '_key' => 'opt_invTemplate',\n                'value' => 'creative'\n            )\n        );\n        if (!$this->db->insert_batch('value_store', $data)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    /*\n     * Add first free plan when register\n     */\n\n    public function addFirstFreePlan($user_id)\n    {\n        if (!$this->db->insert('firms_plans', array(\n                    'for_user' => $user_id,\n                    'from_date' => time(),\n                    'to_date' => strtotime(\"+1 month\", time()),\n                    'plan_type' => 'PRO',\n                    'num_invoices' => 3000,\n                    'num_firms' => 10,\n                    'time' => time(),\n                    'sponsored' => 1\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    public function getUserInfoFromEmail($email, $type)\n    {\n        $array = array();\n        /*\n         * if is logged employee\n         * return data for user and for employee\n         * else return data only for user\n         */\n        if ($type == 2) {\n            $this->db->where('enabled', 1);\n            $this->db->where('email', $email);\n            $result = $this->db->get('employees');\n            $array['employee'] = $result->row_array();\n\n            $this->db->where('enabled', 1);\n            $this->db->where('id', $array['employee']['for_user']);\n            $result = $this->db->get('users');\n            $array['user'] = $result->row_array();\n        } else {\n            $this->db->where('enabled', 1);\n            $this->db->where('email', $email);\n            $result = $this->db->get('users');\n            $array['user'] = $result->row_array();\n        }\n        return $array;\n    }\n\n    /*\n     * RETURN TYPES EXPLAIN\n     * 1 is user\n     * 2 is employee\n     * 3 is both \n     */\n\n    public function loginCheck($post)\n    {\n        $this->db->select('password');\n        $this->db->where('enabled', 1);\n        $this->db->where('email', $post['email']);\n        $resultUsers = $this->db->get('users');\n        $rows = $resultUsers->result_array();\n        $numUsers = 0;\n        foreach ($rows as $row) {\n            if (password_verify($post['password'], $row['password'])) {\n                $numUsers++;\n            }\n        }\n\n        $this->db->select('password');\n        $this->db->where('enabled', 1);\n        $this->db->where('email', $post['email']);\n        $resultEmployees = $this->db->get('employees');\n        $rows = $resultEmployees->result_array();\n        $numEmployees = 0;\n        foreach ($rows as $row) {\n            if (password_verify($post['password'], $row['password'])) {\n                $numEmployees++;\n            }\n        }\n\n        if ($numUsers > 0 && $numEmployees > 0) {\n            return 3;\n        }\n        if ($numEmployees > 0 && $numUsers == 0) {\n            return 2;\n        }\n        if ($numUsers > 0 && $numEmployees == 0) {\n            return 1;\n        }\n        return false;\n    }\n\n    public function getValueStores()\n    {\n        $query = $this->db->query(\"SELECT _key, value FROM value_store WHERE for_user=\" . USER_ID . \"\");\n        $result = $query->result_array();\n        if (empty($result)) {\n            return null;\n        }\n        $arr = array();\n        foreach ($result as $res) {\n            $arr[$res['_key']] = $res['value'];\n        }\n        return $arr;\n    }\n\n    public function getOneValueStore($key, $userId)\n    {\n        $query = $this->db->query(\"SELECT value FROM value_store WHERE _key = '$key' AND for_user = \" . $userId . \"\");\n        $result = $query->row_array();\n        if (empty($result)) {\n            return null;\n        }\n        return $result['value'];\n    }\n\n    public function getInvoiceForAccept($userId, $uniqid)\n    {\n        $this->db->select('inv_type, inv_number');\n        $this->db->where('for_user', $userId);\n        $this->db->where('uniqid', $uniqid);\n        $this->db->limit(1);\n        $result = $this->db->get('invoices');\n        return $result->row_array();\n    }\n\n    public function setInvoiceLog($invId, $action, $info = '')\n    {\n        $result = $this->db->query(\"INSERT DELAYED INTO invoices_logs (invoice_id, action, info, time) VALUES ($invId, '$action', '\" . $this->db->escape_str($info) . \"', \" . time() . \")\");\n        if ($result != true) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/models/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/modules/admin/controllers/home/Home.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Home extends ADMIN_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('HomeModel');\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = 'Administration - Home';\n        $this->render('home/index', $head, $data);\n        $this->saveHistory('Go to home page');\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/controllers/home/Login.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Login extends ADMIN_Controller\n{\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = 'Administration - Login';\n        if ($this->session->userdata('logged_in')) {\n            redirect('admin/home');\n        } else {\n            if (isset($_POST['username'])) {\n                $result = $this->GeneralAdminModel->loginCheck($_POST);\n                if (!empty($result)) {\n                    $result['image'] = 'assets/admin/imgs/no-profile-image.jpg';\n                    if (is_file('attachments/adminsprofileimages/' . $result['image'])) {\n                        $result['image'] = 'attachments/adminsprofileimages/' . $result['image'];\n                    }\n                    $_SESSION['logged_user_info'] = $result;\n                    $this->session->set_userdata('logged_in', $result['username']);\n                    $this->saveHistory('Logged in');\n                    redirect('admin/home');\n                } else {\n                    $this->saveHistory('Cant login with - username: ' . $_POST['username']);\n                    $this->session->set_flashdata('err_login', 'Invalid username or password!');\n                    redirect('admin');\n                }\n            }\n        }\n        $this->load->view('parts/login/header', $head);\n        $this->load->view('home/login', $data);\n        $this->load->view('parts/login/footer');\n    }\n\n    public function logOut()\n    {\n        $this->saveHistory('Logout in');\n        $this->session->sess_destroy();\n        redirect('admin');\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/controllers/plans/Requests.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Requests extends ADMIN_Controller\n{\n\n    private $num_rows = 20;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('RequestsModel');\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        if (isset($_GET['activate'])) {\n            $this->activatePaymentRequest($_GET['activate']);\n        }\n        $head['title'] = 'Administration - Requests';\n        $data['requests'] = $this->RequestsModel->getRequests($this->num_rows, $page);\n        $rowscount = $this->RequestsModel->requestsCount();\n        $data['links_pagination'] = pagination('admin/plans/requests', $rowscount, $this->num_rows, 4);\n        $data['defaultPlans'] = $this->config->item('plans');\n        $this->render('plans/requests', $head, $data);\n        $this->saveHistory('Go to plans->requests');\n    }\n\n    private function activatePaymentRequest($id)\n    {\n        $this->RequestsModel->activateRequestId($id);\n        $this->saveHistory('Activate payment request id - ' . $id);\n        redirect(base_url('admin/plans/requests'));\n    }\n\n    public function custom()\n    {\n        $data = array();\n        $head = array();\n        if (isset($_GET['activate'])) {\n            $this->RequestsModel->setIndividualPlan($_GET['activate'], $_GET['price'], $_GET['for_user']);\n        }\n        if (isset($_GET['reject'])) {\n            $this->RequestsModel->rejectIndividualPlanRequest($_GET['reject']);\n        }\n        $head['title'] = 'Administration - Custom Plan Requests';\n        $data['requests'] = $this->RequestsModel->getCustomPlanRequests($this->num_rows, $page);\n        $rowscount = $this->RequestsModel->customPlanRequestsCount();\n        $data['links_pagination'] = pagination('admin/plans/individual/request', $rowscount, $this->num_rows, 5);\n        $this->render('plans/individual_plan_requests', $head, $data);\n        $this->saveHistory('Go to plans->requests->custom plan');\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/models/GeneralAdminModel.php",
    "content": "<?php\n\nclass GeneralAdminModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function loginCheck($values)\n    {\n        $this->db->where('username', $values['username']);\n        $result = $this->db->get('admin_users');\n        $res_arr = $result->row_array();\n        if (empty($res_arr)) {\n            return null;\n        }\n        $storedPassword = $res_arr['password'];\n        $isValid = false;\n        if (password_verify($values['password'], $storedPassword)) {\n            $isValid = true;\n        } elseif (strlen($storedPassword) === 32 && $storedPassword === md5($values['password'])) {\n            // Legacy MD5 — upgrade to bcrypt on successful login\n            $isValid = true;\n            $newHash = password_hash($values['password'], PASSWORD_DEFAULT);\n            $this->db->where('id', $res_arr['id'])->update('admin_users', array('password' => $newHash));\n        }\n        if ($isValid) {\n            if (!$this->db->where('id', $res_arr['id'])->update('admin_users', array('last_login' => time()))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n            return $res_arr;\n        }\n        return null;\n    }\n\n    public function setHistory($activity, $username, $id)\n    {\n        if (!$this->db->insert('history', array('activity' => $activity, 'user_id' => $id, 'username' => $username, 'time' => time()))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setValueStore($post)\n    {\n        if (!$this->db->where('v_key', $post['v_key'])->update('value_store', array('value' => $post['value']))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/models/HomeModel.php",
    "content": "<?php\n\nclass HomeModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/models/LanguagesModel.php",
    "content": "<?php\n\nclass LanguagesModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function getLanguages()\n    {\n        $query = $this->db->query('SELECT * FROM languages');\n        return $query;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/models/RequestsModel.php",
    "content": "<?php\n\nclass RequestsModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function getRequests($limit, $page)\n    {\n        $this->db->select('firms_payment_requests.*, individual_plans.price');\n        $this->db->where('status', 0);\n        $this->db->join('individual_plans', 'individual_plans.for_user = firms_payment_requests.for_user', 'left');\n        $query = $this->db->get('firms_payment_requests', $limit, $page);\n        return $query->result_array();\n    }\n\n    public function requestsCount()\n    {\n        $this->db->where('status', 0);\n        return $this->db->count_all_results('firms_payment_requests');\n    }\n\n    public function activateRequestId($id)\n    {\n        $this->db->trans_begin();\n        $this->db->where('id', $id);\n        $this->db->update('firms_payment_requests', array(\n            'status' => 2,\n            'date_activated' => time()\n        ));\n\n        $this->db->where('id', $id);\n        $result = $this->db->get('firms_payment_requests');\n        $row = $result->row_array();\n\n        if ($row['plan_type'] == 'CUSTOM') {\n            $this->db->where('for_user', $row['for_user']);\n            $result = $this->db->get('individual_plans');\n            $rowPlan = $result->row_array();\n        } else {\n            $plansArray = $this->config->item('plans');\n            $rowPlan = $plansArray[$row['plan_type']];\n        }\n\n        $toDate = strtotime(\"+\" . $row['plan_period'] . \" month\", time());\n        if ($row['plan_type'] == 'PRO') {\n            $toDate = strtotime(\"+1 month\", $toDate);\n        }\n        $this->db->insert('firms_plans', array(\n            'for_user' => $row['for_user'],\n            'from_date' => time(),\n            'to_date' => $toDate,\n            'plan_type' => $row['plan_type'],\n            'num_invoices' => $row['plan_type'] == 'CUSTOM' ? $rowPlan['num_invoices'] : $rowPlan['NUM_INVOICES'],\n            'num_firms' => $row['plan_type'] == 'CUSTOM' ? $rowPlan['num_firms'] : $rowPlan['NUM_FIRMS'],\n            'time' => time()\n        ));\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function customPlanRequestsCount()\n    {\n        $this->db->where('status', 0);\n        return $this->db->count_all_results('cusom_plan_requests');\n    }\n\n    public function getCustomPlanRequests($limit, $page)\n    {\n        $this->db->where('status', 0);\n        $query = $this->db->get('cusom_plan_requests', $limit, $page);\n        return $query->result_array();\n    }\n\n    public function setIndividualPlan($id, $price, $for_user)\n    {\n        $this->db->trans_begin();\n        $this->db->where('id', $id);\n        $this->db->where('status', 0);\n        $this->db->update('cusom_plan_requests', array(\n            'status' => 2\n        ));\n\n        $this->db->where('id', $id);\n        $query = $this->db->get('cusom_plan_requests');\n        $customReq = $query->row_array();\n\n        $this->db->where('for_user', $for_user);\n        $numIndividual = $this->db->count_all_results('individual_plans');\n        if ($numIndividual > 0) {\n            $this->db->where('for_user', $for_user);\n            $this->db->update('individual_plans', array(\n                'num_invoices' => $customReq['invoices'],\n                'num_firms' => $customReq['companies'],\n                'price' => $price\n            ));\n        } else {\n            $this->db->insert('individual_plans', array(\n                'for_user' => $for_user,\n                'num_invoices' => $customReq['invoices'],\n                'num_firms' => $customReq['companies'],\n                'price' => $price\n            ));\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function rejectIndividualPlanRequest($id)\n    {\n        $this->db->where('id', $id);\n        if (!$this->db->update('cusom_plan_requests', array(\n                    'status' => 2\n                ))) {\n            show_error(lang('database_error'));\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/admin/views/home/index.php",
    "content": ""
  },
  {
    "path": "application/modules/admin/views/home/login.php",
    "content": "<div class=\"top-content\">\n    <div id=\"output\">       \n        <?php\n        if ($this->session->flashdata('err_login')) {\n            ?>\n            <div class=\"alert alert-danger\"><?= $this->session->flashdata('err_login') ?></div>\n            <?php\n        }\n        ?>\n    </div>\n    <div class=\"inner-bg\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-sm-8 col-sm-offset-2 text\">\n                    <h1><strong>INVOICEPRO</strong> Administration</h1> \n                </div>\n            </div>\n            <div class=\"row\">\n                <div class=\"col-sm-6 col-sm-offset-3 form-box\">\n                    <div class=\"form-top\">\n                        <div class=\"form-top-left\">\n                            <h3>Login to administration</h3>\n                            <p>Enter your username and password to log on:</p>\n                        </div>\n                        <div class=\"form-top-right\">\n                            <i class=\"fa fa-lock\"></i>\n                        </div>\n                    </div>\n                    <div class=\"form-bottom\">\n                        <form role=\"form\" action=\"\" method=\"post\" class=\"login-form\">\n                            <div class=\"form-group\">\n                                <label class=\"sr-only\" for=\"form-username\">Username</label>\n                                <input required type=\"text\" name=\"username\" placeholder=\"Username...\" class=\"form-username form-control\" id=\"form-username\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"sr-only\" for=\"form-password\">Password</label>\n                                <input required type=\"password\" name=\"password\" placeholder=\"Password...\" class=\"form-password form-control\" id=\"form-password\">\n                            </div>\n                            <button type=\"submit\" class=\"btn\">Sign in!</button>\n                        </form>\n                    </div>\n                </div>\n            </div> \n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/admin/views/parts/general/footer.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?> \n<script src=\"<?= base_url('assets/bootstrap/js/bootstrap.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/admin/js/general.js') ?>\"></script>\n<script>\n    (function() {\n        var csrfName = '<?= $this->security->get_csrf_token_name() ?>';\n        var csrfHash = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content');\n\n        function injectCsrf() {\n            var forms = document.querySelectorAll('form[method=\"post\"], form[method=\"POST\"]');\n            for (var i = 0; i < forms.length; i++) {\n                if (!forms[i].querySelector('input[name=\"' + csrfName + '\"]')) {\n                    var input = document.createElement('input');\n                    input.type  = 'hidden';\n                    input.name  = csrfName;\n                    input.value = csrfHash;\n                    forms[i].appendChild(input);\n                }\n            }\n        }\n\n        injectCsrf();\n\n        document.addEventListener('submit', function(e) {\n            var form = e.target;\n            if (form.method && form.method.toLowerCase() === 'post' && !form.querySelector('input[name=\"' + csrfName + '\"]')) {\n                var input = document.createElement('input');\n                input.type  = 'hidden';\n                input.name  = csrfName;\n                input.value = csrfHash;\n                form.appendChild(input);\n            }\n        }, true);\n\n        if (typeof $ !== 'undefined') {\n            $.ajaxSetup({\n                beforeSend: function(xhr, settings) {\n                    if (settings.type && settings.type.toUpperCase() === 'POST') {\n                        if (typeof settings.data === 'string') {\n                            settings.data += '&' + csrfName + '=' + csrfHash;\n                        } else {\n                            settings.data = settings.data || {};\n                            settings.data[csrfName] = csrfHash;\n                        }\n                    }\n                }\n            });\n        }\n    })();\n</script>\n</body>\n</html>"
  },
  {
    "path": "application/modules/admin/views/parts/general/header.php",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <meta name=\"description\" content=\"<?= @$description ?>\">\n        <meta name=\"csrf-token\" content=\"<?= $this->security->get_csrf_hash() ?>\">\n        <title><?= @$title ?></title>\n        <link href=\"<?= base_url('assets/bootstrap/css/bootstrap.min.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/font-awesome/css/font-awesome.min.css') ?>\" rel=\"stylesheet\"> \n        <link href=\"<?= base_url('assets/admin/css/general.css') ?>\" rel=\"stylesheet\">\n        <link href='https://fonts.googleapis.com/css?family=Inconsolata' rel='stylesheet' type='text/css'>\n        <script src=\"<?= base_url('assets/jquery/jquery.min.js') ?>\"></script>\n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body>\n        <div id=\"wrapper\">\n            <div id=\"content\"> \n                <nav class=\"navbar navbar-default\">\n                    <div class=\"navbar-header\">\n                        <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar\" aria-expanded=\"false\" aria-controls=\"navbar\">\n                            <i class=\"fa fa-lg fa-bars\"></i>\n                        </button>\n                    </div>\n                    <div id=\"navbar\" class=\"collapse navbar-collapse\">\n                        <ul class=\"nav navbar-nav\">\n                            <li><a href=\"<?= base_url('admin') ?>\"><i class=\"fa fa-home\"></i> Home</a></li>\n                            <li><a href=\"<?= base_url() ?>\" target=\"_blank\"><i class=\"glyphicon glyphicon-star\"></i> Production</a></li>\n                        </ul>\n                        <ul class=\"nav navbar-nav navbar-right\">\n                            <li><a href=\"<?= base_url('admin/logout') ?>\"><i class=\"fa fa-sign-out\"></i> Logout</a></li>\n                        </ul>\n                    </div>\n                </nav> \n                <div class=\"container-fluid\">\n                    <div class=\"row\"> \n                        <div class=\"col-sm-3 col-md-3 col-lg-2 left-side navbar-default\">\n                            <div class=\"show-menu\">\n                                <a id=\"show-xs-nav\" class=\"visible-xs\" href=\"javascript:void(0)\">\n                                    <span class=\"show-sp\">\n                                        Show menu\n                                        <i class=\"fa fa-arrow-circle-o-down\" aria-hidden=\"true\"></i>\n                                    </span>\n                                    <span class=\"hidde-sp\">\n                                        Hide menu\n                                        <i class=\"fa fa-arrow-circle-o-up\" aria-hidden=\"true\"></i>\n                                    </span>\n                                </a>\n                            </div>\n                            <ul class=\"sidebar-menu\">\n                                <li class=\"sidebar-search\">\n                                    <div class=\"input-group custom-search-form\">\n                                        <form method=\"GET\" action=\"<?= base_url('admin/products') ?>\">\n                                            <div class=\"input-group\">\n                                                <input class=\"form-control\" name=\"search_title\" value=\"<?= isset($_GET['search_title']) ? $_GET['search_title'] : '' ?>\" type=\"text\" placeholder=\"Find user\">\n                                                <span class=\"input-group-btn\">\n                                                    <button class=\"btn btn-default\" value=\"\" placeholder=\"Find user\" type=\"submit\">\n                                                        <i class=\"fa fa-search\"></i>\n                                                    </button>\n                                                </span>\n                                            </div>\n                                        </form>\n                                    </div>\n                                </li>\n                                <li class=\"header\">USERS</li>\n                                <li><a href=\"<?= base_url('admin/plans/requests') ?>\" <?= urldecode(uri_string()) == 'admin/plans/requests' ? 'class=\"active\"' : '' ?>><i class=\"fa fa-credit-card\" aria-hidden=\"true\"></i> Plans Payment Requests</a></li>\n                                <li><a href=\"<?= base_url('admin/plans/individual/request') ?>\" <?= urldecode(uri_string()) == 'admin/plans/individual/request' ? 'class=\"active\"' : '' ?>><i class=\"fa fa-american-sign-language-interpreting\" aria-hidden=\"true\"></i> Custom Plan Requests</a></li>\n                            </ul>\n                        </div>\n                        <div class=\"col-sm-9 col-md-9 col-lg-10 col-sm-offset-3 col-md-offset-3 col-lg-offset-2\">\n\n"
  },
  {
    "path": "application/modules/admin/views/parts/login/footer.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?> \n<script src=\"<?= base_url('assets/jquery/jquery.min.js') ?>\"></script> \n<script src=\"<?= base_url('assets/bootstrap/js/bootstrap.min.js') ?>\"></script>\n<script>\n    (function() {\n        var csrfName = '<?= $this->security->get_csrf_token_name() ?>';\n        var csrfHash = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content');\n        document.addEventListener('submit', function(e) {\n            var form = e.target;\n            if (form.method && form.method.toLowerCase() === 'post' && !form.querySelector('input[name=\"' + csrfName + '\"]')) {\n                var input = document.createElement('input');\n                input.type  = 'hidden';\n                input.name  = csrfName;\n                input.value = csrfHash;\n                form.appendChild(input);\n            }\n        }, true);\n    })();\n</script>\n</body>\n</html>"
  },
  {
    "path": "application/modules/admin/views/parts/login/header.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?>\n<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <meta name=\"csrf-token\" content=\"<?= $this->security->get_csrf_hash() ?>\">\n        <title><?= $title ?></title>\n        <link href=\"<?= base_url('assets/font-awesome/css/font-awesome.min.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/bootstrap/css/bootstrap.min.css') ?>\" rel=\"stylesheet\">\n        <link rel=\"stylesheet\" href=\"<?= base_url('assets/admin/css/login.css') ?>\">\n        <link rel=\"stylesheet\" href=\"http://fonts.googleapis.com/css?family=Roboto:400,100,300,500\">\n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body> "
  },
  {
    "path": "application/modules/admin/views/plans/individual_plan_requests.php",
    "content": "<h3>Custom Plan Requests</h3>\n<hr>\n<table class=\"table table-bordered\">\n    <thead>\n        <tr>\n            <th>user id</th>\n            <th>invoices</th>\n            <th>companies</th>\n            <th colspan=\"2\">time</th> \n        </tr>\n    </thead>\n    <tbody>\n        <?php\n        if (!empty($requests)) {\n            foreach ($requests as $request) {\n                ?>\n                <tr>\n                    <td><?= $request['for_user'] ?></td>\n                    <td><?= $request['invoices'] ?></td>\n                    <td><?= $request['companies'] ?></td>\n                    <td><?= date('d.m.Y', $request['time']) ?></td>\n                    <td class=\"text-right\">\n                        <form action=\"\" id=\"myForm\" method=\"GET\">\n                            <input type=\"hidden\" name=\"activate\" value=\"<?= $request['id'] ?>\">\n                            <input type=\"hidden\" name=\"for_user\" value=\"<?= $request['for_user'] ?>\">\n                            <input type=\"text\" name=\"price\" style=\"border:1px solid #e9e9e9; height: 35px;\" placeholder=\"Set Price\">\n                        </form>\n                        <a href=\"javascript:void(0);\" onclick=\"document.getElementById('myForm').submit();\" class=\"btn btn-success\">Activate</a>\n                        <a href=\"<?= base_url('admin/plans/individual/request?reject=' . $request['id']) ?>\" onclick=\"return confirm('Are you sure?')\" class=\"btn btn-danger\">Reject</a>\n                    </td>\n                </tr>\n                <?php\n            }\n        } else {\n            ?>\n            <tr>\n                <td colspan=\"5\">No payment requests</td>\n            </tr>\n        <?php } ?>\n    </tbody>\n</table>\n<?= $links_pagination ?>"
  },
  {
    "path": "application/modules/admin/views/plans/requests.php",
    "content": "<h3>Plan Payment Requests</h3>\n<hr>\n<table class=\"table table-bordered\">\n    <thead>\n        <tr>\n            <th>user id</th>\n            <th>request number</th>\n            <th>plan type</th>\n            <th>must pay</th>\n            <th colspan=\"2\">date generated</th> \n        </tr>\n    </thead>\n    <tbody>\n        <?php\n        if (!empty($requests)) {\n            foreach ($requests as $request) {\n                ?>\n                <tr>\n                    <td><?= $request['for_user'] ?></td>\n                    <td><?= $request['req_num'] ?></td>\n                    <td><?= $request['plan_type'] ?></td>\n                    <td>\n                        <?php if ($request['plan_type'] == 'CUSTOM') { ?>\n                            <?= $request['price'] ?>\n                        <?php } else { ?>\n                            <?= $defaultPlans[$request['plan_type']]['PRICE'] ?>\n                        <?php } ?>\n                    </td>\n                    <td><?= date('d.m.Y', $request['date_generated']) ?></td>\n                    <td class=\"text-right\">\n                        <a href=\"<?= base_url('admin/plans/requests?activate=' . $request['id']) ?>\" onclick=\"return confirm('Are you sure?')\" class=\"btn btn-success\">Activate</a>\n                    </td>\n                </tr>\n                <?php\n            }\n        } else {\n            ?>\n            <tr>\n                <td colspan=\"5\">No payment requests</td>\n            </tr>\n        <?php } ?>\n    </tbody>\n</table>\n<?= $links_pagination ?>"
  },
  {
    "path": "application/modules/users/controllers/clients/Clients.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Clients extends USER_Controller\n{\n\n    private $num_rows = 20;\n    private $editId;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('ClientsModel', 'NewInvoiceModel', 'SettingsModel'));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime').lang('title_clients');\n        $this->postChecker();\n        $rowscount = $this->ClientsModel->countClients($_GET);\n        $data['clients'] = $this->ClientsModel->getClients($this->num_rows, $page, $_GET);\n        $data['linksPagination'] = pagination('user/clients', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 4 : 3);\n        $this->render('clients/index', $head, $data);\n        $this->saveHistory('Go to clients page');\n    }\n\n    public function addClient($id = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime').lang('title_add_client');\n        $this->editId = $id;\n        $this->postChecker();\n        if ($id > 0) {\n            $result = $this->ClientsModel->getClientInfo($id);\n            if (empty($result)) {\n                log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to edit client with id -' . $id);\n                show_404();\n            }\n            $_POST = $result;\n        }\n        $data['editId'] = $id;\n        $this->render('clients/addclient', $head, $data);\n        $this->saveHistory('Go to add client page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['client_name'])) {\n            $this->setClient();\n        }\n        if (isset($_POST['action'])) {\n            if ($_POST['action'] == 'delete') {\n                $this->deleteSelectedClients($_POST['ids']);\n            }\n        }\n    }\n\n    private function deleteSelectedClients($ids)\n    {\n        $this->ClientsModel->multipleDeleteClients($ids);\n        redirect(lang_url('user/clients'));\n    }\n\n    private function setClient()\n    {\n        $isValid = $this->validateClient();\n        if ($isValid === true) {\n            $_POST['editId'] = $this->editId;\n            $this->NewInvoiceModel->setClient($_POST);\n            $this->saveHistory('Add client - ' . $_POST['client_name']);\n            redirect(lang_url('user/clients'));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            if ($this->editId > 0) {\n                redirect(lang_url('user/client/edit/' . $this->editId));\n            } else {\n                redirect(lang_url('user/client/add'));\n            }\n        }\n    }\n\n    private function validateClient()\n    {\n        $errors = array();\n        if (mb_strlen(trim($_POST['client_name'])) == 0) {\n            $errors[] = lang('err_create_client_name');\n        }\n        if (mb_strlen(trim($_POST['client_address'])) == 0) {\n            $errors[] = lang('err_create_client_addr');\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n    public function deleteClient($id)\n    {\n        $this->ClientsModel->deleteClient($id);\n        redirect(lang_url('user/clients'));\n    }\n\n    public function viewClient($id)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime').lang('title_preview_client');\n        $result = $this->ClientsModel->getClientInfo($id);\n        if (empty($result)) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to view client with id -' . $id);\n            show_404();\n        }\n        $data['clientInfo'] = $result;\n        $this->render('clients/viewclient', $head, $data);\n        $this->saveHistory('View client ' . $id);\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/home/Home.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Home extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('HomeModel', 'ReportsModel'));\n    }\n\n    public function index()\n    {\n\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime').lang('title_home_page');\n        if (isset($_POST['firm_name'])) {\n            $result = $this->validateCompanyDetails();\n            if ($result === true) {\n                $companyId = $this->setFirm();\n                $this->addCompanyFolders($companyId);\n                $this->saveHistory('Add company - ' . print_r($_POST, true));\n                redirect(lang_url('user'));\n            } else {\n                $this->session->set_flashdata('resultAction', $result);\n                redirect(lang_url('user'));\n            }\n        }\n        $data['inv_readable_types'] = $this->config->item('inv_readable_types');\n        if (SELECTED_COMPANY_ID != null) { // in first login we dont have companies and this is null\n            $data['issuedInvoices'] = $this->ReportsModel->getIssuedInvoices();\n        }\n        $data['betweenDates'] = lang('all_the_time');\n        $this->render('home/index', $head, $data);\n        $this->saveHistory('Go to home page');\n    }\n\n    public function useCompany($companyId)\n    {\n        $canIUse = $this->HomeModel->checkCompanyIsValidForUser($companyId);\n        if (!empty($canIUse)) {\n            $_SESSION['selected_company'] = array(\n                'id' => $canIUse['firm_id'],\n                'name' => $canIUse['name']\n            );\n        }\n        redirect(lang_url('user'));\n    }\n\n    private function setFirm()\n    {\n        $_POST['is_default'] = 1;\n        $_POST['trans_name'] = 'default';\n        $id = $this->HomeModel->setFirm($_POST);\n        return $id;\n    }\n\n    public function findResults()\n    {\n        if (!$this->input->is_ajax_request()) {\n            exit('No direct script access allowed');\n        }\n        $result = $this->HomeModel->findResultsFromSearch($_POST['search']);\n        if (!empty($result)) {\n            $inv_readable_types = $this->config->item('inv_readable_types');\n            include 'application/modules/users/views/home/searchResultsHtml.php';\n        } else {\n            include 'application/modules/users/views/home/noSearchResultsHtml.php';\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/import_export/ImportExport.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass ImportExport extends USER_Controller\n{\n\n    private $resultImport = array();\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('ImportExportModel'));\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] =  lang('title_everytime').lang('title_import_export');\n        $this->postChecker();\n        $thisYear = thisyeardates();\n        $data['from_date'] = $thisYear['from'];\n        $data['to_date'] = $thisYear['to'];\n        $data['resultImport'] = $this->resultImport;\n        $data['invReadableTypes'] = $this->config->item('inv_readable_types');\n        $this->render('import_export/index', $head, $data);\n        $this->saveHistory('Go to import export page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['exportType'])) {\n            $this->doExport();\n        }\n        if (isset($_POST['importType'])) {\n            $this->doImport();\n        }\n    }\n\n    /*\n     * All exporters returns file and headers\n     * To be open from browser\n     */\n\n    private function doExport()\n    {\n        // check if we export for date range or all\n        $from = strtotime($_POST['from_date']);\n        $to = strtotime($_POST['to_date']);\n        if ($from == false || $to == false) { // prevent from wrong date\n            $from = null;\n            $to = null;\n        }\n        if (isset($_POST['export_all'])) {\n            $from = null;\n            $to = null;\n        }\n\n        // get invoices\n        $resultInvoices = $this->ImportExportModel->getInvoices($from, $to);\n        // if no invoices.. return to page with message\n        if (empty($resultInvoices)) {\n            $this->session->set_flashdata('resultAction', lang('no_invoices_result_export'));\n            redirect(lang_url('user/import-export'));\n        }\n\n        /*\n         * Lets call the selected exporter\n         */\n\n        $isSelected = false;\n        if ($_POST['exportType'] == 'xml') {\n            $this->load->library('exporters/XmlExport');\n            $this->xmlexport->setDates($from, $to);\n            $this->xmlexport->getXmlFileFromInvoicesArray($resultInvoices);\n            $isSelected = true;\n        }\n        if ($_POST['exportType'] == 'excel') {\n            $this->load->library('exporters/ExcelExport');\n            $this->excelexport->setDates($from, $to);\n            $this->excelexport->getExcelFileFromInovoicesArray($resultInvoices);\n            $isSelected = true;\n        }\n        if ($isSelected == false) {\n            $this->session->set_flashdata('resultAction', lang('selected_invalid_exporter'));\n            redirect(lang_url('user/import-export'));\n        }\n    }\n\n    private function doImport()\n    {\n        if ($_FILES['fileToImport']['size'] == 0) {\n            $this->session->set_flashdata('resultAction', lang('not_selected_import_file'));\n            redirect(lang_url('user/import-export'));\n        }\n        if ($_POST['importType'] == 'uni-xml') {\n            $this->load->library('importers/UniversalXmlImport');\n            $resultImport = $this->universalxmlimport->importFile($_FILES['fileToImport']['tmp_name']);\n            $this->resultImport = $resultImport;\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/invoices/Invoices.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Invoices extends USER_Controller\n{\n\n    private $num_rows = 20;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('InvoicesModel', 'SettingsModel', 'NewInvoiceModel'));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] =  lang('title_everytime').lang('title_invoices');\n        $this->postChecker();\n        $rowscount = $this->InvoicesModel->countInvoices($_GET);\n        $data['invoices'] = $this->InvoicesModel->getInvoices($this->num_rows, $page, $_GET);\n        $data['inv_readable_types'] = $this->config->item('inv_readable_types');\n        $data['linksPagination'] = pagination('user/invoices', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 4 : 3);\n        $data['paymentMethods'] = $this->NewInvoiceModel->getPaymentMethods();\n        $data['countInvoices'] = $rowscount;\n        $data['sumAmount'] = $this->InvoicesModel->sumOfAmounts($_GET);\n        $this->render('invoices/index', $head, $data);\n        $this->saveHistory('Go to invoices page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['action'])) {\n            if ($_POST['action'] == 'delete') {\n                $this->deleteSelectedInvoices($_POST['ids']);\n            }\n            if ($_POST['action'] == 'stat_canceled') {\n                $this->changeStatusCanceled($_POST['ids'], true);\n            }\n            if ($_POST['action'] == 'remove_canceled') {\n                $this->changeStatusCanceled($_POST['ids'], false);\n            }\n        }\n    }\n\n    private function deleteSelectedInvoices($ids)\n    {\n        if (!$this->permissions->hasPerm('perm_delete_invoice')) {\n            show_404();\n        }\n        $this->InvoicesModel->multipleDeleteInvoices($ids);\n        redirect(lang_url('user/invoices'));\n    }\n\n    private function changeStatusCanceled($ids, $doCanceled)\n    {\n        if (!$this->permissions->hasPerm('perm_change_inv_status')) {\n            show_404();\n        }\n        $this->InvoicesModel->multipleStatusCanceledInvoices($ids, $doCanceled);\n        redirect(lang_url('user/invoices'));\n    }\n\n    public function deleteInvoice($id)\n    {\n        if (!$this->permissions->hasPerm('perm_delete_invoice')) {\n            show_404();\n        }\n        $this->InvoicesModel->deleteInvoice($id);\n        redirect(lang_url('user/invoices'));\n    }\n\n    public function changeInvoicePaymentStatus()\n    {\n        if (!$this->input->is_ajax_request()) {\n            exit('No direct script access allowed');\n        }\n        if (!$this->permissions->hasPerm('perm_change_inv_status')) {\n            echo '0';\n            return;\n        }\n        if ((isset($_POST['invId']) && is_numeric($_POST['invId'])) && isset($_POST['newStatus'])) {\n            $this->InvoicesModel->updateInvoicePaymentStatus($_POST['invId'], $_POST['newStatus']);\n            echo '1';\n            $this->saveHistory('Set new invoice status to - ' . $_POST['invId']);\n        } else {\n            echo '0';\n        }\n    }\n\n    public function changeInvoiceStatus($invoiceId, $toStatus)\n    {\n        $this->InvoicesModel->updateInvoicePaymentStatus($invoiceId, $toStatus);\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/invoices/Invoiceview.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Invoiceview extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('NewInvoiceModel');\n    }\n\n    public function index($invType, $invNum)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_inv_preview') . $invNum;\n        $inv_readable_types_flip = array_flip($this->config->item('inv_readable_types'));\n        $invoice = $this->getInvoiceByNumber($inv_readable_types_flip[$invType], $invNum);\n        if ($invoice == null) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to view invoice with type -' . $invType . ' and number - ' . $invNum);\n            show_404();\n        }\n        $this->load->model('SettingsModel');\n        $template = $this->SettingsModel->getValueStores('opt_invTemplate');\n        $templates = $this->config->item('templates');\n        if (!in_array($template, $templates)) {\n            $template = $templates[0];\n        } else {\n            $choosedTemplate = $template;\n        }\n        $templatesDir = 'application/modules/users/views/invoices/templates/';\n        $templateFile = $templatesDir . $choosedTemplate . '.php';\n        if (!is_file($templateFile)) {\n            show_error(lang('no_template_file'));\n        }\n        $data['actionHistory'] = $this->NewInvoiceModel->getActionHistory($invoice['id']);\n        $data['invoice'] = $invoice;\n        $data['templateFile'] = $templateFile;\n        $data['invType'] = $invType;\n        $data['invNum'] = $invNum;\n        $this->render('invoices/view', $head, $data);\n        $this->saveHistory('Go to preview invoice with number ' . $invNum . ' and firm id' . SELECTED_COMPANY_ID);\n    }\n\n    public function viewInvoiceAsPdf($invType, $origin, $invNum)\n    {\n        $inv_readable_types = array_flip($this->config->item('inv_readable_types'));\n        $invoice = $this->getInvoiceByNumber($inv_readable_types[$invType], $invNum);\n\n        if ($invoice == null) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to render PDF invoice with type -' . $invType . ' and number - ' . $invNum);\n            show_404();\n        }\n\n        $this->load->model('SettingsModel');\n        $template = $this->SettingsModel->getValueStores('opt_invTemplate');\n        $templates = $this->config->item('templates');\n        if (!in_array($template, $templates)) {\n            $template = $templates[0];\n        } else {\n            $choosedTemplate = $template;\n        }\n        $templatesDir = 'application/modules/users/views/invoices/templates/';\n        $templateFile = $templatesDir . $choosedTemplate . '.php';\n        if (!is_file($templateFile)) {\n            show_error(lang('no_template_file'));\n        }\n        $cssInvTemplates = file_get_contents(base_url('assets/users/css/invoices-templates.css'));\n        $cssFonts = APPPATH . 'libraries/dompdf/lib/fonts/DejaVuSans.ttf';\n\n        ob_start();\n        echo '\n        <!DOCTYPE html>\n        <html lang=\"en\">\n        <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <title>Invoice ' . $invoice['inv_number'] . '</title> \n        <style>\n            @font-face {\n            font-family: \\'DejaVu Sans\\';\n            font-style: normal; \n            src: url(\\'' . $cssFonts . '\\') format(\\'truetype\\');\n          }\n          .invoice-box * {\n            font-family: \\'DejaVu Sans\\';\n          }\n        ' . $cssInvTemplates . '\n        </style>  \n    </head>\n    <body> \n    ';\n        include $templateFile;\n        echo '</body></html>';\n        $html = ob_get_clean();\n        \n        // DEBUG: preview real html\n        // echo $html; exit;\n\n        // lets use dompdf lib to generate it.\n        require_once APPPATH . 'libraries/dompdf/autoload.inc.php';\n        $dompdf = new \\Dompdf\\Dompdf();\n\n        $dompdf->loadHtml($html);\n\n        // (Optional) Setup the paper size and orientation\n        // [0, 0, 867.00, 1008.00]\n        $dompdf->setPaper('A4', 'portrait');\n\n        // Render the HTML as PDF\n        $dompdf->render();\n        \n        // Output the generated PDF to Browser\n        $dompdf->stream($invoice['inv_number']);\n        die();\n    }\n\n    public function getInvoiceByNumber($invType, $invNum)\n    {\n        return $this->NewInvoiceModel->getInvoiceByNumber($invType, $invNum);\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/invoices/Newinvoice.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Newinvoice extends USER_Controller\n{\n\n    private $editId = 0;\n    private $invNum = 0;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('NewInvoiceModel', 'SettingsModel', 'ManagefirmsModel'));\n    }\n\n    public function index($invType = null, $invNum = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_new_inv');\n        $data['currencies'] = $this->NewInvoiceModel->getCurrencies();\n        $data['myDefaultFirmCurrency'] = $this->NewInvoiceModel->getFirmDefaultCurrency();\n        $data['quantityTypes'] = $this->NewInvoiceModel->getAllQuantityTypes();\n        $data['paymentMethods'] = $this->NewInvoiceModel->getPaymentMethods();\n        $data['invoiceLanguages'] = $this->NewInvoiceModel->getMyInvoiceLanguages();\n        $data['myNoVatReasons'] = $this->SettingsModel->getMyNoVatReasons();\n        $data['nextInvNumber'] = $this->NewInvoiceModel->getNextFreeInvoiceNumber();\n        //if is not edit and want get $_POST from other document\n        if (isset($_GET['create-from']) && isset($_GET['number']) && $invNum == 0) {\n            $this->getPostFromDucument();\n        }\n\n        if ($invNum > 0) {\n            $this->invNum = $invNum;\n            $inv_readable_types = array_flip($this->config->item('inv_readable_types'));\n            $result = $this->NewInvoiceModel->getInvoiceByNumber($inv_readable_types[$invType], $invNum);\n            if (empty($result)) {\n                log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to edit invoice with type -' . $invType . ' and number - ' . $invNum);\n                show_404();\n            }\n            $this->editId = $result['id'];\n            $this->postChecker();\n            $currentItems = array();\n            foreach ($result['items'] as $item) {\n                $currentItems[] = $item['id'];\n            }\n            $_POST = $result;\n        } else {\n            $this->postChecker();\n        }\n\n        $data['editId'] = $this->editId;\n        if (isset($_POST['inv_currency'])) {\n            $theCurrency = $_POST['inv_currency'];\n        } elseif ($data['myDefaultFirmCurrency'] != null) {\n            $theCurrency = $data['myDefaultFirmCurrency'];\n        } else {\n            $theCurrency = 'EUR';\n        }\n        $data['currentItems'] = isset($currentItems) ? $currentItems : null;\n        $data['theCurrency'] = $theCurrency;\n        $data['allForFirm'] = $this->ManagefirmsModel->getCompanyInfo(SELECTED_COMPANY_ID);\n        $this->render('invoices/newinvoice', $head, $data);\n        $this->saveHistory('Go to new invoice page');\n    }\n\n    /*\n     * loads posts variable for client and items from \n     * other document\n     */\n\n    private function getPostFromDucument()\n    {\n        if ($_GET['create-from'] == 'store-order') {\n            $this->load->model('StoreModel');\n            $result = $this->StoreModel->getMovementByNumber($_GET['number']);\n            if ($result != null) {\n                $_POST['client'] = $result['client'];\n                $_POST['items'] = $result['items'];\n            }\n        }\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['addNewInvoiceLanguage'])) {\n            $this->addNewInvoiceLanguage();\n        }\n        /*\n         * Add new invoice\n         */\n        if (isset($_POST['inv_type'])) {\n            $_POST['editId'] = $this->editId; // Check is update or new invoice\n            $this->createInvoice();\n        }\n    }\n\n    private function createInvoice()\n    {\n        $isValid = $this->validateInvoice();\n        $inv_readable_types = $this->config->item('inv_readable_types');\n        if ($isValid === true) {\n            if ($this->editId > 0) {\n                if (!$this->permissions->hasPerm('perm_edit_invoice')) {\n                    show_404();\n                }\n                $this->NewInvoiceModel->updateInvoice($_POST);\n            } else {\n                if (!$this->permissions->hasPerm('perm_add_invoice')) {\n                    show_404();\n                }\n                $_POST['userInfo'] = $this->userInfo; // get info for logged user\n                /*\n                 * prevent from \"hackers\" to send \n                 * POST information when dont have plan\n                 */\n                $planUnits = $this->planUnits;\n                if ($planUnits['num_invoices'] > 0) {\n                    $this->NewInvoiceModel->setInvoice($_POST);\n                    $this->setDocumentPointer($_POST['inv_number']); //optional\n                } else {\n                    log_message('error', 'User that dont have invoices try to create invoice with POST array');\n                }\n            }\n            redirect(lang_url('user/' . $inv_readable_types[$_POST['inv_type']] . '/view/' . $_POST['inv_number']));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            if ($this->editId > 0) {\n                redirect(lang_url('user/' . $inv_readable_types[$_POST['inv_type']] . '/edit/' . $this->invNum));\n            } else {\n                redirect(lang_url('user/new/invoice'));\n            }\n        }\n    }\n\n    private function validateInvoice()\n    {\n        $errors = array();\n        if ($_POST['inv_type'] == 'debit' || $_POST['inv_type'] == 'credit') {\n            if (mb_strlen(trim($_POST['to_inv_number'])) == 0) {\n                $errors[] = lang('err_create_to_inv_num');\n            }\n            if (mb_strlen(trim($_POST['to_inv_date'])) == 0) {\n                $errors[] = lang('err_create_to_inv_date');\n            }\n        }\n        if (mb_strlen(trim($_POST['client_name'])) == 0) {\n            $errors[] = lang('err_create_client_name');\n        }\n        if (mb_strlen(trim($_POST['client_address'])) == 0) {\n            $errors[] = lang('err_create_client_addr');\n        }\n        if (mb_strlen(trim($_POST['inv_number'])) == 0) {\n            $errors[] = lang('err_create_inv_num');\n        } else {\n            $isFreeInvNum = $this->NewInvoiceModel->checkIsFreeInvoiceNumber($_POST['inv_number'], $_POST['inv_type'], $this->editId);\n            if ($isFreeInvNum === false) {\n                $errors[] = lang('err_create_inv_num_is_taken');\n            }\n        }\n        if (mb_strlen(trim($_POST['date_create'])) == 0) {\n            $errors[] = lang('err_create_date_create');\n        }\n        if (mb_strlen(trim($_POST['date_tax_event'])) == 0) {\n            $errors[] = lang('err_create_tax_event');\n        }\n        foreach ($_POST['items_names'] as $item_name) {\n            if (mb_strlen(trim($item_name)) == 0) {\n                $errors[] = lang('err_create_no_item_name');\n            }\n        }\n        foreach ($_POST['items_quantities'] as $item_quantity) {\n            if (mb_strlen(trim($item_quantity)) == 0) {\n                $errors[] = lang('err_create_no_item_qua');\n            }\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n    /*\n     * When submit form for create new invoice\n     * Check if information for this invoice comes from other document\n     * And set \"to invoice\" in him\n     */\n\n    private function setDocumentPointer($inv_number)\n    {\n        if (isset($_GET['create-from']) == 'store-order') {\n            $this->load->model('StoreModel');\n            $this->StoreModel->updateMovementPointToInvNumber($inv_number, $_GET['number']);\n        }\n    }\n\n    private function addNewInvoiceLanguage()\n    {\n        $this->NewInvoiceModel->setNewInvoiceLanguage($_POST);\n        $this->saveHistory('Add invoice translation - ' . $_POST['language_name']);\n        redirect(lang_url('user/new/invoice'));\n    }\n\n    public function addnewquantitytype()\n    {\n        if (!$this->input->is_ajax_request()) {\n            exit('No direct script access allowed');\n        }\n        if (isset($_POST['newVal'])) {\n            $this->NewInvoiceModel->setNewCustomQuantityType($_POST['newVal']);\n        }\n    }\n\n    public function addnewpaymentmethod()\n    {\n        if (!$this->input->is_ajax_request()) {\n            exit('No direct script access allowed');\n        }\n        if (isset($_POST['newVal'])) {\n            $this->NewInvoiceModel->setNewCustomPaymentMethod($_POST['newVal']);\n        }\n    }\n\n    public function modalselector()\n    {\n        if (!$this->input->is_ajax_request()) {\n            exit('No direct script access allowed');\n        }\n        if (isset($_POST['selectType'])) {\n            $result = $this->NewInvoiceModel->getListForSelector($_POST['selectType']);\n            if (!empty($result)) {\n                include 'application/modules/users/views/invoices/listSelectorHtml.php';\n            } else {\n                echo '<div class=\"no-data\">' . $_POST['selectType'] == 'clients' ? lang('no_clients_selector') : lang('no_items_selector') . '</div>';\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/items/Items.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Items extends USER_Controller\n{\n\n    private $num_rows = 20;\n    private $editId;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('ItemsModel', 'NewInvoiceModel', 'SettingsModel'));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_items');\n        $this->postChecker();\n        $rowscount = $this->ItemsModel->countItems($_GET);\n        $data['items'] = $this->ItemsModel->getItems($this->num_rows, $page, $_GET);\n        $data['linksPagination'] = pagination('user/items', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 4 : 3);\n        $this->render('items/index', $head, $data);\n        $this->saveHistory('Go to items page');\n    }\n\n    public function addItem($id = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_add_item');\n        $this->editId = $id;\n        $this->postChecker();\n        if ($id > 0) {\n            $result = $this->ItemsModel->getItemInfo($id);\n            if (empty($result)) {\n                log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to edit item with id -' . $id);\n                show_404();\n            }\n            $_POST = $result;\n        }\n        $data['quantityTypes'] = $this->NewInvoiceModel->getAllQuantityTypes();\n        $data['currencies'] = $this->NewInvoiceModel->getCurrencies();\n        $data['editId'] = $id;\n        $this->render('items/additem', $head, $data);\n        $this->saveHistory('Go to add item page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['name'])) {\n            $this->setItem();\n        }\n        if (isset($_POST['action'])) {\n            if ($_POST['action'] == 'delete') {\n                $this->deleteSelectedItems($_POST['ids']);\n            }\n        }\n    }\n\n    private function deleteSelectedItems($ids)\n    {\n        if (!$this->permissions->hasPerm('perm_delete_items')) {\n            show_404();\n        }\n        $this->ItemsModel->multipleDeleteItems($ids);\n        redirect(lang_url('user/items'));\n    }\n\n    private function setItem()\n    {\n        $isValid = $this->validateItem();\n        if ($isValid === true) {\n            $_POST['editId'] = $this->editId;\n            if ($this->editId > 0 && !$this->permissions->hasPerm('perm_edit_items')) {\n                show_404();\n            }\n            if ($this->editId == 0 && !$this->permissions->hasPerm('perm_add_items')) {\n                show_404();\n            }\n            $this->ItemsModel->setItem($_POST);\n            $this->saveHistory('Add item - ' . $_POST['name']);\n            redirect(lang_url('user/items'));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            if ($this->editId > 0) {\n                redirect(lang_url('user/item/edit/' . $this->editId));\n            } else {\n                redirect(lang_url('user/item/add'));\n            }\n        }\n    }\n\n    private function validateItem()\n    {\n        $errors = array();\n        if (mb_strlen(trim($_POST['name'])) == 0) {\n            $errors[] = lang('err_create_item_name');\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n    public function deleteItem($id)\n    {\n        $this->ItemsModel->deleteItem($id);\n        redirect(lang_url('user/items'));\n    }\n\n    public function viewItem($id)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_item_preview');\n        $result = $this->ItemsModel->getItemInfo($id);\n        if (empty($result)) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to view item with id -' . $id);\n            show_404();\n        }\n        $data['itemInfo'] = $result;\n        $this->render('items/viewitem', $head, $data);\n        $this->saveHistory('View item ' . $id);\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/managefirms/Managefirms.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Managefirms extends USER_Controller\n{\n\n    private $myFirms;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('ManagefirmsModel', 'HomeModel'));\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_manage_firms');\n        $data['firms'] = $this->myFirms = $this->HomeModel->getFirms();\n        if (isset($_POST['firm_name'])) {\n            if (count($this->myFirms) < $this->planUnits['num_firms']) { // if num my firms is lower than my plan num allowed\n                $result = $this->validateCompanyDetails();\n                if ($result === true) {\n                    $companyId = $this->setFirm();\n                    $this->addCompanyFolders($companyId);\n                    $this->saveHistory('Add company - ' . print_r($_POST, true));\n                    $this->session->set_flashdata('resultAction', lang('company_added'));\n                } else {\n                    $this->session->set_flashdata('addFirm', '1');\n                    $this->session->set_flashdata('resultAction', $result);\n                }\n                redirect(lang_url('user/managefirms'));\n            }\n        }\n        $this->render('managefirms/index', $head, $data);\n        $this->saveHistory('Go to manage firms page');\n    }\n\n    public function deleteCompany($companyId)\n    {\n        if (!in_array($companyId, $this->canUseFirms)) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to delete company with id -' . $companyId);\n            show_404();\n        }\n        $this->ManagefirmsModel->deleteCompany($companyId);\n        if ($companyId == SELECTED_COMPANY_ID) {\n            $lastAddedCompanyId = $this->ManagefirmsModel->getLastAddedCompanyId();\n            if ($lastAddedCompanyId != null) {\n                redirect(lang_url('user/usecompany/' . $lastAddedCompanyId));\n            }\n        }\n        $this->session->set_flashdata('resultAction', lang('company_deleted'));\n        $this->saveHistory('Delete company id - ' . $companyId);\n        redirect(lang_url('user/managefirms'));\n    }\n\n    public function editCompany($companyId, $translateId = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_edit_firm');\n        if (!in_array($companyId, $this->canUseFirms)) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to edit company with id -' . $companyId . ' No permissions!');\n            show_404();\n        }\n        $result = $this->getCompanyInfo($companyId);\n        if (empty($result['company']) || !is_numeric($companyId)) {\n            log_message('error', 'User with id - ' . USER_ID . ' get 404 when try to edit company with id -' . $companyId . ' Not found this id or is not numeric searched for id');\n            show_404();\n        }\n        if ($translateId > 0) {\n            $companyTranslate = $this->ManagefirmsModel->getTranslationInfo($translateId, $companyId);\n            if (empty($companyTranslate)) {\n                show_404();\n            }\n            $data['companyTranslate'] = $companyTranslate;\n        } else {\n            $data['companyTranslate'] = $this->ManagefirmsModel->getMyCompanyDefaultTranslation($companyId);\n        }\n        /*\n         * Save Bulstat Data\n         */\n        if (isset($_POST['firm_bulstat'])) {\n            $result = $this->updateCompanyStaticInfo($companyId);\n            if ($result === false) {\n                $this->session->set_flashdata('resultAction', lang('bulstat_is_taken'));\n            } else {\n                $this->saveHistory('Update firm details for Id - ' . $companyId);\n                $this->session->set_flashdata('resultAction', lang('firm_details_changed'));\n            }\n            redirect(lang_url('user/managefirms/edit/' . $companyId));\n        }\n        /*\n         * Save Translation texts\n         */\n        if (isset($_POST['saveTranslate'])) {\n            $this->updateTranslation($companyId);\n            $this->saveHistory('Update translation for company Id - ' . $companyId);\n            $this->session->set_flashdata('resultAction', lang('translation_updated'));\n            redirect(lang_url('user/managefirms/edit/' . $companyId . '/' . $translateId));\n        }\n        /*\n         * Add new translation\n         */\n        if (isset($_POST['add_new_translation'])) {\n            $result = $this->addNewTranslation($companyId);\n            if ($result === true) {\n                $this->saveHistory('Add new translation for company Id - ' . $companyId);\n                $this->session->set_flashdata('resultAction', lang('new_translation_added'));\n            } else {\n                $this->session->set_flashdata('addNewTranslationErr', '1');\n                $this->session->set_flashdata('resultAction', $result);\n            }\n            redirect(lang_url('user/managefirms/edit/' . $companyId));\n        }\n        $data['companyInfo'] = $result;\n        $this->render('managefirms/edit', $head, $data);\n        $this->saveHistory('Go to edit firms id - ' . $companyId);\n    }\n\n    public function deleteTranslation($companyId, $translationid)\n    {\n        $this->ManagefirmsModel->deleteTranslation($companyId, $translationid);\n        $this->session->set_flashdata('resultAction', lang('translation_deleted'));\n        $this->saveHistory('Delete tanslation id - ' . $translationid);\n        redirect(lang_url('user/managefirms/edit/' . $companyId));\n    }\n\n    public function makeDefaultTranslation($companyId, $translationId)\n    {\n        $this->ManagefirmsModel->makeDefaultTranslationWithId($companyId, $translationId);\n        $this->saveHistory('Make default tanslation id - ' . $translationid);\n        redirect(lang_url('user/managefirms/edit/' . $companyId));\n    }\n\n    public function makeDefaultFirm($firmId)\n    {\n        $this->ManagefirmsModel->makeDefaultFirmWithId($firmId);\n        $this->saveHistory('Make default company id - ' . $firmId);\n        redirect(lang_url('user/managefirms'));\n    }\n\n    private function addNewTranslation($companyId)\n    {\n        $errors = $this->validateCompanyDetails(false);\n        $img = uploader('./attachments/' . COMPANIES_IMAGES_DIR . '/' . $companyId);\n        if (isset($img['result']) && $img['result'] === true) {\n            $_POST['image'] = $img['value'];\n        } elseif (!isset($img['result']) && $img === false) {\n            $_POST['image'] = '';\n        } elseif (isset($img['result']) && $img['result'] === false) {\n            $errors[] = lang('upload_img_error') . $img['value'];\n        }\n        if ($errors === true) {\n            $this->ManagefirmsModel->setNewTranslation($_POST, $companyId);\n            return true;\n        } else {\n            return $errors;\n        }\n    }\n\n    private function updateTranslation($companyId)\n    {\n        $errors = $this->validateCompanyDetails(false);\n        $img = uploader('./attachments/' . COMPANIES_IMAGES_DIR . '/' . $companyId);\n        if (isset($img['result']) && $img['result'] === true) {\n            $_POST['image'] = $img['value'];\n        } elseif (!isset($img['result']) && $img === false) {\n            $_POST['image'] = $_POST['old_image'];\n        } elseif (isset($img['result']) && $img['result'] === false) {\n            $errors[] = lang('upload_img_error') . $img['value'];\n        }\n        if ($errors === true) {\n            $result = $this->ManagefirmsModel->updateTranslation($_POST, $companyId);\n            return $result;\n        } else {\n            return $errors;\n        }\n    }\n\n    private function updateCompanyStaticInfo($companyId)\n    {\n        $result = $this->HomeModel->checkBulstatIsFree($_POST['firm_bulstat'], $companyId);\n        if ($result === true) {\n            $this->ManagefirmsModel->updateCompanyStaticInfo($_POST, $companyId);\n        }\n        return $result;\n    }\n\n    private function getCompanyInfo($companyId)\n    {\n        $result = $this->ManagefirmsModel->getCompanyInfo($companyId);\n        return $result;\n    }\n\n    private function setFirm()\n    {\n        $_POST['is_default'] = 0;\n        $companyId = $this->HomeModel->setFirm($_POST);\n        return $companyId;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/plans/PlansUsers.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass PlansUsers extends USER_Controller\n{\n\n    private $defaultPlans;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->defaultPlans = $this->config->item('plans');\n        $this->load->model('PlansModel');\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_plans');\n        if ($this->plans->checkHaveIRequest() == true) {\n            redirect(lang_url('user/myplan/request'));\n        }\n        if (isset($_POST['inv_per_month'])) {\n            $this->sendPlanRequest();\n        }\n        $data['myCurrentPlans'] = $this->PlansModel->getMyActivePlans();\n        $data['individualPlan'] = $this->PlansModel->getIndividualPlan();\n        $data['requestForIndividualPlan'] = $this->PlansModel->getRequestForIndividualPlan();\n        $data['plans'] = $this->defaultPlans;\n        $this->render('plans/index', $head, $data);\n        $this->saveHistory('Go to plans page');\n    }\n\n    private function sendPlanRequest()\n    {\n        $this->PlansModel->setPlanRequest($_POST);\n        $this->session->set_flashdata('resultAction', lang('plan_req_sended'));\n        redirect(lang_url('user/plans'));\n    }\n\n    public function choosePeriod($planType)\n    {\n        if ($this->plans->checkHaveIRequest() == true) {\n            redirect(lang_url('user/myplan/request'));\n        }\n        $individualPlan = $this->PlansModel->getIndividualPlan();\n        if (!array_key_exists(strtoupper($planType), $this->defaultPlans) && ($planType != 'custom' || $individualPlan == null)) {\n            show_404();\n        }\n        if (isset($_POST['period'])) {\n            $this->PlansModel->setNewPaymentRequiest($_POST);\n            redirect(lang_url('user/myplan/request'));\n        }\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_choose_plan_period');\n        $data['planType'] = $planType;\n        $data['plans'] = $this->defaultPlans;\n        if ($planType == 'custom') {\n            $data['plans']['CUSTOM'] = array(\n                'PRICE' => $individualPlan['price'],\n                'NUM_INVOICES' => $individualPlan['num_invoices'],\n                'NUM_FIRMS' => $individualPlan['num_firms']\n            );\n        }\n        $this->render('plans/period', $head, $data);\n        $this->saveHistory('Go to plans confirm page');\n    }\n\n    public function planRequest()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_plan_req');\n        $data['paymentReq'] = $this->PlansModel->getMyRequest();\n        if ($data['paymentReq'] == null) {\n            redirect(lang_url('user/plans'));\n        }\n        if (isset($_GET['payment']) && $_GET['payment'] == 'cancel') {\n            $this->PlansModel->cancelPaymentRequest($data['paymentReq']['id']);\n            redirect(lang_url('user/plans'));\n        }\n        $data['plans'] = $this->defaultPlans;\n        if ($data['paymentReq']['plan_type'] == 'CUSTOM') {\n            $individualPlan = $this->PlansModel->getIndividualPlan();\n            $data['plans']['CUSTOM'] = array(\n                'PRICE' => $individualPlan['price'],\n                'NUM_INVOICES' => $individualPlan['num_invoices'],\n                'NUM_FIRMS' => $individualPlan['num_firms']\n            );\n        }\n        $priceOfSelectedPlan = $data['plans'][$data['paymentReq']['plan_type']]['PRICE'];\n        $periodOfSelectedPlan = $data['paymentReq']['plan_period'];\n        $data['mustPayAmount'] = $priceOfSelectedPlan * $periodOfSelectedPlan;\n        $this->render('plans/request', $head, $data);\n        $this->saveHistory('Go to plan request page');\n    }\n\n    /*\n     * called from ajax\n     */\n\n    public function cardPayment()\n    {\n        $this->load->helper('get_client_ip_address'); \n        $card_ipaddress = get_client_ip_address();\n        $res = exec(\"curl https://api-3t.sandbox.paypal.com/nvp \\\n  --insecure  \\\n  -d VERSION=56.0 \\\n  -d SIGNATURE=AFcWxV21C7fd0v3bYYYRCpSSRl31AjZDUnpG2q.kA5xeqyBR7GjKw8Ra \\\n  -d USER=kirkata1_api1.abv.bg \\\n  -d PWD=WK8FU3DWQB9TLKQ5 \\\n  -d METHOD=DoDirectPayment \\\n  -d PAYMENTACTION=Sale \\\n  -d IPADDRESS=$card_ipaddress \\\n  -d AMT=8.88 \\\n  -d CREDITCARDTYPE=Visa \\\n  -d ACCT=4683075410516684 \\\n  -d EXPDATE=042018 \\\n  -d CVV2=123 \\\n  -d FIRSTNAME=John \\\n  -d LASTNAME=Smith \\\n  -d STREET=1 Main St. \\\n  -d CITY=San Jose \\\n  -d STATE=FR \\\n  -d ZIP=95131 \\\n  -d COUNTRYCODE=EUR\");\n        var_dump($res);\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/protocols/Protocols.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Protocols extends USER_Controller\n{\n\n    private $num_rows = 20;\n    private $editId = 0;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array(\n            'ProtocolsModel',\n            'NewInvoiceModel',\n            'ManagefirmsModel',\n            'SettingsModel'\n        ));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_protocols');\n        $rowscount = $this->ProtocolsModel->countProtocols($_GET);\n        $data['protocols'] = $this->ProtocolsModel->getProtocols($this->num_rows, $page, $_GET);\n        $data['linksPagination'] = pagination('user/protocols', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 4 : 3);\n        if (isset($_POST['action'])) {\n            if ($_POST['action'] == 'delete') {\n                $this->deleteProtocols($_POST['ids']);\n            }\n        }\n        $this->render('protocols/index', $head, $data);\n        $this->saveHistory('Go to protocol page');\n    }\n\n    private function deleteProtocols($ids)\n    {\n        $this->ProtocolsModel->multipleDelete($ids);\n        redirect(lang_url('user/protocols'));\n    }\n\n    public function addProtocol($number = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_add_protocol');\n        $data['prov_transmits'] = $this->ProtocolsModel->getProviderTransmits();\n        $data['contracts'] = $this->ProtocolsModel->getContracts();\n        $data['nextProtocolNumber'] = $this->ProtocolsModel->getNextFreeProtocolNumber();\n        $data['currencies'] = $this->NewInvoiceModel->getCurrencies();\n        $data['myDefaultFirmCurrency'] = $this->NewInvoiceModel->getFirmDefaultCurrency();\n        $data['protocolsLanguages'] = $this->ProtocolsModel->getMyProtocolsLanguages();\n        $data['allForFirm'] = $this->ManagefirmsModel->getCompanyInfo(SELECTED_COMPANY_ID);\n        if ($data['myDefaultFirmCurrency'] != null) {\n            $theCurrency = $data['myDefaultFirmCurrency'];\n        } else {\n            $theCurrency = 'EUR';\n        }\n        if (isset($_POST['addNewProtocolTranslation'])) {\n            $this->setNewProtocolLanguage();\n        }\n        if (isset($_POST['protocol_number'])) {\n            $this->createProtocol();\n        }\n        $currentItems = array();\n        if ($number > 0) {\n            $result = $this->ProtocolsModel->getProtocolByNumber($number);\n            if (empty($result)) {\n                log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to edit protocol with number - ' . $number);\n                show_404();\n            }\n            $this->editId = $result['id'];\n\n            foreach ($result['items'] as $item) {\n                $currentItems[] = $item['id'];\n            }\n            $_POST = $result;\n        }\n        $data['currentItems'] = $currentItems;\n        $data['updateId'] = $this->editId;\n        $data['theCurrency'] = $theCurrency;\n        $data['editId'] = $this->editId;\n        $this->render('protocols/addprotocol', $head, $data);\n        $this->saveHistory('Go to add protocol page');\n    }\n\n    private function setNewProtocolLanguage()\n    {\n        $this->ProtocolsModel->setNewProtocolLanguage($_POST);\n        $this->saveHistory('Add protocol language - ' . $_POST['language_name']);\n        redirect(lang_url('user/protocols/add-protocol'));\n    }\n\n    public function createProtocol()\n    {\n        $isValid = $this->validateProtocol();\n        if ($isValid === true) {\n            if ($_POST['editId'] > 0) {\n                $this->ProtocolsModel->updateProtocol($_POST);\n                $this->session->set_flashdata('resultAction', lang('protocol_updated'));\n            } else {\n                $this->ProtocolsModel->setProtocol($_POST);\n                $this->session->set_flashdata('resultAction', lang('protocol_added'));\n            }\n            redirect(lang_url('user/protocols'));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            redirect(lang_url('user/protocols/add-protocol'));\n        }\n        redirect(lang_url('user/protocols'));\n    }\n\n    private function validateProtocol()\n    {\n        $errors = array();\n        if (mb_strlen(trim($_POST['protocol_number'])) == 0) {\n            $errors[] = lang('err_create_prot_num');\n        } else {\n            $isFreeNum = $this->ProtocolsModel->checkIsFreeProtocolNumber($_POST['warranty_number'], $_POST['updateId']);\n            if ($isFreeNum === false) {\n                $errors[] = lang('err_create_prot_num_is_taken');\n            }\n        }\n        foreach ($_POST['items_names'] as $item_name) {\n            if (mb_strlen(trim($item_name)) == 0) {\n                $errors[] = lang('err_create_no_item_name');\n            }\n        }\n        foreach ($_POST['items_quantities'] as $item_quantity) {\n            if (mb_strlen(trim($item_quantity)) == 0) {\n                $errors[] = lang('err_create_prot_no_item_qa');\n            }\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/protocols/Protocolview.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Protocolview extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('ProtocolsModel');\n    }\n\n    public function index()\n    {\n        show_404();\n    }\n\n    public function viewProtocolAsPdf($number)\n    {\n        $protocol = $this->ProtocolsModel->getProtocolByNumber($number);\n        if ($protocol == null) {\n            log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to open as PDF protocol with number - ' . $number);\n            show_404();\n        }\n        $choosedTemplate = 'default';\n        $templatesDir = 'application/modules/users/views/protocols/templates/';\n        $templateFile = $templatesDir . $choosedTemplate . '.php';\n        if (!is_file($templateFile)) {\n            show_error(lang('no_template_file'));\n        }\n        $this->load->library('HtmlToPdf');\n        ob_start();\n        echo '\n        <!DOCTYPE html>\n        <html lang=\"en\">\n        <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <title>Administration - Home</title> \n        <link href=\"' . base_url('assets/bootstrap/css/bootstrap.min.css') . '\" rel=\"stylesheet\">\n        <link href=\"' . base_url('assets/users/css/protocols-templates.css') . '\" rel=\"stylesheet\">   \n        <script src=\"' . base_url('assets/jquery/jquery.min.js') . '\"></script>  \n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body> \n    ';\n        include $templateFile;\n        echo '</body></html>';\n        $html = ob_get_clean();\n        $this->htmltopdf->setNum($number); // set $protocol number to give it to footer\n        $this->htmltopdf->setType($protocol['translation']['transmission_protocol']);\n        $this->htmltopdf->setPageTranslate($protocol['translation']['page']); // set $protocol translation of 'page' word\n        $pdf = $this->htmltopdf->generatePdf($html);\n        $filename = 'protocol - ' . $number . '.pdf';\n\n        header('Content-Type: application/pdf');\n        header('Content-Disposition: inline; filename=\"' . $filename . '\"');\n        header('Expires: 0');\n        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');\n        header('Pragma: public');\n        header('Content-Length: ' . strlen($pdf));\n        echo $pdf;\n        exit;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/reports/Reports.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Reports extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('ReportsModel', 'NewInvoiceModel'));\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_reports');\n        if (!isset($_GET['from_date']) && !isset($_GET['to_date'])) {\n            $thisYear = thisyeardates();\n            $_GET['from_date'] = $thisYear['from'];\n            $_GET['to_date'] = $thisYear['to'];\n        }\n        $showDraft = isset($_GET['show_drafts']) && $_GET['show_drafts'] == 'true' ? true : false;\n        $data['inv_readable_types'] = $this->config->item('inv_readable_types');\n        $data['issuedInvoices'] = $this->ReportsModel->getIssuedInvoices(strtotime($_GET['from_date']), strtotime($_GET['to_date']), $showDraft, isset($_GET['payment_status'])?$_GET['payment_status']:null);\n        $data['issuedInvoicesByMonth'] = $this->ReportsModel->getIssuedInvoicesByMonth($_GET['from_date'], $_GET['to_date'], $showDraft, isset($_GET['payment_status'])?$_GET['payment_status']:null);\n        $data['topClients'] = $this->ReportsModel->getTopClients($_GET['from_date'], $_GET['to_date'], $showDraft, isset($_GET['payment_status'])?$_GET['payment_status']:null);\n        $data['betweenDates'] = lang('from_date') . $_GET['from_date'] . ' - ' . lang('to_date') . $_GET['to_date'];\n        $data['firmCurrency'] = $this->NewInvoiceModel->getFirmDefaultCurrency();\n        $this->render('reports/index', $head, $data);\n        $this->saveHistory('Go to items page');\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Admin.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Admin extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('SettingsModel');\n    }\n\n    public function index()\n    {\n        if (defined('EMPLOYEE_ID')) {\n            log_message('error', 'Employee with user id - ' . USER_ID . ' and employee id - ' . EMPLOYEE_ID . ' try to open administration');\n            show_404();\n        }\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_admin');\n        if (isset($_POST['name'])) {\n            $this->updateUser();\n        }\n        $_POST = $this->SettingsModel->getAdminInfo();\n        $this->render('settings/admin', $head, $data);\n        $this->saveHistory('Go to settings employees table page');\n    }\n\n    private function updateUser()\n    {\n        $isValid = $this->validateUserData();\n        if ($isValid === true) {\n            $this->SettingsModel->updateUserAdminInfo($_POST);\n            $this->session->set_flashdata('resultAction', lang('success_update_user_adm'));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n        }\n        redirect(lang_url('user/admin'));\n    }\n\n    private function validateUserData()\n    {\n        $errors = array();\n        if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {\n            $errors[] = lang('invalid_email');\n        } else {\n            $result_email_free = $this->SettingsModel->checkRegisteredUserFreeEmail($_POST['email']);\n            if ($result_email_free !== true) {\n                $errors[] = lang('problem_update_user_adm_em');\n            }\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Employees.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Employees extends USER_Controller\n{\n\n    private $num_rows = 20;\n    private $editId;\n    private $editEmployee;\n\n    public function __construct()\n    {\n        parent::__construct();\n        if (defined('EMPLOYEE_ID')) {\n            log_message('error', 'Employee with id - ' . EMPLOYEE_ID . ' tried to access employee management');\n            show_404();\n        }\n        $this->load->model(array('SettingsModel', 'HomeModel'));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_employees');\n        $rowscount = $this->SettingsModel->countEmployees($_GET);\n        $data['employees'] = $this->SettingsModel->getEmployees($this->num_rows, $page);\n        $data['linksPagination'] = pagination('user/settings/employees', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 5 : 4);\n        $this->render('settings/employees', $head, $data);\n        $this->saveHistory('Go to settings employees table page');\n    }\n\n    public function addNew($id = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_add_employee');\n        $this->editId = $id;\n        if (isset($_POST['name'])) {\n            $_POST['editId'] = $id;\n            $this->addEmployee();\n        }\n        if ($id > 0) {\n            $result = $this->SettingsModel->getEmployeeInfo($id);\n            if (empty($result)) {\n                log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to edit employee with id - ' . $id);\n                show_404();\n            }\n            unset($result['password']);\n            $_POST = $result;\n        }\n        if ($this->session->flashdata('saveData') != null) {\n            $_POST = $this->session->flashdata('saveData');\n        }\n        $data['myAccessFirms'] = $this->HomeModel->getEmployeeAvailableFirms($id);\n        $data['editId'] = $this->editId;\n        $this->render('settings/addEmployee', $head, $data);\n        $this->saveHistory('Go to settings employees add page');\n    }\n\n    public function manageRights($id = 0)\n    {\n        $data = array();\n        $head = array();\n        $this->editEmployee = $id;\n        $head['title'] = lang('title_everytime') . lang('title_empl_rights');\n        $data['permissions'] = $this->config->item('permissions');\n        $data['userPermissions'] = $this->SettingsModel->getEmployeePermissions($id);\n        if (empty($data['userPermissions'])) {\n            show_404();\n        }\n        if (isset($_POST['savePermissions'])) {\n            $this->savePermissions();\n        }\n        $this->render('settings/employeeRights', $head, $data);\n        $this->saveHistory('Go to rights employees page');\n    }\n\n    private function savePermissions()\n    {\n        $defaultPermissions = $this->config->item('permissions');\n        $toDb = array();\n        foreach ($defaultPermissions as $key => $val) {\n            $toDb[$key] = isset($_POST[$key]) ? 1 : 0;\n        }\n        $this->SettingsModel->updateEmployeePermissions($toDb, $this->editEmployee);\n        $this->session->set_flashdata('resultAction', lang('success_save_new_perms'));\n        redirect(lang_url('user/settings/employees/rights/' . $this->editEmployee));\n    }\n\n    private function addEmployee()\n    {\n        $isValid = $this->validateEmployee();\n        if ($isValid === true) {\n            $insertId = $this->SettingsModel->setEmployee($_POST);\n            if ($this->editId == 0) {\n                $this->setNewEmployeePermissions($insertId);\n            }\n            $this->saveHistory('Add employee - ' . $_POST['email']);\n            $this->session->set_flashdata('resultAction', lang('employee_add_success'));\n            redirect(lang_url('user/settings/employees'));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            $this->session->set_flashdata('saveData', $_POST);\n            if ($this->editId > 0) {\n                redirect(lang_url('user/settings/employees/add/' . $this->editId));\n            } else {\n                redirect(lang_url('user/settings/employees/add'));\n            }\n        }\n    }\n\n    private function setNewEmployeePermissions($employeeId)\n    {\n        $defaultPermissions = $this->config->item('permissions');\n        $this->SettingsModel->setNewEmployeePermissions($employeeId, $defaultPermissions);\n    }\n\n    private function validateEmployee()\n    {\n        $errors = array();\n        if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {\n            $errors[] = lang('invalid_email');\n        } else {\n            $isFree = $this->SettingsModel->checkEmployeeFreeEmail($_POST['email'], $this->editId);\n            if ($isFree == false) {\n                $errors[] = lang('employee_email_taken');\n            }\n        }\n        if ($this->editId == 0) {\n            if (mb_strlen(trim($_POST['password'])) == 0) {\n                $errors[] = lang('empty_password');\n            }\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n    public function deleteEmployee($id)\n    {\n        $this->SettingsModel->deleteEmployee($id);\n        redirect(lang_url('user/settings/employees'));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/GlobalSettings.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass GlobalSettings extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('SettingsModel'));\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_global_sett');\n        $this->postChecker();\n        $this->render('settings/global', $head, $data);\n        $this->saveHistory('Go to settings employees table page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['opt_pagination'])) {\n            $this->setPaginationNum();\n        }\n    }\n\n    private function setPaginationNum()\n    {\n        $this->SettingsModel->setValueStore('opt_pagination', (int) $_POST['opt_pagination']);\n        redirect(lang_url('user/settings/global'));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Invoices.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Invoices extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('SettingsModel', 'NewInvoiceModel'));\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $this->postChecker();\n        $head['title'] = lang('title_everytime') . lang('title_inv_sett');\n        $data['myFirms'] = $this->SettingsModel->getMyFirmsDefaultCurrency();\n        $data['currencies'] = $this->NewInvoiceModel->getCurrencies();\n        $data['myCurrencies'] = $this->SettingsModel->getMyCurrencies();\n        $data['myQuantityTypes'] = $this->SettingsModel->getMyQuantityTypes();\n        $data['myPaymentMethods'] = $this->SettingsModel->getMyPaymentMethods();\n        $data['myNoVatReasons'] = $this->SettingsModel->getMyNoVatReasons();\n        $data['opt_invTemplate'] = $this->SettingsModel->getValueStores('opt_invTemplate');\n        $this->render('settings/invoices', $head, $data);\n        $this->saveHistory('Go to settings invoices page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['currencyName'])) {\n            $this->addCurrency();\n        }\n        if (isset($_POST['quantityTypeName'])) {\n            $this->addQuantityType();\n        }\n        if (isset($_POST['paymentMethodName'])) {\n            $this->addPaymentMethod();\n        }\n        if (isset($_POST['noVatReason'])) {\n            $this->addNewNoVatReason();\n        }\n        if (isset($_POST['noVatReason'])) {\n            $this->addNewNoVatReason();\n        }\n        if (isset($_POST['opt_invRoundTo'])) {\n            $this->updateInvoicesRoundTo();\n        }\n        if (isset($_POST['updateInvCalculator'])) {\n            $this->updateInvCaluculatorUsage();\n        }\n        if (isset($_POST['updateInvTemplate'])) {\n            $this->updateInvTemplate();\n        }\n    }\n\n    private function updateInvCaluculatorUsage()\n    {\n        $this->SettingsModel->setValueStore('opt_invCalculator', isset($_POST['opt_invCalculator']) ? 0 : 1);\n        $this->saveHistory('Set calculator usage to - ' . $_POST['opt_invCalculator'] == 0 ? 'off' : 'on');\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    private function updateInvoicesRoundTo()\n    {\n        $this->SettingsModel->setValueStore('opt_invRoundTo', $_POST['opt_invRoundTo']);\n        $this->saveHistory('Update round invoices total to - ' . $_POST['opt_invRoundTo']);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    private function addNewNoVatReason()\n    {\n        $this->NewInvoiceModel->setNewVatReason($_POST['noVatReason']);\n        $this->saveHistory('Add new vat reason - ' . $_POST['noVatReason']);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    private function addPaymentMethod()\n    {\n        $this->NewInvoiceModel->setNewCustomPaymentMethod($_POST['paymentMethodName']);\n        $this->saveHistory('Add new payment method - ' . $_POST['paymentMethodName']);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    private function addCurrency()\n    {\n        $this->SettingsModel->setNewCurrency($_POST);\n        $this->saveHistory('Add new currency - ' . $_POST['currencyName'] . ' - ' . $_POST['currencyValue']);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    private function addQuantityType()\n    {\n        $this->NewInvoiceModel->setNewCustomQuantityType($_POST['quantityTypeName']);\n        $this->saveHistory('Add new quantity type - ' . $_POST['quantityTypeName']);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    private function updateInvTemplate()\n    {\n        $this->SettingsModel->setValueStore('opt_invTemplate', $_POST['invTempl']);\n        $this->saveHistory('Update invoices template to - ' . $_POST['invTempl']);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    /*\n     * Called from ajax only\n     */\n\n    public function defaultcurrency()\n    {\n        if (!$this->input->is_ajax_request()) {\n            exit('No direct script access allowed');\n        }\n        if ((isset($_POST['forId']) && is_numeric($_POST['forId'])) && isset($_POST['newDefault'])) {\n            $this->SettingsModel->setNewDefaultCurrency($_POST);\n            echo '1';\n            $this->saveHistory('Changed default currency to - ' . $_POST['newDefault'] . ' for firm id - ' . $_POST['forId']);\n        } else {\n            echo '0';\n        }\n    }\n\n    public function deleteDefaultCurrency($num)\n    {\n        $this->SettingsModel->deleteDefaultCurrency($num);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    public function deleteCurrency($num)\n    {\n        $this->SettingsModel->deleteMyCurrency($num);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    public function deleteQuantityType($id)\n    {\n        $this->SettingsModel->deleteCustomQuantityType($id);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    public function deletePaymentMethod($id)\n    {\n        $this->SettingsModel->deleteCustomPaymentMethod($id);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n    public function deleteNoVatReason($id)\n    {\n        $this->SettingsModel->deleteMyNoVatReason($id);\n        redirect(lang_url('user/settings/invoices'));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Protocols.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Protocols extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('ProtocolsModel');\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_protoc_sett');\n        if (isset($_POST['title'])) {\n            $this->setProviderTransmitText();\n        }\n        if (isset($_POST['contract'])) {\n            $this->setContract();\n        }\n        $data['providerTransmits'] = $this->ProtocolsModel->getProviderTransmits();\n        $data['contracts'] = $this->ProtocolsModel->getContracts();\n        $this->render('settings/protocols', $head, $data);\n        $this->saveHistory('Go to settings invoices page');\n    }\n\n    private function setProviderTransmitText()\n    {\n        $this->ProtocolsModel->setProviderTransmitText($_POST);\n        $this->saveHistory('Add new provider transmit text - ' . $_POST['title']);\n        redirect(lang_url('user/settings/protocols'));\n    }\n\n    public function deleteProviderTransmitText($id)\n    {\n        $this->ProtocolsModel->deleteProviderTransmitText($id);\n        $this->saveHistory('Delete provider transmit text - ' . $id);\n        redirect(lang_url('user/settings/protocols'));\n    }\n\n    private function setContract()\n    {\n        $this->ProtocolsModel->setContract($_POST);\n        $this->saveHistory('Add new contract - ' . $_POST['title']);\n        redirect(lang_url('user/settings/protocols'));\n    }\n\n    public function deleteContract($id)\n    {\n        $this->ProtocolsModel->deleteContract($id);\n        $this->saveHistory('Delete contract text - ' . $id);\n        redirect(lang_url('user/settings/protocols'));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Settings.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Settings extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_settings');\n        $this->render('settings/index', $head, $data);\n        $this->saveHistory('Go to settings page');\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Stores.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Stores extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('SettingsModel', 'StoreModel'));\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_store_sett');\n        $this->postChecker();\n        $data['myStores'] = $this->StoreModel->getStores();\n        $this->render('settings/stores', $head, $data);\n        $this->saveHistory('Go to settings invoices page');\n    }\n\n    private function postChecker()\n    {\n        if (isset($_POST['newStore'])) {\n            $this->addNewStore();\n        }\n        if (isset($_POST['deleteStore'])) {\n            $this->deleteStore();\n        }\n        if (isset($_POST['stopMovementCalculator'])) {\n            $this->updateMovementsCaluculatorUsage();\n        }\n        if (isset($_POST['opt_movementRoundTo'])) {\n            $this->updateMovementsRoundTo();\n        }\n        if (isset($_POST['allowNegativeQuantities'])) {\n            $this->updateNegativeQuantities();\n        }\n    }\n\n    private function updateMovementsCaluculatorUsage()\n    {\n        $this->SettingsModel->setValueStore('opt_movementCalculator', isset($_POST['opt_movementCalculator']) ? 0 : 1);\n        $this->saveHistory('Set calculator usage fo movements to - ' . $_POST['opt_movementCalculator'] == 0 ? 'off' : 'on');\n        redirect(lang_url('user/settings/stores'));\n    }\n\n    private function updateMovementsRoundTo()\n    {\n        $this->SettingsModel->setValueStore('opt_movementRoundTo', $_POST['opt_movementRoundTo']);\n        $this->saveHistory('Update round movements total to - ' . $_POST['opt_movementRoundTo']);\n        redirect(lang_url('user/settings/stores'));\n    }\n\n    private function updateNegativeQuantities()\n    {\n        $this->SettingsModel->setValueStore('opt_negativeQuantities', isset($_POST['opt_negativeQuantities']) ? 0 : 1);\n        $this->saveHistory('Update allow negative quantities - ' . $_POST['opt_negativeQuantities']);\n        redirect(lang_url('user/settings/stores'));\n    }\n\n    private function addNewStore()\n    {\n        $errors = $this->validateStoreName();\n        if (empty($errors)) {\n            $this->SettingsModel->setNewStore($_POST['newStore']);\n            $this->saveHistory('Add new store - ' . $_POST['newStore']);\n            redirect(lang_url('user/settings/stores'));\n        } else {\n            $this->session->set_flashdata('resultAction', $errors);\n            redirect(lang_url('user/settings/stores'));\n        }\n    }\n\n    private function validateStoreName()\n    {\n        $errors = array();\n        if (mb_strlen(trim($_POST['newStore'])) == 0) {\n            $errors[] = lang('empty_store_name');\n        } else {\n            $isFree = $this->SettingsModel->checkStoreNameIsFree($_POST['newStore']);\n            if ($isFree == false) {\n                $errors[] = lang('store_name_taken');\n            }\n        }\n        return $errors;\n    }\n\n    public function deleteStore($id)\n    {\n        $this->SettingsModel->deleteStore($id);\n        $this->saveHistory('Add delete store - ' . $id);\n        redirect(lang_url('user/settings/stores'));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/settings/Warranty.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Warranty extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('WarrantyCardModel');\n    }\n\n    public function index()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_warr_sett');\n        if (isset($_POST['condition'])) {\n            $this->setNewCondition();\n        }\n        $data['myConditions'] = $this->WarrantyCardModel->getWarrantyConditions();\n        $this->render('settings/warranty', $head, $data);\n        $this->saveHistory('Go to settings invoices page');\n    }\n\n    private function setNewCondition()\n    {\n        $this->WarrantyCardModel->setNewCondition($_POST);\n        $this->saveHistory('Add new warranty condition - ' . $_POST['conditionTitle']);\n        redirect(lang_url('user/settings/warranty'));\n    }\n\n    public function deleteCondition($id)\n    {\n        $this->WarrantyCardModel->deleteWarrantyCondition($id);\n        $this->saveHistory('Delete warranty condition - ' . $id);\n        redirect(lang_url('user/settings/warranty'));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/store/Movementview.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Movementview extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array('StoreModel'));\n    }\n\n    public function index($movementNumber)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_movem_prev');\n\n        $movement = $this->StoreModel->getMovementByNumber($movementNumber);\n        if ($movement == null) {\n            log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to open movement with number - ' . $movementNumber);\n            show_404();\n        }\n        $data['movement'] = $movement;\n        $this->render('store/preview', $head, $data);\n        $this->saveHistory('Go to preview movement with number ' . $movementNumber . ' and firm id' . SELECTED_COMPANY_ID);\n    }\n\n    public function viewMovementAsPdf($movementNumber)\n    {\n        $movement = $this->StoreModel->getMovementByNumber($movementNumber);\n        if ($movement == null) {\n            log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to view as PDF movement with number - ' . $movementNumber);\n            show_404();\n        }\n        $choosedTemplate = 'default';\n        $templatesDir = 'application/modules/users/views/store/templates/';\n        $templateFile = $templatesDir . $choosedTemplate . '.php';\n        if (!is_file($templateFile)) {\n            show_error(lang('no_template_file'));\n        }\n        $this->load->library('HtmlToPdf');\n        ob_start();\n        echo '\n        <!DOCTYPE html>\n        <html lang=\"en\">\n        <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <title>Administration - Home</title> \n        <link href=\"' . base_url('assets/bootstrap/css/bootstrap.min.css') . '\" rel=\"stylesheet\">\n        <link href=\"' . base_url('assets/users/css/bill-of-lading-templates.css') . '\" rel=\"stylesheet\">   \n        <script src=\"' . base_url('assets/jquery/jquery.min.js') . '\"></script>  \n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body> \n    ';\n        include $templateFile;\n        echo '</body></html>';\n        $html = ob_get_clean();\n        $this->htmltopdf->setNum($movementNumber); // set movement number to give it to footer\n        $this->htmltopdf->setType($movement['translation']['bill_of_goods']);\n        $this->htmltopdf->setPageTranslate($movement['translation']['page']); // set movement translation of 'page' word\n        $pdf = $this->htmltopdf->generatePdf($html);\n        $filename = 'bill_of_lading - ' . $movementNumber . '.pdf';\n\n        header('Content-Type: application/pdf');\n        header('Content-Disposition: inline; filename=\"' . $filename . '\"');\n        header('Expires: 0');\n        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');\n        header('Pragma: public');\n        header('Content-Length: ' . strlen($pdf));\n        echo $pdf;\n        exit;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/store/Store.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Store extends USER_Controller\n{\n\n    private $num_rows = 20;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array(\n            'StoreModel',\n            'NewInvoiceModel',\n            'SettingsModel',\n            'ManagefirmsModel'\n        ));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_movements');\n        $data['myStores'] = $this->StoreModel->getStores();\n        $rowscount = $this->StoreModel->countMovements($_GET);\n        $data['movements'] = $this->StoreModel->getMovements($this->num_rows, $page, $_GET);\n        $data['linksPagination'] = pagination('user/store', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 4 : 3);\n        if (isset($_POST['action'])) {\n            if ($_POST['action'] == 'stat_canceled') {\n                $this->changeStatusCanceled($_POST['ids'], true);\n            }\n            if ($_POST['action'] == 'remove_canceled') {\n                $this->changeStatusCanceled($_POST['ids'], false);\n            }\n        }\n        $this->render('store/index', $head, $data);\n        $this->saveHistory('Go to store page');\n    }\n\n    private function changeStatusCanceled($ids, $toStatus)\n    {\n        $this->StoreModel->multipleStatusCanceledMovements($ids, $toStatus);\n        redirect(lang_url('user/store'));\n    }\n\n    public function addMovement()\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_add_movement');\n        $data['myStores'] = $this->StoreModel->getStores();\n        $data['currencies'] = $this->NewInvoiceModel->getCurrencies();\n        $data['quantityTypes'] = $this->NewInvoiceModel->getAllQuantityTypes();\n        $data['myDefaultFirmCurrency'] = $this->NewInvoiceModel->getFirmDefaultCurrency();\n        $data['paymentMethods'] = $this->NewInvoiceModel->getPaymentMethods();\n        $data['myNoVatReasons'] = $this->SettingsModel->getMyNoVatReasons();\n        $data['movementsLanguages'] = $this->StoreModel->getMyMovementsLanguages();\n        $data['allForFirm'] = $this->ManagefirmsModel->getCompanyInfo(SELECTED_COMPANY_ID);\n        $data['nextMovementNumber'] = $this->StoreModel->getNextFreeMovementNumber();\n        if ($data['myDefaultFirmCurrency'] != null) {\n            $theCurrency = $data['myDefaultFirmCurrency'];\n        } else {\n            $theCurrency = 'EUR';\n        }\n        $data['theCurrency'] = $theCurrency;\n        if (isset($_POST['type'])) {\n            $this->createMovement();\n        }\n        if (isset($_POST['addNewMovementTranslation'])) {\n            $this->setNewMovementLanguage();\n        }\n\n        $this->render('store/addmovement', $head, $data);\n        $this->saveHistory('Go to store page');\n    }\n\n    private function setNewMovementLanguage()\n    {\n        $this->StoreModel->setNewMovementLanguage($_POST);\n        $this->saveHistory('Add movement language - ' . $_POST['language_name']);\n        redirect(lang_url('user/store/add-movement'));\n    }\n\n    private function createMovement()\n    {\n        $isValid = $this->validateMovement();\n        if ($isValid === true) {\n            $this->StoreModel->setMovement($_POST);\n            $this->session->set_flashdata('resultAction', lang('movement_added'));\n            redirect(lang_url('user/movement/view/' . $_POST['movement_number']));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            redirect(lang_url('user/store/add-movement'));\n        }\n    }\n\n    private function validateMovement()\n    {\n        $negativeQuantities = $this->SettingsModel->getValueStores('opt_negativeQuantities');\n\n        $errors = array();\n        if (mb_strlen(trim($_POST['movement_number'])) == 0) {\n            $errors[] = lang('err_create_movem_num');\n        } else {\n            $isFreeNum = $this->StoreModel->checkIsFreeMovementNumber($_POST['movement_number']);\n            if ($isFreeNum === false) {\n                $errors[] = lang('err_create_movem_num_is_taken');\n            }\n        }\n        foreach ($_POST['items_names'] as $item_name) {\n            if (mb_strlen(trim($item_name)) == 0) {\n                $errors[] = lang('err_create_no_item_name');\n            }\n        }\n        foreach ($_POST['items_quantities'] as $item_quantity) {\n            if (mb_strlen(trim($item_quantity)) == 0) {\n                $errors[] = lang('err_create_no_item_qua');\n            }\n        }\n        if ($_POST['type'] == 'out' || $_POST['type'] == 'move' || $_POST['type'] == 'revision') {\n            $i = 0;\n            foreach ($_POST['item_from_list'] as $item_from_list) {\n                $haveEnoughtQuantity = $this->StoreModel->checkHaveEnoughtQuantity($_POST['selected_store'], $item_from_list);\n                if ($haveEnoughtQuantity === null) {\n                    $errors[] = str_replace('%item%', $_POST['items_names'][$i], lang('item_is_not_in_store'));\n                } else {\n                    if ($negativeQuantities == '0') {\n                        if ($_POST['items_quantities'][$i] > $haveEnoughtQuantity) {\n                            $errors[] = str_replace('%item%', $_POST['items_names'][$i], lang('item_no_enought_quantity'));\n                        }\n                    }\n                }\n                $i++;\n            }\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n    public function stocks($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_stocks');\n        $data['myStores'] = $this->StoreModel->getStores();\n        $rowscount = $this->StoreModel->countStocks($this->num_rows, $page, $_GET);\n        $data['stockQuantities'] = $this->StoreModel->getStockQuantities($this->num_rows, $page, $_GET);\n        $data['linksPagination'] = pagination('user/store/stocks', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 5 : 4);\n        $this->render('store/stocks', $head, $data);\n        $this->saveHistory('Go to store stocks');\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/warranty/Events.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Events extends USER_Controller\n{\n\n    private $warrantyId = 0;\n    private $warrantyNumber = 0;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('WarrantyCardModel');\n    }\n\n    public function index($number)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] =  lang('title_everytime') . lang('title_events');\n        $warranty = $this->WarrantyCardModel->getWarrantyByNumber($number);\n        if (empty($warranty)) {\n            log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to open events for warranty with number - ' . $number);\n            show_404();\n        }\n        $data['events'] = $this->WarrantyCardModel->getWarrantyEvents($warranty['id']);\n        $data['eventId'] = $number;\n        $this->render('warranty/events', $head, $data);\n        $this->saveHistory('Go to events page');\n    }\n\n    public function addEvent($number)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_add_event');\n        $warranty = $this->WarrantyCardModel->getWarrantyByNumber($number);\n        if (empty($warranty)) {\n            log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to add event for warranty with number - ' . $number);\n            show_404();\n        }\n        $this->warrantyId = $warranty['id'];\n        $this->warrantyNumber = $number;\n        $data['warranty'] = $warranty;\n        if (isset($_POST['item'])) {\n            $this->setNewEvent();\n        }\n        $data['eventNumber'] = $number;\n        $this->render('warranty/add_event', $head, $data);\n        $this->saveHistory('Go to add events page');\n    }\n\n    private function setNewEvent()\n    {\n        $this->WarrantyCardModel->setWarrantyEvent($_POST, $this->warrantyId);\n        $this->saveHistory('Add warranty event for warrantyId - ' . $this->warrantyNumber . ' and item - ' . $_POST['item']);\n        redirect(lang_url('user/warranty/events/' . $this->warrantyNumber));\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/warranty/Warranty.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Warranty extends USER_Controller\n{\n\n    private $num_rows = 20;\n    private $editId = 0;\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model(array(\n            'WarrantyCardModel',\n            'SettingsModel',\n            'NewInvoiceModel',\n            'ManagefirmsModel'\n        ));\n        $paginationNumRows = $this->SettingsModel->getValueStores('opt_pagination');\n        $this->num_rows = $paginationNumRows;\n    }\n\n    public function index($page = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_warranties');\n        $rowscount = $this->WarrantyCardModel->countWarranties($_GET);\n        $data['warranties'] = $this->WarrantyCardModel->getWarranties($this->num_rows, $page, $_GET);\n        $data['linksPagination'] = pagination('user/warranties', $rowscount, $this->num_rows, MY_DEFAULT_LANGUAGE_ABBR != MY_LANGUAGE_ABBR ? 4 : 3);\n        if (isset($_POST['action'])) {\n            if ($_POST['action'] == 'delete') {\n                $this->deleteWarranties($_POST['ids']);\n            }\n        }\n        $this->render('warranty/index', $head, $data);\n        $this->saveHistory('Go to store page');\n    }\n\n    private function deleteWarranties($ids)\n    {\n        $this->WarrantyCardModel->multipleDeleteWarranties($ids);\n        redirect(lang_url('user/warranties'));\n    }\n\n    public function addwarranty($number = 0)\n    {\n        $data = array();\n        $head = array();\n        $head['title'] = lang('title_everytime') . lang('title_add_warr');\n        $data['myDefaultFirmCurrency'] = $this->NewInvoiceModel->getFirmDefaultCurrency();\n        $data['nextWarrantyNumber'] = $this->WarrantyCardModel->getNextFreeWarrantyNumber();\n        $data['warrantiesLanguages'] = $this->WarrantyCardModel->getMyWarrantiesLanguages();\n        $data['allForFirm'] = $this->ManagefirmsModel->getCompanyInfo(SELECTED_COMPANY_ID);\n        if ($data['myDefaultFirmCurrency'] != null) {\n            $theCurrency = $data['myDefaultFirmCurrency'];\n        } else {\n            $theCurrency = 'EUR';\n        }\n        if (isset($_POST['addNewWarrantyTranslation'])) {\n            $this->setNewWarrantyLanguage();\n        }\n        if (isset($_POST['warranty_number'])) {\n            $this->createWarranty();\n        }\n        $currentItems = array();\n        if ($number > 0) {\n            $result = $this->WarrantyCardModel->getWarrantyByNumber($number);\n            if (empty($result)) {\n                log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to edit warranty with number - ' . $number);\n                show_404();\n            }\n            $this->editId = $result['id'];\n            foreach ($result['items'] as $item) {\n                $currentItems[] = $item['id'];\n            }\n            $_POST = $result;\n        }\n        $data['currentItems'] = $currentItems;\n        $data['editId'] = $this->editId;\n        $data['theCurrency'] = $theCurrency;\n        $data['myConditions'] = $this->WarrantyCardModel->getWarrantyConditions();\n        $this->render('warranty/addwarranty', $head, $data);\n        $this->saveHistory('Go to store page');\n    }\n\n    private function setNewWarrantyLanguage()\n    {\n        $this->WarrantyCardModel->setNewWarrantyLanguage($_POST);\n        $this->saveHistory('Add warranty language - ' . $_POST['language_name']);\n        redirect(lang_url('user/warranties/add-warranty'));\n    }\n\n    private function createWarranty()\n    {\n        $isValid = $this->validateWarranty();\n        if ($isValid === true) {\n            if ($_POST['editId'] > 0) {\n                $this->WarrantyCardModel->updateWarranty($_POST);\n                $this->session->set_flashdata('resultAction', lang('warranty_updated'));\n            } else {\n                $this->WarrantyCardModel->setWarranty($_POST);\n                $this->session->set_flashdata('resultAction', lang('warranty_added'));\n            }\n            redirect(lang_url('user/warranties'));\n        } else {\n            $this->session->set_flashdata('resultAction', $isValid);\n            redirect(lang_url('user/warranties/add-warranty'));\n        }\n        redirect(lang_url('user/warranties'));\n    }\n\n    private function validateWarranty()\n    {\n        $errors = array();\n        if (mb_strlen(trim($_POST['warranty_number'])) == 0) {\n            $errors[] = lang('err_create_war_num');\n        } else {\n            $isFreeNum = $this->WarrantyCardModel->checkIsFreeWarrantyNumber($_POST['warranty_number'], $_POST['editId']);\n            if ($isFreeNum === false) {\n                $errors[] = lang('err_create_war_num_is_taken');\n            }\n        }\n        foreach ($_POST['items_names'] as $item_name) {\n            if (mb_strlen(trim($item_name)) == 0) {\n                $errors[] = lang('err_create_no_item_name');\n            }\n        }\n        foreach ($_POST['items_months'] as $item_quantity) {\n            if (mb_strlen(trim($item_quantity)) == 0) {\n                $errors[] = lang('err_create_war_no_item_month');\n            }\n        }\n        if (empty($errors)) {\n            return true;\n        }\n        return $errors;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/controllers/warranty/Warrantyview.php",
    "content": "<?php\n\n/*\n * @Author:    Kiril Kirkov\n *  Github:    https://github.com/kirilkirkov\n */\nif (!defined('BASEPATH')) {\n    exit('No direct script access allowed');\n}\n\nclass Warrantyview extends USER_Controller\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->load->model('WarrantyCardModel');\n    }\n\n    public function index()\n    {\n        show_404();\n    }\n\n    public function viewWarrantyAsPdf($warrantyNumber)\n    {\n        $warranty = $this->WarrantyCardModel->getWarrantyByNumber($warrantyNumber);\n        if ($warranty == null) {\n            log_message('error', 'User with id - ' . USER_ID . ' gets 404 when try to open as PDF warranty with number - ' . $warrantyNumber);\n            show_404();\n        }\n        $choosedTemplate = 'default';\n        $templatesDir = 'application/modules/users/views/warranty/templates/';\n        $templateFile = $templatesDir . $choosedTemplate . '.php';\n        if (!is_file($templateFile)) {\n            show_error(lang('no_template_file'));\n        }\n        $this->load->library('HtmlToPdf');\n        ob_start();\n        echo '\n        <!DOCTYPE html>\n        <html lang=\"en\">\n        <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <title>Administration - Home</title> \n        <link href=\"' . base_url('assets/bootstrap/css/bootstrap.min.css') . '\" rel=\"stylesheet\">\n        <link href=\"' . base_url('assets/users/css/warranty-cards-templates.css') . '\" rel=\"stylesheet\">   \n        <script src=\"' . base_url('assets/jquery/jquery.min.js') . '\"></script>  \n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body> \n    ';\n        include $templateFile;\n        echo '</body></html>';\n        $html = ob_get_clean();\n        $this->htmltopdf->setNum($warrantyNumber); // set warranty number to give it to footer\n        $this->htmltopdf->setType($warranty['translation']['warranty_card']);\n        $this->htmltopdf->setPageTranslate($warranty['translation']['page']); // set warranty translation of 'page' word\n        $pdf = $this->htmltopdf->generatePdf($html);\n        $filename = 'bill_of_lading - ' . $warrantyNumber . '.pdf';\n\n        header('Content-Type: application/pdf');\n        header('Content-Disposition: inline; filename=\"' . $filename . '\"');\n        header('Expires: 0');\n        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');\n        header('Pragma: public');\n        header('Content-Length: ' . strlen($pdf));\n        echo $pdf;\n        exit;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/ClientsModel.php",
    "content": "<?php\n\nclass ClientsModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function countClients($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setClientsSearchFilter($get);\n        }\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        return $this->db->count_all_results('clients');\n    }\n\n    public function getClients($limit, $page, $get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setClientsSearchFilter($get);\n        }\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $result = $this->db->get('clients', $limit, $page);\n        return $result->result_array();\n    }\n\n    private function setClientsSearchFilter($get)\n    {\n        if (isset($get['client_name']) && $get['client_name'] != '') {\n            $this->db->like('client_name', $get['client_name']);\n        }\n        if (isset($get['client_bulstat']) && $get['client_bulstat'] != '') {\n            $this->db->like('client_bulstat', $get['client_bulstat']);\n        }\n    }\n\n    public function getClientInfo($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $result = $this->db->get('clients');\n        return $result->row_array();\n    }\n\n    public function deleteClient($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        if (!$this->db->delete('clients')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function multipleDeleteClients($ids)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if (!$this->db->delete('clients')) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/HomeModel.php",
    "content": "<?php\n\nclass HomeModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function getFirms()\n    {\n        $this->db->select('firms_users.*, firms_translations.name, firms_translations.address, firms_translations.city, firms_translations.mol');\n        $this->db->where('firms_users.is_deleted', 0);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_translations.is_default', 1);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        return $result->result_array();\n    }\n\n    public function checkBulstatIsFree($bulstat, $excludeMe = false)\n    {\n        if ($excludeMe !== true) {\n            $this->db->where('id !=', $excludeMe);\n        }\n        $this->db->where('bulstat', $bulstat);\n        $num = $this->db->count_all_results('firms_users');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function setFirm($post)\n    {\n        $this->db->trans_begin();\n        if (!$this->db->insert('firms_users', array(\n                    'for_user' => USER_ID,\n                    'bulstat' => htmlspecialchars(trim($post['firm_bulstat'])),\n                    'is_default' => $post['is_default']\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        $lastId = $this->db->insert_id();\n        if (!$this->db->insert('firms_translations', array(\n                    'for_firm' => $lastId,\n                    'name' => htmlspecialchars(trim($post['firm_name'])),\n                    'address' => htmlspecialchars(trim($post['firm_reg_address'])),\n                    'city' => htmlspecialchars(trim($post['firm_city'])),\n                    'mol' => htmlspecialchars(trim($post['firm_mol'])),\n                    'trans_name' => $post['trans_name'] == null ? 'default' : htmlspecialchars(trim($post['trans_name'])),\n                    'is_default' => 1\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n        return $lastId;\n    }\n\n    public function getDefaultCompany()\n    {\n        $this->db->select('firms_translations.*, firms_translations.id as translation_id, firms_users.*, firms_users.id as id');\n        $this->db->limit(1);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('firms_translations.is_default', 1);\n        $this->db->where('firms_users.is_default', 1);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        return $result->row_array();\n    }\n\n    public function checkCompanyIsValidForUser($companyId)\n    {\n        $this->db->select('firms_translations.*, firms_users.*, firms_users.id as firm_id');\n        $this->db->limit(1);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('firms_users.id', $companyId);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        return $result->row_array();\n    }\n\n    public function getEmployeeAvailableFirms($id = 0)\n    {\n        $this->db->select('firms_access');\n        $this->db->limit(1);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('id', $id > 0 ? $id : EMPLOYEE_ID);\n        $result = $this->db->get('employees');\n        $arr = $result->row_array();\n        return unserialize($arr['firms_access']);\n    }\n\n    public function findResultsFromSearch($phrase)\n    {\n        $array = array();\n        $this->db->select('inv_number, inv_type');\n        $this->db->group_start();\n        $this->db->where('invoices.for_user', USER_ID);\n        $this->db->where('invoices.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('invoices.is_deleted', 0);\n        $this->db->group_end();\n        $this->db->group_start();\n        $this->db->like('inv_number', $phrase);\n        $this->db->or_like('client_name', $phrase);\n        $this->db->group_end();\n        $this->db->limit(5);\n        $this->db->join('invoices_clients', 'invoices_clients.for_invoice = invoices.id');\n        $result = $this->db->get('invoices');\n        $rowsInvoices = $result->result_array();\n        if (!empty($rowsInvoices)) {\n            $array['invoices'] = $rowsInvoices;\n        }\n\n        $this->db->select('name, id');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->like('name', $phrase);\n        $this->db->limit(5);\n        $result = $this->db->get('items');\n        $rowsItems = $result->result_array();\n        if (!empty($rowsItems)) {\n            $array['items'] = $rowsItems;\n        }\n\n        $this->db->select('client_name, id');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->like('client_name', $phrase);\n        $this->db->limit(5);\n        $result = $this->db->get('clients');\n        $rowsClients = $result->result_array();\n        if (!empty($rowsClients)) {\n            $array['clients'] = $rowsClients;\n        }\n\n        return $array;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/ImportExportModel.php",
    "content": "<?php\n\nclass ImportExportModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /*\n     * wait for timestamps $from, $to\n     */\n\n    public function getInvoices($from = null, $to = null)\n    {\n        if ($from != null && $to != null) {\n            $this->db->where('created >=', $from);\n            $this->db->where('created <=', $to);\n        }\n        $this->db->where('invoices.for_user', USER_ID);\n        $this->db->where('invoices.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('invoices.is_deleted', 0);\n        $result = $this->db->get('invoices');\n        $invoices = $result->result_array();\n        if (empty($invoices)) {\n            return $invoices;\n        }\n        foreach ($invoices as &$invoice) {\n            $result = $this->db->where('for_invoice', $invoice['id'])->order_by('position', 'asc')->get('invoices_items');\n            $items = $result->result_array();\n            $invoice['items'] = $items;\n\n            $result = $this->db->where('for_invoice', $invoice['id'])->get('invoices_clients');\n            $client = $result->row_array();\n            $invoice['client'] = $client;\n\n            $result = $this->db->where('for_invoice', $invoice['id'])->get('invoices_firms');\n            $firm = $result->row_array();\n            $invoice['firm'] = $firm;\n        }\n        return $invoices;\n    }\n\n    /*\n     * This method uses methods from NewInvoiceModel\n     */\n\n    public function setInvoicesFromImport($invoices)\n    {\n        $this->load->model('NewInvoiceModel');\n        foreach ($invoices as $invoice) {\n            /*\n             * If no errors\n             * Lets go import\n             */\n            if (empty($invoice['errors'])) {\n                $this->NewInvoiceModel->setInvoice($invoice['inv']);\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/InvoicesModel.php",
    "content": "<?php\n\nclass InvoicesModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function countInvoices($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setInvoicesSearchFilter($get);\n        }\n        $this->db->select('COUNT(invoices.id)');\n        $this->db->where('invoices.for_user', USER_ID);\n        $this->db->where('invoices.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('invoices.is_deleted', 0);\n        $this->db->join('invoices_clients', 'invoices_clients.for_invoice = invoices.id');\n        return $this->db->count_all_results('invoices');\n    }\n\n    public function sumOfAmounts($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setInvoicesSearchFilter($get);\n        }\n        $this->db->select('SUM(invoices.final_total) as sumAmount');\n        $this->db->where('invoices.for_user', USER_ID);\n        $this->db->where('invoices.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('invoices.is_deleted', 0);\n        $this->db->join('invoices_clients', 'invoices_clients.for_invoice = invoices.id');\n        $result = $this->db->get('invoices');\n        $row = $result->row_array();\n        return $row['sumAmount'];\n    }\n\n    public function getInvoices($limit, $page, $get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setInvoicesSearchFilter($get);\n        }\n        $this->db->select('invoices_clients.client_name, invoices.inv_number, invoices.date_create, invoices.final_total, invoices.inv_type, invoices.status, invoices.inv_currency, invoices.id, invoices.payment_status');\n        $this->db->where('invoices.for_user', USER_ID);\n        $this->db->where('invoices.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('invoices.is_deleted', 0);\n        $this->db->order_by('id', 'desc');\n        $this->db->join('invoices_clients', 'invoices_clients.for_invoice = invoices.id');\n        $result = $this->db->get('invoices', $limit, $page);\n        return $result->result_array();\n    }\n\n    private function setInvoicesSearchFilter($get)\n    {\n        if (isset($get['inv_number']) && trim($get['inv_number']) != '') {\n            $this->db->like('inv_number', (int) $get['inv_number']);\n        }\n        if (isset($get['inv_client']) && trim($get['inv_client']) != '') {\n            $this->db->like('invoices_clients.client_name', trim($get['inv_client']));\n        }\n        if (isset($get['inv_item']) && trim($get['inv_item']) != '') {\n            $this->db->join('invoices_items', 'invoices_items.for_invoice = invoices.id');\n            $this->db->like('invoices_items.name', trim($get['inv_item']));\n            $this->db->distinct();\n        }\n        if (isset($get['amount_from']) && $get['amount_from'] != '') {\n            $this->db->where('final_total >=', (float) $get['amount_from']);\n        }\n        if (isset($get['amount_to']) && $get['amount_to'] != '') {\n            $this->db->where('final_total >=', (float) $get['amount_to']);\n        }\n        if (isset($get['create_from']) && trim($get['create_from']) != '') {\n            $from = strtotime($get['create_from']);\n            if ($from != false) {\n                $this->db->where('created >=', $from);\n            }\n        }\n        if (isset($get['create_to']) && trim($get['create_to']) != '') {\n            $to = strtotime($get['create_to']);\n            if ($to != false) {\n                $this->db->where('created <=', $to);\n            }\n        }\n        if (isset($get['inv_payment_type']) && trim($get['inv_payment_type']) != '') {\n            $this->db->where('payment_method', trim($get['inv_payment_type']));\n        }\n        if (isset($get['inv_type']) && $get['inv_type'] != '') {\n            $this->db->where_in('inv_type', $get['inv_type']);\n        }\n        if (isset($get['inv_payment']) && $get['inv_payment'] != '') {\n            $this->db->where_in('payment_status', $get['inv_payment']);\n        }\n        if (isset($get['inv_status']) && $get['inv_status'] != '') {\n            $this->db->where_in('status', $get['inv_status']);\n        }\n    }\n\n    public function deleteInvoice($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        if (!$this->db->update('invoices', array('is_deleted' => 1))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function multipleDeleteInvoices($ids)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if (!$this->db->update('invoices', array('is_deleted' => 1))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function multipleStatusCanceledInvoices($ids, $doCanceled)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if ($doCanceled == true) {\n                $status = 'canceled';\n            } else {\n                $status = 'issued';\n            }\n            if (!$this->db->update('invoices', array('status' => $status))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function updateInvoicePaymentStatus($invoiceId, $toStatus)\n    {\n        $this->db->where('id', $invoiceId);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        if (!$this->db->update('invoices', array('payment_status' => $toStatus))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/ItemsModel.php",
    "content": "<?php\n\nclass ItemsModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function countItems($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setItemsSearchFilter($get);\n        }\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        return $this->db->count_all_results('items');\n    }\n\n    public function getItems($limit, $page, $get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setItemsSearchFilter($get);\n        }\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $result = $this->db->get('items', $limit, $page);\n        return $result->result_array();\n    }\n\n    private function setItemsSearchFilter($get)\n    {\n        if (isset($get['item_name']) && $get['item_name'] != '') {\n            $this->db->like('name', $get['item_name']);\n        }\n        if (isset($get['amount_from']) && $get['amount_from'] != '') {\n            $this->db->where('single_price >=', (float) $get['amount_from']);\n        }\n        if (isset($get['amount_to']) && $get['amount_to'] != '') {\n            $this->db->where('single_price >=', (float) $get['amount_to']);\n        }\n    }\n\n    public function getItemInfo($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $result = $this->db->get('items');\n        return $result->row_array();\n    }\n\n    private function setInvoicesSearchFilter($get)\n    {\n        if (isset($get['client_name']) && $get['client_name'] != '') {\n            $this->db->like('client_name', $get['client_name']);\n        }\n        if (isset($get['client_bulstat']) && $get['client_bulstat'] != '') {\n            $this->db->like('client_bulstat', $get['client_bulstat']);\n        }\n    }\n\n    public function deleteItem($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        if (!$this->db->delete('items')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setItem($post)\n    {\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'name' => htmlspecialchars(trim($post['name'])),\n            'quantity_type' => htmlspecialchars(trim($post['quantity_type'])),\n            'single_price' => htmlspecialchars(trim($post['single_price'])),\n            'currency' => htmlspecialchars(trim($post['currency']))\n        );\n        if ($post['editId'] > 0) {\n            if (!$this->db->where('id', $post['editId'])->where('for_user', USER_ID)->where('for_company', SELECTED_COMPANY_ID)->update('items', $insertArray)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        } else {\n            if (!$this->db->insert('items', $insertArray)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function multipleDeleteItems($ids)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if (!$this->db->delete('items')) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/ManagefirmsModel.php",
    "content": "<?php\n\nclass ManagefirmsModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function deleteCompany($companyId)\n    {\n        $this->db->limit(1);\n        $this->db->where('id', $companyId);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('firms_users', array('is_deleted' => 1))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n        $this->checkThatWeHaveDefaultCompany($companyId);\n        return $result;\n    }\n\n    /*\n     * If we dont have default company after delete\n     * Create last added as default\n     */\n\n    private function checkThatWeHaveDefaultCompany()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('is_default', 1);\n        $this->db->where('is_deleted', 0);\n        $num = $this->db->count_all_results('firms_users');\n        if ($num == 0) {\n            $this->db->limit(1);\n            $this->db->order_by('id', 'desc');\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('is_deleted', 0);\n            $this->db->update('firms_users', array(\n                'is_default' => 1\n            ));\n        }\n    }\n\n    public function getCompanyInfo($companyId)\n    {\n        $array = array();\n\n        $this->db->select('id, bulstat, show_logo, is_vat_registered, vat_number');\n        $this->db->where('id', $companyId);\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('firms_users');\n        $array['company'] = $result->row_array();\n\n        $this->db->select('id, trans_name, is_default');\n        $this->db->where('for_firm', $companyId);\n        $result = $this->db->get('firms_translations');\n        $array['translations'] = $result->result_array();\n\n        return $array;\n    }\n\n    public function updateCompanyStaticInfo($post, $companyId)\n    {\n        $this->db->where('id', $companyId);\n        $this->db->where('for_user', USER_ID);\n        $bulstat = htmlspecialchars(trim($post['firm_bulstat']));\n        $vatNumber = htmlspecialchars(trim($post['vat_number']));\n        $showLogo = 0;\n        if (isset($post['show_logo'])) {\n            $showLogo = 1;\n        }\n        $isVatRegistered = 0;\n        if (isset($post['is_vat_registered'])) {\n            $isVatRegistered = 1;\n        }\n        if (!$this->db->update('firms_users', array(\n                    'bulstat' => $bulstat,\n                    'show_logo' => $showLogo,\n                    'is_vat_registered' => $isVatRegistered,\n                    'vat_number' => $vatNumber\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getTranslationInfo($translationId, $companyId)\n    {\n        $this->db->where('id', $translationId);\n        $this->db->where('for_firm', $companyId);\n        $result = $this->db->get('firms_translations');\n        return $result->row_array();\n    }\n\n    public function getMyCompanyDefaultTranslation($companyId)\n    {\n        $this->db->limit(1);\n        $this->db->where('for_firm', $companyId);\n        $this->db->where('is_default', 1);\n        $result = $this->db->get('firms_translations');\n        return $result->row_array();\n    }\n\n    public function updateTranslation($post, $companyId)\n    {\n        $this->db->where('for_firm', $companyId);\n        $this->db->where('id', $post['translation_id']);\n        if (!$this->db->update('firms_translations', array(\n                    'trans_name' => htmlspecialchars(trim($post['trans_name'])),\n                    'name' => htmlspecialchars(trim($post['firm_name'])),\n                    'address' => htmlspecialchars(trim($post['firm_reg_address'])),\n                    'city' => htmlspecialchars(trim($post['firm_city'])),\n                    'mol' => htmlspecialchars(trim($post['firm_mol'])),\n                    'image' => $post['image']\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setNewTranslation($post, $companyId)\n    {\n        if (!$this->db->insert('firms_translations', array(\n                    'for_firm' => $companyId,\n                    'trans_name' => htmlspecialchars(trim($post['trans_name'])),\n                    'name' => htmlspecialchars(trim($post['firm_name'])),\n                    'address' => htmlspecialchars(trim($post['firm_reg_address'])),\n                    'city' => htmlspecialchars(trim($post['firm_city'])),\n                    'mol' => htmlspecialchars(trim($post['firm_mol'])),\n                    'image' => $post['image'],\n                    'is_default' => 0\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function makeDefaultFirmWithId($firmId)\n    {\n        $this->db->trans_begin();\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('firms_users', array('is_default' => 0))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $this->db->where('id', $firmId);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('firms_users', array('is_default' => 1))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function makeDefaultTranslationWithId($companyId, $translationId)\n    {\n        $this->db->trans_begin();\n        $this->db->where('for_firm', $companyId);\n        if (!$this->db->update('firms_translations', array('is_default' => 0))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $this->db->where('id', $translationId);\n        $this->db->where('for_firm', $companyId);\n        if (!$this->db->update('firms_translations', array('is_default' => 1))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function deleteTranslation($companyId, $translationid)\n    {\n        $this->db->where('firms_translations.for_firm', $companyId);\n        $this->db->where('for_user', USER_ID);\n        $this->db->join('firms_users', 'firms_translations.for_firm = firms_users.id');\n        $num = $this->db->count_all_results('firms_translations');\n        if ($num > 1) {\n            $query = 'DELETE firms_translations FROM firms_translations INNER JOIN firms_users ON firms_users.id = firms_translations.for_firm WHERE firms_users.for_user = ' . $this->db->escape(USER_ID) . ' AND firms_translations.id = ' . $this->db->escape($translationid);\n            if (!$this->db->query($query)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n            $this->checkThatWeHaveDefaultTranslate($companyId);\n        }\n    }\n\n    /*\n     * If we dont have default translation after delete\n     * Create last added as default\n     */\n\n    private function checkThatWeHaveDefaultTranslate($companyId)\n    {\n        $this->db->where('for_firm', $companyId);\n        $this->db->where('is_default', 1);\n        $num = $this->db->count_all_results('firms_translations');\n        if ($num == 0) {\n            $this->db->limit(1);\n            $this->db->order_by('id', 'desc');\n            $this->db->where('for_firm', $companyId);\n            if (!$this->db->update('firms_translations', array(\n                        'is_default' => 1\n                    ))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function getLastAddedCompanyId()\n    {\n        $this->db->select('id');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('is_deleted', 0);\n        $this->db->limit(1);\n        $this->db->order_by('id', 'desc');\n        $result = $this->db->get('firms_users');\n        $row = $result->row_array();\n        return $row['id'];\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/NewInvoiceModel.php",
    "content": "<?php\n\nclass NewInvoiceModel extends CI_Model\n{\n    /*\n     * Ids in database of the default \n     * invoice languages in table \"invoices_languages\"\n     * JUST HARDCODED $sysDefTransIds\n     * They must be same in $sysDefTransIds, newinvoice.php(view) and in \"invoices_languages\" table\n     */\n\n    private $sysDefTransIds = array(1, 2, 3);\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function getCurrencies()\n    {\n        $result = $this->db->query('SELECT name, value FROM currencies UNION ALL SELECT name, value FROM users_currencies WHERE users_currencies.for_user = ' . $this->db->escape(USER_ID));\n        return $result->result_array();\n    }\n\n    public function getFirmDefaultCurrency()\n    {\n        $this->db->select('default_currency');\n        $this->db->where('id', SELECTED_COMPANY_ID);\n        $result = $this->db->get('firms_users');\n        $ar = $result->row_array();\n        return $ar['default_currency'];\n    }\n\n    public function getAllQuantityTypes()\n    {\n        $result = $this->db->query('SELECT name FROM quantity_types UNION ALL SELECT name FROM users_quantity_types WHERE users_quantity_types.for_user = ' . $this->db->escape(USER_ID));\n        return $result->result_array();\n    }\n\n    public function setNewCustomQuantityType($newQuantityType)\n    {\n        if (!$this->db->insert('users_quantity_types', array('name' => $newQuantityType, 'for_user' => USER_ID))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getPaymentMethods()\n    {\n        $result = $this->db->query('SELECT name FROM payment_methods UNION ALL SELECT name FROM users_payment_methods WHERE users_payment_methods.for_user = ' . $this->db->escape(USER_ID));\n        return $result->result_array();\n    }\n\n    public function setNewCustomPaymentMethod($newPaymentMethod)\n    {\n        if (!$this->db->insert('users_payment_methods', array('name' => $newPaymentMethod, 'for_user' => USER_ID))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setNewVatReason($newVatReason)\n    {\n        if (!$this->db->insert('user_no_vat_reasons', array('reason' => $newVatReason, 'for_user' => USER_ID))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setNewInvoiceLanguage($post)\n    {\n        unset($post['addNewInvoiceLanguage']);\n        $post['for_user'] = USER_ID;\n        if (!$this->db->insert('invoices_languages', $post)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getMyInvoiceLanguages()\n    {\n        $this->db->select('id, language_name');\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('invoices_languages');\n        return $result->result_array();\n    }\n\n    public function checkIsFreeInvoiceNumber($number, $invType, $without = 0)\n    {\n        /*\n         * If we edit an invoice, \n         * we put the ID to not be verified\n         */\n        if ($without > 0) {\n            $this->db->where('id !=', $without);\n        }\n        $this->db->where('inv_type', $invType);\n        $this->db->where('inv_number', $number);\n        $this->db->where('is_deleted', 0);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $num = $this->db->count_all_results('invoices');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function getNextFreeInvoiceNumber()\n    {\n        $this->db->select_max('inv_number');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('is_deleted', 0);\n        $result = $this->db->get('invoices');\n        $row = $result->row_array();\n        /*\n         * If dont have invoices return number 1\n         * Else the max number + 1\n         */\n        if (empty($row)) {\n            return full_document_number(1);\n        } else {\n            return full_document_number($row['inv_number'] + 1);\n        }\n    }\n\n    public function setInvoice($post)\n    {\n        $inv_statuses = $this->config->item('inv_statuses');\n        $cash_accounting = isset($post['cash_accounting']) ? 1 : 0;\n        $have_maturity_date = isset($post['have_maturity_date']) ? 1 : 0;\n        $no_vat = isset($post['no_vat']) ? 1 : 0;\n        $composedFrom = isset($post['userInfo']['employee']) ? $post['userInfo']['employee']['name'] : $post['userInfo']['user']['name'];\n        $schiffer = isset($post['userInfo']['employee']) ? $post['userInfo']['employee']['schiffer'] : $post['userInfo']['user']['schiffer'];\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'inv_type' => htmlspecialchars(trim($post['inv_type'])),\n            'status' => !in_array($post['status'], $inv_statuses) ? 'issued' : $post['status'],\n            'inv_number' => full_document_number(htmlspecialchars(trim($post['inv_number']))),\n            'inv_currency' => htmlspecialchars(trim($post['inv_currency'])),\n            'date_create' => strtotime($post['date_create']),\n            'date_tax_event' => strtotime($post['date_tax_event']),\n            'cash_accounting' => $cash_accounting,\n            'have_maturity_date' => $have_maturity_date,\n            'maturity_date' => strtotime($post['maturity_date']),\n            'remarks' => htmlspecialchars(trim($post['remarks'])),\n            'payment_method' => htmlspecialchars(trim($post['payment_method'])),\n            'payment_status' => 'unpaid',\n            'to_inv_number' => htmlspecialchars(trim($post['to_inv_number'])),\n            'to_inv_date' => strtotime($post['to_inv_date']),\n            'invoice_amount' => htmlspecialchars(trim($post['invoice_amount'])),\n            'discount' => htmlspecialchars(trim($post['discount'])),\n            'discount_type' => htmlspecialchars(trim($post['discount_type'])),\n            'tax_base' => htmlspecialchars(trim($post['tax_base'])),\n            'vat_percent' => htmlspecialchars(trim($post['vat_percent'])),\n            'vat_sum' => htmlspecialchars(trim($post['vat_sum'])),\n            'no_vat' => $no_vat,\n            'no_vat_reason' => htmlspecialchars(trim($post['no_vat_reason'])),\n            'final_total' => htmlspecialchars(trim($post['final_total'])),\n            'composed' => htmlspecialchars(trim($composedFrom)),\n            'schiffer' => htmlspecialchars(trim($schiffer)),\n            'created' => time(),\n            'uniqid' => USER_ID . 'u' . uniqid()\n        );\n        $this->db->trans_begin();\n        if (!$this->db->insert('invoices', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        $insertId = $this->db->insert_id();\n        $this->setInvoiceTranslation($insertId, $post['invoice_translation']);\n        $this->setInvoiceItems($insertId, $post);\n        $this->setInvoiceClient($insertId, $post);\n        $this->setInvoiceFirm($insertId, $post);\n        $this->removeInvoiceNumberFromPlans(); // decrement invoices number from plans\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function updateInvoice($post)\n    {\n        $cash_accounting = isset($post['cash_accounting']) ? 1 : 0;\n        $have_maturity_date = isset($post['have_maturity_date']) ? 1 : 0;\n        $no_vat = isset($post['no_vat']) ? 1 : 0;\n        $updateArray = array(\n            'inv_type' => htmlspecialchars($post['inv_type']),\n            'inv_number' => htmlspecialchars($post['inv_number']),\n            'inv_currency' => htmlspecialchars($post['inv_currency']),\n            'date_create' => strtotime($post['date_create']),\n            'date_tax_event' => strtotime($post['date_tax_event']),\n            'cash_accounting' => $cash_accounting,\n            'have_maturity_date' => $have_maturity_date,\n            'maturity_date' => strtotime($post['maturity_date']),\n            'remarks' => htmlspecialchars($post['remarks']),\n            'payment_method' => htmlspecialchars($post['payment_method']),\n            'to_inv_number' => htmlspecialchars($post['to_inv_number']),\n            'to_inv_date' => strtotime($post['to_inv_date']),\n            'invoice_amount' => htmlspecialchars($post['invoice_amount']),\n            'discount' => htmlspecialchars($post['discount']),\n            'discount_type' => htmlspecialchars($post['discount_type']),\n            'tax_base' => htmlspecialchars($post['tax_base']),\n            'vat_percent' => htmlspecialchars($post['vat_percent']),\n            'vat_sum' => htmlspecialchars($post['vat_sum']),\n            'no_vat' => $no_vat,\n            'no_vat_reason' => htmlspecialchars($post['no_vat_reason']),\n            'composed' => htmlspecialchars($post['composed']),\n            'schiffer' => htmlspecialchars($post['schiffer']),\n            'final_total' => htmlspecialchars($post['final_total'])\n        );\n        $this->db->trans_begin();\n        if (!$this->db->where('id', $post['editId'])->where('for_user', USER_ID)->where('for_company', SELECTED_COMPANY_ID)->update('invoices', $updateArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if (isset($post['show_translations'])) {\n            $this->updateInvoiceTranslation($post['editId'], $post['invoice_translation']);\n        }\n        $this->updateInvoiceClient($post['editId'], $post);\n        $this->updateInvoiceItems($post['editId'], $post);\n        if (isset($post['show_translations_firms'])) {\n            $this->updateInvoiceFirm($post['editId'], $post);\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    private function setInvoiceFirm($invoiceId, $post)\n    {\n        $this->db->where('firms_translations.id', $post['invoice_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $insertArray = array(\n            'for_invoice' => $invoiceId,\n            'for_user' => USER_ID,\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image'] == null ? '' : $firm['image']\n        );\n        if (!$this->db->insert('invoices_firms', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function removeInvoiceNumberFromPlans()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('from_date <=', time());\n        $this->db->where('to_date >=', time());\n        $this->db->where('num_invoices >', 0);\n        $this->db->order_by('to_date', 'ASC');\n        $this->db->limit(1);\n        $this->db->set('num_invoices', 'num_invoices - 1', FALSE);\n        if (!$this->db->update('firms_plans')) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateInvoiceFirm($invoiceId, $post)\n    {\n        $this->db->where('firms_translations.id', $post['invoice_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $updateArray = array(\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image']\n        );\n        if (!$this->db->where('for_invoice', $invoiceId)->update('invoices_firms', $updateArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateInvoiceTranslation($invoiceId, $translateId)\n    {\n        if (in_array($translateId, $this->sysDefTransIds)) {\n            $this->db->where('id', $translateId);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('invoices_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        $translate['for_invoice'] = $invoiceId;\n        $translate['for_user'] = USER_ID;\n        $this->db->where('for_invoice', $invoiceId);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('invoices_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateInvoiceClient($invoiceId, $post)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $updateArray = array(\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['recipient_name'])),\n        );\n        if (!$this->db->where('for_invoice', $invoiceId)->update('invoices_clients', $updateArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateInvoiceItems($invoiceId, $post)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        $deleteIds = array();\n        foreach (explode(',', $post['onLoadItems']) as $onLoadItem) {\n            if (!in_array($onLoadItem, $post['is_item_update'])) {\n                $deleteIds[] = $onLoadItem;\n            }\n        }\n        if (!empty($deleteIds)) {\n            $this->db->where('for_invoice', $invoiceId);\n            $this->db->where_in('id', $deleteIds);\n            if (!$this->db->delete('invoices_items')) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n        }\n        while ($i <= $numItems) {\n            /*\n             * If is update, update the item\n             * else insert the new\n             */\n            if ($post['is_item_update'][$i] > 0) {\n                $arrItem = array(\n                    'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                    'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                    'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                    'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                    'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                    'position' => $position\n                );\n                if (!$this->db->where('for_invoice', $invoiceId)->where('id', $post['is_item_update'][$i])->update('invoices_items', $arrItem)) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            } else {\n                $arrItem = array(\n                    'for_invoice' => $invoiceId,\n                    'for_user' => USER_ID,\n                    'for_company' => SELECTED_COMPANY_ID,\n                    'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                    'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                    'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                    'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                    'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                    'position' => $position\n                );\n                if (!$this->db->insert('invoices_items', $arrItem)) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function setInvoiceClient($invoiceId, $post)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'for_invoice' => $invoiceId,\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars($post['client_address']),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['recipient_name'])),\n        );\n        if (!$this->db->insert('invoices_clients', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        /*\n         * If client is not selected from list\n         * add it \n         */\n        if ($post['client_from_list'] == 0) {\n            $this->setClient($post);\n        }\n    }\n\n    private function setInvoiceItems($invoiceId, $post)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        while ($i <= $numItems) {\n            $arrItem = array(\n                'for_invoice' => $invoiceId,\n                'for_user' => USER_ID,\n                'for_company' => SELECTED_COMPANY_ID,\n                'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                'position' => $position\n            );\n            if (!$this->db->insert('invoices_items', $arrItem)) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n            /*\n             * If item is not selected from list\n             * add it \n             */\n            if ($post['item_from_list'][$i] == 0) {\n                unset($arrItem['position'], $arrItem['total_price'], $arrItem['for_invoice'], $arrItem['quantity']);\n                $arrItem['currency'] = $post['inv_currency'];\n                $this->setItemFromInvoice($arrItem);\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function setInvoiceTranslation($invoiceId, $translateId)\n    {\n        if (in_array($translateId, $this->sysDefTransIds)) {\n            $this->db->where('id', $translateId);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('invoices_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        $translate['for_invoice'] = $invoiceId;\n        $translate['for_user'] = USER_ID;\n        if (!$this->db->insert('invoices_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    public function setClient($post)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['recipient_name'])),\n        );\n        if ($post['editId'] > 0) {\n            if (!$this->db->where('id', $post['editId'])->update('clients', $insertArray)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        } else {\n            if (!$this->db->insert('clients', $insertArray)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n            return $this->db->insert_id();\n        }\n    }\n\n    public function setItemFromInvoice($arrItem)\n    {\n        if (!$this->db->insert('items', $arrItem)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getListForSelector($type)\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        if ($type == 'client') {\n            $this->db->select('client_name, client_bulstat, is_to_person, vat_number, client_vat_registered, client_ident_num, client_address, client_city, client_country, accountable_person, recipient_name');\n            $result = $this->db->get('clients');\n        }\n        if ($type == 'item') {\n            $this->db->select('id, name, quantity_type, single_price, currency');\n            $result = $this->db->get('items');\n        }\n        return $result->result_array();\n    }\n\n    public function getInvoiceByNumber($invType, $invId)\n    {\n        $this->db->where('inv_type', $invType);\n        $this->db->where('invoices.inv_number', $invId);\n        $this->db->where('invoices.for_user', USER_ID);\n        $this->db->where('invoices.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('invoices.is_deleted', 0);\n        $this->db->limit(1);\n        $result = $this->db->get('invoices');\n        $arr = $result->row_array();\n// if dont find this invoice.. dont search items\n        if (empty($arr)) {\n            return $arr;\n        }\n        $result = $this->db->where('for_invoice', $arr['id'])->order_by('position', 'asc')->get('invoices_items');\n        $items = $result->result_array();\n        $arr['items'] = $items;\n\n        $result = $this->db->where('for_invoice', $arr['id'])->get('invoices_clients');\n        $client = $result->row_array();\n        $arr['client'] = $client;\n\n        $result = $this->db->where('for_invoice', $arr['id'])->get('invoices_firms');\n        $firm = $result->row_array();\n        $arr['firm'] = $firm;\n\n        $result = $this->db->where('for_invoice', $arr['id'])->get('invoices_translations');\n        $translation = $result->row_array();\n        $arr['translation'] = $translation;\n        return $arr;\n    }\n\n    public function getActionHistory($invoiceId)\n    {\n        $this->db->where('invoice_id', $invoiceId);\n        $this->db->order_by('id', 'desc');\n        $result = $this->db->get('invoices_logs');\n        return $result->result_array();\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/PlansModel.php",
    "content": "<?php\n\nclass PlansModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function getMyPlanUnits()\n    {\n        $timeNow = time();\n        $result = $this->db->query('SELECT SUM(num_invoices) as num_invoices, SUM(num_firms) as num_firms FROM firms_plans WHERE ' . $timeNow . ' >= from_date AND ' . $timeNow . ' <= to_date AND for_user = ' . USER_ID);\n        return $result->row_array();\n    }\n\n    public function getMyPlanType()\n    {\n        $timeNow = time();\n        $result = $this->db->query('SELECT plan_type FROM firms_plans WHERE ' . $timeNow . ' >= from_date AND ' . $timeNow . ' <= to_date AND for_user = ' . USER_ID . ' ORDER BY id DESC LIMIT 1');\n        return $result->row_array();\n    }\n\n    public function setNewPaymentRequiest($req)\n    {\n        $this->db->select_max('req_num');\n        $query = $this->db->get('firms_payment_requests');\n        $row = $query->row_array();\n        $newReqNum = (int) $row['req_num'] + 1;\n\n        if (!$this->db->insert('firms_payment_requests', array(\n                    'for_user' => USER_ID,\n                    'req_num' => $newReqNum,\n                    'payment_type' => $req['payment_type'],\n                    'plan_type' => $req['type'],\n                    'plan_period' => $req['period'],\n                    'date_generated' => time(),\n                    'status' => 0\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    public function getMyRequest()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('status', 0);\n        $this->db->limit(1);\n        $query = $this->db->get('firms_payment_requests');\n        return $query->row_array();\n    }\n\n    public function cancelPaymentRequest($id)\n    {\n        $this->db->where('id', $id);\n        if (!$this->db->update('firms_payment_requests', array(\n                    'status' => 1\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    public function setPlanRequest($post)\n    {\n        $this->db->trans_begin();\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('status', 0);\n        $this->db->limit(1);\n        if (!$this->db->update('cusom_plan_requests', array(\n                    'status' => 1\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if (!$this->db->insert('cusom_plan_requests', array(\n                    'for_user' => USER_ID,\n                    'invoices' => $post['inv_per_month'],\n                    'companies' => $post['want_companies'],\n                    'time' => time()\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function getIndividualPlan()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->limit(1);\n        $result = $this->db->get('individual_plans');\n        return $result->row_array();\n    }\n\n    public function getRequestForIndividualPlan()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('status', 0);\n        $this->db->limit(1);\n        $result = $this->db->get('cusom_plan_requests');\n        return $result->row_array();\n    }\n\n    public function getMyActivePlans()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('from_date <=', time());\n        $this->db->where('to_date >=', time());\n        $result = $this->db->get('firms_plans');\n        return $result->result_array();\n    }\n\n    /*\n     * Num invoices issued when is not on payed plan\n     * and not more before one month\n     */\n\n    public function getNumInvoicesIssuedForOneMonth()\n    {\n        $monthBefore = strtotime(\"-1 month\", time());\n        $result = $this->db->query(\"SELECT count(id) as num FROM invoices WHERE created > (SELECT to_date FROM firms_plans WHERE for_user = \" . USER_ID . \" ORDER BY to_date DESC LIMIT 1) AND created > \" . $monthBefore . \" AND for_user = \" . USER_ID);\n        return $result->row_array();\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/ProtocolsModel.php",
    "content": "<?php\n\nclass ProtocolsModel extends CI_Model\n{\n    /*\n     * Ids in database of the default \n     * invoice languages in table \"protocols_languages\"\n     * JUST HARDCODED $sysDefTransIds\n     * They must be same in $sysDefTransIds, addprotocol.php(view) and in \"protocols_languages\" table\n     */\n\n    private $sysDefTransIds = array(1, 2, 3);\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function countProtocols($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setProtocolsSearchFilter($get);\n        }\n        $this->db->where('protocols.for_user', USER_ID);\n        $this->db->where('protocols.for_company', SELECTED_COMPANY_ID);\n        $this->db->join('protocols_clients', 'protocols_clients.for_protocol = protocols.id');\n        $this->db->where('protocols.is_deleted', 0);\n        return $this->db->count_all_results('protocols');\n    }\n\n    public function getProtocols($limit, $page, $get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setProtocolsSearchFilter($get);\n        }\n        $this->db->select('protocols.*, protocols_clients.client_name as client');\n        $this->db->join('protocols_firms', 'protocols_firms.for_protocol = protocols.id');\n        $this->db->join('protocols_clients', 'protocols_clients.for_protocol = protocols.id');\n        $this->db->order_by('protocols.id', 'desc');\n        $this->db->where('protocols.for_user', USER_ID);\n        $this->db->where('protocols.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('protocols.is_deleted', 0);\n        $result = $this->db->get('protocols', $limit, $page);\n        return $result->result_array();\n    }\n\n    private function setProtocolsSearchFilter($get)\n    {\n        if (isset($get['client_name']) && trim($get['client_name']) != '') {\n            $this->db->like('protocols_clients.client_name', trim($get['client_name']));\n        }\n        if (isset($get['create_from']) && trim($get['create_from']) != '') {\n            $from = strtotime($get['create_from']);\n            if ($from != false) {\n                $this->db->where('created >=', $from);\n            }\n        }\n        if (isset($get['create_to']) && trim($get['create_to']) != '') {\n            $to = strtotime($get['create_to']);\n            if ($to != false) {\n                $this->db->where('created <=', $to);\n            }\n        }\n    }\n\n    public function getProviderTransmits()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('protocols_provider_transmit');\n        return $result->result_array();\n    }\n\n    public function setProviderTransmitText($post)\n    {\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'title' => $post['title'],\n            'description' => $post['description']\n        );\n        if (!$this->db->insert('protocols_provider_transmit`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function deleteProviderTransmitText($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('protocols_provider_transmit')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setContract($post)\n    {\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'title' => $post['title_contract'],\n            'contract' => $post['contract']\n        );\n        if (!$this->db->insert('protocols_contracts`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function deleteContract($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('protocols_contracts')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getContracts()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('protocols_contracts');\n        return $result->result_array();\n    }\n\n    public function getNextFreeProtocolNumber()\n    {\n        $this->db->select_max('protocol_number');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('protocols.is_deleted', 0);\n        $result = $this->db->get('protocols');\n        $row = $result->row_array();\n\n        if (empty($row)) {\n            return full_document_number(1);\n        } else {\n            return full_document_number($row['protocol_number'] + 1);\n        }\n    }\n\n    public function getMyProtocolsLanguages()\n    {\n        $this->db->select('id, language_name');\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('protocols_languages');\n        return $result->result_array();\n    }\n\n    public function setNewProtocolLanguage($post)\n    {\n        unset($post['addNewProtocolTranslation']);\n        $post['for_user'] = USER_ID;\n        if (!$this->db->insert('protocols_languages', $post)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function checkIsFreeProtocolNumber($number, $without = 0)\n    {\n        if ($without > 0) {\n            $this->db->where('id !=', $without);\n        }\n        $this->db->where('protocol_number', $number);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('protocols.is_deleted', 0);\n        $num = $this->db->count_all_results('protocols');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function setProtocol($post)\n    {\n        $this->db->trans_begin();\n\n        $protocolsArray = array(\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'protocol_number' => htmlspecialchars(trim($post['protocol_number'])),\n            'type' => htmlspecialchars(trim($post['type'])),\n            'from_date' => strtotime($post['from_date']),\n            'to_invoice' => htmlspecialchars(trim($post['to_invoice'])),\n            'compiled' => htmlspecialchars(trim($post['compiled'])),\n            'received' => htmlspecialchars(trim($post['received'])),\n            'remarks' => htmlspecialchars(trim($post['remarks'])),\n            'provider_transmit' => htmlspecialchars(trim($post['provider_trasmit'])),\n            'contract' => htmlspecialchars(trim($post['contract'])),\n            'amount' => htmlspecialchars(trim($post['amount'])),\n            'vat_percent' => htmlspecialchars(trim($post['vat_percent'])),\n            'vat_sum' => htmlspecialchars(trim($post['vat_sum'])),\n            'final_total' => htmlspecialchars(trim($post['final_total'])),\n            'currency' => htmlspecialchars(trim($post['currency'])),\n            'created' => time()\n        );\n        if (!$this->db->insert('protocols', $protocolsArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $protocolId = $this->db->insert_id();\n\n        $this->setProtocolClient($post, $protocolId);\n        $this->setProtocolItems($post, $protocolId);\n        $this->setProtocolFirm($post, $protocolId);\n        $this->setProtocolTranslation($post['protocol_translation'], $protocolId);\n\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function updateProtocol($post)\n    {\n        $this->db->trans_begin();\n\n        $protocolArray = array(\n            'protocol_number' => htmlspecialchars(trim($post['protocol_number'])),\n            'from_date' => strtotime($post['from_date']),\n            'to_invoice' => htmlspecialchars(trim($post['to_invoice'])),\n            'type' => htmlspecialchars(trim($post['type'])),\n            'compiled' => htmlspecialchars(trim($post['compiled'])),\n            'received' => htmlspecialchars(trim($post['received'])),\n            'remarks' => htmlspecialchars(trim($post['remarks'])),\n            'provider_transmit' => htmlspecialchars(trim($post['provider_transmit'])),\n            'contract' => htmlspecialchars(trim($post['contract'])),\n            'amount' => htmlspecialchars(trim($post['amount'])),\n            'vat_percent' => htmlspecialchars(trim($post['vat_percent'])),\n            'vat_sum' => htmlspecialchars(trim($post['vat_sum'])),\n            'currency' => htmlspecialchars(trim($post['currency'])),\n            'final_total' => htmlspecialchars(trim($post['final_total'])),\n        );\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('id', $post['editId']);\n        if (!$this->db->update('protocols', $protocolArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $protocolID = $post['editId'];\n\n        $this->updateProtocolClient($post, $protocolID);\n        $this->updateProtocolItems($post, $protocolID);\n        $this->updateProtocolFirm($post, $protocolID);\n        $this->updateProtocolTranslation($post['protocol_translation'], $protocolID);\n\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    private function updateProtocolClient($post, $protocolArray)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['client_name']))\n        );\n        $this->db->where('for_protocol', $protocolArray);\n        if (!$this->db->update('protocols_clients ', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateProtocolItems($post, $protocolId)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        $deleteIds = array();\n        foreach (explode(',', $post['onLoadItems']) as $onLoadItem) {\n            if (!in_array($onLoadItem, $post['is_item_update'])) {\n                $deleteIds[] = $onLoadItem;\n            }\n        }\n        if (!empty($deleteIds)) {\n            $this->db->where('for_protocol', $protocolId);\n            $this->db->where_in('id', $deleteIds);\n            if (!$this->db->delete('protocols_items')) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n        }\n        while ($i <= $numItems) {\n            /*\n             * If is update, update the item\n             * else insert the new\n             */\n            if ($post['is_item_update'][$i] > 0) {\n                $arrItem = array(\n                    'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                    'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                    'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                    'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                    'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                    'position' => $position\n                );\n                if (!$this->db->where('for_protocol', $protocolId)->where('id', $post['is_item_update'][$i])->update('protocols_items', $arrItem)) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            } else {\n                $arrItem = array(\n                    'for_protocol' => $protocolId,\n                    'for_user' => USER_ID,\n                    'for_company' => SELECTED_COMPANY_ID,\n                    'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                    'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                    'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                    'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                    'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                    'position' => $position\n                );\n                if (!$this->db->insert('protocols_items', $arrItem)) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function updateProtocolFirm($post, $protocolId)\n    {\n        $this->db->where('firms_translations.id', $post['protocol_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $insertArray = array(\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image'] == null ? '' : $firm['image']\n        );\n        $this->db->where('for_protocol', $protocolId);\n        if (!$this->db->update('protocols_firms`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateProtocolTranslation($translateId, $protocolId)\n    {\n        if (in_array($translateId, $this->sysDefTransIds)) {\n            $this->db->where('id', $translateId);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('protocols_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        unset($translate['for_user']);\n        $this->db->where('for_protocol', $protocolId);\n        if (!$this->db->update('protocols_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setProtocolClient($post, $prodocolId)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'for_protocol' => $prodocolId,\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['client_name']))\n        );\n        if (!$this->db->insert('protocols_clients ', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setProtocolItems($post, $protocolId)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        while ($i <= $numItems) {\n            $arrItem = array(\n                'for_protocol' => $protocolId,\n                'for_user' => USER_ID,\n                'for_company' => SELECTED_COMPANY_ID,\n                'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                'position' => $position\n            );\n            if (!$this->db->insert('protocols_items', $arrItem)) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function setProtocolFirm($post, $protocolId)\n    {\n        $this->db->where('firms_translations.id', $post['protocol_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $insertArray = array(\n            'for_protocol' => $protocolId,\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image'] == null ? '' : $firm['image']\n        );\n        if (!$this->db->insert('protocols_firms`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setProtocolTranslation($translateId, $protocolId)\n    {\n        if (in_array($translateId, $this->sysDefTransIds)) {\n            $this->db->where('id', $translateId);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('protocols_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        unset($translate['for_user']);\n        $translate['for_protocol'] = $protocolId;\n        if (!$this->db->insert('protocols_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    public function multipleDelete($ids)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if (!$this->db->update('protocols', array('is_deleted' => 1))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function getProtocolByNumber($number)\n    {\n        $this->db->where('protocols.protocol_number', (int) $number);\n        $this->db->where('protocols.for_user', USER_ID);\n        $this->db->where('protocols.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('protocols.is_deleted', 0);\n        $this->db->limit(1);\n        $result = $this->db->get('protocols');\n        $arr = $result->row_array();\n        if (empty($arr)) {\n            return $arr;\n        }\n\n        $result = $this->db->where('for_protocol', $arr['id'])->order_by('position', 'asc')->get('protocols_items');\n        $items = $result->result_array();\n        $arr['items'] = $items;\n\n        $result = $this->db->where('for_protocol', $arr['id'])->get('protocols_clients');\n        $client = $result->row_array();\n        $arr['client'] = $client;\n\n        $result = $this->db->where('for_protocol', $arr['id'])->get('protocols_firms');\n        $firm = $result->row_array();\n        $arr['firm'] = $firm;\n\n        $result = $this->db->where('for_protocol', $arr['id'])->get('protocols_translations');\n        $translation = $result->row_array();\n        $arr['translation'] = $translation;\n        return $arr;\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/ReportsModel.php",
    "content": "<?php\n\nclass ReportsModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /*\n     * Only num issued invoices \n     */\n\n    public function getIssuedInvoices($from = null, $to = null, $doShowDraft = false, $paymentStatus = null)\n    {\n        $between = '';\n        if ($from != null && $to != null) {\n            $between = ' AND created >= ' . $from . ' AND created <= ' . $to;\n        }\n        $showDraft = ' AND status != \"draft\"';\n        if ($doShowDraft == true) {\n            $showDraft = '';\n        }\n        $payStat = '';\n        if ($paymentStatus == 'paid') {\n            $payStat = ' AND payment_status = \"paid\"';\n        }\n        if ($paymentStatus == 'unpaid') {\n            $payStat = ' AND payment_status = \"unpaid\"';\n        }\n        if ($paymentStatus == 'partly_paid') {\n            $payStat = ' AND payment_status = \"partly_paid\"';\n        }\n        $query = $this->db->query('SELECT SUM(IF(inv_type=\"tax_inv\",1,0)) as tax_inv, SUM(IF(inv_type=\"prof\",1,0)) as prof, SUM(IF(inv_type=\"debit\",1,0)) as debit, SUM(IF(inv_type=\"credit\",1,0)) as credit FROM invoices WHERE is_deleted = 0 AND status != \"canceled\" AND for_user = ' . USER_ID . ' AND for_company = ' . SELECTED_COMPANY_ID . $showDraft . $payStat . $between);\n        $result = $query->row_array();\n        if ($result['tax_inv'] === null && $result['prof'] === null && $result['debit'] === null && $result['credit'] === null) {\n            return array();\n        }\n        return $result;\n    }\n\n    /*\n     * Issued invoices by month with num issued and final sum for every month\n     */\n\n    public function getIssuedInvoicesByMonth($from, $to, $doShowDraft = false, $paymentStatus = null)\n    {\n        $months = array();\n        $invMonths = array();\n        if (!(bool) strtotime($from) || !(bool) strtotime($to)) {\n            return $invMonths;\n        }\n        $start = new DateTime($from);\n        $start->modify('first day of this month');\n        $end = new DateTime($to);\n        $end->modify('first day of next month');\n        $interval = DateInterval::createFromDateString('1 month');\n        $period = new DatePeriod($start, $interval, $end);\n\n        // get all months.years between selected dates\n        foreach ($period as $dt) {\n            $months[$dt->format(\"M Y\")] = array('num' => 0, 'sum' => 0);\n        }\n\n        // give to all types of invoices all selected months.years and set issued to 0\n        $invReadableTypes = $this->config->item('inv_readable_types');\n        foreach ($invReadableTypes as $inType) {\n            $invMonths[$inType] = $months;\n        }\n\n        // get from database all invoices group by type and date created (month.year)\n        $from = strtotime($from);\n        $to = strtotime($to);\n        $between = ' AND created >= ' . $from . ' AND created <= ' . $to;\n        $showDraft = ' AND status != \"draft\"';\n        if ($doShowDraft == true) {\n            $showDraft = '';\n        }\n        $payStat = '';\n        if ($paymentStatus == 'paid') {\n            $payStat = ' AND payment_status = \"paid\"';\n        }\n        if ($paymentStatus == 'unpaid') {\n            $payStat = ' AND payment_status = \"unpaid\"';\n        }\n        if ($paymentStatus == 'partly_paid') {\n            $payStat = ' AND payment_status = \"partly_paid\"';\n        }\n        $query = $this->db->query('SELECT COUNT(id) AS num_created, inv_type, SUM(final_total) as final_total, DATE_FORMAT(FROM_UNIXTIME(created), \"%b %Y\") AS date_created FROM invoices WHERE is_deleted = 0 AND status != \"canceled\" AND for_user = ' . USER_ID . ' AND for_company = ' . SELECTED_COMPANY_ID . $showDraft . $payStat . $between . ' GROUP BY date_created, inv_type');\n        $result = $query->result_array();\n\n        // add to months of each type of invoice - num issued\n        foreach ($result as $invoices) {\n            if (array_key_exists($invReadableTypes[$invoices['inv_type']], $invMonths)) {\n                if (array_key_exists($invoices['date_created'], $invMonths[$invReadableTypes[$invoices['inv_type']]])) {\n                    $invMonths[$invReadableTypes[$invoices['inv_type']]][$invoices['date_created']] = array(\n                        'num' => (int) $invoices['num_created'],\n                        'sum' => $invoices['final_total']\n                    );\n                }\n            }\n        }\n        return $invMonths;\n    }\n\n    /*\n     * Clients with the highest priced invoices \n     */\n\n    public function getTopClients($from, $to, $doShowDraft = false, $paymentStatus = null)\n    {\n        $from = strtotime($from);\n        $to = strtotime($to);\n        $between = ' AND created >= ' . $from . ' AND created <= ' . $to;\n        $showDraft = ' AND status != \"draft\"';\n        if ($doShowDraft == true) {\n            $showDraft = '';\n        }\n        $payStat = '';\n        if ($paymentStatus == 'paid') {\n            $payStat = ' AND payment_status = \"paid\"';\n        }\n        if ($paymentStatus == 'unpaid') {\n            $payStat = ' AND payment_status = \"unpaid\"';\n        }\n        if ($paymentStatus == 'partly_paid') {\n            $payStat = ' AND payment_status = \"partly_paid\"';\n        }\n        $result = $this->db->query('SELECT SUM(final_total) as sumInvoices, invoices_clients.client_name as client FROM invoices INNER JOIN invoices_clients ON invoices_clients.for_invoice = invoices.id WHERE invoices.is_deleted = 0 AND invoices.status != \"canceled\" AND invoices.inv_type = \"tax_inv\" AND invoices.for_user = ' . USER_ID . ' AND invoices.for_company = ' . SELECTED_COMPANY_ID . $showDraft . $payStat . $between . ' GROUP BY IF(invoices_clients.client_bulstat=NULL, invoices_clients.client_ident_num, invoices_clients.client_bulstat), invoices_clients.client_name ORDER BY sumInvoices DESC LIMIT 10');\n        return $result->result_array();\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/SettingsModel.php",
    "content": "<?php\n\nclass SettingsModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n        $this->getFirmsIdsForUser();\n    }\n\n    public function getMyFirmsDefaultCurrency()\n    {\n        $this->db->select('firms_users.id, default_currency, name');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('is_deleted', 0);\n        $this->db->where('firms_translations.is_default', 1);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        return $result->result_array();\n    }\n\n    public function setNewDefaultCurrency($post)\n    {\n        $this->db->where('id', $post['forId']);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('firms_users', array('default_currency' => $post['newDefault']))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function deleteDefaultCurrency($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('firms_users', array('default_currency' => ''))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setNewCurrency($post)\n    {\n        if (!$this->db->insert('users_currencies', array(\n                    'for_user' => USER_ID,\n                    'name' => htmlspecialchars($post['currencyName']),\n                    'value' => htmlspecialchars($post['currencyValue']\n            )))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getMyCurrencies()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('users_currencies');\n        return $result->result_array();\n    }\n\n    public function deleteMyCurrency($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('users_currencies')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getMyQuantityTypes()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('users_quantity_types');\n        return $result->result_array();\n    }\n\n    public function deleteCustomQuantityType($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('users_quantity_types')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getMyPaymentMethods()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('users_payment_methods');\n        return $result->result_array();\n    }\n\n    public function deleteCustomPaymentMethod($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('users_payment_methods')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getMyNoVatReasons()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('user_no_vat_reasons');\n        return $result->result_array();\n    }\n\n    public function deleteMyNoVatReason($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('user_no_vat_reasons')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setValueStore($key, $value)\n    {\n        $this->db->where('_key', $key);\n        $query = $this->db->get('value_store');\n        if ($query->num_rows() > 0) {\n\n            $this->db->where('_key', $key);\n            $this->db->where('for_user', USER_ID);\n            $this->db->update('value_store', array('value' => $value));\n        } else {\n            $this->db->insert('value_store', array('for_user' => USER_ID, 'value' => $value, '_key' => $key));\n        }\n    }\n\n    public function getValueStores($key)\n    {\n        $this->db->where('_key', $key);\n        $this->db->where('for_user', USER_ID);\n        $query = $this->db->get('value_store');\n        $result = $query->row_array();\n        if (empty($result)) {\n            return null;\n        }\n        return $result['value'];\n    }\n\n    public function countEmployees()\n    {\n        $this->db->where('for_user', USER_ID);\n        return $this->db->count_all_results('employees');\n    }\n\n    public function getEmployees($limit, $page)\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('employees', $limit, $page);\n        return $result->result_array();\n    }\n\n    public function setEmployee($post)\n    {\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'name' => htmlspecialchars(trim($post['name'])),\n            'email' => htmlspecialchars(trim($post['email'])),\n            'phone' => htmlspecialchars(trim($post['phone'])),\n            'schiffer' => htmlspecialchars(trim($post['schiffer'])),\n            'password' => password_hash($post['password'], PASSWORD_DEFAULT),\n            'time_added' => time()\n        );\n        if (isset($post['firms'])) {\n            $insertArray['firms_access'] = serialize($post['firms']);\n        }\n        if ($post['editId'] > 0) {\n            if (mb_strlen(trim($post['password'])) == 0) {\n                unset($insertArray['password']);\n            }\n            unset($insertArray['time_added']);\n            if (!$this->db->where('id', $post['editId'])->where('for_user', USER_ID)->update('employees', $insertArray)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        } else {\n            // if employee, add new employee he cant add access firms \n            // and we add this firm only to new employee\n            if (!isset($insertArray['firms_access']) && defined('EMPLOYEE_ID')) {\n                $insertArray['firms_access'] = serialize(array(SELECTED_COMPANY_ID));\n            }\n            if (!$this->db->insert('employees', $insertArray)) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n            return $this->db->insert_id();\n        }\n    }\n\n    public function getFirmsIdsForUser()\n    {\n        $this->db->select('id');\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('firms_users');\n        $str = '';\n        foreach ($result->result_array() as $fr) {\n            $str .= ',' . $fr['id'];\n        }\n        return explode(',', ltrim($str, ','));\n    }\n\n    public function getEmployeeInfo($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('employees');\n        return $result->row_array();\n    }\n\n    public function checkEmployeeFreeEmail($email, $editId)\n    {\n        if ($editId > 0) {\n            $this->db->where('employees.id !=', $editId);\n        }\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('email', $email);\n        $num1 = $this->db->count_all_results('employees');\n\n        $this->db->where('id', USER_ID);\n        $this->db->where('email', $email);\n        $num2 = $this->db->count_all_results('users');\n        $num = $num1 + $num2;\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function deleteEmployee($id)\n    {\n        $this->db->trans_begin();\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('employees')) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        $this->db->where('for_employee', $id);\n        if (!$this->db->delete('employees_permissions')) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function setNewEmployeePermissions($employeeId, $defaultPermissions)\n    {\n        $insertArray = array();\n        foreach ($defaultPermissions as $key => $value) {\n            $insertArray[] = array(\n                'for_employee' => $employeeId,\n                'perm' => $key,\n                'role' => $value\n            );\n        }\n        if (!$this->db->insert_batch('employees_permissions', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getPermissions()\n    {\n        $this->db->where('for_employee', EMPLOYEE_ID);\n        $result = $this->db->get('employees_permissions');\n        return $result->result_array();\n    }\n\n    public function getEmployeePermissions($id)\n    {\n        $array = array();\n        $this->db->select('perm, role');\n        $this->db->where('for_employee', $id);\n        $this->db->where('for_user', USER_ID);\n        $this->db->join('employees', 'employees.id = employees_permissions.for_employee');\n        $result = $this->db->get('employees_permissions');\n        $arr = $result->result_array();\n        foreach ($arr as $ar) {\n            $array[$ar['perm']] = $ar['role'];\n        }\n        return $array;\n    }\n\n    public function updateEmployeePermissions($newPermissions, $employeeId)\n    {\n        $this->db->where('id', $employeeId);\n        $this->db->where('for_user', USER_ID);\n        if ($this->db->count_all_results('employees') === 0) {\n            log_message('error', 'User ' . USER_ID . ' tried to update permissions for employee ' . $employeeId . ' they do not own');\n            show_error(lang('database_error'));\n            return;\n        }\n        foreach ($newPermissions as $key => $val) {\n            $this->db->where('for_employee', $employeeId);\n            $this->db->where('perm', $key);\n            if (!$this->db->update('employees_permissions', array('role' => $val))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function getAdminInfo()\n    {\n        $this->db->where('id', USER_ID);\n        $result = $this->db->get('users');\n        return $result->row_array();\n    }\n\n    public function checkRegisteredUserFreeEmail($email)\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('email', $email);\n        $num1 = $this->db->count_all_results('employees');\n\n        $this->db->where('email', $email);\n        $this->db->where('id !=', USER_ID);\n        $num2 = $this->db->count_all_results('users');\n        $num = $num1 + $num2;\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function updateUserAdminInfo($post)\n    {\n        $allowedFields = array('name', 'email', 'phone', 'schiffer', 'password');\n        $updateData = array();\n        foreach ($allowedFields as $field) {\n            if (isset($post[$field])) {\n                $updateData[$field] = $post[$field];\n            }\n        }\n        if (mb_strlen(trim($updateData['password'] ?? '')) == 0) {\n            unset($updateData['password']);\n        }\n        $this->db->where('id', USER_ID);\n        if (!$this->db->update('users', $updateData)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        } else {\n            $_SESSION['user_login']['email'] = $post['email'];\n        }\n    }\n\n    public function setNewStore($storeName)\n    {\n        if (!$this->db->insert('stores', array(\n                    'name' => $storeName,\n                    'for_user' => USER_ID,\n                    'for_company' => SELECTED_COMPANY_ID,\n                    'created' => time()\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function checkStoreNameIsFree($storeName)\n    {\n        $this->db->where('id', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('name', $storeName);\n        $num = $this->db->count_all_results('stores');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function deleteStore($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('id', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        if (!$this->db->update('stores', array('is_deleted' => 1))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/StoreModel.php",
    "content": "<?php\n\nclass StoreModel extends CI_Model\n{\n    /*\n     * Ids in database of the default \n     * invoice languages in table \"movements_languages\"\n     * JUST HARDCODED $sysDefTransIds\n     * They must be same in $sysDefTransIds, addmovement.php(view) and in \"movements_languages\" table\n     */\n\n    private $sysDefTransIds = array(1, 2, 3);\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function countMovements($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setMovementsSearchFilter($get);\n        }\n        $this->db->where('movements.for_user', USER_ID);\n        $this->db->where('movements.for_company', SELECTED_COMPANY_ID);\n        $this->db->join('movements_clients', 'movements_clients.for_movement = movements.id');\n        return $this->db->count_all_results('movements');\n    }\n\n    public function getMovements($limit, $page, $get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setMovementsSearchFilter($get);\n        }\n        $this->db->select('movements.*, movements_firms.name as firm_name, movements_clients.client_name, movements_from_to_store.from_store, movements_from_to_store.to_store');\n        $this->db->join('movements_firms', 'movements_firms.for_movement = movements.id');\n        $this->db->join('movements_clients', 'movements_clients.for_movement = movements.id');\n        $this->db->join('movements_from_to_store', 'movements_from_to_store.for_movement = movements.id', 'left');\n        $this->db->order_by('id', 'desc');\n        $this->db->where('movements.for_user', USER_ID);\n        $this->db->where('movements.for_company', SELECTED_COMPANY_ID);\n        $result = $this->db->get('movements', $limit, $page);\n        return $result->result_array();\n    }\n\n    private function setMovementsSearchFilter($get)\n    {\n        if (isset($get['client_name']) && trim($get['client_name']) != '') {\n            $this->db->like('movements_clients.client_name', trim($get['client_name']));\n        }\n        if (isset($get['selected_store']) && (trim($get['selected_store']) != '' && trim($get['selected_store']) != 'all')) {\n            $this->db->where('movements.store_id', (int) $get['selected_store']);\n        }\n        if (isset($get['create_from']) && trim($get['create_from']) != '') {\n            $from = strtotime($get['create_from']);\n            if ($from != false) {\n                $this->db->where('created >=', $from);\n            }\n        }\n        if (isset($get['create_to']) && trim($get['create_to']) != '') {\n            $to = strtotime($get['create_to']);\n            if ($to != false) {\n                $this->db->where('created <=', $to);\n            }\n        }\n        if (isset($get['lot']) && trim($get['lot']) != '') {\n            $this->db->like('movements.lot', trim($get['lot']));\n        }\n        if (isset($get['expire_date']) && trim($get['expire_date']) != '') {\n            $expire_date = strtotime($get['expire_date']);\n            if ($expire_date != false) {\n                $this->db->where('expire_date <=', $expire_date);\n            }\n        }\n    }\n\n    public function getStores()\n    {\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('is_deleted', 0);\n        $result = $this->db->get('stores');\n        return $result->result_array();\n    }\n\n    public function getItemsForStoreAction($search, $fromStore, $movementType)\n    {\n        $this->db->where('items.for_user', USER_ID);\n        $this->db->where('items.for_company', SELECTED_COMPANY_ID);\n        $this->db->like('items.name', $search);\n\n        $result = $this->db->get('items');\n        return $result->result_array();\n    }\n\n    public function setMovement($post)\n    {\n        $this->db->trans_begin();\n\n        $storeMoveArr = array(\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'movement_type' => htmlspecialchars(trim($post['type'])),\n            'movement_number' => htmlspecialchars(trim($post['movement_number'])),\n            'store_id' => $post['selected_store'],\n            'movement_currency' => htmlspecialchars(trim($post['movement_currency'])),\n            'amount' => htmlspecialchars(trim($post['amount'])),\n            'discount' => htmlspecialchars(trim($post['discount'])),\n            'discount_type' => htmlspecialchars(trim($post['discount_type'])),\n            'tax_base' => htmlspecialchars(trim($post['tax_base'])),\n            'vat_percent' => htmlspecialchars(trim($post['vat_percent'])),\n            'vat_sum' => htmlspecialchars(trim($post['vat_sum'])),\n            'no_vat_reason' => htmlspecialchars(trim($post['no_vat_reason'])),\n            'final_total' => htmlspecialchars($post['final_total']),\n            'remarks' => htmlspecialchars(trim($post['remarks'])),\n            'payment_method' => htmlspecialchars(trim($post['payment_method'])),\n            'created' => strtotime($post['date_create']),\n            'betrayed' => htmlspecialchars(trim($post['betrayed'])),\n            'accepted' => htmlspecialchars(trim($post['accepted'])),\n            'lot' => htmlspecialchars(trim($post['lot'])),\n            'expire_date' => strtotime($post['expire_date'])\n        );\n        if (!$this->db->insert('movements', $storeMoveArr)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $movementId = $this->db->insert_id();\n\n        $this->setClient($post, $movementId);\n        $this->setMovementFirm($post, $movementId);\n        $this->setMovementTranslation($post['movement_translation'], $movementId);\n        $this->setMovementItems($post, $movementId);\n        $this->updateStoreQuantities($post, $movementId);\n\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    private function setClient($post, $movementId)\n    {\n\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'for_movement' => $movementId,\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['client_name']))\n        );\n        if (!$this->db->insert('movements_clients ', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setMovementItems($post, $movementId)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        while ($i <= $numItems) {\n            $arrItem = array(\n                'for_movement' => $movementId,\n                'name' => htmlspecialchars(trim($post['items_names'][$i])),\n                'quantity' => htmlspecialchars(trim($post['items_quantities'][$i])),\n                'quantity_type' => htmlspecialchars(trim($post['items_quantity_types'][$i])),\n                'single_price' => htmlspecialchars(trim($post['items_prices'][$i])),\n                'total_price' => htmlspecialchars(trim($post['items_totals'][$i])),\n                'position' => $position\n            );\n            if (!$this->db->insert('movement_items', $arrItem)) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function setMovementFirm($post, $movementId)\n    {\n        $this->db->where('firms_translations.id', $post['movement_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $insertArray = array(\n            'for_movement' => $movementId,\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image'] == null ? '' : $firm['image']\n        );\n        if (!$this->db->insert('movements_firms`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setMovementTranslation($translateId, $movementId)\n    {\n        if (in_array($translateId, $this->sysDefTransIds)) {\n            $this->db->where('id', $translateId);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('movements_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        unset($translate['for_user']);\n        $translate['for_movement'] = $movementId;\n        if (!$this->db->insert('movements_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateStoreQuantities($post, $movementId)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        while ($i <= $numItems) {\n            // if type is - add stock availability\n            if ($post['type'] == 'in') {\n                $this->db->where('for_user', USER_ID);\n                $this->db->where('for_company', SELECTED_COMPANY_ID);\n                $this->db->where('for_store', $post['selected_store']);\n                $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                $num = $this->db->count_all_results('stock_availability');\n                if ($num > 0) {\n                    $insert = false;\n                } else {\n                    $insert = true;\n                }\n                if ($insert === true) {\n                    $data = array(\n                        'for_user' => USER_ID,\n                        'for_company' => SELECTED_COMPANY_ID,\n                        'for_store' => $post['selected_store'],\n                        'item_id' => (int) $post['item_from_list'][$i],\n                        'quantity' => (float) $post['items_quantities'][$i]\n                    );\n                    if (!$this->db->insert('stock_availability', $data)) {\n                        log_message('error', print_r($this->db->error(), true));\n                    }\n                } else {\n                    $this->db->set('quantity', 'quantity+' . (float) $post['items_quantities'][$i], FALSE);\n                    $this->db->where('for_user', USER_ID);\n                    $this->db->where('for_company', SELECTED_COMPANY_ID);\n                    $this->db->where('for_store', $post['selected_store']);\n                    $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                    if (!$this->db->update('stock_availability')) {\n                        log_message('error', print_r($this->db->error(), true));\n                    }\n                }\n            }\n            // if type is - remove from stock availability\n            if ($post['type'] == 'out') {\n                $this->db->set('quantity', 'quantity-' . (float) $post['items_quantities'][$i], FALSE);\n                $this->db->where('for_user', USER_ID);\n                $this->db->where('for_company', SELECTED_COMPANY_ID);\n                $this->db->where('for_store', $post['selected_store']);\n                $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                if (!$this->db->update('stock_availability')) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            }\n            // if type is - move stock from one store to other\n            if ($post['type'] == 'move') {\n                $this->db->select('quantity');\n                $this->db->where('for_user', USER_ID);\n                $this->db->where('for_company', SELECTED_COMPANY_ID);\n                $this->db->where('for_store', $post['selected_store']);\n                $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                $res = $this->db->get('stock_availability');\n                $row = $res->row_array();\n                $quantity = $row['quantity'];\n\n                $this->db->set('quantity', 'quantity-' . (float) $post['items_quantities'][$i], FALSE);\n                $this->db->where('for_user', USER_ID);\n                $this->db->where('for_company', SELECTED_COMPANY_ID);\n                $this->db->where('for_store', $post['selected_store']);\n                $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                if (!$this->db->update('stock_availability')) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n\n                $this->db->where('for_user', USER_ID);\n                $this->db->where('for_company', SELECTED_COMPANY_ID);\n                $this->db->where('for_store', $post['selected_to_store']);\n                $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                $num = $this->db->count_all_results('stock_availability');\n                if ($num > 0) {\n                    $insert = false;\n                } else {\n                    $insert = true;\n                }\n                if ($insert === true) {\n                    $data = array(\n                        'for_user' => USER_ID,\n                        'for_company' => SELECTED_COMPANY_ID,\n                        'for_store' => $post['selected_to_store'],\n                        'item_id' => (int) $post['item_from_list'][$i],\n                        'quantity' => (float) $post['items_quantities'][$i]\n                    );\n                    if (!$this->db->insert('stock_availability', $data)) {\n                        log_message('error', print_r($this->db->error(), true));\n                    }\n                } else {\n                    $this->db->set('quantity', 'quantity+' . (float) $post['items_quantities'][$i], FALSE);\n                    $this->db->where('for_user', USER_ID);\n                    $this->db->where('for_company', SELECTED_COMPANY_ID);\n                    $this->db->where('for_store', $post['selected_to_store']);\n                    $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                    if (!$this->db->update('stock_availability')) {\n                        log_message('error', print_r($this->db->error(), true));\n                    }\n                }\n\n                $from = $this->getStoreNameById($post['selected_store']);\n                $to = $this->getStoreNameById($post['selected_to_store']);\n                if (!$this->db->insert('movements_from_to_store', array(\n                            'for_movement' => $movementId,\n                            'from_store' => $from,\n                            'to_store' => $to\n                        ))) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            }\n            if ($post['type'] == 'revision') {\n                $this->db->select('quantity');\n                $this->db->where('for_user', USER_ID);\n                $this->db->where('for_company', SELECTED_COMPANY_ID);\n                $this->db->where('for_store', $post['selected_store']);\n                $this->db->where('item_id', (int) $post['item_from_list'][$i]);\n                $result = $this->db->get('stock_availability');\n                $row = $result->row_array();\n                $currentQuantityInStore = $row['quantity'];\n\n                $currentQuantity = (float) $post['items_quantities'][$i];\n\n                if (!$this->db->insert('movements_revisions', array(\n                            'for_movement' => $movementId,\n                            'name' => $post['items_names'][$i],\n                            'before_revision' => $currentQuantityInStore,\n                            'after_revision' => $currentQuantity,\n                            'difference' => $currentQuantity - $currentQuantityInStore\n                        ))) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            }\n            $i++;\n        }\n    }\n\n    private function getStoreNameById($id)\n    {\n        $this->db->select('name');\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('stores');\n        $row = $result->row_array();\n        return $row['name'];\n    }\n\n    public function getMyMovementsLanguages()\n    {\n        $this->db->select('id, language_name');\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('movements_languages');\n        return $result->result_array();\n    }\n\n    public function getNextFreeMovementNumber()\n    {\n        $this->db->select_max('movement_number');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $result = $this->db->get('movements');\n        $row = $result->row_array();\n\n        if (empty($row)) {\n            return full_document_number(1);\n        } else {\n            return full_document_number($row['movement_number'] + 1);\n        }\n    }\n\n    public function checkIsFreeMovementNumber($number)\n    {\n        $this->db->where('movement_number', $number);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $num = $this->db->count_all_results('movements');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function checkStoreHaveItem($store, $itemId)\n    {\n        $this->db->where('item_id', $itemId);\n        $this->db->where('for_store', $store);\n        $num = $this->db->count_all_results('stock_availability');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function checkHaveEnoughtQuantity($store, $itemId)\n    {\n        $this->db->select('quantity');\n        $this->db->where('item_id', $itemId);\n        $this->db->where('for_store', $store);\n        $result = $this->db->get('stock_availability');\n        $row = $result->row_array();\n        if ($row == null) {\n            return null;\n        }\n        return $row['quantity'];\n    }\n\n    public function setNewMovementLanguage($post)\n    {\n        unset($post['addNewMovementTranslation']);\n        $post['for_user'] = USER_ID;\n        if (!$this->db->insert('movements_languages', $post)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function multipleStatusCanceledMovements($ids, $doCanceled)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if ($doCanceled == true) {\n                $status = 1;\n            } else {\n                $status = 0;\n            }\n            if (!$this->db->update('movements', array('cancelled' => $status))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function getMovementByNumber($movementNumber)\n    {\n        $this->db->where('movement_number', (int) $movementNumber);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->limit(1);\n        $result = $this->db->get('movements');\n        $arr = $result->row_array();\n// if dont find this movement.. dont search other info\n        if (empty($arr)) {\n            return $arr;\n        }\n        $result = $this->db->where('for_movement', $arr['id'])->order_by('position', 'asc')->get('movement_items');\n        $items = $result->result_array();\n        $arr['items'] = $items;\n\n        $result = $this->db->where('for_movement', $arr['id'])->get('movements_clients');\n        $client = $result->row_array();\n        $arr['client'] = $client;\n\n        $result = $this->db->where('for_movement', $arr['id'])->get('movements_firms');\n        $firm = $result->row_array();\n        $arr['firm'] = $firm;\n\n        $result = $this->db->where('for_movement', $arr['id'])->get('movements_translations');\n        $translation = $result->row_array();\n        $arr['translation'] = $translation;\n\n        $result = $this->db->where('for_movement', $arr['id'])->get('movements_from_to_store');\n        $stores = $result->row_array();\n        $arr['f_stores'] = $stores;\n\n        if ($arr['movement_type'] == 'revision') {\n            $result = $this->db->where('for_movement', $arr['id'])->get('movements_revisions');\n            $revision = $result->result_array();\n            $arr['revision'] = $revision;\n        }\n        return $arr;\n    }\n\n    public function countStocks($get = null)\n    {\n        if ($get != null && is_array($get)) {\n            if (trim($get['store']) != '') {\n                $this->db->where('stock_availability.for_store', (int) $get['store']);\n            }\n            if (trim($get['item']) != '') {\n                $this->db->where('items.name', $get['item']);\n            }\n        }\n        $this->db->where('stock_availability.for_user', USER_ID);\n        $this->db->where('stock_availability.for_company', SELECTED_COMPANY_ID);\n        $this->db->join('items', 'items.id = stock_availability.item_id');\n        $this->db->join('stores', 'stores.id = stock_availability.for_store');\n        return $this->db->count_all_results('stock_availability');\n    }\n\n    public function getStockQuantities($limit, $page, $get = null)\n    {\n        if ($get != null && is_array($get)) {\n            if (trim($get['store']) != '') {\n                $this->db->where('stock_availability.for_store', (int) $get['store']);\n            }\n            if (trim($get['item']) != '') {\n                $this->db->where('items.name', $get['item']);\n            }\n        }\n        $this->db->select('items.name, stock_availability.quantity, stores.name as store_name');\n        $this->db->where('stock_availability.for_user', USER_ID);\n        $this->db->where('stock_availability.for_company', SELECTED_COMPANY_ID);\n        $this->db->join('items', 'items.id = stock_availability.item_id');\n        $this->db->join('stores', 'stores.id = stock_availability.for_store');\n        $result = $this->db->get('stock_availability', $limit, $page);\n        return $result->result_array();\n    }\n\n    public function updateMovementPointToInvNumber($inv_number, $movement_number)\n    {\n        $this->db->where('movement_number', $movement_number);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->update('movements', array(\n                    'to_invoice' => $inv_number\n                ))) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/models/WarrantyCardModel.php",
    "content": "<?php\n\nclass WarrantyCardModel extends CI_Model\n{\n\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function countWarranties($get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setWarrantiesSearchFilter($get);\n        }\n        $this->db->where('warranties.for_user', USER_ID);\n        $this->db->where('warranties.for_company', SELECTED_COMPANY_ID);\n        $this->db->join('warranties_clients', 'warranties_clients.for_warranty = warranties.id');\n        $this->db->where('warranties.is_deleted', 0);\n        return $this->db->count_all_results('warranties');\n    }\n\n    public function getWarranties($limit, $page, $get = null)\n    {\n        if (!empty($get) && $get != null) {\n            $this->setWarrantiesSearchFilter($get);\n        }\n        $this->db->select('warranties.*, warranties_clients.client_name as client');\n        $this->db->join('warranties_firms', 'warranties_firms.for_warranty = warranties.id');\n        $this->db->join('warranties_clients', 'warranties_clients.for_warranty = warranties.id');\n        $this->db->order_by('warranties.id', 'desc');\n        $this->db->where('warranties.for_user', USER_ID);\n        $this->db->where('warranties.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('warranties.is_deleted', 0);\n        $result = $this->db->get('warranties', $limit, $page);\n        return $result->result_array();\n    }\n\n    private function setWarrantiesSearchFilter($get)\n    {\n        if (isset($get['client_name']) && trim($get['client_name']) != '') {\n            $this->db->like('warranties_clients.client_name', trim($get['client_name']));\n        }\n        if (isset($get['create_from']) && trim($get['create_from']) != '') {\n            $from = strtotime($get['create_from']);\n            if ($from != false) {\n                $this->db->where('created >=', $from);\n            }\n        }\n        if (isset($get['create_to']) && trim($get['create_to']) != '') {\n            $to = strtotime($get['create_to']);\n            if ($to != false) {\n                $this->db->where('created <=', $to);\n            }\n        }\n    }\n\n    public function multipleDeleteWarranties($ids)\n    {\n        if ($ids != null && is_array($ids)) {\n            $this->db->where_in('id', $ids);\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('for_company', SELECTED_COMPANY_ID);\n            if (!$this->db->update('warranties', array('is_deleted' => 1))) {\n                log_message('error', print_r($this->db->error(), true));\n                show_error(lang('database_error'));\n            }\n        }\n    }\n\n    public function setWarranty($post)\n    {\n        $this->db->trans_begin();\n\n        $warrantyArray = array(\n            'for_user' => USER_ID,\n            'for_company' => SELECTED_COMPANY_ID,\n            'warranty_number' => htmlspecialchars(trim($post['warranty_number'])),\n            'valid_from' => strtotime($post['valid_from_date']),\n            'received' => htmlspecialchars(trim($post['received'])),\n            'compiled' => htmlspecialchars(trim($post['compiled'])),\n            'conditions' => htmlspecialchars(trim($post['conditions'])),\n            'remarks' => htmlspecialchars(trim($post['remarks'])),\n            'created' => time()\n        );\n        if (!$this->db->insert('warranties', $warrantyArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $warrantyId = $this->db->insert_id();\n\n        $this->setWarrantyClient($post, $warrantyId);\n        $this->setWarrantyItems($post, $warrantyId);\n        $this->setWarrantyFirm($post, $warrantyId);\n        $this->setWarrantyTranslation($post['warranty_translation'], $warrantyId);\n\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    public function updateWarranty($post)\n    {\n        $this->db->trans_begin();\n\n        $warrantyArray = array(\n            'warranty_number' => htmlspecialchars($post['warranty_number']),\n            'received' => htmlspecialchars($post['received']),\n            'compiled' => htmlspecialchars($post['compiled']),\n            'valid_from' => strtotime($post['valid_from_date']),\n            'conditions' => htmlspecialchars($post['conditions']),\n            'remarks' => htmlspecialchars($post['remarks'])\n        );\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('id', $post['editId']);\n        if (!$this->db->update('warranties', $warrantyArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n\n        $warrantyId = $post['updateId'];\n\n        $this->updateWarrantyClient($post, $warrantyId);\n        $this->updateWarrantyItems($post, $warrantyId);\n        $this->updateWarrantyFirm($post, $warrantyId);\n        $this->updateWarrantyTranslation($post['warranty_translation'], $warrantyId);\n\n        if ($this->db->trans_status() === FALSE) {\n            $this->db->trans_rollback();\n            show_error(lang('database_error'));\n        } else {\n            $this->db->trans_commit();\n        }\n    }\n\n    private function updateWarrantyClient($post, $warrantyId)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['client_name']))\n        );\n        $this->db->where('for_warranty', $warrantyId);\n        if (!$this->db->update('warranties_clients ', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateWarrantyItems($post, $warrantyId)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        $deleteIds = array();\n        foreach (explode(',', $post['onLoadItems']) as $onLoadItem) {\n            if (!in_array($onLoadItem, $post['is_item_update'])) {\n                $deleteIds[] = $onLoadItem;\n            }\n        }\n        if (!empty($deleteIds)) {\n            $this->db->where('for_warranty', $warrantyId);\n            $this->db->where_in('id', $deleteIds);\n            if (!$this->db->delete('warranties_items')) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n        }\n        while ($i <= $numItems) {\n            /*\n             * If is update, update the item\n             * else insert the new\n             */\n            if ($post['is_item_update'][$i] > 0) {\n                $arrItem = array(\n                    'name' => htmlspecialchars($post['items_names'][$i]),\n                    'months' => $post['items_months'][$i],\n                    'valid_to' => strtotime('+ ' . (int) $post['items_months'][$i] . ' months', strtotime($post['valid_from_date'])),\n                    'serial' => htmlspecialchars($post['items_serial_nums'][$i]),\n                    'position' => $position\n                );\n                $this->db->where('for_warranty', $warrantyId);\n                $this->db->where('id', $post['is_item_update'][$i]);\n                if (!$this->db->update('warranties_items', $arrItem)) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            } else {\n                $arrItem = array(\n                    'for_warranty' => $warrantyId,\n                    'name' => htmlspecialchars($post['items_names'][$i]),\n                    'months' => htmlspecialchars($post['items_months'][$i]),\n                    'serial' => htmlspecialchars($post['items_serial_nums'][$i]),\n                    'position' => $position\n                );\n                if (!$this->db->insert('warranties_items', $arrItem)) {\n                    log_message('error', print_r($this->db->error(), true));\n                }\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function updateWarrantyFirm($post, $warrantyId)\n    {\n        $this->db->where('firms_translations.id', $post['warranty_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $insertArray = array(\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image'] == null ? '' : $firm['image']\n        );\n        $this->db->where('for_warranty', $warrantyId);\n        if (!$this->db->update('warranties_firms`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function updateWarrantyTranslation($translateId, $warrantyId)\n    {\n        if ($translateId == '0') {\n            $this->db->where('id', 1);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('warranties_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        unset($translate['for_user']);\n        $this->db->where('for_warranty', $warrantyId);\n        if (!$this->db->update('warranties_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setWarrantyClient($post, $warrantyId)\n    {\n        $is_to_person = isset($post['is_to_person']) ? 1 : 0;\n        $client_vat_registered = isset($post['client_vat_registered']) ? 1 : 0;\n        $insertArray = array(\n            'for_warranty' => $warrantyId,\n            'client_name' => htmlspecialchars(trim($post['client_name'])),\n            'client_bulstat' => htmlspecialchars(trim($post['client_bulstat'])),\n            'is_to_person' => $is_to_person,\n            'client_vat_registered' => $client_vat_registered,\n            'vat_number' => htmlspecialchars(trim($post['vat_number'])),\n            'client_ident_num' => htmlspecialchars(trim($post['client_ident_num'])),\n            'client_address' => htmlspecialchars(trim($post['client_address'])),\n            'client_city' => htmlspecialchars(trim($post['client_city'])),\n            'client_country' => htmlspecialchars(trim($post['client_country'])),\n            'accountable_person' => htmlspecialchars(trim($post['accountable_person'])),\n            'recipient_name' => htmlspecialchars(trim($post['client_name']))\n        );\n        if (!$this->db->insert('warranties_clients ', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setWarrantyItems($post, $warrantyId)\n    {\n        $numItems = count($post['items_names']) - 1;\n        $i = 0;\n        $position = 1;\n        while ($i <= $numItems) {\n            $arrItem = array(\n                'for_warranty' => $warrantyId,\n                'name' => htmlspecialchars($post['items_names'][$i]),\n                'months' => htmlspecialchars($post['items_months'][$i]),\n                'valid_to' => strtotime('+ ' . (int) $post['items_months'][$i] . ' months', strtotime($post['valid_from_date'])),\n                'serial' => htmlspecialchars($post['items_serial_nums'][$i]),\n                'position' => $position\n            );\n            if (!$this->db->insert('warranties_items', $arrItem)) {\n                log_message('error', print_r($this->db->error(), true));\n            }\n            $i++;\n            $position++;\n        }\n    }\n\n    private function setWarrantyFirm($post, $warrantyId)\n    {\n        $this->db->where('firms_translations.id', $post['warranty_firm_translation']);\n        $this->db->where('firms_users.for_user', USER_ID);\n        $this->db->where('firms_users.id', SELECTED_COMPANY_ID);\n        $this->db->join('firms_translations', 'firms_translations.for_firm = firms_users.id');\n        $result = $this->db->get('firms_users');\n        $firm = $result->row_array();\n\n        $insertArray = array(\n            'for_warranty' => $warrantyId,\n            'bulstat' => $firm['bulstat'],\n            'name' => $firm['name'],\n            'address' => $firm['address'],\n            'city' => $firm['city'],\n            'accountable_person' => $firm['mol'],\n            'is_vat_registered' => $firm['is_vat_registered'],\n            'vat_number' => $firm['vat_number'],\n            'image' => $firm['image'] == null ? '' : $firm['image']\n        );\n        if (!$this->db->insert('warranties_firms`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    private function setWarrantyTranslation($translateId, $warrantyId)\n    {\n        if ($translateId == '0') {\n            $this->db->where('id', 1);\n        } else {\n            $this->db->where('for_user', USER_ID);\n            $this->db->where('id', $translateId);\n        }\n        $result = $this->db->get('warranties_languages');\n        $translate = $result->row_array();\n        unset($translate['id']);\n        unset($translate['for_user']);\n        $translate['for_warranty'] = $warrantyId;\n        if (!$this->db->insert('warranties_translations', $translate)) {\n            log_message('error', print_r($this->db->error(), true));\n        }\n    }\n\n    public function getNextFreeWarrantyNumber()\n    {\n        $this->db->select_max('warranty_number');\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('warranties.is_deleted', 0);\n        $result = $this->db->get('warranties');\n        $row = $result->row_array();\n\n        if (empty($row)) {\n            return full_document_number(1);\n        } else {\n            return full_document_number($row['warranty_number'] + 1);\n        }\n    }\n\n    public function getMyWarrantiesLanguages()\n    {\n        $this->db->select('id, language_name');\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('warranties_languages');\n        return $result->result_array();\n    }\n\n    public function setNewWarrantyLanguage($post)\n    {\n        unset($post['addNewWarrantyTranslation']);\n        $post['for_user'] = USER_ID;\n        if (!$this->db->insert('warranties_languages', $post)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function checkIsFreeWarrantyNumber($number, $without = 0)\n    {\n        if ($without > 0) {\n            $this->db->where('id !=', $without);\n        }\n        $this->db->where('warranty_number', $number);\n        $this->db->where('for_user', USER_ID);\n        $this->db->where('for_company', SELECTED_COMPANY_ID);\n        $this->db->where('warranties.is_deleted', 0);\n        $num = $this->db->count_all_results('warranties');\n        if ($num > 0) {\n            return false;\n        }\n        return true;\n    }\n\n    public function getWarrantyByNumber($number)\n    {\n        $this->db->where('warranties.warranty_number', (int) $number);\n        $this->db->where('warranties.for_user', USER_ID);\n        $this->db->where('warranties.for_company', SELECTED_COMPANY_ID);\n        $this->db->where('warranties.is_deleted', 0);\n        $this->db->limit(1);\n        $result = $this->db->get('warranties');\n        $arr = $result->row_array();\n        if (empty($arr)) {\n            return $arr;\n        }\n\n        $result = $this->db->where('for_warranty', $arr['id'])->order_by('position', 'asc')->get('warranties_items');\n        $items = $result->result_array();\n        $arr['items'] = $items;\n\n        $result = $this->db->where('for_warranty', $arr['id'])->get('warranties_clients');\n        $client = $result->row_array();\n        $arr['client'] = $client;\n\n        $result = $this->db->where('for_warranty', $arr['id'])->get('warranties_firms');\n        $firm = $result->row_array();\n        $arr['firm'] = $firm;\n\n        $result = $this->db->where('for_warranty', $arr['id'])->get('warranties_translations');\n        $translation = $result->row_array();\n        $arr['translation'] = $translation;\n        return $arr;\n    }\n\n    public function setNewCondition($post)\n    {\n        $insertArray = array(\n            'for_user' => USER_ID,\n            'condition_title' => $post['conditionTitle'],\n            'condition_description' => $post['condition']\n        );\n        if (!$this->db->insert('warranty_conditions`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getWarrantyConditions()\n    {\n        $this->db->where('for_user', USER_ID);\n        $result = $this->db->get('warranty_conditions');\n        return $result->result_array();\n    }\n\n    public function deleteWarrantyCondition($id)\n    {\n        $this->db->where('id', $id);\n        $this->db->where('for_user', USER_ID);\n        if (!$this->db->delete('warranty_conditions')) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function setWarrantyEvent($post, $warrantyId)\n    {\n        $insertArray = array(\n            'for_warranty' => $warrantyId,\n            'type' => htmlspecialchars(trim($post['type'])),\n            'on_date' => strtotime(trim($post['on_date'])),\n            'item' => htmlspecialchars(trim($post['item'])),\n            'description' => htmlspecialchars(trim($post['description'])),\n            'created' => time()\n        );\n        if (!$this->db->insert('warranty_events`', $insertArray)) {\n            log_message('error', print_r($this->db->error(), true));\n            show_error(lang('database_error'));\n        }\n    }\n\n    public function getWarrantyEvents($id)\n    {\n        $this->db->where('for_warranty', $id);\n        $result = $this->db->get('warranty_events');\n        return $result->result_array();\n    }\n\n}\n"
  },
  {
    "path": "application/modules/users/views/clients/addclient.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('add_client') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>\n            <li><a href=\"<?= lang_url('user/clients') ?>\"><?= lang('clients') ?></a></li>  \n            <li class=\"active\"><?= lang('add_client') ?></li>\n        </ol>\n    </div>\n</div>\n<?php if ($this->permissions->hasPerm('perm_add_clients') && $editId == 0 || $this->permissions->hasPerm('perm_edit_clients') && $editId > 0) { ?>\n    <form action=\"\" class=\"site-form\" method=\"POST\" id=\"setNewClient\">\n        <div class=\"row\">\n            <div class=\"col-sm-6 col-sm-offset-3\">\n                <div class=\"form-group\">\n                    <label><?= lang('create_inv_client') ?></label> \n                    <input type=\"text\" name=\"client_name\" value=\"<?= isset($_POST['client_name']) ? $_POST['client_name'] : '' ?>\" class=\"form-control field\">\n                    <div>\n                        <div class=\"checkbox\">\n                            <label><input type=\"checkbox\" name=\"is_to_person\" <?= isset($_POST['is_to_person']) && $_POST['is_to_person'] == 1 ? 'checked=\"checked\"' : '' ?> id=\"individual-client\" value=\"\"><?= lang('create_inv_individual') ?></label>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group client-company\" <?= isset($_POST['is_to_person']) && $_POST['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>> \n                    <label><?= lang('create_inv_bulstat') ?></label> \n                    <input type=\"text\" name=\"client_bulstat\" value=\"<?= isset($_POST['client_bulstat']) ? $_POST['client_bulstat'] : '' ?>\" class=\"form-control field\">\n                    <div>\n                        <div class=\"checkbox\">\n                            <label><input type=\"checkbox\" <?= isset($_POST['client_vat_registered']) && $_POST['client_vat_registered'] == 1 ? 'checked=\"checked\"' : '' ?> name=\"client_vat_registered\" id=\"client-vat-registered\" value=\"\"><?= lang('create_inv_client_vat_registered') ?></label>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group client-company client-vat-registered\" <?= isset($_POST['is_to_person']) && $_POST['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?> <?= isset($_POST['client_vat_registered']) && $_POST['client_vat_registered'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                    <label><?= lang('create_inv_vat_number') ?></label>\n                    <input type=\"text\" value=\"<?= isset($_POST['vat_number']) ? $_POST['vat_number'] : '' ?>\" name=\"vat_number\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group client-company\" <?= isset($_POST['is_to_person']) && $_POST['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                    <label><?= lang('create_inv_mol') ?></label>\n                    <input type=\"text\" value=\"<?= isset($_POST['accountable_person']) ? $_POST['accountable_person'] : '' ?>\" name=\"accountable_person\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group client-individial\" <?= isset($_POST['is_to_person']) && $_POST['is_to_person'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                    <label><?= lang('create_inv_ident_num') ?></label>\n                    <input type=\"text\" value=\"<?= isset($_POST['client_ident_num']) ? $_POST['client_ident_num'] : '' ?>\" name=\"client_ident_num\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('create_inv_city') ?></label>\n                    <input type=\"text\" value=\"<?= isset($_POST['client_city']) ? $_POST['client_city'] : '' ?>\" name=\"client_city\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('create_inv_address') ?></label>\n                    <input type=\"text\" value=\"<?= isset($_POST['client_address']) ? $_POST['client_address'] : '' ?>\" name=\"client_address\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('create_inv_country') ?></label>\n                    <input type=\"text\" value=\"<?= isset($_POST['client_country']) ? $_POST['client_country'] : '' ?>\" name=\"client_country\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\" <?= isset($_POST['is_to_person']) && $_POST['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                    <label><?= lang('create_inv_recipient') ?></label> \n                    <input type=\"text\" value=\"<?= isset($_POST['recipient_name']) ? $_POST['recipient_name'] : '' ?>\" name=\"recipient_name\" class=\"form-control field\"> \n                </div>\n                <a href=\"javascript:void(0);\" onclick=\"newClientValidate()\" class=\"btn btn-green\"><?= lang('save_client') ?></a>\n                <a href=\"<?= lang_url('user/clients') ?>\" class=\"btn btn-default\"><?= lang('cancel_save_client') ?></a>\n            </div>\n        </div>\n    </form>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/clients/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('clients') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li class=\"active\"><?= lang('clients') ?></li>\n        </ol>\n    </div>\n</div>\n<div class=\"inner-page-menu\">\n    <a href=\"<?= lang_url('user/client/add') ?>\" class=\"btn btn-blue\"><?= lang('add_new_client') ?></a>\n    <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"delete\"><?= lang('delete') ?></a>\n    <button data-toggle=\"collapse\" data-target=\"#clients-search\" class=\"btn btn-blue\"><?= lang('search') ?></button> \n</div> \n<div id=\"clients-search\" class=\"collapse <?= isset($_GET['client_name']) ? 'in' : '' ?> lists-search-form\">    \n    <form method=\"GET\" action=\"\" class=\"site-form\"> \n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <div class=\"form-group\">\n                    <label><?= lang('search_client_name') ?></label>\n                    <input type=\"text\" name=\"client_name\" value=\"<?= isset($_GET['client_name']) ? $_GET['client_name'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_client_bulstat') ?></label>\n                    <input type=\"text\" name=\"client_bulstat\" value=\"<?= isset($_GET['client_bulstat']) ? $_GET['client_bulstat'] : '' ?>\" class=\"form-control field\">\n                </div>\n            </div>\n        </div>\n        <input type=\"submit\" class=\"btn btn-green\" value=\"search\"> \n        <a href=\"<?= lang_url('user/clients') ?>\"><?= lang('clear_search') ?></a>\n    </form>\n</div>\n<?php if (!empty($clients)) { ?>\n    <form method=\"POST\" action=\"\" id=\"action-form\">\n        <input type=\"hidden\" name=\"action\" value=\"\">\n        <div class=\"table-responsive\">\n            <table class=\"table table-list table-striped\">\n                <thead>\n                    <tr>\n                        <th><input type=\"checkbox\" class=\"check-all-boxes\"></th>\n                        <th><?= lang('list_cli_name') ?></th>\n                        <th><?= lang('list_cli_bulstat') ?></th>\n                        <th class=\"text-right\"><?= lang('list_cli_manage') ?></th> \n                    </tr>\n                </thead>\n                <tbody>\n                    <?php foreach ($clients as $client) { ?>\n                        <tr>\n                            <td><input type=\"checkbox\" name=\"ids[]\" value=\"<?= $client['id'] ?>\" class=\"check-me-now\"></td>\n                            <td><a href=\"<?= lang_url('user/client/view/' . $client['id']) ?>\"><?= $client['client_name'] ?></a></td>\n                            <td><?= $client['is_to_person'] == 1 ? $client['client_ident_num'] : $client['client_bulstat'] ?></td>\n                            <td class=\"table-options\"> \n                                <?php if ($this->permissions->hasPerm('perm_delete_clients')) { ?>\n                                    <div class=\"dropdown more-btn option\">\n                                        <a class=\"dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\">\n                                            <span class=\"sprite-more\"></span>\n                                        </a>\n                                        <ul class=\"dropdown-menu dropdown-menu-right\">\n                                            <li> \n                                                <a href=\"<?= lang_url('user/client/delete/' . $client['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('confirm_delete_client') ?>\">\n                                                    <?= lang('delete') ?>\n                                                </a>\n                                            </li> \n                                        </ul>\n                                    </div>\n                                <?php } ?>\n                                <a class=\"option\" href=\"<?= lang_url('user/client/edit/' . $client['id']) ?>\">\n                                    <span class=\"sprite-edit\"></span>\n                                </a>\n                            </td>\n                        </tr>\n                    <?php } ?>\n                </tbody>\n            </table>\n        </div> \n    </form>\n    <?= $linksPagination ?>\n<?php } else { ?>\n    <h1 class=\"no-results-found\"><?= lang('no_clients_yet') ?></h1>\n<?php } ?> "
  },
  {
    "path": "application/modules/users/views/clients/viewclient.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('preview_client') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>\n            <li><a href=\"<?= lang_url('user/clients') ?>\"><?= lang('clients') ?></a></li>  \n            <li class=\"active\"><?= lang('preview_client') ?></li>\n        </ol>\n    </div>\n</div>\n<div class=\"row\">\n    <div class=\"col-sm-6 col-sm-offset-3\"> \n        <p><?= lang('create_inv_client') ?> <?= $clientInfo['client_name'] ?></p>\n        <?php if ($clientInfo['is_to_person'] != 1) { ?>\n            <p><?= lang('create_inv_bulstat') ?> <?= $clientInfo['client_bulstat'] ?></p>\n            <?php if ($clientInfo['client_vat_registered'] == 1) { ?>\n                <p><?= lang('create_inv_vat_number') ?> <?= $clientInfo['vat_number'] ?></p>\n            <?php } ?> \n            <p><?= lang('create_inv_mol') ?> <?= $clientInfo['accountable_person'] ?></p>\n            <p><?= lang('create_inv_recipient') ?> <?= $clientInfo['recipient_name'] ?></p>\n        <?php } else { ?>\n            <p><?= lang('create_inv_ident_num') ?> <?= $clientInfo['client_ident_num'] ?></p>\n        <?php } ?> \n        <p><?= lang('create_inv_address') ?> <?= $clientInfo['client_address'] ?></p>\n        <p><?= lang('create_inv_city') ?> <?= $clientInfo['client_city'] ?></p>\n        <p><?= lang('create_inv_country') ?> <?= $clientInfo['client_country'] ?></p>  \n        <a href=\"<?= lang_url('user/client/edit/' . $clientInfo['id']) ?>\" class=\"btn btn-default\"><?= lang('edit') ?></a>\n        <?php if ($this->permissions->hasPerm('perm_delete_clients')) { ?>\n            <a href=\"<?= lang_url('user/client/delete/' . $clientInfo['id']) ?>\" class=\"confirm btn btn-default\" data-my-message=\"<?= lang('confirm_delete_client') ?>\"><?= lang('delete') ?></a>\n        <?php } ?>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/home/index.php",
    "content": "<?php\nif (SELECTED_COMPANY_ID != null) { // in first login we dont have companies and this is null\n    ?>\n    <script src=\"<?= base_url('assets/highcharts/highcharts.js') ?>\"></script>\n    <script src=\"<?= base_url('assets/highcharts/modules/exporting.js') ?>\"></script>\n    <div class=\"selected-page\">\n        <div class=\"inner\">\n            <h1> \n                <?= lang('home') ?>\n            </h1> \n        </div> \n    </div>\n    <div class=\"home-page\">\n        <?php\n        if (!empty($issuedInvoices)) {\n            ?>\n            <div id=\"report-num-invoices\"></div>\n            <?php include 'application/modules/users/views/reports/reportNumInvoices.php'; ?>\n        <?php } else { ?>\n            <h1 class=\"no-results-found\"><?= lang('no_reports_yet_all_time') ?></h1>\n            <div class=\"text-center\">\n                <a href=\"<?= lang_url('user/new/invoice') ?>\" class=\"btn btn-green\"><?= lang('create_first_one_inv') ?></a>\n            </div>\n            <?php\n        }\n        ?>\n    </div> \n<?php }\n?>"
  },
  {
    "path": "application/modules/users/views/home/noSearchResultsHtml.php",
    "content": "<div class=\"top-search-no-results\"><?= lang('top_search_no_results') ?></div>"
  },
  {
    "path": "application/modules/users/views/home/searchResultsHtml.php",
    "content": "<?php if (!empty($result['invoices'])) { ?>\n    <div class=\"invoice-search-result\">\n        <?php\n        foreach ($result['invoices'] as $invoice) {\n            ?> \n            <a href=\"<?= lang_url('user/' . $inv_readable_types[$invoice['inv_type']] . '/view/' . $invoice['inv_number']) ?>\">\n                <?= $invoice['inv_number'] ?>\n            </a> \n        <?php }\n        ?>\n    </div>\n    <?php\n}\nif (!empty($result['clients'])) {\n    ?>\n    <div class=\"client-search-result\">\n        <?php\n        foreach ($result['clients'] as $client) {\n            ?>\n            <a href=\"<?= lang_url('user/client/view/' . $client['id']) ?>\">\n                <?= $client['client_name'] ?>\n            </a> \n        <?php }\n        ?>\n    </div>\n    <?php\n}\nif (!empty($result['items'])) {\n    ?>\n    <div class=\"item-search-result\">\n        <?php\n        foreach ($result['items'] as $item) {\n            ?>\n            <a href=\"<?= lang_url('user/item/view/' . $item['id']) ?>\">\n                <?= $item['name'] ?>\n            </a> \n        <?php }\n        ?>\n    </div>\n    <?php\n}\n?>\n\n\n\n"
  },
  {
    "path": "application/modules/users/views/import_export/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('import_export') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('import_export') ?></li>\n        </ol>\n    </div> \n</div>\n\n<ul class=\"nav nav-tabs\" role=\"tablist\">\n    <li role=\"presentation\" class=\"<?= !isset($_POST['importType']) ? 'active' : '' ?>\"><a href=\"#export\" aria-controls=\"home\" role=\"tab\" data-toggle=\"tab\"><?= lang('export') ?></a></li>\n    <li role=\"presentation\" class=\"<?= !isset($_POST['importType']) ? '' : 'active' ?>\"><a href=\"#import\" aria-controls=\"profile\" role=\"tab\" data-toggle=\"tab\"><?= lang('import') ?></a></li> \n</ul>\n<div class=\"tab-content\">\n    <div role=\"tabpanel\" class=\"tab-pane <?= !isset($_POST['importType']) ? 'active' : '' ?>\" id=\"export\">\n        <form class=\"form-inline site-form\" action=\"\" method=\"POST\">\n            <div class=\"form-group\">\n                <label for=\"from_date\"><?= lang('from_date') ?></label>\n                <input class=\"form-control field datepicker\" value=\"<?= isset($_POST['from_date']) ? $_POST['from_date'] : $from_date ?>\" id=\"from_date\" name=\"from_date\" placeholder=\"dd.mm.yyyy\" type=\"text\">\n            </div>\n            <div class=\"form-group\">\n                <label for=\"to_date\"><?= lang('to_date') ?></label>\n                <input class=\"form-control field datepicker\" value=\"<?= isset($_POST['to_date']) ? $_POST['to_date'] : $to_date ?>\" id=\"to_date\" name=\"to_date\" placeholder=\"dd.mm.yyyy\" type=\"text\">\n            </div>\n            <div class=\"checkbox\">\n                <label><input type=\"checkbox\" name=\"export_all\" <?= isset($_POST['export_all']) ? 'checked=\"checked\"' : '' ?> value=\"true\">Export All</label>\n            </div>\n            <div>\n                <select class=\"selectpicker\" name=\"exportType\">\n                    <option value=\"xml\">XML</option>\n                    <option value=\"excel\">Excel(xls)</option>\n                </select>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-default\"><?= lang('export') ?></button>\n            </div>\n        </form> \n    </div>\n    <div role=\"tabpanel\" class=\"tab-pane <?= !isset($_POST['importType']) ? '' : 'active' ?>\" id=\"import\">\n        <form class=\"form-inline site-form\" action=\"\" method=\"POST\" enctype=\"multipart/form-data\">\n            <input type=\"file\" name=\"fileToImport\">\n            <div>\n                <select class=\"selectpicker\" name=\"importType\">\n                    <option value=\"uni-xml\">Universal XML</option> \n                </select>\n            </div>\n            <div>\n                <button type=\"submit\" class=\"btn btn-default\"><?= lang('import') ?></button>\n            </div>\n        </form>\n        <?php\n        if (!empty($resultImport)) {\n            ?>\n            <h1><?= lang('import_results') ?></h1>\n            <table class=\"table\">\n                <thead>\n                    <tr>\n                        <th></th>\n                        <th><?= lang('inv_num_row_in_file') ?></th>\n                        <th><?= lang('inv_number') ?></th>\n                        <th><?= lang('inv_type') ?></th>\n                        <th><?= lang('inv_errors') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php foreach ($resultImport as $numRow => $importRow) { ?>\n                        <tr>\n                            <td> \n                                <?php if (!empty($importRow['errors'])) { ?>\n                                    X\n                                <?php } else { ?>\n                                    OK\n                                <?php } ?>\n                            </td>\n                            <td><?= $numRow ?></td>\n                            <td><?= $importRow['inv']['inv_number'] ?></td>\n                            <td><?= $invReadableTypes[$importRow['inv']['inv_type']] ?></td>\n                            <td>\n                                <?php\n                                if (!empty($importRow['errors'])) {\n                                    foreach ($importRow['errors'] as $error) {\n                                        ?>\n                                        <p><?= $error ?></p>\n                                        <?php\n                                    }\n                                }\n                                ?>\n                            </td>\n                        </tr> \n                    <?php } ?>\n                </tbody>\n            </table>\n        <?php } ?>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/invoices/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('invoices') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('invoices') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <div class=\"left-nav-side\">\n        <a href=\"<?= lang_url('user/new/invoice') ?>\" class=\"btn btn-blue\"><?= lang('create_new_inv') ?></a>\n    </div>\n    <div class=\"right-nav-side\">\n        <button data-toggle=\"collapse\" class=\"btn btn-blue\" data-target=\"#invoices-search\"><?= lang('search') ?></button>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"delete\"><?= lang('delete') ?></a>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"stat_canceled\"><?= lang('to_canceled_stat') ?></a>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"remove_canceled\"><?= lang('remove_canceled_stat') ?></a>\n    </div>\n    <div class=\"clearfix\"></div>\n</div> \n<div id=\"invoices-search\" class=\"collapse <?= isset($_GET['inv_number']) ? 'in' : '' ?> lists-search-form\">    \n    <form method=\"GET\" class=\"site-form\" action=\"\"> \n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <div class=\"form-group\">\n                    <label><?= lang('search_inv_num') ?></label>\n                    <input type=\"text\" name=\"inv_number\" value=\"<?= isset($_GET['inv_number']) ? $_GET['inv_number'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_client') ?></label>\n                    <input type=\"text\" name=\"inv_client\" value=\"<?= isset($_GET['inv_client']) ? $_GET['inv_client'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_item') ?></label>\n                    <input type=\"text\" name=\"inv_item\" value=\"<?= isset($_GET['inv_item']) ? $_GET['inv_item'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_amount_from') ?></label>\n                    <input type=\"text\" name=\"amount_from\" value=\"<?= isset($_GET['amount_from']) ? $_GET['amount_from'] : '' ?>\" class=\"form-control field field\">\n                    <label><?= lang('search_to') ?></label>\n                    <input type=\"text\" name=\"amount_to\" value=\"<?= isset($_GET['amount_to']) ? $_GET['amount_to'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_date_from') ?></label>\n                    <input type=\"text\" name=\"create_from\" value=\"<?= isset($_GET['create_from']) ? $_GET['create_from'] : '' ?>\" class=\"form-control field datepicker\">\n                    <label><?= lang('search_to') ?></label>\n                    <input type=\"text\" name=\"create_to\" value=\"<?= isset($_GET['create_to']) ? $_GET['create_to'] : '' ?>\" class=\"form-control field datepicker\">\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('search_payment_type') ?></label>\n                    <select class=\"selectpicker\" name=\"inv_payment_type\">\n                        <option value=\"\"></option>\n                        <?php foreach ($paymentMethods as $paymentMethod) { ?>\n                            <option value=\"<?= $paymentMethod['name'] ?>\"><?= $paymentMethod['name'] ?></option>\n                        <?php } ?>\n                    </select>\n                </div>\n            </div>\n            <div class=\"col-sm-4\">\n                <div>\n                    <label><?= lang('search_inv_type') ?></label> \n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_type[]\" <?= isset($_GET['inv_type']) && in_array('tax_inv', $_GET['inv_type']) ? 'checked=\"checked\"' : '' ?> value=\"tax_inv\"><?= lang('type_tax_inv') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_type[]\" <?= isset($_GET['inv_type']) && in_array('prof', $_GET['inv_type']) ? 'checked=\"checked\"' : '' ?> value=\"prof\"><?= lang('type_prof') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_type[]\" <?= isset($_GET['inv_type']) && in_array('debit', $_GET['inv_type']) ? 'checked=\"checked\"' : '' ?> value=\"debit\"><?= lang('type_debit') ?></label>\n                    </div> \n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_type[]\" <?= isset($_GET['inv_type']) && in_array('credit', $_GET['inv_type']) ? 'checked=\"checked\"' : '' ?> value=\"credit\"><?= lang('type_credit') ?></label>\n                    </div>\n                </div>\n                <div>\n                    <label><?= lang('search_inv_payments') ?></label>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_payment[]\" <?= isset($_GET['inv_payment']) && in_array('paid', $_GET['inv_payment']) ? 'checked=\"checked\"' : '' ?> value=\"paid\"><?= lang('search_paied') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_payment[]\" <?= isset($_GET['inv_payment']) && in_array('unpaid', $_GET['inv_payment']) ? 'checked=\"checked\"' : '' ?> value=\"unpaid\"><?= lang('search_unpaied') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_payment[]\" <?= isset($_GET['inv_payment']) && in_array('partly_paid', $_GET['inv_payment']) ? 'checked=\"checked\"' : '' ?> value=\"partly_paid\"><?= lang('search_partly_paid') ?></label>\n                    </div>\n                </div>\n            </div>\n            <div class=\"col-sm-4\">\n                <div>\n                    <label><?= lang('search_inv_status') ?></label>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_status[]\" <?= isset($_GET['inv_status']) && in_array('issued', $_GET['inv_status']) ? 'checked=\"checked\"' : '' ?> value=\"issued\"><?= lang('search_issued') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_status[]\" <?= isset($_GET['inv_status']) && in_array('sended', $_GET['inv_status']) ? 'checked=\"checked\"' : '' ?> value=\"sended\"><?= lang('search_sended') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_status[]\" <?= isset($_GET['inv_status']) && in_array('refused', $_GET['inv_status']) ? 'checked=\"checked\"' : '' ?> value=\"refused\"><?= lang('search_refused') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_status[]\" <?= isset($_GET['inv_status']) && in_array('accepted', $_GET['inv_status']) ? 'checked=\"checked\"' : '' ?> value=\"accepted\"><?= lang('search_accepted') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_status[]\" <?= isset($_GET['inv_status']) && in_array('canceled', $_GET['inv_status']) ? 'checked=\"checked\"' : '' ?> value=\"canceled\"><?= lang('search_canceled') ?></label>\n                    </div>\n                    <div class=\"checkbox\">\n                        <label><input type=\"checkbox\" name=\"inv_status[]\" <?= isset($_GET['inv_status']) && in_array('draft', $_GET['inv_status']) ? 'checked=\"checked\"' : '' ?> value=\"draft\"><?= lang('search_draft') ?></label>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <input type=\"submit\" class=\"btn btn-green\" value=\"search\">\n        <a href=\"<?= lang_url('user/invoices') ?>\"><?= lang('clear_search') ?></a>\n    </form>\n</div>\n<?php if (!empty($invoices)) { ?>\n    <form method=\"POST\" action=\"\" class=\"invoices-list-form\" id=\"action-form\">\n        <input type=\"hidden\" name=\"action\" value=\"\">\n        <div class=\"table-responsive\">\n            <table class=\"table table-list table-striped\">\n                <thead>\n                    <tr>\n                        <th><input type=\"checkbox\" class=\"check-all-boxes\"></th>\n                        <th><?= lang('list_inv_num') ?></th>\n                        <th><?= lang('list_inv_date') ?></th>\n                        <th><?= lang('list_inv_client') ?></th>\n                        <th><?= lang('list_inv_type') ?></th>\n                        <th><?= lang('list_inv_payment_status') ?></th>\n                        <th><?= lang('list_inv_status') ?></th>\n                        <th><?= lang('list_inv_sum') ?></th>  \n                        <th class=\"text-right\"><?= lang('list_inv_manage') ?></th> \n                    </tr>\n                </thead>\n                <tbody>\n                    <?php foreach ($invoices as $invoice) { ?>\n                        <tr>\n                            <td><input type=\"checkbox\" name=\"ids[]\" value=\"<?= $invoice['id'] ?>\" class=\"check-me-now\"></td>\n                            <td><a href=\"<?= lang_url('user/' . $inv_readable_types[$invoice['inv_type']] . '/view/' . $invoice['inv_number']) ?>\"><?= $invoice['inv_number'] ?></a></td>\n                            <td><?= date('d.m.Y', $invoice['date_create']) ?></td>\n                            <td><?= $invoice['client_name'] ?></td>\n                            <td><?= lang('type_' . $invoice['inv_type']) ?></td>\n                            <td class=\"status-changer txt_status_<?= $invoice['payment_status'] ?>\">\n                                <span class=\"show-pay-statuses\" data-inv-id=\"<?= $invoice['id'] ?>\">\n                                    <span class=\"new_pay_status_text\"><?= lang('payment_status_' . $invoice['payment_status']) ?></span>\n                                    <i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n                                </span>\n                            </td>\n                            <td><?= lang('status_' . $invoice['status']) ?></td> \n                            <td><?= $invoice['final_total'] . $invoice['inv_currency'] ?></td> \n                            <td class=\"table-options\">\n                                <?php if ($this->permissions->hasPerm('perm_delete_invoice')) { ?>\n                                    <div class=\"dropdown more-btn option\">\n                                        <a class=\"dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\">\n                                            <span class=\"sprite-more\"></span>\n                                        </a>\n                                        <ul class=\"dropdown-menu dropdown-menu-right\">\n                                            <li> \n                                                <a href=\"<?= lang_url('user/invoice/delete/' . $invoice['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('confirm_delete_invoice') ?>\">\n                                                    <?= lang('delete') ?>\n                                                </a>\n                                            </li> \n                                        </ul>\n                                    </div>\n                                <?php } ?>\n                                <a class=\"option\" href=\"<?= lang_url('user/' . $inv_readable_types[$invoice['inv_type']] . '/edit/' . $invoice['inv_number']) ?>\">\n                                    <span class=\"sprite-edit\"></span>\n                                </a>\n                            </td>\n                        </tr>\n                    <?php } ?>\n                </tbody>\n            </table> \n        </div>\n        <?= lang('countInvoices') . ' <b>' . $countInvoices . '</b> ' . lang('with_sum_of') . ' <b>' . round($sumAmount, $opt_invRoundTo) . '</b>' ?>\n        <div id=\"payment-statuses\">\n            <a href=\"javascript:void(0);\" data-new-pay-status=\"paid\" class=\"change-pay-status\"><?= lang('payment_status_paid') ?></a>\n            <a href=\"javascript:void(0);\" data-new-pay-status=\"unpaid\" class=\"change-pay-status\"><?= lang('payment_status_unpaid') ?></a>\n            <a href=\"javascript:void(0);\" data-new-pay-status=\"partly_paid\" class=\"change-pay-status\"><?= lang('payment_status_partly_paid') ?></a>\n        </div>\n    </form>\n    <?= $linksPagination ?>\n<?php } else { ?>\n    <h1 class=\"no-results-found\"><?= lang('no_invoices_yet') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/invoices/itemTableTr.php",
    "content": "<tr>\n    <td>\n        <input type=\"hidden\" name=\"item_from_list[]\" value=\"0\">\n        <input type=\"hidden\" name=\"is_item_update[]\" value=\"<?= isset($itemPost) ? $itemPost['id'] : '0' ?>\">\n        <div class=\"actions\">\n            <a href=\"javascript:void(0);\" class=\"btn btn-default delete-item\">\n                <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n            </a>\n            <a href=\"javascript:void(0);\" class=\"btn btn-default move-me\">\n                <i class=\"fa fa-sort\" aria-hidden=\"true\"></i>\n            </a>\n        </div>\n    </td>\n    <td>\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['name'] : '' ?>\" name=\"items_names[]\" class=\"form-control field field-item-name\">\n        <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_item') ?>\" data-selector-type=\"item\" class=\"choose\">\n            <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n            <span><?= lang('create_inv_choose') ?></span>\n        </a>\n    </td>\n    <td class=\"min-w-190\">\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['quantity'] : '1.00' ?>\" name=\"items_quantities[]\" class=\"form-control field quantity-field\">\n        <div class=\"quantity-type\">\n            <select class=\"form-control\" name=\"items_quantity_types[]\" data-my-id=\"1\">\n                <?php foreach ($quantityTypes as $quantityType) { ?>\n                    <option value=\"<?= $quantityType['name'] ?>\"><?= $quantityType['name'] ?></option>\n                <?php } if (isset($itemPost)) { ?>\n                    <option value=\"<?= $itemPost['quantity_type'] ?>\" selected=\"\"><?= $itemPost['quantity_type'] ?></option>\n                <?php } ?>\n                <option value=\"--\">--</option>\n                <option value=\"createNewQuantity\"><?= lang('create_new_quantity') ?></option>\n            </select> \n        </div>\n        x\n    </td>\n    <td class=\"min-w-180\">\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['single_price'] : '0.00' ?>\" name=\"items_prices[]\" class=\"form-control field price-field\">\n        =\n    </td>\n    <td class=\"text-right\">\n        <div class=\"item-total-price\">\n            <span class=\"item-total\"><?= isset($itemPost) ? $itemPost['total_price'] : '0.00' ?></span>\n            <input type=\"hidden\" class=\"item-total field\" value=\"<?= isset($itemPost) ? $itemPost['total_price'] : '0.00' ?>\" name=\"items_totals[]\">\n            <span class=\"currency-text\">\n                <?= $theCurrency ?>\n            </span>\n        </div>\n    </td>\n</tr> "
  },
  {
    "path": "application/modules/users/views/invoices/listSelectorHtml.php",
    "content": "<script>\n    var clients = {};\n    var items = {};\n</script>\n<div class=\"well\">\n    <div class=\"input-group search-field\">\n        <input type=\"text\" name=\"SearchDualList\" class=\"form-control\" placeholder=\"<?= lang('search') ?>\" />\n        <span class=\"input-group-addon glyphicon glyphicon-search\"></span>\n    </div>\n    <ul class=\"list-group list-ajax-results\">\n        <?php\n        $i = 1;\n        foreach ($result as $res) {\n            ?>\n            <li class=\"list-group-item\" onclick=\"<?= isset($res['client_name']) ? 'getClient(' . $i . ')' : 'getItem(' . $i . ')' ?>\">\n                <?php if (isset($res['client_name'])) { ?>\n                    <h3><?= $res['client_name'] ?></h3>\n                    <p><?= $res['is_to_person'] == 0 ? lang('bulstat') . ' ' . $res['client_bulstat'] : lang('ident_num') . ' ' . $res['client_ident_num'] ?></p>\n                    <script>\n            clients[<?= $i ?>] = <?= json_encode($res) ?>\n                    </script>\n                <?php } else { ?>\n                    <h3><?= $res['name'] ?></h3>\n                    <p><?= lang('amount') . ' ' . $res['single_price'] . $res['currency'] ?></p>\n                    <script>\n                        items[<?= $i ?>] = <?= json_encode($res) ?>\n                    </script>\n                <?php } ?>\n            </li> \n            <?php\n            $i++;\n        }\n        ?>\n    </ul>\n</div> "
  },
  {
    "path": "application/modules/users/views/invoices/modals/add_payment_method.php",
    "content": "<!-- Modal Add Payment Method -->\n<div class=\"modal fade\" id=\"addPaymentMethod\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"addPaymentMethod\">\n    <div class=\"modal-dialog\" role=\"document\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                <h4 class=\"modal-title\"><?= lang('add_new_payment_method') ?></h4>\n            </div>\n            <div class=\"modal-body site-form\">\n                <input type=\"text\" value=\"\" placeholder=\"<?= lang('type_payment_method') ?>\" class=\"form-control field my-new-pay-method\">\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button>\n                <button type=\"button\" class=\"btn btn-primary add-my-new-pay-method\"><?= lang('add_the_pay_method') ?></button>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/invoices/modals/add_quantity_type.php",
    "content": "<!-- Modal Add New Quantity Type -->\n<div class=\"modal fade\" id=\"addQuantityType\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"addQuantityType\">\n    <div class=\"modal-dialog\" role=\"document\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                <h4 class=\"modal-title\"><?= lang('add_new_quantity_type') ?></h4>\n            </div>\n            <div class=\"modal-body site-form\">\n                <input type=\"text\" value=\"\" placeholder=\"<?= lang('type_quantity_type') ?>\" class=\"form-control field new-quantity-value\">\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button>\n                <button type=\"button\" class=\"btn btn-primary add-my-new-quantity-type\"><?= lang('add_the_quantity') ?></button>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/invoices/modals/selector.php",
    "content": "<!-- Modal Selector -->\n<div class=\"modal fade\" id=\"modalSelector\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalSelector\">\n    <div class=\"modal-dialog\" role=\"document\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                <h4 class=\"modal-title\"></h4>\n            </div>\n            <div class=\"modal-body\">\n\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/invoices/newinvoice.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('create_invoice') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('create_invoice') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_add_invoice') && $editId == 0 || $this->permissions->hasPerm('perm_edit_invoice') && $editId > 0) { ?>\n    <?php if ($planUnits['num_invoices'] > 0 || ($planUnits['num_invoices'] == 0 && $editId > 0)) { ?>\n        <form action=\"\" id=\"setInvoiceForm\" class=\"site-form\" method=\"POST\">\n            <div class=\"inner-page-menu\">\n                <a href=\"<?= lang_url('user/settings/invoices') ?>\" class=\"btn btn-blue\">\n                    <?= lang('invoice_settings') ?>\n                </a> \n            </div>\n            <input type=\"hidden\" name=\"client_from_list\" value=\"0\"> \n            <input type=\"hidden\" name=\"status\" value=\"issued\"> \n            <?php if ($editId > 0) { ?>\n                <input type=\"hidden\" name=\"editId\" value=\"<?= $editId ?>\">\n                <input type=\"hidden\" name=\"onLoadItems\" value=\"<?= implode(',', $currentItems) ?>\">\n            <?php } ?>\n            <?php if ($editId > 0) { ?>\n                <div class=\"row\">\n                    <div class=\"col-xs-12\">\n                        <div class=\"checkbox\">\n                            <label><input type=\"checkbox\" id=\"show-translations\" name=\"show_translations\" value=\"\"><?= lang('show_translation_on_edit') . str_replace('%transname%', $_POST['translation']['language_name'], lang('show_translation_now_use')) ?></label>\n                        </div>\n                        <div class=\"checkbox\">\n                            <label><input type=\"checkbox\" id=\"show-translations-firms\" name=\"show_translations_firms\" value=\"\"><?= lang('show_translation_on_edit') . str_replace('%transname%', $_POST['firm']['name'], lang('show_translation_firm_now_use')) ?></label>\n                        </div>\n                    </div>\n                </div>\n            <?php } ?>\n            <div class=\"row new-doc-page\">\n                <div class=\"col-sm-12 col-md-6 new-doc-page-right\"> \n                    <div class=\"choose-translation\" <?= $editId > 0 ? 'style=\"display:none;\"' : '' ?>>\n                        <p><?= lang('explain_inv_translation') ?></p>\n                        <select class=\"selectpicker\" name=\"invoice_translation\" title=\"<?= lang('choose_translation') ?>\">\n\t\t\t\t\t\t    <option value=\"3\" selected=\"\"><?= lang('default_inv_lang_fr') ?></option>\n                            <option value=\"1\"><?= lang('default_inv_lang_en') ?></option>\n                            <option value=\"2\"><?= lang('default_inv_lang_bg') ?></option>\n                            <?php\n                            if (!empty($invoiceLanguages)) {\n                                foreach ($invoiceLanguages as $invLanguage) {\n                                    ?>\n                                    <option value=\"<?= $invLanguage['id'] ?>\"><?= $invLanguage['language_name'] ?>(<?= $invLanguage['id'] ?>)</option>\n                                    <?php\n                                }\n                            }\n                            ?> \n                        </select>\n                        <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalAddNewTranslation\" class=\"btn btn-default\">\n                            <?= lang('add_new_inv_translation') ?>\n                        </a>\n                        <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalExplainTranslation\">\n                            <i class=\"fa fa-question-circle\" aria-hidden=\"true\"></i>\n                        </a>\n                    </div>\n                </div> \n                <div class=\"col-sm-12 col-md-6  new-doc-page-left\"> \n                    <div class=\"choose-firm-translation\" <?= $editId > 0 ? 'style=\"display:none;\"' : '' ?>>\n                        <p><?= lang('explain_firm_translation') ?></p>\n                        <select class=\"selectpicker\" name=\"invoice_firm_translation\"> \n                            <?php\n                            foreach ($allForFirm['translations'] as $theFirm) {\n                                ?>\n                                <option value=\"<?= $theFirm['id'] ?>\" <?= $theFirm['is_default'] == 1 ? 'selected=\"selected\"' : '' ?>><?= $theFirm['trans_name'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                    </div> \n                </div>\n            </div> \n            <div class=\"create-document\">\n                <div class=\"type\">\n                    <label><?= lang('create_inv_type') ?></label> \n                    <div class=\"special-radio\">\n                        <label class=\"control control--radio\"><?= lang('create_inv_proforma') ?>\n                            <input type=\"radio\" value=\"prof\" name=\"inv_type\" <?= isset($_POST['inv_type']) && $_POST['inv_type'] == 'prof' ? 'checked=\"checked\"' : '' ?>/>\n                            <div class=\"control__indicator\"></div>\n                        </label>\n                        <label class=\"control control--radio\"><?= lang('create_inv_invoice') ?>\n                            <input type=\"radio\" value=\"tax_inv\" name=\"inv_type\" <?= (isset($_POST['inv_type']) && $_POST['inv_type'] == 'tax_inv') || !isset($_POST['inv_type']) ? 'checked=\"checked\"' : '' ?>/>\n                            <div class=\"control__indicator\"></div>\n                        </label>\n                        <label class=\"control control--radio\"><?= lang('create_inv_debit') ?>\n                            <input type=\"radio\" value=\"debit\" name=\"inv_type\" <?= isset($_POST['inv_type']) && $_POST['inv_type'] == 'debit' ? 'checked=\"checked\"' : '' ?>/>\n                            <div class=\"control__indicator\"></div>\n                        </label>\n                        <label class=\"control control--radio\"><?= lang('create_inv_credit') ?>\n                            <input type=\"radio\" value=\"credit\" name=\"inv_type\" <?= isset($_POST['inv_type']) && $_POST['inv_type'] == 'credit' ? 'checked=\"checked\"' : '' ?>/>\n                            <div class=\"control__indicator\"></div>\n                        </label>\n                    </div>\n                </div>\n                <div class=\"inner\"> \n                    <h1 class=\"inv-type-title\"><?= lang('invoice') ?></h1>\n                    <div class=\"row credit-debit-option\" <?= isset($_POST['inv_type']) && ($_POST['inv_type'] == 'debit' || $_POST['inv_type'] == 'credit') ? 'style=\"display:block;\"' : '' ?>>\n                        <div class=\"col-sm-5\">\n                            <div class=\"column-data\">\n                                <label><?= lang('to_inv_num') ?></label>\n                                <input class=\"form-control field\" value=\"<?= isset($_POST['to_inv_number']) ? $_POST['to_inv_number'] : '' ?>\" name=\"to_inv_number\" type=\"text\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('to_inv_date') ?></label>\n                                <input class=\"form-control field datepicker\" value=\"<?= isset($_POST['to_inv_date']) ? date('d.m.Y', $_POST['to_inv_date']) : '' ?>\" name=\"to_inv_date\" placeholder=\"dd.mm.yyyy\" type=\"text\">\n                            </div>\n                        </div> \n                    </div>\n                    <div class=\"row head-content\">\n                        <div class=\"col-sm-6 col-md-5\"> \n                            <div class=\"column-data client\">\n                                <label><?= lang('create_inv_client') ?></label> \n                                <input type=\"text\" name=\"client_name\" value=\"<?= isset($_POST['client']['client_name']) ? $_POST['client']['client_name'] : '' ?>\" class=\"form-control field\">\n                                <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                    <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                    <span><?= lang('create_inv_choose') ?></span>\n                                </a>\n                                <div class=\"clearfix\"></div>\n                                <div class=\"checkbox\">\n                                    <label><input type=\"checkbox\" name=\"is_to_person\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'checked=\"checked\"' : '' ?> id=\"individual-client\" value=\"\"><?= lang('create_inv_individual') ?></label>\n                                </div> \n                            </div>\n                            <div class=\"column-data client client-company\"  <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>> \n                                <label><?= lang('create_inv_bulstat') ?></label> \n                                <input type=\"text\" name=\"client_bulstat\" value=\"<?= isset($_POST['client']['client_bulstat']) ? $_POST['client']['client_bulstat'] : '' ?>\" class=\"form-control field\">\n                                <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                    <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                    <span><?= lang('create_inv_choose') ?></span>\n                                </a>\n                                <div class=\"clearfix\"></div>\n                                <div class=\"checkbox\">\n                                    <label><input type=\"checkbox\" <?= isset($_POST['client']['client_vat_registered']) && $_POST['client']['client_vat_registered'] == 1 ? 'checked=\"checked\"' : '' ?> name=\"client_vat_registered\" id=\"client-vat-registered\" value=\"\"><?= lang('create_inv_client_vat_registered') ?></label>\n                                </div>\n                            </div>\n                            <div class=\"column-data client-company client-vat-registered\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?> <?= isset($_POST['client_vat_registered']) && $_POST['client_vat_registered'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                                <label><?= lang('create_inv_vat_number') ?></label>\n                                <input type=\"text\" value=\"<?= isset($_POST['client']['vat_number']) ? $_POST['client']['vat_number'] : '' ?>\" name=\"vat_number\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data client-company\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                <label><?= lang('create_inv_mol') ?></label>\n                                <input type=\"text\" value=\"<?= isset($_POST['client']['accountable_person']) ? $_POST['client']['accountable_person'] : '' ?>\" name=\"accountable_person\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data client-individial\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                                <label><?= lang('create_inv_ident_num') ?></label>\n                                <input type=\"text\" value=\"<?= isset($_POST['client']['client_ident_num']) ? $_POST['client']['client_ident_num'] : '' ?>\" name=\"client_ident_num\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_inv_city') ?></label>\n                                <input type=\"text\" value=\"<?= isset($_POST['client']['client_city']) ? $_POST['client']['client_city'] : '' ?>\" name=\"client_city\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_inv_address') ?></label>\n                                <input type=\"text\" value=\"<?= isset($_POST['client']['client_address']) ? $_POST['client']['client_address'] : '' ?>\" name=\"client_address\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_inv_country') ?></label>\n                                <input type=\"text\" value=\"<?= isset($_POST['client']['client_country']) ? $_POST['client']['client_country'] : '' ?>\" name=\"client_country\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data client-company\" <?= isset($_POST['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                <label><?= lang('create_inv_recipient') ?></label> \n                                <input type=\"text\" value=\"<?= isset($_POST['client']['recipient_name']) ? $_POST['client']['recipient_name'] : '' ?>\" name=\"recipient_name\" class=\"form-control field\"> \n                            </div>\n                        </div>\n                        <div class=\"col-sm-6 col-md-7\">\n                            <div class=\"invoice-setting\">\n                                <div class=\"column-data\">\n                                    <span class=\"inv-type-num\"><?= lang('create_inv_inv_num') ?></span> <label>№:</label>\n                                    <input type=\"text\" name=\"inv_number\" value=\"<?= isset($_POST['inv_number']) ? $_POST['inv_number'] : $nextInvNumber ?>\" class=\"form-control field\">\n                                </div>\n                                <div class=\"column-data\">\n                                    <label><?= lang('create_inv_date_create') ?></label>\n                                    <input type=\"text\" name=\"date_create\" placeholder=\"dd.mm.yyyy\" value=\"<?= isset($_POST['date_create']) ? date('d.m.Y', $_POST['date_create']) : date('d.m.Y', time()) ?>\" class=\"form-control field datepicker\">\n                                </div>\n                                <div class=\"column-data\">\n                                    <label><?= lang('create_inv_date_tax') ?></label>\n                                    <input type=\"text\" name=\"date_tax_event\" placeholder=\"dd.mm.yyyy\" value=\"<?= isset($_POST['date_tax_event']) ? date('d.m.Y', $_POST['date_tax_event']) : date('d.m.Y', time()) ?>\" class=\"form-control field datepicker\">\n                                </div>\n                                <div class=\"column-data\">\n                                    <div class=\"checkbox\">\n                                        <label><input type=\"checkbox\" <?= isset($_POST['have_maturity_date']) && $_POST['have_maturity_date'] == 1 ? 'checked=\"checked\"' : '' ?> name=\"have_maturity_date\" id=\"maturity-date\" value=\"\"><?= lang('create_inv_i_maturity_date') ?></label>\n                                    </div>\n                                    <div class=\"maturity-date\" <?= isset($_POST['have_maturity_date']) && $_POST['have_maturity_date'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                                        <label><?= lang('create_inv_maturity_date') ?></label>\n                                        <input type=\"text\" placeholder=\"dd.mm.yyyy\" value=\"<?= isset($_POST['maturity_date']) ? date('m.d.Y', $_POST['maturity_date']) : date('d.m.Y', time()) ?>\" name=\"maturity_date\" class=\"form-control field datepicker\">\n                                    </div>\n                                </div>\n                                <div class=\"column-data\">\n                                    <div class=\"checkbox\">\n                                        <label><input type=\"checkbox\" name=\"cash_accounting\" <?= isset($_POST['cash_accounting']) && $_POST['cash_accounting'] == 1 ? 'checked=\"checked\"' : '' ?> value=\"\"><?= lang('create_inv_cash_acc') ?></label>\n                                    </div>\n                                </div>\n                                <?php if ($editId > 0) { ?>\n                                    <div class=\"column-data\">\n                                        <label><?= lang('composed_from') ?></label>\n                                        <input type=\"text\" name=\"composed\" value=\"<?= $_POST['composed'] ?>\" class=\"form-control field\">\n                                    </div> \n                                    <div class=\"column-data\">\n                                        <label><?= lang('schiffer_replace') ?></label>\n                                        <input type=\"text\" name=\"schiffer\" value=\"<?= $_POST['schiffer'] ?>\" class=\"form-control field\">\n                                    </div> \n                                <?php } ?>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"select-currency\">\n                        <?= lang('select_curreny') ?> \n                        <select class=\"selectpicker\" id=\"selectCurrencyNewInv\" name=\"inv_currency\" title=\"<?= lang('no_currency_selected') ?>\" data-live-search=\"true\">\n                            <?php\n                            $choosedCur = false;\n                            foreach ($currencies as $currency) {\n                                if ($theCurrency == $currency['value']) {\n                                    $selectedCurrency = 'selected';\n                                    $choosedCur = true;\n                                } else {\n                                    $selectedCurrency = '';\n                                }\n                                ?>\n                                <option value=\"<?= $currency['value'] ?>\" <?= $selectedCurrency ?>><?= $currency['name'] ?></option>\n                            <?php } if ($selectedCurrency == '' && $choosedCur == false) { ?>\n                                <option value=\"<?= $theCurrency ?>\" selected=\"\"><?= $theCurrency ?></option> \n                            <?php } ?>\n                        </select>\n                    </div>\n                    <div class=\"table-responsive\">\n                        <table class=\"table table-items\">\n                            <thead>\n                                <tr>\n                                    <th></th>\n                                    <th><?= lang('create_inv_item') ?></th>\n                                    <th><?= lang('create_inv_quantity') ?></th>\n                                    <th><?= lang('create_inv_price') ?></th>\n                                    <th class=\"text-right\"><?= lang('create_inv_total') ?></th>\n                                </tr>\n                            </thead>\n                            <tbody class=\"body-items\">\n                                <?php\n                                if (isset($_POST['items'])) {\n                                    foreach ($_POST['items'] as $itemPost) {\n                                        include __DIR__. '/itemTableTr.php';\n                                    }\n                                } else {\n                                    include __DIR__ . '/itemTableTr.php';\n                                }\n                                ?>\n                            </tbody>\n                        </table>\n                    </div>\n                    <div class=\"items-features\">\n                        <a href=\"javascript:void(0);\" class=\"add-new-item\">\n                            <i class=\"fa fa-plus\"></i>\n                            <?= lang('add_new_item_to_table') ?>\n                        </a>\n                    </div>\n                    <div class=\"row amounts\">\n                        <div class=\"col-sm-12 col-md-6 col-md-offset-6\">\n                            <div class=\"row amount-row\">\n                                <div class=\"col-sm-6\">\n                                    <?= lang('create_inv_invoice_amount') ?>\n                                </div>\n                                <div class=\"col-sm-6\">\n                                    <div class=\"amount\">\n                                        <span id=\"items-total\"><?= isset($_POST['invoice_amount']) ? $_POST['invoice_amount'] : '0.00' ?></span> \n                                        <input type=\"hidden\" value=\"<?= isset($_POST['invoice_amount']) ? $_POST['invoice_amount'] : '0.00' ?>\" name=\"invoice_amount\" class=\"items-total field\">\n                                        <span class=\"currency-text\">\n                                            <?= $theCurrency ?>\n                                        </span>\n                                    </div> \n                                </div>\n                            </div>\n                            <div class=\"row amount-row\">\n                                <div class=\"col-sm-6\">\n                                    <div class=\"discount-txt\">\n                                        <?= lang('create_inv_discount') ?>\n                                    </div>\n                                </div>\n                                <div class=\"col-sm-6\">\n                                    <div class=\"discount\">\n                                        <input type=\"text\" value=\"<?= isset($_POST['discount']) ? $_POST['discount'] : '0.00' ?>\" name=\"discount\" class=\"form-control field text-discount\">\n                                        <div class=\"select-discount\">\n                                            <select class=\"selectpicker form-control\" name=\"discount_type\" id=\"discount-value\"> \n                                                <option class=\"currency-text\" <?= isset($_POST['discount_type']) && $_POST['discount_type'] != '%' ? 'selected=\"selected\"' : '' ?>><?= $theCurrency ?></option>\n                                                <option <?= isset($_POST['discount_type']) && $_POST['discount_type'] == '%' ? 'selected=\"selected\"' : '' ?>>%</option>\n                                            </select>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"row amount-row\">\n                                <div class=\"col-sm-6\">\n                                    <?= lang('create_inv_tax_base') ?>\n                                </div>\n                                <div class=\"col-sm-6\">\n                                    <div class=\"amount\">\n                                        <span id=\"tax-base\"><?= isset($_POST['tax_base']) ? $_POST['tax_base'] : '0.00' ?></span>\n                                        <input type=\"hidden\" value=\"<?= isset($_POST['tax_base']) ? $_POST['tax_base'] : '0.00' ?>\" name=\"tax_base\" class=\"tax-base field\">\n                                        <span class=\"currency-text\">\n                                            <?= $theCurrency ?>\n                                        </span>\n                                    </div> \n                                </div>\n                            </div>\n                            <div class=\"row amount-row\">\n                                <div class=\"col-sm-6\">\n                                    <div class=\"no-vat-container\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                        <?= lang('create_inv_vat') ?>\n                                        <input type=\"text\" class=\"form-control field vat-field\" name=\"vat_percent\" value=\"<?= isset($_POST['vat_percent']) ? $_POST['vat_percent'] : '20' ?>\">\n                                        %\n                                    </div>\n                                    <div class=\"no-vat\">\n                                        <div class=\"checkbox\">\n                                            <label><input type=\"checkbox\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'checked=\"checked\"' : '' ?>  name=\"no_vat\" id=\"no-vat\" value=\"\"><?= lang('create_inv_no_vat_mark') ?></label>\n                                        </div>\n                                    </div> \n                                </div>\n                                <div class=\"col-sm-6\"> \n                                    <div class=\"amount the-vat\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                        <span id=\"vat-sum\"><?= isset($_POST['vat_sum']) ? $_POST['vat_sum'] : '0.00' ?></span> \n                                        <input type=\"hidden\" name=\"vat_sum\" value=\"<?= isset($_POST['vat_sum']) ? $_POST['vat_sum'] : '0.00' ?>\" class=\"vat-sum field\">\n                                        <span class=\"currency-text\">\n                                            <?= $theCurrency ?>\n                                        </span>\n                                    </div> \n                                    <div class=\"no-vat-field\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                                        <label><?= lang('create_inv_reason_no_vat') ?></label> \n                                        <input type=\"text\" class=\"form-control field\" name=\"no_vat_reason\" value=\"<?= isset($_POST['no_vat_reason']) ? $_POST['no_vat_reason'] : '' ?>\">\n                                        <?php if (!empty($myNoVatReasons)) { ?>\n                                            <select class=\"selectpicker\" id=\"select-vat-from-list\" title=\"<?= lang('no_vat_reason_selected') ?>\" data-live-search=\"true\">\n                                                <?php\n                                                foreach ($myNoVatReasons as $vatReason) {\n                                                    ?>\n                                                    <option value=\"<?= $vatReason['reason'] ?>\"><?= $vatReason['reason'] ?></option>\n                                                <?php } ?>\n                                            </select>\n                                        <?php } ?>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"row amount-row total-row\">\n                                <div class=\"col-sm-6\">\n                                    <span class=\"total\"><?= lang('create_inv_total') ?></span> \n                                </div>\n                                <div class=\"col-sm-6\">\n                                    <div class=\"amount total\">\n                                        <span id=\"final-total\"><?= isset($_POST['final_total']) ? $_POST['final_total'] : '0.00' ?></span>\n                                        <input type=\"hidden\" name=\"final_total\" class=\"final-total field\" value=\"<?= isset($_POST['final_total']) ? $_POST['final_total'] : '0.00' ?>\">\n                                        <span class=\"currency-text\">\n                                            <?= $theCurrency ?>\n                                        </span>\n                                    </div> \n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"remarks\">\n                        <label><?= lang('create_inv_remarks') ?><sup><?= lang('visibile_for_client') ?></sup></label>\n                        <textarea class=\"form-control field area\" name=\"remarks\"><?= isset($_POST['remarks']) ? $_POST['remarks'] : '' ?></textarea>\n                    </div>\n                    <div class=\"payment-type\">\n                        <label><?= lang('create_inv_payment_type') ?></label>\n                        <select class=\"selectpicker payment-method\" name=\"payment_method\">\n                            <?php foreach ($paymentMethods as $paymentMethod) { ?>\n                                <option value=\"<?= $paymentMethod['name'] ?>\"><?= $paymentMethod['name'] ?></option>\n                            <?php } if (isset($_POST['payment_method'])) { ?>\n                                <option value=\"<?= $_POST['payment_method'] ?>\" selected=\"\"><?= $_POST['payment_method'] ?></option>\n                            <?php } ?>\n                            <option value=\"--\">--</option>\n                            <option value=\"createNewMethod\"><?= lang('create_new_pay_method') ?></option>\n                        </select> \n                    </div> \n                </div> \n                <a href=\"javascript:void(0);\" onclick=\"createNewInvValidate()\" class=\"btn btn-green\"><?= $editId == 0 ? lang('create_inv_save') : lang('update_inv_save') ?></a>\n                <?php if ($editId == 0) { ?>\n                    <a href=\"javascript:void(0);\" onclick=\"createDraft()\" class=\"btn btn-orange\"><?= lang('create_inv_save_draft') ?></a>\n                <?php } ?>\n                <?= lang('or') ?>\n                <a href=\"<?= lang_url('user/invoices') ?>\"><?= lang('open_invoices') ?></a>\n            </div>\n        </form>\n        <?php\n        include __DIR__ . '/modals/add_quantity_type.php';\n        include __DIR__ . '/modals/add_payment_method.php';\n        include __DIR__ . '/modals/selector.php';\n        ?>\n        <!-- Modal Explain Add Translations -->\n        <div class=\"modal fade\" id=\"modalExplainTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalExplainTranslation\">\n            <div class=\"modal-dialog\" role=\"document\">\n                <div class=\"modal-content\">\n                    <div class=\"modal-header\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                        <h4 class=\"modal-title\"><?= lang('what_mean_new_translate') ?></h4>\n                    </div>\n                    <div class=\"modal-body\">\n                        <?= lang('what_mean_new_translate_explain') ?>\n                    </div>\n                    <div class=\"modal-footer\">\n                        <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                    </div>\n                </div>\n            </div>\n        </div>\n        <!-- Modal Create New Translation -->\n        <div class=\"modal fade\" id=\"modalAddNewTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalAddNewTranslation\">\n            <div class=\"modal-dialog\" role=\"document\">\n                <div class=\"modal-content\">\n                    <div class=\"modal-header\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                        <h4 class=\"modal-title\"><?= lang('add_new_translation') ?></h4>\n                    </div>\n                    <div class=\"modal-body site-form\">\n                        <form method=\"POST\" action=\"\" id=\"formAddNewTranslate\">\n                            <input type=\"hidden\" name=\"addNewInvoiceLanguage\" value=\"1\">\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_language_name') ?></label>\n                                <input type=\"text\" name=\"language_name\" placeholder=\"<?= lang('lang_name_internal_use') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_recipient') ?></label>\n                                <input type=\"text\" name=\"recipient\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_bulstat') ?></label>\n                                <input type=\"text\" name=\"bulstat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_mol') ?></label>\n                                <input type=\"text\" name=\"mol\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_sender') ?></label>\n                                <input type=\"text\" name=\"sender\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_original') ?></label>\n                                <input type=\"text\" name=\"original\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_number') ?></label>\n                                <input type=\"text\" name=\"number\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_date_of_issue') ?></label>\n                                <input type=\"text\" name=\"date_of_issue\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_date_tax_event') ?></label>\n                                <input type=\"text\" name=\"a_date_of_a_tax_event\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_to_an_invoice') ?></label>\n                                <input type=\"text\" name=\"to_an_invoice\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_from_date') ?></label>\n                                <input type=\"text\" name=\"from_date\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_invoice') ?></label>\n                                <input type=\"text\" name=\"invoice\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_debit_note') ?></label>\n                                <input type=\"text\" name=\"debit_note\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_credit_note') ?></label>\n                                <input type=\"text\" name=\"credit_note\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_remarks') ?></label>\n                                <input type=\"text\" name=\"remarks\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_pro_forma') ?></label>\n                                <input type=\"text\" name=\"pro_forma\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_products_name') ?></label>\n                                <input type=\"text\" name=\"products_name\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_quantity') ?></label>\n                                <input type=\"text\" name=\"quantity\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_single_price') ?></label>\n                                <input type=\"text\" name=\"single_price\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_value') ?></label>\n                                <input type=\"text\" name=\"value\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_amount') ?></label>\n                                <input type=\"text\" name=\"amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_tax_base') ?></label>\n                                <input type=\"text\" name=\"tax_base\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_percentage_vat') ?></label>\n                                <input type=\"text\" name=\"percentage_vat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"from-group\">\n                                <label><?= lang('trans_vat_charget') ?></label>\n                                <input type=\"text\" name=\"vat_charget\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_everything') ?></label>\n                                <input type=\"text\" name=\"everything\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_reason_non_var') ?></label>\n                                <input type=\"text\" name=\"reason_for_non_vat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_compiled') ?></label>\n                                <input type=\"text\" name=\"compiled\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_signature') ?></label>\n                                <input type=\"text\" name=\"signature\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_schiffer') ?></label>\n                                <input type=\"text\" name=\"schiffer\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_discount') ?></label>\n                                <input type=\"text\" name=\"discount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_payment_type') ?></label>\n                                <input type=\"text\" name=\"payment_type\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_page') ?></label>\n                                <input type=\"text\" name=\"page\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_i_accept') ?></label>\n                                <input type=\"text\" name=\"i_accept\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_i_refuse') ?></label>\n                                <input type=\"text\" name=\"i_refuse\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_vat_number') ?></label>\n                                <input type=\"text\" name=\"vat_number\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('trans_receive_from') ?></label>\n                                <div class=\"row\">\n                                    <div class=\"col-sm-5\">\n                                        <input type=\"text\" name=\"receive_inv_from\" placeholder=\"<?= lang('you_receved_tr') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                                    </div>\n                                    <div class=\"col-sm-2 text-center\">\n                                        <?= lang('invoice') ?>\n                                    </div>\n                                    <div class=\"col-sm-5\"> \n                                        <input type=\"text\" name=\"receive_inv_from\" placeholder=\"<?= lang('from_tr') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                                    </div>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                    <div class=\"modal-footer\">\n                        <a href=\"javascript:void(0);\" class=\"btn btn-default\" onclick=\"saveNewTranslation()\"><?= lang('save_new_translate') ?></a>\n                        <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                    </div>\n                </div>\n            </div>\n        </div>\n        <?php if ($opt_invCalculator == 0) { ?>\n            <style>\n                span.item-total, #items-total, #tax-base, #vat-sum, #final-total {display: none;}\n            </style>\n            <script>\n                $('input.item-total, [name=\"invoice_amount\"], [name=\"tax_base\"], [name=\"vat_sum\"], [name=\"final_total\"]').attr('type', 'text');\n            </script>\n            <?php\n        }\n        /*\n         * if edit invoice and have more from one items\n         * show action buttons\n         */\n        if (isset($_POST['items']) && count($_POST['items']) > 1) {\n            ?>\n            <style>\n                .create-document .actions {display: block;}\n            </style>\n        <?php }\n        ?>\n        <script>\n        <?php\n// if load items from other document, lets calculate him\n        if (isset($_GET['create-from'])) {\n            ?>\n                $(document).ready(function () {\n                    createInvoiceCalculator();\n                });\n        <?php } ?>\n            var createDocument = {\n                rountTo: <?= $opt_invRoundTo ?>,\n                calculatorStatus: <?= $opt_invCalculator ?>\n            };\n        </script>\n    <?php } else {\n        ?>\n        <h1 class=\"limit-error\"><?= lang('limit_inv_error') ?></h1>\n        <?php\n    }\n} else {\n    ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/invoices/templates/creative.php",
    "content": "<div class=\"main-inv-container\">\n    <div class=\"invoice-box\">\n        <div class=\"invoice-creative\">\n            <div class=\"row-my-firm\">\n                <?php\n                if ($invoice['firm']['image'] != null && $firmInfo['show_logo'] == 1) {\n                    ?>\n                    <div class=\"firm-logo\">\n                        <img src=\"<?= base_url('attachments/companiesimages/' . $firmInfo['id'] . '/' . $invoice['firm']['image']) ?>\" alt=\"\">\n                    </div>\n                <?php } ?>\n                <div class=\"my-firm-info\">\n                    <p class=\"firm-name\"><?= $invoice['firm']['name'] ?></p>\n                    <p><b><?= $invoice['translation']['bulstat'] ?></b> <?= $invoice['firm']['bulstat'] ?></p>\n                    <?php if ($invoice['firm']['is_vat_registered'] == 1) { ?>\n                        <p><b><?= $invoice['translation']['vat_number'] ?></b> <?= $invoice['firm']['vat_number'] ?></p>\n                    <?php } ?>\n                    <p><?= $invoice['firm']['address'] ?></p>\n                    <p><?= $invoice['firm']['city'] ?></p>\n                    <p><b><?= $invoice['translation']['mol'] ?></b> <?= $invoice['firm']['accountable_person'] ?></p>\n                </div>\n                <div class=\"clearfix\"></div>\n            </div> \n            <div class=\"row-invoice-info\">\n                <?php\n                $to_inv = false;\n                if ($invoice['inv_type'] == 'tax_inv') {\n                    $inv_type = $invoice['translation']['invoice'];\n                }\n                if ($invoice['inv_type'] == 'prof') {\n                    $inv_type = $invoice['translation']['pro_forma'];\n                }\n                if ($invoice['inv_type'] == 'debit') {\n                    $to_inv = true;\n                    $inv_type = $invoice['translation']['debit_note'];\n                }\n                if ($invoice['inv_type'] == 'credit') {\n                    $to_inv = true;\n                    $inv_type = $invoice['translation']['credit_note'];\n                }\n                ?>\n                <span class=\"invoice-type\"><?= $inv_type ?></span>\n                <div class=\"info\">\n                    <table>\n                        <?php if ($to_inv === true) { ?>\n                            <tr>\n                                <td class=\"head-td\">\n                                    <?= $invoice['translation']['to_an_invoice'] ?>\n                                </td>\n                                <td>\n                                    <b><?= $invoice['to_inv_number'] ?></b>\n                                </td>\n                            </tr> \n                            <tr>\n                                <td class=\"head-td\">\n                                    <?= $invoice['translation']['from_date'] ?>\n                                </td>\n                                <td>\n                                    <b><?= date('d.m.Y', $invoice['to_inv_date']) ?></b>\n                                </td>\n                            </tr>\n\n                        <?php } ?>\n                        <tr>\n                            <td class=\"head-td\">\n                                <?= $invoice['translation']['number'] ?>\n                            </td>\n                            <td>\n                                <b><?= $invoice['inv_number'] ?></b>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"head-td\">\n                                <?= $invoice['translation']['date_of_issue'] ?>\n                            </td>\n                            <td>\n                                <?= date('d.m.Y', $invoice['date_create']) ?>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"head-td\">\n                                <?= $invoice['translation']['a_date_of_a_tax_event'] ?>\n                            </td>\n                            <td>\n                                <?= date('d.m.Y', $invoice['date_tax_event']) ?>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"head-td\">\n                                <?= $invoice['translation']['amount'] ?>\n                            </td>\n                            <td>\n                                <?= $invoice['final_total'] . ' ' . $invoice['inv_currency'] ?>\n                            </td>\n                        </tr>\n                    </table>\n                    <div class=\"client-info\">\n                        <p><b><?= $invoice['client']['client_name'] ?></b></p>\n                        <?php if ($invoice['client']['is_to_person'] == 0) { ?>\n                            <p><b><?= $invoice['translation']['bulstat'] ?></b> <?= $invoice['client']['client_bulstat'] ?></p>\n                        <?php } else { ?>\n                            <?= $invoice['client']['client_ident_num'] ?>\n                        <?php } if ($invoice['client']['client_vat_registered'] == 1) { ?>\n                            <p><?= $invoice['client']['vat_number'] ?></p>\n                        <?php } ?>\n                        <p><?= $invoice['client']['client_address'] ?></p>\n                        <p><?= $invoice['client']['client_city'] ?></p>\n                        <p><?= $invoice['client']['client_country'] ?></p>\n                        <?php if ($invoice['client']['is_to_person'] == 0) { ?>\n                            <p><b><?= $invoice['translation']['mol'] ?></b> <?= $invoice['client']['accountable_person'] ?></p> \n                        <?php } ?>\n                    </div>\n                    <div class=\"origin\">\n                        <?= lang($origin . '_txt') ?>\n                    </div>\n                    <div class=\"clearfix\"></div>\n                </div>\n            </div>\n            <table class=\"table table-striped items-table\">\n                <thead>\n                    <tr>\n                        <th><?= $invoice['translation']['products_name'] ?></th>\n                        <th><?= $invoice['translation']['quantity'] ?></th>\n                        <th class=\"text-right\"><?= $invoice['translation']['single_price'] ?></th>\n                        <th class=\"text-right\"><?= $invoice['translation']['value'] ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php foreach ($invoice['items'] as $item) { ?>\n                        <tr>\n                            <td class=\"item-name\"><?= $item['name'] ?></td>\n                            <td><?= $item['quantity'] . ' ' . $item['quantity_type'] ?></td>\n                            <td class=\"text-right\"><?= $item['single_price'] . ' ' . $invoice['inv_currency'] ?></td>\n                            <td class=\"text-right\"><?= $item['total_price'] . ' ' . $invoice['inv_currency'] ?></td>\n                        </tr> \n                    <?php } ?>\n                </tbody>\n            </table>\n            <div class=\"invoice-payments\">\n                <div class=\"invoice-totals\">\n                    <table>\n                        <tr>\n                            <td class=\"info\">\n                                <?= $invoice['translation']['amount'] ?>\n                            </td>\n                            <td>\n                                <?= $invoice['invoice_amount'] . ' ' . $invoice['inv_currency'] ?>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"info\">\n                                <?= $invoice['translation']['discount'] ?> \n                            </td>\n                            <td>\n                                <?= $invoice['discount'] . ' ' . $invoice['discount_type'] ?>\n                            </td>\n                        </tr>\n                        <tr>\n                            <td class=\"info\">\n                                <?= $invoice['translation']['tax_base'] ?>  \n                            </td>\n                            <td>\n                                <?= $invoice['tax_base'] . ' ' . $invoice['inv_currency'] ?>\n                            </td>\n                        </tr>\n                        <?php if ($invoice['no_vat'] == 1) { ?>\n                            <tr>\n                                <td class=\"info\">\n                                    <?= $invoice['translation']['vat_charget'] ?> \n                                </td>\n                                <td>\n                                    <?= $invoice['no_vat_reason'] ?>\n                                </td>\n                            </tr>\n                        <?php } else { ?>\n                            <tr>\n                                <td class=\"info\">\n                                    <?= $invoice['translation']['percentage_vat'] ?>  -  <?= $invoice['vat_percent'] ?>%\n                                </td>\n                                <td>\n                                    <?= $invoice['vat_sum'] . ' ' . $invoice['inv_currency'] ?>\n                                </td>\n                            </tr>\n                        <?php } ?>\n                        <tr class=\"final-total\">\n                            <td class=\"info\">\n                                <?= $invoice['translation']['everything'] ?>  \n                            </td>\n                            <td class=\"total-price\">\n                                <?= $invoice['final_total'] . ' ' . $invoice['inv_currency'] ?>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n                <div class=\"invoice-payment\">\n                    <p><?= $invoice['translation']['payment_type'] ?>:</p>\n                    <p><?= $invoice['payment_method'] ?></p>\n                </div>\n                <div class=\"clearfix\"></div>\n            </div>\n            <div class=\"recipient\">\n                <p class=\"rec\"><?= $invoice['translation']['recipient'] ?>: \n                    <b>\n                        <?php if ($invoice['client']['is_to_person'] == 0) { ?>\n                            <?= $invoice['client']['recipient_name'] ?>\n                        <?php } else { ?>\n                            <?= $invoice['client']['client_name'] ?>\n                        <?php } ?>\n                    </b>\n                </p>\n                <p class=\"comp\"><?= $invoice['translation']['compiled'] ?>: <?= $invoice['composed'] ?></p>\n                <div class=\"clearfix\"></div>\n            </div>\n            <div class=\"signature\">\n                <p class=\"sign\"><?= $invoice['translation']['signature'] ?>: ..................</p>\n                <p class=\"cipher\"><?= $invoice['translation']['schiffer'] ?>: <?= $invoice['schiffer'] ?></p>\n                <div class=\"clearfix\"></div>\n            </div>\n            <div class=\"remarks\">\n                <p><?= $invoice['translation']['remarks'] ?>:</p>\n                <p><?= $invoice['remarks'] ?></p>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/invoices/templates/toner-save.php",
    "content": "<div class=\"invoice-toner-save\">\n    <div class=\"row-my-firm\">\n        <?php\n        if ($invoice['firm']['image'] != null && $firmInfo['show_logo'] == 1) {\n            ?>\n            <div class=\"firm-logo\">\n                <img src=\"<?= base_url('attachments/companiesimages/' . $firmInfo['id'] . '/' . $invoice['firm']['image']) ?>\" alt=\"\">\n            </div>\n        <?php } ?>\n        <div class=\"my-firm-info\">\n            <p class=\"firm-name\"><?= $invoice['firm']['name'] ?></p>\n            <p><?= $invoice['translation']['bulstat'] ?> <?= $invoice['firm']['bulstat'] ?></p>\n            <?php if ($invoice['firm']['is_vat_registered'] == 1) { ?>\n                <p><?= $invoice['translation']['vat_number'] ?> <?= $invoice['firm']['vat_number'] ?></p>\n            <?php } ?>\n            <p><?= $invoice['firm']['address'] ?></p>\n            <p><?= $invoice['firm']['city'] ?></p>\n            <p><?= $invoice['translation']['mol'] ?> <?= $invoice['firm']['accountable_person'] ?></p>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div> \n    <div class=\"row-invoice-info\">\n        <?php\n        $to_inv = false;\n        if ($invoice['inv_type'] == 'tax_inv') {\n            $inv_type = $invoice['translation']['invoice'];\n        }\n        if ($invoice['inv_type'] == 'prof') {\n            $inv_type = $invoice['translation']['pro_forma'];\n        }\n        if ($invoice['inv_type'] == 'debit') {\n            $to_inv = true;\n            $inv_type = $invoice['translation']['debit_note'];\n        }\n        if ($invoice['inv_type'] == 'credit') {\n            $to_inv = true;\n            $inv_type = $invoice['translation']['credit_note'];\n        }\n        ?>\n        <span class=\"invoice-type\"><?= $inv_type ?></span>\n        <div class=\"info\">\n            <table>\n                <?php if ($to_inv === true) { ?>\n                    <tr>\n                        <td class=\"head-td\">\n                            <?= $invoice['translation']['to_an_invoice'] ?>\n                        </td>\n                        <td>\n                            <?= $invoice['to_inv_number'] ?>\n                        </td>\n                    </tr> \n                    <tr>\n                        <td class=\"head-td\">\n                            <?= $invoice['translation']['from_date'] ?>\n                        </td>\n                        <td>\n                            <?= date('d.m.Y', $invoice['to_inv_date']) ?>\n                        </td>\n                    </tr>\n\n                <?php } ?>\n                <tr>\n                    <td class=\"head-td\">\n                        <?= $invoice['translation']['number'] ?>\n                    </td>\n                    <td>\n                        <?= $invoice['inv_number'] ?>\n                    </td>\n                </tr>\n                <tr>\n                    <td class=\"head-td\">\n                        <?= $invoice['translation']['date_of_issue'] ?>\n                    </td>\n                    <td>\n                        <?= date('d.m.Y', $invoice['date_create']) ?>\n                    </td>\n                </tr>\n                <tr>\n                    <td class=\"head-td\">\n                        <?= $invoice['translation']['a_date_of_a_tax_event'] ?>\n                    </td>\n                    <td>\n                        <?= date('d.m.Y', $invoice['date_tax_event']) ?>\n                    </td>\n                </tr>\n                <tr>\n                    <td class=\"head-td\">\n                        <?= $invoice['translation']['amount'] ?>\n                    </td>\n                    <td>\n                        <?= $invoice['final_total'] . ' ' . $invoice['inv_currency'] ?>\n                    </td>\n                </tr>\n            </table>\n            <div class=\"client-info\">\n                <p><?= $invoice['client']['client_name'] ?></p>\n                <?php if ($invoice['client']['is_to_person'] == 0) { ?>\n                    <p><?= $invoice['translation']['bulstat'] ?> <?= $invoice['client']['client_bulstat'] ?></p>\n                <?php } else { ?>\n                    <?= $invoice['client']['client_ident_num'] ?>\n                <?php } if ($invoice['client']['client_vat_registered'] == 1) { ?>\n                    <p><?= $invoice['client']['vat_number'] ?></p>\n                <?php } ?>\n                <p><?= $invoice['client']['client_address'] ?></p>\n                <p><?= $invoice['client']['client_city'] ?></p>\n                <p><?= $invoice['client']['client_country'] ?></p>\n                <?php if ($invoice['client']['is_to_person'] == 0) { ?>\n                    <p><?= $invoice['translation']['mol'] ?> <?= $invoice['client']['accountable_person'] ?></p> \n                <?php } ?>\n            </div>\n            <div class=\"origin\">\n                <?= lang($origin . '_txt') ?>\n            </div>\n            <div class=\"clearfix\"></div>\n        </div>\n    </div>\n    <table class=\"table items-table\">\n        <thead>\n            <tr>\n                <th><?= $invoice['translation']['products_name'] ?></th>\n                <th><?= $invoice['translation']['quantity'] ?></th>\n                <th class=\"text-right\"><?= $invoice['translation']['single_price'] ?></th>\n                <th class=\"text-right\"><?= $invoice['translation']['value'] ?></th>\n            </tr>\n        </thead>\n        <tbody>\n            <?php foreach ($invoice['items'] as $item) { ?>\n                <tr>\n                    <td class=\"item-name\"><?= $item['name'] ?></td>\n                    <td><?= $item['quantity'] . ' ' . $item['quantity_type'] ?></td>\n                    <td class=\"text-right\"><?= $item['single_price'] . ' ' . $invoice['inv_currency'] ?></td>\n                    <td class=\"text-right\"><?= $item['total_price'] . ' ' . $invoice['inv_currency'] ?></td>\n                </tr> \n            <?php } ?>\n        </tbody>\n    </table>\n    <div class=\"invoice-payments\">\n        <div class=\"invoice-totals\">\n            <table>\n                <tr>\n                    <td class=\"info\">\n                        <?= $invoice['translation']['amount'] ?>\n                    </td>\n                    <td>\n                        <?= $invoice['invoice_amount'] . ' ' . $invoice['inv_currency'] ?>\n                    </td>\n                </tr>\n                <tr>\n                    <td class=\"info\">\n                        <?= $invoice['translation']['discount'] ?> \n                    </td>\n                    <td>\n                        <?= $invoice['discount'] . ' ' . $invoice['discount_type'] ?>\n                    </td>\n                </tr>\n                <tr>\n                    <td class=\"info\">\n                        <?= $invoice['translation']['tax_base'] ?>  \n                    </td>\n                    <td>\n                        <?= $invoice['tax_base'] . ' ' . $invoice['inv_currency'] ?>\n                    </td>\n                </tr>\n                <?php if ($invoice['no_vat'] == 1) { ?>\n                    <tr>\n                        <td class=\"info\">\n                            <?= $invoice['translation']['vat_charget'] ?> \n                        </td>\n                        <td>\n                            <?= $invoice['no_vat_reason'] ?>\n                        </td>\n                    </tr>\n                <?php } else { ?>\n                    <tr>\n                        <td class=\"info\">\n                            <?= $invoice['translation']['percentage_vat'] ?>  -  <?= $invoice['vat_percent'] ?>%\n                        </td>\n                        <td>\n                            <?= $invoice['vat_sum'] . ' ' . $invoice['inv_currency'] ?>\n                        </td>\n                    </tr>\n                <?php } ?>\n                <tr class=\"final-total\">\n                    <td class=\"info\">\n                        <?= $invoice['translation']['everything'] ?>  \n                    </td>\n                    <td class=\"total-price\">\n                        <?= $invoice['final_total'] . ' ' . $invoice['inv_currency'] ?>\n                    </td>\n                </tr>\n            </table>\n        </div>\n        <div class=\"invoice-payment\">\n            <p><?= $invoice['translation']['payment_type'] ?>:</p>\n            <p><?= $invoice['payment_method'] ?></p>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"recipient\">\n        <p class=\"rec\"><?= $invoice['translation']['recipient'] ?>: \n            <?php if ($invoice['client']['is_to_person'] == 0) { ?>\n                <?= $invoice['client']['recipient_name'] ?>\n            <?php } else { ?>\n                <?= $invoice['client']['client_name'] ?>\n            <?php } ?>\n        </p>\n        <p class=\"comp\"><?= $invoice['translation']['compiled'] ?>: <?= $invoice['composed'] ?></p>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"signature\">\n        <p class=\"sign\"><?= $invoice['translation']['signature'] ?>: ..................</p>\n        <p class=\"cipher\"><?= $invoice['translation']['schiffer'] ?>: <?= $invoice['schiffer'] ?></p>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"remarks\">\n        <p><?= $invoice['translation']['remarks'] ?>:</p>\n        <p><?= $invoice['remarks'] ?></p>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/invoices/view.php",
    "content": "<link rel=\"stylesheet\" href=\"<?= base_url('assets/users/css/invoices-templates.css') ?>\">\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <i class=\"fa fa-file-text-o\" aria-hidden=\"true\"></i>\n            <?= lang('invoices') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n\t\t\t<li><a href=\"<?= lang_url('user/invoices') ?>\"><?= lang('invoices') ?></a></li>\n            <li class=\"active\"><?= $invNum ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <a href=\"<?= base_url('user/' . $invType . '/print/copy/' . $invNum) ?>\" target=\"_blank\" class=\"btn btn-blue\" style=\"position: relative;\">\n        <?= lang('download_print_copy') ?>\n    </a>\n    <a href=\"<?= base_url('user/' . $invType . '/print/original/' . $invNum) ?>\" target=\"_blank\" class=\"btn btn-blue\" style=\"position: relative;\">\n        <?= lang('download_print_original') ?> \n    </a>\n</div> \n<?php $origin = 'original'; ?>\n<div class=\"view-container\">\n    <div class=\"pageDelivery hidden\"></div>\n    <div class=\"invoice-box\">\n        <?php include $templateFile; ?>\n    </div>\n</div> \n<?php\nif (!empty($actionHistory)) {\n    ?>\n    <div class=\"action-history\">\n        <h1><?= lang('inv_action_history') ?></h1>\n        <table>\n            <?php foreach ($actionHistory as $action) { ?> \n                <tr>\n                    <td><?= lang('status_' . $action['action']) ?></td>\n                    <td><?= $action['info'] ?></td>\n                    <td><?= date('d.m.Y', $action['time']) ?></td>\n                </tr> \n            <?php } ?>\n        </table>\n    </div>\n    <?php\n}\n?>"
  },
  {
    "path": "application/modules/users/views/items/additem.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('add_item') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/items') ?>\"><?= lang('items') ?></a></li>  \n            <li class=\"active\"><?= lang('add_item') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_add_items') && $editId == 0 || $this->permissions->hasPerm('perm_edit_items') && $editId > 0) { ?>\n    <form action=\"\" class=\"site-form\" method=\"POST\" id=\"setNewItem\">\n        <div class=\"row\">\n            <div class=\"col-sm-6 col-sm-offset-3\">\n                <div class=\"form-group\">\n                    <label><?= lang('add_item_name') ?></label> \n                    <input type=\"text\" name=\"name\" value=\"<?= isset($_POST['name']) ? $_POST['name'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('add_item_qua_type') ?></label> \n                    <select class=\"selectpicker\" name=\"quantity_type\">\n                        <?php foreach ($quantityTypes as $quantityType) { ?>\n                            <option value=\"<?= $quantityType['name'] ?>\"><?= $quantityType['name'] ?></option>\n                        <?php } if (isset($_POST['quantity_type'])) { ?>\n                            <option selected=\"\" value=\"<?= $_POST['quantity_type'] ?>\"><?= $_POST['quantity_type'] ?></option>\n                        <?php } ?>\n                    </select> \n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('add_item_price') ?></label> \n                    <input type=\"text\" name=\"single_price\" value=\"<?= isset($_POST['single_price']) ? $_POST['single_price'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('add_item_currency') ?></label> \n                    <select class=\"selectpicker\" name=\"currency\" title=\"<?= lang('no_currency_selected_item') ?>\" data-live-search=\"true\">\n                        <?php\n                        foreach ($currencies as $currency) {\n                            ?>\n                            <option value=\"<?= $currency['value'] ?>\"><?= $currency['name'] ?></option>\n                        <?php } if (isset($_POST['currency'])) { ?>\n                            <option selected=\"\" value=\"<?= $_POST['currency'] ?>\"><?= $_POST['currency'] ?></option>\n                        <?php } ?>\n                    </select>\n                </div>\n                <a href=\"javascript:void(0);\" onclick=\"newItemValidate()\" class=\"btn btn-green\"><?= lang('save_item') ?></a>\n                <a href=\"<?= lang_url('user/items') ?>\" class=\"btn btn-default\"><?= lang('cancel_save_item') ?></a>\n            </div>\n        </div>\n    </form>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/items/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('items') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li class=\"active\"><?= lang('items') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <a href=\"<?= lang_url('user/item/add') ?>\" class=\"btn btn-blue\"><?= lang('add_new_item') ?></a>\n    <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"delete\"><?= lang('delete') ?></a>\n    <button data-toggle=\"collapse\" data-target=\"#items-search\" class=\"btn btn-blue\"><?= lang('search') ?></button>\n</div> \n<div id=\"items-search\" class=\"collapse <?= isset($_GET['item_name']) ? 'in' : '' ?> lists-search-form\">    \n    <form method=\"GET\" action=\"\" class=\"site-form\"> \n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <div class=\"form-group\">\n                    <label><?= lang('search_item_name') ?></label>\n                    <input type=\"text\" name=\"item_name\" value=\"<?= isset($_GET['item_name']) ? $_GET['item_name'] : '' ?>\" class=\"form-control field\">\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('search_amount_from') ?></label>\n                    <input type=\"text\" name=\"amount_from\" value=\"<?= isset($_GET['amount_from']) ? $_GET['amount_from'] : '' ?>\" class=\"form-control field\">\n                    <label><?= lang('search_to') ?></label>\n                    <input type=\"text\" name=\"amount_to\" value=\"<?= isset($_GET['amount_to']) ? $_GET['amount_to'] : '' ?>\" class=\"form-control field\">\n                </div>\n            </div>\n        </div>\n        <input type=\"submit\" class=\"btn btn-green\" value=\"search\"> \n        <a href=\"<?= lang_url('user/items') ?>\"><?= lang('clear_search') ?></a>\n    </form>\n</div>\n<?php if (!empty($items)) { ?>\n    <form method=\"POST\" action=\"\" id=\"action-form\">\n        <input type=\"hidden\" name=\"action\" value=\"\"> \n        <div class=\"table-responsive\">\n            <table class=\"table table-list table-striped\">\n                <thead>\n                    <tr>\n                        <th><input type=\"checkbox\" class=\"check-all-boxes\"></th>\n                        <th><?= lang('list_item_name') ?></th>\n                        <th><?= lang('list_cli_qu_type') ?></th>\n                        <th><?= lang('list_cli_price') ?></th>\n                        <th class=\"text-right\"><?= lang('list_cli_manage') ?></th> \n                    </tr>\n                </thead>\n                <tbody>\n                    <?php foreach ($items as $item) { ?>\n                        <tr>\n                            <td><input type=\"checkbox\" name=\"ids[]\" value=\"<?= $item['id'] ?>\" class=\"check-me-now\"></td>\n                            <td><a href=\"<?= lang_url('user/item/view/' . $item['id']) ?>\"><?= $item['name'] ?></a></td>\n                            <td><?= $item['quantity_type'] ?></td>\n                            <td><?= $item['single_price'] . ' ' . $item['currency'] ?></td>                           \n                            <td class=\"table-options\"> \n                                <?php if ($this->permissions->hasPerm('perm_delete_clients')) { ?>\n                                    <div class=\"dropdown more-btn option\">\n                                        <a class=\"dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\">\n                                            <span class=\"sprite-more\"></span>\n                                        </a>\n                                        <ul class=\"dropdown-menu dropdown-menu-right\">\n                                            <li> \n                                                <a href=\"<?= lang_url('user/item/delete/' . $item['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('confirm_delete_item') ?>\">\n                                                    <?= lang('delete') ?>\n                                                </a>\n                                            </li> \n                                        </ul>\n                                    </div>\n                                <?php } ?>\n                                <a class=\"option\" href=\"<?= lang_url('user/item/edit/' . $item['id']) ?>\">\n                                    <span class=\"sprite-edit\"></span>\n                                </a>\n                            </td>\n                        </tr>\n                    <?php } ?>\n                </tbody>\n            </table>\n        </div> \n    </form>\n    <?= $linksPagination ?>\n<?php } else { ?>\n    <h1 class=\"no-results-found\"><?= lang('no_items_yet') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/items/viewitem.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('preview_item') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/items') ?>\"><?= lang('items') ?></a></li>  \n            <li class=\"active\"><?= lang('preview_item') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"row\">\n    <div class=\"col-sm-6 col-sm-offset-3\">  \n        <p><?= lang('add_item_name') ?> <?= $itemInfo['name'] ?></p>\n        <p><?= lang('add_item_qua_type') ?> <?= $itemInfo['quantity_type'] ?></p>\n        <p><?= lang('add_item_price') ?> <?= $itemInfo['single_price'] ?></p>\n        <p><?= lang('add_item_currency') ?> <?= $itemInfo['currency'] ?></p> \n        <a href=\"<?= lang_url('user/item/edit/' . $itemInfo['id']) ?>\" class=\"btn btn-default\"><?= lang('edit') ?></a>\n        <?php if ($this->permissions->hasPerm('perm_delete_items')) { ?>\n            <a href=\"<?= lang_url('user/item/delete/' . $itemInfo['id']) ?>\" class=\"confirm btn btn-default\" data-my-message=\"<?= lang('confirm_delete_item') ?>\"><?= lang('delete') ?></a>\n        <?php } ?>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/managefirms/edit.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('edit_firm_info') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>\n            <li><a href=\"<?= lang_url('user/managefirms') ?>\"><?= lang('selected_manage_firms') ?></a></li>\n            <li class=\"active\"><?= lang('edit_firm_info') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_can_manage_firms')) { ?>\n    <div class=\"row\">\n        <div class=\"col-md-4 col-sm-6\">\n            <form class=\"site-form\" method=\"POST\" action=\"\"> \n                <div class=\"form-group\">\n                    <label><?= lang('firm_bulstat') ?></label>\n                    <input type=\"text\" name=\"firm_bulstat\" value=\"<?= $companyInfo['company']['bulstat'] ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"checkbox\">\n                    <label><input type=\"checkbox\" name=\"is_vat_registered\" <?= $companyInfo['company']['is_vat_registered'] == 1 ? 'checked=\"checked\"' : '' ?> value=\"\"><?= lang('firm_is_vat_registered') ?></label>\n                </div> \n                <div class=\"form-group firm-vat-number <?= $companyInfo['company']['is_vat_registered'] == 0 ? 'hidden' : '' ?>\">\n                    <label><?= lang('firm_vat_number') ?></label>\n                    <input type=\"text\" name=\"vat_number\" value=\"<?= $companyInfo['company']['vat_number'] ?>\" class=\"form-control field\">\n                </div> \n                <div class=\"checkbox\">\n                    <label><input type=\"checkbox\" name=\"show_logo\" <?= $companyInfo['company']['show_logo'] == 1 ? 'checked=\"checked\"' : '' ?> value=\"\"><?= lang('show_logo_in_inv') ?></label>\n                </div>\n                <button type=\"submit\" class=\"btn btn-default\"><?= lang('save_changes') ?></button>\n            </form>\n            <h2><?= lang('firms_translations') ?></h2>\n            <hr>\n            <?php foreach ($companyInfo['translations'] as $translate) { ?> \n                <a href=\"<?= lang_url('user/managefirms/edit/' . $companyInfo['company']['id'] . '/' . $translate['id']) ?>\"> \n                    <?= $translate['trans_name'] ?>\n                    <?php if ($translate['is_default'] == 1) { ?>\n                        <span class=\"label label-success\"><?= lang('translation_is_default') ?></span>\n                    <?php } ?>\n                </a>\n                <?php if ($translate['is_default'] == 0) { ?>\n                    <a href=\"<?= lang_url('user/managefirms/make-default-translation/' . $companyInfo['company']['id'] . '/' . $translate['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('default_translate_confirm') ?>\"><?= lang('make_translation_default') ?></a>\n                    <?php\n                }\n                if (count($companyInfo['translations']) > 1) {\n                    ?>\n                    <a href=\"<?= lang_url('user/managefirms/delete-translation/' . $companyInfo['company']['id'] . '/' . $translate['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('translation_delete_confirm') ?>\"><?= lang('delete_translation') ?></a>\n                    <br>\n                    <?php\n                }\n            }\n            ?>  \n            <br>\n            <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalAddTranslation\" class=\"btn btn-default\"><?= lang('add_translation') ?></a>\n        </div> \n        <div class=\"col-md-4 col-sm-6\"> \n            <form class=\"site-form\" method=\"POST\" action=\"\" enctype=\"multipart/form-data\"> \n                <input type=\"hidden\" name=\"translation_id\" value=\"<?= $companyTranslate['id'] ?>\">\n                <div class=\"form-group\">\n                    <label><?= lang('trans_name') ?></label>\n                    <input type=\"text\" name=\"trans_name\" class=\"form-control field\" value=\"<?= $companyTranslate['trans_name'] ?>\">\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('firm_name') ?></label>\n                    <input type=\"text\" name=\"firm_name\" class=\"form-control field\" value=\"<?= $this->session->flashdata('firm_name') != null ? $this->session->flashdata('firm_name') : $companyTranslate['name'] ?>\">\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('firm_reg_address') ?></label>\n                    <textarea name=\"firm_reg_address\" class=\"form-control field\"><?= $this->session->flashdata('firm_reg_address') != null ? $this->session->flashdata('firm_reg_address') : $companyTranslate['address'] ?></textarea>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('firm_city') ?></label>\n                    <input type=\"text\" name=\"firm_city\" value=\"<?= $this->session->flashdata('firm_city') != null ? $this->session->flashdata('firm_city') : $companyTranslate['city'] ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('firm_mol') ?></label>\n                    <input type=\"text\" name=\"firm_mol\" value=\"<?= $this->session->flashdata('firm_mol') != null ? $this->session->flashdata('firm_mol') : $companyTranslate['mol'] ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <input type=\"hidden\" name=\"old_image\" value=\"<?= $companyTranslate['image'] ?>\">\n                    <div class=\"form-group firm-image-container\">\n                        <img src=\"<?= base_url('attachments/' . COMPANIES_IMAGES_DIR . '/' . $companyInfo['company']['id'] . '/' . $companyTranslate['image']) ?>\" class=\"img-thumbnail\" alt=\"<?= lang('no_image') ?>\">\n                    </div>\n                    <?php if (is_file('attachments/' . COMPANIES_IMAGES_DIR . '/' . $companyInfo['company']['id'] . '/' . $companyTranslate['image'])) { ?>\n                        <div>\n                            <a href=\"javascript:void(0);\" class=\"btn btn-default remove-firm-logo-btn\" onclick=\"removeFirmLogo()\"><?= lang('remove_firm_image') ?></a>\n                        </div>\n                    <?php } ?>\n                    <label><?= lang('firm_image') ?></label>\n                    <input type=\"file\" name=\"input_file\">\n                </div>  \n                <button type=\"submit\" name=\"saveTranslate\" class=\"btn btn-default\"><?= lang('save_translation') ?></button>\n            </form>\n        </div>\n    </div>\n    <!-- Modal Add Translation -->\n    <div class=\"modal fade\" id=\"modalAddTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalAddTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <form class=\"site-form\" method=\"POST\" action=\"\" enctype=\"multipart/form-data\"> \n                    <input type=\"hidden\" name=\"addFirm\" value=\"\">\n                    <div class=\"modal-header\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                        <h4 class=\"modal-title\" id=\"myModalLabel\"><?= lang('add_new_translation') ?></h4>\n                    </div>\n                    <div class=\"modal-body\">\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_name') ?></label>\n                            <input type=\"text\" name=\"trans_name\" class=\"form-control field\" value=\"<?= trim($this->session->flashdata('trans_name')) ?>\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('firm_name') ?></label>\n                            <input type=\"text\" name=\"firm_name\" class=\"form-control field\" value=\"<?= trim($this->session->flashdata('firm_name')) ?>\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('firm_reg_address') ?></label>\n                            <textarea name=\"firm_reg_address\" class=\"form-control field\"><?= trim($this->session->flashdata('firm_reg_address')) ?></textarea>\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('firm_city') ?></label>\n                            <input type=\"text\" name=\"firm_city\" value=\"<?= trim($this->session->flashdata('firm_city')) ?>\" class=\"form-control field\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('firm_mol') ?></label>\n                            <input type=\"text\" name=\"firm_mol\" value=\"<?= trim($this->session->flashdata('firm_mol')) ?>\" class=\"form-control field\">\n                        </div>\n                        <div class=\"form-group\"> \n                            <label><?= lang('firm_image') ?></label>\n                            <input type=\"file\" name=\"input_file\">\n                        </div> \n                    </div>\n                    <div class=\"modal-footer\">\n                        <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button>\n                        <button type=\"submit\" name=\"add_new_translation\" class=\"btn btn-primary\"><?= lang('add_new_translation') ?></button>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n    <?php\n    if ($this->session->flashdata('addNewTranslationErr') == '1') {\n        ?>\n        <script>\n            $(document).ready(function () {\n                $('#modalAddTranslation').modal('show');\n            });\n        </script>\n        <?php\n    }\n} else {\n    ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/managefirms/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('selected_manage_firms') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>\n            <li class=\"active\"><?= lang('selected_manage_firms') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_can_manage_firms')) { ?>\n    <div class=\"row\">\n        <div class=\"col-sm-8 col-md-6\">\n            <?php if (count($firms) > $planUnits['num_firms']) { ?>\n                <div class=\"alert alert-danger\">\n                    <?= lang('exceeded_limit_firms') ?>\n                </div>\n            <?php } ?>\n            <div class=\"panel-content\">\n                <div class=\"head\">\n                    <div><?= lang('list_firms') ?></div>\n                </div>\n                <div>\n                    <div class=\"body\">\n                        <ul class=\"list-firms\">\n                            <?php\n                            foreach ($firms as $firm) {\n                                if (in_array($firm['id'], $canUseFirms)) {\n                                    ?>\n                                    <li>\n                                        <?= $firm['name'] ?>\n                                        <a href=\"<?= lang_url('user/managefirms/delete-company/' . $firm['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('delete_firm_confirm') ?>\">\n                                            <i class=\"fa fa-remove\" aria-hidden=\"true\"></i>\n                                        </a>\n                                        <a href=\"<?= lang_url('user/managefirms/edit/' . $firm['id']) ?>\">\n                                            <i class=\"fa fa-wrench\" aria-hidden=\"true\"></i>\n                                        </a>\n                                        <?php if ($firm['is_default'] == 1) { ?>\n                                            <span class=\"label label-success\"><?= lang('firm_default') ?></span>\n                                        <?php } else { ?>\n                                            <a href=\"<?= lang_url('user/managefirms/make-default/' . $firm['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('default_firm_confirm') ?>\">\n                                                <span class=\"label label-danger\"><?= lang('make_firm_default') ?></span>\n                                            </a>\n                                        <?php } ?>\n                                    </li> \n                                    <?php\n                                }\n                            }\n                            ?>\n                            <li> \n                                <a href=\"javascript:void(0);\" class=\"btn btn-xs btn-default\" data-toggle=\"modal\" data-target=\"#modalAddCompany\"> \n                                    <?= lang('add_new_company') ?>\n                                </a>\n                                <div class=\"clearfix\"></div>\n                            </li> \n                        </ul>\n                    </div>\n                    <div class=\"footer\"> </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <?php if (count($firms) < $planUnits['num_firms']) { ?>\n        <!-- Modal Add Company -->\n        <div class=\"modal fade\" id=\"modalAddCompany\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalAddCompany\">\n            <div class=\"modal-dialog\" role=\"document\">\n                <div class=\"modal-content\">\n                    <form class=\"site-form\" method=\"POST\" action=\"\">\n                        <input type=\"hidden\" name=\"addFirm\" value=\"\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                            <h4 class=\"modal-title\" id=\"myModalLabel\"><?= lang('add_new_company') ?></h4>\n                        </div>\n                        <div class=\"modal-body\">\n                            <div class=\"form-group\">\n                                <label><?= lang('firm_name') ?></label>\n                                <input type=\"text\" name=\"firm_name\" class=\"form-control field\" value=\"<?= trim($this->session->flashdata('firm_name')) ?>\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('firm_bulstat') ?></label>\n                                <input type=\"text\" name=\"firm_bulstat\" value=\"<?= trim($this->session->flashdata('firm_bulstat')) ?>\" class=\"form-control field\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('firm_reg_address') ?></label>\n                                <textarea name=\"firm_reg_address\" class=\"form-control field\"><?= trim($this->session->flashdata('firm_reg_address')) ?></textarea>\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('firm_city') ?></label>\n                                <input type=\"text\" name=\"firm_city\" value=\"<?= trim($this->session->flashdata('firm_city')) ?>\" class=\"form-control field\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label><?= lang('firm_mol') ?></label>\n                                <input type=\"text\" name=\"firm_mol\" value=\"<?= trim($this->session->flashdata('firm_mol')) ?>\" class=\"form-control field\">\n                            </div>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button>\n                            <button type=\"submit\" class=\"btn btn-primary\"><?= lang('add_new_company') ?></button>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n        <?php\n    }\n    if ($this->session->flashdata('addFirm') == '1') {\n        ?>\n        <script>\n            $(document).ready(function () {\n                $('#modalAddCompany').modal('show');\n            });\n        </script>\n        <?php\n    }\n} else {\n    ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/parts/footer.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?>\n<?php if (!empty($myFirms)) { ?>\n    </div>\n    </div>\n    </div> \n    </div>\n    <?php\n}\n?>\n<footer>\n    © CI Invoices.\n    Copyright 2018. All Rights Reserved.\n    <p>\n        Download available for WordPress - <a href=\"https://codecanyon.net/item/wp-invoices-pdf-electronic-invoicing-system/36891583\" target=\"_blank\">WP Invoices.</a>\n    </p>\n</footer>\n</div> \n</div> \n<?php\nif ($this->session->flashdata('resultAction')) {\n    geterror($this->session->flashdata('resultAction'));\n}\n?>\n<script src=\"<?= base_url('assets/bootstrap-select-1.12.2/dist/js/bootstrap-select.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/bootstrap-datepicker-1.6.4-dist/js/bootstrap-datepicker.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/plugins/placeholders.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/bootstrap/js/bootstrap.min.js') ?>\"></script>  \n<script src=\"<?= base_url('assets/plugins/bootbox.min.js') ?>\"></script>\n<script>\n    var urls = {\n        changeDefaultCurrency: \"<?= lang_url('user/defaultcurrency') ?>\",\n        addNewQuantityType: \"<?= lang_url('user/addnewquantitytype') ?>\",\n        addNewPaymentMethod: \"<?= lang_url('user/addnewpaymentmethod') ?>\",\n        modalSelector: \"<?= lang_url('user/modalselector') ?>\",\n        changeInvoiceStatus: \"<?= lang_url('user/changeinvoicestatus') ?>\",\n        topNavSearch: \"<?= lang_url('user/findresults') ?>\"\n    };\n</script>\n<script src=\"<?= base_url('assets/users/js/general.js') ?>\"></script>\n<script>\n    (function() {\n        var csrfName = '<?= $this->security->get_csrf_token_name() ?>';\n        var csrfHash = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content');\n\n        function injectCsrf() {\n            var forms = document.querySelectorAll('form[method=\"post\"], form[method=\"POST\"]');\n            for (var i = 0; i < forms.length; i++) {\n                if (!forms[i].querySelector('input[name=\"' + csrfName + '\"]')) {\n                    var input = document.createElement('input');\n                    input.type  = 'hidden';\n                    input.name  = csrfName;\n                    input.value = csrfHash;\n                    forms[i].appendChild(input);\n                }\n            }\n        }\n\n        // DOM is already ready here (footer script) — call directly\n        injectCsrf();\n\n        // Fallback for dynamically added forms submitted via submit event\n        document.addEventListener('submit', function(e) {\n            var form = e.target;\n            if (form.method && form.method.toLowerCase() === 'post' && !form.querySelector('input[name=\"' + csrfName + '\"]')) {\n                var input = document.createElement('input');\n                input.type  = 'hidden';\n                input.name  = csrfName;\n                input.value = csrfHash;\n                form.appendChild(input);\n            }\n        }, true);\n\n        // Patch jQuery $.ajax for AJAX POST requests\n        if (typeof $ !== 'undefined') {\n            $.ajaxSetup({\n                beforeSend: function(xhr, settings) {\n                    if (settings.type && settings.type.toUpperCase() === 'POST') {\n                        if (typeof settings.data === 'string') {\n                            settings.data += '&' + csrfName + '=' + csrfHash;\n                        } else if (settings.data instanceof FormData) {\n                            settings.data.append(csrfName, csrfHash);\n                        } else {\n                            settings.data = settings.data || {};\n                            settings.data[csrfName] = csrfHash;\n                        }\n                    }\n                }\n            });\n        }\n    })();\n</script>\n</body>\n</html>"
  },
  {
    "path": "application/modules/users/views/parts/header.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?>\n<!DOCTYPE html>\n<html lang=\"<?= MY_LANGUAGE_ABBR ?>\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <meta name=\"csrf-token\" content=\"<?= $this->security->get_csrf_hash() ?>\">\n        <title><?= $title ?></title>\n        <link href=\"https://fonts.googleapis.com/css?family=Open+Sans\" rel=\"stylesheet\"> \n        <link href=\"<?= base_url('assets/font-awesome/css/font-awesome.min.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/bootstrap/css/bootstrap.min.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/users/css/general.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/bootstrap-select-1.12.2/dist/css/bootstrap-select.min.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/bootstrap-datepicker-1.6.4-dist/css/bootstrap-datepicker.min.css') ?>\" rel=\"stylesheet\">\n        <script src=\"<?= base_url('assets/jquery/jquery.min.js') ?>\"></script>\n        <script src=\"<?= base_url('assets/jquery/jquery-ui-1.12.1.custom/jquery-ui.min.js') ?>\"></script> \n        <script src=\"<?= lang_url('loadlanguage/all.js') ?>\"></script>\n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body>\n        <div id=\"wrapper\">\n            <div id=\"content\">\n                <nav class=\"navbar navbar-user navbar-fixed-top\">\n                    <div class=\"container-fluid\"> \n                        <div class=\"navbar-header\">\n                            <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#myNavbar\">\n                                <span class=\"icon-bar\"></span>\n                                <span class=\"icon-bar\"></span>\n                                <span class=\"icon-bar\"></span>\n                            </button>\n                            <a class=\"navbar-brand visible-xs\" href=\"#\"><?= $firmInfo['name'] ?></a>\n                        </div>\n                        <div class=\"collapse navbar-collapse\" id=\"myNavbar\">\n                            <ul class=\"nav navbar-nav\">\n                                <li class=\"dropdown\">\n                                    <a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"#\"> \n                                        <?= lang('change_firm') ?>\n                                        <span class=\"sprite-caret\"></span>\n                                    </a>\n                                    <ul class=\"dropdown-menu\">\n                                        <?php if (empty($myFirms)) { ?>\n                                            <li><a href=\"#\"><i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i> <?= lang('dont_have_firms') ?></a></li> \n                                            <?php\n                                        } else {\n                                            foreach ($myFirms as $firm) {\n                                                if (in_array($firm['id'], $canUseFirms)) {\n                                                    ?>\n                                                    <li <?= SELECTED_COMPANY_ID == $firm['id'] ? 'class=\"active\"' : '' ?>><a href=\"<?= lang_url('user/usecompany/' . $firm['id']) ?>\"><?= SELECTED_COMPANY_ID == $firm['id'] ? '<i class=\"fa fa-check\" aria-hidden=\"true\"></i>' : '' ?> <?= $firm['name'] ?></a></li> \n                                                    <?php\n                                                }\n                                            }\n                                        }\n                                        ?>\n                                        <li class=\"divider hidden-xs\"></li>\n                                        <li><a href=\"<?= lang_url('user/managefirms') ?>\" class=\"manage-firms\"><?= lang('manage_firms') ?></a></li>\n                                    </ul>\n                                </li>\n                                <li><a class=\"settings\" href=\"<?= lang_url('user/settings') ?>\"><span class=\"sprite-cog\"></span> <?= lang('settings') ?></a></li>\n                            </ul> \n                            <form class=\"navbar-form navbar-left top-search-form\" role=\"search\">\n                                <div class=\"form-group\">\n                                    <input class=\"field\" type=\"text\" placeholder=\"<?= lang('search_header_u') ?>\">\n                                    <span class=\"sprite-search\"></span>\n                                    <i class=\"fa fa-spinner fa-pulse fa-2x fa-fw\"></i>\n                                    <div id=\"topSearchResults\"></div>\n                                </div>\n                            </form> \n                            <ul class=\"nav navbar-nav navbar-right\">\n                                <?php if (!defined('EMPLOYEE_ID')) { ?>\n                                    <li><a href=\"<?= lang_url('user/admin') ?>\"><?= lang('usr_admin_menu') ?></a></li>\n                                <?php } ?>\n                                <li><a href=\"<?= lang_url('user/plans') ?>\"><?= lang('plans') ?></a></li>\n                                <li><a class=\"logout\" href=\"<?= lang_url('user/logout') ?>\"><?= lang('logout') ?></a></li>\n                            </ul>\n                            <?php\n                            $cleanUriString = uri_string();\n                            if (mb_strlen($this->uri->segment(1)) == 2) {\n                                $cleanUriString = str_replace($this->uri->segment(1) . '/', '', uri_string());\n                            }\n                            ?>\n                            <ul class=\"nav navbar-nav navbar-right\">\n                                <li class=\"dropdown\">\n                                    <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\"><?= lang('language') ?><span class=\"sprite-caret\"></span></a>\n                                    <ul class=\"dropdown-menu\">\n                                        <li><a href=\"<?= base_url($cleanUriString) ?>\">English</a></li>\n                                        <li><a href=\"<?= base_url('bg/' . $cleanUriString) ?>\">Български</a></li>\n                                        <li><a href=\"<?= base_url('fr/' . $cleanUriString) ?>\">Français</a></li>\n                                    </ul>\n                                </li>    \n                            </ul>\n                        </div>\n                    </div>\n                </nav>\n                <?php if (!empty($myFirms)) { ?>\n                    <header>\n                        <div class=\"container-fluid\"> \n                            <div class=\"row\">\n                                <div class=\"col-sm-6 col-firm-info\"> \n                                    <h1>\n                                        <?php if (is_file('attachments/' . COMPANIES_IMAGES_DIR . '/' . $firmInfo['id'] . '/' . $firmInfo['image'])) { ?>\n                                            <img src=\"<?= base_url('attachments/' . COMPANIES_IMAGES_DIR . '/' . $firmInfo['id'] . '/' . $firmInfo['image']) ?>\" alt=\"<?= lang('no_image') ?>\">\n                                        <?php } ?>                                       \n                                        <?= $firmInfo['name'] ?>\n                                    </h1>\n                                </div>\n                                <div class=\"col-sm-6 col-stats\">\n                                    <div class=\"stats\">\n                                        <div class=\"stat\">\n                                            <span class=\"sprite-inv-docs icon\"></span> <span class=\"num\"><?= $planUnits['num_invoices'] ?></span> <?= lang('documents') ?>\n                                        </div>\n                                        <div class=\"stat\">\n                                            <span class=\"sprite-companies icon\"></span> <span class=\"num\"><?= $planUnits['num_firms'] >= count($myFirms) ? $planUnits['num_firms'] - count($myFirms) : 0 ?></span> <?= lang('companies') ?>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </header>\n                    <div class=\"container-fluid\">\n                        <div class=\"row\">\n                            <div class=\"col-sm-3 col-md-3 col-lg-2 left-col\">\n                                <div class=\"visible-xs text-center\">\n                                    <button data-toggle=\"collapse\" id=\"btn-show-main-menu\" class=\"btn btn-blue\" data-target=\"#main-menu\"><?= lang('show_main_menu') ?></button>\n                                </div>\n                                <div id=\"main-menu\" class=\"left-menu collapse\">\n                                    <ul>\n                                        <li>\n                                            <a href=\"<?= lang_url('user') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-home\"></span>\n                                                </div>\n                                                <?= lang('menu_home') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/new/invoice') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-new-inv\"></span>\n                                                </div>\n                                                <?= lang('menu_create_invoice') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/invoices') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-invoices\"></span>\n                                                </div>\n                                                <?= lang('menu_list_invoices') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/clients') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-clients\"></span>\n                                                </div>\n                                                <?= lang('menu_list_clients') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/items') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-items\"></span>\n                                                </div>\n                                                <?= lang('menu_list_items') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li> \n                                        <li>\n                                            <a href=\"<?= lang_url('user/store') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-storage\"></span>\n                                                </div>\n                                                <?= lang('menu_list_store') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/warranties') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-war-card\"></span>\n                                                </div>\n                                                <?= lang('menu_list_warranties') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/protocols') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-protocols\"></span>\n                                                </div>\n                                                <?= lang('menu_list_protocols') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/reports') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-reports\"></span>\n                                                </div>\n                                                <?= lang('menu_list_reports') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                        <li>\n                                            <a href=\"<?= lang_url('user/import-export') ?>\">\n                                                <div class=\"left-icon\">\n                                                    <span class=\"sprite-imp-exp\"></span>\n                                                </div>\n                                                <?= lang('menu_list_import_export') ?> \n                                                <div class=\"right-arrow\">\n                                                    <span class=\"sprite-arrow-right\"></span>\n                                                </div>\n                                            </a>\n                                        </li>\n                                    </ul>\n                                </div>\n                            </div>\n                            <div class=\"col-sm-9 col-md-9 col-lg-10 col-sm-offset-3 col-md-offset-3 col-lg-offset-2 col-right\">\n                                <div class=\"right-side\">\n                                <?php } else { ?> \n                                    <div class=\"container-fluid\">\n                                        <div class=\"row\">\n                                            <div class=\"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3\">\n                                                <form class=\"form-verifing site-form\" method=\"POST\" action=\"\">\n                                                    <h2>\n                                                        <img src=\"<?= base_url('assets/users/imgs/notok.png') ?>\" alt=\"Verified\">\n                                                        <?= lang('no_firm_data') ?>\n                                                    </h2>\n                                                    <div class=\"form-group\">\n                                                        <label><?= lang('firm_name') ?></label>\n                                                        <input type=\"text\" name=\"firm_name\" class=\"form-control field\" value=\"<?= trim($this->session->flashdata('firm_name')) ?>\">\n                                                    </div>\n                                                    <div class=\"form-group\">\n                                                        <label><?= lang('firm_bulstat') ?></label>\n                                                        <input type=\"text\" name=\"firm_bulstat\" value=\"<?= trim($this->session->flashdata('firm_bulstat')) ?>\" class=\"form-control field\">\n                                                    </div>\n                                                    <div class=\"form-group\">\n                                                        <label><?= lang('firm_reg_address') ?></label>\n                                                        <textarea name=\"firm_reg_address\" class=\"form-control field\"><?= trim($this->session->flashdata('firm_reg_address')) ?></textarea>\n                                                    </div>\n                                                    <div class=\"form-group\">\n                                                        <label><?= lang('firm_city') ?></label>\n                                                        <input type=\"text\" name=\"firm_city\" value=\"<?= trim($this->session->flashdata('firm_city')) ?>\" class=\"form-control field\">\n                                                    </div>\n                                                    <div class=\"form-group\">\n                                                        <label><?= lang('firm_mol') ?></label>\n                                                        <input type=\"text\" name=\"firm_mol\" value=\"<?= trim($this->session->flashdata('firm_mol')) ?>\" class=\"form-control field\">\n                                                    </div>\n                                                    <button type=\"submit\" class=\"btn btn-default\"><?= lang('save_firm_details') ?></button>\n                                                </form>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <?php\n                                }\n                                ?>\n\n"
  },
  {
    "path": "application/modules/users/views/plans/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('plans') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('plans') ?></li>\n        </ol>\n    </div> \n</div>\n<?php\nif ($this->permissions->hasPerm('perm_view_plans_page')) {\n    if (!empty($myCurrentPlans)) {\n        ?>\n        <div class=\"my-active-plans\">\n            <h2><?= lang('my_active_plans') ?></h2>\n            <?php foreach ($myCurrentPlans as $activePlan) { ?>\n                <div class=\"active-plan\">\n                    <?= lang('plan_type') ?>:  <b><?= lang('plan_' . strtolower($activePlan['plan_type'])) ?></b>\n                    <?= lang('started_from') ?> <b><?= date('d.m.Y', $activePlan['from_date']) ?></b>\n                    <?= lang('active_to') ?> <b><?= date('d.m.Y', $activePlan['to_date']) ?></b>\n                    <?= lang('left_inv_from_plan') ?> <b><?= $activePlan['num_invoices'] ?></b>\n                    <?= lang('num_companies_plan') ?> <b><?= $activePlan['num_firms'] ?></b>\n                </div>\n            <?php } ?>\n        </div>\n    <?php } ?>\n    <div class=\"plans row\">\n        <div class=\"col-xs-12 col-md-4 col-lg-3\">\n            <div class=\"panel panel-info\">\n                <div class=\"panel-heading\">\n                    <h3 class=\"panel-title\"><?= lang('plan_pro') ?></h3>\n                </div>\n                <div class=\"panel-body\">\n                    <div class=\"the-price\">\n                        <h1>\n                            <?= $plans['PRO']['PRICE'] . CURRENCY ?><span class=\"subscript\">/<?= lang('plans_year') ?></span>\n                        </h1>\n                    </div>\n                    <table class=\"table\">\n                        <tr>\n                            <td>\n                                <?= $plans['PRO']['NUM_INVOICES'] ?> <?= lang('plans_num_inv') ?>/<?= lang('plans_month') ?>\n                            </td>\n                        </tr>\n                        <tr class=\"active\">\n                            <td>\n                                <?= $plans['PRO']['NUM_FIRMS'] ?> <?= lang('plans_num_firms') ?>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n                <div class=\"panel-footer\">\n                    <a href=\"<?= lang_url('user/plan/pro') ?>\" class=\"btn btn-success\" role=\"button\"><?= lang('plans_choose') ?></a> <?= lang('plans_one_m_bonus') ?></div>\n            </div>\n        </div>\n        <div class=\"col-xs-12 col-md-4 col-lg-3\">\n            <div class=\"panel panel-info\">\n                <div class=\"panel-heading\">\n                    <h3 class=\"panel-title\"><?= lang('plan_custom') ?></h3>\n                </div>\n                <div class=\"panel-body\">\n                    <div class=\"the-price\">\n                        <h1><?= $individualPlan == null ? '?' : $individualPlan['price'] . CURRENCY ?><span class=\"subscript\">/<?= lang('plans_year') ?></span></h1>\n                    </div>\n                    <table class=\"table\">\n                        <tr>\n                            <td>\n                                <?= $individualPlan == null ? '?' : $individualPlan['num_invoices'] ?> <?= lang('plans_num_inv') ?>/<?= lang('plans_month') ?>\n                            </td>\n                        </tr>\n                        <tr class=\"active\">\n                            <td>\n                                <?= $individualPlan == null ? '?' : $individualPlan['num_firms'] ?>  <?= lang('plans_num_firms') ?>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n                <div class=\"panel-footer\">\n                    <?php if ($individualPlan != null) { ?>\n                        <a href=\"<?= lang_url('user/plan/custom') ?>\" class=\"btn btn-success\" role=\"button\"><?= lang('plans_choose') ?></a>\n                    <?php } ?>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalCustomPlanReq\" class=\"btn <?= $individualPlan != null ? 'btn-xs' : '' ?> btn-success\" role=\"button\"><?= $individualPlan != null ? lang('plans_make_new_request') : lang('plans_make_request') ?></a></div>\n            </div>\n        </div>\n    </div>\n    <!-- Modal Custom Plan Email Send Request -->\n    <div class=\"modal fade\" id=\"modalCustomPlanReq\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\" id=\"myModalLabel\"><?= lang('plan_send_us_req') ?></h4>\n                </div>\n                <div class=\"modal-body\">\n                    <form class=\"site-form\" action=\"\" method=\"POST\" id=\"formMakePlanReq\">\n                        <div class=\"form-group\">\n                            <label><?= lang('plan_req_inv_per_mon') ?></label>\n                            <input type=\"text\" name=\"inv_per_month\" class=\"form-control field\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('plan_req_companies') ?></label>\n                            <input type=\"text\" name=\"want_companies\" class=\"form-control field\">\n                        </div>\n                    </form>\n                    <div class=\"alert alert-info\"><?= lang('when_we_see_plan_req') ?></div>\n                    <?php\n                    if ($requestForIndividualPlan != null) {\n                        $alreadyHave = str_replace(\"%num_inv%\", $requestForIndividualPlan['invoices'], lang('already_have_req'));\n                        $alreadyHave = str_replace(\"%companies%\", $requestForIndividualPlan['companies'], $alreadyHave);\n                        ?>\n                        <div class=\"alert alert-danger\"><?= $alreadyHave ?></div>\n                    <?php } ?>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button>\n                    <button type=\"button\" class=\"btn btn-primary\" onclick=\"makePlanRequest()\"><?= lang('send_plan_req') ?></button>\n                </div>\n            </div>\n        </div>\n    </div>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/plans/period.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('plans_period') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/plans') ?>\"><?= lang('plans') ?></a></li>\n            <li class=\"active\"><?= lang('plan_period') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_view_plans_page')) { ?>\n    <div class=\"row\">\n        <div class=\"col-sm-6 col-sm-offset-3 col-md-6 col-md-offset-3\">\n            <form method=\"POST\" action=\"\">\n                <input type=\"hidden\" name=\"type\" value=\"<?= strtoupper($planType) ?>\">\n                <div class=\"plan-container\">\n                    <div class=\"plan-header\">\n                        <div class=\"icon-box\"><i class=\"fa fa-users icon\"></i></div>\n                        <h2><?= lang('plan_' . $planType) ?></h2>\n                        <p><?= $plans[strtoupper($planType)]['PRICE'] . CURRENCY ?>/<?= lang('plans_year') ?></p>\n                    </div>\n                    <div class=\"plan-details\">\n                        <ul>\n                            <li class=\"option-li\">\n                                <?= lang('plan_period') ?>\n                                <select class=\"selectpicker\" name=\"period\"> \n                                    <option value=\"12\" selected=\"\">1 <?= lang('plan_period_year') ?></option>\n                                    <option value=\"24\">2 <?= lang('plan_period_years') ?></option>\n                                    <option value=\"36\">3 <?= lang('plan_period_years') ?></option>\n                                    <option value=\"48\">4 <?= lang('plan_period_years') ?></option>\n                                </select>\n                            </li>\n                            <li class=\"option-li hidden\">\n                                <?= lang('plan_payment_type') ?> \n                                <select class=\"selectpicker\" name=\"payment_type\"> \n                                    <option value=\"bank\" selected=\"\"><?= lang('plan_payment_bank') ?></option>\n                                    <?php /*\n                                      <option value=\"easypay\"><?= lang('plan_payment_easypay') ?></option>\n                                      <option value=\"sms\"><?= lang('plan_payment_sms') ?></option>\n                                     */\n                                    ?>\n                                    <option value=\"paypal\"><?= lang('plan_payment_paypal') ?></option>\n                                </select>\n                            </li>\n                        </ul>\n                        <button type=\"submit\" class=\"button-confirm\">\n                            <?= lang('confirm_plan_requiest') ?> \n                            <i class=\"fa fa-arrow-right\"></i>\n                        </button>\n                    </div>\n                </div>\n            </form>\n        </div>\n    </div>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/plans/request.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('my_plan_request') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>\n            <li class=\"active\"><?= lang('my_plan_request') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_view_plans_page')) { ?>\n    <div class=\"plan-req-page\">\n        <h1><?= lang('payment_awaiting') ?></h1>\n        <hr>\n        <div class=\"payment-request\">\n            <div><b><?= lang('plan_payment_type') ?>:</b> <?= $paymentReq['payment_type'] == 'bank' ? lang('plan_payment_bank') : lang('plan_payment_paypal') ?></div>\n            <div>\n                <b><?= lang('plan_type') ?>:</b> <?= lang('plan_' . strtolower($paymentReq['plan_type'])) ?>(<?= $plans[$paymentReq['plan_type']]['NUM_INVOICES'] . ' ' . lang('plans_num_inv') . ', ' . $plans[$paymentReq['plan_type']]['NUM_FIRMS'] . ' ' . lang('plans_num_firms') ?>)\n            </div>\n            <div><b><?= lang('plan_period') ?>:</b> <?= $paymentReq['plan_period'] . ' ' . lang('plan_period_months') ?> (<?= $plans[$paymentReq['plan_type']]['PRICE'] . ' ' . CURRENCY ?> <?= lang('per_12_months') ?> )</div>\n            <div><b><?= lang('plan_date_generated') ?>:</b> <?= date('d.m.Y', $paymentReq['date_generated']) ?></div>\n            <div><b><?= lang('plan_req_num') ?>:</b> <?= $paymentReq['req_num'] ?></div>\n            <div><a href=\"<?= lang_url('user/myplan/request?payment=cancel') ?>\" class=\"btn btn-default confirm\" data-my-message=\"<?= lang('confirm_cancel_req') ?>\"><?= lang('cancel_pay_req') ?></a></div>\n        </div>\n\t\t<hr>\n        <div class=\"payment-details\">\n\t\t<div class=\"text-center pay-type-imgs\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/paypal-payment.png') ?>\" alt=\"pminvoice.com paypal payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/discover-card.png') ?>\" alt=\"pminvoice.com payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/amex-card.png') ?>\" alt=\"pminvoice.com payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/visa-debit-card-logo.png') ?>\" alt=\"pminvoice.com payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/master-card-icon-4.jpg') ?>\" alt=\"pminvoice.com payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/payment_method_card_visa-512.png') ?>\" alt=\"pminvoice.com payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/icon_cc-logo_jcb.png') ?>\" alt=\"pminvoice.com payment\">\n\t\t\t<img src=\"<?= base_url('assets/public/imgs/icon_cc-logo_dinersclub.png') ?>\" alt=\"pminvoice.com payment\">\n\t\t</div> \n        </div>\n        <div class=\"alert alert-info\">\n            <strong><?= lang('info_box') ?></strong> <?= lang('plan_will_started') ?>\n        </div>\n    </div>\n    <?php\n} else {\n    ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/protocols/addprotocol.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('add_protocol') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/protocols') ?>\"><?= lang('protocols') ?></a></li>  \n            <li class=\"active\"><?= lang('add_protocol') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_add_protocol')) { ?>\n    <form action=\"\" id=\"setProtocol\" class=\"site-form\" method=\"POST\"> \n        <?php if ($editId > 0) { ?>\n            <input type=\"hidden\" name=\"editId\" value=\"<?= $editId ?>\">\n            <input type=\"hidden\" name=\"onLoadItems\" value=\"<?= implode(',', $currentItems) ?>\">\n        <?php } ?> \n        <div class=\"row\">\n            <div class=\"col-sm-6\">  \n                <div class=\"choose-translation\">\n                    <p><?= lang('explain_protocol_translation') ?></p>\n                    <select class=\"selectpicker\" name=\"protocol_translation\" title=\"<?= lang('choose_war_translation') ?>\">\n\t\t\t\t\t    <option value=\"3\" selected=\"\"><?= lang('default_inv_lang_fr') ?></option>\n                        <option value=\"1\"><?= lang('default_inv_lang_en') ?></option>\n                        <option value=\"2\"><?= lang('default_inv_lang_bg') ?></option>\n                        <?php\n                        if (!empty($protocolsLanguages)) {\n                            foreach ($protocolsLanguages as $protocolsLanguage) {\n                                ?>\n                                <option value=\"<?= $protocolsLanguage['id'] ?>\"><?= $protocolsLanguage['language_name'] ?>(<?= $protocolsLanguage['id'] ?>)</option>\n                                <?php\n                            }\n                        }\n                        ?> \n                    </select>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalAddNewTranslation\" class=\"btn btn-default\">\n                        <?= lang('add_protocol_translation') ?>\n                    </a>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalExplainTranslation\">\n                        <i class=\"fa fa-question-circle\" aria-hidden=\"true\"></i>\n                    </a>\n                </div>\n            </div> \n            <div class=\"col-sm-6\">\n                <div class=\"pull-right\">  \n                    <div class=\"choose-firm-translation\">\n                        <p><?= lang('explain_firm_translation') ?></p>\n                        <select class=\"selectpicker\" name=\"protocol_firm_translation\"> \n                            <?php\n                            foreach ($allForFirm['translations'] as $theFirm) {\n                                ?>\n                                <option value=\"<?= $theFirm['id'] ?>\" <?= $theFirm['is_default'] == 1 ? 'selected=\"selected\"' : '' ?>><?= $theFirm['trans_name'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                    </div>\n                </div>\n            </div>\n        </div>  \n        <div class=\"create-document\">\n            <div class=\"type\">\n                <label><?= lang('create_protocol_type') ?></label> \n                <div class=\"special-radio\">\n                    <label class=\"control control--radio\"><?= lang('create_protocol_acceptable') ?>\n                        <input type=\"radio\" value=\"acceptable\" name=\"type\" <?= isset($_POST['type']) && $_POST['type'] == 'acceptable' ? 'checked=\"checked\"' : '' ?>/>\n                        <div class=\"control__indicator\"></div>\n                    </label>\n                    <label class=\"control control--radio\"><?= lang('create_protocol_transmitter') ?>\n                        <input type=\"radio\" value=\"transmitter\" name=\"type\" <?= (isset($_POST['type']) && $_POST['type'] == 'transmitter') || !isset($_POST['type']) ? 'checked=\"checked\"' : '' ?>/>\n                        <div class=\"control__indicator\"></div>\n                    </label>\n                </div>\n            </div>\n            <div class=\"inner\">\n                <div class=\"row head-content\">\n                    <div class=\"col-sm-6 col-md-5\"> \n                        <div class=\"column-data client\">\n                            <label><?= lang('create_inv_client') ?></label> \n                            <input type=\"text\" name=\"client_name\" value=\"<?= isset($_POST['client']['client_name']) ? $_POST['client']['client_name'] : '' ?>\" class=\"form-control field\">\n                            <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                <span><?= lang('create_inv_choose') ?></span>\n                            </a> \n                            <div>\n                                <div class=\"checkbox\">\n                                    <label><input type=\"checkbox\" name=\"is_to_person\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'checked=\"checked\"' : '' ?> id=\"individual-client\" value=\"\"><?= lang('create_inv_individual') ?></label>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"column-data client client-company\"  <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>> \n                            <label><?= lang('create_inv_bulstat') ?></label> \n                            <input type=\"text\" name=\"client_bulstat\" value=\"<?= isset($_POST['client']['client_bulstat']) ? $_POST['client']['client_bulstat'] : '' ?>\" class=\"form-control field\">\n                            <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                <span><?= lang('create_inv_choose') ?></span>\n                            </a>\n                            <div>\n                                <div class=\"checkbox\">\n                                    <label><input type=\"checkbox\" <?= isset($_POST['client']['client_vat_registered']) && $_POST['client']['client_vat_registered'] == 1 ? 'checked=\"checked\"' : '' ?> name=\"client_vat_registered\" id=\"client-vat-registered\" value=\"\"><?= lang('create_inv_client_vat_registered') ?></label>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"column-data client-company client-vat-registered\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?> <?= isset($_POST['client_vat_registered']) && $_POST['client_vat_registered'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                            <label><?= lang('create_inv_vat_number') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['vat_number']) ? $_POST['client']['vat_number'] : '' ?>\" name=\"vat_number\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data client-company\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                            <label><?= lang('create_inv_mol') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['accountable_person']) ? $_POST['client']['accountable_person'] : '' ?>\" name=\"accountable_person\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data client-individial\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                            <label><?= lang('create_inv_ident_num') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_ident_num']) ? $_POST['client']['client_ident_num'] : '' ?>\" name=\"client_ident_num\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data\">\n                            <label><?= lang('create_inv_city') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_city']) ? $_POST['client']['client_city'] : '' ?>\" name=\"client_city\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data\">\n                            <label><?= lang('create_inv_address') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_address']) ? $_POST['client']['client_address'] : '' ?>\" name=\"client_address\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data\">\n                            <label><?= lang('create_inv_country') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_country']) ? $_POST['client']['client_country'] : '' ?>\" name=\"client_country\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data client-company\" <?= isset($_POST['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                            <label><?= lang('create_inv_recipient') ?></label> \n                            <input type=\"text\" value=\"<?= isset($_POST['client']['recipient_name']) ? $_POST['client']['recipient_name'] : '' ?>\" name=\"recipient_name\" class=\"form-control field\"> \n                        </div>\n                    </div>\n                    <div class=\"col-sm-6 col-md-7\">\n                        <div class=\"invoice-setting\">\n                            <div class=\"column-data\">\n                                <span class=\"inv-type-num\"><?= lang('protocol_number') ?></span> <label>№:</label>\n                                <input type=\"text\" name=\"protocol_number\" value=\"<?= isset($_POST['protocol_number']) ? $_POST['protocol_number'] : $nextProtocolNumber ?>\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_protocol_from_date') ?></label>\n                                <input type=\"text\" name=\"from_date\" placeholder=\"dd.mm.yyyy\" value=\"<?= isset($_POST['from_date']) ? date('d.m.Y', $_POST['from_date']) : date('d.m.Y', time()) ?>\" class=\"form-control field datepicker\">\n                            </div> \n                            <div class=\"column-data\">\n                                <label><?= lang('create_warranty_to_inv') ?></label>\n                                <input type=\"text\" name=\"to_invoice\" placeholder=\"<?= lang('curr_name_for_int_use') ?>\" value=\"<?= isset($_POST['to_invoice']) ? $_POST['to_invoice'] : '' ?>\" class=\"form-control field\">\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('provider_transmit') ?></label>\n                    <textarea class=\"form-control\" name=\"provider_transmit\" rows=\"5\"><?= isset($_POST['provider_transmit']) ? $_POST['provider_transmit'] : '' ?></textarea>\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('select_saved_provider_trans') ?></labe>\n                        <select class=\"selectpicker saved-prov-trans\"> \n                            <option value=\"\" selected=\"\"></option>\n                            <?php\n                            foreach ($prov_transmits as $prov_transmit) {\n                                ?>\n                                <option value=\"<?= $prov_transmit['id'] ?>\"><?= $prov_transmit['title'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                        <?php\n                        foreach ($prov_transmits as $prov_transmit) {\n                            ?>\n                            <div class=\"hidden\" data-saved-prov-trans=\"<?= $prov_transmit['id'] ?>\">\n                                <?= $prov_transmit['description'] ?>\n                            </div>\n                            <?php\n                        }\n                        ?> \n                </div>\n                <div class=\"select-currency\">\n                    <?= lang('select_curreny') ?> \n                    <select class=\"selectpicker\" id=\"selectCurrencyNewInv\" name=\"currency\" title=\"<?= lang('no_currency_selected') ?>\" data-live-search=\"true\">\n                        <?php\n                        $choosedCur = false;\n                        foreach ($currencies as $currency) {\n                            if ($theCurrency == $currency['value']) {\n                                $selectedCurrency = 'selected';\n                                $choosedCur = true;\n                            } else {\n                                $selectedCurrency = '';\n                            }\n                            ?>\n                            <option value=\"<?= $currency['value'] ?>\" <?= $selectedCurrency ?>><?= $currency['name'] ?></option>\n                        <?php } if ($selectedCurrency == '' && $choosedCur == false) { ?>\n                            <option value=\"<?= $theCurrency ?>\" selected=\"\"><?= $theCurrency ?></option> \n                        <?php } ?>\n                    </select>\n                </div>\n                <div class=\"table-responsive\">\n                    <table class=\"table table-items\">\n                        <thead>\n                            <tr>\n                                <th></th>\n                                <th><?= lang('create_inv_item') ?></th>\n                                <th><?= lang('create_inv_quantity') ?></th>\n                                <th><?= lang('create_inv_price') ?></th>\n                                <th class=\"text-right\"><?= lang('create_inv_total') ?></th>\n                            </tr>\n                        </thead>\n                        <tbody class=\"body-items\">\n                            <?php\n                            $thisDir = ltrim(str_replace(getcwd(), '', dirname(__FILE__)), '/');\n                            if (isset($_POST['items'])) {\n                                foreach ($_POST['items'] as $itemPost) {\n                                    include $thisDir . '/itemTableTr.php';\n                                }\n                            } else {\n                                include $thisDir . '/itemTableTr.php';\n                            }\n                            ?>\n                        </tbody>\n                    </table>\n                </div>\n                <div class=\"items-features\">\n                    <a href=\"javascript:void(0);\" class=\"add-new-item\">\n                        <i class=\"fa fa-plus\"></i>\n                        <?= lang('add_new_item_to_table') ?>\n                    </a>\n                </div> \n                <div class=\"row amounts\">\n                    <div class=\"col-sm-12 col-md-6 col-md-offset-6\">\n                        <div class=\"row amount-row\">\n                            <div class=\"col-sm-6\">\n                                <?= lang('create_protocol_amount') ?>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"amount\">\n                                    <span id=\"items-total\"><?= isset($_POST['amount']) ? $_POST['amount'] : '0.00' ?></span> \n                                    <input type=\"hidden\" value=\"<?= isset($_POST['amount']) ? $_POST['amount'] : '0.00' ?>\" name=\"amount\" class=\"items-total field\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                            </div>\n                        </div>\n                        <div class=\"row amount-row hidden\">\n                            <div class=\"col-sm-6\">\n                                <div class=\"discount-txt\">\n                                    <?= lang('create_inv_discount') ?>\n                                </div>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"discount\">\n                                    <input type=\"text\" value=\"<?= isset($_POST['discount']) ? $_POST['discount'] : '0.00' ?>\" name=\"discount\" class=\"form-control field text-discount\">\n                                    <div class=\"select-discount\">\n                                        <select class=\"selectpicker form-control\" name=\"discount_type\" id=\"discount-value\"> \n                                            <option class=\"currency-text\" <?= isset($_POST['discount_type']) && $_POST['discount_type'] != '%' ? 'selected=\"selected\"' : '' ?>><?= $theCurrency ?></option>\n                                            <option <?= isset($_POST['discount_type']) && $_POST['discount_type'] == '%' ? 'selected=\"selected\"' : '' ?>>%</option>\n                                        </select>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"row amount-row hidden\">\n                            <div class=\"col-sm-6\">\n                                <?= lang('create_inv_tax_base') ?>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"amount\">\n                                    <span id=\"tax-base\"><?= isset($_POST['tax_base']) ? $_POST['tax_base'] : '0.00' ?></span>\n                                    <input type=\"hidden\" value=\"<?= isset($_POST['tax_base']) ? $_POST['tax_base'] : '0.00' ?>\" name=\"tax_base\" class=\"tax-base field\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                            </div>\n                        </div>\n                        <div class=\"row amount-row\">\n                            <div class=\"col-sm-6\">\n                                <div class=\"no-vat-container\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                    <?= lang('create_inv_vat') ?>\n                                    <input type=\"text\" class=\"form-control field vat-field\" name=\"vat_percent\" value=\"<?= isset($_POST['vat_percent']) ? $_POST['vat_percent'] : '20' ?>\">\n                                    %\n                                </div> \n                            </div>\n                            <div class=\"col-sm-6\"> \n                                <div class=\"amount the-vat\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                    <span id=\"vat-sum\"><?= isset($_POST['vat_sum']) ? $_POST['vat_sum'] : '0.00' ?></span> \n                                    <input type=\"hidden\" name=\"vat_sum\" value=\"<?= isset($_POST['vat_sum']) ? $_POST['vat_sum'] : '0.00' ?>\" class=\"vat-sum field\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                                <div class=\"no-vat-field\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                                    <label><?= lang('create_inv_reason_no_vat') ?></label> \n                                    <input type=\"text\" class=\"form-control field\" name=\"no_vat_reason\" value=\"<?= isset($_POST['no_vat_reason']) ? $_POST['no_vat_reason'] : '' ?>\">\n                                    <?php if (!empty($myNoVatReasons)) { ?>\n                                        <select class=\"selectpicker\" id=\"select-vat-from-list\" title=\"<?= lang('no_vat_reason_selected') ?>\" data-live-search=\"true\">\n                                            <?php\n                                            foreach ($myNoVatReasons as $vatReason) {\n                                                ?>\n                                                <option value=\"<?= $vatReason['reason'] ?>\"><?= $vatReason['reason'] ?></option>\n                                            <?php } ?>\n                                        </select>\n                                    <?php } ?>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"row amount-row total-row\">\n                            <div class=\"col-sm-6\">\n                                <span class=\"total\"><?= lang('create_inv_total') ?></span> \n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"amount total\">\n                                    <span id=\"final-total\"><?= isset($_POST['final_total']) ? $_POST['final_total'] : '0.00' ?></span>\n                                    <input type=\"hidden\" name=\"final_total\" class=\"final-total field\" value=\"<?= isset($_POST['final_total']) ? $_POST['final_total'] : '0.00' ?>\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('protocol_contracts') ?></label>\n                    <textarea class=\"form-control\" name=\"contract\" rows=\"5\"><?= isset($_POST['contract']) ? $_POST['contract'] : '' ?></textarea>\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('select_saved_contracts') ?></labe>\n                        <select class=\"selectpicker saved-contract\"> \n                            <option value=\"\" selected=\"\"></option>\n                            <?php\n                            foreach ($contracts as $contract) {\n                                ?>\n                                <option value=\"<?= $contract['id'] ?>\"><?= $contract['title'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                        <?php\n                        foreach ($contracts as $contract) {\n                            ?>\n                            <div class=\"hidden\" data-saved-contract=\"<?= $contract['id'] ?>\">\n                                <?= $contract['contract'] ?>\n                            </div>\n                            <?php\n                        }\n                        ?> \n                </div>\n                <div class=\"remarks\">\n                    <label><?= lang('create_inv_remarks') ?><sup><?= lang('visibile_for_client') ?></sup></label>\n                    <textarea class=\"form-control field area\" name=\"remarks\"><?= isset($_POST['remarks']) ? $_POST['remarks'] : '' ?></textarea>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-sm-5\">\n                        <div class=\"form-group\">\n                            <label><?= lang('warranty_received') ?></label>\n                            <input type=\"text\" class=\"form-control field\" name=\"received\" value=\"<?= isset($_POST['received']) ? $_POST['received'] : '' ?>\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('warranty_compiled') ?></label>\n                            <input type=\"text\" class=\"form-control field\" name=\"compiled\" value=\"<?= isset($_POST['compiled']) ? $_POST['compiled'] : '' ?>\">\n                        </div>\n                    </div>\n                </div>\n            </div> \n            <a href=\"javascript:void(0);\" onclick=\"createNewProtocolValidate()\" class=\"btn btn-green\"><?= lang('create_protocol') ?></a>\n            <?= lang('or') ?>\n            <a href=\"<?= lang_url('user/protocols') ?>\"><?= lang('open_protocols') ?></a>\n        </div>\n    </form>\n    <?php\n    include 'application/modules/users/views/invoices/modals/add_quantity_type.php';\n    include 'application/modules/users/views/invoices/modals/add_payment_method.php';\n    include 'application/modules/users/views/invoices/modals/selector.php';\n    ?>\n    <!-- Modal Explain Add Translations -->\n    <div class=\"modal fade\" id=\"modalExplainTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalExplainTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\"><?= lang('what_mean_new_translate') ?></h4>\n                </div>\n                <div class=\"modal-body\">\n                    <?= lang('what_mean_new_translate_explain') ?>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- Modal Create New Translation -->\n    <div class=\"modal fade\" id=\"modalAddNewTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalAddNewTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\"><?= lang('add_new_translation') ?></h4>\n                </div>\n                <div class=\"modal-body site-form\">\n                    <form method=\"POST\" action=\"\" id=\"formAddNewTranslate\">\n                        <input type=\"hidden\" name=\"addNewProtocolTranslation\" value=\"1\">\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_language_name') ?></label>\n                            <input type=\"text\" name=\"language_name\" placeholder=\"<?= lang('lang_name_internal_use') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_protocol_number') ?></label>\n                            <input type=\"text\" name=\"protocol_number\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_from_date') ?></label>\n                            <input type=\"text\" name=\"from_date\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_recipient') ?></label>\n                            <input type=\"text\" name=\"recipient\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_supplier') ?></label>\n                            <input type=\"text\" name=\"supplier\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_name') ?></label>\n                            <input type=\"text\" name=\"product_name\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_quantity') ?></label>\n                            <input type=\"text\" name=\"product_quantity\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_quantity_type') ?></label>\n                            <input type=\"text\" name=\"product_quantity_type\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_single_price') ?></label>\n                            <input type=\"text\" name=\"product_single_price\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_final_price') ?></label>\n                            <input type=\"text\" name=\"product_final_price\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_amount') ?></label>\n                            <input type=\"text\" name=\"amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat') ?></label>\n                            <input type=\"text\" name=\"vat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat_amount') ?></label>\n                            <input type=\"text\" name=\"vat_amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_final_amount') ?></label>\n                            <input type=\"text\" name=\"final_amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_received') ?></label>\n                            <input type=\"text\" name=\"received\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_compiled') ?></label>\n                            <input type=\"text\" name=\"compiled\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_signature') ?></label>\n                            <input type=\"text\" name=\"signature\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_page') ?></label>\n                            <input type=\"text\" name=\"page\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_to_invoice') ?></label>\n                            <input type=\"text\" name=\"to_invoice\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_city') ?></label>\n                            <input type=\"text\" name=\"city\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_address') ?></label>\n                            <input type=\"text\" name=\"address\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_bulstat') ?></label>\n                            <input type=\"text\" name=\"bulstat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_transmission_protocol') ?></label>\n                            <input type=\"text\" name=\"transmission_protocol\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat_number') ?></label>\n                            <input type=\"text\" name=\"vat_number\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                    </form>\n                </div>\n                <div class=\"modal-footer\">\n                    <a href=\"javascript:void(0);\" class=\"btn btn-default\" onclick=\"saveNewTranslation()\"><?= lang('save_new_translate') ?></a>\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                </div>\n            </div>\n        </div>\n    </div>\n    <?php if ($opt_protocolCalculator == 0) { ?>\n        <style>\n            span.item-total, #items-total, #tax-base, #vat-sum, #final-total {display: none;}\n        </style>\n        <script>\n            $('input.item-total, [name=\"amount\"], [name=\"tax_base\"], [name=\"vat_sum\"], [name=\"final_total\"]').attr('type', 'text');\n        </script>\n        <?php\n    }\n    /*\n     * if edit invoice and have more from one items\n     * show action buttons\n     */\n    if (isset($_POST['items']) && count($_POST['items']) > 1) {\n        ?>\n        <style>\n            .create-document .actions {display: block;}\n        </style>\n    <?php }\n    ?>\n    <script>\n        var createDocument = {\n            rountTo: <?= $opt_protocolRoundTo ?>,\n            calculatorStatus: <?= $opt_protocolCalculator ?>\n        };\n    </script>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/protocols/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('protocols') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('protocols') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <div class=\"left-nav-side\">\n        <a href=\"<?= lang_url('user/protocols/add-protocol') ?>\" class=\"btn btn-blue\"><?= lang('add_protocol') ?></a>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"delete\"><?= lang('delete_protocols') ?></a>\n        <button data-toggle=\"collapse\" class=\"btn btn-blue\" data-target=\"#protocols-search\"><?= lang('search') ?></button>\n    </div>\n    <div class=\"right-nav-side\">\n        <a href=\"<?= lang_url('user/settings/protocols') ?>\" class=\"btn btn-blue\"><?= lang('protocols_settings') ?></a>\n    </div>\n    <div class=\"clearfix\"></div>\n</div> \n<?php if ($this->permissions->hasPerm('perm_view_protocols_page')) { ?>\n    <div id=\"protocols-search\" class=\"collapse <?= isset($_GET['client_name']) ? 'in' : '' ?> lists-search-form\">    \n        <form method=\"GET\" action=\"\" class=\"site-form\"> \n            <div class=\"row\">\n                <div class=\"col-sm-4\"> \n                    <div class=\"form-group\">\n                        <label><?= lang('search_store_client') ?></label>\n                        <input type=\"text\" name=\"client_name\" value=\"<?= isset($_GET['client_name']) ? $_GET['client_name'] : '' ?>\" class=\"form-control field\">\n                    </div>\n                    <div class=\"form-group\">\n                        <label><?= lang('search_date_from') ?></label>\n                        <input type=\"text\" name=\"create_from\" value=\"<?= isset($_GET['create_from']) ? $_GET['create_from'] : '' ?>\" class=\"form-control field datepicker\">\n                        <label><?= lang('search_to') ?></label>\n                        <input type=\"text\" name=\"create_to\" value=\"<?= isset($_GET['create_to']) ? $_GET['create_to'] : '' ?>\" class=\"form-control field datepicker\">\n                    </div> \n                </div>\n            </div>\n            <input type=\"submit\" class=\"btn btn-green\" value=\"search\"> \n            <a href=\"<?= lang_url('user/protocols') ?>\"><?= lang('clear_search') ?></a>\n        </form>\n    </div>\n    <?php if (!empty($protocols)) { ?>\n        <form method=\"POST\" action=\"\" id=\"action-form\">\n            <input type=\"hidden\" name=\"action\" value=\"\">\n            <div class=\"table-responsive\">\n                <table class=\"table table-list table-striped\">\n                    <thead>\n                        <tr>\n                            <th><input type=\"checkbox\" class=\"check-all-boxes\"></th> \n                            <th><?= lang('protocol_number') ?></th> \n                            <th><?= lang('protocol_to_inv') ?></th> \n                            <th><?= lang('protocol_from_date') ?></th> \n                            <th><?= lang('protocol_client') ?></th> \n                            <th class=\"text-right\"><?= lang('protocols_action') ?></th> \n                        </tr>\n                    </thead>\n                    <tbody>\n                        <?php\n                        foreach ($protocols as $protocol) {\n                            ?>\n                            <tr>\n                                <td><input type=\"checkbox\" name=\"ids[]\" value=\"<?= $protocol['id'] ?>\" class=\"check-me-now\"></td>\n                                <td><a href=\"<?= base_url('user/protocol/print/' . $protocol['protocol_number']) ?>\"><?= $protocol['protocol_number'] ?></a></td>\n                                <td><?= $protocol['to_invoice'] ?></td>\n                                <td><?= date('d.m.Y', $protocol['from_date']) ?></td>\n                                <td><?= $protocol['client'] ?></td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= lang_url('user/protocol/edit/' . $protocol['protocol_number']) ?>\">\n                                        <span class=\"sprite-edit\"></span>\n                                    </a>\n                                </td>\n                            </tr>\n                        <?php } ?>\n                    </tbody>\n                </table>\n            </div> \n        </form>\n        <?= $linksPagination ?>\n    <?php } else { ?>\n        <h1 class=\"no-results-found\"><?= lang('no_protocols_yet') ?></h1>\n    <?php } ?>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/protocols/itemTableTr.php",
    "content": "<tr>\n    <td>\n        <input type=\"hidden\" name=\"item_from_list[]\" value=\"0\">\n        <input type=\"hidden\" name=\"is_item_update[]\" value=\"<?= isset($itemPost) ? $itemPost['id'] : '0' ?>\">\n        <div class=\"actions\">\n            <a href=\"javascript:void(0);\" class=\"btn btn-default delete-item\">\n                <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n            </a>\n            <a href=\"javascript:void(0);\" class=\"btn btn-default move-me\">\n                <i class=\"fa fa-sort\" aria-hidden=\"true\"></i>\n            </a>\n        </div>\n    </td>\n    <td>\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['name'] : '' ?>\" name=\"items_names[]\" class=\"form-control field field-item-name\">\n        <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_item') ?>\" data-selector-type=\"item\" class=\"choose\">\n            <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n            <span><?= lang('create_inv_choose') ?></span>\n        </a>\n    </td>\n     <td class=\"min-w-190\">\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['quantity'] : '1.00' ?>\" name=\"items_quantities[]\" class=\"form-control field quantity-field\">\n        <div class=\"quantity-type\">\n            <select class=\"form-control\" name=\"items_quantity_types[]\" data-my-id=\"1\">\n                <?php foreach ($quantityTypes as $quantityType) { ?>\n                    <option value=\"<?= $quantityType['name'] ?>\"><?= $quantityType['name'] ?></option>\n                <?php } if (isset($itemPost)) { ?>\n                    <option value=\"<?= $itemPost['quantity_type'] ?>\" selected=\"\"><?= $itemPost['quantity_type'] ?></option>\n                <?php } ?>\n                <option value=\"--\">--</option>\n                <option value=\"createNewQuantity\"><?= lang('create_new_quantity') ?></option>\n            </select> \n        </div>\n        x\n    </td>\n    <td class=\"min-w-180\">\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['single_price'] : '0.00' ?>\" name=\"items_prices[]\" class=\"form-control field price-field\">\n        =\n    </td>\n    <td class=\"text-right\">\n        <div class=\"item-total-price\">\n            <span class=\"item-total\"><?= isset($itemPost) ? $itemPost['total_price'] : '0.00' ?></span>\n            <input type=\"hidden\" class=\"item-total field\" value=\"<?= isset($itemPost) ? $itemPost['total_price'] : '0.00' ?>\" name=\"items_totals[]\">\n            <span class=\"currency-text\">\n                <?= $theCurrency ?>\n            </span>\n        </div>\n    </td>\n</tr> "
  },
  {
    "path": "application/modules/users/views/protocols/templates/default.php",
    "content": "<div class=\"default-protocol\">\n    <div class=\"document-type\">\n        <h1><?= $protocol['translation']['transmission_protocol'] ?></h1>\n    </div>\n    <div class=\"info\">\n        <div class=\"client-info\">\n            <?php if ($protocol['type'] == 'acceptable') { ?>\n                <h1><?= $protocol['translation']['supplier'] ?></h1>\n                <p><?= $protocol['firm']['name'] ?></p>\n                <p><?= $protocol['firm']['accountable_person'] ?></p>\n                <p><span><?= $protocol['translation']['city'] ?></span> <?= $protocol['firm']['city'] ?></p>\n                <p><span><?= $protocol['translation']['address'] ?></span> <?= $protocol['firm']['address'] ?></p>\n                <p><span><?= $protocol['translation']['bulstat'] ?></span> <?= $protocol['firm']['bulstat'] ?></p>\n                <?php if ($protocol['firm']['is_vat_registered'] == 1) { ?>\n                    <p><b><?= $protocol['translation']['vat_number'] ?></b> <?= $protocol['firm']['vat_number'] ?></p>\n                <?php } ?>\n            <?php } else { ?>\n                <h1><?= $protocol['translation']['recipient'] ?></h1>\n                <p><?= $protocol['client']['client_name'] ?></p>\n                <p><?= $protocol['client']['accountable_person'] ?></p>\n                <p><span><?= $protocol['translation']['city'] ?></span> <?= $protocol['client']['client_city'] ?></p>\n                <p><span><?= $protocol['translation']['address'] ?></span> <?= $protocol['client']['client_address'] ?></p>\n                <p><span><?= $protocol['translation']['bulstat'] ?></span> <?= $protocol['client']['client_bulstat'] ?></p>\n            <?php } ?> \n        </div>\n        <div class=\"firm-info\">\n            <?php if ($protocol['type'] == 'transmitter') { ?>\n                <h1><?= $protocol['translation']['supplier'] ?></h1>\n                <p><?= $protocol['firm']['name'] ?></p>\n                <p><?= $protocol['firm']['accountable_person'] ?></p>\n                <p><span><?= $protocol['translation']['city'] ?></span> <?= $protocol['firm']['city'] ?></p>\n                <p><span><?= $protocol['translation']['address'] ?></span> <?= $protocol['firm']['address'] ?></p>\n                <p><span><?= $protocol['translation']['bulstat'] ?></span> <?= $protocol['firm']['bulstat'] ?></p>\n                <?php if ($protocol['firm']['is_vat_registered'] == 1) { ?>\n                    <p><b><?= $protocol['translation']['vat_number'] ?></b> <?= $protocol['firm']['vat_number'] ?></p>\n                <?php } ?>\n            <?php } else { ?>\n                <h1><?= $protocol['translation']['recipient'] ?></h1>\n                <p><?= $protocol['client']['client_name'] ?></p>\n                <p><?= $protocol['client']['accountable_person'] ?></p>\n                <p><span><?= $protocol['translation']['city'] ?></span> <?= $protocol['client']['client_city'] ?></p>\n                <p><span><?= $protocol['translation']['address'] ?></span> <?= $protocol['client']['client_address'] ?></p>\n                <p><span><?= $protocol['translation']['bulstat'] ?></span> <?= $protocol['client']['client_bulstat'] ?></p>\n            <?php } ?> \n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"document-info\">\n        <div class=\"number\">\n            № <?= $protocol['protocol_number'] ?>\n        </div>\n        <div class=\"date-create\">\n            <?= $protocol['translation']['from_date'] . ' ' . date('d.m.Y', $protocol['created']) ?>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <?php if ($protocol['to_invoice'] != '') { ?>\n        <div class=\"to-inv\">\n            <div class=\"number-inv\">\n                <?= $protocol['translation']['to_invoice'] ?>  № <?= $protocol['to_invoice'] ?>\n            </div>\n            <div class=\"clearfix\"></div>\n        </div>\n    <?php } ?>\n    <div class=\"provider-transmit\">\n        <?= $protocol['provider_transmit'] ?> \n    </div>\n    <div class=\"items\">\n        <table class=\"table table-striped\">\n            <thead>\n                <tr>\n                    <th><?= $protocol['translation']['product_name'] ?></th>\n                    <th><?= $protocol['translation']['product_quantity'] ?></th>\n                    <th><?= $protocol['translation']['product_quantity_type'] ?></th>\n                    <th><?= $protocol['translation']['product_single_price'] ?></th> \n                    <th class=\"text-right\"><?= $protocol['translation']['product_final_price'] ?></th> \n                </tr>\n            </thead>\n            <tbody>\n                <?php foreach ($protocol['items'] as $item) { ?>\n                    <tr>\n                        <td><?= $item['name'] ?></td>\n                        <td><?= $item['quantity'] ?></td>\n                        <td><?= $item['quantity_type'] ?></td>\n                        <td><?= $item['single_price'] . $protocol['currency'] ?></td> \n                        <td class=\"text-right\"><?= $item['total_price'] . $protocol['currency'] ?></td> \n                    </tr>\n                <?php } ?>\n            </tbody>\n        </table>\n    </div>\n    <div class=\"protocol-totals\">\n        <p><span><?= $protocol['translation']['amount'] ?></span> <?= $protocol['amount'] . $protocol['currency'] ?></p>\n        <p><span><?= $protocol['translation']['vat'] ?></span> <?= $protocol['vat_percent'] ?>%</p>\n        <p><span><?= $protocol['translation']['vat_amount'] ?></span> <?= $protocol['vat_sum'] . $protocol['currency'] ?></p>\n        <p><span><?= $protocol['translation']['final_amount'] ?></span> <?= $protocol['final_total'] . $protocol['currency'] ?></p> \n    </div>\n    <div class=\"clearfix\"></div>\n    <div class=\"contract\">\n        <?= $protocol['contract'] ?> \n    </div>\n    <div class=\"transmission\">\n        <div class=\"received\">\n            <p><?= $protocol['translation']['received'] ?> <?= $protocol['received'] ?></p> \n            <div>\n                <?= $protocol['translation']['signature'] ?>................\n            </div>\n        </div>\n        <div class=\"compiled\">\n            <p><?= $protocol['translation']['compiled'] ?> <?= $protocol['compiled'] ?></p> \n            <div>\n                <?= $protocol['translation']['signature'] ?>................\n            </div>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <?php if (trim($protocol['remarks']) != '') { ?>\n        <hr>\n        <p><b><?= $protocol['translation']['remarks'] ?></b></p>\n        <?= $protocol['remarks'] ?>\n    <?php } ?>\n</div>"
  },
  {
    "path": "application/modules/users/views/reports/index.php",
    "content": "<script src=\"<?= base_url('assets/highcharts/highcharts.js') ?>\"></script>\n<script src=\"<?= base_url('assets/highcharts/modules/exporting.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('reports') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('reports') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"reports-page\">\n    <div class=\"dates\"> \n        <form class=\"form-inline site-form\" action=\"\" method=\"GET\">\n            <div class=\"form-group\">\n                <label for=\"from_date\"><?= lang('from_date') ?></label>\n                <input class=\"form-control field datepicker\" value=\"<?= isset($_GET['from_date']) ? $_GET['from_date'] : '' ?>\" id=\"from_date\" name=\"from_date\" placeholder=\"dd.mm.yyyy\" type=\"text\">\n            </div>\n            <div class=\"form-group\">\n                <label for=\"to_date\"><?= lang('to_date') ?></label>\n                <input class=\"form-control field datepicker\" value=\"<?= isset($_GET['to_date']) ? $_GET['to_date'] : '' ?>\" id=\"to_date\" name=\"to_date\" placeholder=\"dd.mm.yyyy\" type=\"text\">\n            </div> \n            <div class=\"form-group\">\n                <select class=\"selectpicker\" name=\"payment_status\"> \n                    <option <?= !isset($_GET['payment_status']) || $_GET['payment_status'] == 'all' ? 'selected=\"selected\"' : '' ?> value=\"all\"><?= lang('report_show_all') ?></option>\n                    <option <?= isset($_GET['payment_status']) && $_GET['payment_status'] == 'paid' ? 'selected=\"selected\"' : '' ?> value=\"paid\"><?= lang('report_show_paid') ?></option>\n                    <option <?= isset($_GET['payment_status']) && $_GET['payment_status'] == 'unpaid' ? 'selected=\"selected\"' : '' ?> value=\"unpaid\"><?= lang('report_show_unpaid') ?></option>\n                    <option <?= isset($_GET['payment_status']) && $_GET['payment_status'] == 'partly_paid' ? 'selected=\"selected\"' : '' ?> value=\"partly_paid\"><?= lang('report_show_partly_paid') ?></option>\n                </select>\n            </div>\n            <div class=\"checkbox\">\n                <label><input type=\"checkbox\" <?= isset($_GET['show_drafts']) && $_GET['show_drafts'] == 'true' ? 'checked=\"checked\"' : '' ?> name=\"show_drafts\" value=\"true\"><?= lang('show_drafts_report') ?></label>\n            </div>\n            <button type=\"submit\" class=\"btn btn-default\"><?= lang('show_statistic') ?></button>\n        </form> \n    </div>\n</div>\n<?php if (!empty($issuedInvoices)) { ?>\n    <div id=\"report-num-invoices\"></div>\n    <?php include 'application/modules/users/views/reports/reportNumInvoices.php'; ?>\n\n    <div id=\"num-invoices-by-month\"></div>\n    <script>\n        Highcharts.chart('num-invoices-by-month', {\n        chart: {\n        type: 'line'\n        },\n                title: {\n                text: '<?= lang('num_invoices_by_month_stat') ?>'\n                },\n                subtitle: {\n                text: '<?= $betweenDates ?>'\n                },\n                xAxis: {\n                categories: [<?php\n    foreach ($issuedInvoicesByMonth['invoice'] as $issuedByMonthKey => $issuedByMonthVal) {\n        echo \"'\" . $issuedByMonthKey . \"',\";\n    }\n    ?>]\n                },\n                yAxis: {\n                title: {\n                text: ''\n                }\n                },\n                plotOptions: {\n                line: {\n                dataLabels: {\n                enabled: true\n                },\n                        enableMouseTracking: true\n                }\n                },\n                series: [\n    <?php foreach ($issuedInvoicesByMonth as $issuedByMonthKey => $issuedByMonthVal) { ?>\n                    {\n                    name: '<?= $issuedByMonthKey ?>',\n                            data: [<?php\n        foreach ($issuedByMonthVal as $issuedByMonthNum) {\n            echo $issuedByMonthNum['num'] . ',';\n        }\n        ?>]\n                    },\n    <?php }\n    ?>]\n        });</script>\n\n    <div id=\"amount-of-invoices-by-month\"></div>\n    <script>\n        Highcharts.chart('amount-of-invoices-by-month', {\n        chart: {\n        type: 'line'\n        },\n                title: {\n                text: '<?= str_replace('%currency%', $firmCurrency, lang('amount_invoices_by_month_stat')) ?>'\n                },\n                subtitle: {\n                text: '<?= $betweenDates ?>'\n                },\n                xAxis: {\n                categories: [<?php\n    foreach ($issuedInvoicesByMonth['invoice'] as $issuedByMonthKey => $issuedByMonthVal) {\n        echo \"'\" . $issuedByMonthKey . \"',\";\n    }\n    ?>]\n                },\n                yAxis: {\n                title: {\n                text: ''\n                }\n                },\n                plotOptions: {\n                line: {\n                dataLabels: {\n                enabled: true\n                },\n                        enableMouseTracking: true\n                }\n                },\n                series: [\n    <?php foreach ($issuedInvoicesByMonth as $issuedByMonthKey => $issuedByMonthVal) { ?>\n                    {\n                    name: '<?= $issuedByMonthKey ?>',\n                            data: [<?php\n        foreach ($issuedByMonthVal as $issuedByMonthNum) {\n            echo $issuedByMonthNum['sum'] . ',';\n        }\n        ?>]\n                    },\n    <?php }\n    ?>]\n        });</script>\n\n    <div id=\"top-clients\"></div>\n    <script>\n        Highcharts.chart('top-clients', {\n        chart: {\n        type: 'column'\n        },\n                title: {\n                text: '<?= str_replace('%currency%', $firmCurrency, lang('top_clients_stat')) ?>'\n                },\n                subtitle: {\n                text: '<?= $betweenDates ?>'\n                },\n                xAxis: {\n                type: 'category',\n                        labels: {\n                        rotation: - 45,\n                                style: {\n                                fontSize: '13px',\n                                        fontFamily: 'Verdana, sans-serif'\n                                }\n                        }\n                },\n                legend: {\n                enabled: false\n                },\n                tooltip: {\n                pointFormat: '<?= lang('sum_of_invoices_in_stat') ?> <b>{point.y:.1f} <?= $firmCurrency ?></b>'\n                },\n                series: [{\n                name: '',\n                        data: [\n    <?php foreach ($topClients as $topClient) { ?>\n                            ['<?= $topClient['client'] ?>', <?= $topClient['sumInvoices'] ?>],\n    <?php } ?>\n                        ],\n                        dataLabels: {\n                        enabled: true,\n                                rotation: - 90,\n                                color: '#FFFFFF',\n                                align: 'right',\n                                format: '{point.y:.1f}', // one decimal\n                                y: 10, // 10 pixels down from the top\n                                style: {\n                                fontSize: '13px',\n                                        fontFamily: 'Verdana, sans-serif'\n                                }\n                        }\n                }]\n        });\n    </script>\n<?php } else { ?>\n    <h1 class=\"no-results-found\"><?= lang('no_reports_yet') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/reports/reportNumInvoices.php",
    "content": "<?php\n/*\n * This file is loaded in home page and reports page\n */\n?>\n<script>\n    Highcharts.chart('report-num-invoices', {\n        chart: {\n            type: 'column'\n        },\n        title: {\n            text: '<?= lang('num_invoices_stat') ?>'\n        },\n        subtitle: {\n            text: '<?= $betweenDates ?>'\n        },\n        xAxis: {\n            type: 'category',\n            labels: {\n                rotation: -45,\n                style: {\n                    fontSize: '13px',\n                    fontFamily: 'Verdana, sans-serif'\n                }\n            }\n        },\n        yAxis: {\n            min: 0,\n            title: {\n                text: ''\n            },\n            labels: {\n                formatter: function () {\n                    return Highcharts.numberFormat(this.value, 0);\n                }\n            }\n        },\n        legend: {\n            enabled: false\n        },\n        tooltip: {\n            pointFormat: '<?= lang('num_created') ?>'\n        },\n        series: [{\n                name: '<?= lang('issued') ?>',\n                data: [\n<?php foreach ($issuedInvoices as $key => $val) { ?>\n                        ['<?= $inv_readable_types[$key] ?>', <?= $val ?>],\n\n<?php } ?>\n                ],\n                dataLabels: {\n                    enabled: true,\n                    rotation: -90,\n                    color: '#FFFFFF',\n                    align: 'right',\n                    format: '{point.y:.0f}', // one decimal\n                    y: 10, // 10 pixels down from the top\n                    style: {\n                        fontSize: '13px',\n                        fontFamily: 'Verdana, sans-serif'\n                    }\n                }\n            }]\n    });\n</script>"
  },
  {
    "path": "application/modules/users/views/settings/addEmployee.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('add_employees') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings/employees') ?>\"><?= lang('employees') ?></a></li>  \n            <li class=\"active\"><?= lang('add_employees') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_add_employees')) { ?>\n    <form action=\"\" class=\"site-form\" method=\"POST\" id=\"setNewEmployee\">\n        <div class=\"row\">\n            <div class=\"col-sm-6 col-sm-offset-3\">\n                <div class=\"form-group\">\n                    <label><?= lang('add_employee_name') ?></label> \n                    <input type=\"text\" name=\"name\" value=\"<?= isset($_POST['name']) ? $_POST['name'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('add_employee_email') ?></label> \n                    <input type=\"text\" name=\"email\" value=\"<?= isset($_POST['email']) ? $_POST['email'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('add_employee_phone') ?></label> \n                    <input type=\"text\" name=\"phone\" value=\"<?= isset($_POST['phone']) ? $_POST['phone'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('schiffer_replace') ?></label> \n                    <input type=\"text\" name=\"schiffer\" value=\"<?= isset($_POST['schiffer']) ? $_POST['schiffer'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('add_employee_pass') ?></label> \n                    <input type=\"text\" name=\"password\" value=\"\" <?= $editId > 0 ? 'placeholder=\"' . lang('if_dont_change_emp_pass') . '\"' : '' ?> class=\"form-control field\">\n                </div>\n                <?php if (!defined('EMPLOYEE_ID')) { ?>\n                    <div><?= lang('can_access_firms') ?></div>\n                    <?php foreach ($myFirms as $firm) { ?>\n                        <div class=\"checkbox\">\n                            <label><input type=\"checkbox\" name=\"firms[]\" value=\"<?= $firm['id'] ?>\" <?= in_array($firm['id'], $myAccessFirms) ? 'checked=\"checked\"' : '' ?>><?= $firm['name'] ?></label>\n                        </div>\n                        <?php\n                    }\n                }\n                ?>\n                <a href=\"javascript:void(0);\" onclick=\"newEmployeeValidate()\" class=\"btn btn-green\"><?= lang('save_employee') ?></a>\n                <a href=\"<?= lang_url('user/settings/employees') ?>\" class=\"btn btn-default\"><?= lang('cancel_save_employee') ?></a>\n            </div>\n        </div>\n    </form>\n    <script>\n        var opt = {\n            passReq: <?= isset($_POST['name']) ? '0' : '1' ?>\n        }\n    </script>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/settings/admin.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('settings') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>\n            <li class=\"active\"><?= lang('edit_admin') ?></li>\n        </ol>\n    </div> \n</div>\n<form action=\"\" class=\"site-form\" method=\"POST\" id=\"editAdminUserForm\">\n    <div class=\"row\">\n        <div class=\"col-sm-6 col-sm-offset-3\">\n            <div class=\"form-group\">\n                <label><?= lang('add_employee_name') ?></label> \n                <input type=\"text\" name=\"name\" value=\"<?= $_POST['name'] ?>\" class=\"form-control field\">\n            </div>\n            <div class=\"form-group\">\n                <label><?= lang('add_employee_email') ?></label> \n                <input type=\"text\" name=\"email\" value=\"<?= $_POST['email'] ?>\" class=\"form-control field\">\n            </div>\n            <div class=\"form-group\">\n                <label><?= lang('add_employee_phone') ?></label> \n                <input type=\"text\" name=\"phone\" value=\"<?= $_POST['phone'] ?>\" class=\"form-control field\">\n            </div>\n            <div class=\"form-group\">\n                <label><?= lang('schiffer_replace') ?></label> \n                <input type=\"text\" name=\"schiffer\" value=\"<?= $_POST['schiffer'] ?>\" class=\"form-control field\">\n            </div>\n            <div class=\"form-group\">\n                <label><?= lang('add_employee_pass') ?></label> \n                <input type=\"text\" name=\"password\" value=\"\" placeholder=\"<?= lang('if_dont_change_usr_pass') ?>\" class=\"form-control field\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-green\"><?= lang('save_user_data') ?></button>\n            <a href=\"<?= lang_url('user') ?>\" class=\"btn btn-default\"><?= lang('cancel_save_user') ?></a>\n        </div>\n    </div>\n</form>"
  },
  {
    "path": "application/modules/users/views/settings/employeeRights.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <i class=\"fa fa-cog\" aria-hidden=\"true\"></i>\n            <?= lang('settings') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings/employees') ?>\"><?= lang('employees') ?></a></li>  \n            <li class=\"active\"><?= lang('rights') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_can_manage_rights')) { ?>\n    <form method=\"POST\" action=\"\">\n        <?php foreach ($permissions as $permission => $v) { ?>\n            <div class=\"checkbox\">\n                <label><input type=\"checkbox\" name=\"<?= $permission ?>\" value=\"\" <?= $userPermissions[$permission] ? 'checked=\"checked\"' : '' ?>><?= lang($permission) ?></label>\n            </div>\n        <?php } ?>\n        <input type=\"submit\" name=\"savePermissions\" value=\"<?= lang('save') ?>\" class=\"btn btn-green\">\n        <a href=\"<?= lang_url('user/settings/employees') ?>\" class=\"btn btn-default\"><?= lang('cancel_save_employee') ?></a>\n    </form> \n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/settings/employees.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('employees') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li>  \n            <li class=\"active\"><?= lang('employees') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_add_employees')) { ?>\n    <div class=\"inner-page-menu\">\n        <a href=\"<?= lang_url('user/settings/employees/add') ?>\" class=\"btn btn-blue\"><?= lang('add_new_employee') ?></a>\n    </div>  \n<?php }if (!empty($employees)) { ?> \n    <table class=\"table table-list table-striped\">\n        <thead>\n            <tr>\n                <th><?= lang('list_empl_name') ?></th>\n                <th><?= lang('list_empl_email') ?></th>\n                <th><?= lang('list_empl_phone') ?></th>\n                <th class=\"text-right\"><?= lang('list_empl_manage') ?></th> \n            </tr>\n        </thead>\n        <tbody>\n            <?php foreach ($employees as $employee) { ?>\n                <tr>\n                    <td><?= $employee['name'] ?></td>\n                    <td><?= $employee['email'] ?></td>\n                    <td><?= $employee['phone'] ?></td>\n                    <td class=\"table-options\">\n                        <div class=\"dropdown more-btn option\">\n                            <a class=\"dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\">\n                                <span class=\"sprite-more\"></span>\n                            </a>\n                            <ul class=\"dropdown-menu dropdown-menu-right\"> \n                                <?php if ($this->permissions->hasPerm('perm_delete_employees')) { ?>\n                                    <li> \n                                        <a href=\"<?= lang_url('user/settings/employees/delete/' . $employee['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('confirm_delete_employee') ?>\"><?= lang('delete') ?></a>\n                                    </li>                                      \n                                <?php } if ($this->permissions->hasPerm('perm_can_manage_rights')) { ?>\n                                    <li>\n                                        <a href=\"<?= lang_url('user/settings/employees/rights/' . $employee['id']) ?>\"><?= lang('rights') ?></a>\n                                    </li>                                       \n                                <?php } ?> \n                            </ul>\n                        </div>\n                        <?php if ($this->permissions->hasPerm('perm_edit_employees')) { ?>\n                            <a class=\"option\" href=\"<?= lang_url('user/settings/employees/add/' . $employee['id']) ?>\">\n                                <span class=\"sprite-edit\"></span>\n                            </a> \n                        <?php } ?>\n                    </td>\n                </tr>\n            <?php } ?>\n        </tbody>\n    </table> \n    <?= $linksPagination ?>\n<?php } else { ?>\n    <h1><?= lang('no_employees_yet') ?></h1>\n<?php } ?> "
  },
  {
    "path": "application/modules/users/views/settings/global.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('global') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li> \n            <li class=\"active\"><?= lang('global') ?></li>\n        </ol>\n    </div>\n</div>\n<div class=\"settings-inner-page\">\n    <div class=\"row\">\n        <div class=\"col-sm-4 col-settings\">     \n            <h4><?= lang('pages_pagination_num') ?></h4>\n            <form method=\"POST\" action=\"\">\n                <div class=\"input-group\">\n                    <input class=\"form-control field\" name=\"opt_pagination\" value=\"<?= $opt_pagination ?>\" type=\"text\">\n                    <span class=\"input-group-btn\">\n                        <button class=\"btn btn-default\" value=\"\" type=\"submit\">\n                            <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"></i>\n                        </button>\n                    </span>\n                </div>\n            </form>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/settings/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('settings') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li class=\"active\"><?= lang('settings') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"settings-page\">\n    <ul class=\"list-group\">\n        <li class=\"list-group-item\">\n            <a href=\"<?= lang_url('user/settings/employees') ?>\"><?= lang('employees') ?>\n                <span class=\"sprite-arrow-right\"></span>\n            </a>\n        </li>\n        <li class=\"list-group-item\">\n            <a href=\"<?= lang_url('user/settings/invoices') ?>\"><?= lang('invoices') ?>\n                <span class=\"sprite-arrow-right\"></span>\n            </a>\n        </li>\n        <li class=\"list-group-item\">\n            <a href=\"<?= lang_url('user/settings/global') ?>\"><?= lang('global') ?>\n                <span class=\"sprite-arrow-right\"></span>\n            </a>\n        </li>\n        <li class=\"list-group-item\">\n            <a href=\"<?= lang_url('user/settings/warranty') ?>\"><?= lang('warranty') ?>\n                <span class=\"sprite-arrow-right\"></span>\n            </a>\n        </li>\n        <li class=\"list-group-item\">\n            <a href=\"<?= lang_url('user/settings/protocols') ?>\"><?= lang('protocols') ?>\n                <span class=\"sprite-arrow-right\"></span>\n            </a>\n        </li> \n        <li class=\"list-group-item\">\n            <a href=\"<?= lang_url('user/settings/stores') ?>\"><?= lang('store') ?>\n                <span class=\"sprite-arrow-right\"></span>\n            </a>\n        </li> \n    </ul> \n</div>"
  },
  {
    "path": "application/modules/users/views/settings/invoices.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('settings_invoices') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li> \n            <li class=\"active\"><?= lang('settings_invoices') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"settings-inner-page\">\n    <div class=\"row\">\n        <div class=\"col-sm-6 col-md-4 col-settings\">\n            <h4><?= lang('default_currency') ?></h4>\n            <p class=\"selected-new-default\"><?= lang('selected_new_def') ?></p>\n            <p class=\"not-selected-new-default\"><?= lang('not_selected_new_def') ?></p>\n            <?php foreach ($myFirms as $myFirm) { ?>\n                <div style=\"margin-bottom: 10px;\">\n                    <?= $myFirm['name'] ?> - <?= $myFirm['default_currency'] == null ? lang('default_currency_null') : '' ?> \n                    <select class=\"selectpicker selectDefaultCurrency\" title=\"<?= lang('select_def_currency') ?>\" data-default-for=\"<?= $myFirm['id'] ?>\" data-live-search=\"true\">\n                        <?php foreach ($currencies as $currency) { ?>\n                            <option value=\"<?= $currency['value'] ?>\" <?= $currency['value'] == $myFirm['default_currency'] ? 'selected' : '' ?>><?= $currency['name'] ?></option>\n                        <?php } ?>\n                    </select> \n                    <?php if ($myFirm['default_currency'] != null) { ?>\n                        <a href=\"<?= lang_url('user/settings/invoices/delete/default/' . $myFirm['id']) ?>\" class=\"confirm\" data-my-message=\"<?= lang('confirm_del_def_currency') . $myFirm['name'] . '?' ?>\">\n                            <?= lang('clear_def_currency') ?>\n                        </a>\n                    <?php } ?>\n                </div>\n            <?php } ?>\n        </div>\n        <div class=\"col-sm-6 col-md-4 col-settings\">\n            <h4><?= lang('my_currencies') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr>\n                        <th><?= lang('currency_name') ?><sup><?= lang('curr_name_for_int_use') ?></sup></th>\n                        <th colspan=\"2\"><?= lang('currency_value') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($myCurrencies)) {\n                        foreach ($myCurrencies as $myCurrency) {\n                            ?>\n                            <tr>\n                                <td><?= $myCurrency['name'] ?></td>\n                                <td><?= $myCurrency['value'] ?></td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/invoices/delete/currency/' . $myCurrency['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('conirm_del_my_currency') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"3\"><?= lang('no_my_currencies_added') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"3\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddCurrency\">\n                                <table>\n                                    <tr>\n                                        <td><input type=\"text\" placeholder=\"<?= lang('currency_name') ?>\" name=\"currencyName\" class=\"form-control field c-name\"></td>\n                                        <td><input type=\"text\" placeholder=\"<?= lang('currency_value') ?>\" name=\"currencyValue\" class=\"form-control field c-value\"></td>\n                                        <td>\n                                            <a href=\"javascript:void(0);\" onclick=\"addNewCurrency()\" class=\"btn btn-default pull-right\">\n                                                <?= lang('add_new_currency') ?>\n                                            </a>\n                                        </td>\n                                    </tr>\n                                </table>\n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"col-sm-6 col-md-4 col-settings\">\n            <h4><?= lang('my_quantity_types') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('quantity_name') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($myQuantityTypes)) {\n                        foreach ($myQuantityTypes as $myQuantityType) {\n                            ?>\n                            <tr>\n                                <td><?= $myQuantityType['name'] ?></td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/invoices/delete/quantitytype/' . $myQuantityType['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('conirm_del_my_quantity_type') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"2\"><?= lang('no_my_quantity_types') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"2\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddQuantityType\">\n                                <table>\n                                    <tr>\n                                        <td><input type=\"text\" name=\"quantityTypeName\" class=\"form-control field\"></td>\n                                        <td>\n                                            <a href=\"javascript:void(0);\" onclick=\"addNewQuantityType()\" class=\"btn btn-default pull-right\">\n                                                <?= lang('add_new_q_type') ?>\n                                            </a>\n                                        </td>\n                                    </tr>\n                                </table>\n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"col-sm-6 col-md-4 col-settings\">\n            <h4><?= lang('my_payment_methods') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('quantity_name') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($myPaymentMethods)) {\n                        foreach ($myPaymentMethods as $myPaymentMethod) {\n                            ?>\n                            <tr>\n                                <td><?= $myPaymentMethod['name'] ?></td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/invoices/delete/paymentmethod/' . $myPaymentMethod['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('conirm_del_my_pay_method') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"2\"><?= lang('no_my_pay_methods') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"2\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddPaymentMethod\">\n                                <table>\n                                    <tr>\n                                        <td><input type=\"text\" name=\"paymentMethodName\" class=\"form-control field\"></td>\n                                        <td>\n                                            <a href=\"javascript:void(0);\" onclick=\"addNewPaymentMethod()\" class=\"btn btn-default pull-right\">\n                                                <?= lang('add_new_p_method') ?>\n                                            </a>\n                                        </td>\n                                    </tr>\n                                </table>\n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"col-sm-6 col-md-4 col-settings\">\n            <h4><?= lang('my_no_vat_reasons') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('vat_reason') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($myNoVatReasons)) {\n                        foreach ($myNoVatReasons as $myNoVatReason) {\n                            ?>\n                            <tr>\n                                <td><?= $myNoVatReason['reason'] ?></td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/invoices/delete/novatreason/' . $myNoVatReason['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('confirm_del_no_vat_reason') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"2\"><?= lang('no_my_no_vat_reasons') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"2\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddNoVatReason\">\n                                <table>\n                                    <tr>\n                                        <td><input type=\"text\" name=\"noVatReason\" class=\"form-control field\"></td>\n                                        <td>\n                                            <a href=\"javascript:void(0);\" onclick=\"addNewNoVatReason()\" class=\"btn btn-default pull-right\">\n                                                <?= lang('add_new_vat_reas') ?>\n                                            </a>\n                                        </td>\n                                    </tr>\n                                </table>\n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"col-sm-6 col-md-4 col-settings\">\n            <h4><?= lang('how_do_you_round_values') ?></h4>\n            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formRoundTotals\">\n                <table>\n                    <tr>\n                        <td><input type=\"text\" value=\"<?= $opt_invRoundTo ?>\" name=\"opt_invRoundTo\" class=\"form-control field optRoundTo\"></td>\n                        <td>\n                            <a href=\"javascript:void(0);\" onclick=\"updateRoundTotals()\" class=\"btn btn-default pull-right\">\n                                <?= lang('update_round_totals') ?>\n                            </a>\n                        </td>\n                    </tr>\n                </table>\n            </form>\n        </div>    \n        <div class=\"col-sm-6 col-md-4 col-settings\">     \n            <h4><?= lang('stop_inv_calculator') ?></h4>\n            <form method=\"POST\" action=\"\">\n                <div class=\"checkbox\">\n                    <label><input type=\"checkbox\" name=\"opt_invCalculator\" <?= $opt_invCalculator == 0 ? 'checked=\"checked\"' : '' ?> value=\"\"><?= lang('stop_inv_calculator') ?></label>\n                </div> \n                <button class=\"btn btn-default\" name=\"updateInvCalculator\" value=\"\" type=\"submit\">\n                    <?= lang('save') ?>\n                </button> \n            </form>\n        </div>\n        <div class=\"col-sm-6 col-md-4 col-settings\">     \n            <h4><?= lang('inv_templ_change') ?></h4>\n            <form method=\"POST\" action=\"\">\n                <div class=\"radio\">\n                    <label><input type=\"radio\" <?= $opt_invTemplate == 'creative' ? 'checked=\"\"' : '' ?>  name=\"invTempl\" value=\"creative\">Creative</label>\n                </div>\n                <div class=\"radio\">\n                    <label><input type=\"radio\" <?= $opt_invTemplate == 'toner-save' ? 'checked=\"\"' : '' ?> name=\"invTempl\" value=\"toner-save\">Toner-save</label>\n                </div> \n                <button class=\"btn btn-default\" name=\"updateInvTemplate\" value=\"\" type=\"submit\">\n                    <?= lang('save') ?>\n                </button> \n            </form>\n        </div>\n    </div>\n</div>\n<script src=\"<?= base_url('assets/plugins/jquery.eqheight.js') ?>\"></script>\n<script type=\"text/javascript\">\n                                $(document).ready(function () {\n                                    $(\".settings-inner-page\").eqHeight(\".col-settings\");\n                                });\n</script>"
  },
  {
    "path": "application/modules/users/views/settings/protocols.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('protocols') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li> \n            <li class=\"active\"><?= lang('protocols') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"settings-inner-page\">\n    <div class=\"row\">\n        <div class=\"col-sm-4 col-settings\">\n            <h4><?= lang('my_added_provider_transmits') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('my_added_provider_transmits') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($providerTransmits)) {\n                        foreach ($providerTransmits as $providerTransmit) {\n                            ?>\n                            <tr>\n                                <td><?= $providerTransmit['title'] ?></td>\n                                <td>\n                                    <a href=\"javacsript:void(0);\" onclick=\"openProviderTransmitDescription(<?= $providerTransmit['id'] ?>)\" data-toggle=\"modal\" data-target=\"#modalDescriptionExplain\" class=\"btn btn-default\"><?= lang('war_condit_preview_descr') ?></a>\n                                    <div class=\"hidden\" data-descr-id=\"<?= $providerTransmit['id'] ?>\">\n                                        <?= $providerTransmit['description'] ?>\n                                    </div>\n                                </td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/protocols/delete/provider-transmit/' . $providerTransmit['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('confirm_delete_provider_trasmit') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"3\"><?= lang('no_provider_trans_txts_added') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"3\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddProviderTransmitText\">\n                                <div class=\"form-group\">\n                                    <input type=\"text\" name=\"title\" placeholder=\"<?= lang('provider_trans_title') ?>\" class=\"form-control field\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <textarea class=\"form-control\" name=\"description\" placeholder=\"<?= lang('provider_trans_description') ?>\" rows=\"5\"></textarea>\n                                </div>\n                                <a href=\"javascript:void(0);\" onclick=\"addNewProviderTransmitText()\" class=\"btn btn-xs btn-default pull-right\">\n                                    <?= lang('add_new_provider_desc') ?>\n                                </a> \n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"col-sm-4 col-settings\">\n            <h4><?= lang('my_added_contracts') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('my_added_contracts') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($contracts)) {\n                        foreach ($contracts as $contract) {\n                            ?>\n                            <tr>\n                                <td><?= $contract['title'] ?></td>\n                                <td>\n                                    <a href=\"javacsript:void(0);\" onclick=\"openContractDescription(<?= $contract['id'] ?>)\" data-toggle=\"modal\" data-target=\"#modalDescriptionExplain\" class=\"btn btn-default\"><?= lang('war_condit_preview_descr') ?></a>\n                                    <div class=\"hidden\" data-contr-id=\"<?= $contract['id'] ?>\">\n                                        <?= $contract['contract'] ?>\n                                    </div>\n                                </td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/protocols/delete/contract/' . $contract['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('confirm_delete_provider_trasmit') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"3\"><?= lang('no_contr_txts_added') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"3\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formContractText\">\n                                <div class=\"form-group\">\n                                    <input type=\"text\" name=\"title_contract\" placeholder=\"<?= lang('provider_trans_title') ?>\" class=\"form-control field\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <textarea class=\"form-control\" name=\"contract\" placeholder=\"<?= lang('provider_trans_description') ?>\" rows=\"5\"></textarea>\n                                </div>\n                                <a href=\"javascript:void(0);\" onclick=\"addNewContractText()\" class=\"btn btn-xs btn-default pull-right\">\n                                    <?= lang('add_new_provider_desc') ?>\n                                </a> \n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n</div>\n<!-- Modal Conditions Description Explain -->\n<div class=\"modal fade\" id=\"modalDescriptionExplain\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\">\n    <div class=\"modal-dialog\" role=\"document\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                <h4 class=\"modal-title\" id=\"myModalLabel\"><?= lang('war_condit_preview_descr') ?></h4>\n            </div>\n            <div class=\"modal-body\">\n\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/settings/stores.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('store') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li> \n            <li class=\"active\"><?= lang('store') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"settings-inner-page\">\n    <div class=\"row\">\n        <div class=\"col-sm-4 col-settings\">\n            <h4><?= lang('my_added_stores') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('store_name') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($myStores)) {\n                        foreach ($myStores as $myStore) {\n                            ?>\n                            <tr>\n                                <td><?= $myStore['name'] ?></td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/stores/delete/store/' . $myStore['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('confirm_delete_store') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"2\"><?= lang('no_stores_added') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"2\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddStore\">\n                                <table>\n                                    <tr>\n                                        <td><input type=\"text\" name=\"newStore\" class=\"form-control field\"></td>\n                                        <td>\n                                            <a href=\"javascript:void(0);\" onclick=\"addNewStore()\" class=\"btn btn-default pull-right\">\n                                                <?= lang('add_new_store') ?>\n                                            </a>\n                                        </td>\n                                    </tr>\n                                </table>\n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"col-sm-4 col-settings\">\n            <h4><?= lang('how_do_you_round_values_in_move') ?></h4>\n            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formRoundTotals\">\n                <table>\n                    <tr>\n                        <td><input type=\"text\" value=\"<?= $opt_movementRoundTo ?>\" name=\"opt_movementRoundTo\" class=\"form-control field optRoundTo\"></td>\n                        <td>\n                            <a href=\"javascript:void(0);\" onclick=\"updateRoundTotals()\" class=\"btn btn-default pull-right\">\n                                <?= lang('update_round_totals') ?>\n                            </a>\n                        </td>\n                    </tr>\n                </table>\n            </form>\n        </div>    \n        <div class=\"col-sm-4 col-settings\">     \n            <h4><?= lang('stop_movem_calculator') ?></h4>\n            <form method=\"POST\" action=\"\">\n                <div class=\"checkbox\">\n                    <label><input type=\"checkbox\" name=\"opt_movementCalculator\" <?= $opt_movementCalculator == 0 ? 'checked=\"checked\"' : '' ?> value=\"\"><?= lang('stop_movem_calculator') ?></label>\n                </div>\n                <button class=\"btn btn-default\" name=\"stopMovementCalculator\" value=\"\" type=\"submit\">\n                    <?= lang('save') ?>\n                </button>\n            </form>\n        </div>\n        <div class=\"col-sm-4 col-settings\">     \n            <h4><?= lang('allow_negative_qua_in_store') ?></h4>\n            <form method=\"POST\" action=\"\">\n                <div class=\"checkbox\">\n                    <label><input type=\"checkbox\" name=\"opt_negativeQuantities\" <?= $opt_negativeQuantities == 0 ? 'checked=\"checked\"' : '' ?> value=\"\"><?= lang('allow_negative_qua_in_store') ?></label>\n                </div>\n                <button class=\"btn btn-default\" name=\"allowNegativeQuantities\" value=\"\" type=\"submit\">\n                    <?= lang('save') ?>\n                </button>\n            </form>\n        </div>\n    </div>\n</div>\n<script src=\"<?= base_url('assets/plugins/jquery.eqheight.js') ?>\"></script>\n<script type=\"text/javascript\">\n$(document).ready(function () {\n    $(\".settings-inner-page\").eqHeight(\".col-settings\");\n});\n</script>"
  },
  {
    "path": "application/modules/users/views/settings/warranty.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('warranty') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/settings') ?>\"><?= lang('settings') ?></a></li> \n            <li class=\"active\"><?= lang('warranty') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"settings-inner-page\">\n    <div class=\"row\">\n        <div class=\"col-sm-4 col-settings\">\n            <h4><?= lang('my_added_stores') ?></h4>\n            <table class=\"table table-bordered\">\n                <thead>\n                    <tr> \n                        <th colspan=\"2\"><?= lang('warranty_conditions') ?></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <?php\n                    if (!empty($myConditions)) {\n                        foreach ($myConditions as $myCondition) {\n                            ?>\n                            <tr>\n                                <td><?= $myCondition['condition_title'] ?></td>\n                                <td>\n                                    <a href=\"javacsript:void(0);\" onclick=\"openConditionDescription(<?= $myCondition['id'] ?>)\" data-toggle=\"modal\" data-target=\"#modalDescriptionExplain\" class=\"btn btn-default\"><?= lang('war_condit_preview_descr') ?></a>\n                                    <div class=\"hidden\" data-descr-id=\"<?= $myCondition['id'] ?>\">\n                                        <?= $myCondition['condition_description'] ?>\n                                    </div>\n                                </td>\n                                <td class=\"text-right\">\n                                    <a href=\"<?= base_url('user/settings/warranty/delete/condition/' . $myCondition['id']) ?>\" class=\"confirm btn btn-xs btn-default\" data-my-message=\"<?= lang('confirm_delete_condition') ?>\">\n                                        <?= lang('delete') ?>\n                                    </a>\n                                </td>\n                            </tr>\n                            <?php\n                        }\n                    } else {\n                        ?>\n                        <tr>\n                            <td colspan=\"3\"><?= lang('no_conditions_added') ?></td>\n                        </tr>\n                    <?php } ?>\n                    <tr>\n                        <td colspan=\"3\">\n                            <form method=\"POST\" action=\"\" class=\"site-form\" id=\"formAddWarrantyCondition\">\n                                <div class=\"form-group\">\n                                    <input type=\"text\" name=\"conditionTitle\" placeholder=\"<?= lang('condition_title') ?>\" class=\"form-control field\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <textarea class=\"form-control\" name=\"condition\" placeholder=\"<?= lang('condition_description') ?>\" rows=\"5\"></textarea>\n                                </div>\n                                <a href=\"javascript:void(0);\" onclick=\"addNewWarrantyCondition()\" class=\"btn btn-xs btn-default pull-right\">\n                                    <?= lang('add_new_condition') ?>\n                                </a> \n                            </form>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n</div>\n<!-- Modal Conditions Description Explain -->\n<div class=\"modal fade\" id=\"modalDescriptionExplain\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\">\n    <div class=\"modal-dialog\" role=\"document\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                <h4 class=\"modal-title\" id=\"myModalLabel\"><?= lang('war_condit_preview_descr') ?></h4>\n            </div>\n            <div class=\"modal-body\">\n\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/modules/users/views/store/addmovement.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <?= lang('add_movement') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/store') ?>\"><?= lang('store') ?></a></li>  \n            <li class=\"active\"><?= lang('add_movement') ?></li>\n        </ol>\n    </div> \n</div> \n<?php if ($this->permissions->hasPerm('perm_add_movement')) { ?>\n    <form action=\"\" id=\"setMovementForm\" class=\"site-form\" method=\"POST\">\n        <div class=\"row\">\n            <div class=\"col-sm-6\">  \n                <div class=\"choose-translation\">\n                    <p><?= lang('explain_movem_translation') ?></p>\n                    <select class=\"selectpicker\" name=\"movement_translation\" title=\"<?= lang('choose_movem_translation') ?>\">\n\t\t\t\t\t    <option value=\"3\"  selected=\"\"><?= lang('default_inv_lang_fr') ?></option>\n                        <option value=\"1\"><?= lang('default_inv_lang_en') ?></option>\n                        <option value=\"2\"><?= lang('default_inv_lang_bg') ?></option>\n                        <?php\n                        if (!empty($movementsLanguages)) {\n                            foreach ($movementsLanguages as $mvLanguage) {\n                                ?>\n                                <option value=\"<?= $mvLanguage['id'] ?>\"><?= $mvLanguage['language_name'] ?>(<?= $mvLanguage['id'] ?>)</option>\n                                <?php\n                            }\n                        }\n                        ?> \n                    </select>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalAddNewTranslation\" class=\"btn btn-default\">\n                        <?= lang('choose_movem_translation') ?>\n                    </a>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalExplainTranslation\">\n                        <i class=\"fa fa-question-circle\" aria-hidden=\"true\"></i>\n                    </a>\n                </div>\n            </div> \n            <div class=\"col-sm-6\">\n                <div class=\"pull-right\">  \n                    <div class=\"choose-firm-translation\">\n                        <p><?= lang('explain_firm_translation') ?></p>\n                        <select class=\"selectpicker\" name=\"movement_firm_translation\"> \n                            <?php\n                            foreach ($allForFirm['translations'] as $theFirm) {\n                                ?>\n                                <option value=\"<?= $theFirm['id'] ?>\" <?= $theFirm['is_default'] == 1 ? 'selected=\"selected\"' : '' ?>><?= $theFirm['trans_name'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                    </div>\n                </div>\n            </div>\n        </div>  \n        <div class=\"create-document\">\n            <div class=\"type\">\n                <label><?= lang('create_movement_type') ?></label> \n                <div class=\"special-radio\">\n                    <label class=\"control control--radio\"><?= lang('movement_type_in') ?>\n                        <input type=\"radio\" value=\"in\" name=\"type\" class=\"movement-type\" checked=\"\" />\n                        <div class=\"control__indicator\"></div>\n                    </label>\n                    <label class=\"control control--radio\"><?= lang('movement_type_out') ?>\n                        <input type=\"radio\" value=\"out\" name=\"type\" class=\"movement-type\" />\n                        <div class=\"control__indicator\"></div>\n                    </label>\n                    <label class=\"control control--radio\"><?= lang('movement_type_move') ?>\n                        <input type=\"radio\" value=\"move\" name=\"type\" class=\"movement-type\" />\n                        <div class=\"control__indicator\"></div>\n                    </label>\n                    <label class=\"control control--radio\"><?= lang('movement_type_revision') ?>\n                        <input type=\"radio\" value=\"revision\" name=\"type\" class=\"movement-type\" />\n                        <div class=\"control__indicator\"></div>\n                    </label>\n                </div>\n            </div>\n            <div class=\"inner\">\n                <div class=\"row head-content\">\n                    <div class=\"col-sm-6 col-md-5\"> \n                        <div class=\"form-group store-selector\">\n                            <label class=\"label-from-store hidden\"><?= lang('movem_from_store') ?></label> \n                            <label class=\"label-to-store\"><?= lang('movem_to_store') ?></label> \n                            <select class=\"selectpicker\" name=\"selected_store\" data-live-search=\"true\">\n                                <?php\n                                foreach ($myStores as $myStore) {\n                                    ?>\n                                    <option value=\"<?= $myStore['id'] ?>\"><?= $myStore['name'] ?></option>\n                                <?php } ?>\n                            </select>\n                        </div>\n                        <div class=\"form-group to-store-movement hidden\">\n                            <label class=\"label-from-store hidden\"><?= lang('movem_to_store') ?></label> \n                            <label class=\"label-to-store\"><?= lang('movem_to_store') ?></label> \n                            <select class=\"selectpicker\" name=\"selected_to_store\" data-live-search=\"true\">\n                                <?php\n                                foreach ($myStores as $myStore) {\n                                    ?>\n                                    <option value=\"<?= $myStore['id'] ?>\"><?= $myStore['name'] ?></option>\n                                <?php } ?>\n                            </select>\n                        </div>\n                        <div class=\"movement-for-client\">\n                            <div class=\"column-data client\">\n                                <label class=\"label-from-client\"><?= lang('create_movem_from_client') ?></label> \n                                <label class=\"label-to-client hidden\"><?= lang('create_movem_to_client') ?></label>  \n                                <input type=\"text\" name=\"client_name\" value=\"\" class=\"form-control field\">\n                                <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                    <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                    <span><?= lang('create_inv_choose') ?></span>\n                                </a> \n                                <div>\n                                    <div class=\"checkbox\">\n                                        <label><input type=\"checkbox\" name=\"is_to_person\" id=\"individual-client\" value=\"\"><?= lang('create_inv_individual') ?></label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"column-data client client-company\"> \n                                <label><?= lang('create_inv_bulstat') ?></label> \n                                <input type=\"text\" name=\"client_bulstat\" value=\"\" class=\"form-control field\">\n                                <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                    <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                    <span><?= lang('create_inv_choose') ?></span>\n                                </a>\n                                <div>\n                                    <div class=\"checkbox\">\n                                        <label><input type=\"checkbox\" name=\"client_vat_registered\" id=\"client-vat-registered\" value=\"\"><?= lang('create_inv_client_vat_registered') ?></label>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"column-data client-company client-vat-registered\">\n                                <label><?= lang('create_inv_vat_number') ?></label>\n                                <input type=\"text\" value=\"\" name=\"vat_number\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data client-company\">\n                                <label><?= lang('create_inv_mol') ?></label>\n                                <input type=\"text\" value=\"\" name=\"accountable_person\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data client-individial\">\n                                <label><?= lang('create_inv_ident_num') ?></label>\n                                <input type=\"text\" value=\"\" name=\"client_ident_num\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_inv_city') ?></label>\n                                <input type=\"text\" value=\"\" name=\"client_city\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_inv_address') ?></label>\n                                <input type=\"text\" value=\"\" name=\"client_address\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_inv_country') ?></label>\n                                <input type=\"text\" value=\"\" name=\"client_country\" class=\"form-control field\">\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"col-sm-6 col-md-7\">\n                        <div class=\"invoice-setting\">\n                            <div class=\"column-data\">\n                                <span class=\"inv-type-num\"><?= lang('create_movement_id') ?></span> <label>№:</label>\n                                <input type=\"text\" name=\"movement_number\" value=\"<?= $nextMovementNumber ?>\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_movement_date_create') ?></label>\n                                <input type=\"text\" name=\"date_create\" placeholder=\"dd.mm.yyyy\" value=\"<?= date('d.m.Y', time()) ?>\" class=\"form-control field datepicker\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_movement_lot') ?></label>\n                                <input type=\"text\" name=\"lot\" value=\"\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_movement_expire') ?></label>\n                                <input type=\"text\" name=\"expire_date\" value=\"<?= date('d.m.Y', strtotime('+2 years')) ?>\" class=\"form-control field datepicker\">\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"select-currency\">\n                    <?= lang('select_curreny') ?> \n                    <select class=\"selectpicker\" id=\"selectCurrencyNewInv\" name=\"movement_currency\" title=\"<?= lang('no_currency_selected') ?>\" data-live-search=\"true\">\n                        <?php\n                        $choosedCur = false;\n                        foreach ($currencies as $currency) {\n                            if ($theCurrency == $currency['value']) {\n                                $selectedCurrency = 'selected';\n                                $choosedCur = true;\n                            } else {\n                                $selectedCurrency = '';\n                            }\n                            ?>\n                            <option value=\"<?= $currency['value'] ?>\" <?= $selectedCurrency ?>><?= $currency['name'] ?></option>\n                        <?php } if ($selectedCurrency == '' && $choosedCur == false) { ?>\n                            <option value=\"<?= $theCurrency ?>\" selected=\"\"><?= $theCurrency ?></option> \n                        <?php } ?>\n                    </select>\n                </div>\n                <div class=\"table-responsive\">\n                    <table class=\"table table-items\">\n                        <thead>\n                            <tr>\n                                <th></th>\n                                <th><?= lang('create_inv_item') ?></th>\n                                <th><?= lang('create_inv_quantity') ?></th>\n                                <th><?= lang('create_inv_price') ?></th>\n                                <th class=\"text-right\"><?= lang('create_inv_total') ?></th>\n                            </tr>\n                        </thead>\n                        <tbody class=\"body-items\">\n                            <?php\n                            $thisDir = ltrim(str_replace(getcwd(), '', dirname(__FILE__)), '/');\n                            include $thisDir . '/itemTableTr.php';\n                            ?>\n                        </tbody>\n                    </table>\n                </div>\n                <div class=\"items-features\">\n                    <a href=\"javascript:void(0);\" class=\"add-new-item\">\n                        <i class=\"fa fa-plus\"></i>\n                        <?= lang('add_new_item_to_table') ?>\n                    </a>\n                </div>\n                <div class=\"row amounts\">\n                    <div class=\"col-sm-12 col-md-6 col-md-offset-6\">\n                        <div class=\"row amount-row\">\n                            <div class=\"col-sm-6\">\n                                <?= lang('create_movement_amount') ?>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"amount\">\n                                    <span id=\"items-total\">0.00</span> \n                                    <input type=\"hidden\" value=\"0.00\" name=\"amount\" class=\"items-total\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                            </div>\n                        </div>\n                        <div class=\"row amount-row\">\n                            <div class=\"col-sm-6\">\n                                <div class=\"discount-txt\">\n                                    <?= lang('create_inv_discount') ?>\n                                </div>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"discount\">\n                                    <input type=\"text\" value=\"<?= isset($_POST['discount']) ? $_POST['discount'] : '0.00' ?>\" name=\"discount\" class=\"form-control field text-discount\">\n                                    <div class=\"select-discount\">\n                                        <select class=\"selectpicker form-control\" name=\"discount_type\" id=\"discount-value\"> \n                                            <option class=\"currency-text\" <?= isset($_POST['discount_type']) && $_POST['discount_type'] != '%' ? 'selected=\"selected\"' : '' ?>><?= $theCurrency ?></option>\n                                            <option <?= isset($_POST['discount_type']) && $_POST['discount_type'] == '%' ? 'selected=\"selected\"' : '' ?>>%</option>\n                                        </select>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"row amount-row\">\n                            <div class=\"col-sm-6\">\n                                <?= lang('create_inv_tax_base') ?>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"amount\">\n                                    <span id=\"tax-base\"><?= isset($_POST['tax_base']) ? $_POST['tax_base'] : '0.00' ?></span>\n                                    <input type=\"hidden\" value=\"<?= isset($_POST['tax_base']) ? $_POST['tax_base'] : '0.00' ?>\" name=\"tax_base\" class=\"tax-base field\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                            </div>\n                        </div>\n                        <div class=\"row amount-row\">\n                            <div class=\"col-sm-6\">\n                                <div class=\"no-vat-container\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                    <?= lang('create_inv_vat') ?>\n                                    <input type=\"text\" class=\"form-control field vat-field\" name=\"vat_percent\" value=\"<?= isset($_POST['vat_percent']) ? $_POST['vat_percent'] : '20' ?>\">\n                                    %\n                                </div>\n                                <div class=\"no-vat\">\n                                    <div class=\"checkbox\">\n                                        <label><input type=\"checkbox\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'checked=\"checked\"' : '' ?>  name=\"no_vat\" id=\"no-vat\" value=\"\"><?= lang('create_inv_no_vat_mark') ?></label>\n                                    </div>\n                                </div> \n                            </div>\n                            <div class=\"col-sm-6\"> \n                                <div class=\"amount the-vat\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                                    <span id=\"vat-sum\"><?= isset($_POST['vat_sum']) ? $_POST['vat_sum'] : '0.00' ?></span> \n                                    <input type=\"hidden\" name=\"vat_sum\" value=\"<?= isset($_POST['vat_sum']) ? $_POST['vat_sum'] : '0.00' ?>\" class=\"vat-sum field\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                                <div class=\"no-vat-field\" <?= isset($_POST['no_vat']) && $_POST['no_vat'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                                    <label><?= lang('create_inv_reason_no_vat') ?></label> \n                                    <input type=\"text\" class=\"form-control field\" name=\"no_vat_reason\" value=\"<?= isset($_POST['no_vat_reason']) ? $_POST['no_vat_reason'] : '' ?>\">\n                                    <?php if (!empty($myNoVatReasons)) { ?>\n                                        <select class=\"selectpicker\" id=\"select-vat-from-list\" title=\"<?= lang('no_vat_reason_selected') ?>\" data-live-search=\"true\">\n                                            <?php\n                                            foreach ($myNoVatReasons as $vatReason) {\n                                                ?>\n                                                <option value=\"<?= $vatReason['reason'] ?>\"><?= $vatReason['reason'] ?></option>\n                                            <?php } ?>\n                                        </select>\n                                    <?php } ?>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"row amount-row total-row\">\n                            <div class=\"col-sm-6\">\n                                <span class=\"total\"><?= lang('create_inv_total') ?></span> \n                            </div>\n                            <div class=\"col-sm-6\">\n                                <div class=\"amount total\">\n                                    <span id=\"final-total\"><?= isset($_POST['final_total']) ? $_POST['final_total'] : '0.00' ?></span>\n                                    <input type=\"hidden\" name=\"final_total\" class=\"final-total field\" value=\"<?= isset($_POST['final_total']) ? $_POST['final_total'] : '0.00' ?>\">\n                                    <span class=\"currency-text\">\n                                        <?= $theCurrency ?>\n                                    </span>\n                                </div> \n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"remarks\">\n                    <label><?= lang('create_inv_remarks') ?><sup><?= lang('visibile_for_client') ?></sup></label>\n                    <textarea class=\"form-control field area\" name=\"remarks\"><?= isset($_POST['remarks']) ? $_POST['remarks'] : '' ?></textarea>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-sm-7\">\n                        <div class=\"payment-type\">\n                            <label><?= lang('create_inv_payment_type') ?></label>\n                            <select class=\"selectpicker payment-method\" name=\"payment_method\">\n                                <?php foreach ($paymentMethods as $paymentMethod) { ?>\n                                    <option value=\"<?= $paymentMethod['name'] ?>\"><?= $paymentMethod['name'] ?></option>\n                                <?php } if (isset($_POST['payment_method'])) { ?>\n                                    <option value=\"<?= $_POST['payment_method'] ?>\" selected=\"\"><?= $_POST['payment_method'] ?></option>\n                                <?php } ?>\n                                <option value=\"--\">--</option>\n                                <option value=\"createNewMethod\"><?= lang('create_new_pay_method') ?></option>\n                            </select> \n                        </div> \n                    </div> \n                    <div class=\"col-sm-5\">\n                        <div class=\"form-group\">\n                            <label><?= lang('momvem_betrayed') ?></label>\n                            <input type=\"text\" class=\"form-control field\" name=\"betrayed\" value=\"\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('momvem_accepted') ?></label>\n                            <input type=\"text\" class=\"form-control field\" name=\"accepted\" value=\"\">\n                        </div>\n                    </div>\n                </div>\n            </div> \n            <a href=\"javascript:void(0);\" onclick=\"validateStoreMovement()\" class=\"btn btn-green\"><?= lang('create_store_movement') ?></a>\n            <?= lang('or') ?>\n            <a href=\"<?= lang_url('user/store') ?>\"><?= lang('open_store_movements') ?></a>\n        </div>\n    </form>\n    <?php\n    include 'application/modules/users/views/invoices/modals/add_quantity_type.php';\n    include 'application/modules/users/views/invoices/modals/add_payment_method.php';\n    include 'application/modules/users/views/invoices/modals/selector.php';\n    ?>\n    <!-- Modal Explain Add Translations -->\n    <div class=\"modal fade\" id=\"modalExplainTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalExplainTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\"><?= lang('what_mean_new_translate') ?></h4>\n                </div>\n                <div class=\"modal-body\">\n                    <?= lang('what_mean_new_translate_explain') ?>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- Modal Create New Translation -->\n    <div class=\"modal fade\" id=\"modalAddNewTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalAddNewTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\"><?= lang('add_new_translation') ?></h4>\n                </div>\n                <div class=\"modal-body site-form\">\n                    <form method=\"POST\" action=\"\" id=\"formAddNewTranslate\">\n                        <input type=\"hidden\" name=\"addNewMovementTranslation\" value=\"1\">\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_language_name') ?></label>\n                            <input type=\"text\" name=\"language_name\" placeholder=\"<?= lang('lang_name_internal_use') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_bill_of_goods') ?></label>\n                            <input type=\"text\" name=\"bill_of_goods\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_date') ?></label>\n                            <input type=\"text\" name=\"date\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_recipient') ?></label>\n                            <input type=\"text\" name=\"recipient\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_sender') ?></label>\n                            <input type=\"text\" name=\"sender\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_bulstat') ?></label>\n                            <input type=\"text\" name=\"bulstat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_address') ?></label>\n                            <input type=\"text\" name=\"address\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_city') ?></label>\n                            <input type=\"text\" name=\"city\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_betrayed') ?></label>\n                            <input type=\"text\" name=\"betrayed\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_accepted') ?></label>\n                            <input type=\"text\" name=\"accepted\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_amount') ?></label>\n                            <input type=\"text\" name=\"amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat') ?></label>\n                            <input type=\"text\" name=\"vat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat_amount') ?></label>\n                            <input type=\"text\" name=\"vat_amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_no_vat_reason') ?></label>\n                            <input type=\"text\" name=\"no_vat_reason\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_amount') ?></label>\n                            <input type=\"text\" name=\"final_amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_name') ?></label>\n                            <input type=\"text\" name=\"product_name\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_name') ?></label>\n                            <input type=\"text\" name=\"product_name\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_quantity') ?></label>\n                            <input type=\"text\" name=\"product_quantity\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_quantity_type') ?></label>\n                            <input type=\"text\" name=\"product_quantity_type\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_single_price') ?></label>\n                            <input type=\"text\" name=\"single_price\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_amount') ?></label>\n                            <input type=\"text\" name=\"product_amount\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_payment_method') ?></label>\n                            <input type=\"text\" name=\"payment_method\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div> \n                        <div class=\"form-group\">\n                            <label><?= lang('trans_page') ?></label>\n                            <input type=\"text\" name=\"page\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat_number') ?></label>\n                            <input type=\"text\" name=\"vat_number\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                    </form>\n                </div>\n                <div class=\"modal-footer\">\n                    <a href=\"javascript:void(0);\" class=\"btn btn-default\" onclick=\"saveNewTranslation()\"><?= lang('save_new_translate') ?></a>\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                </div>\n            </div>\n        </div>\n    </div> \n    <?php if ($opt_movementCalculator == 0) { ?>\n        <style>\n            span.item-total, #items-total, #tax-base, #vat-sum, #final-total {display: none;}\n        </style>\n        <script>\n            $('input.item-total, [name=\"invoice_amount\"], [name=\"tax_base\"], [name=\"vat_sum\"], [name=\"final_total\"]').attr('type', 'text');\n        </script>\n    <?php }\n    ?>\n    <script>\n        var createDocument = {\n            rountTo: <?= $opt_movementRoundTo ?>,\n            calculatorStatus: <?= $opt_movementCalculator ?>\n        };\n    </script>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/store/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('store') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('store') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <div class=\"left-nav-side\">\n        <a href=\"<?= lang_url('user/store/add-movement') ?>\" class=\"btn btn-blue\"><?= lang('add_store_movement') ?></a>\n        <a href=\"<?= lang_url('user/store/stocks') ?>\" class=\"btn btn-blue\"><?= lang('store_stocks') ?></a>\n        <button data-toggle=\"collapse\" class=\"btn btn-blue\" data-target=\"#store-search\"><?= lang('search') ?></button>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"stat_canceled\"><?= lang('to_canceled_stat') ?></a>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"remove_canceled\"><?= lang('remove_canceled_stat') ?></a>\n    </div>\n    <div class=\"right-nav-side\">\n        <a href=\"<?= lang_url('user/settings/stores') ?>\" class=\"btn btn-blue\"><?= lang('store_settings') ?></a>\n    </div>\n    <div class=\"clearfix\"></div>\n</div> \n<div id=\"store-search\" class=\"collapse <?= isset($_GET['selected_store']) ? 'in' : '' ?> lists-search-form\">    \n    <form method=\"GET\" action=\"\" class=\"site-form\"> \n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <div class=\"form-group\">\n                    <label><?= lang('search_by_store') ?></label>\n                    <select class=\"selectpicker\" name=\"selected_store\" data-live-search=\"true\">\n                        <option value=\"all\"><?= lang('all_stores') ?></option>\n                        <?php\n                        foreach ($myStores as $myStore) {\n                            ?>\n                            <option <?= isset($_GET['selected_store']) && $_GET['selected_store'] == $myStore['id'] ? 'selected=\"selected\"' : '' ?> value=\"<?= $myStore['id'] ?>\"><?= $myStore['name'] ?></option>\n                        <?php } ?>\n                    </select>\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('search_store_client') ?></label>\n                    <input type=\"text\" name=\"client_name\" value=\"<?= isset($_GET['client_name']) ? $_GET['client_name'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_date_from') ?></label>\n                    <input type=\"text\" name=\"create_from\" value=\"<?= isset($_GET['create_from']) ? $_GET['create_from'] : '' ?>\" class=\"form-control field datepicker\">\n                    <label><?= lang('search_to') ?></label>\n                    <input type=\"text\" name=\"create_to\" value=\"<?= isset($_GET['create_to']) ? $_GET['create_to'] : '' ?>\" class=\"form-control field datepicker\">\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('create_movement_lot') ?></label>\n                    <input type=\"text\" name=\"lot\" value=\"<?= isset($_GET['lot']) ? $_GET['lot'] : '' ?>\" class=\"form-control field\">\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('expire_date_to') ?></label>\n                    <input type=\"text\" name=\"expire_date\" value=\"<?= isset($_GET['expire_date']) ? $_GET['expire_date'] : '' ?>\" class=\"form-control field datepicker\">\n                </div>\n            </div>\n        </div>\n        <input type=\"submit\" class=\"btn btn-green\" value=\"<?= lang('search') ?>\"> \n        <a href=\"<?= lang_url('user/store') ?>\"><?= lang('clear_search') ?></a>\n    </form>\n</div>\n<?php\nif ($this->permissions->hasPerm('perm_view_movement_page')) {\n    if (!empty($movements)) {\n        ?>\n        <form method=\"POST\" action=\"\" id=\"action-form\">\n            <input type=\"hidden\" name=\"action\" value=\"\">\n            <div class=\"table-responsive\">\n                <table class=\"table table-list table-striped\">\n                    <thead>\n                        <tr>\n                            <th><input type=\"checkbox\" class=\"check-all-boxes\"></th>\n                            <th><?= lang('list_movement') ?></th>\n                            <th><?= lang('list_bill_of_lading') ?></th>\n                            <th><?= lang('list_movem_type') ?></th>\n                            <th><?= lang('list_movem_from') ?></th>\n                            <th><?= lang('list_movem_to') ?></th>\n                            <th><?= lang('list_movem_status') ?></th> \n                        </tr>\n                    </thead>\n                    <tbody>\n                        <?php\n                        foreach ($movements as $movem) {\n                            if ($movem['movement_type'] == 'in') {\n                                $from = $movem['client_name'];\n                                $to = $movem['firm_name'];\n                            }\n                            if ($movem['movement_type'] == 'out') {\n                                $from = $movem['firm_name'];\n                                $to = $movem['client_name'];\n                            }\n                            if ($movem['movement_type'] == 'move') {\n                                $from = $movem['from_store'];\n                                $to = $movem['to_store'];\n                            }\n                            if ($movem['movement_type'] == 'revision') {\n                                $from = '';\n                                $to = '';\n                            }\n                            ?>\n                            <tr>\n                                <td><input type=\"checkbox\" name=\"ids[]\" value=\"<?= $movem['id'] ?>\" class=\"check-me-now\"></td>\n                                <td><a href=\"<?= lang_url('user/movement/view/' . $movem['movement_number']) ?>\"><?= lang('movem_preview') ?></a></td>\n                                <td><a href=\"<?= base_url('user/store-order/print/' . $movem['movement_number']) ?>\" target=\"_blank\"><?= $movem['movement_number'] ?></a></td>\n                                <td><?= lang('movem_type_' . $movem['movement_type']) ?></td>\n                                <td><?= $from ?></td>\n                                <td><?= $to ?></td>\n                                <td><?= $movem['cancelled'] == 0 ? lang('movem_stat_confirmed') : lang('movem_stat_cancelled') ?></td>\n                            </tr>\n                        <?php } ?>\n                    </tbody>\n                </table>\n            </div> \n        </form>\n        <?= $linksPagination ?>\n    <?php } else { ?>\n        <h1 class=\"no-results-found\"><?= lang('no_movements_yet') ?></h1>\n    <?php } ?>\n\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/store/itemTableTr.php",
    "content": "<tr>\n    <td>\n        <input type=\"hidden\" name=\"item_from_list[]\" value=\"0\">\n        <input type=\"hidden\" name=\"is_item_update[]\" value=\"0\">\n        <div class=\"actions\">\n            <a href=\"javascript:void(0);\" class=\"btn btn-default delete-item\">\n                <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n            </a>\n            <a href=\"javascript:void(0);\" class=\"btn btn-default move-me\">\n                <i class=\"fa fa-sort\" aria-hidden=\"true\"></i>\n            </a>\n        </div>\n    </td>\n    <td>\n        <input type=\"text\" value=\"\" name=\"items_names[]\" class=\"form-control field field-item-name\">\n        <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_item') ?>\" data-selector-type=\"item\" class=\"choose\">\n            <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n            <span><?= lang('create_inv_choose') ?></span>\n        </a>\n    </td>\n     <td class=\"min-w-190\">\n        <input type=\"text\" value=\"1.00\" name=\"items_quantities[]\" class=\"form-control field quantity-field\">\n        <div class=\"quantity-type\">\n            <select class=\"form-control\" name=\"items_quantity_types[]\" data-my-id=\"1\">\n                <?php foreach ($quantityTypes as $quantityType) { ?>\n                    <option value=\"<?= $quantityType['name'] ?>\"><?= $quantityType['name'] ?></option>\n                <?php } ?>\n                <option value=\"--\">--</option>\n                <option value=\"createNewQuantity\"><?= lang('create_new_quantity') ?></option>\n            </select> \n        </div>\n        x\n    </td>\n    <td class=\"min-w-180\">\n        <input type=\"text\" value=\"0.00\" name=\"items_prices[]\" class=\"form-control field price-field\">\n        =\n    </td>\n    <td class=\"text-right\">\n        <div class=\"item-total-price\">\n            <span class=\"item-total\">0.00</span>\n            <input type=\"hidden\" class=\"item-total field\" value=\"0.00\" name=\"items_totals[]\">\n            <span class=\"currency-text\">\n                <?= $theCurrency ?>\n            </span> \n        </div>\n    </td>\n</tr> "
  },
  {
    "path": "application/modules/users/views/store/preview.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <?= lang('movement_preview') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/store') ?>\"><?= lang('store') ?></a></li>  \n            <li class=\"active\"><?= lang('movement_preview') ?></li>\n        </ol>\n    </div> \n</div>\n<?php\nif ($movement['movement_type'] == 'in') {\n    $from = $movement['client']['client_name'];\n    $to = $movement['firm']['name'];\n}\nif ($movement['movement_type'] == 'out') {\n    $from = $movement['firm']['name'];\n    $to = $movement['client']['client_name'];\n}\nif ($movement['movement_type'] == 'move' || $movement['movement_type'] == 'revision') {\n    $from = $movement['f_stores']['from_store'];\n    $to = $movement['f_stores']['to_store'];\n}\n?>\n<div class=\"row\">\n    <div class=\"col-sm-6\">\n        <p><?= lang('preview_movem_num') ?> <?= $movement['movement_number'] ?></p>\n        <p><?= lang('preview_movem_type') ?> <?= lang('movem_type_' . $movement['movement_type']) ?></p>\n        <p><?= lang('preview_movem_currency') ?> <?= $movement['movement_currency'] ?></p>\n        <p><?= lang('preview_movem_status') ?> <?= $movement['cancelled'] == 0 ? lang('movem_stat_confirmed') : lang('movem_stat_cancelled') ?></p>\n        <p><?= lang('preview_movem_from') ?> <?= $from ?></p>\n        <p><?= lang('preview_movem_to') ?> <?= $to ?></p>\n        <p><?= lang('preview_movem_betrayed') ?> <?= $movement['betrayed'] ?></p>\n        <p><?= lang('preview_movem_accepted') ?> <?= $movement['accepted'] ?></p>\n        <p><?= lang('preview_movem_lot') ?> <?= $movement['lot'] ?></p>\n        <p><?= lang('preview_movem_expire') ?> <?= date('d.m.Y', $movement['expire_date']) ?></p>\n        <?php if ($movement['movement_type'] == 'out') { ?>\n            <p><?= lang('preview_movem_to_inv') ?>\n                <?php\n                if ($movement['to_invoice'] != null) {\n                    ?>\n                    <a href=\"<?= lang_url('user/invoice/view/' . $movement['to_invoice']) ?>\"><?= $movement['to_invoice'] ?></a>\n                    <?php\n                } else {\n                    echo lang('to_inv_movem_not_set');\n                }\n                ?>\n            </p>\n        <?php } ?>\n    </div>\n    <div class=\"col-sm-6 text-right\">\n        <a class=\"btn btn-default\" target=\"_blank\" href=\"<?= base_url('user/store-order/print/' . $movement['movement_number']) ?>\"><?= lang('bill_of_lading_down') ?></a>\n        <?php if ($movement['movement_type'] == 'out') { ?>\n            <a class=\"btn btn-default\" href=\"<?= lang_url('user/new/invoice?create-from=store-order&number=' . $movement['movement_number']) ?>\"><?= lang('create_invoice') ?></a>\n        <?php } ?>\n    </div>\n</div>\n<hr>\n<?php if ($movement['movement_type'] != 'revision') { ?>\n    <table class=\"table table-striped\">\n        <thead>\n            <tr>\n                <th><?= lang('movement_item_name') ?></th>\n                <th><?= lang('movement_item_quantity') ?></th> \n            </tr>\n        </thead>\n        <tbody>\n            <?php foreach ($movement['items'] as $item) { ?>\n                <tr>\n                    <td><?= $item['name'] ?></td>\n                    <td><?= $item['quantity'] ?></td>\n                </tr>\n            <?php } ?>\n        </tbody>\n    </table>\n<?php } else { ?>\n    <table class=\"table table-striped\">\n        <thead>\n            <tr>\n                <th><?= lang('movement_item_name') ?></th>\n                <th><?= lang('movement_item_before_revision') ?></th> \n                <th><?= lang('movement_item_after_revision') ?></th> \n                <th><?= lang('movement_item_difference') ?></th> \n            </tr>\n        </thead>\n        <tbody>\n            <?php foreach ($movement['revision'] as $item) { ?>\n                <tr>\n                    <td><?= $item['name'] ?></td>\n                    <td><?= $item['before_revision'] ?></td>\n                    <td><?= $item['after_revision'] ?></td>\n                    <td><?= $item['difference'] ?></td>\n                </tr>\n            <?php } ?>\n        </tbody>\n    </table>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/store/stocks.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('stocks') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/store') ?>\"><?= lang('store') ?></a></li>  \n            <li class=\"active\"><?= lang('stocks') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <a href=\"<?= lang_url('user/store') ?>\" class=\"btn btn-blue\"><?= lang('back_to_movements') ?></a>\n</div> \n<?php if ($this->permissions->hasPerm('perm_view_store_stocks')) { ?>\n    <form method=\"GET\" action=\"\" class=\"site-form\">\n        <div class=\"row\">\n            <div class=\"col-sm-4\">\n                <div class=\"form-group\">\n                    <label><?= lang('my_added_stores') ?></label>\n                    <select class=\"selectpicker\" name=\"store\"> \n                        <option value=\"\"></option>\n                        <?php\n                        foreach ($myStores as $store) {\n                            ?>\n                            <option <?= isset($_GET['store']) && $_GET['store'] == $store['id'] ? 'selected=\"selected\"' : '' ?> value=\"<?= $store['id'] ?>\"><?= $store['name'] ?></option>\n                            <?php\n                        }\n                        ?> \n                    </select>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('search_store_client') ?></label>\n                    <input type=\"text\" name=\"item\" value=\"<?= isset($_GET['item']) ? $_GET['item'] : '' ?>\" class=\"form-control field\">\n                </div>\n                <input type=\"submit\" class=\"btn btn-green\" value=\"search\"> \n                <a href=\"<?= lang_url('user/store/stocks') ?>\"><?= lang('clear_search') ?></a>\n            </div>\n        </div>\n    </form>\n    <?php if (!empty($stockQuantities)) { ?>\n        <table class=\"table table-list table-striped\">\n            <thead>\n                <tr>\n                    <th>Store</th>\n                    <th>Item</th>\n                    <th>Quantity</th>\n                </tr>\n            </thead>\n            <tbody>\n                <?php\n                foreach ($stockQuantities as $stock) {\n                    ?>\n                    <tr>\n                        <td><?= $stock['store_name'] ?></td>\n                        <td><?= $stock['name'] ?></td>\n                        <td><?= $stock['quantity'] ?></td>\n                    </tr>\n                    <?php\n                }\n                ?>\n            </tbody>\n        </table>\n        <?= $linksPagination ?>\n        <?php\n    } else {\n        ?>\n        <h1 class=\"no-results-found\"><?= lang('no_stocks_yet') ?></h1>\n        <?php\n    }\n} else {\n    ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/store/templates/default.php",
    "content": "<div class=\"default-movement\">\n    <div class=\"document-type\">\n        <h1><?= $movement['translation']['bill_of_goods'] ?></h1>\n    </div>\n    <div class=\"info\">\n        <div class=\"client-info\">\n            <h1><?= $movement['translation']['recipient'] ?></h1>\n            <p><?= $movement['client']['client_name'] ?></p>\n            <p><?= $movement['client']['accountable_person'] ?></p>\n            <p><span><?= $movement['translation']['city'] ?></span> <?= $movement['client']['client_city'] ?></p>\n            <p><span><?= $movement['translation']['address'] ?></span> <?= $movement['client']['client_address'] ?></p>\n            <p><span><?= $movement['translation']['bulstat'] ?></span> <?= $movement['client']['client_bulstat'] ?></p>\n        </div>\n        <div class=\"firm-info\">\n            <h1><?= $movement['translation']['sender'] ?></h1>\n            <p><?= $movement['firm']['name'] ?></p>\n            <p><?= $movement['firm']['accountable_person'] ?></p>\n            <p><span><?= $movement['translation']['city'] ?></span> <?= $movement['firm']['city'] ?></p>\n            <p><span><?= $movement['translation']['address'] ?></span> <?= $movement['firm']['address'] ?></p>\n            <p><span><?= $movement['translation']['bulstat'] ?></span> <?= $movement['firm']['bulstat'] ?></p>\n            <?php if ($movement['firm']['is_vat_registered'] == 1) { ?>\n                <p><b><?= $movement['translation']['vat_number'] ?></b> <?= $movement['firm']['vat_number'] ?></p>\n            <?php } ?>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"document-info\">\n        <div class=\"number\">\n            № <?= $movement['movement_number'] ?>\n        </div>\n        <div class=\"date-create\">\n            <?= $movement['translation']['date'] . ' ' . date('d.m.Y', $movement['created']) ?>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"document-info\">\n        <div class=\"number\">\n            <?= $movement['translation']['lot'] . ' ' . $movement['lot'] ?>\n        </div>\n        <div class=\"date-create\">\n            <?= $movement['translation']['expire_date'] . ' ' . date('d.m.Y', $movement['expire_date']) ?>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"items\">\n        <table class=\"table table-striped\">\n            <thead>\n                <tr>\n                    <th><?= $movement['translation']['product_name'] ?></th>\n                    <th><?= $movement['translation']['product_quantity'] ?></th>\n                    <th><?= $movement['translation']['product_quantity_type'] ?></th>\n                    <th><?= $movement['translation']['single_price'] ?></th>\n                    <th><?= $movement['translation']['product_amount'] ?></th>\n                </tr>\n            </thead>\n            <tbody>\n                <?php foreach ($movement['items'] as $item) { ?>\n                    <tr>\n                        <td><?= $item['name'] ?></td>\n                        <td><?= $item['quantity'] ?></td>\n                        <td><?= $item['quantity_type'] ?></td>\n                        <td><?= $item['single_price'] ?></td>\n                        <td><?= $item['total_price'] ?></td>\n                    </tr>\n                <?php } ?>\n            </tbody>\n        </table>\n    </div>\n    <div class=\"amounts\">\n        <div class=\"payment-method\">\n            <p><?= $movement['translation']['payment_method'] ?></p>\n            <span><?= $movement['payment_method'] ?></span>\n        </div>\n        <div class=\"amount\">\n            <p><?= $movement['translation']['amount'] ?><span><?= $movement['tax_base'] ?></span></p>\n            <p><?= $movement['translation']['vat'] ?><span><?= $movement['vat_percent'] ?></span></p>\n            <p><?= $movement['translation']['vat_amount'] ?><span><?= $movement['vat_sum'] ?></span></p>\n            <p><?= $movement['translation']['final_amount'] ?><span><?= $movement['final_total'] ?></span></p>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"transmission\">\n        <div class=\"betrayed\">\n            <p><?= $movement['translation']['betrayed'] ?></p>\n            <span><?= $movement['betrayed'] ?></span>\n        </div>\n        <div class=\"accepted\">\n            <p><?= $movement['translation']['accepted'] ?></p>\n            <span><?= $movement['accepted'] ?></span>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <?php if (trim($movement['remarks']) != '') { ?>\n        <hr>\n        <p><b><?= $movement['translation']['remarks'] ?></b></p>\n        <?= $movement['remarks'] ?>\n    <?php } ?>\n</div>"
  },
  {
    "path": "application/modules/users/views/warranty/add_event.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <?= lang('add_warranty_event') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/warranties') ?>\"><?= lang('warranties') ?></a></li>  \n            <li><a href=\"<?= lang_url('user/warranty/events/' . $eventNumber) ?>\"><?= lang('warranty_events') ?></a></li>  \n            <li class=\"active\"><?= lang('add_warranty_event') ?></li>\n        </ol>\n    </div>\n</div>\n<?php if ($this->permissions->hasPerm('perm_add_warranty_events')) { ?>\n    <div class=\"row\">\n        <div class=\"col-sm-4\">\n            <form method=\"POST\" class=\"site-form\" action=\"\">\n                <div class=\"form-group\">\n                    <label><?= lang('war_event_item') ?></label>\n                    <?php foreach ($warranty['items'] as $item) { ?>\n                        <div class=\"radio\">\n                            <label><input type=\"radio\" value=\"<?= $item['name'] ?>\" name=\"item\"><?= $item['name'] ?></label>\n                        </div>\n                    <?php } ?>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('date_war_event_manupulation') ?></label>\n                    <input type=\"text\" name=\"on_date\" placeholder=\"dd.mm.yyyy\" value=\"<?= date('d.m.Y', time()) ?>\" class=\"form-control field datepicker\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('war_event_type') ?></label>\n                    <select class=\"selectpicker\" name=\"type\"> \n                        <option value=\"repair\" selected=\"\"><?= lang('repair') ?></option>\n                        <option value=\"replacement\" selected=\"\"><?= lang('replacement') ?></option>\n                    </select>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('war_event_description') ?></label>\n                    <textarea class=\"form-control\" name=\"description\" rows=\"5\"></textarea>\n                </div> \n                <button type=\"submit\" class=\"btn btn-default\"><?= lang('save_war_event') ?></button>\n                <a href=\"<?= lang_url('user/warranty/events/' . $eventNumber) ?>\" class=\"btn btn-default\"><?= lang('cancel') ?></a>\n            </form>\n        </div>\n    </div>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/warranty/addwarranty.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <?= lang('add_warranty') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/warranties') ?>\"><?= lang('warranties') ?></a></li>  \n            <li class=\"active\"><?= lang('add_warranty') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_add_warranty')) { ?>\n    <form action=\"\" id=\"setWarrantyForm\" class=\"site-form\" method=\"POST\"> \n        <?php if ($editId > 0) { ?>\n            <input type=\"hidden\" name=\"editId\" value=\"<?= $editId ?>\">\n            <input type=\"hidden\" name=\"onLoadItems\" value=\"<?= implode(',', $currentItems) ?>\">\n        <?php } ?> \n        <div class=\"row\">\n            <div class=\"col-sm-6\">  \n                <div class=\"choose-translation\">\n                    <p><?= lang('explain_war_translation') ?></p>\n                    <select class=\"selectpicker\" name=\"warranty_translation\" title=\"<?= lang('choose_war_translation') ?>\">\n                        <option value=\"2\" selected=\"\"><?= lang('default_inv_lang_fr') ?></option>\n                        <option value=\"1\"><?= lang('default_inv_lang_en') ?></option>\n                        <?php\n                        if (!empty($warrantiesLanguages)) {\n                            foreach ($warrantiesLanguages as $waLanguage) {\n                                ?>\n                                <option value=\"<?= $waLanguage['id'] ?>\"><?= $waLanguage['language_name'] ?>(<?= $waLanguage['id'] ?>)</option>\n                                <?php\n                            }\n                        }\n                        ?> \n                    </select>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalAddNewTranslation\" class=\"btn btn-default\">\n                        <?= lang('add_war_translation') ?>\n                    </a>\n                    <a href=\"javascript:void(0);\" data-toggle=\"modal\" data-target=\"#modalExplainTranslation\">\n                        <i class=\"fa fa-question-circle\" aria-hidden=\"true\"></i>\n                    </a>\n                </div>\n            </div> \n            <div class=\"col-sm-6\">\n                <div class=\"pull-right\">  \n                    <div class=\"choose-firm-translation\">\n                        <p><?= lang('explain_firm_translation') ?></p>\n                        <select class=\"selectpicker\" name=\"warranty_firm_translation\"> \n                            <?php\n                            foreach ($allForFirm['translations'] as $theFirm) {\n                                ?>\n                                <option value=\"<?= $theFirm['id'] ?>\" <?= $theFirm['is_default'] == 1 ? 'selected=\"selected\"' : '' ?>><?= $theFirm['trans_name'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                    </div>\n                </div>\n            </div>\n        </div>   \n        <div class=\"create-document\">\n            <div class=\"inner\">\n                <div class=\"row head-content\">\n                    <div class=\"col-sm-6 col-md-5\"> \n                        <div class=\"column-data client\">\n                            <label><?= lang('create_inv_client') ?></label> \n                            <input type=\"text\" name=\"client_name\" value=\"<?= isset($_POST['client']['client_name']) ? $_POST['client']['client_name'] : '' ?>\" class=\"form-control field\">\n                            <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                <span><?= lang('create_inv_choose') ?></span>\n                            </a> \n                            <div>\n                                <div class=\"checkbox\">\n                                    <label><input type=\"checkbox\" name=\"is_to_person\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'checked=\"checked\"' : '' ?> id=\"individual-client\" value=\"\"><?= lang('create_inv_individual') ?></label>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"column-data client client-company\"  <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>> \n                            <label><?= lang('create_inv_bulstat') ?></label> \n                            <input type=\"text\" name=\"client_bulstat\" value=\"<?= isset($_POST['client']['client_bulstat']) ? $_POST['client']['client_bulstat'] : '' ?>\" class=\"form-control field\">\n                            <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_client') ?>\" data-selector-type=\"client\" class=\"choose\">\n                                <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n                                <span><?= lang('create_inv_choose') ?></span>\n                            </a>\n                            <div>\n                                <div class=\"checkbox\">\n                                    <label><input type=\"checkbox\" <?= isset($_POST['client']['client_vat_registered']) && $_POST['client']['client_vat_registered'] == 1 ? 'checked=\"checked\"' : '' ?> name=\"client_vat_registered\" id=\"client-vat-registered\" value=\"\"><?= lang('create_inv_client_vat_registered') ?></label>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"column-data client-company client-vat-registered\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?> <?= isset($_POST['client_vat_registered']) && $_POST['client_vat_registered'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                            <label><?= lang('create_inv_vat_number') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['vat_number']) ? $_POST['client']['vat_number'] : '' ?>\" name=\"vat_number\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data client-company\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                            <label><?= lang('create_inv_mol') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['accountable_person']) ? $_POST['client']['accountable_person'] : '' ?>\" name=\"accountable_person\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data client-individial\" <?= isset($_POST['client']['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:block;\"' : '' ?>>\n                            <label><?= lang('create_inv_ident_num') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_ident_num']) ? $_POST['client']['client_ident_num'] : '' ?>\" name=\"client_ident_num\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data\">\n                            <label><?= lang('create_inv_city') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_city']) ? $_POST['client']['client_city'] : '' ?>\" name=\"client_city\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data\">\n                            <label><?= lang('create_inv_address') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_address']) ? $_POST['client']['client_address'] : '' ?>\" name=\"client_address\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data\">\n                            <label><?= lang('create_inv_country') ?></label>\n                            <input type=\"text\" value=\"<?= isset($_POST['client']['client_country']) ? $_POST['client']['client_country'] : '' ?>\" name=\"client_country\" class=\"form-control field\">\n                        </div>\n                        <div class=\"column-data client-company\" <?= isset($_POST['is_to_person']) && $_POST['client']['is_to_person'] == 1 ? 'style=\"display:none;\"' : '' ?>>\n                            <label><?= lang('create_inv_recipient') ?></label> \n                            <input type=\"text\" value=\"<?= isset($_POST['client']['recipient_name']) ? $_POST['client']['recipient_name'] : '' ?>\" name=\"recipient_name\" class=\"form-control field\"> \n                        </div>\n                    </div>\n                    <div class=\"col-sm-6 col-md-7\">\n                        <div class=\"invoice-setting\">\n                            <div class=\"column-data\">\n                                <span class=\"inv-type-num\"><?= lang('create_warranty_id') ?></span> <label>№:</label>\n                                <input type=\"text\" name=\"warranty_number\" value=\"<?= isset($_POST['warranty_number']) ? $_POST['warranty_number'] : $nextWarrantyNumber ?>\" class=\"form-control field\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_warranty_from_date') ?></label>\n                                <input type=\"text\" name=\"valid_from_date\" placeholder=\"dd.mm.yyyy\" value=\"<?= isset($_POST['valid_from']) ? date('d.m.Y', $_POST['valid_from']) : date('d.m.Y', time()) ?>\" class=\"form-control field datepicker\">\n                            </div>\n                            <div class=\"column-data\">\n                                <label><?= lang('create_warranty_to_inv') ?></label>\n                                <input type=\"text\" name=\"to_invoice\" placeholder=\"<?= lang('curr_name_for_int_use') ?>\" value=\"<?= isset($_POST['to_invoice']) ? $_POST['to_invoice'] : '' ?>\" class=\"form-control field\">\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"table-responsive\">\n                    <table class=\"table table-items\">\n                        <thead>\n                            <tr>\n                                <th></th>\n                                <th><?= lang('create_war_item') ?></th>\n                                <th><?= lang('create_war_months') ?></th>\n                                <th><?= lang('create_war_serial_num') ?></th> \n                            </tr>\n                        </thead>\n                        <tbody class=\"body-items\">\n                            <?php\n                            $thisDir = ltrim(str_replace(getcwd(), '', dirname(__FILE__)), '/');\n                            if (isset($_POST['items'])) {\n                                foreach ($_POST['items'] as $itemPost) {\n                                    include $thisDir . '/itemTableTr.php';\n                                }\n                            } else {\n                                include $thisDir . '/itemTableTr.php';\n                            }\n                            ?>\n                        </tbody>\n                    </table>\n                </div>\n                <div class=\"items-features\">\n                    <a href=\"javascript:void(0);\" class=\"add-new-item\">\n                        <i class=\"fa fa-plus\"></i>\n                        <?= lang('add_new_item_to_table') ?>\n                    </a>\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('warranty_conditions') ?></label>\n                    <textarea class=\"form-control\" name=\"conditions\" rows=\"5\"><?= isset($_POST['conditions']) ? $_POST['conditions'] : '' ?></textarea>\n                </div> \n                <div class=\"form-group\">\n                    <label><?= lang('select_saved_condition') ?></labe>\n                        <select class=\"selectpicker saved-condition\"> \n                            <option value=\"\" selected=\"\"></option>\n                            <?php\n                            foreach ($myConditions as $myCondition) {\n                                ?>\n                                <option value=\"<?= $myCondition['id'] ?>\"><?= $myCondition['condition_title'] ?></option>\n                                <?php\n                            }\n                            ?> \n                        </select>\n                        <?php\n                        foreach ($myConditions as $myCondition) {\n                            ?>\n                            <div class=\"hidden\" data-saved-condition=\"<?= $myCondition['id'] ?>\">\n                                <?= $myCondition['condition_description'] ?>\n                            </div>\n                            <?php\n                        }\n                        ?> \n                </div>\n                <div class=\"row\">\n                    <div class=\"col-sm-5\">\n                        <div class=\"form-group\">\n                            <label><?= lang('warranty_received') ?></label>\n                            <input type=\"text\" class=\"form-control field\" name=\"received\" value=\"<?= isset($_POST['received']) ? $_POST['received'] : '' ?>\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('warranty_compiled') ?></label>\n                            <input type=\"text\" class=\"form-control field\" name=\"compiled\" value=\"<?= isset($_POST['compiled']) ? $_POST['compiled'] : '' ?>\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"remarks\">\n                    <label><?= lang('create_inv_remarks') ?><sup><?= lang('visibile_for_client') ?></sup></label>\n                    <textarea class=\"form-control field area\" name=\"remarks\"><?= isset($_POST['remarks']) ? $_POST['remarks'] : '' ?></textarea>\n                </div> \n            </div> \n            <a href=\"javascript:void(0);\" onclick=\"validateWarranty()\" class=\"btn btn-green\"><?= lang('create_warranty') ?></a>\n            <?= lang('or') ?>\n            <a href=\"<?= lang_url('user/warranties') ?>\"><?= lang('open_warranties') ?></a>\n        </div>\n    </form>\n    <?php\n    include 'application/modules/users/views/invoices/modals/add_quantity_type.php';\n    include 'application/modules/users/views/invoices/modals/add_payment_method.php';\n    include 'application/modules/users/views/invoices/modals/selector.php';\n    ?>\n    <!-- Modal Explain Add Translations -->\n    <div class=\"modal fade\" id=\"modalExplainTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalExplainTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\"><?= lang('what_mean_new_translate') ?></h4>\n                </div>\n                <div class=\"modal-body\">\n                    <?= lang('what_mean_new_translate_explain') ?>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- Modal Create New Translation -->\n    <div class=\"modal fade\" id=\"modalAddNewTranslation\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalAddNewTranslation\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\"><?= lang('add_new_translation') ?></h4>\n                </div>\n                <div class=\"modal-body site-form\">\n                    <form method=\"POST\" action=\"\" id=\"formAddNewTranslate\">\n                        <input type=\"hidden\" name=\"addNewWarrantyTranslation\" value=\"1\">\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_language_name') ?></label>\n                            <input type=\"text\" name=\"language_name\" placeholder=\"<?= lang('lang_name_internal_use') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_warranty_card') ?></label>\n                            <input type=\"text\" name=\"warranty_card\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_date_valid') ?></label>\n                            <input type=\"text\" name=\"date_valid\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_recipient') ?></label>\n                            <input type=\"text\" name=\"recipient\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_sender') ?></label>\n                            <input type=\"text\" name=\"sender\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_bulstat') ?></label>\n                            <input type=\"text\" name=\"bulstat\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_address') ?></label>\n                            <input type=\"text\" name=\"address\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_city') ?></label>\n                            <input type=\"text\" name=\"city\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_name') ?></label>\n                            <input type=\"text\" name=\"product_name\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_months') ?></label>\n                            <input type=\"text\" name=\"product_months\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_valid_to') ?></label>\n                            <input type=\"text\" name=\"product_valid_to\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_product_serial_num') ?></label>\n                            <input type=\"text\" name=\"product_serial_num\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_page') ?></label>\n                            <input type=\"text\" name=\"page\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_city') ?></label>\n                            <input type=\"text\" name=\"city\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_remarks') ?></label>\n                            <input type=\"text\" name=\"remarks\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_received') ?></label>\n                            <input type=\"text\" name=\"received\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_compiled') ?></label>\n                            <input type=\"text\" name=\"compiled\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_signature') ?></label>\n                            <input type=\"text\" name=\"signature\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_warranty_conditions') ?></label>\n                            <input type=\"text\" name=\"warranty_conditions\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label><?= lang('trans_vat_number') ?></label>\n                            <input type=\"text\" name=\"vat_number\" placeholder=\"<?= lang('your_translation') ?>\" value=\"\" class=\"form-control field field-new-translate\">\n                        </div>\n                    </form>\n                </div>\n                <div class=\"modal-footer\">\n                    <a href=\"javascript:void(0);\" class=\"btn btn-default\" onclick=\"saveNewTranslation()\"><?= lang('save_new_translate') ?></a>\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button> \n                </div>\n            </div>\n        </div>\n    </div> \n    <?php\n    /*\n     * if edit warranty and have more from one items\n     * show action buttons\n     */\n    if (isset($_POST['items']) && count($_POST['items']) > 1) {\n        ?>\n        <style>\n            .create-document .actions {display: block;}\n        </style>\n    <?php }\n    ?>\n    <script>\n        var createDocument = {\n            rountTo: <?= $opt_movementRoundTo ?>,\n            calculatorStatus: <?= $opt_movementCalculator ?>\n        };\n    </script>\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/warranty/events.php",
    "content": "<script src=\"<?= base_url('assets/plugins/math.min.js') ?>\"></script>\n<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1>\n            <?= lang('warranty_events') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li><a href=\"<?= lang_url('user/warranties') ?>\"><?= lang('warranties') ?></a></li>  \n            <li class=\"active\"><?= lang('warranty_events') ?></li>\n        </ol>\n    </div> \n</div>\n<?php if ($this->permissions->hasPerm('perm_view_warranty_events')) { ?>\n    <a href=\"<?= lang_url('user/warranty/events/' . $eventId . '/add-event') ?>\" class=\"btn btn-default\"><?= lang('add_new_war_event') ?></a>\n    <?php\n    if (!empty($events)) {\n        foreach ($events as $event) {\n            ?>\n            <h2><?= lang('war_ev_type') ?> <?= $event['type'] ?></h2>\n            <div><?= lang('war_ev_date') ?> <?= date('d.m.Y', $event['on_date']) ?></div>\n            <div><?= lang('war_ev_item') ?> <?= $event['item'] ?></div>\n            <div><?= lang('war_ev_descr') ?> <?= $event['description'] ?></div>\n            <?php\n        }\n    } else {\n        ?>\n        <h1 class=\"no-results-found\"><?= lang('no_war_events_yet') ?></h1>\n        <?php\n    }\n    ?>\n\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>\n"
  },
  {
    "path": "application/modules/users/views/warranty/index.php",
    "content": "<div class=\"selected-page\">\n    <div class=\"inner\">\n        <h1> \n            <?= lang('warranties') ?>\n        </h1>\n        <ol class=\"breadcrumb\">\n            <li><a href=\"<?= lang_url('user') ?>\"><?= lang('home') ?></a></li> \n            <li class=\"active\"><?= lang('warranties') ?></li>\n        </ol>\n    </div> \n</div>\n<div class=\"inner-page-menu\">\n    <div class=\"left-nav-side\">\n        <a href=\"<?= lang_url('user/warranties/add-warranty') ?>\" class=\"btn btn-blue\"><?= lang('add_warranty') ?></a>\n        <a href=\"javascript:void(0);\" class=\"btn btn-blue list-action\" data-action-type=\"delete\"><?= lang('delete_warranties') ?></a>\n        <button data-toggle=\"collapse\" class=\"btn btn-blue\" data-target=\"#warranties-search\"><?= lang('search') ?></button> \n    </div>\n    <div class=\"right-nav-side\">\n        <a href=\"<?= lang_url('user/settings/warranty') ?>\" class=\"btn btn-blue\"><?= lang('warranty_settings') ?></a>\n    </div>\n    <div class=\"clearfix\"></div>\n</div> \n<?php if ($this->permissions->hasPerm('perm_view_warranty_page')) { ?>\n    <div id=\"warranties-search\" class=\"collapse <?= isset($_GET['client_name']) ? 'in' : '' ?> lists-search-form\">    \n        <form method=\"GET\" action=\"\" class=\"site-form\"> \n            <div class=\"row\">\n                <div class=\"col-sm-4\"> \n                    <div class=\"form-group\">\n                        <label><?= lang('search_store_client') ?></label>\n                        <input type=\"text\" name=\"client_name\" value=\"<?= isset($_GET['client_name']) ? $_GET['client_name'] : '' ?>\" class=\"form-control field\">\n                    </div>\n                    <div class=\"form-group\">\n                        <label><?= lang('search_date_from') ?></label>\n                        <input type=\"text\" name=\"create_from\" value=\"<?= isset($_GET['create_from']) ? $_GET['create_from'] : '' ?>\" class=\"form-control field datepicker\">\n                        <label><?= lang('search_to') ?></label>\n                        <input type=\"text\" name=\"create_to\" value=\"<?= isset($_GET['create_to']) ? $_GET['create_to'] : '' ?>\" class=\"form-control field datepicker\">\n                    </div> \n                </div>\n            </div>\n            <input type=\"submit\" class=\"btn btn-green\" value=\"search\"> \n            <a href=\"<?= lang_url('user/warranties') ?>\"><?= lang('clear_search') ?></a>\n        </form>\n    </div>\n    <?php if (!empty($warranties)) { ?>\n        <form method=\"POST\" action=\"\" id=\"action-form\">\n            <input type=\"hidden\" name=\"action\" value=\"\">\n            <div class=\"table-responsive\">\n                <table class=\"table table-list table-striped\">\n                    <thead>\n                        <tr>\n                            <th><input type=\"checkbox\" class=\"check-all-boxes\"></th>\n                            <th><?= lang('list_war_number') ?></th>\n                            <th><?= lang('list_war_to_inv') ?></th>\n                            <th><?= lang('list_war_valid_from') ?></th>\n                            <th><?= lang('list_war_client') ?></th>\n                            <th><?= lang('list_war_events') ?></th>\n                            <th class=\"text-right\"><?= lang('list_war_action') ?></th>\n                        </tr>\n                    </thead>\n                    <tbody>\n                        <?php\n                        foreach ($warranties as $warranty) {\n                            ?>\n                            <tr>\n                                <td><input type=\"checkbox\" name=\"ids[]\" value=\"<?= $warranty['id'] ?>\" class=\"check-me-now\"></td>\n                                <td><a href=\"<?= base_url('user/warranty/print/' . $warranty['warranty_number']) ?>\"><?= $warranty['warranty_number'] ?></a></td>\n                                <td><?= $warranty['to_invoice'] ?></td>\n                                <td><?= date('d.m.Y', $warranty['valid_from']) ?></td>\n                                <td><?= $warranty['client'] ?></td>\n                                <td><a href=\"<?= lang_url('user/warranty/events/' . $warranty['warranty_number']) ?>\" class=\"btn btn-default\"><?= lang('war_events') ?></a></td>\n                                <td class=\"table-options\"> \n                                    <a class=\"option\" href=\"<?= lang_url('user/warranty/edit/' . $warranty['warranty_number']) ?>\">\n                                        <span class=\"sprite-edit\"></span>\n                                    </a>\n                                </td> \n                            </tr>\n                        <?php } ?>\n                    </tbody>\n                </table>\n            </div> \n        </form>\n        <?= $linksPagination ?>\n    <?php } else { ?>\n        <h1 class=\"no-results-found\"><?= lang('no_warranties_yet') ?></h1>\n    <?php } ?>\n\n<?php } else { ?>\n    <h1 class=\"no-permissions\"><?= lang('no_permissions') ?></h1>\n<?php } ?>"
  },
  {
    "path": "application/modules/users/views/warranty/itemTableTr.php",
    "content": "<tr>\n    <td>\n        <input type=\"hidden\" name=\"is_item_update[]\" value=\"<?= isset($itemPost) ? $itemPost['id'] : '0' ?>\">\n        <div class=\"actions\">\n            <a href=\"javascript:void(0);\" class=\"btn btn-default delete-item\">\n                <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n            </a>\n            <a href=\"javascript:void(0);\" class=\"btn btn-default move-me\">\n                <i class=\"fa fa-sort\" aria-hidden=\"true\"></i>\n            </a>\n        </div>\n    </td>\n    <td>\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['name'] : '' ?>\" name=\"items_names[]\" class=\"form-control field field-item-name\">\n        <a href=\"javascript:void(0);\" data-choose-title=\"<?= lang('choose_item') ?>\" data-selector-type=\"item\" class=\"choose\">\n            <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n            <span><?= lang('create_inv_choose') ?></span>\n        </a>\n    </td>\n    <td>\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['months'] : '' ?>\" name=\"items_months[]\" class=\"form-control field field-item-months\">\n    </td>\n    <td>\n        <input type=\"text\" value=\"<?= isset($itemPost) ? $itemPost['serial'] : '' ?>\" name=\"items_serial_nums[]\" class=\"form-control field\">\n    </td> \n</tr> "
  },
  {
    "path": "application/modules/users/views/warranty/templates/default.php",
    "content": "<div class=\"default-warranty\">\n    <div class=\"document-type\">\n        <h1><?= $warranty['translation']['warranty_card'] ?></h1>\n    </div>\n    <div class=\"info\">\n        <div class=\"client-info\">\n            <h1><?= $warranty['translation']['recipient'] ?></h1>\n            <p><?= $warranty['client']['client_name'] ?></p>\n            <p><?= $warranty['client']['accountable_person'] ?></p>\n            <p><span><?= $warranty['translation']['city'] ?></span> <?= $warranty['client']['client_city'] ?></p>\n            <p><span><?= $warranty['translation']['address'] ?></span> <?= $warranty['client']['client_address'] ?></p>\n            <p><span><?= $warranty['translation']['bulstat'] ?></span> <?= $warranty['client']['client_bulstat'] ?></p>\n        </div>\n        <div class=\"firm-info\">\n            <h1><?= $warranty['translation']['sender'] ?></h1>\n            <p><?= $warranty['firm']['name'] ?></p>\n            <p><?= $warranty['firm']['accountable_person'] ?></p>\n            <p><span><?= $warranty['translation']['city'] ?></span> <?= $warranty['firm']['city'] ?></p>\n            <p><span><?= $warranty['translation']['address'] ?></span> <?= $warranty['firm']['address'] ?></p>\n            <p><span><?= $warranty['translation']['bulstat'] ?></span> <?= $warranty['firm']['bulstat'] ?></p>\n            <?php if ($warranty['firm']['is_vat_registered'] == 1) { ?>\n                <p><b><?= $warranty['translation']['vat_number'] ?></b> <?= $warranty['firm']['vat_number'] ?></p>\n            <?php } ?>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"document-info\">\n        <div class=\"number\">\n            № <?= $warranty['warranty_number'] ?>\n        </div>\n        <div class=\"date-create\">\n            <?= $warranty['translation']['date_valid'] . ' ' . date('d.m.Y', $warranty['valid_from']) ?>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <div class=\"items\">\n        <table class=\"table table-striped\">\n            <thead>\n                <tr>\n                    <th><?= $warranty['translation']['product_name'] ?></th>\n                    <th><?= $warranty['translation']['product_months'] ?></th>\n                    <th><?= $warranty['translation']['product_valid_to'] ?></th>\n                    <th><?= $warranty['translation']['product_serial_num'] ?></th> \n                </tr>\n            </thead>\n            <tbody>\n                <?php foreach ($warranty['items'] as $item) { ?>\n                    <tr>\n                        <td><?= $item['name'] ?></td>\n                        <td><?= $item['months'] ?></td>\n                        <td><?= date('d.m.Y', $item['valid_to']) ?></td>\n                        <td><?= $item['serial'] ?></td> \n                    </tr>\n                <?php } ?>\n            </tbody>\n        </table>\n    </div>\n    <div class=\"conditions\">\n        <?= $warranty['translation']['warranty_conditions'] ?>  \n        <div>\n            <?= $warranty['conditions'] ?>  \n        </div>\n    </div>\n    <div class=\"transmission\">\n        <div class=\"received\">\n            <p><?= $warranty['translation']['received'] ?> <?= $warranty['received'] ?></p> \n            <div>\n                <?= $warranty['translation']['signature'] ?>................\n            </div>\n        </div>\n        <div class=\"compiled\">\n            <p><?= $warranty['translation']['compiled'] ?> <?= $warranty['compiled'] ?></p> \n            <div>\n                <?= $warranty['translation']['signature'] ?>................\n            </div>\n        </div>\n        <div class=\"clearfix\"></div>\n    </div>\n    <?php if (trim($warranty['remarks']) != '') { ?>\n        <hr>\n        <p><b><?= $warranty['translation']['remarks'] ?></b></p>\n        <?= $warranty['remarks'] ?>\n    <?php } ?>\n</div>"
  },
  {
    "path": "application/third_party/MX/Base.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\r\n\r\n/* load MX core classes */\r\nrequire_once dirname(__FILE__).'/Lang.php';\r\nrequire_once dirname(__FILE__).'/Config.php';\r\n\r\n/**\r\n * Modular Extensions - HMVC\r\n *\r\n * Adapted from the CodeIgniter Core Classes\r\n * @link\thttp://codeigniter.com\r\n *\r\n * Description:\r\n * This library extends the CodeIgniter CI_Controller class and creates an application \r\n * object allowing use of the HMVC design pattern.\r\n *\r\n * Install this file as application/third_party/MX/Base.php\r\n *\r\n * @copyright\tCopyright (c) 2015 Wiredesignz\r\n * @version \t5.5\r\n * \r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n * \r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n * \r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n **/\r\nclass CI extends CI_Controller\r\n{\r\n\tpublic static $APP;\r\n\t\r\n\tpublic function __construct() {\r\n\t\t\r\n\t\t/* assign the application instance */\r\n\t\tself::$APP = $this;\r\n\t\t\r\n\t\tglobal $LANG, $CFG;\r\n\t\t\r\n\t\t/* re-assign language and config for modules */\r\n\t\tif ( ! $LANG instanceof MX_Lang) $LANG = new MX_Lang;\r\n\t\tif ( ! $CFG instanceof MX_Config) $CFG = new MX_Config;\r\n\t\t\r\n\t\tparent::__construct();\r\n\t}\r\n}\r\n\r\n/* create the application object */\r\nnew CI;"
  },
  {
    "path": "application/third_party/MX/Ci.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\r\n\r\n/* load MX core classes */\r\nrequire_once dirname(__FILE__).'/Lang.php';\r\nrequire_once dirname(__FILE__).'/Config.php';\r\n\r\n/**\r\n * Modular Extensions - HMVC\r\n *\r\n * Adapted from the CodeIgniter Core Classes\r\n * @link\thttp://codeigniter.com\r\n *\r\n * Description:\r\n * This library creates a CI class which allows the use of modules in an application.\r\n *\r\n * Install this file as application/third_party/MX/Ci.php\r\n *\r\n * @copyright\tCopyright (c) 2015 Wiredesignz\r\n * @version \t5.5\r\n * \r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n * \r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n * \r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n **/\r\nclass CI\r\n{\r\n\tpublic static $APP;\r\n\t\r\n\tpublic function __construct() {\r\n\t\t\r\n\t\t/* assign the application instance */\r\n\t\tself::$APP = CI_Controller::get_instance();\r\n\t\t\r\n\t\tglobal $LANG, $CFG;\r\n\t\t\r\n\t\t/* re-assign language and config for modules */\r\n\t\tif ( ! $LANG instanceof MX_Lang) $LANG = new MX_Lang;\r\n\t\tif ( ! $CFG instanceof MX_Config) $CFG = new MX_Config;\r\n\t}\r\n}\r\n\r\n/* create the application object */\r\nnew CI;"
  },
  {
    "path": "application/third_party/MX/Config.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\r\n\r\n/**\r\n * Modular Extensions - HMVC\r\n *\r\n * Adapted from the CodeIgniter Core Classes\r\n * @link\thttp://codeigniter.com\r\n *\r\n * Description:\r\n * This library extends the CodeIgniter CI_Config class\r\n * and adds features allowing use of modules and the HMVC design pattern.\r\n *\r\n * Install this file as application/third_party/MX/Config.php\r\n *\r\n * @copyright\tCopyright (c) 2015 Wiredesignz\r\n * @version \t5.5\r\n * \r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n * \r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n * \r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n **/\r\nclass MX_Config extends CI_Config \r\n{\t\r\n\tpublic function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE, $_module = '') \r\n\t{\r\n\t\tif (in_array($file, $this->is_loaded, TRUE)) return $this->item($file);\r\n\r\n\t\t$_module OR $_module = CI::$APP->router->fetch_module();\r\n\t\tlist($path, $file) = Modules::find($file, $_module, 'config/');\r\n\t\t\r\n\t\tif ($path === FALSE)\r\n\t\t{\r\n\t\t\tparent::load($file, $use_sections, $fail_gracefully);\t\t\t\t\t\r\n\t\t\treturn $this->item($file);\r\n\t\t}  \r\n\t\t\r\n\t\tif ($config = Modules::load_file($file, $path, 'config'))\r\n\t\t{\r\n\t\t\t/* reference to the config array */\r\n\t\t\t$current_config =& $this->config;\r\n\r\n\t\t\tif ($use_sections === TRUE)\t\r\n\t\t\t{\r\n\t\t\t\tif (isset($current_config[$file])) \r\n\t\t\t\t{\r\n\t\t\t\t\t$current_config[$file] = array_merge($current_config[$file], $config);\r\n\t\t\t\t} \r\n\t\t\t\telse \r\n\t\t\t\t{\r\n\t\t\t\t\t$current_config[$file] = $config;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t} \r\n\t\t\telse \r\n\t\t\t{\r\n\t\t\t\t$current_config = array_merge($current_config, $config);\r\n\t\t\t}\r\n\r\n\t\t\t$this->is_loaded[] = $file;\r\n\t\t\tunset($config);\r\n\t\t\treturn $this->item($file);\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "application/third_party/MX/Controller.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\n\n/** load the CI class for Modular Extensions **/\nrequire dirname(__FILE__).'/Base.php';\n\n/**\n * Modular Extensions - HMVC\n *\n * Adapted from the CodeIgniter Core Classes\n * @link\thttp://codeigniter.com\n *\n * Description:\n * This library replaces the CodeIgniter Controller class\n * and adds features allowing use of modules and the HMVC design pattern.\n *\n * Install this file as application/third_party/MX/Controller.php\n *\n * @copyright\tCopyright (c) 2015 Wiredesignz\n * @version \t5.5\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n **/\nclass MX_Controller \n{\n\tpublic $autoload = array();\n\t\n\tpublic function __construct() \n\t{\n\t\t$class = str_replace(CI::$APP->config->item('controller_suffix'), '', get_class($this));\n\t\tlog_message('debug', $class.\" MX_Controller Initialized\");\n\t\tModules::$registry[strtolower($class)] = $this;\t\n\t\t\n\t\t/* copy a loader instance and initialize */\n\t\t$this->load = clone load_class('Loader');\n\t\t$this->load->initialize($this);\t\n\t\t\n\t\t/* autoload module items */\n\t\t$this->load->_autoloader($this->autoload);\n\t}\n\t\n\tpublic function __get($class) \n\t{\n\t\treturn CI::$APP->$class;\n\t}\n}"
  },
  {
    "path": "application/third_party/MX/Lang.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\r\n\r\n/**\r\n * Modular Extensions - HMVC\r\n *\r\n * Adapted from the CodeIgniter Core Classes\r\n * @link\thttp://codeigniter.com\r\n *\r\n * Description:\r\n * This library extends the CodeIgniter CI_Language class\r\n * and adds features allowing use of modules and the HMVC design pattern.\r\n *\r\n * Install this file as application/third_party/MX/Lang.php\r\n *\r\n * @copyright\tCopyright (c) 2011 Wiredesignz\r\n * @version \t5.5\r\n * \r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n * \r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n * \r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n **/\r\nclass MX_Lang extends CI_Lang\r\n{\r\n\tpublic function load($langfile, $lang = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '', $_module = '')\t\r\n\t{\r\n\t\tif (is_array($langfile)) \r\n\t\t{\r\n\t\t\tforeach($langfile as $_lang) $this->load($_lang);\r\n\t\t\treturn $this->language;\r\n\t\t}\r\n\t\t\t\r\n\t\t$deft_lang = CI::$APP->config->item('language');\r\n\t\t$idiom = ($lang == '') ? $deft_lang : $lang;\r\n\t\r\n\t\tif (in_array($langfile.'_lang'.EXT, $this->is_loaded, TRUE))\r\n\t\t\treturn $this->language;\r\n\r\n\t\t$_module OR $_module = CI::$APP->router->fetch_module();\r\n\t\tlist($path, $_langfile) = Modules::find($langfile.'_lang', $_module, 'language/'.$idiom.'/');\r\n\r\n\t\tif ($path === FALSE) \r\n\t\t{\r\n\t\t\tif ($lang = parent::load($langfile, $lang, $return, $add_suffix, $alt_path)) return $lang;\r\n\t\t\r\n\t\t} \r\n\t\telse \r\n\t\t{\r\n\t\t\tif($lang = Modules::load_file($_langfile, $path, 'lang'))\r\n\t\t\t{\r\n\t\t\t\tif ($return) return $lang;\r\n\t\t\t\t$this->language = array_merge($this->language, $lang);\r\n\t\t\t\t$this->is_loaded[] = $langfile.'_lang'.EXT;\r\n\t\t\t\tunset($lang);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn $this->language;\r\n\t}\r\n}"
  },
  {
    "path": "application/third_party/MX/Loader.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\n\n/**\n * Modular Extensions - HMVC\n *\n * Adapted from the CodeIgniter Core Classes\n * @link\thttp://codeigniter.com\n *\n * Description:\n * This library extends the CodeIgniter CI_Loader class\n * and adds features allowing use of modules and the HMVC design pattern.\n *\n * Install this file as application/third_party/MX/Loader.php\n *\n * @copyright\tCopyright (c) 2015 Wiredesignz\n * @version \t5.5\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n **/\nclass MX_Loader extends CI_Loader\n{\n\tprotected $_module;\n\t\n\tpublic $_ci_plugins = array();\n\tpublic $_ci_cached_vars = array();\n\t\n\t/** Initialize the loader variables **/\n\tpublic function initialize($controller = NULL) \n\t{\n\t\t/* set the module name */\n\t\t$this->_module = CI::$APP->router->fetch_module();\n\t\t\n\t\tif ($controller instanceof MX_Controller) \n\t\t{\n\t\t\t/* reference to the module controller */\n\t\t\t$this->controller = $controller;\n\t\t\t\n\t\t\t/* references to ci loader variables */\n\t\t\tforeach (get_class_vars('CI_Loader') as $var => $val) \n\t\t\t{\n\t\t\t\tif ($var != '_ci_ob_level') \n\t\t\t\t{\n\t\t\t\t\t$this->$var =& CI::$APP->load->$var;\n\t\t\t\t}\n\t\t\t}\n\t\t} \n\t\telse \n\t\t{\n\t\t\tparent::initialize();\n\t\t\t\n\t\t\t/* autoload module items */\n\t\t\t$this->_autoloader(array());\n\t\t}\n\t\t\n\t\t/* add this module path to the loader variables */\n\t\t$this->_add_module_paths($this->_module);\n\t}\n\n\t/** Add a module path loader variables **/\n\tpublic function _add_module_paths($module = '') \n\t{\n\t\tif (empty($module)) return;\n\t\t\n\t\tforeach (Modules::$locations as $location => $offset) \n\t\t{\n\t\t\t/* only add a module path if it exists */\n\t\t\tif (is_dir($module_path = $location.$module.'/') && ! in_array($module_path, $this->_ci_model_paths)) \n\t\t\t{\n\t\t\t\tarray_unshift($this->_ci_model_paths, $module_path);\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\t/** Load a module config file **/\n\tpublic function config($file, $use_sections = FALSE, $fail_gracefully = FALSE) \n\t{\n\t\treturn CI::$APP->config->load($file, $use_sections, $fail_gracefully, $this->_module);\n\t}\n\n\t/** Load the database drivers **/\n\tpublic function database($params = '', $return = FALSE, $query_builder = NULL) \n\t{\n\t\tif ($return === FALSE && $query_builder === NULL && \n\t\t\tisset(CI::$APP->db) && is_object(CI::$APP->db) && ! empty(CI::$APP->db->conn_id))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\trequire_once BASEPATH.'database/DB'.EXT;\n\n\t\tif ($return === TRUE) return DB($params, $query_builder);\n\t\t\t\n\t\tCI::$APP->db = DB($params, $query_builder);\n\t\t\n\t\treturn $this;\n\t}\n\n\t/** Load a module helper **/\n\tpublic function helper($helper = array()) \n\t{\n\t\tif (is_array($helper)) return $this->helpers($helper);\n\t\t\n\t\tif (isset($this->_ci_helpers[$helper]))\treturn;\n\n\t\tlist($path, $_helper) = Modules::find($helper.'_helper', $this->_module, 'helpers/');\n\n\t\tif ($path === FALSE) return parent::helper($helper);\n\n\t\tModules::load_file($_helper, $path);\n\t\t$this->_ci_helpers[$_helper] = TRUE;\n\t\treturn $this;\n\t}\n\n\t/** Load an array of helpers **/\n\tpublic function helpers($helpers = array()) \n\t{\n\t\tforeach ($helpers as $_helper) $this->helper($_helper);\t\n\t\treturn $this;\n\t}\n\n\t/** Load a module language file **/\n\tpublic function language($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '') \n\t{\n\t\tCI::$APP->lang->load($langfile, $idiom, $return, $add_suffix, $alt_path, $this->_module);\n\t\treturn $this;\n\t}\n\t\n\tpublic function languages($languages) \n\t{\n\t\tforeach($languages as $_language) $this->language($_language);\n\t\treturn $this;\n\t}\n\t\n\t/** Load a module library **/\n\tpublic function library($library, $params = NULL, $object_name = NULL) \n\t{\n\t\tif (is_array($library)) return $this->libraries($library);\t\t\n\t\t\n\t\t$class = strtolower(basename($library));\n\n\t\tif (isset($this->_ci_classes[$class]) && $_alias = $this->_ci_classes[$class])\n\t\t\treturn $this;\n\t\t\t\n\t\t($_alias = strtolower($object_name)) OR $_alias = $class;\n\t\t\n\t\tlist($path, $_library) = Modules::find($library, $this->_module, 'libraries/');\n\t\t\n\t\t/* load library config file as params */\n\t\tif ($params == NULL) \n\t\t{\n\t\t\tlist($path2, $file) = Modules::find($_alias, $this->_module, 'config/');\t\n\t\t\t($path2) && $params = Modules::load_file($file, $path2, 'config');\n\t\t}\t\n\t\t\n\t\tif ($path === FALSE) \n\t\t{\n\t\t\t$this->_ci_load_library($library, $params, $object_name);\n\t\t} \n\t\telse \n\t\t{\n\t\t\tModules::load_file($_library, $path);\n\t\t\t\n\t\t\t$library = ucfirst($_library);\n\t\t\tCI::$APP->$_alias = new $library($params);\n\t\t\t\n\t\t\t$this->_ci_classes[$class] = $_alias;\n\t\t}\n\t\treturn $this;\n    }\n\n\t/** Load an array of libraries **/\n\tpublic function libraries($libraries) \n\t{\n\t\tforeach ($libraries as $_library) $this->library($_library);\n\t\treturn $this;\n\t}\n\n\t/** Load a module model **/\n\tpublic function model($model, $object_name = NULL, $connect = FALSE) \n\t{\n\t\tif (is_array($model)) return $this->models($model);\n\n\t\t($_alias = $object_name) OR $_alias = basename($model);\n\n\t\tif (in_array($_alias, $this->_ci_models, TRUE)) \n\t\t\treturn $this;\n\t\t\t\n\t\t/* check module */\n\t\tlist($path, $_model) = Modules::find(strtolower($model), $this->_module, 'models/');\n\t\t\n\t\tif ($path == FALSE)\n\t\t{\n\t\t\t/* check application & packages */\n\t\t\tparent::model($model, $object_name, $connect);\n\t\t} \n\t\telse \n\t\t{\n\t\t\tclass_exists('CI_Model', FALSE) OR load_class('Model', 'core');\n\t\t\t\n\t\t\tif ($connect !== FALSE && ! class_exists('CI_DB', FALSE)) \n\t\t\t{\n\t\t\t\tif ($connect === TRUE) $connect = '';\n\t\t\t\t$this->database($connect, FALSE, TRUE);\n\t\t\t}\n\t\t\t\n\t\t\tModules::load_file($_model, $path);\n\t\t\t\n\t\t\t$model = ucfirst($_model);\n\t\t\tCI::$APP->$_alias = new $model();\n\t\t\t\n\t\t\t$this->_ci_models[] = $_alias;\n\t\t}\n\t\treturn $this;\n\t}\n\n\t/** Load an array of models **/\n\tpublic function models($models) \n\t{\n\t\tforeach ($models as $_model) $this->model($_model);\t\n\t\treturn $this;\n\t}\n\n\t/** Load a module controller **/\n\tpublic function module($module, $params = NULL)\t\n\t{\n\t\tif (is_array($module)) return $this->modules($module);\n\n\t\t$_alias = strtolower(basename($module));\n\t\tCI::$APP->$_alias = Modules::load(array($module => $params));\n\t\treturn $this;\n\t}\n\n\t/** Load an array of controllers **/\n\tpublic function modules($modules) \n\t{\n\t\tforeach ($modules as $_module) $this->module($_module);\n\t\treturn $this;\t\n\t}\n\n\t/** Load a module plugin **/\n\tpublic function plugin($plugin)\t\n\t{\t\n\t\tif (is_array($plugin)) return $this->plugins($plugin);\t\t\n\t\t\n\t\tif (isset($this->_ci_plugins[$plugin]))\t\n\t\t\treturn $this;\n\n\t\tlist($path, $_plugin) = Modules::find($plugin.'_pi', $this->_module, 'plugins/');\t\n\t\t\n\t\tif ($path === FALSE && ! is_file($_plugin = APPPATH.'plugins/'.$_plugin.EXT)) \n\t\t{\t\n\t\t\tshow_error(\"Unable to locate the plugin file: {$_plugin}\");\n\t\t}\n\n\t\tModules::load_file($_plugin, $path);\n\t\t$this->_ci_plugins[$plugin] = TRUE;\n\t\treturn $this;\n\t}\n\n\t/** Load an array of plugins **/\n\tpublic function plugins($plugins) \n\t{\n\t\tforeach ($plugins as $_plugin) $this->plugin($_plugin);\n\t\treturn $this;\t\n\t}\n\n\t/** Load a module view **/\n\tpublic function view($view, $vars = array(), $return = FALSE) \n\t{\n\t\tlist($path, $_view) = Modules::find($view, $this->_module, 'views/');\n\t\t\n\t\tif ($path != FALSE) \n\t\t{\n\t\t\t$this->_ci_view_paths = array($path => TRUE) + $this->_ci_view_paths;\n\t\t\t$view = $_view;\n\t\t}\n\t\t\n\t\treturn $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));\n\t}\n\n    protected function _ci_object_to_array($object) {\n        return is_object($object) ? get_object_vars($object) : $object;\n    }\n\n\tprotected function &_ci_get_component($component) \n\t{\n\t\treturn CI::$APP->$component;\n\t} \n\n\tpublic function __get($class) \n\t{\n\t\treturn (isset($this->controller)) ? $this->controller->$class : CI::$APP->$class;\n\t}\n\n\tpublic function _ci_load($_ci_data) \n\t{\n\t\textract($_ci_data);\n\t\t\n\t\tif (isset($_ci_view)) \n\t\t{\n\t\t\t$_ci_path = '';\n\t\t\t\n\t\t\t/* add file extension if not provided */\n\t\t\t$_ci_file = (pathinfo($_ci_view, PATHINFO_EXTENSION)) ? $_ci_view : $_ci_view.EXT;\n\t\t\t\n\t\t\tforeach ($this->_ci_view_paths as $path => $cascade) \n\t\t\t{\t\t\t\t\n\t\t\t\tif (file_exists($view = $path.$_ci_file)) \n\t\t\t\t{\n\t\t\t\t\t$_ci_path = $view;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( ! $cascade) break;\n\t\t\t}\t\n\t\t} \n\t\telseif (isset($_ci_path)) \n\t\t{\n\t\t\t\n\t\t\t$_ci_file = basename($_ci_path);\n\t\t\tif( ! file_exists($_ci_path)) $_ci_path = '';\n\t\t}\n\n\t\tif (empty($_ci_path)) \n\t\t\tshow_error('Unable to load the requested file: '.$_ci_file);\n\n\t\tif (isset($_ci_vars)) \n\t\t\t$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, (array) $_ci_vars);\n\t\t\n\t\textract($this->_ci_cached_vars);\n\n\t\tob_start();\n\n\t\tif ((bool) @ini_get('short_open_tag') === FALSE && CI::$APP->config->item('rewrite_short_tags') == TRUE) \n\t\t{\n\t\t\techo eval('?>'.preg_replace(\"/;*\\s*\\?>/\", \"; ?>\", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));\n\t\t} \n\t\telse \n\t\t{\n\t\t\tinclude($_ci_path); \n\t\t}\n\n\t\tlog_message('debug', 'File loaded: '.$_ci_path);\n\n\t\tif ($_ci_return == TRUE) return ob_get_clean();\n\n\t\tif (ob_get_level() > $this->_ci_ob_level + 1) \n\t\t{\n\t\t\tob_end_flush();\n\t\t} \n\t\telse \n\t\t{\n\t\t\tCI::$APP->output->append_output(ob_get_clean());\n\t\t}\n\t}\n\t\n\t/** Autoload module items **/\n\tpublic function _autoloader($autoload) \n\t{\n\t\t$path = FALSE;\n\t\t\n\t\tif ($this->_module) \n\t\t{\n\t\t\tlist($path, $file) = Modules::find('constants', $this->_module, 'config/');\t\n\t\t\t\n\t\t\t/* module constants file */\n\t\t\tif ($path != FALSE) \n\t\t\t{\n\t\t\t\tinclude_once $path.$file.EXT;\n\t\t\t}\n\t\t\t\t\t\n\t\t\tlist($path, $file) = Modules::find('autoload', $this->_module, 'config/');\n\t\t\n\t\t\t/* module autoload file */\n\t\t\tif ($path != FALSE) \n\t\t\t{\n\t\t\t\t$autoload = array_merge(Modules::load_file($file, $path, 'autoload'), $autoload);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* nothing to do */\n\t\tif (count($autoload) == 0) return;\n\t\t\n\t\t/* autoload package paths */\n\t\tif (isset($autoload['packages'])) \n\t\t{\n\t\t\tforeach ($autoload['packages'] as $package_path) \n\t\t\t{\n\t\t\t\t$this->add_package_path($package_path);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\t/* autoload config */\n\t\tif (isset($autoload['config'])) \n\t\t{\n\t\t\tforeach ($autoload['config'] as $config) \n\t\t\t{\n\t\t\t\t$this->config($config);\n\t\t\t}\n\t\t}\n\n\t\t/* autoload helpers, plugins, languages */\n\t\tforeach (array('helper', 'plugin', 'language') as $type) \n\t\t{\n\t\t\tif (isset($autoload[$type]))\n\t\t\t{\n\t\t\t\tforeach ($autoload[$type] as $item) \n\t\t\t\t{\n\t\t\t\t\t$this->$type($item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\n\t\t\t\n\t\t/* autoload database & libraries */\n\t\tif (isset($autoload['libraries'])) \n\t\t{\n\t\t\tif (in_array('database', $autoload['libraries'])) \n\t\t\t{\n\t\t\t\t/* autoload database */\n\t\t\t\tif ( ! $db = CI::$APP->config->item('database')) \n\t\t\t\t{\n\t\t\t\t\t$this->database();\n\t\t\t\t\t$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* autoload libraries */\n\t\t\tforeach ($autoload['libraries'] as $library) \n\t\t\t{\n\t\t\t\t$this->library($library);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* autoload models */\n\t\tif (isset($autoload['model'])) \n\t\t{\n\t\t\tforeach ($autoload['model'] as $model => $alias)\n\t\t\t{\n\t\t\t\t(is_numeric($model)) ? $this->model($alias) : $this->model($model, $alias);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* autoload module controllers */\n\t\tif (isset($autoload['modules'])) \n\t\t{\n\t\t\tforeach ($autoload['modules'] as $controller) \n\t\t\t{\n\t\t\t\t($controller != $this->_module) && $this->module($controller);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** load the CI class for Modular Separation **/\n(class_exists('CI', FALSE)) OR require dirname(__FILE__).'/Ci.php';"
  },
  {
    "path": "application/third_party/MX/Modules.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\n\n(defined('EXT')) OR define('EXT', '.php');\n\nglobal $CFG;\n\n/* get module locations from config settings or use the default module location and offset */\nis_array(Modules::$locations = $CFG->item('modules_locations')) OR Modules::$locations = array(\n\tAPPPATH.'modules/' => '../modules/',\n);\n\n/* PHP5 spl_autoload */\nspl_autoload_register('Modules::autoload');\n\n/**\n * Modular Extensions - HMVC\n *\n * Adapted from the CodeIgniter Core Classes\n * @link\thttp://codeigniter.com\n *\n * Description:\n * This library provides functions to load and instantiate controllers\n * and module controllers allowing use of modules and the HMVC design pattern.\n *\n * Install this file as application/third_party/MX/Modules.php\n *\n * @copyright\tCopyright (c) 2015 Wiredesignz\n * @version \t5.5\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n **/\nclass Modules\n{\n\tpublic static $routes, $registry, $locations;\n\t\n\t/**\n\t* Run a module controller method\n\t* Output from module is buffered and returned.\n\t**/\n\tpublic static function run($module) \n\t{\t\n\t\t$method = 'index';\n\t\t\n\t\tif(($pos = strrpos($module, '/')) != FALSE) \n\t\t{\n\t\t\t$method = substr($module, $pos + 1);\t\t\n\t\t\t$module = substr($module, 0, $pos);\n\t\t}\n\n\t\tif($class = self::load($module)) \n\t\t{\t\n\t\t\tif (method_exists($class, $method))\t{\n\t\t\t\tob_start();\n\t\t\t\t$args = func_get_args();\n\t\t\t\t$output = call_user_func_array(array($class, $method), array_slice($args, 1));\n\t\t\t\t$buffer = ob_get_clean();\n\t\t\t\treturn ($output !== NULL) ? $output : $buffer;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlog_message('error', \"Module controller failed to run: {$module}/{$method}\");\n\t}\n\t\n\t/** Load a module controller **/\n\tpublic static function load($module) \n\t{\n\t\t(is_array($module)) ? list($module, $params) = each($module) : $params = NULL;\t\n\t\t\n\t\t/* get the requested controller class name */\n\t\t$alias = strtolower(basename($module));\n\n\t\t/* create or return an existing controller from the registry */\n\t\tif ( ! isset(self::$registry[$alias])) \n\t\t{\n\t\t\t/* find the controller */\n\t\t\tlist($class) = CI::$APP->router->locate(explode('/', $module));\n\t\n\t\t\t/* controller cannot be located */\n\t\t\tif (empty($class)) return;\n\t\n\t\t\t/* set the module directory */\n\t\t\t$path = APPPATH.'controllers/'.CI::$APP->router->directory;\n\t\t\t\n\t\t\t/* load the controller class */\n\t\t\t$class = $class.CI::$APP->config->item('controller_suffix');\n\t\t\tself::load_file(ucfirst($class), $path);\n\t\t\t\n\t\t\t/* create and register the new controller */\n\t\t\t$controller = ucfirst($class);\t\n\t\t\tself::$registry[$alias] = new $controller($params);\n\t\t}\n\t\t\n\t\treturn self::$registry[$alias];\n\t}\n\t\n\t/** Library base class autoload **/\n\tpublic static function autoload($class) \n\t{\t\n\t\t/* don't autoload CI_ prefixed classes or those using the config subclass_prefix */\n\t\tif (strstr($class, 'CI_') OR strstr($class, config_item('subclass_prefix'))) return;\n\n\t\t/* autoload Modular Extensions MX core classes */\n\t\tif (strstr($class, 'MX_')) \n\t\t{\n\t\t\tif (is_file($location = dirname(__FILE__).'/'.substr($class, 3).EXT)) \n\t\t\t{\n\t\t\t\tinclude_once $location;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tshow_error('Failed to load MX core class: '.$class);\n\t\t}\n\t\t\n\t\t/* autoload core classes */\n\t\tif(is_file($location = APPPATH.'core/'.ucfirst($class).EXT)) \n\t\t{\n\t\t\tinclude_once $location;\n\t\t\treturn;\n\t\t}\t\t\n\t\t\n\t\t/* autoload library classes */\n\t\tif(is_file($location = APPPATH.'libraries/'.ucfirst($class).EXT)) \n\t\t{\n\t\t\tinclude_once $location;\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\n\t/** Load a module file **/\n\tpublic static function load_file($file, $path, $type = 'other', $result = TRUE)\t\n\t{\n\t\t$file = str_replace(EXT, '', $file);\t\t\n\t\t$location = $path.$file.EXT;\n\t\t\n\t\tif ($type === 'other') \n\t\t{\t\t\t\n\t\t\tif (class_exists($file, FALSE))\t\n\t\t\t{\n\t\t\t\tlog_message('debug', \"File already loaded: {$location}\");\t\t\t\t\n\t\t\t\treturn $result;\n\t\t\t}\t\n\t\t\tinclude_once $location;\n\t\t} \n\t\telse \n\t\t{\n\t\t\t/* load config or language array */\n\t\t\tinclude $location;\n\n\t\t\tif ( ! isset($$type) OR ! is_array($$type))\t\t\t\t\n\t\t\t\tshow_error(\"{$location} does not contain a valid {$type} array\");\n\n\t\t\t$result = $$type;\n\t\t}\n\t\tlog_message('debug', \"File loaded: {$location}\");\n\t\treturn $result;\n\t}\n\n\t/** \n\t* Find a file\n\t* Scans for files located within modules directories.\n\t* Also scans application directories for models, plugins and views.\n\t* Generates fatal error if file not found.\n\t**/\n\tpublic static function find($file, $module, $base) \n\t{\n\t\t$segments = explode('/', $file);\n\n\t\t$file = array_pop($segments);\n\t\t$file_ext = (pathinfo($file, PATHINFO_EXTENSION)) ? $file : $file.EXT;\n\t\t\n\t\t$path = ltrim(implode('/', $segments).'/', '/');\t\n\t\t$module ? $modules[$module] = $path : $modules = array();\n\t\t\n\t\tif ( ! empty($segments)) \n\t\t{\n\t\t\t$modules[array_shift($segments)] = ltrim(implode('/', $segments).'/','/');\n\t\t}\t\n\n\t\tforeach (Modules::$locations as $location => $offset) \n\t\t{\t\t\t\t\t\n\t\t\tforeach($modules as $module => $subpath) \n\t\t\t{\t\t\t\n\t\t\t\t$fullpath = $location.$module.'/'.$base.$subpath;\n\t\t\t\t\n\t\t\t\tif ($base == 'libraries/' OR $base == 'models/')\n\t\t\t\t{\n\t\t\t\t\tif(is_file($fullpath.ucfirst($file_ext))) return array($fullpath, ucfirst($file));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t/* load non-class files */\n\t\t\t\tif (is_file($fullpath.$file_ext)) return array($fullpath, $file);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn array(FALSE, $file);\t\n\t}\n\t\n\t/** Parse module routes **/\n\tpublic static function parse_routes($module, $uri) \n\t{\n\t\t/* load the route file */\n\t\tif ( ! isset(self::$routes[$module])) \n\t\t{\n\t\t\tif (list($path) = self::find('routes', $module, 'config/'))\n\t\t\t{\n\t\t\t\t$path && self::$routes[$module] = self::load_file('routes', $path, 'route');\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset(self::$routes[$module])) return;\n\t\t\t\n\t\t/* parse module routes */\n\t\tforeach (self::$routes[$module] as $key => $val) \n\t\t{\t\t\t\t\t\t\n\t\t\t$key = str_replace(array(':any', ':num'), array('.+', '[0-9]+'), $key);\n\t\t\t\n\t\t\tif (preg_match('#^'.$key.'$#', $uri)) \n\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\tif (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE) \n\t\t\t\t{\n\t\t\t\t\t$val = preg_replace('#^'.$key.'$#', $val, $uri);\n\t\t\t\t}\n\t\t\t\treturn explode('/', $module.'/'.$val);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "application/third_party/MX/Router.php",
    "content": "<?php (defined('BASEPATH')) OR exit('No direct script access allowed');\n\n/* load the MX core module class */\nrequire dirname(__FILE__).'/Modules.php';\n\n/**\n * Modular Extensions - HMVC\n *\n * Adapted from the CodeIgniter Core Classes\n * @link\thttp://codeigniter.com\n *\n * Description:\n * This library extends the CodeIgniter router class.\n *\n * Install this file as application/third_party/MX/Router.php\n *\n * @copyright\tCopyright (c) 2015 Wiredesignz\n * @version \t5.5\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n **/\nclass MX_Router extends CI_Router\n{\n\tpublic $module;\n\tprivate $located = 0;\n\n\tpublic function fetch_module()\n\t{\n\t\treturn $this->module;\n\t}\n\n\tprotected function _set_request($segments = array())\n\t{\n\t\tif ($this->translate_uri_dashes === TRUE)\n\t\t{\n\t\t\tforeach(range(0, 2) as $v)\n\t\t\t{\n\t\t\t\tisset($segments[$v]) && $segments[$v] = str_replace('-', '_', $segments[$v]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t$segments = $this->locate($segments);\n\n\t\tif($this->located == -1)\n\t\t{\n\t\t\t$this->_set_404override_controller();\n\t\t\treturn;\n\t\t}\n\n\t\tif(empty($segments))\n\t\t{\n\t\t\t$this->_set_default_controller();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t$this->set_class($segments[0]);\n\t\t\n\t\tif (isset($segments[1]))\n\t\t{\n\t\t\t$this->set_method($segments[1]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$segments[1] = 'index';\n\t\t}\n       \n\t\tarray_unshift($segments, NULL);\n\t\tunset($segments[0]);\n\t\t$this->uri->rsegments = $segments;\n\t}\n\t\n\tprotected function _set_404override_controller()\n\t{\n\t\t$this->_set_module_path($this->routes['404_override']);\n\t}\n\n\tprotected function _set_default_controller()\n\t{\n\t\tif (empty($this->directory))\n\t\t{\n\t\t\t/* set the default controller module path */\n\t\t\t$this->_set_module_path($this->default_controller);\n\t\t}\n\n\t\tparent::_set_default_controller();\n\t\t\n\t\tif(empty($this->class))\n\t\t{\n\t\t\t$this->_set_404override_controller();\n\t\t}\n\t}\n\n\t/** Locate the controller **/\n\tpublic function locate($segments)\n\t{\n\t\t$this->located = 0;\n\t\t$ext = $this->config->item('controller_suffix').EXT;\n\n\t\t/* use module route if available */\n\t\tif (isset($segments[0]) && $routes = Modules::parse_routes($segments[0], implode('/', $segments)))\n\t\t{\n\t\t\t$segments = $routes;\n\t\t}\n\n\t\t/* get the segments array elements */\n\t\tlist($module, $directory, $controller) = array_pad($segments, 3, NULL);\n\n\t\t/* check modules */\n\t\tforeach (Modules::$locations as $location => $offset)\n\t\t{\n\t\t\t/* module exists? */\n\t\t\tif (is_dir($source = $location.$module.'/controllers/'))\n\t\t\t{\n\t\t\t\t$this->module = $module;\n\t\t\t\t$this->directory = $offset.$module.'/controllers/';\n\n\t\t\t\t/* module sub-controller exists? */\n\t\t\t\tif($directory)\n\t\t\t\t{\n\t\t\t\t\t/* module sub-directory exists? */\n\t\t\t\t\tif(is_dir($source.$directory.'/'))\n\t\t\t\t\t{\t\n\t\t\t\t\t\t$source .= $directory.'/';\n\t\t\t\t\t\t$this->directory .= $directory.'/';\n\n\t\t\t\t\t\t/* module sub-directory controller exists? */\n\t\t\t\t\t\tif($controller)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(is_file($source.ucfirst($controller).$ext))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$this->located = 3;\n\t\t\t\t\t\t\t\treturn array_slice($segments, 2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse $this->located = -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\tif(is_file($source.ucfirst($directory).$ext))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->located = 2;\n\t\t\t\t\t\treturn array_slice($segments, 1);\n\t\t\t\t\t}\n\t\t\t\t\telse $this->located = -1;\n\t\t\t\t}\n\n\t\t\t\t/* module controller exists? */\n\t\t\t\tif(is_file($source.ucfirst($module).$ext))\n\t\t\t\t{\n\t\t\t\t\t$this->located = 1;\n\t\t\t\t\treturn $segments;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( ! empty($this->directory)) return;\n\n\t\t/* application sub-directory controller exists? */\n\t\tif($directory)\n\t\t{\n\t\t\tif(is_file(APPPATH.'controllers/'.$module.'/'.ucfirst($directory).$ext))\n\t\t\t{\n\t\t\t\t$this->directory = $module.'/';\n\t\t\t\treturn array_slice($segments, 1);\n\t\t\t}\n\n\t\t\t/* application sub-sub-directory controller exists? */\n\t\t\tif($controller)\n\t\t\t{ \n\t\t\t\tif(is_file(APPPATH.'controllers/'.$module.'/'.$directory.'/'.ucfirst($controller).$ext))\n\t\t\t\t{\n\t\t\t\t\t$this->directory = $module.'/'.$directory.'/';\n\t\t\t\t\treturn array_slice($segments, 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* application controllers sub-directory exists? */\n\t\tif (is_dir(APPPATH.'controllers/'.$module.'/'))\n\t\t{\n\t\t\t$this->directory = $module.'/';\n\t\t\treturn array_slice($segments, 1);\n\t\t}\n\n\t\t/* application controller exists? */\n\t\tif (is_file(APPPATH.'controllers/'.ucfirst($module).$ext))\n\t\t{\n\t\t\treturn $segments;\n\t\t}\n\t\t\n\t\t$this->located = -1;\n\t}\n\n\t/* set module path */\n\tprotected function _set_module_path(&$_route)\n\t{\n\t\tif ( ! empty($_route))\n\t\t{\n\t\t\t// Are module/directory/controller/method segments being specified?\n\t\t\t$sgs = sscanf($_route, '%[^/]/%[^/]/%[^/]/%s', $module, $directory, $class, $method);\n\t\t\t\n\t\t\t// set the module/controller directory location if found\n\t\t\tif ($this->locate(array($module, $directory, $class)))\n\t\t\t{\n\t\t\t\t//reset to class/method\n\t\t\t\tswitch ($sgs)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\t$_route = $module.'/index';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2: $_route = ($this->located < 2) ? $module.'/'.$directory : $directory.'/index';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3: $_route = ($this->located == 2) ? $directory.'/'.$class : $class.'/index';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4: $_route = ($this->located == 3) ? $class.'/'.$method : $method.'/index';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function set_class($class)\n\t{\n\t\t$suffix = $this->config->item('controller_suffix');\n\t\tif ($suffix && strpos($class, $suffix) === FALSE)\n\t\t{\n\t\t\t$class .= $suffix;\n\t\t}\n\t\tparent::set_class($class);\n\t}\n}"
  },
  {
    "path": "application/third_party/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/views/errors/cli/error_404.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\necho \"\\nERROR: \",\n\t$heading,\n\t\"\\n\\n\",\n\t$message,\n\t\"\\n\\n\";"
  },
  {
    "path": "application/views/errors/cli/error_db.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\necho \"\\nDatabase error: \",\n\t$heading,\n\t\"\\n\\n\",\n\t$message,\n\t\"\\n\\n\";"
  },
  {
    "path": "application/views/errors/cli/error_exception.php",
    "content": "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\nAn uncaught Exception was encountered\n\nType:        <?php echo get_class($exception), \"\\n\"; ?>\nMessage:     <?php echo $message, \"\\n\"; ?>\nFilename:    <?php echo $exception->getFile(), \"\\n\"; ?>\nLine Number: <?php echo $exception->getLine(); ?>\n\n<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === TRUE): ?>\n\nBacktrace:\n<?php\tforeach ($exception->getTrace() as $error): ?>\n<?php\t\tif (isset($error['file']) && strpos($error['file'], realpath(BASEPATH)) !== 0): ?>\n\tFile: <?php echo $error['file'], \"\\n\"; ?>\n\tLine: <?php echo $error['line'], \"\\n\"; ?>\n\tFunction: <?php echo $error['function'], \"\\n\\n\"; ?>\n<?php\t\tendif ?>\n<?php\tendforeach ?>\n\n<?php endif ?>\n"
  },
  {
    "path": "application/views/errors/cli/error_general.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\necho \"\\nERROR: \",\n\t$heading,\n\t\"\\n\\n\",\n\t$message,\n\t\"\\n\\n\";"
  },
  {
    "path": "application/views/errors/cli/error_php.php",
    "content": "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\nA PHP Error was encountered\n\nSeverity:    <?php echo $severity, \"\\n\"; ?>\nMessage:     <?php echo $message, \"\\n\"; ?>\nFilename:    <?php echo $filepath, \"\\n\"; ?>\nLine Number: <?php echo $line; ?>\n\n<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === TRUE): ?>\n\nBacktrace:\n<?php\tforeach (debug_backtrace() as $error): ?>\n<?php\t\tif (isset($error['file']) && strpos($error['file'], realpath(BASEPATH)) !== 0): ?>\n\tFile: <?php echo $error['file'], \"\\n\"; ?>\n\tLine: <?php echo $error['line'], \"\\n\"; ?>\n\tFunction: <?php echo $error['function'], \"\\n\\n\"; ?>\n<?php\t\tendif ?>\n<?php\tendforeach ?>\n\n<?php endif ?>\n"
  },
  {
    "path": "application/views/errors/cli/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/views/errors/html/error_404.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?><!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>404 Page Not Found</title>\n<style type=\"text/css\">\n\n::selection { background-color: #E13300; color: white; }\n::-moz-selection { background-color: #E13300; color: white; }\n\nbody {\n\tbackground-color: #fff;\n\tmargin: 40px;\n\tfont: 13px/20px normal Helvetica, Arial, sans-serif;\n\tcolor: #4F5155;\n}\n\na {\n\tcolor: #003399;\n\tbackground-color: transparent;\n\tfont-weight: normal;\n}\n\nh1 {\n\tcolor: #444;\n\tbackground-color: transparent;\n\tborder-bottom: 1px solid #D0D0D0;\n\tfont-size: 19px;\n\tfont-weight: normal;\n\tmargin: 0 0 14px 0;\n\tpadding: 14px 15px 10px 15px;\n}\n\ncode {\n\tfont-family: Consolas, Monaco, Courier New, Courier, monospace;\n\tfont-size: 12px;\n\tbackground-color: #f9f9f9;\n\tborder: 1px solid #D0D0D0;\n\tcolor: #002166;\n\tdisplay: block;\n\tmargin: 14px 0 14px 0;\n\tpadding: 12px 10px 12px 10px;\n}\n\n#container {\n\tmargin: 10px;\n\tborder: 1px solid #D0D0D0;\n\tbox-shadow: 0 0 8px #D0D0D0;\n}\n\np {\n\tmargin: 12px 15px 12px 15px;\n}\n</style>\n</head>\n<body>\n\t<div id=\"container\">\n\t\t<h1><?php echo $heading; ?></h1>\n\t\t<?php echo $message; ?>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "application/views/errors/html/error_db.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?><!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Database Error</title>\n<style type=\"text/css\">\n\n::selection { background-color: #E13300; color: white; }\n::-moz-selection { background-color: #E13300; color: white; }\n\nbody {\n\tbackground-color: #fff;\n\tmargin: 40px;\n\tfont: 13px/20px normal Helvetica, Arial, sans-serif;\n\tcolor: #4F5155;\n}\n\na {\n\tcolor: #003399;\n\tbackground-color: transparent;\n\tfont-weight: normal;\n}\n\nh1 {\n\tcolor: #444;\n\tbackground-color: transparent;\n\tborder-bottom: 1px solid #D0D0D0;\n\tfont-size: 19px;\n\tfont-weight: normal;\n\tmargin: 0 0 14px 0;\n\tpadding: 14px 15px 10px 15px;\n}\n\ncode {\n\tfont-family: Consolas, Monaco, Courier New, Courier, monospace;\n\tfont-size: 12px;\n\tbackground-color: #f9f9f9;\n\tborder: 1px solid #D0D0D0;\n\tcolor: #002166;\n\tdisplay: block;\n\tmargin: 14px 0 14px 0;\n\tpadding: 12px 10px 12px 10px;\n}\n\n#container {\n\tmargin: 10px;\n\tborder: 1px solid #D0D0D0;\n\tbox-shadow: 0 0 8px #D0D0D0;\n}\n\np {\n\tmargin: 12px 15px 12px 15px;\n}\n</style>\n</head>\n<body>\n\t<div id=\"container\">\n\t\t<h1><?php echo $heading; ?></h1>\n\t\t<?php echo $message; ?>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "application/views/errors/html/error_exception.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?>\n\n<div style=\"border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;\">\n\n<h4>An uncaught Exception was encountered</h4>\n\n<p>Type: <?php echo get_class($exception); ?></p>\n<p>Message: <?php echo $message; ?></p>\n<p>Filename: <?php echo $exception->getFile(); ?></p>\n<p>Line Number: <?php echo $exception->getLine(); ?></p>\n\n<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === TRUE): ?>\n\n\t<p>Backtrace:</p>\n\t<?php foreach ($exception->getTrace() as $error): ?>\n\n\t\t<?php if (isset($error['file']) && strpos($error['file'], realpath(BASEPATH)) !== 0): ?>\n\n\t\t\t<p style=\"margin-left:10px\">\n\t\t\tFile: <?php echo $error['file']; ?><br />\n\t\t\tLine: <?php echo $error['line']; ?><br />\n\t\t\tFunction: <?php echo $error['function']; ?>\n\t\t\t</p>\n\t\t<?php endif ?>\n\n\t<?php endforeach ?>\n\n<?php endif ?>\n\n</div>"
  },
  {
    "path": "application/views/errors/html/error_general.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?><!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Error</title>\n<style type=\"text/css\">\n\n::selection { background-color: #E13300; color: white; }\n::-moz-selection { background-color: #E13300; color: white; }\n\nbody {\n\tbackground-color: #fff;\n\tmargin: 40px;\n\tfont: 13px/20px normal Helvetica, Arial, sans-serif;\n\tcolor: #4F5155;\n}\n\na {\n\tcolor: #003399;\n\tbackground-color: transparent;\n\tfont-weight: normal;\n}\n\nh1 {\n\tcolor: #444;\n\tbackground-color: transparent;\n\tborder-bottom: 1px solid #D0D0D0;\n\tfont-size: 19px;\n\tfont-weight: normal;\n\tmargin: 0 0 14px 0;\n\tpadding: 14px 15px 10px 15px;\n}\n\ncode {\n\tfont-family: Consolas, Monaco, Courier New, Courier, monospace;\n\tfont-size: 12px;\n\tbackground-color: #f9f9f9;\n\tborder: 1px solid #D0D0D0;\n\tcolor: #002166;\n\tdisplay: block;\n\tmargin: 14px 0 14px 0;\n\tpadding: 12px 10px 12px 10px;\n}\n\n#container {\n\tmargin: 10px;\n\tborder: 1px solid #D0D0D0;\n\tbox-shadow: 0 0 8px #D0D0D0;\n}\n\np {\n\tmargin: 12px 15px 12px 15px;\n}\n</style>\n</head>\n<body>\n\t<div id=\"container\">\n\t\t<h1><?php echo $heading; ?></h1>\n\t\t<?php echo $message; ?>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "application/views/errors/html/error_php.php",
    "content": "<?php\ndefined('BASEPATH') OR exit('No direct script access allowed');\n?>\n\n<div style=\"border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;\">\n\n<h4>A PHP Error was encountered</h4>\n\n<p>Severity: <?php echo $severity; ?></p>\n<p>Message:  <?php echo $message; ?></p>\n<p>Filename: <?php echo $filepath; ?></p>\n<p>Line Number: <?php echo $line; ?></p>\n\n<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === TRUE): ?>\n\n\t<p>Backtrace:</p>\n\t<?php foreach (debug_backtrace() as $error): ?>\n\n\t\t<?php if (isset($error['file']) && strpos($error['file'], realpath(BASEPATH)) !== 0): ?>\n\n\t\t\t<p style=\"margin-left:10px\">\n\t\t\tFile: <?php echo $error['file'] ?><br />\n\t\t\tLine: <?php echo $error['line'] ?><br />\n\t\t\tFunction: <?php echo $error['function'] ?>\n\t\t\t</p>\n\n\t\t<?php endif ?>\n\n\t<?php endforeach ?>\n\n<?php endif ?>\n\n</div>"
  },
  {
    "path": "application/views/errors/html/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/views/errors/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/views/home/index.php",
    "content": "<div class=\"limiter\" id=\"login\">\n        <div class=\"container-login100\" style=\"background-image:url(https://img.freepik.com/free-photo/woman-doing-accounting_53876-16.jpg?w=1800&t=st=1661596285~exp=1661596885~hmac=3ad5e212c6eabb7f195a5bf5c8c5bd949c6a3ee2cd0d41491e39ca01fe3379c1)\">\n            <div class=\"container\">\n                <div class=\"row\">\n                    <div class=\"col-md-6\"></div>\n                    <div class=\"col-md-5 col-md-offset-1\">\n                        <div class=\"login_topimg\">\n                        </div>\n                        <div class=\"wrap-login100\">\n                            <?php if (!isset($_SESSION['user_login'])) { ?>\n                                <form class=\"login100-form validate-form\" action=\"<?= lang_url('login') ?>\" method=\"POST\"> \n                                    \n                                    <span class=\"login100-form-title \"> Login </span> \n                                    <span class=\"login100-form-subtitle m-b-16\"> to your account </span>\n                                    \n                                    <div class=\"wrap-input100 validate-input m-b-16\"> \n                                        <input class=\"input100\" type=\"text\" name=\"email\" placeholder=\"<?= lang('login_email') ?>\">\n                                        <span class=\"symbol-input100\">\n                                            <span class=\"glyphicon glyphicon-user\"></span> \n                                        </span>\n                                    </div>\n\n                                    <div class=\"wrap-input100 validate-input m-b-16\"> \n                                        <input class=\"input100\" type=\"password\" name=\"password\" placeholder=\"<?= lang('login_pass') ?>\"> \n                                        <span class=\"focus-input100\"></span> <span class=\"symbol-input100\"> \n                                            <span class=\"glyphicon glyphicon-lock\"></span> \n                                        </span> \n                                    </div>\n                                    \n                                    <div class=\"flex-sb-m w-full p-b-30\">\n                                        <div>\n                                            <a href=\"<?= lang_url('registration') ?>\" class=\"txt1\">\n                                                <?= lang('btn_register') ?>\n                                            </a>\n                                        </div>\n                                    </div>\n                                    <div class=\"container-login100-form-btn p-t-25\">\n                                        <button type=\"submit\" class=\"login100-form-btn\"> <?= lang('btn_logme') ?> </button>\n                                    </div>\n\n                                </form>\n                                <?php } else { ?>\n                                    <a href=\"<?= lang_url('user') ?>\" class=\"login100-form-btn\"><?= lang('log_me_public_home') ?></a>\n                                <?php } ?>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <style>\n        *{margin: 0px;padding: 0px;box-sizing: border-box}.limiter{width: 100%;margin: 0 auto}.container-login100{width: 100%;min-height: 100vh;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;flex-wrap: wrap;justify-content: center;align-items: center;padding: 15px;background-repeat: no-repeat;background-position: center;background-size: cover;position: relative;z-index: 1}.container-login100::before{content: \"\";display: block;position: absolute;z-index: -1;width: 100%;height: 100%;top: 0;left: 0;background-color: rgba(0,0,0,0.80)}.login_topimg{border-top-left-radius: 5px;border-top-right-radius: 5px;width: 100%;min-height: 185px;position: relative;background:#91B3D1 url(https://image.freepik.com/free-vector/cyber-data-security-online-concept-illustration-internet-security-information-privacy-protection_1150-37330.jpg) no-repeat;background-size: auto;background-position: center}.login_topimg img{width:100%;height: auto}.login_topimg .logo_wrap{border-radius: 5px;background: #fff;padding: 13px 55px;position: relative;top: -21px;margin: 10px auto;max-width: 255px}#login .wrap-login100{background-color: #fff;padding: 20px 45px;border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;width: 100%}.login100-form{width: 100%;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;justify-content: space-between;flex-wrap: wrap}.login100-form-title{font-size: 25px;color: #243762;line-height: 1.2;text-transform: uppercase;text-align: center;width: 100%;display: block}.login100-form-subtitle{font-size: 16px;color: #243762;line-height: 1.2;text-align: center;width: 100%;display: block}.wrap-input100{position: relative;width: 100%;z-index: 1}#login input{outline: none;border: none}#login label{display: inline-block;margin-bottom: .5rem}.input-checkbox100{display: none}input{outline: none;border: none}.wrap-input100{position: relative;width: 100%;z-index: 1}.input100{font-size: 15px;line-height: 1.2;color: #686868;display: block;width: 100%;background: #e6e6e6;height: 45px;border-radius: 3px;padding: 0 30px 0 55px}.focus-input100{display: block;position: absolute;border-radius: 3px;bottom: 0;left: 0;z-index: -1;width: 100%;height: 100%;box-shadow: 0px 0px 0px 0px;color: rgba(211,63,141, 0.6)}.symbol-input100{font-size: 15px;color: #999999;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;align-items: center;position: absolute;border-radius: 25px;bottom: 0;left: 0;width: 100%;height: 100%;padding-left: 23px;padding-bottom: 5px;pointer-events: none;-webkit-transition: all 0.4s;-o-transition: all 0.4s;-moz-transition: all 0.4s;transition: all 0.4s}::-webkit-input-placeholder{opacity: 1;-webkit-transition: opacity .5s;transition: opacity .5s}:-moz-placeholder{opacity: 1;-moz-transition: opacity .5s;transition: opacity .5s}::-moz-placeholder{opacity: 1;-moz-transition: opacity .5s;transition: opacity .5s}:-ms-input-placeholder{opacity: 1;-ms-transition: opacity .5s;transition: opacity .5s}::placeholder{opacity: 1;transition: opacity .5s}*:focus::-webkit-input-placeholder{opacity: 0}*:focus:-moz-placeholder{opacity: 0}*:focus::-moz-placeholder{opacity: 0}*:focus:-ms-input-placeholder{opacity: 0}*:focus::placeholder{opacity: 0}.lnr{speak: none;font-style: normal;font-weight: 400;font-variant: normal;text-transform: none;line-height: 1;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale}.flex-sb-m{display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;justify-content: space-between;-ms-align-items: center;align-items: center}.w-full{width: 100%}.p-b-30{padding-bottom: 30px}.input-checkbox100:checked + .label-checkbox100::before{color: #09569B}.label-checkbox100::before{content: \"\\f00c\";font-family: FontAwesome;font-size: 13px;color: transparent;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;justify-content: center;align-items: center;position: absolute;width: 18px;height: 18px;border-radius: 2px;background: #fff;border: 1px solid #e6e6e6;left: 0;top: 50%;-webkit-transform: translateY(-50%);-moz-transform: translateY(-50%);-ms-transform: translateY(-50%);-o-transform: translateY(-50%);transform: translateY(-50%)}.label-checkbox100{font-size: 14px;font-weight: normal;color: #999999;line-height: 1.2;display: block;position: relative;padding-left: 26px;cursor: pointer}.m-b-16{margin-bottom: 16px}.p-b-55{padding-bottom: 55px}.container-login100-form-btn{width: 100%;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;flex-wrap: wrap;justify-content: center}.login100-form-btn:hover{background: #333333}.label-checkbox100::before{content: \"\\f00c\";font-family: FontAwesome;font-size: 13px;color: transparent;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;justify-content: center;align-items: center;position: absolute;width: 18px;height: 18px;border-radius: 3px;background: #fff;border: 2px solid #09569B;left: 0;top: 48%;-webkit-transform: translateY(-50%);-moz-transform: translateY(-50%);-ms-transform: translateY(-50%);-o-transform: translateY(-50%);transform: translateY(-50%)}#login button:hover{cursor: pointer}.login100-form-btn{font-size: 16px;line-height: 1.5;color: #fff;text-transform: uppercase;width: 100%;height: 45px;border-radius: 3px;background: #09569B;display: -webkit-box;display: -webkit-flex;display: -moz-box;display: -ms-flexbox;display: flex;justify-content: center;align-items: center;padding: 0 25px;-webkit-transition: all 0.4s;-o-transition: all 0.4s;-moz-transition: all 0.4s;transition: all 0.4s}#login button{outline: none !important;border: none}@media (max-width: 768px){.container{width: 750px}#login .wrap-login100{padding: 27px}.login_topimg .logo_wrap{padding: 5px 55px}}\n    </style>"
  },
  {
    "path": "application/views/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "application/views/invoices_parts/footer.php",
    "content": "<!DOCTYPE HTML>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <style>\n            body {font-family: \"Arial\", Georgia, Serif;}\n        </style>\n        <script>\n            function substitutePdfVariables() {\n\n                function getParameterByName(name) {\n                    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);\n                    return match && decodeURIComponent(match[1].replace(/\\+/g, ' '));\n                }\n\n                function substitute(name) {\n                    var value = getParameterByName(name);\n                    var elements = document.getElementsByClassName(name);\n\n                    for (var i = 0; elements && i < elements.length; i++) {\n                        elements[i].textContent = value;\n                    }\n                }\n\n                ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection']\n                        .forEach(function (param) {\n                            substitute(param);\n                        });\n            }\n        </script>\n    </head>\n    <body onload=\"substitutePdfVariables()\">\n        <p style=\"text-align:right;\"><span style=\"text-transform: capitalize;\"><?= $type ?></span> № <?= $num ?> | <?= $pageTranslate ?> <span class=\"page\"></span> / <span class=\"topage\"></span></p>\n    </body>\n</html>"
  },
  {
    "path": "application/views/invoices_parts/invoice_accept.php",
    "content": "<div class=\"container\">\n    <div class=\"inv-accept\"> \n        <a href=\"<?= base_url() ?>\" class=\"logo\">\n            <img src=\"<?= base_url('assets/public/imgs/logo.png') ?>\" alt=\"PMInvoice\">\n        </a>\n        <hr>\n        <div>\n            <?php\n            $typeTranslate = '';\n            if ($invoice['inv_type'] == 'tax_inv') {\n                $typeTranslate = $invoice['translation']['invoice'];\n            }\n            if ($invoice['inv_type'] == 'prof') {\n                $typeTranslate = $invoice['translation']['pro_forma'];\n            }\n            if ($invoice['inv_type'] == 'debit') {\n                $typeTranslate = $invoice['translation']['debit_note'];\n            }\n            if ($invoice['inv_type'] == 'credit') {\n                $typeTranslate = $invoice['translation']['credit_note'];\n            }\n            ?>\n            <h1><?= $invoice['translation']['receive_inv'] . ' ' . $typeTranslate . ' ' . $invoice['translation']['receive_inv_from'] ?> <?= $invoice['firm']['name'] ?></h1>\n        </div>\n        <div class=\"view-container\">\n            <div class=\"pageDelivery hidden\"></div>\n            <div class=\"invoice-box\">\n                <?php include $templateFile; ?>\n            </div>\n        </div>\n        <?php if ($invoice['status'] != 'accepted' && $invoice['status'] != 'refused') { ?>\n            <form method=\"POST\" action=\"\" id=\"invReceiveAction\">\n                <input type=\"hidden\" name=\"action\" value=\"\">\n                <div class=\"row\">\n                    <div class=\"col-sm-6\">\n                        <a href=\"javascript:void(0);\" onclick=\"invReceiveAction('accepted')\" class=\"btn btn-success action\">\n                            <i class=\"fa fa-2x fa-check-circle-o\" aria-hidden=\"true\"></i>\n                            <span><?= $invoice['translation']['i_accept'] ?></span>\n                        </a>\n                    </div>\n                    <div class=\"col-sm-6\">\n                        <a href=\"javascript:void(0);\" onclick=\"invReceiveAction('refused')\" class=\"btn btn-danger action\">\n                            <i class=\"fa fa-2x fa-times-circle-o\" aria-hidden=\"true\"></i>\n                            <span><?= $invoice['translation']['i_refuse'] ?></span>\n                        </a>\n                        <textarea name=\"refuse_reason\" class=\"refuse-reason\" placeholder=\"<?= lang('p_reason') ?>\"></textarea>\n                    </div>\n                </div>\n            </form>\n        <?php } if ($invoice['status'] == 'accepted' || $invoice['status'] == 'refused') { ?>\n            <div class=\"status-label <?= $invoice['status'] == 'accepted' ? 'bg-success' : 'bg-danger' ?>\">\n                <?= lang('status_' . $invoice['status']) ?>\n            </div>\n        <?php } ?>\n        <hr>\n        <p class=\"footer-text\">\n            <?= lang('create_and_send_inv_with') ?> - \n            <a href=\"\">\n                pminvoice.com\n            </a>\n        </p>\n    </div>\n</div>"
  },
  {
    "path": "application/views/parts/footer.php",
    "content": "<?php if (uri_string() != 'registration') { ?>\n    <div class=\"modal fade\" id=\"modalRegister\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modalRegister\">\n        <div class=\"modal-dialog\" role=\"document\">\n            <div class=\"modal-content\"> \n                <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\" id=\"myModalLabel\"><?= lang('registration_modal') ?></h4>\n                </div>\n                <div class=\"modal-body\">\n                    <form class=\"form-registration\" method=\"POST\" action=\"<?= lang_url('registration') ?>\" id=\"registerMe\">\n                        <div class=\"form-group\">\n                            <label for=\"user_email\"><?= lang('reg_email') ?></label><sup class=\"err-email\"></sup>\n                            <input type=\"text\" name=\"email\" id=\"user_email\" placeholder=\"<?= lang('reg_p_email') ?>\" class=\"form-control\">\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"user_password\"><?= lang('reg_pass') ?></label><sup class=\"err-password\"></sup>\n                            <input type=\"password\" id=\"user_password\" name=\"password\" placeholder=\"<?= lang('reg_p_secret') ?>\" class=\"form-control\">\n                        </div>\n                    </form>\n                </div>\n                <div class=\"modal-footer\">\n                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><?= lang('close') ?></button>\n                    <button type=\"button\" class=\"btn btn-orange\" onclick=\"registerValidate()\"><?= lang('register_me') ?></button>\n                </div> \n            </div>\n        </div>\n    </div>\n<?php } ?>\n<script src=\"<?= base_url('assets/jquery/jquery.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/public/js/general.js') ?>\"></script>\n<script>\n    (function() {\n        var csrfName = '<?= $this->security->get_csrf_token_name() ?>';\n        var csrfHash = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content');\n\n        function injectCsrf() {\n            var forms = document.querySelectorAll('form[method=\"post\"], form[method=\"POST\"]');\n            for (var i = 0; i < forms.length; i++) {\n                if (!forms[i].querySelector('input[name=\"' + csrfName + '\"]')) {\n                    var input = document.createElement('input');\n                    input.type  = 'hidden';\n                    input.name  = csrfName;\n                    input.value = csrfHash;\n                    forms[i].appendChild(input);\n                }\n            }\n        }\n\n        document.addEventListener('DOMContentLoaded', injectCsrf);\n        // DOM is already ready in footer - call directly too\n        injectCsrf();\n        document.addEventListener('submit', function(e) {\n            var form = e.target;\n            if (form.method && form.method.toLowerCase() === 'post' && !form.querySelector('input[name=\"' + csrfName + '\"]')) {\n                var input = document.createElement('input');\n                input.type  = 'hidden';\n                input.name  = csrfName;\n                input.value = csrfHash;\n                form.appendChild(input);\n            }\n        }, true);\n\n        if (typeof $ !== 'undefined') {\n            $.ajaxSetup({\n                beforeSend: function(xhr, settings) {\n                    if (settings.type && settings.type.toUpperCase() === 'POST') {\n                        if (typeof settings.data === 'string') {\n                            settings.data += '&' + csrfName + '=' + csrfHash;\n                        } else {\n                            settings.data = settings.data || {};\n                            settings.data[csrfName] = csrfHash;\n                        }\n                    }\n                }\n            });\n        }\n    })();\n</script>\n<script src=\"<?= base_url('assets/plugins/placeholders.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/bootstrap/js/bootstrap.min.js') ?>\"></script>          \n</body>\n</html>"
  },
  {
    "path": "application/views/parts/header.php",
    "content": "<!DOCTYPE html>\n<html lang=\"<?= MY_LANGUAGE_ABBR ?>\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> \n        <meta name=\"description\" content=\"<?= @$description ?>\">\n        <meta name=\"csrf-token\" content=\"<?= $this->security->get_csrf_hash() ?>\">\n        <title><?= @$title ?></title>\n        <link href=\"https://fonts.googleapis.com/css?family=Shadows+Into+Light\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"https://fonts.googleapis.com/css?family=Open+Sans\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"<?= base_url('assets/font-awesome-4.7.0/css/font-awesome.min.css') ?>\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"<?= base_url('assets/animate.min.css') ?>\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"<?= base_url('assets/bootstrap/css/bootstrap.min.css') ?>\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"<?= base_url('assets/public/css/general.css') ?>\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"<?= base_url('assets/public/css/stabilizator_' . MY_LANGUAGE_ABBR . '.css') ?>\" rel=\"stylesheet\" type=\"text/css\">\n        <script src=\"<?= lang_url('loadlanguage/all.js') ?>\"></script>\n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body>"
  },
  {
    "path": "application/views/parts/invaccept/footer.php",
    "content": "\n<script src=\"<?= base_url('assets/public/js/general.js') ?>\"></script> \n<script src=\"<?= base_url('assets/plugins/placeholders.min.js') ?>\"></script>\n<script src=\"<?= base_url('assets/bootstrap/js/bootstrap.min.js') ?>\"></script>          \n</body>\n</html>"
  },
  {
    "path": "application/views/parts/invaccept/header.php",
    "content": "<!DOCTYPE html>\n<html lang=\"<?= MY_LANGUAGE_ABBR ?>\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <title><?= @$title ?></title>\n        <meta name=\"description\" content=\"<?= @$description ?>\">\n        <meta name=\"keywords\" content=\"<?= @$keywords ?>\">\n        <link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"https://fonts.googleapis.com/css?family=Shadows+Into+Light\" rel='stylesheet' type=\"text/css\">\n        <link href=\"https://fonts.googleapis.com/css?family=Open+Sans\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css\" rel=\"stylesheet\" type=\"text/css\">\n        <link href=\"<?= base_url('assets/bootstrap/css/bootstrap.min.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/public/css/general.css') ?>\" rel=\"stylesheet\">\n        <link href=\"<?= base_url('assets/users/css/invoices-templates.css') ?>\" rel=\"stylesheet\">\n        <script src=\"<?= base_url('assets/jquery/jquery.min.js') ?>\"></script>\n        <script src=\"<?= base_url('loadlanguage/all.js') ?>\"></script>\n        <!--[if lt IE 9]>\n          <script src=\"https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\"></script>\n          <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body>\n"
  },
  {
    "path": "application/views/registration/choosetype.php",
    "content": "<div id=\"subpage\">\n    <div class=\"container\">\n        <h1><?= lang('choose_type_of_login') ?></h1>\n    </div>\n</div>\n<div class=\"container\" id=\"registration\"> \n    <div class=\"row\">\n        <div class=\"col-sm-6 col-sm-offset-3\">\n            <div class=\"text-center\" style=\"margin-bottom: 15px;\"><a href=\"<?= lang_url('choose-type-of-login?type=1') ?>\" class=\"btn btn-orange\"><?= lang('type_user') ?></a></div>\n            <div class=\"text-center\"><a href=\"<?= lang_url('choose-type-of-login?type=2') ?>\" class=\"btn btn-orange\"><?= lang('type_employee') ?></a></div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/views/registration/forgotten.php",
    "content": "<div id=\"subpage\">\n    <div class=\"container\">\n        <h1><?= lang('recover_your_pass') ?></h1>\n    </div>\n</div>\n<div class=\"container forgotten-page\"> \n    <div class=\"row\">\n        <div class=\"col-sm-6 col-sm-offset-3\">\n            <form class=\"form-registration form-inline text-center\" method=\"POST\" action=\"\">\n                <div class=\"form-group\">\n                    <label><?= lang('login_email') ?></label>\n                    <input type=\"text\" name=\"email\" placeholder=\"<?= lang('reg_p_email') ?>\" class=\"form-control\">\n                </div>\n                <div class=\"form-group\">\n                    <input type=\"submit\" value=\"<?= lang('send_pass_link') ?>\" class=\"btn btn-orange\"> \n                </div>\n            </form>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "application/views/registration/index.php",
    "content": "<div id=\"subpage\">\n    <div class=\"container\">\n        <h1><?= lang('registration') ?></h1>\n    </div>\n</div>\n<div class=\"container\" id=\"registration\"> \n    <div class=\"row\">\n        <div class=\"col-sm-6 col-sm-offset-3\">\n            <form class=\"form-registration\" method=\"POST\" action=\"\">\n                <div class=\"form-group\">\n                    <label for=\"user_email\"><?= lang('reg_email') ?></label>\n                    <input type=\"text\" name=\"email\" id=\"user_email\" value=\"<?= trim($this->session->flashdata('email')) ?>\" placeholder=\"<?= lang('reg_p_email') ?>\" class=\"form-control\">\n                </div>\n                <div class=\"form-group\">\n                    <label for=\"user_password\"><?= lang('reg_pass') ?></label>\n                    <input type=\"password\" id=\"user_password\" value=\"<?= trim($this->session->flashdata('password')) ?>\" name=\"password\" placeholder=\"<?= lang('reg_p_secret') ?>\" class=\"form-control\">\n                </div>  \n                <div class=\"form-group\">\n                    <input type=\"submit\" value=\"<?= lang('register_me') ?>\" class=\"btn btn-orange\">\n                    <a href=\"<?= lang_url('login') ?>\" class=\"btn btn-default\"><?= lang('i_have_account') ?></a>\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n<?php\nif ($this->session->flashdata('resultRegister')) {\n    geterror($this->session->flashdata('resultRegister'));\n}\n?>"
  },
  {
    "path": "application/views/registration/login.php",
    "content": "<div id=\"subpage\">\n    <div class=\"container\">\n        <h1><?= lang('login') ?></h1>\n    </div>\n</div>\n<div class=\"container\" id=\"registration\"> \n    <div class=\"row\">\n        <div class=\"col-sm-6 col-sm-offset-3\">\n            <form class=\"form-registration\" method=\"POST\" action=\"\">\n                <div class=\"form-group\">\n                    <label><?= lang('login_email') ?></label>\n                    <input type=\"text\" name=\"email\" value=\"<?= trim($this->session->flashdata('email')) ?>\" placeholder=\"<?= lang('reg_p_email') ?>\" class=\"form-control\">\n                </div>\n                <div class=\"form-group\">\n                    <label><?= lang('login_pass') ?></label>\n                    <input type=\"password\" name=\"password\" value=\"\" placeholder=\"<?= lang('reg_p_secret') ?>\" class=\"form-control\">\n                </div> \n                <div class=\"form-group\">\n                    <input type=\"submit\" value=\"<?= lang('btn_logme') ?>\" class=\"btn btn-orange\">\n                    <a href=\"<?= lang_url('password-forgotten') ?>\" class=\"btn btn-default\"><?= lang('forgotten_pass') ?></a>\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n<?php\nif ($this->session->flashdata('loginErrors')) {\n    geterror($this->session->flashdata('loginErrors'));\n}\n?>"
  },
  {
    "path": "assets/admin/css/general.css",
    "content": "/*\nCreated on : Apr 04, 2017, 3:20:16 PM\nAuthor     : Kiril Kirkov\nGitgub     : https://github.com/kirilkirkov\n*/\nhtml, body { height: 100%;}\nbody { color:#6b6b6b; font-size: 13px; }\n#wrapper { min-height: 100%; position: relative;}\n#content {padding-bottom:100px;}\nh1 {font-size:30px; }\nnav.navbar, .left-side, h1 {text-transform: uppercase; }\ninput.form-control {border:1px solid #dadada; border-radius: 0; box-shadow:none;}\n\nnav.navbar {z-index: 55;}\nnav.navbar a { color:#fff;}\nnav.navbar li a:hover, nav.navbar li a:focus, nav.navbar li a:active {background-color: transparent;}\n.navbar-nav li a i {margin-right: 7px;}\nnav.navbar .dropdown-menu li {margin-bottom: 3px;}\nnav.navbar .dropdown-menu li a { color:#333;}\n.nav .open > a, .nav .open > a:focus, .nav .open > a:hover {background-color: transparent;}\n.left-side { border-right:1px solid #e7e7e7; padding:0; bottom: 0;  display: block;left: 0; overflow: auto;position: absolute;    top: 51px;}\n.left-side .sidebar-menu {list-style: none; margin:0 0 80px;padding:0;}\n.left-side .sidebar-menu li {margin: 0; padding: 0; position: relative; border-bottom: 1px solid #e7e7e7;}\n.left-side .sidebar-menu li a {display: block;   border-left: 3px solid transparent;  color: #337ab7;    padding: 12px 5px 12px 15px; }\n.left-side .sidebar-menu li a i {margin-right: 7px;}\n.left-side .sidebar-menu li a:hover, div.left-side ul.sidebar-menu li a.active { background-color: #eeeeee; text-decoration: none; }\n.left-side .sidebar-menu li.header {  color: #4b646f; padding: 12px 5px 12px 15px; }\n.sidebar-menu .sidebar-search {padding: 15px !important;}\n#show-xs-nav { border: 1px solid #666;  padding: 5px; text-decoration: none; color: #666;  font-size: 13px; text-align: center; margin-top: 10px; border-radius: 5px;}\n#nav-categories, #show-xs-nav .hidde-sp {display: none;}\n\n@media (min-width: 767px) {\n    .sidebar-menu {display: block !important;}\n}\n\n@media screen and (max-width: 767px) {\n    .left-side {position:relative !important; top:0 !important; margin-bottom: 20px;}\n    nav.navbar {margin-bottom:0;}\n    nav.navbar .navbar-brand {height:55px;}\n    .settings {position: relative;}\n    .show-menu {display: block; padding:0 10px !important;}\n    .sidebar-menu {display: none;}\n}\n\n"
  },
  {
    "path": "assets/admin/css/login.css",
    "content": "body { background-color: #333; color: #888; font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: 300; line-height: 30px; text-align: center; }\n.alert-danger { left: 50%; margin-left: -125px; position: absolute; top: 20px; width: 250px; }\nstrong { font-weight: 500; }\na, a:hover, a:focus { color: #de615e; moz-transition: all .3s; ms-transition: all .3s; o-transition: all .3s; text-decoration: none; transition: all .3s; webkit-transition: all .3s; }\nh1, h2 { color: #555; font-size: 38px; font-weight: 100; line-height: 50px; margin-top: 10px; }\nh3 { color: #555; font-size: 22px; font-weight: 300; line-height: 30px; }\nimg { max-width: 100%; }\n::-moz-selection { background: #de615e; color: #fff; text-shadow: none; }\n::selection { background: #de615e; color: #fff; text-shadow: none; }\n.btn-link-1 { background: #de615e; border-radius: 4px; color: #fff; display: inline-block; font-size: 16px; font-weight: 300; height: 50px; line-height: 16px; margin: 5px; moz-border-radius: 4px; padding: 16px 20px 0 20px; webkit-border-radius: 4px; }\n.btn-link-1:hover, .btn-link-1:focus, .btn-link-1:active { color: #fff; opacity: 0.6; outline: 0; }\n.btn-link-1.btn-link-1-facebook { background: #4862a3; }\n.btn-link-1.btn-link-1-twitter { background: #55acee; }\n.btn-link-1.btn-link-1-google-plus { background: #dd4b39; }\n.btn-link-1 i { font-size: 20px; line-height: 20px; padding-right: 5px; vertical-align: middle; }\n.btn-link-2 { background: rgba(0, 0, 0, 0.3); border: 1px solid #fff; border-radius: 4px; color: #fff; display: inline-block; font-size: 16px; font-weight: 300; height: 50px; line-height: 16px; margin: 5px; moz-border-radius: 4px; padding: 15px 20px 0 20px; webkit-border-radius: 4px; }\n.btn-link-2:hover, .btn-link-2:focus, \n.btn-link-2:active, .btn-link-2:active:focus { background: rgba(0, 0, 0, 0.3); color: #fff; opacity: 0.6; outline: 0; }\n.inner-bg { padding: 100px 0 170px 0; }\n.top-content .text { color: #fff; }\n.top-content .text h1 { color: #fff; }\n.form-box { margin-top: 35px; }\n.form-top { background: #444; background: rgba(0, 0, 0, 0.35); border-radius: 4px 4px 0 0; moz-border-radius: 4px 4px 0 0; overflow: hidden; padding: 0 25px 15px 25px; text-align: left; webkit-border-radius: 4px 4px 0 0; }\n.form-top-left { float: left; padding-top: 25px; width: 75%; }\n.form-top-left h3 { color: #fff; margin-top: 0; }\n.form-top-left p { color: #fff; opacity: 0.8; }\n.form-top-right { color: #fff; float: left; font-size: 66px; line-height: 100px; opacity: 0.3; padding-top: 5px; text-align: right; width: 25%; }\n.form-bottom { background: #444; background: rgba(0, 0, 0, 0.3); border-radius: 0 0 4px 4px; moz-border-radius: 0 0 4px 4px; padding: 25px 25px 30px 25px; text-align: left; webkit-border-radius: 0 0 4px 4px; }\n.form-bottom form button.btn { width: 100%; }\n.form-bottom form .input-error { border-color: #de615e; }\n@media (min-width: 992px) and (max-width: 1199px) { }\n@media (min-width: 768px) and (max-width: 991px) { }\n@media (max-width: 767px) { .inner-bg { padding: 60px 0 110px 0; }\n}\n@media (max-width: 415px) { h1, h2 { font-size: 32px; }\n}\ninput[type=\"text\"], \ninput[type=\"password\"], \ntextarea, \ntextarea.form-control { background: #fff; border: 3px solid #fff; border-radius: 4px; box-shadow: none; color: #888; font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: 300; height: 50px; line-height: 50px; margin: 0; moz-border-radius: 4px; moz-box-shadow: none; moz-transition: all .3s; ms-transition: all .3s; o-transition: all .3s; padding: 0 20px; transition: all .3s; vertical-align: middle; webkit-border-radius: 4px; webkit-box-shadow: none; webkit-transition: all .3s; }\ninput[type=\"text\"]:focus, \ninput[type=\"password\"]:focus, \ntextarea:focus, \ntextarea.form-control:focus { background: #fff; border: 3px solid #fff; box-shadow: none; moz-box-shadow: none; outline: 0; webkit-box-shadow: none; }\ninput[type=\"text\"]:-moz-placeholder, input[type=\"password\"]:-moz-placeholder, \ntextarea:-moz-placeholder, textarea.form-control:-moz-placeholder { color: #888; }\ninput[type=\"text\"]:-ms-input-placeholder, input[type=\"password\"]:-ms-input-placeholder, \ntextarea:-ms-input-placeholder, textarea.form-control:-ms-input-placeholder { color: #888; }\ninput[type=\"text\"]::-webkit-input-placeholder, input[type=\"password\"]::-webkit-input-placeholder, \ntextarea::-webkit-input-placeholder, textarea.form-control::-webkit-input-placeholder { color: #888; }\nbutton.btn { background: #de615e; border: 0; border-radius: 4px; box-shadow: none; color: #fff; font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: 300; height: 50px; line-height: 50px; margin: 0; moz-border-radius: 4px; moz-box-shadow: none; moz-transition: all .3s; ms-transition: all .3s; o-transition: all .3s; padding: 0 20px; text-shadow: none; transition: all .3s; vertical-align: middle; webkit-border-radius: 4px; webkit-box-shadow: none; webkit-transition: all .3s; }\nbutton.btn:hover { color: #fff; opacity: 0.6; }\nbutton.btn:active { box-shadow: none; color: #fff; moz-box-shadow: none; opacity: 0.6; outline: 0; webkit-box-shadow: none; }\nbutton.btn:focus { background: #de615e; color: #fff; opacity: 0.6; outline: 0; }\nbutton.btn:active:focus, button.btn.active:focus { background: #de615e; color: #fff; opacity: 0.6; outline: 0; }\n\n@media screen and (max-width: 767px) {  \n    .alert-danger {top: 10px;}\n}"
  },
  {
    "path": "assets/admin/js/general.js",
    "content": "//xs hidden categories\n$(\"#show-xs-nav\").click(function () {\n    $(\".sidebar-menu\").toggle(\"slow\", function () {\n        if ($(this).is(\":visible\") == true) {\n            $(\"#show-xs-nav .hidde-sp\").show();\n            $(\"#show-xs-nav .show-sp\").hide();\n        } else {\n            $(\"#show-xs-nav .hidde-sp\").hide();\n            $(\"#show-xs-nav .show-sp\").show();\n        }\n    });\n});"
  },
  {
    "path": "assets/bootstrap/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "assets/bootstrap-datepicker-1.6.4-dist/css/bootstrap-datepicker.css",
    "content": "/*!\n * Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)\n */\n.datepicker {\n  padding: 4px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  direction: ltr;\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #999;\n  border-top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-top: 0;\n  position: absolute;\n}\n.datepicker-dropdown.datepicker-orient-left:before {\n  left: 6px;\n}\n.datepicker-dropdown.datepicker-orient-left:after {\n  left: 7px;\n}\n.datepicker-dropdown.datepicker-orient-right:before {\n  right: 6px;\n}\n.datepicker-dropdown.datepicker-orient-right:after {\n  right: 7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:before {\n  top: -7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:after {\n  top: -6px;\n}\n.datepicker-dropdown.datepicker-orient-top:before {\n  bottom: -7px;\n  border-bottom: 0;\n  border-top: 7px solid #999;\n}\n.datepicker-dropdown.datepicker-orient-top:after {\n  bottom: -6px;\n  border-bottom: 0;\n  border-top: 6px solid #fff;\n}\n.datepicker table {\n  margin: 0;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.datepicker td,\n.datepicker th {\n  text-align: center;\n  width: 20px;\n  height: 20px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.day:hover,\n.datepicker table tr td.day.focused {\n  background: #eee;\n  cursor: pointer;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #999;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #999;\n  cursor: default;\n}\n.datepicker table tr td.highlighted {\n  background: #d9edf7;\n  border-radius: 0;\n}\n.datepicker table tr td.today,\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:hover {\n  background-color: #fde19a;\n  background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));\n  background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);\n  border-color: #fdf59a #fdf59a #fbed50;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #000;\n}\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today:hover:hover,\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today.disabled:hover:hover,\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today:hover.disabled,\n.datepicker table tr td.today.disabled.disabled,\n.datepicker table tr td.today.disabled:hover.disabled,\n.datepicker table tr td.today[disabled],\n.datepicker table tr td.today:hover[disabled],\n.datepicker table tr td.today.disabled[disabled],\n.datepicker table tr td.today.disabled:hover[disabled] {\n  background-color: #fdf59a;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active {\n  background-color: #fbf069 \\9;\n}\n.datepicker table tr td.today:hover:hover {\n  color: #000;\n}\n.datepicker table tr td.today.active:hover {\n  color: #fff;\n}\n.datepicker table tr td.range,\n.datepicker table tr td.range:hover,\n.datepicker table tr td.range.disabled,\n.datepicker table tr td.range.disabled:hover {\n  background: #eee;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today,\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today.disabled:hover {\n  background-color: #f3d17a;\n  background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));\n  background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);\n  border-color: #f3e97a #f3e97a #edde34;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today:hover:hover,\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today.disabled:hover:hover,\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today:hover.disabled,\n.datepicker table tr td.range.today.disabled.disabled,\n.datepicker table tr td.range.today.disabled:hover.disabled,\n.datepicker table tr td.range.today[disabled],\n.datepicker table tr td.range.today:hover[disabled],\n.datepicker table tr td.range.today.disabled[disabled],\n.datepicker table tr td.range.today.disabled:hover[disabled] {\n  background-color: #f3e97a;\n}\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active {\n  background-color: #efe24b \\9;\n}\n.datepicker table tr td.selected,\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected.disabled:hover {\n  background-color: #9e9e9e;\n  background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));\n  background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: linear-gradient(to bottom, #b3b3b3, #808080);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);\n  border-color: #808080 #808080 #595959;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected:hover:hover,\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.disabled:hover:hover,\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected:hover.disabled,\n.datepicker table tr td.selected.disabled.disabled,\n.datepicker table tr td.selected.disabled:hover.disabled,\n.datepicker table tr td.selected[disabled],\n.datepicker table tr td.selected:hover[disabled],\n.datepicker table tr td.selected.disabled[disabled],\n.datepicker table tr td.selected.disabled:hover[disabled] {\n  background-color: #808080;\n}\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active {\n  background-color: #666666 \\9;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));\n  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: linear-gradient(to bottom, #08c, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active:hover:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active:hover.disabled,\n.datepicker table tr td.active.disabled.disabled,\n.datepicker table tr td.active.disabled:hover.disabled,\n.datepicker table tr td.active[disabled],\n.datepicker table tr td.active:hover[disabled],\n.datepicker table tr td.active.disabled[disabled],\n.datepicker table tr td.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover,\n.datepicker table tr td span.focused {\n  background: #eee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #999;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));\n  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: linear-gradient(to bottom, #08c, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active:hover.disabled,\n.datepicker table tr td span.active.disabled.disabled,\n.datepicker table tr td span.active.disabled:hover.disabled,\n.datepicker table tr td span.active[disabled],\n.datepicker table tr td span.active:hover[disabled],\n.datepicker table tr td span.active.disabled[disabled],\n.datepicker table tr td span.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span.old,\n.datepicker table tr td span.new {\n  color: #999;\n}\n.datepicker .datepicker-switch {\n  width: 145px;\n}\n.datepicker .datepicker-switch,\n.datepicker .prev,\n.datepicker .next,\n.datepicker tfoot tr th {\n  cursor: pointer;\n}\n.datepicker .datepicker-switch:hover,\n.datepicker .prev:hover,\n.datepicker .next:hover,\n.datepicker tfoot tr th:hover {\n  background: #eee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.input-append.date .add-on,\n.input-prepend.date .add-on {\n  cursor: pointer;\n}\n.input-append.date .add-on i,\n.input-prepend.date .add-on i {\n  margin-top: 3px;\n}\n.input-daterange input {\n  text-align: center;\n}\n.input-daterange input:first-child {\n  -webkit-border-radius: 3px 0 0 3px;\n  -moz-border-radius: 3px 0 0 3px;\n  border-radius: 3px 0 0 3px;\n}\n.input-daterange input:last-child {\n  -webkit-border-radius: 0 3px 3px 0;\n  -moz-border-radius: 0 3px 3px 0;\n  border-radius: 0 3px 3px 0;\n}\n.input-daterange .add-on {\n  display: inline-block;\n  width: auto;\n  min-width: 16px;\n  height: 18px;\n  padding: 4px 5px;\n  font-weight: normal;\n  line-height: 18px;\n  text-align: center;\n  text-shadow: 0 1px 0 #fff;\n  vertical-align: middle;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  margin-left: -5px;\n  margin-right: -5px;\n}\n/*# sourceMappingURL=bootstrap-datepicker.css.map */"
  },
  {
    "path": "assets/bootstrap-datepicker-1.6.4-dist/css/bootstrap-datepicker.standalone.css",
    "content": "/*!\n * Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)\n */\n.datepicker {\n  padding: 4px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  direction: ltr;\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #999;\n  border-top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-top: 0;\n  position: absolute;\n}\n.datepicker-dropdown.datepicker-orient-left:before {\n  left: 6px;\n}\n.datepicker-dropdown.datepicker-orient-left:after {\n  left: 7px;\n}\n.datepicker-dropdown.datepicker-orient-right:before {\n  right: 6px;\n}\n.datepicker-dropdown.datepicker-orient-right:after {\n  right: 7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:before {\n  top: -7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:after {\n  top: -6px;\n}\n.datepicker-dropdown.datepicker-orient-top:before {\n  bottom: -7px;\n  border-bottom: 0;\n  border-top: 7px solid #999;\n}\n.datepicker-dropdown.datepicker-orient-top:after {\n  bottom: -6px;\n  border-bottom: 0;\n  border-top: 6px solid #fff;\n}\n.datepicker table {\n  margin: 0;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.datepicker td,\n.datepicker th {\n  text-align: center;\n  width: 20px;\n  height: 20px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.day:hover,\n.datepicker table tr td.day.focused {\n  background: #eee;\n  cursor: pointer;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #999;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #999;\n  cursor: default;\n}\n.datepicker table tr td.highlighted {\n  background: #d9edf7;\n  border-radius: 0;\n}\n.datepicker table tr td.today,\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:hover {\n  background-color: #fde19a;\n  background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));\n  background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);\n  border-color: #fdf59a #fdf59a #fbed50;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #000;\n}\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today:hover:hover,\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today.disabled:hover:hover,\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today:hover.disabled,\n.datepicker table tr td.today.disabled.disabled,\n.datepicker table tr td.today.disabled:hover.disabled,\n.datepicker table tr td.today[disabled],\n.datepicker table tr td.today:hover[disabled],\n.datepicker table tr td.today.disabled[disabled],\n.datepicker table tr td.today.disabled:hover[disabled] {\n  background-color: #fdf59a;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today:hover:active,\n.datepicker table tr td.today.disabled:active,\n.datepicker table tr td.today.disabled:hover:active,\n.datepicker table tr td.today.active,\n.datepicker table tr td.today:hover.active,\n.datepicker table tr td.today.disabled.active,\n.datepicker table tr td.today.disabled:hover.active {\n  background-color: #fbf069 \\9;\n}\n.datepicker table tr td.today:hover:hover {\n  color: #000;\n}\n.datepicker table tr td.today.active:hover {\n  color: #fff;\n}\n.datepicker table tr td.range,\n.datepicker table tr td.range:hover,\n.datepicker table tr td.range.disabled,\n.datepicker table tr td.range.disabled:hover {\n  background: #eee;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today,\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today.disabled:hover {\n  background-color: #f3d17a;\n  background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));\n  background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);\n  border-color: #f3e97a #f3e97a #edde34;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today:hover:hover,\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today.disabled:hover:hover,\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active,\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today:hover.disabled,\n.datepicker table tr td.range.today.disabled.disabled,\n.datepicker table tr td.range.today.disabled:hover.disabled,\n.datepicker table tr td.range.today[disabled],\n.datepicker table tr td.range.today:hover[disabled],\n.datepicker table tr td.range.today.disabled[disabled],\n.datepicker table tr td.range.today.disabled:hover[disabled] {\n  background-color: #f3e97a;\n}\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today:hover:active,\n.datepicker table tr td.range.today.disabled:active,\n.datepicker table tr td.range.today.disabled:hover:active,\n.datepicker table tr td.range.today.active,\n.datepicker table tr td.range.today:hover.active,\n.datepicker table tr td.range.today.disabled.active,\n.datepicker table tr td.range.today.disabled:hover.active {\n  background-color: #efe24b \\9;\n}\n.datepicker table tr td.selected,\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected.disabled:hover {\n  background-color: #9e9e9e;\n  background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));\n  background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);\n  background-image: linear-gradient(to bottom, #b3b3b3, #808080);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);\n  border-color: #808080 #808080 #595959;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected:hover:hover,\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.disabled:hover:hover,\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active,\n.datepicker table tr td.selected.disabled,\n.datepicker table tr td.selected:hover.disabled,\n.datepicker table tr td.selected.disabled.disabled,\n.datepicker table tr td.selected.disabled:hover.disabled,\n.datepicker table tr td.selected[disabled],\n.datepicker table tr td.selected:hover[disabled],\n.datepicker table tr td.selected.disabled[disabled],\n.datepicker table tr td.selected.disabled:hover[disabled] {\n  background-color: #808080;\n}\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected:hover:active,\n.datepicker table tr td.selected.disabled:active,\n.datepicker table tr td.selected.disabled:hover:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected:hover.active,\n.datepicker table tr td.selected.disabled.active,\n.datepicker table tr td.selected.disabled:hover.active {\n  background-color: #666666 \\9;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));\n  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: linear-gradient(to bottom, #08c, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active:hover:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.datepicker table tr td.active.disabled,\n.datepicker table tr td.active:hover.disabled,\n.datepicker table tr td.active.disabled.disabled,\n.datepicker table tr td.active.disabled:hover.disabled,\n.datepicker table tr td.active[disabled],\n.datepicker table tr td.active:hover[disabled],\n.datepicker table tr td.active.disabled[disabled],\n.datepicker table tr td.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover,\n.datepicker table tr td span.focused {\n  background: #eee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #999;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));\n  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);\n  background-image: linear-gradient(to bottom, #08c, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active:hover.disabled,\n.datepicker table tr td span.active.disabled.disabled,\n.datepicker table tr td span.active.disabled:hover.disabled,\n.datepicker table tr td span.active[disabled],\n.datepicker table tr td span.active:hover[disabled],\n.datepicker table tr td span.active.disabled[disabled],\n.datepicker table tr td span.active.disabled:hover[disabled] {\n  background-color: #0044cc;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker table tr td span.old,\n.datepicker table tr td span.new {\n  color: #999;\n}\n.datepicker .datepicker-switch {\n  width: 145px;\n}\n.datepicker .datepicker-switch,\n.datepicker .prev,\n.datepicker .next,\n.datepicker tfoot tr th {\n  cursor: pointer;\n}\n.datepicker .datepicker-switch:hover,\n.datepicker .prev:hover,\n.datepicker .next:hover,\n.datepicker tfoot tr th:hover {\n  background: #eee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.input-append.date .add-on,\n.input-prepend.date .add-on {\n  cursor: pointer;\n}\n.input-append.date .add-on i,\n.input-prepend.date .add-on i {\n  margin-top: 3px;\n}\n.input-daterange input {\n  text-align: center;\n}\n.input-daterange input:first-child {\n  -webkit-border-radius: 3px 0 0 3px;\n  -moz-border-radius: 3px 0 0 3px;\n  border-radius: 3px 0 0 3px;\n}\n.input-daterange input:last-child {\n  -webkit-border-radius: 0 3px 3px 0;\n  -moz-border-radius: 0 3px 3px 0;\n  border-radius: 0 3px 3px 0;\n}\n.input-daterange .add-on {\n  display: inline-block;\n  width: auto;\n  min-width: 16px;\n  height: 20px;\n  padding: 4px 5px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #fff;\n  vertical-align: middle;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  margin-left: -5px;\n  margin-right: -5px;\n}\n.datepicker.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  float: left;\n  display: none;\n  min-width: 160px;\n  list-style: none;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  color: #333333;\n  font-size: 13px;\n  line-height: 20px;\n}\n.datepicker.dropdown-menu th,\n.datepicker.datepicker-inline th,\n.datepicker.dropdown-menu td,\n.datepicker.datepicker-inline td {\n  padding: 4px 5px;\n}\n/*# sourceMappingURL=bootstrap-datepicker.standalone.css.map */"
  },
  {
    "path": "assets/bootstrap-datepicker-1.6.4-dist/css/bootstrap-datepicker3.css",
    "content": "/*!\n * Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)\n */\n.datepicker {\n  border-radius: 4px;\n  direction: ltr;\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n  padding: 4px;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid rgba(0, 0, 0, 0.15);\n  border-top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-top: 0;\n  position: absolute;\n}\n.datepicker-dropdown.datepicker-orient-left:before {\n  left: 6px;\n}\n.datepicker-dropdown.datepicker-orient-left:after {\n  left: 7px;\n}\n.datepicker-dropdown.datepicker-orient-right:before {\n  right: 6px;\n}\n.datepicker-dropdown.datepicker-orient-right:after {\n  right: 7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:before {\n  top: -7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:after {\n  top: -6px;\n}\n.datepicker-dropdown.datepicker-orient-top:before {\n  bottom: -7px;\n  border-bottom: 0;\n  border-top: 7px solid rgba(0, 0, 0, 0.15);\n}\n.datepicker-dropdown.datepicker-orient-top:after {\n  bottom: -6px;\n  border-bottom: 0;\n  border-top: 6px solid #fff;\n}\n.datepicker table {\n  margin: 0;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.datepicker table tr td,\n.datepicker table tr th {\n  text-align: center;\n  width: 30px;\n  height: 30px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #777777;\n}\n.datepicker table tr td.day:hover,\n.datepicker table tr td.focused {\n  background: #eeeeee;\n  cursor: pointer;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #777777;\n  cursor: default;\n}\n.datepicker table tr td.highlighted {\n  color: #000;\n  background-color: #d9edf7;\n  border-color: #85c5e5;\n  border-radius: 0;\n}\n.datepicker table tr td.highlighted:focus,\n.datepicker table tr td.highlighted.focus {\n  color: #000;\n  background-color: #afd9ee;\n  border-color: #298fc2;\n}\n.datepicker table tr td.highlighted:hover {\n  color: #000;\n  background-color: #afd9ee;\n  border-color: #52addb;\n}\n.datepicker table tr td.highlighted:active,\n.datepicker table tr td.highlighted.active {\n  color: #000;\n  background-color: #afd9ee;\n  border-color: #52addb;\n}\n.datepicker table tr td.highlighted:active:hover,\n.datepicker table tr td.highlighted.active:hover,\n.datepicker table tr td.highlighted:active:focus,\n.datepicker table tr td.highlighted.active:focus,\n.datepicker table tr td.highlighted:active.focus,\n.datepicker table tr td.highlighted.active.focus {\n  color: #000;\n  background-color: #91cbe8;\n  border-color: #298fc2;\n}\n.datepicker table tr td.highlighted.disabled:hover,\n.datepicker table tr td.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.highlighted:hover,\n.datepicker table tr td.highlighted.disabled:focus,\n.datepicker table tr td.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.highlighted:focus,\n.datepicker table tr td.highlighted.disabled.focus,\n.datepicker table tr td.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.highlighted.focus {\n  background-color: #d9edf7;\n  border-color: #85c5e5;\n}\n.datepicker table tr td.highlighted.focused {\n  background: #afd9ee;\n}\n.datepicker table tr td.highlighted.disabled,\n.datepicker table tr td.highlighted.disabled:active {\n  background: #d9edf7;\n  color: #777777;\n}\n.datepicker table tr td.today {\n  color: #000;\n  background-color: #ffdb99;\n  border-color: #ffb733;\n}\n.datepicker table tr td.today:focus,\n.datepicker table tr td.today.focus {\n  color: #000;\n  background-color: #ffc966;\n  border-color: #b37400;\n}\n.datepicker table tr td.today:hover {\n  color: #000;\n  background-color: #ffc966;\n  border-color: #f59e00;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today.active {\n  color: #000;\n  background-color: #ffc966;\n  border-color: #f59e00;\n}\n.datepicker table tr td.today:active:hover,\n.datepicker table tr td.today.active:hover,\n.datepicker table tr td.today:active:focus,\n.datepicker table tr td.today.active:focus,\n.datepicker table tr td.today:active.focus,\n.datepicker table tr td.today.active.focus {\n  color: #000;\n  background-color: #ffbc42;\n  border-color: #b37400;\n}\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled:focus,\n.datepicker table tr td.today[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.today:focus,\n.datepicker table tr td.today.disabled.focus,\n.datepicker table tr td.today[disabled].focus,\nfieldset[disabled] .datepicker table tr td.today.focus {\n  background-color: #ffdb99;\n  border-color: #ffb733;\n}\n.datepicker table tr td.today.focused {\n  background: #ffc966;\n}\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:active {\n  background: #ffdb99;\n  color: #777777;\n}\n.datepicker table tr td.range {\n  color: #000;\n  background-color: #eeeeee;\n  border-color: #bbbbbb;\n  border-radius: 0;\n}\n.datepicker table tr td.range:focus,\n.datepicker table tr td.range.focus {\n  color: #000;\n  background-color: #d5d5d5;\n  border-color: #7c7c7c;\n}\n.datepicker table tr td.range:hover {\n  color: #000;\n  background-color: #d5d5d5;\n  border-color: #9d9d9d;\n}\n.datepicker table tr td.range:active,\n.datepicker table tr td.range.active {\n  color: #000;\n  background-color: #d5d5d5;\n  border-color: #9d9d9d;\n}\n.datepicker table tr td.range:active:hover,\n.datepicker table tr td.range.active:hover,\n.datepicker table tr td.range:active:focus,\n.datepicker table tr td.range.active:focus,\n.datepicker table tr td.range:active.focus,\n.datepicker table tr td.range.active.focus {\n  color: #000;\n  background-color: #c3c3c3;\n  border-color: #7c7c7c;\n}\n.datepicker table tr td.range.disabled:hover,\n.datepicker table tr td.range[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range:hover,\n.datepicker table tr td.range.disabled:focus,\n.datepicker table tr td.range[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range:focus,\n.datepicker table tr td.range.disabled.focus,\n.datepicker table tr td.range[disabled].focus,\nfieldset[disabled] .datepicker table tr td.range.focus {\n  background-color: #eeeeee;\n  border-color: #bbbbbb;\n}\n.datepicker table tr td.range.focused {\n  background: #d5d5d5;\n}\n.datepicker table tr td.range.disabled,\n.datepicker table tr td.range.disabled:active {\n  background: #eeeeee;\n  color: #777777;\n}\n.datepicker table tr td.range.highlighted {\n  color: #000;\n  background-color: #e4eef3;\n  border-color: #9dc1d3;\n}\n.datepicker table tr td.range.highlighted:focus,\n.datepicker table tr td.range.highlighted.focus {\n  color: #000;\n  background-color: #c1d7e3;\n  border-color: #4b88a6;\n}\n.datepicker table tr td.range.highlighted:hover {\n  color: #000;\n  background-color: #c1d7e3;\n  border-color: #73a6c0;\n}\n.datepicker table tr td.range.highlighted:active,\n.datepicker table tr td.range.highlighted.active {\n  color: #000;\n  background-color: #c1d7e3;\n  border-color: #73a6c0;\n}\n.datepicker table tr td.range.highlighted:active:hover,\n.datepicker table tr td.range.highlighted.active:hover,\n.datepicker table tr td.range.highlighted:active:focus,\n.datepicker table tr td.range.highlighted.active:focus,\n.datepicker table tr td.range.highlighted:active.focus,\n.datepicker table tr td.range.highlighted.active.focus {\n  color: #000;\n  background-color: #a8c8d8;\n  border-color: #4b88a6;\n}\n.datepicker table tr td.range.highlighted.disabled:hover,\n.datepicker table tr td.range.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range.highlighted:hover,\n.datepicker table tr td.range.highlighted.disabled:focus,\n.datepicker table tr td.range.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range.highlighted:focus,\n.datepicker table tr td.range.highlighted.disabled.focus,\n.datepicker table tr td.range.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.range.highlighted.focus {\n  background-color: #e4eef3;\n  border-color: #9dc1d3;\n}\n.datepicker table tr td.range.highlighted.focused {\n  background: #c1d7e3;\n}\n.datepicker table tr td.range.highlighted.disabled,\n.datepicker table tr td.range.highlighted.disabled:active {\n  background: #e4eef3;\n  color: #777777;\n}\n.datepicker table tr td.range.today {\n  color: #000;\n  background-color: #f7ca77;\n  border-color: #f1a417;\n}\n.datepicker table tr td.range.today:focus,\n.datepicker table tr td.range.today.focus {\n  color: #000;\n  background-color: #f4b747;\n  border-color: #815608;\n}\n.datepicker table tr td.range.today:hover {\n  color: #000;\n  background-color: #f4b747;\n  border-color: #bf800c;\n}\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today.active {\n  color: #000;\n  background-color: #f4b747;\n  border-color: #bf800c;\n}\n.datepicker table tr td.range.today:active:hover,\n.datepicker table tr td.range.today.active:hover,\n.datepicker table tr td.range.today:active:focus,\n.datepicker table tr td.range.today.active:focus,\n.datepicker table tr td.range.today:active.focus,\n.datepicker table tr td.range.today.active.focus {\n  color: #000;\n  background-color: #f2aa25;\n  border-color: #815608;\n}\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today.disabled:focus,\n.datepicker table tr td.range.today[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range.today:focus,\n.datepicker table tr td.range.today.disabled.focus,\n.datepicker table tr td.range.today[disabled].focus,\nfieldset[disabled] .datepicker table tr td.range.today.focus {\n  background-color: #f7ca77;\n  border-color: #f1a417;\n}\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today.disabled:active {\n  background: #f7ca77;\n  color: #777777;\n}\n.datepicker table tr td.selected,\n.datepicker table tr td.selected.highlighted {\n  color: #fff;\n  background-color: #777777;\n  border-color: #555555;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.selected:focus,\n.datepicker table tr td.selected.highlighted:focus,\n.datepicker table tr td.selected.focus,\n.datepicker table tr td.selected.highlighted.focus {\n  color: #fff;\n  background-color: #5e5e5e;\n  border-color: #161616;\n}\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected.highlighted:hover {\n  color: #fff;\n  background-color: #5e5e5e;\n  border-color: #373737;\n}\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected.highlighted:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected.highlighted.active {\n  color: #fff;\n  background-color: #5e5e5e;\n  border-color: #373737;\n}\n.datepicker table tr td.selected:active:hover,\n.datepicker table tr td.selected.highlighted:active:hover,\n.datepicker table tr td.selected.active:hover,\n.datepicker table tr td.selected.highlighted.active:hover,\n.datepicker table tr td.selected:active:focus,\n.datepicker table tr td.selected.highlighted:active:focus,\n.datepicker table tr td.selected.active:focus,\n.datepicker table tr td.selected.highlighted.active:focus,\n.datepicker table tr td.selected:active.focus,\n.datepicker table tr td.selected.highlighted:active.focus,\n.datepicker table tr td.selected.active.focus,\n.datepicker table tr td.selected.highlighted.active.focus {\n  color: #fff;\n  background-color: #4c4c4c;\n  border-color: #161616;\n}\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.highlighted.disabled:hover,\n.datepicker table tr td.selected[disabled]:hover,\n.datepicker table tr td.selected.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.selected:hover,\nfieldset[disabled] .datepicker table tr td.selected.highlighted:hover,\n.datepicker table tr td.selected.disabled:focus,\n.datepicker table tr td.selected.highlighted.disabled:focus,\n.datepicker table tr td.selected[disabled]:focus,\n.datepicker table tr td.selected.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.selected:focus,\nfieldset[disabled] .datepicker table tr td.selected.highlighted:focus,\n.datepicker table tr td.selected.disabled.focus,\n.datepicker table tr td.selected.highlighted.disabled.focus,\n.datepicker table tr td.selected[disabled].focus,\n.datepicker table tr td.selected.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.selected.focus,\nfieldset[disabled] .datepicker table tr td.selected.highlighted.focus {\n  background-color: #777777;\n  border-color: #555555;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active.highlighted {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:focus,\n.datepicker table tr td.active.highlighted:focus,\n.datepicker table tr td.active.focus,\n.datepicker table tr td.active.highlighted.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.highlighted:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active.highlighted:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active.highlighted.active {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td.active:active:hover,\n.datepicker table tr td.active.highlighted:active:hover,\n.datepicker table tr td.active.active:hover,\n.datepicker table tr td.active.highlighted.active:hover,\n.datepicker table tr td.active:active:focus,\n.datepicker table tr td.active.highlighted:active:focus,\n.datepicker table tr td.active.active:focus,\n.datepicker table tr td.active.highlighted.active:focus,\n.datepicker table tr td.active:active.focus,\n.datepicker table tr td.active.highlighted:active.focus,\n.datepicker table tr td.active.active.focus,\n.datepicker table tr td.active.highlighted.active.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.highlighted.disabled:hover,\n.datepicker table tr td.active[disabled]:hover,\n.datepicker table tr td.active.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.active:hover,\nfieldset[disabled] .datepicker table tr td.active.highlighted:hover,\n.datepicker table tr td.active.disabled:focus,\n.datepicker table tr td.active.highlighted.disabled:focus,\n.datepicker table tr td.active[disabled]:focus,\n.datepicker table tr td.active.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.active:focus,\nfieldset[disabled] .datepicker table tr td.active.highlighted:focus,\n.datepicker table tr td.active.disabled.focus,\n.datepicker table tr td.active.highlighted.disabled.focus,\n.datepicker table tr td.active[disabled].focus,\n.datepicker table tr td.active.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.active.focus,\nfieldset[disabled] .datepicker table tr td.active.highlighted.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover,\n.datepicker table tr td span.focused {\n  background: #eeeeee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #777777;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:focus,\n.datepicker table tr td span.active:hover:focus,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active.focus,\n.datepicker table tr td span.active:hover.focus,\n.datepicker table tr td span.active.disabled.focus,\n.datepicker table tr td span.active.disabled:hover.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td span.active:active:hover,\n.datepicker table tr td span.active:hover:active:hover,\n.datepicker table tr td span.active.disabled:active:hover,\n.datepicker table tr td span.active.disabled:hover:active:hover,\n.datepicker table tr td span.active.active:hover,\n.datepicker table tr td span.active:hover.active:hover,\n.datepicker table tr td span.active.disabled.active:hover,\n.datepicker table tr td span.active.disabled:hover.active:hover,\n.datepicker table tr td span.active:active:focus,\n.datepicker table tr td span.active:hover:active:focus,\n.datepicker table tr td span.active.disabled:active:focus,\n.datepicker table tr td span.active.disabled:hover:active:focus,\n.datepicker table tr td span.active.active:focus,\n.datepicker table tr td span.active:hover.active:focus,\n.datepicker table tr td span.active.disabled.active:focus,\n.datepicker table tr td span.active.disabled:hover.active:focus,\n.datepicker table tr td span.active:active.focus,\n.datepicker table tr td span.active:hover:active.focus,\n.datepicker table tr td span.active.disabled:active.focus,\n.datepicker table tr td span.active.disabled:hover:active.focus,\n.datepicker table tr td span.active.active.focus,\n.datepicker table tr td span.active:hover.active.focus,\n.datepicker table tr td span.active.disabled.active.focus,\n.datepicker table tr td span.active.disabled:hover.active.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active:hover.disabled:hover,\n.datepicker table tr td span.active.disabled.disabled:hover,\n.datepicker table tr td span.active.disabled:hover.disabled:hover,\n.datepicker table tr td span.active[disabled]:hover,\n.datepicker table tr td span.active:hover[disabled]:hover,\n.datepicker table tr td span.active.disabled[disabled]:hover,\n.datepicker table tr td span.active.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td span.active:hover,\nfieldset[disabled] .datepicker table tr td span.active:hover:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active:hover.disabled:focus,\n.datepicker table tr td span.active.disabled.disabled:focus,\n.datepicker table tr td span.active.disabled:hover.disabled:focus,\n.datepicker table tr td span.active[disabled]:focus,\n.datepicker table tr td span.active:hover[disabled]:focus,\n.datepicker table tr td span.active.disabled[disabled]:focus,\n.datepicker table tr td span.active.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td span.active:focus,\nfieldset[disabled] .datepicker table tr td span.active:hover:focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active.disabled.focus,\n.datepicker table tr td span.active:hover.disabled.focus,\n.datepicker table tr td span.active.disabled.disabled.focus,\n.datepicker table tr td span.active.disabled:hover.disabled.focus,\n.datepicker table tr td span.active[disabled].focus,\n.datepicker table tr td span.active:hover[disabled].focus,\n.datepicker table tr td span.active.disabled[disabled].focus,\n.datepicker table tr td span.active.disabled:hover[disabled].focus,\nfieldset[disabled] .datepicker table tr td span.active.focus,\nfieldset[disabled] .datepicker table tr td span.active:hover.focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled.focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.datepicker table tr td span.old,\n.datepicker table tr td span.new {\n  color: #777777;\n}\n.datepicker .datepicker-switch {\n  width: 145px;\n}\n.datepicker .datepicker-switch,\n.datepicker .prev,\n.datepicker .next,\n.datepicker tfoot tr th {\n  cursor: pointer;\n}\n.datepicker .datepicker-switch:hover,\n.datepicker .prev:hover,\n.datepicker .next:hover,\n.datepicker tfoot tr th:hover {\n  background: #eeeeee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.input-group.date .input-group-addon {\n  cursor: pointer;\n}\n.input-daterange {\n  width: 100%;\n}\n.input-daterange input {\n  text-align: center;\n}\n.input-daterange input:first-child {\n  border-radius: 3px 0 0 3px;\n}\n.input-daterange input:last-child {\n  border-radius: 0 3px 3px 0;\n}\n.input-daterange .input-group-addon {\n  width: auto;\n  min-width: 16px;\n  padding: 4px 5px;\n  line-height: 1.42857143;\n  text-shadow: 0 1px 0 #fff;\n  border-width: 1px 0;\n  margin-left: -5px;\n  margin-right: -5px;\n}\n/*# sourceMappingURL=bootstrap-datepicker3.css.map */"
  },
  {
    "path": "assets/bootstrap-datepicker-1.6.4-dist/css/bootstrap-datepicker3.standalone.css",
    "content": "/*!\n * Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)\n *\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)\n */\n.datepicker {\n  border-radius: 4px;\n  direction: ltr;\n}\n.datepicker-inline {\n  width: 220px;\n}\n.datepicker.datepicker-rtl {\n  direction: rtl;\n}\n.datepicker.datepicker-rtl table tr td span {\n  float: right;\n}\n.datepicker-dropdown {\n  top: 0;\n  left: 0;\n  padding: 4px;\n}\n.datepicker-dropdown:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid rgba(0, 0, 0, 0.15);\n  border-top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n}\n.datepicker-dropdown:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #fff;\n  border-top: 0;\n  position: absolute;\n}\n.datepicker-dropdown.datepicker-orient-left:before {\n  left: 6px;\n}\n.datepicker-dropdown.datepicker-orient-left:after {\n  left: 7px;\n}\n.datepicker-dropdown.datepicker-orient-right:before {\n  right: 6px;\n}\n.datepicker-dropdown.datepicker-orient-right:after {\n  right: 7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:before {\n  top: -7px;\n}\n.datepicker-dropdown.datepicker-orient-bottom:after {\n  top: -6px;\n}\n.datepicker-dropdown.datepicker-orient-top:before {\n  bottom: -7px;\n  border-bottom: 0;\n  border-top: 7px solid rgba(0, 0, 0, 0.15);\n}\n.datepicker-dropdown.datepicker-orient-top:after {\n  bottom: -6px;\n  border-bottom: 0;\n  border-top: 6px solid #fff;\n}\n.datepicker table {\n  margin: 0;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.datepicker table tr td,\n.datepicker table tr th {\n  text-align: center;\n  width: 30px;\n  height: 30px;\n  border-radius: 4px;\n  border: none;\n}\n.table-striped .datepicker table tr td,\n.table-striped .datepicker table tr th {\n  background-color: transparent;\n}\n.datepicker table tr td.old,\n.datepicker table tr td.new {\n  color: #777777;\n}\n.datepicker table tr td.day:hover,\n.datepicker table tr td.focused {\n  background: #eeeeee;\n  cursor: pointer;\n}\n.datepicker table tr td.disabled,\n.datepicker table tr td.disabled:hover {\n  background: none;\n  color: #777777;\n  cursor: default;\n}\n.datepicker table tr td.highlighted {\n  color: #000;\n  background-color: #d9edf7;\n  border-color: #85c5e5;\n  border-radius: 0;\n}\n.datepicker table tr td.highlighted:focus,\n.datepicker table tr td.highlighted.focus {\n  color: #000;\n  background-color: #afd9ee;\n  border-color: #298fc2;\n}\n.datepicker table tr td.highlighted:hover {\n  color: #000;\n  background-color: #afd9ee;\n  border-color: #52addb;\n}\n.datepicker table tr td.highlighted:active,\n.datepicker table tr td.highlighted.active {\n  color: #000;\n  background-color: #afd9ee;\n  border-color: #52addb;\n}\n.datepicker table tr td.highlighted:active:hover,\n.datepicker table tr td.highlighted.active:hover,\n.datepicker table tr td.highlighted:active:focus,\n.datepicker table tr td.highlighted.active:focus,\n.datepicker table tr td.highlighted:active.focus,\n.datepicker table tr td.highlighted.active.focus {\n  color: #000;\n  background-color: #91cbe8;\n  border-color: #298fc2;\n}\n.datepicker table tr td.highlighted.disabled:hover,\n.datepicker table tr td.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.highlighted:hover,\n.datepicker table tr td.highlighted.disabled:focus,\n.datepicker table tr td.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.highlighted:focus,\n.datepicker table tr td.highlighted.disabled.focus,\n.datepicker table tr td.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.highlighted.focus {\n  background-color: #d9edf7;\n  border-color: #85c5e5;\n}\n.datepicker table tr td.highlighted.focused {\n  background: #afd9ee;\n}\n.datepicker table tr td.highlighted.disabled,\n.datepicker table tr td.highlighted.disabled:active {\n  background: #d9edf7;\n  color: #777777;\n}\n.datepicker table tr td.today {\n  color: #000;\n  background-color: #ffdb99;\n  border-color: #ffb733;\n}\n.datepicker table tr td.today:focus,\n.datepicker table tr td.today.focus {\n  color: #000;\n  background-color: #ffc966;\n  border-color: #b37400;\n}\n.datepicker table tr td.today:hover {\n  color: #000;\n  background-color: #ffc966;\n  border-color: #f59e00;\n}\n.datepicker table tr td.today:active,\n.datepicker table tr td.today.active {\n  color: #000;\n  background-color: #ffc966;\n  border-color: #f59e00;\n}\n.datepicker table tr td.today:active:hover,\n.datepicker table tr td.today.active:hover,\n.datepicker table tr td.today:active:focus,\n.datepicker table tr td.today.active:focus,\n.datepicker table tr td.today:active.focus,\n.datepicker table tr td.today.active.focus {\n  color: #000;\n  background-color: #ffbc42;\n  border-color: #b37400;\n}\n.datepicker table tr td.today.disabled:hover,\n.datepicker table tr td.today[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled:focus,\n.datepicker table tr td.today[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.today:focus,\n.datepicker table tr td.today.disabled.focus,\n.datepicker table tr td.today[disabled].focus,\nfieldset[disabled] .datepicker table tr td.today.focus {\n  background-color: #ffdb99;\n  border-color: #ffb733;\n}\n.datepicker table tr td.today.focused {\n  background: #ffc966;\n}\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:active {\n  background: #ffdb99;\n  color: #777777;\n}\n.datepicker table tr td.range {\n  color: #000;\n  background-color: #eeeeee;\n  border-color: #bbbbbb;\n  border-radius: 0;\n}\n.datepicker table tr td.range:focus,\n.datepicker table tr td.range.focus {\n  color: #000;\n  background-color: #d5d5d5;\n  border-color: #7c7c7c;\n}\n.datepicker table tr td.range:hover {\n  color: #000;\n  background-color: #d5d5d5;\n  border-color: #9d9d9d;\n}\n.datepicker table tr td.range:active,\n.datepicker table tr td.range.active {\n  color: #000;\n  background-color: #d5d5d5;\n  border-color: #9d9d9d;\n}\n.datepicker table tr td.range:active:hover,\n.datepicker table tr td.range.active:hover,\n.datepicker table tr td.range:active:focus,\n.datepicker table tr td.range.active:focus,\n.datepicker table tr td.range:active.focus,\n.datepicker table tr td.range.active.focus {\n  color: #000;\n  background-color: #c3c3c3;\n  border-color: #7c7c7c;\n}\n.datepicker table tr td.range.disabled:hover,\n.datepicker table tr td.range[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range:hover,\n.datepicker table tr td.range.disabled:focus,\n.datepicker table tr td.range[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range:focus,\n.datepicker table tr td.range.disabled.focus,\n.datepicker table tr td.range[disabled].focus,\nfieldset[disabled] .datepicker table tr td.range.focus {\n  background-color: #eeeeee;\n  border-color: #bbbbbb;\n}\n.datepicker table tr td.range.focused {\n  background: #d5d5d5;\n}\n.datepicker table tr td.range.disabled,\n.datepicker table tr td.range.disabled:active {\n  background: #eeeeee;\n  color: #777777;\n}\n.datepicker table tr td.range.highlighted {\n  color: #000;\n  background-color: #e4eef3;\n  border-color: #9dc1d3;\n}\n.datepicker table tr td.range.highlighted:focus,\n.datepicker table tr td.range.highlighted.focus {\n  color: #000;\n  background-color: #c1d7e3;\n  border-color: #4b88a6;\n}\n.datepicker table tr td.range.highlighted:hover {\n  color: #000;\n  background-color: #c1d7e3;\n  border-color: #73a6c0;\n}\n.datepicker table tr td.range.highlighted:active,\n.datepicker table tr td.range.highlighted.active {\n  color: #000;\n  background-color: #c1d7e3;\n  border-color: #73a6c0;\n}\n.datepicker table tr td.range.highlighted:active:hover,\n.datepicker table tr td.range.highlighted.active:hover,\n.datepicker table tr td.range.highlighted:active:focus,\n.datepicker table tr td.range.highlighted.active:focus,\n.datepicker table tr td.range.highlighted:active.focus,\n.datepicker table tr td.range.highlighted.active.focus {\n  color: #000;\n  background-color: #a8c8d8;\n  border-color: #4b88a6;\n}\n.datepicker table tr td.range.highlighted.disabled:hover,\n.datepicker table tr td.range.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range.highlighted:hover,\n.datepicker table tr td.range.highlighted.disabled:focus,\n.datepicker table tr td.range.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range.highlighted:focus,\n.datepicker table tr td.range.highlighted.disabled.focus,\n.datepicker table tr td.range.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.range.highlighted.focus {\n  background-color: #e4eef3;\n  border-color: #9dc1d3;\n}\n.datepicker table tr td.range.highlighted.focused {\n  background: #c1d7e3;\n}\n.datepicker table tr td.range.highlighted.disabled,\n.datepicker table tr td.range.highlighted.disabled:active {\n  background: #e4eef3;\n  color: #777777;\n}\n.datepicker table tr td.range.today {\n  color: #000;\n  background-color: #f7ca77;\n  border-color: #f1a417;\n}\n.datepicker table tr td.range.today:focus,\n.datepicker table tr td.range.today.focus {\n  color: #000;\n  background-color: #f4b747;\n  border-color: #815608;\n}\n.datepicker table tr td.range.today:hover {\n  color: #000;\n  background-color: #f4b747;\n  border-color: #bf800c;\n}\n.datepicker table tr td.range.today:active,\n.datepicker table tr td.range.today.active {\n  color: #000;\n  background-color: #f4b747;\n  border-color: #bf800c;\n}\n.datepicker table tr td.range.today:active:hover,\n.datepicker table tr td.range.today.active:hover,\n.datepicker table tr td.range.today:active:focus,\n.datepicker table tr td.range.today.active:focus,\n.datepicker table tr td.range.today:active.focus,\n.datepicker table tr td.range.today.active.focus {\n  color: #000;\n  background-color: #f2aa25;\n  border-color: #815608;\n}\n.datepicker table tr td.range.today.disabled:hover,\n.datepicker table tr td.range.today[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.range.today:hover,\n.datepicker table tr td.range.today.disabled:focus,\n.datepicker table tr td.range.today[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.range.today:focus,\n.datepicker table tr td.range.today.disabled.focus,\n.datepicker table tr td.range.today[disabled].focus,\nfieldset[disabled] .datepicker table tr td.range.today.focus {\n  background-color: #f7ca77;\n  border-color: #f1a417;\n}\n.datepicker table tr td.range.today.disabled,\n.datepicker table tr td.range.today.disabled:active {\n  background: #f7ca77;\n  color: #777777;\n}\n.datepicker table tr td.selected,\n.datepicker table tr td.selected.highlighted {\n  color: #fff;\n  background-color: #777777;\n  border-color: #555555;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.selected:focus,\n.datepicker table tr td.selected.highlighted:focus,\n.datepicker table tr td.selected.focus,\n.datepicker table tr td.selected.highlighted.focus {\n  color: #fff;\n  background-color: #5e5e5e;\n  border-color: #161616;\n}\n.datepicker table tr td.selected:hover,\n.datepicker table tr td.selected.highlighted:hover {\n  color: #fff;\n  background-color: #5e5e5e;\n  border-color: #373737;\n}\n.datepicker table tr td.selected:active,\n.datepicker table tr td.selected.highlighted:active,\n.datepicker table tr td.selected.active,\n.datepicker table tr td.selected.highlighted.active {\n  color: #fff;\n  background-color: #5e5e5e;\n  border-color: #373737;\n}\n.datepicker table tr td.selected:active:hover,\n.datepicker table tr td.selected.highlighted:active:hover,\n.datepicker table tr td.selected.active:hover,\n.datepicker table tr td.selected.highlighted.active:hover,\n.datepicker table tr td.selected:active:focus,\n.datepicker table tr td.selected.highlighted:active:focus,\n.datepicker table tr td.selected.active:focus,\n.datepicker table tr td.selected.highlighted.active:focus,\n.datepicker table tr td.selected:active.focus,\n.datepicker table tr td.selected.highlighted:active.focus,\n.datepicker table tr td.selected.active.focus,\n.datepicker table tr td.selected.highlighted.active.focus {\n  color: #fff;\n  background-color: #4c4c4c;\n  border-color: #161616;\n}\n.datepicker table tr td.selected.disabled:hover,\n.datepicker table tr td.selected.highlighted.disabled:hover,\n.datepicker table tr td.selected[disabled]:hover,\n.datepicker table tr td.selected.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.selected:hover,\nfieldset[disabled] .datepicker table tr td.selected.highlighted:hover,\n.datepicker table tr td.selected.disabled:focus,\n.datepicker table tr td.selected.highlighted.disabled:focus,\n.datepicker table tr td.selected[disabled]:focus,\n.datepicker table tr td.selected.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.selected:focus,\nfieldset[disabled] .datepicker table tr td.selected.highlighted:focus,\n.datepicker table tr td.selected.disabled.focus,\n.datepicker table tr td.selected.highlighted.disabled.focus,\n.datepicker table tr td.selected[disabled].focus,\n.datepicker table tr td.selected.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.selected.focus,\nfieldset[disabled] .datepicker table tr td.selected.highlighted.focus {\n  background-color: #777777;\n  border-color: #555555;\n}\n.datepicker table tr td.active,\n.datepicker table tr td.active.highlighted {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td.active:focus,\n.datepicker table tr td.active.highlighted:focus,\n.datepicker table tr td.active.focus,\n.datepicker table tr td.active.highlighted.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active.highlighted:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td.active:active,\n.datepicker table tr td.active.highlighted:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active.highlighted.active {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td.active:active:hover,\n.datepicker table tr td.active.highlighted:active:hover,\n.datepicker table tr td.active.active:hover,\n.datepicker table tr td.active.highlighted.active:hover,\n.datepicker table tr td.active:active:focus,\n.datepicker table tr td.active.highlighted:active:focus,\n.datepicker table tr td.active.active:focus,\n.datepicker table tr td.active.highlighted.active:focus,\n.datepicker table tr td.active:active.focus,\n.datepicker table tr td.active.highlighted:active.focus,\n.datepicker table tr td.active.active.focus,\n.datepicker table tr td.active.highlighted.active.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.highlighted.disabled:hover,\n.datepicker table tr td.active[disabled]:hover,\n.datepicker table tr td.active.highlighted[disabled]:hover,\nfieldset[disabled] .datepicker table tr td.active:hover,\nfieldset[disabled] .datepicker table tr td.active.highlighted:hover,\n.datepicker table tr td.active.disabled:focus,\n.datepicker table tr td.active.highlighted.disabled:focus,\n.datepicker table tr td.active[disabled]:focus,\n.datepicker table tr td.active.highlighted[disabled]:focus,\nfieldset[disabled] .datepicker table tr td.active:focus,\nfieldset[disabled] .datepicker table tr td.active.highlighted:focus,\n.datepicker table tr td.active.disabled.focus,\n.datepicker table tr td.active.highlighted.disabled.focus,\n.datepicker table tr td.active[disabled].focus,\n.datepicker table tr td.active.highlighted[disabled].focus,\nfieldset[disabled] .datepicker table tr td.active.focus,\nfieldset[disabled] .datepicker table tr td.active.highlighted.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.datepicker table tr td span {\n  display: block;\n  width: 23%;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 1%;\n  cursor: pointer;\n  border-radius: 4px;\n}\n.datepicker table tr td span:hover,\n.datepicker table tr td span.focused {\n  background: #eeeeee;\n}\n.datepicker table tr td span.disabled,\n.datepicker table tr td span.disabled:hover {\n  background: none;\n  color: #777777;\n  cursor: default;\n}\n.datepicker table tr td span.active,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active.disabled,\n.datepicker table tr td span.active.disabled:hover {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker table tr td span.active:focus,\n.datepicker table tr td span.active:hover:focus,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active.focus,\n.datepicker table tr td span.active:hover.focus,\n.datepicker table tr td span.active.disabled.focus,\n.datepicker table tr td span.active.disabled:hover.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.datepicker table tr td span.active:active:hover,\n.datepicker table tr td span.active:hover:active:hover,\n.datepicker table tr td span.active.disabled:active:hover,\n.datepicker table tr td span.active.disabled:hover:active:hover,\n.datepicker table tr td span.active.active:hover,\n.datepicker table tr td span.active:hover.active:hover,\n.datepicker table tr td span.active.disabled.active:hover,\n.datepicker table tr td span.active.disabled:hover.active:hover,\n.datepicker table tr td span.active:active:focus,\n.datepicker table tr td span.active:hover:active:focus,\n.datepicker table tr td span.active.disabled:active:focus,\n.datepicker table tr td span.active.disabled:hover:active:focus,\n.datepicker table tr td span.active.active:focus,\n.datepicker table tr td span.active:hover.active:focus,\n.datepicker table tr td span.active.disabled.active:focus,\n.datepicker table tr td span.active.disabled:hover.active:focus,\n.datepicker table tr td span.active:active.focus,\n.datepicker table tr td span.active:hover:active.focus,\n.datepicker table tr td span.active.disabled:active.focus,\n.datepicker table tr td span.active.disabled:hover:active.focus,\n.datepicker table tr td span.active.active.focus,\n.datepicker table tr td span.active:hover.active.focus,\n.datepicker table tr td span.active.disabled.active.focus,\n.datepicker table tr td span.active.disabled:hover.active.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active:hover.disabled:hover,\n.datepicker table tr td span.active.disabled.disabled:hover,\n.datepicker table tr td span.active.disabled:hover.disabled:hover,\n.datepicker table tr td span.active[disabled]:hover,\n.datepicker table tr td span.active:hover[disabled]:hover,\n.datepicker table tr td span.active.disabled[disabled]:hover,\n.datepicker table tr td span.active.disabled:hover[disabled]:hover,\nfieldset[disabled] .datepicker table tr td span.active:hover,\nfieldset[disabled] .datepicker table tr td span.active:hover:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active:hover.disabled:focus,\n.datepicker table tr td span.active.disabled.disabled:focus,\n.datepicker table tr td span.active.disabled:hover.disabled:focus,\n.datepicker table tr td span.active[disabled]:focus,\n.datepicker table tr td span.active:hover[disabled]:focus,\n.datepicker table tr td span.active.disabled[disabled]:focus,\n.datepicker table tr td span.active.disabled:hover[disabled]:focus,\nfieldset[disabled] .datepicker table tr td span.active:focus,\nfieldset[disabled] .datepicker table tr td span.active:hover:focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active.disabled.focus,\n.datepicker table tr td span.active:hover.disabled.focus,\n.datepicker table tr td span.active.disabled.disabled.focus,\n.datepicker table tr td span.active.disabled:hover.disabled.focus,\n.datepicker table tr td span.active[disabled].focus,\n.datepicker table tr td span.active:hover[disabled].focus,\n.datepicker table tr td span.active.disabled[disabled].focus,\n.datepicker table tr td span.active.disabled:hover[disabled].focus,\nfieldset[disabled] .datepicker table tr td span.active.focus,\nfieldset[disabled] .datepicker table tr td span.active:hover.focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled.focus,\nfieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.datepicker table tr td span.old,\n.datepicker table tr td span.new {\n  color: #777777;\n}\n.datepicker .datepicker-switch {\n  width: 145px;\n}\n.datepicker .datepicker-switch,\n.datepicker .prev,\n.datepicker .next,\n.datepicker tfoot tr th {\n  cursor: pointer;\n}\n.datepicker .datepicker-switch:hover,\n.datepicker .prev:hover,\n.datepicker .next:hover,\n.datepicker tfoot tr th:hover {\n  background: #eeeeee;\n}\n.datepicker .cw {\n  font-size: 10px;\n  width: 12px;\n  padding: 0 2px 0 5px;\n  vertical-align: middle;\n}\n.input-group.date .input-group-addon {\n  cursor: pointer;\n}\n.input-daterange {\n  width: 100%;\n}\n.input-daterange input {\n  text-align: center;\n}\n.input-daterange input:first-child {\n  border-radius: 3px 0 0 3px;\n}\n.input-daterange input:last-child {\n  border-radius: 0 3px 3px 0;\n}\n.input-daterange .input-group-addon {\n  width: auto;\n  min-width: 16px;\n  padding: 4px 5px;\n  line-height: 1.42857143;\n  text-shadow: 0 1px 0 #fff;\n  border-width: 1px 0;\n  margin-left: -5px;\n  margin-right: -5px;\n}\n.datepicker.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  list-style: none;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  color: #333333;\n  font-size: 13px;\n  line-height: 1.42857143;\n}\n.datepicker.dropdown-menu th,\n.datepicker.datepicker-inline th,\n.datepicker.dropdown-menu td,\n.datepicker.datepicker-inline td {\n  padding: 0px 5px;\n}\n/*# sourceMappingURL=bootstrap-datepicker3.standalone.css.map */"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/.github/ISSUE_TEMPLATE.md",
    "content": "Before posting, please see [guidelines for contributing](https://github.com/silviomoreto/bootstrap-select/blob/master/CONTRIBUTING.md). If you're submitting a bug report, see below.\n\n## Bug reports\n\nA bug is a _demonstrable problem_ that is caused by the code in the repository.\nGood bug reports are extremely helpful - thank you!\n\nGuidelines for bug reports:\n\n1. **Use the GitHub issue search.** Check if the issue has already been\n   reported.\n\n2. **Check if the issue has been fixed.** Try to reproduce it using the\n   latest `master` or development branch in the repository.\n\n3. **Provide environment details.** Provide your operating system, browser(s),\n   jQuery version, Bootstrap version, and bootstrap-select version.\n\n4. **Create an isolated and reproducible test case.** Create a [reduced test\n   case](http://css-tricks.com/6263-reduced-test-cases/).\n\n5. **Include a live example.** Use [this Plunker debugging template](http://silviomoreto.github.io/bootstrap-select/playground/) to share your isolated test cases. You can also make use of [jsFiddle](http://jsfiddle.net/) or [jsBin](http://jsbin.com/).\n\nA good bug report shouldn't leave others needing to chase you up for more\ninformation. Please try to be as detailed as possible in your report. What is\nyour environment? What steps will reproduce the issue? What browser(s) and OS\nexperience the problem? What would you expect to be the outcome? All these\ndetails will help people to fix any potential bugs.\n\nExample:\n\n> Short and descriptive example bug report title\n>\n> A summary of the issue and the browser/OS environment in which it occurs. If\n> suitable, include the steps required to reproduce the bug.\n>\n> 1. This is the first step\n> 2. This is the second step\n> 3. Further steps, etc.\n>\n> `<url>` - a link to the reduced test case\n>\n> Any other information you want to share that is relevant to the issue being\n> reported. This might include the lines of code that you have identified as\n> causing the bug, and potential solutions (and your opinions on their\n> merits).\n\n## Erase the above text and being typing. Thanks!"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/.gitignore",
    "content": "# OS or Editor folders\n.DS_Store\n.idea\n\n# Folders to ignore\nnode_modules\nbower_components\n.sass-cache\n\n# Dist zip\nbootstrap-select-*.zip\n\ndocs/site\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/CHANGELOG.md",
    "content": "### v1.12.2 (2017-01-30)\n\n## Bug Fixes\n* [#1563]: key word searching broken in [#1516].\n* [#1570]: properly adjust size when inside form-group-sm or form-group-lg\n* [#1590]: menu height calculated improperly when using liveSearch and input has custom height\n\n[#1563]: https://github.com/silviomoreto/bootstrap-select/issues/1563\n[#1570]: https://github.com/silviomoreto/bootstrap-select/issues/1570\n[#1590]: https://github.com/silviomoreto/bootstrap-select/issues/1590\n\n-------------------\n\n### v1.12.1 (2016-11-22)\n\n## Bug Fixes\n* [#1167], [#1366]: using a method before initializing bootstrap-select throws an error\n\n[#1167]: https://github.com/silviomoreto/bootstrap-select/issues/1167\n[#1366]: https://github.com/silviomoreto/bootstrap-select/issues/1366\n\n-------------------\n\n### v1.12.0 (2016-11-18)\n\n## Bug Fixes\n* [#1220]: unescape button title\n* [#1348]: escape HTML for optgroup label\n* [#1506]: Fix bs-placeholder usage for jQuery>=3.0\n* [#1509]: inline style Content Security Policy\n* [#1477]: using liveSearchNormalize and liveSearchStyle=\"startsWith\" simultaneously breaks search\n* [#1489] fix selectOnTab with liveSearch enabled which was broken when [#1489] was fixed\n* [#1533]: remove touchstart event listener (issues with FastClick)\n* remove destroyLi function - improve refresh() performance\n* [#1531]: add Spanish (Spain) translations\n* [#1553]: don't use replace in normalizeToBase if text is undefined (throws error otherwise)\n\n## New Features\n* [#1503]: Add windowPadding option (either a number or an array of numbers - [top, right, bottom, left])\n* [#1516]: Improve liveSearch performance (addresses [#1275])\n* [#1440]: allow HTML in placeholder title for non-multiple selects\n* [#1555]: Use default with SCSS variables\n\n[#1220]: https://github.com/silviomoreto/bootstrap-select/issues/1220\n[#1275]: https://github.com/silviomoreto/bootstrap-select/issues/1275\n[#1348]: https://github.com/silviomoreto/bootstrap-select/issues/1348\n[#1506]: https://github.com/silviomoreto/bootstrap-select/issues/1506\n[#1509]: https://github.com/silviomoreto/bootstrap-select/issues/1509\n[#1477]: https://github.com/silviomoreto/bootstrap-select/issues/1477\n[#1489]: https://github.com/silviomoreto/bootstrap-select/issues/1489\n[#1533]: https://github.com/silviomoreto/bootstrap-select/issues/1533\n[#1531]: https://github.com/silviomoreto/bootstrap-select/issues/1531\n[#1503]: https://github.com/silviomoreto/bootstrap-select/issues/1503\n[#1516]: https://github.com/silviomoreto/bootstrap-select/issues/1516\n[#1440]: https://github.com/silviomoreto/bootstrap-select/issues/1440\n[#1553]: https://github.com/silviomoreto/bootstrap-select/issues/1553\n[#1555]: https://github.com/silviomoreto/bootstrap-select/issues/1555\n\n-------------------\n\n### v1.11.2 (2016-09-09)\n\n#### Bug Fixes\n* fix sourceMappingURL in bootstrap-select.min.js\n\n-------------------\n\n### v1.11.1 (2016-09-09)\n\n#### Bug Fixes\n* [#1475]: fix Cannot read property 'apply' of null error\n* [#1484]: Change events fire twice on IE8\n* [#1489]: hide.bs.select and hidden.bs.select events not fired when \"Esc\" key pressed with live search enabled\n\n[#1475]: https://github.com/silviomoreto/bootstrap-select/issues/1475\n[#1484]: https://github.com/silviomoreto/bootstrap-select/issues/1484\n[#1489]: https://github.com/silviomoreto/bootstrap-select/issues/1489\n\n-------------------\n\n### v1.11.0 (2016-08-16)\n\n#### Bug Fixes\n* [#1291]: don't trigger change event if selecting an option that passes the limit\n* [#1284]: check if all options are already selected/deselected before triggering changed/changed.bs.select\n* [#1245], [#1310]: With livesearch, when keypress, focus to search field isn't working with some characters\n* [#1257]: fix issue with Norwegian translation\n* [#1346]: fix edge case where default values are not respected when initializing the plugin\n* [#1338]: improve support for disabled optgroups and hidden options\n* [#1373]: prevent selectAll and deselectAll from being called on standard select boxes\n* [#1363]: if hideDisabled is enabled, and all options in an optgroup are disabled, the optgroup is still visible\n* [#1422]: fix menu position inside a scrolling container\n* [#1451]: fix select with input-group-addon on both sides\n* [#1465]: changed.bs.select not firing for native mobile menu\n* [#1459]: jQuery 3 support - $.expr[':'] -> $.expr.pseudos\n\n#### New Features\n* [#1139]: add placeholder styling via `bs-placeholder` class\n* [#1290]: auto close the menu if maxOptions is set to 1 (instead of leaving open)\n* [#1127], [#1016], [#1160], [#1269]: add 'auto' option for dropdownAlignRight\n* [58ed408]: support using a string for maxOptionsText\n* [#541]: ARIA - Accessibility\n\n[#1291]: https://github.com/silviomoreto/bootstrap-select/issues/1291\n[#1284]: https://github.com/silviomoreto/bootstrap-select/issues/1284\n[#1245]: https://github.com/silviomoreto/bootstrap-select/issues/1245\n[#1257]: https://github.com/silviomoreto/bootstrap-select/issues/1257\n[#1310]: https://github.com/silviomoreto/bootstrap-select/issues/1310\n[#1346]: https://github.com/silviomoreto/bootstrap-select/issues/1346\n[#1338]: https://github.com/silviomoreto/bootstrap-select/issues/1338\n[#1373]: https://github.com/silviomoreto/bootstrap-select/issues/1373\n[#1363]: https://github.com/silviomoreto/bootstrap-select/issues/1363\n[#1422]: https://github.com/silviomoreto/bootstrap-select/issues/1422\n[#1451]: https://github.com/silviomoreto/bootstrap-select/issues/1451\n[#1465]: https://github.com/silviomoreto/bootstrap-select/issues/1465\n[#1459]: https://github.com/silviomoreto/bootstrap-select/issues/1459\n[#1139]: https://github.com/silviomoreto/bootstrap-select/issues/1139\n[#1290]: https://github.com/silviomoreto/bootstrap-select/issues/1290\n[#1127]: https://github.com/silviomoreto/bootstrap-select/issues/1127\n[#1016]: https://github.com/silviomoreto/bootstrap-select/issues/1016\n[#1160]: https://github.com/silviomoreto/bootstrap-select/issues/1160\n[#1269]: https://github.com/silviomoreto/bootstrap-select/issues/1269\n[58ed408]: https://github.com/silviomoreto/bootstrap-select/commit/58ed4085019526141be07beeada37788dfe2d316\n[#541]: https://github.com/silviomoreto/bootstrap-select/issues/541\n\n-------------------\n\n### v1.10.0 (2016-02-17)\n\n#### Bug Fixes\n* [#1268]: performance bug in clickListener\n* [#1273]: html5 validation message disappears in Chrome 47+\n* [#1295]: hide select by default (so there is no flash of unstyled content)\n\n#### New Features\n* [#950]: add `.selectpicker('toggle')` method to allow menu to be open/closed programmatically\n* [#1272]: add showTick option\n* [#1284]: selectAll and deselectAll now trigger the `changed.bs.select` event\n\nAdd Lithuanian translations.\n\n[#1268]: https://github.com/silviomoreto/bootstrap-select/issues/1268\n[#1273]: https://github.com/silviomoreto/bootstrap-select/issues/1273\n[#1295]: https://github.com/silviomoreto/bootstrap-select/issues/1295\n[#950]: https://github.com/silviomoreto/bootstrap-select/issues/950\n[#1272]: https://github.com/silviomoreto/bootstrap-select/issues/1272\n[#1284]: https://github.com/silviomoreto/bootstrap-select/issues/1284\n\n-------------------\n\n### v1.9.4 (2016-01-18)\n\n#### Bug fixes\n* [#1250]: don't destroy original select when using `destroy` method\n* [#1230]: Optgroup label missing when first option is disabled and `hideDisabled` is true\n\nAdd new translations.\n\n[#1250]: https://github.com/silviomoreto/bootstrap-select/issues/1250\n[#1230]: https://github.com/silviomoreto/bootstrap-select/issues/1230\n\n-------------------\n\n### v1.9.3 (2015-12-16)\n\n#### Bug fixes\n* Fix [#1235] - issue with selects that had `form-control` class\n\n[#1235]: https://github.com/silviomoreto/bootstrap-select/issues/1235\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/CONTRIBUTING.md",
    "content": "# Contributing to this project\n\nPlease take a moment to review this document in order to make the contribution\nprocess easy and effective for everyone involved.\n\nFollowing these guidelines helps to communicate that you respect the time of\nthe developers managing and developing this open source project. In return,\nthey should reciprocate that respect in addressing your issue or assessing\npatches and features.\n\n\n## Using the issue tracker\n\nThe issue tracker is the preferred channel for [bug reports](#bug-reports),\n[features requests](#feature-requests) and submitting pull requests, but please\nrespect the following restrictions:\n\n* Please **do not** use the issue tracker for personal support requests (use\n  [Stack Overflow](http://stackoverflow.com) or IRC).\n\n* Please **do not** derail or troll issues. Keep the discussion on topic and\n  respect the opinions of others.\n\n\n## Bug reports\n\nA bug is a _demonstrable problem_ that is caused by the code in the repository.\nGood bug reports are extremely helpful - thank you!\n\nGuidelines for bug reports:\n\n1. **Use the GitHub issue search.** Check if the issue has already been\n   reported.\n\n2. **Check if the issue has been fixed.** Try to reproduce it using the\n   latest `master` or development branch in the repository.\n\n3. **Provide environment details.** Provide your operating system, browser(s),\n   jQuery version, Bootstrap version, and bootstrap-select version.\n\n4. **Create an isolated and reproducible test case.** Create a [reduced test\n   case](http://css-tricks.com/6263-reduced-test-cases/).\n\n5. **Include a live example.** Use [this Plunker debugging template](http://silviomoreto.github.io/bootstrap-select/playground/) to share your isolated test cases. You can also make use of [jsFiddle](http://jsfiddle.net/) or [jsBin](http://jsbin.com/).\n\nA good bug report shouldn't leave others needing to chase you up for more\ninformation. Please try to be as detailed as possible in your report. What is\nyour environment? What steps will reproduce the issue? What browser(s) and OS\nexperience the problem? What would you expect to be the outcome? All these\ndetails will help people to fix any potential bugs.\n\nExample:\n\n> Short and descriptive example bug report title\n>\n> A summary of the issue and the browser/OS environment in which it occurs. If\n> suitable, include the steps required to reproduce the bug.\n>\n> 1. This is the first step\n> 2. This is the second step\n> 3. Further steps, etc.\n>\n> `<url>` - a link to the reduced test case\n>\n> Any other information you want to share that is relevant to the issue being\n> reported. This might include the lines of code that you have identified as\n> causing the bug, and potential solutions (and your opinions on their\n> merits).\n\n\n## Feature requests\n\nFeature requests are welcome. But take a moment to find out whether your idea\nfits with the scope and aims of the project. It's up to *you* to make a strong\ncase to convince the project's developers of the merits of this feature. Please\nprovide as much detail and context as possible.\n\n## Pull Request Guidelines\n\nYou must understand that by contributing code to this project, you are granting\nthe authors (and/or leaders) of the project a non-exclusive license to\nre-distribute your code under the current license and possibly re-license the\ncode as deemed necessary.\n\n* To instantiate a context or use it, use the variable **that** instead of\n  **_this**.\n* Please check to make sure that there aren't existing pull requests attempting\n  to address the issue mentioned. We also recommend checking for issues related\n  to the issue on the tracker, as a team member may be working on the issue in\n  a branch or fork.\n* Non-trivial changes should be discussed in an issue first\n* When modifying files, please do not edit the generated or minified files in the dist/ directory. Please edit the original files.\n* If possible, add relevant tests to cover the change\n* Write a convincing description of your PR and why we should land it\n\n## Using Grunt\n\nWe are using node and grunt to build and (in the future) test this project.\nThis means that you must setup a local development environment:\n\n1. Install `node` and `npm` using your preferred method\n2. Install the grunt CLI: `npm install -g grunt-cli`\n3. Install the project's development dependencies: `npm install`\n4. Run the various grunt tasks as needed:\n   - `grunt`: clean the distribution files and re-build them\n   - `grunt dist`: build the distribution files\n   - `grunt clean`: clean the distribution files\n   - `grunt dist-css`: build the css distribution files\n   - `grunt dist-js`: build the javascript distribution files\n   - `grunt watch`: watch for changes in the source files and build the\n     distribution files as needed\n\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/Gruntfile.js",
    "content": "module.exports = function (grunt) {\n\n  // From TWBS\n  RegExp.quote = function (string) {\n    return string.replace(/[-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n  };\n\n  // Project configuration.\n  grunt.initConfig({\n\n    // Metadata.\n    pkg: grunt.file.readJSON('package.json'),\n    banner: '/*!\\n' +\n    ' * Bootstrap-select v<%= pkg.version %> (<%= pkg.homepage %>)\\n' +\n    ' *\\n' +\n    ' * Copyright 2013-<%= grunt.template.today(\\'yyyy\\') %> bootstrap-select\\n' +\n    ' * Licensed under <%= pkg.license %> (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\\n' +\n    ' */\\n',\n\n    // Task configuration.\n\n    clean: {\n      css: 'dist/css',\n      js: 'dist/js',\n      docs: 'docs/docs/dist'\n    },\n\n    jshint: {\n      options: {\n        jshintrc: 'js/.jshintrc'\n      },\n      gruntfile: {\n        options: {\n          'node': true\n        },\n        src: 'Gruntfile.js'\n      },\n      main: {\n        src: 'js/*.js'\n      },\n      i18n: {\n        src: 'js/i18n/*.js'\n      }\n    },\n\n    concat: {\n      options: {\n        stripBanners: true\n      },\n      main: {\n        src: '<%= jshint.main.src %>',\n        dest: 'dist/js/<%= pkg.name %>.js'\n      },\n      i18n: {\n        expand: true,\n        src: '<%= jshint.i18n.src %>',\n        dest: 'dist/'\n      }\n    },\n\n    umd: {\n      main: {\n        options: {\n          deps: {\n            'default': ['jQuery'],\n            amd: ['jquery'],\n            cjs: ['jquery'],\n            global: ['jQuery']\n          }\n        },\n        src: '<%= concat.main.dest %>'\n      },\n      i18n: {\n        options: {\n          deps: {\n            'default': ['jQuery'],\n            amd: ['jquery'],\n            cjs: ['jquery'],\n            global: ['jQuery']\n          }\n        },\n        src: 'dist/<%= jshint.i18n.src %>',\n        dest: '.'\n      }\n    },\n\n    uglify: {\n      options: {\n        preserveComments: function(node, comment) {\n          return /^!|@preserve|@license|@cc_on/i.test(comment.value);\n        }\n      },\n      main: {\n        src: '<%= concat.main.dest %>',\n        dest: 'dist/js/<%= pkg.name %>.min.js',\n        options: {\n          sourceMap: true,\n          sourceMapName: 'dist/js/<%= pkg.name %>.js.map'\n        }\n      },\n      i18n: {\n        expand: true,\n        src: 'dist/<%= jshint.i18n.src %>',\n        ext: '.min.js'\n      }\n    },\n\n    less: {\n      options: {\n        strictMath: true,\n        sourceMap: true,\n        outputSourceFiles: true,\n        sourceMapURL: '<%= pkg.name %>.css.map',\n        sourceMapFilename: '<%= less.css.dest %>.map'\n      },\n      css: {\n        src: 'less/bootstrap-select.less',\n        dest: 'dist/css/<%= pkg.name %>.css'\n      }\n    },\n\n    usebanner: {\n      css: {\n        options: {\n          banner: '<%= banner %>'\n        },\n        src: '<%= less.css.dest %>'\n      },\n      js: {\n        options: {\n          banner: '<%= banner %>'\n        },\n        src: [\n          '<%= concat.main.dest %>',\n          '<%= uglify.main.dest %>',\n          'dist/<%= jshint.i18n.src %>',\n        ]\n      }\n    },\n\n    copy: {\n      docs: {\n        expand: true,\n        cwd: 'dist/',\n        src: [\n          '**/*'\n        ],\n        dest: 'docs/docs/dist/'\n      }\n    },\n\n    cssmin: {\n      options: {\n        compatibility: 'ie8',\n        keepSpecialComments: '*',\n        advanced: false\n      },\n      css: {\n        src: '<%= less.css.dest %>',\n        dest: 'dist/css/<%= pkg.name %>.min.css'\n      }\n    },\n\n    csslint: {\n      options: {\n        'adjoining-classes': false,\n        'box-sizing': false,\n        'box-model': false,\n        'compatible-vendor-prefixes': false,\n        'floats': false,\n        'font-sizes': false,\n        'gradients': false,\n        'important': false,\n        'known-properties': false,\n        'outline-none': false,\n        'qualified-headings': false,\n        'regex-selectors': false,\n        'shorthand': false,\n        'text-indent': false,\n        'unique-headings': false,\n        'universal-selector': false,\n        'unqualified-attributes': false,\n        'overqualified-elements': false\n      },\n      css: {\n        src: '<%= less.css.dest %>'\n      }\n    },\n\n    version: {\n      js: {\n        options: {\n          prefix: 'Selectpicker.VERSION = \\''\n        },\n        src: [\n          'js/<%= pkg.name %>.js'\n        ],\n      },\n      cdn: {\n        options: {\n          prefix: 'ajax/libs/<%= pkg.name %>/'\n        },\n        src: [\n          'README.md',\n          'docs/docs/index.md'\n        ],\n      },\n      nuget: {\n        options: {\n          prefix: '<version>'\n        },\n        src: [\n          'nuget/bootstrap-select.nuspec'\n        ],\n      },\n      default: {\n        options: {\n          prefix: '[\\'\"]?version[\\'\"]?:[ \"\\']*'\n        },\n        src: [\n          'composer.json',\n          'docs/mkdocs.yml',\n          'package.json'\n        ],\n      }\n    },\n\n    autoprefixer: {\n      options: {\n        browsers: [\n          'Android 2.3',\n          'Android >= 4',\n          'Chrome >= 20',\n          'Firefox >= 24', // Firefox 24 is the latest ESR\n          'Explorer >= 8',\n          'iOS >= 6',\n          'Opera >= 12',\n          'Safari >= 6'\n        ]\n      },\n      css: {\n        options: {\n          map: true\n        },\n        src: '<%= less.css.dest %>'\n      }\n    },\n\n    compress: {\n      zip: {\n        options: {\n          archive: 'bootstrap-select-<%= pkg.version %>.zip',\n          mode: 'zip'\n        },\n        files: [\n          {\n            expand: true,\n            cwd: 'dist/',\n            src: '**',\n            dest: 'bootstrap-select-<%= pkg.version %>/'\n          }, {\n            src: ['bower.json', 'composer.json', 'package.json'],\n            dest: 'bootstrap-select-<%= pkg.version %>/'\n          }\n        ]\n      }\n    },\n\n    watch: {\n      gruntfile: {\n        files: '<%= jshint.gruntfile.src %>',\n        tasks: 'jshint:gruntfile'\n      },\n      js: {\n        files: ['<%= jshint.main.src %>', '<%= jshint.i18n.src %>'],\n        tasks: 'build-js'\n      },\n      less: {\n        files: 'less/*.less',\n        tasks: 'build-css'\n      }\n    }\n  });\n\n  // These plugins provide necessary tasks.\n  require('load-grunt-tasks')(grunt, {\n    scope: 'devDependencies'\n  });\n\n  // Version numbering task.\n  // to update version number, use grunt version::x.y.z\n\n  // CSS distribution\n  grunt.registerTask('build-css', ['clean:css', 'less', 'autoprefixer', 'usebanner:css', 'cssmin']);\n\n  // JS distribution\n  grunt.registerTask('build-js', ['clean:js', 'concat', 'umd', 'usebanner:js', 'uglify']);\n\n  // Copy dist to docs\n  grunt.registerTask('docs', ['clean:docs', 'copy:docs']);\n\n  // Development watch\n  grunt.registerTask('dev-watch', ['build-css', 'build-js', 'watch']);\n\n  // Full distribution\n  grunt.registerTask('dist', ['build-css', 'build-js', 'compress']);\n\n  // Default task.\n  grunt.registerTask('default', ['build-css', 'build-js']);\n\n};\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2015 bootstrap-select\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/README.md",
    "content": "bootstrap-select\r\n================\r\n\r\n[![Latest release](https://img.shields.io/github/release/silviomoreto/bootstrap-select.svg)](https://github.com/silviomoreto/bootstrap-select/releases/latest)\r\n[![Bower](https://img.shields.io/bower/v/bootstrap-select.svg)]()\r\n[![npm](https://img.shields.io/npm/v/bootstrap-select.svg)](https://www.npmjs.com/package/bootstrap-select)\r\n[![NuGet](https://img.shields.io/nuget/v/bootstrap-select.svg)](https://www.nuget.org/packages/bootstrap-select/)\r\n[![CDNJS](https://img.shields.io/cdnjs/v/bootstrap-select.svg)](https://cdnjs.com/libraries/bootstrap-select)\r\n\r\n[![License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE)\r\n[![Dependency Status](https://david-dm.org/silviomoreto/bootstrap-select.svg)](https://david-dm.org/silviomoreto/bootstrap-select)\r\n[![devDependency Status](https://david-dm.org/silviomoreto/bootstrap-select/dev-status.svg)](https://david-dm.org/silviomoreto/bootstrap-select#info=devDependencies)\r\n\r\nBootstrap-select is a jQuery plugin that utilizes Bootstrap's dropdown.js to style and bring additional functionality to standard select elements.\r\n\r\n<a href=\"http://silviomoreto.github.io/bootstrap-select/\"><img src=\"https://cloud.githubusercontent.com/assets/2874325/18023324/42cf556c-6bb5-11e6-84ce-35be08ae57ba.gif\" alt=\"bootstrap-select demo\"></a>\r\n\r\n## Demo and Documentation\r\n\r\nYou can view a live demo and some examples of how to use the various options [here](http://silviomoreto.github.io/bootstrap-select).\r\n\r\nBootstrap-select's documentation, included in this repo in the root directory, is built with MkDocs and publicly hosted on GitHub Pages at http://silviomoreto.github.io/bootstrap-select. The documentation may also be run locally.\r\n\r\n\r\n### Running documentation locally\r\n\r\n1. If necessary, [install MkDocs](http://www.mkdocs.org/#installation).\r\n3. From the `/bootstrap-select/docs` directory, run `mkdocs serve` in the command line.\r\n4. Open `http://127.0.0.1:8000/` in your browser, and voilà.\r\n\r\nLearn more about using MkDocs by reading its [documentation](http://www.mkdocs.org/).\r\n\r\n## Authors\r\n\r\n[Silvio Moreto](https://github.com/silviomoreto),\r\n[Ana Carolina](https://github.com/anacarolinats),\r\n[caseyjhol](https://github.com/caseyjhol),\r\n[Matt Bryson](https://github.com/mattbryson), and\r\n[t0xicCode](https://github.com/t0xicCode).\r\n\r\n## Usage\r\n\r\nCreate your `<select>` with the `.selectpicker` class.\r\n```html\r\n<select class=\"selectpicker\">\r\n  <option>Mustard</option>\r\n  <option>Ketchup</option>\r\n  <option>Barbecue</option>\r\n</select>\r\n```\r\n\r\nIf you use a 1.6.3 or newer, you don't need to do anything else, as the data-api automatically picks up the `<select>`s with the `selectpicker` class.\r\n\r\nIf you use an older version, you need to add the following either at the bottom of the page (after the last selectpicker), or in a [`$(document).ready()`](http://api.jquery.com/ready/) block.\r\n```js\r\n// To style only <select>s with the selectpicker class\r\n$('.selectpicker').selectpicker();\r\n```\r\nOr\r\n```js\r\n// To style all <select>s\r\n$('select').selectpicker();\r\n```\r\n\r\nCheckout the [documentation](http://silviomoreto.github.io/bootstrap-select) for further information.\r\n\r\n## CDN\r\n\r\n**N.B.**: The CDN is updated after the release is made public, which means that there is a delay between the publishing of a release and its availability on the CDN. Check [the GitHub page](https://github.com/silviomoreto/bootstrap-select/releases) for the latest release.\r\n\r\n* [//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/css/bootstrap-select.min.css](//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/css/bootstrap-select.min.css)\r\n* [//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/bootstrap-select.min.js](//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/bootstrap-select.min.js)\r\n* //cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/i18n/defaults-*.min.js (The translation files)\r\n\r\n## Bugs and feature requests\r\n\r\nAnyone and everyone is welcome to contribute. **Please take a moment to\r\nreview the [guidelines for contributing](CONTRIBUTING.md)**. Make sure you're using the latest version of bootstrap-select before submitting an issue.\r\n\r\n* [Bug reports](CONTRIBUTING.md#bug-reports)\r\n* [Feature requests](CONTRIBUTING.md#feature-requests)\r\n\r\n## Copyright and license\r\n\r\nCopyright (C) 2013-2015 bootstrap-select\r\n\r\nLicensed under [the MIT license](LICENSE).\r\n\r\n## Used by\r\n\r\n* [SnapAppointments](https://snapappointments.com)\r\n* [Thermo Fisher Scientific Inc.](https://www.thermofisher.com)\r\n* [membermeister](https://www.membermeister.com)\r\n* [Solve for All](https://solveforall.com)\r\n* [EstiMATEit](http://www.123itworks.co.uk)\r\n* [Convertizer](https://convertizer.com)\r\n\r\nDoes your organization use bootstrap-select? Open an issue, and include a link and logo, and you'll be added to the list.\r\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/bower.json",
    "content": "{\n  \"name\": \"bootstrap-select\",\n  \"main\": [\n    \"less/bootstrap-select.less\",\n    \"dist/css/bootstrap-select.css\",\n    \"dist/js/bootstrap-select.js\"\n  ],\n  \"homepage\": \"http://silviomoreto.github.io/bootstrap-select\",\n  \"authors\": [\n    \"silviomoreto\"\n  ],\n  \"keywords\": [\n    \"form\",\n    \"bootstrap\",\n    \"select\",\n    \"replacement\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \">=1.8\"\n  },\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \".gitignore\",\n    \"CONTRIBUTING.md\",\n    \"Gruntfile.js\",\n    \"README.md\",\n    \"composer.json\",\n    \"package.json\",\n    \"test.html\"\n  ]\n}\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/composer.json",
    "content": "{\n  \"name\": \"bootstrap-select/bootstrap-select\",\n  \"description\": \"Bootstrap-select is a jQuery plugin that utilizes Bootstrap's dropdown.js to style and bring additional functionality to standard select elements.\",\n  \"keywords\": [\n    \"form\",\n    \"bootstrap\",\n    \"select\",\n    \"replacement\"\n  ],\n  \"homepage\": \"http://silviomoreto.github.io/bootstrap-select\",\n  \"version\": \"1.12.2\",\n  \"authors\": [\n    {\n      \"name\": \"Silvio Moreto\",\n      \"homepage\": \"https://github.com/silviomoreto\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"suggest\": {\n    \"components/jquery\": \">=1.8\",\n    \"twbs/bootstrap\": \"~3.0.0\"\n  }\n}\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/css/bootstrap-select.css",
    "content": "/*!\r\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\r\n *\r\n * Copyright 2013-2017 bootstrap-select\r\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\r\n */\r\n\r\nselect.bs-select-hidden,\nselect.selectpicker {\n  display: none !important;\n}\n.bootstrap-select {\n  width: 220px \\0;\n  /*IE9 and below*/\n}\n.bootstrap-select > .dropdown-toggle {\n  width: 100%;\n  padding-right: 25px;\n  z-index: 1;\n}\n.bootstrap-select > .dropdown-toggle.bs-placeholder,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:active {\n  color: #999;\n}\n.bootstrap-select > select {\n  position: absolute !important;\n  bottom: 0;\n  left: 50%;\n  display: block !important;\n  width: 0.5px !important;\n  height: 100% !important;\n  padding: 0 !important;\n  opacity: 0 !important;\n  border: none;\n}\n.bootstrap-select > select.mobile-device {\n  top: 0;\n  left: 0;\n  display: block !important;\n  width: 100% !important;\n  z-index: 2;\n}\n.has-error .bootstrap-select .dropdown-toggle,\n.error .bootstrap-select .dropdown-toggle {\n  border-color: #b94a48;\n}\n.bootstrap-select.fit-width {\n  width: auto !important;\n}\n.bootstrap-select:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n  width: 220px;\n}\n.bootstrap-select .dropdown-toggle:focus {\n  outline: thin dotted #333333 !important;\n  outline: 5px auto -webkit-focus-ring-color !important;\n  outline-offset: -2px;\n}\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n}\n.bootstrap-select.form-control:not([class*=\"col-\"]) {\n  width: 100%;\n}\n.bootstrap-select.form-control.input-group-btn {\n  z-index: auto;\n}\n.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.bootstrap-select.btn-group:not(.input-group-btn),\n.bootstrap-select.btn-group[class*=\"col-\"] {\n  float: none;\n  display: inline-block;\n  margin-left: 0;\n}\n.bootstrap-select.btn-group.dropdown-menu-right,\n.bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right,\n.row .bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right {\n  float: right;\n}\n.form-inline .bootstrap-select.btn-group,\n.form-horizontal .bootstrap-select.btn-group,\n.form-group .bootstrap-select.btn-group {\n  margin-bottom: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control,\n.form-group-sm .bootstrap-select.btn-group.form-control {\n  padding: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,\n.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle {\n  height: 100%;\n  font-size: inherit;\n  line-height: inherit;\n  border-radius: inherit;\n}\n.form-inline .bootstrap-select.btn-group .form-control {\n  width: 100%;\n}\n.bootstrap-select.btn-group.disabled,\n.bootstrap-select.btn-group > .disabled {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group.disabled:focus,\n.bootstrap-select.btn-group > .disabled:focus {\n  outline: none !important;\n}\n.bootstrap-select.btn-group.bs-container {\n  position: absolute;\n  height: 0 !important;\n  padding: 0 !important;\n}\n.bootstrap-select.btn-group.bs-container .dropdown-menu {\n  z-index: 1060;\n}\n.bootstrap-select.btn-group .dropdown-toggle .filter-option {\n  display: inline-block;\n  overflow: hidden;\n  width: 100%;\n  text-align: left;\n}\n.bootstrap-select.btn-group .dropdown-toggle .caret {\n  position: absolute;\n  top: 50%;\n  right: 12px;\n  margin-top: -2px;\n  vertical-align: middle;\n}\n.bootstrap-select.btn-group[class*=\"col-\"] .dropdown-toggle {\n  width: 100%;\n}\n.bootstrap-select.btn-group .dropdown-menu {\n  min-width: 100%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bootstrap-select.btn-group .dropdown-menu.inner {\n  position: static;\n  float: none;\n  border: 0;\n  padding: 0;\n  margin: 0;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li {\n  position: relative;\n}\n.bootstrap-select.btn-group .dropdown-menu li.active small {\n  color: #fff;\n}\n.bootstrap-select.btn-group .dropdown-menu li.disabled a {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group .dropdown-menu li a {\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a.opt {\n  position: relative;\n  padding-left: 2.25em;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {\n  display: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.text {\n  display: inline-block;\n}\n.bootstrap-select.btn-group .dropdown-menu li small {\n  padding-left: 0.5em;\n}\n.bootstrap-select.btn-group .dropdown-menu .notify {\n  position: absolute;\n  bottom: 5px;\n  width: 96%;\n  margin: 0 2%;\n  min-height: 26px;\n  padding: 3px 5px;\n  background: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  pointer-events: none;\n  opacity: 0.9;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bootstrap-select.btn-group .no-results {\n  padding: 3px;\n  background: #f5f5f5;\n  margin: 0 5px;\n  white-space: nowrap;\n}\n.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option {\n  position: static;\n}\n.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret {\n  position: static;\n  top: auto;\n  margin-top: -1px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {\n  position: absolute;\n  display: inline-block;\n  right: 15px;\n  margin-top: 5px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {\n  margin-right: 34px;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle {\n  z-index: 1061;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:before {\n  content: '';\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid rgba(204, 204, 204, 0.2);\n  position: absolute;\n  bottom: -4px;\n  left: 9px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:after {\n  content: '';\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid white;\n  position: absolute;\n  bottom: -4px;\n  left: 10px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {\n  bottom: auto;\n  top: -3px;\n  border-top: 7px solid rgba(204, 204, 204, 0.2);\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {\n  bottom: auto;\n  top: -3px;\n  border-top: 6px solid white;\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {\n  right: 12px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {\n  right: 13px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {\n  display: block;\n}\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n.bs-actionsbox {\n  width: 100%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bs-actionsbox .btn-group button {\n  width: 50%;\n}\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bs-donebutton .btn-group button {\n  width: 100%;\n}\n.bs-searchbox + .bs-actionsbox {\n  padding: 0 8px 4px;\n}\n.bs-searchbox .form-control {\n  margin-bottom: 0;\n  width: 100%;\n  float: none;\n}\n/*# sourceMappingURL=bootstrap-select.css.map */"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/bootstrap-select.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  'use strict';\n\n  //<editor-fold desc=\"Shims\">\n  if (!String.prototype.includes) {\n    (function () {\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n      var toString = {}.toString;\n      var defineProperty = (function () {\n        // IE 8 only supports `Object.defineProperty` on DOM elements\n        try {\n          var object = {};\n          var $defineProperty = Object.defineProperty;\n          var result = $defineProperty(object, object, object) && $defineProperty;\n        } catch (error) {\n        }\n        return result;\n      }());\n      var indexOf = ''.indexOf;\n      var includes = function (search) {\n        if (this == null) {\n          throw new TypeError();\n        }\n        var string = String(this);\n        if (search && toString.call(search) == '[object RegExp]') {\n          throw new TypeError();\n        }\n        var stringLength = string.length;\n        var searchString = String(search);\n        var searchLength = searchString.length;\n        var position = arguments.length > 1 ? arguments[1] : undefined;\n        // `ToInteger`\n        var pos = position ? Number(position) : 0;\n        if (pos != pos) { // better `isNaN`\n          pos = 0;\n        }\n        var start = Math.min(Math.max(pos, 0), stringLength);\n        // Avoid the `indexOf` call if no match is possible\n        if (searchLength + start > stringLength) {\n          return false;\n        }\n        return indexOf.call(string, searchString, pos) != -1;\n      };\n      if (defineProperty) {\n        defineProperty(String.prototype, 'includes', {\n          'value': includes,\n          'configurable': true,\n          'writable': true\n        });\n      } else {\n        String.prototype.includes = includes;\n      }\n    }());\n  }\n\n  if (!String.prototype.startsWith) {\n    (function () {\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n      var defineProperty = (function () {\n        // IE 8 only supports `Object.defineProperty` on DOM elements\n        try {\n          var object = {};\n          var $defineProperty = Object.defineProperty;\n          var result = $defineProperty(object, object, object) && $defineProperty;\n        } catch (error) {\n        }\n        return result;\n      }());\n      var toString = {}.toString;\n      var startsWith = function (search) {\n        if (this == null) {\n          throw new TypeError();\n        }\n        var string = String(this);\n        if (search && toString.call(search) == '[object RegExp]') {\n          throw new TypeError();\n        }\n        var stringLength = string.length;\n        var searchString = String(search);\n        var searchLength = searchString.length;\n        var position = arguments.length > 1 ? arguments[1] : undefined;\n        // `ToInteger`\n        var pos = position ? Number(position) : 0;\n        if (pos != pos) { // better `isNaN`\n          pos = 0;\n        }\n        var start = Math.min(Math.max(pos, 0), stringLength);\n        // Avoid the `indexOf` call if no match is possible\n        if (searchLength + start > stringLength) {\n          return false;\n        }\n        var index = -1;\n        while (++index < searchLength) {\n          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {\n            return false;\n          }\n        }\n        return true;\n      };\n      if (defineProperty) {\n        defineProperty(String.prototype, 'startsWith', {\n          'value': startsWith,\n          'configurable': true,\n          'writable': true\n        });\n      } else {\n        String.prototype.startsWith = startsWith;\n      }\n    }());\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (\n      o, // object\n      k, // key\n      r  // result array\n      ){\n      // initialize object and result\n      r=[];\n      // iterate over object keys\n      for (k in o)\n          // fill result array with non-prototypical keys\n        r.hasOwnProperty.call(o, k) && r.push(k);\n      // return result\n      return r;\n    };\n  }\n\n  // set data-selected on select element if the value has been programmatically selected\n  // prior to initialization of bootstrap-select\n  // * consider removing or replacing an alternative method *\n  var valHooks = {\n    useDefault: false,\n    _set: $.valHooks.select.set\n  };\n\n  $.valHooks.select.set = function(elem, value) {\n    if (value && !valHooks.useDefault) $(elem).data('selected', true);\n\n    return valHooks._set.apply(this, arguments);\n  };\n\n  var changed_arguments = null;\n  $.fn.triggerNative = function (eventName) {\n    var el = this[0],\n        event;\n\n    if (el.dispatchEvent) { // for modern browsers & IE9+\n      if (typeof Event === 'function') {\n        // For modern browsers\n        event = new Event(eventName, {\n          bubbles: true\n        });\n      } else {\n        // For IE since it doesn't support Event constructor\n        event = document.createEvent('Event');\n        event.initEvent(eventName, true, false);\n      }\n\n      el.dispatchEvent(event);\n    } else if (el.fireEvent) { // for IE8\n      event = document.createEventObject();\n      event.eventType = eventName;\n      el.fireEvent('on' + eventName, event);\n    } else {\n      // fall back to jQuery.trigger\n      this.trigger(eventName);\n    }\n  };\n  //</editor-fold>\n\n  // Case insensitive contains search\n  $.expr.pseudos.icontains = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();\n    return haystack.includes(meta[3].toUpperCase());\n  };\n\n  // Case insensitive begins search\n  $.expr.pseudos.ibegins = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();\n    return haystack.startsWith(meta[3].toUpperCase());\n  };\n\n  // Case and accent insensitive contains search\n  $.expr.pseudos.aicontains = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();\n    return haystack.includes(meta[3].toUpperCase());\n  };\n\n  // Case and accent insensitive begins search\n  $.expr.pseudos.aibegins = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();\n    return haystack.startsWith(meta[3].toUpperCase());\n  };\n\n  /**\n   * Remove all diatrics from the given text.\n   * @access private\n   * @param {String} text\n   * @returns {String}\n   */\n  function normalizeToBase(text) {\n    var rExps = [\n      {re: /[\\xC0-\\xC6]/g, ch: \"A\"},\n      {re: /[\\xE0-\\xE6]/g, ch: \"a\"},\n      {re: /[\\xC8-\\xCB]/g, ch: \"E\"},\n      {re: /[\\xE8-\\xEB]/g, ch: \"e\"},\n      {re: /[\\xCC-\\xCF]/g, ch: \"I\"},\n      {re: /[\\xEC-\\xEF]/g, ch: \"i\"},\n      {re: /[\\xD2-\\xD6]/g, ch: \"O\"},\n      {re: /[\\xF2-\\xF6]/g, ch: \"o\"},\n      {re: /[\\xD9-\\xDC]/g, ch: \"U\"},\n      {re: /[\\xF9-\\xFC]/g, ch: \"u\"},\n      {re: /[\\xC7-\\xE7]/g, ch: \"c\"},\n      {re: /[\\xD1]/g, ch: \"N\"},\n      {re: /[\\xF1]/g, ch: \"n\"}\n    ];\n    $.each(rExps, function () {\n      text = text ? text.replace(this.re, this.ch) : '';\n    });\n    return text;\n  }\n\n\n  // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  \n  var unescapeMap = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#x27;': \"'\",\n    '&#x60;': '`'\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped.\n    var source = '(?:' + Object.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n\n  var htmlEscape = createEscaper(escapeMap);\n  var htmlUnescape = createEscaper(unescapeMap);\n\n  var Selectpicker = function (element, options) {\n    // bootstrap-select has been initialized - revert valHooks.select.set back to its original function\n    if (!valHooks.useDefault) {\n      $.valHooks.select.set = valHooks._set;\n      valHooks.useDefault = true;\n    }\n\n    this.$element = $(element);\n    this.$newElement = null;\n    this.$button = null;\n    this.$menu = null;\n    this.$lis = null;\n    this.options = options;\n\n    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a\n    // data-attribute)\n    if (this.options.title === null) {\n      this.options.title = this.$element.attr('title');\n    }\n\n    // Format window padding\n    var winPad = this.options.windowPadding;\n    if (typeof winPad === 'number') {\n      this.options.windowPadding = [winPad, winPad, winPad, winPad];\n    }\n\n    //Expose public methods\n    this.val = Selectpicker.prototype.val;\n    this.render = Selectpicker.prototype.render;\n    this.refresh = Selectpicker.prototype.refresh;\n    this.setStyle = Selectpicker.prototype.setStyle;\n    this.selectAll = Selectpicker.prototype.selectAll;\n    this.deselectAll = Selectpicker.prototype.deselectAll;\n    this.destroy = Selectpicker.prototype.destroy;\n    this.remove = Selectpicker.prototype.remove;\n    this.show = Selectpicker.prototype.show;\n    this.hide = Selectpicker.prototype.hide;\n\n    this.init();\n  };\n\n  Selectpicker.VERSION = '1.12.2';\n\n  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.\n  Selectpicker.DEFAULTS = {\n    noneSelectedText: 'Nothing selected',\n    noneResultsText: 'No results matched {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} item selected\" : \"{0} items selected\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\n      ];\n    },\n    selectAllText: 'Select All',\n    deselectAllText: 'Deselect All',\n    doneButton: false,\n    doneButtonText: 'Close',\n    multipleSeparator: ', ',\n    styleBase: 'btn',\n    style: 'btn-default',\n    size: 'auto',\n    title: null,\n    selectedTextFormat: 'values',\n    width: false,\n    container: false,\n    hideDisabled: false,\n    showSubtext: false,\n    showIcon: true,\n    showContent: true,\n    dropupAuto: true,\n    header: false,\n    liveSearch: false,\n    liveSearchPlaceholder: null,\n    liveSearchNormalize: false,\n    liveSearchStyle: 'contains',\n    actionsBox: false,\n    iconBase: 'glyphicon',\n    tickIcon: 'glyphicon-ok',\n    showTick: false,\n    template: {\n      caret: '<span class=\"caret\"></span>'\n    },\n    maxOptions: false,\n    mobile: false,\n    selectOnTab: false,\n    dropdownAlignRight: false,\n    windowPadding: 0\n  };\n\n  Selectpicker.prototype = {\n\n    constructor: Selectpicker,\n\n    init: function () {\n      var that = this,\n          id = this.$element.attr('id');\n\n      this.$element.addClass('bs-select-hidden');\n\n      // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility\n      // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index=\"' + index + '\"]')\n      this.liObj = {};\n      this.multiple = this.$element.prop('multiple');\n      this.autofocus = this.$element.prop('autofocus');\n      this.$newElement = this.createView();\n      this.$element\n        .after(this.$newElement)\n        .appendTo(this.$newElement);\n      this.$button = this.$newElement.children('button');\n      this.$menu = this.$newElement.children('.dropdown-menu');\n      this.$menuInner = this.$menu.children('.inner');\n      this.$searchbox = this.$menu.find('input');\n\n      this.$element.removeClass('bs-select-hidden');\n\n      if (this.options.dropdownAlignRight === true) this.$menu.addClass('dropdown-menu-right');\n\n      if (typeof id !== 'undefined') {\n        this.$button.attr('data-id', id);\n        $('label[for=\"' + id + '\"]').click(function (e) {\n          e.preventDefault();\n          that.$button.focus();\n        });\n      }\n\n      this.checkDisabled();\n      this.clickListener();\n      if (this.options.liveSearch) this.liveSearchListener();\n      this.render();\n      this.setStyle();\n      this.setWidth();\n      if (this.options.container) this.selectPosition();\n      this.$menu.data('this', this);\n      this.$newElement.data('this', this);\n      if (this.options.mobile) this.mobile();\n\n      this.$newElement.on({\n        'hide.bs.dropdown': function (e) {\n          that.$menuInner.attr('aria-expanded', false);\n          that.$element.trigger('hide.bs.select', e);\n        },\n        'hidden.bs.dropdown': function (e) {\n          that.$element.trigger('hidden.bs.select', e);\n        },\n        'show.bs.dropdown': function (e) {\n          that.$menuInner.attr('aria-expanded', true);\n          that.$element.trigger('show.bs.select', e);\n        },\n        'shown.bs.dropdown': function (e) {\n          that.$element.trigger('shown.bs.select', e);\n        }\n      });\n\n      if (that.$element[0].hasAttribute('required')) {\n        this.$element.on('invalid', function () {\n          that.$button\n            .addClass('bs-invalid')\n            .focus();\n\n          that.$element.on({\n            'focus.bs.select': function () {\n              that.$button.focus();\n              that.$element.off('focus.bs.select');\n            },\n            'shown.bs.select': function () {\n              that.$element\n                .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened\n                .off('shown.bs.select');\n            },\n            'rendered.bs.select': function () {\n              // if select is no longer invalid, remove the bs-invalid class\n              if (this.validity.valid) that.$button.removeClass('bs-invalid');\n              that.$element.off('rendered.bs.select');\n            }\n          });\n        });\n      }\n\n      setTimeout(function () {\n        that.$element.trigger('loaded.bs.select');\n      });\n    },\n\n    createDropdown: function () {\n      // Options\n      // If we are multiple or showTick option is set, then add the show-tick class\n      var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',\n          inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',\n          autofocus = this.autofocus ? ' autofocus' : '';\n      // Elements\n      var header = this.options.header ? '<div class=\"popover-title\"><button type=\"button\" class=\"close\" aria-hidden=\"true\">&times;</button>' + this.options.header + '</div>' : '';\n      var searchbox = this.options.liveSearch ?\n      '<div class=\"bs-searchbox\">' +\n      '<input type=\"text\" class=\"form-control\" autocomplete=\"off\"' +\n      (null === this.options.liveSearchPlaceholder ? '' : ' placeholder=\"' + htmlEscape(this.options.liveSearchPlaceholder) + '\"') + ' role=\"textbox\" aria-label=\"Search\">' +\n      '</div>'\n          : '';\n      var actionsbox = this.multiple && this.options.actionsBox ?\n      '<div class=\"bs-actionsbox\">' +\n      '<div class=\"btn-group btn-group-sm btn-block\">' +\n      '<button type=\"button\" class=\"actions-btn bs-select-all btn btn-default\">' +\n      this.options.selectAllText +\n      '</button>' +\n      '<button type=\"button\" class=\"actions-btn bs-deselect-all btn btn-default\">' +\n      this.options.deselectAllText +\n      '</button>' +\n      '</div>' +\n      '</div>'\n          : '';\n      var donebutton = this.multiple && this.options.doneButton ?\n      '<div class=\"bs-donebutton\">' +\n      '<div class=\"btn-group btn-block\">' +\n      '<button type=\"button\" class=\"btn btn-sm btn-default\">' +\n      this.options.doneButtonText +\n      '</button>' +\n      '</div>' +\n      '</div>'\n          : '';\n      var drop =\n          '<div class=\"btn-group bootstrap-select' + showTick + inputGroup + '\">' +\n          '<button type=\"button\" class=\"' + this.options.styleBase + ' dropdown-toggle\" data-toggle=\"dropdown\"' + autofocus + ' role=\"button\">' +\n          '<span class=\"filter-option pull-left\"></span>&nbsp;' +\n          '<span class=\"bs-caret\">' +\n          this.options.template.caret +\n          '</span>' +\n          '</button>' +\n          '<div class=\"dropdown-menu open\" role=\"combobox\">' +\n          header +\n          searchbox +\n          actionsbox +\n          '<ul class=\"dropdown-menu inner\" role=\"listbox\" aria-expanded=\"false\">' +\n          '</ul>' +\n          donebutton +\n          '</div>' +\n          '</div>';\n\n      return $(drop);\n    },\n\n    createView: function () {\n      var $drop = this.createDropdown(),\n          li = this.createLi();\n\n      $drop.find('ul')[0].innerHTML = li;\n      return $drop;\n    },\n\n    reloadLi: function () {\n      // rebuild\n      var li = this.createLi();\n      this.$menuInner[0].innerHTML = li;\n    },\n\n    createLi: function () {\n      var that = this,\n          _li = [],\n          optID = 0,\n          titleOption = document.createElement('option'),\n          liIndex = -1; // increment liIndex whenever a new <li> element is created to ensure liObj is correct\n\n      // Helper functions\n      /**\n       * @param content\n       * @param [index]\n       * @param [classes]\n       * @param [optgroup]\n       * @returns {string}\n       */\n      var generateLI = function (content, index, classes, optgroup) {\n        return '<li' +\n            ((typeof classes !== 'undefined' & '' !== classes) ? ' class=\"' + classes + '\"' : '') +\n            ((typeof index !== 'undefined' & null !== index) ? ' data-original-index=\"' + index + '\"' : '') +\n            ((typeof optgroup !== 'undefined' & null !== optgroup) ? 'data-optgroup=\"' + optgroup + '\"' : '') +\n            '>' + content + '</li>';\n      };\n\n      /**\n       * @param text\n       * @param [classes]\n       * @param [inline]\n       * @param [tokens]\n       * @returns {string}\n       */\n      var generateA = function (text, classes, inline, tokens) {\n        return '<a tabindex=\"0\"' +\n            (typeof classes !== 'undefined' ? ' class=\"' + classes + '\"' : '') +\n            (inline ? ' style=\"' + inline + '\"' : '') +\n            (that.options.liveSearchNormalize ? ' data-normalized-text=\"' + normalizeToBase(htmlEscape($(text).html())) + '\"' : '') +\n            (typeof tokens !== 'undefined' || tokens !== null ? ' data-tokens=\"' + tokens + '\"' : '') +\n            ' role=\"option\">' + text +\n            '<span class=\"' + that.options.iconBase + ' ' + that.options.tickIcon + ' check-mark\"></span>' +\n            '</a>';\n      };\n\n      if (this.options.title && !this.multiple) {\n        // this option doesn't create a new <li> element, but does add a new option, so liIndex is decreased\n        // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended\n        liIndex--;\n\n        if (!this.$element.find('.bs-title-option').length) {\n          // Use native JS to prepend option (faster)\n          var element = this.$element[0];\n          titleOption.className = 'bs-title-option';\n          titleOption.innerHTML = this.options.title;\n          titleOption.value = '';\n          element.insertBefore(titleOption, element.firstChild);\n          // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.\n          // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,\n          // if so, the select will have the data-selected attribute\n          var $opt = $(element.options[element.selectedIndex]);\n          if ($opt.attr('selected') === undefined && this.$element.data('selected') === undefined) {\n            titleOption.selected = true;\n          }\n        }\n      }\n\n      this.$element.find('option').each(function (index) {\n        var $this = $(this);\n\n        liIndex++;\n\n        if ($this.hasClass('bs-title-option')) return;\n\n        // Get the class and text for the option\n        var optionClass = this.className || '',\n            inline = this.style.cssText,\n            text = $this.data('content') ? $this.data('content') : $this.html(),\n            tokens = $this.data('tokens') ? $this.data('tokens') : null,\n            subtext = typeof $this.data('subtext') !== 'undefined' ? '<small class=\"text-muted\">' + $this.data('subtext') + '</small>' : '',\n            icon = typeof $this.data('icon') !== 'undefined' ? '<span class=\"' + that.options.iconBase + ' ' + $this.data('icon') + '\"></span> ' : '',\n            $parent = $this.parent(),\n            isOptgroup = $parent[0].tagName === 'OPTGROUP',\n            isOptgroupDisabled = isOptgroup && $parent[0].disabled,\n            isDisabled = this.disabled || isOptgroupDisabled;\n\n        if (icon !== '' && isDisabled) {\n          icon = '<span>' + icon + '</span>';\n        }\n\n        if (that.options.hideDisabled && (isDisabled && !isOptgroup || isOptgroupDisabled)) {\n          liIndex--;\n          return;\n        }\n\n        if (!$this.data('content')) {\n          // Prepend any icon and append any subtext to the main text.\n          text = icon + '<span class=\"text\">' + text + subtext + '</span>';\n        }\n\n        if (isOptgroup && $this.data('divider') !== true) {\n          if (that.options.hideDisabled && isDisabled) {\n            if ($parent.data('allOptionsDisabled') === undefined) {\n              var $options = $parent.children();\n              $parent.data('allOptionsDisabled', $options.filter(':disabled').length === $options.length);\n            }\n\n            if ($parent.data('allOptionsDisabled')) {\n              liIndex--;\n              return;\n            }\n          }\n\n          var optGroupClass = ' ' + $parent[0].className || '';\n\n          if ($this.index() === 0) { // Is it the first option of the optgroup?\n            optID += 1;\n\n            // Get the opt group label\n            var label = $parent[0].label,\n                labelSubtext = typeof $parent.data('subtext') !== 'undefined' ? '<small class=\"text-muted\">' + $parent.data('subtext') + '</small>' : '',\n                labelIcon = $parent.data('icon') ? '<span class=\"' + that.options.iconBase + ' ' + $parent.data('icon') + '\"></span> ' : '';\n\n            label = labelIcon + '<span class=\"text\">' + htmlEscape(label) + labelSubtext + '</span>';\n\n            if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?\n              liIndex++;\n              _li.push(generateLI('', null, 'divider', optID + 'div'));\n            }\n            liIndex++;\n            _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));\n          }\n\n          if (that.options.hideDisabled && isDisabled) {\n            liIndex--;\n            return;\n          }\n\n          _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));\n        } else if ($this.data('divider') === true) {\n          _li.push(generateLI('', index, 'divider'));\n        } else if ($this.data('hidden') === true) {\n          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));\n        } else {\n          var showDivider = this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP';\n\n          // if previous element is not an optgroup and hideDisabled is true\n          if (!showDivider && that.options.hideDisabled) {\n            // get previous elements\n            var $prev = $(this).prevAll();\n\n            for (var i = 0; i < $prev.length; i++) {\n              // find the first element in the previous elements that is an optgroup\n              if ($prev[i].tagName === 'OPTGROUP') {\n                var optGroupDistance = 0;\n\n                // loop through the options in between the current option and the optgroup\n                // and check if they are hidden or disabled\n                for (var d = 0; d < i; d++) {\n                  var prevOption = $prev[d];\n                  if (prevOption.disabled || $(prevOption).data('hidden') === true) optGroupDistance++;\n                }\n\n                // if all of the options between the current option and the optgroup are hidden or disabled, show the divider\n                if (optGroupDistance === i) showDivider = true;\n\n                break;\n              }\n            }\n          }\n\n          if (showDivider) {\n            liIndex++;\n            _li.push(generateLI('', null, 'divider', optID + 'div'));\n          }\n          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));\n        }\n\n        that.liObj[index] = liIndex;\n      });\n\n      //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button\n      if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {\n        this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');\n      }\n\n      return _li.join('');\n    },\n\n    findLis: function () {\n      if (this.$lis == null) this.$lis = this.$menu.find('li');\n      return this.$lis;\n    },\n\n    /**\n     * @param [updateLi] defaults to true\n     */\n    render: function (updateLi) {\n      var that = this,\n          notDisabled;\n\n      //Update the LI to match the SELECT\n      if (updateLi !== false) {\n        this.$element.find('option').each(function (index) {\n          var $lis = that.findLis().eq(that.liObj[index]);\n\n          that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis);\n          that.setSelected(index, this.selected, $lis);\n        });\n      }\n\n      this.togglePlaceholder();\n\n      this.tabIndex();\n\n      var selectedItems = this.$element.find('option').map(function () {\n        if (this.selected) {\n          if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return;\n\n          var $this = $(this),\n              icon = $this.data('icon') && that.options.showIcon ? '<i class=\"' + that.options.iconBase + ' ' + $this.data('icon') + '\"></i> ' : '',\n              subtext;\n\n          if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {\n            subtext = ' <small class=\"text-muted\">' + $this.data('subtext') + '</small>';\n          } else {\n            subtext = '';\n          }\n          if (typeof $this.attr('title') !== 'undefined') {\n            return $this.attr('title');\n          } else if ($this.data('content') && that.options.showContent) {\n            return $this.data('content').toString();\n          } else {\n            return icon + $this.html() + subtext;\n          }\n        }\n      }).toArray();\n\n      //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled\n      //Convert all the values into a comma delimited string\n      var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);\n\n      //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..\n      if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {\n        var max = this.options.selectedTextFormat.split('>');\n        if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {\n          notDisabled = this.options.hideDisabled ? ', [disabled]' : '';\n          var totalCount = this.$element.find('option').not('[data-divider=\"true\"], [data-hidden=\"true\"]' + notDisabled).length,\n              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;\n          title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());\n        }\n      }\n\n      if (this.options.title == undefined) {\n        this.options.title = this.$element.attr('title');\n      }\n\n      if (this.options.selectedTextFormat == 'static') {\n        title = this.options.title;\n      }\n\n      //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text\n      if (!title) {\n        title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;\n      }\n\n      //strip all HTML tags and trim the result, then unescape any escaped tags\n      this.$button.attr('title', htmlUnescape($.trim(title.replace(/<[^>]*>?/g, ''))));\n      this.$button.children('.filter-option').html(title);\n\n      this.$element.trigger('rendered.bs.select');\n    },\n\n    /**\n     * @param [style]\n     * @param [status]\n     */\n    setStyle: function (style, status) {\n      if (this.$element.attr('class')) {\n        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\\[.*\\]/gi, ''));\n      }\n\n      var buttonClass = style ? style : this.options.style;\n\n      if (status == 'add') {\n        this.$button.addClass(buttonClass);\n      } else if (status == 'remove') {\n        this.$button.removeClass(buttonClass);\n      } else {\n        this.$button.removeClass(this.options.style);\n        this.$button.addClass(buttonClass);\n      }\n    },\n\n    liHeight: function (refresh) {\n      if (!refresh && (this.options.size === false || this.sizeInfo)) return;\n\n      var newElement = document.createElement('div'),\n          menu = document.createElement('div'),\n          menuInner = document.createElement('ul'),\n          divider = document.createElement('li'),\n          li = document.createElement('li'),\n          a = document.createElement('a'),\n          text = document.createElement('span'),\n          header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,\n          search = this.options.liveSearch ? document.createElement('div') : null,\n          actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,\n          doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;\n\n      text.className = 'text';\n      newElement.className = this.$menu[0].parentNode.className + ' open';\n      menu.className = 'dropdown-menu open';\n      menuInner.className = 'dropdown-menu inner';\n      divider.className = 'divider';\n\n      text.appendChild(document.createTextNode('Inner text'));\n      a.appendChild(text);\n      li.appendChild(a);\n      menuInner.appendChild(li);\n      menuInner.appendChild(divider);\n      if (header) menu.appendChild(header);\n      if (search) {\n        var input = document.createElement('input');\n        search.className = 'bs-searchbox';\n        input.className = 'form-control';\n        search.appendChild(input);\n        menu.appendChild(search);\n      }\n      if (actions) menu.appendChild(actions);\n      menu.appendChild(menuInner);\n      if (doneButton) menu.appendChild(doneButton);\n      newElement.appendChild(menu);\n\n      document.body.appendChild(newElement);\n\n      var liHeight = a.offsetHeight,\n          headerHeight = header ? header.offsetHeight : 0,\n          searchHeight = search ? search.offsetHeight : 0,\n          actionsHeight = actions ? actions.offsetHeight : 0,\n          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,\n          dividerHeight = $(divider).outerHeight(true),\n          // fall back to jQuery if getComputedStyle is not supported\n          menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,\n          $menu = menuStyle ? null : $(menu),\n          menuPadding = {\n            vert: parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +\n                  parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +\n                  parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +\n                  parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),\n            horiz: parseInt(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) +\n                  parseInt(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) +\n                  parseInt(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) +\n                  parseInt(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth'))\n          },\n          menuExtras =  {\n            vert: menuPadding.vert +\n                  parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +\n                  parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2,\n            horiz: menuPadding.horiz +\n                  parseInt(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) +\n                  parseInt(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2\n          }\n\n      document.body.removeChild(newElement);\n\n      this.sizeInfo = {\n        liHeight: liHeight,\n        headerHeight: headerHeight,\n        searchHeight: searchHeight,\n        actionsHeight: actionsHeight,\n        doneButtonHeight: doneButtonHeight,\n        dividerHeight: dividerHeight,\n        menuPadding: menuPadding,\n        menuExtras: menuExtras\n      };\n    },\n\n    setSize: function () {\n      this.findLis();\n      this.liHeight();\n\n      if (this.options.header) this.$menu.css('padding-top', 0);\n      if (this.options.size === false) return;\n\n      var that = this,\n          $menu = this.$menu,\n          $menuInner = this.$menuInner,\n          $window = $(window),\n          selectHeight = this.$newElement[0].offsetHeight,\n          selectWidth = this.$newElement[0].offsetWidth,\n          liHeight = this.sizeInfo['liHeight'],\n          headerHeight = this.sizeInfo['headerHeight'],\n          searchHeight = this.sizeInfo['searchHeight'],\n          actionsHeight = this.sizeInfo['actionsHeight'],\n          doneButtonHeight = this.sizeInfo['doneButtonHeight'],\n          divHeight = this.sizeInfo['dividerHeight'],\n          menuPadding = this.sizeInfo['menuPadding'],\n          menuExtras = this.sizeInfo['menuExtras'],\n          notDisabled = this.options.hideDisabled ? '.disabled' : '',\n          menuHeight,\n          menuWidth,\n          getHeight,\n          getWidth,\n          selectOffsetTop,\n          selectOffsetBot,\n          selectOffsetLeft,\n          selectOffsetRight,\n          getPos = function() {\n            var pos = that.$newElement.offset(),\n                $container = $(that.options.container),\n                containerPos;\n\n            if (that.options.container && !$container.is('body')) {\n              containerPos = $container.offset();\n              containerPos.top += parseInt($container.css('borderTopWidth'));\n              containerPos.left += parseInt($container.css('borderLeftWidth'));\n            } else {\n              containerPos = { top: 0, left: 0 };\n            }\n\n            var winPad = that.options.windowPadding;\n            selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();\n            selectOffsetBot = $window.height() - selectOffsetTop - selectHeight - containerPos.top - winPad[2];\n            selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();\n            selectOffsetRight = $window.width() - selectOffsetLeft - selectWidth - containerPos.left - winPad[1];\n            selectOffsetTop -= winPad[0];\n            selectOffsetLeft -= winPad[3];\n          };\n\n      getPos();\n\n      if (this.options.size === 'auto') {\n        var getSize = function () {\n          var minHeight,\n              hasClass = function (className, include) {\n                return function (element) {\n                    if (include) {\n                        return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));\n                    } else {\n                        return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));\n                    }\n                };\n              },\n              lis = that.$menuInner[0].getElementsByTagName('li'),\n              lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),\n              optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');\n\n          getPos();\n          menuHeight = selectOffsetBot - menuExtras.vert;\n          menuWidth = selectOffsetRight - menuExtras.horiz;\n\n          if (that.options.container) {\n            if (!$menu.data('height')) $menu.data('height', $menu.height());\n            getHeight = $menu.data('height');\n\n            if (!$menu.data('width')) $menu.data('width', $menu.width());\n            getWidth = $menu.data('width');\n          } else {\n            getHeight = $menu.height();\n            getWidth = $menu.width();\n          }\n\n          if (that.options.dropupAuto) {\n            that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);\n          }\n\n          if (that.$newElement.hasClass('dropup')) {\n            menuHeight = selectOffsetTop - menuExtras.vert;\n          }\n\n          if (that.options.dropdownAlignRight === 'auto') {\n            $menu.toggleClass('dropdown-menu-right', selectOffsetLeft > selectOffsetRight && (menuWidth - menuExtras.horiz) < (getWidth - selectWidth));\n          }\n\n          if ((lisVisible.length + optGroup.length) > 3) {\n            minHeight = liHeight * 3 + menuExtras.vert - 2;\n          } else {\n            minHeight = 0;\n          }\n\n          $menu.css({\n            'max-height': menuHeight + 'px',\n            'overflow': 'hidden',\n            'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'\n          });\n          $menuInner.css({\n            'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert + 'px',\n            'overflow-y': 'auto',\n            'min-height': Math.max(minHeight - menuPadding.vert, 0) + 'px'\n          });\n        };\n        getSize();\n        this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);\n        $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);\n      } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {\n        var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),\n            divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;\n        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;\n\n        if (that.options.container) {\n          if (!$menu.data('height')) $menu.data('height', $menu.height());\n          getHeight = $menu.data('height');\n        } else {\n          getHeight = $menu.height();\n        }\n\n        if (that.options.dropupAuto) {\n          //noinspection JSUnusedAssignment\n          this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);\n        }\n        $menu.css({\n          'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',\n          'overflow': 'hidden',\n          'min-height': ''\n        });\n        $menuInner.css({\n          'max-height': menuHeight - menuPadding.vert + 'px',\n          'overflow-y': 'auto',\n          'min-height': ''\n        });\n      }\n    },\n\n    setWidth: function () {\n      if (this.options.width === 'auto') {\n        this.$menu.css('min-width', '0');\n\n        // Get correct width if element is hidden\n        var $selectClone = this.$menu.parent().clone().appendTo('body'),\n            $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,\n            ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),\n            btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();\n\n        $selectClone.remove();\n        $selectClone2.remove();\n\n        // Set width to whatever's larger, button title or longest option\n        this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');\n      } else if (this.options.width === 'fit') {\n        // Remove inline min-width so width can be changed from 'auto'\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', '').addClass('fit-width');\n      } else if (this.options.width) {\n        // Remove inline min-width so width can be changed from 'auto'\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', this.options.width);\n      } else {\n        // Remove inline min-width/width so width can be changed\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', '');\n      }\n      // Remove fit-width class if width is changed programmatically\n      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {\n        this.$newElement.removeClass('fit-width');\n      }\n    },\n\n    selectPosition: function () {\n      this.$bsContainer = $('<div class=\"bs-container\" />');\n\n      var that = this,\n          $container = $(this.options.container),\n          pos,\n          containerPos,\n          actualHeight,\n          getPlacement = function ($element) {\n            that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));\n            pos = $element.offset();\n\n            if (!$container.is('body')) {\n              containerPos = $container.offset();\n              containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();\n              containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();\n            } else {\n              containerPos = { top: 0, left: 0 };\n            }\n\n            actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;\n\n            that.$bsContainer.css({\n              'top': pos.top - containerPos.top + actualHeight,\n              'left': pos.left - containerPos.left,\n              'width': $element[0].offsetWidth\n            });\n          };\n\n      this.$button.on('click', function () {\n        var $this = $(this);\n\n        if (that.isDisabled()) {\n          return;\n        }\n\n        getPlacement(that.$newElement);\n\n        that.$bsContainer\n          .appendTo(that.options.container)\n          .toggleClass('open', !$this.hasClass('open'))\n          .append(that.$menu);\n      });\n\n      $(window).on('resize scroll', function () {\n        getPlacement(that.$newElement);\n      });\n\n      this.$element.on('hide.bs.select', function () {\n        that.$menu.data('height', that.$menu.height());\n        that.$bsContainer.detach();\n      });\n    },\n\n    /**\n     * @param {number} index - the index of the option that is being changed\n     * @param {boolean} selected - true if the option is being selected, false if being deselected\n     * @param {JQuery} $lis - the 'li' element that is being modified\n     */\n    setSelected: function (index, selected, $lis) {\n      if (!$lis) {\n        this.togglePlaceholder(); // check if setSelected is being called by changing the value of the select\n        $lis = this.findLis().eq(this.liObj[index]);\n      }\n\n      $lis.toggleClass('selected', selected).find('a').attr('aria-selected', selected);\n    },\n\n    /**\n     * @param {number} index - the index of the option that is being disabled\n     * @param {boolean} disabled - true if the option is being disabled, false if being enabled\n     * @param {JQuery} $lis - the 'li' element that is being modified\n     */\n    setDisabled: function (index, disabled, $lis) {\n      if (!$lis) {\n        $lis = this.findLis().eq(this.liObj[index]);\n      }\n\n      if (disabled) {\n        $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1).attr('aria-disabled', true);\n      } else {\n        $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0).attr('aria-disabled', false);\n      }\n    },\n\n    isDisabled: function () {\n      return this.$element[0].disabled;\n    },\n\n    checkDisabled: function () {\n      var that = this;\n\n      if (this.isDisabled()) {\n        this.$newElement.addClass('disabled');\n        this.$button.addClass('disabled').attr('tabindex', -1).attr('aria-disabled', true);\n      } else {\n        if (this.$button.hasClass('disabled')) {\n          this.$newElement.removeClass('disabled');\n          this.$button.removeClass('disabled').attr('aria-disabled', false);\n        }\n\n        if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {\n          this.$button.removeAttr('tabindex');\n        }\n      }\n\n      this.$button.click(function () {\n        return !that.isDisabled();\n      });\n    },\n\n    togglePlaceholder: function () {\n      var value = this.$element.val();\n      this.$button.toggleClass('bs-placeholder', value === null || value === '' || (value.constructor === Array && value.length === 0));\n    },\n\n    tabIndex: function () {\n      if (this.$element.data('tabindex') !== this.$element.attr('tabindex') && \n        (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) {\n        this.$element.data('tabindex', this.$element.attr('tabindex'));\n        this.$button.attr('tabindex', this.$element.data('tabindex'));\n      }\n\n      this.$element.attr('tabindex', -98);\n    },\n\n    clickListener: function () {\n      var that = this,\n          $document = $(document);\n\n      $document.data('spaceSelect', false);\n\n      this.$button.on('keyup', function (e) {\n        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {\n            e.preventDefault();\n            $document.data('spaceSelect', false);\n        }\n      });\n\n      this.$button.on('click', function () {\n        that.setSize();\n      });\n\n      this.$element.on('shown.bs.select', function () {\n        if (!that.options.liveSearch && !that.multiple) {\n          that.$menuInner.find('.selected a').focus();\n        } else if (!that.multiple) {\n          var selectedIndex = that.liObj[that.$element[0].selectedIndex];\n\n          if (typeof selectedIndex !== 'number' || that.options.size === false) return;\n\n          // scroll to selected option\n          var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;\n          offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2;\n          that.$menuInner[0].scrollTop = offset;\n        }\n      });\n\n      this.$menuInner.on('click', 'li a', function (e) {\n        var $this = $(this),\n            clickedIndex = $this.parent().data('originalIndex'),\n            prevValue = that.$element.val(),\n            prevIndex = that.$element.prop('selectedIndex'),\n            triggerChange = true;\n\n        // Don't close on multi choice menu\n        if (that.multiple && that.options.maxOptions !== 1) {\n          e.stopPropagation();\n        }\n\n        e.preventDefault();\n\n        //Don't run if we have been disabled\n        if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {\n          var $options = that.$element.find('option'),\n              $option = $options.eq(clickedIndex),\n              state = $option.prop('selected'),\n              $optgroup = $option.parent('optgroup'),\n              maxOptions = that.options.maxOptions,\n              maxOptionsGrp = $optgroup.data('maxOptions') || false;\n\n          if (!that.multiple) { // Deselect all others if not multi select box\n            $options.prop('selected', false);\n            $option.prop('selected', true);\n            that.$menuInner.find('.selected').removeClass('selected').find('a').attr('aria-selected', false);\n            that.setSelected(clickedIndex, true);\n          } else { // Toggle the one we have chosen if we are multi select.\n            $option.prop('selected', !state);\n            that.setSelected(clickedIndex, !state);\n            $this.blur();\n\n            if (maxOptions !== false || maxOptionsGrp !== false) {\n              var maxReached = maxOptions < $options.filter(':selected').length,\n                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;\n\n              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {\n                if (maxOptions && maxOptions == 1) {\n                  $options.prop('selected', false);\n                  $option.prop('selected', true);\n                  that.$menuInner.find('.selected').removeClass('selected');\n                  that.setSelected(clickedIndex, true);\n                } else if (maxOptionsGrp && maxOptionsGrp == 1) {\n                  $optgroup.find('option:selected').prop('selected', false);\n                  $option.prop('selected', true);\n                  var optgroupID = $this.parent().data('optgroup');\n                  that.$menuInner.find('[data-optgroup=\"' + optgroupID + '\"]').removeClass('selected');\n                  that.setSelected(clickedIndex, true);\n                } else {\n                  var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,\n                      maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,\n                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),\n                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),\n                      $notify = $('<div class=\"notify\"></div>');\n                  // If {var} is set in array, replace it\n                  /** @deprecated */\n                  if (maxOptionsArr[2]) {\n                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);\n                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);\n                  }\n\n                  $option.prop('selected', false);\n\n                  that.$menu.append($notify);\n\n                  if (maxOptions && maxReached) {\n                    $notify.append($('<div>' + maxTxt + '</div>'));\n                    triggerChange = false;\n                    that.$element.trigger('maxReached.bs.select');\n                  }\n\n                  if (maxOptionsGrp && maxReachedGrp) {\n                    $notify.append($('<div>' + maxTxtGrp + '</div>'));\n                    triggerChange = false;\n                    that.$element.trigger('maxReachedGrp.bs.select');\n                  }\n\n                  setTimeout(function () {\n                    that.setSelected(clickedIndex, false);\n                  }, 10);\n\n                  $notify.delay(750).fadeOut(300, function () {\n                    $(this).remove();\n                  });\n                }\n              }\n            }\n          }\n\n          if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {\n            that.$button.focus();\n          } else if (that.options.liveSearch) {\n            that.$searchbox.focus();\n          }\n\n          // Trigger select 'change'\n          if (triggerChange) {\n            if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {\n              // $option.prop('selected') is current option state (selected/unselected). state is previous option state.\n              changed_arguments = [clickedIndex, $option.prop('selected'), state];\n              that.$element\n                .triggerNative('change');\n            }\n          }\n        }\n      });\n\n      this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {\n        if (e.currentTarget == this) {\n          e.preventDefault();\n          e.stopPropagation();\n          if (that.options.liveSearch && !$(e.target).hasClass('close')) {\n            that.$searchbox.focus();\n          } else {\n            that.$button.focus();\n          }\n        }\n      });\n\n      this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        if (that.options.liveSearch) {\n          that.$searchbox.focus();\n        } else {\n          that.$button.focus();\n        }\n      });\n\n      this.$menu.on('click', '.popover-title .close', function () {\n        that.$button.click();\n      });\n\n      this.$searchbox.on('click', function (e) {\n        e.stopPropagation();\n      });\n\n      this.$menu.on('click', '.actions-btn', function (e) {\n        if (that.options.liveSearch) {\n          that.$searchbox.focus();\n        } else {\n          that.$button.focus();\n        }\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        if ($(this).hasClass('bs-select-all')) {\n          that.selectAll();\n        } else {\n          that.deselectAll();\n        }\n      });\n\n      this.$element.change(function () {\n        that.render(false);\n        that.$element.trigger('changed.bs.select', changed_arguments);\n        changed_arguments = null;\n      });\n    },\n\n    liveSearchListener: function () {\n      var that = this,\n          $no_results = $('<li class=\"no-results\"></li>');\n\n      this.$button.on('click.dropdown.data-api', function () {\n        that.$menuInner.find('.active').removeClass('active');\n        if (!!that.$searchbox.val()) {\n          that.$searchbox.val('');\n          that.$lis.not('.is-hidden').removeClass('hidden');\n          if (!!$no_results.parent().length) $no_results.remove();\n        }\n        if (!that.multiple) that.$menuInner.find('.selected').addClass('active');\n        setTimeout(function () {\n          that.$searchbox.focus();\n        }, 10);\n      });\n\n      this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {\n        e.stopPropagation();\n      });\n\n      this.$searchbox.on('input propertychange', function () {\n        that.$lis.not('.is-hidden').removeClass('hidden');\n        that.$lis.filter('.active').removeClass('active');\n        $no_results.remove();\n\n        if (that.$searchbox.val()) {\n          var $searchBase = that.$lis.not('.is-hidden, .divider, .dropdown-header'),\n              $hideItems;\n          if (that.options.liveSearchNormalize) {\n            $hideItems = $searchBase.find('a').not(':a' + that._searchStyle() + '(\"' + normalizeToBase(that.$searchbox.val()) + '\")');\n          } else {\n            $hideItems = $searchBase.find('a').not(':' + that._searchStyle() + '(\"' + that.$searchbox.val() + '\")');\n          }\n\n          if ($hideItems.length === $searchBase.length) {\n            $no_results.html(that.options.noneResultsText.replace('{0}', '\"' + htmlEscape(that.$searchbox.val()) + '\"'));\n            that.$menuInner.append($no_results);\n            that.$lis.addClass('hidden');\n          } else {\n            $hideItems.parent().addClass('hidden');\n\n            var $lisVisible = that.$lis.not('.hidden'),\n                $foundDiv;\n\n            // hide divider if first or last visible, or if followed by another divider\n            $lisVisible.each(function (index) {\n              var $this = $(this);\n\n              if ($this.hasClass('divider')) {\n                if ($foundDiv === undefined) {\n                  $this.addClass('hidden');\n                } else {\n                  if ($foundDiv) $foundDiv.addClass('hidden');\n                  $foundDiv = $this;\n                }\n              } else if ($this.hasClass('dropdown-header') && $lisVisible.eq(index + 1).data('optgroup') !== $this.data('optgroup')) {\n                $this.addClass('hidden');\n              } else {\n                $foundDiv = null;\n              }\n            });\n            if ($foundDiv) $foundDiv.addClass('hidden');\n\n            $searchBase.not('.hidden').first().addClass('active');\n          }\n        }\n      });\n    },\n\n    _searchStyle: function () {\n      var styles = {\n        begins: 'ibegins',\n        startsWith: 'ibegins'\n      };\n\n      return styles[this.options.liveSearchStyle] || 'icontains';\n    },\n\n    val: function (value) {\n      if (typeof value !== 'undefined') {\n        this.$element.val(value);\n        this.render();\n\n        return this.$element;\n      } else {\n        return this.$element.val();\n      }\n    },\n\n    changeAll: function (status) {\n      if (!this.multiple) return;\n      if (typeof status === 'undefined') status = true;\n\n      this.findLis();\n\n      var $options = this.$element.find('option'),\n          $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden'),\n          lisVisLen = $lisVisible.length,\n          selectedOptions = [];\n          \n      if (status) {\n        if ($lisVisible.filter('.selected').length === $lisVisible.length) return;\n      } else {\n        if ($lisVisible.filter('.selected').length === 0) return;\n      }\n          \n      $lisVisible.toggleClass('selected', status);\n\n      for (var i = 0; i < lisVisLen; i++) {\n        var origIndex = $lisVisible[i].getAttribute('data-original-index');\n        selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0];\n      }\n\n      $(selectedOptions).prop('selected', status);\n\n      this.render(false);\n\n      this.togglePlaceholder();\n\n      this.$element\n        .triggerNative('change');\n    },\n\n    selectAll: function () {\n      return this.changeAll(true);\n    },\n\n    deselectAll: function () {\n      return this.changeAll(false);\n    },\n\n    toggle: function (e) {\n      e = e || window.event;\n\n      if (e) e.stopPropagation();\n\n      this.$button.trigger('click');\n    },\n\n    keydown: function (e) {\n      var $this = $(this),\n          $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),\n          $items,\n          that = $parent.data('this'),\n          index,\n          next,\n          first,\n          last,\n          prev,\n          nextPrev,\n          prevIndex,\n          isActive,\n          selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',\n          keyCodeMap = {\n            32: ' ',\n            48: '0',\n            49: '1',\n            50: '2',\n            51: '3',\n            52: '4',\n            53: '5',\n            54: '6',\n            55: '7',\n            56: '8',\n            57: '9',\n            59: ';',\n            65: 'a',\n            66: 'b',\n            67: 'c',\n            68: 'd',\n            69: 'e',\n            70: 'f',\n            71: 'g',\n            72: 'h',\n            73: 'i',\n            74: 'j',\n            75: 'k',\n            76: 'l',\n            77: 'm',\n            78: 'n',\n            79: 'o',\n            80: 'p',\n            81: 'q',\n            82: 'r',\n            83: 's',\n            84: 't',\n            85: 'u',\n            86: 'v',\n            87: 'w',\n            88: 'x',\n            89: 'y',\n            90: 'z',\n            96: '0',\n            97: '1',\n            98: '2',\n            99: '3',\n            100: '4',\n            101: '5',\n            102: '6',\n            103: '7',\n            104: '8',\n            105: '9'\n          };\n\n      if (that.options.liveSearch) $parent = $this.parent().parent();\n\n      if (that.options.container) $parent = that.$menu;\n\n      $items = $('[role=\"listbox\"] li', $parent);\n\n      isActive = that.$newElement.hasClass('open');\n\n      if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) {\n        if (!that.options.container) {\n          that.setSize();\n          that.$menu.parent().addClass('open');\n          isActive = true;\n        } else {\n          that.$button.trigger('click');\n        }\n        that.$searchbox.focus();\n        return;\n      }\n\n      if (that.options.liveSearch) {\n        if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive) {\n          e.preventDefault();\n          e.stopPropagation();\n          that.$menuInner.click();\n          that.$button.focus();\n        }\n        // $items contains li elements when liveSearch is enabled\n        $items = $('[role=\"listbox\"] li' + selector, $parent);\n        if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {\n          if ($items.filter('.active').length === 0) {\n            $items = that.$menuInner.find('li');\n            if (that.options.liveSearchNormalize) {\n              $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');\n            } else {\n              $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');\n            }\n          }\n        }\n      }\n\n      if (!$items.length) return;\n\n      if (/(38|40)/.test(e.keyCode.toString(10))) {\n        index = $items.index($items.find('a').filter(':focus').parent());\n        first = $items.filter(selector).first().index();\n        last = $items.filter(selector).last().index();\n        next = $items.eq(index).nextAll(selector).eq(0).index();\n        prev = $items.eq(index).prevAll(selector).eq(0).index();\n        nextPrev = $items.eq(next).prevAll(selector).eq(0).index();\n\n        if (that.options.liveSearch) {\n          $items.each(function (i) {\n            if (!$(this).hasClass('disabled')) {\n              $(this).data('index', i);\n            }\n          });\n          index = $items.index($items.filter('.active'));\n          first = $items.first().data('index');\n          last = $items.last().data('index');\n          next = $items.eq(index).nextAll().eq(0).data('index');\n          prev = $items.eq(index).prevAll().eq(0).data('index');\n          nextPrev = $items.eq(next).prevAll().eq(0).data('index');\n        }\n\n        prevIndex = $this.data('prevIndex');\n\n        if (e.keyCode == 38) {\n          if (that.options.liveSearch) index--;\n          if (index != nextPrev && index > prev) index = prev;\n          if (index < first) index = first;\n          if (index == prevIndex) index = last;\n        } else if (e.keyCode == 40) {\n          if (that.options.liveSearch) index++;\n          if (index == -1) index = 0;\n          if (index != nextPrev && index < next) index = next;\n          if (index > last) index = last;\n          if (index == prevIndex) index = first;\n        }\n\n        $this.data('prevIndex', index);\n\n        if (!that.options.liveSearch) {\n          $items.eq(index).children('a').focus();\n        } else {\n          e.preventDefault();\n          if (!$this.hasClass('dropdown-toggle')) {\n            $items.removeClass('active').eq(index).addClass('active').children('a').focus();\n            $this.focus();\n          }\n        }\n\n      } else if (!$this.is('input')) {\n        var keyIndex = [],\n            count,\n            prevKey;\n\n        $items.each(function () {\n          if (!$(this).hasClass('disabled')) {\n            if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {\n              keyIndex.push($(this).index());\n            }\n          }\n        });\n\n        count = $(document).data('keycount');\n        count++;\n        $(document).data('keycount', count);\n\n        prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);\n\n        if (prevKey != keyCodeMap[e.keyCode]) {\n          count = 1;\n          $(document).data('keycount', count);\n        } else if (count >= keyIndex.length) {\n          $(document).data('keycount', 0);\n          if (count > keyIndex.length) count = 1;\n        }\n\n        $items.eq(keyIndex[count - 1]).children('a').focus();\n      }\n\n      // Select focused option if \"Enter\", \"Spacebar\" or \"Tab\" (when selectOnTab is true) are pressed inside the menu.\n      if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {\n        if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();\n        if (!that.options.liveSearch) {\n          var elem = $(':focus');\n          elem.click();\n          // Bring back focus for multiselects\n          elem.focus();\n          // Prevent screen from scrolling if the user hit the spacebar\n          e.preventDefault();\n          // Fixes spacebar selection of dropdown items in FF & IE\n          $(document).data('spaceSelect', true);\n        } else if (!/(32)/.test(e.keyCode.toString(10))) {\n          that.$menuInner.find('.active a').click();\n          $this.focus();\n        }\n        $(document).data('keycount', 0);\n      }\n\n      if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {\n        that.$menu.parent().removeClass('open');\n        if (that.options.container) that.$newElement.removeClass('open');\n        that.$button.focus();\n      }\n    },\n\n    mobile: function () {\n      this.$element.addClass('mobile-device');\n    },\n\n    refresh: function () {\n      this.$lis = null;\n      this.liObj = {};\n      this.reloadLi();\n      this.render();\n      this.checkDisabled();\n      this.liHeight(true);\n      this.setStyle();\n      this.setWidth();\n      if (this.$lis) this.$searchbox.trigger('propertychange');\n\n      this.$element.trigger('refreshed.bs.select');\n    },\n\n    hide: function () {\n      this.$newElement.hide();\n    },\n\n    show: function () {\n      this.$newElement.show();\n    },\n\n    remove: function () {\n      this.$newElement.remove();\n      this.$element.remove();\n    },\n\n    destroy: function () {\n      this.$newElement.before(this.$element).remove();\n\n      if (this.$bsContainer) {\n        this.$bsContainer.remove();\n      } else {\n        this.$menu.remove();\n      }\n\n      this.$element\n        .off('.bs.select')\n        .removeData('selectpicker')\n        .removeClass('bs-select-hidden selectpicker');\n    }\n  };\n\n  // SELECTPICKER PLUGIN DEFINITION\n  // ==============================\n  function Plugin(option) {\n    // get the args of the outer function..\n    var args = arguments;\n    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them\n    // to get lost/corrupted in android 2.3 and IE9 #715 #775\n    var _option = option;\n\n    [].shift.apply(args);\n\n    var value;\n    var chain = this.each(function () {\n      var $this = $(this);\n      if ($this.is('select')) {\n        var data = $this.data('selectpicker'),\n            options = typeof _option == 'object' && _option;\n\n        if (!data) {\n          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);\n          config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template);\n          $this.data('selectpicker', (data = new Selectpicker(this, config)));\n        } else if (options) {\n          for (var i in options) {\n            if (options.hasOwnProperty(i)) {\n              data.options[i] = options[i];\n            }\n          }\n        }\n\n        if (typeof _option == 'string') {\n          if (data[_option] instanceof Function) {\n            value = data[_option].apply(data, args);\n          } else {\n            value = data.options[_option];\n          }\n        }\n      }\n    });\n\n    if (typeof value !== 'undefined') {\n      //noinspection JSUnusedAssignment\n      return value;\n    } else {\n      return chain;\n    }\n  }\n\n  var old = $.fn.selectpicker;\n  $.fn.selectpicker = Plugin;\n  $.fn.selectpicker.Constructor = Selectpicker;\n\n  // SELECTPICKER NO CONFLICT\n  // ========================\n  $.fn.selectpicker.noConflict = function () {\n    $.fn.selectpicker = old;\n    return this;\n  };\n\n  $(document)\n      .data('keycount', 0)\n      .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=\"listbox\"], .bs-searchbox input', Selectpicker.prototype.keydown)\n      .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=\"listbox\"], .bs-searchbox input', function (e) {\n        e.stopPropagation();\n      });\n\n  // SELECTPICKER DATA-API\n  // =====================\n  $(window).on('load.bs.select.data-api', function () {\n    $('.selectpicker').each(function () {\n      var $selectpicker = $(this);\n      Plugin.call($selectpicker, $selectpicker.data());\n    })\n  });\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-ar_AR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n/*!\n * Translated default messages for bootstrap-select.\n * Locale: AR (Arabic)\n * Author: Yasser Lotfy <y_l@alive.com>\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'لم يتم إختيار شئ',\n    noneResultsText: 'لا توجد نتائج مطابقة لـ {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} خيار تم إختياره\" : \"{0} خيارات تمت إختيارها\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'تخطى الحد المسموح ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح ({n} خيارات بحد أقصى)',\n        (numGroup == 1) ? 'تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)'\n      ];\n    },\n    selectAllText: 'إختيار الجميع',\n    deselectAllText: 'إلغاء إختيار الجميع',\n    multipleSeparator: '، '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-bg_BG.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Нищо избрано',\n    noneResultsText: 'Няма резултат за {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} избран елемент\" : \"{0} избрани елемента\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',\n        (numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'\n      ];\n    },\n    selectAllText: 'Избери всички',\n    deselectAllText: 'Размаркирай всички',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-cro_CRO.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Odaberite stavku',\n    noneResultsText: 'Nema rezultata pretrage {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} stavka selektirana\" : \"{0} stavke selektirane\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit je postignut ({n} stvar maximalno)' : 'Limit je postignut ({n} stavke maksimalno)',\n        (numGroup == 1) ? 'Grupni limit je postignut ({n} stvar maksimalno)' : 'Grupni limit je postignut ({n} stavke maksimalno)'\n      ];\n    },\n    selectAllText: 'Selektiraj sve',\n    deselectAllText: 'Deselektiraj sve',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-cs_CZ.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nic není vybráno',\n    noneResultsText: 'Žádné výsledky {0}',\n    countSelectedText: 'Označeno {0} z {1}',\n    maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-da_DK.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Intet valgt',\n    noneResultsText: 'Ingen resultater fundet {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} valgt\" : \"{0} valgt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',\n        (numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'\n      ];\n    },\n    selectAllText: 'Markér alle',\n    deselectAllText: 'Afmarkér alle',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-de_DE.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Bitte wählen...',\n    noneResultsText: 'Keine Ergebnisse für {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} Element ausgewählt\" : \"{0} Elemente ausgewählt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit erreicht ({n} Element max.)' : 'Limit erreicht ({n} Elemente max.)',\n        (numGroup == 1) ? 'Gruppen-Limit erreicht ({n} Element max.)' : 'Gruppen-Limit erreicht ({n} Elemente max.)'\n      ];\n    },\n    selectAllText: 'Alles auswählen',\n    deselectAllText: 'Nichts auswählen',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-en_US.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nothing selected',\n    noneResultsText: 'No results match {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} item selected\" : \"{0} items selected\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\n      ];\n    },\n    selectAllText: 'Select All',\n    deselectAllText: 'Deselect All',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-es_CL.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'No hay selección',\n    noneResultsText: 'No hay resultados {0}',\n    countSelectedText: 'Seleccionados {0} de {1}',\n    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleccionar Todos',\n    deselectAllText: 'Desmarcar Todos'\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-es_ES.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'No hay selección',\n    noneResultsText: 'No hay resultados {0}',\n    countSelectedText: 'Seleccionados {0} de {1}',\n    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleccionar Todos',\n    deselectAllText: 'Desmarcar Todos'\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-eu.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Hautapenik ez',\n    noneResultsText: 'Emaitzarik ez {0}',\n    countSelectedText: '{1}(e)tik {0} hautatuta',\n    maxOptionsText: ['Mugara iritsita ({n} {var} gehienez)', 'Taldearen mugara iritsita ({n} {var} gehienez)', ['elementu', 'elementu']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-fa_IR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n    $.fn.selectpicker.defaults = {\n        noneSelectedText: 'چیزی انتخاب نشده است',\n        noneResultsText: 'هیج مشابهی برای {0} پیدا نشد',\n        countSelectedText: \"{0} از {1} مورد انتخاب شده\",\n        maxOptionsText: ['بیشتر ممکن نیست {حداکثر {n} عدد}', 'بیشتر ممکن نیست {حداکثر {n} عدد}'],\n        selectAllText: 'انتخاب همه',\n        deselectAllText: 'انتخاب هیچ کدام',\n        multipleSeparator: ', '\n    };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-fi_FI.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ei valintoja',\n    noneResultsText: 'Ei hakutuloksia {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} valittu\" : \"{0} valitut\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Valintojen maksimimäärä ({n} saavutettu)' : 'Valintojen maksimimäärä ({n} saavutettu)',\n        (numGroup == 1) ? 'Ryhmän maksimimäärä ({n} saavutettu)' : 'Ryhmän maksimimäärä ({n} saavutettu)'\n      ];\n    },\n    selectAllText: 'Valitse kaikki',\n    deselectAllText: 'Poista kaikki',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-fr_FR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Aucune sélection',\n    noneResultsText: 'Aucun résultat pour {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected > 1) ? \"{0} éléments sélectionnés\" : \"{0} élément sélectionné\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll > 1) ? 'Limite atteinte ({n} éléments max)' : 'Limite atteinte ({n} élément max)',\n        (numGroup > 1) ? 'Limite du groupe atteinte ({n} éléments max)' : 'Limite du groupe atteinte ({n} élément max)'\n      ];\n    },\n    multipleSeparator: ', ',\n    selectAllText: 'Tout Sélectionner',\n    deselectAllText: 'Tout Dé-selectionner',\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-hu_HU.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Válasszon!',\n    noneResultsText: 'Nincs találat {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return '{0} elem kiválasztva';\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Legfeljebb {n} elem választható',\n        'A csoportban legfeljebb {n} elem választható'\n      ];\n    },\n    selectAllText: 'Mind',\n    deselectAllText: 'Egyik sem',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-id_ID.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Tidak ada yang dipilih',\n    noneResultsText: 'Tidak ada yang cocok {0}',\n    countSelectedText: '{0} terpilih',\n    maxOptionsText: ['Mencapai batas (maksimum {n})', 'Mencapai batas grup (maksimum {n})'],\n    selectAllText: 'Pilih Semua',\n    deselectAllText: 'Hapus Semua',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-it_IT.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nessuna selezione',\n    noneResultsText: 'Nessun risultato per {0}',\n    countSelectedText: function (numSelected, numTotal){\n      return (numSelected == 1) ? 'Selezionato {0} di {1}' : 'Selezionati {0} di {1}';\n    },\n    maxOptionsText: ['Limite raggiunto ({n} {var} max)', 'Limite del gruppo raggiunto ({n} {var} max)', ['elementi', 'elemento']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleziona Tutto',\n    deselectAllText: 'Deseleziona Tutto'\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-ko_KR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '항목을 선택해주세요',\n    noneResultsText: '{0} 검색 결과가 없습니다',\n    countSelectedText: function (numSelected, numTotal) {\n      return \"{0}개를 선택하였습니다\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        '{n}개까지 선택 가능합니다',\n        '해당 그룹은 {n}개까지 선택 가능합니다'\n      ];\n    },\n    selectAllText: '전체선택',\n    deselectAllText: '전체해제',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-lt_LT.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Niekas nepasirinkta',\n    noneResultsText: 'Niekas nesutapo su {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} elementas pasirinktas\" : \"{0} elementai(-ų) pasirinkta\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Pasiekta riba ({n} elementas daugiausiai)' : 'Riba pasiekta ({n} elementai(-ų) daugiausiai)',\n        (numGroup == 1) ? 'Grupės riba pasiekta ({n} elementas daugiausiai)' : 'Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)'\n      ];\n    },\n    selectAllText: 'Pasirinkti visus',\n    deselectAllText: 'Atmesti visus',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-nb_NO.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ingen valgt',\n    noneResultsText: 'Søket gir ingen treff {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} alternativ valgt\" : \"{0} alternativer valgt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Grense nådd (maks {n} valg)' : 'Grense nådd (maks {n} valg)',\n        (numGroup == 1) ? 'Grense for grupper nådd (maks {n} grupper)' : 'Grense for grupper nådd (maks {n} grupper)'\n      ];\n    },\n    selectAllText: 'Merk alle',\n    deselectAllText: 'Fjern alle',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-nl_NL.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Niets geselecteerd',\n    noneResultsText: 'Geen resultaten gevonden voor {0}',\n    countSelectedText: '{0} van {1} geselecteerd',\n    maxOptionsText: ['Limiet bereikt ({n} {var} max)', 'Groep limiet bereikt ({n} {var} max)', ['items', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-pl_PL.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nic nie zaznaczono',\n    noneResultsText: 'Brak wyników wyszukiwania {0}',\n    countSelectedText: 'Zaznaczono {0} z {1}',\n    maxOptionsText: ['Osiągnięto limit ({n} {var} max)', 'Limit grupy osiągnięty ({n} {var} max)', ['elementy', 'element']],\n    selectAll: 'Zaznacz wszystkie',\n    deselectAll: 'Odznacz wszystkie',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-pt_BR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nada selecionado',\n    noneResultsText: 'Nada encontrado contendo {0}',\n    countSelectedText: 'Selecionado {0} de {1}',\n    maxOptionsText: ['Limite excedido (máx. {n} {var})', 'Limite do grupo excedido (máx. {n} {var})', ['itens', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-pt_PT.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n$.fn.selectpicker.defaults = {\nnoneSelectedText: 'Nenhum seleccionado',\nnoneResultsText: 'Sem resultados contendo {0}',\ncountSelectedText: 'Selecionado {0} de {1}',\nmaxOptionsText: ['Limite ultrapassado (máx. {n} {var})', 'Limite de seleções ultrapassado (máx. {n} {var})', ['itens', 'item']],\nmultipleSeparator: ', '\n};\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-ro_RO.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nu a fost selectat nimic',\n    noneResultsText: 'Nu exista niciun rezultat {0}',\n    countSelectedText: '{0} din {1} selectat(e)',\n    maxOptionsText: ['Limita a fost atinsa ({n} {var} max)', 'Limita de grup a fost atinsa ({n} {var} max)', ['iteme', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-ru_RU.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ничего не выбрано',\n    noneResultsText: 'Совпадений не найдено {0}',\n    countSelectedText: 'Выбрано {0} из {1}',\n    maxOptionsText: ['Достигнут предел ({n} {var} максимум)', 'Достигнут предел в группе ({n} {var} максимум)', ['шт.', 'шт.']],\n    doneButtonText: 'Закрыть',\n    selectAllText: 'Выбрать все',\n    deselectAllText: 'Отменить все',    \n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-sk_SK.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Vyberte zo zoznamu',\n    noneResultsText: 'Pre výraz {0} neboli nájdené žiadne výsledky',\n    countSelectedText: 'Vybrané {0} z {1}',\n    maxOptionsText: ['Limit prekročený ({n} {var} max)', 'Limit skupiny prekročený ({n} {var} max)', ['položiek', 'položka']],\n    selectAllText: 'Vybrať všetky',\n    deselectAllText: 'Zrušiť výber',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-sl_SI.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nič izbranega',\n    noneResultsText: 'Ni zadetkov za {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      \"Število izbranih: {0}\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Omejitev dosežena (max. izbranih: {n})',\n        'Omejitev skupine dosežena (max. izbranih: {n})'\n      ];\n    },\n    selectAllText: 'Izberi vse',\n    deselectAllText: 'Počisti izbor',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-sv_SE.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Inget valt',\n    noneResultsText: 'Inget sökresultat matchar {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected === 1) ? \"{0} alternativ valt\" : \"{0} alternativ valda\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Gräns uppnåd (max {n} alternativ)',\n        'Gräns uppnåd (max {n} gruppalternativ)'\n      ];\n    },\n    selectAllText: 'Markera alla',\n    deselectAllText: 'Avmarkera alla',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-tr_TR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Hiçbiri seçilmedi',\n    noneResultsText: 'Hiçbir sonuç bulunamadı {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} öğe seçildi\" : \"{0} öğe seçildi\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit aşıldı (maksimum {n} sayıda öğe )' : 'Limit aşıldı (maksimum {n} sayıda öğe)',\n        (numGroup == 1) ? 'Grup limiti aşıldı (maksimum {n} sayıda öğe)' : 'Grup limiti aşıldı (maksimum {n} sayıda öğe)'\n      ];\n    },\n    selectAllText: 'Tümünü Seç',\n    deselectAllText: 'Seçiniz',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-ua_UA.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Нічого не вибрано',\n    noneResultsText: 'Збігів не знайдено {0}',\n    countSelectedText: 'Вибрано {0} із {1}',\n    maxOptionsText: ['Досягнута межа ({n} {var} максимум)', 'Досягнута межа в групі ({n} {var} максимум)', ['items', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-zh_CN.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '没有选中任何项',\n    noneResultsText: '没有找到匹配项',\n    countSelectedText: '选中{1}中的{0}项',\n    maxOptionsText: ['超出限制 (最多选择{n}项)', '组选择超出限制(最多选择{n}组)'],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/dist/js/i18n/defaults-zh_TW.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '沒有選取任何項目',\n    noneResultsText: '沒有找到符合的結果',\n    countSelectedText: '已經選取{0}個項目',\n    maxOptionsText: ['超過限制 (最多選擇{n}項)', '超過限制(最多選擇{n}組)'],\n    selectAllText: '選取全部',\n    deselectAllText: '全部取消',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/custom_theme/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  {% if page_description %}<meta name=\"description\" content=\"{{ page_description }}\">{% endif %}\n  {% if site_author %}<meta name=\"author\" content=\"{{ site_author }}\">{% endif %}\n  {% if canonical_url %}<link rel=\"canonical\" href=\"{{ canonical_url }}\">{% endif %}\n  {% if favicon %}<link rel=\"shortcut icon\" href=\"{{ favicon }}\">\n  {% else %}<link rel=\"shortcut icon\" href=\"{{ base_url }}/img/favicon.ico\">{% endif %}\n\n  <title>{% if page_title %}{{ page_title }} - {% endif %}{{ site_name }}</title>\n\n  <link href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css\" rel=\"stylesheet\">\n  <link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css\" rel=\"stylesheet\">\n  <link href=\"{{ base_url }}/css/highlight.css\" rel=\"stylesheet\">\n  <link href=\"{{ base_url }}/css/base.css\" rel=\"stylesheet\">\n  {%- for path in extra_css %}\n  <link href=\"{{ path }}\" rel=\"stylesheet\">\n  {%- endfor %}\n\n  <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n  <!--[if lt IE 9]>\n    <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n    <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n  <![endif]-->\n</head>\n\n<body>\n\n{% include \"nav.html\" %}\n\n{% if current_page and current_page.is_homepage %} \n<div class=\"jumbotron bs-docs-header text-center\">\n  <div class=\"container\">\n    <h1>bootstrap-select</h1>\n    <p class=\"lead\">Bootstrap-select is a jQuery plugin that utilizes Bootstrap's dropdown.js to style and bring additional functionality to standard select elements.</p>\n    <a class=\"btn btn-outline-inverse btn-lg\" href=\"//github.com/silviomoreto/bootstrap-select/archive/v{{ config.extra.version }}.zip\" role=\"button\">\n      <i class=\"fa fa-download\"></i> Download (v{{ config.extra.version }})\n    </a>\n  </div>\n  <div class=\"gh-btns\">\n    <iframe src=\"https://ghbtns.com/github-btn.html?user=silviomoreto&repo=bootstrap-select&type=star&count=true&size=large\" frameborder=\"0\" scrolling=\"0\" width=\"160px\" height=\"30px\"></iframe>\n    <iframe src=\"https://ghbtns.com/github-btn.html?user=silviomoreto&repo=bootstrap-select&type=fork&count=true&size=large\" frameborder=\"0\" scrolling=\"0\" width=\"160px\" height=\"30px\"></iframe>\n  </div>\n  <div class=\"carbonad\">\n    <div class=\"carbonad-inner\">\n      <script async type=\"text/javascript\" src=\"//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=silviomoretogithubiobootstrapsel\" id=\"_carbonads_js\"></script>\n    </div>\n    <div class=\"charity\">Ad revenue is donated to <a href=\"http://www.projetocana.org/\" target=\"_blank\" rel=\"nofollow\">Projecto Cana</a>.</div>\n  </div>\n</div>\n<div class=\"container\">\n{% include \"content.html\" %}\n</div>\n{% else %}\n<section class=\"jumbotron\">\n  <div class=\"container\">\n    <h1>{{ page_title }}</h1>\n  </div>\n</section>\n<div class=\"container\">\n  <div class=\"col-md-3\">{% include \"toc.html\" %}</div>\n  <div class=\"col-md-9\" role=\"main\">{% include \"content.html\" %}</div>\n</div>\n{% endif %}\n\n  <div class=\"footer\">\n    <div class=\"container text-center\">\n      <p class=\"text-muted\">Bootstrap-select is maintained by <a href=\"https://github.com/caseyjhol\">caseyjhol</a>,\n        <a href=\"https://github.com/t0xicCode\">t0xicCode</a>, and the community.</p>\n    </div>\n  </div>\n\n<script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\"></script>\n<script src=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js\"></script>\n<script src=\"{{ base_url }}/js/highlight.pack.js\"></script>\n<script src=\"{{ base_url }}/js/base.js\"></script>\n{%- for path in extra_javascript %}\n<script src=\"{{ path }}\"></script>\n{%- endfor %}\n\n<script type=\"text/javascript\">\n  var _gaq = _gaq || [];\n  _gaq.push(['_setAccount', 'UA-35848102-1']);\n  _gaq.push(['_trackPageview']);\n\n  (function () {\n    var ga = document.createElement('script');\n    ga.type = 'text/javascript';\n    ga.async = true;\n    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n    var s = document.getElementsByTagName('script')[0];\n    s.parentNode.insertBefore(ga, s);\n  })();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/custom_theme/css/base.css",
    "content": "body {\n    padding-top: 70px;\n}\n\nh1[id]:before, h2[id]:before, h3[id]:before, h4[id]:before, h5[id]:before, h6[id]:before {\n    content: \"\";\n    display: block;\n    margin-top: -75px;\n    height: 75px;\n}\n\nh2 code, h3 code, h4 code {\n    background-color: inherit;\n}\n\nul.nav li.main {\n    font-weight: bold;\n}\n\n.container > div.col-md-3 {\n    padding-left: 0;\n}\n\n.container > div.col-md-9 {\n    padding-bottom: 100px;\n}\n\ndiv.source-links {\n    float: right;\n}\n\n/*\n * Side navigation\n *\n * Scrollspy and affixed enhanced navigation to highlight sections and secondary\n * sections of docs content.\n */\n\n/* By default it's not affixed in mobile views, so undo that */\n.bs-sidebar.affix {\n    position: static;\n}\n\n.bs-sidebar.well {\n    padding: 0;\n}\n\n/* First level of nav */\n.bs-sidenav {\n    margin-top: 30px;\n    margin-bottom: 30px;\n    padding-top:    10px;\n    padding-bottom: 10px;\n    border-radius: 5px;\n}\n\n/* All levels of nav */\n.bs-sidebar .nav > li > a {\n    display: block;\n    padding: 5px 20px;\n    z-index: 1;\n}\n.bs-sidebar .nav > li > a:hover,\n.bs-sidebar .nav > li > a:focus {\n    text-decoration: none;\n    border-right: 1px solid;\n}\n.bs-sidebar .nav > .active > a,\n.bs-sidebar .nav > .active:hover > a,\n.bs-sidebar .nav > .active:focus > a {\n    font-weight: bold;\n    background-color: transparent;\n    border-right: 1px solid;\n}\n\n/* Nav: second level (shown on .active) */\n.bs-sidebar .nav .nav {\n    display: none; /* Hide by default, but at >768px, show it */\n    margin-bottom: 8px;\n}\n.bs-sidebar .nav .nav > li > a {\n    padding-top:    3px;\n    padding-bottom: 3px;\n    padding-left: 30px;\n    font-size: 90%;\n}\n\n/* Show and affix the side nav when space allows it */\n@media (min-width: 992px) {\n    .bs-sidebar .nav > .active > ul {\n        display: block;\n    }\n    /* Widen the fixed sidebar */\n    .bs-sidebar.affix,\n    .bs-sidebar.affix-bottom {\n        width: 213px;\n    }\n    .bs-sidebar.affix {\n        position: fixed; /* Undo the static from mobile first approach */\n        top: 80px;\n    }\n    .bs-sidebar.affix-bottom {\n        position: absolute; /* Undo the static from mobile first approach */\n    }\n    .bs-sidebar.affix-bottom .bs-sidenav,\n    .bs-sidebar.affix .bs-sidenav {\n        margin-top: 0;\n        margin-bottom: 0;\n    }\n}\n@media (min-width: 1200px) {\n    /* Widen the fixed sidebar again */\n    .bs-sidebar.affix-bottom,\n    .bs-sidebar.affix {\n        width: 263px;\n    }\n}"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/custom_theme/js/base.js",
    "content": "/* Highlight */\n$( document ).ready(function() {\n    hljs.initHighlightingOnLoad();\n    $('table').addClass('table table-striped table-hover');\n    $('pre').addClass('highlight');\n});\n\n$('body').scrollspy({\n    target: '.bs-sidebar',\n});\n\n$('.bs-sidebar').affix({\n  offset: {\n    top: 210\n  }\n});\n\n/* Prevent disabled links from causing a page reload */\n$(\"li.disabled a\").click(function() {\n    event.preventDefault();\n});"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/custom_theme/nav.html",
    "content": "<div class=\"navbar navbar-default navbar-fixed-top\" role=\"navigation\">\n  <div class=\"container\">\n\n    <!-- Collapsed navigation -->\n    <div class=\"navbar-header\">\n      {% if include_nav or include_next_prev or repo_url %}\n      <!-- Expander button -->\n      <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n        <span class=\"sr-only\">Toggle navigation</span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n      </button>\n      {% endif %}\n\n      <!-- Main title -->\n      <a class=\"navbar-brand\" href=\"{{ homepage_url }}\">{{ site_name }}</a>\n    </div>\n\n    <!-- Expanded navigation -->\n    <div class=\"navbar-collapse collapse\">\n      {% if include_nav %}\n      <!-- Main navigation -->\n      <ul class=\"nav navbar-nav\">\n        {% for nav_item in nav %}\n        {% if nav_item.children %}\n        <li class=\"dropdown{% if nav_item.active %} active{% endif %}\">\n          <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">{{ nav_item.title }} <b class=\"caret\"></b></a>\n          <ul class=\"dropdown-menu\">\n            {% for nav_item in nav_item.children %}\n            {% include \"nav-sub.html\" %}\n            {% endfor %}\n          </ul>\n        </li>\n        {% else %}\n        <li {% if nav_item.active %}class=\"active\"{% endif %}>\n          <a href=\"{{ nav_item.url }}\">{{ nav_item.title }}</a>\n        </li>\n        {% endif %}\n        {% endfor %}\n      </ul>\n      {% endif %}\n\n      <ul class=\"nav navbar-nav navbar-right\">\n        {% if repo_url %}\n        <li>\n          <a href=\"{{ repo_url }}\">\n            {% if repo_name == 'GitHub' %}\n            <i class=\"fa fa-github\"></i>\n            {% elif repo_name == 'Bitbucket' %}\n            <i class=\"fa fa-bitbucket\"></i>\n            {% endif %}\n            {{ repo_name }}\n          </a>\n        </li>\n        {% endif %}\n      </ul>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/custom_theme/toc.html",
    "content": "<div class=\"bs-sidebar hidden-print affix-top\" role=\"complementary\">\n    <ul class=\"nav bs-sidenav\">\n    {% for toc_item in toc %}\n        <li class=\"main {% if toc_item.active %}active{% endif %}\">\n\t        <a href=\"{{ toc_item.url }}\">{{ toc_item.title }}</a>\n\t        <ul class=\"nav\">\n\t        {% for toc_item in toc_item.children %}\n\t            <li><a href=\"{{ toc_item.url }}\">{{ toc_item.title }}</a></li>\n\t        {% endfor %}\n\t        </ul>\n        </li>\n    {% endfor %}\n    </ul>\n</div>"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/css/custom.css",
    "content": "html {\n  position: relative;\n  min-height: 100%;\n}\nbody {\n  padding-top: 51px;\n  /* Margin bottom by footer height */\n  margin-bottom: 60px;\n}\nlabel {\n  display: block;\n}\n/* hide \"Home\" in navbar */\n.nav.navbar-nav:first-child > li:first-child {\n    display: none;\n}\n\nul.nav li.main {\n  font-weight: normal;\n}\n\n.footer {\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  /* Set the fixed height of the footer here */\n  height: 60px;\n  background-color: #f5f5f5;\n}\n\n.footer .container .text-muted {\n  margin: 20px 0;\n}\n\n.footer .container {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n/* Outline button for use within the docs */\n.btn-outline {\n  color: #337ab7;\n  background-color: transparent;\n  border-color: #337ab7;\n}\n.btn-outline:hover,\n.btn-outline:focus,\n.btn-outline:active {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n\n/* Inverted outline button (white on dark) */\n.btn-outline-inverse {\n  color: #fff;\n  background-color: transparent;\n  border-color: #fff;\n}\n.btn-outline-inverse:hover,\n.btn-outline-inverse:focus,\n.btn-outline-inverse:active {\n  color: #337ab7;\n  text-shadow: none;\n  background-color: #fff;\n  border-color: #fff;\n}\n\n.bs-docs-header {\n  margin-bottom: 0;\n  background: #337ab7;\n  color: #fff;\n}\n\n.bs-docs-header .btn {\n  padding: 15px 30px;\n  font-size: 20px\n}\n\n.bs-docs-header h1 {\n  margin-bottom: 30px;\n}\n\n.bs-docs-header .lead {\n  margin: 0 auto 30px;\n}\n\n.bs-docs-sub-header {\n  padding-top: 20px;\n  padding-bottom: 20px;\n}\n\n.gh-btns {\n  margin: 48px 0 -30px;\n  background: rgba(0,0,0,.1);\n  padding: 20px 0 15px;\n}\n\n.content h1:first-of-type,\n.content h1:first-of-type + p:first-of-type {\n  text-align: center;\n}\n\n.bs-docs-example > p {\n  margin-top: 20px;\n}\n\n.bs-docs-example > p:last-child {\n  margin-bottom: 0;\n}\n\n.bs-docs-example .table,\n.bs-docs-example .progress,\n.bs-docs-example .well,\n.bs-docs-example .alert,\n.bs-docs-example .hero-unit,\n.bs-docs-example .pagination,\n.bs-docs-example .navbar,\n.bs-docs-example > .nav,\n.bs-docs-example blockquote {\n  margin-bottom: 5px;\n}\n\n.bs-docs-example .pagination {\n  margin-top: 0;\n}\n\n.special {\n  font-weight: bold !important;\n  color: #fff !important;\n  background: #bc0000 !important;\n  text-transform: uppercase;\n}\n\n.bs-docs-example {\n  position: relative;\n  padding: 45px 15px 15px;\n  margin: 0 -15px 15px;\n  border-color: #e5e5e5 #eee #eee;\n  border-style: solid;\n  border-width: 1px 0;\n  -webkit-box-shadow: inset 0 3px 6px rgba(0,0,0,.05);\n  box-shadow: inset 0 3px 6px rgba(0,0,0,.05);\n}\n\n/* Echo out a label for the example */\n.bs-docs-example:after {\n  position: absolute;\n  top: 15px;\n  left: 15px;\n  font-size: 12px;\n  font-weight: 700;\n  color: #959595;\n  text-transform: uppercase;\n  letter-spacing: 1px;\n  content: \"Example\";\n}\n\n.highlight {\n  padding: 9px 14px;\n  margin-bottom: 14px;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n  border-radius: 4px;\n}\n\n.bs-docs-example + .highlight {\n  margin: -15px -15px 15px;\n  border-width: 0 0 1px;\n  border-radius: 0;\n}\n\n.carbonad {\n  margin-top: 80px;\n}\n\n.carbonad-inner {\n  width: auto!important;\n  height: auto!important;\n  padding: 20px!important;\n  margin: 30px -15px 0!important;\n  overflow: hidden;\n  font-size: 13px!important;\n  line-height: 16px!important;\n  text-align: left;\n  background: 0 0!important;\n  border: solid rgba(255, 255, 255, 0.50) !important;\n  border-width: 1px 0!important;\n}\n\n.carbon-poweredby,\n.carbon-text {\n  display: block!important;\n  float: none!important;\n  width: auto!important;\n  height: auto!important;\n  margin-left: 145px!important;\n  font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif!important;\n  color: #fff!important;\n}\n\n.carbon-poweredby {\n  float: left;\n  margin-top: 9px;\n  text-align: left;\n  width: 142px;\n  opacity: 0.5;\n}\n\n.charity {\n  opacity: 0.5;\n  padding: 4px;\n  margin-bottom: -31px;\n}\n\n.charity a {\n  color: #fff;\n}\n\n.carbon-img img {\n    border: none;\n    display: inline;\n    float: left;\n    height: 100px;\n    margin: 0 !important;\n    width: 130px;\n}\n\n.logo-block a {\n  display: block;\n  padding: 5px;\n  margin: 5px 0;\n}\n\n.logo-block img {\n  height: auto;\n  max-width: 100%;\n  max-height: 40px;\n}\n\n.logo-container {\n  float: left;\n  max-width: 25%;\n  margin: 0 15px;\n}\n\n.logo-block + div {\n  margin: 5px 0;\n}\n\n@media (min-width: 480px){\n  .carbonad-inner {\n    width: 330px!important;\n    margin: 50px auto 0 !important;\n    border-width: 1px!important;\n    border-radius: 4px;\n  }\n\n  .charity {\n    margin-bottom: 0;\n  }\n\n  .logo-container {\n    max-width: 60%;\n  }\n}\n\n@media (min-width: 768px) {\n  .bs-docs-example {\n    margin-right: 0;\n    margin-left: 0;\n    background-color: #fff;\n    border-color: #ddd;\n    border-width: 1px;\n    border-radius: 4px 4px 0 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n\n  .bs-docs-example.no-code {\n    border-radius: 4px;\n  }\n\n  .bs-docs-example + .highlight {\n    margin-top: -16px;\n    margin-right: 0;\n    margin-left: 0;\n    border-width: 1px;\n    border-bottom-right-radius: 4px;\n    border-bottom-left-radius: 4px;\n  }\n\n  .logo-container {\n    max-width: 33.3333%;\n  }\n\n  .gh-btns {\n    margin-bottom: -48px;\n  }\n}\n\n@media (min-width: 992px){\n  .bs-docs-header .lead {\n      width: 80%;\n  }\n\n  .carbonad-inner {\n    top: 0;\n    right: 15px;\n    width: 330px!important;\n    padding: 15px!important;\n  }\n\n  .logo-container {\n    max-width: 25%;\n  }\n}"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/css/bootstrap-select.css",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\nselect.bs-select-hidden,\nselect.selectpicker {\n  display: none !important;\n}\n.bootstrap-select {\n  width: 220px \\0;\n  /*IE9 and below*/\n}\n.bootstrap-select > .dropdown-toggle {\n  width: 100%;\n  padding-right: 25px;\n  z-index: 1;\n}\n.bootstrap-select > .dropdown-toggle.bs-placeholder,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,\n.bootstrap-select > .dropdown-toggle.bs-placeholder:active {\n  color: #999;\n}\n.bootstrap-select > select {\n  position: absolute !important;\n  bottom: 0;\n  left: 50%;\n  display: block !important;\n  width: 0.5px !important;\n  height: 100% !important;\n  padding: 0 !important;\n  opacity: 0 !important;\n  border: none;\n}\n.bootstrap-select > select.mobile-device {\n  top: 0;\n  left: 0;\n  display: block !important;\n  width: 100% !important;\n  z-index: 2;\n}\n.has-error .bootstrap-select .dropdown-toggle,\n.error .bootstrap-select .dropdown-toggle {\n  border-color: #b94a48;\n}\n.bootstrap-select.fit-width {\n  width: auto !important;\n}\n.bootstrap-select:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n  width: 220px;\n}\n.bootstrap-select .dropdown-toggle:focus {\n  outline: thin dotted #333333 !important;\n  outline: 5px auto -webkit-focus-ring-color !important;\n  outline-offset: -2px;\n}\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n}\n.bootstrap-select.form-control:not([class*=\"col-\"]) {\n  width: 100%;\n}\n.bootstrap-select.form-control.input-group-btn {\n  z-index: auto;\n}\n.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.bootstrap-select.btn-group:not(.input-group-btn),\n.bootstrap-select.btn-group[class*=\"col-\"] {\n  float: none;\n  display: inline-block;\n  margin-left: 0;\n}\n.bootstrap-select.btn-group.dropdown-menu-right,\n.bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right,\n.row .bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right {\n  float: right;\n}\n.form-inline .bootstrap-select.btn-group,\n.form-horizontal .bootstrap-select.btn-group,\n.form-group .bootstrap-select.btn-group {\n  margin-bottom: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control,\n.form-group-sm .bootstrap-select.btn-group.form-control {\n  padding: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,\n.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle {\n  height: 100%;\n  font-size: inherit;\n  line-height: inherit;\n  border-radius: inherit;\n}\n.form-inline .bootstrap-select.btn-group .form-control {\n  width: 100%;\n}\n.bootstrap-select.btn-group.disabled,\n.bootstrap-select.btn-group > .disabled {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group.disabled:focus,\n.bootstrap-select.btn-group > .disabled:focus {\n  outline: none !important;\n}\n.bootstrap-select.btn-group.bs-container {\n  position: absolute;\n  height: 0 !important;\n  padding: 0 !important;\n}\n.bootstrap-select.btn-group.bs-container .dropdown-menu {\n  z-index: 1060;\n}\n.bootstrap-select.btn-group .dropdown-toggle .filter-option {\n  display: inline-block;\n  overflow: hidden;\n  width: 100%;\n  text-align: left;\n}\n.bootstrap-select.btn-group .dropdown-toggle .caret {\n  position: absolute;\n  top: 50%;\n  right: 12px;\n  margin-top: -2px;\n  vertical-align: middle;\n}\n.bootstrap-select.btn-group[class*=\"col-\"] .dropdown-toggle {\n  width: 100%;\n}\n.bootstrap-select.btn-group .dropdown-menu {\n  min-width: 100%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bootstrap-select.btn-group .dropdown-menu.inner {\n  position: static;\n  float: none;\n  border: 0;\n  padding: 0;\n  margin: 0;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li {\n  position: relative;\n}\n.bootstrap-select.btn-group .dropdown-menu li.active small {\n  color: #fff;\n}\n.bootstrap-select.btn-group .dropdown-menu li.disabled a {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group .dropdown-menu li a {\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a.opt {\n  position: relative;\n  padding-left: 2.25em;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {\n  display: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.text {\n  display: inline-block;\n}\n.bootstrap-select.btn-group .dropdown-menu li small {\n  padding-left: 0.5em;\n}\n.bootstrap-select.btn-group .dropdown-menu .notify {\n  position: absolute;\n  bottom: 5px;\n  width: 96%;\n  margin: 0 2%;\n  min-height: 26px;\n  padding: 3px 5px;\n  background: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  pointer-events: none;\n  opacity: 0.9;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bootstrap-select.btn-group .no-results {\n  padding: 3px;\n  background: #f5f5f5;\n  margin: 0 5px;\n  white-space: nowrap;\n}\n.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option {\n  position: static;\n}\n.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret {\n  position: static;\n  top: auto;\n  margin-top: -1px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {\n  position: absolute;\n  display: inline-block;\n  right: 15px;\n  margin-top: 5px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {\n  margin-right: 34px;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle {\n  z-index: 1061;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:before {\n  content: '';\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid rgba(204, 204, 204, 0.2);\n  position: absolute;\n  bottom: -4px;\n  left: 9px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:after {\n  content: '';\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid white;\n  position: absolute;\n  bottom: -4px;\n  left: 10px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {\n  bottom: auto;\n  top: -3px;\n  border-top: 7px solid rgba(204, 204, 204, 0.2);\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {\n  bottom: auto;\n  top: -3px;\n  border-top: 6px solid white;\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {\n  right: 12px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {\n  right: 13px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {\n  display: block;\n}\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n.bs-actionsbox {\n  width: 100%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bs-actionsbox .btn-group button {\n  width: 50%;\n}\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.bs-donebutton .btn-group button {\n  width: 100%;\n}\n.bs-searchbox + .bs-actionsbox {\n  padding: 0 8px 4px;\n}\n.bs-searchbox .form-control {\n  margin-bottom: 0;\n  width: 100%;\n  float: none;\n}\n/*# sourceMappingURL=bootstrap-select.css.map */"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/bootstrap-select.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  'use strict';\n\n  //<editor-fold desc=\"Shims\">\n  if (!String.prototype.includes) {\n    (function () {\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n      var toString = {}.toString;\n      var defineProperty = (function () {\n        // IE 8 only supports `Object.defineProperty` on DOM elements\n        try {\n          var object = {};\n          var $defineProperty = Object.defineProperty;\n          var result = $defineProperty(object, object, object) && $defineProperty;\n        } catch (error) {\n        }\n        return result;\n      }());\n      var indexOf = ''.indexOf;\n      var includes = function (search) {\n        if (this == null) {\n          throw new TypeError();\n        }\n        var string = String(this);\n        if (search && toString.call(search) == '[object RegExp]') {\n          throw new TypeError();\n        }\n        var stringLength = string.length;\n        var searchString = String(search);\n        var searchLength = searchString.length;\n        var position = arguments.length > 1 ? arguments[1] : undefined;\n        // `ToInteger`\n        var pos = position ? Number(position) : 0;\n        if (pos != pos) { // better `isNaN`\n          pos = 0;\n        }\n        var start = Math.min(Math.max(pos, 0), stringLength);\n        // Avoid the `indexOf` call if no match is possible\n        if (searchLength + start > stringLength) {\n          return false;\n        }\n        return indexOf.call(string, searchString, pos) != -1;\n      };\n      if (defineProperty) {\n        defineProperty(String.prototype, 'includes', {\n          'value': includes,\n          'configurable': true,\n          'writable': true\n        });\n      } else {\n        String.prototype.includes = includes;\n      }\n    }());\n  }\n\n  if (!String.prototype.startsWith) {\n    (function () {\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n      var defineProperty = (function () {\n        // IE 8 only supports `Object.defineProperty` on DOM elements\n        try {\n          var object = {};\n          var $defineProperty = Object.defineProperty;\n          var result = $defineProperty(object, object, object) && $defineProperty;\n        } catch (error) {\n        }\n        return result;\n      }());\n      var toString = {}.toString;\n      var startsWith = function (search) {\n        if (this == null) {\n          throw new TypeError();\n        }\n        var string = String(this);\n        if (search && toString.call(search) == '[object RegExp]') {\n          throw new TypeError();\n        }\n        var stringLength = string.length;\n        var searchString = String(search);\n        var searchLength = searchString.length;\n        var position = arguments.length > 1 ? arguments[1] : undefined;\n        // `ToInteger`\n        var pos = position ? Number(position) : 0;\n        if (pos != pos) { // better `isNaN`\n          pos = 0;\n        }\n        var start = Math.min(Math.max(pos, 0), stringLength);\n        // Avoid the `indexOf` call if no match is possible\n        if (searchLength + start > stringLength) {\n          return false;\n        }\n        var index = -1;\n        while (++index < searchLength) {\n          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {\n            return false;\n          }\n        }\n        return true;\n      };\n      if (defineProperty) {\n        defineProperty(String.prototype, 'startsWith', {\n          'value': startsWith,\n          'configurable': true,\n          'writable': true\n        });\n      } else {\n        String.prototype.startsWith = startsWith;\n      }\n    }());\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (\n      o, // object\n      k, // key\n      r  // result array\n      ){\n      // initialize object and result\n      r=[];\n      // iterate over object keys\n      for (k in o)\n          // fill result array with non-prototypical keys\n        r.hasOwnProperty.call(o, k) && r.push(k);\n      // return result\n      return r;\n    };\n  }\n\n  // set data-selected on select element if the value has been programmatically selected\n  // prior to initialization of bootstrap-select\n  // * consider removing or replacing an alternative method *\n  var valHooks = {\n    useDefault: false,\n    _set: $.valHooks.select.set\n  };\n\n  $.valHooks.select.set = function(elem, value) {\n    if (value && !valHooks.useDefault) $(elem).data('selected', true);\n\n    return valHooks._set.apply(this, arguments);\n  };\n\n  var changed_arguments = null;\n  $.fn.triggerNative = function (eventName) {\n    var el = this[0],\n        event;\n\n    if (el.dispatchEvent) { // for modern browsers & IE9+\n      if (typeof Event === 'function') {\n        // For modern browsers\n        event = new Event(eventName, {\n          bubbles: true\n        });\n      } else {\n        // For IE since it doesn't support Event constructor\n        event = document.createEvent('Event');\n        event.initEvent(eventName, true, false);\n      }\n\n      el.dispatchEvent(event);\n    } else if (el.fireEvent) { // for IE8\n      event = document.createEventObject();\n      event.eventType = eventName;\n      el.fireEvent('on' + eventName, event);\n    } else {\n      // fall back to jQuery.trigger\n      this.trigger(eventName);\n    }\n  };\n  //</editor-fold>\n\n  // Case insensitive contains search\n  $.expr.pseudos.icontains = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();\n    return haystack.includes(meta[3].toUpperCase());\n  };\n\n  // Case insensitive begins search\n  $.expr.pseudos.ibegins = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();\n    return haystack.startsWith(meta[3].toUpperCase());\n  };\n\n  // Case and accent insensitive contains search\n  $.expr.pseudos.aicontains = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();\n    return haystack.includes(meta[3].toUpperCase());\n  };\n\n  // Case and accent insensitive begins search\n  $.expr.pseudos.aibegins = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();\n    return haystack.startsWith(meta[3].toUpperCase());\n  };\n\n  /**\n   * Remove all diatrics from the given text.\n   * @access private\n   * @param {String} text\n   * @returns {String}\n   */\n  function normalizeToBase(text) {\n    var rExps = [\n      {re: /[\\xC0-\\xC6]/g, ch: \"A\"},\n      {re: /[\\xE0-\\xE6]/g, ch: \"a\"},\n      {re: /[\\xC8-\\xCB]/g, ch: \"E\"},\n      {re: /[\\xE8-\\xEB]/g, ch: \"e\"},\n      {re: /[\\xCC-\\xCF]/g, ch: \"I\"},\n      {re: /[\\xEC-\\xEF]/g, ch: \"i\"},\n      {re: /[\\xD2-\\xD6]/g, ch: \"O\"},\n      {re: /[\\xF2-\\xF6]/g, ch: \"o\"},\n      {re: /[\\xD9-\\xDC]/g, ch: \"U\"},\n      {re: /[\\xF9-\\xFC]/g, ch: \"u\"},\n      {re: /[\\xC7-\\xE7]/g, ch: \"c\"},\n      {re: /[\\xD1]/g, ch: \"N\"},\n      {re: /[\\xF1]/g, ch: \"n\"}\n    ];\n    $.each(rExps, function () {\n      text = text ? text.replace(this.re, this.ch) : '';\n    });\n    return text;\n  }\n\n\n  // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  \n  var unescapeMap = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#x27;': \"'\",\n    '&#x60;': '`'\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped.\n    var source = '(?:' + Object.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n\n  var htmlEscape = createEscaper(escapeMap);\n  var htmlUnescape = createEscaper(unescapeMap);\n\n  var Selectpicker = function (element, options) {\n    // bootstrap-select has been initialized - revert valHooks.select.set back to its original function\n    if (!valHooks.useDefault) {\n      $.valHooks.select.set = valHooks._set;\n      valHooks.useDefault = true;\n    }\n\n    this.$element = $(element);\n    this.$newElement = null;\n    this.$button = null;\n    this.$menu = null;\n    this.$lis = null;\n    this.options = options;\n\n    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a\n    // data-attribute)\n    if (this.options.title === null) {\n      this.options.title = this.$element.attr('title');\n    }\n\n    // Format window padding\n    var winPad = this.options.windowPadding;\n    if (typeof winPad === 'number') {\n      this.options.windowPadding = [winPad, winPad, winPad, winPad];\n    }\n\n    //Expose public methods\n    this.val = Selectpicker.prototype.val;\n    this.render = Selectpicker.prototype.render;\n    this.refresh = Selectpicker.prototype.refresh;\n    this.setStyle = Selectpicker.prototype.setStyle;\n    this.selectAll = Selectpicker.prototype.selectAll;\n    this.deselectAll = Selectpicker.prototype.deselectAll;\n    this.destroy = Selectpicker.prototype.destroy;\n    this.remove = Selectpicker.prototype.remove;\n    this.show = Selectpicker.prototype.show;\n    this.hide = Selectpicker.prototype.hide;\n\n    this.init();\n  };\n\n  Selectpicker.VERSION = '1.12.2';\n\n  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.\n  Selectpicker.DEFAULTS = {\n    noneSelectedText: 'Nothing selected',\n    noneResultsText: 'No results matched {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} item selected\" : \"{0} items selected\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\n      ];\n    },\n    selectAllText: 'Select All',\n    deselectAllText: 'Deselect All',\n    doneButton: false,\n    doneButtonText: 'Close',\n    multipleSeparator: ', ',\n    styleBase: 'btn',\n    style: 'btn-default',\n    size: 'auto',\n    title: null,\n    selectedTextFormat: 'values',\n    width: false,\n    container: false,\n    hideDisabled: false,\n    showSubtext: false,\n    showIcon: true,\n    showContent: true,\n    dropupAuto: true,\n    header: false,\n    liveSearch: false,\n    liveSearchPlaceholder: null,\n    liveSearchNormalize: false,\n    liveSearchStyle: 'contains',\n    actionsBox: false,\n    iconBase: 'glyphicon',\n    tickIcon: 'glyphicon-ok',\n    showTick: false,\n    template: {\n      caret: '<span class=\"caret\"></span>'\n    },\n    maxOptions: false,\n    mobile: false,\n    selectOnTab: false,\n    dropdownAlignRight: false,\n    windowPadding: 0\n  };\n\n  Selectpicker.prototype = {\n\n    constructor: Selectpicker,\n\n    init: function () {\n      var that = this,\n          id = this.$element.attr('id');\n\n      this.$element.addClass('bs-select-hidden');\n\n      // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility\n      // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index=\"' + index + '\"]')\n      this.liObj = {};\n      this.multiple = this.$element.prop('multiple');\n      this.autofocus = this.$element.prop('autofocus');\n      this.$newElement = this.createView();\n      this.$element\n        .after(this.$newElement)\n        .appendTo(this.$newElement);\n      this.$button = this.$newElement.children('button');\n      this.$menu = this.$newElement.children('.dropdown-menu');\n      this.$menuInner = this.$menu.children('.inner');\n      this.$searchbox = this.$menu.find('input');\n\n      this.$element.removeClass('bs-select-hidden');\n\n      if (this.options.dropdownAlignRight === true) this.$menu.addClass('dropdown-menu-right');\n\n      if (typeof id !== 'undefined') {\n        this.$button.attr('data-id', id);\n        $('label[for=\"' + id + '\"]').click(function (e) {\n          e.preventDefault();\n          that.$button.focus();\n        });\n      }\n\n      this.checkDisabled();\n      this.clickListener();\n      if (this.options.liveSearch) this.liveSearchListener();\n      this.render();\n      this.setStyle();\n      this.setWidth();\n      if (this.options.container) this.selectPosition();\n      this.$menu.data('this', this);\n      this.$newElement.data('this', this);\n      if (this.options.mobile) this.mobile();\n\n      this.$newElement.on({\n        'hide.bs.dropdown': function (e) {\n          that.$menuInner.attr('aria-expanded', false);\n          that.$element.trigger('hide.bs.select', e);\n        },\n        'hidden.bs.dropdown': function (e) {\n          that.$element.trigger('hidden.bs.select', e);\n        },\n        'show.bs.dropdown': function (e) {\n          that.$menuInner.attr('aria-expanded', true);\n          that.$element.trigger('show.bs.select', e);\n        },\n        'shown.bs.dropdown': function (e) {\n          that.$element.trigger('shown.bs.select', e);\n        }\n      });\n\n      if (that.$element[0].hasAttribute('required')) {\n        this.$element.on('invalid', function () {\n          that.$button\n            .addClass('bs-invalid')\n            .focus();\n\n          that.$element.on({\n            'focus.bs.select': function () {\n              that.$button.focus();\n              that.$element.off('focus.bs.select');\n            },\n            'shown.bs.select': function () {\n              that.$element\n                .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened\n                .off('shown.bs.select');\n            },\n            'rendered.bs.select': function () {\n              // if select is no longer invalid, remove the bs-invalid class\n              if (this.validity.valid) that.$button.removeClass('bs-invalid');\n              that.$element.off('rendered.bs.select');\n            }\n          });\n        });\n      }\n\n      setTimeout(function () {\n        that.$element.trigger('loaded.bs.select');\n      });\n    },\n\n    createDropdown: function () {\n      // Options\n      // If we are multiple or showTick option is set, then add the show-tick class\n      var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',\n          inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',\n          autofocus = this.autofocus ? ' autofocus' : '';\n      // Elements\n      var header = this.options.header ? '<div class=\"popover-title\"><button type=\"button\" class=\"close\" aria-hidden=\"true\">&times;</button>' + this.options.header + '</div>' : '';\n      var searchbox = this.options.liveSearch ?\n      '<div class=\"bs-searchbox\">' +\n      '<input type=\"text\" class=\"form-control\" autocomplete=\"off\"' +\n      (null === this.options.liveSearchPlaceholder ? '' : ' placeholder=\"' + htmlEscape(this.options.liveSearchPlaceholder) + '\"') + ' role=\"textbox\" aria-label=\"Search\">' +\n      '</div>'\n          : '';\n      var actionsbox = this.multiple && this.options.actionsBox ?\n      '<div class=\"bs-actionsbox\">' +\n      '<div class=\"btn-group btn-group-sm btn-block\">' +\n      '<button type=\"button\" class=\"actions-btn bs-select-all btn btn-default\">' +\n      this.options.selectAllText +\n      '</button>' +\n      '<button type=\"button\" class=\"actions-btn bs-deselect-all btn btn-default\">' +\n      this.options.deselectAllText +\n      '</button>' +\n      '</div>' +\n      '</div>'\n          : '';\n      var donebutton = this.multiple && this.options.doneButton ?\n      '<div class=\"bs-donebutton\">' +\n      '<div class=\"btn-group btn-block\">' +\n      '<button type=\"button\" class=\"btn btn-sm btn-default\">' +\n      this.options.doneButtonText +\n      '</button>' +\n      '</div>' +\n      '</div>'\n          : '';\n      var drop =\n          '<div class=\"btn-group bootstrap-select' + showTick + inputGroup + '\">' +\n          '<button type=\"button\" class=\"' + this.options.styleBase + ' dropdown-toggle\" data-toggle=\"dropdown\"' + autofocus + ' role=\"button\">' +\n          '<span class=\"filter-option pull-left\"></span>&nbsp;' +\n          '<span class=\"bs-caret\">' +\n          this.options.template.caret +\n          '</span>' +\n          '</button>' +\n          '<div class=\"dropdown-menu open\" role=\"combobox\">' +\n          header +\n          searchbox +\n          actionsbox +\n          '<ul class=\"dropdown-menu inner\" role=\"listbox\" aria-expanded=\"false\">' +\n          '</ul>' +\n          donebutton +\n          '</div>' +\n          '</div>';\n\n      return $(drop);\n    },\n\n    createView: function () {\n      var $drop = this.createDropdown(),\n          li = this.createLi();\n\n      $drop.find('ul')[0].innerHTML = li;\n      return $drop;\n    },\n\n    reloadLi: function () {\n      // rebuild\n      var li = this.createLi();\n      this.$menuInner[0].innerHTML = li;\n    },\n\n    createLi: function () {\n      var that = this,\n          _li = [],\n          optID = 0,\n          titleOption = document.createElement('option'),\n          liIndex = -1; // increment liIndex whenever a new <li> element is created to ensure liObj is correct\n\n      // Helper functions\n      /**\n       * @param content\n       * @param [index]\n       * @param [classes]\n       * @param [optgroup]\n       * @returns {string}\n       */\n      var generateLI = function (content, index, classes, optgroup) {\n        return '<li' +\n            ((typeof classes !== 'undefined' & '' !== classes) ? ' class=\"' + classes + '\"' : '') +\n            ((typeof index !== 'undefined' & null !== index) ? ' data-original-index=\"' + index + '\"' : '') +\n            ((typeof optgroup !== 'undefined' & null !== optgroup) ? 'data-optgroup=\"' + optgroup + '\"' : '') +\n            '>' + content + '</li>';\n      };\n\n      /**\n       * @param text\n       * @param [classes]\n       * @param [inline]\n       * @param [tokens]\n       * @returns {string}\n       */\n      var generateA = function (text, classes, inline, tokens) {\n        return '<a tabindex=\"0\"' +\n            (typeof classes !== 'undefined' ? ' class=\"' + classes + '\"' : '') +\n            (inline ? ' style=\"' + inline + '\"' : '') +\n            (that.options.liveSearchNormalize ? ' data-normalized-text=\"' + normalizeToBase(htmlEscape($(text).html())) + '\"' : '') +\n            (typeof tokens !== 'undefined' || tokens !== null ? ' data-tokens=\"' + tokens + '\"' : '') +\n            ' role=\"option\">' + text +\n            '<span class=\"' + that.options.iconBase + ' ' + that.options.tickIcon + ' check-mark\"></span>' +\n            '</a>';\n      };\n\n      if (this.options.title && !this.multiple) {\n        // this option doesn't create a new <li> element, but does add a new option, so liIndex is decreased\n        // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended\n        liIndex--;\n\n        if (!this.$element.find('.bs-title-option').length) {\n          // Use native JS to prepend option (faster)\n          var element = this.$element[0];\n          titleOption.className = 'bs-title-option';\n          titleOption.innerHTML = this.options.title;\n          titleOption.value = '';\n          element.insertBefore(titleOption, element.firstChild);\n          // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.\n          // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,\n          // if so, the select will have the data-selected attribute\n          var $opt = $(element.options[element.selectedIndex]);\n          if ($opt.attr('selected') === undefined && this.$element.data('selected') === undefined) {\n            titleOption.selected = true;\n          }\n        }\n      }\n\n      this.$element.find('option').each(function (index) {\n        var $this = $(this);\n\n        liIndex++;\n\n        if ($this.hasClass('bs-title-option')) return;\n\n        // Get the class and text for the option\n        var optionClass = this.className || '',\n            inline = this.style.cssText,\n            text = $this.data('content') ? $this.data('content') : $this.html(),\n            tokens = $this.data('tokens') ? $this.data('tokens') : null,\n            subtext = typeof $this.data('subtext') !== 'undefined' ? '<small class=\"text-muted\">' + $this.data('subtext') + '</small>' : '',\n            icon = typeof $this.data('icon') !== 'undefined' ? '<span class=\"' + that.options.iconBase + ' ' + $this.data('icon') + '\"></span> ' : '',\n            $parent = $this.parent(),\n            isOptgroup = $parent[0].tagName === 'OPTGROUP',\n            isOptgroupDisabled = isOptgroup && $parent[0].disabled,\n            isDisabled = this.disabled || isOptgroupDisabled;\n\n        if (icon !== '' && isDisabled) {\n          icon = '<span>' + icon + '</span>';\n        }\n\n        if (that.options.hideDisabled && (isDisabled && !isOptgroup || isOptgroupDisabled)) {\n          liIndex--;\n          return;\n        }\n\n        if (!$this.data('content')) {\n          // Prepend any icon and append any subtext to the main text.\n          text = icon + '<span class=\"text\">' + text + subtext + '</span>';\n        }\n\n        if (isOptgroup && $this.data('divider') !== true) {\n          if (that.options.hideDisabled && isDisabled) {\n            if ($parent.data('allOptionsDisabled') === undefined) {\n              var $options = $parent.children();\n              $parent.data('allOptionsDisabled', $options.filter(':disabled').length === $options.length);\n            }\n\n            if ($parent.data('allOptionsDisabled')) {\n              liIndex--;\n              return;\n            }\n          }\n\n          var optGroupClass = ' ' + $parent[0].className || '';\n\n          if ($this.index() === 0) { // Is it the first option of the optgroup?\n            optID += 1;\n\n            // Get the opt group label\n            var label = $parent[0].label,\n                labelSubtext = typeof $parent.data('subtext') !== 'undefined' ? '<small class=\"text-muted\">' + $parent.data('subtext') + '</small>' : '',\n                labelIcon = $parent.data('icon') ? '<span class=\"' + that.options.iconBase + ' ' + $parent.data('icon') + '\"></span> ' : '';\n\n            label = labelIcon + '<span class=\"text\">' + htmlEscape(label) + labelSubtext + '</span>';\n\n            if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?\n              liIndex++;\n              _li.push(generateLI('', null, 'divider', optID + 'div'));\n            }\n            liIndex++;\n            _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));\n          }\n\n          if (that.options.hideDisabled && isDisabled) {\n            liIndex--;\n            return;\n          }\n\n          _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));\n        } else if ($this.data('divider') === true) {\n          _li.push(generateLI('', index, 'divider'));\n        } else if ($this.data('hidden') === true) {\n          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));\n        } else {\n          var showDivider = this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP';\n\n          // if previous element is not an optgroup and hideDisabled is true\n          if (!showDivider && that.options.hideDisabled) {\n            // get previous elements\n            var $prev = $(this).prevAll();\n\n            for (var i = 0; i < $prev.length; i++) {\n              // find the first element in the previous elements that is an optgroup\n              if ($prev[i].tagName === 'OPTGROUP') {\n                var optGroupDistance = 0;\n\n                // loop through the options in between the current option and the optgroup\n                // and check if they are hidden or disabled\n                for (var d = 0; d < i; d++) {\n                  var prevOption = $prev[d];\n                  if (prevOption.disabled || $(prevOption).data('hidden') === true) optGroupDistance++;\n                }\n\n                // if all of the options between the current option and the optgroup are hidden or disabled, show the divider\n                if (optGroupDistance === i) showDivider = true;\n\n                break;\n              }\n            }\n          }\n\n          if (showDivider) {\n            liIndex++;\n            _li.push(generateLI('', null, 'divider', optID + 'div'));\n          }\n          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));\n        }\n\n        that.liObj[index] = liIndex;\n      });\n\n      //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button\n      if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {\n        this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');\n      }\n\n      return _li.join('');\n    },\n\n    findLis: function () {\n      if (this.$lis == null) this.$lis = this.$menu.find('li');\n      return this.$lis;\n    },\n\n    /**\n     * @param [updateLi] defaults to true\n     */\n    render: function (updateLi) {\n      var that = this,\n          notDisabled;\n\n      //Update the LI to match the SELECT\n      if (updateLi !== false) {\n        this.$element.find('option').each(function (index) {\n          var $lis = that.findLis().eq(that.liObj[index]);\n\n          that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis);\n          that.setSelected(index, this.selected, $lis);\n        });\n      }\n\n      this.togglePlaceholder();\n\n      this.tabIndex();\n\n      var selectedItems = this.$element.find('option').map(function () {\n        if (this.selected) {\n          if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return;\n\n          var $this = $(this),\n              icon = $this.data('icon') && that.options.showIcon ? '<i class=\"' + that.options.iconBase + ' ' + $this.data('icon') + '\"></i> ' : '',\n              subtext;\n\n          if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {\n            subtext = ' <small class=\"text-muted\">' + $this.data('subtext') + '</small>';\n          } else {\n            subtext = '';\n          }\n          if (typeof $this.attr('title') !== 'undefined') {\n            return $this.attr('title');\n          } else if ($this.data('content') && that.options.showContent) {\n            return $this.data('content').toString();\n          } else {\n            return icon + $this.html() + subtext;\n          }\n        }\n      }).toArray();\n\n      //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled\n      //Convert all the values into a comma delimited string\n      var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);\n\n      //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..\n      if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {\n        var max = this.options.selectedTextFormat.split('>');\n        if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {\n          notDisabled = this.options.hideDisabled ? ', [disabled]' : '';\n          var totalCount = this.$element.find('option').not('[data-divider=\"true\"], [data-hidden=\"true\"]' + notDisabled).length,\n              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;\n          title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());\n        }\n      }\n\n      if (this.options.title == undefined) {\n        this.options.title = this.$element.attr('title');\n      }\n\n      if (this.options.selectedTextFormat == 'static') {\n        title = this.options.title;\n      }\n\n      //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text\n      if (!title) {\n        title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;\n      }\n\n      //strip all HTML tags and trim the result, then unescape any escaped tags\n      this.$button.attr('title', htmlUnescape($.trim(title.replace(/<[^>]*>?/g, ''))));\n      this.$button.children('.filter-option').html(title);\n\n      this.$element.trigger('rendered.bs.select');\n    },\n\n    /**\n     * @param [style]\n     * @param [status]\n     */\n    setStyle: function (style, status) {\n      if (this.$element.attr('class')) {\n        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\\[.*\\]/gi, ''));\n      }\n\n      var buttonClass = style ? style : this.options.style;\n\n      if (status == 'add') {\n        this.$button.addClass(buttonClass);\n      } else if (status == 'remove') {\n        this.$button.removeClass(buttonClass);\n      } else {\n        this.$button.removeClass(this.options.style);\n        this.$button.addClass(buttonClass);\n      }\n    },\n\n    liHeight: function (refresh) {\n      if (!refresh && (this.options.size === false || this.sizeInfo)) return;\n\n      var newElement = document.createElement('div'),\n          menu = document.createElement('div'),\n          menuInner = document.createElement('ul'),\n          divider = document.createElement('li'),\n          li = document.createElement('li'),\n          a = document.createElement('a'),\n          text = document.createElement('span'),\n          header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,\n          search = this.options.liveSearch ? document.createElement('div') : null,\n          actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,\n          doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;\n\n      text.className = 'text';\n      newElement.className = this.$menu[0].parentNode.className + ' open';\n      menu.className = 'dropdown-menu open';\n      menuInner.className = 'dropdown-menu inner';\n      divider.className = 'divider';\n\n      text.appendChild(document.createTextNode('Inner text'));\n      a.appendChild(text);\n      li.appendChild(a);\n      menuInner.appendChild(li);\n      menuInner.appendChild(divider);\n      if (header) menu.appendChild(header);\n      if (search) {\n        var input = document.createElement('input');\n        search.className = 'bs-searchbox';\n        input.className = 'form-control';\n        search.appendChild(input);\n        menu.appendChild(search);\n      }\n      if (actions) menu.appendChild(actions);\n      menu.appendChild(menuInner);\n      if (doneButton) menu.appendChild(doneButton);\n      newElement.appendChild(menu);\n\n      document.body.appendChild(newElement);\n\n      var liHeight = a.offsetHeight,\n          headerHeight = header ? header.offsetHeight : 0,\n          searchHeight = search ? search.offsetHeight : 0,\n          actionsHeight = actions ? actions.offsetHeight : 0,\n          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,\n          dividerHeight = $(divider).outerHeight(true),\n          // fall back to jQuery if getComputedStyle is not supported\n          menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,\n          $menu = menuStyle ? null : $(menu),\n          menuPadding = {\n            vert: parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +\n                  parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +\n                  parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +\n                  parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),\n            horiz: parseInt(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) +\n                  parseInt(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) +\n                  parseInt(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) +\n                  parseInt(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth'))\n          },\n          menuExtras =  {\n            vert: menuPadding.vert +\n                  parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +\n                  parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2,\n            horiz: menuPadding.horiz +\n                  parseInt(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) +\n                  parseInt(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2\n          }\n\n      document.body.removeChild(newElement);\n\n      this.sizeInfo = {\n        liHeight: liHeight,\n        headerHeight: headerHeight,\n        searchHeight: searchHeight,\n        actionsHeight: actionsHeight,\n        doneButtonHeight: doneButtonHeight,\n        dividerHeight: dividerHeight,\n        menuPadding: menuPadding,\n        menuExtras: menuExtras\n      };\n    },\n\n    setSize: function () {\n      this.findLis();\n      this.liHeight();\n\n      if (this.options.header) this.$menu.css('padding-top', 0);\n      if (this.options.size === false) return;\n\n      var that = this,\n          $menu = this.$menu,\n          $menuInner = this.$menuInner,\n          $window = $(window),\n          selectHeight = this.$newElement[0].offsetHeight,\n          selectWidth = this.$newElement[0].offsetWidth,\n          liHeight = this.sizeInfo['liHeight'],\n          headerHeight = this.sizeInfo['headerHeight'],\n          searchHeight = this.sizeInfo['searchHeight'],\n          actionsHeight = this.sizeInfo['actionsHeight'],\n          doneButtonHeight = this.sizeInfo['doneButtonHeight'],\n          divHeight = this.sizeInfo['dividerHeight'],\n          menuPadding = this.sizeInfo['menuPadding'],\n          menuExtras = this.sizeInfo['menuExtras'],\n          notDisabled = this.options.hideDisabled ? '.disabled' : '',\n          menuHeight,\n          menuWidth,\n          getHeight,\n          getWidth,\n          selectOffsetTop,\n          selectOffsetBot,\n          selectOffsetLeft,\n          selectOffsetRight,\n          getPos = function() {\n            var pos = that.$newElement.offset(),\n                $container = $(that.options.container),\n                containerPos;\n\n            if (that.options.container && !$container.is('body')) {\n              containerPos = $container.offset();\n              containerPos.top += parseInt($container.css('borderTopWidth'));\n              containerPos.left += parseInt($container.css('borderLeftWidth'));\n            } else {\n              containerPos = { top: 0, left: 0 };\n            }\n\n            var winPad = that.options.windowPadding;\n            selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();\n            selectOffsetBot = $window.height() - selectOffsetTop - selectHeight - containerPos.top - winPad[2];\n            selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();\n            selectOffsetRight = $window.width() - selectOffsetLeft - selectWidth - containerPos.left - winPad[1];\n            selectOffsetTop -= winPad[0];\n            selectOffsetLeft -= winPad[3];\n          };\n\n      getPos();\n\n      if (this.options.size === 'auto') {\n        var getSize = function () {\n          var minHeight,\n              hasClass = function (className, include) {\n                return function (element) {\n                    if (include) {\n                        return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));\n                    } else {\n                        return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));\n                    }\n                };\n              },\n              lis = that.$menuInner[0].getElementsByTagName('li'),\n              lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),\n              optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');\n\n          getPos();\n          menuHeight = selectOffsetBot - menuExtras.vert;\n          menuWidth = selectOffsetRight - menuExtras.horiz;\n\n          if (that.options.container) {\n            if (!$menu.data('height')) $menu.data('height', $menu.height());\n            getHeight = $menu.data('height');\n\n            if (!$menu.data('width')) $menu.data('width', $menu.width());\n            getWidth = $menu.data('width');\n          } else {\n            getHeight = $menu.height();\n            getWidth = $menu.width();\n          }\n\n          if (that.options.dropupAuto) {\n            that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);\n          }\n\n          if (that.$newElement.hasClass('dropup')) {\n            menuHeight = selectOffsetTop - menuExtras.vert;\n          }\n\n          if (that.options.dropdownAlignRight === 'auto') {\n            $menu.toggleClass('dropdown-menu-right', selectOffsetLeft > selectOffsetRight && (menuWidth - menuExtras.horiz) < (getWidth - selectWidth));\n          }\n\n          if ((lisVisible.length + optGroup.length) > 3) {\n            minHeight = liHeight * 3 + menuExtras.vert - 2;\n          } else {\n            minHeight = 0;\n          }\n\n          $menu.css({\n            'max-height': menuHeight + 'px',\n            'overflow': 'hidden',\n            'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'\n          });\n          $menuInner.css({\n            'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert + 'px',\n            'overflow-y': 'auto',\n            'min-height': Math.max(minHeight - menuPadding.vert, 0) + 'px'\n          });\n        };\n        getSize();\n        this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);\n        $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);\n      } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {\n        var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),\n            divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;\n        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;\n\n        if (that.options.container) {\n          if (!$menu.data('height')) $menu.data('height', $menu.height());\n          getHeight = $menu.data('height');\n        } else {\n          getHeight = $menu.height();\n        }\n\n        if (that.options.dropupAuto) {\n          //noinspection JSUnusedAssignment\n          this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);\n        }\n        $menu.css({\n          'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',\n          'overflow': 'hidden',\n          'min-height': ''\n        });\n        $menuInner.css({\n          'max-height': menuHeight - menuPadding.vert + 'px',\n          'overflow-y': 'auto',\n          'min-height': ''\n        });\n      }\n    },\n\n    setWidth: function () {\n      if (this.options.width === 'auto') {\n        this.$menu.css('min-width', '0');\n\n        // Get correct width if element is hidden\n        var $selectClone = this.$menu.parent().clone().appendTo('body'),\n            $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,\n            ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),\n            btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();\n\n        $selectClone.remove();\n        $selectClone2.remove();\n\n        // Set width to whatever's larger, button title or longest option\n        this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');\n      } else if (this.options.width === 'fit') {\n        // Remove inline min-width so width can be changed from 'auto'\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', '').addClass('fit-width');\n      } else if (this.options.width) {\n        // Remove inline min-width so width can be changed from 'auto'\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', this.options.width);\n      } else {\n        // Remove inline min-width/width so width can be changed\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', '');\n      }\n      // Remove fit-width class if width is changed programmatically\n      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {\n        this.$newElement.removeClass('fit-width');\n      }\n    },\n\n    selectPosition: function () {\n      this.$bsContainer = $('<div class=\"bs-container\" />');\n\n      var that = this,\n          $container = $(this.options.container),\n          pos,\n          containerPos,\n          actualHeight,\n          getPlacement = function ($element) {\n            that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));\n            pos = $element.offset();\n\n            if (!$container.is('body')) {\n              containerPos = $container.offset();\n              containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();\n              containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();\n            } else {\n              containerPos = { top: 0, left: 0 };\n            }\n\n            actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;\n\n            that.$bsContainer.css({\n              'top': pos.top - containerPos.top + actualHeight,\n              'left': pos.left - containerPos.left,\n              'width': $element[0].offsetWidth\n            });\n          };\n\n      this.$button.on('click', function () {\n        var $this = $(this);\n\n        if (that.isDisabled()) {\n          return;\n        }\n\n        getPlacement(that.$newElement);\n\n        that.$bsContainer\n          .appendTo(that.options.container)\n          .toggleClass('open', !$this.hasClass('open'))\n          .append(that.$menu);\n      });\n\n      $(window).on('resize scroll', function () {\n        getPlacement(that.$newElement);\n      });\n\n      this.$element.on('hide.bs.select', function () {\n        that.$menu.data('height', that.$menu.height());\n        that.$bsContainer.detach();\n      });\n    },\n\n    /**\n     * @param {number} index - the index of the option that is being changed\n     * @param {boolean} selected - true if the option is being selected, false if being deselected\n     * @param {JQuery} $lis - the 'li' element that is being modified\n     */\n    setSelected: function (index, selected, $lis) {\n      if (!$lis) {\n        this.togglePlaceholder(); // check if setSelected is being called by changing the value of the select\n        $lis = this.findLis().eq(this.liObj[index]);\n      }\n\n      $lis.toggleClass('selected', selected).find('a').attr('aria-selected', selected);\n    },\n\n    /**\n     * @param {number} index - the index of the option that is being disabled\n     * @param {boolean} disabled - true if the option is being disabled, false if being enabled\n     * @param {JQuery} $lis - the 'li' element that is being modified\n     */\n    setDisabled: function (index, disabled, $lis) {\n      if (!$lis) {\n        $lis = this.findLis().eq(this.liObj[index]);\n      }\n\n      if (disabled) {\n        $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1).attr('aria-disabled', true);\n      } else {\n        $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0).attr('aria-disabled', false);\n      }\n    },\n\n    isDisabled: function () {\n      return this.$element[0].disabled;\n    },\n\n    checkDisabled: function () {\n      var that = this;\n\n      if (this.isDisabled()) {\n        this.$newElement.addClass('disabled');\n        this.$button.addClass('disabled').attr('tabindex', -1).attr('aria-disabled', true);\n      } else {\n        if (this.$button.hasClass('disabled')) {\n          this.$newElement.removeClass('disabled');\n          this.$button.removeClass('disabled').attr('aria-disabled', false);\n        }\n\n        if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {\n          this.$button.removeAttr('tabindex');\n        }\n      }\n\n      this.$button.click(function () {\n        return !that.isDisabled();\n      });\n    },\n\n    togglePlaceholder: function () {\n      var value = this.$element.val();\n      this.$button.toggleClass('bs-placeholder', value === null || value === '' || (value.constructor === Array && value.length === 0));\n    },\n\n    tabIndex: function () {\n      if (this.$element.data('tabindex') !== this.$element.attr('tabindex') && \n        (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) {\n        this.$element.data('tabindex', this.$element.attr('tabindex'));\n        this.$button.attr('tabindex', this.$element.data('tabindex'));\n      }\n\n      this.$element.attr('tabindex', -98);\n    },\n\n    clickListener: function () {\n      var that = this,\n          $document = $(document);\n\n      $document.data('spaceSelect', false);\n\n      this.$button.on('keyup', function (e) {\n        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {\n            e.preventDefault();\n            $document.data('spaceSelect', false);\n        }\n      });\n\n      this.$button.on('click', function () {\n        that.setSize();\n      });\n\n      this.$element.on('shown.bs.select', function () {\n        if (!that.options.liveSearch && !that.multiple) {\n          that.$menuInner.find('.selected a').focus();\n        } else if (!that.multiple) {\n          var selectedIndex = that.liObj[that.$element[0].selectedIndex];\n\n          if (typeof selectedIndex !== 'number' || that.options.size === false) return;\n\n          // scroll to selected option\n          var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;\n          offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2;\n          that.$menuInner[0].scrollTop = offset;\n        }\n      });\n\n      this.$menuInner.on('click', 'li a', function (e) {\n        var $this = $(this),\n            clickedIndex = $this.parent().data('originalIndex'),\n            prevValue = that.$element.val(),\n            prevIndex = that.$element.prop('selectedIndex'),\n            triggerChange = true;\n\n        // Don't close on multi choice menu\n        if (that.multiple && that.options.maxOptions !== 1) {\n          e.stopPropagation();\n        }\n\n        e.preventDefault();\n\n        //Don't run if we have been disabled\n        if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {\n          var $options = that.$element.find('option'),\n              $option = $options.eq(clickedIndex),\n              state = $option.prop('selected'),\n              $optgroup = $option.parent('optgroup'),\n              maxOptions = that.options.maxOptions,\n              maxOptionsGrp = $optgroup.data('maxOptions') || false;\n\n          if (!that.multiple) { // Deselect all others if not multi select box\n            $options.prop('selected', false);\n            $option.prop('selected', true);\n            that.$menuInner.find('.selected').removeClass('selected').find('a').attr('aria-selected', false);\n            that.setSelected(clickedIndex, true);\n          } else { // Toggle the one we have chosen if we are multi select.\n            $option.prop('selected', !state);\n            that.setSelected(clickedIndex, !state);\n            $this.blur();\n\n            if (maxOptions !== false || maxOptionsGrp !== false) {\n              var maxReached = maxOptions < $options.filter(':selected').length,\n                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;\n\n              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {\n                if (maxOptions && maxOptions == 1) {\n                  $options.prop('selected', false);\n                  $option.prop('selected', true);\n                  that.$menuInner.find('.selected').removeClass('selected');\n                  that.setSelected(clickedIndex, true);\n                } else if (maxOptionsGrp && maxOptionsGrp == 1) {\n                  $optgroup.find('option:selected').prop('selected', false);\n                  $option.prop('selected', true);\n                  var optgroupID = $this.parent().data('optgroup');\n                  that.$menuInner.find('[data-optgroup=\"' + optgroupID + '\"]').removeClass('selected');\n                  that.setSelected(clickedIndex, true);\n                } else {\n                  var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,\n                      maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,\n                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),\n                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),\n                      $notify = $('<div class=\"notify\"></div>');\n                  // If {var} is set in array, replace it\n                  /** @deprecated */\n                  if (maxOptionsArr[2]) {\n                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);\n                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);\n                  }\n\n                  $option.prop('selected', false);\n\n                  that.$menu.append($notify);\n\n                  if (maxOptions && maxReached) {\n                    $notify.append($('<div>' + maxTxt + '</div>'));\n                    triggerChange = false;\n                    that.$element.trigger('maxReached.bs.select');\n                  }\n\n                  if (maxOptionsGrp && maxReachedGrp) {\n                    $notify.append($('<div>' + maxTxtGrp + '</div>'));\n                    triggerChange = false;\n                    that.$element.trigger('maxReachedGrp.bs.select');\n                  }\n\n                  setTimeout(function () {\n                    that.setSelected(clickedIndex, false);\n                  }, 10);\n\n                  $notify.delay(750).fadeOut(300, function () {\n                    $(this).remove();\n                  });\n                }\n              }\n            }\n          }\n\n          if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {\n            that.$button.focus();\n          } else if (that.options.liveSearch) {\n            that.$searchbox.focus();\n          }\n\n          // Trigger select 'change'\n          if (triggerChange) {\n            if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {\n              // $option.prop('selected') is current option state (selected/unselected). state is previous option state.\n              changed_arguments = [clickedIndex, $option.prop('selected'), state];\n              that.$element\n                .triggerNative('change');\n            }\n          }\n        }\n      });\n\n      this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {\n        if (e.currentTarget == this) {\n          e.preventDefault();\n          e.stopPropagation();\n          if (that.options.liveSearch && !$(e.target).hasClass('close')) {\n            that.$searchbox.focus();\n          } else {\n            that.$button.focus();\n          }\n        }\n      });\n\n      this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        if (that.options.liveSearch) {\n          that.$searchbox.focus();\n        } else {\n          that.$button.focus();\n        }\n      });\n\n      this.$menu.on('click', '.popover-title .close', function () {\n        that.$button.click();\n      });\n\n      this.$searchbox.on('click', function (e) {\n        e.stopPropagation();\n      });\n\n      this.$menu.on('click', '.actions-btn', function (e) {\n        if (that.options.liveSearch) {\n          that.$searchbox.focus();\n        } else {\n          that.$button.focus();\n        }\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        if ($(this).hasClass('bs-select-all')) {\n          that.selectAll();\n        } else {\n          that.deselectAll();\n        }\n      });\n\n      this.$element.change(function () {\n        that.render(false);\n        that.$element.trigger('changed.bs.select', changed_arguments);\n        changed_arguments = null;\n      });\n    },\n\n    liveSearchListener: function () {\n      var that = this,\n          $no_results = $('<li class=\"no-results\"></li>');\n\n      this.$button.on('click.dropdown.data-api', function () {\n        that.$menuInner.find('.active').removeClass('active');\n        if (!!that.$searchbox.val()) {\n          that.$searchbox.val('');\n          that.$lis.not('.is-hidden').removeClass('hidden');\n          if (!!$no_results.parent().length) $no_results.remove();\n        }\n        if (!that.multiple) that.$menuInner.find('.selected').addClass('active');\n        setTimeout(function () {\n          that.$searchbox.focus();\n        }, 10);\n      });\n\n      this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {\n        e.stopPropagation();\n      });\n\n      this.$searchbox.on('input propertychange', function () {\n        that.$lis.not('.is-hidden').removeClass('hidden');\n        that.$lis.filter('.active').removeClass('active');\n        $no_results.remove();\n\n        if (that.$searchbox.val()) {\n          var $searchBase = that.$lis.not('.is-hidden, .divider, .dropdown-header'),\n              $hideItems;\n          if (that.options.liveSearchNormalize) {\n            $hideItems = $searchBase.find('a').not(':a' + that._searchStyle() + '(\"' + normalizeToBase(that.$searchbox.val()) + '\")');\n          } else {\n            $hideItems = $searchBase.find('a').not(':' + that._searchStyle() + '(\"' + that.$searchbox.val() + '\")');\n          }\n\n          if ($hideItems.length === $searchBase.length) {\n            $no_results.html(that.options.noneResultsText.replace('{0}', '\"' + htmlEscape(that.$searchbox.val()) + '\"'));\n            that.$menuInner.append($no_results);\n            that.$lis.addClass('hidden');\n          } else {\n            $hideItems.parent().addClass('hidden');\n\n            var $lisVisible = that.$lis.not('.hidden'),\n                $foundDiv;\n\n            // hide divider if first or last visible, or if followed by another divider\n            $lisVisible.each(function (index) {\n              var $this = $(this);\n\n              if ($this.hasClass('divider')) {\n                if ($foundDiv === undefined) {\n                  $this.addClass('hidden');\n                } else {\n                  if ($foundDiv) $foundDiv.addClass('hidden');\n                  $foundDiv = $this;\n                }\n              } else if ($this.hasClass('dropdown-header') && $lisVisible.eq(index + 1).data('optgroup') !== $this.data('optgroup')) {\n                $this.addClass('hidden');\n              } else {\n                $foundDiv = null;\n              }\n            });\n            if ($foundDiv) $foundDiv.addClass('hidden');\n\n            $searchBase.not('.hidden').first().addClass('active');\n          }\n        }\n      });\n    },\n\n    _searchStyle: function () {\n      var styles = {\n        begins: 'ibegins',\n        startsWith: 'ibegins'\n      };\n\n      return styles[this.options.liveSearchStyle] || 'icontains';\n    },\n\n    val: function (value) {\n      if (typeof value !== 'undefined') {\n        this.$element.val(value);\n        this.render();\n\n        return this.$element;\n      } else {\n        return this.$element.val();\n      }\n    },\n\n    changeAll: function (status) {\n      if (!this.multiple) return;\n      if (typeof status === 'undefined') status = true;\n\n      this.findLis();\n\n      var $options = this.$element.find('option'),\n          $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden'),\n          lisVisLen = $lisVisible.length,\n          selectedOptions = [];\n          \n      if (status) {\n        if ($lisVisible.filter('.selected').length === $lisVisible.length) return;\n      } else {\n        if ($lisVisible.filter('.selected').length === 0) return;\n      }\n          \n      $lisVisible.toggleClass('selected', status);\n\n      for (var i = 0; i < lisVisLen; i++) {\n        var origIndex = $lisVisible[i].getAttribute('data-original-index');\n        selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0];\n      }\n\n      $(selectedOptions).prop('selected', status);\n\n      this.render(false);\n\n      this.togglePlaceholder();\n\n      this.$element\n        .triggerNative('change');\n    },\n\n    selectAll: function () {\n      return this.changeAll(true);\n    },\n\n    deselectAll: function () {\n      return this.changeAll(false);\n    },\n\n    toggle: function (e) {\n      e = e || window.event;\n\n      if (e) e.stopPropagation();\n\n      this.$button.trigger('click');\n    },\n\n    keydown: function (e) {\n      var $this = $(this),\n          $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),\n          $items,\n          that = $parent.data('this'),\n          index,\n          next,\n          first,\n          last,\n          prev,\n          nextPrev,\n          prevIndex,\n          isActive,\n          selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',\n          keyCodeMap = {\n            32: ' ',\n            48: '0',\n            49: '1',\n            50: '2',\n            51: '3',\n            52: '4',\n            53: '5',\n            54: '6',\n            55: '7',\n            56: '8',\n            57: '9',\n            59: ';',\n            65: 'a',\n            66: 'b',\n            67: 'c',\n            68: 'd',\n            69: 'e',\n            70: 'f',\n            71: 'g',\n            72: 'h',\n            73: 'i',\n            74: 'j',\n            75: 'k',\n            76: 'l',\n            77: 'm',\n            78: 'n',\n            79: 'o',\n            80: 'p',\n            81: 'q',\n            82: 'r',\n            83: 's',\n            84: 't',\n            85: 'u',\n            86: 'v',\n            87: 'w',\n            88: 'x',\n            89: 'y',\n            90: 'z',\n            96: '0',\n            97: '1',\n            98: '2',\n            99: '3',\n            100: '4',\n            101: '5',\n            102: '6',\n            103: '7',\n            104: '8',\n            105: '9'\n          };\n\n      if (that.options.liveSearch) $parent = $this.parent().parent();\n\n      if (that.options.container) $parent = that.$menu;\n\n      $items = $('[role=\"listbox\"] li', $parent);\n\n      isActive = that.$newElement.hasClass('open');\n\n      if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) {\n        if (!that.options.container) {\n          that.setSize();\n          that.$menu.parent().addClass('open');\n          isActive = true;\n        } else {\n          that.$button.trigger('click');\n        }\n        that.$searchbox.focus();\n        return;\n      }\n\n      if (that.options.liveSearch) {\n        if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive) {\n          e.preventDefault();\n          e.stopPropagation();\n          that.$menuInner.click();\n          that.$button.focus();\n        }\n        // $items contains li elements when liveSearch is enabled\n        $items = $('[role=\"listbox\"] li' + selector, $parent);\n        if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {\n          if ($items.filter('.active').length === 0) {\n            $items = that.$menuInner.find('li');\n            if (that.options.liveSearchNormalize) {\n              $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');\n            } else {\n              $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');\n            }\n          }\n        }\n      }\n\n      if (!$items.length) return;\n\n      if (/(38|40)/.test(e.keyCode.toString(10))) {\n        index = $items.index($items.find('a').filter(':focus').parent());\n        first = $items.filter(selector).first().index();\n        last = $items.filter(selector).last().index();\n        next = $items.eq(index).nextAll(selector).eq(0).index();\n        prev = $items.eq(index).prevAll(selector).eq(0).index();\n        nextPrev = $items.eq(next).prevAll(selector).eq(0).index();\n\n        if (that.options.liveSearch) {\n          $items.each(function (i) {\n            if (!$(this).hasClass('disabled')) {\n              $(this).data('index', i);\n            }\n          });\n          index = $items.index($items.filter('.active'));\n          first = $items.first().data('index');\n          last = $items.last().data('index');\n          next = $items.eq(index).nextAll().eq(0).data('index');\n          prev = $items.eq(index).prevAll().eq(0).data('index');\n          nextPrev = $items.eq(next).prevAll().eq(0).data('index');\n        }\n\n        prevIndex = $this.data('prevIndex');\n\n        if (e.keyCode == 38) {\n          if (that.options.liveSearch) index--;\n          if (index != nextPrev && index > prev) index = prev;\n          if (index < first) index = first;\n          if (index == prevIndex) index = last;\n        } else if (e.keyCode == 40) {\n          if (that.options.liveSearch) index++;\n          if (index == -1) index = 0;\n          if (index != nextPrev && index < next) index = next;\n          if (index > last) index = last;\n          if (index == prevIndex) index = first;\n        }\n\n        $this.data('prevIndex', index);\n\n        if (!that.options.liveSearch) {\n          $items.eq(index).children('a').focus();\n        } else {\n          e.preventDefault();\n          if (!$this.hasClass('dropdown-toggle')) {\n            $items.removeClass('active').eq(index).addClass('active').children('a').focus();\n            $this.focus();\n          }\n        }\n\n      } else if (!$this.is('input')) {\n        var keyIndex = [],\n            count,\n            prevKey;\n\n        $items.each(function () {\n          if (!$(this).hasClass('disabled')) {\n            if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {\n              keyIndex.push($(this).index());\n            }\n          }\n        });\n\n        count = $(document).data('keycount');\n        count++;\n        $(document).data('keycount', count);\n\n        prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);\n\n        if (prevKey != keyCodeMap[e.keyCode]) {\n          count = 1;\n          $(document).data('keycount', count);\n        } else if (count >= keyIndex.length) {\n          $(document).data('keycount', 0);\n          if (count > keyIndex.length) count = 1;\n        }\n\n        $items.eq(keyIndex[count - 1]).children('a').focus();\n      }\n\n      // Select focused option if \"Enter\", \"Spacebar\" or \"Tab\" (when selectOnTab is true) are pressed inside the menu.\n      if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {\n        if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();\n        if (!that.options.liveSearch) {\n          var elem = $(':focus');\n          elem.click();\n          // Bring back focus for multiselects\n          elem.focus();\n          // Prevent screen from scrolling if the user hit the spacebar\n          e.preventDefault();\n          // Fixes spacebar selection of dropdown items in FF & IE\n          $(document).data('spaceSelect', true);\n        } else if (!/(32)/.test(e.keyCode.toString(10))) {\n          that.$menuInner.find('.active a').click();\n          $this.focus();\n        }\n        $(document).data('keycount', 0);\n      }\n\n      if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {\n        that.$menu.parent().removeClass('open');\n        if (that.options.container) that.$newElement.removeClass('open');\n        that.$button.focus();\n      }\n    },\n\n    mobile: function () {\n      this.$element.addClass('mobile-device');\n    },\n\n    refresh: function () {\n      this.$lis = null;\n      this.liObj = {};\n      this.reloadLi();\n      this.render();\n      this.checkDisabled();\n      this.liHeight(true);\n      this.setStyle();\n      this.setWidth();\n      if (this.$lis) this.$searchbox.trigger('propertychange');\n\n      this.$element.trigger('refreshed.bs.select');\n    },\n\n    hide: function () {\n      this.$newElement.hide();\n    },\n\n    show: function () {\n      this.$newElement.show();\n    },\n\n    remove: function () {\n      this.$newElement.remove();\n      this.$element.remove();\n    },\n\n    destroy: function () {\n      this.$newElement.before(this.$element).remove();\n\n      if (this.$bsContainer) {\n        this.$bsContainer.remove();\n      } else {\n        this.$menu.remove();\n      }\n\n      this.$element\n        .off('.bs.select')\n        .removeData('selectpicker')\n        .removeClass('bs-select-hidden selectpicker');\n    }\n  };\n\n  // SELECTPICKER PLUGIN DEFINITION\n  // ==============================\n  function Plugin(option) {\n    // get the args of the outer function..\n    var args = arguments;\n    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them\n    // to get lost/corrupted in android 2.3 and IE9 #715 #775\n    var _option = option;\n\n    [].shift.apply(args);\n\n    var value;\n    var chain = this.each(function () {\n      var $this = $(this);\n      if ($this.is('select')) {\n        var data = $this.data('selectpicker'),\n            options = typeof _option == 'object' && _option;\n\n        if (!data) {\n          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);\n          config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template);\n          $this.data('selectpicker', (data = new Selectpicker(this, config)));\n        } else if (options) {\n          for (var i in options) {\n            if (options.hasOwnProperty(i)) {\n              data.options[i] = options[i];\n            }\n          }\n        }\n\n        if (typeof _option == 'string') {\n          if (data[_option] instanceof Function) {\n            value = data[_option].apply(data, args);\n          } else {\n            value = data.options[_option];\n          }\n        }\n      }\n    });\n\n    if (typeof value !== 'undefined') {\n      //noinspection JSUnusedAssignment\n      return value;\n    } else {\n      return chain;\n    }\n  }\n\n  var old = $.fn.selectpicker;\n  $.fn.selectpicker = Plugin;\n  $.fn.selectpicker.Constructor = Selectpicker;\n\n  // SELECTPICKER NO CONFLICT\n  // ========================\n  $.fn.selectpicker.noConflict = function () {\n    $.fn.selectpicker = old;\n    return this;\n  };\n\n  $(document)\n      .data('keycount', 0)\n      .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=\"listbox\"], .bs-searchbox input', Selectpicker.prototype.keydown)\n      .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=\"listbox\"], .bs-searchbox input', function (e) {\n        e.stopPropagation();\n      });\n\n  // SELECTPICKER DATA-API\n  // =====================\n  $(window).on('load.bs.select.data-api', function () {\n    $('.selectpicker').each(function () {\n      var $selectpicker = $(this);\n      Plugin.call($selectpicker, $selectpicker.data());\n    })\n  });\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-ar_AR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n/*!\n * Translated default messages for bootstrap-select.\n * Locale: AR (Arabic)\n * Author: Yasser Lotfy <y_l@alive.com>\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'لم يتم إختيار شئ',\n    noneResultsText: 'لا توجد نتائج مطابقة لـ {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} خيار تم إختياره\" : \"{0} خيارات تمت إختيارها\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'تخطى الحد المسموح ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح ({n} خيارات بحد أقصى)',\n        (numGroup == 1) ? 'تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)'\n      ];\n    },\n    selectAllText: 'إختيار الجميع',\n    deselectAllText: 'إلغاء إختيار الجميع',\n    multipleSeparator: '، '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-bg_BG.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Нищо избрано',\n    noneResultsText: 'Няма резултат за {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} избран елемент\" : \"{0} избрани елемента\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',\n        (numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'\n      ];\n    },\n    selectAllText: 'Избери всички',\n    deselectAllText: 'Размаркирай всички',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-cro_CRO.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Odaberite stavku',\n    noneResultsText: 'Nema rezultata pretrage {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} stavka selektirana\" : \"{0} stavke selektirane\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit je postignut ({n} stvar maximalno)' : 'Limit je postignut ({n} stavke maksimalno)',\n        (numGroup == 1) ? 'Grupni limit je postignut ({n} stvar maksimalno)' : 'Grupni limit je postignut ({n} stavke maksimalno)'\n      ];\n    },\n    selectAllText: 'Selektiraj sve',\n    deselectAllText: 'Deselektiraj sve',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-cs_CZ.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nic není vybráno',\n    noneResultsText: 'Žádné výsledky {0}',\n    countSelectedText: 'Označeno {0} z {1}',\n    maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-da_DK.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Intet valgt',\n    noneResultsText: 'Ingen resultater fundet {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} valgt\" : \"{0} valgt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',\n        (numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'\n      ];\n    },\n    selectAllText: 'Markér alle',\n    deselectAllText: 'Afmarkér alle',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-de_DE.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Bitte wählen...',\n    noneResultsText: 'Keine Ergebnisse für {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} Element ausgewählt\" : \"{0} Elemente ausgewählt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit erreicht ({n} Element max.)' : 'Limit erreicht ({n} Elemente max.)',\n        (numGroup == 1) ? 'Gruppen-Limit erreicht ({n} Element max.)' : 'Gruppen-Limit erreicht ({n} Elemente max.)'\n      ];\n    },\n    selectAllText: 'Alles auswählen',\n    deselectAllText: 'Nichts auswählen',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-en_US.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nothing selected',\n    noneResultsText: 'No results match {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} item selected\" : \"{0} items selected\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\n      ];\n    },\n    selectAllText: 'Select All',\n    deselectAllText: 'Deselect All',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-es_CL.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'No hay selección',\n    noneResultsText: 'No hay resultados {0}',\n    countSelectedText: 'Seleccionados {0} de {1}',\n    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleccionar Todos',\n    deselectAllText: 'Desmarcar Todos'\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-es_ES.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'No hay selección',\n    noneResultsText: 'No hay resultados {0}',\n    countSelectedText: 'Seleccionados {0} de {1}',\n    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleccionar Todos',\n    deselectAllText: 'Desmarcar Todos'\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-eu.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Hautapenik ez',\n    noneResultsText: 'Emaitzarik ez {0}',\n    countSelectedText: '{1}(e)tik {0} hautatuta',\n    maxOptionsText: ['Mugara iritsita ({n} {var} gehienez)', 'Taldearen mugara iritsita ({n} {var} gehienez)', ['elementu', 'elementu']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-fa_IR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n    $.fn.selectpicker.defaults = {\n        noneSelectedText: 'چیزی انتخاب نشده است',\n        noneResultsText: 'هیج مشابهی برای {0} پیدا نشد',\n        countSelectedText: \"{0} از {1} مورد انتخاب شده\",\n        maxOptionsText: ['بیشتر ممکن نیست {حداکثر {n} عدد}', 'بیشتر ممکن نیست {حداکثر {n} عدد}'],\n        selectAllText: 'انتخاب همه',\n        deselectAllText: 'انتخاب هیچ کدام',\n        multipleSeparator: ', '\n    };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-fi_FI.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ei valintoja',\n    noneResultsText: 'Ei hakutuloksia {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} valittu\" : \"{0} valitut\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Valintojen maksimimäärä ({n} saavutettu)' : 'Valintojen maksimimäärä ({n} saavutettu)',\n        (numGroup == 1) ? 'Ryhmän maksimimäärä ({n} saavutettu)' : 'Ryhmän maksimimäärä ({n} saavutettu)'\n      ];\n    },\n    selectAllText: 'Valitse kaikki',\n    deselectAllText: 'Poista kaikki',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-fr_FR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Aucune sélection',\n    noneResultsText: 'Aucun résultat pour {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected > 1) ? \"{0} éléments sélectionnés\" : \"{0} élément sélectionné\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll > 1) ? 'Limite atteinte ({n} éléments max)' : 'Limite atteinte ({n} élément max)',\n        (numGroup > 1) ? 'Limite du groupe atteinte ({n} éléments max)' : 'Limite du groupe atteinte ({n} élément max)'\n      ];\n    },\n    multipleSeparator: ', ',\n    selectAllText: 'Tout Sélectionner',\n    deselectAllText: 'Tout Dé-selectionner',\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-hu_HU.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Válasszon!',\n    noneResultsText: 'Nincs találat {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return '{0} elem kiválasztva';\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Legfeljebb {n} elem választható',\n        'A csoportban legfeljebb {n} elem választható'\n      ];\n    },\n    selectAllText: 'Mind',\n    deselectAllText: 'Egyik sem',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-id_ID.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Tidak ada yang dipilih',\n    noneResultsText: 'Tidak ada yang cocok {0}',\n    countSelectedText: '{0} terpilih',\n    maxOptionsText: ['Mencapai batas (maksimum {n})', 'Mencapai batas grup (maksimum {n})'],\n    selectAllText: 'Pilih Semua',\n    deselectAllText: 'Hapus Semua',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-it_IT.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nessuna selezione',\n    noneResultsText: 'Nessun risultato per {0}',\n    countSelectedText: function (numSelected, numTotal){\n      return (numSelected == 1) ? 'Selezionato {0} di {1}' : 'Selezionati {0} di {1}';\n    },\n    maxOptionsText: ['Limite raggiunto ({n} {var} max)', 'Limite del gruppo raggiunto ({n} {var} max)', ['elementi', 'elemento']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleziona Tutto',\n    deselectAllText: 'Deseleziona Tutto'\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-ko_KR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '항목을 선택해주세요',\n    noneResultsText: '{0} 검색 결과가 없습니다',\n    countSelectedText: function (numSelected, numTotal) {\n      return \"{0}개를 선택하였습니다\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        '{n}개까지 선택 가능합니다',\n        '해당 그룹은 {n}개까지 선택 가능합니다'\n      ];\n    },\n    selectAllText: '전체선택',\n    deselectAllText: '전체해제',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-lt_LT.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Niekas nepasirinkta',\n    noneResultsText: 'Niekas nesutapo su {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} elementas pasirinktas\" : \"{0} elementai(-ų) pasirinkta\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Pasiekta riba ({n} elementas daugiausiai)' : 'Riba pasiekta ({n} elementai(-ų) daugiausiai)',\n        (numGroup == 1) ? 'Grupės riba pasiekta ({n} elementas daugiausiai)' : 'Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)'\n      ];\n    },\n    selectAllText: 'Pasirinkti visus',\n    deselectAllText: 'Atmesti visus',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-nb_NO.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ingen valgt',\n    noneResultsText: 'Søket gir ingen treff {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} alternativ valgt\" : \"{0} alternativer valgt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Grense nådd (maks {n} valg)' : 'Grense nådd (maks {n} valg)',\n        (numGroup == 1) ? 'Grense for grupper nådd (maks {n} grupper)' : 'Grense for grupper nådd (maks {n} grupper)'\n      ];\n    },\n    selectAllText: 'Merk alle',\n    deselectAllText: 'Fjern alle',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-nl_NL.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Niets geselecteerd',\n    noneResultsText: 'Geen resultaten gevonden voor {0}',\n    countSelectedText: '{0} van {1} geselecteerd',\n    maxOptionsText: ['Limiet bereikt ({n} {var} max)', 'Groep limiet bereikt ({n} {var} max)', ['items', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-pl_PL.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nic nie zaznaczono',\n    noneResultsText: 'Brak wyników wyszukiwania {0}',\n    countSelectedText: 'Zaznaczono {0} z {1}',\n    maxOptionsText: ['Osiągnięto limit ({n} {var} max)', 'Limit grupy osiągnięty ({n} {var} max)', ['elementy', 'element']],\n    selectAll: 'Zaznacz wszystkie',\n    deselectAll: 'Odznacz wszystkie',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-pt_BR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nada selecionado',\n    noneResultsText: 'Nada encontrado contendo {0}',\n    countSelectedText: 'Selecionado {0} de {1}',\n    maxOptionsText: ['Limite excedido (máx. {n} {var})', 'Limite do grupo excedido (máx. {n} {var})', ['itens', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-pt_PT.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n$.fn.selectpicker.defaults = {\nnoneSelectedText: 'Nenhum seleccionado',\nnoneResultsText: 'Sem resultados contendo {0}',\ncountSelectedText: 'Selecionado {0} de {1}',\nmaxOptionsText: ['Limite ultrapassado (máx. {n} {var})', 'Limite de seleções ultrapassado (máx. {n} {var})', ['itens', 'item']],\nmultipleSeparator: ', '\n};\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-ro_RO.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nu a fost selectat nimic',\n    noneResultsText: 'Nu exista niciun rezultat {0}',\n    countSelectedText: '{0} din {1} selectat(e)',\n    maxOptionsText: ['Limita a fost atinsa ({n} {var} max)', 'Limita de grup a fost atinsa ({n} {var} max)', ['iteme', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-ru_RU.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ничего не выбрано',\n    noneResultsText: 'Совпадений не найдено {0}',\n    countSelectedText: 'Выбрано {0} из {1}',\n    maxOptionsText: ['Достигнут предел ({n} {var} максимум)', 'Достигнут предел в группе ({n} {var} максимум)', ['шт.', 'шт.']],\n    doneButtonText: 'Закрыть',\n    selectAllText: 'Выбрать все',\n    deselectAllText: 'Отменить все',    \n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-sk_SK.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Vyberte zo zoznamu',\n    noneResultsText: 'Pre výraz {0} neboli nájdené žiadne výsledky',\n    countSelectedText: 'Vybrané {0} z {1}',\n    maxOptionsText: ['Limit prekročený ({n} {var} max)', 'Limit skupiny prekročený ({n} {var} max)', ['položiek', 'položka']],\n    selectAllText: 'Vybrať všetky',\n    deselectAllText: 'Zrušiť výber',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-sl_SI.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nič izbranega',\n    noneResultsText: 'Ni zadetkov za {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      \"Število izbranih: {0}\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Omejitev dosežena (max. izbranih: {n})',\n        'Omejitev skupine dosežena (max. izbranih: {n})'\n      ];\n    },\n    selectAllText: 'Izberi vse',\n    deselectAllText: 'Počisti izbor',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-sv_SE.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Inget valt',\n    noneResultsText: 'Inget sökresultat matchar {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected === 1) ? \"{0} alternativ valt\" : \"{0} alternativ valda\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Gräns uppnåd (max {n} alternativ)',\n        'Gräns uppnåd (max {n} gruppalternativ)'\n      ];\n    },\n    selectAllText: 'Markera alla',\n    deselectAllText: 'Avmarkera alla',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-tr_TR.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Hiçbiri seçilmedi',\n    noneResultsText: 'Hiçbir sonuç bulunamadı {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} öğe seçildi\" : \"{0} öğe seçildi\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit aşıldı (maksimum {n} sayıda öğe )' : 'Limit aşıldı (maksimum {n} sayıda öğe)',\n        (numGroup == 1) ? 'Grup limiti aşıldı (maksimum {n} sayıda öğe)' : 'Grup limiti aşıldı (maksimum {n} sayıda öğe)'\n      ];\n    },\n    selectAllText: 'Tümünü Seç',\n    deselectAllText: 'Seçiniz',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-ua_UA.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Нічого не вибрано',\n    noneResultsText: 'Збігів не знайдено {0}',\n    countSelectedText: 'Вибрано {0} із {1}',\n    maxOptionsText: ['Досягнута межа ({n} {var} максимум)', 'Досягнута межа в групі ({n} {var} максимум)', ['items', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-zh_CN.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '没有选中任何项',\n    noneResultsText: '没有找到匹配项',\n    countSelectedText: '选中{1}中的{0}项',\n    maxOptionsText: ['超出限制 (最多选择{n}项)', '组选择超出限制(最多选择{n}组)'],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/dist/js/i18n/defaults-zh_TW.js",
    "content": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-select\n * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"jquery\"], function (a0) {\n      return (factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"jquery\"));\n  } else {\n    factory(root[\"jQuery\"]);\n  }\n}(this, function (jQuery) {\n\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '沒有選取任何項目',\n    noneResultsText: '沒有找到符合的結果',\n    countSelectedText: '已經選取{0}個項目',\n    maxOptionsText: ['超過限制 (最多選擇{n}項)', '超過限制(最多選擇{n}組)'],\n    selectAllText: '選取全部',\n    deselectAllText: '全部取消',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n\n\n}));\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/examples.md",
    "content": "# Basic examples\n\n---\n## Standard select boxes\n\n<div class=\"bs-docs-example\">\n  <p>Make this:</p>\n\n  <select>\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n\n  <p>Become this:</p>\n\n  <select class=\"selectpicker\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n<div id=\"optgroup\"></div>\n## Select boxes with optgroups\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <optgroup label=\"Picnic\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </optgroup>\n    <optgroup label=\"Camping\">\n      <option>Tent</option>\n      <option>Flashlight</option>\n      <option>Toilet Paper</option>\n    </optgroup>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <optgroup label=\"Picnic\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </optgroup>\n  <optgroup label=\"Camping\">\n    <option>Tent</option>\n    <option>Flashlight</option>\n    <option>Toilet Paper</option>\n  </optgroup>\n</select>\n```\n\n## Multiple select boxes\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" multiple>\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" multiple>\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n# Live search\n\n---\n\n## Live search\n\nYou can add a search input by passing `data-live-search=\"true\"` attribute:\n\n<div class=\"bs-docs-example no-code\">\n  <select class=\"selectpicker\" data-live-search=\"true\">\n    <option>Hot Dog, Fries and a Soda</option>\n    <option>Burger, Shake and a Smile</option>\n    <option>Sugar, Spice and all things nice</option>\n  </select>\n</div>\n\n## Key words\n\nAdd key words to options to improve their searchability using `data-tokens`.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" data-live-search=\"true\">\n    <option data-tokens=\"ketchup mustard\">Hot Dog, Fries and a Soda</option>\n    <option data-tokens=\"mustard\">Burger, Shake and a Smile</option>\n    <option data-tokens=\"frosting\">Sugar, Spice and all things nice</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" data-live-search=\"true\">\n  <option data-tokens=\"ketchup mustard\">Hot Dog, Fries and a Soda</option>\n  <option data-tokens=\"mustard\">Burger, Shake and a Smile</option>\n  <option data-tokens=\"frosting\">Sugar, Spice and all things nice</option>\n</select>\n```\n\n# Limit the number of selections\n\nLimit the number of options that can be selected via the `data-max-options` attribute. It also works for option groups. Customize the message displayed when the limit is reached with `maxOptionsText`.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" multiple data-max-options=\"2\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n\n  <select class=\"selectpicker\" multiple>\n    <optgroup label=\"Condiments\" data-max-options=\"2\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </optgroup>\n    <optgroup label=\"Breads\" data-max-options=\"2\">\n      <option>Plain</option>\n      <option>Steamed</option>\n      <option>Toasted</option>\n    </optgroup>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" multiple data-max-options=\"2\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n\n<select class=\"selectpicker\" multiple>\n  <optgroup label=\"Condiments\" data-max-options=\"2\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </optgroup>\n  <optgroup label=\"Breads\" data-max-options=\"2\">\n    <option>Plain</option>\n    <option>Steamed</option>\n    <option>Toasted</option>\n  </optgroup>\n</select>\n```\n\n# Custom button text\n\n---\n\n## Placeholder\n<p id=\"titleMultiples\"></p>\nUsing the `title` attribute will set the default placeholder text when nothing is selected. This works for both multiple and standard select boxes:\n\n<div class=\"bs-docs-example\">\n  <div class=\"form-group\">\n    <label>Multiple</label>\n    <select class=\"selectpicker\" multiple title=\"Choose one of the following...\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n\n  <div class=\"form-group\">\n    <label>Standard</label>\n    <select class=\"selectpicker\" title=\"Choose one of the following...\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n</div>\n\n```html\n<select class=\"selectpicker\" multiple title=\"Choose one of the following...\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n## Selected text\n\n<p id=\"title\"></p>\nSet the `title` attribute on individual options to display alternative text when the option is selected:\n\n<div class=\"bs-docs-example no-code\">\n  <select class=\"selectpicker\">\n    <option title=\"Combo 1\">Hot Dog, Fries and a Soda</option>\n    <option title=\"Combo 2\">Burger, Shake and a Smile</option>\n    <option title=\"Combo 3\">Sugar, Spice and all things nice</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <option title=\"Combo 1\">Hot Dog, Fries and a Soda</option>\n  <option title=\"Combo 2\">Burger, Shake and a Smile</option>\n  <option title=\"Combo 3\">Sugar, Spice and all things nice</option>\n</select>\n```\n## Selected text format\n\n<p id=\"titleMultiplesFormat\"></p>\nSpecify how the selection is displayed with the `data-selected-text-format` attribute on a multiple select.\n\nThe supported values are:\n\n* `values`: A comma delimited list of selected values (default)\n* `count`: If one item is selected, then the option value is shown. If more than one is selected then the number of selected items is displayed, e.g. `2 of 6 selected`\n* `count > x`: Where `x` is the number of items selected when the display format changes from `values` to `count`\n* `static`: Always show the select title (placeholder), regardless of selection\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" multiple data-selected-text-format=\"count\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" multiple data-selected-text-format=\"count\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" multiple data-selected-text-format=\"count > 3\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n    <option>Onions</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" multiple data-selected-text-format=\"count > 3\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n  <option>Onions</option>\n</select>\n```\n\n# Styling\n\n---\n\n## Button classes\n\nYou can set the button classes via the `data-style` attribute:\n\n<div class=\"bs-docs-example\">\n  <div class=\"form-group\">\n    <select class=\"selectpicker\" data-style=\"btn-primary\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n  <div class=\"form-group\">\n    <select class=\"selectpicker\" data-style=\"btn-info\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n  <div class=\"form-group\">\n    <select class=\"selectpicker\" data-style=\"btn-success\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n  <div class=\"form-group\">\n    <select class=\"selectpicker\" data-style=\"btn-warning\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n  <div class=\"form-group\">\n    <select class=\"selectpicker\" data-style=\"btn-danger\">\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </select>\n  </div>\n</div>\n\n```html\n<select class=\"selectpicker\" data-style=\"btn-primary\">\n  ...\n</select>\n\n<select class=\"selectpicker\" data-style=\"btn-info\">\n  ...\n</select>\n\n<select class=\"selectpicker\" data-style=\"btn-success\">\n  ...\n</select>\n\n<select class=\"selectpicker\" data-style=\"btn-warning\">\n  ...\n</select>\n\n<select class=\"selectpicker\" data-style=\"btn-danger\">\n  ...\n</select>\n```\n\n## Checkmark on selected option\n\nYou can also show the checkmark icon on standard select boxes with the `show-tick` class:\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker show-tick\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker show-tick\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n## Menu arrow\n\nThe Bootstrap menu arrow can be added with the `show-menu-arrow` class:\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker show-menu-arrow\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker show-menu-arrow\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n## Style individual options\n\n<p id=\"classes\"></p>\nClasses and styles added to options are transferred to the select box:\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <option>Mustard</option>\n    <option class=\"special\">Ketchup</option>\n    <option style=\"background: #5cb85c; color: #fff;\">Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <option>Mustard</option>\n  <option class=\"special\">Ketchup</option>\n  <option style=\"background: #5cb85c; color: #fff;\">Relish</option>\n</select>\n```\n\n```css\n.special {\n  font-weight: bold !important;\n  color: #fff !important;\n  background: #bc0000 !important;\n  text-transform: uppercase;\n}\n```\n\n## Width\n\n<p id=\"grid\"></p>\nWrap selects in grid columns, or any custom parent element, to easily enforce desired widths.\n\n<div class=\"bs-docs-example\">\n  <div class=\"row\">\n    <div class=\"col-xs-3\">\n      <div class=\"form-group\">\n        <select class=\"selectpicker form-control\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n        </select>\n      </div>\n    </div>\n    <div class=\"col-xs-9\">\n      <div class=\"form-group\">\n        <select class=\"selectpicker form-control\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n        </select>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-xs-4\">\n       <div class=\"form-group\">\n        <select class=\"selectpicker form-control\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n        </select>\n      </div>\n    </div>\n    <div class=\"col-xs-8\">\n       <div class=\"form-group\">\n        <select class=\"selectpicker form-control\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n        </select>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-xs-5\">\n      <div class=\"form-group\">\n        <select class=\"selectpicker form-control\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n        </select>\n      </div>\n    </div>\n    <div class=\"col-xs-7\">\n      <div class=\"form-group\">\n        <select class=\"selectpicker form-control\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n        </select>\n      </div>\n    </div>\n  </div>\n</div>\n\n```html\n<div class=\"row\">\n  <div class=\"col-xs-3\">\n    <div class=\"form-group\">\n      <select class=\"selectpicker form-control\">\n        <option>Mustard</option>\n        <option>Ketchup</option>\n        <option>Relish</option>\n      </select>\n    </div>\n  </div>\n</div>\n```\n\n<div id=\"data-width\"></div>\n\nAlternatively, use the `data-width` attribute to set the width of the select. Set `data-width` to `'auto'` to automatically adjust the width of the select to its widest option. `'fit'` automatically adjusts the width of the select to the width of its currently selected option. An exact value can also be specified, e.g., `300px` or `50%`.\n\n<div class=\"bs-docs-example\">\n  <div class=\"row\">\n    <div class=\"col-xs-12\">\n      <div class=\"form-group\">\n        <label>width: 'auto'</label>\n        <select class=\"selectpicker form-control\" data-width=\"auto\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n          <option>All of the above (and much, much more!)</option>\n        </select>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-xs-12\">\n      <div class=\"form-group\">\n        <label>width: 'fit'</label>\n        <select class=\"selectpicker form-control\" data-width=\"fit\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n          <option>All of the above (and much, much more!)</option>\n        </select>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-xs-12\">\n      <div class=\"form-group\">\n        <label>width: '100px'</label>\n        <select class=\"selectpicker form-control\" data-width=\"100px\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n          <option>All of the above (and much, much more!)</option>\n        </select>\n      </div>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-xs-12\">\n      <div class=\"form-group\">\n        <label>width: '75%'</label>\n        <select class=\"selectpicker form-control\" data-width=\"75%\">\n          <option>Mustard</option>\n          <option>Ketchup</option>\n          <option>Relish</option>\n          <option>All of the above (and much, much more!)</option>\n        </select>\n      </div>\n    </div>\n  </div>\n</div>\n\n```html\n<select class=\"selectpicker\" data-width=\"auto\">\n  ...\n</select>\n<select class=\"selectpicker\" data-width=\"fit\">\n  ...\n</select>\n<select class=\"selectpicker\" data-width=\"100px\">\n  ...\n</select>\n<select class=\"selectpicker\" data-width=\"75%\">\n  ...\n</select>\n```\n\n# Customize options\n\n---\n\n## Icons\n\nAdd an icon to an option or optgroup with the `data-icon` attribute:\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <option data-icon=\"glyphicon-glass\">Mustard</option>\n    <option data-icon=\"glyphicon-heart\">Ketchup</option>\n    <option data-icon=\"glyphicon-film\">Relish</option>\n    <option data-icon=\"glyphicon-home\">Mayonnaise</option>\n    <option data-icon=\"glyphicon-print\">Barbecue Sauce</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <option data-icon=\"glyphicon-heart\">Ketchup</option>\n</select>\n```\n\n## Custom content\n\nInsert custom HTML into the option with the `data-content` attribute:\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <option data-content=\"<span class='label label-warning'>Mustard</span>\">Mustard</option>\n    <option data-content=\"<span class='label label-danger label-important'>Ketchup</span>\">Ketchup</option>\n    <option data-content=\"<span class='label label-success'>Relish</span>\">Relish</option>\n    <option data-content=\"<span class='label label-info'>Mayonnaise</span>\">Mayonnaise</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <option data-content=\"<span class='label label-success'>Relish</span>\">Relish</option>\n</select>\n```\n\n## Subtext\nAdd subtext to an option or optgroup with the `data-subtext` attribute:\n\n<div class=\"bs-docs-example\">\n  <div class=\"form-group\">\n    <select class=\"selectpicker\">\n      <option data-subtext=\"French's\">Mustard</option>\n      <option data-subtext=\"Heinz\">Ketchup</option>\n      <option data-subtext=\"Sweet\">Relish</option>\n      <option data-subtext=\"Miracle Whip\">Mayonnaise</option>\n      <option data-divider=\"true\"></option>\n      <option data-subtext=\"Honey\">Barbecue Sauce</option>\n      <option data-subtext=\"Ranch\">Salad Dressing</option>\n      <option data-subtext=\"Sweet & Spicy\">Tabasco</option>\n      <option data-subtext=\"Chunky\">Salsa</option>\n    </select>\n  </div>\n\n  <div class=\"form-group\">\n    <select class=\"selectpicker\" data-show-subtext=\"true\">\n      <option data-subtext=\"French's\">Mustard</option>\n      <option data-subtext=\"Heinz\">Ketchup</option>\n      <option data-subtext=\"Sweet\">Relish</option>\n      <option data-subtext=\"Miracle Whip\">Mayonnaise</option>\n      <option data-divider=\"true\"></option>\n      <option data-subtext=\"Honey\">Barbecue Sauce</option>\n      <option data-subtext=\"Ranch\">Salad Dressing</option>\n      <option data-subtext=\"Sweet & Spicy\">Tabasco</option>\n      <option data-subtext=\"Chunky\">Salsa</option>\n    </select>\n    <span class=\"help-block\">With <code>showSubtext</code> set to true.</span>\n  </div>\n</div>\n\n```html\n<select class=\"selectpicker\" data-size=\"5\">\n  <option data-subtext=\"Heinz\">Ketchup</option>\n</select>\n```\n\n# Customize menu\n\n---\n\n## Menu size\n\nThe `size` option is set to `'auto'` by default. When `size` is set to `'auto'`, the menu always opens up to show as many items as the window will allow without being cut off. Set `size` to `false` to always show all items. The size of the menu can also be specifed using the `data-size` attribute.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n    <option>Mayonnaise</option>\n    <option>Barbecue Sauce</option>\n    <option>Salad Dressing</option>\n    <option>Tabasco</option>\n    <option>Salsa</option>\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n    <option>Mayonnaise</option>\n    <option>Barbecue Sauce</option>\n    <option>Salad Dressing</option>\n    <option>Tabasco</option>\n    <option>Salsa</option>\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n    <option>Mayonnaise</option>\n    <option>Barbecue Sauce</option>\n    <option>Salad Dressing</option>\n    <option>Tabasco</option>\n    <option>Salsa</option>\n  </select>\n</div>\n\n<p id=\"data-size\"></p>\nSpecify a number for `data-size` to choose the maximum number of items to show in the menu.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" data-size=\"5\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n    <option>Mayonnaise</option>\n    <option>Barbecue Sauce</option>\n    <option>Salad Dressing</option>\n    <option>Tabasco</option>\n    <option>Salsa</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" data-size=\"5\">\n  ...\n</select>\n```\n\n## Select/deselect all options\n\nAdds two buttons to the top of the menu - **Select All** & **Deselect All** with `data-actions-box=\"true\"`.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" multiple data-actions-box=\"true\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" multiple data-actions-box=\"true\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n## Divider\n\nAdd `data-divider=\"true\"` to an option to turn it into a divider.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n    <option>Mayonnaise</option>\n    <option data-divider=\"true\"></option>\n    <option>Barbecue Sauce</option>\n    <option>Salad Dressing</option>\n    <option>Tabasco</option>\n    <option>Salsa</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" data-size=\"5\">\n  <option data-divider=\"true\"></option>\n</select>\n```\n\n## Menu header\n\nAdd a header to the dropdown menu, e.g. `header: 'Select a condiment'` or `data-header=\"Select a condiment\"`\n\n<div class=\"bs-docs-example\">\n  <div class=\"row-fluid\">\n    <select class=\"selectpicker\" data-header=\"Select a condiment\">\n      <option data-subtext=\"French's\">Mustard</option>\n      <option data-subtext=\"Heinz\">Ketchup</option>\n      <option data-subtext=\"Sweet\">Relish</option>\n      <option data-subtext=\"Miracle Whip\">Mayonnaise</option>\n      <option data-divider=\"true\"></option>\n      <option data-subtext=\"Honey\">Barbecue Sauce</option>\n      <option data-subtext=\"Ranch\">Salad Dressing</option>\n      <option data-subtext=\"Sweet & Spicy\">Tabasco</option>\n      <option data-subtext=\"Chunky\">Salsa</option>\n    </select>\n  </div>\n</div>\n\n```html\n<select class=\"selectpicker\" data-header=\"Select a condiment\">\n  ...\n</select>\n```\n\n## Container\n\nAppend the select to a specific element, e.g. `container: 'body'` or `data-container=\".main-content\"`\n\n<div class=\"bs-docs-example\" style=\"overflow:hidden;\">\n  <div class=\"row-fluid\">\n    <select class=\"selectpicker\">\n      <option data-subtext=\"French's\">Mustard</option>\n      <option data-subtext=\"Heinz\">Ketchup</option>\n      <option data-subtext=\"Sweet\">Relish</option>\n      <option data-subtext=\"Miracle Whip\">Mayonnaise</option>\n      <option data-divider=\"true\"></option>\n      <option data-subtext=\"Honey\">Barbecue Sauce</option>\n      <option data-subtext=\"Ranch\">Salad Dressing</option>\n      <option data-subtext=\"Sweet & Spicy\">Tabasco</option>\n      <option data-subtext=\"Chunky\">Salsa</option>\n    </select>\n    <select class=\"selectpicker\" data-container=\"body\">\n      <option data-subtext=\"French's\">Mustard</option>\n      <option data-subtext=\"Heinz\">Ketchup</option>\n      <option data-subtext=\"Sweet\">Relish</option>\n      <option data-subtext=\"Miracle Whip\">Mayonnaise</option>\n      <option data-divider=\"true\"></option>\n      <option data-subtext=\"Honey\">Barbecue Sauce</option>\n      <option data-subtext=\"Ranch\">Salad Dressing</option>\n      <option data-subtext=\"Sweet & Spicy\">Tabasco</option>\n      <option data-subtext=\"Chunky\">Salsa</option>\n    </select>\n  </div>\n</div>\n\n```html\n<div style=\"overflow:hidden;\">\n  <select class=\"selectpicker\">\n    ...\n  </select>\n  <select class=\"selectpicker\" data-container=\"body\">\n    ...\n  </select>\n</div>\n```\n\n## Dropup menu\n\n`dropupAuto` is set to true by default, which automatically determines whether or not the menu should display above or below the select box. If `dropupAuto` is set to false, manually make the select a dropup menu by adding the `.dropup` class to the select.\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker dropup\">\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker dropup\">\n  ...\n</select>\n```\n\n# Disabled\n\n---\n\n## Disabled select box\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\" disabled>\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\" disabled>\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n## Disabled options\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker\">\n    <option>Mustard</option>\n    <option disabled>Ketchup</option>\n    <option>Relish</option>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker\">\n  <option>Mustard</option>\n  <option disabled>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\n## Disabled option groups\n\n<div class=\"bs-docs-example\">\n  <select class=\"selectpicker test\">\n    <optgroup label=\"Picnic\" disabled>\n      <option>Mustard</option>\n      <option>Ketchup</option>\n      <option>Relish</option>\n    </optgroup>\n    <optgroup label=\"Camping\">\n      <option>Tent</option>\n      <option>Flashlight</option>\n      <option>Toilet Paper</option>\n    </optgroup>\n  </select>\n</div>\n\n```html\n<select class=\"selectpicker test\">\n  <optgroup label=\"Picnic\" disabled>\n    <option>Mustard</option>\n    <option>Ketchup</option>\n    <option>Relish</option>\n  </optgroup>\n  <optgroup label=\"Camping\">\n    <option>Tent</option>\n    <option>Flashlight</option>\n    <option>Toilet Paper</option>\n  </optgroup>\n</select>\n```"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/index.md",
    "content": "# Getting Started\n\n---\n\n## Dependencies\n\nRequires jQuery v1.8.0+, Bootstrap’s dropdown.js component, and Bootstrap's CSS. If you're not already using Bootstrap in your project, a precompiled version of the minimum requirements can be downloaded [here](http://getbootstrap.com/customize/?id=7830063837006f6fc84f).\n\n## CDNJS\n\nThe folks at CDNJS host a copy of the library. The CDN is updated after the release is made public, which means there is a delay between the publishing of a release and its availability on the CDN, so keep that in mind. Just use these links:\n\n```html\n<!-- Latest compiled and minified CSS -->\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/css/bootstrap-select.min.css\">\n\n<!-- Latest compiled and minified JavaScript -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/bootstrap-select.min.js\"></script>\n\n<!-- (Optional) Latest compiled and minified JavaScript translation files -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/i18n/defaults-*.min.js\"></script>\n```\n\n## Install with Bower\n\nYou can also install bootstrap-select using [Bower](http://bower.io):\n\n```elixir\n$ bower install bootstrap-select\n```\n\n## Install with npm\n\nYou can also install bootstrap-select using [npm](https://www.npmjs.com/package/bootstrap-select):\n\n```elixir\n$ npm install bootstrap-select\n```\n\n## Install with NuGet\n\nYou can also install bootstrap-select using [NuGet](https://www.nuget.org/packages/bootstrap-select):\n\n```elixir\n$ Install-Package bootstrap-select\n```\n\n# Usage\n\n---\n\nCreate your `<select>` with the `.selectpicker` class. The data-api will automatically theme these elements.\n\n```html\n<select class=\"selectpicker\">\n  <option>Mustard</option>\n  <option>Ketchup</option>\n  <option>Relish</option>\n</select>\n```\n\nOptions can be passed via data attributes or JavaScript.\n\n```js\n$('.selectpicker').selectpicker({\n  style: 'btn-info',\n  size: 4\n});\n```\n\n# Used by\n\n---\n\n<div class=\"row logo-block\">\n\t<div class=\"logo-container\">\n\t\t<a href=\"https://snapappointments.com\" target=\"_blank\"><img src=\"img/logos/snapappointments.png\" alt=\"SnapAppointments\"></a>\n\t</div>\n\t<div class=\"logo-container\">\n\t\t<a href=\"https://www.thermofisher.com\" target=\"_blank\"><img src=\"img/logos/thermofisher.png\" alt=\"Thermo Fisher Scientific Inc.\"></a>\n\t</div>\n\t<div class=\"logo-container\">\n\t\t<a href=\"https://www.membermeister.com\" target=\"_blank\"><img src=\"img/logos/membermeister.png\" alt=\"membermeister\"></a>\n\t</div>\n\t<div class=\"logo-container\">\n\t\t<a href=\"https://solveforall.com\" target=\"_blank\"><img src=\"img/logos/solveforall.png\" alt=\"Solve for All\"></a>\n\t</div>\n\t<div class=\"logo-container\">\n\t\t<a href=\"http://www.123itworks.co.uk\" target=\"_blank\"><img src=\"img/logos/estimateit.png\" alt=\"EstiMATEit\"></a>\n\t</div>\n\t<div class=\"logo-container\">\n\t\t<a href=\"https://convertizer.com\" target=\"_blank\"><img src=\"img/logos/convertizer.png\" alt=\"Convertizer\"></a>\n\t</div>\n</div>\n\n<div class=\"text-muted\">Does your organization use bootstrap-select? Open an issue, and include a link and logo, and you'll be added to the list.</div>\n\n\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/methods.md",
    "content": "# Methods\n\nInterface with bootstrap-select.\n\n---\n\n#### `.selectpicker('val')`\n\nYou can set the selected value by calling the `val` method on the element.\n\n```js\n$('.selectpicker').selectpicker('val', 'Mustard');\n$('.selectpicker').selectpicker('val', ['Mustard','Relish']);\n```\n\nThis is different to calling `val()` directly on the `select` element. If you call `val()` on the element directly, the bootstrap-select ui will not refresh (as the change event only fires from user interaction). You will have to call the ui refresh method yourself.\n\n```js\n$('.selectpicker').val('Mustard');\n$('.selectpicker').selectpicker('render');\n\n// this is the equivalent of the above\n$('.selectpicker').selectpicker('val', 'Mustard');\n```\n\n---\n\n#### `.selectpicker('selectAll')`\n\nThis will select all items in a multi-select.\n\n```js\n$('.selectpicker').selectpicker('selectAll');\n```\n\n---\n\n#### `.selectpicker('deselectAll')`\n\nThis will deselect all items in a multi-select.\n\n```js\n$('.selectpicker').selectpicker('deselectAll');\n```\n\n---\n\n#### `.selectpicker('render')`\n\nYou can force a re-render of the bootstrap-select ui with the `render` method. This is useful if you programatically change any underlying values that affect the layout of the element.\n\n```js\n$('.selectpicker').selectpicker('render');\n```\n\n---\n\n#### `.selectpicker('mobile')`\n\nEnable mobile scrolling by calling `$('.selectpicker').selectpicker('mobile')`. This enables the device's native menu for select menus.\n\nThe method for detecting the browser is left up to the user.\n\n```js\nif( /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ) {\n  $('.selectpicker').selectpicker('mobile');\n}\n```\n\n---\n\n#### `.selectpicker('setStyle')`\n\nModify the class(es) associated with either the button itself or its container.\n\nIf changing the class on the container:\n\n```js\n$('.selectpicker').addClass('col-lg-12').selectpicker('setStyle');\n```\n\nIf changing the class(es) on the button (altering data-style):\n\n```js\n// Replace Class\n$('.selectpicker').selectpicker('setStyle', 'btn-danger');\n\n// Add Class\n$('.selectpicker').selectpicker('setStyle', 'btn-large', 'add');\n\n// Remove Class\n$('.selectpicker').selectpicker('setStyle', 'btn-large', 'remove');\n```\n\n\n---\n\n#### `.selectpicker('refresh')`\n\nTo programmatically update a select with JavaScript, first manipulate the select, then use the `refresh` method to \nupdate the UI to match the new state. This is necessary when removing or adding options, or when disabling/enabling a \nselect via JavaScript.\n\n```js\n$('.selectpicker').selectpicker('refresh');\n```\n\n<div class=\"bs-docs-example\">\n  <div class=\"form-group\">\n    <select class=\"selectpicker remove-example\">\n      <option value=\"Mustard\">Mustard</option>\n      <option value=\"Ketchup\">Ketchup</option>\n      <option value=\"Relish\">Relish</option>\n    </select>\n  </div>\n\n  <button class=\"btn btn-warning rm-mustard\">Remove Mustard</button>\n  <button class=\"btn btn-danger rm-ketchup\">Remove Ketchup</button>\n  <button class=\"btn btn-success rm-relish\">Remove Relish</button>\n</div>\n\n```html\n<select class=\"selectpicker remove-example\">\n  <option value=\"Mustard\">Mustard</option>\n  <option value=\"Ketchup\">Ketchup</option>\n  <option value=\"Relish\">Relish</option>\n</select>\n\n<button class=\"btn btn-warning rm-mustard\">Remove Mustard</button>\n<button class=\"btn btn-danger rm-ketchup\">Remove Ketchup</button>\n<button class=\"btn btn-success rm-relish\">Remove Relish</button>\n```\n```js\n$('.rm-mustard').click(function () {\n  $('.remove-example').find('[value=Mustard]').remove();\n  $('.remove-example').selectpicker('refresh');\n});\n```\n\n<div class=\"bs-docs-example\">\n  <div class=\"form-group\">\n    <select class=\"selectpicker disable-example\">\n      <option value=\"Mustard\">Mustard</option>\n      <option value=\"Ketchup\">Ketchup</option>\n      <option value=\"Relish\">Relish</option>\n    </select>\n  </div>\n\n  <button class=\"btn btn-default ex-disable\"><i class=\"icon-remove\"></i> Disable</button>\n  <button class=\"btn btn-default ex-enable\"><i class=\"icon-ok\"></i> Enable</button>\n</div>\n\n```js\n$('.ex-disable').click(function () {\n  $('.disable-example').prop('disabled', true);\n  $('.disable-example').selectpicker('refresh');\n});\n\n$('.ex-enable').click(function () {\n  $('.disable-example').prop('disabled', false);\n  $('.disable-example').selectpicker('refresh');\n});\n```\n\n<script type=\"text/javascript\">\n  window.onload = function () {\n    var $re = $('.remove-example'),\n        $de = $('.disable-example');\n\n    $('.rm-mustard').click(function () {\n      $re.find('[value=Mustard]').remove();\n      $re.selectpicker('refresh');\n    });\n    $('.rm-ketchup').click(function () {\n      $re.find('[value=Ketchup]').remove();\n      $re.selectpicker('refresh');\n    });\n    $('.rm-relish').click(function () {\n      $re.find('[value=Relish]').remove();\n      $re.selectpicker('refresh');\n    });\n    $('.ex-disable').click(function () {\n      $de.prop('disabled', true);\n      $de.selectpicker('refresh');\n    });\n    $('.ex-enable').click(function () {\n      $de.prop('disabled', false);\n      $de.selectpicker('refresh');\n    });\n  };\n</script>\n\n---\n\n#### `.selectpicker('toggle')`\n\nProgrammatically toggles the bootstrap-select menu open/closed.\n\n```js\n$('.selectpicker').selectpicker('toggle');\n```\n\n---\n\n#### `.selectpicker('hide')`\n\nTo programmatically hide the bootstrap-select use the `hide` method (this only affects the visibility of the bootstrap-select itself).\n\n```js\n$('.selectpicker').selectpicker('hide');\n```\n\n---\n\n#### `.selectpicker('show')`\n\nTo programmatically show the bootstrap-select use the `show` method (this only affects the visibility of the bootstrap-select itself).\n\n```js\n$('.selectpicker').selectpicker('show');\n```\n\n---\n\n#### `.selectpicker('destroy')`\n\nTo programmatically destroy the bootstrap-select, use the `destroy` method.\n\n```js\n$('.selectpicker').selectpicker('destroy');\n```\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/options.md",
    "content": "# Core options\n\n---\n\nOptions can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`, as in \n`data-style=\"\"` or `data-selected-text-format=\"count\"`.\n\n<table class=\"table table-bordered table-striped\">\n  <thead>\n  <tr>\n    <th style=\"width: 15%;\">Name</th>\n    <th style=\"width: 32%;\">Type</th>\n    <th style=\"width: 10%;\">Default</th>\n    <th style=\"width: 43%;\">Description</th>\n  </tr>\n  </thead>\n  <tbody>\n  <tr>\n    <td>actionsBox</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to <code>true</code>, adds two buttons to the top of the dropdown menu (<strong>Select All</strong> &amp; <strong>Deselect All</strong>).</p>\n    </td>\n  </tr>\n  <tr>\n    <td>container</td>\n    <td>string | false</td>\n    <td><code>false</code></td>\n    <td>\n        <p>When set to a string, appends the select to a specific element or selector, e.g., \n        <code>container: 'body' | '.main-body'</code></p>\n    </td>\n  </tr>\n  <tr>\n    <td>countSelectedText</td>\n    <td>string | function</td>\n    <td><code>function</code></td>\n    <td>\n      <p>Sets the format for the text displayed when selectedTextFormat is <code>count</code> or <code>count > \n      #</code>. {0} is the selected amount. {1} is total available for selection.</p>\n      <p>When set to a function, the first parameter is the number of selected options, and the second is the total number of \n      options. The function must return a string.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>deselectAllText</td>\n    <td>string</td>\n    <td><code>'Deselect All'</code></td>\n    <td>\n      <p>The text on the button that deselects all options when <code>actionsBox</code> is enabled.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>dropdownAlignRight</td>\n    <td>boolean | <code>'auto'</code></td>\n    <td><code>false</code></td>\n    <td>\n      <p>Align the menu to the right instead of the left. If set to <code>'auto'</code>, the menu will automatically align right if there isn't room for the menu's full width when aligned to the left.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>dropupAuto</td>\n    <td>boolean</td>\n    <td><code>true</code></td>\n    <td>\n      <p>checks to see which has more room, above or below. If the dropup has enough room to fully open normally, but\n      there is more room above, the dropup still opens normally. Otherwise, it becomes a dropup. If dropupAuto is\n      set to false, dropups must be called manually.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>header</td>\n    <td>string</td>\n    <td><code>false</code></td>\n    <td>\n      <p>adds a header to the top of the menu; includes a close button by default</p>\n    </td>\n  </tr>\n  <tr>\n    <td>hideDisabled</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>removes disabled options and optgroups from the menu <code>data-hide-disabled: true</code></p>\n    </td>\n  </tr>\n  <tr>\n    <td>iconBase</td>\n    <td>string</td>\n    <td><code>'glyphicon'</code></td>\n    <td>\n      <p>Set the base to use a different icon font instead of Glyphicons. If changing iconBase, you might also want to change <code>tickIcon</code>, in case the new icon font uses a different naming scheme.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>liveSearch</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to <code>true</code>, adds a search box to the top of the selectpicker dropdown.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>liveSearchNormalize</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>Setting liveSearchNormalize to <code>true</code> allows for accent-insensitive searching.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>liveSearchPlaceholder</td>\n    <td>string</td>\n    <td><code>null</code></td>\n    <td>\n      <p>When set to a string, a placeholder attribute equal to the string will be added to the liveSearch input.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>liveSearchStyle</td>\n    <td>string</td>\n    <td><code>'contains'</code></td>\n    <td>\n      <p>When set to <code>'contains'</code>, searching will reveal options that contain the searched text. For example, searching for pl with return both Ap<b>pl</b>e, <b>Pl</b>um, and <b>Pl</b>antain. When set to <code>'startsWith'</code>, searching for pl will return only <b>Pl</b>um and <b>Pl</b>antain.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>maxOptions</td>\n    <td>integer | false</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to an integer and in a multi-select, the number of selected options cannot exceed the given value.</p>\n      <p>This option can also exist as a data-attribute for an <code>&lt;optgroup&gt;</code>, in which case it only \n      applies to that <code>&lt;optgroup&gt;</code>.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>maxOptionsText</td>\n    <td>string | array | function</td>\n    <td><code>function</code></td>\n    <td>\n      <p>The text that is displayed when maxOptions is enabled and the maximum number of options for the given scenario have been selected.</p>\n      <p>If a function is used, it must return an array. array[0] is the text used when maxOptions is applied to the entire select element. array[1] is the text used when maxOptions is used on an optgroup. If a string is used, the same text is used for both the element and the optgroup.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>mobile</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to <code>true</code>, enables the device's native menu for select menus.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>multipleSeparator</td>\n    <td>string</td>\n    <td><code>', '</code></td>\n    <td>\n      <p>Set the character displayed in the button that separates selected options.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>noneSelectedText</td>\n    <td>string</td>\n    <td><code>'Nothing selected'</code></td>\n    <td>\n      <p>The text that is displayed when a multiple select has no selected options.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>selectAllText</td>\n    <td>string</td>\n    <td><code>'Select All'</code></td>\n    <td>\n      <p>The text on the button that selects all options when <code>actionsBox</code> is enabled.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>selectedTextFormat</td>\n    <td><code>'values'</code> | <code>'static'</code> | <code>'count'</code> | <code>'count > x'</code> (where x is an integer)</td>\n    <td><code>'values'</code></td>\n    <td>\n      <p>Specifies how the selection is displayed with a multiple select.</p>\n      <p><code>'values'</code> displays a list of the selected options (separated by <code>multipleSeparator</code>. <code>'static'</code> simply displays the select element's title. <code>'count'</code> displays the total number of selected options. <code>'count > x'</code> behaves like <code>'values'</code> until the number of selected options is greater than x; after that, it behaves like <code>'count'</code>.\n    </td>\n  </tr>\n  <tr>\n    <td>selectOnTab</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to <code>true</code>, treats the tab character like the enter or space characters within the \n      selectpicker dropdown.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>showContent</td>\n    <td>boolean</td>\n    <td><code>true</code></td>\n    <td>\n      <p>When set to <code>true</code>, display custom HTML associated with selected option(s) in the button. When set \n       to <code>false</code>, the option value will be displayed instead.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>showIcon</td>\n    <td>boolean</td>\n    <td><code>true</code></td>\n    <td>\n      <p>When set to <code>true</code>, display icon(s) associated with selected option(s) in the button.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>showSubtext</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to <code>true</code>, display subtext associated with a selected option in the button.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>showTick</td>\n    <td>boolean</td>\n    <td><code>false</code></td>\n    <td>\n      <p>Show checkmark on selected option (for items without <code>multiple</code> attribute).</p>\n    </td>\n  </tr>\n  <tr>\n    <td>size</td>\n    <td><code>'auto'</code> | integer | false</td>\n    <td><code>'auto'</code></td>\n    <td>\n      <p>When set to <code>'auto'</code>, the menu always opens up to show as many items as the window will allow\n      without being cut off.</p>\n      <p>When set to an integer, the menu will show the given number of items, even if the dropdown is cut off.</p>\n      <p>When set to <code>false</code>, the menu will always show all items.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>string | null</td>\n    <td><code>null</code></td>\n    <td>\n      <p>When set to a string, add the value to the button's style.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>tickIcon</td>\n    <td>string</td>\n    <td><code>'glyphicon-ok'</code></td>\n    <td>\n      <p>Set which icon to use to display as the \"tick\" next to selected options.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>title</td>\n    <td>string | null</td>\n    <td><code>null</code></td>\n    <td>\n      <p>The default title for the selectpicker.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>width</td>\n    <td><code>'auto'</code> | <code>'fit'</code> | css-width | false (where <code>css-width</code> is a CSS width with units, e.g. <code>100px</code>)</td>\n    <td><code>false</code></td>\n    <td>\n      <p>When set to <code>auto</code>, the width of the selectpicker is automatically adjusted to accommodate the \n      widest option.</p>\n      <p>When set to a css-width, the width of the selectpicker is forced inline to the given value.</p>\n      <p>When set to <code>false</code>, all width information is removed.</p>\n    </td>\n  </tr>\n  <tr>\n    <td>windowPadding</td>\n    <td>integer | array</td>\n    <td><code>0</code></td>\n    <td>\n      <p>This is useful in cases where the window has areas that the dropdown menu should not cover - for instance a fixed header. When set to an integer, the same padding will be added to all sides. Alternatively, an array of integers can be used in the format <code>[top, right, bottom, left]</code>.</p>\n    </td>\n  </tr>\n  </tbody>\n</table>\n\n# Events\n\n---\n\nBootstrap-select exposes a few events for hooking into select functionality.\n\nhide.bs.select, hidden.bs.select, show.bs.select, and shown.bs.select all have a `relatedTarget` property, whose value is the toggling anchor element.\n\n<table class=\"table table-bordered table-striped\">\n  <thead>\n    <tr>\n      <th>Event Type</th>\n      <th>Description</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>show.bs.select</td>\n      <td>This event fires immediately when the show instance method is called.</td>\n    </tr>\n    <tr>\n      <td>shown.bs.select</td>\n      <td>This event is fired when the dropdown has been made visible to the user (will wait for CSS transitions, to complete).</td>\n    </tr>\n    <tr>\n      <td>hide.bs.select</td>\n      <td>This event is fired immediately when the hide instance method has been called.</td>\n    </tr>\n    <tr>\n      <td>hidden.bs.select</td>\n      <td>This event is fired when the dropdown has finished being hidden from the user (will wait for CSS transitions, to complete).</td>\n    </tr>\n    <tr>\n      <td>loaded.bs.select</td>\n      <td>This event fires after the select has been initialized.</td>\n    </tr>\n    <tr>\n      <td>rendered.bs.select</td>\n      <td>This event fires after the render instance has been called.</td>\n    </tr>\n    <tr>\n      <td>refreshed.bs.select</td>\n      <td>This event fires after the refresh instance has been called.</td>\n    </tr>\n    <tr>\n      <td>changed.bs.select</td>\n      <td>This event fires after the select's value has been changed. It passes through event, clickedIndex, newValue, oldValue.</td>\n    </tr>\n  </tbody>\n</table>\n\n```js\n$('#mySelect').on('hidden.bs.select', function (e) {\n  // do something...\n});\n```\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/playground/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n  <head>\n    <script data-require=\"jquery@2.2.0\" data-semver=\"2.2.0\" src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js\"></script>\n    <script src=\"plnkrOpener.js\"></script>\n  </head>\n\n  <body>\n  </body>\n\n</html>"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/playground/plnkrOpener.js",
    "content": "$(document).ready(function() {\n  function formPostData(url, fields) {\n    var form = $('<form style=\"display: none;\" method=\"post\" action=\"' + url + '\"></form>');\n    $.each(fields, function(name, value) {\n      var input = $('<input type=\"hidden\" name=\"' + name + '\">');\n      input.attr('value', value);\n      form.append(input);\n    });\n\n    $(document).find('body').append(form);\n\n    form[0].submit(function(e) {\n      e.preventDefault();\n    });\n\n    form.remove();\n  }\n  \n  function plnkrOpener() {\n    var ctrl = {};\n  \n    ctrl.example = {\n      path: ctrl.examplePath,\n      manifest: undefined,\n      files: undefined,\n      name: 'bootstrap-select example'\n    };\n  \n    ctrl.open = function() {\n      var postData = {\n        'tags[0]': 'jquery',\n        'tags[1]': 'bootstrap-select',\n        'private': true\n      };\n  \n      ctrl.example.files = [\n        {\n          name: 'index.html',\n          url: 'test.html',\n          content: ''\n        },\n        {\n          name: 'bootstrap-select.js',\n          url: 'https://raw.githubusercontent.com/silviomoreto/bootstrap-select/master/dist/js/bootstrap-select.js',\n          content: ''\n        },\n        {\n          name: 'bootstrap-select.css',\n          url: 'https://raw.githubusercontent.com/silviomoreto/bootstrap-select/master/dist/css/bootstrap-select.css',\n          content: ''\n        }\n      ]\n\n      function getData(file) {\n        return $.ajax({\n          method: 'GET',\n          url: file.url\n        })\n        .then(function(data) {\n          file.content = data;\n          postData['files[' + file.name + ']'] = file.content;\n        });\n      }\n\n      var files = [];\n\n      $.each(ctrl.example.files, function(i, file) {\n        files.push(getData(file));\n      });\n\n      function sendData() {\n        postData.description = ctrl.example.name;\n\n        formPostData('https://plnkr.co/edit/?p=preview', postData);\n      };\n\n      $.when.apply(this, files).done(function() {\n        sendData();\n      });\n    };\n    \n    return ctrl.open()\n  }\n\n  plnkrOpener();\n});"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/docs/playground/test.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title>Bootstrap-select test page</title>\n\n  <meta charset=\"utf-8\">\n\n  <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"bootstrap-select.css\">\n\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js\"></script>\n  <script src=\"bootstrap-select.js\"></script>\n</head>\n<body>\n\n<div class=\"container\">\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"basic\" class=\"col-lg-2 control-label\">\"Basic\" (liveSearch disabled)</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"basic\" class=\"selectpicker show-tick form-control\">\n          <option>cow</option>\n          <option data-subtext=\"option subtext\">bull</option>\n          <option class=\"get-class\" disabled>ox</option>\n          <optgroup label=\"test\" data-subtext=\"optgroup subtext\">\n            <option>ASD</option>\n            <option selected>Bla</option>\n            <option>Ble</option>\n          </optgroup>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"basic\" class=\"col-lg-2 control-label\">\"Basic\" (liveSearch enabled)</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"basic\" class=\"selectpicker show-tick form-control\" data-live-search=\"true\">\n          <option>cow</option>\n          <option data-subtext=\"option subtext\">bull</option>\n          <option class=\"get-class\" disabled>ox</option>\n          <optgroup label=\"test\" data-subtext=\"optgroup subtext\">\n            <option>ASD</option>\n            <option selected>Bla</option>\n            <option>Ble</option>\n          </optgroup>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"basic2\" class=\"col-lg-2 control-label\">\"Basic\" (multiple, maxOptions=1)</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"basic2\" class=\"show-tick form-control\" multiple>\n          <option>cow</option>\n          <option>bull</option>\n          <option class=\"get-class\" disabled>ox</option>\n          <optgroup label=\"test\" data-subtext=\"another test\">\n            <option>ASD</option>\n            <option selected>Bla</option>\n            <option>Ble</option>\n          </optgroup>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"maxOption2\" class=\"col-lg-2 control-label\">multiple, show-menu-arrow, maxOptions=2</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"maxOption2\" class=\"selectpicker show-menu-arrow form-control\" multiple data-max-options=\"2\">\n          <option>chicken</option>\n          <option>turkey</option>\n          <option disabled>duck</option>\n          <option>goose</option>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-inline\">\n    <div class=\"form-group\">\n      <label class=\"col-md-1 control-label\" for=\"lunch\">Lunch:</label>\n    </div>\n    <div class=\"form-group\">\n      <select id=\"lunch\" class=\"selectpicker\" data-live-search=\"true\" title=\"Please select a lunch ...\">\n        <option>Hot Dog, Fries and a Soda</option>\n        <option>Burger, Shake and a Smile</option>\n        <option>Sugar, Spice and all things nice</option>\n        <option>Baby Back Ribs</option>\n        <option>A really really long option made to illustrate an issue with the live search in an inline form</option>\n      </select>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group form-group-lg\">\n      <label for=\"error\" class=\"col-lg-2 control-label\">error</label>\n\n      <div class=\"col-lg-10 error\">\n        <select id=\"error\" class=\"selectpicker show-tick form-control\">\n          <option>pen</option>\n          <option>pencil</option>\n          <option selected>brush</option>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group has-error form-group-lg\">\n      <label class=\"control-label col-lg-2\" for=\"country\">error type 2</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"country\" name=\"country\" class=\"form-control selectpicker\">\n          <option>Argentina</option>\n          <option>United State</option>\n          <option>Mexico</option>\n        </select>\n\n        <p class=\"help-block\">No service available in the selected country</p>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <nav class=\"navbar navbar-default\" role=\"navigation\">\n    <div class=\"container-fluid\">\n      <div class=\"navbar-header\">\n        <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      </div>\n\n      <form class=\"navbar-form navbar-left\" role=\"search\">\n        <div class=\"form-group\">\n          <select class=\"selectpicker\" multiple data-live-search=\"true\" data-live-search-placeholder=\"Search\" data-actions-box=\"true\">\n            <optgroup label=\"filter1\">\n              <option>option1</option>\n              <option>option2</option>\n              <option>option3</option>\n              <option>option4</option>\n            </optgroup>\n            <optgroup label=\"filter2\">\n              <option>option1</option>\n              <option>option2</option>\n              <option>option3</option>\n              <option>option4</option>\n            </optgroup>\n            <optgroup label=\"filter3\">\n              <option>option1</option>\n              <option>option2</option>\n              <option>option3</option>\n              <option>option4</option>\n            </optgroup>\n          </select>\n        </div>\n\n        <div class=\"input-group\">\n          <input type=\"text\" class=\"form-control\" placeholder=\"Search\" name=\"q\">\n\n          <div class=\"input-group-btn\">\n            <button class=\"btn btn-default\" type=\"submit\"><i class=\"glyphicon glyphicon-search\"></i></button>\n          </div>\n        </div>\n        <button type=\"submit\" class=\"btn btn-default\">Search</button>\n      </form>\n\n    </div>\n    <!-- .container-fluid -->\n  </nav>\n\n  <hr>\n  <select id=\"first-disabled\" class=\"selectpicker\" data-hide-disabled=\"true\" data-live-search=\"true\">\n    <optgroup disabled=\"disabled\" label=\"disabled\">\n      <option>Hidden</option>\n    </optgroup>\n    <optgroup label=\"Fruit\">\n      <option>Apple</option>\n      <option>Orange</option>\n    </optgroup>\n    <optgroup label=\"Vegetable\">\n      <option>Corn</option>\n      <option>Carrot</option>\n    </optgroup>\n  </select>\n\n  <hr>\n  <select id=\"first-disabled2\" class=\"selectpicker\" multiple data-hide-disabled=\"true\" data-size=\"5\">\n    <option>Apple</option>\n    <option>Banana</option>\n    <option>Orange</option>\n    <option>Pineapple</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n  </select>\n  <button id=\"special\" class=\"btn btn-default\">Hide selected by disabling</button>\n  <button id=\"special2\" class=\"btn btn-default\">Reset</button>\n  <p>Just select 1st element, click button and check list again</p>\n\n  <hr>\n  <div class=\"input-group\">\n    <span class=\"input-group-addon\">@</span>\n    <select class=\"form-control selectpicker\">\n      <option>One</option>\n      <option>Two</option>\n      <option>Three</option>\n    </select>\n  </div>\n\n  <hr>\n  <div class=\"input-group\">\n    <span class=\"input-group-addon\">@</span>\n    <select class=\"form-control selectpicker\" data-mobile=\"true\">\n      <option>One</option>\n      <option>Two</option>\n      <option>Three</option>\n    </select>\n  </div>\n  <p>With <code>data-mobile=\"true\"</code> option.</p>\n\n  <hr>\n  <select id=\"done\" class=\"selectpicker\" multiple data-done-button=\"true\">\n    <option>Apple</option>\n    <option>Banana</option>\n    <option>Orange</option>\n    <option>Pineapple</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n  </select>\n\n  <hr>\n  <select id=\"tokens\" class=\"selectpicker\" multiple data-live-search=\"true\">\n    <option data-tokens=\"first\">I actually am called \"first\"</option>\n    <option data-tokens=\"second\">And me \"second\"</option>\n    <option data-tokens=\"last\">I am \"last\"</option>\n  </select>\n\n  <hr>\n  <form class=\"form-inline\">\n    <div class=\"form-group\">\n      <label class=\"col-md-1 control-label\" for=\"lunchBegins\">Lunch (Begins search):</label>\n    </div>\n    <div class=\"form-group\">\n      <select id=\"lunchBegins\" class=\"selectpicker\" data-live-search=\"true\" data-live-search-style=\"begins\" title=\"Please select a lunch ...\">\n        <option>Hot Dog, Fries and a Soda</option>\n        <option>Burger, Shake and a Smile</option>\n        <option>Sugar, Spice and all things nice</option>\n        <option>Baby Back Ribs</option>\n        <option>A really really long option made to illustrate an issue with the live search in an inline form</option>\n      </select>\n    </div>\n  </form>\n</div>\n\n<script>\n  $(document).ready(function () {\n    var mySelect = $('#first-disabled2');\n\n    $('#special').on('click', function () {\n      mySelect.find('option:selected').prop('disabled', true);\n      mySelect.selectpicker('refresh');\n    });\n\n    $('#special2').on('click', function () {\n      mySelect.find('option:disabled').prop('disabled', false);\n      mySelect.selectpicker('refresh');\n    });\n\n    $('#basic2').selectpicker({\n      liveSearch: true,\n      maxOptions: 1\n    });\n  });\n</script>\n</body>\n</html>"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/docs/mkdocs.yml",
    "content": "site_name: bootstrap-select\nsite_description: Bootstrap-select is a jQuery plugin that utilizes Bootstrap's dropdown.js to style and bring additional functionality to standard select elements.\nrepo_url: https://github.com/silviomoreto/bootstrap-select\ntheme: bootstrap\ntheme_dir: custom_theme\nextra_css:\n- css/custom.css\n- dist/css/bootstrap-select.min.css\nextra_javascript:\n- dist/js/bootstrap-select.min.js\npages:\n- Bootstrap-select: index.md\n- Examples: examples.md\n- Options: options.md\n- Methods: methods.md\nextra:\n    version: 1.12.2\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/.jshintrc",
    "content": "{\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"immed\": true,\n  \"latedef\": true,\n  \"newcap\": true,\n  \"noarg\": true,\n  \"sub\": true,\n  \"undef\": true,\n  \"unused\": true,\n  \"boss\": true,\n  \"eqnull\": true,\n  \"browser\": true,\n  \"jquery\": true\n}\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/bootstrap-select.js",
    "content": "(function ($) {\n  'use strict';\n\n  //<editor-fold desc=\"Shims\">\n  if (!String.prototype.includes) {\n    (function () {\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n      var toString = {}.toString;\n      var defineProperty = (function () {\n        // IE 8 only supports `Object.defineProperty` on DOM elements\n        try {\n          var object = {};\n          var $defineProperty = Object.defineProperty;\n          var result = $defineProperty(object, object, object) && $defineProperty;\n        } catch (error) {\n        }\n        return result;\n      }());\n      var indexOf = ''.indexOf;\n      var includes = function (search) {\n        if (this == null) {\n          throw new TypeError();\n        }\n        var string = String(this);\n        if (search && toString.call(search) == '[object RegExp]') {\n          throw new TypeError();\n        }\n        var stringLength = string.length;\n        var searchString = String(search);\n        var searchLength = searchString.length;\n        var position = arguments.length > 1 ? arguments[1] : undefined;\n        // `ToInteger`\n        var pos = position ? Number(position) : 0;\n        if (pos != pos) { // better `isNaN`\n          pos = 0;\n        }\n        var start = Math.min(Math.max(pos, 0), stringLength);\n        // Avoid the `indexOf` call if no match is possible\n        if (searchLength + start > stringLength) {\n          return false;\n        }\n        return indexOf.call(string, searchString, pos) != -1;\n      };\n      if (defineProperty) {\n        defineProperty(String.prototype, 'includes', {\n          'value': includes,\n          'configurable': true,\n          'writable': true\n        });\n      } else {\n        String.prototype.includes = includes;\n      }\n    }());\n  }\n\n  if (!String.prototype.startsWith) {\n    (function () {\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n      var defineProperty = (function () {\n        // IE 8 only supports `Object.defineProperty` on DOM elements\n        try {\n          var object = {};\n          var $defineProperty = Object.defineProperty;\n          var result = $defineProperty(object, object, object) && $defineProperty;\n        } catch (error) {\n        }\n        return result;\n      }());\n      var toString = {}.toString;\n      var startsWith = function (search) {\n        if (this == null) {\n          throw new TypeError();\n        }\n        var string = String(this);\n        if (search && toString.call(search) == '[object RegExp]') {\n          throw new TypeError();\n        }\n        var stringLength = string.length;\n        var searchString = String(search);\n        var searchLength = searchString.length;\n        var position = arguments.length > 1 ? arguments[1] : undefined;\n        // `ToInteger`\n        var pos = position ? Number(position) : 0;\n        if (pos != pos) { // better `isNaN`\n          pos = 0;\n        }\n        var start = Math.min(Math.max(pos, 0), stringLength);\n        // Avoid the `indexOf` call if no match is possible\n        if (searchLength + start > stringLength) {\n          return false;\n        }\n        var index = -1;\n        while (++index < searchLength) {\n          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {\n            return false;\n          }\n        }\n        return true;\n      };\n      if (defineProperty) {\n        defineProperty(String.prototype, 'startsWith', {\n          'value': startsWith,\n          'configurable': true,\n          'writable': true\n        });\n      } else {\n        String.prototype.startsWith = startsWith;\n      }\n    }());\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (\n      o, // object\n      k, // key\n      r  // result array\n      ){\n      // initialize object and result\n      r=[];\n      // iterate over object keys\n      for (k in o)\n          // fill result array with non-prototypical keys\n        r.hasOwnProperty.call(o, k) && r.push(k);\n      // return result\n      return r;\n    };\n  }\n\n  // set data-selected on select element if the value has been programmatically selected\n  // prior to initialization of bootstrap-select\n  // * consider removing or replacing an alternative method *\n  var valHooks = {\n    useDefault: false,\n    _set: $.valHooks.select.set\n  };\n\n  $.valHooks.select.set = function(elem, value) {\n    if (value && !valHooks.useDefault) $(elem).data('selected', true);\n\n    return valHooks._set.apply(this, arguments);\n  };\n\n  var changed_arguments = null;\n  $.fn.triggerNative = function (eventName) {\n    var el = this[0],\n        event;\n\n    if (el.dispatchEvent) { // for modern browsers & IE9+\n      if (typeof Event === 'function') {\n        // For modern browsers\n        event = new Event(eventName, {\n          bubbles: true\n        });\n      } else {\n        // For IE since it doesn't support Event constructor\n        event = document.createEvent('Event');\n        event.initEvent(eventName, true, false);\n      }\n\n      el.dispatchEvent(event);\n    } else if (el.fireEvent) { // for IE8\n      event = document.createEventObject();\n      event.eventType = eventName;\n      el.fireEvent('on' + eventName, event);\n    } else {\n      // fall back to jQuery.trigger\n      this.trigger(eventName);\n    }\n  };\n  //</editor-fold>\n\n  // Case insensitive contains search\n  $.expr.pseudos.icontains = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();\n    return haystack.includes(meta[3].toUpperCase());\n  };\n\n  // Case insensitive begins search\n  $.expr.pseudos.ibegins = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();\n    return haystack.startsWith(meta[3].toUpperCase());\n  };\n\n  // Case and accent insensitive contains search\n  $.expr.pseudos.aicontains = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();\n    return haystack.includes(meta[3].toUpperCase());\n  };\n\n  // Case and accent insensitive begins search\n  $.expr.pseudos.aibegins = function (obj, index, meta) {\n    var $obj = $(obj);\n    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();\n    return haystack.startsWith(meta[3].toUpperCase());\n  };\n\n  /**\n   * Remove all diatrics from the given text.\n   * @access private\n   * @param {String} text\n   * @returns {String}\n   */\n  function normalizeToBase(text) {\n    var rExps = [\n      {re: /[\\xC0-\\xC6]/g, ch: \"A\"},\n      {re: /[\\xE0-\\xE6]/g, ch: \"a\"},\n      {re: /[\\xC8-\\xCB]/g, ch: \"E\"},\n      {re: /[\\xE8-\\xEB]/g, ch: \"e\"},\n      {re: /[\\xCC-\\xCF]/g, ch: \"I\"},\n      {re: /[\\xEC-\\xEF]/g, ch: \"i\"},\n      {re: /[\\xD2-\\xD6]/g, ch: \"O\"},\n      {re: /[\\xF2-\\xF6]/g, ch: \"o\"},\n      {re: /[\\xD9-\\xDC]/g, ch: \"U\"},\n      {re: /[\\xF9-\\xFC]/g, ch: \"u\"},\n      {re: /[\\xC7-\\xE7]/g, ch: \"c\"},\n      {re: /[\\xD1]/g, ch: \"N\"},\n      {re: /[\\xF1]/g, ch: \"n\"}\n    ];\n    $.each(rExps, function () {\n      text = text ? text.replace(this.re, this.ch) : '';\n    });\n    return text;\n  }\n\n\n  // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  \n  var unescapeMap = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#x27;': \"'\",\n    '&#x60;': '`'\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped.\n    var source = '(?:' + Object.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n\n  var htmlEscape = createEscaper(escapeMap);\n  var htmlUnescape = createEscaper(unescapeMap);\n\n  var Selectpicker = function (element, options) {\n    // bootstrap-select has been initialized - revert valHooks.select.set back to its original function\n    if (!valHooks.useDefault) {\n      $.valHooks.select.set = valHooks._set;\n      valHooks.useDefault = true;\n    }\n\n    this.$element = $(element);\n    this.$newElement = null;\n    this.$button = null;\n    this.$menu = null;\n    this.$lis = null;\n    this.options = options;\n\n    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a\n    // data-attribute)\n    if (this.options.title === null) {\n      this.options.title = this.$element.attr('title');\n    }\n\n    // Format window padding\n    var winPad = this.options.windowPadding;\n    if (typeof winPad === 'number') {\n      this.options.windowPadding = [winPad, winPad, winPad, winPad];\n    }\n\n    //Expose public methods\n    this.val = Selectpicker.prototype.val;\n    this.render = Selectpicker.prototype.render;\n    this.refresh = Selectpicker.prototype.refresh;\n    this.setStyle = Selectpicker.prototype.setStyle;\n    this.selectAll = Selectpicker.prototype.selectAll;\n    this.deselectAll = Selectpicker.prototype.deselectAll;\n    this.destroy = Selectpicker.prototype.destroy;\n    this.remove = Selectpicker.prototype.remove;\n    this.show = Selectpicker.prototype.show;\n    this.hide = Selectpicker.prototype.hide;\n\n    this.init();\n  };\n\n  Selectpicker.VERSION = '1.12.2';\n\n  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.\n  Selectpicker.DEFAULTS = {\n    noneSelectedText: 'Nothing selected',\n    noneResultsText: 'No results matched {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} item selected\" : \"{0} items selected\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\n      ];\n    },\n    selectAllText: 'Select All',\n    deselectAllText: 'Deselect All',\n    doneButton: false,\n    doneButtonText: 'Close',\n    multipleSeparator: ', ',\n    styleBase: 'btn',\n    style: 'btn-default',\n    size: 'auto',\n    title: null,\n    selectedTextFormat: 'values',\n    width: false,\n    container: false,\n    hideDisabled: false,\n    showSubtext: false,\n    showIcon: true,\n    showContent: true,\n    dropupAuto: true,\n    header: false,\n    liveSearch: false,\n    liveSearchPlaceholder: null,\n    liveSearchNormalize: false,\n    liveSearchStyle: 'contains',\n    actionsBox: false,\n    iconBase: 'glyphicon',\n    tickIcon: 'glyphicon-ok',\n    showTick: false,\n    template: {\n      caret: '<span class=\"caret\"></span>'\n    },\n    maxOptions: false,\n    mobile: false,\n    selectOnTab: false,\n    dropdownAlignRight: false,\n    windowPadding: 0\n  };\n\n  Selectpicker.prototype = {\n\n    constructor: Selectpicker,\n\n    init: function () {\n      var that = this,\n          id = this.$element.attr('id');\n\n      this.$element.addClass('bs-select-hidden');\n\n      // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility\n      // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index=\"' + index + '\"]')\n      this.liObj = {};\n      this.multiple = this.$element.prop('multiple');\n      this.autofocus = this.$element.prop('autofocus');\n      this.$newElement = this.createView();\n      this.$element\n        .after(this.$newElement)\n        .appendTo(this.$newElement);\n      this.$button = this.$newElement.children('button');\n      this.$menu = this.$newElement.children('.dropdown-menu');\n      this.$menuInner = this.$menu.children('.inner');\n      this.$searchbox = this.$menu.find('input');\n\n      this.$element.removeClass('bs-select-hidden');\n\n      if (this.options.dropdownAlignRight === true) this.$menu.addClass('dropdown-menu-right');\n\n      if (typeof id !== 'undefined') {\n        this.$button.attr('data-id', id);\n        $('label[for=\"' + id + '\"]').click(function (e) {\n          e.preventDefault();\n          that.$button.focus();\n        });\n      }\n\n      this.checkDisabled();\n      this.clickListener();\n      if (this.options.liveSearch) this.liveSearchListener();\n      this.render();\n      this.setStyle();\n      this.setWidth();\n      if (this.options.container) this.selectPosition();\n      this.$menu.data('this', this);\n      this.$newElement.data('this', this);\n      if (this.options.mobile) this.mobile();\n\n      this.$newElement.on({\n        'hide.bs.dropdown': function (e) {\n          that.$menuInner.attr('aria-expanded', false);\n          that.$element.trigger('hide.bs.select', e);\n        },\n        'hidden.bs.dropdown': function (e) {\n          that.$element.trigger('hidden.bs.select', e);\n        },\n        'show.bs.dropdown': function (e) {\n          that.$menuInner.attr('aria-expanded', true);\n          that.$element.trigger('show.bs.select', e);\n        },\n        'shown.bs.dropdown': function (e) {\n          that.$element.trigger('shown.bs.select', e);\n        }\n      });\n\n      if (that.$element[0].hasAttribute('required')) {\n        this.$element.on('invalid', function () {\n          that.$button\n            .addClass('bs-invalid')\n            .focus();\n\n          that.$element.on({\n            'focus.bs.select': function () {\n              that.$button.focus();\n              that.$element.off('focus.bs.select');\n            },\n            'shown.bs.select': function () {\n              that.$element\n                .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened\n                .off('shown.bs.select');\n            },\n            'rendered.bs.select': function () {\n              // if select is no longer invalid, remove the bs-invalid class\n              if (this.validity.valid) that.$button.removeClass('bs-invalid');\n              that.$element.off('rendered.bs.select');\n            }\n          });\n        });\n      }\n\n      setTimeout(function () {\n        that.$element.trigger('loaded.bs.select');\n      });\n    },\n\n    createDropdown: function () {\n      // Options\n      // If we are multiple or showTick option is set, then add the show-tick class\n      var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',\n          inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',\n          autofocus = this.autofocus ? ' autofocus' : '';\n      // Elements\n      var header = this.options.header ? '<div class=\"popover-title\"><button type=\"button\" class=\"close\" aria-hidden=\"true\">&times;</button>' + this.options.header + '</div>' : '';\n      var searchbox = this.options.liveSearch ?\n      '<div class=\"bs-searchbox\">' +\n      '<input type=\"text\" class=\"form-control\" autocomplete=\"off\"' +\n      (null === this.options.liveSearchPlaceholder ? '' : ' placeholder=\"' + htmlEscape(this.options.liveSearchPlaceholder) + '\"') + ' role=\"textbox\" aria-label=\"Search\">' +\n      '</div>'\n          : '';\n      var actionsbox = this.multiple && this.options.actionsBox ?\n      '<div class=\"bs-actionsbox\">' +\n      '<div class=\"btn-group btn-group-sm btn-block\">' +\n      '<button type=\"button\" class=\"actions-btn bs-select-all btn btn-default\">' +\n      this.options.selectAllText +\n      '</button>' +\n      '<button type=\"button\" class=\"actions-btn bs-deselect-all btn btn-default\">' +\n      this.options.deselectAllText +\n      '</button>' +\n      '</div>' +\n      '</div>'\n          : '';\n      var donebutton = this.multiple && this.options.doneButton ?\n      '<div class=\"bs-donebutton\">' +\n      '<div class=\"btn-group btn-block\">' +\n      '<button type=\"button\" class=\"btn btn-sm btn-default\">' +\n      this.options.doneButtonText +\n      '</button>' +\n      '</div>' +\n      '</div>'\n          : '';\n      var drop =\n          '<div class=\"btn-group bootstrap-select' + showTick + inputGroup + '\">' +\n          '<button type=\"button\" class=\"' + this.options.styleBase + ' dropdown-toggle\" data-toggle=\"dropdown\"' + autofocus + ' role=\"button\">' +\n          '<span class=\"filter-option pull-left\"></span>&nbsp;' +\n          '<span class=\"bs-caret\">' +\n          this.options.template.caret +\n          '</span>' +\n          '</button>' +\n          '<div class=\"dropdown-menu open\" role=\"combobox\">' +\n          header +\n          searchbox +\n          actionsbox +\n          '<ul class=\"dropdown-menu inner\" role=\"listbox\" aria-expanded=\"false\">' +\n          '</ul>' +\n          donebutton +\n          '</div>' +\n          '</div>';\n\n      return $(drop);\n    },\n\n    createView: function () {\n      var $drop = this.createDropdown(),\n          li = this.createLi();\n\n      $drop.find('ul')[0].innerHTML = li;\n      return $drop;\n    },\n\n    reloadLi: function () {\n      // rebuild\n      var li = this.createLi();\n      this.$menuInner[0].innerHTML = li;\n    },\n\n    createLi: function () {\n      var that = this,\n          _li = [],\n          optID = 0,\n          titleOption = document.createElement('option'),\n          liIndex = -1; // increment liIndex whenever a new <li> element is created to ensure liObj is correct\n\n      // Helper functions\n      /**\n       * @param content\n       * @param [index]\n       * @param [classes]\n       * @param [optgroup]\n       * @returns {string}\n       */\n      var generateLI = function (content, index, classes, optgroup) {\n        return '<li' +\n            ((typeof classes !== 'undefined' & '' !== classes) ? ' class=\"' + classes + '\"' : '') +\n            ((typeof index !== 'undefined' & null !== index) ? ' data-original-index=\"' + index + '\"' : '') +\n            ((typeof optgroup !== 'undefined' & null !== optgroup) ? 'data-optgroup=\"' + optgroup + '\"' : '') +\n            '>' + content + '</li>';\n      };\n\n      /**\n       * @param text\n       * @param [classes]\n       * @param [inline]\n       * @param [tokens]\n       * @returns {string}\n       */\n      var generateA = function (text, classes, inline, tokens) {\n        return '<a tabindex=\"0\"' +\n            (typeof classes !== 'undefined' ? ' class=\"' + classes + '\"' : '') +\n            (inline ? ' style=\"' + inline + '\"' : '') +\n            (that.options.liveSearchNormalize ? ' data-normalized-text=\"' + normalizeToBase(htmlEscape($(text).html())) + '\"' : '') +\n            (typeof tokens !== 'undefined' || tokens !== null ? ' data-tokens=\"' + tokens + '\"' : '') +\n            ' role=\"option\">' + text +\n            '<span class=\"' + that.options.iconBase + ' ' + that.options.tickIcon + ' check-mark\"></span>' +\n            '</a>';\n      };\n\n      if (this.options.title && !this.multiple) {\n        // this option doesn't create a new <li> element, but does add a new option, so liIndex is decreased\n        // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended\n        liIndex--;\n\n        if (!this.$element.find('.bs-title-option').length) {\n          // Use native JS to prepend option (faster)\n          var element = this.$element[0];\n          titleOption.className = 'bs-title-option';\n          titleOption.innerHTML = this.options.title;\n          titleOption.value = '';\n          element.insertBefore(titleOption, element.firstChild);\n          // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.\n          // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,\n          // if so, the select will have the data-selected attribute\n          var $opt = $(element.options[element.selectedIndex]);\n          if ($opt.attr('selected') === undefined && this.$element.data('selected') === undefined) {\n            titleOption.selected = true;\n          }\n        }\n      }\n\n      this.$element.find('option').each(function (index) {\n        var $this = $(this);\n\n        liIndex++;\n\n        if ($this.hasClass('bs-title-option')) return;\n\n        // Get the class and text for the option\n        var optionClass = this.className || '',\n            inline = this.style.cssText,\n            text = $this.data('content') ? $this.data('content') : $this.html(),\n            tokens = $this.data('tokens') ? $this.data('tokens') : null,\n            subtext = typeof $this.data('subtext') !== 'undefined' ? '<small class=\"text-muted\">' + $this.data('subtext') + '</small>' : '',\n            icon = typeof $this.data('icon') !== 'undefined' ? '<span class=\"' + that.options.iconBase + ' ' + $this.data('icon') + '\"></span> ' : '',\n            $parent = $this.parent(),\n            isOptgroup = $parent[0].tagName === 'OPTGROUP',\n            isOptgroupDisabled = isOptgroup && $parent[0].disabled,\n            isDisabled = this.disabled || isOptgroupDisabled;\n\n        if (icon !== '' && isDisabled) {\n          icon = '<span>' + icon + '</span>';\n        }\n\n        if (that.options.hideDisabled && (isDisabled && !isOptgroup || isOptgroupDisabled)) {\n          liIndex--;\n          return;\n        }\n\n        if (!$this.data('content')) {\n          // Prepend any icon and append any subtext to the main text.\n          text = icon + '<span class=\"text\">' + text + subtext + '</span>';\n        }\n\n        if (isOptgroup && $this.data('divider') !== true) {\n          if (that.options.hideDisabled && isDisabled) {\n            if ($parent.data('allOptionsDisabled') === undefined) {\n              var $options = $parent.children();\n              $parent.data('allOptionsDisabled', $options.filter(':disabled').length === $options.length);\n            }\n\n            if ($parent.data('allOptionsDisabled')) {\n              liIndex--;\n              return;\n            }\n          }\n\n          var optGroupClass = ' ' + $parent[0].className || '';\n\n          if ($this.index() === 0) { // Is it the first option of the optgroup?\n            optID += 1;\n\n            // Get the opt group label\n            var label = $parent[0].label,\n                labelSubtext = typeof $parent.data('subtext') !== 'undefined' ? '<small class=\"text-muted\">' + $parent.data('subtext') + '</small>' : '',\n                labelIcon = $parent.data('icon') ? '<span class=\"' + that.options.iconBase + ' ' + $parent.data('icon') + '\"></span> ' : '';\n\n            label = labelIcon + '<span class=\"text\">' + htmlEscape(label) + labelSubtext + '</span>';\n\n            if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?\n              liIndex++;\n              _li.push(generateLI('', null, 'divider', optID + 'div'));\n            }\n            liIndex++;\n            _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));\n          }\n\n          if (that.options.hideDisabled && isDisabled) {\n            liIndex--;\n            return;\n          }\n\n          _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));\n        } else if ($this.data('divider') === true) {\n          _li.push(generateLI('', index, 'divider'));\n        } else if ($this.data('hidden') === true) {\n          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));\n        } else {\n          var showDivider = this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP';\n\n          // if previous element is not an optgroup and hideDisabled is true\n          if (!showDivider && that.options.hideDisabled) {\n            // get previous elements\n            var $prev = $(this).prevAll();\n\n            for (var i = 0; i < $prev.length; i++) {\n              // find the first element in the previous elements that is an optgroup\n              if ($prev[i].tagName === 'OPTGROUP') {\n                var optGroupDistance = 0;\n\n                // loop through the options in between the current option and the optgroup\n                // and check if they are hidden or disabled\n                for (var d = 0; d < i; d++) {\n                  var prevOption = $prev[d];\n                  if (prevOption.disabled || $(prevOption).data('hidden') === true) optGroupDistance++;\n                }\n\n                // if all of the options between the current option and the optgroup are hidden or disabled, show the divider\n                if (optGroupDistance === i) showDivider = true;\n\n                break;\n              }\n            }\n          }\n\n          if (showDivider) {\n            liIndex++;\n            _li.push(generateLI('', null, 'divider', optID + 'div'));\n          }\n          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));\n        }\n\n        that.liObj[index] = liIndex;\n      });\n\n      //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button\n      if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {\n        this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');\n      }\n\n      return _li.join('');\n    },\n\n    findLis: function () {\n      if (this.$lis == null) this.$lis = this.$menu.find('li');\n      return this.$lis;\n    },\n\n    /**\n     * @param [updateLi] defaults to true\n     */\n    render: function (updateLi) {\n      var that = this,\n          notDisabled;\n\n      //Update the LI to match the SELECT\n      if (updateLi !== false) {\n        this.$element.find('option').each(function (index) {\n          var $lis = that.findLis().eq(that.liObj[index]);\n\n          that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis);\n          that.setSelected(index, this.selected, $lis);\n        });\n      }\n\n      this.togglePlaceholder();\n\n      this.tabIndex();\n\n      var selectedItems = this.$element.find('option').map(function () {\n        if (this.selected) {\n          if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return;\n\n          var $this = $(this),\n              icon = $this.data('icon') && that.options.showIcon ? '<i class=\"' + that.options.iconBase + ' ' + $this.data('icon') + '\"></i> ' : '',\n              subtext;\n\n          if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {\n            subtext = ' <small class=\"text-muted\">' + $this.data('subtext') + '</small>';\n          } else {\n            subtext = '';\n          }\n          if (typeof $this.attr('title') !== 'undefined') {\n            return $this.attr('title');\n          } else if ($this.data('content') && that.options.showContent) {\n            return $this.data('content').toString();\n          } else {\n            return icon + $this.html() + subtext;\n          }\n        }\n      }).toArray();\n\n      //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled\n      //Convert all the values into a comma delimited string\n      var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);\n\n      //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..\n      if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {\n        var max = this.options.selectedTextFormat.split('>');\n        if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {\n          notDisabled = this.options.hideDisabled ? ', [disabled]' : '';\n          var totalCount = this.$element.find('option').not('[data-divider=\"true\"], [data-hidden=\"true\"]' + notDisabled).length,\n              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;\n          title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());\n        }\n      }\n\n      if (this.options.title == undefined) {\n        this.options.title = this.$element.attr('title');\n      }\n\n      if (this.options.selectedTextFormat == 'static') {\n        title = this.options.title;\n      }\n\n      //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text\n      if (!title) {\n        title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;\n      }\n\n      //strip all HTML tags and trim the result, then unescape any escaped tags\n      this.$button.attr('title', htmlUnescape($.trim(title.replace(/<[^>]*>?/g, ''))));\n      this.$button.children('.filter-option').html(title);\n\n      this.$element.trigger('rendered.bs.select');\n    },\n\n    /**\n     * @param [style]\n     * @param [status]\n     */\n    setStyle: function (style, status) {\n      if (this.$element.attr('class')) {\n        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\\[.*\\]/gi, ''));\n      }\n\n      var buttonClass = style ? style : this.options.style;\n\n      if (status == 'add') {\n        this.$button.addClass(buttonClass);\n      } else if (status == 'remove') {\n        this.$button.removeClass(buttonClass);\n      } else {\n        this.$button.removeClass(this.options.style);\n        this.$button.addClass(buttonClass);\n      }\n    },\n\n    liHeight: function (refresh) {\n      if (!refresh && (this.options.size === false || this.sizeInfo)) return;\n\n      var newElement = document.createElement('div'),\n          menu = document.createElement('div'),\n          menuInner = document.createElement('ul'),\n          divider = document.createElement('li'),\n          li = document.createElement('li'),\n          a = document.createElement('a'),\n          text = document.createElement('span'),\n          header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,\n          search = this.options.liveSearch ? document.createElement('div') : null,\n          actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,\n          doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;\n\n      text.className = 'text';\n      newElement.className = this.$menu[0].parentNode.className + ' open';\n      menu.className = 'dropdown-menu open';\n      menuInner.className = 'dropdown-menu inner';\n      divider.className = 'divider';\n\n      text.appendChild(document.createTextNode('Inner text'));\n      a.appendChild(text);\n      li.appendChild(a);\n      menuInner.appendChild(li);\n      menuInner.appendChild(divider);\n      if (header) menu.appendChild(header);\n      if (search) {\n        var input = document.createElement('input');\n        search.className = 'bs-searchbox';\n        input.className = 'form-control';\n        search.appendChild(input);\n        menu.appendChild(search);\n      }\n      if (actions) menu.appendChild(actions);\n      menu.appendChild(menuInner);\n      if (doneButton) menu.appendChild(doneButton);\n      newElement.appendChild(menu);\n\n      document.body.appendChild(newElement);\n\n      var liHeight = a.offsetHeight,\n          headerHeight = header ? header.offsetHeight : 0,\n          searchHeight = search ? search.offsetHeight : 0,\n          actionsHeight = actions ? actions.offsetHeight : 0,\n          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,\n          dividerHeight = $(divider).outerHeight(true),\n          // fall back to jQuery if getComputedStyle is not supported\n          menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,\n          $menu = menuStyle ? null : $(menu),\n          menuPadding = {\n            vert: parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +\n                  parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +\n                  parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +\n                  parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),\n            horiz: parseInt(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) +\n                  parseInt(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) +\n                  parseInt(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) +\n                  parseInt(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth'))\n          },\n          menuExtras =  {\n            vert: menuPadding.vert +\n                  parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +\n                  parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2,\n            horiz: menuPadding.horiz +\n                  parseInt(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) +\n                  parseInt(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2\n          }\n\n      document.body.removeChild(newElement);\n\n      this.sizeInfo = {\n        liHeight: liHeight,\n        headerHeight: headerHeight,\n        searchHeight: searchHeight,\n        actionsHeight: actionsHeight,\n        doneButtonHeight: doneButtonHeight,\n        dividerHeight: dividerHeight,\n        menuPadding: menuPadding,\n        menuExtras: menuExtras\n      };\n    },\n\n    setSize: function () {\n      this.findLis();\n      this.liHeight();\n\n      if (this.options.header) this.$menu.css('padding-top', 0);\n      if (this.options.size === false) return;\n\n      var that = this,\n          $menu = this.$menu,\n          $menuInner = this.$menuInner,\n          $window = $(window),\n          selectHeight = this.$newElement[0].offsetHeight,\n          selectWidth = this.$newElement[0].offsetWidth,\n          liHeight = this.sizeInfo['liHeight'],\n          headerHeight = this.sizeInfo['headerHeight'],\n          searchHeight = this.sizeInfo['searchHeight'],\n          actionsHeight = this.sizeInfo['actionsHeight'],\n          doneButtonHeight = this.sizeInfo['doneButtonHeight'],\n          divHeight = this.sizeInfo['dividerHeight'],\n          menuPadding = this.sizeInfo['menuPadding'],\n          menuExtras = this.sizeInfo['menuExtras'],\n          notDisabled = this.options.hideDisabled ? '.disabled' : '',\n          menuHeight,\n          menuWidth,\n          getHeight,\n          getWidth,\n          selectOffsetTop,\n          selectOffsetBot,\n          selectOffsetLeft,\n          selectOffsetRight,\n          getPos = function() {\n            var pos = that.$newElement.offset(),\n                $container = $(that.options.container),\n                containerPos;\n\n            if (that.options.container && !$container.is('body')) {\n              containerPos = $container.offset();\n              containerPos.top += parseInt($container.css('borderTopWidth'));\n              containerPos.left += parseInt($container.css('borderLeftWidth'));\n            } else {\n              containerPos = { top: 0, left: 0 };\n            }\n\n            var winPad = that.options.windowPadding;\n            selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();\n            selectOffsetBot = $window.height() - selectOffsetTop - selectHeight - containerPos.top - winPad[2];\n            selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();\n            selectOffsetRight = $window.width() - selectOffsetLeft - selectWidth - containerPos.left - winPad[1];\n            selectOffsetTop -= winPad[0];\n            selectOffsetLeft -= winPad[3];\n          };\n\n      getPos();\n\n      if (this.options.size === 'auto') {\n        var getSize = function () {\n          var minHeight,\n              hasClass = function (className, include) {\n                return function (element) {\n                    if (include) {\n                        return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));\n                    } else {\n                        return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));\n                    }\n                };\n              },\n              lis = that.$menuInner[0].getElementsByTagName('li'),\n              lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),\n              optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');\n\n          getPos();\n          menuHeight = selectOffsetBot - menuExtras.vert;\n          menuWidth = selectOffsetRight - menuExtras.horiz;\n\n          if (that.options.container) {\n            if (!$menu.data('height')) $menu.data('height', $menu.height());\n            getHeight = $menu.data('height');\n\n            if (!$menu.data('width')) $menu.data('width', $menu.width());\n            getWidth = $menu.data('width');\n          } else {\n            getHeight = $menu.height();\n            getWidth = $menu.width();\n          }\n\n          if (that.options.dropupAuto) {\n            that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);\n          }\n\n          if (that.$newElement.hasClass('dropup')) {\n            menuHeight = selectOffsetTop - menuExtras.vert;\n          }\n\n          if (that.options.dropdownAlignRight === 'auto') {\n            $menu.toggleClass('dropdown-menu-right', selectOffsetLeft > selectOffsetRight && (menuWidth - menuExtras.horiz) < (getWidth - selectWidth));\n          }\n\n          if ((lisVisible.length + optGroup.length) > 3) {\n            minHeight = liHeight * 3 + menuExtras.vert - 2;\n          } else {\n            minHeight = 0;\n          }\n\n          $menu.css({\n            'max-height': menuHeight + 'px',\n            'overflow': 'hidden',\n            'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'\n          });\n          $menuInner.css({\n            'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert + 'px',\n            'overflow-y': 'auto',\n            'min-height': Math.max(minHeight - menuPadding.vert, 0) + 'px'\n          });\n        };\n        getSize();\n        this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);\n        $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);\n      } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {\n        var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),\n            divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;\n        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;\n\n        if (that.options.container) {\n          if (!$menu.data('height')) $menu.data('height', $menu.height());\n          getHeight = $menu.data('height');\n        } else {\n          getHeight = $menu.height();\n        }\n\n        if (that.options.dropupAuto) {\n          //noinspection JSUnusedAssignment\n          this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);\n        }\n        $menu.css({\n          'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',\n          'overflow': 'hidden',\n          'min-height': ''\n        });\n        $menuInner.css({\n          'max-height': menuHeight - menuPadding.vert + 'px',\n          'overflow-y': 'auto',\n          'min-height': ''\n        });\n      }\n    },\n\n    setWidth: function () {\n      if (this.options.width === 'auto') {\n        this.$menu.css('min-width', '0');\n\n        // Get correct width if element is hidden\n        var $selectClone = this.$menu.parent().clone().appendTo('body'),\n            $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,\n            ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),\n            btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();\n\n        $selectClone.remove();\n        $selectClone2.remove();\n\n        // Set width to whatever's larger, button title or longest option\n        this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');\n      } else if (this.options.width === 'fit') {\n        // Remove inline min-width so width can be changed from 'auto'\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', '').addClass('fit-width');\n      } else if (this.options.width) {\n        // Remove inline min-width so width can be changed from 'auto'\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', this.options.width);\n      } else {\n        // Remove inline min-width/width so width can be changed\n        this.$menu.css('min-width', '');\n        this.$newElement.css('width', '');\n      }\n      // Remove fit-width class if width is changed programmatically\n      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {\n        this.$newElement.removeClass('fit-width');\n      }\n    },\n\n    selectPosition: function () {\n      this.$bsContainer = $('<div class=\"bs-container\" />');\n\n      var that = this,\n          $container = $(this.options.container),\n          pos,\n          containerPos,\n          actualHeight,\n          getPlacement = function ($element) {\n            that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));\n            pos = $element.offset();\n\n            if (!$container.is('body')) {\n              containerPos = $container.offset();\n              containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();\n              containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();\n            } else {\n              containerPos = { top: 0, left: 0 };\n            }\n\n            actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;\n\n            that.$bsContainer.css({\n              'top': pos.top - containerPos.top + actualHeight,\n              'left': pos.left - containerPos.left,\n              'width': $element[0].offsetWidth\n            });\n          };\n\n      this.$button.on('click', function () {\n        var $this = $(this);\n\n        if (that.isDisabled()) {\n          return;\n        }\n\n        getPlacement(that.$newElement);\n\n        that.$bsContainer\n          .appendTo(that.options.container)\n          .toggleClass('open', !$this.hasClass('open'))\n          .append(that.$menu);\n      });\n\n      $(window).on('resize scroll', function () {\n        getPlacement(that.$newElement);\n      });\n\n      this.$element.on('hide.bs.select', function () {\n        that.$menu.data('height', that.$menu.height());\n        that.$bsContainer.detach();\n      });\n    },\n\n    /**\n     * @param {number} index - the index of the option that is being changed\n     * @param {boolean} selected - true if the option is being selected, false if being deselected\n     * @param {JQuery} $lis - the 'li' element that is being modified\n     */\n    setSelected: function (index, selected, $lis) {\n      if (!$lis) {\n        this.togglePlaceholder(); // check if setSelected is being called by changing the value of the select\n        $lis = this.findLis().eq(this.liObj[index]);\n      }\n\n      $lis.toggleClass('selected', selected).find('a').attr('aria-selected', selected);\n    },\n\n    /**\n     * @param {number} index - the index of the option that is being disabled\n     * @param {boolean} disabled - true if the option is being disabled, false if being enabled\n     * @param {JQuery} $lis - the 'li' element that is being modified\n     */\n    setDisabled: function (index, disabled, $lis) {\n      if (!$lis) {\n        $lis = this.findLis().eq(this.liObj[index]);\n      }\n\n      if (disabled) {\n        $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1).attr('aria-disabled', true);\n      } else {\n        $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0).attr('aria-disabled', false);\n      }\n    },\n\n    isDisabled: function () {\n      return this.$element[0].disabled;\n    },\n\n    checkDisabled: function () {\n      var that = this;\n\n      if (this.isDisabled()) {\n        this.$newElement.addClass('disabled');\n        this.$button.addClass('disabled').attr('tabindex', -1).attr('aria-disabled', true);\n      } else {\n        if (this.$button.hasClass('disabled')) {\n          this.$newElement.removeClass('disabled');\n          this.$button.removeClass('disabled').attr('aria-disabled', false);\n        }\n\n        if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {\n          this.$button.removeAttr('tabindex');\n        }\n      }\n\n      this.$button.click(function () {\n        return !that.isDisabled();\n      });\n    },\n\n    togglePlaceholder: function () {\n      var value = this.$element.val();\n      this.$button.toggleClass('bs-placeholder', value === null || value === '' || (value.constructor === Array && value.length === 0));\n    },\n\n    tabIndex: function () {\n      if (this.$element.data('tabindex') !== this.$element.attr('tabindex') && \n        (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) {\n        this.$element.data('tabindex', this.$element.attr('tabindex'));\n        this.$button.attr('tabindex', this.$element.data('tabindex'));\n      }\n\n      this.$element.attr('tabindex', -98);\n    },\n\n    clickListener: function () {\n      var that = this,\n          $document = $(document);\n\n      $document.data('spaceSelect', false);\n\n      this.$button.on('keyup', function (e) {\n        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {\n            e.preventDefault();\n            $document.data('spaceSelect', false);\n        }\n      });\n\n      this.$button.on('click', function () {\n        that.setSize();\n      });\n\n      this.$element.on('shown.bs.select', function () {\n        if (!that.options.liveSearch && !that.multiple) {\n          that.$menuInner.find('.selected a').focus();\n        } else if (!that.multiple) {\n          var selectedIndex = that.liObj[that.$element[0].selectedIndex];\n\n          if (typeof selectedIndex !== 'number' || that.options.size === false) return;\n\n          // scroll to selected option\n          var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;\n          offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2;\n          that.$menuInner[0].scrollTop = offset;\n        }\n      });\n\n      this.$menuInner.on('click', 'li a', function (e) {\n        var $this = $(this),\n            clickedIndex = $this.parent().data('originalIndex'),\n            prevValue = that.$element.val(),\n            prevIndex = that.$element.prop('selectedIndex'),\n            triggerChange = true;\n\n        // Don't close on multi choice menu\n        if (that.multiple && that.options.maxOptions !== 1) {\n          e.stopPropagation();\n        }\n\n        e.preventDefault();\n\n        //Don't run if we have been disabled\n        if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {\n          var $options = that.$element.find('option'),\n              $option = $options.eq(clickedIndex),\n              state = $option.prop('selected'),\n              $optgroup = $option.parent('optgroup'),\n              maxOptions = that.options.maxOptions,\n              maxOptionsGrp = $optgroup.data('maxOptions') || false;\n\n          if (!that.multiple) { // Deselect all others if not multi select box\n            $options.prop('selected', false);\n            $option.prop('selected', true);\n            that.$menuInner.find('.selected').removeClass('selected').find('a').attr('aria-selected', false);\n            that.setSelected(clickedIndex, true);\n          } else { // Toggle the one we have chosen if we are multi select.\n            $option.prop('selected', !state);\n            that.setSelected(clickedIndex, !state);\n            $this.blur();\n\n            if (maxOptions !== false || maxOptionsGrp !== false) {\n              var maxReached = maxOptions < $options.filter(':selected').length,\n                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;\n\n              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {\n                if (maxOptions && maxOptions == 1) {\n                  $options.prop('selected', false);\n                  $option.prop('selected', true);\n                  that.$menuInner.find('.selected').removeClass('selected');\n                  that.setSelected(clickedIndex, true);\n                } else if (maxOptionsGrp && maxOptionsGrp == 1) {\n                  $optgroup.find('option:selected').prop('selected', false);\n                  $option.prop('selected', true);\n                  var optgroupID = $this.parent().data('optgroup');\n                  that.$menuInner.find('[data-optgroup=\"' + optgroupID + '\"]').removeClass('selected');\n                  that.setSelected(clickedIndex, true);\n                } else {\n                  var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,\n                      maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,\n                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),\n                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),\n                      $notify = $('<div class=\"notify\"></div>');\n                  // If {var} is set in array, replace it\n                  /** @deprecated */\n                  if (maxOptionsArr[2]) {\n                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);\n                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);\n                  }\n\n                  $option.prop('selected', false);\n\n                  that.$menu.append($notify);\n\n                  if (maxOptions && maxReached) {\n                    $notify.append($('<div>' + maxTxt + '</div>'));\n                    triggerChange = false;\n                    that.$element.trigger('maxReached.bs.select');\n                  }\n\n                  if (maxOptionsGrp && maxReachedGrp) {\n                    $notify.append($('<div>' + maxTxtGrp + '</div>'));\n                    triggerChange = false;\n                    that.$element.trigger('maxReachedGrp.bs.select');\n                  }\n\n                  setTimeout(function () {\n                    that.setSelected(clickedIndex, false);\n                  }, 10);\n\n                  $notify.delay(750).fadeOut(300, function () {\n                    $(this).remove();\n                  });\n                }\n              }\n            }\n          }\n\n          if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {\n            that.$button.focus();\n          } else if (that.options.liveSearch) {\n            that.$searchbox.focus();\n          }\n\n          // Trigger select 'change'\n          if (triggerChange) {\n            if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {\n              // $option.prop('selected') is current option state (selected/unselected). state is previous option state.\n              changed_arguments = [clickedIndex, $option.prop('selected'), state];\n              that.$element\n                .triggerNative('change');\n            }\n          }\n        }\n      });\n\n      this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {\n        if (e.currentTarget == this) {\n          e.preventDefault();\n          e.stopPropagation();\n          if (that.options.liveSearch && !$(e.target).hasClass('close')) {\n            that.$searchbox.focus();\n          } else {\n            that.$button.focus();\n          }\n        }\n      });\n\n      this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        if (that.options.liveSearch) {\n          that.$searchbox.focus();\n        } else {\n          that.$button.focus();\n        }\n      });\n\n      this.$menu.on('click', '.popover-title .close', function () {\n        that.$button.click();\n      });\n\n      this.$searchbox.on('click', function (e) {\n        e.stopPropagation();\n      });\n\n      this.$menu.on('click', '.actions-btn', function (e) {\n        if (that.options.liveSearch) {\n          that.$searchbox.focus();\n        } else {\n          that.$button.focus();\n        }\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        if ($(this).hasClass('bs-select-all')) {\n          that.selectAll();\n        } else {\n          that.deselectAll();\n        }\n      });\n\n      this.$element.change(function () {\n        that.render(false);\n        that.$element.trigger('changed.bs.select', changed_arguments);\n        changed_arguments = null;\n      });\n    },\n\n    liveSearchListener: function () {\n      var that = this,\n          $no_results = $('<li class=\"no-results\"></li>');\n\n      this.$button.on('click.dropdown.data-api', function () {\n        that.$menuInner.find('.active').removeClass('active');\n        if (!!that.$searchbox.val()) {\n          that.$searchbox.val('');\n          that.$lis.not('.is-hidden').removeClass('hidden');\n          if (!!$no_results.parent().length) $no_results.remove();\n        }\n        if (!that.multiple) that.$menuInner.find('.selected').addClass('active');\n        setTimeout(function () {\n          that.$searchbox.focus();\n        }, 10);\n      });\n\n      this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {\n        e.stopPropagation();\n      });\n\n      this.$searchbox.on('input propertychange', function () {\n        that.$lis.not('.is-hidden').removeClass('hidden');\n        that.$lis.filter('.active').removeClass('active');\n        $no_results.remove();\n\n        if (that.$searchbox.val()) {\n          var $searchBase = that.$lis.not('.is-hidden, .divider, .dropdown-header'),\n              $hideItems;\n          if (that.options.liveSearchNormalize) {\n            $hideItems = $searchBase.find('a').not(':a' + that._searchStyle() + '(\"' + normalizeToBase(that.$searchbox.val()) + '\")');\n          } else {\n            $hideItems = $searchBase.find('a').not(':' + that._searchStyle() + '(\"' + that.$searchbox.val() + '\")');\n          }\n\n          if ($hideItems.length === $searchBase.length) {\n            $no_results.html(that.options.noneResultsText.replace('{0}', '\"' + htmlEscape(that.$searchbox.val()) + '\"'));\n            that.$menuInner.append($no_results);\n            that.$lis.addClass('hidden');\n          } else {\n            $hideItems.parent().addClass('hidden');\n\n            var $lisVisible = that.$lis.not('.hidden'),\n                $foundDiv;\n\n            // hide divider if first or last visible, or if followed by another divider\n            $lisVisible.each(function (index) {\n              var $this = $(this);\n\n              if ($this.hasClass('divider')) {\n                if ($foundDiv === undefined) {\n                  $this.addClass('hidden');\n                } else {\n                  if ($foundDiv) $foundDiv.addClass('hidden');\n                  $foundDiv = $this;\n                }\n              } else if ($this.hasClass('dropdown-header') && $lisVisible.eq(index + 1).data('optgroup') !== $this.data('optgroup')) {\n                $this.addClass('hidden');\n              } else {\n                $foundDiv = null;\n              }\n            });\n            if ($foundDiv) $foundDiv.addClass('hidden');\n\n            $searchBase.not('.hidden').first().addClass('active');\n          }\n        }\n      });\n    },\n\n    _searchStyle: function () {\n      var styles = {\n        begins: 'ibegins',\n        startsWith: 'ibegins'\n      };\n\n      return styles[this.options.liveSearchStyle] || 'icontains';\n    },\n\n    val: function (value) {\n      if (typeof value !== 'undefined') {\n        this.$element.val(value);\n        this.render();\n\n        return this.$element;\n      } else {\n        return this.$element.val();\n      }\n    },\n\n    changeAll: function (status) {\n      if (!this.multiple) return;\n      if (typeof status === 'undefined') status = true;\n\n      this.findLis();\n\n      var $options = this.$element.find('option'),\n          $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden'),\n          lisVisLen = $lisVisible.length,\n          selectedOptions = [];\n          \n      if (status) {\n        if ($lisVisible.filter('.selected').length === $lisVisible.length) return;\n      } else {\n        if ($lisVisible.filter('.selected').length === 0) return;\n      }\n          \n      $lisVisible.toggleClass('selected', status);\n\n      for (var i = 0; i < lisVisLen; i++) {\n        var origIndex = $lisVisible[i].getAttribute('data-original-index');\n        selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0];\n      }\n\n      $(selectedOptions).prop('selected', status);\n\n      this.render(false);\n\n      this.togglePlaceholder();\n\n      this.$element\n        .triggerNative('change');\n    },\n\n    selectAll: function () {\n      return this.changeAll(true);\n    },\n\n    deselectAll: function () {\n      return this.changeAll(false);\n    },\n\n    toggle: function (e) {\n      e = e || window.event;\n\n      if (e) e.stopPropagation();\n\n      this.$button.trigger('click');\n    },\n\n    keydown: function (e) {\n      var $this = $(this),\n          $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),\n          $items,\n          that = $parent.data('this'),\n          index,\n          next,\n          first,\n          last,\n          prev,\n          nextPrev,\n          prevIndex,\n          isActive,\n          selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',\n          keyCodeMap = {\n            32: ' ',\n            48: '0',\n            49: '1',\n            50: '2',\n            51: '3',\n            52: '4',\n            53: '5',\n            54: '6',\n            55: '7',\n            56: '8',\n            57: '9',\n            59: ';',\n            65: 'a',\n            66: 'b',\n            67: 'c',\n            68: 'd',\n            69: 'e',\n            70: 'f',\n            71: 'g',\n            72: 'h',\n            73: 'i',\n            74: 'j',\n            75: 'k',\n            76: 'l',\n            77: 'm',\n            78: 'n',\n            79: 'o',\n            80: 'p',\n            81: 'q',\n            82: 'r',\n            83: 's',\n            84: 't',\n            85: 'u',\n            86: 'v',\n            87: 'w',\n            88: 'x',\n            89: 'y',\n            90: 'z',\n            96: '0',\n            97: '1',\n            98: '2',\n            99: '3',\n            100: '4',\n            101: '5',\n            102: '6',\n            103: '7',\n            104: '8',\n            105: '9'\n          };\n\n      if (that.options.liveSearch) $parent = $this.parent().parent();\n\n      if (that.options.container) $parent = that.$menu;\n\n      $items = $('[role=\"listbox\"] li', $parent);\n\n      isActive = that.$newElement.hasClass('open');\n\n      if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) {\n        if (!that.options.container) {\n          that.setSize();\n          that.$menu.parent().addClass('open');\n          isActive = true;\n        } else {\n          that.$button.trigger('click');\n        }\n        that.$searchbox.focus();\n        return;\n      }\n\n      if (that.options.liveSearch) {\n        if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive) {\n          e.preventDefault();\n          e.stopPropagation();\n          that.$menuInner.click();\n          that.$button.focus();\n        }\n        // $items contains li elements when liveSearch is enabled\n        $items = $('[role=\"listbox\"] li' + selector, $parent);\n        if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {\n          if ($items.filter('.active').length === 0) {\n            $items = that.$menuInner.find('li');\n            if (that.options.liveSearchNormalize) {\n              $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');\n            } else {\n              $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');\n            }\n          }\n        }\n      }\n\n      if (!$items.length) return;\n\n      if (/(38|40)/.test(e.keyCode.toString(10))) {\n        index = $items.index($items.find('a').filter(':focus').parent());\n        first = $items.filter(selector).first().index();\n        last = $items.filter(selector).last().index();\n        next = $items.eq(index).nextAll(selector).eq(0).index();\n        prev = $items.eq(index).prevAll(selector).eq(0).index();\n        nextPrev = $items.eq(next).prevAll(selector).eq(0).index();\n\n        if (that.options.liveSearch) {\n          $items.each(function (i) {\n            if (!$(this).hasClass('disabled')) {\n              $(this).data('index', i);\n            }\n          });\n          index = $items.index($items.filter('.active'));\n          first = $items.first().data('index');\n          last = $items.last().data('index');\n          next = $items.eq(index).nextAll().eq(0).data('index');\n          prev = $items.eq(index).prevAll().eq(0).data('index');\n          nextPrev = $items.eq(next).prevAll().eq(0).data('index');\n        }\n\n        prevIndex = $this.data('prevIndex');\n\n        if (e.keyCode == 38) {\n          if (that.options.liveSearch) index--;\n          if (index != nextPrev && index > prev) index = prev;\n          if (index < first) index = first;\n          if (index == prevIndex) index = last;\n        } else if (e.keyCode == 40) {\n          if (that.options.liveSearch) index++;\n          if (index == -1) index = 0;\n          if (index != nextPrev && index < next) index = next;\n          if (index > last) index = last;\n          if (index == prevIndex) index = first;\n        }\n\n        $this.data('prevIndex', index);\n\n        if (!that.options.liveSearch) {\n          $items.eq(index).children('a').focus();\n        } else {\n          e.preventDefault();\n          if (!$this.hasClass('dropdown-toggle')) {\n            $items.removeClass('active').eq(index).addClass('active').children('a').focus();\n            $this.focus();\n          }\n        }\n\n      } else if (!$this.is('input')) {\n        var keyIndex = [],\n            count,\n            prevKey;\n\n        $items.each(function () {\n          if (!$(this).hasClass('disabled')) {\n            if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {\n              keyIndex.push($(this).index());\n            }\n          }\n        });\n\n        count = $(document).data('keycount');\n        count++;\n        $(document).data('keycount', count);\n\n        prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);\n\n        if (prevKey != keyCodeMap[e.keyCode]) {\n          count = 1;\n          $(document).data('keycount', count);\n        } else if (count >= keyIndex.length) {\n          $(document).data('keycount', 0);\n          if (count > keyIndex.length) count = 1;\n        }\n\n        $items.eq(keyIndex[count - 1]).children('a').focus();\n      }\n\n      // Select focused option if \"Enter\", \"Spacebar\" or \"Tab\" (when selectOnTab is true) are pressed inside the menu.\n      if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {\n        if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();\n        if (!that.options.liveSearch) {\n          var elem = $(':focus');\n          elem.click();\n          // Bring back focus for multiselects\n          elem.focus();\n          // Prevent screen from scrolling if the user hit the spacebar\n          e.preventDefault();\n          // Fixes spacebar selection of dropdown items in FF & IE\n          $(document).data('spaceSelect', true);\n        } else if (!/(32)/.test(e.keyCode.toString(10))) {\n          that.$menuInner.find('.active a').click();\n          $this.focus();\n        }\n        $(document).data('keycount', 0);\n      }\n\n      if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {\n        that.$menu.parent().removeClass('open');\n        if (that.options.container) that.$newElement.removeClass('open');\n        that.$button.focus();\n      }\n    },\n\n    mobile: function () {\n      this.$element.addClass('mobile-device');\n    },\n\n    refresh: function () {\n      this.$lis = null;\n      this.liObj = {};\n      this.reloadLi();\n      this.render();\n      this.checkDisabled();\n      this.liHeight(true);\n      this.setStyle();\n      this.setWidth();\n      if (this.$lis) this.$searchbox.trigger('propertychange');\n\n      this.$element.trigger('refreshed.bs.select');\n    },\n\n    hide: function () {\n      this.$newElement.hide();\n    },\n\n    show: function () {\n      this.$newElement.show();\n    },\n\n    remove: function () {\n      this.$newElement.remove();\n      this.$element.remove();\n    },\n\n    destroy: function () {\n      this.$newElement.before(this.$element).remove();\n\n      if (this.$bsContainer) {\n        this.$bsContainer.remove();\n      } else {\n        this.$menu.remove();\n      }\n\n      this.$element\n        .off('.bs.select')\n        .removeData('selectpicker')\n        .removeClass('bs-select-hidden selectpicker');\n    }\n  };\n\n  // SELECTPICKER PLUGIN DEFINITION\n  // ==============================\n  function Plugin(option) {\n    // get the args of the outer function..\n    var args = arguments;\n    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them\n    // to get lost/corrupted in android 2.3 and IE9 #715 #775\n    var _option = option;\n\n    [].shift.apply(args);\n\n    var value;\n    var chain = this.each(function () {\n      var $this = $(this);\n      if ($this.is('select')) {\n        var data = $this.data('selectpicker'),\n            options = typeof _option == 'object' && _option;\n\n        if (!data) {\n          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);\n          config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template);\n          $this.data('selectpicker', (data = new Selectpicker(this, config)));\n        } else if (options) {\n          for (var i in options) {\n            if (options.hasOwnProperty(i)) {\n              data.options[i] = options[i];\n            }\n          }\n        }\n\n        if (typeof _option == 'string') {\n          if (data[_option] instanceof Function) {\n            value = data[_option].apply(data, args);\n          } else {\n            value = data.options[_option];\n          }\n        }\n      }\n    });\n\n    if (typeof value !== 'undefined') {\n      //noinspection JSUnusedAssignment\n      return value;\n    } else {\n      return chain;\n    }\n  }\n\n  var old = $.fn.selectpicker;\n  $.fn.selectpicker = Plugin;\n  $.fn.selectpicker.Constructor = Selectpicker;\n\n  // SELECTPICKER NO CONFLICT\n  // ========================\n  $.fn.selectpicker.noConflict = function () {\n    $.fn.selectpicker = old;\n    return this;\n  };\n\n  $(document)\n      .data('keycount', 0)\n      .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=\"listbox\"], .bs-searchbox input', Selectpicker.prototype.keydown)\n      .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=\"listbox\"], .bs-searchbox input', function (e) {\n        e.stopPropagation();\n      });\n\n  // SELECTPICKER DATA-API\n  // =====================\n  $(window).on('load.bs.select.data-api', function () {\n    $('.selectpicker').each(function () {\n      var $selectpicker = $(this);\n      Plugin.call($selectpicker, $selectpicker.data());\n    })\n  });\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-ar_AR.js",
    "content": "/*!\n * Translated default messages for bootstrap-select.\n * Locale: AR (Arabic)\n * Author: Yasser Lotfy <y_l@alive.com>\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'لم يتم إختيار شئ',\n    noneResultsText: 'لا توجد نتائج مطابقة لـ {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} خيار تم إختياره\" : \"{0} خيارات تمت إختيارها\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'تخطى الحد المسموح ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح ({n} خيارات بحد أقصى)',\n        (numGroup == 1) ? 'تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)'\n      ];\n    },\n    selectAllText: 'إختيار الجميع',\n    deselectAllText: 'إلغاء إختيار الجميع',\n    multipleSeparator: '، '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-bg_BG.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: BG (Bulgaria)\n * Region: BG (Bulgaria)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Нищо избрано',\n    noneResultsText: 'Няма резултат за {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} избран елемент\" : \"{0} избрани елемента\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',\n        (numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'\n      ];\n    },\n    selectAllText: 'Избери всички',\n    deselectAllText: 'Размаркирай всички',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-cro_CRO.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: CRO (Croatia)\n * Region: CRO (Croatia)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Odaberite stavku',\n    noneResultsText: 'Nema rezultata pretrage {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} stavka selektirana\" : \"{0} stavke selektirane\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit je postignut ({n} stvar maximalno)' : 'Limit je postignut ({n} stavke maksimalno)',\n        (numGroup == 1) ? 'Grupni limit je postignut ({n} stvar maksimalno)' : 'Grupni limit je postignut ({n} stavke maksimalno)'\n      ];\n    },\n    selectAllText: 'Selektiraj sve',\n    deselectAllText: 'Deselektiraj sve',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-cs_CZ.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: CS\n * Region: CZ (Czech Republic)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nic není vybráno',\n    noneResultsText: 'Žádné výsledky {0}',\n    countSelectedText: 'Označeno {0} z {1}',\n    maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-da_DK.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: DA (Danish)\n * Region: DK (Denmark)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Intet valgt',\n    noneResultsText: 'Ingen resultater fundet {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} valgt\" : \"{0} valgt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',\n        (numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'\n      ];\n    },\n    selectAllText: 'Markér alle',\n    deselectAllText: 'Afmarkér alle',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-de_DE.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: DE (German, deutsch)\n * Region: DE (Germany, Deutschland)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Bitte wählen...',\n    noneResultsText: 'Keine Ergebnisse für {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} Element ausgewählt\" : \"{0} Elemente ausgewählt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit erreicht ({n} Element max.)' : 'Limit erreicht ({n} Elemente max.)',\n        (numGroup == 1) ? 'Gruppen-Limit erreicht ({n} Element max.)' : 'Gruppen-Limit erreicht ({n} Elemente max.)'\n      ];\n    },\n    selectAllText: 'Alles auswählen',\n    deselectAllText: 'Nichts auswählen',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-en_US.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: EN (English)\n * Region: US (United States)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nothing selected',\n    noneResultsText: 'No results match {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} item selected\" : \"{0} items selected\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\n      ];\n    },\n    selectAllText: 'Select All',\n    deselectAllText: 'Deselect All',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-es_CL.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: ES (Spanish)\n * Region: CL (Chile)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'No hay selección',\n    noneResultsText: 'No hay resultados {0}',\n    countSelectedText: 'Seleccionados {0} de {1}',\n    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleccionar Todos',\n    deselectAllText: 'Desmarcar Todos'\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-es_ES.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: ES (Spanish)\n * Region: ES (Spain)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'No hay selección',\n    noneResultsText: 'No hay resultados {0}',\n    countSelectedText: 'Seleccionados {0} de {1}',\n    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleccionar Todos',\n    deselectAllText: 'Desmarcar Todos'\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-eu.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: EU (Basque)\n * Region: \n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Hautapenik ez',\n    noneResultsText: 'Emaitzarik ez {0}',\n    countSelectedText: '{1}(e)tik {0} hautatuta',\n    maxOptionsText: ['Mugara iritsita ({n} {var} gehienez)', 'Taldearen mugara iritsita ({n} {var} gehienez)', ['elementu', 'elementu']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-fa_IR.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: FA (Farsi)\n * Region: IR (Iran)\n */\n(function ($) {\n    $.fn.selectpicker.defaults = {\n        noneSelectedText: 'چیزی انتخاب نشده است',\n        noneResultsText: 'هیج مشابهی برای {0} پیدا نشد',\n        countSelectedText: \"{0} از {1} مورد انتخاب شده\",\n        maxOptionsText: ['بیشتر ممکن نیست {حداکثر {n} عدد}', 'بیشتر ممکن نیست {حداکثر {n} عدد}'],\n        selectAllText: 'انتخاب همه',\n        deselectAllText: 'انتخاب هیچ کدام',\n        multipleSeparator: ', '\n    };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-fi_FI.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: FI (Finnish)\n * Region: FI (Finland)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ei valintoja',\n    noneResultsText: 'Ei hakutuloksia {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} valittu\" : \"{0} valitut\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Valintojen maksimimäärä ({n} saavutettu)' : 'Valintojen maksimimäärä ({n} saavutettu)',\n        (numGroup == 1) ? 'Ryhmän maksimimäärä ({n} saavutettu)' : 'Ryhmän maksimimäärä ({n} saavutettu)'\n      ];\n    },\n    selectAllText: 'Valitse kaikki',\n    deselectAllText: 'Poista kaikki',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-fr_FR.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: FR (French; Français)\n * Region: FR (France)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Aucune sélection',\n    noneResultsText: 'Aucun résultat pour {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected > 1) ? \"{0} éléments sélectionnés\" : \"{0} élément sélectionné\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll > 1) ? 'Limite atteinte ({n} éléments max)' : 'Limite atteinte ({n} élément max)',\n        (numGroup > 1) ? 'Limite du groupe atteinte ({n} éléments max)' : 'Limite du groupe atteinte ({n} élément max)'\n      ];\n    },\n    multipleSeparator: ', ',\n    selectAllText: 'Tout Sélectionner',\n    deselectAllText: 'Tout Dé-selectionner',\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-hu_HU.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: HU (Hungarian)\n * Region: HU (Hungary)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Válasszon!',\n    noneResultsText: 'Nincs találat {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return '{0} elem kiválasztva';\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Legfeljebb {n} elem választható',\n        'A csoportban legfeljebb {n} elem választható'\n      ];\n    },\n    selectAllText: 'Mind',\n    deselectAllText: 'Egyik sem',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-id_ID.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: ID (Indonesian; Bahasa Indonesia)\n * Region: ID (Indonesia)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Tidak ada yang dipilih',\n    noneResultsText: 'Tidak ada yang cocok {0}',\n    countSelectedText: '{0} terpilih',\n    maxOptionsText: ['Mencapai batas (maksimum {n})', 'Mencapai batas grup (maksimum {n})'],\n    selectAllText: 'Pilih Semua',\n    deselectAllText: 'Hapus Semua',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-it_IT.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: IT (Italian; italiano)\n * Region: IT (Italy; Italia)\n * Author: Michele Beltrame <mb@cattlegrid.info>\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nessuna selezione',\n    noneResultsText: 'Nessun risultato per {0}',\n    countSelectedText: function (numSelected, numTotal){\n      return (numSelected == 1) ? 'Selezionato {0} di {1}' : 'Selezionati {0} di {1}';\n    },\n    maxOptionsText: ['Limite raggiunto ({n} {var} max)', 'Limite del gruppo raggiunto ({n} {var} max)', ['elementi', 'elemento']],\n    multipleSeparator: ', ',\n    selectAllText: 'Seleziona Tutto',\n    deselectAllText: 'Deseleziona Tutto'\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-ko_KR.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: KO (Korean)\n * Region: KR (South Korea)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '항목을 선택해주세요',\n    noneResultsText: '{0} 검색 결과가 없습니다',\n    countSelectedText: function (numSelected, numTotal) {\n      return \"{0}개를 선택하였습니다\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        '{n}개까지 선택 가능합니다',\n        '해당 그룹은 {n}개까지 선택 가능합니다'\n      ];\n    },\n    selectAllText: '전체선택',\n    deselectAllText: '전체해제',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-lt_LT.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: LT (Lithuanian)\n * Region: LT (Lithuania)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Niekas nepasirinkta',\n    noneResultsText: 'Niekas nesutapo su {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} elementas pasirinktas\" : \"{0} elementai(-ų) pasirinkta\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Pasiekta riba ({n} elementas daugiausiai)' : 'Riba pasiekta ({n} elementai(-ų) daugiausiai)',\n        (numGroup == 1) ? 'Grupės riba pasiekta ({n} elementas daugiausiai)' : 'Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)'\n      ];\n    },\n    selectAllText: 'Pasirinkti visus',\n    deselectAllText: 'Atmesti visus',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-nb_NO.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: NB (Norwegian; Bokmål)\n * Region: NO (Norway)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ingen valgt',\n    noneResultsText: 'Søket gir ingen treff {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} alternativ valgt\" : \"{0} alternativer valgt\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Grense nådd (maks {n} valg)' : 'Grense nådd (maks {n} valg)',\n        (numGroup == 1) ? 'Grense for grupper nådd (maks {n} grupper)' : 'Grense for grupper nådd (maks {n} grupper)'\n      ];\n    },\n    selectAllText: 'Merk alle',\n    deselectAllText: 'Fjern alle',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-nl_NL.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: NL (Dutch; Nederlands)\n * Region: NL (Europe)\n * Author: Daan Rosbergen (Badmuts)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Niets geselecteerd',\n    noneResultsText: 'Geen resultaten gevonden voor {0}',\n    countSelectedText: '{0} van {1} geselecteerd',\n    maxOptionsText: ['Limiet bereikt ({n} {var} max)', 'Groep limiet bereikt ({n} {var} max)', ['items', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-pl_PL.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: PL (Polish)\n * Region: EU (Europe)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nic nie zaznaczono',\n    noneResultsText: 'Brak wyników wyszukiwania {0}',\n    countSelectedText: 'Zaznaczono {0} z {1}',\n    maxOptionsText: ['Osiągnięto limit ({n} {var} max)', 'Limit grupy osiągnięty ({n} {var} max)', ['elementy', 'element']],\n    selectAll: 'Zaznacz wszystkie',\n    deselectAll: 'Odznacz wszystkie',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-pt_BR.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: PT (Portuguese; português)\n * Region: BR (Brazil; Brasil)\n * Author: Rodrigo de Avila <rodrigo@avila.net.br>\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nada selecionado',\n    noneResultsText: 'Nada encontrado contendo {0}',\n    countSelectedText: 'Selecionado {0} de {1}',\n    maxOptionsText: ['Limite excedido (máx. {n} {var})', 'Limite do grupo excedido (máx. {n} {var})', ['itens', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-pt_PT.js",
    "content": "/*\n* Translated default messages for bootstrap-select.\n* Locale: PT (Portuguese; português)\n* Region: PT (Portugal; Portugal)\n* Author: Burnspirit <burnspirit@gmail.com>\n*/\n(function ($) {\n$.fn.selectpicker.defaults = {\nnoneSelectedText: 'Nenhum seleccionado',\nnoneResultsText: 'Sem resultados contendo {0}',\ncountSelectedText: 'Selecionado {0} de {1}',\nmaxOptionsText: ['Limite ultrapassado (máx. {n} {var})', 'Limite de seleções ultrapassado (máx. {n} {var})', ['itens', 'item']],\nmultipleSeparator: ', '\n};\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-ro_RO.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: RO (Romanian)\n * Region: RO (Romania)\n * Alex Florea <alecz.fia@gmail.com>\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nu a fost selectat nimic',\n    noneResultsText: 'Nu exista niciun rezultat {0}',\n    countSelectedText: '{0} din {1} selectat(e)',\n    maxOptionsText: ['Limita a fost atinsa ({n} {var} max)', 'Limita de grup a fost atinsa ({n} {var} max)', ['iteme', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-ru_RU.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: RU (Russian; Русский)\n * Region: RU (Russian Federation)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Ничего не выбрано',\n    noneResultsText: 'Совпадений не найдено {0}',\n    countSelectedText: 'Выбрано {0} из {1}',\n    maxOptionsText: ['Достигнут предел ({n} {var} максимум)', 'Достигнут предел в группе ({n} {var} максимум)', ['шт.', 'шт.']],\n    doneButtonText: 'Закрыть',\n    selectAllText: 'Выбрать все',\n    deselectAllText: 'Отменить все',    \n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-sk_SK.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: SK\n * Region: SK (Slovak Republic)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Vyberte zo zoznamu',\n    noneResultsText: 'Pre výraz {0} neboli nájdené žiadne výsledky',\n    countSelectedText: 'Vybrané {0} z {1}',\n    maxOptionsText: ['Limit prekročený ({n} {var} max)', 'Limit skupiny prekročený ({n} {var} max)', ['položiek', 'položka']],\n    selectAllText: 'Vybrať všetky',\n    deselectAllText: 'Zrušiť výber',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-sl_SI.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: SL (Slovenian)\n * Region: SI (Slovenia)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Nič izbranega',\n    noneResultsText: 'Ni zadetkov za {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      \"Število izbranih: {0}\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Omejitev dosežena (max. izbranih: {n})',\n        'Omejitev skupine dosežena (max. izbranih: {n})'\n      ];\n    },\n    selectAllText: 'Izberi vse',\n    deselectAllText: 'Počisti izbor',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-sv_SE.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: SV (Swedish)\n * Region: SE (Sweden)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Inget valt',\n    noneResultsText: 'Inget sökresultat matchar {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected === 1) ? \"{0} alternativ valt\" : \"{0} alternativ valda\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        'Gräns uppnåd (max {n} alternativ)',\n        'Gräns uppnåd (max {n} gruppalternativ)'\n      ];\n    },\n    selectAllText: 'Markera alla',\n    deselectAllText: 'Avmarkera alla',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-tr_TR.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: TR (Turkey)\n * Region: TR (Europe)\n * Author: Serhan Güney\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Hiçbiri seçilmedi',\n    noneResultsText: 'Hiçbir sonuç bulunamadı {0}',\n    countSelectedText: function (numSelected, numTotal) {\n      return (numSelected == 1) ? \"{0} öğe seçildi\" : \"{0} öğe seçildi\";\n    },\n    maxOptionsText: function (numAll, numGroup) {\n      return [\n        (numAll == 1) ? 'Limit aşıldı (maksimum {n} sayıda öğe )' : 'Limit aşıldı (maksimum {n} sayıda öğe)',\n        (numGroup == 1) ? 'Grup limiti aşıldı (maksimum {n} sayıda öğe)' : 'Grup limiti aşıldı (maksimum {n} sayıda öğe)'\n      ];\n    },\n    selectAllText: 'Tümünü Seç',\n    deselectAllText: 'Seçiniz',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-ua_UA.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: UA (Ukrainian; Українська)\n * Region: UA (Ukraine)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: 'Нічого не вибрано',\n    noneResultsText: 'Збігів не знайдено {0}',\n    countSelectedText: 'Вибрано {0} із {1}',\n    maxOptionsText: ['Досягнута межа ({n} {var} максимум)', 'Досягнута межа в групі ({n} {var} максимум)', ['items', 'item']],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-zh_CN.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: ZH (Chinese)\n * Region: CN (China)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '没有选中任何项',\n    noneResultsText: '没有找到匹配项',\n    countSelectedText: '选中{1}中的{0}项',\n    maxOptionsText: ['超出限制 (最多选择{n}项)', '组选择超出限制(最多选择{n}组)'],\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/js/i18n/defaults-zh_TW.js",
    "content": "/*\n * Translated default messages for bootstrap-select.\n * Locale: ZH (Chinese)\n * Region: TW (Taiwan)\n */\n(function ($) {\n  $.fn.selectpicker.defaults = {\n    noneSelectedText: '沒有選取任何項目',\n    noneResultsText: '沒有找到符合的結果',\n    countSelectedText: '已經選取{0}個項目',\n    maxOptionsText: ['超過限制 (最多選擇{n}項)', '超過限制(最多選擇{n}組)'],\n    selectAllText: '選取全部',\n    deselectAllText: '全部取消',\n    multipleSeparator: ', '\n  };\n})(jQuery);\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/less/bootstrap-select.less",
    "content": "@import \"variables\";\n\n// Mixins\n.cursor-disabled() {\n  cursor: not-allowed;\n}\n\n// Rules\nselect.bs-select-hidden,\nselect.selectpicker {\n  display: none !important;\n}\n\n.bootstrap-select {\n  width: 220px \\0; /*IE9 and below*/\n\n  // The selectpicker button\n  > .dropdown-toggle {\n    width: 100%;\n    padding-right: 25px;\n    z-index: 1;\n\n    &.bs-placeholder,\n    &.bs-placeholder:hover,\n    &.bs-placeholder:focus,\n    &.bs-placeholder:active { color: @input-color-placeholder; }\n  }\n\n  > select {\n    position: absolute !important;\n    bottom: 0;\n    left: 50%;\n    display: block !important;\n    width: 0.5px !important;\n    height: 100% !important;\n    padding: 0 !important;\n    opacity: 0 !important;\n    border: none;\n\n    &.mobile-device {\n      top: 0;\n      left: 0;\n      display: block !important;\n      width: 100% !important;\n      z-index: 2;\n    }\n  }\n\n  // Error display\n  .has-error & .dropdown-toggle,\n  .error & .dropdown-toggle {\n    border-color: @color-red-error;\n  }\n\n  &.fit-width {\n    width: auto !important;\n  }\n\n  &:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n    width: @width-default;\n  }\n\n  .dropdown-toggle:focus {\n    outline: thin dotted #333333 !important;\n    outline: 5px auto -webkit-focus-ring-color !important;\n    outline-offset: -2px;\n  }\n}\n\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n\n  &:not([class*=\"col-\"]) {\n    width: 100%;\n  }\n\n  &.input-group-btn {\n    z-index: auto;\n\n    &:not(:first-child):not(:last-child) {\n      > .btn {\n        border-radius: 0;\n      }\n    }\n  }\n}\n\n// The selectpicker components\n.bootstrap-select.btn-group {\n  &:not(.input-group-btn),\n  &[class*=\"col-\"] {\n    float: none;\n    display: inline-block;\n    margin-left: 0;\n  }\n\n  // Forces the pull to the right, if necessary\n  &,\n  &[class*=\"col-\"],\n  .row &[class*=\"col-\"] {\n    &.dropdown-menu-right {\n      float: right;\n    }\n  }\n\n  .form-inline &,\n  .form-horizontal &,\n  .form-group & {\n    margin-bottom: 0;\n  }\n\n  .form-group-lg &.form-control,\n  .form-group-sm &.form-control {\n    padding: 0;\n\n    .dropdown-toggle {\n      height: 100%;\n      font-size: inherit;\n      line-height: inherit;\n      border-radius: inherit;\n    }\n  }\n\n  // Set the width of the live search (and any other form control within an inline form)\n  // see https://github.com/silviomoreto/bootstrap-select/issues/685\n  .form-inline & .form-control {\n    width: 100%;\n  }\n\n  &.disabled,\n  > .disabled {\n    .cursor-disabled();\n\n    &:focus {\n      outline: none !important;\n    }\n  }\n\n  &.bs-container {\n    position: absolute;\n    height: 0 !important;\n    padding: 0 !important;\n    \n    .dropdown-menu {\n      z-index: @zindex-select-dropdown;\n    }\n  }\n\n  // The selectpicker button\n  .dropdown-toggle {\n    .filter-option {\n      display: inline-block;\n      overflow: hidden;\n      width: 100%;\n      text-align: left;\n    }\n\n    .caret {\n      position: absolute;\n      top: 50%;\n      right: 12px;\n      margin-top: -2px;\n      vertical-align: middle;\n    }\n  }\n\n  &[class*=\"col-\"] .dropdown-toggle {\n    width: 100%;\n  }\n\n  // The selectpicker dropdown\n  .dropdown-menu {\n    min-width: 100%;\n    box-sizing: border-box;\n\n    &.inner {\n      position: static;\n      float: none;\n      border: 0;\n      padding: 0;\n      margin: 0;\n      border-radius: 0;\n      box-shadow: none;\n    }\n\n    li {\n      position: relative;\n\n      &.active small {\n        color: #fff;\n      }\n\n      &.disabled a {\n        .cursor-disabled();\n      }\n\n      a {\n        cursor: pointer;\n        user-select: none;\n\n        &.opt {\n          position: relative;\n          padding-left: 2.25em;\n        }\n\n        span.check-mark {\n          display: none;\n        }\n\n        span.text {\n          display: inline-block;\n        }\n      }\n\n      small {\n        padding-left: 0.5em;\n      }\n    }\n\n    .notify {\n      position: absolute;\n      bottom: 5px;\n      width: 96%;\n      margin: 0 2%;\n      min-height: 26px;\n      padding: 3px 5px;\n      background: rgb(245, 245, 245);\n      border: 1px solid rgb(227, 227, 227);\n      box-shadow: inset 0 1px 1px fade(rgb(0, 0, 0), 5%);\n      pointer-events: none;\n      opacity: 0.9;\n      box-sizing: border-box;\n    }\n  }\n\n  .no-results {\n    padding: 3px;\n    background: #f5f5f5;\n    margin: 0 5px;\n    white-space: nowrap;\n  }\n\n  &.fit-width .dropdown-toggle {\n    .filter-option {\n      position: static;\n    }\n\n    .caret {\n      position: static;\n      top: auto;\n      margin-top: -1px;\n    }\n  }\n\n  &.show-tick .dropdown-menu li {\n    &.selected a span.check-mark {\n      position: absolute;\n      display: inline-block;\n      right: 15px;\n      margin-top: 5px;\n    }\n\n    a span.text {\n      margin-right: 34px;\n    }\n  }\n}\n\n.bootstrap-select.show-menu-arrow {\n  &.open > .dropdown-toggle {\n    z-index: (@zindex-select-dropdown + 1);\n  }\n\n  .dropdown-toggle {\n    &:before {\n      content: '';\n      border-left: 7px solid transparent;\n      border-right: 7px solid transparent;\n      border-bottom: 7px solid @color-grey-arrow;\n      position: absolute;\n      bottom: -4px;\n      left: 9px;\n      display: none;\n    }\n\n    &:after {\n      content: '';\n      border-left: 6px solid transparent;\n      border-right: 6px solid transparent;\n      border-bottom: 6px solid white;\n      position: absolute;\n      bottom: -4px;\n      left: 10px;\n      display: none;\n    }\n  }\n\n  &.dropup .dropdown-toggle {\n    &:before {\n      bottom: auto;\n      top: -3px;\n      border-top: 7px solid @color-grey-arrow;\n      border-bottom: 0;\n    }\n\n    &:after {\n      bottom: auto;\n      top: -3px;\n      border-top: 6px solid white;\n      border-bottom: 0;\n    }\n  }\n\n  &.pull-right .dropdown-toggle {\n    &:before {\n      right: 12px;\n      left: auto;\n    }\n\n    &:after {\n      right: 13px;\n      left: auto;\n    }\n  }\n\n  &.open > .dropdown-toggle {\n    &:before,\n    &:after {\n      display: block;\n    }\n  }\n}\n\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n\n.bs-actionsbox {\n  width: 100%;\n  box-sizing: border-box;\n\n  & .btn-group button {\n    width: 50%;\n  }\n}\n\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n\n  & .btn-group button {\n    width: 100%;\n  }\n}\n\n.bs-searchbox {\n  & + .bs-actionsbox {\n    padding: 0 8px 4px;\n  }\n\n  & .form-control {\n    margin-bottom: 0;\n    width: 100%;\n    float: none;\n  }\n}\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/less/variables.less",
    "content": "@color-red-error: rgb(185, 74, 72);\n@color-grey-arrow: rgba(204, 204, 204, 0.2);\n\n@width-default: 220px; // 3 960px-grid columns\n\n@zindex-select-dropdown: 1060; // must be higher than a modal background (1050)\n\n//** Placeholder text color\n@input-color-placeholder: #999;"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/nuget/MyGet.ps1",
    "content": "# set env vars usually set by MyGet (enable for local testing)\n#$env:SourcesPath = '..'\n#$env:NuGet = \"./nuget.exe\" #https://dist.nuget.org/win-x86-commandline/latest/nuget.exe\n\n$nuget = $env:NuGet\n\n# parse the version number out of package.json\n$bsversionParts = ((Get-Content $env:SourcesPath\\package.json) -join \"`n\" | ConvertFrom-Json).version.split('-', 2) # split the version on the '-'\n$bsversion = $bsversionParts[0]\n\nif ($bsversionParts.Length -gt 1)\n{\n    $bsversion += '-' + $bsversionParts[1].replace('.', '').replace('-', '_')   # strip out invalid chars from the PreRelease part\n}\n\n# update sourceMappingURL in bootstrap-select.min.js\n(Get-Content $env:SourcesPath\\dist\\js\\bootstrap-select.min.js).replace(\"sourceMappingURL=\", \"sourceMappingURL=Scripts/\") | Set-Content $env:SourcesPath\\dist\\js\\bootstrap-select.min.js\n\n# create packages\n& $nuget pack \"$env:SourcesPath\\nuget\\bootstrap-select.nuspec\" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/nuget/bootstrap-select.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd\">\n    <metadata>\n        <id>bootstrap-select</id>\n        <version>1.12.2</version>\n        <title>bootstrap-select</title>\n        <authors>Silvio Moreto,Ana Carolina,caseyjhol,Matt Bryson,and t0xicCode.</authors>\n        <owners>Silvio Moreto</owners>\n        <projectUrl>https://github.com/silviomoreto/bootstrap-select</projectUrl>\n        <description>Bootstrap-select is a jQuery plugin that utilizes Bootstrap's dropdown.js to style and bring additional functionality to standard select elements.</description>\n        <tags>bootstrap dropdown select</tags>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.8.0\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"dist\\js\\bootstrap-select*.*\" target=\"content\\Scripts\" />\n        <file src=\"dist\\js\\i18n\\*.*\" target=\"content\\Scripts\\i18n\" />\n        <file src=\"dist\\css\\*.*\" target=\"content\\Content\" />\n    </files>\n</package>"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/package.json",
    "content": "{\n  \"name\": \"bootstrap-select\",\n  \"title\": \"bootstrap-select\",\n  \"main\": \"dist/js/bootstrap-select.js\",\n  \"description\": \"Bootstrap-select is a jQuery plugin that utilizes Bootstrap's dropdown.js to style and bring additional functionality to standard select elements.\",\n  \"version\": \"1.12.2\",\n  \"homepage\": \"http://silviomoreto.github.io/bootstrap-select\",\n  \"author\": {\n    \"name\": \"Silvio Moreto\",\n    \"url\": \"https://github.com/silviomoreto\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Silvio Moreto\",\n      \"url\": \"https://github.com/silviomoreto\"\n    },\n    {\n      \"name\": \"Ana Carolina\",\n      \"url\": \"https://github.com/anacarolinats\"\n    },\n    {\n      \"name\": \"caseyjhol\",\n      \"url\": \"https://github.com/caseyjhol\"\n    },\n    {\n      \"name\": \"Matt Bryson\",\n      \"url\": \"https://github.com/mattbryson\"\n    },\n    {\n      \"name\": \"t0xicCode\",\n      \"url\": \"https://github.com/t0xicCode\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/silviomoreto/bootstrap-select.git\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"jquery\": \">=1.8\"\n  },\n  \"devDependencies\": {\n    \"grunt\": \"^1.0.1\",\n    \"grunt-autoprefixer\": \"^3.0.4\",\n    \"grunt-banner\": \"^0.6.0\",\n    \"grunt-contrib-clean\": \"^1.0.0\",\n    \"grunt-contrib-compress\": \"^1.3.0\",\n    \"grunt-contrib-concat\": \"^1.0.1\",\n    \"grunt-contrib-copy\": \"^1.0.0\",\n    \"grunt-contrib-csslint\": \"^2.0.0\",\n    \"grunt-contrib-cssmin\": \"^1.0.2\",\n    \"grunt-contrib-jshint\": \"^1.0.0\",\n    \"grunt-contrib-less\": \"^1.4.0\",\n    \"grunt-contrib-uglify\": \"^2.0.0\",\n    \"grunt-contrib-watch\": \"^1.0.0\",\n    \"grunt-umd\": \"^2.3.6\",\n    \"grunt-version\": \"^1.1.1\",\n    \"load-grunt-tasks\": \"^3.5.2\"\n  },\n  \"keywords\": [\n    \"form\",\n    \"bootstrap\",\n    \"select\",\n    \"replacement\"\n  ]\n}\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/sass/bootstrap-select.scss",
    "content": "@import \"variables\";\n\n// Mixins\n@mixin cursor-disabled() {\n  cursor: not-allowed;\n}\n\n@mixin box-sizing($fmt) {\n  -webkit-box-sizing: $fmt;\n     -moz-box-sizing: $fmt;\n          box-sizing: $fmt;\n}\n\n@mixin box-shadow($fmt) {\n  -webkit-box-shadow: $fmt;\n          box-shadow: $fmt;\n}\n\n@function fade($color, $amnt) {\n  @if $amnt > 1 {\n    $amnt: $amnt / 100; // convert to percentage if int\n  }\n  @return rgba($color, $amnt);\n}\n\n// Rules\nselect.bs-select-hidden,\nselect.selectpicker {\n  display: none !important;\n}\n\n.bootstrap-select {\n  width: 220px \\0; /*IE9 and below*/\n\n  // The selectpicker button\n  > .dropdown-toggle {\n    width: 100%;\n    padding-right: 25px;\n    z-index: 1;\n\n    &.bs-placeholder,\n    &.bs-placeholder:hover,\n    &.bs-placeholder:focus,\n    &.bs-placeholder:active { color: $input-color-placeholder; }\n  }\n\n  > select {\n    position: absolute !important;\n    bottom: 0;\n    left: 50%;\n    display: block !important;\n    width: 0.5px !important;\n    height: 100% !important;\n    padding: 0 !important;\n    opacity: 0 !important;\n    border: none;\n\n    &.mobile-device {\n      top: 0;\n      left: 0;\n      display: block !important;\n      width: 100% !important;\n      z-index: 2;\n    }\n  }\n\n  // Error display\n  .has-error & .dropdown-toggle,\n  .error & .dropdown-toggle {\n    border-color: $color-red-error;\n  }\n\n  &.fit-width {\n    width: auto !important;\n  }\n\n  &:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n    width: $width-default;\n  }\n\n  .dropdown-toggle:focus {\n    outline: thin dotted #333333 !important;\n    outline: 5px auto -webkit-focus-ring-color !important;\n    outline-offset: -2px;\n  }\n}\n\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n\n  &:not([class*=\"col-\"]) {\n    width: 100%;\n  }\n\n  &.input-group-btn {\n    z-index: auto;\n\n    &:not(:first-child):not(:last-child) {\n      > .btn {\n        border-radius: 0;\n      }\n    }\n  }\n}\n\n// The selectpicker components\n.bootstrap-select.btn-group {\n  &:not(.input-group-btn),\n  &[class*=\"col-\"] {\n    float: none;\n    display: inline-block;\n    margin-left: 0;\n  }\n\n  // Forces the pull to the right, if necessary\n  &,\n  &[class*=\"col-\"],\n  .row &[class*=\"col-\"] {\n    &.dropdown-menu-right {\n      float: right;\n    }\n  }\n\n  .form-inline &,\n  .form-horizontal &,\n  .form-group & {\n    margin-bottom: 0;\n  }\n\n  .form-group-lg &.form-control,\n  .form-group-sm &.form-control {\n    padding: 0;\n\n    .dropdown-toggle {\n      height: 100%;\n      font-size: inherit;\n      line-height: inherit;\n      border-radius: inherit;\n    }\n  }\n\n  // Set the width of the live search (and any other form control within an inline form)\n  // see https://github.com/silviomoreto/bootstrap-select/issues/685\n  .form-inline & .form-control {\n    width: 100%;\n  }\n\n  &.disabled,\n  > .disabled {\n    @include cursor-disabled();\n\n    &:focus {\n      outline: none !important;\n    }\n  }\n\n  &.bs-container {\n    position: absolute;\n    height: 0 !important;\n    padding: 0 !important;\n\n    .dropdown-menu {\n      z-index: $zindex-select-dropdown;\n    }\n  }\n\n  // The selectpicker button\n  .dropdown-toggle {\n    .filter-option {\n      display: inline-block;\n      overflow: hidden;\n      width: 100%;\n      text-align: left;\n    }\n\n    .caret {\n      position: absolute;\n      top: 50%;\n      right: 12px;\n      margin-top: -2px;\n      vertical-align: middle;\n    }\n  }\n\n  &[class*=\"col-\"] .dropdown-toggle {\n    width: 100%;\n  }\n\n  // The selectpicker dropdown\n  .dropdown-menu {\n    min-width: 100%;\n    @include box-sizing(border-box);\n\n    &.inner {\n      position: static;\n      float: none;\n      border: 0;\n      padding: 0;\n      margin: 0;\n      border-radius: 0;\n      box-shadow: none;\n    }\n\n    li {\n      position: relative;\n\n      &.active small {\n        color: #fff;\n      }\n\n      &.disabled a {\n        @include cursor-disabled();\n      }\n\n      a {\n        cursor: pointer;\n        user-select: none;\n\n        &.opt {\n          position: relative;\n          padding-left: 2.25em;\n        }\n\n        span.check-mark {\n          display: none;\n        }\n\n        span.text {\n          display: inline-block;\n        }\n      }\n\n      small {\n        padding-left: 0.5em;\n      }\n    }\n\n    .notify {\n      position: absolute;\n      bottom: 5px;\n      width: 96%;\n      margin: 0 2%;\n      min-height: 26px;\n      padding: 3px 5px;\n      background: rgb(245, 245, 245);\n      border: 1px solid rgb(227, 227, 227);\n      @include box-shadow(inset 0 1px 1px fade(rgb(0, 0, 0), 5));\n      pointer-events: none;\n      opacity: 0.9;\n      @include box-sizing(border-box);\n    }\n  }\n\n  .no-results {\n    padding: 3px;\n    background: #f5f5f5;\n    margin: 0 5px;\n    white-space: nowrap;\n  }\n\n  &.fit-width .dropdown-toggle {\n    .filter-option {\n      position: static;\n    }\n\n    .caret {\n      position: static;\n      top: auto;\n      margin-top: -1px;\n    }\n  }\n\n  &.show-tick .dropdown-menu li {\n    &.selected a span.check-mark {\n      position: absolute;\n      display: inline-block;\n      right: 15px;\n      margin-top: 5px;\n    }\n\n    a span.text {\n      margin-right: 34px;\n    }\n  }\n}\n\n.bootstrap-select.show-menu-arrow {\n  &.open > .dropdown-toggle {\n    z-index: ($zindex-select-dropdown + 1);\n  }\n\n  .dropdown-toggle {\n    &:before {\n      content: '';\n      border-left: 7px solid transparent;\n      border-right: 7px solid transparent;\n      border-bottom: 7px solid $color-grey-arrow;\n      position: absolute;\n      bottom: -4px;\n      left: 9px;\n      display: none;\n    }\n\n    &:after {\n      content: '';\n      border-left: 6px solid transparent;\n      border-right: 6px solid transparent;\n      border-bottom: 6px solid white;\n      position: absolute;\n      bottom: -4px;\n      left: 10px;\n      display: none;\n    }\n  }\n\n  &.dropup .dropdown-toggle {\n    &:before {\n      bottom: auto;\n      top: -3px;\n      border-top: 7px solid $color-grey-arrow;\n      border-bottom: 0;\n    }\n\n    &:after {\n      bottom: auto;\n      top: -3px;\n      border-top: 6px solid white;\n      border-bottom: 0;\n    }\n  }\n\n  &.pull-right .dropdown-toggle {\n    &:before {\n      right: 12px;\n      left: auto;\n    }\n\n    &:after {\n      right: 13px;\n      left: auto;\n    }\n  }\n\n  &.open > .dropdown-toggle {\n    &:before,\n    &:after {\n      display: block;\n    }\n  }\n}\n\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n\n.bs-actionsbox {\n  width: 100%;\n  @include box-sizing(border-box);\n\n  & .btn-group button {\n    width: 50%;\n  }\n}\n\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  @include box-sizing(border-box);\n\n  & .btn-group button {\n    width: 100%;\n  }\n}\n\n.bs-searchbox {\n  & + .bs-actionsbox {\n    padding: 0 8px 4px;\n  }\n\n  & .form-control {\n    margin-bottom: 0;\n    width: 100%;\n    float: none;\n  }\n}\n"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/sass/variables.scss",
    "content": "$color-red-error: rgb(185, 74, 72) !default;\n$color-grey-arrow: rgba(204, 204, 204, 0.2) !default;\n\n$width-default: 220px !default; // 3 960px-grid columns\n\n$zindex-select-dropdown: 1060 !default; // must be higher than a modal background (1050)\n\n//** Placeholder text color\n$input-color-placeholder: #999 !default;"
  },
  {
    "path": "assets/bootstrap-select-1.12.2/test.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title>Bootstrap-select test page</title>\n\n  <meta charset=\"utf-8\">\n\n  <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"dist/css/bootstrap-select.css\">\n\n  <style>\n    body {\n      padding-top: 70px;\n    }\n  </style>\n\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js\"></script>\n  <script src=\"dist/js/bootstrap-select.js\"></script>\n</head>\n<body>\n<nav class=\"navbar navbar-default navbar-fixed-top\" role=\"navigation\">\n  <div class=\"container\">\n    <div class=\"navbar-header\">\n      <a class=\"navbar-brand\" href=\"#\">Bootstrap-select usability tests</a>\n    </div>\n  </div>\n</nav>\n\n<div class=\"container\">\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"basic\" class=\"col-lg-2 control-label\">\"Basic\" (liveSearch disabled)</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"basic\" class=\"selectpicker show-tick form-control\">\n          <option>cow</option>\n          <option data-subtext=\"option subtext\">bull</option>\n          <option class=\"get-class\" disabled>ox</option>\n          <optgroup label=\"test\" data-subtext=\"optgroup subtext\">\n            <option>ASD</option>\n            <option selected>Bla</option>\n            <option>Ble</option>\n          </optgroup>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"basic\" class=\"col-lg-2 control-label\">\"Basic\" (liveSearch enabled)</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"basic\" class=\"selectpicker show-tick form-control\" data-live-search=\"true\">\n          <option>cow</option>\n          <option data-subtext=\"option subtext\">bull</option>\n          <option class=\"get-class\" disabled>ox</option>\n          <optgroup label=\"test\" data-subtext=\"optgroup subtext\">\n            <option>ASD</option>\n            <option selected>Bla</option>\n            <option>Ble</option>\n          </optgroup>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"basic2\" class=\"col-lg-2 control-label\">\"Basic\" (multiple, maxOptions=1)</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"basic2\" class=\"show-tick form-control\" multiple>\n          <option>cow</option>\n          <option>bull</option>\n          <option class=\"get-class\" disabled>ox</option>\n          <optgroup label=\"test\" data-subtext=\"another test\">\n            <option>ASD</option>\n            <option selected>Bla</option>\n            <option>Ble</option>\n          </optgroup>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group\">\n      <label for=\"maxOption2\" class=\"col-lg-2 control-label\">multiple, show-menu-arrow, maxOptions=2</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"maxOption2\" class=\"selectpicker show-menu-arrow form-control\" multiple data-max-options=\"2\">\n          <option>chicken</option>\n          <option>turkey</option>\n          <option disabled>duck</option>\n          <option>goose</option>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-inline\">\n    <div class=\"form-group\">\n      <label class=\"col-md-1 control-label\" for=\"lunch\">Lunch:</label>\n    </div>\n    <div class=\"form-group\">\n      <select id=\"lunch\" class=\"selectpicker\" data-live-search=\"true\" title=\"Please select a lunch ...\">\n        <option>Hot Dog, Fries and a Soda</option>\n        <option>Burger, Shake and a Smile</option>\n        <option>Sugar, Spice and all things nice</option>\n        <option>Baby Back Ribs</option>\n        <option>A really really long option made to illustrate an issue with the live search in an inline form</option>\n      </select>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group form-group-lg\">\n      <label for=\"error\" class=\"col-lg-2 control-label\">error</label>\n\n      <div class=\"col-lg-10 error\">\n        <select id=\"error\" class=\"selectpicker show-tick form-control\">\n          <option>pen</option>\n          <option>pencil</option>\n          <option selected>brush</option>\n        </select>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <form class=\"form-horizontal\" role=\"form\">\n    <div class=\"form-group has-error form-group-lg\">\n      <label class=\"control-label col-lg-2\" for=\"country\">error type 2</label>\n\n      <div class=\"col-lg-10\">\n        <select id=\"country\" name=\"country\" class=\"form-control selectpicker\">\n          <option>Argentina</option>\n          <option>United State</option>\n          <option>Mexico</option>\n        </select>\n\n        <p class=\"help-block\">No service available in the selected country</p>\n      </div>\n    </div>\n  </form>\n\n  <hr>\n  <nav class=\"navbar navbar-default\" role=\"navigation\">\n    <div class=\"container-fluid\">\n      <div class=\"navbar-header\">\n        <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      </div>\n\n      <form class=\"navbar-form navbar-left\" role=\"search\">\n        <div class=\"form-group\">\n          <select class=\"selectpicker\" multiple data-live-search=\"true\" data-live-search-placeholder=\"Search\" data-actions-box=\"true\">\n            <optgroup label=\"filter1\">\n              <option>option1</option>\n              <option>option2</option>\n              <option>option3</option>\n              <option>option4</option>\n            </optgroup>\n            <optgroup label=\"filter2\">\n              <option>option1</option>\n              <option>option2</option>\n              <option>option3</option>\n              <option>option4</option>\n            </optgroup>\n            <optgroup label=\"filter3\">\n              <option>option1</option>\n              <option>option2</option>\n              <option>option3</option>\n              <option>option4</option>\n            </optgroup>\n          </select>\n        </div>\n\n        <div class=\"input-group\">\n          <input type=\"text\" class=\"form-control\" placeholder=\"Search\" name=\"q\">\n\n          <div class=\"input-group-btn\">\n            <button class=\"btn btn-default\" type=\"submit\"><i class=\"glyphicon glyphicon-search\"></i></button>\n          </div>\n        </div>\n        <button type=\"submit\" class=\"btn btn-default\">Search</button>\n      </form>\n\n    </div>\n    <!-- .container-fluid -->\n  </nav>\n\n  <hr>\n  <select id=\"first-disabled\" class=\"selectpicker\" data-hide-disabled=\"true\" data-live-search=\"true\">\n    <optgroup disabled=\"disabled\" label=\"disabled\">\n      <option>Hidden</option>\n    </optgroup>\n    <optgroup label=\"Fruit\">\n      <option>Apple</option>\n      <option>Orange</option>\n    </optgroup>\n    <optgroup label=\"Vegetable\">\n      <option>Corn</option>\n      <option>Carrot</option>\n    </optgroup>\n  </select>\n\n  <hr>\n  <select id=\"first-disabled2\" class=\"selectpicker\" multiple data-hide-disabled=\"true\" data-size=\"5\">\n    <option>Apple</option>\n    <option>Banana</option>\n    <option>Orange</option>\n    <option>Pineapple</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n  </select>\n  <button id=\"special\" class=\"btn btn-default\">Hide selected by disabling</button>\n  <button id=\"special2\" class=\"btn btn-default\">Reset</button>\n  <p>Just select 1st element, click button and check list again</p>\n\n  <hr>\n  <div class=\"input-group\">\n    <span class=\"input-group-addon\">@</span>\n    <select class=\"form-control selectpicker\">\n      <option>One</option>\n      <option>Two</option>\n      <option>Three</option>\n    </select>\n  </div>\n\n  <hr>\n  <div class=\"input-group\">\n    <span class=\"input-group-addon\">@</span>\n    <select class=\"form-control selectpicker\" data-mobile=\"true\">\n      <option>One</option>\n      <option>Two</option>\n      <option>Three</option>\n    </select>\n  </div>\n  <p>With <code>data-mobile=\"true\"</code> option.</p>\n\n  <hr>\n  <select id=\"done\" class=\"selectpicker\" multiple data-done-button=\"true\">\n    <option>Apple</option>\n    <option>Banana</option>\n    <option>Orange</option>\n    <option>Pineapple</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n    <option>Apple2</option>\n    <option>Banana2</option>\n    <option>Orange2</option>\n    <option>Pineapple2</option>\n  </select>\n\n  <hr>\n\n  <div class=\"form-group\">\n    <label for=\"tokens\">Key words (data-tokens)</label>\n    <select id=\"tokens\" class=\"selectpicker form-control\" multiple data-live-search=\"true\">\n      <option data-tokens=\"first\">I actually am called \"one\"</option>\n      <option data-tokens=\"second\">And me \"two\"</option>\n      <option data-tokens=\"last\">I am \"three\"</option>\n    </select>\n  </div>\n\n  <hr>\n  <form class=\"form-inline\">\n    <div class=\"form-group\">\n      <label class=\"col-md-1 control-label\" for=\"lunchBegins\">Lunch (Begins search):</label>\n    </div>\n    <div class=\"form-group\">\n      <select id=\"lunchBegins\" class=\"selectpicker\" data-live-search=\"true\" data-live-search-style=\"begins\" title=\"Please select a lunch ...\">\n        <option>Hot Dog, Fries and a Soda</option>\n        <option>Burger, Shake and a Smile</option>\n        <option>Sugar, Spice and all things nice</option>\n        <option>Baby Back Ribs</option>\n        <option>A really really long option made to illustrate an issue with the live search in an inline form</option>\n      </select>\n    </div>\n  </form>\n</div>\n\n<script>\n  $(document).ready(function () {\n    var mySelect = $('#first-disabled2');\n\n    $('#special').on('click', function () {\n      mySelect.find('option:selected').prop('disabled', true);\n      mySelect.selectpicker('refresh');\n    });\n\n    $('#special2').on('click', function () {\n      mySelect.find('option:disabled').prop('disabled', false);\n      mySelect.selectpicker('refresh');\n    });\n\n    $('#basic2').selectpicker({\n      liveSearch: true,\n      maxOptions: 1\n    });\n  });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/CHANGES.md",
    "content": "CKEditor 4 Changelog\r\n====================\r\n\r\n## CKEditor 4.5.7\r\n\r\nNew Features:\r\n\r\n* [#14327](http://dev.ckeditor.com/ticket/14327): Added Swiss German localization.\r\n\r\nOther Changes:\r\n\r\n* [#13816](http://dev.ckeditor.com/ticket/13816): Introduced a new strategy for Filling Character handling to avoid changes in DOM. This fixes the following issues:\r\n\t* [#12727](http://dev.ckeditor.com/ticket/12727): [Blink] `IndexSizeError` when using the [Div Editing Area](http://ckeditor.com/addon/divarea) and [Content Templates](http://ckeditor.com/addon/templates) plugins.\r\n\t* [#13377](http://dev.ckeditor.com/ticket/13377): [Widget](http://ckeditor.com/addon/widget) plugin issue when typing in Korean.\r\n\t* [#13389](http://dev.ckeditor.com/ticket/13389): [Blink] [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) fails when the cursor is next to an `<hr>` tag.\r\n\t* [#13513](http://dev.ckeditor.com/ticket/13513): [Blink, WebKit] [Div Editing Area](http://ckeditor.com/addon/divarea) and [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) throw an error when an image is the only data in the editor.\r\n* [#13884](http://dev.ckeditor.com/ticket/13884): Fixed: Copy/paste table in Firefox results in just first cell being pasted.\r\n* [#14234](http://dev.ckeditor.com/ticket/14234): Fixed: URL input field is not marked as required in the [Embed](http://ckeditor.com/addon/embed) dialog.\r\n\r\n## CKEditor 4.5.6\r\n\r\nNew Features:\r\n\r\n* Introduced the [`CKEDITOR.tools.getCookie()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-getCookie) and [`CKEDITOR.tools.setCookie()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-setCookie) methods for accessing cookies.\r\n* Introduced the [`CKEDITOR.tools.getCsrfToken()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-getCsrfToken) method. The CSRF token is now automatically sent by the [File Browser](http://ckeditor.com/addon/filebrowser) and [File Tools](http://ckeditor.com/addon/filetools) plugins during file uploads. The server-side upload handlers may check it and use it to additionally secure the communication.\r\n\r\nOther Changes:\r\n\r\n* Updated [SCAYT](http://ckeditor.com/addon/scayt) (Spell Check As You Type):\r\n\t- New features:\r\n\t\t- CKEditor [Language](http://ckeditor.com/addon/language) plugin support.\r\n\t\t- CKEditor [Placeholder](http://ckeditor.com/addon/placeholder) plugin support.\r\n\t\t- [Drag&Drop](http://sdk.ckeditor.com/samples/fileupload.html) support.\r\n\t\t- **Experimental** [GRAYT](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-grayt_autoStartup) (Grammar As You Type) functionality.\r\n\t- Fixed issues:\r\n\t\t* [#98](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/98): SCAYT affects dialog double-click. Fixed in SCAYT core.\r\n\t\t* [#102](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/102): SCAYT core performance enhancements.\r\n\t\t* [#104](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/104): SCAYT's spans leak into the clipboard and after pasting.\r\n\t\t* [#105](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/105): A JavaScript error fired in case of multiple instances of CKEditor on one page.\r\n\t\t* [#107](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/107): SCAYT should not check non-editable parts of content.\r\n\t\t* [#108](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/108): Latest SCAYT copies the ID of the editor element to the iframe.\r\n\t\t* SCAYT stops working when CKEditor [Undo plugin](http://ckeditor.com/addon/undo) not enabled.\r\n\t\t* Issue with pasting SCAYT markup in CKEditor.\r\n\t\t* SCAYT stops working after pressing the *Cancel* button in the WSC dialog.\r\n\r\n## CKEditor 4.5.5\r\n\r\nFixed Issues:\r\n\r\n* [#13887](https://dev.ckeditor.com/ticket/13887): Fixed: [Link](http://ckeditor.com/addon/link) plugin alters the `target` attribute value. Thanks to [SamZiemer](https://github.com/SamZiemer)!\r\n* [#12189](http://dev.ckeditor.com/ticket/12189): Fixed: The [Link](http://ckeditor.com/addon/link) plugin dialog does not display the subject of email links if the subject parameter is not lowercase.\r\n* [#9192](http://dev.ckeditor.com/ticket/9192): Fixed: An `undefined` string is appended to an email address added with the [Link](http://ckeditor.com/addon/link) plugin if subject and email body are empty and [`config.emailProtection`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-emailProtection) is set to `encode`.\r\n* [#13790](https://dev.ckeditor.com/ticket/13790): Fixed: It is not possible to destroy the editor `<iframe>` after the editor was detached from DOM. Thanks to [Stefan Rijnhart](https://github.com/StefanRijnhart)!\r\n* [#13803](https://dev.ckeditor.com/ticket/13803): Fixed: The editor cannot be destroyed before being fully initialized. Thanks to [Cyril Fluck](https://github.com/cyril-sf)!\r\n* [#13867](http://dev.ckeditor.com/ticket/13867): Fixed: CKEditor does not work when the `classList` polyfill is used.\r\n* [#13885](http://dev.ckeditor.com/ticket/13885): Fixed: [Enhanced Image](http://ckeditor.com/addon/image2) requires the [Link](http://ckeditor.com/addon/link) plugin to link an image.\r\n* [#13883](http://dev.ckeditor.com/ticket/13883): Fixed: Copying a table using the context menu strips off styles.\r\n* [#13872](http://dev.ckeditor.com/ticket/13872): Fixed: Cutting is possible in the [read-only](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) mode.\r\n* [#12848](http://dev.ckeditor.com/ticket/12848): [Blink] Fixed: Opening the [Find and Replace](http://ckeditor.com/addon/find) dialog window in the [read-only](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) mode throws an exception.\r\n* [#13879](http://dev.ckeditor.com/ticket/13879): Fixed: It is not possible to prevent the [`editor.drop`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-drop) event.\r\n* [#13361](http://dev.ckeditor.com/ticket/13361): Fixed: Skin images fail when the site path includes parentheses because the `background-image` path needs single quotes around the URL value.\r\n* [#13771](http://dev.ckeditor.com/ticket/13771): Fixed: The `contents.css` style is not used if the [IFrame Editing Area](http://ckeditor.com/addon/wysiwygarea) plugin is missing.\r\n* [#13782](http://dev.ckeditor.com/ticket/13782): Fixed: Unclear log messages.\r\n* [#13919](http://dev.ckeditor.com/ticket/13919): [Edge] Fixed: Browser window crashes when accessing the `isContentEditable` property of an `<input>` DOM element.\r\n\r\nOther Changes:\r\n\r\n* [#13859](http://dev.ckeditor.com/ticket/13859): Test cases created with `bender.tools.createTestsForEditors` will also receive editor bot as a second parameter.\r\n\r\n## CKEditor 4.5.4\r\n\r\nNew Features:\r\n\r\n* [#13632](http://dev.ckeditor.com/ticket/13632): Introduce error logging mechanism.\r\n* [#13730](http://dev.ckeditor.com/ticket/13730): Switch to the new error logging mechanism.\r\n\r\nFixed Issues:\r\n\r\n* [#9856](http://dev.ckeditor.com/ticket/9856): Fixed: Cannot use the native context menu together with the [Div Editing Area](http://ckeditor.com/addon/divarea) plugin. Thanks to [Mark Wade](https://github.com/mark-wade)!\r\n* [#12733](http://dev.ckeditor.com/ticket/12733): [IE9+] Fixed: Radio button `onChange` does not work. Thanks to [Iliya Kostadinov](https://github.com/iliyakostadinov)!\r\n* [#13142](http://dev.ckeditor.com/ticket/13142): [Edge] Fixed: *Ctrl+A* and then *Backspace* result in an empty `<div>` element.\r\n* [#13599](http://dev.ckeditor.com/ticket/13599): Fixed: Cross-editor drag and drop of an inline widget results in error/artifacts.\r\n* [#13640](http://dev.ckeditor.com/ticket/13640): [IE] Fixed: Dropping a widget outside the `<body>` element is not handled correctly.\r\n* [#13533](http://dev.ckeditor.com/ticket/13533): Fixed: No progress during upload.\r\n* [#13680](http://dev.ckeditor.com/ticket/13680): Fixed: The parser should allow the `<h1-6>` element to be a child of the `<summary>` element.\r\n* [#11724](http://dev.ckeditor.com/ticket/11724): [Touch devices] Fixed: Drop-downs often hide right after opening them.\r\n* [#13690](http://dev.ckeditor.com/ticket/13690): Fixed: Copying content from IE to Chrome adds an extra paragraph.\r\n* [#13284](http://dev.ckeditor.com/ticket/13284): Fixed: Cannot drag and drop a widget if the text caret is placed just after the widget instance.\r\n* [#13516](http://dev.ckeditor.com/ticket/13516): Fixed: CKEditor removes empty HTML5 anchors without the `name` attribute.\r\n* [#13765](http://dev.ckeditor.com/ticket/13765): [Safari 9] Fixed: Problems with rendering samples.\r\n\r\nOther Changes:\r\n\r\n* [#11725](http://dev.ckeditor.com/ticket/11725): Marked [`CKEDITOR.env.mobile`](http://docs.ckeditor.com/#!/api/CKEDITOR.env-property-mobile) as deprecated. The reason is that it is no longer clear what \"mobile\" means.\r\n* [#13737](http://dev.ckeditor.com/ticket/13737): Upgraded [Bender.js](https://github.com/benderjs/benderjs) to 0.4.1.\r\n\r\n## CKEditor 4.5.3\r\n\r\nNew Features:\r\n\r\n* [#13501](http://dev.ckeditor.com/ticket/13501): Added the [`config.fileTools_defaultFileName`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fileTools_defaultFileName) option to allow setting a default file name for paste uploads.\r\n* [#13603](http://dev.ckeditor.com/ticket/13603): Added support for uploading dropped BMP images.\r\n\r\nFixed Issues:\r\n\r\n* [#13590](http://dev.ckeditor.com/ticket/13590): Fixed: Various issues related to the [Paste from Word](http://ckeditor.com/addon/pastefromword) feature. Fixes also:\r\n  * [#11215](http://dev.ckeditor.com/ticket/11215),\r\n  * [#8780](http://dev.ckeditor.com/ticket/8780),\r\n  * [#12762](http://dev.ckeditor.com/ticket/12762).\r\n* [#13386](http://dev.ckeditor.com/ticket/13386): [Edge] Fixed: Issues with selecting and editing images.\r\n* [#13568](http://dev.ckeditor.com/ticket/13568): Fixed: The [`editor.getSelectedHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getSelectedHtml) method returns invalid results for entire content selection.\r\n* [#13453](http://dev.ckeditor.com/ticket/13453): Fixed: Drag&drop of entire editor content throws an error.\r\n* [#13465](http://dev.ckeditor.com/ticket/13465): Fixed: Error is thrown and the widget is lost on drag&drop if it is the only content of the editor.\r\n* [#13414](http://dev.ckeditor.com/ticket/13414): Fixed: Content auto paragraphing in a nested editable despite editor configuration.\r\n* [#13429](http://dev.ckeditor.com/ticket/13429): Fixed: Incorrect selection after content insertion by the [Auto Embed](http://ckeditor.com/addon/autoembed) plugin.\r\n* [#13388](http://dev.ckeditor.com/ticket/13388): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) integration with [Undo](http://ckeditor.com/addon/undo) is broken.\r\n\r\nOther Changes:\r\n\r\n* [#13637](https://dev.ckeditor.com/ticket/13637): Several icons were refactored.\r\n* Updated [Bender.js](https://github.com/benderjs/benderjs) to 0.3.0 and introduced the ability to run tests via HTTPs ([#13265](https://dev.ckeditor.com/ticket/13265)).\r\n\r\n## CKEditor 4.5.2\r\n\r\nFixed Issues:\r\n\r\n* [#13609](http://dev.ckeditor.com/ticket/13609): [Edge] Fixed: The browser crashes when switching to the source mode. Thanks to [Andrew Williams and Mark Smeed](http://webxsolution.com/)!\r\n* [PR#201](https://github.com/ckeditor/ckeditor-dev/pull/201): Fixed: Buttons in the toolbar configurator cause form submission. Thanks to [colemanw](https://github.com/colemanw)!\r\n* [#13422](http://dev.ckeditor.com/ticket/13422): Fixed: A monospaced font should be used in the `<textarea>` element storing editor configuration in the toolbar configurator.\r\n* [#13494](http://dev.ckeditor.com/ticket/13494): Fixed: Error thrown in the toolbar configurator if plugin requirements are not met.\r\n* [#13409](http://dev.ckeditor.com/ticket/13409): Fixed: List elements incorrectly merged when pressing *Backspace* or *Delete*.\r\n* [#13434](http://dev.ckeditor.com/ticket/13434): Fixed: Dialog state indicator broken in Right–To–Left environments.\r\n* [#13460](http://dev.ckeditor.com/ticket/13460): [IE8] Fixed: Copying inline widgets is broken when [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_acf) is disabled.\r\n* [#13495](http://dev.ckeditor.com/ticket/13495): [Firefox, IE] Fixed: Text is not word-wrapped in the Paste dialog window.\r\n* [#13528](http://dev.ckeditor.com/ticket/13528): [Firefox@Windows] Fixed: Content copied from Microsoft Word and other external applications is pasted as a plain text. Removed the `CKEDITOR.plugins.clipboard.isHtmlInExternalDataTransfer` property as the check must be dynamic.\r\n* [#13583](http://dev.ckeditor.com/ticket/13583): Fixed: [`DataTransfer.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.clipboard.dataTransfer-method-getData) should work consistently in all browsers and should not strip valuable content. Fixed pasting tables from Microsoft Excel on Chrome.\r\n* [#13468](http://dev.ckeditor.com/ticket/13468): [IE] Fixed: Binding drag&drop `dataTransfer` does not work if `text` data was set in the meantime.\r\n* [#13451](http://dev.ckeditor.com/ticket/13451): [IE8-9] Fixed: One drag&drop operation may affect following ones.\r\n* [#13184](http://dev.ckeditor.com/ticket/13184): Fixed: Web page reloaded after a drop on editor UI.\r\n* [#13129](http://dev.ckeditor.com/ticket/13129) Fixed: Block widget blurred after a drop followed by an undo.\r\n* [#13397](http://dev.ckeditor.com/ticket/13397): Fixed: Drag&drop of a widget inside its nested widget crashes the editor.\r\n* [#13385](http://dev.ckeditor.com/ticket/13385): Fixed: [`editor.getSnapshot()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getSnapshot) may return a non-string value.\r\n* [#13419](http://dev.ckeditor.com/ticket/13419): Fixed: The [Auto Link](http://ckeditor.com/addon/autolink) plugin does not encode double quotes in URLs.\r\n* [#13420](http://dev.ckeditor.com/ticket/13420): Fixed: The [Auto Embed](http://ckeditor.com/addon/autoembed) plugin ignores encoded characters in URL parameters.\r\n* [#13410](http://dev.ckeditor.com/ticket/13410): Fixed: Error thrown in the [Auto Embed](http://ckeditor.com/addon/autoembed) plugin when undoing right after pasting a link.\r\n* [#13566](http://dev.ckeditor.com/ticket/13566): Fixed: Suppressed notifications in the [Media Embed Base](http://ckeditor.com/addon/embedbase) plugin.\r\n* [#11616](http://dev.ckeditor.com/ticket/11616): [Chrome] Fixed: Resizing the editor while it is not displayed breaks the editable. Fixes also [#9160](http://dev.ckeditor.com/ticket/9160) and [#9715](http://dev.ckeditor.com/ticket/9715).\r\n* [#11376](http://dev.ckeditor.com/ticket/11376): [IE11] Fixed: Loss of text when pasting bulleted lists from Microsoft Word.\r\n* [#13143](http://dev.ckeditor.com/ticket/13143): [Edge] Fixed: Focus lost when opening the panel.\r\n* [#13387](http://dev.ckeditor.com/ticket/13387): [Edge] Fixed: \"Permission denied\" error thrown when loading the editor with developer tools open.\r\n* [#13574](http://dev.ckeditor.com/ticket/13574): [Edge] Fixed: \"Permission denied\" error thrown when opening editor dialog windows.\r\n* [#13441](http://dev.ckeditor.com/ticket/13441): [Edge] Fixed: The [Clipboard](http://ckeditor.com/addon/clipboard) plugin breaks the state of [Undo](http://ckeditor.com/addon/undo) commands after a paste.\r\n* [#13554](http://dev.ckeditor.com/ticket/13554): [Edge] Fixed: Paste dialog's iframe does not receive focus on show.\r\n* [#13440](http://dev.ckeditor.com/ticket/13440): [Edge] Fixed: Unable to paste a widget.\r\n\r\nOther Changes:\r\n\r\n* [#13421](http://dev.ckeditor.com/ticket/13421): UX improvements to notifications in the [Auto Embed](http://ckeditor.com/addon/autoembed) plugin.\r\n\r\n## CKEditor 4.5.1\r\n\r\nFixed Issues:\r\n\r\n* [#13486](http://dev.ckeditor.com/ticket/13486): Fixed: The [Upload Image](http://ckeditor.com/addon/uploadimage) plugin should log an error, not throw an error when upload URL is not set.\r\n\r\n## CKEditor 4.5\r\n\r\nNew Features:\r\n\r\n* [#13304](http://dev.ckeditor.com/ticket/13304): Added support for passing DOM elements to [`config.sharedSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-sharedSpaces). Thanks to [Undergrounder](https://github.com/Undergrounder)!\r\n* [#13215](http://dev.ckeditor.com/ticket/13215): Added ability to cancel fetching a resource by the Embed plugins.\r\n* [#13213](http://dev.ckeditor.com/ticket/13213): Added the [`dialog#setState()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog-method-setState) method and used it in the [Embed](http://ckeditor.com/addon/embed) dialog to indicate that a resource is being loaded.\r\n* [#13337](http://dev.ckeditor.com/ticket/13337): Added the [`repository.onWidget()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-onWidget) method &mdash; a convenient way to listen to [widget](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget) events through the [repository](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository).\r\n* [#13214](http://dev.ckeditor.com/ticket/13214): Added support for pasting links that convert into embeddable resources on the fly.\r\n\r\nFixed Issues:\r\n\r\n* [#13334](http://dev.ckeditor.com/ticket/13334): Fixed: Error after nesting widgets and playing with undo/redo.\r\n* [#13118](http://dev.ckeditor.com/ticket/13118): Fixed: The [`editor.getSelectedHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getSelectedHtml) method throws an error when called in the source mode.\r\n* [#13158](http://dev.ckeditor.com/ticket/13158): Fixed: Error after canceling a dialog when creating a widget.\r\n* [#13197](http://dev.ckeditor.com/ticket/13197): Fixed: Linked inline [Enhanced Image](http://ckeditor.com/addon/image2) alignment class is not transferred to the widget wrapper.\r\n* [#13199](http://dev.ckeditor.com/ticket/13199): Fixed: [Semantic Embed](http://ckeditor.com/addon/embedsemantic) does not support widget classes.\r\n* [#13003](http://dev.ckeditor.com/ticket/13003): Fixed: Anchors are uploaded when moving them by drag and drop.\r\n* [#13032](http://dev.ckeditor.com/ticket/13032): Fixed: When upload is done, notification update should be marked as important.\r\n* [#13300](http://dev.ckeditor.com/ticket/13300): Fixed: The `internalCommit` argument in the [Image](http://ckeditor.com/addon/image) dialog seems to be never used.\r\n* [#13036](http://dev.ckeditor.com/ticket/13036): Fixed: Notifications are moved 10px to the right.\r\n* [#13280](http://dev.ckeditor.com/ticket/13280): [IE8] Fixed: Undo after inline widget drag&drop throws an error.\r\n* [#13186](http://dev.ckeditor.com/ticket/13186): Fixed: Content dropped into a nested editable is not filtered by [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_acf).\r\n* [#13140](http://dev.ckeditor.com/ticket/13140): Fixed: Error thrown when dropping a block widget right after itself.\r\n* [#13176](http://dev.ckeditor.com/ticket/13176): [IE8] Fixed: Errors on drag&drop of embed widgets.\r\n* [#13015](http://dev.ckeditor.com/ticket/13015): Fixed: Dropping an image file on [Enhanced Image](http://ckeditor.com/addon/image2) causes a page reload.\r\n* [#13080](http://dev.ckeditor.com/ticket/13080): Fixed: Ugly notification shown when the response contains HTML content.\r\n* [#13011](http://dev.ckeditor.com/ticket/13011): [IE8] Fixed: Anchors are duplicated on drag&drop in specific locations.\r\n* [#13105](http://dev.ckeditor.com/ticket/13105): Fixed: Various issues related to [`CKEDITOR.tools.htmlEncode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-htmlEncode) and [`CKEDITOR.tools.htmlDecode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-htmlDecode) methods.\r\n* [#11976](http://dev.ckeditor.com/ticket/11976): [Chrome] Fixed: Copy&paste and drag&drop lists from Microsoft Word.\r\n* [#13128](http://dev.ckeditor.com/ticket/13128): Fixed: Various issues with cloning element IDs:\r\n  * Fixed the default behavior of [`range.cloneContents()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-cloneContents) and [`range.extractContents()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-extractContents) methods which now clone IDs similarly to their native counterparts.\r\n  * Added `cloneId` arguments to the above methods, [`range.splitBlock()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-splitBlock) and [`element.breakParent()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-breakParent). Mind the default values and special behavior in the `extractContents()` method!\r\n  * Fixed issues where IDs were lost on copy&paste and drag&drop.\r\n* Toolbar configurators:\r\n  * [#13185](http://dev.ckeditor.com/ticket/13185): Fixed: Wrong position of the suggestion box if there is not enough space below the caret.\r\n  * [#13138](http://dev.ckeditor.com/ticket/13138): Fixed: The \"Toggle empty elements\" button label is unclear.\r\n  * [#13136](http://dev.ckeditor.com/ticket/13136): Fixed: Autocompleter is far too intrusive.\r\n  * [#13133](http://dev.ckeditor.com/ticket/13133): Fixed: Tab leaves the editor.\r\n  * [#13173](http://dev.ckeditor.com/ticket/13173): Fixed: [`config.removeButtons`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-removeButtons) is ignored by the advanced toolbar configurator.\r\n\r\nOther Changes:\r\n\r\n* [#13119](http://dev.ckeditor.com/ticket/13119): Improved compatibility of editor skins ([Moono](http://ckeditor.com/addon/moono) and [Kama](http://ckeditor.com/addon/kama)) with external web page style sheets.\r\n* Toolbar configurators:\r\n  * [#13147](http://dev.ckeditor.com/ticket/13147): Added buttons to the sticky toolbar.\r\n  * [#13207](http://dev.ckeditor.com/ticket/13207): Used modal window to display toolbar configurator help.\r\n* [#13316](http://dev.ckeditor.com/ticket/13316): Made [`CKEDITOR.env.isCompatible`](http://docs.ckeditor.com/#!/api/CKEDITOR.env-property-isCompatible) a blacklist rather than a whitelist. More about the change in the [Browser Compatibility](http://docs.ckeditor.com/#!/guide/dev_browsers) guide.\r\n* [#13398](http://dev.ckeditor.com/ticket/13398): Renamed `CKEDITOR.fileTools.UploadsRepository` to [`CKEDITOR.fileTools.UploadRepository`](http://docs.ckeditor.com/#!/api/CKEDITOR.fileTools.uploadRepository) and changed all related properties.\r\n* [#13279](http://dev.ckeditor.com/ticket/13279): Reviewed CSS vendor prefixes.\r\n* [#13454](http://dev.ckeditor.com/ticket/13454): Removed unused `lang.image.alertUrl` token from the [Image](http://ckeditor.com/addon/image) plugin.\r\n\r\n## CKEditor 4.5 Beta\r\n\r\nNew Features:\r\n\r\n* Clipboard (copy&paste, drag&drop) and file uploading features and improvements ([#11437](http://dev.ckeditor.com/ticket/11437)).\r\n\r\n  * Major features:\r\n    * Support for dropping and pasting files into the editor was introduced. Through a set of new facades for native APIs it is now possible to easily intercept and process inserted files.\r\n    * [File upload tools](http://docs.ckeditor.com/#!/api/CKEDITOR.fileTools) were introduced in order to simplify controlling the loading, uploading and handling server response, properly handle [new upload configuration](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-uploadUrl) options, etc.\r\n    * [Upload Image](http://ckeditor.com/addon/uploadimage) widget was introduced to upload dropped images. A base class for the [upload widget](http://docs.ckeditor.com/#!/api/CKEDITOR.fileTools.uploadWidgetDefinition) was exposed, too, to make it simple to create new types of upload widgets which can handle any type of dropped file, show the upload progress and update the content when the process is done. It also handles editing and undo/redo operations when a file is being uploaded and integrates with the [notification aggregator](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.notificationAggregator) to show progress and success or error.\r\n    * All drag and drop operations were integrated with the editor. All dropped content is passed through the [`editor#paste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-paste) event and a set of new editor events was introduced &mdash; [`dragstart`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-dragstart), [`drop`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-drop), [`dragend`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-dragend).\r\n    * The [Data Transfer](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.clipboard.dataTransfer) facade was introduced to unify access to data in various types and files. [Data Transfer](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.clipboard.dataTransfer) is now always available in the [`editor#paste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-paste) event.\r\n    * Switched from the pastebin to using the native clipboard access whenever possible. This solved many issues related to pastebin such as unnecessary scrolling or data loss. Additionally, on copy and cut from the editor the clipboard data is set. Therefore, on paste the editor has access to clean data, undisturbed by the browsers.\r\n    * Drag and drop of inline and block widgets was integrated with the standard clipboard APIs. By listening to drag events you will thus be notified about widgets, too. This opens a possibility to filter pasted and dropped widgets.\r\n    * The [`editor#paste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-paste) event can have the `range` parameter so it is possible to change the paste position in the listener or paste in the not selectable position. Also the [`editor.insertHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertHtml) method now accepts `range` as an additional parameter.\r\n    * [#11621](http://dev.ckeditor.com/ticket/11621): A configurable [paste filter](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-pasteFilter) was introduced. The filter is by default turned to `'semantic-content'` on Webkit and Blink for all pasted content coming from external sources because of the low quality of HTML that these engines put into the clipboard. Internal and cross-editor paste is safe due to the change explained in the previous point.\r\n\r\n  * Other changes and related fixes:\r\n    * [#12095](http://dev.ckeditor.com/ticket/12095): On drag and copy of widgets [the same method](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getSelectedHtml) is used to get selected HTML as in the normal case. Thanks to that styles applied to inline widgets are not lost.\r\n    * [#11219](http://dev.ckeditor.com/ticket/11219): Fixed: Dragging a [captioned image](http://ckeditor.com/addon/image2) does not fire the [`editor#paste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-paste) event.\r\n    * [#9554](http://dev.ckeditor.com/ticket/9554): [Webkit Mac] Fixed: Editor scrolls on paste.\r\n    * [#9898](http://dev.ckeditor.com/ticket/9898): [Webkit&Divarea] Fixed: Pasting causes undesirable scrolling.\r\n    * [#11993](http://dev.ckeditor.com/ticket/11993): [Chrome] Fixed: Pasting content scrolls the document.\r\n    * [#12613](http://dev.ckeditor.com/ticket/12613): Show the user that they can not drop on editor UI (toolbar, bottom bar).\r\n    * [#12851](http://dev.ckeditor.com/ticket/12851): [Blink/Webkit] Fixed: Formatting disappears when pasting content into cells.\r\n    * [#12914](http://dev.ckeditor.com/ticket/12914): Fixed: Copy/Paste of table broken in `div`-based editor.\r\n\r\n  * Browser support.<br>Browser support for related features varies significantly (see http://caniuse.com/clipboard).\r\n    * File APIs needed to operate and file upload is not supported in Internet Explorer 9 and below.\r\n    * Only Chrome and Safari on Mac OS support setting custom data items in the clipboard, so currently it is possible to recognize the origin of the copied content in these browsers only. All drag and drop operations can be identified thanks to the new Data Transfer facade.\r\n    * No Internet Explorer browser supports the standard clipboard API which results in small glitches like where only plain text can be dropped from outside the editor. Thanks to the new Data Transfer facade, internal and cross-editor drag and drop supports the full range of data.\r\n    * Direct access to clipboard could only be implemented in Chrome, Safari on Mac OS, Opera and Firefox. In other browsers the pastebin must still be used.\r\n\r\n* [#12875](http://dev.ckeditor.com/ticket/12875): Samples and toolbar configuration tools.\r\n  * The old set of samples shipped with every CKEditor package was replaced with a shiny new single-page sample. This change concluded a long term plan which started from introducing the [CKEditor SDK](http://sdk.ckeditor.com/) and [CKEditor Functionality Overview](http://docs.ckeditor.com/#!/guide/dev_features) section in the documentation which essentially redefined the old samples.\r\n  * Toolbar configurators with live previews were introduced. They will be shipped with every CKEditor package and are meant to help in configuring toolbar layouts.\r\n\r\n* [#10925](http://dev.ckeditor.com/ticket/10925): The [Media Embed](http://ckeditor.com/addon/embed) and [Semantic Media Embed](http://ckeditor.com/addon/embedsemantic) plugins were introduced. Read more about the new features in the [Embedding Content](http://docs.ckeditor.com/#!/guide/dev_media_embed) article.\r\n* [#10931](http://dev.ckeditor.com/ticket/10931): Added support for nesting widgets. It is now possible to insert one widget into another widget's nested editable. Note that unless nested editable's [allowed content](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.nestedEditable.definition-property-allowedContent) is defined precisely, starting from CKEditor 4.5 some widget buttons may become enabled. This feature is not supported in IE8. Included issues:\r\n  * [#12018](http://dev.ckeditor.com/ticket/12018): Fixed and reviewed: Nested widgets garbage collection.\r\n  * [#12024](http://dev.ckeditor.com/ticket/12024): [Firefox] Fixed: Outline is extended to the left by unpositioned drag handlers.\r\n  * [#12006](http://dev.ckeditor.com/ticket/12006): Fixed: Drag and drop of nested block widgets.\r\n  * [#12008](http://dev.ckeditor.com/ticket/12008): Fixed various cases of inserting a single non-editable element using the [`editor.insertHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertHtml) method. Fixes pasting a widget with a nested editable inside another widget's nested editable.\r\n\r\n* Notification system:\r\n  * [#11580](http://dev.ckeditor.com/ticket/11580): Introduced the [notification system](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.notification).\r\n  * [#12810](http://dev.ckeditor.com/ticket/12810): Introduced a [notification aggregator](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.notificationAggregator) for the [notification system](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.notification) which simplifies displaying progress of many concurrent tasks.\r\n* [#11636](http://dev.ckeditor.com/ticket/11636): Introduced new, UX-focused, methods for getting selected HTML and deleting it &mdash; [`editor.getSelectedHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getSelectedHtml) and [`editor.deleteSelectedHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getSelectedHtml).\r\n* [#12416](http://dev.ckeditor.com/ticket/12416): Added the [`widget.definition.upcastPriority`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-upcastPriority) property which gives more control over widget upcasting order to the widget author.\r\n* [#12036](http://dev.ckeditor.com/ticket/12036): Initialize the editor in [read-only](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) mode when the `<textarea>` element has a `readonly` attribute.\r\n* [#11905](http://dev.ckeditor.com/ticket/11905): The [`resize` event](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-resize) passes the current dimensions in its data.\r\n* [#12126](http://dev.ckeditor.com/ticket/12126): Introduced [`config.image_prefillDimensions`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image_prefillDimensions) and [`config.image2_prefillDimensions`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_prefillDimensions) to make pre-filling `width` and `height` configurable for the [Enhanced Image](http://ckeditor.com/addon/image2).\r\n* [#12746](http://dev.ckeditor.com/ticket/12746): Added a new configuration option to hide the [Enhanced Image](http://ckeditor.com/addon/image2) resizer.\r\n* [#12150](http://dev.ckeditor.com/ticket/12150): Exposed the [`getNestedEditable()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-static-method-getNestedEditable) and `is*` [widget helper](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget) functions (see the static methods).\r\n* [#12448](http://dev.ckeditor.com/ticket/12448): Introduced the [`editable.insertHtmlIntoRange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertHtmlIntoRange) method.\r\n* [#12143](http://dev.ckeditor.com/ticket/12143): Added the [`config.floatSpacePreferRight`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-floatSpacePreferRight) configuration option that switches the alignment of the floating toolbar. Thanks to [InvisibleBacon](http://github.com/InvisibleBacon)!\r\n* [#10986](http://dev.ckeditor.com/ticket/10986): Added support for changing dialog input and textarea text directions by using the *Shift+Alt+Home/End* keystrokes. The direction is stored in the value of the input by prepending the [`\\u202A`](http://unicode.org/cldr/utility/character.jsp?a=202A) or [`\\u202B`](http://unicode.org/cldr/utility/character.jsp?a=202B) marker to it. Read more in the [documentation](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog.definition.textInput-property-bidi). Thanks to [edithkk](https://github.com/edithkk)!\r\n* [#12770](http://dev.ckeditor.com/ticket/12770): Added support for passing [widget](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget)'s startup data as a widget command's argument. Thanks to [Rebrov Boris](https://github.com/zipp3r) and [Tieme van Veen](https://github.com/tiemevanveen)!\r\n* [#11583](http://dev.ckeditor.com/ticket/11583): Added support for the HTML5 `required` attribute in various form elements. Thanks to [Steven Busse](https://github.com/sbusse)!\r\n\r\nChanges:\r\n\r\n* [#12858](http://dev.ckeditor.com/ticket/12858): Basic [Spartan](http://blogs.windows.com/bloggingwindows/2015/03/30/introducing-project-spartan-the-new-browser-built-for-windows-10/) browser compatibility. Full compatibility will be introduced later, because at the moment Spartan is still too unstable to be used for tests and we see many changes from version to version.\r\n* [#12948](http://dev.ckeditor.com/ticket/12948): The [`config.mathJaxLibrary`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-mathJaxLib) option does not default to the MathJax CDN any more. It needs to be configured to enable the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin now.\r\n* [#13069](http://dev.ckeditor.com/ticket/13069): Fixed inconsistencies between [`editable.insertHtml()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElement) and [`editable.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElement) when the `range` parameter is used. Now, the `editor.insertElement()` method works on a higher level, which means that it saves undo snapshots and sets the selection after insertion. Use the [`editable.insertElementIntoRange()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElementIntoRange) method directly for the pre 4.5 behavior of `editable.insertElement()`.\r\n* [#12870](http://dev.ckeditor.com/ticket/12870): Use [`editor.showNotification()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-showNotification) instead of `alert()` directly whenever possible. When the [Notification plugin](http://ckeditor.com/addon/notification) is loaded, the notification system is used automatically. Otherwise, the native `alert()` is displayed.\r\n* [#8024](http://dev.ckeditor.com/ticket/8024): Swapped behavior of the Split Cell Vertically and Horizontally features of the [Table Tools](http://ckeditor.com/addon/tabletools) plugin to be more intuitive. Thanks to [kevinisagit](https://github.com/kevinisagit)!\r\n* [#10903](http://dev.ckeditor.com/ticket/10903): Performance improvements for the [`dom.element.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-addClass), [`dom.element.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-removeClass) and [`dom.element.hasClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-hasClass) methods. Note: The previous implementation allowed passing multiple classes to `addClass()` although it was only a side effect of that implementation. The new implementation does not allow this.\r\n* [#11856](http://dev.ckeditor.com/ticket/11856): The jQuery adapter throws a meaningful error if CKEditor or jQuery are not loaded.\r\n\r\nFixed issues:\r\n\r\n* [#11586](http://dev.ckeditor.com/ticket/11586): Fixed: [`range.cloneContents()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-cloneContents) should not change the DOM in order not to affect selection.\r\n* [#12148](http://dev.ckeditor.com/ticket/12148): Fixed: [`dom.element.getChild()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-getChild) should not modify a passed array.\r\n* [#12503](http://dev.ckeditor.com/ticket/12503): [Blink/Webkit] Fixed: Incorrect result of Select All and *Backspace* or *Delete*.\r\n* [#13001](http://dev.ckeditor.com/ticket/13001): [Firefox] Fixed: The `<br />` filler is placed in the wrong position by the [`range.fixBlock()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-fixBlock) method due to quirky Firefox behavior.\r\n* [#13101](http://dev.ckeditor.com/ticket/13101): [IE8] Fixed: Colons are prepended to HTML5 element names when cloning them.\r\n\r\n## CKEditor 4.4.8\r\n\r\n**Security Updates:**\r\n\r\n* Fixed XSS vulnerability in the HTML parser reported by [Dheeraj Joshi](https://twitter.com/dheerajhere) and [Prem Kumar](https://twitter.com/iAmPr3m).\r\n\r\n\tIssue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode.\r\n\r\n**An upgrade is highly recommended!**\r\n\r\nFixed Issues:\r\n\r\n* [#12899](http://dev.ckeditor.com/ticket/12899): Fixed: Corrected wrong tag ending for horizontal box definition in the [Dialog User Interface](http://ckeditor.com/addon/dialogui) plugin. Thanks to [mizafish](https://github.com/mizafish)!\r\n* [#13254](http://dev.ckeditor.com/ticket/13254): Fixed: Cannot outdent block after indent when using the [Div Editing Area](http://ckeditor.com/addon/divarea) plugin. Thanks to [Jonathan Cottrill](https://github.com/jcttrll)!\r\n* [#13268](http://dev.ckeditor.com/ticket/13268): Fixed: Documentation for [`CKEDITOR.dom.text`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.text) is incorrect. Thanks to [Ben Kiefer](https://github.com/benkiefer)!\r\n* [#12739](http://dev.ckeditor.com/ticket/12739): Fixed: Link loses inline styles when edited without the [Advanced Tab for Dialogs](http://ckeditor.com/addon/dialogadvtab) plugin. Thanks to [Віталій Крутько](https://github.com/asmforce)!\r\n* [#13292](http://dev.ckeditor.com/ticket/13292): Fixed: Protection pattern does not work in attribute in self-closing elements with no space before `/>`. Thanks to [Віталій Крутько](https://github.com/asmforce)!\r\n* [PR#192](https://github.com/ckeditor/ckeditor-dev/pull/192): Fixed: Variable name typo in the [Dialog User Interface](http://ckeditor.com/addon/dialogui) plugin which caused [`CKEDITOR.ui.dialog.radio`](http://docs.ckeditor.com/#!/api/CKEDITOR.ui.dialog.radio) validation to not work. Thanks to [Florian Ludwig](https://github.com/FlorianLudwig)!\r\n* [#13232](http://dev.ckeditor.com/ticket/13232): [Safari] Fixed: The [`element.appendText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-appendText) method does not work properly for empty elements.\r\n* [#13233](http://dev.ckeditor.com/ticket/13233): Fixed: [HTMLDataProcessor](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor) can process `foo:href` attributes.\r\n* [#12796](http://dev.ckeditor.com/ticket/12796): Fixed: The [Indent List](http://ckeditor.com/addon/indentlist) plugin unwraps parent `<li>` elements. Thanks to [Andrew Stucki](https://github.com/andrewstucki)!\r\n* [#12885](http://dev.ckeditor.com/ticket/12885): Added missing [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) parameter documentation.\r\n* [#11982](http://dev.ckeditor.com/ticket/11982): Fixed: Bullet added in a wrong position after the *Enter* key is pressed in a nested list.\r\n* [#13027](http://dev.ckeditor.com/ticket/13027): Fixed: Keyboard navigation in dialog windows with multiple tabs not following IBM CI 162 instructions or [ARIA Authoring Practices](http://www.w3.org/TR/2013/WD-wai-aria-practices-20130307/#tabpanel).\r\n* [#12256](http://dev.ckeditor.com/ticket/12256): Fixed: Basic styles classes are lost when pasting from Microsoft Word if [basic styles](http://ckeditor.com/addon/basicstyles) were configured to use classes.\r\n* [#12729](http://dev.ckeditor.com/ticket/12729): Fixed: Incorrect structure created when merging a block into a list item on *Backspace* and *Delete*.\r\n* [#13031](http://dev.ckeditor.com/ticket/13031): [Firefox] Fixed: No more line breaks in source view since Firefox 36.\r\n* [#13131](http://dev.ckeditor.com/ticket/13131): Fixed: The [Code Snippet](http://ckeditor.com/addon/codesnippet) plugin cannot be used without the [IFrame Editing Area](http://ckeditor.com/addon/wysiwygarea) plugin.\r\n* [#9086](http://dev.ckeditor.com/ticket/9086): Fixed: Invalid ARIA property used on paste area `<iframe>`.\r\n* [#13164](http://dev.ckeditor.com/ticket/13164): Fixed: Error when inserting a hidden field.\r\n* [#13155](http://dev.ckeditor.com/ticket/13155): Fixed: Incorrect [Line Utilities](http://ckeditor.com/addon/lineutils) positioning when `<body>` has a margin.\r\n* [#13351](http://dev.ckeditor.com/ticket/13351): Fixed: Link lost when editing a linked image with the Link tab disabled. This also fixed a bug when inserting an image into a fully selected link would throw an error ([#12847](https://dev.ckeditor.com/ticket/12847)).\r\n* [#13344](http://dev.ckeditor.com/ticket/13344): [WebKit/Blink] Fixed: It is possible to remove or change editor content in [read-only mode](http://docs.ckeditor.com/#!/guide/dev_readonly).\r\n\r\nOther Changes:\r\n\r\n* [#12844](http://dev.ckeditor.com/ticket/12844) and [#13103](http://dev.ckeditor.com/ticket/13103): Upgraded the [testing environment](http://docs.ckeditor.com/#!/guide/dev_tests) to [Bender.js](https://github.com/benderjs/benderjs) `0.2.3`.\r\n* [#12930](http://dev.ckeditor.com/ticket/12930): Because of licensing issues, `truncated-mathjax/` is now removed from the `tests/` directory. Now `bender.config.mathJaxLibPath` must be configured manually in order to run [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin tests.\r\n* [#13266](http://dev.ckeditor.com/ticket/13266): Added more shades of gray in the [Color Dialog](http://ckeditor.com/addon/colordialog) window. Thanks to [mizafish](https://github.com/mizafish)!\r\n\r\n\r\n## CKEditor 4.4.7\r\n\r\nFixed Issues:\r\n\r\n* [#12825](http://dev.ckeditor.com/ticket/12825): Fixed: Preventing the [Table Resize](http://ckeditor.com/addon/tableresize) plugin from operating on elements outside the editor. Thanks to [Paul Martin](https://github.com/Paul-Martin)!\r\n* [#12157](http://dev.ckeditor.com/ticket/12157): Fixed: Lost text formatting on pressing *Tab* when the [`config.tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces) configuration option value was greater than zero.\r\n* [#12777](http://dev.ckeditor.com/ticket/12777): Fixed: The `table-layout` CSS property should be reset by skins. Thanks to [vita10gy](https://github.com/vita10gy)!\r\n* [#12812](http://dev.ckeditor.com/ticket/12812): Fixed: An uncaught security exception is thrown when [Line Utilities](http://ckeditor.com/addon/lineutils) are used in an inline editor loaded in a cross-domain `iframe`. Thanks to [Vitaliy Zurian](https://github.com/thecatontheflat)!\r\n* [#12735](http://dev.ckeditor.com/ticket/12735): Fixed: [`config.fillEmptyBlocks`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fillEmptyBlocks) should only apply when outputting data.\r\n* [#10032](http://dev.ckeditor.com/ticket/10032): Fixed: [Paste from Word](http://ckeditor.com/addon/pastefromword) filter is executed for every paste after using the button.\r\n* [#12597](http://dev.ckeditor.com/ticket/12597): [Blink/WebKit] Fixed: Multi-byte Japanese characters entry not working properly after *Shift+Enter*.\r\n* [#12387](http://dev.ckeditor.com/ticket/12387): Fixed: An error is thrown if a skin does not have the [`chameleon`](http://docs.ckeditor.com/#!/api/CKEDITOR.skin-method-chameleon) property defined and [`config.uiColor`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-uiColor) is defined.\r\n* [#12747](http://dev.ckeditor.com/ticket/12747): [IE8-10] Fixed: Opening a drop-down for a specific selection when the editor is maximized results in incorrect drop-down panel position.\r\n* [#12850](http://dev.ckeditor.com/ticket/12850): [IEQM] Fixed: An error is thrown after focusing the editor.\r\n\r\n## CKEditor 4.4.6\r\n\r\n**Security Updates:**\r\n\r\n* Fixed XSS vulnerability in the HTML parser reported by [Maco Cortes](https://www.facebook.com/Maaacoooo).\r\n\r\n\tIssue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode.\r\n\r\n**An upgrade is highly recommended!**\r\n\r\nNew Features:\r\n\r\n* [#12501](http://dev.ckeditor.com/ticket/12501): Allowed dashes in element names in the [string format of allowed content rules](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules-section-string-format).\r\n* [#12550](http://dev.ckeditor.com/ticket/12550): Added the `<main>` element to the [`CKEDITOR.dtd`](http://docs.ckeditor.com/#!/api/CKEDITOR.dtd).\r\n\r\nFixed Issues:\r\n\r\n* [#12506](http://dev.ckeditor.com/ticket/12506): [Safari] Fixed: Cannot paste into inline editor if the page has `user-select: none` style. Thanks to [shaohua](https://github.com/shaohua)!\r\n* [#12683](http://dev.ckeditor.com/ticket/12683): Fixed: [Filter](http://docs.ckeditor.com/#!/guide/dev_acf) fails to remove custom tags. Thanks to [timselier](https://github.com/timselier)!\r\n* [#12489](http://dev.ckeditor.com/ticket/12489) and [#12491](http://dev.ckeditor.com/ticket/12491): Fixed: Various issues related to restoring the selection after performing operations on filler character. See the [fixed cases](http://dev.ckeditor.com/ticket/12491#comment:4).\r\n* [#12621](http://dev.ckeditor.com/ticket/12621): Fixed: Cannot remove inline styles (bold, italic, etc.) in empty lines.\r\n* [#12630](http://dev.ckeditor.com/ticket/12630): [Chrome] Fixed: Selection is placed outside the paragraph when the [New Page](http://ckeditor.com/addon/newpage) button is clicked. This patch significantly simplified the way how the initial selection (a selection after the content of the editable is overwritten) is being fixed. That might have fixed many related scenarios in all browsers.\r\n* [#11647](http://dev.ckeditor.com/ticket/11647): Fixed: The [`editor.blur`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-blur) event is not fired on first blur after initializing the inline editor on an already focused element.\r\n* [#12601](http://dev.ckeditor.com/ticket/12601): Fixed: [Strikethrough](http://ckeditor.com/addon/basicstyles) button tooltip spelling.\r\n* [#12546](http://dev.ckeditor.com/ticket/12546): Fixed: The Preview tab in the [Document Properties](http://ckeditor.com/addon/docprops) dialog window is always disabled.\r\n* [#12300](http://dev.ckeditor.com/ticket/12300): Fixed: The [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event fired on first navigation key press after typing.\r\n* [#12141](http://dev.ckeditor.com/ticket/12141): Fixed: List items are lost when indenting a list item with content wrapped with a block element.\r\n* [#12515](http://dev.ckeditor.com/ticket/12515): Fixed: Cursor is in the wrong position when undoing after adding an image and typing some text.\r\n* [#12484](http://dev.ckeditor.com/ticket/12484): [Blink/WebKit] Fixed: DOM is changed outside the editor area in a certain case.\r\n* [#12688](http://dev.ckeditor.com/ticket/12688): Improved the tests of the [styles system](http://docs.ckeditor.com/#!/api/CKEDITOR.style) and fixed two minor issues.\r\n* [#12403](http://dev.ckeditor.com/ticket/12403): Fixed: Changing the [font](http://ckeditor.com/addon/font) style should not lead to nesting it in the previous style element.\r\n* [#12609](http://dev.ckeditor.com/ticket/12609): Fixed: Incorrect `config.magicline_putEverywhere` name used for a [Magic Line](http://ckeditor.com/addon/magicline) all-encompassing [`config.magicline_everywhere`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-magicline_everywhere) configuration option.\r\n\r\n\r\n## CKEditor 4.4.5\r\n\r\nNew Features:\r\n\r\n* [#12279](http://dev.ckeditor.com/ticket/12279): Added a possibility to pass a custom evaluator to [`node.getAscendant()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.node-method-getAscendant).\r\n\r\nFixed Issues:\r\n\r\n* [#12423](http://dev.ckeditor.com/ticket/12423): [Safari7.1+] Fixed: *Enter* key moved cursor to a strange position.\r\n* [#12381](http://dev.ckeditor.com/ticket/12381): [iOS] Fixed: Selection issue. Thanks to [Remiremi](https://github.com/Remiremi)!\r\n* [#10804](http://dev.ckeditor.com/ticket/10804): Fixed: `CKEDITOR_GETURL` is not used with some plugins where it should be used. Thanks to [Thomas Andraschko](https://github.com/tandraschko)!\r\n* [#9137](http://dev.ckeditor.com/ticket/9137): Fixed: The `<base>` tag is not created when `<head>` has an attribute. Thanks to [naoki.fujikawa](https://github.com/naoki-fujikawa)!\r\n* [#12377](http://dev.ckeditor.com/ticket/12377): Fixed: Errors thrown in the [Image](http://ckeditor.com/addon/image) plugin when removing preview from the dialog window definition. Thanks to [Axinet](https://github.com/Axinet)!\r\n* [#12162](http://dev.ckeditor.com/ticket/12162): Fixed: Auto paragraphing and *Enter* key in nested editables.\r\n* [#12315](http://dev.ckeditor.com/ticket/12315): Fixed: Marked [`config.autoParagraph`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-autoParagraph) as deprecated.\r\n* [#12113](http://dev.ckeditor.com/ticket/12113): Fixed: A [code snippet](http://ckeditor.com/addon/codesnippet) should be presented in the [elements path](http://ckeditor.com/addon/elementspath) as \"code snippet\" (translatable).\r\n* [#12311](http://dev.ckeditor.com/ticket/12311): Fixed: [Remove Format](http://ckeditor.com/addon/removeformat) should also remove `<cite>` elements.\r\n* [#12261](http://dev.ckeditor.com/ticket/12261): Fixed: Filter has to be destroyed and removed from [`CKEDITOR.filter.instances`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-static-property-instances) on editor destroy.\r\n* [#12398](http://dev.ckeditor.com/ticket/12398): Fixed: [Maximize](http://ckeditor.com/addon/maximize) does not work on an instance without a [title](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title).\r\n* [#12097](http://dev.ckeditor.com/ticket/12097): Fixed: JAWS not reading the number of options correctly in the [Text Color and Background Color](http://ckeditor.com/addon/colorbutton) button menu.\r\n* [#12411](http://dev.ckeditor.com/ticket/12411): Fixed: [Page Break](http://ckeditor.com/addon/pagebreak) used directly in the editable breaks the editor.\r\n* [#12354](http://dev.ckeditor.com/ticket/12354): Fixed: Various issues in undo manager when holding keys.\r\n* [#12324](http://dev.ckeditor.com/ticket/12324): [IE8] Fixed: Undo steps are not recorded when changing the caret position by clicking below the body.\r\n* [#12332](http://dev.ckeditor.com/ticket/12332): Fixed: Lowered DOM events listeners' priorities in undo manager in order to avoid ambiguity.\r\n* [#12402](http://dev.ckeditor.com/ticket/12402): [Blink] Fixed: Workaround for Blink bug with `document.title` which breaks updating title in the full HTML mode.\r\n* [#12338](http://dev.ckeditor.com/ticket/12338): Fixed: The CKEditor package contains unoptimized images.\r\n\r\n\r\n## CKEditor 4.4.4\r\n\r\nFixed Issues:\r\n\r\n* [#12268](http://dev.ckeditor.com/ticket/12268): Cleanup of [UI Color](http://ckeditor.com/addon/uicolor) YUI styles. Thanks to [CasherWest](https://github.com/CasherWest)!\r\n* [#12263](http://dev.ckeditor.com/ticket/12263): Fixed: [Paste from Word](http://ckeditor.com/addon/pastefromword) filter does not properly normalize semicolons style text. Thanks to [Alin Purcaru](https://github.com/mesmerizero)!\r\n* [#12243](http://dev.ckeditor.com/ticket/12243): Fixed: Text formatting lost when pasting from Word. Thanks to [Alin Purcaru](https://github.com/mesmerizero)!\r\n* [#111739](http://dev.ckeditor.com/ticket/11739): Fixed: `keypress` listeners should not be used in the undo manager. A complete rewrite of keyboard handling in the undo manager was made. Numerous smaller issues were fixed, among others:\r\n  * [#10926](http://dev.ckeditor.com/ticket/10926): [Chrome@Android] Fixed: Typing does not record snapshots and does not fire the [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event.\r\n  * [#11611](http://dev.ckeditor.com/ticket/11611): [Firefox] Fixed: The [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event is fired when pressing Arrow keys.\r\n  * [#12219](http://dev.ckeditor.com/ticket/12219): [Safari] Fixed: Some modifications of the [`UndoManager.locked`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-property-locked) property violate strict mode in the [Undo](http://ckeditor.com/addon/undo) plugin.\r\n* [#10916](http://dev.ckeditor.com/ticket/10916): Fixed: [Magic Line](http://ckeditor.com/addon/magicline) icon in Right-To-Left environments.\r\n* [#11970](http://dev.ckeditor.com/ticket/11970): [IE] Fixed: CKEditor `paste` event is not fired when pasting with *Shift+Ins*.\r\n* [#12111](http://dev.ckeditor.com/ticket/12111): Fixed: Linked image attributes are not read when opening the image dialog window by doubleclicking.\r\n* [#10030](http://dev.ckeditor.com/ticket/10030): [IE] Fixed: Prevented \"Unspecified Error\" thrown in various cases when IE8-9 does not allow access to `document.activeElement`.\r\n* [#12273](http://dev.ckeditor.com/ticket/12273): Fixed: Applying block style in a description list breaks it.\r\n* [#12218](http://dev.ckeditor.com/ticket/12218): Fixed: Minor syntax issue in CSS files.\r\n* [#12178](http://dev.ckeditor.com/ticket/12178): [Blink/WebKit] Fixed: Iterator does not return the block if the selection is located at the end of it.\r\n* [#12185](http://dev.ckeditor.com/ticket/12185): [IE9QM] Fixed: Error thrown when moving the mouse over focused editor's scrollbar.\r\n* [#12215](http://dev.ckeditor.com/ticket/12215): Fixed: Basepath resolution does not recognize semicolon as a query separator.\r\n* [#12135](http://dev.ckeditor.com/ticket/12135): Fixed: [Remove Format](http://ckeditor.com/addon/removeformat) does not work on widgets.\r\n* [#12298](http://dev.ckeditor.com/ticket/12298): [IE11] Fixed: Clicking below `<body>` in Compatibility Mode will no longer reset selection to the first line.\r\n* [#12204](http://dev.ckeditor.com/ticket/12204): Fixed: Editor's voice label is not affected by [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title).\r\n* [#11915](http://dev.ckeditor.com/ticket/11915): Fixed: With [SCAYT](http://ckeditor.com/addon/scayt) enabled, cursor moves to the beginning of the first highlighted, misspelled word after typing or pasting into the editor.\r\n* [SCAYT](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/69): Fixed: Error thrown in the console after enabling [SCAYT](http://ckeditor.com/addon/scayt) and trying to add a new image.\r\n\r\n\r\nOther Changes:\r\n\r\n* [#12296](http://dev.ckeditor.com/ticket/12296): Merged `benderjs-ckeditor` into the main CKEditor repository.\r\n\r\n## CKEditor 4.4.3\r\n\r\n**Security Updates:**\r\n\r\n* Fixed XSS vulnerability in the Preview plugin reported by Mario Heiderich of [Cure53](https://cure53.de/).\r\n\r\n**An upgrade is highly recommended!**\r\n\r\nNew Features:\r\n\r\n* [#12164](http://dev.ckeditor.com/ticket/12164): Added the \"Justify\" option to the \"Horizontal Alignment\" drop-down in the Table Cell Properties dialog window.\r\n\r\nFixed Issues:\r\n\r\n* [#12110](http://dev.ckeditor.com/ticket/12110): Fixed: Editor crash after deleting a table. Thanks to [Alin Purcaru](https://github.com/mesmerizero)!\r\n* [#11897](http://dev.ckeditor.com/ticket/11897): Fixed: *Enter* key used in an empty list item creates a new line instead of breaking the list. Thanks to [noam-si](https://github.com/noam-si)!\r\n* [#12140](http://dev.ckeditor.com/ticket/12140): Fixed: Double-clicking linked widgets opens two dialog windows.\r\n* [#12132](http://dev.ckeditor.com/ticket/12132): Fixed: Image is inserted with `width` and `height` styles even when they are not allowed.\r\n* [#9317](http://dev.ckeditor.com/ticket/9317): [IE] Fixed: [`config.disableObjectResizing`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-disableObjectResizing) does not work on IE. **Note**: We were not able to fix this issue on IE11+ because necessary events stopped working. See a [last resort workaround](http://dev.ckeditor.com/ticket/9317#comment:16) and make sure to [support our complaint to Microsoft](https://connect.microsoft.com/IE/feedback/details/742593/please-respect-execcommand-enableobjectresizing-in-contenteditable-elements).\r\n* [#9638](http://dev.ckeditor.com/ticket/9638): Fixed: There should be no information about accessibility help available under the *Alt+0* keyboard shortcut if the [Accessibility Help](http://ckeditor.com/addon/a11yhelp) plugin is not available.\r\n* [#8117](http://dev.ckeditor.com/ticket/8117) and [#9186](http://dev.ckeditor.com/ticket/9186): Fixed: In HTML5 `<meta>` tags should be allowed everywhere, including inside the `<body>` element.\r\n* [#10422](http://dev.ckeditor.com/ticket/10422): Fixed: [`config.fillEmptyBlocks`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fillEmptyBlocks) not working properly if a function is specified.\r\n\r\n## CKEditor 4.4.2\r\n\r\nImportant Notes:\r\n\r\n* The CKEditor testing environment is now publicly available. Read more about how to set up the environment and execute tests in the [CKEditor Testing Environment](http://docs.ckeditor.com/#!/guide/dev_tests) guide.\r\n\tPlease note that the [`tests/`](https://github.com/ckeditor/ckeditor-dev/tree/master/tests) directory which contains editor tests is not available in release packages. It can only be found in the development version of CKEditor on [GitHub](https://github.com/ckeditor/ckeditor-dev/).\r\n\r\nNew Features:\r\n\r\n* [#11909](http://dev.ckeditor.com/ticket/11909): Introduced a parameter to prevent the [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData) method from recording undo snapshots.\r\n\r\nFixed Issues:\r\n\r\n* [#11757](http://dev.ckeditor.com/ticket/11757): Fixed: Imperfections in the [Moono](http://ckeditor.com/addon/moono) skin. Thanks to [danyaPostfactum](https://github.com/danyaPostfactum)!\r\n* [#10091](http://dev.ckeditor.com/ticket/10091): Blockquote should be treated like an object by the styles system. Thanks to [dan-james-deeson](https://github.com/dan-james-deeson)!\r\n* [#11478](http://dev.ckeditor.com/ticket/11478): Fixed: Issue with passing jQuery objects to [adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) configuration.\r\n* [#10867](http://dev.ckeditor.com/ticket/10867): Fixed: Issue with setting encoded URI as image link.\r\n* [#11983](http://dev.ckeditor.com/ticket/11983): Fixed: Clicking a nested widget does not focus it. Additionally, performance of the [`widget.repository.getByElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-getByElement) method was improved.\r\n* [#12000](http://dev.ckeditor.com/ticket/12000): Fixed: Nested widgets should be initialized on [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData) and [`nestedEditable.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.nestedEditable-method-setData).\r\n* [#12022](http://dev.ckeditor.com/ticket/12022): Fixed: Outer widget's drag handler is not created at all if it has any nested widgets inside.\r\n* [#11960](http://dev.ckeditor.com/ticket/11960): [Blink/WebKit] Fixed: The caret should be scrolled into view on *Backspace* and *Delete* (covers only the merging blocks case).\r\n* [#11306](http://dev.ckeditor.com/ticket/11306): [OSX][Blink/WebKit] Fixed: No widget entries in the context menu on widget right-click.\r\n* [#11957](http://dev.ckeditor.com/ticket/11957): Fixed: Alignment labels in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window are not translated.\r\n* [#11980](http://dev.ckeditor.com/ticket/11980): [Blink/WebKit] Fixed: `<span>` elements created when joining adjacent elements (non-collapsed selection).\r\n* [#12009](http://dev.ckeditor.com/ticket/12009): [Nested widgets] Integration with the [Magic Line](http://ckeditor.com/addon/magicline) plugin.\r\n* [#11387](http://dev.ckeditor.com/ticket/11387): Fixed: `role=\"radiogroup\"` should be applied only to radio inputs' container.\r\n* [#7975](http://dev.ckeditor.com/ticket/7975): [IE8] Fixed: Errors when trying to select an empty table cell.\r\n* [#11947](http://dev.ckeditor.com/ticket/11947): [Firefox+IE11] Fixed: *Shift+Enter* in lists produces two line breaks.\r\n* [#11972](http://dev.ckeditor.com/ticket/11972): Fixed: Feature detection in the [`element.setText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-setText) method should not trigger the layout engine.\r\n* [#7634](http://dev.ckeditor.com/ticket/7634): Fixed: The [Flash Dialog](http://ckeditor.com/addon/flash) plugin omits the `allowFullScreen` parameter in the editor data if set to `true`.\r\n* [#11910](http://dev.ckeditor.com/ticket/11910): Fixed: [Enhanced Image](http://ckeditor.com/addon/image2) does not take [`config.baseHref`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-baseHref) into account when updating image dimensions.\r\n* [#11753](http://dev.ckeditor.com/ticket/11753): Fixed: Wrong [`checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) method value after focusing or blurring a widget.\r\n* [#11830](http://dev.ckeditor.com/ticket/11830): Fixed: Impossible to pass some arguments to [CKBuilder](https://github.com/ckeditor/ckbuilder) when using the `/dev/builder/build.sh` script.\r\n* [#11945](http://dev.ckeditor.com/ticket/11945): Fixed: [Form Elements](http://ckeditor.com/addon/forms) plugin should not change a core method.\r\n* [#11384](http://dev.ckeditor.com/ticket/11384): [IE9+] Fixed: `IndexSizeError` thrown when pasting into a non-empty selection anchored in one text node.\r\n\r\n## CKEditor 4.4.1\r\n\r\nNew Features:\r\n\r\n* [#9661](http://dev.ckeditor.com/ticket/9661): Added the option to [configure](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-linkJavaScriptLinksAllowed) anchor tags with JavaScript code in the `href` attribute.\r\n\r\nFixed Issues:\r\n\r\n* [#11861](http://dev.ckeditor.com/ticket/11861): [WebKit/Blink] Fixed: Span elements created while joining adjacent elements. **Note:** This patch only covers cases when *Backspace* or *Delete* is pressed on a collapsed (empty) selection. The remaining case, with a non-empty selection, will be fixed in the next release.\r\n* [#10714](http://dev.ckeditor.com/ticket/10714): [iOS] Fixed: Selection and drop-downs are broken if a touch event listener is used due to a [WebKit bug](https://bugs.webkit.org/show_bug.cgi?id=128924). Thanks to [Arty Gus](https://github.com/artygus)!\r\n* [#11911](http://dev.ckeditor.com/ticket/11911): Fixed setting the `dir` attribute for a preloaded language in [CKEDITOR.lang](http://docs.ckeditor.com/#!/api/CKEDITOR.lang). Thanks to [Akash Mohapatra](https://github.com/akashmohapatra)!\r\n* [#11926](http://dev.ckeditor.com/ticket/11926): Fixed: [Code Snippet](http://ckeditor.com/addon/codesnippet) does not decode HTML entities when loading code from the `<code>` element.\r\n* [#11223](http://dev.ckeditor.com/ticket/11223): Fixed: Issue when [Protected Source](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-protectedSource) was not working in the `<title>` element.\r\n* [#11859](http://dev.ckeditor.com/ticket/11859): Fixed: Removed the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin dependency from the [Code Snippet](http://ckeditor.com/addon/codesnippet) sample.\r\n* [#11754](http://dev.ckeditor.com/ticket/11754): [Chrome] Fixed: Infinite loop when content includes not closed attributes.\r\n* [#11848](http://dev.ckeditor.com/ticket/11848): [IE] Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) throwing an exception when there was no selection in the editor.\r\n* [#11801](http://dev.ckeditor.com/ticket/11801): Fixed: Editor anchors unavailable when linking the [Enhanced Image](http://ckeditor.com/addon/image2) widget.\r\n* [#11626](http://dev.ckeditor.com/ticket/11626): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) sets invalid column width.\r\n* [#11872](http://dev.ckeditor.com/ticket/11872): Made [`element.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-addClass) chainable symmetrically to [`element.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-removeClass).\r\n* [#11813](http://dev.ckeditor.com/ticket/11813): Fixed: Link lost while pasting a captioned image and restoring an undo snapshot ([Enhanced Image](http://ckeditor.com/addon/image2)).\r\n* [#11814](http://dev.ckeditor.com/ticket/11814): Fixed: _Link_ and _Unlink_ entries persistently displayed in the [Enhanced Image](http://ckeditor.com/addon/image2) context menu.\r\n* [#11839](http://dev.ckeditor.com/ticket/11839): [IE9] Fixed: The caret jumps out of the editable area when resizing the editor in the source mode.\r\n* [#11822](http://dev.ckeditor.com/ticket/11822): [WebKit] Fixed: Editing anchors by double-click is broken in some cases.\r\n* [#11823](http://dev.ckeditor.com/ticket/11823): [IE8] Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) throws an error over scrollbar.\r\n* [#11788](http://dev.ckeditor.com/ticket/11788): Fixed: It is not possible to change the language back to _Not set_ in the [Code Snippet](http://ckeditor.com/addon/codesnippet) dialog window.\r\n* [#11788](http://dev.ckeditor.com/ticket/11788): Fixed: [Filter](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied inside elements with the `contenteditable` attribute set to `true`.\r\n* [#11798](http://dev.ckeditor.com/ticket/11798): Fixed: Inserting a non-editable element inside a table cell breaks the table.\r\n* [#11793](http://dev.ckeditor.com/ticket/11793): Fixed: Drop-down is not \"on\" when clicking it while the editor is blurred.\r\n* [#11850](http://dev.ckeditor.com/ticket/11850): Fixed: Fake objects with the `contenteditable` attribute set to `false` are not downcasted properly.\r\n* [#11811](http://dev.ckeditor.com/ticket/11811): Fixed: Widget's data is not encoded correctly when passed to an attribute.\r\n* [#11777](http://dev.ckeditor.com/ticket/11777): Fixed encoding ampersand in the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin.\r\n* [#11880](http://dev.ckeditor.com/ticket/11880): [IE8-9] Fixed: Linked image has a default thick border.\r\n\r\nOther Changes:\r\n\r\n* [#11807](http://dev.ckeditor.com/ticket/11807): Updated jQuery version used in the sample to 1.11.0 and tested CKEditor jQuery Adapter with version 1.11.0 and 2.1.0.\r\n* [#9504](http://dev.ckeditor.com/ticket/9504): Stopped using deprecated `attribute.specified` in all browsers except Internet Explorer.\r\n* [#11809](http://dev.ckeditor.com/ticket/11809): Changed tab size in `<pre>` to 4 spaces.\r\n\r\n## CKEditor 4.4\r\n\r\n**Important Notes:**\r\n\r\n* Marked the [`editor.beforePaste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-beforePaste) event as deprecated.\r\n* The default class of captioned images has changed to `image` (was: `caption`). Please note that once edited in CKEditor 4.4+, all existing images of the `caption` class (`<figure class=\"caption\">`) will be [filtered out](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) unless the [`config.image2_captionedClass`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_captionedClass) option is set to `caption`. For backward compatibility (i.e. when upgrading), it is highly recommended to use this setting, which also helps prevent CSS conflicts, etc. This does not apply to new CKEditor integrations.\r\n* Widgets without defined buttons are no longer registered automatically to the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter). Before CKEditor 4.4 widgets were registered to the ACF which was an incorrect behavior ([#11567](http://dev.ckeditor.com/ticket/11567)). This change should not have any impact on standard scenarios, but if your button does not execute the widget command, you need to set [`allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.feature-property-allowedContent) and [`requiredContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.feature-property-requiredContent) properties for it manually, because the editor will not be able to find them.\r\n* The [Show Borders](http://ckeditor.com/addon/showborders) plugin was added to the Standard installation package in order to ensure that unstyled tables are still visible for the user ([#11665](http://dev.ckeditor.com/ticket/11665)).\r\n* Since CKEditor 4.4 the editor instance should be passed to [`CKEDITOR.style`](http://docs.ckeditor.com/#!/api/CKEDITOR.style) methods to ensure full compatibility with other features (e.g. applying styles to widgets requires that). We ensured backward compatibility though, so the [`CKEDITOR.style`](http://docs.ckeditor.com/#!/api/CKEDITOR.style) will work even when the editor instance is not provided.\r\n\r\nNew Features:\r\n\r\n* [#11297](http://dev.ckeditor.com/ticket/11297): Styles can now be applied to widgets. The definition of a style which can be applied to a specific widget must contain two additional properties &mdash; `type` and `widget`. Read more in the [Widget Styles](http://docs.ckeditor.com/#!/guide/dev_styles-section-widget-styles) section of the \"Syles Drop-down\" guide. Note that by default, widgets support only classes and no other attributes or styles. Related changes and features:\r\n  * Introduced the [`CKEDITOR.style.addCustomHandler()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-static-method-addCustomHandler) method for registering custom style handlers.\r\n  * The [`CKEDITOR.style.apply()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-apply) and [`CKEDITOR.style.remove()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-remove) methods are now called with an editor instance instead of the document so they can be reused by the [`CKEDITOR.editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) and [`CKEDITOR.editor.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-removeStyle) methods. Backward compatibility was preserved, but from CKEditor 4.4 it is highly recommended to pass an editor instead of a document to these methods.\r\n  * Many new methods and properties were introduced in the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget) to make the handling of styles by widgets fully customizable. See: [`widget.definition.styleableElements`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-styleableElements), [`widget.definition.styleToAllowedContentRule`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-styleToAllowedContentRules), [`widget.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-addClass), [`widget.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-removeClass), [`widget.getClasses()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-getClasses), [`widget.hasClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-hasClass), [`widget.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-applyStyle), [`widget.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-removeStyle), [`widget.checkStyleActive()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-checkStyleActive).\r\n  * Integration with the [Allowed Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) required an introduction of the [`CKEDITOR.style.toAllowedContent()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-toAllowedContentRules) method which can be implemented by the custom style handler and if exists, it is used by the [`CKEDITOR.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter) to translate a style to [allowed content rules](http://docs.ckeditor.com/#!/api/CKEDITOR.filter.allowedContentRules).\r\n* [#11300](http://dev.ckeditor.com/ticket/11300): Various changes in the [Enhanced Image](http://ckeditor.com/addon/image2) plugin:\r\n  * Introduced the [`config.image2_captionedClass`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_captionedClass) option to configure the class of captioned images.\r\n  * Introduced the [`config.image2_alignClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_alignClasses) option to configure the way images are aligned with CSS classes.\r\n  If this setting is defined, the editor produces classes instead of inline styles for aligned images.\r\n  * Default image caption can be translated (customized) with the `editor.lang.image2.captionPlaceholder` string.\r\n* [#11341](http://dev.ckeditor.com/ticket/11341): [Enhanced Image](http://ckeditor.com/addon/image2) plugin: It is now possible to add a link to any image type.\r\n* [#10202](http://dev.ckeditor.com/ticket/10202): Introduced wildcard support in the [Allowed Content Rules](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) format.\r\n* [#10276](http://dev.ckeditor.com/ticket/10276): Introduced blacklisting in the [Allowed Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter).\r\n* [#10480](http://dev.ckeditor.com/ticket/10480): Introduced code snippets with code highlighting. There are two versions available so far &mdash; the default [Code Snippet](http://ckeditor.com/addon/codesnippet) which uses the [highlight.js](http://highlightjs.org) library and the [Code Snippet GeSHi](http://ckeditor.com/addon/codesnippetgeshi) which uses the [GeSHi](http://qbnz.com/highlighter/) library.\r\n* [#11737](http://dev.ckeditor.com/ticket/11737): Introduced an option to prevent [filtering](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) of an element that matches custom criteria (see [`filter.addElementCallback()`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-method-addElementCallback)).\r\n* [#11532](http://dev.ckeditor.com/ticket/11532): Introduced the [`editor.addContentsCss()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addContentsCss) method that can be used for [adding custom CSS files](http://docs.ckeditor.com/#!/guide/plugin_sdk_styles).\r\n* [#11536](http://dev.ckeditor.com/ticket/11536): Added the [`CKEDITOR.tools.htmlDecode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-htmlDecode) method for decoding HTML entities.\r\n* [#11225](http://dev.ckeditor.com/ticket/11225): Introduced the [`CKEDITOR.tools.transparentImageData`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-property-transparentImageData) property which contains transparent image data to be used in CSS or as image source.\r\n\r\nOther Changes:\r\n\r\n* [#11377](http://dev.ckeditor.com/ticket/11377): Unified internal representation of empty anchors using the [fake objects](http://ckeditor.com/addon/fakeobjects).\r\n* [#11422](http://dev.ckeditor.com/ticket/11422): Removed Firefox 3.x, Internet Explorer 6 and Opera 12.x leftovers in code.\r\n* [#5217](http://dev.ckeditor.com/ticket/5217): Setting data (including switching between modes) creates a new undo snapshot. Besides that:\r\n  * Introduced the [`editable.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-property-status) property.\r\n  * Introduced a new `forceUpdate` option for the [`editor.lockSnapshot`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-lockSnapshot) event.\r\n  * Fixed: Selection not being unlocked in inline editor after setting data ([#11500](http://dev.ckeditor.com/ticket/11500)).\r\n* The [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin was updated to the latest version.\r\n\r\nFixed Issues:\r\n\r\n* [#10190](http://dev.ckeditor.com/ticket/10190): Fixed: Removing block style with [`editor.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-removeStyle) should result in a paragraph and not a div.\r\n* [#11727](http://dev.ckeditor.com/ticket/11727): Fixed: The editor tries to select a non-editable image which was clicked.\r\n\r\n## CKEditor 4.3.5\r\n\r\nNew Features:\r\n\r\n* Added new translation: Tatar.\r\n\r\nFixed Issues:\r\n\r\n* [#11677](http://dev.ckeditor.com/ticket/11677): Fixed: Undo/Redo keystrokes are blocked in the source mode.\r\n* [#11717](http://dev.ckeditor.com/ticket/11717): [Document Properties](http://ckeditor.com/addon/docprops) plugin requires the [Color Dialog](http://ckeditor.com/addon/colordialog) plugin to work.\r\n\r\n## CKEditor 4.3.4\r\n\r\nFixed Issues:\r\n\r\n* [#11597](http://dev.ckeditor.com/ticket/11597): [IE11] Fixed: Error thrown when trying to open the [preview](http://ckeditor.com/addon/preview) using the keyboard.\r\n* [#11544](http://dev.ckeditor.com/ticket/11544): [Placeholders](http://ckeditor.com/addon/placeholder) will no longer be upcasted in parents not accepting `<span>` elements.\r\n* [#8663](http://dev.ckeditor.com/ticket/8663): Fixed [`element.renameNode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-renameNode) not clearing the [`element.getName()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-getName) cache.\r\n* [#11574](http://dev.ckeditor.com/ticket/11574): Fixed: *Backspace* destroying the DOM structure if an inline editable is placed in a list item.\r\n* [#11603](http://dev.ckeditor.com/ticket/11603): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) attaches to tables outside the editable.\r\n* [#9205](http://dev.ckeditor.com/ticket/9205), [#7805](http://dev.ckeditor.com/ticket/7805), [#8216](http://dev.ckeditor.com/ticket/8216): Fixed: `{cke_protected_1}` appearing in data in various cases where HTML comments are placed next to `\"` or `'`.\r\n* [#11635](http://dev.ckeditor.com/ticket/11635): Fixed: Some attributes are not protected before the content is passed through the fix bin.\r\n* [#11660](http://dev.ckeditor.com/ticket/11660): [IE] Fixed: Table content is lost when some extra markup is inside the table.\r\n* [#11641](http://dev.ckeditor.com/ticket/11641): Fixed: Switching between modes in the classic editor removes content styles for the inline editor.\r\n* [#11568](http://dev.ckeditor.com/ticket/11568): Fixed: [Styles](http://ckeditor.com/addon/stylescombo) drop-down list is not enabled on selection change.\r\n\r\n## CKEditor 4.3.3\r\n\r\nFixed Issues:\r\n\r\n* [#11500](http://dev.ckeditor.com/ticket/11500): [WebKit/Blink] Fixed: Selection lost when setting data in another inline editor. Additionally, [`selection.removeAllRanges()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-removeAllRanges) is now scoped to selection's [root](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-property-root).\r\n* [#11104](http://dev.ckeditor.com/ticket/11104): [IE] Fixed: Various issues with scrolling and selection when focusing widgets.\r\n* [#11487](http://dev.ckeditor.com/ticket/11487): Moving mouse over the [Enhanced Image](http://ckeditor.com/addon/image2) widget will no longer change the value returned by the [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) method.\r\n* [#8673](http://dev.ckeditor.com/ticket/8673): [WebKit] Fixed: Cannot select and remove the [Page Break](http://ckeditor.com/addon/pagebreak).\r\n* [#11413](http://dev.ckeditor.com/ticket/11413): Fixed: Incorrect [`editor.execCommand()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-execCommand) behavior.\r\n* [#11438](http://dev.ckeditor.com/ticket/11438): Splitting table cells vertically is no longer changing table structure.\r\n* [#8899](http://dev.ckeditor.com/ticket/8899): Fixed: Links in the [About CKEditor](http://ckeditor.com/addon/about) dialog window now open in a new browser window or tab.\r\n* [#11490](http://dev.ckeditor.com/ticket/11490): Fixed: [Menu button](http://ckeditor.com/addon/menubutton) panel not showing in the source mode.\r\n* [#11417](http://dev.ckeditor.com/ticket/11417): The [`widget.doubleclick`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-event-doubleclick) event is not canceled anymore after editing was triggered.\r\n* [#11253](http://dev.ckeditor.com/ticket/11253): [IE] Fixed: Clipped upload button in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window.\r\n* [#11359](http://dev.ckeditor.com/ticket/11359): Standardized the way anchors are discovered by the [Link](http://ckeditor.com/addon/link) plugin.\r\n* [#11058](http://dev.ckeditor.com/ticket/11058): [IE8] Fixed: Error when deleting a table row.\r\n* [#11508](http://dev.ckeditor.com/ticket/11508): Fixed: [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor) discovering protected attributes within other attributes' values.\r\n* [#11533](http://dev.ckeditor.com/ticket/11533): Widgets: Avoid recurring upcasts if the DOM structure was modified during an upcast.\r\n* [#11400](http://dev.ckeditor.com/ticket/11400): Fixed: The [`domObject.removeAllListeners()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.domObject-method-removeAllListeners) method does not remove custom listeners completely.\r\n* [#11493](http://dev.ckeditor.com/ticket/11493): Fixed: The [`selection.getRanges()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-getRanges) method does not override cached ranges when used with the `onlyEditables` argument.\r\n* [#11390](http://dev.ckeditor.com/ticket/11390): [IE] All [XML](http://ckeditor.com/addon/xml) plugin [methods](http://docs.ckeditor.com/#!/api/CKEDITOR.xml) now work in IE10+.\r\n* [#11542](http://dev.ckeditor.com/ticket/11542): [IE11] Fixed: Blurry toolbar icons when Right-to-Left UI language is set.\r\n* [#11504](http://dev.ckeditor.com/ticket/11504): Fixed: When [`config.fullPage`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fullPage) is set to `true`, entities are not encoded in editor output.\r\n* [#11004](http://dev.ckeditor.com/ticket/11004): Integrated [Enhanced Image](http://ckeditor.com/addon/image2) dialog window with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter).\r\n* [#11439](http://dev.ckeditor.com/ticket/11439): Fixed: Properties get cloned in the Cell Properties dialog window if multiple cells are selected.\r\n\r\n## CKEditor 4.3.2\r\n\r\nFixed Issues:\r\n\r\n* [#11331](http://dev.ckeditor.com/ticket/11331): A menu button will have a changed label when selected instead of using the `aria-pressed` attribute.\r\n* [#11177](http://dev.ckeditor.com/ticket/11177): Widget drag handler improvements:\r\n  * [#11176](http://dev.ckeditor.com/ticket/11176): Fixed: Initial position is not updated when the widget data object is empty.\r\n  * [#11001](http://dev.ckeditor.com/ticket/11001): Fixed: Multiple synchronous layout recalculations are caused by initial drag handler positioning causing performance issues.\r\n  * [#11161](http://dev.ckeditor.com/ticket/11161): Fixed: Drag handler is not repositioned in various situations.\r\n  * [#11281](http://dev.ckeditor.com/ticket/11281): Fixed: Drag handler and mask are duplicated after widget reinitialization.\r\n* [#11207](http://dev.ckeditor.com/ticket/11207): [Firefox] Fixed: Misplaced [Enhanced Image](http://ckeditor.com/addon/image2) resizer in the inline editor.\r\n* [#11102](http://dev.ckeditor.com/ticket/11102): `CKEDITOR.template` improvements:\r\n  * [#11102](http://dev.ckeditor.com/ticket/11102): Added newline character support.\r\n  * [#11216](http://dev.ckeditor.com/ticket/11216): Added \"\\\\'\" substring support.\r\n* [#11121](http://dev.ckeditor.com/ticket/11121): [Firefox] Fixed: High Contrast mode is enabled when the editor is loaded in a hidden iframe.\r\n* [#11350](http://dev.ckeditor.com/ticket/11350): The default value of [`config.contentsCss`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-contentsCss) is affected by [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl).\r\n* [#11097](http://dev.ckeditor.com/ticket/11097): Improved the [Autogrow](http://ckeditor.com/addon/autogrow) plugin performance when dealing with very big tables.\r\n* [#11290](http://dev.ckeditor.com/ticket/11290): Removed redundant code in the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin.\r\n* [#11133](http://dev.ckeditor.com/ticket/11133): [Page Break](http://ckeditor.com/addon/pagebreak) becomes editable if pasted.\r\n* [#11126](http://dev.ckeditor.com/ticket/11126): Fixed: Native Undo executed once the bottom of the snapshot stack is reached.\r\n* [#11131](http://dev.ckeditor.com/ticket/11131): [Div Editing Area](http://ckeditor.com/addon/divarea): Fixed: Error thrown when switching to source mode if the selection was in widget's nested editable.\r\n* [#11139](http://dev.ckeditor.com/ticket/11139): [Div Editing Area](http://ckeditor.com/addon/divarea): Fixed: Elements Path is not cleared after switching to source mode.\r\n* [#10778](http://dev.ckeditor.com/ticket/10778): Fixed a bug with range enlargement. The range no longer expands to visible whitespace.\r\n* [#11146](http://dev.ckeditor.com/ticket/11146): [IE] Fixed: Preview window switches Internet Explorer to Quirks Mode.\r\n* [#10762](http://dev.ckeditor.com/ticket/10762): [IE] Fixed: JavaScript code displayed in preview window's URL bar.\r\n* [#11186](http://dev.ckeditor.com/ticket/11186): Introduced the [`widgets.repository.addUpcastCallback()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-addUpcastCallback) method that allows to block upcasting given element to a widget.\r\n* [#11307](http://dev.ckeditor.com/ticket/11307): Fixed: Paste as Plain Text conflict with the [MooTools](http://mootools.net) library.\r\n* [#11140](http://dev.ckeditor.com/ticket/11140): [IE11] Fixed: Anchors are not draggable.\r\n* [#11379](http://dev.ckeditor.com/ticket/11379): Changed default contents `line-height` to unitless values to avoid huge text overlapping (like in [#9696](http://dev.ckeditor.com/ticket/9696)).\r\n* [#10787](http://dev.ckeditor.com/ticket/10787): [Firefox] Fixed: Broken replacement of text while pasting into `div`-based editor.\r\n* [#10884](http://dev.ckeditor.com/ticket/10884): Widgets integration with the [Show Blocks](http://ckeditor.com/addon/showblocks) plugin.\r\n* [#11021](http://dev.ckeditor.com/ticket/11021): Fixed: An error thrown when selecting entire editable contents while fake selection is on.\r\n* [#11086](http://dev.ckeditor.com/ticket/11086): [IE8] Re-enable inline widgets drag&drop in Internet Explorer 8.\r\n* [#11372](http://dev.ckeditor.com/ticket/11372): Widgets: Special characters encoded twice in nested editables.\r\n* [#10068](http://dev.ckeditor.com/ticket/10068): Fixed: Support for protocol-relative URLs.\r\n* [#11283](http://dev.ckeditor.com/ticket/11283): [Enhanced Image](http://ckeditor.com/addon/image2): A `<div>` element with `text-align: center` and an image inside is not recognised correctly.\r\n* [#11196](http://dev.ckeditor.com/ticket/11196): [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp): Allowed additional keyboard button labels to be translated in the dialog window.\r\n\r\n## CKEditor 4.3.1\r\n\r\n**Important Notes:**\r\n\r\n* To match the naming convention, the `language` button is now `Language` ([#11201](http://dev.ckeditor.com/ticket/11201)).\r\n* [Enhanced Image](http://ckeditor.com/addon/image2) button, context menu, command, and icon names match those of the [Image](http://ckeditor.com/addon/image) plugin ([#11222](http://dev.ckeditor.com/ticket/11222)).\r\n\r\nFixed Issues:\r\n\r\n* [#11244](http://dev.ckeditor.com/ticket/11244): Changed: The [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method now fires the [`widget.repository.checkWidgets`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-event-checkWidgets) event, so from CKEditor 4.3.1 it is preferred to use the method rather than fire the event.\r\n* [#11171](http://dev.ckeditor.com/ticket/11171): Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) and [`editor.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText) methods do not call the [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method.\r\n* [#11085](http://dev.ckeditor.com/ticket/11085): [IE8] Replaced preview generated by the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget with a placeholder.\r\n* [#11044](http://dev.ckeditor.com/ticket/11044): Enhanced WAI-ARIA support for the [Language](http://ckeditor.com/addon/language) plugin drop-down menu.\r\n* [#11075](http://dev.ckeditor.com/ticket/11075): With drop-down menu button focused, pressing the *Down Arrow* key will now open the menu and focus its first option.\r\n* [#11165](http://dev.ckeditor.com/ticket/11165): Fixed: The [File Browser](http://ckeditor.com/addon/filebrowser) plugin cannot be removed from the editor.\r\n* [#11159](http://dev.ckeditor.com/ticket/11159): [IE9-10] [Enhanced Image](http://ckeditor.com/addon/image2): Fixed buggy discovery of image dimensions.\r\n* [#11101](http://dev.ckeditor.com/ticket/11101): Drop-down lists no longer break when given double quotes.\r\n* [#11077](http://dev.ckeditor.com/ticket/11077): [Enhanced Image](http://ckeditor.com/addon/image2): Empty undo step recorded when resizing the image.\r\n* [#10853](http://dev.ckeditor.com/ticket/10853): [Enhanced Image](http://ckeditor.com/addon/image2): Widget has paragraph wrapper when de-captioning unaligned image.\r\n* [#11198](http://dev.ckeditor.com/ticket/11198): Widgets: Drag handler is not fully visible when an inline widget is in a heading.\r\n* [#11132](http://dev.ckeditor.com/ticket/11132): [Firefox] Fixed: Caret is lost after drag and drop of an inline widget.\r\n* [#11182](http://dev.ckeditor.com/ticket/11182): [IE10-11] Fixed: Editor crashes (IE11) or works with minor issues (IE10) if a page is loaded in Quirks Mode. See [`env.quirks`](http://docs.ckeditor.com/#!/api/CKEDITOR.env-property-quirks) for more details.\r\n* [#11204](http://dev.ckeditor.com/ticket/11204): Added `figure` and `figcaption` styles to the `contents.css` file so [Enhanced Image](http://ckeditor.com/addon/image2) looks nicer.\r\n* [#11202](http://dev.ckeditor.com/ticket/11202): Fixed: No newline in [BBCode](http://ckeditor.com/addon/bbcode) mode.\r\n* [#10890](http://dev.ckeditor.com/ticket/10890): Fixed: Error thrown when pressing the *Delete* key in a list item.\r\n* [#10055](http://dev.ckeditor.com/ticket/10055): [IE8-10] Fixed: *Delete* pressed on a selected image causes the browser to go back.\r\n* [#11183](http://dev.ckeditor.com/ticket/11183): Fixed: Inserting a horizontal rule or a table in multiple row selection causes a browser crash. Additionally, the [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) method does not insert the element into every range of a selection any more.\r\n* [#11042](http://dev.ckeditor.com/ticket/11042): Fixed: Selection made on an element containing a non-editable element was not auto faked.\r\n* [#11125](http://dev.ckeditor.com/ticket/11125): Fixed: Keyboard navigation through menu and drop-down items will now cycle.\r\n* [#11011](http://dev.ckeditor.com/ticket/11011): Fixed: The [`editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) method removes attributes from nested elements.\r\n* [#11179](http://dev.ckeditor.com/ticket/11179): Fixed: [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy) does not cleanup content generated by the [Table Resize](http://ckeditor.com/addon/tableresize) plugin for inline editors.\r\n* [#11237](http://dev.ckeditor.com/ticket/11237): Fixed: Table border attribute value is deleted when pasting content from Microsoft Word.\r\n* [#11250](http://dev.ckeditor.com/ticket/11250): Fixed: HTML entities inside the `<textarea>` element are not encoded.\r\n* [#11260](http://dev.ckeditor.com/ticket/11260): Fixed: Initially disabled buttons are not read by JAWS as disabled.\r\n* [#11200](http://dev.ckeditor.com/ticket/11200):  Added [Clipboard](http://ckeditor.com/addon/clipboard) plugin as a dependency for [Widget](http://ckeditor.com/addon/widget) to fix drag and drop.\r\n\r\n## CKEditor 4.3\r\n\r\nNew Features:\r\n\r\n* [#10612](http://dev.ckeditor.com/ticket/10612): Internet Explorer 11 support.\r\n* [#10869](http://dev.ckeditor.com/ticket/10869): Widgets: Added better integration with the [Elements Path](http://ckeditor.com/addon/elementspath) plugin.\r\n* [#10886](http://dev.ckeditor.com/ticket/10886): Widgets: Added tooltip to the drag handle.\r\n* [#10933](http://dev.ckeditor.com/ticket/10933): Widgets: Introduced drag and drop of block widgets with the [Line Utilities](http://ckeditor.com/addon/lineutils) plugin.\r\n* [#10936](http://dev.ckeditor.com/ticket/10936): Widget System changes for easier integration with other dialog systems.\r\n* [#10895](http://dev.ckeditor.com/ticket/10895): [Enhanced Image](http://ckeditor.com/addon/image2): Added file browser integration.\r\n* [#11002](http://dev.ckeditor.com/ticket/11002): Added the [`draggable`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-draggable) option to disable drag and drop support for widgets.\r\n* [#10937](http://dev.ckeditor.com/ticket/10937): [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget improvements:\r\n  * loading indicator ([#10948](http://dev.ckeditor.com/ticket/10948)),\r\n  * applying paragraph changes (like font color change) to iframe ([#10841](http://dev.ckeditor.com/ticket/10841)),\r\n  * Firefox and IE9 clipboard fixes ([#10857](http://dev.ckeditor.com/ticket/10857)),\r\n  * fixing same origin policy issue ([#10840](http://dev.ckeditor.com/ticket/10840)),\r\n  * fixing undo bugs ([#10842](http://dev.ckeditor.com/ticket/10842), [#10930](http://dev.ckeditor.com/ticket/10930)),\r\n  * fixing other minor bugs.\r\n* [#10862](http://dev.ckeditor.com/ticket/10862): [Placeholder](http://ckeditor.com/addon/placeholder) plugin was rewritten as a widget.\r\n* [#10822](http://dev.ckeditor.com/ticket/10822): Added styles system integration with non-editable elements (for example widgets) and their nested editables. Styles cannot change non-editable content and are applied in nested editable only if allowed by its type and content filter.\r\n* [#10856](http://dev.ckeditor.com/ticket/10856): Menu buttons will now toggle the visibility of their panels when clicked multiple times. [Language](http://ckeditor.com/addon/language) plugin fixes: Added active language highlighting, added an option to remove the language.\r\n* [#10028](http://dev.ckeditor.com/ticket/10028): New [`config.dialog_noConfirmCancel`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-dialog_noConfirmCancel) configuration option that eliminates the need to confirm closing of a dialog window when the user changed any of its fields.\r\n* [#10848](http://dev.ckeditor.com/ticket/10848): Integrate remaining plugins ([Styles](http://ckeditor.com/addon/stylescombo), [Format](http://ckeditor.com/addon/format), [Font](http://ckeditor.com/addon/font), [Color Button](http://ckeditor.com/addon/colorbutton), [Language](http://ckeditor.com/addon/language) and [Indent](http://ckeditor.com/addon/indent)) with [active filter](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter).\r\n* [#10855](http://dev.ckeditor.com/ticket/10855): Change the extension of emoticons in the [BBCode](http://ckeditor.com/addon/bbcode) sample from GIF to PNG.\r\n\r\nFixed Issues:\r\n\r\n* [#10831](http://dev.ckeditor.com/ticket/10831): [Enhanced Image](http://ckeditor.com/addon/image2): Merged `image2inline` and `image2block` into one `image2` widget.\r\n* [#10835](http://dev.ckeditor.com/ticket/10835): [Enhanced Image](http://ckeditor.com/addon/image2): Improved visibility of the resize handle.\r\n* [#10836](http://dev.ckeditor.com/ticket/10836): [Enhanced Image](http://ckeditor.com/addon/image2): Preserve custom mouse cursor while resizing the image.\r\n* [#10939](http://dev.ckeditor.com/ticket/10939): [Firefox] [Enhanced Image](http://ckeditor.com/addon/image2): hovering the image causes it to change.\r\n* [#10866](http://dev.ckeditor.com/ticket/10866): Fixed: Broken *Tab* key navigation in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window.\r\n* [#10833](http://dev.ckeditor.com/ticket/10833): Fixed: *Lock ratio* option should be on by default in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window.\r\n* [#10881](http://dev.ckeditor.com/ticket/10881): Various improvements to *Enter* key behavior in nested editables.\r\n* [#10879](http://dev.ckeditor.com/ticket/10879): [Remove Format](http://ckeditor.com/addon/removeformat) should not leak from a nested editable.\r\n* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [WebSpellChecker](http://ckeditor.com/addon/wsc) fails to apply changes if a nested editable was focused.\r\n* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [SCAYT](http://ckeditor.com/addon/wsc) blocks typing in nested editables.\r\n* [#11079](http://dev.ckeditor.com/ticket/11079): Add button icons to the [Placeholder](http://ckeditor.com/addon/placeholder) sample.\r\n* [#10870](http://dev.ckeditor.com/ticket/10870): The `paste` command is no longer being disabled when the clipboard is empty.\r\n* [#10854](http://dev.ckeditor.com/ticket/10854): Fixed: Firefox prepends `<br>` to `<body>`, so it is stripped by the HTML data processor.\r\n* [#10823](http://dev.ckeditor.com/ticket/10823): Fixed: [Link](http://ckeditor.com/addon/link) plugin does not work with non-editable content.\r\n* [#10828](http://dev.ckeditor.com/ticket/10828): [Magic Line](http://ckeditor.com/addon/magicline) integration with the Widget System.\r\n* [#10865](http://dev.ckeditor.com/ticket/10865): Improved hiding copybin, so copying widgets works smoothly.\r\n* [#11066](http://dev.ckeditor.com/ticket/11066): Widget's private parts use CSS reset.\r\n* [#11027](http://dev.ckeditor.com/ticket/11027): Fixed: Block commands break on widgets; added the [`contentDomInvalidated`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-contentDomInvalidated) event.\r\n* [#10430](http://dev.ckeditor.com/ticket/10430): Resolve dependence of the [Image](http://ckeditor.com/addon/image) plugin on the [Form Elements](http://ckeditor.com/addon/forms) plugin.\r\n* [#10911](http://dev.ckeditor.com/ticket/10911): Fixed: Browser *Alt* hotkeys will no longer be blocked while a widget is focused.\r\n* [#11082](http://dev.ckeditor.com/ticket/11082): Fixed: Selected widget is not copied or cut when using toolbar buttons or context menu.\r\n* [#11083](http://dev.ckeditor.com/ticket/11083): Fixed list and div element application to block widgets.\r\n* [#10887](http://dev.ckeditor.com/ticket/10887): Internet Explorer 8 compatibility issues related to the Widget System.\r\n* [#11074](http://dev.ckeditor.com/ticket/11074): Temporarily disabled inline widget drag and drop, because of seriously buggy native `range#moveToPoint` method.\r\n* [#11098](http://dev.ckeditor.com/ticket/11098): Fixed: Wrong selection position after undoing widget drag and drop.\r\n* [#11110](http://dev.ckeditor.com/ticket/11110): Fixed: IFrame and Flash objects are being incorrectly pasted in certain conditions.\r\n* [#11129](http://dev.ckeditor.com/ticket/11129): Page break is lost when loading data.\r\n* [#11123](http://dev.ckeditor.com/ticket/11123): [Firefox] Widget is destroyed after being dragged outside of `<body>`.\r\n* [#11124](http://dev.ckeditor.com/ticket/11124): Fixed the [Elements Path](http://ckeditor.com/addon/elementspath) in an editor using the [Div Editing Area](http://ckeditor.com/addon/divarea).\r\n\r\n## CKEditor 4.3 Beta\r\n\r\nNew Features:\r\n\r\n* [#9764](http://dev.ckeditor.com/ticket/9764): Widget System.\r\n  * [Widget plugin](http://ckeditor.com/addon/widget) introducing the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget).\r\n  * New [`editor.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) and [`editor.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-shiftEnterMode) properties &ndash; normalized versions of [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) and [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode).\r\n  * Dynamic editor settings. Starting from CKEditor 4.3 Beta, *Enter* mode values and [content filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) instances may be changed dynamically (for example when the caret was placed in an element in which editor features should be adjusted). When you are implementing a new editor feature, you should base its behavior on [dynamic](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) or [static](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) *Enter* mode values depending on whether this feature works in selection context or globally on editor content.\r\n      * Dynamic *Enter* mode values &ndash; [`editor.setActiveEnterMode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveEnterMode) method, [`editor.activeEnterModeChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeEnterModeChange) event, and two properties: [`editor.activeEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) and [`editor.activeShiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeShiftEnterMode).\r\n      * Dynamic content filter instances &ndash; [`editor.setActiveFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveFilter) method, [`editor.activeFilterChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeFilterChange) event, and [`editor.activeFilter`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter) property.\r\n  * \"Fake\" selection was introduced. It makes it possible to virtually select any element when the real selection remains hidden. See the  [`selection.fake()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-fake) method.\r\n  * Default [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied to non-editable elements (elements with `contenteditable` attribute set to `false` and their descendants) anymore. To add a rule which will be applied to all elements you need to pass an additional argument to the [`filter.addRules()`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter-method-addRules) method.\r\n  * Dozens of new methods were introduced &ndash; most interesting ones:\r\n      * [`document.find()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-find),\r\n      * [`document.findOne()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-findOne),\r\n      * [`editable.insertElementIntoRange()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElementIntoRange),\r\n      * [`range.moveToClosestEditablePosition()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-moveToClosestEditablePosition),\r\n      * New methods for [`htmlParser.node`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.node) and [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element).\r\n* [#10659](http://dev.ckeditor.com/ticket/10659): New [Enhanced Image](http://ckeditor.com/addon/image2) plugin that introduces a widget with integrated image captions, an option to center images, and dynamic \"click and drag\" resizing.\r\n* [#10664](http://dev.ckeditor.com/ticket/10664): New [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin that introduces the MathJax widget.\r\n* [#7987](https://dev.ckeditor.com/ticket/7987): New [Language](http://ckeditor.com/addon/language) plugin that implements Language toolbar button to support [WCAG 3.1.2 Language of Parts](http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html).\r\n* [#10708](http://dev.ckeditor.com/ticket/10708): New [smileys](http://ckeditor.com/addon/smiley).\r\n\r\n## CKEditor 4.2.3\r\n\r\nFixed Issues:\r\n\r\n* [#10994](http://dev.ckeditor.com/ticket/10994): Fixed: Loading external jQuery library when opening the [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) sample directly from file.\r\n* [#10975](http://dev.ckeditor.com/ticket/10975): [IE] Fixed: Error thrown while opening the color palette.\r\n* [#9929](http://dev.ckeditor.com/ticket/9929): [Blink/WebKit] Fixed: A non-breaking space is created once a character is deleted and a regular space is typed.\r\n* [#10963](http://dev.ckeditor.com/ticket/10963): Fixed: JAWS issue with the keyboard shortcut for [Magic Line](http://ckeditor.com/addon/magicline).\r\n* [#11096](http://dev.ckeditor.com/ticket/11096): Fixed: TypeError: Object has no method 'is'.\r\n\r\n## CKEditor 4.2.2\r\n\r\nFixed Issues:\r\n\r\n* [#9314](http://dev.ckeditor.com/ticket/9314): Fixed: Incorrect error message on closing a dialog window without saving changs.\r\n* [#10308](http://dev.ckeditor.com/ticket/10308): [IE10] Fixed: Unspecified error when deleting a row.\r\n* [#10945](http://dev.ckeditor.com/ticket/10945): [Chrome] Fixed: Clicking with a mouse inside the editor does not show the caret.\r\n* [#10912](http://dev.ckeditor.com/ticket/10912): Prevent default action when content of a non-editable link is clicked.\r\n* [#10913](http://dev.ckeditor.com/ticket/10913): Fixed [`CKEDITOR.plugins.addExternal()`](http://docs.ckeditor.com/#!/api/CKEDITOR.resourceManager-method-addExternal) not handling paths including file name specified.\r\n* [#10666](http://dev.ckeditor.com/ticket/10666): Fixed [`CKEDITOR.tools.isArray()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-isArray) not working cross frame.\r\n* [#10910](http://dev.ckeditor.com/ticket/10910): [IE9] Fixed JavaScript error thrown in Compatibility Mode when clicking and/or typing in the editing area.\r\n* [#10868](http://dev.ckeditor.com/ticket/10868): [IE8] Prevent the browser from crashing when applying the Inline Quotation style.\r\n* [#10915](http://dev.ckeditor.com/ticket/10915): Fixed: Invalid CSS filter in the Kama skin.\r\n* [#10914](http://dev.ckeditor.com/ticket/10914): Plugins [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock) are now included in the build configuration.\r\n* [#10812](http://dev.ckeditor.com/ticket/10812): Fixed [`range.createBookmark2()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-createBookmark2) incorrectly normalizing offsets. This bug was causing many issues: [#10850](http://dev.ckeditor.com/ticket/10850), [#10842](http://dev.ckeditor.com/ticket/10842).\r\n* [#10951](http://dev.ckeditor.com/ticket/10951): Reviewed and optimized focus handling on panels (combo, menu buttons, color buttons, and context menu) to enhance accessibility. Fixed [#10705](http://dev.ckeditor.com/ticket/10705), [#10706](http://dev.ckeditor.com/ticket/10706) and [#10707](http://dev.ckeditor.com/ticket/10707).\r\n* [#10704](http://dev.ckeditor.com/ticket/10704): Fixed a JAWS issue with the Select Color dialog window title not being announced.\r\n* [#10753](http://dev.ckeditor.com/ticket/10753): The floating toolbar in inline instances now has a dedicated accessibility label.\r\n\r\n## CKEditor 4.2.1\r\n\r\nFixed Issues:\r\n\r\n* [#10301](http://dev.ckeditor.com/ticket/10301): [IE9-10] Undo fails after 3+ consecutive paste actions with a JavaScript error.\r\n* [#10689](http://dev.ckeditor.com/ticket/10689): Save toolbar button saves only the first editor instance.\r\n* [#10368](http://dev.ckeditor.com/ticket/10368): Move language reading direction definition (`dir`) from main language file to core.\r\n* [#9330](http://dev.ckeditor.com/ticket/9330): Fixed pasting anchors from MS Word.\r\n* [#8103](http://dev.ckeditor.com/ticket/8103): Fixed pasting nested lists from MS Word.\r\n* [#9958](http://dev.ckeditor.com/ticket/9958): [IE9] Pressing the \"OK\" button will trigger the `onbeforeunload` event in the popup dialog.\r\n* [#10662](http://dev.ckeditor.com/ticket/10662): Fixed styles from the Styles drop-down list not registering to the ACF in case when the [Shared Spaces plugin](http://ckeditor.com/addon/sharedspace) is used.\r\n* [#9654](http://dev.ckeditor.com/ticket/9654): Problems with Internet Explorer 10 Quirks Mode.\r\n* [#9816](http://dev.ckeditor.com/ticket/9816): Floating toolbar does not reposition vertically in several cases.\r\n* [#10646](http://dev.ckeditor.com/ticket/10646): Removing a selected sublist or nested table with *Backspace/Delete* removes the parent element.\r\n* [#10623](http://dev.ckeditor.com/ticket/10623): [WebKit] Page is scrolled when opening a drop-down list.\r\n* [#10004](http://dev.ckeditor.com/ticket/10004): [ChromeVox] Button names are not announced.\r\n* [#10731](http://dev.ckeditor.com/ticket/10731): [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin breaks cloning of editor configuration.\r\n* It is now possible to set per instance [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin configuration instead of setting the configuration globally.\r\n\r\n## CKEditor 4.2\r\n\r\n**Important Notes:**\r\n\r\n* Dropped compatibility support for Internet Explorer 7 and Firefox 3.6.\r\n\r\n* Both the Basic and the Standard distribution packages will not contain the new [Indent Block](http://ckeditor.com/addon/indentblock) plugin. Because of this the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) might remove block indentations from existing contents. If you want to prevent this, either [add an appropriate ACF rule to your filter](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) or create a custom build based on the Basic/Standard package and add the Indent Block plugin in [CKBuilder](http://ckeditor.com/builder).\r\n\r\nNew Features:\r\n\r\n* [#10027](http://dev.ckeditor.com/ticket/10027): Separated list and block indentation into two plugins: [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock).\r\n* [#8244](http://dev.ckeditor.com/ticket/8244): Use *(Shift+)Tab* to indent and outdent lists.\r\n* [#10281](http://dev.ckeditor.com/ticket/10281): The [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) is now available. Several jQuery-related issues fixed: [#8261](http://dev.ckeditor.com/ticket/8261), [#9077](http://dev.ckeditor.com/ticket/9077), [#8710](http://dev.ckeditor.com/ticket/8710), [#8530](http://dev.ckeditor.com/ticket/8530), [#9019](http://dev.ckeditor.com/ticket/9019), [#6181](http://dev.ckeditor.com/ticket/6181), [#7876](http://dev.ckeditor.com/ticket/7876), [#6906](http://dev.ckeditor.com/ticket/6906).\r\n* [#10042](http://dev.ckeditor.com/ticket/10042): Introduced [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title) setting to change the human-readable title of the editor.\r\n* [#9794](http://dev.ckeditor.com/ticket/9794): Added [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event.\r\n* [#9923](http://dev.ckeditor.com/ticket/9923): HiDPI support in the editor UI. HiDPI icons for [Moono skin](http://ckeditor.com/addon/moono) added.\r\n* [#8031](http://dev.ckeditor.com/ticket/8031): Handle `required` attributes on `<textarea>` elements &mdash; introduced [`editor.required`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-required) event.\r\n* [#10280](http://dev.ckeditor.com/ticket/10280): Ability to replace `<textarea>` elements with the inline editor.\r\n\r\nFixed Issues:\r\n\r\n* [#10599](http://dev.ckeditor.com/ticket/10599): [Indent](http://ckeditor.com/addon/indent) plugin is no longer required by the [List](http://ckeditor.com/addon/list) plugin.\r\n* [#10370](http://dev.ckeditor.com/ticket/10370): Inconsistency in data events between framed and inline editors.\r\n* [#10438](http://dev.ckeditor.com/ticket/10438): [FF, IE] No selection is done on an editable element on executing [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData).\r\n\r\n## CKEditor 4.1.3\r\n\r\nNew Features:\r\n\r\n* Added new translation: Indonesian.\r\n\r\nFixed Issues:\r\n\r\n* [#10644](http://dev.ckeditor.com/ticket/10644): Fixed a critical bug when pasting plain text in Blink-based browsers.\r\n* [#5189](http://dev.ckeditor.com/ticket/5189): [Find/Replace](http://ckeditor.com/addon/find) dialog window: rename \"Cancel\" button to \"Close\".\r\n* [#10562](http://dev.ckeditor.com/ticket/10562): [Housekeeping] Unified CSS gradient filter formats in the [Moono](http://ckeditor.com/addon/moono) skin.\r\n* [#10537](http://dev.ckeditor.com/ticket/10537): Advanced Content Filter should register a default rule for [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode).\r\n* [#10610](http://dev.ckeditor.com/ticket/10610): [`CKEDITOR.dialog.addIframe()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog-static-method-addIframe) incorrectly sets the iframe size in dialog windows.\r\n\r\n## CKEditor 4.1.2\r\n\r\nNew Features:\r\n\r\n* Added new translation: Sinhala.\r\n\r\nFixed Issues:\r\n\r\n* [#10339](http://dev.ckeditor.com/ticket/10339): Fixed: Error thrown when inserted data was totally stripped out after filtering and processing.\r\n* [#10298](http://dev.ckeditor.com/ticket/10298): Fixed: Data processor breaks attributes containing protected parts.\r\n* [#10367](http://dev.ckeditor.com/ticket/10367): Fixed: [`editable.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertText) loses characters when `RegExp` replace controls are being inserted.\r\n* [#10165](http://dev.ckeditor.com/ticket/10165): [IE] Access denied error when `document.domain` has been altered.\r\n* [#9761](http://dev.ckeditor.com/ticket/9761): Update the *Backspace* key state in [`keystrokeHandler.blockedKeystrokes`](http://docs.ckeditor.com/#!/api/CKEDITOR.keystrokeHandler-property-blockedKeystrokes) when calling [`editor.setReadOnly()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly).\r\n* [#6504](http://dev.ckeditor.com/ticket/6504): Fixed: Race condition while loading several [`config.customConfig`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-customConfig) files.\r\n* [#10146](http://dev.ckeditor.com/ticket/10146): [Firefox] Empty lines are being removed while [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) is [`CKEDITOR.ENTER_BR`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-ENTER_BR).\r\n* [#10360](http://dev.ckeditor.com/ticket/10360): Fixed: ARIA `role=\"application\"` should not be used for dialog windows.\r\n* [#10361](http://dev.ckeditor.com/ticket/10361): Fixed: ARIA `role=\"application\"` should not be used for floating panels.\r\n* [#10510](http://dev.ckeditor.com/ticket/10510): Introduced unique voice labels to differentiate between different editor instances.\r\n* [#9945](http://dev.ckeditor.com/ticket/9945): [iOS] Scrolling not possible on iPad.\r\n* [#10389](http://dev.ckeditor.com/ticket/10389): Fixed: Invalid HTML in the \"Text and Table\" template.\r\n* [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin user interface was changed to match CKEditor 4 style.\r\n\r\n## CKEditor 4.1.1\r\n\r\nNew Features:\r\n\r\n* Added new translation: Albanian.\r\n\r\nFixed Issues:\r\n\r\n* [#10172](http://dev.ckeditor.com/ticket/10172): Pressing *Delete* or *Backspace* in an empty table cell moves the cursor to the next/previous cell.\r\n* [#10219](http://dev.ckeditor.com/ticket/10219): Error thrown when destroying an editor instance in parallel with a `mouseup` event.\r\n* [#10265](http://dev.ckeditor.com/ticket/10265): Wrong loop type in the [File Browser](http://ckeditor.com/addon/filebrowser) plugin.\r\n* [#10249](http://dev.ckeditor.com/ticket/10249): Wrong undo/redo states at start.\r\n* [#10268](http://dev.ckeditor.com/ticket/10268): [Show Blocks](http://ckeditor.com/addon/showblocks) does not recover after switching to Source view.\r\n* [#9995](http://dev.ckeditor.com/ticket/9995): HTML code in the `<textarea>` should not be modified by the [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor).\r\n* [#10320](http://dev.ckeditor.com/ticket/10320): [Justify](http://ckeditor.com/addon/justify) plugin should add elements to Advanced Content Filter based on current [Enter mode](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode).\r\n* [#10260](http://dev.ckeditor.com/ticket/10260): Fixed: Advanced Content Filter blocks [`tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces). Unified `data-cke-*` attributes filtering.\r\n* [#10315](http://dev.ckeditor.com/ticket/10315): [WebKit] [Undo manager](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager) should not record snapshots after a filling character was added/removed.\r\n* [#10291](http://dev.ckeditor.com/ticket/10291): [WebKit] Space after a filling character should be secured.\r\n* [#10330](http://dev.ckeditor.com/ticket/10330): [WebKit] The filling character is not removed on `keydown` in specific cases.\r\n* [#10285](http://dev.ckeditor.com/ticket/10285): Fixed: Styled text pasted from MS Word causes an infinite loop.\r\n* [#10131](http://dev.ckeditor.com/ticket/10131): Fixed: [`undoManager.update()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-method-update) does not refresh the command state.\r\n* [#10337](http://dev.ckeditor.com/ticket/10337): Fixed: Unable to remove `<s>` using [Remove Format](http://ckeditor.com/addon/removeformat).\r\n\r\n## CKEditor 4.1\r\n\r\nFixed Issues:\r\n\r\n* [#10192](http://dev.ckeditor.com/ticket/10192): Closing lists with the *Enter* key does not work with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) in several cases.\r\n* [#10191](http://dev.ckeditor.com/ticket/10191): Fixed allowed content rules unification, so the [`filter.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-property-allowedContent) property always contains rules in the same format.\r\n* [#10224](http://dev.ckeditor.com/ticket/10224): Advanced Content Filter does not remove non-empty `<a>` elements anymore.\r\n* Minor issues in plugin integration with Advanced Content Filter:\r\n  * [#10166](http://dev.ckeditor.com/ticket/10166): Added transformation from the `align` attribute to `float` style to preserve backward compatibility after the introduction of Advanced Content Filter.\r\n  * [#10195](http://dev.ckeditor.com/ticket/10195): [Image](http://ckeditor.com/addon/image) plugin no longer registers rules for links to Advanced Content Filter.\r\n  * [#10213](http://dev.ckeditor.com/ticket/10213): [Justify](http://ckeditor.com/addon/justify) plugin is now correctly registering rules to Advanced Content Filter when [`config.justifyClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-justifyClasses) is defined.\r\n\r\n## CKEditor 4.1 RC\r\n\r\nNew Features:\r\n\r\n* [#9829](http://dev.ckeditor.com/ticket/9829): Advanced Content Filter - data and features activation based on editor configuration.\r\n\r\n  Brand new data filtering system that works in 2 modes:\r\n\r\n  * Based on loaded features (toolbar items, plugins) - the data will be filtered according to what the editor in its\r\n  current configuration can handle.\r\n  * Based on [`config.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent) rules - the data\r\n  will be filtered and the editor features (toolbar items, commands, keystrokes) will be enabled if they are allowed.\r\n\r\n  See the `datafiltering.html` sample, [guides](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) and [`CKEDITOR.filter` API documentation](http://docs.ckeditor.com/#!/api/CKEDITOR.filter).\r\n* [#9387](http://dev.ckeditor.com/ticket/9387): Reintroduced [Shared Spaces](http://ckeditor.com/addon/sharedspace) - the ability to display toolbar and bottom editor space in selected locations and to share them by different editor instances.\r\n* [#9907](http://dev.ckeditor.com/ticket/9907): Added the [`contentPreview`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-contentPreview) event for preview data manipulation.\r\n* [#9713](http://dev.ckeditor.com/ticket/9713): Introduced the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin that brings raw HTML editing for inline editor instances.\r\n* Included in [#9829](http://dev.ckeditor.com/ticket/9829): Introduced new events, [`toHtml`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toHtml) and [`toDataFormat`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toDataFormat), allowing for better integration with data processing.\r\n* [#9981](http://dev.ckeditor.com/ticket/9981): Added ability to filter [`htmlParser.fragment`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.fragment), [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element) etc. by many [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter)s before writing structure to an HTML string.\r\n* Included in [#10103](http://dev.ckeditor.com/ticket/10103):\r\n  * Introduced the [`editor.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-status) property to make it easier to check the current status of the editor.\r\n  * Default [`command`](http://docs.ckeditor.com/#!/api/CKEDITOR.command) state is now [`CKEDITOR.TRISTATE_DISABLE`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-TRISTATE_DISABLED). It will be activated on [`editor.instanceReady`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-instanceReady) or immediately after being added if the editor is already initialized.\r\n* [#9796](http://dev.ckeditor.com/ticket/9796): Introduced `<s>` as a default tag for strikethrough, which replaces obsolete `<strike>` in HTML5.\r\n\r\n## CKEditor 4.0.3\r\n\r\nFixed Issues:\r\n\r\n* [#10196](http://dev.ckeditor.com/ticket/10196): Fixed context menus not opening with keyboard shortcuts when [Autogrow](http://ckeditor.com/addon/autogrow) is enabled.\r\n* [#10212](http://dev.ckeditor.com/ticket/10212): [IE7-10] Undo command throws errors after multiple switches between Source and WYSIWYG view.\r\n* [#10219](http://dev.ckeditor.com/ticket/10219): [Inline editor] Error thrown after calling [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy).\r\n\r\n## CKEditor 4.0.2\r\n\r\nFixed Issues:\r\n\r\n* [#9779](http://dev.ckeditor.com/ticket/9779): Fixed overriding [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl) with `CKEDITOR_GETURL`.\r\n* [#9772](http://dev.ckeditor.com/ticket/9772): Custom buttons in the dialog window footer have different look and size ([Moono](http://ckeditor.com/addon/moono), [Kama](http://ckeditor.com/addon/kama) skins).\r\n* [#9029](http://dev.ckeditor.com/ticket/9029): Custom styles added with the [`stylesSet.add()`](http://docs.ckeditor.com/#!/api/CKEDITOR.stylesSet-method-add) are displayed in the wrong order.\r\n* [#9887](http://dev.ckeditor.com/ticket/9887): Disable [Magic Line](http://ckeditor.com/addon/magicline) when [`editor.readOnly`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) is set.\r\n* [#9882](http://dev.ckeditor.com/ticket/9882): Fixed empty document title on [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) if set via the Document Properties dialog window.\r\n* [#9773](http://dev.ckeditor.com/ticket/9773): Fixed rendering problems with selection fields in the Kama skin.\r\n* [#9851](http://dev.ckeditor.com/ticket/9851): The [`selectionChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-selectionChange) event is not fired when mouse selection ended outside editable.\r\n* [#9903](http://dev.ckeditor.com/ticket/9903): [Inline editor] Bad positioning of floating space with page horizontal scroll.\r\n* [#9872](http://dev.ckeditor.com/ticket/9872): [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) returns `true` when called onload. Removed the obsolete `editor.mayBeDirty` flag.\r\n* [#9893](http://dev.ckeditor.com/ticket/9893): [IE] Fixed broken toolbar when editing mixed direction content in Quirks mode.\r\n* [#9845](http://dev.ckeditor.com/ticket/9845): Fixed TAB navigation in the [Link](http://ckeditor.com/addon/link) dialog window when the Anchor option is used and no anchors are available.\r\n* [#9883](http://dev.ckeditor.com/ticket/9883): Maximizing was making the entire page editable with [divarea](http://ckeditor.com/addon/divarea)-based editors.\r\n* [#9940](http://dev.ckeditor.com/ticket/9940): [Firefox] Navigating back to a page with the editor was making the entire page editable.\r\n* [#9966](http://dev.ckeditor.com/ticket/9966): Fixed: Unable to type square brackets with French keyboard layout. Changed [Magic Line](http://ckeditor.com/addon/magicline) keystrokes.\r\n* [#9507](http://dev.ckeditor.com/ticket/9507): [Firefox] Selection is moved before editable position when the editor is focused for the first time.\r\n* [#9947](http://dev.ckeditor.com/ticket/9947): [WebKit] Editor overflows parent container in some edge cases.\r\n* [#10105](http://dev.ckeditor.com/ticket/10105): Fixed: Broken [sourcearea](http://ckeditor.com/addon/sourcearea) view when an RTL language is set.\r\n* [#10123](http://dev.ckeditor.com/ticket/10123): [WebKit] Fixed: Several dialog windows have broken layout since the latest WebKit release.\r\n* [#10152](http://dev.ckeditor.com/ticket/10152): Fixed: Invalid ARIA property used on menu items.\r\n\r\n## CKEditor 4.0.1.1\r\n\r\nFixed Issues:\r\n\r\n* Security update: Added protection against XSS attack and possible path disclosure in the PHP sample.\r\n\r\n## CKEditor 4.0.1\r\n\r\nFixed Issues:\r\n\r\n* [#9655](http://dev.ckeditor.com/ticket/9655): Support for IE Quirks Mode in the new [Moono skin](http://ckeditor.com/addon/moono).\r\n* Accessibility issues (mainly in inline editor): [#9364](http://dev.ckeditor.com/ticket/9364), [#9368](http://dev.ckeditor.com/ticket/9368), [#9369](http://dev.ckeditor.com/ticket/9369), [#9370](http://dev.ckeditor.com/ticket/9370), [#9541](http://dev.ckeditor.com/ticket/9541), [#9543](http://dev.ckeditor.com/ticket/9543), [#9841](http://dev.ckeditor.com/ticket/9841), [#9844](http://dev.ckeditor.com/ticket/9844).\r\n* [Magic Line](http://ckeditor.com/addon/magicline) plugin:\r\n    * [#9481](http://dev.ckeditor.com/ticket/9481): Added accessibility support for Magic Line.\r\n    * [#9509](http://dev.ckeditor.com/ticket/9509): Added Magic Line support for forms.\r\n    * [#9573](http://dev.ckeditor.com/ticket/9573): Magic Line does not disappear on `mouseout` in a specific case.\r\n* [#9754](http://dev.ckeditor.com/ticket/9754): [WebKit] Cutting & pasting simple unformatted text generates an inline wrapper in WebKit browsers.\r\n* [#9456](http://dev.ckeditor.com/ticket/9456): [Chrome] Properly paste bullet list style from MS Word.\r\n* [#9699](http://dev.ckeditor.com/ticket/9699), [#9758](http://dev.ckeditor.com/ticket/9758): Improved selection locking when selecting by dragging.\r\n* Context menu:\r\n    * [#9712](http://dev.ckeditor.com/ticket/9712): Opening the context menu destroys editor focus.\r\n    * [#9366](http://dev.ckeditor.com/ticket/9366): Context menu should be displayed over the floating toolbar.\r\n    * [#9706](http://dev.ckeditor.com/ticket/9706): Context menu generates a JavaScript error in inline mode when the editor is attached to a header element.\r\n* [#9800](http://dev.ckeditor.com/ticket/9800): Hide float panel when resizing the window.\r\n* [#9721](http://dev.ckeditor.com/ticket/9721): Padding in content of div-based editor puts the editing area under the bottom UI space.\r\n* [#9528](http://dev.ckeditor.com/ticket/9528): Host page `box-sizing` style should not influence the editor UI elements.\r\n* [#9503](http://dev.ckeditor.com/ticket/9503): [Form Elements](http://ckeditor.com/addon/forms) plugin adds context menu listeners only on supported input types. Added support for `tel`, `email`, `search` and `url` input types.\r\n* [#9769](http://dev.ckeditor.com/ticket/9769): Improved floating toolbar positioning in a narrow window.\r\n* [#9875](http://dev.ckeditor.com/ticket/9875): Table dialog window does not populate width correctly.\r\n* [#8675](http://dev.ckeditor.com/ticket/8675): Deleting cells in a nested table removes the outer table cell.\r\n* [#9815](http://dev.ckeditor.com/ticket/9815): Cannot edit dialog window fields in an editor initialized in the jQuery UI modal dialog.\r\n* [#8888](http://dev.ckeditor.com/ticket/8888): CKEditor dialog windows do not show completely in a small window.\r\n* [#9360](http://dev.ckeditor.com/ticket/9360): [Inline editor] Blocks shown for a `<div>` element stay permanently even after the user exits editing the `<div>`.\r\n* [#9531](http://dev.ckeditor.com/ticket/9531): [Firefox & Inline editor] Toolbar is lost when closing the Format drop-down list by clicking its button.\r\n* [#9553](http://dev.ckeditor.com/ticket/9553): Table width incorrectly set when the `border-width` style is specified.\r\n* [#9594](http://dev.ckeditor.com/ticket/9594): Cannot tab past CKEditor when it is in read-only mode.\r\n* [#9658](http://dev.ckeditor.com/ticket/9658): [IE9] Justify not working on selected images.\r\n* [#9686](http://dev.ckeditor.com/ticket/9686): Added missing contents styles for `<pre>` elements.\r\n* [#9709](http://dev.ckeditor.com/ticket/9709): [Paste from Word](http://ckeditor.com/addon/pastefromword) should not depend on configuration from other styles.\r\n* [#9726](http://dev.ckeditor.com/ticket/9726): Removed [Color Dialog](http://ckeditor.com/addon/colordialog) plugin dependency from [Table Tools](http://ckeditor.com/addon/tabletools).\r\n* [#9765](http://dev.ckeditor.com/ticket/9765): Toolbar Collapse command documented incorrectly in the [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp) dialog window.\r\n* [#9771](http://dev.ckeditor.com/ticket/9771): [WebKit & Opera] Fixed scrolling issues when pasting.\r\n* [#9787](http://dev.ckeditor.com/ticket/9787): [IE9] `onChange` is not fired for checkboxes in dialogs.\r\n* [#9842](http://dev.ckeditor.com/ticket/9842): [Firefox 17] When opening a toolbar menu for the first time and pressing the *Down Arrow* key, focus goes to the next toolbar button instead of the menu options.\r\n* [#9847](http://dev.ckeditor.com/ticket/9847): [Elements Path](http://ckeditor.com/addon/elementspath) should not be initialized in the inline editor.\r\n* [#9853](http://dev.ckeditor.com/ticket/9853): [`editor.addRemoveFormatFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addRemoveFormatFilter) is exposed before it really works.\r\n* [#8893](http://dev.ckeditor.com/ticket/8893): Value of the [`pasteFromWordCleanupFile`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-pasteFromWordCleanupFile) configuration option is now taken from the instance configuration.\r\n* [#9693](http://dev.ckeditor.com/ticket/9693): Removed \"Live Preview\" checkbox from UI color picker.\r\n\r\n\r\n## CKEditor 4.0\r\n\r\nThe first stable release of the new CKEditor 4 code line.\r\n\r\nThe CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever\r\npossible. The list of relevant changes can be found in the [API Changes page of\r\nthe CKEditor 4 documentation][1].\r\n\r\n[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes \"API Changes\"\r\n"
  },
  {
    "path": "assets/ckeditor/LICENSE.md",
    "content": "Software License Agreement\r\n==========================\r\n\r\nCKEditor - The text editor for Internet - http://ckeditor.com\r\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\r\n\r\nLicensed under the terms of any of the following licenses at your\r\nchoice:\r\n\r\n - GNU General Public License Version 2 or later (the \"GPL\")\r\n   http://www.gnu.org/licenses/gpl.html\r\n   (See Appendix A)\r\n\r\n - GNU Lesser General Public License Version 2.1 or later (the \"LGPL\")\r\n   http://www.gnu.org/licenses/lgpl.html\r\n   (See Appendix B)\r\n\r\n - Mozilla Public License Version 1.1 or later (the \"MPL\")\r\n   http://www.mozilla.org/MPL/MPL-1.1.html\r\n   (See Appendix C)\r\n\r\nYou are not required to, but if you want to explicitly declare the\r\nlicense you have chosen to be bound to when using, reproducing,\r\nmodifying and distributing this software, just include a text file\r\ntitled \"legal.txt\" in your version of this software, indicating your\r\nlicense choice. In any case, your choice will not restrict any\r\nrecipient of your version of this software to use, reproduce, modify\r\nand distribute this software under any of the above licenses.\r\n\r\nSources of Intellectual Property Included in CKEditor\r\n-----------------------------------------------------\r\n\r\nWhere not otherwise indicated, all CKEditor content is authored by\r\nCKSource engineers and consists of CKSource-owned intellectual\r\nproperty. In some specific instances, CKEditor will incorporate work\r\ndone by developers outside of CKSource with their express permission.\r\n\r\nThe following libraries are included in CKEditor under the MIT license (see Appendix D):\r\n\r\n* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2016, CKSource - Frederico Knabben.\r\n* PicoModal (included in `samples/js/sf.js`) - Copyright (c) 2012 James Frasca.\r\n* CodeMirror (included in the samples) - Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others.\r\n\r\nParts of code taken from the following libraries are included in CKEditor under the MIT license (see Appendix D):\r\n\r\n* jQuery (inspired the domReady function, ckeditor_base.js) - Copyright (c) 2011 John Resig, http://jquery.com/\r\n\r\nThe following libraries are included in CKEditor under the SIL Open Font License, Version 1.1 (see Appendix E):\r\n\r\n* Font Awesome (included in the toolbar configurator) - Copyright (C) 2012 by Dave Gandy.\r\n\r\nThe following libraries are included in CKEditor under the BSD-3 License (see Appendix F):\r\n\r\n* highlight.js (included in the `codesnippet` plugin) - Copyright (c) 2006, Ivan Sagalaev.\r\n* YUI Library (included in the `uicolor` plugin) - Copyright (c) 2009, Yahoo! Inc.\r\n\r\n\r\nTrademarks\r\n----------\r\n\r\nCKEditor is a trademark of CKSource - Frederico Knabben. All other brand\r\nand product names are trademarks, registered trademarks or service\r\nmarks of their respective holders.\r\n\r\n---\r\n\r\nAppendix A: The GPL License\r\n---------------------------\r\n\r\n```\r\nGNU GENERAL PUBLIC LICENSE\r\nVersion 2, June 1991\r\n\r\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\r\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\nPreamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicense is intended to guarantee your freedom to share and change free\r\nsoftware-to make sure the software is free for all its users.  This\r\nGeneral Public License applies to most of the Free Software\r\nFoundation's software and to any other program whose authors commit to\r\nusing it.  (Some other Free Software Foundation software is covered by\r\nthe GNU Lesser General Public License instead.)  You can apply it to\r\nyour programs, too.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthis service if you wish), that you receive source code or can get it\r\nif you want it, that you can change the software or use pieces of it\r\nin new free programs; and that you know you can do these things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\nanyone to deny you these rights or to ask you to surrender the rights.\r\nThese restrictions translate to certain responsibilities for you if you\r\ndistribute copies of the software, or if you modify it.\r\n\r\n  For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must give the recipients all the rights that\r\nyou have.  You must make sure that they, too, receive or can get the\r\nsource code.  And you must show them these terms so they know their\r\nrights.\r\n\r\n  We protect your rights with two steps: (1) copyright the software, and\r\n(2) offer you this license which gives you legal permission to copy,\r\ndistribute and/or modify the software.\r\n\r\n  Also, for each author's protection and ours, we want to make certain\r\nthat everyone understands that there is no warranty for this free\r\nsoftware.  If the software is modified by someone else and passed on, we\r\nwant its recipients to know that what they have is not the original, so\r\nthat any problems introduced by others will not reflect on the original\r\nauthors' reputations.\r\n\r\n  Finally, any free program is threatened constantly by software\r\npatents.  We wish to avoid the danger that redistributors of a free\r\nprogram will individually obtain patent licenses, in effect making the\r\nprogram proprietary.  To prevent this, we have made it clear that any\r\npatent must be licensed for everyone's free use or not licensed at all.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\nGNU GENERAL PUBLIC LICENSE\r\nTERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License applies to any program or other work which contains\r\na notice placed by the copyright holder saying it may be distributed\r\nunder the terms of this General Public License.  The \"Program\", below,\r\nrefers to any such program or work, and a \"work based on the Program\"\r\nmeans either the Program or any derivative work under copyright law:\r\nthat is to say, a work containing the Program or a portion of it,\r\neither verbatim or with modifications and/or translated into another\r\nlanguage.  (Hereinafter, translation is included without limitation in\r\nthe term \"modification\".)  Each licensee is addressed as \"you\".\r\n\r\nActivities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning the Program is not restricted, and the output from the Program\r\nis covered only if its contents constitute a work based on the\r\nProgram (independent of having been made by running the Program).\r\nWhether that is true depends on what the Program does.\r\n\r\n  1. You may copy and distribute verbatim copies of the Program's\r\nsource code as you receive it, in any medium, provided that you\r\nconspicuously and appropriately publish on each copy an appropriate\r\ncopyright notice and disclaimer of warranty; keep intact all the\r\nnotices that refer to this License and to the absence of any warranty;\r\nand give any other recipients of the Program a copy of this License\r\nalong with the Program.\r\n\r\nYou may charge a fee for the physical act of transferring a copy, and\r\nyou may at your option offer warranty protection in exchange for a fee.\r\n\r\n  2. You may modify your copy or copies of the Program or any portion\r\nof it, thus forming a work based on the Program, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) You must cause the modified files to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    b) You must cause any work that you distribute or publish, that in\r\n    whole or in part contains or is derived from the Program or any\r\n    part thereof, to be licensed as a whole at no charge to all third\r\n    parties under the terms of this License.\r\n\r\n    c) If the modified program normally reads commands interactively\r\n    when run, you must cause it, when started running for such\r\n    interactive use in the most ordinary way, to print or display an\r\n    announcement including an appropriate copyright notice and a\r\n    notice that there is no warranty (or else, saying that you provide\r\n    a warranty) and that users may redistribute the program under\r\n    these conditions, and telling the user how to view a copy of this\r\n    License.  (Exception: if the Program itself is interactive but\r\n    does not normally print such an announcement, your work based on\r\n    the Program is not required to print an announcement.)\r\n\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Program,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Program, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote it.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Program.\r\n\r\nIn addition, mere aggregation of another work not based on the Program\r\nwith the Program (or with a work based on the Program) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may copy and distribute the Program (or a work based on it,\r\nunder Section 2) in object code or executable form under the terms of\r\nSections 1 and 2 above provided that you also do one of the following:\r\n\r\n    a) Accompany it with the complete corresponding machine-readable\r\n    source code, which must be distributed under the terms of Sections\r\n    1 and 2 above on a medium customarily used for software interchange; or,\r\n\r\n    b) Accompany it with a written offer, valid for at least three\r\n    years, to give any third party, for a charge no more than your\r\n    cost of physically performing source distribution, a complete\r\n    machine-readable copy of the corresponding source code, to be\r\n    distributed under the terms of Sections 1 and 2 above on a medium\r\n    customarily used for software interchange; or,\r\n\r\n    c) Accompany it with the information you received as to the offer\r\n    to distribute corresponding source code.  (This alternative is\r\n    allowed only for noncommercial distribution and only if you\r\n    received the program in object code or executable form with such\r\n    an offer, in accord with Subsection b above.)\r\n\r\nThe source code for a work means the preferred form of the work for\r\nmaking modifications to it.  For an executable work, complete source\r\ncode means all the source code for all modules it contains, plus any\r\nassociated interface definition files, plus the scripts used to\r\ncontrol compilation and installation of the executable.  However, as a\r\nspecial exception, the source code distributed need not include\r\nanything that is normally distributed (in either source or binary\r\nform) with the major components (compiler, kernel, and so on) of the\r\noperating system on which the executable runs, unless that component\r\nitself accompanies the executable.\r\n\r\nIf distribution of executable or object code is made by offering\r\naccess to copy from a designated place, then offering equivalent\r\naccess to copy the source code from the same place counts as\r\ndistribution of the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\r\n  4. You may not copy, modify, sublicense, or distribute the Program\r\nexcept as expressly provided under this License.  Any attempt\r\notherwise to copy, modify, sublicense or distribute the Program is\r\nvoid, and will automatically terminate your rights under this License.\r\nHowever, parties who have received copies, or rights, from you under\r\nthis License will not have their licenses terminated so long as such\r\nparties remain in full compliance.\r\n\r\n  5. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Program or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Program (or any work based on the\r\nProgram), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Program or works based on it.\r\n\r\n  6. Each time you redistribute the Program (or any work based on the\r\nProgram), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute or modify the Program subject to\r\nthese terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties to\r\nthis License.\r\n\r\n  7. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Program at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Program by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Program.\r\n\r\nIf any portion of this section is held invalid or unenforceable under\r\nany particular circumstance, the balance of the section is intended to\r\napply and the section as a whole is intended to apply in other\r\ncircumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system, which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\r\n  8. If the distribution and/or use of the Program is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Program under this License\r\nmay add an explicit geographical distribution limitation excluding\r\nthose countries, so that distribution is permitted only in or among\r\ncountries not thus excluded.  In such case, this License incorporates\r\nthe limitation as if written in the body of this License.\r\n\r\n  9. The Free Software Foundation may publish revised and/or new versions\r\nof the General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Program\r\nspecifies a version number of this License which applies to it and \"any\r\nlater version\", you have the option of following the terms and conditions\r\neither of that version or of any later version published by the Free\r\nSoftware Foundation.  If the Program does not specify a version number of\r\nthis License, you may choose any version ever published by the Free Software\r\nFoundation.\r\n\r\n  10. If you wish to incorporate parts of the Program into other free\r\nprograms whose distribution conditions are different, write to the author\r\nto ask for permission.  For software which is copyrighted by the Free\r\nSoftware Foundation, write to the Free Software Foundation; we sometimes\r\nmake exceptions for this.  Our decision will be guided by the two goals\r\nof preserving the free status of all derivatives of our free software and\r\nof promoting the sharing and reuse of software generally.\r\n\r\nNO WARRANTY\r\n\r\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\r\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\r\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\r\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r\nREPAIR OR CORRECTION.\r\n\r\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r\nPOSSIBILITY OF SUCH DAMAGES.\r\n\r\nEND OF TERMS AND CONDITIONS\r\n```\r\n\r\nAppendix B: The LGPL License\r\n----------------------------\r\n\r\n```\r\nGNU LESSER GENERAL PUBLIC LICENSE\r\nVersion 2.1, February 1999\r\n\r\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n[This is the first released version of the Lesser GPL.  It also counts\r\n as the successor of the GNU Library Public License, version 2, hence\r\n the version number 2.1.]\r\n\r\nPreamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicenses are intended to guarantee your freedom to share and change\r\nfree software-to make sure the software is free for all its users.\r\n\r\n  This license, the Lesser General Public License, applies to some\r\nspecially designated software packages-typically libraries-of the\r\nFree Software Foundation and other authors who decide to use it.  You\r\ncan use it too, but we suggest you first think carefully about whether\r\nthis license or the ordinary General Public License is the better\r\nstrategy to use in any particular case, based on the explanations below.\r\n\r\n  When we speak of free software, we are referring to freedom of use,\r\nnot price.  Our General Public Licenses are designed to make sure that\r\nyou have the freedom to distribute copies of free software (and charge\r\nfor this service if you wish); that you receive source code or can get\r\nit if you want it; that you can change the software and use pieces of\r\nit in new free programs; and that you are informed that you can do\r\nthese things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\ndistributors to deny you these rights or to ask you to surrender these\r\nrights.  These restrictions translate to certain responsibilities for\r\nyou if you distribute copies of the library or if you modify it.\r\n\r\n  For example, if you distribute copies of the library, whether gratis\r\nor for a fee, you must give the recipients all the rights that we gave\r\nyou.  You must make sure that they, too, receive or can get the source\r\ncode.  If you link other code with the library, you must provide\r\ncomplete object files to the recipients, so that they can relink them\r\nwith the library after making changes to the library and recompiling\r\nit.  And you must show them these terms so they know their rights.\r\n\r\n  We protect your rights with a two-step method: (1) we copyright the\r\nlibrary, and (2) we offer you this license, which gives you legal\r\npermission to copy, distribute and/or modify the library.\r\n\r\n  To protect each distributor, we want to make it very clear that\r\nthere is no warranty for the free library.  Also, if the library is\r\nmodified by someone else and passed on, the recipients should know\r\nthat what they have is not the original version, so that the original\r\nauthor's reputation will not be affected by problems that might be\r\nintroduced by others.\r\n\r\n  Finally, software patents pose a constant threat to the existence of\r\nany free program.  We wish to make sure that a company cannot\r\neffectively restrict the users of a free program by obtaining a\r\nrestrictive license from a patent holder.  Therefore, we insist that\r\nany patent license obtained for a version of the library must be\r\nconsistent with the full freedom of use specified in this license.\r\n\r\n  Most GNU software, including some libraries, is covered by the\r\nordinary GNU General Public License.  This license, the GNU Lesser\r\nGeneral Public License, applies to certain designated libraries, and\r\nis quite different from the ordinary General Public License.  We use\r\nthis license for certain libraries in order to permit linking those\r\nlibraries into non-free programs.\r\n\r\n  When a program is linked with a library, whether statically or using\r\na shared library, the combination of the two is legally speaking a\r\ncombined work, a derivative of the original library.  The ordinary\r\nGeneral Public License therefore permits such linking only if the\r\nentire combination fits its criteria of freedom.  The Lesser General\r\nPublic License permits more lax criteria for linking other code with\r\nthe library.\r\n\r\n  We call this license the \"Lesser\" General Public License because it\r\ndoes Less to protect the user's freedom than the ordinary General\r\nPublic License.  It also provides other free software developers Less\r\nof an advantage over competing non-free programs.  These disadvantages\r\nare the reason we use the ordinary General Public License for many\r\nlibraries.  However, the Lesser license provides advantages in certain\r\nspecial circumstances.\r\n\r\n  For example, on rare occasions, there may be a special need to\r\nencourage the widest possible use of a certain library, so that it becomes\r\na de-facto standard.  To achieve this, non-free programs must be\r\nallowed to use the library.  A more frequent case is that a free\r\nlibrary does the same job as widely used non-free libraries.  In this\r\ncase, there is little to gain by limiting the free library to free\r\nsoftware only, so we use the Lesser General Public License.\r\n\r\n  In other cases, permission to use a particular library in non-free\r\nprograms enables a greater number of people to use a large body of\r\nfree software.  For example, permission to use the GNU C Library in\r\nnon-free programs enables many more people to use the whole GNU\r\noperating system, as well as its variant, the GNU/Linux operating\r\nsystem.\r\n\r\n  Although the Lesser General Public License is Less protective of the\r\nusers' freedom, it does ensure that the user of a program that is\r\nlinked with the Library has the freedom and the wherewithal to run\r\nthat program using a modified version of the Library.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.  Pay close attention to the difference between a\r\n\"work based on the library\" and a \"work that uses the library\".  The\r\nformer contains code derived from the library, whereas the latter must\r\nbe combined with the library in order to run.\r\n\r\nGNU LESSER GENERAL PUBLIC LICENSE\r\nTERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License Agreement applies to any software library or other\r\nprogram which contains a notice placed by the copyright holder or\r\nother authorized party saying it may be distributed under the terms of\r\nthis Lesser General Public License (also called \"this License\").\r\nEach licensee is addressed as \"you\".\r\n\r\n  A \"library\" means a collection of software functions and/or data\r\nprepared so as to be conveniently linked with application programs\r\n(which use some of those functions and data) to form executables.\r\n\r\n  The \"Library\", below, refers to any such software library or work\r\nwhich has been distributed under these terms.  A \"work based on the\r\nLibrary\" means either the Library or any derivative work under\r\ncopyright law: that is to say, a work containing the Library or a\r\nportion of it, either verbatim or with modifications and/or translated\r\nstraightforwardly into another language.  (Hereinafter, translation is\r\nincluded without limitation in the term \"modification\".)\r\n\r\n  \"Source code\" for a work means the preferred form of the work for\r\nmaking modifications to it.  For a library, complete source code means\r\nall the source code for all modules it contains, plus any associated\r\ninterface definition files, plus the scripts used to control compilation\r\nand installation of the library.\r\n\r\n  Activities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning a program using the Library is not restricted, and output from\r\nsuch a program is covered only if its contents constitute a work based\r\non the Library (independent of the use of the Library in a tool for\r\nwriting it).  Whether that is true depends on what the Library does\r\nand what the program that uses the Library does.\r\n\r\n  1. You may copy and distribute verbatim copies of the Library's\r\ncomplete source code as you receive it, in any medium, provided that\r\nyou conspicuously and appropriately publish on each copy an\r\nappropriate copyright notice and disclaimer of warranty; keep intact\r\nall the notices that refer to this License and to the absence of any\r\nwarranty; and distribute a copy of this License along with the\r\nLibrary.\r\n\r\n  You may charge a fee for the physical act of transferring a copy,\r\nand you may at your option offer warranty protection in exchange for a\r\nfee.\r\n\r\n  2. You may modify your copy or copies of the Library or any portion\r\nof it, thus forming a work based on the Library, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) The modified work must itself be a software library.\r\n\r\n    b) You must cause the files modified to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    c) You must cause the whole of the work to be licensed at no\r\n    charge to all third parties under the terms of this License.\r\n\r\n    d) If a facility in the modified Library refers to a function or a\r\n    table of data to be supplied by an application program that uses\r\n    the facility, other than as an argument passed when the facility\r\n    is invoked, then you must make a good faith effort to ensure that,\r\n    in the event an application does not supply such function or\r\n    table, the facility still operates, and performs whatever part of\r\n    its purpose remains meaningful.\r\n\r\n    (For example, a function in a library to compute square roots has\r\n    a purpose that is entirely well-defined independent of the\r\n    application.  Therefore, Subsection 2d requires that any\r\n    application-supplied function or table used by this function must\r\n    be optional: if the application does not supply it, the square\r\n    root function must still compute square roots.)\r\n\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Library,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Library, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote\r\nit.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Library.\r\n\r\nIn addition, mere aggregation of another work not based on the Library\r\nwith the Library (or with a work based on the Library) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may opt to apply the terms of the ordinary GNU General Public\r\nLicense instead of this License to a given copy of the Library.  To do\r\nthis, you must alter all the notices that refer to this License, so\r\nthat they refer to the ordinary GNU General Public License, version 2,\r\ninstead of to this License.  (If a newer version than version 2 of the\r\nordinary GNU General Public License has appeared, then you can specify\r\nthat version instead if you wish.)  Do not make any other change in\r\nthese notices.\r\n\r\n  Once this change is made in a given copy, it is irreversible for\r\nthat copy, so the ordinary GNU General Public License applies to all\r\nsubsequent copies and derivative works made from that copy.\r\n\r\n  This option is useful when you wish to copy part of the code of\r\nthe Library into a program that is not a library.\r\n\r\n  4. You may copy and distribute the Library (or a portion or\r\nderivative of it, under Section 2) in object code or executable form\r\nunder the terms of Sections 1 and 2 above provided that you accompany\r\nit with the complete corresponding machine-readable source code, which\r\nmust be distributed under the terms of Sections 1 and 2 above on a\r\nmedium customarily used for software interchange.\r\n\r\n  If distribution of object code is made by offering access to copy\r\nfrom a designated place, then offering equivalent access to copy the\r\nsource code from the same place satisfies the requirement to\r\ndistribute the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\r\n  5. A program that contains no derivative of any portion of the\r\nLibrary, but is designed to work with the Library by being compiled or\r\nlinked with it, is called a \"work that uses the Library\".  Such a\r\nwork, in isolation, is not a derivative work of the Library, and\r\ntherefore falls outside the scope of this License.\r\n\r\n  However, linking a \"work that uses the Library\" with the Library\r\ncreates an executable that is a derivative of the Library (because it\r\ncontains portions of the Library), rather than a \"work that uses the\r\nlibrary\".  The executable is therefore covered by this License.\r\nSection 6 states terms for distribution of such executables.\r\n\r\n  When a \"work that uses the Library\" uses material from a header file\r\nthat is part of the Library, the object code for the work may be a\r\nderivative work of the Library even though the source code is not.\r\nWhether this is true is especially significant if the work can be\r\nlinked without the Library, or if the work is itself a library.  The\r\nthreshold for this to be true is not precisely defined by law.\r\n\r\n  If such an object file uses only numerical parameters, data\r\nstructure layouts and accessors, and small macros and small inline\r\nfunctions (ten lines or less in length), then the use of the object\r\nfile is unrestricted, regardless of whether it is legally a derivative\r\nwork.  (Executables containing this object code plus portions of the\r\nLibrary will still fall under Section 6.)\r\n\r\n  Otherwise, if the work is a derivative of the Library, you may\r\ndistribute the object code for the work under the terms of Section 6.\r\nAny executables containing that work also fall under Section 6,\r\nwhether or not they are linked directly with the Library itself.\r\n\r\n  6. As an exception to the Sections above, you may also combine or\r\nlink a \"work that uses the Library\" with the Library to produce a\r\nwork containing portions of the Library, and distribute that work\r\nunder terms of your choice, provided that the terms permit\r\nmodification of the work for the customer's own use and reverse\r\nengineering for debugging such modifications.\r\n\r\n  You must give prominent notice with each copy of the work that the\r\nLibrary is used in it and that the Library and its use are covered by\r\nthis License.  You must supply a copy of this License.  If the work\r\nduring execution displays copyright notices, you must include the\r\ncopyright notice for the Library among them, as well as a reference\r\ndirecting the user to the copy of this License.  Also, you must do one\r\nof these things:\r\n\r\n    a) Accompany the work with the complete corresponding\r\n    machine-readable source code for the Library including whatever\r\n    changes were used in the work (which must be distributed under\r\n    Sections 1 and 2 above); and, if the work is an executable linked\r\n    with the Library, with the complete machine-readable \"work that\r\n    uses the Library\", as object code and/or source code, so that the\r\n    user can modify the Library and then relink to produce a modified\r\n    executable containing the modified Library.  (It is understood\r\n    that the user who changes the contents of definitions files in the\r\n    Library will not necessarily be able to recompile the application\r\n    to use the modified definitions.)\r\n\r\n    b) Use a suitable shared library mechanism for linking with the\r\n    Library.  A suitable mechanism is one that (1) uses at run time a\r\n    copy of the library already present on the user's computer system,\r\n    rather than copying library functions into the executable, and (2)\r\n    will operate properly with a modified version of the library, if\r\n    the user installs one, as long as the modified version is\r\n    interface-compatible with the version that the work was made with.\r\n\r\n    c) Accompany the work with a written offer, valid for at\r\n    least three years, to give the same user the materials\r\n    specified in Subsection 6a, above, for a charge no more\r\n    than the cost of performing this distribution.\r\n\r\n    d) If distribution of the work is made by offering access to copy\r\n    from a designated place, offer equivalent access to copy the above\r\n    specified materials from the same place.\r\n\r\n    e) Verify that the user has already received a copy of these\r\n    materials or that you have already sent this user a copy.\r\n\r\n  For an executable, the required form of the \"work that uses the\r\nLibrary\" must include any data and utility programs needed for\r\nreproducing the executable from it.  However, as a special exception,\r\nthe materials to be distributed need not include anything that is\r\nnormally distributed (in either source or binary form) with the major\r\ncomponents (compiler, kernel, and so on) of the operating system on\r\nwhich the executable runs, unless that component itself accompanies\r\nthe executable.\r\n\r\n  It may happen that this requirement contradicts the license\r\nrestrictions of other proprietary libraries that do not normally\r\naccompany the operating system.  Such a contradiction means you cannot\r\nuse both them and the Library together in an executable that you\r\ndistribute.\r\n\r\n  7. You may place library facilities that are a work based on the\r\nLibrary side-by-side in a single library together with other library\r\nfacilities not covered by this License, and distribute such a combined\r\nlibrary, provided that the separate distribution of the work based on\r\nthe Library and of the other library facilities is otherwise\r\npermitted, and provided that you do these two things:\r\n\r\n    a) Accompany the combined library with a copy of the same work\r\n    based on the Library, uncombined with any other library\r\n    facilities.  This must be distributed under the terms of the\r\n    Sections above.\r\n\r\n    b) Give prominent notice with the combined library of the fact\r\n    that part of it is a work based on the Library, and explaining\r\n    where to find the accompanying uncombined form of the same work.\r\n\r\n  8. You may not copy, modify, sublicense, link with, or distribute\r\nthe Library except as expressly provided under this License.  Any\r\nattempt otherwise to copy, modify, sublicense, link with, or\r\ndistribute the Library is void, and will automatically terminate your\r\nrights under this License.  However, parties who have received copies,\r\nor rights, from you under this License will not have their licenses\r\nterminated so long as such parties remain in full compliance.\r\n\r\n  9. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Library or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Library (or any work based on the\r\nLibrary), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Library or works based on it.\r\n\r\n  10. Each time you redistribute the Library (or any work based on the\r\nLibrary), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute, link with or modify the Library\r\nsubject to these terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties with\r\nthis License.\r\n\r\n  11. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Library at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Library by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Library.\r\n\r\nIf any portion of this section is held invalid or unenforceable under any\r\nparticular circumstance, the balance of the section is intended to apply,\r\nand the section as a whole is intended to apply in other circumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\r\n  12. If the distribution and/or use of the Library is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Library under this License may add\r\nan explicit geographical distribution limitation excluding those countries,\r\nso that distribution is permitted only in or among countries not thus\r\nexcluded.  In such case, this License incorporates the limitation as if\r\nwritten in the body of this License.\r\n\r\n  13. The Free Software Foundation may publish revised and/or new\r\nversions of the Lesser General Public License from time to time.\r\nSuch new versions will be similar in spirit to the present version,\r\nbut may differ in detail to address new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Library\r\nspecifies a version number of this License which applies to it and\r\n\"any later version\", you have the option of following the terms and\r\nconditions either of that version or of any later version published by\r\nthe Free Software Foundation.  If the Library does not specify a\r\nlicense version number, you may choose any version ever published by\r\nthe Free Software Foundation.\r\n\r\n  14. If you wish to incorporate parts of the Library into other free\r\nprograms whose distribution conditions are incompatible with these,\r\nwrite to the author to ask for permission.  For software which is\r\ncopyrighted by the Free Software Foundation, write to the Free\r\nSoftware Foundation; we sometimes make exceptions for this.  Our\r\ndecision will be guided by the two goals of preserving the free status\r\nof all derivatives of our free software and of promoting the sharing\r\nand reuse of software generally.\r\n\r\nNO WARRANTY\r\n\r\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\r\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r\nDAMAGES.\r\n\r\nEND OF TERMS AND CONDITIONS\r\n```\r\n\r\nAppendix C: The MPL License\r\n---------------------------\r\n\r\n```\r\nMOZILLA PUBLIC LICENSE\r\nVersion 1.1\r\n\r\n1. Definitions.\r\n\r\n     1.0.1. \"Commercial Use\" means distribution or otherwise making the\r\n     Covered Code available to a third party.\r\n\r\n     1.1. \"Contributor\" means each entity that creates or contributes to\r\n     the creation of Modifications.\r\n\r\n     1.2. \"Contributor Version\" means the combination of the Original\r\n     Code, prior Modifications used by a Contributor, and the Modifications\r\n     made by that particular Contributor.\r\n\r\n     1.3. \"Covered Code\" means the Original Code or Modifications or the\r\n     combination of the Original Code and Modifications, in each case\r\n     including portions thereof.\r\n\r\n     1.4. \"Electronic Distribution Mechanism\" means a mechanism generally\r\n     accepted in the software development community for the electronic\r\n     transfer of data.\r\n\r\n     1.5. \"Executable\" means Covered Code in any form other than Source\r\n     Code.\r\n\r\n     1.6. \"Initial Developer\" means the individual or entity identified\r\n     as the Initial Developer in the Source Code notice required by Exhibit\r\n     A.\r\n\r\n     1.7. \"Larger Work\" means a work which combines Covered Code or\r\n     portions thereof with code not governed by the terms of this License.\r\n\r\n     1.8. \"License\" means this document.\r\n\r\n     1.8.1. \"Licensable\" means having the right to grant, to the maximum\r\n     extent possible, whether at the time of the initial grant or\r\n     subsequently acquired, any and all of the rights conveyed herein.\r\n\r\n     1.9. \"Modifications\" means any addition to or deletion from the\r\n     substance or structure of either the Original Code or any previous\r\n     Modifications. When Covered Code is released as a series of files, a\r\n     Modification is:\r\n          A. Any addition to or deletion from the contents of a file\r\n          containing Original Code or previous Modifications.\r\n\r\n          B. Any new file that contains any part of the Original Code or\r\n          previous Modifications.\r\n\r\n     1.10. \"Original Code\" means Source Code of computer software code\r\n     which is described in the Source Code notice required by Exhibit A as\r\n     Original Code, and which, at the time of its release under this\r\n     License is not already Covered Code governed by this License.\r\n\r\n     1.10.1. \"Patent Claims\" means any patent claim(s), now owned or\r\n     hereafter acquired, including without limitation,  method, process,\r\n     and apparatus claims, in any patent Licensable by grantor.\r\n\r\n     1.11. \"Source Code\" means the preferred form of the Covered Code for\r\n     making modifications to it, including all modules it contains, plus\r\n     any associated interface definition files, scripts used to control\r\n     compilation and installation of an Executable, or source code\r\n     differential comparisons against either the Original Code or another\r\n     well known, available Covered Code of the Contributor's choice. The\r\n     Source Code can be in a compressed or archival form, provided the\r\n     appropriate decompression or de-archiving software is widely available\r\n     for no charge.\r\n\r\n     1.12. \"You\" (or \"Your\")  means an individual or a legal entity\r\n     exercising rights under, and complying with all of the terms of, this\r\n     License or a future version of this License issued under Section 6.1.\r\n     For legal entities, \"You\" includes any entity which controls, is\r\n     controlled by, or is under common control with You. For purposes of\r\n     this definition, \"control\" means (a) the power, direct or indirect,\r\n     to cause the direction or management of such entity, whether by\r\n     contract or otherwise, or (b) ownership of more than fifty percent\r\n     (50%) of the outstanding shares or beneficial ownership of such\r\n     entity.\r\n\r\n2. Source Code License.\r\n\r\n     2.1. The Initial Developer Grant.\r\n     The Initial Developer hereby grants You a world-wide, royalty-free,\r\n     non-exclusive license, subject to third party intellectual property\r\n     claims:\r\n          (a)  under intellectual property rights (other than patent or\r\n          trademark) Licensable by Initial Developer to use, reproduce,\r\n          modify, display, perform, sublicense and distribute the Original\r\n          Code (or portions thereof) with or without Modifications, and/or\r\n          as part of a Larger Work; and\r\n\r\n          (b) under Patents Claims infringed by the making, using or\r\n          selling of Original Code, to make, have made, use, practice,\r\n          sell, and offer for sale, and/or otherwise dispose of the\r\n          Original Code (or portions thereof).\r\n\r\n          (c) the licenses granted in this Section 2.1(a) and (b) are\r\n          effective on the date Initial Developer first distributes\r\n          Original Code under the terms of this License.\r\n\r\n          (d) Notwithstanding Section 2.1(b) above, no patent license is\r\n          granted: 1) for code that You delete from the Original Code; 2)\r\n          separate from the Original Code;  or 3) for infringements caused\r\n          by: i) the modification of the Original Code or ii) the\r\n          combination of the Original Code with other software or devices.\r\n\r\n     2.2. Contributor Grant.\r\n     Subject to third party intellectual property claims, each Contributor\r\n     hereby grants You a world-wide, royalty-free, non-exclusive license\r\n\r\n          (a)  under intellectual property rights (other than patent or\r\n          trademark) Licensable by Contributor, to use, reproduce, modify,\r\n          display, perform, sublicense and distribute the Modifications\r\n          created by such Contributor (or portions thereof) either on an\r\n          unmodified basis, with other Modifications, as Covered Code\r\n          and/or as part of a Larger Work; and\r\n\r\n          (b) under Patent Claims infringed by the making, using, or\r\n          selling of  Modifications made by that Contributor either alone\r\n          and/or in combination with its Contributor Version (or portions\r\n          of such combination), to make, use, sell, offer for sale, have\r\n          made, and/or otherwise dispose of: 1) Modifications made by that\r\n          Contributor (or portions thereof); and 2) the combination of\r\n          Modifications made by that Contributor with its Contributor\r\n          Version (or portions of such combination).\r\n\r\n          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are\r\n          effective on the date Contributor first makes Commercial Use of\r\n          the Covered Code.\r\n\r\n          (d)    Notwithstanding Section 2.2(b) above, no patent license is\r\n          granted: 1) for any code that Contributor has deleted from the\r\n          Contributor Version; 2)  separate from the Contributor Version;\r\n          3)  for infringements caused by: i) third party modifications of\r\n          Contributor Version or ii)  the combination of Modifications made\r\n          by that Contributor with other software  (except as part of the\r\n          Contributor Version) or other devices; or 4) under Patent Claims\r\n          infringed by Covered Code in the absence of Modifications made by\r\n          that Contributor.\r\n\r\n3. Distribution Obligations.\r\n\r\n     3.1. Application of License.\r\n     The Modifications which You create or to which You contribute are\r\n     governed by the terms of this License, including without limitation\r\n     Section 2.2. The Source Code version of Covered Code may be\r\n     distributed only under the terms of this License or a future version\r\n     of this License released under Section 6.1, and You must include a\r\n     copy of this License with every copy of the Source Code You\r\n     distribute. You may not offer or impose any terms on any Source Code\r\n     version that alters or restricts the applicable version of this\r\n     License or the recipients' rights hereunder. However, You may include\r\n     an additional document offering the additional rights described in\r\n     Section 3.5.\r\n\r\n     3.2. Availability of Source Code.\r\n     Any Modification which You create or to which You contribute must be\r\n     made available in Source Code form under the terms of this License\r\n     either on the same media as an Executable version or via an accepted\r\n     Electronic Distribution Mechanism to anyone to whom you made an\r\n     Executable version available; and if made available via Electronic\r\n     Distribution Mechanism, must remain available for at least twelve (12)\r\n     months after the date it initially became available, or at least six\r\n     (6) months after a subsequent version of that particular Modification\r\n     has been made available to such recipients. You are responsible for\r\n     ensuring that the Source Code version remains available even if the\r\n     Electronic Distribution Mechanism is maintained by a third party.\r\n\r\n     3.3. Description of Modifications.\r\n     You must cause all Covered Code to which You contribute to contain a\r\n     file documenting the changes You made to create that Covered Code and\r\n     the date of any change. You must include a prominent statement that\r\n     the Modification is derived, directly or indirectly, from Original\r\n     Code provided by the Initial Developer and including the name of the\r\n     Initial Developer in (a) the Source Code, and (b) in any notice in an\r\n     Executable version or related documentation in which You describe the\r\n     origin or ownership of the Covered Code.\r\n\r\n     3.4. Intellectual Property Matters\r\n          (a) Third Party Claims.\r\n          If Contributor has knowledge that a license under a third party's\r\n          intellectual property rights is required to exercise the rights\r\n          granted by such Contributor under Sections 2.1 or 2.2,\r\n          Contributor must include a text file with the Source Code\r\n          distribution titled \"LEGAL\" which describes the claim and the\r\n          party making the claim in sufficient detail that a recipient will\r\n          know whom to contact. If Contributor obtains such knowledge after\r\n          the Modification is made available as described in Section 3.2,\r\n          Contributor shall promptly modify the LEGAL file in all copies\r\n          Contributor makes available thereafter and shall take other steps\r\n          (such as notifying appropriate mailing lists or newsgroups)\r\n          reasonably calculated to inform those who received the Covered\r\n          Code that new knowledge has been obtained.\r\n\r\n          (b) Contributor APIs.\r\n          If Contributor's Modifications include an application programming\r\n          interface and Contributor has knowledge of patent licenses which\r\n          are reasonably necessary to implement that API, Contributor must\r\n          also include this information in the LEGAL file.\r\n\r\n               (c)    Representations.\r\n          Contributor represents that, except as disclosed pursuant to\r\n          Section 3.4(a) above, Contributor believes that Contributor's\r\n          Modifications are Contributor's original creation(s) and/or\r\n          Contributor has sufficient rights to grant the rights conveyed by\r\n          this License.\r\n\r\n     3.5. Required Notices.\r\n     You must duplicate the notice in Exhibit A in each file of the Source\r\n     Code.  If it is not possible to put such notice in a particular Source\r\n     Code file due to its structure, then You must include such notice in a\r\n     location (such as a relevant directory) where a user would be likely\r\n     to look for such a notice.  If You created one or more Modification(s)\r\n     You may add your name as a Contributor to the notice described in\r\n     Exhibit A.  You must also duplicate this License in any documentation\r\n     for the Source Code where You describe recipients' rights or ownership\r\n     rights relating to Covered Code.  You may choose to offer, and to\r\n     charge a fee for, warranty, support, indemnity or liability\r\n     obligations to one or more recipients of Covered Code. However, You\r\n     may do so only on Your own behalf, and not on behalf of the Initial\r\n     Developer or any Contributor. You must make it absolutely clear than\r\n     any such warranty, support, indemnity or liability obligation is\r\n     offered by You alone, and You hereby agree to indemnify the Initial\r\n     Developer and every Contributor for any liability incurred by the\r\n     Initial Developer or such Contributor as a result of warranty,\r\n     support, indemnity or liability terms You offer.\r\n\r\n     3.6. Distribution of Executable Versions.\r\n     You may distribute Covered Code in Executable form only if the\r\n     requirements of Section 3.1-3.5 have been met for that Covered Code,\r\n     and if You include a notice stating that the Source Code version of\r\n     the Covered Code is available under the terms of this License,\r\n     including a description of how and where You have fulfilled the\r\n     obligations of Section 3.2. The notice must be conspicuously included\r\n     in any notice in an Executable version, related documentation or\r\n     collateral in which You describe recipients' rights relating to the\r\n     Covered Code. You may distribute the Executable version of Covered\r\n     Code or ownership rights under a license of Your choice, which may\r\n     contain terms different from this License, provided that You are in\r\n     compliance with the terms of this License and that the license for the\r\n     Executable version does not attempt to limit or alter the recipient's\r\n     rights in the Source Code version from the rights set forth in this\r\n     License. If You distribute the Executable version under a different\r\n     license You must make it absolutely clear that any terms which differ\r\n     from this License are offered by You alone, not by the Initial\r\n     Developer or any Contributor. You hereby agree to indemnify the\r\n     Initial Developer and every Contributor for any liability incurred by\r\n     the Initial Developer or such Contributor as a result of any such\r\n     terms You offer.\r\n\r\n     3.7. Larger Works.\r\n     You may create a Larger Work by combining Covered Code with other code\r\n     not governed by the terms of this License and distribute the Larger\r\n     Work as a single product. In such a case, You must make sure the\r\n     requirements of this License are fulfilled for the Covered Code.\r\n\r\n4. Inability to Comply Due to Statute or Regulation.\r\n\r\n     If it is impossible for You to comply with any of the terms of this\r\n     License with respect to some or all of the Covered Code due to\r\n     statute, judicial order, or regulation then You must: (a) comply with\r\n     the terms of this License to the maximum extent possible; and (b)\r\n     describe the limitations and the code they affect. Such description\r\n     must be included in the LEGAL file described in Section 3.4 and must\r\n     be included with all distributions of the Source Code. Except to the\r\n     extent prohibited by statute or regulation, such description must be\r\n     sufficiently detailed for a recipient of ordinary skill to be able to\r\n     understand it.\r\n\r\n5. Application of this License.\r\n\r\n     This License applies to code to which the Initial Developer has\r\n     attached the notice in Exhibit A and to related Covered Code.\r\n\r\n6. Versions of the License.\r\n\r\n     6.1. New Versions.\r\n     Netscape Communications Corporation (\"Netscape\") may publish revised\r\n     and/or new versions of the License from time to time. Each version\r\n     will be given a distinguishing version number.\r\n\r\n     6.2. Effect of New Versions.\r\n     Once Covered Code has been published under a particular version of the\r\n     License, You may always continue to use it under the terms of that\r\n     version. You may also choose to use such Covered Code under the terms\r\n     of any subsequent version of the License published by Netscape. No one\r\n     other than Netscape has the right to modify the terms applicable to\r\n     Covered Code created under this License.\r\n\r\n     6.3. Derivative Works.\r\n     If You create or use a modified version of this License (which you may\r\n     only do in order to apply it to code which is not already Covered Code\r\n     governed by this License), You must (a) rename Your license so that\r\n     the phrases \"Mozilla\", \"MOZILLAPL\", \"MOZPL\", \"Netscape\",\r\n     \"MPL\", \"NPL\" or any confusingly similar phrase do not appear in your\r\n     license (except to note that your license differs from this License)\r\n     and (b) otherwise make it clear that Your version of the license\r\n     contains terms which differ from the Mozilla Public License and\r\n     Netscape Public License. (Filling in the name of the Initial\r\n     Developer, Original Code or Contributor in the notice described in\r\n     Exhibit A shall not of themselves be deemed to be modifications of\r\n     this License.)\r\n\r\n7. DISCLAIMER OF WARRANTY.\r\n\r\n     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN \"AS IS\" BASIS,\r\n     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,\r\n     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF\r\n     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.\r\n     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE\r\n     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,\r\n     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE\r\n     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER\r\n     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF\r\n     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.\r\n\r\n8. TERMINATION.\r\n\r\n     8.1.  This License and the rights granted hereunder will terminate\r\n     automatically if You fail to comply with terms herein and fail to cure\r\n     such breach within 30 days of becoming aware of the breach. All\r\n     sublicenses to the Covered Code which are properly granted shall\r\n     survive any termination of this License. Provisions which, by their\r\n     nature, must remain in effect beyond the termination of this License\r\n     shall survive.\r\n\r\n     8.2.  If You initiate litigation by asserting a patent infringement\r\n     claim (excluding declatory judgment actions) against Initial Developer\r\n     or a Contributor (the Initial Developer or Contributor against whom\r\n     You file such action is referred to as \"Participant\")  alleging that:\r\n\r\n     (a)  such Participant's Contributor Version directly or indirectly\r\n     infringes any patent, then any and all rights granted by such\r\n     Participant to You under Sections 2.1 and/or 2.2 of this License\r\n     shall, upon 60 days notice from Participant terminate prospectively,\r\n     unless if within 60 days after receipt of notice You either: (i)\r\n     agree in writing to pay Participant a mutually agreeable reasonable\r\n     royalty for Your past and future use of Modifications made by such\r\n     Participant, or (ii) withdraw Your litigation claim with respect to\r\n     the Contributor Version against such Participant.  If within 60 days\r\n     of notice, a reasonable royalty and payment arrangement are not\r\n     mutually agreed upon in writing by the parties or the litigation claim\r\n     is not withdrawn, the rights granted by Participant to You under\r\n     Sections 2.1 and/or 2.2 automatically terminate at the expiration of\r\n     the 60 day notice period specified above.\r\n\r\n     (b)  any software, hardware, or device, other than such Participant's\r\n     Contributor Version, directly or indirectly infringes any patent, then\r\n     any rights granted to You by such Participant under Sections 2.1(b)\r\n     and 2.2(b) are revoked effective as of the date You first made, used,\r\n     sold, distributed, or had made, Modifications made by that\r\n     Participant.\r\n\r\n     8.3.  If You assert a patent infringement claim against Participant\r\n     alleging that such Participant's Contributor Version directly or\r\n     indirectly infringes any patent where such claim is resolved (such as\r\n     by license or settlement) prior to the initiation of patent\r\n     infringement litigation, then the reasonable value of the licenses\r\n     granted by such Participant under Sections 2.1 or 2.2 shall be taken\r\n     into account in determining the amount or value of any payment or\r\n     license.\r\n\r\n     8.4.  In the event of termination under Sections 8.1 or 8.2 above,\r\n     all end user license agreements (excluding distributors and resellers)\r\n     which have been validly granted by You or any distributor hereunder\r\n     prior to termination shall survive termination.\r\n\r\n9. LIMITATION OF LIABILITY.\r\n\r\n     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT\r\n     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL\r\n     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,\r\n     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR\r\n     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY\r\n     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,\r\n     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER\r\n     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN\r\n     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF\r\n     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY\r\n     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW\r\n     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE\r\n     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO\r\n     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.\r\n\r\n10. U.S. GOVERNMENT END USERS.\r\n\r\n     The Covered Code is a \"commercial item,\" as that term is defined in\r\n     48 C.F.R. 2.101 (Oct. 1995), consisting of \"commercial computer\r\n     software\" and \"commercial computer software documentation,\" as such\r\n     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48\r\n     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),\r\n     all U.S. Government End Users acquire Covered Code with only those\r\n     rights set forth herein.\r\n\r\n11. MISCELLANEOUS.\r\n\r\n     This License represents the complete agreement concerning subject\r\n     matter hereof. If any provision of this License is held to be\r\n     unenforceable, such provision shall be reformed only to the extent\r\n     necessary to make it enforceable. This License shall be governed by\r\n     California law provisions (except to the extent applicable law, if\r\n     any, provides otherwise), excluding its conflict-of-law provisions.\r\n     With respect to disputes in which at least one party is a citizen of,\r\n     or an entity chartered or registered to do business in the United\r\n     States of America, any litigation relating to this License shall be\r\n     subject to the jurisdiction of the Federal Courts of the Northern\r\n     District of California, with venue lying in Santa Clara County,\r\n     California, with the losing party responsible for costs, including\r\n     without limitation, court costs and reasonable attorneys' fees and\r\n     expenses. The application of the United Nations Convention on\r\n     Contracts for the International Sale of Goods is expressly excluded.\r\n     Any law or regulation which provides that the language of a contract\r\n     shall be construed against the drafter shall not apply to this\r\n     License.\r\n\r\n12. RESPONSIBILITY FOR CLAIMS.\r\n\r\n     As between Initial Developer and the Contributors, each party is\r\n     responsible for claims and damages arising, directly or indirectly,\r\n     out of its utilization of rights under this License and You agree to\r\n     work with Initial Developer and Contributors to distribute such\r\n     responsibility on an equitable basis. Nothing herein is intended or\r\n     shall be deemed to constitute any admission of liability.\r\n\r\n13. MULTIPLE-LICENSED CODE.\r\n\r\n     Initial Developer may designate portions of the Covered Code as\r\n     \"Multiple-Licensed\".  \"Multiple-Licensed\" means that the Initial\r\n     Developer permits you to utilize portions of the Covered Code under\r\n     Your choice of the NPL or the alternative licenses, if any, specified\r\n     by the Initial Developer in the file described in Exhibit A.\r\n\r\nEXHIBIT A -Mozilla Public License.\r\n\r\n     ``The contents of this file are subject to the Mozilla Public License\r\n     Version 1.1 (the \"License\"); you may not use this file except in\r\n     compliance with the License. You may obtain a copy of the License at\r\n     http://www.mozilla.org/MPL/\r\n\r\n     Software distributed under the License is distributed on an \"AS IS\"\r\n     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the\r\n     License for the specific language governing rights and limitations\r\n     under the License.\r\n\r\n     The Original Code is ______________________________________.\r\n\r\n     The Initial Developer of the Original Code is ________________________.\r\n     Portions created by ______________________ are Copyright (C) ______\r\n     _______________________. All Rights Reserved.\r\n\r\n     Contributor(s): ______________________________________.\r\n\r\n     Alternatively, the contents of this file may be used under the terms\r\n     of the _____ license (the  \"[___] License\"), in which case the\r\n     provisions of [______] License are applicable instead of those\r\n     above.  If you wish to allow use of your version of this file only\r\n     under the terms of the [____] License and not to allow others to use\r\n     your version of this file under the MPL, indicate your decision by\r\n     deleting  the provisions above and replace  them with the notice and\r\n     other provisions required by the [___] License.  If you do not delete\r\n     the provisions above, a recipient may use your version of this file\r\n     under either the MPL or the [___] License.\"\r\n\r\n     [NOTE: The text of this Exhibit A may differ slightly from the text of\r\n     the notices in the Source Code files of the Original Code. You should\r\n     use the text of this Exhibit A rather than the text found in the\r\n     Original Code Source Code for Your Modifications.]\r\n```\r\n\r\nAppendix D: The MIT License\r\n---------------------------\r\n\r\n```\r\nThe MIT License (MIT)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n```\r\n\r\nAppendix E: The SIL Open Font License Version 1.1\r\n---------------------------------------------\r\n\r\n```\r\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r\n-----------------------------------------------------------\r\n\r\nPREAMBLE\r\nThe goals of the Open Font License (OFL) are to stimulate worldwide\r\ndevelopment of collaborative font projects, to support the font creation\r\nefforts of academic and linguistic communities, and to provide a free and\r\nopen framework in which fonts may be shared and improved in partnership\r\nwith others.\r\n\r\nThe OFL allows the licensed fonts to be used, studied, modified and\r\nredistributed freely as long as they are not sold by themselves. The\r\nfonts, including any derivative works, can be bundled, embedded,\r\nredistributed and/or sold with any software provided that any reserved\r\nnames are not used by derivative works. The fonts and derivatives,\r\nhowever, cannot be released under any other type of license. The\r\nrequirement for fonts to remain under this license does not apply\r\nto any document created using the fonts or their derivatives.\r\n\r\nDEFINITIONS\r\n\"Font Software\" refers to the set of files released by the Copyright\r\nHolder(s) under this license and clearly marked as such. This may\r\ninclude source files, build scripts and documentation.\r\n\r\n\"Reserved Font Name\" refers to any names specified as such after the\r\ncopyright statement(s).\r\n\r\n\"Original Version\" refers to the collection of Font Software components as\r\ndistributed by the Copyright Holder(s).\r\n\r\n\"Modified Version\" refers to any derivative made by adding to, deleting,\r\nor substituting -- in part or in whole -- any of the components of the\r\nOriginal Version, by changing formats or by porting the Font Software to a\r\nnew environment.\r\n\r\n\"Author\" refers to any designer, engineer, programmer, technical\r\nwriter or other person who contributed to the Font Software.\r\n\r\nPERMISSION & CONDITIONS\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of the Font Software, to use, study, copy, merge, embed, modify,\r\nredistribute, and sell modified and unmodified copies of the Font\r\nSoftware, subject to the following conditions:\r\n\r\n1) Neither the Font Software nor any of its individual components,\r\nin Original or Modified Versions, may be sold by itself.\r\n\r\n2) Original or Modified Versions of the Font Software may be bundled,\r\nredistributed and/or sold with any software, provided that each copy\r\ncontains the above copyright notice and this license. These can be\r\nincluded either as stand-alone text files, human-readable headers or\r\nin the appropriate machine-readable metadata fields within text or\r\nbinary files as long as those fields can be easily viewed by the user.\r\n\r\n3) No Modified Version of the Font Software may use the Reserved Font\r\nName(s) unless explicit written permission is granted by the corresponding\r\nCopyright Holder. This restriction only applies to the primary font name as\r\npresented to the users.\r\n\r\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r\nSoftware shall not be used to promote, endorse or advertise any\r\nModified Version, except to acknowledge the contribution(s) of the\r\nCopyright Holder(s) and the Author(s) or with their explicit written\r\npermission.\r\n\r\n5) The Font Software, modified or unmodified, in part or in whole,\r\nmust be distributed entirely under this license, and must not be\r\ndistributed under any other license. The requirement for fonts to\r\nremain under this license does not apply to any document created\r\nusing the Font Software.\r\n\r\nTERMINATION\r\nThis license becomes null and void if any of the above conditions are\r\nnot met.\r\n\r\nDISCLAIMER\r\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r\nOTHER DEALINGS IN THE FONT SOFTWARE.\r\n```\r\n\r\nAppendix F: The BSD-3 License\r\n-----------------------------\r\n\r\n```\r\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\r\n\r\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\r\n\r\n2. 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.\r\n\r\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\r\n\r\nTHIS 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.\r\n```\r\n\r\n"
  },
  {
    "path": "assets/ckeditor/README.md",
    "content": "CKEditor 4\n==========\n\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.  \nhttp://ckeditor.com - See LICENSE.md for license information.\n\nCKEditor is a text editor to be used inside web pages. It's not a replacement\nfor desktop text editors like Word or OpenOffice, but a component to be used as\npart of web applications and websites.\n\n## Documentation\n\nThe full editor documentation is available online at the following address:\nhttp://docs.ckeditor.com\n\n## Installation\n\nInstalling CKEditor is an easy task. Just follow these simple steps:\n\n 1. **Download** the latest version from the CKEditor website:\n    http://ckeditor.com. You should have already completed this step, but be\n    sure you have the very latest version.\n 2. **Extract** (decompress) the downloaded file into the root of your website.\n\n**Note:** CKEditor is by default installed in the `ckeditor` folder. You can\nplace the files in whichever you want though.\n\n## Checking Your Installation\n\nThe editor comes with a few sample pages that can be used to verify that\ninstallation proceeded properly. Take a look at the `samples` directory.\n\nTo test your installation, just call the following page at your website:\n\n\thttp://<your site>/<CKEditor installation path>/samples/index.html\n\nFor example:\n\n\thttp://www.example.com/ckeditor/samples/index.html\n"
  },
  {
    "path": "assets/ckeditor/adapters/jquery.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(a){if(\"undefined\"==typeof a)throw Error(\"jQuery should be loaded before CKEditor jQuery adapter.\");if(\"undefined\"==typeof CKEDITOR)throw Error(\"CKEditor should be loaded before CKEditor jQuery adapter.\");CKEDITOR.config.jqueryOverrideVal=\"undefined\"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data(\"ckeditorInstance\");if(!a)throw\"CKEditor is not initialized yet, use ckeditor() with a callback.\";return a},\nckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error(\"The environment is incompatible.\");if(!a.isFunction(g)){var m=d;d=g;g=m}var k=[];d=d||{};this.each(function(){var b=a(this),c=b.data(\"ckeditorInstance\"),f=b.data(\"_ckeditorInstanceLock\"),h=this,l=new a.Deferred;k.push(l.promise());if(c&&!f)g&&g.apply(c,[this]),l.resolve();else if(f)c.once(\"instanceReady\",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),l.resolve()):setTimeout(arguments.callee,100)},0)},\nnull,null,9999);else{if(d.autoUpdateElement||\"undefined\"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data(\"_ckeditorInstanceLock\",!0);c=a(this).is(\"textarea\")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data(\"ckeditorInstance\",c);c.on(\"instanceReady\",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on(\"dataReady\",function(){b.trigger(\"dataReady.ckeditor\",[e])});e.on(\"setData\",function(a){b.trigger(\"setData.ckeditor\",\n[e,a.data])});e.on(\"getData\",function(a){b.trigger(\"getData.ckeditor\",[e,a.data])},999);e.on(\"destroy\",function(){b.trigger(\"destroy.ckeditor\",[e])});e.on(\"save\",function(){a(h.form).submit();return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is(\"textarea\")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind(\"form-pre-serialize\",c);b.bind(\"destroy.ckeditor\",function(){a(h.form).unbind(\"submit\",c);a(h.form).unbind(\"form-pre-serialize\",\nc)})}e.on(\"destroy\",function(){b.removeData(\"ckeditorInstance\")});b.removeData(\"_ckeditorInstanceLock\");b.trigger(\"instanceReady.ckeditor\",[e]);g&&g.apply(e,[h]);l.resolve()}else setTimeout(arguments.callee,100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,k).then(function(){f.resolve()});this.editor=this.eq(0).data(\"ckeditorInstance\");return this}});CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var m=\nthis,k=[],f=this.each(function(){var b=a(this),c=b.data(\"ckeditorInstance\");if(b.is(\"textarea\")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});k.push(f.promise());return!0}return g.call(b,d)});if(k.length){var b=new a.Deferred;a.when.apply(this,k).done(function(){b.resolveWith(m)});return b.promise()}return f}var f=a(this).eq(0),c=f.data(\"ckeditorInstance\");return f.is(\"textarea\")&&c?c.getData():g.call(f)}}))})(window.jQuery);"
  },
  {
    "path": "assets/ckeditor/build-config.js",
    "content": "﻿/**\n * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n\n/**\n * This file was added automatically by CKEditor builder.\n * You may re-use it at any time to build CKEditor again.\n *\n * If you would like to build CKEditor online again\n * (for example to upgrade), visit one the following links:\n *\n * (1) http://ckeditor.com/builder\n *     Visit online builder to build CKEditor from scratch.\n *\n * (2) http://ckeditor.com/builder/5fdc817eb11600a3bca0e037faf27d50\n *     Visit online builder to build CKEditor, starting with the same setup as before.\n *\n * (3) http://ckeditor.com/builder/download/5fdc817eb11600a3bca0e037faf27d50\n *     Straight download link to the latest version of CKEditor (Optimized) with the same setup as before.\n *\n * NOTE:\n *    This file is not used by CKEditor, you may remove it.\n *    Changing this file will not change your CKEditor configuration.\n */\n\nvar CKBUILDER_CONFIG = {\n\tskin: 'moonocolor',\n\tpreset: 'full',\n\tignore: [\n\t\t'.bender',\n\t\t'bender.js',\n\t\t'bender-err.log',\n\t\t'bender-out.log',\n\t\t'dev',\n\t\t'.DS_Store',\n\t\t'.editorconfig',\n\t\t'.gitattributes',\n\t\t'.gitignore',\n\t\t'gruntfile.js',\n\t\t'.idea',\n\t\t'.jscsrc',\n\t\t'.jshintignore',\n\t\t'.jshintrc',\n\t\t'less',\n\t\t'.mailmap',\n\t\t'node_modules',\n\t\t'package.json',\n\t\t'README.md',\n\t\t'tests'\n\t],\n\tplugins : {\n\t\t'a11yhelp' : 1,\n\t\t'about' : 1,\n\t\t'basicstyles' : 1,\n\t\t'bidi' : 1,\n\t\t'blockquote' : 1,\n\t\t'clipboard' : 1,\n\t\t'colorbutton' : 1,\n\t\t'colordialog' : 1,\n\t\t'contextmenu' : 1,\n\t\t'dialogadvtab' : 1,\n\t\t'div' : 1,\n\t\t'elementspath' : 1,\n\t\t'enterkey' : 1,\n\t\t'entities' : 1,\n\t\t'filebrowser' : 1,\n\t\t'find' : 1,\n\t\t'flash' : 1,\n\t\t'floatingspace' : 1,\n\t\t'font' : 1,\n\t\t'format' : 1,\n\t\t'forms' : 1,\n\t\t'horizontalrule' : 1,\n\t\t'htmlwriter' : 1,\n\t\t'iframe' : 1,\n\t\t'image' : 1,\n\t\t'indentblock' : 1,\n\t\t'indentlist' : 1,\n\t\t'justify' : 1,\n\t\t'language' : 1,\n\t\t'link' : 1,\n\t\t'list' : 1,\n\t\t'liststyle' : 1,\n\t\t'magicline' : 1,\n\t\t'maximize' : 1,\n\t\t'newpage' : 1,\n\t\t'pagebreak' : 1,\n\t\t'pastefromword' : 1,\n\t\t'pastetext' : 1,\n\t\t'preview' : 1,\n\t\t'print' : 1,\n\t\t'removeformat' : 1,\n\t\t'resize' : 1,\n\t\t'save' : 1,\n\t\t'scayt' : 1,\n\t\t'selectall' : 1,\n\t\t'showblocks' : 1,\n\t\t'showborders' : 1,\n\t\t'smiley' : 1,\n\t\t'sourcearea' : 1,\n\t\t'specialchar' : 1,\n\t\t'stylescombo' : 1,\n\t\t'tab' : 1,\n\t\t'table' : 1,\n\t\t'tabletools' : 1,\n\t\t'templates' : 1,\n\t\t'toolbar' : 1,\n\t\t'undo' : 1,\n\t\t'wsc' : 1,\n\t\t'wysiwygarea' : 1\n\t},\n\tlanguages : {\n\t\t'en' : 1\n\t}\n};"
  },
  {
    "path": "assets/ckeditor/ckeditor.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\\\\/])ckeditor\\.js(?:\\?.*|;.*)?$/i,d={timestamp:\"G14E\",version:\"4.5.7\",revision:\"e98277f\",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:\"unloaded\",basePath:function(){var b=window.CKEDITOR_BASEPATH||\"\";if(!b)for(var c=document.getElementsByTagName(\"script\"),d=0;d<c.length;d++){var k=c[d].src.match(a);if(k){b=k[1];break}}-1==b.indexOf(\":/\")&&\"//\"!=b.slice(0,2)&&(b=0===b.indexOf(\"/\")?location.href.match(/^.*?:\\/\\/[^\\/]*/)[0]+\nb:location.href.match(/^[^\\?]*\\/(?:)/)[0]+b);if(!b)throw'The CKEditor installation path could not be automatically detected. Please set the global variable \"CKEDITOR_BASEPATH\" before creating editor instances.';return b}(),getUrl:function(a){-1==a.indexOf(\":/\")&&0!==a.indexOf(\"/\")&&(a=this.basePath+a);this.timestamp&&\"/\"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a)&&(a+=(0<=a.indexOf(\"?\")?\"\\x26\":\"?\")+\"t\\x3d\"+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener(\"DOMContentLoaded\",\na,!1),b()):document.attachEvent&&\"complete\"===document.readyState&&(document.detachEvent(\"onreadystatechange\",a),b())}catch(c){}}function b(){for(var a;a=c.shift();)a()}var c=[];return function(b){function d(){try{document.documentElement.doScroll(\"left\")}catch(f){setTimeout(d,1);return}a()}c.push(b);\"complete\"===document.readyState&&setTimeout(a,1);if(1==c.length)if(document.addEventListener)document.addEventListener(\"DOMContentLoaded\",a,!1),window.addEventListener(\"load\",a,!1);else if(document.attachEvent){document.attachEvent(\"onreadystatechange\",\na);window.attachEvent(\"onload\",a);b=!1;try{b=!window.frameElement}catch(w){}document.documentElement.doScroll&&b&&d()}}}()},b=window.CKEDITOR_GETURL;if(b){var c=d.getUrl;d.getUrl=function(a){return b.call(d,a)||c.call(d,a)}}return d}());\nCKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(a){var d=CKEDITOR.event.prototype,b;for(b in d)null==a[b]&&(a[b]=d[b])},CKEDITOR.event.prototype=function(){function a(a){var e=d(this);return e[a]||(e[a]=new b(a))}var d=function(a){a=a.getPrivate&&a.getPrivate()||a._||(a._={});return a.events||(a.events={})},b=function(a){this.name=a;this.listeners=[]};b.prototype={getListenerIndex:function(a){for(var b=0,d=this.listeners;b<d.length;b++)if(d[b].fn==a)return b;return-1}};\nreturn{define:function(b,d){var g=a.call(this,b);CKEDITOR.tools.extend(g,d,!0)},on:function(b,d,g,l,k){function n(a,f,x,k){a={name:b,sender:this,editor:a,data:f,listenerData:l,stop:x,cancel:k,removeListener:w};return!1===d.call(g,a)?!1:a.data}function w(){x.removeListener(b,d)}var f=a.call(this,b);if(0>f.getListenerIndex(d)){f=f.listeners;g||(g=this);isNaN(k)&&(k=10);var x=this;n.fn=d;n.priority=k;for(var A=f.length-1;0<=A;A--)if(f[A].priority<=k)return f.splice(A+1,0,n),{removeListener:w};f.unshift(n)}return{removeListener:w}},\nonce:function(){var a=Array.prototype.slice.call(arguments),b=a[1];a[1]=function(a){a.removeListener();return b.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},g=0,l=function(){g=1};return function(k,n,w){var f=d(this)[k];k=a;var x=g;a=g=0;if(f){var A=f.listeners;if(A.length)for(var A=A.slice(0),u,B=0;B<A.length;B++){if(f.errorProof)try{u=\nA[B].call(this,w,n,b,l)}catch(q){}else u=A[B].call(this,w,n,b,l);!1===u?g=1:\"undefined\"!=typeof u&&(n=u);if(a||g)break}}n=g?!1:\"undefined\"==typeof n?!0:n;a=k;g=x;return n}}(),fireOnce:function(a,b,g){b=this.fire(a,b,g);delete d(this)[a];return b},removeListener:function(a,b){var g=d(this)[a];if(g){var l=g.getListenerIndex(b);0<=l&&g.listeners.splice(l,1)}},removeAllListeners:function(){var a=d(this),b;for(b in a)delete a[b]},hasListeners:function(a){return(a=d(this)[a])&&0<a.listeners.length}}}());\nCKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,d){a in{instanceReady:1,loaded:1}&&(this[a]=!0);return CKEDITOR.event.prototype.fire.call(this,a,d,this)},CKEDITOR.editor.prototype.fireOnce=function(a,d){a in{instanceReady:1,loaded:1}&&(this[a]=!0);return CKEDITOR.event.prototype.fireOnce.call(this,a,d,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));\nCKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),d=a.match(/edge[ \\/](\\d+.?\\d*)/),b=-1<a.indexOf(\"trident/\"),b=!(!d&&!b),b={ie:b,edge:!!d,webkit:!b&&-1<a.indexOf(\" applewebkit/\"),air:-1<a.indexOf(\" adobeair/\"),mac:-1<a.indexOf(\"macintosh\"),quirks:\"BackCompat\"==document.compatMode&&(!document.documentMode||10>document.documentMode),mobile:-1<a.indexOf(\"mobile\"),iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return!1;var a=document.domain,b=window.location.hostname;\nreturn a!=b&&a!=\"[\"+b+\"]\"},secure:\"https:\"==location.protocol};b.gecko=\"Gecko\"==navigator.product&&!b.webkit&&!b.ie;b.webkit&&(-1<a.indexOf(\"chrome\")?b.chrome=!0:b.safari=!0);var c=0;b.ie&&(c=d?parseFloat(d[1]):b.quirks||!document.documentMode?parseFloat(a.match(/msie (\\d+)/)[1]):document.documentMode,b.ie9Compat=9==c,b.ie8Compat=8==c,b.ie7Compat=7==c,b.ie6Compat=7>c||b.quirks);b.gecko&&(d=a.match(/rv:([\\d\\.]+)/))&&(d=d[1].split(\".\"),c=1E4*d[0]+100*(d[1]||0)+1*(d[2]||0));b.air&&(c=parseFloat(a.match(/ adobeair\\/(\\d+)/)[1]));\nb.webkit&&(c=parseFloat(a.match(/ applewebkit\\/(\\d+)/)[1]));b.version=c;b.isCompatible=!(b.ie&&7>c)&&!(b.gecko&&4E4>c)&&!(b.webkit&&534>c);b.hidpi=2<=window.devicePixelRatio;b.needsBrFiller=b.gecko||b.webkit||b.ie&&10<c;b.needsNbspFiller=b.ie&&11>c;b.cssClass=\"cke_browser_\"+(b.ie?\"ie\":b.gecko?\"gecko\":b.webkit?\"webkit\":\"unknown\");b.quirks&&(b.cssClass+=\" cke_browser_quirks\");b.ie&&(b.cssClass+=\" cke_browser_ie\"+(b.quirks?\"6 cke_browser_iequirks\":b.version));b.air&&(b.cssClass+=\" cke_browser_air\");\nb.iOS&&(b.cssClass+=\" cke_browser_ios\");b.hidpi&&(b.cssClass+=\" cke_hidpi\");return b}());\n\"unloaded\"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(\"basic_ready\"!=CKEDITOR.status)CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement(\"script\");a.type=\"text/javascript\";a.src=CKEDITOR.basePath+\"ckeditor.js\";document.getElementsByTagName(\"head\")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a=\nCKEDITOR.loadFullCore,d=CKEDITOR.loadFullCoreTimeout;a&&(CKEDITOR.status=\"basic_ready\",a&&a._load?a():d&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},1E3*d))})})();CKEDITOR.status=\"basic_loaded\"}();\"use strict\";CKEDITOR.VERBOSITY_WARN=1;CKEDITOR.VERBOSITY_ERROR=2;CKEDITOR.verbosity=CKEDITOR.VERBOSITY_WARN|CKEDITOR.VERBOSITY_ERROR;CKEDITOR.warn=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_WARN&&CKEDITOR.fire(\"log\",{type:\"warn\",errorCode:a,additionalData:d})};\nCKEDITOR.error=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_ERROR&&CKEDITOR.fire(\"log\",{type:\"error\",errorCode:a,additionalData:d})};\nCKEDITOR.on(\"log\",function(a){if(window.console&&window.console.log){var d=console[a.data.type]?a.data.type:\"log\",b=a.data.errorCode;if(a=a.data.additionalData)console[d](\"[CKEDITOR] Error code: \"+b+\".\",a);else console[d](\"[CKEDITOR] Error code: \"+b+\".\");console[d](\"[CKEDITOR] For more information about this error go to http://docs.ckeditor.com/#!/guide/dev_errors-section-\"+b)}},null,null,999);CKEDITOR.dom={};\n(function(){var a=[],d=CKEDITOR.env.gecko?\"-moz-\":CKEDITOR.env.webkit?\"-webkit-\":CKEDITOR.env.ie?\"-ms-\":\"\",b=/&/g,c=/>/g,e=/</g,g=/\"/g,l=/&(lt|gt|amp|quot|nbsp|shy|#\\d{1,5});/g,k={lt:\"\\x3c\",gt:\"\\x3e\",amp:\"\\x26\",quot:'\"',nbsp:\" \",shy:\"­\"},n=function(a,f){return\"#\"==f[0]?String.fromCharCode(parseInt(f.slice(1),10)):k[f]};CKEDITOR.on(\"reset\",function(){a=[]});CKEDITOR.tools={arrayCompare:function(a,f){if(!a&&!f)return!0;if(!a||!f||a.length!=f.length)return!1;for(var b=0;b<a.length;b++)if(a[b]!=f[b])return!1;\nreturn!0},getIndex:function(a,f){for(var b=0;b<a.length;++b)if(f(a[b]))return b;return-1},clone:function(a){var f;if(a&&a instanceof Array){f=[];for(var b=0;b<a.length;b++)f[b]=CKEDITOR.tools.clone(a[b]);return f}if(null===a||\"object\"!=typeof a||a instanceof String||a instanceof Number||a instanceof Boolean||a instanceof Date||a instanceof RegExp||a.nodeType||a.window===a)return a;f=new a.constructor;for(b in a)f[b]=CKEDITOR.tools.clone(a[b]);return f},capitalize:function(a,f){return a.charAt(0).toUpperCase()+\n(f?a.slice(1):a.slice(1).toLowerCase())},extend:function(a){var f=arguments.length,b,c;\"boolean\"==typeof(b=arguments[f-1])?f--:\"boolean\"==typeof(b=arguments[f-2])&&(c=arguments[f-1],f-=2);for(var k=1;k<f;k++){var d=arguments[k],q;for(q in d)if(!0===b||null==a[q])if(!c||q in c)a[q]=d[q]}return a},prototypedCopy:function(a){var f=function(){};f.prototype=a;return new f},copy:function(a){var f={},b;for(b in a)f[b]=a[b];return f},isArray:function(a){return\"[object Array]\"==Object.prototype.toString.call(a)},\nisEmpty:function(a){for(var f in a)if(a.hasOwnProperty(f))return!1;return!0},cssVendorPrefix:function(a,f,b){if(b)return d+a+\":\"+f+\";\"+a+\":\"+f;b={};b[a]=f;b[d+a]=f;return b},cssStyleToDomStyle:function(){var a=document.createElement(\"div\").style,f=\"undefined\"!=typeof a.cssFloat?\"cssFloat\":\"undefined\"!=typeof a.styleFloat?\"styleFloat\":\"float\";return function(a){return\"float\"==a?f:a.replace(/-./g,function(a){return a.substr(1).toUpperCase()})}}(),buildStyleHtml:function(a){a=[].concat(a);for(var f,\nb=[],c=0;c<a.length;c++)if(f=a[c])/@import|[{}]/.test(f)?b.push(\"\\x3cstyle\\x3e\"+f+\"\\x3c/style\\x3e\"):b.push('\\x3clink type\\x3d\"text/css\" rel\\x3dstylesheet href\\x3d\"'+f+'\"\\x3e');return b.join(\"\")},htmlEncode:function(a){return void 0===a||null===a?\"\":String(a).replace(b,\"\\x26amp;\").replace(c,\"\\x26gt;\").replace(e,\"\\x26lt;\")},htmlDecode:function(a){return a.replace(l,n)},htmlEncodeAttr:function(a){return CKEDITOR.tools.htmlEncode(a).replace(g,\"\\x26quot;\")},htmlDecodeAttr:function(a){return CKEDITOR.tools.htmlDecode(a)},\ntransformPlainTextToHtml:function(a,f){var b=f==CKEDITOR.ENTER_BR,c=this.htmlEncode(a.replace(/\\r\\n/g,\"\\n\")),c=c.replace(/\\t/g,\"\\x26nbsp;\\x26nbsp; \\x26nbsp;\"),k=f==CKEDITOR.ENTER_P?\"p\":\"div\";if(!b){var d=/\\n{2}/g;if(d.test(c))var q=\"\\x3c\"+k+\"\\x3e\",n=\"\\x3c/\"+k+\"\\x3e\",c=q+c.replace(d,function(){return n+q})+n}c=c.replace(/\\n/g,\"\\x3cbr\\x3e\");b||(c=c.replace(new RegExp(\"\\x3cbr\\x3e(?\\x3d\\x3c/\"+k+\"\\x3e)\"),function(a){return CKEDITOR.tools.repeat(a,2)}));c=c.replace(/^ | $/g,\"\\x26nbsp;\");return c=c.replace(/(>|\\s) /g,\nfunction(a,f){return f+\"\\x26nbsp;\"}).replace(/ (?=<)/g,\"\\x26nbsp;\")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return\"cke_\"+this.getNextNumber()},getUniqueId:function(){for(var a=\"e\",f=0;8>f;f++)a+=Math.floor(65536*(1+Math.random())).toString(16).substring(1);return a},override:function(a,f){var b=f(a);b.prototype=a.prototype;return b},setTimeout:function(a,f,b,c,k){k||(k=window);b||(b=k);return k.setTimeout(function(){c?a.apply(b,[].concat(c)):a.apply(b)},\nf||0)},trim:function(){var a=/(?:^[ \\t\\n\\r]+)|(?:[ \\t\\n\\r]+$)/g;return function(f){return f.replace(a,\"\")}}(),ltrim:function(){var a=/^[ \\t\\n\\r]+/g;return function(f){return f.replace(a,\"\")}}(),rtrim:function(){var a=/[ \\t\\n\\r]+$/g;return function(f){return f.replace(a,\"\")}}(),indexOf:function(a,f){if(\"function\"==typeof f)for(var b=0,c=a.length;b<c;b++){if(f(a[b]))return b}else{if(a.indexOf)return a.indexOf(f);b=0;for(c=a.length;b<c;b++)if(a[b]===f)return b}return-1},search:function(a,b){var c=CKEDITOR.tools.indexOf(a,\nb);return 0<=c?a[c]:null},bind:function(a,b){return function(){return a.apply(b,arguments)}},createClass:function(a){var b=a.$,c=a.base,k=a.privates||a._,d=a.proto;a=a.statics;!b&&(b=function(){c&&this.base.apply(this,arguments)});if(k)var n=b,b=function(){var a=this._||(this._={}),b;for(b in k){var f=k[b];a[b]=\"function\"==typeof f?CKEDITOR.tools.bind(f,this):f}n.apply(this,arguments)};c&&(b.prototype=this.prototypedCopy(c.prototype),b.prototype.constructor=b,b.base=c,b.baseProto=c.prototype,b.prototype.base=\nfunction(){this.base=c.prototype.base;c.apply(this,arguments);this.base=arguments.callee});d&&this.extend(b.prototype,d,!0);a&&this.extend(b,a,!0);return b},addFunction:function(b,f){return a.push(function(){return b.apply(f||this,arguments)})-1},removeFunction:function(b){a[b]=null},callFunction:function(b){var f=a[b];return f&&f.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\\d+\\.?\\d*px$/,b;return function(c){b=CKEDITOR.tools.trim(c+\"\")+\"px\";return a.test(b)?\nb:c||\"\"}}(),convertToPx:function(){var a;return function(b){a||(a=CKEDITOR.dom.element.createFromHtml('\\x3cdiv style\\x3d\"position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;\"\\x3e\\x3c/div\\x3e',CKEDITOR.document),CKEDITOR.document.getBody().append(a));return/%$/.test(b)?b:(a.setStyle(\"width\",b),a.$.clientWidth)}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,c=arguments.length;b<c;b++){var k=arguments[b];try{a=k();break}catch(d){}}return a},\ngenKey:function(){return Array.prototype.slice.call(arguments).join(\"-\")},defer:function(a){return function(){var b=arguments,c=this;window.setTimeout(function(){a.apply(c,b)},0)}},normalizeCssText:function(a,b){var c=[],k,d=CKEDITOR.tools.parseCssText(a,!0,b);for(k in d)c.push(k+\":\"+d[k]);c.sort();return c.length?c.join(\";\")+\";\":\"\"},convertRgbToHex:function(a){return a.replace(/(?:rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\))/gi,function(a,b,c,k){a=[b,c,k];for(b=0;3>b;b++)a[b]=(\"0\"+parseInt(a[b],10).toString(16)).slice(-2);\nreturn\"#\"+a.join(\"\")})},parseCssText:function(a,b,c){var k={};c&&(c=new CKEDITOR.dom.element(\"span\"),c.setAttribute(\"style\",a),a=CKEDITOR.tools.convertRgbToHex(c.getAttribute(\"style\")||\"\"));if(!a||\";\"==a)return k;a.replace(/&quot;/g,'\"').replace(/\\s*([^:;\\s]+)\\s*:\\s*([^;]+)\\s*(?=;|$)/g,function(a,c,d){b&&(c=c.toLowerCase(),\"font-family\"==c&&(d=d.toLowerCase().replace(/[\"']/g,\"\").replace(/\\s*,\\s*/g,\",\")),d=CKEDITOR.tools.trim(d));k[c]=d});return k},writeCssText:function(a,b){var c,k=[];for(c in a)k.push(c+\n\":\"+a[c]);b&&k.sort();return k.join(\"; \")},objectCompare:function(a,b,c){var k;if(!a&&!b)return!0;if(!a||!b)return!1;for(k in a)if(a[k]!=b[k])return!1;if(!c)for(k in b)if(a[k]!=b[k])return!1;return!0},objectKeys:function(a){var b=[],c;for(c in a)b.push(c);return b},convertArrayToObject:function(a,b){var c={};1==arguments.length&&(b=!0);for(var k=0,d=a.length;k<d;++k)c[a[k]]=b;return c},fixDomain:function(){for(var a;;)try{a=window.parent.document.domain;break}catch(b){a=a?a.replace(/.+?(?:\\.|$)/,\n\"\"):document.domain;if(!a)break;document.domain=a}return!!a},eventsBuffer:function(a,b,c){function k(){n=(new Date).getTime();d=!1;c?b.call(c):b()}var d,n=0;return{input:function(){if(!d){var b=(new Date).getTime()-n;b<a?d=setTimeout(k,a-b):k()}},reset:function(){d&&clearTimeout(d);d=n=0}}},enableHtml5Elements:function(a,b){for(var c=\"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video\".split(\" \"),\nk=c.length,d;k--;)d=a.createElement(c[k]),b&&a.appendChild(d)},checkIfAnyArrayItemMatches:function(a,b){for(var c=0,k=a.length;c<k;++c)if(a[c].match(b))return!0;return!1},checkIfAnyObjectPropertyMatches:function(a,b){for(var c in a)if(c.match(b))return!0;return!1},transparentImageData:\"data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw\\x3d\\x3d\",getCookie:function(a){a=a.toLowerCase();for(var b=document.cookie.split(\";\"),c,k,d=0;d<b.length;d++)if(c=b[d].split(\"\\x3d\"),\nk=decodeURIComponent(CKEDITOR.tools.trim(c[0]).toLowerCase()),k===a)return decodeURIComponent(1<c.length?c[1]:\"\");return null},setCookie:function(a,b){document.cookie=encodeURIComponent(a)+\"\\x3d\"+encodeURIComponent(b)+\";path\\x3d/\"},getCsrfToken:function(){var a=CKEDITOR.tools.getCookie(\"ckCsrfToken\");if(!a||40!=a.length){var a=[],b=\"\";if(window.crypto&&window.crypto.getRandomValues)a=new Uint8Array(40),window.crypto.getRandomValues(a);else for(var c=0;40>c;c++)a.push(Math.floor(256*Math.random()));\nfor(c=0;c<a.length;c++)var k=\"abcdefghijklmnopqrstuvwxyz0123456789\".charAt(a[c]%36),b=b+(.5<Math.random()?k.toUpperCase():k);a=b;CKEDITOR.tools.setCookie(\"ckCsrfToken\",a)}return a}}})();\nCKEDITOR.dtd=function(){var a=CKEDITOR.tools.extend,d=function(a,b){for(var c=CKEDITOR.tools.clone(a),k=1;k<arguments.length;k++){b=arguments[k];for(var d in b)delete c[d]}return c},b={},c={},e={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,main:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},g={command:1,link:1,meta:1,noscript:1,script:1,style:1},l={},k={\"#\":1},n={center:1,dir:1,noframes:1};\na(b,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,\"var\":1,video:1,wbr:1},k,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});a(c,e,b,n);d={a:d(b,{a:1,button:1}),abbr:b,address:c,\narea:l,article:c,aside:c,audio:a({source:1,track:1},c),b:b,base:l,bdi:b,bdo:b,blockquote:c,body:c,br:l,button:d(b,{a:1,button:1}),canvas:b,caption:c,cite:b,code:b,col:l,colgroup:{col:1},command:l,datalist:a({option:1},b),dd:c,del:b,details:a({summary:1},c),dfn:b,div:c,dl:{dt:1,dd:1},dt:c,em:b,embed:l,fieldset:a({legend:1},c),figcaption:c,figure:a({figcaption:1},c),footer:c,form:c,h1:b,h2:b,h3:b,h4:b,h5:b,h6:b,head:a({title:1,base:1},g),header:c,hgroup:{h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},hr:l,html:a({head:1,\nbody:1},c,g),i:b,iframe:k,img:l,input:l,ins:b,kbd:b,keygen:l,label:b,legend:b,li:c,link:l,main:c,map:c,mark:b,menu:a({li:1},c),meta:l,meter:d(b,{meter:1}),nav:c,noscript:a({link:1,meta:1,style:1},b),object:a({param:1},b),ol:{li:1},optgroup:{option:1},option:k,output:b,p:b,param:l,pre:b,progress:d(b,{progress:1}),q:b,rp:b,rt:b,ruby:a({rp:1,rt:1},b),s:b,samp:b,script:k,section:c,select:{optgroup:1,option:1},small:b,source:l,span:b,strong:b,style:k,sub:b,summary:a({h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},b),\nsup:b,table:{caption:1,colgroup:1,thead:1,tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:c,textarea:k,tfoot:{tr:1},th:c,thead:{tr:1},time:d(b,{time:1}),title:k,tr:{th:1,td:1},track:l,u:b,ul:{li:1},\"var\":b,video:a({source:1,track:1},c),wbr:l,acronym:b,applet:a({param:1},c),basefont:l,big:b,center:c,dialog:l,dir:{li:1},font:b,isindex:l,noframes:c,strike:b,tt:b};a(d,{$block:a({audio:1,dd:1,dt:1,figcaption:1,li:1,video:1},e,n),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1,div:1,dl:1,\nfieldset:1,figcaption:1,figure:1,footer:1,form:1,header:1,hgroup:1,main:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,figcaption:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,main:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,\ntrack:1,wbr:1},$inline:b,$list:{dl:1,ol:1,ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:a({body:1,head:1,html:1},d.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,\ns:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,\"var\":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return d}();\nCKEDITOR.dom.event=function(a){this.$=a};\nCKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var a=this.getKey();if(this.$.ctrlKey||this.$.metaKey)a+=CKEDITOR.CTRL;this.$.shiftKey&&(a+=CKEDITOR.SHIFT);this.$.altKey&&(a+=CKEDITOR.ALT);return a},preventDefault:function(a){var d=this.$;d.preventDefault?d.preventDefault():d.returnValue=!1;a&&this.stopPropagation()},stopPropagation:function(){var a=this.$;a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},getTarget:function(){var a=\nthis.$.target||this.$.srcElement;return a?new CKEDITOR.dom.node(a):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var a=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(a.documentElement.scrollLeft||a.body.scrollLeft),y:this.$.pageY||this.$.clientY+(a.documentElement.scrollTop||a.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2;\nCKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(a){a&&(this.$=a)};\nCKEDITOR.dom.domObject.prototype=function(){var a=function(a,b){return function(c){\"undefined\"!=typeof CKEDITOR&&a.fire(b,new CKEDITOR.dom.event(c))}};return{getPrivate:function(){var a;(a=this.getCustomData(\"_\"))||this.setCustomData(\"_\",a={});return a},on:function(d){var b=this.getCustomData(\"_cke_nativeListeners\");b||(b={},this.setCustomData(\"_cke_nativeListeners\",b));b[d]||(b=b[d]=a(this,d),this.$.addEventListener?this.$.addEventListener(d,b,!!CKEDITOR.event.useCapture):this.$.attachEvent&&this.$.attachEvent(\"on\"+\nd,b));return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(a){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(a)){var b=this.getCustomData(\"_cke_nativeListeners\"),c=b&&b[a];c&&(this.$.removeEventListener?this.$.removeEventListener(a,c,!1):this.$.detachEvent&&this.$.detachEvent(\"on\"+a,c),delete b[a])}},removeAllListeners:function(){var a=this.getCustomData(\"_cke_nativeListeners\"),b;for(b in a){var c=a[b];this.$.detachEvent?this.$.detachEvent(\"on\"+\nb,c):this.$.removeEventListener&&this.$.removeEventListener(b,c,!1);delete a[b]}CKEDITOR.event.prototype.removeAllListeners.call(this)}}}();\n(function(a){var d={};CKEDITOR.on(\"reset\",function(){d={}});a.equals=function(a){try{return a&&a.$===this.$}catch(c){return!1}};a.setCustomData=function(a,c){var e=this.getUniqueId();(d[e]||(d[e]={}))[a]=c;return this};a.getCustomData=function(a){var c=this.$[\"data-cke-expando\"];return(c=c&&d[c])&&a in c?c[a]:null};a.removeCustomData=function(a){var c=this.$[\"data-cke-expando\"],c=c&&d[c],e,g;c&&(e=c[a],g=a in c,delete c[a]);return g?e:null};a.clearCustomData=function(){this.removeAllListeners();var a=\nthis.$[\"data-cke-expando\"];a&&delete d[a]};a.getUniqueId=function(){return this.$[\"data-cke-expando\"]||(this.$[\"data-cke-expando\"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(a)})(CKEDITOR.dom.domObject.prototype);\nCKEDITOR.dom.node=function(a){return a?new CKEDITOR.dom[a.nodeType==CKEDITOR.NODE_DOCUMENT?\"document\":a.nodeType==CKEDITOR.NODE_ELEMENT?\"element\":a.nodeType==CKEDITOR.NODE_TEXT?\"text\":a.nodeType==CKEDITOR.NODE_COMMENT?\"comment\":a.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?\"documentFragment\":\"domObject\"](a):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11;\nCKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16;\nCKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(a,d){a.append(this,d);return a},clone:function(a,d){function b(c){c[\"data-cke-expando\"]&&(c[\"data-cke-expando\"]=!1);if(c.nodeType==CKEDITOR.NODE_ELEMENT||c.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)if(d||c.nodeType!=CKEDITOR.NODE_ELEMENT||c.removeAttribute(\"id\",!1),a){c=c.childNodes;for(var e=0;e<c.length;e++)b(c[e])}}function c(b){if(b.type==CKEDITOR.NODE_ELEMENT||b.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT){if(b.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var d=\nb.getName();\":\"==d[0]&&b.renameNode(d.substring(1))}if(a)for(d=0;d<b.getChildCount();d++)c(b.getChild(d))}}var e=this.$.cloneNode(a);b(e);e=new CKEDITOR.dom.node(e);CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(this.type==CKEDITOR.NODE_ELEMENT||this.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)&&c(e);return e},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$,a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$,\na.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var d=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var e=c.parentNode;e&&d.unshift(this.getIndex.call({$:c},a));c=e}return d},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){function d(a,c){var n=c?a.nextSibling:a.previousSibling;return n&&n.nodeType==CKEDITOR.NODE_TEXT?b(n)?d(n,\nc):n:null}function b(a){return!a.nodeValue||a.nodeValue==CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE}var c=this.$,e=-1,g;if(!this.$.parentNode||a&&c.nodeType==CKEDITOR.NODE_TEXT&&b(c)&&!d(c)&&!d(c,!0))return-1;do a&&c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(g||b(c))||(e++,g=c.nodeType==CKEDITOR.NODE_TEXT);while(c=c.previousSibling);return e},getNextSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getFirst&&this.getFirst();var e;if(!a){if(this.type==\nCKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getNext()}for(;!a&&(e=(e||this).getParent());){if(b&&!1===b(e,!0))return null;a=e.getNext()}return!a||b&&!1===b(a)?null:d&&d!=a.type?a.getNextSourceNode(!1,d,b):a},getPreviousSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getLast&&this.getLast();var e;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getPrevious()}for(;!a&&(e=(e||this).getParent());){if(b&&!1===\nb(e,!0))return null;a=e.getPrevious()}return!a||b&&!1===b(a)?null:d&&a.type!=d?a.getPreviousSourceNode(!1,d,b):a},getPrevious:function(a){var d=this.$,b;do b=(d=d.previousSibling)&&10!=d.nodeType&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getNext:function(a){var d=this.$,b;do b=(d=d.nextSibling)&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getParent:function(a){var d=this.$.parentNode;return d&&(d.nodeType==CKEDITOR.NODE_ELEMENT||a&&d.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?\nnew CKEDITOR.dom.node(d):null},getParents:function(a){var d=this,b=[];do b[a?\"push\":\"unshift\"](d);while(d=d.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this;if(a.contains&&a.contains(this))return a;var d=this.contains?this:this.getParent();do if(d.contains(a))return d;while(d=d.getParent());return null},getPosition:function(a){var d=this.$,b=a.$;if(d.compareDocumentPosition)return d.compareDocumentPosition(b);if(d==b)return CKEDITOR.POSITION_IDENTICAL;if(this.type==\nCKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(d.contains){if(d.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(d))return CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING}if(\"sourceIndex\"in d)return 0>d.sourceIndex||0>b.sourceIndex?CKEDITOR.POSITION_DISCONNECTED:d.sourceIndex<b.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}d=this.getAddress();a=a.getAddress();for(var b=Math.min(d.length,a.length),c=0;c<b;c++)if(d[c]!=\na[c])return d[c]<a[c]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;return d.length<a.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING},getAscendant:function(a,d){var b=this.$,c,e;d||(b=b.parentNode);\"function\"==typeof a?(e=!0,c=a):(e=!1,c=function(b){b=\"string\"==typeof b.nodeName?b.nodeName.toLowerCase():\"\";return\"string\"==typeof a?b==a:b in a});for(;b;){if(c(e?new CKEDITOR.dom.node(b):b))return new CKEDITOR.dom.node(b);\ntry{b=b.parentNode}catch(g){b=null}}return null},hasAscendant:function(a,d){var b=this.$;d||(b=b.parentNode);for(;b;){if(b.nodeName&&b.nodeName.toLowerCase()==a)return!0;b=b.parentNode}return!1},move:function(a,d){a.append(this.remove(),d)},remove:function(a){var d=this.$,b=d.parentNode;if(b){if(a)for(;a=d.firstChild;)b.insertBefore(d.removeChild(a),d);b.removeChild(d)}return this},replace:function(a){this.insertBefore(a);a.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var a;this.getFirst&&\n(a=this.getFirst());){if(a.type==CKEDITOR.NODE_TEXT){var d=CKEDITOR.tools.ltrim(a.getText()),b=a.getLength();if(d)d.length<b&&(a.split(b-d.length),this.$.removeChild(this.$.firstChild));else{a.remove();continue}}break}},rtrim:function(){for(var a;this.getLast&&(a=this.getLast());){if(a.type==CKEDITOR.NODE_TEXT){var d=CKEDITOR.tools.rtrim(a.getText()),b=a.getLength();if(d)d.length<b&&(a.split(d.length),this.$.lastChild.parentNode.removeChild(this.$.lastChild));else{a.remove();continue}}break}CKEDITOR.env.needsBrFiller&&\n(a=this.$.lastChild)&&1==a.type&&\"br\"==a.nodeName.toLowerCase()&&a.parentNode.removeChild(a)},isReadOnly:function(a){var d=this;this.type!=CKEDITOR.NODE_ELEMENT&&(d=this.getParent());CKEDITOR.env.edge&&d&&d.is(\"textarea\",\"input\")&&(a=!0);if(!a&&d&&\"undefined\"!=typeof d.$.isContentEditable)return!(d.$.isContentEditable||d.data(\"cke-editable\"));for(;d;){if(d.data(\"cke-editable\"))return!1;if(d.hasAttribute(\"contenteditable\"))return\"false\"==d.getAttribute(\"contenteditable\");d=d.getParent()}return!0}});\nCKEDITOR.dom.window=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject;\nCKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var a=this.$.document,d=\"CSS1Compat\"==a.compatMode;return{width:(d?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(d?a.documentElement.clientHeight:a.body.clientHeight)||0}},getScrollPosition:function(){var a=this.$;if(\"pageXOffset\"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};a=a.document;return{x:a.documentElement.scrollLeft||a.body.scrollLeft||0,y:a.documentElement.scrollTop||\na.body.scrollTop||0}},getFrame:function(){var a=this.$.frameElement;return a?new CKEDITOR.dom.element.get(a):null}});CKEDITOR.dom.document=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject;\nCKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(a){if(this.$.createStyleSheet)this.$.createStyleSheet(a);else{var d=new CKEDITOR.dom.element(\"link\");d.setAttributes({rel:\"stylesheet\",type:\"text/css\",href:a});this.getHead().append(d)}},appendStyleText:function(a){if(this.$.createStyleSheet){var d=this.$.createStyleSheet(\"\");d.cssText=a}else{var b=new CKEDITOR.dom.element(\"style\",this);b.append(new CKEDITOR.dom.text(a,this));this.getHead().append(b)}return d||\nb.$.sheet},createElement:function(a,d){var b=new CKEDITOR.dom.element(a,this);d&&(d.attributes&&b.setAttributes(d.attributes),d.styles&&b.setStyles(d.styles));return b},createText:function(a){return new CKEDITOR.dom.text(a,this)},focus:function(){this.getWindow().focus()},getActive:function(){var a;try{a=this.$.activeElement}catch(d){return null}return new CKEDITOR.dom.element(a)},getById:function(a){return(a=this.$.getElementById(a))?new CKEDITOR.dom.element(a):null},getByAddress:function(a,d){for(var b=\nthis.$.documentElement,c=0;b&&c<a.length;c++){var e=a[c];if(d)for(var g=-1,l=0;l<b.childNodes.length;l++){var k=b.childNodes[l];if(!0!==d||3!=k.nodeType||!k.previousSibling||3!=k.previousSibling.nodeType)if(g++,g==e){b=k;break}}else b=b.childNodes[e]}return b?new CKEDITOR.dom.node(b):null},getElementsByTag:function(a,d){CKEDITOR.env.ie&&8>=document.documentMode||!d||(a=d+\":\"+a);return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName(\"head\")[0];\nreturn a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element(\"head\"),!0)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open(\"text/html\",\"replace\");CKEDITOR.env.ie&&(a=a.replace(/(?:^\\s*<!DOCTYPE[^>]*?>)|^/i,'$\\x26\\n\\x3cscript data-cke-temp\\x3d\"1\"\\x3e('+\nCKEDITOR.tools.fixDomain+\")();\\x3c/script\\x3e\"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData(\"html5ShivFrag\");a||(a=this.$.createDocumentFragment(),CKEDITOR.tools.enableHtml5Elements(a,!0),this.setCustomData(\"html5ShivFrag\",a));return a}});CKEDITOR.dom.nodeList=function(a){this.$=a};\nCKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){return 0>a||a>=this.$.length?null:(a=this.$[a])?new CKEDITOR.dom.node(a):null}};CKEDITOR.dom.element=function(a,d){\"string\"==typeof a&&(a=(d?d.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.element.get=function(a){return(a=\"string\"==typeof a?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;\nCKEDITOR.dom.element.createFromHtml=function(a,d){var b=new CKEDITOR.dom.element(\"div\",d);b.setHtml(a);return b.getFirst().remove()};CKEDITOR.dom.element.setMarker=function(a,d,b,c){var e=d.getCustomData(\"list_marker_id\")||d.setCustomData(\"list_marker_id\",CKEDITOR.tools.getNextNumber()).getCustomData(\"list_marker_id\"),g=d.getCustomData(\"list_marker_names\")||d.setCustomData(\"list_marker_names\",{}).getCustomData(\"list_marker_names\");a[e]=d;g[b]=1;return d.setCustomData(b,c)};\nCKEDITOR.dom.element.clearAllMarkers=function(a){for(var d in a)CKEDITOR.dom.element.clearMarkers(a,a[d],1)};CKEDITOR.dom.element.clearMarkers=function(a,d,b){var c=d.getCustomData(\"list_marker_names\"),e=d.getCustomData(\"list_marker_id\"),g;for(g in c)d.removeCustomData(g);d.removeCustomData(\"list_marker_names\");b&&(d.removeCustomData(\"list_marker_id\"),delete a[e])};\n(function(){function a(a,b){return-1<(\" \"+a+\" \").replace(g,\" \").indexOf(\" \"+b+\" \")}function d(a){var b=!0;a.$.id||(a.$.id=\"cke_tmp_\"+CKEDITOR.tools.getNextNumber(),b=!1);return function(){b||a.removeAttribute(\"id\")}}function b(a,b){return\"#\"+a.$.id+\" \"+b.split(/,\\s*/).join(\", #\"+a.$.id+\" \")}function c(a){for(var b=0,c=0,f=l[a].length;c<f;c++)b+=parseInt(this.getComputedStyle(l[a][c])||0,10)||0;return b}var e=document.createElement(\"_\").classList,e=\"undefined\"!==typeof e&&null!==String(e.add).match(/\\[Native code\\]/gi),\ng=/[\\n\\t\\r]/g;CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:e?function(a){this.$.classList.add(a);return this}:function(b){var c=this.$.className;c&&(a(c,b)||(c+=\" \"+b));this.$.className=c||b;return this},removeClass:e?function(a){var b=this.$;b.classList.remove(a);b.className||b.removeAttribute(\"class\");return this}:function(b){var c=this.getAttribute(\"class\");c&&a(c,b)&&((c=c.replace(new RegExp(\"(?:^|\\\\s+)\"+b+\"(?\\x3d\\\\s|$)\"),\"\").replace(/^\\s+/,\"\"))?this.setAttribute(\"class\",\nc):this.removeAttribute(\"class\"));return this},hasClass:function(b){return a(this.$.className,b)},append:function(a,b){\"string\"==typeof a&&(a=this.getDocument().createElement(a));b?this.$.insertBefore(a.$,this.$.firstChild):this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var b=new CKEDITOR.dom.element(\"div\",this.getDocument());b.setHtml(a);b.moveChildren(this)}else this.setHtml(a)},appendText:function(a){null!=this.$.text&&CKEDITOR.env.ie&&9>CKEDITOR.env.version?\nthis.$.text+=a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();a&&a.is&&a.is(\"br\")||(a=this.getDocument().createElement(\"br\"),CKEDITOR.env.gecko&&a.setAttribute(\"type\",\"_moz\"),this.append(a))}},breakParent:function(a,b){var c=new CKEDITOR.dom.range(this.getDocument());c.setStartAfter(this);c.setEndAfter(a);var f=c.extractContents(!1,b||!1);c.insertNode(this.remove());\nf.insertAfterNode(this)},contains:document.compareDocumentPosition?function(a){return!!(this.$.compareDocumentPosition(a.$)&16)}:function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$):b!=a.$&&b.contains(a.$)},focus:function(){function a(){try{this.$.focus()}catch(b){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\\?[^>]*>/g,\"\"):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\\?[^>]*>/,\n\"\");var a=this.$.ownerDocument.createElement(\"div\");a.appendChild(this.$.cloneNode(!0));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:CKEDITOR.env.ie&&9>CKEDITOR.env.version?function(a){try{var b=this.$;if(this.getParent())return b.innerHTML=a;var c=this.getDocument()._getHtml5ShivFrag();c.appendChild(b);b.innerHTML=a;c.removeChild(b);return a}catch(f){this.$.innerHTML=\n\"\";b=new CKEDITOR.dom.element(\"body\",this.getDocument());b.$.innerHTML=a;for(b=b.getChildren();b.count();)this.append(b.getItem(0));return a}}:function(a){return this.$.innerHTML=a},setText:function(){var a=document.createElement(\"p\");a.innerHTML=\"x\";a=a.textContent;return function(b){this.$[a?\"textContent\":\"innerText\"]=b}}(),getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){switch(a){case \"class\":a=\n\"className\";break;case \"http-equiv\":a=\"httpEquiv\";break;case \"name\":return this.$.name;case \"tabindex\":return a=this.$.getAttribute(a,2),0!==a&&0===this.$.tabIndex&&(a=null),a;case \"checked\":return a=this.$.attributes.getNamedItem(a),(a.specified?a.nodeValue:this.$.checked)?\"checked\":null;case \"hspace\":case \"value\":return this.$[a];case \"style\":return this.$.style.cssText;case \"contenteditable\":case \"contentEditable\":return this.$.attributes.getNamedItem(\"contentEditable\").specified?this.$.getAttribute(\"contentEditable\"):\nnull}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:document.defaultView&&document.defaultView.getComputedStyle?function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):\"\"}:function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,\ngetTabIndex:function(){var a=this.$.tabIndex;return 0!==a||CKEDITOR.dtd.$tabIndex[this.getName()]||0===parseInt(this.getAttribute(\"tabindex\"),10)?a:-1},getText:function(){return this.$.textContent||this.$.innerText||\"\"},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&8>=document.documentMode){var b=this.$.scopeName;\"HTML\"!=\nb&&(a=b.toLowerCase()+\":\"+a)}this.getName=function(){return a};return this.getName()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(\"object\"==typeof arguments[0])return!!arguments[0][a];\nfor(var b=0;b<arguments.length;b++)if(arguments[b]==a)return!0;return!1},isEditable:function(a){var b=this.getName();return this.isReadOnly()||\"none\"==this.getComputedStyle(\"display\")||\"hidden\"==this.getComputedStyle(\"visibility\")||CKEDITOR.dtd.$nonEditable[b]||CKEDITOR.dtd.$empty[b]||this.is(\"a\")&&(this.data(\"cke-saved-name\")||this.hasAttribute(\"name\"))&&!this.getChildCount()?!1:!1!==a?(a=CKEDITOR.dtd[b]||CKEDITOR.dtd.span,!(!a||!a[\"#\"])):!0},isIdentical:function(a){var b=this.clone(0,1);a=a.clone(0,\n1);b.removeAttributes([\"_moz_dirty\",\"data-cke-expando\",\"data-cke-saved-href\",\"data-cke-saved-name\"]);a.removeAttributes([\"_moz_dirty\",\"data-cke-expando\",\"data-cke-saved-href\",\"data-cke-saved-name\"]);if(b.$.isEqualNode)return b.$.style.cssText=CKEDITOR.tools.normalizeCssText(b.$.style.cssText),a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText),b.$.isEqualNode(a.$);b=b.getOuterHtml();a=a.getOuterHtml();if(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&this.is(\"a\")){var c=this.getParent();\nc.type==CKEDITOR.NODE_ELEMENT&&(c=c.clone(),c.setHtml(b),b=c.getHtml(),c.setHtml(a),a=c.getHtml())}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&\"hidden\"!=this.getComputedStyle(\"visibility\"),b,c;a&&CKEDITOR.env.webkit&&(b=this.getWindow(),!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement)&&(a=(new CKEDITOR.dom.element(c)).isVisible()));return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return!1;for(var a=this.getChildren(),\nb=0,c=a.count();b<c;b++){var f=a.getItem(b);if(f.type!=CKEDITOR.NODE_ELEMENT||!f.data(\"cke-bookmark\"))if(f.type==CKEDITOR.NODE_ELEMENT&&!f.isEmptyInlineRemoveable()||f.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(f.getText()))return!1}return!0},hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(){for(var a=this.$.attributes,b=0;b<a.length;b++){var c=a[b];switch(c.nodeName){case \"class\":if(this.getAttribute(\"class\"))return!0;case \"data-cke-expando\":continue;default:if(c.specified)return!0}}return!1}:\nfunction(){var a=this.$.attributes,b=a.length,c={\"data-cke-expando\":1,_moz_dirty:1};return 0<b&&(2<b||!c[a[0].nodeName]||2==b&&!c[a[1].nodeName])},hasAttribute:function(){function a(b){var c=this.$.attributes.getNamedItem(b);if(\"input\"==this.getName())switch(b){case \"class\":return 0<this.$.className.length;case \"checked\":return!!this.$.checked;case \"value\":return b=this.getAttribute(\"type\"),\"checkbox\"==b||\"radio\"==b?\"on\"!=this.$.value:!!this.$.value}return c?c.specified:!1}return CKEDITOR.env.ie?\n8>CKEDITOR.env.version?function(b){return\"name\"==b?!!this.$.name:a.call(this,b)}:a:function(a){return!!this.$.attributes.getNamedItem(a)}}(),hide:function(){this.setStyle(\"display\",\"none\")},moveChildren:function(a,b){var c=this.$;a=a.$;if(c!=a){var f;if(b)for(;f=c.lastChild;)a.insertBefore(c.removeChild(f),a.firstChild);else for(;f=c.firstChild;)a.appendChild(c.removeChild(f))}},mergeSiblings:function(){function a(b,c,f){if(c&&c.type==CKEDITOR.NODE_ELEMENT){for(var d=[];c.data(\"cke-bookmark\")||c.isEmptyInlineRemoveable();)if(d.push(c),\nc=f?c.getNext():c.getPrevious(),!c||c.type!=CKEDITOR.NODE_ELEMENT)return;if(b.isIdentical(c)){for(var k=f?b.getLast():b.getFirst();d.length;)d.shift().move(b,!f);c.moveChildren(b,!f);c.remove();k&&k.type==CKEDITOR.NODE_ELEMENT&&k.mergeSiblings()}}}return function(b){if(!1===b||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is(\"a\"))a(this,this.getNext(),!0),a(this,this.getPrevious())}}(),show:function(){this.setStyles({display:\"\",visibility:\"\"})},setAttribute:function(){var a=function(a,b){this.$.setAttribute(a,\nb);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(b,c){\"class\"==b?this.$.className=c:\"style\"==b?this.$.style.cssText=c:\"tabindex\"==b?this.$.tabIndex=c:\"checked\"==b?this.$.checked=c:\"contenteditable\"==b?a.call(this,\"contentEditable\",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(\"src\"==b&&c.match(/^http:\\/\\//))try{a.apply(this,arguments)}catch(f){}else a.apply(this,arguments);return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,\na[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){\"class\"==a?a=\"className\":\"tabindex\"==a?a=\"tabIndex\":\"contenteditable\"==a&&(a=\"contentEditable\");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},\nremoveStyle:function(a){var b=this.$.style;if(b.removeProperty||\"border\"!=a&&\"margin\"!=a&&\"padding\"!=a)b.removeProperty?b.removeProperty(a):b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a)),this.$.style.cssText||this.removeAttribute(\"style\");else{var c=[\"top\",\"left\",\"right\",\"bottom\"],f;\"border\"==a&&(f=[\"color\",\"style\",\"width\"]);for(var b=[],d=0;d<c.length;d++)if(f)for(var e=0;e<f.length;e++)b.push([a,c[d],f[e]].join(\"-\"));else b.push([a,c[d]].join(\"-\"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}},\nsetStyle:function(a,b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){CKEDITOR.env.ie&&9>CKEDITOR.env.version?(a=Math.round(100*a),this.setStyle(\"filter\",100<=a?\"\":\"progid:DXImageTransform.Microsoft.Alpha(opacity\\x3d\"+a+\")\")):this.setStyle(\"opacity\",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix(\"user-select\",\"none\"));if(CKEDITOR.env.ie){this.setAttribute(\"unselectable\",\n\"on\");for(var a,b=this.getElementsByTag(\"*\"),c=0,f=b.count();c<f;c++)a=b.getItem(c),a.setAttribute(\"unselectable\",\"on\")}},getPositionedAncestor:function(){for(var a=this;\"html\"!=a.getName();){if(\"static\"!=a.getComputedStyle(\"position\"))return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,f=this.getDocument(),d=f.getBody(),e=\"BackCompat\"==f.$.compatMode;if(document.documentElement.getBoundingClientRect){var u=this.$.getBoundingClientRect(),g=f.$.documentElement,q=g.clientTop||\nd.$.clientTop||0,y=g.clientLeft||d.$.clientLeft||0,l=!0;CKEDITOR.env.ie&&(l=f.getDocumentElement().contains(this),f=f.getBody().contains(this),l=e&&f||!e&&l);l&&(CKEDITOR.env.webkit||CKEDITOR.env.ie&&12<=CKEDITOR.env.version?(b=d.$.scrollLeft||g.scrollLeft,c=d.$.scrollTop||g.scrollTop):(c=e?d.$:g,b=c.scrollLeft,c=c.scrollTop),b=u.left+b-y,c=u.top+c-q)}else for(q=this,y=null;q&&\"body\"!=q.getName()&&\"html\"!=q.getName();){b+=q.$.offsetLeft-q.$.scrollLeft;c+=q.$.offsetTop-q.$.scrollTop;q.equals(this)||\n(b+=q.$.clientLeft||0,c+=q.$.clientTop||0);for(;y&&!y.equals(q);)b-=y.$.scrollLeft,c-=y.$.scrollTop,y=y.getParent();y=q;q=(u=q.$.offsetParent)?new CKEDITOR.dom.element(u):null}a&&(u=this.getWindow(),q=a.getWindow(),!u.equals(q)&&u.$.frameElement&&(a=(new CKEDITOR.dom.element(u.$.frameElement)).getDocumentPosition(a),b+=a.x,c+=a.y));document.documentElement.getBoundingClientRect||!CKEDITOR.env.gecko||e||(b+=this.$.clientLeft?1:0,c+=this.$.clientTop?1:0);return{x:b,y:c}},scrollIntoView:function(a){var b=\nthis.getParent();if(b){do if((b.$.clientWidth&&b.$.clientWidth<b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is(\"body\")&&this.scrollIntoParent(b,a,1),b.is(\"html\")){var c=b.getWindow();try{var f=c.$.frameElement;f&&(b=new CKEDITOR.dom.element(f))}catch(d){}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var f,d,e,u;function g(b,c){/body|html/.test(a.getName())?a.getWindow().$.scrollBy(b,c):(a.$.scrollLeft+=b,a.$.scrollTop+=c)}function q(a,b){var c={x:0,y:0};if(!a.is(l?\n\"body\":\"html\")){var f=a.$.getBoundingClientRect();c.x=f.left;c.y=f.top}f=a.getWindow();f.equals(b)||(f=q(CKEDITOR.dom.element.get(f.$.frameElement),b),c.x+=f.x,c.y+=f.y);return c}function y(a,b){return parseInt(a.getComputedStyle(\"margin-\"+b)||0,10)||0}!a&&(a=this.getWindow());e=a.getDocument();var l=\"BackCompat\"==e.$.compatMode;a instanceof CKEDITOR.dom.window&&(a=l?e.getBody():e.getDocumentElement());e=a.getWindow();d=q(this,e);var t=q(a,e),z=this.$.offsetHeight;f=this.$.offsetWidth;var h=a.$.clientHeight,\np=a.$.clientWidth;e=d.x-y(this,\"left\")-t.x||0;u=d.y-y(this,\"top\")-t.y||0;f=d.x+f+y(this,\"right\")-(t.x+p)||0;d=d.y+z+y(this,\"bottom\")-(t.y+h)||0;(0>u||0<d)&&g(0,!0===b?u:!1===b?d:0>u?u:d);c&&(0>e||0<f)&&g(0>e?e:f,0)},setState:function(a,b,c){b=b||\"cke\";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+\"_on\");this.removeClass(b+\"_off\");this.removeClass(b+\"_disabled\");c&&this.setAttribute(\"aria-pressed\",!0);c&&this.removeAttribute(\"aria-disabled\");break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+\n\"_disabled\");this.removeClass(b+\"_off\");this.removeClass(b+\"_on\");c&&this.setAttribute(\"aria-disabled\",!0);c&&this.removeAttribute(\"aria-pressed\");break;default:this.addClass(b+\"_off\"),this.removeClass(b+\"_on\"),this.removeClass(b+\"_disabled\"),c&&this.removeAttribute(\"aria-pressed\"),c&&this.removeAttribute(\"aria-disabled\")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},copyAttributes:function(a,\nb){var c=this.$.attributes;b=b||{};for(var f=0;f<c.length;f++){var d=c[f],e=d.nodeName.toLowerCase(),u;if(!(e in b))if(\"checked\"==e&&(u=this.getAttribute(e)))a.setAttribute(e,u);else if(!CKEDITOR.env.ie||this.hasAttribute(e))u=this.getAttribute(e),null===u&&(u=d.nodeValue),a.setAttribute(e,u)}\"\"!==this.$.style.cssText&&(a.$.style.cssText=this.$.style.cssText)},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument();a=new CKEDITOR.dom.element(a,b);this.copyAttributes(a);this.moveChildren(a);\nthis.getParent(!0)&&this.$.parentNode.replaceChild(a.$,this.$);a.$[\"data-cke-expando\"]=this.$[\"data-cke-expando\"];this.$=a.$;delete this.getName}},getChild:function(){function a(b,c){var f=b.childNodes;if(0<=c&&c<f.length)return f[c]}return function(b){var c=this.$;if(b.slice)for(b=b.slice();0<b.length&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT&&\nb.hasClass(\"cke_enable_context_menu\")}this.on(\"contextmenu\",function(b){b.data.getTarget().getAscendant(a,!0)||b.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle(\"direction\")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||\"ltr\":this.getStyle(\"direction\")||this.getAttribute(\"dir\")},data:function(a,b){a=\"data-\"+a;if(void 0===b)return this.getAttribute(a);!1===b?this.removeAttribute(a):this.setAttribute(a,b);return null},\ngetEditor:function(){var a=CKEDITOR.instances,b,c;for(b in a)if(c=a[b],c.element.equals(this)&&c.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO)return c;return null},find:function(a){var c=d(this);a=new CKEDITOR.dom.nodeList(this.$.querySelectorAll(b(this,a)));c();return a},findOne:function(a){var c=d(this);a=this.$.querySelector(b(this,a));c();return a?new CKEDITOR.dom.element(a):null},forEach:function(a,b,c){if(!(c||b&&this.type!=b))var f=a(this);if(!1!==f){c=this.getChildren();for(var d=0;d<c.count();d++)f=\nc.getItem(d),f.type==CKEDITOR.NODE_ELEMENT?f.forEach(a,b):b&&f.type!=b||a(f)}}});var l={width:[\"border-left-width\",\"border-right-width\",\"padding-left\",\"padding-right\"],height:[\"border-top-width\",\"border-bottom-width\",\"padding-top\",\"padding-bottom\"]};CKEDITOR.dom.element.prototype.setSize=function(a,b,d){\"number\"==typeof b&&(!d||CKEDITOR.env.ie&&CKEDITOR.env.quirks||(b-=c.call(this,a)),this.setStyle(a,b+\"px\"))};CKEDITOR.dom.element.prototype.getSize=function(a,b){var d=Math.max(this.$[\"offset\"+CKEDITOR.tools.capitalize(a)],\nthis.$[\"client\"+CKEDITOR.tools.capitalize(a)])||0;b&&(d-=c.call(this,a));return d}})();CKEDITOR.dom.documentFragment=function(a){a=a||CKEDITOR.document;this.$=a.type==CKEDITOR.NODE_DOCUMENT?a.$.createDocumentFragment():a};\nCKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(a){a=a.$;a.parentNode.insertBefore(this.$,a.nextSibling)},getHtml:function(){var a=new CKEDITOR.dom.element(\"div\");this.clone(1,1).appendTo(a);return a.getHtml().replace(/\\s*data-cke-expando=\".*?\"/g,\"\")}},!0,{append:1,appendBogus:1,clone:1,getFirst:1,getHtml:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,\ninsertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});\n(function(){function a(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed)return this.end(),null;c.optimize()}var f,d=c.startContainer;f=c.endContainer;var e=c.startOffset,x=c.endOffset,z,h=this.guard,p=this.type,m=a?\"getPreviousSourceNode\":\"getNextSourceNode\";if(!a&&!this._.guardLTR){var C=f.type==CKEDITOR.NODE_ELEMENT?f:f.getParent(),r=f.type==CKEDITOR.NODE_ELEMENT?f.getChild(x):f.getNext();this._.guardLTR=function(a,b){return(!b||!C.equals(a))&&(!r||\n!a.equals(r))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var G=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),g=d.type==CKEDITOR.NODE_ELEMENT?e?d.getChild(e-1):null:d.getPrevious();this._.guardRTL=function(a,b){return(!b||!G.equals(a))&&(!g||!a.equals(g))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var l=a?this._.guardRTL:this._.guardLTR;z=h?function(a,b){return!1===l(a,b)?!1:h(a,b)}:l;this.current?f=this.current[m](!1,p,z):(a?f.type==CKEDITOR.NODE_ELEMENT&&\n(f=0<x?f.getChild(x-1):!1===z(f,!0)?null:f.getPreviousSourceNode(!0,p,z)):(f=d,f.type==CKEDITOR.NODE_ELEMENT&&((f=f.getChild(e))||(f=!1===z(d,!0)?null:d.getNextSourceNode(!0,p,z)))),f&&!1===z(f)&&(f=null));for(;f&&!this._.end;){this.current=f;if(!this.evaluator||!1!==this.evaluator(f)){if(!b)return f}else if(b&&this.evaluator)return!1;f=f[m](!1,p,z)}this.end();return this.current=null}function d(b){for(var c,f=null;c=a.call(this,b);)f=c;return f}CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=\na;this._={}},proto:{end:function(){this._.end=1},next:function(){return a.call(this)},previous:function(){return a.call(this,1)},checkForward:function(){return!1!==a.call(this,0,1)},checkBackward:function(){return!1!==a.call(this,1,1)},lastForward:function(){return d.call(this)},lastBackward:function(){return d.call(this,1)},reset:function(){delete this.current;this._={}}}});var b={block:1,\"list-item\":1,table:1,\"table-row-group\":1,\"table-header-group\":1,\"table-footer-group\":1,\"table-row\":1,\"table-column-group\":1,\n\"table-column\":1,\"table-cell\":1,\"table-caption\":1},c={absolute:1,fixed:1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(a){return\"none\"!=this.getComputedStyle(\"float\")||this.getComputedStyle(\"position\")in c||!b[this.getComputedStyle(\"display\")]?!!(this.is(CKEDITOR.dtd.$block)||a&&this.is(a)):!0};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=function(){return this.blockBoundary({br:1})};\nCKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&&a.getName&&\"span\"==a.getName()&&a.data(\"cke-bookmark\")}return function(f){var d,e;d=f&&f.type!=CKEDITOR.NODE_ELEMENT&&(e=f.getParent())&&c(e);d=a?d:d||c(f);return!!(b^d)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()==CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE);return!!(a^c)}};CKEDITOR.dom.walker.invisible=\nfunction(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.env.webkit?1:0;return function(f){b(f)?f=1:(f.type==CKEDITOR.NODE_TEXT&&(f=f.getParent()),f=f.$.offsetWidth<=c);return!!(a^f)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!g(a)&&!l(a)}return function(c){var f=CKEDITOR.env.needsBrFiller?c.is&&c.is(\"br\"):c.getText&&e.test(c.getText());f&&(f=c.getParent(),c=c.getNext(b),f=f.isBlockBoundary()&&\n(!c||c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary()));return!!(a^f)}};CKEDITOR.dom.walker.temp=function(a){return function(b){b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b=b&&b.hasAttribute(\"data-cke-temp\");return!!(a^b)}};var e=/^[\\t\\r\\n ]*(?:&nbsp;|\\xa0)$/,g=CKEDITOR.dom.walker.whitespaces(),l=CKEDITOR.dom.walker.bookmark(),k=CKEDITOR.dom.walker.temp(),n=function(a){return l(a)||g(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.is(CKEDITOR.dtd.$inline)&&!a.is(CKEDITOR.dtd.$empty)};CKEDITOR.dom.walker.ignored=\nfunction(a){return function(b){b=g(b)||l(b)||k(b);return!!(a^b)}};var w=CKEDITOR.dom.walker.ignored();CKEDITOR.dom.walker.empty=function(a){return function(b){for(var c=0,f=b.getChildCount();c<f;++c)if(!w(b.getChild(c)))return!!a;return!a}};var f=CKEDITOR.dom.walker.empty(),x=CKEDITOR.dom.walker.validEmptyBlockContainers=CKEDITOR.tools.extend(function(a){var b={},c;for(c in a)CKEDITOR.dtd[c][\"#\"]&&(b[c]=1);return b}(CKEDITOR.dtd.$block),{caption:1,td:1,th:1});CKEDITOR.dom.walker.editable=function(a){return function(b){b=\nw(b)?!1:b.type==CKEDITOR.NODE_TEXT||b.type==CKEDITOR.NODE_ELEMENT&&(b.is(CKEDITOR.dtd.$inline)||b.is(\"hr\")||\"false\"==b.getAttribute(\"contenteditable\")||!CKEDITOR.env.needsBrFiller&&b.is(x)&&f(b))?!0:!1;return!!(a^b)}};CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(n(a));return a&&(CKEDITOR.env.needsBrFiller?a.is&&a.is(\"br\"):a.getText&&e.test(a.getText()))?a:!1}})();\nCKEDITOR.dom.range=function(a){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=!0;var d=a instanceof CKEDITOR.dom.document;this.document=d?a:a.getDocument();this.root=d?a.getBody():a};\n(function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset}function d(a,b,c,d,e){function q(a,b,c,f){var d=c?a.getPrevious():a.getNext();if(f&&k)return d;h||f?b.append(a.clone(!0,e),c):(a.remove(),z&&b.append(a));return d}function g(){var a,b,c,f=Math.min(v.length,D.length);for(a=0;a<f;a++)if(b=v[a],c=D[a],!b.equals(c))return a;return a-1}function l(){var b=I-1,c=w&&n&&!p.equals(m);b<E-1||b<L-1||c?(c?a.moveToPosition(m,\nCKEDITOR.POSITION_BEFORE_START):L==b+1&&H?a.moveToPosition(D[b],CKEDITOR.POSITION_BEFORE_END):a.moveToPosition(D[b+1],CKEDITOR.POSITION_BEFORE_START),d&&(b=v[b+1])&&b.type==CKEDITOR.NODE_ELEMENT&&(c=CKEDITOR.dom.element.createFromHtml('\\x3cspan data-cke-bookmark\\x3d\"1\" style\\x3d\"display:none\"\\x3e\\x26nbsp;\\x3c/span\\x3e',a.document),c.insertAfter(b),b.mergeSiblings(!1),a.moveToBookmark({startNode:c}))):a.collapse(!0)}a.optimizeBookmark();var k=0===b,z=1==b,h=2==b;b=h||z;var p=a.startContainer,m=a.endContainer,\nC=a.startOffset,r=a.endOffset,G,H,w,n,M,Q;if(h&&m.type==CKEDITOR.NODE_TEXT&&p.equals(m))p=a.document.createText(p.substring(C,r)),c.append(p);else{m.type==CKEDITOR.NODE_TEXT?h?Q=!0:m=m.split(r):0<m.getChildCount()?r>=m.getChildCount()?(m=m.getChild(r-1),H=!0):m=m.getChild(r):n=H=!0;p.type==CKEDITOR.NODE_TEXT?h?M=!0:p.split(C):0<p.getChildCount()?0===C?(p=p.getChild(C),G=!0):p=p.getChild(C-1):w=G=!0;for(var v=p.getParents(),D=m.getParents(),I=g(),E=v.length-1,L=D.length-1,J=c,ba,Z,V,fa=-1,O=I;O<=E;O++){Z=\nv[O];V=Z.getNext();for(O!=E||Z.equals(D[O])&&E<L?b&&(ba=J.append(Z.clone(0,e))):G?q(Z,J,!1,w):M&&J.append(a.document.createText(Z.substring(C)));V;){if(V.equals(D[O])){fa=O;break}V=q(V,J)}J=ba}J=c;for(O=I;O<=L;O++)if(c=D[O],V=c.getPrevious(),c.equals(v[O]))b&&(J=J.getChild(0));else{O!=L||c.equals(v[O])&&L<E?b&&(ba=J.append(c.clone(0,e))):H?q(c,J,!1,n):Q&&J.append(a.document.createText(c.substring(0,r)));if(O>fa)for(;V;)V=q(V,J,!0);J=ba}h||l()}}function b(){var a=!1,b=CKEDITOR.dom.walker.whitespaces(),\nc=CKEDITOR.dom.walker.bookmark(!0),d=CKEDITOR.dom.walker.bogus();return function(e){return c(e)||b(e)?!0:d(e)&&!a?a=!0:e.type==CKEDITOR.NODE_TEXT&&(e.hasAscendant(\"pre\")||CKEDITOR.tools.trim(e.getText()).length)||e.type==CKEDITOR.NODE_ELEMENT&&!e.is(g)?!1:!0}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?!0:!a&&l(d)||d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}}function e(a){return function(){var b;return this[a?\n\"getPreviousNode\":\"getNextNode\"](function(a){!b&&w(a)&&(b=a);return n(a)&&!(l(a)&&a.equals(b))})}}var g={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,\"var\":1},l=CKEDITOR.dom.walker.bogus(),k=/^[\\t\\r\\n ]*(?:&nbsp;|\\xa0)$/,n=CKEDITOR.dom.walker.editable(),w=CKEDITOR.dom.walker.ignored(!0);CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root);a._setStartContainer(this.startContainer);\na.startOffset=this.startOffset;a._setEndContainer(this.endContainer);a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){a?(this._setEndContainer(this.startContainer),this.endOffset=this.startOffset):(this._setStartContainer(this.endContainer),this.startOffset=this.endOffset);this.collapsed=!0},cloneContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,2,b,!1,\"undefined\"==typeof a?!0:a);return b},deleteContents:function(a){this.collapsed||\nd(this,0,null,a)},extractContents:function(a,b){var c=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,1,c,a,\"undefined\"==typeof b?!0:b);return c},createBookmark:function(a){var b,c,d,e,q=this.collapsed;b=this.document.createElement(\"span\");b.data(\"cke-bookmark\",1);b.setStyle(\"display\",\"none\");b.setHtml(\"\\x26nbsp;\");a&&(d=\"cke_bm_\"+CKEDITOR.tools.getNextNumber(),b.setAttribute(\"id\",d+(q?\"C\":\"S\")));q||(c=b.clone(),c.setHtml(\"\\x26nbsp;\"),a&&c.setAttribute(\"id\",d+\"E\"),e=this.clone(),\ne.collapse(),e.insertNode(c));e=this.clone();e.collapse(!0);e.insertNode(b);c?(this.setStartAfter(b),this.setEndBefore(c)):this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(q?\"C\":\"S\"):b,endNode:a?d+\"E\":c,serializable:a,collapsed:q}},createBookmark2:function(){function a(b){var f=b.container,d=b.offset,e;e=f;var g=d;e=e.type!=CKEDITOR.NODE_ELEMENT||0===g||g==e.getChildCount()?0:e.getChild(g-1).type==CKEDITOR.NODE_TEXT&&e.getChild(g).type==CKEDITOR.NODE_TEXT;e&&(f=f.getChild(d-\n1),d=f.getLength());if(f.type==CKEDITOR.NODE_ELEMENT&&0<d){a:{for(e=f;d--;)if(g=e.getChild(d).getIndex(!0),0<=g){d=g;break a}d=-1}d+=1}if(f.type==CKEDITOR.NODE_TEXT){e=f;for(g=0;(e=e.getPrevious())&&e.type==CKEDITOR.NODE_TEXT;)g+=e.getText().replace(CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE,\"\").length;e=g;f.getText()?d+=e:(g=f.getPrevious(c),e?(d=e,f=g?g.getNext():f.getParent().getFirst()):(f=f.getParent(),d=g?g.getIndex(!0)+1:0))}b.container=f;b.offset=d}function b(a,c){var f=c.getCustomData(\"cke-fillingChar\");\nif(f){var d=a.container;f.equals(d)&&(a.offset-=CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE.length,0>=a.offset&&(a.offset=d.getIndex(),a.container=d.getParent()))}}var c=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT,!0);return function(c){var d=this.collapsed,e={container:this.startContainer,offset:this.startOffset},g={container:this.endContainer,offset:this.endOffset};c&&(a(e),b(e,this.root),d||(a(g),b(g,this.root)));return{start:e.container.getAddress(c),end:d?null:g.container.getAddress(c),\nstartOffset:e.offset,endOffset:g.offset,normalized:c,collapsed:d,is2:!0}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized);a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):this.collapse(!0)}else b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode,a=c?this.document.getById(a.endNode):a.endNode,this.setStartBefore(b),b.remove(),a?(this.setEndBefore(a),a.remove()):\nthis.collapse(!0)},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,e;if(a.type==CKEDITOR.NODE_ELEMENT)if(e=a.getChildCount(),e>c)a=a.getChild(c);else if(1>e)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}if(b.type==CKEDITOR.NODE_ELEMENT)if(e=b.getChildCount(),e>d)b=b.getChild(d).getPreviousSourceNode(!0);else if(1>e)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b=\nb.lastChild;b=new CKEDITOR.dom.node(b)}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a):\nthis.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&a.is(\"span\")&&a.data(\"cke-bookmark\")&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&b.is&&b.is(\"span\")&&b.data(\"cke-bookmark\")&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,e=this.collapsed;if((!a||\ne)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength())d=c.getIndex()+1,c=c.getParent();else{var q=c.split(d),d=c.getIndex()+1,c=c.getParent();this.startContainer.equals(this.endContainer)?this.setEnd(q,this.endOffset-this.startOffset):c.equals(this.endContainer)&&(this.endOffset+=1)}else d=c.getIndex(),c=c.getParent();this.setStart(c,d);if(e){this.collapse(!0);return}}c=this.endContainer;d=this.endOffset;b||e||!c||c.type!=CKEDITOR.NODE_TEXT||(d?(d>=c.getLength()||c.split(d),d=c.getIndex()+1):\nd=c.getIndex(),c=c.getParent(),this.setEnd(c,d))},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute(\"contenteditable\")?null:a}var d=new RegExp(/[^\\s\\ufeff]/);switch(a){case CKEDITOR.ENLARGE_INLINE:var e=1;case CKEDITOR.ENLARGE_ELEMENT:var q=function(a,b){var c=new CKEDITOR.dom.range(l);c.setStart(a,b);c.setEndAt(l,CKEDITOR.POSITION_BEFORE_END);var c=new CKEDITOR.dom.walker(c),f;for(c.guard=function(a){return!(a.type==CKEDITOR.NODE_ELEMENT&&a.isBlockBoundary())};f=\nc.next();){if(f.type!=CKEDITOR.NODE_TEXT)return!1;G=f!=a?f.getText():f.substring(b);if(d.test(G))return!1}return!0};if(this.collapsed)break;var g=this.getCommonAncestor(),l=this.root,k,z,h,p,m,C=!1,r,G;r=this.startContainer;var H=this.startOffset;r.type==CKEDITOR.NODE_TEXT?(H&&(r=!CKEDITOR.tools.trim(r.substring(0,H)).length&&r,C=!!r),r&&((p=r.getPrevious())||(h=r.getParent()))):(H&&(p=r.getChild(H-1)||r.getLast()),p||(h=r));for(h=c(h);h||p;){if(h&&!p){!m&&h.equals(g)&&(m=!0);if(e?h.isBlockBoundary():\n!l.contains(h))break;C&&\"inline\"==h.getComputedStyle(\"display\")||(C=!1,m?k=h:this.setStartBefore(h));p=h.getPrevious()}for(;p;)if(r=!1,p.type==CKEDITOR.NODE_COMMENT)p=p.getPrevious();else{if(p.type==CKEDITOR.NODE_TEXT)G=p.getText(),d.test(G)&&(p=null),r=/[\\s\\ufeff]$/.test(G);else if((p.$.offsetWidth>(CKEDITOR.env.webkit?1:0)||b&&p.is(\"br\"))&&!p.data(\"cke-bookmark\"))if(C&&CKEDITOR.dtd.$removeEmpty[p.getName()]){G=p.getText();if(d.test(G))p=null;else for(var H=p.$.getElementsByTagName(\"*\"),w=0,n;n=\nH[w++];)if(!CKEDITOR.dtd.$removeEmpty[n.nodeName.toLowerCase()]){p=null;break}p&&(r=!!G.length)}else p=null;r&&(C?m?k=h:h&&this.setStartBefore(h):C=!0);if(p){r=p.getPrevious();if(!h&&!r){h=p;p=null;break}p=r}else h=null}h&&(h=c(h.getParent()))}r=this.endContainer;H=this.endOffset;h=p=null;m=C=!1;r.type==CKEDITOR.NODE_TEXT?CKEDITOR.tools.trim(r.substring(H)).length?C=!0:(C=!r.getLength(),H==r.getLength()?(p=r.getNext())||(h=r.getParent()):q(r,H)&&(h=r.getParent())):(p=r.getChild(H))||(h=r);for(;h||\np;){if(h&&!p){!m&&h.equals(g)&&(m=!0);if(e?h.isBlockBoundary():!l.contains(h))break;C&&\"inline\"==h.getComputedStyle(\"display\")||(C=!1,m?z=h:h&&this.setEndAfter(h));p=h.getNext()}for(;p;){r=!1;if(p.type==CKEDITOR.NODE_TEXT)G=p.getText(),q(p,0)||(p=null),r=/^[\\s\\ufeff]/.test(G);else if(p.type==CKEDITOR.NODE_ELEMENT){if((0<p.$.offsetWidth||b&&p.is(\"br\"))&&!p.data(\"cke-bookmark\"))if(C&&CKEDITOR.dtd.$removeEmpty[p.getName()]){G=p.getText();if(d.test(G))p=null;else for(H=p.$.getElementsByTagName(\"*\"),w=\n0;n=H[w++];)if(!CKEDITOR.dtd.$removeEmpty[n.nodeName.toLowerCase()]){p=null;break}p&&(r=!!G.length)}else p=null}else r=1;r&&C&&(m?z=h:this.setEndAfter(h));if(p){r=p.getNext();if(!h&&!r){h=p;p=null;break}p=r}else h=null}h&&(h=c(h.getParent()))}k&&z&&(g=k.contains(z)?z:k,this.setStartBefore(g),this.setEndAfter(g));break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:h=new CKEDITOR.dom.range(this.root);l=this.root;h.setStartAt(l,CKEDITOR.POSITION_AFTER_START);h.setEnd(this.startContainer,\nthis.startOffset);h=new CKEDITOR.dom.walker(h);var M,Q,v=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),D=null,I=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&\"false\"==a.getAttribute(\"contenteditable\"))if(D){if(D.equals(a)){D=null;return}}else D=a;else if(D)return;var b=v(a);b||(M=a);return b},e=function(a){var b=I(a);!b&&a.is&&a.is(\"br\")&&(Q=a);return b};h.guard=I;h=h.lastBackward();M=M||l;this.setStartAt(M,!M.is(\"br\")&&(!h&&this.checkStartOfBlock()||h&&M.contains(h))?\nCKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){h=this.clone();h=new CKEDITOR.dom.walker(h);var E=CKEDITOR.dom.walker.whitespaces(),L=CKEDITOR.dom.walker.bookmark();h.evaluator=function(a){return!E(a)&&!L(a)};if((h=h.previous())&&h.type==CKEDITOR.NODE_ELEMENT&&h.is(\"br\"))break}h=this.clone();h.collapse();h.setEndAt(l,CKEDITOR.POSITION_BEFORE_END);h=new CKEDITOR.dom.walker(h);h.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?e:I;M=D=Q=null;h=h.lastForward();\nM=M||l;this.setEndAt(M,!h&&this.checkEndOfBlock()||h&&M.contains(h)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);Q&&this.setEndAfter(Q)}},shrink:function(a,b,c){if(!this.collapsed){a=a||CKEDITOR.SHRINK_TEXT;var d=this.clone(),e=this.startContainer,q=this.endContainer,g=this.startOffset,l=this.endOffset,k=1,z=1;e&&e.type==CKEDITOR.NODE_TEXT&&(g?g>=e.getLength()?d.setStartAfter(e):(d.setStartBefore(e),k=0):d.setStartBefore(e));q&&q.type==CKEDITOR.NODE_TEXT&&(l?l>=q.getLength()?d.setEndAfter(q):\n(d.setEndAfter(q),z=0):d.setEndBefore(q));var d=new CKEDITOR.dom.walker(d),h=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var p;d.guard=function(b,d){if(h(b))return!0;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(p)||!1===c&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute(\"contenteditable\"))return!1;d||b.type!=CKEDITOR.NODE_ELEMENT||\n(p=b);return!0};k&&(e=d[a==CKEDITOR.SHRINK_ELEMENT?\"lastForward\":\"next\"]())&&this.setStartAt(e,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);z&&(d.reset(),(d=d[a==CKEDITOR.SHRINK_ELEMENT?\"lastBackward\":\"previous\"]())&&this.setEndAt(d,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END));return!(!k&&!z)}},insertNode:function(a){this.optimizeBookmark();this.trim(!1,!0);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&\nthis.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(!0)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex(),b=b.getParent());this._setStartContainer(b);this.startOffset=\nc;this.endContainer||(this._setEndContainer(b),this.endOffset=c);a(this)},setEnd:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex()+1,b=b.getParent());this._setEndContainer(b);this.endOffset=c;this.startContainer||(this._setStartContainer(b),this.startOffset=c);a(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),\na.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setStart(b,0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setStart(b,b.getLength()):this.setStart(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(b)}a(this)},setEndAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setEnd(b,\n0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setEnd(b,b.getLength()):this.setEnd(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(b)}a(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();this.insertNode(d);var e=d.getBogus();e&&e.remove();\nd.appendBogus();this.moveToBookmark(c);return d},splitBlock:function(a,b){var c=new CKEDITOR.dom.elementPath(this.startContainer,this.root),d=new CKEDITOR.dom.elementPath(this.endContainer,this.root),e=c.block,q=d.block,g=null;if(!c.blockLimit.equals(d.blockLimit))return null;\"br\"!=a&&(e||(e=this.fixBlock(!0,a),q=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block),q||(q=this.fixBlock(!1,a)));c=e&&this.checkStartOfBlock();d=q&&this.checkEndOfBlock();this.deleteContents();e&&e.equals(q)&&\n(d?(g=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(q,CKEDITOR.POSITION_AFTER_END),q=null):c?(g=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START),e=null):(q=this.splitElement(e,b||!1),e.is(\"ul\",\"ol\")||e.appendBogus()));return{previousBlock:e,nextBlock:q,wasStartOfBlock:c,wasEndOfBlock:d,elementPath:g}},splitElement:function(a,b){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);\nvar c=this.extractContents(!1,b||!1),d=a.clone(!1,b||!1);c.appendTo(d);d.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return d},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable()||d.is(\"table\")&&a.is(\"caption\")?!1:!0}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(!1);return function(b){for(var c=this.createBookmark(),d=this[b?\"endPath\":\"startPath\"](),e=d.block||\nd.blockLimit,g;e&&!e.equals(d.root)&&!e.getFirst(a(e));)g=e.getParent(),this[b?\"setEndAt\":\"setStartAt\"](e,CKEDITOR.POSITION_AFTER_END),e.remove(1),e=g;this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var d=b==CKEDITOR.START,e=this.clone();e.collapse(d);e[d?\"setStartAt\":\"setEndAt\"](a,d?CKEDITOR.POSITION_AFTER_START:\nCKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e);e.evaluator=c(d);return e[d?\"checkBackward\":\"checkForward\"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.ltrim(a.substring(0,c)),k.test(a)&&this.trim(0,1));this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(!0);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);\na.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=this.endContainer,c=this.endOffset;CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.rtrim(a.substring(c)),k.test(a)&&this.trim(1,0));this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(!1);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();\nd.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if(\"false\"==b.getAttribute(\"contentEditable\")&&!b.data(\"cke-editable\"))return 0;if(b.is(\"html\")||\n\"true\"==b.getAttribute(\"contentEditable\")&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(!1))return this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START),!0;for(var c=0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&k.test(a.getText())?this.moveToPosition(a,\nCKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable())this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START),c=1;else if(b&&a.is(\"br\")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START);else if(\"false\"==a.getAttribute(\"contenteditable\")&&a.is(CKEDITOR.dtd.$block))return this.setStartBefore(a),this.setEndAfter(a),\n!0;var d=a,e=c,q=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(!1)&&(q=d[b?\"getLast\":\"getFirst\"](w));e||q||(q=d[b?\"getPrevious\":\"getNext\"](w));a=q}return!!c},moveToClosestEditablePosition:function(a,b){var c,d=0,e,q,g=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];a?(c=new CKEDITOR.dom.range(this.root),c.moveToPosition(a,g[b?0:1])):c=this.clone();if(a&&!a.is(CKEDITOR.dtd.$block))d=1;else if(e=c[b?\"getNextEditableNode\":\"getPreviousEditableNode\"]())d=1,(q=e.type==CKEDITOR.NODE_ELEMENT)&&\ne.is(CKEDITOR.dtd.$block)&&\"false\"==e.getAttribute(\"contenteditable\")?(c.setStartAt(e,CKEDITOR.POSITION_BEFORE_START),c.setEndAt(e,CKEDITOR.POSITION_AFTER_END)):!CKEDITOR.env.needsBrFiller&&q&&e.is(CKEDITOR.dom.walker.validEmptyBlockContainers)?(c.setEnd(e,0),c.collapse()):c.moveToPosition(e,g[b?1:0]);d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,!0)},getEnclosedNode:function(){var a=\nthis.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(!1,!0),c=CKEDITOR.dom.walker.whitespaces(!0);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=\nthis.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:e(),getPreviousEditableNode:e(1),scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml(\"\\x3cspan\\x3e\\x26nbsp;\\x3c/span\\x3e\",this.document),b,c,d,e=this.clone();e.optimize();(d=e.startContainer.type==CKEDITOR.NODE_TEXT)?(c=e.startContainer.getText(),b=e.startContainer.split(e.startOffset),a.insertAfter(e.startContainer)):e.insertNode(a);a.scrollIntoView();\nd&&(e.startContainer.setText(c),b.remove());a.remove()},_setStartContainer:function(a){this.startContainer=a},_setEndContainer:function(a){this.endContainer=a}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;\"use strict\";\n(function(){function a(a){1>arguments.length||(this.range=a,this.forceBrBreak=0,this.enlargeBr=1,this.enforceRealBlocks=0,this._||(this._={}))}function d(a){var b=[];a.forEach(function(a){if(\"true\"==a.getAttribute(\"contenteditable\"))return b.push(a),!1},CKEDITOR.NODE_ELEMENT,!0);return b}function b(a,c,e,g){a:{null==g&&(g=d(e));for(var l;l=g.shift();)if(l.getDtd().p){g={element:l,remaining:g};break a}g=null}if(!g)return 0;if((l=CKEDITOR.filter.instances[g.element.data(\"cke-filter\")])&&!l.check(c))return b(a,\nc,e,g.remaining);c=new CKEDITOR.dom.range(g.element);c.selectNodeContents(g.element);c=c.createIterator();c.enlargeBr=a.enlargeBr;c.enforceRealBlocks=a.enforceRealBlocks;c.activeFilter=c.filter=l;a._.nestedEditable={element:g.element,container:e,remaining:g.remaining,iterator:c};return 1}function c(a,b,c){if(!b)return!1;a=a.clone();a.collapse(!c);return a.checkBoundaryOfElement(b,c?CKEDITOR.START:CKEDITOR.END)}var e=/^[\\r\\n\\t ]+$/,g=CKEDITOR.dom.walker.bookmark(!1,!0),l=CKEDITOR.dom.walker.whitespaces(!0),\nk=function(a){return g(a)&&l(a)},n={dd:1,dt:1,li:1};a.prototype={getNextParagraph:function(a){var d,l,A,u,B;a=a||\"p\";if(this._.nestedEditable){if(d=this._.nestedEditable.iterator.getNextParagraph(a))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,d;this.activeFilter=this.filter;if(b(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,this._.nestedEditable.iterator.getNextParagraph(a);this._.nestedEditable=\nnull}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var q=this.range.clone();l=q.startPath();var y=q.endPath(),F=!q.collapsed&&c(q,l.block),t=!q.collapsed&&c(q,y.block,1);q.shrink(CKEDITOR.SHRINK_ELEMENT,!0);F&&q.setStartAt(l.block,CKEDITOR.POSITION_BEFORE_END);t&&q.setEndAt(y.block,CKEDITOR.POSITION_AFTER_START);l=q.endContainer.hasAscendant(\"pre\",!0)||q.startContainer.hasAscendant(\"pre\",!0);q.enlarge(this.forceBrBreak&&!l||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);\nq.collapsed||(l=new CKEDITOR.dom.walker(q.clone()),y=CKEDITOR.dom.walker.bookmark(!0,!0),l.evaluator=y,this._.nextNode=l.next(),l=new CKEDITOR.dom.walker(q.clone()),l.evaluator=y,l=l.previous(),this._.lastNode=l.getNextSourceNode(!0,null,q.root),this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()&&(y=this.range.clone(),y.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END),y.checkEndOfBlock()&&\n(y=new CKEDITOR.dom.elementPath(y.endContainer,y.root),this._.lastNode=(y.block||y.blockLimit).getNextSourceNode(!0))),this._.lastNode&&q.root.contains(this._.lastNode)||(this._.lastNode=this._.docEndMarker=q.document.createText(\"\"),this._.lastNode.insertAfter(l)),q=null);this._.started=1;l=q}y=this._.nextNode;q=this._.lastNode;for(this._.nextNode=null;y;){var F=0,t=y.hasAscendant(\"pre\"),z=y.type!=CKEDITOR.NODE_ELEMENT,h=0;if(z)y.type==CKEDITOR.NODE_TEXT&&e.test(y.getText())&&(z=0);else{var p=y.getName();\nif(CKEDITOR.dtd.$block[p]&&\"false\"==y.getAttribute(\"contenteditable\")){d=y;b(this,a,d);break}else if(y.isBlockBoundary(this.forceBrBreak&&!t&&{br:1})){if(\"br\"==p)z=1;else if(!l&&!y.getChildCount()&&\"hr\"!=p){d=y;A=y.equals(q);break}l&&(l.setEndAt(y,CKEDITOR.POSITION_BEFORE_START),\"br\"!=p&&(this._.nextNode=y));F=1}else{if(y.getFirst()){l||(l=this.range.clone(),l.setStartAt(y,CKEDITOR.POSITION_BEFORE_START));y=y.getFirst();continue}z=1}}z&&!l&&(l=this.range.clone(),l.setStartAt(y,CKEDITOR.POSITION_BEFORE_START));\nA=(!F||z)&&y.equals(q);if(l&&!F)for(;!y.getNext(k)&&!A;){p=y.getParent();if(p.isBlockBoundary(this.forceBrBreak&&!t&&{br:1})){F=1;z=0;A||p.equals(q);l.setEndAt(p,CKEDITOR.POSITION_BEFORE_END);break}y=p;z=1;A=y.equals(q);h=1}z&&l.setEndAt(y,CKEDITOR.POSITION_AFTER_END);y=this._getNextSourceNode(y,h,q);if((A=!y)||F&&l)break}if(!d){if(!l)return this._.docEndMarker&&this._.docEndMarker.remove(),this._.nextNode=null;d=new CKEDITOR.dom.elementPath(l.startContainer,l.root);y=d.blockLimit;F={div:1,th:1,td:1};\nd=d.block;!d&&y&&!this.enforceRealBlocks&&F[y.getName()]&&l.checkStartOfBlock()&&l.checkEndOfBlock()&&!y.equals(l.root)?d=y:!d||this.enforceRealBlocks&&d.is(n)?(d=this.range.document.createElement(a),l.extractContents().appendTo(d),d.trim(),l.insertNode(d),u=B=!0):\"li\"!=d.getName()?l.checkStartOfBlock()&&l.checkEndOfBlock()||(d=d.clone(!1),l.extractContents().appendTo(d),d.trim(),B=l.splitBlock(),u=!B.wasStartOfBlock,B=!B.wasEndOfBlock,l.insertNode(d)):A||(this._.nextNode=d.equals(q)?null:this._getNextSourceNode(l.getBoundaryNodes().endNode,\n1,q))}u&&(u=d.getPrevious())&&u.type==CKEDITOR.NODE_ELEMENT&&(\"br\"==u.getName()?u.remove():u.getLast()&&\"br\"==u.getLast().$.nodeName.toLowerCase()&&u.getLast().remove());B&&(u=d.getLast())&&u.type==CKEDITOR.NODE_ELEMENT&&\"br\"==u.getName()&&(!CKEDITOR.env.needsBrFiller||u.getPrevious(g)||u.getNext(g))&&u.remove();this._.nextNode||(this._.nextNode=A||d.equals(q)||!q?null:this._getNextSourceNode(d,1,q));return d},_getNextSourceNode:function(a,b,c){function d(a){return!(a.equals(c)||a.equals(e))}var e=\nthis.range.root;for(a=a.getNextSourceNode(b,null,d);!g(a);)a=a.getNextSourceNode(b,null,d);return a}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})();\nCKEDITOR.command=function(a,d){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return!1;this.editorFocus&&a.focus();return!1===this.fire(\"exec\")?!0:!1!==d.exec.call(this,a,b)};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return!0;if(this.context&&!b.isContextFor(this.context)||!this.checkAllowed(!0))return this.disable(),!0;this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&&this.disable();return!1===this.fire(\"refresh\",\n{editor:a,path:b})?!0:d.refresh&&!1!==d.refresh.apply(this,arguments)};var b;this.checkAllowed=function(c){return c||\"boolean\"!=typeof b?b=a.activeFilter.checkFeature(this):b};CKEDITOR.tools.extend(this,d,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!d.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)};\nCKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(this.preserveState&&\"undefined\"!=typeof this.previousState?this.previousState:CKEDITOR.TRISTATE_OFF)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return!1;this.previousState=this.state;this.state=a;this.fire(\"state\");return!0},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?\nthis.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3;\nCKEDITOR.config={customConfig:\"config.js\",autoUpdateElement:!0,language:\"\",defaultLanguage:\"en\",contentsLangDirection:\"\",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:\"\\x3c!DOCTYPE html\\x3e\",bodyId:\"\",bodyClass:\"\",fullPage:!1,height:200,contentsCss:CKEDITOR.getUrl(\"contents.css\"),extraPlugins:\"\",removePlugins:\"\",protectedSource:[],tabIndex:0,width:\"\",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]};\n(function(){function a(a,b,c,d,e){var h,p;a=[];for(h in b){p=b[h];p=\"boolean\"==typeof p?{}:\"function\"==typeof p?{match:p}:K(p);\"$\"!=h.charAt(0)&&(p.elements=h);c&&(p.featureName=c.toLowerCase());var m=p;m.elements=l(m.elements,/\\s+/)||null;m.propertiesOnly=m.propertiesOnly||!0===m.elements;var r=/\\s*,\\s*/,q=void 0;for(q in Q){m[q]=l(m[q],r)||null;var f=m,E=v[q],z=l(m[v[q]],r),g=m[q],C=[],G=!0,L=void 0;z?G=!1:z={};for(L in g)\"!\"==L.charAt(0)&&(L=L.slice(1),C.push(L),z[L]=!0,G=!1);for(;L=C.pop();)g[L]=\ng[\"!\"+L],delete g[\"!\"+L];f[E]=(G?!1:z)||null}m.match=m.match||null;d.push(p);a.push(p)}b=e.elements;e=e.generic;var k;c=0;for(d=a.length;c<d;++c){h=K(a[c]);p=!0===h.classes||!0===h.styles||!0===h.attributes;m=h;q=E=r=void 0;for(r in Q)m[r]=F(m[r]);f=!0;for(q in v){r=v[q];E=m[r];z=[];g=void 0;for(g in E)-1<g.indexOf(\"*\")?z.push(new RegExp(\"^\"+g.replace(/\\*/g,\".*\")+\"$\")):z.push(g);E=z;E.length&&(m[r]=E,f=!1)}m.nothingRequired=f;m.noProperties=!(m.attributes||m.classes||m.styles);if(!0===h.elements||\nnull===h.elements)e[p?\"unshift\":\"push\"](h);else for(k in m=h.elements,delete h.elements,m)if(b[k])b[k][p?\"unshift\":\"push\"](h);else b[k]=[h]}}function d(a,c,d,h){if(!a.match||a.match(c))if(h||k(a,c))if(a.propertiesOnly||(d.valid=!0),d.allAttributes||(d.allAttributes=b(a.attributes,c.attributes,d.validAttributes)),d.allStyles||(d.allStyles=b(a.styles,c.styles,d.validStyles)),!d.allClasses){a=a.classes;c=c.classes;h=d.validClasses;if(a)if(!0===a)a=!0;else{for(var p=0,e=c.length,m;p<e;++p)m=c[p],h[m]||\n(h[m]=a(m));a=!1}else a=!1;d.allClasses=a}}function b(a,b,c){if(!a)return!1;if(!0===a)return!0;for(var d in b)c[d]||(c[d]=a(d));return!1}function c(a,b,c){if(!a.match||a.match(b)){if(a.noProperties)return!1;c.hadInvalidAttribute=e(a.attributes,b.attributes)||c.hadInvalidAttribute;c.hadInvalidStyle=e(a.styles,b.styles)||c.hadInvalidStyle;a=a.classes;b=b.classes;if(a){for(var d=!1,h=!0===a,p=b.length;p--;)if(h||a(b[p]))b.splice(p,1),d=!0;a=d}else a=!1;c.hadInvalidClass=a||c.hadInvalidClass}}function e(a,\nb){if(!a)return!1;var c=!1,d=!0===a,h;for(h in b)if(d||a(h))delete b[h],c=!0;return c}function g(a,b,c){if(a.disabled||a.customConfig&&!c||!b)return!1;a._.cachedChecks={};return!0}function l(a,b){if(!a)return!1;if(!0===a)return a;if(\"string\"==typeof a)return a=R(a),\"*\"==a?!0:CKEDITOR.tools.convertArrayToObject(a.split(b));if(CKEDITOR.tools.isArray(a))return a.length?CKEDITOR.tools.convertArrayToObject(a):!1;var c={},d=0,h;for(h in a)c[h]=a[h],d++;return d?c:!1}function k(a,b){if(a.nothingRequired)return!0;\nvar c,d,h,p;if(h=a.requiredClasses)for(p=b.classes,c=0;c<h.length;++c)if(d=h[c],\"string\"==typeof d){if(-1==CKEDITOR.tools.indexOf(p,d))return!1}else if(!CKEDITOR.tools.checkIfAnyArrayItemMatches(p,d))return!1;return n(b.styles,a.requiredStyles)&&n(b.attributes,a.requiredAttributes)}function n(a,b){if(!b)return!0;for(var c=0,d;c<b.length;++c)if(d=b[c],\"string\"==typeof d){if(!(d in a))return!1}else if(!CKEDITOR.tools.checkIfAnyObjectPropertyMatches(a,d))return!1;return!0}function w(a){if(!a)return{};\na=a.split(/\\s*,\\s*/).sort();for(var b={};a.length;)b[a.shift()]=\"cke-test\";return b}function f(a){var b,c,d,h,p={},e=1;for(a=R(a);b=a.match(D);)(c=b[2])?(d=x(c,\"styles\"),h=x(c,\"attrs\"),c=x(c,\"classes\")):d=h=c=null,p[\"$\"+e++]={elements:b[1],classes:c,styles:d,attributes:h},a=a.slice(b[0].length);return p}function x(a,b){var c=a.match(I[b]);return c?R(c[1]):null}function A(a){var b=a.styleBackup=a.attributes.style,c=a.classBackup=a.attributes[\"class\"];a.styles||(a.styles=CKEDITOR.tools.parseCssText(b||\n\"\",1));a.classes||(a.classes=c?c.split(/\\s+/):[])}function u(a,b,h,e){var m=0,r;e.toHtml&&(b.name=b.name.replace(E,\"$1\"));if(e.doCallbacks&&a.elementCallbacks){a:{r=a.elementCallbacks;for(var g=0,f=r.length,z;g<f;++g)if(z=r[g](b)){r=z;break a}r=void 0}if(r)return r}if(e.doTransform&&(r=a._.transformations[b.name])){A(b);for(g=0;g<r.length;++g)p(a,b,r[g]);q(b)}if(e.doFilter){a:{g=b.name;f=a._;a=f.allowedRules.elements[g];r=f.allowedRules.generic;g=f.disallowedRules.elements[g];f=f.disallowedRules.generic;\nz=e.skipRequired;var C={valid:!1,validAttributes:{},validClasses:{},validStyles:{},allAttributes:!1,allClasses:!1,allStyles:!1,hadInvalidAttribute:!1,hadInvalidClass:!1,hadInvalidStyle:!1},v,l;if(a||r){A(b);if(g)for(v=0,l=g.length;v<l;++v)if(!1===c(g[v],b,C)){a=null;break a}if(f)for(v=0,l=f.length;v<l;++v)c(f[v],b,C);if(a)for(v=0,l=a.length;v<l;++v)d(a[v],b,C,z);if(r)for(v=0,l=r.length;v<l;++v)d(r[v],b,C,z);a=C}else a=null}if(!a||!a.valid)return h.push(b),1;l=a.validAttributes;var G=a.validStyles;\nr=a.validClasses;var g=b.attributes,k=b.styles,f=b.classes;z=b.classBackup;var I=b.styleBackup,D,H,J=[],C=[],n=/^data-cke-/;v=!1;delete g.style;delete g[\"class\"];delete b.classBackup;delete b.styleBackup;if(!a.allAttributes)for(D in g)l[D]||(n.test(D)?D==(H=D.replace(/^data-cke-saved-/,\"\"))||l[H]||(delete g[D],v=!0):(delete g[D],v=!0));if(!a.allStyles||a.hadInvalidStyle){for(D in k)a.allStyles||G[D]?J.push(D+\":\"+k[D]):v=!0;J.length&&(g.style=J.sort().join(\"; \"))}else I&&(g.style=I);if(!a.allClasses||\na.hadInvalidClass){for(D=0;D<f.length;++D)(a.allClasses||r[f[D]])&&C.push(f[D]);C.length&&(g[\"class\"]=C.sort().join(\" \"));z&&C.length<z.split(/\\s+/).length&&(v=!0)}else z&&(g[\"class\"]=z);v&&(m=1);if(!e.skipFinalValidation&&!y(b))return h.push(b),1}e.toHtml&&(b.name=b.name.replace(L,\"cke:$1\"));return m}function B(a){var b=[],c;for(c in a)-1<c.indexOf(\"*\")&&b.push(c.replace(/\\*/g,\".*\"));return b.length?new RegExp(\"^(?:\"+b.join(\"|\")+\")$\"):null}function q(a){var b=a.attributes,c;delete b.style;delete b[\"class\"];\nif(c=CKEDITOR.tools.writeCssText(a.styles,!0))b.style=c;a.classes.length&&(b[\"class\"]=a.classes.sort().join(\" \"))}function y(a){switch(a.name){case \"a\":if(!(a.children.length||a.attributes.name||a.attributes.id))return!1;break;case \"img\":if(!a.attributes.src)return!1}return!0}function F(a){if(!a)return!1;if(!0===a)return!0;var b=B(a);return function(c){return c in a||b&&c.match(b)}}function t(){return new CKEDITOR.htmlParser.element(\"br\")}function z(a){return a.type==CKEDITOR.NODE_ELEMENT&&(\"br\"==\na.name||H.$block[a.name])}function h(a,b,c){var d=a.name;if(H.$empty[d]||!a.children.length)\"hr\"==d&&\"br\"==b?a.replaceWith(t()):(a.parent&&c.push({check:\"it\",el:a.parent}),a.remove());else if(H.$block[d]||\"tr\"==d)if(\"br\"==b)a.previous&&!z(a.previous)&&(b=t(),b.insertBefore(a)),a.next&&!z(a.next)&&(b=t(),b.insertAfter(a)),a.replaceWithChildren();else{var d=a.children,h;b:{h=H[b];for(var p=0,e=d.length,m;p<e;++p)if(m=d[p],m.type==CKEDITOR.NODE_ELEMENT&&!h[m.name]){h=!1;break b}h=!0}if(h)a.name=b,a.attributes=\n{},c.push({check:\"parent-down\",el:a});else{h=a.parent;for(var p=h.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||\"body\"==h.name,r,g,e=d.length;0<e;)m=d[--e],p&&(m.type==CKEDITOR.NODE_TEXT||m.type==CKEDITOR.NODE_ELEMENT&&H.$inline[m.name])?(r||(r=new CKEDITOR.htmlParser.element(b),r.insertAfter(a),c.push({check:\"parent-down\",el:r})),r.add(m,0)):(r=null,g=H[h.name]||H.span,m.insertAfter(a),h.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||m.type!=CKEDITOR.NODE_ELEMENT||g[m.name]||c.push({check:\"el-up\",el:m}));a.remove()}}else d in\n{style:1,script:1}?a.remove():(a.parent&&c.push({check:\"it\",el:a.parent}),a.replaceWithChildren())}function p(a,b,c){var d,h;for(d=0;d<c.length;++d)if(h=c[d],!(h.check&&!a.check(h.check,!1)||h.left&&!h.left(b))){h.right(b,J);break}}function m(a,b){var c=b.getDefinition(),d=c.attributes,h=c.styles,p,e,m,r;if(a.name!=c.element)return!1;for(p in d)if(\"class\"==p)for(c=d[p].split(/\\s+/),m=a.classes.join(\"|\");r=c.pop();){if(-1==m.indexOf(r))return!1}else if(a.attributes[p]!=d[p])return!1;for(e in h)if(a.styles[e]!=\nh[e])return!1;return!0}function C(a,b){var c,d;\"string\"==typeof a?c=a:a instanceof CKEDITOR.style?d=a:(c=a[0],d=a[1]);return[{element:c,left:d,right:function(a,c){c.transform(a,b)}}]}function r(a){return function(b){return m(b,a)}}function G(a){return function(b,c){c[a](b)}}var H=CKEDITOR.dtd,K=CKEDITOR.tools.copy,R=CKEDITOR.tools.trim,M=[\"\",\"p\",\"br\",\"div\"];CKEDITOR.FILTER_SKIP_TREE=2;CKEDITOR.filter=function(a){this.allowedContent=[];this.disallowedContent=[];this.elementCallbacks=null;this.disabled=\n!1;this.editor=null;this.id=CKEDITOR.tools.getNextNumber();this._={allowedRules:{elements:{},generic:[]},disallowedRules:{elements:{},generic:[]},transformations:{},cachedTests:{}};CKEDITOR.filter.instances[this.id]=this;if(a instanceof CKEDITOR.editor){a=this.editor=a;this.customConfig=!0;var b=a.config.allowedContent;!0===b?this.disabled=!0:(b||(this.customConfig=!1),this.allow(b,\"config\",1),this.allow(a.config.extraAllowedContent,\"extra\",1),this.allow(M[a.enterMode]+\" \"+M[a.shiftEnterMode],\"default\",\n1),this.disallow(a.config.disallowedContent))}else this.customConfig=!1,this.allow(a,\"default\",1)};CKEDITOR.filter.instances={};CKEDITOR.filter.prototype={allow:function(b,c,d){if(!g(this,b,d))return!1;var h,p;if(\"string\"==typeof b)b=f(b);else if(b instanceof CKEDITOR.style){if(b.toAllowedContentRules)return this.allow(b.toAllowedContentRules(this.editor),c,d);h=b.getDefinition();b={};d=h.attributes;b[h.element]=h={styles:h.styles,requiredStyles:h.styles&&CKEDITOR.tools.objectKeys(h.styles)};d&&(d=\nK(d),h.classes=d[\"class\"]?d[\"class\"].split(/\\s+/):null,h.requiredClasses=h.classes,delete d[\"class\"],h.attributes=d,h.requiredAttributes=d&&CKEDITOR.tools.objectKeys(d))}else if(CKEDITOR.tools.isArray(b)){for(h=0;h<b.length;++h)p=this.allow(b[h],c,d);return p}a(this,b,c,this.allowedContent,this._.allowedRules);return!0},applyTo:function(a,b,c,d){if(this.disabled)return!1;var p=this,e=[],m=this.editor&&this.editor.config.protectedSource,r,g=!1,f={doFilter:!c,doTransform:!0,doCallbacks:!0,toHtml:b};\na.forEach(function(a){if(a.type==CKEDITOR.NODE_ELEMENT){if(\"off\"==a.attributes[\"data-cke-filter\"])return!1;if(!b||\"span\"!=a.name||!~CKEDITOR.tools.objectKeys(a.attributes).join(\"|\").indexOf(\"data-cke-\"))if(r=u(p,a,e,f),r&1)g=!0;else if(r&2)return!1}else if(a.type==CKEDITOR.NODE_COMMENT&&a.value.match(/^\\{cke_protected\\}(?!\\{C\\})/)){var c;a:{var d=decodeURIComponent(a.value.replace(/^\\{cke_protected\\}/,\"\"));c=[];var h,q,z;if(m)for(q=0;q<m.length;++q)if((z=d.match(m[q]))&&z[0].length==d.length){c=!0;\nbreak a}d=CKEDITOR.htmlParser.fragment.fromHtml(d);1==d.children.length&&(h=d.children[0]).type==CKEDITOR.NODE_ELEMENT&&u(p,h,c,f);c=!c.length}c||e.push(a)}},null,!0);e.length&&(g=!0);var q;a=[];d=M[d||(this.editor?this.editor.enterMode:CKEDITOR.ENTER_P)];for(var z;c=e.pop();)c.type==CKEDITOR.NODE_ELEMENT?h(c,d,a):c.remove();for(;q=a.pop();)if(c=q.el,c.parent)switch(z=H[c.parent.name]||H.span,q.check){case \"it\":H.$removeEmpty[c.name]&&!c.children.length?h(c,d,a):y(c)||h(c,d,a);break;case \"el-up\":c.parent.type==\nCKEDITOR.NODE_DOCUMENT_FRAGMENT||z[c.name]||h(c,d,a);break;case \"parent-down\":c.parent.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||z[c.name]||h(c.parent,d,a)}return g},checkFeature:function(a){if(this.disabled||!a)return!0;a.toFeature&&(a=a.toFeature(this.editor));return!a.requiredContent||this.check(a.requiredContent)},disable:function(){this.disabled=!0},disallow:function(b){if(!g(this,b,!0))return!1;\"string\"==typeof b&&(b=f(b));a(this,b,null,this.disallowedContent,this._.disallowedRules);return!0},\naddContentForms:function(a){if(!this.disabled&&a){var b,c,d=[],h;for(b=0;b<a.length&&!h;++b)c=a[b],(\"string\"==typeof c||c instanceof CKEDITOR.style)&&this.check(c)&&(h=c);if(h){for(b=0;b<a.length;++b)d.push(C(a[b],h));this.addTransformations(d)}}},addElementCallback:function(a){this.elementCallbacks||(this.elementCallbacks=[]);this.elementCallbacks.push(a)},addFeature:function(a){if(this.disabled||!a)return!0;a.toFeature&&(a=a.toFeature(this.editor));this.allow(a.allowedContent,a.name);this.addTransformations(a.contentTransformations);\nthis.addContentForms(a.contentForms);return a.requiredContent&&(this.customConfig||this.disallowedContent.length)?this.check(a.requiredContent):!0},addTransformations:function(a){var b,c;if(!this.disabled&&a){var d=this._.transformations,h;for(h=0;h<a.length;++h){b=a[h];var p=void 0,e=void 0,m=void 0,g=void 0,q=void 0,f=void 0;c=[];for(e=0;e<b.length;++e)m=b[e],\"string\"==typeof m?(m=m.split(/\\s*:\\s*/),g=m[0],q=null,f=m[1]):(g=m.check,q=m.left,f=m.right),p||(p=m,p=p.element?p.element:g?g.match(/^([a-z0-9]+)/i)[0]:\np.left.getDefinition().element),q instanceof CKEDITOR.style&&(q=r(q)),c.push({check:g==p?null:g,left:q,right:\"string\"==typeof f?G(f):f});b=p;d[b]||(d[b]=[]);d[b].push(c)}}},check:function(a,b,c){if(this.disabled)return!0;if(CKEDITOR.tools.isArray(a)){for(var d=a.length;d--;)if(this.check(a[d],b,c))return!0;return!1}var h,e;if(\"string\"==typeof a){e=a+\"\\x3c\"+(!1===b?\"0\":\"1\")+(c?\"1\":\"0\")+\"\\x3e\";if(e in this._.cachedChecks)return this._.cachedChecks[e];d=f(a).$1;h=d.styles;var m=d.classes;d.name=d.elements;\nd.classes=m=m?m.split(/\\s*,\\s*/):[];d.styles=w(h);d.attributes=w(d.attributes);d.children=[];m.length&&(d.attributes[\"class\"]=m.join(\" \"));h&&(d.attributes.style=CKEDITOR.tools.writeCssText(d.styles));h=d}else d=a.getDefinition(),h=d.styles,m=d.attributes||{},h?(h=K(h),m.style=CKEDITOR.tools.writeCssText(h,!0)):h={},h={name:d.element,attributes:m,classes:m[\"class\"]?m[\"class\"].split(/\\s+/):[],styles:h,children:[]};var m=CKEDITOR.tools.clone(h),r=[],g;if(!1!==b&&(g=this._.transformations[h.name])){for(d=\n0;d<g.length;++d)p(this,h,g[d]);q(h)}u(this,m,r,{doFilter:!0,doTransform:!1!==b,skipRequired:!c,skipFinalValidation:!c});b=0<r.length?!1:CKEDITOR.tools.objectCompare(h.attributes,m.attributes,!0)?!0:!1;\"string\"==typeof a&&(this._.cachedChecks[e]=b);return b},getAllowedEnterMode:function(){var a=[\"p\",\"div\",\"br\"],b={p:CKEDITOR.ENTER_P,div:CKEDITOR.ENTER_DIV,br:CKEDITOR.ENTER_BR};return function(c,d){var h=a.slice(),p;if(this.check(M[c]))return c;for(d||(h=h.reverse());p=h.pop();)if(this.check(p))return b[p];\nreturn CKEDITOR.ENTER_BR}}(),destroy:function(){delete CKEDITOR.filter.instances[this.id];delete this._;delete this.allowedContent;delete this.disallowedContent}};var Q={styles:1,attributes:1,classes:1},v={styles:\"requiredStyles\",attributes:\"requiredAttributes\",classes:\"requiredClasses\"},D=/^([a-z0-9\\-*\\s]+)((?:\\s*\\{[!\\w\\-,\\s\\*]+\\}\\s*|\\s*\\[[!\\w\\-,\\s\\*]+\\]\\s*|\\s*\\([!\\w\\-,\\s\\*]+\\)\\s*){0,3})(?:;\\s*|$)/i,I={styles:/{([^}]+)}/,attrs:/\\[([^\\]]+)\\]/,classes:/\\(([^\\)]+)\\)/},E=/^cke:(object|embed|param)$/,\nL=/^(object|embed|param)$/,J=CKEDITOR.filter.transformationsTools={sizeToStyle:function(a){this.lengthToStyle(a,\"width\");this.lengthToStyle(a,\"height\")},sizeToAttribute:function(a){this.lengthToAttribute(a,\"width\");this.lengthToAttribute(a,\"height\")},lengthToStyle:function(a,b,c){c=c||b;if(!(c in a.styles)){var d=a.attributes[b];d&&(/^\\d+$/.test(d)&&(d+=\"px\"),a.styles[c]=d)}delete a.attributes[b]},lengthToAttribute:function(a,b,c){c=c||b;if(!(c in a.attributes)){var d=a.styles[b],h=d&&d.match(/^(\\d+)(?:\\.\\d*)?px$/);\nh?a.attributes[c]=h[1]:\"cke-test\"==d&&(a.attributes[c]=\"cke-test\")}delete a.styles[b]},alignmentToStyle:function(a){if(!(\"float\"in a.styles)){var b=a.attributes.align;if(\"left\"==b||\"right\"==b)a.styles[\"float\"]=b}delete a.attributes.align},alignmentToAttribute:function(a){if(!(\"align\"in a.attributes)){var b=a.styles[\"float\"];if(\"left\"==b||\"right\"==b)a.attributes.align=b}delete a.styles[\"float\"]},matchesStyle:m,transform:function(a,b){if(\"string\"==typeof b)a.name=b;else{var c=b.getDefinition(),d=c.styles,\nh=c.attributes,p,m,e,r;a.name=c.element;for(p in h)if(\"class\"==p)for(c=a.classes.join(\"|\"),e=h[p].split(/\\s+/);r=e.pop();)-1==c.indexOf(r)&&a.classes.push(r);else a.attributes[p]=h[p];for(m in d)a.styles[m]=d[m]}}}})();\n(function(){CKEDITOR.focusManager=function(a){if(a.focusManager)return a.focusManager;this.hasFocus=!1;this.currentActive=null;this._={editor:a};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(a){this._.timer&&clearTimeout(this._.timer);a&&(this.currentActive=a);this.hasFocus||this._.locked||((a=CKEDITOR.currentInstance)&&a.focusManager.blur(1),this.hasFocus=!0,(a=this._.editor.container)&&a.addClass(\"cke_focus\"),this._.editor.fire(\"focus\"))},lock:function(){this._.locked=\n1},unlock:function(){delete this._.locked},blur:function(a){function d(){if(this.hasFocus){this.hasFocus=!1;var a=this._.editor.container;a&&a.removeClass(\"cke_focus\");this._.editor.fire(\"blur\")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var b=CKEDITOR.focusManager._.blurDelay;a||!b?d.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;d.call(this)},b,this)}},add:function(a,d){var b=a.getCustomData(\"focusmanager\");if(!b||b!=this){b&&b.remove(a);var b=\n\"focus\",c=\"blur\";d&&(CKEDITOR.env.ie?(b=\"focusin\",c=\"focusout\"):CKEDITOR.event.useCapture=1);var e={blur:function(){a.equals(this.currentActive)&&this.blur()},focus:function(){this.focus(a)}};a.on(b,e.focus,this);a.on(c,e.blur,this);d&&(CKEDITOR.event.useCapture=0);a.setCustomData(\"focusmanager\",this);a.setCustomData(\"focusmanager_handlers\",e)}},remove:function(a){a.removeCustomData(\"focusmanager\");var d=a.removeCustomData(\"focusmanager_handlers\");a.removeListener(\"blur\",d.blur);a.removeListener(\"focus\",\nd.focus)}}})();CKEDITOR.keystrokeHandler=function(a){if(a.keystrokeHandler)return a.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:a};return this};\n(function(){var a,d=function(b){b=b.data;var d=b.getKeystroke(),g=this.keystrokes[d],l=this._.editor;a=!1===l.fire(\"key\",{keyCode:d,domEvent:b});a||(g&&(a=!1!==l.execCommand(g,{from:\"keystrokeHandler\"})),a||(a=!!this.blockedKeystrokes[d]));a&&b.preventDefault(!0);return!a},b=function(b){a&&(a=!1,b.data.preventDefault(!0))};CKEDITOR.keystrokeHandler.prototype={attach:function(a){a.on(\"keydown\",d,this);if(CKEDITOR.env.gecko&&CKEDITOR.env.mac)a.on(\"keypress\",b,this)}}})();\n(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,\"de-ch\":1,el:1,\"en-au\":1,\"en-ca\":1,\"en-gb\":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,\"fr-ca\":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,\"pt-br\":1,pt:1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,\"sr-latn\":1,sr:1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,\"zh-cn\":1,zh:1},rtl:{ar:1,fa:1,he:1,ku:1,ug:1},load:function(a,d,b){a&&CKEDITOR.lang.languages[a]||(a=\nthis.detect(d,a));var c=this;d=function(){c[a].dir=c.rtl[a]?\"rtl\":\"ltr\";b(a,c[a])};this[a]?d():CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(\"lang/\"+a+\".js\"),d,this)},detect:function(a,d){var b=this.languages;d=d||navigator.userLanguage||navigator.language||a;var c=d.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),e=c[1],c=c[2];b[e+\"-\"+c]?e=e+\"-\"+c:b[e]||(e=null);CKEDITOR.lang.detect=e?function(){return e}:function(a){return a};return e||a}}})();\nCKEDITOR.scriptLoader=function(){var a={},d={};return{load:function(b,c,e,g){var l=\"string\"==typeof b;l&&(b=[b]);e||(e=CKEDITOR);var k=b.length,n=[],w=[],f=function(a){c&&(l?c.call(e,a):c.call(e,n,w))};if(0===k)f(!0);else{var x=function(a,b){(b?n:w).push(a);0>=--k&&(g&&CKEDITOR.document.getDocumentElement().removeStyle(\"cursor\"),f(b))},A=function(b,c){a[b]=1;var e=d[b];delete d[b];for(var g=0;g<e.length;g++)e[g](b,c)},u=function(b){if(a[b])x(b,!0);else{var e=d[b]||(d[b]=[]);e.push(x);if(!(1<e.length)){var g=\nnew CKEDITOR.dom.element(\"script\");g.setAttributes({type:\"text/javascript\",src:b});c&&(CKEDITOR.env.ie&&11>CKEDITOR.env.version?g.$.onreadystatechange=function(){if(\"loaded\"==g.$.readyState||\"complete\"==g.$.readyState)g.$.onreadystatechange=null,A(b,!0)}:(g.$.onload=function(){setTimeout(function(){A(b,!0)},0)},g.$.onerror=function(){A(b,!1)}));g.appendTo(CKEDITOR.document.getHead())}}};g&&CKEDITOR.document.getDocumentElement().setStyle(\"cursor\",\"wait\");for(var B=0;B<k;B++)u(b[B])}},queue:function(){function a(){var b;\n(b=c[0])&&this.load(b.scriptUrl,b.callback,CKEDITOR,0)}var c=[];return function(d,g){var l=this;c.push({scriptUrl:d,callback:function(){g&&g.apply(this,arguments);c.shift();a.call(l)}});1==c.length&&a.call(this)}}()}}();CKEDITOR.resourceManager=function(a,d){this.basePath=a;this.fileName=d;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}};\nCKEDITOR.resourceManager.prototype={add:function(a,d){if(this.registered[a])throw Error('[CKEDITOR.resourceManager.add] The resource name \"'+a+'\" is already registered.');var b=this.registered[a]=d||{};b.name=a;b.path=this.getPath(a);CKEDITOR.fire(a+CKEDITOR.tools.capitalize(this.fileName)+\"Ready\",b);return this.get(a)},get:function(a){return this.registered[a]||null},getPath:function(a){var d=this.externals[a];return CKEDITOR.getUrl(d&&d.dir||this.basePath+a+\"/\")},getFilePath:function(a){var d=this.externals[a];\nreturn CKEDITOR.getUrl(this.getPath(a)+(d?d.file:this.fileName+\".js\"))},addExternal:function(a,d,b){a=a.split(\",\");for(var c=0;c<a.length;c++){var e=a[c];b||(d=d.replace(/[^\\/]+$/,function(a){b=a;return\"\"}));this.externals[e]={dir:d,file:b||this.fileName+\".js\"}}},load:function(a,d,b){CKEDITOR.tools.isArray(a)||(a=a?[a]:[]);for(var c=this.loaded,e=this.registered,g=[],l={},k={},n=0;n<a.length;n++){var w=a[n];if(w)if(c[w]||e[w])k[w]=this.get(w);else{var f=this.getFilePath(w);g.push(f);f in l||(l[f]=\n[]);l[f].push(w)}}CKEDITOR.scriptLoader.load(g,function(a,e){if(e.length)throw Error('[CKEDITOR.resourceManager.load] Resource name \"'+l[e[0]].join(\",\")+'\" was not found at \"'+e[0]+'\".');for(var g=0;g<a.length;g++)for(var f=l[a[g]],q=0;q<f.length;q++){var y=f[q];k[y]=this.get(y);c[y]=1}d.call(b,k)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager(\"plugins/\",\"plugin\");\nCKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(a){var d={};return function(b,c,e){var g={},l=function(b){a.call(this,b,function(a){CKEDITOR.tools.extend(g,a);var b=[],f;for(f in a){var k=a[f],A=k&&k.requires;if(!d[f]){if(k.icons)for(var u=k.icons.split(\",\"),B=u.length;B--;)CKEDITOR.skin.addIcon(u[B],k.path+\"icons/\"+(CKEDITOR.env.hidpi&&k.hidpi?\"hidpi/\":\"\")+u[B]+\".png\");d[f]=1}if(A)for(A.split&&(A=A.split(\",\")),k=0;k<A.length;k++)g[A[k]]||b.push(A[k])}if(b.length)l.call(this,\nb);else{for(f in g)k=g[f],k.onLoad&&!k.onLoad._called&&(!1===k.onLoad()&&delete g[f],k.onLoad._called=1);c&&c.call(e||window,g)}},this)};l.call(this,b)}});CKEDITOR.plugins.setLang=function(a,d,b){var c=this.get(a);a=c.langEntries||(c.langEntries={});c=c.lang||(c.lang=[]);c.split&&(c=c.split(\",\"));-1==CKEDITOR.tools.indexOf(c,d)&&c.push(d);a[d]=b};CKEDITOR.ui=function(a){if(a.ui)return a.ui;this.items={};this.instances={};this.editor=a;this._={handlers:{}};return this};\nCKEDITOR.ui.prototype={add:function(a,d,b){b.name=a.toLowerCase();var c=this.items[a]={type:d,command:b.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(c,b)},get:function(a){return this.instances[a]},create:function(a){var d=this.items[a],b=d&&this._.handlers[d.type],c=d&&d.command&&this.editor.getCommand(d.command),b=b&&b.create.apply(this,d.args);this.instances[a]=b;c&&c.uiItems.push(b);b&&!b.type&&(b.type=d.type);return b},addHandler:function(a,d){this._.handlers[a]=\nd},space:function(a){return CKEDITOR.document.getById(this.spaceId(a))},spaceId:function(a){return this.editor.id+\"_\"+a}};CKEDITOR.event.implementOn(CKEDITOR.ui);\n(function(){function a(a,e,f){CKEDITOR.event.call(this);a=a&&CKEDITOR.tools.clone(a);if(void 0!==e){if(!(e instanceof CKEDITOR.dom.element))throw Error(\"Expect element of type CKEDITOR.dom.element.\");if(!f)throw Error(\"One of the element modes must be specified.\");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&f==CKEDITOR.ELEMENT_MODE_INLINE)throw Error(\"Inline element mode is not supported on IE quirks.\");if(!b(e,f))throw Error('The specified element mode is not supported on element: \"'+e.getName()+'\".');\nthis.element=e;this.elementMode=f;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(e.getId()||e.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||d();this.id=CKEDITOR.tools.getNextId();this.status=\"unloaded\";this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this);this.focusManager=new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on(\"readOnly\",\nc);this.on(\"selectionChange\",function(a){g(this,a.data.path)});this.on(\"activeFilterChange\",function(){g(this,this.elementPath(),!0)});this.on(\"mode\",c);this.on(\"instanceReady\",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire(\"instanceCreated\",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){\"destroyed\"!==this.status?k(this,a):CKEDITOR.warn(\"editor-incorrect-destroy\")},0,this)}function d(){do var a=\"editor\"+ ++u;while(CKEDITOR.instances[a]);return a}function b(a,\nb){return b==CKEDITOR.ELEMENT_MODE_INLINE?a.is(CKEDITOR.dtd.$editable)||a.is(\"textarea\"):b==CKEDITOR.ELEMENT_MODE_REPLACE?!a.is(CKEDITOR.dtd.$nonBodyContent):1}function c(){var a=this.commands,b;for(b in a)e(this,a[b])}function e(a,b){b[b.startDisabled?\"disable\":a.readOnly&&!b.readOnly?\"disable\":b.modes[a.mode]?\"enable\":\"disable\"]()}function g(a,b,c){if(b){var d,e,h=a.commands;for(e in h)d=h[e],(c||d.contextSensitive)&&d.refresh(a,b)}}function l(a){var b=a.config.customConfig;if(!b)return!1;var b=\nCKEDITOR.getUrl(b),c=B[b]||(B[b]={});c.fn?(c.fn.call(a,a.config),CKEDITOR.getUrl(a.config.customConfig)!=b&&l(a)||a.fireOnce(\"customConfigLoaded\")):CKEDITOR.scriptLoader.queue(b,function(){c.fn=CKEDITOR.editorConfig?CKEDITOR.editorConfig:function(){};l(a)});return!0}function k(a,b){a.on(\"customConfigLoaded\",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,!0);delete a.config.on}c=a.config;a.readOnly=c.readOnly?!0:a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?\na.element.is(\"textarea\")?a.element.hasAttribute(\"disabled\")||a.element.hasAttribute(\"readonly\"):a.element.isReadOnly():a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?a.element.hasAttribute(\"disabled\")||a.element.hasAttribute(\"readonly\"):!1;a.blockless=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?!(a.element.is(\"textarea\")||CKEDITOR.dtd[a.element.getName()].p):!1;a.tabIndex=c.tabIndex||a.element&&a.element.getAttribute(\"tabindex\")||0;a.activeEnterMode=a.enterMode=a.blockless?CKEDITOR.ENTER_BR:c.enterMode;\na.activeShiftEnterMode=a.shiftEnterMode=a.blockless?CKEDITOR.ENTER_BR:c.shiftEnterMode;c.skin&&(CKEDITOR.skinName=c.skin);a.fireOnce(\"configLoaded\");a.dataProcessor=new CKEDITOR.htmlDataProcessor(a);a.filter=a.activeFilter=new CKEDITOR.filter(a);n(a)});b&&null!=b.customConfig&&(a.config.customConfig=b.customConfig);l(a)||a.fireOnce(\"customConfigLoaded\")}function n(a){CKEDITOR.skin.loadPart(\"editor\",function(){w(a)})}function w(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,\nc){var d=a.config.title;a.langCode=b;a.lang=CKEDITOR.tools.prototypedCopy(c);a.title=\"string\"==typeof d||!1===d?d:[a.lang.editor,a.name].join(\", \");a.config.contentsLangDirection||(a.config.contentsLangDirection=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir);a.fire(\"langLoaded\");f(a)})}function f(a){a.getStylesSet(function(b){a.once(\"loaded\",function(){a.fire(\"stylesSet\",{styles:b})},null,null,1);x(a)})}function x(a){var b=a.config,c=b.plugins,d=b.extraPlugins,e=\nb.removePlugins;if(d)var h=new RegExp(\"(?:^|,)(?:\"+d.replace(/\\s*,\\s*/g,\"|\")+\")(?\\x3d,|$)\",\"g\"),c=c.replace(h,\"\"),c=c+(\",\"+d);if(e)var p=new RegExp(\"(?:^|,)(?:\"+e.replace(/\\s*,\\s*/g,\"|\")+\")(?\\x3d,|$)\",\"g\"),c=c.replace(p,\"\");CKEDITOR.env.air&&(c+=\",adobeair\");CKEDITOR.plugins.load(c.split(\",\"),function(c){var d=[],h=[],e=[];a.plugins=c;for(var g in c){var f=c[g],z=f.lang,l=null,k=f.requires,v;CKEDITOR.tools.isArray(k)&&(k=k.join(\",\"));if(k&&(v=k.match(p)))for(;k=v.pop();)CKEDITOR.error(\"editor-plugin-required\",\n{plugin:k.replace(\",\",\"\"),requiredBy:g});z&&!a.lang[g]&&(z.split&&(z=z.split(\",\")),0<=CKEDITOR.tools.indexOf(z,a.langCode)?l=a.langCode:(l=a.langCode.replace(/-.*/,\"\"),l=l!=a.langCode&&0<=CKEDITOR.tools.indexOf(z,l)?l:0<=CKEDITOR.tools.indexOf(z,\"en\")?\"en\":z[0]),f.langEntries&&f.langEntries[l]?(a.lang[g]=f.langEntries[l],l=null):e.push(CKEDITOR.getUrl(f.path+\"lang/\"+l+\".js\")));h.push(l);d.push(f)}CKEDITOR.scriptLoader.load(e,function(){for(var c=[\"beforeInit\",\"init\",\"afterInit\"],e=0;e<c.length;e++)for(var p=\n0;p<d.length;p++){var m=d[p];0===e&&h[p]&&m.lang&&m.langEntries&&(a.lang[m.name]=m.langEntries[h[p]]);if(m[c[e]])m[c[e]](a)}a.fireOnce(\"pluginsLoaded\");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(p=0;p<a.config.blockedKeystrokes.length;p++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[p]]=1;a.status=\"loaded\";a.fireOnce(\"loaded\");CKEDITOR.fire(\"instanceLoaded\",null,a)})})}function A(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData();\nthis.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is(\"textarea\")?a.setValue(b):a.setHtml(b);return!0}return!1}a.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=a;var u=0,B={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){b.name=a.toLowerCase();var c=new CKEDITOR.command(this,b);this.mode&&e(this,c);return this.commands[a]=c},_attachToForm:function(){function a(b){c.updateElement();c._.required&&!d.getValue()&&!1===c.fire(\"required\")&&b.data.preventDefault()}\nfunction b(a){return!!(a&&a.call&&a.apply)}var c=this,d=c.element,e=new CKEDITOR.dom.element(d.$.form);d.is(\"textarea\")&&e&&(e.on(\"submit\",a),b(e.$.submit)&&(e.$.submit=CKEDITOR.tools.override(e.$.submit,function(b){return function(){a();b.apply?b.apply(this):b()}})),c.on(\"destroy\",function(){e.removeListener(\"submit\",a)}))},destroy:function(a){this.fire(\"beforeDestroy\");!a&&A.call(this);this.editable(null);this.filter&&(this.filter.destroy(),delete this.filter);delete this.activeFilter;this.status=\n\"destroyed\";this.fire(\"destroy\");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire(\"instanceDestroyed\",null,this)},elementPath:function(a){if(!a){a=this.getSelection();if(!a)return null;a=a.getStartElement()}return a?new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,commandData:b,command:c};return c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&\n!1!==this.fire(\"beforeCommandExec\",d)&&(d.returnValue=c.exec(d.commandData),!c.async&&!1!==this.fire(\"afterCommandExec\",d))?d.returnValue:!1},getCommand:function(a){return this.commands[a]},getData:function(a){!a&&this.fire(\"beforeGetData\");var b=this._.data;\"string\"!=typeof b&&(b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is(\"textarea\")?b.getValue():b.getHtml():\"\");b={dataValue:b};!a&&this.fire(\"getData\",b);return b.dataValue},getSnapshot:function(){var a=this.fire(\"getSnapshot\");\n\"string\"!=typeof a&&(a=(a=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?a.is(\"textarea\")?a.getValue():a.getHtml():\"\");return a},loadSnapshot:function(a){this.fire(\"loadSnapshot\",a)},setData:function(a,b,c){var d=!0,e=b;b&&\"object\"==typeof b&&(c=b.internal,e=b.callback,d=!b.noSnapshot);!c&&d&&this.fire(\"saveSnapshot\");if(e||!c)this.once(\"dataReady\",function(a){!c&&d&&this.fire(\"saveSnapshot\");e&&e.call(a.editor)});a={dataValue:a};!c&&this.fire(\"setData\",a);this._.data=a.dataValue;\n!c&&this.fire(\"afterSetData\",a)},setReadOnly:function(a){a=null==a||a;this.readOnly!=a&&(this.readOnly=a,this.keystrokeHandler.blockedKeystrokes[8]=+a,this.editable().setReadOnly(a),this.fire(\"readOnly\"))},insertHtml:function(a,b,c){this.fire(\"insertHtml\",{dataValue:a,mode:b,range:c})},insertText:function(a){this.fire(\"insertText\",a)},insertElement:function(a){this.fire(\"insertElement\",a)},getSelectedHtml:function(a){var b=this.editable(),c=this.getSelection(),c=c&&c.getRanges();if(!b||!c||0===c.length)return null;\nfor(var d=new CKEDITOR.dom.documentFragment,e,h,p,m=0;m<c.length;m++){var g=c[m],r=g.startContainer;r.getName&&\"tr\"==r.getName()?(e||(e=r.getAscendant(\"table\").clone(),e.append(r.getAscendant(\"tbody\").clone()),d.append(e),e=e.findOne(\"tbody\")),h&&h.equals(r)||(h=r,p=r.clone(),e.append(p)),p.append(g.cloneContents())):d.append(g.cloneContents())}b=e?d:b.getHtmlFromRange(c[0]);return a?b.getHtml():b},extractSelectedHtml:function(a,b){var c=this.editable(),d=this.getSelection().getRanges();if(!c||0===\nd.length)return null;d=d[0];c=c.extractHtmlFromRange(d,b);b||this.getSelection().selectRanges([d]);return a?c.getHtml():c},focus:function(){this.fire(\"beforeFocus\")},checkDirty:function(){return\"ready\"==this.status&&this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=this.getSnapshot()},updateElement:function(){return A.call(this)},setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,\n0)],c,d,e=b.length;e--;)c=b[e],d=0,CKEDITOR.tools.isArray(c)&&(d=c[1],c=c[0]),d?a[c]=d:delete a[c]},addFeature:function(a){return this.filter.addFeature(a)},setActiveFilter:function(a){a||(a=this.filter);this.activeFilter!==a&&(this.activeFilter=a,this.fire(\"activeFilterChange\"),a===this.filter?this.setActiveEnterMode(null,null):this.setActiveEnterMode(a.getAllowedEnterMode(this.enterMode),a.getAllowedEnterMode(this.shiftEnterMode,!0)))},setActiveEnterMode:function(a,b){a=a?this.blockless?CKEDITOR.ENTER_BR:\na:this.enterMode;b=b?this.blockless?CKEDITOR.ENTER_BR:b:this.shiftEnterMode;if(this.activeEnterMode!=a||this.activeShiftEnterMode!=b)this.activeEnterMode=a,this.activeShiftEnterMode=b,this.fire(\"activeEnterModeChange\")},showNotification:function(a){alert(a)}})})();CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3;CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:/<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)--\\x3e)|(?:([^\\/\\s>]+)((?:\\s+[\\w\\-:.]+(?:\\s*=\\s*?(?:(?:\"[^\"]*\")|(?:'[^']*')|[^\\s\"'\\/>]+))?)*)[\\S\\s]*?(\\/?)>))/g}};\n(function(){var a=/([\\w\\-:.]+)(?:(?:\\s*=\\s*(?:(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s>]+)))|(?=\\s|$))/g,d={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,e,g=0,l;c=this._.htmlPartsRegex.exec(b);){e=c.index;if(e>g)if(g=b.substring(g,e),l)l.push(g);else this.onText(g);\ng=this._.htmlPartsRegex.lastIndex;if(e=c[1])if(e=e.toLowerCase(),l&&CKEDITOR.dtd.$cdata[e]&&(this.onCDATA(l.join(\"\")),l=null),!l){this.onTagClose(e);continue}if(l)l.push(c[0]);else if(e=c[3]){if(e=e.toLowerCase(),!/=\"/.test(e)){var k={},n,w=c[4];c=!!c[5];if(w)for(;n=a.exec(w);){var f=n[1].toLowerCase();n=n[2]||n[3]||n[4]||\"\";k[f]=!n&&d[f]?f:CKEDITOR.tools.htmlDecodeAttr(n)}this.onTagOpen(e,k,c);!l&&CKEDITOR.dtd.$cdata[e]&&(l=[])}}else if(e=c[2])this.onComment(e)}if(b.length>g)this.onText(b.substring(g,\nb.length))}}})();\nCKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push(\"\\x3c\",a)},openTagClose:function(a,d){d?this._.output.push(\" /\\x3e\"):this._.output.push(\"\\x3e\")},attribute:function(a,d){\"string\"==typeof d&&(d=CKEDITOR.tools.htmlEncodeAttr(d));this._.output.push(\" \",a,'\\x3d\"',d,'\"')},closeTag:function(a){this._.output.push(\"\\x3c/\",a,\"\\x3e\")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push(\"\\x3c!--\",a,\n\"--\\x3e\")},write:function(a){this._.output.push(a)},reset:function(){this._.output=[];this._.indent=!1},getHtml:function(a){var d=this._.output.join(\"\");a&&this.reset();return d}}});\"use strict\";\n(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,d=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(d,1);this.parent=null},replaceWith:function(a){var d=this.parent.children,b=CKEDITOR.tools.indexOf(d,this),c=a.previous=this.previous,e=a.next=this.next;c&&(c.next=a);e&&(e.previous=a);d[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var d=a.parent.children,\nb=CKEDITOR.tools.indexOf(d,a),c=a.next;d.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var d=a.parent.children,b=CKEDITOR.tools.indexOf(d,a);d.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var d=\"function\"==typeof a?a:\"string\"==typeof a?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&&\nb.type==CKEDITOR.NODE_ELEMENT;){if(d(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();\"use strict\";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:!1}};\nCKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,d){var b=this.value;if(!(b=a.onComment(d,b,this)))return this.remove(),!1;if(\"string\"!=typeof b)return this.replaceWith(b),!1;this.value=b;return!0},writeHtml:function(a,d){d&&this.filter(d);a.comment(this.value)}});\"use strict\";\n(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:!1}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,d){if(!(this.value=a.onText(d,this.value,this)))return this.remove(),!1},writeHtml:function(a,d){d&&this.filter(d);a.text(this.value)}})})();\"use strict\";\n(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();\"use strict\";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:!0,hasInlineStarted:!1}};\n(function(){function a(a){return a.attributes[\"data-cke-survive\"]?!1:\"a\"==a.name&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var d=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1}),e={ul:\"li\",ol:\"li\",dl:\"dd\",table:\"tbody\",tbody:\"tr\",thead:\"tr\",tfoot:\"tr\",tr:\"td\"};CKEDITOR.htmlParser.fragment.fromHtml=\nfunction(g,l,k){function n(a){var b;if(0<y.length)for(var c=0;c<y.length;c++){var d=y[c],h=d.name,e=CKEDITOR.dtd[h],g=t.name&&CKEDITOR.dtd[t.name];g&&!g[h]||a&&e&&!e[a]&&CKEDITOR.dtd[a]?h==t.name&&(x(t,t.parent,1),c--):(b||(w(),b=1),d=d.clone(),d.parent=t,t=d,y.splice(c,1),c--)}}function w(){for(;F.length;)x(F.shift(),t)}function f(a){if(a._.isBlockLike&&\"pre\"!=a.name&&\"textarea\"!=a.name){var b=a.children.length,c=a.children[b-1],d;c&&c.type==CKEDITOR.NODE_TEXT&&((d=CKEDITOR.tools.rtrim(c.value))?\nc.value=d:a.children.length=b-1)}}function x(b,c,d){c=c||t||q;var e=t;void 0===b.previous&&(A(c,b)&&(t=c,B.onTagOpen(k,{}),b.returnPoint=c=t),f(b),a(b)&&!b.children.length||c.add(b),\"pre\"==b.name&&(h=!1),\"textarea\"==b.name&&(z=!1));b.returnPoint?(t=b.returnPoint,delete b.returnPoint):t=d?c:e}function A(a,b){if((a==q||\"body\"==a.name)&&k&&(!a.name||CKEDITOR.dtd[a.name][k])){var c,d;return(c=b.attributes&&(d=b.attributes[\"data-cke-real-element-type\"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&!(c in CKEDITOR.dtd.head)&&\n!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}}function u(a,b){return a in CKEDITOR.dtd.$listItem||a in CKEDITOR.dtd.$tableContent?a==b||\"dt\"==a&&\"dd\"==b||\"dd\"==a&&\"dt\"==b:!1}var B=new CKEDITOR.htmlParser,q=l instanceof CKEDITOR.htmlParser.element?l:\"string\"==typeof l?new CKEDITOR.htmlParser.element(l):new CKEDITOR.htmlParser.fragment,y=[],F=[],t=q,z=\"textarea\"==q.name,h=\"pre\"==q.name;B.onTagOpen=function(e,m,g,f){m=new CKEDITOR.htmlParser.element(e,m);m.isUnknown&&g&&(m.isEmpty=!0);m.isOptionalClose=f;\nif(a(m))y.push(m);else{if(\"pre\"==e)h=!0;else{if(\"br\"==e&&h){t.add(new CKEDITOR.htmlParser.text(\"\\n\"));return}\"textarea\"==e&&(z=!0)}if(\"br\"==e)F.push(m);else{for(;!(f=(g=t.name)?CKEDITOR.dtd[g]||(t._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c,m.isUnknown||t.isUnknown||f[e]);)if(t.isOptionalClose)B.onTagClose(g);else if(e in b&&g in b)g=t.children,(g=g[g.length-1])&&\"li\"==g.name||x(g=new CKEDITOR.htmlParser.element(\"li\"),t),!m.returnPoint&&(m.returnPoint=t),t=g;else if(e in CKEDITOR.dtd.$listItem&&\n!u(e,g))B.onTagOpen(\"li\"==e?\"ul\":\"dl\",{},0,1);else if(g in d&&!u(e,g))!m.returnPoint&&(m.returnPoint=t),t=t.parent;else if(g in CKEDITOR.dtd.$inline&&y.unshift(t),t.parent)x(t,t.parent,1);else{m.isOrphan=1;break}n(e);w();m.parent=t;m.isEmpty?x(m):t=m}}};B.onTagClose=function(a){for(var b=y.length-1;0<=b;b--)if(a==y[b].name){y.splice(b,1);return}for(var c=[],d=[],h=t;h!=q&&h.name!=a;)h._.isBlockLike||d.unshift(h),c.push(h),h=h.returnPoint||h.parent;if(h!=q){for(b=0;b<c.length;b++){var e=c[b];x(e,e.parent)}t=\nh;h._.isBlockLike&&w();x(h,h.parent);h==t&&(t=t.parent);y=y.concat(d)}\"body\"==a&&(k=!1)};B.onText=function(a){if(!(t._.hasInlineStarted&&!F.length||h||z)&&(a=CKEDITOR.tools.ltrim(a),0===a.length))return;var b=t.name,g=b?CKEDITOR.dtd[b]||(t._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!z&&!g[\"#\"]&&b in d)B.onTagOpen(e[b]||\"\"),B.onText(a);else{w();n();h||z||(a=a.replace(/[\\t\\r\\n ]{2,}|[\\t\\r\\n]/g,\" \"));a=new CKEDITOR.htmlParser.text(a);if(A(t,a))this.onTagOpen(k,{},0,1);t.add(a)}};B.onCDATA=\nfunction(a){t.add(new CKEDITOR.htmlParser.cdata(a))};B.onComment=function(a){w();n();t.add(new CKEDITOR.htmlParser.comment(a))};B.parse(g);for(w();t!=q;)x(t,t.parent,1);f(q);return q};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=0<b?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT&&(c.value=CKEDITOR.tools.rtrim(c.value),0===c.value.length)){this.children.pop();this.add(a);return}c.next=\na}a.previous=c;a.parent=this;this.children.splice(b,0,a);this._.hasInlineStarted||(this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike)},filter:function(a,b){b=this.getFilterContext(b);a.onRoot(b,this);this.filterChildren(a,!1,b)},filterChildren:function(a,b,c){if(this.childrenFilteredBy!=a.id){c=this.getFilterContext(c);if(b&&!this.parent)a.onRoot(c,this);this.childrenFilteredBy=a.id;for(b=0;b<this.children.length;b++)!1===this.children[b].filter(a,\nc)&&b--}},writeHtml:function(a,b){b&&this.filter(b);this.writeChildrenHtml(a)},writeChildrenHtml:function(a,b,c){var d=this.getFilterContext();if(c&&!this.parent&&b)b.onRoot(d,this);b&&this.filterChildren(b,!1,d);b=0;c=this.children;for(d=c.length;b<d;b++)c[b].writeHtml(a)},forEach:function(a,b,c){if(!(c||b&&this.type!=b))var d=a(this);if(!1!==d){c=this.children;for(var e=0;e<c.length;e++)d=c[e],d.type==CKEDITOR.NODE_ELEMENT?d.forEach(a,b):b&&d.type!=b||a(d)}},getFilterContext:function(a){return a||\n{}}}})();\"use strict\";\n(function(){function a(){this.rules=[]}function d(b,c,d,g){var l,k;for(l in c)(k=b[l])||(k=b[l]=new a),k.add(c[l],d,g)}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(b){this.id=CKEDITOR.tools.getNextNumber();this.elementNameRules=new a;this.attributeNameRules=new a;this.elementsRules={};this.attributesRules={};this.textRules=new a;this.commentRules=new a;this.rootRules=new a;b&&this.addRules(b,10)},proto:{addRules:function(a,c){var e;\"number\"==typeof c?e=c:c&&\"priority\"in c&&(e=\nc.priority);\"number\"!=typeof e&&(e=10);\"object\"!=typeof c&&(c={});a.elementNames&&this.elementNameRules.addMany(a.elementNames,e,c);a.attributeNames&&this.attributeNameRules.addMany(a.attributeNames,e,c);a.elements&&d(this.elementsRules,a.elements,e,c);a.attributes&&d(this.attributesRules,a.attributes,e,c);a.text&&this.textRules.add(a.text,e,c);a.comment&&this.commentRules.add(a.comment,e,c);a.root&&this.rootRules.add(a.root,e,c)},applyTo:function(a){a.filter(this)},onElementName:function(a,c){return this.elementNameRules.execOnName(a,\nc)},onAttributeName:function(a,c){return this.attributeNameRules.execOnName(a,c)},onText:function(a,c,d){return this.textRules.exec(a,c,d)},onComment:function(a,c,d){return this.commentRules.exec(a,c,d)},onRoot:function(a,c){return this.rootRules.exec(a,c)},onElement:function(a,c){for(var d=[this.elementsRules[\"^\"],this.elementsRules[c.name],this.elementsRules.$],g,l=0;3>l;l++)if(g=d[l]){g=g.exec(a,c,this);if(!1===g)return null;if(g&&g!=c)return this.onNode(a,g);if(c.parent&&!c.name)break}return c},\nonNode:function(a,c){var d=c.type;return d==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):d==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):d==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,d,g){return(d=this.attributesRules[d])?d.exec(a,g,c,this):g}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,d){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:d})},addMany:function(a,\nc,d){for(var g=[this.findIndex(c),0],l=0,k=a.length;l<k;l++)g.push({value:a[l],priority:c,options:d});this.rules.splice.apply(this.rules,g)},findIndex:function(a){for(var c=this.rules,d=c.length-1;0<=d&&a<c[d].priority;)d--;return d+1},exec:function(a,c){var d=c instanceof CKEDITOR.htmlParser.node||c instanceof CKEDITOR.htmlParser.fragment,g=Array.prototype.slice.call(arguments,1),l=this.rules,k=l.length,n,w,f,x;for(x=0;x<k;x++)if(d&&(n=c.type,w=c.name),f=l[x],!(a.nonEditable&&!f.options.applyToAll||\na.nestedEditable&&f.options.excludeNestedEditable)){f=f.value.apply(null,g);if(!1===f||d&&f&&(f.name!=w||f.type!=n))return f;null!=f&&(g[0]=c=f)}return c},execOnName:function(a,c){for(var d=0,g=this.rules,l=g.length,k;c&&d<l;d++)k=g[d],a.nonEditable&&!k.options.applyToAll||a.nestedEditable&&k.options.excludeNestedEditable||(c=c.replace(k.value[0],k.value[1]));return c}}})();\n(function(){function a(a,d){function m(a){return a||CKEDITOR.env.needsNbspFiller?new CKEDITOR.htmlParser.text(\" \"):new CKEDITOR.htmlParser.element(\"br\",{\"data-cke-bogus\":1})}function p(a,d){return function(h){if(h.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var e=[],p=b(h),r,v;if(p)for(f(p,1)&&e.push(p);p;)g(p)&&(r=c(p))&&f(r)&&((v=c(r))&&!g(v)?e.push(r):(m(z).insertAfter(r),r.remove())),p=p.previous;for(p=0;p<e.length;p++)e[p].remove();if(e=!a||!1!==(\"function\"==typeof d?d(h):d))z||CKEDITOR.env.needsBrFiller||\nh.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT?z||CKEDITOR.env.needsBrFiller||!(7<document.documentMode||h.name in CKEDITOR.dtd.tr||h.name in CKEDITOR.dtd.$listItem)?(e=b(h),e=!e||\"form\"==h.name&&\"input\"==e.name):e=!1:e=!1;e&&h.add(m(a))}}}function f(a,b){if((!z||CKEDITOR.env.needsBrFiller)&&a.type==CKEDITOR.NODE_ELEMENT&&\"br\"==a.name&&!a.attributes[\"data-cke-eol\"])return!0;var c;return a.type==CKEDITOR.NODE_TEXT&&(c=a.value.match(y))&&(c.index&&((new CKEDITOR.htmlParser.text(a.value.substring(0,c.index))).insertBefore(a),\na.value=c[0]),!CKEDITOR.env.needsBrFiller&&z&&(!b||a.parent.name in v)||!z&&((c=a.previous)&&\"br\"==c.name||!c||g(c)))?!0:!1}var r={elements:{}},z=\"html\"==d,v=CKEDITOR.tools.extend({},h),C;for(C in v)\"#\"in t[C]||delete v[C];for(C in v)r.elements[C]=p(z,a.config.fillEmptyBlocks);r.root=p(z,!1);r.elements.br=function(a){return function(b){if(b.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var d=b.attributes;if(\"data-cke-bogus\"in d||\"data-cke-eol\"in d)delete d[\"data-cke-bogus\"];else{for(d=b.next;d&&e(d);)d=\nd.next;var h=c(b);!d&&g(b.parent)?l(b.parent,m(a)):g(d)&&h&&!g(h)&&m(a).insertBefore(d)}}}}(z);return r}function d(a,b){return a!=CKEDITOR.ENTER_BR&&!1!==b?a==CKEDITOR.ENTER_DIV?\"div\":\"p\":!1}function b(a){for(a=a.children[a.children.length-1];a&&e(a);)a=a.previous;return a}function c(a){for(a=a.previous;a&&e(a);)a=a.previous;return a}function e(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&a.attributes[\"data-cke-bookmark\"]}function g(a){return a&&\n(a.type==CKEDITOR.NODE_ELEMENT&&a.name in h||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function l(a,b){var c=a.children[a.children.length-1];a.children.push(b);b.parent=a;c&&(c.next=b,b.previous=c)}function k(a){a=a.attributes;\"false\"!=a.contenteditable&&(a[\"data-cke-editable\"]=a.contenteditable?\"true\":1);a.contenteditable=\"false\"}function n(a){a=a.attributes;switch(a[\"data-cke-editable\"]){case \"true\":a.contenteditable=\"true\";break;case \"1\":delete a.contenteditable}}function w(a){return a.replace(G,\nfunction(a,b,c){return\"\\x3c\"+b+c.replace(H,function(a,b){return K.test(b)&&-1==c.indexOf(\"data-cke-saved-\"+b)?\" data-cke-saved-\"+a+\" data-cke-\"+CKEDITOR.rnd+\"-\"+a:a})+\"\\x3e\"})}function f(a,b){return a.replace(b,function(a,b,c){0===a.indexOf(\"\\x3ctextarea\")&&(a=b+u(c).replace(/</g,\"\\x26lt;\").replace(/>/g,\"\\x26gt;\")+\"\\x3c/textarea\\x3e\");return\"\\x3ccke:encoded\\x3e\"+encodeURIComponent(a)+\"\\x3c/cke:encoded\\x3e\"})}function x(a){return a.replace(Q,function(a,b){return decodeURIComponent(b)})}function A(a){return a.replace(/\\x3c!--(?!{cke_protected})[\\s\\S]+?--\\x3e/g,\nfunction(a){return\"\\x3c!--\"+F+\"{C}\"+encodeURIComponent(a).replace(/--/g,\"%2D%2D\")+\"--\\x3e\"})}function u(a){return a.replace(/\\x3c!--\\{cke_protected\\}\\{C\\}([\\s\\S]+?)--\\x3e/g,function(a,b){return decodeURIComponent(b)})}function B(a,b){var c=b._.dataStore;return a.replace(/\\x3c!--\\{cke_protected\\}([\\s\\S]+?)--\\x3e/g,function(a,b){return decodeURIComponent(b)}).replace(/\\{cke_protected_(\\d+)\\}/g,function(a,b){return c&&c[b]||\"\"})}function q(a,b){var c=[],d=b.config.protectedSource,h=b._.dataStore||(b._.dataStore=\n{id:1}),e=/<\\!--\\{cke_temp(comment)?\\}(\\d*?)--\\x3e/g,d=[/<script[\\s\\S]*?(<\\/script>|$)/gi,/<noscript[\\s\\S]*?<\\/noscript>/gi,/<meta[\\s\\S]*?\\/?>/gi].concat(d);a=a.replace(/\\x3c!--[\\s\\S]*?--\\x3e/g,function(a){return\"\\x3c!--{cke_tempcomment}\"+(c.push(a)-1)+\"--\\x3e\"});for(var p=0;p<d.length;p++)a=a.replace(d[p],function(a){a=a.replace(e,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:\"\\x3c!--{cke_temp}\"+(c.push(a)-1)+\"--\\x3e\"});a=a.replace(e,function(a,b,d){return\"\\x3c!--\"+F+(b?\"{C}\":\n\"\")+encodeURIComponent(c[d]).replace(/--/g,\"%2D%2D\")+\"--\\x3e\"});a=a.replace(/<\\w+(?:\\s+(?:(?:[^\\s=>]+\\s*=\\s*(?:[^'\"\\s>]+|'[^']*'|\"[^\"]*\"))|[^\\s=\\/>]+))+\\s*\\/?>/g,function(a){return a.replace(/\\x3c!--\\{cke_protected\\}([^>]*)--\\x3e/g,function(a,b){h[h.id]=decodeURIComponent(b);return\"{cke_protected_\"+h.id++ +\"}\"})});return a=a.replace(/<(title|iframe|textarea)([^>]*)>([\\s\\S]*?)<\\/\\1>/g,function(a,c,d,h){return\"\\x3c\"+c+d+\"\\x3e\"+B(u(h),b)+\"\\x3c/\"+c+\"\\x3e\"})}CKEDITOR.htmlDataProcessor=function(b){var c,\nh,e=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=h=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(p);c.addRules(m,{applyToAll:!0});c.addRules(a(b,\"data\"),{applyToAll:!0});h.addRules(C);h.addRules(r,{applyToAll:!0});h.addRules(a(b,\"html\"),{applyToAll:!0});b.on(\"toHtml\",function(a){a=a.data;var c=a.dataValue,h,c=q(c,b),c=f(c,M),c=w(c),c=f(c,R),c=c.replace(v,\"$1cke:$2\"),c=c.replace(I,\"\\x3ccke:$1$2\\x3e\\x3c/cke:$1\\x3e\"),\nc=c.replace(/(<pre\\b[^>]*>)(\\r\\n|\\n)/g,\"$1$2$2\"),c=c.replace(/([^a-z0-9<\\-])(on\\w{3,})(?!>)/gi,\"$1data-cke-\"+CKEDITOR.rnd+\"-$2\");h=a.context||b.editable().getName();var e;CKEDITOR.env.ie&&9>CKEDITOR.env.version&&\"pre\"==h&&(h=\"div\",c=\"\\x3cpre\\x3e\"+c+\"\\x3c/pre\\x3e\",e=1);h=b.document.createElement(h);h.setHtml(\"a\"+c);c=h.getHtml().substr(1);c=c.replace(new RegExp(\"data-cke-\"+CKEDITOR.rnd+\"-\",\"ig\"),\"\");e&&(c=c.replace(/^<pre>|<\\/pre>$/gi,\"\"));c=c.replace(D,\"$1$2\");c=x(c);c=u(c);h=!1===a.fixForBody?!1:\nd(a.enterMode,b.config.autoParagraph);c=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,h);h&&(e=c,!e.children.length&&CKEDITOR.dtd[e.name][h]&&(h=new CKEDITOR.htmlParser.element(h),e.add(h)));a.dataValue=c},null,null,5);b.on(\"toHtml\",function(a){a.data.filter.applyTo(a.data.dataValue,!0,a.data.dontFilter,a.data.enterMode)&&b.fire(\"dataFiltered\")},null,null,6);b.on(\"toHtml\",function(a){a.data.dataValue.filterChildren(e.dataFilter,!0)},null,null,10);b.on(\"toHtml\",function(a){a=a.data;var b=a.dataValue,\nc=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(!0);a.dataValue=A(b)},null,null,15);b.on(\"toDataFormat\",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^<br *\\/?>/i,\"\"));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,d(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on(\"toDataFormat\",function(a){a.data.dataValue.filterChildren(e.htmlFilter,!0)},null,null,10);b.on(\"toDataFormat\",function(a){a.data.filter.applyTo(a.data.dataValue,\n!1,!0)},null,null,11);b.on(\"toDataFormat\",function(a){var c=a.data.dataValue,d=e.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(!0);c=u(c);c=B(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var h=this.editor,e,p,m,g;b&&\"object\"==typeof b?(e=b.context,c=b.fixForBody,d=b.dontFilter,p=b.filter,m=b.enterMode,g=b.protectedWhitespaces):e=b;e||null===e||(e=h.editable().getName());return h.fire(\"toHtml\",{dataValue:a,context:e,fixForBody:c,dontFilter:d,\nfilter:p||h.filter,enterMode:m||h.enterMode,protectedWhitespaces:g}).dataValue},toDataFormat:function(a,b){var c,d,h;b&&(c=b.context,d=b.filter,h=b.enterMode);c||null===c||(c=this.editor.editable().getName());return this.editor.fire(\"toDataFormat\",{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:h||this.editor.enterMode}).dataValue}};var y=/(?:&nbsp;|\\xa0)$/,F=\"{cke_protected}\",t=CKEDITOR.dtd,z=\"caption colgroup col thead tfoot tbody\".split(\" \"),h=CKEDITOR.tools.extend({},t.$blockLimit,\nt.$block),p={elements:{input:k,textarea:k}},m={attributeNames:[[/^on/,\"data-cke-pa-on\"],[/^data-cke-expando$/,\"\"]]},C={elements:{embed:function(a){var b=a.parent;if(b&&\"object\"==b.name){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},a:function(a){var b=a.attributes;if(!(a.children.length||b.name||b.id||a.attributes[\"data-cke-saved-name\"]))return!1}}},r={elementNames:[[/^cke:/,\"\"],[/^\\?xml:namespace$/,\"\"]],attributeNames:[[/^data-cke-(saved|pa)-/,\n\"\"],[/^data-cke-.*/,\"\"],[\"hidefocus\",\"\"]],elements:{$:function(a){var b=a.attributes;if(b){if(b[\"data-cke-temp\"])return!1;for(var c=[\"name\",\"href\",\"src\"],d,h=0;h<c.length;h++)d=\"data-cke-saved-\"+c[h],d in b&&delete b[c[h]]}return a},table:function(a){a.children.slice(0).sort(function(a,b){var c,d;a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type&&(c=CKEDITOR.tools.indexOf(z,a.name),d=CKEDITOR.tools.indexOf(z,b.name));-1<c&&-1<d&&c!=d||(c=a.parent?a.getIndex():-1,d=b.parent?b.getIndex():-1);return c>d?\n1:-1})},param:function(a){a.children=[];a.isEmpty=!0;return a},span:function(a){\"Apple-style-span\"==a.attributes[\"class\"]&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes[\"class\"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));a.attributes.type||(a.attributes.type=\"text/css\")},title:function(a){var b=a.children[0];!b&&l(a,b=new CKEDITOR.htmlParser.text);\nb.value=a.attributes[\"data-cke-title\"]||\"\"},input:n,textarea:n},attributes:{\"class\":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\\s+)cke_[^\\s]*/g,\"\"))||!1}}};CKEDITOR.env.ie&&(r.attributes.style=function(a){return a.replace(/(^|;)([^\\:]+)/g,function(a){return a.toLowerCase()})});var G=/<(a|area|img|input|source)\\b([^>]*)>/gi,H=/([\\w-:]+)\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|(?:[^ \"'>]+))/gi,K=/^(href|src|name)$/i,R=/(?:<style(?=[ >])[^>]*>[\\s\\S]*?<\\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,\nM=/(<textarea(?=[ >])[^>]*>)([\\s\\S]*?)(?:<\\/textarea>)/gi,Q=/<cke:encoded>([^<]*)<\\/cke:encoded>/gi,v=/(<\\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,D=/(<\\/?)cke:((?:html|body|head|title)[^>]*>)/gi,I=/<cke:(param|embed)([^>]*?)\\/?>(?!\\s*<\\/cke:\\1)/gi})();\"use strict\";\nCKEDITOR.htmlParser.element=function(a,d){this.name=a;this.attributes=d||{};this.children=[];var b=a||\"\",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!!(CKEDITOR.dtd.$nonBodyContent[b]||CKEDITOR.dtd.$block[b]||CKEDITOR.dtd.$listItem[b]||CKEDITOR.dtd.$tableContent[b]||CKEDITOR.dtd.$nonEditable[b]||\"br\"==b);this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}};\nCKEDITOR.htmlParser.cssStyle=function(a){var d={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||\"\").replace(/&quot;/g,'\"').replace(/\\s*([^ :;]+)\\s*:\\s*([^;]+)\\s*(?=;|$)/g,function(a,c,e){\"font-family\"==c&&(e=e.replace(/[\"']/g,\"\"));d[c.toLowerCase()]=e});return{rules:d,populate:function(a){var c=this.toString();c&&(a instanceof CKEDITOR.dom.element?a.setAttribute(\"style\",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c)},toString:function(){var a=[],c;\nfor(c in d)d[c]&&a.push(c,\":\",d[c],\";\");return a.join(\"\")}}};\n(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&(\"string\"==typeof a?b.name==a:b.name in a)}}var d=function(a,b){a=a[0];b=b[0];return a<b?-1:a>b?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var d=this,l,k;b=d.getFilterContext(b);if(b.off)return!0;\nif(!d.parent)a.onRoot(b,d);for(;;){l=d.name;if(!(k=a.onElementName(b,l)))return this.remove(),!1;d.name=k;if(!(d=a.onElement(b,d)))return this.remove(),!1;if(d!==this)return this.replaceWith(d),!1;if(d.name==l)break;if(d.type!=CKEDITOR.NODE_ELEMENT)return this.replaceWith(d),!1;if(!d.name)return this.replaceWithChildren(),!1}l=d.attributes;var n,w;for(n in l){for(k=l[n];;)if(w=a.onAttributeName(b,n))if(w!=n)delete l[n],n=w;else break;else{delete l[n];break}w&&(!1===(k=a.onAttribute(b,d,w,k))?delete l[w]:\nl[w]=k)}d.isEmpty||this.filterChildren(a,!1,b);return!0},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var g=this.name,l=[],k=this.attributes,n,w;a.openTag(g,k);for(n in k)l.push([n,k[n]]);a.sortAttributes&&l.sort(d);n=0;for(w=l.length;n<w;n++)k=l[n],a.attribute(k[0],k[1]);a.openTagClose(g,this.isEmpty);this.writeChildrenHtml(a);this.isEmpty||a.closeTag(g)},writeChildrenHtml:b.writeChildrenHtml,replaceWithChildren:function(){for(var a=this.children,b=a.length;b;)a[--b].insertAfter(this);\nthis.remove()},forEach:b.forEach,getFirst:function(b){if(!b)return this.children.length?this.children[0]:null;\"function\"!=typeof b&&(b=a(b));for(var d=0,g=this.children.length;d<g;++d)if(b(this.children[d]))return this.children[d];return null},getHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml(a);return a.getHtml()},setHtml:function(a){a=this.children=CKEDITOR.htmlParser.fragment.fromHtml(a).children;for(var b=0,d=a.length;b<d;++b)a[b].parent=this},getOuterHtml:function(){var a=\nnew CKEDITOR.htmlParser.basicWriter;this.writeHtml(a);return a.getHtml()},split:function(a){for(var b=this.children.splice(a,this.children.length-a),d=this.clone(),l=0;l<b.length;++l)b[l].parent=d;d.children=b;b[0]&&(b[0].previous=null);0<a&&(this.children[a-1].next=null);this.parent.add(d,this.getIndex()+1);return d},addClass:function(a){if(!this.hasClass(a)){var b=this.attributes[\"class\"]||\"\";this.attributes[\"class\"]=b+(b?\" \":\"\")+a}},removeClass:function(a){var b=this.attributes[\"class\"];b&&((b=\nCKEDITOR.tools.trim(b.replace(new RegExp(\"(?:\\\\s+|^)\"+a+\"(?:\\\\s+|$)\"),\" \")))?this.attributes[\"class\"]=b:delete this.attributes[\"class\"])},hasClass:function(a){var b=this.attributes[\"class\"];return b?(new RegExp(\"(?:^|\\\\s)\"+a+\"(?\\x3d\\\\s|$)\")).test(b):!1},getFilterContext:function(a){var b=[];a||(a={off:!1,nonEditable:!1,nestedEditable:!1});a.off||\"off\"!=this.attributes[\"data-cke-processor\"]||b.push(\"off\",!0);a.nonEditable||\"false\"!=this.attributes.contenteditable?a.nonEditable&&!a.nestedEditable&&\n\"true\"==this.attributes.contenteditable&&b.push(\"nestedEditable\",!0):b.push(\"nonEditable\",!0);if(b.length){a=CKEDITOR.tools.copy(a);for(var d=0;d<b.length;d+=2)a[b[d]]=b[d+1]}return a}},!0)})();\n(function(){var a={},d=/{([^}]+)}/g,b=/([\\\\'])/g,c=/\\n/g,e=/\\r/g;CKEDITOR.template=function(g){if(a[g])this.output=a[g];else{var l=g.replace(b,\"\\\\$1\").replace(c,\"\\\\n\").replace(e,\"\\\\r\").replace(d,function(a,b){return\"',data['\"+b+\"']\\x3d\\x3dundefined?'{\"+b+\"}':data['\"+b+\"'],'\"});this.output=a[g]=Function(\"data\",\"buffer\",\"return buffer?buffer.push('\"+l+\"'):['\"+l+\"'].join('');\")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document);\nCKEDITOR.add=function(a){CKEDITOR.instances[a.name]=a;a.on(\"focus\",function(){CKEDITOR.currentInstance!=a&&(CKEDITOR.currentInstance=a,CKEDITOR.fire(\"currentInstance\"))});a.on(\"blur\",function(){CKEDITOR.currentInstance==a&&(CKEDITOR.currentInstance=null,CKEDITOR.fire(\"currentInstance\"))});CKEDITOR.fire(\"instance\",null,a)};CKEDITOR.remove=function(a){delete CKEDITOR.instances[a.name]};\n(function(){var a={};CKEDITOR.addTemplate=function(d,b){var c=a[d];if(c)return c;c={name:d,source:b};CKEDITOR.fire(\"template\",c);return a[d]=new CKEDITOR.template(c.source)};CKEDITOR.getTemplate=function(d){return a[d]}})();(function(){var a=[];CKEDITOR.addCss=function(d){a.push(d)};CKEDITOR.getCss=function(){return a.join(\"\\n\")}})();CKEDITOR.on(\"instanceDestroyed\",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire(\"reset\")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2;\nCKEDITOR.TRISTATE_DISABLED=0;\n(function(){CKEDITOR.inline=function(a,d){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance \"'+a.getEditor().name+'\" is already attached to the provided element.';var b=new CKEDITOR.editor(d,a,CKEDITOR.ELEMENT_MODE_INLINE),c=a.is(\"textarea\")?a:null;c?(b.setData(c.getValue(),null,!0),a=CKEDITOR.dom.element.createFromHtml('\\x3cdiv contenteditable\\x3d\"'+!!b.readOnly+'\" class\\x3d\"cke_textarea_inline\"\\x3e'+c.getValue()+\"\\x3c/div\\x3e\",CKEDITOR.document),\na.insertAfter(c),c.hide(),c.$.form&&b._attachToForm()):b.setData(a.getHtml(),null,!0);b.on(\"loaded\",function(){b.fire(\"uiReady\");b.editable(a);b.container=a;b.ui.contentsElement=a;b.setData(b.getData(1));b.resetDirty();b.fire(\"contentDom\");b.mode=\"wysiwyg\";b.fire(\"mode\");b.status=\"ready\";b.fireOnce(\"instanceReady\");CKEDITOR.fire(\"instanceReady\",null,b)},null,null,1E4);b.on(\"destroy\",function(){c&&(b.container.clearCustomData(),b.container.remove(),c.show());b.element.clearCustomData();delete b.element});\nreturn b};CKEDITOR.inlineAll=function(){var a,d,b;for(b in CKEDITOR.dtd.$editable)for(var c=CKEDITOR.document.getElementsByTag(b),e=0,g=c.count();e<g;e++)a=c.getItem(e),\"true\"==a.getAttribute(\"contenteditable\")&&(d={element:a,config:{}},!1!==CKEDITOR.fire(\"inline\",d)&&CKEDITOR.inline(a,d.config))};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&CKEDITOR.inlineAll()})})();CKEDITOR.replaceClass=\"ckeditor\";\n(function(){function a(a,e,g,l){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance \"'+a.getEditor().name+'\" is already attached to the provided element.';var k=new CKEDITOR.editor(e,a,l);l==CKEDITOR.ELEMENT_MODE_REPLACE&&(a.setStyle(\"visibility\",\"hidden\"),k._.required=a.hasAttribute(\"required\"),a.removeAttribute(\"required\"));g&&k.setData(g,null,!0);k.on(\"loaded\",function(){b(k);l==CKEDITOR.ELEMENT_MODE_REPLACE&&k.config.autoUpdateElement&&\na.$.form&&k._attachToForm();k.setMode(k.config.startupMode,function(){k.resetDirty();k.status=\"ready\";k.fireOnce(\"instanceReady\");CKEDITOR.fire(\"instanceReady\",null,k)})});k.on(\"destroy\",d);return k}function d(){var a=this.container,b=this.element;a&&(a.clearCustomData(),a.remove());b&&(b.clearCustomData(),this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(b.show(),this._.required&&b.setAttribute(\"required\",\"required\")),delete this.element)}function b(a){var b=a.name,d=a.element,l=a.elementMode,k=\na.fire(\"uiSpace\",{space:\"top\",html:\"\"}).html,n=a.fire(\"uiSpace\",{space:\"bottom\",html:\"\"}).html,w=new CKEDITOR.template('\\x3c{outerEl} id\\x3d\"cke_{name}\" class\\x3d\"{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+CKEDITOR.env.cssClass+'\"  dir\\x3d\"{langDir}\" lang\\x3d\"{langCode}\" role\\x3d\"application\"'+(a.title?' aria-labelledby\\x3d\"cke_{name}_arialbl\"':\"\")+\"\\x3e\"+(a.title?'\\x3cspan id\\x3d\"cke_{name}_arialbl\" class\\x3d\"cke_voice_label\"\\x3e{voiceLabel}\\x3c/span\\x3e':\"\")+'\\x3c{outerEl} class\\x3d\"cke_inner cke_reset\" role\\x3d\"presentation\"\\x3e{topHtml}\\x3c{outerEl} id\\x3d\"{contentId}\" class\\x3d\"cke_contents cke_reset\" role\\x3d\"presentation\"\\x3e\\x3c/{outerEl}\\x3e{bottomHtml}\\x3c/{outerEl}\\x3e\\x3c/{outerEl}\\x3e'),\nb=CKEDITOR.dom.element.createFromHtml(w.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:a.title,topHtml:k?'\\x3cspan id\\x3d\"'+a.ui.spaceId(\"top\")+'\" class\\x3d\"cke_top cke_reset_all\" role\\x3d\"presentation\" style\\x3d\"height:auto\"\\x3e'+k+\"\\x3c/span\\x3e\":\"\",contentId:a.ui.spaceId(\"contents\"),bottomHtml:n?'\\x3cspan id\\x3d\"'+a.ui.spaceId(\"bottom\")+'\" class\\x3d\"cke_bottom cke_reset_all\" role\\x3d\"presentation\"\\x3e'+n+\"\\x3c/span\\x3e\":\"\",outerEl:CKEDITOR.env.ie?\"span\":\"div\"}));l==CKEDITOR.ELEMENT_MODE_REPLACE?\n(d.hide(),b.insertAfter(d)):d.append(b);a.container=b;a.ui.contentsElement=a.ui.space(\"contents\");k&&a.ui.space(\"top\").unselectable();n&&a.ui.space(\"bottom\").unselectable();d=a.config.width;l=a.config.height;d&&b.setStyle(\"width\",CKEDITOR.tools.cssLength(d));l&&a.ui.space(\"contents\").setStyle(\"height\",CKEDITOR.tools.cssLength(l));b.disableContextMenu();CKEDITOR.env.webkit&&b.on(\"focus\",function(){a.focus()});a.fireOnce(\"uiReady\")}CKEDITOR.replace=function(b,d){return a(b,d,null,CKEDITOR.ELEMENT_MODE_REPLACE)};\nCKEDITOR.appendTo=function(b,d,g){return a(b,d,g,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName(\"textarea\"),b=0;b<a.length;b++){var d=null,l=a[b];if(l.name||l.id){if(\"string\"==typeof arguments[0]){if(!(new RegExp(\"(?:^|\\\\s)\"+arguments[0]+\"(?:$|\\\\s)\")).test(l.className))continue}else if(\"function\"==typeof arguments[0]&&(d={},!1===arguments[0](l,d)))continue;this.replace(l,d)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes=\n{}))[a]=b};CKEDITOR.editor.prototype.setMode=function(a,b){var d=this,l=this._.modes;if(a!=d.mode&&l&&l[a]){d.fire(\"beforeSetMode\",a);if(d.mode){var k=d.checkDirty(),l=d._.previousModeData,n,w=0;d.fire(\"beforeModeUnload\");d.editable(0);d._.previousMode=d.mode;d._.previousModeData=n=d.getData(1);\"source\"==d.mode&&l==n&&(d.fire(\"lockSnapshot\",{forceUpdate:!0}),w=1);d.ui.space(\"contents\").setHtml(\"\");d.mode=\"\"}else d._.previousModeData=d.getData(1);this._.modes[a](function(){d.mode=a;void 0!==k&&!k&&\nd.resetDirty();w?d.fire(\"unlockSnapshot\"):\"wysiwyg\"==a&&d.fire(\"saveSnapshot\");setTimeout(function(){d.fire(\"mode\");b&&b.call(d)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,d,l){var k=this.container,n=this.ui.space(\"contents\"),w=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement;l=l?this.container.getFirst(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasClass(\"cke_inner\")}):k;l.setSize(\"width\",a,!0);w&&(w.style.width=\"1%\");var f=(l.$.offsetHeight||0)-(n.$.clientHeight||\n0),k=Math.max(b-(d?0:f),0);b=d?b+f:b;n.setStyle(\"height\",k+\"px\");w&&(w.style.width=\"100%\");this.fire(\"resize\",{outerHeight:b,contentsHeight:k,outerWidth:a||l.getSize(\"width\")})};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space(\"contents\"):this.container};CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode=\"wysiwyg\";\n(function(){function a(a){var b=a.editor,e=a.data.path,m=e.blockLimit,f=a.data.selection,r=f.getRanges()[0],g;if(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)if(f=d(f,e))f.appendBogus(),g=CKEDITOR.env.ie;l(b,e.block,m)&&r.collapsed&&!r.getCommonAncestor().isReadOnly()&&(e=r.clone(),e.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS),m=new CKEDITOR.dom.walker(e),m.guard=function(a){return!c(a)||a.type==CKEDITOR.NODE_COMMENT||a.isReadOnly()},!m.checkForward()||e.checkStartOfBlock()&&e.checkEndOfBlock())&&\n(b=r.fixBlock(!0,b.activeEnterMode==CKEDITOR.ENTER_DIV?\"div\":\"p\"),CKEDITOR.env.needsBrFiller||(b=b.getFirst(c))&&b.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(b.getText()).match(/^(?:&nbsp;|\\xa0)$/)&&b.remove(),g=1,a.cancel());g&&r.select()}function d(a,b){if(a.isFake)return 0;var d=b.block||b.blockLimit,e=d&&d.getLast(c);if(!(!d||!d.isBlockBoundary()||e&&e.type==CKEDITOR.NODE_ELEMENT&&e.isBlockBoundary()||d.is(\"pre\")||d.getBogus()))return d}function b(a){var b=a.data.getTarget();b.is(\"input\")&&\n(b=b.getAttribute(\"type\"),\"submit\"!=b&&\"reset\"!=b||a.data.preventDefault())}function c(a){return f(a)&&x(a)}function e(a,b){return function(c){var d=c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget;(d=d&&d.nodeType==CKEDITOR.NODE_ELEMENT?new CKEDITOR.dom.element(d):null)&&(b.equals(d)||b.contains(d))||a.call(this,c)}}function g(a){function b(a){return function(b,h){h&&b.type==CKEDITOR.NODE_ELEMENT&&b.is(f)&&(d=b);if(!(h||!c(b)||a&&u(b)))return!1}}var d,e=a.getRanges()[0];a=a.root;\nvar f={table:1,ul:1,ol:1,dl:1};if(e.startPath().contains(f)){var r=e.clone();r.collapse(1);r.setStartAt(a,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(r);a.guard=b();a.checkBackward();if(d)return r=e.clone(),r.collapse(),r.setEndAt(d,CKEDITOR.POSITION_AFTER_END),a=new CKEDITOR.dom.walker(r),a.guard=b(!0),d=!1,a.checkForward(),d}return null}function l(a,b,c){return!1!==a.config.autoParagraph&&a.activeEnterMode!=CKEDITOR.ENTER_BR&&(a.editable().equals(c)&&!b||b&&\"true\"==b.getAttribute(\"contenteditable\"))}\nfunction k(a){return a.activeEnterMode!=CKEDITOR.ENTER_BR&&!1!==a.config.autoParagraph?a.activeEnterMode==CKEDITOR.ENTER_DIV?\"div\":\"p\":!1}function n(a){var b=a.editor;b.getSelection().scrollIntoView();setTimeout(function(){b.fire(\"saveSnapshot\")},0)}function w(a,b,c){var d=a.getCommonAncestor(b);for(b=a=c?b:a;(a=a.getParent())&&!d.equals(a)&&1==a.getChildCount();)b=a;b.remove()}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,$:function(a,b){this.base(b.$||b);this.editor=a;\nthis.status=\"unloaded\";this.hasFocus=!1;this.setup()},proto:{focus:function(){var a;if(CKEDITOR.env.webkit&&!this.hasFocus&&(a=this.editor._.previousActive||this.getDocument().getActive(),this.contains(a))){a.focus();return}try{this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?\"setActive\":\"focus\"]()}catch(b){if(!CKEDITOR.env.ie)throw b;}CKEDITOR.env.safari&&!this.isInline()&&(a=CKEDITOR.document.getActive(),a.equals(this.getWindow().getFrame())||this.getWindow().focus())},on:function(a,\nb){var c=Array.prototype.slice.call(arguments,0);CKEDITOR.env.ie&&/^focus|blur$/.exec(a)&&(a=\"focus\"==a?\"focusin\":\"focusout\",b=e(b,this),c[0]=a,c[1]=b);return CKEDITOR.dom.element.prototype.on.apply(this,c)},attachListener:function(a){!this._.listeners&&(this._.listeners=[]);var b=Array.prototype.slice.call(arguments,1),b=a.on.apply(a,b);this._.listeners.push(b);return b},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=\nthis._.attrChanges,b,c;for(c in a)a.hasOwnProperty(c)&&(b=a[c],null!==b?this.setAttribute(c,b):this.removeAttribute(c))},attachClass:function(a){var b=this.getCustomData(\"classes\");this.hasClass(a)||(!b&&(b=[]),b.push(a),this.setCustomData(\"classes\",b),this.addClass(a))},changeAttr:function(a,b){var c=this.getAttribute(a);b!==c&&(!this._.attrChanges&&(this._.attrChanges={}),a in this._.attrChanges||(this._.attrChanges[a]=c),this.setAttribute(a,b))},insertText:function(a){this.editor.focus();this.insertHtml(this.transformPlainTextToHtml(a),\n\"text\")},transformPlainTextToHtml:function(a){var b=this.editor.getSelection().getStartElement().hasAscendant(\"pre\",!0)?CKEDITOR.ENTER_BR:this.editor.activeEnterMode;return CKEDITOR.tools.transformPlainTextToHtml(a,b)},insertHtml:function(a,b,c){var d=this.editor;d.focus();d.fire(\"saveSnapshot\");c||(c=d.getSelection().getRanges()[0]);q(this,b||\"html\",a,c);c.select();n(this);this.editor.fire(\"afterInsertHtml\",{})},insertHtmlIntoRange:function(a,b,c){q(this,c||\"html\",a,b);this.editor.fire(\"afterInsertHtml\",\n{intoRange:b})},insertElement:function(a,b){var d=this.editor;d.focus();d.fire(\"saveSnapshot\");var e=d.activeEnterMode,d=d.getSelection(),f=a.getName(),f=CKEDITOR.dtd.$block[f];b||(b=d.getRanges()[0]);this.insertElementIntoRange(a,b)&&(b.moveToPosition(a,CKEDITOR.POSITION_AFTER_END),f&&((f=a.getNext(function(a){return c(a)&&!u(a)}))&&f.type==CKEDITOR.NODE_ELEMENT&&f.is(CKEDITOR.dtd.$block)?f.getDtd()[\"#\"]?b.moveToElementEditStart(f):b.moveToElementEditEnd(a):f||e==CKEDITOR.ENTER_BR||(f=b.fixBlock(!0,\ne==CKEDITOR.ENTER_DIV?\"div\":\"p\"),b.moveToElementEditStart(f))));d.selectRanges([b]);n(this)},insertElementIntoSelection:function(a){this.insertElement(a)},insertElementIntoRange:function(a,b){var c=this.editor,d=c.config.enterMode,e=a.getName(),f=CKEDITOR.dtd.$block[e];if(b.checkReadOnly())return!1;b.deleteContents(1);b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.is({tr:1,table:1,tbody:1,thead:1,tfoot:1})&&y(b);var g,l;if(f)for(;(g=b.getCommonAncestor(0,1))&&(l=CKEDITOR.dtd[g.getName()])&&\n(!l||!l[e]);)g.getName()in CKEDITOR.dtd.span?b.splitElement(g):b.checkStartOfBlock()&&b.checkEndOfBlock()?(b.setStartBefore(g),b.collapse(!0),g.remove()):b.splitBlock(d==CKEDITOR.ENTER_DIV?\"div\":\"p\",c.editable());b.insertNode(a);return!0},setData:function(a,b){b||(a=this.editor.dataProcessor.toHtml(a));this.setHtml(a);this.fixInitialSelection();\"unloaded\"==this.status&&(this.status=\"ready\");this.editor.fire(\"dataReady\")},getData:function(a){var b=this.getHtml();a||(b=this.editor.dataProcessor.toDataFormat(b));\nreturn b},setReadOnly:function(a){this.setAttribute(\"contenteditable\",!a)},detach:function(){this.removeClass(\"cke_editable\");this.status=\"detached\";var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},fixInitialSelection:function(){function a(){var b=c.getDocument().$,d=b.getSelection(),h;a:if(d.anchorNode&&d.anchorNode==c.$)h=!0;else{if(CKEDITOR.env.webkit&&(h=c.getDocument().getActive())&&h.equals(c)&&!d.anchorNode){h=\n!0;break a}h=void 0}h&&(h=new CKEDITOR.dom.range(c),h.moveToElementEditStart(c),b=b.createRange(),b.setStart(h.startContainer.$,h.startOffset),b.collapse(!0),d.removeAllRanges(),d.addRange(b))}function b(){var a=c.getDocument().$,d=a.selection,h=c.getDocument().getActive();\"None\"==d.type&&h.equals(c)&&(d=new CKEDITOR.dom.range(c),a=a.body.createTextRange(),d.moveToElementEditStart(c),d=d.startContainer,d.type!=CKEDITOR.NODE_ELEMENT&&(d=d.getParent()),a.moveToElementText(d.$),a.collapse(!0),a.select())}\nvar c=this;if(CKEDITOR.env.ie&&(9>CKEDITOR.env.version||CKEDITOR.env.quirks))this.hasFocus&&(this.focus(),b());else if(this.hasFocus)this.focus(),a();else this.once(\"focus\",function(){a()},null,null,-999)},getHtmlFromRange:function(a){if(a.collapsed)return new CKEDITOR.dom.documentFragment(a.document);a={doc:this.getDocument(),range:a.clone()};F.eol.detect(a,this);F.bogus.exclude(a);F.cell.shrink(a);a.fragment=a.range.cloneContents();F.tree.rebuild(a,this);F.eol.fix(a,this);return new CKEDITOR.dom.documentFragment(a.fragment.$)},\nextractHtmlFromRange:function(a,b){var c=t,d={range:a,doc:a.document},e=this.getHtmlFromRange(a);if(a.collapsed)return a.optimize(),e;a.enlarge(CKEDITOR.ENLARGE_INLINE,1);c.table.detectPurge(d);d.bookmark=a.createBookmark();delete d.range;var f=this.editor.createRange();f.moveToPosition(d.bookmark.startNode,CKEDITOR.POSITION_BEFORE_START);d.targetBookmark=f.createBookmark();c.list.detectMerge(d,this);c.table.detectRanges(d,this);c.block.detectMerge(d,this);d.tableContentsRanges?(c.table.deleteRanges(d),\na.moveToBookmark(d.bookmark),d.range=a):(a.moveToBookmark(d.bookmark),d.range=a,a.extractContents(c.detectExtractMerge(d)));a.moveToBookmark(d.targetBookmark);a.optimize();c.fixUneditableRangePosition(a);c.list.merge(d,this);c.table.purge(d,this);c.block.merge(d,this);if(b){c=a.startPath();if(d=a.checkStartOfBlock()&&a.checkEndOfBlock()&&c.block&&!a.root.equals(c.block)){a:{var d=c.block.getElementsByTag(\"span\"),f=0,g;if(d)for(;g=d.getItem(f++);)if(!x(g)){d=!0;break a}d=!1}d=!d}d&&(a.moveToPosition(c.block,\nCKEDITOR.POSITION_BEFORE_START),c.block.remove())}else c.autoParagraph(this.editor,a),A(a.startContainer)&&a.startContainer.appendBogus();a.startContainer.mergeSiblings();return e},setup:function(){var a=this.editor;this.attachListener(a,\"beforeGetData\",function(){var b=this.getData();this.is(\"textarea\")||!1!==a.config.ignoreEmptyParagraph&&(b=b.replace(B,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,\"getSnapshot\",function(a){a.data=this.getData(1)},this);this.attachListener(a,\n\"afterSetData\",function(){this.setData(a.getData(1))},this);this.attachListener(a,\"loadSnapshot\",function(a){this.setData(a.data,1)},this);this.attachListener(a,\"beforeFocus\",function(){var b=a.getSelection();(b=b&&b.getNative())&&\"Control\"==b.type||this.focus()},this);this.attachListener(a,\"insertHtml\",function(a){this.insertHtml(a.data.dataValue,a.data.mode,a.data.range)},this);this.attachListener(a,\"insertElement\",function(a){this.insertElement(a.data)},this);this.attachListener(a,\"insertText\",\nfunction(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass(\"cke_editable\");a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?this.attachClass(\"cke_editable_inline\"):a.elementMode!=CKEDITOR.ELEMENT_MODE_REPLACE&&a.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO||this.attachClass(\"cke_editable_themed\");this.attachClass(\"cke_contents_\"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on(\"blur\",function(){this.hasFocus=\n!1},null,null,-1);this.on(\"focus\",function(){this.hasFocus=!0},null,null,-1);a.focusManager.add(this);this.equals(CKEDITOR.document.getActive())&&(this.hasFocus=!0,a.once(\"contentDom\",function(){a.focusManager.focus(this)},this));this.isInline()&&this.changeAttr(\"tabindex\",a.tabIndex);if(!this.is(\"textarea\")){a.document=this.getDocument();a.window=this.getWindow();var d=a.document;this.changeAttr(\"spellcheck\",!a.config.disableNativeSpellChecker);var e=a.config.contentsLangDirection;this.getDirection(1)!=\ne&&this.changeAttr(\"dir\",e);var m=CKEDITOR.getCss();m&&(e=d.getHead(),e.getCustomData(\"stylesheet\")||(m=d.appendStyleText(m),m=new CKEDITOR.dom.element(m.ownerNode||m.owningElement),e.setCustomData(\"stylesheet\",m),m.data(\"cke-temp\",1)));e=d.getCustomData(\"stylesheet_ref\")||0;d.setCustomData(\"stylesheet_ref\",e+1);this.setCustomData(\"cke_includeReadonly\",!a.config.disableReadonlyStyling);this.attachListener(this,\"click\",function(a){a=a.data;var b=(new CKEDITOR.dom.elementPath(a.getTarget(),this)).contains(\"a\");\nb&&2!=a.$.button&&b.isReadOnly()&&a.preventDefault()});var l={8:1,46:1};this.attachListener(a,\"key\",function(b){if(a.readOnly)return!0;var c=b.data.domEvent.getKey(),d;if(c in l){b=a.getSelection();var h,e=b.getRanges()[0],m=e.startPath(),p,v,k,c=8==c;CKEDITOR.env.ie&&11>CKEDITOR.env.version&&(h=b.getSelectedElement())||(h=g(b))?(a.fire(\"saveSnapshot\"),e.moveToPosition(h,CKEDITOR.POSITION_BEFORE_START),h.remove(),e.select(),a.fire(\"saveSnapshot\"),d=1):e.collapsed&&((p=m.block)&&(k=p[c?\"getPrevious\":\n\"getNext\"](f))&&k.type==CKEDITOR.NODE_ELEMENT&&k.is(\"table\")&&e[c?\"checkStartOfBlock\":\"checkEndOfBlock\"]()?(a.fire(\"saveSnapshot\"),e[c?\"checkEndOfBlock\":\"checkStartOfBlock\"]()&&p.remove(),e[\"moveToElementEdit\"+(c?\"End\":\"Start\")](k),e.select(),a.fire(\"saveSnapshot\"),d=1):m.blockLimit&&m.blockLimit.is(\"td\")&&(v=m.blockLimit.getAscendant(\"table\"))&&e.checkBoundaryOfElement(v,c?CKEDITOR.START:CKEDITOR.END)&&(k=v[c?\"getPrevious\":\"getNext\"](f))?(a.fire(\"saveSnapshot\"),e[\"moveToElementEdit\"+(c?\"End\":\"Start\")](k),\ne.checkStartOfBlock()&&e.checkEndOfBlock()?k.remove():e.select(),a.fire(\"saveSnapshot\"),d=1):(v=m.contains([\"td\",\"th\",\"caption\"]))&&e.checkBoundaryOfElement(v,c?CKEDITOR.START:CKEDITOR.END)&&(d=1))}return!d});a.blockless&&CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller&&this.attachListener(this,\"keyup\",function(b){b.data.getKeystroke()in l&&!this.getFirst(c)&&(this.appendBogus(),b=a.createRange(),b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START),b.select())});this.attachListener(this,\"dblclick\",function(b){if(a.readOnly)return!1;\nb={element:b.data.getTarget()};a.fire(\"doubleclick\",b)});CKEDITOR.env.ie&&this.attachListener(this,\"click\",b);CKEDITOR.env.ie&&!CKEDITOR.env.edge||this.attachListener(this,\"mousedown\",function(b){var c=b.data.getTarget();c.is(\"img\",\"hr\",\"input\",\"textarea\",\"select\")&&!c.isReadOnly()&&(a.getSelection().selectElement(c),c.is(\"input\",\"textarea\",\"select\")&&b.data.preventDefault())});CKEDITOR.env.edge&&this.attachListener(this,\"mouseup\",function(b){(b=b.data.getTarget())&&b.is(\"img\")&&a.getSelection().selectElement(b)});\nCKEDITOR.env.gecko&&this.attachListener(this,\"mouseup\",function(b){if(2==b.data.$.button&&(b=b.data.getTarget(),!b.getOuterHtml().replace(B,\"\"))){var c=a.createRange();c.moveToElementEditStart(b);c.select(!0)}});CKEDITOR.env.webkit&&(this.attachListener(this,\"click\",function(a){a.data.getTarget().is(\"input\",\"select\")&&a.data.preventDefault()}),this.attachListener(this,\"mouseup\",function(a){a.data.getTarget().is(\"input\",\"textarea\")&&a.data.preventDefault()}));CKEDITOR.env.webkit&&this.attachListener(a,\n\"key\",function(b){if(a.readOnly)return!0;b=b.data.domEvent.getKey();if(b in l){var c=8==b,d=a.getSelection().getRanges()[0];b=d.startPath();if(d.collapsed)a:{var h=b.block;if(h&&d[c?\"checkStartOfBlock\":\"checkEndOfBlock\"]()&&d.moveToClosestEditablePosition(h,!c)&&d.collapsed){if(d.startContainer.type==CKEDITOR.NODE_ELEMENT){var e=d.startContainer.getChild(d.startOffset-(c?1:0));if(e&&e.type==CKEDITOR.NODE_ELEMENT&&e.is(\"hr\")){a.fire(\"saveSnapshot\");e.remove();b=!0;break a}}d=d.startPath().block;if(!d||\nd&&d.contains(h))b=void 0;else{a.fire(\"saveSnapshot\");var m;(m=(c?d:h).getBogus())&&m.remove();m=a.getSelection();e=m.createBookmarks();(c?h:d).moveChildren(c?d:h,!1);b.lastElement.mergeSiblings();w(h,d,!c);m.selectBookmarks(e);b=!0}}else b=!1}else c=d,m=b.block,d=c.endPath().block,m&&d&&!m.equals(d)?(a.fire(\"saveSnapshot\"),(h=m.getBogus())&&h.remove(),c.enlarge(CKEDITOR.ENLARGE_INLINE),c.deleteContents(),d.getParent()&&(d.moveChildren(m,!1),b.lastElement.mergeSiblings(),w(m,d,!0)),c=a.getSelection().getRanges()[0],\nc.collapse(1),c.optimize(),\"\"===c.startContainer.getHtml()&&c.startContainer.appendBogus(),c.select(),b=!0):b=!1;if(!b)return;a.getSelection().scrollIntoView();a.fire(\"saveSnapshot\");return!1}},this,null,100)}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData(\"classes\"))for(;a.length;)this.removeClass(a.pop());if(!this.is(\"textarea\")){a=this.getDocument();var b=a.getHead();if(b.getCustomData(\"stylesheet\")){var c=\na.getCustomData(\"stylesheet_ref\");--c?a.setCustomData(\"stylesheet_ref\",c):(a.removeCustomData(\"stylesheet_ref\"),b.removeCustomData(\"stylesheet\").remove())}}this.editor.fire(\"contentDomUnload\");delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;arguments.length&&(b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null));return b};CKEDITOR.on(\"instanceLoaded\",function(b){var c=b.editor;c.on(\"insertElement\",\nfunction(a){a=a.data;a.type==CKEDITOR.NODE_ELEMENT&&(a.is(\"input\")||a.is(\"textarea\"))&&(\"false\"!=a.getAttribute(\"contentEditable\")&&a.data(\"cke-editable\",a.hasAttribute(\"contenteditable\")?\"true\":\"1\"),a.setAttribute(\"contentEditable\",!1))});c.on(\"selectionChange\",function(b){if(!c.readOnly){var d=c.getSelection();d&&!d.isLocked&&(d=c.checkDirty(),c.fire(\"lockSnapshot\"),a(b),c.fire(\"unlockSnapshot\"),!d&&c.resetDirty())}})});CKEDITOR.on(\"instanceCreated\",function(a){var b=a.editor;b.on(\"mode\",function(){var a=\nb.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr(\"role\",\"textbox\");a.changeAttr(\"aria-label\",c);c&&a.changeAttr(\"title\",c);var d=b.fire(\"ariaEditorHelpLabel\",{}).label;if(d&&(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?\"top\":\"contents\"))){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('\\x3cspan id\\x3d\"'+e+'\" class\\x3d\"cke_voice_label\"\\x3e'+d+\"\\x3c/span\\x3e\");c.append(d);a.changeAttr(\"aria-describedby\",e)}}})});CKEDITOR.addCss(\".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}\");\nvar f=CKEDITOR.dom.walker.whitespaces(!0),x=CKEDITOR.dom.walker.bookmark(!1,!0),A=CKEDITOR.dom.walker.empty(),u=CKEDITOR.dom.walker.bogus(),B=/(^|<body\\b[^>]*>)\\s*<(p|div|address|h\\d|center|pre)[^>]*>\\s*(?:<br[^>]*>|&nbsp;|\\u00A0|&#160;)?\\s*(:?<\\/\\2>)?\\s*(?=$|<\\/body>)/gi,q=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,d){var e,m,f,p,g=[],l=d.range.startContainer;e=d.range.startPath();for(var l=q[l.getName()],r=0,k=c.getChildren(),C=k.count(),G=-1,n=-1,w=0,K=e.contains(q.$list);r<\nC;++r)e=k.getItem(r),a(e)?(f=e.getName(),K&&f in CKEDITOR.dtd.$list?g=g.concat(b(e,d)):(p=!!l[f],\"br\"!=f||!e.data(\"cke-eol\")||r&&r!=C-1||(w=(m=r?g[r-1].node:k.getItem(r+1))&&(!a(m)||!m.is(\"br\")),m=m&&a(m)&&q.$block[m.getName()]),-1!=G||p||(G=r),p||(n=r),g.push({isElement:1,isLineBreak:w,isBlock:e.isBlockBoundary(),hasBlockSibling:m,node:e,name:f,allowed:p}),m=w=0)):g.push({isElement:0,node:e,allowed:1});-1<G&&(g[G].firstNotAllowed=1);-1<n&&(g[n].lastNotAllowed=1);return g}function d(b,c){var e=[],\nh=b.getChildren(),m=h.count(),f,g=0,l=q[c],r=!b.is(q.$inline)||b.is(\"br\");for(r&&e.push(\" \");g<m;g++)f=h.getItem(g),a(f)&&!f.is(l)?e=e.concat(d(f,c)):e.push(f);r&&e.push(\" \");return e}function e(b){return a(b.startContainer)&&b.startContainer.getChild(b.startOffset-1)}function f(b){return b&&a(b)&&(b.is(q.$removeEmpty)||b.is(\"a\")&&!b.isBlockBoundary())}function g(b,c,d,e){var h=b.clone(),m,f;h.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);(m=(new CKEDITOR.dom.walker(h)).next())&&a(m)&&n[m.getName()]&&\n(f=m.getPrevious())&&a(f)&&!f.getParent().equals(b.startContainer)&&d.contains(f)&&e.contains(m)&&m.isIdentical(f)&&(m.moveChildren(f),m.remove(),g(b,c,d,e))}function G(b,c){function d(b,c){if(c.isBlock&&c.isElement&&!c.node.is(\"br\")&&a(b)&&b.is(\"br\"))return b.remove(),1}var e=c.endContainer.getChild(c.endOffset),h=c.endContainer.getChild(c.endOffset-1);e&&d(e,b[b.length-1]);h&&d(h,b[0])&&(c.setEnd(c.endContainer,c.endOffset-1),c.collapse())}var q=CKEDITOR.dtd,n={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,\nh6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},w={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},M=CKEDITOR.tools.extend({},q.$inline);delete M.br;return function(n,v,D,I){var E=n.editor,L=!1;\"unfiltered_html\"==v&&(v=\"html\",L=!0);if(!I.checkReadOnly()){var J=(new CKEDITOR.dom.elementPath(I.startContainer,I.root)).blockLimit||I.root;n={type:v,dontFilter:L,editable:n,editor:E,range:I,blockLimit:J,mergeCandidates:[],zombies:[]};v=n.range;I=n.mergeCandidates;var K,u;\"text\"==n.type&&v.shrink(CKEDITOR.SHRINK_ELEMENT,\n!0,!1)&&(K=CKEDITOR.dom.element.createFromHtml(\"\\x3cspan\\x3e\\x26nbsp;\\x3c/span\\x3e\",v.document),v.insertNode(K),v.setStartAfter(K));L=new CKEDITOR.dom.elementPath(v.startContainer);n.endPath=J=new CKEDITOR.dom.elementPath(v.endContainer);if(!v.collapsed){var E=J.block||J.blockLimit,y=v.getCommonAncestor();E&&!E.equals(y)&&!E.contains(y)&&v.checkEndOfBlock()&&n.zombies.push(E);v.deleteContents()}for(;(u=e(v))&&a(u)&&u.isBlockBoundary()&&L.contains(u);)v.moveToPosition(u,CKEDITOR.POSITION_BEFORE_END);\ng(v,n.blockLimit,L,J);K&&(v.setEndBefore(K),v.collapse(),K.remove());K=v.startPath();if(E=K.contains(f,!1,1))v.splitElement(E),n.inlineStylesRoot=E,n.inlineStylesPeak=K.lastElement;K=v.createBookmark();(E=K.startNode.getPrevious(c))&&a(E)&&f(E)&&I.push(E);(E=K.startNode.getNext(c))&&a(E)&&f(E)&&I.push(E);for(E=K.startNode;(E=E.getParent())&&f(E);)I.push(E);v.moveToBookmark(K);if(K=D){K=n.range;if(\"text\"==n.type&&n.inlineStylesRoot){u=n.inlineStylesPeak;v=u.getDocument().createText(\"{cke-peak}\");for(I=\nn.inlineStylesRoot.getParent();!u.equals(I);)v=v.appendTo(u.clone()),u=u.getParent();D=v.getOuterHtml().split(\"{cke-peak}\").join(D)}u=n.blockLimit.getName();if(/^\\s+|\\s+$/.test(D)&&\"span\"in CKEDITOR.dtd[u]){var A='\\x3cspan data-cke-marker\\x3d\"1\"\\x3e\\x26nbsp;\\x3c/span\\x3e';D=A+D+A}D=n.editor.dataProcessor.toHtml(D,{context:null,fixForBody:!1,protectedWhitespaces:!!A,dontFilter:n.dontFilter,filter:n.editor.activeFilter,enterMode:n.editor.activeEnterMode});u=K.document.createElement(\"body\");u.setHtml(D);\nA&&(u.getFirst().remove(),u.getLast().remove());if((A=K.startPath().block)&&(1!=A.getChildCount()||!A.getBogus()))a:{var x;if(1==u.getChildCount()&&a(x=u.getFirst())&&x.is(w)&&!x.hasAttribute(\"contenteditable\")){A=x.getElementsByTag(\"*\");K=0;for(I=A.count();K<I;K++)if(v=A.getItem(K),!v.is(M))break a;x.moveChildren(x.getParent(1));x.remove()}}n.dataWrapper=u;K=D}if(K){x=n.range;K=x.document;var t;u=n.blockLimit;I=0;var B,A=[],N,T;D=E=0;var F,W;v=x.startContainer;var L=n.endPath.elements[0],X,J=L.getPosition(v),\ny=!!L.getCommonAncestor(v)&&J!=CKEDITOR.POSITION_IDENTICAL&&!(J&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);v=b(n.dataWrapper,n);for(G(v,x);I<v.length;I++){J=v[I];if(t=J.isLineBreak){t=x;F=u;var S=void 0,aa=void 0;J.hasBlockSibling?t=1:(S=t.startContainer.getAscendant(q.$block,1))&&S.is({div:1,p:1})?(aa=S.getPosition(F),aa==CKEDITOR.POSITION_IDENTICAL||aa==CKEDITOR.POSITION_CONTAINS?t=0:(F=t.splitElement(S),t.moveToPosition(F,CKEDITOR.POSITION_AFTER_START),t=1)):t=0}if(t)D=0<I;else{t=\nx.startPath();!J.isBlock&&l(n.editor,t.block,t.blockLimit)&&(T=k(n.editor))&&(T=K.createElement(T),T.appendBogus(),x.insertNode(T),CKEDITOR.env.needsBrFiller&&(B=T.getBogus())&&B.remove(),x.moveToPosition(T,CKEDITOR.POSITION_BEFORE_END));if((t=x.startPath().block)&&!t.equals(N)){if(B=t.getBogus())B.remove(),A.push(t);N=t}J.firstNotAllowed&&(E=1);if(E&&J.isElement){t=x.startContainer;for(F=null;t&&!q[t.getName()][J.name];){if(t.equals(u)){t=null;break}F=t;t=t.getParent()}if(t)F&&(W=x.splitElement(F),\nn.zombies.push(W),n.zombies.push(F));else{F=u.getName();X=!I;t=I==v.length-1;F=d(J.node,F);for(var S=[],aa=F.length,ca=0,ea=void 0,Y=0,U=-1;ca<aa;ca++)ea=F[ca],\" \"==ea?(Y||X&&!ca||(S.push(new CKEDITOR.dom.text(\" \")),U=S.length),Y=1):(S.push(ea),Y=0);t&&U==S.length&&S.pop();X=S}}if(X){for(;t=X.pop();)x.insertNode(t);X=0}else x.insertNode(J.node);J.lastNotAllowed&&I<v.length-1&&((W=y?L:W)&&x.setEndAt(W,CKEDITOR.POSITION_AFTER_START),E=0);x.collapse()}}1!=v.length?B=!1:(B=v[0],B=B.isElement&&\"false\"==\nB.node.getAttribute(\"contenteditable\"));B&&(D=!0,t=v[0].node,x.setStartAt(t,CKEDITOR.POSITION_BEFORE_START),x.setEndAt(t,CKEDITOR.POSITION_AFTER_END));n.dontMoveCaret=D;n.bogusNeededBlocks=A}B=n.range;var P;W=n.bogusNeededBlocks;for(X=B.createBookmark();N=n.zombies.pop();)N.getParent()&&(T=B.clone(),T.moveToElementEditStart(N),T.removeEmptyBlocksAtEnd());if(W)for(;N=W.pop();)CKEDITOR.env.needsBrFiller?N.appendBogus():N.append(B.document.createText(\" \"));for(;N=n.mergeCandidates.pop();)N.mergeSiblings();\nB.moveToBookmark(X);if(!n.dontMoveCaret){for(N=e(B);N&&a(N)&&!N.is(q.$empty);){if(N.isBlockBoundary())B.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END);else{if(f(N)&&N.getHtml().match(/(\\s|&nbsp;)$/g)){P=null;break}P=B.clone();P.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END)}N=N.getLast(c)}P&&B.moveToRange(P)}}}}(),y=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return!1;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$tableContent)};b.evaluator=function(a){return a.type==\nCKEDITOR.NODE_ELEMENT};return b}function b(a,c,d){c=a.getDocument().createElement(c);a.append(c,d);return c}function c(a){var b=a.count(),d;for(b;0<b--;)d=a.getItem(b),CKEDITOR.tools.trim(d.getHtml())||(d.appendBogus(),CKEDITOR.env.ie&&9>CKEDITOR.env.version&&d.getChildCount()&&d.getFirst().remove())}return function(d){var e=d.startContainer,f=e.getAscendant(\"table\",1),g=!1;c(f.getElementsByTag(\"td\"));c(f.getElementsByTag(\"th\"));f=d.clone();f.setStart(e,0);f=a(f).lastBackward();f||(f=d.clone(),f.setEndAt(e,\nCKEDITOR.POSITION_BEFORE_END),f=a(f).lastForward(),g=!0);f||(f=e);f.is(\"table\")?(d.setStartAt(f,CKEDITOR.POSITION_BEFORE_START),d.collapse(!0),f.remove()):(f.is({tbody:1,thead:1,tfoot:1})&&(f=b(f,\"tr\",g)),f.is(\"tr\")&&(f=b(f,f.getParent().is(\"thead\")?\"th\":\"td\",g)),(e=f.getBogus())&&e.remove(),d.moveToPosition(f,g?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END))}}(),F={eol:{detect:function(a,b){var c=a.range,d=c.clone(),e=c.clone(),f=new CKEDITOR.dom.elementPath(c.startContainer,b),g=new CKEDITOR.dom.elementPath(c.endContainer,\nb);d.collapse(1);e.collapse();f.block&&d.checkBoundaryOfElement(f.block,CKEDITOR.END)&&(c.setStartAfter(f.block),a.prependEolBr=1);g.block&&e.checkBoundaryOfElement(g.block,CKEDITOR.START)&&(c.setEndBefore(g.block),a.appendEolBr=1)},fix:function(a,b){var c=b.getDocument(),d;a.appendEolBr&&(d=this.createEolBr(c),a.fragment.append(d));!a.prependEolBr||d&&!d.getPrevious()||a.fragment.append(this.createEolBr(c),1)},createEolBr:function(a){return a.createElement(\"br\",{attributes:{\"data-cke-eol\":1}})}},\nbogus:{exclude:function(a){var b=a.range.getBoundaryNodes(),c=b.startNode,b=b.endNode;!b||!u(b)||c&&c.equals(b)||a.range.setEndBefore(b)}},tree:{rebuild:function(a,b){var c=a.range,d=c.getCommonAncestor(),e=new CKEDITOR.dom.elementPath(d,b),f=new CKEDITOR.dom.elementPath(c.startContainer,b),c=new CKEDITOR.dom.elementPath(c.endContainer,b),g;d.type==CKEDITOR.NODE_TEXT&&(d=d.getParent());if(e.blockLimit.is({tr:1,table:1})){var l=e.contains(\"table\").getParent();g=function(a){return!a.equals(l)}}else if(e.block&&\ne.block.is(CKEDITOR.dtd.$listItem)&&(f=f.contains(CKEDITOR.dtd.$list),c=c.contains(CKEDITOR.dtd.$list),!f.equals(c))){var k=e.contains(CKEDITOR.dtd.$list).getParent();g=function(a){return!a.equals(k)}}g||(g=function(a){return!a.equals(e.block)&&!a.equals(e.blockLimit)});this.rebuildFragment(a,b,d,g)},rebuildFragment:function(a,b,c,d){for(var e;c&&!c.equals(b)&&d(c);)e=c.clone(0,1),a.fragment.appendTo(e),a.fragment=e,c=c.getParent()}},cell:{shrink:function(a){a=a.range;var b=a.startContainer,c=a.endContainer,\nd=a.startOffset,e=a.endOffset;b.type==CKEDITOR.NODE_ELEMENT&&b.equals(c)&&b.is(\"tr\")&&++d==e&&a.shrink(CKEDITOR.SHRINK_TEXT)}}},t=function(){function a(b,c){var d=b.getParent();if(d.is(CKEDITOR.dtd.$inline))b[c?\"insertBefore\":\"insertAfter\"](d)}function b(c,d,e){a(d);a(e,1);for(var h;h=e.getNext();)h.insertAfter(d),d=h;A(c)&&c.remove()}function c(a,b){var d=new CKEDITOR.dom.range(a);d.setStartAfter(b.startNode);d.setEndBefore(b.endNode);return d}return{list:{detectMerge:function(a,b){var d=c(b,a.bookmark),\ne=d.startPath(),h=d.endPath(),f=e.contains(CKEDITOR.dtd.$list),g=h.contains(CKEDITOR.dtd.$list);a.mergeList=f&&g&&f.getParent().equals(g.getParent())&&!f.equals(g);a.mergeListItems=e.block&&h.block&&e.block.is(CKEDITOR.dtd.$listItem)&&h.block.is(CKEDITOR.dtd.$listItem);if(a.mergeList||a.mergeListItems)d=d.clone(),d.setStartBefore(a.bookmark.startNode),d.setEndAfter(a.bookmark.endNode),a.mergeListBookmark=d.createBookmark()},merge:function(a,c){if(a.mergeListBookmark){var d=a.mergeListBookmark.startNode,\ne=a.mergeListBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),g=new CKEDITOR.dom.elementPath(e,c);if(a.mergeList){var p=f.contains(CKEDITOR.dtd.$list),l=g.contains(CKEDITOR.dtd.$list);p.equals(l)||(l.moveChildren(p),l.remove())}a.mergeListItems&&(f=f.contains(CKEDITOR.dtd.$listItem),g=g.contains(CKEDITOR.dtd.$listItem),f.equals(g)||b(g,d,e));d.remove();e.remove()}}},block:{detectMerge:function(a,b){if(!a.tableContentsRanges&&!a.mergeListBookmark){var c=new CKEDITOR.dom.range(b);c.setStartBefore(a.bookmark.startNode);\nc.setEndAfter(a.bookmark.endNode);a.mergeBlockBookmark=c.createBookmark()}},merge:function(a,c){if(a.mergeBlockBookmark&&!a.purgeTableBookmark){var d=a.mergeBlockBookmark.startNode,e=a.mergeBlockBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),g=new CKEDITOR.dom.elementPath(e,c),f=f.block,g=g.block;f&&g&&!f.equals(g)&&b(g,d,e);d.remove();e.remove()}}},table:function(){function a(c){var e=[],h,f=new CKEDITOR.dom.walker(c),g=c.startPath().contains(d),m=c.endPath().contains(d),p={};f.guard=function(a,\nf){if(a.type==CKEDITOR.NODE_ELEMENT){var l=\"visited_\"+(f?\"out\":\"in\");if(a.getCustomData(l))return;CKEDITOR.dom.element.setMarker(p,a,l,1)}if(f&&g&&a.equals(g))h=c.clone(),h.setEndAt(g,CKEDITOR.POSITION_BEFORE_END),e.push(h);else if(!f&&m&&a.equals(m))h=c.clone(),h.setStartAt(m,CKEDITOR.POSITION_AFTER_START),e.push(h);else{if(l=!f)l=a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&(!g||b(a,g))&&(!m||b(a,m));l&&(h=c.clone(),h.selectNodeContents(a),e.push(h))}};f.lastForward();CKEDITOR.dom.element.clearAllMarkers(p);\nreturn e}function b(a,c){var d=CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED,e=a.getPosition(c);return e===CKEDITOR.POSITION_IDENTICAL?!1:0===(e&d)}var d={td:1,th:1,caption:1};return{detectPurge:function(a){var b=a.range,c=b.clone();c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var c=new CKEDITOR.dom.walker(c),e=0;c.evaluator=function(a){a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&++e};c.checkForward();if(1<e){var c=b.startPath().contains(\"table\"),h=b.endPath().contains(\"table\");c&&h&&b.checkBoundaryOfElement(c,\nCKEDITOR.START)&&b.checkBoundaryOfElement(h,CKEDITOR.END)&&(b=a.range.clone(),b.setStartBefore(c),b.setEndAfter(h),a.purgeTableBookmark=b.createBookmark())}},detectRanges:function(e,h){var f=c(h,e.bookmark),g=f.clone(),l,k,v=f.getCommonAncestor();v.is(CKEDITOR.dtd.$tableContent)&&!v.is(d)&&(v=v.getAscendant(\"table\",!0));k=v;v=new CKEDITOR.dom.elementPath(f.startContainer,k);k=new CKEDITOR.dom.elementPath(f.endContainer,k);v=v.contains(\"table\");k=k.contains(\"table\");if(v||k)v&&k&&b(v,k)?(e.tableSurroundingRange=\ng,g.setStartAt(v,CKEDITOR.POSITION_AFTER_END),g.setEndAt(k,CKEDITOR.POSITION_BEFORE_START),g=f.clone(),g.setEndAt(v,CKEDITOR.POSITION_AFTER_END),l=f.clone(),l.setStartAt(k,CKEDITOR.POSITION_BEFORE_START),l=a(g).concat(a(l))):v?k||(e.tableSurroundingRange=g,g.setStartAt(v,CKEDITOR.POSITION_AFTER_END),f.setEndAt(v,CKEDITOR.POSITION_AFTER_END)):(e.tableSurroundingRange=g,g.setEndAt(k,CKEDITOR.POSITION_BEFORE_START),f.setStartAt(k,CKEDITOR.POSITION_AFTER_START)),e.tableContentsRanges=l?l:a(f)},deleteRanges:function(a){for(var b;b=\na.tableContentsRanges.pop();)b.extractContents(),A(b.startContainer)&&b.startContainer.appendBogus();a.tableSurroundingRange&&a.tableSurroundingRange.extractContents()},purge:function(a){if(a.purgeTableBookmark){var b=a.doc,c=a.range.clone(),b=b.createElement(\"p\");b.insertBefore(a.purgeTableBookmark.startNode);c.moveToBookmark(a.purgeTableBookmark);c.deleteContents();a.range.moveToPosition(b,CKEDITOR.POSITION_AFTER_START)}}}}(),detectExtractMerge:function(a){return!(a.range.startPath().contains(CKEDITOR.dtd.$listItem)&&\na.range.endPath().contains(CKEDITOR.dtd.$listItem))},fixUneditableRangePosition:function(a){a.startContainer.getDtd()[\"#\"]||a.moveToClosestEditablePosition(null,!0)},autoParagraph:function(a,b){var c=b.startPath(),d;l(a,c.block,c.blockLimit)&&(d=k(a))&&(d=b.document.createElement(d),d.appendBogus(),b.insertNode(d),b.moveToPosition(d,CKEDITOR.POSITION_AFTER_START))}}}()})();\n(function(){function a(){var a=this._.fakeSelection,b;a&&(b=this.getSelection(1),b&&b.isHidden()||(a.reset(),a=0));if(!a&&(a=b||this.getSelection(1),!a||a.getType()==CKEDITOR.SELECTION_NONE))return;this.fire(\"selectionCheck\",a);b=this.elementPath();b.compare(this._.selectionPreviousPath)||(CKEDITOR.env.webkit&&(this._.previousActive=this.document.getActive()),this._.selectionPreviousPath=b,this.fire(\"selectionChange\",{selection:a,path:b}))}function d(){A=!0;x||(b.call(this),x=CKEDITOR.tools.setTimeout(b,\n200,this))}function b(){x=null;A&&(CKEDITOR.tools.setTimeout(a,0,this),A=!1)}function c(a){return u(a)||a.type==CKEDITOR.NODE_ELEMENT&&!a.is(CKEDITOR.dtd.$empty)?!0:!1}function e(a){function b(c,d){return c&&c.type!=CKEDITOR.NODE_TEXT?a.clone()[\"moveToElementEdit\"+(d?\"End\":\"Start\")](c):!1}if(!(a.root instanceof CKEDITOR.editable))return!1;var d=a.startContainer,e=a.getPreviousNode(c,null,d),f=a.getNextNode(c,null,d);return b(e)||b(f,1)||!(e||f||d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()&&\nd.getBogus())?!0:!1}function g(a){l(a,!1);var b=a.getDocument().createText(t);a.setCustomData(\"cke-fillingChar\",b);return b}function l(a,b){var c=a&&a.removeCustomData(\"cke-fillingChar\");if(c){if(!1!==b){var d=a.getDocument().getSelection().getNative(),e=d&&\"None\"!=d.type&&d.getRangeAt(0),f=t.length;if(c.getLength()>f&&e&&e.intersectsNode(c.$)){var g=[{node:d.anchorNode,offset:d.anchorOffset},{node:d.focusNode,offset:d.focusOffset}];d.anchorNode==c.$&&d.anchorOffset>f&&(g[0].offset-=f);d.focusNode==\nc.$&&d.focusOffset>f&&(g[1].offset-=f)}}c.setText(k(c.getText(),1));g&&(c=a.getDocument().$,d=c.getSelection(),c=c.createRange(),c.setStart(g[0].node,g[0].offset),c.collapse(!0),d.removeAllRanges(),d.addRange(c),d.extend(g[1].node,g[1].offset))}}function k(a,b){return b?a.replace(z,function(a,b){return b?\" \":\"\"}):a.replace(t,\"\")}function n(a){var b=CKEDITOR.dom.element.createFromHtml('\\x3cdiv data-cke-hidden-sel\\x3d\"1\" data-cke-temp\\x3d\"1\" style\\x3d\"'+(CKEDITOR.env.ie?\"display:none\":\"position:fixed;top:0;left:-1000px\")+\n'\"\\x3e\\x26nbsp;\\x3c/div\\x3e',a.document);a.fire(\"lockSnapshot\");a.editable().append(b);var c=a.getSelection(1),d=a.createRange(),e=c.root.on(\"selectionchange\",function(a){a.cancel()},null,null,0);d.setStartAt(b,CKEDITOR.POSITION_AFTER_START);d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);c.selectRanges([d]);e.removeListener();a.fire(\"unlockSnapshot\");a._.hiddenSelectionContainer=b}function w(a){var b={37:1,39:1,8:1,46:1};return function(c){var d=c.data.getKeystroke();if(b[d]){var e=a.getSelection().getRanges(),\nf=e[0];1==e.length&&f.collapsed&&(d=f[38>d?\"getPreviousEditableNode\":\"getNextEditableNode\"]())&&d.type==CKEDITOR.NODE_ELEMENT&&\"false\"==d.getAttribute(\"contenteditable\")&&(a.getSelection().fake(d),c.data.preventDefault(),c.cancel())}}}function f(a){for(var b=0;b<a.length;b++){var c=a[b];c.getCommonAncestor().isReadOnly()&&a.splice(b,1);if(!c.collapsed){if(c.startContainer.isReadOnly())for(var d=c.startContainer,e;d&&!((e=d.type==CKEDITOR.NODE_ELEMENT)&&d.is(\"body\")||!d.isReadOnly());)e&&\"false\"==\nd.getAttribute(\"contentEditable\")&&c.setStartAfter(d),d=d.getParent();d=c.startContainer;e=c.endContainer;var f=c.startOffset,g=c.endOffset,l=c.clone();d&&d.type==CKEDITOR.NODE_TEXT&&(f>=d.getLength()?l.setStartAfter(d):l.setStartBefore(d));e&&e.type==CKEDITOR.NODE_TEXT&&(g?l.setEndAfter(e):l.setEndBefore(e));d=new CKEDITOR.dom.walker(l);d.evaluator=function(d){if(d.type==CKEDITOR.NODE_ELEMENT&&d.isReadOnly()){var e=c.clone();c.setEndBefore(d);c.collapsed&&a.splice(b--,1);d.getPosition(l.endContainer)&\nCKEDITOR.POSITION_CONTAINS||(e.setStartAfter(d),e.collapsed||a.splice(b+1,0,e));return!0}return!1};d.next()}}return a}var x,A,u=CKEDITOR.dom.walker.invisible(1),B=function(){function a(b){return function(a){var c=a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]);return!1}}function b(a){return function(b){var c=b.editor,d=c.createRange(),e;(e=d.moveToClosestEditablePosition(b.selected,a))||(e=d.moveToClosestEditablePosition(b.selected,!a));\ne&&c.getSelection().selectRanges([d]);c.fire(\"saveSnapshot\");b.selected.remove();e||(d.moveToElementEditablePosition(c.editable()),c.getSelection().selectRanges([d]));c.fire(\"saveSnapshot\");return!1}}var c=a(),d=a(1);return{37:c,38:c,39:d,40:d,8:b(),46:b(1)}}();CKEDITOR.on(\"instanceCreated\",function(b){function c(){var a=e.getSelection();a&&a.removeAllRanges()}var e=b.editor;e.on(\"contentDom\",function(){function b(){D=new CKEDITOR.dom.selection(e.getSelection());D.lock()}function c(){h.removeListener(\"mouseup\",\nc);k.removeListener(\"mouseup\",c);var a=CKEDITOR.document.$.selection,b=a.createRange();\"None\"!=a.type&&b.parentElement().ownerDocument==f.$&&b.select()}var f=e.document,h=CKEDITOR.document,g=e.editable(),p=f.getBody(),k=f.getDocumentElement(),n=g.isInline(),v,D;CKEDITOR.env.gecko&&g.attachListener(g,\"focus\",function(a){a.removeListener();0!==v&&(a=e.getSelection().getNative())&&a.isCollapsed&&a.anchorNode==g.$&&(a=e.createRange(),a.moveToElementEditStart(g),a.select())},null,null,-2);g.attachListener(g,\nCKEDITOR.env.webkit?\"DOMFocusIn\":\"focus\",function(){v&&CKEDITOR.env.webkit&&(v=e._.previousActive&&e._.previousActive.equals(f.getActive()));e.unlockSelection(v);v=0},null,null,-1);g.attachListener(g,\"mousedown\",function(){v=0});if(CKEDITOR.env.ie||n)q?g.attachListener(g,\"beforedeactivate\",b,null,null,-1):g.attachListener(e,\"selectionCheck\",b,null,null,-1),g.attachListener(g,CKEDITOR.env.webkit?\"DOMFocusOut\":\"blur\",function(){e.lockSelection(D);v=1},null,null,-1),g.attachListener(g,\"mousedown\",function(){v=\n0});if(CKEDITOR.env.ie&&!n){var I;g.attachListener(g,\"mousedown\",function(a){2==a.data.$.button&&((a=e.document.getSelection())&&a.getType()!=CKEDITOR.SELECTION_NONE||(I=e.window.getScrollPosition()))});g.attachListener(g,\"mouseup\",function(a){2==a.data.$.button&&I&&(e.document.$.documentElement.scrollLeft=I.x,e.document.$.documentElement.scrollTop=I.y);I=null});if(\"BackCompat\"!=f.$.compatMode){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)k.on(\"mousedown\",function(a){function b(a){a=a.data.$;\nif(d){var c=p.$.createTextRange();try{c.moveToPoint(a.clientX,a.clientY)}catch(e){}d.setEndPoint(0>f.compareEndPoints(\"StartToStart\",c)?\"EndToEnd\":\"StartToStart\",c);d.select()}}function c(){k.removeListener(\"mousemove\",b);h.removeListener(\"mouseup\",c);k.removeListener(\"mouseup\",c);d.select()}a=a.data;if(a.getTarget().is(\"html\")&&a.$.y<k.$.clientHeight&&a.$.x<k.$.clientWidth){var d=p.$.createTextRange();try{d.moveToPoint(a.$.clientX,a.$.clientY)}catch(e){}var f=d.duplicate();k.on(\"mousemove\",b);h.on(\"mouseup\",\nc);k.on(\"mouseup\",c)}});if(7<CKEDITOR.env.version&&11>CKEDITOR.env.version)k.on(\"mousedown\",function(a){a.data.getTarget().is(\"html\")&&(h.on(\"mouseup\",c),k.on(\"mouseup\",c))})}}g.attachListener(g,\"selectionchange\",a,e);g.attachListener(g,\"keyup\",d,e);g.attachListener(g,CKEDITOR.env.webkit?\"DOMFocusIn\":\"focus\",function(){e.forceNextSelectionCheck();e.selectionChange(1)});if(n&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){var E;g.attachListener(g,\"mousedown\",function(){E=1});g.attachListener(f.getDocumentElement(),\n\"mouseup\",function(){E&&d.call(e);E=0})}else g.attachListener(CKEDITOR.env.ie?g:f.getDocumentElement(),\"mouseup\",d,e);CKEDITOR.env.webkit&&g.attachListener(f,\"keydown\",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:l(g)}},null,null,-1);g.attachListener(g,\"keydown\",w(e),null,null,-1)});e.on(\"setData\",function(){e.unlockSelection();CKEDITOR.env.webkit&&c()});e.on(\"contentDomUnload\",function(){e.unlockSelection()});if(CKEDITOR.env.ie9Compat)e.on(\"beforeDestroy\",\nc,null,null,9);e.on(\"dataReady\",function(){delete e._.fakeSelection;delete e._.hiddenSelectionContainer;e.selectionChange(1)});e.on(\"loadSnapshot\",function(){var a=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT),b=e.editable().getLast(a);b&&b.hasAttribute(\"data-cke-hidden-sel\")&&(b.remove(),CKEDITOR.env.gecko&&(a=e.editable().getFirst(a))&&a.is(\"br\")&&a.getAttribute(\"_moz_editor_bogus_node\")&&a.remove())},null,null,100);e.on(\"key\",function(a){if(\"wysiwyg\"==e.mode){var b=e.getSelection();if(b.isFake){var c=\nB[a.data.keyCode];if(c)return c({editor:e,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});if(CKEDITOR.env.webkit)CKEDITOR.on(\"instanceReady\",function(a){var b=a.editor;b.on(\"selectionChange\",function(){var a=b.editable(),c=a.getCustomData(\"cke-fillingChar\");c&&(c.getCustomData(\"ready\")?l(a):c.setCustomData(\"ready\",1))},null,null,-1);b.on(\"beforeSetMode\",function(){l(b.editable())},null,null,-1);b.on(\"getSnapshot\",function(a){a.data&&(a.data=k(a.data))},b,null,20);b.on(\"toDataFormat\",\nfunction(a){a.data.dataValue=k(a.data.dataValue)},null,null,0)});CKEDITOR.editor.prototype.selectionChange=function(b){(b?a:d).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){return!this._.savedSelection&&!this._.fakeSelection||a?(a=this.editable())&&\"wysiwyg\"==this.mode?new CKEDITOR.dom.selection(a):null:this._.savedSelection||this._.fakeSelection};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);return a.getType()!=CKEDITOR.SELECTION_NONE?(!a.isLocked&&\na.lock(),this._.savedSelection=a,!0):!1};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;return b?(b.unlock(a),delete this._.savedSelection,!0):!1};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():\nnew CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var q=\"function\"!=typeof window.getSelection,y=1;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection){var b=a;a=a.root}var c=a instanceof CKEDITOR.dom.element;this.rev=b?b.rev:y++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=c?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(b)return CKEDITOR.tools.extend(this._.cache,\nb._.cache),this.isFake=b.isFake,this.isLocked=b.isLocked,this;a=this.getNative();var d,e;if(a)if(a.getRangeAt)d=(e=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(e.commonAncestorContainer);else{try{e=a.createRange()}catch(f){}d=e&&CKEDITOR.dom.element.get(e.item&&e.item(0)||e.parentElement())}if(!d||d.type!=CKEDITOR.NODE_ELEMENT&&d.type!=CKEDITOR.NODE_TEXT||!this.root.equals(d)&&!this.root.contains(d))this._.cache.type=CKEDITOR.SELECTION_NONE,this._.cache.startElement=null,this._.cache.selectedElement=\nnull,this._.cache.selectedText=\"\",this._.cache.ranges=new CKEDITOR.dom.rangeList;return this};var F={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1},t=CKEDITOR.tools.repeat(\"​\",7),z=new RegExp(t+\"( )?\",\"g\");CKEDITOR.tools.extend(CKEDITOR.dom.selection,{_removeFillingCharSequenceString:k,_createFillingCharSequenceNode:g,FILLING_CHAR_SEQUENCE:t});CKEDITOR.dom.selection.prototype={getNative:function(){return void 0!==\nthis._.cache.nativeSel?this._.cache.nativeSel:this._.cache.nativeSel=q?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:q?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;\"Text\"==d&&(b=CKEDITOR.SELECTION_TEXT);\"Control\"==d&&(b=CKEDITOR.SELECTION_ELEMENT);c.createRange().parentElement()&&(b=CKEDITOR.SELECTION_TEXT)}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=\nCKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(1==c.rangeCount){var c=c.getRangeAt(0),d=c.startContainer;d==c.endContainer&&1==d.nodeType&&1==c.endOffset-c.startOffset&&F[d.childNodes[c.startOffset].nodeName.toLowerCase()]&&(b=CKEDITOR.SELECTION_ELEMENT)}return a.type=b},getRanges:function(){var a=q?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement();if(!d.hasChildNodes())return{container:d,\noffset:0};for(var e=d.children,f,g,h=b.duplicate(),l=0,v=e.length-1,k=-1,m,E;l<=v;)if(k=Math.floor((l+v)/2),f=e[k],h.moveToElementText(f),m=h.compareEndPoints(\"StartToStart\",b),0<m)v=k-1;else if(0>m)l=k+1;else return{container:d,offset:a(f)};if(-1==k||k==e.length-1&&0>m){h.moveToElementText(d);h.setEndPoint(\"StartToStart\",b);h=h.text.replace(/(\\r\\n|\\r)/g,\"\\n\").length;e=d.childNodes;if(!h)return f=e[e.length-1],f.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length};\nfor(d=e.length;0<h&&0<d;)g=e[--d],g.nodeType==CKEDITOR.NODE_TEXT&&(E=g,h-=g.nodeValue.length);return{container:E,offset:-h}}h.collapse(0<m?!0:!1);h.setEndPoint(0<m?\"StartToStart\":\"EndToStart\",b);h=h.text.replace(/(\\r\\n|\\r)/g,\"\\n\").length;if(!h)return{container:d,offset:a(f)+(0<m?0:1)};for(;0<h;)try{g=f[0<m?\"previousSibling\":\"nextSibling\"],g.nodeType==CKEDITOR.NODE_TEXT&&(h-=g.nodeValue.length,E=g),f=g}catch(n){return{container:d,offset:a(f)}}return{container:E,offset:0<m?-h:E.nodeValue.length+h}};\nreturn function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT)return a=new CKEDITOR.dom.range(this.root),d=b(c,!0),a.setStart(new CKEDITOR.dom.node(d.container),d.offset),d=b(c),a.setEnd(new CKEDITOR.dom.node(d.container),d.offset),a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse(),[a];if(d==CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e<c.length;e++){for(var f=\nc.item(e),h=f.parentNode,g=0,a=new CKEDITOR.dom.range(this.root);g<h.childNodes.length&&h.childNodes[g]!=f;g++);a.setStart(new CKEDITOR.dom.node(h),g);a.setEnd(new CKEDITOR.dom.node(h),g+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset);b.setEnd(new CKEDITOR.dom.node(e.endContainer),e.endOffset);a.push(b)}return a};\nreturn function(b){var c=this._.cache,d=c.ranges;d||(c.ranges=d=new CKEDITOR.dom.rangeList(a.call(this)));return b?f(new CKEDITOR.dom.rangeList(d.slice())):d}}(),getStartElement:function(){var a=this._.cache;if(void 0!==a.startElement)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed)b=c.startContainer,b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());else{for(c.optimize();b=\nc.startContainer,c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary();)c.setStartAfter(b);b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();if((b=b.getChild(c.startOffset))&&b.type==CKEDITOR.NODE_ELEMENT)for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;)b=c,c=c.getFirst();else b=c.startContainer}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(void 0!==a.selectedElement)return a.selectedElement;\nvar b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},function(){for(var a=b.getRanges()[0].clone(),c,d,e=2;e&&!((c=a.getEnclosedNode())&&c.type==CKEDITOR.NODE_ELEMENT&&F[c.getName()]&&(d=c));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d&&d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(void 0!==a.selectedText)return a.selectedText;var b=this.getNative(),b=q?\"Control\"==b.type?\"\":b.createRange().text:\nb.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges(),d=this.isFake;this.isLocked=0;this.reset();a&&(a=b||c[0]&&c[0].getCommonAncestor())&&a.getAscendant(\"body\",1)&&(d?this.fake(b):b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={};this.isFake=\n0;var a=this.root.editor;if(a&&a._.fakeSelection)if(this.rev==a._.fakeSelection.rev){delete a._.fakeSelection;var b=a._.hiddenSelectionContainer;if(b){var c=a.checkDirty();a.fire(\"lockSnapshot\");b.remove();a.fire(\"unlockSnapshot\");!c&&a.resetDirty()}delete a._.hiddenSelectionContainer}else CKEDITOR.warn(\"selection-fake-reset\");this.rev=y++},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){var b=\nthis.root.editor,b=b&&b._.hiddenSelectionContainer;this.reset();if(b)for(var b=this.root,c,d=0;d<a.length;++d)c=a[d],c.endContainer.equals(b)&&(c.endOffset=Math.min(c.endOffset,b.getChildCount()));if(a.length)if(this.isLocked){var f=CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();f&&!f.equals(this.root)&&f.focus()}else{var k;a:{var n,w;if(1==a.length&&!(w=a[0]).collapsed&&(k=w.getEnclosedNode())&&k.type==CKEDITOR.NODE_ELEMENT&&(w=w.clone(),w.shrink(CKEDITOR.SHRINK_ELEMENT,\n!0),(n=w.getEnclosedNode())&&n.type==CKEDITOR.NODE_ELEMENT&&(k=n),\"false\"==k.getAttribute(\"contenteditable\")))break a;k=void 0}if(k)this.fake(k);else{if(q){w=CKEDITOR.dom.walker.whitespaces(!0);n=/\\ufeff|\\u00a0/;b={table:1,tbody:1,tr:1};1<a.length&&(k=a[a.length-1],a[0].setEnd(k.endContainer,k.endOffset));k=a[0];a=k.collapsed;var u,t,x;if((c=k.getEnclosedNode())&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in F&&(!c.is(\"a\")||!c.getText()))try{x=c.$.createControlRange();x.addElement(c.$);x.select();\nreturn}catch(v){}if(k.startContainer.type==CKEDITOR.NODE_ELEMENT&&k.startContainer.getName()in b||k.endContainer.type==CKEDITOR.NODE_ELEMENT&&k.endContainer.getName()in b)k.shrink(CKEDITOR.NODE_ELEMENT,!0),a=k.collapsed;x=k.createBookmark();b=x.startNode;a||(f=x.endNode);x=k.document.$.body.createTextRange();x.moveToElementText(b.$);x.moveStart(\"character\",1);f?(n=k.document.$.body.createTextRange(),n.moveToElementText(f.$),x.setEndPoint(\"EndToEnd\",n),x.moveEnd(\"character\",-1)):(u=b.getNext(w),t=\nb.hasAscendant(\"pre\"),u=!(u&&u.getText&&u.getText().match(n))&&(t||!b.hasPrevious()||b.getPrevious().is&&b.getPrevious().is(\"br\")),t=k.document.createElement(\"span\"),t.setHtml(\"\\x26#65279;\"),t.insertBefore(b),u&&k.document.createText(\"﻿\").insertBefore(b));k.setStartBefore(b);b.remove();a?(u?(x.moveStart(\"character\",-1),x.select(),k.document.$.selection.clear()):x.select(),k.moveToPosition(t,CKEDITOR.POSITION_BEFORE_START),t.remove()):(k.setEndBefore(f),f.remove(),x.select())}else{f=this.getNative();\nif(!f)return;this.removeAllRanges();for(x=0;x<a.length;x++){if(x<a.length-1&&(u=a[x],t=a[x+1],n=u.clone(),n.setStart(u.endContainer,u.endOffset),n.setEnd(t.startContainer,t.startOffset),!n.collapsed&&(n.shrink(CKEDITOR.NODE_ELEMENT,!0),k=n.getCommonAncestor(),n=n.getEnclosedNode(),k.isReadOnly()||n&&n.isReadOnly()))){t.setStart(u.startContainer,u.startOffset);a.splice(x--,1);continue}k=a[x];t=this.document.$.createRange();k.collapsed&&CKEDITOR.env.webkit&&e(k)&&(n=g(this.root),k.insertNode(n),(u=\nn.getNext())&&!n.getPrevious()&&u.type==CKEDITOR.NODE_ELEMENT&&\"br\"==u.getName()?(l(this.root),k.moveToPosition(u,CKEDITOR.POSITION_BEFORE_START)):k.moveToPosition(n,CKEDITOR.POSITION_AFTER_END));t.setStart(k.startContainer.$,k.startOffset);try{t.setEnd(k.endContainer.$,k.endOffset)}catch(D){if(0<=D.toString().indexOf(\"NS_ERROR_ILLEGAL_VALUE\"))k.collapse(1),t.setEnd(k.endContainer.$,k.endOffset);else throw D;}f.addRange(t)}}this.reset();this.root.fire(\"selectionchange\")}}},fake:function(a){var b=\nthis.root.editor;this.reset();n(b);var c=this._.cache,d=new CKEDITOR.dom.range(this.root);d.setStartBefore(a);d.setEndAfter(a);c.ranges=new CKEDITOR.dom.rangeList(d);c.selectedElement=c.startElement=a;c.type=CKEDITOR.SELECTION_ELEMENT;c.selectedText=c.nativeSel=null;this.isFake=1;this.rev=y++;b._.fakeSelection=this;this.root.fire(\"selectionchange\")},isHidden:function(){var a=this.getCommonAncestor();a&&a.type==CKEDITOR.NODE_TEXT&&(a=a.getParent());return!(!a||!a.data(\"cke-hidden-sel\"))},createBookmarks:function(a){a=\nthis.getRanges().createBookmarks(a);this.isFake&&(a.isFake=1);return a},createBookmarks2:function(a){a=this.getRanges().createBookmarks2(a);this.isFake&&(a.isFake=1);return a},selectBookmarks:function(a){for(var b=[],c,d=0;d<a.length;d++){var e=new CKEDITOR.dom.range(this.root);e.moveToBookmark(a[d]);b.push(e)}a.isFake&&(c=b[0].getEnclosedNode(),c&&c.type==CKEDITOR.NODE_ELEMENT||(CKEDITOR.warn(\"selection-not-fake\"),a.isFake=0));a.isFake?this.fake(c):this.selectRanges(b);return this},getCommonAncestor:function(){var a=\nthis.getRanges();return a.length?a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer):null},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){if(this.getType()!=CKEDITOR.SELECTION_NONE){var a=this.getNative();try{a&&a[q?\"empty\":\"removeAllRanges\"]()}catch(b){}this.reset()}}}})();\"use strict\";CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3;\n(function(){function a(a,b){for(var c,d;(a=a.getParent())&&!a.equals(b);)if(a.getAttribute(\"data-nostyle\"))c=a;else if(!d){var e=a.getAttribute(\"contentEditable\");\"false\"==e?c=a:\"true\"==e&&(d=1)}return c}function d(a,b,c,d){return(a.getPosition(b)|d)==d&&(!c.childRule||c.childRule(a))}function b(c){var f=c.document;if(c.collapsed)f=F(this,f),c.insertNode(f),c.moveToPosition(f,CKEDITOR.POSITION_BEFORE_END);else{var g=this.element,h=this._.definition,l,k=h.ignoreReadonly,m=k||h.includeReadonly;null==\nm&&(m=c.root.getCustomData(\"cke_includeReadonly\"));var n=CKEDITOR.dtd[g];n||(l=!0,n=CKEDITOR.dtd.span);c.enlarge(CKEDITOR.ENLARGE_INLINE,1);c.trim();var p=c.createBookmark(),q=p.startNode,w=p.endNode,r=q,u;if(!k){var x=c.getCommonAncestor(),k=a(q,x),x=a(w,x);k&&(r=k.getNextSourceNode(!0));x&&(w=x)}for(r.getPosition(w)==CKEDITOR.POSITION_FOLLOWING&&(r=0);r;){k=!1;if(r.equals(w))r=null,k=!0;else{var t=r.type==CKEDITOR.NODE_ELEMENT?r.getName():null,x=t&&\"false\"==r.getAttribute(\"contentEditable\"),y=t&&\nr.getAttribute(\"data-nostyle\");if(t&&r.data(\"cke-bookmark\")){r=r.getNextSourceNode(!0);continue}if(x&&m&&CKEDITOR.dtd.$block[t])for(var A=r,z=e(A),C=void 0,G=z.length,H=0,A=G&&new CKEDITOR.dom.range(A.getDocument());H<G;++H){var C=z[H],R=CKEDITOR.filter.instances[C.data(\"cke-filter\")];if(R?R.check(this):1)A.selectNodeContents(C),b.call(this,A)}z=t?!n[t]||y?0:x&&!m?0:d(r,w,h,M):1;if(z)if(C=r.getParent(),z=h,G=g,H=l,!C||!(C.getDtd()||CKEDITOR.dtd.span)[G]&&!H||z.parentRule&&!z.parentRule(C))k=!0;else{if(u||\nt&&CKEDITOR.dtd.$removeEmpty[t]&&(r.getPosition(w)|M)!=M||(u=c.clone(),u.setStartBefore(r)),t=r.type,t==CKEDITOR.NODE_TEXT||x||t==CKEDITOR.NODE_ELEMENT&&!r.getChildCount()){for(var t=r,Y;(k=!t.getNext(K))&&(Y=t.getParent(),n[Y.getName()])&&d(Y,q,h,Q);)t=Y;u.setEndAfter(t)}}else k=!0;r=r.getNextSourceNode(y||x)}if(k&&u&&!u.collapsed){for(var k=F(this,f),x=k.hasAttributes(),y=u.getCommonAncestor(),t={},z={},C={},G={},U,P,da;k&&y;){if(y.getName()==g){for(U in h.attributes)!G[U]&&(da=y.getAttribute(P))&&\n(k.getAttribute(U)==da?z[U]=1:G[U]=1);for(P in h.styles)!C[P]&&(da=y.getStyle(P))&&(k.getStyle(P)==da?t[P]=1:C[P]=1)}y=y.getParent()}for(U in z)k.removeAttribute(U);for(P in t)k.removeStyle(P);x&&!k.hasAttributes()&&(k=null);k?(u.extractContents().appendTo(k),u.insertNode(k),B.call(this,k),k.mergeSiblings(),CKEDITOR.env.ie||k.$.normalize()):(k=new CKEDITOR.dom.element(\"span\"),u.extractContents().appendTo(k),u.insertNode(k),B.call(this,k),k.remove(!0));u=null}}c.moveToBookmark(p);c.shrink(CKEDITOR.SHRINK_TEXT);\nc.shrink(CKEDITOR.NODE_ELEMENT,!0)}}function c(a){function b(){for(var a=new CKEDITOR.dom.elementPath(d.getParent()),c=new CKEDITOR.dom.elementPath(m.getParent()),e=null,f=null,g=0;g<a.elements.length;g++){var h=a.elements[g];if(h==a.block||h==a.blockLimit)break;n.checkElementRemovable(h,!0)&&(e=h)}for(g=0;g<c.elements.length;g++){h=c.elements[g];if(h==c.block||h==c.blockLimit)break;n.checkElementRemovable(h,!0)&&(f=h)}f&&m.breakParent(f);e&&d.breakParent(e)}a.enlarge(CKEDITOR.ENLARGE_INLINE,1);var c=\na.createBookmark(),d=c.startNode;if(a.collapsed){for(var e=new CKEDITOR.dom.elementPath(d.getParent(),a.root),f,g=0,k;g<e.elements.length&&(k=e.elements[g])&&k!=e.block&&k!=e.blockLimit;g++)if(this.checkElementRemovable(k)){var l;a.collapsed&&(a.checkBoundaryOfElement(k,CKEDITOR.END)||(l=a.checkBoundaryOfElement(k,CKEDITOR.START)))?(f=k,f.match=l?\"start\":\"end\"):(k.mergeSiblings(),k.is(this.element)?u.call(this,k):q(k,h(this)[k.getName()]))}if(f){k=d;for(g=0;;g++){l=e.elements[g];if(l.equals(f))break;\nelse if(l.match)continue;else l=l.clone();l.append(k);k=l}k[\"start\"==f.match?\"insertBefore\":\"insertAfter\"](f)}}else{var m=c.endNode,n=this;b();for(e=d;!e.equals(m);)f=e.getNextSourceNode(),e.type==CKEDITOR.NODE_ELEMENT&&this.checkElementRemovable(e)&&(e.getName()==this.element?u.call(this,e):q(e,h(this)[e.getName()]),f.type==CKEDITOR.NODE_ELEMENT&&f.contains(d)&&(b(),f=d.getNext())),e=f}a.moveToBookmark(c);a.shrink(CKEDITOR.NODE_ELEMENT,!0)}function e(a){var b=[];a.forEach(function(a){if(\"true\"==\na.getAttribute(\"contenteditable\"))return b.push(a),!1},CKEDITOR.NODE_ELEMENT,!0);return b}function g(a){var b=a.getEnclosedNode()||a.getCommonAncestor(!1,!0);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&t(a,this)}function l(a){var b=a.getCommonAncestor(!0,!0);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&&\na.removeStyle(e)}}function k(a){var b=a.createBookmark(!0),c=a.createIterator();c.enforceRealBlocks=!0;this._.enterMode&&(c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR);for(var d,e=a.document,f;d=c.getNextParagraph();)!d.isReadOnly()&&(c.activeFilter?c.activeFilter.check(this):1)&&(f=F(this,e,d),w(d,f));a.moveToBookmark(b)}function n(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=!0;c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e;d=c.getNextParagraph();)this.checkElementRemovable(d)&&\n(d.is(\"pre\")?((e=this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?\"p\":\"div\"))&&d.copyAttributes(e),w(d,e)):u.call(this,d));a.moveToBookmark(b)}function w(a,b){var c=!b;c&&(b=a.getDocument().createElement(\"div\"),a.copyAttributes(b));var d=b&&b.is(\"pre\"),e=a.is(\"pre\"),g=!d&&e;if(d&&!e){e=b;(g=a.getBogus())&&g.remove();g=a.getHtml();g=x(g,/(?:^[ \\t\\n\\r]+)|(?:[ \\t\\n\\r]+$)/g,\"\");g=g.replace(/[ \\t\\r\\n]*(<br[^>]*>)[ \\t\\r\\n]*/gi,\"$1\");g=g.replace(/([ \\t\\n\\r]+|&nbsp;)/g,\n\" \");g=g.replace(/<br\\b[^>]*>/gi,\"\\n\");if(CKEDITOR.env.ie){var h=a.getDocument().createElement(\"div\");h.append(e);e.$.outerHTML=\"\\x3cpre\\x3e\"+g+\"\\x3c/pre\\x3e\";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(g);b=e}else g?b=A(c?[a.getHtml()]:f(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,k;(k=c.getPrevious(R))&&k.type==CKEDITOR.NODE_ELEMENT&&k.is(\"pre\")&&(d=x(k.getHtml(),/\\n$/,\"\")+\"\\n\\n\"+x(c.getHtml(),/^\\n/,\"\"),CKEDITOR.env.ie?c.$.outerHTML=\"\\x3cpre\\x3e\"+d+\"\\x3c/pre\\x3e\":\nc.setHtml(d),k.remove())}else c&&y(b)}function f(a){var b=[];x(a.getOuterHtml(),/(\\S\\s*)\\n(?:\\s|(<span[^>]+data-cke-bookmark.*?\\/span>))*\\n(?!$)/gi,function(a,b,c){return b+\"\\x3c/pre\\x3e\"+c+\"\\x3cpre\\x3e\"}).replace(/<pre\\b.*?>([\\s\\S]*?)<\\/pre>/gi,function(a,c){b.push(c)});return b}function x(a,b,c){var d=\"\",e=\"\";a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\\/span>)|(<span[^>]+data-cke-bookmark.*?\\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return\"\"});return d+a.replace(b,c)+e}function A(a,b){var c;\n1<a.length&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\\r\\n|\\r)/g,\"\\n\"),e=x(e,/^[ \\t]*\\n/,\"\"),e=x(e,/\\n$/,\"\"),e=x(e,/^[ \\t]+|[ \\t]+$/g,function(a,b){return 1==a.length?\"\\x26nbsp;\":b?\" \"+CKEDITOR.tools.repeat(\"\\x26nbsp;\",a.length-1):CKEDITOR.tools.repeat(\"\\x26nbsp;\",a.length-1)+\" \"}),e=e.replace(/\\n/g,\"\\x3cbr\\x3e\"),e=e.replace(/[ \\t]{2,}/g,function(a){return CKEDITOR.tools.repeat(\"\\x26nbsp;\",a.length-1)+\" \"});if(c){var f=b.clone();f.setHtml(e);\nc.append(f)}else b.setHtml(e)}return c||b}function u(a,b){var c=this._.definition,d=c.attributes,c=c.styles,e=h(this)[a.getName()],f=CKEDITOR.tools.isEmpty(d)&&CKEDITOR.tools.isEmpty(c),g;for(g in d)if(\"class\"!=g&&!this._.definition.fullMatch||a.getAttribute(g)==p(g,d[g]))b&&\"data-\"==g.slice(0,5)||(f=a.hasAttribute(g),a.removeAttribute(g));for(var k in c)this._.definition.fullMatch&&a.getStyle(k)!=p(k,c[k],!0)||(f=f||!!a.getStyle(k),a.removeStyle(k));q(a,e,C[a.getName()]);f&&(this._.definition.alwaysRemoveElement?\ny(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==CKEDITOR.ENTER_BR&&!a.hasAttributes()?y(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?\"p\":\"div\"))}function B(a){for(var b=h(this),c=a.getElementsByTag(this.element),d,e=c.count();0<=--e;)d=c.getItem(e),d.isReadOnly()||u.call(this,d,!0);for(var f in b)if(f!=this.element)for(c=a.getElementsByTag(f),e=c.count()-1;0<=e;e--)d=c.getItem(e),d.isReadOnly()||q(d,b[f])}function q(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=b[d][0],\nf;if(f=a.getAttribute(e)){var g=b[d][1];(null===g||g.test&&g.test(f)||\"string\"==typeof g&&f==g)&&a.removeAttribute(e)}}c||y(a)}function y(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(R),d=a.getNext(R);!c||c.type!=CKEDITOR.NODE_TEXT&&c.isBlockBoundary({br:1})||a.append(\"br\",1);!d||d.type!=CKEDITOR.NODE_TEXT&&d.isBlockBoundary({br:1})||a.append(\"br\");a.remove(!0)}else c=a.getFirst(),d=a.getLast(),a.remove(!0),c&&(c.type==CKEDITOR.NODE_ELEMENT&&c.mergeSiblings(),\nd&&!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT&&d.mergeSiblings())}function F(a,b,c){var d;d=a.element;\"*\"==d&&(d=\"span\");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=t(d,a);b.getCustomData(\"doc_processing_style\")&&d.hasAttribute(\"id\")?d.removeAttribute(\"id\"):b.setCustomData(\"doc_processing_style\",1);return d}function t(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute(\"style\",c);return a}function z(a,\nb){for(var c in a)a[c]=a[c].replace(H,function(a,c){return b[c]})}function h(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;\"string\"==typeof e?f=e.toLowerCase():(f=e.element?e.element.toLowerCase():a.element,g=e.attributes);e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function p(a,b,c){var d=new CKEDITOR.dom.element(\"span\");\nd[c?\"setStyle\":\"setAttribute\"](a,b);return d[c?\"getStyle\":\"getAttribute\"](a)}function m(a,b,c){var d=a.document,e=a.getRanges();b=b?this.removeFromRange:this.applyToRange;for(var f,g=e.createIterator();f=g.getNextRange();)b.call(this,f,c);a.selectRanges(e);d.removeCustomData(\"doc_processing_style\")}var C={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,\ndetails:1,datagrid:1,datalist:1},r={a:1,blockquote:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},G=/\\s*(?:;\\s*|$)/,H=/#\\((.+?)\\)/g,K=CKEDITOR.dom.walker.bookmark(0,1),R=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){if(\"string\"==typeof a.type)return new CKEDITOR.style.customHandlers[a.type](a);var c=a.attributes;c&&c.style&&(a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style)),delete c.style);\nb&&(a=CKEDITOR.tools.clone(a),z(a.attributes,b),z(a.styles,b));c=this.element=a.element?\"string\"==typeof a.element?a.element.toLowerCase():a.element:\"*\";this.type=a.type||(C[c]?CKEDITOR.STYLE_BLOCK:r[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);\"object\"==typeof this.element&&(this.type=CKEDITOR.STYLE_OBJECT);this._={definition:a}};CKEDITOR.style.prototype={apply:function(a){if(a instanceof CKEDITOR.dom.document)return m.call(this,a.getSelection());if(this.checkApplicable(a.elementPath(),a)){var b=\nthis._.enterMode;b||(this._.enterMode=a.activeEnterMode);m.call(this,a.getSelection(),0,a);this._.enterMode=b}},remove:function(a){if(a instanceof CKEDITOR.dom.document)return m.call(this,a.getSelection(),1);if(this.checkApplicable(a.elementPath(),a)){var b=this._.enterMode;b||(this._.enterMode=a.activeEnterMode);m.call(this,a.getSelection(),1,a);this._.enterMode=b}},applyToRange:function(a){this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?b:this.type==CKEDITOR.STYLE_BLOCK?k:this.type==CKEDITOR.STYLE_OBJECT?\ng:null;return this.applyToRange(a)},removeFromRange:function(a){this.removeFromRange=this.type==CKEDITOR.STYLE_INLINE?c:this.type==CKEDITOR.STYLE_BLOCK?n:this.type==CKEDITOR.STYLE_OBJECT?l:null;return this.removeFromRange(a)},applyToObject:function(a){t(a,this)},checkActive:function(a,b){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block||a.blockLimit,!0,b);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var c=a.elements,d=0,e;d<c.length;d++)if(e=c[d],\nthis.type!=CKEDITOR.STYLE_INLINE||e!=a.block&&e!=a.blockLimit){if(this.type==CKEDITOR.STYLE_OBJECT){var f=e.getName();if(!(\"string\"==typeof this.element?f==this.element:f in this.element))continue}if(this.checkElementRemovable(e,!0,b))return!0}}return!1},checkApplicable:function(a,b,c){b&&b instanceof CKEDITOR.filter&&(c=b);if(c&&!c.check(this))return!1;switch(this.type){case CKEDITOR.STYLE_OBJECT:return!!a.contains(this.element);case CKEDITOR.STYLE_BLOCK:return!!a.blockLimit.getDtd()[this.element]}return!0},\ncheckElementMatch:function(a,b){var c=this._.definition;if(!a||!c.ignoreReadonly&&a.isReadOnly())return!1;var d=a.getName();if(\"string\"==typeof this.element?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return!0;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f)e++,d[g]=f[g];if(g=CKEDITOR.style.getStyleText(c))d.style||e++,d.style=g;d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(\"_length\"!=h){e=a.getAttribute(h)||\"\";if(\"style\"==h)a:{d=c[h];\"string\"==typeof d&&\n(d=CKEDITOR.tools.parseCssText(d));\"string\"==typeof e&&(e=CKEDITOR.tools.parseCssText(e,!0));g=void 0;for(g in d)if(!(g in e)||e[g]!=d[g]&&\"inherit\"!=d[g]&&\"inherit\"!=e[g]){d=!1;break a}d=!0}else d=c[h]==e;if(d){if(!b)return!0}else if(b)return!1}if(b)return!0}else return!0}return!1},checkElementRemovable:function(a,b,c){if(this.checkElementMatch(a,b,c))return!0;if(b=h(this)[a.getName()]){var d;if(!(b=b.attributes))return!0;for(c=0;c<b.length;c++)if(d=b[c][0],d=a.getAttribute(d)){var e=b[c][1];if(null===\ne)return!0;if(\"string\"==typeof e){if(d==e)return!0}else if(e.test(d))return!0}}return!1},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;\"bdo\"==d&&(d=\"span\");var c=[\"\\x3c\",d],e=b.attributes;if(e)for(var f in e)c.push(\" \",f,'\\x3d\"',e[f],'\"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style\\x3d\"',e,'\"');c.push(\"\\x3e\",a||b.name,\"\\x3c/\",d,\"\\x3e\");return c.join(\"\")},getDefinition:function(){return this._.definition}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;\nvar b=a.styles,c=a.attributes&&a.attributes.style||\"\",d=\"\";c.length&&(c=c.replace(G,\";\"));for(var e in b){var f=b[e],g=(e+\":\"+f).replace(G,\";\");\"inherit\"==f?d+=g:c+=g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,!0));return a._ST=c+d};CKEDITOR.style.customHandlers={};CKEDITOR.style.addCustomHandler=function(a){var b=function(a){this._={definition:a};this.setup&&this.setup(a)};b.prototype=CKEDITOR.tools.extend(CKEDITOR.tools.prototypedCopy(CKEDITOR.style.prototype),{assignedTo:CKEDITOR.STYLE_OBJECT},\na,!0);return this.customHandlers[a.type]=b};var M=CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED,Q=CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED})();CKEDITOR.styleCommand=function(a,d){this.requiredContent=this.allowedContent=this.style=a;CKEDITOR.tools.extend(this,d,!0)};\nCKEDITOR.styleCommand.prototype.exec=function(a){a.focus();this.state==CKEDITOR.TRISTATE_OFF?a.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&a.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager(\"\",\"stylesSet\");CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(a,d,b){CKEDITOR.stylesSet.addExternal(a,d,\"\");CKEDITOR.stylesSet.load(a,b)};\nCKEDITOR.tools.extend(CKEDITOR.editor.prototype,{attachStyleStateChange:function(a,d){var b=this._.styleStateChangeCallbacks;b||(b=this._.styleStateChangeCallbacks=[],this.on(\"selectionChange\",function(a){for(var d=0;d<b.length;d++){var g=b[d],l=g.style.checkActive(a.data.path,this)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;g.fn.call(this,l)}}));b.push({style:a,fn:d})},applyStyle:function(a){a.apply(this)},removeStyle:function(a){a.remove(this)},getStylesSet:function(a){if(this._.stylesDefinitions)a(this._.stylesDefinitions);\nelse{var d=this,b=d.config.stylesCombo_stylesSet||d.config.stylesSet;if(!1===b)a(null);else if(b instanceof Array)d._.stylesDefinitions=b,a(b);else{b||(b=\"default\");var b=b.split(\":\"),c=b[0];CKEDITOR.stylesSet.addExternal(c,b[1]?b.slice(1).join(\":\"):CKEDITOR.getUrl(\"styles.js\"),\"\");CKEDITOR.stylesSet.load(c,function(b){d._.stylesDefinitions=b[c];a(d._.stylesDefinitions)})}}}});\nCKEDITOR.dom.comment=function(a,d){\"string\"==typeof a&&(a=(d?d.$:document).createComment(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return\"\\x3c!--\"+this.$.nodeValue+\"--\\x3e\"}});\"use strict\";\n(function(){var a={},d={},b;for(b in CKEDITOR.dtd.$blockLimit)b in CKEDITOR.dtd.$list||(a[b]=1);for(b in CKEDITOR.dtd.$block)b in CKEDITOR.dtd.$blockLimit||b in CKEDITOR.dtd.$empty||(d[b]=1);CKEDITOR.dom.elementPath=function(b,e){var g=null,l=null,k=[],n=b,w;e=e||b.getDocument().getBody();do if(n.type==CKEDITOR.NODE_ELEMENT){k.push(n);if(!this.lastElement&&(this.lastElement=n,n.is(CKEDITOR.dtd.$object)||\"false\"==n.getAttribute(\"contenteditable\")))continue;if(n.equals(e))break;if(!l&&(w=n.getName(),\n\"true\"==n.getAttribute(\"contenteditable\")?l=n:!g&&d[w]&&(g=n),a[w])){if(w=!g&&\"div\"==w){a:{w=n.getChildren();for(var f=0,x=w.count();f<x;f++){var A=w.getItem(f);if(A.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[A.getName()]){w=!0;break a}}w=!1}w=!w}w?g=n:l=n}}while(n=n.getParent());l||(l=e);this.block=g;this.blockLimit=l;this.root=e;this.elements=k}})();\nCKEDITOR.dom.elementPath.prototype={compare:function(a){var d=this.elements;a=a&&a.elements;if(!a||d.length!=a.length)return!1;for(var b=0;b<d.length;b++)if(!d[b].equals(a[b]))return!1;return!0},contains:function(a,d,b){var c;\"string\"==typeof a&&(c=function(b){return b.getName()==a});a instanceof CKEDITOR.dom.element?c=function(b){return b.equals(a)}:CKEDITOR.tools.isArray(a)?c=function(b){return-1<CKEDITOR.tools.indexOf(a,b.getName())}:\"function\"==typeof a?c=a:\"object\"==typeof a&&(c=function(b){return b.getName()in\na});var e=this.elements,g=e.length;d&&g--;b&&(e=Array.prototype.slice.call(e,0),e.reverse());for(d=0;d<g;d++)if(c(e[d]))return e[d];return null},isContextFor:function(a){var d;return a in CKEDITOR.dtd.$block?(d=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit,!!d.getDtd()[a]):!0},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}};\nCKEDITOR.dom.text=function(a,d){\"string\"==typeof a&&(a=(d?d.$:document).createTextNode(a));this.$=a};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node;\nCKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(a){this.$.nodeValue=a},split:function(a){var d=this.$.parentNode,b=d.childNodes.length,c=this.getLength(),e=this.getDocument(),g=new CKEDITOR.dom.text(this.$.splitText(a),e);d.childNodes.length==b&&(a>=c?(g=e.createText(\"\"),g.insertAfter(this)):(a=e.createText(\"\"),a.insertAfter(g),a.remove()));return g},substring:function(a,\nd){return\"number\"!=typeof d?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,d)}});\n(function(){function a(a,c,d){var g=a.serializable,l=c[d?\"endContainer\":\"startContainer\"],k=d?\"endOffset\":\"startOffset\",n=g?c.document.getById(a.startNode):a.startNode;a=g?c.document.getById(a.endNode):a.endNode;l.equals(n.getPrevious())?(c.startOffset=c.startOffset-l.getLength()-a.getPrevious().getLength(),l=a.getNext()):l.equals(a.getPrevious())&&(c.startOffset-=l.getLength(),l=a.getNext());l.equals(n.getParent())&&c[k]++;l.equals(a.getParent())&&c[k]++;c[d?\"endContainer\":\"startContainer\"]=l;return c}\nCKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,d)};var d={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),d=[],g;return{getNextRange:function(l){g=void 0===g?0:g+1;var k=a[g];if(k&&1<a.length){if(!g)for(var n=a.length-1;0<=n;n--)d.unshift(a[n].createBookmark(!0));if(l)for(var w=0;a[g+w+1];){var f=k.document;l=0;n=f.getById(d[w].endNode);for(f=f.getById(d[w+1].startNode);;){n=\nn.getNextSourceNode(!1);if(f.equals(n))l=1;else if(c(n)||n.type==CKEDITOR.NODE_ELEMENT&&n.isBlockBoundary())continue;break}if(!l)break;w++}for(k.moveToBookmark(d.shift());w--;)n=a[++g],n.moveToBookmark(d.shift()),k.setEnd(n.endContainer,n.endOffset)}return k}}},createBookmarks:function(b){for(var c=[],d,g=0;g<this.length;g++){c.push(d=this[g].createBookmark(b,!0));for(var l=g+1;l<this.length;l++)this[l]=a(d,this[l]),this[l]=a(d,this[l],!0)}return c},createBookmarks2:function(a){for(var c=[],d=0;d<\nthis.length;d++)c.push(this[d].createBookmark2(a));return c},moveToBookmarks:function(a){for(var c=0;c<this.length;c++)this[c].moveToBookmark(a[c])}}})();\n(function(){function a(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(\",\")[1]||\"skins/\"+CKEDITOR.skinName.split(\",\")[0]+\"/\")}function d(b){var c=CKEDITOR.skin[\"ua_\"+b],d=CKEDITOR.env;if(c)for(var c=c.split(\",\").sort(function(a,b){return a>b?-1:1}),e=0,g;e<c.length;e++)if(g=c[e],d.ie&&(g.replace(/^ie/,\"\")==d.version||d.quirks&&\"iequirks\"==g)&&(g=\"ie\"),d[g]){b+=\"_\"+c[e];break}return CKEDITOR.getUrl(a()+b+\".css\")}function b(a,b){g[a]||(CKEDITOR.document.appendStyleSheet(d(a)),g[a]=1);b&&b()}function c(a){var b=\na.getById(l);b||(b=a.getHead().append(\"style\"),b.setAttribute(\"id\",l),b.setAttribute(\"type\",\"text/css\"));return b}function e(a,b,c){var d,e,g;if(CKEDITOR.env.webkit)for(b=b.split(\"}\").slice(0,-1),e=0;e<b.length;e++)b[e]=b[e].split(\"{\");for(var k=0;k<a.length;k++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){g=b[e][1];for(d=0;d<c.length;d++)g=g.replace(c[d][0],c[d][1]);a[k].$.sheet.addRule(b[e][0],g)}else{g=b;for(d=0;d<c.length;d++)g=g.replace(c[d][0],c[d][1]);CKEDITOR.env.ie&&11>CKEDITOR.env.version?\na[k].$.styleSheet.cssText+=g:a[k].$.innerHTML+=g}}var g={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(\",\")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+\"skin.js\"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(d(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||\"16px\"})},getIconStyle:function(a,b,c,d,e){var g;a&&(a=a.toLowerCase(),b&&(g=this.icons[a+\"-rtl\"]),\ng||(g=this.icons[a]));a=c||g&&g.path||\"\";d=d||g&&g.offset;e=e||g&&g.bgsize||\"16px\";a&&(a=a.replace(/'/g,\"\\\\'\"));return a&&\"background-image:url('\"+CKEDITOR.getUrl(a)+\"');background-position:0 \"+d+\"px;background-size:\"+e+\";\"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){this.uiColor=a;var c=CKEDITOR.skin.chameleon,d=\"\",g=\"\";\"function\"==typeof c&&(d=c(this,\"editor\"),g=\nc(this,\"panel\"));a=[[n,a]];e([b],d,a);e(k,g,a)}).call(this,a)}});var l=\"cke_ui_color\",k=[],n=/\\$color/g;CKEDITOR.on(\"instanceLoaded\",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor;a=function(a){a=(a.data[0]||a.data).element.getElementsByTag(\"iframe\").getItem(0).getFrameDocument();if(!a.getById(\"cke_ui_color\")){a=c(a);k.push(a);var d=b.getUiColor();d&&e([a],CKEDITOR.skin.chameleon(b,\"panel\"),[[n,d]])}};b.on(\"panelShow\",a);b.on(\"menuShow\",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})();\n(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=!1;else{var a=CKEDITOR.dom.element.createFromHtml('\\x3cdiv style\\x3d\"width:0;height:0;position:absolute;left:-10000px;border:1px solid;border-color:red blue\"\\x3e\\x3c/div\\x3e',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{var d=a.getComputedStyle(\"border-top-color\"),b=a.getComputedStyle(\"border-right-color\");CKEDITOR.env.hc=!(!d||d!=b)}catch(c){CKEDITOR.env.hc=!1}a.remove()}CKEDITOR.env.hc&&(CKEDITOR.env.cssClass+=\" cke_hc\");CKEDITOR.document.appendStyleText(\".cke{visibility:hidden;}\");\nCKEDITOR.status=\"loaded\";CKEDITOR.fireOnce(\"loaded\");if(a=CKEDITOR._.pending)for(delete CKEDITOR._.pending,d=0;d<a.length;d++)CKEDITOR.editor.prototype.constructor.apply(a[d][0],a[d][1]),CKEDITOR.add(a[d][0])})();/*\n Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.skin.name=\"moonocolor\";CKEDITOR.skin.ua_editor=\"ie,iequirks,ie7,ie8,gecko\";CKEDITOR.skin.ua_dialog=\"ie,iequirks,ie7,ie8\";\nCKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=(\"0\"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return\"#\"+a.join(\"\")}}(),c=function(){var b=new CKEDITOR.template(\"background:#{to};background-image:linear-gradient(to bottom,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');\");return function(c,a){return b.output({from:c,\nto:a})}}(),f={editor:new CKEDITOR.template(\"{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] \"),\npanel:new CKEDITOR.template(\".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] \")};\nreturn function(g,e){var a=g.uiColor,a={id:\".\"+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c(\"#FFFFFF\",\"#FFFFFF\"),dialogTabSelectedBorder:\"#FFF\",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\\[/g,\n\"{\").replace(/\\]/g,\"}\")}}();CKEDITOR.plugins.add(\"dialogui\",{onLoad:function(){var h=function(b){this._||(this._={});this._[\"default\"]=this._.initValue=b[\"default\"]||\"\";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},v={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},n={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},q={isChanged:function(){return this.getValue()!=\nthis.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._[\"default\"]},getInitValue:function(){return this._.initValue}},r=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on(\"load\",function(){this.getInputElement().on(\"change\",function(){b.parts.dialog.isVisible()&&this.fire(\"change\",{value:this.getValue()})},\nthis)},this),this._.domOnChangeRegistered=!0);this.on(\"change\",a)}},!0),x=/^on([A-Z]\\w+)/,t=function(b){for(var a in b)(x.test(a)||\"title\"==a||\"type\"==a)&&delete b[a];return b},w=function(b){b=b.data.getKeystroke();b==CKEDITOR.SHIFT+CKEDITOR.ALT+36?this.setDirectionMarker(\"ltr\"):b==CKEDITOR.SHIFT+CKEDITOR.ALT+35&&this.setDirectionMarker(\"rtl\")};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,f){if(!(4>arguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+\n\"_label\";this._.children=[];var e={role:a.role||\"presentation\"};a.includeLabel&&(e[\"aria-labelledby\"]=c.labelId);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,\"div\",null,e,function(){var e=[],g=a.required?\" cke_required\":\"\";\"horizontal\"!=a.labelLayout?e.push('\\x3clabel class\\x3d\"cke_dialog_ui_labeled_label'+g+'\" ',' id\\x3d\"'+c.labelId+'\"',c.inputId?' for\\x3d\"'+c.inputId+'\"':\"\",(a.labelStyle?' style\\x3d\"'+a.labelStyle+'\"':\"\")+\"\\x3e\",a.label,\"\\x3c/label\\x3e\",'\\x3cdiv class\\x3d\"cke_dialog_ui_labeled_content\"',\na.controlStyle?' style\\x3d\"'+a.controlStyle+'\"':\"\",' role\\x3d\"presentation\"\\x3e',f.call(this,b,a),\"\\x3c/div\\x3e\"):(g={type:\"hbox\",widths:a.widths,padding:0,children:[{type:\"html\",html:'\\x3clabel class\\x3d\"cke_dialog_ui_labeled_label'+g+'\" id\\x3d\"'+c.labelId+'\" for\\x3d\"'+c.inputId+'\"'+(a.labelStyle?' style\\x3d\"'+a.labelStyle+'\"':\"\")+\"\\x3e\"+CKEDITOR.tools.htmlEncode(a.label)+\"\\x3c/label\\x3e\"},{type:\"html\",html:'\\x3cspan class\\x3d\"cke_dialog_ui_labeled_content\"'+(a.controlStyle?' style\\x3d\"'+a.controlStyle+\n'\"':\"\")+\"\\x3e\"+f.call(this,b,a)+\"\\x3c/span\\x3e\"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,g,e));return e.join(\"\")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this._.inputId=CKEDITOR.tools.getNextId()+\"_textInput\",c={\"class\":\"cke_dialog_ui_input_\"+a.type,id:f,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var e=this,m=!1;b.on(\"load\",function(){e.getInputElement().on(\"keydown\",\nfunction(a){13==a.data.getKeystroke()&&(m=!0)});e.getInputElement().on(\"keyup\",function(a){13==a.data.getKeystroke()&&m&&(b.getButton(\"ok\")&&setTimeout(function(){b.getButton(\"ok\").click()},0),m=!1);e.bidi&&w.call(e,a)},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=['\\x3cdiv class\\x3d\"cke_dialog_ui_input_',a.type,'\" role\\x3d\"presentation\"'];a.width&&b.push('style\\x3d\"width:'+a.width+'\" ');b.push(\"\\x3e\\x3cinput \");c[\"aria-labelledby\"]=this._.labelId;this._.required&&\n(c[\"aria-required\"]=this._.required);for(var e in c)b.push(e+'\\x3d\"'+c[e]+'\" ');b.push(\" /\\x3e\\x3c/div\\x3e\");return b.join(\"\")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this,c=this._.inputId=CKEDITOR.tools.getNextId()+\"_textarea\",e={};a.validate&&(this.validate=a.validate);e.rows=a.rows||5;e.cols=a.cols||20;e[\"class\"]=\"cke_dialog_ui_input_textarea \"+(a[\"class\"]||\"\");\"undefined\"!=typeof a.inputStyle&&(e.style=a.inputStyle);a.dir&&(e.dir=a.dir);if(f.bidi)b.on(\"load\",\nfunction(){f.getInputElement().on(\"keyup\",w)},f);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e[\"aria-labelledby\"]=this._.labelId;this._.required&&(e[\"aria-required\"]=this._.required);var a=['\\x3cdiv class\\x3d\"cke_dialog_ui_input_textarea\" role\\x3d\"presentation\"\\x3e\\x3ctextarea id\\x3d\"',c,'\" '],b;for(b in e)a.push(b+'\\x3d\"'+CKEDITOR.tools.htmlEncode(e[b])+'\" ');a.push(\"\\x3e\",CKEDITOR.tools.htmlEncode(f._[\"default\"]),\"\\x3c/textarea\\x3e\\x3c/div\\x3e\");return a.join(\"\")})}},checkbox:function(b,\na,d){if(!(3>arguments.length)){var f=h.call(this,a,{\"default\":!!a[\"default\"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,\"span\",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+\"_checkbox\":CKEDITOR.tools.getNextId()+\"_checkbox\"},!0),e=[],d=CKEDITOR.tools.getNextId()+\"_label\",g={\"class\":\"cke_dialog_ui_checkbox_input\",type:\"checkbox\",\"aria-labelledby\":d};t(c);a[\"default\"]&&(g.checked=\"checked\");\"undefined\"!=typeof c.inputStyle&&(c.style=c.inputStyle);\nf.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,e,\"input\",null,g);e.push(' \\x3clabel id\\x3d\"',d,'\" for\\x3d\"',g.id,'\"'+(a.labelStyle?' style\\x3d\"'+a.labelStyle+'\"':\"\")+\"\\x3e\",CKEDITOR.tools.htmlEncode(a.label),\"\\x3c/label\\x3e\");return e.join(\"\")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._[\"default\"]||(this._[\"default\"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.validate);var f=[],c=this;a.role=\"radiogroup\";a.includeLabel=!0;CKEDITOR.ui.dialog.labeledElement.call(this,\nb,a,d,function(){for(var e=[],d=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+\"_radio\",k=0;k<a.items.length;k++){var l=a.items[k],h=void 0!==l[2]?l[2]:l[0],n=void 0!==l[1]?l[1]:l[0],p=CKEDITOR.tools.getNextId()+\"_radio_input\",q=p+\"_label\",p=CKEDITOR.tools.extend({},a,{id:p,title:null,type:null},!0),h=CKEDITOR.tools.extend({},p,{title:h},!0),r={type:\"radio\",\"class\":\"cke_dialog_ui_radio_input\",name:g,value:n,\"aria-labelledby\":q},u=[];c._[\"default\"]==n&&(r.checked=\"checked\");t(p);t(h);\"undefined\"!=typeof p.inputStyle&&\n(p.style=p.inputStyle);p.keyboardFocusable=!0;f.push(new CKEDITOR.ui.dialog.uiElement(b,p,u,\"input\",null,r));u.push(\" \");new CKEDITOR.ui.dialog.uiElement(b,h,u,\"label\",null,{id:q,\"for\":r.id},l[0]);e.push(u.join(\"\"))}new CKEDITOR.ui.dialog.hbox(b,f,e,d);return d.join(\"\")});this._.children=f}},button:function(b,a,d){if(arguments.length){\"function\"==typeof a&&(a=a(b.getParentEditor()));h.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);var f=this;b.on(\"load\",function(){var a=this.getElement();\n(function(){a.on(\"click\",function(a){f.click();a.data.preventDefault()});a.on(\"keydown\",function(a){a.data.getKeystroke()in{32:1}&&(f.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var e=CKEDITOR.tools.getNextId()+\"_label\";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,\"a\",null,{style:a.style,href:\"javascript:void(0)\",title:a.label,hidefocus:\"true\",\"class\":a[\"class\"],role:\"button\",\"aria-labelledby\":e},'\\x3cspan id\\x3d\"'+e+'\" class\\x3d\"cke_dialog_ui_button\"\\x3e'+\nCKEDITOR.tools.htmlEncode(a.label)+\"\\x3c/span\\x3e\")}},select:function(b,a,d){if(!(3>arguments.length)){var f=h.call(this,a);a.validate&&(this.validate=a.validate);f.inputId=CKEDITOR.tools.getNextId()+\"_select\";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+\"_select\":CKEDITOR.tools.getNextId()+\"_select\"},!0),e=[],d=[],g={id:f.inputId,\"class\":\"cke_dialog_ui_input_select\",\"aria-labelledby\":this._.labelId};e.push('\\x3cdiv class\\x3d\"cke_dialog_ui_input_',\na.type,'\" role\\x3d\"presentation\"');a.width&&e.push('style\\x3d\"width:'+a.width+'\" ');e.push(\"\\x3e\");void 0!==a.size&&(g.size=a.size);void 0!==a.multiple&&(g.multiple=a.multiple);t(c);for(var k=0,l;k<a.items.length&&(l=a.items[k]);k++)d.push('\\x3coption value\\x3d\"',CKEDITOR.tools.htmlEncode(void 0!==l[1]?l[1]:l[0]).replace(/\"/g,\"\\x26quot;\"),'\" /\\x3e ',CKEDITOR.tools.htmlEncode(l[0]));\"undefined\"!=typeof c.inputStyle&&(c.style=c.inputStyle);f.select=new CKEDITOR.ui.dialog.uiElement(b,c,e,\"select\",null,\ng,d.join(\"\"));e.push(\"\\x3c/div\\x3e\");return e.join(\"\")})}},file:function(b,a,d){if(!(3>arguments.length)){void 0===a[\"default\"]&&(a[\"default\"]=\"\");var f=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on(\"load\",function(){CKEDITOR.document.getById(f.frameId).getParent().addClass(\"cke_dialog_ui_input_file\")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f.frameId=CKEDITOR.tools.getNextId()+\"_fileInput\";var b=['\\x3ciframe frameborder\\x3d\"0\" allowtransparency\\x3d\"0\" class\\x3d\"cke_dialog_ui_input_file\" role\\x3d\"presentation\" id\\x3d\"',\nf.frameId,'\" title\\x3d\"',a.label,'\" src\\x3d\"javascript:void('];b.push(CKEDITOR.env.ie?\"(function(){\"+encodeURIComponent(\"document.open();(\"+CKEDITOR.tools.fixDomain+\")();document.close();\")+\"})()\":\"0\");b.push(')\"\\x3e\\x3c/iframe\\x3e');return b.join(\"\")})}},fileButton:function(b,a,d){var f=this;if(!(3>arguments.length)){h.call(this,a);a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),e=c.onClick;c.className=(c.className?c.className+\" \":\"\")+\"cke_dialog_ui_button\";c.onClick=function(c){var d=\na[\"for\"];e&&!1===e.call(this,c)||(b.getContentElement(d[0],d[1]).submit(),this.disable())};b.on(\"load\",function(){b.getContentElement(a[\"for\"][0],a[\"for\"][1])._.buttons.push(f)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\\s*<[\\w:]+\\s+([^>]*)?>/,a=/^(\\s*<[\\w:]+(?:\\s+[^>]*)?)((?:.|\\r|\\n)+)$/,d=/\\/$/;return function(f,c,e){if(!(3>arguments.length)){var m=[],g=c.html;\"\\x3c\"!=g.charAt(0)&&(g=\"\\x3cspan\\x3e\"+g+\"\\x3c/span\\x3e\");var k=c.focus;if(k){var l=this.focus;this.focus=function(){(\"function\"==\ntypeof k?k:l).call(this);this.fire(\"focus\")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,f,c,m,\"span\",null,null,\"\");m=m.join(\"\").match(b);g=g.match(a)||[\"\",\"\",\"\"];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]=\"/\"+g[2]);e.push([g[1],\" \",m[1]||\"\",g[2]].join(\"\"))}}}(),fieldset:function(b,a,d,f,c){var e=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,f,\"fieldset\",null,null,function(){var a=[];e&&a.push(\"\\x3clegend\"+\n(c.labelStyle?' style\\x3d\"'+c.labelStyle+'\"':\"\")+\"\\x3e\"+e+\"\\x3c/legend\\x3e\");for(var b=0;b<d.length;b++)a.push(d[b]);return a.join(\"\")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=\nCKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?\"\":b.getChild(0).getText()},eventProcessors:r},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return this._.disabled?!1:this.fire(\"click\",{dialog:this._.dialog})},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass(\"cke_disabled\")},disable:function(){this._.disabled=!0;this.getElement().addClass(\"cke_disabled\")},isVisible:function(){return this.getElement().getFirst().isVisible()},\nisEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on(\"click\",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},\nfocus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){if(this.bidi){var a=b&&b.charAt(0);(a=\"‪\"==a?\"ltr\":\"‫\"==a?\"rtl\":null)&&(b=b.slice(1));this.setDirectionMarker(a)}b||(b=\"\");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},\ngetValue:function(){var b=CKEDITOR.ui.dialog.uiElement.prototype.getValue.call(this);if(this.bidi&&b){var a=this.getDirectionMarker();a&&(b=(\"ltr\"==a?\"‪\":\"‫\")+b)}return b},setDirectionMarker:function(b){var a=this.getInputElement();b?a.setAttributes({dir:b,\"data-cke-dir-marker\":b}):this.getDirectionMarker()&&a.removeAttributes([\"dir\",\"data-cke-dir-marker\"])},getDirectionMarker:function(){return this.getInputElement().data(\"cke-dir-marker\")},keyboardFocusable:!0},q,!0);CKEDITOR.ui.dialog.textarea.prototype=\nnew CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var f=new CKEDITOR.dom.element(\"option\",this.getDialog().getParentEditor().document),c=this.getInputElement().$;f.$.text=b;f.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(f.$):c.add(f.$,null):c.add(f.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);\nreturn this},clear:function(){for(var b=this.getInputElement().$;0<b.length;)b.remove(0);return this},keyboardFocusable:!0},q,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire(\"change\",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,\na){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return r.onChange.apply(this,arguments);b.on(\"load\",function(){var a=this._.checkbox.getElement();a.on(\"propertychange\",function(b){b=b.data.$;\"checked\"==b.propertyName&&this.fire(\"change\",{value:a.$.checked})},this)},this);this.on(\"change\",a);return null}},keyboardFocusable:!0},q,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,f,c=0;c<d.length&&(f=d[c]);c++)f.getElement().$.checked=\nf.getValue()==b;!a&&this.fire(\"change\",{value:b})},getValue:function(){for(var b=this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return r.onChange.apply(this,arguments);b.on(\"load\",function(){for(var a=\nthis._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on(\"propertychange\",function(a){a=a.data.$;\"checked\"==a.propertyName&&this.$.checked&&b.fire(\"change\",{value:this.getAttribute(\"value\")})})},this);this.on(\"change\",a);return null}}},q,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,q,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):\nthis.getElement()},submit:function(){this.getInputElement().getParent().$.submit();return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\\w+)/,d,f=function(a,b,c,d){a.on(\"formLoaded\",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):f(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();\nvar b=\"\";f.size&&(b=f.size-(CKEDITOR.env.ie?7:0));var h=a.frameId+\"_input\";d.$.write(['\\x3chtml dir\\x3d\"'+g+'\" lang\\x3d\"'+k+'\"\\x3e\\x3chead\\x3e\\x3ctitle\\x3e\\x3c/title\\x3e\\x3c/head\\x3e\\x3cbody style\\x3d\"margin: 0; overflow: hidden; background: transparent;\"\\x3e','\\x3cform enctype\\x3d\"multipart/form-data\" method\\x3d\"POST\" dir\\x3d\"'+g+'\" lang\\x3d\"'+k+'\" action\\x3d\"',CKEDITOR.tools.htmlEncode(f.action),'\"\\x3e\\x3clabel id\\x3d\"',a.labelId,'\" for\\x3d\"',h,'\" style\\x3d\"display:none\"\\x3e',CKEDITOR.tools.htmlEncode(f.label),\n'\\x3c/label\\x3e\\x3cinput style\\x3d\"width:100%\" id\\x3d\"',h,'\" aria-labelledby\\x3d\"',a.labelId,'\" type\\x3d\"file\" name\\x3d\"',CKEDITOR.tools.htmlEncode(f.id||\"cke_upload\"),'\" size\\x3d\"',CKEDITOR.tools.htmlEncode(0<b?b:\"\"),'\" /\\x3e\\x3c/form\\x3e\\x3c/body\\x3e\\x3c/html\\x3e\\x3cscript\\x3e',CKEDITOR.env.ie?\"(\"+CKEDITOR.tools.fixDomain+\")();\":\"\",\"window.parent.CKEDITOR.tools.callFunction(\"+e+\");\",\"window.onbeforeunload \\x3d function() {window.parent.CKEDITOR.tools.callFunction(\"+m+\")}\",\"\\x3c/script\\x3e\"].join(\"\"));\nd.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),f=a.definition,c=a.buttons,e=this.formLoadedNumber,m=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,k=a.dialog._.editor.langCode;e||(e=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire(\"formLoaded\")},this),m=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on(\"destroy\",function(){CKEDITOR.tools.removeFunction(e);\nCKEDITOR.tools.removeFunction(m)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||\"\"},setInitValue:function(){this._.initValue=\"\"},eventProcessors:{onChange:function(b,a){this._.domOnChangeRegistered||(this.on(\"formLoaded\",function(){this.getInputElement().on(\"change\",function(){this.fire(\"change\",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on(\"change\",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=\nnew CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement(\"text\",v);CKEDITOR.dialog.addUIElement(\"password\",v);CKEDITOR.dialog.addUIElement(\"textarea\",n);CKEDITOR.dialog.addUIElement(\"checkbox\",n);CKEDITOR.dialog.addUIElement(\"radio\",n);CKEDITOR.dialog.addUIElement(\"button\",n);CKEDITOR.dialog.addUIElement(\"select\",n);CKEDITOR.dialog.addUIElement(\"file\",n);CKEDITOR.dialog.addUIElement(\"fileButton\",n);CKEDITOR.dialog.addUIElement(\"html\",\nn);CKEDITOR.dialog.addUIElement(\"fieldset\",{build:function(b,a,d){for(var f=a.children,c,e=[],h=[],g=0;g<f.length&&(c=f[g]);g++){var k=[];e.push(k);h.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,c,k))}return new CKEDITOR.ui.dialog[a.type](b,h,e,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3;CKEDITOR.DIALOG_STATE_IDLE=1;CKEDITOR.DIALOG_STATE_BUSY=2;\n(function(){function x(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function A(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function K(a,b){for(var c=a.$.getElementsByTagName(\"input\"),\nd=0,e=c.length;d<e;d++){var f=new CKEDITOR.dom.element(c[d]);\"text\"==f.getAttribute(\"type\").toLowerCase()&&(b?(f.setAttribute(\"value\",f.getCustomData(\"fake_value\")||\"\"),f.removeCustomData(\"fake_value\")):(f.setCustomData(\"fake_value\",f.getAttribute(\"value\")),f.setAttribute(\"value\",\"\")))}}function T(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute(\"aria-invalid\"):c.setAttribute(\"aria-invalid\",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire(\"validated\",{valid:a,msg:b})}\nfunction U(){var a=this.getInputElement();a&&a.removeAttribute(\"aria-invalid\")}function V(a){var b=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate(\"dialog\",W).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:\"cke_editor_\"+a.name.replace(/\\./g,\"\\\\.\")+\"_dialog\",closeTitle:a.lang.common.close,hidpi:CKEDITOR.env.hidpi?\"cke_hidpi\":\"\"})),c=b.getChild([0,0,0,0,0]),d=c.getChild(0),e=c.getChild(1);a.plugins.clipboard&&CKEDITOR.plugins.clipboard.preventDefaultDropOnElement(c);\n!CKEDITOR.env.ie||CKEDITOR.env.quirks||CKEDITOR.env.edge||(a=\"javascript:void(function(){\"+encodeURIComponent(\"document.open();(\"+CKEDITOR.tools.fixDomain+\")();document.close();\")+\"}())\",CKEDITOR.dom.element.createFromHtml('\\x3ciframe frameBorder\\x3d\"0\" class\\x3d\"cke_iframe_shim\" src\\x3d\"'+a+'\" tabIndex\\x3d\"-1\"\\x3e\\x3c/iframe\\x3e').appendTo(c.getParent()));d.unselectable();e.unselectable();return{element:b,parts:{dialog:b.getChild(0),title:d,close:e,tabs:c.getChild(2),contents:c.getChild([3,0,0,0]),\nfooter:c.getChild([3,0,1,0])}}}function L(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex=0;this.isFocusable=function(){return!b.getAttribute(\"disabled\")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on(\"keydown\",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire(\"click\")});b.on(\"focus\",function(){this.fire(\"mouseover\")});b.on(\"blur\",function(){this.fire(\"mouseout\")})}function X(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();\nc.on(\"resize\",b);a.on(\"hide\",function(){c.removeListener(\"resize\",b)})}function M(a,b){this._={dialog:a};CKEDITOR.tools.extend(this,b)}function Y(a){function b(b){var c=a.getSize(),k=CKEDITOR.document.getWindow().getViewPaneSize(),q=b.data.$.screenX,n=b.data.$.screenY,r=q-d.x,l=n-d.y;d={x:q,y:n};e.x+=r;e.y+=l;a.move(e.x+h[3]<g?-h[3]:e.x-h[1]>k.width-c.width-g?k.width-c.width+(\"rtl\"==f.lang.dir?0:h[1]):e.x,e.y+h[0]<g?-h[0]:e.y-h[2]>k.height-c.height-g?k.height-c.height+h[2]:e.y,1);b.data.preventDefault()}\nfunction c(){CKEDITOR.document.removeListener(\"mousemove\",b);CKEDITOR.document.removeListener(\"mouseup\",c);if(CKEDITOR.env.ie6Compat){var a=u.getChild(0).getFrameDocument();a.removeListener(\"mousemove\",b);a.removeListener(\"mouseup\",c)}}var d=null,e=null,f=a.getParentEditor(),g=f.config.dialog_magnetDistance,h=CKEDITOR.skin.margins||[0,0,0,0];\"undefined\"==typeof g&&(g=20);a.parts.title.on(\"mousedown\",function(g){d={x:g.data.$.screenX,y:g.data.$.screenY};CKEDITOR.document.on(\"mousemove\",b);CKEDITOR.document.on(\"mouseup\",\nc);e=a.getPosition();if(CKEDITOR.env.ie6Compat){var f=u.getChild(0).getFrameDocument();f.on(\"mousemove\",b);f.on(\"mouseup\",c)}g.data.preventDefault()},a)}function Z(a){function b(b){var c=\"rtl\"==f.lang.dir,n=k.width,q=k.height,G=n+(b.data.$.screenX-m.x)*(c?-1:1)*(a._.moved?1:2),H=q+(b.data.$.screenY-m.y)*(a._.moved?1:2),B=a._.element.getFirst(),B=c&&B.getComputedStyle(\"right\"),C=a.getPosition();C.y+H>p.height&&(H=p.height-C.y);(c?B:C.x)+G>p.width&&(G=p.width-(c?B:C.x));if(e==CKEDITOR.DIALOG_RESIZE_WIDTH||\ne==CKEDITOR.DIALOG_RESIZE_BOTH)n=Math.max(d.minWidth||0,G-g);if(e==CKEDITOR.DIALOG_RESIZE_HEIGHT||e==CKEDITOR.DIALOG_RESIZE_BOTH)q=Math.max(d.minHeight||0,H-h);a.resize(n,q);a._.moved||a.layout();b.data.preventDefault()}function c(){CKEDITOR.document.removeListener(\"mouseup\",c);CKEDITOR.document.removeListener(\"mousemove\",b);q&&(q.remove(),q=null);if(CKEDITOR.env.ie6Compat){var a=u.getChild(0).getFrameDocument();a.removeListener(\"mouseup\",c);a.removeListener(\"mousemove\",b)}}var d=a.definition,e=d.resizable;\nif(e!=CKEDITOR.DIALOG_RESIZE_NONE){var f=a.getParentEditor(),g,h,p,m,k,q,n=CKEDITOR.tools.addFunction(function(e){k=a.getSize();var d=a.parts.contents;d.$.getElementsByTagName(\"iframe\").length&&(q=CKEDITOR.dom.element.createFromHtml('\\x3cdiv class\\x3d\"cke_dialog_resize_cover\" style\\x3d\"height: 100%; position: absolute; width: 100%;\"\\x3e\\x3c/div\\x3e'),d.append(q));h=k.height-a.parts.contents.getSize(\"height\",!(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.quirks));g=k.width-a.parts.contents.getSize(\"width\",\n1);m={x:e.screenX,y:e.screenY};p=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on(\"mousemove\",b);CKEDITOR.document.on(\"mouseup\",c);CKEDITOR.env.ie6Compat&&(d=u.getChild(0).getFrameDocument(),d.on(\"mousemove\",b),d.on(\"mouseup\",c));e.preventDefault&&e.preventDefault()});a.on(\"load\",function(){var b=\"\";e==CKEDITOR.DIALOG_RESIZE_WIDTH?b=\" cke_resizer_horizontal\":e==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=\" cke_resizer_vertical\");b=CKEDITOR.dom.element.createFromHtml('\\x3cdiv class\\x3d\"cke_resizer'+\nb+\" cke_resizer_\"+f.lang.dir+'\" title\\x3d\"'+CKEDITOR.tools.htmlEncode(f.lang.common.resize)+'\" onmousedown\\x3d\"CKEDITOR.tools.callFunction('+n+', event )\"\\x3e'+(\"ltr\"==f.lang.dir?\"◢\":\"◣\")+\"\\x3c/div\\x3e\");a.parts.footer.append(b,1)});f.on(\"destroy\",function(){CKEDITOR.tools.removeFunction(n)})}}function I(a){a.data.preventDefault(1)}function N(a){var b=CKEDITOR.document.getWindow(),c=a.config,d=c.dialog_backgroundCoverColor||\"white\",e=c.dialog_backgroundCoverOpacity,f=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(d,\ne,f),g=z[c];g?g.show():(f=['\\x3cdiv tabIndex\\x3d\"-1\" style\\x3d\"position: ',CKEDITOR.env.ie6Compat?\"absolute\":\"fixed\",\"; z-index: \",f,\"; top: 0px; left: 0px; \",CKEDITOR.env.ie6Compat?\"\":\"background-color: \"+d,'\" class\\x3d\"cke_dialog_background_cover\"\\x3e'],CKEDITOR.env.ie6Compat&&(d=\"\\x3chtml\\x3e\\x3cbody style\\x3d\\\\'background-color:\"+d+\";\\\\'\\x3e\\x3c/body\\x3e\\x3c/html\\x3e\",f.push('\\x3ciframe hidefocus\\x3d\"true\" frameborder\\x3d\"0\" id\\x3d\"cke_dialog_background_iframe\" src\\x3d\"javascript:'),f.push(\"void((function(){\"+\nencodeURIComponent(\"document.open();(\"+CKEDITOR.tools.fixDomain+\")();document.write( '\"+d+\"' );document.close();\")+\"})())\"),f.push('\" style\\x3d\"position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity\\x3d0)\"\\x3e\\x3c/iframe\\x3e')),f.push(\"\\x3c/div\\x3e\"),g=CKEDITOR.dom.element.createFromHtml(f.join(\"\")),g.setOpacity(void 0!==e?e:.5),g.on(\"keydown\",I),g.on(\"keypress\",I),g.on(\"keyup\",I),g.appendTo(CKEDITOR.document.getBody()),z[c]=g);a.focusManager.add(g);\nu=g;a=function(){var a=b.getViewPaneSize();g.setStyles({width:a.width+\"px\",height:a.height+\"px\"})};var h=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;g.setStyles({left:a.x+\"px\",top:a.y+\"px\"});if(c){do a=c.getPosition(),c.move(a.x,a.y);while(c=c._.parentDialog)}};J=a;b.on(\"resize\",a);a();CKEDITOR.env.mac&&CKEDITOR.env.webkit||g.focus();if(CKEDITOR.env.ie6Compat){var p=function(){h();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){p.prevScrollHandler=\nwindow.onscroll||function(){};window.onscroll=p},0);h()}}function O(a){u&&(a.focusManager.remove(u),a=CKEDITOR.document.getWindow(),u.hide(),a.removeListener(\"resize\",J),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||null},0),J=null)}var v=CKEDITOR.tools.cssLength,W='\\x3cdiv class\\x3d\"cke_reset_all {editorId} {editorDialogClass} {hidpi}\" dir\\x3d\"{langDir}\" lang\\x3d\"{langCode}\" role\\x3d\"dialog\" aria-labelledby\\x3d\"cke_dialog_title_{id}\"\\x3e\\x3ctable class\\x3d\"cke_dialog '+\nCKEDITOR.env.cssClass+' cke_{langDir}\" style\\x3d\"position:absolute\" role\\x3d\"presentation\"\\x3e\\x3ctr\\x3e\\x3ctd role\\x3d\"presentation\"\\x3e\\x3cdiv class\\x3d\"cke_dialog_body\" role\\x3d\"presentation\"\\x3e\\x3cdiv id\\x3d\"cke_dialog_title_{id}\" class\\x3d\"cke_dialog_title\" role\\x3d\"presentation\"\\x3e\\x3c/div\\x3e\\x3ca id\\x3d\"cke_dialog_close_button_{id}\" class\\x3d\"cke_dialog_close_button\" href\\x3d\"javascript:void(0)\" title\\x3d\"{closeTitle}\" role\\x3d\"button\"\\x3e\\x3cspan class\\x3d\"cke_label\"\\x3eX\\x3c/span\\x3e\\x3c/a\\x3e\\x3cdiv id\\x3d\"cke_dialog_tabs_{id}\" class\\x3d\"cke_dialog_tabs\" role\\x3d\"tablist\"\\x3e\\x3c/div\\x3e\\x3ctable class\\x3d\"cke_dialog_contents\" role\\x3d\"presentation\"\\x3e\\x3ctr\\x3e\\x3ctd id\\x3d\"cke_dialog_contents_{id}\" class\\x3d\"cke_dialog_contents_body\" role\\x3d\"presentation\"\\x3e\\x3c/td\\x3e\\x3c/tr\\x3e\\x3ctr\\x3e\\x3ctd id\\x3d\"cke_dialog_footer_{id}\" class\\x3d\"cke_dialog_footer\" role\\x3d\"presentation\"\\x3e\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\\x3c/div\\x3e\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\\x3c/div\\x3e';\nCKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function d(a){var b=l._.focusList;a=a||0;if(!(1>b.length)){var c=l._.currentFocusIndex;l._.tabBarMode&&0>a&&(c=0);try{b[c].getInputElement().$.blur()}catch(e){}var d=c,g=1<l._.pageCount;do{d+=a;if(g&&!l._.tabBarMode&&(d==b.length||-1==d)){l._.tabBarMode=!0;l._.tabs[l._.currentTabId][0].focus();\nl._.currentFocusIndex=-1;return}d=(d+b.length)%b.length;if(d==c)break}while(a&&!b[d].isFocusable());b[d].focus();\"text\"==b[d].type&&b[d].select()}}function e(b){if(l==CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),e=\"rtl\"==a.lang.dir,g=[37,38,39,40];q=n=0;if(9==c||c==CKEDITOR.SHIFT+9)d(c==CKEDITOR.SHIFT+9?-1:1),q=1;else if(c==CKEDITOR.ALT+121&&!l._.tabBarMode&&1<l.getPageCount())l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),l._.currentFocusIndex=-1,q=1;else if(-1!=CKEDITOR.tools.indexOf(g,\nc)&&l._.tabBarMode)c=-1!=CKEDITOR.tools.indexOf([e?39:37,38],c)?x.call(l):A.call(l),l.selectPage(c),l._.tabs[c][0].focus(),q=1;else if(13!=c&&32!=c||!l._.tabBarMode)if(13==c)c=b.data.getTarget(),c.is(\"a\",\"button\",\"select\",\"textarea\")||c.is(\"input\")&&\"button\"==c.$.type||((c=this.getButton(\"ok\"))&&CKEDITOR.tools.setTimeout(c.click,0,c),q=1),n=1;else if(27==c)(c=this.getButton(\"cancel\"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire(\"cancel\",{hide:!0}).hide&&this.hide(),n=1;else return;else this.selectPage(this._.currentTabId),\nthis._.tabBarMode=!1,this._.currentFocusIndex=-1,d(1),q=1;f(b)}}function f(a){q?a.data.preventDefault(1):n&&a.data.stopPropagation()}var g=CKEDITOR.dialog._.dialogDefinitions[b],h=CKEDITOR.tools.clone(aa),p=a.config.dialog_buttonsOrder||\"OS\",m=a.lang.dir,k={},q,n;(\"OS\"==p&&CKEDITOR.env.mac||\"rtl\"==p&&\"ltr\"==m||\"ltr\"==p&&\"rtl\"==m)&&h.buttons.reverse();g=CKEDITOR.tools.extend(g(a),h);g=CKEDITOR.tools.clone(g);g=new P(this,g);h=V(a);this._={editor:a,element:h.element,name:b,contentSize:{width:0,height:0},\nsize:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[],currentFocusIndex:0,hasFocus:!1};this.parts=h.parts;CKEDITOR.tools.setTimeout(function(){a.fire(\"ariaWidget\",this.parts.contents)},0,this);h={position:CKEDITOR.env.ie6Compat?\"absolute\":\"fixed\",top:0,visibility:\"hidden\"};h[\"rtl\"==m?\"right\":\"left\"]=0;this.parts.dialog.setStyles(h);CKEDITOR.event.call(this);this.definition=g=CKEDITOR.fire(\"dialogDefinition\",\n{name:b,definition:g},a).definition;if(!(\"removeDialogTabs\"in a._)&&a.config.removeDialogTabs){h=a.config.removeDialogTabs.split(\";\");for(m=0;m<h.length;m++)if(p=h[m].split(\":\"),2==p.length){var r=p[0];k[r]||(k[r]=[]);k[r].push(p[1])}a._.removeDialogTabs=k}if(a._.removeDialogTabs&&(k=a._.removeDialogTabs[b]))for(m=0;m<k.length;m++)g.removeContents(k[m]);if(g.onLoad)this.on(\"load\",g.onLoad);if(g.onShow)this.on(\"show\",g.onShow);if(g.onHide)this.on(\"hide\",g.onHide);if(g.onOk)this.on(\"ok\",function(b){a.fire(\"saveSnapshot\");\nsetTimeout(function(){a.fire(\"saveSnapshot\")},0);!1===g.onOk.call(this,b)&&(b.data.hide=!1)});this.state=CKEDITOR.DIALOG_STATE_IDLE;if(g.onCancel)this.on(\"cancel\",function(a){!1===g.onCancel.call(this,a)&&(a.data.hide=!1)});var l=this,t=function(a){var b=l._.contents,c=!1,d;for(d in b)for(var e in b[d])if(c=a.call(this,b[d][e]))return};this.on(\"ok\",function(a){t(function(b){if(b.validate){var c=b.validate(this),d=\"string\"==typeof c||!1===c;d&&(a.data.hide=!1,a.stop());T.call(b,!d,\"string\"==typeof c?\nc:void 0);return d}})},this,null,0);this.on(\"cancel\",function(b){t(function(c){if(c.isChanged())return a.config.dialog_noConfirmCancel||confirm(a.lang.common.confirmCancel)||(b.data.hide=!1),!0})},this,null,0);this.parts.close.on(\"click\",function(a){!1!==this.fire(\"cancel\",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=d;var y=this._.element;a.focusManager.add(y,1);this.on(\"show\",function(){y.on(\"keydown\",e,this);if(CKEDITOR.env.gecko)y.on(\"keypress\",f,this)});this.on(\"hide\",\nfunction(){y.removeListener(\"keydown\",e);CKEDITOR.env.gecko&&y.removeListener(\"keypress\",f);t(function(a){U.apply(a)})});this.on(\"iframeAdded\",function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on(\"keydown\",e,this,null,0)});this.on(\"show\",function(){c();var b=1<l._.pageCount;a.config.dialog_startupFocusTab&&b?(l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),l._.currentFocusIndex=-1):this._.hasFocus||(this._.currentFocusIndex=b?-1:this._.focusList.length-1,g.onFocus?\n(b=g.onFocus.call(this))&&b.focus():d(1))},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on(\"load\",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)},this);Y(this);Z(this);(new CKEDITOR.dom.text(g.title,CKEDITOR.document)).appendTo(this.parts.title);for(m=0;m<g.contents.length;m++)(k=g.contents[m])&&this.addPage(k);this.parts.tabs.on(\"click\",function(a){var b=a.data.getTarget();b.hasClass(\"cke_dialog_tab\")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf(\"_\"))),\nthis._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,d(1)),a.data.preventDefault())},this);m=[];k=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:\"hbox\",className:\"cke_dialog_footer_buttons\",widths:[],children:g.buttons},m).getChild();this.parts.footer.setHtml(m.join(\"\"));for(m=0;m<k.length;m++)this._.buttons[k[m].id]=k[m]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){this._.contentSize&&this._.contentSize.width==\na&&this._.contentSize.height==b||(CKEDITOR.dialog.fire(\"resize\",{dialog:this,width:a,height:b},this._.editor),this.fire(\"resize\",{width:a,height:b},this._.editor),this.parts.contents.setStyles({width:a+\"px\",height:b+\"px\"}),\"rtl\"==this._.editor.lang.dir&&this._.position&&(this._.position.x=CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle(\"right\"),10)),this._.contentSize={width:a,height:b})}}(),getSize:function(){var a=this._.element.getFirst();\nreturn{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var d=this._.element.getFirst(),e=\"rtl\"==this._.editor.lang.dir,f=\"fixed\"==d.getComputedStyle(\"position\");CKEDITOR.env.ie&&d.setStyle(\"zoom\",\"100%\");f&&this._.position&&this._.position.x==a&&this._.position.y==b||(this._.position={x:a,y:b},f||(f=CKEDITOR.document.getWindow().getScrollPosition(),a+=f.x,b+=f.y),e&&(f=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-f.width-a),b={top:(0<b?b:0)+\"px\"},\nb[e?\"right\":\"left\"]=(0<a?a:0)+\"px\",d.setStyles(b),c&&(this._.moved=1))},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)},show:function(){var a=this._.element,b=this.definition;a.getParent()&&a.getParent().equals(CKEDITOR.document.getBody())?a.setStyle(\"display\",\"block\"):a.appendTo(CKEDITOR.document.getBody());this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);\nnull===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);this._.element.getFirst().setStyle(\"z-index\",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,this._.parentDialog=null,N(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2),CKEDITOR.dialog._.currentTop=this);\na.on(\"keydown\",Q);a.on(\"keyup\",R);this._.hasFocus=!1;for(var c in b.contents)if(b.contents[c]){var a=b.contents[c],d=this._.tabs[a.id],e=a.requiredContent,f=0;if(d){for(var g in this._.contents[a.id]){var h=this._.contents[a.id][g];\"hbox\"!=h.type&&\"vbox\"!=h.type&&h.getInputElement()&&(h.requiredContent&&!this._.editor.activeFilter.check(h.requiredContent)?h.disable():(h.enable(),f++))}!f||e&&!this._.editor.activeFilter.check(e)?d[0].addClass(\"cke_dialog_tab_disabled\"):d[0].removeClass(\"cke_dialog_tab_disabled\")}}CKEDITOR.tools.setTimeout(function(){this.layout();\nX(this);this.parts.dialog.setStyle(\"visibility\",\"\");this.fireOnce(\"load\",{});CKEDITOR.ui.fire(\"ready\",this);this.fire(\"show\",{});this._.editor.fire(\"dialogShow\",this);this._.parentDialog||this._.editor.focusManager.lock();this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(),d=(c.width-b.width)/2,e=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<e?e:0)>c.height||\nb.width+(0<d?d:0)>c.width?a.setStyle(\"position\",\"absolute\"):a.setStyle(\"position\",\"fixed\"));this.move(this._.moved?this._.position.x:d,this._.moved?this._.position.y:e)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},\ncommitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire(\"hide\",{});this._.editor.fire(\"dialogHide\",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle(\"display\",\"none\");this.parts.dialog.setStyle(\"visibility\",\"hidden\");for(ba(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();\nif(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle(\"z-index\",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else O(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener(\"keydown\",Q);a.removeListener(\"keyup\",R);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock();CKEDITOR.env.iOS&&c.window.focus()},0)}delete this._.parentDialog;\nthis.foreach(function(a){a.resetInitValue&&a.resetInitValue()});this.setState(CKEDITOR.DIALOG_STATE_IDLE)}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title\\x3d\"'+CKEDITOR.tools.htmlEncode(a.label)+'\"':\"\",d=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:\"vbox\",className:\"cke_dialog_page_contents\",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||\"width: 100%;\"},b),e=this._.contents[a.id]={},f=d.getChild(),\ng=0;d=f.shift();)d.notAllowed||\"hbox\"==d.type||\"vbox\"==d.type||g++,e[d.id]=d,\"function\"==typeof d.getChild&&f.push.apply(f,d.getChild());g||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(\"\"));b.setAttribute(\"role\",\"tabpanel\");d=CKEDITOR.env;e=\"cke_\"+a.id+\"_\"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['\\x3ca class\\x3d\"cke_dialog_tab\"',0<this._.pageCount?\" cke_last\":\"cke_first\",c,a.hidden?' style\\x3d\"display:none\"':\"\",' id\\x3d\"',e,'\"',d.gecko&&!d.hc?\"\":' href\\x3d\"javascript:void(0)\"',\n' tabIndex\\x3d\"-1\" hidefocus\\x3d\"true\" role\\x3d\"tab\"\\x3e',a.label,\"\\x3c/a\\x3e\"].join(\"\"));b.setAttribute(\"aria-labelledby\",e);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();b.setAttribute(\"name\",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(S(this,this,\"CTRL+\"+a.accessKey,ca,da),this._.accessKeyMap[\"CTRL+\"+a.accessKey]=a.id)}},selectPage:function(a){if(this._.currentTabId!=a&&!this._.tabs[a][0].hasClass(\"cke_dialog_tab_disabled\")&&\n!1!==this.fire(\"selectPage\",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=this._.tabs[b][0],d=this._.tabs[b][1];b!=a&&(c.removeClass(\"cke_dialog_tab_selected\"),d.hide());d.setAttribute(\"aria-hidden\",b!=a)}var e=this._.tabs[a];e[0].addClass(\"cke_dialog_tab_selected\");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?(K(e[1]),e[1].show(),setTimeout(function(){K(e[1],1)},0)):e[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},\nupdateStyle:function(){this.parts.dialog[(1===this._.pageCount?\"add\":\"remove\")+\"Class\"](\"cke_single_page\")},hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&1!=this._.pageCount&&b.isVisible()&&(a==this._.currentTabId&&this.selectPage(x.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&this._.tabs[a][0])a.show(),this._.pageCount++,this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},\ngetContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},enableButton:function(a){return this._.buttons[a].enable()},getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},\ngetSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},addFocusable:function(a,b){if(\"undefined\"==typeof b)b=this._.focusList.length,this._.focusList.push(new L(this,a,b));else{this._.focusList.splice(b,0,new L(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}},setState:function(a){if(this.state!=a){this.state=a;if(a==CKEDITOR.DIALOG_STATE_BUSY){if(!this.parts.spinner){var b=this.getParentEditor().lang.dir,c={attributes:{\"class\":\"cke_dialog_spinner\"},\nstyles:{\"float\":\"rtl\"==b?\"right\":\"left\"}};c.styles[\"margin-\"+(\"rtl\"==b?\"left\":\"right\")]=\"8px\";this.parts.spinner=CKEDITOR.document.createElement(\"div\",c);this.parts.spinner.setHtml(\"\\x26#8987;\");this.parts.spinner.appendTo(this.parts.title,1)}this.parts.spinner.show();this.getButton(\"ok\").disable()}else a==CKEDITOR.DIALOG_STATE_IDLE&&(this.parts.spinner&&this.parts.spinner.hide(),this.getButton(\"ok\").enable());this.fire(\"state\",a)}}};CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){this._.dialogDefinitions[a]&&\n\"function\"!=typeof b||(this._.dialogDefinitions[a]=b)},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},isTabEnabled:function(a,b,c){a=a.config.removeDialogTabs;return!(a&&a.match(new RegExp(\"(?:^|;)\"+b+\":\"+c+\"(?:$|;)\",\"i\")))},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:\"ok\",type:\"button\",label:a.lang.common.ok,\"class\":\"cke_dialog_ui_button_ok\",onClick:function(a){a=a.data.dialog;!1!==a.fire(\"ok\",\n{hide:!0}).hide&&a.hide()}},c,!0)};a.type=\"button\";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:\"button\"},!0)};return a}(),cancelButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:\"cancel\",type:\"button\",label:a.lang.common.cancel,\"class\":\"cke_dialog_ui_button_cancel\",onClick:function(a){a=a.data.dialog;!1!==a.fire(\"cancel\",{hide:!0}).hide&&a.hide()}},c,!0)};a.type=\"button\";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,\nb)},{type:\"button\"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var aa={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},D=function(a,b,c){for(var d=0,e;e=a[d];d++)if(e.id==b||c&&e[c]&&(e=D(e[c],\nb,c)))return e;return null},E=function(a,b,c,d,e){if(c){for(var f=0,g;g=a[f];f++){if(g.id==c)return a.splice(f,0,b),b;if(d&&g[d]&&(g=E(g[d],b,c,d,!0)))return g}if(e)return null}a.push(b);return b},F=function(a,b,c){for(var d=0,e;e=a[d];d++){if(e.id==b)return a.splice(d,1);if(c&&e[c]&&(e=F(e[c],b,c)))return e}return null},P=function(a,b){this.dialog=a;for(var c=b.contents,d=0,e;e=c[d];d++)c[d]=e&&new M(a,e);CKEDITOR.tools.extend(this,b)};P.prototype={getContents:function(a){return D(this.contents,\na)},getButton:function(a){return D(this.buttons,a)},addContents:function(a,b){return E(this.contents,a,b)},addButton:function(a,b){return E(this.buttons,a,b)},removeContents:function(a){F(this.contents,a)},removeButton:function(a){F(this.buttons,a)}};M.prototype={get:function(a){return D(this.elements,a,\"children\")},add:function(a,b){return E(this.elements,a,b,\"children\")},remove:function(a){F(this.elements,a,\"children\")}};var J,z={},u,w={},Q=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=\na.data.$.altKey,d=a.data.$.shiftKey,e=String.fromCharCode(a.data.$.keyCode);(b=w[(b?\"CTRL+\":\"\")+(c?\"ALT+\":\"\")+(d?\"SHIFT+\":\"\")+e])&&b.length&&(b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,b.key),a.data.preventDefault())},R=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,d=a.data.$.shiftKey,e=String.fromCharCode(a.data.$.keyCode);(b=w[(b?\"CTRL+\":\"\")+(c?\"ALT+\":\"\")+(d?\"SHIFT+\":\"\")+e])&&b.length&&(b=b[b.length-1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key),\na.data.preventDefault()))},S=function(a,b,c,d,e){(w[c]||(w[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:e||a.accessKeyUp,keydown:d||a.accessKeyDown})},ba=function(a){for(var b in w){for(var c=w[b],d=c.length-1;0<=d;d--)c[d].dialog!=a&&c[d].uiElement!=a||c.splice(d,1);0===c.length&&delete w[b]}},da=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},ca=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,d,e,f,g){if(!(4>arguments.length)){var h=(d.call?d(b):d)||\n\"div\",p=[\"\\x3c\",h,\" \"],m=(e&&e.call?e(b):e)||{},k=(f&&f.call?f(b):f)||{},q=(g&&g.call?g.call(this,a,b):g)||\"\",n=this.domId=k.id||CKEDITOR.tools.getNextId()+\"_uiElement\";b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(m.display=\"none\",this.notAllowed=!0);k.id=n;var r={};b.type&&(r[\"cke_dialog_ui_\"+b.type]=1);b.className&&(r[b.className]=1);b.disabled&&(r.cke_disabled=1);for(var l=k[\"class\"]&&k[\"class\"].split?k[\"class\"].split(\" \"):[],n=0;n<l.length;n++)l[n]&&(r[l[n]]=1);l=\n[];for(n in r)l.push(n);k[\"class\"]=l.join(\" \");b.title&&(k.title=b.title);r=(b.style||\"\").split(\";\");b.align&&(l=b.align,m[\"margin-left\"]=\"left\"==l?0:\"auto\",m[\"margin-right\"]=\"right\"==l?0:\"auto\");for(n in m)r.push(n+\":\"+m[n]);b.hidden&&r.push(\"display:none\");for(n=r.length-1;0<=n;n--)\"\"===r[n]&&r.splice(n,1);0<r.length&&(k.style=(k.style?k.style+\"; \":\"\")+r.join(\"; \"));for(n in k)p.push(n+'\\x3d\"'+CKEDITOR.tools.htmlEncode(k[n])+'\" ');p.push(\"\\x3e\",q,\"\\x3c/\",h,\"\\x3e\");c.push(p.join(\"\"));(this._||(this._=\n{})).dialog=a;\"boolean\"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});\"function\"==typeof b.isChanged&&(this.isChanged=b.isChanged);\"function\"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,b.setValue.call(this,c))}}));\"function\"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));CKEDITOR.event.implementOn(this);\nthis.registerEvents(b);this.accessKeyUp&&this.accessKeyDown&&b.accessKey&&S(this,a,\"CTRL+\"+b.accessKey);var t=this;a.on(\"load\",function(){var b=t.getInputElement();if(b){var c=t.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?\"cke_dialog_ui_focused\":\"\";b.on(\"focus\",function(){a._.tabBarMode=!1;a._.hasFocus=!0;t.fire(\"focus\");c&&this.addClass(c)});b.on(\"blur\",function(){t.fire(\"blur\");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,b);this.keyboardFocusable&&(this.tabIndex=\nb.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on(\"focus\",function(){a._.currentFocusIndex=t.focusIndex}))}},hbox:function(a,b,c,d,e){if(!(4>arguments.length)){this._||(this._={});var f=this._.children=b,g=e&&e.widths||null,h=e&&e.height||null,p,m={role:\"presentation\"};e&&e.align&&(m.align=e.align);CKEDITOR.ui.dialog.uiElement.call(this,a,e||{type:\"hbox\"},d,\"table\",{},m,function(){var a=['\\x3ctbody\\x3e\\x3ctr class\\x3d\"cke_dialog_ui_hbox\"\\x3e'];for(p=0;p<c.length;p++){var b=\"cke_dialog_ui_hbox_child\",\nd=[];0===p&&(b=\"cke_dialog_ui_hbox_first\");p==c.length-1&&(b=\"cke_dialog_ui_hbox_last\");a.push('\\x3ctd class\\x3d\"',b,'\" role\\x3d\"presentation\" ');g?g[p]&&d.push(\"width:\"+v(g[p])):d.push(\"width:\"+Math.floor(100/c.length)+\"%\");h&&d.push(\"height:\"+v(h));e&&void 0!==e.padding&&d.push(\"padding:\"+v(e.padding));CKEDITOR.env.ie&&CKEDITOR.env.quirks&&f[p].align&&d.push(\"text-align:\"+f[p].align);0<d.length&&a.push('style\\x3d\"'+d.join(\"; \")+'\" ');a.push(\"\\x3e\",c[p],\"\\x3c/td\\x3e\")}a.push(\"\\x3c/tr\\x3e\\x3c/tbody\\x3e\");\nreturn a.join(\"\")})}},vbox:function(a,b,c,d,e){if(!(3>arguments.length)){this._||(this._={});var f=this._.children=b,g=e&&e.width||null,h=e&&e.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,e||{type:\"vbox\"},d,\"div\",null,{role:\"presentation\"},function(){var b=['\\x3ctable role\\x3d\"presentation\" cellspacing\\x3d\"0\" border\\x3d\"0\" '];b.push('style\\x3d\"');e&&e.expand&&b.push(\"height:100%;\");b.push(\"width:\"+v(g||\"100%\"),\";\");CKEDITOR.env.webkit&&b.push(\"float:none;\");b.push('\"');b.push('align\\x3d\"',\nCKEDITOR.tools.htmlEncode(e&&e.align||(\"ltr\"==a.getParentEditor().lang.dir?\"left\":\"right\")),'\" ');b.push(\"\\x3e\\x3ctbody\\x3e\");for(var d=0;d<c.length;d++){var k=[];b.push('\\x3ctr\\x3e\\x3ctd role\\x3d\"presentation\" ');g&&k.push(\"width:\"+v(g||\"100%\"));h?k.push(\"height:\"+v(h[d])):e&&e.expand&&k.push(\"height:\"+Math.floor(100/c.length)+\"%\");e&&void 0!==e.padding&&k.push(\"padding:\"+v(e.padding));CKEDITOR.env.ie&&CKEDITOR.env.quirks&&f[d].align&&k.push(\"text-align:\"+f[d].align);0<k.length&&b.push('style\\x3d\"',\nk.join(\"; \"),'\" ');b.push(' class\\x3d\"cke_dialog_ui_vbox_child\"\\x3e',c[d],\"\\x3c/td\\x3e\\x3c/tr\\x3e\")}b.push(\"\\x3c/tbody\\x3e\\x3c/table\\x3e\");return b.join(\"\")})}}}})();CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);!b&&this.fire(\"change\",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},\nisChanged:function(){return!1},selectParentTab:function(){for(var a=this.getInputElement();(a=a.getParent())&&-1==a.$.className.search(\"cke_dialog_page_contents\"););if(!a)return this;a=a.getAttribute(\"name\");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=/^on([A-Z]\\w+)/,c,d=function(a,b,c,d){b.on(\"load\",function(){a.getInputElement().on(c,d,a)})},e;for(e in a)if(c=\ne.match(b))this.eventProcessors[e]?this.eventProcessors[e].call(this,this._.dialog,a[e]):d(this,this._.dialog,c[1].toLowerCase(),a[e]);return this},eventProcessors:{onLoad:function(a,b){a.on(\"load\",b,this)},onShow:function(a,b){a.on(\"show\",b,this)},onHide:function(a,b){a.on(\"hide\",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();this.getInputElement().setAttribute(\"disabled\",\"true\");a.addClass(\"cke_disabled\")},enable:function(){var a=\nthis.getElement();this.getInputElement().removeAttribute(\"disabled\");a.removeClass(\"cke_disabled\")},isEnabled:function(){return!this.getElement().hasClass(\"cke_disabled\")},isVisible:function(){return this.getInputElement().isVisible()},isFocusable:function(){return this.isEnabled()&&this.isVisible()?!0:!1}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>\na.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,d){for(var e=c.children,f,g=[],h=[],p=0;p<e.length&&(f=e[p]);p++){var m=[];g.push(m);h.push(CKEDITOR.dialog._.uiElementBuilders[f.type].build(a,f,m))}return new CKEDITOR.ui.dialog[c.type](a,h,g,d,c)}};CKEDITOR.dialog.addUIElement(\"hbox\",a);CKEDITOR.dialog.addUIElement(\"vbox\",\na)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){a.openDialog(this.dialogName)},canUndo:!1,editorFocus:1};(function(){var a=/^([a]|[^a])+$/,b=/^\\d*$/,c=/^\\d*(?:\\.\\d+)?$/,d=/^(((\\d*(\\.\\d+))|(\\d*))(px|\\%)?)?$/,e=/^(((\\d*(\\.\\d+))|(\\d*))(px|em|ex|in|cm|mm|pt|pc|\\%)?)?$/i,f=/^(\\s*[\\w-]+\\s*:\\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=\narguments;return function(){var b=this&&this.getValue?this.getValue():a[0],c,d=CKEDITOR.VALIDATE_AND,e=[],f;for(f=0;f<a.length;f++)if(\"function\"==typeof a[f])e.push(a[f]);else break;f<a.length&&\"string\"==typeof a[f]&&(c=a[f],f++);f<a.length&&\"number\"==typeof a[f]&&(d=a[f]);var n=d==CKEDITOR.VALIDATE_AND?!0:!1;for(f=0;f<e.length;f++)n=d==CKEDITOR.VALIDATE_AND?n&&e[f](b):n||e[f](b);return n?!0:c}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return a.test(c)?!0:b}},\nnotEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b,a)},number:function(a){return this.regex(c,a)},cssLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return f.test(CKEDITOR.tools.trim(a))},a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},\nnotEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on(\"instanceDestroyed\",function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=CKEDITOR.dialog._.currentTop;)b.hide();for(var c in z)z[c].remove();z={}}a=a.editor._.storedDialogs;for(var d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,d=CKEDITOR.dialog._.dialogDefinitions[a];null===CKEDITOR.dialog._.currentTop&&N(this);if(\"function\"==typeof d)c=\nthis._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c,c),c.show();else{if(\"failed\"==d)throw O(this),Error('[CKEDITOR.dialog.openDialog] Dialog \"'+a+'\" failed when loading definition.');\"string\"==typeof d&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(d),function(){\"function\"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]=\"failed\");this.openDialog(a,b)},this,0,1)}CKEDITOR.skin.loadPart(\"dialog\");return c}})})();\nCKEDITOR.plugins.add(\"dialog\",{requires:\"dialogui\",init:function(x){x.on(\"doubleclick\",function(A){A.data.dialog&&x.openDialog(A.data.dialog)},null,null,999)}});CKEDITOR.plugins.add(\"about\",{requires:\"dialog\",init:function(a){var b=a.addCommand(\"about\",new CKEDITOR.dialogCommand(\"about\"));b.modes={wysiwyg:1,source:1};b.canUndo=!1;b.readOnly=1;a.ui.addButton&&a.ui.addButton(\"About\",{label:a.lang.about.title,command:\"about\",toolbar:\"about\"});CKEDITOR.dialog.add(\"about\",this.path+\"dialogs/about.js\")}});(function(){CKEDITOR.plugins.add(\"a11yhelp\",{requires:\"dialog\",availableLangs:{af:1,ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,\"de-ch\":1,el:1,en:1,\"en-gb\":1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,fr:1,\"fr-ca\":1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,pl:1,pt:1,\"pt-br\":1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,sr:1,\"sr-latn\":1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,zh:1,\"zh-cn\":1},init:function(b){var c=this;b.addCommand(\"a11yHelp\",{exec:function(){var a=b.langCode,a=c.availableLangs[a]?\na:c.availableLangs[a.replace(/-.*/,\"\")]?a.replace(/-.*/,\"\"):\"en\";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+\"dialogs/lang/\"+a+\".js\"),function(){b.lang.a11yhelp=c.langEntries[a];b.openDialog(\"a11yHelp\")})},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:!1});b.setKeystroke(CKEDITOR.ALT+48,\"a11yHelp\");CKEDITOR.dialog.add(\"a11yHelp\",this.path+\"dialogs/a11yhelp.js\");b.on(\"ariaEditorHelpLabel\",function(a){a.data.label=b.lang.common.editorHelp})}})})();(function(){function f(c){var a=this.att;c=c&&c.hasAttribute(a)&&c.getAttribute(a)||\"\";void 0!==c&&this.setValue(c)}function g(){for(var c,a=0;a<arguments.length;a++)if(arguments[a]instanceof CKEDITOR.dom.element){c=arguments[a];break}if(c){var a=this.att,b=this.getValue();b?c.setAttribute(a,b):c.removeAttribute(a,b)}}var k={id:1,dir:1,classes:1,styles:1};CKEDITOR.plugins.add(\"dialogadvtab\",{requires:\"dialog\",allowedContent:function(c){c||(c=k);var a=[];c.id&&a.push(\"id\");c.dir&&a.push(\"dir\");var b=\n\"\";a.length&&(b+=\"[\"+a.join(\",\")+\"]\");c.classes&&(b+=\"(*)\");c.styles&&(b+=\"{*}\");return b},createAdvancedTab:function(c,a,b){a||(a=k);var d=c.lang.common,h={id:\"advanced\",label:d.advancedTab,title:d.advancedTab,elements:[{type:\"vbox\",padding:1,children:[]}]},e=[];if(a.id||a.dir)a.id&&e.push({id:\"advId\",att:\"id\",type:\"text\",requiredContent:b?b+\"[id]\":null,label:d.id,setup:f,commit:g}),a.dir&&e.push({id:\"advLangDir\",att:\"dir\",type:\"select\",requiredContent:b?b+\"[dir]\":null,label:d.langDir,\"default\":\"\",\nstyle:\"width:100%\",items:[[d.notSet,\"\"],[d.langDirLTR,\"ltr\"],[d.langDirRTL,\"rtl\"]],setup:f,commit:g}),h.elements[0].children.push({type:\"hbox\",widths:[\"50%\",\"50%\"],children:[].concat(e)});if(a.styles||a.classes)e=[],a.styles&&e.push({id:\"advStyles\",att:\"style\",type:\"text\",requiredContent:b?b+\"{cke-xyz}\":null,label:d.styles,\"default\":\"\",validate:CKEDITOR.dialog.validate.inlineStyle(d.invalidInlineStyle),onChange:function(){},getStyle:function(a,c){var b=this.getValue().match(new RegExp(\"(?:^|;)\\\\s*\"+\na+\"\\\\s*:\\\\s*([^;]*)\",\"i\"));return b?b[1]:c},updateStyle:function(a,b){var d=this.getValue(),e=c.document.createElement(\"span\");e.setAttribute(\"style\",d);e.setStyle(a,b);d=CKEDITOR.tools.normalizeCssText(e.getAttribute(\"style\"));this.setValue(d,1)},setup:f,commit:g}),a.classes&&e.push({type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{id:\"advCSSClasses\",att:\"class\",type:\"text\",requiredContent:b?b+\"(cke-xyz)\":null,label:d.cssClasses,\"default\":\"\",setup:f,commit:g}]}),h.elements[0].children.push({type:\"hbox\",\nwidths:[\"50%\",\"50%\"],children:[].concat(e)});return h}})})();CKEDITOR.plugins.add(\"basicstyles\",{init:function(c){var e=0,d=function(g,d,b,a){if(a){a=new CKEDITOR.style(a);var f=h[b];f.unshift(a);c.attachStyleStateChange(a,function(a){!c.readOnly&&c.getCommand(b).setState(a)});c.addCommand(b,new CKEDITOR.styleCommand(a,{contentForms:f}));c.ui.addButton&&c.ui.addButton(g,{label:d,command:b,toolbar:\"basicstyles,\"+(e+=10)})}},h={bold:[\"strong\",\"b\",[\"span\",function(a){a=a.styles[\"font-weight\"];return\"bold\"==a||700<=+a}]],italic:[\"em\",\"i\",[\"span\",function(a){return\"italic\"==\na.styles[\"font-style\"]}]],underline:[\"u\",[\"span\",function(a){return\"underline\"==a.styles[\"text-decoration\"]}]],strike:[\"s\",\"strike\",[\"span\",function(a){return\"line-through\"==a.styles[\"text-decoration\"]}]],subscript:[\"sub\"],superscript:[\"sup\"]},b=c.config,a=c.lang.basicstyles;d(\"Bold\",a.bold,\"bold\",b.coreStyles_bold);d(\"Italic\",a.italic,\"italic\",b.coreStyles_italic);d(\"Underline\",a.underline,\"underline\",b.coreStyles_underline);d(\"Strike\",a.strike,\"strike\",b.coreStyles_strike);d(\"Subscript\",a.subscript,\n\"subscript\",b.coreStyles_subscript);d(\"Superscript\",a.superscript,\"superscript\",b.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,\"bold\"],[CKEDITOR.CTRL+73,\"italic\"],[CKEDITOR.CTRL+85,\"underline\"]])}});CKEDITOR.config.coreStyles_bold={element:\"strong\",overrides:\"b\"};CKEDITOR.config.coreStyles_italic={element:\"em\",overrides:\"i\"};CKEDITOR.config.coreStyles_underline={element:\"u\"};CKEDITOR.config.coreStyles_strike={element:\"s\",overrides:\"strike\"};CKEDITOR.config.coreStyles_subscript={element:\"sub\"};\nCKEDITOR.config.coreStyles_superscript={element:\"sup\"};(function(){function q(a,f,d,b){if(!a.isReadOnly()&&!a.equals(d.editable())){CKEDITOR.dom.element.setMarker(b,a,\"bidi_processed\",1);b=a;for(var c=d.editable();(b=b.getParent())&&!b.equals(c);)if(b.getCustomData(\"bidi_processed\")){a.removeStyle(\"direction\");a.removeAttribute(\"dir\");return}b=\"useComputedState\"in d.config?d.config.useComputedState:1;(b?a.getComputedStyle(\"direction\"):a.getStyle(\"direction\")||a.hasAttribute(\"dir\"))!=f&&(a.removeStyle(\"direction\"),b?(a.removeAttribute(\"dir\"),f!=a.getComputedStyle(\"direction\")&&\na.setAttribute(\"dir\",f)):a.setAttribute(\"dir\",f),d.forceNextSelectionCheck())}}function v(a,f,d){var b=a.getCommonAncestor(!1,!0);a=a.clone();a.enlarge(d==CKEDITOR.ENTER_BR?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(a.checkBoundaryOfElement(b,CKEDITOR.START)&&a.checkBoundaryOfElement(b,CKEDITOR.END)){for(var c;b&&b.type==CKEDITOR.NODE_ELEMENT&&(c=b.getParent())&&1==c.getChildCount()&&!(b.getName()in f);)b=c;return b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in f&&b}}function p(a){return{context:\"p\",\nallowedContent:{\"h1 h2 h3 h4 h5 h6 table ul ol blockquote div tr p div li td\":{propertiesOnly:!0,attributes:\"dir\"}},requiredContent:\"p[dir]\",refresh:function(a,d){var b=a.config.useComputedState,c,b=void 0===b||b;if(!b){c=d.lastElement;for(var h=a.editable();c&&!(c.getName()in u||c.equals(h));){var e=c.getParent();if(!e)break;c=e}}c=c||d.block||d.blockLimit;c.equals(a.editable())&&(h=a.getSelection().getRanges()[0].getEnclosedNode())&&h.type==CKEDITOR.NODE_ELEMENT&&(c=h);c&&(b=b?c.getComputedStyle(\"direction\"):\nc.getStyle(\"direction\")||c.getAttribute(\"dir\"),a.getCommand(\"bidirtl\").setState(\"rtl\"==b?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF),a.getCommand(\"bidiltr\").setState(\"ltr\"==b?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF));b=(d.block||d.blockLimit||a.editable()).getDirection(1);b!=(a._.selDir||a.lang.dir)&&(a._.selDir=b,a.fire(\"contentDirChanged\",b))},exec:function(f){var d=f.getSelection(),b=f.config.enterMode,c=d.getRanges();if(c&&c.length){for(var h={},e=d.createBookmarks(),c=c.createIterator(),g,\nl=0;g=c.getNextRange(1);){var k=g.getEnclosedNode();k&&(!k||k.type==CKEDITOR.NODE_ELEMENT&&k.getName()in r)||(k=v(g,t,b));k&&q(k,a,f,h);var m=new CKEDITOR.dom.walker(g),n=e[l].startNode,p=e[l++].endNode;m.evaluator=function(a){var c=b==CKEDITOR.ENTER_P?\"p\":\"div\",d;if(d=(a?a.type==CKEDITOR.NODE_ELEMENT:!1)&&a.getName()in t){if(c=a.is(c))c=(c=a.getParent())?c.type==CKEDITOR.NODE_ELEMENT:!1;d=!(c&&a.getParent().is(\"blockquote\"))}return!!(d&&a.getPosition(n)&CKEDITOR.POSITION_FOLLOWING&&(a.getPosition(p)&\nCKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_CONTAINS)==CKEDITOR.POSITION_PRECEDING)};for(;k=m.next();)q(k,a,f,h);g=g.createIterator();for(g.enlargeBr=b!=CKEDITOR.ENTER_BR;k=g.getNextParagraph(b==CKEDITOR.ENTER_P?\"p\":\"div\");)q(k,a,f,h)}CKEDITOR.dom.element.clearAllMarkers(h);f.forceNextSelectionCheck();d.selectBookmarks(e);f.focus()}}}}function w(a){var f=a==l.setAttribute,d=a==l.removeAttribute,b=/\\bdirection\\s*:\\s*(.*?)\\s*(:?$|;)/;return function(c,h){if(!this.isReadOnly()){var e;if(e=c==(f||d?\n\"dir\":\"direction\")||\"style\"==c&&(d||b.test(h))){a:{e=this;for(var g=e.getDocument().getBody().getParent();e;){if(e.equals(g)){e=!1;break a}e=e.getParent()}e=!0}e=!e}if(e&&(e=this.getDirection(1),g=a.apply(this,arguments),e!=this.getDirection(1)))return this.getDocument().fire(\"dirChanged\",this),g}return a.apply(this,arguments)}}var t={table:1,ul:1,ol:1,blockquote:1,div:1},r={},u={};CKEDITOR.tools.extend(r,t,{tr:1,p:1,div:1,li:1});CKEDITOR.tools.extend(u,r,{td:1});CKEDITOR.plugins.add(\"bidi\",{init:function(a){function f(b,\nc,d,e,f){a.addCommand(d,new CKEDITOR.command(a,e));a.ui.addButton&&a.ui.addButton(b,{label:c,command:d,toolbar:\"bidi,\"+f})}if(!a.blockless){var d=a.lang.bidi;f(\"BidiLtr\",d.ltr,\"bidiltr\",p(\"ltr\"),10);f(\"BidiRtl\",d.rtl,\"bidirtl\",p(\"rtl\"),20);a.on(\"contentDom\",function(){a.document.on(\"dirChanged\",function(b){a.fire(\"dirChanged\",{node:b.data,dir:b.data.getDirection(1)})})});a.on(\"contentDirChanged\",function(b){b=(a.lang.dir!=b.data?\"add\":\"remove\")+\"Class\";var c=a.ui.space(a.config.toolbarLocation);if(c)c[b](\"cke_mixed_dir_content\")})}}});\nfor(var l=CKEDITOR.dom.element.prototype,n=[\"setStyle\",\"removeStyle\",\"setAttribute\",\"removeAttribute\"],m=0;m<n.length;m++)l[n[m]]=CKEDITOR.tools.override(l[n[m]],w)})();(function(){var m={exec:function(g){var a=g.getCommand(\"blockquote\").state,k=g.getSelection(),c=k&&k.getRanges()[0];if(c){var h=k.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&\"blockquote\"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&\"blockquote\"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator();\nf.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?\"p\":\"div\"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text(\"﻿\",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1,\ntr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),\"blockquote\"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement(\"blockquote\");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[];\nfor(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if(\"blockquote\"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&e&&!e.getCustomData(\"blockquote_moveout\")&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,\"blockquote_moveout\",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData(\"blockquote_processed\")||\n(e.push(c),CKEDITOR.dom.element.setMarker(d,c,\"blockquote_processed\",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,m=d.getChildCount(),l=void 0;f<m&&(l=d.getChild(f));f++)if(l.type==CKEDITOR.NODE_ELEMENT&&l.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),\"div\"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);!c||!f.getPrevious()||f.getPrevious().type==\nCKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()||b.append(g.document.createElement(\"br\"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement(\"br\"));b.replace(f);c=!1}}k.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains(\"blockquote\",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:\"blockquote\",allowedContent:\"blockquote\",\nrequiredContent:\"blockquote\"};CKEDITOR.plugins.add(\"blockquote\",{init:function(g){g.blockless||(g.addCommand(\"blockquote\",m),g.ui.addButton&&g.ui.addButton(\"Blockquote\",{label:g.lang.blockquote.toolbar,command:\"blockquote\",toolbar:\"blocks,10\"}))}})})();(function(){function r(b,a,c){a.type||(a.type=\"auto\");if(c&&!1===b.fire(\"beforePaste\",a)||!a.dataValue&&a.dataTransfer.isEmpty())return!1;a.dataValue||(a.dataValue=\"\");if(CKEDITOR.env.gecko&&\"drop\"==a.method&&b.toolbox)b.once(\"afterPaste\",function(){b.toolbox.focus()});return b.fire(\"paste\",a)}function y(b){function a(){var a=b.editable();if(CKEDITOR.plugins.clipboard.isCustomCopyCutSupported){var d=function(a){b.readOnly&&\"cut\"==a.name||n.initPasteDataTransfer(a,b);a.data.preventDefault()};a.on(\"copy\",\nd);a.on(\"cut\",d);a.on(\"cut\",function(){b.readOnly||b.extractSelectedHtml()},null,null,999)}a.on(n.mainPasteEvent,function(b){\"beforepaste\"==n.mainPasteEvent&&p||k(b)});\"beforepaste\"==n.mainPasteEvent&&(a.on(\"paste\",function(a){v||(e(),a.data.preventDefault(),k(a),f(\"paste\")||b.openDialog(\"paste\"))}),a.on(\"contextmenu\",g,null,null,0),a.on(\"beforepaste\",function(b){!b.data||b.data.$.ctrlKey||b.data.$.shiftKey||g()},null,null,0));a.on(\"beforecut\",function(){!p&&h(b)});var c;a.attachListener(CKEDITOR.env.ie?\na:b.document.getDocumentElement(),\"mouseup\",function(){c=setTimeout(function(){t()},0)});b.on(\"destroy\",function(){clearTimeout(c)});a.on(\"keyup\",t)}function c(a){return{type:a,canUndo:\"cut\"==a,startDisabled:!0,exec:function(){\"cut\"==this.type&&h();var a;var d=this.type;if(CKEDITOR.env.ie)a=f(d);else try{a=b.document.$.execCommand(d,!1,null)}catch(c){a=!1}a||b.showNotification(b.lang.clipboard[this.type+\"Error\"]);return a}}}function d(){return{canUndo:!1,async:!0,exec:function(b,a){var d=function(a,\nd){a&&r(b,a,!!d);b.fire(\"afterCommandExec\",{name:\"paste\",command:c,returnValue:!!a})},c=this;\"string\"==typeof a?d({dataValue:a,method:\"paste\",dataTransfer:n.initPasteDataTransfer()},1):b.getClipboardData(d)}}}function e(){v=1;setTimeout(function(){v=0},100)}function g(){p=1;setTimeout(function(){p=0},10)}function f(a){var d=b.document,c=d.getBody(),e=!1,f=function(){e=!0};c.on(a,f);7<CKEDITOR.env.version?d.$.execCommand(a):d.$.selection.createRange().execCommand(a);c.removeListener(a,f);return e}\nfunction h(){if(CKEDITOR.env.ie&&!CKEDITOR.env.quirks){var a=b.getSelection(),d,c,e;a.getType()==CKEDITOR.SELECTION_ELEMENT&&(d=a.getSelectedElement())&&(c=a.getRanges()[0],e=b.document.createText(\"\"),e.insertBefore(d),c.setStartBefore(e),c.setEndAfter(d),a.selectRanges([c]),setTimeout(function(){d.getParent()&&(e.remove(),a.selectElement(d))},0))}}function l(a,d){var c=b.document,e=b.editable(),f=function(b){b.cancel()},q;if(!c.getById(\"cke_pastebin\")){var g=b.getSelection(),h=g.createBookmarks();\nCKEDITOR.env.ie&&g.root.fire(\"selectionchange\");var m=new CKEDITOR.dom.element(!CKEDITOR.env.webkit&&!e.is(\"body\")||CKEDITOR.env.ie?\"div\":\"body\",c);m.setAttributes({id:\"cke_pastebin\",\"data-cke-temp\":\"1\"});var k=0,c=c.getWindow();CKEDITOR.env.webkit?(e.append(m),m.addClass(\"cke_editable\"),e.is(\"body\")||(k=\"static\"!=e.getComputedStyle(\"position\")?e:CKEDITOR.dom.element.get(e.$.offsetParent),k=k.getDocumentPosition().y)):e.getAscendant(CKEDITOR.env.ie?\"body\":\"html\",1).append(m);m.setStyles({position:\"absolute\",\ntop:c.getScrollPosition().y-k+10+\"px\",width:\"1px\",height:Math.max(1,c.getViewPaneSize().height-20)+\"px\",overflow:\"hidden\",margin:0,padding:0});CKEDITOR.env.safari&&m.setStyles(CKEDITOR.tools.cssVendorPrefix(\"user-select\",\"text\"));(k=m.getParent().isReadOnly())?(m.setOpacity(0),m.setAttribute(\"contenteditable\",!0)):m.setStyle(\"ltr\"==b.config.contentsLangDirection?\"left\":\"right\",\"-1000px\");b.on(\"selectionChange\",f,null,null,0);if(CKEDITOR.env.webkit||CKEDITOR.env.gecko)q=e.once(\"blur\",f,null,null,-100);\nk&&m.focus();k=new CKEDITOR.dom.range(m);k.selectNodeContents(m);var t=k.select();CKEDITOR.env.ie&&(q=e.once(\"blur\",function(){b.lockSelection(t)}));var l=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){CKEDITOR.env.webkit&&(CKEDITOR.document.getBody().$.scrollTop=l);q&&q.removeListener();CKEDITOR.env.ie&&e.focus();g.selectBookmarks(h);m.remove();var a;CKEDITOR.env.webkit&&(a=m.getFirst())&&a.is&&a.hasClass(\"Apple-style-span\")&&(m=a);b.removeListener(\"selectionChange\",f);\nd(m.getHtml())},0)}}function z(){if(\"paste\"==n.mainPasteEvent)return b.fire(\"beforePaste\",{type:\"auto\",method:\"paste\"}),!1;b.focus();e();var a=b.focusManager;a.lock();if(b.editable().fire(n.mainPasteEvent)&&!f(\"paste\"))return a.unlock(),!1;a.unlock();return!0}function q(a){if(\"wysiwyg\"==b.mode)switch(a.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:a=b.editable();e();\"paste\"==n.mainPasteEvent&&a.fire(\"beforepaste\");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:b.fire(\"saveSnapshot\"),\nsetTimeout(function(){b.fire(\"saveSnapshot\")},50)}}function k(a){var d={type:\"auto\",method:\"paste\",dataTransfer:n.initPasteDataTransfer(a)};d.dataTransfer.cacheData();var c=!1!==b.fire(\"beforePaste\",d);c&&n.canClipboardApiBeTrusted(d.dataTransfer,b)?(a.data.preventDefault(),setTimeout(function(){r(b,d)},0)):l(a,function(a){d.dataValue=a.replace(/<span[^>]+data-cke-bookmark[^<]*?<\\/span>/ig,\"\");c&&r(b,d)})}function t(){if(\"wysiwyg\"==b.mode){var a=u(\"paste\");b.getCommand(\"cut\").setState(u(\"cut\"));b.getCommand(\"copy\").setState(u(\"copy\"));\nb.getCommand(\"paste\").setState(a);b.fire(\"pasteState\",a)}}function u(a){if(w&&a in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if(\"paste\"==a)return CKEDITOR.TRISTATE_OFF;a=b.getSelection();var d=a.getRanges();return a.getType()==CKEDITOR.SELECTION_NONE||1==d.length&&d[0].collapsed?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var n=CKEDITOR.plugins.clipboard,p=0,v=0,w=0;(function(){b.on(\"key\",q);b.on(\"contentDom\",a);b.on(\"selectionChange\",function(b){w=b.data.selection.getRanges()[0].checkReadOnly();\nt()});b.contextMenu&&b.contextMenu.addListener(function(b,a){w=a.getRanges()[0].checkReadOnly();return{cut:u(\"cut\"),copy:u(\"copy\"),paste:u(\"paste\")}})})();(function(){function a(d,c,e,f,q){var g=b.lang.clipboard[c];b.addCommand(c,e);b.ui.addButton&&b.ui.addButton(d,{label:g,command:c,toolbar:\"clipboard,\"+f});b.addMenuItems&&b.addMenuItem(c,{label:g,command:c,group:\"clipboard\",order:q})}a(\"Cut\",\"cut\",c(\"cut\"),10,1);a(\"Copy\",\"copy\",c(\"copy\"),20,4);a(\"Paste\",\"paste\",d(),30,8)})();b.getClipboardData=\nfunction(a,d){function c(a){a.removeListener();a.cancel();d(a.data)}function e(a){a.removeListener();a.cancel();k=!0;d({type:g,dataValue:a.data.dataValue,dataTransfer:a.data.dataTransfer,method:\"paste\"})}function f(){this.customTitle=a&&a.title}var q=!1,g=\"auto\",k=!1;d||(d=a,a=null);b.on(\"paste\",c,null,null,0);b.on(\"beforePaste\",function(a){a.removeListener();q=!0;g=a.data.type},null,null,1E3);!1===z()&&(b.removeListener(\"paste\",c),q&&b.fire(\"pasteDialog\",f)?(b.on(\"pasteDialogCommit\",e),b.on(\"dialogHide\",\nfunction(a){a.removeListener();a.data.removeListener(\"pasteDialogCommit\",e);setTimeout(function(){k||d(null)},10)})):d(null))}}function A(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(<div><br( ?\\/)?><\\/div>|<div>[^<]*<\\/div>)*$/gi))return\"html\"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|<br( ?\\/)?>)*$/gi)&&!b.match(/^(<p>([^<]|<br( ?\\/)?>)*<\\/p>|(\\r\\n))*$/gi))return\"html\"}else if(CKEDITOR.env.gecko){if(!b.match(/^([^<]|<br( ?\\/)?>)*$/gi))return\"html\"}else return\"html\";return\"htmlifiedtext\"}\nfunction B(b,a){function c(a){return CKEDITOR.tools.repeat(\"\\x3c/p\\x3e\\x3cp\\x3e\",~~(a/2))+(1==a%2?\"\\x3cbr\\x3e\":\"\")}a=a.replace(/\\s+/g,\" \").replace(/> +</g,\"\\x3e\\x3c\").replace(/<br ?\\/>/gi,\"\\x3cbr\\x3e\");a=a.replace(/<\\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1<a.indexOf(\"\\x3cdiv\\x3e\")&&(a=a.replace(/^(<div>(<br>|)<\\/div>)(?!$|(<div>(<br>|)<\\/div>))/g,\"\\x3cbr\\x3e\").replace(/^(<div>(<br>|)<\\/div>){2}(?!$)/g,\"\\x3cdiv\\x3e\\x3c/div\\x3e\"),a.match(/<div>(<br>|)<\\/div>/)&&\n(a=\"\\x3cp\\x3e\"+a.replace(/(<div>(<br>|)<\\/div>)+/g,function(a){return c(a.split(\"\\x3c/div\\x3e\\x3cdiv\\x3e\").length+1)})+\"\\x3c/p\\x3e\"),a=a.replace(/<\\/div><div>/g,\"\\x3cbr\\x3e\"),a=a.replace(/<\\/?div>/g,\"\"));CKEDITOR.env.gecko&&b.enterMode!=CKEDITOR.ENTER_BR&&(CKEDITOR.env.gecko&&(a=a.replace(/^<br><br>$/,\"\\x3cbr\\x3e\")),-1<a.indexOf(\"\\x3cbr\\x3e\\x3cbr\\x3e\")&&(a=\"\\x3cp\\x3e\"+a.replace(/(<br>){2,}/g,function(a){return c(a.length/4)})+\"\\x3c/p\\x3e\"));return C(b,a)}function D(){function b(){var a={},b;for(b in CKEDITOR.dtd)\"$\"!=\nb.charAt(0)&&\"div\"!=b&&\"span\"!=b&&(a[b]=1);return a}var a={};return{get:function(c){return\"plain-text\"==c?a.plainText||(a.plainText=new CKEDITOR.filter(\"br\")):\"semantic-content\"==c?((c=a.semanticContent)||(c=new CKEDITOR.filter,c.allow({$1:{elements:b(),attributes:!0,styles:!1,classes:!1}}),c=a.semanticContent=c),c):c?new CKEDITOR.filter(c):null}}}function x(b,a,c){a=CKEDITOR.htmlParser.fragment.fromHtml(a);var d=new CKEDITOR.htmlParser.basicWriter;c.applyTo(a,!0,!1,b.activeEnterMode);a.writeHtml(d);\nreturn d.getHtml()}function C(b,a){b.enterMode==CKEDITOR.ENTER_BR?a=a.replace(/(<\\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat(\"\\x3cbr\\x3e\",a.length/7*2)}).replace(/<\\/?p>/g,\"\"):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\\/)?p>/g,\"\\x3c$1div\\x3e\"));return a}function E(b){b.data.preventDefault();b.data.$.dataTransfer.dropEffect=\"none\"}function F(b){var a=CKEDITOR.plugins.clipboard;b.on(\"contentDom\",function(){function c(a,d,c){d.select();r(b,{dataTransfer:c,method:\"drop\"},1);c.sourceEditor.fire(\"saveSnapshot\");\nc.sourceEditor.editable().extractHtmlFromRange(a);c.sourceEditor.getSelection().selectRanges([a]);c.sourceEditor.fire(\"saveSnapshot\")}function d(d,c){d.select();r(b,{dataTransfer:c,method:\"drop\"},1);a.resetDragDataTransfer()}function e(a,d,c){var e={$:a.data.$,target:a.data.getTarget()};d&&(e.dragRange=d);c&&(e.dropRange=c);!1===b.fire(a.name,e)&&a.data.preventDefault()}function g(a){a.type!=CKEDITOR.NODE_ELEMENT&&(a=a.getParent());return a.getChildCount()}var f=b.editable(),h=CKEDITOR.plugins.clipboard.getDropTarget(b),\nl=b.ui.space(\"top\"),p=b.ui.space(\"bottom\");a.preventDefaultDropOnElement(l);a.preventDefaultDropOnElement(p);f.attachListener(h,\"dragstart\",e);f.attachListener(b,\"dragstart\",a.resetDragDataTransfer,a,null,1);f.attachListener(b,\"dragstart\",function(d){a.initDragDataTransfer(d,b)},null,null,2);f.attachListener(b,\"dragstart\",function(){var d=a.dragRange=b.getSelection().getRanges()[0];CKEDITOR.env.ie&&10>CKEDITOR.env.version&&(a.dragStartContainerChildCount=d?g(d.startContainer):null,a.dragEndContainerChildCount=\nd?g(d.endContainer):null)},null,null,100);f.attachListener(h,\"dragend\",e);f.attachListener(b,\"dragend\",a.initDragDataTransfer,a,null,1);f.attachListener(b,\"dragend\",a.resetDragDataTransfer,a,null,100);f.attachListener(h,\"dragover\",function(a){var b=a.data.getTarget();b&&b.is&&b.is(\"html\")?a.data.preventDefault():CKEDITOR.env.ie&&CKEDITOR.plugins.clipboard.isFileApiSupported&&a.data.$.dataTransfer.types.contains(\"Files\")&&a.data.preventDefault()});f.attachListener(h,\"drop\",function(d){if(!d.data.$.defaultPrevented){d.data.preventDefault();\nvar c=d.data.getTarget();if(!c.isReadOnly()||c.type==CKEDITOR.NODE_ELEMENT&&c.is(\"html\")){var c=a.getRangeAtDropPosition(d,b),f=a.dragRange;c&&e(d,f,c)}}},null,null,9999);f.attachListener(b,\"drop\",a.initDragDataTransfer,a,null,1);f.attachListener(b,\"drop\",function(e){if(e=e.data){var f=e.dropRange,g=e.dragRange,h=e.dataTransfer;h.getTransferType(b)==CKEDITOR.DATA_TRANSFER_INTERNAL?setTimeout(function(){a.internalDrop(g,f,h,b)},0):h.getTransferType(b)==CKEDITOR.DATA_TRANSFER_CROSS_EDITORS?c(g,f,h):\nd(f,h)}},null,null,9999)})}CKEDITOR.plugins.add(\"clipboard\",{requires:\"dialog\",init:function(b){var a,c=D();b.config.forcePasteAsPlainText?a=\"plain-text\":b.config.pasteFilter?a=b.config.pasteFilter:!CKEDITOR.env.webkit||\"pasteFilter\"in b.config||(a=\"semantic-content\");b.pasteFilter=c.get(a);y(b);F(b);CKEDITOR.dialog.add(\"paste\",CKEDITOR.getUrl(this.path+\"dialogs/paste.js\"));b.on(\"paste\",function(a){a.data.dataTransfer||(a.data.dataTransfer=new CKEDITOR.plugins.clipboard.dataTransfer);if(!a.data.dataValue){var c=\na.data.dataTransfer,g=c.getData(\"text/html\");if(g)a.data.dataValue=g,a.data.type=\"html\";else if(g=c.getData(\"text/plain\"))a.data.dataValue=b.editable().transformPlainTextToHtml(g),a.data.type=\"text\"}},null,null,1);b.on(\"paste\",function(a){var b=a.data.dataValue,c=CKEDITOR.dtd.$block;-1<b.indexOf(\"Apple-\")&&(b=b.replace(/<span class=\"Apple-converted-space\">&nbsp;<\\/span>/gi,\" \"),\"html\"!=a.data.type&&(b=b.replace(/<span class=\"Apple-tab-span\"[^>]*>([^<]*)<\\/span>/gi,function(a,b){return b.replace(/\\t/g,\n\"\\x26nbsp;\\x26nbsp; \\x26nbsp;\")})),-1<b.indexOf('\\x3cbr class\\x3d\"Apple-interchange-newline\"\\x3e')&&(a.data.startsWithEOL=1,a.data.preSniffing=\"html\",b=b.replace(/<br class=\"Apple-interchange-newline\">/,\"\")),b=b.replace(/(<[^>]+) class=\"Apple-[^\"]*\"/gi,\"$1\"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var f,h,l=new CKEDITOR.dom.element(\"div\");for(l.setHtml(b);1==l.getChildCount()&&(f=l.getFirst())&&f.type==CKEDITOR.NODE_ELEMENT&&(f.hasClass(\"cke_editable\")||f.hasClass(\"cke_contents\"));)l=h=f;\nh&&(b=h.getHtml().replace(/<br>$/i,\"\"))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\\r\\n)?<(\\w+)/g,function(b,f){return f.toLowerCase()in c?(a.data.preSniffing=\"html\",\"\\x3c\"+f):b}):CKEDITOR.env.webkit?b=b.replace(/<\\/(\\w+)><div><br><\\/div>$/,function(b,f){return f in c?(a.data.endsWithEOL=1,\"\\x3c/\"+f+\"\\x3e\"):b}):CKEDITOR.env.gecko&&(b=b.replace(/(\\s)<br>$/,\"$1\"));a.data.dataValue=b},null,null,3);b.on(\"paste\",function(a){a=a.data;var e=a.type,g=a.dataValue,f,h=b.config.clipboard_defaultContentType||\"html\",\nl=a.dataTransfer.getTransferType(b);f=\"html\"==e||\"html\"==a.preSniffing?\"html\":A(g);\"htmlifiedtext\"==f&&(g=B(b.config,g));\"text\"==e&&\"html\"==f?g=x(b,g,c.get(\"plain-text\")):l==CKEDITOR.DATA_TRANSFER_EXTERNAL&&b.pasteFilter&&!a.dontFilter&&(g=x(b,g,b.pasteFilter));a.startsWithEOL&&(g='\\x3cbr data-cke-eol\\x3d\"1\"\\x3e'+g);a.endsWithEOL&&(g+='\\x3cbr data-cke-eol\\x3d\"1\"\\x3e');\"auto\"==e&&(e=\"html\"==f||\"html\"==h?\"html\":\"text\");a.type=e;a.dataValue=g;delete a.preSniffing;delete a.startsWithEOL;delete a.endsWithEOL},\nnull,null,6);b.on(\"paste\",function(a){a=a.data;a.dataValue&&(b.insertHtml(a.dataValue,a.type,a.range),setTimeout(function(){b.fire(\"afterPaste\")},0))},null,null,1E3);b.on(\"pasteDialog\",function(a){setTimeout(function(){b.openDialog(\"paste\",a.data)},0)})}});CKEDITOR.plugins.clipboard={isCustomCopyCutSupported:!CKEDITOR.env.ie&&!CKEDITOR.env.iOS,isCustomDataTypesSupported:!CKEDITOR.env.ie,isFileApiSupported:!CKEDITOR.env.ie||9<CKEDITOR.env.version,mainPasteEvent:CKEDITOR.env.ie&&!CKEDITOR.env.edge?\n\"beforepaste\":\"paste\",canClipboardApiBeTrusted:function(b,a){return b.getTransferType(a)!=CKEDITOR.DATA_TRANSFER_EXTERNAL||CKEDITOR.env.chrome&&!b.isEmpty()||CKEDITOR.env.gecko&&(b.getData(\"text/html\")||b.getFilesCount())?!0:!1},getDropTarget:function(b){var a=b.editable();return CKEDITOR.env.ie&&9>CKEDITOR.env.version||a.isInline()?a:b.document},fixSplitNodesAfterDrop:function(b,a,c,d){function e(b,c,d){var e=b;e.type==CKEDITOR.NODE_TEXT&&(e=b.getParent());if(e.equals(c)&&d!=c.getChildCount())return b=\na.startContainer.getChild(a.startOffset-1),c=a.startContainer.getChild(a.startOffset),b&&b.type==CKEDITOR.NODE_TEXT&&c&&c.type==CKEDITOR.NODE_TEXT&&(d=b.getLength(),b.setText(b.getText()+c.getText()),c.remove(),a.setStart(b,d),a.collapse(!0)),!0}var g=a.startContainer;\"number\"==typeof d&&\"number\"==typeof c&&g.type==CKEDITOR.NODE_ELEMENT&&(e(b.startContainer,g,c)||e(b.endContainer,g,d))},isDropRangeAffectedByDragRange:function(b,a){var c=a.startContainer,d=a.endOffset;return b.endContainer.equals(c)&&\nb.endOffset<=d||b.startContainer.getParent().equals(c)&&b.startContainer.getIndex()<d||b.endContainer.getParent().equals(c)&&b.endContainer.getIndex()<d?!0:!1},internalDrop:function(b,a,c,d){var e=CKEDITOR.plugins.clipboard,g=d.editable(),f,h;d.fire(\"saveSnapshot\");d.fire(\"lockSnapshot\",{dontUpdate:1});CKEDITOR.env.ie&&10>CKEDITOR.env.version&&this.fixSplitNodesAfterDrop(b,a,e.dragStartContainerChildCount,e.dragEndContainerChildCount);(h=this.isDropRangeAffectedByDragRange(b,a))||(f=b.createBookmark(!1));\ne=a.clone().createBookmark(!1);h&&(f=b.createBookmark(!1));b=f.startNode;a=f.endNode;h=e.startNode;a&&b.getPosition(h)&CKEDITOR.POSITION_PRECEDING&&a.getPosition(h)&CKEDITOR.POSITION_FOLLOWING&&h.insertBefore(b);b=d.createRange();b.moveToBookmark(f);g.extractHtmlFromRange(b,1);a=d.createRange();a.moveToBookmark(e);r(d,{dataTransfer:c,method:\"drop\",range:a},1);d.fire(\"unlockSnapshot\")},getRangeAtDropPosition:function(b,a){var c=b.data.$,d=c.clientX,e=c.clientY,g=a.getSelection(!0).getRanges()[0],f=\na.createRange();if(b.data.testRange)return b.data.testRange;if(document.caretRangeFromPoint)c=a.document.$.caretRangeFromPoint(d,e),f.setStart(CKEDITOR.dom.node(c.startContainer),c.startOffset),f.collapse(!0);else if(c.rangeParent)f.setStart(CKEDITOR.dom.node(c.rangeParent),c.rangeOffset),f.collapse(!0);else{if(CKEDITOR.env.ie&&8<CKEDITOR.env.version&&g&&a.editable().hasFocus)return g;if(document.body.createTextRange){a.focus();c=a.document.getBody().$.createTextRange();try{for(var h=!1,l=0;20>l&&\n!h;l++){if(!h)try{c.moveToPoint(d,e-l),h=!0}catch(p){}if(!h)try{c.moveToPoint(d,e+l),h=!0}catch(q){}}if(h){var k=\"cke-temp-\"+(new Date).getTime();c.pasteHTML('\\x3cspan id\\x3d\"'+k+'\"\\x3e​\\x3c/span\\x3e');var t=a.document.getById(k);f.moveToPosition(t,CKEDITOR.POSITION_BEFORE_START);t.remove()}else{var u=a.document.$.elementFromPoint(d,e),n=new CKEDITOR.dom.element(u),r;if(n.equals(a.editable())||\"html\"==n.getName())return g&&g.startContainer&&!g.startContainer.equals(a.editable())?g:null;r=n.getClientRect();\nd<r.left?f.setStartAt(n,CKEDITOR.POSITION_AFTER_START):f.setStartAt(n,CKEDITOR.POSITION_BEFORE_END);f.collapse(!0)}}catch(v){return null}}else return null}return f},initDragDataTransfer:function(b,a){var c=b.data.$?b.data.$.dataTransfer:null,d=new this.dataTransfer(c,a);c?this.dragData&&d.id==this.dragData.id?d=this.dragData:this.dragData=d:this.dragData?d=this.dragData:this.dragData=d;b.data.dataTransfer=d},resetDragDataTransfer:function(){this.dragData=null},initPasteDataTransfer:function(b,a){if(this.isCustomCopyCutSupported&&\nb&&b.data&&b.data.$){var c=new this.dataTransfer(b.data.$.clipboardData,a);this.copyCutData&&c.id==this.copyCutData.id?(c=this.copyCutData,c.$=b.data.$.clipboardData):this.copyCutData=c;return c}return new this.dataTransfer(null,a)},preventDefaultDropOnElement:function(b){b&&b.on(\"dragover\",E)}};var p=CKEDITOR.plugins.clipboard.isCustomDataTypesSupported?\"cke/id\":\"Text\";CKEDITOR.plugins.clipboard.dataTransfer=function(b,a){b&&(this.$=b);this._={metaRegExp:/^<meta.*?>/i,bodyRegExp:/<body(?:[\\s\\S]*?)>([\\s\\S]*)<\\/body>/i,\nfragmentRegExp:/\\x3c!--(?:Start|End)Fragment--\\x3e/g,data:{},files:[],normalizeType:function(a){a=a.toLowerCase();return\"text\"==a||\"text/plain\"==a?\"Text\":\"url\"==a?\"URL\":a}};this.id=this.getData(p);this.id||(this.id=\"Text\"==p?\"\":\"cke-\"+CKEDITOR.tools.getUniqueId());if(\"Text\"!=p)try{this.$.setData(p,this.id)}catch(c){}a&&(this.sourceEditor=a,this.setData(\"text/html\",a.getSelectedHtml(1)),\"Text\"==p||this.getData(\"text/plain\")||this.setData(\"text/plain\",a.getSelection().getSelectedText()))};CKEDITOR.DATA_TRANSFER_INTERNAL=\n1;CKEDITOR.DATA_TRANSFER_CROSS_EDITORS=2;CKEDITOR.DATA_TRANSFER_EXTERNAL=3;CKEDITOR.plugins.clipboard.dataTransfer.prototype={getData:function(b){b=this._.normalizeType(b);var a=this._.data[b];if(void 0===a||null===a||\"\"===a)try{a=this.$.getData(b)}catch(c){}if(void 0===a||null===a||\"\"===a)a=\"\";\"text/html\"==b?(a=a.replace(this._.metaRegExp,\"\"),(b=this._.bodyRegExp.exec(a))&&b.length&&(a=b[1],a=a.replace(this._.fragmentRegExp,\"\"))):\"Text\"==b&&CKEDITOR.env.gecko&&this.getFilesCount()&&\"file://\"==a.substring(0,\n7)&&(a=\"\");return a},setData:function(b,a){b=this._.normalizeType(b);this._.data[b]=a;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported||\"URL\"==b||\"Text\"==b){\"Text\"==p&&\"Text\"==b&&(this.id=a);try{this.$.setData(b,a)}catch(c){}}},getTransferType:function(b){return this.sourceEditor?this.sourceEditor==b?CKEDITOR.DATA_TRANSFER_INTERNAL:CKEDITOR.DATA_TRANSFER_CROSS_EDITORS:CKEDITOR.DATA_TRANSFER_EXTERNAL},cacheData:function(){function b(b){b=a._.normalizeType(b);var c=a.getData(b);c&&(a._.data[b]=\nc)}if(this.$){var a=this,c,d;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported){if(this.$.types)for(c=0;c<this.$.types.length;c++)b(this.$.types[c])}else b(\"Text\"),b(\"URL\");d=this._getImageFromClipboard();if(this.$&&this.$.files||d){this._.files=[];for(c=0;c<this.$.files.length;c++)this._.files.push(this.$.files[c]);0===this._.files.length&&d&&this._.files.push(d)}}},getFilesCount:function(){return this._.files.length?this._.files.length:this.$&&this.$.files&&this.$.files.length?this.$.files.length:\nthis._getImageFromClipboard()?1:0},getFile:function(b){return this._.files.length?this._.files[b]:this.$&&this.$.files&&this.$.files.length?this.$.files[b]:0===b?this._getImageFromClipboard():void 0},isEmpty:function(){var b={},a;if(this.getFilesCount())return!1;for(a in this._.data)b[a]=1;if(this.$)if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported){if(this.$.types)for(var c=0;c<this.$.types.length;c++)b[this.$.types[c]]=1}else b.Text=1,b.URL=1;\"Text\"!=p&&(b[p]=0);for(a in b)if(b[a]&&\"\"!==\nthis.getData(a))return!1;return!0},_getImageFromClipboard:function(){var b;if(this.$&&this.$.items&&this.$.items[0])try{if((b=this.$.items[0].getAsFile())&&b.type)return b}catch(a){}}}})();(function(){var c='\\x3ca id\\x3d\"{id}\" class\\x3d\"cke_button cke_button__{name} cke_button_{state} {cls}\"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?\"\":\" href\\x3d\\\"javascript:void('{titleJs}')\\\"\")+' title\\x3d\"{title}\" tabindex\\x3d\"-1\" hidefocus\\x3d\"true\" role\\x3d\"button\" aria-labelledby\\x3d\"{id}_label\" aria-haspopup\\x3d\"{hasArrow}\" aria-disabled\\x3d\"{ariaDisabled}\"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress\\x3d\"return false;\"');CKEDITOR.env.gecko&&(c+=' onblur\\x3d\"this.style.cssText \\x3d this.style.cssText;\"');\nvar c=c+(' onkeydown\\x3d\"return CKEDITOR.tools.callFunction({keydownFn},event);\" onfocus\\x3d\"return CKEDITOR.tools.callFunction({focusFn},event);\" '+(CKEDITOR.env.ie?'onclick\\x3d\"return false;\" onmouseup':\"onclick\")+'\\x3d\"CKEDITOR.tools.callFunction({clickFn},this);return false;\"\\x3e\\x3cspan class\\x3d\"cke_button_icon cke_button__{iconName}_icon\" style\\x3d\"{style}\"'),c=c+'\\x3e\\x26nbsp;\\x3c/span\\x3e\\x3cspan id\\x3d\"{id}_label\" class\\x3d\"cke_button_label cke_button__{name}_label\" aria-hidden\\x3d\"false\"\\x3e{label}\\x3c/span\\x3e{arrowHtml}\\x3c/a\\x3e',\nr=CKEDITOR.addTemplate(\"buttonArrow\",'\\x3cspan class\\x3d\"cke_button_arrow\"\\x3e'+(CKEDITOR.env.hc?\"\\x26#9660;\":\"\")+\"\\x3c/span\\x3e\"),t=CKEDITOR.addTemplate(\"button\",c);CKEDITOR.plugins.add(\"button\",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON=\"button\";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}};\nCKEDITOR.ui.button.prototype={render:function(a,b){function c(){var e=a.mode;e&&(e=this.modes[e]?void 0!==k[e]?k[e]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,e=a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED:e,this.setState(e),this.refresh&&this.refresh())}var l=CKEDITOR.env,m=this._.id=CKEDITOR.tools.getNextId(),f=\"\",g=this.command,n;this._.editor=a;var d={id:m,button:this,editor:a,focus:function(){CKEDITOR.document.getById(m).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},\nu=CKEDITOR.tools.addFunction(function(a){if(d.onkey)return a=new CKEDITOR.dom.event(a),!1!==d.onkey(d,a.getKeystroke())}),v=CKEDITOR.tools.addFunction(function(a){var b;d.onfocus&&(b=!1!==d.onfocus(d,new CKEDITOR.dom.event(a)));return b}),p=0;d.clickFn=n=CKEDITOR.tools.addFunction(function(){p&&(a.unlockSelection(1),p=0);d.execute();l.iOS&&a.focus()});if(this.modes){var k={};a.on(\"beforeModeUnload\",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(k[a.mode]=this._.state)},this);a.on(\"activeFilterChange\",\nc,this);a.on(\"mode\",c,this);!this.readOnly&&a.on(\"readOnly\",c,this)}else g&&(g=a.getCommand(g))&&(g.on(\"state\",function(){this.setState(g.state)},this),f+=g.state==CKEDITOR.TRISTATE_ON?\"on\":g.state==CKEDITOR.TRISTATE_DISABLED?\"disabled\":\"off\");if(this.directional)a.on(\"contentDirChanged\",function(b){var c=CKEDITOR.document.getById(this._.id),d=c.getFirst();b=b.data;b!=a.lang.dir?c.addClass(\"cke_\"+b):c.removeClass(\"cke_ltr\").removeClass(\"cke_rtl\");d.setAttribute(\"style\",CKEDITOR.skin.getIconStyle(h,\n\"rtl\"==b,this.icon,this.iconOffset))},this);g||(f+=\"off\");var q=this.name||this.command,h=q;this.icon&&!/\\./.test(this.icon)&&(h=this.icon,this.icon=null);f={id:m,name:q,iconName:h,label:this.label,cls:this.className||\"\",state:f,ariaDisabled:\"disabled\"==f?\"true\":\"false\",title:this.title,titleJs:l.gecko&&!l.hc?\"\":(this.title||\"\").replace(\"'\",\"\"),hasArrow:this.hasArrow?\"true\":\"false\",keydownFn:u,focusFn:v,clickFn:n,style:CKEDITOR.skin.getIconStyle(h,\"rtl\"==a.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?\nr.output():\"\"};t.output(f,b);if(this.onRender)this.onRender();return d},setState:function(a){if(this._.state==a)return!1;this._.state=a;var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,\"cke_button\"),a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute(\"aria-disabled\",!0):b.removeAttribute(\"aria-disabled\"),this.hasArrow?(a=a==CKEDITOR.TRISTATE_ON?this._.editor.lang.button.selectedLabel.replace(/%1/g,this.label):this.label,CKEDITOR.document.getById(this._.id+\"_label\").setText(a)):a==CKEDITOR.TRISTATE_ON?\nb.setAttribute(\"aria-pressed\",!0):b.removeAttribute(\"aria-pressed\"),!0):!1},getState:function(){return this._.state},toFeature:function(a){if(this._.feature)return this._.feature;var b=this;this.allowedContent||this.requiredContent||!this.command||(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();CKEDITOR.plugins.add(\"panelbutton\",{requires:\"button\",onLoad:function(){function e(c){var a=this._;a.state!=CKEDITOR.TRISTATE_DISABLED&&(this.createPanel(c),a.on?a.panel.hide():a.panel.showBlock(this._.id,this.document.getById(this._.id),4))}CKEDITOR.ui.panelButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){var a=c.panel||{};delete c.panel;this.base(c);this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.block={attributes:a.attributes};this.hasArrow=a.toolbarRelated=\n!0;this.click=e;this._={panelDefinition:a}},statics:{handler:{create:function(c){return new CKEDITOR.ui.panelButton(c)}}},proto:{createPanel:function(c){var a=this._;if(!a.panel){var f=this._.panelDefinition,e=this._.panelDefinition.block,g=f.parent||CKEDITOR.document.getBody(),d=this._.panel=new CKEDITOR.ui.floatPanel(c,g,f),f=d.addBlock(a.id,e),b=this;d.onShow=function(){b.className&&this.element.addClass(b.className+\"_panel\");b.setState(CKEDITOR.TRISTATE_ON);a.on=1;b.editorFocus&&c.focus();if(b.onOpen)b.onOpen()};\nd.onHide=function(d){b.className&&this.element.getFirst().removeClass(b.className+\"_panel\");b.setState(b.modes&&b.modes[c.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);a.on=0;if(!d&&b.onClose)b.onClose()};d.onEscape=function(){d.hide(1);b.document.getById(a.id).focus()};if(this.onBlock)this.onBlock(d,f);f.onHide=function(){a.on=0;b.setState(CKEDITOR.TRISTATE_OFF)}}}}})},beforeInit:function(e){e.ui.addHandler(CKEDITOR.UI_PANELBUTTON,CKEDITOR.ui.panelButton.handler)}});\nCKEDITOR.UI_PANELBUTTON=\"panelbutton\";(function(){CKEDITOR.plugins.add(\"panel\",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL=\"panel\";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:\"\",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var f=CKEDITOR.addTemplate(\"panel\",\n'\\x3cdiv lang\\x3d\"{langCode}\" id\\x3d\"{id}\" dir\\x3d{dir} class\\x3d\"cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}\" style\\x3d\"z-index:{z-index}\" role\\x3d\"presentation\"\\x3e{frame}\\x3c/div\\x3e'),g=CKEDITOR.addTemplate(\"panel-frame\",'\\x3ciframe id\\x3d\"{id}\" class\\x3d\"cke_panel_frame\" role\\x3d\"presentation\" frameborder\\x3d\"0\" src\\x3d\"{src}\"\\x3e\\x3c/iframe\\x3e'),h=CKEDITOR.addTemplate(\"panel-frame-inner\",'\\x3c!DOCTYPE html\\x3e\\x3chtml class\\x3d\"cke_panel_container {env}\" dir\\x3d\"{dir}\" lang\\x3d\"{langCode}\"\\x3e\\x3chead\\x3e{css}\\x3c/head\\x3e\\x3cbody class\\x3d\"cke_{dir}\" style\\x3d\"margin:0;padding:0\" onload\\x3d\"{onload}\"\\x3e\\x3c/body\\x3e\\x3c/html\\x3e');\nCKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+\"_frame\"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:\"scroll\",\"-webkit-overflow-scrolling\":\"touch\"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(h.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:\"window.parent.CKEDITOR.tools.callFunction(\"+\nb+\");\"},d)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on(\"keydown\",function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute(\"dir\");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==(\"rtl\"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var d={editorId:a.id,id:this.id,langCode:a.langCode,\ndir:a.lang.dir,cls:this.className,frame:\"\",env:CKEDITOR.env.cssClass,\"z-index\":a.config.baseFloatZIndex+1};if(this.isFramed){var e=CKEDITOR.env.air?\"javascript:void(0)\":CKEDITOR.env.ie?\"javascript:void(function(){\"+encodeURIComponent(\"document.open();(\"+CKEDITOR.tools.fixDomain+\")();document.close();\")+\"}())\":\"\";d.frame=g.output({id:this.id+\"_frame\",src:e})}e=f.output(d);b&&b.push(e);return e},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block?b:new CKEDITOR.ui.panel.block(this.getHolderElement(),\nb);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){a=this._.blocks[a];var b=this._.currentBlock,d=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+\"_frame\");b&&b.hide();this._.currentBlock=a;CKEDITOR.fire(\"ariaWidget\",d);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,a);a.show();return a},destroy:function(){this.element&&this.element.remove()}};CKEDITOR.ui.panel.block=\nCKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement(\"div\",{attributes:{tabindex:-1,\"class\":\"cke_panel_block\"},styles:{display:\"none\"}}));b&&CKEDITOR.tools.extend(this,b);this.element.setAttributes({role:this.attributes.role||\"presentation\",\"aria-label\":this.attributes[\"aria-label\"],title:this.attributes.title||this.attributes[\"aria-label\"]});this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()},_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag(\"a\").getItem(this._.focusIndex=\na),CKEDITOR.env.webkit&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle(\"display\",\"\")},hide:function(){this.onHide&&!0===this.onHide.call(this)||this.element.setStyle(\"display\",\"none\")},onKeyDown:function(a,b){var d=this.keys[a];switch(d){case \"next\":for(var e=this._.focusIndex,d=this.element.getElementsByTag(\"a\"),c;c=d.getItem(++e);)if(c.getAttribute(\"_cke_focus\")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}return c||\nb?!1:(this._.focusIndex=-1,this.onKeyDown(a,1));case \"prev\":e=this._.focusIndex;for(d=this.element.getElementsByTag(\"a\");0<e&&(c=d.getItem(--e));){if(c.getAttribute(\"_cke_focus\")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}c=null}return c||b?!1:(this._.focusIndex=d.count(),this.onKeyDown(a,1));case \"click\":case \"mouseup\":return e=this._.focusIndex,(c=0<=e&&this.element.getElementsByTag(\"a\").getItem(e))&&(c.$[d]?c.$[d]():c.$[\"on\"+d]()),!1}return!0}}})})();CKEDITOR.plugins.add(\"floatpanel\",{requires:\"panel\"});\n(function(){function v(a,b,c,l,h){h=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||\"\",l.css||\"\",h||\"\");var g=f[h];g||(g=f[h]=new CKEDITOR.ui.panel(b,l),g.element=c.append(CKEDITOR.dom.element.createFromHtml(g.render(a),b)),g.element.setStyles({display:\"none\",position:\"absolute\"}));return g}var f={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,l){function h(){e.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&\n(b=CKEDITOR.document.getById(\"cke_\"+a.name));var g=b.getDocument();l=v(a,g,b,c,l||0);var m=l.element,p=m.getFirst(),e=this;m.disableContextMenu();this.element=m;this._={editor:a,panel:l,parentElement:b,definition:c,document:g,iframe:p,children:[],dir:a.lang.dir,showBlockParams:null};a.on(\"mode\",h);a.on(\"resize\",h);g.getWindow().on(\"resize\",function(){this.reposition()},this)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,\nb)},getBlock:function(a){return this._.panel.getBlock(a)},showBlock:function(a,b,c,l,h,g){var m=this._.panel,p=m.showBlock(a);this._.showBlockParams=[].slice.call(arguments);this.allowBlur(!1);var e=this._.editor.editable();this._.returnFocus=e.hasFocus?e:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);this._.hideTimeout=0;var k=this.element,e=this._.iframe,e=CKEDITOR.env.ie&&!CKEDITOR.env.edge?e:new CKEDITOR.dom.window(e.$.contentWindow),f=k.getDocument(),r=this._.parentElement.getPositionedAncestor(),\nt=b.getDocumentPosition(f),f=r?r.getDocumentPosition(f):{x:0,y:0},q=\"rtl\"==this._.dir,d=t.x+(l||0)-f.x,n=t.y+(h||0)-f.y;!q||1!=c&&4!=c?q||2!=c&&3!=c||(d+=b.$.offsetWidth-1):d+=b.$.offsetWidth;if(3==c||4==c)n+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();k.setStyles({top:n+\"px\",left:0,display:\"\"});k.setOpacity(0);k.getFirst().removeStyle(\"width\");this._.editor.focusManager.add(e);this._.blurSet||(CKEDITOR.event.useCapture=!0,e.on(\"blur\",function(a){function u(){delete this._.returnFocus;\nthis.hide()}this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&this.visible&&!this._.activeChild&&(CKEDITOR.env.iOS?this._.hideTimeout||(this._.hideTimeout=CKEDITOR.tools.setTimeout(u,0,this)):u.call(this))},this),e.on(\"focus\",function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.env.iOS&&(e.on(\"touchstart\",function(){clearTimeout(this._.hideTimeout)},this),e.on(\"touchend\",function(){this._.hideTimeout=0;this.focus()},this)),CKEDITOR.event.useCapture=!1,\nthis._.blurSet=1);m.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&!1===this.onEscape(a))return!1},this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){var a=k;a.removeStyle(\"width\");if(p.autoSize){var b=p.element.getDocument(),b=(CKEDITOR.env.webkit?p.element:b.getBody()).$.scrollWidth;CKEDITOR.env.ie&&CKEDITOR.env.quirks&&0<b&&(b+=(a.$.offsetWidth||0)-(a.$.clientWidth||0)+3);a.setStyle(\"width\",b+10+\"px\");b=p.element.$.scrollHeight;CKEDITOR.env.ie&&CKEDITOR.env.quirks&&\n0<b&&(b+=(a.$.offsetHeight||0)-(a.$.clientHeight||0)+3);a.setStyle(\"height\",b+\"px\");m._.currentBlock.element.setStyle(\"display\",\"none\").removeStyle(\"display\")}else a.removeStyle(\"height\");q&&(d-=k.$.offsetWidth);k.setStyle(\"left\",d+\"px\");var b=m.element.getWindow(),a=k.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,e=a.height||a.bottom-a.top,l=q?a.right:b.width-a.left,h=q?b.width-a.right:a.left;q?l<c&&(d=h>c?d+c:b.width>c?d-a.left:d-a.right+b.width):l<c&&(d=h>c?d-c:b.width>\nc?d-a.right+b.width:d-a.left);c=a.top;b.height-a.top<e&&(n=c>e?n-e:b.height>e?n-a.bottom+b.height:n-a.top);CKEDITOR.env.ie&&(b=a=new CKEDITOR.dom.element(k.$.offsetParent),\"html\"==b.getName()&&(b=b.getDocument().getBody()),\"rtl\"==b.getComputedStyle(\"direction\")&&(d=CKEDITOR.env.ie8Compat?d-2*k.getDocument().getDocumentElement().$.scrollLeft:d-(a.$.scrollWidth-a.$.clientWidth)));var a=k.getFirst(),f;(f=a.getCustomData(\"activePanel\"))&&f.onHide&&f.onHide.call(this,1);a.setCustomData(\"activePanel\",this);\nk.setStyles({top:n+\"px\",left:d+\"px\"});k.setOpacity(1);g&&g()},this);m.isLoaded?a():m.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();p.element.focus();CKEDITOR.env.webkit&&(CKEDITOR.document.getBody().$.scrollTop=a);this.allowBlur(!0);this._.editor.fire(\"panelShow\",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},reposition:function(){var a=this._.showBlockParams;\nthis.visible&&this._.showBlockParams&&(this.hide(),this.showBlock.apply(this,a))},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();a&&!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a&&a.is(\"a\")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();\nthis.element.setStyle(\"display\",\"none\");this.visible=0;this.element.getFirst().removeCustomData(\"activePanel\");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),a.focus();delete this._.lastFocused;this._.showBlockParams=null;this._.editor.fire(\"panelHide\",this)}},allowBlur:function(a){var b=this._.panel;void 0!==a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,f,h,g){if(this._.activeChild!=a||a._.panel._.offsetParentId!=c.getId())this.hideChild(),a.onHide=\nCKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,f,h,g),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=\"\"},100)},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on(\"instanceDestroyed\",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),\nb;for(b in f){var c=f[b];a?c.destroy():c.element.hide()}a&&(f={})})})();CKEDITOR.plugins.add(\"colorbutton\",{requires:\"panelbutton,floatpanel\",init:function(c){function r(p,g,e,h){var k=new CKEDITOR.style(l[\"colorButton_\"+g+\"Style\"]),m=CKEDITOR.tools.getNextId()+\"_colorBox\";c.ui.add(p,CKEDITOR.UI_PANELBUTTON,{label:e,title:e,modes:{wysiwyg:1},editorFocus:0,toolbar:\"colors,\"+h,allowedContent:k,requiredContent:k,panel:{css:CKEDITOR.skin.getPath(\"editor\"),attributes:{role:\"listbox\",\"aria-label\":f.panelTitle}},onBlock:function(a,b){b.autoSize=!0;b.element.addClass(\"cke_colorblock\");\nb.element.setHtml(u(a,g,m));b.element.getDocument().getBody().setStyle(\"overflow\",\"hidden\");CKEDITOR.ui.fire(\"ready\",this);var d=b.keys,e=\"rtl\"==c.lang.dir;d[e?37:39]=\"next\";d[40]=\"next\";d[9]=\"next\";d[e?39:37]=\"prev\";d[38]=\"prev\";d[CKEDITOR.SHIFT+9]=\"prev\";d[32]=\"click\"},refresh:function(){c.activeFilter.check(k)||this.setState(CKEDITOR.TRISTATE_DISABLED)},onOpen:function(){var a=c.getSelection(),a=a&&a.getStartElement(),a=c.elementPath(a),b;if(a){a=a.block||a.blockLimit||c.document.getBody();do b=\na&&a.getComputedStyle(\"back\"==g?\"background-color\":\"color\")||\"transparent\";while(\"back\"==g&&\"transparent\"==b&&a&&(a=a.getParent()));b&&\"transparent\"!=b||(b=\"#ffffff\");this._.panel._.iframe.getFrameDocument().getById(m).setStyle(\"background-color\",b);return b}}})}function u(p,g,e){var h=[],k=l.colorButton_colors.split(\",\"),m=c.plugins.colordialog&&!1!==l.colorButton_enableMore,a=k.length+(m?2:1),b=CKEDITOR.tools.addFunction(function(a,b){function d(a){this.removeListener(\"ok\",d);this.removeListener(\"cancel\",\nd);\"ok\"==a.name&&e(this.getContentElement(\"picker\",\"selectedColor\").getValue(),b)}var e=arguments.callee;if(\"?\"==a)c.openDialog(\"colordialog\",function(){this.on(\"ok\",d);this.on(\"cancel\",d)});else{c.focus();p.hide();c.fire(\"saveSnapshot\");c.removeStyle(new CKEDITOR.style(l[\"colorButton_\"+b+\"Style\"],{color:\"inherit\"}));if(a){var f=l[\"colorButton_\"+b+\"Style\"];f.childRule=\"back\"==b?function(a){return t(a)}:function(a){return!(a.is(\"a\")||a.getElementsByTag(\"a\").count())||t(a)};c.applyStyle(new CKEDITOR.style(f,\n{color:a}))}c.fire(\"saveSnapshot\")}});h.push('\\x3ca class\\x3d\"cke_colorauto\" _cke_focus\\x3d1 hidefocus\\x3dtrue title\\x3d\"',f.auto,'\" onclick\\x3d\"CKEDITOR.tools.callFunction(',b,\",null,'\",g,\"');return false;\\\" href\\x3d\\\"javascript:void('\",f.auto,'\\')\" role\\x3d\"option\" aria-posinset\\x3d\"1\" aria-setsize\\x3d\"',a,'\"\\x3e\\x3ctable role\\x3d\"presentation\" cellspacing\\x3d0 cellpadding\\x3d0 width\\x3d\"100%\"\\x3e\\x3ctr\\x3e\\x3ctd\\x3e\\x3cspan class\\x3d\"cke_colorbox\" id\\x3d\"',e,'\"\\x3e\\x3c/span\\x3e\\x3c/td\\x3e\\x3ctd colspan\\x3d7 align\\x3dcenter\\x3e',\nf.auto,'\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\\x3c/a\\x3e\\x3ctable role\\x3d\"presentation\" cellspacing\\x3d0 cellpadding\\x3d0 width\\x3d\"100%\"\\x3e');for(e=0;e<k.length;e++){0===e%8&&h.push(\"\\x3c/tr\\x3e\\x3ctr\\x3e\");var d=k[e].split(\"/\"),n=d[0],q=d[1]||n;d[1]||(n=\"#\"+n.replace(/^(.)(.)(.)$/,\"$1$1$2$2$3$3\"));d=c.lang.colorbutton.colors[q]||q;h.push('\\x3ctd\\x3e\\x3ca class\\x3d\"cke_colorbox\" _cke_focus\\x3d1 hidefocus\\x3dtrue title\\x3d\"',d,'\" onclick\\x3d\"CKEDITOR.tools.callFunction(',b,\",'\",n,\"','\",g,\"'); return false;\\\" href\\x3d\\\"javascript:void('\",\nd,'\\')\" role\\x3d\"option\" aria-posinset\\x3d\"',e+2,'\" aria-setsize\\x3d\"',a,'\"\\x3e\\x3cspan class\\x3d\"cke_colorbox\" style\\x3d\"background-color:#',q,'\"\\x3e\\x3c/span\\x3e\\x3c/a\\x3e\\x3c/td\\x3e')}m&&h.push('\\x3c/tr\\x3e\\x3ctr\\x3e\\x3ctd colspan\\x3d8 align\\x3dcenter\\x3e\\x3ca class\\x3d\"cke_colormore\" _cke_focus\\x3d1 hidefocus\\x3dtrue title\\x3d\"',f.more,'\" onclick\\x3d\"CKEDITOR.tools.callFunction(',b,\",'?','\",g,\"');return false;\\\" href\\x3d\\\"javascript:void('\",f.more,\"')\\\"\",' role\\x3d\"option\" aria-posinset\\x3d\"',\na,'\" aria-setsize\\x3d\"',a,'\"\\x3e',f.more,\"\\x3c/a\\x3e\\x3c/td\\x3e\");h.push(\"\\x3c/tr\\x3e\\x3c/table\\x3e\");return h.join(\"\")}function t(c){return\"false\"==c.getAttribute(\"contentEditable\")||c.getAttribute(\"data-nostyle\")}var l=c.config,f=c.lang.colorbutton;CKEDITOR.env.hc||(r(\"TextColor\",\"fore\",f.textColorTitle,10),r(\"BGColor\",\"back\",f.bgColorTitle,20))}});CKEDITOR.config.colorButton_colors=\"000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF\";\nCKEDITOR.config.colorButton_foreStyle={element:\"span\",styles:{color:\"#(color)\"},overrides:[{element:\"font\",attributes:{color:null}}]};CKEDITOR.config.colorButton_backStyle={element:\"span\",styles:{\"background-color\":\"#(color)\"}};CKEDITOR.plugins.colordialog={requires:\"dialog\",init:function(b){var c=new CKEDITOR.dialogCommand(\"colordialog\");c.editorFocus=!1;b.addCommand(\"colordialog\",c);CKEDITOR.dialog.add(\"colordialog\",this.path+\"dialogs/colordialog.js\");b.getColorFromDialog=function(c,f){var d=function(a){this.removeListener(\"ok\",d);this.removeListener(\"cancel\",d);a=\"ok\"==a.name?this.getValueOf(\"picker\",\"selectedColor\"):null;c.call(f,a)},e=function(a){a.on(\"ok\",d);a.on(\"cancel\",d)};b.execCommand(\"colordialog\");if(b._.storedDialogs&&\nb._.storedDialogs.colordialog)e(b._.storedDialogs.colordialog);else CKEDITOR.on(\"dialogDefinition\",function(a){if(\"colordialog\"==a.data.name){var b=a.data.definition;a.removeListener();b.onLoad=CKEDITOR.tools.override(b.onLoad,function(a){return function(){e(this);b.onLoad=a;\"function\"==typeof a&&a.call(this)}})}})}}};CKEDITOR.plugins.add(\"colordialog\",CKEDITOR.plugins.colordialog);(function(){CKEDITOR.plugins.add(\"templates\",{requires:\"dialog\",init:function(a){CKEDITOR.dialog.add(\"templates\",CKEDITOR.getUrl(this.path+\"dialogs/templates.js\"));a.addCommand(\"templates\",new CKEDITOR.dialogCommand(\"templates\"));a.ui.addButton&&a.ui.addButton(\"Templates\",{label:a.lang.templates.button,command:\"templates\",toolbar:\"doctools,10\"})}});var c={},f={};CKEDITOR.addTemplates=function(a,d){c[a]=d};CKEDITOR.getTemplates=function(a){return c[a]};CKEDITOR.loadTemplates=function(a,d){for(var e=\n[],b=0,c=a.length;b<c;b++)f[a[b]]||(e.push(a[b]),f[a[b]]=1);e.length?CKEDITOR.scriptLoader.load(e,d):setTimeout(d,0)}})();CKEDITOR.config.templates_files=[CKEDITOR.getUrl(\"plugins/templates/templates/default.js\")];CKEDITOR.config.templates_replaceContent=!0;CKEDITOR.plugins.add(\"menu\",{requires:\"floatpanel\",beforeInit:function(g){for(var h=g.config.menu_groups.split(\",\"),p=g._.menuGroups={},n=g._.menuItems={},a=0;a<h.length;a++)p[h[a]]=a+1;g.addMenuGroup=function(b,a){p[b]=a||100};g.addMenuItem=function(a,c){p[c.group]&&(n[a]=new CKEDITOR.menuItem(this,a,c))};g.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};g.getMenuItem=function(a){return n[a]};g.removeMenuItem=function(a){delete n[a]}}});\n(function(){function g(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var h='\\x3cspan class\\x3d\"cke_menuitem\"\\x3e\\x3ca id\\x3d\"{id}\" class\\x3d\"cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}\" href\\x3d\"{href}\" title\\x3d\"{title}\" tabindex\\x3d\"-1\"_cke_focus\\x3d1 hidefocus\\x3d\"true\" role\\x3d\"{role}\" aria-haspopup\\x3d\"{hasPopup}\" aria-disabled\\x3d\"{disabled}\" {ariaChecked}';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(h+=' onkeypress\\x3d\"return false;\"');\nCKEDITOR.env.gecko&&(h+=' onblur\\x3d\"this.style.cssText \\x3d this.style.cssText;\"');var h=h+(' onmouseover\\x3d\"CKEDITOR.tools.callFunction({hoverFn},{index});\" onmouseout\\x3d\"CKEDITOR.tools.callFunction({moveOutFn},{index});\" '+(CKEDITOR.env.ie?'onclick\\x3d\"return false;\" onmouseup':\"onclick\")+'\\x3d\"CKEDITOR.tools.callFunction({clickFn},{index}); return false;\"\\x3e'),p=CKEDITOR.addTemplate(\"menuItem\",h+'\\x3cspan class\\x3d\"cke_menubutton_inner\"\\x3e\\x3cspan class\\x3d\"cke_menubutton_icon\"\\x3e\\x3cspan class\\x3d\"cke_button_icon cke_button__{iconName}_icon\" style\\x3d\"{iconStyle}\"\\x3e\\x3c/span\\x3e\\x3c/span\\x3e\\x3cspan class\\x3d\"cke_menubutton_label\"\\x3e{label}\\x3c/span\\x3e{arrowHtml}\\x3c/span\\x3e\\x3c/a\\x3e\\x3c/span\\x3e'),\nn=CKEDITOR.addTemplate(\"menuArrow\",'\\x3cspan class\\x3d\"cke_menuarrow\"\\x3e\\x3cspan\\x3e{label}\\x3c/span\\x3e\\x3c/span\\x3e');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath(\"editor\")],level:this._.level-1,block:{}}),m=c.block.attributes=c.attributes||{};!m.role&&(m.role=\"menu\");this._.panelDefinition=\nc},_:{onShow:function(){var a=this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),m=this._.listeners;this.removeAll();for(var e=0;e<m.length;e++){var l=m[e](b,a,c);if(l)for(var k in l){var f=this.editor.getMenuItem(k);!f||f.command&&!this.editor.getCommand(f.command).state||(f.state=l[k],this.add(f))}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):\n27==a&&this.hide(1);return!1},onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var m in c){var e=this.editor.getMenuItem(m);e&&(e.state=c[m],b.add(e))}var l=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+\nString(a));setTimeout(function(){b.show(l,2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,m){if(!this.parent&&(this._.onShow(),!this.items.length))return;b=b||(\"rtl\"==this.editor.lang.dir?2:1);var e=this.items,l=this.editor,k=this._.panel,f=this._.element;if(!k){k=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);\nk.onEscape=CKEDITOR.tools.bind(function(a){if(!1===this._.onEscape(a))return!1},this);k.onShow=function(){k._.panel.getHolderElement().getParent().addClass(\"cke\").addClass(\"cke_reset_all\")};k.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);f=k.addBlock(this.id,this._.panelDefinition.block);f.autoSize=!0;var d=f.keys;d[40]=\"next\";d[9]=\"next\";d[38]=\"prev\";d[CKEDITOR.SHIFT+9]=\"prev\";d[\"rtl\"==l.lang.dir?37:39]=CKEDITOR.env.ie?\"mouseup\":\"click\";d[32]=CKEDITOR.env.ie?\"mouseup\":\n\"click\";CKEDITOR.env.ie&&(d[13]=\"mouseup\");f=this._.element=f.element;d=f.getDocument();d.getBody().setStyle(\"overflow\",\"hidden\");d.getElementsByTag(\"html\").getItem(0).setStyle(\"overflow\",\"hidden\");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,l.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);\nthis._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b=this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}g(e);for(var d=l.elementPath(),d=['\\x3cdiv class\\x3d\"cke_menu'+(d&&d.direction()!=l.lang.dir?\" cke_mixed_dir_content\":\"\")+'\" role\\x3d\"presentation\"\\x3e'],h=e.length,p=h&&e[0].group,n=0;n<h;n++){var q=e[n];p!=q.group&&(d.push('\\x3cdiv class\\x3d\"cke_menuseparator\" role\\x3d\"separator\"\\x3e\\x3c/div\\x3e'),\np=q.group);q.render(this,n,d)}d.push(\"\\x3c/div\\x3e\");f.setHtml(d.join(\"\"));CKEDITOR.ui.fire(\"ready\",this);this.parent?this.parent._.panel.showAsChild(k,this.id,a,b,c,m):k.showBlock(this.id,a,b,c,m);l.fire(\"menuShow\",[k])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:\"cke_menubutton__\"+b});this.group=\na._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var h=a.id+String(b),e=\"undefined\"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,l=\"\",k=e==CKEDITOR.TRISTATE_ON?\"on\":e==CKEDITOR.TRISTATE_DISABLED?\"disabled\":\"off\";this.role in{menuitemcheckbox:1,menuitemradio:1}&&(l=' aria-checked\\x3d\"'+(e==CKEDITOR.TRISTATE_ON?\"true\":\"false\")+'\"');var f=this.getItems,d=\"\\x26#\"+(\"rtl\"==this.editor.lang.dir?\"9668\":\"9658\")+\";\",g=this.name;this.icon&&!/\\./.test(this.icon)&&(g=\nthis.icon);a={id:h,name:this.name,iconName:g,label:this.label,cls:this.className||\"\",state:k,hasPopup:f?\"true\":\"false\",disabled:e==CKEDITOR.TRISTATE_DISABLED,title:this.label,href:\"javascript:void('\"+(this.label||\"\").replace(\"'\")+\"')\",hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(g,\"rtl\"==this.editor.lang.dir,g==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?n.output({label:d}):\"\",role:this.role?this.role:\"menuitem\",ariaChecked:l};\np.output(a,c)}}})})();CKEDITOR.config.menu_groups=\"clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div\";CKEDITOR.plugins.add(\"contextmenu\",{requires:\"menu\",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(a){this.base.call(this,a,{panel:{className:\"cke_menu_panel\",attributes:{\"aria-label\":a.lang.contextmenu.options}}})},proto:{addTarget:function(a,e){a.on(\"contextmenu\",function(a){a=a.data;var c=CKEDITOR.env.webkit?f:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey;if(!e||!c){a.preventDefault();if(CKEDITOR.env.mac&&CKEDITOR.env.webkit){var c=this.editor,\nb=(new CKEDITOR.dom.elementPath(a.getTarget(),c.editable())).contains(function(a){return a.hasAttribute(\"contenteditable\")},!0);b&&\"false\"==b.getAttribute(\"contenteditable\")&&c.getSelection().fake(b)}var b=a.getTarget().getDocument(),d=a.getTarget().getDocument().getDocumentElement(),c=!b.equals(CKEDITOR.document),b=b.getWindow().getScrollPosition(),g=c?a.$.clientX:a.$.pageX||b.x+a.$.clientX,h=c?a.$.clientY:a.$.pageY||b.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(d,null,g,h)},CKEDITOR.env.ie?\n200:0,this)}},this);if(CKEDITOR.env.webkit){var f,d=function(){f=0};a.on(\"keydown\",function(a){f=CKEDITOR.env.mac?a.data.$.metaKey:a.data.$.ctrlKey});a.on(\"keyup\",d);a.on(\"contextmenu\",d)}},open:function(a,e,f,d){this.editor.focus();a=a||CKEDITOR.document.getDocumentElement();this.editor.selectionChange(1);this.show(a,e,f,d)}}})},beforeInit:function(a){var e=a.contextMenu=new CKEDITOR.plugins.contextMenu(a);a.on(\"contentDom\",function(){e.addTarget(a.editable(),!1!==a.config.browserContextMenuOnCtrl)});\na.addCommand(\"contextMenu\",{exec:function(){a.contextMenu.open(a.document.getBody())}});a.setKeystroke(CKEDITOR.SHIFT+121,\"contextMenu\");a.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,\"contextMenu\")}});(function(){CKEDITOR.plugins.add(\"div\",{requires:\"dialog\",init:function(a){if(!a.blockless){var c=a.lang.div,b=\"div(*)\";CKEDITOR.dialog.isTabEnabled(a,\"editdiv\",\"advanced\")&&(b+=\";div[dir,id,lang,title]{*}\");a.addCommand(\"creatediv\",new CKEDITOR.dialogCommand(\"creatediv\",{allowedContent:b,requiredContent:\"div\",contextSensitive:!0,refresh:function(a,c){this.setState(\"div\"in(a.config.div_wrapTable?c.root:c.blockLimit).getDtd()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}}));a.addCommand(\"editdiv\",\nnew CKEDITOR.dialogCommand(\"editdiv\",{requiredContent:\"div\"}));a.addCommand(\"removediv\",{requiredContent:\"div\",exec:function(a){function c(b){(b=CKEDITOR.plugins.div.getSurroundDiv(a,b))&&!b.data(\"cke-div-added\")&&(f.push(b),b.data(\"cke-div-added\"))}for(var b=a.getSelection(),g=b&&b.getRanges(),e,h=b.createBookmarks(),f=[],d=0;d<g.length;d++)e=g[d],e.collapsed?c(b.getStartElement()):(e=new CKEDITOR.dom.walker(e),e.evaluator=c,e.lastForward());for(d=0;d<f.length;d++)f[d].remove(!0);b.selectBookmarks(h)}});\na.ui.addButton&&a.ui.addButton(\"CreateDiv\",{label:c.toolbar,command:\"creatediv\",toolbar:\"blocks,50\"});a.addMenuItems&&(a.addMenuItems({editdiv:{label:c.edit,command:\"editdiv\",group:\"div\",order:1},removediv:{label:c.remove,command:\"removediv\",group:\"div\",order:5}}),a.contextMenu&&a.contextMenu.addListener(function(b){return!b||b.isReadOnly()?null:CKEDITOR.plugins.div.getSurroundDiv(a)?{editdiv:CKEDITOR.TRISTATE_OFF,removediv:CKEDITOR.TRISTATE_OFF}:null}));CKEDITOR.dialog.add(\"creatediv\",this.path+\n\"dialogs/div.js\");CKEDITOR.dialog.add(\"editdiv\",this.path+\"dialogs/div.js\")}}});CKEDITOR.plugins.div={getSurroundDiv:function(a,c){var b=a.elementPath(c);return a.elementPath(b.blockLimit).contains(function(a){return a.is(\"div\")&&!a.isReadOnly()},1)}}})();CKEDITOR.plugins.add(\"resize\",{init:function(b){function f(d){var e=c.width,m=c.height,f=e+(d.data.$.screenX-n.x)*(\"rtl\"==g?-1:1);d=m+(d.data.$.screenY-n.y);h&&(e=Math.max(a.resize_minWidth,Math.min(f,a.resize_maxWidth)));p&&(m=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(h?e:null,m)}function k(){CKEDITOR.document.removeListener(\"mousemove\",f);CKEDITOR.document.removeListener(\"mouseup\",k);b.document&&(b.document.removeListener(\"mousemove\",f),b.document.removeListener(\"mouseup\",\nk))}var a=b.config,r=b.ui.spaceId(\"resizer\"),g=b.element?b.element.getDirection(1):\"ltr\";!a.resize_dir&&(a.resize_dir=\"vertical\");void 0===a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0===a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0===a.resize_minWidth&&(a.resize_minWidth=750);void 0===a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var l=null,n,c,h=(\"both\"==a.resize_dir||\"horizontal\"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth,p=(\"both\"==a.resize_dir||\"vertical\"==\na.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,q=CKEDITOR.tools.addFunction(function(d){l||(l=b.getResizable());c={width:l.$.offsetWidth||0,height:l.$.offsetHeight||0};n={x:d.screenX,y:d.screenY};a.resize_minWidth>c.width&&(a.resize_minWidth=c.width);a.resize_minHeight>c.height&&(a.resize_minHeight=c.height);CKEDITOR.document.on(\"mousemove\",f);CKEDITOR.document.on(\"mouseup\",k);b.document&&(b.document.on(\"mousemove\",f),b.document.on(\"mouseup\",k));d.preventDefault&&d.preventDefault()});b.on(\"destroy\",\nfunction(){CKEDITOR.tools.removeFunction(q)});b.on(\"uiSpace\",function(a){if(\"bottom\"==a.data.space){var e=\"\";h&&!p&&(e=\" cke_resizer_horizontal\");!h&&p&&(e=\" cke_resizer_vertical\");var c='\\x3cspan id\\x3d\"'+r+'\" class\\x3d\"cke_resizer'+e+\" cke_resizer_\"+g+'\" title\\x3d\"'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'\" onmousedown\\x3d\"CKEDITOR.tools.callFunction('+q+', event)\"\\x3e'+(\"ltr\"==g?\"◢\":\"◣\")+\"\\x3c/span\\x3e\";\"ltr\"==g&&\"ltr\"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on(\"maximize\",\nfunction(a){b.ui.space(\"resizer\")[a.data==CKEDITOR.TRISTATE_ON?\"hide\":\"show\"]()})}}});(function(){function B(a){function d(){for(var b=g(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||q(a),f=0;f<e.length;f++){var l=e[f];if(\"/\"!=l){\"string\"==typeof l&&(l=e[f]={name:l});var m,d=l.groups;if(d)for(var h=0;h<d.length;h++)m=d[h],(m=b[m])&&c(l,m);(m=b[l.name])&&c(l,m)}}return e}function g(){var b={},c,f,e;for(c in a.ui.items)f=a.ui.items[c],e=f.toolbar||\"others\",e=e.split(\",\"),f=e[0],e=parseInt(e[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:e});for(f in b)b[f]=b[f].sort(function(b,\na){return b.order==a.order?0:0>a.order?-1:0>b.order?1:b.order<a.order?-1:1});return b}function c(c,e){if(e.length){c.items?c.items.push(a.ui.create(\"-\")):c.items=[];for(var f;f=e.shift();)f=\"string\"==typeof f?f:f.name,b&&-1!=CKEDITOR.tools.indexOf(b,f)||(f=a.ui.create(f))&&a.addFeature(f)&&c.items.push(f)}}function h(b){var a=[],e,d,h;for(e=0;e<b.length;++e)d=b[e],h={},\"/\"==d?a.push(d):CKEDITOR.tools.isArray(d)?(c(h,CKEDITOR.tools.clone(d)),a.push(h)):d.items&&(c(h,CKEDITOR.tools.clone(d.items)),\nh.name=d.name,a.push(h));return a}var b=a.config.removeButtons,b=b&&b.split(\",\"),e=a.config.toolbar;\"string\"==typeof e&&(e=a.config[\"toolbar_\"+e]);return a.toolbar=e?h(e):d()}function q(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:\"document\",groups:[\"mode\",\"document\",\"doctools\"]},{name:\"clipboard\",groups:[\"clipboard\",\"undo\"]},{name:\"editing\",groups:[\"find\",\"selection\",\"spellchecker\"]},{name:\"forms\"},\"/\",{name:\"basicstyles\",groups:[\"basicstyles\",\"cleanup\"]},{name:\"paragraph\",groups:[\"list\",\n\"indent\",\"blocks\",\"align\",\"bidi\"]},{name:\"links\"},{name:\"insert\"},\"/\",{name:\"styles\"},{name:\"colors\"},{name:\"tools\"},{name:\"others\"},{name:\"about\"}])}var y=function(){this.toolbars=[];this.focusCommandExecuted=!1};y.prototype.focus=function(){for(var a=0,d;d=this.toolbars[a++];)for(var g=0,c;c=d.items[g++];)if(c.focus){c.focus();return}};var C={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()},\n100):a.toolbox.focus())}};CKEDITOR.plugins.add(\"toolbar\",{requires:\"button\",init:function(a){var d,g=function(c,h){var b,e=\"rtl\"==a.lang.dir,k=a.config.toolbarGroupCycling,r=e?37:39,e=e?39:37,k=void 0===k||k;switch(h){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==h?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-1],b.items.length)for(c=b.items[d?b.items.length-1:0];c&&!c.focus;)(c=d?c.previous:c.next)||\n(b=0);c&&c.focus();return!1;case r:b=c;do b=b.next,!b&&k&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():g(c,9);return!1;case 40:return c.button&&c.button.hasArrow?(a.once(\"panelShow\",function(b){b.data._.panel._.currentBlock.onKeyDown(40)}),c.execute()):g(c,40==h?r:e),!1;case e:case 38:b=c;do b=b.previous,!b&&k&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(d=1,g(c,CKEDITOR.SHIFT+9),d=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(),\n!1}return!0};a.on(\"uiSpace\",function(c){if(c.data.space==a.config.toolbarLocation){c.removeListener();a.toolbox=new y;var d=CKEDITOR.tools.getNextId(),b=['\\x3cspan id\\x3d\"',d,'\" class\\x3d\"cke_voice_label\"\\x3e',a.lang.toolbar.toolbars,\"\\x3c/span\\x3e\",'\\x3cspan id\\x3d\"'+a.ui.spaceId(\"toolbox\")+'\" class\\x3d\"cke_toolbox\" role\\x3d\"group\" aria-labelledby\\x3d\"',d,'\" onmousedown\\x3d\"return false;\"\\x3e'],d=!1!==a.config.toolbarStartupExpanded,e,k;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&\nb.push('\\x3cspan class\\x3d\"cke_toolbox_main\"'+(d?\"\\x3e\":' style\\x3d\"display:none\"\\x3e'));for(var r=a.toolbox.toolbars,f=B(a),l=0;l<f.length;l++){var m,n=0,v,p=f[l],w;if(p)if(e&&(b.push(\"\\x3c/span\\x3e\"),k=e=0),\"/\"===p)b.push('\\x3cspan class\\x3d\"cke_toolbar_break\"\\x3e\\x3c/span\\x3e');else{w=p.items||p;for(var x=0;x<w.length;x++){var t=w[x],q;if(t){var z=function(c){c=c.render(a,b);u=n.items.push(c)-1;0<u&&(c.previous=n.items[u-1],c.previous.next=c);c.toolbar=n;c.onkey=g;c.onfocus=function(){a.toolbox.focusCommandExecuted||\na.focus()}};if(t.type==CKEDITOR.UI_SEPARATOR)k=e&&t;else{q=!1!==t.canGroup;if(!n){m=CKEDITOR.tools.getNextId();n={id:m,items:[]};v=p.name&&(a.lang.toolbar.toolbarGroups[p.name]||p.name);b.push('\\x3cspan id\\x3d\"',m,'\" class\\x3d\"cke_toolbar\"',v?' aria-labelledby\\x3d\"'+m+'_label\"':\"\",' role\\x3d\"toolbar\"\\x3e');v&&b.push('\\x3cspan id\\x3d\"',m,'_label\" class\\x3d\"cke_voice_label\"\\x3e',v,\"\\x3c/span\\x3e\");b.push('\\x3cspan class\\x3d\"cke_toolbar_start\"\\x3e\\x3c/span\\x3e');var u=r.push(n)-1;0<u&&(n.previous=r[u-\n1],n.previous.next=n)}q?e||(b.push('\\x3cspan class\\x3d\"cke_toolgroup\" role\\x3d\"presentation\"\\x3e'),e=1):e&&(b.push(\"\\x3c/span\\x3e\"),e=0);k&&(z(k),k=0);z(t)}}}e&&(b.push(\"\\x3c/span\\x3e\"),k=e=0);n&&b.push('\\x3cspan class\\x3d\"cke_toolbar_end\"\\x3e\\x3c/span\\x3e\\x3c/span\\x3e')}}a.config.toolbarCanCollapse&&b.push(\"\\x3c/span\\x3e\");if(a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var A=CKEDITOR.tools.addFunction(function(){a.execCommand(\"toolbarCollapse\")});a.on(\"destroy\",function(){CKEDITOR.tools.removeFunction(A)});\na.addCommand(\"toolbarCollapse\",{readOnly:1,exec:function(b){var a=b.ui.space(\"toolbar_collapser\"),c=a.getPrevious(),e=b.ui.space(\"contents\"),d=c.getParent(),f=parseInt(e.$.style.height,10),h=d.$.offsetHeight,g=a.hasClass(\"cke_toolbox_collapser_min\");g?(c.show(),a.removeClass(\"cke_toolbox_collapser_min\"),a.setAttribute(\"title\",b.lang.toolbar.toolbarCollapse)):(c.hide(),a.addClass(\"cke_toolbox_collapser_min\"),a.setAttribute(\"title\",b.lang.toolbar.toolbarExpand));a.getFirst().setText(g?\"▲\":\"◀\");e.setStyle(\"height\",\nf-(d.$.offsetHeight-h)+\"px\");b.fire(\"resize\",{outerHeight:b.container.$.offsetHeight,contentsHeight:e.$.offsetHeight,outerWidth:b.container.$.offsetWidth})},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+(CKEDITOR.env.ie||CKEDITOR.env.webkit?189:109),\"toolbarCollapse\");b.push('\\x3ca title\\x3d\"'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'\" id\\x3d\"'+a.ui.spaceId(\"toolbar_collapser\")+'\" tabIndex\\x3d\"-1\" class\\x3d\"cke_toolbox_collapser');d||b.push(\" cke_toolbox_collapser_min\");\nb.push('\" onclick\\x3d\"CKEDITOR.tools.callFunction('+A+')\"\\x3e','\\x3cspan class\\x3d\"cke_arrow\"\\x3e\\x26#9650;\\x3c/span\\x3e',\"\\x3c/a\\x3e\")}b.push(\"\\x3c/span\\x3e\");c.data.html+=b.join(\"\")}});a.on(\"destroy\",function(){if(this.toolbox){var a,d=0,b,e,g;for(a=this.toolbox.toolbars;d<a.length;d++)for(e=a[d].items,b=0;b<e.length;b++)g=e[b],g.clickFn&&CKEDITOR.tools.removeFunction(g.clickFn),g.keyDownFn&&CKEDITOR.tools.removeFunction(g.keyDownFn)}});a.on(\"uiReady\",function(){var c=a.ui.space(\"toolbox\");c&&a.focusManager.add(c,\n1)});a.addCommand(\"toolbarFocus\",C);a.setKeystroke(CKEDITOR.ALT+121,\"toolbarFocus\");a.ui.add(\"-\",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('\\x3cspan class\\x3d\"cke_toolbar_separator\" role\\x3d\"separator\"\\x3e\\x3c/span\\x3e');return{}}}}})}});CKEDITOR.ui.prototype.addToolbarGroup=function(a,d,g){var c=q(this.editor),h=0===d,b={name:a};if(g){if(g=CKEDITOR.tools.search(c,function(a){return a.name==g})){!g.groups&&(g.groups=[]);if(d&&\n(d=CKEDITOR.tools.indexOf(g.groups,d),0<=d)){g.groups.splice(d+1,0,a);return}h?g.groups.splice(0,0,a):g.groups.push(a);return}d=null}d&&(d=CKEDITOR.tools.indexOf(c,function(a){return a.name==d}));h?c.splice(0,0,a):\"number\"==typeof d?c.splice(d+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR=\"separator\";CKEDITOR.config.toolbarLocation=\"top\";(function(){function q(a,d){function l(c){c=k.list[c];if(c.equals(a.editable())||\"true\"==c.getAttribute(\"contenteditable\")){var e=a.createRange();e.selectNodeContents(c);e.select()}else a.getSelection().selectElement(c);a.focus()}function m(){n&&n.setHtml('\\x3cspan class\\x3d\"cke_path_empty\"\\x3e\\x26nbsp;\\x3c/span\\x3e');delete k.list}var p=a.ui.spaceId(\"path\"),n,k=a._.elementsPath,q=k.idBase;d.html+='\\x3cspan id\\x3d\"'+p+'_label\" class\\x3d\"cke_voice_label\"\\x3e'+a.lang.elementspath.eleLabel+'\\x3c/span\\x3e\\x3cspan id\\x3d\"'+\np+'\" class\\x3d\"cke_path\" role\\x3d\"group\" aria-labelledby\\x3d\"'+p+'_label\"\\x3e\\x3cspan class\\x3d\"cke_path_empty\"\\x3e\\x26nbsp;\\x3c/span\\x3e\\x3c/span\\x3e';a.on(\"uiReady\",function(){var c=a.ui.space(\"path\");c&&a.focusManager.add(c,1)});k.onClick=l;var v=CKEDITOR.tools.addFunction(l),w=CKEDITOR.tools.addFunction(function(c,e){var g=k.idBase,b;e=new CKEDITOR.dom.event(e);b=\"rtl\"==a.lang.dir;switch(e.getKeystroke()){case b?39:37:case 9:return(b=CKEDITOR.document.getById(g+(c+1)))||(b=CKEDITOR.document.getById(g+\n\"0\")),b.focus(),!1;case b?37:39:case CKEDITOR.SHIFT+9:return(b=CKEDITOR.document.getById(g+(c-1)))||(b=CKEDITOR.document.getById(g+(k.list.length-1))),b.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return l(c),!1}return!0});a.on(\"selectionChange\",function(){for(var c=[],e=k.list=[],g=[],b=k.filters,d=!0,l=a.elementPath().elements,f,u=l.length;u--;){var h=l[u],r=0;f=h.data(\"cke-display-name\")?h.data(\"cke-display-name\"):h.data(\"cke-real-element-type\")?h.data(\"cke-real-element-type\"):h.getName();\n(d=h.hasAttribute(\"contenteditable\")?\"true\"==h.getAttribute(\"contenteditable\"):d)||h.hasAttribute(\"contenteditable\")||(r=1);for(var t=0;t<b.length;t++){var m=b[t](h,f);if(!1===m){r=1;break}f=m||f}r||(e.unshift(h),g.unshift(f))}e=e.length;for(b=0;b<e;b++)f=g[b],d=a.lang.elementspath.eleTitle.replace(/%1/,f),f=x.output({id:q+b,label:d,text:f,jsTitle:\"javascript:void('\"+f+\"')\",index:b,keyDownFn:w,clickFn:v}),c.unshift(f);n||(n=CKEDITOR.document.getById(p));g=n;g.setHtml(c.join(\"\")+'\\x3cspan class\\x3d\"cke_path_empty\"\\x3e\\x26nbsp;\\x3c/span\\x3e');\na.fire(\"elementsPathUpdate\",{space:g})});a.on(\"readOnly\",m);a.on(\"contentDomUnload\",m);a.addCommand(\"elementsPathFocus\",y.toolbarFocus);a.setKeystroke(CKEDITOR.ALT+122,\"elementsPathFocus\")}var y={toolbarFocus:{editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+\"0\"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}}},d=\"\";CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(d+=' onkeypress\\x3d\"return false;\"');CKEDITOR.env.gecko&&(d+=' onblur\\x3d\"this.style.cssText \\x3d this.style.cssText;\"');\nvar x=CKEDITOR.addTemplate(\"pathItem\",'\\x3ca id\\x3d\"{id}\" href\\x3d\"{jsTitle}\" tabindex\\x3d\"-1\" class\\x3d\"cke_path_item\" title\\x3d\"{label}\"'+d+' hidefocus\\x3d\"true\"  onkeydown\\x3d\"return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );\" onclick\\x3d\"CKEDITOR.tools.callFunction({clickFn},{index}); return false;\" role\\x3d\"button\" aria-label\\x3d\"{label}\"\\x3e{text}\\x3c/a\\x3e');CKEDITOR.plugins.add(\"elementspath\",{init:function(a){a._.elementsPath={idBase:\"cke_elementspath_\"+CKEDITOR.tools.getNextNumber()+\n\"_\",filters:[]};a.on(\"uiSpace\",function(d){\"bottom\"==d.data.space&&q(a,d.data)})}})})();(function(){function q(b,d,a){a=b.config.forceEnterMode||a;\"wysiwyg\"==b.mode&&(d||(d=b.activeEnterMode),b.elementPath().isContextFor(\"p\")||(d=CKEDITOR.ENTER_BR,a=1),b.fire(\"saveSnapshot\"),d==CKEDITOR.ENTER_BR?t(b,d,null,a):u(b,d,null,a),b.fire(\"saveSnapshot\"))}function v(b){b=b.getSelection().getRanges(!0);for(var d=b.length-1;0<d;d--)b[d].deleteContents();return b[0]}function y(b){var d=b.startContainer.getAscendant(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&\"true\"==a.getAttribute(\"contenteditable\")},\n!0);if(b.root.equals(d))return b;d=new CKEDITOR.dom.range(d);d.moveToRange(b);return d}CKEDITOR.plugins.add(\"enterkey\",{init:function(b){b.addCommand(\"enter\",{modes:{wysiwyg:1},editorFocus:!1,exec:function(b){q(b)}});b.addCommand(\"shiftEnter\",{modes:{wysiwyg:1},editorFocus:!1,exec:function(b){q(b,b.activeShiftEnterMode,1)}});b.setKeystroke([[13,\"enter\"],[CKEDITOR.SHIFT+13,\"shiftEnter\"]])}});var z=CKEDITOR.dom.walker.whitespaces(),A=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(b,\nd,a,h){if(a=a||v(b)){a=y(a);var f=a.document,k=a.checkStartOfBlock(),m=a.checkEndOfBlock(),l=b.elementPath(a.startContainer),c=l.block,n=d==CKEDITOR.ENTER_DIV?\"div\":\"p\",e;if(k&&m){if(c&&(c.is(\"li\")||c.getParent().is(\"li\"))){c.is(\"li\")||(c=c.getParent());a=c.getParent();e=a.getParent();h=!c.hasPrevious();var p=!c.hasNext(),n=b.getSelection(),g=n.createBookmarks(),k=c.getDirection(1),m=c.getAttribute(\"class\"),r=c.getAttribute(\"style\"),q=e.getDirection(1)!=k;b=b.enterMode!=CKEDITOR.ENTER_BR||q||r||m;\nif(e.is(\"li\"))h||p?(h&&p&&a.remove(),c[p?\"insertAfter\":\"insertBefore\"](e)):c.breakParent(e);else{if(b)if(l.block.is(\"li\")?(e=f.createElement(d==CKEDITOR.ENTER_P?\"p\":\"div\"),q&&e.setAttribute(\"dir\",k),r&&e.setAttribute(\"style\",r),m&&e.setAttribute(\"class\",m),c.moveChildren(e)):e=l.block,h||p)e[h?\"insertBefore\":\"insertAfter\"](a);else c.breakParent(a),e.insertAfter(a);else if(c.appendBogus(!0),h||p)for(;f=c[h?\"getFirst\":\"getLast\"]();)f[h?\"insertBefore\":\"insertAfter\"](a);else for(c.breakParent(a);f=c.getLast();)f.insertAfter(a);\nc.remove()}n.selectBookmarks(g);return}if(c&&c.getParent().is(\"blockquote\")){c.breakParent(c.getParent());c.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getPrevious().remove();c.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getNext().remove();a.moveToElementEditStart(c);a.select();return}}else if(c&&c.is(\"pre\")&&!m){t(b,d,a,h);return}if(k=a.splitBlock(n)){d=k.previousBlock;c=k.nextBlock;l=k.wasStartOfBlock;b=k.wasEndOfBlock;c?(g=c.getParent(),g.is(\"li\")&&(c.breakParent(g),\nc.move(c.getNext(),1))):d&&(g=d.getParent())&&g.is(\"li\")&&(d.breakParent(g),g=d.getNext(),a.moveToElementEditStart(g),d.move(d.getPrevious()));if(l||b){if(d){if(d.is(\"li\")||!w.test(d.getName())&&!d.is(\"pre\"))e=d.clone()}else c&&(e=c.clone());e?h&&!e.is(\"li\")&&e.renameNode(n):g&&g.is(\"li\")?e=g:(e=f.createElement(n),d&&(p=d.getDirection())&&e.setAttribute(\"dir\",p));if(f=k.elementPath)for(h=0,n=f.elements.length;h<n;h++){g=f.elements[h];if(g.equals(f.block)||g.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[g.getName()]&&\n(g=g.clone(),e.moveChildren(g),e.append(g))}e.appendBogus();e.getParent()||a.insertNode(e);e.is(\"li\")&&e.removeAttribute(\"value\");!CKEDITOR.env.ie||!l||b&&d.getChildCount()||(a.moveToElementEditStart(b?d:e),a.select());a.moveToElementEditStart(l&&!b?c:e)}else c.is(\"li\")&&(e=a.clone(),e.selectNodeContents(c),e=new CKEDITOR.dom.walker(e),e.evaluator=function(a){return!(A(a)||z(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))},(g=e.next())&&\ng.type==CKEDITOR.NODE_ELEMENT&&g.is(\"ul\",\"ol\")&&(CKEDITOR.env.needsBrFiller?f.createElement(\"br\"):f.createText(\" \")).insertBefore(g)),c&&a.moveToElementEditStart(c);a.select();a.scrollIntoView()}}},enterBr:function(b,d,a,h){if(a=a||v(b)){var f=a.document,k=a.checkEndOfBlock(),m=new CKEDITOR.dom.elementPath(b.getSelection().getStartElement()),l=m.block,c=l&&m.block.getName();h||\"li\"!=c?(!h&&k&&w.test(c)?(k=l.getDirection())?(f=f.createElement(\"div\"),f.setAttribute(\"dir\",k),f.insertAfter(l),a.setStart(f,\n0)):(f.createElement(\"br\").insertAfter(l),CKEDITOR.env.gecko&&f.createText(\"\").insertAfter(l),a.setStartAt(l.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(b=\"pre\"==c&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?f.createText(\"\\r\"):f.createElement(\"br\"),a.deleteContents(),a.insertNode(b),CKEDITOR.env.needsBrFiller?(f.createText(\"﻿\").insertAfter(b),k&&(l||m.blockLimit).appendBogus(),b.getNext().$.nodeValue=\"\",a.setStartAt(b.getNext(),CKEDITOR.POSITION_AFTER_START)):\na.setStartAt(b,CKEDITOR.POSITION_AFTER_END)),a.collapse(!0),a.select(),a.scrollIntoView()):u(b,d,a,h)}}};var x=CKEDITOR.plugins.enterkey,t=x.enterBr,u=x.enterBlock,w=/^h[1-6]$/})();(function(){function k(b,f){var g={},c=[],e={nbsp:\" \",shy:\"­\",gt:\"\\x3e\",lt:\"\\x3c\",amp:\"\\x26\",apos:\"'\",quot:'\"'};b=b.replace(/\\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(b,a){var d=f?\"\\x26\"+a+\";\":e[a];g[d]=f?e[a]:\"\\x26\"+a+\";\";c.push(d);return\"\"});if(!f&&b){b=b.split(\",\");var a=document.createElement(\"div\"),d;a.innerHTML=\"\\x26\"+b.join(\";\\x26\")+\";\";d=a.innerHTML;a=null;for(a=0;a<d.length;a++){var h=d.charAt(a);g[h]=\"\\x26\"+b[a]+\";\";c.push(h)}}g.regex=c.join(f?\"|\":\"\");return g}CKEDITOR.plugins.add(\"entities\",\n{afterInit:function(b){function f(a){return h[a]}function g(b){return\"force\"!=c.entities_processNumerical&&a[b]?a[b]:\"\\x26#\"+b.charCodeAt(0)+\";\"}var c=b.config;if(b=(b=b.dataProcessor)&&b.htmlFilter){var e=[];!1!==c.basicEntities&&e.push(\"nbsp,gt,lt,amp\");c.entities&&(e.length&&e.push(\"quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro\"),\nc.entities_latin&&e.push(\"Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml\"),c.entities_greek&&e.push(\"Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv\"),\nc.entities_additional&&e.push(c.entities_additional));var a=k(e.join(\",\")),d=a.regex?\"[\"+a.regex+\"]\":\"a^\";delete a.regex;c.entities&&c.entities_processNumerical&&(d=\"[^ -~]|\"+d);var d=new RegExp(d,\"g\"),h=k(\"nbsp,gt,lt,amp,shy\",!0),l=new RegExp(h.regex,\"g\");b.addRules({text:function(a){return a.replace(l,f).replace(d,g)}},{applyToAll:!0,excludeNestedEditable:!0})}}})})();CKEDITOR.config.basicEntities=!0;CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;\nCKEDITOR.config.entities_additional=\"#39\";CKEDITOR.plugins.add(\"popup\");\nCKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||\"80%\";b=b||\"70%\";\"string\"==typeof a&&1<a.length&&\"%\"==a.substr(a.length-1,1)&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));\"string\"==typeof b&&1<b.length&&\"%\"==b.substr(b.length-1,1)&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10);d=(d||\"location\\x3dno,menubar\\x3dno,toolbar\\x3dno,dependent\\x3dyes,minimizable\\x3dno,modal\\x3dyes,alwaysRaised\\x3dyes,resizable\\x3dyes,scrollbars\\x3dyes\")+\",width\\x3d\"+\na+\",height\\x3d\"+b+\",top\\x3d\"+f+\",left\\x3d\"+g;var c=window.open(\"\",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(\" chrome/\")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+\"\\x3d\"+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf(\"?\")?\"\\x26\":\"?\")+d.join(\"\\x26\")}function k(a){a+=\"\";return a.charAt(0).toUpperCase()+a.substr(1)}function m(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config[\"filebrowser\"+k(a.getName())+\"WindowWidth\"]||c.config.filebrowserWindowWidth||\"80%\",a=c.config[\"filebrowser\"+k(a.getName())+\"WindowHeight\"]||c.config.filebrowserWindowHeight||\n\"70%\",b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function n(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return a.getContentElement(this[\"for\"][0],this[\"for\"][1]).getInputElement().$.value&&a.getContentElement(this[\"for\"][0],this[\"for\"][1]).getAction()?!0:!1}function p(a,c,d){var b=d.params||\n{};b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function l(a,c,d,b){if(b&&b.length)for(var e,g=b.length;g--;)if(e=b[g],\"hbox\"!=e.type&&\"vbox\"!=e.type&&\"fieldset\"!=e.type||l(a,c,d,e.children),e.filebrowser)if(\"string\"==typeof e.filebrowser&&(e.filebrowser={action:\"fileButton\"==e.type?\"QuickUpload\":\"Browse\",target:e.filebrowser}),\"Browse\"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config[\"filebrowser\"+\nk(c)+\"BrowseUrl\"],void 0===f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=m,e.filebrowser.url=f,e.hidden=!1)}else if(\"QuickUpload\"==e.filebrowser.action&&e[\"for\"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config[\"filebrowser\"+k(c)+\"UploadUrl\"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;if(h&&!1===h.call(b,a))return!1;if(n.call(b,a)){a=b.getDialog().getContentElement(this[\"for\"][0],this[\"for\"][1]).getInputElement();if(b=new CKEDITOR.dom.element(a.$.form))(a=\nb.$.elements.ckCsrfToken)?a=new CKEDITOR.dom.element(a):(a=new CKEDITOR.dom.element(\"input\"),a.setAttributes({name:\"ckCsrfToken\",type:\"hidden\"}),b.append(a)),a.setAttribute(\"value\",CKEDITOR.tools.getCsrfToken());return!0}return!1};e.filebrowser.url=f;e.hidden=!1;p(a,d.getContents(e[\"for\"][0]).get(e[\"for\"][1]),e.filebrowser)}}function h(a,c,d){if(-1!==d.indexOf(\";\")){d=d.split(\";\");for(var b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function q(a,\nc){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe[\"for\"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(\"function\"!=typeof c||!1!==c.call(this._.filebrowserSe))if(!e||!1!==e.call(this._.filebrowserSe,a,c))if(\"string\"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(),b=b.filebrowser.target||null))if(b=b.split(\":\"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add(\"filebrowser\",{requires:\"popup\",\ninit:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(q,a);a.on(\"destroy\",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on(\"dialogDefinition\",function(a){if(a.editor.plugins.filebrowser)for(var c=a.data.definition,d,b=0;b<c.contents.length;++b)if(d=c.contents[b])l(a.editor,a.data.name,c,d.elements),d.hidden&&d.filebrowser&&(d.hidden=!h(c,d.id,d.filebrowser))})})();CKEDITOR.plugins.add(\"find\",{requires:\"dialog\",init:function(a){var b=a.addCommand(\"find\",new CKEDITOR.dialogCommand(\"find\"));b.canUndo=!1;b.readOnly=1;a.addCommand(\"replace\",new CKEDITOR.dialogCommand(\"replace\")).canUndo=!1;a.ui.addButton&&(a.ui.addButton(\"Find\",{label:a.lang.find.find,command:\"find\",toolbar:\"find,10\"}),a.ui.addButton(\"Replace\",{label:a.lang.find.replace,command:\"replace\",toolbar:\"find,20\"}));CKEDITOR.dialog.add(\"find\",this.path+\"dialogs/find.js\");CKEDITOR.dialog.add(\"replace\",this.path+\n\"dialogs/find.js\")}});CKEDITOR.config.find_highlight={element:\"span\",styles:{\"background-color\":\"#004\",color:\"#fff\"}};(function(){function g(a,b){var c=l.exec(a),d=l.exec(b);if(c){if(!c[2]&&\"px\"==d[2])return d[1];if(\"px\"==c[2]&&!d[2])return d[1]+\"px\"}return b}var k=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,l=/^((?:\\d*(?:\\.\\d+))|(?:\\d+))(.*)?$/i,m={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b[\"data-cke-realelement\"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes[\"data-cke-resizable\"]){var c=(new k(a)).rules;a=b.attributes;var d=c.width,\nc=c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}};CKEDITOR.plugins.add(\"fakeobjects\",{init:function(a){a.filter.allow(\"img[!data-cke-realelement,src,alt,title](*){*}\",\"fakeobjects\")},afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(m,{applyToAll:!0})}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown;b={\"class\":b,\"data-cke-realelement\":encodeURIComponent(a.getOuterHtml()),\"data-cke-real-node-type\":a.type,\nalt:e,title:e,align:a.getAttribute(\"align\")||\"\"};CKEDITOR.env.hc||(b.src=CKEDITOR.tools.transparentImageData);c&&(b[\"data-cke-real-element-type\"]=c);d&&(b[\"data-cke-resizable\"]=d,c=new k,d=a.getAttribute(\"width\"),a=a.getAttribute(\"height\"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement(\"img\",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter;\na.writeHtml(f);f=f.getHtml();b={\"class\":b,\"data-cke-realelement\":encodeURIComponent(f),\"data-cke-real-node-type\":a.type,alt:e,title:e,align:a.attributes.align||\"\"};CKEDITOR.env.hc||(b.src=CKEDITOR.tools.transparentImageData);c&&(b[\"data-cke-real-element-type\"]=c);d&&(b[\"data-cke-resizable\"]=d,d=a.attributes,a=new k,c=d.width,d=d.height,void 0!==c&&(a.rules.width=h(c)),void 0!==d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element(\"img\",b)};CKEDITOR.editor.prototype.restoreRealElement=\nfunction(a){if(a.data(\"cke-real-node-type\")!=CKEDITOR.NODE_ELEMENT)return null;var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data(\"cke-realelement\")),this.document);if(a.data(\"cke-resizable\")){var c=a.getStyle(\"width\");a=a.getStyle(\"height\");c&&b.setAttribute(\"width\",g(b.getAttribute(\"width\"),c));a&&b.setAttribute(\"height\",g(b.getAttribute(\"height\"),a))}return b}})();(function(){function d(a){a=a.attributes;return\"application/x-shockwave-flash\"==a.type||f.test(a.src||\"\")}function e(a,b){return a.createFakeParserElement(b,\"cke_flash\",\"flash\",!0)}var f=/\\.swf(?:$|\\?)/i;CKEDITOR.plugins.add(\"flash\",{requires:\"dialog,fakeobjects\",onLoad:function(){CKEDITOR.addCss(\"img.cke_flash{background-image: url(\"+CKEDITOR.getUrl(this.path+\"images/placeholder.png\")+\");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}\")},\ninit:function(a){var b=\"object[classid,codebase,height,hspace,vspace,width];param[name,value];embed[height,hspace,pluginspage,src,type,vspace,width]\";CKEDITOR.dialog.isTabEnabled(a,\"flash\",\"properties\")&&(b+=\";object[align]; embed[allowscriptaccess,quality,scale,wmode]\");CKEDITOR.dialog.isTabEnabled(a,\"flash\",\"advanced\")&&(b+=\";object[id]{*}; embed[bgcolor]{*}(*)\");a.addCommand(\"flash\",new CKEDITOR.dialogCommand(\"flash\",{allowedContent:b,requiredContent:\"embed\"}));a.ui.addButton&&a.ui.addButton(\"Flash\",\n{label:a.lang.common.flash,command:\"flash\",toolbar:\"insert,20\"});CKEDITOR.dialog.add(\"flash\",this.path+\"dialogs/flash.js\");a.addMenuItems&&a.addMenuItems({flash:{label:a.lang.flash.properties,command:\"flash\",group:\"flash\"}});a.on(\"doubleclick\",function(a){var b=a.data.element;b.is(\"img\")&&\"flash\"==b.data(\"cke-real-element-type\")&&(a.data.dialog=\"flash\")});a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is(\"img\")&&!a.isReadOnly()&&\"flash\"==a.data(\"cke-real-element-type\"))return{flash:CKEDITOR.TRISTATE_OFF}})},\nafterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{\"cke:object\":function(b){var c=b.attributes;if(!(c.classid&&String(c.classid).toLowerCase()||d(b))){for(c=0;c<b.children.length;c++)if(\"cke:embed\"==b.children[c].name){if(!d(b.children[c]))break;return e(a,b)}return null}return e(a,b)},\"cke:embed\":function(b){return d(b)?e(a,b):null}}},5)}})})();CKEDITOR.tools.extend(CKEDITOR.config,{flashEmbedTagOnly:!1,flashAddEmbedTag:!0,flashConvertOnEdit:!1});(function(){function k(a){var l=a.config,p=a.fire(\"uiSpace\",{space:\"top\",html:\"\"}).html,t=function(){function f(a,c,e){b.setStyle(c,w(e));b.setStyle(\"position\",a)}function e(a){var b=k.getDocumentPosition();switch(a){case \"top\":f(\"absolute\",\"top\",b.y-q-r);break;case \"pin\":f(\"fixed\",\"top\",x);break;case \"bottom\":f(\"absolute\",\"top\",b.y+(c.height||c.bottom-c.top)+r)}m=a}var m,k,n,c,h,q,v,p=l.floatSpaceDockedOffsetX||0,r=l.floatSpaceDockedOffsetY||0,u=l.floatSpacePinnedOffsetX||0,x=l.floatSpacePinnedOffsetY||\n0;return function(d){if(k=a.editable()){var f=d&&\"focus\"==d.name;f&&b.show();a.fire(\"floatingSpaceLayout\",{show:f});b.removeStyle(\"left\");b.removeStyle(\"right\");n=b.getClientRect();c=k.getClientRect();h=g.getViewPaneSize();q=n.height;v=\"pageXOffset\"in g.$?g.$.pageXOffset:CKEDITOR.document.$.documentElement.scrollLeft;m?(q+r<=c.top?e(\"top\"):q+r>h.height-c.bottom?e(\"pin\"):e(\"bottom\"),d=h.width/2,d=l.floatSpacePreferRight?\"right\":0<c.left&&c.right<h.width&&c.width>n.width?\"rtl\"==l.contentsLangDirection?\n\"right\":\"left\":d-c.left>c.right-d?\"left\":\"right\",n.width>h.width?(d=\"left\",f=0):(f=\"left\"==d?0<c.left?c.left:0:c.right<h.width?h.width-c.right:0,f+n.width>h.width&&(d=\"left\"==d?\"right\":\"left\",f=0)),b.setStyle(d,w((\"pin\"==m?u:p)+f+(\"pin\"==m?0:\"left\"==d?v:-v)))):(m=\"pin\",e(\"pin\"),t(d))}}}();if(p){var k=new CKEDITOR.template('\\x3cdiv id\\x3d\"cke_{name}\" class\\x3d\"cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'\" dir\\x3d\"{langDir}\" title\\x3d\"'+(CKEDITOR.env.gecko?\n\" \":\"\")+'\" lang\\x3d\"{langCode}\" role\\x3d\"application\" style\\x3d\"{style}\"'+(a.title?' aria-labelledby\\x3d\"cke_{name}_arialbl\"':\" \")+\"\\x3e\"+(a.title?'\\x3cspan id\\x3d\"cke_{name}_arialbl\" class\\x3d\"cke_voice_label\"\\x3e{voiceLabel}\\x3c/span\\x3e':\" \")+'\\x3cdiv class\\x3d\"cke_inner\"\\x3e\\x3cdiv id\\x3d\"{topId}\" class\\x3d\"cke_top\" role\\x3d\"presentation\"\\x3e{content}\\x3c/div\\x3e\\x3c/div\\x3e\\x3c/div\\x3e'),b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(k.output({content:p,id:a.id,langDir:a.lang.dir,\nlangCode:a.langCode,name:a.name,style:\"display:none;z-index:\"+(l.baseFloatZIndex-1),topId:a.ui.spaceId(\"top\"),voiceLabel:a.title}))),u=CKEDITOR.tools.eventsBuffer(500,t),e=CKEDITOR.tools.eventsBuffer(100,t);b.unselectable();b.on(\"mousedown\",function(a){a=a.data;a.getTarget().hasAscendant(\"a\",1)||a.preventDefault()});a.on(\"focus\",function(b){t(b);a.on(\"change\",u.input);g.on(\"scroll\",e.input);g.on(\"resize\",e.input)});a.on(\"blur\",function(){b.hide();a.removeListener(\"change\",u.input);g.removeListener(\"scroll\",\ne.input);g.removeListener(\"resize\",e.input)});a.on(\"destroy\",function(){g.removeListener(\"scroll\",e.input);g.removeListener(\"resize\",e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var g=CKEDITOR.document.getWindow(),w=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add(\"floatingspace\",{init:function(a){a.on(\"loaded\",function(){k(this)},null,null,20)}})})();CKEDITOR.plugins.add(\"listblock\",{requires:\"panel\",onLoad:function(){var f=CKEDITOR.addTemplate(\"panel-list\",'\\x3cul role\\x3d\"presentation\" class\\x3d\"cke_panel_list\"\\x3e{items}\\x3c/ul\\x3e'),g=CKEDITOR.addTemplate(\"panel-list-item\",'\\x3cli id\\x3d\"{id}\" class\\x3d\"cke_panel_listItem\" role\\x3dpresentation\\x3e\\x3ca id\\x3d\"{id}_option\" _cke_focus\\x3d1 hidefocus\\x3dtrue title\\x3d\"{title}\" href\\x3d\"javascript:void(\\'{val}\\')\"  {onclick}\\x3d\"CKEDITOR.tools.callFunction({clickFn},\\'{val}\\'); return false;\" role\\x3d\"option\"\\x3e{text}\\x3c/a\\x3e\\x3c/li\\x3e'),\nh=CKEDITOR.addTemplate(\"panel-list-group\",'\\x3ch1 id\\x3d\"{id}\" class\\x3d\"cke_panel_grouptitle\" role\\x3d\"presentation\" \\x3e{label}\\x3c/h1\\x3e'),k=/\\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){b=b||{};var c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c[\"aria-multiselectable\"]=!0);!c.role&&\n(c.role=\"listbox\");this.base.apply(this,arguments);this.element.setAttribute(\"role\",c.role);c=this.keys;c[40]=\"next\";c[9]=\"next\";c[38]=\"prev\";c[CKEDITOR.SHIFT+9]=\"prev\";c[32]=CKEDITOR.env.ie?\"mouseup\":\"click\";CKEDITOR.env.ie&&(c[13]=\"mouseup\");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join(\"\")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||\n(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(k,\"\\\\'\");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick\\x3d\"return false;\" onmouseup':\"onclick\",clickFn:this._.getClick(),title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a};\nthis._.pendingList.push(g.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(\"\"));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle(\"display\",\n\"none\"),b&&\"ul\"==b.getName()&&b.setStyle(\"display\",\"none\"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle(\"display\",\"none\")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle(\"display\",\"\");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle(\"display\",\"\"),d&&\"ul\"==d.getName()&&d.setStyle(\"display\",\"\")},mark:function(a){this.multiSelect||this.unmarkAll();a=this._.items[a];var b=this.element.getDocument().getById(a);\nb.addClass(\"cke_selected\");this.element.getDocument().getById(a+\"_option\").setAttribute(\"aria-selected\",!0);this.onMark&&this.onMark(b)},unmark:function(a){var b=this.element.getDocument();a=this._.items[a];var c=b.getById(a);c.removeClass(\"cke_selected\");b.getById(a+\"_option\").removeAttribute(\"aria-selected\");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass(\"cke_selected\");b.getById(d+\"_option\").removeAttribute(\"aria-selected\")}this.onUnmark&&\nthis.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass(\"cke_selected\")},focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag(\"a\"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add(\"richcombo\",{requires:\"floatpanel,listblock,button\",beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}});\n(function(){var d='\\x3cspan id\\x3d\"{id}\" class\\x3d\"cke_combo cke_combo__{name} {cls}\" role\\x3d\"presentation\"\\x3e\\x3cspan id\\x3d\"{id}_label\" class\\x3d\"cke_combo_label\"\\x3e{label}\\x3c/span\\x3e\\x3ca class\\x3d\"cke_combo_button\" title\\x3d\"{title}\" tabindex\\x3d\"-1\"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?\"\":\" href\\x3d\\\"javascript:void('{titleJs}')\\\"\")+' hidefocus\\x3d\"true\" role\\x3d\"button\" aria-labelledby\\x3d\"{id}_label\" aria-haspopup\\x3d\"true\"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(d+=' onkeypress\\x3d\"return false;\"');\nCKEDITOR.env.gecko&&(d+=' onblur\\x3d\"this.style.cssText \\x3d this.style.cssText;\"');var d=d+(' onkeydown\\x3d\"return CKEDITOR.tools.callFunction({keydownFn},event,this);\" onfocus\\x3d\"return CKEDITOR.tools.callFunction({focusFn},event);\" '+(CKEDITOR.env.ie?'onclick\\x3d\"return false;\" onmouseup':\"onclick\")+'\\x3d\"CKEDITOR.tools.callFunction({clickFn},this);return false;\"\\x3e\\x3cspan id\\x3d\"{id}_text\" class\\x3d\"cke_combo_text cke_combo_inlinelabel\"\\x3e{label}\\x3c/span\\x3e\\x3cspan class\\x3d\"cke_combo_open\"\\x3e\\x3cspan class\\x3d\"cke_combo_arrow\"\\x3e'+\n(CKEDITOR.env.hc?\"\\x26#9660;\":CKEDITOR.env.air?\"\\x26nbsp;\":\"\")+\"\\x3c/span\\x3e\\x3c/span\\x3e\\x3c/a\\x3e\\x3c/span\\x3e\"),k=CKEDITOR.addTemplate(\"combo\",d);CKEDITOR.UI_RICHCOMBO=\"richcombo\";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className=\"cke_combopanel\";\na.block={multiSelect:a.multiSelect,attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join(\"\")},render:function(a,b){function g(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var c=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(c=CKEDITOR.TRISTATE_DISABLED);this.setState(c);this.setValue(\"\");c!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}}var d=\nCKEDITOR.env,h=\"cke_\"+this.id,e=CKEDITOR.tools.addFunction(function(b){l&&(a.unlockSelection(1),l=0);c.execute(b)},this),f=this,c={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(c){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var d=f.getValue();d?b.list.mark(d):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(c),4)}},clickFn:e};a.on(\"activeFilterChange\",g,this);a.on(\"mode\",\ng,this);a.on(\"selectionChange\",g,this);!this.readOnly&&a.on(\"readOnly\",g,this);var m=CKEDITOR.tools.addFunction(function(b,d){b=new CKEDITOR.dom.event(b);var g=b.getKeystroke();if(40==g)a.once(\"panelShow\",function(a){a.data._.panel._.currentBlock.onKeyDown(40)});switch(g){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,d);break;default:c.onkey(c,g)}b.preventDefault()}),n=CKEDITOR.tools.addFunction(function(){c.onfocus&&c.onfocus()}),l=0;c.keyDownFn=m;d={id:h,name:this.name||this.command,label:this.label,\ntitle:this.title,cls:this.className||\"\",titleJs:d.gecko&&!d.hc?\"\":(this.title||\"\").replace(\"'\",\"\"),keydownFn:m,focusFn:n,clickFn:e};k.output(d,b);if(this.onRender)this.onRender();return c},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,d=this._.panelDefinition.block,k=b.parent||CKEDITOR.document.getBody(),h=\"cke_combopanel__\"+this.name,e=new CKEDITOR.ui.floatPanel(a,k,b),f=e.addListBlock(this.id,d),c=this;e.onShow=function(){this.element.addClass(h);c.setState(CKEDITOR.TRISTATE_ON);\nc._.on=1;c.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(c.onOpen)c.onOpen();a.once(\"panelShow\",function(){f.focus(!f.multiSelect&&c.getValue())})};e.onHide=function(b){this.element.removeClass(h);c.setState(c.modes&&c.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);c._.on=0;if(!b&&c.onClose)c.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){c.onClick&&c.onClick.call(c,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){c._.on=\n0;c.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var d=this.document.getById(\"cke_\"+this.id+\"_text\");d&&(a||b?d.removeClass(\"cke_combo_inlinelabel\"):(b=this.label,d.addClass(\"cke_combo_inlinelabel\")),d.setText(\"undefined\"!=typeof b?b:a))},getValue:function(){return this._.value||\"\"},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},\nshowAll:function(){this._.list.showAll()},add:function(a,b,d){this._.items[a]=d||a;this._.list.add(a,b,d)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire(\"ready\",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById(\"cke_\"+this.id);b.setState(a,\"cke_combo\");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute(\"aria-disabled\",!0):b.removeAttribute(\"aria-disabled\");this._.state=\na}},getState:function(){return this._.state},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function l(a,b,c,f,p,l,t,v){var w=a.config,q=new CKEDITOR.style(t),k=p.split(\";\");p=[];for(var m={},d=0;d<k.length;d++){var h=k[d];if(h){var h=h.split(\"/\"),u={},n=k[d]=h[0];u[c]=p[d]=h[1]||n;m[n]=new CKEDITOR.style(t,u);m[n]._.definition.name=n}else k.splice(d--,1)}a.ui.addRichCombo(b,{label:f.label,title:f.panelTitle,toolbar:\"styles,\"+v,allowedContent:q,requiredContent:q,panel:{css:[CKEDITOR.skin.getPath(\"editor\")].concat(w.contentsCss),multiSelect:!1,attributes:{\"aria-label\":f.panelTitle}},\ninit:function(){this.startGroup(f.panelTitle);for(var a=0;a<k.length;a++){var b=k[a];this.add(b,m[b].buildPreview(),b)}},onClick:function(b){a.focus();a.fire(\"saveSnapshot\");var c=this.getValue(),f=m[b];if(c&&b!=c){var k=m[c],e=a.getSelection().getRanges()[0];if(e.collapsed){var d=a.elementPath(),g=d.contains(function(a){return k.checkElementRemovable(a)});if(g){var h=e.checkBoundaryOfElement(g,CKEDITOR.START),l=e.checkBoundaryOfElement(g,CKEDITOR.END);if(h&&l){for(h=e.createBookmark();d=g.getFirst();)d.insertBefore(g);\ng.remove();e.moveToBookmark(h)}else h?e.moveToPosition(g,CKEDITOR.POSITION_BEFORE_START):l?e.moveToPosition(g,CKEDITOR.POSITION_AFTER_END):(e.splitElement(g),e.moveToPosition(g,CKEDITOR.POSITION_AFTER_END),r(e,d.elements.slice(),g));a.getSelection().selectRanges([e])}}else a.removeStyle(k)}a[c==b?\"removeStyle\":\"applyStyle\"](f);a.fire(\"saveSnapshot\")},onRender:function(){a.on(\"selectionChange\",function(b){var c=this.getValue();b=b.data.path.elements;for(var d=0,f;d<b.length;d++){f=b[d];for(var e in m)if(m[e].checkElementMatch(f,\n!0,a)){e!=c&&this.setValue(e);return}}this.setValue(\"\",l)},this)},refresh:function(){a.activeFilter.check(q)||this.setState(CKEDITOR.TRISTATE_DISABLED)}})}function r(a,b,c){var f=b.pop();if(f){if(c)return r(a,b,f.equals(c)?null:c);c=f.clone();a.insertNode(c);a.moveToPosition(c,CKEDITOR.POSITION_AFTER_START);r(a,b)}}CKEDITOR.plugins.add(\"font\",{requires:\"richcombo\",init:function(a){var b=a.config;l(a,\"Font\",\"family\",a.lang.font,b.font_names,b.font_defaultLabel,b.font_style,30);l(a,\"FontSize\",\"size\",\na.lang.font.fontSize,b.fontSize_sizes,b.fontSize_defaultLabel,b.fontSize_style,40)}})})();CKEDITOR.config.font_names=\"Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif\";\nCKEDITOR.config.font_defaultLabel=\"\";CKEDITOR.config.font_style={element:\"span\",styles:{\"font-family\":\"#(family)\"},overrides:[{element:\"font\",attributes:{face:null}}]};CKEDITOR.config.fontSize_sizes=\"8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px\";CKEDITOR.config.fontSize_defaultLabel=\"\";CKEDITOR.config.fontSize_style={element:\"span\",styles:{\"font-size\":\"#(size)\"},overrides:[{element:\"font\",attributes:{size:null}}]};CKEDITOR.plugins.add(\"forms\",{requires:\"dialog,fakeobjects\",onLoad:function(){CKEDITOR.addCss(\".cke_editable form{border: 1px dotted #FF0000;padding: 2px;}\\n\");CKEDITOR.addCss(\"img.cke_hidden{background-image: url(\"+CKEDITOR.getUrl(this.path+\"images/hiddenfield.gif\")+\");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 16px !important;height: 16px !important;}\")},init:function(a){var b=a.lang,g=0,h={email:1,password:1,search:1,tel:1,text:1,url:1},l={checkbox:\"input[type,name,checked,required]\",\nradio:\"input[type,name,checked,required]\",textfield:\"input[type,name,value,size,maxlength,required]\",textarea:\"textarea[cols,rows,name,required]\",select:\"select[name,size,multiple,required]; option[value,selected]\",button:\"input[type,name,value]\",form:\"form[action,name,id,enctype,target,method]\",hiddenfield:\"input[type,name,value]\",imagebutton:\"input[type,alt,src]{width,height,border,border-width,border-style,margin,float}\"},m={checkbox:\"input\",radio:\"input\",textfield:\"input\",textarea:\"textarea\",\nselect:\"select\",button:\"input\",form:\"form\",hiddenfield:\"input\",imagebutton:\"input\"},e=function(d,c,e){var h={allowedContent:l[c],requiredContent:m[c]};\"form\"==c&&(h.context=\"form\");a.addCommand(c,new CKEDITOR.dialogCommand(c,h));a.ui.addButton&&a.ui.addButton(d,{label:b.common[d.charAt(0).toLowerCase()+d.slice(1)],command:c,toolbar:\"forms,\"+(g+=10)});CKEDITOR.dialog.add(c,e)},f=this.path+\"dialogs/\";!a.blockless&&e(\"Form\",\"form\",f+\"form.js\");e(\"Checkbox\",\"checkbox\",f+\"checkbox.js\");e(\"Radio\",\"radio\",\nf+\"radio.js\");e(\"TextField\",\"textfield\",f+\"textfield.js\");e(\"Textarea\",\"textarea\",f+\"textarea.js\");e(\"Select\",\"select\",f+\"select.js\");e(\"Button\",\"button\",f+\"button.js\");var k=a.plugins.image;k&&!a.plugins.image2&&e(\"ImageButton\",\"imagebutton\",CKEDITOR.plugins.getPath(\"image\")+\"dialogs/image.js\");e(\"HiddenField\",\"hiddenfield\",f+\"hiddenfield.js\");a.addMenuItems&&(e={checkbox:{label:b.forms.checkboxAndRadio.checkboxTitle,command:\"checkbox\",group:\"checkbox\"},radio:{label:b.forms.checkboxAndRadio.radioTitle,\ncommand:\"radio\",group:\"radio\"},textfield:{label:b.forms.textfield.title,command:\"textfield\",group:\"textfield\"},hiddenfield:{label:b.forms.hidden.title,command:\"hiddenfield\",group:\"hiddenfield\"},button:{label:b.forms.button.title,command:\"button\",group:\"button\"},select:{label:b.forms.select.title,command:\"select\",group:\"select\"},textarea:{label:b.forms.textarea.title,command:\"textarea\",group:\"textarea\"}},k&&(e.imagebutton={label:b.image.titleButton,command:\"imagebutton\",group:\"imagebutton\"}),!a.blockless&&\n(e.form={label:b.forms.form.menu,command:\"form\",group:\"form\"}),a.addMenuItems(e));a.contextMenu&&(!a.blockless&&a.contextMenu.addListener(function(d,c,a){if((d=a.contains(\"form\",1))&&!d.isReadOnly())return{form:CKEDITOR.TRISTATE_OFF}}),a.contextMenu.addListener(function(d){if(d&&!d.isReadOnly()){var c=d.getName();if(\"select\"==c)return{select:CKEDITOR.TRISTATE_OFF};if(\"textarea\"==c)return{textarea:CKEDITOR.TRISTATE_OFF};if(\"input\"==c){var a=d.getAttribute(\"type\")||\"text\";switch(a){case \"button\":case \"submit\":case \"reset\":return{button:CKEDITOR.TRISTATE_OFF};\ncase \"checkbox\":return{checkbox:CKEDITOR.TRISTATE_OFF};case \"radio\":return{radio:CKEDITOR.TRISTATE_OFF};case \"image\":return k?{imagebutton:CKEDITOR.TRISTATE_OFF}:null}if(h[a])return{textfield:CKEDITOR.TRISTATE_OFF}}if(\"img\"==c&&\"hiddenfield\"==d.data(\"cke-real-element-type\"))return{hiddenfield:CKEDITOR.TRISTATE_OFF}}}));a.on(\"doubleclick\",function(d){var c=d.data.element;if(!a.blockless&&c.is(\"form\"))d.data.dialog=\"form\";else if(c.is(\"select\"))d.data.dialog=\"select\";else if(c.is(\"textarea\"))d.data.dialog=\n\"textarea\";else if(c.is(\"img\")&&\"hiddenfield\"==c.data(\"cke-real-element-type\"))d.data.dialog=\"hiddenfield\";else if(c.is(\"input\")){c=c.getAttribute(\"type\")||\"text\";switch(c){case \"button\":case \"submit\":case \"reset\":d.data.dialog=\"button\";break;case \"checkbox\":d.data.dialog=\"checkbox\";break;case \"radio\":d.data.dialog=\"radio\";break;case \"image\":d.data.dialog=\"imagebutton\"}h[c]&&(d.data.dialog=\"textfield\")}})},afterInit:function(a){var b=a.dataProcessor,g=b&&b.htmlFilter,b=b&&b.dataFilter;CKEDITOR.env.ie&&\ng&&g.addRules({elements:{input:function(a){a=a.attributes;var b=a.type;b||(a.type=\"text\");\"checkbox\"!=b&&\"radio\"!=b||\"on\"!=a.value||delete a.value}}},{applyToAll:!0});b&&b.addRules({elements:{input:function(b){if(\"hidden\"==b.attributes.type)return a.createFakeParserElement(b,\"cke_hidden\",\"hiddenfield\")}}},{applyToAll:!0})}});CKEDITOR.plugins.add(\"format\",{requires:\"richcombo\",init:function(a){if(!a.blockless){for(var f=a.config,c=a.lang.format,l=f.format_tags.split(\";\"),d={},m=0,n=[],g=0;g<l.length;g++){var h=l[g],k=new CKEDITOR.style(f[\"format_\"+h]);if(!a.filter.customConfig||a.filter.check(k))m++,d[h]=k,d[h]._.enterMode=a.config.enterMode,n.push(k)}0!==m&&a.ui.addRichCombo(\"Format\",{label:c.label,title:c.panelTitle,toolbar:\"styles,20\",allowedContent:n,panel:{css:[CKEDITOR.skin.getPath(\"editor\")].concat(f.contentsCss),\nmultiSelect:!1,attributes:{\"aria-label\":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);for(var a in d){var e=c[\"tag_\"+a];this.add(a,d[a].buildPreview(e),e)}},onClick:function(b){a.focus();a.fire(\"saveSnapshot\");b=d[b];var e=a.elementPath();a[b.checkActive(e,a)?\"removeStyle\":\"applyStyle\"](b);setTimeout(function(){a.fire(\"saveSnapshot\")},0)},onRender:function(){a.on(\"selectionChange\",function(b){var e=this.getValue();b=b.data.path;this.refresh();for(var c in d)if(d[c].checkActive(b,a)){c!=\ne&&this.setValue(c,a.lang.format[\"tag_\"+c]);return}this.setValue(\"\")},this)},onOpen:function(){this.showAll();for(var b in d)a.activeFilter.check(d[b])||this.hideItem(b)},refresh:function(){var b=a.elementPath();if(b){if(b.isContextFor(\"p\"))for(var c in d)if(a.activeFilter.check(d[c]))return;this.setState(CKEDITOR.TRISTATE_DISABLED)}}})}}});CKEDITOR.config.format_tags=\"p;h1;h2;h3;h4;h5;h6;pre;address;div\";CKEDITOR.config.format_p={element:\"p\"};CKEDITOR.config.format_div={element:\"div\"};\nCKEDITOR.config.format_pre={element:\"pre\"};CKEDITOR.config.format_address={element:\"address\"};CKEDITOR.config.format_h1={element:\"h1\"};CKEDITOR.config.format_h2={element:\"h2\"};CKEDITOR.config.format_h3={element:\"h3\"};CKEDITOR.config.format_h4={element:\"h4\"};CKEDITOR.config.format_h5={element:\"h5\"};CKEDITOR.config.format_h6={element:\"h6\"};(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement(\"hr\");a.insertElement(b)},allowedContent:\"hr\",requiredContent:\"hr\"};CKEDITOR.plugins.add(\"horizontalrule\",{init:function(a){a.blockless||(a.addCommand(\"horizontalrule\",b),a.ui.addButton&&a.ui.addButton(\"HorizontalRule\",{label:a.lang.horizontalrule.toolbar,command:\"horizontalrule\",toolbar:\"insert,40\"}))}})})();CKEDITOR.plugins.add(\"htmlwriter\",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||\"\\t\";b.dataProcessor.writer=a}});\nCKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars=\"\\t\";this.selfClosingEnd=\" /\\x3e\";this.lineBreakChars=\"\\n\";this.sortAttributes=1;this._.indent=0;this._.indentation=\"\";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a][\"#\"],breakBeforeOpen:1,breakBeforeClose:!b[a][\"#\"],breakAfterClose:1,needsSpace:a in\nb.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules(\"br\",{breakAfterOpen:1});this.setRules(\"title\",{indent:0,breakAfterOpen:0});this.setRules(\"style\",{indent:0,breakBeforeClose:1});this.setRules(\"pre\",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&a&&a.needsSpace&&this._.needsSpace&&this._.output.push(\"\\n\");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push(\"\\x3c\",b);this._.afterCloser=0},\nopenTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(\"\\x3e\"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();\"pre\"==b&&(this._.inPre=1)},attribute:function(b,a){\"string\"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,\"\\x26\")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(\" \",b,'\\x3d\"',a,'\"')},closeTag:function(b){var a=\nthis._.rules[b];a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push(\"\\x3c/\",b,\"\\x3e\");\"pre\"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&\nthis.indentation();this._.output.push(\"\\x3c!--\",b,\"--\\x3e\")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation=\"\";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){CKEDITOR.plugins.add(\"iframe\",{requires:\"dialog,fakeobjects\",onLoad:function(){CKEDITOR.addCss(\"img.cke_iframe{background-image: url(\"+CKEDITOR.getUrl(this.path+\"images/placeholder.png\")+\");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}\")},init:function(a){var b=a.lang.iframe,c=\"iframe[align,longdesc,frameborder,height,name,scrolling,src,title,width]\";a.plugins.dialogadvtab&&(c+=\";iframe\"+a.plugins.dialogadvtab.allowedContent({id:1,\nclasses:1,styles:1}));CKEDITOR.dialog.add(\"iframe\",this.path+\"dialogs/iframe.js\");a.addCommand(\"iframe\",new CKEDITOR.dialogCommand(\"iframe\",{allowedContent:c,requiredContent:\"iframe\"}));a.ui.addButton&&a.ui.addButton(\"Iframe\",{label:b.toolbar,command:\"iframe\",toolbar:\"insert,80\"});a.on(\"doubleclick\",function(a){var b=a.data.element;b.is(\"img\")&&\"iframe\"==b.data(\"cke-real-element-type\")&&(a.data.dialog=\"iframe\")});a.addMenuItems&&a.addMenuItems({iframe:{label:b.title,command:\"iframe\",group:\"image\"}});\na.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is(\"img\")&&\"iframe\"==a.data(\"cke-real-element-type\"))return{iframe:CKEDITOR.TRISTATE_OFF}})},afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{iframe:function(b){return a.createFakeParserElement(b,\"cke_iframe\",\"iframe\",!0)}}})}})})();(function(){function m(a){function f(a){var b=!1;g.attachListener(g,\"keydown\",function(){var d=c.getBody().getElementsByTag(a);if(!b){for(var e=0;e<d.count();e++)d.getItem(e).setCustomData(\"retain\",!0);b=!0}},null,null,1);g.attachListener(g,\"keyup\",function(){var d=c.getElementsByTag(a);b&&(1!=d.count()||d.getItem(0).getCustomData(\"retain\")||d.getItem(0).remove(1),b=!1)})}var b=this.editor,c=a.document,d=c.body,e=c.getElementById(\"cke_actscrpt\");e&&e.parentNode.removeChild(e);(e=c.getElementById(\"cke_shimscrpt\"))&&\ne.parentNode.removeChild(e);(e=c.getElementById(\"cke_basetagscrpt\"))&&e.parentNode.removeChild(e);d.contentEditable=!0;CKEDITOR.env.ie&&(d.hideFocus=!0,d.disabled=!0,d.removeAttribute(\"disabled\"));delete this._.isLoadingData;this.$=d;c=new CKEDITOR.dom.document(c);this.setup();this.fixInitialSelection();var g=this;CKEDITOR.env.ie&&!CKEDITOR.env.edge&&c.getDocumentElement().addClass(c.$.compatMode);CKEDITOR.env.ie&&!CKEDITOR.env.edge&&b.enterMode!=CKEDITOR.ENTER_P?f(\"p\"):CKEDITOR.env.edge&&b.enterMode!=\nCKEDITOR.ENTER_DIV&&f(\"div\");if(CKEDITOR.env.webkit||CKEDITOR.env.ie&&10<CKEDITOR.env.version)c.getDocumentElement().on(\"mousedown\",function(a){a.data.getTarget().is(\"html\")&&setTimeout(function(){b.editable().focus()})});n(b);try{b.document.$.execCommand(\"2D-position\",!1,!0)}catch(h){}(CKEDITOR.env.gecko||CKEDITOR.env.ie&&\"CSS1Compat\"==b.document.$.compatMode)&&this.attachListener(this,\"keydown\",function(a){var c=a.data.getKeystroke();if(33==c||34==c)if(CKEDITOR.env.ie)setTimeout(function(){b.getSelection().scrollIntoView()},\n0);else if(b.window.$.innerHeight>this.$.offsetHeight){var d=b.createRange();d[33==c?\"moveToElementEditStart\":\"moveToElementEditEnd\"](this);d.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(c,\"blur\",function(){try{c.$.selection.empty()}catch(a){}});CKEDITOR.env.iOS&&this.attachListener(c,\"touchend\",function(){a.focus()});d=b.document.getElementsByTag(\"title\").getItem(0);d.data(\"cke-title\",d.getText());CKEDITOR.env.ie&&(b.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){\"unloaded\"==\nthis.status&&(this.status=\"ready\");b.fire(\"contentDom\");this._.isPendingFocus&&(b.focus(),this._.isPendingFocus=!1);setTimeout(function(){b.fire(\"dataReady\")},0)},0,this)}function n(a){function f(){var c;a.editable().attachListener(a,\"selectionChange\",function(){var d=a.getSelection().getSelectedElement();d&&(c&&(c.detachEvent(\"onresizestart\",b),c=null),d.$.attachEvent(\"onresizestart\",b),c=d.$)})}function b(a){a.returnValue=!1}if(CKEDITOR.env.gecko)try{var c=a.document.$;c.execCommand(\"enableObjectResizing\",\n!1,!a.config.disableObjectResizing);c.execCommand(\"enableInlineTableEditing\",!1,!a.config.disableNativeTableHandles)}catch(d){}else CKEDITOR.env.ie&&11>CKEDITOR.env.version&&a.config.disableObjectResizing&&f(a)}function p(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push(\"html.CSS1Compat [contenteditable\\x3dfalse]{min-height:0 !important}\");var f=[],b;for(b in CKEDITOR.dtd.$removeEmpty)f.push(\"html.CSS1Compat \"+b+\"[contenteditable\\x3dfalse]\");a.push(f.join(\",\")+\"{display:inline-block}\")}else CKEDITOR.env.gecko&&\n(a.push(\"html{height:100% !important}\"),a.push(\"img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}\"));a.push(\"html{cursor:text;*cursor:auto}\");a.push(\"img,input,textarea{cursor:default}\");return a.join(\"\\n\")}CKEDITOR.plugins.add(\"wysiwygarea\",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:\"html head title; style [media,type]; body (*)[id]; meta link [*]\",requiredContent:\"body\"});a.addMode(\"wysiwyg\",function(f){function b(b){b&&b.removeListener();a.editable(new l(a,\nd.$.contentWindow.document.body));a.setData(a.getData(1),f)}var c=\"document.open();\"+(CKEDITOR.env.ie?\"(\"+CKEDITOR.tools.fixDomain+\")();\":\"\")+\"document.close();\",c=CKEDITOR.env.air?\"javascript:void(0)\":CKEDITOR.env.ie&&!CKEDITOR.env.edge?\"javascript:void(function(){\"+encodeURIComponent(c)+\"}())\":\"\",d=CKEDITOR.dom.element.createFromHtml('\\x3ciframe src\\x3d\"'+c+'\" frameBorder\\x3d\"0\"\\x3e\\x3c/iframe\\x3e');d.setStyles({width:\"100%\",height:\"100%\"});d.addClass(\"cke_wysiwyg_frame\").addClass(\"cke_reset\");\nc=a.ui.space(\"contents\");c.append(d);var e=CKEDITOR.env.ie&&!CKEDITOR.env.edge||CKEDITOR.env.gecko;if(e)d.on(\"load\",b);var g=a.title,h=a.fire(\"ariaEditorHelpLabel\",{}).label;g&&(CKEDITOR.env.ie&&h&&(g+=\", \"+h),d.setAttribute(\"title\",g));if(h){var g=CKEDITOR.tools.getNextId(),k=CKEDITOR.dom.element.createFromHtml('\\x3cspan id\\x3d\"'+g+'\" class\\x3d\"cke_voice_label\"\\x3e'+h+\"\\x3c/span\\x3e\");c.append(k,1);d.setAttribute(\"aria-describedby\",g)}a.on(\"beforeModeUnload\",function(a){a.removeListener();k&&k.remove()});\nd.setAttributes({tabIndex:a.tabIndex,allowTransparency:\"true\"});!e&&b();a.fire(\"ariaWidget\",d)})}});CKEDITOR.editor.prototype.addContentsCss=function(a){var f=this.config,b=f.contentsCss;CKEDITOR.tools.isArray(b)||(f.contentsCss=b?[b]:[]);f.contentsCss.push(a)};var l=CKEDITOR.tools.createClass({$:function(){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(m,0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute(\"title\")},\nbase:CKEDITOR.editable,proto:{setData:function(a,f){var b=this.editor;if(f)this.setHtml(a),this.fixInitialSelection(),b.fire(\"dataReady\");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,d=c.fullPage,e=c.docType,g=CKEDITOR.tools.buildStyleHtml(p()).replace(/<style>/,'\\x3cstyle data-cke-temp\\x3d\"1\"\\x3e');d||(g+=CKEDITOR.tools.buildStyleHtml(b.config.contentsCss));var h=c.baseHref?'\\x3cbase href\\x3d\"'+c.baseHref+'\" data-cke-temp\\x3d\"1\" /\\x3e':\"\";d&&(a=a.replace(/<!DOCTYPE[^>]*>/i,function(a){b.docType=\ne=a;return\"\"}).replace(/<\\?xml\\s[^\\?]*\\?>/i,function(a){b.xmlDeclaration=a;return\"\"}));a=b.dataProcessor.toHtml(a);d?(/<body[\\s|>]/.test(a)||(a=\"\\x3cbody\\x3e\"+a),/<html[\\s|>]/.test(a)||(a=\"\\x3chtml\\x3e\"+a+\"\\x3c/html\\x3e\"),/<head[\\s|>]/.test(a)?/<title[\\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,\"$\\x26\\x3ctitle\\x3e\\x3c/title\\x3e\")):a=a.replace(/<html[^>]*>/,\"$\\x26\\x3chead\\x3e\\x3ctitle\\x3e\\x3c/title\\x3e\\x3c/head\\x3e\"),h&&(a=a.replace(/<head[^>]*?>/,\"$\\x26\"+h)),a=a.replace(/<\\/head\\s*>/,g+\"$\\x26\"),a=\ne+a):a=c.docType+'\\x3chtml dir\\x3d\"'+c.contentsLangDirection+'\" lang\\x3d\"'+(c.contentsLanguage||b.langCode)+'\"\\x3e\\x3chead\\x3e\\x3ctitle\\x3e'+this._.docTitle+\"\\x3c/title\\x3e\"+h+g+\"\\x3c/head\\x3e\\x3cbody\"+(c.bodyId?' id\\x3d\"'+c.bodyId+'\"':\"\")+(c.bodyClass?' class\\x3d\"'+c.bodyClass+'\"':\"\")+\"\\x3e\"+a+\"\\x3c/body\\x3e\\x3c/html\\x3e\";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'\\x3cbody contenteditable\\x3d\"true\" '),2E4>CKEDITOR.env.version&&(a=a.replace(/<body[^>]*>/,\"$\\x26\\x3c!-- cke-content-start --\\x3e\")));\nc='\\x3cscript id\\x3d\"cke_actscrpt\" type\\x3d\"text/javascript\"'+(CKEDITOR.env.ie?' defer\\x3d\"defer\" ':\"\")+\"\\x3evar wasLoaded\\x3d0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction(\"+this._.frameLoadedHandler+\",window);wasLoaded\\x3d1;}\"+(CKEDITOR.env.ie?\"onload();\":'document.addEventListener(\"DOMContentLoaded\", onload, false );')+\"\\x3c/script\\x3e\";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(c+='\\x3cscript id\\x3d\"cke_shimscrpt\"\\x3ewindow.parent.CKEDITOR.tools.enableHtml5Elements(document)\\x3c/script\\x3e');\nh&&CKEDITOR.env.ie&&10>CKEDITOR.env.version&&(c+='\\x3cscript id\\x3d\"cke_basetagscrpt\"\\x3evar baseTag \\x3d document.querySelector( \"base\" );baseTag.href \\x3d baseTag.href;\\x3c/script\\x3e');a=a.replace(/(?=\\s*<\\/(:?head)>)/,c);this.clearCustomData();this.clearListeners();b.fire(\"contentDomUnload\");var k=this.getDocument();try{k.write(a)}catch(l){setTimeout(function(){k.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();a=this.editor;var f=a.config,b=f.fullPage,c=b&&a.docType,d=b&&a.xmlDeclaration,\ne=this.getDocument(),b=b?e.getDocumentElement().getOuterHtml():e.getBody().getHtml();CKEDITOR.env.gecko&&f.enterMode!=CKEDITOR.ENTER_BR&&(b=b.replace(/<br>(?=\\s*(:?$|<\\/body>))/,\"\"));b=a.dataProcessor.toDataFormat(b);d&&(b=d+\"\\n\"+b);c&&(b=c+\"\\n\"+b);return b},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:l.baseProto.focus.call(this)},detach:function(){var a=this.editor,f=a.document,b;try{b=a.window.getFrame()}catch(c){}l.baseProto.detach.call(this);this.clearCustomData();f.getDocumentElement().clearCustomData();\nCKEDITOR.tools.removeFunction(this._.frameLoadedHandler);b&&b.getParent()?(b.clearCustomData(),(a=b.removeCustomData(\"onResize\"))&&a.removeListener(),b.remove()):CKEDITOR.warn(\"editor-destroy-iframe\")}}})})();CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is(\"img\")&&!a.data(\"cke-realelement\")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle(\"float\");if(\"inherit\"==a||\"none\"==a)a=0;a||(a=b.getAttribute(\"align\"));return a}CKEDITOR.plugins.add(\"image\",{requires:\"dialog\",init:function(b){if(!b.plugins.image2){CKEDITOR.dialog.add(\"image\",this.path+\"dialogs/image.js\");var a=\"img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}\";\nCKEDITOR.dialog.isTabEnabled(b,\"image\",\"advanced\")&&(a=\"img[alt,dir,id,lang,longdesc,!src,title]{*}(*)\");b.addCommand(\"image\",new CKEDITOR.dialogCommand(\"image\",{allowedContent:a,requiredContent:\"img[alt,src]\",contentTransformations:[[\"img{width}: sizeToStyle\",\"img[width]: sizeToAttribute\"],[\"img{float}: alignmentToStyle\",\"img[align]: alignmentToAttribute\"]]}));b.ui.addButton&&b.ui.addButton(\"Image\",{label:b.lang.common.image,command:\"image\",toolbar:\"insert,10\"});b.on(\"doubleclick\",function(b){var a=\nb.data.element;!a.is(\"img\")||a.data(\"cke-realelement\")||a.isReadOnly()||(b.data.dialog=\"image\")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:\"image\",group:\"image\"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})}},afterInit:function(b){function a(a){var d=b.getCommand(\"justify\"+a);if(d){if(\"left\"==a||\"right\"==a)d.on(\"exec\",function(d){var c=e(b),g;c&&(g=f(c),g==a?(c.removeStyle(\"float\"),a==f(c)&&c.removeAttribute(\"align\")):\nc.setStyle(\"float\",a),d.cancel())});d.on(\"refresh\",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:\"right\"==a||\"left\"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}b.plugins.image2||(a(\"left\"),a(\"right\"),a(\"center\"),a(\"block\"))}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;(function(){function m(a,b){var e,f;b.on(\"refresh\",function(a){var b=[k],c;for(c in a.data.states)b.push(a.data.states[c]);this.setState(CKEDITOR.tools.search(b,p)?p:k)},b,null,100);b.on(\"exec\",function(b){e=a.getSelection();f=e.createBookmarks(1);b.data||(b.data={});b.data.done=!1},b,null,0);b.on(\"exec\",function(){a.forceNextSelectionCheck();e.selectBookmarks(f)},b,null,100)}var k=CKEDITOR.TRISTATE_DISABLED,p=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add(\"indent\",{init:function(a){var b=CKEDITOR.plugins.indent.genericDefinition;\nm(a,a.addCommand(\"indent\",new b(!0)));m(a,a.addCommand(\"outdent\",new b));a.ui.addButton&&(a.ui.addButton(\"Indent\",{label:a.lang.indent.indent,command:\"indent\",directional:!0,toolbar:\"indent,20\"}),a.ui.addButton(\"Outdent\",{label:a.lang.indent.outdent,command:\"outdent\",directional:!0,toolbar:\"indent,10\"}));a.on(\"dirChanged\",function(b){var f=a.createRange(),l=b.data.node;f.setStartBefore(l);f.setEndAfter(l);for(var n=new CKEDITOR.dom.walker(f),c;c=n.next();)if(c.type==CKEDITOR.NODE_ELEMENT)if(!c.equals(l)&&\nc.getDirection())f.setStartAfter(c),n=new CKEDITOR.dom.walker(f);else{var d=a.config.indentClasses;if(d)for(var g=\"ltr\"==b.data.dir?[\"_rtl\",\"\"]:[\"\",\"_rtl\"],h=0;h<d.length;h++)c.hasClass(d[h]+g[0])&&(c.removeClass(d[h]+g[0]),c.addClass(d[h]+g[1]));d=c.getStyle(\"margin-right\");g=c.getStyle(\"margin-left\");d?c.setStyle(\"margin-left\",d):c.removeStyle(\"margin-left\");g?c.setStyle(\"margin-right\",g):c.removeStyle(\"margin-right\")}})}});CKEDITOR.plugins.indent={genericDefinition:function(a){this.isIndent=!!a;\nthis.startDisabled=!this.isIndent},specificDefinition:function(a,b,e){this.name=b;this.editor=a;this.jobs={};this.enterBr=a.config.enterMode==CKEDITOR.ENTER_BR;this.isIndent=!!e;this.relatedGlobal=e?\"indent\":\"outdent\";this.indentKey=e?9:CKEDITOR.SHIFT+9;this.database={}},registerCommands:function(a,b){a.on(\"pluginsLoaded\",function(){for(var a in b)(function(a,b){var e=a.getCommand(b.relatedGlobal),c;for(c in b.jobs)e.on(\"exec\",function(d){d.data.done||(a.fire(\"lockSnapshot\"),b.execJob(a,c)&&(d.data.done=\n!0),a.fire(\"unlockSnapshot\"),CKEDITOR.dom.element.clearAllMarkers(b.database))},this,null,c),e.on(\"refresh\",function(d){d.data.states||(d.data.states={});d.data.states[b.name+\"@\"+c]=b.refreshJob(a,c,d.data.path)},this,null,c);a.addFeature(b)})(this,b[a])})}};CKEDITOR.plugins.indent.genericDefinition.prototype={context:\"p\",exec:function(){}};CKEDITOR.plugins.indent.specificDefinition.prototype={execJob:function(a,b){var e=this.jobs[b];if(e.state!=k)return e.exec.call(this,a)},refreshJob:function(a,\nb,e){b=this.jobs[b];a.activeFilter.checkFeature(this)?b.state=b.refresh.call(this,a,e):b.state=k;return b.state},getContext:function(a){return a.contains(this.context)}}})();(function(){function f(b,c,a){if(!b.getCustomData(\"indent_processed\")){var d=this.editor,l=this.isIndent;if(c){d=b.$.className.match(this.classNameRegex);a=0;d&&(d=d[1],a=CKEDITOR.tools.indexOf(c,d)+1);if(0>(a+=l?1:-1))return;a=Math.min(a,c.length);a=Math.max(a,0);b.$.className=CKEDITOR.tools.ltrim(b.$.className.replace(this.classNameRegex,\"\"));0<a&&b.addClass(c[a-1])}else{c=m(b,a);a=parseInt(b.getStyle(c),10);var g=d.config.indentOffset||40;isNaN(a)&&(a=0);a+=(l?1:-1)*g;if(0>a)return;a=Math.max(a,\n0);a=Math.ceil(a/g)*g;b.setStyle(c,a?a+(d.config.indentUnit||\"px\"):\"\");\"\"===b.getAttribute(\"style\")&&b.removeAttribute(\"style\")}CKEDITOR.dom.element.setMarker(this.database,b,\"indent_processed\",1)}}function m(b,c){return\"ltr\"==(c||b.getComputedStyle(\"direction\"))?\"margin-left\":\"margin-right\"}var h=CKEDITOR.dtd.$listItem,p=CKEDITOR.dtd.$list,k=CKEDITOR.TRISTATE_DISABLED,n=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add(\"indentblock\",{requires:\"indent\",init:function(b){function c(){a.specificDefinition.apply(this,\narguments);this.allowedContent={\"div h1 h2 h3 h4 h5 h6 ol p pre ul\":{propertiesOnly:!0,styles:d?null:\"margin-left,margin-right\",classes:d||null}};this.enterBr&&(this.allowedContent.div=!0);this.requiredContent=(this.enterBr?\"div\":\"p\")+(d?\"(\"+d.join(\",\")+\")\":\"{margin-left}\");this.jobs={20:{refresh:function(a,b){var e=b.block||b.blockLimit;if(!e.is(h))var c=e.getAscendant(h),e=c&&b.contains(c)||e;e.is(h)&&(e=e.getParent());if(this.enterBr||this.getContext(b)){if(d){var c=d,e=e.$.className.match(this.classNameRegex),\nf=this.isIndent,c=e?f?e[1]!=c.slice(-1):!0:f;return c?n:k}return this.isIndent?n:e?CKEDITOR[0>=(parseInt(e.getStyle(m(e)),10)||0)?\"TRISTATE_DISABLED\":\"TRISTATE_OFF\"]:k}return k},exec:function(a){var b=a.getSelection(),b=b&&b.getRanges()[0],c;if(c=a.elementPath().contains(p))f.call(this,c,d);else for(b=b.createIterator(),a=a.config.enterMode,b.enforceRealBlocks=!0,b.enlargeBr=a!=CKEDITOR.ENTER_BR;c=b.getNextParagraph(a==CKEDITOR.ENTER_P?\"p\":\"div\");)c.isReadOnly()||f.call(this,c,d);return!0}}}}var a=\nCKEDITOR.plugins.indent,d=b.config.indentClasses;a.registerCommands(b,{indentblock:new c(b,\"indentblock\",!0),outdentblock:new c(b,\"outdentblock\")});CKEDITOR.tools.extend(c.prototype,a.specificDefinition.prototype,{context:{div:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,p:1,pre:1,table:1},classNameRegex:d?new RegExp(\"(?:^|\\\\s+)(\"+d.join(\"|\")+\")(?\\x3d$|\\\\s)\"):null})}})})();(function(){function w(c){function f(b){for(var e=d.startContainer,a=d.endContainer;e&&!e.getParent().equals(b);)e=e.getParent();for(;a&&!a.getParent().equals(b);)a=a.getParent();if(!e||!a)return!1;for(var g=e,e=[],k=!1;!k;)g.equals(a)&&(k=!0),e.push(g),g=g.getNext();if(1>e.length)return!1;g=b.getParents(!0);for(a=0;a<g.length;a++)if(g[a].getName&&p[g[a].getName()]){b=g[a];break}for(var g=l.isIndent?1:-1,a=e[0],e=e[e.length-1],k=CKEDITOR.plugins.list.listToArray(b,q),n=k[e.getCustomData(\"listarray_index\")].indent,\na=a.getCustomData(\"listarray_index\");a<=e.getCustomData(\"listarray_index\");a++)if(k[a].indent+=g,0<g){var h=k[a].parent;k[a].parent=new CKEDITOR.dom.element(h.getName(),h.getDocument())}for(a=e.getCustomData(\"listarray_index\")+1;a<k.length&&k[a].indent>n;a++)k[a].indent+=g;e=CKEDITOR.plugins.list.arrayToList(k,q,null,c.config.enterMode,b.getDirection());if(!l.isIndent){var f;if((f=b.getParent())&&f.is(\"li\"))for(var g=e.listNode.getChildren(),r=[],m,a=g.count()-1;0<=a;a--)(m=g.getItem(a))&&m.is&&m.is(\"li\")&&\nr.push(m)}e&&e.listNode.replace(b);if(r&&r.length)for(a=0;a<r.length;a++){for(m=b=r[a];(m=m.getNext())&&m.is&&m.getName()in p;)CKEDITOR.env.needsNbspFiller&&!b.getFirst(x)&&b.append(d.document.createText(\" \")),b.append(m);b.insertAfter(f)}e&&c.fire(\"contentDomInvalidated\");return!0}for(var l=this,q=this.database,p=this.context,n=c.getSelection(),n=(n&&n.getRanges()).createIterator(),d;d=n.getNextRange();){for(var b=d.getCommonAncestor();b&&(b.type!=CKEDITOR.NODE_ELEMENT||!p[b.getName()]);){if(c.editable().equals(b)){b=\n!1;break}b=b.getParent()}b||(b=d.startPath().contains(p))&&d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);if(!b){var h=d.getEnclosedNode();h&&h.type==CKEDITOR.NODE_ELEMENT&&h.getName()in p&&(d.setStartAt(h,CKEDITOR.POSITION_AFTER_START),d.setEndAt(h,CKEDITOR.POSITION_BEFORE_END),b=h)}b&&d.startContainer.type==CKEDITOR.NODE_ELEMENT&&d.startContainer.getName()in p&&(h=new CKEDITOR.dom.walker(d),h.evaluator=t,d.startContainer=h.next());b&&d.endContainer.type==CKEDITOR.NODE_ELEMENT&&d.endContainer.getName()in\np&&(h=new CKEDITOR.dom.walker(d),h.evaluator=t,d.endContainer=h.previous());if(b)return f(b)}return 0}function t(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is(\"li\")}function x(c){return y(c)&&z(c)}var y=CKEDITOR.dom.walker.whitespaces(!0),z=CKEDITOR.dom.walker.bookmark(!1,!0),u=CKEDITOR.TRISTATE_DISABLED,v=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add(\"indentlist\",{requires:\"indent\",init:function(c){function f(c){l.specificDefinition.apply(this,arguments);this.requiredContent=[\"ul\",\"ol\"];c.on(\"key\",\nfunction(f){if(\"wysiwyg\"==c.mode&&f.data.keyCode==this.indentKey){var n=this.getContext(c.elementPath());!n||this.isIndent&&CKEDITOR.plugins.indentList.firstItemInPath(this.context,c.elementPath(),n)||(c.execCommand(this.relatedGlobal),f.cancel())}},this);this.jobs[this.isIndent?10:30]={refresh:this.isIndent?function(c,f){var d=this.getContext(f),b=CKEDITOR.plugins.indentList.firstItemInPath(this.context,f,d);return d&&this.isIndent&&!b?v:u}:function(c,f){return!this.getContext(f)||this.isIndent?\nu:v},exec:CKEDITOR.tools.bind(w,this)}}var l=CKEDITOR.plugins.indent;l.registerCommands(c,{indentlist:new f(c,\"indentlist\",!0),outdentlist:new f(c,\"outdentlist\")});CKEDITOR.tools.extend(f.prototype,l.specificDefinition.prototype,{context:{ol:1,ul:1}})}});CKEDITOR.plugins.indentList={};CKEDITOR.plugins.indentList.firstItemInPath=function(c,f,l){var q=f.contains(t);l||(l=f.contains(c));return l&&q&&q.equals(l.getFirst(t))}})();CKEDITOR.plugins.add(\"smiley\",{requires:\"dialog\",init:function(a){a.config.smiley_path=a.config.smiley_path||this.path+\"images/\";a.addCommand(\"smiley\",new CKEDITOR.dialogCommand(\"smiley\",{allowedContent:\"img[alt,height,!src,title,width]\",requiredContent:\"img\"}));a.ui.addButton&&a.ui.addButton(\"Smiley\",{label:a.lang.smiley.toolbar,command:\"smiley\",toolbar:\"insert,50\"});CKEDITOR.dialog.add(\"smiley\",this.path+\"dialogs/smiley.js\")}});CKEDITOR.config.smiley_images=\"regular_smile.png sad_smile.png wink_smile.png teeth_smile.png confused_smile.png tongue_smile.png embarrassed_smile.png omg_smile.png whatchutalkingabout_smile.png angry_smile.png angel_smile.png shades_smile.png devil_smile.png cry_smile.png lightbulb.png thumbs_down.png thumbs_up.png heart.png broken_heart.png kiss.png envelope.png\".split(\" \");\nCKEDITOR.config.smiley_descriptions=\"smiley;sad;wink;laugh;frown;cheeky;blush;surprise;indecision;angry;angel;cool;devil;crying;enlightened;no;yes;heart;broken heart;kiss;mail\".split(\";\");(function(){function n(a,c){c=void 0===c||c;var b;if(c)b=a.getComputedStyle(\"text-align\");else{for(;!a.hasAttribute||!a.hasAttribute(\"align\")&&!a.getStyle(\"text-align\");){b=a.getParent();if(!b)break;a=b}b=a.getStyle(\"text-align\")||a.getAttribute(\"align\")||\"\"}b&&(b=b.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,\"\"));!b&&c&&(b=\"rtl\"==a.getComputedStyle(\"direction\")?\"right\":\"left\");return b}function g(a,c,b){this.editor=a;this.name=c;this.value=b;this.context=\"p\";c=a.config.justifyClasses;var h=a.config.enterMode==\nCKEDITOR.ENTER_P?\"p\":\"div\";if(c){switch(b){case \"left\":this.cssClassName=c[0];break;case \"center\":this.cssClassName=c[1];break;case \"right\":this.cssClassName=c[2];break;case \"justify\":this.cssClassName=c[3]}this.cssClassRegex=new RegExp(\"(?:^|\\\\s+)(?:\"+c.join(\"|\")+\")(?\\x3d$|\\\\s)\");this.requiredContent=h+\"(\"+this.cssClassName+\")\"}else this.requiredContent=h+\"{text-align}\";this.allowedContent={\"caption div h1 h2 h3 h4 h5 h6 p pre td th li\":{propertiesOnly:!0,styles:this.cssClassName?null:\"text-align\",\nclasses:this.cssClassName||null}};a.config.enterMode==CKEDITOR.ENTER_BR&&(this.allowedContent.div=!0)}function l(a){var c=a.editor,b=c.createRange();b.setStartBefore(a.data.node);b.setEndAfter(a.data.node);for(var h=new CKEDITOR.dom.walker(b),d;d=h.next();)if(d.type==CKEDITOR.NODE_ELEMENT)if(!d.equals(a.data.node)&&d.getDirection())b.setStartAfter(d),h=new CKEDITOR.dom.walker(b);else{var e=c.config.justifyClasses;e&&(d.hasClass(e[0])?(d.removeClass(e[0]),d.addClass(e[2])):d.hasClass(e[2])&&(d.removeClass(e[2]),\nd.addClass(e[0])));e=d.getStyle(\"text-align\");\"left\"==e?d.setStyle(\"text-align\",\"right\"):\"right\"==e&&d.setStyle(\"text-align\",\"left\")}}g.prototype={exec:function(a){var c=a.getSelection(),b=a.config.enterMode;if(c){for(var h=c.createBookmarks(),d=c.getRanges(),e=this.cssClassName,g,f,k=a.config.useComputedState,k=void 0===k||k,m=d.length-1;0<=m;m--)for(g=d[m].createIterator(),g.enlargeBr=b!=CKEDITOR.ENTER_BR;f=g.getNextParagraph(b==CKEDITOR.ENTER_P?\"p\":\"div\");)if(!f.isReadOnly()){f.removeAttribute(\"align\");\nf.removeStyle(\"text-align\");var l=e&&(f.$.className=CKEDITOR.tools.ltrim(f.$.className.replace(this.cssClassRegex,\"\"))),p=this.state==CKEDITOR.TRISTATE_OFF&&(!k||n(f,!0)!=this.value);e?p?f.addClass(e):l||f.removeAttribute(\"class\"):p&&f.setStyle(\"text-align\",this.value)}a.focus();a.forceNextSelectionCheck();c.selectBookmarks(h)}},refresh:function(a,c){var b=c.block||c.blockLimit;this.setState(\"body\"!=b.getName()&&n(b,this.editor.config.useComputedState)==this.value?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)}};\nCKEDITOR.plugins.add(\"justify\",{init:function(a){if(!a.blockless){var c=new g(a,\"justifyleft\",\"left\"),b=new g(a,\"justifycenter\",\"center\"),h=new g(a,\"justifyright\",\"right\"),d=new g(a,\"justifyblock\",\"justify\");a.addCommand(\"justifyleft\",c);a.addCommand(\"justifycenter\",b);a.addCommand(\"justifyright\",h);a.addCommand(\"justifyblock\",d);a.ui.addButton&&(a.ui.addButton(\"JustifyLeft\",{label:a.lang.justify.left,command:\"justifyleft\",toolbar:\"align,10\"}),a.ui.addButton(\"JustifyCenter\",{label:a.lang.justify.center,\ncommand:\"justifycenter\",toolbar:\"align,20\"}),a.ui.addButton(\"JustifyRight\",{label:a.lang.justify.right,command:\"justifyright\",toolbar:\"align,30\"}),a.ui.addButton(\"JustifyBlock\",{label:a.lang.justify.block,command:\"justifyblock\",toolbar:\"align,40\"}));a.on(\"dirChanged\",l)}}})})();CKEDITOR.plugins.add(\"menubutton\",{requires:\"button,menu\",onLoad:function(){var d=function(c){var a=this._,b=a.menu;a.state!==CKEDITOR.TRISTATE_DISABLED&&(a.on&&b?b.hide():(a.previousState=a.state,b||(b=a.menu=new CKEDITOR.menu(c,{panel:{className:\"cke_menu_panel\",attributes:{\"aria-label\":c.lang.common.options}}}),b.onHide=CKEDITOR.tools.bind(function(){var b=this.command?c.getCommand(this.command).modes:this.modes;this.setState(!b||b[c.mode]?a.previousState:CKEDITOR.TRISTATE_DISABLED);a.on=0},this),\nthis.onMenu&&b.addListener(this.onMenu)),this.setState(CKEDITOR.TRISTATE_ON),a.on=1,setTimeout(function(){b.show(CKEDITOR.document.getById(a.id),4)},0)))};CKEDITOR.ui.menuButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){delete c.panel;this.base(c);this.hasArrow=!0;this.click=d},statics:{handler:{create:function(c){return new CKEDITOR.ui.menuButton(c)}}}})},beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_MENUBUTTON,CKEDITOR.ui.menuButton.handler)}});\nCKEDITOR.UI_MENUBUTTON=\"menubutton\";(function(){CKEDITOR.plugins.add(\"language\",{requires:\"menubutton\",init:function(a){var b=a.config.language_list||[\"ar:Arabic:rtl\",\"fr:French\",\"es:Spanish\"],c=this,d=a.lang.language,e={},g,h,k,f;a.addCommand(\"language\",{allowedContent:\"span[!lang,!dir]\",requiredContent:\"span[lang,dir]\",contextSensitive:!0,exec:function(a,b){var c=e[\"language_\"+b];if(c)a[c.style.checkActive(a.elementPath(),a)?\"removeStyle\":\"applyStyle\"](c.style)},refresh:function(a){this.setState(c.getCurrentLangElement(a)?CKEDITOR.TRISTATE_ON:\nCKEDITOR.TRISTATE_OFF)}});for(f=0;f<b.length;f++)g=b[f].split(\":\"),h=g[0],k=\"language_\"+h,e[k]={label:g[1],langId:h,group:\"language\",order:f,ltr:\"rtl\"!=(\"\"+g[2]).toLowerCase(),onClick:function(){a.execCommand(\"language\",this.langId)},role:\"menuitemcheckbox\"},e[k].style=new CKEDITOR.style({element:\"span\",attributes:{lang:h,dir:e[k].ltr?\"ltr\":\"rtl\"}});e.language_remove={label:d.remove,group:\"language_remove\",state:CKEDITOR.TRISTATE_DISABLED,order:e.length,onClick:function(){var b=c.getCurrentLangElement(a);\nb&&a.execCommand(\"language\",b.getAttribute(\"lang\"))}};a.addMenuGroup(\"language\",1);a.addMenuGroup(\"language_remove\");a.addMenuItems(e);a.ui.add(\"Language\",CKEDITOR.UI_MENUBUTTON,{label:d.button,allowedContent:\"span[!lang,!dir]\",requiredContent:\"span[lang,dir]\",toolbar:\"bidi,30\",command:\"language\",onMenu:function(){var b={},d=c.getCurrentLangElement(a),f;for(f in e)b[f]=CKEDITOR.TRISTATE_OFF;b.language_remove=d?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;d&&(b[\"language_\"+d.getAttribute(\"lang\")]=\nCKEDITOR.TRISTATE_ON);return b}})},getCurrentLangElement:function(a){var b=a.elementPath();a=b&&b.elements;var c;if(b)for(var d=0;d<a.length;d++)b=a[d],!c&&\"span\"==b.getName()&&b.hasAttribute(\"dir\")&&b.hasAttribute(\"lang\")&&(c=b);return c}})})();(function(){function p(c){return c.replace(/'/g,\"\\\\$\\x26\")}function q(c){for(var b,a=c.length,f=[],e=0;e<a;e++)b=c.charCodeAt(e),f.push(b);return\"String.fromCharCode(\"+f.join(\",\")+\")\"}function r(c,b){var a=c.plugins.link,f=a.compiledProtectionFunction.params,e,d;d=[a.compiledProtectionFunction.name,\"(\"];for(var g=0;g<f.length;g++)a=f[g].toLowerCase(),e=b[a],0<g&&d.push(\",\"),d.push(\"'\",e?p(encodeURIComponent(b[a])):\"\",\"'\");d.push(\")\");return d.join(\"\")}function n(c){c=c.config.emailProtection||\"\";\nvar b;c&&\"encode\"!=c&&(b={},c.replace(/^([^(]+)\\(([^)]+)\\)$/,function(a,c,e){b.name=c;b.params=[];e.replace(/[^,\\s]+/g,function(a){b.params.push(a)})}));return b}CKEDITOR.plugins.add(\"link\",{requires:\"dialog,fakeobjects\",onLoad:function(){function c(b){return a.replace(/%1/g,\"rtl\"==b?\"right\":\"left\").replace(/%2/g,\"cke_contents_\"+b)}var b=\"background:url(\"+CKEDITOR.getUrl(this.path+\"images\"+(CKEDITOR.env.hidpi?\"/hidpi\":\"\")+\"/anchor.png\")+\") no-repeat %1 center;border:1px dotted #00f;background-size:16px;\",\na=\".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{\"+b+\"padding-%1:18px;cursor:auto;}.%2 img.cke_anchor{\"+b+\"width:16px;min-height:15px;height:1.15em;vertical-align:text-bottom;}\";CKEDITOR.addCss(c(\"ltr\")+c(\"rtl\"))},init:function(c){var b=\"a[!href]\";CKEDITOR.dialog.isTabEnabled(c,\"link\",\"advanced\")&&(b=b.replace(\"]\",\",accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)\"));CKEDITOR.dialog.isTabEnabled(c,\"link\",\"target\")&&(b=b.replace(\"]\",\n\",target,onclick]\"));c.addCommand(\"link\",new CKEDITOR.dialogCommand(\"link\",{allowedContent:b,requiredContent:\"a[href]\"}));c.addCommand(\"anchor\",new CKEDITOR.dialogCommand(\"anchor\",{allowedContent:\"a[!name,id]\",requiredContent:\"a[name]\"}));c.addCommand(\"unlink\",new CKEDITOR.unlinkCommand);c.addCommand(\"removeAnchor\",new CKEDITOR.removeAnchorCommand);c.setKeystroke(CKEDITOR.CTRL+76,\"link\");c.ui.addButton&&(c.ui.addButton(\"Link\",{label:c.lang.link.toolbar,command:\"link\",toolbar:\"links,10\"}),c.ui.addButton(\"Unlink\",\n{label:c.lang.link.unlink,command:\"unlink\",toolbar:\"links,20\"}),c.ui.addButton(\"Anchor\",{label:c.lang.link.anchor.toolbar,command:\"anchor\",toolbar:\"links,30\"}));CKEDITOR.dialog.add(\"link\",this.path+\"dialogs/link.js\");CKEDITOR.dialog.add(\"anchor\",this.path+\"dialogs/anchor.js\");c.on(\"doubleclick\",function(a){var b=CKEDITOR.plugins.link.getSelectedLink(c)||a.data.element;b.isReadOnly()||(b.is(\"a\")?(a.data.dialog=!b.getAttribute(\"name\")||b.getAttribute(\"href\")&&b.getChildCount()?\"link\":\"anchor\",a.data.link=\nb):CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b)&&(a.data.dialog=\"anchor\"))},null,null,0);c.on(\"doubleclick\",function(a){a.data.dialog in{link:1,anchor:1}&&a.data.link&&c.getSelection().selectElement(a.data.link)},null,null,20);c.addMenuItems&&c.addMenuItems({anchor:{label:c.lang.link.anchor.menu,command:\"anchor\",group:\"anchor\",order:1},removeAnchor:{label:c.lang.link.anchor.remove,command:\"removeAnchor\",group:\"anchor\",order:5},link:{label:c.lang.link.menu,command:\"link\",group:\"link\",order:1},unlink:{label:c.lang.link.unlink,\ncommand:\"unlink\",group:\"link\",order:5}});c.contextMenu&&c.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(c)))return null;var b={};a.getAttribute(\"href\")&&a.getChildCount()&&(b={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});a&&a.hasAttribute(\"name\")&&(b.anchor=b.removeAnchor=CKEDITOR.TRISTATE_OFF);return b});this.compiledProtectionFunction=n(c)},afterInit:function(c){c.dataProcessor.dataFilter.addRules({elements:{a:function(a){return a.attributes.name?\na.children.length?null:c.createFakeParserElement(a,\"cke_anchor\",\"anchor\"):null}}});var b=c._.elementsPath&&c._.elementsPath.filters;b&&b.push(function(a,b){if(\"a\"==b&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a)||a.getAttribute(\"name\")&&(!a.getAttribute(\"href\")||!a.getChildCount())))return\"anchor\"})}});var t=/^javascript:/,u=/^mailto:([^?]+)(?:\\?(.+))?$/,v=/subject=([^;?:@&=$,\\/]*)/i,w=/body=([^;?:@&=$,\\/]*)/i,x=/^#(.*)$/,y=/^((?:http|https|ftp|news):\\/\\/)?(.*)$/,z=/^(_(?:self|top|parent|blank))$/,\nA=/^javascript:void\\(location\\.href='mailto:'\\+String\\.fromCharCode\\(([^)]+)\\)(?:\\+'(.*)')?\\)$/,B=/^javascript:([^(]+)\\(([^)]+)\\)$/,C=/\\s*window.open\\(\\s*this\\.href\\s*,\\s*(?:'([^']*)'|null)\\s*,\\s*'([^']*)'\\s*\\)\\s*;\\s*return\\s*false;*\\s*/,D=/(?:^|,)([^=]+)=(\\d+|yes|no)/gi,m={id:\"advId\",dir:\"advLangDir\",accessKey:\"advAccessKey\",name:\"advName\",lang:\"advLangCode\",tabindex:\"advTabIndex\",title:\"advTitle\",type:\"advContentType\",\"class\":\"advCSSClasses\",charset:\"advCharset\",style:\"advStyles\",rel:\"advRel\"};\nCKEDITOR.plugins.link={getSelectedLink:function(c){var b=c.getSelection(),a=b.getSelectedElement();return a&&a.is(\"a\")?a:(b=b.getRanges()[0])?(b.shrink(CKEDITOR.SHRINK_TEXT),c.elementPath(b.getCommonAncestor()).contains(\"a\",1)):null},getEditorAnchors:function(c){for(var b=c.editable(),a=b.isInline()&&!c.plugins.divarea?c.document:b,b=a.getElementsByTag(\"a\"),a=a.getElementsByTag(\"img\"),f=[],e=0,d;d=b.getItem(e++);)(d.data(\"cke-saved-name\")||d.hasAttribute(\"name\"))&&f.push({name:d.data(\"cke-saved-name\")||\nd.getAttribute(\"name\"),id:d.getAttribute(\"id\")});for(e=0;d=a.getItem(e++);)(d=this.tryRestoreFakeAnchor(c,d))&&f.push({name:d.getAttribute(\"name\"),id:d.getAttribute(\"id\")});return f},fakeAnchor:!0,tryRestoreFakeAnchor:function(c,b){if(b&&b.data(\"cke-real-element-type\")&&\"anchor\"==b.data(\"cke-real-element-type\")){var a=c.restoreRealElement(b);if(a.data(\"cke-saved-name\"))return a}},parseLinkAttributes:function(c,b){var a=b&&(b.data(\"cke-saved-href\")||b.getAttribute(\"href\"))||\"\",f=c.plugins.link.compiledProtectionFunction,\ne=c.config.emailProtection,d,g={};a.match(t)&&(\"encode\"==e?a=a.replace(A,function(a,b,c){c=c||\"\";return\"mailto:\"+String.fromCharCode.apply(String,b.split(\",\"))+c.replace(/\\\\'/g,\"'\")}):e&&a.replace(B,function(a,b,c){if(b==f.name){g.type=\"email\";a=g.email={};b=/(^')|('$)/g;c=c.match(/[^,\\s]+/g);for(var d=c.length,e,h,k=0;k<d;k++)e=decodeURIComponent,h=c[k].replace(b,\"\").replace(/\\\\'/g,\"'\"),h=e(h),e=f.params[k].toLowerCase(),a[e]=h;a.address=[a.name,a.domain].join(\"@\")}}));if(!g.type)if(e=a.match(x))g.type=\n\"anchor\",g.anchor={},g.anchor.name=g.anchor.id=e[1];else if(e=a.match(u)){d=a.match(v);a=a.match(w);g.type=\"email\";var k=g.email={};k.address=e[1];d&&(k.subject=decodeURIComponent(d[1]));a&&(k.body=decodeURIComponent(a[1]))}else a&&(d=a.match(y))&&(g.type=\"url\",g.url={},g.url.protocol=d[1],g.url.url=d[2]);if(b){if(a=b.getAttribute(\"target\"))g.target={type:a.match(z)?a:\"frame\",name:a};else if(a=(a=b.data(\"cke-pa-onclick\")||b.getAttribute(\"onclick\"))&&a.match(C))for(g.target={type:\"popup\",name:a[1]};e=\nD.exec(a[2]);)\"yes\"!=e[2]&&\"1\"!=e[2]||e[1]in{height:1,width:1,top:1,left:1}?isFinite(e[2])&&(g.target[e[1]]=e[2]):g.target[e[1]]=!0;var a={},h;for(h in m)(e=b.getAttribute(h))&&(a[m[h]]=e);if(h=b.data(\"cke-saved-name\")||a.advName)a.advName=h;CKEDITOR.tools.isEmpty(a)||(g.advanced=a)}return g},getLinkAttributes:function(c,b){var a=c.config.emailProtection||\"\",f={};switch(b.type){case \"url\":var a=b.url&&void 0!==b.url.protocol?b.url.protocol:\"http://\",e=b.url&&CKEDITOR.tools.trim(b.url.url)||\"\";f[\"data-cke-saved-href\"]=\n0===e.indexOf(\"/\")?e:a+e;break;case \"anchor\":a=b.anchor&&b.anchor.id;f[\"data-cke-saved-href\"]=\"#\"+(b.anchor&&b.anchor.name||a||\"\");break;case \"email\":var d=b.email,e=d.address;switch(a){case \"\":case \"encode\":var g=encodeURIComponent(d.subject||\"\"),k=encodeURIComponent(d.body||\"\"),d=[];g&&d.push(\"subject\\x3d\"+g);k&&d.push(\"body\\x3d\"+k);d=d.length?\"?\"+d.join(\"\\x26\"):\"\";\"encode\"==a?(a=[\"javascript:void(location.href\\x3d'mailto:'+\",q(e)],d&&a.push(\"+'\",p(d),\"'\"),a.push(\")\")):a=[\"mailto:\",e,d];break;default:a=\ne.split(\"@\",2),d.name=a[0],d.domain=a[1],a=[\"javascript:\",r(c,d)]}f[\"data-cke-saved-href\"]=a.join(\"\")}if(b.target)if(\"popup\"==b.target.type){for(var a=[\"window.open(this.href, '\",b.target.name||\"\",\"', '\"],h=\"resizable status location toolbar menubar fullscreen scrollbars dependent\".split(\" \"),e=h.length,g=function(a){b.target[a]&&h.push(a+\"\\x3d\"+b.target[a])},d=0;d<e;d++)h[d]+=b.target[h[d]]?\"\\x3dyes\":\"\\x3dno\";g(\"width\");g(\"left\");g(\"height\");g(\"top\");a.push(h.join(\",\"),\"'); return false;\");f[\"data-cke-pa-onclick\"]=\na.join(\"\")}else\"notSet\"!=b.target.type&&b.target.name&&(f.target=b.target.name);if(b.advanced){for(var l in m)(a=b.advanced[m[l]])&&(f[l]=a);f.name&&(f[\"data-cke-saved-name\"]=f.name)}f[\"data-cke-saved-href\"]&&(f.href=f[\"data-cke-saved-href\"]);l={target:1,onclick:1,\"data-cke-pa-onclick\":1,\"data-cke-saved-name\":1};b.advanced&&CKEDITOR.tools.extend(l,m);for(var n in f)delete l[n];return{set:f,removed:CKEDITOR.tools.objectKeys(l)}}};CKEDITOR.unlinkCommand=function(){};CKEDITOR.unlinkCommand.prototype=\n{exec:function(c){var b=new CKEDITOR.style({element:\"a\",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});c.removeStyle(b)},refresh:function(c,b){var a=b.lastElement&&b.lastElement.getAscendant(\"a\",!0);a&&\"a\"==a.getName()&&a.getAttribute(\"href\")&&a.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1,requiredContent:\"a[href]\"};CKEDITOR.removeAnchorCommand=function(){};CKEDITOR.removeAnchorCommand.prototype={exec:function(c){var b=\nc.getSelection(),a=b.createBookmarks(),f;if(b&&(f=b.getSelectedElement())&&(f.getChildCount()?f.is(\"a\"):CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,f)))f.remove(1);else if(f=CKEDITOR.plugins.link.getSelectedLink(c))f.hasAttribute(\"href\")?(f.removeAttributes({name:1,\"data-cke-saved-name\":1}),f.removeClass(\"cke_anchor\")):f.remove(1);b.selectBookmarks(a)},requiredContent:\"a[name]\"};CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,linkShowTargetTab:!0})})();(function(){function I(b,m,e){function c(c){if(!(!(a=d[c?\"getFirst\":\"getLast\"]())||a.is&&a.isBlockBoundary()||!(p=m.root[c?\"getPrevious\":\"getNext\"](CKEDITOR.dom.walker.invisible(!0)))||p.is&&p.isBlockBoundary({br:1})))b.document.createElement(\"br\")[c?\"insertBefore\":\"insertAfter\"](a)}for(var f=CKEDITOR.plugins.list.listToArray(m.root,e),g=[],k=0;k<m.contents.length;k++){var h=m.contents[k];(h=h.getAscendant(\"li\",!0))&&!h.getCustomData(\"list_item_processed\")&&(g.push(h),CKEDITOR.dom.element.setMarker(e,\nh,\"list_item_processed\",!0))}h=null;for(k=0;k<g.length;k++)h=g[k].getCustomData(\"listarray_index\"),f[h].indent=-1;for(k=h+1;k<f.length;k++)if(f[k].indent>f[k-1].indent+1){g=f[k-1].indent+1-f[k].indent;for(h=f[k].indent;f[k]&&f[k].indent>=h;)f[k].indent+=g,k++;k--}var d=CKEDITOR.plugins.list.arrayToList(f,e,null,b.config.enterMode,m.root.getAttribute(\"dir\")).listNode,a,p;c(!0);c();d.replace(m.root);b.fire(\"contentDomInvalidated\")}function B(b,m){this.name=b;this.context=this.type=m;this.allowedContent=\nm+\" li\";this.requiredContent=m}function E(b,m,e,c){for(var f,g;f=b[c?\"getLast\":\"getFirst\"](J);)(g=f.getDirection(1))!==m.getDirection(1)&&f.setAttribute(\"dir\",g),f.remove(),e?f[c?\"insertBefore\":\"insertAfter\"](e):m.append(f,c)}function F(b){function m(e){var c=b[e?\"getPrevious\":\"getNext\"](u);c&&c.type==CKEDITOR.NODE_ELEMENT&&c.is(b.getName())&&(E(b,c,null,!e),b.remove(),b=c)}m();m(1)}function G(b){return b.type==CKEDITOR.NODE_ELEMENT&&(b.getName()in CKEDITOR.dtd.$block||b.getName()in CKEDITOR.dtd.$listItem)&&\nCKEDITOR.dtd[b.getName()][\"#\"]}function C(b,m,e){b.fire(\"saveSnapshot\");e.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var c=e.extractContents();m.trim(!1,!0);var f=m.createBookmark(),g=new CKEDITOR.dom.elementPath(m.startContainer),k=g.block,g=g.lastElement.getAscendant(\"li\",1)||k,h=new CKEDITOR.dom.elementPath(e.startContainer),d=h.contains(CKEDITOR.dtd.$listItem),h=h.contains(CKEDITOR.dtd.$list);k?(k=k.getBogus())&&k.remove():h&&(k=h.getPrevious(u))&&z(k)&&k.remove();(k=c.getLast())&&k.type==CKEDITOR.NODE_ELEMENT&&\nk.is(\"br\")&&k.remove();(k=m.startContainer.getChild(m.startOffset))?c.insertBefore(k):m.startContainer.append(c);d&&(c=A(d))&&(g.contains(d)?(E(c,d.getParent(),d),c.remove()):g.append(c));for(;e.checkStartOfBlock()&&e.checkEndOfBlock();){h=e.startPath();c=h.block;if(!c)break;c.is(\"li\")&&(g=c.getParent(),c.equals(g.getLast(u))&&c.equals(g.getFirst(u))&&(c=g));e.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove()}e=e.clone();c=b.editable();e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e);\ne.evaluator=function(a){return u(a)&&!z(a)};(e=e.next())&&e.type==CKEDITOR.NODE_ELEMENT&&e.getName()in CKEDITOR.dtd.$list&&F(e);m.moveToBookmark(f);m.select();b.fire(\"saveSnapshot\")}function A(b){return(b=b.getLast(u))&&b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in v?b:null}var v={ol:1,ul:1},K=CKEDITOR.dom.walker.whitespaces(),H=CKEDITOR.dom.walker.bookmark(),u=function(b){return!(K(b)||H(b))},z=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(b,m,e,c,f){if(!v[b.getName()])return[];\nc||(c=0);e||(e=[]);for(var g=0,k=b.getChildCount();g<k;g++){var h=b.getChild(g);h.type==CKEDITOR.NODE_ELEMENT&&h.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(h,m,e,c+1);if(\"li\"==h.$.nodeName.toLowerCase()){var d={parent:b,indent:c,element:h,contents:[]};f?d.grandparent=f:(d.grandparent=b.getParent(),d.grandparent&&\"li\"==d.grandparent.$.nodeName.toLowerCase()&&(d.grandparent=d.grandparent.getParent()));m&&CKEDITOR.dom.element.setMarker(m,h,\"listarray_index\",e.length);e.push(d);\nfor(var a=0,p=h.getChildCount(),l;a<p;a++)l=h.getChild(a),l.type==CKEDITOR.NODE_ELEMENT&&v[l.getName()]?CKEDITOR.plugins.list.listToArray(l,m,e,c+1,d.grandparent):d.contents.push(l)}}return e},arrayToList:function(b,m,e,c,f){e||(e=0);if(!b||b.length<e+1)return null;for(var g,k=b[e].parent.getDocument(),h=new CKEDITOR.dom.documentFragment(k),d=null,a=e,p=Math.max(b[e].indent,0),l=null,q,n,t=c==CKEDITOR.ENTER_P?\"p\":\"div\";;){var r=b[a];g=r.grandparent;q=r.element.getDirection(1);if(r.indent==p){d&&b[a].parent.getName()==\nd.getName()||(d=b[a].parent.clone(!1,1),f&&d.setAttribute(\"dir\",f),h.append(d));l=d.append(r.element.clone(0,1));q!=d.getDirection(1)&&l.setAttribute(\"dir\",q);for(g=0;g<r.contents.length;g++)l.append(r.contents[g].clone(1,1));a++}else if(r.indent==Math.max(p,0)+1)r=b[a-1].element.getDirection(1),a=CKEDITOR.plugins.list.arrayToList(b,null,a,c,r!=q?q:null),!l.getChildCount()&&CKEDITOR.env.needsNbspFiller&&7>=k.$.documentMode&&l.append(k.createText(\" \")),l.append(a.listNode),a=a.nextIndex;else if(-1==\nr.indent&&!e&&g){v[g.getName()]?(l=r.element.clone(!1,!0),q!=g.getDirection(1)&&l.setAttribute(\"dir\",q)):l=new CKEDITOR.dom.documentFragment(k);var d=g.getDirection(1)!=q,y=r.element,D=y.getAttribute(\"class\"),z=y.getAttribute(\"style\"),A=l.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(c!=CKEDITOR.ENTER_BR||d||z||D),w,B=r.contents.length,x;for(g=0;g<B;g++)if(w=r.contents[g],H(w)&&1<B)A?x=w.clone(1,1):l.append(w.clone(1,1));else if(w.type==CKEDITOR.NODE_ELEMENT&&w.isBlockBoundary()){d&&!w.getDirection()&&\nw.setAttribute(\"dir\",q);n=w;var C=y.getAttribute(\"style\");C&&n.setAttribute(\"style\",C.replace(/([^;])$/,\"$1;\")+(n.getAttribute(\"style\")||\"\"));D&&w.addClass(D);n=null;x&&(l.append(x),x=null);l.append(w.clone(1,1))}else A?(n||(n=k.createElement(t),l.append(n),d&&n.setAttribute(\"dir\",q)),z&&n.setAttribute(\"style\",z),D&&n.setAttribute(\"class\",D),x&&(n.append(x),x=null),n.append(w.clone(1,1))):l.append(w.clone(1,1));x&&((n||l).append(x),x=null);l.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&a!=b.length-1&&(CKEDITOR.env.needsBrFiller&&\n(q=l.getLast())&&q.type==CKEDITOR.NODE_ELEMENT&&q.is(\"br\")&&q.remove(),(q=l.getLast(u))&&q.type==CKEDITOR.NODE_ELEMENT&&q.is(CKEDITOR.dtd.$block)||l.append(k.createElement(\"br\")));q=l.$.nodeName.toLowerCase();\"div\"!=q&&\"p\"!=q||l.appendBogus();h.append(l);d=null;a++}else return null;n=null;if(b.length<=a||Math.max(b[a].indent,0)<p)break}if(m)for(b=h.getFirst();b;){if(b.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(m,b),b.getName()in CKEDITOR.dtd.$listItem&&(e=b,k=f=c=void 0,c=e.getDirection()))){for(f=\ne.getParent();f&&!(k=f.getDirection());)f=f.getParent();c==k&&e.removeAttribute(\"dir\")}b=b.getNextSourceNode()}return{listNode:h,nextIndex:a}}};var L=/^h[1-6]$/,J=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);B.prototype={exec:function(b){this.refresh(b,b.elementPath());var m=b.config,e=b.getSelection(),c=e&&e.getRanges();if(this.state==CKEDITOR.TRISTATE_OFF){var f=b.editable();if(f.getFirst(u)){var g=1==c.length&&c[0];(m=g&&g.getEnclosedNode())&&m.is&&this.type==m.getName()&&this.setState(CKEDITOR.TRISTATE_ON)}else m.enterMode==\nCKEDITOR.ENTER_BR?f.appendBogus():c[0].fixBlock(1,m.enterMode==CKEDITOR.ENTER_P?\"p\":\"div\"),e.selectRanges(c)}for(var m=e.createBookmarks(!0),f=[],k={},c=c.createIterator(),h=0;(g=c.getNextRange())&&++h;){var d=g.getBoundaryNodes(),a=d.startNode,p=d.endNode;a.type==CKEDITOR.NODE_ELEMENT&&\"td\"==a.getName()&&g.setStartAt(d.startNode,CKEDITOR.POSITION_AFTER_START);p.type==CKEDITOR.NODE_ELEMENT&&\"td\"==p.getName()&&g.setEndAt(d.endNode,CKEDITOR.POSITION_BEFORE_END);g=g.createIterator();for(g.forceBrBreak=\nthis.state==CKEDITOR.TRISTATE_OFF;d=g.getNextParagraph();)if(!d.getCustomData(\"list_block\")){CKEDITOR.dom.element.setMarker(k,d,\"list_block\",1);for(var l=b.elementPath(d),a=l.elements,p=0,l=l.blockLimit,q,n=a.length-1;0<=n&&(q=a[n]);n--)if(v[q.getName()]&&l.contains(q)){l.removeCustomData(\"list_group_object_\"+h);(a=q.getCustomData(\"list_group_object\"))?a.contents.push(d):(a={root:q,contents:[d]},f.push(a),CKEDITOR.dom.element.setMarker(k,q,\"list_group_object\",a));p=1;break}p||(p=l,p.getCustomData(\"list_group_object_\"+\nh)?p.getCustomData(\"list_group_object_\"+h).contents.push(d):(a={root:p,contents:[d]},CKEDITOR.dom.element.setMarker(k,p,\"list_group_object_\"+h,a),f.push(a)))}}for(q=[];0<f.length;)if(a=f.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(v[a.root.getName()]){c=b;h=a;a=k;g=q;p=CKEDITOR.plugins.list.listToArray(h.root,a);l=[];for(d=0;d<h.contents.length;d++)n=h.contents[d],(n=n.getAscendant(\"li\",!0))&&!n.getCustomData(\"list_item_processed\")&&(l.push(n),CKEDITOR.dom.element.setMarker(a,n,\"list_item_processed\",\n!0));for(var n=h.root.getDocument(),t=void 0,r=void 0,d=0;d<l.length;d++){var y=l[d].getCustomData(\"listarray_index\"),t=p[y].parent;t.is(this.type)||(r=n.createElement(this.type),t.copyAttributes(r,{start:1,type:1}),r.removeStyle(\"list-style-type\"),p[y].parent=r)}a=CKEDITOR.plugins.list.arrayToList(p,a,null,c.config.enterMode);p=void 0;l=a.listNode.getChildCount();for(d=0;d<l&&(p=a.listNode.getChild(d));d++)p.getName()==this.type&&g.push(p);a.listNode.replace(h.root);c.fire(\"contentDomInvalidated\")}else{p=\nb;g=a;d=q;l=g.contents;c=g.root.getDocument();h=[];1==l.length&&l[0].equals(g.root)&&(a=c.createElement(\"div\"),l[0].moveChildren&&l[0].moveChildren(a),l[0].append(a),l[0]=a);g=g.contents[0].getParent();for(n=0;n<l.length;n++)g=g.getCommonAncestor(l[n].getParent());t=p.config.useComputedState;p=a=void 0;t=void 0===t||t;for(n=0;n<l.length;n++)for(r=l[n];y=r.getParent();){if(y.equals(g)){h.push(r);!p&&r.getDirection()&&(p=1);r=r.getDirection(t);null!==a&&(a=a&&a!=r?null:r);break}r=y}if(!(1>h.length)){l=\nh[h.length-1].getNext();n=c.createElement(this.type);d.push(n);for(t=d=void 0;h.length;)d=h.shift(),t=c.createElement(\"li\"),r=d,r.is(\"pre\")||L.test(r.getName())||\"false\"==r.getAttribute(\"contenteditable\")?d.appendTo(t):(d.copyAttributes(t),a&&d.getDirection()&&(t.removeStyle(\"direction\"),t.removeAttribute(\"dir\")),d.moveChildren(t),d.remove()),t.appendTo(n);a&&p&&n.setAttribute(\"dir\",a);l?n.insertBefore(l):n.appendTo(g)}}else this.state==CKEDITOR.TRISTATE_ON&&v[a.root.getName()]&&I.call(this,b,a,k);\nfor(n=0;n<q.length;n++)F(q[n]);CKEDITOR.dom.element.clearAllMarkers(k);e.selectBookmarks(m);b.focus()},refresh:function(b,m){var e=m.contains(v,1),c=m.blockLimit||m.root;e&&c.contains(e)?this.setState(e.is(this.type)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add(\"list\",{requires:\"indentlist\",init:function(b){b.blockless||(b.addCommand(\"numberedlist\",new B(\"numberedlist\",\"ol\")),b.addCommand(\"bulletedlist\",new B(\"bulletedlist\",\"ul\")),b.ui.addButton&&\n(b.ui.addButton(\"NumberedList\",{label:b.lang.list.numberedlist,command:\"numberedlist\",directional:!0,toolbar:\"list,10\"}),b.ui.addButton(\"BulletedList\",{label:b.lang.list.bulletedlist,command:\"bulletedlist\",directional:!0,toolbar:\"list,20\"})),b.on(\"key\",function(m){var e=m.data.domEvent.getKey(),c;if(\"wysiwyg\"==b.mode&&e in{8:1,46:1}){var f=b.getSelection().getRanges()[0],g=f&&f.startPath();if(f&&f.collapsed){var k=8==e,h=b.editable(),d=new CKEDITOR.dom.walker(f.clone());d.evaluator=function(a){return u(a)&&\n!z(a)};d.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(\"table\"))};e=f.clone();if(k){var a;(a=g.contains(v))&&f.checkBoundaryOfElement(a,CKEDITOR.START)&&(a=a.getParent())&&a.is(\"li\")&&(a=A(a))?(c=a,a=a.getPrevious(u),e.moveToPosition(a&&z(a)?a:c,CKEDITOR.POSITION_BEFORE_START)):(d.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START),d.range.setEnd(f.startContainer,f.startOffset),(a=d.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in v||a.is(\"li\"))&&(a.is(\"li\")||(d.range.selectNodeContents(a),\nd.reset(),d.evaluator=G,a=d.previous()),c=a,e.moveToElementEditEnd(c),e.moveToPosition(e.endPath().block,CKEDITOR.POSITION_BEFORE_END)));if(c)C(b,e,f),m.cancel();else{var p=g.contains(v);p&&f.checkBoundaryOfElement(p,CKEDITOR.START)&&(c=p.getFirst(u),f.checkBoundaryOfElement(c,CKEDITOR.START)&&(a=p.getPrevious(u),A(c)?a&&(f.moveToElementEditEnd(a),f.select()):b.execCommand(\"outdent\"),m.cancel()))}}else if(c=g.contains(\"li\")){if(d.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END),k=(h=c.getLast(u))&&\nG(h)?h:c,g=0,(a=d.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in v&&a.equals(h)?(g=1,a=d.next()):f.checkBoundaryOfElement(k,CKEDITOR.END)&&(g=2),g&&a){f=f.clone();f.moveToElementEditStart(a);if(1==g&&(e.optimize(),!e.startContainer.equals(c))){for(c=e.startContainer;c.is(CKEDITOR.dtd.$inline);)p=c,c=c.getParent();p&&e.moveToPosition(p,CKEDITOR.POSITION_AFTER_END)}2==g&&(e.moveToPosition(e.endPath().block,CKEDITOR.POSITION_BEFORE_END),f.endPath().block&&f.moveToPosition(f.endPath().block,CKEDITOR.POSITION_AFTER_START));\nC(b,e,f);m.cancel()}}else d.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END),(a=d.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(v)&&(a=a.getFirst(u),g.block&&f.checkStartOfBlock()&&f.checkEndOfBlock()?(g.block.remove(),f.moveToElementEditStart(a),f.select()):A(a)?(f.moveToElementEditStart(a),f.select()):(f=f.clone(),f.moveToElementEditStart(a),C(b,e,f)),m.cancel());setTimeout(function(){b.selectionChange(1)})}}}))}})})();(function(){CKEDITOR.plugins.liststyle={requires:\"dialog,contextmenu\",init:function(a){if(!a.blockless){var b;b=new CKEDITOR.dialogCommand(\"numberedListStyle\",{requiredContent:\"ol\",allowedContent:\"ol{list-style-type}[start]\"});b=a.addCommand(\"numberedListStyle\",b);a.addFeature(b);CKEDITOR.dialog.add(\"numberedListStyle\",this.path+\"dialogs/liststyle.js\");b=new CKEDITOR.dialogCommand(\"bulletedListStyle\",{requiredContent:\"ul\",allowedContent:\"ul{list-style-type}\"});b=a.addCommand(\"bulletedListStyle\",b);\na.addFeature(b);CKEDITOR.dialog.add(\"bulletedListStyle\",this.path+\"dialogs/liststyle.js\");a.addMenuGroup(\"list\",108);a.addMenuItems({numberedlist:{label:a.lang.liststyle.numberedTitle,group:\"list\",command:\"numberedListStyle\"},bulletedlist:{label:a.lang.liststyle.bulletedTitle,group:\"list\",command:\"bulletedListStyle\"}});a.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;for(;a;){var b=a.getName();if(\"ol\"==b)return{numberedlist:CKEDITOR.TRISTATE_OFF};if(\"ul\"==b)return{bulletedlist:CKEDITOR.TRISTATE_OFF};\na=a.getParent()}return null})}}};CKEDITOR.plugins.add(\"liststyle\",CKEDITOR.plugins.liststyle)})();(function(){function V(a,c,d){return n(c)&&n(d)&&d.equals(c.getNext(function(a){return!(E(a)||F(a)||u(a))}))}function z(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slice(2))}function O(a){var c=a.element;if(c&&n(c)&&(c=c.getAscendant(a.triggers,!0))&&a.editable.contains(c)){var d=P(c);if(\"true\"==d.getAttribute(\"contenteditable\"))return c;if(d.is(a.triggers))return d}return null}function ka(a,c,d){r(a,c);r(a,d);a=c.size.bottom;d=d.size.top;return a&&d?0|(a+d)/2:a||d}function w(a,c,d){return c=\nc[d?\"getPrevious\":\"getNext\"](function(b){return b&&b.type==CKEDITOR.NODE_TEXT&&!E(b)||n(b)&&!u(b)&&!A(a,b)})}function q(a,c,d){return a>c&&a<d}function P(a,c){if(a.data(\"cke-editable\"))return null;for(c||(a=a.getParent());a&&!a.data(\"cke-editable\");){if(a.hasAttribute(\"contenteditable\"))return a;a=a.getParent()}return null}function la(a){var c=a.doc,d=G('\\x3cspan contenteditable\\x3d\"false\" style\\x3d\"'+Q+\"position:absolute;border-top:1px dashed \"+a.boxColor+'\"\\x3e\\x3c/span\\x3e',c),b=CKEDITOR.getUrl(this.path+\n\"images/\"+(t.hidpi?\"hidpi/\":\"\")+\"icon\"+(a.rtl?\"-rtl\":\"\")+\".png\");v(d,{attach:function(){this.wrap.getParent()||this.wrap.appendTo(a.editable,!0);return this},lineChildren:[v(G('\\x3cspan title\\x3d\"'+a.editor.lang.magicline.title+'\" contenteditable\\x3d\"false\"\\x3e\\x26#8629;\\x3c/span\\x3e',c),{base:Q+\"height:17px;width:17px;\"+(a.rtl?\"left\":\"right\")+\":17px;background:url(\"+b+\") center no-repeat \"+a.boxColor+\";cursor:pointer;\"+(t.hc?\"font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;\":\n\"\")+(t.hidpi?\"background-size: 9px 10px;\":\"\"),looks:[\"top:-8px; border-radius: 2px;\",\"top:-17px; border-radius: 2px 2px 0px 0px;\",\"top:-1px; border-radius: 0px 0px 2px 2px;\"]}),v(G(W,c),{base:X+\"left:0px;border-left-color:\"+a.boxColor+\";\",looks:[\"border-width:8px 0 8px 8px;top:-8px\",\"border-width:8px 0 0 8px;top:-8px\",\"border-width:0 0 8px 8px;top:0px\"]}),v(G(W,c),{base:X+\"right:0px;border-right-color:\"+a.boxColor+\";\",looks:[\"border-width:8px 8px 8px 0;top:-8px\",\"border-width:8px 8px 0 0;top:-8px\",\n\"border-width:0 8px 8px 0;top:0px\"]})],detach:function(){this.wrap.getParent()&&this.wrap.remove();return this},mouseNear:function(){r(a,this);var b=a.holdDistance,c=this.size;return c&&q(a.mouse.y,c.top-b,c.bottom+b)&&q(a.mouse.x,c.left-b,c.right+b)?!0:!1},place:function(){var b=a.view,c=a.editable,d=a.trigger,h=d.upper,g=d.lower,l=h||g,p=l.getParent(),m={};this.trigger=d;h&&r(a,h,!0);g&&r(a,g,!0);r(a,p,!0);a.inInlineMode&&H(a,!0);p.equals(c)?(m.left=b.scroll.x,m.right=-b.scroll.x,m.width=\"\"):(m.left=\nl.size.left-l.size.margin.left+b.scroll.x-(a.inInlineMode?b.editable.left+b.editable.border.left:0),m.width=l.size.outerWidth+l.size.margin.left+l.size.margin.right+b.scroll.x,m.right=\"\");h&&g?m.top=h.size.margin.bottom===g.size.margin.top?0|h.size.bottom+h.size.margin.bottom/2:h.size.margin.bottom<g.size.margin.top?h.size.bottom+h.size.margin.bottom:h.size.bottom+h.size.margin.bottom-g.size.margin.top:h?g||(m.top=h.size.bottom+h.size.margin.bottom):m.top=g.size.top-g.size.margin.top;d.is(C)||q(m.top,\nb.scroll.y-15,b.scroll.y+5)?(m.top=a.inInlineMode?0:b.scroll.y,this.look(C)):d.is(D)||q(m.top,b.pane.bottom-5,b.pane.bottom+15)?(m.top=a.inInlineMode?b.editable.height+b.editable.padding.top+b.editable.padding.bottom:b.pane.bottom-1,this.look(D)):(a.inInlineMode&&(m.top-=b.editable.top+b.editable.border.top),this.look(x));a.inInlineMode&&(m.top--,m.top+=b.editable.scroll.top,m.left+=b.editable.scroll.left);for(var n in m)m[n]=CKEDITOR.tools.cssLength(m[n]);this.setStyles(m)},look:function(a){if(this.oldLook!=\na){for(var b=this.lineChildren.length,c;b--;)(c=this.lineChildren[b]).setAttribute(\"style\",c.base+c.looks[0|a/2]);this.oldLook=a}},wrap:new R(\"span\",a.doc)});for(c=d.lineChildren.length;c--;)d.lineChildren[c].appendTo(d);d.look(x);d.appendTo(d.wrap);d.unselectable();d.lineChildren[0].on(\"mouseup\",function(b){d.detach();S(a,function(b){var c=a.line.trigger;b[c.is(I)?\"insertBefore\":\"insertAfter\"](c.is(I)?c.lower:c.upper)},!0);a.editor.focus();t.ie||a.enterMode==CKEDITOR.ENTER_BR||a.hotNode.scrollIntoView();\nb.data.preventDefault(!0)});d.on(\"mousedown\",function(a){a.data.preventDefault(!0)});a.line=d}function S(a,c,d){var b=new CKEDITOR.dom.range(a.doc),e=a.editor,f;t.ie&&a.enterMode==CKEDITOR.ENTER_BR?f=a.doc.createText(J):(f=(f=P(a.element,!0))&&f.data(\"cke-enter-mode\")||a.enterMode,f=new R(K[f],a.doc),f.is(\"br\")||a.doc.createText(J).appendTo(f));d&&e.fire(\"saveSnapshot\");c(f);b.moveToPosition(f,CKEDITOR.POSITION_AFTER_START);e.getSelection().selectRanges([b]);a.hotNode=f;d&&e.fire(\"saveSnapshot\")}\nfunction Y(a,c){return{canUndo:!0,modes:{wysiwyg:1},exec:function(){function d(b){var d=t.ie&&9>t.version?\" \":J,f=a.hotNode&&a.hotNode.getText()==d&&a.element.equals(a.hotNode)&&a.lastCmdDirection===!!c;S(a,function(d){f&&a.hotNode&&a.hotNode.remove();d[c?\"insertAfter\":\"insertBefore\"](b);d.setAttributes({\"data-cke-magicline-hot\":1,\"data-cke-magicline-dir\":!!c});a.lastCmdDirection=!!c});t.ie||a.enterMode==CKEDITOR.ENTER_BR||a.hotNode.scrollIntoView();a.line.detach()}return function(b){b=b.getSelection().getStartElement();\nvar e;b=b.getAscendant(Z,1);if(!aa(a,b)&&b&&!b.equals(a.editable)&&!b.contains(a.editable)){(e=P(b))&&\"false\"==e.getAttribute(\"contenteditable\")&&(b=e);a.element=b;e=w(a,b,!c);var f;n(e)&&e.is(a.triggers)&&e.is(ma)&&(!w(a,e,!c)||(f=w(a,e,!c))&&n(f)&&f.is(a.triggers))?d(e):(f=O(a,b),n(f)&&(w(a,f,!c)?(b=w(a,f,!c))&&n(b)&&b.is(a.triggers)&&d(f):d(f)))}}}()}}function A(a,c){if(!c||c.type!=CKEDITOR.NODE_ELEMENT||!c.$)return!1;var d=a.line;return d.wrap.equals(c)||d.wrap.contains(c)}function n(a){return a&&\na.type==CKEDITOR.NODE_ELEMENT&&a.$}function u(a){if(!n(a))return!1;var c;(c=ba(a))||(n(a)?(c={left:1,right:1,center:1},c=!(!c[a.getComputedStyle(\"float\")]&&!c[a.getAttribute(\"align\")])):c=!1);return c}function ba(a){return!!{absolute:1,fixed:1}[a.getComputedStyle(\"position\")]}function L(a,c){return n(c)?c.is(a.triggers):null}function aa(a,c){if(!c)return!1;for(var d=c.getParents(1),b=d.length;b--;)for(var e=a.tabuList.length;e--;)if(d[b].hasAttribute(a.tabuList[e]))return!0;return!1}function na(a,\nc,d){c=c[d?\"getLast\":\"getFirst\"](function(b){return a.isRelevant(b)&&!b.is(oa)});if(!c)return!1;r(a,c);return d?c.size.top>a.mouse.y:c.size.bottom<a.mouse.y}function ca(a){var c=a.editable,d=a.mouse,b=a.view,e=a.triggerOffset;H(a);var f=d.y>(a.inInlineMode?b.editable.top+b.editable.height/2:Math.min(b.editable.height,b.pane.height)/2),c=c[f?\"getLast\":\"getFirst\"](function(a){return!(E(a)||F(a))});if(!c)return null;A(a,c)&&(c=a.line.wrap[f?\"getPrevious\":\"getNext\"](function(a){return!(E(a)||F(a))}));\nif(!n(c)||u(c)||!L(a,c))return null;r(a,c);return!f&&0<=c.size.top&&q(d.y,0,c.size.top+e)?(a=a.inInlineMode||0===b.scroll.y?C:x,new z([null,c,I,M,a])):f&&c.size.bottom<=b.pane.height&&q(d.y,c.size.bottom-e,b.pane.height)?(a=a.inInlineMode||q(c.size.bottom,b.pane.height-e,b.pane.height)?D:x,new z([c,null,da,M,a])):null}function ea(a){var c=a.mouse,d=a.view,b=a.triggerOffset,e=O(a);if(!e)return null;r(a,e);var b=Math.min(b,0|e.size.outerHeight/2),f=[],k,h;if(q(c.y,e.size.top-1,e.size.top+b))h=!1;else if(q(c.y,\ne.size.bottom-b,e.size.bottom+1))h=!0;else return null;if(u(e)||na(a,e,h)||e.getParent().is(fa))return null;var g=w(a,e,!h);if(g){if(g&&g.type==CKEDITOR.NODE_TEXT)return null;if(n(g)){if(u(g)||!L(a,g)||g.getParent().is(fa))return null;f=[g,e][h?\"reverse\":\"concat\"]().concat([T,M])}}else e.equals(a.editable[h?\"getLast\":\"getFirst\"](a.isRelevant))?(H(a),h&&q(c.y,e.size.bottom-b,d.pane.height)&&q(e.size.bottom,d.pane.height-b,d.pane.height)?k=D:q(c.y,0,e.size.top+b)&&(k=C)):k=x,f=[null,e][h?\"reverse\":\n\"concat\"]().concat([h?da:I,M,k,e.equals(a.editable[h?\"getLast\":\"getFirst\"](a.isRelevant))?h?D:C:x]);return 0 in f?new z(f):null}function U(a,c,d,b){for(var e=c.getDocumentPosition(),f={},k={},h={},g={},l=y.length;l--;)f[y[l]]=parseInt(c.getComputedStyle.call(c,\"border-\"+y[l]+\"-width\"),10)||0,h[y[l]]=parseInt(c.getComputedStyle.call(c,\"padding-\"+y[l]),10)||0,k[y[l]]=parseInt(c.getComputedStyle.call(c,\"margin-\"+y[l]),10)||0;d&&!b||N(a,b);g.top=e.y-(d?0:a.view.scroll.y);g.left=e.x-(d?0:a.view.scroll.x);\ng.outerWidth=c.$.offsetWidth;g.outerHeight=c.$.offsetHeight;g.height=g.outerHeight-(h.top+h.bottom+f.top+f.bottom);g.width=g.outerWidth-(h.left+h.right+f.left+f.right);g.bottom=g.top+g.outerHeight;g.right=g.left+g.outerWidth;a.inInlineMode&&(g.scroll={top:c.$.scrollTop,left:c.$.scrollLeft});return v({border:f,padding:h,margin:k,ignoreScroll:d},g,!0)}function r(a,c,d){if(!n(c))return c.size=null;if(!c.size)c.size={};else if(c.size.ignoreScroll==d&&c.size.date>new Date-ga)return null;return v(c.size,\nU(a,c,d),{date:+new Date},!0)}function H(a,c){a.view.editable=U(a,a.editable,c,!0)}function N(a,c){a.view||(a.view={});var d=a.view;if(!(!c&&d&&d.date>new Date-ga)){var b=a.win,d=b.getScrollPosition(),b=b.getViewPaneSize();v(a.view,{scroll:{x:d.x,y:d.y,width:a.doc.$.documentElement.scrollWidth-b.width,height:a.doc.$.documentElement.scrollHeight-b.height},pane:{width:b.width,height:b.height,bottom:b.height+d.y},date:+new Date},!0)}}function pa(a,c,d,b){for(var e=b,f=b,k=0,h=!1,g=!1,l=a.view.pane.height,\np=a.mouse;p.y+k<l&&0<p.y-k;){h||(h=c(e,b));g||(g=c(f,b));!h&&0<p.y-k&&(e=d(a,{x:p.x,y:p.y-k}));!g&&p.y+k<l&&(f=d(a,{x:p.x,y:p.y+k}));if(h&&g)break;k+=2}return new z([e,f,null,null])}CKEDITOR.plugins.add(\"magicline\",{init:function(a){var c=a.config,d=c.magicline_triggerOffset||30,b={editor:a,enterMode:c.enterMode,triggerOffset:d,holdDistance:0|d*(c.magicline_holdDistance||.5),boxColor:c.magicline_color||\"#ff0000\",rtl:\"rtl\"==c.contentsLangDirection,tabuList:[\"data-cke-hidden-sel\"].concat(c.magicline_tabuList||\n[]),triggers:c.magicline_everywhere?Z:{table:1,hr:1,div:1,ul:1,ol:1,dl:1,form:1,blockquote:1}},e,f,k;b.isRelevant=function(a){return n(a)&&!A(b,a)&&!u(a)};a.on(\"contentDom\",function(){var d=a.editable(),g=a.document,l=a.window;v(b,{editable:d,inInlineMode:d.isInline(),doc:g,win:l,hotNode:null},!0);b.boundary=b.inInlineMode?b.editable:b.doc.getDocumentElement();d.is(B.$inline)||(b.inInlineMode&&!ba(d)&&d.setStyles({position:\"relative\",top:null,left:null}),la.call(this,b),N(b),d.attachListener(a,\"beforeUndoImage\",\nfunction(){b.line.detach()}),d.attachListener(a,\"beforeGetData\",function(){b.line.wrap.getParent()&&(b.line.detach(),a.once(\"getData\",function(){b.line.attach()},null,null,1E3))},null,null,0),d.attachListener(b.inInlineMode?g:g.getWindow().getFrame(),\"mouseout\",function(c){if(\"wysiwyg\"==a.mode)if(b.inInlineMode){var d=c.data.$.clientX;c=c.data.$.clientY;N(b);H(b,!0);var e=b.view.editable,f=b.view.scroll;d>e.left-f.x&&d<e.right-f.x&&c>e.top-f.y&&c<e.bottom-f.y||(clearTimeout(k),k=null,b.line.detach())}else clearTimeout(k),\nk=null,b.line.detach()}),d.attachListener(d,\"keyup\",function(){b.hiddenMode=0}),d.attachListener(d,\"keydown\",function(c){if(\"wysiwyg\"==a.mode)switch(c.data.getKeystroke()){case 2228240:case 16:b.hiddenMode=1,b.line.detach()}}),d.attachListener(b.inInlineMode?d:g,\"mousemove\",function(c){f=!0;if(\"wysiwyg\"==a.mode&&!a.readOnly&&!k){var d={x:c.data.$.clientX,y:c.data.$.clientY};k=setTimeout(function(){b.mouse=d;k=b.trigger=null;N(b);f&&!b.hiddenMode&&a.focusManager.hasFocus&&!b.line.mouseNear()&&(b.element=\nha(b,!0))&&((b.trigger=ca(b)||ea(b)||ia(b))&&!aa(b,b.trigger.upper||b.trigger.lower)?b.line.attach().place():(b.trigger=null,b.line.detach()),f=!1)},30)}}),d.attachListener(l,\"scroll\",function(){\"wysiwyg\"==a.mode&&(b.line.detach(),t.webkit&&(b.hiddenMode=1,clearTimeout(e),e=setTimeout(function(){b.mouseDown||(b.hiddenMode=0)},50)))}),d.attachListener(ja?g:l,\"mousedown\",function(){\"wysiwyg\"==a.mode&&(b.line.detach(),b.hiddenMode=1,b.mouseDown=1)}),d.attachListener(ja?g:l,\"mouseup\",function(){b.hiddenMode=\n0;b.mouseDown=0}),a.addCommand(\"accessPreviousSpace\",Y(b)),a.addCommand(\"accessNextSpace\",Y(b,!0)),a.setKeystroke([[c.magicline_keystrokePrevious,\"accessPreviousSpace\"],[c.magicline_keystrokeNext,\"accessNextSpace\"]]),a.on(\"loadSnapshot\",function(){var c,d,e,f;for(f in{p:1,br:1,div:1})for(c=a.document.getElementsByTag(f),e=c.count();e--;)if((d=c.getItem(e)).data(\"cke-magicline-hot\")){b.hotNode=d;b.lastCmdDirection=\"true\"===d.data(\"cke-magicline-dir\")?!0:!1;return}}),this.backdoor={accessFocusSpace:S,\nboxTrigger:z,isLine:A,getAscendantTrigger:O,getNonEmptyNeighbour:w,getSize:U,that:b,triggerEdge:ea,triggerEditable:ca,triggerExpand:ia})},this)}});var v=CKEDITOR.tools.extend,R=CKEDITOR.dom.element,G=R.createFromHtml,t=CKEDITOR.env,ja=CKEDITOR.env.ie&&9>CKEDITOR.env.version,B=CKEDITOR.dtd,K={},I=128,da=64,T=32,M=16,C=4,D=2,x=1,J=\" \",fa=B.$listItem,oa=B.$tableContent,ma=v({},B.$nonEditable,B.$empty),Z=B.$block,ga=100,Q=\"width:0px;height:0px;padding:0px;margin:0px;display:block;z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;\",\nX=Q+\"border-color:transparent;display:block;border-style:solid;\",W=\"\\x3cspan\\x3e\"+J+\"\\x3c/span\\x3e\";K[CKEDITOR.ENTER_BR]=\"br\";K[CKEDITOR.ENTER_P]=\"p\";K[CKEDITOR.ENTER_DIV]=\"div\";z.prototype={set:function(a,c,d){this.properties=a+c+(d||x);return this},is:function(a){return(this.properties&a)==a}};var ha=function(){function a(a,d){var b=a.$.elementFromPoint(d.x,d.y);return b&&b.nodeType?new CKEDITOR.dom.element(b):null}return function(c,d,b){if(!c.mouse)return null;var e=c.doc,f=c.line.wrap;b=b||c.mouse;\nvar k=a(e,b);d&&A(c,k)&&(f.hide(),k=a(e,b),f.show());return!k||k.type!=CKEDITOR.NODE_ELEMENT||!k.$||t.ie&&9>t.version&&!c.boundary.equals(k)&&!c.boundary.contains(k)?null:k}}(),E=CKEDITOR.dom.walker.whitespaces(),F=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_COMMENT),ia=function(){function a(a){var b=a.element,e,f,k;if(!n(b)||b.contains(a.editable)||b.isReadOnly())return null;k=pa(a,function(a,b){return!b.equals(a)},function(a,b){return ha(a,!0,b)},b);e=k.upper;f=k.lower;if(V(a,e,f))return k.set(T,\n8);if(e&&b.contains(e))for(;!e.getParent().equals(b);)e=e.getParent();else e=b.getFirst(function(b){return c(a,b)});if(f&&b.contains(f))for(;!f.getParent().equals(b);)f=f.getParent();else f=b.getLast(function(b){return c(a,b)});if(!e||!f)return null;r(a,e);r(a,f);if(!q(a.mouse.y,e.size.top,f.size.bottom))return null;for(var b=Number.MAX_VALUE,h,g,l,p;f&&!f.equals(e)&&(g=e.getNext(a.isRelevant));)h=Math.abs(ka(a,e,g)-a.mouse.y),h<b&&(b=h,l=e,p=g),e=g,r(a,e);if(!l||!p||!q(a.mouse.y,l.size.top,p.size.bottom))return null;\nk.upper=l;k.lower=p;return k.set(T,8)}function c(a,b){return!(b&&b.type==CKEDITOR.NODE_TEXT||F(b)||u(b)||A(a,b)||b.type==CKEDITOR.NODE_ELEMENT&&b.$&&b.is(\"br\"))}return function(c){var b=a(c),e;if(e=b){e=b.upper;var f=b.lower;e=!e||!f||u(f)||u(e)||f.equals(e)||e.equals(f)||f.contains(e)||e.contains(f)?!1:L(c,e)&&L(c,f)&&V(c,e,f)?!0:!1}return e?b:null}}(),y=[\"top\",\"left\",\"right\",\"bottom\"]})();CKEDITOR.config.magicline_keystrokePrevious=CKEDITOR.CTRL+CKEDITOR.SHIFT+51;\nCKEDITOR.config.magicline_keystrokeNext=CKEDITOR.CTRL+CKEDITOR.SHIFT+52;(function(){function n(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||\"form\"!=a.getName())return[];for(var e=[],f=[\"style\",\"className\"],b=0;b<f.length;b++){var c=a.$.elements.namedItem(f[b]);c&&(c=new CKEDITOR.dom.element(c),e.push([c,c.nextSibling]),c.remove())}return e}function t(a,e){if(a&&a.type==CKEDITOR.NODE_ELEMENT&&\"form\"==a.getName()&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],c=e[f][1];c?b.insertBefore(c):b.appendTo(a)}}function r(a,e){var f=n(a),b={},c=a.$;e||(b[\"class\"]=c.className||\n\"\",c.className=\"\");b.inline=c.style.cssText||\"\";e||(c.style.cssText=\"position: static; overflow: visible\");t(f);return b}function u(a,e){var f=n(a),b=a.$;\"class\"in e&&(b.className=e[\"class\"]);\"inline\"in e&&(b.style.cssText=e.inline);t(f)}function v(a){if(!a.editable().isInline()){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];\"wysiwyg\"!=b.mode||b.readOnly||(b=b.document.getBody(),b.setAttribute(\"contentEditable\",!1),b.setAttribute(\"contentEditable\",!0))}a.editable().hasFocus&&(a.toolbox.focus(),\na.focus())}}CKEDITOR.plugins.add(\"maximize\",{init:function(a){function e(){var b=c.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,c=b.getWindow(),l,m,p,n=CKEDITOR.TRISTATE_OFF;a.addCommand(\"maximize\",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getFirst(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasClass(\"cke_inner\")}),g=a.ui.space(\"contents\");\nif(\"wysiwyg\"==a.mode){var d=a.getSelection();l=d&&d.getRanges();m=c.getScrollPosition()}else{var k=a.editable().$;l=!CKEDITOR.env.ie&&[k.selectionStart,k.selectionEnd];m=[k.scrollLeft,k.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){c.on(\"resize\",e);p=c.getScrollPosition();for(d=a.container;d=d.getParent();)d.setCustomData(\"maximize_saved_styles\",r(d)),d.setStyle(\"z-index\",a.config.baseFloatZIndex-5);g.setCustomData(\"maximize_saved_styles\",r(g,!0));h.setCustomData(\"maximize_saved_styles\",r(h,!0));\ng={overflow:CKEDITOR.env.webkit?\"\":\"hidden\",width:0,height:0};b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&b.getDocumentElement().setStyle(\"position\",\"fixed\");CKEDITOR.env.gecko&&CKEDITOR.env.quirks||b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){c.$.scrollTo(0,0)},0):c.$.scrollTo(0,0);h.setStyle(\"position\",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?\"fixed\":\"absolute\");h.$.offsetLeft;h.setStyles({\"z-index\":a.config.baseFloatZIndex-5,left:\"0px\",top:\"0px\"});h.addClass(\"cke_maximized\");\ne();g=h.getDocumentPosition();h.setStyles({left:-1*g.x+\"px\",top:-1*g.y+\"px\"});CKEDITOR.env.gecko&&v(a)}else if(this.state==CKEDITOR.TRISTATE_ON){c.removeListener(\"resize\",e);for(var d=[g,h],q=0;q<d.length;q++)u(d[q],d[q].getCustomData(\"maximize_saved_styles\")),d[q].removeCustomData(\"maximize_saved_styles\");for(d=a.container;d=d.getParent();)u(d,d.getCustomData(\"maximize_saved_styles\")),d.removeCustomData(\"maximize_saved_styles\");CKEDITOR.env.ie?setTimeout(function(){c.$.scrollTo(p.x,p.y)},0):c.$.scrollTo(p.x,\np.y);h.removeClass(\"cke_maximized\");CKEDITOR.env.webkit&&(h.setStyle(\"display\",\"inline\"),setTimeout(function(){h.setStyle(\"display\",\"block\")},0));a.fire(\"resize\",{outerHeight:a.container.$.offsetHeight,contentsHeight:g.$.offsetHeight,outerWidth:a.container.$.offsetWidth})}this.toggleState();if(d=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,d=CKEDITOR.document.getById(d._.id),d.getChild(1).setHtml(g),d.setAttribute(\"title\",g),d.setAttribute(\"href\",'javascript:void(\"'+\ng+'\");');\"wysiwyg\"==a.mode?l?(CKEDITOR.env.gecko&&v(a),a.getSelection().selectRanges(l),(k=a.getSelection().getStartElement())&&k.scrollIntoView(!0)):c.$.scrollTo(m.x,m.y):(l&&(k.selectionStart=l[0],k.selectionEnd=l[1]),k.scrollLeft=m[0],k.scrollTop=m[1]);l=m=null;n=this.state;a.fire(\"maximize\",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton(\"Maximize\",{label:f.maximize.maximize,command:\"maximize\",toolbar:\"tools,10\"});a.on(\"mode\",function(){var b=a.getCommand(\"maximize\");b.setState(b.state==\nCKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:n)},null,null,100)}}})})();CKEDITOR.plugins.add(\"newpage\",{init:function(a){a.addCommand(\"newpage\",{modes:{wysiwyg:1,source:1},exec:function(b){var a=this;b.setData(b.config.newpage_html||\"\",function(){b.focus();setTimeout(function(){b.fire(\"afterCommandExec\",{name:\"newpage\",command:a});b.selectionChange()},200)})},async:!0});a.ui.addButton&&a.ui.addButton(\"NewPage\",{label:a.lang.newpage.toolbar,command:\"newpage\",toolbar:\"document,20\"})}});(function(){function e(a){return{\"aria-label\":a,\"class\":\"cke_pagebreak\",contenteditable:\"false\",\"data-cke-display-name\":\"pagebreak\",\"data-cke-pagebreak\":1,style:\"page-break-after: always\",title:a}}CKEDITOR.plugins.add(\"pagebreak\",{requires:\"fakeobjects\",onLoad:function(){var a=(\"background:url(\"+CKEDITOR.getUrl(this.path+\"images/pagebreak.gif\")+\") no-repeat center center;clear:both;width:100%;border-top:#999 1px dotted;border-bottom:#999 1px dotted;padding:0;height:7px;cursor:default;\").replace(/;/g,\n\" !important;\");CKEDITOR.addCss(\"div.cke_pagebreak{\"+a+\"}\")},init:function(a){a.blockless||(a.addCommand(\"pagebreak\",CKEDITOR.plugins.pagebreakCmd),a.ui.addButton&&a.ui.addButton(\"PageBreak\",{label:a.lang.pagebreak.toolbar,command:\"pagebreak\",toolbar:\"insert,70\"}),CKEDITOR.env.webkit&&a.on(\"contentDom\",function(){a.document.on(\"click\",function(b){b=b.data.getTarget();b.is(\"div\")&&b.hasClass(\"cke_pagebreak\")&&a.getSelection().selectElement(b)})}))},afterInit:function(a){function b(f){CKEDITOR.tools.extend(f.attributes,\ne(a.lang.pagebreak.alt),!0);f.children.length=0}var c=a.dataProcessor,g=c&&c.dataFilter,c=c&&c.htmlFilter,h=/page-break-after\\s*:\\s*always/i,k=/display\\s*:\\s*none/i;c&&c.addRules({attributes:{\"class\":function(a,b){var c=a.replace(\"cke_pagebreak\",\"\");if(c!=a){var d=CKEDITOR.htmlParser.fragment.fromHtml('\\x3cspan style\\x3d\"display: none;\"\\x3e\\x26nbsp;\\x3c/span\\x3e').children[0];b.children.length=0;b.add(d);d=b.attributes;delete d[\"aria-label\"];delete d.contenteditable;delete d.title}return c}}},{applyToAll:!0,\npriority:5});g&&g.addRules({elements:{div:function(a){if(a.attributes[\"data-cke-pagebreak\"])b(a);else if(h.test(a.attributes.style)){var c=a.children[0];c&&\"span\"==c.name&&k.test(c.attributes.style)&&b(a)}}}})}});CKEDITOR.plugins.pagebreakCmd={exec:function(a){var b=a.document.createElement(\"div\",{attributes:e(a.lang.pagebreak.alt)});a.insertElement(b)},context:\"div\",allowedContent:{div:{styles:\"!page-break-after\"},span:{match:function(a){return(a=a.parent)&&\"div\"==a.name&&a.styles&&a.styles[\"page-break-after\"]},\nstyles:\"display\"}},requiredContent:\"div{page-break-after}\"}})();(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire(\"paste\",{type:\"text\",dataValue:b.dataValue,method:\"paste\",dataTransfer:CKEDITOR.plugins.clipboard.initPasteDataTransfer()});a.fire(\"afterCommandExec\",{name:\"pastetext\",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add(\"pastetext\",{requires:\"clipboard\",init:function(a){a.addCommand(\"pastetext\",c);a.ui.addButton&&a.ui.addButton(\"PasteText\",{label:a.lang.pastetext.button,\ncommand:\"pastetext\",toolbar:\"clipboard,40\"});if(a.config.forcePasteAsPlainText)a.on(\"beforePaste\",function(a){\"html\"!=a.data.type&&(a.data.type=\"text\")});a.on(\"pasteState\",function(b){a.getCommand(\"pastetext\").setState(b.data)})}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+\"filter/default.js\"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function k(a){a.data.type=\"html\"}CKEDITOR.plugins.add(\"pastefromword\",{requires:\"clipboard\",init:function(a){var d=0,f=this.path;a.addCommand(\"pastefromword\",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once(\"beforePaste\",k);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire(\"paste\",\n{type:\"html\",dataValue:c.dataValue,method:\"paste\",dataTransfer:CKEDITOR.plugins.clipboard.initPasteDataTransfer()});a.fire(\"afterCommandExec\",{name:\"pastefromword\",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton(\"PasteFromWord\",{label:a.lang.pastefromword.toolbar,command:\"pastefromword\",toolbar:\"clipboard,50\"});a.on(\"pasteState\",function(b){a.getCommand(\"pastefromword\").setState(b.data)});a.on(\"paste\",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\\\"?Mso|style=\\\"[^\\\"]*\\bmso\\-|w:WordDocument)/.test(c))){e.dontFilter=\n!0;var g=h(a,f,function(){if(g)a.fire(\"paste\",e);else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a);d=0});g&&b.cancel()}},null,null,3)}})})();(function(){var h,k={modes:{wysiwyg:1,source:1},canUndo:!1,readOnly:1,exec:function(a){var g,b=a.config,f=b.baseHref?'\\x3cbase href\\x3d\"'+b.baseHref+'\"/\\x3e':\"\";if(b.fullPage)g=a.getData().replace(/<head>/,\"$\\x26\"+f).replace(/[^>]*(?=<\\/title>)/,\"$\\x26 \\x26mdash; \"+a.lang.preview.preview);else{var b=\"\\x3cbody \",d=a.document&&a.document.getBody();d&&(d.getAttribute(\"id\")&&(b+='id\\x3d\"'+d.getAttribute(\"id\")+'\" '),d.getAttribute(\"class\")&&(b+='class\\x3d\"'+d.getAttribute(\"class\")+'\" '));b+=\"\\x3e\";g=a.config.docType+\n'\\x3chtml dir\\x3d\"'+a.config.contentsLangDirection+'\"\\x3e\\x3chead\\x3e'+f+\"\\x3ctitle\\x3e\"+a.lang.preview.preview+\"\\x3c/title\\x3e\"+CKEDITOR.tools.buildStyleHtml(a.config.contentsCss)+\"\\x3c/head\\x3e\"+b+a.getData()+\"\\x3c/body\\x3e\\x3c/html\\x3e\"}f=640;b=420;d=80;try{var c=window.screen,f=Math.round(.8*c.width),b=Math.round(.7*c.height),d=Math.round(.1*c.width)}catch(k){}if(!1===a.fire(\"contentPreview\",a={dataValue:g}))return!1;var c=\"\",e;CKEDITOR.env.ie&&(window._cke_htmlToLoad=a.dataValue,e=\"javascript:void( (function(){document.open();\"+\n(\"(\"+CKEDITOR.tools.fixDomain+\")();\").replace(/\\/\\/.*?\\n/g,\"\").replace(/parent\\./g,\"window.opener.\")+\"document.write( window.opener._cke_htmlToLoad );document.close();window.opener._cke_htmlToLoad \\x3d null;})() )\",c=\"\");CKEDITOR.env.gecko&&(window._cke_htmlToLoad=a.dataValue,c=CKEDITOR.getUrl(h+\"preview.html\"));c=window.open(c,null,\"toolbar\\x3dyes,location\\x3dno,status\\x3dyes,menubar\\x3dyes,scrollbars\\x3dyes,resizable\\x3dyes,width\\x3d\"+f+\",height\\x3d\"+b+\",left\\x3d\"+d);CKEDITOR.env.ie&&c&&(c.location=\ne);CKEDITOR.env.ie||CKEDITOR.env.gecko||(e=c.document,e.open(),e.write(a.dataValue),e.close());return!0}};CKEDITOR.plugins.add(\"preview\",{init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(h=this.path,a.addCommand(\"preview\",k),a.ui.addButton&&a.ui.addButton(\"Preview\",{label:a.lang.preview.preview,command:\"preview\",toolbar:\"document,40\"}))}})})();CKEDITOR.plugins.add(\"print\",{init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(a.addCommand(\"print\",CKEDITOR.plugins.print),a.ui.addButton&&a.ui.addButton(\"Print\",{label:a.lang.print.toolbar,command:\"print\",toolbar:\"document,50\"}))}});CKEDITOR.plugins.print={exec:function(a){CKEDITOR.env.gecko?a.window.$.print():a.document.$.execCommand(\"Print\")},canUndo:!1,readOnly:1,modes:{wysiwyg:1}};CKEDITOR.plugins.add(\"removeformat\",{init:function(a){a.addCommand(\"removeFormat\",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton(\"RemoveFormat\",{label:a.lang.removeformat.toolbar,command:\"removeFormat\",toolbar:\"cleanup,10\"})}});\nCKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=new RegExp(\"^(?:\"+a.config.removeFormatTags.replace(/,/g,\"|\")+\")$\",\"i\")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(\",\")),f=CKEDITOR.plugins.removeformat.filter,m=a.getSelection().getRanges(),n=m.createIterator(),p=function(a){return a.type==CKEDITOR.NODE_ELEMENT},c;c=n.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);\nvar l=c.createBookmark(),b=l.startNode,d=l.endNode,k=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};k(b);if(d)for(k(d),b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(d);)if(b.isReadOnly()){if(b.getPosition(d)&CKEDITOR.POSITION_CONTAINS)break;b=b.getNext(p)}else k=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),\"img\"==b.getName()&&b.data(\"cke-realelement\")||!f(a,b)||(h.test(b.getName())?\nb.remove(1):(b.removeAttributes(e),a.fire(\"removeFormatCleanup\",b))),b=k;c.moveToBookmark(l)}a.forceNextSelectionCheck();a.getSelection().selectRanges(m)}}},filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags=\"b,big,cite,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var\";\nCKEDITOR.config.removeFormatAttributes=\"class,style,lang,width,height,align,hspace,valign\";(function(){var b={readOnly:1,exec:function(a){if(a.fire(\"save\")&&(a=a.element.$.form))try{a.submit()}catch(b){a.submit.click&&a.submit.click()}}};CKEDITOR.plugins.add(\"save\",{init:function(a){a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a.addCommand(\"save\",b).modes={wysiwyg:!!a.element.$.form},a.ui.addButton&&a.ui.addButton(\"Save\",{label:a.lang.save.toolbar,command:\"save\",toolbar:\"document,10\"}))}})})();(function(){CKEDITOR.plugins.add(\"selectall\",{init:function(b){b.addCommand(\"selectAll\",{modes:{wysiwyg:1,source:1},exec:function(a){var b=a.editable();if(b.is(\"textarea\"))a=b.$,CKEDITOR.env.ie?a.createTextRange().execCommand(\"SelectAll\"):(a.selectionStart=0,a.selectionEnd=a.value.length),a.focus();else{if(b.is(\"body\"))a.document.$.execCommand(\"SelectAll\",!1,null);else{var c=a.createRange();c.selectNodeContents(b);c.select()}a.forceNextSelectionCheck();a.selectionChange()}},canUndo:!1});b.ui.addButton&&\nb.ui.addButton(\"SelectAll\",{label:b.lang.selectall.toolbar,command:\"selectAll\",toolbar:\"selection,10\"})}})})();(function(){var k={readOnly:1,preserveState:!0,editorFocus:!1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var c=this.state!=CKEDITOR.TRISTATE_ON||a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&!a.focusManager.hasFocus?\"removeClass\":\"attachClass\";a.editable()[c](\"cke_show_blocks\")}}};CKEDITOR.plugins.add(\"showblocks\",{onLoad:function(){var a=\"p div pre address blockquote h1 h2 h3 h4 h5 h6\".split(\" \"),c,b,e,f,k=CKEDITOR.getUrl(this.path),l=!(CKEDITOR.env.ie&&\n9>CKEDITOR.env.version),g=l?\":not([contenteditable\\x3dfalse]):not(.cke_show_blocks_off)\":\"\",d,h;for(c=b=e=f=\"\";d=a.pop();)h=a.length?\",\":\"\",c+=\".cke_show_blocks \"+d+g+h,e+=\".cke_show_blocks.cke_contents_ltr \"+d+g+h,f+=\".cke_show_blocks.cke_contents_rtl \"+d+g+h,b+=\".cke_show_blocks \"+d+g+\"{background-image:url(\"+CKEDITOR.getUrl(k+\"images/block_\"+d+\".png\")+\")}\";CKEDITOR.addCss((c+\"{background-repeat:no-repeat;border:1px dotted gray;padding-top:8px}\").concat(b,e+\"{background-position:top left;padding-left:8px}\",\nf+\"{background-position:top right;padding-right:8px}\"));l||CKEDITOR.addCss(\".cke_show_blocks [contenteditable\\x3dfalse],.cke_show_blocks .cke_show_blocks_off{border:none;padding-top:0;background-image:none}.cke_show_blocks.cke_contents_rtl [contenteditable\\x3dfalse],.cke_show_blocks.cke_contents_rtl .cke_show_blocks_off{padding-right:0}.cke_show_blocks.cke_contents_ltr [contenteditable\\x3dfalse],.cke_show_blocks.cke_contents_ltr .cke_show_blocks_off{padding-left:0}\")},init:function(a){function c(){b.refresh(a)}\nif(!a.blockless){var b=a.addCommand(\"showblocks\",k);b.canUndo=!1;a.config.startupOutlineBlocks&&b.setState(CKEDITOR.TRISTATE_ON);a.ui.addButton&&a.ui.addButton(\"ShowBlocks\",{label:a.lang.showblocks.toolbar,command:\"showblocks\",toolbar:\"tools,20\"});a.on(\"mode\",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&(a.on(\"focus\",c),a.on(\"blur\",c));a.on(\"contentDom\",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)})}}})})();(function(){var f={preserveState:!0,editorFocus:!1,readOnly:1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var b=this.state==CKEDITOR.TRISTATE_ON?\"attachClass\":\"removeClass\";a.editable()[b](\"cke_show_borders\")}}};CKEDITOR.plugins.add(\"showborders\",{modes:{wysiwyg:1},onLoad:function(){var a;a=(CKEDITOR.env.ie6Compat?[\".%1 table.%2,\",\".%1 table.%2 td, .%1 table.%2 th\",\"{\",\"border : #d3d3d3 1px dotted\",\"}\"]:\".%1 table.%2,;.%1 table.%2 \\x3e tr \\x3e td, .%1 table.%2 \\x3e tr \\x3e th,;.%1 table.%2 \\x3e tbody \\x3e tr \\x3e td, .%1 table.%2 \\x3e tbody \\x3e tr \\x3e th,;.%1 table.%2 \\x3e thead \\x3e tr \\x3e td, .%1 table.%2 \\x3e thead \\x3e tr \\x3e th,;.%1 table.%2 \\x3e tfoot \\x3e tr \\x3e td, .%1 table.%2 \\x3e tfoot \\x3e tr \\x3e th;{;border : #d3d3d3 1px dotted;}\".split(\";\")).join(\"\").replace(/%2/g,\n\"cke_show_border\").replace(/%1/g,\"cke_show_borders \");CKEDITOR.addCss(a)},init:function(a){var b=a.addCommand(\"showborders\",f);b.canUndo=!1;!1!==a.config.startupShowBorders&&b.setState(CKEDITOR.TRISTATE_ON);a.on(\"mode\",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)},null,null,100);a.on(\"contentDom\",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});a.on(\"removeFormatCleanup\",function(d){d=d.data;a.getCommand(\"showborders\").state==CKEDITOR.TRISTATE_ON&&d.is(\"table\")&&(!d.hasAttribute(\"border\")||\n0>=parseInt(d.getAttribute(\"border\"),10))&&d.addClass(\"cke_show_border\")})},afterInit:function(a){var b=a.dataProcessor;a=b&&b.dataFilter;b=b&&b.htmlFilter;a&&a.addRules({elements:{table:function(a){a=a.attributes;var b=a[\"class\"],c=parseInt(a.border,10);c&&!(0>=c)||b&&-1!=b.indexOf(\"cke_show_border\")||(a[\"class\"]=(b||\"\")+\" cke_show_border\")}}});b&&b.addRules({elements:{table:function(a){a=a.attributes;var b=a[\"class\"];b&&(a[\"class\"]=b.replace(\"cke_show_border\",\"\").replace(/\\s{2}/,\" \").replace(/^\\s+|\\s+$/,\n\"\"))}}})}});CKEDITOR.on(\"dialogDefinition\",function(a){var b=a.data.name;if(\"table\"==b||\"tableProperties\"==b)if(a=a.data.definition,b=a.getContents(\"info\").get(\"txtBorder\"),b.commit=CKEDITOR.tools.override(b.commit,function(a){return function(b,c){a.apply(this,arguments);var e=parseInt(this.getValue(),10);c[!e||0>=e?\"addClass\":\"removeClass\"](\"cke_show_border\")}}),a=(a=a.getContents(\"advanced\"))&&a.get(\"advCSSClasses\"))a.setup=CKEDITOR.tools.override(a.setup,function(a){return function(){a.apply(this,\narguments);this.setValue(this.getValue().replace(/cke_show_border/,\"\"))}}),a.commit=CKEDITOR.tools.override(a.commit,function(a){return function(b,c){a.apply(this,arguments);parseInt(c.getAttribute(\"border\"),10)||c.addClass(\"cke_show_border\")}})})})();(function(){CKEDITOR.plugins.add(\"sourcearea\",{init:function(a){function d(){var a=e&&this.equals(CKEDITOR.document.getActive());this.hide();this.setStyle(\"height\",this.getParent().$.clientHeight+\"px\");this.setStyle(\"width\",this.getParent().$.clientWidth+\"px\");this.show();a&&this.focus()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=CKEDITOR.plugins.sourcearea;a.addMode(\"source\",function(e){var b=a.ui.space(\"contents\").getDocument().createElement(\"textarea\");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?\n\"99%\":\"100%\",height:\"100%\",resize:\"none\",outline:\"none\",\"text-align\":\"left\"},CKEDITOR.tools.cssVendorPrefix(\"tab-size\",a.config.sourceAreaTabSize||4)));b.setAttribute(\"dir\",\"ltr\");b.addClass(\"cke_source\").addClass(\"cke_reset\").addClass(\"cke_enable_context_menu\");a.ui.space(\"contents\").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,\"resize\",d,b),b.attachListener(CKEDITOR.document.getWindow(),\"resize\",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire(\"ariaWidget\",\nthis);e()});a.addCommand(\"source\",f.commands.source);a.ui.addButton&&a.ui.addButton(\"Source\",{label:a.lang.sourcearea.toolbar,command:\"source\",toolbar:\"mode,10\"});a.on(\"mode\",function(){a.getCommand(\"source\").setState(\"source\"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)});var e=CKEDITOR.env.ie&&9==CKEDITOR.env.version}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.status=\"ready\";this.editor.fire(\"dataReady\")},getData:function(){return this.getValue()},\ninsertHtml:function(){},insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?\"set\":\"remove\")+\"Attribute\"](\"readOnly\",\"readonly\")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();\nCKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){\"wysiwyg\"==c.mode&&c.fire(\"saveSnapshot\");c.getCommand(\"source\").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode(\"source\"==c.mode?\"wysiwyg\":\"source\")},canUndo:!1}}};CKEDITOR.plugins.add(\"specialchar\",{availableLangs:{af:1,ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,\"de-ch\":1,el:1,en:1,\"en-gb\":1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fr:1,\"fr-ca\":1,gl:1,he:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ko:1,ku:1,lt:1,lv:1,nb:1,nl:1,no:1,pl:1,pt:1,\"pt-br\":1,ru:1,si:1,sk:1,sl:1,sq:1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,zh:1,\"zh-cn\":1},requires:\"dialog\",init:function(a){var c=this;CKEDITOR.dialog.add(\"specialchar\",this.path+\"dialogs/specialchar.js\");a.addCommand(\"specialchar\",{exec:function(){var b=\na.langCode,b=c.availableLangs[b]?b:c.availableLangs[b.replace(/-.*/,\"\")]?b.replace(/-.*/,\"\"):\"en\";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+\"dialogs/lang/\"+b+\".js\"),function(){CKEDITOR.tools.extend(a.lang.specialchar,c.langEntries[b]);a.openDialog(\"specialchar\")})},modes:{wysiwyg:1},canUndo:!1});a.ui.addButton&&a.ui.addButton(\"SpecialChar\",{label:a.lang.specialchar.toolbar,command:\"specialchar\",toolbar:\"insert,50\"})}});CKEDITOR.config.specialChars=\"! \\x26quot; # $ % \\x26amp; ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; \\x26lt; \\x3d \\x26gt; ? @ 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 { | } ~ \\x26euro; \\x26lsquo; \\x26rsquo; \\x26ldquo; \\x26rdquo; \\x26ndash; \\x26mdash; \\x26iexcl; \\x26cent; \\x26pound; \\x26curren; \\x26yen; \\x26brvbar; \\x26sect; \\x26uml; \\x26copy; \\x26ordf; \\x26laquo; \\x26not; \\x26reg; \\x26macr; \\x26deg; \\x26sup2; \\x26sup3; \\x26acute; \\x26micro; \\x26para; \\x26middot; \\x26cedil; \\x26sup1; \\x26ordm; \\x26raquo; \\x26frac14; \\x26frac12; \\x26frac34; \\x26iquest; \\x26Agrave; \\x26Aacute; \\x26Acirc; \\x26Atilde; \\x26Auml; \\x26Aring; \\x26AElig; \\x26Ccedil; \\x26Egrave; \\x26Eacute; \\x26Ecirc; \\x26Euml; \\x26Igrave; \\x26Iacute; \\x26Icirc; \\x26Iuml; \\x26ETH; \\x26Ntilde; \\x26Ograve; \\x26Oacute; \\x26Ocirc; \\x26Otilde; \\x26Ouml; \\x26times; \\x26Oslash; \\x26Ugrave; \\x26Uacute; \\x26Ucirc; \\x26Uuml; \\x26Yacute; \\x26THORN; \\x26szlig; \\x26agrave; \\x26aacute; \\x26acirc; \\x26atilde; \\x26auml; \\x26aring; \\x26aelig; \\x26ccedil; \\x26egrave; \\x26eacute; \\x26ecirc; \\x26euml; \\x26igrave; \\x26iacute; \\x26icirc; \\x26iuml; \\x26eth; \\x26ntilde; \\x26ograve; \\x26oacute; \\x26ocirc; \\x26otilde; \\x26ouml; \\x26divide; \\x26oslash; \\x26ugrave; \\x26uacute; \\x26ucirc; \\x26uuml; \\x26yacute; \\x26thorn; \\x26yuml; \\x26OElig; \\x26oelig; \\x26#372; \\x26#374 \\x26#373 \\x26#375; \\x26sbquo; \\x26#8219; \\x26bdquo; \\x26hellip; \\x26trade; \\x26#9658; \\x26bull; \\x26rarr; \\x26rArr; \\x26hArr; \\x26diams; \\x26asymp;\".split(\" \");CKEDITOR.plugins.add(\"scayt\",{requires:\"menubutton,dialog\",tabToOpen:null,dialogName:\"scaytDialog\",init:function(a){var c=this,d=CKEDITOR.plugins.scayt;this.bindEvents(a);this.parseConfig(a);this.addRule(a);CKEDITOR.dialog.add(this.dialogName,CKEDITOR.getUrl(this.path+\"dialogs/options.js\"));this.addMenuItems(a);var b=a.lang.scayt,e=CKEDITOR.env;a.ui.add(\"Scayt\",CKEDITOR.UI_MENUBUTTON,{label:b.text_title,title:a.plugins.wsc?a.lang.wsc.title:b.text_title,modes:{wysiwyg:!(e.ie&&(8>e.version||e.quirks))},\ntoolbar:\"spellchecker,20\",refresh:function(){var b=a.ui.instances.Scayt.getState();a.scayt&&(b=d.state.scayt[a.name]?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF);a.fire(\"scaytButtonState\",b)},onRender:function(){var b=this;a.on(\"scaytButtonState\",function(a){void 0!==typeof a.data&&b.setState(a.data)})},onMenu:function(){var b=a.scayt;a.getMenuItem(\"scaytToggle\").label=a.lang.scayt[b&&d.state.scayt[a.name]?\"btn_disable\":\"btn_enable\"];b={scaytToggle:CKEDITOR.TRISTATE_OFF,scaytOptions:b?CKEDITOR.TRISTATE_OFF:\nCKEDITOR.TRISTATE_DISABLED,scaytLangs:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytDict:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytAbout:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,WSC:a.plugins.wsc?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED};a.config.scayt_uiTabs[0]||delete b.scaytOptions;a.config.scayt_uiTabs[1]||delete b.scaytLangs;a.config.scayt_uiTabs[2]||delete b.scaytDict;return b}});a.contextMenu&&a.addMenuItems&&(a.contextMenu.addListener(function(b,d){var e=\na.scayt,k,l;e&&(l=e.getSelectionNode())&&(k=c.menuGenerator(a,l),e.showBanner(\".\"+a.contextMenu._.definition.panel.className.split(\" \").join(\" .\")));return k}),a.contextMenu._.onHide=CKEDITOR.tools.override(a.contextMenu._.onHide,function(b){return function(){var d=a.scayt;d&&d.hideBanner();return b.apply(this)}}))},addMenuItems:function(a){var c=this,d=CKEDITOR.plugins.scayt;a.addMenuGroup(\"scaytButton\");for(var b=a.config.scayt_contextMenuItemsOrder.split(\"|\"),e=0;e<b.length;e++)b[e]=\"scayt_\"+b[e];\nif((b=[\"grayt_description\",\"grayt_suggest\",\"grayt_control\"].concat(b))&&b.length)for(e=0;e<b.length;e++)a.addMenuGroup(b[e],e-10);a.addCommand(\"scaytToggle\",{exec:function(a){var b=a.scayt;d.state.scayt[a.name]=!d.state.scayt[a.name];!0===d.state.scayt[a.name]?b||d.createScayt(a):b&&d.destroy(a)}});a.addCommand(\"scaytAbout\",{exec:function(a){a.scayt.tabToOpen=\"about\";a.lockSelection();a.openDialog(c.dialogName)}});a.addCommand(\"scaytOptions\",{exec:function(a){a.scayt.tabToOpen=\"options\";a.lockSelection();\na.openDialog(c.dialogName)}});a.addCommand(\"scaytLangs\",{exec:function(a){a.scayt.tabToOpen=\"langs\";a.lockSelection();a.openDialog(c.dialogName)}});a.addCommand(\"scaytDict\",{exec:function(a){a.scayt.tabToOpen=\"dictionaries\";a.lockSelection();a.openDialog(c.dialogName)}});b={scaytToggle:{label:a.lang.scayt.btn_enable,group:\"scaytButton\",command:\"scaytToggle\"},scaytAbout:{label:a.lang.scayt.btn_about,group:\"scaytButton\",command:\"scaytAbout\"},scaytOptions:{label:a.lang.scayt.btn_options,group:\"scaytButton\",\ncommand:\"scaytOptions\"},scaytLangs:{label:a.lang.scayt.btn_langs,group:\"scaytButton\",command:\"scaytLangs\"},scaytDict:{label:a.lang.scayt.btn_dictionaries,group:\"scaytButton\",command:\"scaytDict\"}};a.plugins.wsc&&(b.WSC={label:a.lang.wsc.toolbar,group:\"scaytButton\",onClick:function(){var b=CKEDITOR.plugins.scayt,d=a.scayt,c=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.container.getText():a.document.getBody().getText();(c=c.replace(/\\s/g,\"\"))?(d&&b.state.scayt[a.name]&&d.setMarkupPaused&&d.setMarkupPaused(!0),\na.lockSelection(),a.execCommand(\"checkspell\")):alert(\"Nothing to check!\")}});a.addMenuItems(b)},bindEvents:function(a){var c=CKEDITOR.plugins.scayt,d=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE,b=function(){c.destroy(a)},e=function(){!c.state.scayt[a.name]||a.readOnly||a.scayt||c.createScayt(a)},f=function(){var b=a.editable();b.attachListener(b,\"focus\",function(b){CKEDITOR.plugins.scayt&&!a.scayt&&setTimeout(e,0);b=CKEDITOR.plugins.scayt&&CKEDITOR.plugins.scayt.state.scayt[a.name]&&a.scayt;var c,\nh;if((d||b)&&a._.savedSelection){b=a._.savedSelection.getSelectedElement();b=!b&&a._.savedSelection.getRanges();for(var f=0;f<b.length;f++)h=b[f],\"string\"===typeof h.startContainer.$.nodeValue&&(c=h.startContainer.getText().length,(c<h.startOffset||c<h.endOffset)&&a.unlockSelection(!1))}},this,null,-10)},g=function(){d?a.config.scayt_inlineModeImmediateMarkup?e():(a.on(\"blur\",function(){setTimeout(b,0)}),a.on(\"focus\",e),a.focusManager.hasFocus&&e()):e();f();var c=a.editable();c.attachListener(c,\"mousedown\",\nfunction(b){b=b.data.getTarget();var d=a.widgets&&a.widgets.getByElement(b);d&&(d.wrapper=b.getAscendant(function(a){return a.hasAttribute(\"data-cke-widget-wrapper\")},!0))},this,null,-10)};a.on(\"contentDom\",g);a.on(\"beforeCommandExec\",function(b){var d=a.scayt,e=null,f=!1,g=!0;b.data.name in c.options.disablingCommandExec&&\"wysiwyg\"==a.mode?d&&(c.destroy(a),a.fire(\"scaytButtonState\",CKEDITOR.TRISTATE_DISABLED)):\"bold\"!==b.data.name&&\"italic\"!==b.data.name&&\"underline\"!==b.data.name&&\"strike\"!==b.data.name&&\n\"subscript\"!==b.data.name&&\"superscript\"!==b.data.name&&\"enter\"!==b.data.name&&\"cut\"!==b.data.name&&\"language\"!==b.data.name||!d||(\"cut\"===b.data.name&&(g=!1,f=!0),\"language\"===b.data.name&&(e=(e=a.plugins.language.getCurrentLangElement(a))&&e.$,f=!0),a.fire(\"reloadMarkupScayt\",{removeOptions:{removeInside:g,forceBookmark:f,selectionNode:e},timeout:0}))});a.on(\"beforeSetMode\",function(b){if(\"source\"==b.data){if(b=a.scayt)c.destroy(a),a.fire(\"scaytButtonState\",CKEDITOR.TRISTATE_DISABLED);a.document&&\na.document.getBody().removeAttribute(\"_jquid\")}});a.on(\"afterCommandExec\",function(b){\"wysiwyg\"!=a.mode||\"undo\"!=b.data.name&&\"redo\"!=b.data.name||setTimeout(function(){var b=a.scayt,d=b&&b.getScaytLangList();d&&d.ltr&&d.rtl&&b.fire(\"startSpellCheck, startGrammarCheck\")},250)});a.on(\"readOnly\",function(b){var d;b&&(d=a.scayt,!0===b.editor.readOnly?d&&d.fire(\"removeMarkupInDocument\",{}):d?d.fire(\"startSpellCheck, startGrammarCheck\"):\"wysiwyg\"==b.editor.mode&&!0===c.state.scayt[b.editor.name]&&(c.createScayt(a),\nb.editor.fire(\"scaytButtonState\",CKEDITOR.TRISTATE_ON)))});a.on(\"beforeDestroy\",b);a.on(\"setData\",function(){b();(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE||a.plugins.divarea)&&g()},this,null,50);a.on(\"reloadMarkupScayt\",function(b){var d=b.data&&b.data.removeOptions;setTimeout(function(){var b=a.scayt,c=b&&b.getScaytLangList();c&&c.ltr&&c.rtl&&(a.document.fire(\"keydown\",new CKEDITOR.dom.event({keyCode:37})),b.removeMarkupInSelectionNode(d),b.fire(\"startSpellCheck, startGrammarCheck\"))},b.data&&\nb.data.timeout||0)});a.on(\"insertElement\",function(){a.fire(\"reloadMarkupScayt\",{removeOptions:{forceBookmark:!0}})},this,null,50);a.on(\"insertHtml\",function(){a.fire(\"reloadMarkupScayt\")},this,null,50);a.on(\"insertText\",function(){a.fire(\"reloadMarkupScayt\")},this,null,50);a.on(\"scaytDialogShown\",function(b){b.data.selectPage(a.scayt.tabToOpen)})},parseConfig:function(a){var c=CKEDITOR.plugins.scayt;c.replaceOldOptionsNames(a.config);\"boolean\"!==typeof a.config.scayt_autoStartup&&(a.config.scayt_autoStartup=\n!1);c.state.scayt[a.name]=a.config.scayt_autoStartup;\"boolean\"!==typeof a.config.grayt_autoStartup&&(a.config.grayt_autoStartup=!1);\"boolean\"!==typeof a.config.scayt_inlineModeImmediateMarkup&&(a.config.scayt_inlineModeImmediateMarkup=!1);c.state.grayt[a.name]=a.config.grayt_autoStartup;a.config.scayt_contextCommands||(a.config.scayt_contextCommands=\"ignore|ignoreall|add\");a.config.scayt_contextMenuItemsOrder||(a.config.scayt_contextMenuItemsOrder=\"suggest|moresuggest|control\");a.config.scayt_sLang||\n(a.config.scayt_sLang=\"en_US\");if(void 0===a.config.scayt_maxSuggestions||\"number\"!=typeof a.config.scayt_maxSuggestions||0>a.config.scayt_maxSuggestions)a.config.scayt_maxSuggestions=5;if(void 0===a.config.scayt_minWordLength||\"number\"!=typeof a.config.scayt_minWordLength||1>a.config.scayt_minWordLength)a.config.scayt_minWordLength=4;if(void 0===a.config.scayt_customDictionaryIds||\"string\"!==typeof a.config.scayt_customDictionaryIds)a.config.scayt_customDictionaryIds=\"\";if(void 0===a.config.scayt_userDictionaryName||\n\"string\"!==typeof a.config.scayt_userDictionaryName)a.config.scayt_userDictionaryName=null;if(\"string\"===typeof a.config.scayt_uiTabs&&3===a.config.scayt_uiTabs.split(\",\").length){var d=[],b=[];a.config.scayt_uiTabs=a.config.scayt_uiTabs.split(\",\");CKEDITOR.tools.search(a.config.scayt_uiTabs,function(a){1===Number(a)||0===Number(a)?(b.push(!0),d.push(Number(a))):b.push(!1)});null===CKEDITOR.tools.search(b,!1)?a.config.scayt_uiTabs=d:a.config.scayt_uiTabs=[1,1,1]}else a.config.scayt_uiTabs=[1,1,1];\n\"string\"!=typeof a.config.scayt_serviceProtocol&&(a.config.scayt_serviceProtocol=null);\"string\"!=typeof a.config.scayt_serviceHost&&(a.config.scayt_serviceHost=null);\"string\"!=typeof a.config.scayt_servicePort&&(a.config.scayt_servicePort=null);\"string\"!=typeof a.config.scayt_servicePath&&(a.config.scayt_servicePath=null);a.config.scayt_moreSuggestions||(a.config.scayt_moreSuggestions=\"on\");\"string\"!==typeof a.config.scayt_customerId&&(a.config.scayt_customerId=\"1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2\");\n\"string\"!==typeof a.config.scayt_srcUrl&&(c=document.location.protocol,c=-1!=c.search(/https?:/)?c:\"http:\",a.config.scayt_srcUrl=c+\"//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js\");\"boolean\"!==typeof CKEDITOR.config.scayt_handleCheckDirty&&(CKEDITOR.config.scayt_handleCheckDirty=!0);\"boolean\"!==typeof CKEDITOR.config.scayt_handleUndoRedo&&(CKEDITOR.config.scayt_handleUndoRedo=!0);CKEDITOR.config.scayt_handleUndoRedo=CKEDITOR.plugins.undo?CKEDITOR.config.scayt_handleUndoRedo:!1;\n\"boolean\"!==typeof a.config.scayt_multiLanguageMode&&(a.config.scayt_multiLanguageMode=!1);\"object\"!==typeof a.config.scayt_multiLanguageStyles&&(a.config.scayt_multiLanguageStyles={});a.config.scayt_ignoreAllCapsWords&&\"boolean\"!==typeof a.config.scayt_ignoreAllCapsWords&&(a.config.scayt_ignoreAllCapsWords=!1);a.config.scayt_ignoreDomainNames&&\"boolean\"!==typeof a.config.scayt_ignoreDomainNames&&(a.config.scayt_ignoreDomainNames=!1);a.config.scayt_ignoreWordsWithMixedCases&&\"boolean\"!==typeof a.config.scayt_ignoreWordsWithMixedCases&&\n(a.config.scayt_ignoreWordsWithMixedCases=!1);a.config.scayt_ignoreWordsWithNumbers&&\"boolean\"!==typeof a.config.scayt_ignoreWordsWithNumbers&&(a.config.scayt_ignoreWordsWithNumbers=!1);if(a.config.scayt_disableOptionsStorage){var c=CKEDITOR.tools.isArray(a.config.scayt_disableOptionsStorage)?a.config.scayt_disableOptionsStorage:\"string\"===typeof a.config.scayt_disableOptionsStorage?[a.config.scayt_disableOptionsStorage]:void 0,e=\"all options lang ignore-all-caps-words ignore-domain-names ignore-words-with-mixed-cases ignore-words-with-numbers\".split(\" \"),\nf=[\"lang\",\"ignore-all-caps-words\",\"ignore-domain-names\",\"ignore-words-with-mixed-cases\",\"ignore-words-with-numbers\"],g=CKEDITOR.tools.search,h=CKEDITOR.tools.indexOf;a.config.scayt_disableOptionsStorage=function(a){for(var b=[],d=0;d<a.length;d++){var c=a[d],m=!!g(a,\"options\");if(!g(e,c)||m&&g(f,function(a){if(\"lang\"===a)return!1}))return;g(f,c)&&f.splice(h(f,c),1);if(\"all\"===c||m&&g(a,\"lang\"))return[];\"options\"===c&&(f=[\"lang\"])}return b=b.concat(f)}(c)}},addRule:function(a){var c=CKEDITOR.plugins.scayt,\nd=a.dataProcessor,b=d&&d.htmlFilter,e=a._.elementsPath&&a._.elementsPath.filters,d=d&&d.dataFilter,f=a.addRemoveFormatFilter,g=function(b){if(a.scayt&&(b.hasAttribute(c.options.data_attribute_name)||b.hasAttribute(c.options.problem_grammar_data_attribute)))return!1},h=function(b){var d=!0;a.scayt&&(b.hasAttribute(c.options.data_attribute_name)||b.hasAttribute(c.options.problem_grammar_data_attribute))&&(d=!1);return d};e&&e.push(g);d&&d.addRules({elements:{span:function(a){var b=a.hasClass(c.options.misspelled_word_class)&&\na.attributes[c.options.data_attribute_name],d=a.hasClass(c.options.problem_grammar_class)&&a.attributes[c.options.problem_grammar_data_attribute];c&&(b||d)&&delete a.name;return a}}});b&&b.addRules({elements:{span:function(a){var b=a.hasClass(c.options.misspelled_word_class)&&a.attributes[c.options.data_attribute_name],d=a.hasClass(c.options.problem_grammar_class)&&a.attributes[c.options.problem_grammar_data_attribute];c&&(b||d)&&delete a.name;return a}}});f&&f.call(a,h)},scaytMenuDefinition:function(a){var c=\nthis;a=a.scayt;return{scayt:{scayt_ignore:{label:a.getLocal(\"btn_ignore\"),group:\"scayt_control\",order:1,exec:function(a){a.scayt.ignoreWord()}},scayt_ignoreall:{label:a.getLocal(\"btn_ignoreAll\"),group:\"scayt_control\",order:2,exec:function(a){a.scayt.ignoreAllWords()}},scayt_add:{label:a.getLocal(\"btn_addWord\"),group:\"scayt_control\",order:3,exec:function(a){var b=a.scayt;setTimeout(function(){b.addWordToUserDictionary()},10)}},scayt_option:{label:a.getLocal(\"btn_options\"),group:\"scayt_control\",order:4,\nexec:function(a){a.scayt.tabToOpen=\"options\";a.lockSelection();a.openDialog(c.dialogName)},verification:function(a){return 1==a.config.scayt_uiTabs[0]?!0:!1}},scayt_language:{label:a.getLocal(\"btn_langs\"),group:\"scayt_control\",order:5,exec:function(a){a.scayt.tabToOpen=\"langs\";a.lockSelection();a.openDialog(c.dialogName)},verification:function(a){return 1==a.config.scayt_uiTabs[1]?!0:!1}},scayt_dictionary:{label:a.getLocal(\"btn_dictionaries\"),group:\"scayt_control\",order:6,exec:function(a){a.scayt.tabToOpen=\n\"dictionaries\";a.lockSelection();a.openDialog(c.dialogName)},verification:function(a){return 1==a.config.scayt_uiTabs[2]?!0:!1}},scayt_about:{label:a.getLocal(\"btn_about\"),group:\"scayt_control\",order:7,exec:function(a){a.scayt.tabToOpen=\"about\";a.lockSelection();a.openDialog(c.dialogName)}}},grayt:{grayt_problemdescription:{label:\"Grammar problem description\",group:\"grayt_description\",order:1,state:CKEDITOR.TRISTATE_DISABLED,exec:function(a){}},grayt_ignore:{label:a.getLocal(\"btn_ignore\"),group:\"grayt_control\",\norder:2,exec:function(a){a.scayt.ignorePhrase()}}}}},buildSuggestionMenuItems:function(a,c,d){var b={},e={},f=d?\"word\":\"phrase\",g=d?\"startGrammarCheck\":\"startSpellCheck\",h=a.scayt;if(0<c.length&&\"no_any_suggestions\"!==c[0])if(d)for(d=0;d<c.length;d++){var k=\"scayt_suggest_\"+CKEDITOR.plugins.scayt.suggestions[d].replace(\" \",\"_\");a.addCommand(k,this.createCommand(CKEDITOR.plugins.scayt.suggestions[d],f,g));d<a.config.scayt_maxSuggestions?(a.addMenuItem(k,{label:c[d],command:k,group:\"scayt_suggest\",\norder:d+1}),b[k]=CKEDITOR.TRISTATE_OFF):(a.addMenuItem(k,{label:c[d],command:k,group:\"scayt_moresuggest\",order:d+1}),e[k]=CKEDITOR.TRISTATE_OFF,\"on\"===a.config.scayt_moreSuggestions&&(a.addMenuItem(\"scayt_moresuggest\",{label:h.getLocal(\"btn_moreSuggestions\"),group:\"scayt_moresuggest\",order:10,getItems:function(){return e}}),b.scayt_moresuggest=CKEDITOR.TRISTATE_OFF))}else for(d=0;d<c.length;d++)k=\"grayt_suggest_\"+CKEDITOR.plugins.scayt.suggestions[d].replace(\" \",\"_\"),a.addCommand(k,this.createCommand(CKEDITOR.plugins.scayt.suggestions[d],\nf,g)),a.addMenuItem(k,{label:c[d],command:k,group:\"grayt_suggest\",order:d+1}),b[k]=CKEDITOR.TRISTATE_OFF;else b.no_scayt_suggest=CKEDITOR.TRISTATE_DISABLED,a.addCommand(\"no_scayt_suggest\",{exec:function(){}}),a.addMenuItem(\"no_scayt_suggest\",{label:h.getLocal(\"btn_noSuggestions\")||\"no_scayt_suggest\",command:\"no_scayt_suggest\",group:\"scayt_suggest\",order:0});return b},menuGenerator:function(a,c){var d=a.scayt,b=this.scaytMenuDefinition(a),e={},f=a.config.scayt_contextCommands.split(\"|\"),g=c.getAttribute(d.getLangAttribute())||\nd.getLang(),h,k;h=d.isScaytNode(c);k=d.isGraytNode(c);h?(b=b.scayt,e=c.getAttribute(d.getScaytNodeAttributeName()),d.fire(\"getSuggestionsList\",{lang:g,word:e}),e=this.buildSuggestionMenuItems(a,CKEDITOR.plugins.scayt.suggestions,h)):k&&(b=b.grayt,e=c.getAttribute(d.getGraytNodeAttributeName()),k=d.getProblemDescriptionText(e,g),b.grayt_problemdescription&&k&&(b.grayt_problemdescription.label=k),d.fire(\"getGrammarSuggestionsList\",{lang:g,phrase:e}),e=this.buildSuggestionMenuItems(a,CKEDITOR.plugins.scayt.suggestions,\nh));if(h&&\"off\"==a.config.scayt_contextCommands)return e;for(var l in b)h&&-1==CKEDITOR.tools.indexOf(f,l.replace(\"scayt_\",\"\"))&&\"all\"!=a.config.scayt_contextCommands||(e[l]=\"undefined\"!=typeof b[l].state?b[l].state:CKEDITOR.TRISTATE_OFF,\"function\"!==typeof b[l].verification||b[l].verification(a)||delete e[l],a.addCommand(l,{exec:b[l].exec}),a.addMenuItem(l,{label:a.lang.scayt[b[l].label]||b[l].label,command:l,group:b[l].group,order:b[l].order}));return e},createCommand:function(a,c,d){return{exec:function(b){b=\nb.scayt;var e={};e[c]=a;b.replaceSelectionNode(e);\"startGrammarCheck\"===d&&b.removeMarkupInSelectionNode({grammarOnly:!0});b.fire(d)}}}});\nCKEDITOR.plugins.scayt={state:{scayt:{},grayt:{}},suggestions:[],loadingHelper:{loadOrder:[]},isLoading:!1,options:{disablingCommandExec:{source:!0,newpage:!0,templates:!0},data_attribute_name:\"data-scayt-word\",misspelled_word_class:\"scayt-misspell-word\",problem_grammar_data_attribute:\"data-grayt-phrase\",problem_grammar_class:\"gramm-problem\"},backCompatibilityMap:{scayt_service_protocol:\"scayt_serviceProtocol\",scayt_service_host:\"scayt_serviceHost\",scayt_service_port:\"scayt_servicePort\",scayt_service_path:\"scayt_servicePath\",\nscayt_customerid:\"scayt_customerId\"},replaceOldOptionsNames:function(a){for(var c in a)c in this.backCompatibilityMap&&(a[this.backCompatibilityMap[c]]=a[c],delete a[c])},createScayt:function(a){var c=this,d=CKEDITOR.plugins.scayt;this.loadScaytLibrary(a,function(a){var e=a.window&&a.window.getFrame()||a.editable();e?(e={lang:a.config.scayt_sLang,container:e.$,customDictionary:a.config.scayt_customDictionaryIds,userDictionaryName:a.config.scayt_userDictionaryName,localization:a.langCode,customer_id:a.config.scayt_customerId,\ndebug:a.config.scayt_debug,data_attribute_name:c.options.data_attribute_name,misspelled_word_class:c.options.misspelled_word_class,problem_grammar_data_attribute:c.options.problem_grammar_data_attribute,problem_grammar_class:c.options.problem_grammar_class,\"options-to-restore\":a.config.scayt_disableOptionsStorage,focused:a.editable().hasFocus,ignoreElementsRegex:a.config.scayt_elementsToIgnore,minWordLength:a.config.scayt_minWordLength,multiLanguageMode:a.config.scayt_multiLanguageMode,multiLanguageStyles:a.config.scayt_multiLanguageStyles,\ngraytAutoStartup:d.state.grayt[a.name]},a.config.scayt_serviceProtocol&&(e.service_protocol=a.config.scayt_serviceProtocol),a.config.scayt_serviceHost&&(e.service_host=a.config.scayt_serviceHost),a.config.scayt_servicePort&&(e.service_port=a.config.scayt_servicePort),a.config.scayt_servicePath&&(e.service_path=a.config.scayt_servicePath),\"boolean\"===typeof a.config.scayt_ignoreAllCapsWords&&(e[\"ignore-all-caps-words\"]=a.config.scayt_ignoreAllCapsWords),\"boolean\"===typeof a.config.scayt_ignoreDomainNames&&\n(e[\"ignore-domain-names\"]=a.config.scayt_ignoreDomainNames),\"boolean\"===typeof a.config.scayt_ignoreWordsWithMixedCases&&(e[\"ignore-words-with-mixed-cases\"]=a.config.scayt_ignoreWordsWithMixedCases),\"boolean\"===typeof a.config.scayt_ignoreWordsWithNumbers&&(e[\"ignore-words-with-numbers\"]=a.config.scayt_ignoreWordsWithNumbers),e=new SCAYT.CKSCAYT(e,function(){},function(){}),e.subscribe(\"suggestionListSend\",function(a){for(var b={},d=[],c=0;c<a.suggestionList.length;c++)b[\"word_\"+a.suggestionList[c]]||\n(b[\"word_\"+a.suggestionList[c]]=a.suggestionList[c],d.push(a.suggestionList[c]));CKEDITOR.plugins.scayt.suggestions=d}),e.subscribe(\"selectionIsChanged\",function(d){a.getSelection().isLocked&&a.lockSelection()}),e.subscribe(\"graytStateChanged\",function(c){d.state.grayt[a.name]=c.state}),a.scayt=e,a.fire(\"scaytButtonState\",a.readOnly?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_ON)):d.state.scayt[a.name]=!1})},destroy:function(a){a.scayt&&a.scayt.destroy();delete a.scayt;a.fire(\"scaytButtonState\",\nCKEDITOR.TRISTATE_OFF)},loadScaytLibrary:function(a,c){var d=this,b,e;this.loadingHelper[a.name]||(\"undefined\"===typeof window.SCAYT||\"function\"!==typeof window.SCAYT.CKSCAYT?(this.loadingHelper[a.name]=c,this.loadingHelper.loadOrder.push(a.name),b=new Date,b=b.getTime(),e=a.config.scayt_srcUrl,e+=0<=e.indexOf(\"?\")?\"\":\"?\"+b,this.loadingHelper.ckscaytLoading||(CKEDITOR.scriptLoader.load(e,function(a){if(a){CKEDITOR.fireOnce(\"scaytReady\");for(var b=0;b<d.loadingHelper.loadOrder.length;b++){a=d.loadingHelper.loadOrder[b];\nif(\"function\"===typeof d.loadingHelper[a])d.loadingHelper[a](CKEDITOR.instances[a]);delete d.loadingHelper[a]}d.loadingHelper.loadOrder=[]}}),this.loadingHelper.ckscaytLoading=!0)):window.SCAYT&&\"function\"===typeof window.SCAYT.CKSCAYT&&(CKEDITOR.fireOnce(\"scaytReady\"),a.scayt||\"function\"===typeof c&&c(a)))}};\nCKEDITOR.on(\"dialogDefinition\",function(a){var c=a.data.name;a=a.data.definition.dialog;if(\"scaytDialog\"===c)a.on(\"cancel\",function(a){return!1},this,null,-1);if(\"checkspell\"===c)a.on(\"cancel\",function(a){a=a.sender&&a.sender.getParentEditor();var b=CKEDITOR.plugins.scayt,c=a.scayt;c&&b.state.scayt[a.name]&&c.setMarkupPaused&&c.setMarkupPaused(!1);a.unlockSelection()},this,null,-2);if(\"link\"===c)a.on(\"ok\",function(a){var b=a.sender&&a.sender.getParentEditor();b&&setTimeout(function(){b.fire(\"reloadMarkupScayt\",\n{removeOptions:{removeInside:!0,forceBookmark:!0},timeout:0})},0)})});\nCKEDITOR.on(\"scaytReady\",function(){if(!0===CKEDITOR.config.scayt_handleCheckDirty){var a=CKEDITOR.editor.prototype;a.checkDirty=CKEDITOR.tools.override(a.checkDirty,function(a){return function(){var b=null,c=this.scayt;if(CKEDITOR.plugins.scayt&&CKEDITOR.plugins.scayt.state.scayt[this.name]&&this.scayt){if(b=\"ready\"==this.status)var f=c.removeMarkupFromString(this.getSnapshot()),c=c.removeMarkupFromString(this._.previousValue),b=b&&c!==f}else b=a.call(this);return b}});a.resetDirty=CKEDITOR.tools.override(a.resetDirty,\nfunction(a){return function(){var b=this.scayt;CKEDITOR.plugins.scayt&&CKEDITOR.plugins.scayt.state.scayt[this.name]&&this.scayt?this._.previousValue=b.removeMarkupFromString(this.getSnapshot()):a.call(this)}})}if(!0===CKEDITOR.config.scayt_handleUndoRedo){var a=CKEDITOR.plugins.undo.Image.prototype,c=\"function\"==typeof a.equalsContent?\"equalsContent\":\"equals\";a[c]=CKEDITOR.tools.override(a[c],function(a){return function(b){var c=b.editor.scayt,f=this.contents,g=b.contents,h=null;CKEDITOR.plugins.scayt&&\nCKEDITOR.plugins.scayt.state.scayt[b.editor.name]&&b.editor.scayt&&(this.contents=c.removeMarkupFromString(f)||\"\",b.contents=c.removeMarkupFromString(g)||\"\");h=a.apply(this,arguments);this.contents=f;b.contents=g;return h}})}});(function(){CKEDITOR.plugins.add(\"stylescombo\",{requires:\"richcombo\",init:function(c){var l=c.config,g=c.lang.stylescombo,f={},k=[],m=[];c.on(\"stylesSet\",function(b){if(b=b.data.styles){for(var a,h,d,e=0,n=b.length;e<n;e++)(a=b[e],c.blockless&&a.element in CKEDITOR.dtd.$block||(h=a.name,a=new CKEDITOR.style(a),c.filter.customConfig&&!c.filter.check(a)))||(a._name=h,a._.enterMode=l.enterMode,a._.type=d=a.assignedTo||a.type,a._.weight=e+1E3*(d==CKEDITOR.STYLE_OBJECT?1:d==CKEDITOR.STYLE_BLOCK?2:3),f[h]=\na,k.push(a),m.push(a));k.sort(function(a,b){return a._.weight-b._.weight})}});c.ui.addRichCombo(\"Styles\",{label:g.label,title:g.panelTitle,toolbar:\"styles,10\",allowedContent:m,panel:{css:[CKEDITOR.skin.getPath(\"editor\")].concat(l.contentsCss),multiSelect:!0,attributes:{\"aria-label\":g.panelTitle}},init:function(){var b,a,c,d,e,f;e=0;for(f=k.length;e<f;e++)b=k[e],a=b._name,d=b._.type,d!=c&&(this.startGroup(g[\"panelTitle\"+String(d)]),c=d),this.add(a,b.type==CKEDITOR.STYLE_OBJECT?a:b.buildPreview(),a);\nthis.commit()},onClick:function(b){c.focus();c.fire(\"saveSnapshot\");b=f[b];var a=c.elementPath();c[b.checkActive(a,c)?\"removeStyle\":\"applyStyle\"](b);c.fire(\"saveSnapshot\")},onRender:function(){c.on(\"selectionChange\",function(b){var a=this.getValue();b=b.data.path.elements;for(var h=0,d=b.length,e;h<d;h++){e=b[h];for(var g in f)if(f[g].checkElementRemovable(e,!0,c)){g!=a&&this.setValue(g);return}}this.setValue(\"\")},this)},onOpen:function(){var b=c.getSelection().getSelectedElement(),b=c.elementPath(b),\na=[0,0,0,0];this.showAll();this.unmarkAll();for(var h in f){var d=f[h],e=d._.type;d.checkApplicable(b,c,c.activeFilter)?a[e]++:this.hideItem(h);d.checkActive(b,c)&&this.mark(h)}a[CKEDITOR.STYLE_BLOCK]||this.hideGroup(g[\"panelTitle\"+String(CKEDITOR.STYLE_BLOCK)]);a[CKEDITOR.STYLE_INLINE]||this.hideGroup(g[\"panelTitle\"+String(CKEDITOR.STYLE_INLINE)]);a[CKEDITOR.STYLE_OBJECT]||this.hideGroup(g[\"panelTitle\"+String(CKEDITOR.STYLE_OBJECT)])},refresh:function(){var b=c.elementPath();if(b){for(var a in f)if(f[a].checkApplicable(b,\nc,c.activeFilter))return;this.setState(CKEDITOR.TRISTATE_DISABLED)}},reset:function(){f={};k=[]}})}})})();(function(){function k(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant(\"table\").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1:\n0]});if(a||c)if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),e.checkStartOfBlock()&&e.checkEndOfBlock()||e.selectNodeContents(a);else return!0;else{for(var f=b.getAscendant(\"table\").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++)f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1)).appendBogus();e.moveToElementEditStart(f)}e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,source:1}},g={exec:function(c){c.container.focusNext(!0,\nc.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add(\"tab\",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b=\"\";e--;)b+=\" \";if(b)c.on(\"key\",function(a){9==a.data.keyCode&&(c.insertText(b),a.cancel())});if(d)c.on(\"key\",function(a){(9==a.data.keyCode&&c.execCommand(\"selectNextCell\")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand(\"selectPreviousCell\"))&&a.cancel()});c.addCommand(\"blur\",CKEDITOR.tools.extend(g,h));c.addCommand(\"blurBack\",\nCKEDITOR.tools.extend(f,h));c.addCommand(\"selectNextCell\",k());c.addCommand(\"selectPreviousCell\",k(!0))}})})();\nCKEDITOR.dom.element.prototype.focusNext=function(k,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(k,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,k){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&&\n(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):d||0!==a||(d=b,e=a)}}d&&d.focus()};\nCKEDITOR.dom.element.prototype.focusPrevious=function(k,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,k){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}b<g&&(!d||b>e)&&(d=a,e=b)}}d&&d.focus()};CKEDITOR.plugins.add(\"table\",{requires:\"dialog\",init:function(a){function e(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,f){this.setState(f.contains(\"table\",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var c=a.lang.table;a.addCommand(\"table\",new CKEDITOR.dialogCommand(\"table\",{context:\"table\",allowedContent:\"table{width,height}[align,border,cellpadding,cellspacing,summary];caption tbody thead tfoot;th td tr[scope];\"+(a.plugins.dialogadvtab?\n\"table\"+a.plugins.dialogadvtab.allowedContent():\"\"),requiredContent:\"table\",contentTransformations:[[\"table{width}: sizeToStyle\",\"table[width]: sizeToAttribute\"]]}));a.addCommand(\"tableProperties\",new CKEDITOR.dialogCommand(\"tableProperties\",e()));a.addCommand(\"tableDelete\",e({exec:function(a){var b=a.elementPath().contains(\"table\",1);if(b){var d=b.getParent(),c=a.editable();1!=d.getChildCount()||d.is(\"td\",\"th\")||d.equals(c)||(b=d);a=a.createRange();a.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);\nb.remove();a.select()}}}));a.ui.addButton&&a.ui.addButton(\"Table\",{label:c.toolbar,command:\"table\",toolbar:\"insert,30\"});CKEDITOR.dialog.add(\"table\",this.path+\"dialogs/table.js\");CKEDITOR.dialog.add(\"tableProperties\",this.path+\"dialogs/table.js\");a.addMenuItems&&a.addMenuItems({table:{label:c.menu,command:\"tableProperties\",group:\"table\",order:5},tabledelete:{label:c.deleteTable,command:\"tableDelete\",group:\"table\",order:1}});a.on(\"doubleclick\",function(a){a.data.element.is(\"table\")&&(a.data.dialog=\n\"tableProperties\")});a.contextMenu&&a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function t(e){function d(a){0<b.length||a.type!=CKEDITOR.NODE_ELEMENT||!C.test(a.getName())||a.getCustomData(\"selected_cell\")||(CKEDITOR.dom.element.setMarker(c,a,\"selected_cell\",!0),b.push(a))}e=e.getRanges();for(var b=[],c={},a=0;a<e.length;a++){var f=e[a];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant(\"td\",!0)||f.getAscendant(\"th\",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)g.type==CKEDITOR.NODE_ELEMENT&&g.is(CKEDITOR.dtd.table)||(g=g.getAscendant(\"td\",\n!0)||g.getAscendant(\"th\",!0))&&!g.getCustomData(\"selected_cell\")&&(CKEDITOR.dom.element.setMarker(c,g,\"selected_cell\",!0),b.push(g))}}CKEDITOR.dom.element.clearAllMarkers(c);return b}function p(e,d){for(var b=t(e),c=b[0],a=c.getAscendant(\"table\"),c=c.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(a.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(a),a=b[g],g=d?b[g-1]:b[g+1],b=b[0].length,c=c.createElement(\"tr\"),\nh=0;a[h]&&h<b;h++){var k;1<a[h].rowSpan&&g&&a[h]==g[h]?(k=a[h],k.rowSpan+=1):(k=(new CKEDITOR.dom.element(a[h])).clone(),k.removeAttribute(\"rowSpan\"),k.appendBogus(),c.append(k),k=k.$);h+=k.colSpan-1}d?c.insertBefore(f):c.insertAfter(f)}function u(e){if(e instanceof CKEDITOR.dom.selection){var d=t(e),b=d[0].getAscendant(\"table\"),c=CKEDITOR.tools.buildTableMap(b);e=d[0].getParent().$.rowIndex;for(var d=d[d.length-1],a=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],f=e;f<=a;f++){for(var g=c[f],h=new CKEDITOR.dom.element(b.$.rows[f]),\nk=0;k<g.length;k++){var l=new CKEDITOR.dom.element(g[k]),n=l.getParent().$.rowIndex;1==l.$.rowSpan?l.remove():(--l.$.rowSpan,n==f&&(n=c[f+1],n[k-1]?l.insertAfter(new CKEDITOR.dom.element(n[k-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(l,1)));k+=l.$.colSpan-1}d.push(h)}c=b.$.rows;b=new CKEDITOR.dom.element(c[a+1]||(0<e?c[e-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)u(d[f]);return b}e instanceof CKEDITOR.dom.element&&(b=e.getAscendant(\"table\"),1==b.$.rows.length?b.remove():e.remove());\nreturn null}function v(e,d){for(var b=d?Infinity:0,c=0;c<e.length;c++){var a;a=e[c];for(var f=d,g=a.getParent().$.cells,h=0,k=0;k<g.length;k++){var l=g[k],h=h+(f?1:l.colSpan);if(l==a.$)break}a=h-1;if(d?a<b:a>b)b=a}return b}function m(e,d){for(var b=t(e),c=b[0].getAscendant(\"table\"),a=v(b,1),b=v(b),a=d?a:b,f=CKEDITOR.tools.buildTableMap(c),c=[],b=[],g=f.length,h=0;h<g;h++)c.push(f[h][a]),b.push(d?f[h][a-1]:f[h][a+1]);for(h=0;h<g;h++)c[h]&&(1<c[h].colSpan&&b[h]==c[h]?(a=c[h],a.colSpan+=1):(a=(new CKEDITOR.dom.element(c[h])).clone(),\na.removeAttribute(\"colSpan\"),a.appendBogus(),a[d?\"insertBefore\":\"insertAfter\"].call(a,new CKEDITOR.dom.element(c[h])),a=a.$),h+=a.rowSpan-1)}function y(e,d){var b=e.getStartElement();if(b=b.getAscendant(\"td\",1)||b.getAscendant(\"th\",1)){var c=b.clone();c.appendBogus();d?c.insertBefore(b):c.insertAfter(b)}}function x(e){if(e instanceof CKEDITOR.dom.selection){e=t(e);var d=e[0]&&e[0].getAscendant(\"table\"),b;a:{var c=0;b=e.length-1;for(var a={},f,g;f=e[c++];)CKEDITOR.dom.element.setMarker(a,f,\"delete_cell\",\n!0);for(c=0;f=e[c++];)if((g=f.getPrevious())&&!g.getCustomData(\"delete_cell\")||(g=f.getNext())&&!g.getCustomData(\"delete_cell\")){CKEDITOR.dom.element.clearAllMarkers(a);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(a);g=e[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=e[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=e.length-1;0<=g;g--)x(e[g]);b?q(b,!0):d&&d.remove()}else e instanceof CKEDITOR.dom.element&&(d=e.getParent(),1==d.getChildCount()?d.remove():e.remove())}function q(e,\nd){var b=e.getDocument(),c=CKEDITOR.document;CKEDITOR.env.ie&&10==CKEDITOR.env.version&&(c.focus(),b.focus());b=new CKEDITOR.dom.range(b);b[\"moveToElementEdit\"+(d?\"End\":\"Start\")](e)||(b.selectNodeContents(e),b.collapse(d?!1:!0));b.select(!0)}function z(e,d,b){e=e[d];if(\"undefined\"==typeof b)return e;for(d=0;e&&d<e.length;d++){if(b.is&&e[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(e[d])}return b.is?-1:null}function w(e,d,b){var c=t(e),a;if((d?1!=c.length:2>c.length)||(a=e.getCommonAncestor())&&\na.type==CKEDITOR.NODE_ELEMENT&&a.is(\"table\"))return!1;var f;e=c[0];a=e.getAscendant(\"table\");var g=CKEDITOR.tools.buildTableMap(a),h=g.length,k=g[0].length,l=e.getParent().$.rowIndex,n=z(g,l,e);if(d){var r;try{var q=parseInt(e.getAttribute(\"rowspan\"),10)||1;f=parseInt(e.getAttribute(\"colspan\"),10)||1;r=g[\"up\"==d?l-q:\"down\"==d?l+q:l][\"left\"==d?n-f:\"right\"==d?n+f:n]}catch(D){return!1}if(!r||e.$==r)return!1;c[\"up\"==d||\"left\"==d?\"unshift\":\"push\"](new CKEDITOR.dom.element(r))}d=e.getDocument();var p=l,\nq=r=0,u=!b&&new CKEDITOR.dom.documentFragment(d),w=0;for(d=0;d<c.length;d++){f=c[d];var m=f.getParent(),x=f.getFirst(),v=f.$.colSpan,y=f.$.rowSpan,m=m.$.rowIndex,A=z(g,m,f),w=w+v*y,q=Math.max(q,A-n+v);r=Math.max(r,m-l+y);b||(v=f,(y=v.getBogus())&&y.remove(),v.trim(),f.getChildren().count()&&(m==p||!x||x.isBlockBoundary&&x.isBlockBoundary({br:1})||(p=u.getLast(CKEDITOR.dom.walker.whitespaces(!0)),!p||p.is&&p.is(\"br\")||u.append(\"br\")),f.moveChildren(u)),d?f.remove():f.setHtml(\"\"));p=m}if(b)return r*\nq==w;u.moveChildren(e);e.appendBogus();q>=k?e.removeAttribute(\"rowSpan\"):e.$.rowSpan=r;r>=h?e.removeAttribute(\"colSpan\"):e.$.colSpan=q;b=new CKEDITOR.dom.nodeList(a.$.rows);c=b.count();for(d=c-1;0<=d;d--)a=b.getItem(d),a.$.cells.length||(a.remove(),c++);return e}function A(e,d){var b=t(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant(\"table\"),f=CKEDITOR.tools.buildTableMap(a),g=c.$.rowIndex,h=z(f,g,b),k=b.$.rowSpan,l;if(1<k){l=Math.ceil(k/2);for(var k=Math.floor(k/\n2),c=g+l,a=new CKEDITOR.dom.element(a.$.rows[c]),f=z(f,c),n,c=b.clone(),g=0;g<f.length;g++)if(n=f[g],n.parentNode==a.$&&g>h){c.insertBefore(new CKEDITOR.dom.element(n));break}else n=null;n||a.append(c)}else for(k=l=1,a=c.clone(),a.insertAfter(c),a.append(c=b.clone()),n=z(f,g),h=0;h<n.length;h++)n[h].rowSpan++;c.appendBogus();b.$.rowSpan=l;c.$.rowSpan=k;1==l&&b.removeAttribute(\"rowSpan\");1==k&&c.removeAttribute(\"rowSpan\");return c}function B(e,d){var b=t(e);if(1<b.length)return!1;if(d)return!0;var b=\nb[0],c=b.getParent(),a=c.getAscendant(\"table\"),a=CKEDITOR.tools.buildTableMap(a),f=z(a,c.$.rowIndex,b),g=b.$.colSpan;if(1<g)c=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=c=1,h=[],k=0;k<a.length;k++){var l=a[k];h.push(l[f]);1<l[f].rowSpan&&(k+=l[f].rowSpan-1)}for(a=0;a<h.length;a++)h[a].colSpan++}a=b.clone();a.insertAfter(b);a.appendBogus();b.$.colSpan=c;a.$.colSpan=g;1==c&&b.removeAttribute(\"colSpan\");1==g&&a.removeAttribute(\"colSpan\");return a}var C=/^(?:td|th)$/;CKEDITOR.plugins.tabletools=\n{requires:\"table,dialog,contextmenu\",init:function(e){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}function b(a,b){var c=e.addCommand(a,b);e.addFeature(c)}var c=e.lang.table;b(\"cellProperties\",new CKEDITOR.dialogCommand(\"cellProperties\",d({allowedContent:\"td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]\",\nrequiredContent:\"table\"})));CKEDITOR.dialog.add(\"cellProperties\",this.path+\"dialogs/tableCell.js\");b(\"rowDelete\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();q(u(a))}}));b(\"rowInsertBefore\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();p(a,!0)}}));b(\"rowInsertAfter\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();p(a)}}));b(\"columnDelete\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();a=t(a);var b=a[0],c=a[a.length-1];a=b.getAscendant(\"table\");\nfor(var d=CKEDITOR.tools.buildTableMap(a),e,l,n=[],r=0,p=d.length;r<p;r++)for(var m=0,u=d[r].length;m<u;m++)d[r][m]==b.$&&(e=m),d[r][m]==c.$&&(l=m);for(r=e;r<=l;r++)for(m=0;m<d.length;m++)c=d[m],b=new CKEDITOR.dom.element(a.$.rows[m]),c=new CKEDITOR.dom.element(c[r]),c.$&&(1==c.$.colSpan?c.remove():--c.$.colSpan,m+=c.$.rowSpan-1,b.$.cells.length||n.push(b));l=a.$.rows[0]&&a.$.rows[0].cells;e=new CKEDITOR.dom.element(l[e]||(e?l[e-1]:a.$.parentNode));n.length==p&&a.remove();e&&q(e,!0)}}));b(\"columnInsertBefore\",\nd({requiredContent:\"table\",exec:function(a){a=a.getSelection();m(a,!0)}}));b(\"columnInsertAfter\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();m(a)}}));b(\"cellDelete\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();x(a)}}));b(\"cellMerge\",d({allowedContent:\"td[colspan,rowspan]\",requiredContent:\"td[colspan,rowspan]\",exec:function(a){q(w(a.getSelection()),!0)}}));b(\"cellMergeRight\",d({allowedContent:\"td[colspan]\",requiredContent:\"td[colspan]\",exec:function(a){q(w(a.getSelection(),\n\"right\"),!0)}}));b(\"cellMergeDown\",d({allowedContent:\"td[rowspan]\",requiredContent:\"td[rowspan]\",exec:function(a){q(w(a.getSelection(),\"down\"),!0)}}));b(\"cellVerticalSplit\",d({allowedContent:\"td[rowspan]\",requiredContent:\"td[rowspan]\",exec:function(a){q(B(a.getSelection()))}}));b(\"cellHorizontalSplit\",d({allowedContent:\"td[colspan]\",requiredContent:\"td[colspan]\",exec:function(a){q(A(a.getSelection()))}}));b(\"cellInsertBefore\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();y(a,!0)}}));\nb(\"cellInsertAfter\",d({requiredContent:\"table\",exec:function(a){a=a.getSelection();y(a)}}));e.addMenuItems&&e.addMenuItems({tablecell:{label:c.cell.menu,group:\"tablecell\",order:1,getItems:function(){var a=e.getSelection(),b=t(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:w(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:w(a,\"right\",!0)?CKEDITOR.TRISTATE_OFF:\nCKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:w(a,\"down\",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:B(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:A(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:c.cell.insertBefore,group:\"tablecell\",command:\"cellInsertBefore\",order:5},tablecell_insertAfter:{label:c.cell.insertAfter,\ngroup:\"tablecell\",command:\"cellInsertAfter\",order:10},tablecell_delete:{label:c.cell.deleteCell,group:\"tablecell\",command:\"cellDelete\",order:15},tablecell_merge:{label:c.cell.merge,group:\"tablecell\",command:\"cellMerge\",order:16},tablecell_merge_right:{label:c.cell.mergeRight,group:\"tablecell\",command:\"cellMergeRight\",order:17},tablecell_merge_down:{label:c.cell.mergeDown,group:\"tablecell\",command:\"cellMergeDown\",order:18},tablecell_split_horizontal:{label:c.cell.splitHorizontal,group:\"tablecell\",\ncommand:\"cellHorizontalSplit\",order:19},tablecell_split_vertical:{label:c.cell.splitVertical,group:\"tablecell\",command:\"cellVerticalSplit\",order:20},tablecell_properties:{label:c.cell.title,group:\"tablecellproperties\",command:\"cellProperties\",order:21},tablerow:{label:c.row.menu,group:\"tablerow\",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:c.row.insertBefore,\ngroup:\"tablerow\",command:\"rowInsertBefore\",order:5},tablerow_insertAfter:{label:c.row.insertAfter,group:\"tablerow\",command:\"rowInsertAfter\",order:10},tablerow_delete:{label:c.row.deleteRow,group:\"tablerow\",command:\"rowDelete\",order:15},tablecolumn:{label:c.column.menu,group:\"tablecolumn\",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:c.column.insertBefore,\ngroup:\"tablecolumn\",command:\"columnInsertBefore\",order:5},tablecolumn_insertAfter:{label:c.column.insertAfter,group:\"tablecolumn\",command:\"columnInsertAfter\",order:10},tablecolumn_delete:{label:c.column.deleteColumn,group:\"tablecolumn\",command:\"columnDelete\",order:15}});e.contextMenu&&e.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:t};\nCKEDITOR.plugins.add(\"tabletools\",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(t){t=t.$.rows;for(var p=-1,u=[],v=0;v<t.length;v++){p++;!u[p]&&(u[p]=[]);for(var m=-1,y=0;y<t[v].cells.length;y++){var x=t[v].cells[y];for(m++;u[p][m];)m++;for(var q=isNaN(x.colSpan)?1:x.colSpan,x=isNaN(x.rowSpan)?1:x.rowSpan,z=0;z<x;z++){u[p+z]||(u[p+z]=[]);for(var w=0;w<q;w++)u[p+z][m+w]=t[v].cells[y]}m+=q-1}}return u};(function(){var g=[CKEDITOR.CTRL+90,CKEDITOR.CTRL+89,CKEDITOR.CTRL+CKEDITOR.SHIFT+90],n={8:1,46:1};CKEDITOR.plugins.add(\"undo\",{init:function(a){function b(a){d.enabled&&!1!==a.data.command.canUndo&&d.save()}function c(){d.enabled=a.readOnly?!1:\"wysiwyg\"==a.mode;d.onChange()}var d=a.undoManager=new e(a),l=d.editingHandler=new k(d),f=a.addCommand(\"undo\",{exec:function(){d.undo()&&(a.selectionChange(),this.fire(\"afterUndo\"))},startDisabled:!0,canUndo:!1}),h=a.addCommand(\"redo\",{exec:function(){d.redo()&&\n(a.selectionChange(),this.fire(\"afterRedo\"))},startDisabled:!0,canUndo:!1});a.setKeystroke([[g[0],\"undo\"],[g[1],\"redo\"],[g[2],\"redo\"]]);d.onChange=function(){f.setState(d.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);h.setState(d.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on(\"beforeCommandExec\",b);a.on(\"afterCommandExec\",b);a.on(\"saveSnapshot\",function(a){d.save(a.data&&a.data.contentOnly)});a.on(\"contentDom\",l.attachListeners,l);a.on(\"instanceReady\",function(){a.fire(\"saveSnapshot\")});\na.on(\"beforeModeUnload\",function(){\"wysiwyg\"==a.mode&&d.save(!0)});a.on(\"mode\",c);a.on(\"readOnly\",c);a.ui.addButton&&(a.ui.addButton(\"Undo\",{label:a.lang.undo.undo,command:\"undo\",toolbar:\"undo,10\"}),a.ui.addButton(\"Redo\",{label:a.lang.undo.redo,command:\"redo\",toolbar:\"undo,20\"}));a.resetUndo=function(){d.reset();a.fire(\"saveSnapshot\")};a.on(\"updateSnapshot\",function(){d.currentImage&&d.update()});a.on(\"lockSnapshot\",function(a){a=a.data;d.lock(a&&a.dontUpdate,a&&a.forceUpdate)});a.on(\"unlockSnapshot\",\nd.unlock,d)}});CKEDITOR.plugins.undo={};var e=CKEDITOR.plugins.undo.UndoManager=function(a){this.strokesRecorded=[0,0];this.locked=null;this.previousKeyGroup=-1;this.limit=a.config.undoStackSize||20;this.strokesLimit=25;this.editor=a;this.reset()};e.prototype={type:function(a,b){var c=e.getKeyGroup(a),d=this.strokesRecorded[c]+1;b=b||d>=this.strokesLimit;this.typing||(this.hasUndo=this.typing=!0,this.hasRedo=!1,this.onChange());b?(d=0,this.editor.fire(\"saveSnapshot\")):this.editor.fire(\"change\");this.strokesRecorded[c]=\nd;this.previousKeyGroup=c},keyGroupChanged:function(a){return e.getKeyGroup(a)!=this.previousKeyGroup},reset:function(){this.snapshots=[];this.index=-1;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.strokesRecorded=[0,0];this.typing=!1;this.previousKeyGroup=-1},refreshState:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,b,c){var d=this.editor;if(this.locked||\n\"ready\"!=d.status||\"wysiwyg\"!=d.mode)return!1;var e=d.editable();if(!e||\"ready\"!=e.status)return!1;e=this.snapshots;b||(b=new f(d));if(!1===b.contents)return!1;if(this.currentImage)if(b.equalsContent(this.currentImage)){if(a||b.equalsSelection(this.currentImage))return!1}else!1!==c&&d.fire(\"change\");e.splice(this.index+1,e.length-this.index-1);e.length==this.limit&&e.shift();this.index=e.push(b)-1;this.currentImage=b;!1!==c&&this.refreshState();return!0},restoreImage:function(a){var b=this.editor,\nc;a.bookmarks&&(b.focus(),c=b.getSelection());this.locked={level:999};this.editor.loadSnapshot(a.contents);a.bookmarks?c.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=null;this.index=a.index;this.currentImage=this.snapshots[this.index];this.update();this.refreshState();b.fire(\"change\")},getNextImage:function(a){var b=this.snapshots,c=this.currentImage,d;if(c)if(a)for(d=this.index-1;0<=d;d--){if(a=b[d],!c.equalsContent(a))return a.index=\nd,a}else for(d=this.index+1;d<b.length;d++)if(a=b[d],!c.equalsContent(a))return a.index=d,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a),!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(a){if(!this.locked){a||\n(a=new f(this.editor));for(var b=this.index,c=this.snapshots;0<b&&this.currentImage.equalsContent(c[b-1]);)--b;c.splice(b,this.index-b+1,a);this.index=b;this.currentImage=a}},updateSelection:function(a){if(!this.snapshots.length)return!1;var b=this.snapshots,c=b[b.length-1];return c.equalsContent(a)&&!c.equalsSelection(a)?(this.currentImage=b[b.length-1]=a,!0):!1},lock:function(a,b){if(this.locked)this.locked.level++;else if(a)this.locked={level:1};else{var c=null;if(b)c=!0;else{var d=new f(this.editor,\n!0);this.currentImage&&this.currentImage.equalsContent(d)&&(c=d)}this.locked={update:c,level:1}}},unlock:function(){if(this.locked&&!--this.locked.level){var a=this.locked.update;this.locked=null;if(!0===a)this.update();else if(a){var b=new f(this.editor,!0);a.equalsContent(b)||this.update()}}}};e.navigationKeyCodes={37:1,38:1,39:1,40:1,36:1,35:1,33:1,34:1};e.keyGroups={PRINTABLE:0,FUNCTIONAL:1};e.isNavigationKey=function(a){return!!e.navigationKeyCodes[a]};e.getKeyGroup=function(a){var b=e.keyGroups;\nreturn n[a]?b.FUNCTIONAL:b.PRINTABLE};e.getOppositeKeyGroup=function(a){var b=e.keyGroups;return a==b.FUNCTIONAL?b.PRINTABLE:b.FUNCTIONAL};e.ieFunctionalKeysBug=function(a){return CKEDITOR.env.ie&&e.getKeyGroup(a)==e.keyGroups.FUNCTIONAL};var f=CKEDITOR.plugins.undo.Image=function(a,b){this.editor=a;a.fire(\"beforeUndoImage\");var c=a.getSnapshot();CKEDITOR.env.ie&&c&&(c=c.replace(/\\s+data-cke-expando=\".*?\"/g,\"\"));this.contents=c;b||(this.bookmarks=(c=c&&a.getSelection())&&c.createBookmarks2(!0));a.fire(\"afterUndoImage\")},\nh=/\\b(?:href|src|name)=\"[^\"]*?\"/gi;f.prototype={equalsContent:function(a){var b=this.contents;a=a.contents;CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)&&(b=b.replace(h,\"\"),a=a.replace(h,\"\"));return b!=a?!1:!0},equalsSelection:function(a){var b=this.bookmarks;a=a.bookmarks;if(b||a){if(!b||!a||b.length!=a.length)return!1;for(var c=0;c<b.length;c++){var d=b[c],e=a[c];if(d.startOffset!=e.startOffset||d.endOffset!=e.endOffset||!CKEDITOR.tools.arrayCompare(d.start,e.start)||!CKEDITOR.tools.arrayCompare(d.end,\ne.end))return!1}}return!0}};var k=CKEDITOR.plugins.undo.NativeEditingHandler=function(a){this.undoManager=a;this.ignoreInputEvent=!1;this.keyEventsStack=new m;this.lastKeydownImage=null};k.prototype={onKeydown:function(a){var b=a.data.getKey();if(229!==b)if(-1<CKEDITOR.tools.indexOf(g,a.data.getKeystroke()))a.data.preventDefault();else if(this.keyEventsStack.cleanUp(a),a=this.undoManager,this.keyEventsStack.getLast(b)||this.keyEventsStack.push(b),this.lastKeydownImage=new f(a.editor),e.isNavigationKey(b)||\nthis.undoManager.keyGroupChanged(b))if(a.strokesRecorded[0]||a.strokesRecorded[1])a.save(!1,this.lastKeydownImage,!1),a.resetType()},onInput:function(){if(this.ignoreInputEvent)this.ignoreInputEvent=!1;else{var a=this.keyEventsStack.getLast();a||(a=this.keyEventsStack.push(0));this.keyEventsStack.increment(a.keyCode);this.keyEventsStack.getTotalInputs()>=this.undoManager.strokesLimit&&(this.undoManager.type(a.keyCode,!0),this.keyEventsStack.resetInputs())}},onKeyup:function(a){var b=this.undoManager;\na=a.data.getKey();var c=this.keyEventsStack.getTotalInputs();this.keyEventsStack.remove(a);if(!(e.ieFunctionalKeysBug(a)&&this.lastKeydownImage&&this.lastKeydownImage.equalsContent(new f(b.editor,!0))))if(0<c)b.type(a);else if(e.isNavigationKey(a))this.onNavigationKey(!0)},onNavigationKey:function(a){var b=this.undoManager;!a&&b.save(!0,null,!1)||b.updateSelection(new f(b.editor));b.resetType()},ignoreInputEventListener:function(){this.ignoreInputEvent=!0},attachListeners:function(){var a=this.undoManager.editor,\nb=a.editable(),c=this;b.attachListener(b,\"keydown\",function(a){c.onKeydown(a);if(e.ieFunctionalKeysBug(a.data.getKey()))c.onInput()},null,null,999);b.attachListener(b,CKEDITOR.env.ie?\"keypress\":\"input\",c.onInput,c,null,999);b.attachListener(b,\"keyup\",c.onKeyup,c,null,999);b.attachListener(b,\"paste\",c.ignoreInputEventListener,c,null,999);b.attachListener(b,\"drop\",c.ignoreInputEventListener,c,null,999);b.attachListener(b.isInline()?b:a.document.getDocumentElement(),\"click\",function(){c.onNavigationKey()},\nnull,null,999);b.attachListener(this.undoManager.editor,\"blur\",function(){c.keyEventsStack.remove(9)},null,null,999)}};var m=CKEDITOR.plugins.undo.KeyEventsStack=function(){this.stack=[]};m.prototype={push:function(a){a=this.stack.push({keyCode:a,inputs:0});return this.stack[a-1]},getLastIndex:function(a){if(\"number\"!=typeof a)return this.stack.length-1;for(var b=this.stack.length;b--;)if(this.stack[b].keyCode==a)return b;return-1},getLast:function(a){a=this.getLastIndex(a);return-1!=a?this.stack[a]:\nnull},increment:function(a){this.getLast(a).inputs++},remove:function(a){a=this.getLastIndex(a);-1!=a&&this.stack.splice(a,1)},resetInputs:function(a){if(\"number\"==typeof a)this.getLast(a).inputs=0;else for(a=this.stack.length;a--;)this.stack[a].inputs=0},getTotalInputs:function(){for(var a=this.stack.length,b=0;a--;)b+=this.stack[a].inputs;return b},cleanUp:function(a){a=a.data.$;a.ctrlKey||a.metaKey||this.remove(17);a.shiftKey||this.remove(16);a.altKey||this.remove(18)}}})();CKEDITOR.plugins.add(\"wsc\",{requires:\"dialog\",parseApi:function(a){a.config.wsc_onFinish=\"function\"===typeof a.config.wsc_onFinish?a.config.wsc_onFinish:function(){};a.config.wsc_onClose=\"function\"===typeof a.config.wsc_onClose?a.config.wsc_onClose:function(){}},parseConfig:function(a){a.config.wsc_customerId=a.config.wsc_customerId||CKEDITOR.config.wsc_customerId||\"1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk\";a.config.wsc_customDictionaryIds=a.config.wsc_customDictionaryIds||\nCKEDITOR.config.wsc_customDictionaryIds||\"\";a.config.wsc_userDictionaryName=a.config.wsc_userDictionaryName||CKEDITOR.config.wsc_userDictionaryName||\"\";a.config.wsc_customLoaderScript=a.config.wsc_customLoaderScript||CKEDITOR.config.wsc_customLoaderScript;CKEDITOR.config.wsc_cmd=a.config.wsc_cmd||CKEDITOR.config.wsc_cmd||\"spell\";CKEDITOR.config.wsc_version=\"v4.3.0-master-d769233\";CKEDITOR.config.wsc_removeGlobalVariable=!0},init:function(a){var b=CKEDITOR.env;this.parseConfig(a);this.parseApi(a);\na.addCommand(\"checkspell\",new CKEDITOR.dialogCommand(\"checkspell\")).modes={wysiwyg:!CKEDITOR.env.opera&&!CKEDITOR.env.air&&document.domain==window.location.hostname&&!(b.ie&&(8>b.version||b.quirks))};\"undefined\"==typeof a.plugins.scayt&&a.ui.addButton&&a.ui.addButton(\"SpellChecker\",{label:a.lang.wsc.toolbar,click:function(a){var b=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.container.getText():a.document.getBody().getText();(b=b.replace(/\\s/g,\"\"))?a.execCommand(\"checkspell\"):alert(\"Nothing to check!\")},\ntoolbar:\"spellchecker,10\"});CKEDITOR.dialog.add(\"checkspell\",this.path+(CKEDITOR.env.ie&&7>=CKEDITOR.env.version?\"dialogs/wsc_ie.js\":window.postMessage?\"dialogs/wsc.js\":\"dialogs/wsc_ie.js\"))}});CKEDITOR.config.plugins='dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,bidi,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,div,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,fakeobjects,flash,floatingspace,listblock,richcombo,font,forms,format,horizontalrule,htmlwriter,iframe,wysiwygarea,image,indent,indentblock,indentlist,smiley,justify,menubutton,language,link,list,liststyle,magicline,maximize,newpage,pagebreak,pastetext,pastefromword,preview,print,removeformat,save,selectall,showblocks,showborders,sourcearea,specialchar,scayt,stylescombo,tab,table,tabletools,undo,wsc';CKEDITOR.config.skin='moonocolor';(function() {var setIcons = function(icons, strip) {var path = CKEDITOR.getUrl( 'plugins/' + strip );icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ], bgsize : icons[ ++i ] };};if (CKEDITOR.env.hidpi) setIcons('about,0,,bold,24,,italic,48,,strike,72,,subscript,96,,superscript,120,,underline,144,,bidiltr,168,,bidirtl,192,,blockquote,216,,copy-rtl,240,,copy,264,,cut-rtl,288,,cut,312,,paste-rtl,336,,paste,360,,bgcolor,384,,textcolor,408,,templates-rtl,432,,templates,456,,creatediv,480,,find-rtl,504,,find,528,,replace,552,,flash,576,,button,600,,checkbox,624,,form,648,,hiddenfield,672,,imagebutton,696,,radio,720,,select-rtl,744,,select,768,,textarea-rtl,792,,textarea,816,,textfield-rtl,840,,textfield,864,,horizontalrule,888,,iframe,912,,image,936,,indent-rtl,960,,indent,984,,outdent-rtl,1008,,outdent,1032,,smiley,1056,,justifyblock,1080,,justifycenter,1104,,justifyleft,1128,,justifyright,1152,,language,1176,,anchor-rtl,1200,,anchor,1224,,link,1248,,unlink,1272,,bulletedlist-rtl,1296,,bulletedlist,1320,,numberedlist-rtl,1344,,numberedlist,1368,,maximize,1392,,newpage-rtl,1416,,newpage,1440,,pagebreak-rtl,1464,,pagebreak,1488,,pastetext-rtl,1512,,pastetext,1536,,pastefromword-rtl,1560,,pastefromword,1584,,preview-rtl,1608,,preview,1632,,print,1656,,removeformat,1680,,save,1704,,selectall,1728,,showblocks-rtl,1752,,showblocks,1776,,source-rtl,1800,,source,1824,,specialchar,1848,,scayt,1872,,table,1896,,redo-rtl,1920,,redo,1944,,undo-rtl,1968,,undo,1992,,spellchecker,2016,','icons_hidpi.png');else setIcons('about,0,auto,bold,24,auto,italic,48,auto,strike,72,auto,subscript,96,auto,superscript,120,auto,underline,144,auto,bidiltr,168,auto,bidirtl,192,auto,blockquote,216,auto,copy-rtl,240,auto,copy,264,auto,cut-rtl,288,auto,cut,312,auto,paste-rtl,336,auto,paste,360,auto,bgcolor,384,auto,textcolor,408,auto,templates-rtl,432,auto,templates,456,auto,creatediv,480,auto,find-rtl,504,auto,find,528,auto,replace,552,auto,flash,576,auto,button,600,auto,checkbox,624,auto,form,648,auto,hiddenfield,672,auto,imagebutton,696,auto,radio,720,auto,select-rtl,744,auto,select,768,auto,textarea-rtl,792,auto,textarea,816,auto,textfield-rtl,840,auto,textfield,864,auto,horizontalrule,888,auto,iframe,912,auto,image,936,auto,indent-rtl,960,auto,indent,984,auto,outdent-rtl,1008,auto,outdent,1032,auto,smiley,1056,auto,justifyblock,1080,auto,justifycenter,1104,auto,justifyleft,1128,auto,justifyright,1152,auto,language,1176,auto,anchor-rtl,1200,auto,anchor,1224,auto,link,1248,auto,unlink,1272,auto,bulletedlist-rtl,1296,auto,bulletedlist,1320,auto,numberedlist-rtl,1344,auto,numberedlist,1368,auto,maximize,1392,auto,newpage-rtl,1416,auto,newpage,1440,auto,pagebreak-rtl,1464,auto,pagebreak,1488,auto,pastetext-rtl,1512,auto,pastetext,1536,auto,pastefromword-rtl,1560,auto,pastefromword,1584,auto,preview-rtl,1608,auto,preview,1632,auto,print,1656,auto,removeformat,1680,auto,save,1704,auto,selectall,1728,auto,showblocks-rtl,1752,auto,showblocks,1776,auto,source-rtl,1800,auto,source,1824,auto,specialchar,1848,auto,scayt,1872,auto,table,1896,auto,redo-rtl,1920,auto,redo,1944,auto,undo-rtl,1968,auto,undo,1992,auto,spellchecker,2016,auto','icons.png');})();CKEDITOR.lang.languages={\"en\":1};}());"
  },
  {
    "path": "assets/ckeditor/config.js",
    "content": "/**\n * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n\nCKEDITOR.editorConfig = function( config ) {\n\t// Define changes to default configuration here. For example:\n\t// config.language = 'fr';\n\t// config.uiColor = '#AADC6E';\n        config.allowedContent = true;\n        config.extraPlugins = 'codemirror';\n};\n"
  },
  {
    "path": "assets/ckeditor/contents.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n\nbody\n{\n\t/* Font */\n\tfont-family: sans-serif, Arial, Verdana, \"Trebuchet MS\";\n\tfont-size: 12px;\n\n\t/* Text color */\n\tcolor: #333;\n\n\t/* Remove the background color to make it transparent */\n\tbackground-color: #fff;\n\n\tmargin: 20px;\n}\n\n.cke_editable\n{\n\tfont-size: 13px;\n\tline-height: 1.6;\n}\n\nblockquote\n{\n\tfont-style: italic;\n\tfont-family: Georgia, Times, \"Times New Roman\", serif;\n\tpadding: 2px 0;\n\tborder-style: solid;\n\tborder-color: #ccc;\n\tborder-width: 0;\n}\n\n.cke_contents_ltr blockquote\n{\n\tpadding-left: 20px;\n\tpadding-right: 8px;\n\tborder-left-width: 5px;\n}\n\n.cke_contents_rtl blockquote\n{\n\tpadding-left: 8px;\n\tpadding-right: 20px;\n\tborder-right-width: 5px;\n}\n\na\n{\n\tcolor: #0782C1;\n}\n\nol,ul,dl\n{\n\t/* IE7: reset rtl list margin. (#7334) */\n\t*margin-right: 0px;\n\t/* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/\n\tpadding: 0 40px;\n}\n\nh1,h2,h3,h4,h5,h6\n{\n\tfont-weight: normal;\n\tline-height: 1.2;\n}\n\nhr\n{\n\tborder: 0px;\n\tborder-top: 1px solid #ccc;\n}\n\nimg.right\n{\n\tborder: 1px solid #ccc;\n\tfloat: right;\n\tmargin-left: 15px;\n\tpadding: 5px;\n}\n\nimg.left\n{\n\tborder: 1px solid #ccc;\n\tfloat: left;\n\tmargin-right: 15px;\n\tpadding: 5px;\n}\n\npre\n{\n\twhite-space: pre-wrap; /* CSS 2.1 */\n\tword-wrap: break-word; /* IE7 */\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\n.marker\n{\n\tbackground-color: Yellow;\n}\n\nspan[lang]\n{\n\tfont-style: italic;\n}\n\nfigure\n{\n\ttext-align: center;\n\tborder: solid 1px #ccc;\n\tborder-radius: 2px;\n\tbackground: rgba(0,0,0,0.05);\n\tpadding: 10px;\n\tmargin: 10px 20px;\n\tdisplay: inline-block;\n}\n\nfigure > figcaption\n{\n\ttext-align: center;\n\tdisplay: block; /* For IE8 */\n}\n\na > img {\n\tpadding: 1px;\n\tmargin: 1px;\n\tborder: none;\n\toutline: 1px solid #0782C1;\n}\n"
  },
  {
    "path": "assets/ckeditor/lang/af.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['af']={\"editor\":\"Woordverwerker\",\"editorPanel\":\"Woordverwerkerpaneel\",\"common\":{\"editorHelp\":\"Druk op ALT 0 vir hulp\",\"browseServer\":\"Blaai op bediener\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Oplaai\",\"uploadSubmit\":\"Stuur aan die bediener\",\"image\":\"Beeld\",\"flash\":\"Flash\",\"form\":\"Vorm\",\"checkbox\":\"Merkhokkie\",\"radio\":\"Radioknoppie\",\"textField\":\"Teksveld\",\"textarea\":\"Teksarea\",\"hiddenField\":\"Versteekteveld\",\"button\":\"Knop\",\"select\":\"Keuseveld\",\"imageButton\":\"Beeldknop\",\"notSet\":\"<geen instelling>\",\"id\":\"Id\",\"name\":\"Naam\",\"langDir\":\"Skryfrigting\",\"langDirLtr\":\"Links na regs (LTR)\",\"langDirRtl\":\"Regs na links (RTL)\",\"langCode\":\"Taalkode\",\"longDescr\":\"Lang beskrywing URL\",\"cssClass\":\"CSS klasse\",\"advisoryTitle\":\"Aanbevole titel\",\"cssStyle\":\"Styl\",\"ok\":\"OK\",\"cancel\":\"Kanselleer\",\"close\":\"Sluit\",\"preview\":\"Voorbeeld\",\"resize\":\"Skalierung\",\"generalTab\":\"Algemeen\",\"advancedTab\":\"Gevorderd\",\"validateNumberFailed\":\"Hierdie waarde is nie 'n nommer nie.\",\"confirmNewPage\":\"Alle wysiginge sal verlore gaan. Is jy seker dat jy 'n nuwe bladsy wil laai?\",\"confirmCancel\":\"Sommige opsies is gewysig. Is jy seker dat jy hierdie dialoogvenster wil sluit?\",\"options\":\"Opsies\",\"target\":\"Teiken\",\"targetNew\":\"Nuwe venster (_blank)\",\"targetTop\":\"Boonste venster (_top)\",\"targetSelf\":\"Selfde venster (_self)\",\"targetParent\":\"Oorspronklike venster (_parent)\",\"langDirLTR\":\"Links na Regs (LTR)\",\"langDirRTL\":\"Regs na Links (RTL)\",\"styles\":\"Styl\",\"cssClasses\":\"CSS klasse\",\"width\":\"Breedte\",\"height\":\"Hoogte\",\"align\":\"Orienteerung\",\"alignLeft\":\"Links\",\"alignRight\":\"Regs\",\"alignCenter\":\"Middel\",\"alignJustify\":\"Eweredig\",\"alignTop\":\"Bo\",\"alignMiddle\":\"Middel\",\"alignBottom\":\"Onder\",\"alignNone\":\"Geen\",\"invalidValue\":\"Ongeldige waarde\",\"invalidHeight\":\"Hoogte moet 'n getal wees\",\"invalidWidth\":\"Breedte moet 'n getal wees.\",\"invalidCssLength\":\"Die waarde vir die \\\"%1\\\" veld moet 'n posetiewe getal wees met of sonder 'n geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).\",\"invalidHtmlLength\":\"Die waarde vir die  \\\"%1\\\" veld moet 'n posetiewe getal wees met of sonder 'n geldige HTML eenheid (px of %).\",\"invalidInlineStyle\":\"Ongeldige CSS. Formaat is een of meer sleutel-wert paare, \\\"naam : wert\\\" met kommapunte gesky.\",\"cssLengthTooltip\":\"Voeg 'n getal wert in pixel in, of 'n waarde met geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nie beskikbaar nie</span>\"},\"about\":{\"copy\":\"Kopiereg &copy; $1. Alle regte voorbehou.\",\"dlgTitle\":\"Meer oor CKEditor\",\"help\":\"Slaan $1 na vir hulp.\",\"moreInfo\":\"Vir lisensie-informasie, besoek asb. ons webwerf:\",\"title\":\"Meer oor CKEditor\",\"userGuide\":\"CKEditor Gebruikers gits\"},\"basicstyles\":{\"bold\":\"Vet\",\"italic\":\"Skuins\",\"strike\":\"Deurgestreep\",\"subscript\":\"Onderskrif\",\"superscript\":\"Bo-skrif\",\"underline\":\"Onderstreep\"},\"bidi\":{\"ltr\":\"Skryfrigting van links na regs\",\"rtl\":\"Skryfrigting van regs na links\"},\"blockquote\":{\"toolbar\":\"Sitaatblok\"},\"clipboard\":{\"copy\":\"Kopiëer\",\"copyError\":\"U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).\",\"cut\":\"Knip\",\"cutError\":\"U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).\",\"paste\":\"Plak\",\"pasteArea\":\"Plak-area\",\"pasteMsg\":\"Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.\",\"securityMsg\":\"Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.\",\"title\":\"Byvoeg\"},\"button\":{\"selectedLabel\":\"%1 uitgekies\"},\"colorbutton\":{\"auto\":\"Outomaties\",\"bgColorTitle\":\"Agtergrondkleur\",\"colors\":{\"000\":\"Swart\",\"800000\":\"Meroen\",\"8B4513\":\"Sjokoladebruin\",\"2F4F4F\":\"Donkerleisteengrys\",\"008080\":\"Blougroen\",\"000080\":\"Vlootblou\",\"4B0082\":\"Indigo\",\"696969\":\"Donkergrys\",\"B22222\":\"Rooibaksteen\",\"A52A2A\":\"Bruin\",\"DAA520\":\"Donkergeel\",\"006400\":\"Donkergroen\",\"40E0D0\":\"Turkoois\",\"0000CD\":\"Middelblou\",\"800080\":\"Pers\",\"808080\":\"Grys\",\"F00\":\"Rooi\",\"FF8C00\":\"Donkeroranje\",\"FFD700\":\"Goud\",\"008000\":\"Groen\",\"0FF\":\"Siaan\",\"00F\":\"Blou\",\"EE82EE\":\"Viooltjieblou\",\"A9A9A9\":\"Donkergrys\",\"FFA07A\":\"Ligsalm\",\"FFA500\":\"Oranje\",\"FFFF00\":\"Geel\",\"00FF00\":\"Lemmetjie\",\"AFEEEE\":\"Ligturkoois\",\"ADD8E6\":\"Ligblou\",\"DDA0DD\":\"Pruim\",\"D3D3D3\":\"Liggrys\",\"FFF0F5\":\"Linne\",\"FAEBD7\":\"Ivoor\",\"FFFFE0\":\"Liggeel\",\"F0FFF0\":\"Heuningdou\",\"F0FFFF\":\"Asuur\",\"F0F8FF\":\"Ligte hemelsblou\",\"E6E6FA\":\"Laventel\",\"FFF\":\"Wit\"},\"more\":\"Meer Kleure...\",\"panelTitle\":\"Kleure\",\"textColorTitle\":\"Tekskleur\"},\"colordialog\":{\"clear\":\"Herstel\",\"highlight\":\"Aktief\",\"options\":\"Kleuropsies\",\"selected\":\"Geselekteer\",\"title\":\"Kies kleur\"},\"templates\":{\"button\":\"Sjablone\",\"emptyListMsg\":\"(Geen sjablone gedefineer nie)\",\"insertOption\":\"Vervang huidige inhoud\",\"options\":\"Sjabloon opsies\",\"selectPromptMsg\":\"Kies die sjabloon om te gebruik in die redigeerder (huidige inhoud gaan verlore):\",\"title\":\"Inhoud Sjablone\"},\"contextmenu\":{\"options\":\"Konteks Spyskaart-opsies\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Aanbevole Titel\",\"cssClassInputLabel\":\"CSS klasse\",\"edit\":\"Wysig Div\",\"inlineStyleInputLabel\":\"Inlyn Styl\",\"langDirLTRLabel\":\"Links na regs (LTR)\",\"langDirLabel\":\"Skryfrigting\",\"langDirRTLLabel\":\"Regs na links (RTL)\",\"languageCodeInputLabel\":\" Taalkode\",\"remove\":\"Verwyder Div\",\"styleSelectLabel\":\"Styl\",\"title\":\"Skep Div houer\",\"toolbar\":\"Skep Div houer\"},\"toolbar\":{\"toolbarCollapse\":\"Verklein werkbalk\",\"toolbarExpand\":\"Vergroot werkbalk\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Knipbord/Undo\",\"editing\":\"Verander\",\"forms\":\"Vorms\",\"basicstyles\":\"Eenvoudige Styl\",\"paragraph\":\"Paragraaf\",\"links\":\"Skakels\",\"insert\":\"Toevoeg\",\"styles\":\"Style\",\"colors\":\"Kleure\",\"tools\":\"Gereedskap\"},\"toolbars\":\"Werkbalke\"},\"elementspath\":{\"eleLabel\":\"Elemente-pad\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Soek\",\"findOptions\":\"Find Options\",\"findWhat\":\"Soek na:\",\"matchCase\":\"Hoof/kleinletter sensitief\",\"matchCyclic\":\"Soek deurlopend\",\"matchWord\":\"Hele woord moet voorkom\",\"notFoundMsg\":\"Teks nie gevind nie.\",\"replace\":\"Vervang\",\"replaceAll\":\"Vervang alles\",\"replaceSuccessMsg\":\"%1 voorkoms(te) vervang.\",\"replaceWith\":\"Vervang met:\",\"title\":\"Soek en vervang\"},\"fakeobjects\":{\"anchor\":\"Anker\",\"flash\":\"Flash animasie\",\"hiddenfield\":\"Verborge veld\",\"iframe\":\"IFrame\",\"unknown\":\"Onbekende objek\"},\"flash\":{\"access\":\"Skrip toegang\",\"accessAlways\":\"Altyd\",\"accessNever\":\"Nooit\",\"accessSameDomain\":\"Selfde domeinnaam\",\"alignAbsBottom\":\"Absoluut-onder\",\"alignAbsMiddle\":\"Absoluut-middel\",\"alignBaseline\":\"Basislyn\",\"alignTextTop\":\"Teks bo\",\"bgcolor\":\"Agtergrondkleur\",\"chkFull\":\"Laat volledige skerm toe\",\"chkLoop\":\"Herhaal\",\"chkMenu\":\"Flash spyskaart aan\",\"chkPlay\":\"Speel outomaties\",\"flashvars\":\"Veranderlikes vir Flash\",\"hSpace\":\"HSpasie\",\"properties\":\"Flash eienskappe\",\"propertiesTab\":\"Eienskappe\",\"quality\":\"Kwaliteit\",\"qualityAutoHigh\":\"Outomaties hoog\",\"qualityAutoLow\":\"Outomaties laag\",\"qualityBest\":\"Beste\",\"qualityHigh\":\"Hoog\",\"qualityLow\":\"Laag\",\"qualityMedium\":\"Gemiddeld\",\"scale\":\"Skaal\",\"scaleAll\":\"Wys alles\",\"scaleFit\":\"Presiese pas\",\"scaleNoBorder\":\"Geen rand\",\"title\":\"Flash eienskappe\",\"vSpace\":\"VSpasie\",\"validateHSpace\":\"HSpasie moet 'n heelgetal wees.\",\"validateSrc\":\"Voeg die URL in\",\"validateVSpace\":\"VSpasie moet 'n heelgetal wees.\",\"windowMode\":\"Venster modus\",\"windowModeOpaque\":\"Ondeursigtig\",\"windowModeTransparent\":\"Deursigtig\",\"windowModeWindow\":\"Venster\"},\"font\":{\"fontSize\":{\"label\":\"Grootte\",\"voiceLabel\":\"Fontgrootte\",\"panelTitle\":\"Fontgrootte\"},\"label\":\"Font\",\"panelTitle\":\"Fontnaam\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Knop eienskappe\",\"text\":\"Teks (Waarde)\",\"type\":\"Soort\",\"typeBtn\":\"Knop\",\"typeSbm\":\"Stuur\",\"typeRst\":\"Maak leeg\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Merkhokkie eienskappe\",\"radioTitle\":\"Radioknoppie eienskappe\",\"value\":\"Waarde\",\"selected\":\"Geselekteer\",\"required\":\"Required\"},\"form\":{\"title\":\"Vorm eienskappe\",\"menu\":\"Vorm eienskappe\",\"action\":\"Aksie\",\"method\":\"Metode\",\"encoding\":\"Kodering\"},\"hidden\":{\"title\":\"Verborge veld eienskappe\",\"name\":\"Naam\",\"value\":\"Waarde\"},\"select\":{\"title\":\"Keuseveld eienskappe\",\"selectInfo\":\"Info\",\"opAvail\":\"Beskikbare opsies\",\"value\":\"Waarde\",\"size\":\"Grootte\",\"lines\":\"Lyne\",\"chkMulti\":\"Laat meer as een keuse toe\",\"required\":\"Required\",\"opText\":\"Teks\",\"opValue\":\"Waarde\",\"btnAdd\":\"Byvoeg\",\"btnModify\":\"Wysig\",\"btnUp\":\"Op\",\"btnDown\":\"Af\",\"btnSetValue\":\"Stel as geselekteerde waarde\",\"btnDelete\":\"Verwyder\"},\"textarea\":{\"title\":\"Teks-area eienskappe\",\"cols\":\"Kolomme\",\"rows\":\"Rye\"},\"textfield\":{\"title\":\"Teksveld eienskappe\",\"name\":\"Naam\",\"value\":\"Waarde\",\"charWidth\":\"Breedte (karakters)\",\"maxChars\":\"Maksimum karakters\",\"required\":\"Required\",\"type\":\"Soort\",\"typeText\":\"Teks\",\"typePass\":\"Wagwoord\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Opmaak\",\"panelTitle\":\"Opmaak\",\"tag_address\":\"Adres\",\"tag_div\":\"Normaal (DIV)\",\"tag_h1\":\"Opskrif 1\",\"tag_h2\":\"Opskrif 2\",\"tag_h3\":\"Opskrif 3\",\"tag_h4\":\"Opskrif 4\",\"tag_h5\":\"Opskrif 5\",\"tag_h6\":\"Opskrif 6\",\"tag_p\":\"Normaal\",\"tag_pre\":\"Opgemaak\"},\"horizontalrule\":{\"toolbar\":\"Horisontale lyn invoeg\"},\"iframe\":{\"border\":\"Wys rand van raam\",\"noUrl\":\"Gee die iframe URL\",\"scrolling\":\"Skuifbalke aan\",\"title\":\"IFrame Eienskappe\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatiewe teks\",\"border\":\"Rand\",\"btnUpload\":\"Stuur na bediener\",\"button2Img\":\"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?\",\"hSpace\":\"HSpasie\",\"img2Button\":\"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?\",\"infoTab\":\"Afbeelding informasie\",\"linkTab\":\"Skakel\",\"lockRatio\":\"Vaste proporsie\",\"menu\":\"Afbeelding eienskappe\",\"resetSize\":\"Herstel grootte\",\"title\":\"Afbeelding eienskappe\",\"titleButton\":\"Afbeeldingsknop eienskappe\",\"upload\":\"Oplaai\",\"urlMissing\":\"Die URL na die afbeelding ontbreek.\",\"vSpace\":\"VSpasie\",\"validateBorder\":\"Rand moet 'n heelgetal wees.\",\"validateHSpace\":\"HSpasie moet 'n heelgetal wees.\",\"validateVSpace\":\"VSpasie moet 'n heelgetal wees.\"},\"indent\":{\"indent\":\"Vergroot inspring\",\"outdent\":\"Verklein inspring\"},\"smiley\":{\"options\":\"Lagbekkie opsies\",\"title\":\"Voeg lagbekkie by\",\"toolbar\":\"Lagbekkie\"},\"justify\":{\"block\":\"Uitvul\",\"center\":\"Sentreer\",\"left\":\"Links oplyn\",\"right\":\"Regs oplyn\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Toegangsleutel\",\"advanced\":\"Gevorderd\",\"advisoryContentType\":\"Aanbevole inhoudstipe\",\"advisoryTitle\":\"Aanbevole titel\",\"anchor\":{\"toolbar\":\"Anker byvoeg/verander\",\"menu\":\"Anker-eienskappe\",\"title\":\"Anker-eienskappe\",\"name\":\"Ankernaam\",\"errorName\":\"Voltooi die ankernaam asseblief\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Op element Id\",\"anchorName\":\"Op ankernaam\",\"charset\":\"Karakterstel van geskakelde bron\",\"cssClasses\":\"CSS klasse\",\"emailAddress\":\"E-posadres\",\"emailBody\":\"Berig-inhoud\",\"emailSubject\":\"Berig-onderwerp\",\"id\":\"Id\",\"info\":\"Skakel informasie\",\"langCode\":\"Taalkode\",\"langDir\":\"Skryfrigting\",\"langDirLTR\":\"Links na regs (LTR)\",\"langDirRTL\":\"Regs na links (RTL)\",\"menu\":\"Wysig skakel\",\"name\":\"Naam\",\"noAnchors\":\"(Geen ankers beskikbaar in dokument)\",\"noEmail\":\"Gee die e-posadres\",\"noUrl\":\"Gee die skakel se URL\",\"other\":\"<ander>\",\"popupDependent\":\"Afhanklik (Netscape)\",\"popupFeatures\":\"Eienskappe van opspringvenster\",\"popupFullScreen\":\"Volskerm (IE)\",\"popupLeft\":\"Posisie links\",\"popupLocationBar\":\"Adresbalk\",\"popupMenuBar\":\"Spyskaartbalk\",\"popupResizable\":\"Herskaalbaar\",\"popupScrollBars\":\"Skuifbalke\",\"popupStatusBar\":\"Statusbalk\",\"popupToolbar\":\"Werkbalk\",\"popupTop\":\"Posisie bo\",\"rel\":\"Relationship\",\"selectAnchor\":\"Kies 'n anker\",\"styles\":\"Styl\",\"tabIndex\":\"Tab indeks\",\"target\":\"Doel\",\"targetFrame\":\"<raam>\",\"targetFrameName\":\"Naam van doelraam\",\"targetPopup\":\"<opspringvenster>\",\"targetPopupName\":\"Naam van opspringvenster\",\"title\":\"Skakel\",\"toAnchor\":\"Anker in bladsy\",\"toEmail\":\"E-pos\",\"toUrl\":\"URL\",\"toolbar\":\"Skakel invoeg/wysig\",\"type\":\"Skakelsoort\",\"unlink\":\"Verwyder skakel\",\"upload\":\"Oplaai\"},\"list\":{\"bulletedlist\":\"Ongenommerde lys\",\"numberedlist\":\"Genommerde lys\"},\"liststyle\":{\"armenian\":\"Armeense nommering\",\"bulletedTitle\":\"Eienskappe van ongenommerde lys\",\"circle\":\"Sirkel\",\"decimal\":\"Desimale syfers (1, 2, 3, ens.)\",\"decimalLeadingZero\":\"Desimale syfers met voorloopnul (01, 02, 03, ens.)\",\"disc\":\"Skyf\",\"georgian\":\"Georgiese nommering (an, ban, gan, ens.)\",\"lowerAlpha\":\"Kleinletters (a, b, c, d, e, ens.)\",\"lowerGreek\":\"Griekse kleinletters (alpha, beta, gamma, ens.)\",\"lowerRoman\":\"Romeinse kleinletters (i, ii, iii, iv, v, ens.)\",\"none\":\"Geen\",\"notset\":\"<nie ingestel nie>\",\"numberedTitle\":\"Eienskappe van genommerde lys\",\"square\":\"Vierkant\",\"start\":\"Begin\",\"type\":\"Tipe\",\"upperAlpha\":\"Hoofletters (A, B, C, D, E, ens.)\",\"upperRoman\":\"Romeinse hoofletters (I, II, III, IV, V, ens.)\",\"validateStartNumber\":\"Beginnommer van lys moet 'n heelgetal wees.\"},\"magicline\":{\"title\":\"Voeg paragraaf hier in\"},\"maximize\":{\"maximize\":\"Maksimaliseer\",\"minimize\":\"Minimaliseer\"},\"newpage\":{\"toolbar\":\"Nuwe bladsy\"},\"pagebreak\":{\"alt\":\"Bladsy-einde\",\"toolbar\":\"Bladsy-einde invoeg\"},\"pastetext\":{\"button\":\"Plak as eenvoudige teks\",\"title\":\"Plak as eenvoudige teks\"},\"pastefromword\":{\"confirmCleanup\":\"Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?\",\"error\":\"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout\",\"title\":\"Plak vanuit Word\",\"toolbar\":\"Plak vanuit Word\"},\"preview\":{\"preview\":\"Voorbeeld\"},\"print\":{\"toolbar\":\"Druk\"},\"removeformat\":{\"toolbar\":\"Verwyder opmaak\"},\"save\":{\"toolbar\":\"Bewaar\"},\"selectall\":{\"toolbar\":\"Selekteer alles\"},\"showblocks\":{\"toolbar\":\"Toon blokke\"},\"sourcearea\":{\"toolbar\":\"Bron\"},\"specialchar\":{\"options\":\"Spesiale karakter-opsies\",\"title\":\"Kies spesiale karakter\",\"toolbar\":\"Voeg spesiaale karakter in\"},\"scayt\":{\"btn_about\":\"SCAYT info\",\"btn_dictionaries\":\"Woordeboeke\",\"btn_disable\":\"SCAYT af\",\"btn_enable\":\"SCAYT aan\",\"btn_langs\":\"Tale\",\"btn_options\":\"Opsies\",\"text_title\":\"Speltoets terwyl u tik\"},\"stylescombo\":{\"label\":\"Styl\",\"panelTitle\":\"Vormaat style\",\"panelTitle1\":\"Blok style\",\"panelTitle2\":\"Inlyn style\",\"panelTitle3\":\"Objek style\"},\"table\":{\"border\":\"Randbreedte\",\"caption\":\"Naam\",\"cell\":{\"menu\":\"Sel\",\"insertBefore\":\"Voeg sel in voor\",\"insertAfter\":\"Voeg sel in na\",\"deleteCell\":\"Verwyder sel\",\"merge\":\"Voeg selle saam\",\"mergeRight\":\"Voeg saam na regs\",\"mergeDown\":\"Voeg saam ondertoe\",\"splitHorizontal\":\"Splits sel horisontaal\",\"splitVertical\":\"Splits sel vertikaal\",\"title\":\"Sel eienskappe\",\"cellType\":\"Sel tipe\",\"rowSpan\":\"Omspan rye\",\"colSpan\":\"Omspan kolomme\",\"wordWrap\":\"Woord terugloop\",\"hAlign\":\"Horisontale oplyning\",\"vAlign\":\"Vertikale oplyning\",\"alignBaseline\":\"Basislyn\",\"bgColor\":\"Agtergrondkleur\",\"borderColor\":\"Randkleur\",\"data\":\"Inhoud\",\"header\":\"Opskrif\",\"yes\":\"Ja\",\"no\":\"Nee\",\"invalidWidth\":\"Selbreedte moet 'n getal wees.\",\"invalidHeight\":\"Selhoogte moet 'n getal wees.\",\"invalidRowSpan\":\"Omspan rye moet 'n heelgetal wees.\",\"invalidColSpan\":\"Omspan kolomme moet 'n heelgetal wees.\",\"chooseColor\":\"Kies\"},\"cellPad\":\"Sel-spasie\",\"cellSpace\":\"Sel-afstand\",\"column\":{\"menu\":\"Kolom\",\"insertBefore\":\"Voeg kolom in voor\",\"insertAfter\":\"Voeg kolom in na\",\"deleteColumn\":\"Verwyder kolom\"},\"columns\":\"Kolomme\",\"deleteTable\":\"Verwyder tabel\",\"headers\":\"Opskrifte\",\"headersBoth\":\"Beide    \",\"headersColumn\":\"Eerste kolom\",\"headersNone\":\"Geen\",\"headersRow\":\"Eerste ry\",\"invalidBorder\":\"Randbreedte moet 'n getal wees.\",\"invalidCellPadding\":\"Sel-spasie moet 'n getal wees.\",\"invalidCellSpacing\":\"Sel-afstand moet 'n getal wees.\",\"invalidCols\":\"Aantal kolomme moet 'n getal groter as 0 wees.\",\"invalidHeight\":\"Tabelhoogte moet 'n getal wees.\",\"invalidRows\":\"Aantal rye moet 'n getal groter as 0 wees.\",\"invalidWidth\":\"Tabelbreedte moet 'n getal wees.\",\"menu\":\"Tabel eienskappe\",\"row\":{\"menu\":\"Ry\",\"insertBefore\":\"Voeg ry in voor\",\"insertAfter\":\"Voeg ry in na\",\"deleteRow\":\"Verwyder ry\"},\"rows\":\"Rye\",\"summary\":\"Opsomming\",\"title\":\"Tabel eienskappe\",\"toolbar\":\"Tabel\",\"widthPc\":\"persent\",\"widthPx\":\"piksels\",\"widthUnit\":\"breedte-eenheid\"},\"undo\":{\"redo\":\"Oordoen\",\"undo\":\"Ontdoen\"},\"wsc\":{\"btnIgnore\":\"Ignoreer\",\"btnIgnoreAll\":\"Ignoreer alles\",\"btnReplace\":\"Vervang\",\"btnReplaceAll\":\"vervang alles\",\"btnUndo\":\"Ontdoen\",\"changeTo\":\"Verander na\",\"errorLoading\":\"Fout by inlaai van diens: %s.\",\"ieSpellDownload\":\"Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?\",\"manyChanges\":\"Klaar met speltoets: %1 woorde verander\",\"noChanges\":\"Klaar met speltoets: Geen woorde verander nie\",\"noMispell\":\"Klaar met speltoets: Geen foute nie\",\"noSuggestions\":\"- Geen voorstel -\",\"notAvailable\":\"Jammer, hierdie diens is nie nou beskikbaar nie.\",\"notInDic\":\"Nie in woordeboek nie\",\"oneChange\":\"Klaar met speltoets: Een woord verander\",\"progress\":\"Spelling word getoets...\",\"title\":\"Speltoetser\",\"toolbar\":\"Speltoets\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ar.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ar']={\"editor\":\"محرر النص الغني\",\"editorPanel\":\"لائحة محرر النص المنسق\",\"common\":{\"editorHelp\":\"إضغط على ALT + 0 للحصول على المساعدة.\",\"browseServer\":\"تصفح\",\"url\":\"الرابط\",\"protocol\":\"البروتوكول\",\"upload\":\"رفع\",\"uploadSubmit\":\"أرسل\",\"image\":\"صورة\",\"flash\":\"فلاش\",\"form\":\"نموذج\",\"checkbox\":\"خانة إختيار\",\"radio\":\"زر اختيار\",\"textField\":\"مربع نص\",\"textarea\":\"مساحة نصية\",\"hiddenField\":\"إدراج حقل خفي\",\"button\":\"زر ضغط\",\"select\":\"اختار\",\"imageButton\":\"زر صورة\",\"notSet\":\"<بدون تحديد>\",\"id\":\"الرقم\",\"name\":\"إسم\",\"langDir\":\"إتجاه النص\",\"langDirLtr\":\"اليسار لليمين (LTR)\",\"langDirRtl\":\"اليمين لليسار (RTL)\",\"langCode\":\"رمز اللغة\",\"longDescr\":\"الوصف التفصيلى\",\"cssClass\":\"فئات التنسيق\",\"advisoryTitle\":\"عنوان التقرير\",\"cssStyle\":\"نمط\",\"ok\":\"موافق\",\"cancel\":\"إلغاء الأمر\",\"close\":\"أغلق\",\"preview\":\"استعراض\",\"resize\":\"تغيير الحجم\",\"generalTab\":\"عام\",\"advancedTab\":\"متقدم\",\"validateNumberFailed\":\"لايوجد نتيجة\",\"confirmNewPage\":\"ستفقد أي متغييرات اذا لم تقم بحفظها اولا. هل أنت متأكد أنك تريد صفحة جديدة؟\",\"confirmCancel\":\"بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟\",\"options\":\"خيارات\",\"target\":\"هدف الرابط\",\"targetNew\":\"نافذة جديدة\",\"targetTop\":\"النافذة الأعلى\",\"targetSelf\":\"داخل النافذة\",\"targetParent\":\"النافذة الأم\",\"langDirLTR\":\"اليسار لليمين (LTR)\",\"langDirRTL\":\"اليمين لليسار (RTL)\",\"styles\":\"نمط\",\"cssClasses\":\"فئات التنسيق\",\"width\":\"العرض\",\"height\":\"الإرتفاع\",\"align\":\"محاذاة\",\"alignLeft\":\"يسار\",\"alignRight\":\"يمين\",\"alignCenter\":\"وسط\",\"alignJustify\":\"ضبط\",\"alignTop\":\"أعلى\",\"alignMiddle\":\"وسط\",\"alignBottom\":\"أسفل\",\"alignNone\":\"None\",\"invalidValue\":\"قيمة غير مفبولة.\",\"invalidHeight\":\"الارتفاع يجب أن يكون عدداً.\",\"invalidWidth\":\"العرض يجب أن يكون عدداً.\",\"invalidCssLength\":\"قيمة الخانة المخصصة لـ \\\"%1\\\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة CSS قياس مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"قيمة الخانة المخصصة لـ \\\"%1\\\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة HTML قياس مقبولة (px or %).\",\"invalidInlineStyle\":\"قيمة الخانة المخصصة لـ  Inline Style يجب أن تختوي على مجموع واحد أو أكثر بالشكل التالي: \\\"name : value\\\", مفصولة بفاصلة منقزطة.\",\"cssLengthTooltip\":\"أدخل رقما للقيمة بالبكسل أو رقما بوحدة CSS مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, غير متاح</span>\"},\"about\":{\"copy\":\"حقوق النشر &copy; $1. جميع الحقوق محفوظة.\",\"dlgTitle\":\"عن CKEditor\",\"help\":\"راجع $1 من أجل المساعدة\",\"moreInfo\":\"للحصول على معلومات الترخيص ، يرجى زيارة موقعنا:\",\"title\":\"عن CKEditor\",\"userGuide\":\"دليل مستخدم CKEditor.\"},\"basicstyles\":{\"bold\":\"عريض\",\"italic\":\"مائل\",\"strike\":\"يتوسطه خط\",\"subscript\":\"منخفض\",\"superscript\":\"مرتفع\",\"underline\":\"تسطير\"},\"bidi\":{\"ltr\":\"إتجاه النص من اليسار إلى اليمين\",\"rtl\":\"إتجاه النص من اليمين إلى اليسار\"},\"blockquote\":{\"toolbar\":\"اقتباس\"},\"clipboard\":{\"copy\":\"نسخ\",\"copyError\":\"الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).\",\"cut\":\"قص\",\"cutError\":\"الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).\",\"paste\":\"لصق\",\"pasteArea\":\"منطقة اللصق\",\"pasteMsg\":\"الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) في لوحة المفاتيح، ثم اضغط زر  <STRONG>موافق</STRONG>.\",\"securityMsg\":\"نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.\",\"title\":\"لصق\"},\"button\":{\"selectedLabel\":\"%1 (محدد)\"},\"colorbutton\":{\"auto\":\"تلقائي\",\"bgColorTitle\":\"لون الخلفية\",\"colors\":{\"000\":\"أسود\",\"800000\":\"كستنائي\",\"8B4513\":\"بني فاتح\",\"2F4F4F\":\"رمادي أردوازي غامق\",\"008080\":\"أزرق مخضر\",\"000080\":\"أزرق داكن\",\"4B0082\":\"كحلي\",\"696969\":\"رمادي داكن\",\"B22222\":\"طوبي\",\"A52A2A\":\"بني\",\"DAA520\":\"ذهبي داكن\",\"006400\":\"أخضر داكن\",\"40E0D0\":\"فيروزي\",\"0000CD\":\"أزرق متوسط\",\"800080\":\"بنفسجي غامق\",\"808080\":\"رمادي\",\"F00\":\"أحمر\",\"FF8C00\":\"برتقالي داكن\",\"FFD700\":\"ذهبي\",\"008000\":\"أخضر\",\"0FF\":\"تركواز\",\"00F\":\"أزرق\",\"EE82EE\":\"بنفسجي\",\"A9A9A9\":\"رمادي شاحب\",\"FFA07A\":\"برتقالي وردي\",\"FFA500\":\"برتقالي\",\"FFFF00\":\"أصفر\",\"00FF00\":\"ليموني\",\"AFEEEE\":\"فيروزي شاحب\",\"ADD8E6\":\"أزرق فاتح\",\"DDA0DD\":\"بنفسجي فاتح\",\"D3D3D3\":\"رمادي فاتح\",\"FFF0F5\":\"وردي فاتح\",\"FAEBD7\":\"أبيض عتيق\",\"FFFFE0\":\"أصفر فاتح\",\"F0FFF0\":\"أبيض مائل للأخضر\",\"F0FFFF\":\"سماوي\",\"F0F8FF\":\"لبني\",\"E6E6FA\":\"أرجواني\",\"FFF\":\"أبيض\"},\"more\":\"ألوان إضافية...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"لون النص\"},\"colordialog\":{\"clear\":\"مسح\",\"highlight\":\"تحديد\",\"options\":\"اختيارات الألوان\",\"selected\":\"اللون المختار\",\"title\":\"اختر اللون\"},\"templates\":{\"button\":\"القوالب\",\"emptyListMsg\":\"(لم يتم تعريف أي قالب)\",\"insertOption\":\"استبدال المحتوى\",\"options\":\"خصائص القوالب\",\"selectPromptMsg\":\"اختر القالب الذي تود وضعه في المحرر\",\"title\":\"قوالب المحتوى\"},\"contextmenu\":{\"options\":\"خصائص قائمة السياق\"},\"div\":{\"IdInputLabel\":\"هوية\",\"advisoryTitleInputLabel\":\"عنوان التقرير\",\"cssClassInputLabel\":\"فئات التنسيق\",\"edit\":\"تحرير Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"اليسار لليمين (LTR)\",\"langDirLabel\":\"إتجاه النص\",\"langDirRTLLabel\":\"اليمين لليسار (RTL)\",\"languageCodeInputLabel\":\"رمز اللغة\",\"remove\":\"إزالة Div\",\"styleSelectLabel\":\"نمط\",\"title\":\"إحداث Div Container\",\"toolbar\":\"إحداث Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"تقليص شريط الأدوت\",\"toolbarExpand\":\"تمديد شريط الأدوات\",\"toolbarGroups\":{\"document\":\"مستند\",\"clipboard\":\"الحافظة/الرجوع\",\"editing\":\"تحرير\",\"forms\":\"نماذج\",\"basicstyles\":\"نمط بسيط\",\"paragraph\":\"فقرة\",\"links\":\"روابط\",\"insert\":\"إدراج\",\"styles\":\"أنماط\",\"colors\":\"ألوان\",\"tools\":\"أدوات\"},\"toolbars\":\"أشرطة أدوات المحرر\"},\"elementspath\":{\"eleLabel\":\"مسار العنصر\",\"eleTitle\":\"عنصر 1%\"},\"find\":{\"find\":\"بحث\",\"findOptions\":\"Find Options\",\"findWhat\":\"البحث بـ:\",\"matchCase\":\"مطابقة حالة الأحرف\",\"matchCyclic\":\"مطابقة دورية\",\"matchWord\":\"مطابقة بالكامل\",\"notFoundMsg\":\"لم يتم العثور على النص المحدد.\",\"replace\":\"إستبدال\",\"replaceAll\":\"إستبدال الكل\",\"replaceSuccessMsg\":\"تم استبدال 1% من الحالات \",\"replaceWith\":\"إستبدال بـ:\",\"title\":\"بحث واستبدال\"},\"fakeobjects\":{\"anchor\":\"إرساء\",\"flash\":\"رسم متحرك بالفلاش\",\"hiddenfield\":\"إدراج حقل خفي\",\"iframe\":\"iframe\",\"unknown\":\"عنصر غير معروف\"},\"flash\":{\"access\":\"دخول النص البرمجي\",\"accessAlways\":\"دائماً\",\"accessNever\":\"مطلقاً\",\"accessSameDomain\":\"نفس النطاق\",\"alignAbsBottom\":\"أسفل النص\",\"alignAbsMiddle\":\"وسط السطر\",\"alignBaseline\":\"على السطر\",\"alignTextTop\":\"أعلى النص\",\"bgcolor\":\"لون الخلفية\",\"chkFull\":\"ملء الشاشة\",\"chkLoop\":\"تكرار\",\"chkMenu\":\"تمكين قائمة فيلم الفلاش\",\"chkPlay\":\"تشغيل تلقائي\",\"flashvars\":\"متغيرات الفلاش\",\"hSpace\":\"تباعد أفقي\",\"properties\":\"خصائص الفلاش\",\"propertiesTab\":\"الخصائص\",\"quality\":\"جودة\",\"qualityAutoHigh\":\"عالية تلقائياً\",\"qualityAutoLow\":\"منخفضة تلقائياً\",\"qualityBest\":\"أفضل\",\"qualityHigh\":\"عالية\",\"qualityLow\":\"منخفضة\",\"qualityMedium\":\"متوسطة\",\"scale\":\"الحجم\",\"scaleAll\":\"إظهار الكل\",\"scaleFit\":\"ضبط تام\",\"scaleNoBorder\":\"بلا حدود\",\"title\":\"خصائص فيلم الفلاش\",\"vSpace\":\"تباعد عمودي\",\"validateHSpace\":\"HSpace يجب أن يكون عدداً.\",\"validateSrc\":\"فضلاً أدخل عنوان الموقع الذي يشير إليه الرابط\",\"validateVSpace\":\"VSpace يجب أن يكون عدداً.\",\"windowMode\":\"وضع النافذة\",\"windowModeOpaque\":\"غير شفاف\",\"windowModeTransparent\":\"شفاف\",\"windowModeWindow\":\"نافذة\"},\"font\":{\"fontSize\":{\"label\":\"حجم الخط\",\"voiceLabel\":\"حجم الخط\",\"panelTitle\":\"حجم الخط\"},\"label\":\"خط\",\"panelTitle\":\"حجم الخط\",\"voiceLabel\":\"حجم الخط\"},\"forms\":{\"button\":{\"title\":\"خصائص زر الضغط\",\"text\":\"القيمة/التسمية\",\"type\":\"نوع الزر\",\"typeBtn\":\"زر\",\"typeSbm\":\"إرسال\",\"typeRst\":\"إعادة تعيين\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"خصائص خانة الإختيار\",\"radioTitle\":\"خصائص زر الخيار\",\"value\":\"القيمة\",\"selected\":\"محدد\",\"required\":\"Required\"},\"form\":{\"title\":\"خصائص النموذج\",\"menu\":\"خصائص النموذج\",\"action\":\"اسم الملف\",\"method\":\"الأسلوب\",\"encoding\":\"تشفير\"},\"hidden\":{\"title\":\"خصائص الحقل المخفي\",\"name\":\"الاسم\",\"value\":\"القيمة\"},\"select\":{\"title\":\"خصائص اختيار الحقل\",\"selectInfo\":\"اختار معلومات\",\"opAvail\":\"الخيارات المتاحة\",\"value\":\"القيمة\",\"size\":\"الحجم\",\"lines\":\"الأسطر\",\"chkMulti\":\"السماح بتحديدات متعددة\",\"required\":\"Required\",\"opText\":\"النص\",\"opValue\":\"القيمة\",\"btnAdd\":\"إضافة\",\"btnModify\":\"تعديل\",\"btnUp\":\"أعلى\",\"btnDown\":\"أسفل\",\"btnSetValue\":\"إجعلها محددة\",\"btnDelete\":\"إزالة\"},\"textarea\":{\"title\":\"خصائص مساحة النص\",\"cols\":\"الأعمدة\",\"rows\":\"الصفوف\"},\"textfield\":{\"title\":\"خصائص مربع النص\",\"name\":\"الاسم\",\"value\":\"القيمة\",\"charWidth\":\"عرض السمات\",\"maxChars\":\"اقصى عدد للسمات\",\"required\":\"Required\",\"type\":\"نوع المحتوى\",\"typeText\":\"نص\",\"typePass\":\"كلمة مرور\",\"typeEmail\":\"بريد إلكتروني\",\"typeSearch\":\"بحث\",\"typeTel\":\"رقم الهاتف\",\"typeUrl\":\"الرابط\"}},\"format\":{\"label\":\"تنسيق\",\"panelTitle\":\"تنسيق الفقرة\",\"tag_address\":\"عنوان\",\"tag_div\":\"عادي (DIV)\",\"tag_h1\":\"العنوان 1\",\"tag_h2\":\"العنوان  2\",\"tag_h3\":\"العنوان  3\",\"tag_h4\":\"العنوان  4\",\"tag_h5\":\"العنوان  5\",\"tag_h6\":\"العنوان  6\",\"tag_p\":\"عادي\",\"tag_pre\":\"منسّق\"},\"horizontalrule\":{\"toolbar\":\"خط فاصل\"},\"iframe\":{\"border\":\"إظهار حدود الإطار\",\"noUrl\":\"فضلا أكتب رابط الـ iframe\",\"scrolling\":\"تفعيل أشرطة الإنتقال\",\"title\":\"خصائص iframe\",\"toolbar\":\"iframe\"},\"image\":{\"alt\":\"عنوان الصورة\",\"border\":\"سمك الحدود\",\"btnUpload\":\"أرسلها للخادم\",\"button2Img\":\"هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟\",\"hSpace\":\"تباعد أفقي\",\"img2Button\":\"هل تريد تحويل الصورة المختارة إلى زر صورة؟\",\"infoTab\":\"معلومات الصورة\",\"linkTab\":\"الرابط\",\"lockRatio\":\"تناسق الحجم\",\"menu\":\"خصائص الصورة\",\"resetSize\":\"إستعادة الحجم الأصلي\",\"title\":\"خصائص الصورة\",\"titleButton\":\"خصائص زر الصورة\",\"upload\":\"رفع\",\"urlMissing\":\"عنوان مصدر الصورة مفقود\",\"vSpace\":\"تباعد عمودي\",\"validateBorder\":\"الإطار يجب أن يكون عددا\",\"validateHSpace\":\"HSpace يجب أن يكون عدداً.\",\"validateVSpace\":\"VSpace يجب أن يكون عدداً.\"},\"indent\":{\"indent\":\"زيادة المسافة البادئة\",\"outdent\":\"إنقاص المسافة البادئة\"},\"smiley\":{\"options\":\"خصائص الإبتسامات\",\"title\":\"إدراج ابتسامات\",\"toolbar\":\"ابتسامات\"},\"justify\":{\"block\":\"ضبط\",\"center\":\"توسيط\",\"left\":\"محاذاة إلى اليسار\",\"right\":\"محاذاة إلى اليمين\"},\"language\":{\"button\":\"حدد اللغة\",\"remove\":\"حذف اللغة\"},\"link\":{\"acccessKey\":\"مفاتيح الإختصار\",\"advanced\":\"متقدم\",\"advisoryContentType\":\"نوع التقرير\",\"advisoryTitle\":\"عنوان التقرير\",\"anchor\":{\"toolbar\":\"إشارة مرجعية\",\"menu\":\"تحرير الإشارة المرجعية\",\"title\":\"خصائص الإشارة المرجعية\",\"name\":\"اسم الإشارة المرجعية\",\"errorName\":\"الرجاء كتابة اسم الإشارة المرجعية\",\"remove\":\"إزالة الإشارة المرجعية\"},\"anchorId\":\"حسب رقم العنصر\",\"anchorName\":\"حسب إسم الإشارة المرجعية\",\"charset\":\"ترميز المادة المطلوبة\",\"cssClasses\":\"فئات التنسيق\",\"emailAddress\":\"البريد الإلكتروني\",\"emailBody\":\"محتوى الرسالة\",\"emailSubject\":\"موضوع الرسالة\",\"id\":\"هوية\",\"info\":\"معلومات الرابط\",\"langCode\":\"رمز اللغة\",\"langDir\":\"إتجاه نص اللغة\",\"langDirLTR\":\"اليسار لليمين (LTR)\",\"langDirRTL\":\"اليمين لليسار (RTL)\",\"menu\":\"تحرير الرابط\",\"name\":\"إسم\",\"noAnchors\":\"(لا توجد علامات مرجعية في هذا المستند)\",\"noEmail\":\"الرجاء كتابة الريد الإلكتروني\",\"noUrl\":\"الرجاء كتابة رابط الموقع\",\"other\":\"<أخرى>\",\"popupDependent\":\"تابع (Netscape)\",\"popupFeatures\":\"خصائص النافذة المنبثقة\",\"popupFullScreen\":\"ملئ الشاشة (IE)\",\"popupLeft\":\"التمركز لليسار\",\"popupLocationBar\":\"شريط العنوان\",\"popupMenuBar\":\"القوائم الرئيسية\",\"popupResizable\":\"قابلة التشكيل\",\"popupScrollBars\":\"أشرطة التمرير\",\"popupStatusBar\":\"شريط الحالة\",\"popupToolbar\":\"شريط الأدوات\",\"popupTop\":\"التمركز للأعلى\",\"rel\":\"العلاقة\",\"selectAnchor\":\"اختر علامة مرجعية\",\"styles\":\"نمط\",\"tabIndex\":\"الترتيب\",\"target\":\"هدف الرابط\",\"targetFrame\":\"<إطار>\",\"targetFrameName\":\"اسم الإطار المستهدف\",\"targetPopup\":\"<نافذة منبثقة>\",\"targetPopupName\":\"اسم النافذة المنبثقة\",\"title\":\"رابط\",\"toAnchor\":\"مكان في هذا المستند\",\"toEmail\":\"بريد إلكتروني\",\"toUrl\":\"الرابط\",\"toolbar\":\"رابط\",\"type\":\"نوع الربط\",\"unlink\":\"إزالة رابط\",\"upload\":\"رفع\"},\"list\":{\"bulletedlist\":\"ادخال/حذف تعداد نقطي\",\"numberedlist\":\"ادخال/حذف تعداد رقمي\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"إدراج فقرة هنا\"},\"maximize\":{\"maximize\":\"تكبير\",\"minimize\":\"تصغير\"},\"newpage\":{\"toolbar\":\"صفحة جديدة\"},\"pagebreak\":{\"alt\":\"فاصل الصفحة\",\"toolbar\":\"إدخال صفحة جديدة\"},\"pastetext\":{\"button\":\"لصق كنص بسيط\",\"title\":\"لصق كنص بسيط\"},\"pastefromword\":{\"confirmCleanup\":\"يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟\",\"error\":\"لم يتم مسح المعلومات الملصقة لخلل داخلي\",\"title\":\"لصق من وورد\",\"toolbar\":\"لصق من وورد\"},\"preview\":{\"preview\":\"معاينة الصفحة\"},\"print\":{\"toolbar\":\"طباعة\"},\"removeformat\":{\"toolbar\":\"إزالة التنسيقات\"},\"save\":{\"toolbar\":\"حفظ\"},\"selectall\":{\"toolbar\":\"تحديد الكل\"},\"showblocks\":{\"toolbar\":\"مخطط تفصيلي\"},\"sourcearea\":{\"toolbar\":\"المصدر\"},\"specialchar\":{\"options\":\"خيارات الأحرف الخاصة\",\"title\":\"اختر حرف خاص\",\"toolbar\":\"إدراج  حرف خاص\"},\"scayt\":{\"btn_about\":\"عن SCAYT\",\"btn_dictionaries\":\"قواميس\",\"btn_disable\":\"تعطيل SCAYT\",\"btn_enable\":\"تفعيل SCAYT\",\"btn_langs\":\"لغات\",\"btn_options\":\"خيارات\",\"text_title\":\"تدقيق إملائي أثناء الكتابة\"},\"stylescombo\":{\"label\":\"أنماط\",\"panelTitle\":\"أنماط التنسيق\",\"panelTitle1\":\"أنماط الفقرة\",\"panelTitle2\":\"أنماط مضمنة\",\"panelTitle3\":\"أنماط الكائن\"},\"table\":{\"border\":\"الحدود\",\"caption\":\"الوصف\",\"cell\":{\"menu\":\"خلية\",\"insertBefore\":\"إدراج خلية قبل\",\"insertAfter\":\"إدراج خلية بعد\",\"deleteCell\":\"حذف خلية\",\"merge\":\"دمج خلايا\",\"mergeRight\":\"دمج لليمين\",\"mergeDown\":\"دمج للأسفل\",\"splitHorizontal\":\"تقسيم الخلية أفقياً\",\"splitVertical\":\"تقسيم الخلية عمودياً\",\"title\":\"خصائص الخلية\",\"cellType\":\"نوع الخلية\",\"rowSpan\":\"امتداد الصفوف\",\"colSpan\":\"امتداد الأعمدة\",\"wordWrap\":\"التفاف النص\",\"hAlign\":\"محاذاة أفقية\",\"vAlign\":\"محاذاة رأسية\",\"alignBaseline\":\"خط القاعدة\",\"bgColor\":\"لون الخلفية\",\"borderColor\":\"لون الحدود\",\"data\":\"بيانات\",\"header\":\"عنوان\",\"yes\":\"نعم\",\"no\":\"لا\",\"invalidWidth\":\"عرض الخلية يجب أن يكون عدداً.\",\"invalidHeight\":\"ارتفاع الخلية يجب أن يكون عدداً.\",\"invalidRowSpan\":\"امتداد الصفوف يجب أن يكون عدداً صحيحاً.\",\"invalidColSpan\":\"امتداد الأعمدة يجب أن يكون عدداً صحيحاً.\",\"chooseColor\":\"اختر\"},\"cellPad\":\"المسافة البادئة\",\"cellSpace\":\"تباعد الخلايا\",\"column\":{\"menu\":\"عمود\",\"insertBefore\":\"إدراج عمود قبل\",\"insertAfter\":\"إدراج عمود بعد\",\"deleteColumn\":\"حذف أعمدة\"},\"columns\":\"أعمدة\",\"deleteTable\":\"حذف الجدول\",\"headers\":\"العناوين\",\"headersBoth\":\"كلاهما\",\"headersColumn\":\"العمود الأول\",\"headersNone\":\"بدون\",\"headersRow\":\"الصف الأول\",\"invalidBorder\":\"حجم الحد يجب أن يكون عدداً.\",\"invalidCellPadding\":\"المسافة البادئة يجب أن تكون عدداً\",\"invalidCellSpacing\":\"المسافة بين الخلايا يجب أن تكون عدداً.\",\"invalidCols\":\"عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.\",\"invalidHeight\":\"ارتفاع الجدول يجب أن يكون عدداً.\",\"invalidRows\":\"عدد الصفوف يجب أن يكون عدداً أكبر من صفر.\",\"invalidWidth\":\"عرض الجدول يجب أن يكون عدداً.\",\"menu\":\"خصائص الجدول\",\"row\":{\"menu\":\"صف\",\"insertBefore\":\"إدراج صف قبل\",\"insertAfter\":\"إدراج صف بعد\",\"deleteRow\":\"حذف صفوف\"},\"rows\":\"صفوف\",\"summary\":\"الخلاصة\",\"title\":\"خصائص الجدول\",\"toolbar\":\"جدول\",\"widthPc\":\"بالمئة\",\"widthPx\":\"بكسل\",\"widthUnit\":\"وحدة العرض\"},\"undo\":{\"redo\":\"إعادة\",\"undo\":\"تراجع\"},\"wsc\":{\"btnIgnore\":\"تجاهل\",\"btnIgnoreAll\":\"تجاهل الكل\",\"btnReplace\":\"تغيير\",\"btnReplaceAll\":\"تغيير الكل\",\"btnUndo\":\"تراجع\",\"changeTo\":\"التغيير إلى\",\"errorLoading\":\"خطأ في تحميل تطبيق خدمة الاستضافة: %s.\",\"ieSpellDownload\":\"المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟\",\"manyChanges\":\"تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات\",\"noChanges\":\"تم التدقيق الإملائي: لم يتم تغيير أي كلمة\",\"noMispell\":\"تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية\",\"noSuggestions\":\"- لا توجد إقتراحات -\",\"notAvailable\":\"عفواً، ولكن هذه الخدمة غير متاحة الان\",\"notInDic\":\"ليست في القاموس\",\"oneChange\":\"تم التدقيق الإملائي: تم تغيير كلمة واحدة فقط\",\"progress\":\"جاري التدقيق الاملائى\",\"title\":\"التدقيق الإملائي\",\"toolbar\":\"تدقيق إملائي\"}};"
  },
  {
    "path": "assets/ckeditor/lang/bg.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['bg']={\"editor\":\"Текстов редактор за форматиран текст\",\"editorPanel\":\"Панел на текстовия редактор\",\"common\":{\"editorHelp\":\"натиснете ALT 0 за помощ\",\"browseServer\":\"Избор от сървъра\",\"url\":\"URL\",\"protocol\":\"Протокол\",\"upload\":\"Качване\",\"uploadSubmit\":\"Изпращане към сървъра\",\"image\":\"Снимка\",\"flash\":\"Флаш\",\"form\":\"Форма\",\"checkbox\":\"Поле за избор\",\"radio\":\"Радио бутон\",\"textField\":\"Текстово поле\",\"textarea\":\"Текстова зона\",\"hiddenField\":\"Скрито поле\",\"button\":\"Бутон\",\"select\":\"Поле за избор\",\"imageButton\":\"Бутон за снимка\",\"notSet\":\"<не е избрано>\",\"id\":\"ID\",\"name\":\"Име\",\"langDir\":\"Посока на езика\",\"langDirLtr\":\"Ляво на дясно (ЛнД)\",\"langDirRtl\":\"Дясно на ляво (ДнЛ)\",\"langCode\":\"Код на езика\",\"longDescr\":\"Уеб адрес за дълго описание\",\"cssClass\":\"Класове за CSS\",\"advisoryTitle\":\"Препоръчително заглавие\",\"cssStyle\":\"Стил\",\"ok\":\"ОК\",\"cancel\":\"Отказ\",\"close\":\"Затвори\",\"preview\":\"Преглед\",\"resize\":\"Влачете за да оразмерите\",\"generalTab\":\"Общи\",\"advancedTab\":\"Разширено\",\"validateNumberFailed\":\"Тази стойност не е число\",\"confirmNewPage\":\"Всички незапазени промени ще бъдат изгубени. Сигурни ли сте, че желаете да заредите нова страница?\",\"confirmCancel\":\"Някои от опциите са променени. Сигурни ли сте, че желаете да затворите прозореца?\",\"options\":\"Опции\",\"target\":\"Цел\",\"targetNew\":\"Нов прозорец (_blank)\",\"targetTop\":\"Горна позиция (_top)\",\"targetSelf\":\"Текущия прозорец (_self)\",\"targetParent\":\"Основен прозорец (_parent)\",\"langDirLTR\":\"Ляво на дясно (ЛнД)\",\"langDirRTL\":\"Дясно на ляво (ДнЛ)\",\"styles\":\"Стил\",\"cssClasses\":\"Класове за CSS\",\"width\":\"Ширина\",\"height\":\"Височина\",\"align\":\"Подравняване\",\"alignLeft\":\"Ляво\",\"alignRight\":\"Дясно\",\"alignCenter\":\"Център\",\"alignJustify\":\"Двустранно подравняване\",\"alignTop\":\"Горе\",\"alignMiddle\":\"По средата\",\"alignBottom\":\"Долу\",\"alignNone\":\"Без подравняване\",\"invalidValue\":\"Невалидна стойност.\",\"invalidHeight\":\"Височината трябва да е число.\",\"invalidWidth\":\"Ширина требе да е число.\",\"invalidCssLength\":\"Стойността на полето \\\"%1\\\" трябва да бъде положително число с или без валидна CSS измервателна единица (px, %, in, cm, mm, em, ex, pt, или pc).\",\"invalidHtmlLength\":\"Стойността на полето \\\"%1\\\" трябва да бъде положително число с или без валидна HTML измервателна единица (px или %).\",\"invalidInlineStyle\":\"Стойността на стилa трябва да съдържат една или повече двойки във формат \\\"name : value\\\", разделени с двоеточие.\",\"cssLengthTooltip\":\"Въведете числена стойност в пиксели или друга валидна CSS единица (px, %, in, cm, mm, em, ex, pt, или pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, недостъпно</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"Относно CKEditor\",\"help\":\"Проверете $1 за помощ.\",\"moreInfo\":\"За лицензионна информация моля посетете сайта ни:\",\"title\":\"Относно CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Удебелен\",\"italic\":\"Наклонен\",\"strike\":\"Зачертан текст\",\"subscript\":\"Индексиран текст\",\"superscript\":\"Суперскрипт\",\"underline\":\"Подчертан\"},\"bidi\":{\"ltr\":\"Посока на текста от ляво на дясно\",\"rtl\":\"Посока на текста от дясно на ляво\"},\"blockquote\":{\"toolbar\":\"Блок за цитат\"},\"clipboard\":{\"copy\":\"Копирай\",\"copyError\":\"Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни запаметяването. За целта използвайте клавиатурата (Ctrl/Cmd+C).\",\"cut\":\"Отрежи\",\"cutError\":\"Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).\",\"paste\":\"Вмъкни\",\"pasteArea\":\"Зона за вмъкване\",\"pasteMsg\":\"Вмъкнете тук съдъжанието с клавиатуарата (<STRONG>Ctrl/Cmd+V</STRONG>) и натиснете <STRONG>OK</STRONG>.\",\"securityMsg\":\"Заради настройките за сигурност на Вашия браузър, редакторът не може да прочете данните от клипборда коректно.\",\"title\":\"Вмъкни\"},\"button\":{\"selectedLabel\":\"%1 (Избрано)\"},\"colorbutton\":{\"auto\":\"Автоматично\",\"bgColorTitle\":\"Фонов цвят\",\"colors\":{\"000\":\"Черно\",\"800000\":\"Кестеняво\",\"8B4513\":\"Светлокафяво\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Индиго\",\"696969\":\"Тъмно сиво\",\"B22222\":\"Огнено червено\",\"A52A2A\":\"Кафяво\",\"DAA520\":\"Златисто\",\"006400\":\"Тъмно зелено\",\"40E0D0\":\"Тюркуазено\",\"0000CD\":\"Средно синьо\",\"800080\":\"Пурпурно\",\"808080\":\"Сиво\",\"F00\":\"Червено\",\"FF8C00\":\"Тъмно оранжево\",\"FFD700\":\"Златно\",\"008000\":\"Зелено\",\"0FF\":\"Светло синьо\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Още цветове\",\"panelTitle\":\"Цветове\",\"textColorTitle\":\"Цвят на шрифт\"},\"colordialog\":{\"clear\":\"Изчистване\",\"highlight\":\"Осветяване\",\"options\":\"Цветови опции\",\"selected\":\"Изберете цвят\",\"title\":\"Изберете цвят\"},\"templates\":{\"button\":\"Шаблони\",\"emptyListMsg\":\"(Няма дефинирани шаблони)\",\"insertOption\":\"Препокрива актуалното съдържание\",\"options\":\"Опции за шаблона\",\"selectPromptMsg\":\"Изберете шаблон <br>(текущото съдържание на редактора ще бъде загубено):\",\"title\":\"Шаблони\"},\"contextmenu\":{\"options\":\"Опции на контекстното меню\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"Препоръчително заглавие\",\"cssClassInputLabel\":\"Класове за CSS\",\"edit\":\"Промяна на Div\",\"inlineStyleInputLabel\":\"В редица\",\"langDirLTRLabel\":\"Ляво на Дясно (ЛнД)\",\"langDirLabel\":\"Посока на езика\",\"langDirRTLLabel\":\"Дясно на Ляво (ДнЛ)\",\"languageCodeInputLabel\":\" Код на езика\",\"remove\":\"Премахване на Div\",\"styleSelectLabel\":\"Стил\",\"title\":\"Създай Div блок\",\"toolbar\":\"Създаване на Div контейнер\"},\"toolbar\":{\"toolbarCollapse\":\"Свиване на лентата с инструменти\",\"toolbarExpand\":\"Разширяване на лентата с инструменти\",\"toolbarGroups\":{\"document\":\"Документ\",\"clipboard\":\"Клипборд/Отмяна\",\"editing\":\"Промяна\",\"forms\":\"Форми\",\"basicstyles\":\"Базови стилове\",\"paragraph\":\"Параграф\",\"links\":\"Връзки\",\"insert\":\"Вмъкване\",\"styles\":\"Стилове\",\"colors\":\"Цветове\",\"tools\":\"Инструменти\"},\"toolbars\":\"Ленти с инструменти\"},\"elementspath\":{\"eleLabel\":\"Път за елементите\",\"eleTitle\":\"%1 елемент\"},\"find\":{\"find\":\"Търсене\",\"findOptions\":\"Find Options\",\"findWhat\":\"Търси за:\",\"matchCase\":\"Съвпадение\",\"matchCyclic\":\"Циклично съвпадение\",\"matchWord\":\"Съвпадение с дума\",\"notFoundMsg\":\"Указаният текст не е намерен.\",\"replace\":\"Препокриване\",\"replaceAll\":\"Препокрий всички\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Препокрива с:\",\"title\":\"Търсене и препокриване\"},\"fakeobjects\":{\"anchor\":\"Кука\",\"flash\":\"Флаш анимация\",\"hiddenfield\":\"Скрито поле\",\"iframe\":\"IFrame\",\"unknown\":\"Неизвестен обект\"},\"flash\":{\"access\":\"Достъп до скрипт\",\"accessAlways\":\"Винаги\",\"accessNever\":\"Никога\",\"accessSameDomain\":\"Същият домейн\",\"alignAbsBottom\":\"Най-долу\",\"alignAbsMiddle\":\"Точно по средата\",\"alignBaseline\":\"Базова линия\",\"alignTextTop\":\"Върху текста\",\"bgcolor\":\"Цвят на фона\",\"chkFull\":\"Включи на цял екран\",\"chkLoop\":\"Цикъл\",\"chkMenu\":\"Разрешено Flash меню\",\"chkPlay\":\"Авто. пускане\",\"flashvars\":\"Променливи за Флаш\",\"hSpace\":\"Хоризонтален отстъп\",\"properties\":\"Настройки за флаш\",\"propertiesTab\":\"Настройки\",\"quality\":\"Качество\",\"qualityAutoHigh\":\"Авто. високо\",\"qualityAutoLow\":\"Авто. ниско\",\"qualityBest\":\"Отлично\",\"qualityHigh\":\"Високо\",\"qualityLow\":\"Ниско\",\"qualityMedium\":\"Средно\",\"scale\":\"Оразмеряване\",\"scaleAll\":\"Показва всичко\",\"scaleFit\":\"Според мястото\",\"scaleNoBorder\":\"Без рамка\",\"title\":\"Настройки за флаш\",\"vSpace\":\"Вертикален отстъп\",\"validateHSpace\":\"HSpace трябва да е число.\",\"validateSrc\":\"Уеб адреса не трябва да е празен.\",\"validateVSpace\":\"VSpace трябва да е число.\",\"windowMode\":\"Режим на прозореца\",\"windowModeOpaque\":\"Плътност\",\"windowModeTransparent\":\"Прозрачност\",\"windowModeWindow\":\"Прозорец\"},\"font\":{\"fontSize\":{\"label\":\"Размер\",\"voiceLabel\":\"Размер на шрифт\",\"panelTitle\":\"Размер на шрифт\"},\"label\":\"Шрифт\",\"panelTitle\":\"Име на шрифт\",\"voiceLabel\":\"Шрифт\"},\"forms\":{\"button\":{\"title\":\"Настройки на бутона\",\"text\":\"Текст (стойност)\",\"type\":\"Тип\",\"typeBtn\":\"Бутон\",\"typeSbm\":\"Добави\",\"typeRst\":\"Нулиране\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Настройки на радиобутон\",\"value\":\"Стойност\",\"selected\":\"Избрано\",\"required\":\"Required\"},\"form\":{\"title\":\"Настройки на формата\",\"menu\":\"Настройки на формата\",\"action\":\"Действие\",\"method\":\"Метод\",\"encoding\":\"Кодиране\"},\"hidden\":{\"title\":\"Настройки за скрито поле\",\"name\":\"Име\",\"value\":\"Стойност\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Налични опции\",\"value\":\"Стойност\",\"size\":\"Размер\",\"lines\":\"линии\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Текст\",\"opValue\":\"Стойност\",\"btnAdd\":\"Добави\",\"btnModify\":\"Промени\",\"btnUp\":\"На горе\",\"btnDown\":\"На долу\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Изтриване\"},\"textarea\":{\"title\":\"Опции за текстовата зона\",\"cols\":\"Колони\",\"rows\":\"Редове\"},\"textfield\":{\"title\":\"Настройки за текстово поле\",\"name\":\"Име\",\"value\":\"Стойност\",\"charWidth\":\"Ширина на знаците\",\"maxChars\":\"Макс. знаци\",\"required\":\"Required\",\"type\":\"Тип\",\"typeText\":\"Текст\",\"typePass\":\"Парола\",\"typeEmail\":\"Email\",\"typeSearch\":\"Търсене\",\"typeTel\":\"Телефонен номер\",\"typeUrl\":\"Уеб адрес\"}},\"format\":{\"label\":\"Формат\",\"panelTitle\":\"Формат\",\"tag_address\":\"Адрес\",\"tag_div\":\"Параграф (DIV)\",\"tag_h1\":\"Заглавие 1\",\"tag_h2\":\"Заглавие 2\",\"tag_h3\":\"Заглавие 3\",\"tag_h4\":\"Заглавие 4\",\"tag_h5\":\"Заглавие 5\",\"tag_h6\":\"Заглавие 6\",\"tag_p\":\"Нормален\",\"tag_pre\":\"Форматиран\"},\"horizontalrule\":{\"toolbar\":\"Вмъкване на хоризонтална линия\"},\"iframe\":{\"border\":\"Показва рамка на карето\",\"noUrl\":\"Моля въведете URL за iFrame\",\"scrolling\":\"Вкл. скролбаровете\",\"title\":\"IFrame настройки\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Алтернативен текст\",\"border\":\"Рамка\",\"btnUpload\":\"Изпрати я на сървъра\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"Хоризонтален отстъп\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Инфо за снимка\",\"linkTab\":\"Връзка\",\"lockRatio\":\"Заключване на съотношението\",\"menu\":\"Настройки за снимка\",\"resetSize\":\"Нулиране на размер\",\"title\":\"Настройки за снимка\",\"titleButton\":\"Настойки за бутон за снимка\",\"upload\":\"Качване\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"Вертикален отстъп\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Увеличаване на отстъпа\",\"outdent\":\"Намаляване на отстъпа\"},\"smiley\":{\"options\":\"Опции за усмивката\",\"title\":\"Вмъкване на усмивка\",\"toolbar\":\"Усмивка\"},\"justify\":{\"block\":\"Двустранно подравняване\",\"center\":\"Център\",\"left\":\"Подравни в ляво\",\"right\":\"Подравни в дясно\"},\"language\":{\"button\":\"Задай език\",\"remove\":\"Премахни език\"},\"link\":{\"acccessKey\":\"Ключ за достъп\",\"advanced\":\"Разширено\",\"advisoryContentType\":\"Препоръчителен тип на съдържанието\",\"advisoryTitle\":\"Препоръчително заглавие\",\"anchor\":{\"toolbar\":\"Котва\",\"menu\":\"Промяна на котва\",\"title\":\"Настройки на котва\",\"name\":\"Име на котва\",\"errorName\":\"Моля въведете име на котвата\",\"remove\":\"Премахване на котва\"},\"anchorId\":\"По ID на елемент\",\"anchorName\":\"По име на котва\",\"charset\":\"Тип на свързания ресурс\",\"cssClasses\":\"Класове за CSS\",\"emailAddress\":\"E-mail aдрес\",\"emailBody\":\"Съдържание\",\"emailSubject\":\"Тема\",\"id\":\"ID\",\"info\":\"Инфо за връзката\",\"langCode\":\"Код за езика\",\"langDir\":\"Посока на езика\",\"langDirLTR\":\"Ляво на Дясно (ЛнД)\",\"langDirRTL\":\"Дясно на Ляво (ДнЛ)\",\"menu\":\"Промяна на връзка\",\"name\":\"Име\",\"noAnchors\":\"(Няма котви в текущия документ)\",\"noEmail\":\"Моля въведете e-mail aдрес\",\"noUrl\":\"Моля въведете URL адреса\",\"other\":\"<друго>\",\"popupDependent\":\"Зависимост (Netscape)\",\"popupFeatures\":\"Функции на изкачащ прозорец\",\"popupFullScreen\":\"Цял екран (IE)\",\"popupLeft\":\"Лява позиция\",\"popupLocationBar\":\"Лента с локацията\",\"popupMenuBar\":\"Лента за меню\",\"popupResizable\":\"Оразмеряем\",\"popupScrollBars\":\"Скролери\",\"popupStatusBar\":\"Статусна лента\",\"popupToolbar\":\"Лента с инструменти\",\"popupTop\":\"Горна позиция\",\"rel\":\"Връзка\",\"selectAnchor\":\"Изберете котва\",\"styles\":\"Стил\",\"tabIndex\":\"Ред на достъп\",\"target\":\"Цел\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Име на целевият прозорец\",\"targetPopup\":\"<изкачащ прозорец>\",\"targetPopupName\":\"Име на изкачащ прозорец\",\"title\":\"Връзка\",\"toAnchor\":\"Връзка към котва в текста\",\"toEmail\":\"E-mail\",\"toUrl\":\"Уеб адрес\",\"toolbar\":\"Връзка\",\"type\":\"Тип на връзката\",\"unlink\":\"Премахни връзката\",\"upload\":\"Качване\"},\"list\":{\"bulletedlist\":\"Вмъкване/Премахване на точков списък\",\"numberedlist\":\"Вмъкване/Премахване на номериран списък\"},\"liststyle\":{\"armenian\":\"Арменско номериране\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Кръг\",\"decimal\":\"Числа (1, 2, 3 и др.)\",\"decimalLeadingZero\":\"Числа с водеща нула (01, 02, 03 и т.н.)\",\"disc\":\"Диск\",\"georgian\":\"Грузинско номериране (an, ban, gan, и т.н.)\",\"lowerAlpha\":\"Малки букви (а, б, в, г, д и т.н.)\",\"lowerGreek\":\"Малки гръцки букви (алфа, бета, гама и т.н.)\",\"lowerRoman\":\"Малки римски числа (i, ii, iii, iv, v и т.н.)\",\"none\":\"Няма\",\"notset\":\"<не е указано>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Квадрат\",\"start\":\"Старт\",\"type\":\"Тип\",\"upperAlpha\":\"Големи букви (А, Б, В, Г, Д и т.н.)\",\"upperRoman\":\"Големи римски числа (I, II, III, IV, V и т.н.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Вмъкнете параграф тук\"},\"maximize\":{\"maximize\":\"Максимизиране\",\"minimize\":\"Минимизиране\"},\"newpage\":{\"toolbar\":\"Нова страница\"},\"pagebreak\":{\"alt\":\"Разделяне на страници\",\"toolbar\":\"Вмъкване на нова страница при печат\"},\"pastetext\":{\"button\":\"Вмъкни като чист текст\",\"title\":\"Вмъкни като чист текст\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Вмъкни от MS Word\",\"toolbar\":\"Вмъкни от MS Word\"},\"preview\":{\"preview\":\"Преглед\"},\"print\":{\"toolbar\":\"Печат\"},\"removeformat\":{\"toolbar\":\"Премахване на форматирането\"},\"save\":{\"toolbar\":\"Запис\"},\"selectall\":{\"toolbar\":\"Избери всичко\"},\"showblocks\":{\"toolbar\":\"Показва блокове\"},\"sourcearea\":{\"toolbar\":\"Изходен код\"},\"specialchar\":{\"options\":\"Опции за специален знак\",\"title\":\"Избор на специален знак\",\"toolbar\":\"Вмъкване на специален знак\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Речници\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Стилове\",\"panelTitle\":\"Стилове за форматиране\",\"panelTitle1\":\"Блокови стилове\",\"panelTitle2\":\"Вътрешни стилове\",\"panelTitle3\":\"Обектни стилове\"},\"table\":{\"border\":\"Размер на рамката\",\"caption\":\"Заглавие\",\"cell\":{\"menu\":\"Клетка\",\"insertBefore\":\"Вмъкване на клетка преди\",\"insertAfter\":\"Вмъкване на клетка след\",\"deleteCell\":\"Изтриване на клетки\",\"merge\":\"Сливане на клетки\",\"mergeRight\":\"Сливане в дясно\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Настройки на клетката\",\"cellType\":\"Тип на клетката\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Авто. пренос\",\"hAlign\":\"Хоризонтално подравняване\",\"vAlign\":\"Вертикално подравняване\",\"alignBaseline\":\"Базова линия\",\"bgColor\":\"Фон\",\"borderColor\":\"Цвят на рамката\",\"data\":\"Данни\",\"header\":\"Хедър\",\"yes\":\"Да\",\"no\":\"Не\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Изберете\"},\"cellPad\":\"Отделяне на клетките\",\"cellSpace\":\"Разтояние между клетките\",\"column\":{\"menu\":\"Колона\",\"insertBefore\":\"Вмъкване на колона преди\",\"insertAfter\":\"Вмъкване на колона след\",\"deleteColumn\":\"Изтриване на колони\"},\"columns\":\"Колони\",\"deleteTable\":\"Изтриване на таблица\",\"headers\":\"Хедъри\",\"headersBoth\":\"Заедно\",\"headersColumn\":\"Първа колона\",\"headersNone\":\"Няма\",\"headersRow\":\"Първи ред\",\"invalidBorder\":\"Размерът на рамката трябва да е число.\",\"invalidCellPadding\":\"Отстоянието на клетките трябва да е позитивно число.\",\"invalidCellSpacing\":\"Интервала в клетките трябва да е позитивно число.\",\"invalidCols\":\"Броят колони трябва да е по-голям от 0.\",\"invalidHeight\":\"Височината на таблицата трябва да е число.\",\"invalidRows\":\"Броят редове трябва да е по-голям от 0.\",\"invalidWidth\":\"Ширината на таблицата трябва да е число.\",\"menu\":\"Настройки на таблицата\",\"row\":{\"menu\":\"Ред\",\"insertBefore\":\"Вмъкване на ред преди\",\"insertAfter\":\"Вмъкване на ред след\",\"deleteRow\":\"Изтриване на редове\"},\"rows\":\"Редове\",\"summary\":\"Обща информация\",\"title\":\"Настройки на таблицата\",\"toolbar\":\"Таблица\",\"widthPc\":\"процент\",\"widthPx\":\"пиксела\",\"widthUnit\":\"единица за ширина\"},\"undo\":{\"redo\":\"Връщане на предишен статус\",\"undo\":\"Възтанови\"},\"wsc\":{\"btnIgnore\":\"Игнорирай\",\"btnIgnoreAll\":\"Игнорирай всичко\",\"btnReplace\":\"Препокриване\",\"btnReplaceAll\":\"Препокрий всичко\",\"btnUndo\":\"Възтанови\",\"changeTo\":\"Промени на\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- Няма препоръчани -\",\"notAvailable\":\"Съжаляваме, но услугата не е достъпна за момента\",\"notInDic\":\"Не е в речника\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Проверява се правописа...\",\"title\":\"Проверка на правопис\",\"toolbar\":\"Проверка на правопис\"}};"
  },
  {
    "path": "assets/ckeditor/lang/bn.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['bn']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"ব্রাউজ সার্ভার\",\"url\":\"URL\",\"protocol\":\"প্রোটোকল\",\"upload\":\"আপলোড\",\"uploadSubmit\":\"ইহাকে সার্ভারে প্রেরন কর\",\"image\":\"ছবির লেবেল যুক্ত কর\",\"flash\":\"ফ্লাশ লেবেল যুক্ত কর\",\"form\":\"ফর্ম\",\"checkbox\":\"চেক বাক্স\",\"radio\":\"রেডিও বাটন\",\"textField\":\"টেক্সট ফীল্ড\",\"textarea\":\"টেক্সট এরিয়া\",\"hiddenField\":\"গুপ্ত ফীল্ড\",\"button\":\"বাটন\",\"select\":\"বাছাই ফীল্ড\",\"imageButton\":\"ছবির বাটন\",\"notSet\":\"<সেট নেই>\",\"id\":\"আইডি\",\"name\":\"নাম\",\"langDir\":\"ভাষা লেখার দিক\",\"langDirLtr\":\"বাম থেকে ডান (LTR)\",\"langDirRtl\":\"ডান থেকে বাম (RTL)\",\"langCode\":\"ভাষা কোড\",\"longDescr\":\"URL এর লম্বা বর্ণনা\",\"cssClass\":\"স্টাইল-শীট ক্লাস\",\"advisoryTitle\":\"পরামর্শ শীর্ষক\",\"cssStyle\":\"স্টাইল\",\"ok\":\"ওকে\",\"cancel\":\"বাতিল\",\"close\":\"Close\",\"preview\":\"প্রিভিউ\",\"resize\":\"Resize\",\"generalTab\":\"General\",\"advancedTab\":\"এডভান্সড\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"টার্গেট\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"বাম থেকে ডান (LTR)\",\"langDirRTL\":\"ডান থেকে বাম (RTL)\",\"styles\":\"স্টাইল\",\"cssClasses\":\"স্টাইল-শীট ক্লাস\",\"width\":\"প্রস্থ\",\"height\":\"দৈর্ঘ্য\",\"align\":\"এলাইন\",\"alignLeft\":\"বামে\",\"alignRight\":\"ডানে\",\"alignCenter\":\"মাঝখানে\",\"alignJustify\":\"ব্লক জাস্টিফাই\",\"alignTop\":\"উপর\",\"alignMiddle\":\"মধ্য\",\"alignBottom\":\"নীচে\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"বোল্ড\",\"italic\":\"ইটালিক\",\"strike\":\"স্ট্রাইক থ্রু\",\"subscript\":\"অধোলেখ\",\"superscript\":\"অভিলেখ\",\"underline\":\"আন্ডারলাইন\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"কপি\",\"copyError\":\"আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।\",\"cut\":\"কাট\",\"cutError\":\"আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।\",\"paste\":\"পেস্ট\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"পেস্ট\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"অটোমেটিক\",\"bgColorTitle\":\"বেকগ্রাউন্ড রং\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"আরও রং...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"টেক্স্ট রং\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"টেমপ্লেট\",\"emptyListMsg\":\"(কোন টেমপ্লেট ডিফাইন করা নেই)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"অনুগ্রহ করে এডিটরে ওপেন করার জন্য টেমপ্লেট বাছাই করুন<br>(আসল কনটেন্ট হারিয়ে যাবে):\",\"title\":\"কনটেন্ট টেমপ্লেট\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"খোজো\",\"findOptions\":\"Find Options\",\"findWhat\":\"যা খুঁজতে হবে:\",\"matchCase\":\"কেস মিলাও\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"পুরা শব্দ মেলাও\",\"notFoundMsg\":\"আপনার উল্লেখিত টেকস্ট পাওয়া যায়নি\",\"replace\":\"রিপ্লেস\",\"replaceAll\":\"সব বদলে দাও\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"যার সাথে বদলাতে হবে:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs নীচে\",\"alignAbsMiddle\":\"Abs উপর\",\"alignBaseline\":\"মূল রেখা\",\"alignTextTop\":\"টেক্সট উপর\",\"bgcolor\":\"বেকগ্রাউন্ড রং\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"লূপ\",\"chkMenu\":\"ফ্ল্যাশ মেনু এনাবল কর\",\"chkPlay\":\"অটো প্লে\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"হরাইজন্টাল স্পেস\",\"properties\":\"ফ্লাশ প্রোপার্টি\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"স্কেল\",\"scaleAll\":\"সব দেখাও\",\"scaleFit\":\"নিখুঁত ফিট\",\"scaleNoBorder\":\"কোনো বর্ডার নেই\",\"title\":\"ফ্ল্যাশ প্রোপার্টি\",\"vSpace\":\"ভার্টিকেল স্পেস\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"অনুগ্রহ করে URL লিংক টাইপ করুন\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"সাইজ\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"সাইজ\"},\"label\":\"ফন্ট\",\"panelTitle\":\"ফন্ট\",\"voiceLabel\":\"ফন্ট\"},\"forms\":{\"button\":{\"title\":\"বাটন প্রোপার্টি\",\"text\":\"টেক্সট (ভ্যালু)\",\"type\":\"প্রকার\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"চেক বক্স প্রোপার্টি\",\"radioTitle\":\"রেডিও বাটন প্রোপার্টি\",\"value\":\"ভ্যালু\",\"selected\":\"সিলেক্টেড\",\"required\":\"Required\"},\"form\":{\"title\":\"ফর্ম প্রোপার্টি\",\"menu\":\"ফর্ম প্রোপার্টি\",\"action\":\"একশ্যন\",\"method\":\"পদ্ধতি\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"গুপ্ত ফীল্ড প্রোপার্টি\",\"name\":\"নাম\",\"value\":\"ভ্যালু\"},\"select\":{\"title\":\"বাছাই ফীল্ড প্রোপার্টি\",\"selectInfo\":\"তথ্য\",\"opAvail\":\"অন্যান্য বিকল্প\",\"value\":\"ভ্যালু\",\"size\":\"সাইজ\",\"lines\":\"লাইন সমূহ\",\"chkMulti\":\"একাধিক সিলেকশন এলাউ কর\",\"required\":\"Required\",\"opText\":\"টেক্সট\",\"opValue\":\"ভ্যালু\",\"btnAdd\":\"যুক্ত\",\"btnModify\":\"বদলে দাও\",\"btnUp\":\"উপর\",\"btnDown\":\"নীচে\",\"btnSetValue\":\"বাছাই করা ভ্যালু হিসেবে সেট কর\",\"btnDelete\":\"ডিলীট\"},\"textarea\":{\"title\":\"টেক্সট এরিয়া প্রোপার্টি\",\"cols\":\"কলাম\",\"rows\":\"রো\"},\"textfield\":{\"title\":\"টেক্সট ফীল্ড প্রোপার্টি\",\"name\":\"নাম\",\"value\":\"ভ্যালু\",\"charWidth\":\"ক্যারেক্টার প্রশস্ততা\",\"maxChars\":\"সর্বাধিক ক্যারেক্টার\",\"required\":\"Required\",\"type\":\"টাইপ\",\"typeText\":\"টেক্সট\",\"typePass\":\"পাসওয়ার্ড\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"ফন্ট ফরমেট\",\"panelTitle\":\"ফন্ট ফরমেট\",\"tag_address\":\"ঠিকানা\",\"tag_div\":\"শীর্ষক (DIV)\",\"tag_h1\":\"শীর্ষক ১\",\"tag_h2\":\"শীর্ষক ২\",\"tag_h3\":\"শীর্ষক ৩\",\"tag_h4\":\"শীর্ষক ৪\",\"tag_h5\":\"শীর্ষক ৫\",\"tag_h6\":\"শীর্ষক ৬\",\"tag_p\":\"সাধারণ\",\"tag_pre\":\"ফর্মেটেড\"},\"horizontalrule\":{\"toolbar\":\"রেখা যুক্ত কর\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"বিকল্প টেক্সট\",\"border\":\"বর্ডার\",\"btnUpload\":\"ইহাকে সার্ভারে প্রেরন কর\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"হরাইজন্টাল স্পেস\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"ছবির তথ্য\",\"linkTab\":\"লিংক\",\"lockRatio\":\"অনুপাত লক কর\",\"menu\":\"ছবির প্রোপার্টি\",\"resetSize\":\"সাইজ পূর্বাবস্থায় ফিরিয়ে দাও\",\"title\":\"ছবির প্রোপার্টি\",\"titleButton\":\"ছবি বাটন প্রোপার্টি\",\"upload\":\"আপলোড\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"ভার্টিকেল স্পেস\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"ইনডেন্ট বাড়াও\",\"outdent\":\"ইনডেন্ট কমাও\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"স্মাইলী যুক্ত কর\",\"toolbar\":\"স্মাইলী\"},\"justify\":{\"block\":\"ব্লক জাস্টিফাই\",\"center\":\"মাঝ বরাবর ঘেষা\",\"left\":\"বা দিকে ঘেঁষা\",\"right\":\"ডান দিকে ঘেঁষা\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"এক্সেস কী\",\"advanced\":\"এডভান্সড\",\"advisoryContentType\":\"পরামর্শ কন্টেন্টের প্রকার\",\"advisoryTitle\":\"পরামর্শ শীর্ষক\",\"anchor\":{\"toolbar\":\"নোঙ্গর\",\"menu\":\"নোঙর প্রোপার্টি\",\"title\":\"নোঙর প্রোপার্টি\",\"name\":\"নোঙরের নাম\",\"errorName\":\"নোঙরের নাম টাইপ করুন\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"নোঙরের আইডি দিয়ে\",\"anchorName\":\"নোঙরের নাম দিয়ে\",\"charset\":\"লিংক রিসোর্স ক্যারেক্টর সেট\",\"cssClasses\":\"স্টাইল-শীট ক্লাস\",\"emailAddress\":\"ইমেইল ঠিকানা\",\"emailBody\":\"মেসেজের দেহ\",\"emailSubject\":\"মেসেজের বিষয়\",\"id\":\"আইডি\",\"info\":\"লিংক তথ্য\",\"langCode\":\"ভাষা লেখার দিক\",\"langDir\":\"ভাষা লেখার দিক\",\"langDirLTR\":\"বাম থেকে ডান (LTR)\",\"langDirRTL\":\"ডান থেকে বাম (RTL)\",\"menu\":\"লিংক সম্পাদন\",\"name\":\"নাম\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"অনুগ্রহ করে ইমেইল এড্রেস টাইপ করুন\",\"noUrl\":\"অনুগ্রহ করে URL লিংক টাইপ করুন\",\"other\":\"<other>\",\"popupDependent\":\"ডিপেন্ডেন্ট (Netscape)\",\"popupFeatures\":\"পপআপ উইন্ডো ফীচার সমূহ\",\"popupFullScreen\":\"পূর্ণ পর্দা জুড়ে (IE)\",\"popupLeft\":\"বামের পজিশন\",\"popupLocationBar\":\"লোকেশন বার\",\"popupMenuBar\":\"মেন্যু বার\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"স্ক্রল বার\",\"popupStatusBar\":\"স্ট্যাটাস বার\",\"popupToolbar\":\"টুল বার\",\"popupTop\":\"ডানের পজিশন\",\"rel\":\"Relationship\",\"selectAnchor\":\"নোঙর বাছাই\",\"styles\":\"স্টাইল\",\"tabIndex\":\"ট্যাব ইন্ডেক্স\",\"target\":\"টার্গেট\",\"targetFrame\":\"<ফ্রেম>\",\"targetFrameName\":\"টার্গেট ফ্রেমের নাম\",\"targetPopup\":\"<পপআপ উইন্ডো>\",\"targetPopupName\":\"পপআপ উইন্ডোর নাম\",\"title\":\"লিংক\",\"toAnchor\":\"এই পেজে নোঙর কর\",\"toEmail\":\"ইমেইল\",\"toUrl\":\"URL\",\"toolbar\":\"লিংক যুক্ত কর\",\"type\":\"লিংক প্রকার\",\"unlink\":\"লিংক সরাও\",\"upload\":\"আপলোড\"},\"list\":{\"bulletedlist\":\"বুলেট লিস্ট লেবেল\",\"numberedlist\":\"সাংখ্যিক লিস্টের লেবেল\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"নতুন পেজ\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"পেজ ব্রেক\"},\"pastetext\":{\"button\":\"সাদা টেক্সট হিসেবে পেস্ট কর\",\"title\":\"সাদা টেক্সট হিসেবে পেস্ট কর\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"পেস্ট (শব্দ)\",\"toolbar\":\"পেস্ট (শব্দ)\"},\"preview\":{\"preview\":\"প্রিভিউ\"},\"print\":{\"toolbar\":\"প্রিন্ট\"},\"removeformat\":{\"toolbar\":\"ফরমেট সরাও\"},\"save\":{\"toolbar\":\"সংরক্ষন কর\"},\"selectall\":{\"toolbar\":\"সব সিলেক্ট কর\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"সোর্স\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"বিশেষ ক্যারেক্টার বাছাই কর\",\"toolbar\":\"বিশেষ অক্ষর যুক্ত কর\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"স্টাইল\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"বর্ডার সাইজ\",\"caption\":\"শীর্ষক\",\"cell\":{\"menu\":\"সেল\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"সেল মুছে দাও\",\"merge\":\"সেল জোড়া দাও\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"সেল প্যাডিং\",\"cellSpace\":\"সেল স্পেস\",\"column\":{\"menu\":\"কলাম\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"কলাম মুছে দাও\"},\"columns\":\"কলাম\",\"deleteTable\":\"টেবিল ডিলীট কর\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"টেবিল প্রোপার্টি\",\"row\":{\"menu\":\"রো\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"রো মুছে দাও\"},\"rows\":\"রো\",\"summary\":\"সারাংশ\",\"title\":\"টেবিল প্রোপার্টি\",\"toolbar\":\"টেবিলের লেবেল যুক্ত কর\",\"widthPc\":\"শতকরা\",\"widthPx\":\"পিক্সেল\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"রি-ডু\",\"undo\":\"আনডু\"},\"wsc\":{\"btnIgnore\":\"ইগনোর কর\",\"btnIgnoreAll\":\"সব ইগনোর কর\",\"btnReplace\":\"বদলে দাও\",\"btnReplaceAll\":\"সব বদলে দাও\",\"btnUndo\":\"আন্ডু\",\"changeTo\":\"এতে বদলাও\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"বানান পরীক্ষক ইনস্টল করা নেই। আপনি কি এখনই এটা ডাউনলোড করতে চান?\",\"manyChanges\":\"বানান পরীক্ষা শেষ: %1 গুলো শব্দ বদলে গ্যাছে\",\"noChanges\":\"বানান পরীক্ষা শেষ: কোন শব্দ পরিবর্তন করা হয়নি\",\"noMispell\":\"বানান পরীক্ষা শেষ: কোন ভুল বানান পাওয়া যায়নি\",\"noSuggestions\":\"- কোন সাজেশন নেই -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"শব্দকোষে নেই\",\"oneChange\":\"বানান পরীক্ষা শেষ: একটি মাত্র শব্দ পরিবর্তন করা হয়েছে\",\"progress\":\"বানান পরীক্ষা চলছে...\",\"title\":\"Spell Checker\",\"toolbar\":\"বানান চেক\"}};"
  },
  {
    "path": "assets/ckeditor/lang/bs.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['bs']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Browse Server\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Šalji\",\"uploadSubmit\":\"Šalji na server\",\"image\":\"Slika\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Hidden Field\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Image Button\",\"notSet\":\"<nije podešeno>\",\"id\":\"Id\",\"name\":\"Naziv\",\"langDir\":\"Smjer pisanja\",\"langDirLtr\":\"S lijeva na desno (LTR)\",\"langDirRtl\":\"S desna na lijevo (RTL)\",\"langCode\":\"Jezièni kôd\",\"longDescr\":\"Dugaèki opis URL-a\",\"cssClass\":\"Klase CSS stilova\",\"advisoryTitle\":\"Advisory title\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Odustani\",\"close\":\"Close\",\"preview\":\"Prikaži\",\"resize\":\"Resize\",\"generalTab\":\"General\",\"advancedTab\":\"Naprednije\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"Prozor\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"S lijeva na desno (LTR)\",\"langDirRTL\":\"S desna na lijevo (RTL)\",\"styles\":\"Stil\",\"cssClasses\":\"Klase CSS stilova\",\"width\":\"Širina\",\"height\":\"Visina\",\"align\":\"Poravnanje\",\"alignLeft\":\"Lijevo\",\"alignRight\":\"Desno\",\"alignCenter\":\"Centar\",\"alignJustify\":\"Puno poravnanje\",\"alignTop\":\"Vrh\",\"alignMiddle\":\"Sredina\",\"alignBottom\":\"Dno\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Boldiraj\",\"italic\":\"Ukosi\",\"strike\":\"Precrtaj\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Podvuci\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Kopiraj\",\"copyError\":\"Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).\",\"cut\":\"Izreži\",\"cutError\":\"Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).\",\"paste\":\"Zalijepi\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Zalijepi\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatska\",\"bgColorTitle\":\"Boja pozadine\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Više boja...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Boja teksta\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Templates\",\"emptyListMsg\":\"(No templates defined)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Content Templates\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory title\",\"cssClassInputLabel\":\"Klase CSS stilova\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"S lijeva na desno (LTR)\",\"langDirLabel\":\"Smjer pisanja\",\"langDirRTLLabel\":\"S desna na lijevo (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Stil\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Naði\",\"findOptions\":\"Find Options\",\"findWhat\":\"Naði šta:\",\"matchCase\":\"Uporeðuj velika/mala slova\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Uporeðuj samo cijelu rijeè\",\"notFoundMsg\":\"Traženi tekst nije pronaðen.\",\"replace\":\"Zamjeni\",\"replaceAll\":\"Zamjeni sve\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Zamjeni sa:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs dole\",\"alignAbsMiddle\":\"Abs sredina\",\"alignBaseline\":\"Bazno\",\"alignTextTop\":\"Vrh teksta\",\"bgcolor\":\"Boja pozadine\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"Molimo ukucajte URL link\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Velièina\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Velièina\"},\"label\":\"Font\",\"panelTitle\":\"Font\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button Properties\",\"text\":\"Text (Value)\",\"type\":\"Type\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Action\",\"method\":\"Method\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Name\",\"value\":\"Value\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Value\",\"size\":\"Size\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Delete\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Columns\",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Ubaci horizontalnu liniju\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Tekst na slici\",\"border\":\"Okvir\",\"btnUpload\":\"Šalji na server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Info slike\",\"linkTab\":\"Link\",\"lockRatio\":\"Zakljuèaj odnos\",\"menu\":\"Svojstva slike\",\"resetSize\":\"Resetuj dimenzije\",\"title\":\"Svojstva slike\",\"titleButton\":\"Image Button Properties\",\"upload\":\"Šalji\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Poveæaj uvod\",\"outdent\":\"Smanji uvod\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Ubaci smješka\",\"toolbar\":\"Smješko\"},\"justify\":{\"block\":\"Puno poravnanje\",\"center\":\"Centralno poravnanje\",\"left\":\"Lijevo poravnanje\",\"right\":\"Desno poravnanje\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Pristupna tipka\",\"advanced\":\"Naprednije\",\"advisoryContentType\":\"Advisory vrsta sadržaja\",\"advisoryTitle\":\"Advisory title\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Po Id-u elementa\",\"anchorName\":\"Po nazivu sidra\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Klase CSS stilova\",\"emailAddress\":\"E-Mail Adresa\",\"emailBody\":\"Poruka\",\"emailSubject\":\"Subjekt poruke\",\"id\":\"Id\",\"info\":\"Link info\",\"langCode\":\"Smjer pisanja\",\"langDir\":\"Smjer pisanja\",\"langDirLTR\":\"S lijeva na desno (LTR)\",\"langDirRTL\":\"S desna na lijevo (RTL)\",\"menu\":\"Izmjeni link\",\"name\":\"Naziv\",\"noAnchors\":\"(Nema dostupnih sidra na stranici)\",\"noEmail\":\"Molimo ukucajte e-mail adresu\",\"noUrl\":\"Molimo ukucajte URL link\",\"other\":\"<other>\",\"popupDependent\":\"Ovisno (Netscape)\",\"popupFeatures\":\"Moguænosti popup prozora\",\"popupFullScreen\":\"Cijeli ekran (IE)\",\"popupLeft\":\"Lijeva pozicija\",\"popupLocationBar\":\"Traka za lokaciju\",\"popupMenuBar\":\"Izborna traka\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll traka\",\"popupStatusBar\":\"Statusna traka\",\"popupToolbar\":\"Traka sa alatima\",\"popupTop\":\"Gornja pozicija\",\"rel\":\"Relationship\",\"selectAnchor\":\"Izaberi sidro\",\"styles\":\"Stil\",\"tabIndex\":\"Tab indeks\",\"target\":\"Prozor\",\"targetFrame\":\"<frejm>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup prozor>\",\"targetPopupName\":\"Naziv popup prozora\",\"title\":\"Link\",\"toAnchor\":\"Sidro na ovoj stranici\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Ubaci/Izmjeni link\",\"type\":\"Tip linka\",\"unlink\":\"Izbriši link\",\"upload\":\"Šalji\"},\"list\":{\"bulletedlist\":\"Lista\",\"numberedlist\":\"Numerisana lista\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"Novi dokument\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Zalijepi kao obièan tekst\",\"title\":\"Zalijepi kao obièan tekst\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Zalijepi iz Word-a\",\"toolbar\":\"Zalijepi iz Word-a\"},\"preview\":{\"preview\":\"Prikaži\"},\"print\":{\"toolbar\":\"Štampaj\"},\"removeformat\":{\"toolbar\":\"Poništi format\"},\"save\":{\"toolbar\":\"Snimi\"},\"selectall\":{\"toolbar\":\"Selektuj sve\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"HTML kôd\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Izaberi specijalni karakter\",\"toolbar\":\"Ubaci specijalni karater\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Okvir\",\"caption\":\"Naslov\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Briši æelije\",\"merge\":\"Spoji æelije\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Uvod æelija\",\"cellSpace\":\"Razmak æelija\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Briši kolone\"},\"columns\":\"Kolona\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Svojstva tabele\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Briši redove\"},\"rows\":\"Redova\",\"summary\":\"Summary\",\"title\":\"Svojstva tabele\",\"toolbar\":\"Tabela\",\"widthPc\":\"posto\",\"widthPx\":\"piksela\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Ponovi\",\"undo\":\"Vrati\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ca.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ca']={\"editor\":\"Editor de text enriquit\",\"editorPanel\":\"Panell de l'editor de text enriquit\",\"common\":{\"editorHelp\":\"Premeu ALT 0 per ajuda\",\"browseServer\":\"Veure servidor\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Puja\",\"uploadSubmit\":\"Envia-la al servidor\",\"image\":\"Imatge\",\"flash\":\"Flash\",\"form\":\"Formulari\",\"checkbox\":\"Casella de verificació\",\"radio\":\"Botó d'opció\",\"textField\":\"Camp de text\",\"textarea\":\"Àrea de text\",\"hiddenField\":\"Camp ocult\",\"button\":\"Botó\",\"select\":\"Camp de selecció\",\"imageButton\":\"Botó d'imatge\",\"notSet\":\"<no definit>\",\"id\":\"Id\",\"name\":\"Nom\",\"langDir\":\"Direcció de l'idioma\",\"langDirLtr\":\"D'esquerra a dreta (LTR)\",\"langDirRtl\":\"De dreta a esquerra (RTL)\",\"langCode\":\"Codi d'idioma\",\"longDescr\":\"Descripció llarga de la URL\",\"cssClass\":\"Classes del full d'estil\",\"advisoryTitle\":\"Títol consultiu\",\"cssStyle\":\"Estil\",\"ok\":\"D'acord\",\"cancel\":\"Cancel·la\",\"close\":\"Tanca\",\"preview\":\"Previsualitza\",\"resize\":\"Arrossegueu per redimensionar\",\"generalTab\":\"General\",\"advancedTab\":\"Avançat\",\"validateNumberFailed\":\"Aquest valor no és un número.\",\"confirmNewPage\":\"Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?\",\"confirmCancel\":\"Algunes opcions s'han canviat. Esteu segur que voleu tancar el quadre de diàleg?\",\"options\":\"Opcions\",\"target\":\"Destí\",\"targetNew\":\"Nova finestra (_blank)\",\"targetTop\":\"Finestra superior (_top)\",\"targetSelf\":\"Mateixa finestra (_self)\",\"targetParent\":\"Finestra pare (_parent)\",\"langDirLTR\":\"D'esquerra a dreta (LTR)\",\"langDirRTL\":\"De dreta a esquerra (RTL)\",\"styles\":\"Estil\",\"cssClasses\":\"Classes del full d'estil\",\"width\":\"Amplada\",\"height\":\"Alçada\",\"align\":\"Alineació\",\"alignLeft\":\"Ajusta a l'esquerra\",\"alignRight\":\"Ajusta a la dreta\",\"alignCenter\":\"Centre\",\"alignJustify\":\"Justificat\",\"alignTop\":\"Superior\",\"alignMiddle\":\"Centre\",\"alignBottom\":\"Inferior\",\"alignNone\":\"None\",\"invalidValue\":\"Valor no vàlid.\",\"invalidHeight\":\"L'alçada ha de ser un número.\",\"invalidWidth\":\"L'amplada ha de ser un número.\",\"invalidCssLength\":\"El valor especificat per als \\\"%1\\\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).\",\"invalidHtmlLength\":\"El valor especificat per als \\\"%1\\\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida d'HTML (px o %).\",\"invalidInlineStyle\":\"El valor especificat per l'estil en línia ha de constar d'una o més tuples amb el format \\\"name: value\\\", separats per punt i coma.\",\"cssLengthTooltip\":\"Introduïu un número per un valor en píxels o un número amb una unitat vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, no disponible</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Tots els drets reservats.\",\"dlgTitle\":\"Quant al CKEditor\",\"help\":\"Premi $1 per obtenir ajuda.\",\"moreInfo\":\"Per informació sobre llicències visiteu el nostre lloc web:\",\"title\":\"Quant al CKEditor\",\"userGuide\":\"Manual d'usuari de CKEditor\"},\"basicstyles\":{\"bold\":\"Negreta\",\"italic\":\"Cursiva\",\"strike\":\"Ratllat\",\"subscript\":\"Subíndex\",\"superscript\":\"Superíndex\",\"underline\":\"Subratllat\"},\"bidi\":{\"ltr\":\"Direcció del text d'esquerra a dreta\",\"rtl\":\"Direcció del text de dreta a esquerra\"},\"blockquote\":{\"toolbar\":\"Bloc de cita\"},\"clipboard\":{\"copy\":\"Copiar\",\"copyError\":\"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).\",\"cut\":\"Retallar\",\"cutError\":\"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).\",\"paste\":\"Enganxar\",\"pasteArea\":\"Àrea d'enganxat\",\"pasteMsg\":\"Si us plau, enganxi dins del següent camp utilitzant el teclat (<strong>Ctrl/Cmd+V</strong>) i premi OK.\",\"securityMsg\":\"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.\",\"title\":\"Enganxar\"},\"button\":{\"selectedLabel\":\"%1 (Seleccionat)\"},\"colorbutton\":{\"auto\":\"Automàtic\",\"bgColorTitle\":\"Color de Fons\",\"colors\":{\"000\":\"Negre\",\"800000\":\"Grana\",\"8B4513\":\"Marró sella\",\"2F4F4F\":\"Gris pissarra fosca\",\"008080\":\"Blau xarxet\",\"000080\":\"Blau marí\",\"4B0082\":\"Indi\",\"696969\":\"Gris Fosc\",\"B22222\":\"Foc Maó\",\"A52A2A\":\"Marró\",\"DAA520\":\"Solidago\",\"006400\":\"Verd Fosc\",\"40E0D0\":\"Turquesa\",\"0000CD\":\"Blau 1/2\",\"800080\":\"Lila\",\"808080\":\"Gris\",\"F00\":\"Vermell\",\"FF8C00\":\"Taronja Fosc\",\"FFD700\":\"Or\",\"008000\":\"Verd\",\"0FF\":\"Cian\",\"00F\":\"Blau\",\"EE82EE\":\"Violat\",\"A9A9A9\":\"Gris clar\",\"FFA07A\":\"Salmó clar\",\"FFA500\":\"Taronja\",\"FFFF00\":\"Groc\",\"00FF00\":\"Verd Llima\",\"AFEEEE\":\"Turquesa Pàl·lid\",\"ADD8E6\":\"Blau Clar\",\"DDA0DD\":\"Pruna\",\"D3D3D3\":\"Gris Clar\",\"FFF0F5\":\"Lavanda rosat\",\"FAEBD7\":\"Blanc Antic\",\"FFFFE0\":\"Groc Clar\",\"F0FFF0\":\"Verd Pàl·lid\",\"F0FFFF\":\"Atzur\",\"F0F8FF\":\"Cian pàlid\",\"E6E6FA\":\"Lavanda\",\"FFF\":\"Blanc\"},\"more\":\"Més Colors...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Color del Text\"},\"colordialog\":{\"clear\":\"Neteja\",\"highlight\":\"Destacat\",\"options\":\"Opcions del color\",\"selected\":\"Color Seleccionat\",\"title\":\"Seleccioni el color\"},\"templates\":{\"button\":\"Plantilles\",\"emptyListMsg\":\"(No hi ha plantilles definides)\",\"insertOption\":\"Reemplaça el contingut actual\",\"options\":\"Opcions de plantilla\",\"selectPromptMsg\":\"Seleccioneu una plantilla per usar a l'editor<br>(per defecte s'elimina el contingut actual):\",\"title\":\"Plantilles de contingut\"},\"contextmenu\":{\"options\":\"Opcions del menú contextual\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Títol de guia\",\"cssClassInputLabel\":\"Classes de la fulla d'estils\",\"edit\":\"Edita la Capa\",\"inlineStyleInputLabel\":\"Estil en línia\",\"langDirLTRLabel\":\"D'esquerra a dreta (LTR)\",\"langDirLabel\":\"Direcció de l'idioma\",\"langDirRTLLabel\":\"De dreta a esquerra (RTL)\",\"languageCodeInputLabel\":\" Codi d'idioma\",\"remove\":\"Elimina la Capa\",\"styleSelectLabel\":\"Estil\",\"title\":\"Crea una Capa Contenidora\",\"toolbar\":\"Crea una Capa Contenidora\"},\"toolbar\":{\"toolbarCollapse\":\"Redueix la barra d'eines\",\"toolbarExpand\":\"Amplia la barra d'eines\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor de barra d'eines\"},\"elementspath\":{\"eleLabel\":\"Ruta dels elements\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Cerca\",\"findOptions\":\"Opcions de Cerca\",\"findWhat\":\"Cerca el:\",\"matchCase\":\"Distingeix majúscules/minúscules\",\"matchCyclic\":\"Coincidència cíclica\",\"matchWord\":\"Només paraules completes\",\"notFoundMsg\":\"El text especificat no s'ha trobat.\",\"replace\":\"Reemplaça\",\"replaceAll\":\"Reemplaça-ho tot\",\"replaceSuccessMsg\":\"%1 ocurrència/es reemplaçada/es.\",\"replaceWith\":\"Reemplaça amb:\",\"title\":\"Cerca i reemplaça\"},\"fakeobjects\":{\"anchor\":\"Àncora\",\"flash\":\"Animació Flash\",\"hiddenfield\":\"Camp ocult\",\"iframe\":\"IFrame\",\"unknown\":\"Objecte desconegut\"},\"flash\":{\"access\":\"Accés a scripts\",\"accessAlways\":\"Sempre\",\"accessNever\":\"Mai\",\"accessSameDomain\":\"El mateix domini\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Text Superior\",\"bgcolor\":\"Color de Fons\",\"chkFull\":\"Permetre la pantalla completa\",\"chkLoop\":\"Bucle\",\"chkMenu\":\"Habilita menú Flash\",\"chkPlay\":\"Reprodució automàtica\",\"flashvars\":\"Variables de Flash\",\"hSpace\":\"Espaiat horitzontal\",\"properties\":\"Propietats del Flash\",\"propertiesTab\":\"Propietats\",\"quality\":\"Qualitat\",\"qualityAutoHigh\":\"Alta automàtica\",\"qualityAutoLow\":\"Baixa automàtica\",\"qualityBest\":\"La millor\",\"qualityHigh\":\"Alta\",\"qualityLow\":\"Baixa\",\"qualityMedium\":\"Mitjana\",\"scale\":\"Escala\",\"scaleAll\":\"Mostra-ho tot\",\"scaleFit\":\"Mida exacta\",\"scaleNoBorder\":\"Sense vores\",\"title\":\"Propietats del Flash\",\"vSpace\":\"Espaiat vertical\",\"validateHSpace\":\"L'espaiat horitzontal ha de ser un número.\",\"validateSrc\":\"La URL no pot estar buida.\",\"validateVSpace\":\"L'espaiat vertical ha de ser un número.\",\"windowMode\":\"Mode de la finestra\",\"windowModeOpaque\":\"Opaca\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Finestra\"},\"font\":{\"fontSize\":{\"label\":\"Mida\",\"voiceLabel\":\"Mida de la lletra\",\"panelTitle\":\"Mida de la lletra\"},\"label\":\"Tipus de lletra\",\"panelTitle\":\"Tipus de lletra\",\"voiceLabel\":\"Tipus de lletra\"},\"forms\":{\"button\":{\"title\":\"Propietats del botó\",\"text\":\"Text (Valor)\",\"type\":\"Tipus\",\"typeBtn\":\"Botó\",\"typeSbm\":\"Transmet formulari\",\"typeRst\":\"Reinicia formulari\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Propietats de la casella de verificació\",\"radioTitle\":\"Propietats del botó d'opció\",\"value\":\"Valor\",\"selected\":\"Seleccionat\",\"required\":\"Required\"},\"form\":{\"title\":\"Propietats del formulari\",\"menu\":\"Propietats del formulari\",\"action\":\"Acció\",\"method\":\"Mètode\",\"encoding\":\"Codificació\"},\"hidden\":{\"title\":\"Propietats del camp ocult\",\"name\":\"Nom\",\"value\":\"Valor\"},\"select\":{\"title\":\"Propietats del camp de selecció\",\"selectInfo\":\"Info\",\"opAvail\":\"Opcions disponibles\",\"value\":\"Valor\",\"size\":\"Mida\",\"lines\":\"Línies\",\"chkMulti\":\"Permet múltiples seleccions\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Valor\",\"btnAdd\":\"Afegeix\",\"btnModify\":\"Modifica\",\"btnUp\":\"Amunt\",\"btnDown\":\"Avall\",\"btnSetValue\":\"Selecciona per defecte\",\"btnDelete\":\"Elimina\"},\"textarea\":{\"title\":\"Propietats de l'àrea de text\",\"cols\":\"Columnes\",\"rows\":\"Files\"},\"textfield\":{\"title\":\"Propietats del camp de text\",\"name\":\"Nom\",\"value\":\"Valor\",\"charWidth\":\"Amplada\",\"maxChars\":\"Nombre màxim de caràcters\",\"required\":\"Required\",\"type\":\"Tipus\",\"typeText\":\"Text\",\"typePass\":\"Contrasenya\",\"typeEmail\":\"Correu electrònic\",\"typeSearch\":\"Cercar\",\"typeTel\":\"Número de telèfon\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format\",\"tag_address\":\"Adreça\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Encapçalament 1\",\"tag_h2\":\"Encapçalament 2\",\"tag_h3\":\"Encapçalament 3\",\"tag_h4\":\"Encapçalament 4\",\"tag_h5\":\"Encapçalament 5\",\"tag_h6\":\"Encapçalament 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatejat\"},\"horizontalrule\":{\"toolbar\":\"Insereix línia horitzontal\"},\"iframe\":{\"border\":\"Mostra la vora del marc\",\"noUrl\":\"Si us plau, introdueixi la URL de l'iframe\",\"scrolling\":\"Activa les barres de desplaçament\",\"title\":\"Propietats de l'IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Text alternatiu\",\"border\":\"Vora\",\"btnUpload\":\"Envia-la al servidor\",\"button2Img\":\"Voleu transformar el botó d'imatge seleccionat en una simple imatge?\",\"hSpace\":\"Espaiat horit.\",\"img2Button\":\"Voleu transformar la imatge seleccionada en un botó d'imatge?\",\"infoTab\":\"Informació de la imatge\",\"linkTab\":\"Enllaç\",\"lockRatio\":\"Bloqueja les proporcions\",\"menu\":\"Propietats de la imatge\",\"resetSize\":\"Restaura la mida\",\"title\":\"Propietats de la imatge\",\"titleButton\":\"Propietats del botó d'imatge\",\"upload\":\"Puja\",\"urlMissing\":\"Falta la URL de la imatge.\",\"vSpace\":\"Espaiat vert.\",\"validateBorder\":\"La vora ha de ser un nombre enter.\",\"validateHSpace\":\"HSpace ha de ser un nombre enter.\",\"validateVSpace\":\"VSpace ha de ser un nombre enter.\"},\"indent\":{\"indent\":\"Augmenta el sagnat\",\"outdent\":\"Redueix el sagnat\"},\"smiley\":{\"options\":\"Opcions d'emoticones\",\"title\":\"Insereix una icona\",\"toolbar\":\"Icona\"},\"justify\":{\"block\":\"Justificat\",\"center\":\"Centrat\",\"left\":\"Alinea a l'esquerra\",\"right\":\"Alinea a la dreta\"},\"language\":{\"button\":\"Definir l'idioma\",\"remove\":\"Eliminar idioma\"},\"link\":{\"acccessKey\":\"Clau d'accés\",\"advanced\":\"Avançat\",\"advisoryContentType\":\"Tipus de contingut consultiu\",\"advisoryTitle\":\"Títol consultiu\",\"anchor\":{\"toolbar\":\"Insereix/Edita àncora\",\"menu\":\"Propietats de l'àncora\",\"title\":\"Propietats de l'àncora\",\"name\":\"Nom de l'àncora\",\"errorName\":\"Si us plau, escriviu el nom de l'ancora\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Per Id d'element\",\"anchorName\":\"Per nom d'àncora\",\"charset\":\"Conjunt de caràcters font enllaçat\",\"cssClasses\":\"Classes del full d'estil\",\"emailAddress\":\"Adreça de correu electrònic\",\"emailBody\":\"Cos del missatge\",\"emailSubject\":\"Assumpte del missatge\",\"id\":\"Id\",\"info\":\"Informació de l'enllaç\",\"langCode\":\"Direcció de l'idioma\",\"langDir\":\"Direcció de l'idioma\",\"langDirLTR\":\"D'esquerra a dreta (LTR)\",\"langDirRTL\":\"De dreta a esquerra (RTL)\",\"menu\":\"Edita l'enllaç\",\"name\":\"Nom\",\"noAnchors\":\"(No hi ha àncores disponibles en aquest document)\",\"noEmail\":\"Si us plau, escrigui l'adreça correu electrònic\",\"noUrl\":\"Si us plau, escrigui l'enllaç URL\",\"other\":\"<altre>\",\"popupDependent\":\"Depenent (Netscape)\",\"popupFeatures\":\"Característiques finestra popup\",\"popupFullScreen\":\"Pantalla completa (IE)\",\"popupLeft\":\"Posició esquerra\",\"popupLocationBar\":\"Barra d'adreça\",\"popupMenuBar\":\"Barra de menú\",\"popupResizable\":\"Redimensionable\",\"popupScrollBars\":\"Barres d'scroll\",\"popupStatusBar\":\"Barra d'estat\",\"popupToolbar\":\"Barra d'eines\",\"popupTop\":\"Posició dalt\",\"rel\":\"Relació\",\"selectAnchor\":\"Selecciona una àncora\",\"styles\":\"Estil\",\"tabIndex\":\"Index de Tab\",\"target\":\"Destí\",\"targetFrame\":\"<marc>\",\"targetFrameName\":\"Nom del marc de destí\",\"targetPopup\":\"<finestra emergent>\",\"targetPopupName\":\"Nom finestra popup\",\"title\":\"Enllaç\",\"toAnchor\":\"Àncora en aquesta pàgina\",\"toEmail\":\"Correu electrònic\",\"toUrl\":\"URL\",\"toolbar\":\"Insereix/Edita enllaç\",\"type\":\"Tipus d'enllaç\",\"unlink\":\"Elimina l'enllaç\",\"upload\":\"Puja\"},\"list\":{\"bulletedlist\":\"Llista de pics\",\"numberedlist\":\"Llista numerada\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insereix el paràgraf aquí\"},\"maximize\":{\"maximize\":\"Maximitza\",\"minimize\":\"Minimitza\"},\"newpage\":{\"toolbar\":\"Nova pàgina\"},\"pagebreak\":{\"alt\":\"Salt de pàgina\",\"toolbar\":\"Insereix salt de pàgina\"},\"pastetext\":{\"button\":\"Enganxa com a text no formatat\",\"title\":\"Enganxa com a text no formatat\"},\"pastefromword\":{\"confirmCleanup\":\"El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?\",\"error\":\"No ha estat possible netejar les dades enganxades degut a un error intern\",\"title\":\"Enganxa des del Word\",\"toolbar\":\"Enganxa des del Word\"},\"preview\":{\"preview\":\"Visualització prèvia\"},\"print\":{\"toolbar\":\"Imprimeix\"},\"removeformat\":{\"toolbar\":\"Elimina Format\"},\"save\":{\"toolbar\":\"Desa\"},\"selectall\":{\"toolbar\":\"Selecciona-ho tot\"},\"showblocks\":{\"toolbar\":\"Mostra els blocs\"},\"sourcearea\":{\"toolbar\":\"Codi font\"},\"specialchar\":{\"options\":\"Opcions de caràcters especials\",\"title\":\"Selecciona el caràcter especial\",\"toolbar\":\"Insereix caràcter especial\"},\"scayt\":{\"btn_about\":\"Quant a l'SCAYT\",\"btn_dictionaries\":\"Diccionaris\",\"btn_disable\":\"Deshabilita SCAYT\",\"btn_enable\":\"Habilitat l'SCAYT\",\"btn_langs\":\"Idiomes\",\"btn_options\":\"Opcions\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Estil\",\"panelTitle\":\"Estils de format\",\"panelTitle1\":\"Estils de bloc\",\"panelTitle2\":\"Estils incrustats\",\"panelTitle3\":\"Estils d'objecte\"},\"table\":{\"border\":\"Mida vora\",\"caption\":\"Títol\",\"cell\":{\"menu\":\"Cel·la\",\"insertBefore\":\"Insereix abans\",\"insertAfter\":\"Insereix després\",\"deleteCell\":\"Suprimeix\",\"merge\":\"Fusiona\",\"mergeRight\":\"Fusiona a la dreta\",\"mergeDown\":\"Fusiona avall\",\"splitHorizontal\":\"Divideix horitzontalment\",\"splitVertical\":\"Divideix verticalment\",\"title\":\"Propietats de la cel·la\",\"cellType\":\"Tipus de cel·la\",\"rowSpan\":\"Expansió de files\",\"colSpan\":\"Expansió de columnes\",\"wordWrap\":\"Ajustar al contingut\",\"hAlign\":\"Alineació Horizontal\",\"vAlign\":\"Alineació Vertical\",\"alignBaseline\":\"A la línia base\",\"bgColor\":\"Color de fons\",\"borderColor\":\"Color de la vora\",\"data\":\"Dades\",\"header\":\"Capçalera\",\"yes\":\"Sí\",\"no\":\"No\",\"invalidWidth\":\"L'amplada de cel·la ha de ser un nombre.\",\"invalidHeight\":\"L'alçada de cel·la ha de ser un nombre.\",\"invalidRowSpan\":\"L'expansió de files ha de ser un nombre enter.\",\"invalidColSpan\":\"L'expansió de columnes ha de ser un nombre enter.\",\"chooseColor\":\"Trieu\"},\"cellPad\":\"Encoixinament de cel·les\",\"cellSpace\":\"Espaiat de cel·les\",\"column\":{\"menu\":\"Columna\",\"insertBefore\":\"Insereix columna abans de\",\"insertAfter\":\"Insereix columna darrera\",\"deleteColumn\":\"Suprimeix una columna\"},\"columns\":\"Columnes\",\"deleteTable\":\"Suprimeix la taula\",\"headers\":\"Capçaleres\",\"headersBoth\":\"Ambdues\",\"headersColumn\":\"Primera columna\",\"headersNone\":\"Cap\",\"headersRow\":\"Primera fila\",\"invalidBorder\":\"El gruix de la vora ha de ser un nombre.\",\"invalidCellPadding\":\"L'encoixinament de cel·la  ha de ser un nombre.\",\"invalidCellSpacing\":\"L'espaiat de cel·la  ha de ser un nombre.\",\"invalidCols\":\"El nombre de columnes ha de ser un nombre major que 0.\",\"invalidHeight\":\"L'alçada de la taula  ha de ser un nombre.\",\"invalidRows\":\"El nombre de files ha de ser un nombre major que 0.\",\"invalidWidth\":\"L'amplada de la taula  ha de ser un nombre.\",\"menu\":\"Propietats de la taula\",\"row\":{\"menu\":\"Fila\",\"insertBefore\":\"Insereix fila abans de\",\"insertAfter\":\"Insereix fila darrera\",\"deleteRow\":\"Suprimeix una fila\"},\"rows\":\"Files\",\"summary\":\"Resum\",\"title\":\"Propietats de la taula\",\"toolbar\":\"Taula\",\"widthPc\":\"percentatge\",\"widthPx\":\"píxels\",\"widthUnit\":\"unitat d'amplada\"},\"undo\":{\"redo\":\"Refés\",\"undo\":\"Desfés\"},\"wsc\":{\"btnIgnore\":\"Ignora\",\"btnIgnoreAll\":\"Ignora-les totes\",\"btnReplace\":\"Canvia\",\"btnReplaceAll\":\"Canvia-les totes\",\"btnUndo\":\"Desfés\",\"changeTo\":\"Reemplaça amb\",\"errorLoading\":\"Error carregant el servidor: %s.\",\"ieSpellDownload\":\"Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?\",\"manyChanges\":\"Verificació ortogràfica: s'han canviat %1 paraules\",\"noChanges\":\"Verificació ortogràfica: no s'ha canviat cap paraula\",\"noMispell\":\"Verificació ortogràfica acabada: no hi ha cap paraula mal escrita\",\"noSuggestions\":\"Cap suggeriment\",\"notAvailable\":\"El servei no es troba disponible ara.\",\"notInDic\":\"No és al diccionari\",\"oneChange\":\"Verificació ortogràfica: s'ha canviat una paraula\",\"progress\":\"Verificació ortogràfica en curs...\",\"title\":\"Comprova l'ortografia\",\"toolbar\":\"Revisa l'ortografia\"}};"
  },
  {
    "path": "assets/ckeditor/lang/cs.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['cs']={\"editor\":\"Textový editor\",\"editorPanel\":\"Panel textového editoru\",\"common\":{\"editorHelp\":\"Stiskněte ALT 0 pro nápovědu\",\"browseServer\":\"Vybrat na serveru\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Odeslat\",\"uploadSubmit\":\"Odeslat na server\",\"image\":\"Obrázek\",\"flash\":\"Flash\",\"form\":\"Formulář\",\"checkbox\":\"Zaškrtávací políčko\",\"radio\":\"Přepínač\",\"textField\":\"Textové pole\",\"textarea\":\"Textová oblast\",\"hiddenField\":\"Skryté pole\",\"button\":\"Tlačítko\",\"select\":\"Seznam\",\"imageButton\":\"Obrázkové tlačítko\",\"notSet\":\"<nenastaveno>\",\"id\":\"Id\",\"name\":\"Jméno\",\"langDir\":\"Směr jazyka\",\"langDirLtr\":\"Zleva doprava (LTR)\",\"langDirRtl\":\"Zprava doleva (RTL)\",\"langCode\":\"Kód jazyka\",\"longDescr\":\"Dlouhý popis URL\",\"cssClass\":\"Třída stylu\",\"advisoryTitle\":\"Pomocný titulek\",\"cssStyle\":\"Styl\",\"ok\":\"OK\",\"cancel\":\"Zrušit\",\"close\":\"Zavřít\",\"preview\":\"Náhled\",\"resize\":\"Uchopit pro změnu velikosti\",\"generalTab\":\"Obecné\",\"advancedTab\":\"Rozšířené\",\"validateNumberFailed\":\"Zadaná hodnota není číselná.\",\"confirmNewPage\":\"Jakékoliv neuložené změny obsahu budou ztraceny. Skutečně chcete otevřít novou stránku?\",\"confirmCancel\":\"Některá z nastavení byla změněna. Skutečně chcete zavřít dialogové okno?\",\"options\":\"Nastavení\",\"target\":\"Cíl\",\"targetNew\":\"Nové okno (_blank)\",\"targetTop\":\"Okno nejvyšší úrovně (_top)\",\"targetSelf\":\"Stejné okno (_self)\",\"targetParent\":\"Rodičovské okno (_parent)\",\"langDirLTR\":\"Zleva doprava (LTR)\",\"langDirRTL\":\"Zprava doleva (RTL)\",\"styles\":\"Styly\",\"cssClasses\":\"Třídy stylů\",\"width\":\"Šířka\",\"height\":\"Výška\",\"align\":\"Zarovnání\",\"alignLeft\":\"Vlevo\",\"alignRight\":\"Vpravo\",\"alignCenter\":\"Na střed\",\"alignJustify\":\"Zarovnat do bloku\",\"alignTop\":\"Nahoru\",\"alignMiddle\":\"Na střed\",\"alignBottom\":\"Dolů\",\"alignNone\":\"Žádné\",\"invalidValue\":\"Neplatná hodnota.\",\"invalidHeight\":\"Zadaná výška musí být číslo.\",\"invalidWidth\":\"Šířka musí být číslo.\",\"invalidCssLength\":\"Hodnota určená pro pole \\\"%1\\\" musí být kladné číslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).\",\"invalidHtmlLength\":\"Hodnota určená pro pole \\\"%1\\\" musí být kladné číslo bez nebo s platnou jednotkou míry HTML (px nebo %).\",\"invalidInlineStyle\":\"Hodnota určená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu \\\"název : hodnota\\\", oddělené středníky\",\"cssLengthTooltip\":\"Zadejte číslo jako hodnotu v pixelech nebo číslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nedostupné</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"O aplikaci CKEditor\",\"help\":\"Prohlédněte si $1 pro nápovědu.\",\"moreInfo\":\"Pro informace o lincenci navštivte naši webovou stránku:\",\"title\":\"O aplikaci CKEditor\",\"userGuide\":\"Uživatelská příručka CKEditor\"},\"basicstyles\":{\"bold\":\"Tučné\",\"italic\":\"Kurzíva\",\"strike\":\"Přeškrtnuté\",\"subscript\":\"Dolní index\",\"superscript\":\"Horní index\",\"underline\":\"Podtržené\"},\"bidi\":{\"ltr\":\"Směr textu zleva doprava\",\"rtl\":\"Směr textu zprava doleva\"},\"blockquote\":{\"toolbar\":\"Citace\"},\"clipboard\":{\"copy\":\"Kopírovat\",\"copyError\":\"Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).\",\"cut\":\"Vyjmout\",\"cutError\":\"Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).\",\"paste\":\"Vložit\",\"pasteArea\":\"Oblast vkládání\",\"pasteMsg\":\"Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.\",\"securityMsg\":\"Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.\",\"title\":\"Vložit\"},\"button\":{\"selectedLabel\":\"%1 (Vybráno)\"},\"colorbutton\":{\"auto\":\"Automaticky\",\"bgColorTitle\":\"Barva pozadí\",\"colors\":{\"000\":\"Černá\",\"800000\":\"Kaštanová\",\"8B4513\":\"Sedlová hněď\",\"2F4F4F\":\"Tmavě bledě šedá\",\"008080\":\"Čírka\",\"000080\":\"Námořnická modř\",\"4B0082\":\"Inkoustová\",\"696969\":\"Tmavě šedá\",\"B22222\":\"Pálená cihla\",\"A52A2A\":\"Hnědá\",\"DAA520\":\"Zlatý prut\",\"006400\":\"Tmavě zelená\",\"40E0D0\":\"Tyrkisová\",\"0000CD\":\"Středně modrá\",\"800080\":\"Purpurová\",\"808080\":\"Šedá\",\"F00\":\"Červená\",\"FF8C00\":\"Tmavě oranžová\",\"FFD700\":\"Zlatá\",\"008000\":\"Zelená\",\"0FF\":\"Azurová\",\"00F\":\"Modrá\",\"EE82EE\":\"Fialová\",\"A9A9A9\":\"Kalně šedá\",\"FFA07A\":\"Světle lososová\",\"FFA500\":\"Oranžová\",\"FFFF00\":\"Žlutá\",\"00FF00\":\"Limetková\",\"AFEEEE\":\"Bledě tyrkisová\",\"ADD8E6\":\"Světle modrá\",\"DDA0DD\":\"Švestková\",\"D3D3D3\":\"Světle šedá\",\"FFF0F5\":\"Levandulově ruměnná\",\"FAEBD7\":\"Antická bílá\",\"FFFFE0\":\"Světle žlutá\",\"F0FFF0\":\"Medová rosa\",\"F0FFFF\":\"Azurová\",\"F0F8FF\":\"Alenčina modrá\",\"E6E6FA\":\"Levandulová\",\"FFF\":\"Bílá\"},\"more\":\"Více barev...\",\"panelTitle\":\"Barvy\",\"textColorTitle\":\"Barva textu\"},\"colordialog\":{\"clear\":\"Vyčistit\",\"highlight\":\"Zvýraznit\",\"options\":\"Nastavení barvy\",\"selected\":\"Vybráno\",\"title\":\"Výběr barvy\"},\"templates\":{\"button\":\"Šablony\",\"emptyListMsg\":\"(Není definována žádná šablona)\",\"insertOption\":\"Nahradit aktuální obsah\",\"options\":\"Nastavení šablon\",\"selectPromptMsg\":\"Prosím zvolte šablonu pro otevření v editoru<br>(aktuální obsah editoru bude ztracen):\",\"title\":\"Šablony obsahu\"},\"contextmenu\":{\"options\":\"Nastavení kontextové nabídky\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Nápovědní titulek\",\"cssClassInputLabel\":\"Třídy stylů\",\"edit\":\"Změnit Div\",\"inlineStyleInputLabel\":\"Vnitřní styly\",\"langDirLTRLabel\":\"Zleva doprava (LTR)\",\"langDirLabel\":\"Směr jazyka\",\"langDirRTLLabel\":\"Zprava doleva (RTL)\",\"languageCodeInputLabel\":\" Kód jazyka\",\"remove\":\"Odstranit Div\",\"styleSelectLabel\":\"Styly\",\"title\":\"Vytvořit Div kontejner\",\"toolbar\":\"Vytvořit Div kontejner\"},\"toolbar\":{\"toolbarCollapse\":\"Skrýt panel nástrojů\",\"toolbarExpand\":\"Zobrazit panel nástrojů\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Schránka/Zpět\",\"editing\":\"Úpravy\",\"forms\":\"Formuláře\",\"basicstyles\":\"Základní styly\",\"paragraph\":\"Odstavec\",\"links\":\"Odkazy\",\"insert\":\"Vložit\",\"styles\":\"Styly\",\"colors\":\"Barvy\",\"tools\":\"Nástroje\"},\"toolbars\":\"Panely nástrojů editoru\"},\"elementspath\":{\"eleLabel\":\"Cesta objektu\",\"eleTitle\":\"%1 objekt\"},\"find\":{\"find\":\"Hledat\",\"findOptions\":\"Možnosti hledání\",\"findWhat\":\"Co hledat:\",\"matchCase\":\"Rozlišovat velikost písma\",\"matchCyclic\":\"Procházet opakovaně\",\"matchWord\":\"Pouze celá slova\",\"notFoundMsg\":\"Hledaný text nebyl nalezen.\",\"replace\":\"Nahradit\",\"replaceAll\":\"Nahradit vše\",\"replaceSuccessMsg\":\"%1 nahrazení.\",\"replaceWith\":\"Čím nahradit:\",\"title\":\"Najít a nahradit\"},\"fakeobjects\":{\"anchor\":\"Záložka\",\"flash\":\"Flash animace\",\"hiddenfield\":\"Skryté pole\",\"iframe\":\"IFrame\",\"unknown\":\"Neznámý objekt\"},\"flash\":{\"access\":\"Přístup ke skriptu\",\"accessAlways\":\"Vždy\",\"accessNever\":\"Nikdy\",\"accessSameDomain\":\"Ve stejné doméně\",\"alignAbsBottom\":\"Zcela dolů\",\"alignAbsMiddle\":\"Doprostřed\",\"alignBaseline\":\"Na účaří\",\"alignTextTop\":\"Na horní okraj textu\",\"bgcolor\":\"Barva pozadí\",\"chkFull\":\"Povolit celoobrazovkový režim\",\"chkLoop\":\"Opakování\",\"chkMenu\":\"Nabídka Flash\",\"chkPlay\":\"Automatické spuštění\",\"flashvars\":\"Proměnné pro Flash\",\"hSpace\":\"Horizontální mezera\",\"properties\":\"Vlastnosti Flashe\",\"propertiesTab\":\"Vlastnosti\",\"quality\":\"Kvalita\",\"qualityAutoHigh\":\"Vysoká - auto\",\"qualityAutoLow\":\"Nízká - auto\",\"qualityBest\":\"Nejlepší\",\"qualityHigh\":\"Vysoká\",\"qualityLow\":\"Nejnižší\",\"qualityMedium\":\"Střední\",\"scale\":\"Zobrazit\",\"scaleAll\":\"Zobrazit vše\",\"scaleFit\":\"Přizpůsobit\",\"scaleNoBorder\":\"Bez okraje\",\"title\":\"Vlastnosti Flashe\",\"vSpace\":\"Vertikální mezera\",\"validateHSpace\":\"Zadaná horizontální mezera musí být číslo.\",\"validateSrc\":\"Zadejte prosím URL odkazu\",\"validateVSpace\":\"Zadaná vertikální mezera musí být číslo.\",\"windowMode\":\"Režim okna\",\"windowModeOpaque\":\"Neprůhledné\",\"windowModeTransparent\":\"Průhledné\",\"windowModeWindow\":\"Okno\"},\"font\":{\"fontSize\":{\"label\":\"Velikost\",\"voiceLabel\":\"Velikost písma\",\"panelTitle\":\"Velikost\"},\"label\":\"Písmo\",\"panelTitle\":\"Písmo\",\"voiceLabel\":\"Písmo\"},\"forms\":{\"button\":{\"title\":\"Vlastnosti tlačítka\",\"text\":\"Popisek\",\"type\":\"Typ\",\"typeBtn\":\"Tlačítko\",\"typeSbm\":\"Odeslat\",\"typeRst\":\"Obnovit\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Vlastnosti zaškrtávacího políčka\",\"radioTitle\":\"Vlastnosti přepínače\",\"value\":\"Hodnota\",\"selected\":\"Zaškrtnuto\",\"required\":\"Vyžadováno\"},\"form\":{\"title\":\"Vlastnosti formuláře\",\"menu\":\"Vlastnosti formuláře\",\"action\":\"Akce\",\"method\":\"Metoda\",\"encoding\":\"Kódování\"},\"hidden\":{\"title\":\"Vlastnosti skrytého pole\",\"name\":\"Název\",\"value\":\"Hodnota\"},\"select\":{\"title\":\"Vlastnosti seznamu\",\"selectInfo\":\"Info\",\"opAvail\":\"Dostupná nastavení\",\"value\":\"Hodnota\",\"size\":\"Velikost\",\"lines\":\"Řádků\",\"chkMulti\":\"Povolit mnohonásobné výběry\",\"required\":\"Vyžadováno\",\"opText\":\"Text\",\"opValue\":\"Hodnota\",\"btnAdd\":\"Přidat\",\"btnModify\":\"Změnit\",\"btnUp\":\"Nahoru\",\"btnDown\":\"Dolů\",\"btnSetValue\":\"Nastavit jako vybranou hodnotu\",\"btnDelete\":\"Smazat\"},\"textarea\":{\"title\":\"Vlastnosti textové oblasti\",\"cols\":\"Sloupců\",\"rows\":\"Řádků\"},\"textfield\":{\"title\":\"Vlastnosti textového pole\",\"name\":\"Název\",\"value\":\"Hodnota\",\"charWidth\":\"Šířka ve znacích\",\"maxChars\":\"Maximální počet znaků\",\"required\":\"Vyžadováno\",\"type\":\"Typ\",\"typeText\":\"Text\",\"typePass\":\"Heslo\",\"typeEmail\":\"Email\",\"typeSearch\":\"Hledat\",\"typeTel\":\"Telefonní číslo\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formát\",\"panelTitle\":\"Formát\",\"tag_address\":\"Adresa\",\"tag_div\":\"Normální (DIV)\",\"tag_h1\":\"Nadpis 1\",\"tag_h2\":\"Nadpis 2\",\"tag_h3\":\"Nadpis 3\",\"tag_h4\":\"Nadpis 4\",\"tag_h5\":\"Nadpis 5\",\"tag_h6\":\"Nadpis 6\",\"tag_p\":\"Normální\",\"tag_pre\":\"Naformátováno\"},\"horizontalrule\":{\"toolbar\":\"Vložit vodorovnou linku\"},\"iframe\":{\"border\":\"Zobrazit okraj\",\"noUrl\":\"Zadejte prosím URL obsahu pro IFrame\",\"scrolling\":\"Zapnout posuvníky\",\"title\":\"Vlastnosti IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativní text\",\"border\":\"Okraje\",\"btnUpload\":\"Odeslat na server\",\"button2Img\":\"Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?\",\"hSpace\":\"Horizontální mezera\",\"img2Button\":\"Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?\",\"infoTab\":\"Informace o obrázku\",\"linkTab\":\"Odkaz\",\"lockRatio\":\"Zámek\",\"menu\":\"Vlastnosti obrázku\",\"resetSize\":\"Původní velikost\",\"title\":\"Vlastnosti obrázku\",\"titleButton\":\"Vlastností obrázkového tlačítka\",\"upload\":\"Odeslat\",\"urlMissing\":\"Zadané URL zdroje obrázku nebylo nalezeno.\",\"vSpace\":\"Vertikální mezera\",\"validateBorder\":\"Okraj musí být nastaven v celých číslech.\",\"validateHSpace\":\"Horizontální mezera musí být nastavena v celých číslech.\",\"validateVSpace\":\"Vertikální mezera musí být nastavena v celých číslech.\"},\"indent\":{\"indent\":\"Zvětšit odsazení\",\"outdent\":\"Zmenšit odsazení\"},\"smiley\":{\"options\":\"Nastavení smajlíků\",\"title\":\"Vkládání smajlíků\",\"toolbar\":\"Smajlíci\"},\"justify\":{\"block\":\"Zarovnat do bloku\",\"center\":\"Zarovnat na střed\",\"left\":\"Zarovnat vlevo\",\"right\":\"Zarovnat vpravo\"},\"language\":{\"button\":\"Nastavit jazyk\",\"remove\":\"Odstranit jazyk\"},\"link\":{\"acccessKey\":\"Přístupový klíč\",\"advanced\":\"Rozšířené\",\"advisoryContentType\":\"Pomocný typ obsahu\",\"advisoryTitle\":\"Pomocný titulek\",\"anchor\":{\"toolbar\":\"Záložka\",\"menu\":\"Vlastnosti záložky\",\"title\":\"Vlastnosti záložky\",\"name\":\"Název záložky\",\"errorName\":\"Zadejte prosím název záložky\",\"remove\":\"Odstranit záložku\"},\"anchorId\":\"Podle Id objektu\",\"anchorName\":\"Podle jména kotvy\",\"charset\":\"Přiřazená znaková sada\",\"cssClasses\":\"Třída stylu\",\"emailAddress\":\"E-mailová adresa\",\"emailBody\":\"Tělo zprávy\",\"emailSubject\":\"Předmět zprávy\",\"id\":\"Id\",\"info\":\"Informace o odkazu\",\"langCode\":\"Kód jazyka\",\"langDir\":\"Směr jazyka\",\"langDirLTR\":\"Zleva doprava (LTR)\",\"langDirRTL\":\"Zprava doleva (RTL)\",\"menu\":\"Změnit odkaz\",\"name\":\"Jméno\",\"noAnchors\":\"(Ve stránce není definována žádná kotva!)\",\"noEmail\":\"Zadejte prosím e-mailovou adresu\",\"noUrl\":\"Zadejte prosím URL odkazu\",\"other\":\"<jiný>\",\"popupDependent\":\"Závislost (Netscape)\",\"popupFeatures\":\"Vlastnosti vyskakovacího okna\",\"popupFullScreen\":\"Celá obrazovka (IE)\",\"popupLeft\":\"Levý okraj\",\"popupLocationBar\":\"Panel umístění\",\"popupMenuBar\":\"Panel nabídky\",\"popupResizable\":\"Umožňující měnit velikost\",\"popupScrollBars\":\"Posuvníky\",\"popupStatusBar\":\"Stavový řádek\",\"popupToolbar\":\"Panel nástrojů\",\"popupTop\":\"Horní okraj\",\"rel\":\"Vztah\",\"selectAnchor\":\"Vybrat kotvu\",\"styles\":\"Styl\",\"tabIndex\":\"Pořadí prvku\",\"target\":\"Cíl\",\"targetFrame\":\"<rámec>\",\"targetFrameName\":\"Název cílového rámu\",\"targetPopup\":\"<vyskakovací okno>\",\"targetPopupName\":\"Název vyskakovacího okna\",\"title\":\"Odkaz\",\"toAnchor\":\"Kotva v této stránce\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Odkaz\",\"type\":\"Typ odkazu\",\"unlink\":\"Odstranit odkaz\",\"upload\":\"Odeslat\"},\"list\":{\"bulletedlist\":\"Odrážky\",\"numberedlist\":\"Číslování\"},\"liststyle\":{\"armenian\":\"Arménské\",\"bulletedTitle\":\"Vlastnosti odrážek\",\"circle\":\"Kroužky\",\"decimal\":\"Arabská čísla (1, 2, 3, atd.)\",\"decimalLeadingZero\":\"Arabská čísla uvozená nulou (01, 02, 03, atd.)\",\"disc\":\"Kolečka\",\"georgian\":\"Gruzínské (an, ban, gan, atd.)\",\"lowerAlpha\":\"Malá latinka (a, b, c, d, e, atd.)\",\"lowerGreek\":\"Malé řecké (alpha, beta, gamma, atd.)\",\"lowerRoman\":\"Malé římské (i, ii, iii, iv, v, atd.)\",\"none\":\"Nic\",\"notset\":\"<nenastaveno>\",\"numberedTitle\":\"Vlastnosti číslování\",\"square\":\"Čtverce\",\"start\":\"Počátek\",\"type\":\"Typ\",\"upperAlpha\":\"Velká latinka (A, B, C, D, E, atd.)\",\"upperRoman\":\"Velké římské (I, II, III, IV, V, atd.)\",\"validateStartNumber\":\"Číslování musí začínat celým číslem.\"},\"magicline\":{\"title\":\"zde vložit odstavec\"},\"maximize\":{\"maximize\":\"Maximalizovat\",\"minimize\":\"Minimalizovat\"},\"newpage\":{\"toolbar\":\"Nová stránka\"},\"pagebreak\":{\"alt\":\"Konec stránky\",\"toolbar\":\"Vložit konec stránky\"},\"pastetext\":{\"button\":\"Vložit jako čistý text\",\"title\":\"Vložit jako čistý text\"},\"pastefromword\":{\"confirmCleanup\":\"Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?\",\"error\":\"Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.\",\"title\":\"Vložit z Wordu\",\"toolbar\":\"Vložit z Wordu\"},\"preview\":{\"preview\":\"Náhled\"},\"print\":{\"toolbar\":\"Tisk\"},\"removeformat\":{\"toolbar\":\"Odstranit formátování\"},\"save\":{\"toolbar\":\"Uložit\"},\"selectall\":{\"toolbar\":\"Vybrat vše\"},\"showblocks\":{\"toolbar\":\"Ukázat bloky\"},\"sourcearea\":{\"toolbar\":\"Zdroj\"},\"specialchar\":{\"options\":\"Nastavení speciálních znaků\",\"title\":\"Výběr speciálního znaku\",\"toolbar\":\"Vložit speciální znaky\"},\"scayt\":{\"btn_about\":\"O aplikaci SCAYT\",\"btn_dictionaries\":\"Slovníky\",\"btn_disable\":\"Vypnout SCAYT\",\"btn_enable\":\"Zapnout SCAYT\",\"btn_langs\":\"Jazyky\",\"btn_options\":\"Nastavení\",\"text_title\":\"Kontrola pravopisu během psaní (SCAYT)\"},\"stylescombo\":{\"label\":\"Styl\",\"panelTitle\":\"Formátovací styly\",\"panelTitle1\":\"Blokové styly\",\"panelTitle2\":\"Řádkové styly\",\"panelTitle3\":\"Objektové styly\"},\"table\":{\"border\":\"Ohraničení\",\"caption\":\"Popis\",\"cell\":{\"menu\":\"Buňka\",\"insertBefore\":\"Vložit buňku před\",\"insertAfter\":\"Vložit buňku za\",\"deleteCell\":\"Smazat buňky\",\"merge\":\"Sloučit buňky\",\"mergeRight\":\"Sloučit doprava\",\"mergeDown\":\"Sloučit dolů\",\"splitHorizontal\":\"Rozdělit buňky vodorovně\",\"splitVertical\":\"Rozdělit buňky svisle\",\"title\":\"Vlastnosti buňky\",\"cellType\":\"Typ buňky\",\"rowSpan\":\"Spojit řádky\",\"colSpan\":\"Spojit sloupce\",\"wordWrap\":\"Zalamování\",\"hAlign\":\"Vodorovné zarovnání\",\"vAlign\":\"Svislé zarovnání\",\"alignBaseline\":\"Na účaří\",\"bgColor\":\"Barva pozadí\",\"borderColor\":\"Barva okraje\",\"data\":\"Data\",\"header\":\"Hlavička\",\"yes\":\"Ano\",\"no\":\"Ne\",\"invalidWidth\":\"Šířka buňky musí být číslo.\",\"invalidHeight\":\"Zadaná výška buňky musí být číslená.\",\"invalidRowSpan\":\"Zadaný počet sloučených řádků musí být celé číslo.\",\"invalidColSpan\":\"Zadaný počet sloučených sloupců musí být celé číslo.\",\"chooseColor\":\"Výběr\"},\"cellPad\":\"Odsazení obsahu v buňce\",\"cellSpace\":\"Vzdálenost buněk\",\"column\":{\"menu\":\"Sloupec\",\"insertBefore\":\"Vložit sloupec před\",\"insertAfter\":\"Vložit sloupec za\",\"deleteColumn\":\"Smazat sloupec\"},\"columns\":\"Sloupce\",\"deleteTable\":\"Smazat tabulku\",\"headers\":\"Záhlaví\",\"headersBoth\":\"Obojí\",\"headersColumn\":\"První sloupec\",\"headersNone\":\"Žádné\",\"headersRow\":\"První řádek\",\"invalidBorder\":\"Zdaná velikost okraje musí být číselná.\",\"invalidCellPadding\":\"Zadané odsazení obsahu v buňce musí být číselné.\",\"invalidCellSpacing\":\"Zadaná vzdálenost buněk musí být číselná.\",\"invalidCols\":\"Počet sloupců musí být číslo větší než 0.\",\"invalidHeight\":\"Zadaná výška tabulky musí být číselná.\",\"invalidRows\":\"Počet řádků musí být číslo větší než 0.\",\"invalidWidth\":\"Šířka tabulky musí být číslo.\",\"menu\":\"Vlastnosti tabulky\",\"row\":{\"menu\":\"Řádek\",\"insertBefore\":\"Vložit řádek před\",\"insertAfter\":\"Vložit řádek za\",\"deleteRow\":\"Smazat řádky\"},\"rows\":\"Řádky\",\"summary\":\"Souhrn\",\"title\":\"Vlastnosti tabulky\",\"toolbar\":\"Tabulka\",\"widthPc\":\"procent\",\"widthPx\":\"bodů\",\"widthUnit\":\"jednotka šířky\"},\"undo\":{\"redo\":\"Znovu\",\"undo\":\"Zpět\"},\"wsc\":{\"btnIgnore\":\"Přeskočit\",\"btnIgnoreAll\":\"Přeskakovat vše\",\"btnReplace\":\"Zaměnit\",\"btnReplaceAll\":\"Zaměňovat vše\",\"btnUndo\":\"Zpět\",\"changeTo\":\"Změnit na\",\"errorLoading\":\"Chyba nahrávání služby aplikace z: %s.\",\"ieSpellDownload\":\"Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?\",\"manyChanges\":\"Kontrola pravopisu dokončena: %1 slov změněno\",\"noChanges\":\"Kontrola pravopisu dokončena: Beze změn\",\"noMispell\":\"Kontrola pravopisu dokončena: Žádné pravopisné chyby nenalezeny\",\"noSuggestions\":\"- žádné návrhy -\",\"notAvailable\":\"Omlouváme se, ale služba nyní není dostupná.\",\"notInDic\":\"Není ve slovníku\",\"oneChange\":\"Kontrola pravopisu dokončena: Jedno slovo změněno\",\"progress\":\"Probíhá kontrola pravopisu...\",\"title\":\"Kontrola pravopisu\",\"toolbar\":\"Zkontrolovat pravopis\"}};"
  },
  {
    "path": "assets/ckeditor/lang/cy.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['cy']={\"editor\":\"Golygydd Testun Cyfoethog\",\"editorPanel\":\"Panel Golygydd Testun Cyfoethog\",\"common\":{\"editorHelp\":\"Gwasgwch ALT 0 am gymorth\",\"browseServer\":\"Pori'r Gweinydd\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Lanlwytho\",\"uploadSubmit\":\"Anfon i'r Gweinydd\",\"image\":\"Delwedd\",\"flash\":\"Flash\",\"form\":\"Ffurflen\",\"checkbox\":\"Blwch ticio\",\"radio\":\"Botwm Radio\",\"textField\":\"Maes Testun\",\"textarea\":\"Ardal Testun\",\"hiddenField\":\"Maes Cudd\",\"button\":\"Botwm\",\"select\":\"Maes Dewis\",\"imageButton\":\"Botwm Delwedd\",\"notSet\":\"<heb osod>\",\"id\":\"Id\",\"name\":\"Name\",\"langDir\":\"Cyfeiriad Iaith\",\"langDirLtr\":\"Chwith i'r Dde (LTR)\",\"langDirRtl\":\"Dde i'r Chwith (RTL)\",\"langCode\":\"Cod Iaith\",\"longDescr\":\"URL Disgrifiad Hir\",\"cssClass\":\"Dosbarthiadau Dalen Arddull\",\"advisoryTitle\":\"Teitl Cynghorol\",\"cssStyle\":\"Arddull\",\"ok\":\"Iawn\",\"cancel\":\"Diddymu\",\"close\":\"Cau\",\"preview\":\"Rhagolwg\",\"resize\":\"Ailfeintio\",\"generalTab\":\"Cyffredinol\",\"advancedTab\":\"Uwch\",\"validateNumberFailed\":\"'Dyw'r gwerth hwn ddim yn rhif.\",\"confirmNewPage\":\"Byddwch chi'n colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. Ydych am barhau i lwytho tudalen newydd?\",\"confirmCancel\":\"Cafodd rhai o'r opsiynau eu newid. Ydych chi wir am gau'r deialog?\",\"options\":\"Opsiynau\",\"target\":\"Targed\",\"targetNew\":\"Ffenest Newydd (_blank)\",\"targetTop\":\"Ffenest ar y Brig (_top)\",\"targetSelf\":\"Yr un Ffenest (_self)\",\"targetParent\":\"Ffenest y Rhiant (_parent)\",\"langDirLTR\":\"Chwith i'r Dde (LTR)\",\"langDirRTL\":\"Dde i'r Chwith (RTL)\",\"styles\":\"Arddull\",\"cssClasses\":\"Dosbarthiadau Dalen Arddull\",\"width\":\"Lled\",\"height\":\"Uchder\",\"align\":\"Alinio\",\"alignLeft\":\"Chwith\",\"alignRight\":\"Dde\",\"alignCenter\":\"Canol\",\"alignJustify\":\"Unioni\",\"alignTop\":\"Brig\",\"alignMiddle\":\"Canol\",\"alignBottom\":\"Gwaelod\",\"alignNone\":\"None\",\"invalidValue\":\"Gwerth annilys.\",\"invalidHeight\":\"Mae'n rhaid i'r uchder fod yn rhif.\",\"invalidWidth\":\"Mae'n rhaid i'r lled fod yn rhif.\",\"invalidCssLength\":\"Mae'n rhaid i'r gwerth ar gyfer maes \\\"%1\\\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).\",\"invalidHtmlLength\":\"Mae'n rhaid i'r gwerth ar gyfer maes \\\"%1\\\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).\",\"invalidInlineStyle\":\"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \\\"enw : gwerth\\\", wedi'u gwahanu gyda hanner colon.\",\"cssLengthTooltip\":\"Rhowch rif am werth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, ddim ar gael</span>\"},\"about\":{\"copy\":\"Hawlfraint &copy; $1. Cedwir pob hawl.\",\"dlgTitle\":\"Ynghylch CKEditor\",\"help\":\"Gwirio $1 am gymorth.\",\"moreInfo\":\"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:\",\"title\":\"Ynghylch CKEditor\",\"userGuide\":\"Canllawiau Defnyddiwr CKEditor\"},\"basicstyles\":{\"bold\":\"Bras\",\"italic\":\"Italig\",\"strike\":\"Llinell Trwyddo\",\"subscript\":\"Is-sgript\",\"superscript\":\"Uwchsgript\",\"underline\":\"Tanlinellu\"},\"bidi\":{\"ltr\":\"Cyfeiriad testun o'r chwith i'r dde\",\"rtl\":\"Cyfeiriad testun o'r dde i'r chwith\"},\"blockquote\":{\"toolbar\":\"Dyfyniad bloc\"},\"clipboard\":{\"copy\":\"Copïo\",\"copyError\":\"'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).\",\"cut\":\"Torri\",\"cutError\":\"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).\",\"paste\":\"Gludo\",\"pasteArea\":\"Ardal Gludo\",\"pasteMsg\":\"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.\",\"securityMsg\":\"Oherwydd gosodiadau diogelwch eich porwr, 'dyw'r porwr ddim yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.\",\"title\":\"Gludo\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Awtomatig\",\"bgColorTitle\":\"Lliw Cefndir\",\"colors\":{\"000\":\"Du\",\"800000\":\"Marwn\",\"8B4513\":\"Brown Cyfrwy\",\"2F4F4F\":\"Llechen Tywyll\",\"008080\":\"Corhwyad\",\"000080\":\"Nefi\",\"4B0082\":\"Indigo\",\"696969\":\"Llwyd Tywyll\",\"B22222\":\"Bric Tân\",\"A52A2A\":\"Brown\",\"DAA520\":\"Rhoden Aur\",\"006400\":\"Gwyrdd Tywyll\",\"40E0D0\":\"Gwyrddlas\",\"0000CD\":\"Glas Canolig\",\"800080\":\"Porffor\",\"808080\":\"Llwyd\",\"F00\":\"Coch\",\"FF8C00\":\"Oren Tywyll\",\"FFD700\":\"Aur\",\"008000\":\"Gwyrdd\",\"0FF\":\"Cyan\",\"00F\":\"Glas\",\"EE82EE\":\"Fioled\",\"A9A9A9\":\"Llwyd Pwl\",\"FFA07A\":\"Samwn Golau\",\"FFA500\":\"Oren\",\"FFFF00\":\"Melyn\",\"00FF00\":\"Leim\",\"AFEEEE\":\"Gwyrddlas Golau\",\"ADD8E6\":\"Glas Golau\",\"DDA0DD\":\"Eirinen\",\"D3D3D3\":\"Llwyd Golau\",\"FFF0F5\":\"Gwrid Lafant\",\"FAEBD7\":\"Gwyn Hynafol\",\"FFFFE0\":\"Melyn Golau\",\"F0FFF0\":\"Melwn Gwyrdd Golau\",\"F0FFFF\":\"Aswr\",\"F0F8FF\":\"Glas Alys\",\"E6E6FA\":\"Lafant\",\"FFF\":\"Gwyn\"},\"more\":\"Mwy o Liwiau...\",\"panelTitle\":\"Lliwiau\",\"textColorTitle\":\"Lliw Testun\"},\"colordialog\":{\"clear\":\"Clirio\",\"highlight\":\"Uwcholeuo\",\"options\":\"Opsiynau Lliw\",\"selected\":\"Lliw a Ddewiswyd\",\"title\":\"Dewis lliw\"},\"templates\":{\"button\":\"Templedi\",\"emptyListMsg\":\"(Dim templedi wedi'u diffinio)\",\"insertOption\":\"Amnewid y cynnwys go iawn\",\"options\":\"Opsiynau Templedi\",\"selectPromptMsg\":\"Dewiswch dempled i'w agor yn y golygydd\",\"title\":\"Templedi Cynnwys\"},\"contextmenu\":{\"options\":\"Opsiynau Dewislen Cyd-destun\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Teitl Cynghorol\",\"cssClassInputLabel\":\"Dosbarthiadau Ffeil Arddull\",\"edit\":\"Golygu Div\",\"inlineStyleInputLabel\":\"Arddull Mewn Llinell\",\"langDirLTRLabel\":\"Chwith i'r Dde (LTR)\",\"langDirLabel\":\"Cyfeiriad yr Iaith\",\"langDirRTLLabel\":\"Dde i'r Chwith (RTL)\",\"languageCodeInputLabel\":\" Cod Iaith\",\"remove\":\"Tynnu Div\",\"styleSelectLabel\":\"Arddull\",\"title\":\"Creu Cynhwysydd Div\",\"toolbar\":\"Creu Cynhwysydd Div\"},\"toolbar\":{\"toolbarCollapse\":\"Cyfangu'r Bar Offer\",\"toolbarExpand\":\"Ehangu'r Bar Offer\",\"toolbarGroups\":{\"document\":\"Dogfen\",\"clipboard\":\"Clipfwrdd/Dadwneud\",\"editing\":\"Golygu\",\"forms\":\"Ffurflenni\",\"basicstyles\":\"Arddulliau Sylfaenol\",\"paragraph\":\"Paragraff\",\"links\":\"Dolenni\",\"insert\":\"Mewnosod\",\"styles\":\"Arddulliau\",\"colors\":\"Lliwiau\",\"tools\":\"Offer\"},\"toolbars\":\"Bariau offer y golygydd\"},\"elementspath\":{\"eleLabel\":\"Llwybr elfennau\",\"eleTitle\":\"Elfen %1\"},\"find\":{\"find\":\"Chwilio\",\"findOptions\":\"Opsiynau Chwilio\",\"findWhat\":\"Chwilio'r term:\",\"matchCase\":\"Cydweddu'r cas\",\"matchCyclic\":\"Cydweddu'n gylchol\",\"matchWord\":\"Cydweddu gair cyfan\",\"notFoundMsg\":\"Nid oedd y testun wedi'i ddarganfod.\",\"replace\":\"Amnewid Un\",\"replaceAll\":\"Amnewid Pob\",\"replaceSuccessMsg\":\"Amnewidiwyd %1 achlysur.\",\"replaceWith\":\"Amnewid gyda:\",\"title\":\"Chwilio ac Amnewid\"},\"fakeobjects\":{\"anchor\":\"Angor\",\"flash\":\"Animeiddiant Flash\",\"hiddenfield\":\"Maes Cudd\",\"iframe\":\"IFrame\",\"unknown\":\"Gwrthrych Anhysbys\"},\"flash\":{\"access\":\"Mynediad Sgript\",\"accessAlways\":\"Pob amser\",\"accessNever\":\"Byth\",\"accessSameDomain\":\"R'un parth\",\"alignAbsBottom\":\"Gwaelod Abs\",\"alignAbsMiddle\":\"Canol Abs\",\"alignBaseline\":\"Baslinell\",\"alignTextTop\":\"Testun Top\",\"bgcolor\":\"Lliw cefndir\",\"chkFull\":\"Caniatàu Sgrin Llawn\",\"chkLoop\":\"Lwpio\",\"chkMenu\":\"Galluogi Dewislen Flash\",\"chkPlay\":\"AwtoChwarae\",\"flashvars\":\"Newidynnau ar gyfer Flash\",\"hSpace\":\"BwlchLl\",\"properties\":\"Priodweddau Flash\",\"propertiesTab\":\"Priodweddau\",\"quality\":\"Ansawdd\",\"qualityAutoHigh\":\"Uchel Awto\",\"qualityAutoLow\":\"Isel Awto\",\"qualityBest\":\"Gorau\",\"qualityHigh\":\"Uchel\",\"qualityLow\":\"Isel\",\"qualityMedium\":\"Canolig\",\"scale\":\"Graddfa\",\"scaleAll\":\"Dangos pob\",\"scaleFit\":\"Ffit Union\",\"scaleNoBorder\":\"Dim Ymyl\",\"title\":\"Priodweddau Flash\",\"vSpace\":\"BwlchF\",\"validateHSpace\":\"Rhaid i'r BwlchLl fod yn rhif.\",\"validateSrc\":\"Ni all yr URL fod yn wag.\",\"validateVSpace\":\"Rhaid i'r BwlchF fod yn rhif.\",\"windowMode\":\"Modd ffenestr\",\"windowModeOpaque\":\"Afloyw\",\"windowModeTransparent\":\"Tryloyw\",\"windowModeWindow\":\"Ffenestr\"},\"font\":{\"fontSize\":{\"label\":\"Maint\",\"voiceLabel\":\"Maint y Ffont\",\"panelTitle\":\"Maint y Ffont\"},\"label\":\"Ffont\",\"panelTitle\":\"Enw'r Ffont\",\"voiceLabel\":\"Ffont\"},\"forms\":{\"button\":{\"title\":\"Priodweddau Botymau\",\"text\":\"Testun (Gwerth)\",\"type\":\"Math\",\"typeBtn\":\"Botwm\",\"typeSbm\":\"Anfon\",\"typeRst\":\"Ailosod\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Priodweddau Blwch Ticio\",\"radioTitle\":\"Priodweddau Botwm Radio\",\"value\":\"Gwerth\",\"selected\":\"Dewiswyd\",\"required\":\"Required\"},\"form\":{\"title\":\"Priodweddau Ffurflen\",\"menu\":\"Priodweddau Ffurflen\",\"action\":\"Gweithred\",\"method\":\"Dull\",\"encoding\":\"Amgodio\"},\"hidden\":{\"title\":\"Priodweddau Maes Cudd\",\"name\":\"Enw\",\"value\":\"Gwerth\"},\"select\":{\"title\":\"Priodweddau Maes Dewis\",\"selectInfo\":\"Gwyb Dewis\",\"opAvail\":\"Opsiynau ar Gael\",\"value\":\"Gwerth\",\"size\":\"Maint\",\"lines\":\"llinellau\",\"chkMulti\":\"Caniatàu aml-ddewisiadau\",\"required\":\"Required\",\"opText\":\"Testun\",\"opValue\":\"Gwerth\",\"btnAdd\":\"Ychwanegu\",\"btnModify\":\"Newid\",\"btnUp\":\"Lan\",\"btnDown\":\"Lawr\",\"btnSetValue\":\"Gosod fel gwerth a ddewiswyd\",\"btnDelete\":\"Dileu\"},\"textarea\":{\"title\":\"Priodweddau Ardal Testun\",\"cols\":\"Colofnau\",\"rows\":\"Rhesi\"},\"textfield\":{\"title\":\"Priodweddau Maes Testun\",\"name\":\"Enw\",\"value\":\"Gwerth\",\"charWidth\":\"Lled Nod\",\"maxChars\":\"Uchafswm y Nodau\",\"required\":\"Required\",\"type\":\"Math\",\"typeText\":\"Testun\",\"typePass\":\"Cyfrinair\",\"typeEmail\":\"Ebost\",\"typeSearch\":\"Chwilio\",\"typeTel\":\"Rhif Ffôn\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Fformat\",\"panelTitle\":\"Fformat Paragraff\",\"tag_address\":\"Cyfeiriad\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Pennawd 1\",\"tag_h2\":\"Pennawd 2\",\"tag_h3\":\"Pennawd 3\",\"tag_h4\":\"Pennawd 4\",\"tag_h5\":\"Pennawd 5\",\"tag_h6\":\"Pennawd 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Wedi'i Fformatio\"},\"horizontalrule\":{\"toolbar\":\"Mewnosod Llinell Lorweddol\"},\"iframe\":{\"border\":\"Dangos ymyl y ffrâm\",\"noUrl\":\"Rhowch URL yr iframe\",\"scrolling\":\"Galluogi bariau sgrolio\",\"title\":\"Priodweddau IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Testun Amgen\",\"border\":\"Ymyl\",\"btnUpload\":\"Anfon i'r Gweinydd\",\"button2Img\":\"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?\",\"hSpace\":\"BwlchLl\",\"img2Button\":\"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?\",\"infoTab\":\"Gwyb Delwedd\",\"linkTab\":\"Dolen\",\"lockRatio\":\"Cloi Cymhareb\",\"menu\":\"Priodweddau Delwedd\",\"resetSize\":\"Ailosod Maint\",\"title\":\"Priodweddau Delwedd\",\"titleButton\":\"Priodweddau Botwm Delwedd\",\"upload\":\"Lanlwytho\",\"urlMissing\":\"URL gwreiddiol y ddelwedd ar goll.\",\"vSpace\":\"BwlchF\",\"validateBorder\":\"Rhaid i'r ymyl fod yn gyfanrif.\",\"validateHSpace\":\"Rhaid i'r HSpace fod yn gyfanrif.\",\"validateVSpace\":\"Rhaid i'r VSpace fod yn gyfanrif.\"},\"indent\":{\"indent\":\"Cynyddu'r Mewnoliad\",\"outdent\":\"Lleihau'r Mewnoliad\"},\"smiley\":{\"options\":\"Opsiynau Gwenogluniau\",\"title\":\"Mewnosod Gwenoglun\",\"toolbar\":\"Gwenoglun\"},\"justify\":{\"block\":\"Unioni\",\"center\":\"Alinio i'r Canol\",\"left\":\"Alinio i'r Chwith\",\"right\":\"Alinio i'r Dde\"},\"language\":{\"button\":\"Gosod iaith\",\"remove\":\"Tynnu iaith\"},\"link\":{\"acccessKey\":\"Allwedd Mynediad\",\"advanced\":\"Uwch\",\"advisoryContentType\":\"Math y Cynnwys Cynghorol\",\"advisoryTitle\":\"Teitl Cynghorol\",\"anchor\":{\"toolbar\":\"Angor\",\"menu\":\"Golygu'r Angor\",\"title\":\"Priodweddau'r Angor\",\"name\":\"Enw'r Angor\",\"errorName\":\"Teipiwch enw'r angor\",\"remove\":\"Tynnwch yr Angor\"},\"anchorId\":\"Gan Id yr Elfen\",\"anchorName\":\"Gan Enw'r Angor\",\"charset\":\"Set Nodau'r Adnodd Cysylltiedig\",\"cssClasses\":\"Dosbarthiadau Dalen Arddull\",\"emailAddress\":\"Cyfeiriad E-Bost\",\"emailBody\":\"Corff y Neges\",\"emailSubject\":\"Testun y Neges\",\"id\":\"Id\",\"info\":\"Gwyb y Ddolen\",\"langCode\":\"Cod Iaith\",\"langDir\":\"Cyfeiriad Iaith\",\"langDirLTR\":\"Chwith i'r Dde (LTR)\",\"langDirRTL\":\"Dde i'r Chwith (RTL)\",\"menu\":\"Golygu Dolen\",\"name\":\"Enw\",\"noAnchors\":\"(Dim angorau ar gael yn y ddogfen)\",\"noEmail\":\"Teipiwch gyfeiriad yr e-bost\",\"noUrl\":\"Teipiwch URL y ddolen\",\"other\":\"<eraill>\",\"popupDependent\":\"Dibynnol (Netscape)\",\"popupFeatures\":\"Nodweddion Ffenestr Bop\",\"popupFullScreen\":\"Sgrin Llawn (IE)\",\"popupLeft\":\"Safle Chwith\",\"popupLocationBar\":\"Bar Safle\",\"popupMenuBar\":\"Dewislen\",\"popupResizable\":\"Ailfeintiol\",\"popupScrollBars\":\"Barrau Sgrolio\",\"popupStatusBar\":\"Bar Statws\",\"popupToolbar\":\"Bar Offer\",\"popupTop\":\"Safle Top\",\"rel\":\"Perthynas\",\"selectAnchor\":\"Dewiswch Angor\",\"styles\":\"Arddull\",\"tabIndex\":\"Indecs Tab\",\"target\":\"Targed\",\"targetFrame\":\"<ffrâm>\",\"targetFrameName\":\"Enw Ffrâm y Targed\",\"targetPopup\":\"<ffenestr bop>\",\"targetPopupName\":\"Enw Ffenestr Bop\",\"title\":\"Dolen\",\"toAnchor\":\"Dolen at angor yn y testun\",\"toEmail\":\"E-bost\",\"toUrl\":\"URL\",\"toolbar\":\"Dolen\",\"type\":\"Math y Ddolen\",\"unlink\":\"Datgysylltu\",\"upload\":\"Lanlwytho\"},\"list\":{\"bulletedlist\":\"Mewnosod/Tynnu Rhestr Bwled\",\"numberedlist\":\"Mewnosod/Tynnu Rhestr Rhifol\"},\"liststyle\":{\"armenian\":\"Rhifo Armeneg\",\"bulletedTitle\":\"Priodweddau Rhestr Fwled\",\"circle\":\"Cylch\",\"decimal\":\"Degol (1, 2, 3, ayyb.)\",\"decimalLeadingZero\":\"Degol â sero arweiniol (01, 02, 03, ayyb.)\",\"disc\":\"Disg\",\"georgian\":\"Rhifau Sioraidd (an, ban, gan, ayyb.)\",\"lowerAlpha\":\"Alffa Is (a, b, c, d, e, ayyb.)\",\"lowerGreek\":\"Groeg Is (alpha, beta, gamma, ayyb.)\",\"lowerRoman\":\"Rhufeinig Is (i, ii, iii, iv, v, ayyb.)\",\"none\":\"Dim\",\"notset\":\"<heb osod>\",\"numberedTitle\":\"Priodweddau Rhestr Rifol\",\"square\":\"Sgwâr\",\"start\":\"Dechrau\",\"type\":\"Math\",\"upperAlpha\":\"Alffa Uwch (A, B, C, D, E, ayyb.)\",\"upperRoman\":\"Rhufeinig Uwch (I, II, III, IV, V, ayyb.)\",\"validateStartNumber\":\"Rhaid bod y rhif cychwynnol yn gyfanrif.\"},\"magicline\":{\"title\":\"Mewnosod paragraff yma\"},\"maximize\":{\"maximize\":\"Mwyhau\",\"minimize\":\"Lleihau\"},\"newpage\":{\"toolbar\":\"Tudalen Newydd\"},\"pagebreak\":{\"alt\":\"Toriad Tudalen\",\"toolbar\":\"Mewnosod Toriad Tudalen i Argraffu\"},\"pastetext\":{\"button\":\"Gludo fel testun plaen\",\"title\":\"Gludo fel Testun Plaen\"},\"pastefromword\":{\"confirmCleanup\":\"Mae'r testun rydych chi am ludo wedi'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?\",\"error\":\"Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol\",\"title\":\"Gludo o Word\",\"toolbar\":\"Gludo o Word\"},\"preview\":{\"preview\":\"Rhagolwg\"},\"print\":{\"toolbar\":\"Argraffu\"},\"removeformat\":{\"toolbar\":\"Tynnu Fformat\"},\"save\":{\"toolbar\":\"Cadw\"},\"selectall\":{\"toolbar\":\"Dewis Popeth\"},\"showblocks\":{\"toolbar\":\"Dangos Blociau\"},\"sourcearea\":{\"toolbar\":\"HTML\"},\"specialchar\":{\"options\":\"Opsiynau Nodau Arbennig\",\"title\":\"Dewis Nod Arbennig\",\"toolbar\":\"Mewnosod Nod Arbennig\"},\"scayt\":{\"btn_about\":\"Ynghylch SCAYT\",\"btn_dictionaries\":\"Geiriaduron\",\"btn_disable\":\"Analluogi SCAYT\",\"btn_enable\":\"Galluogi SCAYT\",\"btn_langs\":\"Ieithoedd\",\"btn_options\":\"Opsiynau\",\"text_title\":\"Gwirio'r Sillafu Wrth Deipio\"},\"stylescombo\":{\"label\":\"Arddulliau\",\"panelTitle\":\"Arddulliau Fformatio\",\"panelTitle1\":\"Arddulliau Bloc\",\"panelTitle2\":\"Arddulliau Mewnol\",\"panelTitle3\":\"Arddulliau Gwrthrych\"},\"table\":{\"border\":\"Maint yr Ymyl\",\"caption\":\"Pennawd\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Mewnosod Cell Cyn\",\"insertAfter\":\"Mewnosod Cell Ar Ôl\",\"deleteCell\":\"Dileu Celloedd\",\"merge\":\"Cyfuno Celloedd\",\"mergeRight\":\"Cyfuno i'r Dde\",\"mergeDown\":\"Cyfuno i Lawr\",\"splitHorizontal\":\"Hollti'r Gell yn Lorweddol\",\"splitVertical\":\"Hollti'r Gell yn Fertigol\",\"title\":\"Priodweddau'r Gell\",\"cellType\":\"Math y Gell\",\"rowSpan\":\"Rhychwant Rhesi\",\"colSpan\":\"Rhychwant Colofnau\",\"wordWrap\":\"Lapio Geiriau\",\"hAlign\":\"Aliniad Llorweddol\",\"vAlign\":\"Aliniad Fertigol\",\"alignBaseline\":\"Baslinell\",\"bgColor\":\"Lliw Cefndir\",\"borderColor\":\"Lliw Ymyl\",\"data\":\"Data\",\"header\":\"Pennyn\",\"yes\":\"Ie\",\"no\":\"Na\",\"invalidWidth\":\"Mae'n rhaid i led y gell fod yn rhif.\",\"invalidHeight\":\"Mae'n rhaid i uchder y gell fod yn rhif.\",\"invalidRowSpan\":\"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.\",\"invalidColSpan\":\"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.\",\"chooseColor\":\"Dewis\"},\"cellPad\":\"Padio'r gell\",\"cellSpace\":\"Bylchiad y gell\",\"column\":{\"menu\":\"Colofn\",\"insertBefore\":\"Mewnosod Colofn Cyn\",\"insertAfter\":\"Mewnosod Colofn Ar Ôl\",\"deleteColumn\":\"Dileu Colofnau\"},\"columns\":\"Colofnau\",\"deleteTable\":\"Dileu Tabl\",\"headers\":\"Penynnau\",\"headersBoth\":\"Y Ddau\",\"headersColumn\":\"Colofn gyntaf\",\"headersNone\":\"Dim\",\"headersRow\":\"Rhes gyntaf\",\"invalidBorder\":\"Mae'n rhaid i faint yr ymyl fod yn rhif.\",\"invalidCellPadding\":\"Mae'n rhaid i badiad y gell fod yn rhif positif.\",\"invalidCellSpacing\":\"Mae'n rhaid i fylchiad y gell fod yn rhif positif.\",\"invalidCols\":\"Mae'n rhaid cael o leiaf un golofn.\",\"invalidHeight\":\"Mae'n rhaid i uchder y tabl fod yn rhif.\",\"invalidRows\":\"Mae'n rhaid cael o leiaf un rhes.\",\"invalidWidth\":\"Mae'n rhaid i led y tabl fod yn rhif.\",\"menu\":\"Priodweddau'r Tabl\",\"row\":{\"menu\":\"Rhes\",\"insertBefore\":\"Mewnosod Rhes Cyn\",\"insertAfter\":\"Mewnosod Rhes Ar Ôl\",\"deleteRow\":\"Dileu Rhesi\"},\"rows\":\"Rhesi\",\"summary\":\"Crynodeb\",\"title\":\"Priodweddau'r Tabl\",\"toolbar\":\"Tabl\",\"widthPc\":\"y cant\",\"widthPx\":\"picsel\",\"widthUnit\":\"uned lled\"},\"undo\":{\"redo\":\"Ailwneud\",\"undo\":\"Dadwneud\"},\"wsc\":{\"btnIgnore\":\"Anwybyddu Un\",\"btnIgnoreAll\":\"Anwybyddu Pob\",\"btnReplace\":\"Amnewid Un\",\"btnReplaceAll\":\"Amnewid Pob\",\"btnUndo\":\"Dadwneud\",\"changeTo\":\"Newid i\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?\",\"manyChanges\":\"Gwirio sillafu wedi gorffen: Newidiwyd %1 gair\",\"noChanges\":\"Gwirio sillafu wedi gorffen: Dim newidiadau\",\"noMispell\":\"Gwirio sillafu wedi gorffen: Dim camsillaf.\",\"noSuggestions\":\"- Dim awgrymiadau -\",\"notAvailable\":\"Nid yw'r gwasanaeth hwn ar gael yn bresennol.\",\"notInDic\":\"Nid i'w gael yn y geiriadur\",\"oneChange\":\"Gwirio sillafu wedi gorffen: Newidiwyd 1 gair\",\"progress\":\"Gwirio sillafu yn ar y gweill...\",\"title\":\"Gwirio Sillafu\",\"toolbar\":\"Gwirio Sillafu\"}};"
  },
  {
    "path": "assets/ckeditor/lang/da.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['da']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Tryk ALT 0 for hjælp\",\"browseServer\":\"Gennemse...\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Upload\",\"uploadSubmit\":\"Upload\",\"image\":\"Indsæt billede\",\"flash\":\"Indsæt Flash\",\"form\":\"Indsæt formular\",\"checkbox\":\"Indsæt afkrydsningsfelt\",\"radio\":\"Indsæt alternativknap\",\"textField\":\"Indsæt tekstfelt\",\"textarea\":\"Indsæt tekstboks\",\"hiddenField\":\"Indsæt skjult felt\",\"button\":\"Indsæt knap\",\"select\":\"Indsæt liste\",\"imageButton\":\"Indsæt billedknap\",\"notSet\":\"<intet valgt>\",\"id\":\"Id\",\"name\":\"Navn\",\"langDir\":\"Tekstretning\",\"langDirLtr\":\"Fra venstre mod højre (LTR)\",\"langDirRtl\":\"Fra højre mod venstre (RTL)\",\"langCode\":\"Sprogkode\",\"longDescr\":\"Udvidet beskrivelse\",\"cssClass\":\"Typografiark (CSS)\",\"advisoryTitle\":\"Titel\",\"cssStyle\":\"Typografi (CSS)\",\"ok\":\"OK\",\"cancel\":\"Annullér\",\"close\":\"Luk\",\"preview\":\"Forhåndsvisning\",\"resize\":\"Træk for at skalere\",\"generalTab\":\"Generelt\",\"advancedTab\":\"Avanceret\",\"validateNumberFailed\":\"Værdien er ikke et tal.\",\"confirmNewPage\":\"Alt indhold, der ikke er blevet gemt, vil gå tabt. Er du sikker på, at du vil indlæse en ny side?\",\"confirmCancel\":\"Nogle af indstillingerne er blevet ændret. Er du sikker på, at du vil lukke vinduet?\",\"options\":\"Vis muligheder\",\"target\":\"Mål\",\"targetNew\":\"Nyt vindue (_blank)\",\"targetTop\":\"Øverste vindue (_top)\",\"targetSelf\":\"Samme vindue (_self)\",\"targetParent\":\"Samme vindue (_parent)\",\"langDirLTR\":\"Venstre til højre (LTR)\",\"langDirRTL\":\"Højre til venstre (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheetklasser\",\"width\":\"Bredde\",\"height\":\"Højde\",\"align\":\"Justering\",\"alignLeft\":\"Venstre\",\"alignRight\":\"Højre\",\"alignCenter\":\"Centreret\",\"alignJustify\":\"Lige margener\",\"alignTop\":\"Øverst\",\"alignMiddle\":\"Centreret\",\"alignBottom\":\"Nederst\",\"alignNone\":\"Ingen\",\"invalidValue\":\"Ugyldig værdi.\",\"invalidHeight\":\"Højde skal være et tal.\",\"invalidWidth\":\"Bredde skal være et tal.\",\"invalidCssLength\":\"Værdien specificeret for \\\"%1\\\" feltet skal være et positivt nummer med eller uden en CSS måleenhed  (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"invalidHtmlLength\":\"Værdien specificeret for \\\"%1\\\" feltet skal være et positivt nummer med eller uden en CSS måleenhed  (px eller %).\",\"invalidInlineStyle\":\"Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som \\\"name:value\\\", separeret af semikoloner\",\"cssLengthTooltip\":\"Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, ikke tilgængelig</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alle rettigheder forbeholdes.\",\"dlgTitle\":\"Om CKEditor\",\"help\":\"Se $1 for at få hjælp.\",\"moreInfo\":\"For informationer omkring licens, se venligst vores hjemmeside (på engelsk):\",\"title\":\"Om CKEditor\",\"userGuide\":\"CKEditor-brugermanual\"},\"basicstyles\":{\"bold\":\"Fed\",\"italic\":\"Kursiv\",\"strike\":\"Gennemstreget\",\"subscript\":\"Sænket skrift\",\"superscript\":\"Hævet skrift\",\"underline\":\"Understreget\"},\"bidi\":{\"ltr\":\"Tekstretning fra venstre til højre\",\"rtl\":\"Tekstretning fra højre til venstre\"},\"blockquote\":{\"toolbar\":\"Blokcitat\"},\"clipboard\":{\"copy\":\"Kopiér\",\"copyError\":\"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).\",\"cut\":\"Klip\",\"cutError\":\"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).\",\"paste\":\"Indsæt\",\"pasteArea\":\"Indsæt område\",\"pasteMsg\":\"Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.\",\"securityMsg\":\"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.\",\"title\":\"Indsæt\"},\"button\":{\"selectedLabel\":\"%1 (Valgt)\"},\"colorbutton\":{\"auto\":\"Automatisk\",\"bgColorTitle\":\"Baggrundsfarve\",\"colors\":{\"000\":\"Sort\",\"800000\":\"Mørkerød\",\"8B4513\":\"Mørk orange\",\"2F4F4F\":\"Dark Slate Grå\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Mørkegrå\",\"B22222\":\"Scarlet / Rød\",\"A52A2A\":\"Brun\",\"DAA520\":\"Guld\",\"006400\":\"Mørkegrøn\",\"40E0D0\":\"Tyrkis\",\"0000CD\":\"Mellemblå\",\"800080\":\"Lilla\",\"808080\":\"Grå\",\"F00\":\"Rød\",\"FF8C00\":\"Mørk orange\",\"FFD700\":\"Guld\",\"008000\":\"Grøn\",\"0FF\":\"Cyan\",\"00F\":\"Blå\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Matgrå\",\"FFA07A\":\"Laksefarve\",\"FFA500\":\"Orange\",\"FFFF00\":\"Gul\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Mat tyrkis\",\"ADD8E6\":\"Lyseblå\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Lysegrå\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antikhvid\",\"FFFFE0\":\"Lysegul\",\"F0FFF0\":\"Gul / Beige\",\"F0FFFF\":\"Himmeblå\",\"F0F8FF\":\"Alice blue\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Hvid\"},\"more\":\"Flere farver...\",\"panelTitle\":\"Farver\",\"textColorTitle\":\"Tekstfarve\"},\"colordialog\":{\"clear\":\"Nulstil\",\"highlight\":\"Markér\",\"options\":\"Farvemuligheder\",\"selected\":\"Valgt farve\",\"title\":\"Vælg farve\"},\"templates\":{\"button\":\"Skabeloner\",\"emptyListMsg\":\"(Der er ikke defineret nogen skabelon)\",\"insertOption\":\"Erstat det faktiske indhold\",\"options\":\"Skabelon muligheder\",\"selectPromptMsg\":\"Vælg den skabelon, som skal åbnes i editoren (nuværende indhold vil blive overskrevet):\",\"title\":\"Indholdsskabeloner\"},\"contextmenu\":{\"options\":\"Muligheder for hjælpemenu\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Vejledende titel\",\"cssClassInputLabel\":\"Typografiark\",\"edit\":\"Rediger Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Venstre til højre (LTR)\",\"langDirLabel\":\"Sprogretning\",\"langDirRTLLabel\":\"Højre til venstre (RTL)\",\"languageCodeInputLabel\":\" Sprogkode\",\"remove\":\"Slet Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Opret Div Container\",\"toolbar\":\"Opret Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Sammenklap værktøjslinje\",\"toolbarExpand\":\"Udvid værktøjslinje\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Udklipsholder/Fortryd\",\"editing\":\"Redigering\",\"forms\":\"Formularer\",\"basicstyles\":\"Basis styles\",\"paragraph\":\"Paragraf\",\"links\":\"Links\",\"insert\":\"Indsæt\",\"styles\":\"Typografier\",\"colors\":\"Farver\",\"tools\":\"Værktøjer\"},\"toolbars\":\"Editors værktøjslinjer\"},\"elementspath\":{\"eleLabel\":\"Sti på element\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Søg\",\"findOptions\":\"Find muligheder\",\"findWhat\":\"Søg efter:\",\"matchCase\":\"Forskel på store og små bogstaver\",\"matchCyclic\":\"Match cyklisk\",\"matchWord\":\"Kun hele ord\",\"notFoundMsg\":\"Søgeteksten blev ikke fundet\",\"replace\":\"Erstat\",\"replaceAll\":\"Erstat alle\",\"replaceSuccessMsg\":\"%1 forekomst(er) erstattet.\",\"replaceWith\":\"Erstat med:\",\"title\":\"Søg og erstat\"},\"fakeobjects\":{\"anchor\":\"Anker\",\"flash\":\"Flashanimation\",\"hiddenfield\":\"Skjult felt\",\"iframe\":\"Iframe\",\"unknown\":\"Ukendt objekt\"},\"flash\":{\"access\":\"Scriptadgang\",\"accessAlways\":\"Altid\",\"accessNever\":\"Aldrig\",\"accessSameDomain\":\"Samme domæne\",\"alignAbsBottom\":\"Absolut nederst\",\"alignAbsMiddle\":\"Absolut centreret\",\"alignBaseline\":\"Grundlinje\",\"alignTextTop\":\"Toppen af teksten\",\"bgcolor\":\"Baggrundsfarve\",\"chkFull\":\"Tillad fuldskærm\",\"chkLoop\":\"Gentagelse\",\"chkMenu\":\"Vis Flash-menu\",\"chkPlay\":\"Automatisk afspilning\",\"flashvars\":\"Variabler for Flash\",\"hSpace\":\"Vandret margen\",\"properties\":\"Egenskaber for Flash\",\"propertiesTab\":\"Egenskaber\",\"quality\":\"Kvalitet\",\"qualityAutoHigh\":\"Auto høj\",\"qualityAutoLow\":\"Auto lav\",\"qualityBest\":\"Bedste\",\"qualityHigh\":\"Høj\",\"qualityLow\":\"Lav\",\"qualityMedium\":\"Medium\",\"scale\":\"Skalér\",\"scaleAll\":\"Vis alt\",\"scaleFit\":\"Tilpas størrelse\",\"scaleNoBorder\":\"Ingen ramme\",\"title\":\"Egenskaber for Flash\",\"vSpace\":\"Lodret margen\",\"validateHSpace\":\"Vandret margen skal være et tal.\",\"validateSrc\":\"Indtast hyperlink URL!\",\"validateVSpace\":\"Lodret margen skal være et tal.\",\"windowMode\":\"Vinduestilstand\",\"windowModeOpaque\":\"Gennemsigtig (opaque)\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Vindue\"},\"font\":{\"fontSize\":{\"label\":\"Skriftstørrelse\",\"voiceLabel\":\"Skriftstørrelse\",\"panelTitle\":\"Skriftstørrelse\"},\"label\":\"Skrifttype\",\"panelTitle\":\"Skrifttype\",\"voiceLabel\":\"Skrifttype\"},\"forms\":{\"button\":{\"title\":\"Egenskaber for knap\",\"text\":\"Tekst\",\"type\":\"Type\",\"typeBtn\":\"Knap\",\"typeSbm\":\"Send\",\"typeRst\":\"Nulstil\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Egenskaber for afkrydsningsfelt\",\"radioTitle\":\"Egenskaber for alternativknap\",\"value\":\"Værdi\",\"selected\":\"Valgt\",\"required\":\"Påkrævet\"},\"form\":{\"title\":\"Egenskaber for formular\",\"menu\":\"Egenskaber for formular\",\"action\":\"Handling\",\"method\":\"Metode\",\"encoding\":\"Kodning (encoding)\"},\"hidden\":{\"title\":\"Egenskaber for skjult felt\",\"name\":\"Navn\",\"value\":\"Værdi\"},\"select\":{\"title\":\"Egenskaber for liste\",\"selectInfo\":\"Generelt\",\"opAvail\":\"Valgmuligheder\",\"value\":\"Værdi\",\"size\":\"Størrelse\",\"lines\":\"Linjer\",\"chkMulti\":\"Tillad flere valg\",\"required\":\"Påkrævet\",\"opText\":\"Tekst\",\"opValue\":\"Værdi\",\"btnAdd\":\"Tilføj\",\"btnModify\":\"Redigér\",\"btnUp\":\"Op\",\"btnDown\":\"Ned\",\"btnSetValue\":\"Sæt som valgt\",\"btnDelete\":\"Slet\"},\"textarea\":{\"title\":\"Egenskaber for tekstboks\",\"cols\":\"Kolonner\",\"rows\":\"Rækker\"},\"textfield\":{\"title\":\"Egenskaber for tekstfelt\",\"name\":\"Navn\",\"value\":\"Værdi\",\"charWidth\":\"Bredde (tegn)\",\"maxChars\":\"Max. antal tegn\",\"required\":\"Påkrævet\",\"type\":\"Type\",\"typeText\":\"Tekst\",\"typePass\":\"Adgangskode\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Søg\",\"typeTel\":\"Telefon nummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formatering\",\"panelTitle\":\"Formatering\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Overskrift 1\",\"tag_h2\":\"Overskrift 2\",\"tag_h3\":\"Overskrift 3\",\"tag_h4\":\"Overskrift 4\",\"tag_h5\":\"Overskrift 5\",\"tag_h6\":\"Overskrift 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formateret\"},\"horizontalrule\":{\"toolbar\":\"Indsæt vandret streg\"},\"iframe\":{\"border\":\"Vis kant på rammen\",\"noUrl\":\"Venligst indsæt URL på iframen\",\"scrolling\":\"Aktiver scrollbars\",\"title\":\"Iframe egenskaber\",\"toolbar\":\"Iframe\"},\"image\":{\"alt\":\"Alternativ tekst\",\"border\":\"Ramme\",\"btnUpload\":\"Upload fil til serveren\",\"button2Img\":\"Vil du lave billedknappen om til et almindeligt billede?\",\"hSpace\":\"Vandret margen\",\"img2Button\":\"Vil du lave billedet om til en billedknap?\",\"infoTab\":\"Generelt\",\"linkTab\":\"Hyperlink\",\"lockRatio\":\"Lås størrelsesforhold\",\"menu\":\"Egenskaber for billede\",\"resetSize\":\"Nulstil størrelse\",\"title\":\"Egenskaber for billede\",\"titleButton\":\"Egenskaber for billedknap\",\"upload\":\"Upload\",\"urlMissing\":\"Kilde på billed-URL mangler\",\"vSpace\":\"Lodret margen\",\"validateBorder\":\"Kant skal være et helt nummer.\",\"validateHSpace\":\"HSpace skal være et helt nummer.\",\"validateVSpace\":\"VSpace skal være et helt nummer.\"},\"indent\":{\"indent\":\"Forøg indrykning\",\"outdent\":\"Formindsk indrykning\"},\"smiley\":{\"options\":\"Smileymuligheder\",\"title\":\"Vælg smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Lige margener\",\"center\":\"Centreret\",\"left\":\"Venstrestillet\",\"right\":\"Højrestillet\"},\"language\":{\"button\":\"Vælg sprog\",\"remove\":\"Fjern sprog\"},\"link\":{\"acccessKey\":\"Genvejstast\",\"advanced\":\"Avanceret\",\"advisoryContentType\":\"Indholdstype\",\"advisoryTitle\":\"Titel\",\"anchor\":{\"toolbar\":\"Indsæt/redigér bogmærke\",\"menu\":\"Egenskaber for bogmærke\",\"title\":\"Egenskaber for bogmærke\",\"name\":\"Bogmærkenavn\",\"errorName\":\"Indtast bogmærkenavn\",\"remove\":\"Fjern bogmærke\"},\"anchorId\":\"Efter element-Id\",\"anchorName\":\"Efter ankernavn\",\"charset\":\"Tegnsæt\",\"cssClasses\":\"Typografiark\",\"emailAddress\":\"E-mailadresse\",\"emailBody\":\"Besked\",\"emailSubject\":\"Emne\",\"id\":\"Id\",\"info\":\"Generelt\",\"langCode\":\"Tekstretning\",\"langDir\":\"Tekstretning\",\"langDirLTR\":\"Fra venstre mod højre (LTR)\",\"langDirRTL\":\"Fra højre mod venstre (RTL)\",\"menu\":\"Redigér hyperlink\",\"name\":\"Navn\",\"noAnchors\":\"(Ingen bogmærker i dokumentet)\",\"noEmail\":\"Indtast e-mailadresse!\",\"noUrl\":\"Indtast hyperlink-URL!\",\"other\":\"<anden>\",\"popupDependent\":\"Koblet/dependent (Netscape)\",\"popupFeatures\":\"Egenskaber for popup\",\"popupFullScreen\":\"Fuld skærm (IE)\",\"popupLeft\":\"Position fra venstre\",\"popupLocationBar\":\"Adresselinje\",\"popupMenuBar\":\"Menulinje\",\"popupResizable\":\"Justérbar\",\"popupScrollBars\":\"Scrollbar\",\"popupStatusBar\":\"Statuslinje\",\"popupToolbar\":\"Værktøjslinje\",\"popupTop\":\"Position fra toppen\",\"rel\":\"Relation\",\"selectAnchor\":\"Vælg et anker\",\"styles\":\"Typografi\",\"tabIndex\":\"Tabulatorindeks\",\"target\":\"Mål\",\"targetFrame\":\"<ramme>\",\"targetFrameName\":\"Destinationsvinduets navn\",\"targetPopup\":\"<popup vindue>\",\"targetPopupName\":\"Popupvinduets navn\",\"title\":\"Egenskaber for hyperlink\",\"toAnchor\":\"Bogmærke på denne side\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Indsæt/redigér hyperlink\",\"type\":\"Type\",\"unlink\":\"Fjern hyperlink\",\"upload\":\"Upload\"},\"list\":{\"bulletedlist\":\"Punktopstilling\",\"numberedlist\":\"Talopstilling\"},\"liststyle\":{\"armenian\":\"Armensk nummering\",\"bulletedTitle\":\"Værdier for cirkelpunktopstilling\",\"circle\":\"Cirkel\",\"decimal\":\"Decimal (1, 2, 3, osv.)\",\"decimalLeadingZero\":\"Decimaler med 0 først (01, 02, 03, etc.)\",\"disc\":\"Værdier for diskpunktopstilling\",\"georgian\":\"Georgiansk nummering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Små alfabet (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Små græsk (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Små romerske (i, ii, iii, iv, v, etc.)\",\"none\":\"Ingen\",\"notset\":\"<ikke defineret>\",\"numberedTitle\":\"Egenskaber for nummereret liste\",\"square\":\"Firkant\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Store alfabet (A, B, C, D, E, etc.)\",\"upperRoman\":\"Store romerske (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Den nummererede liste skal starte med et rundt nummer\"},\"magicline\":{\"title\":\"Indsæt afsnit\"},\"maximize\":{\"maximize\":\"Maksimér\",\"minimize\":\"Minimér\"},\"newpage\":{\"toolbar\":\"Ny side\"},\"pagebreak\":{\"alt\":\"Sideskift\",\"toolbar\":\"Indsæt sideskift\"},\"pastetext\":{\"button\":\"Indsæt som ikke-formateret tekst\",\"title\":\"Indsæt som ikke-formateret tekst\"},\"pastefromword\":{\"confirmCleanup\":\"Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?\",\"error\":\"Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl\",\"title\":\"Indsæt fra Word\",\"toolbar\":\"Indsæt fra Word\"},\"preview\":{\"preview\":\"Vis eksempel\"},\"print\":{\"toolbar\":\"Udskriv\"},\"removeformat\":{\"toolbar\":\"Fjern formatering\"},\"save\":{\"toolbar\":\"Gem\"},\"selectall\":{\"toolbar\":\"Vælg alt\"},\"showblocks\":{\"toolbar\":\"Vis afsnitsmærker\"},\"sourcearea\":{\"toolbar\":\"Kilde\"},\"specialchar\":{\"options\":\"Muligheder for specialkarakterer\",\"title\":\"Vælg symbol\",\"toolbar\":\"Indsæt symbol\"},\"scayt\":{\"btn_about\":\"Om SCAYT\",\"btn_dictionaries\":\"Ordbøger\",\"btn_disable\":\"Deaktivér SCAYT\",\"btn_enable\":\"Aktivér SCAYT\",\"btn_langs\":\"Sprog\",\"btn_options\":\"Indstillinger\",\"text_title\":\"Stavekontrol mens du skriver\"},\"stylescombo\":{\"label\":\"Typografi\",\"panelTitle\":\"Formattering på stylesheet\",\"panelTitle1\":\"Block typografi\",\"panelTitle2\":\"Inline typografi\",\"panelTitle3\":\"Object typografi\"},\"table\":{\"border\":\"Rammebredde\",\"caption\":\"Titel\",\"cell\":{\"menu\":\"Celle\",\"insertBefore\":\"Indsæt celle før\",\"insertAfter\":\"Indsæt celle efter\",\"deleteCell\":\"Slet celle\",\"merge\":\"Flet celler\",\"mergeRight\":\"Flet til højre\",\"mergeDown\":\"Flet nedad\",\"splitHorizontal\":\"Del celle vandret\",\"splitVertical\":\"Del celle lodret\",\"title\":\"Celleegenskaber\",\"cellType\":\"Celletype\",\"rowSpan\":\"Række span (rows span)\",\"colSpan\":\"Kolonne span (columns span)\",\"wordWrap\":\"Tekstombrydning\",\"hAlign\":\"Vandret justering\",\"vAlign\":\"Lodret justering\",\"alignBaseline\":\"Grundlinje\",\"bgColor\":\"Baggrundsfarve\",\"borderColor\":\"Rammefarve\",\"data\":\"Data\",\"header\":\"Hoved\",\"yes\":\"Ja\",\"no\":\"Nej\",\"invalidWidth\":\"Cellebredde skal være et tal.\",\"invalidHeight\":\"Cellehøjde skal være et tal.\",\"invalidRowSpan\":\"Række span skal være et heltal.\",\"invalidColSpan\":\"Kolonne span skal være et heltal.\",\"chooseColor\":\"Vælg\"},\"cellPad\":\"Cellemargen\",\"cellSpace\":\"Celleafstand\",\"column\":{\"menu\":\"Kolonne\",\"insertBefore\":\"Indsæt kolonne før\",\"insertAfter\":\"Indsæt kolonne efter\",\"deleteColumn\":\"Slet kolonne\"},\"columns\":\"Kolonner\",\"deleteTable\":\"Slet tabel\",\"headers\":\"Hoved\",\"headersBoth\":\"Begge\",\"headersColumn\":\"Første kolonne\",\"headersNone\":\"Ingen\",\"headersRow\":\"Første række\",\"invalidBorder\":\"Rammetykkelse skal være et tal.\",\"invalidCellPadding\":\"Cellemargen skal være et tal.\",\"invalidCellSpacing\":\"Celleafstand skal være et tal.\",\"invalidCols\":\"Antallet af kolonner skal være større end 0.\",\"invalidHeight\":\"Tabelhøjde skal være et tal.\",\"invalidRows\":\"Antallet af rækker skal være større end 0.\",\"invalidWidth\":\"Tabelbredde skal være et tal.\",\"menu\":\"Egenskaber for tabel\",\"row\":{\"menu\":\"Række\",\"insertBefore\":\"Indsæt række før\",\"insertAfter\":\"Indsæt række efter\",\"deleteRow\":\"Slet række\"},\"rows\":\"Rækker\",\"summary\":\"Resumé\",\"title\":\"Egenskaber for tabel\",\"toolbar\":\"Tabel\",\"widthPc\":\"procent\",\"widthPx\":\"pixels\",\"widthUnit\":\"Bredde på enhed\"},\"undo\":{\"redo\":\"Annullér fortryd\",\"undo\":\"Fortryd\"},\"wsc\":{\"btnIgnore\":\"Ignorér\",\"btnIgnoreAll\":\"Ignorér alle\",\"btnReplace\":\"Erstat\",\"btnReplaceAll\":\"Erstat alle\",\"btnUndo\":\"Tilbage\",\"changeTo\":\"Forslag\",\"errorLoading\":\"Fejl ved indlæsning af host: %s.\",\"ieSpellDownload\":\"Stavekontrol ikke installeret. Vil du installere den nu?\",\"manyChanges\":\"Stavekontrol færdig: %1 ord ændret\",\"noChanges\":\"Stavekontrol færdig: Ingen ord ændret\",\"noMispell\":\"Stavekontrol færdig: Ingen fejl fundet\",\"noSuggestions\":\"(ingen forslag)\",\"notAvailable\":\"Stavekontrol er desværre ikke tilgængelig.\",\"notInDic\":\"Ikke i ordbogen\",\"oneChange\":\"Stavekontrol færdig: Et ord ændret\",\"progress\":\"Stavekontrollen arbejder...\",\"title\":\"Stavekontrol\",\"toolbar\":\"Stavekontrol\"}};"
  },
  {
    "path": "assets/ckeditor/lang/de-ch.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['de-ch']={\"editor\":\"WYSIWYG-Editor\",\"editorPanel\":\"WYSIWYG-Editor-Leiste\",\"common\":{\"editorHelp\":\"Drücken Sie ALT 0 für Hilfe\",\"browseServer\":\"Server durchsuchen\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Hochladen\",\"uploadSubmit\":\"Zum Server senden\",\"image\":\"Bild\",\"flash\":\"Flash\",\"form\":\"Formular\",\"checkbox\":\"Kontrollbox\",\"radio\":\"Optionsfeld\",\"textField\":\"Textfeld\",\"textarea\":\"Textfeld\",\"hiddenField\":\"Verstecktes Feld\",\"button\":\"Schaltfläche\",\"select\":\"Auswahlfeld\",\"imageButton\":\"Bildschaltfläche\",\"notSet\":\"<nicht festgelegt>\",\"id\":\"Kennung\",\"name\":\"Name\",\"langDir\":\"Schreibrichtung\",\"langDirLtr\":\"Links nach Rechts (LTR)\",\"langDirRtl\":\"Rechts nach Links (RTL)\",\"langCode\":\"Sprachcode\",\"longDescr\":\"Langbeschreibungs-URL\",\"cssClass\":\"Formatvorlagenklassen\",\"advisoryTitle\":\"Titel Beschreibung\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Abbrechen\",\"close\":\"Schliessen\",\"preview\":\"Vorschau\",\"resize\":\"Grösse ändern\",\"generalTab\":\"Allgemein\",\"advancedTab\":\"Erweitert\",\"validateNumberFailed\":\"Dieser Wert ist keine Nummer.\",\"confirmNewPage\":\"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?\",\"confirmCancel\":\"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schliessen?\",\"options\":\"Optionen\",\"target\":\"Zielseite\",\"targetNew\":\"Neues Fenster (_blank)\",\"targetTop\":\"Oberstes Fenster (_top)\",\"targetSelf\":\"Gleiches Fenster (_self)\",\"targetParent\":\"Oberes Fenster (_parent)\",\"langDirLTR\":\"Links nach Rechts (LNR)\",\"langDirRTL\":\"Rechts nach Links (RNL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Klasse\",\"width\":\"Breite\",\"height\":\"Höhe\",\"align\":\"Ausrichtung\",\"alignLeft\":\"Links\",\"alignRight\":\"Rechts\",\"alignCenter\":\"Zentriert\",\"alignJustify\":\"Blocksatz\",\"alignTop\":\"Oben\",\"alignMiddle\":\"Mitte\",\"alignBottom\":\"Unten\",\"alignNone\":\"Keine\",\"invalidValue\":\"Ungültiger Wert.\",\"invalidHeight\":\"Höhe muss eine Zahl sein.\",\"invalidWidth\":\"Breite muss eine Zahl sein.\",\"invalidCssLength\":\"Wert spezifiziert für \\\"%1\\\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).\",\"invalidHtmlLength\":\"Wert spezifiziert für \\\"%1\\\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).\",\"invalidInlineStyle\":\"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \\\"Name : Wert\\\" getrennt mit Semikolons.\",\"cssLengthTooltip\":\"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nicht verfügbar</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alle Rechte vorbehalten.\",\"dlgTitle\":\"Über CKEditor\",\"help\":\"Prüfen Sie $1 für Hilfe.\",\"moreInfo\":\"Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:\",\"title\":\"Über CKEditor\",\"userGuide\":\"CKEditor Benutzerhandbuch\"},\"basicstyles\":{\"bold\":\"Fett\",\"italic\":\"Kursiv\",\"strike\":\"Durchgestrichen\",\"subscript\":\"Tiefgestellt\",\"superscript\":\"Hochgestellt\",\"underline\":\"Unterstrichen\"},\"bidi\":{\"ltr\":\"Leserichtung von Links nach Rechts\",\"rtl\":\"Leserichtung von Rechts nach Links\"},\"blockquote\":{\"toolbar\":\"Zitatblock\"},\"clipboard\":{\"copy\":\"Kopieren\",\"copyError\":\"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).\",\"cut\":\"Ausschneiden\",\"cutError\":\"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).\",\"paste\":\"Einfügen\",\"pasteArea\":\"Einfügebereich\",\"pasteMsg\":\"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.\",\"securityMsg\":\"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.\",\"title\":\"Einfügen\"},\"button\":{\"selectedLabel\":\"%1 (Ausgewählt)\"},\"colorbutton\":{\"auto\":\"Automatisch\",\"bgColorTitle\":\"Hintergrundfarbe\",\"colors\":{\"000\":\"Schwarz\",\"800000\":\"Kastanienbraun\",\"8B4513\":\"Braun\",\"2F4F4F\":\"Dunkles Schiefergrau\",\"008080\":\"Blaugrün\",\"000080\":\"Marineblau\",\"4B0082\":\"Indigo\",\"696969\":\"Dunkelgrau\",\"B22222\":\"Ziegelrot\",\"A52A2A\":\"Braun\",\"DAA520\":\"Goldgelb\",\"006400\":\"Dunkelgrün\",\"40E0D0\":\"Türkis\",\"0000CD\":\"Mittelblau\",\"800080\":\"Lila\",\"808080\":\"Grau\",\"F00\":\"Rot\",\"FF8C00\":\"Dunkelorange\",\"FFD700\":\"Gold\",\"008000\":\"Grün\",\"0FF\":\"Cyan\",\"00F\":\"Blau\",\"EE82EE\":\"Violett\",\"A9A9A9\":\"Dunkelgrau\",\"FFA07A\":\"Helles Lachsrosa\",\"FFA500\":\"Orange\",\"FFFF00\":\"Gelb\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Blasstürkis\",\"ADD8E6\":\"Hellblau\",\"DDA0DD\":\"Pflaumenblau\",\"D3D3D3\":\"Hellgrau\",\"FFF0F5\":\"Lavendel\",\"FAEBD7\":\"Antik Weiss\",\"FFFFE0\":\"Hellgelb\",\"F0FFF0\":\"Honigtau\",\"F0FFFF\":\"Azurblau\",\"F0F8FF\":\"Alice Blau\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Weiss\"},\"more\":\"Weitere Farben...\",\"panelTitle\":\"Farben\",\"textColorTitle\":\"Textfarbe\"},\"colordialog\":{\"clear\":\"Entfernen\",\"highlight\":\"Hervorheben\",\"options\":\"Farboptionen\",\"selected\":\"Ausgewählte Farbe\",\"title\":\"Farbe auswählen\"},\"templates\":{\"button\":\"Vorlagen\",\"emptyListMsg\":\"(Keine Vorlagen definiert)\",\"insertOption\":\"Aktuelle Inhalte ersetzen\",\"options\":\"Vorlagenoptionen\",\"selectPromptMsg\":\"Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen\",\"title\":\"Inhaltsvorlagen\"},\"contextmenu\":{\"options\":\"Kontextmenüoptionen\"},\"div\":{\"IdInputLabel\":\"Kennung\",\"advisoryTitleInputLabel\":\"Tooltip\",\"cssClassInputLabel\":\"Formatvorlagenklasse\",\"edit\":\"Div bearbeiten\",\"inlineStyleInputLabel\":\"Inline Stil\",\"langDirLTRLabel\":\"Links nach Rechs (LTR)\",\"langDirLabel\":\"Sprachrichtung\",\"langDirRTLLabel\":\"Rechs nach Links (RTL)\",\"languageCodeInputLabel\":\"Sprachcode\",\"remove\":\"Div entfernen\",\"styleSelectLabel\":\"Stil\",\"title\":\"Div Container erzeugen\",\"toolbar\":\"Div Container erzeugen\"},\"toolbar\":{\"toolbarCollapse\":\"Werkzeugleiste einklappen\",\"toolbarExpand\":\"Werkzeugleiste ausklappen\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Zwischenablage/Rückgängig\",\"editing\":\"Editieren\",\"forms\":\"Formulare\",\"basicstyles\":\"Grundstile\",\"paragraph\":\"Absatz\",\"links\":\"Links\",\"insert\":\"Einfügen\",\"styles\":\"Stile\",\"colors\":\"Farben\",\"tools\":\"Werkzeuge\"},\"toolbars\":\"Editor Werkzeugleisten\"},\"elementspath\":{\"eleLabel\":\"Elementepfad\",\"eleTitle\":\"%1 Element\"},\"find\":{\"find\":\"Suchen\",\"findOptions\":\"Suchoptionen\",\"findWhat\":\"Suche nach:\",\"matchCase\":\"Gross-/Kleinschreibung beachten\",\"matchCyclic\":\"Zyklische Suche\",\"matchWord\":\"Nur ganze Worte suchen\",\"notFoundMsg\":\"Der angegebene Text wurde nicht gefunden.\",\"replace\":\"Ersetzen\",\"replaceAll\":\"Alle ersetzen\",\"replaceSuccessMsg\":\"%1 Vorkommen ersetzt.\",\"replaceWith\":\"Ersetze mit:\",\"title\":\"Suchen und Ersetzen\"},\"fakeobjects\":{\"anchor\":\"Anker\",\"flash\":\"Flash-Animation\",\"hiddenfield\":\"Verstecktes Feld\",\"iframe\":\"IFrame\",\"unknown\":\"Unbekanntes Objekt\"},\"flash\":{\"access\":\"Skriptzugriff\",\"accessAlways\":\"Immer\",\"accessNever\":\"Nie\",\"accessSameDomain\":\"Gleiche Domain\",\"alignAbsBottom\":\"Abs Unten\",\"alignAbsMiddle\":\"Abs Mitte\",\"alignBaseline\":\"Basislinie\",\"alignTextTop\":\"Text oben\",\"bgcolor\":\"Hintergrundfarbe\",\"chkFull\":\"Vollbildmodus erlauben\",\"chkLoop\":\"Endlosschleife\",\"chkMenu\":\"Flash-Menü aktivieren\",\"chkPlay\":\"Automatisch Abspielen\",\"flashvars\":\"Variablen für Flash\",\"hSpace\":\"Horizontal-Abstand\",\"properties\":\"Flash-Eigenschaften\",\"propertiesTab\":\"Eigenschaften\",\"quality\":\"Qualität\",\"qualityAutoHigh\":\"Auto Hoch\",\"qualityAutoLow\":\"Auto Niedrig\",\"qualityBest\":\"Beste\",\"qualityHigh\":\"Hoch\",\"qualityLow\":\"Niedrig\",\"qualityMedium\":\"Mittel\",\"scale\":\"Skalierung\",\"scaleAll\":\"Alles anzeigen\",\"scaleFit\":\"Passgenau\",\"scaleNoBorder\":\"Ohne Rand\",\"title\":\"Flash-Eigenschaften\",\"vSpace\":\"Vertikal-Abstand\",\"validateHSpace\":\"HSpace muss eine Zahl sein.\",\"validateSrc\":\"URL darf nicht leer sein.\",\"validateVSpace\":\"VSpace muss eine Zahl sein.\",\"windowMode\":\"Fenstermodus\",\"windowModeOpaque\":\"Deckend\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Fenster\"},\"font\":{\"fontSize\":{\"label\":\"Grösse\",\"voiceLabel\":\"Schrifgrösse\",\"panelTitle\":\"Schriftgrösse\"},\"label\":\"Schriftart\",\"panelTitle\":\"Schriftartname\",\"voiceLabel\":\"Schriftart\"},\"forms\":{\"button\":{\"title\":\"Schaltflächeneigenschaften\",\"text\":\"Text (Wert)\",\"type\":\"Typ\",\"typeBtn\":\"Button\",\"typeSbm\":\"Absenden\",\"typeRst\":\"Zurücksetzen\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Kontrollboxeigenschaften\",\"radioTitle\":\"Optionsfeldeigenschaften\",\"value\":\"Wert\",\"selected\":\"Ausgewählt\",\"required\":\"Erforderlich\"},\"form\":{\"title\":\"Formulareigenschaften\",\"menu\":\"Formulareigenschaften\",\"action\":\"Aktion\",\"method\":\"Methode\",\"encoding\":\"Kodierung\"},\"hidden\":{\"title\":\"Versteckte Feldeigenschaften\",\"name\":\"Name\",\"value\":\"Wert\"},\"select\":{\"title\":\"Auswahlfeldeigenschaften\",\"selectInfo\":\"Info auswählen\",\"opAvail\":\"Verfügbare Optionen\",\"value\":\"Wert\",\"size\":\"Grösse\",\"lines\":\"Linien\",\"chkMulti\":\"Mehrfachauswahl erlauben\",\"required\":\"Erforderlich\",\"opText\":\"Text\",\"opValue\":\"Wert\",\"btnAdd\":\"Hinzufügen\",\"btnModify\":\"Ändern\",\"btnUp\":\"Hoch\",\"btnDown\":\"Runter\",\"btnSetValue\":\"Als ausgewählten Wert festlegen\",\"btnDelete\":\"Entfernen\"},\"textarea\":{\"title\":\"Textfeldeigenschaften\",\"cols\":\"Spalten\",\"rows\":\"Reihen\"},\"textfield\":{\"title\":\"Textfeldeigenschaften\",\"name\":\"Name\",\"value\":\"Wert\",\"charWidth\":\"Zeichenbreite\",\"maxChars\":\"Max. Zeichen\",\"required\":\"Erforderlich\",\"type\":\"Typ\",\"typeText\":\"Text\",\"typePass\":\"Passwort\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Suche\",\"typeTel\":\"Telefonnummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Absatzformat\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Überschrift 1\",\"tag_h2\":\"Überschrift 2\",\"tag_h3\":\"Überschrift 3\",\"tag_h4\":\"Überschrift 4\",\"tag_h5\":\"Überschrift 5\",\"tag_h6\":\"Überschrift 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatiert\"},\"horizontalrule\":{\"toolbar\":\"Horizontale Linie einfügen\"},\"iframe\":{\"border\":\"Rahmen anzeigen\",\"noUrl\":\"Bitte geben Sie die IFrame-URL an\",\"scrolling\":\"Rollbalken anzeigen\",\"title\":\"IFrame-Eigenschaften\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativer Text\",\"border\":\"Rahmen\",\"btnUpload\":\"Zum Server senden\",\"button2Img\":\"Möchten Sie die ausgewählte Bildschaltfläche in ein einfaches Bild umwandeln?\",\"hSpace\":\"Horizontal-Abstand\",\"img2Button\":\"Möchten Sie das ausgewählte Bild in eine Bildschaltfläche umwandeln?\",\"infoTab\":\"Bildinfo\",\"linkTab\":\"Link\",\"lockRatio\":\"Grössenverhältnis beibehalten\",\"menu\":\"Bildeigenschaften\",\"resetSize\":\"Grösse zurücksetzen\",\"title\":\"Bildeigenschaften\",\"titleButton\":\"Bildschaltflächeneigenschaften\",\"upload\":\"Hochladen\",\"urlMissing\":\"Bildquellen-URL fehlt.\",\"vSpace\":\"Vertikal-Abstand\",\"validateBorder\":\"Rahmen muss eine ganze Zahl sein.\",\"validateHSpace\":\"Horizontal-Abstand muss eine ganze Zahl sein.\",\"validateVSpace\":\"Vertikal-Abstand muss eine ganze Zahl sein.\"},\"indent\":{\"indent\":\"Einzug erhöhen\",\"outdent\":\"Einzug verringern\"},\"smiley\":{\"options\":\"Smiley-Optionen\",\"title\":\"Smiley auswählen\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Blocksatz\",\"center\":\"Zentriert\",\"left\":\"Linksbündig\",\"right\":\"Rechtsbündig\"},\"language\":{\"button\":\"Sprache festlegen\",\"remove\":\"Sprache entfernen\"},\"link\":{\"acccessKey\":\"Zugriffstaste\",\"advanced\":\"Erweitert\",\"advisoryContentType\":\"Inhaltstyp\",\"advisoryTitle\":\"Titel Beschreibung\",\"anchor\":{\"toolbar\":\"Anker\",\"menu\":\"Anker bearbeiten\",\"title\":\"Ankereigenschaften\",\"name\":\"Ankername\",\"errorName\":\"Bitte geben Sie den Namen des Ankers ein\",\"remove\":\"Anker entfernen\"},\"anchorId\":\"Nach Elementkennung\",\"anchorName\":\"Nach Ankername\",\"charset\":\"Verknüpfter Ressourcenzeichensatz\",\"cssClasses\":\"Formatvorlagenklasse\",\"emailAddress\":\"E-Mail-Adresse\",\"emailBody\":\"Nachrichtentext\",\"emailSubject\":\"Betreffzeile\",\"id\":\"Kennung\",\"info\":\"Linkinfo\",\"langCode\":\"Sprachcode\",\"langDir\":\"Schreibrichtung\",\"langDirLTR\":\"Links nach Rechts (LTR)\",\"langDirRTL\":\"Rechts nach Links (RTL)\",\"menu\":\"Link bearbeiten\",\"name\":\"Name\",\"noAnchors\":\"(Keine Anker im Dokument vorhanden)\",\"noEmail\":\"Bitte geben Sie E-Mail-Adresse an\",\"noUrl\":\"Bitte geben Sie die Link-URL an\",\"other\":\"<andere>\",\"popupDependent\":\"Abhängig (Netscape)\",\"popupFeatures\":\"Pop-up Fenstereigenschaften\",\"popupFullScreen\":\"Vollbild (IE)\",\"popupLeft\":\"Linke Position\",\"popupLocationBar\":\"Adressleiste\",\"popupMenuBar\":\"Menüleiste\",\"popupResizable\":\"Grösse änderbar\",\"popupScrollBars\":\"Rollbalken\",\"popupStatusBar\":\"Statusleiste\",\"popupToolbar\":\"Werkzeugleiste\",\"popupTop\":\"Obere Position\",\"rel\":\"Beziehung\",\"selectAnchor\":\"Anker auswählen\",\"styles\":\"Style\",\"tabIndex\":\"Tab-Index\",\"target\":\"Zielseite\",\"targetFrame\":\"<Frame>\",\"targetFrameName\":\"Ziel-Fenster-Name\",\"targetPopup\":\"<Pop-up Fenster>\",\"targetPopupName\":\"Pop-up Fenster-Name\",\"title\":\"Link\",\"toAnchor\":\"Anker in dieser Seite\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link einfügen/editieren\",\"type\":\"Link-Typ\",\"unlink\":\"Link entfernen\",\"upload\":\"Hochladen\"},\"list\":{\"bulletedlist\":\"Liste\",\"numberedlist\":\"Nummerierte Liste einfügen/entfernen\"},\"liststyle\":{\"armenian\":\"Armenische Nummerierung\",\"bulletedTitle\":\"Aufzählungslisteneigenschaften\",\"circle\":\"Ring\",\"decimal\":\"Dezimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Dezimal mit führender Null (01, 02, 03, usw.)\",\"disc\":\"Kreis\",\"georgian\":\"Georgische Nummerierung (an, ban, gan, usw.)\",\"lowerAlpha\":\"Klein Alpha (a, b, c, d, e, usw.)\",\"lowerGreek\":\"Klein griechisch (alpha, beta, gamma, usw.)\",\"lowerRoman\":\"Klein römisch (i, ii, iii, iv, v, usw.)\",\"none\":\"Keine\",\"notset\":\"<nicht festgelegt>\",\"numberedTitle\":\"Nummerierte Listeneigenschaften\",\"square\":\"Quadrat\",\"start\":\"Start\",\"type\":\"Typ\",\"upperAlpha\":\"Gross alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Gross römisch (I, II, III, IV, V, usw.)\",\"validateStartNumber\":\"Listenstartnummer muss eine ganze Zahl sein.\"},\"magicline\":{\"title\":\"Absatz hier einfügen\"},\"maximize\":{\"maximize\":\"Maximieren\",\"minimize\":\"Minimieren\"},\"newpage\":{\"toolbar\":\"Neue Seite\"},\"pagebreak\":{\"alt\":\"Seitenumbruch\",\"toolbar\":\"Seitenumbruch zum Drucken einfügen\"},\"pastetext\":{\"button\":\"Als Klartext einfügen\",\"title\":\"Als Klartext einfügen\"},\"pastefromword\":{\"confirmCleanup\":\"Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?\",\"error\":\"Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen\",\"title\":\"Aus Word einfügen\",\"toolbar\":\"Aus Word einfügen\"},\"preview\":{\"preview\":\"Vorschau\"},\"print\":{\"toolbar\":\"Drucken\"},\"removeformat\":{\"toolbar\":\"Formatierung entfernen\"},\"save\":{\"toolbar\":\"Speichern\"},\"selectall\":{\"toolbar\":\"Alles auswählen\"},\"showblocks\":{\"toolbar\":\"Blöcke anzeigen\"},\"sourcearea\":{\"toolbar\":\"Quellcode\"},\"specialchar\":{\"options\":\"Sonderzeichenoptionen\",\"title\":\"Sonderzeichen auswählen\",\"toolbar\":\"Sonderzeichen einfügen\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Formatierungsstile\",\"panelTitle1\":\"Blockstile\",\"panelTitle2\":\"Inline Stilart\",\"panelTitle3\":\"Objektstile\"},\"table\":{\"border\":\"Rahmengrösse\",\"caption\":\"Überschrift\",\"cell\":{\"menu\":\"Zelle\",\"insertBefore\":\"Zelle davor einfügen\",\"insertAfter\":\"Zelle danach einfügen\",\"deleteCell\":\"Zelle löschen\",\"merge\":\"Zellen verbinden\",\"mergeRight\":\"Nach rechts verbinden\",\"mergeDown\":\"Nach unten verbinden\",\"splitHorizontal\":\"Zelle horizontal teilen\",\"splitVertical\":\"Zelle vertikal teilen\",\"title\":\"Zelleneigenschaften\",\"cellType\":\"Zellart\",\"rowSpan\":\"Anzahl Zeilen verbinden\",\"colSpan\":\"Anzahl Spalten verbinden\",\"wordWrap\":\"Zeilenumbruch\",\"hAlign\":\"Horizontale Ausrichtung\",\"vAlign\":\"Vertikale Ausrichtung\",\"alignBaseline\":\"Grundlinie\",\"bgColor\":\"Hintergrundfarbe\",\"borderColor\":\"Rahmenfarbe\",\"data\":\"Daten\",\"header\":\"Überschrift\",\"yes\":\"Ja\",\"no\":\"Nein\",\"invalidWidth\":\"Zellenbreite muss eine Zahl sein.\",\"invalidHeight\":\"Zellenhöhe muss eine Zahl sein.\",\"invalidRowSpan\":\"\\\"Anzahl Zeilen verbinden\\\" muss eine Ganzzahl sein.\",\"invalidColSpan\":\"\\\"Anzahl Spalten verbinden\\\" muss eine Ganzzahl sein.\",\"chooseColor\":\"Wählen\"},\"cellPad\":\"Zellenabstand innen\",\"cellSpace\":\"Zellenabstand aussen\",\"column\":{\"menu\":\"Spalte\",\"insertBefore\":\"Spalte links davor einfügen\",\"insertAfter\":\"Spalte rechts danach einfügen\",\"deleteColumn\":\"Spalte löschen\"},\"columns\":\"Spalte\",\"deleteTable\":\"Tabelle löschen\",\"headers\":\"Kopfzeile\",\"headersBoth\":\"Beide\",\"headersColumn\":\"Erste Spalte\",\"headersNone\":\"Keine\",\"headersRow\":\"Erste Zeile\",\"invalidBorder\":\"Die Rahmenbreite muss eine Zahl sein.\",\"invalidCellPadding\":\"Der Zellenabstand innen muss eine positive Zahl sein.\",\"invalidCellSpacing\":\"Der Zellenabstand aussen muss eine positive Zahl sein.\",\"invalidCols\":\"Die Anzahl der Spalten muß grösser als 0 sein..\",\"invalidHeight\":\"Die Tabellenbreite muss eine Zahl sein.\",\"invalidRows\":\"Die Anzahl der Zeilen muß grösser als 0 sein.\",\"invalidWidth\":\"Die Tabellenbreite muss eine Zahl sein.\",\"menu\":\"Tabellen-Eigenschaften\",\"row\":{\"menu\":\"Zeile\",\"insertBefore\":\"Zeile oberhalb einfügen\",\"insertAfter\":\"Zeile unterhalb einfügen\",\"deleteRow\":\"Zeile entfernen\"},\"rows\":\"Zeile\",\"summary\":\"Inhaltsübersicht\",\"title\":\"Tabellen-Eigenschaften\",\"toolbar\":\"Tabelle\",\"widthPc\":\"%\",\"widthPx\":\"Pixel\",\"widthUnit\":\"Breite Einheit\"},\"undo\":{\"redo\":\"Wiederherstellen\",\"undo\":\"Rückgängig\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/de.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['de']={\"editor\":\"WYSIWYG-Editor\",\"editorPanel\":\"WYSIWYG-Editor-Leiste\",\"common\":{\"editorHelp\":\"Drücken Sie ALT 0 für Hilfe\",\"browseServer\":\"Server durchsuchen\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Hochladen\",\"uploadSubmit\":\"Zum Server senden\",\"image\":\"Bild\",\"flash\":\"Flash\",\"form\":\"Formular\",\"checkbox\":\"Kontrollbox\",\"radio\":\"Optionsfeld\",\"textField\":\"Textfeld\",\"textarea\":\"Textfeld\",\"hiddenField\":\"Verstecktes Feld\",\"button\":\"Schaltfläche\",\"select\":\"Auswahlfeld\",\"imageButton\":\"Bildschaltfläche\",\"notSet\":\"<nicht festgelegt>\",\"id\":\"Kennung\",\"name\":\"Name\",\"langDir\":\"Schreibrichtung\",\"langDirLtr\":\"Links nach Rechts (LTR)\",\"langDirRtl\":\"Rechts nach Links (RTL)\",\"langCode\":\"Sprachcode\",\"longDescr\":\"Langbeschreibungs-URL\",\"cssClass\":\"Formatvorlagenklassen\",\"advisoryTitle\":\"Titel Beschreibung\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Abbrechen\",\"close\":\"Schließen\",\"preview\":\"Vorschau\",\"resize\":\"Größe ändern\",\"generalTab\":\"Allgemein\",\"advancedTab\":\"Erweitert\",\"validateNumberFailed\":\"Dieser Wert ist keine Nummer.\",\"confirmNewPage\":\"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?\",\"confirmCancel\":\"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?\",\"options\":\"Optionen\",\"target\":\"Zielseite\",\"targetNew\":\"Neues Fenster (_blank)\",\"targetTop\":\"Oberstes Fenster (_top)\",\"targetSelf\":\"Gleiches Fenster (_self)\",\"targetParent\":\"Oberes Fenster (_parent)\",\"langDirLTR\":\"Links nach Rechts (LNR)\",\"langDirRTL\":\"Rechts nach Links (RNL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Klasse\",\"width\":\"Breite\",\"height\":\"Höhe\",\"align\":\"Ausrichtung\",\"alignLeft\":\"Links\",\"alignRight\":\"Rechts\",\"alignCenter\":\"Zentriert\",\"alignJustify\":\"Blocksatz\",\"alignTop\":\"Oben\",\"alignMiddle\":\"Mitte\",\"alignBottom\":\"Unten\",\"alignNone\":\"Keine\",\"invalidValue\":\"Ungültiger Wert.\",\"invalidHeight\":\"Höhe muss eine Zahl sein.\",\"invalidWidth\":\"Breite muss eine Zahl sein.\",\"invalidCssLength\":\"Wert spezifiziert für \\\"%1\\\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).\",\"invalidHtmlLength\":\"Wert spezifiziert für \\\"%1\\\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).\",\"invalidInlineStyle\":\"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \\\"Name : Wert\\\" getrennt mit Semikolons.\",\"cssLengthTooltip\":\"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nicht verfügbar</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alle Rechte vorbehalten.\",\"dlgTitle\":\"Über CKEditor\",\"help\":\"Prüfen Sie $1 für Hilfe.\",\"moreInfo\":\"Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:\",\"title\":\"Über CKEditor\",\"userGuide\":\"CKEditor Benutzerhandbuch\"},\"basicstyles\":{\"bold\":\"Fett\",\"italic\":\"Kursiv\",\"strike\":\"Durchgestrichen\",\"subscript\":\"Tiefgestellt\",\"superscript\":\"Hochgestellt\",\"underline\":\"Unterstrichen\"},\"bidi\":{\"ltr\":\"Leserichtung von Links nach Rechts\",\"rtl\":\"Leserichtung von Rechts nach Links\"},\"blockquote\":{\"toolbar\":\"Zitatblock\"},\"clipboard\":{\"copy\":\"Kopieren\",\"copyError\":\"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).\",\"cut\":\"Ausschneiden\",\"cutError\":\"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).\",\"paste\":\"Einfügen\",\"pasteArea\":\"Einfügebereich\",\"pasteMsg\":\"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.\",\"securityMsg\":\"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.\",\"title\":\"Einfügen\"},\"button\":{\"selectedLabel\":\"%1 (Ausgewählt)\"},\"colorbutton\":{\"auto\":\"Automatisch\",\"bgColorTitle\":\"Hintergrundfarbe\",\"colors\":{\"000\":\"Schwarz\",\"800000\":\"Kastanienbraun\",\"8B4513\":\"Braun\",\"2F4F4F\":\"Dunkles Schiefergrau\",\"008080\":\"Blaugrün\",\"000080\":\"Marineblau\",\"4B0082\":\"Indigo\",\"696969\":\"Dunkelgrau\",\"B22222\":\"Ziegelrot\",\"A52A2A\":\"Braun\",\"DAA520\":\"Goldgelb\",\"006400\":\"Dunkelgrün\",\"40E0D0\":\"Türkis\",\"0000CD\":\"Mittelblau\",\"800080\":\"Lila\",\"808080\":\"Grau\",\"F00\":\"Rot\",\"FF8C00\":\"Dunkelorange\",\"FFD700\":\"Gold\",\"008000\":\"Grün\",\"0FF\":\"Cyan\",\"00F\":\"Blau\",\"EE82EE\":\"Violett\",\"A9A9A9\":\"Dunkelgrau\",\"FFA07A\":\"Helles Lachsrosa\",\"FFA500\":\"Orange\",\"FFFF00\":\"Gelb\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Blasstürkis\",\"ADD8E6\":\"Hellblau\",\"DDA0DD\":\"Pflaumenblau\",\"D3D3D3\":\"Hellgrau\",\"FFF0F5\":\"Lavendel\",\"FAEBD7\":\"Antik Weiß\",\"FFFFE0\":\"Hellgelb\",\"F0FFF0\":\"Honigtau\",\"F0FFFF\":\"Azurblau\",\"F0F8FF\":\"Alice Blau\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Weiß\"},\"more\":\"Weitere Farben...\",\"panelTitle\":\"Farben\",\"textColorTitle\":\"Textfarbe\"},\"colordialog\":{\"clear\":\"Entfernen\",\"highlight\":\"Hervorheben\",\"options\":\"Farboptionen\",\"selected\":\"Ausgewählte Farbe\",\"title\":\"Farbe auswählen\"},\"templates\":{\"button\":\"Vorlagen\",\"emptyListMsg\":\"(Keine Vorlagen definiert)\",\"insertOption\":\"Aktuelle Inhalte ersetzen\",\"options\":\"Vorlagenoptionen\",\"selectPromptMsg\":\"Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen\",\"title\":\"Inhaltsvorlagen\"},\"contextmenu\":{\"options\":\"Kontextmenüoptionen\"},\"div\":{\"IdInputLabel\":\"Kennung\",\"advisoryTitleInputLabel\":\"Tooltip\",\"cssClassInputLabel\":\"Formatvorlagenklasse\",\"edit\":\"Div bearbeiten\",\"inlineStyleInputLabel\":\"Inline Stil\",\"langDirLTRLabel\":\"Links nach Rechs (LTR)\",\"langDirLabel\":\"Sprachrichtung\",\"langDirRTLLabel\":\"Rechs nach Links (RTL)\",\"languageCodeInputLabel\":\"Sprachcode\",\"remove\":\"Div entfernen\",\"styleSelectLabel\":\"Stil\",\"title\":\"Div Container erzeugen\",\"toolbar\":\"Div Container erzeugen\"},\"toolbar\":{\"toolbarCollapse\":\"Werkzeugleiste einklappen\",\"toolbarExpand\":\"Werkzeugleiste ausklappen\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Zwischenablage/Rückgängig\",\"editing\":\"Editieren\",\"forms\":\"Formulare\",\"basicstyles\":\"Grundstile\",\"paragraph\":\"Absatz\",\"links\":\"Links\",\"insert\":\"Einfügen\",\"styles\":\"Stile\",\"colors\":\"Farben\",\"tools\":\"Werkzeuge\"},\"toolbars\":\"Editor Werkzeugleisten\"},\"elementspath\":{\"eleLabel\":\"Elementepfad\",\"eleTitle\":\"%1 Element\"},\"find\":{\"find\":\"Suchen\",\"findOptions\":\"Suchoptionen\",\"findWhat\":\"Suche nach:\",\"matchCase\":\"Groß-/Kleinschreibung beachten\",\"matchCyclic\":\"Zyklische Suche\",\"matchWord\":\"Nur ganze Worte suchen\",\"notFoundMsg\":\"Der angegebene Text wurde nicht gefunden.\",\"replace\":\"Ersetzen\",\"replaceAll\":\"Alle ersetzen\",\"replaceSuccessMsg\":\"%1 Vorkommen ersetzt.\",\"replaceWith\":\"Ersetze mit:\",\"title\":\"Suchen und Ersetzen\"},\"fakeobjects\":{\"anchor\":\"Anker\",\"flash\":\"Flash-Animation\",\"hiddenfield\":\"Verstecktes Feld\",\"iframe\":\"IFrame\",\"unknown\":\"Unbekanntes Objekt\"},\"flash\":{\"access\":\"Skriptzugriff\",\"accessAlways\":\"Immer\",\"accessNever\":\"Nie\",\"accessSameDomain\":\"Gleiche Domain\",\"alignAbsBottom\":\"Abs Unten\",\"alignAbsMiddle\":\"Abs Mitte\",\"alignBaseline\":\"Basislinie\",\"alignTextTop\":\"Text oben\",\"bgcolor\":\"Hintergrundfarbe\",\"chkFull\":\"Vollbildmodus erlauben\",\"chkLoop\":\"Endlosschleife\",\"chkMenu\":\"Flash-Menü aktivieren\",\"chkPlay\":\"Automatisch Abspielen\",\"flashvars\":\"Variablen für Flash\",\"hSpace\":\"Horizontal-Abstand\",\"properties\":\"Flash-Eigenschaften\",\"propertiesTab\":\"Eigenschaften\",\"quality\":\"Qualität\",\"qualityAutoHigh\":\"Auto Hoch\",\"qualityAutoLow\":\"Auto Niedrig\",\"qualityBest\":\"Beste\",\"qualityHigh\":\"Hoch\",\"qualityLow\":\"Niedrig\",\"qualityMedium\":\"Mittel\",\"scale\":\"Skalierung\",\"scaleAll\":\"Alles anzeigen\",\"scaleFit\":\"Passgenau\",\"scaleNoBorder\":\"Ohne Rand\",\"title\":\"Flash-Eigenschaften\",\"vSpace\":\"Vertikal-Abstand\",\"validateHSpace\":\"HSpace muss eine Zahl sein.\",\"validateSrc\":\"URL darf nicht leer sein.\",\"validateVSpace\":\"VSpace muss eine Zahl sein.\",\"windowMode\":\"Fenstermodus\",\"windowModeOpaque\":\"Deckend\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Fenster\"},\"font\":{\"fontSize\":{\"label\":\"Größe\",\"voiceLabel\":\"Schrifgröße\",\"panelTitle\":\"Schriftgröße\"},\"label\":\"Schriftart\",\"panelTitle\":\"Schriftartname\",\"voiceLabel\":\"Schriftart\"},\"forms\":{\"button\":{\"title\":\"Schaltflächeneigenschaften\",\"text\":\"Text (Wert)\",\"type\":\"Typ\",\"typeBtn\":\"Button\",\"typeSbm\":\"Absenden\",\"typeRst\":\"Zurücksetzen\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Kontrollboxeigenschaften\",\"radioTitle\":\"Optionsfeldeigenschaften\",\"value\":\"Wert\",\"selected\":\"Ausgewählt\",\"required\":\"Erforderlich\"},\"form\":{\"title\":\"Formulareigenschaften\",\"menu\":\"Formulareigenschaften\",\"action\":\"Aktion\",\"method\":\"Methode\",\"encoding\":\"Kodierung\"},\"hidden\":{\"title\":\"Versteckte Feldeigenschaften\",\"name\":\"Name\",\"value\":\"Wert\"},\"select\":{\"title\":\"Auswahlfeldeigenschaften\",\"selectInfo\":\"Info auswählen\",\"opAvail\":\"Verfügbare Optionen\",\"value\":\"Wert\",\"size\":\"Größe\",\"lines\":\"Linien\",\"chkMulti\":\"Mehrfachauswahl erlauben\",\"required\":\"Erforderlich\",\"opText\":\"Text\",\"opValue\":\"Wert\",\"btnAdd\":\"Hinzufügen\",\"btnModify\":\"Ändern\",\"btnUp\":\"Hoch\",\"btnDown\":\"Runter\",\"btnSetValue\":\"Als ausgewählten Wert festlegen\",\"btnDelete\":\"Entfernen\"},\"textarea\":{\"title\":\"Textfeldeigenschaften\",\"cols\":\"Spalten\",\"rows\":\"Reihen\"},\"textfield\":{\"title\":\"Textfeldeigenschaften\",\"name\":\"Name\",\"value\":\"Wert\",\"charWidth\":\"Zeichenbreite\",\"maxChars\":\"Max. Zeichen\",\"required\":\"Erforderlich\",\"type\":\"Typ\",\"typeText\":\"Text\",\"typePass\":\"Passwort\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Suche\",\"typeTel\":\"Telefonnummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Absatzformat\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Überschrift 1\",\"tag_h2\":\"Überschrift 2\",\"tag_h3\":\"Überschrift 3\",\"tag_h4\":\"Überschrift 4\",\"tag_h5\":\"Überschrift 5\",\"tag_h6\":\"Überschrift 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatiert\"},\"horizontalrule\":{\"toolbar\":\"Horizontale Linie einfügen\"},\"iframe\":{\"border\":\"Rahmen anzeigen\",\"noUrl\":\"Bitte geben Sie die IFrame-URL an\",\"scrolling\":\"Rollbalken anzeigen\",\"title\":\"IFrame-Eigenschaften\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativer Text\",\"border\":\"Rahmen\",\"btnUpload\":\"Zum Server senden\",\"button2Img\":\"Möchten Sie die ausgewählte Bildschaltfläche in ein einfaches Bild umwandeln?\",\"hSpace\":\"Horizontal-Abstand\",\"img2Button\":\"Möchten Sie das ausgewählte Bild in eine Bildschaltfläche umwandeln?\",\"infoTab\":\"Bildinfo\",\"linkTab\":\"Link\",\"lockRatio\":\"Größenverhältnis beibehalten\",\"menu\":\"Bildeigenschaften\",\"resetSize\":\"Größe zurücksetzen\",\"title\":\"Bildeigenschaften\",\"titleButton\":\"Bildschaltflächeneigenschaften\",\"upload\":\"Hochladen\",\"urlMissing\":\"Bildquellen-URL fehlt.\",\"vSpace\":\"Vertikal-Abstand\",\"validateBorder\":\"Rahmen muss eine ganze Zahl sein.\",\"validateHSpace\":\"Horizontal-Abstand muss eine ganze Zahl sein.\",\"validateVSpace\":\"Vertikal-Abstand muss eine ganze Zahl sein.\"},\"indent\":{\"indent\":\"Einzug erhöhen\",\"outdent\":\"Einzug verringern\"},\"smiley\":{\"options\":\"Smiley-Optionen\",\"title\":\"Smiley auswählen\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Blocksatz\",\"center\":\"Zentriert\",\"left\":\"Linksbündig\",\"right\":\"Rechtsbündig\"},\"language\":{\"button\":\"Sprache festlegen\",\"remove\":\"Sprache entfernen\"},\"link\":{\"acccessKey\":\"Zugriffstaste\",\"advanced\":\"Erweitert\",\"advisoryContentType\":\"Inhaltstyp\",\"advisoryTitle\":\"Titel Beschreibung\",\"anchor\":{\"toolbar\":\"Anker\",\"menu\":\"Anker bearbeiten\",\"title\":\"Ankereigenschaften\",\"name\":\"Ankername\",\"errorName\":\"Bitte geben Sie den Namen des Ankers ein\",\"remove\":\"Anker entfernen\"},\"anchorId\":\"Nach Elementkennung\",\"anchorName\":\"Nach Ankername\",\"charset\":\"Verknüpfter Ressourcenzeichensatz\",\"cssClasses\":\"Formatvorlagenklasse\",\"emailAddress\":\"E-Mail-Adresse\",\"emailBody\":\"Nachrichtentext\",\"emailSubject\":\"Betreffzeile\",\"id\":\"Kennung\",\"info\":\"Linkinfo\",\"langCode\":\"Sprachcode\",\"langDir\":\"Schreibrichtung\",\"langDirLTR\":\"Links nach Rechts (LTR)\",\"langDirRTL\":\"Rechts nach Links (RTL)\",\"menu\":\"Link bearbeiten\",\"name\":\"Name\",\"noAnchors\":\"(Keine Anker im Dokument vorhanden)\",\"noEmail\":\"Bitte geben Sie E-Mail-Adresse an\",\"noUrl\":\"Bitte geben Sie die Link-URL an\",\"other\":\"<andere>\",\"popupDependent\":\"Abhängig (Netscape)\",\"popupFeatures\":\"Pop-up Fenstereigenschaften\",\"popupFullScreen\":\"Vollbild (IE)\",\"popupLeft\":\"Linke Position\",\"popupLocationBar\":\"Adressleiste\",\"popupMenuBar\":\"Menüleiste\",\"popupResizable\":\"Größe änderbar\",\"popupScrollBars\":\"Rollbalken\",\"popupStatusBar\":\"Statusleiste\",\"popupToolbar\":\"Werkzeugleiste\",\"popupTop\":\"Obere Position\",\"rel\":\"Beziehung\",\"selectAnchor\":\"Anker auswählen\",\"styles\":\"Style\",\"tabIndex\":\"Tab-Index\",\"target\":\"Zielseite\",\"targetFrame\":\"<Frame>\",\"targetFrameName\":\"Ziel-Fenster-Name\",\"targetPopup\":\"<Pop-up Fenster>\",\"targetPopupName\":\"Pop-up Fenster-Name\",\"title\":\"Link\",\"toAnchor\":\"Anker in dieser Seite\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link einfügen/editieren\",\"type\":\"Link-Typ\",\"unlink\":\"Link entfernen\",\"upload\":\"Hochladen\"},\"list\":{\"bulletedlist\":\"Liste\",\"numberedlist\":\"Nummerierte Liste einfügen/entfernen\"},\"liststyle\":{\"armenian\":\"Armenische Nummerierung\",\"bulletedTitle\":\"Aufzählungslisteneigenschaften\",\"circle\":\"Ring\",\"decimal\":\"Dezimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Dezimal mit führender Null (01, 02, 03, usw.)\",\"disc\":\"Kreis\",\"georgian\":\"Georgische Nummerierung (an, ban, gan, usw.)\",\"lowerAlpha\":\"Klein Alpha (a, b, c, d, e, usw.)\",\"lowerGreek\":\"Klein griechisch (alpha, beta, gamma, usw.)\",\"lowerRoman\":\"Klein römisch (i, ii, iii, iv, v, usw.)\",\"none\":\"Keine\",\"notset\":\"<nicht festgelegt>\",\"numberedTitle\":\"Nummerierte Listeneigenschaften\",\"square\":\"Quadrat\",\"start\":\"Start\",\"type\":\"Typ\",\"upperAlpha\":\"Groß alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Groß römisch (I, II, III, IV, V, usw.)\",\"validateStartNumber\":\"Listenstartnummer muss eine ganze Zahl sein.\"},\"magicline\":{\"title\":\"Absatz hier einfügen\"},\"maximize\":{\"maximize\":\"Maximieren\",\"minimize\":\"Minimieren\"},\"newpage\":{\"toolbar\":\"Neue Seite\"},\"pagebreak\":{\"alt\":\"Seitenumbruch\",\"toolbar\":\"Seitenumbruch zum Drucken einfügen\"},\"pastetext\":{\"button\":\"Als Klartext einfügen\",\"title\":\"Als Klartext einfügen\"},\"pastefromword\":{\"confirmCleanup\":\"Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?\",\"error\":\"Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen\",\"title\":\"Aus Word einfügen\",\"toolbar\":\"Aus Word einfügen\"},\"preview\":{\"preview\":\"Vorschau\"},\"print\":{\"toolbar\":\"Drucken\"},\"removeformat\":{\"toolbar\":\"Formatierung entfernen\"},\"save\":{\"toolbar\":\"Speichern\"},\"selectall\":{\"toolbar\":\"Alles auswählen\"},\"showblocks\":{\"toolbar\":\"Blöcke anzeigen\"},\"sourcearea\":{\"toolbar\":\"Quellcode\"},\"specialchar\":{\"options\":\"Sonderzeichenoptionen\",\"title\":\"Sonderzeichen auswählen\",\"toolbar\":\"Sonderzeichen einfügen\"},\"scayt\":{\"btn_about\":\"Über SCAYT\",\"btn_dictionaries\":\"Wörterbücher\",\"btn_disable\":\"SCAYT ausschalten\",\"btn_enable\":\"SCAYT einschalten\",\"btn_langs\":\"Sprachen\",\"btn_options\":\"Optionen\",\"text_title\":\"Rechtschreibprüfung während der Texteingabe (SCAYT)\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Formatierungsstile\",\"panelTitle1\":\"Blockstile\",\"panelTitle2\":\"Inline Stilart\",\"panelTitle3\":\"Objektstile\"},\"table\":{\"border\":\"Rahmengröße\",\"caption\":\"Überschrift\",\"cell\":{\"menu\":\"Zelle\",\"insertBefore\":\"Zelle davor einfügen\",\"insertAfter\":\"Zelle danach einfügen\",\"deleteCell\":\"Zelle löschen\",\"merge\":\"Zellen verbinden\",\"mergeRight\":\"Nach rechts verbinden\",\"mergeDown\":\"Nach unten verbinden\",\"splitHorizontal\":\"Zelle horizontal teilen\",\"splitVertical\":\"Zelle vertikal teilen\",\"title\":\"Zelleneigenschaften\",\"cellType\":\"Zellart\",\"rowSpan\":\"Anzahl Zeilen verbinden\",\"colSpan\":\"Anzahl Spalten verbinden\",\"wordWrap\":\"Zeilenumbruch\",\"hAlign\":\"Horizontale Ausrichtung\",\"vAlign\":\"Vertikale Ausrichtung\",\"alignBaseline\":\"Grundlinie\",\"bgColor\":\"Hintergrundfarbe\",\"borderColor\":\"Rahmenfarbe\",\"data\":\"Daten\",\"header\":\"Überschrift\",\"yes\":\"Ja\",\"no\":\"Nein\",\"invalidWidth\":\"Zellenbreite muss eine Zahl sein.\",\"invalidHeight\":\"Zellenhöhe muss eine Zahl sein.\",\"invalidRowSpan\":\"\\\"Anzahl Zeilen verbinden\\\" muss eine Ganzzahl sein.\",\"invalidColSpan\":\"\\\"Anzahl Spalten verbinden\\\" muss eine Ganzzahl sein.\",\"chooseColor\":\"Wählen\"},\"cellPad\":\"Zellenabstand innen\",\"cellSpace\":\"Zellenabstand außen\",\"column\":{\"menu\":\"Spalte\",\"insertBefore\":\"Spalte links davor einfügen\",\"insertAfter\":\"Spalte rechts danach einfügen\",\"deleteColumn\":\"Spalte löschen\"},\"columns\":\"Spalte\",\"deleteTable\":\"Tabelle löschen\",\"headers\":\"Kopfzeile\",\"headersBoth\":\"Beide\",\"headersColumn\":\"Erste Spalte\",\"headersNone\":\"Keine\",\"headersRow\":\"Erste Zeile\",\"invalidBorder\":\"Die Rahmenbreite muß eine Zahl sein.\",\"invalidCellPadding\":\"Der Zellenabstand innen muß eine positive Zahl sein.\",\"invalidCellSpacing\":\"Der Zellenabstand außen muß eine positive Zahl sein.\",\"invalidCols\":\"Die Anzahl der Spalten muß größer als 0 sein..\",\"invalidHeight\":\"Die Tabellenbreite muß eine Zahl sein.\",\"invalidRows\":\"Die Anzahl der Zeilen muß größer als 0 sein.\",\"invalidWidth\":\"Die Tabellenbreite muss eine Zahl sein.\",\"menu\":\"Tabellen-Eigenschaften\",\"row\":{\"menu\":\"Zeile\",\"insertBefore\":\"Zeile oberhalb einfügen\",\"insertAfter\":\"Zeile unterhalb einfügen\",\"deleteRow\":\"Zeile entfernen\"},\"rows\":\"Zeile\",\"summary\":\"Inhaltsübersicht\",\"title\":\"Tabellen-Eigenschaften\",\"toolbar\":\"Tabelle\",\"widthPc\":\"%\",\"widthPx\":\"Pixel\",\"widthUnit\":\"Breite Einheit\"},\"undo\":{\"redo\":\"Wiederherstellen\",\"undo\":\"Rückgängig\"},\"wsc\":{\"btnIgnore\":\"Ignorieren\",\"btnIgnoreAll\":\"Alle Ignorieren\",\"btnReplace\":\"Ersetzen\",\"btnReplaceAll\":\"Alle Ersetzen\",\"btnUndo\":\"Rückgängig\",\"changeTo\":\"Ändern in\",\"errorLoading\":\"Fehler beim laden des Dienstanbieters: %s.\",\"ieSpellDownload\":\"Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?\",\"manyChanges\":\"Rechtschreibprüfung abgeschlossen - %1 Wörter geändert\",\"noChanges\":\"Rechtschreibprüfung abgeschlossen - keine Worte geändert\",\"noMispell\":\"Rechtschreibprüfung abgeschlossen - keine Fehler gefunden\",\"noSuggestions\":\" - keine Vorschläge - \",\"notAvailable\":\"Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.\",\"notInDic\":\"Nicht im Wörterbuch\",\"oneChange\":\"Rechtschreibprüfung abgeschlossen - ein Wort geändert\",\"progress\":\"Rechtschreibprüfung läuft...\",\"title\":\"Rechtschreibprüfung\",\"toolbar\":\"Rechtschreibprüfung\"}};"
  },
  {
    "path": "assets/ckeditor/lang/el.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['el']={\"editor\":\"Επεξεργαστής Πλούσιου Κειμένου\",\"editorPanel\":\"Πίνακας Επεξεργαστή Πλούσιου Κειμένου\",\"common\":{\"editorHelp\":\"Πατήστε το ALT 0 για βοήθεια\",\"browseServer\":\"Εξερεύνηση Διακομιστή\",\"url\":\"URL\",\"protocol\":\"Πρωτόκολλο\",\"upload\":\"Αποστολή\",\"uploadSubmit\":\"Αποστολή στον Διακομιστή\",\"image\":\"Εικόνα\",\"flash\":\"Flash\",\"form\":\"Φόρμα\",\"checkbox\":\"Κουτί Επιλογής\",\"radio\":\"Κουμπί Επιλογής\",\"textField\":\"Πεδίο Κειμένου\",\"textarea\":\"Περιοχή Κειμένου\",\"hiddenField\":\"Κρυφό Πεδίο\",\"button\":\"Κουμπί\",\"select\":\"Πεδίο Επιλογής\",\"imageButton\":\"Κουμπί Εικόνας\",\"notSet\":\"<δεν έχει ρυθμιστεί>\",\"id\":\"Id\",\"name\":\"Όνομα\",\"langDir\":\"Κατεύθυνση Κειμένου\",\"langDirLtr\":\"Αριστερά προς Δεξιά (LTR)\",\"langDirRtl\":\"Δεξιά προς Αριστερά (RTL)\",\"langCode\":\"Κωδικός Γλώσσας\",\"longDescr\":\"Αναλυτική Περιγραφή URL\",\"cssClass\":\"Κλάσεις Φύλλων Στυλ\",\"advisoryTitle\":\"Ενδεικτικός Τίτλος\",\"cssStyle\":\"Μορφή Κειμένου\",\"ok\":\"OK\",\"cancel\":\"Ακύρωση\",\"close\":\"Κλείσιμο\",\"preview\":\"Προεπισκόπηση\",\"resize\":\"Αλλαγή Μεγέθους\",\"generalTab\":\"Γενικά\",\"advancedTab\":\"Για Προχωρημένους\",\"validateNumberFailed\":\"Αυτή η τιμή δεν είναι αριθμός.\",\"confirmNewPage\":\"Οι όποιες αλλαγές στο περιεχόμενο θα χαθούν. Είσαστε σίγουροι ότι θέλετε να φορτώσετε μια νέα σελίδα;\",\"confirmCancel\":\"Μερικές επιλογές έχουν αλλάξει. Είσαστε σίγουροι ότι θέλετε να κλείσετε το παράθυρο διαλόγου;\",\"options\":\"Επιλογές\",\"target\":\"Προορισμός\",\"targetNew\":\"Νέο Παράθυρο (_blank)\",\"targetTop\":\"Αρχική Περιοχή (_top)\",\"targetSelf\":\"Ίδιο Παράθυρο (_self)\",\"targetParent\":\"Γονεϊκό Παράθυρο (_parent)\",\"langDirLTR\":\"Αριστερά προς Δεξιά (LTR)\",\"langDirRTL\":\"Δεξιά προς Αριστερά (RTL)\",\"styles\":\"Μορφή\",\"cssClasses\":\"Κλάσεις Φύλλων Στυλ\",\"width\":\"Πλάτος\",\"height\":\"Ύψος\",\"align\":\"Στοίχιση\",\"alignLeft\":\"Αριστερά\",\"alignRight\":\"Δεξιά\",\"alignCenter\":\"Κέντρο\",\"alignJustify\":\"Πλήρης Στοίχιση\",\"alignTop\":\"Πάνω\",\"alignMiddle\":\"Μέση\",\"alignBottom\":\"Κάτω\",\"alignNone\":\"Χωρίς\",\"invalidValue\":\"Μη έγκυρη τιμή.\",\"invalidHeight\":\"Το ύψος πρέπει να είναι ένας αριθμός.\",\"invalidWidth\":\"Το πλάτος πρέπει να είναι ένας αριθμός.\",\"invalidCssLength\":\"Η τιμή που ορίζεται για το πεδίο \\\"%1\\\" πρέπει να είναι ένας θετικός αριθμός με ή χωρίς μια έγκυρη μονάδα μέτρησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).\",\"invalidHtmlLength\":\"Η τιμή που ορίζεται για το πεδίο \\\"%1\\\" πρέπει να είναι ένας θετικός αριθμός με ή χωρίς μια έγκυρη μονάδα μέτρησης HTML (px ή %).\",\"invalidInlineStyle\":\"Η τιμή για το εν σειρά στυλ πρέπει να περιέχει ένα ή περισσότερα ζεύγη με την μορφή \\\"όνομα: τιμή\\\" διαχωρισμένα με Ελληνικό ερωτηματικό.\",\"cssLengthTooltip\":\"Εισάγεται μια τιμή σε pixel ή έναν αριθμό μαζί με μια έγκυρη μονάδα μέτρησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, δεν είναι διαθέσιμο</span>\"},\"about\":{\"copy\":\"Πνευματικά δικαιώματα &copy; $1 Με επιφύλαξη παντός δικαιώματος.\",\"dlgTitle\":\"Περί του CKEditor\",\"help\":\"Ελέγξτε τις $1 για βοήθεια.\",\"moreInfo\":\"Για πληροφορίες σχετικές με την άδεια χρήσης, παρακαλούμε επισκεφθείτε την ιστοσελίδα μας:\",\"title\":\"Περί του CKEditor\",\"userGuide\":\"Οδηγίες Χρήστη CKEditor\"},\"basicstyles\":{\"bold\":\"Έντονη\",\"italic\":\"Πλάγια\",\"strike\":\"Διακριτή Διαγραφή\",\"subscript\":\"Δείκτης\",\"superscript\":\"Εκθέτης\",\"underline\":\"Υπογράμμιση\"},\"bidi\":{\"ltr\":\"Διεύθυνση κειμένου από αριστερά στα δεξιά\",\"rtl\":\"Διεύθυνση κειμένου από δεξιά στα αριστερά\"},\"blockquote\":{\"toolbar\":\"Περιοχή Παράθεσης\"},\"clipboard\":{\"copy\":\"Αντιγραφή\",\"copyError\":\"Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).\",\"cut\":\"Αποκοπή\",\"cutError\":\"Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).\",\"paste\":\"Επικόλληση\",\"pasteArea\":\"Περιοχή Επικόλλησης\",\"pasteMsg\":\"Παρακαλώ επικολλήστε στο ακόλουθο κουτί χρησιμοποιώντας το πληκτρολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.\",\"securityMsg\":\"Λόγων των ρυθμίσεων ασφάλειας του περιηγητή σας, ο επεξεργαστής δεν μπορεί να έχει πρόσβαση στην μνήμη επικόλλησης. Χρειάζεται να επικολλήσετε ξανά σε αυτό το παράθυρο.\",\"title\":\"Επικόλληση\"},\"button\":{\"selectedLabel\":\"%1 (Επιλεγμένο)\"},\"colorbutton\":{\"auto\":\"Αυτόματα\",\"bgColorTitle\":\"Χρώμα Φόντου\",\"colors\":{\"000\":\"Μαύρο\",\"800000\":\"Καστανέρυθρο\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Βαθυκύανο\",\"000080\":\"Μπλε μαρέν\",\"4B0082\":\"Ινδικό\",\"696969\":\"Σκούρο Γκρι\",\"B22222\":\"Ανοικτό Κόκκινο\",\"A52A2A\":\"Καφέ\",\"DAA520\":\"Golden Rod\",\"006400\":\"Σκούρο Πράσινο\",\"40E0D0\":\"Τυρκουάζ\",\"0000CD\":\"Medium Blue\",\"800080\":\"Μοβ\",\"808080\":\"Γκρι\",\"F00\":\"Κόκκινο\",\"FF8C00\":\"Σκούρο Πορτοκαλί\",\"FFD700\":\"Χρυσαφί\",\"008000\":\"Πράσινο\",\"0FF\":\"Κυανό\",\"00F\":\"Μπλε\",\"EE82EE\":\"Μενεξεδί\",\"A9A9A9\":\"Ποντικί\",\"FFA07A\":\"Ανοικτό Σομόν\",\"FFA500\":\"Πορτοκαλί\",\"FFFF00\":\"Κίτρινο\",\"00FF00\":\"Μοσχολέμονο\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Γαλάζιο\",\"DDA0DD\":\"Δαμασκηνί\",\"D3D3D3\":\"Ανοικτό Γκρι\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Ανοικτό Κίτρινο\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Γαλανό\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Ελαφρός Ιώδες\",\"FFF\":\"Λευκό\"},\"more\":\"Περισσότερα Χρώματα…\",\"panelTitle\":\"Χρώματα\",\"textColorTitle\":\"Χρώμα Κειμένου\"},\"colordialog\":{\"clear\":\"Εκκαθάριση\",\"highlight\":\"Σήμανση\",\"options\":\"Επιλογές Χρωμάτων\",\"selected\":\"Επιλεγμένο Χρώμα\",\"title\":\"Επιλογή χρώματος\"},\"templates\":{\"button\":\"Πρότυπα\",\"emptyListMsg\":\"(Δεν έχουν καθοριστεί πρότυπα)\",\"insertOption\":\"Αντικατάσταση υπάρχοντων περιεχομένων\",\"options\":\"Επιλογές Προτύπου\",\"selectPromptMsg\":\"Παρακαλώ επιλέξτε πρότυπο για εισαγωγή στο πρόγραμμα\",\"title\":\"Πρότυπα Περιεχομένου\"},\"contextmenu\":{\"options\":\"Επιλογές Αναδυόμενου Μενού\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Ενδεικτικός Τίτλος\",\"cssClassInputLabel\":\"Κλάσεις Φύλλων Στυλ\",\"edit\":\"Επεξεργασία Div\",\"inlineStyleInputLabel\":\"Στυλ Εν Σειρά\",\"langDirLTRLabel\":\"Αριστερά προς Δεξιά (LTR)\",\"langDirLabel\":\"Κατεύθυνση Κειμένου\",\"langDirRTLLabel\":\"Δεξιά προς Αριστερά (RTL)\",\"languageCodeInputLabel\":\"Κωδικός Γλώσσας\",\"remove\":\"Διαγραφή Div\",\"styleSelectLabel\":\"Μορφή\",\"title\":\"Δημιουργία Div\",\"toolbar\":\"Δημιουργία Div\"},\"toolbar\":{\"toolbarCollapse\":\"Σύμπτυξη Εργαλειοθήκης\",\"toolbarExpand\":\"Ανάπτυξη Εργαλειοθήκης\",\"toolbarGroups\":{\"document\":\"Έγγραφο\",\"clipboard\":\"Πρόχειρο/Αναίρεση\",\"editing\":\"Επεξεργασία\",\"forms\":\"Φόρμες\",\"basicstyles\":\"Βασικά Στυλ\",\"paragraph\":\"Παράγραφος\",\"links\":\"Σύνδεσμοι\",\"insert\":\"Εισαγωγή\",\"styles\":\"Στυλ\",\"colors\":\"Χρώματα\",\"tools\":\"Εργαλεία\"},\"toolbars\":\"Εργαλειοθήκες επεξεργαστή\"},\"elementspath\":{\"eleLabel\":\"Διαδρομή Στοιχείων\",\"eleTitle\":\"Στοιχείο %1\"},\"find\":{\"find\":\"Εύρεση\",\"findOptions\":\"Επιλογές Εύρεσης\",\"findWhat\":\"Εύρεση για:\",\"matchCase\":\"Ταίριασμα πεζών/κεφαλαίων\",\"matchCyclic\":\"Αναδρομική εύρεση\",\"matchWord\":\"Εύρεση μόνο πλήρων λέξεων\",\"notFoundMsg\":\"Το κείμενο δεν βρέθηκε.\",\"replace\":\"Αντικατάσταση\",\"replaceAll\":\"Αντικατάσταση Όλων\",\"replaceSuccessMsg\":\"Ο(ι) όρος(-οι) αντικαταστήθηκε(-αν) %1 φορές.\",\"replaceWith\":\"Αντικατάσταση με:\",\"title\":\"Εύρεση και Αντικατάσταση\"},\"fakeobjects\":{\"anchor\":\"Άγκυρα\",\"flash\":\"Ταινία Flash\",\"hiddenfield\":\"Κρυφό Πεδίο\",\"iframe\":\"IFrame\",\"unknown\":\"Άγνωστο Αντικείμενο\"},\"flash\":{\"access\":\"Πρόσβαση Script\",\"accessAlways\":\"Πάντα\",\"accessNever\":\"Ποτέ\",\"accessSameDomain\":\"Ίδιο όνομα τομέα\",\"alignAbsBottom\":\"Απόλυτα Κάτω\",\"alignAbsMiddle\":\"Απόλυτα στη Μέση\",\"alignBaseline\":\"Γραμμή Βάσης\",\"alignTextTop\":\"Κορυφή Κειμένου\",\"bgcolor\":\"Χρώμα Υποβάθρου\",\"chkFull\":\"Να Επιτρέπεται η Προβολή σε Πλήρη Οθόνη\",\"chkLoop\":\"Επανάληψη\",\"chkMenu\":\"Ενεργοποίηση Flash Menu\",\"chkPlay\":\"Αυτόματη Εκτέλεση\",\"flashvars\":\"Μεταβλητές για Flash\",\"hSpace\":\"Οριζόντιο Διάστημα\",\"properties\":\"Ιδιότητες Flash\",\"propertiesTab\":\"Ιδιότητες\",\"quality\":\"Ποιότητα\",\"qualityAutoHigh\":\"Αυτόματη Υψηλή\",\"qualityAutoLow\":\"Αυτόματη Χαμηλή\",\"qualityBest\":\"Καλύτερη\",\"qualityHigh\":\"Υψηλή\",\"qualityLow\":\"Χαμηλή\",\"qualityMedium\":\"Μεσαία\",\"scale\":\"Μεγέθυνση\",\"scaleAll\":\"Εμφάνιση όλων\",\"scaleFit\":\"Ακριβές Μέγεθος\",\"scaleNoBorder\":\"Χωρίς Περίγραμμα\",\"title\":\"Ιδιότητες Flash\",\"vSpace\":\"Κάθετο Διάστημα\",\"validateHSpace\":\"Το HSpace πρέπει να είναι αριθμός.\",\"validateSrc\":\"Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)\",\"validateVSpace\":\"Το VSpace πρέπει να είναι αριθμός.\",\"windowMode\":\"Τρόπος λειτουργίας παραθύρου\",\"windowModeOpaque\":\"Συμπαγές\",\"windowModeTransparent\":\"Διάφανο\",\"windowModeWindow\":\"Παράθυρο\"},\"font\":{\"fontSize\":{\"label\":\"Μέγεθος\",\"voiceLabel\":\"Μέγεθος Γραμματοσειράς\",\"panelTitle\":\"Μέγεθος Γραμματοσειράς\"},\"label\":\"Γραμματοσειρά\",\"panelTitle\":\"Όνομα Γραμματοσειράς\",\"voiceLabel\":\"Γραμματοσειρά\"},\"forms\":{\"button\":{\"title\":\"Ιδιότητες Κουμπιού\",\"text\":\"Κείμενο (Τιμή)\",\"type\":\"Τύπος\",\"typeBtn\":\"Κουμπί\",\"typeSbm\":\"Υποβολή\",\"typeRst\":\"Επαναφορά\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Ιδιότητες Κουτιού Επιλογής\",\"radioTitle\":\"Ιδιότητες Κουμπιού Επιλογής\",\"value\":\"Τιμή\",\"selected\":\"Επιλεγμένο\",\"required\":\"Required\"},\"form\":{\"title\":\"Ιδιότητες Φόρμας\",\"menu\":\"Ιδιότητες Φόρμας\",\"action\":\"Ενέργεια\",\"method\":\"Μέθοδος\",\"encoding\":\"Κωδικοποίηση\"},\"hidden\":{\"title\":\"Ιδιότητες Κρυφού Πεδίου\",\"name\":\"Όνομα\",\"value\":\"Τιμή\"},\"select\":{\"title\":\"Ιδιότητες Πεδίου Επιλογής\",\"selectInfo\":\"Πληροφορίες Πεδίου Επιλογής\",\"opAvail\":\"Διαθέσιμες Επιλογές\",\"value\":\"Τιμή\",\"size\":\"Μέγεθος\",\"lines\":\"γραμμές\",\"chkMulti\":\"Να επιτρέπονται οι πολλαπλές επιλογές\",\"required\":\"Required\",\"opText\":\"Κείμενο\",\"opValue\":\"Τιμή\",\"btnAdd\":\"Προσθήκη\",\"btnModify\":\"Τροποποίηση\",\"btnUp\":\"Πάνω\",\"btnDown\":\"Κάτω\",\"btnSetValue\":\"Θέση ως προεπιλογή\",\"btnDelete\":\"Διαγραφή\"},\"textarea\":{\"title\":\"Ιδιότητες Περιοχής Κειμένου\",\"cols\":\"Στήλες\",\"rows\":\"Σειρές\"},\"textfield\":{\"title\":\"Ιδιότητες Πεδίου Κειμένου\",\"name\":\"Όνομα\",\"value\":\"Τιμή\",\"charWidth\":\"Πλάτος Χαρακτήρων\",\"maxChars\":\"Μέγιστοι χαρακτήρες\",\"required\":\"Required\",\"type\":\"Τύπος\",\"typeText\":\"Κείμενο\",\"typePass\":\"Κωδικός\",\"typeEmail\":\"Email\",\"typeSearch\":\"Αναζήτηση\",\"typeTel\":\"Αριθμός Τηλεφώνου\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Μορφοποίηση\",\"panelTitle\":\"Μορφοποίηση Παραγράφου\",\"tag_address\":\"Διεύθυνση\",\"tag_div\":\"Κανονική (DIV)\",\"tag_h1\":\"Κεφαλίδα 1\",\"tag_h2\":\"Κεφαλίδα 2\",\"tag_h3\":\"Κεφαλίδα 3\",\"tag_h4\":\"Κεφαλίδα 4\",\"tag_h5\":\"Κεφαλίδα 5\",\"tag_h6\":\"Κεφαλίδα 6\",\"tag_p\":\"Κανονική\",\"tag_pre\":\"Προ-μορφοποιημένη\"},\"horizontalrule\":{\"toolbar\":\"Εισαγωγή Οριζόντιας Γραμμής\"},\"iframe\":{\"border\":\"Προβολή περιγράμματος πλαισίου\",\"noUrl\":\"Παρακαλούμε εισάγεται το URL του iframe\",\"scrolling\":\"Ενεργοποίηση μπαρών κύλισης\",\"title\":\"Ιδιότητες IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Εναλλακτικό Κείμενο\",\"border\":\"Περίγραμμα\",\"btnUpload\":\"Αποστολή στον Διακομιστή\",\"button2Img\":\"Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;\",\"hSpace\":\"HSpace\",\"img2Button\":\"Θέλετε να μεταμορφώσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;\",\"infoTab\":\"Πληροφορίες Εικόνας\",\"linkTab\":\"Σύνδεσμος\",\"lockRatio\":\"Κλείδωμα Αναλογίας\",\"menu\":\"Ιδιότητες Εικόνας\",\"resetSize\":\"Επαναφορά Αρχικού Μεγέθους\",\"title\":\"Ιδιότητες Εικόνας\",\"titleButton\":\"Ιδιότητες Κουμπιού Εικόνας\",\"upload\":\"Αποστολή\",\"urlMissing\":\"Το URL πηγής για την εικόνα λείπει.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Το περίγραμμα πρέπει να είναι ένας ακέραιος αριθμός.\",\"validateHSpace\":\"Το HSpace πρέπει να είναι ένας ακέραιος αριθμός.\",\"validateVSpace\":\"Το VSpace πρέπει να είναι ένας ακέραιος αριθμός.\"},\"indent\":{\"indent\":\"Αύξηση Εσοχής\",\"outdent\":\"Μείωση Εσοχής\"},\"smiley\":{\"options\":\"Επιλογές Φατσούλων\",\"title\":\"Εισάγετε μια Φατσούλα\",\"toolbar\":\"Φατσούλα\"},\"justify\":{\"block\":\"Πλήρης Στοίχιση\",\"center\":\"Στο Κέντρο\",\"left\":\"Στοίχιση Αριστερά\",\"right\":\"Στοίχιση Δεξιά\"},\"language\":{\"button\":\"Θέση γλώσσας\",\"remove\":\"Αφαίρεση γλώσσας\"},\"link\":{\"acccessKey\":\"Συντόμευση\",\"advanced\":\"Για Προχωρημένους\",\"advisoryContentType\":\"Ενδεικτικός Τύπος Περιεχομένου\",\"advisoryTitle\":\"Ενδεικτικός Τίτλος\",\"anchor\":{\"toolbar\":\"Εισαγωγή/επεξεργασία Άγκυρας\",\"menu\":\"Ιδιότητες άγκυρας\",\"title\":\"Ιδιότητες άγκυρας\",\"name\":\"Όνομα άγκυρας\",\"errorName\":\"Παρακαλούμε εισάγετε όνομα άγκυρας\",\"remove\":\"Αφαίρεση Άγκυρας\"},\"anchorId\":\"Βάσει του Element Id\",\"anchorName\":\"Βάσει του Ονόματος Άγκυρας\",\"charset\":\"Κωδικοποίηση Χαρακτήρων Προσαρτημένης Πηγής\",\"cssClasses\":\"Κλάσεις Φύλλων Στυλ\",\"emailAddress\":\"Διεύθυνση E-mail\",\"emailBody\":\"Κείμενο Μηνύματος\",\"emailSubject\":\"Θέμα Μηνύματος\",\"id\":\"Id\",\"info\":\"Πληροφορίες Συνδέσμου\",\"langCode\":\"Κατεύθυνση Κειμένου\",\"langDir\":\"Κατεύθυνση Κειμένου\",\"langDirLTR\":\"Αριστερά προς Δεξιά (LTR)\",\"langDirRTL\":\"Δεξιά προς Αριστερά (RTL)\",\"menu\":\"Επεξεργασία Συνδέσμου\",\"name\":\"Όνομα\",\"noAnchors\":\"(Δεν υπάρχουν άγκυρες στο κείμενο)\",\"noEmail\":\"Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου\",\"noUrl\":\"Εισάγετε την τοποθεσία (URL) του συνδέσμου\",\"other\":\"<άλλο>\",\"popupDependent\":\"Εξαρτημένο (Netscape)\",\"popupFeatures\":\"Επιλογές Αναδυόμενου Παραθύρου\",\"popupFullScreen\":\"Πλήρης Οθόνη (IE)\",\"popupLeft\":\"Θέση Αριστερά\",\"popupLocationBar\":\"Γραμμή Τοποθεσίας\",\"popupMenuBar\":\"Γραμμή Επιλογών\",\"popupResizable\":\"Προσαρμοζόμενο Μέγεθος\",\"popupScrollBars\":\"Μπάρες Κύλισης\",\"popupStatusBar\":\"Γραμμή Κατάστασης\",\"popupToolbar\":\"Εργαλειοθήκη\",\"popupTop\":\"Θέση Πάνω\",\"rel\":\"Σχέση\",\"selectAnchor\":\"Επιλέξτε μια Άγκυρα\",\"styles\":\"Μορφή\",\"tabIndex\":\"Σειρά Μεταπήδησης\",\"target\":\"Παράθυρο Προορισμού\",\"targetFrame\":\"<πλαίσιο>\",\"targetFrameName\":\"Όνομα Πλαισίου Προορισμού\",\"targetPopup\":\"<αναδυόμενο παράθυρο>\",\"targetPopupName\":\"Όνομα Αναδυόμενου Παραθύρου\",\"title\":\"Σύνδεσμος\",\"toAnchor\":\"Άγκυρα σε αυτήν τη σελίδα\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Σύνδεσμος\",\"type\":\"Τύπος Συνδέσμου\",\"unlink\":\"Αφαίρεση Συνδέσμου\",\"upload\":\"Αποστολή\"},\"list\":{\"bulletedlist\":\"Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων\",\"numberedlist\":\"Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας\"},\"liststyle\":{\"armenian\":\"Αρμενική αρίθμηση\",\"bulletedTitle\":\"Ιδιότητες Λίστας Σημείων\",\"circle\":\"Κύκλος\",\"decimal\":\"Δεκαδική (1, 2, 3, κτλ)\",\"decimalLeadingZero\":\"Δεκαδική με αρχικό μηδεν (01, 02, 03, κτλ)\",\"disc\":\"Δίσκος\",\"georgian\":\"Γεωργιανή αρίθμηση (ა, ბ, გ, κτλ)\",\"lowerAlpha\":\"Μικρά Λατινικά (a, b, c, d, e, κτλ.)\",\"lowerGreek\":\"Μικρά Ελληνικά (α, β, γ, κτλ)\",\"lowerRoman\":\"Μικρά Ρωμαϊκά (i, ii, iii, iv, v, κτλ)\",\"none\":\"Καμία\",\"notset\":\"<δεν έχει οριστεί>\",\"numberedTitle\":\"Ιδιότητες Αριθμημένης Λίστας \",\"square\":\"Τετράγωνο\",\"start\":\"Εκκίνηση\",\"type\":\"Τύπος\",\"upperAlpha\":\"Κεφαλαία Λατινικά (A, B, C, D, E, κτλ)\",\"upperRoman\":\"Κεφαλαία Ρωμαϊκά (I, II, III, IV, V, κτλ)\",\"validateStartNumber\":\"Ο αριθμός εκκίνησης της αρίθμησης πρέπει να είναι ακέραιος αριθμός.\"},\"magicline\":{\"title\":\"Εισάγετε παράγραφο εδώ\"},\"maximize\":{\"maximize\":\"Μεγιστοποίηση\",\"minimize\":\"Ελαχιστοποίηση\"},\"newpage\":{\"toolbar\":\"Νέα Σελίδα\"},\"pagebreak\":{\"alt\":\"Αλλαγή Σελίδας\",\"toolbar\":\"Εισαγωγή Τέλους Σελίδας για Εκτύπωση\"},\"pastetext\":{\"button\":\"Επικόλληση ως απλό κείμενο\",\"title\":\"Επικόλληση ως απλό κείμενο\"},\"pastefromword\":{\"confirmCleanup\":\"Το κείμενο που επικολλάται φαίνεται να είναι αντιγραμμένο από το Word. Μήπως θα θέλατε να καθαριστεί προτού επικολληθεί;\",\"error\":\"Δεν ήταν δυνατό να καθαριστούν τα δεδομένα λόγω ενός εσωτερικού σφάλματος\",\"title\":\"Επικόλληση από το Word\",\"toolbar\":\"Επικόλληση από το Word\"},\"preview\":{\"preview\":\"Προεπισκόπιση\"},\"print\":{\"toolbar\":\"Εκτύπωση\"},\"removeformat\":{\"toolbar\":\"Εκκαθάριση Μορφοποίησης\"},\"save\":{\"toolbar\":\"Αποθήκευση\"},\"selectall\":{\"toolbar\":\"Επιλογή όλων\"},\"showblocks\":{\"toolbar\":\"Προβολή Τμημάτων\"},\"sourcearea\":{\"toolbar\":\"Κώδικας\"},\"specialchar\":{\"options\":\"Επιλογές Ειδικών Χαρακτήρων\",\"title\":\"Επιλέξτε Έναν Ειδικό Χαρακτήρα\",\"toolbar\":\"Εισαγωγή Ειδικού Χαρακτήρα\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Λεξικά\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Γλώσσες\",\"btn_options\":\"Επιλογές\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Μορφές\",\"panelTitle\":\"Στυλ Μορφοποίησης\",\"panelTitle1\":\"Στυλ Τμημάτων\",\"panelTitle2\":\"Στυλ Εν Σειρά\",\"panelTitle3\":\"Στυλ Αντικειμένων\"},\"table\":{\"border\":\"Πάχος Περιγράμματος\",\"caption\":\"Λεζάντα\",\"cell\":{\"menu\":\"Κελί\",\"insertBefore\":\"Εισαγωγή Κελιού Πριν\",\"insertAfter\":\"Εισαγωγή Κελιού Μετά\",\"deleteCell\":\"Διαγραφή Κελιών\",\"merge\":\"Ενοποίηση Κελιών\",\"mergeRight\":\"Συγχώνευση Με Δεξιά\",\"mergeDown\":\"Συγχώνευση Με Κάτω\",\"splitHorizontal\":\"Οριζόντια Διαίρεση Κελιού\",\"splitVertical\":\"Κατακόρυφη Διαίρεση Κελιού\",\"title\":\"Ιδιότητες Κελιού\",\"cellType\":\"Τύπος Κελιού\",\"rowSpan\":\"Εύρος Γραμμών\",\"colSpan\":\"Εύρος Στηλών\",\"wordWrap\":\"Αναδίπλωση Λέξεων\",\"hAlign\":\"Οριζόντια Στοίχιση\",\"vAlign\":\"Κάθετη Στοίχιση\",\"alignBaseline\":\"Γραμμή Βάσης\",\"bgColor\":\"Χρώμα Φόντου\",\"borderColor\":\"Χρώμα Περιγράμματος\",\"data\":\"Δεδομένα\",\"header\":\"Κεφαλίδα\",\"yes\":\"Ναι\",\"no\":\"Όχι\",\"invalidWidth\":\"Το πλάτος του κελιού πρέπει να είναι αριθμός.\",\"invalidHeight\":\"Το ύψος του κελιού πρέπει να είναι αριθμός.\",\"invalidRowSpan\":\"Το εύρος των γραμμών πρέπει να είναι ακέραιος αριθμός.\",\"invalidColSpan\":\"Το εύρος των στηλών πρέπει να είναι ακέραιος αριθμός.\",\"chooseColor\":\"Επιλέξτε\"},\"cellPad\":\"Αναπλήρωση κελιών\",\"cellSpace\":\"Απόσταση κελιών\",\"column\":{\"menu\":\"Στήλη\",\"insertBefore\":\"Εισαγωγή Στήλης Πριν\",\"insertAfter\":\"Εισαγωγή Στήλης Μετά\",\"deleteColumn\":\"Διαγραφή Στηλών\"},\"columns\":\"Στήλες\",\"deleteTable\":\"Διαγραφή Πίνακα\",\"headers\":\"Κεφαλίδες\",\"headersBoth\":\"Και τα δύο\",\"headersColumn\":\"Πρώτη στήλη\",\"headersNone\":\"Κανένα\",\"headersRow\":\"Πρώτη Γραμμή\",\"invalidBorder\":\"Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.\",\"invalidCellPadding\":\"Η αναπλήρωση των κελιών πρέπει να είναι θετικός αριθμός.\",\"invalidCellSpacing\":\"Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.\",\"invalidCols\":\"Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.\",\"invalidHeight\":\"Το ύψος του πίνακα πρέπει να είναι αριθμός.\",\"invalidRows\":\"Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.\",\"invalidWidth\":\"Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.\",\"menu\":\"Ιδιότητες Πίνακα\",\"row\":{\"menu\":\"Γραμμή\",\"insertBefore\":\"Εισαγωγή Γραμμής Πριν\",\"insertAfter\":\"Εισαγωγή Γραμμής Μετά\",\"deleteRow\":\"Διαγραφή Γραμμών\"},\"rows\":\"Γραμμές\",\"summary\":\"Περίληψη\",\"title\":\"Ιδιότητες Πίνακα\",\"toolbar\":\"Πίνακας\",\"widthPc\":\"τοις εκατό\",\"widthPx\":\"pixel\",\"widthUnit\":\"μονάδα πλάτους\"},\"undo\":{\"redo\":\"Επανάληψη\",\"undo\":\"Αναίρεση\"},\"wsc\":{\"btnIgnore\":\"Αγνόηση\",\"btnIgnoreAll\":\"Αγνόηση όλων\",\"btnReplace\":\"Αντικατάσταση\",\"btnReplaceAll\":\"Αντικατάσταση όλων\",\"btnUndo\":\"Αναίρεση\",\"changeTo\":\"Αλλαγή σε\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Δεν υπάρχει εγκατεστημένος ορθογράφος. Θέλετε να τον κατεβάσετε τώρα;\",\"manyChanges\":\"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξαν %1 λέξεις\",\"noChanges\":\"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν άλλαξαν λέξεις\",\"noMispell\":\"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν βρέθηκαν λάθη\",\"noSuggestions\":\"- Δεν υπάρχουν προτάσεις -\",\"notAvailable\":\"Η υπηρεσία δεν είναι διαθέσιμη αυτήν την στιγμή.\",\"notInDic\":\"Δεν υπάρχει στο λεξικό\",\"oneChange\":\"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξε μια λέξη\",\"progress\":\"Γίνεται ορθογραφικός έλεγχος...\",\"title\":\"Ορθογραφικός Έλεγχος\",\"toolbar\":\"Ορθογραφικός Έλεγχος\"}};"
  },
  {
    "path": "assets/ckeditor/lang/en-au.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['en-au']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Browse Server\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Upload\",\"uploadSubmit\":\"Send it to the Server\",\"image\":\"Image\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Hidden Field\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Image Button\",\"notSet\":\"<not set>\",\"id\":\"Id\",\"name\":\"Name\",\"langDir\":\"Language Direction\",\"langDirLtr\":\"Left to Right (LTR)\",\"langDirRtl\":\"Right to Left (RTL)\",\"langCode\":\"Language Code\",\"longDescr\":\"Long Description URL\",\"cssClass\":\"Stylesheet Classes\",\"advisoryTitle\":\"Advisory Title\",\"cssStyle\":\"Style\",\"ok\":\"OK\",\"cancel\":\"Cancel\",\"close\":\"Close\",\"preview\":\"Preview\",\"resize\":\"Resize\",\"generalTab\":\"General\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"Target\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Width\",\"height\":\"Height\",\"align\":\"Align\",\"alignLeft\":\"Left\",\"alignRight\":\"Right\",\"alignCenter\":\"Centre\",\"alignJustify\":\"Justify\",\"alignTop\":\"Top\",\"alignMiddle\":\"Middle\",\"alignBottom\":\"Bottom\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Bold\",\"italic\":\"Italic\",\"strike\":\"Strike Through\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Underline\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Copy\",\"copyError\":\"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).\",\"cut\":\"Cut\",\"cutError\":\"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).\",\"paste\":\"Paste\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Paste\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Background Colour\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"More Colours...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Text Colour\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Templates\",\"emptyListMsg\":\"(No templates defined)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Content Templates\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Find\",\"findOptions\":\"Find Options\",\"findWhat\":\"Find what:\",\"matchCase\":\"Match case\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Match whole word\",\"notFoundMsg\":\"The specified text was not found.\",\"replace\":\"Replace\",\"replaceAll\":\"Replace All\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Replace with:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Text Top\",\"bgcolor\":\"Background colour\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"URL must not be empty.\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Size\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Font Size\"},\"label\":\"Font\",\"panelTitle\":\"Font Name\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button Properties\",\"text\":\"Text (Value)\",\"type\":\"Type\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Action\",\"method\":\"Method\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Name\",\"value\":\"Value\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Value\",\"size\":\"Size\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Delete\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Columns\",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Paragraph Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Insert Horizontal Line\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternative Text\",\"border\":\"Border\",\"btnUpload\":\"Send it to the Server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Image Info\",\"linkTab\":\"Link\",\"lockRatio\":\"Lock Ratio\",\"menu\":\"Image Properties\",\"resetSize\":\"Reset Size\",\"title\":\"Image Properties\",\"titleButton\":\"Image Button Properties\",\"upload\":\"Upload\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Increase Indent\",\"outdent\":\"Decrease Indent\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Insert a Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Justify\",\"center\":\"Centre\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Advisory Title\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet Classes\",\"emailAddress\":\"E-Mail Address\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Message Subject\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Language Code\",\"langDir\":\"Language Direction\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"menu\":\"Edit Link\",\"name\":\"Name\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Please type the e-mail address\",\"noUrl\":\"Please type the link URL\",\"other\":\"<other>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Relationship\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"Style\",\"tabIndex\":\"Tab Index\",\"target\":\"Target\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"Link\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"Upload\"},\"list\":{\"bulletedlist\":\"Insert/Remove Bulleted List\",\"numberedlist\":\"Insert/Remove Numbered List\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"New Page\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Paste as plain text\",\"title\":\"Paste as Plain Text\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Paste from Word\",\"toolbar\":\"Paste from Word\"},\"preview\":{\"preview\":\"Preview\"},\"print\":{\"toolbar\":\"Print\"},\"removeformat\":{\"toolbar\":\"Remove Format\"},\"save\":{\"toolbar\":\"Save\"},\"selectall\":{\"toolbar\":\"Select All\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Select Special Character\",\"toolbar\":\"Insert Special Character\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Border size\",\"caption\":\"Caption\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Delete Cells\",\"merge\":\"Merge Cells\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Delete Columns\"},\"columns\":\"Columns\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a number.\",\"invalidCellSpacing\":\"Cell spacing must be a number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Table Properties\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Delete Rows\"},\"rows\":\"Rows\",\"summary\":\"Summary\",\"title\":\"Table Properties\",\"toolbar\":\"Table\",\"widthPc\":\"percent\",\"widthPx\":\"pixels\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Redo\",\"undo\":\"Undo\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/en-ca.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['en-ca']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Browse Server\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Upload\",\"uploadSubmit\":\"Send it to the Server\",\"image\":\"Image\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Hidden Field\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Image Button\",\"notSet\":\"<not set>\",\"id\":\"Id\",\"name\":\"Name\",\"langDir\":\"Language Direction\",\"langDirLtr\":\"Left to Right (LTR)\",\"langDirRtl\":\"Right to Left (RTL)\",\"langCode\":\"Language Code\",\"longDescr\":\"Long Description URL\",\"cssClass\":\"Stylesheet Classes\",\"advisoryTitle\":\"Advisory Title\",\"cssStyle\":\"Style\",\"ok\":\"OK\",\"cancel\":\"Cancel\",\"close\":\"Close\",\"preview\":\"Preview\",\"resize\":\"Resize\",\"generalTab\":\"General\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"Target\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Width\",\"height\":\"Height\",\"align\":\"Align\",\"alignLeft\":\"Left\",\"alignRight\":\"Right\",\"alignCenter\":\"Centre\",\"alignJustify\":\"Justify\",\"alignTop\":\"Top\",\"alignMiddle\":\"Middle\",\"alignBottom\":\"Bottom\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Bold\",\"italic\":\"Italic\",\"strike\":\"Strike Through\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Underline\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Copy\",\"copyError\":\"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).\",\"cut\":\"Cut\",\"cutError\":\"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).\",\"paste\":\"Paste\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Paste\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Background Colour\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"More Colours...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Text Colour\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Templates\",\"emptyListMsg\":\"(No templates defined)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Content Templates\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Find\",\"findOptions\":\"Find Options\",\"findWhat\":\"Find what:\",\"matchCase\":\"Match case\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Match whole word\",\"notFoundMsg\":\"The specified text was not found.\",\"replace\":\"Replace\",\"replaceAll\":\"Replace All\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Replace with:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Text Top\",\"bgcolor\":\"Background colour\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"URL must not be empty.\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Size\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Font Size\"},\"label\":\"Font\",\"panelTitle\":\"Font Name\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button Properties\",\"text\":\"Text (Value)\",\"type\":\"Type\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Action\",\"method\":\"Method\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Name\",\"value\":\"Value\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Value\",\"size\":\"Size\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Delete\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Columns\",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Paragraph Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Insert Horizontal Line\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternative Text\",\"border\":\"Border\",\"btnUpload\":\"Send it to the Server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Image Info\",\"linkTab\":\"Link\",\"lockRatio\":\"Lock Ratio\",\"menu\":\"Image Properties\",\"resetSize\":\"Reset Size\",\"title\":\"Image Properties\",\"titleButton\":\"Image Button Properties\",\"upload\":\"Upload\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Increase Indent\",\"outdent\":\"Decrease Indent\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Insert a Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Justify\",\"center\":\"Centre\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Advisory Title\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet Classes\",\"emailAddress\":\"E-Mail Address\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Message Subject\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Language Code\",\"langDir\":\"Language Direction\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"menu\":\"Edit Link\",\"name\":\"Name\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Please type the e-mail address\",\"noUrl\":\"Please type the link URL\",\"other\":\"<other>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Relationship\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"Style\",\"tabIndex\":\"Tab Index\",\"target\":\"Target\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"Link\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"Upload\"},\"list\":{\"bulletedlist\":\"Insert/Remove Bulleted List\",\"numberedlist\":\"Insert/Remove Numbered List\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"New Page\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Paste as plain text\",\"title\":\"Paste as Plain Text\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Paste from Word\",\"toolbar\":\"Paste from Word\"},\"preview\":{\"preview\":\"Preview\"},\"print\":{\"toolbar\":\"Print\"},\"removeformat\":{\"toolbar\":\"Remove Format\"},\"save\":{\"toolbar\":\"Save\"},\"selectall\":{\"toolbar\":\"Select All\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Select Special Character\",\"toolbar\":\"Insert Special Character\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Border size\",\"caption\":\"Caption\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Delete Cells\",\"merge\":\"Merge Cells\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Delete Columns\"},\"columns\":\"Columns\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a number.\",\"invalidCellSpacing\":\"Cell spacing must be a number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Table Properties\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Delete Rows\"},\"rows\":\"Rows\",\"summary\":\"Summary\",\"title\":\"Table Properties\",\"toolbar\":\"Table\",\"widthPc\":\"percent\",\"widthPx\":\"pixels\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Redo\",\"undo\":\"Undo\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/en-gb.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['en-gb']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Browse Server\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Upload\",\"uploadSubmit\":\"Send it to the Server\",\"image\":\"Image\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Hidden Field\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Image Button\",\"notSet\":\"<not set>\",\"id\":\"Id\",\"name\":\"Name\",\"langDir\":\"Language Direction\",\"langDirLtr\":\"Left to Right (LTR)\",\"langDirRtl\":\"Right to Left (RTL)\",\"langCode\":\"Language Code\",\"longDescr\":\"Long Description URL\",\"cssClass\":\"Stylesheet Classes\",\"advisoryTitle\":\"Advisory Title\",\"cssStyle\":\"Style\",\"ok\":\"OK\",\"cancel\":\"Cancel\",\"close\":\"Close\",\"preview\":\"Preview\",\"resize\":\"Drag to resize\",\"generalTab\":\"General\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialogue window?\",\"options\":\"Options\",\"target\":\"Target\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Width\",\"height\":\"Height\",\"align\":\"Align\",\"alignLeft\":\"Left\",\"alignRight\":\"Right\",\"alignCenter\":\"Centre\",\"alignJustify\":\"Justify\",\"alignTop\":\"Top\",\"alignMiddle\":\"Middle\",\"alignBottom\":\"Bottom\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Bold\",\"italic\":\"Italic\",\"strike\":\"Strike Through\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Underline\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Copy\",\"copyError\":\"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).\",\"cut\":\"Cut\",\"cutError\":\"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).\",\"paste\":\"Paste\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Paste\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Background Colour\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Grey\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Grey\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Grey\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Grey\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"More Colours...\",\"panelTitle\":\"Colours\",\"textColorTitle\":\"Text Colour\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Colour Options\",\"selected\":\"Selected Colour\",\"title\":\"Select colour\"},\"templates\":{\"button\":\"Templates\",\"emptyListMsg\":\"(No templates defined)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Content Templates\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Find\",\"findOptions\":\"Find Options\",\"findWhat\":\"Find what:\",\"matchCase\":\"Match case\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Match whole word\",\"notFoundMsg\":\"The specified text was not found.\",\"replace\":\"Replace\",\"replaceAll\":\"Replace All\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Replace with:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Text Top\",\"bgcolor\":\"Background colour\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"URL must not be empty.\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Size\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Font Size\"},\"label\":\"Font\",\"panelTitle\":\"Font Name\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button Properties\",\"text\":\"Text (Value)\",\"type\":\"Type\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Action\",\"method\":\"Method\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Name\",\"value\":\"Value\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Value\",\"size\":\"Size\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Delete\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Columns\",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Paragraph Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Insert Horizontal Line\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternative Text\",\"border\":\"Border\",\"btnUpload\":\"Send it to the Server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Image Info\",\"linkTab\":\"Link\",\"lockRatio\":\"Lock Ratio\",\"menu\":\"Image Properties\",\"resetSize\":\"Reset Size\",\"title\":\"Image Properties\",\"titleButton\":\"Image Button Properties\",\"upload\":\"Upload\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Increase Indent\",\"outdent\":\"Decrease Indent\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Insert a Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Justify\",\"center\":\"Centre\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Advisory Title\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet Classes\",\"emailAddress\":\"E-Mail Address\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Message Subject\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Language Code\",\"langDir\":\"Language Direction\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"menu\":\"Edit Link\",\"name\":\"Name\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Please type the e-mail address\",\"noUrl\":\"Please type the link URL\",\"other\":\"<other>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Relationship\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"Style\",\"tabIndex\":\"Tab Index\",\"target\":\"Target\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"Link\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"Upload\"},\"list\":{\"bulletedlist\":\"Insert/Remove Bulleted List\",\"numberedlist\":\"Insert/Remove Numbered List\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximise\",\"minimize\":\"Minimise\"},\"newpage\":{\"toolbar\":\"New Page\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Paste as plain text\",\"title\":\"Paste as Plain Text\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Paste from Word\",\"toolbar\":\"Paste from Word\"},\"preview\":{\"preview\":\"Preview\"},\"print\":{\"toolbar\":\"Print\"},\"removeformat\":{\"toolbar\":\"Remove Format\"},\"save\":{\"toolbar\":\"Save\"},\"selectall\":{\"toolbar\":\"Select All\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Select Special Character\",\"toolbar\":\"Insert Special Character\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Border size\",\"caption\":\"Caption\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Delete Cells\",\"merge\":\"Merge Cells\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Delete Columns\"},\"columns\":\"Columns\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a number.\",\"invalidCellSpacing\":\"Cell spacing must be a number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Table Properties\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Delete Rows\"},\"rows\":\"Rows\",\"summary\":\"Summary\",\"title\":\"Table Properties\",\"toolbar\":\"Table\",\"widthPc\":\"percent\",\"widthPx\":\"pixels\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Redo\",\"undo\":\"Undo\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/en.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['en']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Browse Server\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Upload\",\"uploadSubmit\":\"Send it to the Server\",\"image\":\"Image\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Hidden Field\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Image Button\",\"notSet\":\"<not set>\",\"id\":\"Id\",\"name\":\"Name\",\"langDir\":\"Language Direction\",\"langDirLtr\":\"Left to Right (LTR)\",\"langDirRtl\":\"Right to Left (RTL)\",\"langCode\":\"Language Code\",\"longDescr\":\"Long Description URL\",\"cssClass\":\"Stylesheet Classes\",\"advisoryTitle\":\"Advisory Title\",\"cssStyle\":\"Style\",\"ok\":\"OK\",\"cancel\":\"Cancel\",\"close\":\"Close\",\"preview\":\"Preview\",\"resize\":\"Resize\",\"generalTab\":\"General\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"Target\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Width\",\"height\":\"Height\",\"align\":\"Alignment\",\"alignLeft\":\"Left\",\"alignRight\":\"Right\",\"alignCenter\":\"Center\",\"alignJustify\":\"Justify\",\"alignTop\":\"Top\",\"alignMiddle\":\"Middle\",\"alignBottom\":\"Bottom\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Bold\",\"italic\":\"Italic\",\"strike\":\"Strikethrough\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Underline\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Copy\",\"copyError\":\"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).\",\"cut\":\"Cut\",\"cutError\":\"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).\",\"paste\":\"Paste\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Paste\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Background Color\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"More Colors...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Text Color\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Templates\",\"emptyListMsg\":\"(No templates defined)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Content Templates\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Find\",\"findOptions\":\"Find Options\",\"findWhat\":\"Find what:\",\"matchCase\":\"Match case\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Match whole word\",\"notFoundMsg\":\"The specified text was not found.\",\"replace\":\"Replace\",\"replaceAll\":\"Replace All\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Replace with:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Text Top\",\"bgcolor\":\"Background color\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"URL must not be empty.\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Size\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Font Size\"},\"label\":\"Font\",\"panelTitle\":\"Font Name\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button Properties\",\"text\":\"Text (Value)\",\"type\":\"Type\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Action\",\"method\":\"Method\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Name\",\"value\":\"Value\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Value\",\"size\":\"Size\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Delete\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Columns\",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Paragraph Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Insert Horizontal Line\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternative Text\",\"border\":\"Border\",\"btnUpload\":\"Send it to the Server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Image Info\",\"linkTab\":\"Link\",\"lockRatio\":\"Lock Ratio\",\"menu\":\"Image Properties\",\"resetSize\":\"Reset Size\",\"title\":\"Image Properties\",\"titleButton\":\"Image Button Properties\",\"upload\":\"Upload\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Increase Indent\",\"outdent\":\"Decrease Indent\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Insert a Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Justify\",\"center\":\"Center\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Advisory Title\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet Classes\",\"emailAddress\":\"E-Mail Address\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Message Subject\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Language Code\",\"langDir\":\"Language Direction\",\"langDirLTR\":\"Left to Right (LTR)\",\"langDirRTL\":\"Right to Left (RTL)\",\"menu\":\"Edit Link\",\"name\":\"Name\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Please type the e-mail address\",\"noUrl\":\"Please type the link URL\",\"other\":\"<other>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Relationship\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"Style\",\"tabIndex\":\"Tab Index\",\"target\":\"Target\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"Link\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"Upload\"},\"list\":{\"bulletedlist\":\"Insert/Remove Bulleted List\",\"numberedlist\":\"Insert/Remove Numbered List\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"New Page\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Paste as plain text\",\"title\":\"Paste as Plain Text\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Paste from Word\",\"toolbar\":\"Paste from Word\"},\"preview\":{\"preview\":\"Preview\"},\"print\":{\"toolbar\":\"Print\"},\"removeformat\":{\"toolbar\":\"Remove Format\"},\"save\":{\"toolbar\":\"Save\"},\"selectall\":{\"toolbar\":\"Select All\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Select Special Character\",\"toolbar\":\"Insert Special Character\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Border size\",\"caption\":\"Caption\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Delete Cells\",\"merge\":\"Merge Cells\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Delete Columns\"},\"columns\":\"Columns\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Table Properties\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Delete Rows\"},\"rows\":\"Rows\",\"summary\":\"Summary\",\"title\":\"Table Properties\",\"toolbar\":\"Table\",\"widthPc\":\"percent\",\"widthPx\":\"pixels\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Redo\",\"undo\":\"Undo\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/eo.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['eo']={\"editor\":\"RiĉTeksta Redaktilo\",\"editorPanel\":\"Panelo de la RiĉTeksta Redaktilo\",\"common\":{\"editorHelp\":\"Premu ALT 0 por helpilo\",\"browseServer\":\"Foliumi en la Servilo\",\"url\":\"URL\",\"protocol\":\"Protokolo\",\"upload\":\"Alŝuti\",\"uploadSubmit\":\"Sendu al Servilo\",\"image\":\"Bildo\",\"flash\":\"Flaŝo\",\"form\":\"Formularo\",\"checkbox\":\"Markobutono\",\"radio\":\"Radiobutono\",\"textField\":\"Teksta kampo\",\"textarea\":\"Teksta Areo\",\"hiddenField\":\"Kaŝita Kampo\",\"button\":\"Butono\",\"select\":\"Elekta Kampo\",\"imageButton\":\"Bildbutono\",\"notSet\":\"<Defaŭlta>\",\"id\":\"Id\",\"name\":\"Nomo\",\"langDir\":\"Skribdirekto\",\"langDirLtr\":\"De maldekstro dekstren (LTR)\",\"langDirRtl\":\"De dekstro maldekstren (RTL)\",\"langCode\":\"Lingva Kodo\",\"longDescr\":\"URL de Longa Priskribo\",\"cssClass\":\"Klasoj de Stilfolioj\",\"advisoryTitle\":\"Priskriba Titolo\",\"cssStyle\":\"Stilo\",\"ok\":\"Akcepti\",\"cancel\":\"Rezigni\",\"close\":\"Fermi\",\"preview\":\"Vidigi Aspekton\",\"resize\":\"Movigi por ŝanĝi la grandon\",\"generalTab\":\"Ĝenerala\",\"advancedTab\":\"Speciala\",\"validateNumberFailed\":\"Tiu valoro ne estas nombro.\",\"confirmNewPage\":\"La neregistritaj ŝanĝoj estas perdotaj. Ĉu vi certas, ke vi volas ŝargi novan paĝon?\",\"confirmCancel\":\"Iuj opcioj esta ŝanĝitaj. Ĉu vi certas, ke vi volas fermi la dialogon?\",\"options\":\"Opcioj\",\"target\":\"Celo\",\"targetNew\":\"Nova Fenestro (_blank)\",\"targetTop\":\"Supra Fenestro (_top)\",\"targetSelf\":\"Sama Fenestro (_self)\",\"targetParent\":\"Patra Fenestro (_parent)\",\"langDirLTR\":\"De maldekstro dekstren (LTR)\",\"langDirRTL\":\"De dekstro maldekstren (RTL)\",\"styles\":\"Stilo\",\"cssClasses\":\"Stilfoliaj Klasoj\",\"width\":\"Larĝo\",\"height\":\"Alto\",\"align\":\"Ĝisrandigo\",\"alignLeft\":\"Maldekstre\",\"alignRight\":\"Dekstre\",\"alignCenter\":\"Centre\",\"alignJustify\":\"Ĝisrandigi Ambaŭflanke\",\"alignTop\":\"Supre\",\"alignMiddle\":\"Centre\",\"alignBottom\":\"Malsupre\",\"alignNone\":\"Neniu\",\"invalidValue\":\"Nevalida Valoro\",\"invalidHeight\":\"Alto devas esti nombro.\",\"invalidWidth\":\"Larĝo devas esti nombro.\",\"invalidCssLength\":\"La valoro indikita por la \\\"%1\\\" kampo devas esti pozitiva nombro kun aŭ sen valida CSSmezurunuo (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"La valoro indikita por la \\\"%1\\\" kampo devas esti pozitiva nombro kun aŭ sen valida HTMLmezurunuo (px or %).\",\"invalidInlineStyle\":\"La valoro indikita por la enlinia stilo devas konsisti el unu aŭ pluraj elementoj kun la formato de \\\"nomo : valoro\\\", apartigitaj per punktokomoj.\",\"cssLengthTooltip\":\"Entajpu nombron por rastrumera valoro aŭ nombron kun valida CSSunuo (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nehavebla</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Ĉiuj rajtoj rezervitaj.\",\"dlgTitle\":\"Pri CKEditor\",\"help\":\"Kontroli $1 por helpo.\",\"moreInfo\":\"Por informoj pri licenco, bonvolu viziti nian retpaĝaron:\",\"title\":\"Pri CKEditor\",\"userGuide\":\"CKEditor Uzindikoj\"},\"basicstyles\":{\"bold\":\"Grasa\",\"italic\":\"Kursiva\",\"strike\":\"Trastreko\",\"subscript\":\"Suba indico\",\"superscript\":\"Supra indico\",\"underline\":\"Substreko\"},\"bidi\":{\"ltr\":\"Tekstdirekto de maldekstre dekstren\",\"rtl\":\"Tekstdirekto de dekstre maldekstren\"},\"blockquote\":{\"toolbar\":\"Citaĵo\"},\"clipboard\":{\"copy\":\"Kopii\",\"copyError\":\"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).\",\"cut\":\"Eltondi\",\"cutError\":\"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).\",\"paste\":\"Interglui\",\"pasteArea\":\"Intergluoareo\",\"pasteMsg\":\"Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (<strong>Ctrl/Cmd+V</strong>) kaj premu OK\",\"securityMsg\":\"Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poŝo. Bonvolu denove interglui la datenojn en tiun fenestron.\",\"title\":\"Interglui\"},\"button\":{\"selectedLabel\":\"%1 (Selektita)\"},\"colorbutton\":{\"auto\":\"Aŭtomata\",\"bgColorTitle\":\"Fona Koloro\",\"colors\":{\"000\":\"Nigra\",\"800000\":\"Kaŝtankolora\",\"8B4513\":\"Mezbruna\",\"2F4F4F\":\"Ardezgriza\",\"008080\":\"Marĉanaskolora\",\"000080\":\"Maristblua\",\"4B0082\":\"Indigokolora\",\"696969\":\"Malhelgriza\",\"B22222\":\"Brikruĝa\",\"A52A2A\":\"Bruna\",\"DAA520\":\"Senbrilorkolora\",\"006400\":\"Malhelverda\",\"40E0D0\":\"Turkisblua\",\"0000CD\":\"Reĝblua\",\"800080\":\"Purpura\",\"808080\":\"Griza\",\"F00\":\"Ruĝa\",\"FF8C00\":\"Malheloranĝkolora\",\"FFD700\":\"Orkolora\",\"008000\":\"Verda\",\"0FF\":\"Verdblua\",\"00F\":\"Blua\",\"EE82EE\":\"Viola\",\"A9A9A9\":\"Mezgriza\",\"FFA07A\":\"Salmokolora\",\"FFA500\":\"Oranĝkolora\",\"FFFF00\":\"Flava\",\"00FF00\":\"Limetkolora\",\"AFEEEE\":\"Helturkiskolora\",\"ADD8E6\":\"Helblua\",\"DDA0DD\":\"Prunkolora\",\"D3D3D3\":\"Helgriza\",\"FFF0F5\":\"Lavendkolora vangoŝminko\",\"FAEBD7\":\"Antikvablanka\",\"FFFFE0\":\"Helflava\",\"F0FFF0\":\"Vintromelonkolora\",\"F0FFFF\":\"Lazura\",\"F0F8FF\":\"Aliceblua\",\"E6E6FA\":\"Lavendkolora\",\"FFF\":\"Blanka\"},\"more\":\"Pli da Koloroj...\",\"panelTitle\":\"Koloroj\",\"textColorTitle\":\"Teksta Koloro\"},\"colordialog\":{\"clear\":\"Forigi\",\"highlight\":\"Detaloj\",\"options\":\"Opcioj pri koloroj\",\"selected\":\"Selektita koloro\",\"title\":\"Selekti koloron\"},\"templates\":{\"button\":\"Ŝablonoj\",\"emptyListMsg\":\"(Neniu ŝablono difinita)\",\"insertOption\":\"Anstataŭigi la nunan enhavon\",\"options\":\"Opcioj pri ŝablonoj\",\"selectPromptMsg\":\"Bonvolu selekti la ŝablonon por malfermi ĝin en la redaktilo\",\"title\":\"Enhavo de ŝablonoj\"},\"contextmenu\":{\"options\":\"Opcioj de Kunteksta Menuo\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Priskriba Titolo\",\"cssClassInputLabel\":\"Stilfolioklasoj\",\"edit\":\"Redakti Div\",\"inlineStyleInputLabel\":\"Enlinia stilo\",\"langDirLTRLabel\":\"Maldekstre dekstren (angle LTR)\",\"langDirLabel\":\"Skribdirekto\",\"langDirRTLLabel\":\"Dekstre maldekstren (angle RTL)\",\"languageCodeInputLabel\":\" Lingvokodo\",\"remove\":\"Forigi Div\",\"styleSelectLabel\":\"Stilo\",\"title\":\"Krei DIV ujon\",\"toolbar\":\"Krei DIV ujon\"},\"toolbar\":{\"toolbarCollapse\":\"Faldi la ilbreton\",\"toolbarExpand\":\"Malfaldi la ilbreton\",\"toolbarGroups\":{\"document\":\"Dokumento\",\"clipboard\":\"Poŝo/Malfari\",\"editing\":\"Redaktado\",\"forms\":\"Formularoj\",\"basicstyles\":\"Bazaj stiloj\",\"paragraph\":\"Paragrafo\",\"links\":\"Ligiloj\",\"insert\":\"Enmeti\",\"styles\":\"Stiloj\",\"colors\":\"Koloroj\",\"tools\":\"Iloj\"},\"toolbars\":\"Ilobretoj de la redaktilo\"},\"elementspath\":{\"eleLabel\":\"Vojo al Elementoj\",\"eleTitle\":\"%1 elementoj\"},\"find\":{\"find\":\"Serĉi\",\"findOptions\":\"Opcioj pri Serĉado\",\"findWhat\":\"Serĉi:\",\"matchCase\":\"Kongruigi Usklecon\",\"matchCyclic\":\"Cikla Serĉado\",\"matchWord\":\"Tuta Vorto\",\"notFoundMsg\":\"La celteksto ne estas trovita.\",\"replace\":\"Anstataŭigi\",\"replaceAll\":\"Anstataŭigi Ĉion\",\"replaceSuccessMsg\":\"%1 anstataŭigita(j) apero(j).\",\"replaceWith\":\"Anstataŭigi per:\",\"title\":\"Serĉi kaj Anstataŭigi\"},\"fakeobjects\":{\"anchor\":\"Ankro\",\"flash\":\"FlaŝAnimacio\",\"hiddenfield\":\"Kaŝita kampo\",\"iframe\":\"Enlinia Kadro (IFrame)\",\"unknown\":\"Nekonata objekto\"},\"flash\":{\"access\":\"Atingi skriptojn\",\"accessAlways\":\"Ĉiam\",\"accessNever\":\"Neniam\",\"accessSameDomain\":\"Sama domajno\",\"alignAbsBottom\":\"Absoluta Malsupro\",\"alignAbsMiddle\":\"Absoluta Centro\",\"alignBaseline\":\"TekstoMalsupro\",\"alignTextTop\":\"TekstoSupro\",\"bgcolor\":\"Fona Koloro\",\"chkFull\":\"Permesi tutekranon\",\"chkLoop\":\"Iteracio\",\"chkMenu\":\"Ebligi flaŝmenuon\",\"chkPlay\":\"Aŭtomata legado\",\"flashvars\":\"Variabloj por Flaŝo\",\"hSpace\":\"Horizontala Spaco\",\"properties\":\"Flaŝatributoj\",\"propertiesTab\":\"Atributoj\",\"quality\":\"Kvalito\",\"qualityAutoHigh\":\"Aŭtomate alta\",\"qualityAutoLow\":\"Aŭtomate malalta\",\"qualityBest\":\"Plej bona\",\"qualityHigh\":\"Alta\",\"qualityLow\":\"Malalta\",\"qualityMedium\":\"Meza\",\"scale\":\"Skalo\",\"scaleAll\":\"Montri ĉion\",\"scaleFit\":\"Origina grando\",\"scaleNoBorder\":\"Neniu bordero\",\"title\":\"Flaŝatributoj\",\"vSpace\":\"Vertikala Spaco\",\"validateHSpace\":\"Horizontala Spaco devas esti nombro.\",\"validateSrc\":\"Bonvolu entajpi la retadreson (URL)\",\"validateVSpace\":\"Vertikala Spaco devas esti nombro.\",\"windowMode\":\"Fenestra reĝimo\",\"windowModeOpaque\":\"Opaka\",\"windowModeTransparent\":\"Travidebla\",\"windowModeWindow\":\"Fenestro\"},\"font\":{\"fontSize\":{\"label\":\"Grado\",\"voiceLabel\":\"Tipara grado\",\"panelTitle\":\"Tipara grado\"},\"label\":\"Tiparo\",\"panelTitle\":\"Tipara nomo\",\"voiceLabel\":\"Tiparo\"},\"forms\":{\"button\":{\"title\":\"Butonaj atributoj\",\"text\":\"Teksto (Valoro)\",\"type\":\"Tipo\",\"typeBtn\":\"Butono\",\"typeSbm\":\"Validigi (submit)\",\"typeRst\":\"Remeti en la originstaton (Reset)\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Markobutonaj Atributoj\",\"radioTitle\":\"Radiobutonaj Atributoj\",\"value\":\"Valoro\",\"selected\":\"Selektita\",\"required\":\"Postulata\"},\"form\":{\"title\":\"Formularaj Atributoj\",\"menu\":\"Formularaj Atributoj\",\"action\":\"Ago\",\"method\":\"Metodo\",\"encoding\":\"Kodoprezento\"},\"hidden\":{\"title\":\"Atributoj de Kaŝita Kampo\",\"name\":\"Nomo\",\"value\":\"Valoro\"},\"select\":{\"title\":\"Atributoj de Elekta Kampo\",\"selectInfo\":\"Informoj pri la rulummenuo\",\"opAvail\":\"Elektoj Disponeblaj\",\"value\":\"Valoro\",\"size\":\"Grando\",\"lines\":\"Linioj\",\"chkMulti\":\"Permesi Plurajn Elektojn\",\"required\":\"Postulata\",\"opText\":\"Teksto\",\"opValue\":\"Valoro\",\"btnAdd\":\"Aldoni\",\"btnModify\":\"Modifi\",\"btnUp\":\"Supren\",\"btnDown\":\"Malsupren\",\"btnSetValue\":\"Agordi kiel Elektitan Valoron\",\"btnDelete\":\"Forigi\"},\"textarea\":{\"title\":\"Atributoj de Teksta Areo\",\"cols\":\"Kolumnoj\",\"rows\":\"Linioj\"},\"textfield\":{\"title\":\"Atributoj de Teksta Kampo\",\"name\":\"Nomo\",\"value\":\"Valoro\",\"charWidth\":\"Signolarĝo\",\"maxChars\":\"Maksimuma Nombro da Signoj\",\"required\":\"Postulata\",\"type\":\"Tipo\",\"typeText\":\"Teksto\",\"typePass\":\"Pasvorto\",\"typeEmail\":\"retpoŝtadreso\",\"typeSearch\":\"Serĉi\",\"typeTel\":\"Telefonnumero\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formato\",\"panelTitle\":\"ParagrafFormato\",\"tag_address\":\"Adreso\",\"tag_div\":\"Normala (DIV)\",\"tag_h1\":\"Titolo 1\",\"tag_h2\":\"Titolo 2\",\"tag_h3\":\"Titolo 3\",\"tag_h4\":\"Titolo 4\",\"tag_h5\":\"Titolo 5\",\"tag_h6\":\"Titolo 6\",\"tag_p\":\"Normala\",\"tag_pre\":\"Formatita\"},\"horizontalrule\":{\"toolbar\":\"Enmeti Horizontalan Linion\"},\"iframe\":{\"border\":\"Montri borderon de kadro (frame)\",\"noUrl\":\"Bonvolu entajpi la retadreson de la ligilo al la enlinia kadro (IFrame)\",\"scrolling\":\"Ebligi rulumskalon\",\"title\":\"Atributoj de la enlinia kadro (IFrame)\",\"toolbar\":\"Enlinia kadro (IFrame)\"},\"image\":{\"alt\":\"Anstataŭiga Teksto\",\"border\":\"Bordero\",\"btnUpload\":\"Sendu al Servilo\",\"button2Img\":\"Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?\",\"hSpace\":\"Horizontala Spaco\",\"img2Button\":\"Ĉu vi volas transformi la selektitan bildon en bildbutonon?\",\"infoTab\":\"Informoj pri Bildo\",\"linkTab\":\"Ligilo\",\"lockRatio\":\"Konservi Proporcion\",\"menu\":\"Atributoj de Bildo\",\"resetSize\":\"Origina Grando\",\"title\":\"Atributoj de Bildo\",\"titleButton\":\"Bildbutonaj Atributoj\",\"upload\":\"Alŝuti\",\"urlMissing\":\"La fontretadreso de la bildo mankas.\",\"vSpace\":\"Vertikala Spaco\",\"validateBorder\":\"La bordero devas esti entjera nombro.\",\"validateHSpace\":\"La horizontala spaco devas esti entjera nombro.\",\"validateVSpace\":\"La vertikala spaco devas esti entjera nombro.\"},\"indent\":{\"indent\":\"Pligrandigi Krommarĝenon\",\"outdent\":\"Malpligrandigi Krommarĝenon\"},\"smiley\":{\"options\":\"Opcioj pri mienvinjetoj\",\"title\":\"Enmeti Mienvinjeton\",\"toolbar\":\"Mienvinjeto\"},\"justify\":{\"block\":\"Ĝisrandigi Ambaŭflanke\",\"center\":\"Centrigi\",\"left\":\"Ĝisrandigi maldekstren\",\"right\":\"Ĝisrandigi dekstren\"},\"language\":{\"button\":\"Instali lingvon\",\"remove\":\"Forigi lingvon\"},\"link\":{\"acccessKey\":\"Fulmoklavo\",\"advanced\":\"Speciala\",\"advisoryContentType\":\"Enhavotipo\",\"advisoryTitle\":\"Priskriba Titolo\",\"anchor\":{\"toolbar\":\"Ankro\",\"menu\":\"Enmeti/Ŝanĝi Ankron\",\"title\":\"Ankraj Atributoj\",\"name\":\"Ankra Nomo\",\"errorName\":\"Bv entajpi la ankran nomon\",\"remove\":\"Forigi Ankron\"},\"anchorId\":\"Per Elementidentigilo\",\"anchorName\":\"Per Ankronomo\",\"charset\":\"Signaro de la Ligita Rimedo\",\"cssClasses\":\"Klasoj de Stilfolioj\",\"emailAddress\":\"Retpoŝto\",\"emailBody\":\"Mesaĝa korpo\",\"emailSubject\":\"Mesaĝa Temo\",\"id\":\"Id\",\"info\":\"Informoj pri la Ligilo\",\"langCode\":\"Lingva Kodo\",\"langDir\":\"Skribdirekto\",\"langDirLTR\":\"De maldekstro dekstren (LTR)\",\"langDirRTL\":\"De dekstro maldekstren (RTL)\",\"menu\":\"Ŝanĝi Ligilon\",\"name\":\"Nomo\",\"noAnchors\":\"<Ne disponeblas ankroj en la dokumento>\",\"noEmail\":\"Bonvolu entajpi la retpoŝtadreson\",\"noUrl\":\"Bonvolu entajpi la URL-on\",\"other\":\"<alia>\",\"popupDependent\":\"Dependa (Netscape)\",\"popupFeatures\":\"Atributoj de la Ŝprucfenestro\",\"popupFullScreen\":\"Tutekrane (IE)\",\"popupLeft\":\"Maldekstra Pozicio\",\"popupLocationBar\":\"Adresobreto\",\"popupMenuBar\":\"Menubreto\",\"popupResizable\":\"Dimensiŝanĝebla\",\"popupScrollBars\":\"Rulumskaloj\",\"popupStatusBar\":\"Statobreto\",\"popupToolbar\":\"Ilobreto\",\"popupTop\":\"Supra Pozicio\",\"rel\":\"Rilato\",\"selectAnchor\":\"Elekti Ankron\",\"styles\":\"Stilo\",\"tabIndex\":\"Taba Indekso\",\"target\":\"Celo\",\"targetFrame\":\"<kadro>\",\"targetFrameName\":\"Nomo de CelKadro\",\"targetPopup\":\"<ŝprucfenestro>\",\"targetPopupName\":\"Nomo de Ŝprucfenestro\",\"title\":\"Ligilo\",\"toAnchor\":\"Ankri en tiu ĉi paĝo\",\"toEmail\":\"Retpoŝto\",\"toUrl\":\"URL\",\"toolbar\":\"Enmeti/Ŝanĝi Ligilon\",\"type\":\"Tipo de Ligilo\",\"unlink\":\"Forigi Ligilon\",\"upload\":\"Alŝuti\"},\"list\":{\"bulletedlist\":\"Bula Listo\",\"numberedlist\":\"Numera Listo\"},\"liststyle\":{\"armenian\":\"Armena nombrado\",\"bulletedTitle\":\"Atributoj de Bula Listo\",\"circle\":\"Cirklo\",\"decimal\":\"Dekumaj Nombroj (1, 2, 3, ktp.)\",\"decimalLeadingZero\":\"Dekumaj Nombroj malantaŭ nulo (01, 02, 03, ktp.)\",\"disc\":\"Disko\",\"georgian\":\"Gruza nombrado (an, ban, gan, ktp.)\",\"lowerAlpha\":\"Minusklaj Literoj (a, b, c, d, e, ktp.)\",\"lowerGreek\":\"Grekaj Minusklaj Literoj (alpha, beta, gamma, ktp.)\",\"lowerRoman\":\"Minusklaj Romanaj Nombroj (i, ii, iii, iv, v, ktp.)\",\"none\":\"Neniu\",\"notset\":\"<Defaŭlta>\",\"numberedTitle\":\"Atributoj de Numera Listo\",\"square\":\"kvadrato\",\"start\":\"Komenco\",\"type\":\"Tipo\",\"upperAlpha\":\"Majusklaj Literoj (A, B, C, D, E, ktp.)\",\"upperRoman\":\"Majusklaj Romanaj Nombroj (I, II, III, IV, V, ktp.)\",\"validateStartNumber\":\"La unua listero devas esti entjera nombro.\"},\"magicline\":{\"title\":\"Enmeti paragrafon ĉi-tien\"},\"maximize\":{\"maximize\":\"Pligrandigi\",\"minimize\":\"Malgrandigi\"},\"newpage\":{\"toolbar\":\"Nova Paĝo\"},\"pagebreak\":{\"alt\":\"Paĝavanco\",\"toolbar\":\"Enmeti Paĝavancon por Presado\"},\"pastetext\":{\"button\":\"Interglui kiel platan tekston\",\"title\":\"Interglui kiel platan tekston\"},\"pastefromword\":{\"confirmCleanup\":\"La teksto, kiun vi volas interglui, ŝajnas esti kopiita el Word. Ĉu vi deziras purigi ĝin antaŭ intergluo?\",\"error\":\"Ne eblis purigi la intergluitajn datenojn pro interna eraro\",\"title\":\"Interglui el Word\",\"toolbar\":\"Interglui el Word\"},\"preview\":{\"preview\":\"Vidigi Aspekton\"},\"print\":{\"toolbar\":\"Presi\"},\"removeformat\":{\"toolbar\":\"Forigi Formaton\"},\"save\":{\"toolbar\":\"Konservi\"},\"selectall\":{\"toolbar\":\"Elekti ĉion\"},\"showblocks\":{\"toolbar\":\"Montri la blokojn\"},\"sourcearea\":{\"toolbar\":\"Fonto\"},\"specialchar\":{\"options\":\"Opcioj pri Specialaj Signoj\",\"title\":\"Selekti Specialan Signon\",\"toolbar\":\"Enmeti Specialan Signon\"},\"scayt\":{\"btn_about\":\"Pri OKDVT\",\"btn_dictionaries\":\"Vortaroj\",\"btn_disable\":\"Malebligi OKDVT\",\"btn_enable\":\"Ebligi OKDVT\",\"btn_langs\":\"Lingvoj\",\"btn_options\":\"Opcioj\",\"text_title\":\"OrtografiKontrolado Dum Vi Tajpas (OKDVT)\"},\"stylescombo\":{\"label\":\"Stiloj\",\"panelTitle\":\"Stiloj pri enpaĝigo\",\"panelTitle1\":\"Stiloj de blokoj\",\"panelTitle2\":\"Enliniaj Stiloj\",\"panelTitle3\":\"Stiloj de objektoj\"},\"table\":{\"border\":\"Bordero\",\"caption\":\"Tabeltitolo\",\"cell\":{\"menu\":\"Ĉelo\",\"insertBefore\":\"Enmeti Ĉelon Antaŭ\",\"insertAfter\":\"Enmeti Ĉelon Post\",\"deleteCell\":\"Forigi la Ĉelojn\",\"merge\":\"Kunfandi la Ĉelojn\",\"mergeRight\":\"Kunfandi dekstren\",\"mergeDown\":\"Kunfandi malsupren \",\"splitHorizontal\":\"Horizontale dividi\",\"splitVertical\":\"Vertikale dividi\",\"title\":\"Ĉelatributoj\",\"cellType\":\"Ĉeltipo\",\"rowSpan\":\"Kunfando de linioj\",\"colSpan\":\"Kunfando de kolumnoj\",\"wordWrap\":\"Cezuro\",\"hAlign\":\"Horizontala ĝisrandigo\",\"vAlign\":\"Vertikala ĝisrandigo\",\"alignBaseline\":\"Malsupro de la teksto\",\"bgColor\":\"Fonkoloro\",\"borderColor\":\"Borderkoloro\",\"data\":\"Datenoj\",\"header\":\"Supra paĝotitolo\",\"yes\":\"Jes\",\"no\":\"No\",\"invalidWidth\":\"Ĉellarĝo devas esti nombro.\",\"invalidHeight\":\"Ĉelalto devas esti nombro.\",\"invalidRowSpan\":\"Kunfando de linioj devas esti entjera nombro.\",\"invalidColSpan\":\"Kunfando de kolumnoj devas esti entjera nombro.\",\"chooseColor\":\"Elektu\"},\"cellPad\":\"Interna Marĝeno de la ĉeloj\",\"cellSpace\":\"Spaco inter la Ĉeloj\",\"column\":{\"menu\":\"Kolumno\",\"insertBefore\":\"Enmeti kolumnon antaŭ\",\"insertAfter\":\"Enmeti kolumnon post\",\"deleteColumn\":\"Forigi Kolumnojn\"},\"columns\":\"Kolumnoj\",\"deleteTable\":\"Forigi Tabelon\",\"headers\":\"Supraj Paĝotitoloj\",\"headersBoth\":\"Ambaŭ\",\"headersColumn\":\"Unua kolumno\",\"headersNone\":\"Neniu\",\"headersRow\":\"Unua linio\",\"invalidBorder\":\"La bordergrando devas esti nombro.\",\"invalidCellPadding\":\"La interna marĝeno en la ĉeloj devas esti pozitiva nombro.\",\"invalidCellSpacing\":\"La spaco inter la ĉeloj devas esti pozitiva nombro.\",\"invalidCols\":\"La nombro de la kolumnoj devas superi 0.\",\"invalidHeight\":\"La tabelalto devas esti nombro.\",\"invalidRows\":\"La nombro de la linioj devas superi 0.\",\"invalidWidth\":\"La tabellarĝo devas esti nombro.\",\"menu\":\"Atributoj de Tabelo\",\"row\":{\"menu\":\"Linio\",\"insertBefore\":\"Enmeti linion antaŭ\",\"insertAfter\":\"Enmeti linion post\",\"deleteRow\":\"Forigi Liniojn\"},\"rows\":\"Linioj\",\"summary\":\"Resumo\",\"title\":\"Atributoj de Tabelo\",\"toolbar\":\"Tabelo\",\"widthPc\":\"elcentoj\",\"widthPx\":\"Rastrumeroj\",\"widthUnit\":\"unuo de larĝo\"},\"undo\":{\"redo\":\"Refari\",\"undo\":\"Malfari\"},\"wsc\":{\"btnIgnore\":\"Ignori\",\"btnIgnoreAll\":\"Ignori Ĉion\",\"btnReplace\":\"Anstataŭigi\",\"btnReplaceAll\":\"Anstataŭigi Ĉion\",\"btnUndo\":\"Malfari\",\"changeTo\":\"Ŝanĝi al\",\"errorLoading\":\"Eraro en la servoelŝuto el la gastiga komputiko: %s.\",\"ieSpellDownload\":\"Ortografikontrolilo ne instalita. Ĉu vi volas elŝuti ĝin nun?\",\"manyChanges\":\"Ortografikontrolado finita: %1 vortoj korektitaj\",\"noChanges\":\"Ortografikontrolado finita: neniu vorto korektita\",\"noMispell\":\"Ortografikontrolado finita: neniu eraro trovita\",\"noSuggestions\":\"- Neniu propono -\",\"notAvailable\":\"Bedaŭrinde la servo ne funkcias nuntempe.\",\"notInDic\":\"Ne trovita en la vortaro\",\"oneChange\":\"Ortografikontrolado finita: unu vorto korektita\",\"progress\":\"La ortografio estas kontrolata...\",\"title\":\"Kontroli la ortografion\",\"toolbar\":\"Kontroli la ortografion\"}};"
  },
  {
    "path": "assets/ckeditor/lang/es.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['es']={\"editor\":\"Editor de texto enriquecido\",\"editorPanel\":\"Panel del Editor de Texto Enriquecido\",\"common\":{\"editorHelp\":\"Pulse ALT 0 para ayuda\",\"browseServer\":\"Ver Servidor\",\"url\":\"URL\",\"protocol\":\"Protocolo\",\"upload\":\"Cargar\",\"uploadSubmit\":\"Enviar al Servidor\",\"image\":\"Imagen\",\"flash\":\"Flash\",\"form\":\"Formulario\",\"checkbox\":\"Casilla de Verificación\",\"radio\":\"Botones de Radio\",\"textField\":\"Campo de Texto\",\"textarea\":\"Area de Texto\",\"hiddenField\":\"Campo Oculto\",\"button\":\"Botón\",\"select\":\"Campo de Selección\",\"imageButton\":\"Botón Imagen\",\"notSet\":\"<No definido>\",\"id\":\"Id\",\"name\":\"Nombre\",\"langDir\":\"Orientación\",\"langDirLtr\":\"Izquierda a Derecha (LTR)\",\"langDirRtl\":\"Derecha a Izquierda (RTL)\",\"langCode\":\"Cód. de idioma\",\"longDescr\":\"Descripción larga URL\",\"cssClass\":\"Clases de hojas de estilo\",\"advisoryTitle\":\"Título\",\"cssStyle\":\"Estilo\",\"ok\":\"Aceptar\",\"cancel\":\"Cancelar\",\"close\":\"Cerrar\",\"preview\":\"Previsualización\",\"resize\":\"Arrastre para redimensionar\",\"generalTab\":\"General\",\"advancedTab\":\"Avanzado\",\"validateNumberFailed\":\"El valor no es un número.\",\"confirmNewPage\":\"Cualquier cambio que no se haya guardado se perderá.\\r\\n¿Está seguro de querer crear una nueva página?\",\"confirmCancel\":\"Algunas de las opciones se han cambiado.\\r\\n¿Está seguro de querer cerrar el diálogo?\",\"options\":\"Opciones\",\"target\":\"Destino\",\"targetNew\":\"Nueva ventana (_blank)\",\"targetTop\":\"Ventana principal (_top)\",\"targetSelf\":\"Misma ventana (_self)\",\"targetParent\":\"Ventana padre (_parent)\",\"langDirLTR\":\"Izquierda a derecha (LTR)\",\"langDirRTL\":\"Derecha a izquierda (RTL)\",\"styles\":\"Estilos\",\"cssClasses\":\"Clase de la hoja de estilos\",\"width\":\"Anchura\",\"height\":\"Altura\",\"align\":\"Alineación\",\"alignLeft\":\"Izquierda\",\"alignRight\":\"Derecha\",\"alignCenter\":\"Centrado\",\"alignJustify\":\"Justificado\",\"alignTop\":\"Tope\",\"alignMiddle\":\"Centro\",\"alignBottom\":\"Pie\",\"alignNone\":\"Ninguno\",\"invalidValue\":\"Valor no válido\",\"invalidHeight\":\"Altura debe ser un número.\",\"invalidWidth\":\"Anchura debe ser un número.\",\"invalidCssLength\":\"El valor especificado para el campo \\\"%1\\\" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).\",\"invalidHtmlLength\":\"El valor especificado para el campo \\\"%1\\\" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).\",\"invalidInlineStyle\":\"El valor especificado para el estilo debe consistir en uno o más pares con el formato \\\"nombre: valor\\\", separados por punto y coma.\",\"cssLengthTooltip\":\"Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, no disponible</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Todos los derechos reservados.\",\"dlgTitle\":\"Acerca de CKEditor\",\"help\":\"Lea la  $1 para resolver sus dudas.\",\"moreInfo\":\"Para información de licencia, por favor visite nuestro sitio web:\",\"title\":\"Acerca de CKEditor\",\"userGuide\":\"Guía de usuario de CKEditor\"},\"basicstyles\":{\"bold\":\"Negrita\",\"italic\":\"Cursiva\",\"strike\":\"Tachado\",\"subscript\":\"Subíndice\",\"superscript\":\"Superíndice\",\"underline\":\"Subrayado\"},\"bidi\":{\"ltr\":\"Dirección del texto de izquierda a derecha\",\"rtl\":\"Dirección del texto de derecha a izquierda\"},\"blockquote\":{\"toolbar\":\"Cita\"},\"clipboard\":{\"copy\":\"Copiar\",\"copyError\":\"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\\r\\nPor favor use el teclado (Ctrl/Cmd+C).\",\"cut\":\"Cortar\",\"cutError\":\"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\\r\\nPor favor use el teclado (Ctrl/Cmd+X).\",\"paste\":\"Pegar\",\"pasteArea\":\"Zona de pegado\",\"pasteMsg\":\"Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\\r\\nluego presione <STRONG>Aceptar</STRONG>.\",\"securityMsg\":\"Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\\r\\nEs necesario que lo pegue de nuevo en esta ventana.\",\"title\":\"Pegar\"},\"button\":{\"selectedLabel\":\"%1 (Seleccionado)\"},\"colorbutton\":{\"auto\":\"Automático\",\"bgColorTitle\":\"Color de Fondo\",\"colors\":{\"000\":\"Negro\",\"800000\":\"Marrón oscuro\",\"8B4513\":\"Marrón tierra\",\"2F4F4F\":\"Pizarra Oscuro\",\"008080\":\"Azul verdoso\",\"000080\":\"Azul marino\",\"4B0082\":\"Añil\",\"696969\":\"Gris oscuro\",\"B22222\":\"Ladrillo\",\"A52A2A\":\"Marrón\",\"DAA520\":\"Oro oscuro\",\"006400\":\"Verde oscuro\",\"40E0D0\":\"Turquesa\",\"0000CD\":\"Azul medio-oscuro\",\"800080\":\"Púrpura\",\"808080\":\"Gris\",\"F00\":\"Rojo\",\"FF8C00\":\"Naranja oscuro\",\"FFD700\":\"Oro\",\"008000\":\"Verde\",\"0FF\":\"Cian\",\"00F\":\"Azul\",\"EE82EE\":\"Violeta\",\"A9A9A9\":\"Gris medio\",\"FFA07A\":\"Salmón claro\",\"FFA500\":\"Naranja\",\"FFFF00\":\"Amarillo\",\"00FF00\":\"Lima\",\"AFEEEE\":\"Turquesa claro\",\"ADD8E6\":\"Azul claro\",\"DDA0DD\":\"Violeta claro\",\"D3D3D3\":\"Gris claro\",\"FFF0F5\":\"Lavanda rojizo\",\"FAEBD7\":\"Blanco antiguo\",\"FFFFE0\":\"Amarillo claro\",\"F0FFF0\":\"Miel\",\"F0FFFF\":\"Azul celeste\",\"F0F8FF\":\"Azul pálido\",\"E6E6FA\":\"Lavanda\",\"FFF\":\"Blanco\"},\"more\":\"Más Colores...\",\"panelTitle\":\"Colores\",\"textColorTitle\":\"Color de Texto\"},\"colordialog\":{\"clear\":\"Borrar\",\"highlight\":\"Muestra\",\"options\":\"Opciones de colores\",\"selected\":\"Elegido\",\"title\":\"Elegir color\"},\"templates\":{\"button\":\"Plantillas\",\"emptyListMsg\":\"(No hay plantillas definidas)\",\"insertOption\":\"Reemplazar el contenido actual\",\"options\":\"Opciones de plantillas\",\"selectPromptMsg\":\"Por favor selecciona la plantilla a abrir en el editor<br>(el contenido actual se perderá):\",\"title\":\"Contenido de Plantillas\"},\"contextmenu\":{\"options\":\"Opciones del menú contextual\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Título\",\"cssClassInputLabel\":\"Clase de hoja de estilos\",\"edit\":\"Editar Div\",\"inlineStyleInputLabel\":\"Estilo\",\"langDirLTRLabel\":\"Izquierda a Derecha (LTR)\",\"langDirLabel\":\"Orientación\",\"langDirRTLLabel\":\"Derecha a Izquierda (RTL)\",\"languageCodeInputLabel\":\" Codigo de idioma\",\"remove\":\"Quitar Div\",\"styleSelectLabel\":\"Estilo\",\"title\":\"Crear contenedor DIV\",\"toolbar\":\"Crear contenedor DIV\"},\"toolbar\":{\"toolbarCollapse\":\"Contraer barra de herramientas\",\"toolbarExpand\":\"Expandir barra de herramientas\",\"toolbarGroups\":{\"document\":\"Documento\",\"clipboard\":\"Portapapeles/Deshacer\",\"editing\":\"Edición\",\"forms\":\"Formularios\",\"basicstyles\":\"Estilos básicos\",\"paragraph\":\"Párrafo\",\"links\":\"Enlaces\",\"insert\":\"Insertar\",\"styles\":\"Estilos\",\"colors\":\"Colores\",\"tools\":\"Herramientas\"},\"toolbars\":\"Barras de herramientas del editor\"},\"elementspath\":{\"eleLabel\":\"Ruta de los elementos\",\"eleTitle\":\"%1 elemento\"},\"find\":{\"find\":\"Buscar\",\"findOptions\":\"Opciones de búsqueda\",\"findWhat\":\"Texto a buscar:\",\"matchCase\":\"Coincidir may/min\",\"matchCyclic\":\"Buscar en todo el contenido\",\"matchWord\":\"Coincidir toda la palabra\",\"notFoundMsg\":\"El texto especificado no ha sido encontrado.\",\"replace\":\"Reemplazar\",\"replaceAll\":\"Reemplazar Todo\",\"replaceSuccessMsg\":\"La expresión buscada ha sido reemplazada %1 veces.\",\"replaceWith\":\"Reemplazar con:\",\"title\":\"Buscar y Reemplazar\"},\"fakeobjects\":{\"anchor\":\"Ancla\",\"flash\":\"Animación flash\",\"hiddenfield\":\"Campo oculto\",\"iframe\":\"IFrame\",\"unknown\":\"Objeto desconocido\"},\"flash\":{\"access\":\"Acceso de scripts\",\"accessAlways\":\"Siempre\",\"accessNever\":\"Nunca\",\"accessSameDomain\":\"Mismo dominio\",\"alignAbsBottom\":\"Abs inferior\",\"alignAbsMiddle\":\"Abs centro\",\"alignBaseline\":\"Línea de base\",\"alignTextTop\":\"Tope del texto\",\"bgcolor\":\"Color de Fondo\",\"chkFull\":\"Permitir pantalla completa\",\"chkLoop\":\"Repetir\",\"chkMenu\":\"Activar Menú Flash\",\"chkPlay\":\"Autoejecución\",\"flashvars\":\"Opciones\",\"hSpace\":\"Esp.Horiz\",\"properties\":\"Propiedades de Flash\",\"propertiesTab\":\"Propiedades\",\"quality\":\"Calidad\",\"qualityAutoHigh\":\"Auto Alta\",\"qualityAutoLow\":\"Auto Baja\",\"qualityBest\":\"La mejor\",\"qualityHigh\":\"Alta\",\"qualityLow\":\"Baja\",\"qualityMedium\":\"Media\",\"scale\":\"Escala\",\"scaleAll\":\"Mostrar todo\",\"scaleFit\":\"Ajustado\",\"scaleNoBorder\":\"Sin Borde\",\"title\":\"Propiedades de Flash\",\"vSpace\":\"Esp.Vert\",\"validateHSpace\":\"Esp.Horiz debe ser un número.\",\"validateSrc\":\"Por favor escriba el vínculo URL\",\"validateVSpace\":\"Esp.Vert debe ser un número.\",\"windowMode\":\"WindowMode\",\"windowModeOpaque\":\"Opaco\",\"windowModeTransparent\":\"Transparente\",\"windowModeWindow\":\"Ventana\"},\"font\":{\"fontSize\":{\"label\":\"Tamaño\",\"voiceLabel\":\"Tamaño de fuente\",\"panelTitle\":\"Tamaño\"},\"label\":\"Fuente\",\"panelTitle\":\"Fuente\",\"voiceLabel\":\"Fuente\"},\"forms\":{\"button\":{\"title\":\"Propiedades de Botón\",\"text\":\"Texto (Valor)\",\"type\":\"Tipo\",\"typeBtn\":\"Boton\",\"typeSbm\":\"Enviar\",\"typeRst\":\"Reestablecer\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Propiedades de Casilla\",\"radioTitle\":\"Propiedades de Botón de Radio\",\"value\":\"Valor\",\"selected\":\"Seleccionado\",\"required\":\"Required\"},\"form\":{\"title\":\"Propiedades de Formulario\",\"menu\":\"Propiedades de Formulario\",\"action\":\"Acción\",\"method\":\"Método\",\"encoding\":\"Codificación\"},\"hidden\":{\"title\":\"Propiedades de Campo Oculto\",\"name\":\"Nombre\",\"value\":\"Valor\"},\"select\":{\"title\":\"Propiedades de Campo de Selección\",\"selectInfo\":\"Información\",\"opAvail\":\"Opciones disponibles\",\"value\":\"Valor\",\"size\":\"Tamaño\",\"lines\":\"Lineas\",\"chkMulti\":\"Permitir múltiple selección\",\"required\":\"Required\",\"opText\":\"Texto\",\"opValue\":\"Valor\",\"btnAdd\":\"Agregar\",\"btnModify\":\"Modificar\",\"btnUp\":\"Subir\",\"btnDown\":\"Bajar\",\"btnSetValue\":\"Establecer como predeterminado\",\"btnDelete\":\"Eliminar\"},\"textarea\":{\"title\":\"Propiedades de Area de Texto\",\"cols\":\"Columnas\",\"rows\":\"Filas\"},\"textfield\":{\"title\":\"Propiedades de Campo de Texto\",\"name\":\"Nombre\",\"value\":\"Valor\",\"charWidth\":\"Caracteres de ancho\",\"maxChars\":\"Máximo caracteres\",\"required\":\"Required\",\"type\":\"Tipo\",\"typeText\":\"Texto\",\"typePass\":\"Contraseña\",\"typeEmail\":\"Correo electrónico\",\"typeSearch\":\"Buscar\",\"typeTel\":\"Número de teléfono\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formato\",\"panelTitle\":\"Formato\",\"tag_address\":\"Dirección\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Encabezado 1\",\"tag_h2\":\"Encabezado 2\",\"tag_h3\":\"Encabezado 3\",\"tag_h4\":\"Encabezado 4\",\"tag_h5\":\"Encabezado 5\",\"tag_h6\":\"Encabezado 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Con formato\"},\"horizontalrule\":{\"toolbar\":\"Insertar Línea Horizontal\"},\"iframe\":{\"border\":\"Mostrar borde del marco\",\"noUrl\":\"Por favor, escriba la dirección del iframe\",\"scrolling\":\"Activar barras de desplazamiento\",\"title\":\"Propiedades de iframe\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Texto Alternativo\",\"border\":\"Borde\",\"btnUpload\":\"Enviar al Servidor\",\"button2Img\":\"¿Desea convertir el botón de imagen en una simple imagen?\",\"hSpace\":\"Esp.Horiz\",\"img2Button\":\"¿Desea convertir la imagen en un botón de imagen?\",\"infoTab\":\"Información de Imagen\",\"linkTab\":\"Vínculo\",\"lockRatio\":\"Proporcional\",\"menu\":\"Propiedades de Imagen\",\"resetSize\":\"Tamaño Original\",\"title\":\"Propiedades de Imagen\",\"titleButton\":\"Propiedades de Botón de Imagen\",\"upload\":\"Cargar\",\"urlMissing\":\"Debe indicar la URL de la imagen.\",\"vSpace\":\"Esp.Vert\",\"validateBorder\":\"El borde debe ser un número.\",\"validateHSpace\":\"El espaciado horizontal debe ser un número.\",\"validateVSpace\":\"El espaciado vertical debe ser un número.\"},\"indent\":{\"indent\":\"Aumentar Sangría\",\"outdent\":\"Disminuir Sangría\"},\"smiley\":{\"options\":\"Opciones de emoticonos\",\"title\":\"Insertar un Emoticon\",\"toolbar\":\"Emoticonos\"},\"justify\":{\"block\":\"Justificado\",\"center\":\"Centrar\",\"left\":\"Alinear a Izquierda\",\"right\":\"Alinear a Derecha\"},\"language\":{\"button\":\"Fijar lenguaje\",\"remove\":\"Quitar lenguaje\"},\"link\":{\"acccessKey\":\"Tecla de Acceso\",\"advanced\":\"Avanzado\",\"advisoryContentType\":\"Tipo de Contenido\",\"advisoryTitle\":\"Título\",\"anchor\":{\"toolbar\":\"Referencia\",\"menu\":\"Propiedades de Referencia\",\"title\":\"Propiedades de Referencia\",\"name\":\"Nombre de la Referencia\",\"errorName\":\"Por favor, complete el nombre de la Referencia\",\"remove\":\"Quitar Referencia\"},\"anchorId\":\"Por ID de elemento\",\"anchorName\":\"Por Nombre de Referencia\",\"charset\":\"Fuente de caracteres vinculado\",\"cssClasses\":\"Clases de hojas de estilo\",\"emailAddress\":\"Dirección de E-Mail\",\"emailBody\":\"Cuerpo del Mensaje\",\"emailSubject\":\"Título del Mensaje\",\"id\":\"Id\",\"info\":\"Información de Vínculo\",\"langCode\":\"Código idioma\",\"langDir\":\"Orientación\",\"langDirLTR\":\"Izquierda a Derecha (LTR)\",\"langDirRTL\":\"Derecha a Izquierda (RTL)\",\"menu\":\"Editar Vínculo\",\"name\":\"Nombre\",\"noAnchors\":\"(No hay referencias disponibles en el documento)\",\"noEmail\":\"Por favor escriba la dirección de e-mail\",\"noUrl\":\"Por favor escriba el vínculo URL\",\"other\":\"<otro>\",\"popupDependent\":\"Dependiente (Netscape)\",\"popupFeatures\":\"Características de Ventana Emergente\",\"popupFullScreen\":\"Pantalla Completa (IE)\",\"popupLeft\":\"Posición Izquierda\",\"popupLocationBar\":\"Barra de ubicación\",\"popupMenuBar\":\"Barra de Menú\",\"popupResizable\":\"Redimensionable\",\"popupScrollBars\":\"Barras de desplazamiento\",\"popupStatusBar\":\"Barra de Estado\",\"popupToolbar\":\"Barra de Herramientas\",\"popupTop\":\"Posición Derecha\",\"rel\":\"Relación\",\"selectAnchor\":\"Seleccionar una referencia\",\"styles\":\"Estilo\",\"tabIndex\":\"Indice de tabulación\",\"target\":\"Destino\",\"targetFrame\":\"<marco>\",\"targetFrameName\":\"Nombre del Marco Destino\",\"targetPopup\":\"<ventana emergente>\",\"targetPopupName\":\"Nombre de Ventana Emergente\",\"title\":\"Vínculo\",\"toAnchor\":\"Referencia en esta página\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Insertar/Editar Vínculo\",\"type\":\"Tipo de vínculo\",\"unlink\":\"Eliminar Vínculo\",\"upload\":\"Cargar\"},\"list\":{\"bulletedlist\":\"Viñetas\",\"numberedlist\":\"Numeración\"},\"liststyle\":{\"armenian\":\"Numeración armenia\",\"bulletedTitle\":\"Propiedades de viñetas\",\"circle\":\"Círculo\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal con cero inicial (01, 02, 03, etc.)\",\"disc\":\"Disco\",\"georgian\":\"Numeración georgiana (an, ban, gan, etc.)\",\"lowerAlpha\":\"Alfabeto en minúsculas (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Letras griegas (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Números romanos en minúsculas (i, ii, iii, iv, v, etc.)\",\"none\":\"Ninguno\",\"notset\":\"<sin establecer>\",\"numberedTitle\":\"Propiedades de lista numerada\",\"square\":\"Cuadrado\",\"start\":\"Inicio\",\"type\":\"Tipo\",\"upperAlpha\":\"Alfabeto en mayúsculas  (A, B, C, D, E, etc.)\",\"upperRoman\":\"Números romanos en mayúsculas (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"El Inicio debe ser un número entero.\"},\"magicline\":{\"title\":\"Insertar párrafo aquí\"},\"maximize\":{\"maximize\":\"Maximizar\",\"minimize\":\"Minimizar\"},\"newpage\":{\"toolbar\":\"Nueva Página\"},\"pagebreak\":{\"alt\":\"Salto de página\",\"toolbar\":\"Insertar Salto de Página\"},\"pastetext\":{\"button\":\"Pegar como Texto Plano\",\"title\":\"Pegar como Texto Plano\"},\"pastefromword\":{\"confirmCleanup\":\"El texto que desea parece provenir de Word.\\r\\n¿Desea depurarlo antes de pegarlo?\",\"error\":\"No ha sido posible limpiar los datos debido a un error interno\",\"title\":\"Pegar desde Word\",\"toolbar\":\"Pegar desde Word\"},\"preview\":{\"preview\":\"Vista Previa\"},\"print\":{\"toolbar\":\"Imprimir\"},\"removeformat\":{\"toolbar\":\"Eliminar Formato\"},\"save\":{\"toolbar\":\"Guardar\"},\"selectall\":{\"toolbar\":\"Seleccionar Todo\"},\"showblocks\":{\"toolbar\":\"Mostrar bloques\"},\"sourcearea\":{\"toolbar\":\"Fuente HTML\"},\"specialchar\":{\"options\":\"Opciones de caracteres especiales\",\"title\":\"Seleccione un caracter especial\",\"toolbar\":\"Insertar Caracter Especial\"},\"scayt\":{\"btn_about\":\"Acerca de Corrector\",\"btn_dictionaries\":\"Diccionarios\",\"btn_disable\":\"Desactivar Corrector\",\"btn_enable\":\"Activar Corrector\",\"btn_langs\":\"Idiomas\",\"btn_options\":\"Opciones\",\"text_title\":\"Comprobar Ortografía Mientras Escribe\"},\"stylescombo\":{\"label\":\"Estilo\",\"panelTitle\":\"Estilos para formatear\",\"panelTitle1\":\"Estilos de párrafo\",\"panelTitle2\":\"Estilos de carácter\",\"panelTitle3\":\"Estilos de objeto\"},\"table\":{\"border\":\"Tamaño de Borde\",\"caption\":\"Título\",\"cell\":{\"menu\":\"Celda\",\"insertBefore\":\"Insertar celda a la izquierda\",\"insertAfter\":\"Insertar celda a la derecha\",\"deleteCell\":\"Eliminar Celdas\",\"merge\":\"Combinar Celdas\",\"mergeRight\":\"Combinar a la derecha\",\"mergeDown\":\"Combinar hacia abajo\",\"splitHorizontal\":\"Dividir la celda horizontalmente\",\"splitVertical\":\"Dividir la celda verticalmente\",\"title\":\"Propiedades de celda\",\"cellType\":\"Tipo de Celda\",\"rowSpan\":\"Expandir filas\",\"colSpan\":\"Expandir columnas\",\"wordWrap\":\"Ajustar al contenido\",\"hAlign\":\"Alineación Horizontal\",\"vAlign\":\"Alineación Vertical\",\"alignBaseline\":\"Linea de base\",\"bgColor\":\"Color de fondo\",\"borderColor\":\"Color de borde\",\"data\":\"Datos\",\"header\":\"Encabezado\",\"yes\":\"Sí\",\"no\":\"No\",\"invalidWidth\":\"La anchura de celda debe ser un número.\",\"invalidHeight\":\"La altura de celda debe ser un número.\",\"invalidRowSpan\":\"La expansión de filas debe ser un número entero.\",\"invalidColSpan\":\"La expansión de columnas debe ser un número entero.\",\"chooseColor\":\"Elegir\"},\"cellPad\":\"Esp. interior\",\"cellSpace\":\"Esp. e/celdas\",\"column\":{\"menu\":\"Columna\",\"insertBefore\":\"Insertar columna a la izquierda\",\"insertAfter\":\"Insertar columna a la derecha\",\"deleteColumn\":\"Eliminar Columnas\"},\"columns\":\"Columnas\",\"deleteTable\":\"Eliminar Tabla\",\"headers\":\"Encabezados\",\"headersBoth\":\"Ambas\",\"headersColumn\":\"Primera columna\",\"headersNone\":\"Ninguno\",\"headersRow\":\"Primera fila\",\"invalidBorder\":\"El tamaño del borde debe ser un número.\",\"invalidCellPadding\":\"El espaciado interior debe ser un número.\",\"invalidCellSpacing\":\"El espaciado entre celdas debe ser un número.\",\"invalidCols\":\"El número de columnas debe ser un número mayor que 0.\",\"invalidHeight\":\"La altura de tabla debe ser un número.\",\"invalidRows\":\"El número de filas debe ser un número mayor que 0.\",\"invalidWidth\":\"La anchura de tabla debe ser un número.\",\"menu\":\"Propiedades de Tabla\",\"row\":{\"menu\":\"Fila\",\"insertBefore\":\"Insertar fila en la parte superior\",\"insertAfter\":\"Insertar fila en la parte inferior\",\"deleteRow\":\"Eliminar Filas\"},\"rows\":\"Filas\",\"summary\":\"Síntesis\",\"title\":\"Propiedades de Tabla\",\"toolbar\":\"Tabla\",\"widthPc\":\"porcentaje\",\"widthPx\":\"pixeles\",\"widthUnit\":\"unidad de la anchura\"},\"undo\":{\"redo\":\"Rehacer\",\"undo\":\"Deshacer\"},\"wsc\":{\"btnIgnore\":\"Ignorar\",\"btnIgnoreAll\":\"Ignorar Todo\",\"btnReplace\":\"Reemplazar\",\"btnReplaceAll\":\"Reemplazar Todo\",\"btnUndo\":\"Deshacer\",\"changeTo\":\"Cambiar a\",\"errorLoading\":\"Error cargando la aplicación del servidor: %s.\",\"ieSpellDownload\":\"Módulo de Control de Ortografía no instalado.\\r\\n¿Desea descargarlo ahora?\",\"manyChanges\":\"Control finalizado: se ha cambiado %1 palabras\",\"noChanges\":\"Control finalizado: no se ha cambiado ninguna palabra\",\"noMispell\":\"Control finalizado: no se encontraron errores\",\"noSuggestions\":\"- No hay sugerencias -\",\"notAvailable\":\"Lo sentimos pero el servicio no está disponible.\",\"notInDic\":\"No se encuentra en el Diccionario\",\"oneChange\":\"Control finalizado: se ha cambiado una palabra\",\"progress\":\"Control de Ortografía en progreso...\",\"title\":\"Comprobar ortografía\",\"toolbar\":\"Ortografía\"}};"
  },
  {
    "path": "assets/ckeditor/lang/et.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['et']={\"editor\":\"Rikkalik tekstiredaktor\",\"editorPanel\":\"Rikkaliku tekstiredaktori paneel\",\"common\":{\"editorHelp\":\"Abi saamiseks vajuta ALT 0\",\"browseServer\":\"Serveri sirvimine\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Laadi üles\",\"uploadSubmit\":\"Saada serverisse\",\"image\":\"Pilt\",\"flash\":\"Flash\",\"form\":\"Vorm\",\"checkbox\":\"Märkeruut\",\"radio\":\"Raadionupp\",\"textField\":\"Tekstilahter\",\"textarea\":\"Tekstiala\",\"hiddenField\":\"Varjatud lahter\",\"button\":\"Nupp\",\"select\":\"Valiklahter\",\"imageButton\":\"Piltnupp\",\"notSet\":\"<määramata>\",\"id\":\"ID\",\"name\":\"Nimi\",\"langDir\":\"Keele suund\",\"langDirLtr\":\"Vasakult paremale (LTR)\",\"langDirRtl\":\"Paremalt vasakule (RTL)\",\"langCode\":\"Keele kood\",\"longDescr\":\"Pikk kirjeldus URL\",\"cssClass\":\"Stiilistiku klassid\",\"advisoryTitle\":\"Soovituslik pealkiri\",\"cssStyle\":\"Laad\",\"ok\":\"Olgu\",\"cancel\":\"Loobu\",\"close\":\"Sulge\",\"preview\":\"Eelvaade\",\"resize\":\"Suuruse muutmiseks lohista\",\"generalTab\":\"Üldine\",\"advancedTab\":\"Täpsemalt\",\"validateNumberFailed\":\"See väärtus pole number.\",\"confirmNewPage\":\"Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?\",\"confirmCancel\":\"Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?\",\"options\":\"Valikud\",\"target\":\"Sihtkoht\",\"targetNew\":\"Uus aken (_blank)\",\"targetTop\":\"Kõige ülemine aken (_top)\",\"targetSelf\":\"Sama aken (_self)\",\"targetParent\":\"Vanemaken (_parent)\",\"langDirLTR\":\"Vasakult paremale (LTR)\",\"langDirRTL\":\"Paremalt vasakule (RTL)\",\"styles\":\"Stiili\",\"cssClasses\":\"Stiililehe klassid\",\"width\":\"Laius\",\"height\":\"Kõrgus\",\"align\":\"Joondus\",\"alignLeft\":\"Vasak\",\"alignRight\":\"Paremale\",\"alignCenter\":\"Kesk\",\"alignJustify\":\"Rööpjoondus\",\"alignTop\":\"Üles\",\"alignMiddle\":\"Keskele\",\"alignBottom\":\"Alla\",\"alignNone\":\"None\",\"invalidValue\":\"Vigane väärtus.\",\"invalidHeight\":\"Kõrgus peab olema number.\",\"invalidWidth\":\"Laius peab olema number.\",\"invalidCssLength\":\"\\\"%1\\\" välja jaoks määratud väärtus peab olema positiivne täisarv CSS ühikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.\",\"invalidHtmlLength\":\"\\\"%1\\\" välja jaoks määratud väärtus peab olema positiivne täisarv HTML ühikuga (px või %) või ilma.\",\"invalidInlineStyle\":\"Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: \\\"nimi : väärtus\\\".\",\"cssLengthTooltip\":\"Sisesta väärtus pikslites või number koos sobiva CSS-i ühikuga (px, %, in, cm, mm, em, ex, pt või pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, pole saadaval</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Kõik õigused kaitstud.\",\"dlgTitle\":\"CKEditorist\",\"help\":\"Abi jaoks vaata $1.\",\"moreInfo\":\"Litsentsi andmed leiab meie veebilehelt:\",\"title\":\"CKEditorist\",\"userGuide\":\"CKEditori kasutusjuhendit\"},\"basicstyles\":{\"bold\":\"Paks\",\"italic\":\"Kursiiv\",\"strike\":\"Läbijoonitud\",\"subscript\":\"Allindeks\",\"superscript\":\"Ülaindeks\",\"underline\":\"Allajoonitud\"},\"bidi\":{\"ltr\":\"Teksti suund vasakult paremale\",\"rtl\":\"Teksti suund paremalt vasakule\"},\"blockquote\":{\"toolbar\":\"Blokktsitaat\"},\"clipboard\":{\"copy\":\"Kopeeri\",\"copyError\":\"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).\",\"cut\":\"Lõika\",\"cutError\":\"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).\",\"paste\":\"Aseta\",\"pasteArea\":\"Asetamise ala\",\"pasteMsg\":\"Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.\",\"securityMsg\":\"Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.\",\"title\":\"Asetamine\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automaatne\",\"bgColorTitle\":\"Tausta värv\",\"colors\":{\"000\":\"Must\",\"800000\":\"Kastanpruun\",\"8B4513\":\"Sadulapruun\",\"2F4F4F\":\"Tume paehall\",\"008080\":\"Sinakasroheline\",\"000080\":\"Meresinine\",\"4B0082\":\"Indigosinine\",\"696969\":\"Tumehall\",\"B22222\":\"Šamottkivi\",\"A52A2A\":\"Pruun\",\"DAA520\":\"Kuldkollane\",\"006400\":\"Tumeroheline\",\"40E0D0\":\"Türkiissinine\",\"0000CD\":\"Keskmine sinine\",\"800080\":\"Lilla\",\"808080\":\"Hall\",\"F00\":\"Punanae\",\"FF8C00\":\"Tumeoranž\",\"FFD700\":\"Kuldne\",\"008000\":\"Roheline\",\"0FF\":\"Tsüaniidsinine\",\"00F\":\"Sinine\",\"EE82EE\":\"Violetne\",\"A9A9A9\":\"Tuhm hall\",\"FFA07A\":\"Hele lõhe\",\"FFA500\":\"Oranž\",\"FFFF00\":\"Kollane\",\"00FF00\":\"Lubja hall\",\"AFEEEE\":\"Kahvatu türkiis\",\"ADD8E6\":\"Helesinine\",\"DDA0DD\":\"Ploomililla\",\"D3D3D3\":\"Helehall\",\"FFF0F5\":\"Lavendlipunane\",\"FAEBD7\":\"Antiikvalge\",\"FFFFE0\":\"Helekollane\",\"F0FFF0\":\"Meloniroheline\",\"F0FFFF\":\"Taevasinine\",\"F0F8FF\":\"Beebisinine\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Valge\"},\"more\":\"Rohkem värve...\",\"panelTitle\":\"Värvid\",\"textColorTitle\":\"Teksti värv\"},\"colordialog\":{\"clear\":\"Eemalda\",\"highlight\":\"Näidis\",\"options\":\"Värvi valikud\",\"selected\":\"Valitud värv\",\"title\":\"Värvi valimine\"},\"templates\":{\"button\":\"Mall\",\"emptyListMsg\":\"(Ühtegi malli ei ole defineeritud)\",\"insertOption\":\"Praegune sisu asendatakse\",\"options\":\"Malli valikud\",\"selectPromptMsg\":\"Palun vali mall, mis avada redaktoris<br />(praegune sisu läheb kaotsi):\",\"title\":\"Sisumallid\"},\"contextmenu\":{\"options\":\"Kontekstimenüü valikud\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"Soovitatav pealkiri\",\"cssClassInputLabel\":\"Stiililehe klassid\",\"edit\":\"Muuda Div\",\"inlineStyleInputLabel\":\"Reasisene stiil\",\"langDirLTRLabel\":\"Vasakult paremale (LTR)\",\"langDirLabel\":\"Keele suund\",\"langDirRTLLabel\":\"Paremalt vasakule (RTL)\",\"languageCodeInputLabel\":\" Keelekood\",\"remove\":\"Eemalda Div\",\"styleSelectLabel\":\"Stiil\",\"title\":\"Div-konteineri loomine\",\"toolbar\":\"Div-konteineri loomine\"},\"toolbar\":{\"toolbarCollapse\":\"Tööriistariba peitmine\",\"toolbarExpand\":\"Tööriistariba näitamine\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Lõikelaud/tagasivõtmine\",\"editing\":\"Muutmine\",\"forms\":\"Vormid\",\"basicstyles\":\"Põhistiilid\",\"paragraph\":\"Lõik\",\"links\":\"Lingid\",\"insert\":\"Sisesta\",\"styles\":\"Stiilid\",\"colors\":\"Värvid\",\"tools\":\"Tööriistad\"},\"toolbars\":\"Redaktori tööriistaribad\"},\"elementspath\":{\"eleLabel\":\"Elementide asukoht\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Otsi\",\"findOptions\":\"Otsingu valikud\",\"findWhat\":\"Otsitav:\",\"matchCase\":\"Suur- ja väiketähtede eristamine\",\"matchCyclic\":\"Jätkatakse algusest\",\"matchWord\":\"Ainult terved sõnad\",\"notFoundMsg\":\"Otsitud teksti ei leitud.\",\"replace\":\"Asenda\",\"replaceAll\":\"Asenda kõik\",\"replaceSuccessMsg\":\"%1 vastet asendati.\",\"replaceWith\":\"Asendus:\",\"title\":\"Otsimine ja asendamine\"},\"fakeobjects\":{\"anchor\":\"Ankur\",\"flash\":\"Flashi animatsioon\",\"hiddenfield\":\"Varjatud väli\",\"iframe\":\"IFrame\",\"unknown\":\"Tundmatu objekt\"},\"flash\":{\"access\":\"Skriptide ligipääs\",\"accessAlways\":\"Kõigile\",\"accessNever\":\"Mitte ühelegi\",\"accessSameDomain\":\"Samalt domeenilt\",\"alignAbsBottom\":\"Abs alla\",\"alignAbsMiddle\":\"Abs keskele\",\"alignBaseline\":\"Baasjoonele\",\"alignTextTop\":\"Tekstist üles\",\"bgcolor\":\"Tausta värv\",\"chkFull\":\"Täisekraan lubatud\",\"chkLoop\":\"Korduv\",\"chkMenu\":\"Flashi menüü lubatud\",\"chkPlay\":\"Automaatne start \",\"flashvars\":\"Flashi muutujad\",\"hSpace\":\"H. vaheruum\",\"properties\":\"Flashi omadused\",\"propertiesTab\":\"Omadused\",\"quality\":\"Kvaliteet\",\"qualityAutoHigh\":\"Automaatne kõrge\",\"qualityAutoLow\":\"Automaatne madal\",\"qualityBest\":\"Parim\",\"qualityHigh\":\"Kõrge\",\"qualityLow\":\"Madal\",\"qualityMedium\":\"Keskmine\",\"scale\":\"Mastaap\",\"scaleAll\":\"Näidatakse kõike\",\"scaleFit\":\"Täpne sobivus\",\"scaleNoBorder\":\"Äärist ei ole\",\"title\":\"Flashi omadused\",\"vSpace\":\"V. vaheruum\",\"validateHSpace\":\"H. vaheruum peab olema number.\",\"validateSrc\":\"Palun kirjuta lingi URL\",\"validateVSpace\":\"V. vaheruum peab olema number.\",\"windowMode\":\"Akna režiim\",\"windowModeOpaque\":\"Läbipaistmatu\",\"windowModeTransparent\":\"Läbipaistev\",\"windowModeWindow\":\"Aken\"},\"font\":{\"fontSize\":{\"label\":\"Suurus\",\"voiceLabel\":\"Kirja suurus\",\"panelTitle\":\"Suurus\"},\"label\":\"Kiri\",\"panelTitle\":\"Kiri\",\"voiceLabel\":\"Kiri\"},\"forms\":{\"button\":{\"title\":\"Nupu omadused\",\"text\":\"Tekst (väärtus)\",\"type\":\"Liik\",\"typeBtn\":\"Nupp\",\"typeSbm\":\"Saada\",\"typeRst\":\"Lähtesta\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Märkeruudu omadused\",\"radioTitle\":\"Raadionupu omadused\",\"value\":\"Väärtus\",\"selected\":\"Märgitud\",\"required\":\"Required\"},\"form\":{\"title\":\"Vormi omadused\",\"menu\":\"Vormi omadused\",\"action\":\"Toiming\",\"method\":\"Meetod\",\"encoding\":\"Kodeering\"},\"hidden\":{\"title\":\"Varjatud lahtri omadused\",\"name\":\"Nimi\",\"value\":\"Väärtus\"},\"select\":{\"title\":\"Valiklahtri omadused\",\"selectInfo\":\"Info\",\"opAvail\":\"Võimalikud valikud:\",\"value\":\"Väärtus\",\"size\":\"Suurus\",\"lines\":\"ridu\",\"chkMulti\":\"Võimalik mitu valikut\",\"required\":\"Required\",\"opText\":\"Tekst\",\"opValue\":\"Väärtus\",\"btnAdd\":\"Lisa\",\"btnModify\":\"Muuda\",\"btnUp\":\"Üles\",\"btnDown\":\"Alla\",\"btnSetValue\":\"Määra vaikimisi\",\"btnDelete\":\"Kustuta\"},\"textarea\":{\"title\":\"Tekstiala omadused\",\"cols\":\"Veerge\",\"rows\":\"Ridu\"},\"textfield\":{\"title\":\"Tekstilahtri omadused\",\"name\":\"Nimi\",\"value\":\"Väärtus\",\"charWidth\":\"Laius (tähemärkides)\",\"maxChars\":\"Maksimaalselt tähemärke\",\"required\":\"Required\",\"type\":\"Liik\",\"typeText\":\"Tekst\",\"typePass\":\"Parool\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Otsi\",\"typeTel\":\"Telefon\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Vorming\",\"panelTitle\":\"Vorming\",\"tag_address\":\"Aadress\",\"tag_div\":\"Tavaline (DIV)\",\"tag_h1\":\"Pealkiri 1\",\"tag_h2\":\"Pealkiri 2\",\"tag_h3\":\"Pealkiri 3\",\"tag_h4\":\"Pealkiri 4\",\"tag_h5\":\"Pealkiri 5\",\"tag_h6\":\"Pealkiri 6\",\"tag_p\":\"Tavaline\",\"tag_pre\":\"Vormindatud\"},\"horizontalrule\":{\"toolbar\":\"Horisontaaljoone sisestamine\"},\"iframe\":{\"border\":\"Raami äärise näitamine\",\"noUrl\":\"Vali iframe URLi liik\",\"scrolling\":\"Kerimisribade lubamine\",\"title\":\"IFrame omadused\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatiivne tekst\",\"border\":\"Joon\",\"btnUpload\":\"Saada serverisse\",\"button2Img\":\"Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?\",\"hSpace\":\"H. vaheruum\",\"img2Button\":\"Kas tahad teisendada valitud tavalise pildi pildiga nupuks?\",\"infoTab\":\"Pildi info\",\"linkTab\":\"Link\",\"lockRatio\":\"Lukusta kuvasuhe\",\"menu\":\"Pildi omadused\",\"resetSize\":\"Lähtesta suurus\",\"title\":\"Pildi omadused\",\"titleButton\":\"Piltnupu omadused\",\"upload\":\"Lae üles\",\"urlMissing\":\"Pildi lähte-URL on puudu.\",\"vSpace\":\"V. vaheruum\",\"validateBorder\":\"Äärise laius peab olema täisarv.\",\"validateHSpace\":\"Horisontaalne vaheruum peab olema täisarv.\",\"validateVSpace\":\"Vertikaalne vaheruum peab olema täisarv.\"},\"indent\":{\"indent\":\"Taande suurendamine\",\"outdent\":\"Taande vähendamine\"},\"smiley\":{\"options\":\"Emotikonide valikud\",\"title\":\"Sisesta emotikon\",\"toolbar\":\"Emotikon\"},\"justify\":{\"block\":\"Rööpjoondus\",\"center\":\"Keskjoondus\",\"left\":\"Vasakjoondus\",\"right\":\"Paremjoondus\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Juurdepääsu võti\",\"advanced\":\"Täpsemalt\",\"advisoryContentType\":\"Juhendava sisu tüüp\",\"advisoryTitle\":\"Juhendav tiitel\",\"anchor\":{\"toolbar\":\"Ankru sisestamine/muutmine\",\"menu\":\"Ankru omadused\",\"title\":\"Ankru omadused\",\"name\":\"Ankru nimi\",\"errorName\":\"Palun sisesta ankru nimi\",\"remove\":\"Eemalda ankur\"},\"anchorId\":\"Elemendi id järgi\",\"anchorName\":\"Ankru nime järgi\",\"charset\":\"Lingitud ressursi märgistik\",\"cssClasses\":\"Stiilistiku klassid\",\"emailAddress\":\"E-posti aadress\",\"emailBody\":\"Sõnumi tekst\",\"emailSubject\":\"Sõnumi teema\",\"id\":\"ID\",\"info\":\"Lingi info\",\"langCode\":\"Keele suund\",\"langDir\":\"Keele suund\",\"langDirLTR\":\"Vasakult paremale (LTR)\",\"langDirRTL\":\"Paremalt vasakule (RTL)\",\"menu\":\"Muuda linki\",\"name\":\"Nimi\",\"noAnchors\":\"(Selles dokumendis pole ankruid)\",\"noEmail\":\"Palun kirjuta e-posti aadress\",\"noUrl\":\"Palun kirjuta lingi URL\",\"other\":\"<muu>\",\"popupDependent\":\"Sõltuv (Netscape)\",\"popupFeatures\":\"Hüpikakna omadused\",\"popupFullScreen\":\"Täisekraan (IE)\",\"popupLeft\":\"Vasak asukoht\",\"popupLocationBar\":\"Aadressiriba\",\"popupMenuBar\":\"Menüüriba\",\"popupResizable\":\"Suurust saab muuta\",\"popupScrollBars\":\"Kerimisribad\",\"popupStatusBar\":\"Olekuriba\",\"popupToolbar\":\"Tööriistariba\",\"popupTop\":\"Ülemine asukoht\",\"rel\":\"Suhe\",\"selectAnchor\":\"Vali ankur\",\"styles\":\"Laad\",\"tabIndex\":\"Tab indeks\",\"target\":\"Sihtkoht\",\"targetFrame\":\"<raam>\",\"targetFrameName\":\"Sihtmärk raami nimi\",\"targetPopup\":\"<hüpikaken>\",\"targetPopupName\":\"Hüpikakna nimi\",\"title\":\"Link\",\"toAnchor\":\"Ankur sellel lehel\",\"toEmail\":\"E-post\",\"toUrl\":\"URL\",\"toolbar\":\"Lingi lisamine/muutmine\",\"type\":\"Lingi liik\",\"unlink\":\"Lingi eemaldamine\",\"upload\":\"Lae üles\"},\"list\":{\"bulletedlist\":\"Punktloend\",\"numberedlist\":\"Numberloend\"},\"liststyle\":{\"armenian\":\"Armeenia numbrid\",\"bulletedTitle\":\"Punktloendi omadused\",\"circle\":\"Ring\",\"decimal\":\"Numbrid (1, 2, 3, jne)\",\"decimalLeadingZero\":\"Numbrid algusnulliga (01, 02, 03, jne)\",\"disc\":\"Täpp\",\"georgian\":\"Gruusia numbrid (an, ban, gan, jne)\",\"lowerAlpha\":\"Väiketähed (a, b, c, d, e, jne)\",\"lowerGreek\":\"Kreeka väiketähed (alpha, beta, gamma, jne)\",\"lowerRoman\":\"Väiksed rooma numbrid (i, ii, iii, iv, v, jne)\",\"none\":\"Puudub\",\"notset\":\"<pole määratud>\",\"numberedTitle\":\"Numberloendi omadused\",\"square\":\"Ruut\",\"start\":\"Algus\",\"type\":\"Liik\",\"upperAlpha\":\"Suurtähed (A, B, C, D, E, jne)\",\"upperRoman\":\"Suured rooma numbrid (I, II, III, IV, V, jne)\",\"validateStartNumber\":\"Loendi algusnumber peab olema täisarv.\"},\"magicline\":{\"title\":\"Sisesta siia lõigu tekst\"},\"maximize\":{\"maximize\":\"Maksimeerimine\",\"minimize\":\"Minimeerimine\"},\"newpage\":{\"toolbar\":\"Uus leht\"},\"pagebreak\":{\"alt\":\"Lehevahetuskoht\",\"toolbar\":\"Lehevahetuskoha sisestamine\"},\"pastetext\":{\"button\":\"Asetamine tavalise tekstina\",\"title\":\"Asetamine tavalise tekstina\"},\"pastefromword\":{\"confirmCleanup\":\"Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?\",\"error\":\"Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik\",\"title\":\"Asetamine Wordist\",\"toolbar\":\"Asetamine Wordist\"},\"preview\":{\"preview\":\"Eelvaade\"},\"print\":{\"toolbar\":\"Printimine\"},\"removeformat\":{\"toolbar\":\"Vormingu eemaldamine\"},\"save\":{\"toolbar\":\"Salvestamine\"},\"selectall\":{\"toolbar\":\"Kõige valimine\"},\"showblocks\":{\"toolbar\":\"Blokkide näitamine\"},\"sourcearea\":{\"toolbar\":\"Lähtekood\"},\"specialchar\":{\"options\":\"Erimärkide valikud\",\"title\":\"Erimärgi valimine\",\"toolbar\":\"Erimärgi sisestamine\"},\"scayt\":{\"btn_about\":\"SCAYT-ist lähemalt\",\"btn_dictionaries\":\"Sõnaraamatud\",\"btn_disable\":\"SCAYT keelatud\",\"btn_enable\":\"SCAYT lubatud\",\"btn_langs\":\"Keeled\",\"btn_options\":\"Valikud\",\"text_title\":\"Õigekirjakontroll kirjutamise ajal\"},\"stylescombo\":{\"label\":\"Stiil\",\"panelTitle\":\"Vormindusstiilid\",\"panelTitle1\":\"Blokkstiilid\",\"panelTitle2\":\"Reasisesed stiilid\",\"panelTitle3\":\"Objektistiilid\"},\"table\":{\"border\":\"Joone suurus\",\"caption\":\"Tabeli tiitel\",\"cell\":{\"menu\":\"Lahter\",\"insertBefore\":\"Sisesta lahter enne\",\"insertAfter\":\"Sisesta lahter peale\",\"deleteCell\":\"Eemalda lahtrid\",\"merge\":\"Ühenda lahtrid\",\"mergeRight\":\"Ühenda paremale\",\"mergeDown\":\"Ühenda alla\",\"splitHorizontal\":\"Poolita lahter horisontaalselt\",\"splitVertical\":\"Poolita lahter vertikaalselt\",\"title\":\"Lahtri omadused\",\"cellType\":\"Lahtri liik\",\"rowSpan\":\"Ridade vahe\",\"colSpan\":\"Tulpade vahe\",\"wordWrap\":\"Sõnade murdmine\",\"hAlign\":\"Horisontaalne joondus\",\"vAlign\":\"Vertikaalne joondus\",\"alignBaseline\":\"Baasjoon\",\"bgColor\":\"Tausta värv\",\"borderColor\":\"Äärise värv\",\"data\":\"Andmed\",\"header\":\"Päis\",\"yes\":\"Jah\",\"no\":\"Ei\",\"invalidWidth\":\"Lahtri laius peab olema number.\",\"invalidHeight\":\"Lahtri kõrgus peab olema number.\",\"invalidRowSpan\":\"Ridade vahe peab olema täisarv.\",\"invalidColSpan\":\"Tulpade vahe peab olema täisarv.\",\"chooseColor\":\"Vali\"},\"cellPad\":\"Lahtri täidis\",\"cellSpace\":\"Lahtri vahe\",\"column\":{\"menu\":\"Veerg\",\"insertBefore\":\"Sisesta veerg enne\",\"insertAfter\":\"Sisesta veerg peale\",\"deleteColumn\":\"Eemalda veerud\"},\"columns\":\"Veerud\",\"deleteTable\":\"Kustuta tabel\",\"headers\":\"Päised\",\"headersBoth\":\"Mõlemad\",\"headersColumn\":\"Esimene tulp\",\"headersNone\":\"Puudub\",\"headersRow\":\"Esimene rida\",\"invalidBorder\":\"Äärise suurus peab olema number.\",\"invalidCellPadding\":\"Lahtrite polsterdus (padding) peab olema positiivne arv.\",\"invalidCellSpacing\":\"Lahtrite vahe peab olema positiivne arv.\",\"invalidCols\":\"Tulpade arv peab olema nullist suurem.\",\"invalidHeight\":\"Tabeli kõrgus peab olema number.\",\"invalidRows\":\"Ridade arv peab olema nullist suurem.\",\"invalidWidth\":\"Tabeli laius peab olema number.\",\"menu\":\"Tabeli omadused\",\"row\":{\"menu\":\"Rida\",\"insertBefore\":\"Sisesta rida enne\",\"insertAfter\":\"Sisesta rida peale\",\"deleteRow\":\"Eemalda read\"},\"rows\":\"Read\",\"summary\":\"Kokkuvõte\",\"title\":\"Tabeli omadused\",\"toolbar\":\"Tabel\",\"widthPc\":\"protsenti\",\"widthPx\":\"pikslit\",\"widthUnit\":\"laiuse ühik\"},\"undo\":{\"redo\":\"Toimingu kordamine\",\"undo\":\"Tagasivõtmine\"},\"wsc\":{\"btnIgnore\":\"Ignoreeri\",\"btnIgnoreAll\":\"Ignoreeri kõiki\",\"btnReplace\":\"Asenda\",\"btnReplaceAll\":\"Asenda kõik\",\"btnUndo\":\"Võta tagasi\",\"changeTo\":\"Muuda\",\"errorLoading\":\"Viga rakenduse teenushosti laadimisel: %s.\",\"ieSpellDownload\":\"Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?\",\"manyChanges\":\"Õigekirja kontroll sooritatud: %1 sõna muudetud\",\"noChanges\":\"Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud\",\"noMispell\":\"Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud\",\"noSuggestions\":\"- Soovitused puuduvad -\",\"notAvailable\":\"Kahjuks ei ole teenus praegu saadaval.\",\"notInDic\":\"Puudub sõnastikust\",\"oneChange\":\"Õigekirja kontroll sooritatud: üks sõna muudeti\",\"progress\":\"Toimub õigekirja kontroll...\",\"title\":\"Õigekirjakontroll\",\"toolbar\":\"Õigekirjakontroll\"}};"
  },
  {
    "path": "assets/ckeditor/lang/eu.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['eu']={\"editor\":\"Testu aberastuaren editorea\",\"editorPanel\":\"Testu aberastuaren editorearen panela\",\"common\":{\"editorHelp\":\"Sakatu ALT 0 laguntza jasotzeko\",\"browseServer\":\"Arakatu zerbitzaria\",\"url\":\"URLa\",\"protocol\":\"Protokoloa\",\"upload\":\"Kargatu\",\"uploadSubmit\":\"Bidali zerbitzarira\",\"image\":\"Irudia\",\"flash\":\"Flash\",\"form\":\"Formularioa\",\"checkbox\":\"Kontrol-laukia\",\"radio\":\"Aukera-botoia\",\"textField\":\"Testu-eremua\",\"textarea\":\"Testu-area\",\"hiddenField\":\"Ezkutuko eremua\",\"button\":\"Botoia\",\"select\":\"Hautespen-eremua\",\"imageButton\":\"Irudi-botoia\",\"notSet\":\"<ezarri gabe>\",\"id\":\"Id\",\"name\":\"Izena\",\"langDir\":\"Hizkuntzaren norabidea\",\"langDirLtr\":\"Ezkerretik eskuinera (LTR)\",\"langDirRtl\":\"Eskuinetik ezkerrera (RTL)\",\"langCode\":\"Hizkuntzaren kodea\",\"longDescr\":\"URLaren deskribapen luzea\",\"cssClass\":\"Estilo-orriko klaseak\",\"advisoryTitle\":\"Aholkatutako izenburua\",\"cssStyle\":\"Estiloa\",\"ok\":\"Ados\",\"cancel\":\"Utzi\",\"close\":\"Itxi\",\"preview\":\"Aurrebista\",\"resize\":\"Aldatu tamainaz\",\"generalTab\":\"Orokorra\",\"advancedTab\":\"Aurreratua\",\"validateNumberFailed\":\"Balio hau ez da zenbaki bat.\",\"confirmNewPage\":\"Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?\",\"confirmCancel\":\"Aukera batzuk aldatu dituzu. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?\",\"options\":\"Aukerak\",\"target\":\"Helburua\",\"targetNew\":\"Leiho berria (_blank)\",\"targetTop\":\"Goieneko leihoan (_top)\",\"targetSelf\":\"Leiho berean (_self)\",\"targetParent\":\"Leiho gurasoan (_parent)\",\"langDirLTR\":\"Ezkerretik eskuinera (LTR)\",\"langDirRTL\":\"Eskuinetik ezkerrera (RTL)\",\"styles\":\"Estiloa\",\"cssClasses\":\"Estilo-orriko klaseak\",\"width\":\"Zabalera\",\"height\":\"Altuera\",\"align\":\"Lerrokatzea\",\"alignLeft\":\"Ezkerrean\",\"alignRight\":\"Eskuinean\",\"alignCenter\":\"Erdian\",\"alignJustify\":\"Justifikatu\",\"alignTop\":\"Goian\",\"alignMiddle\":\"Erdian\",\"alignBottom\":\"Behean\",\"alignNone\":\"Bat ere ez\",\"invalidValue\":\"Balio desegokia.\",\"invalidHeight\":\"Altuera zenbaki bat izan behar da.\",\"invalidWidth\":\"Zabalera zenbaki bat izan behar da.\",\"invalidCssLength\":\"\\\"%1\\\" eremurako zehaztutako balioak zenbaki positibo bat izan behar du, CSS neurri unitate batekin edo gabe (px, %, in, cm, mm, em, ex, pt edo pc).\",\"invalidHtmlLength\":\"\\\"%1\\\" eremurako zehaztutako balioak zenbaki positibo bat izan behar du, HTML neurri unitate batekin edo gabe (px edo %).\",\"invalidInlineStyle\":\"Lineako estiloan zehaztutako balioak \\\"izen : balio\\\" formatuko tupla bat edo gehiago izan behar dira, komaz bereiztuak.\",\"cssLengthTooltip\":\"Sartu zenbaki bat edo zenbaki bat baliozko CSS unitate batekin (px, %, in, cm, mm, em, ex, pt, edo pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, erabilezina</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Eskubide guztiak erreserbaturik.\",\"dlgTitle\":\"CKEditor-i buruz\",\"help\":\"Begiratu $1 laguntzarako.\",\"moreInfo\":\"Lizentziari buruzko informazioa gure webgunean:\",\"title\":\"CKEditor-i buruz\",\"userGuide\":\"CKEditor-en erabiltzaile-gida\"},\"basicstyles\":{\"bold\":\"Lodia\",\"italic\":\"Etzana\",\"strike\":\"Marratua\",\"subscript\":\"Azpi-indizea\",\"superscript\":\"Goi-indizea\",\"underline\":\"Azpimarratu\"},\"bidi\":{\"ltr\":\"Testuaren norantza ezkerretik eskuinera\",\"rtl\":\"Testuaren norantza eskuinetik ezkerrera\"},\"blockquote\":{\"toolbar\":\"Aipamen blokea\"},\"clipboard\":{\"copy\":\"Kopiatu\",\"copyError\":\"Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki kopiatzea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+C).\",\"cut\":\"Ebaki\",\"cutError\":\"Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki moztea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+X).\",\"paste\":\"Itsatsi\",\"pasteArea\":\"Itsasteko area\",\"pasteMsg\":\"Mesedez teklatua erabiliz (<strong>Ctrl/Cmd+V</strong>) ondorengo eremuan testua itsatsi eta sakatu <strong>Ados</strong>.\",\"securityMsg\":\"Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.\",\"title\":\"Itsatsi\"},\"button\":{\"selectedLabel\":\"%1 (hautatuta)\"},\"colorbutton\":{\"auto\":\"Automatikoa\",\"bgColorTitle\":\"Atzeko planoko kolorea\",\"colors\":{\"000\":\"Beltza\",\"800000\":\"Granatea\",\"8B4513\":\"Zela marroia\",\"2F4F4F\":\"Arbel gris iluna\",\"008080\":\"Urdin berdexka\",\"000080\":\"Urdin iluna\",\"4B0082\":\"Indigoa\",\"696969\":\"Gris iluna\",\"B22222\":\"Adreilu erregogorra\",\"A52A2A\":\"Marroia\",\"DAA520\":\"Urrezko makila\",\"006400\":\"Berde iluna\",\"40E0D0\":\"Turkesa\",\"0000CD\":\"Urdin ertaina\",\"800080\":\"Morea\",\"808080\":\"Grisa\",\"F00\":\"Gorria\",\"FF8C00\":\"Laranja iluna\",\"FFD700\":\"Urrea\",\"008000\":\"Berdea\",\"0FF\":\"Ziana\",\"00F\":\"Urdina\",\"EE82EE\":\"Bioleta\",\"A9A9A9\":\"Gris ahula\",\"FFA07A\":\"Izokin-kolore argia\",\"FFA500\":\"Laranja\",\"FFFF00\":\"Horia\",\"00FF00\":\"Lima\",\"AFEEEE\":\"Turkesa argia\",\"ADD8E6\":\"Urdin argia\",\"DDA0DD\":\"Aran-kolorea\",\"D3D3D3\":\"Gris argia\",\"FFF0F5\":\"Izpiliku-gorrixka\",\"FAEBD7\":\"Zuri zaharra\",\"FFFFE0\":\"Hori argia\",\"F0FFF0\":\"Ezti-ihintza\",\"F0FFFF\":\"Zeru-urdina\",\"F0F8FF\":\"Alizia urdina\",\"E6E6FA\":\"Izpilikua\",\"FFF\":\"Zuria\"},\"more\":\"Kolore gehiago...\",\"panelTitle\":\"Koloreak\",\"textColorTitle\":\"Testu-kolorea\"},\"colordialog\":{\"clear\":\"Garbitu\",\"highlight\":\"Nabarmendu\",\"options\":\"Kolore aukerak\",\"selected\":\"Hautatutako kolorea\",\"title\":\"Hautatu kolorea\"},\"templates\":{\"button\":\"Txantiloiak\",\"emptyListMsg\":\"(Ez dago txantiloirik definituta)\",\"insertOption\":\"Ordeztu uneko edukiak\",\"options\":\"Txantiloi aukerak\",\"selectPromptMsg\":\"Mesedez hautatu txantiloia editorean irekitzeko\",\"title\":\"Eduki txantiloiak\"},\"contextmenu\":{\"options\":\"Testuinguru-menuaren aukerak\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Aholkatutako izenburua\",\"cssClassInputLabel\":\"Estilo-orriko klaseak\",\"edit\":\"Editatu Div-a\",\"inlineStyleInputLabel\":\"Lineako estiloa\",\"langDirLTRLabel\":\"Ezkerretik eskuinera (LTR)\",\"langDirLabel\":\"Hizkuntzaren norabidea\",\"langDirRTLLabel\":\"Eskuinetik ezkerrera (RTL)\",\"languageCodeInputLabel\":\"Hizkuntzaren kodea\",\"remove\":\"Kendu Div-a\",\"styleSelectLabel\":\"Estiloa\",\"title\":\"Sortu Div edukiontzia\",\"toolbar\":\"Sortu Div edukiontzia\"},\"toolbar\":{\"toolbarCollapse\":\"Tolestu tresna-barra\",\"toolbarExpand\":\"Zabaldu tresna-barra\",\"toolbarGroups\":{\"document\":\"Dokumentua\",\"clipboard\":\"Arbela/Desegin\",\"editing\":\"Editatu\",\"forms\":\"Formularioak\",\"basicstyles\":\"Oinarrizko estiloak\",\"paragraph\":\"Paragrafoa\",\"links\":\"Estekak\",\"insert\":\"Txertatu\",\"styles\":\"Estiloak\",\"colors\":\"Koloreak\",\"tools\":\"Tresnak\"},\"toolbars\":\"Editorearen tresna-barrak\"},\"elementspath\":{\"eleLabel\":\"Elementuen bidea\",\"eleTitle\":\"%1 elementua\"},\"find\":{\"find\":\"Bilatu\",\"findOptions\":\"Bilaketaren aukerak\",\"findWhat\":\"Bilatu hau:\",\"matchCase\":\"Maiuskula/minuskula\",\"matchCyclic\":\"Bilaketa ziklikoa\",\"matchWord\":\"Bilatu hitz osoa\",\"notFoundMsg\":\"Ez da aurkitu zehazturiko testua.\",\"replace\":\"Ordezkatu\",\"replaceAll\":\"Ordezkatu guztiak\",\"replaceSuccessMsg\":\"%1 aldiz ordezkatua.\",\"replaceWith\":\"Ordezkatu honekin:\",\"title\":\"Bilatu eta ordezkatu\"},\"fakeobjects\":{\"anchor\":\"Aingura\",\"flash\":\"Flash animazioa\",\"hiddenfield\":\"Ezkutuko eremua\",\"iframe\":\"IFrame-a\",\"unknown\":\"Objektu ezezaguna\"},\"flash\":{\"access\":\"Script atzipena\",\"accessAlways\":\"Beti\",\"accessNever\":\"Inoiz ere ez\",\"accessSameDomain\":\"Domeinu berekoak\",\"alignAbsBottom\":\"Abs behean\",\"alignAbsMiddle\":\"Abs erdian\",\"alignBaseline\":\"Oinean\",\"alignTextTop\":\"Testua goian\",\"bgcolor\":\"Atzeko planoko kolorea\",\"chkFull\":\"Onartu pantaila osoa\",\"chkLoop\":\"Begizta\",\"chkMenu\":\"Gaitu Flash-en menua\",\"chkPlay\":\"Erreproduzitu automatikoki\",\"flashvars\":\"Flash-en aldagaiak\",\"hSpace\":\"HSpace\",\"properties\":\"Flash-en propietateak\",\"propertiesTab\":\"Propietateak\",\"quality\":\"Kalitatea\",\"qualityAutoHigh\":\"Auto altua\",\"qualityAutoLow\":\"Auto baxua\",\"qualityBest\":\"Hoberena\",\"qualityHigh\":\"Altua\",\"qualityLow\":\"Baxua\",\"qualityMedium\":\"Ertaina\",\"scale\":\"Eskalatu\",\"scaleAll\":\"Erakutsi dena\",\"scaleFit\":\"Doitu\",\"scaleNoBorder\":\"Ertzik gabe\",\"title\":\"Flash-en propietateak\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace zenbaki bat izan behar da.\",\"validateSrc\":\"URLak ezin du hutsik egon.\",\"validateVSpace\":\"VSpace zenbaki bat izan behar da.\",\"windowMode\":\"Leiho-modua\",\"windowModeOpaque\":\"Opakoa\",\"windowModeTransparent\":\"Gardena\",\"windowModeWindow\":\"Leihoa\"},\"font\":{\"fontSize\":{\"label\":\"Tamaina\",\"voiceLabel\":\"Letra-tamaina\",\"panelTitle\":\"Letra-tamaina\"},\"label\":\"Letra-tipoa\",\"panelTitle\":\"Letra-tipoaren izena\",\"voiceLabel\":\"Letra-tipoa\"},\"forms\":{\"button\":{\"title\":\"Botoiaren ezaugarriak\",\"text\":\"Testua (balioa)\",\"type\":\"Mota\",\"typeBtn\":\"Botoia\",\"typeSbm\":\"Bidali\",\"typeRst\":\"Berrezarri\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Kontrol-laukiaren propietateak\",\"radioTitle\":\"Aukera-botoiaren propietateak\",\"value\":\"Balioa\",\"selected\":\"Hautatuta\",\"required\":\"Beharrezkoa\"},\"form\":{\"title\":\"Formularioaren propietateak\",\"menu\":\"Formularioaren propietateak\",\"action\":\"Ekintza\",\"method\":\"Metodoa\",\"encoding\":\"Kodeketa\"},\"hidden\":{\"title\":\"Ezkutuko eremuaren propietateak\",\"name\":\"Izena\",\"value\":\"Balioa\"},\"select\":{\"title\":\"Hautespen eremuaren propietateak\",\"selectInfo\":\"Hautatu informazioa\",\"opAvail\":\"Erabilgarri dauden aukerak\",\"value\":\"Balioa\",\"size\":\"Tamaina\",\"lines\":\"lerro kopurua\",\"chkMulti\":\"baimendu hautapen anitzak\",\"required\":\"Beharrezkoa\",\"opText\":\"Testua\",\"opValue\":\"Balioa\",\"btnAdd\":\"Gehitu\",\"btnModify\":\"Aldatu\",\"btnUp\":\"Gora\",\"btnDown\":\"Behera\",\"btnSetValue\":\"Ezarri hautatutako balio bezala\",\"btnDelete\":\"Ezabatu\"},\"textarea\":{\"title\":\"Testu-arearen propietateak\",\"cols\":\"Zutabeak\",\"rows\":\"Errenkadak\"},\"textfield\":{\"title\":\"Testu-eremuaren propietateak\",\"name\":\"Izena\",\"value\":\"Balioa\",\"charWidth\":\"Karaktere-zabalera\",\"maxChars\":\"Gehienezko karaktereak\",\"required\":\"Beharrezkoa\",\"type\":\"Mota\",\"typeText\":\"Testua\",\"typePass\":\"Pasahitza\",\"typeEmail\":\"E-posta\",\"typeSearch\":\"Bilatu\",\"typeTel\":\"Telefono zenbakia\",\"typeUrl\":\"URLa\"}},\"format\":{\"label\":\"Formatua\",\"panelTitle\":\"Paragrafoaren formatua\",\"tag_address\":\"Helbidea\",\"tag_div\":\"Normala (DIV)\",\"tag_h1\":\"Izenburua 1\",\"tag_h2\":\"Izenburua 2\",\"tag_h3\":\"Izenburua 3\",\"tag_h4\":\"Izenburua 4\",\"tag_h5\":\"Izenburua 5\",\"tag_h6\":\"Izenburua 6\",\"tag_p\":\"Normala\",\"tag_pre\":\"Formatuduna\"},\"horizontalrule\":{\"toolbar\":\"Txertatu marra horizontala\"},\"iframe\":{\"border\":\"Erakutsi markoaren ertza\",\"noUrl\":\"Idatzi iframe-aren URLa, mesedez.\",\"scrolling\":\"Gaitu korritze-barrak\",\"title\":\"IFrame-aren propietateak\",\"toolbar\":\"IFrame-a\"},\"image\":{\"alt\":\"Ordezko testua\",\"border\":\"Ertza\",\"btnUpload\":\"Bidali zerbitzarira\",\"button2Img\":\"Hautatutako irudi-botoia irudi arrunt bihurtu nahi duzu?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Hautatutako irudia irudi-botoi bihurtu nahi duzu?\",\"infoTab\":\"Irudiaren informazioa\",\"linkTab\":\"Esteka\",\"lockRatio\":\"Blokeatu erlazioa\",\"menu\":\"Irudiaren propietateak\",\"resetSize\":\"Berrezarri tamaina\",\"title\":\"Irudiaren propietateak\",\"titleButton\":\"Irudi-botoiaren propietateak\",\"upload\":\"Kargatu\",\"urlMissing\":\"Irudiaren iturburuaren URLa falta da.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Ertza zenbaki oso bat izan behar da.\",\"validateHSpace\":\"HSpace zenbaki oso bat izan behar da.\",\"validateVSpace\":\"VSpace zenbaki oso bat izan behar da.\"},\"indent\":{\"indent\":\"Handitu koska\",\"outdent\":\"Txikitu koska\"},\"smiley\":{\"options\":\"Aurpegieren aukerak\",\"title\":\"Txertatu aurpegiera\",\"toolbar\":\"Aurpegierak\"},\"justify\":{\"block\":\"Justifikatu\",\"center\":\"Erdian\",\"left\":\"Lerrokatu ezkerrean\",\"right\":\"Lerrokatu eskuinean\"},\"language\":{\"button\":\"Ezarri hizkuntza\",\"remove\":\"Kendu hizkuntza\"},\"link\":{\"acccessKey\":\"Sarbide-tekla\",\"advanced\":\"Aurreratua\",\"advisoryContentType\":\"Aholkatutako eduki-mota\",\"advisoryTitle\":\"Aholkatutako izenburua\",\"anchor\":{\"toolbar\":\"Aingura\",\"menu\":\"Editatu aingura\",\"title\":\"Ainguraren propietateak\",\"name\":\"Ainguraren izena\",\"errorName\":\"Idatzi ainguraren izena\",\"remove\":\"Kendu aingura\"},\"anchorId\":\"Elementuaren Id-aren arabera\",\"anchorName\":\"Aingura-izenaren arabera\",\"charset\":\"Estekatutako baliabide karaktere-jokoa\",\"cssClasses\":\"Estilo-orriko klaseak\",\"emailAddress\":\"E-posta helbidea\",\"emailBody\":\"Mezuaren gorputza\",\"emailSubject\":\"Mezuaren gaia\",\"id\":\"Id\",\"info\":\"Estekaren informazioa\",\"langCode\":\"Hizkuntzaren kodea\",\"langDir\":\"Hizkuntzaren norabidea\",\"langDirLTR\":\"Ezkerretik eskuinera (LTR)\",\"langDirRTL\":\"Eskuinetik ezkerrera (RTL)\",\"menu\":\"Editatu esteka\",\"name\":\"Izena\",\"noAnchors\":\"(Ez dago aingurarik erabilgarri dokumentuan)\",\"noEmail\":\"Mesedez idatzi e-posta helbidea\",\"noUrl\":\"Mesedez idatzi estekaren URLa\",\"other\":\"<bestelakoa>\",\"popupDependent\":\"Menpekoa (Netscape)\",\"popupFeatures\":\"Laster-leihoaren ezaugarriak\",\"popupFullScreen\":\"Pantaila osoa (IE)\",\"popupLeft\":\"Ezkerreko posizioa\",\"popupLocationBar\":\"Kokaleku-barra\",\"popupMenuBar\":\"Menu-barra\",\"popupResizable\":\"Tamaina aldakorra\",\"popupScrollBars\":\"Korritze-barrak\",\"popupStatusBar\":\"Egoera-barra\",\"popupToolbar\":\"Tresna-barra\",\"popupTop\":\"Goiko posizioa\",\"rel\":\"Erlazioa\",\"selectAnchor\":\"Hautatu aingura\",\"styles\":\"Estiloa\",\"tabIndex\":\"Tabulazio indizea\",\"target\":\"Helburua\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Helburuko markoaren izena\",\"targetPopup\":\"<laster-leihoa>\",\"targetPopupName\":\"Laster-leihoaren izena\",\"title\":\"Esteka\",\"toAnchor\":\"Estekatu testuko aingurara\",\"toEmail\":\"E-posta\",\"toUrl\":\"URLa\",\"toolbar\":\"Esteka\",\"type\":\"Esteka-mota\",\"unlink\":\"Kendu esteka\",\"upload\":\"Kargatu\"},\"list\":{\"bulletedlist\":\"Buletdun Zerrenda\",\"numberedlist\":\"Zenbakidun Zerrenda\"},\"liststyle\":{\"armenian\":\"Zenbakitze armeniarra\",\"bulletedTitle\":\"Buletadun zerrendaren propietateak\",\"circle\":\"Zirkulua\",\"decimal\":\"Hamartarra (1, 2, 3...)\",\"decimalLeadingZero\":\"Aurretik zeroa duen hamartarra (01, 02, 03...)\",\"disc\":\"Diskoa\",\"georgian\":\"Zenbakitze georgiarra (an, ban, gan...)\",\"lowerAlpha\":\"Alfabetoa minuskulaz (a, b, c, d, e...)\",\"lowerGreek\":\"Greziera minuskulaz (alpha, beta, gamma...)\",\"lowerRoman\":\"Erromatarra minuskulaz (i, ii, iii, iv, v...)\",\"none\":\"Bat ere ez\",\"notset\":\"<ezarri gabea>\",\"numberedTitle\":\"Zenbakidun zerrendaren propietateak\",\"square\":\"Karratua\",\"start\":\"Hasi\",\"type\":\"Mota\",\"upperAlpha\":\"Alfabetoa maiuskulaz (A, B, C, D, E...)\",\"upperRoman\":\"Erromatarra maiuskulaz (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Zerrendaren hasierako zenbakiak zenbaki osoa izan behar du.\"},\"magicline\":{\"title\":\"Txertatu paragrafoa hemen\"},\"maximize\":{\"maximize\":\"Maximizatu\",\"minimize\":\"Minimizatu\"},\"newpage\":{\"toolbar\":\"Orrialde berria\"},\"pagebreak\":{\"alt\":\"Orrialde-jauzia\",\"toolbar\":\"Txertatu orrialde-jauzia inprimatzean\"},\"pastetext\":{\"button\":\"Itsatsi testu arrunta bezala\",\"title\":\"Itsatsi testu arrunta bezala\"},\"pastefromword\":{\"confirmCleanup\":\"Itsatsi nahi duzun testua Word-etik kopiatua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?\",\"error\":\"Barne-errore bat dela eta ezin izan da itsatsitako testua garbitu\",\"title\":\"Itsatsi Word-etik\",\"toolbar\":\"Itsatsi Word-etik\"},\"preview\":{\"preview\":\"Aurrebista\"},\"print\":{\"toolbar\":\"Inprimatu\"},\"removeformat\":{\"toolbar\":\"Kendu formatua\"},\"save\":{\"toolbar\":\"Gorde\"},\"selectall\":{\"toolbar\":\"Hautatu dena\"},\"showblocks\":{\"toolbar\":\"Erakutsi blokeak\"},\"sourcearea\":{\"toolbar\":\"Iturburua\"},\"specialchar\":{\"options\":\"Karaktere berezien aukerak\",\"title\":\"Hautatu karaktere berezia\",\"toolbar\":\"Txertatu karaktere berezia\"},\"scayt\":{\"btn_about\":\"SCAYTi buruz\",\"btn_dictionaries\":\"Hiztegiak\",\"btn_disable\":\"Desgaitu SCAYT\",\"btn_enable\":\"Gaitu SCAYT\",\"btn_langs\":\"Hizkuntzak\",\"btn_options\":\"Aukerak\",\"text_title\":\"Ortografia Zuzenketa Idatzi Ahala (SCAYT)\"},\"stylescombo\":{\"label\":\"Estiloak\",\"panelTitle\":\"Formatu estiloak\",\"panelTitle1\":\"Bloke estiloak\",\"panelTitle2\":\"Lineako estiloak\",\"panelTitle3\":\"Objektu estiloak\"},\"table\":{\"border\":\"Ertzaren zabalera\",\"caption\":\"Epigrafea\",\"cell\":{\"menu\":\"Gelaxka\",\"insertBefore\":\"Txertatu gelaxka aurretik\",\"insertAfter\":\"Txertatu gelaxka ondoren\",\"deleteCell\":\"Ezabatu gelaxkak\",\"merge\":\"Batu gelaxkak\",\"mergeRight\":\"Batu eskuinetara\",\"mergeDown\":\"Batu behera\",\"splitHorizontal\":\"Banatu gelaxka horizontalki\",\"splitVertical\":\"Banatu gelaxka bertikalki\",\"title\":\"Gelaxkaren propietateak\",\"cellType\":\"Gelaxka-mota\",\"rowSpan\":\"Errenkaden hedadura\",\"colSpan\":\"Zutabeen hedadura\",\"wordWrap\":\"Itzulbira\",\"hAlign\":\"Lerrokatze horizontala\",\"vAlign\":\"Lerrokatze bertikala\",\"alignBaseline\":\"Oinarri-lerroan\",\"bgColor\":\"Atzeko planoaren kolorea\",\"borderColor\":\"Ertzaren kolorea\",\"data\":\"Data\",\"header\":\"Goiburua\",\"yes\":\"Bai\",\"no\":\"Ez\",\"invalidWidth\":\"Gelaxkaren zabalera zenbaki bat izan behar da.\",\"invalidHeight\":\"Gelaxkaren altuera zenbaki bat izan behar da.\",\"invalidRowSpan\":\"Errenkaden hedadura zenbaki osoa izan behar da.\",\"invalidColSpan\":\"Zutabeen hedadura zenbaki osoa izan behar da.\",\"chooseColor\":\"Aukeratu\"},\"cellPad\":\"Gelaxken betegarria\",\"cellSpace\":\"Gelaxka arteko tartea\",\"column\":{\"menu\":\"Zutabea\",\"insertBefore\":\"Txertatu zutabea aurretik\",\"insertAfter\":\"Txertatu zutabea ondoren\",\"deleteColumn\":\"Ezabatu zutabeak\"},\"columns\":\"Zutabeak\",\"deleteTable\":\"Ezabatu taula\",\"headers\":\"Goiburuak\",\"headersBoth\":\"Biak\",\"headersColumn\":\"Lehen zutabea\",\"headersNone\":\"Bat ere ez\",\"headersRow\":\"Lehen errenkada\",\"invalidBorder\":\"Ertzaren tamaina zenbaki bat izan behar da.\",\"invalidCellPadding\":\"Gelaxken betegarria zenbaki bat izan behar da.\",\"invalidCellSpacing\":\"Gelaxka arteko tartea zenbaki bat izan behar da.\",\"invalidCols\":\"Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.\",\"invalidHeight\":\"Taularen altuera zenbaki bat izan behar da.\",\"invalidRows\":\"Errenkada kopurua 0 baino handiagoa den zenbakia izan behar da.\",\"invalidWidth\":\"Taularen zabalera zenbaki bat izan behar da.\",\"menu\":\"Taularen propietateak\",\"row\":{\"menu\":\"Errenkada\",\"insertBefore\":\"Txertatu errenkada aurretik\",\"insertAfter\":\"Txertatu errenkada ondoren\",\"deleteRow\":\"Ezabatu errenkadak\"},\"rows\":\"Errenkadak\",\"summary\":\"Laburpena\",\"title\":\"Taularen propietateak\",\"toolbar\":\"Taula\",\"widthPc\":\"ehuneko\",\"widthPx\":\"pixel\",\"widthUnit\":\"zabalera unitatea\"},\"undo\":{\"redo\":\"Berregin\",\"undo\":\"Desegin\"},\"wsc\":{\"btnIgnore\":\"Ezikusi\",\"btnIgnoreAll\":\"Denak Ezikusi\",\"btnReplace\":\"Ordezkatu\",\"btnReplaceAll\":\"Denak Ordezkatu\",\"btnUndo\":\"Desegin\",\"changeTo\":\"Honekin ordezkatu\",\"errorLoading\":\"Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.\",\"ieSpellDownload\":\"Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?\",\"manyChanges\":\"Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira\",\"noChanges\":\"Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu\",\"noMispell\":\"Zuzenketa ortografikoa bukatuta: Akatsik ez\",\"noSuggestions\":\"- Iradokizunik ez -\",\"notAvailable\":\"Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.\",\"notInDic\":\"Ez dago hiztegian\",\"oneChange\":\"Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da\",\"progress\":\"Zuzenketa ortografikoa martxan...\",\"title\":\"Ortografia zuzenketa\",\"toolbar\":\"Ortografia\"}};"
  },
  {
    "path": "assets/ckeditor/lang/fa.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['fa']={\"editor\":\"ویرایش‌گر متن غنی\",\"editorPanel\":\"پنل ویرایشگر متن غنی\",\"common\":{\"editorHelp\":\"کلید Alt+0 را برای راهنمایی بفشارید\",\"browseServer\":\"فهرست​نمایی سرور\",\"url\":\"URL\",\"protocol\":\"قرارداد\",\"upload\":\"بالاگذاری\",\"uploadSubmit\":\"به سرور بفرست\",\"image\":\"تصویر\",\"flash\":\"فلش\",\"form\":\"فرم\",\"checkbox\":\"چک‌باکس\",\"radio\":\"دکمه‌ی رادیویی\",\"textField\":\"فیلد متنی\",\"textarea\":\"ناحیهٴ متنی\",\"hiddenField\":\"فیلد پنهان\",\"button\":\"دکمه\",\"select\":\"فیلد انتخاب چند گزینه​ای\",\"imageButton\":\"دکمه‌ی تصویری\",\"notSet\":\"<تعیین‌نشده>\",\"id\":\"شناسه\",\"name\":\"نام\",\"langDir\":\"جهت زبان\",\"langDirLtr\":\"چپ به راست\",\"langDirRtl\":\"راست به چپ\",\"langCode\":\"کد زبان\",\"longDescr\":\"URL توصیف طولانی\",\"cssClass\":\"کلاس​های شیوه​نامه (Stylesheet)\",\"advisoryTitle\":\"عنوان کمکی\",\"cssStyle\":\"سبک\",\"ok\":\"پذیرش\",\"cancel\":\"انصراف\",\"close\":\"بستن\",\"preview\":\"پیش‌نمایش\",\"resize\":\"تغییر اندازه\",\"generalTab\":\"عمومی\",\"advancedTab\":\"پیش‌رفته\",\"validateNumberFailed\":\"این مقدار یک عدد نیست.\",\"confirmNewPage\":\"هر تغییر ایجاد شده​ی ذخیره نشده از بین خواهد رفت. آیا اطمینان دارید که قصد بارگیری صفحه جدیدی را دارید؟\",\"confirmCancel\":\"برخی از گزینه‌ها تغییر کرده‌اند. آیا واقعا قصد بستن این پنجره را دارید؟\",\"options\":\"گزینه​ها\",\"target\":\"مقصد\",\"targetNew\":\"پنجره جدید\",\"targetTop\":\"بالاترین پنجره\",\"targetSelf\":\"همان پنجره\",\"targetParent\":\"پنجره والد\",\"langDirLTR\":\"چپ به راست\",\"langDirRTL\":\"راست به چپ\",\"styles\":\"سبک\",\"cssClasses\":\"کلاس‌های سبک‌نامه\",\"width\":\"عرض\",\"height\":\"طول\",\"align\":\"چینش\",\"alignLeft\":\"چپ\",\"alignRight\":\"راست\",\"alignCenter\":\"وسط\",\"alignJustify\":\"بلوک چین\",\"alignTop\":\"بالا\",\"alignMiddle\":\"میانه\",\"alignBottom\":\"پائین\",\"alignNone\":\"هیچ\",\"invalidValue\":\"مقدار نامعتبر.\",\"invalidHeight\":\"ارتفاع باید یک عدد باشد.\",\"invalidWidth\":\"عرض باید یک عدد باشد.\",\"invalidCssLength\":\"عدد تعیین شده برای فیلد \\\"%1\\\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"عدد تعیین شده برای فیلد \\\"%1\\\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).\",\"invalidInlineStyle\":\"عدد تعیین شده برای سبک درون​خطی -Inline Style- باید دارای یک یا چند چندتایی با شکلی شبیه \\\"name : value\\\" که باید با یک \\\";\\\" از هم جدا شوند.\",\"cssLengthTooltip\":\"یک عدد برای یک مقدار بر حسب پیکسل و یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">، غیر قابل دسترس</span>\"},\"about\":{\"copy\":\"حق نشر &copy; $1. کلیه حقوق محفوظ است.\",\"dlgTitle\":\"درباره CKEditor\",\"help\":\" برای راهنمایی $1 را ملاحظه کنید.\",\"moreInfo\":\"برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:\",\"title\":\"درباره CKEditor\",\"userGuide\":\"راهنمای کاربران CKEditor\"},\"basicstyles\":{\"bold\":\"درشت\",\"italic\":\"خمیده\",\"strike\":\"خط‌خورده\",\"subscript\":\"زیرنویس\",\"superscript\":\"بالانویس\",\"underline\":\"زیرخط‌دار\"},\"bidi\":{\"ltr\":\"جهت متن از چپ به راست\",\"rtl\":\"جهت متن از راست به چپ\"},\"blockquote\":{\"toolbar\":\"بلوک نقل قول\"},\"clipboard\":{\"copy\":\"رونوشت\",\"copyError\":\"تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).\",\"cut\":\"برش\",\"cutError\":\"تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).\",\"paste\":\"چسباندن\",\"pasteArea\":\"محل چسباندن\",\"pasteMsg\":\"لطفا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.\",\"securityMsg\":\"به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.\",\"title\":\"چسباندن\"},\"button\":{\"selectedLabel\":\"%1 (انتخاب شده)\"},\"colorbutton\":{\"auto\":\"خودکار\",\"bgColorTitle\":\"رنگ پس​زمینه\",\"colors\":{\"000\":\"سیاه\",\"800000\":\"خرمایی\",\"8B4513\":\"قهوه​ای شکلاتی\",\"2F4F4F\":\"ارغوانی مایل به خاکستری\",\"008080\":\"آبی مایل به خاکستری\",\"000080\":\"آبی سیر\",\"4B0082\":\"نیلی\",\"696969\":\"خاکستری تیره\",\"B22222\":\"آتش آجری\",\"A52A2A\":\"قهوه​ای\",\"DAA520\":\"میله​ی طلایی\",\"006400\":\"سبز تیره\",\"40E0D0\":\"فیروزه​ای\",\"0000CD\":\"آبی روشن\",\"800080\":\"ارغوانی\",\"808080\":\"خاکستری\",\"F00\":\"قرمز\",\"FF8C00\":\"نارنجی پررنگ\",\"FFD700\":\"طلایی\",\"008000\":\"سبز\",\"0FF\":\"آبی مایل به سبز\",\"00F\":\"آبی\",\"EE82EE\":\"بنفش\",\"A9A9A9\":\"خاکستری مات\",\"FFA07A\":\"صورتی کدر روشن\",\"FFA500\":\"نارنجی\",\"FFFF00\":\"زرد\",\"00FF00\":\"فسفری\",\"AFEEEE\":\"فیروزه​ای رنگ پریده\",\"ADD8E6\":\"آبی کمرنگ\",\"DDA0DD\":\"آلویی\",\"D3D3D3\":\"خاکستری روشن\",\"FFF0F5\":\"بنفش کمرنگ\",\"FAEBD7\":\"عتیقه سفید\",\"FFFFE0\":\"زرد روشن\",\"F0FFF0\":\"عسلی\",\"F0FFFF\":\"لاجوردی\",\"F0F8FF\":\"آبی براق\",\"E6E6FA\":\"بنفش کمرنگ\",\"FFF\":\"سفید\"},\"more\":\"رنگ​های بیشتر...\",\"panelTitle\":\"رنگها\",\"textColorTitle\":\"رنگ متن\"},\"colordialog\":{\"clear\":\"پاک کردن\",\"highlight\":\"متمایز\",\"options\":\"گزینه​های رنگ\",\"selected\":\"رنگ انتخاب شده\",\"title\":\"انتخاب رنگ\"},\"templates\":{\"button\":\"الگوها\",\"emptyListMsg\":\"(الگوئی تعریف نشده است)\",\"insertOption\":\"محتویات کنونی جایگزین شوند\",\"options\":\"گزینه‌های الگو\",\"selectPromptMsg\":\"لطفاً الگوی مورد نظر را برای بازکردن در ویرایشگر انتخاب کنید\",\"title\":\"الگوهای محتویات\"},\"contextmenu\":{\"options\":\"گزینه​های منوی زمینه\"},\"div\":{\"IdInputLabel\":\"شناسه\",\"advisoryTitleInputLabel\":\"عنوان مشاوره\",\"cssClassInputLabel\":\"کلاس​های شیوه​نامه\",\"edit\":\"ویرایش Div\",\"inlineStyleInputLabel\":\"سبک درون​خطی(Inline Style)\",\"langDirLTRLabel\":\"چپ به راست (LTR)\",\"langDirLabel\":\"جهت نوشتاری زبان\",\"langDirRTLLabel\":\"راست به چپ (RTL)\",\"languageCodeInputLabel\":\" کد زبان\",\"remove\":\"حذف Div\",\"styleSelectLabel\":\"سبک\",\"title\":\"ایجاد یک محل DIV\",\"toolbar\":\"ایجاد یک محل DIV\"},\"toolbar\":{\"toolbarCollapse\":\"بستن نوار ابزار\",\"toolbarExpand\":\"بازکردن نوار ابزار\",\"toolbarGroups\":{\"document\":\"سند\",\"clipboard\":\"حافظه موقت/برگشت\",\"editing\":\"در حال ویرایش\",\"forms\":\"فرم​ها\",\"basicstyles\":\"سبک‌های پایه\",\"paragraph\":\"بند\",\"links\":\"پیوندها\",\"insert\":\"ورود\",\"styles\":\"سبک‌ها\",\"colors\":\"رنگ​ها\",\"tools\":\"ابزارها\"},\"toolbars\":\"نوار ابزارهای ویرایش‌گر\"},\"elementspath\":{\"eleLabel\":\"مسیر عناصر\",\"eleTitle\":\"%1 عنصر\"},\"find\":{\"find\":\"جستجو\",\"findOptions\":\"گزینه​های جستجو\",\"findWhat\":\"چه چیز را مییابید:\",\"matchCase\":\"همسانی در بزرگی و کوچکی نویسه​ها\",\"matchCyclic\":\"همسانی با چرخه\",\"matchWord\":\"همسانی با واژهٴ کامل\",\"notFoundMsg\":\"متن موردنظر یافت نشد.\",\"replace\":\"جایگزینی\",\"replaceAll\":\"جایگزینی همهٴ یافته​ها\",\"replaceSuccessMsg\":\"%1 رخداد جایگزین شد.\",\"replaceWith\":\"جایگزینی با:\",\"title\":\"جستجو و جایگزینی\"},\"fakeobjects\":{\"anchor\":\"لنگر\",\"flash\":\"انیمشن فلش\",\"hiddenfield\":\"فیلد پنهان\",\"iframe\":\"IFrame\",\"unknown\":\"شیء ناشناخته\"},\"flash\":{\"access\":\"دسترسی به اسکریپت\",\"accessAlways\":\"همیشه\",\"accessNever\":\"هرگز\",\"accessSameDomain\":\"همان دامنه\",\"alignAbsBottom\":\"پائین مطلق\",\"alignAbsMiddle\":\"وسط مطلق\",\"alignBaseline\":\"خط پایه\",\"alignTextTop\":\"متن بالا\",\"bgcolor\":\"رنگ پس​زمینه\",\"chkFull\":\"اجازه تمام صفحه\",\"chkLoop\":\"اجرای پیاپی\",\"chkMenu\":\"در دسترس بودن منوی فلش\",\"chkPlay\":\"آغاز خودکار\",\"flashvars\":\"مقادیر برای فلش\",\"hSpace\":\"فاصلهٴ افقی\",\"properties\":\"ویژگی​های فلش\",\"propertiesTab\":\"ویژگی​ها\",\"quality\":\"کیفیت\",\"qualityAutoHigh\":\"بالا - خودکار\",\"qualityAutoLow\":\"پایین - خودکار\",\"qualityBest\":\"بهترین\",\"qualityHigh\":\"بالا\",\"qualityLow\":\"پایین\",\"qualityMedium\":\"متوسط\",\"scale\":\"مقیاس\",\"scaleAll\":\"نمایش همه\",\"scaleFit\":\"جایگیری کامل\",\"scaleNoBorder\":\"بدون کران\",\"title\":\"ویژگی​های فلش\",\"vSpace\":\"فاصلهٴ عمودی\",\"validateHSpace\":\"مقدار فاصله گذاری افقی باید یک عدد باشد.\",\"validateSrc\":\"لطفا URL پیوند را بنویسید\",\"validateVSpace\":\"مقدار فاصله گذاری عمودی باید یک عدد باشد.\",\"windowMode\":\"حالت پنجره\",\"windowModeOpaque\":\"مات\",\"windowModeTransparent\":\"شفاف\",\"windowModeWindow\":\"پنجره\"},\"font\":{\"fontSize\":{\"label\":\"اندازه\",\"voiceLabel\":\"اندازه قلم\",\"panelTitle\":\"اندازه قلم\"},\"label\":\"قلم\",\"panelTitle\":\"نام قلم\",\"voiceLabel\":\"قلم\"},\"forms\":{\"button\":{\"title\":\"ویژگی​های دکمه\",\"text\":\"متن (مقدار)\",\"type\":\"نوع\",\"typeBtn\":\"دکمه\",\"typeSbm\":\"ثبت\",\"typeRst\":\"بازنشانی (Reset)\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"ویژگی​های خانهٴ گزینه​ای\",\"radioTitle\":\"ویژگی​های دکمهٴ رادیویی\",\"value\":\"مقدار\",\"selected\":\"برگزیده\",\"required\":\"Required\"},\"form\":{\"title\":\"ویژگی​های فرم\",\"menu\":\"ویژگی​های فرم\",\"action\":\"رویداد\",\"method\":\"متد\",\"encoding\":\"رمزنگاری\"},\"hidden\":{\"title\":\"ویژگی​های فیلد پنهان\",\"name\":\"نام\",\"value\":\"مقدار\"},\"select\":{\"title\":\"ویژگی​های فیلد چندگزینه​ای\",\"selectInfo\":\"اطلاعات\",\"opAvail\":\"گزینه​های دردسترس\",\"value\":\"مقدار\",\"size\":\"اندازه\",\"lines\":\"خطوط\",\"chkMulti\":\"گزینش چندگانه فراهم باشد\",\"required\":\"Required\",\"opText\":\"متن\",\"opValue\":\"مقدار\",\"btnAdd\":\"افزودن\",\"btnModify\":\"ویرایش\",\"btnUp\":\"بالا\",\"btnDown\":\"پائین\",\"btnSetValue\":\"تنظیم به عنوان مقدار برگزیده\",\"btnDelete\":\"پاککردن\"},\"textarea\":{\"title\":\"ویژگی​های ناحیهٴ متنی\",\"cols\":\"ستون​ها\",\"rows\":\"سطرها\"},\"textfield\":{\"title\":\"ویژگی​های فیلد متنی\",\"name\":\"نام\",\"value\":\"مقدار\",\"charWidth\":\"پهنای نویسه\",\"maxChars\":\"بیشینهٴ نویسه​ها\",\"required\":\"Required\",\"type\":\"نوع\",\"typeText\":\"متن\",\"typePass\":\"گذرواژه\",\"typeEmail\":\"ایمیل\",\"typeSearch\":\"جستجو\",\"typeTel\":\"شماره تلفن\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"قالب\",\"panelTitle\":\"قالب بند\",\"tag_address\":\"نشانی\",\"tag_div\":\"بند\",\"tag_h1\":\"سرنویس ۱\",\"tag_h2\":\"سرنویس ۲\",\"tag_h3\":\"سرنویس ۳\",\"tag_h4\":\"سرنویس ۴\",\"tag_h5\":\"سرنویس ۵\",\"tag_h6\":\"سرنویس ۶\",\"tag_p\":\"معمولی\",\"tag_pre\":\"قالب‌دار\"},\"horizontalrule\":{\"toolbar\":\"گنجاندن خط افقی\"},\"iframe\":{\"border\":\"نمایش خطوط frame\",\"noUrl\":\"لطفا مسیر URL iframe را درج کنید\",\"scrolling\":\"نمایش خطکشها\",\"title\":\"ویژگیهای IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"متن جایگزین\",\"border\":\"لبه\",\"btnUpload\":\"به سرور بفرست\",\"button2Img\":\"آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟\",\"hSpace\":\"فاصلهٴ افقی\",\"img2Button\":\"آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟\",\"infoTab\":\"اطلاعات تصویر\",\"linkTab\":\"پیوند\",\"lockRatio\":\"قفل کردن نسبت\",\"menu\":\"ویژگی​های تصویر\",\"resetSize\":\"بازنشانی اندازه\",\"title\":\"ویژگی​های تصویر\",\"titleButton\":\"ویژگی​های دکمهٴ تصویری\",\"upload\":\"انتقال به سرور\",\"urlMissing\":\"آدرس URL اصلی تصویر یافت نشد.\",\"vSpace\":\"فاصلهٴ عمودی\",\"validateBorder\":\"مقدار خطوط باید یک عدد باشد.\",\"validateHSpace\":\"مقدار فاصله گذاری افقی باید یک عدد باشد.\",\"validateVSpace\":\"مقدار فاصله گذاری عمودی باید یک عدد باشد.\"},\"indent\":{\"indent\":\"افزایش تورفتگی\",\"outdent\":\"کاهش تورفتگی\"},\"smiley\":{\"options\":\"گزینه​های خندانک\",\"title\":\"گنجاندن خندانک\",\"toolbar\":\"خندانک\"},\"justify\":{\"block\":\"بلوک چین\",\"center\":\"میان چین\",\"left\":\"چپ چین\",\"right\":\"راست چین\"},\"language\":{\"button\":\"تعیین زبان\",\"remove\":\"حذف زبان\"},\"link\":{\"acccessKey\":\"کلید دستیابی\",\"advanced\":\"پیشرفته\",\"advisoryContentType\":\"نوع محتوای کمکی\",\"advisoryTitle\":\"عنوان کمکی\",\"anchor\":{\"toolbar\":\"گنجاندن/ویرایش لنگر\",\"menu\":\"ویژگی​های لنگر\",\"title\":\"ویژگی​های لنگر\",\"name\":\"نام لنگر\",\"errorName\":\"لطفا نام لنگر را بنویسید\",\"remove\":\"حذف لنگر\"},\"anchorId\":\"با شناسهٴ المان\",\"anchorName\":\"با نام لنگر\",\"charset\":\"نویسه​گان منبع پیوند شده\",\"cssClasses\":\"کلاس​های شیوه​نامه(Stylesheet)\",\"emailAddress\":\"نشانی پست الکترونیکی\",\"emailBody\":\"متن پیام\",\"emailSubject\":\"موضوع پیام\",\"id\":\"شناسه\",\"info\":\"اطلاعات پیوند\",\"langCode\":\"جهت​نمای زبان\",\"langDir\":\"جهت​نمای زبان\",\"langDirLTR\":\"چپ به راست (LTR)\",\"langDirRTL\":\"راست به چپ (RTL)\",\"menu\":\"ویرایش پیوند\",\"name\":\"نام\",\"noAnchors\":\"(در این سند لنگری دردسترس نیست)\",\"noEmail\":\"لطفا نشانی پست الکترونیکی را بنویسید\",\"noUrl\":\"لطفا URL پیوند را بنویسید\",\"other\":\"<سایر>\",\"popupDependent\":\"وابسته (Netscape)\",\"popupFeatures\":\"ویژگی​های پنجرهٴ پاپاپ\",\"popupFullScreen\":\"تمام صفحه (IE)\",\"popupLeft\":\"موقعیت چپ\",\"popupLocationBar\":\"نوار موقعیت\",\"popupMenuBar\":\"نوار منو\",\"popupResizable\":\"قابل تغییر اندازه\",\"popupScrollBars\":\"میله​های پیمایش\",\"popupStatusBar\":\"نوار وضعیت\",\"popupToolbar\":\"نوار ابزار\",\"popupTop\":\"موقعیت بالا\",\"rel\":\"وابستگی\",\"selectAnchor\":\"یک لنگر برگزینید\",\"styles\":\"شیوه (style)\",\"tabIndex\":\"نمایهٴ دسترسی با برگه\",\"target\":\"مقصد\",\"targetFrame\":\"<فریم>\",\"targetFrameName\":\"نام فریم مقصد\",\"targetPopup\":\"<پنجرهٴ پاپاپ>\",\"targetPopupName\":\"نام پنجرهٴ پاپاپ\",\"title\":\"پیوند\",\"toAnchor\":\"لنگر در همین صفحه\",\"toEmail\":\"پست الکترونیکی\",\"toUrl\":\"URL\",\"toolbar\":\"گنجاندن/ویرایش پیوند\",\"type\":\"نوع پیوند\",\"unlink\":\"برداشتن پیوند\",\"upload\":\"انتقال به سرور\"},\"list\":{\"bulletedlist\":\"فهرست نقطه​ای\",\"numberedlist\":\"فهرست شماره​دار\"},\"liststyle\":{\"armenian\":\"شماره‌گذاری ارمنی\",\"bulletedTitle\":\"خصوصیات فهرست نقطه‌ای\",\"circle\":\"دایره\",\"decimal\":\"ده‌دهی (۱، ۲، ۳، ...)\",\"decimalLeadingZero\":\"دهدهی همراه با صفر (۰۱، ۰۲، ۰۳، ...)\",\"disc\":\"صفحه گرد\",\"georgian\":\"شمارهگذاری گریگورین (an, ban, gan, etc.)\",\"lowerAlpha\":\"پانویس الفبایی (a, b, c, d, e, etc.)\",\"lowerGreek\":\"پانویس یونانی (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"پانویس رومی (i, ii, iii, iv, v, etc.)\",\"none\":\"هیچ\",\"notset\":\"<تنظیم نشده>\",\"numberedTitle\":\"ویژگیهای فهرست شمارهدار\",\"square\":\"چهارگوش\",\"start\":\"شروع\",\"type\":\"نوع\",\"upperAlpha\":\"بالانویس الفبایی (A, B, C, D, E, etc.)\",\"upperRoman\":\"بالانویس رومی (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"فهرست شماره شروع باید یک عدد صحیح باشد.\"},\"magicline\":{\"title\":\"قرار دادن بند در اینجا\"},\"maximize\":{\"maximize\":\"بیشنه کردن\",\"minimize\":\"کمینه کردن\"},\"newpage\":{\"toolbar\":\"برگهٴ تازه\"},\"pagebreak\":{\"alt\":\"شکستن صفحه\",\"toolbar\":\"گنجاندن شکستگی پایان برگه\"},\"pastetext\":{\"button\":\"چسباندن به عنوان متن ساده\",\"title\":\"چسباندن به عنوان متن ساده\"},\"pastefromword\":{\"confirmCleanup\":\"متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟\",\"error\":\"به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.\",\"title\":\"چسباندن از Word\",\"toolbar\":\"چسباندن از Word\"},\"preview\":{\"preview\":\"پیشنمایش\"},\"print\":{\"toolbar\":\"چاپ\"},\"removeformat\":{\"toolbar\":\"برداشتن فرمت\"},\"save\":{\"toolbar\":\"ذخیره\"},\"selectall\":{\"toolbar\":\"گزینش همه\"},\"showblocks\":{\"toolbar\":\"نمایش بلوک‌ها\"},\"sourcearea\":{\"toolbar\":\"منبع\"},\"specialchar\":{\"options\":\"گزینه‌های نویسه‌های ویژه\",\"title\":\"گزینش نویسه‌ی ویژه\",\"toolbar\":\"گنجاندن نویسه‌ی ویژه\"},\"scayt\":{\"btn_about\":\"درباره SCAYT\",\"btn_dictionaries\":\"دیکشنریها\",\"btn_disable\":\"غیرفعالسازی SCAYT\",\"btn_enable\":\"فعالسازی SCAYT\",\"btn_langs\":\"زبانها\",\"btn_options\":\"گزینهها\",\"text_title\":\"بررسی املای تایپ شما\"},\"stylescombo\":{\"label\":\"سبک\",\"panelTitle\":\"سبکهای قالببندی\",\"panelTitle1\":\"سبکهای بلوک\",\"panelTitle2\":\"سبکهای درونخطی\",\"panelTitle3\":\"سبکهای شیء\"},\"table\":{\"border\":\"اندازهٴ لبه\",\"caption\":\"عنوان\",\"cell\":{\"menu\":\"سلول\",\"insertBefore\":\"افزودن سلول قبل از\",\"insertAfter\":\"افزودن سلول بعد از\",\"deleteCell\":\"حذف سلولها\",\"merge\":\"ادغام سلولها\",\"mergeRight\":\"ادغام به راست\",\"mergeDown\":\"ادغام به پایین\",\"splitHorizontal\":\"جدا کردن افقی سلول\",\"splitVertical\":\"جدا کردن عمودی سلول\",\"title\":\"ویژگیهای سلول\",\"cellType\":\"نوع سلول\",\"rowSpan\":\"محدوده ردیفها\",\"colSpan\":\"محدوده ستونها\",\"wordWrap\":\"شکستن کلمه\",\"hAlign\":\"چینش افقی\",\"vAlign\":\"چینش عمودی\",\"alignBaseline\":\"خط مبنا\",\"bgColor\":\"رنگ زمینه\",\"borderColor\":\"رنگ خطوط\",\"data\":\"اطلاعات\",\"header\":\"سرنویس\",\"yes\":\"بله\",\"no\":\"خیر\",\"invalidWidth\":\"عرض سلول باید یک عدد باشد.\",\"invalidHeight\":\"ارتفاع سلول باید عدد باشد.\",\"invalidRowSpan\":\"مقدار محدوده ردیفها باید یک عدد باشد.\",\"invalidColSpan\":\"مقدار محدوده ستونها باید یک عدد باشد.\",\"chooseColor\":\"انتخاب\"},\"cellPad\":\"فاصلهٴ پرشده در سلول\",\"cellSpace\":\"فاصلهٴ میان سلولها\",\"column\":{\"menu\":\"ستون\",\"insertBefore\":\"افزودن ستون قبل از\",\"insertAfter\":\"افزودن ستون بعد از\",\"deleteColumn\":\"حذف ستونها\"},\"columns\":\"ستونها\",\"deleteTable\":\"پاک کردن جدول\",\"headers\":\"سرنویسها\",\"headersBoth\":\"هردو\",\"headersColumn\":\"اولین ستون\",\"headersNone\":\"هیچ\",\"headersRow\":\"اولین ردیف\",\"invalidBorder\":\"مقدار اندازه خطوط باید یک عدد باشد.\",\"invalidCellPadding\":\"بالشتک سلول باید یک عدد باشد.\",\"invalidCellSpacing\":\"مقدار فاصلهگذاری سلول باید یک عدد باشد.\",\"invalidCols\":\"تعداد ستونها باید یک عدد بزرگتر از 0 باشد.\",\"invalidHeight\":\"مقدار ارتفاع  جدول باید یک عدد باشد.\",\"invalidRows\":\"تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.\",\"invalidWidth\":\"مقدار پهنای جدول باید یک عدد باشد.\",\"menu\":\"ویژگیهای جدول\",\"row\":{\"menu\":\"سطر\",\"insertBefore\":\"افزودن سطر قبل از\",\"insertAfter\":\"افزودن سطر بعد از\",\"deleteRow\":\"حذف سطرها\"},\"rows\":\"سطرها\",\"summary\":\"خلاصه\",\"title\":\"ویژگیهای جدول\",\"toolbar\":\"جدول\",\"widthPc\":\"درصد\",\"widthPx\":\"پیکسل\",\"widthUnit\":\"واحد پهنا\"},\"undo\":{\"redo\":\"بازچیدن\",\"undo\":\"واچیدن\"},\"wsc\":{\"btnIgnore\":\"چشمپوشی\",\"btnIgnoreAll\":\"چشمپوشی همه\",\"btnReplace\":\"جایگزینی\",\"btnReplaceAll\":\"جایگزینی همه\",\"btnUndo\":\"واچینش\",\"changeTo\":\"تغییر به\",\"errorLoading\":\"خطا در بارگیری برنامه خدمات میزبان: %s.\",\"ieSpellDownload\":\"بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریافت کنید؟\",\"manyChanges\":\"بررسی املا انجام شد. %1 واژه تغییر یافت\",\"noChanges\":\"بررسی املا انجام شد. هیچ واژهای تغییر نیافت\",\"noMispell\":\"بررسی املا انجام شد. هیچ غلط املائی یافت نشد\",\"noSuggestions\":\"- پیشنهادی نیست -\",\"notAvailable\":\"با عرض پوزش خدمات الان در دسترس نیستند.\",\"notInDic\":\"در واژه~نامه یافت نشد\",\"oneChange\":\"بررسی املا انجام شد. یک واژه تغییر یافت\",\"progress\":\"بررسی املا در حال انجام...\",\"title\":\"بررسی املا\",\"toolbar\":\"بررسی املا\"}};"
  },
  {
    "path": "assets/ckeditor/lang/fi.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['fi']={\"editor\":\"Rikastekstieditori\",\"editorPanel\":\"Rikastekstieditoripaneeli\",\"common\":{\"editorHelp\":\"Paina ALT 0 nähdäksesi ohjeen\",\"browseServer\":\"Selaa palvelinta\",\"url\":\"Osoite\",\"protocol\":\"Protokolla\",\"upload\":\"Lisää tiedosto\",\"uploadSubmit\":\"Lähetä palvelimelle\",\"image\":\"Kuva\",\"flash\":\"Flash-animaatio\",\"form\":\"Lomake\",\"checkbox\":\"Valintaruutu\",\"radio\":\"Radiopainike\",\"textField\":\"Tekstikenttä\",\"textarea\":\"Tekstilaatikko\",\"hiddenField\":\"Piilokenttä\",\"button\":\"Painike\",\"select\":\"Valintakenttä\",\"imageButton\":\"Kuvapainike\",\"notSet\":\"<ei asetettu>\",\"id\":\"Tunniste\",\"name\":\"Nimi\",\"langDir\":\"Kielen suunta\",\"langDirLtr\":\"Vasemmalta oikealle (LTR)\",\"langDirRtl\":\"Oikealta vasemmalle (RTL)\",\"langCode\":\"Kielikoodi\",\"longDescr\":\"Pitkän kuvauksen URL\",\"cssClass\":\"Tyyliluokat\",\"advisoryTitle\":\"Avustava otsikko\",\"cssStyle\":\"Tyyli\",\"ok\":\"OK\",\"cancel\":\"Peruuta\",\"close\":\"Sulje\",\"preview\":\"Esikatselu\",\"resize\":\"Raahaa muuttaaksesi kokoa\",\"generalTab\":\"Yleinen\",\"advancedTab\":\"Lisäominaisuudet\",\"validateNumberFailed\":\"Arvon pitää olla numero.\",\"confirmNewPage\":\"Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?\",\"confirmCancel\":\"Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?\",\"options\":\"Asetukset\",\"target\":\"Kohde\",\"targetNew\":\"Uusi ikkuna (_blank)\",\"targetTop\":\"Päällimmäinen ikkuna (_top)\",\"targetSelf\":\"Sama ikkuna (_self)\",\"targetParent\":\"Ylemmän tason ikkuna (_parent)\",\"langDirLTR\":\"Vasemmalta oikealle (LTR)\",\"langDirRTL\":\"Oikealta vasemmalle (RTL)\",\"styles\":\"Tyyli\",\"cssClasses\":\"Tyylitiedoston luokat\",\"width\":\"Leveys\",\"height\":\"Korkeus\",\"align\":\"Kohdistus\",\"alignLeft\":\"Vasemmalle\",\"alignRight\":\"Oikealle\",\"alignCenter\":\"Keskelle\",\"alignJustify\":\"Tasaa molemmat reunat\",\"alignTop\":\"Ylös\",\"alignMiddle\":\"Keskelle\",\"alignBottom\":\"Alas\",\"alignNone\":\"Ei asetettu\",\"invalidValue\":\"Virheellinen arvo.\",\"invalidHeight\":\"Korkeuden täytyy olla numero.\",\"invalidWidth\":\"Leveyden täytyy olla numero.\",\"invalidCssLength\":\"Kentän \\\"%1\\\" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.\",\"invalidHtmlLength\":\"Kentän \\\"%1\\\" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.\",\"invalidInlineStyle\":\"Tyylille annetun arvon täytyy koostua yhdestä tai useammasta \\\"nimi : arvo\\\" parista, jotka ovat eroteltuna toisistaan puolipisteillä.\",\"cssLengthTooltip\":\"Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, ei saatavissa</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Kaikki oikeuden pidätetään.\",\"dlgTitle\":\"Tietoa CKEditorista\",\"help\":\"Katso ohjeet: $1.\",\"moreInfo\":\"Lisenssitiedot löytyvät kotisivuiltamme:\",\"title\":\"Tietoa CKEditorista\",\"userGuide\":\"CKEditorin käyttäjäopas\"},\"basicstyles\":{\"bold\":\"Lihavoitu\",\"italic\":\"Kursivoitu\",\"strike\":\"Yliviivattu\",\"subscript\":\"Alaindeksi\",\"superscript\":\"Yläindeksi\",\"underline\":\"Alleviivattu\"},\"bidi\":{\"ltr\":\"Tekstin suunta vasemmalta oikealle\",\"rtl\":\"Tekstin suunta oikealta vasemmalle\"},\"blockquote\":{\"toolbar\":\"Lainaus\"},\"clipboard\":{\"copy\":\"Kopioi\",\"copyError\":\"Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).\",\"cut\":\"Leikkaa\",\"cutError\":\"Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).\",\"paste\":\"Liitä\",\"pasteArea\":\"Leikealue\",\"pasteMsg\":\"Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.\",\"securityMsg\":\"Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.\",\"title\":\"Liitä\"},\"button\":{\"selectedLabel\":\"%1 (Valittu)\"},\"colorbutton\":{\"auto\":\"Automaattinen\",\"bgColorTitle\":\"Taustaväri\",\"colors\":{\"000\":\"Musta\",\"800000\":\"Kastanjanruskea\",\"8B4513\":\"Satulanruskea\",\"2F4F4F\":\"Tumma liuskekivenharmaa\",\"008080\":\"Sinivihreä\",\"000080\":\"Laivastonsininen\",\"4B0082\":\"Indigonsininen\",\"696969\":\"Tummanharmaa\",\"B22222\":\"Tiili\",\"A52A2A\":\"Ruskea\",\"DAA520\":\"Kultapiisku\",\"006400\":\"Tummanvihreä\",\"40E0D0\":\"Turkoosi\",\"0000CD\":\"Keskisininen\",\"800080\":\"Purppura\",\"808080\":\"Harmaa\",\"F00\":\"Punainen\",\"FF8C00\":\"Tumma oranssi\",\"FFD700\":\"Kulta\",\"008000\":\"Vihreä\",\"0FF\":\"Syaani\",\"00F\":\"Sininen\",\"EE82EE\":\"Violetti\",\"A9A9A9\":\"Tummanharmaa\",\"FFA07A\":\"Vaaleanlohenpunainen\",\"FFA500\":\"Oranssi\",\"FFFF00\":\"Keltainen\",\"00FF00\":\"Limetin vihreä\",\"AFEEEE\":\"Haalea turkoosi\",\"ADD8E6\":\"Vaaleansininen\",\"DDA0DD\":\"Luumu\",\"D3D3D3\":\"Vaaleanharmaa\",\"FFF0F5\":\"Laventelinpunainen\",\"FAEBD7\":\"Antiikinvalkoinen\",\"FFFFE0\":\"Vaaleankeltainen\",\"F0FFF0\":\"Hunajameloni\",\"F0FFFF\":\"Asurinsininen\",\"F0F8FF\":\"Alice Blue -sininen\",\"E6E6FA\":\"Lavanteli\",\"FFF\":\"Valkoinen\"},\"more\":\"Lisää värejä...\",\"panelTitle\":\"Värit\",\"textColorTitle\":\"Tekstiväri\"},\"colordialog\":{\"clear\":\"Poista\",\"highlight\":\"Korostus\",\"options\":\"Värin ominaisuudet\",\"selected\":\"Valittu\",\"title\":\"Valitse väri\"},\"templates\":{\"button\":\"Pohjat\",\"emptyListMsg\":\"(Ei määriteltyjä pohjia)\",\"insertOption\":\"Korvaa koko sisältö\",\"options\":\"Sisältöpohjan ominaisuudet\",\"selectPromptMsg\":\"Valitse editoriin avattava pohja\",\"title\":\"Sisältöpohjat\"},\"contextmenu\":{\"options\":\"Pikavalikon ominaisuudet\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Ohjeistava otsikko\",\"cssClassInputLabel\":\"Tyylitiedoston luokat\",\"edit\":\"Muokkaa Diviä\",\"inlineStyleInputLabel\":\"Sisätyyli\",\"langDirLTRLabel\":\"Vasemmalta oikealle (LTR)\",\"langDirLabel\":\"Kielen suunta\",\"langDirRTLLabel\":\"Oikealta vasemmalle (RTL)\",\"languageCodeInputLabel\":\" Kielen koodi\",\"remove\":\"Poista Div\",\"styleSelectLabel\":\"Tyyli\",\"title\":\"Luo div-kehikko\",\"toolbar\":\"Luo div-kehikko\"},\"toolbar\":{\"toolbarCollapse\":\"Kutista työkalupalkki\",\"toolbarExpand\":\"Laajenna työkalupalkki\",\"toolbarGroups\":{\"document\":\"Dokumentti\",\"clipboard\":\"Leikepöytä/Kumoa\",\"editing\":\"Muokkaus\",\"forms\":\"Lomakkeet\",\"basicstyles\":\"Perustyylit\",\"paragraph\":\"Kappale\",\"links\":\"Linkit\",\"insert\":\"Lisää\",\"styles\":\"Tyylit\",\"colors\":\"Värit\",\"tools\":\"Työkalut\"},\"toolbars\":\"Editorin työkalupalkit\"},\"elementspath\":{\"eleLabel\":\"Elementin polku\",\"eleTitle\":\"%1 elementti\"},\"find\":{\"find\":\"Etsi\",\"findOptions\":\"Hakuasetukset\",\"findWhat\":\"Etsi mitä:\",\"matchCase\":\"Sama kirjainkoko\",\"matchCyclic\":\"Kierrä ympäri\",\"matchWord\":\"Koko sana\",\"notFoundMsg\":\"Etsittyä tekstiä ei löytynyt.\",\"replace\":\"Korvaa\",\"replaceAll\":\"Korvaa kaikki\",\"replaceSuccessMsg\":\"%1 esiintymä(ä) korvattu.\",\"replaceWith\":\"Korvaa tällä:\",\"title\":\"Etsi ja korvaa\"},\"fakeobjects\":{\"anchor\":\"Ankkuri\",\"flash\":\"Flash animaatio\",\"hiddenfield\":\"Piilokenttä\",\"iframe\":\"IFrame-kehys\",\"unknown\":\"Tuntematon objekti\"},\"flash\":{\"access\":\"Skriptien pääsy\",\"accessAlways\":\"Aina\",\"accessNever\":\"Ei koskaan\",\"accessSameDomain\":\"Sama verkkotunnus\",\"alignAbsBottom\":\"Aivan alas\",\"alignAbsMiddle\":\"Aivan keskelle\",\"alignBaseline\":\"Alas (teksti)\",\"alignTextTop\":\"Ylös (teksti)\",\"bgcolor\":\"Taustaväri\",\"chkFull\":\"Salli kokoruututila\",\"chkLoop\":\"Toisto\",\"chkMenu\":\"Näytä Flash-valikko\",\"chkPlay\":\"Automaattinen käynnistys\",\"flashvars\":\"Muuttujat Flash:lle\",\"hSpace\":\"Vaakatila\",\"properties\":\"Flash-ominaisuudet\",\"propertiesTab\":\"Ominaisuudet\",\"quality\":\"Laatu\",\"qualityAutoHigh\":\"Automaattinen korkea\",\"qualityAutoLow\":\"Automaattinen matala\",\"qualityBest\":\"Paras\",\"qualityHigh\":\"Korkea\",\"qualityLow\":\"Matala\",\"qualityMedium\":\"Keskitaso\",\"scale\":\"Levitä\",\"scaleAll\":\"Näytä kaikki\",\"scaleFit\":\"Tarkka koko\",\"scaleNoBorder\":\"Ei rajaa\",\"title\":\"Flash ominaisuudet\",\"vSpace\":\"Pystytila\",\"validateHSpace\":\"Vaakatilan täytyy olla numero.\",\"validateSrc\":\"Linkille on kirjoitettava URL\",\"validateVSpace\":\"Pystytilan täytyy olla numero.\",\"windowMode\":\"Ikkuna tila\",\"windowModeOpaque\":\"Läpinäkyvyys\",\"windowModeTransparent\":\"Läpinäkyvä\",\"windowModeWindow\":\"Ikkuna\"},\"font\":{\"fontSize\":{\"label\":\"Koko\",\"voiceLabel\":\"Kirjaisimen koko\",\"panelTitle\":\"Koko\"},\"label\":\"Kirjaisinlaji\",\"panelTitle\":\"Kirjaisinlaji\",\"voiceLabel\":\"Kirjaisinlaji\"},\"forms\":{\"button\":{\"title\":\"Painikkeen ominaisuudet\",\"text\":\"Teksti (arvo)\",\"type\":\"Tyyppi\",\"typeBtn\":\"Painike\",\"typeSbm\":\"Lähetä\",\"typeRst\":\"Tyhjennä\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Valintaruudun ominaisuudet\",\"radioTitle\":\"Radiopainikkeen ominaisuudet\",\"value\":\"Arvo\",\"selected\":\"Valittu\",\"required\":\"Required\"},\"form\":{\"title\":\"Lomakkeen ominaisuudet\",\"menu\":\"Lomakkeen ominaisuudet\",\"action\":\"Toiminto\",\"method\":\"Tapa\",\"encoding\":\"Enkoodaus\"},\"hidden\":{\"title\":\"Piilokentän ominaisuudet\",\"name\":\"Nimi\",\"value\":\"Arvo\"},\"select\":{\"title\":\"Valintakentän ominaisuudet\",\"selectInfo\":\"Info\",\"opAvail\":\"Ominaisuudet\",\"value\":\"Arvo\",\"size\":\"Koko\",\"lines\":\"Rivit\",\"chkMulti\":\"Salli usea valinta\",\"required\":\"Required\",\"opText\":\"Teksti\",\"opValue\":\"Arvo\",\"btnAdd\":\"Lisää\",\"btnModify\":\"Muuta\",\"btnUp\":\"Ylös\",\"btnDown\":\"Alas\",\"btnSetValue\":\"Aseta valituksi\",\"btnDelete\":\"Poista\"},\"textarea\":{\"title\":\"Tekstilaatikon ominaisuudet\",\"cols\":\"Sarakkeita\",\"rows\":\"Rivejä\"},\"textfield\":{\"title\":\"Tekstikentän ominaisuudet\",\"name\":\"Nimi\",\"value\":\"Arvo\",\"charWidth\":\"Leveys\",\"maxChars\":\"Maksimi merkkimäärä\",\"required\":\"Required\",\"type\":\"Tyyppi\",\"typeText\":\"Teksti\",\"typePass\":\"Salasana\",\"typeEmail\":\"Sähköposti\",\"typeSearch\":\"Haku\",\"typeTel\":\"Puhelinnumero\",\"typeUrl\":\"Osoite\"}},\"format\":{\"label\":\"Muotoilu\",\"panelTitle\":\"Muotoilu\",\"tag_address\":\"Osoite\",\"tag_div\":\"Normaali (DIV)\",\"tag_h1\":\"Otsikko 1\",\"tag_h2\":\"Otsikko 2\",\"tag_h3\":\"Otsikko 3\",\"tag_h4\":\"Otsikko 4\",\"tag_h5\":\"Otsikko 5\",\"tag_h6\":\"Otsikko 6\",\"tag_p\":\"Normaali\",\"tag_pre\":\"Muotoiltu\"},\"horizontalrule\":{\"toolbar\":\"Lisää murtoviiva\"},\"iframe\":{\"border\":\"Näytä kehyksen reunat\",\"noUrl\":\"Anna IFrame-kehykselle lähdeosoite (src)\",\"scrolling\":\"Näytä vierityspalkit\",\"title\":\"IFrame-kehyksen ominaisuudet\",\"toolbar\":\"IFrame-kehys\"},\"image\":{\"alt\":\"Vaihtoehtoinen teksti\",\"border\":\"Kehys\",\"btnUpload\":\"Lähetä palvelimelle\",\"button2Img\":\"Haluatko muuntaa valitun kuvanäppäimen kuvaksi?\",\"hSpace\":\"Vaakatila\",\"img2Button\":\"Haluatko muuntaa valitun kuvan kuvanäppäimeksi?\",\"infoTab\":\"Kuvan tiedot\",\"linkTab\":\"Linkki\",\"lockRatio\":\"Lukitse suhteet\",\"menu\":\"Kuvan ominaisuudet\",\"resetSize\":\"Alkuperäinen koko\",\"title\":\"Kuvan ominaisuudet\",\"titleButton\":\"Kuvapainikkeen ominaisuudet\",\"upload\":\"Lisää kuva\",\"urlMissing\":\"Kuvan lähdeosoite puuttuu.\",\"vSpace\":\"Pystytila\",\"validateBorder\":\"Kehyksen täytyy olla kokonaisluku.\",\"validateHSpace\":\"HSpace-määrityksen täytyy olla kokonaisluku.\",\"validateVSpace\":\"VSpace-määrityksen täytyy olla kokonaisluku.\"},\"indent\":{\"indent\":\"Suurenna sisennystä\",\"outdent\":\"Pienennä sisennystä\"},\"smiley\":{\"options\":\"Hymiön ominaisuudet\",\"title\":\"Lisää hymiö\",\"toolbar\":\"Hymiö\"},\"justify\":{\"block\":\"Tasaa molemmat reunat\",\"center\":\"Keskitä\",\"left\":\"Tasaa vasemmat reunat\",\"right\":\"Tasaa oikeat reunat\"},\"language\":{\"button\":\"Aseta kieli\",\"remove\":\"Poista kieli\"},\"link\":{\"acccessKey\":\"Pikanäppäin\",\"advanced\":\"Lisäominaisuudet\",\"advisoryContentType\":\"Avustava sisällön tyyppi\",\"advisoryTitle\":\"Avustava otsikko\",\"anchor\":{\"toolbar\":\"Lisää ankkuri/muokkaa ankkuria\",\"menu\":\"Ankkurin ominaisuudet\",\"title\":\"Ankkurin ominaisuudet\",\"name\":\"Nimi\",\"errorName\":\"Ankkurille on kirjoitettava nimi\",\"remove\":\"Poista ankkuri\"},\"anchorId\":\"Ankkurin ID:n mukaan\",\"anchorName\":\"Ankkurin nimen mukaan\",\"charset\":\"Linkitetty kirjaimisto\",\"cssClasses\":\"Tyyliluokat\",\"emailAddress\":\"Sähköpostiosoite\",\"emailBody\":\"Viesti\",\"emailSubject\":\"Aihe\",\"id\":\"Tunniste\",\"info\":\"Linkin tiedot\",\"langCode\":\"Kielen suunta\",\"langDir\":\"Kielen suunta\",\"langDirLTR\":\"Vasemmalta oikealle (LTR)\",\"langDirRTL\":\"Oikealta vasemmalle (RTL)\",\"menu\":\"Muokkaa linkkiä\",\"name\":\"Nimi\",\"noAnchors\":\"(Ei ankkureita tässä dokumentissa)\",\"noEmail\":\"Kirjoita sähköpostiosoite\",\"noUrl\":\"Linkille on kirjoitettava URL\",\"other\":\"<muu>\",\"popupDependent\":\"Riippuva (Netscape)\",\"popupFeatures\":\"Popup ikkunan ominaisuudet\",\"popupFullScreen\":\"Täysi ikkuna (IE)\",\"popupLeft\":\"Vasemmalta (px)\",\"popupLocationBar\":\"Osoiterivi\",\"popupMenuBar\":\"Valikkorivi\",\"popupResizable\":\"Venytettävä\",\"popupScrollBars\":\"Vierityspalkit\",\"popupStatusBar\":\"Tilarivi\",\"popupToolbar\":\"Vakiopainikkeet\",\"popupTop\":\"Ylhäältä (px)\",\"rel\":\"Suhde\",\"selectAnchor\":\"Valitse ankkuri\",\"styles\":\"Tyyli\",\"tabIndex\":\"Tabulaattori indeksi\",\"target\":\"Kohde\",\"targetFrame\":\"<kehys>\",\"targetFrameName\":\"Kohdekehyksen nimi\",\"targetPopup\":\"<popup ikkuna>\",\"targetPopupName\":\"Popup ikkunan nimi\",\"title\":\"Linkki\",\"toAnchor\":\"Ankkuri tässä sivussa\",\"toEmail\":\"Sähköposti\",\"toUrl\":\"Osoite\",\"toolbar\":\"Lisää linkki/muokkaa linkkiä\",\"type\":\"Linkkityyppi\",\"unlink\":\"Poista linkki\",\"upload\":\"Lisää tiedosto\"},\"list\":{\"bulletedlist\":\"Luettelomerkit\",\"numberedlist\":\"Numerointi\"},\"liststyle\":{\"armenian\":\"Armeenialainen numerointi\",\"bulletedTitle\":\"Numeroimattoman listan ominaisuudet\",\"circle\":\"Ympyrä\",\"decimal\":\"Desimaalit (1, 2, 3, jne.)\",\"decimalLeadingZero\":\"Desimaalit, alussa nolla (01, 02, 03, jne.)\",\"disc\":\"Levy\",\"georgian\":\"Georgialainen numerointi (an, ban, gan, etc.)\",\"lowerAlpha\":\"Pienet aakkoset (a, b, c, d, e, jne.)\",\"lowerGreek\":\"Pienet kreikkalaiset (alpha, beta, gamma, jne.)\",\"lowerRoman\":\"Pienet roomalaiset (i, ii, iii, iv, v, jne.)\",\"none\":\"Ei mikään\",\"notset\":\"<ei asetettu>\",\"numberedTitle\":\"Numeroidun listan ominaisuudet\",\"square\":\"Neliö\",\"start\":\"Alku\",\"type\":\"Tyyppi\",\"upperAlpha\":\"Isot aakkoset (A, B, C, D, E, jne.)\",\"upperRoman\":\"Isot roomalaiset (I, II, III, IV, V, jne.)\",\"validateStartNumber\":\"Listan ensimmäisen numeron tulee olla kokonaisluku.\"},\"magicline\":{\"title\":\"Lisää kappale tähän.\"},\"maximize\":{\"maximize\":\"Suurenna\",\"minimize\":\"Pienennä\"},\"newpage\":{\"toolbar\":\"Tyhjennä\"},\"pagebreak\":{\"alt\":\"Sivunvaihto\",\"toolbar\":\"Lisää sivunvaihto\"},\"pastetext\":{\"button\":\"Liitä tekstinä\",\"title\":\"Liitä tekstinä\"},\"pastefromword\":{\"confirmCleanup\":\"Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)\",\"error\":\"Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia\",\"title\":\"Liitä Word-dokumentista\",\"toolbar\":\"Liitä Word-dokumentista\"},\"preview\":{\"preview\":\"Esikatsele\"},\"print\":{\"toolbar\":\"Tulosta\"},\"removeformat\":{\"toolbar\":\"Poista muotoilu\"},\"save\":{\"toolbar\":\"Tallenna\"},\"selectall\":{\"toolbar\":\"Valitse kaikki\"},\"showblocks\":{\"toolbar\":\"Näytä elementit\"},\"sourcearea\":{\"toolbar\":\"Koodi\"},\"specialchar\":{\"options\":\"Erikoismerkin ominaisuudet\",\"title\":\"Valitse erikoismerkki\",\"toolbar\":\"Lisää erikoismerkki\"},\"scayt\":{\"btn_about\":\"Tietoja oikoluvusta kirjoitetaessa\",\"btn_dictionaries\":\"Sanakirjat\",\"btn_disable\":\"Poista käytöstä oikoluku kirjoitetaessa\",\"btn_enable\":\"Ota käyttöön oikoluku kirjoitettaessa\",\"btn_langs\":\"Kielet\",\"btn_options\":\"Asetukset\",\"text_title\":\"Oikolue kirjoitettaessa\"},\"stylescombo\":{\"label\":\"Tyyli\",\"panelTitle\":\"Muotoilujen tyylit\",\"panelTitle1\":\"Lohkojen tyylit\",\"panelTitle2\":\"Rivinsisäiset tyylit\",\"panelTitle3\":\"Objektien tyylit\"},\"table\":{\"border\":\"Rajan paksuus\",\"caption\":\"Otsikko\",\"cell\":{\"menu\":\"Solu\",\"insertBefore\":\"Lisää solu eteen\",\"insertAfter\":\"Lisää solu perään\",\"deleteCell\":\"Poista solut\",\"merge\":\"Yhdistä solut\",\"mergeRight\":\"Yhdistä oikealla olevan kanssa\",\"mergeDown\":\"Yhdistä alla olevan kanssa\",\"splitHorizontal\":\"Jaa solu vaakasuunnassa\",\"splitVertical\":\"Jaa solu pystysuunnassa\",\"title\":\"Solun ominaisuudet\",\"cellType\":\"Solun tyyppi\",\"rowSpan\":\"Rivin jatkuvuus\",\"colSpan\":\"Solun jatkuvuus\",\"wordWrap\":\"Rivitys\",\"hAlign\":\"Horisontaali kohdistus\",\"vAlign\":\"Vertikaali kohdistus\",\"alignBaseline\":\"Alas (teksti)\",\"bgColor\":\"Taustan väri\",\"borderColor\":\"Reunan väri\",\"data\":\"Data\",\"header\":\"Ylätunniste\",\"yes\":\"Kyllä\",\"no\":\"Ei\",\"invalidWidth\":\"Solun leveyden täytyy olla numero.\",\"invalidHeight\":\"Solun korkeuden täytyy olla numero.\",\"invalidRowSpan\":\"Rivin jatkuvuuden täytyy olla kokonaisluku.\",\"invalidColSpan\":\"Solun jatkuvuuden täytyy olla kokonaisluku.\",\"chooseColor\":\"Valitse\"},\"cellPad\":\"Solujen sisennys\",\"cellSpace\":\"Solujen väli\",\"column\":{\"menu\":\"Sarake\",\"insertBefore\":\"Lisää sarake vasemmalle\",\"insertAfter\":\"Lisää sarake oikealle\",\"deleteColumn\":\"Poista sarakkeet\"},\"columns\":\"Sarakkeet\",\"deleteTable\":\"Poista taulu\",\"headers\":\"Ylätunnisteet\",\"headersBoth\":\"Molemmat\",\"headersColumn\":\"Ensimmäinen sarake\",\"headersNone\":\"Ei\",\"headersRow\":\"Ensimmäinen rivi\",\"invalidBorder\":\"Reunan koon täytyy olla numero.\",\"invalidCellPadding\":\"Solujen sisennyksen täytyy olla numero.\",\"invalidCellSpacing\":\"Solujen välin täytyy olla numero.\",\"invalidCols\":\"Sarakkeiden määrän täytyy olla suurempi kuin 0.\",\"invalidHeight\":\"Taulun korkeuden täytyy olla numero.\",\"invalidRows\":\"Rivien määrän täytyy olla suurempi kuin 0.\",\"invalidWidth\":\"Taulun leveyden täytyy olla numero.\",\"menu\":\"Taulun ominaisuudet\",\"row\":{\"menu\":\"Rivi\",\"insertBefore\":\"Lisää rivi yläpuolelle\",\"insertAfter\":\"Lisää rivi alapuolelle\",\"deleteRow\":\"Poista rivit\"},\"rows\":\"Rivit\",\"summary\":\"Yhteenveto\",\"title\":\"Taulun ominaisuudet\",\"toolbar\":\"Taulu\",\"widthPc\":\"prosenttia\",\"widthPx\":\"pikseliä\",\"widthUnit\":\"leveysyksikkö\"},\"undo\":{\"redo\":\"Toista\",\"undo\":\"Kumoa\"},\"wsc\":{\"btnIgnore\":\"Jätä huomioimatta\",\"btnIgnoreAll\":\"Jätä kaikki huomioimatta\",\"btnReplace\":\"Korvaa\",\"btnReplaceAll\":\"Korvaa kaikki\",\"btnUndo\":\"Kumoa\",\"changeTo\":\"Vaihda\",\"errorLoading\":\"Virhe ladattaessa oikolukupalvelua isännältä: %s.\",\"ieSpellDownload\":\"Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?\",\"manyChanges\":\"Tarkistus valmis: %1 sanaa muutettiin\",\"noChanges\":\"Tarkistus valmis: Yhtään sanaa ei muutettu\",\"noMispell\":\"Tarkistus valmis: Ei virheitä\",\"noSuggestions\":\"Ei ehdotuksia\",\"notAvailable\":\"Valitettavasti oikoluku ei ole käytössä tällä hetkellä.\",\"notInDic\":\"Ei sanakirjassa\",\"oneChange\":\"Tarkistus valmis: Yksi sana muutettiin\",\"progress\":\"Tarkistus käynnissä...\",\"title\":\"Oikoluku\",\"toolbar\":\"Tarkista oikeinkirjoitus\"}};"
  },
  {
    "path": "assets/ckeditor/lang/fo.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['fo']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Trýst ALT og 0 fyri vegleiðing\",\"browseServer\":\"Ambætarakagi\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Send til ambætaran\",\"uploadSubmit\":\"Send til ambætaran\",\"image\":\"Myndir\",\"flash\":\"Flash\",\"form\":\"Formur\",\"checkbox\":\"Flugubein\",\"radio\":\"Radioknøttur\",\"textField\":\"Tekstteigur\",\"textarea\":\"Tekstumráði\",\"hiddenField\":\"Fjaldur teigur\",\"button\":\"Knøttur\",\"select\":\"Valskrá\",\"imageButton\":\"Myndaknøttur\",\"notSet\":\"<ikki sett>\",\"id\":\"Id\",\"name\":\"Navn\",\"langDir\":\"Tekstkós\",\"langDirLtr\":\"Frá vinstru til høgru (LTR)\",\"langDirRtl\":\"Frá høgru til vinstru (RTL)\",\"langCode\":\"Málkoda\",\"longDescr\":\"Víðkað URL frágreiðing\",\"cssClass\":\"Typografi klassar\",\"advisoryTitle\":\"Vegleiðandi heiti\",\"cssStyle\":\"Typografi\",\"ok\":\"Góðkent\",\"cancel\":\"Avlýs\",\"close\":\"Lat aftur\",\"preview\":\"Frumsýn\",\"resize\":\"Drag fyri at broyta stødd\",\"generalTab\":\"Generelt\",\"advancedTab\":\"Fjølbroytt\",\"validateNumberFailed\":\"Hetta er ikki eitt tal.\",\"confirmNewPage\":\"Allar ikki goymdar broytingar í hesum innihaldið hvørva. Skal nýggj síða lesast kortini?\",\"confirmCancel\":\"Nakrir valmøguleikar eru broyttir. Ert tú vísur í, at dialogurin skal latast aftur?\",\"options\":\"Options\",\"target\":\"Target\",\"targetNew\":\"Nýtt vindeyga (_blank)\",\"targetTop\":\"Vindeyga ovast (_top)\",\"targetSelf\":\"Sama vindeyga (_self)\",\"targetParent\":\"Upphavligt vindeyga (_parent)\",\"langDirLTR\":\"Frá vinstru til høgru (LTR)\",\"langDirRTL\":\"Frá høgru til vinstru (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Breidd\",\"height\":\"Hædd\",\"align\":\"Justering\",\"alignLeft\":\"Vinstra\",\"alignRight\":\"Høgra\",\"alignCenter\":\"Miðsett\",\"alignJustify\":\"Javnir tekstkantar\",\"alignTop\":\"Ovast\",\"alignMiddle\":\"Miðja\",\"alignBottom\":\"Botnur\",\"alignNone\":\"Eingin\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Hædd má vera eitt tal.\",\"invalidWidth\":\"Breidd má vera eitt tal.\",\"invalidCssLength\":\"Virðið sett í \\\"%1\\\" feltið má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px, %, in, cm, mm, em, ex, pt, ella pc).\",\"invalidHtmlLength\":\"Virðið sett í \\\"%1\\\" feltiðield má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px ella %).\",\"invalidInlineStyle\":\"Virði specifiserað fyri inline style má hava eitt ella fleiri pør (tuples) skrivað sum \\\"name : value\\\", hvørt parið sundurskilt við semi-colon.\",\"cssLengthTooltip\":\"Skriva eitt tal fyri eitt virði í pixels ella eitt tal við gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, ikki tøkt</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"Um CKEditor\",\"help\":\"Kekka $1 fyri hjálp.\",\"moreInfo\":\"Licens upplýsingar finnast á heimasíðu okkara:\",\"title\":\"Um CKEditor\",\"userGuide\":\"CKEditor Brúkaravegleiðing\"},\"basicstyles\":{\"bold\":\"Feit skrift\",\"italic\":\"Skráskrift\",\"strike\":\"Yvirstrikað\",\"subscript\":\"Lækkað skrift\",\"superscript\":\"Hækkað skrift\",\"underline\":\"Undirstrikað\"},\"bidi\":{\"ltr\":\"Tekstkós frá vinstru til høgru\",\"rtl\":\"Tekstkós frá høgru til vinstru\"},\"blockquote\":{\"toolbar\":\"Blockquote\"},\"clipboard\":{\"copy\":\"Avrita\",\"copyError\":\"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).\",\"cut\":\"Kvett\",\"cutError\":\"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).\",\"paste\":\"Innrita\",\"pasteArea\":\"Avritingarumráði\",\"pasteMsg\":\"Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.\",\"securityMsg\":\"Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.\",\"title\":\"Innrita\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatiskt\",\"bgColorTitle\":\"Bakgrundslitur\",\"colors\":{\"000\":\"Svart\",\"800000\":\"Maroon\",\"8B4513\":\"Saðilsbrúnt\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Myrkagrátt\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brúnt\",\"DAA520\":\"Gullstavur\",\"006400\":\"Myrkagrønt\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Meðal blátt\",\"800080\":\"Purple\",\"808080\":\"Grátt\",\"F00\":\"Reytt\",\"FF8C00\":\"Myrkt appelsingult\",\"FFD700\":\"Gull\",\"008000\":\"Grønt\",\"0FF\":\"Cyan\",\"00F\":\"Blátt\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Døkt grátt\",\"FFA07A\":\"Ljósur laksur\",\"FFA500\":\"Appelsingult\",\"FFFF00\":\"Gult\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Ljósablátt\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Ljósagrátt\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Klassiskt hvítt\",\"FFFFE0\":\"Ljósagult\",\"F0FFF0\":\"Hunangsdøggur\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blátt\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Hvítt\"},\"more\":\"Fleiri litir...\",\"panelTitle\":\"Litir\",\"textColorTitle\":\"Tekstlitur\"},\"colordialog\":{\"clear\":\"Strika\",\"highlight\":\"Framheva\",\"options\":\"Litmøguleikar\",\"selected\":\"Valdur litur\",\"title\":\"Vel lit\"},\"templates\":{\"button\":\"Skabelónir\",\"emptyListMsg\":\"(Ongar skabelónir tøkar)\",\"insertOption\":\"Yvirskriva núverandi innihald\",\"options\":\"Møguleikar fyri Template\",\"selectPromptMsg\":\"Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum<br>(Hetta yvirskrivar núverandi innihald):\",\"title\":\"Innihaldsskabelónir\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Redigera Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Vinstru til høgru (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Høgru til vinstru (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Strika Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Ger Div Container\",\"toolbar\":\"Ger Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Lat Toolbar aftur\",\"toolbarExpand\":\"Vís Toolbar\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editering\",\"forms\":\"Formar\",\"basicstyles\":\"Grundleggjandi Styles\",\"paragraph\":\"Reglubrot\",\"links\":\"Leinkjur\",\"insert\":\"Set inn\",\"styles\":\"Styles\",\"colors\":\"Litir\",\"tools\":\"Tól\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Slóð til elementir\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Leita\",\"findOptions\":\"Finn møguleikar\",\"findWhat\":\"Finn:\",\"matchCase\":\"Munur á stórum og smáum bókstavum\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Bert heil orð\",\"notFoundMsg\":\"Leititeksturin varð ikki funnin\",\"replace\":\"Yvirskriva\",\"replaceAll\":\"Yvirskriva alt\",\"replaceSuccessMsg\":\"%1 úrslit broytt.\",\"replaceWith\":\"Yvirskriva við:\",\"title\":\"Finn og broyt\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Fjaldur teigur\",\"iframe\":\"IFrame\",\"unknown\":\"Ókent Object\"},\"flash\":{\"access\":\"Script atgongd\",\"accessAlways\":\"Altíð\",\"accessNever\":\"Ongantíð\",\"accessSameDomain\":\"Sama navnaøki\",\"alignAbsBottom\":\"Abs botnur\",\"alignAbsMiddle\":\"Abs miðja\",\"alignBaseline\":\"Basislinja\",\"alignTextTop\":\"Tekst toppur\",\"bgcolor\":\"Bakgrundslitur\",\"chkFull\":\"Loyv fullan skerm\",\"chkLoop\":\"Endurspæl\",\"chkMenu\":\"Ger Flash skrá virkna\",\"chkPlay\":\"Avspælingin byrjar sjálv\",\"flashvars\":\"Variablar fyri Flash\",\"hSpace\":\"Høgri breddi\",\"properties\":\"Flash eginleikar\",\"propertiesTab\":\"Eginleikar\",\"quality\":\"Góðska\",\"qualityAutoHigh\":\"Auto høg\",\"qualityAutoLow\":\"Auto Lág\",\"qualityBest\":\"Besta\",\"qualityHigh\":\"Høg\",\"qualityLow\":\"Lág\",\"qualityMedium\":\"Meðal\",\"scale\":\"Skalering\",\"scaleAll\":\"Vís alt\",\"scaleFit\":\"Neyv skalering\",\"scaleNoBorder\":\"Eingin bordi\",\"title\":\"Flash eginleikar\",\"vSpace\":\"Vinstri breddi\",\"validateHSpace\":\"HSpace má vera eitt tal.\",\"validateSrc\":\"Vinarliga skriva tilknýti (URL)\",\"validateVSpace\":\"VSpace má vera eitt tal.\",\"windowMode\":\"Slag av rúti\",\"windowModeOpaque\":\"Ikki transparent\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Rútur\"},\"font\":{\"fontSize\":{\"label\":\"Skriftstødd\",\"voiceLabel\":\"Skriftstødd\",\"panelTitle\":\"Skriftstødd\"},\"label\":\"Skrift\",\"panelTitle\":\"Skrift\",\"voiceLabel\":\"Skrift\"},\"forms\":{\"button\":{\"title\":\"Eginleikar fyri knøtt\",\"text\":\"Tekstur\",\"type\":\"Slag\",\"typeBtn\":\"Knøttur\",\"typeSbm\":\"Send\",\"typeRst\":\"Nullstilla\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Eginleikar fyri flugubein\",\"radioTitle\":\"Eginleikar fyri radioknøtt\",\"value\":\"Virði\",\"selected\":\"Valt\",\"required\":\"Required\"},\"form\":{\"title\":\"Eginleikar fyri Form\",\"menu\":\"Eginleikar fyri Form\",\"action\":\"Hending\",\"method\":\"Háttur\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Eginleikar fyri fjaldan teig\",\"name\":\"Navn\",\"value\":\"Virði\"},\"select\":{\"title\":\"Eginleikar fyri valskrá\",\"selectInfo\":\"Upplýsingar\",\"opAvail\":\"Tøkir møguleikar\",\"value\":\"Virði\",\"size\":\"Stødd\",\"lines\":\"Linjur\",\"chkMulti\":\"Loyv fleiri valmøguleikum samstundis\",\"required\":\"Required\",\"opText\":\"Tekstur\",\"opValue\":\"Virði\",\"btnAdd\":\"Legg afturat\",\"btnModify\":\"Broyt\",\"btnUp\":\"Upp\",\"btnDown\":\"Niður\",\"btnSetValue\":\"Set sum valt virði\",\"btnDelete\":\"Strika\"},\"textarea\":{\"title\":\"Eginleikar fyri tekstumráði\",\"cols\":\"kolonnur\",\"rows\":\"røðir\"},\"textfield\":{\"title\":\"Eginleikar fyri tekstteig\",\"name\":\"Navn\",\"value\":\"Virði\",\"charWidth\":\"Breidd (sjónlig tekn)\",\"maxChars\":\"Mest loyvdu tekn\",\"required\":\"Required\",\"type\":\"Slag\",\"typeText\":\"Tekstur\",\"typePass\":\"Loyniorð\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Skriftsnið\",\"panelTitle\":\"Skriftsnið\",\"tag_address\":\"Adressa\",\"tag_div\":\"Vanligt (DIV)\",\"tag_h1\":\"Yvirskrift 1\",\"tag_h2\":\"Yvirskrift 2\",\"tag_h3\":\"Yvirskrift 3\",\"tag_h4\":\"Yvirskrift 4\",\"tag_h5\":\"Yvirskrift 5\",\"tag_h6\":\"Yvirskrift 6\",\"tag_p\":\"Vanligt\",\"tag_pre\":\"Sniðgivið\"},\"horizontalrule\":{\"toolbar\":\"Ger vatnrætta linju\"},\"iframe\":{\"border\":\"Vís frame kant\",\"noUrl\":\"Vinarliga skriva URL til iframe\",\"scrolling\":\"Loyv scrollbars\",\"title\":\"Møguleikar fyri IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativur tekstur\",\"border\":\"Bordi\",\"btnUpload\":\"Send til ambætaran\",\"button2Img\":\"Skal valdi myndaknøttur gerast til vanliga mynd?\",\"hSpace\":\"Høgri breddi\",\"img2Button\":\"Skal valda mynd gerast til myndaknøtt?\",\"infoTab\":\"Myndaupplýsingar\",\"linkTab\":\"Tilknýti\",\"lockRatio\":\"Læs lutfallið\",\"menu\":\"Myndaeginleikar\",\"resetSize\":\"Upprunastødd\",\"title\":\"Myndaeginleikar\",\"titleButton\":\"Eginleikar fyri myndaknøtt\",\"upload\":\"Send\",\"urlMissing\":\"URL til mynd manglar.\",\"vSpace\":\"Vinstri breddi\",\"validateBorder\":\"Bordi má vera eitt heiltal.\",\"validateHSpace\":\"HSpace má vera eitt heiltal.\",\"validateVSpace\":\"VSpace má vera eitt heiltal.\"},\"indent\":{\"indent\":\"Økja reglubrotarinntriv\",\"outdent\":\"Minka reglubrotarinntriv\"},\"smiley\":{\"options\":\"Møguleikar fyri Smiley\",\"title\":\"Vel Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Javnir tekstkantar\",\"center\":\"Miðsett\",\"left\":\"Vinstrasett\",\"right\":\"Høgrasett\"},\"language\":{\"button\":\"Velja tungumál\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Snarvegisknöttur\",\"advanced\":\"Fjølbroytt\",\"advisoryContentType\":\"Vegleiðandi innihaldsslag\",\"advisoryTitle\":\"Vegleiðandi heiti\",\"anchor\":{\"toolbar\":\"Ger/broyt marknastein\",\"menu\":\"Eginleikar fyri marknastein\",\"title\":\"Eginleikar fyri marknastein\",\"name\":\"Heiti marknasteinsins\",\"errorName\":\"Vinarliga rita marknasteinsins heiti\",\"remove\":\"Strika marknastein\"},\"anchorId\":\"Eftir element Id\",\"anchorName\":\"Eftir navni á marknasteini\",\"charset\":\"Atknýtt teknsett\",\"cssClasses\":\"Typografi klassar\",\"emailAddress\":\"Teldupost-adressa\",\"emailBody\":\"Breyðtekstur\",\"emailSubject\":\"Evni\",\"id\":\"Id\",\"info\":\"Tilknýtis upplýsingar\",\"langCode\":\"Tekstkós\",\"langDir\":\"Tekstkós\",\"langDirLTR\":\"Frá vinstru til høgru (LTR)\",\"langDirRTL\":\"Frá høgru til vinstru (RTL)\",\"menu\":\"Broyt tilknýti\",\"name\":\"Navn\",\"noAnchors\":\"(Eingir marknasteinar eru í hesum dokumentið)\",\"noEmail\":\"Vinarliga skriva teldupost-adressu\",\"noUrl\":\"Vinarliga skriva tilknýti (URL)\",\"other\":\"<annað>\",\"popupDependent\":\"Bundið (Netscape)\",\"popupFeatures\":\"Popup vindeygans víðkaðu eginleikar\",\"popupFullScreen\":\"Fullur skermur (IE)\",\"popupLeft\":\"Frástøða frá vinstru\",\"popupLocationBar\":\"Adressulinja\",\"popupMenuBar\":\"Skrábjálki\",\"popupResizable\":\"Stødd kann broytast\",\"popupScrollBars\":\"Rullibjálki\",\"popupStatusBar\":\"Støðufrágreiðingarbjálki\",\"popupToolbar\":\"Amboðsbjálki\",\"popupTop\":\"Frástøða frá íerva\",\"rel\":\"Relatión\",\"selectAnchor\":\"Vel ein marknastein\",\"styles\":\"Typografi\",\"tabIndex\":\"Tabulator indeks\",\"target\":\"Target\",\"targetFrame\":\"<ramma>\",\"targetFrameName\":\"Vís navn vindeygans\",\"targetPopup\":\"<popup vindeyga>\",\"targetPopupName\":\"Popup vindeygans navn\",\"title\":\"Tilknýti\",\"toAnchor\":\"Tilknýti til marknastein í tekstinum\",\"toEmail\":\"Teldupostur\",\"toUrl\":\"URL\",\"toolbar\":\"Ger/broyt tilknýti\",\"type\":\"Tilknýtisslag\",\"unlink\":\"Strika tilknýti\",\"upload\":\"Send til ambætaran\"},\"list\":{\"bulletedlist\":\"Punktmerktur listi\",\"numberedlist\":\"Talmerktur listi\"},\"liststyle\":{\"armenian\":\"Armensk talskipan\",\"bulletedTitle\":\"Eginleikar fyri lista við prikkum\",\"circle\":\"Sirkul\",\"decimal\":\"Vanlig tøl (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Tøl við null frammanfyri (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgisk talskipan (an, ban, gan, osv.)\",\"lowerAlpha\":\"Lítlir bókstavir (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Grikskt við lítlum (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lítil rómaratøl (i, ii, iii, iv, v, etc.)\",\"none\":\"Einki\",\"notset\":\"<ikki sett>\",\"numberedTitle\":\"Eginleikar fyri lista við tølum\",\"square\":\"Fýrkantur\",\"start\":\"Byrjan\",\"type\":\"Slag\",\"upperAlpha\":\"Stórir bókstavir (A, B, C, D, E, etc.)\",\"upperRoman\":\"Stór rómaratøl (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Byrjunartalið fyri lista má vera eitt heiltal.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maksimera\",\"minimize\":\"Minimera\"},\"newpage\":{\"toolbar\":\"Nýggj síða\"},\"pagebreak\":{\"alt\":\"Síðuskift\",\"toolbar\":\"Ger síðuskift\"},\"pastetext\":{\"button\":\"Innrita som reinan tekst\",\"title\":\"Innrita som reinan tekst\"},\"pastefromword\":{\"confirmCleanup\":\"Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?\",\"error\":\"Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil\",\"title\":\"Innrita frá Word\",\"toolbar\":\"Innrita frá Word\"},\"preview\":{\"preview\":\"Frumsýning\"},\"print\":{\"toolbar\":\"Prenta\"},\"removeformat\":{\"toolbar\":\"Strika sniðgeving\"},\"save\":{\"toolbar\":\"Goym\"},\"selectall\":{\"toolbar\":\"Markera alt\"},\"showblocks\":{\"toolbar\":\"Vís blokkar\"},\"sourcearea\":{\"toolbar\":\"Kelda\"},\"specialchar\":{\"options\":\"Møguleikar við serteknum\",\"title\":\"Vel sertekn\",\"toolbar\":\"Set inn sertekn\"},\"scayt\":{\"btn_about\":\"Um SCAYT\",\"btn_dictionaries\":\"Orðabøkur\",\"btn_disable\":\"Nokta SCAYT\",\"btn_enable\":\"Loyv SCAYT\",\"btn_langs\":\"Tungumál\",\"btn_options\":\"Uppseting\",\"text_title\":\"Kanna stavseting, meðan tú skrivar\"},\"stylescombo\":{\"label\":\"Typografi\",\"panelTitle\":\"Formatterings stílir\",\"panelTitle1\":\"Blokk stílir\",\"panelTitle2\":\"Inline stílir\",\"panelTitle3\":\"Object stílir\"},\"table\":{\"border\":\"Bordabreidd\",\"caption\":\"Tabellfrágreiðing\",\"cell\":{\"menu\":\"Meski\",\"insertBefore\":\"Set meska inn áðrenn\",\"insertAfter\":\"Set meska inn aftaná\",\"deleteCell\":\"Strika meskar\",\"merge\":\"Flætta meskar\",\"mergeRight\":\"Flætta meskar til høgru\",\"mergeDown\":\"Flætta saman\",\"splitHorizontal\":\"Kloyv meska vatnrætt\",\"splitVertical\":\"Kloyv meska loddrætt\",\"title\":\"Mesku eginleikar\",\"cellType\":\"Mesku slag\",\"rowSpan\":\"Ræð spenni\",\"colSpan\":\"Kolonnu spenni\",\"wordWrap\":\"Orðkloyving\",\"hAlign\":\"Horisontal plasering\",\"vAlign\":\"Loddrøtt plasering\",\"alignBaseline\":\"Basislinja\",\"bgColor\":\"Bakgrundslitur\",\"borderColor\":\"Bordalitur\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Ja\",\"no\":\"Nei\",\"invalidWidth\":\"Meskubreidd má vera eitt tal.\",\"invalidHeight\":\"Meskuhædd má vera eitt tal.\",\"invalidRowSpan\":\"Raðspennið má vera eitt heiltal.\",\"invalidColSpan\":\"Kolonnuspennið má vera eitt heiltal.\",\"chooseColor\":\"Vel\"},\"cellPad\":\"Meskubreddi\",\"cellSpace\":\"Fjarstøða millum meskar\",\"column\":{\"menu\":\"Kolonna\",\"insertBefore\":\"Set kolonnu inn áðrenn\",\"insertAfter\":\"Set kolonnu inn aftaná\",\"deleteColumn\":\"Strika kolonnur\"},\"columns\":\"Kolonnur\",\"deleteTable\":\"Strika tabell\",\"headers\":\"Yvirskriftir\",\"headersBoth\":\"Báðir\",\"headersColumn\":\"Fyrsta kolonna\",\"headersNone\":\"Eingin\",\"headersRow\":\"Fyrsta rað\",\"invalidBorder\":\"Borda-stødd má vera eitt tal.\",\"invalidCellPadding\":\"Cell padding má vera eitt tal.\",\"invalidCellSpacing\":\"Cell spacing má vera eitt tal.\",\"invalidCols\":\"Talið av kolonnum má vera eitt tal størri enn 0.\",\"invalidHeight\":\"Tabell-hædd má vera eitt tal.\",\"invalidRows\":\"Talið av røðum má vera eitt tal størri enn 0.\",\"invalidWidth\":\"Tabell-breidd má vera eitt tal.\",\"menu\":\"Eginleikar fyri tabell\",\"row\":{\"menu\":\"Rað\",\"insertBefore\":\"Set rað inn áðrenn\",\"insertAfter\":\"Set rað inn aftaná\",\"deleteRow\":\"Strika røðir\"},\"rows\":\"Røðir\",\"summary\":\"Samandráttur\",\"title\":\"Eginleikar fyri tabell\",\"toolbar\":\"Tabell\",\"widthPc\":\"prosent\",\"widthPx\":\"pixels\",\"widthUnit\":\"breiddar unit\"},\"undo\":{\"redo\":\"Vend aftur\",\"undo\":\"Angra\"},\"wsc\":{\"btnIgnore\":\"Forfjóna\",\"btnIgnoreAll\":\"Forfjóna alt\",\"btnReplace\":\"Yvirskriva\",\"btnReplaceAll\":\"Yvirskriva alt\",\"btnUndo\":\"Angra\",\"changeTo\":\"Broyt til\",\"errorLoading\":\"Feilur við innlesing av application service host: %s.\",\"ieSpellDownload\":\"Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?\",\"manyChanges\":\"Rættstavarin liðugur: %1 orð broytt\",\"noChanges\":\"Rættstavarin liðugur: Einki orð varð broytt\",\"noMispell\":\"Rættstavarin liðugur: Eingin feilur funnin\",\"noSuggestions\":\"- Einki uppskot -\",\"notAvailable\":\"Tíverri, ikki tøkt í løtuni.\",\"notInDic\":\"Finst ikki í orðabókini\",\"oneChange\":\"Rættstavarin liðugur: Eitt orð er broytt\",\"progress\":\"Rættstavarin arbeiðir...\",\"title\":\"Kanna stavseting\",\"toolbar\":\"Kanna stavseting\"}};"
  },
  {
    "path": "assets/ckeditor/lang/fr-ca.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['fr-ca']={\"editor\":\"Éditeur de texte enrichi\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Appuyez sur 0 pour de l'aide\",\"browseServer\":\"Parcourir le serveur\",\"url\":\"URL\",\"protocol\":\"Protocole\",\"upload\":\"Envoyer\",\"uploadSubmit\":\"Envoyer au serveur\",\"image\":\"Image\",\"flash\":\"Animation Flash\",\"form\":\"Formulaire\",\"checkbox\":\"Case à cocher\",\"radio\":\"Bouton radio\",\"textField\":\"Champ texte\",\"textarea\":\"Zone de texte\",\"hiddenField\":\"Champ caché\",\"button\":\"Bouton\",\"select\":\"Liste déroulante\",\"imageButton\":\"Bouton image\",\"notSet\":\"<Par défaut>\",\"id\":\"Id\",\"name\":\"Nom\",\"langDir\":\"Sens d'écriture\",\"langDirLtr\":\"De gauche à droite (LTR)\",\"langDirRtl\":\"De droite à gauche (RTL)\",\"langCode\":\"Code langue\",\"longDescr\":\"URL de description longue\",\"cssClass\":\"Classes CSS\",\"advisoryTitle\":\"Titre\",\"cssStyle\":\"Style\",\"ok\":\"OK\",\"cancel\":\"Annuler\",\"close\":\"Fermer\",\"preview\":\"Aperçu\",\"resize\":\"Redimensionner\",\"generalTab\":\"Général\",\"advancedTab\":\"Avancé\",\"validateNumberFailed\":\"Cette valeur n'est pas un nombre.\",\"confirmNewPage\":\"Les changements non sauvegardés seront perdus. Êtes-vous certain de vouloir charger une nouvelle page?\",\"confirmCancel\":\"Certaines options ont été modifiées.  Êtes-vous certain de vouloir fermer?\",\"options\":\"Options\",\"target\":\"Cible\",\"targetNew\":\"Nouvelle fenêtre (_blank)\",\"targetTop\":\"Fenêtre supérieur (_top)\",\"targetSelf\":\"Cette fenêtre (_self)\",\"targetParent\":\"Fenêtre parent (_parent)\",\"langDirLTR\":\"De gauche à droite (LTR)\",\"langDirRTL\":\"De droite à gauche (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Classe CSS\",\"width\":\"Largeur\",\"height\":\"Hauteur\",\"align\":\"Alignement\",\"alignLeft\":\"Gauche\",\"alignRight\":\"Droite\",\"alignCenter\":\"Centré\",\"alignJustify\":\"Justifié\",\"alignTop\":\"Haut\",\"alignMiddle\":\"Milieu\",\"alignBottom\":\"Bas\",\"alignNone\":\"None\",\"invalidValue\":\"Valeur invalide.\",\"invalidHeight\":\"La hauteur doit être un nombre.\",\"invalidWidth\":\"La largeur doit être un nombre.\",\"invalidCssLength\":\"La valeur spécifiée pour le champ \\\"%1\\\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"invalidHtmlLength\":\"La valeur spécifiée pour le champ \\\"%1\\\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).\",\"invalidInlineStyle\":\"La valeur spécifiée pour le style intégré doit être composée d'un ou plusieurs couples de valeur au format \\\"nom : valeur\\\", separés par des points-virgules.\",\"cssLengthTooltip\":\"Entrer un nombre pour la valeur en pixel ou un nombre avec une unité CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, indisponible</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Tous droits réservés.\",\"dlgTitle\":\"À propos de CKEditor\",\"help\":\"Consulter $1 pour l'aide.\",\"moreInfo\":\"Pour les informations de licence, consulter notre site internet:\",\"title\":\"À propos de CKEditor\",\"userGuide\":\"Guide utilisateur de CKEditor\"},\"basicstyles\":{\"bold\":\"Gras\",\"italic\":\"Italique\",\"strike\":\"Barré\",\"subscript\":\"Indice\",\"superscript\":\"Exposant\",\"underline\":\"Souligné\"},\"bidi\":{\"ltr\":\"Direction du texte de gauche à droite\",\"rtl\":\"Direction du texte de droite à gauche\"},\"blockquote\":{\"toolbar\":\"Citation\"},\"clipboard\":{\"copy\":\"Copier\",\"copyError\":\"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).\",\"cut\":\"Couper\",\"cutError\":\"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).\",\"paste\":\"Coller\",\"pasteArea\":\"Coller la zone\",\"pasteMsg\":\"Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.\",\"securityMsg\":\"A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.\",\"title\":\"Coller\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatique\",\"bgColorTitle\":\"Couleur de fond\",\"colors\":{\"000\":\"Noir\",\"800000\":\"Marron\",\"8B4513\":\"Brun foncé\",\"2F4F4F\":\"Gris ardoise foncé\",\"008080\":\"Sarcelle\",\"000080\":\"Marine\",\"4B0082\":\"Indigo\",\"696969\":\"Gris foncé\",\"B22222\":\"Rouge brique\",\"A52A2A\":\"Brun\",\"DAA520\":\"Doré\",\"006400\":\"Vert foncé\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Bleu\",\"800080\":\"Mauve\",\"808080\":\"Gris\",\"F00\":\"Rouge\",\"FF8C00\":\"Orange foncé\",\"FFD700\":\"Or\",\"008000\":\"Vert\",\"0FF\":\"Cyan\",\"00F\":\"Bleu\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Gris pâle\",\"FFA07A\":\"Saumon clair\",\"FFA500\":\"Orange\",\"FFFF00\":\"Jaune\",\"00FF00\":\"Vert lime\",\"AFEEEE\":\"Turquoise pâle\",\"ADD8E6\":\"Bleu pâle\",\"DDA0DD\":\"Prune\",\"D3D3D3\":\"Gris pâle\",\"FFF0F5\":\"Bleu lavande\",\"FAEBD7\":\"Blanc antique\",\"FFFFE0\":\"Jaune pâle\",\"F0FFF0\":\"Miel doré\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Bleu alice\",\"E6E6FA\":\"Lavande\",\"FFF\":\"Blanc\"},\"more\":\"Plus de couleurs...\",\"panelTitle\":\"Couleurs\",\"textColorTitle\":\"Couleur de texte\"},\"colordialog\":{\"clear\":\"Effacer\",\"highlight\":\"Surligner\",\"options\":\"Options de couleur\",\"selected\":\"Couleur sélectionnée\",\"title\":\"Choisir une couleur\"},\"templates\":{\"button\":\"Modèles\",\"emptyListMsg\":\"(Aucun modèle disponible)\",\"insertOption\":\"Remplacer tout le contenu actuel\",\"options\":\"Options de modèles\",\"selectPromptMsg\":\"Sélectionner le modèle à ouvrir dans l'éditeur\",\"title\":\"Modèles de contenu\"},\"contextmenu\":{\"options\":\"Options du menu contextuel\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"Titre\",\"cssClassInputLabel\":\"Classes CSS\",\"edit\":\"Modifier le DIV\",\"inlineStyleInputLabel\":\"Style en ligne\",\"langDirLTRLabel\":\"De gauche à droite (LTR)\",\"langDirLabel\":\"Sens d'écriture\",\"langDirRTLLabel\":\"De droite à gauche (RTL)\",\"languageCodeInputLabel\":\"Code de langue\",\"remove\":\"Supprimer le DIV\",\"styleSelectLabel\":\"Style\",\"title\":\"Créer un DIV\",\"toolbar\":\"Créer un DIV\"},\"toolbar\":{\"toolbarCollapse\":\"Enrouler la barre d'outils\",\"toolbarExpand\":\"Dérouler la barre d'outils\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Presse papier/Annuler\",\"editing\":\"Édition\",\"forms\":\"Formulaires\",\"basicstyles\":\"Styles de base\",\"paragraph\":\"Paragraphe\",\"links\":\"Liens\",\"insert\":\"Insérer\",\"styles\":\"Styles\",\"colors\":\"Couleurs\",\"tools\":\"Outils\"},\"toolbars\":\"Barre d'outils de l'éditeur\"},\"elementspath\":{\"eleLabel\":\"Chemin d'éléments\",\"eleTitle\":\"element %1\"},\"find\":{\"find\":\"Rechercher\",\"findOptions\":\"Options de recherche\",\"findWhat\":\"Rechercher:\",\"matchCase\":\"Respecter la casse\",\"matchCyclic\":\"Recherche cyclique\",\"matchWord\":\"Mot entier\",\"notFoundMsg\":\"Le texte indiqué est introuvable.\",\"replace\":\"Remplacer\",\"replaceAll\":\"Tout remplacer\",\"replaceSuccessMsg\":\"%1 remplacements.\",\"replaceWith\":\"Remplacer par:\",\"title\":\"Rechercher et remplacer\"},\"fakeobjects\":{\"anchor\":\"Ancre\",\"flash\":\"Animation Flash\",\"hiddenfield\":\"Champ caché\",\"iframe\":\"IFrame\",\"unknown\":\"Objet inconnu\"},\"flash\":{\"access\":\"Accès au script\",\"accessAlways\":\"Toujours\",\"accessNever\":\"Jamais\",\"accessSameDomain\":\"Même domaine\",\"alignAbsBottom\":\"Bas absolu\",\"alignAbsMiddle\":\"Milieu absolu\",\"alignBaseline\":\"Bas du texte\",\"alignTextTop\":\"Haut du texte\",\"bgcolor\":\"Couleur de fond\",\"chkFull\":\"Permettre le plein-écran\",\"chkLoop\":\"Boucle\",\"chkMenu\":\"Activer le menu Flash\",\"chkPlay\":\"Lecture automatique\",\"flashvars\":\"Variables pour Flash\",\"hSpace\":\"Espacement horizontal\",\"properties\":\"Propriétés de l'animation Flash\",\"propertiesTab\":\"Propriétés\",\"quality\":\"Qualité\",\"qualityAutoHigh\":\"Haute auto\",\"qualityAutoLow\":\"Basse auto\",\"qualityBest\":\"Meilleur\",\"qualityHigh\":\"Haute\",\"qualityLow\":\"Basse\",\"qualityMedium\":\"Moyenne\",\"scale\":\"Échelle\",\"scaleAll\":\"Afficher tout\",\"scaleFit\":\"Ajuster aux dimensions\",\"scaleNoBorder\":\"Sans bordure\",\"title\":\"Propriétés de l'animation Flash\",\"vSpace\":\"Espacement vertical\",\"validateHSpace\":\"L'espacement horizontal doit être un entier.\",\"validateSrc\":\"Veuillez saisir l'URL\",\"validateVSpace\":\"L'espacement vertical doit être un entier.\",\"windowMode\":\"Mode de fenêtre\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Fenêtre\"},\"font\":{\"fontSize\":{\"label\":\"Taille\",\"voiceLabel\":\"Taille\",\"panelTitle\":\"Taille\"},\"label\":\"Police\",\"panelTitle\":\"Police\",\"voiceLabel\":\"Police\"},\"forms\":{\"button\":{\"title\":\"Propriétés du bouton\",\"text\":\"Texte (Valeur)\",\"type\":\"Type\",\"typeBtn\":\"Bouton\",\"typeSbm\":\"Soumettre\",\"typeRst\":\"Réinitialiser\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Propriétés de la case à cocher\",\"radioTitle\":\"Propriétés du bouton radio\",\"value\":\"Valeur\",\"selected\":\"Sélectionné\",\"required\":\"Required\"},\"form\":{\"title\":\"Propriétés du formulaire\",\"menu\":\"Propriétés du formulaire\",\"action\":\"Action\",\"method\":\"Méthode\",\"encoding\":\"Encodage\"},\"hidden\":{\"title\":\"Propriétés du champ caché\",\"name\":\"Nom\",\"value\":\"Valeur\"},\"select\":{\"title\":\"Propriétés du champ de sélection\",\"selectInfo\":\"Info\",\"opAvail\":\"Options disponibles\",\"value\":\"Valeur\",\"size\":\"Taille\",\"lines\":\"lignes\",\"chkMulti\":\"Permettre les sélections multiples\",\"required\":\"Required\",\"opText\":\"Texte\",\"opValue\":\"Valeur\",\"btnAdd\":\"Ajouter\",\"btnModify\":\"Modifier\",\"btnUp\":\"Monter\",\"btnDown\":\"Descendre\",\"btnSetValue\":\"Valeur sélectionnée\",\"btnDelete\":\"Supprimer\"},\"textarea\":{\"title\":\"Propriétés de la zone de texte\",\"cols\":\"Colonnes\",\"rows\":\"Lignes\"},\"textfield\":{\"title\":\"Propriétés du champ texte\",\"name\":\"Nom\",\"value\":\"Valeur\",\"charWidth\":\"Largeur de caractères\",\"maxChars\":\"Nombre maximum de caractères\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Texte\",\"typePass\":\"Mot de passe\",\"typeEmail\":\"Courriel\",\"typeSearch\":\"Recherche\",\"typeTel\":\"Numéro de téléphone\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format de paragraphe\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"En-tête 1\",\"tag_h2\":\"En-tête 2\",\"tag_h3\":\"En-tête 3\",\"tag_h4\":\"En-tête 4\",\"tag_h5\":\"En-tête 5\",\"tag_h6\":\"En-tête 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formaté\"},\"horizontalrule\":{\"toolbar\":\"Insérer un séparateur horizontale\"},\"iframe\":{\"border\":\"Afficher la bordure du cadre\",\"noUrl\":\"Veuillez entre l'URL du IFrame\",\"scrolling\":\"Activer les barres de défilement\",\"title\":\"Propriétés du IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Texte alternatif\",\"border\":\"Bordure\",\"btnUpload\":\"Envoyer sur le serveur\",\"button2Img\":\"Désirez-vous transformer l'image sélectionnée en image simple?\",\"hSpace\":\"Espacement horizontal\",\"img2Button\":\"Désirez-vous transformer l'image sélectionnée en bouton image?\",\"infoTab\":\"Informations sur l'image\",\"linkTab\":\"Lien\",\"lockRatio\":\"Verrouiller les proportions\",\"menu\":\"Propriétés de l'image\",\"resetSize\":\"Taille originale\",\"title\":\"Propriétés de l'image\",\"titleButton\":\"Propriétés du bouton image\",\"upload\":\"Téléverser\",\"urlMissing\":\"L'URL de la source de l'image est manquant.\",\"vSpace\":\"Espacement vertical\",\"validateBorder\":\"La bordure doit être un entier.\",\"validateHSpace\":\"L'espacement horizontal doit être un entier.\",\"validateVSpace\":\"L'espacement vertical doit être un entier.\"},\"indent\":{\"indent\":\"Augmenter le retrait\",\"outdent\":\"Diminuer le retrait\"},\"smiley\":{\"options\":\"Options d'émoticônes\",\"title\":\"Insérer un émoticône\",\"toolbar\":\"Émoticône\"},\"justify\":{\"block\":\"Justifié\",\"center\":\"Centré\",\"left\":\"Aligner à gauche\",\"right\":\"Aligner à Droite\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Touche d'accessibilité\",\"advanced\":\"Avancé\",\"advisoryContentType\":\"Type de contenu\",\"advisoryTitle\":\"Description\",\"anchor\":{\"toolbar\":\"Ancre\",\"menu\":\"Modifier l'ancre\",\"title\":\"Propriétés de l'ancre\",\"name\":\"Nom de l'ancre\",\"errorName\":\"Veuillez saisir le nom de l'ancre\",\"remove\":\"Supprimer l'ancre\"},\"anchorId\":\"Par ID\",\"anchorName\":\"Par nom\",\"charset\":\"Encodage de la cible\",\"cssClasses\":\"Classes CSS\",\"emailAddress\":\"Courriel\",\"emailBody\":\"Corps du message\",\"emailSubject\":\"Objet du message\",\"id\":\"ID\",\"info\":\"Informations sur le lien\",\"langCode\":\"Code de langue\",\"langDir\":\"Sens d'écriture\",\"langDirLTR\":\"De gauche à droite (LTR)\",\"langDirRTL\":\"De droite à gauche (RTL)\",\"menu\":\"Modifier le lien\",\"name\":\"Nom\",\"noAnchors\":\"(Pas d'ancre disponible dans le document)\",\"noEmail\":\"Veuillez saisir le courriel\",\"noUrl\":\"Veuillez saisir l'URL\",\"other\":\"<autre>\",\"popupDependent\":\"Dépendante (Netscape)\",\"popupFeatures\":\"Caractéristiques de la fenêtre popup\",\"popupFullScreen\":\"Plein écran (IE)\",\"popupLeft\":\"Position de la gauche\",\"popupLocationBar\":\"Barre d'adresse\",\"popupMenuBar\":\"Barre de menu\",\"popupResizable\":\"Redimensionnable\",\"popupScrollBars\":\"Barres de défilement\",\"popupStatusBar\":\"Barre d'état\",\"popupToolbar\":\"Barre d'outils\",\"popupTop\":\"Position à partir du haut\",\"rel\":\"Relation\",\"selectAnchor\":\"Sélectionner une ancre\",\"styles\":\"Style\",\"tabIndex\":\"Ordre de tabulation\",\"target\":\"Destination\",\"targetFrame\":\"<Cadre>\",\"targetFrameName\":\"Nom du cadre de destination\",\"targetPopup\":\"<fenêtre popup>\",\"targetPopupName\":\"Nom de la fenêtre popup\",\"title\":\"Lien\",\"toAnchor\":\"Ancre dans cette page\",\"toEmail\":\"Courriel\",\"toUrl\":\"URL\",\"toolbar\":\"Lien\",\"type\":\"Type de lien\",\"unlink\":\"Supprimer le lien\",\"upload\":\"Téléverser\"},\"list\":{\"bulletedlist\":\"Liste à puces\",\"numberedlist\":\"Liste numérotée\"},\"liststyle\":{\"armenian\":\"Numération arménienne\",\"bulletedTitle\":\"Propriété de liste à puce\",\"circle\":\"Cercle\",\"decimal\":\"Décimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Décimal avec zéro (01, 02, 03, etc.)\",\"disc\":\"Disque\",\"georgian\":\"Numération géorgienne (an, ban, gan, etc.)\",\"lowerAlpha\":\"Alphabétique minuscule (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Grecque minuscule (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Romain minuscule (i, ii, iii, iv, v, etc.)\",\"none\":\"Aucun\",\"notset\":\"<non défini>\",\"numberedTitle\":\"Propriété de la liste numérotée\",\"square\":\"Carré\",\"start\":\"Début\",\"type\":\"Type\",\"upperAlpha\":\"Alphabétique majuscule (A, B, C, D, E, etc.)\",\"upperRoman\":\"Romain Majuscule (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Le numéro de début de liste doit être un entier.\"},\"magicline\":{\"title\":\"Insérer le paragraphe ici\"},\"maximize\":{\"maximize\":\"Maximizer\",\"minimize\":\"Minimizer\"},\"newpage\":{\"toolbar\":\"Nouvelle page\"},\"pagebreak\":{\"alt\":\"Saut de page\",\"toolbar\":\"Insérer un saut de page à l'impression\"},\"pastetext\":{\"button\":\"Coller comme texte\",\"title\":\"Coller comme texte\"},\"pastefromword\":{\"confirmCleanup\":\"Le texte que vous tentez de coller semble provenir de Word.  Désirez vous le nettoyer avant de coller?\",\"error\":\"Il n'a pas été possible de nettoyer les données collées du à une erreur interne\",\"title\":\"Coller de Word\",\"toolbar\":\"Coller de Word\"},\"preview\":{\"preview\":\"Prévisualiser\"},\"print\":{\"toolbar\":\"Imprimer\"},\"removeformat\":{\"toolbar\":\"Supprimer le formatage\"},\"save\":{\"toolbar\":\"Sauvegarder\"},\"selectall\":{\"toolbar\":\"Sélectionner tout\"},\"showblocks\":{\"toolbar\":\"Afficher les blocs\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Option des caractères spéciaux\",\"title\":\"Sélectionner un caractère spécial\",\"toolbar\":\"Insérer un caractère spécial\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Styles de formattage\",\"panelTitle1\":\"Styles de block\",\"panelTitle2\":\"Styles en ligne\",\"panelTitle3\":\"Styles d'objet\"},\"table\":{\"border\":\"Taille de la bordure\",\"caption\":\"Titre\",\"cell\":{\"menu\":\"Cellule\",\"insertBefore\":\"Insérer une cellule avant\",\"insertAfter\":\"Insérer une cellule après\",\"deleteCell\":\"Supprimer des cellules\",\"merge\":\"Fusionner les cellules\",\"mergeRight\":\"Fusionner à droite\",\"mergeDown\":\"Fusionner en bas\",\"splitHorizontal\":\"Scinder la cellule horizontalement\",\"splitVertical\":\"Scinder la cellule verticalement\",\"title\":\"Propriétés de la cellule\",\"cellType\":\"Type de cellule\",\"rowSpan\":\"Fusion de lignes\",\"colSpan\":\"Fusion de colonnes\",\"wordWrap\":\"Retour à la ligne\",\"hAlign\":\"Alignement horizontal\",\"vAlign\":\"Alignement vertical\",\"alignBaseline\":\"Bas du texte\",\"bgColor\":\"Couleur d'arrière plan\",\"borderColor\":\"Couleur de bordure\",\"data\":\"Données\",\"header\":\"En-tête\",\"yes\":\"Oui\",\"no\":\"Non\",\"invalidWidth\":\"La largeur de cellule doit être un nombre.\",\"invalidHeight\":\"La hauteur de cellule doit être un nombre.\",\"invalidRowSpan\":\"La fusion de lignes doit être un nombre entier.\",\"invalidColSpan\":\"La fusion de colonnes doit être un nombre entier.\",\"chooseColor\":\"Sélectionner\"},\"cellPad\":\"Marge interne des cellules\",\"cellSpace\":\"Espacement des cellules\",\"column\":{\"menu\":\"Colonne\",\"insertBefore\":\"Insérer une colonne avant\",\"insertAfter\":\"Insérer une colonne après\",\"deleteColumn\":\"Supprimer des colonnes\"},\"columns\":\"Colonnes\",\"deleteTable\":\"Supprimer le tableau\",\"headers\":\"En-têtes\",\"headersBoth\":\"Les deux.\",\"headersColumn\":\"Première colonne\",\"headersNone\":\"Aucun\",\"headersRow\":\"Première ligne\",\"invalidBorder\":\"La taille de bordure doit être un nombre.\",\"invalidCellPadding\":\"La marge interne des cellules doit être un nombre positif.\",\"invalidCellSpacing\":\"L'espacement des cellules doit être un nombre positif.\",\"invalidCols\":\"Le nombre de colonnes doit être supérieur à 0.\",\"invalidHeight\":\"La hauteur du tableau doit être un nombre.\",\"invalidRows\":\"Le nombre de lignes doit être supérieur à 0.\",\"invalidWidth\":\"La largeur du tableau doit être un nombre.\",\"menu\":\"Propriétés du tableau\",\"row\":{\"menu\":\"Ligne\",\"insertBefore\":\"Insérer une ligne avant\",\"insertAfter\":\"Insérer une ligne après\",\"deleteRow\":\"Supprimer des lignes\"},\"rows\":\"Lignes\",\"summary\":\"Résumé\",\"title\":\"Propriétés du tableau\",\"toolbar\":\"Tableau\",\"widthPc\":\"pourcentage\",\"widthPx\":\"pixels\",\"widthUnit\":\"unité de largeur\"},\"undo\":{\"redo\":\"Refaire\",\"undo\":\"Annuler\"},\"wsc\":{\"btnIgnore\":\"Ignorer\",\"btnIgnoreAll\":\"Ignorer tout\",\"btnReplace\":\"Remplacer\",\"btnReplaceAll\":\"Remplacer tout\",\"btnUndo\":\"Annuler\",\"changeTo\":\"Changer en\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?\",\"manyChanges\":\"Vérification d'orthographe terminée: %1 mots modifiés\",\"noChanges\":\"Vérification d'orthographe terminée: Pas de modifications\",\"noMispell\":\"Vérification d'orthographe terminée: pas d'erreur trouvée\",\"noSuggestions\":\"- Pas de suggestion -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Pas dans le dictionnaire\",\"oneChange\":\"Vérification d'orthographe terminée: Un mot modifié\",\"progress\":\"Vérification d'orthographe en cours...\",\"title\":\"Spell Checker\",\"toolbar\":\"Orthographe\"}};"
  },
  {
    "path": "assets/ckeditor/lang/fr.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['fr']={\"editor\":\"Éditeur de Texte Enrichi\",\"editorPanel\":\"Tableau de bord de l'éditeur de texte enrichi\",\"common\":{\"editorHelp\":\"Appuyez sur ALT-0 pour l'aide\",\"browseServer\":\"Explorer le serveur\",\"url\":\"URL\",\"protocol\":\"Protocole\",\"upload\":\"Télécharger\",\"uploadSubmit\":\"Envoyer sur le serveur\",\"image\":\"Image\",\"flash\":\"Flash\",\"form\":\"Formulaire\",\"checkbox\":\"Case à cocher\",\"radio\":\"Bouton Radio\",\"textField\":\"Champ texte\",\"textarea\":\"Zone de texte\",\"hiddenField\":\"Champ caché\",\"button\":\"Bouton\",\"select\":\"Liste déroulante\",\"imageButton\":\"Bouton image\",\"notSet\":\"<non défini>\",\"id\":\"Id\",\"name\":\"Nom\",\"langDir\":\"Sens d'écriture\",\"langDirLtr\":\"Gauche à droite (LTR)\",\"langDirRtl\":\"Droite à gauche (RTL)\",\"langCode\":\"Code de langue\",\"longDescr\":\"URL de description longue (longdesc => malvoyant)\",\"cssClass\":\"Classe CSS\",\"advisoryTitle\":\"Description (title)\",\"cssStyle\":\"Style\",\"ok\":\"OK\",\"cancel\":\"Annuler\",\"close\":\"Fermer\",\"preview\":\"Aperçu\",\"resize\":\"Déplacer pour modifier la taille\",\"generalTab\":\"Général\",\"advancedTab\":\"Avancé\",\"validateNumberFailed\":\"Cette valeur n'est pas un nombre.\",\"confirmNewPage\":\"Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?\",\"confirmCancel\":\"Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?\",\"options\":\"Options\",\"target\":\"Cible (Target)\",\"targetNew\":\"Nouvelle fenêtre (_blank)\",\"targetTop\":\"Fenêtre supérieure (_top)\",\"targetSelf\":\"Même fenêtre (_self)\",\"targetParent\":\"Fenêtre parent (_parent)\",\"langDirLTR\":\"Gauche à Droite (LTR)\",\"langDirRTL\":\"Droite à Gauche (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Classes de style\",\"width\":\"Largeur\",\"height\":\"Hauteur\",\"align\":\"Alignement\",\"alignLeft\":\"Gauche\",\"alignRight\":\"Droite\",\"alignCenter\":\"Centré\",\"alignJustify\":\"Justifier\",\"alignTop\":\"Haut\",\"alignMiddle\":\"Milieu\",\"alignBottom\":\"Bas\",\"alignNone\":\"Aucun\",\"invalidValue\":\"Valeur incorrecte.\",\"invalidHeight\":\"La hauteur doit être un nombre.\",\"invalidWidth\":\"La largeur doit être un nombre.\",\"invalidCssLength\":\"La valeur spécifiée pour le champ \\\"%1\\\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"invalidHtmlLength\":\"La valeur spécifiée pour le champ \\\"%1\\\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).\",\"invalidInlineStyle\":\"La valeur spécifiée pour le style inline doit être composée d'un ou plusieurs couples de valeur au format \\\"nom : valeur\\\", separés par des points-virgules.\",\"cssLengthTooltip\":\"Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, Indisponible</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Tous droits réservés.\",\"dlgTitle\":\"À propos de CKEditor\",\"help\":\"Consulter $1 pour l'aide.\",\"moreInfo\":\"Pour les informations de licence, veuillez visiter notre site web:\",\"title\":\"À propos de CKEditor\",\"userGuide\":\"Guide de l'utilisateur CKEditor en anglais\"},\"basicstyles\":{\"bold\":\"Gras\",\"italic\":\"Italique\",\"strike\":\"Barré\",\"subscript\":\"Indice\",\"superscript\":\"Exposant\",\"underline\":\"Souligné\"},\"bidi\":{\"ltr\":\"Direction du texte de la gauche vers la droite\",\"rtl\":\"Direction du texte de la droite vers la gauche\"},\"blockquote\":{\"toolbar\":\"Citation\"},\"clipboard\":{\"copy\":\"Copier\",\"copyError\":\"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).\",\"cut\":\"Couper\",\"cutError\":\"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \\\"couper\\\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).\",\"paste\":\"Coller\",\"pasteArea\":\"Coller la zone\",\"pasteMsg\":\"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.\",\"securityMsg\":\"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.\",\"title\":\"Coller\"},\"button\":{\"selectedLabel\":\"%1 (Sélectionné)\"},\"colorbutton\":{\"auto\":\"Automatique\",\"bgColorTitle\":\"Couleur d'arrière plan\",\"colors\":{\"000\":\"Noir\",\"800000\":\"Marron\",\"8B4513\":\"Brun moyen\",\"2F4F4F\":\"Vert sombre\",\"008080\":\"Canard\",\"000080\":\"Bleu marine\",\"4B0082\":\"Indigo\",\"696969\":\"Gris foncé\",\"B22222\":\"Rouge brique\",\"A52A2A\":\"Brun\",\"DAA520\":\"Or terni\",\"006400\":\"Vert foncé\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Bleu royal\",\"800080\":\"Pourpre\",\"808080\":\"Gris\",\"F00\":\"Rouge\",\"FF8C00\":\"Orange foncé\",\"FFD700\":\"Or\",\"008000\":\"Vert\",\"0FF\":\"Cyan\",\"00F\":\"Bleu\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Gris moyen\",\"FFA07A\":\"Saumon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Jaune\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Turquoise clair\",\"ADD8E6\":\"Bleu clair\",\"DDA0DD\":\"Prune\",\"D3D3D3\":\"Gris clair\",\"FFF0F5\":\"Fard Lavande\",\"FAEBD7\":\"Blanc antique\",\"FFFFE0\":\"Jaune clair\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azur\",\"F0F8FF\":\"Bleu Alice\",\"E6E6FA\":\"Lavande\",\"FFF\":\"Blanc\"},\"more\":\"Plus de couleurs...\",\"panelTitle\":\"Couleurs\",\"textColorTitle\":\"Couleur de texte\"},\"colordialog\":{\"clear\":\"Effacer\",\"highlight\":\"Détails\",\"options\":\"Option des couleurs\",\"selected\":\"Couleur choisie\",\"title\":\"Choisir une couleur\"},\"templates\":{\"button\":\"Modèles\",\"emptyListMsg\":\"(Aucun modèle disponible)\",\"insertOption\":\"Remplacer le contenu actuel\",\"options\":\"Options des modèles\",\"selectPromptMsg\":\"Veuillez sélectionner le modèle pour l'ouvrir dans l'éditeur\",\"title\":\"Contenu des modèles\"},\"contextmenu\":{\"options\":\"Options du menu contextuel\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Classe CSS\",\"edit\":\"Éditer la DIV\",\"inlineStyleInputLabel\":\"Style en ligne\",\"langDirLTRLabel\":\"Gauche à droite (LTR)\",\"langDirLabel\":\"Sens d'écriture\",\"langDirRTLLabel\":\"Droite à gauche (RTL)\",\"languageCodeInputLabel\":\"Code de langue\",\"remove\":\"Enlever la DIV\",\"styleSelectLabel\":\"Style\",\"title\":\"Créer un container DIV\",\"toolbar\":\"Créer un container DIV\"},\"toolbar\":{\"toolbarCollapse\":\"Enrouler la barre d'outils\",\"toolbarExpand\":\"Dérouler la barre d'outils\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Presse-papier/Défaire\",\"editing\":\"Editer\",\"forms\":\"Formulaires\",\"basicstyles\":\"Styles de base\",\"paragraph\":\"Paragraphe\",\"links\":\"Liens\",\"insert\":\"Insérer\",\"styles\":\"Styles\",\"colors\":\"Couleurs\",\"tools\":\"Outils\"},\"toolbars\":\"Barre d'outils de l'éditeur\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 éléments\"},\"find\":{\"find\":\"Trouver\",\"findOptions\":\"Options de recherche\",\"findWhat\":\"Expression à trouver: \",\"matchCase\":\"Respecter la casse\",\"matchCyclic\":\"Boucler\",\"matchWord\":\"Mot entier uniquement\",\"notFoundMsg\":\"Le texte spécifié ne peut être trouvé.\",\"replace\":\"Remplacer\",\"replaceAll\":\"Remplacer tout\",\"replaceSuccessMsg\":\"%1 occurrence(s) replacée(s).\",\"replaceWith\":\"Remplacer par: \",\"title\":\"Trouver et remplacer\"},\"fakeobjects\":{\"anchor\":\"Ancre\",\"flash\":\"Animation Flash\",\"hiddenfield\":\"Champ caché\",\"iframe\":\"IFrame\",\"unknown\":\"Objet inconnu\"},\"flash\":{\"access\":\"Accès aux scripts\",\"accessAlways\":\"Toujours\",\"accessNever\":\"Jamais\",\"accessSameDomain\":\"Même domaine\",\"alignAbsBottom\":\"Bas absolu\",\"alignAbsMiddle\":\"Milieu absolu\",\"alignBaseline\":\"Bas du texte\",\"alignTextTop\":\"Haut du texte\",\"bgcolor\":\"Couleur d'arrière-plan\",\"chkFull\":\"Permettre le plein écran\",\"chkLoop\":\"Boucle\",\"chkMenu\":\"Activer le menu Flash\",\"chkPlay\":\"Jouer automatiquement\",\"flashvars\":\"Variables du Flash\",\"hSpace\":\"Espacement horizontal\",\"properties\":\"Propriétés du Flash\",\"propertiesTab\":\"Propriétés\",\"quality\":\"Qualité\",\"qualityAutoHigh\":\"Haute Auto\",\"qualityAutoLow\":\"Basse Auto\",\"qualityBest\":\"Meilleure\",\"qualityHigh\":\"Haute\",\"qualityLow\":\"Basse\",\"qualityMedium\":\"Moyenne\",\"scale\":\"Echelle\",\"scaleAll\":\"Afficher tout\",\"scaleFit\":\"Taille d'origine\",\"scaleNoBorder\":\"Pas de bordure\",\"title\":\"Propriétés du Flash\",\"vSpace\":\"Espacement vertical\",\"validateHSpace\":\"L'espacement horizontal doit être un nombre.\",\"validateSrc\":\"L'adresse ne doit pas être vide.\",\"validateVSpace\":\"L'espacement vertical doit être un nombre.\",\"windowMode\":\"Mode fenêtre\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Fenêtre\"},\"font\":{\"fontSize\":{\"label\":\"Taille\",\"voiceLabel\":\"Taille de police\",\"panelTitle\":\"Taille de police\"},\"label\":\"Police\",\"panelTitle\":\"Style de police\",\"voiceLabel\":\"Police\"},\"forms\":{\"button\":{\"title\":\"Propriétés du bouton\",\"text\":\"Texte (Value)\",\"type\":\"Type\",\"typeBtn\":\"Bouton\",\"typeSbm\":\"Validation (submit)\",\"typeRst\":\"Remise à zéro\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Propriétés de la case à cocher\",\"radioTitle\":\"Propriétés du bouton Radio\",\"value\":\"Valeur\",\"selected\":\"Sélectionné\",\"required\":\"Requis\"},\"form\":{\"title\":\"Propriétés du formulaire\",\"menu\":\"Propriétés du formulaire\",\"action\":\"Action\",\"method\":\"Méthode\",\"encoding\":\"Encodage\"},\"hidden\":{\"title\":\"Propriétés du champ caché\",\"name\":\"Nom\",\"value\":\"Valeur\"},\"select\":{\"title\":\"Propriétés du menu déroulant\",\"selectInfo\":\"Informations sur le menu déroulant\",\"opAvail\":\"Options disponibles\",\"value\":\"Valeur\",\"size\":\"Taille\",\"lines\":\"Lignes\",\"chkMulti\":\"Permettre les sélections multiples\",\"required\":\"Requis\",\"opText\":\"Texte\",\"opValue\":\"Valeur\",\"btnAdd\":\"Ajouter\",\"btnModify\":\"Modifier\",\"btnUp\":\"Haut\",\"btnDown\":\"Bas\",\"btnSetValue\":\"Définir comme valeur sélectionnée\",\"btnDelete\":\"Supprimer\"},\"textarea\":{\"title\":\"Propriétés de la zone de texte\",\"cols\":\"Colonnes\",\"rows\":\"Lignes\"},\"textfield\":{\"title\":\"Propriétés du champ texte\",\"name\":\"Nom\",\"value\":\"Valeur\",\"charWidth\":\"Taille des caractères\",\"maxChars\":\"Nombre maximum de caractères\",\"required\":\"Requis\",\"type\":\"Type\",\"typeText\":\"Texte\",\"typePass\":\"Mot de passe\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Rechercher\",\"typeTel\":\"Numéro de téléphone\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format de paragraphe\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Titre 1\",\"tag_h2\":\"Titre 2\",\"tag_h3\":\"Titre 3\",\"tag_h4\":\"Titre 4\",\"tag_h5\":\"Titre 5\",\"tag_h6\":\"Titre 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formaté\"},\"horizontalrule\":{\"toolbar\":\"Ligne horizontale\"},\"iframe\":{\"border\":\"Afficher une bordure de la IFrame\",\"noUrl\":\"Veuillez entrer l'adresse du lien de la IFrame\",\"scrolling\":\"Permettre à la barre de défilement\",\"title\":\"Propriétés de la IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Texte de remplacement\",\"border\":\"Bordure\",\"btnUpload\":\"Envoyer sur le serveur\",\"button2Img\":\"Voulez-vous transformer le bouton image sélectionné en simple image?\",\"hSpace\":\"Espacement horizontal\",\"img2Button\":\"Voulez-vous transformer l'image en bouton image?\",\"infoTab\":\"Informations sur l'image\",\"linkTab\":\"Lien\",\"lockRatio\":\"Conserver les proportions\",\"menu\":\"Propriétés de l'image\",\"resetSize\":\"Taille d'origine\",\"title\":\"Propriétés de l'image\",\"titleButton\":\"Propriétés du bouton image\",\"upload\":\"Envoyer\",\"urlMissing\":\"L'adresse source de l'image est manquante.\",\"vSpace\":\"Espacement vertical\",\"validateBorder\":\"Bordure doit être un entier.\",\"validateHSpace\":\"HSpace doit être un entier.\",\"validateVSpace\":\"VSpace doit être un entier.\"},\"indent\":{\"indent\":\"Augmenter le retrait (tabulation)\",\"outdent\":\"Diminuer le retrait (tabulation)\"},\"smiley\":{\"options\":\"Options des émoticones\",\"title\":\"Insérer un émoticone\",\"toolbar\":\"Émoticone\"},\"justify\":{\"block\":\"Justifier\",\"center\":\"Centrer\",\"left\":\"Aligner à gauche\",\"right\":\"Aligner à droite\"},\"language\":{\"button\":\"Définir la langue\",\"remove\":\"Supprimer la langue\"},\"link\":{\"acccessKey\":\"Touche d'accessibilité\",\"advanced\":\"Avancé\",\"advisoryContentType\":\"Type de contenu (ex: text/html)\",\"advisoryTitle\":\"Description (title)\",\"anchor\":{\"toolbar\":\"Ancre\",\"menu\":\"Editer l'ancre\",\"title\":\"Propriétés de l'ancre\",\"name\":\"Nom de l'ancre\",\"errorName\":\"Veuillez entrer le nom de l'ancre.\",\"remove\":\"Supprimer l'ancre\"},\"anchorId\":\"Par ID d'élément\",\"anchorName\":\"Par nom d'ancre\",\"charset\":\"Charset de la cible\",\"cssClasses\":\"Classe CSS\",\"emailAddress\":\"Adresse E-Mail\",\"emailBody\":\"Corps du message\",\"emailSubject\":\"Sujet du message\",\"id\":\"Id\",\"info\":\"Infos sur le lien\",\"langCode\":\"Code de langue\",\"langDir\":\"Sens d'écriture\",\"langDirLTR\":\"Gauche à droite\",\"langDirRTL\":\"Droite à gauche\",\"menu\":\"Editer le lien\",\"name\":\"Nom\",\"noAnchors\":\"(Aucune ancre disponible dans ce document)\",\"noEmail\":\"Veuillez entrer l'adresse e-mail\",\"noUrl\":\"Veuillez entrer l'adresse du lien\",\"other\":\"<autre>\",\"popupDependent\":\"Dépendante (Netscape)\",\"popupFeatures\":\"Options de la fenêtre popup\",\"popupFullScreen\":\"Plein écran (IE)\",\"popupLeft\":\"Position gauche\",\"popupLocationBar\":\"Barre d'adresse\",\"popupMenuBar\":\"Barre de menu\",\"popupResizable\":\"Redimensionnable\",\"popupScrollBars\":\"Barres de défilement\",\"popupStatusBar\":\"Barre de status\",\"popupToolbar\":\"Barre d'outils\",\"popupTop\":\"Position haute\",\"rel\":\"Relation\",\"selectAnchor\":\"Sélectionner l'ancre\",\"styles\":\"Style\",\"tabIndex\":\"Index de tabulation\",\"target\":\"Cible\",\"targetFrame\":\"<cadre>\",\"targetFrameName\":\"Nom du Cadre destination\",\"targetPopup\":\"<fenêtre popup>\",\"targetPopupName\":\"Nom de la fenêtre popup\",\"title\":\"Lien\",\"toAnchor\":\"Ancre\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Lien\",\"type\":\"Type de lien\",\"unlink\":\"Supprimer le lien\",\"upload\":\"Envoyer\"},\"list\":{\"bulletedlist\":\"Insérer/Supprimer la liste à puces\",\"numberedlist\":\"Insérer/Supprimer la liste numérotée\"},\"liststyle\":{\"armenian\":\"Numération arménienne\",\"bulletedTitle\":\"Propriétés de la liste à puces\",\"circle\":\"Cercle\",\"decimal\":\"Décimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Décimal précédé par un 0 (01, 02, 03, etc.)\",\"disc\":\"Disque\",\"georgian\":\"Numération géorgienne (an, ban, gan, etc.)\",\"lowerAlpha\":\"Alphabétique minuscules (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Grec minuscule (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Nombres romains minuscules (i, ii, iii, iv, v, etc.)\",\"none\":\"Aucun\",\"notset\":\"<Non défini>\",\"numberedTitle\":\"Propriétés de la liste numérotée\",\"square\":\"Carré\",\"start\":\"Début\",\"type\":\"Type\",\"upperAlpha\":\"Alphabétique majuscules (A, B, C, D, E, etc.)\",\"upperRoman\":\"Nombres romains majuscules (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Le premier élément de la liste doit être un nombre entier.\"},\"magicline\":{\"title\":\"Insérez un paragraphe ici\"},\"maximize\":{\"maximize\":\"Agrandir\",\"minimize\":\"Minimiser\"},\"newpage\":{\"toolbar\":\"Nouvelle page\"},\"pagebreak\":{\"alt\":\"Saut de page\",\"toolbar\":\"Saut de page\"},\"pastetext\":{\"button\":\"Coller comme texte sans mise en forme\",\"title\":\"Coller comme texte sans mise en forme\"},\"pastefromword\":{\"confirmCleanup\":\"Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?\",\"error\":\"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne.\",\"title\":\"Coller depuis Word\",\"toolbar\":\"Coller depuis Word\"},\"preview\":{\"preview\":\"Aperçu\"},\"print\":{\"toolbar\":\"Imprimer\"},\"removeformat\":{\"toolbar\":\"Supprimer la mise en forme\"},\"save\":{\"toolbar\":\"Enregistrer\"},\"selectall\":{\"toolbar\":\"Tout sélectionner\"},\"showblocks\":{\"toolbar\":\"Afficher les blocs\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Options des caractères spéciaux\",\"title\":\"Sélectionnez un caractère\",\"toolbar\":\"Insérer un caractère spécial\"},\"scayt\":{\"btn_about\":\"A propos de SCAYT\",\"btn_dictionaries\":\"Dictionnaires\",\"btn_disable\":\"Désactiver SCAYT\",\"btn_enable\":\"Activer SCAYT\",\"btn_langs\":\"Langues\",\"btn_options\":\"Options\",\"text_title\":\"Vérification de l'Orthographe en Cours de Frappe (SCAYT)\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Styles de mise en page\",\"panelTitle1\":\"Styles de blocs\",\"panelTitle2\":\"Styles en ligne\",\"panelTitle3\":\"Styles d'objet\"},\"table\":{\"border\":\"Taille de la bordure\",\"caption\":\"Titre du tableau\",\"cell\":{\"menu\":\"Cellule\",\"insertBefore\":\"Insérer une cellule avant\",\"insertAfter\":\"Insérer une cellule après\",\"deleteCell\":\"Supprimer les cellules\",\"merge\":\"Fusionner les cellules\",\"mergeRight\":\"Fusionner à droite\",\"mergeDown\":\"Fusionner en bas\",\"splitHorizontal\":\"Fractionner horizontalement\",\"splitVertical\":\"Fractionner verticalement\",\"title\":\"Propriétés de la cellule\",\"cellType\":\"Type de cellule\",\"rowSpan\":\"Fusion de lignes\",\"colSpan\":\"Fusion de colonnes\",\"wordWrap\":\"Césure\",\"hAlign\":\"Alignement Horizontal\",\"vAlign\":\"Alignement Vertical\",\"alignBaseline\":\"Bas du texte\",\"bgColor\":\"Couleur d'arrière-plan\",\"borderColor\":\"Couleur de Bordure\",\"data\":\"Données\",\"header\":\"Entête\",\"yes\":\"Oui\",\"no\":\"Non\",\"invalidWidth\":\"La Largeur de Cellule doit être un nombre.\",\"invalidHeight\":\"La Hauteur de Cellule doit être un nombre.\",\"invalidRowSpan\":\"La fusion de lignes doit être un nombre entier.\",\"invalidColSpan\":\"La fusion de colonnes doit être un nombre entier.\",\"chooseColor\":\"Choisissez\"},\"cellPad\":\"Marge interne des cellules\",\"cellSpace\":\"Espacement des cellules\",\"column\":{\"menu\":\"Colonnes\",\"insertBefore\":\"Insérer une colonne avant\",\"insertAfter\":\"Insérer une colonne après\",\"deleteColumn\":\"Supprimer les colonnes\"},\"columns\":\"Colonnes\",\"deleteTable\":\"Supprimer le tableau\",\"headers\":\"En-Têtes\",\"headersBoth\":\"Les deux\",\"headersColumn\":\"Première colonne\",\"headersNone\":\"Aucunes\",\"headersRow\":\"Première ligne\",\"invalidBorder\":\"La taille de la bordure doit être un nombre.\",\"invalidCellPadding\":\"La marge intérieure des cellules doit être un nombre positif.\",\"invalidCellSpacing\":\"L'espacement des cellules doit être un nombre positif.\",\"invalidCols\":\"Le nombre de colonnes doit être supérieur à 0.\",\"invalidHeight\":\"La hauteur du tableau doit être un nombre.\",\"invalidRows\":\"Le nombre de lignes doit être supérieur à 0.\",\"invalidWidth\":\"La largeur du tableau doit être un nombre.\",\"menu\":\"Propriétés du tableau\",\"row\":{\"menu\":\"Ligne\",\"insertBefore\":\"Insérer une ligne avant\",\"insertAfter\":\"Insérer une ligne après\",\"deleteRow\":\"Supprimer les lignes\"},\"rows\":\"Lignes\",\"summary\":\"Résumé (description)\",\"title\":\"Propriétés du tableau\",\"toolbar\":\"Tableau\",\"widthPc\":\"% pourcents\",\"widthPx\":\"pixels\",\"widthUnit\":\"unité de largeur\"},\"undo\":{\"redo\":\"Rétablir\",\"undo\":\"Annuler\"},\"wsc\":{\"btnIgnore\":\"Ignorer\",\"btnIgnoreAll\":\"Ignorer tout\",\"btnReplace\":\"Remplacer\",\"btnReplaceAll\":\"Remplacer tout\",\"btnUndo\":\"Annuler\",\"changeTo\":\"Modifier pour\",\"errorLoading\":\"Erreur du chargement du service depuis l'hôte : %s.\",\"ieSpellDownload\":\"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?\",\"manyChanges\":\"Vérification de l'orthographe terminée : %1 mots corrigés.\",\"noChanges\":\"Vérification de l'orthographe terminée : Aucun mot corrigé.\",\"noMispell\":\"Vérification de l'orthographe terminée : aucune erreur trouvée.\",\"noSuggestions\":\"- Aucune suggestion -\",\"notAvailable\":\"Désolé, le service est indisponible actuellement.\",\"notInDic\":\"N'existe pas dans le dictionnaire.\",\"oneChange\":\"Vérification de l'orthographe terminée : Un seul mot corrigé.\",\"progress\":\"Vérification de l'orthographe en cours...\",\"title\":\"Vérifier l'orthographe\",\"toolbar\":\"Vérifier l'orthographe\"}};"
  },
  {
    "path": "assets/ckeditor/lang/gl.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['gl']={\"editor\":\"Editor de texto mellorado\",\"editorPanel\":\"Panel do editor de texto mellorado\",\"common\":{\"editorHelp\":\"Prema ALT 0 para obter axuda\",\"browseServer\":\"Examinar o servidor\",\"url\":\"URL\",\"protocol\":\"Protocolo\",\"upload\":\"Enviar\",\"uploadSubmit\":\"Enviar ao servidor\",\"image\":\"Imaxe\",\"flash\":\"Flash\",\"form\":\"Formulario\",\"checkbox\":\"Caixa de selección\",\"radio\":\"Botón de opción\",\"textField\":\"Campo de texto\",\"textarea\":\"Área de texto\",\"hiddenField\":\"Campo agochado\",\"button\":\"Botón\",\"select\":\"Campo de selección\",\"imageButton\":\"Botón de imaxe\",\"notSet\":\"<sen estabelecer>\",\"id\":\"ID\",\"name\":\"Nome\",\"langDir\":\"Dirección de escritura do idioma\",\"langDirLtr\":\"Esquerda a dereita (LTR)\",\"langDirRtl\":\"Dereita a esquerda (RTL)\",\"langCode\":\"Código do idioma\",\"longDescr\":\"Descrición completa do URL\",\"cssClass\":\"Clases da folla de estilos\",\"advisoryTitle\":\"Título\",\"cssStyle\":\"Estilo\",\"ok\":\"Aceptar\",\"cancel\":\"Cancelar\",\"close\":\"Pechar\",\"preview\":\"Vista previa\",\"resize\":\"Redimensionar\",\"generalTab\":\"Xeral\",\"advancedTab\":\"Avanzado\",\"validateNumberFailed\":\"Este valor non é un número.\",\"confirmNewPage\":\"Calquera cambio que non gardara neste contido perderase.\\r\\nConfirma que quere cargar unha páxina nova?\",\"confirmCancel\":\"Algunhas das opcións foron cambiadas.\\r\\nConfirma que quere pechar o diálogo?\",\"options\":\"Opcións\",\"target\":\"Destino\",\"targetNew\":\"Nova xanela (_blank)\",\"targetTop\":\"Xanela principal (_top)\",\"targetSelf\":\"Mesma xanela (_self)\",\"targetParent\":\"Xanela superior (_parent)\",\"langDirLTR\":\"Esquerda a dereita (LTR)\",\"langDirRTL\":\"Dereita a esquerda (RTL)\",\"styles\":\"Estilo\",\"cssClasses\":\"Clases da folla de estilos\",\"width\":\"Largo\",\"height\":\"Alto\",\"align\":\"Aliñamento\",\"alignLeft\":\"Esquerda\",\"alignRight\":\"Dereita\",\"alignCenter\":\"Centro\",\"alignJustify\":\"Xustificado\",\"alignTop\":\"Arriba\",\"alignMiddle\":\"Centro\",\"alignBottom\":\"Abaixo\",\"alignNone\":\"Ningún\",\"invalidValue\":\"Valor incorrecto.\",\"invalidHeight\":\"O alto debe ser un número.\",\"invalidWidth\":\"O largo debe ser un número.\",\"invalidCssLength\":\"O valor especificado para o campo «%1» debe ser un número positivo con ou sen unha unidade de medida CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"invalidHtmlLength\":\"O valor especificado para o campo «%1» debe ser un número positivo con ou sen unha unidade de medida HTML correcta (px ou %).\",\"invalidInlineStyle\":\"O valor especificado no estilo en liña debe consistir nunha ou máis tuplas co formato «nome : valor», separadas por punto e coma.\",\"cssLengthTooltip\":\"Escriba un número para o valor en píxeles ou un número cunha unidade CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, non dispoñíbel</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Todos os dereitos reservados.\",\"dlgTitle\":\"Sobre o CKEditor\",\"help\":\"Consulte $1 para obter axuda.\",\"moreInfo\":\"Para obter  información sobre a licenza, visite o noso sitio web:\",\"title\":\"Sobre o CKEditor\",\"userGuide\":\"Guía do usuario do CKEditor\"},\"basicstyles\":{\"bold\":\"Negra\",\"italic\":\"Cursiva\",\"strike\":\"Riscado\",\"subscript\":\"Subíndice\",\"superscript\":\"Superíndice\",\"underline\":\"Subliñado\"},\"bidi\":{\"ltr\":\"Dirección do texto de esquerda a dereita\",\"rtl\":\"Dirección do texto de dereita a esquerda\"},\"blockquote\":{\"toolbar\":\"Cita\"},\"clipboard\":{\"copy\":\"Copiar\",\"copyError\":\"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).\",\"cut\":\"Cortar\",\"cutError\":\"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).\",\"paste\":\"Pegar\",\"pasteArea\":\"Zona de pegado\",\"pasteMsg\":\"Pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prema en Aceptar\",\"securityMsg\":\"Por mor da configuración de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.\",\"title\":\"Pegar\"},\"button\":{\"selectedLabel\":\"%1 (seleccionado)\"},\"colorbutton\":{\"auto\":\"Automático\",\"bgColorTitle\":\"Cor do fondo\",\"colors\":{\"000\":\"Negro\",\"800000\":\"Marrón escuro\",\"8B4513\":\"Ocre\",\"2F4F4F\":\"Pizarra escuro\",\"008080\":\"Verde azulado\",\"000080\":\"Azul mariño\",\"4B0082\":\"Índigo\",\"696969\":\"Gris escuro\",\"B22222\":\"Ladrillo\",\"A52A2A\":\"Marrón\",\"DAA520\":\"Dourado escuro\",\"006400\":\"Verde escuro\",\"40E0D0\":\"Turquesa\",\"0000CD\":\"Azul medio\",\"800080\":\"Púrpura\",\"808080\":\"Gris\",\"F00\":\"Vermello\",\"FF8C00\":\"Laranxa escuro\",\"FFD700\":\"Dourado\",\"008000\":\"Verde\",\"0FF\":\"Cian\",\"00F\":\"Azul\",\"EE82EE\":\"Violeta\",\"A9A9A9\":\"Gris medio\",\"FFA07A\":\"Salmón claro\",\"FFA500\":\"Laranxa\",\"FFFF00\":\"Amarelo\",\"00FF00\":\"Lima\",\"AFEEEE\":\"Turquesa pálido\",\"ADD8E6\":\"Azul claro\",\"DDA0DD\":\"Violeta pálido\",\"D3D3D3\":\"Verde claro\",\"FFF0F5\":\"Lavanda vermello\",\"FAEBD7\":\"Branco antigo\",\"FFFFE0\":\"Amarelo claro\",\"F0FFF0\":\"Mel\",\"F0FFFF\":\"Azul celeste\",\"F0F8FF\":\"Azul pálido\",\"E6E6FA\":\"Lavanda\",\"FFF\":\"Branco\"},\"more\":\"Máis cores...\",\"panelTitle\":\"Cores\",\"textColorTitle\":\"Cor do texto\"},\"colordialog\":{\"clear\":\"Limpar\",\"highlight\":\"Resaltar\",\"options\":\"Opcións de cor\",\"selected\":\"Cor seleccionado\",\"title\":\"Seleccione unha cor\"},\"templates\":{\"button\":\"Modelos\",\"emptyListMsg\":\"(Non hai modelos definidos)\",\"insertOption\":\"Substituír o contido actual\",\"options\":\"Opcións de modelos\",\"selectPromptMsg\":\"Seleccione o modelo a abrir no editor\",\"title\":\"Modelos de contido\"},\"contextmenu\":{\"options\":\"Opcións do menú contextual\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"Título informativo\",\"cssClassInputLabel\":\"Clases da folla de estilos\",\"edit\":\"Editar Div\",\"inlineStyleInputLabel\":\"Estilo de liña\",\"langDirLTRLabel\":\"Esquerda a dereita (LTR)\",\"langDirLabel\":\"Dirección de escritura do idioma\",\"langDirRTLLabel\":\"Dereita a esquerda (RTL)\",\"languageCodeInputLabel\":\"Código do idioma\",\"remove\":\"Retirar Div\",\"styleSelectLabel\":\"Estilo\",\"title\":\"Crear un contedor Div\",\"toolbar\":\"Crear un contedor Div\"},\"toolbar\":{\"toolbarCollapse\":\"Contraer a barra de ferramentas\",\"toolbarExpand\":\"Expandir a barra de ferramentas\",\"toolbarGroups\":{\"document\":\"Documento\",\"clipboard\":\"Portapapeis/desfacer\",\"editing\":\"Edición\",\"forms\":\"Formularios\",\"basicstyles\":\"Estilos básicos\",\"paragraph\":\"Paragrafo\",\"links\":\"Ligazóns\",\"insert\":\"Inserir\",\"styles\":\"Estilos\",\"colors\":\"Cores\",\"tools\":\"Ferramentas\"},\"toolbars\":\"Barras de ferramentas do editor\"},\"elementspath\":{\"eleLabel\":\"Ruta dos elementos\",\"eleTitle\":\"Elemento %1\"},\"find\":{\"find\":\"Buscar\",\"findOptions\":\"Buscar opcións\",\"findWhat\":\"Texto a buscar:\",\"matchCase\":\"Coincidir Mai./min.\",\"matchCyclic\":\"Coincidencia cíclica\",\"matchWord\":\"Coincidencia coa palabra completa\",\"notFoundMsg\":\"Non se atopou o texto indicado.\",\"replace\":\"Substituir\",\"replaceAll\":\"Substituír todo\",\"replaceSuccessMsg\":\"%1 concorrencia(s) substituída(s).\",\"replaceWith\":\"Substituír con:\",\"title\":\"Buscar e substituír\"},\"fakeobjects\":{\"anchor\":\"Ancoraxe\",\"flash\":\"Animación «Flash»\",\"hiddenfield\":\"Campo agochado\",\"iframe\":\"IFrame\",\"unknown\":\"Obxecto descoñecido\"},\"flash\":{\"access\":\"Acceso de scripts\",\"accessAlways\":\"Sempre\",\"accessNever\":\"Nunca\",\"accessSameDomain\":\"Mesmo dominio\",\"alignAbsBottom\":\"Abs Inferior\",\"alignAbsMiddle\":\"Abs centro\",\"alignBaseline\":\"Liña de base\",\"alignTextTop\":\"Tope do texto\",\"bgcolor\":\"Cor do fondo\",\"chkFull\":\"Permitir pantalla completa\",\"chkLoop\":\"Repetir\",\"chkMenu\":\"Activar o menú do «Flash»\",\"chkPlay\":\"Reprodución auomática\",\"flashvars\":\"Opcións do «Flash»\",\"hSpace\":\"Esp. Horiz.\",\"properties\":\"Propiedades do «Flash»\",\"propertiesTab\":\"Propiedades\",\"quality\":\"Calidade\",\"qualityAutoHigh\":\"Alta, automática\",\"qualityAutoLow\":\"Baixa, automática\",\"qualityBest\":\"A mellor\",\"qualityHigh\":\"Alta\",\"qualityLow\":\"Baixa\",\"qualityMedium\":\"Media\",\"scale\":\"Escalar\",\"scaleAll\":\"Amosar todo\",\"scaleFit\":\"Encaixar axustando\",\"scaleNoBorder\":\"Sen bordo\",\"title\":\"Propiedades do «Flash»\",\"vSpace\":\"Esp.Vert.\",\"validateHSpace\":\"O espazado horizontal debe ser un número.\",\"validateSrc\":\"O URL non pode estar baleiro.\",\"validateVSpace\":\"O espazado vertical debe ser un número.\",\"windowMode\":\"Modo da xanela\",\"windowModeOpaque\":\"Opaca\",\"windowModeTransparent\":\"Transparente\",\"windowModeWindow\":\"Xanela\"},\"font\":{\"fontSize\":{\"label\":\"Tamaño\",\"voiceLabel\":\"Tamaño da letra\",\"panelTitle\":\"Tamaño da letra\"},\"label\":\"Tipo de letra\",\"panelTitle\":\"Nome do tipo de letra\",\"voiceLabel\":\"Tipo de letra\"},\"forms\":{\"button\":{\"title\":\"Propiedades do botón\",\"text\":\"Texto (Valor)\",\"type\":\"Tipo\",\"typeBtn\":\"Botón\",\"typeSbm\":\"Enviar\",\"typeRst\":\"Restabelever\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Propiedades da caixa de selección\",\"radioTitle\":\"Propiedades do botón de opción\",\"value\":\"Valor\",\"selected\":\"Seleccionado\",\"required\":\"Requirido\"},\"form\":{\"title\":\"Propiedades do formulario\",\"menu\":\"Propiedades do formulario\",\"action\":\"Acción\",\"method\":\"Método\",\"encoding\":\"Codificación\"},\"hidden\":{\"title\":\"Propiedades do campo agochado\",\"name\":\"Nome\",\"value\":\"Valor\"},\"select\":{\"title\":\"Propiedades do campo de selección\",\"selectInfo\":\"Información\",\"opAvail\":\"Opcións dispoñíbeis\",\"value\":\"Valor\",\"size\":\"Tamaño\",\"lines\":\"liñas\",\"chkMulti\":\"Permitir múltiplas seleccións\",\"required\":\"Requirido\",\"opText\":\"Texto\",\"opValue\":\"Valor\",\"btnAdd\":\"Engadir\",\"btnModify\":\"Modificar\",\"btnUp\":\"Subir\",\"btnDown\":\"Baixar\",\"btnSetValue\":\"Estabelecer como valor seleccionado\",\"btnDelete\":\"Eliminar\"},\"textarea\":{\"title\":\"Propiedades da área de texto\",\"cols\":\"Columnas\",\"rows\":\"Filas\"},\"textfield\":{\"title\":\"Propiedades do campo de texto\",\"name\":\"Nome\",\"value\":\"Valor\",\"charWidth\":\"Largo do carácter\",\"maxChars\":\"Núm. máximo de caracteres\",\"required\":\"Requirido\",\"type\":\"Tipo\",\"typeText\":\"Texto\",\"typePass\":\"Contrasinal\",\"typeEmail\":\"Correo\",\"typeSearch\":\"Buscar\",\"typeTel\":\"Número de teléfono\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formato\",\"panelTitle\":\"Formato do parágrafo\",\"tag_address\":\"Enderezo\",\"tag_div\":\"Normal  (DIV)\",\"tag_h1\":\"Enacabezado 1\",\"tag_h2\":\"Encabezado 2\",\"tag_h3\":\"Encabezado 3\",\"tag_h4\":\"Encabezado 4\",\"tag_h5\":\"Encabezado 5\",\"tag_h6\":\"Encabezado 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatado\"},\"horizontalrule\":{\"toolbar\":\"Inserir unha liña horizontal\"},\"iframe\":{\"border\":\"Amosar o bordo do marco\",\"noUrl\":\"Escriba o enderezo do iframe\",\"scrolling\":\"Activar as barras de desprazamento\",\"title\":\"Propiedades do iFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Texto alternativo\",\"border\":\"Bordo\",\"btnUpload\":\"Enviar ao servidor\",\"button2Img\":\"Quere converter o botón da imaxe seleccionada nunha imaxe sinxela?\",\"hSpace\":\"Esp.Horiz.\",\"img2Button\":\"Quere converter a imaxe seleccionada nun botón de imaxe?\",\"infoTab\":\"Información da imaxe\",\"linkTab\":\"Ligazón\",\"lockRatio\":\"Proporcional\",\"menu\":\"Propiedades da imaxe\",\"resetSize\":\"Tamaño orixinal\",\"title\":\"Propiedades da imaxe\",\"titleButton\":\"Propiedades do botón de imaxe\",\"upload\":\"Cargar\",\"urlMissing\":\"Non se atopa o URL da imaxe.\",\"vSpace\":\"Esp.Vert.\",\"validateBorder\":\"O bordo debe ser un número.\",\"validateHSpace\":\"O espazado horizontal debe ser un número.\",\"validateVSpace\":\"O espazado vertical debe ser un número.\"},\"indent\":{\"indent\":\"Aumentar a sangría\",\"outdent\":\"Reducir a sangría\"},\"smiley\":{\"options\":\"Opcións de emoticonas\",\"title\":\"Inserir unha emoticona\",\"toolbar\":\"Emoticona\"},\"justify\":{\"block\":\"Xustificado\",\"center\":\"Centrado\",\"left\":\"Aliñar á esquerda\",\"right\":\"Aliñar á dereita\"},\"language\":{\"button\":\"Estabelezer o idioma\",\"remove\":\"Retirar o idioma\"},\"link\":{\"acccessKey\":\"Chave de acceso\",\"advanced\":\"Avanzado\",\"advisoryContentType\":\"Tipo de contido informativo\",\"advisoryTitle\":\"Título\",\"anchor\":{\"toolbar\":\"Ancoraxe\",\"menu\":\"Editar a ancoraxe\",\"title\":\"Propiedades da ancoraxe\",\"name\":\"Nome da ancoraxe\",\"errorName\":\"Escriba o nome da ancoraxe\",\"remove\":\"Retirar a ancoraxe\"},\"anchorId\":\"Polo ID do elemento\",\"anchorName\":\"Polo nome da ancoraxe\",\"charset\":\"Codificación do recurso ligado\",\"cssClasses\":\"Clases da folla de estilos\",\"emailAddress\":\"Enderezo de correo\",\"emailBody\":\"Corpo da mensaxe\",\"emailSubject\":\"Asunto da mensaxe\",\"id\":\"ID\",\"info\":\"Información da ligazón\",\"langCode\":\"Código do idioma\",\"langDir\":\"Dirección de escritura do idioma\",\"langDirLTR\":\"Esquerda a dereita (LTR)\",\"langDirRTL\":\"Dereita a esquerda (RTL)\",\"menu\":\"Editar a ligazón\",\"name\":\"Nome\",\"noAnchors\":\"(Non hai ancoraxes dispoñíbeis no documento)\",\"noEmail\":\"Escriba o enderezo de correo\",\"noUrl\":\"Escriba a ligazón URL\",\"other\":\"<outro>\",\"popupDependent\":\"Dependente (Netscape)\",\"popupFeatures\":\"Características da xanela emerxente\",\"popupFullScreen\":\"Pantalla completa (IE)\",\"popupLeft\":\"Posición esquerda\",\"popupLocationBar\":\"Barra de localización\",\"popupMenuBar\":\"Barra do menú\",\"popupResizable\":\"Redimensionábel\",\"popupScrollBars\":\"Barras de desprazamento\",\"popupStatusBar\":\"Barra de estado\",\"popupToolbar\":\"Barra de ferramentas\",\"popupTop\":\"Posición superior\",\"rel\":\"Relación\",\"selectAnchor\":\"Seleccionar unha ancoraxe\",\"styles\":\"Estilo\",\"tabIndex\":\"Índice de tabulación\",\"target\":\"Destino\",\"targetFrame\":\"<marco>\",\"targetFrameName\":\"Nome do marco de destino\",\"targetPopup\":\"<xanela emerxente>\",\"targetPopupName\":\"Nome da xanela emerxente\",\"title\":\"Ligazón\",\"toAnchor\":\"Ligar coa ancoraxe no testo\",\"toEmail\":\"Correo\",\"toUrl\":\"URL\",\"toolbar\":\"Ligazón\",\"type\":\"Tipo de ligazón\",\"unlink\":\"Eliminar a ligazón\",\"upload\":\"Enviar\"},\"list\":{\"bulletedlist\":\"Inserir/retirar lista viñeteada\",\"numberedlist\":\"Inserir/retirar lista numerada\"},\"liststyle\":{\"armenian\":\"Numeración armenia\",\"bulletedTitle\":\"Propiedades da lista viñeteada\",\"circle\":\"Circulo\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal con cero á esquerda (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Numeración xeorxiana (an, ban, gan, etc.)\",\"lowerAlpha\":\"Alfabeto en minúsculas (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Grego en minúsculas (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Números romanos en minúsculas (i, ii, iii, iv, v, etc.)\",\"none\":\"Ningún\",\"notset\":\"<sen estabelecer>\",\"numberedTitle\":\"Propiedades da lista numerada\",\"square\":\"Cadrado\",\"start\":\"Inicio\",\"type\":\"Tipo\",\"upperAlpha\":\"Alfabeto en maiúsculas (A, B, C, D, E, etc.)\",\"upperRoman\":\"Números romanos en maiúsculas (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"O número de inicio da lista debe ser un número enteiro.\"},\"magicline\":{\"title\":\"Inserir aquí o parágrafo\"},\"maximize\":{\"maximize\":\"Maximizar\",\"minimize\":\"Minimizar\"},\"newpage\":{\"toolbar\":\"Páxina nova\"},\"pagebreak\":{\"alt\":\"Quebra de páxina\",\"toolbar\":\"Inserir quebra de páxina\"},\"pastetext\":{\"button\":\"Pegar como texto simple\",\"title\":\"Pegar como texto simple\"},\"pastefromword\":{\"confirmCleanup\":\"O texto que quere pegar semella ser copiado desde o Word. Quere depuralo antes de pegalo?\",\"error\":\"Non foi posíbel depurar os datos pegados por mor dun erro interno\",\"title\":\"Pegar desde Word\",\"toolbar\":\"Pegar desde Word\"},\"preview\":{\"preview\":\"Vista previa\"},\"print\":{\"toolbar\":\"Imprimir\"},\"removeformat\":{\"toolbar\":\"Retirar o formato\"},\"save\":{\"toolbar\":\"Gardar\"},\"selectall\":{\"toolbar\":\"Seleccionar todo\"},\"showblocks\":{\"toolbar\":\"Amosar os bloques\"},\"sourcearea\":{\"toolbar\":\"Orixe\"},\"specialchar\":{\"options\":\"Opcións de caracteres especiais\",\"title\":\"Seleccione un carácter especial\",\"toolbar\":\"Inserir un carácter especial\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Estilos\",\"panelTitle\":\"Estilos de formatando\",\"panelTitle1\":\"Estilos de bloque\",\"panelTitle2\":\"Estilos de liña\",\"panelTitle3\":\"Estilos de obxecto\"},\"table\":{\"border\":\"Tamaño do bordo\",\"caption\":\"Título\",\"cell\":{\"menu\":\"Cela\",\"insertBefore\":\"Inserir a cela á esquerda\",\"insertAfter\":\"Inserir a cela á dereita\",\"deleteCell\":\"Eliminar celas\",\"merge\":\"Combinar celas\",\"mergeRight\":\"Combinar á dereita\",\"mergeDown\":\"Combinar cara abaixo\",\"splitHorizontal\":\"Dividir a cela en horizontal\",\"splitVertical\":\"Dividir a cela en vertical\",\"title\":\"Propiedades da cela\",\"cellType\":\"Tipo de cela\",\"rowSpan\":\"Expandir filas\",\"colSpan\":\"Expandir columnas\",\"wordWrap\":\"Axustar ao contido\",\"hAlign\":\"Aliñación horizontal\",\"vAlign\":\"Aliñación vertical\",\"alignBaseline\":\"Liña de base\",\"bgColor\":\"Cor do fondo\",\"borderColor\":\"Cor do bordo\",\"data\":\"Datos\",\"header\":\"Cabeceira\",\"yes\":\"Si\",\"no\":\"Non\",\"invalidWidth\":\"O largo da cela debe ser un número.\",\"invalidHeight\":\"O alto da cela debe ser un número.\",\"invalidRowSpan\":\"A expansión de filas debe ser un número enteiro.\",\"invalidColSpan\":\"A expansión de columnas debe ser un número enteiro.\",\"chooseColor\":\"Escoller\"},\"cellPad\":\"Marxe interior da cela\",\"cellSpace\":\"Marxe entre celas\",\"column\":{\"menu\":\"Columna\",\"insertBefore\":\"Inserir a columna á esquerda\",\"insertAfter\":\"Inserir a columna á dereita\",\"deleteColumn\":\"Borrar Columnas\"},\"columns\":\"Columnas\",\"deleteTable\":\"Borrar Táboa\",\"headers\":\"Cabeceiras\",\"headersBoth\":\"Ambas\",\"headersColumn\":\"Primeira columna\",\"headersNone\":\"Ningún\",\"headersRow\":\"Primeira fila\",\"invalidBorder\":\"O tamaño do bordo debe ser un número.\",\"invalidCellPadding\":\"A marxe interior debe ser un número positivo.\",\"invalidCellSpacing\":\"A marxe entre celas debe ser un número positivo.\",\"invalidCols\":\"O número de columnas debe ser un número maior que 0.\",\"invalidHeight\":\"O alto da táboa debe ser un número.\",\"invalidRows\":\"O número de filas debe ser un número maior que 0\",\"invalidWidth\":\"O largo da táboa debe ser un número.\",\"menu\":\"Propiedades da táboa\",\"row\":{\"menu\":\"Fila\",\"insertBefore\":\"Inserir a fila por riba\",\"insertAfter\":\"Inserir a fila por baixo\",\"deleteRow\":\"Eliminar filas\"},\"rows\":\"Filas\",\"summary\":\"Resumo\",\"title\":\"Propiedades da táboa\",\"toolbar\":\"Taboa\",\"widthPc\":\"porcentaxe\",\"widthPx\":\"píxeles\",\"widthUnit\":\"unidade do largo\"},\"undo\":{\"redo\":\"Refacer\",\"undo\":\"Desfacer\"},\"wsc\":{\"btnIgnore\":\"Ignorar\",\"btnIgnoreAll\":\"Ignorar Todas\",\"btnReplace\":\"Substituir\",\"btnReplaceAll\":\"Substituir Todas\",\"btnUndo\":\"Desfacer\",\"changeTo\":\"Cambiar a\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"O corrector ortográfico non está instalado. ¿Quere descargalo agora?\",\"manyChanges\":\"Corrección ortográfica rematada: %1 verbas substituidas\",\"noChanges\":\"Corrección ortográfica rematada: Non se substituiu nengunha verba\",\"noMispell\":\"Corrección ortográfica rematada: Non se atoparon erros\",\"noSuggestions\":\"- Sen candidatos -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Non está no diccionario\",\"oneChange\":\"Corrección ortográfica rematada: Unha verba substituida\",\"progress\":\"Corrección ortográfica en progreso...\",\"title\":\"Spell Checker\",\"toolbar\":\"Corrección Ortográfica\"}};"
  },
  {
    "path": "assets/ckeditor/lang/gu.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['gu']={\"editor\":\"રીચ ટેક્ષ્ત્ એડીટર\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"પ્રેસ ALT 0 મદદ માટ\",\"browseServer\":\"સર્વર બ્રાઉઝ કરો\",\"url\":\"URL\",\"protocol\":\"પ્રોટોકૉલ\",\"upload\":\"અપલોડ\",\"uploadSubmit\":\"આ સર્વરને મોકલવું\",\"image\":\"ચિત્ર\",\"flash\":\"ફ્લૅશ\",\"form\":\"ફૉર્મ/પત્રક\",\"checkbox\":\"ચેક બોક્સ\",\"radio\":\"રેડિઓ બટન\",\"textField\":\"ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્ર\",\"textarea\":\"ટેક્સ્ટ એરિઆ, શબ્દ વિસ્તાર\",\"hiddenField\":\"ગુપ્ત ક્ષેત્ર\",\"button\":\"બટન\",\"select\":\"પસંદગી ક્ષેત્ર\",\"imageButton\":\"ચિત્ર બટન\",\"notSet\":\"<સેટ નથી>\",\"id\":\"Id\",\"name\":\"નામ\",\"langDir\":\"ભાષા લેખવાની પદ્ધતિ\",\"langDirLtr\":\"ડાબે થી જમણે (LTR)\",\"langDirRtl\":\"જમણે થી ડાબે (RTL)\",\"langCode\":\"ભાષા કોડ\",\"longDescr\":\"વધારે માહિતી માટે URL\",\"cssClass\":\"સ્ટાઇલ-શીટ ક્લાસ\",\"advisoryTitle\":\"મુખ્ય મથાળું\",\"cssStyle\":\"સ્ટાઇલ\",\"ok\":\"ઠીક છે\",\"cancel\":\"રદ કરવું\",\"close\":\"બંધ કરવું\",\"preview\":\"જોવું\",\"resize\":\"ખેંચી ને યોગ્ય કરવું\",\"generalTab\":\"જનરલ\",\"advancedTab\":\"અડ્વાન્સડ\",\"validateNumberFailed\":\"આ રકમ આકડો નથી.\",\"confirmNewPage\":\"સવે કાર્ય વગરનું ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવું પાનું ખોલવું છે?\",\"confirmCancel\":\"ઘણા વિકલ્પો બદલાયા છે. તમારે આ બોક્ષ્ બંધ કરવું છે?\",\"options\":\"વિકલ્પો\",\"target\":\"લક્ષ્ય\",\"targetNew\":\"નવી વિન્ડો (_blank)\",\"targetTop\":\"ઉપરની વિન્ડો (_top)\",\"targetSelf\":\"એજ વિન્ડો (_self)\",\"targetParent\":\"પેરનટ વિન્ડો (_parent)\",\"langDirLTR\":\"ડાબે થી જમણે (LTR)\",\"langDirRTL\":\"જમણે થી ડાબે (RTL)\",\"styles\":\"શૈલી\",\"cssClasses\":\"શૈલી કલાસીસ\",\"width\":\"પહોળાઈ\",\"height\":\"ઊંચાઈ\",\"align\":\"લાઇનદોરીમાં ગોઠવવું\",\"alignLeft\":\"ડાબી બાજુ ગોઠવવું\",\"alignRight\":\"જમણી\",\"alignCenter\":\"મધ્ય સેન્ટર\",\"alignJustify\":\"બ્લૉક, અંતરાય જસ્ટિફાઇ\",\"alignTop\":\"ઉપર\",\"alignMiddle\":\"વચ્ચે\",\"alignBottom\":\"નીચે\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"ઉંચાઈ એક આંકડો હોવો જોઈએ.\",\"invalidWidth\":\"પોહળ ઈ એક આંકડો હોવો જોઈએ.\",\"invalidCssLength\":\"\\\"%1\\\" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.\",\"invalidHtmlLength\":\"\\\"%1\\\" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા HTML measurement unit (px or %) વગર.\",\"invalidInlineStyle\":\"ઈનલાઈન  સ્ટાઈલ ની વેલ્યુ  \\\"name : value\\\" ના ફોર્મેટ માં હોવી જોઈએ, વચ્ચે સેમી-કોલોન જોઈએ.\",\"cssLengthTooltip\":\"પિક્ષ્લ્ નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, નથી મળતું</span>\"},\"about\":{\"copy\":\"કોપીરાઈટ &copy; $1. ઓલ રાઈટ્સ \",\"dlgTitle\":\"CKEditor વિષે\",\"help\":\"મદદ માટે $1 તપાસો\",\"moreInfo\":\"લાયસનસની માહિતી માટે અમારી વેબ સાઈટ\",\"title\":\"CKEditor વિષે\",\"userGuide\":\"CKEditor યુઝર્સ ગાઈડ\"},\"basicstyles\":{\"bold\":\"બોલ્ડ/સ્પષ્ટ\",\"italic\":\"ઇટેલિક, ત્રાંસા\",\"strike\":\"છેકી નાખવું\",\"subscript\":\"એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન\",\"superscript\":\"એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.\",\"underline\":\"અન્ડર્લાઇન, નીચે લીટી\"},\"bidi\":{\"ltr\":\"ટેક્ષ્ત્ ની દિશા ડાબે થી જમણે\",\"rtl\":\"ટેક્ષ્ત્ ની દિશા જમણે થી ડાબે\"},\"blockquote\":{\"toolbar\":\"બ્લૉક-કોટ, અવતરણચિહ્નો\"},\"clipboard\":{\"copy\":\"નકલ\",\"copyError\":\"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી.  (Ctrl/Cmd+C) का प्रयोग करें।\",\"cut\":\"કાપવું\",\"cutError\":\"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.\",\"paste\":\"પેસ્ટ\",\"pasteArea\":\"પેસ્ટ કરવાની જગ્યા\",\"pasteMsg\":\"Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો\",\"securityMsg\":\"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.\",\"title\":\"પેસ્ટ\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"સ્વચાલિત\",\"bgColorTitle\":\"બૅકગ્રાઉન્ડ રંગ,\",\"colors\":{\"000\":\"કાળો\",\"800000\":\"મરુન\",\"8B4513\":\"છીક\",\"2F4F4F\":\"ડાર્ક સ્લેટ ગ્રે \",\"008080\":\"ટીલ\",\"000080\":\"નેવી\",\"4B0082\":\"જામલી\",\"696969\":\"ડાર્ક ગ્રે\",\"B22222\":\"ઈટ\",\"A52A2A\":\"બ્રાઉન\",\"DAA520\":\"ગોલ્ડન રોડ\",\"006400\":\"ડાર્ક લીલો\",\"40E0D0\":\"ટ્રકોઈસ\",\"0000CD\":\"મધ્યમ વાદળી\",\"800080\":\"પર્પલ\",\"808080\":\"ગ્રે\",\"F00\":\"લાલ\",\"FF8C00\":\"ડાર્ક ઓરંજ\",\"FFD700\":\"ગોલ્ડ\",\"008000\":\"ગ્રીન\",\"0FF\":\"સાયન\",\"00F\":\"વાદળી\",\"EE82EE\":\"વાયોલેટ\",\"A9A9A9\":\"ડીમ \",\"FFA07A\":\"લાઈટ સાલમન\",\"FFA500\":\"ઓરંજ\",\"FFFF00\":\"પીળો\",\"00FF00\":\"લાઈમ\",\"AFEEEE\":\"પેલ કોઈસ\",\"ADD8E6\":\"લાઈટ બ્લુ\",\"DDA0DD\":\"પલ્મ\",\"D3D3D3\":\"લાઈટ ગ્રે\",\"FFF0F5\":\"લવંડર \",\"FAEBD7\":\"એન્ટીક સફેદ\",\"FFFFE0\":\"લાઈટ પીળો\",\"F0FFF0\":\"હનીડઉય\",\"F0FFFF\":\"અઝુરે\",\"F0F8FF\":\"એલીસ બ્લુ\",\"E6E6FA\":\"લવંડર\",\"FFF\":\"સફેદ\"},\"more\":\"ઔર રંગ...\",\"panelTitle\":\"રંગ\",\"textColorTitle\":\"શબ્દનો રંગ\"},\"colordialog\":{\"clear\":\"સાફ કરવું\",\"highlight\":\"હાઈઈટ\",\"options\":\"રંગના વિકલ્પ\",\"selected\":\"પસંદ કરેલો રંગ\",\"title\":\"રંગ પસંદ કરો\"},\"templates\":{\"button\":\"ટેમ્પ્લેટ\",\"emptyListMsg\":\"(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)\",\"insertOption\":\"મૂળ શબ્દને બદલો\",\"options\":\"ટેમ્પ્લેટના વિકલ્પો\",\"selectPromptMsg\":\"એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):\",\"title\":\"કન્ટેન્ટ ટેમ્પ્લેટ\"},\"contextmenu\":{\"options\":\"કોન્તેક્ષ્ત્ મેનુના વિકલ્પો\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"એડવાઈઝર શીર્ષક\",\"cssClassInputLabel\":\"સ્ટાઈલશીટ કલાસીસ\",\"edit\":\"ડીવીમાં ફેરફાર કરવો\",\"inlineStyleInputLabel\":\"ઈનલાઈન પદ્ધતિ\",\"langDirLTRLabel\":\"ડાબે થી જમણે (LTR)\",\"langDirLabel\":\"ભાષાની દિશા\",\"langDirRTLLabel\":\"જમણે થી ડાબે (RTL)\",\"languageCodeInputLabel\":\"ભાષાનો કોડ\",\"remove\":\"ડીવી કાઢી કાઢવું\",\"styleSelectLabel\":\"સ્ટાઈલ\",\"title\":\"Div કન્ટેનર બનાવુંવું\",\"toolbar\":\"Div કન્ટેનર બનાવુંવું\"},\"toolbar\":{\"toolbarCollapse\":\"ટૂલબાર નાનું કરવું\",\"toolbarExpand\":\"ટૂલબાર મોટું કરવું\",\"toolbarGroups\":{\"document\":\"દસ્તાવેજ\",\"clipboard\":\"ક્લિપબોર્ડ/અન\",\"editing\":\"એડીટ કરવું\",\"forms\":\"ફોર્મ\",\"basicstyles\":\"બેસિક્ સ્ટાઇલ\",\"paragraph\":\"ફકરો\",\"links\":\"લીંક\",\"insert\":\"ઉમેરવું\",\"styles\":\"સ્ટાઇલ\",\"colors\":\"રંગ\",\"tools\":\"ટૂલ્સ\"},\"toolbars\":\"એડીટર ટૂલ બાર\"},\"elementspath\":{\"eleLabel\":\"એલીમેન્ટ્સ નો \",\"eleTitle\":\"એલીમેન્ટ %1\"},\"find\":{\"find\":\"શોધવું\",\"findOptions\":\"વીકલ્પ શોધો\",\"findWhat\":\"આ શોધો\",\"matchCase\":\"કેસ સરખા રાખો\",\"matchCyclic\":\"સરખાવવા બધા\",\"matchWord\":\"બઘા શબ્દ સરખા રાખો\",\"notFoundMsg\":\"તમે શોધેલી ટેક્સ્ટ નથી મળી\",\"replace\":\"રિપ્લેસ/બદલવું\",\"replaceAll\":\"બઘા બદલી \",\"replaceSuccessMsg\":\"%1 ફેરફારો બાદલાયા છે.\",\"replaceWith\":\"આનાથી બદલો\",\"title\":\"શોધવું અને બદલવું\"},\"fakeobjects\":{\"anchor\":\"અનકર\",\"flash\":\"ફ્લેશ \",\"hiddenfield\":\"હિડન \",\"iframe\":\"IFrame\",\"unknown\":\"અનનોન ઓબ્જેક્ટ\"},\"flash\":{\"access\":\"સ્ક્રીપ્ટ એક્સેસ\",\"accessAlways\":\"હમેશાં\",\"accessNever\":\"નહી\",\"accessSameDomain\":\"એજ ડોમેન\",\"alignAbsBottom\":\"Abs નીચે\",\"alignAbsMiddle\":\"Abs ઉપર\",\"alignBaseline\":\"આધાર લીટી\",\"alignTextTop\":\"ટેક્સ્ટ ઉપર\",\"bgcolor\":\"બૅકગ્રાઉન્ડ રંગ,\",\"chkFull\":\"ફૂલ સ્ક્રીન કરવું\",\"chkLoop\":\"લૂપ\",\"chkMenu\":\"ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો\",\"chkPlay\":\"ઑટો/સ્વયં પ્લે\",\"flashvars\":\"ફલેશ ના વિકલ્પો\",\"hSpace\":\"સમસ્તરીય જગ્યા\",\"properties\":\"ફ્લૅશના ગુણ\",\"propertiesTab\":\"ગુણ\",\"quality\":\"ગુણધર્મ\",\"qualityAutoHigh\":\"ઓટો ઊંચું\",\"qualityAutoLow\":\"ઓટો નીચું\",\"qualityBest\":\"શ્રેષ્ઠ\",\"qualityHigh\":\"ઊંચું\",\"qualityLow\":\"નીચું\",\"qualityMedium\":\"મધ્યમ\",\"scale\":\"સ્કેલ\",\"scaleAll\":\"સ્કેલ ઓલ/બધુ બતાવો\",\"scaleFit\":\"સ્કેલ એકદમ ફીટ\",\"scaleNoBorder\":\"સ્કેલ બોર્ડર વગર\",\"title\":\"ફ્લૅશ ગુણ\",\"vSpace\":\"લંબરૂપ જગ્યા\",\"validateHSpace\":\"HSpace આંકડો હોવો જોઈએ.\",\"validateSrc\":\"લિંક  URL ટાઇપ કરો\",\"validateVSpace\":\"VSpace આંકડો હોવો જોઈએ.\",\"windowMode\":\"વિન્ડો મોડ\",\"windowModeOpaque\":\"અપારદર્શક\",\"windowModeTransparent\":\"પારદર્શક\",\"windowModeWindow\":\"વિન્ડો\"},\"font\":{\"fontSize\":{\"label\":\"ફૉન્ટ સાઇઝ/કદ\",\"voiceLabel\":\"ફોન્ટ સાઈઝ\",\"panelTitle\":\"ફૉન્ટ સાઇઝ/કદ\"},\"label\":\"ફૉન્ટ\",\"panelTitle\":\"ફૉન્ટ\",\"voiceLabel\":\"ફોન્ટ\"},\"forms\":{\"button\":{\"title\":\"બટનના ગુણ\",\"text\":\"ટેક્સ્ટ (વૅલ્યૂ)\",\"type\":\"પ્રકાર\",\"typeBtn\":\"બટન\",\"typeSbm\":\"સબ્મિટ\",\"typeRst\":\"રિસેટ\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"ચેક બોક્સ ગુણ\",\"radioTitle\":\"રેડિઓ બટનના ગુણ\",\"value\":\"વૅલ્યૂ\",\"selected\":\"સિલેક્ટેડ\",\"required\":\"Required\"},\"form\":{\"title\":\"ફૉર્મ/પત્રકના ગુણ\",\"menu\":\"ફૉર્મ/પત્રકના ગુણ\",\"action\":\"ક્રિયા\",\"method\":\"પદ્ધતિ\",\"encoding\":\"અન્કોડીન્ગ\"},\"hidden\":{\"title\":\"ગુપ્ત ક્ષેત્રના ગુણ\",\"name\":\"નામ\",\"value\":\"વૅલ્યૂ\"},\"select\":{\"title\":\"પસંદગી ક્ષેત્રના ગુણ\",\"selectInfo\":\"સૂચના\",\"opAvail\":\"ઉપલબ્ધ વિકલ્પ\",\"value\":\"વૅલ્યૂ\",\"size\":\"સાઇઝ\",\"lines\":\"લીટીઓ\",\"chkMulti\":\"એકથી વધારે પસંદ કરી શકો\",\"required\":\"Required\",\"opText\":\"ટેક્સ્ટ\",\"opValue\":\"વૅલ્યૂ\",\"btnAdd\":\"ઉમેરવું\",\"btnModify\":\"બદલવું\",\"btnUp\":\"ઉપર\",\"btnDown\":\"નીચે\",\"btnSetValue\":\"પસંદ કરલી વૅલ્યૂ સેટ કરો\",\"btnDelete\":\"રદ કરવું\"},\"textarea\":{\"title\":\"ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ\",\"cols\":\"કૉલમ/ઊભી કટાર\",\"rows\":\"પંક્તિઓ\"},\"textfield\":{\"title\":\"ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ\",\"name\":\"નામ\",\"value\":\"વૅલ્યૂ\",\"charWidth\":\"કેરેક્ટરની પહોળાઈ\",\"maxChars\":\"અધિકતમ કેરેક્ટર\",\"required\":\"Required\",\"type\":\"ટાઇપ\",\"typeText\":\"ટેક્સ્ટ\",\"typePass\":\"પાસવર્ડ\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"ફૉન્ટ ફૉર્મટ, રચનાની શૈલી\",\"panelTitle\":\"ફૉન્ટ ફૉર્મટ, રચનાની શૈલી\",\"tag_address\":\"સરનામું\",\"tag_div\":\"શીર્ષક (DIV)\",\"tag_h1\":\"શીર્ષક 1\",\"tag_h2\":\"શીર્ષક 2\",\"tag_h3\":\"શીર્ષક 3\",\"tag_h4\":\"શીર્ષક 4\",\"tag_h5\":\"શીર્ષક 5\",\"tag_h6\":\"શીર્ષક 6\",\"tag_p\":\"સામાન્ય\",\"tag_pre\":\"ફૉર્મટેડ\"},\"horizontalrule\":{\"toolbar\":\"સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી\"},\"iframe\":{\"border\":\"ફ્રેમ બોર્ડેર બતાવવી\",\"noUrl\":\"iframe URL ટાઈપ્ કરો\",\"scrolling\":\"સ્ક્રોલબાર ચાલુ કરવા\",\"title\":\"IFrame વિકલ્પો\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"ઑલ્ટર્નટ ટેક્સ્ટ\",\"border\":\"બોર્ડર\",\"btnUpload\":\"આ સર્વરને મોકલવું\",\"button2Img\":\"તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.\",\"hSpace\":\"સમસ્તરીય જગ્યા\",\"img2Button\":\"તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.\",\"infoTab\":\"ચિત્ર ની જાણકારી\",\"linkTab\":\"લિંક\",\"lockRatio\":\"લૉક ગુણોત્તર\",\"menu\":\"ચિત્રના ગુણ\",\"resetSize\":\"રીસેટ સાઇઝ\",\"title\":\"ચિત્રના ગુણ\",\"titleButton\":\"ચિત્ર બટનના ગુણ\",\"upload\":\"અપલોડ\",\"urlMissing\":\"ઈમેજની મૂળ URL છે નહી.\",\"vSpace\":\"લંબરૂપ જગ્યા\",\"validateBorder\":\"બોર્ડેર આંકડો હોવો જોઈએ.\",\"validateHSpace\":\"HSpaceઆંકડો હોવો જોઈએ.\",\"validateVSpace\":\"VSpace આંકડો હોવો જોઈએ. \"},\"indent\":{\"indent\":\"ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી\",\"outdent\":\"ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી\"},\"smiley\":{\"options\":\"સમ્ય્લી વિકલ્પો\",\"title\":\"સ્માઇલી  પસંદ કરો\",\"toolbar\":\"સ્માઇલી\"},\"justify\":{\"block\":\"બ્લૉક, અંતરાય જસ્ટિફાઇ\",\"center\":\"સંકેંદ્રણ/સેંટરિંગ\",\"left\":\"ડાબી બાજુએ/બાજુ તરફ\",\"right\":\"જમણી બાજુએ/બાજુ તરફ\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"ઍક્સેસ કી\",\"advanced\":\"અડ્વાન્સડ\",\"advisoryContentType\":\"મુખ્ય કન્ટેન્ટ પ્રકાર\",\"advisoryTitle\":\"મુખ્ય મથાળું\",\"anchor\":{\"toolbar\":\"ઍંકર ઇન્સર્ટ/દાખલ કરવી\",\"menu\":\"ઍંકરના ગુણ\",\"title\":\"ઍંકરના ગુણ\",\"name\":\"ઍંકરનું નામ\",\"errorName\":\"ઍંકરનું નામ ટાઈપ કરો\",\"remove\":\"સ્થિર નકરવું\"},\"anchorId\":\"ઍંકર એલિમન્ટ Id થી પસંદ કરો\",\"anchorName\":\"ઍંકર નામથી પસંદ કરો\",\"charset\":\"લિંક રિસૉર્સ કૅરિક્ટર સેટ\",\"cssClasses\":\"સ્ટાઇલ-શીટ ક્લાસ\",\"emailAddress\":\"ઈ-મેલ સરનામું\",\"emailBody\":\"સંદેશ\",\"emailSubject\":\"ઈ-મેલ વિષય\",\"id\":\"Id\",\"info\":\"લિંક ઇન્ફૉ ટૅબ\",\"langCode\":\"ભાષા લેખવાની પદ્ધતિ\",\"langDir\":\"ભાષા લેખવાની પદ્ધતિ\",\"langDirLTR\":\"ડાબે થી જમણે (LTR)\",\"langDirRTL\":\"જમણે થી ડાબે (RTL)\",\"menu\":\" લિંક એડિટ/માં ફેરફાર કરવો\",\"name\":\"નામ\",\"noAnchors\":\"(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)\",\"noEmail\":\"ઈ-મેલ સરનામું ટાઇપ કરો\",\"noUrl\":\"લિંક  URL ટાઇપ કરો\",\"other\":\"<other> <અન્ય>\",\"popupDependent\":\"ડિપેન્ડન્ટ (Netscape)\",\"popupFeatures\":\"પૉપ-અપ વિન્ડો ફીચરસૅ\",\"popupFullScreen\":\"ફુલ સ્ક્રીન (IE)\",\"popupLeft\":\"ડાબી બાજુ\",\"popupLocationBar\":\"લોકેશન બાર\",\"popupMenuBar\":\"મેન્યૂ બાર\",\"popupResizable\":\"રીસાઈઝએબલ\",\"popupScrollBars\":\"સ્ક્રોલ બાર\",\"popupStatusBar\":\"સ્ટૅટસ બાર\",\"popupToolbar\":\"ટૂલ બાર\",\"popupTop\":\"જમણી બાજુ\",\"rel\":\"સંબંધની સ્થિતિ\",\"selectAnchor\":\"ઍંકર પસંદ કરો\",\"styles\":\"સ્ટાઇલ\",\"tabIndex\":\"ટૅબ ઇન્ડેક્સ\",\"target\":\"ટાર્ગેટ/લક્ષ્ય\",\"targetFrame\":\"<ફ્રેમ>\",\"targetFrameName\":\"ટાર્ગેટ ફ્રેમ નું નામ\",\"targetPopup\":\"<પૉપ-અપ વિન્ડો>\",\"targetPopupName\":\"પૉપ-અપ વિન્ડો નું નામ\",\"title\":\"લિંક\",\"toAnchor\":\"આ પેજનો ઍંકર\",\"toEmail\":\"ઈ-મેલ\",\"toUrl\":\"URL\",\"toolbar\":\"લિંક ઇન્સર્ટ/દાખલ કરવી\",\"type\":\"લિંક પ્રકાર\",\"unlink\":\"લિંક કાઢવી\",\"upload\":\"અપલોડ\"},\"list\":{\"bulletedlist\":\"બુલેટ સૂચિ\",\"numberedlist\":\"સંખ્યાંકન સૂચિ\"},\"liststyle\":{\"armenian\":\"અરમેનિયન આંકડા પદ્ધતિ\",\"bulletedTitle\":\"બુલેટેડ લીસ્ટના ગુણ\",\"circle\":\"વર્તુળ\",\"decimal\":\"આંકડા (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"સુન્ય આગળ આંકડા (01, 02, 03, etc.)\",\"disc\":\"ડિસ્ક\",\"georgian\":\"ગેઓર્ગિયન આંકડા પદ્ધતિ (an, ban, gan, etc.)\",\"lowerAlpha\":\"આલ્ફા નાના (a, b, c, d, e, etc.)\",\"lowerGreek\":\"ગ્રીક નાના (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"રોમન નાના (i, ii, iii, iv, v, etc.)\",\"none\":\"કસુ \",\"notset\":\"<સેટ નથી>\",\"numberedTitle\":\"આંકડાના લીસ્ટના ગુણ\",\"square\":\"ચોરસ\",\"start\":\"શરુ કરવું\",\"type\":\"પ્રકાર\",\"upperAlpha\":\"આલ્ફા મોટા (A, B, C, D, E, etc.)\",\"upperRoman\":\"રોમન મોટા (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"લીસ્ટના સરુઆતનો આંકડો પુરો હોવો જોઈએ.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"મોટું કરવું\",\"minimize\":\"નાનું કરવું\"},\"newpage\":{\"toolbar\":\"નવુ પાનું\"},\"pagebreak\":{\"alt\":\"નવું પાનું\",\"toolbar\":\"ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું\"},\"pastetext\":{\"button\":\"પેસ્ટ (ટેક્સ્ટ)\",\"title\":\"પેસ્ટ (ટેક્સ્ટ)\"},\"pastefromword\":{\"confirmCleanup\":\"તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?\",\"error\":\"પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.\",\"title\":\"પેસ્ટ (વડૅ ટેક્સ્ટ)\",\"toolbar\":\"પેસ્ટ (વડૅ ટેક્સ્ટ)\"},\"preview\":{\"preview\":\"પૂર્વદર્શન\"},\"print\":{\"toolbar\":\"પ્રિન્ટ\"},\"removeformat\":{\"toolbar\":\"ફૉર્મટ કાઢવું\"},\"save\":{\"toolbar\":\"સેવ\"},\"selectall\":{\"toolbar\":\"બઘું પસંદ કરવું\"},\"showblocks\":{\"toolbar\":\"બ્લૉક બતાવવું\"},\"sourcearea\":{\"toolbar\":\"મૂળ કે પ્રાથમિક દસ્તાવેજ\"},\"specialchar\":{\"options\":\"સ્પેશિઅલ કરેક્ટરના વિકલ્પો\",\"title\":\"સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો\",\"toolbar\":\"વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું\"},\"scayt\":{\"btn_about\":\"SCAYT વિષે\",\"btn_dictionaries\":\"શબ્દકોશ\",\"btn_disable\":\"SCAYT ડિસેબલ કરવું\",\"btn_enable\":\"SCAYT એનેબલ કરવું\",\"btn_langs\":\"ભાષાઓ\",\"btn_options\":\"વિકલ્પો\",\"text_title\":\"ટાઈપ કરતા સ્પેલ તપાસો\"},\"stylescombo\":{\"label\":\"શૈલી/રીત\",\"panelTitle\":\"ફોર્મેટ \",\"panelTitle1\":\"બ્લોક \",\"panelTitle2\":\"ઈનલાઈન \",\"panelTitle3\":\"ઓબ્જેક્ટ પદ્ધતિ\"},\"table\":{\"border\":\"કોઠાની બાજુ(બોર્ડર) સાઇઝ\",\"caption\":\"મથાળું/કૅપ્શન \",\"cell\":{\"menu\":\"કોષના ખાના\",\"insertBefore\":\"પહેલાં કોષ ઉમેરવો\",\"insertAfter\":\"પછી કોષ ઉમેરવો\",\"deleteCell\":\"કોષ ડિલીટ/કાઢી નાખવો\",\"merge\":\"કોષ ભેગા કરવા\",\"mergeRight\":\"જમણી બાજુ ભેગા કરવા\",\"mergeDown\":\"નીચે ભેગા કરવા\",\"splitHorizontal\":\"કોષને સમસ્તરીય વિભાજન કરવું\",\"splitVertical\":\"કોષને સીધું ને ઊભું વિભાજન કરવું\",\"title\":\"સેલના ગુણ\",\"cellType\":\"સેલનો પ્રકાર\",\"rowSpan\":\"આડી કટારની જગ્યા\",\"colSpan\":\"ઊભી કતારની જગ્યા\",\"wordWrap\":\"વર્ડ રેપ\",\"hAlign\":\"સપાટ લાઈનદોરી\",\"vAlign\":\"ઊભી લાઈનદોરી\",\"alignBaseline\":\"બસે લાઈન\",\"bgColor\":\"પાછાળનો રંગ\",\"borderColor\":\"બોર્ડેર રંગ\",\"data\":\"સ્વીકૃત માહિતી\",\"header\":\"મથાળું\",\"yes\":\"હા\",\"no\":\"ના\",\"invalidWidth\":\"સેલની પોહલાઈ આંકડો હોવો જોઈએ.\",\"invalidHeight\":\"સેલની ઊંચાઈ આંકડો હોવો જોઈએ.\",\"invalidRowSpan\":\"રો સ્પાન આંકડો હોવો જોઈએ.\",\"invalidColSpan\":\"કોલમ સ્પાન આંકડો હોવો જોઈએ.\",\"chooseColor\":\"પસંદ કરવું\"},\"cellPad\":\"સેલ પૅડિંગ\",\"cellSpace\":\"સેલ અંતર\",\"column\":{\"menu\":\"કૉલમ/ઊભી કટાર\",\"insertBefore\":\"પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી\",\"insertAfter\":\"પછી કૉલમ/ઊભી કટાર ઉમેરવી\",\"deleteColumn\":\"કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી\"},\"columns\":\"કૉલમ/ઊભી કટાર\",\"deleteTable\":\"કોઠો ડિલીટ/કાઢી નાખવું\",\"headers\":\"મથાળા\",\"headersBoth\":\"બેવું\",\"headersColumn\":\"પહેલી ઊભી કટાર\",\"headersNone\":\"નથી \",\"headersRow\":\"પહેલી  કટાર\",\"invalidBorder\":\"બોર્ડર એક આંકડો હોવો જોઈએ\",\"invalidCellPadding\":\"સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.\",\"invalidCellSpacing\":\"સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.\",\"invalidCols\":\"ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.\",\"invalidHeight\":\"ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.\",\"invalidRows\":\"આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.\",\"invalidWidth\":\"ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.\",\"menu\":\"ટેબલ, કોઠાનું મથાળું\",\"row\":{\"menu\":\"પંક્તિના ખાના\",\"insertBefore\":\"પહેલાં પંક્તિ ઉમેરવી\",\"insertAfter\":\"પછી પંક્તિ ઉમેરવી\",\"deleteRow\":\"પંક્તિઓ ડિલીટ/કાઢી નાખવી\"},\"rows\":\"પંક્તિના ખાના\",\"summary\":\"ટૂંકો એહેવાલ\",\"title\":\"ટેબલ, કોઠાનું મથાળું\",\"toolbar\":\"ટેબલ, કોઠો\",\"widthPc\":\"પ્રતિશત\",\"widthPx\":\"પિકસલ\",\"widthUnit\":\"પોહાલાઈ એકમ\"},\"undo\":{\"redo\":\"રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી\",\"undo\":\"રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી\"},\"wsc\":{\"btnIgnore\":\"ઇગ્નોર/અવગણના કરવી\",\"btnIgnoreAll\":\"બધાની ઇગ્નોર/અવગણના કરવી\",\"btnReplace\":\"બદલવું\",\"btnReplaceAll\":\"બધા બદલી કરો\",\"btnUndo\":\"અન્ડૂ\",\"changeTo\":\"આનાથી બદલવું\",\"errorLoading\":\"સર્વિસ એપ્લીકેશન લોડ નથી થ: %s.\",\"ieSpellDownload\":\"સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?\",\"manyChanges\":\"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે\",\"noChanges\":\"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી\",\"noMispell\":\"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી\",\"noSuggestions\":\"- કઇ સજેશન નથી -\",\"notAvailable\":\"માફ કરશો, આ સુવિધા ઉપલબ્ધ નથી\",\"notInDic\":\"શબ્દકોશમાં નથી\",\"oneChange\":\"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે\",\"progress\":\"શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...\",\"title\":\"સ્પેલ \",\"toolbar\":\"જોડણી (સ્પેલિંગ) તપાસવી\"}};"
  },
  {
    "path": "assets/ckeditor/lang/he.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['he']={\"editor\":\"עורך טקסט עשיר\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"לחץ אלט ALT + 0 לעזרה\",\"browseServer\":\"סייר השרת\",\"url\":\"כתובת (URL)\",\"protocol\":\"פרוטוקול\",\"upload\":\"העלאה\",\"uploadSubmit\":\"שליחה לשרת\",\"image\":\"תמונה\",\"flash\":\"פלאש\",\"form\":\"טופס\",\"checkbox\":\"תיבת סימון\",\"radio\":\"לחצן אפשרויות\",\"textField\":\"שדה טקסט\",\"textarea\":\"איזור טקסט\",\"hiddenField\":\"שדה חבוי\",\"button\":\"כפתור\",\"select\":\"שדה בחירה\",\"imageButton\":\"כפתור תמונה\",\"notSet\":\"<לא נקבע>\",\"id\":\"זיהוי (ID)\",\"name\":\"שם\",\"langDir\":\"כיוון שפה\",\"langDirLtr\":\"שמאל לימין (LTR)\",\"langDirRtl\":\"ימין לשמאל (RTL)\",\"langCode\":\"קוד שפה\",\"longDescr\":\"קישור לתיאור מפורט\",\"cssClass\":\"מחלקת עיצוב (CSS Class)\",\"advisoryTitle\":\"כותרת מוצעת\",\"cssStyle\":\"סגנון\",\"ok\":\"אישור\",\"cancel\":\"ביטול\",\"close\":\"סגירה\",\"preview\":\"תצוגה מקדימה\",\"resize\":\"יש לגרור בכדי לשנות את הגודל\",\"generalTab\":\"כללי\",\"advancedTab\":\"אפשרויות מתקדמות\",\"validateNumberFailed\":\"הערך חייב להיות מספרי.\",\"confirmNewPage\":\"כל השינויים שלא נשמרו יאבדו. האם להעלות דף חדש?\",\"confirmCancel\":\"חלק מהאפשרויות שונו, האם לסגור את הדיאלוג?\",\"options\":\"אפשרויות\",\"target\":\"מטרה\",\"targetNew\":\"חלון חדש (_blank)\",\"targetTop\":\"החלון העליון ביותר (_top)\",\"targetSelf\":\"אותו חלון (_self)\",\"targetParent\":\"חלון האב (_parent)\",\"langDirLTR\":\"שמאל לימין (LTR)\",\"langDirRTL\":\"ימין לשמאל (RTL)\",\"styles\":\"סגנון\",\"cssClasses\":\"מחלקות גליונות סגנון\",\"width\":\"רוחב\",\"height\":\"גובה\",\"align\":\"יישור\",\"alignLeft\":\"לשמאל\",\"alignRight\":\"לימין\",\"alignCenter\":\"מרכז\",\"alignJustify\":\"יישור לשוליים\",\"alignTop\":\"למעלה\",\"alignMiddle\":\"לאמצע\",\"alignBottom\":\"לתחתית\",\"alignNone\":\"None\",\"invalidValue\":\"ערך לא חוקי.\",\"invalidHeight\":\"הגובה חייב להיות מספר.\",\"invalidWidth\":\"הרוחב חייב להיות מספר.\",\"invalidCssLength\":\"הערך שצוין לשדה \\\"%1\\\" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, או pc).\",\"invalidHtmlLength\":\"הערך שצוין לשדה \\\"%1\\\" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של HTML (px או %).\",\"invalidInlineStyle\":\"הערך שצויין לשדה הסגנון חייב להכיל זוג ערכים אחד או יותר בפורמט \\\"שם : ערך\\\", מופרדים על ידי נקודה-פסיק.\",\"cssLengthTooltip\":\"יש להכניס מספר המייצג פיקסלים או מספר עם יחידת גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, או pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, לא זמין</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. כל הזכויות שמורות.\",\"dlgTitle\":\"אודות CKEditor\",\"help\":\"היכנסו ל$1 לעזרה.\",\"moreInfo\":\"למידע נוסף בקרו באתרנו:\",\"title\":\"אודות CKEditor\",\"userGuide\":\"מדריך המשתמש של CKEditor\"},\"basicstyles\":{\"bold\":\"מודגש\",\"italic\":\"נטוי\",\"strike\":\"כתיב מחוק\",\"subscript\":\"כתיב תחתון\",\"superscript\":\"כתיב עליון\",\"underline\":\"קו תחתון\"},\"bidi\":{\"ltr\":\"כיוון טקסט משמאל לימין (LTR)\",\"rtl\":\"כיוון טקסט מימין לשמאל (RTL)\"},\"blockquote\":{\"toolbar\":\"בלוק ציטוט\"},\"clipboard\":{\"copy\":\"העתקה\",\"copyError\":\"הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).\",\"cut\":\"גזירה\",\"cutError\":\"הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).\",\"paste\":\"הדבקה\",\"pasteArea\":\"איזור הדבקה\",\"pasteMsg\":\"נא להדביק בתוך הקופסה באמצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>אישור</b>.\",\"securityMsg\":\"עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.\",\"title\":\"הדבקה\"},\"button\":{\"selectedLabel\":\"1% (סומן)\"},\"colorbutton\":{\"auto\":\"אוטומטי\",\"bgColorTitle\":\"צבע רקע\",\"colors\":{\"000\":\"שחור\",\"800000\":\"סגול כהה\",\"8B4513\":\"חום בהיר\",\"2F4F4F\":\"אפור צפחה\",\"008080\":\"כחול-ירוק\",\"000080\":\"כחול-סגול\",\"4B0082\":\"אינדיגו\",\"696969\":\"אפור מעומעם\",\"B22222\":\"אדום-חום\",\"A52A2A\":\"חום\",\"DAA520\":\"כתום זהב\",\"006400\":\"ירוק כהה\",\"40E0D0\":\"טורקיז\",\"0000CD\":\"כחול בינוני\",\"800080\":\"סגול\",\"808080\":\"אפור\",\"F00\":\"אדום\",\"FF8C00\":\"כתום כהה\",\"FFD700\":\"זהב\",\"008000\":\"ירוק\",\"0FF\":\"ציאן\",\"00F\":\"כחול\",\"EE82EE\":\"סגלגל\",\"A9A9A9\":\"אפור כהה\",\"FFA07A\":\"כתום-וורוד\",\"FFA500\":\"כתום\",\"FFFF00\":\"צהוב\",\"00FF00\":\"ליים\",\"AFEEEE\":\"טורקיז בהיר\",\"ADD8E6\":\"כחול בהיר\",\"DDA0DD\":\"שזיף\",\"D3D3D3\":\"אפור בהיר\",\"FFF0F5\":\"לבנדר מסמיק\",\"FAEBD7\":\"לבן עתיק\",\"FFFFE0\":\"צהוב בהיר\",\"F0FFF0\":\"טל דבש\",\"F0FFFF\":\"תכלת\",\"F0F8FF\":\"כחול טיפת מים\",\"E6E6FA\":\"לבנדר\",\"FFF\":\"לבן\"},\"more\":\"צבעים נוספים...\",\"panelTitle\":\"צבעים\",\"textColorTitle\":\"צבע טקסט\"},\"colordialog\":{\"clear\":\"ניקוי\",\"highlight\":\"סימון\",\"options\":\"אפשרויות צבע\",\"selected\":\"בחירה\",\"title\":\"בחירת צבע\"},\"templates\":{\"button\":\"תבניות\",\"emptyListMsg\":\"(לא הוגדרו תבניות)\",\"insertOption\":\"החלפת תוכן ממשי\",\"options\":\"אפשרויות התבניות\",\"selectPromptMsg\":\"יש לבחור תבנית לפתיחה בעורך.<br />התוכן המקורי ימחק:\",\"title\":\"תביות תוכן\"},\"contextmenu\":{\"options\":\"אפשרויות תפריט ההקשר\"},\"div\":{\"IdInputLabel\":\"מזהה (ID)\",\"advisoryTitleInputLabel\":\"כותרת מוצעת\",\"cssClassInputLabel\":\"מחלקת עיצוב\",\"edit\":\"עריכת מיכל (Div)\",\"inlineStyleInputLabel\":\"סגנון פנימי\",\"langDirLTRLabel\":\"שמאל לימין (LTR)\",\"langDirLabel\":\"כיוון שפה\",\"langDirRTLLabel\":\"ימין לשמאל (RTL)\",\"languageCodeInputLabel\":\"קוד שפה\",\"remove\":\"הסרת מיכל (Div)\",\"styleSelectLabel\":\"סגנון\",\"title\":\"יצירת מיכל (Div)\",\"toolbar\":\"יצירת מיכל (Div)\"},\"toolbar\":{\"toolbarCollapse\":\"מזעור סרגל כלים\",\"toolbarExpand\":\"הרחבת סרגל כלים\",\"toolbarGroups\":{\"document\":\"מסמך\",\"clipboard\":\"לוח הגזירים (Clipboard)/צעד אחרון\",\"editing\":\"עריכה\",\"forms\":\"טפסים\",\"basicstyles\":\"עיצוב בסיסי\",\"paragraph\":\"פסקה\",\"links\":\"קישורים\",\"insert\":\"הכנסה\",\"styles\":\"עיצוב\",\"colors\":\"צבעים\",\"tools\":\"כלים\"},\"toolbars\":\"סרגלי כלים של העורך\"},\"elementspath\":{\"eleLabel\":\"עץ האלמנטים\",\"eleTitle\":\"%1 אלמנט\"},\"find\":{\"find\":\"חיפוש\",\"findOptions\":\"אפשרויות חיפוש\",\"findWhat\":\"חיפוש מחרוזת:\",\"matchCase\":\"הבחנה בין אותיות רשיות לקטנות (Case)\",\"matchCyclic\":\"התאמה מחזורית\",\"matchWord\":\"התאמה למילה המלאה\",\"notFoundMsg\":\"הטקסט המבוקש לא נמצא.\",\"replace\":\"החלפה\",\"replaceAll\":\"החלפה בכל העמוד\",\"replaceSuccessMsg\":\"%1 טקסטים הוחלפו.\",\"replaceWith\":\"החלפה במחרוזת:\",\"title\":\"חיפוש והחלפה\"},\"fakeobjects\":{\"anchor\":\"עוגן\",\"flash\":\"סרטון פלאש\",\"hiddenfield\":\"שדה חבוי\",\"iframe\":\"חלון פנימי (iframe)\",\"unknown\":\"אובייקט לא ידוע\"},\"flash\":{\"access\":\"גישת סקריפט\",\"accessAlways\":\"תמיד\",\"accessNever\":\"אף פעם\",\"accessSameDomain\":\"דומיין זהה\",\"alignAbsBottom\":\"לתחתית האבסולוטית\",\"alignAbsMiddle\":\"מרכוז אבסולוטי\",\"alignBaseline\":\"לקו התחתית\",\"alignTextTop\":\"לראש הטקסט\",\"bgcolor\":\"צבע רקע\",\"chkFull\":\"אפשר חלון מלא\",\"chkLoop\":\"לולאה\",\"chkMenu\":\"אפשר תפריט פלאש\",\"chkPlay\":\"ניגון אוטומטי\",\"flashvars\":\"משתנים לפלאש\",\"hSpace\":\"מרווח אופקי\",\"properties\":\"מאפייני פלאש\",\"propertiesTab\":\"מאפיינים\",\"quality\":\"איכות\",\"qualityAutoHigh\":\"גבוהה אוטומטית\",\"qualityAutoLow\":\"נמוכה אוטומטית\",\"qualityBest\":\"מעולה\",\"qualityHigh\":\"גבוהה\",\"qualityLow\":\"נמוכה\",\"qualityMedium\":\"ממוצעת\",\"scale\":\"גודל\",\"scaleAll\":\"הצג הכל\",\"scaleFit\":\"התאמה מושלמת\",\"scaleNoBorder\":\"ללא גבולות\",\"title\":\"מאפיני פלאש\",\"vSpace\":\"מרווח אנכי\",\"validateHSpace\":\"המרווח האופקי חייב להיות מספר.\",\"validateSrc\":\"יש להקליד את כתובת סרטון הפלאש (URL)\",\"validateVSpace\":\"המרווח האנכי חייב להיות מספר.\",\"windowMode\":\"מצב חלון\",\"windowModeOpaque\":\"אטום\",\"windowModeTransparent\":\"שקוף\",\"windowModeWindow\":\"חלון\"},\"font\":{\"fontSize\":{\"label\":\"גודל\",\"voiceLabel\":\"גודל\",\"panelTitle\":\"גודל\"},\"label\":\"גופן\",\"panelTitle\":\"גופן\",\"voiceLabel\":\"גופן\"},\"forms\":{\"button\":{\"title\":\"מאפייני כפתור\",\"text\":\"טקסט (ערך)\",\"type\":\"סוג\",\"typeBtn\":\"כפתור\",\"typeSbm\":\"שליחה\",\"typeRst\":\"איפוס\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"מאפייני תיבת סימון\",\"radioTitle\":\"מאפייני לחצן אפשרויות\",\"value\":\"ערך\",\"selected\":\"מסומן\",\"required\":\"Required\"},\"form\":{\"title\":\"מאפיני טופס\",\"menu\":\"מאפיני טופס\",\"action\":\"שלח אל\",\"method\":\"סוג שליחה\",\"encoding\":\"קידוד\"},\"hidden\":{\"title\":\"מאפיני שדה חבוי\",\"name\":\"שם\",\"value\":\"ערך\"},\"select\":{\"title\":\"מאפייני שדה בחירה\",\"selectInfo\":\"מידע\",\"opAvail\":\"אפשרויות זמינות\",\"value\":\"ערך\",\"size\":\"גודל\",\"lines\":\"שורות\",\"chkMulti\":\"איפשור בחירות מרובות\",\"required\":\"Required\",\"opText\":\"טקסט\",\"opValue\":\"ערך\",\"btnAdd\":\"הוספה\",\"btnModify\":\"שינוי\",\"btnUp\":\"למעלה\",\"btnDown\":\"למטה\",\"btnSetValue\":\"קביעה כברירת מחדל\",\"btnDelete\":\"מחיקה\"},\"textarea\":{\"title\":\"מאפייני איזור טקסט\",\"cols\":\"עמודות\",\"rows\":\"שורות\"},\"textfield\":{\"title\":\"מאפייני שדה טקסט\",\"name\":\"שם\",\"value\":\"ערך\",\"charWidth\":\"רוחב לפי תווים\",\"maxChars\":\"מקסימום תווים\",\"required\":\"Required\",\"type\":\"סוג\",\"typeText\":\"טקסט\",\"typePass\":\"סיסמה\",\"typeEmail\":\"דוא\\\"ל\",\"typeSearch\":\"חיפוש\",\"typeTel\":\"מספר טלפון\",\"typeUrl\":\"כתובת (URL)\"}},\"format\":{\"label\":\"עיצוב\",\"panelTitle\":\"עיצוב\",\"tag_address\":\"כתובת\",\"tag_div\":\"נורמלי (DIV)\",\"tag_h1\":\"כותרת\",\"tag_h2\":\"כותרת 2\",\"tag_h3\":\"כותרת 3\",\"tag_h4\":\"כותרת 4\",\"tag_h5\":\"כותרת 5\",\"tag_h6\":\"כותרת 6\",\"tag_p\":\"נורמלי\",\"tag_pre\":\"קוד\"},\"horizontalrule\":{\"toolbar\":\"הוספת קו אופקי\"},\"iframe\":{\"border\":\"הראה מסגרת לחלון\",\"noUrl\":\"יש להכניס כתובת לחלון.\",\"scrolling\":\"אפשר פסי גלילה\",\"title\":\"מאפייני חלון פנימי (iframe)\",\"toolbar\":\"חלון פנימי (iframe)\"},\"image\":{\"alt\":\"טקסט חלופי\",\"border\":\"מסגרת\",\"btnUpload\":\"שליחה לשרת\",\"button2Img\":\"האם להפוך את תמונת הכפתור לתמונה פשוטה?\",\"hSpace\":\"מרווח אופקי\",\"img2Button\":\"האם להפוך את התמונה לכפתור תמונה?\",\"infoTab\":\"מידע על התמונה\",\"linkTab\":\"קישור\",\"lockRatio\":\"נעילת היחס\",\"menu\":\"תכונות התמונה\",\"resetSize\":\"איפוס הגודל\",\"title\":\"מאפייני התמונה\",\"titleButton\":\"מאפיני כפתור תמונה\",\"upload\":\"העלאה\",\"urlMissing\":\"כתובת התמונה חסרה.\",\"vSpace\":\"מרווח אנכי\",\"validateBorder\":\"שדה המסגרת חייב להיות מספר שלם.\",\"validateHSpace\":\"שדה המרווח האופקי חייב להיות מספר שלם.\",\"validateVSpace\":\"שדה המרווח האנכי חייב להיות מספר שלם.\"},\"indent\":{\"indent\":\"הגדלת הזחה\",\"outdent\":\"הקטנת הזחה\"},\"smiley\":{\"options\":\"אפשרויות סמיילים\",\"title\":\"הוספת סמיילי\",\"toolbar\":\"סמיילי\"},\"justify\":{\"block\":\"יישור לשוליים\",\"center\":\"מרכוז\",\"left\":\"יישור לשמאל\",\"right\":\"יישור לימין\"},\"language\":{\"button\":\"צור שפה\",\"remove\":\"הסר שפה\"},\"link\":{\"acccessKey\":\"מקש גישה\",\"advanced\":\"אפשרויות מתקדמות\",\"advisoryContentType\":\"Content Type מוצע\",\"advisoryTitle\":\"כותרת מוצעת\",\"anchor\":{\"toolbar\":\"הוספת/עריכת נקודת עיגון\",\"menu\":\"מאפייני נקודת עיגון\",\"title\":\"מאפייני נקודת עיגון\",\"name\":\"שם לנקודת עיגון\",\"errorName\":\"יש להקליד שם לנקודת עיגון\",\"remove\":\"מחיקת נקודת עיגון\"},\"anchorId\":\"עפ\\\"י זיהוי (ID) האלמנט\",\"anchorName\":\"עפ\\\"י שם העוגן\",\"charset\":\"קידוד המשאב המקושר\",\"cssClasses\":\"גיליונות עיצוב קבוצות\",\"emailAddress\":\"כתובת הדוא\\\"ל\",\"emailBody\":\"גוף ההודעה\",\"emailSubject\":\"נושא ההודעה\",\"id\":\"זיהוי (ID)\",\"info\":\"מידע על הקישור\",\"langCode\":\"קוד שפה\",\"langDir\":\"כיוון שפה\",\"langDirLTR\":\"שמאל לימין (LTR)\",\"langDirRTL\":\"ימין לשמאל (RTL)\",\"menu\":\"מאפייני קישור\",\"name\":\"שם\",\"noAnchors\":\"(אין עוגנים זמינים בדף)\",\"noEmail\":\"יש להקליד את כתובת הדוא\\\"ל\",\"noUrl\":\"יש להקליד את כתובת הקישור (URL)\",\"other\":\"<אחר>\",\"popupDependent\":\"תלוי (Netscape)\",\"popupFeatures\":\"תכונות החלון הקופץ\",\"popupFullScreen\":\"מסך מלא (IE)\",\"popupLeft\":\"מיקום צד שמאל\",\"popupLocationBar\":\"סרגל כתובת\",\"popupMenuBar\":\"סרגל תפריט\",\"popupResizable\":\"שינוי גודל\",\"popupScrollBars\":\"ניתן לגלילה\",\"popupStatusBar\":\"סרגל חיווי\",\"popupToolbar\":\"סרגל הכלים\",\"popupTop\":\"מיקום צד עליון\",\"rel\":\"קשר גומלין\",\"selectAnchor\":\"בחירת עוגן\",\"styles\":\"סגנון\",\"tabIndex\":\"מספר טאב\",\"target\":\"מטרה\",\"targetFrame\":\"<מסגרת>\",\"targetFrameName\":\"שם מסגרת היעד\",\"targetPopup\":\"<חלון קופץ>\",\"targetPopupName\":\"שם החלון הקופץ\",\"title\":\"קישור\",\"toAnchor\":\"עוגן בעמוד זה\",\"toEmail\":\"דוא\\\"ל\",\"toUrl\":\"כתובת (URL)\",\"toolbar\":\"הוספת/עריכת קישור\",\"type\":\"סוג קישור\",\"unlink\":\"הסרת הקישור\",\"upload\":\"העלאה\"},\"list\":{\"bulletedlist\":\"רשימת נקודות\",\"numberedlist\":\"רשימה ממוספרת\"},\"liststyle\":{\"armenian\":\"ספרות ארמניות\",\"bulletedTitle\":\"תכונות רשימת תבליטים\",\"circle\":\"עיגול ריק\",\"decimal\":\"ספרות (1, 2, 3 וכו')\",\"decimalLeadingZero\":\"ספרות עם 0 בהתחלה (01, 02, 03 וכו')\",\"disc\":\"עיגול מלא\",\"georgian\":\"ספרות גיאורגיות (an, ban, gan וכו')\",\"lowerAlpha\":\"אותיות אנגליות קטנות (a, b, c, d, e וכו')\",\"lowerGreek\":\"אותיות יווניות קטנות (alpha, beta, gamma וכו')\",\"lowerRoman\":\"ספירה רומית באותיות קטנות (i, ii, iii, iv, v וכו')\",\"none\":\"ללא\",\"notset\":\"<לא נקבע>\",\"numberedTitle\":\"תכונות רשימה ממוספרת\",\"square\":\"ריבוע\",\"start\":\"תחילת מספור\",\"type\":\"סוג\",\"upperAlpha\":\"אותיות אנגליות גדולות (A, B, C, D, E וכו')\",\"upperRoman\":\"ספירה רומיות באותיות גדולות (I, II, III, IV, V וכו')\",\"validateStartNumber\":\"שדה תחילת המספור חייב להכיל מספר שלם.\"},\"magicline\":{\"title\":\"הכנס פסקה כאן\"},\"maximize\":{\"maximize\":\"הגדלה למקסימום\",\"minimize\":\"הקטנה למינימום\"},\"newpage\":{\"toolbar\":\"דף חדש\"},\"pagebreak\":{\"alt\":\"שבירת דף\",\"toolbar\":\"הוספת שבירת דף\"},\"pastetext\":{\"button\":\"הדבקה כטקסט פשוט\",\"title\":\"הדבקה כטקסט פשוט\"},\"pastefromword\":{\"confirmCleanup\":\"נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?\",\"error\":\"לא ניתן היה לנקות את המידע בשל תקלה פנימית.\",\"title\":\"הדבקה מ-Word\",\"toolbar\":\"הדבקה מ-Word\"},\"preview\":{\"preview\":\"תצוגה מקדימה\"},\"print\":{\"toolbar\":\"הדפסה\"},\"removeformat\":{\"toolbar\":\"הסרת העיצוב\"},\"save\":{\"toolbar\":\"שמירה\"},\"selectall\":{\"toolbar\":\"בחירת הכל\"},\"showblocks\":{\"toolbar\":\"הצגת בלוקים\"},\"sourcearea\":{\"toolbar\":\"מקור\"},\"specialchar\":{\"options\":\"אפשרויות תווים מיוחדים\",\"title\":\"בחירת תו מיוחד\",\"toolbar\":\"הוספת תו מיוחד\"},\"scayt\":{\"btn_about\":\"אודות SCAYT\",\"btn_dictionaries\":\"מילון\",\"btn_disable\":\"בטל SCAYT\",\"btn_enable\":\"אפשר SCAYT\",\"btn_langs\":\"שפות\",\"btn_options\":\"אפשרויות\",\"text_title\":\"בדיקת איות בזמן כתיבה (SCAYT)\"},\"stylescombo\":{\"label\":\"סגנון\",\"panelTitle\":\"סגנונות פורמט\",\"panelTitle1\":\"סגנונות בלוק\",\"panelTitle2\":\"סגנונות רצף\",\"panelTitle3\":\"סגנונות אובייקט\"},\"table\":{\"border\":\"גודל מסגרת\",\"caption\":\"כיתוב\",\"cell\":{\"menu\":\"מאפייני תא\",\"insertBefore\":\"הוספת תא לפני\",\"insertAfter\":\"הוספת תא אחרי\",\"deleteCell\":\"מחיקת תאים\",\"merge\":\"מיזוג תאים\",\"mergeRight\":\"מזג ימינה\",\"mergeDown\":\"מזג למטה\",\"splitHorizontal\":\"פיצול תא אופקית\",\"splitVertical\":\"פיצול תא אנכית\",\"title\":\"תכונות התא\",\"cellType\":\"סוג התא\",\"rowSpan\":\"מתיחת השורות\",\"colSpan\":\"מתיחת התאים\",\"wordWrap\":\"מניעת גלישת שורות\",\"hAlign\":\"יישור אופקי\",\"vAlign\":\"יישור אנכי\",\"alignBaseline\":\"שורת בסיס\",\"bgColor\":\"צבע רקע\",\"borderColor\":\"צבע מסגרת\",\"data\":\"מידע\",\"header\":\"כותרת\",\"yes\":\"כן\",\"no\":\"לא\",\"invalidWidth\":\"שדה רוחב התא חייב להיות מספר.\",\"invalidHeight\":\"שדה גובה התא חייב להיות מספר.\",\"invalidRowSpan\":\"שדה מתיחת השורות חייב להיות מספר שלם.\",\"invalidColSpan\":\"שדה מתיחת העמודות חייב להיות מספר שלם.\",\"chooseColor\":\"בחר\"},\"cellPad\":\"ריפוד תא\",\"cellSpace\":\"מרווח תא\",\"column\":{\"menu\":\"עמודה\",\"insertBefore\":\"הוספת עמודה לפני\",\"insertAfter\":\"הוספת עמודה אחרי\",\"deleteColumn\":\"מחיקת עמודות\"},\"columns\":\"עמודות\",\"deleteTable\":\"מחק טבלה\",\"headers\":\"כותרות\",\"headersBoth\":\"שניהם\",\"headersColumn\":\"עמודה ראשונה\",\"headersNone\":\"אין\",\"headersRow\":\"שורה ראשונה\",\"invalidBorder\":\"שדה גודל המסגרת חייב להיות מספר.\",\"invalidCellPadding\":\"שדה ריפוד התאים חייב להיות מספר חיובי.\",\"invalidCellSpacing\":\"שדה ריווח התאים חייב להיות מספר חיובי.\",\"invalidCols\":\"שדה מספר העמודות חייב להיות מספר גדול מ 0.\",\"invalidHeight\":\"שדה גובה הטבלה חייב להיות מספר.\",\"invalidRows\":\"שדה מספר השורות חייב להיות מספר גדול מ 0.\",\"invalidWidth\":\"שדה רוחב הטבלה חייב להיות מספר.\",\"menu\":\"מאפייני טבלה\",\"row\":{\"menu\":\"שורה\",\"insertBefore\":\"הוספת שורה לפני\",\"insertAfter\":\"הוספת שורה אחרי\",\"deleteRow\":\"מחיקת שורות\"},\"rows\":\"שורות\",\"summary\":\"תקציר\",\"title\":\"מאפייני טבלה\",\"toolbar\":\"טבלה\",\"widthPc\":\"אחוז\",\"widthPx\":\"פיקסלים\",\"widthUnit\":\"יחידת רוחב\"},\"undo\":{\"redo\":\"חזרה על צעד אחרון\",\"undo\":\"ביטול צעד אחרון\"},\"wsc\":{\"btnIgnore\":\"התעלמות\",\"btnIgnoreAll\":\"התעלמות מהכל\",\"btnReplace\":\"החלפה\",\"btnReplaceAll\":\"החלפת הכל\",\"btnUndo\":\"החזרה\",\"changeTo\":\"שינוי ל\",\"errorLoading\":\"שגיאה בהעלאת השירות: %s.\",\"ieSpellDownload\":\"בודק האיות לא מותקן, האם להורידו?\",\"manyChanges\":\"בדיקות איות הסתיימה: %1 מילים שונו\",\"noChanges\":\"בדיקות איות הסתיימה: לא שונתה אף מילה\",\"noMispell\":\"בדיקות איות הסתיימה: לא נמצאו שגיאות כתיב\",\"noSuggestions\":\"- אין הצעות -\",\"notAvailable\":\"לא נמצא שירות זמין.\",\"notInDic\":\"לא נמצא במילון\",\"oneChange\":\"בדיקות איות הסתיימה: שונתה מילה אחת\",\"progress\":\"בודק האיות בתהליך בדיקה....\",\"title\":\"בדיקת איות\",\"toolbar\":\"בדיקת איות\"}};"
  },
  {
    "path": "assets/ckeditor/lang/hi.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['hi']={\"editor\":\"रिच टेक्स्ट एडिटर\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"मदद के लिये ALT 0 दबाए\",\"browseServer\":\"सर्वर ब्राउज़ करें\",\"url\":\"URL\",\"protocol\":\"प्रोटोकॉल\",\"upload\":\"अपलोड\",\"uploadSubmit\":\"इसे सर्वर को भेजें\",\"image\":\"तस्वीर\",\"flash\":\"फ़्लैश\",\"form\":\"फ़ॉर्म\",\"checkbox\":\"चॅक बॉक्स\",\"radio\":\"रेडिओ बटन\",\"textField\":\"टेक्स्ट फ़ील्ड\",\"textarea\":\"टेक्स्ट एरिया\",\"hiddenField\":\"गुप्त फ़ील्ड\",\"button\":\"बटन\",\"select\":\"चुनाव फ़ील्ड\",\"imageButton\":\"तस्वीर बटन\",\"notSet\":\"<सॅट नहीं>\",\"id\":\"Id\",\"name\":\"नाम\",\"langDir\":\"भाषा लिखने की दिशा\",\"langDirLtr\":\"बायें से दायें (LTR)\",\"langDirRtl\":\"दायें से बायें (RTL)\",\"langCode\":\"भाषा कोड\",\"longDescr\":\"अधिक विवरण के लिए URL\",\"cssClass\":\"स्टाइल-शीट क्लास\",\"advisoryTitle\":\"परामर्श शीर्शक\",\"cssStyle\":\"स्टाइल\",\"ok\":\"ठीक है\",\"cancel\":\"रद्द करें\",\"close\":\"Close\",\"preview\":\"प्रीव्यू\",\"resize\":\"Resize\",\"generalTab\":\"सामान्य\",\"advancedTab\":\"ऍड्वान्स्ड\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"टार्गेट\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"बायें से दायें (LTR)\",\"langDirRTL\":\"दायें से बायें (RTL)\",\"styles\":\"स्टाइल\",\"cssClasses\":\"स्टाइल-शीट क्लास\",\"width\":\"चौड़ाई\",\"height\":\"ऊँचाई\",\"align\":\"ऍलाइन\",\"alignLeft\":\"दायें\",\"alignRight\":\"दायें\",\"alignCenter\":\"बीच में\",\"alignJustify\":\"ब्लॉक जस्टीफ़ाई\",\"alignTop\":\"ऊपर\",\"alignMiddle\":\"मध्य\",\"alignBottom\":\"नीचे\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"बोल्ड\",\"italic\":\"इटैलिक\",\"strike\":\"स्ट्राइक थ्रू\",\"subscript\":\"अधोलेख\",\"superscript\":\"अभिलेख\",\"underline\":\"रेखांकण\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"ब्लॉक-कोट\"},\"clipboard\":{\"copy\":\"कॉपी\",\"copyError\":\"आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।\",\"cut\":\"कट\",\"cutError\":\"आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।\",\"paste\":\"पेस्ट\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.\",\"securityMsg\":\"आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.\",\"title\":\"पेस्ट\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"स्वचालित\",\"bgColorTitle\":\"बैक्ग्राउन्ड रंग\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"और रंग...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"टेक्स्ट रंग\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"टॅम्प्लेट\",\"emptyListMsg\":\"(कोई टॅम्प्लेट डिफ़ाइन नहीं किया गया है)\",\"insertOption\":\"मूल शब्दों को बदलें\",\"options\":\"Template Options\",\"selectPromptMsg\":\"ऍडिटर में ओपन करने हेतु टॅम्प्लेट चुनें(वर्तमान कन्टॅन्ट सेव नहीं होंगे):\",\"title\":\"कन्टेन्ट टॅम्प्लेट\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"परामर्श शीर्शक\",\"cssClassInputLabel\":\"स्टाइल-शीट क्लास\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"बायें से दायें (LTR)\",\"langDirLabel\":\"भाषा लिखने की दिशा\",\"langDirRTLLabel\":\"दायें से बायें (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"स्टाइल\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"एडिटर टूलबार\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"खोजें\",\"findOptions\":\"Find Options\",\"findWhat\":\"यह खोजें:\",\"matchCase\":\"केस मिलायें\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"पूरा शब्द मिलायें\",\"notFoundMsg\":\"आपके द्वारा दिया गया टेक्स्ट नहीं मिला\",\"replace\":\"रीप्लेस\",\"replaceAll\":\"सभी रिप्लेस करें\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"इससे रिप्लेस करें:\",\"title\":\"खोजें और बदलें\"},\"fakeobjects\":{\"anchor\":\"ऐंकर इन्सर्ट/संपादन\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"गुप्त फ़ील्ड\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs नीचे\",\"alignAbsMiddle\":\"Abs ऊपर\",\"alignBaseline\":\"मूल रेखा\",\"alignTextTop\":\"टेक्स्ट ऊपर\",\"bgcolor\":\"बैक्ग्राउन्ड रंग\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"लूप\",\"chkMenu\":\"फ़्लैश मॅन्यू का प्रयोग करें\",\"chkPlay\":\"ऑटो प्ले\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"हॉरिज़ॉन्टल स्पेस\",\"properties\":\"फ़्लैश प्रॉपर्टीज़\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"स्केल\",\"scaleAll\":\"सभी दिखायें\",\"scaleFit\":\"बिल्कुल फ़िट\",\"scaleNoBorder\":\"कोई बॉर्डर नहीं\",\"title\":\"फ़्लैश प्रॉपर्टीज़\",\"vSpace\":\"वर्टिकल स्पेस\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"लिंक URL टाइप करें\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"साइज़\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"साइज़\"},\"label\":\"फ़ॉन्ट\",\"panelTitle\":\"फ़ॉन्ट\",\"voiceLabel\":\"फ़ॉन्ट\"},\"forms\":{\"button\":{\"title\":\"बटन प्रॉपर्टीज़\",\"text\":\"टेक्स्ट (वैल्यू)\",\"type\":\"प्रकार\",\"typeBtn\":\"बटन\",\"typeSbm\":\"सब्मिट\",\"typeRst\":\"रिसेट\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"चॅक बॉक्स प्रॉपर्टीज़\",\"radioTitle\":\"रेडिओ बटन प्रॉपर्टीज़\",\"value\":\"वैल्यू\",\"selected\":\"सॅलॅक्टॅड\",\"required\":\"Required\"},\"form\":{\"title\":\"फ़ॉर्म प्रॉपर्टीज़\",\"menu\":\"फ़ॉर्म प्रॉपर्टीज़\",\"action\":\"क्रिया\",\"method\":\"तरीका\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"गुप्त फ़ील्ड प्रॉपर्टीज़\",\"name\":\"नाम\",\"value\":\"वैल्यू\"},\"select\":{\"title\":\"चुनाव फ़ील्ड प्रॉपर्टीज़\",\"selectInfo\":\"सूचना\",\"opAvail\":\"उपलब्ध विकल्प\",\"value\":\"वैल्यू\",\"size\":\"साइज़\",\"lines\":\"पंक्तियाँ\",\"chkMulti\":\"एक से ज्यादा विकल्प चुनने दें\",\"required\":\"Required\",\"opText\":\"टेक्स्ट\",\"opValue\":\"वैल्यू\",\"btnAdd\":\"जोड़ें\",\"btnModify\":\"बदलें\",\"btnUp\":\"ऊपर\",\"btnDown\":\"नीचे\",\"btnSetValue\":\"चुनी गई वैल्यू सॅट करें\",\"btnDelete\":\"डिलीट\"},\"textarea\":{\"title\":\"टेक्स्त एरिया प्रॉपर्टीज़\",\"cols\":\"कालम\",\"rows\":\"पंक्तियां\"},\"textfield\":{\"title\":\"टेक्स्ट फ़ील्ड प्रॉपर्टीज़\",\"name\":\"नाम\",\"value\":\"वैल्यू\",\"charWidth\":\"करॅक्टर की चौढ़ाई\",\"maxChars\":\"अधिकतम करॅक्टर\",\"required\":\"Required\",\"type\":\"टाइप\",\"typeText\":\"टेक्स्ट\",\"typePass\":\"पास्वर्ड\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"फ़ॉर्मैट\",\"panelTitle\":\"फ़ॉर्मैट\",\"tag_address\":\"पता\",\"tag_div\":\"शीर्षक (DIV)\",\"tag_h1\":\"शीर्षक 1\",\"tag_h2\":\"शीर्षक 2\",\"tag_h3\":\"शीर्षक 3\",\"tag_h4\":\"शीर्षक 4\",\"tag_h5\":\"शीर्षक 5\",\"tag_h6\":\"शीर्षक 6\",\"tag_p\":\"साधारण\",\"tag_pre\":\"फ़ॉर्मैटॅड\"},\"horizontalrule\":{\"toolbar\":\"हॉरिज़ॉन्टल रेखा इन्सर्ट करें\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"वैकल्पिक टेक्स्ट\",\"border\":\"बॉर्डर\",\"btnUpload\":\"इसे सर्वर को भेजें\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"हॉरिज़ॉन्टल स्पेस\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"तस्वीर की जानकारी\",\"linkTab\":\"लिंक\",\"lockRatio\":\"लॉक अनुपात\",\"menu\":\"तस्वीर प्रॉपर्टीज़\",\"resetSize\":\"रीसॅट साइज़\",\"title\":\"तस्वीर प्रॉपर्टीज़\",\"titleButton\":\"तस्वीर बटन प्रॉपर्टीज़\",\"upload\":\"अपलोड\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"वर्टिकल स्पेस\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"इन्डॅन्ट बढ़ायें\",\"outdent\":\"इन्डॅन्ट कम करें\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"स्माइली इन्सर्ट करें\",\"toolbar\":\"स्माइली\"},\"justify\":{\"block\":\"ब्लॉक जस्टीफ़ाई\",\"center\":\"बीच में\",\"left\":\"बायीं तरफ\",\"right\":\"दायीं तरफ\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"ऍक्सॅस की\",\"advanced\":\"ऍड्वान्स्ड\",\"advisoryContentType\":\"परामर्श कन्टॅन्ट प्रकार\",\"advisoryTitle\":\"परामर्श शीर्शक\",\"anchor\":{\"toolbar\":\"ऐंकर इन्सर्ट/संपादन\",\"menu\":\"ऐंकर प्रॉपर्टीज़\",\"title\":\"ऐंकर प्रॉपर्टीज़\",\"name\":\"ऐंकर का नाम\",\"errorName\":\"ऐंकर का नाम टाइप करें\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"ऍलीमॅन्ट Id से\",\"anchorName\":\"ऐंकर नाम से\",\"charset\":\"लिंक रिसोर्स करॅक्टर सॅट\",\"cssClasses\":\"स्टाइल-शीट क्लास\",\"emailAddress\":\"ई-मेल पता\",\"emailBody\":\"संदेश\",\"emailSubject\":\"संदेश विषय\",\"id\":\"Id\",\"info\":\"लिंक  \",\"langCode\":\"भाषा लिखने की दिशा\",\"langDir\":\"भाषा लिखने की दिशा\",\"langDirLTR\":\"बायें से दायें (LTR)\",\"langDirRTL\":\"दायें से बायें (RTL)\",\"menu\":\"लिंक संपादन\",\"name\":\"नाम\",\"noAnchors\":\"(डॉक्यूमॅन्ट में ऐंकर्स की संख्या)\",\"noEmail\":\"ई-मेल पता टाइप करें\",\"noUrl\":\"लिंक URL टाइप करें\",\"other\":\"<अन्य>\",\"popupDependent\":\"डिपेन्डॅन्ट (Netscape)\",\"popupFeatures\":\"पॉप-अप विन्डो फ़ीचर्स\",\"popupFullScreen\":\"फ़ुल स्क्रीन (IE)\",\"popupLeft\":\"बायीं तरफ\",\"popupLocationBar\":\"लोकेशन बार\",\"popupMenuBar\":\"मॅन्यू बार\",\"popupResizable\":\"आकार बदलने लायक\",\"popupScrollBars\":\"स्क्रॉल बार\",\"popupStatusBar\":\"स्टेटस बार\",\"popupToolbar\":\"टूल बार\",\"popupTop\":\"दायीं तरफ\",\"rel\":\"संबंध\",\"selectAnchor\":\"ऐंकर चुनें\",\"styles\":\"स्टाइल\",\"tabIndex\":\"टैब इन्डॅक्स\",\"target\":\"टार्गेट\",\"targetFrame\":\"<फ़्रेम>\",\"targetFrameName\":\"टार्गेट फ़्रेम का नाम\",\"targetPopup\":\"<पॉप-अप विन्डो>\",\"targetPopupName\":\"पॉप-अप विन्डो का नाम\",\"title\":\"लिंक\",\"toAnchor\":\"इस पेज का ऐंकर\",\"toEmail\":\"ई-मेल\",\"toUrl\":\"URL\",\"toolbar\":\"लिंक इन्सर्ट/संपादन\",\"type\":\"लिंक प्रकार\",\"unlink\":\"लिंक हटायें\",\"upload\":\"अपलोड\"},\"list\":{\"bulletedlist\":\"बुलॅट सूची\",\"numberedlist\":\"अंकीय सूची\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"मेक्सिमाईज़\",\"minimize\":\"मिनिमाईज़\"},\"newpage\":{\"toolbar\":\"नया पेज\"},\"pagebreak\":{\"alt\":\"पेज ब्रेक\",\"toolbar\":\"पेज ब्रेक इन्सर्ट् करें\"},\"pastetext\":{\"button\":\"पेस्ट (सादा टॅक्स्ट)\",\"title\":\"पेस्ट (सादा टॅक्स्ट)\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"पेस्ट (वर्ड से)\",\"toolbar\":\"पेस्ट (वर्ड से)\"},\"preview\":{\"preview\":\"प्रीव्यू\"},\"print\":{\"toolbar\":\"प्रिन्ट\"},\"removeformat\":{\"toolbar\":\"फ़ॉर्मैट हटायें\"},\"save\":{\"toolbar\":\"सेव\"},\"selectall\":{\"toolbar\":\"सब सॅलॅक्ट करें\"},\"showblocks\":{\"toolbar\":\"ब्लॉक दिखायें\"},\"sourcearea\":{\"toolbar\":\"सोर्स\"},\"specialchar\":{\"options\":\"विशेष चरित्र विकल्प\",\"title\":\"विशेष करॅक्टर चुनें\",\"toolbar\":\"विशेष करॅक्टर इन्सर्ट करें\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"स्टाइल\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"बॉर्डर साइज़\",\"caption\":\"शीर्षक\",\"cell\":{\"menu\":\"खाना\",\"insertBefore\":\"पहले सैल डालें\",\"insertAfter\":\"बाद में सैल डालें\",\"deleteCell\":\"सैल डिलीट करें\",\"merge\":\"सैल मिलायें\",\"mergeRight\":\"बाँया विलय\",\"mergeDown\":\"नीचे विलय करें\",\"splitHorizontal\":\"सैल को क्षैतिज स्थिति में विभाजित करें\",\"splitVertical\":\"सैल को लम्बाकार में विभाजित करें\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"सैल पैडिंग\",\"cellSpace\":\"सैल अंतर\",\"column\":{\"menu\":\"कालम\",\"insertBefore\":\"पहले कालम डालें\",\"insertAfter\":\"बाद में कालम डालें\",\"deleteColumn\":\"कालम डिलीट करें\"},\"columns\":\"कालम\",\"deleteTable\":\"टेबल डिलीट करें\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"टेबल प्रॉपर्टीज़\",\"row\":{\"menu\":\"पंक्ति\",\"insertBefore\":\"पहले पंक्ति डालें\",\"insertAfter\":\"बाद में पंक्ति डालें\",\"deleteRow\":\"पंक्तियाँ डिलीट करें\"},\"rows\":\"पंक्तियाँ\",\"summary\":\"सारांश\",\"title\":\"टेबल प्रॉपर्टीज़\",\"toolbar\":\"टेबल\",\"widthPc\":\"प्रतिशत\",\"widthPx\":\"पिक्सैल\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"रीडू\",\"undo\":\"अन्डू\"},\"wsc\":{\"btnIgnore\":\"इग्नोर\",\"btnIgnoreAll\":\"सभी इग्नोर करें\",\"btnReplace\":\"रिप्लेस\",\"btnReplaceAll\":\"सभी रिप्लेस करें\",\"btnUndo\":\"अन्डू\",\"changeTo\":\"इसमें बदलें\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"स्पॅल-चॅकर इन्स्टाल नहीं किया गया है। क्या आप इसे डाउनलोड करना चाहेंगे?\",\"manyChanges\":\"वर्तनी की जाँच : %1 शब्द बदले गये\",\"noChanges\":\"वर्तनी की जाँच :कोई शब्द नहीं बदला गया\",\"noMispell\":\"वर्तनी की जाँच : कोई गलत वर्तनी (स्पॅलिंग) नहीं पाई गई\",\"noSuggestions\":\"- कोई सुझाव नहीं -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"शब्दकोश में नहीं\",\"oneChange\":\"वर्तनी की जाँच : एक शब्द बदला गया\",\"progress\":\"वर्तनी की जाँच (स्पॅल-चॅक) जारी है...\",\"title\":\"Spell Checker\",\"toolbar\":\"वर्तनी (स्पेलिंग) जाँच\"}};"
  },
  {
    "path": "assets/ckeditor/lang/hr.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['hr']={\"editor\":\"Bogati uređivač teksta, %1\",\"editorPanel\":\"Ploča Bogatog Uređivača Teksta\",\"common\":{\"editorHelp\":\"Pritisni ALT 0 za pomoć\",\"browseServer\":\"Pretraži server\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Pošalji\",\"uploadSubmit\":\"Pošalji na server\",\"image\":\"Slika\",\"flash\":\"Flash\",\"form\":\"Forma\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Hidden Field\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Image Button\",\"notSet\":\"<nije postavljeno>\",\"id\":\"Id\",\"name\":\"Naziv\",\"langDir\":\"Smjer jezika\",\"langDirLtr\":\"S lijeva na desno (LTR)\",\"langDirRtl\":\"S desna na lijevo (RTL)\",\"langCode\":\"Kôd jezika\",\"longDescr\":\"Dugački opis URL\",\"cssClass\":\"Klase stilova\",\"advisoryTitle\":\"Advisory naslov\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Poništi\",\"close\":\"Zatvori\",\"preview\":\"Pregledaj\",\"resize\":\"Povuci za promjenu veličine\",\"generalTab\":\"Općenito\",\"advancedTab\":\"Napredno\",\"validateNumberFailed\":\"Ova vrijednost nije broj.\",\"confirmNewPage\":\"Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite učitati novu stranicu?\",\"confirmCancel\":\"Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?\",\"options\":\"Opcije\",\"target\":\"Odredište\",\"targetNew\":\"Novi prozor (_blank)\",\"targetTop\":\"Vršni prozor (_top)\",\"targetSelf\":\"Isti prozor (_self)\",\"targetParent\":\"Roditeljski prozor (_parent)\",\"langDirLTR\":\"S lijeva na desno (LTR)\",\"langDirRTL\":\"S desna na lijevo (RTL)\",\"styles\":\"Stil\",\"cssClasses\":\"Klase stilova\",\"width\":\"Širina\",\"height\":\"Visina\",\"align\":\"Poravnanje\",\"alignLeft\":\"Lijevo\",\"alignRight\":\"Desno\",\"alignCenter\":\"Središnje\",\"alignJustify\":\"Blok poravnanje\",\"alignTop\":\"Vrh\",\"alignMiddle\":\"Sredina\",\"alignBottom\":\"Dolje\",\"alignNone\":\"None\",\"invalidValue\":\"Neispravna vrijednost.\",\"invalidHeight\":\"Visina mora biti broj.\",\"invalidWidth\":\"Širina mora biti broj.\",\"invalidCssLength\":\"Vrijednost određena za \\\"%1\\\" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).\",\"invalidHtmlLength\":\"Vrijednost određena za \\\"%1\\\" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).\",\"invalidInlineStyle\":\"Vrijednost za linijski stil mora sadržavati jednu ili više definicija s formatom \\\"naziv:vrijednost\\\", odvojenih točka-zarezom.\",\"cssLengthTooltip\":\"Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nedostupno</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"O CKEditoru\",\"help\":\"Provjeri $1 za pomoć.\",\"moreInfo\":\"Za informacije o licencama posjetite našu web stranicu:\",\"title\":\"O CKEditoru\",\"userGuide\":\"Vodič za CKEditor korisnike\"},\"basicstyles\":{\"bold\":\"Podebljaj\",\"italic\":\"Ukosi\",\"strike\":\"Precrtano\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Potcrtano\"},\"bidi\":{\"ltr\":\"Smjer teksta s lijeva na desno\",\"rtl\":\"Smjer teksta s desna na lijevo\"},\"blockquote\":{\"toolbar\":\"Blockquote\"},\"clipboard\":{\"copy\":\"Kopiraj\",\"copyError\":\"Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).\",\"cut\":\"Izreži\",\"cutError\":\"Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).\",\"paste\":\"Zalijepi\",\"pasteArea\":\"Prostor za ljepljenje\",\"pasteMsg\":\"Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.\",\"securityMsg\":\"Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.\",\"title\":\"Zalijepi\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatski\",\"bgColorTitle\":\"Boja pozadine\",\"colors\":{\"000\":\"Crna\",\"800000\":\"Kesten\",\"8B4513\":\"Smeđa\",\"2F4F4F\":\"Tamno siva\",\"008080\":\"Teal\",\"000080\":\"Mornarska\",\"4B0082\":\"Indigo\",\"696969\":\"Tamno siva\",\"B22222\":\"Vatrena cigla\",\"A52A2A\":\"Smeđa\",\"DAA520\":\"Zlatna\",\"006400\":\"Tamno zelena\",\"40E0D0\":\"Tirkizna\",\"0000CD\":\"Srednje plava\",\"800080\":\"Ljubičasta\",\"808080\":\"Siva\",\"F00\":\"Crvena\",\"FF8C00\":\"Tamno naranđasta\",\"FFD700\":\"Zlatna\",\"008000\":\"Zelena\",\"0FF\":\"Cijan\",\"00F\":\"Plava\",\"EE82EE\":\"Ljubičasta\",\"A9A9A9\":\"Mutno siva\",\"FFA07A\":\"Svijetli losos\",\"FFA500\":\"Naranđasto\",\"FFFF00\":\"Žuto\",\"00FF00\":\"Limun\",\"AFEEEE\":\"Blijedo tirkizna\",\"ADD8E6\":\"Svijetlo plava\",\"DDA0DD\":\"Šljiva\",\"D3D3D3\":\"Svijetlo siva\",\"FFF0F5\":\"Lavanda rumeno\",\"FAEBD7\":\"Antikno bijela\",\"FFFFE0\":\"Svijetlo žuta\",\"F0FFF0\":\"Med\",\"F0FFFF\":\"Azurna\",\"F0F8FF\":\"Alice plava\",\"E6E6FA\":\"Lavanda\",\"FFF\":\"Bijela\"},\"more\":\"Više boja...\",\"panelTitle\":\"Boje\",\"textColorTitle\":\"Boja teksta\"},\"colordialog\":{\"clear\":\"Očisti\",\"highlight\":\"Istaknuto\",\"options\":\"Opcije boje\",\"selected\":\"Odabrana boja\",\"title\":\"Odaberi boju\"},\"templates\":{\"button\":\"Predlošci\",\"emptyListMsg\":\"(Nema definiranih predložaka)\",\"insertOption\":\"Zamijeni trenutne sadržaje\",\"options\":\"Opcije predložaka\",\"selectPromptMsg\":\"Molimo odaberite predložak koji želite otvoriti<br>(stvarni sadržaj će biti izgubljen):\",\"title\":\"Predlošci sadržaja\"},\"contextmenu\":{\"options\":\"Opcije izbornika\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Savjetodavni naslov\",\"cssClassInputLabel\":\"Klase stilova\",\"edit\":\"Uredi DIV\",\"inlineStyleInputLabel\":\"Stil u liniji\",\"langDirLTRLabel\":\"S lijeva na desno (LTR)\",\"langDirLabel\":\"Smjer jezika\",\"langDirRTLLabel\":\"S desna na lijevo (RTL)\",\"languageCodeInputLabel\":\"Jezični kod\",\"remove\":\"Ukloni DIV\",\"styleSelectLabel\":\"Stil\",\"title\":\"Napravi DIV kontejner\",\"toolbar\":\"Napravi DIV kontejner\"},\"toolbar\":{\"toolbarCollapse\":\"Smanji alatnu traku\",\"toolbarExpand\":\"Proširi alatnu traku\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Međuspremnik/Poništi\",\"editing\":\"Uređivanje\",\"forms\":\"Forme\",\"basicstyles\":\"Osnovni stilovi\",\"paragraph\":\"Paragraf\",\"links\":\"Veze\",\"insert\":\"Umetni\",\"styles\":\"Stilovi\",\"colors\":\"Boje\",\"tools\":\"Alatke\"},\"toolbars\":\"Alatne trake uređivača teksta\"},\"elementspath\":{\"eleLabel\":\"Putanja elemenata\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Pronađi\",\"findOptions\":\"Opcije traženja\",\"findWhat\":\"Pronađi:\",\"matchCase\":\"Usporedi mala/velika slova\",\"matchCyclic\":\"Usporedi kružno\",\"matchWord\":\"Usporedi cijele riječi\",\"notFoundMsg\":\"Traženi tekst nije pronađen.\",\"replace\":\"Zamijeni\",\"replaceAll\":\"Zamijeni sve\",\"replaceSuccessMsg\":\"Zamijenjeno %1 pojmova.\",\"replaceWith\":\"Zamijeni s:\",\"title\":\"Pronađi i zamijeni\"},\"fakeobjects\":{\"anchor\":\"Sidro\",\"flash\":\"Flash animacija\",\"hiddenfield\":\"Sakriveno polje\",\"iframe\":\"IFrame\",\"unknown\":\"Nepoznati objekt\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Uvijek\",\"accessNever\":\"Nikad\",\"accessSameDomain\":\"Ista domena\",\"alignAbsBottom\":\"Abs dolje\",\"alignAbsMiddle\":\"Abs sredina\",\"alignBaseline\":\"Bazno\",\"alignTextTop\":\"Vrh teksta\",\"bgcolor\":\"Boja pozadine\",\"chkFull\":\"Omogući Fullscreen\",\"chkLoop\":\"Ponavljaj\",\"chkMenu\":\"Omogući Flash izbornik\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Varijable za Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash svojstva\",\"propertiesTab\":\"Svojstva\",\"quality\":\"Kvaliteta\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Omjer\",\"scaleAll\":\"Prikaži sve\",\"scaleFit\":\"Točna veličina\",\"scaleNoBorder\":\"Bez okvira\",\"title\":\"Flash svojstva\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace mora biti broj.\",\"validateSrc\":\"Molimo upišite URL link\",\"validateVSpace\":\"VSpace mora biti broj.\",\"windowMode\":\"Vrsta prozora\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Veličina\",\"voiceLabel\":\"Veličina slova\",\"panelTitle\":\"Veličina\"},\"label\":\"Font\",\"panelTitle\":\"Font\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button svojstva\",\"text\":\"Tekst (vrijednost)\",\"type\":\"Vrsta\",\"typeBtn\":\"Gumb\",\"typeSbm\":\"Pošalji\",\"typeRst\":\"Poništi\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox svojstva\",\"radioTitle\":\"Radio Button svojstva\",\"value\":\"Vrijednost\",\"selected\":\"Odabrano\",\"required\":\"Required\"},\"form\":{\"title\":\"Form svojstva\",\"menu\":\"Form svojstva\",\"action\":\"Akcija\",\"method\":\"Metoda\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field svojstva\",\"name\":\"Ime\",\"value\":\"Vrijednost\"},\"select\":{\"title\":\"Selection svojstva\",\"selectInfo\":\"Info\",\"opAvail\":\"Dostupne opcije\",\"value\":\"Vrijednost\",\"size\":\"Veličina\",\"lines\":\"linija\",\"chkMulti\":\"Dozvoli višestruki odabir\",\"required\":\"Required\",\"opText\":\"Tekst\",\"opValue\":\"Vrijednost\",\"btnAdd\":\"Dodaj\",\"btnModify\":\"Promijeni\",\"btnUp\":\"Gore\",\"btnDown\":\"Dolje\",\"btnSetValue\":\"Postavi kao odabranu vrijednost\",\"btnDelete\":\"Obriši\"},\"textarea\":{\"title\":\"Textarea svojstva\",\"cols\":\"Kolona\",\"rows\":\"Redova\"},\"textfield\":{\"title\":\"Text Field svojstva\",\"name\":\"Ime\",\"value\":\"Vrijednost\",\"charWidth\":\"Širina\",\"maxChars\":\"Najviše karaktera\",\"required\":\"Required\",\"type\":\"Vrsta\",\"typeText\":\"Tekst\",\"typePass\":\"Šifra\",\"typeEmail\":\"Email\",\"typeSearch\":\"Traži\",\"typeTel\":\"Broj telefona\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatirano\"},\"horizontalrule\":{\"toolbar\":\"Ubaci vodoravnu liniju\"},\"iframe\":{\"border\":\"Prikaži okvir IFrame-a\",\"noUrl\":\"Unesite URL iframe-a\",\"scrolling\":\"Omogući trake za skrolanje\",\"title\":\"IFrame svojstva\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativni tekst\",\"border\":\"Okvir\",\"btnUpload\":\"Pošalji na server\",\"button2Img\":\"Želite li promijeniti odabrani gumb u jednostavnu sliku?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Želite li promijeniti odabranu sliku u gumb?\",\"infoTab\":\"Info slike\",\"linkTab\":\"Link\",\"lockRatio\":\"Zaključaj odnos\",\"menu\":\"Svojstva slika\",\"resetSize\":\"Obriši veličinu\",\"title\":\"Svojstva slika\",\"titleButton\":\"Image Button svojstva\",\"upload\":\"Pošalji\",\"urlMissing\":\"Nedostaje URL slike.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Okvir mora biti cijeli broj.\",\"validateHSpace\":\"HSpace mora biti cijeli broj\",\"validateVSpace\":\"VSpace mora biti cijeli broj.\"},\"indent\":{\"indent\":\"Pomakni udesno\",\"outdent\":\"Pomakni ulijevo\"},\"smiley\":{\"options\":\"Opcije smješka\",\"title\":\"Ubaci smješka\",\"toolbar\":\"Smješko\"},\"justify\":{\"block\":\"Blok poravnanje\",\"center\":\"Središnje poravnanje\",\"left\":\"Lijevo poravnanje\",\"right\":\"Desno poravnanje\"},\"language\":{\"button\":\"Namjesti jezik\",\"remove\":\"Makni jezik\"},\"link\":{\"acccessKey\":\"Pristupna tipka\",\"advanced\":\"Napredno\",\"advisoryContentType\":\"Advisory vrsta sadržaja\",\"advisoryTitle\":\"Advisory naslov\",\"anchor\":{\"toolbar\":\"Ubaci/promijeni sidro\",\"menu\":\"Svojstva sidra\",\"title\":\"Svojstva sidra\",\"name\":\"Ime sidra\",\"errorName\":\"Molimo unesite ime sidra\",\"remove\":\"Ukloni sidro\"},\"anchorId\":\"Po Id elementa\",\"anchorName\":\"Po nazivu sidra\",\"charset\":\"Kodna stranica povezanih resursa\",\"cssClasses\":\"Stylesheet klase\",\"emailAddress\":\"E-Mail adresa\",\"emailBody\":\"Sadržaj poruke\",\"emailSubject\":\"Naslov\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Smjer jezika\",\"langDir\":\"Smjer jezika\",\"langDirLTR\":\"S lijeva na desno (LTR)\",\"langDirRTL\":\"S desna na lijevo (RTL)\",\"menu\":\"Promijeni link\",\"name\":\"Naziv\",\"noAnchors\":\"(Nema dostupnih sidra)\",\"noEmail\":\"Molimo upišite e-mail adresu\",\"noUrl\":\"Molimo upišite URL link\",\"other\":\"<drugi>\",\"popupDependent\":\"Ovisno (Netscape)\",\"popupFeatures\":\"Mogućnosti popup prozora\",\"popupFullScreen\":\"Cijeli ekran (IE)\",\"popupLeft\":\"Lijeva pozicija\",\"popupLocationBar\":\"Traka za lokaciju\",\"popupMenuBar\":\"Izborna traka\",\"popupResizable\":\"Promjenjiva veličina\",\"popupScrollBars\":\"Scroll traka\",\"popupStatusBar\":\"Statusna traka\",\"popupToolbar\":\"Traka s alatima\",\"popupTop\":\"Gornja pozicija\",\"rel\":\"Veza\",\"selectAnchor\":\"Odaberi sidro\",\"styles\":\"Stil\",\"tabIndex\":\"Tab Indeks\",\"target\":\"Meta\",\"targetFrame\":\"<okvir>\",\"targetFrameName\":\"Ime ciljnog okvira\",\"targetPopup\":\"<popup prozor>\",\"targetPopupName\":\"Naziv popup prozora\",\"title\":\"Link\",\"toAnchor\":\"Sidro na ovoj stranici\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Ubaci/promijeni link\",\"type\":\"Link vrsta\",\"unlink\":\"Ukloni link\",\"upload\":\"Pošalji\"},\"list\":{\"bulletedlist\":\"Obična lista\",\"numberedlist\":\"Brojčana lista\"},\"liststyle\":{\"armenian\":\"Armenijska numeracija\",\"bulletedTitle\":\"Svojstva liste\",\"circle\":\"Krug\",\"decimal\":\"Decimalna numeracija (1, 2, 3, itd.)\",\"decimalLeadingZero\":\"Decimalna s vodećom nulom (01, 02, 03, itd)\",\"disc\":\"Disk\",\"georgian\":\"Gruzijska numeracija(an, ban, gan, etc.)\",\"lowerAlpha\":\"Znakovi mala slova (a, b, c, d, e, itd.)\",\"lowerGreek\":\"Grčka numeracija mala slova (alfa, beta, gama, itd).\",\"lowerRoman\":\"Romanska numeracija mala slova (i, ii, iii, iv, v, itd.)\",\"none\":\"Bez\",\"notset\":\"<nije određen>\",\"numberedTitle\":\"Svojstva brojčane liste\",\"square\":\"Kvadrat\",\"start\":\"Početak\",\"type\":\"Vrsta\",\"upperAlpha\":\"Znakovi velika slova (A, B, C, D, E, itd.)\",\"upperRoman\":\"Romanska numeracija velika slova (I, II, III, IV, V, itd.)\",\"validateStartNumber\":\"Početak brojčane liste mora biti cijeli broj.\"},\"magicline\":{\"title\":\"Ubaci paragraf ovdje\"},\"maximize\":{\"maximize\":\"Povećaj\",\"minimize\":\"Smanji\"},\"newpage\":{\"toolbar\":\"Nova stranica\"},\"pagebreak\":{\"alt\":\"Prijelom stranice\",\"toolbar\":\"Ubaci prijelom stranice\"},\"pastetext\":{\"button\":\"Zalijepi kao čisti tekst\",\"title\":\"Zalijepi kao čisti tekst\"},\"pastefromword\":{\"confirmCleanup\":\"Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?\",\"error\":\"Nije moguće očistiti podatke za ljepljenje zbog interne greške\",\"title\":\"Zalijepi iz Worda\",\"toolbar\":\"Zalijepi iz Worda\"},\"preview\":{\"preview\":\"Pregledaj\"},\"print\":{\"toolbar\":\"Ispiši\"},\"removeformat\":{\"toolbar\":\"Ukloni formatiranje\"},\"save\":{\"toolbar\":\"Snimi\"},\"selectall\":{\"toolbar\":\"Odaberi sve\"},\"showblocks\":{\"toolbar\":\"Prikaži blokove\"},\"sourcearea\":{\"toolbar\":\"Kôd\"},\"specialchar\":{\"options\":\"Opcije specijalnih znakova\",\"title\":\"Odaberite posebni karakter\",\"toolbar\":\"Ubaci posebne znakove\"},\"scayt\":{\"btn_about\":\"O SCAYT\",\"btn_dictionaries\":\"Rječnici\",\"btn_disable\":\"Onemogući SCAYT\",\"btn_enable\":\"Omogući SCAYT\",\"btn_langs\":\"Jezici\",\"btn_options\":\"Opcije\",\"text_title\":\"Provjeri pravopis tijekom tipkanja (SCAYT)\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Stilovi formatiranja\",\"panelTitle1\":\"Block stilovi\",\"panelTitle2\":\"Inline stilovi\",\"panelTitle3\":\"Object stilovi\"},\"table\":{\"border\":\"Veličina okvira\",\"caption\":\"Naslov\",\"cell\":{\"menu\":\"Ćelija\",\"insertBefore\":\"Ubaci ćeliju prije\",\"insertAfter\":\"Ubaci ćeliju poslije\",\"deleteCell\":\"Izbriši ćelije\",\"merge\":\"Spoji ćelije\",\"mergeRight\":\"Spoji desno\",\"mergeDown\":\"Spoji dolje\",\"splitHorizontal\":\"Podijeli ćeliju vodoravno\",\"splitVertical\":\"Podijeli ćeliju okomito\",\"title\":\"Svojstva ćelije\",\"cellType\":\"Vrsta ćelije\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Prelazak u novi red\",\"hAlign\":\"Vodoravno poravnanje\",\"vAlign\":\"Okomito poravnanje\",\"alignBaseline\":\"Osnovna linija\",\"bgColor\":\"Boja pozadine\",\"borderColor\":\"Boja ruba\",\"data\":\"Podatak\",\"header\":\"Zaglavlje\",\"yes\":\"Da\",\"no\":\"ne\",\"invalidWidth\":\"Širina ćelije mora biti broj.\",\"invalidHeight\":\"Visina ćelije mora biti broj.\",\"invalidRowSpan\":\"Rows span mora biti cijeli broj.\",\"invalidColSpan\":\"Columns span mora biti cijeli broj.\",\"chooseColor\":\"Odaberi\"},\"cellPad\":\"Razmak ćelija\",\"cellSpace\":\"Prostornost ćelija\",\"column\":{\"menu\":\"Kolona\",\"insertBefore\":\"Ubaci kolonu prije\",\"insertAfter\":\"Ubaci kolonu poslije\",\"deleteColumn\":\"Izbriši kolone\"},\"columns\":\"Kolona\",\"deleteTable\":\"Izbriši tablicu\",\"headers\":\"Zaglavlje\",\"headersBoth\":\"Oba\",\"headersColumn\":\"Prva kolona\",\"headersNone\":\"Ništa\",\"headersRow\":\"Prvi red\",\"invalidBorder\":\"Debljina ruba mora biti broj.\",\"invalidCellPadding\":\"Razmak ćelija mora biti broj.\",\"invalidCellSpacing\":\"Prostornost ćelija mora biti broj.\",\"invalidCols\":\"Broj kolona mora biti broj veći od 0.\",\"invalidHeight\":\"Visina tablice mora biti broj.\",\"invalidRows\":\"Broj redova mora biti broj veći od 0.\",\"invalidWidth\":\"Širina tablice mora biti broj.\",\"menu\":\"Svojstva tablice\",\"row\":{\"menu\":\"Red\",\"insertBefore\":\"Ubaci red prije\",\"insertAfter\":\"Ubaci red poslije\",\"deleteRow\":\"Izbriši redove\"},\"rows\":\"Redova\",\"summary\":\"Sažetak\",\"title\":\"Svojstva tablice\",\"toolbar\":\"Tablica\",\"widthPc\":\"postotaka\",\"widthPx\":\"piksela\",\"widthUnit\":\"jedinica širine\"},\"undo\":{\"redo\":\"Ponovi\",\"undo\":\"Poništi\"},\"wsc\":{\"btnIgnore\":\"Zanemari\",\"btnIgnoreAll\":\"Zanemari sve\",\"btnReplace\":\"Zamijeni\",\"btnReplaceAll\":\"Zamijeni sve\",\"btnUndo\":\"Vrati\",\"changeTo\":\"Promijeni u\",\"errorLoading\":\"Greška učitavanja aplikacije: %s.\",\"ieSpellDownload\":\"Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?\",\"manyChanges\":\"Provjera završena: Promijenjeno %1 riječi\",\"noChanges\":\"Provjera završena: Nije napravljena promjena\",\"noMispell\":\"Provjera završena: Nema grešaka\",\"noSuggestions\":\"-Nema preporuke-\",\"notAvailable\":\"Žao nam je, ali usluga trenutno nije dostupna.\",\"notInDic\":\"Nije u rječniku\",\"oneChange\":\"Provjera završena: Jedna riječ promjenjena\",\"progress\":\"Provjera u tijeku...\",\"title\":\"Provjera pravopisa\",\"toolbar\":\"Provjeri pravopis\"}};"
  },
  {
    "path": "assets/ckeditor/lang/hu.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['hu']={\"editor\":\"HTML szerkesztő\",\"editorPanel\":\"Rich Text szerkesztő panel\",\"common\":{\"editorHelp\":\"Segítségért nyomjon ALT 0\",\"browseServer\":\"Böngészés a szerveren\",\"url\":\"Hivatkozás\",\"protocol\":\"Protokoll\",\"upload\":\"Feltöltés\",\"uploadSubmit\":\"Küldés a szerverre\",\"image\":\"Kép\",\"flash\":\"Flash\",\"form\":\"Űrlap\",\"checkbox\":\"Jelölőnégyzet\",\"radio\":\"Választógomb\",\"textField\":\"Szövegmező\",\"textarea\":\"Szövegterület\",\"hiddenField\":\"Rejtettmező\",\"button\":\"Gomb\",\"select\":\"Legördülő lista\",\"imageButton\":\"Képgomb\",\"notSet\":\"<nincs beállítva>\",\"id\":\"Azonosító\",\"name\":\"Név\",\"langDir\":\"Írás iránya\",\"langDirLtr\":\"Balról jobbra\",\"langDirRtl\":\"Jobbról balra\",\"langCode\":\"Nyelv kódja\",\"longDescr\":\"Részletes leírás webcíme\",\"cssClass\":\"Stíluskészlet\",\"advisoryTitle\":\"Súgócimke\",\"cssStyle\":\"Stílus\",\"ok\":\"Rendben\",\"cancel\":\"Mégsem\",\"close\":\"Bezárás\",\"preview\":\"Előnézet\",\"resize\":\"Húzza az átméretezéshez\",\"generalTab\":\"Általános\",\"advancedTab\":\"További opciók\",\"validateNumberFailed\":\"A mezőbe csak számokat írhat.\",\"confirmNewPage\":\"Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?\",\"confirmCancel\":\"Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?\",\"options\":\"Beállítások\",\"target\":\"Cél\",\"targetNew\":\"Új ablak (_blank)\",\"targetTop\":\"Legfelső ablak (_top)\",\"targetSelf\":\"Aktuális ablakban (_self)\",\"targetParent\":\"Szülő ablak (_parent)\",\"langDirLTR\":\"Balról jobbra (LTR)\",\"langDirRTL\":\"Jobbról balra (RTL)\",\"styles\":\"Stílus\",\"cssClasses\":\"Stíluslap osztály\",\"width\":\"Szélesség\",\"height\":\"Magasság\",\"align\":\"Igazítás\",\"alignLeft\":\"Bal\",\"alignRight\":\"Jobbra\",\"alignCenter\":\"Középre\",\"alignJustify\":\"Sorkizárt\",\"alignTop\":\"Tetejére\",\"alignMiddle\":\"Középre\",\"alignBottom\":\"Aljára\",\"alignNone\":\"None\",\"invalidValue\":\"Érvénytelen érték.\",\"invalidHeight\":\"A magasság mezőbe csak számokat írhat.\",\"invalidWidth\":\"A szélesség mezőbe csak számokat írhat.\",\"invalidCssLength\":\"\\\"%1\\\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).\",\"invalidHtmlLength\":\"\\\"%1\\\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).\",\"invalidInlineStyle\":\"Az inline stílusnak megadott értéknek tartalmaznia kell egy vagy több rekordot a \\\"name : value\\\" formátumban, pontosvesszővel elválasztva.\",\"cssLengthTooltip\":\"Adjon meg egy számot értéknek pixelekben vagy egy számot érvényes CSS mértékegységben (px, %, in, cm, mm, em, ex, pt, vagy pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nem elérhető</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Minden jog fenntartva.\",\"dlgTitle\":\"CKEditor névjegy\",\"help\":\"Itt találsz segítséget: $1\",\"moreInfo\":\"Licenszelési információkért kérjük látogassa meg weboldalunkat:\",\"title\":\"CKEditor névjegy\",\"userGuide\":\"CKEditor Felhasználói útmutató\"},\"basicstyles\":{\"bold\":\"Félkövér\",\"italic\":\"Dőlt\",\"strike\":\"Áthúzott\",\"subscript\":\"Alsó index\",\"superscript\":\"Felső index\",\"underline\":\"Aláhúzott\"},\"bidi\":{\"ltr\":\"Szöveg iránya balról jobbra\",\"rtl\":\"Szöveg iránya jobbról balra\"},\"blockquote\":{\"toolbar\":\"Idézet blokk\"},\"clipboard\":{\"copy\":\"Másolás\",\"copyError\":\"A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).\",\"cut\":\"Kivágás\",\"cutError\":\"A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).\",\"paste\":\"Beillesztés\",\"pasteArea\":\"Beszúrás mező\",\"pasteMsg\":\"Másolja be az alábbi mezőbe a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.\",\"securityMsg\":\"A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.\",\"title\":\"Beillesztés\"},\"button\":{\"selectedLabel\":\"%1 (Kiválasztva)\"},\"colorbutton\":{\"auto\":\"Automatikus\",\"bgColorTitle\":\"Háttérszín\",\"colors\":{\"000\":\"Fekete\",\"800000\":\"Bordó\",\"8B4513\":\"Barna\",\"2F4F4F\":\"Sötét türkiz\",\"008080\":\"Türkiz\",\"000080\":\"Király kék\",\"4B0082\":\"Indigó kék\",\"696969\":\"Szürke\",\"B22222\":\"Tégla vörös\",\"A52A2A\":\"Vörös\",\"DAA520\":\"Arany sárga\",\"006400\":\"Sötét zöld\",\"40E0D0\":\"Türkiz\",\"0000CD\":\"Kék\",\"800080\":\"Lila\",\"808080\":\"Szürke\",\"F00\":\"Piros\",\"FF8C00\":\"Sötét narancs\",\"FFD700\":\"Arany\",\"008000\":\"Zöld\",\"0FF\":\"Türkiz\",\"00F\":\"Kék\",\"EE82EE\":\"Rózsaszín\",\"A9A9A9\":\"Sötét szürke\",\"FFA07A\":\"Lazac\",\"FFA500\":\"Narancs\",\"FFFF00\":\"Citromsárga\",\"00FF00\":\"Neon zöld\",\"AFEEEE\":\"Világos türkiz\",\"ADD8E6\":\"Világos kék\",\"DDA0DD\":\"Világos lila\",\"D3D3D3\":\"Világos szürke\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Törtfehér\",\"FFFFE0\":\"Világos sárga\",\"F0FFF0\":\"Menta\",\"F0FFFF\":\"Azúr kék\",\"F0F8FF\":\"Halvány kék\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Fehér\"},\"more\":\"További színek...\",\"panelTitle\":\"Színek\",\"textColorTitle\":\"Betűszín\"},\"colordialog\":{\"clear\":\"Ürítés\",\"highlight\":\"Nagyítás\",\"options\":\"Szín opciók\",\"selected\":\"Kiválasztott\",\"title\":\"Válasszon színt\"},\"templates\":{\"button\":\"Sablonok\",\"emptyListMsg\":\"(Nincs sablon megadva)\",\"insertOption\":\"Kicseréli a jelenlegi tartalmat\",\"options\":\"Sablon opciók\",\"selectPromptMsg\":\"Válassza ki melyik sablon nyíljon meg a szerkesztőben<br>(a jelenlegi tartalom elveszik):\",\"title\":\"Elérhető sablonok\"},\"contextmenu\":{\"options\":\"Helyi menü opciók\"},\"div\":{\"IdInputLabel\":\"Azonosító\",\"advisoryTitleInputLabel\":\"Tipp szöveg\",\"cssClassInputLabel\":\"Stíluslap osztály\",\"edit\":\"DIV szerkesztése\",\"inlineStyleInputLabel\":\"Inline stílus\",\"langDirLTRLabel\":\"Balról jobbra (LTR)\",\"langDirLabel\":\"Nyelvi irány\",\"langDirRTLLabel\":\"Jobbról balra (RTL)\",\"languageCodeInputLabel\":\" Nyelv kódja\",\"remove\":\"DIV eltávolítása\",\"styleSelectLabel\":\"Stílus\",\"title\":\"DIV tároló létrehozása\",\"toolbar\":\"DIV tároló létrehozása\"},\"toolbar\":{\"toolbarCollapse\":\"Eszköztár összecsukása\",\"toolbarExpand\":\"Eszköztár szétnyitása\",\"toolbarGroups\":{\"document\":\"Dokumentum\",\"clipboard\":\"Vágólap/Visszavonás\",\"editing\":\"Szerkesztés\",\"forms\":\"Űrlapok\",\"basicstyles\":\"Alapstílusok\",\"paragraph\":\"Bekezdés\",\"links\":\"Hivatkozások\",\"insert\":\"Beszúrás\",\"styles\":\"Stílusok\",\"colors\":\"Színek\",\"tools\":\"Eszközök\"},\"toolbars\":\"Szerkesztő Eszköztár\"},\"elementspath\":{\"eleLabel\":\"Elem utak\",\"eleTitle\":\"%1 elem\"},\"find\":{\"find\":\"Keresés\",\"findOptions\":\"Beállítások\",\"findWhat\":\"Keresett szöveg:\",\"matchCase\":\"Kis- és nagybetű megkülönböztetése\",\"matchCyclic\":\"Ciklikus keresés\",\"matchWord\":\"Csak ha ez a teljes szó\",\"notFoundMsg\":\"A keresett szöveg nem található.\",\"replace\":\"Csere\",\"replaceAll\":\"Az összes cseréje\",\"replaceSuccessMsg\":\"%1 egyezőség cserélve.\",\"replaceWith\":\"Csere erre:\",\"title\":\"Keresés és csere\"},\"fakeobjects\":{\"anchor\":\"Horgony\",\"flash\":\"Flash animáció\",\"hiddenfield\":\"Rejtett mezõ\",\"iframe\":\"IFrame\",\"unknown\":\"Ismeretlen objektum\"},\"flash\":{\"access\":\"Szkript hozzáférés\",\"accessAlways\":\"Mindig\",\"accessNever\":\"Soha\",\"accessSameDomain\":\"Azonos domainről\",\"alignAbsBottom\":\"Legaljára\",\"alignAbsMiddle\":\"Közepére\",\"alignBaseline\":\"Alapvonalhoz\",\"alignTextTop\":\"Szöveg tetejére\",\"bgcolor\":\"Háttérszín\",\"chkFull\":\"Teljes képernyő engedélyezése\",\"chkLoop\":\"Folyamatosan\",\"chkMenu\":\"Flash menü engedélyezése\",\"chkPlay\":\"Automata lejátszás\",\"flashvars\":\"Flash változók\",\"hSpace\":\"Vízsz. táv\",\"properties\":\"Flash tulajdonságai\",\"propertiesTab\":\"Tulajdonságok\",\"quality\":\"Minőség\",\"qualityAutoHigh\":\"Automata jó\",\"qualityAutoLow\":\"Automata gyenge\",\"qualityBest\":\"Legjobb\",\"qualityHigh\":\"Jó\",\"qualityLow\":\"Gyenge\",\"qualityMedium\":\"Közepes\",\"scale\":\"Méretezés\",\"scaleAll\":\"Mindent mutat\",\"scaleFit\":\"Teljes kitöltés\",\"scaleNoBorder\":\"Keret nélkül\",\"title\":\"Flash tulajdonságai\",\"vSpace\":\"Függ. táv\",\"validateHSpace\":\"A vízszintes távolsűág mezőbe csak számokat írhat.\",\"validateSrc\":\"Adja meg a hivatkozás webcímét\",\"validateVSpace\":\"A függőleges távolsűág mezőbe csak számokat írhat.\",\"windowMode\":\"Ablak mód\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Méret\",\"voiceLabel\":\"Betűméret\",\"panelTitle\":\"Méret\"},\"label\":\"Betűtípus\",\"panelTitle\":\"Betűtípus\",\"voiceLabel\":\"Betűtípus\"},\"forms\":{\"button\":{\"title\":\"Gomb tulajdonságai\",\"text\":\"Szöveg (Érték)\",\"type\":\"Típus\",\"typeBtn\":\"Gomb\",\"typeSbm\":\"Küldés\",\"typeRst\":\"Alaphelyzet\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Jelölőnégyzet tulajdonságai\",\"radioTitle\":\"Választógomb tulajdonságai\",\"value\":\"Érték\",\"selected\":\"Kiválasztott\",\"required\":\"Required\"},\"form\":{\"title\":\"Űrlap tulajdonságai\",\"menu\":\"Űrlap tulajdonságai\",\"action\":\"Adatfeldolgozást végző hivatkozás\",\"method\":\"Adatküldés módja\",\"encoding\":\"Kódolás\"},\"hidden\":{\"title\":\"Rejtett mező tulajdonságai\",\"name\":\"Név\",\"value\":\"Érték\"},\"select\":{\"title\":\"Legördülő lista tulajdonságai\",\"selectInfo\":\"Alaptulajdonságok\",\"opAvail\":\"Elérhető opciók\",\"value\":\"Érték\",\"size\":\"Méret\",\"lines\":\"sor\",\"chkMulti\":\"több sor is kiválasztható\",\"required\":\"Required\",\"opText\":\"Szöveg\",\"opValue\":\"Érték\",\"btnAdd\":\"Hozzáad\",\"btnModify\":\"Módosít\",\"btnUp\":\"Fel\",\"btnDown\":\"Le\",\"btnSetValue\":\"Legyen az alapértelmezett érték\",\"btnDelete\":\"Töröl\"},\"textarea\":{\"title\":\"Szövegterület tulajdonságai\",\"cols\":\"Karakterek száma egy sorban\",\"rows\":\"Sorok száma\"},\"textfield\":{\"title\":\"Szövegmező tulajdonságai\",\"name\":\"Név\",\"value\":\"Érték\",\"charWidth\":\"Megjelenített karakterek száma\",\"maxChars\":\"Maximális karakterszám\",\"required\":\"Required\",\"type\":\"Típus\",\"typeText\":\"Szöveg\",\"typePass\":\"Jelszó\",\"typeEmail\":\"Ímél\",\"typeSearch\":\"Keresés\",\"typeTel\":\"Telefonszám\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formátum\",\"panelTitle\":\"Formátum\",\"tag_address\":\"Címsor\",\"tag_div\":\"Bekezdés (DIV)\",\"tag_h1\":\"Fejléc 1\",\"tag_h2\":\"Fejléc 2\",\"tag_h3\":\"Fejléc 3\",\"tag_h4\":\"Fejléc 4\",\"tag_h5\":\"Fejléc 5\",\"tag_h6\":\"Fejléc 6\",\"tag_p\":\"Normál\",\"tag_pre\":\"Formázott\"},\"horizontalrule\":{\"toolbar\":\"Elválasztóvonal beillesztése\"},\"iframe\":{\"border\":\"Legyen keret\",\"noUrl\":\"Kérem írja be a iframe URL-t\",\"scrolling\":\"Gördítősáv bekapcsolása\",\"title\":\"IFrame Tulajdonságok\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatív szöveg\",\"border\":\"Keret\",\"btnUpload\":\"Küldés a szerverre\",\"button2Img\":\"A kiválasztott képgombból sima képet szeretne csinálni?\",\"hSpace\":\"Vízsz. táv\",\"img2Button\":\"A kiválasztott képből képgombot szeretne csinálni?\",\"infoTab\":\"Alaptulajdonságok\",\"linkTab\":\"Hivatkozás\",\"lockRatio\":\"Arány megtartása\",\"menu\":\"Kép tulajdonságai\",\"resetSize\":\"Eredeti méret\",\"title\":\"Kép tulajdonságai\",\"titleButton\":\"Képgomb tulajdonságai\",\"upload\":\"Feltöltés\",\"urlMissing\":\"Hiányzik a kép URL-je\",\"vSpace\":\"Függ. táv\",\"validateBorder\":\"A keret méretének egész számot kell beírni!\",\"validateHSpace\":\"Vízszintes távolságnak egész számot kell beírni!\",\"validateVSpace\":\"Függőleges távolságnak egész számot kell beírni!\"},\"indent\":{\"indent\":\"Behúzás növelése\",\"outdent\":\"Behúzás csökkentése\"},\"smiley\":{\"options\":\"Hangulatjel opciók\",\"title\":\"Hangulatjel beszúrása\",\"toolbar\":\"Hangulatjelek\"},\"justify\":{\"block\":\"Sorkizárt\",\"center\":\"Középre\",\"left\":\"Balra\",\"right\":\"Jobbra\"},\"language\":{\"button\":\"Nyelv beállítása\",\"remove\":\"Nyelv eltávolítása\"},\"link\":{\"acccessKey\":\"Billentyűkombináció\",\"advanced\":\"További opciók\",\"advisoryContentType\":\"Súgó tartalomtípusa\",\"advisoryTitle\":\"Súgócimke\",\"anchor\":{\"toolbar\":\"Horgony beillesztése/szerkesztése\",\"menu\":\"Horgony tulajdonságai\",\"title\":\"Horgony tulajdonságai\",\"name\":\"Horgony neve\",\"errorName\":\"Kérem adja meg a horgony nevét\",\"remove\":\"Horgony eltávolítása\"},\"anchorId\":\"Azonosító szerint\",\"anchorName\":\"Horgony név szerint\",\"charset\":\"Hivatkozott tartalom kódlapja\",\"cssClasses\":\"Stíluskészlet\",\"emailAddress\":\"E-Mail cím\",\"emailBody\":\"Üzenet\",\"emailSubject\":\"Üzenet tárgya\",\"id\":\"Id\",\"info\":\"Alaptulajdonságok\",\"langCode\":\"Írás iránya\",\"langDir\":\"Írás iránya\",\"langDirLTR\":\"Balról jobbra\",\"langDirRTL\":\"Jobbról balra\",\"menu\":\"Hivatkozás módosítása\",\"name\":\"Név\",\"noAnchors\":\"(Nincs horgony a dokumentumban)\",\"noEmail\":\"Adja meg az E-Mail címet\",\"noUrl\":\"Adja meg a hivatkozás webcímét\",\"other\":\"<más>\",\"popupDependent\":\"Szülőhöz kapcsolt (csak Netscape)\",\"popupFeatures\":\"Felugró ablak jellemzői\",\"popupFullScreen\":\"Teljes képernyő (csak IE)\",\"popupLeft\":\"Bal pozíció\",\"popupLocationBar\":\"Címsor\",\"popupMenuBar\":\"Menü sor\",\"popupResizable\":\"Átméretezés\",\"popupScrollBars\":\"Gördítősáv\",\"popupStatusBar\":\"Állapotsor\",\"popupToolbar\":\"Eszköztár\",\"popupTop\":\"Felső pozíció\",\"rel\":\"Kapcsolat típusa\",\"selectAnchor\":\"Horgony választása\",\"styles\":\"Stílus\",\"tabIndex\":\"Tabulátor index\",\"target\":\"Tartalom megjelenítése\",\"targetFrame\":\"<keretben>\",\"targetFrameName\":\"Keret neve\",\"targetPopup\":\"<felugró ablakban>\",\"targetPopupName\":\"Felugró ablak neve\",\"title\":\"Hivatkozás tulajdonságai\",\"toAnchor\":\"Horgony az oldalon\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Hivatkozás beillesztése/módosítása\",\"type\":\"Hivatkozás típusa\",\"unlink\":\"Hivatkozás törlése\",\"upload\":\"Feltöltés\"},\"list\":{\"bulletedlist\":\"Felsorolás\",\"numberedlist\":\"Számozás\"},\"liststyle\":{\"armenian\":\"Örmény számozás\",\"bulletedTitle\":\"Pontozott lista tulajdonságai\",\"circle\":\"Kör\",\"decimal\":\"Arab számozás (1, 2, 3, stb.)\",\"decimalLeadingZero\":\"Számozás bevezető nullákkal (01, 02, 03, stb.)\",\"disc\":\"Korong\",\"georgian\":\"Grúz számozás (an, ban, gan, stb.)\",\"lowerAlpha\":\"Kisbetűs (a, b, c, d, e, stb.)\",\"lowerGreek\":\"Görög (alpha, beta, gamma, stb.)\",\"lowerRoman\":\"Római kisbetűs (i, ii, iii, iv, v, stb.)\",\"none\":\"Nincs\",\"notset\":\"<Nincs beállítva>\",\"numberedTitle\":\"Sorszámozott lista tulajdonságai\",\"square\":\"Négyzet\",\"start\":\"Kezdőszám\",\"type\":\"Típus\",\"upperAlpha\":\"Nagybetűs (A, B, C, D, E, stb.)\",\"upperRoman\":\"Római nagybetűs (I, II, III, IV, V, stb.)\",\"validateStartNumber\":\"A kezdőszám nem lehet tört érték.\"},\"magicline\":{\"title\":\"Szúrja be a bekezdést ide\"},\"maximize\":{\"maximize\":\"Teljes méret\",\"minimize\":\"Kis méret\"},\"newpage\":{\"toolbar\":\"Új oldal\"},\"pagebreak\":{\"alt\":\"Oldaltörés\",\"toolbar\":\"Oldaltörés beillesztése\"},\"pastetext\":{\"button\":\"Beillesztés formázatlan szövegként\",\"title\":\"Beillesztés formázatlan szövegként\"},\"pastefromword\":{\"confirmCleanup\":\"Úgy tűnik a beillesztett szöveget Word-ből másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)\",\"error\":\"Egy belső hiba miatt nem sikerült megtisztítani a szöveget\",\"title\":\"Beillesztés Word-ből\",\"toolbar\":\"Beillesztés Word-ből\"},\"preview\":{\"preview\":\"Előnézet\"},\"print\":{\"toolbar\":\"Nyomtatás\"},\"removeformat\":{\"toolbar\":\"Formázás eltávolítása\"},\"save\":{\"toolbar\":\"Mentés\"},\"selectall\":{\"toolbar\":\"Mindent kijelöl\"},\"showblocks\":{\"toolbar\":\"Blokkok megjelenítése\"},\"sourcearea\":{\"toolbar\":\"Forráskód\"},\"specialchar\":{\"options\":\"Speciális karakter opciók\",\"title\":\"Speciális karakter választása\",\"toolbar\":\"Speciális karakter beillesztése\"},\"scayt\":{\"btn_about\":\"SCAYT névjegy\",\"btn_dictionaries\":\"Szótár\",\"btn_disable\":\"SCAYT letiltása\",\"btn_enable\":\"SCAYT engedélyezése\",\"btn_langs\":\"Nyelvek\",\"btn_options\":\"Beállítások\",\"text_title\":\"Helyesírás ellenőrzés gépelés közben\"},\"stylescombo\":{\"label\":\"Stílus\",\"panelTitle\":\"Formázási stílusok\",\"panelTitle1\":\"Blokk stílusok\",\"panelTitle2\":\"Inline stílusok\",\"panelTitle3\":\"Objektum stílusok\"},\"table\":{\"border\":\"Szegélyméret\",\"caption\":\"Felirat\",\"cell\":{\"menu\":\"Cella\",\"insertBefore\":\"Beszúrás balra\",\"insertAfter\":\"Beszúrás jobbra\",\"deleteCell\":\"Cellák törlése\",\"merge\":\"Cellák egyesítése\",\"mergeRight\":\"Cellák egyesítése jobbra\",\"mergeDown\":\"Cellák egyesítése lefelé\",\"splitHorizontal\":\"Cellák szétválasztása vízszintesen\",\"splitVertical\":\"Cellák szétválasztása függőlegesen\",\"title\":\"Cella tulajdonságai\",\"cellType\":\"Cella típusa\",\"rowSpan\":\"Függőleges egyesítés\",\"colSpan\":\"Vízszintes egyesítés\",\"wordWrap\":\"Hosszú sorok törése\",\"hAlign\":\"Vízszintes igazítás\",\"vAlign\":\"Függőleges igazítás\",\"alignBaseline\":\"Alapvonalra\",\"bgColor\":\"Háttér színe\",\"borderColor\":\"Keret színe\",\"data\":\"Adat\",\"header\":\"Fejléc\",\"yes\":\"Igen\",\"no\":\"Nem\",\"invalidWidth\":\"A szélesség mezőbe csak számokat írhat.\",\"invalidHeight\":\"A magasság mezőbe csak számokat írhat.\",\"invalidRowSpan\":\"A függőleges egyesítés mezőbe csak számokat írhat.\",\"invalidColSpan\":\"A vízszintes egyesítés mezőbe csak számokat írhat.\",\"chooseColor\":\"Válasszon\"},\"cellPad\":\"Cella belső margó\",\"cellSpace\":\"Cella térköz\",\"column\":{\"menu\":\"Oszlop\",\"insertBefore\":\"Beszúrás balra\",\"insertAfter\":\"Beszúrás jobbra\",\"deleteColumn\":\"Oszlopok törlése\"},\"columns\":\"Oszlopok\",\"deleteTable\":\"Táblázat törlése\",\"headers\":\"Fejlécek\",\"headersBoth\":\"Mindkettő\",\"headersColumn\":\"Első oszlop\",\"headersNone\":\"Nincsenek\",\"headersRow\":\"Első sor\",\"invalidBorder\":\"A szegélyméret mezőbe csak számokat írhat.\",\"invalidCellPadding\":\"A cella belső margó mezőbe csak számokat írhat.\",\"invalidCellSpacing\":\"A cella térköz mezőbe csak számokat írhat.\",\"invalidCols\":\"Az oszlopok számának nagyobbnak kell lenni mint 0.\",\"invalidHeight\":\"A magasság mezőbe csak számokat írhat.\",\"invalidRows\":\"A sorok számának nagyobbnak kell lenni mint 0.\",\"invalidWidth\":\"A szélesség mezőbe csak számokat írhat.\",\"menu\":\"Táblázat tulajdonságai\",\"row\":{\"menu\":\"Sor\",\"insertBefore\":\"Beszúrás fölé\",\"insertAfter\":\"Beszúrás alá\",\"deleteRow\":\"Sorok törlése\"},\"rows\":\"Sorok\",\"summary\":\"Leírás\",\"title\":\"Táblázat tulajdonságai\",\"toolbar\":\"Táblázat\",\"widthPc\":\"százalék\",\"widthPx\":\"képpont\",\"widthUnit\":\"Szélesség egység\"},\"undo\":{\"redo\":\"Ismétlés\",\"undo\":\"Visszavonás\"},\"wsc\":{\"btnIgnore\":\"Kihagyja\",\"btnIgnoreAll\":\"Mindet kihagyja\",\"btnReplace\":\"Csere\",\"btnReplaceAll\":\"Összes cseréje\",\"btnUndo\":\"Visszavonás\",\"changeTo\":\"Módosítás\",\"errorLoading\":\"Hiba a szolgáltatás host betöltése közben: %s.\",\"ieSpellDownload\":\"A helyesírás-ellenőrző nincs telepítve. Szeretné letölteni most?\",\"manyChanges\":\"Helyesírás-ellenőrzés kész: %1 szó cserélve\",\"noChanges\":\"Helyesírás-ellenőrzés kész: Nincs változtatott szó\",\"noMispell\":\"Helyesírás-ellenőrzés kész: Nem találtam hibát\",\"noSuggestions\":\"Nincs javaslat\",\"notAvailable\":\"Sajnálom, de a szolgáltatás jelenleg nem elérhető.\",\"notInDic\":\"Nincs a szótárban\",\"oneChange\":\"Helyesírás-ellenőrzés kész: Egy szó cserélve\",\"progress\":\"Helyesírás-ellenőrzés folyamatban...\",\"title\":\"Helyesírás ellenörző\",\"toolbar\":\"Helyesírás-ellenőrzés\"}};"
  },
  {
    "path": "assets/ckeditor/lang/id.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['id']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Tekan ALT 0 untuk bantuan.\",\"browseServer\":\"Jelajah Server\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Unggah\",\"uploadSubmit\":\"Kirim ke Server\",\"image\":\"Gambar\",\"flash\":\"Flash\",\"form\":\"Formulir\",\"checkbox\":\"Kotak Cek\",\"radio\":\"Tombol Radio\",\"textField\":\"Kolom Teks\",\"textarea\":\"Area Teks\",\"hiddenField\":\"Kolom Tersembunyi\",\"button\":\"Tombol\",\"select\":\"Kolom Seleksi\",\"imageButton\":\"Tombol Gambar\",\"notSet\":\"<tidak diatur>\",\"id\":\"Id\",\"name\":\"Nama\",\"langDir\":\"Arah Bahasa\",\"langDirLtr\":\"Kiri ke Kanan (LTR)\",\"langDirRtl\":\"Kanan ke Kiri\",\"langCode\":\"Kode Bahasa\",\"longDescr\":\"Deskripsi URL Panjang\",\"cssClass\":\"Kelas Stylesheet\",\"advisoryTitle\":\"Penasehat Judul\",\"cssStyle\":\"Gaya\",\"ok\":\"OK\",\"cancel\":\"Batal\",\"close\":\"Tutup\",\"preview\":\"Pratinjau\",\"resize\":\"Ubah ukuran\",\"generalTab\":\"Umum\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"Nilai ini tidak sebuah angka\",\"confirmNewPage\":\"Semua perubahan yang tidak disimpan di konten ini akan hilang. Apakah anda yakin ingin memuat halaman baru?\",\"confirmCancel\":\"Beberapa opsi telah berubah. Apakah anda yakin ingin menutup dialog?\",\"options\":\"Opsi\",\"target\":\"Sasaran\",\"targetNew\":\"Jendela Baru (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Jendela yang Sama (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Kiri ke Kanan (LTR)\",\"langDirRTL\":\"Kanan ke Kiri (RTL)\",\"styles\":\"Gaya\",\"cssClasses\":\"Kelas Stylesheet\",\"width\":\"Lebar\",\"height\":\"Tinggi\",\"align\":\"Penjajaran\",\"alignLeft\":\"Kiri\",\"alignRight\":\"Kanan\",\"alignCenter\":\"Tengah\",\"alignJustify\":\"Rata kiri-kanan\",\"alignTop\":\"Atas\",\"alignMiddle\":\"Tengah\",\"alignBottom\":\"Bawah\",\"alignNone\":\"None\",\"invalidValue\":\"Nilai tidak sah.\",\"invalidHeight\":\"Tinggi harus sebuah angka.\",\"invalidWidth\":\"Lebar harus sebuah angka.\",\"invalidCssLength\":\"Nilai untuk \\\"%1\\\" harus sebuah angkat positif dengan atau tanpa pengukuran unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Nilai yang dispesifikasian untuk kolom \\\"%1\\\" harus sebuah angka positif dengan atau tanpa sebuah unit pengukuran HTML (px atau %) yang valid.\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Masukkan sebuah angka untuk sebuah nilai dalam pixel atau sebuah angka dengan unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, tidak tersedia</span>\"},\"about\":{\"copy\":\"Hak cipta &copy; $1. All rights reserved.\",\"dlgTitle\":\"Tentang CKEditor\",\"help\":\"Cel $1 untuk bantuan.\",\"moreInfo\":\"Untuk informasi lisensi silahkan kunjungi web site kami:\",\"title\":\"Tentang CKEditor\",\"userGuide\":\"Petunjuk Pengguna CKEditor\"},\"basicstyles\":{\"bold\":\"Huruf Tebal\",\"italic\":\"Huruf Miring\",\"strike\":\"Strikethrough\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Garis Bawah\"},\"bidi\":{\"ltr\":\"Arah penulisan dari kiri ke kanan.\",\"rtl\":\"Arah penulisan dari kanan ke kiri.\"},\"blockquote\":{\"toolbar\":\"Kutipan Blok\"},\"clipboard\":{\"copy\":\"Salin\",\"copyError\":\"Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)\",\"cut\":\"Potong\",\"cutError\":\"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).\",\"paste\":\"Tempel\",\"pasteArea\":\"Area Tempel\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Karena pengaturan keamanan peramban anda, editor tida dapat mengakses data clipboard anda secara langsung. Anda harus mem-paste kembali pada halaman ini\",\"title\":\"Tempel\"},\"button\":{\"selectedLabel\":\"%1(Dipilih)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Warna Latar Belakang\",\"colors\":{\"000\":\"Hitam\",\"800000\":\"Merah Tua\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Abu-abu Gelap\",\"B22222\":\"Merah Bata\",\"A52A2A\":\"Coklat\",\"DAA520\":\"Golden Rod\",\"006400\":\"Hijau Gelap\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Biru Sedang\",\"800080\":\"Ungu\",\"808080\":\"Abu-abu\",\"F00\":\"Merah\",\"FF8C00\":\"Jingga Gelap\",\"FFD700\":\"Emas\",\"008000\":\"Hijau\",\"0FF\":\"Cyan\",\"00F\":\"Biru\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Abu-abu Redup\",\"FFA07A\":\"Salmon Cerah\",\"FFA500\":\"Jingga\",\"FFFF00\":\"Kuning\",\"00FF00\":\"Jeruk Lemon\",\"AFEEEE\":\"Biru Hijau Pucat\",\"ADD8E6\":\"Biru Cerah\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Abu-abu Cerah\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Kuning Cerah\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Putih\"},\"more\":\"Warna lainnya...\",\"panelTitle\":\"Warna\",\"textColorTitle\":\"Warna Teks\"},\"colordialog\":{\"clear\":\"Hapus\",\"highlight\":\"Sorot\",\"options\":\"Pilihan Warna\",\"selected\":\"Warna Dipilih\",\"title\":\"Pilih Warna\"},\"templates\":{\"button\":\"Contoh\",\"emptyListMsg\":\"(Tidak ada contoh didefinisikan)\",\"insertOption\":\"Ganti konten sebenarnya\",\"options\":\"Opsi Contoh\",\"selectPromptMsg\":\"Mohon pilih contoh untuk dibuka di editor\",\"title\":\"Contoh Konten\"},\"contextmenu\":{\"options\":\"Opsi Konteks Pilihan\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Penasehat Judul\",\"cssClassInputLabel\":\"Kelas Stylesheet\",\"edit\":\"Sunting Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Kiri ke Kanan (LTR)\",\"langDirLabel\":\"Arah Bahasa\",\"langDirRTLLabel\":\"Kanan ke Kiri (RTL)\",\"languageCodeInputLabel\":\"Kode Bahasa\",\"remove\":\"Hapus Div\",\"styleSelectLabel\":\"Gaya\",\"title\":\"Ciptakan Wadah Div\",\"toolbar\":\"Cipatakan Wadah Div\"},\"toolbar\":{\"toolbarCollapse\":\"Ciutkan Toolbar\",\"toolbarExpand\":\"Bentangkan Toolbar\",\"toolbarGroups\":{\"document\":\"Dokumen\",\"clipboard\":\"Papan klip / Kembalikan perlakuan\",\"editing\":\"Sunting\",\"forms\":\"Formulir\",\"basicstyles\":\"Gaya Dasar\",\"paragraph\":\"Paragraf\",\"links\":\"Tautan\",\"insert\":\"Sisip\",\"styles\":\"Gaya\",\"colors\":\"Warna\",\"tools\":\"Alat\"},\"toolbars\":\"Toolbar Penyunting\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Temukan\",\"findOptions\":\"Opsi menemukan\",\"findWhat\":\"Temukan apa:\",\"matchCase\":\"Match case\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Match whole word\",\"notFoundMsg\":\"Teks yang dipilih tidak ditemukan\",\"replace\":\"Ganti\",\"replaceAll\":\"Ganti Semua\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Ganti dengan:\",\"title\":\"Temukan dan Ganti\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Animasi Flash\",\"hiddenfield\":\"Kolom Tersembunyi\",\"iframe\":\"IFrame\",\"unknown\":\"Obyek Tak Dikenal\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Selalu\",\"accessNever\":\"Tidak Pernah\",\"accessSameDomain\":\"Domain yang sama\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Dasar\",\"alignTextTop\":\"Text Top\",\"bgcolor\":\"Warna Latar Belakang\",\"chkFull\":\"Izinkan Layar Penuh\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Mainkan Otomatis\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properti\",\"quality\":\"Kualitas\",\"qualityAutoHigh\":\"Tinggi Otomatis\",\"qualityAutoLow\":\"Rendah Otomatis\",\"qualityBest\":\"Terbaik\",\"qualityHigh\":\"Tinggi\",\"qualityLow\":\"Rendah\",\"qualityMedium\":\"Sedang\",\"scale\":\"Scale\",\"scaleAll\":\"Perlihatkan semua\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"Tanpa Batas\",\"title\":\"Flash Properties\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace harus sebuah angka\",\"validateSrc\":\"URL tidak boleh kosong\",\"validateVSpace\":\"VSpace harus sebuah angka\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparan\",\"windowModeWindow\":\"Jendela\"},\"font\":{\"fontSize\":{\"label\":\"Ukuran\",\"voiceLabel\":\"Ukuran Huruf\",\"panelTitle\":\"Ukuran Huruf\"},\"label\":\"Huruf\",\"panelTitle\":\"Font Name\",\"voiceLabel\":\"Huruf\"},\"forms\":{\"button\":{\"title\":\"Properti Tombol\",\"text\":\"Teks (Nilai)\",\"type\":\"Tipe\",\"typeBtn\":\"Tombol\",\"typeSbm\":\"Menyerahkan\",\"typeRst\":\"Atur Ulang\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Nilai\",\"selected\":\"Terpilih\",\"required\":\"Wajib\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Aksi\",\"method\":\"Metode\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Nama\",\"value\":\"Nilai\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Nilai\",\"size\":\"Ukuran\",\"lines\":\"garis\",\"chkMulti\":\"Izinkan pemilihan ganda\",\"required\":\"Wajib\",\"opText\":\"Teks\",\"opValue\":\"Nilai\",\"btnAdd\":\"Tambah\",\"btnModify\":\"Modifikasi\",\"btnUp\":\"Atas\",\"btnDown\":\"Bawah\",\"btnSetValue\":\"Atur sebagai nilai yang dipilih\",\"btnDelete\":\"Hapus\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Kolom\",\"rows\":\"Baris\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Nilai\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Wajib\",\"type\":\"Tipe\",\"typeText\":\"Teks\",\"typePass\":\"Kata kunci\",\"typeEmail\":\"Surel\",\"typeSearch\":\"Cari\",\"typeTel\":\"Nomor Telepon\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Bentuk\",\"panelTitle\":\"Bentuk Paragraf\",\"tag_address\":\"Alamat\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Membentuk\"},\"horizontalrule\":{\"toolbar\":\"Sisip Garis Horisontal\"},\"iframe\":{\"border\":\"Tampilkan Batas Bingkai\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Aktifkan Scrollbar\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Teks alternatif\",\"border\":\"Batas\",\"btnUpload\":\"Kirim ke Server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Apakah anda ingin mengubah gambar yang dipilih pada tombol gambar?\",\"infoTab\":\"Info Gambar\",\"linkTab\":\"Tautan\",\"lockRatio\":\"Lock Ratio\",\"menu\":\"Image Properties\",\"resetSize\":\"Atur Ulang Ukuran\",\"title\":\"Image Properties\",\"titleButton\":\"Image Button Properties\",\"upload\":\"Unggah\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border harus berupa angka\",\"validateHSpace\":\"HSpace harus berupa angka\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Tingkatkan Lekuk\",\"outdent\":\"Kurangi Lekuk\"},\"smiley\":{\"options\":\"Opsi Smiley\",\"title\":\"Sisip sebuah Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Rata kiri-kanan\",\"center\":\"Pusat\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Atur Bahasa\",\"remove\":\"Hapus Bahasa\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Penasehat Judul\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Kelas Stylesheet\",\"emailAddress\":\"Alamat E-mail\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Judul Pesan\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Kode Bahasa\",\"langDir\":\"Arah Bahasa\",\"langDirLTR\":\"Kiri ke Kanan (LTR)\",\"langDirRTL\":\"Kanan ke Kiri (RTL)\",\"menu\":\"Sunting Tautan\",\"name\":\"Nama\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Silahkan ketikkan alamat e-mail\",\"noUrl\":\"Silahkan ketik URL tautan\",\"other\":\"<lainnya>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Hubungan\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"Gaya\",\"tabIndex\":\"Tab Index\",\"target\":\"Sasaran\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"Tautan\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Tautan\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"Unggah\"},\"list\":{\"bulletedlist\":\"Sisip/Hapus Daftar Bullet\",\"numberedlist\":\"Sisip/Hapus Daftar Bernomor\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Lingkaran\",\"decimal\":\"Desimal (1, 2, 3, dst.)\",\"decimalLeadingZero\":\"Desimal diawali angka nol (01, 02, 03, dst.)\",\"disc\":\"Cakram\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Huruf Kecil (a, b, c, d, e, dst.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Angka Romawi (i, ii, iii, iv, v, dst.)\",\"none\":\"Tidak ada\",\"notset\":\"<tidak diatur>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Persegi\",\"start\":\"Mulai\",\"type\":\"Tipe\",\"upperAlpha\":\"Huruf Besar (A, B, C, D, E, dst.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Masukkan paragraf disini\"},\"maximize\":{\"maximize\":\"Memperbesar\",\"minimize\":\"Memperkecil\"},\"newpage\":{\"toolbar\":\"Halaman Baru\"},\"pagebreak\":{\"alt\":\"Halaman Istirahat\",\"toolbar\":\"Sisip Halaman Istirahat untuk Pencetakan \"},\"pastetext\":{\"button\":\"Tempel sebagai teks polos\",\"title\":\"Tempel sebagai Teks Polos\"},\"pastefromword\":{\"confirmCleanup\":\"Teks yang ingin anda tempel sepertinya di salin dari Word. Apakah anda mau membersihkannya sebelum menempel?\",\"error\":\"Tidak mungkin membersihkan data yang ditempel dikerenakan kesalahan internal\",\"title\":\"Tempel dari Word\",\"toolbar\":\"Tempel dari Word\"},\"preview\":{\"preview\":\"Pratinjau\"},\"print\":{\"toolbar\":\"Cetak\"},\"removeformat\":{\"toolbar\":\"Hapus Format\"},\"save\":{\"toolbar\":\"Simpan\"},\"selectall\":{\"toolbar\":\"Pilih Semua\"},\"showblocks\":{\"toolbar\":\"Perlihatkan Blok\"},\"sourcearea\":{\"toolbar\":\"Sumber\"},\"specialchar\":{\"options\":\"Opsi spesial karakter\",\"title\":\"Pilih spesial karakter\",\"toolbar\":\"Sisipkan spesial karakter\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Gaya\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Ukuran batas\",\"caption\":\"Judul halaman\",\"cell\":{\"menu\":\"Sel\",\"insertBefore\":\"Sisip Sel Sebelum\",\"insertAfter\":\"Sisip Sel Setelah\",\"deleteCell\":\"Hapus Sel\",\"merge\":\"Gabungkan Sel\",\"mergeRight\":\"Gabungkan ke Kanan\",\"mergeDown\":\"Gabungkan ke Bawah\",\"splitHorizontal\":\"Pisahkan Sel Secara Horisontal\",\"splitVertical\":\"Pisahkan Sel Secara Vertikal\",\"title\":\"Properti Sel\",\"cellType\":\"Tipe Sel\",\"rowSpan\":\"Rentang antar baris\",\"colSpan\":\"Rentang antar kolom\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Jajaran Horisontal\",\"vAlign\":\"Jajaran Vertikal\",\"alignBaseline\":\"Dasar\",\"bgColor\":\"Warna Latar Belakang\",\"borderColor\":\"Warna Batasan\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Ya\",\"no\":\"Tidak\",\"invalidWidth\":\"Lebar sel harus sebuah angka.\",\"invalidHeight\":\"Tinggi sel harus sebuah angka\",\"invalidRowSpan\":\"Rentang antar baris harus angka seluruhnya.\",\"invalidColSpan\":\"Rentang antar kolom harus angka seluruhnya\",\"chooseColor\":\"Pilih\"},\"cellPad\":\"Sel spasi dalam\",\"cellSpace\":\"Spasi antar sel\",\"column\":{\"menu\":\"Kolom\",\"insertBefore\":\"Sisip Kolom Sebelum\",\"insertAfter\":\"Sisip Kolom Sesudah\",\"deleteColumn\":\"Hapus Kolom\"},\"columns\":\"Kolom\",\"deleteTable\":\"Hapus Tabel\",\"headers\":\"Headers\",\"headersBoth\":\"Keduanya\",\"headersColumn\":\"Kolom pertama\",\"headersNone\":\"Tidak ada\",\"headersRow\":\"Baris Pertama\",\"invalidBorder\":\"Ukuran batasan harus sebuah angka\",\"invalidCellPadding\":\"'Spasi dalam' sel harus angka positif.\",\"invalidCellSpacing\":\"Spasi antar sel harus angka positif.\",\"invalidCols\":\"Jumlah kolom harus sebuah angka lebih besar dari 0\",\"invalidHeight\":\"Tinggi tabel harus sebuah angka.\",\"invalidRows\":\"Jumlah barus harus sebuah angka dan lebih besar dari 0.\",\"invalidWidth\":\"Lebar tabel harus sebuah angka.\",\"menu\":\"Properti Tabel\",\"row\":{\"menu\":\"Baris\",\"insertBefore\":\"Sisip Baris Sebelum\",\"insertAfter\":\"Sisip Baris Sesudah\",\"deleteRow\":\"Hapus Baris\"},\"rows\":\"Baris\",\"summary\":\"Intisari\",\"title\":\"Properti Tabel\",\"toolbar\":\"Tabe\",\"widthPc\":\"persen\",\"widthPx\":\"piksel\",\"widthUnit\":\"lebar satuan\"},\"undo\":{\"redo\":\"Kembali lakukan\",\"undo\":\"Batalkan perlakuan\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/is.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['is']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Fletta í skjalasafni\",\"url\":\"Vefslóð\",\"protocol\":\"Samskiptastaðall\",\"upload\":\"Senda upp\",\"uploadSubmit\":\"Hlaða upp\",\"image\":\"Setja inn mynd\",\"flash\":\"Flash\",\"form\":\"Setja inn innsláttarform\",\"checkbox\":\"Setja inn hökunarreit\",\"radio\":\"Setja inn valhnapp\",\"textField\":\"Setja inn textareit\",\"textarea\":\"Setja inn textasvæði\",\"hiddenField\":\"Setja inn falið svæði\",\"button\":\"Setja inn hnapp\",\"select\":\"Setja inn lista\",\"imageButton\":\"Setja inn myndahnapp\",\"notSet\":\"<ekkert valið>\",\"id\":\"Auðkenni\",\"name\":\"Nafn\",\"langDir\":\"Lesstefna\",\"langDirLtr\":\"Frá vinstri til hægri (LTR)\",\"langDirRtl\":\"Frá hægri til vinstri (RTL)\",\"langCode\":\"Tungumálakóði\",\"longDescr\":\"Nánari lýsing\",\"cssClass\":\"Stílsniðsflokkur\",\"advisoryTitle\":\"Titill\",\"cssStyle\":\"Stíll\",\"ok\":\"Í lagi\",\"cancel\":\"Hætta við\",\"close\":\"Close\",\"preview\":\"Forskoða\",\"resize\":\"Resize\",\"generalTab\":\"Almennt\",\"advancedTab\":\"Tæknilegt\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"Mark\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Frá vinstri til hægri (LTR)\",\"langDirRTL\":\"Frá hægri til vinstri (RTL)\",\"styles\":\"Stíll\",\"cssClasses\":\"Stílsniðsflokkur\",\"width\":\"Breidd\",\"height\":\"Hæð\",\"align\":\"Jöfnun\",\"alignLeft\":\"Vinstri\",\"alignRight\":\"Hægri\",\"alignCenter\":\"Miðjað\",\"alignJustify\":\"Jafna báðum megin\",\"alignTop\":\"Efst\",\"alignMiddle\":\"Miðjuð\",\"alignBottom\":\"Neðst\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Feitletrað\",\"italic\":\"Skáletrað\",\"strike\":\"Yfirstrikað\",\"subscript\":\"Niðurskrifað\",\"superscript\":\"Uppskrifað\",\"underline\":\"Undirstrikað\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Inndráttur\"},\"clipboard\":{\"copy\":\"Afrita\",\"copyError\":\"Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).\",\"cut\":\"Klippa\",\"cutError\":\"Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).\",\"paste\":\"Líma\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.\",\"securityMsg\":\"Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.\",\"title\":\"Líma\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Sjálfval\",\"bgColorTitle\":\"Bakgrunnslitur\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Fleiri liti...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Litur texta\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Sniðmát\",\"emptyListMsg\":\"(Ekkert sniðmát er skilgreint!)\",\"insertOption\":\"Skipta út raunverulegu innihaldi\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Veldu sniðmát til að opna í ritlinum.<br>(Núverandi innihald víkur fyrir því!):\",\"title\":\"Innihaldssniðmát\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Leita\",\"findOptions\":\"Find Options\",\"findWhat\":\"Leita að:\",\"matchCase\":\"Gera greinarmun á¡ há¡- og lágstöfum\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Aðeins heil orð\",\"notFoundMsg\":\"Leitartexti fannst ekki!\",\"replace\":\"Skipta út\",\"replaceAll\":\"Skipta út allsstaðar\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Skipta út fyrir:\",\"title\":\"Finna og skipta\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs neðst\",\"alignAbsMiddle\":\"Abs miðjuð\",\"alignBaseline\":\"Grunnlína\",\"alignTextTop\":\"Efri brún texta\",\"bgcolor\":\"Bakgrunnslitur\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Endurtekning\",\"chkMenu\":\"Sýna Flash-valmynd\",\"chkPlay\":\"Sjálfvirk spilun\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"Vinstri bil\",\"properties\":\"Eigindi Flash\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Skali\",\"scaleAll\":\"Sýna allt\",\"scaleFit\":\"Fella skala að stærð\",\"scaleNoBorder\":\"Án ramma\",\"title\":\"Eigindi Flash\",\"vSpace\":\"Hægri bil\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"Sláðu inn veffang stiklunnar!\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Leturstærð \",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Leturstærð \"},\"label\":\"Leturgerð \",\"panelTitle\":\"Leturgerð \",\"voiceLabel\":\"Leturgerð \"},\"forms\":{\"button\":{\"title\":\"Eigindi hnapps\",\"text\":\"Texti\",\"type\":\"Gerð\",\"typeBtn\":\"Hnappur\",\"typeSbm\":\"Staðfesta\",\"typeRst\":\"Hreinsa\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Eigindi markreits\",\"radioTitle\":\"Eigindi valhnapps\",\"value\":\"Gildi\",\"selected\":\"Valið\",\"required\":\"Required\"},\"form\":{\"title\":\"Eigindi innsláttarforms\",\"menu\":\"Eigindi innsláttarforms\",\"action\":\"Aðgerð\",\"method\":\"Aðferð\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Eigindi falins svæðis\",\"name\":\"Nafn\",\"value\":\"Gildi\"},\"select\":{\"title\":\"Eigindi lista\",\"selectInfo\":\"Upplýsingar\",\"opAvail\":\"Kostir\",\"value\":\"Gildi\",\"size\":\"Stærð\",\"lines\":\"línur\",\"chkMulti\":\"Leyfa fleiri kosti\",\"required\":\"Required\",\"opText\":\"Texti\",\"opValue\":\"Gildi\",\"btnAdd\":\"Bæta við\",\"btnModify\":\"Breyta\",\"btnUp\":\"Upp\",\"btnDown\":\"Niður\",\"btnSetValue\":\"Merkja sem valið\",\"btnDelete\":\"Eyða\"},\"textarea\":{\"title\":\"Eigindi textasvæðis\",\"cols\":\"Dálkar\",\"rows\":\"Línur\"},\"textfield\":{\"title\":\"Eigindi textareits\",\"name\":\"Nafn\",\"value\":\"Gildi\",\"charWidth\":\"Breidd (leturtákn)\",\"maxChars\":\"Hámarksfjöldi leturtákna\",\"required\":\"Required\",\"type\":\"Gerð\",\"typeText\":\"Texti\",\"typePass\":\"Lykilorð\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"Vefslóð\"}},\"format\":{\"label\":\"Stílsnið\",\"panelTitle\":\"Stílsnið\",\"tag_address\":\"Vistfang\",\"tag_div\":\"Venjulegt (DIV)\",\"tag_h1\":\"Fyrirsögn 1\",\"tag_h2\":\"Fyrirsögn 2\",\"tag_h3\":\"Fyrirsögn 3\",\"tag_h4\":\"Fyrirsögn 4\",\"tag_h5\":\"Fyrirsögn 5\",\"tag_h6\":\"Fyrirsögn 6\",\"tag_p\":\"Venjulegt letur\",\"tag_pre\":\"Forsniðið\"},\"horizontalrule\":{\"toolbar\":\"Lóðrétt lína\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Baklægur texti\",\"border\":\"Rammi\",\"btnUpload\":\"Hlaða upp\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"Vinstri bil\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Almennt\",\"linkTab\":\"Stikla\",\"lockRatio\":\"Festa stærðarhlutfall\",\"menu\":\"Eigindi myndar\",\"resetSize\":\"Reikna stærð\",\"title\":\"Eigindi myndar\",\"titleButton\":\"Eigindi myndahnapps\",\"upload\":\"Hlaða upp\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"Hægri bil\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Minnka inndrátt\",\"outdent\":\"Auka inndrátt\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Velja svip\",\"toolbar\":\"Svipur\"},\"justify\":{\"block\":\"Jafna báðum megin\",\"center\":\"Miðja texta\",\"left\":\"Vinstrijöfnun\",\"right\":\"Hægrijöfnun\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Skammvalshnappur\",\"advanced\":\"Tæknilegt\",\"advisoryContentType\":\"Tegund innihalds\",\"advisoryTitle\":\"Titill\",\"anchor\":{\"toolbar\":\"Stofna/breyta kaflamerki\",\"menu\":\"Eigindi kaflamerkis\",\"title\":\"Eigindi kaflamerkis\",\"name\":\"Nafn bókamerkis\",\"errorName\":\"Sláðu inn nafn bókamerkis!\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Eftir auðkenni einingar\",\"anchorName\":\"Eftir akkerisnafni\",\"charset\":\"Táknróf\",\"cssClasses\":\"Stílsniðsflokkur\",\"emailAddress\":\"Netfang\",\"emailBody\":\"Meginmál\",\"emailSubject\":\"Efni\",\"id\":\"Auðkenni\",\"info\":\"Almennt\",\"langCode\":\"Lesstefna\",\"langDir\":\"Lesstefna\",\"langDirLTR\":\"Frá vinstri til hægri (LTR)\",\"langDirRTL\":\"Frá hægri til vinstri (RTL)\",\"menu\":\"Breyta stiklu\",\"name\":\"Nafn\",\"noAnchors\":\"<Engin bókamerki á skrá>\",\"noEmail\":\"Sláðu inn netfang!\",\"noUrl\":\"Sláðu inn veffang stiklunnar!\",\"other\":\"<annar>\",\"popupDependent\":\"Háð venslum (Netscape)\",\"popupFeatures\":\"Eigindi sprettiglugga\",\"popupFullScreen\":\"Heilskjár (IE)\",\"popupLeft\":\"Fjarlægð frá vinstri\",\"popupLocationBar\":\"Fanglína\",\"popupMenuBar\":\"Vallína\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Skrunstikur\",\"popupStatusBar\":\"Stöðustika\",\"popupToolbar\":\"Verkfærastika\",\"popupTop\":\"Fjarlægð frá efri brún\",\"rel\":\"Relationship\",\"selectAnchor\":\"Veldu akkeri\",\"styles\":\"Stíll\",\"tabIndex\":\"Raðnúmer innsláttarreits\",\"target\":\"Mark\",\"targetFrame\":\"<rammi>\",\"targetFrameName\":\"Nafn markglugga\",\"targetPopup\":\"<sprettigluggi>\",\"targetPopupName\":\"Nafn sprettiglugga\",\"title\":\"Stikla\",\"toAnchor\":\"Bókamerki á þessari síðu\",\"toEmail\":\"Netfang\",\"toUrl\":\"Vefslóð\",\"toolbar\":\"Stofna/breyta stiklu\",\"type\":\"Stikluflokkur\",\"unlink\":\"Fjarlægja stiklu\",\"upload\":\"Senda upp\"},\"list\":{\"bulletedlist\":\"Punktalisti\",\"numberedlist\":\"Númeraður listi\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"Ný síða\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Setja inn síðuskil\"},\"pastetext\":{\"button\":\"Líma sem ósniðinn texta\",\"title\":\"Líma sem ósniðinn texta\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Líma úr Word\",\"toolbar\":\"Líma úr Word\"},\"preview\":{\"preview\":\"Forskoða\"},\"print\":{\"toolbar\":\"Prenta\"},\"removeformat\":{\"toolbar\":\"Fjarlægja snið\"},\"save\":{\"toolbar\":\"Vista\"},\"selectall\":{\"toolbar\":\"Velja allt\"},\"showblocks\":{\"toolbar\":\"Sýna blokkir\"},\"sourcearea\":{\"toolbar\":\"Kóði\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Velja tákn\",\"toolbar\":\"Setja inn merki\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stílflokkur\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Breidd ramma\",\"caption\":\"Titill\",\"cell\":{\"menu\":\"Reitur\",\"insertBefore\":\"Skjóta inn reiti fyrir aftan\",\"insertAfter\":\"Skjóta inn reiti fyrir framan\",\"deleteCell\":\"Fella reit\",\"merge\":\"Sameina reiti\",\"mergeRight\":\"Sameina til hægri\",\"mergeDown\":\"Sameina niður á við\",\"splitHorizontal\":\"Kljúfa reit lárétt\",\"splitVertical\":\"Kljúfa reit lóðrétt\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Reitaspássía\",\"cellSpace\":\"Bil milli reita\",\"column\":{\"menu\":\"Dálkur\",\"insertBefore\":\"Skjóta inn dálki vinstra megin\",\"insertAfter\":\"Skjóta inn dálki hægra megin\",\"deleteColumn\":\"Fella dálk\"},\"columns\":\"Dálkar\",\"deleteTable\":\"Fella töflu\",\"headers\":\"Fyrirsagnir\",\"headersBoth\":\"Hvort tveggja\",\"headersColumn\":\"Fyrsti dálkur\",\"headersNone\":\"Engar\",\"headersRow\":\"Fyrsta röð\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Eigindi töflu\",\"row\":{\"menu\":\"Röð\",\"insertBefore\":\"Skjóta inn röð fyrir ofan\",\"insertAfter\":\"Skjóta inn röð fyrir neðan\",\"deleteRow\":\"Eyða röð\"},\"rows\":\"Raðir\",\"summary\":\"Áfram\",\"title\":\"Eigindi töflu\",\"toolbar\":\"Tafla\",\"widthPc\":\"prósent\",\"widthPx\":\"myndeindir\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Hætta við afturköllun\",\"undo\":\"Afturkalla\"},\"wsc\":{\"btnIgnore\":\"Hunsa\",\"btnIgnoreAll\":\"Hunsa allt\",\"btnReplace\":\"Skipta\",\"btnReplaceAll\":\"Skipta öllu\",\"btnUndo\":\"Til baka\",\"changeTo\":\"Tillaga\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Villuleit ekki sett upp.<br>Viltu setja hana upp?\",\"manyChanges\":\"Villuleit lokið: %1 orðum breytt\",\"noChanges\":\"Villuleit lokið: Engu orði breytt\",\"noMispell\":\"Villuleit lokið: Engin villa fannst\",\"noSuggestions\":\"- engar tillögur -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Ekki í orðabókinni\",\"oneChange\":\"Villuleit lokið: Einu orði breytt\",\"progress\":\"Villuleit í gangi...\",\"title\":\"Spell Checker\",\"toolbar\":\"Villuleit\"}};"
  },
  {
    "path": "assets/ckeditor/lang/it.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['it']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Pannello Rich Text Editor\",\"common\":{\"editorHelp\":\"Premi ALT 0 per aiuto\",\"browseServer\":\"Cerca sul server\",\"url\":\"URL\",\"protocol\":\"Protocollo\",\"upload\":\"Carica\",\"uploadSubmit\":\"Invia al server\",\"image\":\"Immagine\",\"flash\":\"Oggetto Flash\",\"form\":\"Modulo\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Campo di testo\",\"textarea\":\"Area di testo\",\"hiddenField\":\"Campo nascosto\",\"button\":\"Bottone\",\"select\":\"Menu di selezione\",\"imageButton\":\"Bottone immagine\",\"notSet\":\"<non impostato>\",\"id\":\"Id\",\"name\":\"Nome\",\"langDir\":\"Direzione scrittura\",\"langDirLtr\":\"Da Sinistra a Destra (LTR)\",\"langDirRtl\":\"Da Destra a Sinistra (RTL)\",\"langCode\":\"Codice Lingua\",\"longDescr\":\"URL descrizione estesa\",\"cssClass\":\"Nome classe CSS\",\"advisoryTitle\":\"Titolo\",\"cssStyle\":\"Stile\",\"ok\":\"OK\",\"cancel\":\"Annulla\",\"close\":\"Chiudi\",\"preview\":\"Anteprima\",\"resize\":\"Trascina per ridimensionare\",\"generalTab\":\"Generale\",\"advancedTab\":\"Avanzate\",\"validateNumberFailed\":\"Il valore inserito non è un numero.\",\"confirmNewPage\":\"Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?\",\"confirmCancel\":\"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?\",\"options\":\"Opzioni\",\"target\":\"Destinazione\",\"targetNew\":\"Nuova finestra (_blank)\",\"targetTop\":\"Finestra in primo piano (_top)\",\"targetSelf\":\"Stessa finestra (_self)\",\"targetParent\":\"Finestra Padre (_parent)\",\"langDirLTR\":\"Da sinistra a destra (LTR)\",\"langDirRTL\":\"Da destra a sinistra (RTL)\",\"styles\":\"Stile\",\"cssClasses\":\"Classi di stile\",\"width\":\"Larghezza\",\"height\":\"Altezza\",\"align\":\"Allineamento\",\"alignLeft\":\"Sinistra\",\"alignRight\":\"Destra\",\"alignCenter\":\"Centrato\",\"alignJustify\":\"Giustifica\",\"alignTop\":\"In Alto\",\"alignMiddle\":\"Centrato\",\"alignBottom\":\"In Basso\",\"alignNone\":\"Nessuno\",\"invalidValue\":\"Valore non valido.\",\"invalidHeight\":\"L'altezza dev'essere un numero\",\"invalidWidth\":\"La Larghezza dev'essere un numero\",\"invalidCssLength\":\"Il valore indicato per il campo \\\"%1\\\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).\",\"invalidHtmlLength\":\"Il valore indicato per il campo \\\"%1\\\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).\",\"invalidInlineStyle\":\"Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di \\\"name : value\\\", separati da semicolonne.\",\"cssLengthTooltip\":\"Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, non disponibile</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Tutti i diritti riservati.\",\"dlgTitle\":\"Riguardo CKEditor\",\"help\":\"Vedi $1 per l'aiuto.\",\"moreInfo\":\"Per le informazioni sulla licenza si prega di visitare il nostro sito:\",\"title\":\"Riguardo CKEditor\",\"userGuide\":\"Guida Utente CKEditor\"},\"basicstyles\":{\"bold\":\"Grassetto\",\"italic\":\"Corsivo\",\"strike\":\"Barrato\",\"subscript\":\"Pedice\",\"superscript\":\"Apice\",\"underline\":\"Sottolineato\"},\"bidi\":{\"ltr\":\"Direzione del testo da sinistra verso destra\",\"rtl\":\"Direzione del testo da destra verso sinistra\"},\"blockquote\":{\"toolbar\":\"Citazione\"},\"clipboard\":{\"copy\":\"Copia\",\"copyError\":\"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).\",\"cut\":\"Taglia\",\"cutError\":\"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).\",\"paste\":\"Incolla\",\"pasteArea\":\"Incolla\",\"pasteMsg\":\"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.\",\"securityMsg\":\"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.\",\"title\":\"Incolla\"},\"button\":{\"selectedLabel\":\"%1 (selezionato)\"},\"colorbutton\":{\"auto\":\"Automatico\",\"bgColorTitle\":\"Colore sfondo\",\"colors\":{\"000\":\"Nero\",\"800000\":\"Marrone Castagna\",\"8B4513\":\"Marrone Cuoio\",\"2F4F4F\":\"Grigio Fumo di Londra\",\"008080\":\"Acquamarina\",\"000080\":\"Blu Oceano\",\"4B0082\":\"Indigo\",\"696969\":\"Grigio Scuro\",\"B22222\":\"Giallo Fiamma\",\"A52A2A\":\"Marrone\",\"DAA520\":\"Giallo Mimosa\",\"006400\":\"Verde Scuro\",\"40E0D0\":\"Turchese\",\"0000CD\":\"Blue Scuro\",\"800080\":\"Viola\",\"808080\":\"Grigio\",\"F00\":\"Rosso\",\"FF8C00\":\"Arancio Scuro\",\"FFD700\":\"Oro\",\"008000\":\"Verde\",\"0FF\":\"Ciano\",\"00F\":\"Blu\",\"EE82EE\":\"Violetto\",\"A9A9A9\":\"Grigio Scuro\",\"FFA07A\":\"Salmone\",\"FFA500\":\"Arancio\",\"FFFF00\":\"Giallo\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Turchese Chiaro\",\"ADD8E6\":\"Blu Chiaro\",\"DDA0DD\":\"Rosso Ciliegia\",\"D3D3D3\":\"Grigio Chiaro\",\"FFF0F5\":\"Lavanda Chiara\",\"FAEBD7\":\"Bianco Antico\",\"FFFFE0\":\"Giallo Chiaro\",\"F0FFF0\":\"Verde Mela\",\"F0FFFF\":\"Azzurro\",\"F0F8FF\":\"Celeste\",\"E6E6FA\":\"Lavanda\",\"FFF\":\"Bianco\"},\"more\":\"Altri colori...\",\"panelTitle\":\"Colori\",\"textColorTitle\":\"Colore testo\"},\"colordialog\":{\"clear\":\"cancella\",\"highlight\":\"Evidenzia\",\"options\":\"Opzioni colore\",\"selected\":\"Seleziona il colore\",\"title\":\"Selezionare il colore\"},\"templates\":{\"button\":\"Modelli\",\"emptyListMsg\":\"(Nessun modello definito)\",\"insertOption\":\"Cancella il contenuto corrente\",\"options\":\"Opzioni del Modello\",\"selectPromptMsg\":\"Seleziona il modello da aprire nell'editor\",\"title\":\"Contenuto dei modelli\"},\"contextmenu\":{\"options\":\"Opzioni del menù contestuale\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Titolo Avviso\",\"cssClassInputLabel\":\"Classi di stile\",\"edit\":\"Modifica DIV\",\"inlineStyleInputLabel\":\"Stile Inline\",\"langDirLTRLabel\":\"Da sinistra a destra (LTR)\",\"langDirLabel\":\"Direzione di scrittura\",\"langDirRTLLabel\":\"Da destra a sinistra (RTL)\",\"languageCodeInputLabel\":\"Codice lingua\",\"remove\":\"Rimuovi DIV\",\"styleSelectLabel\":\"Stile\",\"title\":\"Crea DIV contenitore\",\"toolbar\":\"Crea DIV contenitore\"},\"toolbar\":{\"toolbarCollapse\":\"Minimizza Toolbar\",\"toolbarExpand\":\"Espandi Toolbar\",\"toolbarGroups\":{\"document\":\"Documento\",\"clipboard\":\"Copia negli appunti/Annulla\",\"editing\":\"Modifica\",\"forms\":\"Form\",\"basicstyles\":\"Stili di base\",\"paragraph\":\"Paragrafo\",\"links\":\"Link\",\"insert\":\"Inserisci\",\"styles\":\"Stili\",\"colors\":\"Colori\",\"tools\":\"Strumenti\"},\"toolbars\":\"Editor toolbar\"},\"elementspath\":{\"eleLabel\":\"Percorso degli elementi\",\"eleTitle\":\"%1 elemento\"},\"find\":{\"find\":\"Trova\",\"findOptions\":\"Opzioni di ricerca\",\"findWhat\":\"Trova:\",\"matchCase\":\"Maiuscole/minuscole\",\"matchCyclic\":\"Ricerca ciclica\",\"matchWord\":\"Solo parole intere\",\"notFoundMsg\":\"L'elemento cercato non è stato trovato.\",\"replace\":\"Sostituisci\",\"replaceAll\":\"Sostituisci tutto\",\"replaceSuccessMsg\":\"%1 occorrenza(e) sostituite.\",\"replaceWith\":\"Sostituisci con:\",\"title\":\"Cerca e Sostituisci\"},\"fakeobjects\":{\"anchor\":\"Ancora\",\"flash\":\"Animazione Flash\",\"hiddenfield\":\"Campo Nascosto\",\"iframe\":\"IFrame\",\"unknown\":\"Oggetto sconosciuto\"},\"flash\":{\"access\":\"Accesso Script\",\"accessAlways\":\"Sempre\",\"accessNever\":\"Mai\",\"accessSameDomain\":\"Solo stesso dominio\",\"alignAbsBottom\":\"In basso assoluto\",\"alignAbsMiddle\":\"Centrato assoluto\",\"alignBaseline\":\"Linea base\",\"alignTextTop\":\"In alto al testo\",\"bgcolor\":\"Colore sfondo\",\"chkFull\":\"Permetti la modalità tutto schermo\",\"chkLoop\":\"Riavvio automatico\",\"chkMenu\":\"Abilita Menu di Flash\",\"chkPlay\":\"Avvio Automatico\",\"flashvars\":\"Variabili per Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Proprietà Oggetto Flash\",\"propertiesTab\":\"Proprietà\",\"quality\":\"Qualità\",\"qualityAutoHigh\":\"Alta Automatica\",\"qualityAutoLow\":\"Bassa Automatica\",\"qualityBest\":\"Massima\",\"qualityHigh\":\"Alta\",\"qualityLow\":\"Bassa\",\"qualityMedium\":\"Intermedia\",\"scale\":\"Ridimensiona\",\"scaleAll\":\"Mostra Tutto\",\"scaleFit\":\"Dimensione Esatta\",\"scaleNoBorder\":\"Senza Bordo\",\"title\":\"Proprietà Oggetto Flash\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"L'HSpace dev'essere un numero.\",\"validateSrc\":\"Devi inserire l'URL del collegamento\",\"validateVSpace\":\"Il VSpace dev'essere un numero.\",\"windowMode\":\"Modalità finestra\",\"windowModeOpaque\":\"Opaca\",\"windowModeTransparent\":\"Trasparente\",\"windowModeWindow\":\"Finestra\"},\"font\":{\"fontSize\":{\"label\":\"Dimensione\",\"voiceLabel\":\"Dimensione Carattere\",\"panelTitle\":\"Dimensione\"},\"label\":\"Carattere\",\"panelTitle\":\"Carattere\",\"voiceLabel\":\"Carattere\"},\"forms\":{\"button\":{\"title\":\"Proprietà bottone\",\"text\":\"Testo (Valore)\",\"type\":\"Tipo\",\"typeBtn\":\"Bottone\",\"typeSbm\":\"Invio\",\"typeRst\":\"Annulla\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Proprietà checkbox\",\"radioTitle\":\"Proprietà radio button\",\"value\":\"Valore\",\"selected\":\"Selezionato\",\"required\":\"Richiesto\"},\"form\":{\"title\":\"Proprietà modulo\",\"menu\":\"Proprietà modulo\",\"action\":\"Azione\",\"method\":\"Metodo\",\"encoding\":\"Codifica\"},\"hidden\":{\"title\":\"Proprietà campo nascosto\",\"name\":\"Nome\",\"value\":\"Valore\"},\"select\":{\"title\":\"Proprietà menu di selezione\",\"selectInfo\":\"Info\",\"opAvail\":\"Opzioni disponibili\",\"value\":\"Valore\",\"size\":\"Dimensione\",\"lines\":\"righe\",\"chkMulti\":\"Permetti selezione multipla\",\"required\":\"Richiesto\",\"opText\":\"Testo\",\"opValue\":\"Valore\",\"btnAdd\":\"Aggiungi\",\"btnModify\":\"Modifica\",\"btnUp\":\"Su\",\"btnDown\":\"Gi\",\"btnSetValue\":\"Imposta come predefinito\",\"btnDelete\":\"Rimuovi\"},\"textarea\":{\"title\":\"Proprietà area di testo\",\"cols\":\"Colonne\",\"rows\":\"Righe\"},\"textfield\":{\"title\":\"Proprietà campo di testo\",\"name\":\"Nome\",\"value\":\"Valore\",\"charWidth\":\"Larghezza\",\"maxChars\":\"Numero massimo di caratteri\",\"required\":\"Richiesto\",\"type\":\"Tipo\",\"typeText\":\"Testo\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Cerca\",\"typeTel\":\"Numero di telefono\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formato\",\"panelTitle\":\"Formato\",\"tag_address\":\"Indirizzo\",\"tag_div\":\"Paragrafo (DIV)\",\"tag_h1\":\"Titolo 1\",\"tag_h2\":\"Titolo 2\",\"tag_h3\":\"Titolo 3\",\"tag_h4\":\"Titolo 4\",\"tag_h5\":\"Titolo 5\",\"tag_h6\":\"Titolo 6\",\"tag_p\":\"Normale\",\"tag_pre\":\"Formattato\"},\"horizontalrule\":{\"toolbar\":\"Inserisci riga orizzontale\"},\"iframe\":{\"border\":\"Mostra il bordo\",\"noUrl\":\"Inserire l'URL del campo IFrame\",\"scrolling\":\"Abilita scrollbar\",\"title\":\"Proprietà IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Testo alternativo\",\"border\":\"Bordo\",\"btnUpload\":\"Invia al server\",\"button2Img\":\"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Vuoi trasferomare l'immagine selezionata in un bottone immagine?\",\"infoTab\":\"Informazioni immagine\",\"linkTab\":\"Collegamento\",\"lockRatio\":\"Blocca rapporto\",\"menu\":\"Proprietà immagine\",\"resetSize\":\"Reimposta dimensione\",\"title\":\"Proprietà immagine\",\"titleButton\":\"Proprietà bottone immagine\",\"upload\":\"Carica\",\"urlMissing\":\"Manca l'URL dell'immagine.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Il campo Bordo deve essere un numero intero.\",\"validateHSpace\":\"Il campo HSpace deve essere un numero intero.\",\"validateVSpace\":\"Il campo VSpace deve essere un numero intero.\"},\"indent\":{\"indent\":\"Aumenta rientro\",\"outdent\":\"Riduci rientro\"},\"smiley\":{\"options\":\"Opzioni Smiley\",\"title\":\"Inserisci emoticon\",\"toolbar\":\"Emoticon\"},\"justify\":{\"block\":\"Giustifica\",\"center\":\"Centra\",\"left\":\"Allinea a sinistra\",\"right\":\"Allinea a destra\"},\"language\":{\"button\":\"Imposta lingua\",\"remove\":\"Rimuovi lingua\"},\"link\":{\"acccessKey\":\"Scorciatoia da tastiera\",\"advanced\":\"Avanzate\",\"advisoryContentType\":\"Tipo della risorsa collegata\",\"advisoryTitle\":\"Titolo\",\"anchor\":{\"toolbar\":\"Inserisci/Modifica Ancora\",\"menu\":\"Proprietà ancora\",\"title\":\"Proprietà ancora\",\"name\":\"Nome ancora\",\"errorName\":\"Inserici il nome dell'ancora\",\"remove\":\"Rimuovi l'ancora\"},\"anchorId\":\"Per id elemento\",\"anchorName\":\"Per Nome\",\"charset\":\"Set di caretteri della risorsa collegata\",\"cssClasses\":\"Nome classe CSS\",\"emailAddress\":\"Indirizzo E-Mail\",\"emailBody\":\"Corpo del messaggio\",\"emailSubject\":\"Oggetto del messaggio\",\"id\":\"Id\",\"info\":\"Informazioni collegamento\",\"langCode\":\"Direzione scrittura\",\"langDir\":\"Direzione scrittura\",\"langDirLTR\":\"Da Sinistra a Destra (LTR)\",\"langDirRTL\":\"Da Destra a Sinistra (RTL)\",\"menu\":\"Modifica collegamento\",\"name\":\"Nome\",\"noAnchors\":\"(Nessuna ancora disponibile nel documento)\",\"noEmail\":\"Devi inserire un'indirizzo e-mail\",\"noUrl\":\"Devi inserire l'URL del collegamento\",\"other\":\"<altro>\",\"popupDependent\":\"Dipendente (Netscape)\",\"popupFeatures\":\"Caratteristiche finestra popup\",\"popupFullScreen\":\"A tutto schermo (IE)\",\"popupLeft\":\"Posizione da sinistra\",\"popupLocationBar\":\"Barra degli indirizzi\",\"popupMenuBar\":\"Barra del menu\",\"popupResizable\":\"Ridimensionabile\",\"popupScrollBars\":\"Barre di scorrimento\",\"popupStatusBar\":\"Barra di stato\",\"popupToolbar\":\"Barra degli strumenti\",\"popupTop\":\"Posizione dall'alto\",\"rel\":\"Relazioni\",\"selectAnchor\":\"Scegli Ancora\",\"styles\":\"Stile\",\"tabIndex\":\"Ordine di tabulazione\",\"target\":\"Destinazione\",\"targetFrame\":\"<riquadro>\",\"targetFrameName\":\"Nome del riquadro di destinazione\",\"targetPopup\":\"<finestra popup>\",\"targetPopupName\":\"Nome finestra popup\",\"title\":\"Collegamento\",\"toAnchor\":\"Ancora nel testo\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Collegamento\",\"type\":\"Tipo di Collegamento\",\"unlink\":\"Elimina collegamento\",\"upload\":\"Carica\"},\"list\":{\"bulletedlist\":\"Inserisci/Rimuovi Elenco Puntato\",\"numberedlist\":\"Inserisci/Rimuovi Elenco Numerato\"},\"liststyle\":{\"armenian\":\"Numerazione Armena\",\"bulletedTitle\":\"Proprietà liste puntate\",\"circle\":\"Cerchio\",\"decimal\":\"Decimale (1, 2, 3, ecc.)\",\"decimalLeadingZero\":\"Decimale preceduto da 0 (01, 02, 03, ecc.)\",\"disc\":\"Disco\",\"georgian\":\"Numerazione Georgiana (an, ban, gan, ecc.)\",\"lowerAlpha\":\"Alfabetico minuscolo (a, b, c, d, e, ecc.)\",\"lowerGreek\":\"Greco minuscolo (alpha, beta, gamma, ecc.)\",\"lowerRoman\":\"Numerazione Romana minuscola (i, ii, iii, iv, v, ecc.)\",\"none\":\"Nessuno\",\"notset\":\"<non impostato>\",\"numberedTitle\":\"Proprietà liste numerate\",\"square\":\"Quadrato\",\"start\":\"Inizio\",\"type\":\"Tipo\",\"upperAlpha\":\"Alfabetico maiuscolo (A, B, C, D, E, ecc.)\",\"upperRoman\":\"Numerazione Romana maiuscola (I, II, III, IV, V, ecc.)\",\"validateStartNumber\":\"Il numero di inizio di una lista numerata deve essere un numero intero.\"},\"magicline\":{\"title\":\"Inserisci paragrafo qui\"},\"maximize\":{\"maximize\":\"Massimizza\",\"minimize\":\"Minimizza\"},\"newpage\":{\"toolbar\":\"Nuova pagina\"},\"pagebreak\":{\"alt\":\"Interruzione di pagina\",\"toolbar\":\"Inserisci interruzione di pagina per la stampa\"},\"pastetext\":{\"button\":\"Incolla come testo semplice\",\"title\":\"Incolla come testo semplice\"},\"pastefromword\":{\"confirmCleanup\":\"Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?\",\"error\":\"Non è stato possibile eliminare il testo incollato a causa di un errore interno.\",\"title\":\"Incolla da Word\",\"toolbar\":\"Incolla da Word\"},\"preview\":{\"preview\":\"Anteprima\"},\"print\":{\"toolbar\":\"Stampa\"},\"removeformat\":{\"toolbar\":\"Elimina formattazione\"},\"save\":{\"toolbar\":\"Salva\"},\"selectall\":{\"toolbar\":\"Seleziona tutto\"},\"showblocks\":{\"toolbar\":\"Visualizza Blocchi\"},\"sourcearea\":{\"toolbar\":\"Sorgente\"},\"specialchar\":{\"options\":\"Opzioni carattere speciale\",\"title\":\"Seleziona carattere speciale\",\"toolbar\":\"Inserisci carattere speciale\"},\"scayt\":{\"btn_about\":\"About COMS\",\"btn_dictionaries\":\"Dizionari\",\"btn_disable\":\"Disabilita COMS\",\"btn_enable\":\"Abilita COMS\",\"btn_langs\":\"Lingue\",\"btn_options\":\"Opzioni\",\"text_title\":\"Controllo Ortografico Mentre Scrivi\"},\"stylescombo\":{\"label\":\"Stili\",\"panelTitle\":\"Stili di formattazione\",\"panelTitle1\":\"Stili per blocchi\",\"panelTitle2\":\"Stili in linea\",\"panelTitle3\":\"Stili per oggetti\"},\"table\":{\"border\":\"Dimensione bordo\",\"caption\":\"Intestazione\",\"cell\":{\"menu\":\"Cella\",\"insertBefore\":\"Inserisci Cella Prima\",\"insertAfter\":\"Inserisci Cella Dopo\",\"deleteCell\":\"Elimina celle\",\"merge\":\"Unisce celle\",\"mergeRight\":\"Unisci a Destra\",\"mergeDown\":\"Unisci in Basso\",\"splitHorizontal\":\"Dividi Cella Orizzontalmente\",\"splitVertical\":\"Dividi Cella Verticalmente\",\"title\":\"Proprietà della cella\",\"cellType\":\"Tipo di cella\",\"rowSpan\":\"Su più righe\",\"colSpan\":\"Su più colonne\",\"wordWrap\":\"Ritorno a capo\",\"hAlign\":\"Allineamento orizzontale\",\"vAlign\":\"Allineamento verticale\",\"alignBaseline\":\"Linea Base\",\"bgColor\":\"Colore di Sfondo\",\"borderColor\":\"Colore del Bordo\",\"data\":\"Dati\",\"header\":\"Intestazione\",\"yes\":\"Si\",\"no\":\"No\",\"invalidWidth\":\"La larghezza della cella dev'essere un numero.\",\"invalidHeight\":\"L'altezza della cella dev'essere un numero.\",\"invalidRowSpan\":\"Il numero di righe dev'essere un numero intero.\",\"invalidColSpan\":\"Il numero di colonne dev'essere un numero intero.\",\"chooseColor\":\"Scegli\"},\"cellPad\":\"Padding celle\",\"cellSpace\":\"Spaziatura celle\",\"column\":{\"menu\":\"Colonna\",\"insertBefore\":\"Inserisci Colonna Prima\",\"insertAfter\":\"Inserisci Colonna Dopo\",\"deleteColumn\":\"Elimina colonne\"},\"columns\":\"Colonne\",\"deleteTable\":\"Cancella Tabella\",\"headers\":\"Intestazione\",\"headersBoth\":\"Entrambe\",\"headersColumn\":\"Prima Colonna\",\"headersNone\":\"Nessuna\",\"headersRow\":\"Prima Riga\",\"invalidBorder\":\"La dimensione del bordo dev'essere un numero.\",\"invalidCellPadding\":\"Il paging delle celle dev'essere un numero\",\"invalidCellSpacing\":\"La spaziatura tra le celle dev'essere un numero.\",\"invalidCols\":\"Il numero di colonne dev'essere un numero maggiore di 0.\",\"invalidHeight\":\"L'altezza della tabella dev'essere un numero.\",\"invalidRows\":\"Il numero di righe dev'essere un numero maggiore di 0.\",\"invalidWidth\":\"La larghezza della tabella dev'essere un numero.\",\"menu\":\"Proprietà tabella\",\"row\":{\"menu\":\"Riga\",\"insertBefore\":\"Inserisci Riga Prima\",\"insertAfter\":\"Inserisci Riga Dopo\",\"deleteRow\":\"Elimina righe\"},\"rows\":\"Righe\",\"summary\":\"Indice\",\"title\":\"Proprietà tabella\",\"toolbar\":\"Tabella\",\"widthPc\":\"percento\",\"widthPx\":\"pixel\",\"widthUnit\":\"unità larghezza\"},\"undo\":{\"redo\":\"Ripristina\",\"undo\":\"Annulla\"},\"wsc\":{\"btnIgnore\":\"Ignora\",\"btnIgnoreAll\":\"Ignora tutto\",\"btnReplace\":\"Cambia\",\"btnReplaceAll\":\"Cambia tutto\",\"btnUndo\":\"Annulla\",\"changeTo\":\"Cambia in\",\"errorLoading\":\"Errore nel caricamento dell'host col servizio applicativo: %s.\",\"ieSpellDownload\":\"Contollo ortografico non installato. Lo vuoi scaricare ora?\",\"manyChanges\":\"Controllo ortografico completato: %1 parole cambiate\",\"noChanges\":\"Controllo ortografico completato: nessuna parola cambiata\",\"noMispell\":\"Controllo ortografico completato: nessun errore trovato\",\"noSuggestions\":\"- Nessun suggerimento -\",\"notAvailable\":\"Il servizio non è momentaneamente disponibile.\",\"notInDic\":\"Non nel dizionario\",\"oneChange\":\"Controllo ortografico completato: 1 parola cambiata\",\"progress\":\"Controllo ortografico in corso\",\"title\":\"Controllo ortografico\",\"toolbar\":\"Correttore ortografico\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ja.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ja']={\"editor\":\"リッチテキストエディタ\",\"editorPanel\":\"リッチテキストエディタパネル\",\"common\":{\"editorHelp\":\"ヘルプは ALT 0 を押してください\",\"browseServer\":\"サーバブラウザ\",\"url\":\"URL\",\"protocol\":\"プロトコル\",\"upload\":\"アップロード\",\"uploadSubmit\":\"サーバーに送信\",\"image\":\"イメージ\",\"flash\":\"Flash\",\"form\":\"フォーム\",\"checkbox\":\"チェックボックス\",\"radio\":\"ラジオボタン\",\"textField\":\"１行テキスト\",\"textarea\":\"テキストエリア\",\"hiddenField\":\"不可視フィールド\",\"button\":\"ボタン\",\"select\":\"選択フィールド\",\"imageButton\":\"画像ボタン\",\"notSet\":\"<なし>\",\"id\":\"Id\",\"name\":\"Name属性\",\"langDir\":\"文字表記の方向\",\"langDirLtr\":\"左から右 (LTR)\",\"langDirRtl\":\"右から左 (RTL)\",\"langCode\":\"言語コード\",\"longDescr\":\"longdesc属性(長文説明)\",\"cssClass\":\"スタイルシートクラス\",\"advisoryTitle\":\"Title属性\",\"cssStyle\":\"スタイルシート\",\"ok\":\"OK\",\"cancel\":\"キャンセル\",\"close\":\"閉じる\",\"preview\":\"プレビュー\",\"resize\":\"ドラッグしてリサイズ\",\"generalTab\":\"全般\",\"advancedTab\":\"高度な設定\",\"validateNumberFailed\":\"値が数ではありません\",\"confirmNewPage\":\"変更内容を保存せず、 新しいページを開いてもよろしいでしょうか？\",\"confirmCancel\":\"オプション設定を変更しました。ダイアログを閉じてもよろしいでしょうか？\",\"options\":\"オプション\",\"target\":\"ターゲット\",\"targetNew\":\"新しいウインドウ (_blank)\",\"targetTop\":\"最上部ウィンドウ (_top)\",\"targetSelf\":\"同じウィンドウ (_self)\",\"targetParent\":\"親ウィンドウ (_parent)\",\"langDirLTR\":\"左から右 (LTR)\",\"langDirRTL\":\"右から左 (RTL)\",\"styles\":\"スタイル\",\"cssClasses\":\"スタイルシートクラス\",\"width\":\"幅\",\"height\":\"高さ\",\"align\":\"行揃え\",\"alignLeft\":\"左\",\"alignRight\":\"右\",\"alignCenter\":\"中央\",\"alignJustify\":\"両端揃え\",\"alignTop\":\"上\",\"alignMiddle\":\"中央\",\"alignBottom\":\"下\",\"alignNone\":\"なし\",\"invalidValue\":\"不正な値です。\",\"invalidHeight\":\"高さは数値で入力してください。\",\"invalidWidth\":\"幅は数値で入力してください。\",\"invalidCssLength\":\"入力された \\\"%1\\\" 項目の値は、CSSの大きさ(px, %, in, cm, mm, em, ex, pt, または pc)が正しいものである/ないに関わらず、正の値である必要があります。\",\"invalidHtmlLength\":\"入力された \\\"%1\\\" 項目の値は、HTMLの大きさ(px または %)が正しいものである/ないに関わらず、正の値である必要があります。\",\"invalidInlineStyle\":\"入力されたインラインスタイルの値は、\\\"名前 : 値\\\" のフォーマットのセットで、複数の場合はセミコロンで区切られている形式である必要があります。\",\"cssLengthTooltip\":\"ピクセル数もしくはCSSにセットできる数値を入力してください。(px,%,in,cm,mm,em,ex,pt,or pc)\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, 利用不可能</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"CKEditorについて\",\"help\":\"$1 のヘルプを見てください。\",\"moreInfo\":\"ライセンス情報の詳細はウェブサイトにて確認してください:\",\"title\":\"CKEditorについて\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"太字\",\"italic\":\"斜体\",\"strike\":\"打ち消し線\",\"subscript\":\"下付き\",\"superscript\":\"上付き\",\"underline\":\"下線\"},\"bidi\":{\"ltr\":\"テキストの向き : 左から右へ\",\"rtl\":\"テキストの向き : 右から左へ\"},\"blockquote\":{\"toolbar\":\"ブロック引用文\"},\"clipboard\":{\"copy\":\"コピー\",\"copyError\":\"ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。\",\"cut\":\"切り取り\",\"cutError\":\"ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。\",\"paste\":\"貼り付け\",\"pasteArea\":\"貼り付け場所\",\"pasteMsg\":\"キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用して、次の入力エリア内で貼り付けて、<STRONG>OK</STRONG>を押してください。\",\"securityMsg\":\"ブラウザのセキュリティ設定により、エディタはクリップボードデータに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。\",\"title\":\"貼り付け\"},\"button\":{\"selectedLabel\":\"%1 (選択中)\"},\"colorbutton\":{\"auto\":\"自動\",\"bgColorTitle\":\"背景色\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"その他の色...\",\"panelTitle\":\"色\",\"textColorTitle\":\"文字色\"},\"colordialog\":{\"clear\":\"クリア\",\"highlight\":\"ハイライト\",\"options\":\"カラーオプション\",\"selected\":\"選択された色\",\"title\":\"色選択\"},\"templates\":{\"button\":\"テンプレート\",\"emptyListMsg\":\"(テンプレートが定義されていません)\",\"insertOption\":\"現在のエディタの内容と置き換えます\",\"options\":\"テンプレートオプション\",\"selectPromptMsg\":\"エディターで使用するテンプレートを選択してください。<br>(現在のエディタの内容は失われます):\",\"title\":\"内容テンプレート\"},\"contextmenu\":{\"options\":\"コンテキストメニューオプション\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Title属性\",\"cssClassInputLabel\":\"スタイルシートクラス\",\"edit\":\"Divコンテナを編集\",\"inlineStyleInputLabel\":\"インラインスタイル\",\"langDirLTRLabel\":\"左から右 (LTR)\",\"langDirLabel\":\"文字表記の方向\",\"langDirRTLLabel\":\"右から左 (RTL)\",\"languageCodeInputLabel\":\" 言語コード\",\"remove\":\"Divコンテナを削除\",\"styleSelectLabel\":\"スタイル\",\"title\":\"Divコンテナ\",\"toolbar\":\"Divコンテナ\"},\"toolbar\":{\"toolbarCollapse\":\"ツールバーを閉じる\",\"toolbarExpand\":\"ツールバーを開く\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"編集ツールバー\"},\"elementspath\":{\"eleLabel\":\"要素パス\",\"eleTitle\":\"%1 要素\"},\"find\":{\"find\":\"検索\",\"findOptions\":\"検索オプション\",\"findWhat\":\"検索する文字列:\",\"matchCase\":\"大文字と小文字を区別する\",\"matchCyclic\":\"末尾に逹したら先頭に戻る\",\"matchWord\":\"単語単位で探す\",\"notFoundMsg\":\"指定された文字列は見つかりませんでした。\",\"replace\":\"置換\",\"replaceAll\":\"すべて置換\",\"replaceSuccessMsg\":\"%1 個置換しました。\",\"replaceWith\":\"置換後の文字列:\",\"title\":\"検索と置換\"},\"fakeobjects\":{\"anchor\":\"アンカー\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"不可視フィールド\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"スクリプトアクセス(AllowScriptAccess)\",\"accessAlways\":\"すべての場合に通信可能(Always)\",\"accessNever\":\"すべての場合に通信不可能(Never)\",\"accessSameDomain\":\"同一ドメインのみに通信可能(Same domain)\",\"alignAbsBottom\":\"下部(絶対的)\",\"alignAbsMiddle\":\"中央(絶対的)\",\"alignBaseline\":\"ベースライン\",\"alignTextTop\":\"テキスト上部\",\"bgcolor\":\"背景色\",\"chkFull\":\"フルスクリーン許可\",\"chkLoop\":\"ループ再生\",\"chkMenu\":\"Flashメニュー可能\",\"chkPlay\":\"再生\",\"flashvars\":\"フラッシュに渡す変数(FlashVars)\",\"hSpace\":\"横間隔\",\"properties\":\"Flash プロパティ\",\"propertiesTab\":\"プロパティ\",\"quality\":\"画質\",\"qualityAutoHigh\":\"自動/高\",\"qualityAutoLow\":\"自動/低\",\"qualityBest\":\"品質優先\",\"qualityHigh\":\"高\",\"qualityLow\":\"低\",\"qualityMedium\":\"中\",\"scale\":\"拡大縮小設定\",\"scaleAll\":\"すべて表示\",\"scaleFit\":\"上下左右にフィット\",\"scaleNoBorder\":\"外が見えない様に拡大\",\"title\":\"Flash プロパティ\",\"vSpace\":\"縦間隔\",\"validateHSpace\":\"横間隔は数値で入力してください。\",\"validateSrc\":\"リンクURLを入力してください。\",\"validateVSpace\":\"縦間隔は数値で入力してください。\",\"windowMode\":\"ウィンドウモード\",\"windowModeOpaque\":\"背景を不透明設定\",\"windowModeTransparent\":\"背景を透過設定\",\"windowModeWindow\":\"標準\"},\"font\":{\"fontSize\":{\"label\":\"サイズ\",\"voiceLabel\":\"フォントサイズ\",\"panelTitle\":\"フォントサイズ\"},\"label\":\"フォント\",\"panelTitle\":\"フォント\",\"voiceLabel\":\"フォント\"},\"forms\":{\"button\":{\"title\":\"ボタン プロパティ\",\"text\":\"テキスト (値)\",\"type\":\"タイプ\",\"typeBtn\":\"ボタン\",\"typeSbm\":\"送信\",\"typeRst\":\"リセット\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"チェックボックスのプロパティ\",\"radioTitle\":\"ラジオボタンのプロパティ\",\"value\":\"値\",\"selected\":\"選択済み\",\"required\":\"Required\"},\"form\":{\"title\":\"フォームのプロパティ\",\"menu\":\"フォームのプロパティ\",\"action\":\"アクション (action)\",\"method\":\"メソッド (method)\",\"encoding\":\"エンコード方式 (encoding)\"},\"hidden\":{\"title\":\"不可視フィールド プロパティ\",\"name\":\"名前 (name)\",\"value\":\"値 (value)\"},\"select\":{\"title\":\"選択フィールドのプロパティ\",\"selectInfo\":\"情報\",\"opAvail\":\"利用可能なオプション\",\"value\":\"選択項目値\",\"size\":\"サイズ\",\"lines\":\"行\",\"chkMulti\":\"複数選択を許可\",\"required\":\"Required\",\"opText\":\"選択項目名\",\"opValue\":\"値\",\"btnAdd\":\"追加\",\"btnModify\":\"編集\",\"btnUp\":\"上へ\",\"btnDown\":\"下へ\",\"btnSetValue\":\"選択した値を設定\",\"btnDelete\":\"削除\"},\"textarea\":{\"title\":\"テキストエリア プロパティ\",\"cols\":\"列\",\"rows\":\"行\"},\"textfield\":{\"title\":\"１行テキスト プロパティ\",\"name\":\"名前\",\"value\":\"値\",\"charWidth\":\"サイズ\",\"maxChars\":\"最大長\",\"required\":\"Required\",\"type\":\"タイプ\",\"typeText\":\"テキスト\",\"typePass\":\"パスワード入力\",\"typeEmail\":\"メール\",\"typeSearch\":\"検索\",\"typeTel\":\"電話番号\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"書式\",\"panelTitle\":\"段落の書式\",\"tag_address\":\"アドレス\",\"tag_div\":\"標準 (DIV)\",\"tag_h1\":\"見出し 1\",\"tag_h2\":\"見出し 2\",\"tag_h3\":\"見出し 3\",\"tag_h4\":\"見出し 4\",\"tag_h5\":\"見出し 5\",\"tag_h6\":\"見出し 6\",\"tag_p\":\"標準\",\"tag_pre\":\"書式付き\"},\"horizontalrule\":{\"toolbar\":\"水平線\"},\"iframe\":{\"border\":\"フレームの枠を表示\",\"noUrl\":\"iframeのURLを入力してください。\",\"scrolling\":\"スクロールバーの表示を許可\",\"title\":\"iFrameのプロパティ\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"代替テキスト\",\"border\":\"枠線の幅\",\"btnUpload\":\"サーバーに送信\",\"button2Img\":\"選択した画像ボタンを画像に変換しますか？\",\"hSpace\":\"水平間隔\",\"img2Button\":\"選択した画像を画像ボタンに変換しますか？\",\"infoTab\":\"画像情報\",\"linkTab\":\"リンク\",\"lockRatio\":\"比率を固定\",\"menu\":\"画像のプロパティ\",\"resetSize\":\"サイズをリセット\",\"title\":\"画像のプロパティ\",\"titleButton\":\"画像ボタンのプロパティ\",\"upload\":\"アップロード\",\"urlMissing\":\"画像のURLを入力してください。\",\"vSpace\":\"垂直間隔\",\"validateBorder\":\"枠線の幅は数値で入力してください。\",\"validateHSpace\":\"水平間隔は数値で入力してください。\",\"validateVSpace\":\"垂直間隔は数値で入力してください。\"},\"indent\":{\"indent\":\"インデント\",\"outdent\":\"インデント解除\"},\"smiley\":{\"options\":\"絵文字オプション\",\"title\":\"顔文字挿入\",\"toolbar\":\"絵文字\"},\"justify\":{\"block\":\"両端揃え\",\"center\":\"中央揃え\",\"left\":\"左揃え\",\"right\":\"右揃え\"},\"language\":{\"button\":\"言語を設定\",\"remove\":\"言語を削除\"},\"link\":{\"acccessKey\":\"アクセスキー\",\"advanced\":\"高度な設定\",\"advisoryContentType\":\"Content Type属性\",\"advisoryTitle\":\"Title属性\",\"anchor\":{\"toolbar\":\"アンカー挿入/編集\",\"menu\":\"アンカーの編集\",\"title\":\"アンカーのプロパティ\",\"name\":\"アンカー名\",\"errorName\":\"アンカー名を入力してください。\",\"remove\":\"アンカーを削除\"},\"anchorId\":\"エレメントID\",\"anchorName\":\"アンカー名\",\"charset\":\"リンク先のcharset\",\"cssClasses\":\"スタイルシートクラス\",\"emailAddress\":\"E-Mail アドレス\",\"emailBody\":\"本文\",\"emailSubject\":\"件名\",\"id\":\"Id\",\"info\":\"ハイパーリンク情報\",\"langCode\":\"言語コード\",\"langDir\":\"文字表記の方向\",\"langDirLTR\":\"左から右 (LTR)\",\"langDirRTL\":\"右から左 (RTL)\",\"menu\":\"リンクを編集\",\"name\":\"Name属性\",\"noAnchors\":\"(このドキュメント内にアンカーはありません)\",\"noEmail\":\"メールアドレスを入力してください。\",\"noUrl\":\"リンクURLを入力してください。\",\"other\":\"<その他の>\",\"popupDependent\":\"開いたウィンドウに連動して閉じる (Netscape)\",\"popupFeatures\":\"ポップアップウィンドウ特徴\",\"popupFullScreen\":\"全画面モード(IE)\",\"popupLeft\":\"左端からの座標で指定\",\"popupLocationBar\":\"ロケーションバー\",\"popupMenuBar\":\"メニューバー\",\"popupResizable\":\"サイズ可変\",\"popupScrollBars\":\"スクロールバー\",\"popupStatusBar\":\"ステータスバー\",\"popupToolbar\":\"ツールバー\",\"popupTop\":\"上端からの座標で指定\",\"rel\":\"関連リンク\",\"selectAnchor\":\"アンカーを選択\",\"styles\":\"スタイルシート\",\"tabIndex\":\"タブインデックス\",\"target\":\"ターゲット\",\"targetFrame\":\"<フレーム>\",\"targetFrameName\":\"ターゲットのフレーム名\",\"targetPopup\":\"<ポップアップウィンドウ>\",\"targetPopupName\":\"ポップアップウィンドウ名\",\"title\":\"ハイパーリンク\",\"toAnchor\":\"ページ内のアンカー\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"リンク挿入/編集\",\"type\":\"リンクタイプ\",\"unlink\":\"リンクを削除\",\"upload\":\"アップロード\"},\"list\":{\"bulletedlist\":\"番号無しリスト\",\"numberedlist\":\"番号付きリスト\"},\"liststyle\":{\"armenian\":\"アルメニア数字\",\"bulletedTitle\":\"箇条書きのプロパティ\",\"circle\":\"白丸\",\"decimal\":\"数字 (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"0付きの数字 (01, 02, 03, etc.)\",\"disc\":\"黒丸\",\"georgian\":\"グルジア数字 (an, ban, gan, etc.)\",\"lowerAlpha\":\"小文字アルファベット (a, b, c, d, e, etc.)\",\"lowerGreek\":\"小文字ギリシャ文字 (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"小文字ローマ数字 (i, ii, iii, iv, v, etc.)\",\"none\":\"なし\",\"notset\":\"<なし>\",\"numberedTitle\":\"番号付きリストのプロパティ\",\"square\":\"四角\",\"start\":\"開始\",\"type\":\"種類\",\"upperAlpha\":\"大文字アルファベット (A, B, C, D, E, etc.)\",\"upperRoman\":\"大文字ローマ数字 (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"リストの開始番号は数値で入力してください。\"},\"magicline\":{\"title\":\"ここに段落を挿入\"},\"maximize\":{\"maximize\":\"最大化\",\"minimize\":\"最小化\"},\"newpage\":{\"toolbar\":\"新しいページ\"},\"pagebreak\":{\"alt\":\"改ページ\",\"toolbar\":\"印刷の為に改ページ挿入\"},\"pastetext\":{\"button\":\"プレーンテキストとして貼り付け\",\"title\":\"プレーンテキストとして貼り付け\"},\"pastefromword\":{\"confirmCleanup\":\"貼り付けを行うテキストはワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか？\",\"error\":\"内部エラーにより貼り付けたデータをクリアできませんでした\",\"title\":\"ワード文章から貼り付け\",\"toolbar\":\"ワード文章から貼り付け\"},\"preview\":{\"preview\":\"プレビュー\"},\"print\":{\"toolbar\":\"印刷\"},\"removeformat\":{\"toolbar\":\"書式を解除\"},\"save\":{\"toolbar\":\"保存\"},\"selectall\":{\"toolbar\":\"すべて選択\"},\"showblocks\":{\"toolbar\":\"ブロック表示\"},\"sourcearea\":{\"toolbar\":\"ソース\"},\"specialchar\":{\"options\":\"特殊文字オプション\",\"title\":\"特殊文字の選択\",\"toolbar\":\"特殊文字を挿入\"},\"scayt\":{\"btn_about\":\"SCAYTﾊﾞｰｼﾞｮﾝ\",\"btn_dictionaries\":\"辞書\",\"btn_disable\":\"SCAYT無効\",\"btn_enable\":\"SCAYT有効\",\"btn_langs\":\"言語\",\"btn_options\":\"オプション\",\"text_title\":\"スペルチェック設定(SCAYT)\"},\"stylescombo\":{\"label\":\"スタイル\",\"panelTitle\":\"スタイル\",\"panelTitle1\":\"ブロックスタイル\",\"panelTitle2\":\"インラインスタイル\",\"panelTitle3\":\"オブジェクトスタイル\"},\"table\":{\"border\":\"枠線の幅\",\"caption\":\"キャプション\",\"cell\":{\"menu\":\"セル\",\"insertBefore\":\"セルを前に挿入\",\"insertAfter\":\"セルを後に挿入\",\"deleteCell\":\"セルを削除\",\"merge\":\"セルを結合\",\"mergeRight\":\"右に結合\",\"mergeDown\":\"下に結合\",\"splitHorizontal\":\"セルを水平方向に分割\",\"splitVertical\":\"セルを垂直方向に分割\",\"title\":\"セルのプロパティ\",\"cellType\":\"セルの種類\",\"rowSpan\":\"行の結合数\",\"colSpan\":\"列の結合数\",\"wordWrap\":\"単語の折り返し\",\"hAlign\":\"水平方向の配置\",\"vAlign\":\"垂直方向の配置\",\"alignBaseline\":\"ベースライン\",\"bgColor\":\"背景色\",\"borderColor\":\"ボーダーカラー\",\"data\":\"テーブルデータ (td)\",\"header\":\"ヘッダ\",\"yes\":\"はい\",\"no\":\"いいえ\",\"invalidWidth\":\"セル幅は数値で入力してください。\",\"invalidHeight\":\"セル高さは数値で入力してください。\",\"invalidRowSpan\":\"縦幅(行数)は数値で入力してください。\",\"invalidColSpan\":\"横幅(列数)は数値で入力してください。\",\"chooseColor\":\"色の選択\"},\"cellPad\":\"セル内間隔\",\"cellSpace\":\"セル内余白\",\"column\":{\"menu\":\"列\",\"insertBefore\":\"列を左に挿入\",\"insertAfter\":\"列を右に挿入\",\"deleteColumn\":\"列を削除\"},\"columns\":\"列数\",\"deleteTable\":\"表を削除\",\"headers\":\"ヘッダ (th)\",\"headersBoth\":\"両方\",\"headersColumn\":\"最初の列のみ\",\"headersNone\":\"なし\",\"headersRow\":\"最初の行のみ\",\"invalidBorder\":\"枠線の幅は数値で入力してください。\",\"invalidCellPadding\":\"セル内余白は数値で入力してください。\",\"invalidCellSpacing\":\"セル間余白は数値で入力してください。\",\"invalidCols\":\"列数は0より大きな数値を入力してください。\",\"invalidHeight\":\"高さは数値で入力してください。\",\"invalidRows\":\"行数は0より大きな数値を入力してください。\",\"invalidWidth\":\"幅は数値で入力してください。\",\"menu\":\"表のプロパティ\",\"row\":{\"menu\":\"行\",\"insertBefore\":\"行を上に挿入\",\"insertAfter\":\"行を下に挿入\",\"deleteRow\":\"行を削除\"},\"rows\":\"行数\",\"summary\":\"表の概要\",\"title\":\"表のプロパティ\",\"toolbar\":\"表\",\"widthPc\":\"パーセント\",\"widthPx\":\"ピクセル\",\"widthUnit\":\"幅の単位\"},\"undo\":{\"redo\":\"やり直す\",\"undo\":\"元に戻す\"},\"wsc\":{\"btnIgnore\":\"無視\",\"btnIgnoreAll\":\"すべて無視\",\"btnReplace\":\"置換\",\"btnReplaceAll\":\"すべて置換\",\"btnUndo\":\"やり直し\",\"changeTo\":\"変更\",\"errorLoading\":\"アプリケーションサービスホスト読込みエラー: %s.\",\"ieSpellDownload\":\"スペルチェッカーがインストールされていません。今すぐダウンロードしますか?\",\"manyChanges\":\"スペルチェック完了: %1 語句変更されました\",\"noChanges\":\"スペルチェック完了: 語句は変更されませんでした\",\"noMispell\":\"スペルチェック完了: スペルの誤りはありませんでした\",\"noSuggestions\":\"- 該当なし -\",\"notAvailable\":\"申し訳ありません、現在サービスを利用することができません\",\"notInDic\":\"辞書にありません\",\"oneChange\":\"スペルチェック完了: １語句変更されました\",\"progress\":\"スペルチェック処理中...\",\"title\":\"スペルチェック\",\"toolbar\":\"スペルチェック\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ka.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ka']={\"editor\":\"ტექსტის რედაქტორი\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"დააჭირეთ ALT 0-ს დახმარების მისაღებად\",\"browseServer\":\"სერვერზე დათვალიერება\",\"url\":\"URL\",\"protocol\":\"პროტოკოლი\",\"upload\":\"ატვირთვა\",\"uploadSubmit\":\"სერვერზე გაგზავნა\",\"image\":\"სურათი\",\"flash\":\"Flash\",\"form\":\"ფორმა\",\"checkbox\":\"მონიშვნის ღილაკი\",\"radio\":\"ამორჩევის ღილაკი\",\"textField\":\"ტექსტური ველი\",\"textarea\":\"ტექსტური არე\",\"hiddenField\":\"მალული ველი\",\"button\":\"ღილაკი\",\"select\":\"არჩევის ველი\",\"imageButton\":\"სურათიანი ღილაკი\",\"notSet\":\"<არაფერი>\",\"id\":\"Id\",\"name\":\"სახელი\",\"langDir\":\"ენის მიმართულება\",\"langDirLtr\":\"მარცხნიდან მარჯვნივ (LTR)\",\"langDirRtl\":\"მარჯვნიდან მარცხნივ (RTL)\",\"langCode\":\"ენის კოდი\",\"longDescr\":\"დიდი აღწერის URL\",\"cssClass\":\"CSS კლასი\",\"advisoryTitle\":\"სათაური\",\"cssStyle\":\"CSS სტილი\",\"ok\":\"დიახ\",\"cancel\":\"გაუქმება\",\"close\":\"დახურვა\",\"preview\":\"გადახედვა\",\"resize\":\"გაწიე ზომის შესაცვლელად\",\"generalTab\":\"ინფორმაცია\",\"advancedTab\":\"გაფართოებული\",\"validateNumberFailed\":\"ეს მნიშვნელობა არაა რიცხვი.\",\"confirmNewPage\":\"ამ დოკუმენტში ყველა ჩაუწერელი ცვლილება დაიკარგება. დარწმუნებული ხართ რომ ახალი გვერდის ჩატვირთვა გინდათ?\",\"confirmCancel\":\"ზოგიერთი პარამეტრი შეცვლილია, დარწმუნებულილ ხართ რომ ფანჯრის დახურვა გსურთ?\",\"options\":\"პარამეტრები\",\"target\":\"გახსნის ადგილი\",\"targetNew\":\"ახალი ფანჯარა (_blank)\",\"targetTop\":\"ზედა ფანჯარა (_top)\",\"targetSelf\":\"იგივე ფანჯარა (_self)\",\"targetParent\":\"მშობელი ფანჯარა (_parent)\",\"langDirLTR\":\"მარცხნიდან მარჯვნივ (LTR)\",\"langDirRTL\":\"მარჯვნიდან მარცხნივ (RTL)\",\"styles\":\"სტილი\",\"cssClasses\":\"CSS კლასი\",\"width\":\"სიგანე\",\"height\":\"სიმაღლე\",\"align\":\"სწორება\",\"alignLeft\":\"მარცხენა\",\"alignRight\":\"მარჯვენა\",\"alignCenter\":\"შუა\",\"alignJustify\":\"両端揃え\",\"alignTop\":\"ზემოთა\",\"alignMiddle\":\"შუა\",\"alignBottom\":\"ქვემოთა\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidWidth\":\"სიგანე რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, მიუწვდომელია</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. ყველა უფლება დაცულია.\",\"dlgTitle\":\"CKEditor-ის შესახებ\",\"help\":\"დახმარებისთვის იხილეთ $1.\",\"moreInfo\":\"ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:\",\"title\":\"CKEditor-ის შესახებ\",\"userGuide\":\"CKEditor-ის მომხმარებლის სახელმძღვანელო\"},\"basicstyles\":{\"bold\":\"მსხვილი\",\"italic\":\"დახრილი\",\"strike\":\"გადახაზული\",\"subscript\":\"ინდექსი\",\"superscript\":\"ხარისხი\",\"underline\":\"გახაზული\"},\"bidi\":{\"ltr\":\"ტექსტის მიმართულება მარცხნიდან მარჯვნივ\",\"rtl\":\"ტექსტის მიმართულება მარჯვნიდან მარცხნივ\"},\"blockquote\":{\"toolbar\":\"ციტატა\"},\"clipboard\":{\"copy\":\"ასლი\",\"copyError\":\"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).\",\"cut\":\"ამოჭრა\",\"cutError\":\"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).\",\"paste\":\"ჩასმა\",\"pasteArea\":\"ჩასმის არე\",\"pasteMsg\":\"ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (<strong>Ctrl/Cmd+V</strong>) და დააჭირეთ OK-ს\",\"securityMsg\":\"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.\",\"title\":\"ჩასმა\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"ავტომატური\",\"bgColorTitle\":\"ფონის ფერი\",\"colors\":{\"000\":\"შავი\",\"800000\":\"მუქი შინდისფერი\",\"8B4513\":\"ყავისფერი\",\"2F4F4F\":\"მოლურჯო ნაცრისფერი\",\"008080\":\"ჩამქრალი ლურჯი\",\"000080\":\"მუქი ლურჯი\",\"4B0082\":\"იასამნისფერი\",\"696969\":\"მუქი ნაცრისფერი\",\"B22222\":\"აგურისფერი\",\"A52A2A\":\"მუქი ყავისფერი\",\"DAA520\":\"მოყვითალო\",\"006400\":\"მუქი მწვანე\",\"40E0D0\":\"ცისფერი\",\"0000CD\":\"ზომიერად ლურჯი\",\"800080\":\"იისფერი\",\"808080\":\"ნაცრისფერი\",\"F00\":\"წითელი\",\"FF8C00\":\"მუქი სტაფილოსფერი\",\"FFD700\":\"ოქროსფერი\",\"008000\":\"მწვანე\",\"0FF\":\"ღია ცისფერი\",\"00F\":\"ლურჯი\",\"EE82EE\":\"იისფერი\",\"A9A9A9\":\"ბაცი ნაცრისფერი\",\"FFA07A\":\"ჩამქრალი ვარდისფერი\",\"FFA500\":\"სტაფილოსფერი\",\"FFFF00\":\"ყვითელი\",\"00FF00\":\"ლურჯი\",\"AFEEEE\":\"ცისფერი\",\"ADD8E6\":\"ღია ლურჯი\",\"DDA0DD\":\"ღია იისფერი\",\"D3D3D3\":\"ღია ნაცრისფერი\",\"FFF0F5\":\"ღია ვარდისფერი\",\"FAEBD7\":\"ღია ყავისფერი\",\"FFFFE0\":\"ნათელი ყვითელი\",\"F0FFF0\":\"ღია მწვანე\",\"F0FFFF\":\"ღია ცისფერი 2\",\"F0F8FF\":\"ღია ცისფერი 3\",\"E6E6FA\":\"ღია იისფერი 2\",\"FFF\":\"თეთრი\"},\"more\":\"მეტი ფერი...\",\"panelTitle\":\"ფერები\",\"textColorTitle\":\"ტექსტის ფერი\"},\"colordialog\":{\"clear\":\"გასუფთავება\",\"highlight\":\"ჩვენება\",\"options\":\"ფერის პარამეტრები\",\"selected\":\"არჩეული ფერი\",\"title\":\"ფერის შეცვლა\"},\"templates\":{\"button\":\"თარგები\",\"emptyListMsg\":\"(თარგი არაა განსაზღვრული)\",\"insertOption\":\"მიმდინარე შეგთავსის შეცვლა\",\"options\":\"თარგების პარამეტრები\",\"selectPromptMsg\":\"აირჩიეთ თარგი რედაქტორისთვის\",\"title\":\"თარგები\"},\"contextmenu\":{\"options\":\"კონტექსტური მენიუს პარამეტრები\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"სათაური\",\"cssClassInputLabel\":\"CSS კლასები\",\"edit\":\"Div-ის რედაქტირება\",\"inlineStyleInputLabel\":\"თანდართული სტილი\",\"langDirLTRLabel\":\"მარცხნიდან მარჯვნიც (LTR)\",\"langDirLabel\":\"ენის მინართულება\",\"langDirRTLLabel\":\"მარჯვნიდან მარცხნივ (RTL)\",\"languageCodeInputLabel\":\"ენის კოდი\",\"remove\":\"Div-ის წაშლა\",\"styleSelectLabel\":\"სტილი\",\"title\":\"Div კონტეინერის შექმნა\",\"toolbar\":\"Div კონტეინერის შექმნა\"},\"toolbar\":{\"toolbarCollapse\":\"ხელსაწყოთა ზოლის შეწევა\",\"toolbarExpand\":\"ხელსაწყოთა ზოლის გამოწევა\",\"toolbarGroups\":{\"document\":\"დოკუმენტი\",\"clipboard\":\"Clipboard/გაუქმება\",\"editing\":\"რედაქტირება\",\"forms\":\"ფორმები\",\"basicstyles\":\"ძირითადი სტილები\",\"paragraph\":\"აბზაცი\",\"links\":\"ბმულები\",\"insert\":\"ჩასმა\",\"styles\":\"სტილები\",\"colors\":\"ფერები\",\"tools\":\"ხელსაწყოები\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"ელემეტის გზა\",\"eleTitle\":\"%1 ელემენტი\"},\"find\":{\"find\":\"ძებნა\",\"findOptions\":\"Find Options\",\"findWhat\":\"საძიებელი ტექსტი:\",\"matchCase\":\"დიდი და პატარა ასოების დამთხვევა\",\"matchCyclic\":\"დოკუმენტის ბოლოში გასვლის მერე თავიდან დაწყება\",\"matchWord\":\"მთელი სიტყვის დამთხვევა\",\"notFoundMsg\":\"მითითებული ტექსტი არ მოიძებნა.\",\"replace\":\"შეცვლა\",\"replaceAll\":\"ყველას შეცვლა\",\"replaceSuccessMsg\":\"%1 მოძებნილი შეიცვალა.\",\"replaceWith\":\"შეცვლის ტექსტი:\",\"title\":\"ძებნა და შეცვლა\"},\"fakeobjects\":{\"anchor\":\"ღუზა\",\"flash\":\"Flash ანიმაცია\",\"hiddenfield\":\"მალული ველი\",\"iframe\":\"IFrame\",\"unknown\":\"უცნობი ობიექტი\"},\"flash\":{\"access\":\"სკრიპტის წვდომა\",\"accessAlways\":\"ყოველთვის\",\"accessNever\":\"არასდროს\",\"accessSameDomain\":\"იგივე დომენი\",\"alignAbsBottom\":\"ჩარჩოს ქვემოთა ნაწილის სწორება ტექსტისთვის\",\"alignAbsMiddle\":\"ჩარჩოს შუა ნაწილის სწორება ტექსტისთვის\",\"alignBaseline\":\"საბაზისო ხაზის სწორება\",\"alignTextTop\":\"ტექსტი ზემოდან\",\"bgcolor\":\"ფონის ფერი\",\"chkFull\":\"მთელი ეკრანის დაშვება\",\"chkLoop\":\"ჩაციკლვა\",\"chkMenu\":\"Flash-ის მენიუს დაშვება\",\"chkPlay\":\"ავტო გაშვება\",\"flashvars\":\"ცვლადები Flash-ისთვის\",\"hSpace\":\"ჰორიზ. სივრცე\",\"properties\":\"Flash-ის პარამეტრები\",\"propertiesTab\":\"პარამეტრები\",\"quality\":\"ხარისხი\",\"qualityAutoHigh\":\"მაღალი (ავტომატური)\",\"qualityAutoLow\":\"ძალიან დაბალი\",\"qualityBest\":\"საუკეთესო\",\"qualityHigh\":\"მაღალი\",\"qualityLow\":\"დაბალი\",\"qualityMedium\":\"საშუალო\",\"scale\":\"მასშტაბირება\",\"scaleAll\":\"ყველაფრის ჩვენება\",\"scaleFit\":\"ზუსტი ჩასმა\",\"scaleNoBorder\":\"ჩარჩოს გარეშე\",\"title\":\"Flash-ის პარამეტრები\",\"vSpace\":\"ვერტ. სივრცე\",\"validateHSpace\":\"ჰორიზონტალური სივრცე არ უნდა იყოს ცარიელი.\",\"validateSrc\":\"URL არ უნდა იყოს ცარიელი.\",\"validateVSpace\":\"ვერტიკალური სივრცე არ უნდა იყოს ცარიელი.\",\"windowMode\":\"ფანჯრის რეჟიმი\",\"windowModeOpaque\":\"გაუმჭვირვალე\",\"windowModeTransparent\":\"გამჭვირვალე\",\"windowModeWindow\":\"ფანჯარა\"},\"font\":{\"fontSize\":{\"label\":\"ზომა\",\"voiceLabel\":\"ტექსტის ზომა\",\"panelTitle\":\"ტექსტის ზომა\"},\"label\":\"ფონტი\",\"panelTitle\":\"ფონტის სახელი\",\"voiceLabel\":\"ფონტი\"},\"forms\":{\"button\":{\"title\":\"ღილაკის პარამეტრები\",\"text\":\"ტექსტი\",\"type\":\"ტიპი\",\"typeBtn\":\"ღილაკი\",\"typeSbm\":\"გაგზავნა\",\"typeRst\":\"გასუფთავება\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"მონიშვნის ღილაკის (Checkbox) პარამეტრები\",\"radioTitle\":\"ასარჩევი ღილაკის (Radio) პარამეტრები\",\"value\":\"ტექსტი\",\"selected\":\"არჩეული\",\"required\":\"Required\"},\"form\":{\"title\":\"ფორმის პარამეტრები\",\"menu\":\"ფორმის პარამეტრები\",\"action\":\"ქმედება\",\"method\":\"მეთოდი\",\"encoding\":\"კოდირება\"},\"hidden\":{\"title\":\"მალული ველის პარამეტრები\",\"name\":\"სახელი\",\"value\":\"მნიშვნელობა\"},\"select\":{\"title\":\"არჩევის ველის პარამეტრები\",\"selectInfo\":\"ინფორმაცია\",\"opAvail\":\"შესაძლებელი ვარიანტები\",\"value\":\"მნიშვნელობა\",\"size\":\"ზომა\",\"lines\":\"ხაზები\",\"chkMulti\":\"მრავლობითი არჩევანის საშუალება\",\"required\":\"Required\",\"opText\":\"ტექსტი\",\"opValue\":\"მნიშვნელობა\",\"btnAdd\":\"დამატება\",\"btnModify\":\"შეცვლა\",\"btnUp\":\"ზემოთ\",\"btnDown\":\"ქვემოთ\",\"btnSetValue\":\"ამორჩეულ მნიშვნელოვნად დაყენება\",\"btnDelete\":\"წაშლა\"},\"textarea\":{\"title\":\"ტექსტური არის პარამეტრები\",\"cols\":\"სვეტები\",\"rows\":\"სტრიქონები\"},\"textfield\":{\"title\":\"ტექსტური ველის პარამეტრები\",\"name\":\"სახელი\",\"value\":\"მნიშვნელობა\",\"charWidth\":\"სიმბოლოს ზომა\",\"maxChars\":\"ასოების მაქსიმალური ოდენობა\",\"required\":\"Required\",\"type\":\"ტიპი\",\"typeText\":\"ტექსტი\",\"typePass\":\"პაროლი\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"ფიორმატირება\",\"panelTitle\":\"ფორმატირება\",\"tag_address\":\"მისამართი\",\"tag_div\":\"ჩვეულებრივი (DIV)\",\"tag_h1\":\"სათაური 1\",\"tag_h2\":\"სათაური 2\",\"tag_h3\":\"სათაური 3\",\"tag_h4\":\"სათაური 4\",\"tag_h5\":\"სათაური 5\",\"tag_h6\":\"სათაური 6\",\"tag_p\":\"ჩვეულებრივი\",\"tag_pre\":\"ფორმატირებული\"},\"horizontalrule\":{\"toolbar\":\"ჰორიზონტალური ხაზის ჩასმა\"},\"iframe\":{\"border\":\"ჩარჩოს გამოჩენა\",\"noUrl\":\"აკრიფეთ iframe-ის URL\",\"scrolling\":\"გადახვევის ზოლების დაშვება\",\"title\":\"IFrame-ის პარამეტრები\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"სანაცვლო ტექსტი\",\"border\":\"ჩარჩო\",\"btnUpload\":\"სერვერისთვის გაგზავნა\",\"button2Img\":\"გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?\",\"hSpace\":\"ჰორიზონტალური სივრცე\",\"img2Button\":\"გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?\",\"infoTab\":\"სურათის ინფორმცია\",\"linkTab\":\"ბმული\",\"lockRatio\":\"პროპორციის შენარჩუნება\",\"menu\":\"სურათის პარამეტრები\",\"resetSize\":\"ზომის დაბრუნება\",\"title\":\"სურათის პარამეტრები\",\"titleButton\":\"სურათიანი ღილაკის პარამეტრები\",\"upload\":\"ატვირთვა\",\"urlMissing\":\"სურათის URL არაა შევსებული.\",\"vSpace\":\"ვერტიკალური სივრცე\",\"validateBorder\":\"ჩარჩო მთელი რიცხვი უნდა იყოს.\",\"validateHSpace\":\"ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.\",\"validateVSpace\":\"ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს.\"},\"indent\":{\"indent\":\"მეტად შეწევა\",\"outdent\":\"ნაკლებად შეწევა\"},\"smiley\":{\"options\":\"სიცილაკის პარამეტრები\",\"title\":\"სიცილაკის ჩასმა\",\"toolbar\":\"სიცილაკები\"},\"justify\":{\"block\":\"გადასწორება\",\"center\":\"შუაში სწორება\",\"left\":\"მარცხნივ სწორება\",\"right\":\"მარჯვნივ სწორება\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"წვდომის ღილაკი\",\"advanced\":\"დაწვრილებით\",\"advisoryContentType\":\"შიგთავსის ტიპი\",\"advisoryTitle\":\"სათაური\",\"anchor\":{\"toolbar\":\"ღუზა\",\"menu\":\"ღუზის რედაქტირება\",\"title\":\"ღუზის პარამეტრები\",\"name\":\"ღუზუს სახელი\",\"errorName\":\"აკრიფეთ ღუზის სახელი\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"ელემენტის Id-თ\",\"anchorName\":\"ღუზის სახელით\",\"charset\":\"კოდირება\",\"cssClasses\":\"CSS კლასი\",\"emailAddress\":\"ელფოსტის მისამართები\",\"emailBody\":\"წერილის ტექსტი\",\"emailSubject\":\"წერილის სათაური\",\"id\":\"Id\",\"info\":\"ბმულის ინფორმაცია\",\"langCode\":\"ენის კოდი\",\"langDir\":\"ენის მიმართულება\",\"langDirLTR\":\"მარცხნიდან მარჯვნივ (LTR)\",\"langDirRTL\":\"მარჯვნიდან მარცხნივ (RTL)\",\"menu\":\"ბმულის რედაქტირება\",\"name\":\"სახელი\",\"noAnchors\":\"(ამ დოკუმენტში ღუზა არაა)\",\"noEmail\":\"აკრიფეთ ელფოსტის მისამართი\",\"noUrl\":\"აკრიფეთ ბმულის URL\",\"other\":\"<სხვა>\",\"popupDependent\":\"დამოკიდებული (Netscape)\",\"popupFeatures\":\"Popup ფანჯრის პარამეტრები\",\"popupFullScreen\":\"მთელი ეკრანი (IE)\",\"popupLeft\":\"მარცხენა პოზიცია\",\"popupLocationBar\":\"ნავიგაციის ზოლი\",\"popupMenuBar\":\"მენიუს ზოლი\",\"popupResizable\":\"ცვალებადი ზომით\",\"popupScrollBars\":\"გადახვევის ზოლები\",\"popupStatusBar\":\"სტატუსის ზოლი\",\"popupToolbar\":\"ხელსაწყოთა ზოლი\",\"popupTop\":\"ზედა პოზიცია\",\"rel\":\"კავშირი\",\"selectAnchor\":\"აირჩიეთ ღუზა\",\"styles\":\"CSS სტილი\",\"tabIndex\":\"Tab-ის ინდექსი\",\"target\":\"გახსნის ადგილი\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Frame-ის სახელი\",\"targetPopup\":\"<popup ფანჯარა>\",\"targetPopupName\":\"Popup ფანჯრის სახელი\",\"title\":\"ბმული\",\"toAnchor\":\"ბმული ტექსტში ღუზაზე\",\"toEmail\":\"ელფოსტა\",\"toUrl\":\"URL\",\"toolbar\":\"ბმული\",\"type\":\"ბმულის ტიპი\",\"unlink\":\"ბმულის მოხსნა\",\"upload\":\"აქაჩვა\"},\"list\":{\"bulletedlist\":\"ღილიანი სია\",\"numberedlist\":\"გადანომრილი სია\"},\"liststyle\":{\"armenian\":\"სომხური გადანომრვა\",\"bulletedTitle\":\"ღილებიანი სიის პარამეტრები\",\"circle\":\"წრეწირი\",\"decimal\":\"რიცხვებით (1, 2, 3, ..)\",\"decimalLeadingZero\":\"ნულით დაწყებული რიცხვებით (01, 02, 03, ..)\",\"disc\":\"წრე\",\"georgian\":\"ქართული გადანომრვა (ან, ბან, გან, ..)\",\"lowerAlpha\":\"პატარა ლათინური ასოებით (a, b, c, d, e, ..)\",\"lowerGreek\":\"პატარა ბერძნული ასოებით (ალფა, ბეტა, გამა, ..)\",\"lowerRoman\":\"რომაული გადანომრვცა პატარა ციფრებით (i, ii, iii, iv, v, ..)\",\"none\":\"არაფერი\",\"notset\":\"<არაფერი>\",\"numberedTitle\":\"გადანომრილი სიის პარამეტრები\",\"square\":\"კვადრატი\",\"start\":\"საწყისი\",\"type\":\"ტიპი\",\"upperAlpha\":\"დიდი ლათინური ასოებით (A, B, C, D, E, ..)\",\"upperRoman\":\"რომაული გადანომრვა დიდი ციფრებით (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"სიის საწყისი მთელი რიცხვი უნდა იყოს.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"გადიდება\",\"minimize\":\"დაპატარავება\"},\"newpage\":{\"toolbar\":\"ახალი გვერდი\"},\"pagebreak\":{\"alt\":\"გვერდის წყვეტა\",\"toolbar\":\"გვერდის წყვეტა ბეჭდვისთვის\"},\"pastetext\":{\"button\":\"მხოლოდ ტექსტის ჩასმა\",\"title\":\"მხოლოდ ტექსტის ჩასმა\"},\"pastefromword\":{\"confirmCleanup\":\"ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?\",\"error\":\"შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა\",\"title\":\"ვორდიდან ჩასმა\",\"toolbar\":\"ვორდიდან ჩასმა\"},\"preview\":{\"preview\":\"გადახედვა\"},\"print\":{\"toolbar\":\"ბეჭდვა\"},\"removeformat\":{\"toolbar\":\"ფორმატირების მოხსნა\"},\"save\":{\"toolbar\":\"ჩაწერა\"},\"selectall\":{\"toolbar\":\"ყველაფრის მონიშნვა\"},\"showblocks\":{\"toolbar\":\"არეების ჩვენება\"},\"sourcearea\":{\"toolbar\":\"კოდები\"},\"specialchar\":{\"options\":\"სპეციალური სიმბოლოს პარამეტრები\",\"title\":\"სპეციალური სიმბოლოს არჩევა\",\"toolbar\":\"სპეციალური სიმბოლოს ჩასმა\"},\"scayt\":{\"btn_about\":\"SCAYT-ის შესახებ\",\"btn_dictionaries\":\"ლექსიკონები\",\"btn_disable\":\"SCAYT-ის გამორთვა\",\"btn_enable\":\"SCAYT-ის ჩართვა\",\"btn_langs\":\"ენები\",\"btn_options\":\"პარამეტრები\",\"text_title\":\"მართლწერის შემოწმება კრეფისას\"},\"stylescombo\":{\"label\":\"სტილები\",\"panelTitle\":\"ფორმატირების სტილები\",\"panelTitle1\":\"არის სტილები\",\"panelTitle2\":\"თანდართული სტილები\",\"panelTitle3\":\"ობიექტის სტილები\"},\"table\":{\"border\":\"ჩარჩოს ზომა\",\"caption\":\"სათაური\",\"cell\":{\"menu\":\"უჯრა\",\"insertBefore\":\"უჯრის ჩასმა მანამდე\",\"insertAfter\":\"უჯრის ჩასმა მერე\",\"deleteCell\":\"უჯრების წაშლა\",\"merge\":\"უჯრების შეერთება\",\"mergeRight\":\"შეერთება მარჯვენასთან\",\"mergeDown\":\"შეერთება ქვემოთასთან\",\"splitHorizontal\":\"გაყოფა ჰორიზონტალურად\",\"splitVertical\":\"გაყოფა ვერტიკალურად\",\"title\":\"უჯრის პარამეტრები\",\"cellType\":\"უჯრის ტიპი\",\"rowSpan\":\"სტრიქონების ოდენობა\",\"colSpan\":\"სვეტების ოდენობა\",\"wordWrap\":\"სტრიქონის გადატანა (Word Wrap)\",\"hAlign\":\"ჰორიზონტალური სწორება\",\"vAlign\":\"ვერტიკალური სწორება\",\"alignBaseline\":\"ძირითადი ხაზის გასწვრივ\",\"bgColor\":\"ფონის ფერი\",\"borderColor\":\"ჩარჩოს ფერი\",\"data\":\"მონაცემები\",\"header\":\"სათაური\",\"yes\":\"დიახ\",\"no\":\"არა\",\"invalidWidth\":\"უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidHeight\":\"უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidRowSpan\":\"სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.\",\"invalidColSpan\":\"სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.\",\"chooseColor\":\"არჩევა\"},\"cellPad\":\"უჯრის კიდე (padding)\",\"cellSpace\":\"უჯრის სივრცე (spacing)\",\"column\":{\"menu\":\"სვეტი\",\"insertBefore\":\"სვეტის ჩამატება წინ\",\"insertAfter\":\"სვეტის ჩამატება მერე\",\"deleteColumn\":\"სვეტების წაშლა\"},\"columns\":\"სვეტი\",\"deleteTable\":\"ცხრილის წაშლა\",\"headers\":\"სათაურები\",\"headersBoth\":\"ორივე\",\"headersColumn\":\"პირველი სვეტი\",\"headersNone\":\"არაფერი\",\"headersRow\":\"პირველი სტრიქონი\",\"invalidBorder\":\"ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.\",\"invalidCellPadding\":\"უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidCellSpacing\":\"უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidCols\":\"სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.\",\"invalidHeight\":\"ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.\",\"invalidRows\":\"სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.\",\"invalidWidth\":\"ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.\",\"menu\":\"ცხრილის პარამეტრები\",\"row\":{\"menu\":\"სტრიქონი\",\"insertBefore\":\"სტრიქონის ჩამატება წინ\",\"insertAfter\":\"სტრიქონის ჩამატება მერე\",\"deleteRow\":\"სტრიქონების წაშლა\"},\"rows\":\"სტრიქონი\",\"summary\":\"შეჯამება\",\"title\":\"ცხრილის პარამეტრები\",\"toolbar\":\"ცხრილი\",\"widthPc\":\"პროცენტი\",\"widthPx\":\"წერტილი\",\"widthUnit\":\"საზომი ერთეული\"},\"undo\":{\"redo\":\"გამეორება\",\"undo\":\"გაუქმება\"},\"wsc\":{\"btnIgnore\":\"უგულებელყოფა\",\"btnIgnoreAll\":\"ყველას უგულებელყოფა\",\"btnReplace\":\"შეცვლა\",\"btnReplaceAll\":\"ყველას შეცვლა\",\"btnUndo\":\"გაუქმება\",\"changeTo\":\"შეცვლელი\",\"errorLoading\":\"სერვისის გამოძახების შეცდომა: %s.\",\"ieSpellDownload\":\"მართლწერის შემოწმება არაა დაინსტალირებული. ჩამოვქაჩოთ ინტერნეტიდან?\",\"manyChanges\":\"მართლწერის შემოწმება: %1 სიტყვა შეიცვალა\",\"noChanges\":\"მართლწერის შემოწმება: არაფერი შეცვლილა\",\"noMispell\":\"მართლწერის შემოწმება: შეცდომა არ მოიძებნა\",\"noSuggestions\":\"- არაა შემოთავაზება -\",\"notAvailable\":\"უკაცრავად, ეს სერვისი ამჟამად მიუწვდომელია.\",\"notInDic\":\"არაა ლექსიკონში\",\"oneChange\":\"მართლწერის შემოწმება: ერთი სიტყვა შეიცვალა\",\"progress\":\"მიმდინარეობს მართლწერის შემოწმება...\",\"title\":\"მართლწერა\",\"toolbar\":\"მართლწერა\"}};"
  },
  {
    "path": "assets/ckeditor/lang/km.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['km']={\"editor\":\"ឧបករណ៍​សរសេរ​អត្ថបទ​សម្បូរ​បែប\",\"editorPanel\":\"ផ្ទាំង​ឧបករណ៍​សរសេរ​អត្ថបទ​សម្បូរ​បែប\",\"common\":{\"editorHelp\":\"ចុច ALT 0 សម្រាប់​ជំនួយ\",\"browseServer\":\"រក​មើល​ក្នុង​ម៉ាស៊ីន​បម្រើ\",\"url\":\"URL\",\"protocol\":\"ពិធីការ\",\"upload\":\"ផ្ទុក​ឡើង\",\"uploadSubmit\":\"បញ្ជូនទៅកាន់ម៉ាស៊ីន​បម្រើ\",\"image\":\"រូបភាព\",\"flash\":\"Flash\",\"form\":\"បែបបទ\",\"checkbox\":\"ប្រអប់​ធីក\",\"radio\":\"ប៊ូតុង​មូល\",\"textField\":\"វាល​អត្ថបទ\",\"textarea\":\"Textarea\",\"hiddenField\":\"វាល​កំបាំង\",\"button\":\"ប៊ូតុង\",\"select\":\"វាល​ជម្រើស\",\"imageButton\":\"ប៊ូតុង​រូបភាព\",\"notSet\":\"<មិនកំណត់>\",\"id\":\"Id\",\"name\":\"ឈ្មោះ\",\"langDir\":\"ទិសដៅភាសា\",\"langDirLtr\":\"ពីឆ្វេងទៅស្តាំ (LTR)\",\"langDirRtl\":\"ពីស្តាំទៅឆ្វេង (RTL)\",\"langCode\":\"លេខ​កូដ​ភាសា\",\"longDescr\":\"URL អធិប្បាយ​វែង\",\"cssClass\":\"Stylesheet Classes\",\"advisoryTitle\":\"ចំណង​ជើង​ណែនាំ\",\"cssStyle\":\"រចនាបថ\",\"ok\":\"ព្រម\",\"cancel\":\"បោះបង់\",\"close\":\"បិទ\",\"preview\":\"មើល​ជា​មុន\",\"resize\":\"ប្ដូរ​ទំហំ\",\"generalTab\":\"ទូទៅ\",\"advancedTab\":\"កម្រិត​ខ្ពស់\",\"validateNumberFailed\":\"តម្លៃ​នេះ​ពុំ​មែន​ជា​លេខ​ទេ។\",\"confirmNewPage\":\"រាល់​បន្លាស់​ប្ដូរ​នានា​ដែល​មិន​ទាន់​រក្សា​ទុក​ក្នុង​មាតិកា​នេះ នឹង​ត្រូវ​បាត់​បង់។ តើ​អ្នក​ពិត​ជា​ចង់​ផ្ទុក​ទំព័រ​ថ្មី​មែនទេ?\",\"confirmCancel\":\"ការ​កំណត់​មួយ​ចំនួន​ត្រូ​វ​បាន​ផ្លាស់​ប្ដូរ។ តើ​អ្នក​ពិត​ជា​ចង់​បិទ​ប្រអប់​នេះ​មែនទេ?\",\"options\":\"ការ​កំណត់\",\"target\":\"គោលដៅ\",\"targetNew\":\"វីនដូ​ថ្មី (_blank)\",\"targetTop\":\"វីនដូ​លើ​គេ (_top)\",\"targetSelf\":\"វីនដូ​ដូច​គ្នា (_self)\",\"targetParent\":\"វីនដូ​មេ (_parent)\",\"langDirLTR\":\"ពីឆ្វេងទៅស្តាំ(LTR)\",\"langDirRTL\":\"ពីស្តាំទៅឆ្វេង(RTL)\",\"styles\":\"រចនាបថ\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"ទទឹង\",\"height\":\"កំពស់\",\"align\":\"កំណត់​ទីតាំង\",\"alignLeft\":\"ខាងឆ្វង\",\"alignRight\":\"ខាងស្តាំ\",\"alignCenter\":\"កណ្តាល\",\"alignJustify\":\"តំរឹមសងខាង\",\"alignTop\":\"ខាងលើ\",\"alignMiddle\":\"កណ្តាល\",\"alignBottom\":\"ខាងក្រោម\",\"alignNone\":\"គ្មាន\",\"invalidValue\":\"តម្លៃ​មិន​ត្រឹម​ត្រូវ។\",\"invalidHeight\":\"តម្លៃ​កំពស់​ត្រូវ​តែ​ជា​លេខ។\",\"invalidWidth\":\"តម្លៃ​ទទឹង​ត្រូវ​តែ​ជា​លេខ។\",\"invalidCssLength\":\"តម្លៃ​កំណត់​សម្រាប់​វាល \\\"%1\\\" ត្រូវ​តែ​ជា​លេខ​វិជ្ជមាន​ ដោយ​ភ្ជាប់ឬ​មិន​ភ្ជាប់​ជាមួយ​នឹង​ឯកតា​រង្វាស់​របស់ CSS (px, %, in, cm, mm, em, ex, pt ឬ pc) ។\",\"invalidHtmlLength\":\"តម្លៃ​កំណត់​សម្រាប់​វាល \\\"%1\\\" ត្រូវ​តែ​ជា​លេខ​វិជ្ជមាន ដោយ​ភ្ជាប់​ឬ​មិន​ភ្ជាប់​ជាមួយ​នឹង​ឯកតា​រង្វាស់​របស់ HTML (px ឬ %) ។\",\"invalidInlineStyle\":\"តម្លៃ​កំណត់​សម្រាប់​រចនាបថ​ក្នុង​តួ ត្រូវ​តែ​មាន​មួយ​ឬ​ធាតុ​ច្រើន​ដោយ​មាន​ទ្រង់ទ្រាយ​ជា \\\"ឈ្មោះ : តម្លៃ\\\" ហើយ​ញែក​ចេញ​ពី​គ្នា​ដោយ​ចុច​ក្បៀស។\",\"cssLengthTooltip\":\"បញ្ចូល​លេខ​សម្រាប់​តម្លៃ​ជា​ភិចសែល ឬ​លេខ​ដែល​មាន​ឯកតា​ត្រឹមត្រូវ​របស់ CSS (px, %, in, cm, mm, em, ex, pt ឬ pc) ។\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, មិន​មាន</span>\"},\"about\":{\"copy\":\"រក្សាសិទ្ធិ &copy; $1។ រក្សា​សិទ្ធិ​គ្រប់​បែប​យ៉ាង។\",\"dlgTitle\":\"អំពី CKEditor\",\"help\":\"ពិនិត្យ $1 សម្រាប់​ជំនួយ។\",\"moreInfo\":\"សម្រាប់​ព័ត៌មាន​អំពី​អាជ្ញាបណញណ សូម​មើល​ក្នុង​គេហទំព័រ​របស់​យើង៖\",\"title\":\"អំពី CKEditor\",\"userGuide\":\"វិធី​ប្រើ​ប្រាស់ CKEditor\"},\"basicstyles\":{\"bold\":\"ដិត\",\"italic\":\"ទ្រេត\",\"strike\":\"គូស​បន្ទាត់​ចំ​កណ្ដាល\",\"subscript\":\"អក្សរតូចក្រោម\",\"superscript\":\"អក្សរតូចលើ\",\"underline\":\"គូស​បន្ទាត់​ក្រោម\"},\"bidi\":{\"ltr\":\"ទិស​ដៅ​អក្សរ​ពី​ឆ្វេង​ទៅ​ស្ដាំ\",\"rtl\":\"ទិស​ដៅ​អក្សរ​ពី​ស្ដាំ​ទៅ​ឆ្វេង\"},\"blockquote\":{\"toolbar\":\"ប្លក់​ពាក្យ​សម្រង់\"},\"clipboard\":{\"copy\":\"ចម្លង\",\"copyError\":\"ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។\",\"cut\":\"កាត់យក\",\"cutError\":\"ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ  (Ctrl/Cmd+X) ។\",\"paste\":\"បិទ​ភ្ជាប់\",\"pasteArea\":\"តំបន់​បិទ​ភ្ជាប់\",\"pasteMsg\":\"សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី ​(<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។\",\"securityMsg\":\"ព្រោះតែ​ការកំណត់​សុវត្ថិភាព ប្រអប់សរសេរ​មិន​អាចចាប់​យកទិន្នន័យពីក្តារតម្បៀតខ្ទាស់​អ្នក​​ដោយផ្ទាល់​បានទេ។ អ្នក​ត្រូវចំលង​ដាក់វាម្តង​ទៀត ក្នុងផ្ទាំងនេះ។\",\"title\":\"បិទ​ភ្ជាប់\"},\"button\":{\"selectedLabel\":\"%1 (បាន​ជ្រើស​រើស)\"},\"colorbutton\":{\"auto\":\"ស្វ័យប្រវត្តិ\",\"bgColorTitle\":\"ពណ៌ផ្ទៃខាងក្រោយ\",\"colors\":{\"000\":\"ខ្មៅ\",\"800000\":\"ត្នោត​ចាស់\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"ខៀវ​ចាស់\",\"4B0082\":\"ធ្លះ\",\"696969\":\"ប្រផេះ​ក្រាស់\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"ត្នោត\",\"DAA520\":\"Golden Rod\",\"006400\":\"បៃតង​ចាស់\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"ប្រផេះ\",\"F00\":\"ក្រហម\",\"FF8C00\":\"ទឹក​ក្រូច​ចាស់\",\"FFD700\":\"មាស\",\"008000\":\"បៃតង\",\"0FF\":\"Cyan\",\"00F\":\"ខៀវ\",\"EE82EE\":\"ស្វាយ\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"ទឹក​ក្រូច\",\"FFFF00\":\"លឿង\",\"00FF00\":\"ក្រូច​ឆ្មារ\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"លឿង​ស្ដើង\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"ផ្ទៃមេឃ\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"ឡាវិនដឺ\",\"FFF\":\"ស\"},\"more\":\"ពណ៌​ផ្សេង​ទៀត..\",\"panelTitle\":\"ពណ៌\",\"textColorTitle\":\"ពណ៌អក្សរ\"},\"colordialog\":{\"clear\":\"សម្អាត\",\"highlight\":\"បន្លិច​ពណ៌\",\"options\":\"ជម្រើស​ពណ៌\",\"selected\":\"ពណ៌​ដែល​បាន​រើស\",\"title\":\"រើស​ពណ៌\"},\"templates\":{\"button\":\"ពុម្ព​គំរូ\",\"emptyListMsg\":\"(មិន​មាន​ពុម្ព​គំរូ​ត្រូវ​បាន​កំណត់)\",\"insertOption\":\"ជំនួស​ក្នុង​មាតិកា​បច្ចុប្បន្ន\",\"options\":\"ជម្រើស​ពុម្ព​គំរូ\",\"selectPromptMsg\":\"សូម​រើស​ពុម្ព​គំរូ​ដើម្បី​បើក​ក្នុង​កម្មវិធី​សរសេរ​អត្ថបទ\",\"title\":\"ពុម្ព​គំរូ​មាតិកា\"},\"contextmenu\":{\"options\":\"ជម្រើស​ម៉ឺនុយ​បរិបទ\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"ចំណង​ជើង​ប្រឹក្សា\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"កែ Div\",\"inlineStyleInputLabel\":\"ស្ទីល​ក្នុង​បន្ទាត់\",\"langDirLTRLabel\":\"ពីឆ្វេងទៅស្តាំ(LTR)\",\"langDirLabel\":\"ទិសដៅភាសា\",\"langDirRTLLabel\":\"ពីស្តាំទៅឆ្វេង(RTL)\",\"languageCodeInputLabel\":\"កូដ​ភាសា\",\"remove\":\"ដក Div ចេញ\",\"styleSelectLabel\":\"ស្ទីល\",\"title\":\"បង្កើត​អ្នក​ផ្ទុក Div\",\"toolbar\":\"បង្កើត​អ្នក​ផ្ទុក Div\"},\"toolbar\":{\"toolbarCollapse\":\"បង្រួម​របារ​ឧបករណ៍\",\"toolbarExpand\":\"ពង្រីក​របារ​ឧបករណ៍\",\"toolbarGroups\":{\"document\":\"ឯកសារ\",\"clipboard\":\"Clipboard/មិន​ធ្វើ​វិញ\",\"editing\":\"ការ​កែ​សម្រួល\",\"forms\":\"បែបបទ\",\"basicstyles\":\"រចនាបថ​មូលដ្ឋាន\",\"paragraph\":\"កថាខណ្ឌ\",\"links\":\"តំណ\",\"insert\":\"បញ្ចូល\",\"styles\":\"រចនាបថ\",\"colors\":\"ពណ៌\",\"tools\":\"ឧបករណ៍\"},\"toolbars\":\"របារ​ឧបករណ៍​កែ​សម្រួល\"},\"elementspath\":{\"eleLabel\":\"ទីតាំង​ធាតុ\",\"eleTitle\":\"ធាតុ %1\"},\"find\":{\"find\":\"ស្វែងរក\",\"findOptions\":\"ជម្រើស​ស្វែង​រក\",\"findWhat\":\"ស្វែងរកអ្វី:\",\"matchCase\":\"ករណី​ដំណូច\",\"matchCyclic\":\"ត្រូវ​នឹង cyclic\",\"matchWord\":\"ដូច​នឹង​ពាក្យ​ទាំង​មូល\",\"notFoundMsg\":\"រក​មិន​ឃើញ​ពាក្យ​ដែល​បាន​បញ្ជាក់។\",\"replace\":\"ជំនួស\",\"replaceAll\":\"ជំនួសទាំងអស់\",\"replaceSuccessMsg\":\"ការ​ជំនួស​ចំនួន %1 បាន​កើត​ឡើង។\",\"replaceWith\":\"ជំនួសជាមួយ:\",\"title\":\"រក​និង​ជំនួស\"},\"fakeobjects\":{\"anchor\":\"យុថ្កា\",\"flash\":\"Flash មាន​ចលនា\",\"hiddenfield\":\"វាល​កំបាំង\",\"iframe\":\"IFrame\",\"unknown\":\"វត្ថុ​មិន​ស្គាល់\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"ជានិច្ច\",\"accessNever\":\"កុំ\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"បន្ទាត់ជាមូលដ្ឋាន\",\"alignTextTop\":\"លើអត្ថបទ\",\"bgcolor\":\"ពណ៌ផ្ទៃខាងក្រោយ\",\"chkFull\":\"អនុញ្ញាត​ឲ្យ​ពេញ​អេក្រង់\",\"chkLoop\":\"ចំនួនដង\",\"chkMenu\":\"បង្ហាញ មឺនុយរបស់ Flash\",\"chkPlay\":\"លេងដោយស្វ័យប្រវត្ត\",\"flashvars\":\"អថេរ Flash\",\"hSpace\":\"គំលាតទទឹង\",\"properties\":\"ការកំណត់ Flash\",\"propertiesTab\":\"លក្ខណៈ​សម្បត្តិ\",\"quality\":\"គុណភាព\",\"qualityAutoHigh\":\"ខ្ពស់​ស្វ័យ​ប្រវត្តិ\",\"qualityAutoLow\":\"ទាប​ស្វ័យ​ប្រវត្តិ\",\"qualityBest\":\"ល្អ​បំផុត\",\"qualityHigh\":\"ខ្ពស់\",\"qualityLow\":\"ទាប\",\"qualityMedium\":\"មធ្យម\",\"scale\":\"ទំហំ\",\"scaleAll\":\"បង្ហាញទាំងអស់\",\"scaleFit\":\"ត្រូវល្មម\",\"scaleNoBorder\":\"មិនបង្ហាញស៊ុម\",\"title\":\"ការកំណត់ Flash\",\"vSpace\":\"គំលាតបណ្តោយ\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"សូមសរសេរ អាស័យដ្ឋាន URL\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"ភាព​ថ្លា\",\"windowModeWindow\":\"វីនដូ\"},\"font\":{\"fontSize\":{\"label\":\"ទំហំ\",\"voiceLabel\":\"ទំហំ​អក្សរ\",\"panelTitle\":\"ទំហំ​អក្សរ\"},\"label\":\"ពុម្ព​អក្សរ\",\"panelTitle\":\"ឈ្មោះ​ពុម្ព​អក្សរ\",\"voiceLabel\":\"ពុម្ព​អក្សរ\"},\"forms\":{\"button\":{\"title\":\"លក្ខណៈ​ប៊ូតុង\",\"text\":\"អត្ថបទ (តម្លៃ)\",\"type\":\"ប្រភេទ\",\"typeBtn\":\"ប៊ូតុង\",\"typeSbm\":\"ដាក់ស្នើ\",\"typeRst\":\"កំណត់​ឡើង​វិញ\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"លក្ខណៈ​ប្រអប់​ធីក\",\"radioTitle\":\"លក្ខនៈ​ប៊ូតុង​មូល\",\"value\":\"តម្លៃ\",\"selected\":\"បាន​ជ្រើស\",\"required\":\"Required\"},\"form\":{\"title\":\"លក្ខណៈ​បែបបទ\",\"menu\":\"លក្ខណៈ​បែបបទ\",\"action\":\"សកម្មភាព\",\"method\":\"វិធីសាស្ត្រ\",\"encoding\":\"ការ​អ៊ិនកូដ\"},\"hidden\":{\"title\":\"លក្ខណៈ​វាល​កំបាំង\",\"name\":\"ឈ្មោះ\",\"value\":\"តម្លៃ\"},\"select\":{\"title\":\"លក្ខណៈ​វាល​ជម្រើស\",\"selectInfo\":\"ព័ត៌មាន​ជម្រើស\",\"opAvail\":\"ជម្រើស​ដែល​មាន\",\"value\":\"តម្លៃ\",\"size\":\"ទំហំ\",\"lines\":\"បន្ទាត់\",\"chkMulti\":\"អនុញ្ញាត​ពហុ​ជម្រើស\",\"required\":\"Required\",\"opText\":\"អត្ថបទ\",\"opValue\":\"តម្លៃ\",\"btnAdd\":\"បន្ថែម\",\"btnModify\":\"ផ្លាស់ប្តូរ\",\"btnUp\":\"លើ\",\"btnDown\":\"ក្រោម\",\"btnSetValue\":\"កំណត់​ជា​តម្លៃ​ដែល​បាន​ជ្រើស\",\"btnDelete\":\"លុប\"},\"textarea\":{\"title\":\"លក្ខណៈ​ប្រអប់​អត្ថបទ\",\"cols\":\"ជួរឈរ\",\"rows\":\"ជួរដេក\"},\"textfield\":{\"title\":\"លក្ខណៈ​វាល​អត្ថបទ\",\"name\":\"ឈ្មោះ\",\"value\":\"តម្លៃ\",\"charWidth\":\"ទទឹង​តួ​អក្សរ\",\"maxChars\":\"អក្សរអតិបរិមា\",\"required\":\"Required\",\"type\":\"ប្រភេទ\",\"typeText\":\"អត្ថបទ\",\"typePass\":\"ពាក្យសម្ងាត់\",\"typeEmail\":\"អ៊ីមែល\",\"typeSearch\":\"ស្វែង​រក\",\"typeTel\":\"លេខ​ទូរសព្ទ\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"ទម្រង់\",\"panelTitle\":\"ទម្រង់​កថាខណ្ឌ\",\"tag_address\":\"អាសយដ្ឋាន\",\"tag_div\":\"ធម្មតា (DIV)\",\"tag_h1\":\"ចំណង​ជើង 1\",\"tag_h2\":\"ចំណង​ជើង 2\",\"tag_h3\":\"ចំណង​ជើង 3\",\"tag_h4\":\"ចំណង​ជើង 4\",\"tag_h5\":\"ចំណង​ជើង 5\",\"tag_h6\":\"ចំណង​ជើង 6\",\"tag_p\":\"ធម្មតា\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"បន្ថែមបន្ទាត់ផ្តេក\"},\"iframe\":{\"border\":\"បង្ហាញ​បន្ទាត់​ស៊ុម\",\"noUrl\":\"សូម​បញ្ចូល URL របស់ iframe\",\"scrolling\":\"ប្រើ​របារ​រំកិល\",\"title\":\"លក្ខណៈ​សម្បត្តិ IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"អត្ថបទជំនួស\",\"border\":\"ស៊ុម\",\"btnUpload\":\"ផ្ញើ​ទៅ​ម៉ាស៊ីន​បម្រើ\",\"button2Img\":\"តើ​អ្នក​ចង់​ផ្លាស់​ប្ដូរ​ប៊ូតុង​រូបភាព​ដែល​បាន​ជ្រើស នៅ​លើ​រូបភាព​ធម្មតា​មួយ​មែនទេ?\",\"hSpace\":\"គម្លាត​ផ្ដេក\",\"img2Button\":\"តើ​អ្នក​ចង់​ផ្លាស់​ប្ដូរ​រូបភាព​ដែល​បាន​ជ្រើស នៅ​លើ​ប៊ូតុង​រូបភាព​មែនទេ?\",\"infoTab\":\"ពត៌មានអំពីរូបភាព\",\"linkTab\":\"តំណ\",\"lockRatio\":\"ចាក់​សោ​ផល​ធៀប\",\"menu\":\"លក្ខណៈ​រូបភាព\",\"resetSize\":\"កំណត់ទំហំឡើងវិញ\",\"title\":\"លក្ខណៈ​រូបភាព\",\"titleButton\":\"លក្ខណៈ​ប៊ូតុង​រូបភាព\",\"upload\":\"ផ្ទុកឡើង\",\"urlMissing\":\"ខ្វះ URL ប្រភព​រូប​ភាព។\",\"vSpace\":\"គម្លាត​បញ្ឈរ\",\"validateBorder\":\"ស៊ុម​ត្រូវ​តែ​ជា​លេខ។\",\"validateHSpace\":\"គម្លាត​ផ្ដេក​ត្រូវ​តែ​ជា​លេខ។\",\"validateVSpace\":\"គម្លាត​បញ្ឈរ​ត្រូវ​តែ​ជា​លេខ។\"},\"indent\":{\"indent\":\"បន្ថែមការចូលបន្ទាត់\",\"outdent\":\"បន្ថយការចូលបន្ទាត់\"},\"smiley\":{\"options\":\"ជម្រើស​រូប​សញ្ញា​អារម្មណ៍\",\"title\":\"បញ្ចូល​រូប​សញ្ញា​អារម្មណ៍\",\"toolbar\":\"រូប​សញ្ញ​អារម្មណ៍\"},\"justify\":{\"block\":\"តម្រឹម​ពេញ\",\"center\":\"កណ្ដាល\",\"left\":\"តម្រឹម​ឆ្វេង\",\"right\":\"តម្រឹម​ស្ដាំ\"},\"language\":{\"button\":\"កំណត់​ភាសា\",\"remove\":\"លុប​ភាសា\"},\"link\":{\"acccessKey\":\"សោរ​ចូល\",\"advanced\":\"កម្រិត​ខ្ពស់\",\"advisoryContentType\":\"ប្រភេទអត្ថបទ​ប្រឹក្សា\",\"advisoryTitle\":\"ចំណងជើង​ប្រឹក្សា\",\"anchor\":{\"toolbar\":\"យុថ្កា\",\"menu\":\"កែ​យុថ្កា\",\"title\":\"លក្ខណៈ​យុថ្កា\",\"name\":\"ឈ្មោះ​យុថ្កា\",\"errorName\":\"សូម​បញ្ចូល​ឈ្មោះ​យុថ្កា\",\"remove\":\"ដក​យុថ្កា​ចេញ\"},\"anchorId\":\"តាម ID ធាតុ\",\"anchorName\":\"តាម​ឈ្មោះ​យុថ្កា\",\"charset\":\"លេខកូតអក្សររបស់ឈ្នាប់\",\"cssClasses\":\"Stylesheet Classes\",\"emailAddress\":\"អាសយដ្ឋាន​អ៊ីមែល\",\"emailBody\":\"តួ​អត្ថបទ\",\"emailSubject\":\"ប្រធានបទ​សារ\",\"id\":\"Id\",\"info\":\"ព័ត៌មាន​ពី​តំណ\",\"langCode\":\"កូដ​ភាសា\",\"langDir\":\"ទិសដៅភាសា\",\"langDirLTR\":\"ពីឆ្វេងទៅស្តាំ(LTR)\",\"langDirRTL\":\"ពីស្តាំទៅឆ្វេង(RTL)\",\"menu\":\"កែ​តំណ\",\"name\":\"ឈ្មោះ\",\"noAnchors\":\"(មិន​មាន​យុថ្កា​នៅ​ក្នុង​ឯកសារ​អត្ថថបទ​ទេ)\",\"noEmail\":\"សូម​បញ្ចូល​អាសយដ្ឋាន​អ៊ីមែល\",\"noUrl\":\"សូម​បញ្ចូល​តំណ URL\",\"other\":\"<ផ្សេង​ទៀត>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"មុខ​ងារ​ផុស​ផ្ទាំង​វីនដូ​ឡើង\",\"popupFullScreen\":\"ពេញ​អេក្រង់ (IE)\",\"popupLeft\":\"ទីតាំងខាងឆ្វេង\",\"popupLocationBar\":\"របារ​ទីតាំង\",\"popupMenuBar\":\"របារ​ម៉ឺនុយ\",\"popupResizable\":\"អាច​ប្ដូរ​ទំហំ\",\"popupScrollBars\":\"របារ​រំកិល\",\"popupStatusBar\":\"របារ​ស្ថានភាព\",\"popupToolbar\":\"របារ​ឧបករណ៍\",\"popupTop\":\"ទីតាំង​កំពូល\",\"rel\":\"សម្ពន្ធ​ភាព\",\"selectAnchor\":\"រើស​យក​យុថ្កា​មួយ\",\"styles\":\"ស្ទីល\",\"tabIndex\":\"លេខ Tab\",\"target\":\"គោលដៅ\",\"targetFrame\":\"<ស៊ុម>\",\"targetFrameName\":\"ឈ្មោះ​ស៊ុម​ជា​គោល​ដៅ\",\"targetPopup\":\"<វីនដូ​ផុស​ឡើង>\",\"targetPopupName\":\"ឈ្មោះ​វីនដូត​ផុស​ឡើង\",\"title\":\"តំណ\",\"toAnchor\":\"ត​ភ្ជាប់​ទៅ​យុថ្កា​ក្នុង​អត្ថបទ\",\"toEmail\":\"អ៊ីមែល\",\"toUrl\":\"URL\",\"toolbar\":\"តំណ\",\"type\":\"ប្រភេទ​តំណ\",\"unlink\":\"ផ្ដាច់​តំណ\",\"upload\":\"ផ្ទុក​ឡើង\"},\"list\":{\"bulletedlist\":\"បញ្ចូល / លុប​បញ្ជី​ជា​ចំណុច​មូល\",\"numberedlist\":\"បញ្ចូល / លុប​បញ្ជី​ជា​លេខ\"},\"liststyle\":{\"armenian\":\"លេខ​អារមេនី\",\"bulletedTitle\":\"លក្ខណៈ​សម្បត្តិ​បញ្ជី​ជា​ចំណុច\",\"circle\":\"រង្វង់​មូល\",\"decimal\":\"លេខ​ទសភាគ (1, 2, 3, ...)\",\"decimalLeadingZero\":\"ទសភាគ​ចាប់​ផ្ដើម​ពី​សូន្យ (01, 02, 03, ...)\",\"disc\":\"ថាស\",\"georgian\":\"លេខ​ចចជា (an, ban, gan, ...)\",\"lowerAlpha\":\"ព្យញ្ជនៈ​តូច (a, b, c, d, e, ...)\",\"lowerGreek\":\"លេខ​ក្រិក​តូច (alpha, beta, gamma, ...)\",\"lowerRoman\":\"លេខ​រ៉ូម៉ាំង​តូច (i, ii, iii, iv, v, ...)\",\"none\":\"គ្មាន\",\"notset\":\"<not set>\",\"numberedTitle\":\"លក្ខណៈ​សម្បត្តិ​បញ្ជី​ជា​លេខ\",\"square\":\"ការេ\",\"start\":\"ចាប់​ផ្ដើម\",\"type\":\"ប្រភេទ\",\"upperAlpha\":\"អក្សរ​ធំ (A, B, C, D, E, ...)\",\"upperRoman\":\"លេខ​រ៉ូម៉ាំង​ធំ (I, II, III, IV, V, ...)\",\"validateStartNumber\":\"លេខ​ចាប់​ផ្ដើម​បញ្ជី ត្រូវ​តែ​ជា​តួ​លេខ​ពិត​ប្រាកដ។\"},\"magicline\":{\"title\":\"បញ្ចូល​កថាខណ្ឌ​នៅ​ទីនេះ\"},\"maximize\":{\"maximize\":\"ពង្រីក​អតិបរមា\",\"minimize\":\"បង្រួម​អប្បបរមា\"},\"newpage\":{\"toolbar\":\"ទំព័រ​ថ្មី\"},\"pagebreak\":{\"alt\":\"បំបែក​ទំព័រ\",\"toolbar\":\"បន្ថែម​ការ​បំបែក​ទំព័រ​មុន​បោះពុម្ព\"},\"pastetext\":{\"button\":\"បិទ​ភ្ជាប់​ជា​អត្ថបទ​ធម្មតា\",\"title\":\"បិទ​ភ្ជាប់​ជា​អត្ថបទ​ធម្មតា\"},\"pastefromword\":{\"confirmCleanup\":\"អត្ថបទ​ដែល​អ្នក​ចង់​បិទ​ភ្ជាប់​នេះ ទំនង​ដូច​ជា​ចម្លង​មក​ពី Word។ តើ​អ្នក​ចង់​សម្អាត​វា​មុន​បិទ​ភ្ជាប់​ទេ?\",\"error\":\"ដោយ​សារ​មាន​បញ្ហា​ផ្នែក​ក្នុង​ធ្វើ​ឲ្យ​មិន​អាច​សម្អាត​ទិន្នន័យ​ដែល​បាន​បិទ​ភ្ជាប់\",\"title\":\"បិទ​ភ្ជាប់​ពី Word\",\"toolbar\":\"បិទ​ភ្ជាប់​ពី Word\"},\"preview\":{\"preview\":\"មើល​ជា​មុន\"},\"print\":{\"toolbar\":\"បោះពុម្ព\"},\"removeformat\":{\"toolbar\":\"ជម្រះ​ទ្រង់​ទ្រាយ\"},\"save\":{\"toolbar\":\"រក្សាទុក\"},\"selectall\":{\"toolbar\":\"រើស​ទាំង​អស់\"},\"showblocks\":{\"toolbar\":\"បង្ហាញ​ប្លក់\"},\"sourcearea\":{\"toolbar\":\"អក្សរ​កូដ\"},\"specialchar\":{\"options\":\"ជម្រើស​តួ​អក្សរ​ពិសេស\",\"title\":\"រើស​តួអក្សរ​ពិសេស\",\"toolbar\":\"បន្ថែមអក្សរពិសេស\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"រចនាបថ\",\"panelTitle\":\"ទ្រង់ទ្រាយ​រចនាបថ\",\"panelTitle1\":\"រចនាបថ​ប្លក់\",\"panelTitle2\":\"រចនាបថ​ក្នុង​ជួរ\",\"panelTitle3\":\"រចនាបថ​វត្ថុ\"},\"table\":{\"border\":\"ទំហំ​បន្ទាត់​ស៊ុម\",\"caption\":\"ចំណងជើង\",\"cell\":{\"menu\":\"ក្រឡា\",\"insertBefore\":\"បញ្ចូល​ក្រឡា​ពីមុខ\",\"insertAfter\":\"បញ្ចូល​ក្រឡា​ពី​ក្រោយ\",\"deleteCell\":\"លុប​ក្រឡា\",\"merge\":\"បញ្ចូល​ក្រឡា​ចូល​គ្នា\",\"mergeRight\":\"បញ្ចូល​គ្នា​ខាង​ស្ដាំ\",\"mergeDown\":\"បញ្ចូល​គ្នា​ចុះ​ក្រោម\",\"splitHorizontal\":\"ពុះ​ក្រឡា​ផ្ដេក\",\"splitVertical\":\"ពុះ​ក្រឡា​បញ្ឈរ\",\"title\":\"លក្ខណៈ​ក្រឡា\",\"cellType\":\"ប្រភេទ​ក្រឡា\",\"rowSpan\":\"ចំនួន​ជួរ​ដេក​លាយ​ចូល​គ្នា\",\"colSpan\":\"ចំនួន​ជួរ​ឈរ​លាយ​ចូល​គ្នា\",\"wordWrap\":\"រុំ​ពាក្យ\",\"hAlign\":\"ការ​តម្រឹម​ផ្ដេក\",\"vAlign\":\"ការ​តម្រឹម​បញ្ឈរ\",\"alignBaseline\":\"ខ្សែ​បន្ទាត់​គោល\",\"bgColor\":\"ពណ៌​ផ្ទៃ​ក្រោយ\",\"borderColor\":\"ពណ៌​បន្ទាត់​ស៊ុម\",\"data\":\"ទិន្នន័យ\",\"header\":\"ក្បាល\",\"yes\":\"ព្រម\",\"no\":\"ទេ\",\"invalidWidth\":\"ទទឹង​ក្រឡា​ត្រូវ​តែ​ជា​លេខ។\",\"invalidHeight\":\"កម្ពស់​ក្រឡា​ត្រូវ​តែ​ជា​លេខ។\",\"invalidRowSpan\":\"ចំនួន​ជួរ​ដេក​លាយ​ចូល​គ្នា​ត្រូវ​តែ​ជា​លេខ​ទាំង​អស់។\",\"invalidColSpan\":\"ចំនួន​ជួរ​ឈរ​លាយ​ចូល​គ្នា​ត្រូវ​តែ​ជា​លេខ​ទាំង​អស់។\",\"chooseColor\":\"រើស\"},\"cellPad\":\"ចន្លោះ​ក្រឡា\",\"cellSpace\":\"គម្លាត​ក្រឡា\",\"column\":{\"menu\":\"ជួរ​ឈរ\",\"insertBefore\":\"បញ្ចូល​ជួរ​ឈរ​ពីមុខ\",\"insertAfter\":\"បញ្ចូល​ជួរ​ឈរ​ពី​ក្រោយ\",\"deleteColumn\":\"លុប​ជួរ​ឈរ\"},\"columns\":\"ជួរឈរ\",\"deleteTable\":\"លុប​តារាង\",\"headers\":\"ក្បាល\",\"headersBoth\":\"ទាំង​ពីរ\",\"headersColumn\":\"ជួរ​ឈរ​ដំបូង\",\"headersNone\":\"មិន​មាន\",\"headersRow\":\"ជួរ​ដេក​ដំបូង\",\"invalidBorder\":\"ទំហំ​បន្ទាត់​ស៊ុម​ត្រូវ​តែ​ជា​លេខ។\",\"invalidCellPadding\":\"ចន្លោះ​ក្រឡា​ត្រូវ​តែជា​លេខ​វិជ្ជមាន។\",\"invalidCellSpacing\":\"គម្លាត​ក្រឡា​ត្រូវ​តែ​ជា​លេខ​វិជ្ជមាន។\",\"invalidCols\":\"ចំនួន​ជួរ​ឈរ​ត្រូវ​តែ​ជា​លេខ​ធំ​ជាង 0។\",\"invalidHeight\":\"កម្ពស់​តារាង​ត្រូវ​តែ​ជា​លេខ\",\"invalidRows\":\"ចំនួន​ជួរ​ដេក​ត្រូវ​តែ​ជា​លេខ​ធំ​ជាង 0។\",\"invalidWidth\":\"ទទឹង​តារាង​ត្រូវ​តែ​ជា​លេខ។\",\"menu\":\"លក្ខណៈ​តារាង\",\"row\":{\"menu\":\"ជួរ​ដេក\",\"insertBefore\":\"បញ្ចូល​ជួរ​ដេក​ពីមុខ\",\"insertAfter\":\"បញ្ចូល​ជួរ​ដេក​ពី​ក្រោយ\",\"deleteRow\":\"លុប​ជួរ​ដេក\"},\"rows\":\"ជួរ​ដេក\",\"summary\":\"សេចក្តី​សង្ខេប\",\"title\":\"លក្ខណៈ​តារាង\",\"toolbar\":\"តារាង\",\"widthPc\":\"ភាគរយ\",\"widthPx\":\"ភីកសែល\",\"widthUnit\":\"ឯកតា​ទទឹង\"},\"undo\":{\"redo\":\"ធ្វើ​ឡើង​វិញ\",\"undo\":\"មិន​ធ្វើ​វិញ\"},\"wsc\":{\"btnIgnore\":\"មិនផ្លាស់ប្តូរ\",\"btnIgnoreAll\":\"មិនផ្លាស់ប្តូរ ទាំងអស់\",\"btnReplace\":\"ជំនួស\",\"btnReplaceAll\":\"ជំនួសទាំងអស់\",\"btnUndo\":\"សារឡើងវិញ\",\"changeTo\":\"ផ្លាស់ប្តូរទៅ\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"ពុំមានកម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធ ។ តើចង់ទាញយកពីណា?\",\"manyChanges\":\"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្តូរ\",\"noChanges\":\"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពុំមានផ្លាស់ប្តូរ\",\"noMispell\":\"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: គ្មានកំហុស\",\"noSuggestions\":\"- គ្មានសំណើរ -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"គ្មានក្នុងវចនានុក្រម\",\"oneChange\":\"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពាក្យមួយត្រូចបានផ្លាស់ប្តូរ\",\"progress\":\"កំពុងពិនិត្យអក្ខរាវិរុទ្ធ...\",\"title\":\"Spell Checker\",\"toolbar\":\"ពិនិត្យអក្ខរាវិរុទ្ធ\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ko.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ko']={\"editor\":\"리치 텍스트 편집기\",\"editorPanel\":\"리치 텍스트 편집기 패널\",\"common\":{\"editorHelp\":\"도움이 필요하면 ALT 0 을 누르세요\",\"browseServer\":\"서버 보기\",\"url\":\"URL\",\"protocol\":\"프로토콜\",\"upload\":\"업로드\",\"uploadSubmit\":\"서버로 전송\",\"image\":\"이미지\",\"flash\":\"플래시\",\"form\":\"폼\",\"checkbox\":\"체크 박스\",\"radio\":\"라디오 버튼\",\"textField\":\"한 줄 입력 칸\",\"textarea\":\"여러 줄 입력 칸\",\"hiddenField\":\"숨은 입력 칸\",\"button\":\"버튼\",\"select\":\"선택 목록\",\"imageButton\":\"이미지 버튼\",\"notSet\":\"<설정 안 됨>\",\"id\":\"ID\",\"name\":\"이름\",\"langDir\":\"언어 방향\",\"langDirLtr\":\"왼쪽에서 오른쪽 (LTR)\",\"langDirRtl\":\"오른쪽에서 왼쪽 (RTL)\",\"langCode\":\"언어 코드\",\"longDescr\":\"웹 주소 설명\",\"cssClass\":\"스타일 시트 클래스\",\"advisoryTitle\":\"보조 제목\",\"cssStyle\":\"스타일\",\"ok\":\"확인\",\"cancel\":\"취소\",\"close\":\"닫기\",\"preview\":\"미리보기\",\"resize\":\"크기 조절\",\"generalTab\":\"일반\",\"advancedTab\":\"자세히\",\"validateNumberFailed\":\"이 값은 숫자가 아닙니다.\",\"confirmNewPage\":\"저장하지 않은 모든 변경사항은 유실됩니다. 정말로 새로운 페이지를 부르겠습니까?\",\"confirmCancel\":\"일부 옵션이 변경 되었습니다. 정말로 창을 닫겠습니까?\",\"options\":\"옵션\",\"target\":\"타겟\",\"targetNew\":\"새 창 (_blank)\",\"targetTop\":\"최상위 창 (_top)\",\"targetSelf\":\"같은 창 (_self)\",\"targetParent\":\"부모 창 (_parent)\",\"langDirLTR\":\"왼쪽에서 오른쪽 (LTR)\",\"langDirRTL\":\"오른쪽에서 왼쪽 (RTL)\",\"styles\":\"스타일\",\"cssClasses\":\"스타일 시트 클래스\",\"width\":\"너비\",\"height\":\"높이\",\"align\":\"정렬\",\"alignLeft\":\"왼쪽\",\"alignRight\":\"오른쪽\",\"alignCenter\":\"가운데\",\"alignJustify\":\"양쪽 맞춤\",\"alignTop\":\"위\",\"alignMiddle\":\"중간\",\"alignBottom\":\"아래\",\"alignNone\":\"기본\",\"invalidValue\":\"잘못된 값.\",\"invalidHeight\":\"높이는 숫자여야 합니다.\",\"invalidWidth\":\"넓이는 숫자여야 합니다.\",\"invalidCssLength\":\"\\\"%1\\\" 값은 유효한 CSS 측정 단위(px, %, in, cm, mm, em, ex, pt, or pc)를 포함하거나 포함하지 않은 양수 여야 합니다.\",\"invalidHtmlLength\":\"\\\"%1\\\" 값은 유효한 HTML 측정 단위(px or %)를 포함하거나 포함하지 않은 양수여야 합니다.\",\"invalidInlineStyle\":\"인라인 스타일에 설정된 값은 \\\"name : value\\\" 형식을 가진 하나 이상의 투플(tuples)이 세미콜론(;)으로 구분되어 구성되어야 합니다.\",\"cssLengthTooltip\":\"픽셀 단위의 숫자만 입력하시거나 유효한 CSS 단위(px, %, in, cm, mm, em, ex, pt, or pc)와 함께 숫자를 입력해주세요.\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, 사용불가</span>\"},\"about\":{\"copy\":\"저작권 &copy; $1 . 판권 소유.\",\"dlgTitle\":\"CKEditor 에 대하여\",\"help\":\"도움이 필요하시면 $1 를 확인하세요.\",\"moreInfo\":\"라이선스에 대한 정보는 저희 웹 사이트를 참고하세요:\",\"title\":\"CKEditor에 대하여\",\"userGuide\":\"CKEditor 사용설명서\"},\"basicstyles\":{\"bold\":\"굵게\",\"italic\":\"기울임꼴\",\"strike\":\"취소선\",\"subscript\":\"아래 첨자\",\"superscript\":\"위 첨자\",\"underline\":\"밑줄\"},\"bidi\":{\"ltr\":\"텍스트 방향이 왼쪽에서 오른쪽으로 \",\"rtl\":\"텍스트 방향이 오른쪽에서 왼쪽으로\"},\"blockquote\":{\"toolbar\":\"인용 단락\"},\"clipboard\":{\"copy\":\"복사\",\"copyError\":\"브라우저의 보안설정 때문에 복사할 수 없습니다. 키보드(Ctrl/Cmd+C)를 이용해서 복사하십시오.\",\"cut\":\"잘라내기\",\"cutError\":\"브라우저의 보안설정 때문에 잘라내기 기능을 실행할 수 없습니다. 키보드(Ctrl/Cmd+X)를 이용해서 잘라내기 하십시오\",\"paste\":\"붙여넣기\",\"pasteArea\":\"붙여넣기 범위\",\"pasteMsg\":\"키보드(<strong>Ctrl/Cmd+V</strong>)를 이용해서 상자안에 붙여넣고 <strong>확인</strong> 를 누르세요.\",\"securityMsg\":\"브라우저 보안 설정으로 인해, 클립보드에 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.\",\"title\":\"붙여넣기\"},\"button\":{\"selectedLabel\":\"%1 (선택됨)\"},\"colorbutton\":{\"auto\":\"기본 색상\",\"bgColorTitle\":\"배경 색상\",\"colors\":{\"000\":\"검정\",\"800000\":\"밤색\",\"8B4513\":\"새들 브라운\",\"2F4F4F\":\"다크 슬레이트 그레이\",\"008080\":\"틸\",\"000080\":\"네이비\",\"4B0082\":\"남색\",\"696969\":\"짙은 회색\",\"B22222\":\"벽돌색\",\"A52A2A\":\"갈색\",\"DAA520\":\"골든 로드\",\"006400\":\"암록색\",\"40E0D0\":\"터코이즈\",\"0000CD\":\"미디엄 블루\",\"800080\":\"보라\",\"808080\":\"회색\",\"F00\":\"빨강\",\"FF8C00\":\"짙은 주황\",\"FFD700\":\"금색\",\"008000\":\"녹색\",\"0FF\":\"시안\",\"00F\":\"파랑\",\"EE82EE\":\"남보라\",\"A9A9A9\":\"딤 그레이\",\"FFA07A\":\"라이트 새먼\",\"FFA500\":\"주황\",\"FFFF00\":\"노랑\",\"00FF00\":\"라임\",\"AFEEEE\":\"패일 터코이즈\",\"ADD8E6\":\"연한 파랑\",\"DDA0DD\":\"자두\",\"D3D3D3\":\"연한 회색\",\"FFF0F5\":\"라벤더 블러쉬\",\"FAEBD7\":\"앤틱 화이트\",\"FFFFE0\":\"연한 노랑\",\"F0FFF0\":\"허니듀\",\"F0FFFF\":\"하늘색\",\"F0F8FF\":\"앨리스 블루\",\"E6E6FA\":\"라벤더\",\"FFF\":\"흰색\"},\"more\":\"색상 선택...\",\"panelTitle\":\"색상\",\"textColorTitle\":\"글자 색상\"},\"colordialog\":{\"clear\":\"비우기\",\"highlight\":\"강조\",\"options\":\"색상 옵션\",\"selected\":\"선택된 색상\",\"title\":\"색상 선택\"},\"templates\":{\"button\":\"템플릿\",\"emptyListMsg\":\"(템플릿이 없습니다)\",\"insertOption\":\"현재 내용 바꾸기\",\"options\":\"템플릿 옵션\",\"selectPromptMsg\":\"에디터에서 사용할 템플릿을 선택하십시오\",\"title\":\"내용 템플릿\"},\"contextmenu\":{\"options\":\"컨텍스트 메뉴 옵션\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"보조 제목\",\"cssClassInputLabel\":\"스타일 시트 클래스\",\"edit\":\"Div 편집\",\"inlineStyleInputLabel\":\"인라인 스타일\",\"langDirLTRLabel\":\"왼쪽에서 오른쪽 (LTR)\",\"langDirLabel\":\"언어 방향\",\"langDirRTLLabel\":\"오른쪽에서 왼쪽 (RTL)\",\"languageCodeInputLabel\":\" 언어 코드\",\"remove\":\"Div 태그 삭제\",\"styleSelectLabel\":\"스타일\",\"title\":\"Div 태그 생성\",\"toolbar\":\"Div 태그 생성\"},\"toolbar\":{\"toolbarCollapse\":\"툴바 줄이기\",\"toolbarExpand\":\"툴바 확장\",\"toolbarGroups\":{\"document\":\"문서\",\"clipboard\":\"클립보드/실행 취소\",\"editing\":\"편집\",\"forms\":\"폼\",\"basicstyles\":\"기본 스타일\",\"paragraph\":\"단락\",\"links\":\"링크\",\"insert\":\"삽입\",\"styles\":\"스타일\",\"colors\":\"색상\",\"tools\":\"도구\"},\"toolbars\":\"에디터 툴바\"},\"elementspath\":{\"eleLabel\":\"요소 경로\",\"eleTitle\":\"%1 요소\"},\"find\":{\"find\":\"찾기\",\"findOptions\":\"찾기 조건\",\"findWhat\":\"찾을 내용:\",\"matchCase\":\"대소문자 구분\",\"matchCyclic\":\"되돌이 검색\",\"matchWord\":\"온전한 단어\",\"notFoundMsg\":\"문자열을 찾을 수 없습니다.\",\"replace\":\"바꾸기\",\"replaceAll\":\"모두 바꾸기\",\"replaceSuccessMsg\":\"%1개의 항목이 바뀌었습니다.\",\"replaceWith\":\"바꿀 내용:\",\"title\":\"찾기 및 바꾸기\"},\"fakeobjects\":{\"anchor\":\"책갈피\",\"flash\":\"플래시 애니메이션\",\"hiddenfield\":\"숨은 입력 칸\",\"iframe\":\"아이프레임\",\"unknown\":\"알 수 없는 객체\"},\"flash\":{\"access\":\"스크립트 허용\",\"accessAlways\":\"항상 허용\",\"accessNever\":\"허용 안함\",\"accessSameDomain\":\"같은 도메인 허용\",\"alignAbsBottom\":\"아래\",\"alignAbsMiddle\":\"중간\",\"alignBaseline\":\"영문 글꼴 기준선\",\"alignTextTop\":\"글자 상단\",\"bgcolor\":\"배경 색상\",\"chkFull\":\"전체화면 허용\",\"chkLoop\":\"반복\",\"chkMenu\":\"플래시 메뉴 활성화\",\"chkPlay\":\"자동 재생\",\"flashvars\":\"플래시 변수\",\"hSpace\":\"가로 여백\",\"properties\":\"플래시 속성\",\"propertiesTab\":\"속성\",\"quality\":\"품질\",\"qualityAutoHigh\":\"자동 높음\",\"qualityAutoLow\":\"자동 낮음\",\"qualityBest\":\"최고\",\"qualityHigh\":\"높음\",\"qualityLow\":\"낮음\",\"qualityMedium\":\"중간\",\"scale\":\"배율\",\"scaleAll\":\"모두 보기\",\"scaleFit\":\"맞춤\",\"scaleNoBorder\":\"테두리 없음\",\"title\":\"플래시 속성\",\"vSpace\":\"세로 여백\",\"validateHSpace\":\"가로 여백은 숫자여야 합니다.\",\"validateSrc\":\"링크 주소(URL)를 입력하십시오.\",\"validateVSpace\":\"세로 여백은 숫자여야 합니다.\",\"windowMode\":\"윈도우 모드\",\"windowModeOpaque\":\"불투명\",\"windowModeTransparent\":\"투명\",\"windowModeWindow\":\"윈도우\"},\"font\":{\"fontSize\":{\"label\":\"크기\",\"voiceLabel\":\"글자 크기\",\"panelTitle\":\"글자 크기\"},\"label\":\"글꼴\",\"panelTitle\":\"글꼴\",\"voiceLabel\":\"글꼴\"},\"forms\":{\"button\":{\"title\":\"버튼 속성\",\"text\":\"글자 (값)\",\"type\":\"종류\",\"typeBtn\":\"버튼\",\"typeSbm\":\"제출\",\"typeRst\":\"재설정\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"체크 박스 속성\",\"radioTitle\":\"라디오 버튼 속성\",\"value\":\"값\",\"selected\":\"선택됨\",\"required\":\"필수 항목\"},\"form\":{\"title\":\"폼 속성\",\"menu\":\"폼 속성\",\"action\":\"실행 경로(Action)\",\"method\":\"방법(Method)\",\"encoding\":\"인코딩\"},\"hidden\":{\"title\":\"숨은 입력 칸 속성\",\"name\":\"이름\",\"value\":\"값\"},\"select\":{\"title\":\"선택 목록 속성\",\"selectInfo\":\"선택 정보\",\"opAvail\":\"옵션\",\"value\":\"값\",\"size\":\"크기\",\"lines\":\"줄\",\"chkMulti\":\"여러 항목 선택 허용\",\"required\":\"필수 항목\",\"opText\":\"이름\",\"opValue\":\"값\",\"btnAdd\":\"추가\",\"btnModify\":\"수정\",\"btnUp\":\"위\",\"btnDown\":\"아래\",\"btnSetValue\":\"선택된 것으로 설정\",\"btnDelete\":\"삭제\"},\"textarea\":{\"title\":\"여러 줄 입력 칸 속성\",\"cols\":\"칸 수\",\"rows\":\"줄 수\"},\"textfield\":{\"title\":\"한 줄 입력 칸 속성\",\"name\":\"이름\",\"value\":\"값\",\"charWidth\":\"글자 너비\",\"maxChars\":\"최대 글자 수\",\"required\":\"필수 항목\",\"type\":\"형식\",\"typeText\":\"문자열\",\"typePass\":\"비밀번호\",\"typeEmail\":\"이메일\",\"typeSearch\":\"검색\",\"typeTel\":\"전화번호\",\"typeUrl\":\"웹 주소(URL)\"}},\"format\":{\"label\":\"문단\",\"panelTitle\":\"문단 형식\",\"tag_address\":\"글쓴이\",\"tag_div\":\"기본 (DIV)\",\"tag_h1\":\"제목 1\",\"tag_h2\":\"제목 2\",\"tag_h3\":\"제목 3\",\"tag_h4\":\"제목 4\",\"tag_h5\":\"제목 5\",\"tag_h6\":\"제목 6\",\"tag_p\":\"본문\",\"tag_pre\":\"정형 문단\"},\"horizontalrule\":{\"toolbar\":\"가로 줄 삽입\"},\"iframe\":{\"border\":\"프레임 테두리 표시\",\"noUrl\":\"아이프레임 주소(URL)를 입력해주세요.\",\"scrolling\":\"스크롤바 사용\",\"title\":\"아이프레임 속성\",\"toolbar\":\"아이프레임\"},\"image\":{\"alt\":\"대체 문자열\",\"border\":\"테두리\",\"btnUpload\":\"서버로 전송\",\"button2Img\":\"단순 이미지에서 선택한 이미지 버튼을 변환하시겠습니까?\",\"hSpace\":\"가로 여백\",\"img2Button\":\"이미지 버튼에 선택한 이미지를 변환하시겠습니까?\",\"infoTab\":\"이미지 정보\",\"linkTab\":\"링크\",\"lockRatio\":\"비율 유지\",\"menu\":\"이미지 속성\",\"resetSize\":\"원래 크기로\",\"title\":\"이미지 속성\",\"titleButton\":\"이미지 버튼 속성\",\"upload\":\"업로드\",\"urlMissing\":\"이미지 원본 주소(URL)가 없습니다.\",\"vSpace\":\"세로 여백\",\"validateBorder\":\"테두리 두께는 정수여야 합니다.\",\"validateHSpace\":\"가로 길이는 정수여야 합니다.\",\"validateVSpace\":\"세로 길이는 정수여야 합니다.\"},\"indent\":{\"indent\":\"들여쓰기\",\"outdent\":\"내어쓰기\"},\"smiley\":{\"options\":\"이모티콘 옵션\",\"title\":\"이모티콘 삽입\",\"toolbar\":\"이모티콘\"},\"justify\":{\"block\":\"양쪽 맞춤\",\"center\":\"가운데 정렬\",\"left\":\"왼쪽 정렬\",\"right\":\"오른쪽 정렬\"},\"language\":{\"button\":\"언어 설정\",\"remove\":\"언어 설정 지우기\"},\"link\":{\"acccessKey\":\"액세스 키\",\"advanced\":\"고급\",\"advisoryContentType\":\"보조 콘텐츠 유형\",\"advisoryTitle\":\"보조 제목\",\"anchor\":{\"toolbar\":\"책갈피\",\"menu\":\"책갈피 편집\",\"title\":\"책갈피 속성\",\"name\":\"책갈피 이름\",\"errorName\":\"책갈피 이름을 입력하십시오\",\"remove\":\"책갈피 제거\"},\"anchorId\":\"책갈피 ID\",\"anchorName\":\"책갈피 이름\",\"charset\":\"링크된 자료 문자열 인코딩\",\"cssClasses\":\"스타일시트 클래스\",\"emailAddress\":\"이메일 주소\",\"emailBody\":\"메시지 내용\",\"emailSubject\":\"메시지 제목\",\"id\":\"ID\",\"info\":\"링크 정보\",\"langCode\":\"언어 코드\",\"langDir\":\"언어 방향\",\"langDirLTR\":\"왼쪽에서 오른쪽 (LTR)\",\"langDirRTL\":\"오른쪽에서 왼쪽 (RTL)\",\"menu\":\"링크 수정\",\"name\":\"이름\",\"noAnchors\":\"(문서에 책갈피가 없습니다.)\",\"noEmail\":\"이메일 주소를 입력하십시오\",\"noUrl\":\"링크 주소(URL)를 입력하십시오\",\"other\":\"<기타>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"팝업창 속성\",\"popupFullScreen\":\"전체화면 (IE)\",\"popupLeft\":\"왼쪽 위치\",\"popupLocationBar\":\"주소 표시줄\",\"popupMenuBar\":\"메뉴 바\",\"popupResizable\":\"크기 조절 가능\",\"popupScrollBars\":\"스크롤 바\",\"popupStatusBar\":\"상태 바\",\"popupToolbar\":\"툴바\",\"popupTop\":\"위쪽 위치\",\"rel\":\"관계\",\"selectAnchor\":\"책갈피 선택\",\"styles\":\"스타일\",\"tabIndex\":\"탭 순서\",\"target\":\"타겟\",\"targetFrame\":\"<프레임>\",\"targetFrameName\":\"타겟 프레임 이름\",\"targetPopup\":\"<팝업 창>\",\"targetPopupName\":\"팝업 창 이름\",\"title\":\"링크\",\"toAnchor\":\"책갈피\",\"toEmail\":\"이메일\",\"toUrl\":\"주소(URL)\",\"toolbar\":\"링크 삽입/변경\",\"type\":\"링크 종류\",\"unlink\":\"링크 지우기\",\"upload\":\"업로드\"},\"list\":{\"bulletedlist\":\"순서 없는 목록\",\"numberedlist\":\"순서 있는 목록\"},\"liststyle\":{\"armenian\":\"아르메니아 숫자\",\"bulletedTitle\":\"순서 없는 목록 속성\",\"circle\":\"원\",\"decimal\":\"수 (1, 2, 3, 등)\",\"decimalLeadingZero\":\"0이 붙은 수 (01, 02, 03, 등)\",\"disc\":\"내림차순\",\"georgian\":\"그루지야 숫자 (an, ban, gan, 등)\",\"lowerAlpha\":\"영소문자 (a, b, c, d, e, 등)\",\"lowerGreek\":\"그리스 소문자 (alpha, beta, gamma, 등)\",\"lowerRoman\":\"로마 소문자 (i, ii, iii, iv, v, 등)\",\"none\":\"없음\",\"notset\":\"<설정 없음>\",\"numberedTitle\":\"순서 있는 목록 속성\",\"square\":\"사각\",\"start\":\"시작\",\"type\":\"유형\",\"upperAlpha\":\"영대문자 (A, B, C, D, E, 등)\",\"upperRoman\":\"로마 대문자 (I, II, III, IV, V, 등)\",\"validateStartNumber\":\"목록 시작 숫자는 정수여야 합니다.\"},\"magicline\":{\"title\":\"여기에 단락 삽입\"},\"maximize\":{\"maximize\":\"최대화\",\"minimize\":\"최소화\"},\"newpage\":{\"toolbar\":\"새 페이지\"},\"pagebreak\":{\"alt\":\"페이지 나누기\",\"toolbar\":\"인쇄시 페이지 나누기 삽입\"},\"pastetext\":{\"button\":\"텍스트로 붙여넣기\",\"title\":\"텍스트로 붙여넣기\"},\"pastefromword\":{\"confirmCleanup\":\"붙여 넣을 내용은 MS Word에서 복사 한 것입니다. 붙여 넣기 전에 정리 하시겠습니까?\",\"error\":\"내부 오류로 붙여 넣은 데이터를 정리 할 수 없습니다.\",\"title\":\"MS Word 에서 붙여넣기\",\"toolbar\":\"MS Word 에서 붙여넣기\"},\"preview\":{\"preview\":\"미리보기\"},\"print\":{\"toolbar\":\"인쇄\"},\"removeformat\":{\"toolbar\":\"형식 지우기\"},\"save\":{\"toolbar\":\"저장\"},\"selectall\":{\"toolbar\":\"모두 선택\"},\"showblocks\":{\"toolbar\":\"블록 보기\"},\"sourcearea\":{\"toolbar\":\"소스\"},\"specialchar\":{\"options\":\"특수문자 옵션\",\"title\":\"특수문자 선택\",\"toolbar\":\"특수문자 삽입\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"스타일\",\"panelTitle\":\"전체 구성 스타일\",\"panelTitle1\":\"블록 스타일\",\"panelTitle2\":\"인라인 스타일\",\"panelTitle3\":\"객체 스타일\"},\"table\":{\"border\":\"테두리 두께\",\"caption\":\"주석\",\"cell\":{\"menu\":\"셀\",\"insertBefore\":\"앞에 셀 삽입\",\"insertAfter\":\"뒤에 셀 삽입\",\"deleteCell\":\"셀 삭제\",\"merge\":\"셀 합치기\",\"mergeRight\":\"오른쪽 합치기\",\"mergeDown\":\"왼쪽 합치기\",\"splitHorizontal\":\"수평 나누기\",\"splitVertical\":\"수직 나누기\",\"title\":\"셀 속성\",\"cellType\":\"셀 종류\",\"rowSpan\":\"행 간격\",\"colSpan\":\"열 간격\",\"wordWrap\":\"줄 끝 단어 줄 바꿈\",\"hAlign\":\"가로 정렬\",\"vAlign\":\"세로 정렬\",\"alignBaseline\":\"영문 글꼴 기준선\",\"bgColor\":\"배경색\",\"borderColor\":\"테두리 색\",\"data\":\"자료\",\"header\":\"머릿칸\",\"yes\":\"예\",\"no\":\"아니오\",\"invalidWidth\":\"셀 너비는 숫자여야 합니다.\",\"invalidHeight\":\"셀 높이는 숫자여야 합니다.\",\"invalidRowSpan\":\"행 간격은 정수여야 합니다.\",\"invalidColSpan\":\"열 간격은 정수여야 합니다.\",\"chooseColor\":\"선택\"},\"cellPad\":\"셀 여백\",\"cellSpace\":\"셀 간격\",\"column\":{\"menu\":\"열\",\"insertBefore\":\"왼쪽에 열 삽입\",\"insertAfter\":\"오른쪽에 열 삽입\",\"deleteColumn\":\"열 삭제\"},\"columns\":\"열\",\"deleteTable\":\"표 삭제\",\"headers\":\"머릿칸\",\"headersBoth\":\"모두\",\"headersColumn\":\"첫 열\",\"headersNone\":\"없음\",\"headersRow\":\"첫 행\",\"invalidBorder\":\"테두리 두께는 숫자여야 합니다.\",\"invalidCellPadding\":\"셀 여백은 0 이상이어야 합니다.\",\"invalidCellSpacing\":\"셀 간격은 0 이상이어야 합니다.\",\"invalidCols\":\"열 번호는 0보다 커야 합니다.\",\"invalidHeight\":\"표 높이는 숫자여야 합니다.\",\"invalidRows\":\"행 번호는 0보다 커야 합니다.\",\"invalidWidth\":\"표의 너비는 숫자여야 합니다.\",\"menu\":\"표 속성\",\"row\":{\"menu\":\"행\",\"insertBefore\":\"위에 행 삽입\",\"insertAfter\":\"아래에 행 삽입\",\"deleteRow\":\"행 삭제\"},\"rows\":\"행\",\"summary\":\"요약\",\"title\":\"표 속성\",\"toolbar\":\"표\",\"widthPc\":\"백분율\",\"widthPx\":\"픽셀\",\"widthUnit\":\"너비 단위\"},\"undo\":{\"redo\":\"다시 실행\",\"undo\":\"실행 취소\"},\"wsc\":{\"btnIgnore\":\"건너뜀\",\"btnIgnoreAll\":\"모두 건너뜀\",\"btnReplace\":\"변경\",\"btnReplaceAll\":\"모두 변경\",\"btnUndo\":\"취소\",\"changeTo\":\"변경할 단어\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"철자 검사기가 철치되지 않았습니다. 지금 다운로드하시겠습니까?\",\"manyChanges\":\"철자검사 완료: %1 단어가 변경되었습니다.\",\"noChanges\":\"철자검사 완료: 변경된 단어가 없습니다.\",\"noMispell\":\"철자검사 완료: 잘못된 철자가 없습니다.\",\"noSuggestions\":\"- 추천단어 없음 -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"사전에 없는 단어\",\"oneChange\":\"철자검사 완료: 단어가 변경되었습니다.\",\"progress\":\"철자검사를 진행중입니다...\",\"title\":\"Spell Check\",\"toolbar\":\"철자검사\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ku.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ku']={\"editor\":\"سەرنووسەی دەقی تەواو\",\"editorPanel\":\"بڕگەی سەرنووسەی دەقی تەواو\",\"common\":{\"editorHelp\":\"کلیکی ALT لەگەڵ 0 بکه‌ بۆ یارمەتی\",\"browseServer\":\"هێنانی ڕاژە\",\"url\":\"ناونیشانی بەستەر\",\"protocol\":\"پڕۆتۆکۆڵ\",\"upload\":\"بارکردن\",\"uploadSubmit\":\"ناردنی بۆ ڕاژە\",\"image\":\"وێنە\",\"flash\":\"فلاش\",\"form\":\"داڕشتە\",\"checkbox\":\"خانەی نیشانکردن\",\"radio\":\"جێگرەوەی دوگمە\",\"textField\":\"خانەی دەق\",\"textarea\":\"ڕووبەری دەق\",\"hiddenField\":\"شاردنەوی خانە\",\"button\":\"دوگمە\",\"select\":\"هەڵبژاردەی خانە\",\"imageButton\":\"دوگمەی وێنە\",\"notSet\":\"<هیچ دانەدراوە>\",\"id\":\"ناسنامە\",\"name\":\"ناو\",\"langDir\":\"ئاراستەی زمان\",\"langDirLtr\":\"چەپ بۆ ڕاست (LTR)\",\"langDirRtl\":\"ڕاست بۆ چەپ (RTL)\",\"langCode\":\"هێمای زمان\",\"longDescr\":\"پێناسەی درێژی بەستەر\",\"cssClass\":\"شێوازی چینی په‌ڕە\",\"advisoryTitle\":\"ڕاوێژکاری سەردێڕ\",\"cssStyle\":\"شێواز\",\"ok\":\"باشە\",\"cancel\":\"پاشگەزبوونەوە\",\"close\":\"داخستن\",\"preview\":\"پێشبینین\",\"resize\":\"گۆڕینی ئەندازە\",\"generalTab\":\"گشتی\",\"advancedTab\":\"پەرەسەندوو\",\"validateNumberFailed\":\"ئەم نرخە ژمارە نیە، تکایە نرخێکی ژمارە بنووسە.\",\"confirmNewPage\":\"سەرجەم گۆڕانکاریەکان و پێکهاتەکانی ناووەوە لەدەست دەدەی گەر بێتوو پاشکەوتی نەکەی یەکەم جار، تۆ هەر دڵنیایی لەکردنەوەی پەنجەرەکی نوێ؟\",\"confirmCancel\":\"هەندێك هەڵبژاردە گۆڕدراوە. تۆ دڵنیایی لە داخستنی ئەم دیالۆگە؟\",\"options\":\"هەڵبژاردەکان\",\"target\":\"ئامانج\",\"targetNew\":\"پەنجەرەیەکی نوێ (_blank)\",\"targetTop\":\"لووتکەی پەنجەرە (_top)\",\"targetSelf\":\"لەهەمان پەنجەرە (_self)\",\"targetParent\":\"پەنجەرەی باوان (_parent)\",\"langDirLTR\":\"چەپ بۆ ڕاست (LTR)\",\"langDirRTL\":\"ڕاست بۆ چەپ (RTL)\",\"styles\":\"شێواز\",\"cssClasses\":\"شێوازی چینی پەڕە\",\"width\":\"پانی\",\"height\":\"درێژی\",\"align\":\"ڕێککەرەوە\",\"alignLeft\":\"چەپ\",\"alignRight\":\"ڕاست\",\"alignCenter\":\"ناوەڕاست\",\"alignJustify\":\"هاوستوونی\",\"alignTop\":\"سەرەوە\",\"alignMiddle\":\"ناوەند\",\"alignBottom\":\"ژێرەوە\",\"alignNone\":\"هیچ\",\"invalidValue\":\"نرخێکی نادرووست.\",\"invalidHeight\":\"درێژی دەبێت ژمارە بێت.\",\"invalidWidth\":\"پانی دەبێت ژمارە بێت.\",\"invalidCssLength\":\"ئەم نرخەی دراوە بۆ خانەی \\\"%1\\\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی (px, %, in, cm, mm, em, ex, pt, یان pc).\",\"invalidHtmlLength\":\"ئەم نرخەی دراوە بۆ خانەی \\\"%1\\\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی HTML (px یان %).\",\"invalidInlineStyle\":\"دانەی نرخی شێوازی ناوهێڵ دەبێت پێکهاتبێت لەیەك یان زیاتری داڕشتە \\\"ناو : نرخ\\\", جیاکردنەوەی بە فاریزە و خاڵ\",\"cssLengthTooltip\":\"ژمارەیەك بنووسه‌ بۆ نرخی piksel یان ئامرازێکی درووستی CSS (px, %, in, cm, mm, em, ex, pt, یان pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, ئامادە نیە</span>\"},\"about\":{\"copy\":\"مافی لەبەرگەرتنەوەی &copy; $1. گشتی پارێزراوه. ورگێڕانی بۆ کوردی لەلایەن هۆژە کۆیی.\",\"dlgTitle\":\"دەربارەی CKEditor\",\"help\":\"سەیری $1 بکه بۆ یارمەتی.\",\"moreInfo\":\"بۆ زانیاری زیاتر دەربارەی مۆڵەتی بەکارهێنان، تکایه سەردانی ماڵپەڕەکەمان بکه:\",\"title\":\"دەربارەی CKEditor\",\"userGuide\":\"ڕێپیشاندەری CKEditors\"},\"basicstyles\":{\"bold\":\"قەڵەو\",\"italic\":\"لار\",\"strike\":\"لێدان\",\"subscript\":\"ژێرنووس\",\"superscript\":\"سەرنووس\",\"underline\":\"ژێرهێڵ\"},\"bidi\":{\"ltr\":\"ئاراستەی نووسە لە چەپ بۆ ڕاست\",\"rtl\":\"ئاراستەی نووسە لە ڕاست بۆ چەپ\"},\"blockquote\":{\"toolbar\":\"بەربەستکردنی ووتەی وەرگیراو\"},\"clipboard\":{\"copy\":\"لەبەرگرتنەوە\",\"copyError\":\"پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).\",\"cut\":\"بڕین\",\"cutError\":\"پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).\",\"paste\":\"لکاندن\",\"pasteArea\":\"ناوچەی لکاندن\",\"pasteMsg\":\"تکایە بیلکێنە لەناوەوەی ئەم سنوقە لەڕێی تەختەکلیلەکەت بە بەکارهێنانی کلیلی (<STRONG>Ctrl/Cmd+V</STRONG>) دووای کلیکی باشە بکە.\",\"securityMsg\":\"بەهۆی شێوەپێدانی پارێزی وێبگەڕەکەت، سەرنووسەکه ناتوانێت دەستبگەیەنێت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه پێویسته دووباره بیلکێنیت لەم پەنجەرەیه.\",\"title\":\"لکاندن\"},\"button\":{\"selectedLabel\":\"%1 (هەڵبژێردراو)\"},\"colorbutton\":{\"auto\":\"خۆکار\",\"bgColorTitle\":\"ڕەنگی پاشبنەما\",\"colors\":{\"000\":\"ڕەش\",\"800000\":\"سۆرو ماڕوونی\",\"8B4513\":\"ماڕوونی\",\"2F4F4F\":\"سەوزی تاریك\",\"008080\":\"سەوز و شین\",\"000080\":\"شینی تۆخ\",\"4B0082\":\"مۆری تۆخ\",\"696969\":\"ڕەساسی تۆخ\",\"B22222\":\"سۆری تۆخ\",\"A52A2A\":\"قاوەیی\",\"DAA520\":\"قاوەیی بریسکەدار\",\"006400\":\"سەوزی تۆخ\",\"40E0D0\":\"شینی ناتۆخی بریسکەدار\",\"0000CD\":\"شینی مامناوەند\",\"800080\":\"پەمبەیی\",\"808080\":\"ڕەساسی\",\"F00\":\"سۆر\",\"FF8C00\":\"نارەنجی تۆخ\",\"FFD700\":\"زەرد\",\"008000\":\"سەوز\",\"0FF\":\"شینی ئاسمانی\",\"00F\":\"شین\",\"EE82EE\":\"پەمەیی\",\"A9A9A9\":\"ڕەساسی ناتۆخ\",\"FFA07A\":\"نارەنجی ناتۆخ\",\"FFA500\":\"نارەنجی\",\"FFFF00\":\"زەرد\",\"00FF00\":\"سەوز\",\"AFEEEE\":\"شینی ناتۆخ\",\"ADD8E6\":\"شینی زۆر ناتۆخ\",\"DDA0DD\":\"پەمەیی ناتۆخ\",\"D3D3D3\":\"ڕەساسی بریسکەدار\",\"FFF0F5\":\"جەرگی زۆر ناتۆخ\",\"FAEBD7\":\"جەرگی ناتۆخ\",\"FFFFE0\":\"سپی ناتۆخ\",\"F0FFF0\":\"هەنگوینی ناتۆخ\",\"F0FFFF\":\"شینێکی زۆر ناتۆخ\",\"F0F8FF\":\"شینێکی ئاسمانی زۆر ناتۆخ\",\"E6E6FA\":\"شیری\",\"FFF\":\"سپی\"},\"more\":\"ڕەنگی زیاتر...\",\"panelTitle\":\"ڕەنگەکان\",\"textColorTitle\":\"ڕەنگی دەق\"},\"colordialog\":{\"clear\":\"پاکیکەوە\",\"highlight\":\"نیشانکردن\",\"options\":\"هەڵبژاردەی ڕەنگەکان\",\"selected\":\"ڕەنگی هەڵبژێردراو\",\"title\":\"هەڵبژاردنی ڕەنگ\"},\"templates\":{\"button\":\"ڕووکار\",\"emptyListMsg\":\"(هیچ ڕووکارێك دیارینەکراوە)\",\"insertOption\":\"لە شوێن دانانی ئەم پێکهاتانەی ئێستا\",\"options\":\"هەڵبژاردەکانی ڕووکار\",\"selectPromptMsg\":\"ڕووکارێك هەڵبژێره بۆ کردنەوەی له سەرنووسەر:\",\"title\":\"پێکهاتەی ڕووکار\"},\"contextmenu\":{\"options\":\"هەڵبژاردەی لیستەی کلیکی دەستی ڕاست\"},\"div\":{\"IdInputLabel\":\"ناسنامە\",\"advisoryTitleInputLabel\":\"سەردێڕ\",\"cssClassInputLabel\":\"شێوازی چینی پەڕه\",\"edit\":\"چاکسازی Div\",\"inlineStyleInputLabel\":\"شێوازی ناوهێڵ\",\"langDirLTRLabel\":\"چەپ بۆ ڕاست (LTR)\",\"langDirLabel\":\"ئاراستەی زمان\",\"langDirRTLLabel\":\"ڕاست بۆ چەپ (RTL)\",\"languageCodeInputLabel\":\"هێمای زمان\",\"remove\":\"لابردنی Div\",\"styleSelectLabel\":\"شێواز\",\"title\":\"دروستکردنی لەخۆگری Div\",\"toolbar\":\"دروستکردنی لەخۆگری Div\"},\"toolbar\":{\"toolbarCollapse\":\"شاردنەوی هێڵی تووڵامراز\",\"toolbarExpand\":\"نیشاندانی هێڵی تووڵامراز\",\"toolbarGroups\":{\"document\":\"پەڕه\",\"clipboard\":\"بڕین/پووچکردنەوە\",\"editing\":\"چاکسازی\",\"forms\":\"داڕشتە\",\"basicstyles\":\"شێوازی بنچینەیی\",\"paragraph\":\"بڕگە\",\"links\":\"بەستەر\",\"insert\":\"خستنە ناو\",\"styles\":\"شێواز\",\"colors\":\"ڕەنگەکان\",\"tools\":\"ئامرازەکان\"},\"toolbars\":\"تووڵامرازی دەسکاریکەر\"},\"elementspath\":{\"eleLabel\":\"ڕێڕەوی توخمەکان\",\"eleTitle\":\"%1 توخم\"},\"find\":{\"find\":\"گەڕان\",\"findOptions\":\"هەڵبژاردەکانی گەڕان\",\"findWhat\":\"گەڕان بەدووای:\",\"matchCase\":\"جیاکردنەوه لەنێوان پیتی گەورەو بچووك\",\"matchCyclic\":\"گەڕان لەهەموو پەڕەکه\",\"matchWord\":\"تەنەا هەموو وشەکه\",\"notFoundMsg\":\"هیچ دەقه گەڕانێك نەدۆزراوه.\",\"replace\":\"لەبریدانان\",\"replaceAll\":\"لەبریدانانی هەمووی\",\"replaceSuccessMsg\":\" پێشهاتە(ی) لەبری دانرا. %1\",\"replaceWith\":\"لەبریدانان به:\",\"title\":\"گەڕان و لەبریدانان\"},\"fakeobjects\":{\"anchor\":\"لەنگەر\",\"flash\":\"فلاش\",\"hiddenfield\":\"شاردنەوەی خانه\",\"iframe\":\"لەچوارچێوە\",\"unknown\":\"بەرکارێکی نەناسراو\"},\"flash\":{\"access\":\"دەستپێگەیشتنی نووسراو\",\"accessAlways\":\"هەمیشه\",\"accessNever\":\"هەرگیز\",\"accessSameDomain\":\"هەمان دۆمەین\",\"alignAbsBottom\":\"له ژێرەوه\",\"alignAbsMiddle\":\"لەناوەند\",\"alignBaseline\":\"هێڵەبنەڕەت\",\"alignTextTop\":\"دەق لەسەرەوه\",\"bgcolor\":\"ڕەنگی پاشبنەما\",\"chkFull\":\"ڕێپێدان بە پڕی شاشه\",\"chkLoop\":\"گرێ\",\"chkMenu\":\"چالاککردنی لیستەی فلاش\",\"chkPlay\":\"پێکردنی یان لێدانی خۆکار\",\"flashvars\":\"گۆڕاوەکان بۆ فلاش\",\"hSpace\":\"بۆشایی ئاسۆیی\",\"properties\":\"خاسیەتی فلاش\",\"propertiesTab\":\"خاسیەت\",\"quality\":\"جۆرایەتی\",\"qualityAutoHigh\":\"بەرزی خۆکار\",\"qualityAutoLow\":\"نزمی خۆکار\",\"qualityBest\":\"باشترین\",\"qualityHigh\":\"بەرزی\",\"qualityLow\":\"نزم\",\"qualityMedium\":\"مامناوەند\",\"scale\":\"پێوانه\",\"scaleAll\":\"نیشاندانی هەموو\",\"scaleFit\":\"بەوردی بگونجێت\",\"scaleNoBorder\":\"بێ پەراوێز\",\"title\":\"خاسیەتی فلاش\",\"vSpace\":\"بۆشایی ئەستونی\",\"validateHSpace\":\"بۆشایی ئاسۆیی دەبێت ژمارە بێت.\",\"validateSrc\":\"ناونیشانی بەستەر نابێت خاڵی بێت\",\"validateVSpace\":\"بۆشایی ئەستونی دەبێت ژماره بێت.\",\"windowMode\":\"شێوازی پەنجەره\",\"windowModeOpaque\":\"ناڕوون\",\"windowModeTransparent\":\"ڕۆشن\",\"windowModeWindow\":\"پەنجەره\"},\"font\":{\"fontSize\":{\"label\":\"گەورەیی\",\"voiceLabel\":\"گەورەیی فۆنت\",\"panelTitle\":\"گەورەیی فۆنت\"},\"label\":\"فۆنت\",\"panelTitle\":\"ناوی فۆنت\",\"voiceLabel\":\"فۆنت\"},\"forms\":{\"button\":{\"title\":\"خاسیەتی دوگمە\",\"text\":\"(نرخی) دەق\",\"type\":\"جۆر\",\"typeBtn\":\"دوگمە\",\"typeSbm\":\"بنێرە\",\"typeRst\":\"ڕێکخستنەوە\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"خاسیەتی چووارگۆشی پشکنین\",\"radioTitle\":\"خاسیەتی جێگرەوەی دوگمە\",\"value\":\"نرخ\",\"selected\":\"هەڵبژاردرا\",\"required\":\"پێویستە\"},\"form\":{\"title\":\"خاسیەتی داڕشتە\",\"menu\":\"خاسیەتی داڕشتە\",\"action\":\"کردار\",\"method\":\"ڕێگە\",\"encoding\":\"بەکۆدکەر\"},\"hidden\":{\"title\":\"خاسیەتی خانەی شاردراوە\",\"name\":\"ناو\",\"value\":\"نرخ\"},\"select\":{\"title\":\"هەڵبژاردەی خاسیەتی خانە\",\"selectInfo\":\"زانیاری\",\"opAvail\":\"هەڵبژاردەی لەبەردەستدابوون\",\"value\":\"نرخ\",\"size\":\"گەورەیی\",\"lines\":\"هێڵەکان\",\"chkMulti\":\"ڕێدان بەفره هەڵبژارده\",\"required\":\"پێویستە\",\"opText\":\"دەق\",\"opValue\":\"نرخ\",\"btnAdd\":\"زیادکردن\",\"btnModify\":\"گۆڕانکاری\",\"btnUp\":\"سەرەوه\",\"btnDown\":\"خوارەوە\",\"btnSetValue\":\"دابنێ وەك نرخێکی هەڵبژێردراو\",\"btnDelete\":\"سڕینەوه\"},\"textarea\":{\"title\":\"خاسیەتی ڕووبەری دەق\",\"cols\":\"ستوونەکان\",\"rows\":\"ڕیزەکان\"},\"textfield\":{\"title\":\"خاسیەتی خانەی دەق\",\"name\":\"ناو\",\"value\":\"نرخ\",\"charWidth\":\"پانی نووسە\",\"maxChars\":\"ئەوپەڕی نووسە\",\"required\":\"پێویستە\",\"type\":\"جۆر\",\"typeText\":\"دەق\",\"typePass\":\"پێپەڕەوشە\",\"typeEmail\":\"ئیمەیل\",\"typeSearch\":\"گەڕان\",\"typeTel\":\"ژمارەی تەلەفۆن\",\"typeUrl\":\"ناونیشانی بەستەر\"}},\"format\":{\"label\":\"ڕازاندنەوە\",\"panelTitle\":\"بەشی ڕازاندنەوه\",\"tag_address\":\"ناونیشان\",\"tag_div\":\"(DIV)-ی ئاسایی\",\"tag_h1\":\"سەرنووسەی ١\",\"tag_h2\":\"سەرنووسەی ٢\",\"tag_h3\":\"سەرنووسەی ٣\",\"tag_h4\":\"سەرنووسەی ٤\",\"tag_h5\":\"سەرنووسەی ٥\",\"tag_h6\":\"سەرنووسەی ٦\",\"tag_p\":\"ئاسایی\",\"tag_pre\":\"شێوازکراو\"},\"horizontalrule\":{\"toolbar\":\"دانانی هێلی ئاسۆیی\"},\"iframe\":{\"border\":\"نیشاندانی لاکێشه بە چوواردەوری چووارچێوە\",\"noUrl\":\"تکایه ناونیشانی بەستەر بنووسه بۆ چووارچێوه\",\"scrolling\":\"چالاککردنی هاتووچۆپێکردن\",\"title\":\"دیالۆگی چووارچێوه\",\"toolbar\":\"چووارچێوه\"},\"image\":{\"alt\":\"جێگرەوەی دەق\",\"border\":\"پەراوێز\",\"btnUpload\":\"ناردنی بۆ ڕاژه\",\"button2Img\":\"تۆ دەتەوێت دوگمەی وێنەی دیاریکراو بگۆڕیت بۆ وێنەیەکی ئاسایی؟\",\"hSpace\":\"بۆشایی ئاسۆیی\",\"img2Button\":\"تۆ دەتەوێت وێنەی دیاریکراو بگۆڕیت بۆ دوگمەی وێنه؟\",\"infoTab\":\"زانیاری وێنه\",\"linkTab\":\"بەستەر\",\"lockRatio\":\"داخستنی ڕێژه\",\"menu\":\"خاسیەتی وێنه\",\"resetSize\":\"ڕێکخستنەوەی قەباره\",\"title\":\"خاسیەتی وێنه\",\"titleButton\":\"خاسیەتی دوگمەی وێنه\",\"upload\":\"بارکردن\",\"urlMissing\":\"سەرچاوەی بەستەری وێنه بزره\",\"vSpace\":\"بۆشایی ئەستونی\",\"validateBorder\":\"پەراوێز دەبێت بەتەواوی تەنها ژماره بێت.\",\"validateHSpace\":\"بۆشایی ئاسۆیی دەبێت بەتەواوی تەنها ژمارە بێت.\",\"validateVSpace\":\"بۆشایی ئەستونی دەبێت بەتەواوی تەنها ژماره بێت.\"},\"indent\":{\"indent\":\"زیادکردنی بۆشایی\",\"outdent\":\"کەمکردنەوەی بۆشایی\"},\"smiley\":{\"options\":\"هەڵبژاردەی زەردەخەنه\",\"title\":\"دانانی زەردەخەنەیەك\",\"toolbar\":\"زەردەخەنه\"},\"justify\":{\"block\":\"هاوستوونی\",\"center\":\"ناوەڕاست\",\"left\":\"بەهێڵ کردنی چەپ\",\"right\":\"بەهێڵ کردنی ڕاست\"},\"language\":{\"button\":\"جێگیرکردنی زمان\",\"remove\":\"لابردنی زمان\"},\"link\":{\"acccessKey\":\"کلیلی دەستپێگەیشتن\",\"advanced\":\"پێشکەوتوو\",\"advisoryContentType\":\"جۆری ناوەڕۆکی ڕاویژکار\",\"advisoryTitle\":\"ڕاوێژکاری سەردێڕ\",\"anchor\":{\"toolbar\":\"دانان/چاکسازی لەنگەر\",\"menu\":\"چاکسازی لەنگەر\",\"title\":\"خاسیەتی لەنگەر\",\"name\":\"ناوی لەنگەر\",\"errorName\":\"تکایه ناوی لەنگەر بنووسه\",\"remove\":\"لابردنی لەنگەر\"},\"anchorId\":\"بەپێی ناسنامەی توخم\",\"anchorName\":\"بەپێی ناوی لەنگەر\",\"charset\":\"بەستەری سەرچاوەی نووسە\",\"cssClasses\":\"شێوازی چینی پەڕه\",\"emailAddress\":\"ناونیشانی ئیمەیل\",\"emailBody\":\"ناوەڕۆکی نامە\",\"emailSubject\":\"بابەتی نامە\",\"id\":\"ناسنامە\",\"info\":\"زانیاری بەستەر\",\"langCode\":\"هێمای زمان\",\"langDir\":\"ئاراستەی زمان\",\"langDirLTR\":\"چەپ بۆ ڕاست (LTR)\",\"langDirRTL\":\"ڕاست بۆ چەپ (RTL)\",\"menu\":\"چاکسازی بەستەر\",\"name\":\"ناو\",\"noAnchors\":\"(هیچ جۆرێکی لەنگەر ئامادە نیە لەم پەڕەیه)\",\"noEmail\":\"تکایە ناونیشانی ئیمەیل بنووسە\",\"noUrl\":\"تکایە ناونیشانی بەستەر بنووسە\",\"other\":\"<هیتر>\",\"popupDependent\":\"پێوەبەستراو (Netscape)\",\"popupFeatures\":\"خاسیەتی پەنجەرەی سەرهەڵدەر\",\"popupFullScreen\":\"پڕ بەپڕی شاشە (IE)\",\"popupLeft\":\"جێگای چەپ\",\"popupLocationBar\":\"هێڵی ناونیشانی بەستەر\",\"popupMenuBar\":\"هێڵی لیسته\",\"popupResizable\":\"توانای گۆڕینی قەباره\",\"popupScrollBars\":\"هێڵی هاتووچۆپێکردن\",\"popupStatusBar\":\"هێڵی دۆخ\",\"popupToolbar\":\"هێڵی تووڵامراز\",\"popupTop\":\"جێگای سەرەوە\",\"rel\":\"پەیوەندی\",\"selectAnchor\":\"هەڵبژاردنی لەنگەرێك\",\"styles\":\"شێواز\",\"tabIndex\":\"بازدەری تابی  ئیندێکس\",\"target\":\"ئامانج\",\"targetFrame\":\"<چووارچێوە>\",\"targetFrameName\":\"ناوی ئامانجی چووارچێوە\",\"targetPopup\":\"<پەنجەرەی سەرهەڵدەر>\",\"targetPopupName\":\"ناوی پەنجەرەی سەرهەڵدەر\",\"title\":\"بەستەر\",\"toAnchor\":\"بەستەر بۆ لەنگەر له دەق\",\"toEmail\":\"ئیمەیل\",\"toUrl\":\"ناونیشانی بەستەر\",\"toolbar\":\"دانان/ڕێکخستنی بەستەر\",\"type\":\"جۆری بەستەر\",\"unlink\":\"لابردنی بەستەر\",\"upload\":\"بارکردن\"},\"list\":{\"bulletedlist\":\"دانان/لابردنی خاڵی لیست\",\"numberedlist\":\"دانان/لابردنی ژمارەی لیست\"},\"liststyle\":{\"armenian\":\"ئاراستەی ژمارەی ئەرمەنی\",\"bulletedTitle\":\"خاسیەتی لیستی خاڵی\",\"circle\":\"بازنه\",\"decimal\":\"ژمارە (1, 2, 3, وە هیتر.)\",\"decimalLeadingZero\":\"ژمارە سفڕی لەپێشەوه (01, 02, 03, وە هیتر.)\",\"disc\":\"پەپکە\",\"georgian\":\"ئاراستەی ژمارەی جۆڕجی (an, ban, gan, وە هیتر.)\",\"lowerAlpha\":\"ئەلفابێی بچووك (a, b, c, d, e, وە هیتر.)\",\"lowerGreek\":\"یۆنانی بچووك (alpha, beta, gamma, وە هیتر.)\",\"lowerRoman\":\"ژمارەی ڕۆمی بچووك (i, ii, iii, iv, v, وە هیتر.)\",\"none\":\"هیچ\",\"notset\":\"<دانەندراوه>\",\"numberedTitle\":\"خاسیەتی لیستی ژمارەیی\",\"square\":\"چووراگۆشە\",\"start\":\"دەستپێکردن\",\"type\":\"جۆر\",\"upperAlpha\":\"ئەلفابێی گەوره (A, B, C, D, E, وە هیتر.)\",\"upperRoman\":\"ژمارەی ڕۆمی گەوره (I, II, III, IV, V, وە هیتر.)\",\"validateStartNumber\":\"دەستپێکەری لیستی ژمارەیی دەبێت تەنها ژمارە بێت.\"},\"magicline\":{\"title\":\"بڕگە لێرە دابنێ\"},\"maximize\":{\"maximize\":\"ئەوپەڕی گەورەیی\",\"minimize\":\"ئەوپەڕی بچووکی\"},\"newpage\":{\"toolbar\":\"پەڕەیەکی نوێ\"},\"pagebreak\":{\"alt\":\"پشووی پەڕە\",\"toolbar\":\"دانانی پشووی پەڕە بۆ چاپکردن\"},\"pastetext\":{\"button\":\"لکاندنی وەك دەقی ڕوون\",\"title\":\"لکاندنی وەك دەقی ڕوون\"},\"pastefromword\":{\"confirmCleanup\":\"ئەم دەقەی بەتەمای بیلکێنی پێدەچێت له word هێنرابێت. دەتەوێت پاکی بکەیوه پێش ئەوەی بیلکێنی؟\",\"error\":\"هیچ ڕێگەیەك نەبوو لەلکاندنی دەقەکه بەهۆی هەڵەیەکی ناوەخۆیی\",\"title\":\"لکاندنی لەلایەن Word\",\"toolbar\":\"لکاندنی لەڕێی Word\"},\"preview\":{\"preview\":\"پێشبینین\"},\"print\":{\"toolbar\":\"چاپکردن\"},\"removeformat\":{\"toolbar\":\"لابردنی داڕشتەکە\"},\"save\":{\"toolbar\":\"پاشکەوتکردن\"},\"selectall\":{\"toolbar\":\"دیاریکردنی هەمووی\"},\"showblocks\":{\"toolbar\":\"نیشاندانی بەربەستەکان\"},\"sourcearea\":{\"toolbar\":\"سەرچاوە\"},\"specialchar\":{\"options\":\"هەڵبژاردەی نووسەی تایبەتی\",\"title\":\"هەڵبژاردنی نووسەی تایبەتی\",\"toolbar\":\"دانانی نووسەی تایبەتی\"},\"scayt\":{\"btn_about\":\"دهربارهی SCAYT\",\"btn_dictionaries\":\"فهرههنگهکان\",\"btn_disable\":\"ناچالاککردنی SCAYT\",\"btn_enable\":\"چالاککردنی SCAYT\",\"btn_langs\":\"زمانهکان\",\"btn_options\":\"ههڵبژارده\",\"text_title\":\"پشکنینی نووسه لهکاتی نووسین\"},\"stylescombo\":{\"label\":\"شێواز\",\"panelTitle\":\"شێوازی ڕازاندنەوە\",\"panelTitle1\":\"شێوازی خشت\",\"panelTitle2\":\"شێوازی ناوهێڵ\",\"panelTitle3\":\"شێوازی بەرکار\"},\"table\":{\"border\":\"گەورەیی پەراوێز\",\"caption\":\"سەردێڕ\",\"cell\":{\"menu\":\"خانه\",\"insertBefore\":\"دانانی خانه لەپێش\",\"insertAfter\":\"دانانی خانه لەپاش\",\"deleteCell\":\"سڕینەوەی خانه\",\"merge\":\"تێکەڵکردنی خانە\",\"mergeRight\":\"تێکەڵکردنی لەگەڵ ڕاست\",\"mergeDown\":\"تێکەڵکردنی لەگەڵ خوارەوە\",\"splitHorizontal\":\"دابەشکردنی خانەی ئاسۆیی\",\"splitVertical\":\"دابەشکردنی خانەی ئەستونی\",\"title\":\"خاسیەتی خانه\",\"cellType\":\"جۆری خانه\",\"rowSpan\":\"ماوەی نێوان ڕیز\",\"colSpan\":\"بستی ئەستونی\",\"wordWrap\":\"پێچانەوەی وشە\",\"hAlign\":\"ڕیزکردنی ئاسۆیی\",\"vAlign\":\"ڕیزکردنی ئەستونی\",\"alignBaseline\":\"هێڵەبنەڕەت\",\"bgColor\":\"ڕەنگی پاشبنەما\",\"borderColor\":\"ڕەنگی پەراوێز\",\"data\":\"داتا\",\"header\":\"سەرپەڕه\",\"yes\":\"بەڵێ\",\"no\":\"نەخێر\",\"invalidWidth\":\"پانی خانه دەبێت بەتەواوی ژماره بێت.\",\"invalidHeight\":\"درێژی خانه بەتەواوی دەبێت ژمارە بێت.\",\"invalidRowSpan\":\"ماوەی نێوان ڕیز بەتەواوی دەبێت ژمارە بێت.\",\"invalidColSpan\":\"ماوەی نێوان ئەستونی بەتەواوی دەبێت ژمارە بێت.\",\"chooseColor\":\"هەڵبژێرە\"},\"cellPad\":\"بۆشایی ناوپۆش\",\"cellSpace\":\"بۆشایی خانه\",\"column\":{\"menu\":\"ئەستون\",\"insertBefore\":\"دانانی ئەستون لەپێش\",\"insertAfter\":\"دانانی ئەستوون لەپاش\",\"deleteColumn\":\"سڕینەوەی ئەستوون\"},\"columns\":\"ستوونەکان\",\"deleteTable\":\"سڕینەوەی خشتە\",\"headers\":\"سەرپەڕه\",\"headersBoth\":\"هەردووك\",\"headersColumn\":\"یەکەم ئەستوون\",\"headersNone\":\"هیچ\",\"headersRow\":\"یەکەم ڕیز\",\"invalidBorder\":\"ژمارەی پەراوێز دەبێت تەنها ژماره بێت.\",\"invalidCellPadding\":\"ناوپۆشی خانه دەبێت ژمارەکی درووست بێت.\",\"invalidCellSpacing\":\"بۆشایی خانه دەبێت ژمارەکی درووست بێت.\",\"invalidCols\":\"ژمارەی ئەستوونی دەبێت گەورەتر بێت لەژمارەی 0.\",\"invalidHeight\":\"درێژی خشته دهبێت تهنها ژماره بێت.\",\"invalidRows\":\"ژمارەی ڕیز دەبێت گەورەتر بێت لەژمارەی 0.\",\"invalidWidth\":\"پانی خشته دەبێت تەنها ژماره بێت.\",\"menu\":\"خاسیەتی خشتە\",\"row\":{\"menu\":\"ڕیز\",\"insertBefore\":\"دانانی ڕیز لەپێش\",\"insertAfter\":\"دانانی ڕیز لەپاش\",\"deleteRow\":\"سڕینەوەی ڕیز\"},\"rows\":\"ڕیز\",\"summary\":\"کورتە\",\"title\":\"خاسیەتی خشتە\",\"toolbar\":\"خشتە\",\"widthPc\":\"لەسەدا\",\"widthPx\":\"وێنەخاڵ - پیکسل\",\"widthUnit\":\"پانی یەکە\"},\"undo\":{\"redo\":\"هەڵگەڕاندنەوە\",\"undo\":\"پووچکردنەوە\"},\"wsc\":{\"btnIgnore\":\"پشتگوێ کردن\",\"btnIgnoreAll\":\"پشتگوێکردنی ههمووی\",\"btnReplace\":\"لهبریدانن\",\"btnReplaceAll\":\"لهبریدانانی ههمووی\",\"btnUndo\":\"پووچکردنهوه\",\"changeTo\":\"گۆڕینی بۆ\",\"errorLoading\":\"ههڵه لههێنانی داخوازینامهی خانهخۆێی ڕاژه: %s.\",\"ieSpellDownload\":\"پشکنینی ڕێنووس دانهمزراوه. دهتهوێت ئێستا دایبگریت?\",\"manyChanges\":\"پشکنینی ڕێنووس کۆتای هات: لهسهدا %1 ی وشهکان گۆڕدرا\",\"noChanges\":\"پشکنینی ڕێنووس کۆتای هات: هیچ وشهیهك نۆگۆڕدرا\",\"noMispell\":\"پشکنینی ڕێنووس کۆتای هات: هیچ ههڵهیهکی ڕێنووس نهدۆزراوه\",\"noSuggestions\":\"- هیچ پێشنیارێك -\",\"notAvailable\":\"ببووره، لهمکاتهدا ڕاژهکه لهبهردهستا نیه.\",\"notInDic\":\"لهفهرههنگ دانیه\",\"oneChange\":\"پشکنینی ڕێنووس کۆتای هات: یهك وشه گۆڕدرا\",\"progress\":\"پشکنینی ڕێنووس لهبهردهوامبوون دایه...\",\"title\":\"پشکنینی ڕێنووس\",\"toolbar\":\"پشکنینی ڕێنووس\"}};"
  },
  {
    "path": "assets/ckeditor/lang/lt.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['lt']={\"editor\":\"Pilnas redaktorius\",\"editorPanel\":\"Pilno redagtoriaus skydelis\",\"common\":{\"editorHelp\":\"Spauskite ALT 0 dėl pagalbos\",\"browseServer\":\"Naršyti po serverį\",\"url\":\"URL\",\"protocol\":\"Protokolas\",\"upload\":\"Siųsti\",\"uploadSubmit\":\"Siųsti į serverį\",\"image\":\"Vaizdas\",\"flash\":\"Flash\",\"form\":\"Forma\",\"checkbox\":\"Žymimasis langelis\",\"radio\":\"Žymimoji akutė\",\"textField\":\"Teksto laukas\",\"textarea\":\"Teksto sritis\",\"hiddenField\":\"Nerodomas laukas\",\"button\":\"Mygtukas\",\"select\":\"Atrankos laukas\",\"imageButton\":\"Vaizdinis mygtukas\",\"notSet\":\"<nėra nustatyta>\",\"id\":\"Id\",\"name\":\"Vardas\",\"langDir\":\"Teksto kryptis\",\"langDirLtr\":\"Iš kairės į dešinę (LTR)\",\"langDirRtl\":\"Iš dešinės į kairę (RTL)\",\"langCode\":\"Kalbos kodas\",\"longDescr\":\"Ilgas aprašymas URL\",\"cssClass\":\"Stilių lentelės klasės\",\"advisoryTitle\":\"Konsultacinė antraštė\",\"cssStyle\":\"Stilius\",\"ok\":\"OK\",\"cancel\":\"Nutraukti\",\"close\":\"Uždaryti\",\"preview\":\"Peržiūrėti\",\"resize\":\"Pavilkite, kad pakeistumėte dydį\",\"generalTab\":\"Bendros savybės\",\"advancedTab\":\"Papildomas\",\"validateNumberFailed\":\"Ši reikšmė nėra skaičius.\",\"confirmNewPage\":\"Visas neišsaugotas turinys bus prarastas. Ar tikrai norite įkrauti naują puslapį?\",\"confirmCancel\":\"Kai kurie parametrai pasikeitė. Ar tikrai norite užverti langą?\",\"options\":\"Parametrai\",\"target\":\"Tikslinė nuoroda\",\"targetNew\":\"Naujas langas (_blank)\",\"targetTop\":\"Viršutinis langas (_top)\",\"targetSelf\":\"Esamas langas (_self)\",\"targetParent\":\"Paskutinis langas (_parent)\",\"langDirLTR\":\"Iš kairės į dešinę (LTR)\",\"langDirRTL\":\"Iš dešinės į kairę (RTL)\",\"styles\":\"Stilius\",\"cssClasses\":\"Stilių klasės\",\"width\":\"Plotis\",\"height\":\"Aukštis\",\"align\":\"Lygiuoti\",\"alignLeft\":\"Kairę\",\"alignRight\":\"Dešinę\",\"alignCenter\":\"Centrą\",\"alignJustify\":\"Lygiuoti abi puses\",\"alignTop\":\"Viršūnę\",\"alignMiddle\":\"Vidurį\",\"alignBottom\":\"Apačią\",\"alignNone\":\"Niekas\",\"invalidValue\":\"Neteisinga reikšmė.\",\"invalidHeight\":\"Aukštis turi būti nurodytas skaičiais.\",\"invalidWidth\":\"Plotis turi būti nurodytas skaičiais.\",\"invalidCssLength\":\"Reikšmė nurodyta \\\"%1\\\" laukui, turi būti teigiamas skaičius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).\",\"invalidHtmlLength\":\"Reikšmė nurodyta \\\"%1\\\" laukui, turi būti teigiamas skaičius su arba be tinkamo HTML matavimo vieneto (px arba %).\",\"invalidInlineStyle\":\"Reikšmė nurodyta vidiniame stiliuje turi būti sudaryta iš vieno šių reikšmių \\\"vardas : reikšmė\\\", atskirta kabliataškiais.\",\"cssLengthTooltip\":\"Įveskite reikšmę pikseliais arba skaičiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, netinkamas</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Visos teiss saugomos.\",\"dlgTitle\":\"Apie CKEditor\",\"help\":\"Patikrinkite $1 dėl pagalbos.\",\"moreInfo\":\"Dėl licencijavimo apsilankykite mūsų svetainėje:\",\"title\":\"Apie CKEditor\",\"userGuide\":\"CKEditor Vartotojo Gidas\"},\"basicstyles\":{\"bold\":\"Pusjuodis\",\"italic\":\"Kursyvas\",\"strike\":\"Perbrauktas\",\"subscript\":\"Apatinis indeksas\",\"superscript\":\"Viršutinis indeksas\",\"underline\":\"Pabrauktas\"},\"bidi\":{\"ltr\":\"Tekstas iš kairės į dešinę\",\"rtl\":\"Tekstas iš dešinės į kairę\"},\"blockquote\":{\"toolbar\":\"Citata\"},\"clipboard\":{\"copy\":\"Kopijuoti\",\"copyError\":\"Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).\",\"cut\":\"Iškirpti\",\"cutError\":\"Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).\",\"paste\":\"Įdėti\",\"pasteArea\":\"Įkelti dalį\",\"pasteMsg\":\"Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.\",\"securityMsg\":\"Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.\",\"title\":\"Įdėti\"},\"button\":{\"selectedLabel\":\"%1 (Pasirinkta)\"},\"colorbutton\":{\"auto\":\"Automatinis\",\"bgColorTitle\":\"Fono spalva\",\"colors\":{\"000\":\"Juoda\",\"800000\":\"Kaštoninė\",\"8B4513\":\"Tamsiai ruda\",\"2F4F4F\":\"Pilka tamsaus šiferio\",\"008080\":\"Teal\",\"000080\":\"Karinis\",\"4B0082\":\"Indigo\",\"696969\":\"Tamsiai pilka\",\"B22222\":\"Ugnies\",\"A52A2A\":\"Ruda\",\"DAA520\":\"Aukso\",\"006400\":\"Tamsiai žalia\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Vidutinė mėlyna\",\"800080\":\"Violetinė\",\"808080\":\"Pilka\",\"F00\":\"Raudona\",\"FF8C00\":\"Tamsiai oranžinė\",\"FFD700\":\"Auksinė\",\"008000\":\"Žalia\",\"0FF\":\"Žydra\",\"00F\":\"Mėlyna\",\"EE82EE\":\"Violetinė\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Oranžinė\",\"FFFF00\":\"Geltona\",\"00FF00\":\"Citrinų\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Šviesiai mėlyna\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Šviesiai pilka\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Šviesiai geltona\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Balta\"},\"more\":\"Daugiau spalvų...\",\"panelTitle\":\"Spalva\",\"textColorTitle\":\"Teksto spalva\"},\"colordialog\":{\"clear\":\"Išvalyti\",\"highlight\":\"Paryškinti\",\"options\":\"Spalvos nustatymai\",\"selected\":\"Pasirinkta spalva\",\"title\":\"Pasirinkite spalvą\"},\"templates\":{\"button\":\"Šablonai\",\"emptyListMsg\":\"(Šablonų sąrašas tuščias)\",\"insertOption\":\"Pakeisti dabartinį turinį pasirinktu šablonu\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Pasirinkite norimą šabloną<br>(<b>Dėmesio!</b> esamas turinys bus prarastas):\",\"title\":\"Turinio šablonai\"},\"contextmenu\":{\"options\":\"Kontekstinio meniu parametrai\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Patariamas pavadinimas\",\"cssClassInputLabel\":\"Stilių klasės\",\"edit\":\"Redaguoti Div\",\"inlineStyleInputLabel\":\"Vidiniai stiliai\",\"langDirLTRLabel\":\"Iš kairės į dešinę (LTR)\",\"langDirLabel\":\"Kalbos nurodymai\",\"langDirRTLLabel\":\"Iš dešinės į kairę (RTL)\",\"languageCodeInputLabel\":\" Kalbos kodas\",\"remove\":\"Pašalinti Div\",\"styleSelectLabel\":\"Stilius\",\"title\":\"Sukurti Div elementą\",\"toolbar\":\"Sukurti Div elementą\"},\"toolbar\":{\"toolbarCollapse\":\"Apjungti įrankių juostą\",\"toolbarExpand\":\"Išplėsti įrankių juostą\",\"toolbarGroups\":{\"document\":\"Dokumentas\",\"clipboard\":\"Atmintinė/Atgal\",\"editing\":\"Redagavimas\",\"forms\":\"Formos\",\"basicstyles\":\"Pagrindiniai stiliai\",\"paragraph\":\"Paragrafas\",\"links\":\"Nuorodos\",\"insert\":\"Įterpti\",\"styles\":\"Stiliai\",\"colors\":\"Spalvos\",\"tools\":\"Įrankiai\"},\"toolbars\":\"Redaktoriaus įrankiai\"},\"elementspath\":{\"eleLabel\":\"Elemento kelias\",\"eleTitle\":\"%1 elementas\"},\"find\":{\"find\":\"Rasti\",\"findOptions\":\"Paieškos nustatymai\",\"findWhat\":\"Surasti tekstą:\",\"matchCase\":\"Skirti didžiąsias ir mažąsias raides\",\"matchCyclic\":\"Sutampantis cikliškumas\",\"matchWord\":\"Atitikti pilną žodį\",\"notFoundMsg\":\"Nurodytas tekstas nerastas.\",\"replace\":\"Pakeisti\",\"replaceAll\":\"Pakeisti viską\",\"replaceSuccessMsg\":\"%1 sutapimas(ų) buvo pakeisti.\",\"replaceWith\":\"Pakeisti tekstu:\",\"title\":\"Surasti ir pakeisti\"},\"fakeobjects\":{\"anchor\":\"Žymė\",\"flash\":\"Flash animacija\",\"hiddenfield\":\"Paslėptas laukas\",\"iframe\":\"IFrame\",\"unknown\":\"Nežinomas objektas\"},\"flash\":{\"access\":\"Skripto priėjimas\",\"accessAlways\":\"Visada\",\"accessNever\":\"Niekada\",\"accessSameDomain\":\"Tas pats domenas\",\"alignAbsBottom\":\"Absoliučią apačią\",\"alignAbsMiddle\":\"Absoliutų vidurį\",\"alignBaseline\":\"Apatinę liniją\",\"alignTextTop\":\"Teksto viršūnę\",\"bgcolor\":\"Fono spalva\",\"chkFull\":\"Leisti per visą ekraną\",\"chkLoop\":\"Ciklas\",\"chkMenu\":\"Leisti Flash meniu\",\"chkPlay\":\"Automatinis paleidimas\",\"flashvars\":\"Flash kintamieji\",\"hSpace\":\"Hor.Erdvė\",\"properties\":\"Flash savybės\",\"propertiesTab\":\"Nustatymai\",\"quality\":\"Kokybė\",\"qualityAutoHigh\":\"Automatiškai Gera\",\"qualityAutoLow\":\"Automatiškai Žema\",\"qualityBest\":\"Geriausia\",\"qualityHigh\":\"Gera\",\"qualityLow\":\"Žema\",\"qualityMedium\":\"Vidutinė\",\"scale\":\"Mastelis\",\"scaleAll\":\"Rodyti visą\",\"scaleFit\":\"Tikslus atitikimas\",\"scaleNoBorder\":\"Be rėmelio\",\"title\":\"Flash savybės\",\"vSpace\":\"Vert.Erdvė\",\"validateHSpace\":\"HSpace turi būti skaičius.\",\"validateSrc\":\"Prašome įvesti nuorodos URL\",\"validateVSpace\":\"VSpace turi būti skaičius.\",\"windowMode\":\"Lango režimas\",\"windowModeOpaque\":\"Nepermatomas\",\"windowModeTransparent\":\"Permatomas\",\"windowModeWindow\":\"Langas\"},\"font\":{\"fontSize\":{\"label\":\"Šrifto dydis\",\"voiceLabel\":\"Šrifto dydis\",\"panelTitle\":\"Šrifto dydis\"},\"label\":\"Šriftas\",\"panelTitle\":\"Šriftas\",\"voiceLabel\":\"Šriftas\"},\"forms\":{\"button\":{\"title\":\"Mygtuko savybės\",\"text\":\"Tekstas (Reikšmė)\",\"type\":\"Tipas\",\"typeBtn\":\"Mygtukas\",\"typeSbm\":\"Siųsti\",\"typeRst\":\"Išvalyti\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Žymimojo langelio savybės\",\"radioTitle\":\"Žymimosios akutės savybės\",\"value\":\"Reikšmė\",\"selected\":\"Pažymėtas\",\"required\":\"Required\"},\"form\":{\"title\":\"Formos savybės\",\"menu\":\"Formos savybės\",\"action\":\"Veiksmas\",\"method\":\"Metodas\",\"encoding\":\"Kodavimas\"},\"hidden\":{\"title\":\"Nerodomo lauko savybės\",\"name\":\"Vardas\",\"value\":\"Reikšmė\"},\"select\":{\"title\":\"Atrankos lauko savybės\",\"selectInfo\":\"Informacija\",\"opAvail\":\"Galimos parinktys\",\"value\":\"Reikšmė\",\"size\":\"Dydis\",\"lines\":\"eilučių\",\"chkMulti\":\"Leisti daugeriopą atranką\",\"required\":\"Required\",\"opText\":\"Tekstas\",\"opValue\":\"Reikšmė\",\"btnAdd\":\"Įtraukti\",\"btnModify\":\"Modifikuoti\",\"btnUp\":\"Aukštyn\",\"btnDown\":\"Žemyn\",\"btnSetValue\":\"Laikyti pažymėta reikšme\",\"btnDelete\":\"Trinti\"},\"textarea\":{\"title\":\"Teksto srities savybės\",\"cols\":\"Ilgis\",\"rows\":\"Plotis\"},\"textfield\":{\"title\":\"Teksto lauko savybės\",\"name\":\"Vardas\",\"value\":\"Reikšmė\",\"charWidth\":\"Ilgis simboliais\",\"maxChars\":\"Maksimalus simbolių skaičius\",\"required\":\"Required\",\"type\":\"Tipas\",\"typeText\":\"Tekstas\",\"typePass\":\"Slaptažodis\",\"typeEmail\":\"El. paštas\",\"typeSearch\":\"Paieška\",\"typeTel\":\"Telefono numeris\",\"typeUrl\":\"Nuoroda\"}},\"format\":{\"label\":\"Šrifto formatas\",\"panelTitle\":\"Šrifto formatas\",\"tag_address\":\"Kreipinio\",\"tag_div\":\"Normalus (DIV)\",\"tag_h1\":\"Antraštinis 1\",\"tag_h2\":\"Antraštinis 2\",\"tag_h3\":\"Antraštinis 3\",\"tag_h4\":\"Antraštinis 4\",\"tag_h5\":\"Antraštinis 5\",\"tag_h6\":\"Antraštinis 6\",\"tag_p\":\"Normalus\",\"tag_pre\":\"Formuotas\"},\"horizontalrule\":{\"toolbar\":\"Įterpti horizontalią liniją\"},\"iframe\":{\"border\":\"Rodyti rėmelį\",\"noUrl\":\"Nurodykite iframe nuorodą\",\"scrolling\":\"Įjungti slankiklius\",\"title\":\"IFrame nustatymai\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatyvus Tekstas\",\"border\":\"Rėmelis\",\"btnUpload\":\"Siųsti į serverį\",\"button2Img\":\"Ar norite mygtuką paversti paprastu paveiksliuku?\",\"hSpace\":\"Hor.Erdvė\",\"img2Button\":\"Ar norite paveiksliuką paversti mygtuku?\",\"infoTab\":\"Vaizdo informacija\",\"linkTab\":\"Nuoroda\",\"lockRatio\":\"Išlaikyti proporciją\",\"menu\":\"Vaizdo savybės\",\"resetSize\":\"Atstatyti dydį\",\"title\":\"Vaizdo savybės\",\"titleButton\":\"Vaizdinio mygtuko savybės\",\"upload\":\"Nusiųsti\",\"urlMissing\":\"Paveiksliuko nuorodos nėra.\",\"vSpace\":\"Vert.Erdvė\",\"validateBorder\":\"Reikšmė turi būti sveikas skaičius.\",\"validateHSpace\":\"Reikšmė turi būti sveikas skaičius.\",\"validateVSpace\":\"Reikšmė turi būti sveikas skaičius.\"},\"indent\":{\"indent\":\"Padidinti įtrauką\",\"outdent\":\"Sumažinti įtrauką\"},\"smiley\":{\"options\":\"Šypsenėlių nustatymai\",\"title\":\"Įterpti veidelį\",\"toolbar\":\"Veideliai\"},\"justify\":{\"block\":\"Lygiuoti abi puses\",\"center\":\"Centruoti\",\"left\":\"Lygiuoti kairę\",\"right\":\"Lygiuoti dešinę\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Prieigos raktas\",\"advanced\":\"Papildomas\",\"advisoryContentType\":\"Konsultacinio turinio tipas\",\"advisoryTitle\":\"Konsultacinė antraštė\",\"anchor\":{\"toolbar\":\"Įterpti/modifikuoti žymę\",\"menu\":\"Žymės savybės\",\"title\":\"Žymės savybės\",\"name\":\"Žymės vardas\",\"errorName\":\"Prašome įvesti žymės vardą\",\"remove\":\"Pašalinti žymę\"},\"anchorId\":\"Pagal žymės Id\",\"anchorName\":\"Pagal žymės vardą\",\"charset\":\"Susietų išteklių simbolių lentelė\",\"cssClasses\":\"Stilių lentelės klasės\",\"emailAddress\":\"El.pašto adresas\",\"emailBody\":\"Žinutės turinys\",\"emailSubject\":\"Žinutės tema\",\"id\":\"Id\",\"info\":\"Nuorodos informacija\",\"langCode\":\"Teksto kryptis\",\"langDir\":\"Teksto kryptis\",\"langDirLTR\":\"Iš kairės į dešinę (LTR)\",\"langDirRTL\":\"Iš dešinės į kairę (RTL)\",\"menu\":\"Taisyti nuorodą\",\"name\":\"Vardas\",\"noAnchors\":\"(Šiame dokumente žymių nėra)\",\"noEmail\":\"Prašome įvesti el.pašto adresą\",\"noUrl\":\"Prašome įvesti nuorodos URL\",\"other\":\"<kitas>\",\"popupDependent\":\"Priklausomas (Netscape)\",\"popupFeatures\":\"Išskleidžiamo lango savybės\",\"popupFullScreen\":\"Visas ekranas (IE)\",\"popupLeft\":\"Kairė pozicija\",\"popupLocationBar\":\"Adreso juosta\",\"popupMenuBar\":\"Meniu juosta\",\"popupResizable\":\"Kintamas dydis\",\"popupScrollBars\":\"Slinkties juostos\",\"popupStatusBar\":\"Būsenos juosta\",\"popupToolbar\":\"Mygtukų juosta\",\"popupTop\":\"Viršutinė pozicija\",\"rel\":\"Sąsajos\",\"selectAnchor\":\"Pasirinkite žymę\",\"styles\":\"Stilius\",\"tabIndex\":\"Tabuliavimo indeksas\",\"target\":\"Paskirties vieta\",\"targetFrame\":\"<kadras>\",\"targetFrameName\":\"Paskirties kadro vardas\",\"targetPopup\":\"<išskleidžiamas langas>\",\"targetPopupName\":\"Paskirties lango vardas\",\"title\":\"Nuoroda\",\"toAnchor\":\"Žymė šiame puslapyje\",\"toEmail\":\"El.paštas\",\"toUrl\":\"Nuoroda\",\"toolbar\":\"Įterpti/taisyti nuorodą\",\"type\":\"Nuorodos tipas\",\"unlink\":\"Panaikinti nuorodą\",\"upload\":\"Siųsti\"},\"list\":{\"bulletedlist\":\"Suženklintas sąrašas\",\"numberedlist\":\"Numeruotas sąrašas\"},\"liststyle\":{\"armenian\":\"Armėniški skaitmenys\",\"bulletedTitle\":\"Ženklelinio sąrašo nustatymai\",\"circle\":\"Apskritimas\",\"decimal\":\"Dešimtainis (1, 2, 3, t.t)\",\"decimalLeadingZero\":\"Dešimtainis su nuliu priekyje (01, 02, 03, t.t)\",\"disc\":\"Diskas\",\"georgian\":\"Gruziniški skaitmenys (an, ban, gan, t.t)\",\"lowerAlpha\":\"Mažosios Alpha (a, b, c, d, e, t.t)\",\"lowerGreek\":\"Mažosios Graikų (alpha, beta, gamma, t.t)\",\"lowerRoman\":\"Mažosios Romėnų (i, ii, iii, iv, v, t.t)\",\"none\":\"Niekas\",\"notset\":\"<nenurodytas>\",\"numberedTitle\":\"Skaitmeninio sąrašo nustatymai\",\"square\":\"Kvadratas\",\"start\":\"Pradžia\",\"type\":\"Rūšis\",\"upperAlpha\":\"Didžiosios Alpha (A, B, C, D, E, t.t)\",\"upperRoman\":\"Didžiosios Romėnų (I, II, III, IV, V, t.t)\",\"validateStartNumber\":\"Sąrašo pradžios skaitmuo turi būti sveikas skaičius.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Išdidinti\",\"minimize\":\"Sumažinti\"},\"newpage\":{\"toolbar\":\"Naujas puslapis\"},\"pagebreak\":{\"alt\":\"Puslapio skirtukas\",\"toolbar\":\"Įterpti puslapių skirtuką\"},\"pastetext\":{\"button\":\"Įdėti kaip gryną tekstą\",\"title\":\"Įdėti kaip gryną tekstą\"},\"pastefromword\":{\"confirmCleanup\":\"Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?\",\"error\":\"Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto\",\"title\":\"Įdėti iš Word\",\"toolbar\":\"Įdėti iš Word\"},\"preview\":{\"preview\":\"Peržiūra\"},\"print\":{\"toolbar\":\"Spausdinti\"},\"removeformat\":{\"toolbar\":\"Panaikinti formatą\"},\"save\":{\"toolbar\":\"Išsaugoti\"},\"selectall\":{\"toolbar\":\"Pažymėti viską\"},\"showblocks\":{\"toolbar\":\"Rodyti blokus\"},\"sourcearea\":{\"toolbar\":\"Šaltinis\"},\"specialchar\":{\"options\":\"Specialaus simbolio nustatymai\",\"title\":\"Pasirinkite specialų simbolį\",\"toolbar\":\"Įterpti specialų simbolį\"},\"scayt\":{\"btn_about\":\"Apie SCAYT\",\"btn_dictionaries\":\"Žodynai\",\"btn_disable\":\"Išjungti SCAYT\",\"btn_enable\":\"Įjungti SCAYT\",\"btn_langs\":\"Kalbos\",\"btn_options\":\"Parametrai\",\"text_title\":\"Tikrinti klaidas kai rašoma\"},\"stylescombo\":{\"label\":\"Stilius\",\"panelTitle\":\"Stilių formatavimas\",\"panelTitle1\":\"Blokų stiliai\",\"panelTitle2\":\"Vidiniai stiliai\",\"panelTitle3\":\"Objektų stiliai\"},\"table\":{\"border\":\"Rėmelio dydis\",\"caption\":\"Antraštė\",\"cell\":{\"menu\":\"Langelis\",\"insertBefore\":\"Įterpti langelį prieš\",\"insertAfter\":\"Įterpti langelį po\",\"deleteCell\":\"Šalinti langelius\",\"merge\":\"Sujungti langelius\",\"mergeRight\":\"Sujungti su dešine\",\"mergeDown\":\"Sujungti su apačia\",\"splitHorizontal\":\"Skaidyti langelį horizontaliai\",\"splitVertical\":\"Skaidyti langelį vertikaliai\",\"title\":\"Cell nustatymai\",\"cellType\":\"Cell rūšis\",\"rowSpan\":\"Eilučių Span\",\"colSpan\":\"Stulpelių Span\",\"wordWrap\":\"Sutraukti raides\",\"hAlign\":\"Horizontalus lygiavimas\",\"vAlign\":\"Vertikalus lygiavimas\",\"alignBaseline\":\"Apatinė linija\",\"bgColor\":\"Fono spalva\",\"borderColor\":\"Rėmelio spalva\",\"data\":\"Data\",\"header\":\"Antraštė\",\"yes\":\"Taip\",\"no\":\"Ne\",\"invalidWidth\":\"Reikšmė turi būti skaičius.\",\"invalidHeight\":\"Reikšmė turi būti skaičius.\",\"invalidRowSpan\":\"Reikšmė turi būti skaičius.\",\"invalidColSpan\":\"Reikšmė turi būti skaičius.\",\"chooseColor\":\"Pasirinkite\"},\"cellPad\":\"Tarpas nuo langelio rėmo iki teksto\",\"cellSpace\":\"Tarpas tarp langelių\",\"column\":{\"menu\":\"Stulpelis\",\"insertBefore\":\"Įterpti stulpelį prieš\",\"insertAfter\":\"Įterpti stulpelį po\",\"deleteColumn\":\"Šalinti stulpelius\"},\"columns\":\"Stulpeliai\",\"deleteTable\":\"Šalinti lentelę\",\"headers\":\"Antraštės\",\"headersBoth\":\"Abu\",\"headersColumn\":\"Pirmas stulpelis\",\"headersNone\":\"Nėra\",\"headersRow\":\"Pirma eilutė\",\"invalidBorder\":\"Reikšmė turi būti nurodyta skaičiumi.\",\"invalidCellPadding\":\"Reikšmė turi būti nurodyta skaičiumi.\",\"invalidCellSpacing\":\"Reikšmė turi būti nurodyta skaičiumi.\",\"invalidCols\":\"Skaičius turi būti didesnis nei 0.\",\"invalidHeight\":\"Reikšmė turi būti nurodyta skaičiumi.\",\"invalidRows\":\"Skaičius turi būti didesnis nei 0.\",\"invalidWidth\":\"Reikšmė turi būti nurodyta skaičiumi.\",\"menu\":\"Lentelės savybės\",\"row\":{\"menu\":\"Eilutė\",\"insertBefore\":\"Įterpti eilutę prieš\",\"insertAfter\":\"Įterpti eilutę po\",\"deleteRow\":\"Šalinti eilutes\"},\"rows\":\"Eilutės\",\"summary\":\"Santrauka\",\"title\":\"Lentelės savybės\",\"toolbar\":\"Lentelė\",\"widthPc\":\"procentais\",\"widthPx\":\"taškais\",\"widthUnit\":\"pločio vienetas\"},\"undo\":{\"redo\":\"Atstatyti\",\"undo\":\"Atšaukti\"},\"wsc\":{\"btnIgnore\":\"Ignoruoti\",\"btnIgnoreAll\":\"Ignoruoti visus\",\"btnReplace\":\"Pakeisti\",\"btnReplaceAll\":\"Pakeisti visus\",\"btnUndo\":\"Atšaukti\",\"changeTo\":\"Pakeisti į\",\"errorLoading\":\"Klaida įkraunant servisą: %s.\",\"ieSpellDownload\":\"Rašybos tikrinimas neinstaliuotas. Ar Jūs norite jį dabar atsisiųsti?\",\"manyChanges\":\"Rašybos tikrinimas baigtas: Pakeista %1 žodžių\",\"noChanges\":\"Rašybos tikrinimas baigtas: Nėra pakeistų žodžių\",\"noMispell\":\"Rašybos tikrinimas baigtas: Nerasta rašybos klaidų\",\"noSuggestions\":\"- Nėra pasiūlymų -\",\"notAvailable\":\"Atleiskite, šiuo metu servisas neprieinamas.\",\"notInDic\":\"Žodyne nerastas\",\"oneChange\":\"Rašybos tikrinimas baigtas: Vienas žodis pakeistas\",\"progress\":\"Vyksta rašybos tikrinimas...\",\"title\":\"Tikrinti klaidas\",\"toolbar\":\"Rašybos tikrinimas\"}};"
  },
  {
    "path": "assets/ckeditor/lang/lv.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['lv']={\"editor\":\"Bagātinātā teksta redaktors\",\"editorPanel\":\"Bagātinātā teksta redaktora panelis\",\"common\":{\"editorHelp\":\"Palīdzībai, nospiediet ALT 0 \",\"browseServer\":\"Skatīt servera saturu\",\"url\":\"URL\",\"protocol\":\"Protokols\",\"upload\":\"Augšupielādēt\",\"uploadSubmit\":\"Nosūtīt serverim\",\"image\":\"Attēls\",\"flash\":\"Flash\",\"form\":\"Forma\",\"checkbox\":\"Atzīmēšanas kastīte\",\"radio\":\"Izvēles poga\",\"textField\":\"Teksta rinda\",\"textarea\":\"Teksta laukums\",\"hiddenField\":\"Paslēpta teksta rinda\",\"button\":\"Poga\",\"select\":\"Iezīmēšanas lauks\",\"imageButton\":\"Attēlpoga\",\"notSet\":\"<nav iestatīts>\",\"id\":\"Id\",\"name\":\"Nosaukums\",\"langDir\":\"Valodas lasīšanas virziens\",\"langDirLtr\":\"No kreisās uz labo (LTR)\",\"langDirRtl\":\"No labās uz kreiso (RTL)\",\"langCode\":\"Valodas kods\",\"longDescr\":\"Gara apraksta Hipersaite\",\"cssClass\":\"Stilu saraksta klases\",\"advisoryTitle\":\"Konsultatīvs virsraksts\",\"cssStyle\":\"Stils\",\"ok\":\"Darīts!\",\"cancel\":\"Atcelt\",\"close\":\"Aizvērt\",\"preview\":\"Priekšskatījums\",\"resize\":\"Mērogot\",\"generalTab\":\"Vispārīgi\",\"advancedTab\":\"Izvērstais\",\"validateNumberFailed\":\"Šī vērtība nav skaitlis\",\"confirmNewPage\":\"Jebkuras nesaglabātās izmaiņas tiks zaudētas. Vai tiešām vēlaties atvērt jaunu lapu?\",\"confirmCancel\":\"Daži no uzstādījumiem ir mainīti. Vai tiešām vēlaties aizvērt šo dialogu?\",\"options\":\"Uzstādījumi\",\"target\":\"Mērķis\",\"targetNew\":\"Jauns logs (_blank)\",\"targetTop\":\"Virsējais logs (_top)\",\"targetSelf\":\"Tas pats logs (_self)\",\"targetParent\":\"Avota logs (_parent)\",\"langDirLTR\":\"Kreisais uz Labo (LTR)\",\"langDirRTL\":\"Labais uz Kreiso (RTL)\",\"styles\":\"Stils\",\"cssClasses\":\"Stilu klases\",\"width\":\"Platums\",\"height\":\"Augstums\",\"align\":\"Nolīdzināt\",\"alignLeft\":\"Pa kreisi\",\"alignRight\":\"Pa labi\",\"alignCenter\":\"Centrēti\",\"alignJustify\":\"Izlīdzināt malas\",\"alignTop\":\"Augšā\",\"alignMiddle\":\"Vertikāli centrēts\",\"alignBottom\":\"Apakšā\",\"alignNone\":\"Nekas\",\"invalidValue\":\"Nekorekta vērtība\",\"invalidHeight\":\"Augstumam jābūt skaitlim.\",\"invalidWidth\":\"Platumam jābūt skaitlim\",\"invalidCssLength\":\"Laukam \\\"%1\\\" norādītajai vērtībai jābūt pozitīvam skaitlim ar vai bez korektām CSS mērvienībām (px, %, in, cm, mm, em, ex, pt, vai pc).\",\"invalidHtmlLength\":\"Laukam \\\"%1\\\" norādītajai vērtībai jābūt pozitīvam skaitlim ar vai bez korektām HTML mērvienībām (px vai %).\",\"invalidInlineStyle\":\"Iekļautajā stilā norādītajai vērtībai jāsastāv no viena vai vairākiem pāriem pēc forma'ta \\\"nosaukums: vērtība\\\", atdalītiem ar semikolu.\",\"cssLengthTooltip\":\"Ievadiet vērtību pikseļos vai skaitli ar derīgu CSS mērvienību (px, %, in, cm, mm, em, ex, pt, vai pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nav pieejams</span>\"},\"about\":{\"copy\":\"Kopēšanas tiesības &copy; $1. Visas tiesības rezervētas.\",\"dlgTitle\":\"Par CKEditor\",\"help\":\"Pārbaudiet $1 palīdzībai.\",\"moreInfo\":\"Informācijai par licenzēšanu apmeklējiet mūsu mājas lapu:\",\"title\":\"Par CKEditor\",\"userGuide\":\"CKEditor Lietotāja pamācība\"},\"basicstyles\":{\"bold\":\"Treknināts\",\"italic\":\"Kursīvs\",\"strike\":\"Pārsvītrots\",\"subscript\":\"Apakšrakstā\",\"superscript\":\"Augšrakstā\",\"underline\":\"Pasvītrots\"},\"bidi\":{\"ltr\":\"Teksta virziens no kreisās uz labo\",\"rtl\":\"Teksta virziens no labās uz kreiso\"},\"blockquote\":{\"toolbar\":\"Bloka citāts\"},\"clipboard\":{\"copy\":\"Kopēt\",\"copyError\":\"Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt kopēšanas darbību.  Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.\",\"cut\":\"Izgriezt\",\"cutError\":\"Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt izgriezšanas darbību.  Lūdzu, izmantojiet (Ctrl/Cmd+X), lai veiktu šo darbību.\",\"paste\":\"Ielīmēt\",\"pasteArea\":\"Ielīmēšanas zona\",\"pasteMsg\":\"Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.\",\"securityMsg\":\"Jūsu pārlūka drošības uzstādījumu dēļ, nav iespējams tieši piekļūt jūsu starpliktuvei. Jums jāielīmē atkārtoti šajā logā.\",\"title\":\"Ievietot\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automātiska\",\"bgColorTitle\":\"Fona krāsa\",\"colors\":{\"000\":\"Melns\",\"800000\":\"Sarkanbrūns\",\"8B4513\":\"Sedlu brūns\",\"2F4F4F\":\"Tumšas tāfeles pelēks\",\"008080\":\"Zili-zaļš\",\"000080\":\"Jūras\",\"4B0082\":\"Indigo\",\"696969\":\"Tumši pelēks\",\"B22222\":\"Ķieģeļsarkans\",\"A52A2A\":\"Brūns\",\"DAA520\":\"Zelta\",\"006400\":\"Tumši zaļš\",\"40E0D0\":\"Tirkīzs\",\"0000CD\":\"Vidēji zils\",\"800080\":\"Purpurs\",\"808080\":\"Pelēks\",\"F00\":\"Sarkans\",\"FF8C00\":\"Tumši oranžs\",\"FFD700\":\"Zelta\",\"008000\":\"Zaļš\",\"0FF\":\"Tumšzils\",\"00F\":\"Zils\",\"EE82EE\":\"Violets\",\"A9A9A9\":\"Pelēks\",\"FFA07A\":\"Gaiši laškrāsas\",\"FFA500\":\"Oranžs\",\"FFFF00\":\"Dzeltens\",\"00FF00\":\"Laima\",\"AFEEEE\":\"Gaiši tirkīza\",\"ADD8E6\":\"Gaiši zils\",\"DDA0DD\":\"Plūmju\",\"D3D3D3\":\"Gaiši pelēks\",\"FFF0F5\":\"Lavandas sārts\",\"FAEBD7\":\"Antīki balts\",\"FFFFE0\":\"Gaiši dzeltens\",\"F0FFF0\":\"Meduspile\",\"F0FFFF\":\"Debesszils\",\"F0F8FF\":\"Alises zils\",\"E6E6FA\":\"Lavanda\",\"FFF\":\"Balts\"},\"more\":\"Plašāka palete...\",\"panelTitle\":\"Krāsa\",\"textColorTitle\":\"Teksta krāsa\"},\"colordialog\":{\"clear\":\"Notīrīt\",\"highlight\":\"Paraugs\",\"options\":\"Krāsas uzstādījumi\",\"selected\":\"Izvēlētā krāsa\",\"title\":\"Izvēlies krāsu\"},\"templates\":{\"button\":\"Sagataves\",\"emptyListMsg\":\"(Nav norādītas sagataves)\",\"insertOption\":\"Aizvietot pašreizējo saturu\",\"options\":\"Sagataves uzstādījumi\",\"selectPromptMsg\":\"Lūdzu, norādiet sagatavi, ko atvērt editorā<br>(patreizējie dati tiks zaudēti):\",\"title\":\"Satura sagataves\"},\"contextmenu\":{\"options\":\"Uznirstošās izvēlnes uzstādījumi\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Konsultatīvs virsraksts\",\"cssClassInputLabel\":\"Stilu klases\",\"edit\":\"Labot Div\",\"inlineStyleInputLabel\":\"Iekļautais stils\",\"langDirLTRLabel\":\"Kreisais uz Labo (LTR)\",\"langDirLabel\":\"Valodas virziens\",\"langDirRTLLabel\":\"Labais uz kreiso (RTL)\",\"languageCodeInputLabel\":\"Valodas kods\",\"remove\":\"Noņemt Div\",\"styleSelectLabel\":\"Stils\",\"title\":\"Izveidot div konteineri\",\"toolbar\":\"Izveidot div konteineri\"},\"toolbar\":{\"toolbarCollapse\":\"Aizvērt rīkjoslu\",\"toolbarExpand\":\"Atvērt rīkjoslu\",\"toolbarGroups\":{\"document\":\"Dokuments\",\"clipboard\":\"Starpliktuve/Atcelt\",\"editing\":\"Labošana\",\"forms\":\"Formas\",\"basicstyles\":\"Pamata stili\",\"paragraph\":\"Paragrāfs\",\"links\":\"Saites\",\"insert\":\"Ievietot\",\"styles\":\"Stili\",\"colors\":\"Krāsas\",\"tools\":\"Rīki\"},\"toolbars\":\"Redaktora rīkjoslas\"},\"elementspath\":{\"eleLabel\":\"Elementa ceļš\",\"eleTitle\":\"%1 elements\"},\"find\":{\"find\":\"Meklēt\",\"findOptions\":\"Meklēt uzstādījumi\",\"findWhat\":\"Meklēt:\",\"matchCase\":\"Reģistrjūtīgs\",\"matchCyclic\":\"Sakrist cikliski\",\"matchWord\":\"Jāsakrīt pilnībā\",\"notFoundMsg\":\"Norādītā frāze netika atrasta.\",\"replace\":\"Nomainīt\",\"replaceAll\":\"Aizvietot visu\",\"replaceSuccessMsg\":\"%1 gadījums(i) aizvietoti\",\"replaceWith\":\"Nomainīt uz:\",\"title\":\"Meklēt un aizvietot\"},\"fakeobjects\":{\"anchor\":\"Iezīme\",\"flash\":\"Flash animācija\",\"hiddenfield\":\"Slēpts lauks\",\"iframe\":\"Iframe\",\"unknown\":\"Nezināms objekts\"},\"flash\":{\"access\":\"Skripta pieeja\",\"accessAlways\":\"Vienmēr\",\"accessNever\":\"Nekad\",\"accessSameDomain\":\"Tas pats domēns\",\"alignAbsBottom\":\"Absolūti apakšā\",\"alignAbsMiddle\":\"Absolūti vertikāli centrēts\",\"alignBaseline\":\"Pamatrindā\",\"alignTextTop\":\"Teksta augšā\",\"bgcolor\":\"Fona krāsa\",\"chkFull\":\"Pilnekrāns\",\"chkLoop\":\"Nepārtraukti\",\"chkMenu\":\"Atļaut Flash izvēlni\",\"chkPlay\":\"Automātiska atskaņošana\",\"flashvars\":\"Flash mainīgie\",\"hSpace\":\"Horizontālā telpa\",\"properties\":\"Flash īpašības\",\"propertiesTab\":\"Uzstādījumi\",\"quality\":\"Kvalitāte\",\"qualityAutoHigh\":\"Automātiski Augsta\",\"qualityAutoLow\":\"Automātiski Zema\",\"qualityBest\":\"Labākā\",\"qualityHigh\":\"Augsta\",\"qualityLow\":\"Zema\",\"qualityMedium\":\"Vidēja\",\"scale\":\"Mainīt izmēru\",\"scaleAll\":\"Rādīt visu\",\"scaleFit\":\"Precīzs izmērs\",\"scaleNoBorder\":\"Bez rāmja\",\"title\":\"Flash īpašības\",\"vSpace\":\"Vertikālā telpa\",\"validateHSpace\":\"Hspace jābūt skaitlim\",\"validateSrc\":\"Lūdzu norādi hipersaiti\",\"validateVSpace\":\"Vspace jābūt skaitlim\",\"windowMode\":\"Loga režīms\",\"windowModeOpaque\":\"Necaurspīdīgs\",\"windowModeTransparent\":\"Caurspīdīgs\",\"windowModeWindow\":\"Logs\"},\"font\":{\"fontSize\":{\"label\":\"Izmērs\",\"voiceLabel\":\"Fonta izmeŗs\",\"panelTitle\":\"Izmērs\"},\"label\":\"Šrifts\",\"panelTitle\":\"Šrifts\",\"voiceLabel\":\"Fonts\"},\"forms\":{\"button\":{\"title\":\"Pogas īpašības\",\"text\":\"Teksts (vērtība)\",\"type\":\"Tips\",\"typeBtn\":\"Poga\",\"typeSbm\":\"Nosūtīt\",\"typeRst\":\"Atcelt\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Atzīmēšanas kastītes īpašības\",\"radioTitle\":\"Izvēles poga īpašības\",\"value\":\"Vērtība\",\"selected\":\"Iezīmēts\",\"required\":\"Required\"},\"form\":{\"title\":\"Formas īpašības\",\"menu\":\"Formas īpašības\",\"action\":\"Darbība\",\"method\":\"Metode\",\"encoding\":\"Kodējums\"},\"hidden\":{\"title\":\"Paslēptās teksta rindas īpašības\",\"name\":\"Nosaukums\",\"value\":\"Vērtība\"},\"select\":{\"title\":\"Iezīmēšanas lauka īpašības\",\"selectInfo\":\"Informācija\",\"opAvail\":\"Pieejamās iespējas\",\"value\":\"Vērtība\",\"size\":\"Izmērs\",\"lines\":\"rindas\",\"chkMulti\":\"Atļaut vairākus iezīmējumus\",\"required\":\"Required\",\"opText\":\"Teksts\",\"opValue\":\"Vērtība\",\"btnAdd\":\"Pievienot\",\"btnModify\":\"Veikt izmaiņas\",\"btnUp\":\"Augšup\",\"btnDown\":\"Lejup\",\"btnSetValue\":\"Noteikt kā iezīmēto vērtību\",\"btnDelete\":\"Dzēst\"},\"textarea\":{\"title\":\"Teksta laukuma īpašības\",\"cols\":\"Kolonnas\",\"rows\":\"Rindas\"},\"textfield\":{\"title\":\"Teksta rindas  īpašības\",\"name\":\"Nosaukums\",\"value\":\"Vērtība\",\"charWidth\":\"Simbolu platums\",\"maxChars\":\"Simbolu maksimālais daudzums\",\"required\":\"Required\",\"type\":\"Tips\",\"typeText\":\"Teksts\",\"typePass\":\"Parole\",\"typeEmail\":\"Epasts\",\"typeSearch\":\"Meklēt\",\"typeTel\":\"Tālruņa numurs\",\"typeUrl\":\"Adrese\"}},\"format\":{\"label\":\"Formāts\",\"panelTitle\":\"Formāts\",\"tag_address\":\"Adrese\",\"tag_div\":\"Rindkopa (DIV)\",\"tag_h1\":\"Virsraksts 1\",\"tag_h2\":\"Virsraksts 2\",\"tag_h3\":\"Virsraksts 3\",\"tag_h4\":\"Virsraksts 4\",\"tag_h5\":\"Virsraksts 5\",\"tag_h6\":\"Virsraksts 6\",\"tag_p\":\"Normāls teksts\",\"tag_pre\":\"Formatēts teksts\"},\"horizontalrule\":{\"toolbar\":\"Ievietot horizontālu Atdalītājsvītru\"},\"iframe\":{\"border\":\"Rādīt rāmi\",\"noUrl\":\"Norādiet iframe adresi\",\"scrolling\":\"Atļaut ritjoslas\",\"title\":\"IFrame uzstādījumi\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatīvais teksts\",\"border\":\"Rāmis\",\"btnUpload\":\"Nosūtīt serverim\",\"button2Img\":\"Vai vēlaties pārveidot izvēlēto attēla pogu uz attēla?\",\"hSpace\":\"Horizontālā telpa\",\"img2Button\":\"Vai vēlaties pārveidot izvēlēto attēlu uz attēla pogas?\",\"infoTab\":\"Informācija par attēlu\",\"linkTab\":\"Hipersaite\",\"lockRatio\":\"Nemainīga Augstuma/Platuma attiecība\",\"menu\":\"Attēla īpašības\",\"resetSize\":\"Atjaunot sākotnējo izmēru\",\"title\":\"Attēla īpašības\",\"titleButton\":\"Attēlpogas īpašības\",\"upload\":\"Augšupielādēt\",\"urlMissing\":\"Trūkst attēla atrašanās adrese.\",\"vSpace\":\"Vertikālā telpa\",\"validateBorder\":\"Apmalei jābūt veselam skaitlim\",\"validateHSpace\":\"HSpace jābūt veselam skaitlim\",\"validateVSpace\":\"VSpace jābūt veselam skaitlim\"},\"indent\":{\"indent\":\"Palielināt atkāpi\",\"outdent\":\"Samazināt atkāpi\"},\"smiley\":{\"options\":\"Smaidiņu uzstādījumi\",\"title\":\"Ievietot smaidiņu\",\"toolbar\":\"Smaidiņi\"},\"justify\":{\"block\":\"Izlīdzināt malas\",\"center\":\"Izlīdzināt pret centru\",\"left\":\"Izlīdzināt pa kreisi\",\"right\":\"Izlīdzināt pa labi\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Pieejas taustiņš\",\"advanced\":\"Izvērstais\",\"advisoryContentType\":\"Konsultatīvs satura tips\",\"advisoryTitle\":\"Konsultatīvs virsraksts\",\"anchor\":{\"toolbar\":\"Ievietot/Labot iezīmi\",\"menu\":\"Labot iezīmi\",\"title\":\"Iezīmes uzstādījumi\",\"name\":\"Iezīmes nosaukums\",\"errorName\":\"Lūdzu norādiet iezīmes nosaukumu\",\"remove\":\"Noņemt iezīmi\"},\"anchorId\":\"Pēc elementa ID\",\"anchorName\":\"Pēc iezīmes nosaukuma\",\"charset\":\"Pievienotā resursa kodējums\",\"cssClasses\":\"Stilu saraksta klases\",\"emailAddress\":\"E-pasta adrese\",\"emailBody\":\"Ziņas saturs\",\"emailSubject\":\"Ziņas tēma\",\"id\":\"ID\",\"info\":\"Hipersaites informācija\",\"langCode\":\"Valodas kods\",\"langDir\":\"Valodas lasīšanas virziens\",\"langDirLTR\":\"No kreisās uz labo (LTR)\",\"langDirRTL\":\"No labās uz kreiso (RTL)\",\"menu\":\"Labot hipersaiti\",\"name\":\"Nosaukums\",\"noAnchors\":\"(Šajā dokumentā nav iezīmju)\",\"noEmail\":\"Lūdzu norādi e-pasta adresi\",\"noUrl\":\"Lūdzu norādi hipersaiti\",\"other\":\"<cits>\",\"popupDependent\":\"Atkarīgs (Netscape)\",\"popupFeatures\":\"Uznirstošā loga nosaukums īpašības\",\"popupFullScreen\":\"Pilnā ekrānā (IE)\",\"popupLeft\":\"Kreisā koordināte\",\"popupLocationBar\":\"Atrašanās vietas josla\",\"popupMenuBar\":\"Izvēlnes josla\",\"popupResizable\":\"Mērogojams\",\"popupScrollBars\":\"Ritjoslas\",\"popupStatusBar\":\"Statusa josla\",\"popupToolbar\":\"Rīku josla\",\"popupTop\":\"Augšējā koordināte\",\"rel\":\"Relācija\",\"selectAnchor\":\"Izvēlēties iezīmi\",\"styles\":\"Stils\",\"tabIndex\":\"Ciļņu indekss\",\"target\":\"Mērķis\",\"targetFrame\":\"<ietvars>\",\"targetFrameName\":\"Mērķa ietvara nosaukums\",\"targetPopup\":\"<uznirstošā logā>\",\"targetPopupName\":\"Uznirstošā loga nosaukums\",\"title\":\"Hipersaite\",\"toAnchor\":\"Iezīme šajā lapā\",\"toEmail\":\"E-pasts\",\"toUrl\":\"Adrese\",\"toolbar\":\"Ievietot/Labot hipersaiti\",\"type\":\"Hipersaites tips\",\"unlink\":\"Noņemt hipersaiti\",\"upload\":\"Augšupielādēt\"},\"list\":{\"bulletedlist\":\"Pievienot/Noņemt vienkāršu sarakstu\",\"numberedlist\":\"Numurēts saraksts\"},\"liststyle\":{\"armenian\":\"Armēņu skaitļi\",\"bulletedTitle\":\"Vienkārša saraksta uzstādījumi\",\"circle\":\"Aplis\",\"decimal\":\"Decimālie (1, 2, 3, utt)\",\"decimalLeadingZero\":\"Decimālie ar nulli (01, 02, 03, utt)\",\"disc\":\"Disks\",\"georgian\":\"Gruzīņu skaitļi (an, ban, gan, utt)\",\"lowerAlpha\":\"Mazie alfabēta (a, b, c, d, e, utt)\",\"lowerGreek\":\"Mazie grieķu (alfa, beta, gamma, utt)\",\"lowerRoman\":\"Mazie romāņu (i, ii, iii, iv, v, utt)\",\"none\":\"Nekas\",\"notset\":\"<nav norādīts>\",\"numberedTitle\":\"Numurēta saraksta uzstādījumi\",\"square\":\"Kvadrāts\",\"start\":\"Sākt\",\"type\":\"Tips\",\"upperAlpha\":\"Lielie alfabēta (A, B, C, D, E, utt)\",\"upperRoman\":\"Lielie romāņu (I, II, III, IV, V, utt)\",\"validateStartNumber\":\"Saraksta sākuma numuram jābūt veselam skaitlim\"},\"magicline\":{\"title\":\"Ievietot šeit rindkopu\"},\"maximize\":{\"maximize\":\"Maksimizēt\",\"minimize\":\"Minimizēt\"},\"newpage\":{\"toolbar\":\"Jauna lapa\"},\"pagebreak\":{\"alt\":\"Lapas pārnesums\",\"toolbar\":\"Ievietot lapas pārtraukumu drukai\"},\"pastetext\":{\"button\":\"Ievietot kā vienkāršu tekstu\",\"title\":\"Ievietot kā vienkāršu tekstu\"},\"pastefromword\":{\"confirmCleanup\":\"Teksts, kuru vēlaties ielīmēt, izskatās ir nokopēts no Word. Vai vēlaties to iztīrīt pirms ielīmēšanas?\",\"error\":\"Iekšējas kļūdas dēļ, neizdevās iztīrīt ielīmētos datus.\",\"title\":\"Ievietot no Worda\",\"toolbar\":\"Ievietot no Worda\"},\"preview\":{\"preview\":\"Priekšskatīt\"},\"print\":{\"toolbar\":\"Drukāt\"},\"removeformat\":{\"toolbar\":\"Noņemt stilus\"},\"save\":{\"toolbar\":\"Saglabāt\"},\"selectall\":{\"toolbar\":\"Iezīmēt visu\"},\"showblocks\":{\"toolbar\":\"Parādīt blokus\"},\"sourcearea\":{\"toolbar\":\"HTML kods\"},\"specialchar\":{\"options\":\"Speciālo simbolu uzstādījumi\",\"title\":\"Ievietot īpašu simbolu\",\"toolbar\":\"Ievietot speciālo simbolu\"},\"scayt\":{\"btn_about\":\"Par SCAYT\",\"btn_dictionaries\":\"Vārdnīcas\",\"btn_disable\":\"Atslēgt SCAYT\",\"btn_enable\":\"Ieslēgt SCAYT\",\"btn_langs\":\"Valodas\",\"btn_options\":\"Uzstādījumi\",\"text_title\":\"Pārbaudīt gramatiku rakstot\"},\"stylescombo\":{\"label\":\"Stils\",\"panelTitle\":\"Formatēšanas stili\",\"panelTitle1\":\"Bloka stili\",\"panelTitle2\":\"iekļautie stili\",\"panelTitle3\":\"Objekta stili\"},\"table\":{\"border\":\"Rāmja izmērs\",\"caption\":\"Leģenda\",\"cell\":{\"menu\":\"Šūna\",\"insertBefore\":\"Pievienot šūnu pirms\",\"insertAfter\":\"Pievienot šūnu pēc\",\"deleteCell\":\"Dzēst rūtiņas\",\"merge\":\"Apvienot rūtiņas\",\"mergeRight\":\"Apvieno pa labi\",\"mergeDown\":\"Apvienot uz leju\",\"splitHorizontal\":\"Sadalīt šūnu horizontāli\",\"splitVertical\":\"Sadalīt šūnu vertikāli\",\"title\":\"Šūnas uzstādījumi\",\"cellType\":\"Šūnas tips\",\"rowSpan\":\"Apvienotas rindas\",\"colSpan\":\"Apvienotas kolonas\",\"wordWrap\":\"Vārdu pārnese\",\"hAlign\":\"Horizontālais novietojums\",\"vAlign\":\"Vertikālais novietojums\",\"alignBaseline\":\"Pamatrinda\",\"bgColor\":\"Fona krāsa\",\"borderColor\":\"Rāmja krāsa\",\"data\":\"Dati\",\"header\":\"Virsraksts\",\"yes\":\"Jā\",\"no\":\"Nē\",\"invalidWidth\":\"Šūnas platumam jābūt skaitlim\",\"invalidHeight\":\"Šūnas augstumam jābūt skaitlim\",\"invalidRowSpan\":\"Apvienojamo rindu skaitam jābūt veselam skaitlim\",\"invalidColSpan\":\"Apvienojamo kolonu skaitam jābūt veselam skaitlim\",\"chooseColor\":\"Izvēlēties\"},\"cellPad\":\"Rūtiņu nobīde\",\"cellSpace\":\"Rūtiņu atstatums\",\"column\":{\"menu\":\"Kolonna\",\"insertBefore\":\"Ievietot kolonu pirms\",\"insertAfter\":\"Ievieto kolonu pēc\",\"deleteColumn\":\"Dzēst kolonnas\"},\"columns\":\"Kolonnas\",\"deleteTable\":\"Dzēst tabulu\",\"headers\":\"Virsraksti\",\"headersBoth\":\"Abi\",\"headersColumn\":\"Pirmā kolona\",\"headersNone\":\"Nekas\",\"headersRow\":\"Pirmā rinda\",\"invalidBorder\":\"Rāmju izmēram jābūt skaitlim\",\"invalidCellPadding\":\"Šūnu atkāpēm jābūt pozitīvam skaitlim\",\"invalidCellSpacing\":\"Šūnu atstarpēm jābūt pozitīvam skaitlim\",\"invalidCols\":\"Kolonu skaitam jābūt lielākam par 0\",\"invalidHeight\":\"Tabulas augstumam jābūt skaitlim\",\"invalidRows\":\"Rindu skaitam jābūt lielākam par 0\",\"invalidWidth\":\"Tabulas platumam jābūt skaitlim\",\"menu\":\"Tabulas īpašības\",\"row\":{\"menu\":\"Rinda\",\"insertBefore\":\"Ievietot rindu pirms\",\"insertAfter\":\"Ievietot rindu pēc\",\"deleteRow\":\"Dzēst rindas\"},\"rows\":\"Rindas\",\"summary\":\"Anotācija\",\"title\":\"Tabulas īpašības\",\"toolbar\":\"Tabula\",\"widthPc\":\"procentuāli\",\"widthPx\":\"pikseļos\",\"widthUnit\":\"platuma mērvienība\"},\"undo\":{\"redo\":\"Atkārtot\",\"undo\":\"Atcelt\"},\"wsc\":{\"btnIgnore\":\"Ignorēt\",\"btnIgnoreAll\":\"Ignorēt visu\",\"btnReplace\":\"Aizvietot\",\"btnReplaceAll\":\"Aizvietot visu\",\"btnUndo\":\"Atcelt\",\"changeTo\":\"Nomainīt uz\",\"errorLoading\":\"Kļūda ielādējot aplikācijas servisa adresi: %s.\",\"ieSpellDownload\":\"Pareizrakstības pārbaudītājs nav pievienots. Vai vēlaties to lejupielādēt tagad?\",\"manyChanges\":\"Pareizrakstības pārbaude pabeigta: %1 vārdi tika mainīti\",\"noChanges\":\"Pareizrakstības pārbaude pabeigta: nekas netika labots\",\"noMispell\":\"Pareizrakstības pārbaude pabeigta: kļūdas netika atrastas\",\"noSuggestions\":\"- Nav ieteikumu -\",\"notAvailable\":\"Atvainojiet, bet serviss šobrīd nav pieejams.\",\"notInDic\":\"Netika atrasts vārdnīcā\",\"oneChange\":\"Pareizrakstības pārbaude pabeigta: 1 vārds izmainīts\",\"progress\":\"Notiek pareizrakstības pārbaude...\",\"title\":\"Pārbaudīt gramatiku\",\"toolbar\":\"Pareizrakstības pārbaude\"}};"
  },
  {
    "path": "assets/ckeditor/lang/mk.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['mk']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Притисни ALT 0 за помош\",\"browseServer\":\"Пребарај низ серверот\",\"url\":\"URL\",\"protocol\":\"Протокол\",\"upload\":\"Прикачи\",\"uploadSubmit\":\"Прикачи на сервер\",\"image\":\"Слика\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Checkbox\",\"radio\":\"Radio Button\",\"textField\":\"Поле за текст\",\"textarea\":\"Големо поле за текст\",\"hiddenField\":\"Скриено поле\",\"button\":\"Button\",\"select\":\"Selection Field\",\"imageButton\":\"Копче-слика\",\"notSet\":\"<not set>\",\"id\":\"Id\",\"name\":\"Name\",\"langDir\":\"Насока на јазик\",\"langDirLtr\":\"Лево кон десно\",\"langDirRtl\":\"Десно кон лево\",\"langCode\":\"Код на јазик\",\"longDescr\":\"Long Description URL\",\"cssClass\":\"Stylesheet Classes\",\"advisoryTitle\":\"Advisory Title\",\"cssStyle\":\"Стил\",\"ok\":\"OK\",\"cancel\":\"Cancel\",\"close\":\"Close\",\"preview\":\"Preview\",\"resize\":\"Resize\",\"generalTab\":\"Општо\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Опции\",\"target\":\"Target\",\"targetNew\":\"Нов прозорец (_blank)\",\"targetTop\":\"Најгорниот прозорец (_top)\",\"targetSelf\":\"Истиот прозорец (_self)\",\"targetParent\":\"Прозорец-родител (_parent)\",\"langDirLTR\":\"Лево кон десно\",\"langDirRTL\":\"Десно кон лево\",\"styles\":\"Стил\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Широчина\",\"height\":\"Височина\",\"align\":\"Alignment\",\"alignLeft\":\"Лево\",\"alignRight\":\"Десно\",\"alignCenter\":\"Во средина\",\"alignJustify\":\"Justify\",\"alignTop\":\"Горе\",\"alignMiddle\":\"Средина\",\"alignBottom\":\"Доле\",\"alignNone\":\"Никое\",\"invalidValue\":\"Невалидна вредност\",\"invalidHeight\":\"Височината мора да биде број.\",\"invalidWidth\":\"Широчината мора да биде број.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Авторски права &copy; $1. Сите права се задржани.\",\"dlgTitle\":\"За CKEditor\",\"help\":\"Отворете $1 за помош.\",\"moreInfo\":\"За информации околу лиценцата, ве молиме посетете го нашиот веб-сајт: \",\"title\":\"За CKEditor\",\"userGuide\":\"CKEditor упатство за корисници\"},\"basicstyles\":{\"bold\":\"Здебелено\",\"italic\":\"Накривено\",\"strike\":\"Прецртано\",\"subscript\":\"Долен индекс\",\"superscript\":\"Горен индекс\",\"underline\":\"Подвлечено\"},\"bidi\":{\"ltr\":\"Насока на текст: од лево кон десно\",\"rtl\":\"Насока на текст: од десно кон лево\"},\"blockquote\":{\"toolbar\":\"Одвоен цитат\"},\"clipboard\":{\"copy\":\"Копирај (Copy)\",\"copyError\":\"Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот автоматски да изврши копирање. Ве молиме употребете ја тастатурата. (Ctrl/Cmd+C)\",\"cut\":\"Исечи (Cut)\",\"cutError\":\"Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот автоматски да изврши сечење. Ве молиме употребете ја тастатурата. (Ctrl/Cmd+C)\",\"paste\":\"Залепи (Paste)\",\"pasteArea\":\"Простор за залепување\",\"pasteMsg\":\"Ве молиме да залепите во следниот квадрат користејќи ја тастатурата (<string>Ctrl/Cmd+V</string>) и да притиснете OK\",\"securityMsg\":\"Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот директно да пристапи до копираните податоци. Потребно е повторно да се обидете во овој прозорец.\",\"title\":\"Залепи (Paste)\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Background Color\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"More Colors...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Text Color\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Templates\",\"emptyListMsg\":\"(No templates defined)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Content Templates\"},\"contextmenu\":{\"options\":\"Контекст-мени опции\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Лево кон десно\",\"langDirLabel\":\"Насока на јазик\",\"langDirRTLLabel\":\"Десно кон лево\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Стил\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Пронајди\",\"findOptions\":\"Опции за пронаоѓање\",\"findWhat\":\"Што барате:\",\"matchCase\":\"Се совпаѓа голема/мала буква,\",\"matchCyclic\":\"Пребарај циклично\",\"matchWord\":\"Се совпаѓа цел збор\",\"notFoundMsg\":\"Внесениот текст не беше пронајден.\",\"replace\":\"Замени\",\"replaceAll\":\"Замени ги сите\",\"replaceSuccessMsg\":\"%1 случај/и беа заменети.\",\"replaceWith\":\"Замени со:\",\"title\":\"Пронајди и замени\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Скриено поле\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs Bottom\",\"alignAbsMiddle\":\"Abs Middle\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Text Top\",\"bgcolor\":\"Background color\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"Хоризонтален простор\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"Вертикален простор\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"URL must not be empty.\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Size\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Font Size\"},\"label\":\"Font\",\"panelTitle\":\"Font Name\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Button Properties\",\"text\":\"Text (Value)\",\"type\":\"Type\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"Form Properties\",\"menu\":\"Form Properties\",\"action\":\"Action\",\"method\":\"Method\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Hidden Field Properties\",\"name\":\"Name\",\"value\":\"Value\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Available Options\",\"value\":\"Value\",\"size\":\"Size\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"Delete\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"Columns\",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"Name\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Paragraph Format\",\"tag_address\":\"Address\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Insert Horizontal Line\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Алтернативен текст\",\"border\":\"Раб\",\"btnUpload\":\"Прикачи на сервер\",\"button2Img\":\"Дали сакате да направите сликата-копче да биде само слика?\",\"hSpace\":\"Хоризонтален простор\",\"img2Button\":\"Дали сакате да ја претворите сликата во слика-копче?\",\"infoTab\":\"Информации за сликата\",\"linkTab\":\"Врска\",\"lockRatio\":\"Зачувај пропорција\",\"menu\":\"Својства на сликата\",\"resetSize\":\"Ресетирај големина\",\"title\":\"Својства на сликата\",\"titleButton\":\"Својства на копче-сликата\",\"upload\":\"Прикачи\",\"urlMissing\":\"Недостасува URL-то на сликата.\",\"vSpace\":\"Вертикален простор\",\"validateBorder\":\"Работ мора да биде цел број.\",\"validateHSpace\":\"Хор. простор мора да биде цел број.\",\"validateVSpace\":\"Верт. простор мора да биде цел број.\"},\"indent\":{\"indent\":\"Increase Indent\",\"outdent\":\"Decrease Indent\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Insert a Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Justify\",\"center\":\"Во средина\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Advisory Title\",\"anchor\":{\"toolbar\":\"Anchor\",\"menu\":\"Edit Anchor\",\"title\":\"Anchor Properties\",\"name\":\"Anchor Name\",\"errorName\":\"Please type the anchor name\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet Classes\",\"emailAddress\":\"E-Mail Address\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Message Subject\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Код на јазик\",\"langDir\":\"Насока на јазик\",\"langDirLTR\":\"Лево кон десно\",\"langDirRTL\":\"Десно кон лево\",\"menu\":\"Edit Link\",\"name\":\"Name\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Please type the e-mail address\",\"noUrl\":\"Please type the link URL\",\"other\":\"<other>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Relationship\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"Стил\",\"tabIndex\":\"Tab Index\",\"target\":\"Target\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"Врска\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Врска\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"Прикачи\"},\"list\":{\"bulletedlist\":\"Insert/Remove Bulleted List\",\"numberedlist\":\"Insert/Remove Numbered List\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"New Page\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Paste as plain text\",\"title\":\"Paste as Plain Text\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Paste from Word\",\"toolbar\":\"Paste from Word\"},\"preview\":{\"preview\":\"Preview\"},\"print\":{\"toolbar\":\"Print\"},\"removeformat\":{\"toolbar\":\"Remove Format\"},\"save\":{\"toolbar\":\"Save\"},\"selectall\":{\"toolbar\":\"Select All\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Source\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Select Special Character\",\"toolbar\":\"Insert Special Character\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Styles\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Border size\",\"caption\":\"Caption\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Delete Cells\",\"merge\":\"Merge Cells\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Delete Columns\"},\"columns\":\"Columns\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Table Properties\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Delete Rows\"},\"rows\":\"Rows\",\"summary\":\"Summary\",\"title\":\"Table Properties\",\"toolbar\":\"Table\",\"widthPc\":\"percent\",\"widthPx\":\"pixels\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Redo\",\"undo\":\"Undo\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/mn.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['mn']={\"editor\":\"Хэлбэрт бичвэр боловсруулагч\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Үйлчлэгч тооцоолуур (сервэр)-ийг үзэх\",\"url\":\"цахим хуудасны хаяг (URL)\",\"protocol\":\"Протокол\",\"upload\":\"Илгээж ачаалах\",\"uploadSubmit\":\"Үүнийг үйлчлэгч тооцоолуур (сервер) лүү илгээх\",\"image\":\"Зураг\",\"flash\":\"Флаш хөдөлгөөнтэй зураг\",\"form\":\"Маягт\",\"checkbox\":\"Тэмдэглээний нүд\",\"radio\":\"Радио товчлуур\",\"textField\":\"Бичвэрийн талбар\",\"textarea\":\"Бичвэрийн зай\",\"hiddenField\":\"Далд талбар\",\"button\":\"Товчлуур\",\"select\":\"Сонголтын талбар\",\"imageButton\":\"Зургий товчуур\",\"notSet\":\"<тохируулаагүй>\",\"id\":\"Id (техникийн нэр)\",\"name\":\"Нэр\",\"langDir\":\"Хэлний чиглэл\",\"langDirLtr\":\"Зүүнээс баруун (LTR)\",\"langDirRtl\":\"Баруунаас зүүн (RTL)\",\"langCode\":\"Хэлний код\",\"longDescr\":\"Урт тайлбарын вэб хаяг\",\"cssClass\":\"Хэлбэрийн хуудасны ангиуд\",\"advisoryTitle\":\"Зөвлөх гарчиг\",\"cssStyle\":\"Загвар\",\"ok\":\"За\",\"cancel\":\"Болих\",\"close\":\"Хаах\",\"preview\":\"Урьдчилан харах\",\"resize\":\"Resize\",\"generalTab\":\"Ерөнхий\",\"advancedTab\":\"Гүнзгий\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Сонголт\",\"target\":\"Бай\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Зүүн талаас баруун тийшээ (LTR)\",\"langDirRTL\":\"Баруун талаас зүүн тийшээ (RTL)\",\"styles\":\"Загвар\",\"cssClasses\":\"Хэлбэрийн хуудасны ангиуд\",\"width\":\"Өргөн\",\"height\":\"Өндөр\",\"align\":\"Эгнээ\",\"alignLeft\":\"Зүүн\",\"alignRight\":\"Баруун\",\"alignCenter\":\"Төвд\",\"alignJustify\":\"Тэгшлэх\",\"alignTop\":\"Дээд талд\",\"alignMiddle\":\"Дунд\",\"alignBottom\":\"Доод талд\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Өндөр нь тоо байх ёстой.\",\"invalidWidth\":\"Өргөн нь тоо байх ёстой.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Тод бүдүүн\",\"italic\":\"Налуу\",\"strike\":\"Дундуур нь зураастай болгох\",\"subscript\":\"Суурь болгох\",\"superscript\":\"Зэрэг болгох\",\"underline\":\"Доогуур нь зураастай болгох\"},\"bidi\":{\"ltr\":\"Зүүнээс баруун тийш бичлэг\",\"rtl\":\"Баруунаас зүүн тийш бичлэг\"},\"blockquote\":{\"toolbar\":\"Ишлэл хэсэг\"},\"clipboard\":{\"copy\":\"Хуулах\",\"copyError\":\"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.\",\"cut\":\"Хайчлах\",\"cutError\":\"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.\",\"paste\":\"Буулгах\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.\",\"securityMsg\":\"Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.\",\"title\":\"Буулгах\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Автоматаар\",\"bgColorTitle\":\"Дэвсгэр өнгө\",\"colors\":{\"000\":\"Хар\",\"800000\":\"Хүрэн\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Саарал\",\"F00\":\"Улаан\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Алт\",\"008000\":\"Ногоон\",\"0FF\":\"Цэнхэр\",\"00F\":\"Хөх\",\"EE82EE\":\"Ягаан\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Улбар шар\",\"FFFF00\":\"Шар\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Цайвар саарал\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Цагаан\"},\"more\":\"Нэмэлт өнгөнүүд...\",\"panelTitle\":\"Өнгөнүүд\",\"textColorTitle\":\"Бичвэрийн өнгө\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Загварууд\",\"emptyListMsg\":\"(Загвар тодорхойлогдоогүй байна)\",\"insertOption\":\"Одоогийн агууллагыг дарж бичих\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Загварыг нээж editor-рүү сонгож оруулна уу<br />(Одоогийн агууллагыг устаж магадгүй):\",\"title\":\"Загварын агуулга\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Зөвлөлдөх гарчиг\",\"cssClassInputLabel\":\"Stylesheet классууд\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Зүүн талаас баруун тишээ (LTR)\",\"langDirLabel\":\"Хэлний чиглэл\",\"langDirRTLLabel\":\"Баруун талаас зүүн тишээ (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Загвар\",\"title\":\"Div гэдэг хэсэг бий болгох\",\"toolbar\":\"Div гэдэг хэсэг бий болгох\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Холбоосууд\",\"insert\":\"Оруулах\",\"styles\":\"Загварууд\",\"colors\":\"Онгөнүүд\",\"tools\":\"Хэрэгслүүд\"},\"toolbars\":\"Болосруулагчийн хэрэгслийн самбар\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Хайх\",\"findOptions\":\"Хайх сонголтууд\",\"findWhat\":\"Хайх үг/үсэг:\",\"matchCase\":\"Тэнцэх төлөв\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Тэнцэх бүтэн үг\",\"notFoundMsg\":\"Хайсан бичвэрийг олсонгүй.\",\"replace\":\"Орлуулах\",\"replaceAll\":\"Бүгдийг нь солих\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Солих үг:\",\"title\":\"Хайж орлуулах\"},\"fakeobjects\":{\"anchor\":\"Зангуу\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Нууц талбар\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Онцлогууд\",\"accessNever\":\"Хэзээ ч үгүй\",\"accessSameDomain\":\"Байнга\",\"alignAbsBottom\":\"Abs доод талд\",\"alignAbsMiddle\":\"Abs Дунд талд\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Текст дээр\",\"bgcolor\":\"Дэвсгэр өнгө\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Давтах\",\"chkMenu\":\"Флаш цэс идвэхжүүлэх\",\"chkPlay\":\"Автоматаар тоглох\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"Хөндлөн зай\",\"properties\":\"Флаш шинж чанар\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Өргөгтгөх\",\"scaleAll\":\"Бүгдийг харуулах\",\"scaleFit\":\"Яг тааруулах\",\"scaleNoBorder\":\"Хүрээгүй\",\"title\":\"Флаш  шинж чанар\",\"vSpace\":\"Босоо зай\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"Линк URL-ээ төрөлжүүлнэ үү\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Хэмжээ\",\"voiceLabel\":\"Үсгийн хэмжээ\",\"panelTitle\":\"Үсгийн хэмжээ\"},\"label\":\"Үсгийн хэлбэр\",\"panelTitle\":\"Үгсийн хэлбэрийн нэр\",\"voiceLabel\":\"Үгсийн хэлбэр\"},\"forms\":{\"button\":{\"title\":\"Товчны шинж чанар\",\"text\":\"Тэкст (Утга)\",\"type\":\"Төрөл\",\"typeBtn\":\"Товч\",\"typeSbm\":\"Submit\",\"typeRst\":\"Болих\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Чекбоксны шинж чанар\",\"radioTitle\":\"Радио товчны шинж чанар\",\"value\":\"Утга\",\"selected\":\"Сонгогдсон\",\"required\":\"Required\"},\"form\":{\"title\":\"Форм шинж чанар\",\"menu\":\"Форм шинж чанар\",\"action\":\"Үйлдэл\",\"method\":\"Арга\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Нууц талбарын шинж чанар\",\"name\":\"Нэр\",\"value\":\"Утга\"},\"select\":{\"title\":\"Согогч талбарын шинж чанар\",\"selectInfo\":\"Мэдээлэл\",\"opAvail\":\"Идвэхтэй сонголт\",\"value\":\"Утга\",\"size\":\"Хэмжээ\",\"lines\":\"Мөр\",\"chkMulti\":\"Олон зүйл зэрэг сонгохыг зөвшөөрөх\",\"required\":\"Required\",\"opText\":\"Тэкст\",\"opValue\":\"Утга\",\"btnAdd\":\"Нэмэх\",\"btnModify\":\"Өөрчлөх\",\"btnUp\":\"Дээш\",\"btnDown\":\"Доош\",\"btnSetValue\":\"Сонгогдсан утга оноох\",\"btnDelete\":\"Устгах\"},\"textarea\":{\"title\":\"Текст орчны шинж чанар\",\"cols\":\"Багана\",\"rows\":\"Мөр\"},\"textfield\":{\"title\":\"Текст талбарын шинж чанар\",\"name\":\"Нэр\",\"value\":\"Утга\",\"charWidth\":\"Тэмдэгтын өргөн\",\"maxChars\":\"Хамгийн их тэмдэгт\",\"required\":\"Required\",\"type\":\"Төрөл\",\"typeText\":\"Текст\",\"typePass\":\"Нууц үг\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"цахим хуудасны хаяг (URL)\"}},\"format\":{\"label\":\"Параргафын загвар\",\"panelTitle\":\"Параргафын загвар\",\"tag_address\":\"Хаяг\",\"tag_div\":\"Paragraph (DIV)\",\"tag_h1\":\"Гарчиг 1\",\"tag_h2\":\"Гарчиг 2\",\"tag_h3\":\"Гарчиг 3\",\"tag_h4\":\"Гарчиг 4\",\"tag_h5\":\"Гарчиг 5\",\"tag_h6\":\"Гарчиг 6\",\"tag_p\":\"Хэвийн\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"Хөндлөн зураас оруулах\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Зургийг орлох бичвэр\",\"border\":\"Хүрээ\",\"btnUpload\":\"Үүнийг сервэррүү илгээ\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"Хөндлөн зай\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Зурагны мэдээлэл\",\"linkTab\":\"Холбоос\",\"lockRatio\":\"Радио түгжих\",\"menu\":\"Зураг\",\"resetSize\":\"хэмжээ дахин оноох\",\"title\":\"Зураг\",\"titleButton\":\"Зурган товчны шинж чанар\",\"upload\":\"Хуулах\",\"urlMissing\":\"Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.\",\"vSpace\":\"Босоо зай\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Догол мөр хасах\",\"outdent\":\"Догол мөр нэмэх\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Тодорхойлолт оруулах\",\"toolbar\":\"Тодорхойлолт\"},\"justify\":{\"block\":\"Тэгшлэх\",\"center\":\"Голлуулах\",\"left\":\"Зүүн талд тулгах\",\"right\":\"Баруун талд тулгах\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Холбох түлхүүр\",\"advanced\":\"Нэмэлт\",\"advisoryContentType\":\"Зөвлөлдөх төрлийн агуулга\",\"advisoryTitle\":\"Зөвлөлдөх гарчиг\",\"anchor\":{\"toolbar\":\"Зангуу\",\"menu\":\"Зангууг болосруулах\",\"title\":\"Зангуугийн шинж чанар\",\"name\":\"Зангуугийн нэр\",\"errorName\":\"Зангуугийн нэрийг оруулна уу\",\"remove\":\"Зангууг устгах\"},\"anchorId\":\"Элемэнтйн Id нэрээр\",\"anchorName\":\"Зангуугийн нэрээр\",\"charset\":\"Тэмдэгт оноох нөөцөд холбогдсон\",\"cssClasses\":\"Stylesheet классууд\",\"emailAddress\":\"Э-шуудангийн хаяг\",\"emailBody\":\"Зурвасны их бие\",\"emailSubject\":\"Зурвасны гарчиг\",\"id\":\"Id\",\"info\":\"Холбоосын тухай мэдээлэл\",\"langCode\":\"Хэлний код\",\"langDir\":\"Хэлний чиглэл\",\"langDirLTR\":\"Зүүнээс баруун (LTR)\",\"langDirRTL\":\"Баруунаас зүүн (RTL)\",\"menu\":\"Холбоос засварлах\",\"name\":\"Нэр\",\"noAnchors\":\"(Баримт бичиг зангуугүй байна)\",\"noEmail\":\"Э-шуудангий хаягаа шивнэ үү\",\"noUrl\":\"Холбоосны URL хаягийг шивнэ үү\",\"other\":\"<other>\",\"popupDependent\":\"Хамаатай (Netscape)\",\"popupFeatures\":\"Popup цонхны онцлог\",\"popupFullScreen\":\"Цонх дүүргэх (Internet Explorer)\",\"popupLeft\":\"Зүүн байрлал\",\"popupLocationBar\":\"Location хэсэг\",\"popupMenuBar\":\"Цэсний самбар\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Скрол хэсэгүүд\",\"popupStatusBar\":\"Статус хэсэг\",\"popupToolbar\":\"Багажны самбар\",\"popupTop\":\"Дээд байрлал\",\"rel\":\"Relationship\",\"selectAnchor\":\"Нэг зангууг сонгоно уу\",\"styles\":\"Загвар\",\"tabIndex\":\"Tab индекс\",\"target\":\"Байрлал\",\"targetFrame\":\"<Агуулах хүрээ>\",\"targetFrameName\":\"Очих фремын нэр\",\"targetPopup\":\"<popup цонх>\",\"targetPopupName\":\"Popup цонхны нэр\",\"title\":\"Холбоос\",\"toAnchor\":\"Энэ бичвэр дэх зангуу руу очих холбоос\",\"toEmail\":\"Э-захиа\",\"toUrl\":\"цахим хуудасны хаяг (URL)\",\"toolbar\":\"Холбоос\",\"type\":\"Линкийн төрөл\",\"unlink\":\"Холбоос авч хаях\",\"upload\":\"Хуулах\"},\"list\":{\"bulletedlist\":\"Цэгтэй жагсаалт\",\"numberedlist\":\"Дугаарлагдсан жагсаалт\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Төрөл\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Дэлгэц дүүргэх\",\"minimize\":\"Цонхыг багсгаж харуулах\"},\"newpage\":{\"toolbar\":\"Шинэ хуудас\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Хуудас тусгаарлагч оруулах\"},\"pastetext\":{\"button\":\"Энгийн бичвэрээр буулгах\",\"title\":\"Энгийн бичвэрээр буулгах\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Word-оос буулгах\",\"toolbar\":\"Word-оос буулгах\"},\"preview\":{\"preview\":\"Уридчлан харах\"},\"print\":{\"toolbar\":\"Хэвлэх\"},\"removeformat\":{\"toolbar\":\"Параргафын загварыг авч хаях\"},\"save\":{\"toolbar\":\"Хадгалах\"},\"selectall\":{\"toolbar\":\"Бүгдийг нь сонгох\"},\"showblocks\":{\"toolbar\":\"Хавтангуудыг харуулах\"},\"sourcearea\":{\"toolbar\":\"Код\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Онцгой тэмдэгт сонгох\",\"toolbar\":\"Онцгой тэмдэгт оруулах\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Толь бичгүүд\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Хэлүүд\",\"btn_options\":\"Сонголт\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Загвар\",\"panelTitle\":\"Загвар хэлбэржүүлэх\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Хүрээний хэмжээ\",\"caption\":\"Тайлбар\",\"cell\":{\"menu\":\"Нүх/зай\",\"insertBefore\":\"Нүх/зай өмнө нь оруулах\",\"insertAfter\":\"Нүх/зай дараа нь оруулах\",\"deleteCell\":\"Нүх устгах\",\"merge\":\"Нүх нэгтэх\",\"mergeRight\":\"Баруун тийш нэгтгэх\",\"mergeDown\":\"Доош нэгтгэх\",\"splitHorizontal\":\"Нүх/зайг босоогоор нь тусгаарлах\",\"splitVertical\":\"Нүх/зайг хөндлөнгөөр нь тусгаарлах\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Хэвтээд тэгшлэх арга\",\"vAlign\":\"Босоод тэгшлэх арга\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Дэвсгэр өнгө\",\"borderColor\":\"Хүрээний өнгө\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Тийм\",\"no\":\"Үгүй\",\"invalidWidth\":\"Нүдний өргөн нь тоо байх ёстой.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Сонгох\"},\"cellPad\":\"Нүх доторлох(padding)\",\"cellSpace\":\"Нүх хоорондын зай (spacing)\",\"column\":{\"menu\":\"Багана\",\"insertBefore\":\"Багана өмнө нь оруулах\",\"insertAfter\":\"Багана дараа нь оруулах\",\"deleteColumn\":\"Багана устгах\"},\"columns\":\"Багана\",\"deleteTable\":\"Хүснэгт устгах\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Хүснэгтийн өргөн нь тоо байх ёстой.\",\"menu\":\"Хүснэгт\",\"row\":{\"menu\":\"Мөр\",\"insertBefore\":\"Мөр өмнө нь оруулах\",\"insertAfter\":\"Мөр дараа нь оруулах\",\"deleteRow\":\"Мөр устгах\"},\"rows\":\"Мөр\",\"summary\":\"Тайлбар\",\"title\":\"Хүснэгт\",\"toolbar\":\"Хүснэгт\",\"widthPc\":\"хувь\",\"widthPx\":\"цэг\",\"widthUnit\":\"өргөний нэгж\"},\"undo\":{\"redo\":\"Өмнөх үйлдлээ сэргээх\",\"undo\":\"Хүчингүй болгох\"},\"wsc\":{\"btnIgnore\":\"Зөвшөөрөх\",\"btnIgnoreAll\":\"Бүгдийг зөвшөөрөх\",\"btnReplace\":\"Солих\",\"btnReplaceAll\":\"Бүгдийг Дарж бичих\",\"btnUndo\":\"Буцаах\",\"changeTo\":\"Өөрчлөх\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Дүрэм шалгагч суугаагүй байна. Татаж авахыг хүсч байна уу?\",\"manyChanges\":\"Дүрэм шалгаад дууссан: %1 үг өөрчлөгдсөн\",\"noChanges\":\"Дүрэм шалгаад дууссан: үг өөрчлөгдөөгүй\",\"noMispell\":\"Дүрэм шалгаад дууссан: Алдаа олдсонгүй\",\"noSuggestions\":\"- Тайлбаргүй -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Толь бичиггүй\",\"oneChange\":\"Дүрэм шалгаад дууссан: 1 үг өөрчлөгдсөн\",\"progress\":\"Дүрэм шалгаж байгаа үйл явц...\",\"title\":\"Spell Checker\",\"toolbar\":\"Үгийн дүрэх шалгах\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ms.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ms']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Browse Server\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Muat Naik\",\"uploadSubmit\":\"Hantar ke Server\",\"image\":\"Gambar\",\"flash\":\"Flash\",\"form\":\"Borang\",\"checkbox\":\"Checkbox\",\"radio\":\"Butang Radio\",\"textField\":\"Text Field\",\"textarea\":\"Textarea\",\"hiddenField\":\"Field Tersembunyi\",\"button\":\"Butang\",\"select\":\"Field Pilihan\",\"imageButton\":\"Butang Bergambar\",\"notSet\":\"<tidak di set>\",\"id\":\"Id\",\"name\":\"Nama\",\"langDir\":\"Arah Tulisan\",\"langDirLtr\":\"Kiri ke Kanan (LTR)\",\"langDirRtl\":\"Kanan ke Kiri (RTL)\",\"langCode\":\"Kod Bahasa\",\"longDescr\":\"Butiran Panjang URL\",\"cssClass\":\"Kelas-kelas Stylesheet\",\"advisoryTitle\":\"Tajuk Makluman\",\"cssStyle\":\"Stail\",\"ok\":\"OK\",\"cancel\":\"Batal\",\"close\":\"Tutup\",\"preview\":\"Prebiu\",\"resize\":\"Resize\",\"generalTab\":\"Umum\",\"advancedTab\":\"Advanced\",\"validateNumberFailed\":\"This value is not a number.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Options\",\"target\":\"Sasaran\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Kiri ke Kanan (LTR)\",\"langDirRTL\":\"Kanan ke Kiri (RTL)\",\"styles\":\"Stail\",\"cssClasses\":\"Kelas-kelas Stylesheet\",\"width\":\"Lebar\",\"height\":\"Tinggi\",\"align\":\"Jajaran\",\"alignLeft\":\"Kiri\",\"alignRight\":\"Kanan\",\"alignCenter\":\"Tengah\",\"alignJustify\":\"Jajaran Blok\",\"alignTop\":\"Atas\",\"alignMiddle\":\"Pertengahan\",\"alignBottom\":\"Bawah\",\"alignNone\":\"None\",\"invalidValue\":\"Nilai tidak sah.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Bold\",\"italic\":\"Italic\",\"strike\":\"Strike Through\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Underline\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Salin\",\"copyError\":\"Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).\",\"cut\":\"Potong\",\"cutError\":\"Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).\",\"paste\":\"Tampal\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Tampal\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Otomatik\",\"bgColorTitle\":\"Warna Latarbelakang\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Warna lain-lain...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Warna Text\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Templat\",\"emptyListMsg\":\"(Tiada Templat Disimpan)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Sila pilih templat untuk dibuka oleh editor<br>(kandungan sebenar akan hilang):\",\"title\":\"Templat Kandungan\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Cari\",\"findOptions\":\"Find Options\",\"findWhat\":\"Perkataan yang dicari:\",\"matchCase\":\"Padanan case huruf\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Padana Keseluruhan perkataan\",\"notFoundMsg\":\"Text yang dicari tidak dijumpai.\",\"replace\":\"Ganti\",\"replaceAll\":\"Ganti semua\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Diganti dengan:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Bawah Mutlak\",\"alignAbsMiddle\":\"Pertengahan Mutlak\",\"alignBaseline\":\"Garis Dasar\",\"alignTextTop\":\"Atas Text\",\"bgcolor\":\"Warna Latarbelakang\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"Ruang Melintang\",\"properties\":\"Flash Properties\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Scale\",\"scaleAll\":\"Show all\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"No Border\",\"title\":\"Flash Properties\",\"vSpace\":\"Ruang Menegak\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"Sila taip sambungan URL\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Saiz\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Saiz\"},\"label\":\"Font\",\"panelTitle\":\"Font\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Ciri-ciri Butang\",\"text\":\"Teks (Nilai)\",\"type\":\"Jenis\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Ciri-ciri Checkbox\",\"radioTitle\":\"Ciri-ciri Butang Radio\",\"value\":\"Nilai\",\"selected\":\"Dipilih\",\"required\":\"Required\"},\"form\":{\"title\":\"Ciri-ciri Borang\",\"menu\":\"Ciri-ciri Borang\",\"action\":\"Tindakan borang\",\"method\":\"Cara borang dihantar\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Ciri-ciri Field Tersembunyi\",\"name\":\"Nama\",\"value\":\"Nilai\"},\"select\":{\"title\":\"Ciri-ciri Selection Field\",\"selectInfo\":\"Select Info\",\"opAvail\":\"Pilihan sediada\",\"value\":\"Nilai\",\"size\":\"Saiz\",\"lines\":\"garisan\",\"chkMulti\":\"Benarkan pilihan pelbagai\",\"required\":\"Required\",\"opText\":\"Teks\",\"opValue\":\"Nilai\",\"btnAdd\":\"Tambah Pilihan\",\"btnModify\":\"Ubah Pilihan\",\"btnUp\":\"Naik ke atas\",\"btnDown\":\"Turun ke bawah\",\"btnSetValue\":\"Set sebagai nilai terpilih\",\"btnDelete\":\"Padam\"},\"textarea\":{\"title\":\"Ciri-ciri Textarea\",\"cols\":\"Lajur\",\"rows\":\"Baris\"},\"textfield\":{\"title\":\"Ciri-ciri Text Field\",\"name\":\"Nama\",\"value\":\"Nilai\",\"charWidth\":\"Lebar isian\",\"maxChars\":\"Isian Maksimum\",\"required\":\"Required\",\"type\":\"Jenis\",\"typeText\":\"Teks\",\"typePass\":\"Kata Laluan\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format\",\"tag_address\":\"Alamat\",\"tag_div\":\"Perenggan (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Telah Diformat\"},\"horizontalrule\":{\"toolbar\":\"Masukkan Garisan Membujur\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Text Alternatif\",\"border\":\"Border\",\"btnUpload\":\"Hantar ke Server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"Ruang Melintang\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Info Imej\",\"linkTab\":\"Sambungan\",\"lockRatio\":\"Tetapkan Nisbah\",\"menu\":\"Ciri-ciri Imej\",\"resetSize\":\"Saiz Set Semula\",\"title\":\"Ciri-ciri Imej\",\"titleButton\":\"Ciri-ciri Butang Bergambar\",\"upload\":\"Muat Naik\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"Ruang Menegak\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Tambahkan Inden\",\"outdent\":\"Kurangkan Inden\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Masukkan Smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Jajaran Blok\",\"center\":\"Jajaran Tengah\",\"left\":\"Jajaran Kiri\",\"right\":\"Jajaran Kanan\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Kunci Akses\",\"advanced\":\"Advanced\",\"advisoryContentType\":\"Jenis Kandungan Makluman\",\"advisoryTitle\":\"Tajuk Makluman\",\"anchor\":{\"toolbar\":\"Masukkan/Sunting Pautan\",\"menu\":\"Ciri-ciri Pautan\",\"title\":\"Ciri-ciri Pautan\",\"name\":\"Nama Pautan\",\"errorName\":\"Sila taip nama pautan\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"dengan menggunakan ID elemen\",\"anchorName\":\"dengan menggunakan nama pautan\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Kelas-kelas Stylesheet\",\"emailAddress\":\"Alamat E-Mail\",\"emailBody\":\"Isi Kandungan Mesej\",\"emailSubject\":\"Subjek Mesej\",\"id\":\"Id\",\"info\":\"Butiran Sambungan\",\"langCode\":\"Arah Tulisan\",\"langDir\":\"Arah Tulisan\",\"langDirLTR\":\"Kiri ke Kanan (LTR)\",\"langDirRTL\":\"Kanan ke Kiri (RTL)\",\"menu\":\"Sunting Sambungan\",\"name\":\"Nama\",\"noAnchors\":\"(Tiada pautan terdapat dalam dokumen ini)\",\"noEmail\":\"Sila taip alamat e-mail\",\"noUrl\":\"Sila taip sambungan URL\",\"other\":\"<lain>\",\"popupDependent\":\"Bergantungan (Netscape)\",\"popupFeatures\":\"Ciri Tetingkap Popup\",\"popupFullScreen\":\"Skrin Penuh (IE)\",\"popupLeft\":\"Posisi Kiri\",\"popupLocationBar\":\"Bar Lokasi\",\"popupMenuBar\":\"Bar Menu\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Bar-bar skrol\",\"popupStatusBar\":\"Bar Status\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Posisi Atas\",\"rel\":\"Relationship\",\"selectAnchor\":\"Sila pilih pautan\",\"styles\":\"Stail\",\"tabIndex\":\"Indeks Tab \",\"target\":\"Sasaran\",\"targetFrame\":\"<bingkai>\",\"targetFrameName\":\"Nama Bingkai Sasaran\",\"targetPopup\":\"<tetingkap popup>\",\"targetPopupName\":\"Nama Tetingkap Popup\",\"title\":\"Sambungan\",\"toAnchor\":\"Pautan dalam muka surat ini\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Masukkan/Sunting Sambungan\",\"type\":\"Jenis Sambungan\",\"unlink\":\"Buang Sambungan\",\"upload\":\"Muat Naik\"},\"list\":{\"bulletedlist\":\"Senarai tidak bernombor\",\"numberedlist\":\"Senarai bernombor\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"Helaian Baru\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Tampal sebagai text biasa\",\"title\":\"Tampal sebagai text biasa\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Tampal dari Word\",\"toolbar\":\"Tampal dari Word\"},\"preview\":{\"preview\":\"Prebiu\"},\"print\":{\"toolbar\":\"Cetak\"},\"removeformat\":{\"toolbar\":\"Buang Format\"},\"save\":{\"toolbar\":\"Simpan\"},\"selectall\":{\"toolbar\":\"Pilih Semua\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Sumber\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Sila pilih huruf istimewa\",\"toolbar\":\"Masukkan Huruf Istimewa\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stail\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Saiz Border\",\"caption\":\"Keterangan\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Buangkan Sel-sel\",\"merge\":\"Cantumkan Sel-sel\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Tambahan Ruang Sel\",\"cellSpace\":\"Ruangan Antara Sel\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Buangkan Lajur\"},\"columns\":\"Jaluran\",\"deleteTable\":\"Delete Table\",\"headers\":\"Headers\",\"headersBoth\":\"Both\",\"headersColumn\":\"First column\",\"headersNone\":\"None\",\"headersRow\":\"First Row\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Ciri-ciri Jadual\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Buangkan Baris\"},\"rows\":\"Barisan\",\"summary\":\"Summary\",\"title\":\"Ciri-ciri Jadual\",\"toolbar\":\"Jadual\",\"widthPc\":\"peratus\",\"widthPx\":\"piksel-piksel\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"Ulangkan\",\"undo\":\"Batalkan\"},\"wsc\":{\"btnIgnore\":\"Biar\",\"btnIgnoreAll\":\"Biarkan semua\",\"btnReplace\":\"Ganti\",\"btnReplaceAll\":\"Gantikan Semua\",\"btnUndo\":\"Batalkan\",\"changeTo\":\"Tukarkan kepada\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?\",\"manyChanges\":\"Pemeriksaan ejaan siap: %1 perkataan diubah\",\"noChanges\":\"Pemeriksaan ejaan siap: Tiada perkataan diubah\",\"noMispell\":\"Pemeriksaan ejaan siap: Tiada salah ejaan\",\"noSuggestions\":\"- Tiada cadangan -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Tidak terdapat didalam kamus\",\"oneChange\":\"Pemeriksaan ejaan siap: Satu perkataan telah diubah\",\"progress\":\"Pemeriksaan ejaan sedang diproses...\",\"title\":\"Spell Checker\",\"toolbar\":\"Semak Ejaan\"}};"
  },
  {
    "path": "assets/ckeditor/lang/nb.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['nb']={\"editor\":\"Rikteksteditor\",\"editorPanel\":\"Panel for rikteksteditor\",\"common\":{\"editorHelp\":\"Trykk ALT 0 for hjelp\",\"browseServer\":\"Bla gjennom tjener\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Last opp\",\"uploadSubmit\":\"Send det til serveren\",\"image\":\"Bilde\",\"flash\":\"Flash\",\"form\":\"Skjema\",\"checkbox\":\"Avmerkingsboks\",\"radio\":\"Alternativknapp\",\"textField\":\"Tekstboks\",\"textarea\":\"Tekstområde\",\"hiddenField\":\"Skjult felt\",\"button\":\"Knapp\",\"select\":\"Rullegardinliste\",\"imageButton\":\"Bildeknapp\",\"notSet\":\"<ikke satt>\",\"id\":\"Id\",\"name\":\"Navn\",\"langDir\":\"Språkretning\",\"langDirLtr\":\"Venstre til høyre (VTH)\",\"langDirRtl\":\"Høyre til venstre (HTV)\",\"langCode\":\"Språkkode\",\"longDescr\":\"Utvidet beskrivelse\",\"cssClass\":\"Stilarkklasser\",\"advisoryTitle\":\"Tittel\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Avbryt\",\"close\":\"Lukk\",\"preview\":\"Forhåndsvis\",\"resize\":\"Dra for å skalere\",\"generalTab\":\"Generelt\",\"advancedTab\":\"Avansert\",\"validateNumberFailed\":\"Denne verdien er ikke et tall.\",\"confirmNewPage\":\"Alle ulagrede endringer som er gjort i dette innholdet vil gå tapt. Er du sikker på at du vil laste en ny side?\",\"confirmCancel\":\"Du har endret noen alternativer. Er du sikker på at du vil lukke dialogvinduet?\",\"options\":\"Valg\",\"target\":\"Mål\",\"targetNew\":\"Nytt vindu (_blank)\",\"targetTop\":\"Hele vindu (_top)\",\"targetSelf\":\"Samme vindu (_self)\",\"targetParent\":\"Foreldrevindu (_parent)\",\"langDirLTR\":\"Venstre til høyre (VTH)\",\"langDirRTL\":\"Høyre til venstre (HTV)\",\"styles\":\"Stil\",\"cssClasses\":\"Stilarkklasser\",\"width\":\"Bredde\",\"height\":\"Høyde\",\"align\":\"Juster\",\"alignLeft\":\"Venstre\",\"alignRight\":\"Høyre\",\"alignCenter\":\"Midtjuster\",\"alignJustify\":\"Blokkjuster\",\"alignTop\":\"Topp\",\"alignMiddle\":\"Midten\",\"alignBottom\":\"Bunn\",\"alignNone\":\"Ingen\",\"invalidValue\":\"Ugyldig verdi.\",\"invalidHeight\":\"Høyde må være et tall.\",\"invalidWidth\":\"Bredde må være et tall.\",\"invalidCssLength\":\"Den angitte verdien for feltet \\\"%1\\\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"invalidHtmlLength\":\"Den angitte verdien for feltet \\\"%1\\\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).\",\"invalidInlineStyle\":\"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \\\"navn : verdi\\\", separert med semikolon\",\"cssLengthTooltip\":\"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, utilgjenglig</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alle rettigheter reservert.\",\"dlgTitle\":\"Om CKEditor\",\"help\":\"Se $1 for hjelp.\",\"moreInfo\":\"For lisensieringsinformasjon, vennligst besøk vårt nettsted:\",\"title\":\"Om CKEditor\",\"userGuide\":\"CKEditors brukerveiledning\"},\"basicstyles\":{\"bold\":\"Fet\",\"italic\":\"Kursiv\",\"strike\":\"Gjennomstreking\",\"subscript\":\"Senket skrift\",\"superscript\":\"Hevet skrift\",\"underline\":\"Understreking\"},\"bidi\":{\"ltr\":\"Tekstretning fra venstre til høyre\",\"rtl\":\"Tekstretning fra høyre til venstre\"},\"blockquote\":{\"toolbar\":\"Blokksitat\"},\"clipboard\":{\"copy\":\"Kopier\",\"copyError\":\"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).\",\"cut\":\"Klipp ut\",\"cutError\":\"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).\",\"paste\":\"Lim inn\",\"pasteArea\":\"Innlimingsområde\",\"pasteMsg\":\"Vennligst lim inn i følgende boks med tastaturet (<strong>Ctrl/Cmd+V</strong>) og trykk <strong>OK</strong>.\",\"securityMsg\":\"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.\",\"title\":\"Lim inn\"},\"button\":{\"selectedLabel\":\"%1 (Valgt)\"},\"colorbutton\":{\"auto\":\"Automatisk\",\"bgColorTitle\":\"Bakgrunnsfarge\",\"colors\":{\"000\":\"Svart\",\"800000\":\"Rødbrun\",\"8B4513\":\"Salbrun\",\"2F4F4F\":\"Grønnsvart\",\"008080\":\"Blågrønn\",\"000080\":\"Marineblått\",\"4B0082\":\"Indigo\",\"696969\":\"Mørk grå\",\"B22222\":\"Mørkerød\",\"A52A2A\":\"Brun\",\"DAA520\":\"Lys brun\",\"006400\":\"Mørk grønn\",\"40E0D0\":\"Turkis\",\"0000CD\":\"Medium blå\",\"800080\":\"Purpur\",\"808080\":\"Grå\",\"F00\":\"Rød\",\"FF8C00\":\"Mørk oransje\",\"FFD700\":\"Gull\",\"008000\":\"Grønn\",\"0FF\":\"Cyan\",\"00F\":\"Blå\",\"EE82EE\":\"Fiolett\",\"A9A9A9\":\"Svak grå\",\"FFA07A\":\"Rosa-oransje\",\"FFA500\":\"Oransje\",\"FFFF00\":\"Gul\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Svak turkis\",\"ADD8E6\":\"Lys Blå\",\"DDA0DD\":\"Plomme\",\"D3D3D3\":\"Lys grå\",\"FFF0F5\":\"Svak lavendelrosa\",\"FAEBD7\":\"Antikk-hvit\",\"FFFFE0\":\"Lys gul\",\"F0FFF0\":\"Honningmelon\",\"F0FFFF\":\"Svakt asurblått\",\"F0F8FF\":\"Svak cyan\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Hvit\"},\"more\":\"Flere farger...\",\"panelTitle\":\"Farger\",\"textColorTitle\":\"Tekstfarge\"},\"colordialog\":{\"clear\":\"Tøm\",\"highlight\":\"Merk\",\"options\":\"Alternativer for farge\",\"selected\":\"Valgt farge\",\"title\":\"Velg farge\"},\"templates\":{\"button\":\"Maler\",\"emptyListMsg\":\"(Ingen maler definert)\",\"insertOption\":\"Erstatt gjeldende innhold\",\"options\":\"Alternativer for mal\",\"selectPromptMsg\":\"Velg malen du vil åpne i redigeringsverktøyet:\",\"title\":\"Innholdsmaler\"},\"contextmenu\":{\"options\":\"Alternativer for høyreklikkmeny\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Tittel\",\"cssClassInputLabel\":\"Stilark-klasser\",\"edit\":\"Rediger Div\",\"inlineStyleInputLabel\":\"Inlinestiler\",\"langDirLTRLabel\":\"Venstre til høyre (VTH)\",\"langDirLabel\":\"Språkretning\",\"langDirRTLLabel\":\"Høyre til venstre (HTV)\",\"languageCodeInputLabel\":\" Språkkode\",\"remove\":\"Fjern Div\",\"styleSelectLabel\":\"Stil\",\"title\":\"Sett inn Div Container\",\"toolbar\":\"Sett inn Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Skjul verktøylinje\",\"toolbarExpand\":\"Vis verktøylinje\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Utklippstavle/Angre\",\"editing\":\"Redigering\",\"forms\":\"Skjema\",\"basicstyles\":\"Basisstiler\",\"paragraph\":\"Avsnitt\",\"links\":\"Lenker\",\"insert\":\"Innsetting\",\"styles\":\"Stiler\",\"colors\":\"Farger\",\"tools\":\"Verktøy\"},\"toolbars\":\"Verktøylinjer for editor\"},\"elementspath\":{\"eleLabel\":\"Element-sti\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Søk\",\"findOptions\":\"Søkealternativer\",\"findWhat\":\"Søk etter:\",\"matchCase\":\"Skill mellom store og små bokstaver\",\"matchCyclic\":\"Søk i hele dokumentet\",\"matchWord\":\"Bare hele ord\",\"notFoundMsg\":\"Fant ikke søketeksten.\",\"replace\":\"Erstatt\",\"replaceAll\":\"Erstatt alle\",\"replaceSuccessMsg\":\"%1 tilfelle(r) erstattet.\",\"replaceWith\":\"Erstatt med:\",\"title\":\"Søk og erstatt\"},\"fakeobjects\":{\"anchor\":\"Anker\",\"flash\":\"Flash-animasjon\",\"hiddenfield\":\"Skjult felt\",\"iframe\":\"IFrame\",\"unknown\":\"Ukjent objekt\"},\"flash\":{\"access\":\"Scripttilgang\",\"accessAlways\":\"Alltid\",\"accessNever\":\"Aldri\",\"accessSameDomain\":\"Samme domene\",\"alignAbsBottom\":\"Abs bunn\",\"alignAbsMiddle\":\"Abs midten\",\"alignBaseline\":\"Bunnlinje\",\"alignTextTop\":\"Tekst topp\",\"bgcolor\":\"Bakgrunnsfarge\",\"chkFull\":\"Tillat fullskjerm\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Slå på Flash-meny\",\"chkPlay\":\"Autospill\",\"flashvars\":\"Variabler for flash\",\"hSpace\":\"HMarg\",\"properties\":\"Egenskaper for Flash-objekt\",\"propertiesTab\":\"Egenskaper\",\"quality\":\"Kvalitet\",\"qualityAutoHigh\":\"Auto høy\",\"qualityAutoLow\":\"Auto lav\",\"qualityBest\":\"Best\",\"qualityHigh\":\"Høy\",\"qualityLow\":\"Lav\",\"qualityMedium\":\"Medium\",\"scale\":\"Skaler\",\"scaleAll\":\"Vis alt\",\"scaleFit\":\"Skaler til å passe\",\"scaleNoBorder\":\"Ingen ramme\",\"title\":\"Flash-egenskaper\",\"vSpace\":\"VMarg\",\"validateHSpace\":\"HMarg må være et tall.\",\"validateSrc\":\"Vennligst skriv inn lenkens url.\",\"validateVSpace\":\"VMarg må være et tall.\",\"windowMode\":\"Vindumodus\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Gjennomsiktig\",\"windowModeWindow\":\"Vindu\"},\"font\":{\"fontSize\":{\"label\":\"Størrelse\",\"voiceLabel\":\"Skriftstørrelse\",\"panelTitle\":\"Skriftstørrelse\"},\"label\":\"Skrift\",\"panelTitle\":\"Skrift\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Egenskaper for knapp\",\"text\":\"Tekst (verdi)\",\"type\":\"Type\",\"typeBtn\":\"Knapp\",\"typeSbm\":\"Send\",\"typeRst\":\"Nullstill\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Egenskaper for avmerkingsboks\",\"radioTitle\":\"Egenskaper for alternativknapp\",\"value\":\"Verdi\",\"selected\":\"Valgt\",\"required\":\"Påkrevd\"},\"form\":{\"title\":\"Egenskaper for skjema\",\"menu\":\"Egenskaper for skjema\",\"action\":\"Handling\",\"method\":\"Metode\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Egenskaper for skjult felt\",\"name\":\"Navn\",\"value\":\"Verdi\"},\"select\":{\"title\":\"Egenskaper for rullegardinliste\",\"selectInfo\":\"Info\",\"opAvail\":\"Tilgjenglige alternativer\",\"value\":\"Verdi\",\"size\":\"Størrelse\",\"lines\":\"Linjer\",\"chkMulti\":\"Tillat flervalg\",\"required\":\"Påkrevd\",\"opText\":\"Tekst\",\"opValue\":\"Verdi\",\"btnAdd\":\"Legg til\",\"btnModify\":\"Endre\",\"btnUp\":\"Opp\",\"btnDown\":\"Ned\",\"btnSetValue\":\"Sett som valgt\",\"btnDelete\":\"Slett\"},\"textarea\":{\"title\":\"Egenskaper for tekstområde\",\"cols\":\"Kolonner\",\"rows\":\"Rader\"},\"textfield\":{\"title\":\"Egenskaper for tekstfelt\",\"name\":\"Navn\",\"value\":\"Verdi\",\"charWidth\":\"Tegnbredde\",\"maxChars\":\"Maks antall tegn\",\"required\":\"Påkrevd\",\"type\":\"Type\",\"typeText\":\"Tekst\",\"typePass\":\"Passord\",\"typeEmail\":\"Epost\",\"typeSearch\":\"Søk\",\"typeTel\":\"Telefonnummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Avsnittsformat\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Overskrift 1\",\"tag_h2\":\"Overskrift 2\",\"tag_h3\":\"Overskrift 3\",\"tag_h4\":\"Overskrift 4\",\"tag_h5\":\"Overskrift 5\",\"tag_h6\":\"Overskrift 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatert\"},\"horizontalrule\":{\"toolbar\":\"Sett inn horisontal linje\"},\"iframe\":{\"border\":\"Vis ramme rundt iframe\",\"noUrl\":\"Vennligst skriv inn URL for iframe\",\"scrolling\":\"Aktiver scrollefelt\",\"title\":\"Egenskaper for IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativ tekst\",\"border\":\"Ramme\",\"btnUpload\":\"Send det til serveren\",\"button2Img\":\"Vil du endre den valgte bildeknappen til et vanlig bilde?\",\"hSpace\":\"HMarg\",\"img2Button\":\"Vil du endre det valgte bildet til en bildeknapp?\",\"infoTab\":\"Bildeinformasjon\",\"linkTab\":\"Lenke\",\"lockRatio\":\"Lås forhold\",\"menu\":\"Bildeegenskaper\",\"resetSize\":\"Tilbakestill størrelse\",\"title\":\"Bildeegenskaper\",\"titleButton\":\"Egenskaper for bildeknapp\",\"upload\":\"Last opp\",\"urlMissing\":\"Bildets adresse mangler.\",\"vSpace\":\"VMarg\",\"validateBorder\":\"Ramme må være et heltall.\",\"validateHSpace\":\"HMarg må være et heltall.\",\"validateVSpace\":\"VMarg må være et heltall.\"},\"indent\":{\"indent\":\"Øk innrykk\",\"outdent\":\"Reduser innrykk\"},\"smiley\":{\"options\":\"Alternativer for smil\",\"title\":\"Sett inn smil\",\"toolbar\":\"Smil\"},\"justify\":{\"block\":\"Blokkjuster\",\"center\":\"Midtstill\",\"left\":\"Venstrejuster\",\"right\":\"Høyrejuster\"},\"language\":{\"button\":\"Sett språk\",\"remove\":\"Fjern språk\"},\"link\":{\"acccessKey\":\"Aksessknapp\",\"advanced\":\"Avansert\",\"advisoryContentType\":\"Type\",\"advisoryTitle\":\"Tittel\",\"anchor\":{\"toolbar\":\"Sett inn/Rediger anker\",\"menu\":\"Egenskaper for anker\",\"title\":\"Egenskaper for anker\",\"name\":\"Ankernavn\",\"errorName\":\"Vennligst skriv inn ankernavnet\",\"remove\":\"Fjern anker\"},\"anchorId\":\"Element etter ID\",\"anchorName\":\"Anker etter navn\",\"charset\":\"Lenket tegnsett\",\"cssClasses\":\"Stilarkklasser\",\"emailAddress\":\"E-postadresse\",\"emailBody\":\"Melding\",\"emailSubject\":\"Meldingsemne\",\"id\":\"Id\",\"info\":\"Lenkeinfo\",\"langCode\":\"Språkkode\",\"langDir\":\"Språkretning\",\"langDirLTR\":\"Venstre til høyre (VTH)\",\"langDirRTL\":\"Høyre til venstre (HTV)\",\"menu\":\"Rediger lenke\",\"name\":\"Navn\",\"noAnchors\":\"(Ingen anker i dokumentet)\",\"noEmail\":\"Vennligst skriv inn e-postadressen\",\"noUrl\":\"Vennligst skriv inn lenkens URL\",\"other\":\"<annen>\",\"popupDependent\":\"Avhenging (Netscape)\",\"popupFeatures\":\"Egenskaper for popup-vindu\",\"popupFullScreen\":\"Fullskjerm (IE)\",\"popupLeft\":\"Venstre posisjon\",\"popupLocationBar\":\"Adresselinje\",\"popupMenuBar\":\"Menylinje\",\"popupResizable\":\"Skalerbar\",\"popupScrollBars\":\"Scrollbar\",\"popupStatusBar\":\"Statuslinje\",\"popupToolbar\":\"Verktøylinje\",\"popupTop\":\"Topp-posisjon\",\"rel\":\"Relasjon (rel)\",\"selectAnchor\":\"Velg et anker\",\"styles\":\"Stil\",\"tabIndex\":\"Tabindeks\",\"target\":\"Mål\",\"targetFrame\":\"<ramme>\",\"targetFrameName\":\"Målramme\",\"targetPopup\":\"<popup-vindu>\",\"targetPopupName\":\"Navn på popup-vindu\",\"title\":\"Lenke\",\"toAnchor\":\"Lenke til anker i teksten\",\"toEmail\":\"E-post\",\"toUrl\":\"URL\",\"toolbar\":\"Sett inn/Rediger lenke\",\"type\":\"Lenketype\",\"unlink\":\"Fjern lenke\",\"upload\":\"Last opp\"},\"list\":{\"bulletedlist\":\"Legg til / fjern punktmerket liste\",\"numberedlist\":\"Legg til / fjern nummerert liste\"},\"liststyle\":{\"armenian\":\"Armensk nummerering\",\"bulletedTitle\":\"Egenskaper for punktmerket liste\",\"circle\":\"Sirkel\",\"decimal\":\"Tall (1, 2, 3, osv.)\",\"decimalLeadingZero\":\"Tall, med førstesiffer null (01, 02, 03, osv.)\",\"disc\":\"Disk\",\"georgian\":\"Georgisk nummerering (an, ban, gan, osv.)\",\"lowerAlpha\":\"Alfabetisk, små (a, b, c, d, e, osv.)\",\"lowerGreek\":\"Gresk, små (alpha, beta, gamma, osv.)\",\"lowerRoman\":\"Romertall, små (i, ii, iii, iv, v, osv.)\",\"none\":\"Ingen\",\"notset\":\"<ikke satt>\",\"numberedTitle\":\"Egenskaper for nummerert liste\",\"square\":\"Firkant\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Alfabetisk, store (A, B, C, D, E, osv.)\",\"upperRoman\":\"Romertall, store (I, II, III, IV, V, osv.)\",\"validateStartNumber\":\"Starten på listen må være et heltall.\"},\"magicline\":{\"title\":\"Sett inn nytt avsnitt her\"},\"maximize\":{\"maximize\":\"Maksimer\",\"minimize\":\"Minimer\"},\"newpage\":{\"toolbar\":\"Ny side\"},\"pagebreak\":{\"alt\":\"Sideskift\",\"toolbar\":\"Sett inn sideskift for utskrift\"},\"pastetext\":{\"button\":\"Lim inn som ren tekst\",\"title\":\"Lim inn som ren tekst\"},\"pastefromword\":{\"confirmCleanup\":\"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?\",\"error\":\"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil\",\"title\":\"Lim inn fra Word\",\"toolbar\":\"Lim inn fra Word\"},\"preview\":{\"preview\":\"Forhåndsvis\"},\"print\":{\"toolbar\":\"Skriv ut\"},\"removeformat\":{\"toolbar\":\"Fjern formatering\"},\"save\":{\"toolbar\":\"Lagre\"},\"selectall\":{\"toolbar\":\"Merk alt\"},\"showblocks\":{\"toolbar\":\"Vis blokker\"},\"sourcearea\":{\"toolbar\":\"Kilde\"},\"specialchar\":{\"options\":\"Alternativer for spesialtegn\",\"title\":\"Velg spesialtegn\",\"toolbar\":\"Sett inn spesialtegn\"},\"scayt\":{\"btn_about\":\"Om SCAYT\",\"btn_dictionaries\":\"Ordbøker\",\"btn_disable\":\"Slå av SCAYT\",\"btn_enable\":\"Slå på SCAYT\",\"btn_langs\":\"Språk\",\"btn_options\":\"Valg\",\"text_title\":\"Stavekontroll mens du skriver\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Stilformater\",\"panelTitle1\":\"Blokkstiler\",\"panelTitle2\":\"Inlinestiler\",\"panelTitle3\":\"Objektstiler\"},\"table\":{\"border\":\"Rammestørrelse\",\"caption\":\"Tittel\",\"cell\":{\"menu\":\"Celle\",\"insertBefore\":\"Sett inn celle før\",\"insertAfter\":\"Sett inn celle etter\",\"deleteCell\":\"Slett celler\",\"merge\":\"Slå sammen celler\",\"mergeRight\":\"Slå sammen høyre\",\"mergeDown\":\"Slå sammen ned\",\"splitHorizontal\":\"Del celle horisontalt\",\"splitVertical\":\"Del celle vertikalt\",\"title\":\"Celleegenskaper\",\"cellType\":\"Celletype\",\"rowSpan\":\"Radspenn\",\"colSpan\":\"Kolonnespenn\",\"wordWrap\":\"Tekstbrytning\",\"hAlign\":\"Horisontal justering\",\"vAlign\":\"Vertikal justering\",\"alignBaseline\":\"Grunnlinje\",\"bgColor\":\"Bakgrunnsfarge\",\"borderColor\":\"Rammefarge\",\"data\":\"Data\",\"header\":\"Overskrift\",\"yes\":\"Ja\",\"no\":\"Nei\",\"invalidWidth\":\"Cellebredde må være et tall.\",\"invalidHeight\":\"Cellehøyde må være et tall.\",\"invalidRowSpan\":\"Radspenn må være et heltall.\",\"invalidColSpan\":\"Kolonnespenn må være et heltall.\",\"chooseColor\":\"Velg\"},\"cellPad\":\"Cellepolstring\",\"cellSpace\":\"Cellemarg\",\"column\":{\"menu\":\"Kolonne\",\"insertBefore\":\"Sett inn kolonne før\",\"insertAfter\":\"Sett inn kolonne etter\",\"deleteColumn\":\"Slett kolonner\"},\"columns\":\"Kolonner\",\"deleteTable\":\"Slett tabell\",\"headers\":\"Overskrifter\",\"headersBoth\":\"Begge\",\"headersColumn\":\"Første kolonne\",\"headersNone\":\"Ingen\",\"headersRow\":\"Første rad\",\"invalidBorder\":\"Rammestørrelse må være et tall.\",\"invalidCellPadding\":\"Cellepolstring må være et positivt tall.\",\"invalidCellSpacing\":\"Cellemarg må være et positivt tall.\",\"invalidCols\":\"Antall kolonner må være et tall større enn 0.\",\"invalidHeight\":\"Tabellhøyde må være et tall.\",\"invalidRows\":\"Antall rader må være et tall større enn 0.\",\"invalidWidth\":\"Tabellbredde må være et tall.\",\"menu\":\"Egenskaper for tabell\",\"row\":{\"menu\":\"Rader\",\"insertBefore\":\"Sett inn rad før\",\"insertAfter\":\"Sett inn rad etter\",\"deleteRow\":\"Slett rader\"},\"rows\":\"Rader\",\"summary\":\"Sammendrag\",\"title\":\"Egenskaper for tabell\",\"toolbar\":\"Tabell\",\"widthPc\":\"prosent\",\"widthPx\":\"piksler\",\"widthUnit\":\"Bredde-enhet\"},\"undo\":{\"redo\":\"Gjør om\",\"undo\":\"Angre\"},\"wsc\":{\"btnIgnore\":\"Ignorer\",\"btnIgnoreAll\":\"Ignorer alle\",\"btnReplace\":\"Erstatt\",\"btnReplaceAll\":\"Erstatt alle\",\"btnUndo\":\"Angre\",\"changeTo\":\"Endre til\",\"errorLoading\":\"Feil under lasting av applikasjonstjenestetjener: %s.\",\"ieSpellDownload\":\"Stavekontroll er ikke installert. Vil du laste den ned nå?\",\"manyChanges\":\"Stavekontroll fullført: %1 ord endret\",\"noChanges\":\"Stavekontroll fullført: ingen ord endret\",\"noMispell\":\"Stavekontroll fullført: ingen feilstavinger funnet\",\"noSuggestions\":\"- Ingen forslag -\",\"notAvailable\":\"Beklager, tjenesten er utilgjenglig nå.\",\"notInDic\":\"Ikke i ordboken\",\"oneChange\":\"Stavekontroll fullført: Ett ord endret\",\"progress\":\"Stavekontroll pågår...\",\"title\":\"Stavekontroll\",\"toolbar\":\"Stavekontroll\"}};"
  },
  {
    "path": "assets/ckeditor/lang/nl.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['nl']={\"editor\":\"Tekstverwerker\",\"editorPanel\":\"Tekstverwerker beheerpaneel\",\"common\":{\"editorHelp\":\"Druk ALT 0 voor hulp\",\"browseServer\":\"Bladeren op server\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Upload\",\"uploadSubmit\":\"Naar server verzenden\",\"image\":\"Afbeelding\",\"flash\":\"Flash\",\"form\":\"Formulier\",\"checkbox\":\"Selectievinkje\",\"radio\":\"Keuzerondje\",\"textField\":\"Tekstveld\",\"textarea\":\"Tekstvak\",\"hiddenField\":\"Verborgen veld\",\"button\":\"Knop\",\"select\":\"Selectieveld\",\"imageButton\":\"Afbeeldingsknop\",\"notSet\":\"<niet ingevuld>\",\"id\":\"Id\",\"name\":\"Naam\",\"langDir\":\"Schrijfrichting\",\"langDirLtr\":\"Links naar rechts (LTR)\",\"langDirRtl\":\"Rechts naar links (RTL)\",\"langCode\":\"Taalcode\",\"longDescr\":\"Lange URL-omschrijving\",\"cssClass\":\"Stylesheet-klassen\",\"advisoryTitle\":\"Adviserende titel\",\"cssStyle\":\"Stijl\",\"ok\":\"OK\",\"cancel\":\"Annuleren\",\"close\":\"Sluiten\",\"preview\":\"Voorbeeld\",\"resize\":\"Sleep om te herschalen\",\"generalTab\":\"Algemeen\",\"advancedTab\":\"Geavanceerd\",\"validateNumberFailed\":\"Deze waarde is geen geldig getal.\",\"confirmNewPage\":\"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?\",\"confirmCancel\":\"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?\",\"options\":\"Opties\",\"target\":\"Doelvenster\",\"targetNew\":\"Nieuw venster (_blank)\",\"targetTop\":\"Hele venster (_top)\",\"targetSelf\":\"Zelfde venster (_self)\",\"targetParent\":\"Origineel venster (_parent)\",\"langDirLTR\":\"Links naar rechts (LTR)\",\"langDirRTL\":\"Rechts naar links (RTL)\",\"styles\":\"Stijl\",\"cssClasses\":\"Stylesheet-klassen\",\"width\":\"Breedte\",\"height\":\"Hoogte\",\"align\":\"Uitlijning\",\"alignLeft\":\"Links\",\"alignRight\":\"Rechts\",\"alignCenter\":\"Centreren\",\"alignJustify\":\"Uitvullen\",\"alignTop\":\"Boven\",\"alignMiddle\":\"Midden\",\"alignBottom\":\"Onder\",\"alignNone\":\"Geen\",\"invalidValue\":\"Ongeldige waarde.\",\"invalidHeight\":\"De hoogte moet een getal zijn.\",\"invalidWidth\":\"De breedte moet een getal zijn.\",\"invalidCssLength\":\"Waarde in veld \\\"%1\\\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).\",\"invalidHtmlLength\":\"Waarde in veld \\\"%1\\\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).\",\"invalidInlineStyle\":\"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \\\"naam : waarde\\\", gescheiden door puntkomma's.\",\"cssLengthTooltip\":\"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, niet beschikbaar</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alle rechten voorbehouden.\",\"dlgTitle\":\"Over CKEditor\",\"help\":\"Bekijk de $1 voor hulp.\",\"moreInfo\":\"Bezoek onze website voor licentieinformatie:\",\"title\":\"Over CKEditor\",\"userGuide\":\"CKEditor gebruiksaanwijzing\"},\"basicstyles\":{\"bold\":\"Vet\",\"italic\":\"Cursief\",\"strike\":\"Doorhalen\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"Onderstrepen\"},\"bidi\":{\"ltr\":\"Schrijfrichting van links naar rechts\",\"rtl\":\"Schrijfrichting van rechts naar links\"},\"blockquote\":{\"toolbar\":\"Citaatblok\"},\"clipboard\":{\"copy\":\"Kopiëren\",\"copyError\":\"De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.\",\"cut\":\"Knippen\",\"cutError\":\"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.\",\"paste\":\"Plakken\",\"pasteArea\":\"Plakgebied\",\"pasteMsg\":\"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.\",\"securityMsg\":\"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.\",\"title\":\"Plakken\"},\"button\":{\"selectedLabel\":\"%1 (Geselecteerd)\"},\"colorbutton\":{\"auto\":\"Automatisch\",\"bgColorTitle\":\"Achtergrondkleur\",\"colors\":{\"000\":\"Zwart\",\"800000\":\"Kastanjebruin\",\"8B4513\":\"Chocoladebruin\",\"2F4F4F\":\"Donkerleigrijs\",\"008080\":\"Blauwgroen\",\"000080\":\"Marine\",\"4B0082\":\"Indigo\",\"696969\":\"Donkergrijs\",\"B22222\":\"Baksteen\",\"A52A2A\":\"Bruin\",\"DAA520\":\"Donkergeel\",\"006400\":\"Donkergroen\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Middenblauw\",\"800080\":\"Paars\",\"808080\":\"Grijs\",\"F00\":\"Rood\",\"FF8C00\":\"Donkeroranje\",\"FFD700\":\"Goud\",\"008000\":\"Groen\",\"0FF\":\"Cyaan\",\"00F\":\"Blauw\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Donkergrijs\",\"FFA07A\":\"Lichtzalm\",\"FFA500\":\"Oranje\",\"FFFF00\":\"Geel\",\"00FF00\":\"Felgroen\",\"AFEEEE\":\"Lichtturquoise\",\"ADD8E6\":\"Lichtblauw\",\"DDA0DD\":\"Pruim\",\"D3D3D3\":\"Lichtgrijs\",\"FFF0F5\":\"Linnen\",\"FAEBD7\":\"Ivoor\",\"FFFFE0\":\"Lichtgeel\",\"F0FFF0\":\"Honingdauw\",\"F0FFFF\":\"Azuur\",\"F0F8FF\":\"Licht hemelsblauw\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Wit\"},\"more\":\"Meer kleuren...\",\"panelTitle\":\"Kleuren\",\"textColorTitle\":\"Tekstkleur\"},\"colordialog\":{\"clear\":\"Wissen\",\"highlight\":\"Actief\",\"options\":\"Kleuropties\",\"selected\":\"Geselecteerde kleur\",\"title\":\"Selecteer kleur\"},\"templates\":{\"button\":\"Sjablonen\",\"emptyListMsg\":\"(Geen sjablonen gedefinieerd)\",\"insertOption\":\"Vervang de huidige inhoud\",\"options\":\"Template opties\",\"selectPromptMsg\":\"Selecteer het sjabloon dat in de editor geopend moet worden (de actuele inhoud gaat verloren):\",\"title\":\"Inhoud sjablonen\"},\"contextmenu\":{\"options\":\"Contextmenu opties\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Adviserende titel\",\"cssClassInputLabel\":\"Stylesheet klassen\",\"edit\":\"Div wijzigen\",\"inlineStyleInputLabel\":\"Inline stijl\",\"langDirLTRLabel\":\"Links naar rechts (LTR)\",\"langDirLabel\":\"Schrijfrichting\",\"langDirRTLLabel\":\"Rechts naar links (RTL)\",\"languageCodeInputLabel\":\" Taalcode\",\"remove\":\"Div verwijderen\",\"styleSelectLabel\":\"Stijl\",\"title\":\"Div aanmaken\",\"toolbar\":\"Div aanmaken\"},\"toolbar\":{\"toolbarCollapse\":\"Werkbalk inklappen\",\"toolbarExpand\":\"Werkbalk uitklappen\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Klembord/Ongedaan maken\",\"editing\":\"Bewerken\",\"forms\":\"Formulieren\",\"basicstyles\":\"Basisstijlen\",\"paragraph\":\"Paragraaf\",\"links\":\"Links\",\"insert\":\"Invoegen\",\"styles\":\"Stijlen\",\"colors\":\"Kleuren\",\"tools\":\"Toepassingen\"},\"toolbars\":\"Werkbalken\"},\"elementspath\":{\"eleLabel\":\"Elementenpad\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Zoeken\",\"findOptions\":\"Zoekopties\",\"findWhat\":\"Zoeken naar:\",\"matchCase\":\"Hoofdlettergevoelig\",\"matchCyclic\":\"Doorlopend zoeken\",\"matchWord\":\"Hele woord moet voorkomen\",\"notFoundMsg\":\"De opgegeven tekst is niet gevonden.\",\"replace\":\"Vervangen\",\"replaceAll\":\"Alles vervangen\",\"replaceSuccessMsg\":\"%1 resultaten vervangen.\",\"replaceWith\":\"Vervangen met:\",\"title\":\"Zoeken en vervangen\"},\"fakeobjects\":{\"anchor\":\"Interne link\",\"flash\":\"Flash animatie\",\"hiddenfield\":\"Verborgen veld\",\"iframe\":\"IFrame\",\"unknown\":\"Onbekend object\"},\"flash\":{\"access\":\"Script toegang\",\"accessAlways\":\"Altijd\",\"accessNever\":\"Nooit\",\"accessSameDomain\":\"Zelfde domeinnaam\",\"alignAbsBottom\":\"Absoluut-onder\",\"alignAbsMiddle\":\"Absoluut-midden\",\"alignBaseline\":\"Basislijn\",\"alignTextTop\":\"Boven tekst\",\"bgcolor\":\"Achtergrondkleur\",\"chkFull\":\"Schermvullend toestaan\",\"chkLoop\":\"Herhalen\",\"chkMenu\":\"Flashmenu's inschakelen\",\"chkPlay\":\"Automatisch afspelen\",\"flashvars\":\"Variabelen voor Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Eigenschappen Flash\",\"propertiesTab\":\"Eigenschappen\",\"quality\":\"Kwaliteit\",\"qualityAutoHigh\":\"Automatisch hoog\",\"qualityAutoLow\":\"Automatisch laag\",\"qualityBest\":\"Beste\",\"qualityHigh\":\"Hoog\",\"qualityLow\":\"Laag\",\"qualityMedium\":\"Gemiddeld\",\"scale\":\"Schaal\",\"scaleAll\":\"Alles tonen\",\"scaleFit\":\"Precies passend\",\"scaleNoBorder\":\"Geen rand\",\"title\":\"Eigenschappen Flash\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"De HSpace moet een getal zijn.\",\"validateSrc\":\"De URL mag niet leeg zijn.\",\"validateVSpace\":\"De VSpace moet een getal zijn.\",\"windowMode\":\"Venster modus\",\"windowModeOpaque\":\"Ondoorzichtig\",\"windowModeTransparent\":\"Doorzichtig\",\"windowModeWindow\":\"Venster\"},\"font\":{\"fontSize\":{\"label\":\"Lettergrootte\",\"voiceLabel\":\"Lettergrootte\",\"panelTitle\":\"Lettergrootte\"},\"label\":\"Lettertype\",\"panelTitle\":\"Lettertype\",\"voiceLabel\":\"Lettertype\"},\"forms\":{\"button\":{\"title\":\"Eigenschappen knop\",\"text\":\"Tekst (waarde)\",\"type\":\"Soort\",\"typeBtn\":\"Knop\",\"typeSbm\":\"Versturen\",\"typeRst\":\"Leegmaken\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Eigenschappen aanvinkvakje\",\"radioTitle\":\"Eigenschappen selectievakje\",\"value\":\"Waarde\",\"selected\":\"Geselecteerd\",\"required\":\"Vereist\"},\"form\":{\"title\":\"Eigenschappen formulier\",\"menu\":\"Eigenschappen formulier\",\"action\":\"Actie\",\"method\":\"Methode\",\"encoding\":\"Codering\"},\"hidden\":{\"title\":\"Eigenschappen verborgen veld\",\"name\":\"Naam\",\"value\":\"Waarde\"},\"select\":{\"title\":\"Eigenschappen selectieveld\",\"selectInfo\":\"Informatie\",\"opAvail\":\"Beschikbare opties\",\"value\":\"Waarde\",\"size\":\"Grootte\",\"lines\":\"Regels\",\"chkMulti\":\"Gecombineerde selecties toestaan\",\"required\":\"Vereist\",\"opText\":\"Tekst\",\"opValue\":\"Waarde\",\"btnAdd\":\"Toevoegen\",\"btnModify\":\"Wijzigen\",\"btnUp\":\"Omhoog\",\"btnDown\":\"Omlaag\",\"btnSetValue\":\"Als geselecteerde waarde instellen\",\"btnDelete\":\"Verwijderen\"},\"textarea\":{\"title\":\"Eigenschappen tekstvak\",\"cols\":\"Kolommen\",\"rows\":\"Rijen\"},\"textfield\":{\"title\":\"Eigenschappen tekstveld\",\"name\":\"Naam\",\"value\":\"Waarde\",\"charWidth\":\"Breedte (tekens)\",\"maxChars\":\"Maximum aantal tekens\",\"required\":\"Vereist\",\"type\":\"Soort\",\"typeText\":\"Tekst\",\"typePass\":\"Wachtwoord\",\"typeEmail\":\"E-mail\",\"typeSearch\":\"Zoeken\",\"typeTel\":\"Telefoonnummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Opmaak\",\"panelTitle\":\"Opmaak\",\"tag_address\":\"Adres\",\"tag_div\":\"Normaal (DIV)\",\"tag_h1\":\"Kop 1\",\"tag_h2\":\"Kop 2\",\"tag_h3\":\"Kop 3\",\"tag_h4\":\"Kop 4\",\"tag_h5\":\"Kop 5\",\"tag_h6\":\"Kop 6\",\"tag_p\":\"Normaal\",\"tag_pre\":\"Met opmaak\"},\"horizontalrule\":{\"toolbar\":\"Horizontale lijn invoegen\"},\"iframe\":{\"border\":\"Framerand tonen\",\"noUrl\":\"Vul de IFrame URL in\",\"scrolling\":\"Scrollbalken inschakelen\",\"title\":\"IFrame-eigenschappen\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatieve tekst\",\"border\":\"Rand\",\"btnUpload\":\"Naar server verzenden\",\"button2Img\":\"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?\",\"infoTab\":\"Informatie afbeelding\",\"linkTab\":\"Link\",\"lockRatio\":\"Afmetingen vergrendelen\",\"menu\":\"Eigenschappen afbeelding\",\"resetSize\":\"Afmetingen resetten\",\"title\":\"Eigenschappen afbeelding\",\"titleButton\":\"Eigenschappen afbeeldingsknop\",\"upload\":\"Upload\",\"urlMissing\":\"De URL naar de afbeelding ontbreekt.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Rand moet een heel nummer zijn.\",\"validateHSpace\":\"HSpace moet een heel nummer zijn.\",\"validateVSpace\":\"VSpace moet een heel nummer zijn.\"},\"indent\":{\"indent\":\"Inspringing vergroten\",\"outdent\":\"Inspringing verkleinen\"},\"smiley\":{\"options\":\"Smiley opties\",\"title\":\"Smiley invoegen\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Uitvullen\",\"center\":\"Centreren\",\"left\":\"Links uitlijnen\",\"right\":\"Rechts uitlijnen\"},\"language\":{\"button\":\"Taal instellen\",\"remove\":\"Taal verwijderen\"},\"link\":{\"acccessKey\":\"Toegangstoets\",\"advanced\":\"Geavanceerd\",\"advisoryContentType\":\"Aanbevolen content-type\",\"advisoryTitle\":\"Adviserende titel\",\"anchor\":{\"toolbar\":\"Interne link\",\"menu\":\"Eigenschappen interne link\",\"title\":\"Eigenschappen interne link\",\"name\":\"Naam interne link\",\"errorName\":\"Geef de naam van de interne link op\",\"remove\":\"Interne link verwijderen\"},\"anchorId\":\"Op kenmerk interne link\",\"anchorName\":\"Op naam interne link\",\"charset\":\"Karakterset van gelinkte bron\",\"cssClasses\":\"Stylesheet-klassen\",\"emailAddress\":\"E-mailadres\",\"emailBody\":\"Inhoud bericht\",\"emailSubject\":\"Onderwerp bericht\",\"id\":\"Id\",\"info\":\"Linkomschrijving\",\"langCode\":\"Taalcode\",\"langDir\":\"Schrijfrichting\",\"langDirLTR\":\"Links naar rechts (LTR)\",\"langDirRTL\":\"Rechts naar links (RTL)\",\"menu\":\"Link wijzigen\",\"name\":\"Naam\",\"noAnchors\":\"(Geen interne links in document gevonden)\",\"noEmail\":\"Geef een e-mailadres\",\"noUrl\":\"Geef de link van de URL\",\"other\":\"<ander>\",\"popupDependent\":\"Afhankelijk (Netscape)\",\"popupFeatures\":\"Instellingen popupvenster\",\"popupFullScreen\":\"Volledig scherm (IE)\",\"popupLeft\":\"Positie links\",\"popupLocationBar\":\"Locatiemenu\",\"popupMenuBar\":\"Menubalk\",\"popupResizable\":\"Herschaalbaar\",\"popupScrollBars\":\"Schuifbalken\",\"popupStatusBar\":\"Statusbalk\",\"popupToolbar\":\"Werkbalk\",\"popupTop\":\"Positie boven\",\"rel\":\"Relatie\",\"selectAnchor\":\"Kies een interne link\",\"styles\":\"Stijl\",\"tabIndex\":\"Tabvolgorde\",\"target\":\"Doelvenster\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Naam doelframe\",\"targetPopup\":\"<popupvenster>\",\"targetPopupName\":\"Naam popupvenster\",\"title\":\"Link\",\"toAnchor\":\"Interne link in pagina\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Link invoegen/wijzigen\",\"type\":\"Linktype\",\"unlink\":\"Link verwijderen\",\"upload\":\"Upload\"},\"list\":{\"bulletedlist\":\"Opsomming invoegen\",\"numberedlist\":\"Genummerde lijst invoegen\"},\"liststyle\":{\"armenian\":\"Armeense nummering\",\"bulletedTitle\":\"Eigenschappen lijst met opsommingstekens\",\"circle\":\"Cirkel\",\"decimal\":\"Cijfers (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Cijfers beginnen met nul (01, 02, 03, etc.)\",\"disc\":\"Schijf\",\"georgian\":\"Georgische nummering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Kleine letters (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Grieks kleine letters (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Romeins kleine letters (i, ii, iii, iv, v, etc.)\",\"none\":\"Geen\",\"notset\":\"<niet gezet>\",\"numberedTitle\":\"Eigenschappen genummerde lijst\",\"square\":\"Vierkant\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Hoofdletters (A, B, C, D, E, etc.)\",\"upperRoman\":\"Romeinse hoofdletters (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Startnummer van de lijst moet een heel nummer zijn.\"},\"magicline\":{\"title\":\"Hier paragraaf invoeren\"},\"maximize\":{\"maximize\":\"Maximaliseren\",\"minimize\":\"Minimaliseren\"},\"newpage\":{\"toolbar\":\"Nieuwe pagina\"},\"pagebreak\":{\"alt\":\"Pagina-einde\",\"toolbar\":\"Pagina-einde invoegen\"},\"pastetext\":{\"button\":\"Plakken als platte tekst\",\"title\":\"Plakken als platte tekst\"},\"pastefromword\":{\"confirmCleanup\":\"De tekst die u wilt plakken lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?\",\"error\":\"Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout\",\"title\":\"Plakken vanuit Word\",\"toolbar\":\"Plakken vanuit Word\"},\"preview\":{\"preview\":\"Voorbeeld\"},\"print\":{\"toolbar\":\"Afdrukken\"},\"removeformat\":{\"toolbar\":\"Opmaak verwijderen\"},\"save\":{\"toolbar\":\"Opslaan\"},\"selectall\":{\"toolbar\":\"Alles selecteren\"},\"showblocks\":{\"toolbar\":\"Toon blokken\"},\"sourcearea\":{\"toolbar\":\"Broncode\"},\"specialchar\":{\"options\":\"Speciale tekens opties\",\"title\":\"Selecteer speciaal teken\",\"toolbar\":\"Speciaal teken invoegen\"},\"scayt\":{\"btn_about\":\"Over SCAYT\",\"btn_dictionaries\":\"Woordenboeken\",\"btn_disable\":\"SCAYT uitschakelen\",\"btn_enable\":\"SCAYT inschakelen\",\"btn_langs\":\"Talen\",\"btn_options\":\"Opties\",\"text_title\":\"Controleer de spelling tijdens het typen\"},\"stylescombo\":{\"label\":\"Stijl\",\"panelTitle\":\"Opmaakstijlen\",\"panelTitle1\":\"Blok stijlen\",\"panelTitle2\":\"Inline stijlen\",\"panelTitle3\":\"Object stijlen\"},\"table\":{\"border\":\"Randdikte\",\"caption\":\"Onderschrift\",\"cell\":{\"menu\":\"Cel\",\"insertBefore\":\"Voeg cel in voor\",\"insertAfter\":\"Voeg cel in na\",\"deleteCell\":\"Cellen verwijderen\",\"merge\":\"Cellen samenvoegen\",\"mergeRight\":\"Voeg samen naar rechts\",\"mergeDown\":\"Voeg samen naar beneden\",\"splitHorizontal\":\"Splits cel horizontaal\",\"splitVertical\":\"Splits cel vertikaal\",\"title\":\"Celeigenschappen\",\"cellType\":\"Celtype\",\"rowSpan\":\"Rijen samenvoegen\",\"colSpan\":\"Kolommen samenvoegen\",\"wordWrap\":\"Automatische terugloop\",\"hAlign\":\"Horizontale uitlijning\",\"vAlign\":\"Verticale uitlijning\",\"alignBaseline\":\"Tekstregel\",\"bgColor\":\"Achtergrondkleur\",\"borderColor\":\"Randkleur\",\"data\":\"Gegevens\",\"header\":\"Kop\",\"yes\":\"Ja\",\"no\":\"Nee\",\"invalidWidth\":\"De celbreedte moet een getal zijn.\",\"invalidHeight\":\"De celhoogte moet een getal zijn.\",\"invalidRowSpan\":\"Rijen samenvoegen moet een heel getal zijn.\",\"invalidColSpan\":\"Kolommen samenvoegen moet een heel getal zijn.\",\"chooseColor\":\"Kies\"},\"cellPad\":\"Celopvulling\",\"cellSpace\":\"Celafstand\",\"column\":{\"menu\":\"Kolom\",\"insertBefore\":\"Voeg kolom in voor\",\"insertAfter\":\"Voeg kolom in na\",\"deleteColumn\":\"Kolommen verwijderen\"},\"columns\":\"Kolommen\",\"deleteTable\":\"Tabel verwijderen\",\"headers\":\"Koppen\",\"headersBoth\":\"Beide\",\"headersColumn\":\"Eerste kolom\",\"headersNone\":\"Geen\",\"headersRow\":\"Eerste rij\",\"invalidBorder\":\"De randdikte moet een getal zijn.\",\"invalidCellPadding\":\"Celopvulling moet een getal zijn.\",\"invalidCellSpacing\":\"Celafstand moet een getal zijn.\",\"invalidCols\":\"Het aantal kolommen moet een getal zijn groter dan 0.\",\"invalidHeight\":\"De tabelhoogte moet een getal zijn.\",\"invalidRows\":\"Het aantal rijen moet een getal zijn groter dan 0.\",\"invalidWidth\":\"De tabelbreedte moet een getal zijn.\",\"menu\":\"Tabeleigenschappen\",\"row\":{\"menu\":\"Rij\",\"insertBefore\":\"Voeg rij in voor\",\"insertAfter\":\"Voeg rij in na\",\"deleteRow\":\"Rijen verwijderen\"},\"rows\":\"Rijen\",\"summary\":\"Samenvatting\",\"title\":\"Tabeleigenschappen\",\"toolbar\":\"Tabel\",\"widthPc\":\"procent\",\"widthPx\":\"pixels\",\"widthUnit\":\"eenheid breedte\"},\"undo\":{\"redo\":\"Opnieuw uitvoeren\",\"undo\":\"Ongedaan maken\"},\"wsc\":{\"btnIgnore\":\"Negeren\",\"btnIgnoreAll\":\"Alles negeren\",\"btnReplace\":\"Vervangen\",\"btnReplaceAll\":\"Alles vervangen\",\"btnUndo\":\"Ongedaan maken\",\"changeTo\":\"Wijzig in\",\"errorLoading\":\"Er is een fout opgetreden bij het laden van de dienst: %s.\",\"ieSpellDownload\":\"De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?\",\"manyChanges\":\"Klaar met spellingscontrole: %1 woorden aangepast\",\"noChanges\":\"Klaar met spellingscontrole: geen woorden aangepast\",\"noMispell\":\"Klaar met spellingscontrole: geen fouten gevonden\",\"noSuggestions\":\"- Geen suggesties -\",\"notAvailable\":\"Excuses, deze dienst is momenteel niet beschikbaar.\",\"notInDic\":\"Niet in het woordenboek\",\"oneChange\":\"Klaar met spellingscontrole: één woord aangepast\",\"progress\":\"Bezig met spellingscontrole...\",\"title\":\"Spellingscontrole\",\"toolbar\":\"Spellingscontrole\"}};"
  },
  {
    "path": "assets/ckeditor/lang/no.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['no']={\"editor\":\"Rikteksteditor\",\"editorPanel\":\"Panel for rikteksteditor\",\"common\":{\"editorHelp\":\"Trykk ALT 0 for hjelp\",\"browseServer\":\"Bla igjennom server\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Last opp\",\"uploadSubmit\":\"Send det til serveren\",\"image\":\"Bilde\",\"flash\":\"Flash\",\"form\":\"Skjema\",\"checkbox\":\"Avmerkingsboks\",\"radio\":\"Alternativknapp\",\"textField\":\"Tekstboks\",\"textarea\":\"Tekstområde\",\"hiddenField\":\"Skjult felt\",\"button\":\"Knapp\",\"select\":\"Rullegardinliste\",\"imageButton\":\"Bildeknapp\",\"notSet\":\"<ikke satt>\",\"id\":\"Id\",\"name\":\"Navn\",\"langDir\":\"Språkretning\",\"langDirLtr\":\"Venstre til høyre (VTH)\",\"langDirRtl\":\"Høyre til venstre (HTV)\",\"langCode\":\"Språkkode\",\"longDescr\":\"Utvidet beskrivelse\",\"cssClass\":\"Stilarkklasser\",\"advisoryTitle\":\"Tittel\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Avbryt\",\"close\":\"Lukk\",\"preview\":\"Forhåndsvis\",\"resize\":\"Dra for å skalere\",\"generalTab\":\"Generelt\",\"advancedTab\":\"Avansert\",\"validateNumberFailed\":\"Denne verdien er ikke et tall.\",\"confirmNewPage\":\"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?\",\"confirmCancel\":\"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?\",\"options\":\"Valg\",\"target\":\"Mål\",\"targetNew\":\"Nytt vindu (_blank)\",\"targetTop\":\"Hele vindu (_top)\",\"targetSelf\":\"Samme vindu (_self)\",\"targetParent\":\"Foreldrevindu (_parent)\",\"langDirLTR\":\"Venstre til høyre (VTH)\",\"langDirRTL\":\"Høyre til venstre (HTV)\",\"styles\":\"Stil\",\"cssClasses\":\"Stilarkklasser\",\"width\":\"Bredde\",\"height\":\"Høyde\",\"align\":\"Juster\",\"alignLeft\":\"Venstre\",\"alignRight\":\"Høyre\",\"alignCenter\":\"Midtjuster\",\"alignJustify\":\"Blokkjuster\",\"alignTop\":\"Topp\",\"alignMiddle\":\"Midten\",\"alignBottom\":\"Bunn\",\"alignNone\":\"Ingen\",\"invalidValue\":\"Ugyldig verdi.\",\"invalidHeight\":\"Høyde må være et tall.\",\"invalidWidth\":\"Bredde må være et tall.\",\"invalidCssLength\":\"Den angitte verdien for feltet \\\"%1\\\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"invalidHtmlLength\":\"Den angitte verdien for feltet \\\"%1\\\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).\",\"invalidInlineStyle\":\"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \\\"navn : verdi\\\", separert med semikolon\",\"cssLengthTooltip\":\"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, utilgjenglig</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alle rettigheter reservert.\",\"dlgTitle\":\"Om CKEditor\",\"help\":\"Se $1 for hjelp.\",\"moreInfo\":\"For lisensieringsinformasjon, vennligst besøk vårt nettsted:\",\"title\":\"Om CKEditor\",\"userGuide\":\"CKEditors brukerveiledning\"},\"basicstyles\":{\"bold\":\"Fet\",\"italic\":\"Kursiv\",\"strike\":\"Gjennomstreking\",\"subscript\":\"Senket skrift\",\"superscript\":\"Hevet skrift\",\"underline\":\"Understreking\"},\"bidi\":{\"ltr\":\"Tekstretning fra venstre til høyre\",\"rtl\":\"Tekstretning fra høyre til venstre\"},\"blockquote\":{\"toolbar\":\"Blokksitat\"},\"clipboard\":{\"copy\":\"Kopier\",\"copyError\":\"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).\",\"cut\":\"Klipp ut\",\"cutError\":\"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).\",\"paste\":\"Lim inn\",\"pasteArea\":\"Innlimingsområde\",\"pasteMsg\":\"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.\",\"securityMsg\":\"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.\",\"title\":\"Lim inn\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatisk\",\"bgColorTitle\":\"Bakgrunnsfarge\",\"colors\":{\"000\":\"Svart\",\"800000\":\"Rødbrun\",\"8B4513\":\"Salbrun\",\"2F4F4F\":\"Grønnsvart\",\"008080\":\"Blågrønn\",\"000080\":\"Marineblått\",\"4B0082\":\"Indigo\",\"696969\":\"Mørk grå\",\"B22222\":\"Mørkerød\",\"A52A2A\":\"Brun\",\"DAA520\":\"Lys brun\",\"006400\":\"Mørk grønn\",\"40E0D0\":\"Turkis\",\"0000CD\":\"Medium blå\",\"800080\":\"Purpur\",\"808080\":\"Grå\",\"F00\":\"Rød\",\"FF8C00\":\"Mørk oransje\",\"FFD700\":\"Gull\",\"008000\":\"Grønn\",\"0FF\":\"Cyan\",\"00F\":\"Blå\",\"EE82EE\":\"Fiolett\",\"A9A9A9\":\"Svak grå\",\"FFA07A\":\"Rosa-oransje\",\"FFA500\":\"Oransje\",\"FFFF00\":\"Gul\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Svak turkis\",\"ADD8E6\":\"Lys Blå\",\"DDA0DD\":\"Plomme\",\"D3D3D3\":\"Lys grå\",\"FFF0F5\":\"Svak lavendelrosa\",\"FAEBD7\":\"Antikk-hvit\",\"FFFFE0\":\"Lys gul\",\"F0FFF0\":\"Honningmelon\",\"F0FFFF\":\"Svakt asurblått\",\"F0F8FF\":\"Svak cyan\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Hvit\"},\"more\":\"Flere farger...\",\"panelTitle\":\"Farger\",\"textColorTitle\":\"Tekstfarge\"},\"colordialog\":{\"clear\":\"Tøm\",\"highlight\":\"Merk\",\"options\":\"Alternativer for farge\",\"selected\":\"Valgt\",\"title\":\"Velg farge\"},\"templates\":{\"button\":\"Maler\",\"emptyListMsg\":\"(Ingen maler definert)\",\"insertOption\":\"Erstatt gjeldende innhold\",\"options\":\"Alternativer for mal\",\"selectPromptMsg\":\"Velg malen du vil åpne i redigeringsverktøyet:\",\"title\":\"Innholdsmaler\"},\"contextmenu\":{\"options\":\"Alternativer for høyreklikkmeny\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Tittel\",\"cssClassInputLabel\":\"Stilark-klasser\",\"edit\":\"Rediger Div\",\"inlineStyleInputLabel\":\"Inlinestiler\",\"langDirLTRLabel\":\"Venstre til høyre (VTH)\",\"langDirLabel\":\"Språkretning\",\"langDirRTLLabel\":\"Høyre til venstre (HTV)\",\"languageCodeInputLabel\":\" Språkkode\",\"remove\":\"Fjern Div\",\"styleSelectLabel\":\"Stil\",\"title\":\"Sett inn Div Container\",\"toolbar\":\"Sett inn Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Skjul verktøylinje\",\"toolbarExpand\":\"Vis verktøylinje\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Utklippstavle/Angre\",\"editing\":\"Redigering\",\"forms\":\"Skjema\",\"basicstyles\":\"Basisstiler\",\"paragraph\":\"Avsnitt\",\"links\":\"Lenker\",\"insert\":\"Innsetting\",\"styles\":\"Stiler\",\"colors\":\"Farger\",\"tools\":\"Verktøy\"},\"toolbars\":\"Verktøylinjer for editor\"},\"elementspath\":{\"eleLabel\":\"Element-sti\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Søk\",\"findOptions\":\"Søkealternativer\",\"findWhat\":\"Søk etter:\",\"matchCase\":\"Skill mellom store og små bokstaver\",\"matchCyclic\":\"Søk i hele dokumentet\",\"matchWord\":\"Bare hele ord\",\"notFoundMsg\":\"Fant ikke søketeksten.\",\"replace\":\"Erstatt\",\"replaceAll\":\"Erstatt alle\",\"replaceSuccessMsg\":\"%1 tilfelle(r) erstattet.\",\"replaceWith\":\"Erstatt med:\",\"title\":\"Søk og erstatt\"},\"fakeobjects\":{\"anchor\":\"Anker\",\"flash\":\"Flash-animasjon\",\"hiddenfield\":\"Skjult felt\",\"iframe\":\"IFrame\",\"unknown\":\"Ukjent objekt\"},\"flash\":{\"access\":\"Scripttilgang\",\"accessAlways\":\"Alltid\",\"accessNever\":\"Aldri\",\"accessSameDomain\":\"Samme domene\",\"alignAbsBottom\":\"Abs bunn\",\"alignAbsMiddle\":\"Abs midten\",\"alignBaseline\":\"Bunnlinje\",\"alignTextTop\":\"Tekst topp\",\"bgcolor\":\"Bakgrunnsfarge\",\"chkFull\":\"Tillat fullskjerm\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Slå på Flash-meny\",\"chkPlay\":\"Autospill\",\"flashvars\":\"Variabler for flash\",\"hSpace\":\"HMarg\",\"properties\":\"Egenskaper for Flash-objekt\",\"propertiesTab\":\"Egenskaper\",\"quality\":\"Kvalitet\",\"qualityAutoHigh\":\"Auto høy\",\"qualityAutoLow\":\"Auto lav\",\"qualityBest\":\"Best\",\"qualityHigh\":\"Høy\",\"qualityLow\":\"Lav\",\"qualityMedium\":\"Medium\",\"scale\":\"Skaler\",\"scaleAll\":\"Vis alt\",\"scaleFit\":\"Skaler til å passe\",\"scaleNoBorder\":\"Ingen ramme\",\"title\":\"Flash-egenskaper\",\"vSpace\":\"VMarg\",\"validateHSpace\":\"HMarg må være et tall.\",\"validateSrc\":\"Vennligst skriv inn lenkens url.\",\"validateVSpace\":\"VMarg må være et tall.\",\"windowMode\":\"Vindumodus\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Gjennomsiktig\",\"windowModeWindow\":\"Vindu\"},\"font\":{\"fontSize\":{\"label\":\"Størrelse\",\"voiceLabel\":\"Font Størrelse\",\"panelTitle\":\"Størrelse\"},\"label\":\"Skrift\",\"panelTitle\":\"Skrift\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Egenskaper for knapp\",\"text\":\"Tekst (verdi)\",\"type\":\"Type\",\"typeBtn\":\"Knapp\",\"typeSbm\":\"Send\",\"typeRst\":\"Nullstill\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Egenskaper for avmerkingsboks\",\"radioTitle\":\"Egenskaper for alternativknapp\",\"value\":\"Verdi\",\"selected\":\"Valgt\",\"required\":\"Required\"},\"form\":{\"title\":\"Egenskaper for skjema\",\"menu\":\"Egenskaper for skjema\",\"action\":\"Handling\",\"method\":\"Metode\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Egenskaper for skjult felt\",\"name\":\"Navn\",\"value\":\"Verdi\"},\"select\":{\"title\":\"Egenskaper for rullegardinliste\",\"selectInfo\":\"Info\",\"opAvail\":\"Tilgjenglige alternativer\",\"value\":\"Verdi\",\"size\":\"Størrelse\",\"lines\":\"Linjer\",\"chkMulti\":\"Tillat flervalg\",\"required\":\"Required\",\"opText\":\"Tekst\",\"opValue\":\"Verdi\",\"btnAdd\":\"Legg til\",\"btnModify\":\"Endre\",\"btnUp\":\"Opp\",\"btnDown\":\"Ned\",\"btnSetValue\":\"Sett som valgt\",\"btnDelete\":\"Slett\"},\"textarea\":{\"title\":\"Egenskaper for tekstområde\",\"cols\":\"Kolonner\",\"rows\":\"Rader\"},\"textfield\":{\"title\":\"Egenskaper for tekstfelt\",\"name\":\"Navn\",\"value\":\"Verdi\",\"charWidth\":\"Tegnbredde\",\"maxChars\":\"Maks antall tegn\",\"required\":\"Required\",\"type\":\"Type\",\"typeText\":\"Tekst\",\"typePass\":\"Passord\",\"typeEmail\":\"Epost\",\"typeSearch\":\"Søk\",\"typeTel\":\"Telefonnummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Avsnittsformat\",\"tag_address\":\"Adresse\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Overskrift 1\",\"tag_h2\":\"Overskrift 2\",\"tag_h3\":\"Overskrift 3\",\"tag_h4\":\"Overskrift 4\",\"tag_h5\":\"Overskrift 5\",\"tag_h6\":\"Overskrift 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatert\"},\"horizontalrule\":{\"toolbar\":\"Sett inn horisontal linje\"},\"iframe\":{\"border\":\"Viss ramme rundt iframe\",\"noUrl\":\"Vennligst skriv inn URL for iframe\",\"scrolling\":\"Aktiver scrollefelt\",\"title\":\"Egenskaper for IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativ tekst\",\"border\":\"Ramme\",\"btnUpload\":\"Send det til serveren\",\"button2Img\":\"Vil du endre den valgte bildeknappen til et vanlig bilde?\",\"hSpace\":\"HMarg\",\"img2Button\":\"Vil du endre det valgte bildet til en bildeknapp?\",\"infoTab\":\"Bildeinformasjon\",\"linkTab\":\"Lenke\",\"lockRatio\":\"Lås forhold\",\"menu\":\"Bildeegenskaper\",\"resetSize\":\"Tilbakestill størrelse\",\"title\":\"Bildeegenskaper\",\"titleButton\":\"Egenskaper for bildeknapp\",\"upload\":\"Last opp\",\"urlMissing\":\"Bildets adresse mangler.\",\"vSpace\":\"VMarg\",\"validateBorder\":\"Ramme må være et heltall.\",\"validateHSpace\":\"HMarg må være et heltall.\",\"validateVSpace\":\"VMarg må være et heltall.\"},\"indent\":{\"indent\":\"Øk innrykk\",\"outdent\":\"Reduser innrykk\"},\"smiley\":{\"options\":\"Alternativer for smil\",\"title\":\"Sett inn smil\",\"toolbar\":\"Smil\"},\"justify\":{\"block\":\"Blokkjuster\",\"center\":\"Midtstill\",\"left\":\"Venstrejuster\",\"right\":\"Høyrejuster\"},\"language\":{\"button\":\"Sett språk\",\"remove\":\"Fjern språk\"},\"link\":{\"acccessKey\":\"Aksessknapp\",\"advanced\":\"Avansert\",\"advisoryContentType\":\"Type\",\"advisoryTitle\":\"Tittel\",\"anchor\":{\"toolbar\":\"Sett inn/Rediger anker\",\"menu\":\"Egenskaper for anker\",\"title\":\"Egenskaper for anker\",\"name\":\"Ankernavn\",\"errorName\":\"Vennligst skriv inn ankernavnet\",\"remove\":\"Fjern anker\"},\"anchorId\":\"Element etter ID\",\"anchorName\":\"Anker etter navn\",\"charset\":\"Lenket tegnsett\",\"cssClasses\":\"Stilarkklasser\",\"emailAddress\":\"E-postadresse\",\"emailBody\":\"Melding\",\"emailSubject\":\"Meldingsemne\",\"id\":\"Id\",\"info\":\"Lenkeinfo\",\"langCode\":\"Språkkode\",\"langDir\":\"Språkretning\",\"langDirLTR\":\"Venstre til høyre (VTH)\",\"langDirRTL\":\"Høyre til venstre (HTV)\",\"menu\":\"Rediger lenke\",\"name\":\"Navn\",\"noAnchors\":\"(Ingen anker i dokumentet)\",\"noEmail\":\"Vennligst skriv inn e-postadressen\",\"noUrl\":\"Vennligst skriv inn lenkens URL\",\"other\":\"<annen>\",\"popupDependent\":\"Avhenging (Netscape)\",\"popupFeatures\":\"Egenskaper for popup-vindu\",\"popupFullScreen\":\"Fullskjerm (IE)\",\"popupLeft\":\"Venstre posisjon\",\"popupLocationBar\":\"Adresselinje\",\"popupMenuBar\":\"Menylinje\",\"popupResizable\":\"Skalerbar\",\"popupScrollBars\":\"Scrollbar\",\"popupStatusBar\":\"Statuslinje\",\"popupToolbar\":\"Verktøylinje\",\"popupTop\":\"Topp-posisjon\",\"rel\":\"Relasjon (rel)\",\"selectAnchor\":\"Velg et anker\",\"styles\":\"Stil\",\"tabIndex\":\"Tabindeks\",\"target\":\"Mål\",\"targetFrame\":\"<ramme>\",\"targetFrameName\":\"Målramme\",\"targetPopup\":\"<popup-vindu>\",\"targetPopupName\":\"Navn på popup-vindu\",\"title\":\"Lenke\",\"toAnchor\":\"Lenke til anker i teksten\",\"toEmail\":\"E-post\",\"toUrl\":\"URL\",\"toolbar\":\"Sett inn/Rediger lenke\",\"type\":\"Lenketype\",\"unlink\":\"Fjern lenke\",\"upload\":\"Last opp\"},\"list\":{\"bulletedlist\":\"Legg til/Fjern punktmerket liste\",\"numberedlist\":\"Legg til/Fjern nummerert liste\"},\"liststyle\":{\"armenian\":\"Armensk nummerering\",\"bulletedTitle\":\"Egenskaper for punktmerket liste\",\"circle\":\"Sirkel\",\"decimal\":\"Tall (1, 2, 3, osv.)\",\"decimalLeadingZero\":\"Tall, med førstesiffer null (01, 02, 03, osv.)\",\"disc\":\"Disk\",\"georgian\":\"Georgisk nummerering (an, ban, gan, osv.)\",\"lowerAlpha\":\"Alfabetisk, små (a, b, c, d, e, osv.)\",\"lowerGreek\":\"Gresk, små (alpha, beta, gamma, osv.)\",\"lowerRoman\":\"Romertall, små (i, ii, iii, iv, v, osv.)\",\"none\":\"Ingen\",\"notset\":\"<ikke satt>\",\"numberedTitle\":\"Egenskaper for nummerert liste\",\"square\":\"Firkant\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Alfabetisk, store (A, B, C, D, E, osv.)\",\"upperRoman\":\"Romertall, store (I, II, III, IV, V, osv.)\",\"validateStartNumber\":\"Starten på listen må være et heltall.\"},\"magicline\":{\"title\":\"Sett inn nytt avsnitt her\"},\"maximize\":{\"maximize\":\"Maksimer\",\"minimize\":\"Minimer\"},\"newpage\":{\"toolbar\":\"Ny side\"},\"pagebreak\":{\"alt\":\"Sideskift\",\"toolbar\":\"Sett inn sideskift for utskrift\"},\"pastetext\":{\"button\":\"Lim inn som ren tekst\",\"title\":\"Lim inn som ren tekst\"},\"pastefromword\":{\"confirmCleanup\":\"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?\",\"error\":\"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil\",\"title\":\"Lim inn fra Word\",\"toolbar\":\"Lim inn fra Word\"},\"preview\":{\"preview\":\"Forhåndsvis\"},\"print\":{\"toolbar\":\"Skriv ut\"},\"removeformat\":{\"toolbar\":\"Fjern formatering\"},\"save\":{\"toolbar\":\"Lagre\"},\"selectall\":{\"toolbar\":\"Merk alt\"},\"showblocks\":{\"toolbar\":\"Vis blokker\"},\"sourcearea\":{\"toolbar\":\"Kilde\"},\"specialchar\":{\"options\":\"Alternativer for spesialtegn\",\"title\":\"Velg spesialtegn\",\"toolbar\":\"Sett inn spesialtegn\"},\"scayt\":{\"btn_about\":\"Om SCAYT\",\"btn_dictionaries\":\"Ordbøker\",\"btn_disable\":\"Slå av SCAYT\",\"btn_enable\":\"Slå på SCAYT\",\"btn_langs\":\"Språk\",\"btn_options\":\"Valg\",\"text_title\":\"Stavekontroll mens du skriver\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Stilformater\",\"panelTitle1\":\"Blokkstiler\",\"panelTitle2\":\"Inlinestiler\",\"panelTitle3\":\"Objektstiler\"},\"table\":{\"border\":\"Rammestørrelse\",\"caption\":\"Tittel\",\"cell\":{\"menu\":\"Celle\",\"insertBefore\":\"Sett inn celle før\",\"insertAfter\":\"Sett inn celle etter\",\"deleteCell\":\"Slett celler\",\"merge\":\"Slå sammen celler\",\"mergeRight\":\"Slå sammen høyre\",\"mergeDown\":\"Slå sammen ned\",\"splitHorizontal\":\"Del celle horisontalt\",\"splitVertical\":\"Del celle vertikalt\",\"title\":\"Celleegenskaper\",\"cellType\":\"Celletype\",\"rowSpan\":\"Radspenn\",\"colSpan\":\"Kolonnespenn\",\"wordWrap\":\"Tekstbrytning\",\"hAlign\":\"Horisontal justering\",\"vAlign\":\"Vertikal justering\",\"alignBaseline\":\"Grunnlinje\",\"bgColor\":\"Bakgrunnsfarge\",\"borderColor\":\"Rammefarge\",\"data\":\"Data\",\"header\":\"Overskrift\",\"yes\":\"Ja\",\"no\":\"Nei\",\"invalidWidth\":\"Cellebredde må være et tall.\",\"invalidHeight\":\"Cellehøyde må være et tall.\",\"invalidRowSpan\":\"Radspenn må være et heltall.\",\"invalidColSpan\":\"Kolonnespenn må være et heltall.\",\"chooseColor\":\"Velg\"},\"cellPad\":\"Cellepolstring\",\"cellSpace\":\"Cellemarg\",\"column\":{\"menu\":\"Kolonne\",\"insertBefore\":\"Sett inn kolonne før\",\"insertAfter\":\"Sett inn kolonne etter\",\"deleteColumn\":\"Slett kolonner\"},\"columns\":\"Kolonner\",\"deleteTable\":\"Slett tabell\",\"headers\":\"Overskrifter\",\"headersBoth\":\"Begge\",\"headersColumn\":\"Første kolonne\",\"headersNone\":\"Ingen\",\"headersRow\":\"Første rad\",\"invalidBorder\":\"Rammestørrelse må være et tall.\",\"invalidCellPadding\":\"Cellepolstring må være et positivt tall.\",\"invalidCellSpacing\":\"Cellemarg må være et positivt tall.\",\"invalidCols\":\"Antall kolonner må være et tall større enn 0.\",\"invalidHeight\":\"Tabellhøyde må være et tall.\",\"invalidRows\":\"Antall rader må være et tall større enn 0.\",\"invalidWidth\":\"Tabellbredde må være et tall.\",\"menu\":\"Egenskaper for tabell\",\"row\":{\"menu\":\"Rader\",\"insertBefore\":\"Sett inn rad før\",\"insertAfter\":\"Sett inn rad etter\",\"deleteRow\":\"Slett rader\"},\"rows\":\"Rader\",\"summary\":\"Sammendrag\",\"title\":\"Egenskaper for tabell\",\"toolbar\":\"Tabell\",\"widthPc\":\"prosent\",\"widthPx\":\"piksler\",\"widthUnit\":\"Bredde-enhet\"},\"undo\":{\"redo\":\"Gjør om\",\"undo\":\"Angre\"},\"wsc\":{\"btnIgnore\":\"Ignorer\",\"btnIgnoreAll\":\"Ignorer alle\",\"btnReplace\":\"Erstatt\",\"btnReplaceAll\":\"Erstatt alle\",\"btnUndo\":\"Angre\",\"changeTo\":\"Endre til\",\"errorLoading\":\"Feil under lasting av applikasjonstjenestetjener: %s.\",\"ieSpellDownload\":\"Stavekontroll er ikke installert. Vil du laste den ned nå?\",\"manyChanges\":\"Stavekontroll fullført: %1 ord endret\",\"noChanges\":\"Stavekontroll fullført: ingen ord endret\",\"noMispell\":\"Stavekontroll fullført: ingen feilstavinger funnet\",\"noSuggestions\":\"- Ingen forslag -\",\"notAvailable\":\"Beklager, tjenesten er utilgjenglig nå.\",\"notInDic\":\"Ikke i ordboken\",\"oneChange\":\"Stavekontroll fullført: Ett ord endret\",\"progress\":\"Stavekontroll pågår...\",\"title\":\"Stavekontroll\",\"toolbar\":\"Stavekontroll\"}};"
  },
  {
    "path": "assets/ckeditor/lang/pl.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['pl']={\"editor\":\"Edytor tekstu sformatowanego\",\"editorPanel\":\"Panel edytora tekstu sformatowanego\",\"common\":{\"editorHelp\":\"W celu uzyskania pomocy naciśnij ALT 0\",\"browseServer\":\"Przeglądaj\",\"url\":\"Adres URL\",\"protocol\":\"Protokół\",\"upload\":\"Wyślij\",\"uploadSubmit\":\"Wyślij\",\"image\":\"Obrazek\",\"flash\":\"Flash\",\"form\":\"Formularz\",\"checkbox\":\"Pole wyboru (checkbox)\",\"radio\":\"Przycisk opcji (radio)\",\"textField\":\"Pole tekstowe\",\"textarea\":\"Obszar tekstowy\",\"hiddenField\":\"Pole ukryte\",\"button\":\"Przycisk\",\"select\":\"Lista wyboru\",\"imageButton\":\"Przycisk graficzny\",\"notSet\":\"<nie ustawiono>\",\"id\":\"Id\",\"name\":\"Nazwa\",\"langDir\":\"Kierunek tekstu\",\"langDirLtr\":\"Od lewej do prawej (LTR)\",\"langDirRtl\":\"Od prawej do lewej (RTL)\",\"langCode\":\"Kod języka\",\"longDescr\":\"Adres URL długiego opisu\",\"cssClass\":\"Nazwa klasy CSS\",\"advisoryTitle\":\"Opis obiektu docelowego\",\"cssStyle\":\"Styl\",\"ok\":\"OK\",\"cancel\":\"Anuluj\",\"close\":\"Zamknij\",\"preview\":\"Podgląd\",\"resize\":\"Przeciągnij, aby zmienić rozmiar\",\"generalTab\":\"Ogólne\",\"advancedTab\":\"Zaawansowane\",\"validateNumberFailed\":\"Ta wartość nie jest liczbą.\",\"confirmNewPage\":\"Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę?\",\"confirmCancel\":\"Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe?\",\"options\":\"Opcje\",\"target\":\"Obiekt docelowy\",\"targetNew\":\"Nowe okno (_blank)\",\"targetTop\":\"Okno najwyżej w hierarchii (_top)\",\"targetSelf\":\"To samo okno (_self)\",\"targetParent\":\"Okno nadrzędne (_parent)\",\"langDirLTR\":\"Od lewej do prawej (LTR)\",\"langDirRTL\":\"Od prawej do lewej (RTL)\",\"styles\":\"Style\",\"cssClasses\":\"Klasy arkusza stylów\",\"width\":\"Szerokość\",\"height\":\"Wysokość\",\"align\":\"Wyrównaj\",\"alignLeft\":\"Do lewej\",\"alignRight\":\"Do prawej\",\"alignCenter\":\"Do środka\",\"alignJustify\":\"Wyjustuj\",\"alignTop\":\"Do góry\",\"alignMiddle\":\"Do środka\",\"alignBottom\":\"Do dołu\",\"alignNone\":\"Brak\",\"invalidValue\":\"Nieprawidłowa wartość.\",\"invalidHeight\":\"Wysokość musi być liczbą.\",\"invalidWidth\":\"Szerokość musi być liczbą.\",\"invalidCssLength\":\"Wartość podana dla pola \\\"%1\\\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).\",\"invalidHtmlLength\":\"Wartość podana dla pola \\\"%1\\\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z HTML (px lub %).\",\"invalidInlineStyle\":\"Wartość podana dla stylu musi składać się z jednej lub większej liczby krotek w formacie \\\"nazwa : wartość\\\", rozdzielonych średnikami.\",\"cssLengthTooltip\":\"Wpisz liczbę dla wartości w pikselach lub liczbę wraz z jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, niedostępne</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Wszelkie prawa zastrzeżone.\",\"dlgTitle\":\"Informacje o programie CKEditor\",\"help\":\"Pomoc znajdziesz w $1.\",\"moreInfo\":\"Informacje na temat licencji można znaleźć na naszej stronie:\",\"title\":\"Informacje o programie CKEditor\",\"userGuide\":\"podręczniku użytkownika programu CKEditor\"},\"basicstyles\":{\"bold\":\"Pogrubienie\",\"italic\":\"Kursywa\",\"strike\":\"Przekreślenie\",\"subscript\":\"Indeks dolny\",\"superscript\":\"Indeks górny\",\"underline\":\"Podkreślenie\"},\"bidi\":{\"ltr\":\"Kierunek tekstu od lewej strony do prawej\",\"rtl\":\"Kierunek tekstu od prawej strony do lewej\"},\"blockquote\":{\"toolbar\":\"Cytat\"},\"clipboard\":{\"copy\":\"Kopiuj\",\"copyError\":\"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.\",\"cut\":\"Wytnij\",\"cutError\":\"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.\",\"paste\":\"Wklej\",\"pasteArea\":\"Obszar wklejania\",\"pasteMsg\":\"Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.\",\"securityMsg\":\"Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.\",\"title\":\"Wklej\"},\"button\":{\"selectedLabel\":\"%1 (Wybrany)\"},\"colorbutton\":{\"auto\":\"Automatycznie\",\"bgColorTitle\":\"Kolor tła\",\"colors\":{\"000\":\"Czarny\",\"800000\":\"Kasztanowy\",\"8B4513\":\"Czekoladowy\",\"2F4F4F\":\"Ciemnografitowy\",\"008080\":\"Morski\",\"000080\":\"Granatowy\",\"4B0082\":\"Indygo\",\"696969\":\"Ciemnoszary\",\"B22222\":\"Czerwień żelazowa\",\"A52A2A\":\"Brązowy\",\"DAA520\":\"Ciemnozłoty\",\"006400\":\"Ciemnozielony\",\"40E0D0\":\"Turkusowy\",\"0000CD\":\"Ciemnoniebieski\",\"800080\":\"Purpurowy\",\"808080\":\"Szary\",\"F00\":\"Czerwony\",\"FF8C00\":\"Ciemnopomarańczowy\",\"FFD700\":\"Złoty\",\"008000\":\"Zielony\",\"0FF\":\"Cyjan\",\"00F\":\"Niebieski\",\"EE82EE\":\"Fioletowy\",\"A9A9A9\":\"Przygaszony szary\",\"FFA07A\":\"Łososiowy\",\"FFA500\":\"Pomarańczowy\",\"FFFF00\":\"Żółty\",\"00FF00\":\"Limonkowy\",\"AFEEEE\":\"Bladoturkusowy\",\"ADD8E6\":\"Jasnoniebieski\",\"DDA0DD\":\"Śliwkowy\",\"D3D3D3\":\"Jasnoszary\",\"FFF0F5\":\"Jasnolawendowy\",\"FAEBD7\":\"Kremowobiały\",\"FFFFE0\":\"Jasnożółty\",\"F0FFF0\":\"Bladozielony\",\"F0FFFF\":\"Jasnolazurowy\",\"F0F8FF\":\"Jasnobłękitny\",\"E6E6FA\":\"Lawendowy\",\"FFF\":\"Biały\"},\"more\":\"Więcej kolorów...\",\"panelTitle\":\"Kolory\",\"textColorTitle\":\"Kolor tekstu\"},\"colordialog\":{\"clear\":\"Wyczyść\",\"highlight\":\"Zaznacz\",\"options\":\"Opcje koloru\",\"selected\":\"Wybrany\",\"title\":\"Wybierz kolor\"},\"templates\":{\"button\":\"Szablony\",\"emptyListMsg\":\"(Brak zdefiniowanych szablonów)\",\"insertOption\":\"Zastąp obecną zawartość\",\"options\":\"Opcje szablonów\",\"selectPromptMsg\":\"Wybierz szablon do otwarcia w edytorze<br>(obecna zawartość okna edytora zostanie utracona):\",\"title\":\"Szablony zawartości\"},\"contextmenu\":{\"options\":\"Opcje menu kontekstowego\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Opis obiektu docelowego\",\"cssClassInputLabel\":\"Klasy arkusza stylów\",\"edit\":\"Edytuj pojemnik Div\",\"inlineStyleInputLabel\":\"Style liniowe\",\"langDirLTRLabel\":\"Od lewej do prawej (LTR)\",\"langDirLabel\":\"Kierunek tekstu\",\"langDirRTLLabel\":\"Od prawej do lewej (RTL)\",\"languageCodeInputLabel\":\"Kod języka\",\"remove\":\"Usuń pojemnik Div\",\"styleSelectLabel\":\"Styl\",\"title\":\"Utwórz pojemnik Div\",\"toolbar\":\"Utwórz pojemnik Div\"},\"toolbar\":{\"toolbarCollapse\":\"Zwiń pasek narzędzi\",\"toolbarExpand\":\"Rozwiń pasek narzędzi\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Schowek/Wstecz\",\"editing\":\"Edycja\",\"forms\":\"Formularze\",\"basicstyles\":\"Style podstawowe\",\"paragraph\":\"Akapit\",\"links\":\"Hiperłącza\",\"insert\":\"Wstawianie\",\"styles\":\"Style\",\"colors\":\"Kolory\",\"tools\":\"Narzędzia\"},\"toolbars\":\"Paski narzędzi edytora\"},\"elementspath\":{\"eleLabel\":\"Ścieżka elementów\",\"eleTitle\":\"element %1\"},\"find\":{\"find\":\"Znajdź\",\"findOptions\":\"Opcje wyszukiwania\",\"findWhat\":\"Znajdź:\",\"matchCase\":\"Uwzględnij wielkość liter\",\"matchCyclic\":\"Cykliczne dopasowanie\",\"matchWord\":\"Całe słowa\",\"notFoundMsg\":\"Nie znaleziono szukanego hasła.\",\"replace\":\"Zamień\",\"replaceAll\":\"Zamień wszystko\",\"replaceSuccessMsg\":\"%1 wystąpień zastąpionych.\",\"replaceWith\":\"Zastąp przez:\",\"title\":\"Znajdź i zamień\"},\"fakeobjects\":{\"anchor\":\"Kotwica\",\"flash\":\"Animacja Flash\",\"hiddenfield\":\"Pole ukryte\",\"iframe\":\"IFrame\",\"unknown\":\"Nieznany obiekt\"},\"flash\":{\"access\":\"Dostęp skryptów\",\"accessAlways\":\"Zawsze\",\"accessNever\":\"Nigdy\",\"accessSameDomain\":\"Ta sama domena\",\"alignAbsBottom\":\"Do dołu\",\"alignAbsMiddle\":\"Do środka w pionie\",\"alignBaseline\":\"Do linii bazowej\",\"alignTextTop\":\"Do góry tekstu\",\"bgcolor\":\"Kolor tła\",\"chkFull\":\"Zezwól na pełny ekran\",\"chkLoop\":\"Pętla\",\"chkMenu\":\"Włącz menu\",\"chkPlay\":\"Autoodtwarzanie\",\"flashvars\":\"Zmienne obiektu Flash\",\"hSpace\":\"Odstęp poziomy\",\"properties\":\"Właściwości obiektu Flash\",\"propertiesTab\":\"Właściwości\",\"quality\":\"Jakość\",\"qualityAutoHigh\":\"Auto wysoka\",\"qualityAutoLow\":\"Auto niska\",\"qualityBest\":\"Najlepsza\",\"qualityHigh\":\"Wysoka\",\"qualityLow\":\"Niska\",\"qualityMedium\":\"Średnia\",\"scale\":\"Skaluj\",\"scaleAll\":\"Pokaż wszystko\",\"scaleFit\":\"Dokładne dopasowanie\",\"scaleNoBorder\":\"Bez obramowania\",\"title\":\"Właściwości obiektu Flash\",\"vSpace\":\"Odstęp pionowy\",\"validateHSpace\":\"Odstęp poziomy musi być liczbą.\",\"validateSrc\":\"Podaj adres URL\",\"validateVSpace\":\"Odstęp pionowy musi być liczbą.\",\"windowMode\":\"Tryb okna\",\"windowModeOpaque\":\"Nieprzezroczyste\",\"windowModeTransparent\":\"Przezroczyste\",\"windowModeWindow\":\"Okno\"},\"font\":{\"fontSize\":{\"label\":\"Rozmiar\",\"voiceLabel\":\"Rozmiar czcionki\",\"panelTitle\":\"Rozmiar\"},\"label\":\"Czcionka\",\"panelTitle\":\"Czcionka\",\"voiceLabel\":\"Czcionka\"},\"forms\":{\"button\":{\"title\":\"Właściwości przycisku\",\"text\":\"Tekst (Wartość)\",\"type\":\"Typ\",\"typeBtn\":\"Przycisk\",\"typeSbm\":\"Wyślij\",\"typeRst\":\"Wyczyść\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Właściwości pola wyboru (checkbox)\",\"radioTitle\":\"Właściwości przycisku opcji (radio)\",\"value\":\"Wartość\",\"selected\":\"Zaznaczone\",\"required\":\"Wymagane\"},\"form\":{\"title\":\"Właściwości formularza\",\"menu\":\"Właściwości formularza\",\"action\":\"Akcja\",\"method\":\"Metoda\",\"encoding\":\"Kodowanie\"},\"hidden\":{\"title\":\"Właściwości pola ukrytego\",\"name\":\"Nazwa\",\"value\":\"Wartość\"},\"select\":{\"title\":\"Właściwości listy wyboru\",\"selectInfo\":\"Informacje\",\"opAvail\":\"Dostępne opcje\",\"value\":\"Wartość\",\"size\":\"Rozmiar\",\"lines\":\"wierszy\",\"chkMulti\":\"Wielokrotny wybór\",\"required\":\"Wymagane\",\"opText\":\"Tekst\",\"opValue\":\"Wartość\",\"btnAdd\":\"Dodaj\",\"btnModify\":\"Zmień\",\"btnUp\":\"Do góry\",\"btnDown\":\"Do dołu\",\"btnSetValue\":\"Ustaw jako zaznaczoną\",\"btnDelete\":\"Usuń\"},\"textarea\":{\"title\":\"Właściwości obszaru tekstowego\",\"cols\":\"Liczba kolumn\",\"rows\":\"Liczba wierszy\"},\"textfield\":{\"title\":\"Właściwości pola tekstowego\",\"name\":\"Nazwa\",\"value\":\"Wartość\",\"charWidth\":\"Szerokość w znakach\",\"maxChars\":\"Szerokość maksymalna\",\"required\":\"Wymagane\",\"type\":\"Typ\",\"typeText\":\"Tekst\",\"typePass\":\"Hasło\",\"typeEmail\":\"Email\",\"typeSearch\":\"Szukaj\",\"typeTel\":\"Numer telefonu\",\"typeUrl\":\"Adres URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format\",\"tag_address\":\"Adres\",\"tag_div\":\"Normalny (DIV)\",\"tag_h1\":\"Nagłówek 1\",\"tag_h2\":\"Nagłówek 2\",\"tag_h3\":\"Nagłówek 3\",\"tag_h4\":\"Nagłówek 4\",\"tag_h5\":\"Nagłówek 5\",\"tag_h6\":\"Nagłówek 6\",\"tag_p\":\"Normalny\",\"tag_pre\":\"Tekst sformatowany\"},\"horizontalrule\":{\"toolbar\":\"Wstaw poziomą linię\"},\"iframe\":{\"border\":\"Pokaż obramowanie obiektu IFrame\",\"noUrl\":\"Podaj adres URL elementu IFrame\",\"scrolling\":\"Włącz paski przewijania\",\"title\":\"Właściwości elementu IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Tekst zastępczy\",\"border\":\"Obramowanie\",\"btnUpload\":\"Wyślij\",\"button2Img\":\"Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?\",\"hSpace\":\"Odstęp poziomy\",\"img2Button\":\"Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?\",\"infoTab\":\"Informacje o obrazku\",\"linkTab\":\"Hiperłącze\",\"lockRatio\":\"Zablokuj proporcje\",\"menu\":\"Właściwości obrazka\",\"resetSize\":\"Przywróć rozmiar\",\"title\":\"Właściwości obrazka\",\"titleButton\":\"Właściwości przycisku graficznego\",\"upload\":\"Wyślij\",\"urlMissing\":\"Podaj adres URL obrazka.\",\"vSpace\":\"Odstęp pionowy\",\"validateBorder\":\"Wartość obramowania musi być liczbą całkowitą.\",\"validateHSpace\":\"Wartość odstępu poziomego musi być liczbą całkowitą.\",\"validateVSpace\":\"Wartość odstępu pionowego musi być liczbą całkowitą.\"},\"indent\":{\"indent\":\"Zwiększ wcięcie\",\"outdent\":\"Zmniejsz wcięcie\"},\"smiley\":{\"options\":\"Opcje emotikonów\",\"title\":\"Wstaw emotikona\",\"toolbar\":\"Emotikony\"},\"justify\":{\"block\":\"Wyjustuj\",\"center\":\"Wyśrodkuj\",\"left\":\"Wyrównaj do lewej\",\"right\":\"Wyrównaj do prawej\"},\"language\":{\"button\":\"Ustaw język\",\"remove\":\"Usuń język\"},\"link\":{\"acccessKey\":\"Klawisz dostępu\",\"advanced\":\"Zaawansowane\",\"advisoryContentType\":\"Typ MIME obiektu docelowego\",\"advisoryTitle\":\"Opis obiektu docelowego\",\"anchor\":{\"toolbar\":\"Wstaw/edytuj kotwicę\",\"menu\":\"Właściwości kotwicy\",\"title\":\"Właściwości kotwicy\",\"name\":\"Nazwa kotwicy\",\"errorName\":\"Wpisz nazwę kotwicy\",\"remove\":\"Usuń kotwicę\"},\"anchorId\":\"Wg identyfikatora\",\"anchorName\":\"Wg nazwy\",\"charset\":\"Kodowanie znaków obiektu docelowego\",\"cssClasses\":\"Nazwa klasy CSS\",\"emailAddress\":\"Adres e-mail\",\"emailBody\":\"Treść\",\"emailSubject\":\"Temat\",\"id\":\"Id\",\"info\":\"Informacje \",\"langCode\":\"Kod języka\",\"langDir\":\"Kierunek tekstu\",\"langDirLTR\":\"Od lewej do prawej (LTR)\",\"langDirRTL\":\"Od prawej do lewej (RTL)\",\"menu\":\"Edytuj odnośnik\",\"name\":\"Nazwa\",\"noAnchors\":\"(W dokumencie nie zdefiniowano żadnych kotwic)\",\"noEmail\":\"Podaj adres e-mail\",\"noUrl\":\"Podaj adres URL\",\"other\":\"<inny>\",\"popupDependent\":\"Okno zależne (Netscape)\",\"popupFeatures\":\"Właściwości wyskakującego okna\",\"popupFullScreen\":\"Pełny ekran (IE)\",\"popupLeft\":\"Pozycja w poziomie\",\"popupLocationBar\":\"Pasek adresu\",\"popupMenuBar\":\"Pasek menu\",\"popupResizable\":\"Skalowalny\",\"popupScrollBars\":\"Paski przewijania\",\"popupStatusBar\":\"Pasek statusu\",\"popupToolbar\":\"Pasek narzędzi\",\"popupTop\":\"Pozycja w pionie\",\"rel\":\"Relacja\",\"selectAnchor\":\"Wybierz kotwicę\",\"styles\":\"Styl\",\"tabIndex\":\"Indeks kolejności\",\"target\":\"Obiekt docelowy\",\"targetFrame\":\"<ramka>\",\"targetFrameName\":\"Nazwa ramki docelowej\",\"targetPopup\":\"<wyskakujące okno>\",\"targetPopupName\":\"Nazwa wyskakującego okna\",\"title\":\"Odnośnik\",\"toAnchor\":\"Odnośnik wewnątrz strony (kotwica)\",\"toEmail\":\"Adres e-mail\",\"toUrl\":\"Adres URL\",\"toolbar\":\"Wstaw/edytuj odnośnik\",\"type\":\"Typ odnośnika\",\"unlink\":\"Usuń odnośnik\",\"upload\":\"Wyślij\"},\"list\":{\"bulletedlist\":\"Lista wypunktowana\",\"numberedlist\":\"Lista numerowana\"},\"liststyle\":{\"armenian\":\"Numerowanie armeńskie\",\"bulletedTitle\":\"Właściwości list wypunktowanych\",\"circle\":\"Koło\",\"decimal\":\"Liczby (1, 2, 3 itd.)\",\"decimalLeadingZero\":\"Liczby z początkowym zerem (01, 02, 03 itd.)\",\"disc\":\"Okrąg\",\"georgian\":\"Numerowanie gruzińskie (an, ban, gan itd.)\",\"lowerAlpha\":\"Małe litery (a, b, c, d, e itd.)\",\"lowerGreek\":\"Małe litery greckie (alpha, beta, gamma itd.)\",\"lowerRoman\":\"Małe cyfry rzymskie (i, ii, iii, iv, v itd.)\",\"none\":\"Brak\",\"notset\":\"<nie ustawiono>\",\"numberedTitle\":\"Właściwości list numerowanych\",\"square\":\"Kwadrat\",\"start\":\"Początek\",\"type\":\"Typ punktora\",\"upperAlpha\":\"Duże litery (A, B, C, D, E itd.)\",\"upperRoman\":\"Duże cyfry rzymskie (I, II, III, IV, V itd.)\",\"validateStartNumber\":\"Listę musi rozpoczynać liczba całkowita.\"},\"magicline\":{\"title\":\"Wstaw nowy akapit\"},\"maximize\":{\"maximize\":\"Maksymalizuj\",\"minimize\":\"Minimalizuj\"},\"newpage\":{\"toolbar\":\"Nowa strona\"},\"pagebreak\":{\"alt\":\"Wstaw podział strony\",\"toolbar\":\"Wstaw podział strony\"},\"pastetext\":{\"button\":\"Wklej jako czysty tekst\",\"title\":\"Wklej jako czysty tekst\"},\"pastefromword\":{\"confirmCleanup\":\"Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?\",\"error\":\"Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.\",\"title\":\"Wklej z programu MS Word\",\"toolbar\":\"Wklej z programu MS Word\"},\"preview\":{\"preview\":\"Podgląd\"},\"print\":{\"toolbar\":\"Drukuj\"},\"removeformat\":{\"toolbar\":\"Usuń formatowanie\"},\"save\":{\"toolbar\":\"Zapisz\"},\"selectall\":{\"toolbar\":\"Zaznacz wszystko\"},\"showblocks\":{\"toolbar\":\"Pokaż bloki\"},\"sourcearea\":{\"toolbar\":\"Źródło dokumentu\"},\"specialchar\":{\"options\":\"Opcje znaków specjalnych\",\"title\":\"Wybierz znak specjalny\",\"toolbar\":\"Wstaw znak specjalny\"},\"scayt\":{\"btn_about\":\"Informacje o SCAYT\",\"btn_dictionaries\":\"Słowniki\",\"btn_disable\":\"Wyłącz SCAYT\",\"btn_enable\":\"Włącz SCAYT\",\"btn_langs\":\"Języki\",\"btn_options\":\"Opcje\",\"text_title\":\"Sprawdź pisownię podczas pisania (SCAYT)\"},\"stylescombo\":{\"label\":\"Styl\",\"panelTitle\":\"Style formatujące\",\"panelTitle1\":\"Style blokowe\",\"panelTitle2\":\"Style liniowe\",\"panelTitle3\":\"Style obiektowe\"},\"table\":{\"border\":\"Grubość obramowania\",\"caption\":\"Tytuł\",\"cell\":{\"menu\":\"Komórka\",\"insertBefore\":\"Wstaw komórkę z lewej\",\"insertAfter\":\"Wstaw komórkę z prawej\",\"deleteCell\":\"Usuń komórki\",\"merge\":\"Połącz komórki\",\"mergeRight\":\"Połącz z komórką z prawej\",\"mergeDown\":\"Połącz z komórką poniżej\",\"splitHorizontal\":\"Podziel komórkę poziomo\",\"splitVertical\":\"Podziel komórkę pionowo\",\"title\":\"Właściwości komórki\",\"cellType\":\"Typ komórki\",\"rowSpan\":\"Scalenie wierszy\",\"colSpan\":\"Scalenie komórek\",\"wordWrap\":\"Zawijanie słów\",\"hAlign\":\"Wyrównanie poziome\",\"vAlign\":\"Wyrównanie pionowe\",\"alignBaseline\":\"Linia bazowa\",\"bgColor\":\"Kolor tła\",\"borderColor\":\"Kolor obramowania\",\"data\":\"Dane\",\"header\":\"Nagłówek\",\"yes\":\"Tak\",\"no\":\"Nie\",\"invalidWidth\":\"Szerokość komórki musi być liczbą.\",\"invalidHeight\":\"Wysokość komórki musi być liczbą.\",\"invalidRowSpan\":\"Scalenie wierszy musi być liczbą całkowitą.\",\"invalidColSpan\":\"Scalenie komórek musi być liczbą całkowitą.\",\"chooseColor\":\"Wybierz\"},\"cellPad\":\"Dopełnienie komórek\",\"cellSpace\":\"Odstęp pomiędzy komórkami\",\"column\":{\"menu\":\"Kolumna\",\"insertBefore\":\"Wstaw kolumnę z lewej\",\"insertAfter\":\"Wstaw kolumnę z prawej\",\"deleteColumn\":\"Usuń kolumny\"},\"columns\":\"Liczba kolumn\",\"deleteTable\":\"Usuń tabelę\",\"headers\":\"Nagłówki\",\"headersBoth\":\"Oba\",\"headersColumn\":\"Pierwsza kolumna\",\"headersNone\":\"Brak\",\"headersRow\":\"Pierwszy wiersz\",\"invalidBorder\":\"Wartość obramowania musi być liczbą.\",\"invalidCellPadding\":\"Dopełnienie komórek musi być liczbą dodatnią.\",\"invalidCellSpacing\":\"Odstęp pomiędzy komórkami musi być liczbą dodatnią.\",\"invalidCols\":\"Liczba kolumn musi być większa niż 0.\",\"invalidHeight\":\"Wysokość tabeli musi być liczbą.\",\"invalidRows\":\"Liczba wierszy musi być większa niż 0.\",\"invalidWidth\":\"Szerokość tabeli musi być liczbą.\",\"menu\":\"Właściwości tabeli\",\"row\":{\"menu\":\"Wiersz\",\"insertBefore\":\"Wstaw wiersz powyżej\",\"insertAfter\":\"Wstaw wiersz poniżej\",\"deleteRow\":\"Usuń wiersze\"},\"rows\":\"Liczba wierszy\",\"summary\":\"Podsumowanie\",\"title\":\"Właściwości tabeli\",\"toolbar\":\"Tabela\",\"widthPc\":\"%\",\"widthPx\":\"piksele\",\"widthUnit\":\"jednostka szerokości\"},\"undo\":{\"redo\":\"Ponów\",\"undo\":\"Cofnij\"},\"wsc\":{\"btnIgnore\":\"Ignoruj\",\"btnIgnoreAll\":\"Ignoruj wszystkie\",\"btnReplace\":\"Zmień\",\"btnReplaceAll\":\"Zmień wszystkie\",\"btnUndo\":\"Cofnij\",\"changeTo\":\"Zmień na\",\"errorLoading\":\"Błąd wczytywania hosta aplikacji usługi: %s.\",\"ieSpellDownload\":\"Słownik nie jest zainstalowany. Czy chcesz go pobrać?\",\"manyChanges\":\"Sprawdzanie zakończone: zmieniono %l słów\",\"noChanges\":\"Sprawdzanie zakończone: nie zmieniono żadnego słowa\",\"noMispell\":\"Sprawdzanie zakończone: nie znaleziono błędów\",\"noSuggestions\":\"- Brak sugestii -\",\"notAvailable\":\"Przepraszamy, ale usługa jest obecnie niedostępna.\",\"notInDic\":\"Słowa nie ma w słowniku\",\"oneChange\":\"Sprawdzanie zakończone: zmieniono jedno słowo\",\"progress\":\"Trwa sprawdzanie...\",\"title\":\"Sprawdź pisownię\",\"toolbar\":\"Sprawdź pisownię\"}};"
  },
  {
    "path": "assets/ckeditor/lang/pt-br.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['pt-br']={\"editor\":\"Editor de Rich Text\",\"editorPanel\":\"Painel do editor de Rich Text\",\"common\":{\"editorHelp\":\"Pressione ALT+0 para ajuda\",\"browseServer\":\"Localizar no Servidor\",\"url\":\"URL\",\"protocol\":\"Protocolo\",\"upload\":\"Enviar ao Servidor\",\"uploadSubmit\":\"Enviar para o Servidor\",\"image\":\"Imagem\",\"flash\":\"Flash\",\"form\":\"Formulário\",\"checkbox\":\"Caixa de Seleção\",\"radio\":\"Botão de Opção\",\"textField\":\"Caixa de Texto\",\"textarea\":\"Área de Texto\",\"hiddenField\":\"Campo Oculto\",\"button\":\"Botão\",\"select\":\"Caixa de Listagem\",\"imageButton\":\"Botão de Imagem\",\"notSet\":\"<não ajustado>\",\"id\":\"Id\",\"name\":\"Nome\",\"langDir\":\"Direção do idioma\",\"langDirLtr\":\"Esquerda para Direita (LTR)\",\"langDirRtl\":\"Direita para Esquerda (RTL)\",\"langCode\":\"Idioma\",\"longDescr\":\"Descrição da URL\",\"cssClass\":\"Classe de CSS\",\"advisoryTitle\":\"Título\",\"cssStyle\":\"Estilos\",\"ok\":\"OK\",\"cancel\":\"Cancelar\",\"close\":\"Fechar\",\"preview\":\"Visualizar\",\"resize\":\"Arraste para redimensionar\",\"generalTab\":\"Geral\",\"advancedTab\":\"Avançado\",\"validateNumberFailed\":\"Este valor não é um número.\",\"confirmNewPage\":\"Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?\",\"confirmCancel\":\"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?\",\"options\":\"Opções\",\"target\":\"Destino\",\"targetNew\":\"Nova Janela (_blank)\",\"targetTop\":\"Janela de Cima (_top)\",\"targetSelf\":\"Mesma Janela (_self)\",\"targetParent\":\"Janela Pai (_parent)\",\"langDirLTR\":\"Esquerda para Direita (LTR)\",\"langDirRTL\":\"Direita para Esquerda (RTL)\",\"styles\":\"Estilo\",\"cssClasses\":\"Classes\",\"width\":\"Largura\",\"height\":\"Altura\",\"align\":\"Alinhamento\",\"alignLeft\":\"Esquerda\",\"alignRight\":\"Direita\",\"alignCenter\":\"Centralizado\",\"alignJustify\":\"Justificar\",\"alignTop\":\"Superior\",\"alignMiddle\":\"Centralizado\",\"alignBottom\":\"Inferior\",\"alignNone\":\"Nenhum\",\"invalidValue\":\"Valor inválido.\",\"invalidHeight\":\"A altura tem que ser um número\",\"invalidWidth\":\"A largura tem que ser um número.\",\"invalidCssLength\":\"O valor do campo \\\"%1\\\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).\",\"invalidHtmlLength\":\"O valor do campo \\\"%1\\\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px ou %).\",\"invalidInlineStyle\":\"O valor válido para estilo deve conter uma ou mais tuplas no formato \\\"nome : valor\\\", separados por ponto e vírgula.\",\"cssLengthTooltip\":\"Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, indisponível</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Todos os direitos reservados.\",\"dlgTitle\":\"Sobre o CKEditor\",\"help\":\"Verifique o $1 para obter ajuda.\",\"moreInfo\":\"Para informações sobre a licença por favor visite o nosso site:\",\"title\":\"Sobre o CKEditor\",\"userGuide\":\"Guia do Usuário do CKEditor\"},\"basicstyles\":{\"bold\":\"Negrito\",\"italic\":\"Itálico\",\"strike\":\"Tachado\",\"subscript\":\"Subscrito\",\"superscript\":\"Sobrescrito\",\"underline\":\"Sublinhado\"},\"bidi\":{\"ltr\":\"Direção do texto da esquerda para a direita\",\"rtl\":\"Direção do texto da direita para a esquerda\"},\"blockquote\":{\"toolbar\":\"Citação\"},\"clipboard\":{\"copy\":\"Copiar\",\"copyError\":\"As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).\",\"cut\":\"Recortar\",\"cutError\":\"As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).\",\"paste\":\"Colar\",\"pasteArea\":\"Área para Colar\",\"pasteMsg\":\"Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.\",\"securityMsg\":\"As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.\",\"title\":\"Colar\"},\"button\":{\"selectedLabel\":\"%1 (Selecionado)\"},\"colorbutton\":{\"auto\":\"Automático\",\"bgColorTitle\":\"Cor do Plano de Fundo\",\"colors\":{\"000\":\"Preto\",\"800000\":\"Foquete\",\"8B4513\":\"Marrom 1\",\"2F4F4F\":\"Cinza 1\",\"008080\":\"Cerceta\",\"000080\":\"Azul Marinho\",\"4B0082\":\"Índigo\",\"696969\":\"Cinza 2\",\"B22222\":\"Tijolo de Fogo\",\"A52A2A\":\"Marrom 2\",\"DAA520\":\"Vara Dourada\",\"006400\":\"Verde Escuro\",\"40E0D0\":\"Turquesa\",\"0000CD\":\"Azul Médio\",\"800080\":\"Roxo\",\"808080\":\"Cinza 3\",\"F00\":\"Vermelho\",\"FF8C00\":\"Laranja Escuro\",\"FFD700\":\"Dourado\",\"008000\":\"Verde\",\"0FF\":\"Ciano\",\"00F\":\"Azul\",\"EE82EE\":\"Violeta\",\"A9A9A9\":\"Cinza Escuro\",\"FFA07A\":\"Salmão Claro\",\"FFA500\":\"Laranja\",\"FFFF00\":\"Amarelo\",\"00FF00\":\"Lima\",\"AFEEEE\":\"Turquesa Pálido\",\"ADD8E6\":\"Azul Claro\",\"DDA0DD\":\"Ameixa\",\"D3D3D3\":\"Cinza Claro\",\"FFF0F5\":\"Lavanda 1\",\"FAEBD7\":\"Branco Antiguidade\",\"FFFFE0\":\"Amarelo Claro\",\"F0FFF0\":\"Orvalho\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Azul Alice\",\"E6E6FA\":\"Lavanda 2\",\"FFF\":\"Branco\"},\"more\":\"Mais Cores...\",\"panelTitle\":\"Cores\",\"textColorTitle\":\"Cor do Texto\"},\"colordialog\":{\"clear\":\"Limpar\",\"highlight\":\"Grifar\",\"options\":\"Opções de Cor\",\"selected\":\"Cor Selecionada\",\"title\":\"Selecione uma Cor\"},\"templates\":{\"button\":\"Modelos de layout\",\"emptyListMsg\":\"(Não foram definidos modelos de layout)\",\"insertOption\":\"Substituir o conteúdo atual\",\"options\":\"Opções de Template\",\"selectPromptMsg\":\"Selecione um modelo de layout para ser aberto no editor<br>(o conteúdo atual será perdido):\",\"title\":\"Modelo de layout de conteúdo\"},\"contextmenu\":{\"options\":\"Opções Menu de Contexto\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Título Consulta\",\"cssClassInputLabel\":\"Classes de CSS\",\"edit\":\"Editar Div\",\"inlineStyleInputLabel\":\"Estilo Inline\",\"langDirLTRLabel\":\"Esquerda para Direita (LTR)\",\"langDirLabel\":\"Direção da Escrita\",\"langDirRTLLabel\":\"Direita para Esquerda (RTL)\",\"languageCodeInputLabel\":\"Código de Idioma\",\"remove\":\"Remover Div\",\"styleSelectLabel\":\"Estilo\",\"title\":\"Criar Container de DIV\",\"toolbar\":\"Criar Container de DIV\"},\"toolbar\":{\"toolbarCollapse\":\"Diminuir Barra de Ferramentas\",\"toolbarExpand\":\"Aumentar Barra de Ferramentas\",\"toolbarGroups\":{\"document\":\"Documento\",\"clipboard\":\"Clipboard/Desfazer\",\"editing\":\"Edição\",\"forms\":\"Formulários\",\"basicstyles\":\"Estilos Básicos\",\"paragraph\":\"Paragrafo\",\"links\":\"Links\",\"insert\":\"Inserir\",\"styles\":\"Estilos\",\"colors\":\"Cores\",\"tools\":\"Ferramentas\"},\"toolbars\":\"Barra de Ferramentas do Editor\"},\"elementspath\":{\"eleLabel\":\"Caminho dos Elementos\",\"eleTitle\":\"Elemento %1\"},\"find\":{\"find\":\"Localizar\",\"findOptions\":\"Opções\",\"findWhat\":\"Procurar por:\",\"matchCase\":\"Coincidir Maiúsculas/Minúsculas\",\"matchCyclic\":\"Coincidir cíclico\",\"matchWord\":\"Coincidir a palavra inteira\",\"notFoundMsg\":\"O texto especificado não foi encontrado.\",\"replace\":\"Substituir\",\"replaceAll\":\"Substituir Tudo\",\"replaceSuccessMsg\":\"%1 ocorrência(s) substituída(s).\",\"replaceWith\":\"Substituir por:\",\"title\":\"Localizar e Substituir\"},\"fakeobjects\":{\"anchor\":\"Âncora\",\"flash\":\"Animação em Flash\",\"hiddenfield\":\"Campo Oculto\",\"iframe\":\"IFrame\",\"unknown\":\"Objeto desconhecido\"},\"flash\":{\"access\":\"Acesso ao script\",\"accessAlways\":\"Sempre\",\"accessNever\":\"Nunca\",\"accessSameDomain\":\"Acessar Mesmo Domínio\",\"alignAbsBottom\":\"Inferior Absoluto\",\"alignAbsMiddle\":\"Centralizado Absoluto\",\"alignBaseline\":\"Baseline\",\"alignTextTop\":\"Superior Absoluto\",\"bgcolor\":\"Cor do Plano de Fundo\",\"chkFull\":\"Permitir tela cheia\",\"chkLoop\":\"Tocar Infinitamente\",\"chkMenu\":\"Habilita Menu Flash\",\"chkPlay\":\"Tocar Automaticamente\",\"flashvars\":\"Variáveis do Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Propriedades do Flash\",\"propertiesTab\":\"Propriedades\",\"quality\":\"Qualidade\",\"qualityAutoHigh\":\"Qualidade Alta Automática\",\"qualityAutoLow\":\"Qualidade Baixa Automática\",\"qualityBest\":\"Qualidade Melhor\",\"qualityHigh\":\"Qualidade Alta\",\"qualityLow\":\"Qualidade Baixa\",\"qualityMedium\":\"Qualidade Média\",\"scale\":\"Escala\",\"scaleAll\":\"Mostrar tudo\",\"scaleFit\":\"Escala Exata\",\"scaleNoBorder\":\"Sem Borda\",\"title\":\"Propriedades do Flash\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"O HSpace tem que ser um número\",\"validateSrc\":\"Por favor, digite o endereço do link\",\"validateVSpace\":\"O VSpace tem que ser um número.\",\"windowMode\":\"Modo da janela\",\"windowModeOpaque\":\"Opaca\",\"windowModeTransparent\":\"Transparente\",\"windowModeWindow\":\"Janela\"},\"font\":{\"fontSize\":{\"label\":\"Tamanho\",\"voiceLabel\":\"Tamanho da fonte\",\"panelTitle\":\"Tamanho\"},\"label\":\"Fonte\",\"panelTitle\":\"Fonte\",\"voiceLabel\":\"Fonte\"},\"forms\":{\"button\":{\"title\":\"Formatar Botão\",\"text\":\"Texto (Valor)\",\"type\":\"Tipo\",\"typeBtn\":\"Botão\",\"typeSbm\":\"Enviar\",\"typeRst\":\"Limpar\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Formatar Caixa de Seleção\",\"radioTitle\":\"Formatar Botão de Opção\",\"value\":\"Valor\",\"selected\":\"Selecionado\",\"required\":\"Obrigatório\"},\"form\":{\"title\":\"Formatar Formulário\",\"menu\":\"Formatar Formulário\",\"action\":\"Ação\",\"method\":\"Método\",\"encoding\":\"Codificação\"},\"hidden\":{\"title\":\"Formatar Campo Oculto\",\"name\":\"Nome\",\"value\":\"Valor\"},\"select\":{\"title\":\"Formatar Caixa de Listagem\",\"selectInfo\":\"Informações\",\"opAvail\":\"Opções disponíveis\",\"value\":\"Valor\",\"size\":\"Tamanho\",\"lines\":\"linhas\",\"chkMulti\":\"Permitir múltiplas seleções\",\"required\":\"Obrigatório\",\"opText\":\"Texto\",\"opValue\":\"Valor\",\"btnAdd\":\"Adicionar\",\"btnModify\":\"Modificar\",\"btnUp\":\"Para cima\",\"btnDown\":\"Para baixo\",\"btnSetValue\":\"Definir como selecionado\",\"btnDelete\":\"Remover\"},\"textarea\":{\"title\":\"Formatar Área de Texto\",\"cols\":\"Colunas\",\"rows\":\"Linhas\"},\"textfield\":{\"title\":\"Formatar Caixa de Texto\",\"name\":\"Nome\",\"value\":\"Valor\",\"charWidth\":\"Comprimento (em caracteres)\",\"maxChars\":\"Número Máximo de Caracteres\",\"required\":\"Obrigatório\",\"type\":\"Tipo\",\"typeText\":\"Texto\",\"typePass\":\"Senha\",\"typeEmail\":\"Email\",\"typeSearch\":\"Busca\",\"typeTel\":\"Número de Telefone\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formatação\",\"panelTitle\":\"Formatação\",\"tag_address\":\"Endereço\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Título 1\",\"tag_h2\":\"Título 2\",\"tag_h3\":\"Título 3\",\"tag_h4\":\"Título 4\",\"tag_h5\":\"Título 5\",\"tag_h6\":\"Título 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatado\"},\"horizontalrule\":{\"toolbar\":\"Inserir Linha Horizontal\"},\"iframe\":{\"border\":\"Mostra borda do iframe\",\"noUrl\":\"Insira a URL do iframe\",\"scrolling\":\"Abilita scrollbars\",\"title\":\"Propriedade do IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Texto Alternativo\",\"border\":\"Borda\",\"btnUpload\":\"Enviar para o Servidor\",\"button2Img\":\"Deseja transformar o botão de imagem em uma imagem comum?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Deseja transformar a imagem em um botão de imagem?\",\"infoTab\":\"Informações da Imagem\",\"linkTab\":\"Link\",\"lockRatio\":\"Travar Proporções\",\"menu\":\"Formatar Imagem\",\"resetSize\":\"Redefinir para o Tamanho Original\",\"title\":\"Formatar Imagem\",\"titleButton\":\"Formatar Botão de Imagem\",\"upload\":\"Enviar\",\"urlMissing\":\"URL da imagem está faltando.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"A borda deve ser um número inteiro.\",\"validateHSpace\":\"O HSpace deve ser um número inteiro.\",\"validateVSpace\":\"O VSpace deve ser um número inteiro.\"},\"indent\":{\"indent\":\"Aumentar Recuo\",\"outdent\":\"Diminuir Recuo\"},\"smiley\":{\"options\":\"Opções de Emoticons\",\"title\":\"Inserir Emoticon\",\"toolbar\":\"Emoticon\"},\"justify\":{\"block\":\"Justificado\",\"center\":\"Centralizar\",\"left\":\"Alinhar Esquerda\",\"right\":\"Alinhar Direita\"},\"language\":{\"button\":\"Configure o Idioma\",\"remove\":\"Remover Idioma\"},\"link\":{\"acccessKey\":\"Chave de Acesso\",\"advanced\":\"Avançado\",\"advisoryContentType\":\"Tipo de Conteúdo\",\"advisoryTitle\":\"Título\",\"anchor\":{\"toolbar\":\"Inserir/Editar Âncora\",\"menu\":\"Formatar Âncora\",\"title\":\"Formatar Âncora\",\"name\":\"Nome da Âncora\",\"errorName\":\"Por favor, digite o nome da âncora\",\"remove\":\"Remover Âncora\"},\"anchorId\":\"Id da âncora\",\"anchorName\":\"Nome da âncora\",\"charset\":\"Charset do Link\",\"cssClasses\":\"Classe de CSS\",\"emailAddress\":\"Endereço E-Mail\",\"emailBody\":\"Corpo da Mensagem\",\"emailSubject\":\"Assunto da Mensagem\",\"id\":\"Id\",\"info\":\"Informações\",\"langCode\":\"Direção do idioma\",\"langDir\":\"Direção do idioma\",\"langDirLTR\":\"Esquerda para Direita (LTR)\",\"langDirRTL\":\"Direita para Esquerda (RTL)\",\"menu\":\"Editar Link\",\"name\":\"Nome\",\"noAnchors\":\"(Não há âncoras no documento)\",\"noEmail\":\"Por favor, digite o endereço de e-mail\",\"noUrl\":\"Por favor, digite o endereço do Link\",\"other\":\"<outro>\",\"popupDependent\":\"Dependente (Netscape)\",\"popupFeatures\":\"Propriedades da Janela Pop-up\",\"popupFullScreen\":\"Modo Tela Cheia (IE)\",\"popupLeft\":\"Esquerda\",\"popupLocationBar\":\"Barra de Endereços\",\"popupMenuBar\":\"Barra de Menus\",\"popupResizable\":\"Redimensionável\",\"popupScrollBars\":\"Barras de Rolagem\",\"popupStatusBar\":\"Barra de Status\",\"popupToolbar\":\"Barra de Ferramentas\",\"popupTop\":\"Topo\",\"rel\":\"Tipo de Relação\",\"selectAnchor\":\"Selecione uma âncora\",\"styles\":\"Estilos\",\"tabIndex\":\"Índice de Tabulação\",\"target\":\"Destino\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Nome do Frame de Destino\",\"targetPopup\":\"<janela popup>\",\"targetPopupName\":\"Nome da Janela Pop-up\",\"title\":\"Editar Link\",\"toAnchor\":\"Âncora nesta página\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Inserir/Editar Link\",\"type\":\"Tipo de hiperlink\",\"unlink\":\"Remover Link\",\"upload\":\"Enviar ao Servidor\"},\"list\":{\"bulletedlist\":\"Lista sem números\",\"numberedlist\":\"Lista numerada\"},\"liststyle\":{\"armenian\":\"Numeração Armêna\",\"bulletedTitle\":\"Propriedades da Lista sem Numeros\",\"circle\":\"Círculo\",\"decimal\":\"Numeração Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Numeração Decimal com zeros (01, 02, 03, etc.)\",\"disc\":\"Disco\",\"georgian\":\"Numeração da Geórgia (an, ban, gan, etc.)\",\"lowerAlpha\":\"Numeração Alfabética minúscula (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Numeração Grega minúscula (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Numeração Romana minúscula (i, ii, iii, iv, v, etc.)\",\"none\":\"Nenhum\",\"notset\":\"<não definido>\",\"numberedTitle\":\"Propriedades da Lista Numerada\",\"square\":\"Quadrado\",\"start\":\"Início\",\"type\":\"Tipo\",\"upperAlpha\":\"Numeração Alfabética Maiúscula (A, B, C, D, E, etc.)\",\"upperRoman\":\"Numeração Romana maiúscula (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"O número inicial da lista deve ser um número inteiro.\"},\"magicline\":{\"title\":\"Insera um parágrafo aqui\"},\"maximize\":{\"maximize\":\"Maximizar\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"Novo\"},\"pagebreak\":{\"alt\":\"Quebra de Página\",\"toolbar\":\"Inserir Quebra de Página\"},\"pastetext\":{\"button\":\"Colar como Texto sem Formatação\",\"title\":\"Colar como Texto sem Formatação\"},\"pastefromword\":{\"confirmCleanup\":\"O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?\",\"error\":\"Não foi possível limpar os dados colados devido a um erro interno\",\"title\":\"Colar do Word\",\"toolbar\":\"Colar do Word\"},\"preview\":{\"preview\":\"Visualizar\"},\"print\":{\"toolbar\":\"Imprimir\"},\"removeformat\":{\"toolbar\":\"Remover Formatação\"},\"save\":{\"toolbar\":\"Salvar\"},\"selectall\":{\"toolbar\":\"Selecionar Tudo\"},\"showblocks\":{\"toolbar\":\"Mostrar blocos de código\"},\"sourcearea\":{\"toolbar\":\"Código-Fonte\"},\"specialchar\":{\"options\":\"Opções de Caractere Especial\",\"title\":\"Selecione um Caractere Especial\",\"toolbar\":\"Inserir Caractere Especial\"},\"scayt\":{\"btn_about\":\"Sobre a correção ortográfica durante a digitação\",\"btn_dictionaries\":\"Dicionários\",\"btn_disable\":\"Desabilitar correção ortográfica durante a digitação\",\"btn_enable\":\"Habilitar correção ortográfica durante a digitação\",\"btn_langs\":\"Idiomas\",\"btn_options\":\"Opções\",\"text_title\":\"Correção ortográfica durante a digitação\"},\"stylescombo\":{\"label\":\"Estilo\",\"panelTitle\":\"Estilos de Formatação\",\"panelTitle1\":\"Estilos de bloco\",\"panelTitle2\":\"Estilos de texto corrido\",\"panelTitle3\":\"Estilos de objeto\"},\"table\":{\"border\":\"Borda\",\"caption\":\"Legenda\",\"cell\":{\"menu\":\"Célula\",\"insertBefore\":\"Inserir célula a esquerda\",\"insertAfter\":\"Inserir célula a direita\",\"deleteCell\":\"Remover Células\",\"merge\":\"Mesclar Células\",\"mergeRight\":\"Mesclar com célula a direita\",\"mergeDown\":\"Mesclar com célula abaixo\",\"splitHorizontal\":\"Dividir célula horizontalmente\",\"splitVertical\":\"Dividir célula verticalmente\",\"title\":\"Propriedades da célula\",\"cellType\":\"Tipo de célula\",\"rowSpan\":\"Linhas cobertas\",\"colSpan\":\"Colunas cobertas\",\"wordWrap\":\"Quebra de palavra\",\"hAlign\":\"Alinhamento horizontal\",\"vAlign\":\"Alinhamento vertical\",\"alignBaseline\":\"Patamar de alinhamento\",\"bgColor\":\"Cor de fundo\",\"borderColor\":\"Cor das bordas\",\"data\":\"Dados\",\"header\":\"Cabeçalho\",\"yes\":\"Sim\",\"no\":\"Não\",\"invalidWidth\":\"A largura da célula tem que ser um número.\",\"invalidHeight\":\"A altura da célula tem que ser um número.\",\"invalidRowSpan\":\"Linhas cobertas tem que ser um número inteiro.\",\"invalidColSpan\":\"Colunas cobertas tem que ser um número inteiro.\",\"chooseColor\":\"Escolher\"},\"cellPad\":\"Margem interna\",\"cellSpace\":\"Espaçamento\",\"column\":{\"menu\":\"Coluna\",\"insertBefore\":\"Inserir coluna a esquerda\",\"insertAfter\":\"Inserir coluna a direita\",\"deleteColumn\":\"Remover Colunas\"},\"columns\":\"Colunas\",\"deleteTable\":\"Apagar Tabela\",\"headers\":\"Cabeçalho\",\"headersBoth\":\"Ambos\",\"headersColumn\":\"Primeira coluna\",\"headersNone\":\"Nenhum\",\"headersRow\":\"Primeira linha\",\"invalidBorder\":\"O tamanho da borda tem que ser um número.\",\"invalidCellPadding\":\"A margem interna das células tem que ser um número.\",\"invalidCellSpacing\":\"O espaçamento das células tem que ser um número.\",\"invalidCols\":\"O número de colunas tem que ser um número maior que 0.\",\"invalidHeight\":\"A altura da tabela tem que ser um número.\",\"invalidRows\":\"O número de linhas tem que ser um número maior que 0.\",\"invalidWidth\":\"A largura da tabela tem que ser um número.\",\"menu\":\"Formatar Tabela\",\"row\":{\"menu\":\"Linha\",\"insertBefore\":\"Inserir linha acima\",\"insertAfter\":\"Inserir linha abaixo\",\"deleteRow\":\"Remover Linhas\"},\"rows\":\"Linhas\",\"summary\":\"Resumo\",\"title\":\"Formatar Tabela\",\"toolbar\":\"Tabela\",\"widthPc\":\"%\",\"widthPx\":\"pixels\",\"widthUnit\":\"unidade largura\"},\"undo\":{\"redo\":\"Refazer\",\"undo\":\"Desfazer\"},\"wsc\":{\"btnIgnore\":\"Ignorar uma vez\",\"btnIgnoreAll\":\"Ignorar Todas\",\"btnReplace\":\"Alterar\",\"btnReplaceAll\":\"Alterar Todas\",\"btnUndo\":\"Desfazer\",\"changeTo\":\"Alterar para\",\"errorLoading\":\"Erro carregando servidor de aplicação: %s.\",\"ieSpellDownload\":\"A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?\",\"manyChanges\":\"Verificação ortográfica encerrada: %1 palavras foram alteradas\",\"noChanges\":\"Verificação ortográfica encerrada: Não houve alterações\",\"noMispell\":\"Verificação encerrada: Não foram encontrados erros de ortografia\",\"noSuggestions\":\"-sem sugestões de ortografia-\",\"notAvailable\":\"Desculpe, o serviço não está disponível no momento.\",\"notInDic\":\"Não encontrada\",\"oneChange\":\"Verificação ortográfica encerrada: Uma palavra foi alterada\",\"progress\":\"Verificação ortográfica em andamento...\",\"title\":\"Corretor Ortográfico\",\"toolbar\":\"Verificar Ortografia\"}};"
  },
  {
    "path": "assets/ckeditor/lang/pt.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['pt']={\"editor\":\"Editor de texto enriquecido\",\"editorPanel\":\"Painel do editor de texto enriquecido\",\"common\":{\"editorHelp\":\"Pressione ALT+0 para ajuda\",\"browseServer\":\"Navegar no servidor\",\"url\":\"URL\",\"protocol\":\"Protocolo\",\"upload\":\"Enviar\",\"uploadSubmit\":\"Enviar para o servidor\",\"image\":\"Imagem\",\"flash\":\"Flash\",\"form\":\"Formulário\",\"checkbox\":\"Caixa de Seleção\",\"radio\":\"Botão\",\"textField\":\"Campo do Texto\",\"textarea\":\"Área do Texto\",\"hiddenField\":\"Campo oculto\",\"button\":\"Botão\",\"select\":\"Campo da Seleção\",\"imageButton\":\"Botão da Imagem\",\"notSet\":\"<Não definido>\",\"id\":\"Id.\",\"name\":\"Nome\",\"langDir\":\"Direção do Idioma\",\"langDirLtr\":\"Esquerda para a Direita (EPD)\",\"langDirRtl\":\"Direita para a Esquerda (DPE)\",\"langCode\":\"Código do Idioma\",\"longDescr\":\"Descrição Completa do URL\",\"cssClass\":\"Classes de Estilo das Folhas\",\"advisoryTitle\":\"Título Consultivo\",\"cssStyle\":\"Estilo\",\"ok\":\"CONFIRMAR\",\"cancel\":\"Cancelar\",\"close\":\"Fechar\",\"preview\":\"Pré-visualização\",\"resize\":\"Redimensionar\",\"generalTab\":\"Geral\",\"advancedTab\":\"Avançado\",\"validateNumberFailed\":\"Este valor não é um numero.\",\"confirmNewPage\":\"Irão ser perdidas quaisquer alterações não guardadas. Tem a certeza que deseja carregar a nova página?\",\"confirmCancel\":\"Foram alteradas algumas das opções. Tem a certeza que deseja fechar a janela?\",\"options\":\"Opções\",\"target\":\"Destino\",\"targetNew\":\"Nova Janela (_blank)\",\"targetTop\":\"Janela Superior (_top)\",\"targetSelf\":\"Mesma Janela (_self)\",\"targetParent\":\"Janela Parente (_parent)\",\"langDirLTR\":\"Esquerda para a Direita (EPD)\",\"langDirRTL\":\"Direita para a Esquerda (DPE)\",\"styles\":\"Estilo\",\"cssClasses\":\"Classes de folhas de estilo\",\"width\":\"Largura\",\"height\":\"Altura\",\"align\":\"Alinhamento\",\"alignLeft\":\"Esquerda\",\"alignRight\":\"Direita\",\"alignCenter\":\"Centrado\",\"alignJustify\":\"Justificado\",\"alignTop\":\"Topo\",\"alignMiddle\":\"Centro\",\"alignBottom\":\"Base\",\"alignNone\":\"Nenhum\",\"invalidValue\":\"Valor inválido.\",\"invalidHeight\":\"A altura deve ser um número.\",\"invalidWidth\":\"A largura deve ser um número. \",\"invalidCssLength\":\"O valor especificado para o campo \\\"1%\\\" deve ser um número positivo, com ou sem uma unidade de medida CSS válida (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"invalidHtmlLength\":\"O valor especificado para o campo \\\"1%\\\" deve ser um número positivo, com ou sem uma unidade de medida HTML válida (px ou %).\",\"invalidInlineStyle\":\"O valor especificado para o estilo em linha deve constituir um ou mais conjuntos de valores com o formato de \\\"nome : valor\\\", separados por ponto e vírgula.\",\"cssLengthTooltip\":\"Insira um número para um valor em pontos ou um número com uma unidade CSS válida (px, %, in, cm, mm, em, ex, pt, ou pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, indisponível</span>\"},\"about\":{\"copy\":\"Direitos de Autor &copy; $1. Todos os direitos reservados.\",\"dlgTitle\":\"Sobre o CKEditor\",\"help\":\"Doar $1 para ajudar.\",\"moreInfo\":\"Para informação sobre licenciamento visite o nosso sítio web:\",\"title\":\"Sobre o CKEditor\",\"userGuide\":\"CKEditor - Guia do Utilizador\"},\"basicstyles\":{\"bold\":\"Negrito\",\"italic\":\"Itálico\",\"strike\":\"Rasurado\",\"subscript\":\"Superior à linha\",\"superscript\":\"Inferior à Linha\",\"underline\":\"Sublinhado\"},\"bidi\":{\"ltr\":\"Direção do texto da esquerda para a direita\",\"rtl\":\"Direção do texto da direita para a esquerda\"},\"blockquote\":{\"toolbar\":\"Bloco de citação\"},\"clipboard\":{\"copy\":\"Copiar\",\"copyError\":\"A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).\",\"cut\":\"Cortar\",\"cutError\":\"A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).\",\"paste\":\"Colar\",\"pasteArea\":\"Colar área\",\"pasteMsg\":\"Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.\",\"securityMsg\":\"Devido ás definições de segurança do teu browser, o editor não pode aceder ao clipboard diretamente. É necessário que voltes a colar as informações nesta janela.\",\"title\":\"Colar\"},\"button\":{\"selectedLabel\":\"%1 (Selecionado)\"},\"colorbutton\":{\"auto\":\"Automático\",\"bgColorTitle\":\"Cor de Fundo\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Cinza claro\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Branco velho\",\"FFFFE0\":\"Amarelo claro\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Branco\"},\"more\":\"Mais cores...\",\"panelTitle\":\"Cores\",\"textColorTitle\":\"Cor do texto\"},\"colordialog\":{\"clear\":\"Limpar\",\"highlight\":\"Realçar\",\"options\":\"Opções de cor\",\"selected\":\"Cor selecionada\",\"title\":\"Selecionar cor\"},\"templates\":{\"button\":\"Modelos\",\"emptyListMsg\":\"(Sem modelos definidos)\",\"insertOption\":\"Substituir conteúdos atuais\",\"options\":\"Opções do modelo\",\"selectPromptMsg\":\"Por favor, selecione o modelo para abrir no editor\",\"title\":\"Conteúdo dos Modelos\"},\"contextmenu\":{\"options\":\"Menu de opções de contexto\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"Título\",\"cssClassInputLabel\":\"Classes de folhas de estilo\",\"edit\":\"Editar Div\",\"inlineStyleInputLabel\":\"Estilho em Linha\",\"langDirLTRLabel\":\"Esquerda à Direita (LTR)\",\"langDirLabel\":\"Orientação de idioma\",\"langDirRTLLabel\":\"Direita a Esquerda (RTL)\",\"languageCodeInputLabel\":\"Codigo do Idioma\",\"remove\":\"Remover Div\",\"styleSelectLabel\":\"Estilo\",\"title\":\"Criar Div\",\"toolbar\":\"Criar Div\"},\"toolbar\":{\"toolbarCollapse\":\"Ocultar barra de ferramentas\",\"toolbarExpand\":\"Expandir barra de ferramentas\",\"toolbarGroups\":{\"document\":\"Documento\",\"clipboard\":\"Área de transferência/Anular\",\"editing\":\"Edição\",\"forms\":\"Formulários\",\"basicstyles\":\"Estilos Básicos\",\"paragraph\":\"Parágrafo\",\"links\":\"Hiperligações\",\"insert\":\"Inserir\",\"styles\":\"Estilos\",\"colors\":\"Cores\",\"tools\":\"Ferramentas\"},\"toolbars\":\"Editor de Barras de Ferramentas\"},\"elementspath\":{\"eleLabel\":\"Caminho dos elementos\",\"eleTitle\":\"Elemento %1\"},\"find\":{\"find\":\"Procurar\",\"findOptions\":\"Find Options\",\"findWhat\":\"Texto a procurar:\",\"matchCase\":\"Maiúsculas/Minúsculas\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Coincidir com toda a palavra\",\"notFoundMsg\":\"O texto especificado não foi encontrado.\",\"replace\":\"Substituir\",\"replaceAll\":\"Substituir Tudo\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Substituir por:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\" Inserir/Editar Âncora\",\"flash\":\"Animação Flash\",\"hiddenfield\":\"Campo oculto\",\"iframe\":\"IFrame\",\"unknown\":\"Objeto Desconhecido\"},\"flash\":{\"access\":\"Acesso ao Script\",\"accessAlways\":\"Sempre\",\"accessNever\":\"Nunca\",\"accessSameDomain\":\"Mesmo dominio\",\"alignAbsBottom\":\"Abs inferior\",\"alignAbsMiddle\":\"Abs centro\",\"alignBaseline\":\"Linha de base\",\"alignTextTop\":\"Topo do texto\",\"bgcolor\":\"Cor de Fundo\",\"chkFull\":\"Permitir Ecrã inteiro\",\"chkLoop\":\"Loop\",\"chkMenu\":\"Permitir Menu do Flash\",\"chkPlay\":\"Reproduzir automaticamente\",\"flashvars\":\"Variaveis para o Flash\",\"hSpace\":\"Esp.Horiz\",\"properties\":\"Propriedades do Flash\",\"propertiesTab\":\"Propriedades\",\"quality\":\"Qualidade\",\"qualityAutoHigh\":\"Alta Automaticamente\",\"qualityAutoLow\":\"Baixa Automaticamente\",\"qualityBest\":\"Melhor\",\"qualityHigh\":\"Alta\",\"qualityLow\":\"Baixa\",\"qualityMedium\":\"Média\",\"scale\":\"Escala\",\"scaleAll\":\"Mostrar tudo\",\"scaleFit\":\"Tamanho Exacto\",\"scaleNoBorder\":\"Sem Limites\",\"title\":\"Propriedades do Flash\",\"vSpace\":\"Esp.Vert\",\"validateHSpace\":\"HSpace tem de ser um numero.\",\"validateSrc\":\"Por favor introduza a hiperligação URL\",\"validateVSpace\":\"VSpace tem de ser um numero.\",\"windowMode\":\"Modo de janela\",\"windowModeOpaque\":\"Opaco\",\"windowModeTransparent\":\"Transparente\",\"windowModeWindow\":\"Janela\"},\"font\":{\"fontSize\":{\"label\":\"Tamanho\",\"voiceLabel\":\"Tamanho da letra\",\"panelTitle\":\"Tamanho da letra\"},\"label\":\"Fonte\",\"panelTitle\":\"Nome do Tipo de Letra\",\"voiceLabel\":\"Tipo de Letra\"},\"forms\":{\"button\":{\"title\":\"Propriedades do Botão\",\"text\":\"Texto (Valor)\",\"type\":\"Tipo\",\"typeBtn\":\"Botão\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Propriedades da Caixa de Verificação\",\"radioTitle\":\"Propriedades do Botão de Opção\",\"value\":\"Valor\",\"selected\":\"Seleccionado\",\"required\":\"Required\"},\"form\":{\"title\":\"Propriedades do Formulário\",\"menu\":\"Propriedades do Formulário\",\"action\":\"Acção\",\"method\":\"Método\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Propriedades do Campo Escondido\",\"name\":\"Nome\",\"value\":\"Valor\"},\"select\":{\"title\":\"Propriedades da Caixa de Combinação\",\"selectInfo\":\"Informação\",\"opAvail\":\"Opções Possíveis\",\"value\":\"Valor\",\"size\":\"Tamanho\",\"lines\":\"linhas\",\"chkMulti\":\"Permitir selecções múltiplas\",\"required\":\"Required\",\"opText\":\"Texto\",\"opValue\":\"Valor\",\"btnAdd\":\"Adicionar\",\"btnModify\":\"Modificar\",\"btnUp\":\"Para cima\",\"btnDown\":\"Para baixo\",\"btnSetValue\":\"Definir um valor por defeito\",\"btnDelete\":\"Apagar\"},\"textarea\":{\"title\":\"Propriedades da Área de Texto\",\"cols\":\"Colunas\",\"rows\":\"Linhas\"},\"textfield\":{\"title\":\"Propriedades do Campo de Texto\",\"name\":\"Nome\",\"value\":\"Valor\",\"charWidth\":\"Tamanho do caracter\",\"maxChars\":\"Nr. Máximo de Caracteres\",\"required\":\"Required\",\"type\":\"Tipo\",\"typeText\":\"Texto\",\"typePass\":\"Senha\",\"typeEmail\":\"Email\",\"typeSearch\":\"Pesquisar\",\"typeTel\":\"Telefone\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formatar\",\"panelTitle\":\"Formatar Parágrafo\",\"tag_address\":\"Endereço\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Título 1\",\"tag_h2\":\"Título 2\",\"tag_h3\":\"Título 3\",\"tag_h4\":\"Título 4\",\"tag_h5\":\"Título 5\",\"tag_h6\":\"Título 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatado\"},\"horizontalrule\":{\"toolbar\":\"Inserir Linha Horizontal\"},\"iframe\":{\"border\":\"Mostrar a borda da Frame\",\"noUrl\":\"Por favor, digite o URL da iframe\",\"scrolling\":\"Ativar barras de rolamento\",\"title\":\"Propriedades da IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Texto Alternativo\",\"border\":\"Limite\",\"btnUpload\":\"Enviar para o servidor\",\"button2Img\":\"Deseja transformar o botão com imagem selecionado em uma imagem?\",\"hSpace\":\"Esp.Horiz\",\"img2Button\":\"Deseja transformar a imagem selecionada em um botão com imagem?\",\"infoTab\":\"Informação da Imagem\",\"linkTab\":\"Hiperligação\",\"lockRatio\":\"Proporcional\",\"menu\":\"Propriedades da Imagem\",\"resetSize\":\"Tamanho Original\",\"title\":\"Propriedades da Imagem\",\"titleButton\":\"Propriedades do Botão de imagens\",\"upload\":\"Carregar\",\"urlMissing\":\"O URL da fonte da imagem está em falta.\",\"vSpace\":\"Esp.Vert\",\"validateBorder\":\"A borda tem de ser um numero.\",\"validateHSpace\":\"HSpace tem de ser um numero.\",\"validateVSpace\":\"VSpace tem de ser um numero.\"},\"indent\":{\"indent\":\"Aumentar Avanço\",\"outdent\":\"Diminuir Avanço\"},\"smiley\":{\"options\":\"Opções de Emoticons\",\"title\":\"Inserir um Emoticon\",\"toolbar\":\"Emoticons\"},\"justify\":{\"block\":\"Justificado\",\"center\":\"Alinhar ao Centro\",\"left\":\"Alinhar à esquerda\",\"right\":\"Alinhar à direita\"},\"language\":{\"button\":\"Definir Idioma\",\"remove\":\"Remover idioma\"},\"link\":{\"acccessKey\":\"Chave de Acesso\",\"advanced\":\"Avançado\",\"advisoryContentType\":\"Tipo de Conteúdo\",\"advisoryTitle\":\"Título\",\"anchor\":{\"toolbar\":\" Inserir/Editar Âncora\",\"menu\":\"Propriedades da Âncora\",\"title\":\"Propriedades da Âncora\",\"name\":\"Nome da Âncora\",\"errorName\":\"Por favor, introduza o nome da âncora\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Por ID de elemento\",\"anchorName\":\"Por Nome de Referência\",\"charset\":\"Fonte de caracteres vinculado\",\"cssClasses\":\"Classes de Estilo de Folhas Classes\",\"emailAddress\":\"Endereço de E-Mail\",\"emailBody\":\"Corpo da Mensagem\",\"emailSubject\":\"Título de Mensagem\",\"id\":\"ID\",\"info\":\"Informação de Hiperligação\",\"langCode\":\"Orientação de idioma\",\"langDir\":\"Orientação de idioma\",\"langDirLTR\":\"Esquerda à Direita (LTR)\",\"langDirRTL\":\"Direita a Esquerda (RTL)\",\"menu\":\"Editar Hiperligação\",\"name\":\"Nome\",\"noAnchors\":\"(Não há referências disponíveis no documento)\",\"noEmail\":\"Por favor introduza o endereço de e-mail\",\"noUrl\":\"Por favor introduza a hiperligação URL\",\"other\":\"<outro>\",\"popupDependent\":\"Dependente (Netscape)\",\"popupFeatures\":\"Características de Janela de Popup\",\"popupFullScreen\":\"Janela Completa (IE)\",\"popupLeft\":\"Posição Esquerda\",\"popupLocationBar\":\"Barra de localização\",\"popupMenuBar\":\"Barra de Menu\",\"popupResizable\":\"Redimensionável\",\"popupScrollBars\":\"Barras de deslocamento\",\"popupStatusBar\":\"Barra de Estado\",\"popupToolbar\":\"Barra de ferramentas\",\"popupTop\":\"Posição Direita\",\"rel\":\"Relação\",\"selectAnchor\":\"Seleccionar una referência\",\"styles\":\"Estilo\",\"tabIndex\":\"Índice de tabulação\",\"target\":\"Alvo\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Nome do Frame Destino\",\"targetPopup\":\"<janela de popup>\",\"targetPopupName\":\"Nome da Janela de Popup\",\"title\":\"Hiperligação\",\"toAnchor\":\"Referência a esta página\",\"toEmail\":\"Email\",\"toUrl\":\"URL\",\"toolbar\":\"Inserir/Editar Hiperligação\",\"type\":\"Tipo de Hiperligação\",\"unlink\":\"Eliminar Hiperligação\",\"upload\":\"Carregar\"},\"list\":{\"bulletedlist\":\"Marcas\",\"numberedlist\":\"Numeração\"},\"liststyle\":{\"armenian\":\"Numeração armênia\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Círculo\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disco\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"Nenhum\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Quadrado\",\"start\":\"Iniciar\",\"type\":\"Tipo\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insira aqui o parágrafo\"},\"maximize\":{\"maximize\":\"Maximizar\",\"minimize\":\"Minimizar\"},\"newpage\":{\"toolbar\":\"Nova Página\"},\"pagebreak\":{\"alt\":\"Quebra de página\",\"toolbar\":\"Inserir Quebra de Página\"},\"pastetext\":{\"button\":\"Colar como Texto Simples\",\"title\":\"Colar como Texto Simples\"},\"pastefromword\":{\"confirmCleanup\":\"O texto que pretende colar parece ter sido copiado do Word. Deseja limpá-lo antes de colar?\",\"error\":\"Não foi possivel limpar a informação colada decido a um erro interno.\",\"title\":\"Colar do Word\",\"toolbar\":\"Colar do Word\"},\"preview\":{\"preview\":\"Pré-visualizar\"},\"print\":{\"toolbar\":\"Imprimir\"},\"removeformat\":{\"toolbar\":\"Eliminar Formato\"},\"save\":{\"toolbar\":\"Guardar\"},\"selectall\":{\"toolbar\":\"Selecionar tudo\"},\"showblocks\":{\"toolbar\":\"Exibir blocos\"},\"sourcearea\":{\"toolbar\":\"Fonte\"},\"specialchar\":{\"options\":\"Opções de caracteres especiais\",\"title\":\"Selecione um caracter especial\",\"toolbar\":\"Inserir carácter especial\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Estilos\",\"panelTitle\":\"Estilos de Formatação\",\"panelTitle1\":\"Estilos de bloco\",\"panelTitle2\":\"Estilos de Linha\",\"panelTitle3\":\"Estilos de Objeto\"},\"table\":{\"border\":\"Tamanho do contorno\",\"caption\":\"Legenda\",\"cell\":{\"menu\":\"Célula\",\"insertBefore\":\"Inserir célula antes\",\"insertAfter\":\"Inserir célula depois\",\"deleteCell\":\"Apagar Células\",\"merge\":\"Unir Células\",\"mergeRight\":\"Unir à Direita\",\"mergeDown\":\"Fundir abaixo\",\"splitHorizontal\":\"Dividir célula horizontalmente\",\"splitVertical\":\"Dividir célula verticalmente\",\"title\":\"Propriedades da célula\",\"cellType\":\"Tipo de célula\",\"rowSpan\":\"Filas na Célula\",\"colSpan\":\"Colunas na Célula\",\"wordWrap\":\"Moldar texto\",\"hAlign\":\"Alinhamento Horizontal\",\"vAlign\":\"Alinhamento Vertical\",\"alignBaseline\":\"Base\",\"bgColor\":\"Cor de Fundo\",\"borderColor\":\"Cor da Margem\",\"data\":\"Dados\",\"header\":\"Cabeçalho\",\"yes\":\"Sim\",\"no\":\"Não\",\"invalidWidth\":\"A largura da célula deve ser um número.\",\"invalidHeight\":\"A altura da célula deve ser um número.\",\"invalidRowSpan\":\"As filas da célula deve ter um número inteiro.\",\"invalidColSpan\":\"As colunas da célula deve ter um número inteiro.\",\"chooseColor\":\"Escolher\"},\"cellPad\":\"Espaço interior\",\"cellSpace\":\"Espaçamento de célula\",\"column\":{\"menu\":\"Coluna\",\"insertBefore\":\"Inserir Coluna Antes\",\"insertAfter\":\"Inserir coluna depois\",\"deleteColumn\":\"Apagar colunas\"},\"columns\":\"Colunas\",\"deleteTable\":\"Apagar tabela\",\"headers\":\"Cabeçalhos\",\"headersBoth\":\"Ambos\",\"headersColumn\":\"Primeira coluna\",\"headersNone\":\"Nenhum\",\"headersRow\":\"Primeira linha\",\"invalidBorder\":\"O tamanho da margem tem de ser um número.\",\"invalidCellPadding\":\"A criação do espaço na célula deve ser um número positivo.\",\"invalidCellSpacing\":\"O espaçamento da célula deve ser um número positivo.\",\"invalidCols\":\"O número de colunas tem de ser um número maior que 0.\",\"invalidHeight\":\"A altura da tabela tem de ser um número.\",\"invalidRows\":\"O número de linhas tem de ser maior que 0.\",\"invalidWidth\":\"A largura da tabela tem de ser um número.\",\"menu\":\"Propriedades da Tabela\",\"row\":{\"menu\":\"Linha\",\"insertBefore\":\"Inserir linha antes\",\"insertAfter\":\"Inserir linha depois\",\"deleteRow\":\"Apagar linhas\"},\"rows\":\"Linhas\",\"summary\":\"Sumário\",\"title\":\"Propriedades da Tabela\",\"toolbar\":\"Tabela\",\"widthPc\":\"percentagem\",\"widthPx\":\"pontos\",\"widthUnit\":\"unidade da largura\"},\"undo\":{\"redo\":\"Refazer\",\"undo\":\"Anular\"},\"wsc\":{\"btnIgnore\":\"Ignorar\",\"btnIgnoreAll\":\"Ignorar Tudo\",\"btnReplace\":\"Substituir\",\"btnReplaceAll\":\"Substituir Tudo\",\"btnUndo\":\"Anular\",\"changeTo\":\"Mudar para\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\" Verificação ortográfica não instalada. Quer descarregar agora?\",\"manyChanges\":\"Verificação ortográfica completa: %1 palavras alteradas\",\"noChanges\":\"Verificação ortográfica completa: não houve alteração de palavras\",\"noMispell\":\"Verificação ortográfica completa: não foram encontrados erros\",\"noSuggestions\":\"- Sem sugestões -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Não está num directório\",\"oneChange\":\"Verificação ortográfica completa: uma palavra alterada\",\"progress\":\"Verificação ortográfica em progresso…\",\"title\":\"Spell Checker\",\"toolbar\":\"Verificação Ortográfica\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ro.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ro']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Apasă ALT 0 pentru ajutor\",\"browseServer\":\"Răsfoieşte server\",\"url\":\"URL\",\"protocol\":\"Protocol\",\"upload\":\"Încarcă\",\"uploadSubmit\":\"Trimite la server\",\"image\":\"Imagine\",\"flash\":\"Flash\",\"form\":\"Formular (Form)\",\"checkbox\":\"Bifă (Checkbox)\",\"radio\":\"Buton radio (RadioButton)\",\"textField\":\"Câmp text (TextField)\",\"textarea\":\"Suprafaţă text (Textarea)\",\"hiddenField\":\"Câmp ascuns (HiddenField)\",\"button\":\"Buton\",\"select\":\"Câmp selecţie (SelectionField)\",\"imageButton\":\"Buton imagine (ImageButton)\",\"notSet\":\"<nesetat>\",\"id\":\"Id\",\"name\":\"Nume\",\"langDir\":\"Direcţia cuvintelor\",\"langDirLtr\":\"stânga-dreapta (LTR)\",\"langDirRtl\":\"dreapta-stânga (RTL)\",\"langCode\":\"Codul limbii\",\"longDescr\":\"Descrierea lungă URL\",\"cssClass\":\"Clasele cu stilul paginii (CSS)\",\"advisoryTitle\":\"Titlul consultativ\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Anulare\",\"close\":\"Închide\",\"preview\":\"Previzualizare\",\"resize\":\"Trage pentru a redimensiona\",\"generalTab\":\"General\",\"advancedTab\":\"Avansat\",\"validateNumberFailed\":\"Această valoare nu este un număr.\",\"confirmNewPage\":\"Orice modificări nesalvate ale acestui conținut, vor fi pierdute. Sigur doriți încărcarea unei noi pagini?\",\"confirmCancel\":\"Câteva opțiuni au fost schimbate. Sigur doriți să închideți dialogul?\",\"options\":\"Opțiuni\",\"target\":\"Țintă\",\"targetNew\":\"Fereastră nouă (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"În aceeași fereastră (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"Stânga spre Dreapta (LTR)\",\"langDirRTL\":\"Dreapta spre Stânga (RTL)\",\"styles\":\"Stil\",\"cssClasses\":\"Stylesheet Classes\",\"width\":\"Lăţime\",\"height\":\"Înălţime\",\"align\":\"Aliniere\",\"alignLeft\":\"Mărește Bara\",\"alignRight\":\"Dreapta\",\"alignCenter\":\"Centru\",\"alignJustify\":\"Aliniere în bloc (Block Justify)\",\"alignTop\":\"Sus\",\"alignMiddle\":\"Mijloc\",\"alignBottom\":\"Jos\",\"alignNone\":\"None\",\"invalidValue\":\"Valoare invalidă\",\"invalidHeight\":\"Înălțimea trebuie să fie un număr.\",\"invalidWidth\":\"Lățimea trebuie să fie un număr.\",\"invalidCssLength\":\"Valoarea specificată pentru câmpul \\\"%1\\\" trebuie să fie un număr pozitiv cu sau fără o unitate de măsură CSS (px, %, in, cm, mm, em, ex, pt, sau pc).\",\"invalidHtmlLength\":\"Valoarea specificată pentru câmpul \\\"%1\\\" trebuie să fie un număr pozitiv cu sau fără o unitate de măsură HTML (px sau %).\",\"invalidInlineStyle\":\"Valoarea specificată pentru stil trebuie să conțină una sau mai multe construcții de tipul \\\"name : value\\\", separate prin punct și virgulă.\",\"cssLengthTooltip\":\"Introduceți un număr în pixeli sau un număr cu o unitate de măsură CSS (px, %, in, cm, mm, em, ex, pt, sau pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nu este disponibil</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Toate drepturile rezervate.\",\"dlgTitle\":\"Despre CKEeditor\",\"help\":\"Citește  $1 pentru ajutor.\",\"moreInfo\":\"Pentru informații despre licență, vă rugăm vizitați web site-ul nostru:\",\"title\":\"Despre CKEditor\",\"userGuide\":\"CKEditor Ghid Utilizator\"},\"basicstyles\":{\"bold\":\"Îngroşat (bold)\",\"italic\":\"Înclinat (italic)\",\"strike\":\"Tăiat (strike through)\",\"subscript\":\"Indice (subscript)\",\"superscript\":\"Putere (superscript)\",\"underline\":\"Subliniat (underline)\"},\"bidi\":{\"ltr\":\"Direcția textului de la stânga la dreapta\",\"rtl\":\"Direcția textului de la dreapta la stânga\"},\"blockquote\":{\"toolbar\":\"Citat\"},\"clipboard\":{\"copy\":\"Copiază\",\"copyError\":\"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).\",\"cut\":\"Taie\",\"cutError\":\"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).\",\"paste\":\"Adaugă\",\"pasteArea\":\"Suprafața de adăugare\",\"pasteMsg\":\"Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK\",\"securityMsg\":\"Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.\",\"title\":\"Adaugă\"},\"button\":{\"selectedLabel\":\"%1 (Selectat)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"Coloarea fundalului\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Mai multe culori...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Culoarea textului\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Template-uri (şabloane)\",\"emptyListMsg\":\"(Niciun template (şablon) definit)\",\"insertOption\":\"Înlocuieşte cuprinsul actual\",\"options\":\"Opțiuni șabloane\",\"selectPromptMsg\":\"Vă rugăm selectaţi template-ul (şablonul) ce se va deschide în editor<br>(conţinutul actual va fi pierdut):\",\"title\":\"Template-uri (şabloane) de conţinut\"},\"contextmenu\":{\"options\":\"Opțiuni Meniu Contextual\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Titlul consultativ\",\"cssClassInputLabel\":\"Clasele cu stilul paginii (CSS)\",\"edit\":\"Modifică Div-ul\",\"inlineStyleInputLabel\":\"Stil Inline\",\"langDirLTRLabel\":\"stânga-dreapta (LTR)\",\"langDirLabel\":\"Direcţia cuvintelor\",\"langDirRTLLabel\":\"dreapta-stânga (RTL)\",\"languageCodeInputLabel\":\"Codul limbii\",\"remove\":\"Șterge Div-ul\",\"styleSelectLabel\":\"Stil\",\"title\":\"Crează un container Div\",\"toolbar\":\"Crează un container Div\"},\"toolbar\":{\"toolbarCollapse\":\"Micșorează Bara\",\"toolbarExpand\":\"Mărește Bara\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Editează bara de unelte\"},\"elementspath\":{\"eleLabel\":\"Calea elementelor\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Găseşte\",\"findOptions\":\"Find Options\",\"findWhat\":\"Găseşte:\",\"matchCase\":\"Deosebeşte majuscule de minuscule (Match case)\",\"matchCyclic\":\"Potrivește ciclic\",\"matchWord\":\"Doar cuvintele întregi\",\"notFoundMsg\":\"Textul specificat nu a fost găsit.\",\"replace\":\"Înlocuieşte\",\"replaceAll\":\"Înlocuieşte tot\",\"replaceSuccessMsg\":\"%1 căutări înlocuite.\",\"replaceWith\":\"Înlocuieşte cu:\",\"title\":\"Găseşte şi înlocuieşte\"},\"fakeobjects\":{\"anchor\":\"Inserează/Editează ancoră\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Câmp ascuns (HiddenField)\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Acces script\",\"accessAlways\":\"Întotdeauna\",\"accessNever\":\"Niciodată\",\"accessSameDomain\":\"Același domeniu\",\"alignAbsBottom\":\"Jos absolut (Abs Bottom)\",\"alignAbsMiddle\":\"Mijloc absolut (Abs Middle)\",\"alignBaseline\":\"Linia de jos (Baseline)\",\"alignTextTop\":\"Text sus\",\"bgcolor\":\"Coloarea fundalului\",\"chkFull\":\"Permite pe tot ecranul\",\"chkLoop\":\"Repetă (Loop)\",\"chkMenu\":\"Activează meniul flash\",\"chkPlay\":\"Rulează automat\",\"flashvars\":\"Variabile pentru flash\",\"hSpace\":\"HSpace\",\"properties\":\"Proprietăţile flashului\",\"propertiesTab\":\"Proprietăți\",\"quality\":\"Calitate\",\"qualityAutoHigh\":\"Auto înaltă\",\"qualityAutoLow\":\"Auto Joasă\",\"qualityBest\":\"Cea mai bună\",\"qualityHigh\":\"Înaltă\",\"qualityLow\":\"Joasă\",\"qualityMedium\":\"Medie\",\"scale\":\"Scală\",\"scaleAll\":\"Arată tot\",\"scaleFit\":\"Potriveşte\",\"scaleNoBorder\":\"Fără bordură (No border)\",\"title\":\"Proprietăţile flashului\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"Hspace trebuie să fie un număr.\",\"validateSrc\":\"Vă rugăm să scrieţi URL-ul\",\"validateVSpace\":\"VSpace trebuie să fie un număr\",\"windowMode\":\"Mod fereastră\",\"windowModeOpaque\":\"Opacă\",\"windowModeTransparent\":\"Transparentă\",\"windowModeWindow\":\"Fereastră\"},\"font\":{\"fontSize\":{\"label\":\"Mărime\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Mărime\"},\"label\":\"Font\",\"panelTitle\":\"Font\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Proprietăţi buton\",\"text\":\"Text (Valoare)\",\"type\":\"Tip\",\"typeBtn\":\"Buton\",\"typeSbm\":\"Trimite\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Proprietăţi bifă (Checkbox)\",\"radioTitle\":\"Proprietăţi buton radio (Radio Button)\",\"value\":\"Valoare\",\"selected\":\"Selectat\",\"required\":\"Required\"},\"form\":{\"title\":\"Proprietăţi formular (Form)\",\"menu\":\"Proprietăţi formular (Form)\",\"action\":\"Acţiune\",\"method\":\"Metodă\",\"encoding\":\"Encodare\"},\"hidden\":{\"title\":\"Proprietăţi câmp ascuns (Hidden Field)\",\"name\":\"Nume\",\"value\":\"Valoare\"},\"select\":{\"title\":\"Proprietăţi câmp selecţie (Selection Field)\",\"selectInfo\":\"Informaţii\",\"opAvail\":\"Opţiuni disponibile\",\"value\":\"Valoare\",\"size\":\"Mărime\",\"lines\":\"linii\",\"chkMulti\":\"Permite selecţii multiple\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Valoare\",\"btnAdd\":\"Adaugă\",\"btnModify\":\"Modifică\",\"btnUp\":\"Sus\",\"btnDown\":\"Jos\",\"btnSetValue\":\"Setează ca valoare selectată\",\"btnDelete\":\"Şterge\"},\"textarea\":{\"title\":\"Proprietăţi suprafaţă text (Textarea)\",\"cols\":\"Coloane\",\"rows\":\"Linii\"},\"textfield\":{\"title\":\"Proprietăţi câmp text (Text Field)\",\"name\":\"Nume\",\"value\":\"Valoare\",\"charWidth\":\"Lărgimea caracterului\",\"maxChars\":\"Caractere maxime\",\"required\":\"Required\",\"type\":\"Tip\",\"typeText\":\"Text\",\"typePass\":\"Parolă\",\"typeEmail\":\"Email\",\"typeSearch\":\"Cauta\",\"typeTel\":\"Numar de telefon\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formatare\",\"panelTitle\":\"Formatare\",\"tag_address\":\"Adresă\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatat\"},\"horizontalrule\":{\"toolbar\":\"Inserează linie orizontală\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Text alternativ\",\"border\":\"Margine\",\"btnUpload\":\"Trimite la server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Informaţii despre imagine\",\"linkTab\":\"Link (Legătură web)\",\"lockRatio\":\"Păstrează proporţiile\",\"menu\":\"Proprietăţile imaginii\",\"resetSize\":\"Resetează mărimea\",\"title\":\"Proprietăţile imaginii\",\"titleButton\":\"Proprietăţi buton imagine (Image Button)\",\"upload\":\"Încarcă\",\"urlMissing\":\"Sursa URL a imaginii lipsește.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Bordura trebuie să fie un număr întreg.\",\"validateHSpace\":\"Hspace trebuie să fie un număr întreg.\",\"validateVSpace\":\"Vspace trebuie să fie un număr întreg.\"},\"indent\":{\"indent\":\"Creşte indentarea\",\"outdent\":\"Scade indentarea\"},\"smiley\":{\"options\":\"Opțiuni figuri expresive\",\"title\":\"Inserează o figură expresivă (Emoticon)\",\"toolbar\":\"Figură expresivă (Emoticon)\"},\"justify\":{\"block\":\"Aliniere în bloc (Block Justify)\",\"center\":\"Aliniere centrală\",\"left\":\"Aliniere la stânga\",\"right\":\"Aliniere la dreapta\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Tasta de acces\",\"advanced\":\"Avansat\",\"advisoryContentType\":\"Tipul consultativ al titlului\",\"advisoryTitle\":\"Titlul consultativ\",\"anchor\":{\"toolbar\":\"Inserează/Editează ancoră\",\"menu\":\"Proprietăţi ancoră\",\"title\":\"Proprietăţi ancoră\",\"name\":\"Numele ancorei\",\"errorName\":\"Vă rugăm scrieţi numele ancorei\",\"remove\":\"Elimină ancora\"},\"anchorId\":\"după Id-ul elementului\",\"anchorName\":\"după numele ancorei\",\"charset\":\"Setul de caractere al resursei legate\",\"cssClasses\":\"Clasele cu stilul paginii (CSS)\",\"emailAddress\":\"Adresă de e-mail\",\"emailBody\":\"Opțiuni Meniu Contextual\",\"emailSubject\":\"Subiectul mesajului\",\"id\":\"Id\",\"info\":\"Informaţii despre link (Legătură web)\",\"langCode\":\"Direcţia cuvintelor\",\"langDir\":\"Direcţia cuvintelor\",\"langDirLTR\":\"stânga-dreapta (LTR)\",\"langDirRTL\":\"dreapta-stânga (RTL)\",\"menu\":\"Editează Link\",\"name\":\"Nume\",\"noAnchors\":\"(Nicio ancoră disponibilă în document)\",\"noEmail\":\"Vă rugăm să scrieţi adresa de e-mail\",\"noUrl\":\"Vă rugăm să scrieţi URL-ul\",\"other\":\"<alt>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Proprietăţile ferestrei popup\",\"popupFullScreen\":\"Tot ecranul (Full Screen)(IE)\",\"popupLeft\":\"Poziţia la stânga\",\"popupLocationBar\":\"Bara de locaţie\",\"popupMenuBar\":\"Bara de meniu\",\"popupResizable\":\"Redimensionabil\",\"popupScrollBars\":\"Bare de derulare\",\"popupStatusBar\":\"Bara de status\",\"popupToolbar\":\"Bara de opţiuni\",\"popupTop\":\"Poziţia la dreapta\",\"rel\":\"Relație\",\"selectAnchor\":\"Selectaţi o ancoră\",\"styles\":\"Stil\",\"tabIndex\":\"Indexul tabului\",\"target\":\"Ţintă (Target)\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Numele frameului ţintă\",\"targetPopup\":\"<fereastra popup>\",\"targetPopupName\":\"Numele ferestrei popup\",\"title\":\"Link (Legătură web)\",\"toAnchor\":\"Ancoră în această pagină\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Inserează/Editează link (legătură web)\",\"type\":\"Tipul link-ului (al legăturii web)\",\"unlink\":\"Înlătură link (legătură web)\",\"upload\":\"Încarcă\"},\"list\":{\"bulletedlist\":\"Inserează / Elimină Listă cu puncte\",\"numberedlist\":\"Inserează / Elimină Listă numerotată\"},\"liststyle\":{\"armenian\":\"Numerotare armeniană\",\"bulletedTitle\":\"Proprietățile listei cu simboluri\",\"circle\":\"Cerc\",\"decimal\":\"Decimale (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimale cu zero în față (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Numerotare georgiană (an, ban, gan, etc.)\",\"lowerAlpha\":\"Litere mici (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Litere grecești mici (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Cifre romane mici (i, ii, iii, iv, v, etc.)\",\"none\":\"Nimic\",\"notset\":\"<nesetat>\",\"numberedTitle\":\"Proprietățile listei numerotate\",\"square\":\"Pătrat\",\"start\":\"Start\",\"type\":\"Tip\",\"upperAlpha\":\"Litere mari (A, B, C, D, E, etc.)\",\"upperRoman\":\"Cifre romane mari (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Începutul listei trebuie să fie un număr întreg.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Mărește\",\"minimize\":\"Micșorează\"},\"newpage\":{\"toolbar\":\"Pagină nouă\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Inserează separator de pagină (Page Break)\"},\"pastetext\":{\"button\":\"Adaugă ca text simplu (Plain Text)\",\"title\":\"Adaugă ca text simplu (Plain Text)\"},\"pastefromword\":{\"confirmCleanup\":\"Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?\",\"error\":\"Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne\",\"title\":\"Adaugă din Word\",\"toolbar\":\"Adaugă din Word\"},\"preview\":{\"preview\":\"Previzualizare\"},\"print\":{\"toolbar\":\"Printează\"},\"removeformat\":{\"toolbar\":\"Înlătură formatarea\"},\"save\":{\"toolbar\":\"Salvează\"},\"selectall\":{\"toolbar\":\"Selectează tot\"},\"showblocks\":{\"toolbar\":\"Arată blocurile\"},\"sourcearea\":{\"toolbar\":\"Sursa\"},\"specialchar\":{\"options\":\"Opțiuni caractere speciale\",\"title\":\"Selectează caracter special\",\"toolbar\":\"Inserează caracter special\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Formatarea stilurilor\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Mărimea marginii\",\"caption\":\"Titlu (Caption)\",\"cell\":{\"menu\":\"Celulă\",\"insertBefore\":\"Inserează celulă înainte\",\"insertAfter\":\"Inserează celulă după\",\"deleteCell\":\"Şterge celule\",\"merge\":\"Uneşte celule\",\"mergeRight\":\"Uneşte la dreapta\",\"mergeDown\":\"Uneşte jos\",\"splitHorizontal\":\"Împarte celula pe orizontală\",\"splitVertical\":\"Împarte celula pe verticală\",\"title\":\"Proprietăți celulă\",\"cellType\":\"Tipul celulei\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Aliniament orizontal\",\"vAlign\":\"Aliniament vertical\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Culoare fundal\",\"borderColor\":\"Culoare bordură\",\"data\":\"Data\",\"header\":\"Antet\",\"yes\":\"Da\",\"no\":\"Nu\",\"invalidWidth\":\"Lățimea celulei trebuie să fie un număr.\",\"invalidHeight\":\"Înălțimea celulei trebuie să fie un număr.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Alege\"},\"cellPad\":\"Spaţiu în cadrul celulei\",\"cellSpace\":\"Spaţiu între celule\",\"column\":{\"menu\":\"Coloană\",\"insertBefore\":\"Inserează coloană înainte\",\"insertAfter\":\"Inserează coloană după\",\"deleteColumn\":\"Şterge celule\"},\"columns\":\"Coloane\",\"deleteTable\":\"Şterge tabel\",\"headers\":\"Antente\",\"headersBoth\":\"Ambele\",\"headersColumn\":\"Prima coloană\",\"headersNone\":\"Nimic\",\"headersRow\":\"Primul rând\",\"invalidBorder\":\"Dimensiunea bordurii trebuie să aibe un număr.\",\"invalidCellPadding\":\"Spațierea celulei trebuie sa fie un număr pozitiv\",\"invalidCellSpacing\":\"Spațierea celului trebuie să fie un număr pozitiv.\",\"invalidCols\":\"Numărul coloanelor trebuie să fie mai mare decât 0.\",\"invalidHeight\":\"Inaltimea celulei trebuie sa fie un numar.\",\"invalidRows\":\"Numărul rândurilor trebuie să fie mai mare decât 0.\",\"invalidWidth\":\"Lățimea tabelului trebuie să fie un număr.\",\"menu\":\"Proprietăţile tabelului\",\"row\":{\"menu\":\"Rând\",\"insertBefore\":\"Inserează rând înainte\",\"insertAfter\":\"Inserează rând după\",\"deleteRow\":\"Şterge rânduri\"},\"rows\":\"Rânduri\",\"summary\":\"Rezumat\",\"title\":\"Proprietăţile tabelului\",\"toolbar\":\"Tabel\",\"widthPc\":\"procente\",\"widthPx\":\"pixeli\",\"widthUnit\":\"unitate lățime\"},\"undo\":{\"redo\":\"Starea ulterioară (redo)\",\"undo\":\"Starea anterioară (undo)\"},\"wsc\":{\"btnIgnore\":\"Ignoră\",\"btnIgnoreAll\":\"Ignoră toate\",\"btnReplace\":\"Înlocuieşte\",\"btnReplaceAll\":\"Înlocuieşte tot\",\"btnUndo\":\"Starea anterioară (undo)\",\"changeTo\":\"Schimbă în\",\"errorLoading\":\"Eroare în lansarea aplicației service host %s.\",\"ieSpellDownload\":\"Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?\",\"manyChanges\":\"Verificarea textului terminată: 1% cuvinte modificate\",\"noChanges\":\"Verificarea textului terminată: Niciun cuvânt modificat\",\"noMispell\":\"Verificarea textului terminată: Nicio greşeală găsită\",\"noSuggestions\":\"- Fără sugestii -\",\"notAvailable\":\"Scuzați, dar serviciul nu este disponibil momentan.\",\"notInDic\":\"Nu e în dicţionar\",\"oneChange\":\"Verificarea textului terminată: Un cuvânt modificat\",\"progress\":\"Verificarea textului în desfăşurare...\",\"title\":\"Spell Checker\",\"toolbar\":\"Verifică scrierea textului\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ru.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ru']={\"editor\":\"Визуальный текстовый редактор\",\"editorPanel\":\"Визуальный редактор текста\",\"common\":{\"editorHelp\":\"Нажмите ALT-0 для открытия справки\",\"browseServer\":\"Выбор на сервере\",\"url\":\"Ссылка\",\"protocol\":\"Протокол\",\"upload\":\"Загрузка файла\",\"uploadSubmit\":\"Загрузить на сервер\",\"image\":\"Изображение\",\"flash\":\"Flash\",\"form\":\"Форма\",\"checkbox\":\"Чекбокс\",\"radio\":\"Радиокнопка\",\"textField\":\"Текстовое поле\",\"textarea\":\"Многострочное текстовое поле\",\"hiddenField\":\"Скрытое поле\",\"button\":\"Кнопка\",\"select\":\"Выпадающий список\",\"imageButton\":\"Кнопка-изображение\",\"notSet\":\"<не указано>\",\"id\":\"Идентификатор\",\"name\":\"Имя\",\"langDir\":\"Направление текста\",\"langDirLtr\":\"Слева направо (LTR)\",\"langDirRtl\":\"Справа налево (RTL)\",\"langCode\":\"Код языка\",\"longDescr\":\"Длинное описание ссылки\",\"cssClass\":\"Класс CSS\",\"advisoryTitle\":\"Заголовок\",\"cssStyle\":\"Стиль\",\"ok\":\"ОК\",\"cancel\":\"Отмена\",\"close\":\"Закрыть\",\"preview\":\"Предпросмотр\",\"resize\":\"Перетащите для изменения размера\",\"generalTab\":\"Основное\",\"advancedTab\":\"Дополнительно\",\"validateNumberFailed\":\"Это значение не является числом.\",\"confirmNewPage\":\"Несохранённые изменения будут потеряны! Вы действительно желаете перейти на другую страницу?\",\"confirmCancel\":\"Некоторые параметры были изменены. Вы уверены, что желаете закрыть без сохранения?\",\"options\":\"Параметры\",\"target\":\"Цель\",\"targetNew\":\"Новое окно (_blank)\",\"targetTop\":\"Главное окно (_top)\",\"targetSelf\":\"Текущее окно (_self)\",\"targetParent\":\"Родительское окно (_parent)\",\"langDirLTR\":\"Слева направо (LTR)\",\"langDirRTL\":\"Справа налево (RTL)\",\"styles\":\"Стиль\",\"cssClasses\":\"CSS классы\",\"width\":\"Ширина\",\"height\":\"Высота\",\"align\":\"Выравнивание\",\"alignLeft\":\"По левому краю\",\"alignRight\":\"По правому краю\",\"alignCenter\":\"По центру\",\"alignJustify\":\"По ширине\",\"alignTop\":\"Поверху\",\"alignMiddle\":\"Посередине\",\"alignBottom\":\"Понизу\",\"alignNone\":\"Нет\",\"invalidValue\":\"Недопустимое значение.\",\"invalidHeight\":\"Высота задается числом.\",\"invalidWidth\":\"Ширина задается числом.\",\"invalidCssLength\":\"Значение, указанное в поле \\\"%1\\\", должно быть положительным целым числом. Допускается указание единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).\",\"invalidHtmlLength\":\"Значение, указанное в поле \\\"%1\\\", должно быть положительным целым числом. Допускается указание единиц меры HTML (px или %).\",\"invalidInlineStyle\":\"Значение, указанное для стиля элемента, должно состоять из одной или нескольких пар данных в формате \\\"параметр : значение\\\", разделённых точкой с запятой.\",\"cssLengthTooltip\":\"Введите значение в пикселях, либо число с корректной единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, недоступно</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Все права защищены.\",\"dlgTitle\":\"О CKEditor\",\"help\":\"$1 содержит подробную справку по использованию.\",\"moreInfo\":\"Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:\",\"title\":\"О CKEditor\",\"userGuide\":\"Руководство пользователя CKEditor\"},\"basicstyles\":{\"bold\":\"Полужирный\",\"italic\":\"Курсив\",\"strike\":\"Зачеркнутый\",\"subscript\":\"Подстрочный индекс\",\"superscript\":\"Надстрочный индекс\",\"underline\":\"Подчеркнутый\"},\"bidi\":{\"ltr\":\"Направление текста слева направо\",\"rtl\":\"Направление текста справа налево\"},\"blockquote\":{\"toolbar\":\"Цитата\"},\"clipboard\":{\"copy\":\"Копировать\",\"copyError\":\"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).\",\"cut\":\"Вырезать\",\"cutError\":\"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).\",\"paste\":\"Вставить\",\"pasteArea\":\"Зона для вставки\",\"pasteMsg\":\"Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку \\\"OK\\\".\",\"securityMsg\":\"Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.\",\"title\":\"Вставить\"},\"button\":{\"selectedLabel\":\"%1 (Выбрано)\"},\"colorbutton\":{\"auto\":\"Автоматически\",\"bgColorTitle\":\"Цвет фона\",\"colors\":{\"000\":\"Чёрный\",\"800000\":\"Бордовый\",\"8B4513\":\"Кожано-коричневый\",\"2F4F4F\":\"Темный синевато-серый\",\"008080\":\"Сине-зелёный\",\"000080\":\"Тёмно-синий\",\"4B0082\":\"Индиго\",\"696969\":\"Тёмно-серый\",\"B22222\":\"Кирпичный\",\"A52A2A\":\"Коричневый\",\"DAA520\":\"Золотисто-берёзовый\",\"006400\":\"Темно-зелёный\",\"40E0D0\":\"Бирюзовый\",\"0000CD\":\"Умеренно синий\",\"800080\":\"Пурпурный\",\"808080\":\"Серый\",\"F00\":\"Красный\",\"FF8C00\":\"Темно-оранжевый\",\"FFD700\":\"Золотистый\",\"008000\":\"Зелёный\",\"0FF\":\"Васильковый\",\"00F\":\"Синий\",\"EE82EE\":\"Фиолетовый\",\"A9A9A9\":\"Тускло-серый\",\"FFA07A\":\"Светло-лососевый\",\"FFA500\":\"Оранжевый\",\"FFFF00\":\"Жёлтый\",\"00FF00\":\"Лайма\",\"AFEEEE\":\"Бледно-синий\",\"ADD8E6\":\"Свелто-голубой\",\"DDA0DD\":\"Сливовый\",\"D3D3D3\":\"Светло-серый\",\"FFF0F5\":\"Розово-лавандовый\",\"FAEBD7\":\"Античный белый\",\"FFFFE0\":\"Светло-жёлтый\",\"F0FFF0\":\"Медвяной росы\",\"F0FFFF\":\"Лазурный\",\"F0F8FF\":\"Бледно-голубой\",\"E6E6FA\":\"Лавандовый\",\"FFF\":\"Белый\"},\"more\":\"Ещё цвета...\",\"panelTitle\":\"Цвета\",\"textColorTitle\":\"Цвет текста\"},\"colordialog\":{\"clear\":\"Очистить\",\"highlight\":\"Под курсором\",\"options\":\"Настройки цвета\",\"selected\":\"Выбранный цвет\",\"title\":\"Выберите цвет\"},\"templates\":{\"button\":\"Шаблоны\",\"emptyListMsg\":\"(не определено ни одного шаблона)\",\"insertOption\":\"Заменить текущее содержимое\",\"options\":\"Параметры шаблона\",\"selectPromptMsg\":\"Пожалуйста, выберите, какой шаблон следует открыть в редакторе\",\"title\":\"Шаблоны содержимого\"},\"contextmenu\":{\"options\":\"Параметры контекстного меню\"},\"div\":{\"IdInputLabel\":\"Идентификатор\",\"advisoryTitleInputLabel\":\"Заголовок\",\"cssClassInputLabel\":\"Классы CSS\",\"edit\":\"Редактировать контейнер\",\"inlineStyleInputLabel\":\"Стиль элемента\",\"langDirLTRLabel\":\"Слева направо (LTR)\",\"langDirLabel\":\"Направление текста\",\"langDirRTLLabel\":\"Справа налево (RTL)\",\"languageCodeInputLabel\":\"Код языка\",\"remove\":\"Удалить контейнер\",\"styleSelectLabel\":\"Стиль\",\"title\":\"Создать Div-контейнер\",\"toolbar\":\"Создать Div-контейнер\"},\"toolbar\":{\"toolbarCollapse\":\"Свернуть панель инструментов\",\"toolbarExpand\":\"Развернуть панель инструментов\",\"toolbarGroups\":{\"document\":\"Документ\",\"clipboard\":\"Буфер обмена / Отмена действий\",\"editing\":\"Корректировка\",\"forms\":\"Формы\",\"basicstyles\":\"Простые стили\",\"paragraph\":\"Абзац\",\"links\":\"Ссылки\",\"insert\":\"Вставка\",\"styles\":\"Стили\",\"colors\":\"Цвета\",\"tools\":\"Инструменты\"},\"toolbars\":\"Панели инструментов редактора\"},\"elementspath\":{\"eleLabel\":\"Путь элементов\",\"eleTitle\":\"Элемент %1\"},\"find\":{\"find\":\"Найти\",\"findOptions\":\"Опции поиска\",\"findWhat\":\"Найти:\",\"matchCase\":\"Учитывать регистр\",\"matchCyclic\":\"По всему тексту\",\"matchWord\":\"Только слово целиком\",\"notFoundMsg\":\"Искомый текст не найден.\",\"replace\":\"Заменить\",\"replaceAll\":\"Заменить всё\",\"replaceSuccessMsg\":\"Успешно заменено %1 раз(а).\",\"replaceWith\":\"Заменить на:\",\"title\":\"Поиск и замена\"},\"fakeobjects\":{\"anchor\":\"Якорь\",\"flash\":\"Flash анимация\",\"hiddenfield\":\"Скрытое поле\",\"iframe\":\"iFrame\",\"unknown\":\"Неизвестный объект\"},\"flash\":{\"access\":\"Доступ к скриптам\",\"accessAlways\":\"Всегда\",\"accessNever\":\"Никогда\",\"accessSameDomain\":\"В том же домене\",\"alignAbsBottom\":\"По низу текста\",\"alignAbsMiddle\":\"По середине текста\",\"alignBaseline\":\"По базовой линии\",\"alignTextTop\":\"По верху текста\",\"bgcolor\":\"Цвет фона\",\"chkFull\":\"Разрешить полноэкранный режим\",\"chkLoop\":\"Повторять\",\"chkMenu\":\"Включить меню Flash\",\"chkPlay\":\"Автоматическое воспроизведение\",\"flashvars\":\"Переменные для Flash\",\"hSpace\":\"Гориз. отступ\",\"properties\":\"Свойства Flash\",\"propertiesTab\":\"Свойства\",\"quality\":\"Качество\",\"qualityAutoHigh\":\"Запуск на высоком\",\"qualityAutoLow\":\"Запуск на низком\",\"qualityBest\":\"Лучшее\",\"qualityHigh\":\"Высокое\",\"qualityLow\":\"Низкое\",\"qualityMedium\":\"Среднее\",\"scale\":\"Масштабировать\",\"scaleAll\":\"Пропорционально\",\"scaleFit\":\"Заполнять\",\"scaleNoBorder\":\"Заходить за границы\",\"title\":\"Свойства Flash\",\"vSpace\":\"Вертик. отступ\",\"validateHSpace\":\"Горизонтальный отступ задается числом.\",\"validateSrc\":\"Вы должны ввести ссылку\",\"validateVSpace\":\"Вертикальный отступ задается числом.\",\"windowMode\":\"Взаимодействие с окном\",\"windowModeOpaque\":\"Непрозрачный\",\"windowModeTransparent\":\"Прозрачный\",\"windowModeWindow\":\"Обычный\"},\"font\":{\"fontSize\":{\"label\":\"Размер\",\"voiceLabel\":\"Размер шрифта\",\"panelTitle\":\"Размер шрифта\"},\"label\":\"Шрифт\",\"panelTitle\":\"Шрифт\",\"voiceLabel\":\"Шрифт\"},\"forms\":{\"button\":{\"title\":\"Свойства кнопки\",\"text\":\"Текст (Значение)\",\"type\":\"Тип\",\"typeBtn\":\"Кнопка\",\"typeSbm\":\"Отправка\",\"typeRst\":\"Сброс\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Свойства флаговой кнопки\",\"radioTitle\":\"Свойства кнопки выбора\",\"value\":\"Значение\",\"selected\":\"Выбрано\",\"required\":\"Обязательное поле\"},\"form\":{\"title\":\"Свойства формы\",\"menu\":\"Свойства формы\",\"action\":\"Действие\",\"method\":\"Метод\",\"encoding\":\"Кодировка\"},\"hidden\":{\"title\":\"Свойства скрытого поля\",\"name\":\"Имя\",\"value\":\"Значение\"},\"select\":{\"title\":\"Свойства списка выбора\",\"selectInfo\":\"Информация о списке выбора\",\"opAvail\":\"Доступные варианты\",\"value\":\"Значение\",\"size\":\"Размер\",\"lines\":\"строк(и)\",\"chkMulti\":\"Разрешить выбор нескольких вариантов\",\"required\":\"Обязательное поле\",\"opText\":\"Текст\",\"opValue\":\"Значение\",\"btnAdd\":\"Добавить\",\"btnModify\":\"Изменить\",\"btnUp\":\"Поднять\",\"btnDown\":\"Опустить\",\"btnSetValue\":\"Пометить как выбранное\",\"btnDelete\":\"Удалить\"},\"textarea\":{\"title\":\"Свойства многострочного текстового поля\",\"cols\":\"Колонок\",\"rows\":\"Строк\"},\"textfield\":{\"title\":\"Свойства текстового поля\",\"name\":\"Имя\",\"value\":\"Значение\",\"charWidth\":\"Ширина поля (в символах)\",\"maxChars\":\"Макс. количество символов\",\"required\":\"Обязательное поле\",\"type\":\"Тип содержимого\",\"typeText\":\"Текст\",\"typePass\":\"Пароль\",\"typeEmail\":\"Email\",\"typeSearch\":\"Поиск\",\"typeTel\":\"Номер телефона\",\"typeUrl\":\"Ссылка\"}},\"format\":{\"label\":\"Форматирование\",\"panelTitle\":\"Форматирование\",\"tag_address\":\"Адрес\",\"tag_div\":\"Обычное (div)\",\"tag_h1\":\"Заголовок 1\",\"tag_h2\":\"Заголовок 2\",\"tag_h3\":\"Заголовок 3\",\"tag_h4\":\"Заголовок 4\",\"tag_h5\":\"Заголовок 5\",\"tag_h6\":\"Заголовок 6\",\"tag_p\":\"Обычное\",\"tag_pre\":\"Моноширинное\"},\"horizontalrule\":{\"toolbar\":\"Вставить горизонтальную линию\"},\"iframe\":{\"border\":\"Показать границы фрейма\",\"noUrl\":\"Пожалуйста, введите ссылку фрейма\",\"scrolling\":\"Отображать полосы прокрутки\",\"title\":\"Свойства iFrame\",\"toolbar\":\"iFrame\"},\"image\":{\"alt\":\"Альтернативный текст\",\"border\":\"Граница\",\"btnUpload\":\"Загрузить на сервер\",\"button2Img\":\"Вы желаете преобразовать это изображение-кнопку в обычное изображение?\",\"hSpace\":\"Гориз. отступ\",\"img2Button\":\"Вы желаете преобразовать это обычное изображение в изображение-кнопку?\",\"infoTab\":\"Данные об изображении\",\"linkTab\":\"Ссылка\",\"lockRatio\":\"Сохранять пропорции\",\"menu\":\"Свойства изображения\",\"resetSize\":\"Вернуть обычные размеры\",\"title\":\"Свойства изображения\",\"titleButton\":\"Свойства изображения-кнопки\",\"upload\":\"Загрузить\",\"urlMissing\":\"Не указана ссылка на изображение.\",\"vSpace\":\"Вертик. отступ\",\"validateBorder\":\"Размер границ должен быть задан числом.\",\"validateHSpace\":\"Горизонтальный отступ должен быть задан числом.\",\"validateVSpace\":\"Вертикальный отступ должен быть задан числом.\"},\"indent\":{\"indent\":\"Увеличить отступ\",\"outdent\":\"Уменьшить отступ\"},\"smiley\":{\"options\":\"Выбор смайла\",\"title\":\"Вставить смайл\",\"toolbar\":\"Смайлы\"},\"justify\":{\"block\":\"По ширине\",\"center\":\"По центру\",\"left\":\"По левому краю\",\"right\":\"По правому краю\"},\"language\":{\"button\":\"Установка языка\",\"remove\":\"Удалить язык\"},\"link\":{\"acccessKey\":\"Клавиша доступа\",\"advanced\":\"Дополнительно\",\"advisoryContentType\":\"Тип содержимого\",\"advisoryTitle\":\"Заголовок\",\"anchor\":{\"toolbar\":\"Вставить / редактировать якорь\",\"menu\":\"Изменить якорь\",\"title\":\"Свойства якоря\",\"name\":\"Имя якоря\",\"errorName\":\"Пожалуйста, введите имя якоря\",\"remove\":\"Удалить якорь\"},\"anchorId\":\"По идентификатору\",\"anchorName\":\"По имени\",\"charset\":\"Кодировка ресурса\",\"cssClasses\":\"Классы CSS\",\"emailAddress\":\"Email адрес\",\"emailBody\":\"Текст сообщения\",\"emailSubject\":\"Тема сообщения\",\"id\":\"Идентификатор\",\"info\":\"Информация о ссылке\",\"langCode\":\"Код языка\",\"langDir\":\"Направление текста\",\"langDirLTR\":\"Слева направо (LTR)\",\"langDirRTL\":\"Справа налево (RTL)\",\"menu\":\"Редактировать ссылку\",\"name\":\"Имя\",\"noAnchors\":\"(В документе нет ни одного якоря)\",\"noEmail\":\"Пожалуйста, введите email адрес\",\"noUrl\":\"Пожалуйста, введите ссылку\",\"other\":\"<другой>\",\"popupDependent\":\"Зависимое (Netscape)\",\"popupFeatures\":\"Параметры всплывающего окна\",\"popupFullScreen\":\"Полноэкранное (IE)\",\"popupLeft\":\"Отступ слева\",\"popupLocationBar\":\"Панель адреса\",\"popupMenuBar\":\"Панель меню\",\"popupResizable\":\"Изменяемый размер\",\"popupScrollBars\":\"Полосы прокрутки\",\"popupStatusBar\":\"Строка состояния\",\"popupToolbar\":\"Панель инструментов\",\"popupTop\":\"Отступ сверху\",\"rel\":\"Отношение\",\"selectAnchor\":\"Выберите якорь\",\"styles\":\"Стиль\",\"tabIndex\":\"Последовательность перехода\",\"target\":\"Цель\",\"targetFrame\":\"<фрейм>\",\"targetFrameName\":\"Имя целевого фрейма\",\"targetPopup\":\"<всплывающее окно>\",\"targetPopupName\":\"Имя всплывающего окна\",\"title\":\"Ссылка\",\"toAnchor\":\"Ссылка на якорь в тексте\",\"toEmail\":\"Email\",\"toUrl\":\"Ссылка\",\"toolbar\":\"Вставить/Редактировать ссылку\",\"type\":\"Тип ссылки\",\"unlink\":\"Убрать ссылку\",\"upload\":\"Загрузка\"},\"list\":{\"bulletedlist\":\"Вставить / удалить маркированный список\",\"numberedlist\":\"Вставить / удалить нумерованный список\"},\"liststyle\":{\"armenian\":\"Армянская нумерация\",\"bulletedTitle\":\"Свойства маркированного списка\",\"circle\":\"Круг\",\"decimal\":\"Десятичные (1, 2, 3, и т.д.)\",\"decimalLeadingZero\":\"Десятичные с ведущим нулём (01, 02, 03, и т.д.)\",\"disc\":\"Окружность\",\"georgian\":\"Грузинская нумерация (ани, бани, гани, и т.д.)\",\"lowerAlpha\":\"Строчные латинские (a, b, c, d, e, и т.д.)\",\"lowerGreek\":\"Строчные греческие (альфа, бета, гамма, и т.д.)\",\"lowerRoman\":\"Строчные римские (i, ii, iii, iv, v, и т.д.)\",\"none\":\"Нет\",\"notset\":\"<не указано>\",\"numberedTitle\":\"Свойства нумерованного списка\",\"square\":\"Квадрат\",\"start\":\"Начиная с\",\"type\":\"Тип\",\"upperAlpha\":\"Заглавные латинские (A, B, C, D, E, и т.д.)\",\"upperRoman\":\"Заглавные римские (I, II, III, IV, V, и т.д.)\",\"validateStartNumber\":\"Первый номер списка должен быть задан обычным целым числом.\"},\"magicline\":{\"title\":\"Вставить здесь параграф\"},\"maximize\":{\"maximize\":\"Развернуть\",\"minimize\":\"Свернуть\"},\"newpage\":{\"toolbar\":\"Новая страница\"},\"pagebreak\":{\"alt\":\"Разрыв страницы\",\"toolbar\":\"Вставить разрыв страницы для печати\"},\"pastetext\":{\"button\":\"Вставить только текст\",\"title\":\"Вставить только текст\"},\"pastefromword\":{\"confirmCleanup\":\"Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?\",\"error\":\"Невозможно очистить вставленные данные из-за внутренней ошибки\",\"title\":\"Вставить из Word\",\"toolbar\":\"Вставить из Word\"},\"preview\":{\"preview\":\"Предварительный просмотр\"},\"print\":{\"toolbar\":\"Печать\"},\"removeformat\":{\"toolbar\":\"Убрать форматирование\"},\"save\":{\"toolbar\":\"Сохранить\"},\"selectall\":{\"toolbar\":\"Выделить все\"},\"showblocks\":{\"toolbar\":\"Отображать блоки\"},\"sourcearea\":{\"toolbar\":\"Источник\"},\"specialchar\":{\"options\":\"Выбор специального символа\",\"title\":\"Выберите специальный символ\",\"toolbar\":\"Вставить специальный символ\"},\"scayt\":{\"btn_about\":\"О SCAYT\",\"btn_dictionaries\":\"Словари\",\"btn_disable\":\"Отключить SCAYT\",\"btn_enable\":\"Включить SCAYT\",\"btn_langs\":\"Языки\",\"btn_options\":\"Настройки\",\"text_title\":\"Проверка орфографии по мере ввода (SCAYT)\"},\"stylescombo\":{\"label\":\"Стили\",\"panelTitle\":\"Стили форматирования\",\"panelTitle1\":\"Стили блока\",\"panelTitle2\":\"Стили элемента\",\"panelTitle3\":\"Стили объекта\"},\"table\":{\"border\":\"Размер границ\",\"caption\":\"Заголовок\",\"cell\":{\"menu\":\"Ячейка\",\"insertBefore\":\"Вставить ячейку слева\",\"insertAfter\":\"Вставить ячейку справа\",\"deleteCell\":\"Удалить ячейки\",\"merge\":\"Объединить ячейки\",\"mergeRight\":\"Объединить с правой\",\"mergeDown\":\"Объединить с нижней\",\"splitHorizontal\":\"Разделить ячейку по горизонтали\",\"splitVertical\":\"Разделить ячейку по вертикали\",\"title\":\"Свойства ячейки\",\"cellType\":\"Тип ячейки\",\"rowSpan\":\"Объединяет строк\",\"colSpan\":\"Объединяет колонок\",\"wordWrap\":\"Перенос по словам\",\"hAlign\":\"Горизонтальное выравнивание\",\"vAlign\":\"Вертикальное выравнивание\",\"alignBaseline\":\"По базовой линии\",\"bgColor\":\"Цвет фона\",\"borderColor\":\"Цвет границ\",\"data\":\"Данные\",\"header\":\"Заголовок\",\"yes\":\"Да\",\"no\":\"Нет\",\"invalidWidth\":\"Ширина ячейки должна быть числом.\",\"invalidHeight\":\"Высота ячейки должна быть числом.\",\"invalidRowSpan\":\"Количество объединяемых строк должно быть задано числом.\",\"invalidColSpan\":\"Количество объединяемых колонок должно быть задано числом.\",\"chooseColor\":\"Выберите\"},\"cellPad\":\"Внутренний отступ ячеек\",\"cellSpace\":\"Внешний отступ ячеек\",\"column\":{\"menu\":\"Колонка\",\"insertBefore\":\"Вставить колонку слева\",\"insertAfter\":\"Вставить колонку справа\",\"deleteColumn\":\"Удалить колонки\"},\"columns\":\"Колонки\",\"deleteTable\":\"Удалить таблицу\",\"headers\":\"Заголовки\",\"headersBoth\":\"Сверху и слева\",\"headersColumn\":\"Левая колонка\",\"headersNone\":\"Без заголовков\",\"headersRow\":\"Верхняя строка\",\"invalidBorder\":\"Размер границ должен быть числом.\",\"invalidCellPadding\":\"Внутренний отступ ячеек (cellpadding) должен быть числом.\",\"invalidCellSpacing\":\"Внешний отступ ячеек (cellspacing) должен быть числом.\",\"invalidCols\":\"Количество столбцов должно быть больше 0.\",\"invalidHeight\":\"Высота таблицы должна быть числом.\",\"invalidRows\":\"Количество строк должно быть больше 0.\",\"invalidWidth\":\"Ширина таблицы должна быть числом.\",\"menu\":\"Свойства таблицы\",\"row\":{\"menu\":\"Строка\",\"insertBefore\":\"Вставить строку сверху\",\"insertAfter\":\"Вставить строку снизу\",\"deleteRow\":\"Удалить строки\"},\"rows\":\"Строки\",\"summary\":\"Итоги\",\"title\":\"Свойства таблицы\",\"toolbar\":\"Таблица\",\"widthPc\":\"процентов\",\"widthPx\":\"пикселей\",\"widthUnit\":\"единица измерения\"},\"undo\":{\"redo\":\"Повторить\",\"undo\":\"Отменить\"},\"wsc\":{\"btnIgnore\":\"Пропустить\",\"btnIgnoreAll\":\"Пропустить всё\",\"btnReplace\":\"Заменить\",\"btnReplaceAll\":\"Заменить всё\",\"btnUndo\":\"Отменить\",\"changeTo\":\"Изменить на\",\"errorLoading\":\"Произошла ошибка при подключении к серверу проверки орфографии: %s.\",\"ieSpellDownload\":\"Модуль проверки орфографии не установлен. Хотите скачать его?\",\"manyChanges\":\"Проверка орфографии завершена. Изменено слов: %1\",\"noChanges\":\"Проверка орфографии завершена. Не изменено ни одного слова\",\"noMispell\":\"Проверка орфографии завершена. Ошибок не найдено\",\"noSuggestions\":\"- Варианты отсутствуют -\",\"notAvailable\":\"Извините, но в данный момент сервис недоступен.\",\"notInDic\":\"Отсутствует в словаре\",\"oneChange\":\"Проверка орфографии завершена. Изменено одно слово\",\"progress\":\"Орфография проверяется...\",\"title\":\"Проверка орфографии\",\"toolbar\":\"Проверить орфографию\"}};"
  },
  {
    "path": "assets/ckeditor/lang/si.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['si']={\"editor\":\"පොහොසත් වචන සංස්කරණ\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"උදව් ලබා ගැනීමට  ALT බොත්තම ඔබන්න\",\"browseServer\":\"සෙවුම් සේවාදායකය\",\"url\":\"URL\",\"protocol\":\"මුලාපත්‍රය\",\"upload\":\"උඩුගතකිරීම\",\"uploadSubmit\":\"සේවාදායකය වෙත යොමුකිරිම\",\"image\":\"රුපය\",\"flash\":\"දීප්තිය\",\"form\":\"පෝරමය\",\"checkbox\":\"ලකුණුකිරීමේ කොටුව\",\"radio\":\"තේරීම් \",\"textField\":\"ලියන ප්‍රදේශය\",\"textarea\":\"අකුරු \",\"hiddenField\":\"සැඟවුණු ප්‍රදේශය\",\"button\":\"බොත්තම\",\"select\":\"තෝරන්න \",\"imageButton\":\"රුප \",\"notSet\":\"<යොදා >\",\"id\":\"අංකය\",\"name\":\"නම\",\"langDir\":\"භාෂා දිශාව\",\"langDirLtr\":\"වමේසිට දකුණුට\",\"langDirRtl\":\"දකුණේ සිට වමට\",\"langCode\":\"භාෂා කේතය\",\"longDescr\":\"සම්පුර්න පැහැදිලි කිරීම\",\"cssClass\":\"විලාශ පත්‍ර පන්තිය\",\"advisoryTitle\":\"උපදෙස් \",\"cssStyle\":\"විලාසය\",\"ok\":\"නිරදි\",\"cancel\":\"අවලංගු කිරීම\",\"close\":\"වැසීම\",\"preview\":\"නැවත \",\"resize\":\"විශාලත්වය නැවත වෙනස් කිරීම\",\"generalTab\":\"පොදු කරුණු.\",\"advancedTab\":\"දීය\",\"validateNumberFailed\":\"මෙම වටිනාකම අංකයක් නොවේ\",\"confirmNewPage\":\"ආරක්ෂා නොකළ සියලුම දත්තයන් මැකියනුලැබේ. ඔබට නව පිටුවක් ලබා ගැනීමට අවශ්‍යද?\",\"confirmCancel\":\"ඇතම් විකල්පයන් වෙනස් කර ඇත. ඔබට මින් නික්මීමට අවශ්‍යද?\",\"options\":\" විකල්ප\",\"target\":\"අරමුණ\",\"targetNew\":\"නව කව්ළුව\",\"targetTop\":\"වැදගත් කව්ළුව\",\"targetSelf\":\"එම කව්ළුව(_තම\\\\\\\\)\",\"targetParent\":\"මව් කව්ළුව(_)\",\"langDirLTR\":\"වමේසිට දකුණුට\",\"langDirRTL\":\"දකුණේ සිට වමට\",\"styles\":\"විලාසය\",\"cssClasses\":\"විලාසපත්‍ර පන්තිය\",\"width\":\"පළල\",\"height\":\"උස\",\"align\":\"ගැලපුම\",\"alignLeft\":\"වම\",\"alignRight\":\"දකුණ\",\"alignCenter\":\"මධ්‍ය\",\"alignJustify\":\"Justify\",\"alignTop\":\"ඉ\",\"alignMiddle\":\"මැද\",\"alignBottom\":\"පහල\",\"alignNone\":\"None\",\"invalidValue\":\"වැරදී වටිනාකමකි\",\"invalidHeight\":\"උස අංකයක් විය යුතුය\",\"invalidWidth\":\"පළල අංකයක් විය යුතුය\",\"invalidCssLength\":\"වටිනාකමක් නිරූපණය කිරීම \\\"%1\\\" ප්‍රදේශය ධන සංක්‍යාත්මක වටිනාකමක් හෝ  නිවරදි නොවන  CSS මිනුම් එකක(px, %, in, cm, mm, em, ex, pt, pc)\",\"invalidHtmlLength\":\"වටිනාකමක් නිරූපණය කිරීම \\\"%1\\\" ප්‍රදේශය ධන සංක්‍යාත්මක වටිනාකමක් හෝ  නිවරදි නොවන  HTML මිනුම් එකක (px හෝ %).\",\"invalidInlineStyle\":\"වටිනාකමක් නිරූපණය කිරීම  පේළි විලාසයයට ආකෘතිය  අනතර්ග විය යුතය  \\\"නම : වටිනාකම\\\", තිත් කොමාවකින් වෙන් වෙන ලද.\",\"cssLengthTooltip\":\"සංක්‍යා ඇතුලත් කිරීමේදී වටිනාකම තිත් ප්‍රමාණය නිවරදි CSS  ඒකක(තිත්, %, අඟල්,සෙමි, mm, em, ex, pt, pc)\",\"unavailable\":\"%1<span පන්තිය=\\\"ළඟා වියහැකි ද බලන්න\\\">, නොමැතිනම්</span>\"},\"about\":{\"copy\":\"පිටපත් අයිතිය සහ පිටපත් කිරීම;$1 .සියලුම හිමිකම් ඇවිරිණි.\",\"dlgTitle\":\"CKEditor ගැන විස්තර\",\"help\":\"උදව් සඳහා $1 \",\"moreInfo\":\"බලපත්‍ර තොරතුරු සදහා කරුණාකර අපගේ විද්‍යුත් ලිපිනයට පිවිසෙන්න:\",\"title\":\"CKEditor ගැන විස්තර\",\"userGuide\":\"CKEditor භාවිතා කිරීම පිළිබඳ \"},\"basicstyles\":{\"bold\":\"තද අකුරින් ලියනලද\",\"italic\":\"බැධීඅකුරින් ලියන ලද\",\"strike\":\"Strikethrough\",\"subscript\":\"Subscript\",\"superscript\":\"Superscript\",\"underline\":\"යටින් ඉරි අදින ලද\"},\"bidi\":{\"ltr\":\"වගන්ති දිශාව වමේ සිට දකුණට\",\"rtl\":\"වගන්ති දිශාව  දකුණේ සිට වමට\"},\"blockquote\":{\"toolbar\":\"උද්ධෘත කොටස\"},\"clipboard\":{\"copy\":\"පිටපත් කරන්න\",\"copyError\":\"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).\",\"cut\":\"කපාගන්න\",\"cutError\":\"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).\",\"paste\":\"අලවන්න\",\"pasteArea\":\"අලවන ප්‍රදේශ\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"අලවන්න\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatic\",\"bgColorTitle\":\"පසුබිම් වර්ණය\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"More Colors...\",\"panelTitle\":\"වර්ණය\",\"textColorTitle\":\"අක්ෂර වර්ණ\"},\"colordialog\":{\"clear\":\"පැහැදිලි\",\"highlight\":\"මතුකර පෙන්වන්න\",\"options\":\"වර්ණ විකල්ප\",\"selected\":\"තෙරු වර්ණ\",\"title\":\"වර්ණ තෝරන්න\"},\"templates\":{\"button\":\"අච්චුව\",\"emptyListMsg\":\"කිසිම අච්චුවක් කලින් තීරණය කර \",\"insertOption\":\"සත්‍ය අන්තර්ගතයන් ප්‍රතිස්ථාපනය කරන්න\",\"options\":\"අච්චු \",\"selectPromptMsg\":\"කරුණාකර සංස්කරණය සදහා අච්චුවක් \",\"title\":\"අන්තර්ගත් අච්චුන්\"},\"contextmenu\":{\"options\":\"අනතර්ග ලේඛණ  විකල්ප\"},\"div\":{\"IdInputLabel\":\"අංකය\",\"advisoryTitleInputLabel\":\"උපදේශාත්මක නාමය\",\"cssClassInputLabel\":\"විලාසපත්‍ර පන්තිය\",\"edit\":\"වෙනස්කිරීම\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"වමේසිට දකුණුට\",\"langDirLabel\":\"භාෂා දිශාව\",\"langDirRTLLabel\":\"දකුණේ සිට වමට\",\"languageCodeInputLabel\":\"භාෂා \",\"remove\":\"ඉවත් කිරීම\",\"styleSelectLabel\":\"විලාසය\",\"title\":\"නිර්මාණය \",\"toolbar\":\"නිර්මාණය \"},\"toolbar\":{\"toolbarCollapse\":\"මෙවලම් තීරුව හැකුලුම.\",\"toolbarExpand\":\"මෙවලම් තීරුව දීගහැරුම\",\"toolbarGroups\":{\"document\":\"ලිපිය\",\"clipboard\":\"ඇමිණුම වෙනස් කිරීම\",\"editing\":\"සංස්කරණය\",\"forms\":\"පෝරමය\",\"basicstyles\":\"මුලික විලාසය\",\"paragraph\":\"චේදය\",\"links\":\"සබැඳිය\",\"insert\":\"ඇතුලත් කිරීම\",\"styles\":\"විලාසය\",\"colors\":\"වර්ණය\",\"tools\":\"මෙවලම්\"},\"toolbars\":\"සංස්කරණ මෙවලම් තීරුව\"},\"elementspath\":{\"eleLabel\":\"මුලද්‍රව්‍ය මාර්ගය\",\"eleTitle\":\"%1 මුල\"},\"find\":{\"find\":\"Find\",\"findOptions\":\"Find Options\",\"findWhat\":\"Find what:\",\"matchCase\":\"Match case\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Match whole word\",\"notFoundMsg\":\"The specified text was not found.\",\"replace\":\"හිලව් කිරීම\",\"replaceAll\":\"සියල්ලම හිලව් කරන්න\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Replace with:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"ආධාරය\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"සැඟවුණු ප්‍රදේශය\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"පිටපත් ප්‍රවේශය\",\"accessAlways\":\"හැමවිටම\",\"accessNever\":\"කිසිදා නොවේ\",\"accessSameDomain\":\"එකම වසමේ\",\"alignAbsBottom\":\"පතුල\",\"alignAbsMiddle\":\"Abs \",\"alignBaseline\":\"පාද රේඛාව\",\"alignTextTop\":\"වගන්තිය ඉහල\",\"bgcolor\":\"පසුබිම් වර්ණය\",\"chkFull\":\"පුර්ණ තිරය සදහා අවසර\",\"chkLoop\":\"පුඩුව\",\"chkMenu\":\"සක්‍රිය බබලන මෙනුව\",\"chkPlay\":\"ස්‌වයංක්‍රිය ක්‍රියාත්මක වීම\",\"flashvars\":\"වෙනස්වන දත්ත\",\"hSpace\":\"HSpace\",\"properties\":\"බබලන ගුණ\",\"propertiesTab\":\"ගුණ\",\"quality\":\"තත්වය\",\"qualityAutoHigh\":\"ස්‌වයංක්‍රිය  \",\"qualityAutoLow\":\" ස්‌වයංක්‍රිය   \",\"qualityBest\":\"වඩාත් ගැලපෙන\",\"qualityHigh\":\"ඉහළ\",\"qualityLow\":\"පහළ\",\"qualityMedium\":\"මධ්‍ය\",\"scale\":\"පරිමාණ\",\"scaleAll\":\"සියල්ල \",\"scaleFit\":\"හරියටම ගැලපෙන\",\"scaleNoBorder\":\"මාඉම් නොමැති\",\"title\":\"බබලන \",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace සංක්‍යාවක් විය යුතුය.\",\"validateSrc\":\"URL හිස් නොවිය \",\"validateVSpace\":\"VSpace සංක්‍යාවක් විය යුතුය\",\"windowMode\":\"ජනෙල ක්‍රමය\",\"windowModeOpaque\":\"විනිවිද පෙනෙන\",\"windowModeTransparent\":\"විනිවිද පෙනෙන\",\"windowModeWindow\":\"ජනෙල\"},\"font\":{\"fontSize\":{\"label\":\"විශාලත්වය\",\"voiceLabel\":\"අක්ෂර විශාලත්වය\",\"panelTitle\":\"අක්ෂර විශාලත්වය\"},\"label\":\"අක්ෂරය\",\"panelTitle\":\"අක්ෂර නාමය\",\"voiceLabel\":\"අක්ෂර\"},\"forms\":{\"button\":{\"title\":\"බොත්තම් ගුණ\",\"text\":\"වගන්තිය(වටිනාකම)\",\"type\":\"වර්ගය\",\"typeBtn\":\"බොත්තම\",\"typeSbm\":\"යොමුකරනවා\",\"typeRst\":\"නැවත ආරම්භකතත්වයට පත් කරනවා\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"ලකුණු කිරීමේ කොටුවේ ලක්ෂණ\",\"radioTitle\":\"Radio Button Properties\",\"value\":\"Value\",\"selected\":\"Selected\",\"required\":\"Required\"},\"form\":{\"title\":\"පෝරමයේ \",\"menu\":\"පෝරමයේ ගුණ/\",\"action\":\"ගන්නා පියවර\",\"method\":\"ක්‍රමය\",\"encoding\":\"කේතීකරණය\"},\"hidden\":{\"title\":\"සැඟවුණු ප්‍රදේශයේ \",\"name\":\"නම\",\"value\":\"Value\"},\"select\":{\"title\":\"තේරීම් ප්‍රදේශයේ \",\"selectInfo\":\"විස්තර තෝරන්න\",\"opAvail\":\"ඉතුරුවී ඇති වීකල්ප\",\"value\":\"Value\",\"size\":\"විශාලත්වය\",\"lines\":\"lines\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Value\",\"btnAdd\":\"Add\",\"btnModify\":\"Modify\",\"btnUp\":\"Up\",\"btnDown\":\"Down\",\"btnSetValue\":\"Set as selected value\",\"btnDelete\":\"මකා දැම්ම\"},\"textarea\":{\"title\":\"Textarea Properties\",\"cols\":\"සිරස් \",\"rows\":\"Rows\"},\"textfield\":{\"title\":\"Text Field Properties\",\"name\":\"නම\",\"value\":\"Value\",\"charWidth\":\"Character Width\",\"maxChars\":\"Maximum Characters\",\"required\":\"Required\",\"type\":\"වර්ගය\",\"typeText\":\"Text\",\"typePass\":\"Password\",\"typeEmail\":\"Email\",\"typeSearch\":\"Search\",\"typeTel\":\"Telephone Number\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"ආකෘතිය\",\"panelTitle\":\"චේදයේ \",\"tag_address\":\"ලිපිනය\",\"tag_div\":\"සාමාන්‍ය(DIV)\",\"tag_h1\":\"ශීර්ෂය 1\",\"tag_h2\":\"ශීර්ෂය 2\",\"tag_h3\":\"ශීර්ෂය 3\",\"tag_h4\":\"ශීර්ෂය 4\",\"tag_h5\":\"ශීර්ෂය 5\",\"tag_h6\":\"ශීර්ෂය 6\",\"tag_p\":\"සාමාන්‍ය\",\"tag_pre\":\"ආකෘතියන්\"},\"horizontalrule\":{\"toolbar\":\"තිරස් රේඛාවක් ඇතුලත් කරන්න\"},\"iframe\":{\"border\":\"සැකිල්ලේ කඩයිම් \",\"noUrl\":\"කරුණාකර රුපයේ URL ලියන්න\",\"scrolling\":\"සක්ක්‍රිය කරන්න\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"විකල්ප \",\"border\":\"සීමාවවල \",\"btnUpload\":\"සේවාදායකය වෙත යොමුකිරිම\",\"button2Img\":\"ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්‍යද?\",\"hSpace\":\"HSpace\",\"img2Button\":\"ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්‍යද?\",\"infoTab\":\"රුපයේ තොරතුරු\",\"linkTab\":\"සබැඳිය\",\"lockRatio\":\"නවතන අනුපාතය \",\"menu\":\"රුපයේ ගුණ\",\"resetSize\":\"නැවතත් විශාලත්වය වෙනස් කිරීම\",\"title\":\"රුපයේ \",\"titleButton\":\"රුප බොත්තමේ ගුණ\",\"upload\":\"උඩුගතකිරීම\",\"urlMissing\":\"රුප මුලාශ්‍ර URL නැත.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"මාඉම් සම්පුර්ණ සංක්‍යාවක් විය යුතුය.\",\"validateHSpace\":\"HSpace  සම්පුර්ණ සංක්‍යාවක් විය යුතුය\",\"validateVSpace\":\"VSpace සම්පුර්ණ සංක්‍යාවක් විය යුතුය.\"},\"indent\":{\"indent\":\"අතර පරතරය වැඩිකරන්න\",\"outdent\":\"අතර පරතරය අඩුකරන්න\"},\"smiley\":{\"options\":\"හාස්‍ය විකල්ප\",\"title\":\"හාස්‍යන් ඇතුලත් කිරීම\",\"toolbar\":\"හාස්‍යන්\"},\"justify\":{\"block\":\"Justify\",\"center\":\"මධ්‍ය\",\"left\":\"Align Left\",\"right\":\"Align Right\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"ප්‍රවේශ  යතුර\",\"advanced\":\"දීය\",\"advisoryContentType\":\"උපදේශාත්මක අන්තර්ගත ආකාරය\",\"advisoryTitle\":\"උපදේශාත්මක නාමය\",\"anchor\":{\"toolbar\":\"ආධාරය\",\"menu\":\"ආධාරය වෙනස් කිරීම\",\"title\":\"ආධාරක \",\"name\":\"ආධාරකයේ නාමය\",\"errorName\":\"කරුණාකර ආධාරකයේ නාමය ඇතුල් කරන්න\",\"remove\":\"ආධාරකය ඉවත් කිරීම\"},\"anchorId\":\"By Element Id\",\"anchorName\":\"By Anchor Name\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"විලාසපත්‍ර පන්තිය\",\"emailAddress\":\"E-Mail Address\",\"emailBody\":\"Message Body\",\"emailSubject\":\"Message Subject\",\"id\":\"අංකය\",\"info\":\"Link Info\",\"langCode\":\"භාෂා කේතය\",\"langDir\":\"භාෂා දිශාව\",\"langDirLTR\":\"වමේසිට දකුණුට\",\"langDirRTL\":\"දකුණේ සිට වමට\",\"menu\":\"Edit Link\",\"name\":\"නම\",\"noAnchors\":\"(No anchors available in the document)\",\"noEmail\":\"Please type the e-mail address\",\"noUrl\":\"Please type the link URL\",\"other\":\"<other>\",\"popupDependent\":\"Dependent (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Full Screen (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Relationship\",\"selectAnchor\":\"Select an Anchor\",\"styles\":\"විලාසය\",\"tabIndex\":\"Tab Index\",\"target\":\"අරමුණ\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Popup Window Name\",\"title\":\"සබැඳිය\",\"toAnchor\":\"Link to anchor in the text\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"සබැඳිය\",\"type\":\"Link Type\",\"unlink\":\"Unlink\",\"upload\":\"උඩුගතකිරීම\"},\"list\":{\"bulletedlist\":\"ඇතුලත් / ඉවත් කිරීම ලඉස්තුව\",\"numberedlist\":\"ඇතුලත් / ඉවත් කිරීම අන්න්කිත ලඉස්තුව\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"කිසිවක්ම නොවේ\",\"notset\":\"<යොදා >\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"වර්ගය\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"චේදය ඇතුලත් කරන්න\"},\"maximize\":{\"maximize\":\"විශාල කිරීම\",\"minimize\":\"කුඩා කිරීම\"},\"newpage\":{\"toolbar\":\"නව පිටුවක්\"},\"pagebreak\":{\"alt\":\"පිටු බිදුම\",\"toolbar\":\"මුද්‍රණය සඳහා පිටු බිදුමක් ඇතුලත් කරන්න\"},\"pastetext\":{\"button\":\"සාමාන්‍ය අක්ෂර ලෙස අලවන්න\",\"title\":\"සාමාන්‍ය අක්ෂර ලෙස අලවන්න\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"වචන වලින් අලවන්න\",\"toolbar\":\"වචන වලින් අලවන්න\"},\"preview\":{\"preview\":\"නැවත \"},\"print\":{\"toolbar\":\"මුද්‍රණය කරන්න\"},\"removeformat\":{\"toolbar\":\"සැකසීම වෙනස් කරන්න\"},\"save\":{\"toolbar\":\"ආරක්ෂා කරන්න\"},\"selectall\":{\"toolbar\":\"සියල්ලම \"},\"showblocks\":{\"toolbar\":\"කොටස පෙන්නන්න\"},\"sourcearea\":{\"toolbar\":\"මුලාශ්‍රය\"},\"specialchar\":{\"options\":\"විශේෂ  ගුණාංග වීකල්ප\",\"title\":\"විශේෂ  ගුණාංග \",\"toolbar\":\"විශේෂ ගුණාංග ඇතුලත් \"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"විලාසය\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"සීමාවවල විශාලත්වය\",\"caption\":\"Caption\",\"cell\":{\"menu\":\"කොටුව\",\"insertBefore\":\"පෙර කොටුවක් ඇතුල්කිරිම\",\"insertAfter\":\"පසුව කොටුවක් ඇතුලත් \",\"deleteCell\":\"කොටුව මැකීම\",\"merge\":\"කොටු එකට යාකිරිම\",\"mergeRight\":\"දකුණට \",\"mergeDown\":\"පහලට \",\"splitHorizontal\":\"තිරස්ව කොටු පැතිරීම\",\"splitVertical\":\"සිරස්ව කොටු පැතිරීම\",\"title\":\"කොටු \",\"cellType\":\"කොටු වර්ගය\",\"rowSpan\":\"පේළි පළල\",\"colSpan\":\"සිරස් පළල\",\"wordWrap\":\"වචන ගැලපුම\",\"hAlign\":\"තිරස්ව \",\"vAlign\":\"සිරස්ව \",\"alignBaseline\":\"පාද රේඛාව\",\"bgColor\":\"පසුබිම් වර්ණය\",\"borderColor\":\"මායිම් \",\"data\":\"Data\",\"header\":\"ශීර්ෂක\",\"yes\":\"ඔව්\",\"no\":\"නැත\",\"invalidWidth\":\"කොටු පළල සංඛ්‍ය්ත්මක වටිනාකමක් විය යුතුය\",\"invalidHeight\":\"කොටු උස සංඛ්‍ය්ත්මක වටිනාකමක් විය යුතුය\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"තෝරන්න\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Delete Columns\"},\"columns\":\"සිරස් \",\"deleteTable\":\"වගුව මකන්න\",\"headers\":\"ශීර්ෂක\",\"headersBoth\":\"දෙකම\",\"headersColumn\":\"පළමූ සිරස් තීරුව\",\"headersNone\":\"කිසිවක්ම නොවේ\",\"headersRow\":\"පළමූ පේළිය\",\"invalidBorder\":\"Border size must be a number.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Cell spacing must be a positive number.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Table height must be a number.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Table width must be a number.\",\"menu\":\"Table Properties\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Delete Rows\"},\"rows\":\"Rows\",\"summary\":\"Summary\",\"title\":\"Table Properties\",\"toolbar\":\"Table\",\"widthPc\":\"percent\",\"widthPx\":\"pixels\",\"widthUnit\":\"width unit\"},\"undo\":{\"redo\":\"නැවත කිරීම\",\"undo\":\"වෙනස් කිරීම\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/sk.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['sk']={\"editor\":\"Editor formátovaného textu\",\"editorPanel\":\"Panel editora formátovaného textu\",\"common\":{\"editorHelp\":\"Stlačením ALT 0 spustiť pomocníka\",\"browseServer\":\"Prehliadať server\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Odoslať\",\"uploadSubmit\":\"Odoslať na server\",\"image\":\"Obrázok\",\"flash\":\"Flash\",\"form\":\"Formulár\",\"checkbox\":\"Zaškrtávacie pole\",\"radio\":\"Prepínač\",\"textField\":\"Textové pole\",\"textarea\":\"Textová oblasť\",\"hiddenField\":\"Skryté pole\",\"button\":\"Tlačidlo\",\"select\":\"Rozbaľovací zoznam\",\"imageButton\":\"Obrázkové tlačidlo\",\"notSet\":\"<nenastavené>\",\"id\":\"Id\",\"name\":\"Meno\",\"langDir\":\"Orientácia jazyka\",\"langDirLtr\":\"Zľava doprava (LTR)\",\"langDirRtl\":\"Sprava doľava (RTL)\",\"langCode\":\"Kód jazyka\",\"longDescr\":\"Dlhý popis URL\",\"cssClass\":\"Trieda štýlu\",\"advisoryTitle\":\"Pomocný titulok\",\"cssStyle\":\"Štýl\",\"ok\":\"OK\",\"cancel\":\"Zrušiť\",\"close\":\"Zatvorit\",\"preview\":\"Náhľad\",\"resize\":\"Zmeniť veľkosť\",\"generalTab\":\"Hlavné\",\"advancedTab\":\"Rozšírené\",\"validateNumberFailed\":\"Hodnota nie je číslo.\",\"confirmNewPage\":\"Prajete si načítat novú stránku? Všetky neuložené zmeny budú stratené. \",\"confirmCancel\":\"Niektore možnosti boli zmenené. Naozaj chcete zavrieť okno?\",\"options\":\"Možnosti\",\"target\":\"Cieľ\",\"targetNew\":\"Nové okno (_blank)\",\"targetTop\":\"Najvrchnejšie okno (_top)\",\"targetSelf\":\"To isté okno (_self)\",\"targetParent\":\"Rodičovské okno (_parent)\",\"langDirLTR\":\"Zľava doprava (LTR)\",\"langDirRTL\":\"Sprava doľava (RTL)\",\"styles\":\"Štýl\",\"cssClasses\":\"Triedy štýlu\",\"width\":\"Šírka\",\"height\":\"Výška\",\"align\":\"Zarovnanie\",\"alignLeft\":\"Vľavo\",\"alignRight\":\"Vpravo\",\"alignCenter\":\"Na stred\",\"alignJustify\":\"Zarovnať do bloku\",\"alignTop\":\"Nahor\",\"alignMiddle\":\"Na stred\",\"alignBottom\":\"Dole\",\"alignNone\":\"Žiadne\",\"invalidValue\":\"Neplatná hodnota.\",\"invalidHeight\":\"Výška musí byť číslo.\",\"invalidWidth\":\"Šírka musí byť číslo.\",\"invalidCssLength\":\"Špecifikovaná hodnota pre pole \\\"%1\\\" musí byť kladné číslo s alebo bez platnej CSS mernej jednotky (px, %, in, cm, mm, em, ex, pt alebo pc).\",\"invalidHtmlLength\":\"Špecifikovaná hodnota pre pole \\\"%1\\\" musí byť kladné číslo s alebo bez platnej HTML mernej jednotky (px alebo %).\",\"invalidInlineStyle\":\"Zadaná hodnota pre inline štýl musí pozostávať s jedného, alebo viac dvojíc formátu \\\"názov: hodnota\\\", oddelených bodkočiarkou.\",\"cssLengthTooltip\":\"Vložte číslo pre hodnotu v pixeloch alebo číslo so správnou CSS jednotou (px, %, in, cm, mm, em, ex, pt alebo pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nedostupný</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Všetky práva vyhradené.\",\"dlgTitle\":\"O CKEditor-e\",\"help\":\"Zaškrtnite $1 pre pomoc.\",\"moreInfo\":\"Pre informácie o licenciách, prosíme, navštívte našu web stránku:\",\"title\":\"O CKEditor-e\",\"userGuide\":\"Používateľská príručka KCEditor-a\"},\"basicstyles\":{\"bold\":\"Tučné\",\"italic\":\"Kurzíva\",\"strike\":\"Prečiarknuté\",\"subscript\":\"Dolný index\",\"superscript\":\"Horný index\",\"underline\":\"Podčiarknuté\"},\"bidi\":{\"ltr\":\"Smer textu zľava doprava\",\"rtl\":\"Smer textu sprava doľava\"},\"blockquote\":{\"toolbar\":\"Citácia\"},\"clipboard\":{\"copy\":\"Kopírovať\",\"copyError\":\"Bezpečnostné nastavenia vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Použite na to klávesnicu (Ctrl/Cmd+C).\",\"cut\":\"Vystrihnúť\",\"cutError\":\"Bezpečnostné nastavenia vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Použite na to klávesnicu (Ctrl/Cmd+X).\",\"paste\":\"Vložiť\",\"pasteArea\":\"Miesto na vloženie\",\"pasteMsg\":\"Použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) vložte text do rámčeka a stlačte OK.\",\"securityMsg\":\"Kvôli bezpečnostným nastaveniam vášho prehliadača editor nemôže pristupovať k schránke na kopírovanie priamo. Vložte to preto do tohto okna.\",\"title\":\"Vložiť\"},\"button\":{\"selectedLabel\":\"%1 (Vybrané)\"},\"colorbutton\":{\"auto\":\"Automaticky\",\"bgColorTitle\":\"Farba pozadia\",\"colors\":{\"000\":\"Čierna\",\"800000\":\"Gaštanová\",\"8B4513\":\"Sedlová hnedá\",\"2F4F4F\":\"Tmavo bridlicovo sivá\",\"008080\":\"Modrozelená\",\"000080\":\"Tmavomodrá\",\"4B0082\":\"Indigo\",\"696969\":\"Tmavá sivá\",\"B22222\":\"Ohňová tehlová\",\"A52A2A\":\"Hnedá\",\"DAA520\":\"Zlatobyľ\",\"006400\":\"Tmavá zelená\",\"40E0D0\":\"Tyrkysová\",\"0000CD\":\"Stredná modrá\",\"800080\":\"Purpurová\",\"808080\":\"Sivá\",\"F00\":\"Červená\",\"FF8C00\":\"Tmavá oranžová\",\"FFD700\":\"Zlatá\",\"008000\":\"Zelená\",\"0FF\":\"Azúrová\",\"00F\":\"Modrá\",\"EE82EE\":\"Fialová\",\"A9A9A9\":\"Tmavá sivá\",\"FFA07A\":\"Svetlá lososová\",\"FFA500\":\"Oranžová\",\"FFFF00\":\"Žltá\",\"00FF00\":\"Vápenná\",\"AFEEEE\":\"Svetlá tyrkysová\",\"ADD8E6\":\"Svetlá modrá\",\"DDA0DD\":\"Slivková\",\"D3D3D3\":\"Svetlá sivá\",\"FFF0F5\":\"Levanduľovo červená\",\"FAEBD7\":\"Antická biela\",\"FFFFE0\":\"Svetlá žltá\",\"F0FFF0\":\"Medová\",\"F0FFFF\":\"Azúrová\",\"F0F8FF\":\"Alicovo modrá\",\"E6E6FA\":\"Levanduľová\",\"FFF\":\"Biela\"},\"more\":\"Viac farieb...\",\"panelTitle\":\"Farby\",\"textColorTitle\":\"Farba textu\"},\"colordialog\":{\"clear\":\"Vyčistiť\",\"highlight\":\"Zvýrazniť\",\"options\":\"Možnosti farby\",\"selected\":\"Vybraná farba\",\"title\":\"Vybrať farbu\"},\"templates\":{\"button\":\"Šablóny\",\"emptyListMsg\":\"(Žiadne šablóny nedefinované)\",\"insertOption\":\"Nahradiť aktuálny obsah\",\"options\":\"Možnosti šablóny\",\"selectPromptMsg\":\"Prosím vyberte šablónu na otvorenie v editore\",\"title\":\"Šablóny obsahu\"},\"contextmenu\":{\"options\":\"Možnosti kontextového menu\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Pomocný titulok\",\"cssClassInputLabel\":\"Triedy štýlu\",\"edit\":\"Upraviť Div\",\"inlineStyleInputLabel\":\"Inline štýl\",\"langDirLTRLabel\":\"Zľava doprava (LTR)\",\"langDirLabel\":\"Smer jazyka\",\"langDirRTLLabel\":\"Zprava doľava (RTL)\",\"languageCodeInputLabel\":\"Kód jazyka\",\"remove\":\"Odstrániť Div\",\"styleSelectLabel\":\"Štýl\",\"title\":\"Vytvoriť Div kontajner\",\"toolbar\":\"Vytvoriť Div kontajner\"},\"toolbar\":{\"toolbarCollapse\":\"Zbaliť lištu nástrojov\",\"toolbarExpand\":\"Rozbaliť lištu nástrojov\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Schránka pre kopírovanie/Späť\",\"editing\":\"Upravovanie\",\"forms\":\"Formuláre\",\"basicstyles\":\"Základné štýly\",\"paragraph\":\"Odsek\",\"links\":\"Odkazy\",\"insert\":\"Vložiť\",\"styles\":\"Štýly\",\"colors\":\"Farby\",\"tools\":\"Nástroje\"},\"toolbars\":\"Lišty nástrojov editora\"},\"elementspath\":{\"eleLabel\":\"Cesta prvkov\",\"eleTitle\":\"%1 prvok\"},\"find\":{\"find\":\"Vyhľadať\",\"findOptions\":\"Možnosti vyhľadávania\",\"findWhat\":\"Čo hľadať:\",\"matchCase\":\"Rozlišovať malé a veľké písmená\",\"matchCyclic\":\"Po dosiahnutí konca pokračovať od začiatku\",\"matchWord\":\"Len celé slová\",\"notFoundMsg\":\"Hľadaný text nebol nájdený.\",\"replace\":\"Nahradiť\",\"replaceAll\":\"Nahradiť všetko\",\"replaceSuccessMsg\":\"%1 výskyt(ov) nahradených.\",\"replaceWith\":\"Čím nahradiť:\",\"title\":\"Vyhľadať a nahradiť\"},\"fakeobjects\":{\"anchor\":\"Kotva\",\"flash\":\"Flash animácia\",\"hiddenfield\":\"Skryté pole\",\"iframe\":\"IFrame\",\"unknown\":\"Neznámy objekt\"},\"flash\":{\"access\":\"Prístup skriptu\",\"accessAlways\":\"Vždy\",\"accessNever\":\"Nikdy\",\"accessSameDomain\":\"Rovnaká doména\",\"alignAbsBottom\":\"Úplne dole\",\"alignAbsMiddle\":\"Do stredu\",\"alignBaseline\":\"Na základnú čiaru\",\"alignTextTop\":\"Na horný okraj textu\",\"bgcolor\":\"Farba pozadia\",\"chkFull\":\"Povoliť zobrazenie na celú obrazovku (fullscreen)\",\"chkLoop\":\"Opakovanie\",\"chkMenu\":\"Povoliť Flash Menu\",\"chkPlay\":\"Automatické prehrávanie\",\"flashvars\":\"Premenné pre Flash\",\"hSpace\":\"H-medzera\",\"properties\":\"Vlastnosti Flashu\",\"propertiesTab\":\"Vlastnosti\",\"quality\":\"Kvalita\",\"qualityAutoHigh\":\"Automaticky vysoká\",\"qualityAutoLow\":\"Automaticky nízka\",\"qualityBest\":\"Najlepšia\",\"qualityHigh\":\"Vysoká\",\"qualityLow\":\"Nízka\",\"qualityMedium\":\"Stredná\",\"scale\":\"Mierka\",\"scaleAll\":\"Zobraziť všetko\",\"scaleFit\":\"Roztiahnuť, aby sedelo presne\",\"scaleNoBorder\":\"Bez okrajov\",\"title\":\"Vlastnosti Flashu\",\"vSpace\":\"V-medzera\",\"validateHSpace\":\"H-medzera musí byť číslo.\",\"validateSrc\":\"URL nesmie byť prázdne.\",\"validateVSpace\":\"V-medzera musí byť číslo\",\"windowMode\":\"Mód okna\",\"windowModeOpaque\":\"Nepriehľadný\",\"windowModeTransparent\":\"Priehľadný\",\"windowModeWindow\":\"Okno\"},\"font\":{\"fontSize\":{\"label\":\"Veľkosť\",\"voiceLabel\":\"Veľkosť písma\",\"panelTitle\":\"Veľkosť písma\"},\"label\":\"Písmo\",\"panelTitle\":\"Názov písma\",\"voiceLabel\":\"Písmo\"},\"forms\":{\"button\":{\"title\":\"Vlastnosti tlačidla\",\"text\":\"Text (Hodnota)\",\"type\":\"Typ\",\"typeBtn\":\"Tlačidlo\",\"typeSbm\":\"Odoslať\",\"typeRst\":\"Resetovať\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Vlastnosti zaškrtávacieho políčka\",\"radioTitle\":\"Vlastnosti prepínača (radio button)\",\"value\":\"Hodnota\",\"selected\":\"Vybrané (selected)\",\"required\":\"Required\"},\"form\":{\"title\":\"Vlastnosti formulára\",\"menu\":\"Vlastnosti formulára\",\"action\":\"Akcia (action)\",\"method\":\"Metóda (method)\",\"encoding\":\"Kódovanie (encoding)\"},\"hidden\":{\"title\":\"Vlastnosti skrytého poľa\",\"name\":\"Názov (name)\",\"value\":\"Hodnota\"},\"select\":{\"title\":\"Vlastnosti rozbaľovacieho zoznamu\",\"selectInfo\":\"Informácie o výbere\",\"opAvail\":\"Dostupné možnosti\",\"value\":\"Hodnota\",\"size\":\"Veľkosť\",\"lines\":\"riadkov\",\"chkMulti\":\"Povoliť viacnásobný výber\",\"required\":\"Required\",\"opText\":\"Text\",\"opValue\":\"Hodnota\",\"btnAdd\":\"Pridať\",\"btnModify\":\"Upraviť\",\"btnUp\":\"Hore\",\"btnDown\":\"Dole\",\"btnSetValue\":\"Nastaviť ako vybranú hodnotu\",\"btnDelete\":\"Vymazať\"},\"textarea\":{\"title\":\"Vlastnosti textovej oblasti (textarea)\",\"cols\":\"Stĺpcov\",\"rows\":\"Riadkov\"},\"textfield\":{\"title\":\"Vlastnosti textového poľa\",\"name\":\"Názov (name)\",\"value\":\"Hodnota\",\"charWidth\":\"Šírka poľa (podľa znakov)\",\"maxChars\":\"Maximálny počet znakov\",\"required\":\"Required\",\"type\":\"Typ\",\"typeText\":\"Text\",\"typePass\":\"Heslo\",\"typeEmail\":\"Email\",\"typeSearch\":\"Hľadať\",\"typeTel\":\"Telefónne číslo\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formát\",\"panelTitle\":\"Odsek\",\"tag_address\":\"Adresa\",\"tag_div\":\"Normálny (DIV)\",\"tag_h1\":\"Nadpis 1\",\"tag_h2\":\"Nadpis 2\",\"tag_h3\":\"Nadpis 3\",\"tag_h4\":\"Nadpis 4\",\"tag_h5\":\"Nadpis 5\",\"tag_h6\":\"Nadpis 6\",\"tag_p\":\"Normálny\",\"tag_pre\":\"Formátovaný\"},\"horizontalrule\":{\"toolbar\":\"Vložiť vodorovnú čiaru\"},\"iframe\":{\"border\":\"Zobraziť rám frame-u\",\"noUrl\":\"Prosím, vložte URL iframe\",\"scrolling\":\"Povoliť skrolovanie\",\"title\":\"Vlastnosti IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatívny text\",\"border\":\"Rám (border)\",\"btnUpload\":\"Odoslať to na server\",\"button2Img\":\"Chcete zmeniť vybrané obrázkové tlačidlo na jednoduchý obrázok?\",\"hSpace\":\"H-medzera\",\"img2Button\":\"Chcete zmeniť vybraný obrázok na obrázkové tlačidlo?\",\"infoTab\":\"Informácie o obrázku\",\"linkTab\":\"Odkaz\",\"lockRatio\":\"Pomer zámky\",\"menu\":\"Vlastnosti obrázka\",\"resetSize\":\"Pôvodná veľkosť\",\"title\":\"Vlastnosti obrázka\",\"titleButton\":\"Vlastnosti obrázkového tlačidla\",\"upload\":\"Nahrať\",\"urlMissing\":\"Chýba URL zdroja obrázka.\",\"vSpace\":\"V-medzera\",\"validateBorder\":\"Rám (border) musí byť celé číslo.\",\"validateHSpace\":\"H-medzera musí byť celé číslo.\",\"validateVSpace\":\"V-medzera musí byť celé číslo.\"},\"indent\":{\"indent\":\"Zväčšiť odsadenie\",\"outdent\":\"Zmenšiť odsadenie\"},\"smiley\":{\"options\":\"Možnosti smajlíkov\",\"title\":\"Vložiť smajlíka\",\"toolbar\":\"Smajlíky\"},\"justify\":{\"block\":\"Zarovnať do bloku\",\"center\":\"Zarovnať na stred\",\"left\":\"Zarovnať vľavo\",\"right\":\"Zarovnať vpravo\"},\"language\":{\"button\":\"Nastaviť jazyk\",\"remove\":\"Odstrániť jazyk\"},\"link\":{\"acccessKey\":\"Prístupový kľúč\",\"advanced\":\"Rozšírené\",\"advisoryContentType\":\"Pomocný typ obsahu\",\"advisoryTitle\":\"Pomocný titulok\",\"anchor\":{\"toolbar\":\"Kotva\",\"menu\":\"Upraviť kotvu\",\"title\":\"Vlastnosti kotvy\",\"name\":\"Názov kotvy\",\"errorName\":\"Zadajte prosím názov kotvy\",\"remove\":\"Odstrániť kotvu\"},\"anchorId\":\"Podľa Id objektu\",\"anchorName\":\"Podľa mena kotvy\",\"charset\":\"Priradená znaková sada\",\"cssClasses\":\"Triedy štýlu\",\"emailAddress\":\"E-Mailová adresa\",\"emailBody\":\"Telo správy\",\"emailSubject\":\"Predmet správy\",\"id\":\"Id\",\"info\":\"Informácie o odkaze\",\"langCode\":\"Orientácia jazyka\",\"langDir\":\"Orientácia jazyka\",\"langDirLTR\":\"Zľava doprava (LTR)\",\"langDirRTL\":\"Sprava doľava (RTL)\",\"menu\":\"Upraviť odkaz\",\"name\":\"Názov\",\"noAnchors\":\"(V dokumente nie sú dostupné žiadne kotvy)\",\"noEmail\":\"Zadajte prosím e-mailovú adresu\",\"noUrl\":\"Zadajte prosím URL odkazu\",\"other\":\"<iný>\",\"popupDependent\":\"Závislosť (Netscape)\",\"popupFeatures\":\"Vlastnosti vyskakovacieho okna\",\"popupFullScreen\":\"Celá obrazovka (IE)\",\"popupLeft\":\"Ľavý okraj\",\"popupLocationBar\":\"Panel umiestnenia (location bar)\",\"popupMenuBar\":\"Panel ponuky (menu bar)\",\"popupResizable\":\"Meniteľná veľkosť (resizable)\",\"popupScrollBars\":\"Posuvníky (scroll bars)\",\"popupStatusBar\":\"Stavový riadok (status bar)\",\"popupToolbar\":\"Panel nástrojov (toolbar)\",\"popupTop\":\"Horný okraj\",\"rel\":\"Vzťah (rel)\",\"selectAnchor\":\"Vybrať kotvu\",\"styles\":\"Štýl\",\"tabIndex\":\"Poradie prvku (tab index)\",\"target\":\"Cieľ\",\"targetFrame\":\"<rámec>\",\"targetFrameName\":\"Názov rámu cieľa\",\"targetPopup\":\"<vyskakovacie okno>\",\"targetPopupName\":\"Názov vyskakovacieho okna\",\"title\":\"Odkaz\",\"toAnchor\":\"Odkaz na kotvu v texte\",\"toEmail\":\"E-mail\",\"toUrl\":\"URL\",\"toolbar\":\"Odkaz\",\"type\":\"Typ odkazu\",\"unlink\":\"Odstrániť odkaz\",\"upload\":\"Nahrať\"},\"list\":{\"bulletedlist\":\"Vložiť/odstrániť zoznam s odrážkami\",\"numberedlist\":\"Vložiť/odstrániť číslovaný zoznam\"},\"liststyle\":{\"armenian\":\"Arménske číslovanie\",\"bulletedTitle\":\"Vlastnosti odrážkového zoznamu\",\"circle\":\"Kruh\",\"decimal\":\"Číselné (1, 2, 3, atď.)\",\"decimalLeadingZero\":\"Číselné s nulou (01, 02, 03, atď.)\",\"disc\":\"Disk\",\"georgian\":\"Gruzínske číslovanie (an, ban, gan, atď.)\",\"lowerAlpha\":\"Malé latinské (a, b, c, d, e, atď.)\",\"lowerGreek\":\"Malé grécke (alfa, beta, gama, atď.)\",\"lowerRoman\":\"Malé rímske (i, ii, iii, iv, v, atď.)\",\"none\":\"Nič\",\"notset\":\"<nenastavené>\",\"numberedTitle\":\"Vlastnosti číselného zoznamu\",\"square\":\"Štvorec\",\"start\":\"Začiatok\",\"type\":\"Typ\",\"upperAlpha\":\"Veľké latinské (A, B, C, D, E, atď.)\",\"upperRoman\":\"Veľké rímske (I, II, III, IV, V, atď.)\",\"validateStartNumber\":\"Začiatočné číslo číselného zoznamu musí byť celé číslo.\"},\"magicline\":{\"title\":\"Odsek vložiť sem\"},\"maximize\":{\"maximize\":\"Maximalizovať\",\"minimize\":\"Minimalizovať\"},\"newpage\":{\"toolbar\":\"Nová stránka\"},\"pagebreak\":{\"alt\":\"Zalomenie strany\",\"toolbar\":\"Vložiť oddeľovač stránky pre tlač\"},\"pastetext\":{\"button\":\"Vložiť ako čistý text\",\"title\":\"Vložiť ako čistý text\"},\"pastefromword\":{\"confirmCleanup\":\"Zdá sa, že vkladaný text pochádza z programu MS Word. Chcete ho pred vkladaním automaticky vyčistiť?\",\"error\":\"Kvôli internej chybe nebolo možné vložené dáta vyčistiť\",\"title\":\"Vložiť z Wordu\",\"toolbar\":\"Vložiť z Wordu\"},\"preview\":{\"preview\":\"Náhľad\"},\"print\":{\"toolbar\":\"Tlač\"},\"removeformat\":{\"toolbar\":\"Odstrániť formátovanie\"},\"save\":{\"toolbar\":\"Uložiť\"},\"selectall\":{\"toolbar\":\"Vybrať všetko\"},\"showblocks\":{\"toolbar\":\"Ukázať bloky\"},\"sourcearea\":{\"toolbar\":\"Zdroj\"},\"specialchar\":{\"options\":\"Možnosti špeciálneho znaku\",\"title\":\"Výber špeciálneho znaku\",\"toolbar\":\"Vložiť špeciálny znak\"},\"scayt\":{\"btn_about\":\"O KPPP (Kontrola pravopisu počas písania)\",\"btn_dictionaries\":\"Slovníky\",\"btn_disable\":\"Zakázať  KPPP (Kontrola pravopisu počas písania)\",\"btn_enable\":\"Povoliť KPPP (Kontrola pravopisu počas písania)\",\"btn_langs\":\"Jazyky\",\"btn_options\":\"Možnosti\",\"text_title\":\"Kontrola pravopisu počas písania\"},\"stylescombo\":{\"label\":\"Štýly\",\"panelTitle\":\"Formátovanie štýlov\",\"panelTitle1\":\"Štýly bloku\",\"panelTitle2\":\"Vnútroriadkové (inline) štýly\",\"panelTitle3\":\"Štýly objeku\"},\"table\":{\"border\":\"Šírka orámovania\",\"caption\":\"Popis\",\"cell\":{\"menu\":\"Bunka\",\"insertBefore\":\"Vložiť bunku pred\",\"insertAfter\":\"Vložiť bunku za\",\"deleteCell\":\"Vymazať bunky\",\"merge\":\"Zlúčiť bunky\",\"mergeRight\":\"Zlúčiť doprava\",\"mergeDown\":\"Zlúčiť dole\",\"splitHorizontal\":\"Rozdeliť bunky horizontálne\",\"splitVertical\":\"Rozdeliť bunky vertikálne\",\"title\":\"Vlastnosti bunky\",\"cellType\":\"Typ bunky\",\"rowSpan\":\"Rozsah riadkov\",\"colSpan\":\"Rozsah stĺpcov\",\"wordWrap\":\"Zalamovanie riadkov\",\"hAlign\":\"Horizontálne zarovnanie\",\"vAlign\":\"Vertikálne zarovnanie\",\"alignBaseline\":\"Základná čiara (baseline)\",\"bgColor\":\"Farba pozadia\",\"borderColor\":\"Farba orámovania\",\"data\":\"Dáta\",\"header\":\"Hlavička\",\"yes\":\"Áno\",\"no\":\"Nie\",\"invalidWidth\":\"Šírka bunky musí byť číslo.\",\"invalidHeight\":\"Výška bunky musí byť číslo.\",\"invalidRowSpan\":\"Rozsah riadkov musí byť celé číslo.\",\"invalidColSpan\":\"Rozsah stĺpcov musí byť celé číslo.\",\"chooseColor\":\"Vybrať\"},\"cellPad\":\"Odsadenie obsahu (cell padding)\",\"cellSpace\":\"Vzdialenosť buniek (cell spacing)\",\"column\":{\"menu\":\"Stĺpec\",\"insertBefore\":\"Vložiť stĺpec pred\",\"insertAfter\":\"Vložiť stĺpec po\",\"deleteColumn\":\"Zmazať stĺpce\"},\"columns\":\"Stĺpce\",\"deleteTable\":\"Vymazať tabuľku\",\"headers\":\"Hlavička\",\"headersBoth\":\"Obe\",\"headersColumn\":\"Prvý stĺpec\",\"headersNone\":\"Žiadne\",\"headersRow\":\"Prvý riadok\",\"invalidBorder\":\"Šírka orámovania musí byť číslo.\",\"invalidCellPadding\":\"Odsadenie v bunkách (cell padding) musí byť kladné číslo.\",\"invalidCellSpacing\":\"Medzera mädzi bunkami (cell spacing) musí byť kladné číslo.\",\"invalidCols\":\"Počet stĺpcov musí byť číslo väčšie ako 0.\",\"invalidHeight\":\"Výška tabuľky musí byť číslo.\",\"invalidRows\":\"Počet riadkov musí byť číslo väčšie ako 0.\",\"invalidWidth\":\"Širka tabuľky musí byť číslo.\",\"menu\":\"Vlastnosti tabuľky\",\"row\":{\"menu\":\"Riadok\",\"insertBefore\":\"Vložiť riadok pred\",\"insertAfter\":\"Vložiť riadok po\",\"deleteRow\":\"Vymazať riadky\"},\"rows\":\"Riadky\",\"summary\":\"Prehľad\",\"title\":\"Vlastnosti tabuľky\",\"toolbar\":\"Tabuľka\",\"widthPc\":\"percent\",\"widthPx\":\"pixelov\",\"widthUnit\":\"jednotka šírky\"},\"undo\":{\"redo\":\"Znovu\",\"undo\":\"Späť\"},\"wsc\":{\"btnIgnore\":\"Ignorovať\",\"btnIgnoreAll\":\"Ignorovať všetko\",\"btnReplace\":\"Prepísat\",\"btnReplaceAll\":\"Prepísat všetko\",\"btnUndo\":\"Späť\",\"changeTo\":\"Zmeniť na\",\"errorLoading\":\"Chyba pri načítaní slovníka z adresy: %s.\",\"ieSpellDownload\":\"Kontrola pravopisu nie je naištalovaná. Chcete ju teraz stiahnuť?\",\"manyChanges\":\"Kontrola pravopisu dokončená: Bolo zmenených %1 slov\",\"noChanges\":\"Kontrola pravopisu dokončená: Neboli zmenené žiadne slová\",\"noMispell\":\"Kontrola pravopisu dokončená: Neboli nájdené žiadne chyby pravopisu\",\"noSuggestions\":\"- Žiadny návrh -\",\"notAvailable\":\"Prepáčte, ale služba je momentálne nedostupná.\",\"notInDic\":\"Nie je v slovníku\",\"oneChange\":\"Kontrola pravopisu dokončená: Bolo zmenené jedno slovo\",\"progress\":\"Prebieha kontrola pravopisu...\",\"title\":\"Skontrolovať pravopis\",\"toolbar\":\"Kontrola pravopisu\"}};"
  },
  {
    "path": "assets/ckeditor/lang/sl.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['sl']={\"editor\":\"Bogat Urejevalnik Besedila\",\"editorPanel\":\"Rich Text Editor plošča\",\"common\":{\"editorHelp\":\"Pritisnite ALT 0 za pomoč\",\"browseServer\":\"Prebrskaj na strežniku\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Naloži\",\"uploadSubmit\":\"Pošlji na strežnik\",\"image\":\"Slika\",\"flash\":\"Flash\",\"form\":\"Obrazec\",\"checkbox\":\"Potrditveno polje\",\"radio\":\"Izbirno polje\",\"textField\":\"Vnosno polje\",\"textarea\":\"Vnosno območje\",\"hiddenField\":\"Skrito polje\",\"button\":\"Gumb\",\"select\":\"Spustno Polje\",\"imageButton\":\"Slikovni Gumb\",\"notSet\":\"<ni določen>\",\"id\":\"Id\",\"name\":\"Ime\",\"langDir\":\"Smer jezika\",\"langDirLtr\":\"Od leve proti desni (LTR)\",\"langDirRtl\":\"Od desne proti levi (RTL)\",\"langCode\":\"Koda Jezika\",\"longDescr\":\"Dolg opis URL-ja\",\"cssClass\":\"Razred stilne predloge\",\"advisoryTitle\":\"Predlagani naslov\",\"cssStyle\":\"Slog\",\"ok\":\"V redu\",\"cancel\":\"Prekliči\",\"close\":\"Zapri\",\"preview\":\"Predogled\",\"resize\":\"Potegni za spremembo velikosti\",\"generalTab\":\"Splošno\",\"advancedTab\":\"Napredno\",\"validateNumberFailed\":\"Ta vrednost ni število.\",\"confirmNewPage\":\"Vse neshranjene spremembe te vsebine bodo izgubljene. Ali res želite naložiti novo stran?\",\"confirmCancel\":\"Nekaj možnosti je bilo spremenjenih. Ali res želite zapreti okno?\",\"options\":\"Možnosti\",\"target\":\"Cilj\",\"targetNew\":\"Novo Okno (_blank)\",\"targetTop\":\"Vrhovno Okno (_top)\",\"targetSelf\":\"Enako Okno (_self)\",\"targetParent\":\"Matično Okno (_parent)\",\"langDirLTR\":\"Od leve proti desni (LTR)\",\"langDirRTL\":\"Od desne proti levi (RTL)\",\"styles\":\"Slog\",\"cssClasses\":\"Razred stilne predloge\",\"width\":\"Širina\",\"height\":\"Višina\",\"align\":\"Poravnava\",\"alignLeft\":\"Levo\",\"alignRight\":\"Desno\",\"alignCenter\":\"Sredinsko\",\"alignJustify\":\"Obojestranska poravnava\",\"alignTop\":\"Na vrh\",\"alignMiddle\":\"V sredino\",\"alignBottom\":\"Na dno\",\"alignNone\":\"Brez poravnave\",\"invalidValue\":\"Neveljavna vrednost.\",\"invalidHeight\":\"Višina mora biti število.\",\"invalidWidth\":\"Širina mora biti število.\",\"invalidCssLength\":\"Vrednost določena za \\\"%1\\\" polje mora biti pozitivna številka z ali brez veljavne CSS enote za merjenje (px, %, in, cm, mm, em, ex, pt, ali pc).\",\"invalidHtmlLength\":\"Vrednost določena za \\\"%1\\\" polje mora biti pozitivna številka z ali brez veljavne HTML enote za merjenje (px ali %).\",\"invalidInlineStyle\":\"Vrednost določena za inline slog mora biti sestavljena iz ene ali več tork (tuples) z obliko \\\"ime : vrednost\\\", ločenih z podpičji.\",\"cssLengthTooltip\":\"Vnesite številko za vrednost v slikovnih pikah (pixels) ali številko z veljavno CSS enoto (px, %, in, cm, mm, em, ex, pt, ali pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, nedosegljiv</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Vse pravice pridržane.\",\"dlgTitle\":\"O programu CKEditor\",\"help\":\"Preverite $1 za pomoč.\",\"moreInfo\":\"Za informacijo o licenci prosim obiščite našo spletno stran:\",\"title\":\"O programu CKEditor\",\"userGuide\":\"CKEditor Navodila za Uporabo\"},\"basicstyles\":{\"bold\":\"Krepko\",\"italic\":\"Ležeče\",\"strike\":\"Prečrtano\",\"subscript\":\"Podpisano\",\"superscript\":\"Nadpisano\",\"underline\":\"Podčrtano\"},\"bidi\":{\"ltr\":\"Smer besedila od leve proti desni\",\"rtl\":\"Smer besedila od desne proti levi\"},\"blockquote\":{\"toolbar\":\"Citat\"},\"clipboard\":{\"copy\":\"Kopiraj\",\"copyError\":\"Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).\",\"cut\":\"Izreži\",\"cutError\":\"Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).\",\"paste\":\"Prilepi\",\"pasteArea\":\"Prilepi Prostor\",\"pasteMsg\":\"Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.\",\"securityMsg\":\"Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.\",\"title\":\"Prilepi\"},\"button\":{\"selectedLabel\":\"%1 (Izbrano)\"},\"colorbutton\":{\"auto\":\"Samodejno\",\"bgColorTitle\":\"Barva ozadja\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Več barv...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Barva besedila\"},\"colordialog\":{\"clear\":\"Počisti\",\"highlight\":\"Poudarjeno\",\"options\":\"Barvne Možnosti\",\"selected\":\"Izbrano\",\"title\":\"Izberi barvo\"},\"templates\":{\"button\":\"Predloge\",\"emptyListMsg\":\"(Ni pripravljenih predlog)\",\"insertOption\":\"Zamenjaj trenutno vsebino\",\"options\":\"Možnosti Predloge\",\"selectPromptMsg\":\"Izberite predlogo, ki jo želite odpreti v urejevalniku<br>(trenutna vsebina bo izgubljena):\",\"title\":\"Vsebinske predloge\"},\"contextmenu\":{\"options\":\"Možnosti Kontekstnega Menija\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Predlagani naslov\",\"cssClassInputLabel\":\"Razred stilne predloge\",\"edit\":\"Uredi Div\",\"inlineStyleInputLabel\":\"Inline Slog\",\"langDirLTRLabel\":\"Od leve proti desni (LTR)\",\"langDirLabel\":\"Smer jezika\",\"langDirRTLLabel\":\"Od desne proti levi (RTL)\",\"languageCodeInputLabel\":\"Koda Jezika\",\"remove\":\"Odstrani Div\",\"styleSelectLabel\":\"Slog\",\"title\":\"Ustvari Div Posodo\",\"toolbar\":\"Ustvari Div Posodo\"},\"toolbar\":{\"toolbarCollapse\":\"Skrči Orodno Vrstico\",\"toolbarExpand\":\"Razširi Orodno Vrstico\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Urejevalnik orodne vrstice\"},\"elementspath\":{\"eleLabel\":\"Pot elementov\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Najdi\",\"findOptions\":\"Find Options\",\"findWhat\":\"Najdi:\",\"matchCase\":\"Razlikuj velike in male črke\",\"matchCyclic\":\"Primerjaj znake v cirilici\",\"matchWord\":\"Samo cele besede\",\"notFoundMsg\":\"Navedeno besedilo ni bilo najdeno.\",\"replace\":\"Zamenjaj\",\"replaceAll\":\"Zamenjaj vse\",\"replaceSuccessMsg\":\"%1 pojavitev je bilo zamenjano.\",\"replaceWith\":\"Zamenjaj z:\",\"title\":\"Najdi in zamenjaj\"},\"fakeobjects\":{\"anchor\":\"Sidro\",\"flash\":\"Flash animacija\",\"hiddenfield\":\"Skrito polje\",\"iframe\":\"IFrame\",\"unknown\":\"Neznan objekt\"},\"flash\":{\"access\":\"Dostop skript\",\"accessAlways\":\"Vedno\",\"accessNever\":\"Nikoli\",\"accessSameDomain\":\"Samo ista domena\",\"alignAbsBottom\":\"Popolnoma na dno\",\"alignAbsMiddle\":\"Popolnoma v sredino\",\"alignBaseline\":\"Na osnovno črto\",\"alignTextTop\":\"Besedilo na vrh\",\"bgcolor\":\"Barva ozadja\",\"chkFull\":\"Dovoli celozaslonski način\",\"chkLoop\":\"Ponavljanje\",\"chkMenu\":\"Omogoči Flash Meni\",\"chkPlay\":\"Samodejno predvajaj\",\"flashvars\":\"Spremenljivke za Flash\",\"hSpace\":\"Vodoravni razmik\",\"properties\":\"Lastnosti Flash\",\"propertiesTab\":\"Lastnosti\",\"quality\":\"Kakovost\",\"qualityAutoHigh\":\"Samodejno visoka\",\"qualityAutoLow\":\"Samodejno nizka\",\"qualityBest\":\"Najvišja\",\"qualityHigh\":\"Visoka\",\"qualityLow\":\"Nizka\",\"qualityMedium\":\"Srednja\",\"scale\":\"Povečava\",\"scaleAll\":\"Pokaži vse\",\"scaleFit\":\"Natančno prileganje\",\"scaleNoBorder\":\"Brez obrobe\",\"title\":\"Lastnosti Flash\",\"vSpace\":\"Navpični razmik\",\"validateHSpace\":\"Vodoravni razmik mora biti število.\",\"validateSrc\":\"Vnesite URL povezave\",\"validateVSpace\":\"Navpični razmik mora biti število.\",\"windowMode\":\"Vrsta okna\",\"windowModeOpaque\":\"Motno\",\"windowModeTransparent\":\"Prosojno\",\"windowModeWindow\":\"Okno\"},\"font\":{\"fontSize\":{\"label\":\"Velikost\",\"voiceLabel\":\"Velikost\",\"panelTitle\":\"Velikost\"},\"label\":\"Pisava\",\"panelTitle\":\"Pisava\",\"voiceLabel\":\"Pisava\"},\"forms\":{\"button\":{\"title\":\"Lastnosti gumba\",\"text\":\"Besedilo (Vrednost)\",\"type\":\"Tip\",\"typeBtn\":\"Gumb\",\"typeSbm\":\"Potrdi\",\"typeRst\":\"Ponastavi\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Lastnosti potrditvenega polja\",\"radioTitle\":\"Lastnosti izbirnega polja\",\"value\":\"Vrednost\",\"selected\":\"Izbrano\",\"required\":\"Required\"},\"form\":{\"title\":\"Lastnosti obrazca\",\"menu\":\"Lastnosti obrazca\",\"action\":\"Akcija\",\"method\":\"Metoda\",\"encoding\":\"Kodiranje znakov\"},\"hidden\":{\"title\":\"Lastnosti skritega polja\",\"name\":\"Ime\",\"value\":\"Vrednost\"},\"select\":{\"title\":\"Lastnosti spustnega seznama\",\"selectInfo\":\"Podatki\",\"opAvail\":\"Razpoložljive izbire\",\"value\":\"Vrednost\",\"size\":\"Velikost\",\"lines\":\"vrstic\",\"chkMulti\":\"Dovoli izbor večih vrstic\",\"required\":\"Required\",\"opText\":\"Besedilo\",\"opValue\":\"Vrednost\",\"btnAdd\":\"Dodaj\",\"btnModify\":\"Spremeni\",\"btnUp\":\"Gor\",\"btnDown\":\"Dol\",\"btnSetValue\":\"Postavi kot privzeto izbiro\",\"btnDelete\":\"Izbriši\"},\"textarea\":{\"title\":\"Lastnosti vnosnega območja\",\"cols\":\"Stolpcev\",\"rows\":\"Vrstic\"},\"textfield\":{\"title\":\"Lastnosti vnosnega polja\",\"name\":\"Ime\",\"value\":\"Vrednost\",\"charWidth\":\"Dolžina\",\"maxChars\":\"Največje število znakov\",\"required\":\"Required\",\"type\":\"Tip\",\"typeText\":\"Besedilo\",\"typePass\":\"Geslo\",\"typeEmail\":\"E-pošta\",\"typeSearch\":\"Iskanje\",\"typeTel\":\"Telefonska Številka\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Oblika\",\"panelTitle\":\"Oblika\",\"tag_address\":\"Napis\",\"tag_div\":\"Navaden (DIV)\",\"tag_h1\":\"Naslov 1\",\"tag_h2\":\"Naslov 2\",\"tag_h3\":\"Naslov 3\",\"tag_h4\":\"Naslov 4\",\"tag_h5\":\"Naslov 5\",\"tag_h6\":\"Naslov 6\",\"tag_p\":\"Navaden\",\"tag_pre\":\"Oblikovan\"},\"horizontalrule\":{\"toolbar\":\"Vstavi vodoravno črto\"},\"iframe\":{\"border\":\"Pokaži mejo okvira\",\"noUrl\":\"Prosimo, vnesite iframe URL\",\"scrolling\":\"Omogoči scrollbars\",\"title\":\"IFrame Lastnosti\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Nadomestno besedilo\",\"border\":\"Obroba\",\"btnUpload\":\"Pošlji na strežnik\",\"button2Img\":\"Želiš pretvoriti izbrani gumb s sliko v preprosto sliko?\",\"hSpace\":\"Vodoravni razmik\",\"img2Button\":\"Želiš pretvoriti izbrano sliko v gumb s sliko?\",\"infoTab\":\"Podatki o sliki\",\"linkTab\":\"Povezava\",\"lockRatio\":\"Zakleni razmerje\",\"menu\":\"Lastnosti slike\",\"resetSize\":\"Ponastavi velikost\",\"title\":\"Lastnosti slike\",\"titleButton\":\"Lastnosti gumba s sliko\",\"upload\":\"Pošlji\",\"urlMissing\":\"Manjka vir (URL) slike.\",\"vSpace\":\"Navpični razmik\",\"validateBorder\":\"Meja mora biti celo število.\",\"validateHSpace\":\"HSpace mora biti celo število.\",\"validateVSpace\":\"VSpace mora biti celo število.\"},\"indent\":{\"indent\":\"Povečaj zamik\",\"outdent\":\"Zmanjšaj zamik\"},\"smiley\":{\"options\":\"Možnosti Smeška\",\"title\":\"Vstavi smeška\",\"toolbar\":\"Smeško\"},\"justify\":{\"block\":\"Obojestranska poravnava\",\"center\":\"Sredinska poravnava\",\"left\":\"Leva poravnava\",\"right\":\"Desna poravnava\"},\"language\":{\"button\":\"Nastavi jezik\",\"remove\":\"Odstrani jezik\"},\"link\":{\"acccessKey\":\"Dostopno Geslo\",\"advanced\":\"Napredno\",\"advisoryContentType\":\"Predlagani tip vsebine (content-type)\",\"advisoryTitle\":\"Predlagani naslov\",\"anchor\":{\"toolbar\":\"Vstavi/uredi zaznamek\",\"menu\":\"Lastnosti zaznamka\",\"title\":\"Lastnosti zaznamka\",\"name\":\"Ime zaznamka\",\"errorName\":\"Prosim vnesite ime zaznamka\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Po ID-ju elementa\",\"anchorName\":\"Po imenu zaznamka\",\"charset\":\"Kodna tabela povezanega vira\",\"cssClasses\":\"Razred stilne predloge\",\"emailAddress\":\"Elektronski naslov\",\"emailBody\":\"Vsebina sporočila\",\"emailSubject\":\"Predmet sporočila\",\"id\":\"Id\",\"info\":\"Podatki o povezavi\",\"langCode\":\"Smer jezika\",\"langDir\":\"Smer jezika\",\"langDirLTR\":\"Od leve proti desni (LTR)\",\"langDirRTL\":\"Od desne proti levi (RTL)\",\"menu\":\"Uredi povezavo\",\"name\":\"Ime\",\"noAnchors\":\"(V tem dokumentu ni zaznamkov)\",\"noEmail\":\"Vnesite elektronski naslov\",\"noUrl\":\"Vnesite URL povezave\",\"other\":\"<drug>\",\"popupDependent\":\"Podokno (Netscape)\",\"popupFeatures\":\"Značilnosti pojavnega okna\",\"popupFullScreen\":\"Celozaslonska slika (IE)\",\"popupLeft\":\"Lega levo\",\"popupLocationBar\":\"Naslovna vrstica\",\"popupMenuBar\":\"Menijska vrstica\",\"popupResizable\":\"Spremenljive velikosti\",\"popupScrollBars\":\"Drsniki\",\"popupStatusBar\":\"Vrstica stanja\",\"popupToolbar\":\"Orodna vrstica\",\"popupTop\":\"Lega na vrhu\",\"rel\":\"Odnos\",\"selectAnchor\":\"Izberi zaznamek\",\"styles\":\"Slog\",\"tabIndex\":\"Številka tabulatorja\",\"target\":\"Cilj\",\"targetFrame\":\"<okvir>\",\"targetFrameName\":\"Ime ciljnega okvirja\",\"targetPopup\":\"<pojavno okno>\",\"targetPopupName\":\"Ime pojavnega okna\",\"title\":\"Povezava\",\"toAnchor\":\"Zaznamek na tej strani\",\"toEmail\":\"Elektronski naslov\",\"toUrl\":\"URL\",\"toolbar\":\"Vstavi/uredi povezavo\",\"type\":\"Vrsta povezave\",\"unlink\":\"Odstrani povezavo\",\"upload\":\"Prenesi\"},\"list\":{\"bulletedlist\":\"Označen seznam\",\"numberedlist\":\"Oštevilčen seznam\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Vstavite odstavek tukaj\"},\"maximize\":{\"maximize\":\"Maksimiraj\",\"minimize\":\"Minimiraj\"},\"newpage\":{\"toolbar\":\"Nova stran\"},\"pagebreak\":{\"alt\":\"Prelom Strani\",\"toolbar\":\"Vstavi prelom strani\"},\"pastetext\":{\"button\":\"Prilepi kot golo besedilo\",\"title\":\"Prilepi kot golo besedilo\"},\"pastefromword\":{\"confirmCleanup\":\"Besedilo, ki ga želite prilepiti je kopirano iz Word-a. Ali ga želite očistiti, preden ga prilepite?\",\"error\":\"Ni bilo mogoče očistiti prilepljenih podatkov zaradi notranje napake\",\"title\":\"Prilepi iz Worda\",\"toolbar\":\"Prilepi iz Worda\"},\"preview\":{\"preview\":\"Predogled\"},\"print\":{\"toolbar\":\"Natisni\"},\"removeformat\":{\"toolbar\":\"Odstrani oblikovanje\"},\"save\":{\"toolbar\":\"Shrani\"},\"selectall\":{\"toolbar\":\"Izberi vse\"},\"showblocks\":{\"toolbar\":\"Prikaži ograde\"},\"sourcearea\":{\"toolbar\":\"Izvorna koda\"},\"specialchar\":{\"options\":\"Možnosti Posebnega Znaka\",\"title\":\"Izberi Posebni Znak\",\"toolbar\":\"Vstavi posebni znak\"},\"scayt\":{\"btn_about\":\"O storitvi SCAYT\",\"btn_dictionaries\":\"Slovarji\",\"btn_disable\":\"Onemogoči SCAYT\",\"btn_enable\":\"Omogoči SCAYT\",\"btn_langs\":\"Jeziki\",\"btn_options\":\"Možnosti\",\"text_title\":\"Črkovanje med tipkanjem\"},\"stylescombo\":{\"label\":\"Slog\",\"panelTitle\":\"Oblikovalni Stili\",\"panelTitle1\":\"Slogi odstavkov\",\"panelTitle2\":\"Slogi besedila\",\"panelTitle3\":\"Slogi objektov\"},\"table\":{\"border\":\"Velikost obrobe\",\"caption\":\"Naslov\",\"cell\":{\"menu\":\"Celica\",\"insertBefore\":\"Vstavi celico pred\",\"insertAfter\":\"Vstavi celico za\",\"deleteCell\":\"Izbriši celice\",\"merge\":\"Združi celice\",\"mergeRight\":\"Združi desno\",\"mergeDown\":\"Druži navzdol\",\"splitHorizontal\":\"Razdeli celico vodoravno\",\"splitVertical\":\"Razdeli celico navpično\",\"title\":\"Lastnosti celice\",\"cellType\":\"Vrsta celice\",\"rowSpan\":\"Razpon vrstic\",\"colSpan\":\"Razpon stolpcev\",\"wordWrap\":\"Prelom besedila\",\"hAlign\":\"Vodoravna poravnava\",\"vAlign\":\"Navpična poravnava\",\"alignBaseline\":\"Osnovnica\",\"bgColor\":\"Barva ozadja\",\"borderColor\":\"Barva obrobe\",\"data\":\"Podatki\",\"header\":\"Glava\",\"yes\":\"Da\",\"no\":\"Ne\",\"invalidWidth\":\"Širina celice mora biti število.\",\"invalidHeight\":\"Višina celice mora biti število.\",\"invalidRowSpan\":\"Razpon vrstic mora biti celo število.\",\"invalidColSpan\":\"Razpon stolpcev mora biti celo število.\",\"chooseColor\":\"Izberi\"},\"cellPad\":\"Polnilo med celicami\",\"cellSpace\":\"Razmik med celicami\",\"column\":{\"menu\":\"Stolpec\",\"insertBefore\":\"Vstavi stolpec pred\",\"insertAfter\":\"Vstavi stolpec za\",\"deleteColumn\":\"Izbriši stolpce\"},\"columns\":\"Stolpci\",\"deleteTable\":\"Izbriši tabelo\",\"headers\":\"Glave\",\"headersBoth\":\"Oboje\",\"headersColumn\":\"Prvi stolpec\",\"headersNone\":\"Brez\",\"headersRow\":\"Prva vrstica\",\"invalidBorder\":\"Širina obrobe mora biti število.\",\"invalidCellPadding\":\"Zamik celic mora biti število\",\"invalidCellSpacing\":\"Razmik med celicami mora biti število.\",\"invalidCols\":\"Število stolpcev mora biti večje od 0.\",\"invalidHeight\":\"Višina tabele mora biti število.\",\"invalidRows\":\"Število vrstic mora biti večje od 0.\",\"invalidWidth\":\"Širina tabele mora biti število.\",\"menu\":\"Lastnosti tabele\",\"row\":{\"menu\":\"Vrstica\",\"insertBefore\":\"Vstavi vrstico pred\",\"insertAfter\":\"Vstavi vrstico za\",\"deleteRow\":\"Izbriši vrstice\"},\"rows\":\"Vrstice\",\"summary\":\"Povzetek\",\"title\":\"Lastnosti tabele\",\"toolbar\":\"Tabela\",\"widthPc\":\"procentov\",\"widthPx\":\"pik\",\"widthUnit\":\"enota širine\"},\"undo\":{\"redo\":\"Ponovi\",\"undo\":\"Razveljavi\"},\"wsc\":{\"btnIgnore\":\"Prezri\",\"btnIgnoreAll\":\"Prezri vse\",\"btnReplace\":\"Zamenjaj\",\"btnReplaceAll\":\"Zamenjaj vse\",\"btnUndo\":\"Razveljavi\",\"changeTo\":\"Spremeni v\",\"errorLoading\":\"Napaka pri nalaganju storitve programa na naslovu %s.\",\"ieSpellDownload\":\"Črkovalnik ni nameščen. Ali ga želite prenesti sedaj?\",\"manyChanges\":\"Črkovanje je končano: Spremenjenih je bilo %1 besed\",\"noChanges\":\"Črkovanje je končano: Nobena beseda ni bila spremenjena\",\"noMispell\":\"Črkovanje je končano: Brez napak\",\"noSuggestions\":\"- Ni predlogov -\",\"notAvailable\":\"Oprostite, storitev trenutno ni dosegljiva.\",\"notInDic\":\"Ni v slovarju\",\"oneChange\":\"Črkovanje je končano: Spremenjena je bila ena beseda\",\"progress\":\"Preverjanje črkovanja se izvaja...\",\"title\":\"Črkovalnik\",\"toolbar\":\"Preveri črkovanje\"}};"
  },
  {
    "path": "assets/ckeditor/lang/sq.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['sq']={\"editor\":\"Redaktues i Pasur Teksti\",\"editorPanel\":\"Paneli i redaktuesit të tekstit të plotë\",\"common\":{\"editorHelp\":\"Shtyp ALT 0 për ndihmë\",\"browseServer\":\"Shfleto në Server\",\"url\":\"URL\",\"protocol\":\"Protokolli\",\"upload\":\"Ngarko\",\"uploadSubmit\":\"Dërgo në server\",\"image\":\"Imazh\",\"flash\":\"Objekt flash\",\"form\":\"Formular\",\"checkbox\":\"Checkbox\",\"radio\":\"Buton radio\",\"textField\":\"Fushë tekst\",\"textarea\":\"Hapësirë tekst\",\"hiddenField\":\"Fushë e fshehur\",\"button\":\"Buton\",\"select\":\"Menu zgjedhjeje\",\"imageButton\":\"Buton imazhi\",\"notSet\":\"<e pazgjedhur>\",\"id\":\"Id\",\"name\":\"Emër\",\"langDir\":\"Kod gjuhe\",\"langDirLtr\":\"Nga e majta në të djathtë (LTR)\",\"langDirRtl\":\"Nga e djathta në të majtë (RTL)\",\"langCode\":\"Kod gjuhe\",\"longDescr\":\"Përshkrim i hollësishëm\",\"cssClass\":\"Klasa stili CSS\",\"advisoryTitle\":\"Titull\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Anulo\",\"close\":\"Mbyll\",\"preview\":\"Parashiko\",\"resize\":\"Ripërmaso\",\"generalTab\":\"Të përgjithshme\",\"advancedTab\":\"Të përparuara\",\"validateNumberFailed\":\"Vlera e futur nuk është një numër\",\"confirmNewPage\":\"Çdo ndryshim që nuk është ruajtur do humbasë. Je i sigurtë që dëshiron të krijosh një faqe të re?\",\"confirmCancel\":\"Disa opsione kanë ndryshuar. Je i sigurtë që dëshiron ta mbyllësh dritaren?\",\"options\":\"Opsione\",\"target\":\"Objektivi\",\"targetNew\":\"Dritare e re (_blank)\",\"targetTop\":\"Dritare në plan të parë (_top)\",\"targetSelf\":\"E njëjta dritare (_self)\",\"targetParent\":\"Dritarja prind (_parent)\",\"langDirLTR\":\"Nga e majta në të djathë (LTR)\",\"langDirRTL\":\"Nga e djathta në të majtë (RTL)\",\"styles\":\"Stil\",\"cssClasses\":\"Klasa Stili CSS\",\"width\":\"Gjerësi\",\"height\":\"Lartësi\",\"align\":\"Rreshtim\",\"alignLeft\":\"Majtas\",\"alignRight\":\"Djathtas\",\"alignCenter\":\"Qendër\",\"alignJustify\":\"Zgjero\",\"alignTop\":\"Lart\",\"alignMiddle\":\"Në mes\",\"alignBottom\":\"Poshtë\",\"alignNone\":\"Asnjë\",\"invalidValue\":\"Vlerë e pavlefshme\",\"invalidHeight\":\"Lartësia duhet të jetë një numër\",\"invalidWidth\":\"Gjerësia duhet të jetë një numër\",\"invalidCssLength\":\"Vlera e fushës \\\"%1\\\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme CSS (px, %, in, cm, mm, em, ex, pt ose pc).\",\"invalidHtmlLength\":\"Vlera e fushës \\\"%1\\\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme HTML (px ose %)\",\"invalidInlineStyle\":\"Stili inline duhet të jetë një apo disa vlera të formatit \\\"emër: vlerë\\\", ndarë nga pikëpresje.\",\"cssLengthTooltip\":\"Fut një numër për vlerën në pixel apo një numër me një njësi të vlefshme CSS (px, %, in, cm, mm, ex, pt, ose pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, i padisponueshëm</span>\"},\"about\":{\"copy\":\"Të drejtat  e kopjimit &copy; $1. Të gjitha të drejtat e rezervuara.\",\"dlgTitle\":\"Rreth CKEditor\",\"help\":\"Kontrollo $1 për ndihmë.\",\"moreInfo\":\"Për informacione rreth licencave shih faqen tonë:\",\"title\":\"Rreth CKEditor\",\"userGuide\":\"Udhëzuesi i Shfrytëzuesit të CKEditor\"},\"basicstyles\":{\"bold\":\"Trash\",\"italic\":\"Pjerrët\",\"strike\":\"Nëpërmes\",\"subscript\":\"Nën-skriptë\",\"superscript\":\"Super-skriptë\",\"underline\":\"Nënvijëzuar\"},\"bidi\":{\"ltr\":\"Drejtimi i tekstit nga e majta në të djathtë\",\"rtl\":\"Drejtimi i tekstit nga e djathta në të majtë\"},\"blockquote\":{\"toolbar\":\"Citatet\"},\"clipboard\":{\"copy\":\"Kopjo\",\"copyError\":\"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).\",\"cut\":\"Preje\",\"cutError\":\"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).\",\"paste\":\"Hidhe\",\"pasteArea\":\"Hapësira Hedhëse\",\"pasteMsg\":\"Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (<strong>Ctrl/Cmd+V</strong>) dhe shtypni Mirë.\",\"securityMsg\":\"Për shkak të dhënave të sigurisë së shfletuesit tuaj, redaktuesi nuk është në gjendje të i qaset drejtpërdrejtë të dhanve të tabelës suaj të punës. Ju duhet të hidhni atë përsëri në këtë dritare.\",\"title\":\"Hidhe\"},\"button\":{\"selectedLabel\":\"%1 (Përzgjedhur)\"},\"colorbutton\":{\"auto\":\"Automatik\",\"bgColorTitle\":\"Ngjyra e Prapavijës\",\"colors\":{\"000\":\"E zezë\",\"800000\":\"Ngjyrë gështenjë\",\"8B4513\":\"Ngjyrë Shale Kafe\",\"2F4F4F\":\"Ngjyrë Gri të errët ardëz\",\"008080\":\"Ngjyrë bajukë\",\"000080\":\"Ngjyrë Marine\",\"4B0082\":\"Indigo\",\"696969\":\"Gri e Errët\",\"B22222\":\"Tullë në Flakë\",\"A52A2A\":\"Ngjytë Kafe\",\"DAA520\":\"Shkop i Artë\",\"006400\":\"E Gjelbër e Errët\",\"40E0D0\":\"Ngjyrë e Bruztë\",\"0000CD\":\"E Kaltër e Mesme\",\"800080\":\"Vjollcë\",\"808080\":\"Gri\",\"F00\":\"E Kuqe\",\"FF8C00\":\"E Portokalltë e Errët\",\"FFD700\":\"Ngjyrë Ari\",\"008000\":\"E Gjelbërt\",\"0FF\":\"Cyan\",\"00F\":\"E Kaltër\",\"EE82EE\":\"Vjollcë\",\"A9A9A9\":\"Gri e Zbehtë\",\"FFA07A\":\"Salmon i Ndritur\",\"FFA500\":\"E Portokalltë\",\"FFFF00\":\"E Verdhë\",\"00FF00\":\"Ngjyrë Gëlqere\",\"AFEEEE\":\"Ngjyrë e Bruztë e Zbehtë\",\"ADD8E6\":\"E Kaltër e Ndritur\",\"DDA0DD\":\"Ngjyrë Llokumi\",\"D3D3D3\":\"Gri e Ndritur\",\"FFF0F5\":\"Ngjyrë Purpur e Skuqur\",\"FAEBD7\":\"E Bardhë Antike\",\"FFFFE0\":\"E verdhë e Ndritur\",\"F0FFF0\":\"Ngjyrë Nektari\",\"F0FFFF\":\"Ngjyrë Qielli\",\"F0F8FF\":\"E Kaltër Alice\",\"E6E6FA\":\"Ngjyrë Purpur e Zbetë\",\"FFF\":\"E bardhë\"},\"more\":\"Më Shumë Ngjyra...\",\"panelTitle\":\"Ngjyrat\",\"textColorTitle\":\"Ngjyra e Tekstit\"},\"colordialog\":{\"clear\":\"Pastro\",\"highlight\":\"Thekso\",\"options\":\"Përzgjedhjet e Ngjyrave\",\"selected\":\"Ngjyra e Përzgjedhur\",\"title\":\"Përzgjidh një ngjyrë\"},\"templates\":{\"button\":\"Shabllonet\",\"emptyListMsg\":\"(Asnjë shabllon nuk është paradefinuar)\",\"insertOption\":\"Zëvendëso përmbajtjen aktuale\",\"options\":\"Opsionet e Shabllonit\",\"selectPromptMsg\":\"Përzgjidhni shabllonin për të hapur tek redaktuesi\",\"title\":\"Përmbajtja e Shabllonit\"},\"contextmenu\":{\"options\":\"Mundësitë e Menysë së Kontekstit\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Titull\",\"cssClassInputLabel\":\"Klasa stili CSS\",\"edit\":\"Redakto Div\",\"inlineStyleInputLabel\":\"Stili i brendshëm\",\"langDirLTRLabel\":\"Nga e majta në të djathë (LTR)\",\"langDirLabel\":\"Drejtim teksti\",\"langDirRTLLabel\":\"Nga e djathta në të majtë (RTL)\",\"languageCodeInputLabel\":\"Kodi i Gjuhës\",\"remove\":\"Largo Div\",\"styleSelectLabel\":\"Stil\",\"title\":\"Krijo Div Përmbajtës\",\"toolbar\":\"Krijo Div Përmbajtës\"},\"toolbar\":{\"toolbarCollapse\":\"Zvogëlo Shiritin\",\"toolbarExpand\":\"Zgjero Shiritin\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Tabela Punës/Ribëje\",\"editing\":\"Duke Redaktuar\",\"forms\":\"Formular\",\"basicstyles\":\"Stili Bazë\",\"paragraph\":\"Paragraf\",\"links\":\"Nyjet\",\"insert\":\"Shto\",\"styles\":\"Stil\",\"colors\":\"Ngjyrat\",\"tools\":\"Mjetet\"},\"toolbars\":\"Shiritet e Redaktuesit\"},\"elementspath\":{\"eleLabel\":\"Rruga e elementeve\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Gjej\",\"findOptions\":\"Gjejë Alternativat\",\"findWhat\":\"Gjej çka:\",\"matchCase\":\"Rasti i përputhjes\",\"matchCyclic\":\"Përputh ciklikun\",\"matchWord\":\"Përputh fjalën e tërë\",\"notFoundMsg\":\"Teksti i caktuar nuk mundej të gjendet.\",\"replace\":\"Zëvendëso\",\"replaceAll\":\"Zëvendëso të gjitha\",\"replaceSuccessMsg\":\"%1 rast(e) u zëvendësua(n).\",\"replaceWith\":\"Zëvendëso me:\",\"title\":\"Gjej dhe Zëvendëso\"},\"fakeobjects\":{\"anchor\":\"Spirancë\",\"flash\":\"Objekt flash\",\"hiddenfield\":\"Fushë e fshehur\",\"iframe\":\"IFrame\",\"unknown\":\"Objekt i Panjohur\"},\"flash\":{\"access\":\"Qasja në Skriptë\",\"accessAlways\":\"Gjithnjë\",\"accessNever\":\"Asnjëherë\",\"accessSameDomain\":\"Fusha e Njëjtë\",\"alignAbsBottom\":\"Abs në Fund\",\"alignAbsMiddle\":\"Abs në Mes\",\"alignBaseline\":\"Baza\",\"alignTextTop\":\"Koka e Tekstit\",\"bgcolor\":\"Ngjyra e Prapavijës\",\"chkFull\":\"Lejo Ekran të Plotë\",\"chkLoop\":\"Përsëritje\",\"chkMenu\":\"Lejo Menynë për Flash\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variablat për Flash\",\"hSpace\":\"Hapësira Horizontale\",\"properties\":\"Karakteristikat për Flash\",\"propertiesTab\":\"Karakteristikat\",\"quality\":\"Kualiteti\",\"qualityAutoHigh\":\"Automatikisht i Lartë\",\"qualityAutoLow\":\"Automatikisht i Ulët\",\"qualityBest\":\"Më i Miri\",\"qualityHigh\":\"I Lartë\",\"qualityLow\":\"Më i Ulti\",\"qualityMedium\":\"I Mesëm\",\"scale\":\"Shkalla\",\"scaleAll\":\"Shfaq të Gjitha\",\"scaleFit\":\"Përputhje të Plotë\",\"scaleNoBorder\":\"Pa Kornizë\",\"title\":\"Rekuizitat për Flash\",\"vSpace\":\"Hapësira Vertikale\",\"validateHSpace\":\"Hapësira Horizontale duhet të është numër.\",\"validateSrc\":\"URL nuk duhet mbetur zbrazur.\",\"validateVSpace\":\"Hapësira Vertikale duhet të është numër.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Errët\",\"windowModeTransparent\":\"Tejdukshëm\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Madhësia\",\"voiceLabel\":\"Madhësia e Shkronjës\",\"panelTitle\":\"Madhësia e Shkronjës\"},\"label\":\"Shkronja\",\"panelTitle\":\"Emri i Shkronjës\",\"voiceLabel\":\"Shkronja\"},\"forms\":{\"button\":{\"title\":\"Rekuizitat e Pullës\",\"text\":\"Teskti (Vlera)\",\"type\":\"LLoji\",\"typeBtn\":\"Buton\",\"typeSbm\":\"Dërgo\",\"typeRst\":\"Rikthe\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Rekuizitat e Kutizë Përzgjedhëse\",\"radioTitle\":\"Rekuizitat e Pullës\",\"value\":\"Vlera\",\"selected\":\"Përzgjedhur\",\"required\":\"Required\"},\"form\":{\"title\":\"Rekuizitat e Formës\",\"menu\":\"Rekuizitat e Formës\",\"action\":\"Veprim\",\"method\":\"Metoda\",\"encoding\":\"Kodimi\"},\"hidden\":{\"title\":\"Rekuizitat e Fushës së Fshehur\",\"name\":\"Emër\",\"value\":\"Vlera\"},\"select\":{\"title\":\"Rekuizitat e Fushës së Përzgjedhur\",\"selectInfo\":\"Përzgjidh Informacionin\",\"opAvail\":\"Opsionet e Mundshme\",\"value\":\"Vlera\",\"size\":\"Madhësia\",\"lines\":\"rreshtat\",\"chkMulti\":\"Lejo përzgjidhje të shumëfishta\",\"required\":\"Required\",\"opText\":\"Teksti\",\"opValue\":\"Vlera\",\"btnAdd\":\"Vendos\",\"btnModify\":\"Ndrysho\",\"btnUp\":\"Sipër\",\"btnDown\":\"Poshtë\",\"btnSetValue\":\"Bëje si vlerë të përzgjedhur\",\"btnDelete\":\"Grise\"},\"textarea\":{\"title\":\"Rekuzitat e Fushës së Tekstit\",\"cols\":\"Kolonat\",\"rows\":\"Rreshtat\"},\"textfield\":{\"title\":\"Rekuizitat e Fushës së Tekstit\",\"name\":\"Emër\",\"value\":\"Vlera\",\"charWidth\":\"Gjerësia e Karakterit\",\"maxChars\":\"Numri maksimal i karaktereve\",\"required\":\"Required\",\"type\":\"LLoji\",\"typeText\":\"Teksti\",\"typePass\":\"Fjalëkalimi\",\"typeEmail\":\"Posta Elektronike\",\"typeSearch\":\"Kërko\",\"typeTel\":\"Numri i Telefonit\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Formati\",\"panelTitle\":\"Formati i Paragrafit\",\"tag_address\":\"Adresa\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Titulli 1\",\"tag_h2\":\"Titulli 2\",\"tag_h3\":\"Titulli 3\",\"tag_h4\":\"Titulli 4\",\"tag_h5\":\"Titulli 5\",\"tag_h6\":\"Titulli 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatuar\"},\"horizontalrule\":{\"toolbar\":\"Vendos Vijë Horizontale\"},\"iframe\":{\"border\":\"Shfaq kufirin e kornizës\",\"noUrl\":\"Ju lutemi shkruani URL-në e iframe-it\",\"scrolling\":\"Lejo shiritët zvarritës\",\"title\":\"Karakteristikat e IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Tekst Alternativ\",\"border\":\"Korniza\",\"btnUpload\":\"Dërgo në server\",\"button2Img\":\"Dëshironi të e ndërroni pullën e fotos së selektuar në një foto të thjeshtë?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Dëshironi të ndryshoni foton e përzgjedhur në pullë?\",\"infoTab\":\"Informacione mbi Fotografinë\",\"linkTab\":\"Nyja\",\"lockRatio\":\"Mbyll Racionin\",\"menu\":\"Karakteristikat e Fotografisë\",\"resetSize\":\"Rikthe Madhësinë\",\"title\":\"Karakteristikat e Fotografisë\",\"titleButton\":\"Karakteristikat e Pullës së Fotografisë\",\"upload\":\"Ngarko\",\"urlMissing\":\"Mungon URL e burimit të fotografisë.\",\"vSpace\":\"Hapësira Vertikale\",\"validateBorder\":\"Korniza duhet të jetë numër i plotë.\",\"validateHSpace\":\"Hapësira horizontale duhet të jetë numër i plotë.\",\"validateVSpace\":\"Hapësira vertikale duhet të jetë numër i plotë.\"},\"indent\":{\"indent\":\"Rrite Identin\",\"outdent\":\"Zvogëlo Identin\"},\"smiley\":{\"options\":\"Opsionet e Ikonave\",\"title\":\"Vendos Ikonë\",\"toolbar\":\"Ikona\"},\"justify\":{\"block\":\"Zgjero\",\"center\":\"Qendër\",\"left\":\"Rreshto majtas\",\"right\":\"Rreshto Djathtas\"},\"language\":{\"button\":\"Përzgjidhni gjuhën\",\"remove\":\"Largoni gjuhën\"},\"link\":{\"acccessKey\":\"Sipas ID-së së Elementit\",\"advanced\":\"Të përparuara\",\"advisoryContentType\":\"Lloji i Përmbajtjes Këshillimore\",\"advisoryTitle\":\"Titull\",\"anchor\":{\"toolbar\":\"Spirancë\",\"menu\":\"Redakto Spirancën\",\"title\":\"Anchor Properties\",\"name\":\"Emri i Spirancës\",\"errorName\":\"Ju lutemi shkruani emrin e spirancës\",\"remove\":\"Largo Spirancën\"},\"anchorId\":\"Sipas ID-së së Elementit\",\"anchorName\":\"Sipas Emrit të Spirancës\",\"charset\":\"Seti i Karaktereve të Burimeve të Nëdlidhura\",\"cssClasses\":\"Klasa stili CSS\",\"emailAddress\":\"Posta Elektronike\",\"emailBody\":\"Trupi i Porosisë\",\"emailSubject\":\"Titulli i Porosisë\",\"id\":\"Id\",\"info\":\"Informacione të Nyjes\",\"langCode\":\"Kod gjuhe\",\"langDir\":\"Drejtim teksti\",\"langDirLTR\":\"Nga e majta në të djathë (LTR)\",\"langDirRTL\":\"Nga e djathta në të majtë (RTL)\",\"menu\":\"Redakto Nyjen\",\"name\":\"Emër\",\"noAnchors\":\"(Nuk ka asnjë spirancë në dokument)\",\"noEmail\":\"Ju lutemi shkruani postën elektronike\",\"noUrl\":\"Ju lutemi shkruani URL-në e nyjes\",\"other\":\"<tjetër>\",\"popupDependent\":\"E Varur (Netscape)\",\"popupFeatures\":\"Karakteristikat e Dritares së Dialogut\",\"popupFullScreen\":\"Ekran i Plotë  (IE)\",\"popupLeft\":\"Pozita Majtas\",\"popupLocationBar\":\"Shiriti i Lokacionit\",\"popupMenuBar\":\"Shiriti i Menysë\",\"popupResizable\":\"I ndryshueshëm\",\"popupScrollBars\":\"Shiritat zvarritës\",\"popupStatusBar\":\"Shiriti i Statutit\",\"popupToolbar\":\"Shiriti i Mejteve\",\"popupTop\":\"Top Pozita\",\"rel\":\"Marrëdhëniet\",\"selectAnchor\":\"Përzgjidh një Spirancë\",\"styles\":\"Stil\",\"tabIndex\":\"Indeksi i fletave\",\"target\":\"Objektivi\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Emri i Kornizës së Synuar\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Emri i Dritares së Dialogut\",\"title\":\"Nyja\",\"toAnchor\":\"Lidhu me spirancën në tekst\",\"toEmail\":\"Posta Elektronike\",\"toUrl\":\"URL\",\"toolbar\":\"Nyja\",\"type\":\"Lloji i Nyjes\",\"unlink\":\"Largo Nyjen\",\"upload\":\"Ngarko\"},\"list\":{\"bulletedlist\":\"Vendos/Largo Listën me Pika\",\"numberedlist\":\"Vendos/Largo Listën me Numra\"},\"liststyle\":{\"armenian\":\"Numërim armenian\",\"bulletedTitle\":\"Karakteristikat e Listës me Pulla\",\"circle\":\"Rreth\",\"decimal\":\"Decimal (1, 2, 3, etj.)\",\"decimalLeadingZero\":\"Decimal me zerro udhëheqëse (01, 02, 03, etj.)\",\"disc\":\"Disk\",\"georgian\":\"Numërim gjeorgjian (an, ban, gan, etj.)\",\"lowerAlpha\":\"Të vogla alfa (a, b, c, d, e, etj.)\",\"lowerGreek\":\"Të vogla greke (alpha, beta, gamma, etj.)\",\"lowerRoman\":\"Të vogla romake (i, ii, iii, iv, v, etj.)\",\"none\":\"Asnjë\",\"notset\":\"<e pazgjedhur>\",\"numberedTitle\":\"Karakteristikat e Listës me Numra\",\"square\":\"Katror\",\"start\":\"Fillimi\",\"type\":\"LLoji\",\"upperAlpha\":\"Të mëdha alfa (A, B, C, D, E, etj.)\",\"upperRoman\":\"Të mëdha romake (I, II, III, IV, V, etj.)\",\"validateStartNumber\":\"Numri i fillimit të listës duhet të është numër i plotë.\"},\"magicline\":{\"title\":\"Vendos paragraf këtu\"},\"maximize\":{\"maximize\":\"Zmadho\",\"minimize\":\"Zvogëlo\"},\"newpage\":{\"toolbar\":\"Faqe e Re\"},\"pagebreak\":{\"alt\":\"Thyerja e Faqes\",\"toolbar\":\"Vendos Thyerje Faqeje për Shtyp\"},\"pastetext\":{\"button\":\"Hidhe si tekst të thjeshtë\",\"title\":\"Hidhe si Tekst të Thjeshtë\"},\"pastefromword\":{\"confirmCleanup\":\"Teksti që dëshironi të e hidhni siç duket është kopjuar nga Word-i. Dëshironi të e pastroni para se të e hidhni?\",\"error\":\"Nuk ishte e mundur të fshiheshin të dhënat e hedhura për shkak të një gabimi të brendshëm\",\"title\":\"Hidhe nga Word-i\",\"toolbar\":\"Hidhe nga Word-i\"},\"preview\":{\"preview\":\"Parashiko\"},\"print\":{\"toolbar\":\"Shtype\"},\"removeformat\":{\"toolbar\":\"Largo Formatin\"},\"save\":{\"toolbar\":\"Ruaje\"},\"selectall\":{\"toolbar\":\"Përzgjidh të Gjitha\"},\"showblocks\":{\"toolbar\":\"Shfaq Blloqet\"},\"sourcearea\":{\"toolbar\":\"Burimi\"},\"specialchar\":{\"options\":\"Mundësitë për Karaktere Speciale\",\"title\":\"Përzgjidh Karakter Special\",\"toolbar\":\"Vendos Karakter Special\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Stilet e Formatimit\",\"panelTitle1\":\"Stilet e Bllokut\",\"panelTitle2\":\"Stili i Brendshëm\",\"panelTitle3\":\"Stilet e Objektit\"},\"table\":{\"border\":\"Madhësia e kornizave\",\"caption\":\"Titull\",\"cell\":{\"menu\":\"Qeli\",\"insertBefore\":\"Shto Qeli Para\",\"insertAfter\":\"Shto Qeli Prapa\",\"deleteCell\":\"Gris Qelitë\",\"merge\":\"Bashko Qelitë\",\"mergeRight\":\"Bashko Djathtas\",\"mergeDown\":\"Bashko Poshtë\",\"splitHorizontal\":\"Ndaj Qelinë Horizontalisht\",\"splitVertical\":\"Ndaj Qelinë Vertikalisht\",\"title\":\"Rekuizitat e Qelisë\",\"cellType\":\"Lloji i Qelisë\",\"rowSpan\":\"Bashko Rreshtat\",\"colSpan\":\"Bashko Kolonat\",\"wordWrap\":\"Fund i Fjalës\",\"hAlign\":\"Bashkimi Horizontal\",\"vAlign\":\"Bashkimi Vertikal\",\"alignBaseline\":\"Baza\",\"bgColor\":\"Ngjyra e Prapavijës\",\"borderColor\":\"Ngjyra e Kornizave\",\"data\":\"Të dhënat\",\"header\":\"Koka\",\"yes\":\"Po\",\"no\":\"Jo\",\"invalidWidth\":\"Gjerësia e qelisë duhet të jetë numër.\",\"invalidHeight\":\"Lartësia e qelisë duhet të jetë numër.\",\"invalidRowSpan\":\"Hapësira e rreshtave duhet të jetë numër i plotë.\",\"invalidColSpan\":\"Hapësira e kolonave duhet të jetë numër i plotë.\",\"chooseColor\":\"Përzgjidh\"},\"cellPad\":\"Mbushja e qelisë\",\"cellSpace\":\"Hapësira e qelisë\",\"column\":{\"menu\":\"Kolona\",\"insertBefore\":\"Vendos Kolonë Para\",\"insertAfter\":\"Vendos Kolonë Pas\",\"deleteColumn\":\"Gris Kolonat\"},\"columns\":\"Kolonat\",\"deleteTable\":\"Gris Tabelën\",\"headers\":\"Kokat\",\"headersBoth\":\"Së bashku\",\"headersColumn\":\"Kolona e parë\",\"headersNone\":\"Asnjë\",\"headersRow\":\"Rreshti i Parë\",\"invalidBorder\":\"Madhësia e kufinjve duhet të jetë numër.\",\"invalidCellPadding\":\"Mbushja e qelisë duhet të jetë numër pozitiv.\",\"invalidCellSpacing\":\"Hapësira e qelisë duhet të jetë numër pozitiv.\",\"invalidCols\":\"Numri i kolonave duhet të jetë numër më i madh se 0.\",\"invalidHeight\":\"Lartësia e tabelës duhet të jetë numër.\",\"invalidRows\":\"Numri i rreshtave duhet të jetë numër më i madh se 0.\",\"invalidWidth\":\"Gjerësia e tabelës duhet të jetë numër.\",\"menu\":\"Karakteristikat e Tabelës\",\"row\":{\"menu\":\"Rreshti\",\"insertBefore\":\"Shto Rresht Para\",\"insertAfter\":\"Shto Rresht Prapa\",\"deleteRow\":\"Gris Rreshtat\"},\"rows\":\"Rreshtat\",\"summary\":\"Përmbledhje\",\"title\":\"Karakteristikat e Tabelës\",\"toolbar\":\"Tabela\",\"widthPc\":\"përqind\",\"widthPx\":\"piksell\",\"widthUnit\":\"njësia e gjerësisë\"},\"undo\":{\"redo\":\"Ribëje\",\"undo\":\"Rizhbëje\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/sr-latn.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['sr-latn']={\"editor\":\"Bogati uređivač teksta\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Pretraži server\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Pošalji\",\"uploadSubmit\":\"Pošalji na server\",\"image\":\"Slika\",\"flash\":\"Fleš\",\"form\":\"Forma\",\"checkbox\":\"Polje za potvrdu\",\"radio\":\"Radio-dugme\",\"textField\":\"Tekstualno polje\",\"textarea\":\"Zona teksta\",\"hiddenField\":\"Skriveno polje\",\"button\":\"Dugme\",\"select\":\"Izborno polje\",\"imageButton\":\"Dugme sa slikom\",\"notSet\":\"<nije postavljeno>\",\"id\":\"Id\",\"name\":\"Naziv\",\"langDir\":\"Smer jezika\",\"langDirLtr\":\"S leva na desno (LTR)\",\"langDirRtl\":\"S desna na levo (RTL)\",\"langCode\":\"Kôd jezika\",\"longDescr\":\"Pun opis URL\",\"cssClass\":\"Stylesheet klase\",\"advisoryTitle\":\"Advisory naslov\",\"cssStyle\":\"Stil\",\"ok\":\"OK\",\"cancel\":\"Otkaži\",\"close\":\"Zatvori\",\"preview\":\"Izgled stranice\",\"resize\":\"Resize\",\"generalTab\":\"Opšte\",\"advancedTab\":\"Napredni tagovi\",\"validateNumberFailed\":\"Ova vrednost nije broj.\",\"confirmNewPage\":\"Nesačuvane promene ovog sadržaja će biti izgubljene. Jeste li sigurni da želita da učitate novu stranu?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Opcije\",\"target\":\"Meta\",\"targetNew\":\"Novi prozor (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Isti prozor (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"S leva na desno (LTR)\",\"langDirRTL\":\"S desna na levo (RTL)\",\"styles\":\"Stil\",\"cssClasses\":\"Stylesheet klase\",\"width\":\"Širina\",\"height\":\"Visina\",\"align\":\"Ravnanje\",\"alignLeft\":\"Levo\",\"alignRight\":\"Desno\",\"alignCenter\":\"Sredina\",\"alignJustify\":\"Obostrano ravnanje\",\"alignTop\":\"Vrh\",\"alignMiddle\":\"Sredina\",\"alignBottom\":\"Dole\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Visina mora biti broj.\",\"invalidWidth\":\"Širina mora biti broj.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Podebljano\",\"italic\":\"Kurziv\",\"strike\":\"Precrtano\",\"subscript\":\"Indeks\",\"superscript\":\"Stepen\",\"underline\":\"Podvučeno\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Kopiraj\",\"copyError\":\"Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).\",\"cut\":\"Iseci\",\"cutError\":\"Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).\",\"paste\":\"Zalepi\",\"pasteArea\":\"Prostor za lepljenje\",\"pasteMsg\":\"Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.\",\"securityMsg\":\"Zbog sigurnosnih postavki vašeg pregledača, editor nije u mogućnosti da direktno pristupi podacima u klipbordu. Potrebno je da zalepite još jednom u ovom prozoru.\",\"title\":\"Zalepi\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Automatski\",\"bgColorTitle\":\"Boja pozadine\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Više boja...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Boja teksta\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Obrasci\",\"emptyListMsg\":\"(Nema definisanih obrazaca)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Molimo Vas da odaberete obrazac koji ce biti primenjen na stranicu (trenutni sadržaj ce biti obrisan):\",\"title\":\"Obrasci za sadržaj\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory naslov\",\"cssClassInputLabel\":\"Stylesheet klase\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"S leva na desno (LTR)\",\"langDirLabel\":\"Smer jezika\",\"langDirRTLLabel\":\"S desna na levo (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Stil\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Suzi alatnu traku\",\"toolbarExpand\":\"Proširi alatnu traku\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Alatne trake\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Pretraga\",\"findOptions\":\"Find Options\",\"findWhat\":\"Pronadi:\",\"matchCase\":\"Razlikuj mala i velika slova\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Uporedi cele reci\",\"notFoundMsg\":\"Traženi tekst nije pronađen.\",\"replace\":\"Zamena\",\"replaceAll\":\"Zameni sve\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Zameni sa:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Unesi/izmeni sidro\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Skriveno polje\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs dole\",\"alignAbsMiddle\":\"Abs sredina\",\"alignBaseline\":\"Bazno\",\"alignTextTop\":\"Vrh teksta\",\"bgcolor\":\"Boja pozadine\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Ponavljaj\",\"chkMenu\":\"Uključi fleš meni\",\"chkPlay\":\"Automatski start\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Osobine fleša\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Skaliraj\",\"scaleAll\":\"Prikaži sve\",\"scaleFit\":\"Popuni površinu\",\"scaleNoBorder\":\"Bez ivice\",\"title\":\"Osobine fleša\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"Unesite URL linka\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Veličina fonta\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Veličina fonta\"},\"label\":\"Font\",\"panelTitle\":\"Font\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Osobine dugmeta\",\"text\":\"Tekst (vrednost)\",\"type\":\"Tip\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Osobine polja za potvrdu\",\"radioTitle\":\"Osobine radio-dugmeta\",\"value\":\"Vrednost\",\"selected\":\"Označeno\",\"required\":\"Required\"},\"form\":{\"title\":\"Osobine forme\",\"menu\":\"Osobine forme\",\"action\":\"Akcija\",\"method\":\"Metoda\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Osobine skrivenog polja\",\"name\":\"Naziv\",\"value\":\"Vrednost\"},\"select\":{\"title\":\"Osobine izbornog polja\",\"selectInfo\":\"Info\",\"opAvail\":\"Dostupne opcije\",\"value\":\"Vrednost\",\"size\":\"Veličina\",\"lines\":\"linija\",\"chkMulti\":\"Dozvoli višestruku selekciju\",\"required\":\"Required\",\"opText\":\"Tekst\",\"opValue\":\"Vrednost\",\"btnAdd\":\"Dodaj\",\"btnModify\":\"Izmeni\",\"btnUp\":\"Gore\",\"btnDown\":\"Dole\",\"btnSetValue\":\"Podesi kao označenu vrednost\",\"btnDelete\":\"Obriši\"},\"textarea\":{\"title\":\"Osobine zone teksta\",\"cols\":\"Broj kolona\",\"rows\":\"Broj redova\"},\"textfield\":{\"title\":\"Osobine tekstualnog polja\",\"name\":\"Naziv\",\"value\":\"Vrednost\",\"charWidth\":\"Širina (karaktera)\",\"maxChars\":\"Maksimalno karaktera\",\"required\":\"Required\",\"type\":\"Tip\",\"typeText\":\"Tekst\",\"typePass\":\"Lozinka\",\"typeEmail\":\"Email\",\"typeSearch\":\"Pretraži\",\"typeTel\":\"Broj telefona\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Format\",\"panelTitle\":\"Format\",\"tag_address\":\"Adresa\",\"tag_div\":\"Normalno (DIV)\",\"tag_h1\":\"Naslov 1\",\"tag_h2\":\"Naslov 2\",\"tag_h3\":\"Naslov 3\",\"tag_h4\":\"Naslov 4\",\"tag_h5\":\"Naslov 5\",\"tag_h6\":\"Naslov 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatirano\"},\"horizontalrule\":{\"toolbar\":\"Unesi horizontalnu liniju\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternativni tekst\",\"border\":\"Okvir\",\"btnUpload\":\"Pošalji na server\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Info slike\",\"linkTab\":\"Link\",\"lockRatio\":\"Zaključaj odnos\",\"menu\":\"Osobine slika\",\"resetSize\":\"Resetuj veličinu\",\"title\":\"Osobine slika\",\"titleButton\":\"Osobine dugmeta sa slikom\",\"upload\":\"Pošalji\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"Uvećaj levu marginu\",\"outdent\":\"Smanji levu marginu\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Unesi smajlija\",\"toolbar\":\"Smajli\"},\"justify\":{\"block\":\"Obostrano ravnanje\",\"center\":\"Centriran tekst\",\"left\":\"Levo ravnanje\",\"right\":\"Desno ravnanje\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Pristupni taster\",\"advanced\":\"Napredni tagovi\",\"advisoryContentType\":\"Advisory vrsta sadržaja\",\"advisoryTitle\":\"Advisory naslov\",\"anchor\":{\"toolbar\":\"Unesi/izmeni sidro\",\"menu\":\"Osobine sidra\",\"title\":\"Osobine sidra\",\"name\":\"Naziv sidra\",\"errorName\":\"Unesite naziv sidra\",\"remove\":\"Ukloni sidro\"},\"anchorId\":\"Po Id-u elementa\",\"anchorName\":\"Po nazivu sidra\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet klase\",\"emailAddress\":\"E-Mail adresa\",\"emailBody\":\"Sadržaj poruke\",\"emailSubject\":\"Naslov\",\"id\":\"Id\",\"info\":\"Link Info\",\"langCode\":\"Smer jezika\",\"langDir\":\"Smer jezika\",\"langDirLTR\":\"S leva na desno (LTR)\",\"langDirRTL\":\"S desna na levo (RTL)\",\"menu\":\"Izmeni link\",\"name\":\"Naziv\",\"noAnchors\":\"(Nema dostupnih sidra)\",\"noEmail\":\"Otkucajte adresu elektronske pote\",\"noUrl\":\"Unesite URL linka\",\"other\":\"<остало>\",\"popupDependent\":\"Zavisno (Netscape)\",\"popupFeatures\":\"Mogućnosti popup prozora\",\"popupFullScreen\":\"Prikaz preko celog ekrana (IE)\",\"popupLeft\":\"Od leve ivice ekrana (px)\",\"popupLocationBar\":\"Lokacija\",\"popupMenuBar\":\"Kontekstni meni\",\"popupResizable\":\"Promenljive veličine\",\"popupScrollBars\":\"Scroll bar\",\"popupStatusBar\":\"Statusna linija\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Od vrha ekrana (px)\",\"rel\":\"Odnos\",\"selectAnchor\":\"Odaberi sidro\",\"styles\":\"Stil\",\"tabIndex\":\"Tab indeks\",\"target\":\"Meta\",\"targetFrame\":\"<okvir>\",\"targetFrameName\":\"Naziv odredišnog frejma\",\"targetPopup\":\"<popup prozor>\",\"targetPopupName\":\"Naziv popup prozora\",\"title\":\"Link\",\"toAnchor\":\"Sidro na ovoj stranici\",\"toEmail\":\"E-Mail\",\"toUrl\":\"URL\",\"toolbar\":\"Unesi/izmeni link\",\"type\":\"Vrsta linka\",\"unlink\":\"Ukloni link\",\"upload\":\"Pošalji\"},\"list\":{\"bulletedlist\":\"Nenabrojiva lista\",\"numberedlist\":\"Nabrojiva lista\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"Nova stranica\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Zalepi kao čist tekst\",\"title\":\"Zalepi kao čist tekst\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Zalepi iz Worda\",\"toolbar\":\"Zalepi iz Worda\"},\"preview\":{\"preview\":\"Izgled stranice\"},\"print\":{\"toolbar\":\"Štampa\"},\"removeformat\":{\"toolbar\":\"Ukloni formatiranje\"},\"save\":{\"toolbar\":\"Sačuvaj\"},\"selectall\":{\"toolbar\":\"Označi sve\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Kôd\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"Odaberite specijalni karakter\",\"toolbar\":\"Unesi specijalni karakter\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Stil\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Veličina okvira\",\"caption\":\"Naslov tabele\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Obriši ćelije\",\"merge\":\"Spoj celije\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Razmak ćelija\",\"cellSpace\":\"Ćelijski prostor\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Obriši kolone\"},\"columns\":\"Kolona\",\"deleteTable\":\"Izbriši tabelu\",\"headers\":\"Zaglavlja\",\"headersBoth\":\"Oba\",\"headersColumn\":\"Prva kolona\",\"headersNone\":\"None\",\"headersRow\":\"Prvi red\",\"invalidBorder\":\"Veličina okvira mora biti broj.\",\"invalidCellPadding\":\"Padding polja mora biti pozitivan broj.\",\"invalidCellSpacing\":\"Razmak između ćelija mora biti pozitivan broj.\",\"invalidCols\":\"Broj kolona mora biti broj veći od 0.\",\"invalidHeight\":\"Visina tabele mora biti broj.\",\"invalidRows\":\"Broj redova mora biti veći od 0.\",\"invalidWidth\":\"Širina tabele mora biti broj.\",\"menu\":\"Osobine tabele\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Obriši redove\"},\"rows\":\"Redova\",\"summary\":\"Sažetak\",\"title\":\"Osobine tabele\",\"toolbar\":\"Tabela\",\"widthPc\":\"procenata\",\"widthPx\":\"piksela\",\"widthUnit\":\"jedinica za širinu\"},\"undo\":{\"redo\":\"Ponovi akciju\",\"undo\":\"Poni�ti akciju\"},\"wsc\":{\"btnIgnore\":\"Ignoriši\",\"btnIgnoreAll\":\"Ignoriši sve\",\"btnReplace\":\"Zameni\",\"btnReplaceAll\":\"Zameni sve\",\"btnUndo\":\"Vrati akciju\",\"changeTo\":\"Izmeni\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?\",\"manyChanges\":\"Provera spelovanja završena: %1 reč(i) je izmenjeno\",\"noChanges\":\"Provera spelovanja završena: Nije izmenjena nijedna rec\",\"noMispell\":\"Provera spelovanja završena: greške nisu pronadene\",\"noSuggestions\":\"- Bez sugestija -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Nije u rečniku\",\"oneChange\":\"Provera spelovanja završena: Izmenjena je jedna reč\",\"progress\":\"Provera spelovanja u toku...\",\"title\":\"Spell Checker\",\"toolbar\":\"Proveri spelovanje\"}};"
  },
  {
    "path": "assets/ckeditor/lang/sr.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['sr']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Press ALT 0 for help\",\"browseServer\":\"Претражи сервер\",\"url\":\"УРЛ\",\"protocol\":\"Протокол\",\"upload\":\"Пошаљи\",\"uploadSubmit\":\"Пошаљи на сервер\",\"image\":\"Слика\",\"flash\":\"Флеш елемент\",\"form\":\"Форма\",\"checkbox\":\"Поље за потврду\",\"radio\":\"Радио-дугме\",\"textField\":\"Текстуално поље\",\"textarea\":\"Зона текста\",\"hiddenField\":\"Скривено поље\",\"button\":\"Дугме\",\"select\":\"Изборно поље\",\"imageButton\":\"Дугме са сликом\",\"notSet\":\"<није постављено>\",\"id\":\"Ид\",\"name\":\"Назив\",\"langDir\":\"Смер језика\",\"langDirLtr\":\"С лева на десно (LTR)\",\"langDirRtl\":\"С десна на лево (RTL)\",\"langCode\":\"Kôд језика\",\"longDescr\":\"Пун опис УРЛ\",\"cssClass\":\"Stylesheet класе\",\"advisoryTitle\":\"Advisory наслов\",\"cssStyle\":\"Стил\",\"ok\":\"OK\",\"cancel\":\"Oткажи\",\"close\":\"Затвори\",\"preview\":\"Изглед странице\",\"resize\":\"Resize\",\"generalTab\":\"Опште\",\"advancedTab\":\"Напредни тагови\",\"validateNumberFailed\":\"Ова вредност није цигра.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Опције\",\"target\":\"Meтa\",\"targetNew\":\"New Window (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"Same Window (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"С лева на десно (LTR)\",\"langDirRTL\":\"С десна на лево (RTL)\",\"styles\":\"Стил\",\"cssClasses\":\"Stylesheet класе\",\"width\":\"Ширина\",\"height\":\"Висина\",\"align\":\"Равнање\",\"alignLeft\":\"Лево\",\"alignRight\":\"Десно\",\"alignCenter\":\"Средина\",\"alignJustify\":\"Обострано равнање\",\"alignTop\":\"Врх\",\"alignMiddle\":\"Средина\",\"alignBottom\":\"Доле\",\"alignNone\":\"None\",\"invalidValue\":\"Invalid value.\",\"invalidHeight\":\"Height must be a number.\",\"invalidWidth\":\"Width must be a number.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Подебљано\",\"italic\":\"Курзив\",\"strike\":\"Прецртано\",\"subscript\":\"Индекс\",\"superscript\":\"Степен\",\"underline\":\"Подвучено\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"Копирај\",\"copyError\":\"Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).\",\"cut\":\"Исеци\",\"cutError\":\"Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).\",\"paste\":\"Залепи\",\"pasteArea\":\"Залепи зону\",\"pasteMsg\":\"Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.\",\"securityMsg\":\"Због сигурносних подешавања претраживача, едитор не може да приступи оставу. Требате да га поново залепите у овом прозору.\",\"title\":\"Залепи\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"Аутоматски\",\"bgColorTitle\":\"Боја позадине\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"Више боја...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"Боја текста\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"Обрасци\",\"emptyListMsg\":\"(Нема дефинисаних образаца)\",\"insertOption\":\"Replace actual contents\",\"options\":\"Template Options\",\"selectPromptMsg\":\"Молимо Вас да одаберете образац који ће бити примењен на страницу (тренутни садржај ће бити обрисан):\",\"title\":\"Обрасци за садржај\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Advisory Title\",\"cssClassInputLabel\":\"Stylesheet Classes\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Left to Right (LTR)\",\"langDirLabel\":\"Language Direction\",\"langDirRTLLabel\":\"Right to Left (RTL)\",\"languageCodeInputLabel\":\" Language Code\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Style\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Склопи алатну траку\",\"toolbarExpand\":\"Прошири алатну траку\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"Едитор алатне траке\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Претрага\",\"findOptions\":\"Find Options\",\"findWhat\":\"Пронађи:\",\"matchCase\":\"Разликуј велика и мала слова\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"Упореди целе речи\",\"notFoundMsg\":\"Тражени текст није пронађен.\",\"replace\":\"Замена\",\"replaceAll\":\"Замени све\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"Замени са:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"Anchor\",\"flash\":\"Flash Animation\",\"hiddenfield\":\"Hidden Field\",\"iframe\":\"IFrame\",\"unknown\":\"Unknown Object\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Always\",\"accessNever\":\"Never\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Abs доле\",\"alignAbsMiddle\":\"Abs средина\",\"alignBaseline\":\"Базно\",\"alignTextTop\":\"Врх текста\",\"bgcolor\":\"Боја позадине\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Понављај\",\"chkMenu\":\"Укључи флеш мени\",\"chkPlay\":\"Аутоматски старт\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"HSpace\",\"properties\":\"Особине Флеша\",\"propertiesTab\":\"Properties\",\"quality\":\"Quality\",\"qualityAutoHigh\":\"Auto High\",\"qualityAutoLow\":\"Auto Low\",\"qualityBest\":\"Best\",\"qualityHigh\":\"High\",\"qualityLow\":\"Low\",\"qualityMedium\":\"Medium\",\"scale\":\"Скалирај\",\"scaleAll\":\"Прикажи све\",\"scaleFit\":\"Попуни површину\",\"scaleNoBorder\":\"Без ивице\",\"title\":\"Особине флеша\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace must be a number.\",\"validateSrc\":\"Унесите УРЛ линка\",\"validateVSpace\":\"VSpace must be a number.\",\"windowMode\":\"Window mode\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Window\"},\"font\":{\"fontSize\":{\"label\":\"Величина фонта\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Величина фонта\"},\"label\":\"Фонт\",\"panelTitle\":\"Фонт\",\"voiceLabel\":\"Фонт\"},\"forms\":{\"button\":{\"title\":\"Особине дугмета\",\"text\":\"Текст (вредност)\",\"type\":\"Tип\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Особине поља за потврду\",\"radioTitle\":\"Особине радио-дугмета\",\"value\":\"Вредност\",\"selected\":\"Означено\",\"required\":\"Required\"},\"form\":{\"title\":\"Особине форме\",\"menu\":\"Особине форме\",\"action\":\"Aкција\",\"method\":\"Mетода\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"Особине скривеног поља\",\"name\":\"Назив\",\"value\":\"Вредност\"},\"select\":{\"title\":\"Особине изборног поља\",\"selectInfo\":\"Инфо\",\"opAvail\":\"Доступне опције\",\"value\":\"Вредност\",\"size\":\"Величина\",\"lines\":\"линија\",\"chkMulti\":\"Дозволи вишеструку селекцију\",\"required\":\"Required\",\"opText\":\"Текст\",\"opValue\":\"Вредност\",\"btnAdd\":\"Додај\",\"btnModify\":\"Измени\",\"btnUp\":\"Горе\",\"btnDown\":\"Доле\",\"btnSetValue\":\"Подеси као означену вредност\",\"btnDelete\":\"Обриши\"},\"textarea\":{\"title\":\"Особине зоне текста\",\"cols\":\"Број колона\",\"rows\":\"Број редова\"},\"textfield\":{\"title\":\"Особине текстуалног поља\",\"name\":\"Назив\",\"value\":\"Вредност\",\"charWidth\":\"Ширина (карактера)\",\"maxChars\":\"Максимално карактера\",\"required\":\"Required\",\"type\":\"Тип\",\"typeText\":\"Текст\",\"typePass\":\"Лозинка\",\"typeEmail\":\"Е-пошта\",\"typeSearch\":\"Претрага\",\"typeTel\":\"Број телефона\",\"typeUrl\":\"УРЛ\"}},\"format\":{\"label\":\"Формат\",\"panelTitle\":\"Формат\",\"tag_address\":\"Adresa\",\"tag_div\":\"Нормално (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatirano\"},\"horizontalrule\":{\"toolbar\":\"Унеси хоризонталну линију\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Алтернативни текст\",\"border\":\"Оквир\",\"btnUpload\":\"Пошаљи на сервер\",\"button2Img\":\"Да ли желите да промените одабрану слику дугмета као једноставну слику?\",\"hSpace\":\"HSpace\",\"img2Button\":\"Да ли желите да промените одабрану слику у слику дугмета?\",\"infoTab\":\"Инфо слике\",\"linkTab\":\"Линк\",\"lockRatio\":\"Закључај однос\",\"menu\":\"Особине слика\",\"resetSize\":\"Ресетуј величину\",\"title\":\"Особине слика\",\"titleButton\":\"Особине дугмета са сликом\",\"upload\":\"Пошаљи\",\"urlMissing\":\"Недостаје УРЛ слике.\",\"vSpace\":\"VSpace\",\"validateBorder\":\"Ивица треба да буде цифра.\",\"validateHSpace\":\"HSpace треба да буде цифра.\",\"validateVSpace\":\"VSpace треба да буде цифра.\"},\"indent\":{\"indent\":\"Увећај леву маргину\",\"outdent\":\"Смањи леву маргину\"},\"smiley\":{\"options\":\"Smiley Options\",\"title\":\"Унеси смајлија\",\"toolbar\":\"Смајли\"},\"justify\":{\"block\":\"Обострано равнање\",\"center\":\"Центриран текст\",\"left\":\"Лево равнање\",\"right\":\"Десно равнање\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"Приступни тастер\",\"advanced\":\"Напредни тагови\",\"advisoryContentType\":\"Advisory врста садржаја\",\"advisoryTitle\":\"Advisory наслов\",\"anchor\":{\"toolbar\":\"Унеси/измени сидро\",\"menu\":\"Особине сидра\",\"title\":\"Особине сидра\",\"name\":\"Име сидра\",\"errorName\":\"Молимо Вас да унесете име сидра\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"Пo Ид-jу елемента\",\"anchorName\":\"По називу сидра\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Stylesheet класе\",\"emailAddress\":\"Адреса електронске поште\",\"emailBody\":\"Садржај поруке\",\"emailSubject\":\"Наслов\",\"id\":\"Ид\",\"info\":\"Линк инфо\",\"langCode\":\"Смер језика\",\"langDir\":\"Смер језика\",\"langDirLTR\":\"С лева на десно (LTR)\",\"langDirRTL\":\"С десна на лево (RTL)\",\"menu\":\"Промени линк\",\"name\":\"Назив\",\"noAnchors\":\"(Нема доступних сидра)\",\"noEmail\":\"Откуцајте адресу електронске поште\",\"noUrl\":\"Унесите УРЛ линка\",\"other\":\"<друго>\",\"popupDependent\":\"Зависно (Netscape)\",\"popupFeatures\":\"Могућности искачућег прозора\",\"popupFullScreen\":\"Приказ преко целог екрана (ИE)\",\"popupLeft\":\"Од леве ивице екрана (пиксела)\",\"popupLocationBar\":\"Локација\",\"popupMenuBar\":\"Контекстни мени\",\"popupResizable\":\"Величина се мења\",\"popupScrollBars\":\"Скрол бар\",\"popupStatusBar\":\"Статусна линија\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Од врха екрана (пиксела)\",\"rel\":\"Однос\",\"selectAnchor\":\"Одабери сидро\",\"styles\":\"Стил\",\"tabIndex\":\"Таб индекс\",\"target\":\"Meтa\",\"targetFrame\":\"<оквир>\",\"targetFrameName\":\"Назив одредишног фрејма\",\"targetPopup\":\"<искачући прозор>\",\"targetPopupName\":\"Назив искачућег прозора\",\"title\":\"Линк\",\"toAnchor\":\"Сидро на овој страници\",\"toEmail\":\"Eлектронска пошта\",\"toUrl\":\"УРЛ\",\"toolbar\":\"Унеси/измени линк\",\"type\":\"Врста линка\",\"unlink\":\"Уклони линк\",\"upload\":\"Пошаљи\"},\"list\":{\"bulletedlist\":\"Ненабројива листа\",\"numberedlist\":\"Набројиву листу\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"Maximize\",\"minimize\":\"Minimize\"},\"newpage\":{\"toolbar\":\"Нова страница\"},\"pagebreak\":{\"alt\":\"Page Break\",\"toolbar\":\"Insert Page Break for Printing\"},\"pastetext\":{\"button\":\"Залепи као чист текст\",\"title\":\"Залепи као чист текст\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Залепи из Worda\",\"toolbar\":\"Залепи из Worda\"},\"preview\":{\"preview\":\"Изглед странице\"},\"print\":{\"toolbar\":\"Штампа\"},\"removeformat\":{\"toolbar\":\"Уклони форматирање\"},\"save\":{\"toolbar\":\"Сачувај\"},\"selectall\":{\"toolbar\":\"Означи све\"},\"showblocks\":{\"toolbar\":\"Show Blocks\"},\"sourcearea\":{\"toolbar\":\"Kôд\"},\"specialchar\":{\"options\":\"Опције специјалног карактера\",\"title\":\"Одаберите специјални карактер\",\"toolbar\":\"Унеси специјални карактер\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Стил\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"Величина оквира\",\"caption\":\"Наслов табеле\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"Обриши ћелије\",\"merge\":\"Спој ћелије\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"Размак ћелија\",\"cellSpace\":\"Ћелијски простор\",\"column\":{\"menu\":\"Column\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"Обриши колоне\"},\"columns\":\"Kолона\",\"deleteTable\":\"Обриши таблу\",\"headers\":\"Поглавља\",\"headersBoth\":\"Оба\",\"headersColumn\":\"Прва колона\",\"headersNone\":\"None\",\"headersRow\":\"Први ред\",\"invalidBorder\":\"Величина ивице треба да буде цифра.\",\"invalidCellPadding\":\"Пуњење ћелије треба да буде позитивна цифра.\",\"invalidCellSpacing\":\"Размак ћелије треба да буде позитивна цифра.\",\"invalidCols\":\"Број колона треба да буде цифра већа од 0.\",\"invalidHeight\":\"Висина табеле треба да буде цифра.\",\"invalidRows\":\"Број реда треба да буде цифра већа од 0.\",\"invalidWidth\":\"Ширина табеле треба да буде цифра.\",\"menu\":\"Особине табеле\",\"row\":{\"menu\":\"Row\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"Обриши редове\"},\"rows\":\"Редова\",\"summary\":\"Резиме\",\"title\":\"Особине табеле\",\"toolbar\":\"Табела\",\"widthPc\":\"процената\",\"widthPx\":\"пиксела\",\"widthUnit\":\"јединица ширине\"},\"undo\":{\"redo\":\"Понови акцију\",\"undo\":\"Поништи акцију\"},\"wsc\":{\"btnIgnore\":\"Игнориши\",\"btnIgnoreAll\":\"Игнориши све\",\"btnReplace\":\"Замени\",\"btnReplaceAll\":\"Замени све\",\"btnUndo\":\"Врати акцију\",\"changeTo\":\"Измени\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Провера спеловања није инсталирана. Да ли желите да је скинете са Интернета?\",\"manyChanges\":\"Провера спеловања завршена:  %1 реч(и) је измењено\",\"noChanges\":\"Провера спеловања завршена: Није измењена ниједна реч\",\"noMispell\":\"Провера спеловања завршена: грешке нису пронађене\",\"noSuggestions\":\"- Без сугестија -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Није у речнику\",\"oneChange\":\"Провера спеловања завршена: Измењена је једна реч\",\"progress\":\"Провера спеловања у току...\",\"title\":\"Spell Checker\",\"toolbar\":\"Провери спеловање\"}};"
  },
  {
    "path": "assets/ckeditor/lang/sv.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['sv']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Tryck ALT 0 för hjälp\",\"browseServer\":\"Bläddra på server\",\"url\":\"URL\",\"protocol\":\"Protokoll\",\"upload\":\"Ladda upp\",\"uploadSubmit\":\"Skicka till server\",\"image\":\"Bild\",\"flash\":\"Flash\",\"form\":\"Formulär\",\"checkbox\":\"Kryssruta\",\"radio\":\"Alternativknapp\",\"textField\":\"Textfält\",\"textarea\":\"Textruta\",\"hiddenField\":\"Dolt fält\",\"button\":\"Knapp\",\"select\":\"Flervalslista\",\"imageButton\":\"Bildknapp\",\"notSet\":\"<ej angivet>\",\"id\":\"Id\",\"name\":\"Namn\",\"langDir\":\"Språkriktning\",\"langDirLtr\":\"Vänster till Höger (VTH)\",\"langDirRtl\":\"Höger till Vänster (HTV)\",\"langCode\":\"Språkkod\",\"longDescr\":\"URL-beskrivning\",\"cssClass\":\"Stilmall\",\"advisoryTitle\":\"Titel\",\"cssStyle\":\"Stilmall\",\"ok\":\"OK\",\"cancel\":\"Avbryt\",\"close\":\"Stäng\",\"preview\":\"Förhandsgranska\",\"resize\":\"Dra för att ändra storlek\",\"generalTab\":\"Allmänt\",\"advancedTab\":\"Avancerad\",\"validateNumberFailed\":\"Värdet är inte ett nummer.\",\"confirmNewPage\":\"Alla ändringar i innehållet kommer att förloras. Är du säker på att du vill ladda en ny sida?\",\"confirmCancel\":\"Några av alternativen har ändrats. Är du säker på att du vill stänga dialogrutan?\",\"options\":\"Alternativ\",\"target\":\"Mål\",\"targetNew\":\"Nytt fönster (_blank)\",\"targetTop\":\"Översta fönstret (_top)\",\"targetSelf\":\"Samma fönster (_self)\",\"targetParent\":\"Föregående fönster (_parent)\",\"langDirLTR\":\"Vänster till höger (LTR)\",\"langDirRTL\":\"Höger till vänster (RTL)\",\"styles\":\"Stil\",\"cssClasses\":\"Stilmallar\",\"width\":\"Bredd\",\"height\":\"Höjd\",\"align\":\"Justering\",\"alignLeft\":\"Vänster\",\"alignRight\":\"Höger\",\"alignCenter\":\"Centrerad\",\"alignJustify\":\"Justera till marginaler\",\"alignTop\":\"Överkant\",\"alignMiddle\":\"Mitten\",\"alignBottom\":\"Nederkant\",\"alignNone\":\"Ingen\",\"invalidValue\":\"Felaktigt värde.\",\"invalidHeight\":\"Höjd måste vara ett nummer.\",\"invalidWidth\":\"Bredd måste vara ett nummer.\",\"invalidCssLength\":\"Värdet för fältet \\\"%1\\\" måste vara ett positivt nummer med eller utan CSS-mätenheter (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"invalidHtmlLength\":\"Värdet för fältet \\\"%1\\\" måste vara ett positivt nummer med eller utan godkända HTML-mätenheter (px eller %).\",\"invalidInlineStyle\":\"Det angivna värdet för style måste innehålla en eller flera tupler separerade med semikolon i följande format: \\\"name : value\\\"\",\"cssLengthTooltip\":\"Ange ett nummer i pixlar eller ett nummer men godkänd CSS-mätenhet (px, %, in, cm, mm, em, ex, pt, eller pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, Ej tillgänglig</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Alla rättigheter reserverade.\",\"dlgTitle\":\"Om CKEditor\",\"help\":\"Se $1 för hjälp.\",\"moreInfo\":\"För information av licensiering besök vår hemsida:\",\"title\":\"Om CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"Fet\",\"italic\":\"Kursiv\",\"strike\":\"Genomstruken\",\"subscript\":\"Nedsänkta tecken\",\"superscript\":\"Upphöjda tecken\",\"underline\":\"Understruken\"},\"bidi\":{\"ltr\":\"Text riktning från vänster till höger\",\"rtl\":\"Text riktning från höger till vänster\"},\"blockquote\":{\"toolbar\":\"Blockcitat\"},\"clipboard\":{\"copy\":\"Kopiera\",\"copyError\":\"Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.\",\"cut\":\"Klipp ut\",\"cutError\":\"Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.\",\"paste\":\"Klistra in\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"Var god och klistra in Er text i rutan nedan genom att använda (<strong>Ctrl/Cmd+V</strong>) klicka sen på OK.\",\"securityMsg\":\"På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.\",\"title\":\"Klistra in\"},\"button\":{\"selectedLabel\":\"%1 (Vald)\"},\"colorbutton\":{\"auto\":\"Automatisk\",\"bgColorTitle\":\"Bakgrundsfärg\",\"colors\":{\"000\":\"Svart\",\"800000\":\"Rödbrun\",\"8B4513\":\"Mörkbrun\",\"2F4F4F\":\"Skiffergrå\",\"008080\":\"Kricka\",\"000080\":\"Marinblå\",\"4B0082\":\"Indigo\",\"696969\":\"Mörkgrå\",\"B22222\":\"Tegelsten\",\"A52A2A\":\"Brun\",\"DAA520\":\"Mörk guld\",\"006400\":\"Mörkgrön\",\"40E0D0\":\"Turkos\",\"0000CD\":\"Medium blå\",\"800080\":\"Lila\",\"808080\":\"Grå\",\"F00\":\"Röd\",\"FF8C00\":\"Mörkorange\",\"FFD700\":\"Guld\",\"008000\":\"Grön\",\"0FF\":\"Turkos\",\"00F\":\"Blå\",\"EE82EE\":\"Violett\",\"A9A9A9\":\"Matt grå\",\"FFA07A\":\"Laxrosa\",\"FFA500\":\"Orange\",\"FFFF00\":\"Gul\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Ljusturkos\",\"ADD8E6\":\"Ljusblå\",\"DDA0DD\":\"Plommon\",\"D3D3D3\":\"Ljusgrå\",\"FFF0F5\":\"Ljus lavendel\",\"FAEBD7\":\"Antikvit\",\"FFFFE0\":\"Ljusgul\",\"F0FFF0\":\"Honungsdagg\",\"F0FFFF\":\"Azurblå\",\"F0F8FF\":\"Aliceblå\",\"E6E6FA\":\"Lavendel\",\"FFF\":\"Vit\"},\"more\":\"Fler färger...\",\"panelTitle\":\"Färger\",\"textColorTitle\":\"Textfärg\"},\"colordialog\":{\"clear\":\"Rensa\",\"highlight\":\"Markera\",\"options\":\"Färgalternativ\",\"selected\":\"Vald färg\",\"title\":\"Välj färg\"},\"templates\":{\"button\":\"Sidmallar\",\"emptyListMsg\":\"(Ingen mall är vald)\",\"insertOption\":\"Ersätt aktuellt innehåll\",\"options\":\"Inställningar för mall\",\"selectPromptMsg\":\"Var god välj en mall att använda med editorn<br>(allt nuvarande innehåll raderas):\",\"title\":\"Sidmallar\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Rådgivande titel\",\"cssClassInputLabel\":\"Stilmallar\",\"edit\":\"Redigera Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"Vänster till höger (LTR)\",\"langDirLabel\":\"Språkriktning\",\"langDirRTLLabel\":\"Höger till vänster (RTL)\",\"languageCodeInputLabel\":\" Språkkod\",\"remove\":\"Ta bort Div\",\"styleSelectLabel\":\"Stil\",\"title\":\"Skapa Div container\",\"toolbar\":\"Skapa Div container\"},\"toolbar\":{\"toolbarCollapse\":\"Dölj verktygsfält\",\"toolbarExpand\":\"Visa verktygsfält\",\"toolbarGroups\":{\"document\":\"Dokument\",\"clipboard\":\"Urklipp/ångra\",\"editing\":\"Redigering\",\"forms\":\"Formulär\",\"basicstyles\":\"Basstilar\",\"paragraph\":\"Paragraf\",\"links\":\"Länkar\",\"insert\":\"Infoga\",\"styles\":\"Stilar\",\"colors\":\"Färger\",\"tools\":\"Verktyg\"},\"toolbars\":\"Redigera verktygsfält\"},\"elementspath\":{\"eleLabel\":\"Elementets sökväg\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"Sök\",\"findOptions\":\"Sökalternativ\",\"findWhat\":\"Sök efter:\",\"matchCase\":\"Skiftläge\",\"matchCyclic\":\"Matcha cykliska\",\"matchWord\":\"Inkludera hela ord\",\"notFoundMsg\":\"Angiven text kunde ej hittas.\",\"replace\":\"Ersätt\",\"replaceAll\":\"Ersätt alla\",\"replaceSuccessMsg\":\"%1 förekomst(er) ersatta.\",\"replaceWith\":\"Ersätt med:\",\"title\":\"Sök och ersätt\"},\"fakeobjects\":{\"anchor\":\"Ankare\",\"flash\":\"Flashanimation\",\"hiddenfield\":\"Gömt fält\",\"iframe\":\"iFrame\",\"unknown\":\"Okänt objekt\"},\"flash\":{\"access\":\"Script-tillgång\",\"accessAlways\":\"Alltid\",\"accessNever\":\"Aldrig\",\"accessSameDomain\":\"Samma domän\",\"alignAbsBottom\":\"Absolut nederkant\",\"alignAbsMiddle\":\"Absolut centrering\",\"alignBaseline\":\"Baslinje\",\"alignTextTop\":\"Text överkant\",\"bgcolor\":\"Bakgrundsfärg\",\"chkFull\":\"Tillåt helskärm\",\"chkLoop\":\"Upprepa/Loopa\",\"chkMenu\":\"Aktivera Flashmeny\",\"chkPlay\":\"Automatisk uppspelning\",\"flashvars\":\"Variabler för Flash\",\"hSpace\":\"Horis. marginal\",\"properties\":\"Flashegenskaper\",\"propertiesTab\":\"Egenskaper\",\"quality\":\"Kvalitet\",\"qualityAutoHigh\":\"Auto Hög\",\"qualityAutoLow\":\"Auto Låg\",\"qualityBest\":\"Bäst\",\"qualityHigh\":\"Hög\",\"qualityLow\":\"Låg\",\"qualityMedium\":\"Medium\",\"scale\":\"Skala\",\"scaleAll\":\"Visa allt\",\"scaleFit\":\"Exakt passning\",\"scaleNoBorder\":\"Ingen ram\",\"title\":\"Flashegenskaper\",\"vSpace\":\"Vert. marginal\",\"validateHSpace\":\"HSpace måste vara ett nummer.\",\"validateSrc\":\"Var god ange länkens URL\",\"validateVSpace\":\"VSpace måste vara ett nummer.\",\"windowMode\":\"Fönsterläge\",\"windowModeOpaque\":\"Opaque\",\"windowModeTransparent\":\"Transparent\",\"windowModeWindow\":\"Fönster\"},\"font\":{\"fontSize\":{\"label\":\"Storlek\",\"voiceLabel\":\"Teckenstorlek\",\"panelTitle\":\"Teckenstorlek\"},\"label\":\"Typsnitt\",\"panelTitle\":\"Typsnitt\",\"voiceLabel\":\"Typsnitt\"},\"forms\":{\"button\":{\"title\":\"Egenskaper för knapp\",\"text\":\"Text (värde)\",\"type\":\"Typ\",\"typeBtn\":\"Knapp\",\"typeSbm\":\"Skicka\",\"typeRst\":\"Återställ\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Egenskaper för kryssruta\",\"radioTitle\":\"Egenskaper för alternativknapp\",\"value\":\"Värde\",\"selected\":\"Vald\",\"required\":\"Krävs\"},\"form\":{\"title\":\"Egenskaper för formulär\",\"menu\":\"Egenskaper för formulär\",\"action\":\"Funktion\",\"method\":\"Metod\",\"encoding\":\"Kodning\"},\"hidden\":{\"title\":\"Egenskaper för dolt fält\",\"name\":\"Namn\",\"value\":\"Värde\"},\"select\":{\"title\":\"Egenskaper för flervalslista\",\"selectInfo\":\"Information\",\"opAvail\":\"Befintliga val\",\"value\":\"Värde\",\"size\":\"Storlek\",\"lines\":\"Linjer\",\"chkMulti\":\"Tillåt flerval\",\"required\":\"Krävs\",\"opText\":\"Text\",\"opValue\":\"Värde\",\"btnAdd\":\"Lägg till\",\"btnModify\":\"Redigera\",\"btnUp\":\"Upp\",\"btnDown\":\"Ner\",\"btnSetValue\":\"Markera som valt värde\",\"btnDelete\":\"Radera\"},\"textarea\":{\"title\":\"Egenskaper för textruta\",\"cols\":\"Kolumner\",\"rows\":\"Rader\"},\"textfield\":{\"title\":\"Egenskaper för textfält\",\"name\":\"Namn\",\"value\":\"Värde\",\"charWidth\":\"Teckenbredd\",\"maxChars\":\"Max antal tecken\",\"required\":\"Krävs\",\"type\":\"Typ\",\"typeText\":\"Text\",\"typePass\":\"Lösenord\",\"typeEmail\":\"E-post\",\"typeSearch\":\"Sök\",\"typeTel\":\"Telefonnummer\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Teckenformat\",\"panelTitle\":\"Teckenformat\",\"tag_address\":\"Adress\",\"tag_div\":\"Normal (DIV)\",\"tag_h1\":\"Rubrik 1\",\"tag_h2\":\"Rubrik 2\",\"tag_h3\":\"Rubrik 3\",\"tag_h4\":\"Rubrik 4\",\"tag_h5\":\"Rubrik 5\",\"tag_h6\":\"Rubrik 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formaterad\"},\"horizontalrule\":{\"toolbar\":\"Infoga horisontal linje\"},\"iframe\":{\"border\":\"Visa ramkant\",\"noUrl\":\"Skriv in URL för iFrame\",\"scrolling\":\"Aktivera rullningslister\",\"title\":\"iFrame Egenskaper\",\"toolbar\":\"iFrame\"},\"image\":{\"alt\":\"Alternativ text\",\"border\":\"Kant\",\"btnUpload\":\"Skicka till server\",\"button2Img\":\"Vill du omvandla den valda bildknappen på en enkel bild?\",\"hSpace\":\"Horis. marginal\",\"img2Button\":\"Vill du omvandla den valda bildknappen på en enkel bild?\",\"infoTab\":\"Bildinformation\",\"linkTab\":\"Länk\",\"lockRatio\":\"Lås höjd/bredd förhållanden\",\"menu\":\"Bildegenskaper\",\"resetSize\":\"Återställ storlek\",\"title\":\"Bildegenskaper\",\"titleButton\":\"Egenskaper för bildknapp\",\"upload\":\"Ladda upp\",\"urlMissing\":\"Bildkällans URL saknas.\",\"vSpace\":\"Vert. marginal\",\"validateBorder\":\"Kantlinje måste vara ett heltal.\",\"validateHSpace\":\"HSpace måste vara ett heltal.\",\"validateVSpace\":\"VSpace måste vara ett heltal.\"},\"indent\":{\"indent\":\"Öka indrag\",\"outdent\":\"Minska indrag\"},\"smiley\":{\"options\":\"Smileyinställningar\",\"title\":\"Infoga smiley\",\"toolbar\":\"Smiley\"},\"justify\":{\"block\":\"Justera till marginaler\",\"center\":\"Centrera\",\"left\":\"Vänsterjustera\",\"right\":\"Högerjustera\"},\"language\":{\"button\":\"Sätt språk\",\"remove\":\"Ta bort språk\"},\"link\":{\"acccessKey\":\"Behörighetsnyckel\",\"advanced\":\"Avancerad\",\"advisoryContentType\":\"Innehållstyp\",\"advisoryTitle\":\"Titel\",\"anchor\":{\"toolbar\":\"Infoga/Redigera ankarlänk\",\"menu\":\"Egenskaper för ankarlänk\",\"title\":\"Egenskaper för ankarlänk\",\"name\":\"Ankarnamn\",\"errorName\":\"Var god ange ett ankarnamn\",\"remove\":\"Radera ankare\"},\"anchorId\":\"Efter element-id\",\"anchorName\":\"Efter ankarnamn\",\"charset\":\"Teckenuppställning\",\"cssClasses\":\"Stilmall\",\"emailAddress\":\"E-postadress\",\"emailBody\":\"Innehåll\",\"emailSubject\":\"Ämne\",\"id\":\"Id\",\"info\":\"Länkinformation\",\"langCode\":\"Språkkod\",\"langDir\":\"Språkriktning\",\"langDirLTR\":\"Vänster till höger (VTH)\",\"langDirRTL\":\"Höger till vänster (HTV)\",\"menu\":\"Redigera länk\",\"name\":\"Namn\",\"noAnchors\":\"(Inga ankare kunde hittas)\",\"noEmail\":\"Var god ange e-postadress\",\"noUrl\":\"Var god ange länkens URL\",\"other\":\"<annan>\",\"popupDependent\":\"Beroende (endast Netscape)\",\"popupFeatures\":\"Popup-fönstrets egenskaper\",\"popupFullScreen\":\"Helskärm (endast IE)\",\"popupLeft\":\"Position från vänster\",\"popupLocationBar\":\"Adressfält\",\"popupMenuBar\":\"Menyfält\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scrolllista\",\"popupStatusBar\":\"Statusfält\",\"popupToolbar\":\"Verktygsfält\",\"popupTop\":\"Position från sidans topp\",\"rel\":\"Förhållande\",\"selectAnchor\":\"Välj ett ankare\",\"styles\":\"Stilmall\",\"tabIndex\":\"Tabindex\",\"target\":\"Mål\",\"targetFrame\":\"<ram>\",\"targetFrameName\":\"Målets ramnamn\",\"targetPopup\":\"<popup-fönster>\",\"targetPopupName\":\"Popup-fönstrets namn\",\"title\":\"Länk\",\"toAnchor\":\"Länk till ankare i texten\",\"toEmail\":\"E-post\",\"toUrl\":\"URL\",\"toolbar\":\"Infoga/Redigera länk\",\"type\":\"Länktyp\",\"unlink\":\"Radera länk\",\"upload\":\"Ladda upp\"},\"list\":{\"bulletedlist\":\"Infoga/ta bort punktlista\",\"numberedlist\":\"Infoga/ta bort numrerad lista\"},\"liststyle\":{\"armenian\":\"Armenisk numrering\",\"bulletedTitle\":\"Egenskaper för punktlista\",\"circle\":\"Cirkel\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal nolla (01, 02, 03, etc.)\",\"disc\":\"Disk\",\"georgian\":\"Georgisk numrering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Alpha gemener (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Grekiska gemener (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Romerska gemener (i, ii, iii, iv, v, etc.)\",\"none\":\"Ingen\",\"notset\":\"<ej angiven>\",\"numberedTitle\":\"Egenskaper för punktlista\",\"square\":\"Fyrkant\",\"start\":\"Start\",\"type\":\"Typ\",\"upperAlpha\":\"Alpha versaler (A, B, C, D, E, etc.)\",\"upperRoman\":\"Romerska versaler (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"Listans startnummer måste vara ett heltal.\"},\"magicline\":{\"title\":\"Infoga paragraf här\"},\"maximize\":{\"maximize\":\"Maximera\",\"minimize\":\"Minimera\"},\"newpage\":{\"toolbar\":\"Ny sida\"},\"pagebreak\":{\"alt\":\"Sidbrytning\",\"toolbar\":\"Infoga sidbrytning för utskrift\"},\"pastetext\":{\"button\":\"Klistra in som vanlig text\",\"title\":\"Klistra in som vanlig text\"},\"pastefromword\":{\"confirmCleanup\":\"Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa den innan du klistrar in den?\",\"error\":\"Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel\",\"title\":\"Klistra in från Word\",\"toolbar\":\"Klistra in från Word\"},\"preview\":{\"preview\":\"Förhandsgranska\"},\"print\":{\"toolbar\":\"Skriv ut\"},\"removeformat\":{\"toolbar\":\"Radera formatering\"},\"save\":{\"toolbar\":\"Spara\"},\"selectall\":{\"toolbar\":\"Markera allt\"},\"showblocks\":{\"toolbar\":\"Visa block\"},\"sourcearea\":{\"toolbar\":\"Källa\"},\"specialchar\":{\"options\":\"Alternativ för utökade tecken\",\"title\":\"Välj utökat tecken\",\"toolbar\":\"Klistra in utökat tecken\"},\"scayt\":{\"btn_about\":\"Om SCAYT\",\"btn_dictionaries\":\"Ordlistor\",\"btn_disable\":\"Inaktivera SCAYT\",\"btn_enable\":\"Aktivera SCAYT\",\"btn_langs\":\"Språk\",\"btn_options\":\"Inställningar\",\"text_title\":\"Stavningskontroll medan du skriver\"},\"stylescombo\":{\"label\":\"Anpassad stil\",\"panelTitle\":\"Formatmallar\",\"panelTitle1\":\"Blockstil\",\"panelTitle2\":\"Inbäddad stil\",\"panelTitle3\":\"Objektets stil\"},\"table\":{\"border\":\"Kantstorlek\",\"caption\":\"Rubrik\",\"cell\":{\"menu\":\"Cell\",\"insertBefore\":\"Lägg till cell före\",\"insertAfter\":\"Lägg till cell efter\",\"deleteCell\":\"Radera celler\",\"merge\":\"Sammanfoga celler\",\"mergeRight\":\"Sammanfoga höger\",\"mergeDown\":\"Sammanfoga ner\",\"splitHorizontal\":\"Dela cell horisontellt\",\"splitVertical\":\"Dela cell vertikalt\",\"title\":\"Egenskaper för cell\",\"cellType\":\"Celltyp\",\"rowSpan\":\"Rad spann\",\"colSpan\":\"Kolumnen spann\",\"wordWrap\":\"Radbrytning\",\"hAlign\":\"Horisontell justering\",\"vAlign\":\"Vertikal justering\",\"alignBaseline\":\"Baslinje\",\"bgColor\":\"Bakgrundsfärg\",\"borderColor\":\"Ramfärg\",\"data\":\"Data\",\"header\":\"Rubrik\",\"yes\":\"Ja\",\"no\":\"Nej\",\"invalidWidth\":\"Cellens bredd måste vara ett nummer.\",\"invalidHeight\":\"Cellens höjd måste vara ett nummer.\",\"invalidRowSpan\":\"Radutvidgning måste vara ett heltal.\",\"invalidColSpan\":\"Kolumn måste vara ett heltal.\",\"chooseColor\":\"Välj\"},\"cellPad\":\"Cellutfyllnad\",\"cellSpace\":\"Cellavstånd\",\"column\":{\"menu\":\"Kolumn\",\"insertBefore\":\"Lägg till kolumn före\",\"insertAfter\":\"Lägg till kolumn efter\",\"deleteColumn\":\"Radera kolumn\"},\"columns\":\"Kolumner\",\"deleteTable\":\"Radera tabell\",\"headers\":\"Rubriker\",\"headersBoth\":\"Båda\",\"headersColumn\":\"Första kolumnen\",\"headersNone\":\"Ingen\",\"headersRow\":\"Första raden\",\"invalidBorder\":\"Ram måste vara ett nummer.\",\"invalidCellPadding\":\"Luft i cell måste vara ett nummer.\",\"invalidCellSpacing\":\"Luft i cell måste vara ett nummer.\",\"invalidCols\":\"Antal kolumner måste vara ett nummer större än 0.\",\"invalidHeight\":\"Tabellens höjd måste vara ett nummer.\",\"invalidRows\":\"Antal rader måste vara större än 0.\",\"invalidWidth\":\"Tabell måste vara ett nummer.\",\"menu\":\"Tabellegenskaper\",\"row\":{\"menu\":\"Rad\",\"insertBefore\":\"Lägg till rad före\",\"insertAfter\":\"Lägg till rad efter\",\"deleteRow\":\"Radera rad\"},\"rows\":\"Rader\",\"summary\":\"Sammanfattning\",\"title\":\"Tabellegenskaper\",\"toolbar\":\"Tabell\",\"widthPc\":\"procent\",\"widthPx\":\"pixlar\",\"widthUnit\":\"enhet bredd\"},\"undo\":{\"redo\":\"Gör om\",\"undo\":\"Ångra\"},\"wsc\":{\"btnIgnore\":\"Ignorera\",\"btnIgnoreAll\":\"Ignorera alla\",\"btnReplace\":\"Ersätt\",\"btnReplaceAll\":\"Ersätt alla\",\"btnUndo\":\"Ångra\",\"changeTo\":\"Ändra till\",\"errorLoading\":\"Tjänsten är ej tillgänglig: %s.\",\"ieSpellDownload\":\"Stavningskontrollen är ej installerad. Vill du göra det nu?\",\"manyChanges\":\"Stavningskontroll slutförd: %1 ord rättades.\",\"noChanges\":\"Stavningskontroll slutförd: Inga ord rättades.\",\"noMispell\":\"Stavningskontroll slutförd: Inga stavfel påträffades.\",\"noSuggestions\":\"- Förslag saknas -\",\"notAvailable\":\"Tyvärr är tjänsten ej tillgänglig nu\",\"notInDic\":\"Saknas i ordlistan\",\"oneChange\":\"Stavningskontroll slutförd: Ett ord rättades.\",\"progress\":\"Stavningskontroll pågår...\",\"title\":\"Kontrollera stavning\",\"toolbar\":\"Stavningskontroll\"}};"
  },
  {
    "path": "assets/ckeditor/lang/th.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['th']={\"editor\":\"Rich Text Editor\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"กด ALT 0 หากต้องการความช่วยเหลือ\",\"browseServer\":\"เปิดหน้าต่างจัดการไฟล์อัพโหลด\",\"url\":\"ที่อยู่อ้างอิง URL\",\"protocol\":\"โปรโตคอล\",\"upload\":\"อัพโหลดไฟล์\",\"uploadSubmit\":\"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)\",\"image\":\"รูปภาพ\",\"flash\":\"ไฟล์ Flash\",\"form\":\"แบบฟอร์ม\",\"checkbox\":\"เช็คบ๊อก\",\"radio\":\"เรดิโอบัตตอน\",\"textField\":\"เท็กซ์ฟิลด์\",\"textarea\":\"เท็กซ์แอเรีย\",\"hiddenField\":\"ฮิดเดนฟิลด์\",\"button\":\"ปุ่ม\",\"select\":\"แถบตัวเลือก\",\"imageButton\":\"ปุ่มแบบรูปภาพ\",\"notSet\":\"<ไม่ระบุ>\",\"id\":\"ไอดี\",\"name\":\"ชื่อ\",\"langDir\":\"การเขียน-อ่านภาษา\",\"langDirLtr\":\"จากซ้ายไปขวา (LTR)\",\"langDirRtl\":\"จากขวามาซ้าย (RTL)\",\"langCode\":\"รหัสภาษา\",\"longDescr\":\"คำอธิบายประกอบ URL\",\"cssClass\":\"คลาสของไฟล์กำหนดลักษณะการแสดงผล\",\"advisoryTitle\":\"คำเกริ่นนำ\",\"cssStyle\":\"ลักษณะการแสดงผล\",\"ok\":\"ตกลง\",\"cancel\":\"ยกเลิก\",\"close\":\"ปิด\",\"preview\":\"ดูหน้าเอกสารตัวอย่าง\",\"resize\":\"ปรับขนาด\",\"generalTab\":\"ทั่วไป\",\"advancedTab\":\"ขั้นสูง\",\"validateNumberFailed\":\"ค่านี้ไม่ใช่ตัวเลข\",\"confirmNewPage\":\"การเปลี่ยนแปลงใดๆ ในเนื้อหานี้ ที่ไม่ได้ถูกบันทึกไว้ จะสูญหายทั้งหมด คุณแน่ใจว่าจะเรียกหน้าใหม่?\",\"confirmCancel\":\"ตัวเลือกบางตัวมีการเปลี่ยนแปลง คุณแน่ใจว่าจะปิดกล่องโต้ตอบนี้?\",\"options\":\"ตัวเลือก\",\"target\":\"การเปิดหน้าลิงค์\",\"targetNew\":\"หน้าต่างใหม่ (_blank)\",\"targetTop\":\"Topmost Window (_top)\",\"targetSelf\":\"หน้าต่างเดียวกัน (_self)\",\"targetParent\":\"Parent Window (_parent)\",\"langDirLTR\":\"จากซ้ายไปขวา (LTR)\",\"langDirRTL\":\"จากขวามาซ้าย (RTL)\",\"styles\":\"ลักษณะการแสดงผล\",\"cssClasses\":\"คลาสของไฟล์กำหนดลักษณะการแสดงผล\",\"width\":\"ความกว้าง\",\"height\":\"ความสูง\",\"align\":\"การจัดวาง\",\"alignLeft\":\"ชิดซ้าย\",\"alignRight\":\"ชิดขวา\",\"alignCenter\":\"กึ่งกลาง\",\"alignJustify\":\"நியாயப்படுத்தவும்\",\"alignTop\":\"บนสุด\",\"alignMiddle\":\"กึ่งกลางแนวตั้ง\",\"alignBottom\":\"ชิดด้านล่าง\",\"alignNone\":\"None\",\"invalidValue\":\"ค่าไม่ถูกต้อง\",\"invalidHeight\":\"ความสูงต้องเป็นตัวเลข\",\"invalidWidth\":\"ความกว้างต้องเป็นตัวเลข\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"About CKEditor\",\"help\":\"Check $1 for help.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"About CKEditor\",\"userGuide\":\"CKEditor User's Guide\"},\"basicstyles\":{\"bold\":\"ตัวหนา\",\"italic\":\"ตัวเอียง\",\"strike\":\"ตัวขีดเส้นทับ\",\"subscript\":\"ตัวห้อย\",\"superscript\":\"ตัวยก\",\"underline\":\"ตัวขีดเส้นใต้\"},\"bidi\":{\"ltr\":\"Text direction from left to right\",\"rtl\":\"Text direction from right to left\"},\"blockquote\":{\"toolbar\":\"Block Quote\"},\"clipboard\":{\"copy\":\"สำเนา\",\"copyError\":\"ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).\",\"cut\":\"ตัด\",\"cutError\":\"ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).\",\"paste\":\"วาง\",\"pasteArea\":\"Paste Area\",\"pasteMsg\":\"กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl/Cmd และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"วาง\"},\"button\":{\"selectedLabel\":\"%1 (Selected)\"},\"colorbutton\":{\"auto\":\"สีอัตโนมัติ\",\"bgColorTitle\":\"สีพื้นหลัง\",\"colors\":{\"000\":\"Black\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Brown\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Gray\",\"F00\":\"Red\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Gold\",\"008000\":\"Green\",\"0FF\":\"Cyan\",\"00F\":\"Blue\",\"EE82EE\":\"Violet\",\"A9A9A9\":\"Dim Gray\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Orange\",\"FFFF00\":\"Yellow\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"White\"},\"more\":\"เลือกสีอื่นๆ...\",\"panelTitle\":\"Colors\",\"textColorTitle\":\"สีตัวอักษร\"},\"colordialog\":{\"clear\":\"Clear\",\"highlight\":\"Highlight\",\"options\":\"Color Options\",\"selected\":\"Selected Color\",\"title\":\"Select color\"},\"templates\":{\"button\":\"เทมเพลต\",\"emptyListMsg\":\"(ยังไม่มีการกำหนดเทมเพลต)\",\"insertOption\":\"แทนที่เนื้อหาเว็บไซต์ที่เลือก\",\"options\":\"ตัวเลือกเกี่ยวกับเทมเพลท\",\"selectPromptMsg\":\"กรุณาเลือก เทมเพลต เพื่อนำไปแก้ไขในอีดิตเตอร์<br />(เนื้อหาส่วนนี้จะหายไป):\",\"title\":\"เทมเพลตของส่วนเนื้อหาเว็บไซต์\"},\"contextmenu\":{\"options\":\"Context Menu Options\"},\"div\":{\"IdInputLabel\":\"ไอดี\",\"advisoryTitleInputLabel\":\"คำเกริ่นนำ\",\"cssClassInputLabel\":\"คลาสของไฟล์กำหนดลักษณะการแสดงผล\",\"edit\":\"แก้ไข Div\",\"inlineStyleInputLabel\":\"Inline Style\",\"langDirLTRLabel\":\"จากซ้ายไปขวา (LTR)\",\"langDirLabel\":\"การเขียน-อ่านภาษา\",\"langDirRTLLabel\":\"จากขวามาซ้าย (RTL)\",\"languageCodeInputLabel\":\"รหัสภาษา\",\"remove\":\"ลบ Div\",\"styleSelectLabel\":\"ลักษณะการแสดงผล\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"ซ่อนแถบเครื่องมือ\",\"toolbarExpand\":\"เปิดแถบเครื่องมือ\",\"toolbarGroups\":{\"document\":\"Document\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Editing\",\"forms\":\"Forms\",\"basicstyles\":\"Basic Styles\",\"paragraph\":\"Paragraph\",\"links\":\"Links\",\"insert\":\"Insert\",\"styles\":\"Styles\",\"colors\":\"Colors\",\"tools\":\"Tools\"},\"toolbars\":\"แถบเครื่องมือช่วยพิมพ์ข้อความ\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 element\"},\"find\":{\"find\":\"ค้นหา\",\"findOptions\":\"Find Options\",\"findWhat\":\"ค้นหาคำว่า:\",\"matchCase\":\"ตัวโหญ่-เล็ก ต้องตรงกัน\",\"matchCyclic\":\"Match cyclic\",\"matchWord\":\"ต้องตรงกันทุกคำ\",\"notFoundMsg\":\"ไม่พบคำที่ค้นหา.\",\"replace\":\"ค้นหาและแทนที่\",\"replaceAll\":\"แทนที่ทั้งหมดที่พบ\",\"replaceSuccessMsg\":\"%1 occurrence(s) replaced.\",\"replaceWith\":\"แทนที่ด้วย:\",\"title\":\"Find and Replace\"},\"fakeobjects\":{\"anchor\":\"แทรก/แก้ไข Anchor\",\"flash\":\"ภาพอนิเมชั่นแฟลช\",\"hiddenfield\":\"ฮิดเดนฟิลด์\",\"iframe\":\"IFrame\",\"unknown\":\"วัตถุไม่ทราบชนิด\"},\"flash\":{\"access\":\"การเข้าถึงสคริปต์\",\"accessAlways\":\"ตลอดไป\",\"accessNever\":\"ไม่เลย\",\"accessSameDomain\":\"โดเมนเดียวกัน\",\"alignAbsBottom\":\"ชิดด้านล่างสุด\",\"alignAbsMiddle\":\"กึ่งกลาง\",\"alignBaseline\":\"ชิดบรรทัด\",\"alignTextTop\":\"ใต้ตัวอักษร\",\"bgcolor\":\"สีพื้นหลัง\",\"chkFull\":\"อนุญาตให้แสดงเต็มหน้าจอได้\",\"chkLoop\":\"เล่นวนรอบ Loop\",\"chkMenu\":\"ให้ใช้งานเมนูของ Flash\",\"chkPlay\":\"เล่นอัตโนมัติ Auto Play\",\"flashvars\":\"ตัวแปรสำหรับ Flas\",\"hSpace\":\"ระยะแนวนอน\",\"properties\":\"คุณสมบัติของไฟล์ Flash\",\"propertiesTab\":\"คุณสมบัติ\",\"quality\":\"คุณภาพ\",\"qualityAutoHigh\":\"ปรับคุณภาพสูงอัตโนมัติ\",\"qualityAutoLow\":\"ปรับคุณภาพต่ำอัตโนมัติ\",\"qualityBest\":\"ดีที่สุด\",\"qualityHigh\":\"สูง\",\"qualityLow\":\"ต่ำ\",\"qualityMedium\":\"ปานกลาง\",\"scale\":\"อัตราส่วน Scale\",\"scaleAll\":\"แสดงให้เห็นทั้งหมด Show all\",\"scaleFit\":\"แสดงให้พอดีกับพื้นที่ Exact Fit\",\"scaleNoBorder\":\"ไม่แสดงเส้นขอบ No Border\",\"title\":\"คุณสมบัติของไฟล์ Flash\",\"vSpace\":\"ระยะแนวตั้ง\",\"validateHSpace\":\"HSpace ต้องเป็นจำนวนตัวเลข\",\"validateSrc\":\"กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)\",\"validateVSpace\":\"VSpace ต้องเป็นจำนวนตัวเลข\",\"windowMode\":\"โหมดหน้าต่าง\",\"windowModeOpaque\":\"ความทึบแสง\",\"windowModeTransparent\":\"ความโปรงแสง\",\"windowModeWindow\":\"หน้าต่าง\"},\"font\":{\"fontSize\":{\"label\":\"ขนาด\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"ขนาด\"},\"label\":\"แบบอักษร\",\"panelTitle\":\"แบบอักษร\",\"voiceLabel\":\"แบบอักษร\"},\"forms\":{\"button\":{\"title\":\"รายละเอียดของ ปุ่ม\",\"text\":\"ข้อความ (ค่าตัวแปร)\",\"type\":\"ข้อความ\",\"typeBtn\":\"Button\",\"typeSbm\":\"Submit\",\"typeRst\":\"Reset\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"คุณสมบัติของ เช็คบ๊อก\",\"radioTitle\":\"คุณสมบัติของ เรดิโอบัตตอน\",\"value\":\"ค่าตัวแปร\",\"selected\":\"เลือกเป็นค่าเริ่มต้น\",\"required\":\"Required\"},\"form\":{\"title\":\"คุณสมบัติของ แบบฟอร์ม\",\"menu\":\"คุณสมบัติของ แบบฟอร์ม\",\"action\":\"แอคชั่น\",\"method\":\"เมธอด\",\"encoding\":\"Encoding\"},\"hidden\":{\"title\":\"คุณสมบัติของ ฮิดเดนฟิลด์\",\"name\":\"ชื่อ\",\"value\":\"ค่าตัวแปร\"},\"select\":{\"title\":\"คุณสมบัติของ แถบตัวเลือก\",\"selectInfo\":\"อินโฟ\",\"opAvail\":\"รายการตัวเลือก\",\"value\":\"ค่าตัวแปร\",\"size\":\"ขนาด\",\"lines\":\"บรรทัด\",\"chkMulti\":\"เลือกหลายค่าได้\",\"required\":\"Required\",\"opText\":\"ข้อความ\",\"opValue\":\"ค่าตัวแปร\",\"btnAdd\":\"เพิ่ม\",\"btnModify\":\"แก้ไข\",\"btnUp\":\"บน\",\"btnDown\":\"ล่าง\",\"btnSetValue\":\"เลือกเป็นค่าเริ่มต้น\",\"btnDelete\":\"ลบ\"},\"textarea\":{\"title\":\"คุณสมบัติของ เท็กแอเรีย\",\"cols\":\"สดมภ์\",\"rows\":\"แถว\"},\"textfield\":{\"title\":\"คุณสมบัติของ เท็กซ์ฟิลด์\",\"name\":\"ชื่อ\",\"value\":\"ค่าตัวแปร\",\"charWidth\":\"ความกว้าง\",\"maxChars\":\"จำนวนตัวอักษรสูงสุด\",\"required\":\"Required\",\"type\":\"ชนิด\",\"typeText\":\"ข้อความ\",\"typePass\":\"รหัสผ่าน\",\"typeEmail\":\"อีเมล\",\"typeSearch\":\"ค้นหาก\",\"typeTel\":\"หมายเลขโทรศัพท์\",\"typeUrl\":\"ที่อยู่อ้างอิง URL\"}},\"format\":{\"label\":\"รูปแบบ\",\"panelTitle\":\"รูปแบบ\",\"tag_address\":\"Address\",\"tag_div\":\"Paragraph (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Formatted\"},\"horizontalrule\":{\"toolbar\":\"แทรกเส้นคั่นบรรทัด\"},\"iframe\":{\"border\":\"Show frame border\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame Properties\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"คำประกอบรูปภาพ\",\"border\":\"ขนาดขอบรูป\",\"btnUpload\":\"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"ระยะแนวนอน\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"ข้อมูลของรูปภาพ\",\"linkTab\":\"ลิ้งค์\",\"lockRatio\":\"กำหนดอัตราส่วน กว้าง-สูง แบบคงที่\",\"menu\":\"คุณสมบัติของ รูปภาพ\",\"resetSize\":\"กำหนดรูปเท่าขนาดจริง\",\"title\":\"คุณสมบัติของ รูปภาพ\",\"titleButton\":\"คุณสมบัติของ ปุ่มแบบรูปภาพ\",\"upload\":\"อัพโหลดไฟล์\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"ระยะแนวตั้ง\",\"validateBorder\":\"Border must be a whole number.\",\"validateHSpace\":\"HSpace must be a whole number.\",\"validateVSpace\":\"VSpace must be a whole number.\"},\"indent\":{\"indent\":\"เพิ่มระยะย่อหน้า\",\"outdent\":\"ลดระยะย่อหน้า\"},\"smiley\":{\"options\":\"ตัวเลือกไอคอนแสดงอารมณ์\",\"title\":\"แทรกสัญลักษณ์สื่ออารมณ์\",\"toolbar\":\"รูปสื่ออารมณ์\"},\"justify\":{\"block\":\"จัดพอดีหน้ากระดาษ\",\"center\":\"จัดกึ่งกลาง\",\"left\":\"จัดชิดซ้าย\",\"right\":\"จัดชิดขวา\"},\"language\":{\"button\":\"Set language\",\"remove\":\"Remove language\"},\"link\":{\"acccessKey\":\"แอคเซส คีย์\",\"advanced\":\"ขั้นสูง\",\"advisoryContentType\":\"ชนิดของคำเกริ่นนำ\",\"advisoryTitle\":\"คำเกริ่นนำ\",\"anchor\":{\"toolbar\":\"แทรก/แก้ไข Anchor\",\"menu\":\"รายละเอียด Anchor\",\"title\":\"รายละเอียด Anchor\",\"name\":\"ชื่อ Anchor\",\"errorName\":\"กรุณาระบุชื่อของ Anchor\",\"remove\":\"Remove Anchor\"},\"anchorId\":\"ไอดี\",\"anchorName\":\"ชื่อ\",\"charset\":\"ลิงค์เชื่อมโยงไปยังชุดตัวอักษร\",\"cssClasses\":\"คลาสของไฟล์กำหนดลักษณะการแสดงผล\",\"emailAddress\":\"อีเมล์ (E-Mail)\",\"emailBody\":\"ข้อความ\",\"emailSubject\":\"หัวเรื่อง\",\"id\":\"ไอดี\",\"info\":\"รายละเอียด\",\"langCode\":\"การเขียน-อ่านภาษา\",\"langDir\":\"การเขียน-อ่านภาษา\",\"langDirLTR\":\"จากซ้ายไปขวา (LTR)\",\"langDirRTL\":\"จากขวามาซ้าย (RTL)\",\"menu\":\"แก้ไข ลิงค์\",\"name\":\"ชื่อ\",\"noAnchors\":\"(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอกสารนี้)\",\"noEmail\":\"กรุณาระบุอีเมล์ (E-mail)\",\"noUrl\":\"กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)\",\"other\":\"<อื่น ๆ>\",\"popupDependent\":\"แสดงเต็มหน้าจอ (Netscape)\",\"popupFeatures\":\"คุณสมบัติของหน้าจอเล็ก (Pop-up)\",\"popupFullScreen\":\"แสดงเต็มหน้าจอ (IE5.5++ เท่านั้น)\",\"popupLeft\":\"พิกัดซ้าย (Left Position)\",\"popupLocationBar\":\"แสดงที่อยู่ของไฟล์\",\"popupMenuBar\":\"แสดงแถบเมนู\",\"popupResizable\":\"สามารถปรับขนาดได้\",\"popupScrollBars\":\"แสดงแถบเลื่อน\",\"popupStatusBar\":\"แสดงแถบสถานะ\",\"popupToolbar\":\"แสดงแถบเครื่องมือ\",\"popupTop\":\"พิกัดบน (Top Position)\",\"rel\":\"ความสัมพันธ์\",\"selectAnchor\":\"ระบุข้อมูลของจุดเชื่อมโยง (Anchor)\",\"styles\":\"ลักษณะการแสดงผล\",\"tabIndex\":\"ลำดับของ แท็บ\",\"target\":\"การเปิดหน้าลิงค์\",\"targetFrame\":\"<เปิดในเฟรม>\",\"targetFrameName\":\"ชื่อทาร์เก็ตเฟรม\",\"targetPopup\":\"<เปิดหน้าจอเล็ก (Pop-up)>\",\"targetPopupName\":\"ระบุชื่อหน้าจอเล็ก (Pop-up)\",\"title\":\"ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ\",\"toAnchor\":\"จุดเชื่อมโยง (Anchor)\",\"toEmail\":\"ส่งอีเมล์ (E-Mail)\",\"toUrl\":\"ที่อยู่อ้างอิง URL\",\"toolbar\":\"แทรก/แก้ไข ลิงค์\",\"type\":\"ประเภทของลิงค์\",\"unlink\":\"ลบ ลิงค์\",\"upload\":\"อัพโหลดไฟล์\"},\"list\":{\"bulletedlist\":\"ลำดับรายการแบบสัญลักษณ์\",\"numberedlist\":\"ลำดับรายการแบบตัวเลข\"},\"liststyle\":{\"armenian\":\"Armenian numbering\",\"bulletedTitle\":\"Bulleted List Properties\",\"circle\":\"Circle\",\"decimal\":\"Decimal (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"Decimal leading zero (01, 02, 03, etc.)\",\"disc\":\"Disc\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"None\",\"notset\":\"<not set>\",\"numberedTitle\":\"Numbered List Properties\",\"square\":\"Square\",\"start\":\"Start\",\"type\":\"Type\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Insert paragraph here\"},\"maximize\":{\"maximize\":\"ขยายใหญ่\",\"minimize\":\"ย่อขนาด\"},\"newpage\":{\"toolbar\":\"สร้างหน้าเอกสารใหม่\"},\"pagebreak\":{\"alt\":\"ตัวแบ่งหน้า\",\"toolbar\":\"แทรกตัวแบ่งหน้า Page Break\"},\"pastetext\":{\"button\":\"วางแบบตัวอักษรธรรมดา\",\"title\":\"วางแบบตัวอักษรธรรมดา\"},\"pastefromword\":{\"confirmCleanup\":\"ข้อความที่คุณต้องการวางลงไปเป็นข้อความที่คัดลอกมาจากโปรแกรมไมโครซอฟท์เวิร์ด คุณต้องการล้างค่าข้อความดังกล่าวก่อนวางลงไปหรือไม่?\",\"error\":\"ไม่สามารถล้างข้อมูลที่ต้องการวางได้เนื่องจากเกิดข้อผิดพลาดภายในระบบ\",\"title\":\"วางสำเนาจากตัวอักษรเวิร์ด\",\"toolbar\":\"วางสำเนาจากตัวอักษรเวิร์ด\"},\"preview\":{\"preview\":\"ดูหน้าเอกสารตัวอย่าง\"},\"print\":{\"toolbar\":\"สั่งพิมพ์\"},\"removeformat\":{\"toolbar\":\"ล้างรูปแบบ\"},\"save\":{\"toolbar\":\"บันทึก\"},\"selectall\":{\"toolbar\":\"เลือกทั้งหมด\"},\"showblocks\":{\"toolbar\":\"แสดงบล็อคข้อมูล\"},\"sourcearea\":{\"toolbar\":\"ดูรหัส HTML\"},\"specialchar\":{\"options\":\"Special Character Options\",\"title\":\"แทรกตัวอักษรพิเศษ\",\"toolbar\":\"แทรกตัวอักษรพิเศษ\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"ลักษณะ\",\"panelTitle\":\"Formatting Styles\",\"panelTitle1\":\"Block Styles\",\"panelTitle2\":\"Inline Styles\",\"panelTitle3\":\"Object Styles\"},\"table\":{\"border\":\"ขนาดเส้นขอบ\",\"caption\":\"หัวเรื่องของตาราง\",\"cell\":{\"menu\":\"ช่องตาราง\",\"insertBefore\":\"Insert Cell Before\",\"insertAfter\":\"Insert Cell After\",\"deleteCell\":\"ลบช่อง\",\"merge\":\"ผสานช่อง\",\"mergeRight\":\"Merge Right\",\"mergeDown\":\"Merge Down\",\"splitHorizontal\":\"Split Cell Horizontally\",\"splitVertical\":\"Split Cell Vertically\",\"title\":\"Cell Properties\",\"cellType\":\"Cell Type\",\"rowSpan\":\"Rows Span\",\"colSpan\":\"Columns Span\",\"wordWrap\":\"Word Wrap\",\"hAlign\":\"Horizontal Alignment\",\"vAlign\":\"Vertical Alignment\",\"alignBaseline\":\"Baseline\",\"bgColor\":\"Background Color\",\"borderColor\":\"Border Color\",\"data\":\"Data\",\"header\":\"Header\",\"yes\":\"Yes\",\"no\":\"No\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Choose\"},\"cellPad\":\"ระยะแนวตั้ง\",\"cellSpace\":\"ระยะแนวนอนน\",\"column\":{\"menu\":\"คอลัมน์\",\"insertBefore\":\"Insert Column Before\",\"insertAfter\":\"Insert Column After\",\"deleteColumn\":\"ลบสดมน์\"},\"columns\":\"สดมน์\",\"deleteTable\":\"ลบตาราง\",\"headers\":\"ส่วนหัว\",\"headersBoth\":\"ทั้งสองอย่าง\",\"headersColumn\":\"คอลัมน์แรก\",\"headersNone\":\"None\",\"headersRow\":\"แถวแรก\",\"invalidBorder\":\"ขนาดเส้นกรอบต้องเป็นจำนวนตัวเลข\",\"invalidCellPadding\":\"ช่องว่างภายในเซลล์ต้องเลขจำนวนบวก\",\"invalidCellSpacing\":\"ช่องว่างภายในเซลล์ต้องเป็นเลขจำนวนบวก\",\"invalidCols\":\"จำนวนคอลัมน์ต้องเป็นจำนวนมากกว่า 0\",\"invalidHeight\":\"ส่วนสูงของตารางต้องเป็นตัวเลข\",\"invalidRows\":\"จำนวนของแถวต้องเป็นจำนวนมากกว่า 0\",\"invalidWidth\":\"ความกว้างตารางต้องเป็นตัวเลข\",\"menu\":\"คุณสมบัติของ ตาราง\",\"row\":{\"menu\":\"แถว\",\"insertBefore\":\"Insert Row Before\",\"insertAfter\":\"Insert Row After\",\"deleteRow\":\"ลบแถว\"},\"rows\":\"แถว\",\"summary\":\"สรุปความ\",\"title\":\"คุณสมบัติของ ตาราง\",\"toolbar\":\"ตาราง\",\"widthPc\":\"เปอร์เซ็น\",\"widthPx\":\"จุดสี\",\"widthUnit\":\"หน่วยความกว้าง\"},\"undo\":{\"redo\":\"ทำซ้ำคำสั่ง\",\"undo\":\"ยกเลิกคำสั่ง\"},\"wsc\":{\"btnIgnore\":\"ยกเว้น\",\"btnIgnoreAll\":\"ยกเว้นทั้งหมด\",\"btnReplace\":\"แทนที่\",\"btnReplaceAll\":\"แทนที่ทั้งหมด\",\"btnUndo\":\"ยกเลิก\",\"changeTo\":\"แก้ไขเป็น\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"ไม่ได้ติดตั้งระบบตรวจสอบคำสะกด. ต้องการติดตั้งไหมครับ?\",\"manyChanges\":\"ตรวจสอบคำสะกดเสร็จสิ้น:: แก้ไข %1 คำ\",\"noChanges\":\"ตรวจสอบคำสะกดเสร็จสิ้น: ไม่มีการแก้คำใดๆ\",\"noMispell\":\"ตรวจสอบคำสะกดเสร็จสิ้น: ไม่พบคำสะกดผิด\",\"noSuggestions\":\"- ไม่มีคำแนะนำใดๆ -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"ไม่พบในดิกชันนารี\",\"oneChange\":\"ตรวจสอบคำสะกดเสร็จสิ้น: แก้ไข1คำ\",\"progress\":\"กำลังตรวจสอบคำสะกด...\",\"title\":\"Spell Checker\",\"toolbar\":\"ตรวจการสะกดคำ\"}};"
  },
  {
    "path": "assets/ckeditor/lang/tr.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['tr']={\"editor\":\"Zengin Metin Editörü\",\"editorPanel\":\"Zengin Metin Editör Paneli\",\"common\":{\"editorHelp\":\"Yardım için ALT 0 tuşlarına basın\",\"browseServer\":\"Sunucuya Gözat\",\"url\":\"URL\",\"protocol\":\"Protokol\",\"upload\":\"Karşıya Yükle\",\"uploadSubmit\":\"Sunucuya Gönder\",\"image\":\"Resim\",\"flash\":\"Flash\",\"form\":\"Form\",\"checkbox\":\"Onay Kutusu\",\"radio\":\"Seçenek Düğmesi\",\"textField\":\"Metin Kutusu\",\"textarea\":\"Metin Alanı\",\"hiddenField\":\"Gizli Alan\",\"button\":\"Düğme\",\"select\":\"Seçme Alanı\",\"imageButton\":\"Resim Düğmesi\",\"notSet\":\"<tanımlanmamış>\",\"id\":\"Kimlik\",\"name\":\"İsim\",\"langDir\":\"Dil Yönü\",\"langDirLtr\":\"Soldan Sağa (LTR)\",\"langDirRtl\":\"Sağdan Sola (RTL)\",\"langCode\":\"Dil Kodlaması\",\"longDescr\":\"Uzun Tanımlı URL\",\"cssClass\":\"Biçem Sayfası Sınıfları\",\"advisoryTitle\":\"Öneri Başlığı\",\"cssStyle\":\"Biçem\",\"ok\":\"Tamam\",\"cancel\":\"İptal\",\"close\":\"Kapat\",\"preview\":\"Önizleme\",\"resize\":\"Yeniden Boyutlandır\",\"generalTab\":\"Genel\",\"advancedTab\":\"Gelişmiş\",\"validateNumberFailed\":\"Bu değer bir sayı değildir.\",\"confirmNewPage\":\"Bu içerikle ilgili kaydedilmemiş tüm bilgiler kaybolacaktır. Yeni bir sayfa yüklemek istediğinizden emin misiniz?\",\"confirmCancel\":\"Bazı seçenekleri değiştirdiniz. İletişim penceresini kapatmak istediğinizden emin misiniz?\",\"options\":\"Seçenekler\",\"target\":\"Hedef\",\"targetNew\":\"Yeni Pencere (_blank)\",\"targetTop\":\"En Üstteki Pencere (_top)\",\"targetSelf\":\"Aynı Pencere (_self)\",\"targetParent\":\"Üst Pencere (_parent)\",\"langDirLTR\":\"Soldan Sağa (LTR)\",\"langDirRTL\":\"Sağdan Sola (RTL)\",\"styles\":\"Biçem\",\"cssClasses\":\"Biçem Sayfası Sınıfları\",\"width\":\"Genişlik\",\"height\":\"Yükseklik\",\"align\":\"Hizalama\",\"alignLeft\":\"Sol\",\"alignRight\":\"Sağ\",\"alignCenter\":\"Ortala\",\"alignJustify\":\"İki Kenara Yaslanmış\",\"alignTop\":\"Üst\",\"alignMiddle\":\"Orta\",\"alignBottom\":\"Alt\",\"alignNone\":\"Hiçbiri\",\"invalidValue\":\"Geçersiz değer.\",\"invalidHeight\":\"Yükseklik değeri bir sayı olmalıdır.\",\"invalidWidth\":\"Genişlik değeri bir sayı olmalıdır.\",\"invalidCssLength\":\"\\\"%1\\\" alanı için verilen değer, geçerli bir CSS ölçü birimi (px, %, in, cm, mm, em, ex, pt, veya pc) içeren veya içermeyen pozitif bir sayı olmalıdır.\",\"invalidHtmlLength\":\"Belirttiğiniz sayı \\\"%1\\\" alanı için pozitif bir sayı HTML birim değeri olmalıdır (px veya %).\",\"invalidInlineStyle\":\"Satıriçi biçem için verilen değer, \\\"isim : değer\\\" biçiminde birbirinden noktalı virgüllerle ayrılan bir veya daha fazla değişkenler grubundan oluşmalıdır.\",\"cssLengthTooltip\":\"Piksel türünde bir sayı veya geçerli bir CSS ölçü birimi (px, %, in, cm, mm, em, ex, pt veya pc) içeren bir sayı girin.\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, kullanılamaz</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Tüm hakları saklıdır.\",\"dlgTitle\":\"CKEditor Hakkında\",\"help\":\"Yardım için $1 kontrol edin.\",\"moreInfo\":\"Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:\",\"title\":\"CKEditor Hakkında\",\"userGuide\":\"CKEditor Kullanıcı Kılavuzu\"},\"basicstyles\":{\"bold\":\"Kalın\",\"italic\":\"İtalik\",\"strike\":\"Üstü Çizgili\",\"subscript\":\"Alt Simge\",\"superscript\":\"Üst Simge\",\"underline\":\"Altı Çizgili\"},\"bidi\":{\"ltr\":\"Metin yönü soldan sağa\",\"rtl\":\"Metin yönü sağdan sola\"},\"blockquote\":{\"toolbar\":\"Blok Oluştur\"},\"clipboard\":{\"copy\":\"Kopyala\",\"copyError\":\"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.\",\"cut\":\"Kes\",\"cutError\":\"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.\",\"paste\":\"Yapıştır\",\"pasteArea\":\"Yapıştırma Alanı\",\"pasteMsg\":\"Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.\",\"securityMsg\":\"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..\",\"title\":\"Yapıştır\"},\"button\":{\"selectedLabel\":\"%1 (Seçilmiş)\"},\"colorbutton\":{\"auto\":\"Otomatik\",\"bgColorTitle\":\"Arka Renk\",\"colors\":{\"000\":\"Siyah\",\"800000\":\"Kestane\",\"8B4513\":\"Koyu Kahverengi\",\"2F4F4F\":\"Koyu Kurşuni Gri\",\"008080\":\"Teal\",\"000080\":\"Mavi\",\"4B0082\":\"Çivit Mavisi\",\"696969\":\"Silik Gri\",\"B22222\":\"Ateş Tuğlası\",\"A52A2A\":\"Kahverengi\",\"DAA520\":\"Altun Sırık\",\"006400\":\"Koyu Yeşil\",\"40E0D0\":\"Turkuaz\",\"0000CD\":\"Orta Mavi\",\"800080\":\"Pembe\",\"808080\":\"Gri\",\"F00\":\"Kırmızı\",\"FF8C00\":\"Koyu Portakal\",\"FFD700\":\"Altın\",\"008000\":\"Yeşil\",\"0FF\":\"Ciyan\",\"00F\":\"Mavi\",\"EE82EE\":\"Menekşe\",\"A9A9A9\":\"Koyu Gri\",\"FFA07A\":\"Açık Sarımsı\",\"FFA500\":\"Portakal\",\"FFFF00\":\"Sarı\",\"00FF00\":\"Açık Yeşil\",\"AFEEEE\":\"Sönük Turkuaz\",\"ADD8E6\":\"Açık Mavi\",\"DDA0DD\":\"Mor\",\"D3D3D3\":\"Açık Gri\",\"FFF0F5\":\"Eflatun Pembe\",\"FAEBD7\":\"Antik Beyaz\",\"FFFFE0\":\"Açık Sarı\",\"F0FFF0\":\"Balsarısı\",\"F0FFFF\":\"Gök Mavisi\",\"F0F8FF\":\"Reha Mavi\",\"E6E6FA\":\"Eflatun\",\"FFF\":\"Beyaz\"},\"more\":\"Diğer renkler...\",\"panelTitle\":\"Renkler\",\"textColorTitle\":\"Yazı Rengi\"},\"colordialog\":{\"clear\":\"Temizle\",\"highlight\":\"İşaretle\",\"options\":\"Renk Seçenekleri\",\"selected\":\"Seçilmiş\",\"title\":\"Renk seç\"},\"templates\":{\"button\":\"Şablonlar\",\"emptyListMsg\":\"(Belirli bir şablon seçilmedi)\",\"insertOption\":\"Mevcut içerik ile değiştir\",\"options\":\"Şablon Seçenekleri\",\"selectPromptMsg\":\"Düzenleyicide açmak için lütfen bir şablon seçin.<br>(hali hazırdaki içerik kaybolacaktır.):\",\"title\":\"İçerik Şablonları\"},\"contextmenu\":{\"options\":\"İçerik Menüsü Seçenekleri\"},\"div\":{\"IdInputLabel\":\"Id\",\"advisoryTitleInputLabel\":\"Tavsiye Başlığı\",\"cssClassInputLabel\":\"Stilltipi Sınıfı\",\"edit\":\"Div Düzenle\",\"inlineStyleInputLabel\":\"Inline Stili\",\"langDirLTRLabel\":\"Soldan sağa (LTR)\",\"langDirLabel\":\"Dil Yönü\",\"langDirRTLLabel\":\"Sağdan sola (RTL)\",\"languageCodeInputLabel\":\" Dil Kodu\",\"remove\":\"Div Kaldır\",\"styleSelectLabel\":\"Stil\",\"title\":\"Div İçeriği Oluştur\",\"toolbar\":\"Div İçeriği Oluştur\"},\"toolbar\":{\"toolbarCollapse\":\"Araç çubuklarını topla\",\"toolbarExpand\":\"Araç çubuklarını aç\",\"toolbarGroups\":{\"document\":\"Belge\",\"clipboard\":\"Pano/Geri al\",\"editing\":\"Düzenleme\",\"forms\":\"Formlar\",\"basicstyles\":\"Temel Stiller\",\"paragraph\":\"Paragraf\",\"links\":\"Bağlantılar\",\"insert\":\"Ekle\",\"styles\":\"Stiller\",\"colors\":\"Renkler\",\"tools\":\"Araçlar\"},\"toolbars\":\"Araç çubukları Editörü\"},\"elementspath\":{\"eleLabel\":\"Elementlerin yolu\",\"eleTitle\":\"%1 elementi\"},\"find\":{\"find\":\"Bul\",\"findOptions\":\"Seçenekleri Bul\",\"findWhat\":\"Aranan:\",\"matchCase\":\"Büyük/küçük harf duyarlı\",\"matchCyclic\":\"Eşleşen döngü\",\"matchWord\":\"Kelimenin tamamı uysun\",\"notFoundMsg\":\"Belirtilen yazı bulunamadı.\",\"replace\":\"Değiştir\",\"replaceAll\":\"Tümünü Değiştir\",\"replaceSuccessMsg\":\"%1 bulunanlardan değiştirildi.\",\"replaceWith\":\"Bununla değiştir:\",\"title\":\"Bul ve Değiştir\"},\"fakeobjects\":{\"anchor\":\"Bağlantı\",\"flash\":\"Flash Animasyonu\",\"hiddenfield\":\"Gizli Alan\",\"iframe\":\"IFrame\",\"unknown\":\"Bilinmeyen Nesne\"},\"flash\":{\"access\":\"Kod İzni\",\"accessAlways\":\"Herzaman\",\"accessNever\":\"Asla\",\"accessSameDomain\":\"Aynı domain\",\"alignAbsBottom\":\"Tam Altı\",\"alignAbsMiddle\":\"Tam Ortası\",\"alignBaseline\":\"Taban Çizgisi\",\"alignTextTop\":\"Yazı Tepeye\",\"bgcolor\":\"Arka Renk\",\"chkFull\":\"Tam ekrana İzinver\",\"chkLoop\":\"Döngü\",\"chkMenu\":\"Flash Menüsünü Kullan\",\"chkPlay\":\"Otomatik Oynat\",\"flashvars\":\"Flash Değerleri\",\"hSpace\":\"Yatay Boşluk\",\"properties\":\"Flash Özellikleri\",\"propertiesTab\":\"Özellikler\",\"quality\":\"Kalite\",\"qualityAutoHigh\":\"Otomatik Yükseklik\",\"qualityAutoLow\":\"Otomatik Düşüklük\",\"qualityBest\":\"En iyi\",\"qualityHigh\":\"Yüksek\",\"qualityLow\":\"Düşük\",\"qualityMedium\":\"Orta\",\"scale\":\"Boyutlandır\",\"scaleAll\":\"Hepsini Göster\",\"scaleFit\":\"Tam Sığdır\",\"scaleNoBorder\":\"Kenar Yok\",\"title\":\"Flash Özellikleri\",\"vSpace\":\"Dikey Boşluk\",\"validateHSpace\":\"HSpace sayı olmalıdır.\",\"validateSrc\":\"Lütfen köprü URL'sini yazın\",\"validateVSpace\":\"VSpace sayı olmalıdır.\",\"windowMode\":\"Pencere modu\",\"windowModeOpaque\":\"Opak\",\"windowModeTransparent\":\"Şeffaf\",\"windowModeWindow\":\"Pencere\"},\"font\":{\"fontSize\":{\"label\":\"Boyut\",\"voiceLabel\":\"Font Size\",\"panelTitle\":\"Boyut\"},\"label\":\"Yazı Türü\",\"panelTitle\":\"Yazı Türü\",\"voiceLabel\":\"Font\"},\"forms\":{\"button\":{\"title\":\"Düğme Özellikleri\",\"text\":\"Metin (Değer)\",\"type\":\"Tip\",\"typeBtn\":\"Düğme\",\"typeSbm\":\"Gönder\",\"typeRst\":\"Sıfırla\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Onay Kutusu Özellikleri\",\"radioTitle\":\"Seçenek Düğmesi Özellikleri\",\"value\":\"Değer\",\"selected\":\"Seçili\",\"required\":\"Zorunlu\"},\"form\":{\"title\":\"Form Özellikleri\",\"menu\":\"Form Özellikleri\",\"action\":\"İşlem\",\"method\":\"Yöntem\",\"encoding\":\"Kodlama\"},\"hidden\":{\"title\":\"Gizli Veri Özellikleri\",\"name\":\"Ad\",\"value\":\"Değer\"},\"select\":{\"title\":\"Seçim Menüsü Özellikleri\",\"selectInfo\":\"Bilgi\",\"opAvail\":\"Mevcut Seçenekler\",\"value\":\"Değer\",\"size\":\"Boyut\",\"lines\":\"satır\",\"chkMulti\":\"Çoklu seçime izin ver\",\"required\":\"Zorunlu\",\"opText\":\"Metin\",\"opValue\":\"Değer\",\"btnAdd\":\"Ekle\",\"btnModify\":\"Düzenle\",\"btnUp\":\"Yukarı\",\"btnDown\":\"Aşağı\",\"btnSetValue\":\"Seçili değer olarak ata\",\"btnDelete\":\"Sil\"},\"textarea\":{\"title\":\"Çok Satırlı Metin Özellikleri\",\"cols\":\"Sütunlar\",\"rows\":\"Satırlar\"},\"textfield\":{\"title\":\"Metin Girişi Özellikleri\",\"name\":\"Ad\",\"value\":\"Değer\",\"charWidth\":\"Karakter Genişliği\",\"maxChars\":\"En Fazla Karakter\",\"required\":\"Zorunlu\",\"type\":\"Tür\",\"typeText\":\"Metin\",\"typePass\":\"Şifre\",\"typeEmail\":\"E-posta\",\"typeSearch\":\"Ara\",\"typeTel\":\"Telefon Numarası\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Biçim\",\"panelTitle\":\"Biçim\",\"tag_address\":\"Adres\",\"tag_div\":\"Paragraf (DIV)\",\"tag_h1\":\"Başlık 1\",\"tag_h2\":\"Başlık 2\",\"tag_h3\":\"Başlık 3\",\"tag_h4\":\"Başlık 4\",\"tag_h5\":\"Başlık 5\",\"tag_h6\":\"Başlık 6\",\"tag_p\":\"Normal\",\"tag_pre\":\"Biçimli\"},\"horizontalrule\":{\"toolbar\":\"Yatay Satır Ekle\"},\"iframe\":{\"border\":\"Çerceve sınırlarını göster\",\"noUrl\":\"Lütfen IFrame köprü (URL) bağlantısını yazın\",\"scrolling\":\"Kaydırma çubuklarını aktif et\",\"title\":\"IFrame Özellikleri\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Alternatif Yazı\",\"border\":\"Kenar\",\"btnUpload\":\"Sunucuya Yolla\",\"button2Img\":\"Seçili resim butonunu basit resime çevirmek istermisiniz?\",\"hSpace\":\"Yatay Boşluk\",\"img2Button\":\"Seçili olan resimi, resimli butona çevirmek istermisiniz?\",\"infoTab\":\"Resim Bilgisi\",\"linkTab\":\"Köprü\",\"lockRatio\":\"Oranı Kilitle\",\"menu\":\"Resim Özellikleri\",\"resetSize\":\"Boyutu Başa Döndür\",\"title\":\"Resim Özellikleri\",\"titleButton\":\"Resimli Düğme Özellikleri\",\"upload\":\"Karşıya Yükle\",\"urlMissing\":\"Resmin URL kaynağı eksiktir.\",\"vSpace\":\"Dikey Boşluk\",\"validateBorder\":\"Çerçeve tam sayı olmalıdır.\",\"validateHSpace\":\"HSpace tam sayı olmalıdır.\",\"validateVSpace\":\"VSpace tam sayı olmalıdır.\"},\"indent\":{\"indent\":\"Sekme Arttır\",\"outdent\":\"Sekme Azalt\"},\"smiley\":{\"options\":\"İfade Seçenekleri\",\"title\":\"İfade Ekle\",\"toolbar\":\"İfade\"},\"justify\":{\"block\":\"İki Kenara Yaslanmış\",\"center\":\"Ortalanmış\",\"left\":\"Sola Dayalı\",\"right\":\"Sağa Dayalı\"},\"language\":{\"button\":\"Dili seç\",\"remove\":\"Dili kaldır\"},\"link\":{\"acccessKey\":\"Erişim Tuşu\",\"advanced\":\"Gelişmiş\",\"advisoryContentType\":\"Danışma İçerik Türü\",\"advisoryTitle\":\"Danışma Başlığı\",\"anchor\":{\"toolbar\":\"Bağlantı Ekle/Düzenle\",\"menu\":\"Bağlantı Özellikleri\",\"title\":\"Bağlantı Özellikleri\",\"name\":\"Bağlantı Adı\",\"errorName\":\"Lütfen bağlantı için ad giriniz\",\"remove\":\"Bağlantıyı Kaldır\"},\"anchorId\":\"Eleman Kimlik Numarası ile\",\"anchorName\":\"Bağlantı Adı ile\",\"charset\":\"Bağlı Kaynak Karakter Gurubu\",\"cssClasses\":\"Biçem Sayfası Sınıfları\",\"emailAddress\":\"E-Posta Adresi\",\"emailBody\":\"İleti Gövdesi\",\"emailSubject\":\"İleti Konusu\",\"id\":\"Id\",\"info\":\"Link Bilgisi\",\"langCode\":\"Dil Yönü\",\"langDir\":\"Dil Yönü\",\"langDirLTR\":\"Soldan Sağa (LTR)\",\"langDirRTL\":\"Sağdan Sola (RTL)\",\"menu\":\"Link Düzenle\",\"name\":\"Ad\",\"noAnchors\":\"(Bu belgede hiç çapa yok)\",\"noEmail\":\"Lütfen E-posta adresini yazın\",\"noUrl\":\"Lütfen Link URL'sini yazın\",\"other\":\"<diğer>\",\"popupDependent\":\"Bağımlı (Netscape)\",\"popupFeatures\":\"Yeni Açılan Pencere Özellikleri\",\"popupFullScreen\":\"Tam Ekran (IE)\",\"popupLeft\":\"Sola Göre Konum\",\"popupLocationBar\":\"Yer Çubuğu\",\"popupMenuBar\":\"Menü Çubuğu\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Kaydırma Çubukları\",\"popupStatusBar\":\"Durum Çubuğu\",\"popupToolbar\":\"Araç Çubuğu\",\"popupTop\":\"Yukarıya Göre Konum\",\"rel\":\"İlişki\",\"selectAnchor\":\"Bağlantı Seç\",\"styles\":\"Biçem\",\"tabIndex\":\"Sekme İndeksi\",\"target\":\"Hedef\",\"targetFrame\":\"<çerçeve>\",\"targetFrameName\":\"Hedef Çerçeve Adı\",\"targetPopup\":\"<yeni açılan pencere>\",\"targetPopupName\":\"Yeni Açılan Pencere Adı\",\"title\":\"Link\",\"toAnchor\":\"Bu sayfada çapa\",\"toEmail\":\"E-Posta\",\"toUrl\":\"URL\",\"toolbar\":\"Link Ekle/Düzenle\",\"type\":\"Link Türü\",\"unlink\":\"Köprü Kaldır\",\"upload\":\"Karşıya Yükle\"},\"list\":{\"bulletedlist\":\"Simgeli Liste\",\"numberedlist\":\"Numaralı Liste\"},\"liststyle\":{\"armenian\":\"Ermenice sayılandırma\",\"bulletedTitle\":\"Simgeli Liste Özellikleri\",\"circle\":\"Daire\",\"decimal\":\"Ondalık (1, 2, 3, vs.)\",\"decimalLeadingZero\":\"Başı sıfırlı ondalık (01, 02, 03, vs.)\",\"disc\":\"Disk\",\"georgian\":\"Gürcüce numaralandırma (an, ban, gan, vs.)\",\"lowerAlpha\":\"Küçük Alpha (a, b, c, d, e, vs.)\",\"lowerGreek\":\"Küçük Greek (alpha, beta, gamma, vs.)\",\"lowerRoman\":\"Küçük Roman (i, ii, iii, iv, v, vs.)\",\"none\":\"Yok\",\"notset\":\"<ayarlanmamış>\",\"numberedTitle\":\"Sayılandırılmış Liste Özellikleri\",\"square\":\"Kare\",\"start\":\"Başla\",\"type\":\"Tipi\",\"upperAlpha\":\"Büyük Alpha (A, B, C, D, E, vs.)\",\"upperRoman\":\"Büyük Roman (I, II, III, IV, V, vs.)\",\"validateStartNumber\":\"Liste başlangıcı tam sayı olmalıdır.\"},\"magicline\":{\"title\":\"Parağrafı buraya ekle\"},\"maximize\":{\"maximize\":\"Büyült\",\"minimize\":\"Küçült\"},\"newpage\":{\"toolbar\":\"Yeni Sayfa\"},\"pagebreak\":{\"alt\":\"Sayfa Sonu\",\"toolbar\":\"Sayfa Sonu Ekle\"},\"pastetext\":{\"button\":\"Düz Metin Olarak Yapıştır\",\"title\":\"Düz Metin Olarak Yapıştır\"},\"pastefromword\":{\"confirmCleanup\":\"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?\",\"error\":\"Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir\",\"title\":\"Word'den Yapıştır\",\"toolbar\":\"Word'den Yapıştır\"},\"preview\":{\"preview\":\"Ön İzleme\"},\"print\":{\"toolbar\":\"Yazdır\"},\"removeformat\":{\"toolbar\":\"Biçimi Kaldır\"},\"save\":{\"toolbar\":\"Kaydet\"},\"selectall\":{\"toolbar\":\"Tümünü Seç\"},\"showblocks\":{\"toolbar\":\"Blokları Göster\"},\"sourcearea\":{\"toolbar\":\"Kaynak\"},\"specialchar\":{\"options\":\"Özel Karakter Seçenekleri\",\"title\":\"Özel Karakter Seç\",\"toolbar\":\"Özel Karakter Ekle\"},\"scayt\":{\"btn_about\":\"SCAYT'ı hakkında\",\"btn_dictionaries\":\"Sözlükler\",\"btn_disable\":\"SCAYT'ı pasifleştir\",\"btn_enable\":\"SCAYT'ı etkinleştir\",\"btn_langs\":\"Diller\",\"btn_options\":\"Seçenekler\",\"text_title\":\"Girmiş olduğunuz kelime denetimi\"},\"stylescombo\":{\"label\":\"Biçem\",\"panelTitle\":\"Stilleri Düzenliyor\",\"panelTitle1\":\"Blok Stilleri\",\"panelTitle2\":\"Inline Stilleri\",\"panelTitle3\":\"Nesne Stilleri\"},\"table\":{\"border\":\"Kenar Kalınlığı\",\"caption\":\"Başlık\",\"cell\":{\"menu\":\"Hücre\",\"insertBefore\":\"Hücre Ekle - Önce\",\"insertAfter\":\"Hücre Ekle - Sonra\",\"deleteCell\":\"Hücre Sil\",\"merge\":\"Hücreleri Birleştir\",\"mergeRight\":\"Birleştir - Sağdaki İle \",\"mergeDown\":\"Birleştir - Aşağıdaki İle \",\"splitHorizontal\":\"Hücreyi Yatay Böl\",\"splitVertical\":\"Hücreyi Dikey Böl\",\"title\":\"Hücre Özellikleri\",\"cellType\":\"Hücre Tipi\",\"rowSpan\":\"Satırlar Mesafesi (Span)\",\"colSpan\":\"Sütünlar Mesafesi (Span)\",\"wordWrap\":\"Kelime Kaydırma\",\"hAlign\":\"Düşey Hizalama\",\"vAlign\":\"Yataş Hizalama\",\"alignBaseline\":\"Tabana\",\"bgColor\":\"Arkaplan Rengi\",\"borderColor\":\"Çerçeve Rengi\",\"data\":\"Veri\",\"header\":\"Başlık\",\"yes\":\"Evet\",\"no\":\"Hayır\",\"invalidWidth\":\"Hücre genişliği sayı olmalıdır.\",\"invalidHeight\":\"Hücre yüksekliği sayı olmalıdır.\",\"invalidRowSpan\":\"Satırların mesafesi tam sayı olmalıdır.\",\"invalidColSpan\":\"Sütünların mesafesi tam sayı olmalıdır.\",\"chooseColor\":\"Seçiniz\"},\"cellPad\":\"Izgara yazı arası\",\"cellSpace\":\"Izgara kalınlığı\",\"column\":{\"menu\":\"Sütun\",\"insertBefore\":\"Kolon Ekle - Önce\",\"insertAfter\":\"Kolon Ekle - Sonra\",\"deleteColumn\":\"Sütun Sil\"},\"columns\":\"Sütunlar\",\"deleteTable\":\"Tabloyu Sil\",\"headers\":\"Başlıklar\",\"headersBoth\":\"Her İkisi\",\"headersColumn\":\"İlk Sütun\",\"headersNone\":\"Yok\",\"headersRow\":\"İlk Satır\",\"invalidBorder\":\"Çerceve büyüklüklüğü sayı olmalıdır.\",\"invalidCellPadding\":\"Hücre aralığı (padding) sayı olmalıdır.\",\"invalidCellSpacing\":\"Hücre boşluğu (spacing) sayı olmalıdır.\",\"invalidCols\":\"Sütün sayısı 0 sayısından büyük olmalıdır.\",\"invalidHeight\":\"Tablo yüksekliği sayı olmalıdır.\",\"invalidRows\":\"Satır sayısı 0 sayısından büyük olmalıdır.\",\"invalidWidth\":\"Tablo genişliği sayı olmalıdır.\",\"menu\":\"Tablo Özellikleri\",\"row\":{\"menu\":\"Satır\",\"insertBefore\":\"Satır Ekle - Önce\",\"insertAfter\":\"Satır Ekle - Sonra\",\"deleteRow\":\"Satır Sil\"},\"rows\":\"Satırlar\",\"summary\":\"Özet\",\"title\":\"Tablo Özellikleri\",\"toolbar\":\"Tablo\",\"widthPc\":\"yüzde\",\"widthPx\":\"piksel\",\"widthUnit\":\"genişlik birimi\"},\"undo\":{\"redo\":\"Tekrarla\",\"undo\":\"Geri Al\"},\"wsc\":{\"btnIgnore\":\"Yoksay\",\"btnIgnoreAll\":\"Tümünü Yoksay\",\"btnReplace\":\"Değiştir\",\"btnReplaceAll\":\"Tümünü Değiştir\",\"btnUndo\":\"Geri Al\",\"changeTo\":\"Şuna değiştir:\",\"errorLoading\":\"Uygulamada yüklerken hata oluştu: %s.\",\"ieSpellDownload\":\"Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?\",\"manyChanges\":\"Yazım denetimi tamamlandı: %1 kelime değiştirildi\",\"noChanges\":\"Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi\",\"noMispell\":\"Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı\",\"noSuggestions\":\"- Öneri Yok -\",\"notAvailable\":\"Üzügünüz, bu servis şuanda hizmet dışıdır.\",\"notInDic\":\"Sözlükte Yok\",\"oneChange\":\"Yazım denetimi tamamlandı: Bir kelime değiştirildi\",\"progress\":\"Yazım denetimi işlemde...\",\"title\":\"Yazımı Denetle\",\"toolbar\":\"Yazım Denetimi\"}};"
  },
  {
    "path": "assets/ckeditor/lang/tt.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['tt']={\"editor\":\"Форматлаулы текст өлкәсе\",\"editorPanel\":\"Rich Text Editor panel\",\"common\":{\"editorHelp\":\"Ярдәм өчен ALT 0 басыгыз\",\"browseServer\":\"Сервер карап чыгу\",\"url\":\"Сылталама\",\"protocol\":\"Протокол\",\"upload\":\"Йөкләү\",\"uploadSubmit\":\"Серверга җибәрү\",\"image\":\"Рәсем\",\"flash\":\"Флеш\",\"form\":\"Форма\",\"checkbox\":\"Чекбокс\",\"radio\":\"Радио төймә\",\"textField\":\"Текст кыры\",\"textarea\":\"Текст мәйданы\",\"hiddenField\":\"Яшерен кыр\",\"button\":\"Төймə\",\"select\":\"Сайлау кыры\",\"imageButton\":\"Рәсемле төймə\",\"notSet\":\"<билгеләнмәгән>\",\"id\":\"Id\",\"name\":\"Исем\",\"langDir\":\"Язылыш юнəлеше\",\"langDirLtr\":\"Сулдан уңга язылыш (LTR)\",\"langDirRtl\":\"Уңнан сулга язылыш (RTL)\",\"langCode\":\"Тел коды\",\"longDescr\":\"Җентекле тасвирламага сылталама\",\"cssClass\":\"Стильләр класслары\",\"advisoryTitle\":\"Киңәш исем\",\"cssStyle\":\"Стиль\",\"ok\":\"Тәмам\",\"cancel\":\"Баш тарту\",\"close\":\"Чыгу\",\"preview\":\"Карап алу\",\"resize\":\"Зурлыкны үзгәртү\",\"generalTab\":\"Төп\",\"advancedTab\":\"Киңәйтелгән көйләүләр\",\"validateNumberFailed\":\"Әлеге кыйммәт сан түгел.\",\"confirmNewPage\":\"Any unsaved changes to this content will be lost. Are you sure you want to load new page?\",\"confirmCancel\":\"You have changed some options. Are you sure you want to close the dialog window?\",\"options\":\"Үзлекләр\",\"target\":\"Максат\",\"targetNew\":\"Яңа тәрәзә (_blank)\",\"targetTop\":\"Өске тәрәзә (_top)\",\"targetSelf\":\"Шул үк тәрәзә (_self)\",\"targetParent\":\"Ана тәрәзә (_parent)\",\"langDirLTR\":\"Сулдан уңга язылыш (LTR)\",\"langDirRTL\":\"Уңнан сулга язылыш (RTL)\",\"styles\":\"Стиль\",\"cssClasses\":\"Стильләр класслары\",\"width\":\"Киңлек\",\"height\":\"Биеклек\",\"align\":\"Тигезләү\",\"alignLeft\":\"Сул якка\",\"alignRight\":\"Уң якка\",\"alignCenter\":\"Үзәккә\",\"alignJustify\":\"Киңлеккә карап тигезләү\",\"alignTop\":\"Өскә\",\"alignMiddle\":\"Уртага\",\"alignBottom\":\"Аска\",\"alignNone\":\"Һичбер\",\"invalidValue\":\"Дөрес булмаган кыйммәт.\",\"invalidHeight\":\"Биеклек сан булырга тиеш.\",\"invalidWidth\":\"Киңлек сан булырга тиеш.\",\"invalidCssLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"invalidHtmlLength\":\"Value specified for the \\\"%1\\\" field must be a positive number with or without a valid HTML measurement unit (px or %).\",\"invalidInlineStyle\":\"Value specified for the inline style must consist of one or more tuples with the format of \\\"name : value\\\", separated by semi-colons.\",\"cssLengthTooltip\":\"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, unavailable</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Бар хокуклар сакланган\",\"dlgTitle\":\"CKEditor турында\",\"help\":\"Ярдәм өчен $1 тикшереп карагыз.\",\"moreInfo\":\"For licensing information please visit our web site:\",\"title\":\"CKEditor турында\",\"userGuide\":\"CKEditor кулланмасы\"},\"basicstyles\":{\"bold\":\"Калын\",\"italic\":\"Курсив\",\"strike\":\"Сызылган\",\"subscript\":\"Аскы индекс\",\"superscript\":\"Өске индекс\",\"underline\":\"Астына сызылган\"},\"bidi\":{\"ltr\":\"Сулдан уңга язылыш\",\"rtl\":\"Уңнан сулга язылыш\"},\"blockquote\":{\"toolbar\":\"Өземтә блогы\"},\"clipboard\":{\"copy\":\"Күчермәләү\",\"copyError\":\"Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.\",\"cut\":\"Кисеп алу\",\"cutError\":\"Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.\",\"paste\":\"Өстәү\",\"pasteArea\":\"Өстәү мәйданы\",\"pasteMsg\":\"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK\",\"securityMsg\":\"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.\",\"title\":\"Өстәү\"},\"button\":{\"selectedLabel\":\"%1 (Сайланган)\"},\"colorbutton\":{\"auto\":\"Автоматик\",\"bgColorTitle\":\"Фон төсе\",\"colors\":{\"000\":\"Кара\",\"800000\":\"Бордо\",\"8B4513\":\"Дарчин\",\"2F4F4F\":\"Аспид соры\",\"008080\":\"Күкле-яшелле\",\"000080\":\"Куе күк\",\"4B0082\":\"Индиго\",\"696969\":\"Куе соры\",\"B22222\":\"Кармин\",\"A52A2A\":\"Чия кызыл\",\"DAA520\":\"Алтын каен\",\"006400\":\"Үлән\",\"40E0D0\":\"Фирәзә\",\"0000CD\":\"Фарсы күк\",\"800080\":\"Шәмәхә\",\"808080\":\"Соры\",\"F00\":\"Кызыл\",\"FF8C00\":\"Кабак\",\"FFD700\":\"Алтын\",\"008000\":\"Яшел\",\"0FF\":\"Ачык зәңгәр\",\"00F\":\"Зәңгәр\",\"EE82EE\":\"Миләүшә\",\"A9A9A9\":\"Ачык соры\",\"FFA07A\":\"Кызгылт сары алсу\",\"FFA500\":\"Кызгылт сары\",\"FFFF00\":\"Сары\",\"00FF00\":\"Лайм\",\"AFEEEE\":\"Тонык күк\",\"ADD8E6\":\"Тонык күкбаш\",\"DDA0DD\":\"Аксыл шәмәхә\",\"D3D3D3\":\"Ачык соры\",\"FFF0F5\":\"Ал ала миләүшә\",\"FAEBD7\":\"Җитен\",\"FFFFE0\":\"Ачык сары\",\"F0FFF0\":\"Аксыл көрән\",\"F0FFFF\":\"Ап-ак\",\"F0F8FF\":\"Аксыл зәңгәр диңгез\",\"E6E6FA\":\"Ала миләүшә\",\"FFF\":\"Ак\"},\"more\":\"Башка төсләр...\",\"panelTitle\":\"Төсләр\",\"textColorTitle\":\"Текст төсе\"},\"colordialog\":{\"clear\":\"Бушату\",\"highlight\":\"Билгеләү\",\"options\":\"Төс көйләүләре\",\"selected\":\"Сайланган төсләр\",\"title\":\"Төс сайлау\"},\"templates\":{\"button\":\"Шаблоннар\",\"emptyListMsg\":\"(Шаблоннар билгеләнмәгән)\",\"insertOption\":\"Әлеге эчтәлекне алмаштыру\",\"options\":\"Шаблон үзлекләре\",\"selectPromptMsg\":\"Please select the template to open in the editor\",\"title\":\"Эчтәлек шаблоннары\"},\"contextmenu\":{\"options\":\"Контекст меню үзлекләре\"},\"div\":{\"IdInputLabel\":\"Идентификатор\",\"advisoryTitleInputLabel\":\"Киңәш исем\",\"cssClassInputLabel\":\"Стильләр класслары\",\"edit\":\"Edit Div\",\"inlineStyleInputLabel\":\"Эчке стиль\",\"langDirLTRLabel\":\"Сулдан уңга язылыш (LTR)\",\"langDirLabel\":\"Язылыш юнəлеше\",\"langDirRTLLabel\":\"Уңнан сулга язылыш (RTL)\",\"languageCodeInputLabel\":\"Тел коды\",\"remove\":\"Remove Div\",\"styleSelectLabel\":\"Стиль\",\"title\":\"Create Div Container\",\"toolbar\":\"Create Div Container\"},\"toolbar\":{\"toolbarCollapse\":\"Collapse Toolbar\",\"toolbarExpand\":\"Expand Toolbar\",\"toolbarGroups\":{\"document\":\"Документ\",\"clipboard\":\"Алмашу буферы/Кайтару\",\"editing\":\"Төзәтү\",\"forms\":\"Формалар\",\"basicstyles\":\"Төп стильләр\",\"paragraph\":\"Параграф\",\"links\":\"Сылталамалар\",\"insert\":\"Өстәү\",\"styles\":\"Стильләр\",\"colors\":\"Төсләр\",\"tools\":\"Кораллар\"},\"toolbars\":\"Editor toolbars\"},\"elementspath\":{\"eleLabel\":\"Elements path\",\"eleTitle\":\"%1 элемент\"},\"find\":{\"find\":\"Эзләү\",\"findOptions\":\"Эзләү көйләүләре\",\"findWhat\":\"Нәрсә эзләргә:\",\"matchCase\":\"Баш һәм юл хәрефләрен исәпкә алу\",\"matchCyclic\":\"Кабатлап эзләргә\",\"matchWord\":\"Сүзләрне тулысынча гына эзләү\",\"notFoundMsg\":\"Эзләнгән текст табылмады.\",\"replace\":\"Алмаштыру\",\"replaceAll\":\"Барысын да алмаштыру\",\"replaceSuccessMsg\":\"%1 урында(ларда) алмаштырылган.\",\"replaceWith\":\"Нәрсәгә алмаштыру:\",\"title\":\"Эзләп табу һәм алмаштыру\"},\"fakeobjects\":{\"anchor\":\"Якорь\",\"flash\":\"Флеш анимациясы\",\"hiddenfield\":\"Яшерен кыр\",\"iframe\":\"IFrame\",\"unknown\":\"Танылмаган объект\"},\"flash\":{\"access\":\"Script Access\",\"accessAlways\":\"Һəрвакыт\",\"accessNever\":\"Беркайчан да\",\"accessSameDomain\":\"Same domain\",\"alignAbsBottom\":\"Иң аска\",\"alignAbsMiddle\":\"Төгәл уртада\",\"alignBaseline\":\"Таяныч сызыгы\",\"alignTextTop\":\"Текст өсте\",\"bgcolor\":\"Фон төсе\",\"chkFull\":\"Allow Fullscreen\",\"chkLoop\":\"Әйләнеш\",\"chkMenu\":\"Enable Flash Menu\",\"chkPlay\":\"Auto Play\",\"flashvars\":\"Variables for Flash\",\"hSpace\":\"Горизонталь ара\",\"properties\":\"Флеш үзлекләре\",\"propertiesTab\":\"Үзлекләр\",\"quality\":\"Сыйфат\",\"qualityAutoHigh\":\"Авто югары сыйфат\",\"qualityAutoLow\":\"Авто түбән сыйфат\",\"qualityBest\":\"Иң югары сыйфат\",\"qualityHigh\":\"Югары\",\"qualityLow\":\"Түбəн\",\"qualityMedium\":\"Уртача\",\"scale\":\"Зурлык\",\"scaleAll\":\"Барысын күрсәтү\",\"scaleFit\":\"Exact Fit\",\"scaleNoBorder\":\"Чиксез\",\"title\":\"Флеш үзлекләре\",\"vSpace\":\"Вертикаль ара\",\"validateHSpace\":\"Горизонталь ара  сан булырга тиеш.\",\"validateSrc\":\"URL буш булмаска тиеш.\",\"validateVSpace\":\"Вертикаль ара  сан булырга тиеш.\",\"windowMode\":\"Тəрəзə тәртибе\",\"windowModeOpaque\":\"Үтә күренмәле\",\"windowModeTransparent\":\"Үтə күренмəле\",\"windowModeWindow\":\"Тəрəзə\"},\"font\":{\"fontSize\":{\"label\":\"Зурлык\",\"voiceLabel\":\"Шрифт зурлыклары\",\"panelTitle\":\"Шрифт зурлыклары\"},\"label\":\"Шрифт\",\"panelTitle\":\"Шрифт исеме\",\"voiceLabel\":\"Шрифт\"},\"forms\":{\"button\":{\"title\":\"Төймә үзлекләре\",\"text\":\"Текст (күләм)\",\"type\":\"Төр\",\"typeBtn\":\"Төймә\",\"typeSbm\":\"Җибәрү\",\"typeRst\":\"Кире кайтару\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Checkbox Properties\",\"radioTitle\":\"Радио төймə үзлекләре\",\"value\":\"Күләм\",\"selected\":\"Сайланган\",\"required\":\"Мәҗбүри\"},\"form\":{\"title\":\"Форма үзлекләре\",\"menu\":\"Форма үзлекләре\",\"action\":\"Гамәл\",\"method\":\"Ысул\",\"encoding\":\"Кодировка\"},\"hidden\":{\"title\":\"Яшерен кыр үзлекләре\",\"name\":\"Исем\",\"value\":\"Күләм\"},\"select\":{\"title\":\"Selection Field Properties\",\"selectInfo\":\"Информацияне сайлау\",\"opAvail\":\"Мөмкин булган көйләүләр\",\"value\":\"Күләм\",\"size\":\"Зурлык\",\"lines\":\"юллар\",\"chkMulti\":\"Allow multiple selections\",\"required\":\"Мәҗбүри\",\"opText\":\"Текст\",\"opValue\":\"Күләм\",\"btnAdd\":\"Кушу\",\"btnModify\":\"Үзгәртү\",\"btnUp\":\"Өскә\",\"btnDown\":\"Аска\",\"btnSetValue\":\"Сайланган күләм булып билгеләргә\",\"btnDelete\":\"Бетерү\"},\"textarea\":{\"title\":\"Текст мәйданы үзлекләре\",\"cols\":\"Баганалар\",\"rows\":\"Юллар\"},\"textfield\":{\"title\":\"Текст кыры үзлекләре\",\"name\":\"Исем\",\"value\":\"Күләм\",\"charWidth\":\"Символлар киңлеге\",\"maxChars\":\"Maximum Characters\",\"required\":\"Мәҗбүри\",\"type\":\"Төр\",\"typeText\":\"Текст\",\"typePass\":\"Сер сүз\",\"typeEmail\":\"Эл. почта\",\"typeSearch\":\"Эзләү\",\"typeTel\":\"Телефон номеры\",\"typeUrl\":\"Сылталама\"}},\"format\":{\"label\":\"Форматлау\",\"panelTitle\":\"Параграф форматлавы\",\"tag_address\":\"Адрес\",\"tag_div\":\"Гади (DIV)\",\"tag_h1\":\"Башлам 1\",\"tag_h2\":\"Башлам 2\",\"tag_h3\":\"Башлам 3\",\"tag_h4\":\"Башлам 4\",\"tag_h5\":\"Башлам 5\",\"tag_h6\":\"Башлам 6\",\"tag_p\":\"Гади\",\"tag_pre\":\"Форматлаулы\"},\"horizontalrule\":{\"toolbar\":\"Ятма сызык өстәү\"},\"iframe\":{\"border\":\"Frame чикләрен күрсәтү\",\"noUrl\":\"Please type the iframe URL\",\"scrolling\":\"Enable scrollbars\",\"title\":\"IFrame үзлекләре\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Альтернатив текст\",\"border\":\"Чик\",\"btnUpload\":\"Серверга җибәрү\",\"button2Img\":\"Do you want to transform the selected image button on a simple image?\",\"hSpace\":\"Горизонталь ара\",\"img2Button\":\"Do you want to transform the selected image on a image button?\",\"infoTab\":\"Рәсем тасвирламасы\",\"linkTab\":\"Сылталама\",\"lockRatio\":\"Lock Ratio\",\"menu\":\"Рәсем үзлекләре\",\"resetSize\":\"Баштагы зурлык\",\"title\":\"Рәсем үзлекләре\",\"titleButton\":\"Рәсемле төймə үзлекләре\",\"upload\":\"Йөкләү\",\"urlMissing\":\"Image source URL is missing.\",\"vSpace\":\"Вертикаль ара\",\"validateBorder\":\"Чик киңлеге сан булырга тиеш.\",\"validateHSpace\":\"Горизонталь ара бөтен сан булырга тиеш.\",\"validateVSpace\":\"Вертикаль ара бөтен сан булырга тиеш.\"},\"indent\":{\"indent\":\"Отступны арттыру\",\"outdent\":\"Отступны кечерәйтү\"},\"smiley\":{\"options\":\"Смайл көйләүләре\",\"title\":\"Смайл өстәү\",\"toolbar\":\"Смайл\"},\"justify\":{\"block\":\"Киңлеккә карап тигезләү\",\"center\":\"Үзәккә тигезләү\",\"left\":\"Сул як кырыйдан тигезләү\",\"right\":\"Уң як кырыйдан тигезләү\"},\"language\":{\"button\":\"Тел сайлау\",\"remove\":\"Телне бетерү\"},\"link\":{\"acccessKey\":\"Access Key\",\"advanced\":\"Киңәйтелгән көйләүләр\",\"advisoryContentType\":\"Advisory Content Type\",\"advisoryTitle\":\"Киңәш исем\",\"anchor\":{\"toolbar\":\"Якорь\",\"menu\":\"Якорьне үзгәртү\",\"title\":\"Якорь үзлекләре\",\"name\":\"Якорь исеме\",\"errorName\":\"Якорьнең исемен языгыз\",\"remove\":\"Якорьне бетерү\"},\"anchorId\":\"Элемент идентификаторы буенча\",\"anchorName\":\"Якорь исеме буенча\",\"charset\":\"Linked Resource Charset\",\"cssClasses\":\"Стильләр класслары\",\"emailAddress\":\"Электрон почта адресы\",\"emailBody\":\"Хат эчтәлеге\",\"emailSubject\":\"Хат темасы\",\"id\":\"Идентификатор\",\"info\":\"Сылталама тасвирламасы\",\"langCode\":\"Тел коды\",\"langDir\":\"Язылыш юнəлеше\",\"langDirLTR\":\"Сулдан уңга язылыш (LTR)\",\"langDirRTL\":\"Уңнан сулга язылыш (RTL)\",\"menu\":\"Сылталамаyны үзгәртү\",\"name\":\"Исем\",\"noAnchors\":\"(Әлеге документта якорьләр табылмады)\",\"noEmail\":\"Электрон почта адресын языгыз\",\"noUrl\":\"Сылталаманы языгыз\",\"other\":\"<бүтән>\",\"popupDependent\":\"Бәйле (Netscape)\",\"popupFeatures\":\"Popup Window Features\",\"popupFullScreen\":\"Тулы экран (IE)\",\"popupLeft\":\"Left Position\",\"popupLocationBar\":\"Location Bar\",\"popupMenuBar\":\"Menu Bar\",\"popupResizable\":\"Resizable\",\"popupScrollBars\":\"Scroll Bars\",\"popupStatusBar\":\"Status Bar\",\"popupToolbar\":\"Toolbar\",\"popupTop\":\"Top Position\",\"rel\":\"Бәйләнеш\",\"selectAnchor\":\"Якорьне сайлау\",\"styles\":\"Стиль\",\"tabIndex\":\"Tab Index\",\"target\":\"Максат\",\"targetFrame\":\"<frame>\",\"targetFrameName\":\"Target Frame Name\",\"targetPopup\":\"<popup window>\",\"targetPopupName\":\"Попап тәрәзәсе исеме\",\"title\":\"Сылталама\",\"toAnchor\":\"Якорьне текст белән бәйләү\",\"toEmail\":\"Электрон почта\",\"toUrl\":\"Сылталама\",\"toolbar\":\"Сылталама\",\"type\":\"Сылталама төре\",\"unlink\":\"Сылталаманы бетерү\",\"upload\":\"Йөкләү\"},\"list\":{\"bulletedlist\":\"Маркерлы тезмә өстәү/бетерү\",\"numberedlist\":\" Номерланган тезмә өстәү/бетерү\"},\"liststyle\":{\"armenian\":\"Әрмән номерлавы\",\"bulletedTitle\":\"Маркерлы тезмә үзлекләре\",\"circle\":\"Түгәрәк\",\"decimal\":\"Унарлы (1, 2, 3, ...)\",\"decimalLeadingZero\":\"Ноль белән башланган унарлы (01, 02, 03, ...)\",\"disc\":\"Диск\",\"georgian\":\"Georgian numbering (an, ban, gan, etc.)\",\"lowerAlpha\":\"Lower Alpha (a, b, c, d, e, etc.)\",\"lowerGreek\":\"Lower Greek (alpha, beta, gamma, etc.)\",\"lowerRoman\":\"Lower Roman (i, ii, iii, iv, v, etc.)\",\"none\":\"Һичбер\",\"notset\":\"<билгеләнмәгән>\",\"numberedTitle\":\"Номерлы тезмә үзлекләре\",\"square\":\"Шакмак\",\"start\":\"Башлау\",\"type\":\"Төр\",\"upperAlpha\":\"Upper Alpha (A, B, C, D, E, etc.)\",\"upperRoman\":\"Upper Roman (I, II, III, IV, V, etc.)\",\"validateStartNumber\":\"List start number must be a whole number.\"},\"magicline\":{\"title\":\"Бирегә параграф өстәү\"},\"maximize\":{\"maximize\":\"Зурайту\",\"minimize\":\"Кечерәйтү\"},\"newpage\":{\"toolbar\":\"Яңа бит\"},\"pagebreak\":{\"alt\":\"Бит бүлгече\",\"toolbar\":\"Бастыру өчен бит бүлгечен өстәү\"},\"pastetext\":{\"button\":\"Форматлаусыз текст өстәү\",\"title\":\"Форматлаусыз текст өстәү\"},\"pastefromword\":{\"confirmCleanup\":\"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?\",\"error\":\"It was not possible to clean up the pasted data due to an internal error\",\"title\":\"Word'тан өстәү\",\"toolbar\":\"Word'тан өстәү\"},\"preview\":{\"preview\":\"Карап алу\"},\"print\":{\"toolbar\":\"Бастыру\"},\"removeformat\":{\"toolbar\":\"Форматлауны бетерү\"},\"save\":{\"toolbar\":\"Саклау\"},\"selectall\":{\"toolbar\":\"Барысын сайлау\"},\"showblocks\":{\"toolbar\":\"Блокларны күрсәтү\"},\"sourcearea\":{\"toolbar\":\"Чыганак\"},\"specialchar\":{\"options\":\"Махсус символ үзлекләре\",\"title\":\"Махсус символ сайлау\",\"toolbar\":\"Махсус символ өстәү\"},\"scayt\":{\"btn_about\":\"About SCAYT\",\"btn_dictionaries\":\"Dictionaries\",\"btn_disable\":\"Disable SCAYT\",\"btn_enable\":\"Enable SCAYT\",\"btn_langs\":\"Languages\",\"btn_options\":\"Options\",\"text_title\":\"Spell Check As You Type\"},\"stylescombo\":{\"label\":\"Стильләр\",\"panelTitle\":\"Форматлау стильләре\",\"panelTitle1\":\"Блоклар стильләре\",\"panelTitle2\":\"Эчке стильләр\",\"panelTitle3\":\"Объектлар стильләре\"},\"table\":{\"border\":\"Чик калынлыгы\",\"caption\":\"Исем\",\"cell\":{\"menu\":\"Күзәнәк\",\"insertBefore\":\"Алдына күзәнәк өстәү\",\"insertAfter\":\"Артына күзәнәк өстәү\",\"deleteCell\":\"Күзәнәкләрне бетерү\",\"merge\":\"Күзәнәкләрне берләштерү\",\"mergeRight\":\"Уң яктагы белән берләштерү\",\"mergeDown\":\"Астагы белән берләштерү\",\"splitHorizontal\":\"Күзәнәкне юлларга бүлү\",\"splitVertical\":\"Күзәнәкне баганаларга бүлү\",\"title\":\"Күзәнәк үзлекләре\",\"cellType\":\"Күзәнәк төре\",\"rowSpan\":\"Юлларны берләштерү\",\"colSpan\":\"Баганаларны берләштерү\",\"wordWrap\":\"Текстны күчерү\",\"hAlign\":\"Ятма тигезләү\",\"vAlign\":\"Асма тигезләү\",\"alignBaseline\":\"Таяныч сызыгы\",\"bgColor\":\"Фон төсе\",\"borderColor\":\"Чик төсе\",\"data\":\"Мәгълүмат\",\"header\":\"Башлык\",\"yes\":\"Әйе\",\"no\":\"Юк\",\"invalidWidth\":\"Cell width must be a number.\",\"invalidHeight\":\"Cell height must be a number.\",\"invalidRowSpan\":\"Rows span must be a whole number.\",\"invalidColSpan\":\"Columns span must be a whole number.\",\"chooseColor\":\"Сайлау\"},\"cellPad\":\"Cell padding\",\"cellSpace\":\"Cell spacing\",\"column\":{\"menu\":\"Багана\",\"insertBefore\":\"Сулдан баганалар өстәү\",\"insertAfter\":\"Уңнан баганалар өстәү\",\"deleteColumn\":\"Баганаларны бетерү\"},\"columns\":\"Баганалар\",\"deleteTable\":\"Таблицаны бетерү\",\"headers\":\"Башлыклар\",\"headersBoth\":\"Икесе дә\",\"headersColumn\":\"Беренче багана\",\"headersNone\":\"Һичбер\",\"headersRow\":\"Беренче юл\",\"invalidBorder\":\"Чик киңлеге сан булырга тиеш.\",\"invalidCellPadding\":\"Cell padding must be a positive number.\",\"invalidCellSpacing\":\"Күзәнәкләр аралары уңай сан булырга тиеш.\",\"invalidCols\":\"Number of columns must be a number greater than 0.\",\"invalidHeight\":\"Таблица биеклеге сан булырга тиеш.\",\"invalidRows\":\"Number of rows must be a number greater than 0.\",\"invalidWidth\":\"Таблица киңлеге сан булырга тиеш\",\"menu\":\"Таблица үзлекләре\",\"row\":{\"menu\":\"Юл\",\"insertBefore\":\"Өстән юллар өстәү\",\"insertAfter\":\"Астан юллар өстәү\",\"deleteRow\":\"Юлларны бетерү\"},\"rows\":\"Юллар\",\"summary\":\"Йомгаклау\",\"title\":\"Таблица үзлекләре\",\"toolbar\":\"Таблица\",\"widthPc\":\"процент\",\"widthPx\":\"Нокталар\",\"widthUnit\":\"киңлек берәмлеге\"},\"undo\":{\"redo\":\"Кабатлау\",\"undo\":\"Кайтару\"},\"wsc\":{\"btnIgnore\":\"Ignore\",\"btnIgnoreAll\":\"Ignore All\",\"btnReplace\":\"Replace\",\"btnReplaceAll\":\"Replace All\",\"btnUndo\":\"Undo\",\"changeTo\":\"Change to\",\"errorLoading\":\"Error loading application service host: %s.\",\"ieSpellDownload\":\"Spell checker not installed. Do you want to download it now?\",\"manyChanges\":\"Spell check complete: %1 words changed\",\"noChanges\":\"Spell check complete: No words changed\",\"noMispell\":\"Spell check complete: No misspellings found\",\"noSuggestions\":\"- No suggestions -\",\"notAvailable\":\"Sorry, but service is unavailable now.\",\"notInDic\":\"Not in dictionary\",\"oneChange\":\"Spell check complete: One word changed\",\"progress\":\"Spell check in progress...\",\"title\":\"Spell Checker\",\"toolbar\":\"Check Spelling\"}};"
  },
  {
    "path": "assets/ckeditor/lang/ug.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['ug']={\"editor\":\"تەھرىرلىگۈچ\",\"editorPanel\":\"مول تېكست تەھرىرلىگۈچ تاختىسى\",\"common\":{\"editorHelp\":\"ALT+0 نى بېسىپ ياردەمنى كۆرۈڭ\",\"browseServer\":\"كۆرسىتىش مۇلازىمېتىر\",\"url\":\"ئەسلى ھۆججەت\",\"protocol\":\"كېلىشىم\",\"upload\":\"يۈكلە\",\"uploadSubmit\":\"مۇلازىمېتىرغا يۈكلە\",\"image\":\"سۈرەت\",\"flash\":\"Flash\",\"form\":\"جەدۋەل\",\"checkbox\":\"كۆپ تاللاش رامكىسى\",\"radio\":\"يەككە تاللاش توپچىسى\",\"textField\":\"يەككە قۇر تېكىست\",\"textarea\":\"كۆپ قۇر تېكىست\",\"hiddenField\":\"يوشۇرۇن دائىرە\",\"button\":\"توپچا\",\"select\":\"تىزىم/تىزىملىك\",\"imageButton\":\"سۈرەت دائىرە\",\"notSet\":\"‹تەڭشەلمىگەن›\",\"id\":\"ID\",\"name\":\"ئات\",\"langDir\":\"تىل يۆنىلىشى\",\"langDirLtr\":\"سولدىن ئوڭغا (LTR)\",\"langDirRtl\":\"ئوڭدىن سولغا (RTL)\",\"langCode\":\"تىل كودى\",\"longDescr\":\"تەپسىلىي چۈشەندۈرۈش ئادرېسى\",\"cssClass\":\"ئۇسلۇب خىلىنىڭ ئاتى\",\"advisoryTitle\":\"ماۋزۇ\",\"cssStyle\":\"قۇر ئىچىدىكى ئۇسلۇبى\",\"ok\":\"جەزملە\",\"cancel\":\"ۋاز كەچ\",\"close\":\"تاقا\",\"preview\":\"ئالدىن كۆزەت\",\"resize\":\"چوڭلۇقىنى ئۆزگەرت\",\"generalTab\":\"ئادەتتىكى\",\"advancedTab\":\"ئالىي\",\"validateNumberFailed\":\"سان پىچىمىدا كىرگۈزۈش زۆرۈر\",\"confirmNewPage\":\"نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، يېڭى پۈتۈك قۇرامسىز؟\",\"confirmCancel\":\"قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟\",\"options\":\"تاللانما\",\"target\":\"نىشان كۆزنەك\",\"targetNew\":\"يېڭى كۆزنەك (_blank)\",\"targetTop\":\"پۈتۈن بەت (_top)\",\"targetSelf\":\"مەزكۇر كۆزنەك (_self)\",\"targetParent\":\"ئاتا كۆزنەك (_parent)\",\"langDirLTR\":\"سولدىن ئوڭغا (LTR)\",\"langDirRTL\":\"ئوڭدىن سولغا (RTL)\",\"styles\":\"ئۇسلۇبلار\",\"cssClasses\":\"ئۇسلۇب خىللىرى\",\"width\":\"كەڭلىك\",\"height\":\"ئېگىزلىك\",\"align\":\"توغرىلىنىشى\",\"alignLeft\":\"سول\",\"alignRight\":\"ئوڭ\",\"alignCenter\":\"ئوتتۇرا\",\"alignJustify\":\"ئىككى تەرەپتىن توغرىلا\",\"alignTop\":\"ئۈستى\",\"alignMiddle\":\"ئوتتۇرا\",\"alignBottom\":\"ئاستى\",\"alignNone\":\"يوق\",\"invalidValue\":\"ئىناۋەتسىز قىممەت.\",\"invalidHeight\":\"ئېگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر\",\"invalidWidth\":\"كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر\",\"invalidCssLength\":\"بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt ياكى pc)\",\"invalidHtmlLength\":\"بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px ياكى %)\",\"invalidInlineStyle\":\"ئىچكى باغلانما ئۇسلۇبى چوقۇم چېكىتلىك پەش بىلەن ئايرىلغان بىر ياكى كۆپ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم\",\"cssLengthTooltip\":\"بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt ياكى pc)\",\"unavailable\":\"%1<span class=\\\\\\\\\\\"cke_accessibility\\\\\\\\\\\">، ئىشلەتكىلى بولمايدۇ</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. نەشر ھوقۇقىغا ئىگە\",\"dlgTitle\":\"CKEditor ھەققىدە\",\"help\":\"$1 نى زىيارەت قىلىپ ياردەمگە ئېرىشىڭ\",\"moreInfo\":\"تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ\",\"title\":\"CKEditor ھەققىدە\",\"userGuide\":\"CKEditor ئىشلەتكۈچى قوللانمىسى\"},\"basicstyles\":{\"bold\":\"توم\",\"italic\":\"يانتۇ\",\"strike\":\"ئۆچۈرۈش سىزىقى\",\"subscript\":\"تۆۋەن ئىندېكس\",\"superscript\":\"يۇقىرى ئىندېكس\",\"underline\":\"ئاستى سىزىق\"},\"bidi\":{\"ltr\":\"تېكىست يۆنىلىشى سولدىن ئوڭغا\",\"rtl\":\"تېكىست يۆنىلىشى ئوڭدىن سولغا\"},\"blockquote\":{\"toolbar\":\"بۆلەك نەقىل\"},\"clipboard\":{\"copy\":\"كۆچۈر\",\"copyError\":\"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ\",\"cut\":\"كەس\",\"cutError\":\"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ\",\"paste\":\"چاپلا\",\"pasteArea\":\"چاپلاش دائىرىسى\",\"pasteMsg\":\"ھەرپتاختا تېز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بېسىڭ\",\"securityMsg\":\"توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.\",\"title\":\"چاپلا\"},\"button\":{\"selectedLabel\":\"%1 (تاللاندى)\"},\"colorbutton\":{\"auto\":\"ئۆزلۈكىدىن\",\"bgColorTitle\":\"تەگلىك رەڭگى\",\"colors\":{\"000\":\"قارا\",\"800000\":\"قىزغۇچ سېرىق\",\"8B4513\":\"توق قوڭۇر\",\"2F4F4F\":\"قارامتۇل يېشىل\",\"008080\":\"كۆكۈش يېشىل\",\"000080\":\"قارامتۇل كۆك\",\"4B0082\":\"كۆكۈش كۈلرەڭ\",\"696969\":\"قارامتۇل كۈلرەڭ\",\"B22222\":\"خىش قىزىل\",\"A52A2A\":\"قوڭۇر\",\"DAA520\":\"ئالتۇن سېرىق\",\"006400\":\"توق يېشىل\",\"40E0D0\":\"كۆكۈچ يېشىل\",\"0000CD\":\"ئوتتۇراھال كۆك\",\"800080\":\"بىنەپشە\",\"808080\":\"كۈلرەڭ\",\"F00\":\"قىزىل\",\"FF8C00\":\"توق قىزغۇچ سېرىق\",\"FFD700\":\"ئالتۇن\",\"008000\":\"يېشىل\",\"0FF\":\"يېشىل كۆك\",\"00F\":\"كۆك\",\"EE82EE\":\"قىزغۇچ بىنەپشە\",\"A9A9A9\":\"توق كۈلرەڭ\",\"FFA07A\":\"كاۋا چېچىكى سېرىق\",\"FFA500\":\"قىزغۇچ سېرىق\",\"FFFF00\":\"سېرىق\",\"00FF00\":\"Lime\",\"AFEEEE\":\"سۇس ھاۋا رەڭ\",\"ADD8E6\":\"ئوچۇق كۆك\",\"DDA0DD\":\"قىزغۇچ بىنەپشە\",\"D3D3D3\":\"سۇس كۆكۈچ كۈلرەڭ\",\"FFF0F5\":\"سۇس قىزغۇچ بىنەپشە\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"سۇس سېرىق\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"ئاسمان كۆكى\",\"F0F8FF\":\"سۇس كۆك\",\"E6E6FA\":\"سۇس بىنەپشە\",\"FFF\":\"ئاق\"},\"more\":\"باشقا رەڭ\",\"panelTitle\":\"رەڭ\",\"textColorTitle\":\"تېكىست رەڭگى\"},\"colordialog\":{\"clear\":\"تازىلا\",\"highlight\":\"يورۇت\",\"options\":\"رەڭ تاللانمىسى\",\"selected\":\"رەڭ تاللاڭ\",\"title\":\"رەڭ تاللاڭ\"},\"templates\":{\"button\":\"قېلىپ\",\"emptyListMsg\":\"(قېلىپ يوق)\",\"insertOption\":\"نۆۋەتتىكى مەزمۇننى ئالماشتۇر\",\"options\":\"قېلىپ تاللانمىسى\",\"selectPromptMsg\":\"تەھرىرلىگۈچنىڭ مەزمۇن قېلىپىنى تاللاڭ:\",\"title\":\"مەزمۇن قېلىپى\"},\"contextmenu\":{\"options\":\"قىسقا يول تىزىملىك تاللانمىسى\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"ماۋزۇ\",\"cssClassInputLabel\":\"ئۇسلۇب تىپىنىڭ ئاتى\",\"edit\":\"DIV تەھرىر\",\"inlineStyleInputLabel\":\"قۇر ئىچىدىكى ئۇسلۇبى\",\"langDirLTRLabel\":\"سولدىن ئوڭغا (LTR)\",\"langDirLabel\":\"تىل يۆنىلىشى\",\"langDirRTLLabel\":\"ئوڭدىن سولغا (RTL)\",\"languageCodeInputLabel\":\"تىل كودى\",\"remove\":\"DIV چىقىرىۋەت\",\"styleSelectLabel\":\"ئۇسلۇب\",\"title\":\"DIV قاچا قۇر\",\"toolbar\":\"DIV قاچا قۇر\"},\"toolbar\":{\"toolbarCollapse\":\"قورال بالداقنى قاتلا\",\"toolbarExpand\":\"قورال بالداقنى ياي\",\"toolbarGroups\":{\"document\":\"پۈتۈك\",\"clipboard\":\"چاپلاش تاختىسى/يېنىۋال\",\"editing\":\"تەھرىر\",\"forms\":\"جەدۋەل\",\"basicstyles\":\"ئاساسىي ئۇسلۇب\",\"paragraph\":\"ئابزاس\",\"links\":\"ئۇلانما\",\"insert\":\"قىستۇر\",\"styles\":\"ئۇسلۇب\",\"colors\":\"رەڭ\",\"tools\":\"قورال\"},\"toolbars\":\"قورال بالداق\"},\"elementspath\":{\"eleLabel\":\"ئېلېمېنت يولى\",\"eleTitle\":\"%1 ئېلېمېنت\"},\"find\":{\"find\":\"ئىزدە\",\"findOptions\":\"ئىزدەش تاللانمىسى\",\"findWhat\":\"ئىزدە:\",\"matchCase\":\"چوڭ كىچىك ھەرپنى پەرقلەندۈر\",\"matchCyclic\":\"ئايلانما ماسلىشىش\",\"matchWord\":\"پۈتۈن سۆز ماسلىشىش\",\"notFoundMsg\":\"بەلگىلەنگەن تېكىستنى تاپالمىدى\",\"replace\":\"ئالماشتۇر\",\"replaceAll\":\"ھەممىنى ئالماشتۇر\",\"replaceSuccessMsg\":\"جەمئى %1 جايدىكى ئالماشتۇرۇش تاماملاندى\",\"replaceWith\":\"ئالماشتۇر:\",\"title\":\"ئىزدەپ ئالماشتۇر\"},\"fakeobjects\":{\"anchor\":\"لەڭگەرلىك نۇقتا\",\"flash\":\"Flash جانلاندۇرۇم\",\"hiddenfield\":\"يوشۇرۇن دائىرە\",\"iframe\":\"IFrame\",\"unknown\":\"يوچۇن نەڭ\"},\"flash\":{\"access\":\"قوليازما زىيارەتكە يول قوي\",\"accessAlways\":\"ھەمىشە\",\"accessNever\":\"ھەرگىز\",\"accessSameDomain\":\"ئوخشاش دائىرىدە\",\"alignAbsBottom\":\"مۇتلەق ئاستى\",\"alignAbsMiddle\":\"مۇتلەق ئوتتۇرا\",\"alignBaseline\":\"ئاساسىي سىزىق\",\"alignTextTop\":\"تېكىست ئۈستىدە\",\"bgcolor\":\"تەگلىك رەڭگى\",\"chkFull\":\"پۈتۈن ئېكراننى قوزغات\",\"chkLoop\":\"دەۋرىي\",\"chkMenu\":\"Flash تىزىملىكنى قوزغات\",\"chkPlay\":\"ئۆزلۈكىدىن چال\",\"flashvars\":\"Flash  ئۆزگەرگۈچى\",\"hSpace\":\"توغرىسىغا ئارىلىق\",\"properties\":\"Flash خاسلىق\",\"propertiesTab\":\"خاسلىق\",\"quality\":\"سۈپەت\",\"qualityAutoHigh\":\"يۇقىرى (ئاپتوماتىك)\",\"qualityAutoLow\":\"تۆۋەن (ئاپتوماتىك)\",\"qualityBest\":\"ئەڭ ياخشى\",\"qualityHigh\":\"يۇقىرى\",\"qualityLow\":\"تۆۋەن\",\"qualityMedium\":\"ئوتتۇرا (ئاپتوماتىك)\",\"scale\":\"نىسبىتى\",\"scaleAll\":\"ھەممىنى كۆرسەت\",\"scaleFit\":\"قەتئىي ماسلىشىش\",\"scaleNoBorder\":\"گىرۋەك يوق\",\"title\":\"ماۋزۇ\",\"vSpace\":\"بويىغا ئارىلىق\",\"validateHSpace\":\"توغرىسىغا ئارىلىق چوقۇم سان بولىدۇ\",\"validateSrc\":\"ئەسلى ھۆججەت ئادرېسىنى كىرگۈزۈڭ\",\"validateVSpace\":\"بويىغا ئارىلىق چوقۇم سان بولىدۇ\",\"windowMode\":\"كۆزنەك ھالىتى\",\"windowModeOpaque\":\"خىرە\",\"windowModeTransparent\":\"سۈزۈك\",\"windowModeWindow\":\"كۆزنەك گەۋدىسى\"},\"font\":{\"fontSize\":{\"label\":\"چوڭلۇقى\",\"voiceLabel\":\"خەت چوڭلۇقى\",\"panelTitle\":\"چوڭلۇقى\"},\"label\":\"خەت نۇسخا\",\"panelTitle\":\"خەت نۇسخا\",\"voiceLabel\":\"خەت نۇسخا\"},\"forms\":{\"button\":{\"title\":\"توپچا خاسلىقى\",\"text\":\"بەلگە (قىممەت)\",\"type\":\"تىپى\",\"typeBtn\":\"توپچا\",\"typeSbm\":\"تاپشۇر\",\"typeRst\":\"ئەسلىگە قايتۇر\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"كۆپ تاللاش خاسلىقى\",\"radioTitle\":\"تاق تاللاش توپچا خاسلىقى\",\"value\":\"تاللىغان قىممەت\",\"selected\":\"تاللانغان\",\"required\":\"زۆرۈر\"},\"form\":{\"title\":\"جەدۋەل خاسلىقى\",\"menu\":\"جەدۋەل خاسلىقى\",\"action\":\"مەشغۇلات\",\"method\":\"ئۇسۇل\",\"encoding\":\"جەدۋەل كودلىنىشى\"},\"hidden\":{\"title\":\"يوشۇرۇن دائىرە خاسلىقى\",\"name\":\"ئات\",\"value\":\"دەسلەپكى قىممىتى\"},\"select\":{\"title\":\"جەدۋەل/تىزىم خاسلىقى\",\"selectInfo\":\"ئۇچۇر تاللاڭ\",\"opAvail\":\"تاللاش تۈرلىرى\",\"value\":\"قىممەت\",\"size\":\"ئېگىزلىكى\",\"lines\":\"قۇر\",\"chkMulti\":\"كۆپ تاللاشچان\",\"required\":\"زۆرۈر\",\"opText\":\"تاللانما تېكىستى\",\"opValue\":\"تاللانما قىممىتى\",\"btnAdd\":\"قوش\",\"btnModify\":\"ئۆزگەرت\",\"btnUp\":\"ئۈستىگە\",\"btnDown\":\"ئاستىغا\",\"btnSetValue\":\"دەسلەپكى تاللانما قىممىتىگە تەڭشە\",\"btnDelete\":\"ئۆچۈر\"},\"textarea\":{\"title\":\" كۆپ قۇرلۇق تېكىست خاسلىقى\",\"cols\":\"ھەرپ كەڭلىكى\",\"rows\":\"قۇر سانى\"},\"textfield\":{\"title\":\"تاق قۇرلۇق تېكىست خاسلىقى\",\"name\":\"ئات\",\"value\":\"دەسلەپكى قىممىتى\",\"charWidth\":\"ھەرپ كەڭلىكى\",\"maxChars\":\"ئەڭ كۆپ ھەرپ سانى\",\"required\":\"زۆرۈر\",\"type\":\"تىپى\",\"typeText\":\"تېكىست\",\"typePass\":\"ئىم\",\"typeEmail\":\"تورخەت\",\"typeSearch\":\"ئىزدە\",\"typeTel\":\"تېلېفون نومۇر\",\"typeUrl\":\"ئادرېس\"}},\"format\":{\"label\":\"پىچىم\",\"panelTitle\":\"پىچىم\",\"tag_address\":\"ئادرېس\",\"tag_div\":\"ئابزاس (DIV)\",\"tag_h1\":\"ماۋزۇ 1\",\"tag_h2\":\"ماۋزۇ 2\",\"tag_h3\":\"ماۋزۇ 3\",\"tag_h4\":\"ماۋزۇ 4\",\"tag_h5\":\"ماۋزۇ 5\",\"tag_h6\":\"ماۋزۇ 6\",\"tag_p\":\"ئادەتتىكى\",\"tag_pre\":\"تىزىلغان پىچىم\"},\"horizontalrule\":{\"toolbar\":\"توغرا سىزىق قىستۇر\"},\"iframe\":{\"border\":\"كاندۇك گىرۋەكلىرىنى كۆرسەت\",\"noUrl\":\"كاندۇكنىڭ ئادرېسى(Url)نى كىرگۈزۈڭ\",\"scrolling\":\"دومىلىما سۈرگۈچكە يول قوي\",\"title\":\"IFrame خاسلىق\",\"toolbar\":\"IFrame \"},\"image\":{\"alt\":\"تېكىست ئالماشتۇر\",\"border\":\"گىرۋەك چوڭلۇقى\",\"btnUpload\":\"مۇلازىمېتىرغا يۈكلە\",\"button2Img\":\"نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟\",\"hSpace\":\"توغرىسىغا ئارىلىقى\",\"img2Button\":\"نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟\",\"infoTab\":\"سۈرەت\",\"linkTab\":\"ئۇلانما\",\"lockRatio\":\"نىسبەتنى قۇلۇپلا\",\"menu\":\"سۈرەت خاسلىقى\",\"resetSize\":\"ئەسلى چوڭلۇق\",\"title\":\"سۈرەت خاسلىقى\",\"titleButton\":\"سۈرەت دائىرە خاسلىقى\",\"upload\":\"يۈكلە\",\"urlMissing\":\"سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم\",\"vSpace\":\"بويىغا ئارىلىقى\",\"validateBorder\":\"گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ\",\"validateHSpace\":\"توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ\",\"validateVSpace\":\"بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ\"},\"indent\":{\"indent\":\"تارايت\",\"outdent\":\"كەڭەيت\"},\"smiley\":{\"options\":\"چىراي ئىپادە سىنبەلگە تاللانمىسى\",\"title\":\"چىراي ئىپادە سىنبەلگە قىستۇر\",\"toolbar\":\"چىراي ئىپادە\"},\"justify\":{\"block\":\"ئىككى تەرەپتىن توغرىلا\",\"center\":\"ئوتتۇرىغا توغرىلا\",\"left\":\"سولغا توغرىلا\",\"right\":\"ئوڭغا توغرىلا\"},\"language\":{\"button\":\"تىل تەڭشەك\",\"remove\":\"تىلنى چىقىرىۋەت\"},\"link\":{\"acccessKey\":\"زىيارەت كۇنۇپكا\",\"advanced\":\"ئالىي\",\"advisoryContentType\":\"مەزمۇن تىپى\",\"advisoryTitle\":\"ماۋزۇ\",\"anchor\":{\"toolbar\":\"لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە\",\"menu\":\"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى\",\"title\":\"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى\",\"name\":\"لەڭگەرلىك نۇقتا ئاتى\",\"errorName\":\"لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ\",\"remove\":\"لەڭگەرلىك نۇقتا ئۆچۈر\"},\"anchorId\":\"لەڭگەرلىك نۇقتا ID سى بويىچە\",\"anchorName\":\"لەڭگەرلىك نۇقتا ئاتى بويىچە\",\"charset\":\"ھەرپ كودلىنىشى\",\"cssClasses\":\"ئۇسلۇب خىلى ئاتى\",\"emailAddress\":\"ئادرېس\",\"emailBody\":\"مەزمۇن\",\"emailSubject\":\"ماۋزۇ\",\"id\":\"ID\",\"info\":\"ئۇلانما ئۇچۇرى\",\"langCode\":\"تىل كودى\",\"langDir\":\"تىل يۆنىلىشى\",\"langDirLTR\":\"سولدىن ئوڭغا (LTR)\",\"langDirRTL\":\"ئوڭدىن سولغا (RTL)\",\"menu\":\"ئۇلانما تەھرىر\",\"name\":\"ئات\",\"noAnchors\":\"(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)\",\"noEmail\":\"ئېلخەت ئادرېسىنى كىرگۈزۈڭ\",\"noUrl\":\"ئۇلانما ئادرېسىنى كىرگۈزۈڭ\",\"other\":\"‹باشقا›\",\"popupDependent\":\"تەۋە (NS)\",\"popupFeatures\":\"قاڭقىش كۆزنەك خاسلىقى\",\"popupFullScreen\":\"پۈتۈن ئېكران (IE)\",\"popupLeft\":\"سول\",\"popupLocationBar\":\"ئادرېس بالداق\",\"popupMenuBar\":\"تىزىملىك بالداق\",\"popupResizable\":\"چوڭلۇقى ئۆزگەرتىشچان\",\"popupScrollBars\":\"دومىلىما سۈرگۈچ\",\"popupStatusBar\":\"ھالەت بالداق\",\"popupToolbar\":\"قورال بالداق\",\"popupTop\":\"ئوڭ\",\"rel\":\"باغلىنىش\",\"selectAnchor\":\"بىر لەڭگەرلىك نۇقتا تاللاڭ\",\"styles\":\"قۇر ئىچىدىكى ئۇسلۇبى\",\"tabIndex\":\"Tab تەرتىپى\",\"target\":\"نىشان\",\"targetFrame\":\"‹كاندۇك›\",\"targetFrameName\":\"نىشان كاندۇك ئاتى\",\"targetPopup\":\"‹قاڭقىش كۆزنەك›\",\"targetPopupName\":\"قاڭقىش كۆزنەك ئاتى\",\"title\":\"ئۇلانما\",\"toAnchor\":\"بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى\",\"toEmail\":\"ئېلخەت\",\"toUrl\":\"ئادرېس\",\"toolbar\":\"ئۇلانما قىستۇر/تەھرىرلە\",\"type\":\"ئۇلانما تىپى\",\"unlink\":\"ئۇلانما بىكار قىل\",\"upload\":\"يۈكلە\"},\"list\":{\"bulletedlist\":\"تۈر بەلگە تىزىمى\",\"numberedlist\":\"تەرتىپ نومۇر تىزىمى\"},\"liststyle\":{\"armenian\":\"قەدىمكى ئەرمىنىيە تەرتىپ نومۇرى شەكلى\",\"bulletedTitle\":\"تۈر بەلگە تىزىم خاسلىقى\",\"circle\":\"بوش چەمبەر\",\"decimal\":\"سان (1, 2, 3 قاتارلىق)\",\"decimalLeadingZero\":\"نۆلدىن باشلانغان سان بەلگە (01, 02, 03 قاتارلىق)\",\"disc\":\"تولدۇرۇلغان چەمبەر\",\"georgian\":\"قەدىمكى جورجىيە تەرتىپ نومۇرى شەكلى (an, ban, gan قاتارلىق)\",\"lowerAlpha\":\"ئىنگلىزچە كىچىك ھەرپ (a, b, c, d, e قاتارلىق)\",\"lowerGreek\":\"گرېكچە كىچىك ھەرپ (alpha, beta, gamma قاتارلىق)\",\"lowerRoman\":\"كىچىك ھەرپلىك رىم رەقىمى (i, ii, iii, iv, v قاتارلىق)\",\"none\":\"بەلگە يوق\",\"notset\":\"‹تەڭشەلمىگەن›\",\"numberedTitle\":\"تەرتىپ نومۇر تىزىم خاسلىقى\",\"square\":\"تولدۇرۇلغان تۆت چاسا\",\"start\":\"باشلىنىش نومۇرى\",\"type\":\"بەلگە تىپى\",\"upperAlpha\":\"ئىنگلىزچە چوڭ ھەرپ (A, B, C, D, E قاتارلىق)\",\"upperRoman\":\"چوڭ ھەرپلىك رىم رەقىمى (I, II, III, IV, V قاتارلىق)\",\"validateStartNumber\":\"تىزىم باشلىنىش تەرتىپ نومۇرى چوقۇم پۈتۈن سان پىچىمىدا بولۇشى لازىم\"},\"magicline\":{\"title\":\"بۇ جايغا ئابزاس قىستۇر\"},\"maximize\":{\"maximize\":\"چوڭايت\",\"minimize\":\"كىچىكلەت\"},\"newpage\":{\"toolbar\":\"يېڭى بەت\"},\"pagebreak\":{\"alt\":\"بەت ئايرىغۇچ\",\"toolbar\":\"بەت ئايرىغۇچ قىستۇر\"},\"pastetext\":{\"button\":\"پىچىمى يوق تېكىست سۈپىتىدە چاپلا\",\"title\":\"پىچىمى يوق تېكىست سۈپىتىدە چاپلا\"},\"pastefromword\":{\"confirmCleanup\":\"سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟\",\"error\":\"ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ\",\"title\":\"MS Word تىن چاپلا\",\"toolbar\":\"MS Word تىن چاپلا\"},\"preview\":{\"preview\":\"ئالدىن كۆزەت\"},\"print\":{\"toolbar\":\"باس \"},\"removeformat\":{\"toolbar\":\"پىچىمنى چىقىرىۋەت\"},\"save\":{\"toolbar\":\"ساقلا\"},\"selectall\":{\"toolbar\":\"ھەممىنى تاللا\"},\"showblocks\":{\"toolbar\":\"بۆلەكنى كۆرسەت\"},\"sourcearea\":{\"toolbar\":\"مەنبە\"},\"specialchar\":{\"options\":\"ئالاھىدە ھەرپ تاللانمىسى\",\"title\":\"ئالاھىدە ھەرپ تاللاڭ\",\"toolbar\":\"ئالاھىدە ھەرپ قىستۇر\"},\"scayt\":{\"btn_about\":\"شۇئان ئىملا تەكشۈرۈش ھەققىدە\",\"btn_dictionaries\":\"لۇغەت\",\"btn_disable\":\"شۇئان ئىملا تەكشۈرۈشنى چەكلە\",\"btn_enable\":\"شۇئان ئىملا تەكشۈرۈشنى قوزغات\",\"btn_langs\":\"تىل\",\"btn_options\":\"تاللانما\",\"text_title\":\"شۇئان ئىملا تەكشۈر\"},\"stylescombo\":{\"label\":\"ئۇسلۇب\",\"panelTitle\":\"ئۇسلۇب\",\"panelTitle1\":\"بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى\",\"panelTitle2\":\"ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى\",\"panelTitle3\":\"نەڭ (Object) ئېلېمېنت ئۇسلۇبى\"},\"table\":{\"border\":\"گىرۋەك\",\"caption\":\"ماۋزۇ\",\"cell\":{\"menu\":\"كاتەكچە\",\"insertBefore\":\"سولغا كاتەكچە قىستۇر\",\"insertAfter\":\"ئوڭغا كاتەكچە قىستۇر\",\"deleteCell\":\"كەتەكچە ئۆچۈر\",\"merge\":\"كاتەكچە بىرلەشتۈر\",\"mergeRight\":\"كاتەكچىنى ئوڭغا بىرلەشتۈر\",\"mergeDown\":\"كاتەكچىنى ئاستىغا بىرلەشتۈر\",\"splitHorizontal\":\"كاتەكچىنى توغرىسىغا بىرلەشتۈر\",\"splitVertical\":\"كاتەكچىنى بويىغا بىرلەشتۈر\",\"title\":\"كاتەكچە خاسلىقى\",\"cellType\":\"كاتەكچە تىپى\",\"rowSpan\":\"بويىغا چات ئارىسى قۇر سانى\",\"colSpan\":\"توغرىسىغا چات ئارىسى ئىستون سانى\",\"wordWrap\":\"ئۆزلۈكىدىن قۇر قاتلا\",\"hAlign\":\"توغرىسىغا توغرىلا\",\"vAlign\":\"بويىغا توغرىلا\",\"alignBaseline\":\"ئاساسىي سىزىق\",\"bgColor\":\"تەگلىك رەڭگى\",\"borderColor\":\"گىرۋەك رەڭگى\",\"data\":\"سانلىق مەلۇمات\",\"header\":\"جەدۋەل باشى\",\"yes\":\"ھەئە\",\"no\":\"ياق\",\"invalidWidth\":\"كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ\",\"invalidHeight\":\"كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ\",\"invalidRowSpan\":\"قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ \",\"invalidColSpan\":\"ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ\",\"chooseColor\":\"تاللاڭ\"},\"cellPad\":\"يان ئارىلىق\",\"cellSpace\":\"ئارىلىق\",\"column\":{\"menu\":\"ئىستون\",\"insertBefore\":\"سولغا ئىستون قىستۇر\",\"insertAfter\":\"ئوڭغا ئىستون قىستۇر\",\"deleteColumn\":\"ئىستون ئۆچۈر\"},\"columns\":\"ئىستون سانى\",\"deleteTable\":\"جەدۋەل ئۆچۈر\",\"headers\":\"ماۋزۇ كاتەكچە\",\"headersBoth\":\"بىرىنچى ئىستون ۋە بىرىنچى قۇر\",\"headersColumn\":\"بىرىنچى ئىستون\",\"headersNone\":\"يوق\",\"headersRow\":\"بىرىنچى قۇر\",\"invalidBorder\":\"گىرۋەك توملۇقى چوقۇم سان بولىدۇ\",\"invalidCellPadding\":\"كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ\",\"invalidCellSpacing\":\"كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ\",\"invalidCols\":\"بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ\",\"invalidHeight\":\"جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ\",\"invalidRows\":\"بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ\",\"invalidWidth\":\"جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ\",\"menu\":\"جەدۋەل خاسلىقى\",\"row\":{\"menu\":\"قۇر\",\"insertBefore\":\"ئۈستىگە قۇر قىستۇر\",\"insertAfter\":\"ئاستىغا قۇر قىستۇر\",\"deleteRow\":\"قۇر ئۆچۈر\"},\"rows\":\"قۇر سانى\",\"summary\":\"ئۈزۈندە\",\"title\":\"جەدۋەل خاسلىقى\",\"toolbar\":\"جەدۋەل\",\"widthPc\":\"پىرسەنت\",\"widthPx\":\"پىكسېل\",\"widthUnit\":\"كەڭلىك بىرلىكى\"},\"undo\":{\"redo\":\"قايتىلا \",\"undo\":\"يېنىۋال\"},\"wsc\":{\"btnIgnore\":\"پەرۋا قىلما\",\"btnIgnoreAll\":\"ھەممىگە پەرۋا قىلما\",\"btnReplace\":\"ئالماشتۇر\",\"btnReplaceAll\":\"ھەممىنى ئالماشتۇر\",\"btnUndo\":\"يېنىۋال\",\"changeTo\":\"ئۆزگەرت\",\"errorLoading\":\"لازىملىق مۇلازىمېتىرنى يۈكلىگەندە خاتالىق كۆرۈلدى: %s.\",\"ieSpellDownload\":\"ئىملا تەكشۈرۈش قىستۇرمىسى تېخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟\",\"manyChanges\":\"ئىملا تەكشۈرۈش تامام: %1  سۆزنى ئۆزگەرتتى\",\"noChanges\":\"ئىملا تەكشۈرۈش تامام: ھېچقانداق سۆزنى ئۆزگەرتمىدى\",\"noMispell\":\"ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى\",\"noSuggestions\":\"-تەكلىپ يوق-\",\"notAvailable\":\"كەچۈرۈڭ، مۇلازىمېتىرنى ۋاقتىنچە ئىشلەتكىلى بولمايدۇ\",\"notInDic\":\"لۇغەتتە يوق\",\"oneChange\":\"ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى\",\"progress\":\"ئىملا تەكشۈرۈۋاتىدۇ…\",\"title\":\"ئىملا تەكشۈر\",\"toolbar\":\"ئىملا تەكشۈر\"}};"
  },
  {
    "path": "assets/ckeditor/lang/uk.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['uk']={\"editor\":\"Текстовий редактор\",\"editorPanel\":\"Панель текстового редактора\",\"common\":{\"editorHelp\":\"натисніть ALT 0 для довідки\",\"browseServer\":\"Огляд Сервера\",\"url\":\"URL\",\"protocol\":\"Протокол\",\"upload\":\"Надіслати\",\"uploadSubmit\":\"Надіслати на сервер\",\"image\":\"Зображення\",\"flash\":\"Flash\",\"form\":\"Форма\",\"checkbox\":\"Галочка\",\"radio\":\"Кнопка вибору\",\"textField\":\"Текстове поле\",\"textarea\":\"Текстова область\",\"hiddenField\":\"Приховане поле\",\"button\":\"Кнопка\",\"select\":\"Список\",\"imageButton\":\"Кнопка із зображенням\",\"notSet\":\"<не визначено>\",\"id\":\"Ідентифікатор\",\"name\":\"Ім'я\",\"langDir\":\"Напрямок мови\",\"langDirLtr\":\"Зліва направо (LTR)\",\"langDirRtl\":\"Справа наліво (RTL)\",\"langCode\":\"Код мови\",\"longDescr\":\"Довгий опис URL\",\"cssClass\":\"Клас CSS\",\"advisoryTitle\":\"Заголовок\",\"cssStyle\":\"Стиль CSS\",\"ok\":\"ОК\",\"cancel\":\"Скасувати\",\"close\":\"Закрити\",\"preview\":\"Попередній перегляд\",\"resize\":\"Потягніть для зміни розмірів\",\"generalTab\":\"Основне\",\"advancedTab\":\"Додаткове\",\"validateNumberFailed\":\"Значення не є цілим числом.\",\"confirmNewPage\":\"Всі незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?\",\"confirmCancel\":\"Деякі опції змінено. Закрити вікно без збереження змін?\",\"options\":\"Опції\",\"target\":\"Ціль\",\"targetNew\":\"Нове вікно (_blank)\",\"targetTop\":\"Поточне вікно (_top)\",\"targetSelf\":\"Поточний фрейм/вікно (_self)\",\"targetParent\":\"Батьківський фрейм/вікно (_parent)\",\"langDirLTR\":\"Зліва направо (LTR)\",\"langDirRTL\":\"Справа наліво (RTL)\",\"styles\":\"Стиль CSS\",\"cssClasses\":\"Клас CSS\",\"width\":\"Ширина\",\"height\":\"Висота\",\"align\":\"Вирівнювання\",\"alignLeft\":\"По лівому краю\",\"alignRight\":\"По правому краю\",\"alignCenter\":\"По центру\",\"alignJustify\":\"По ширині\",\"alignTop\":\"По верхньому краю\",\"alignMiddle\":\"По середині\",\"alignBottom\":\"По нижньому краю\",\"alignNone\":\"Нема\",\"invalidValue\":\"Невірне значення.\",\"invalidHeight\":\"Висота повинна бути цілим числом.\",\"invalidWidth\":\"Ширина повинна бути цілим числом.\",\"invalidCssLength\":\"Значення, вказане для \\\"%1\\\" в полі повинно бути позитивним числом або без дійсного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt або pc).\",\"invalidHtmlLength\":\"Значення, вказане для \\\"%1\\\" в полі повинно бути позитивним числом або без дійсного виміру HTML блоку (px або %).\",\"invalidInlineStyle\":\"Значення, вказане для вбудованого стилю повинне складатися з одного чи кількох кортежів у форматі \\\"ім'я : значення\\\", розділених крапкою з комою.\",\"cssLengthTooltip\":\"Введіть номер значення в пікселях або число з дійсною одиниці CSS (px, %, in, cm, mm, em, ex, pt або pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, не доступне</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. Всі права застережено.\",\"dlgTitle\":\"Про CKEditor\",\"help\":\"Перевірте $1 для допомоги.\",\"moreInfo\":\"Щодо інформації з ліцензування завітайте на наш сайт:\",\"title\":\"Про CKEditor\",\"userGuide\":\"Інструкція Користувача для CKEditor\"},\"basicstyles\":{\"bold\":\"Жирний\",\"italic\":\"Курсив\",\"strike\":\"Закреслений\",\"subscript\":\"Нижній індекс\",\"superscript\":\"Верхній індекс\",\"underline\":\"Підкреслений\"},\"bidi\":{\"ltr\":\"Напрямок тексту зліва направо\",\"rtl\":\"Напрямок тексту справа наліво\"},\"blockquote\":{\"toolbar\":\"Цитата\"},\"clipboard\":{\"copy\":\"Копіювати\",\"copyError\":\"Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).\",\"cut\":\"Вирізати\",\"cutError\":\"Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)\",\"paste\":\"Вставити\",\"pasteArea\":\"Область вставки\",\"pasteMsg\":\"Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.\",\"securityMsg\":\"Редактор не може отримати прямий доступ до буферу обміну у зв'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.\",\"title\":\"Вставити\"},\"button\":{\"selectedLabel\":\"%1 (Вибрано)\"},\"colorbutton\":{\"auto\":\"Авто\",\"bgColorTitle\":\"Колір фону\",\"colors\":{\"000\":\"Чорний\",\"800000\":\"Бордовий\",\"8B4513\":\"Коричневий\",\"2F4F4F\":\"Темний сіро-зелений\",\"008080\":\"Морської хвилі\",\"000080\":\"Сливовий\",\"4B0082\":\"Індиго\",\"696969\":\"Темносірий\",\"B22222\":\"Темночервоний\",\"A52A2A\":\"Каштановий\",\"DAA520\":\"Бежевий\",\"006400\":\"Темнозелений\",\"40E0D0\":\"Бірюзовий\",\"0000CD\":\"Темносиній\",\"800080\":\"Пурпурний\",\"808080\":\"Сірий\",\"F00\":\"Червоний\",\"FF8C00\":\"Темнооранжевий\",\"FFD700\":\"Жовтий\",\"008000\":\"Зелений\",\"0FF\":\"Синьо-зелений\",\"00F\":\"Синій\",\"EE82EE\":\"Фіолетовий\",\"A9A9A9\":\"Світлосірий\",\"FFA07A\":\"Рожевий\",\"FFA500\":\"Оранжевий\",\"FFFF00\":\"Яскравожовтий\",\"00FF00\":\"Салатовий\",\"AFEEEE\":\"Світлобірюзовий\",\"ADD8E6\":\"Блакитний\",\"DDA0DD\":\"Світлофіолетовий\",\"D3D3D3\":\"Сріблястий\",\"FFF0F5\":\"Світлорожевий\",\"FAEBD7\":\"Світлооранжевий\",\"FFFFE0\":\"Світложовтий\",\"F0FFF0\":\"Світлозелений\",\"F0FFFF\":\"Світлий синьо-зелений\",\"F0F8FF\":\"Світлоблакитний\",\"E6E6FA\":\"Лавандовий\",\"FFF\":\"Білий\"},\"more\":\"Кольори...\",\"panelTitle\":\"Кольори\",\"textColorTitle\":\"Колір тексту\"},\"colordialog\":{\"clear\":\"Очистити\",\"highlight\":\"Колір, на який вказує курсор\",\"options\":\"Опції кольорів\",\"selected\":\"Обраний колір\",\"title\":\"Обрати колір\"},\"templates\":{\"button\":\"Шаблони\",\"emptyListMsg\":\"(Не знайдено жодного шаблону)\",\"insertOption\":\"Замінити поточний вміст\",\"options\":\"Опції шаблону\",\"selectPromptMsg\":\"Оберіть, будь ласка, шаблон для відкриття в редакторі<br>(поточний зміст буде втрачено):\",\"title\":\"Шаблони змісту\"},\"contextmenu\":{\"options\":\"Опції контекстного меню\"},\"div\":{\"IdInputLabel\":\"Ідентифікатор\",\"advisoryTitleInputLabel\":\"Зміст випливаючої підказки\",\"cssClassInputLabel\":\"Клас CSS\",\"edit\":\"Редагувати блок\",\"inlineStyleInputLabel\":\"Вписаний стиль\",\"langDirLTRLabel\":\"Зліва направо (LTR)\",\"langDirLabel\":\"Напрямок мови\",\"langDirRTLLabel\":\"Справа наліво (RTL)\",\"languageCodeInputLabel\":\"Код мови\",\"remove\":\"Видалити блок\",\"styleSelectLabel\":\"Стиль CSS\",\"title\":\"Створити блок-контейнер\",\"toolbar\":\"Створити блок-контейнер\"},\"toolbar\":{\"toolbarCollapse\":\"Згорнути панель інструментів\",\"toolbarExpand\":\"Розгорнути панель інструментів\",\"toolbarGroups\":{\"document\":\"Документ\",\"clipboard\":\"Буфер обміну / Скасувати\",\"editing\":\"Редагування\",\"forms\":\"Форми\",\"basicstyles\":\"Основний Стиль\",\"paragraph\":\"Параграф\",\"links\":\"Посилання\",\"insert\":\"Вставити\",\"styles\":\"Стилі\",\"colors\":\"Кольори\",\"tools\":\"Інструменти\"},\"toolbars\":\"Панель інструментів редактора\"},\"elementspath\":{\"eleLabel\":\"Шлях\",\"eleTitle\":\"%1 елемент\"},\"find\":{\"find\":\"Пошук\",\"findOptions\":\"Параметри Пошуку\",\"findWhat\":\"Шукати:\",\"matchCase\":\"Враховувати регістр\",\"matchCyclic\":\"Циклічна заміна\",\"matchWord\":\"Збіг цілих слів\",\"notFoundMsg\":\"Вказаний текст не знайдено.\",\"replace\":\"Заміна\",\"replaceAll\":\"Замінити все\",\"replaceSuccessMsg\":\"%1 співпадінь(ня) замінено.\",\"replaceWith\":\"Замінити на:\",\"title\":\"Знайти і замінити\"},\"fakeobjects\":{\"anchor\":\"Якір\",\"flash\":\"Flash-анімація\",\"hiddenfield\":\"Приховані Поля\",\"iframe\":\"IFrame\",\"unknown\":\"Невідомий об'єкт\"},\"flash\":{\"access\":\"Доступ до скрипта\",\"accessAlways\":\"Завжди\",\"accessNever\":\"Ніколи\",\"accessSameDomain\":\"З того ж домена\",\"alignAbsBottom\":\"По нижньому краю (abs)\",\"alignAbsMiddle\":\"По середині (abs)\",\"alignBaseline\":\"По базовій лінії\",\"alignTextTop\":\"Текст по верхньому краю\",\"bgcolor\":\"Колір фону\",\"chkFull\":\"Дозволити повноекранний перегляд\",\"chkLoop\":\"Циклічно\",\"chkMenu\":\"Дозволити меню Flash\",\"chkPlay\":\"Автопрогравання\",\"flashvars\":\"Змінні Flash\",\"hSpace\":\"Гориз. відступ\",\"properties\":\"Властивості Flash\",\"propertiesTab\":\"Властивості\",\"quality\":\"Якість\",\"qualityAutoHigh\":\"Автом. відмінна\",\"qualityAutoLow\":\"Автом. низька\",\"qualityBest\":\"Відмінна\",\"qualityHigh\":\"Висока\",\"qualityLow\":\"Низька\",\"qualityMedium\":\"Середня\",\"scale\":\"Масштаб\",\"scaleAll\":\"Показати все\",\"scaleFit\":\"Поч. розмір\",\"scaleNoBorder\":\"Без рамки\",\"title\":\"Властивості Flash\",\"vSpace\":\"Верт. відступ\",\"validateHSpace\":\"Гориз. відступ повинен бути цілим числом.\",\"validateSrc\":\"URL посилання не може бути порожнім.\",\"validateVSpace\":\"Верт. відступ повинен бути цілим числом.\",\"windowMode\":\"Віконний режим\",\"windowModeOpaque\":\"Непрозорість\",\"windowModeTransparent\":\"Прозорість\",\"windowModeWindow\":\"Вікно\"},\"font\":{\"fontSize\":{\"label\":\"Розмір\",\"voiceLabel\":\"Розмір шрифту\",\"panelTitle\":\"Розмір\"},\"label\":\"Шрифт\",\"panelTitle\":\"Шрифт\",\"voiceLabel\":\"Шрифт\"},\"forms\":{\"button\":{\"title\":\"Властивості кнопки\",\"text\":\"Значення\",\"type\":\"Тип\",\"typeBtn\":\"Кнопка (button)\",\"typeSbm\":\"Надіслати (submit)\",\"typeRst\":\"Очистити (reset)\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Властивості галочки\",\"radioTitle\":\"Властивості кнопки вибору\",\"value\":\"Значення\",\"selected\":\"Обрана\",\"required\":\"Обов’язкове поле\"},\"form\":{\"title\":\"Властивості форми\",\"menu\":\"Властивості форми\",\"action\":\"Дія\",\"method\":\"Метод\",\"encoding\":\"Кодування\"},\"hidden\":{\"title\":\"Властивості прихованого поля\",\"name\":\"Ім'я\",\"value\":\"Значення\"},\"select\":{\"title\":\"Властивості списку\",\"selectInfo\":\"Інфо\",\"opAvail\":\"Доступні варіанти\",\"value\":\"Значення\",\"size\":\"Кількість\",\"lines\":\"видимих позицій у списку\",\"chkMulti\":\"Список з мультивибором\",\"required\":\"Обов’язкове поле\",\"opText\":\"Текст\",\"opValue\":\"Значення\",\"btnAdd\":\"Добавити\",\"btnModify\":\"Змінити\",\"btnUp\":\"Вгору\",\"btnDown\":\"Вниз\",\"btnSetValue\":\"Встановити як обране значення\",\"btnDelete\":\"Видалити\"},\"textarea\":{\"title\":\"Властивості текстової області\",\"cols\":\"Стовбці\",\"rows\":\"Рядки\"},\"textfield\":{\"title\":\"Властивості текстового поля\",\"name\":\"Ім'я\",\"value\":\"Значення\",\"charWidth\":\"Ширина\",\"maxChars\":\"Макс. к-ть символів\",\"required\":\"Обов’язкове поле\",\"type\":\"Тип\",\"typeText\":\"Текст\",\"typePass\":\"Пароль\",\"typeEmail\":\"Пошта\",\"typeSearch\":\"Пошук\",\"typeTel\":\"Мобільний\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Форматування\",\"panelTitle\":\"Форматування параграфа\",\"tag_address\":\"Адреса\",\"tag_div\":\"Нормальний (div)\",\"tag_h1\":\"Заголовок 1\",\"tag_h2\":\"Заголовок 2\",\"tag_h3\":\"Заголовок 3\",\"tag_h4\":\"Заголовок 4\",\"tag_h5\":\"Заголовок 5\",\"tag_h6\":\"Заголовок 6\",\"tag_p\":\"Нормальний\",\"tag_pre\":\"Форматований\"},\"horizontalrule\":{\"toolbar\":\"Горизонтальна лінія\"},\"iframe\":{\"border\":\"Показати рамки фрейму\",\"noUrl\":\"Будь ласка введіть URL посилання для IFrame\",\"scrolling\":\"Увімкнути прокрутку\",\"title\":\"Налаштування для IFrame\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"Альтернативний текст\",\"border\":\"Рамка\",\"btnUpload\":\"Надіслати на сервер\",\"button2Img\":\"Бажаєте перетворити обрану кнопку-зображення на просте зображення?\",\"hSpace\":\"Гориз. відступ\",\"img2Button\":\"Бажаєте перетворити обране зображення на кнопку-зображення?\",\"infoTab\":\"Інформація про зображення\",\"linkTab\":\"Посилання\",\"lockRatio\":\"Зберегти пропорції\",\"menu\":\"Властивості зображення\",\"resetSize\":\"Очистити поля розмірів\",\"title\":\"Властивості зображення\",\"titleButton\":\"Властивості кнопки із зображенням\",\"upload\":\"Надіслати\",\"urlMissing\":\"Вкажіть URL зображення.\",\"vSpace\":\"Верт. відступ\",\"validateBorder\":\"Ширина рамки повинна бути цілим числом.\",\"validateHSpace\":\"Гориз. відступ повинен бути цілим числом.\",\"validateVSpace\":\"Верт. відступ повинен бути цілим числом.\"},\"indent\":{\"indent\":\"Збільшити відступ\",\"outdent\":\"Зменшити відступ\"},\"smiley\":{\"options\":\"Опції смайликів\",\"title\":\"Вставити смайлик\",\"toolbar\":\"Смайлик\"},\"justify\":{\"block\":\"По ширині\",\"center\":\"По центру\",\"left\":\"По лівому краю\",\"right\":\"По правому краю\"},\"language\":{\"button\":\"Установити мову\",\"remove\":\"Вилучити мову\"},\"link\":{\"acccessKey\":\"Гаряча клавіша\",\"advanced\":\"Додаткове\",\"advisoryContentType\":\"Тип вмісту\",\"advisoryTitle\":\"Заголовок\",\"anchor\":{\"toolbar\":\"Вставити/Редагувати якір\",\"menu\":\"Властивості якоря\",\"title\":\"Властивості якоря\",\"name\":\"Ім'я якоря\",\"errorName\":\"Будь ласка, вкажіть ім'я якоря\",\"remove\":\"Прибрати якір\"},\"anchorId\":\"За ідентифікатором елементу\",\"anchorName\":\"За ім'ям елементу\",\"charset\":\"Кодування\",\"cssClasses\":\"Клас CSS\",\"emailAddress\":\"Адреса ел. пошти\",\"emailBody\":\"Тіло повідомлення\",\"emailSubject\":\"Тема листа\",\"id\":\"Ідентифікатор\",\"info\":\"Інформація посилання\",\"langCode\":\"Код мови\",\"langDir\":\"Напрямок мови\",\"langDirLTR\":\"Зліва направо (LTR)\",\"langDirRTL\":\"Справа наліво (RTL)\",\"menu\":\"Вставити посилання\",\"name\":\"Ім'я\",\"noAnchors\":\"(В цьому документі немає якорів)\",\"noEmail\":\"Будь ласка, вкажіть адрес ел. пошти\",\"noUrl\":\"Будь ласка, вкажіть URL посилання\",\"other\":\"<інший>\",\"popupDependent\":\"Залежний (Netscape)\",\"popupFeatures\":\"Властивості випливаючого вікна\",\"popupFullScreen\":\"Повний екран (IE)\",\"popupLeft\":\"Позиція зліва\",\"popupLocationBar\":\"Панель локації\",\"popupMenuBar\":\"Панель меню\",\"popupResizable\":\"Масштабоване\",\"popupScrollBars\":\"Стрічки прокрутки\",\"popupStatusBar\":\"Рядок статусу\",\"popupToolbar\":\"Панель інструментів\",\"popupTop\":\"Позиція зверху\",\"rel\":\"Зв'язок\",\"selectAnchor\":\"Оберіть якір\",\"styles\":\"Стиль CSS\",\"tabIndex\":\"Послідовність переходу\",\"target\":\"Ціль\",\"targetFrame\":\"<фрейм>\",\"targetFrameName\":\"Ім'я цільового фрейму\",\"targetPopup\":\"<випливаюче вікно>\",\"targetPopupName\":\"Ім'я випливаючого вікна\",\"title\":\"Посилання\",\"toAnchor\":\"Якір на цю сторінку\",\"toEmail\":\"Ел. пошта\",\"toUrl\":\"URL\",\"toolbar\":\"Вставити/Редагувати посилання\",\"type\":\"Тип посилання\",\"unlink\":\"Видалити посилання\",\"upload\":\"Надіслати\"},\"list\":{\"bulletedlist\":\"Маркірований список\",\"numberedlist\":\"Нумерований список\"},\"liststyle\":{\"armenian\":\"Вірменська нумерація\",\"bulletedTitle\":\"Опції маркованого списку\",\"circle\":\"Кільце\",\"decimal\":\"Десяткові (1, 2, 3 і т.д.)\",\"decimalLeadingZero\":\"Десяткові з нулем (01, 02, 03 і т.д.)\",\"disc\":\"Кружечок\",\"georgian\":\"Грузинська нумерація (an, ban, gan і т.д.)\",\"lowerAlpha\":\"Малі лат. букви (a, b, c, d, e і т.д.)\",\"lowerGreek\":\"Малі гр. букви (альфа, бета, гамма і т.д.)\",\"lowerRoman\":\"Малі римські (i, ii, iii, iv, v і т.д.)\",\"none\":\"Нема\",\"notset\":\"<не вказано>\",\"numberedTitle\":\"Опції нумерованого списку\",\"square\":\"Квадратик\",\"start\":\"Почати з...\",\"type\":\"Тип\",\"upperAlpha\":\"Великі лат. букви (A, B, C, D, E і т.д.)\",\"upperRoman\":\"Великі римські (I, II, III, IV, V і т.д.)\",\"validateStartNumber\":\"Початковий номер списку повинен бути цілим числом.\"},\"magicline\":{\"title\":\"Вставити абзац\"},\"maximize\":{\"maximize\":\"Максимізувати\",\"minimize\":\"Мінімізувати\"},\"newpage\":{\"toolbar\":\"Нова сторінка\"},\"pagebreak\":{\"alt\":\"Розрив Сторінки\",\"toolbar\":\"Вставити розрив сторінки\"},\"pastetext\":{\"button\":\"Вставити тільки текст\",\"title\":\"Вставити тільки текст\"},\"pastefromword\":{\"confirmCleanup\":\"Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?\",\"error\":\"Неможливо очистити форматування через внутрішню помилку.\",\"title\":\"Вставити з Word\",\"toolbar\":\"Вставити з Word\"},\"preview\":{\"preview\":\"Попередній перегляд\"},\"print\":{\"toolbar\":\"Друк\"},\"removeformat\":{\"toolbar\":\"Видалити форматування\"},\"save\":{\"toolbar\":\"Зберегти\"},\"selectall\":{\"toolbar\":\"Виділити все\"},\"showblocks\":{\"toolbar\":\"Показувати блоки\"},\"sourcearea\":{\"toolbar\":\"Джерело\"},\"specialchar\":{\"options\":\"Опції\",\"title\":\"Оберіть спеціальний символ\",\"toolbar\":\"Спеціальний символ\"},\"scayt\":{\"btn_about\":\"Про SCAYT\",\"btn_dictionaries\":\"Словники\",\"btn_disable\":\"Вимкнути SCAYT\",\"btn_enable\":\"Ввімкнути SCAYT\",\"btn_langs\":\"Мови\",\"btn_options\":\"Опції\",\"text_title\":\"Перефірка орфографії по мірі набору\"},\"stylescombo\":{\"label\":\"Стиль\",\"panelTitle\":\"Стилі форматування\",\"panelTitle1\":\"Блочні стилі\",\"panelTitle2\":\"Рядкові стилі\",\"panelTitle3\":\"Об'єктні стилі\"},\"table\":{\"border\":\"Розмір рамки\",\"caption\":\"Заголовок таблиці\",\"cell\":{\"menu\":\"Комірки\",\"insertBefore\":\"Вставити комірку перед\",\"insertAfter\":\"Вставити комірку після\",\"deleteCell\":\"Видалити комірки\",\"merge\":\"Об'єднати комірки\",\"mergeRight\":\"Об'єднати справа\",\"mergeDown\":\"Об'єднати донизу\",\"splitHorizontal\":\"Розділити комірку по горизонталі\",\"splitVertical\":\"Розділити комірку по вертикалі\",\"title\":\"Властивості комірки\",\"cellType\":\"Тип комірки\",\"rowSpan\":\"Об'єднання рядків\",\"colSpan\":\"Об'єднання стовпців\",\"wordWrap\":\"Автоперенесення тексту\",\"hAlign\":\"Гориз. вирівнювання\",\"vAlign\":\"Верт. вирівнювання\",\"alignBaseline\":\"По базовій лінії\",\"bgColor\":\"Колір фону\",\"borderColor\":\"Колір рамки\",\"data\":\"Дані\",\"header\":\"Заголовок\",\"yes\":\"Так\",\"no\":\"Ні\",\"invalidWidth\":\"Ширина комірки повинна бути цілим числом.\",\"invalidHeight\":\"Висота комірки повинна бути цілим числом.\",\"invalidRowSpan\":\"Кількість об'єднуваних рядків повинна бути цілим числом.\",\"invalidColSpan\":\"Кількість об'єднуваних стовбців повинна бути цілим числом.\",\"chooseColor\":\"Обрати\"},\"cellPad\":\"Внутр. відступ\",\"cellSpace\":\"Проміжок\",\"column\":{\"menu\":\"Стовбці\",\"insertBefore\":\"Вставити стовбець перед\",\"insertAfter\":\"Вставити стовбець після\",\"deleteColumn\":\"Видалити стовбці\"},\"columns\":\"Стовбці\",\"deleteTable\":\"Видалити таблицю\",\"headers\":\"Заголовки стовбців/рядків\",\"headersBoth\":\"Стовбці і рядки\",\"headersColumn\":\"Стовбці\",\"headersNone\":\"Без заголовків\",\"headersRow\":\"Рядки\",\"invalidBorder\":\"Розмір рамки повинен бути цілим числом.\",\"invalidCellPadding\":\"Внутр. відступ комірки повинен бути цілим числом.\",\"invalidCellSpacing\":\"Проміжок між комірками повинен бути цілим числом.\",\"invalidCols\":\"Кількість стовбців повинна бути більшою 0.\",\"invalidHeight\":\"Висота таблиці повинна бути цілим числом.\",\"invalidRows\":\"Кількість рядків повинна бути більшою 0.\",\"invalidWidth\":\"Ширина таблиці повинна бути цілим числом.\",\"menu\":\"Властивості таблиці\",\"row\":{\"menu\":\"Рядки\",\"insertBefore\":\"Вставити рядок перед\",\"insertAfter\":\"Вставити рядок після\",\"deleteRow\":\"Видалити рядки\"},\"rows\":\"Рядки\",\"summary\":\"Детальний опис заголовку таблиці\",\"title\":\"Властивості таблиці\",\"toolbar\":\"Таблиця\",\"widthPc\":\"відсотків\",\"widthPx\":\"пікселів\",\"widthUnit\":\"Одиниці вимір.\"},\"undo\":{\"redo\":\"Повторити\",\"undo\":\"Повернути\"},\"wsc\":{\"btnIgnore\":\"Пропустити\",\"btnIgnoreAll\":\"Пропустити все\",\"btnReplace\":\"Замінити\",\"btnReplaceAll\":\"Замінити все\",\"btnUndo\":\"Назад\",\"changeTo\":\"Замінити на\",\"errorLoading\":\"Помилка завантаження : %s.\",\"ieSpellDownload\":\"Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?\",\"manyChanges\":\"Перевірку орфографії завершено: 1% слів(ова) змінено\",\"noChanges\":\"Перевірку орфографії завершено: жодне слово не змінено\",\"noMispell\":\"Перевірку орфографії завершено: помилок не знайдено\",\"noSuggestions\":\"- немає варіантів -\",\"notAvailable\":\"Вибачте, але сервіс наразі недоступний.\",\"notInDic\":\"Немає в словнику\",\"oneChange\":\"Перевірку орфографії завершено: змінено одне слово\",\"progress\":\"Виконується перевірка орфографії...\",\"title\":\"Перевірка орфографії\",\"toolbar\":\"Перевірити орфографію\"}};"
  },
  {
    "path": "assets/ckeditor/lang/vi.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['vi']={\"editor\":\"Bộ soạn thảo văn bản có định dạng\",\"editorPanel\":\"Bảng điều khiển Rich Text Editor\",\"common\":{\"editorHelp\":\"Nhấn ALT + 0 để được giúp đỡ\",\"browseServer\":\"Duyệt máy chủ\",\"url\":\"URL\",\"protocol\":\"Giao thức\",\"upload\":\"Tải lên\",\"uploadSubmit\":\"Tải lên máy chủ\",\"image\":\"Hình ảnh\",\"flash\":\"Flash\",\"form\":\"Biểu mẫu\",\"checkbox\":\"Nút kiểm\",\"radio\":\"Nút chọn\",\"textField\":\"Trường văn bản\",\"textarea\":\"Vùng văn bản\",\"hiddenField\":\"Trường ẩn\",\"button\":\"Nút\",\"select\":\"Ô chọn\",\"imageButton\":\"Nút hình ảnh\",\"notSet\":\"<không thiết lập>\",\"id\":\"Định danh\",\"name\":\"Tên\",\"langDir\":\"Hướng ngôn ngữ\",\"langDirLtr\":\"Trái sang phải (LTR)\",\"langDirRtl\":\"Phải sang trái (RTL)\",\"langCode\":\"Mã ngôn ngữ\",\"longDescr\":\"Mô tả URL\",\"cssClass\":\"Lớp Stylesheet\",\"advisoryTitle\":\"Nhan đề hướng dẫn\",\"cssStyle\":\"Kiểu \",\"ok\":\"Đồng ý\",\"cancel\":\"Bỏ qua\",\"close\":\"Đóng\",\"preview\":\"Xem trước\",\"resize\":\"Kéo rê để thay đổi kích cỡ\",\"generalTab\":\"Tab chung\",\"advancedTab\":\"Tab mở rộng\",\"validateNumberFailed\":\"Giá trị này không phải là số.\",\"confirmNewPage\":\"Mọi thay đổi không được lưu lại, nội dung này sẽ bị mất. Bạn có chắc chắn muốn tải một trang mới?\",\"confirmCancel\":\"Một vài tùy chọn đã bị thay đổi. Bạn có chắc chắn muốn đóng hộp thoại?\",\"options\":\"Tùy chọn\",\"target\":\"Đích đến\",\"targetNew\":\"Cửa sổ mới (_blank)\",\"targetTop\":\"Cửa sổ trên cùng (_top)\",\"targetSelf\":\"Tại trang (_self)\",\"targetParent\":\"Cửa sổ cha (_parent)\",\"langDirLTR\":\"Trái sang phải (LTR)\",\"langDirRTL\":\"Phải sang trái (RTL)\",\"styles\":\"Kiểu\",\"cssClasses\":\"Lớp CSS\",\"width\":\"Chiều rộng\",\"height\":\"Chiều cao\",\"align\":\"Vị trí\",\"alignLeft\":\"Trái\",\"alignRight\":\"Phải\",\"alignCenter\":\"Giữa\",\"alignJustify\":\"Sắp chữ\",\"alignTop\":\"Trên\",\"alignMiddle\":\"Giữa\",\"alignBottom\":\"Dưới\",\"alignNone\":\"Không\",\"invalidValue\":\"Giá trị không hợp lệ.\",\"invalidHeight\":\"Chiều cao phải là số nguyên.\",\"invalidWidth\":\"Chiều rộng phải là số nguyên.\",\"invalidCssLength\":\"Giá trị quy định cho trường \\\"%1\\\" phải là một số dương có hoặc không có một đơn vị đo CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).\",\"invalidHtmlLength\":\"Giá trị quy định cho trường \\\"%1\\\" phải là một số dương có hoặc không có một đơn vị đo HTML hợp lệ (px hoặc %).\",\"invalidInlineStyle\":\"Giá trị quy định cho kiểu nội tuyến phải bao gồm một hoặc nhiều dữ liệu với định dạng \\\"tên:giá trị\\\", cách nhau bằng dấu chấm phẩy.\",\"cssLengthTooltip\":\"Nhập một giá trị theo pixel hoặc một số với một đơn vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">, không có</span>\"},\"about\":{\"copy\":\"Bản quyền &copy; $1. Giữ toàn quyền.\",\"dlgTitle\":\"Thông tin về CKEditor\",\"help\":\"Kiểm tra $1 để được giúp đỡ.\",\"moreInfo\":\"Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:\",\"title\":\"Thông tin về CKEditor\",\"userGuide\":\"Hướng dẫn sử dụng CKEditor\"},\"basicstyles\":{\"bold\":\"Đậm\",\"italic\":\"Nghiêng\",\"strike\":\"Gạch xuyên ngang\",\"subscript\":\"Chỉ số dưới\",\"superscript\":\"Chỉ số trên\",\"underline\":\"Gạch chân\"},\"bidi\":{\"ltr\":\"Văn bản hướng từ trái sang phải\",\"rtl\":\"Văn bản hướng từ phải sang trái\"},\"blockquote\":{\"toolbar\":\"Khối trích dẫn\"},\"clipboard\":{\"copy\":\"Sao chép\",\"copyError\":\"Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).\",\"cut\":\"Cắt\",\"cutError\":\"Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).\",\"paste\":\"Dán\",\"pasteArea\":\"Khu vực dán\",\"pasteMsg\":\"Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.\",\"securityMsg\":\"Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.\",\"title\":\"Dán\"},\"button\":{\"selectedLabel\":\"%1 (Đã chọn)\"},\"colorbutton\":{\"auto\":\"Tự động\",\"bgColorTitle\":\"Màu nền\",\"colors\":{\"000\":\"Đen\",\"800000\":\"Maroon\",\"8B4513\":\"Saddle Brown\",\"2F4F4F\":\"Dark Slate Gray\",\"008080\":\"Teal\",\"000080\":\"Navy\",\"4B0082\":\"Indigo\",\"696969\":\"Dark Gray\",\"B22222\":\"Fire Brick\",\"A52A2A\":\"Nâu\",\"DAA520\":\"Golden Rod\",\"006400\":\"Dark Green\",\"40E0D0\":\"Turquoise\",\"0000CD\":\"Medium Blue\",\"800080\":\"Purple\",\"808080\":\"Xám\",\"F00\":\"Đỏ\",\"FF8C00\":\"Dark Orange\",\"FFD700\":\"Vàng\",\"008000\":\"Xanh lá cây\",\"0FF\":\"Cyan\",\"00F\":\"Xanh da trời\",\"EE82EE\":\"Tím\",\"A9A9A9\":\"Xám tối\",\"FFA07A\":\"Light Salmon\",\"FFA500\":\"Màu cam\",\"FFFF00\":\"Vàng\",\"00FF00\":\"Lime\",\"AFEEEE\":\"Pale Turquoise\",\"ADD8E6\":\"Light Blue\",\"DDA0DD\":\"Plum\",\"D3D3D3\":\"Light Grey\",\"FFF0F5\":\"Lavender Blush\",\"FAEBD7\":\"Antique White\",\"FFFFE0\":\"Light Yellow\",\"F0FFF0\":\"Honeydew\",\"F0FFFF\":\"Azure\",\"F0F8FF\":\"Alice Blue\",\"E6E6FA\":\"Lavender\",\"FFF\":\"Trắng\"},\"more\":\"Màu khác...\",\"panelTitle\":\"Màu sắc\",\"textColorTitle\":\"Màu chữ\"},\"colordialog\":{\"clear\":\"Xóa bỏ\",\"highlight\":\"Màu chọn\",\"options\":\"Tùy chọn màu\",\"selected\":\"Màu đã chọn\",\"title\":\"Chọn màu\"},\"templates\":{\"button\":\"Mẫu dựng sẵn\",\"emptyListMsg\":\"(Không có mẫu dựng sẵn nào được định nghĩa)\",\"insertOption\":\"Thay thế nội dung hiện tại\",\"options\":\"Tùy chọn mẫu dựng sẵn\",\"selectPromptMsg\":\"Hãy chọn mẫu dựng sẵn để mở trong trình biên tập<br>(nội dung hiện tại sẽ bị mất):\",\"title\":\"Nội dung Mẫu dựng sẵn\"},\"contextmenu\":{\"options\":\"Tùy chọn menu bổ xung\"},\"div\":{\"IdInputLabel\":\"Định danh (id)\",\"advisoryTitleInputLabel\":\"Nhan đề hướng dẫn\",\"cssClassInputLabel\":\"Các lớp CSS\",\"edit\":\"Chỉnh sửa\",\"inlineStyleInputLabel\":\"Kiểu nội dòng\",\"langDirLTRLabel\":\"Trái sang phải (LTR)\",\"langDirLabel\":\"Hướng ngôn ngữ\",\"langDirRTLLabel\":\"Phải qua trái (RTL)\",\"languageCodeInputLabel\":\"Mã ngôn ngữ\",\"remove\":\"Xóa bỏ\",\"styleSelectLabel\":\"Kiểu (style)\",\"title\":\"Tạo khối các thành phần\",\"toolbar\":\"Tạo khối các thành phần\"},\"toolbar\":{\"toolbarCollapse\":\"Thu gọn thanh công cụ\",\"toolbarExpand\":\"Mở rộng thnah công cụ\",\"toolbarGroups\":{\"document\":\"Tài liệu\",\"clipboard\":\"Clipboard/Undo\",\"editing\":\"Chỉnh sửa\",\"forms\":\"Bảng biểu\",\"basicstyles\":\"Kiểu cơ bản\",\"paragraph\":\"Đoạn\",\"links\":\"Liên kết\",\"insert\":\"Chèn\",\"styles\":\"Kiểu\",\"colors\":\"Màu sắc\",\"tools\":\"Công cụ\"},\"toolbars\":\"Thanh công cụ\"},\"elementspath\":{\"eleLabel\":\"Nhãn thành phần\",\"eleTitle\":\"%1 thành phần\"},\"find\":{\"find\":\"Tìm kiếm\",\"findOptions\":\"Tìm tùy chọn\",\"findWhat\":\"Tìm chuỗi:\",\"matchCase\":\"Phân biệt chữ hoa/thường\",\"matchCyclic\":\"Giống một phần\",\"matchWord\":\"Giống toàn bộ từ\",\"notFoundMsg\":\"Không tìm thấy chuỗi cần tìm.\",\"replace\":\"Thay thế\",\"replaceAll\":\"Thay thế tất cả\",\"replaceSuccessMsg\":\"%1 vị trí đã được thay thế.\",\"replaceWith\":\"Thay bằng:\",\"title\":\"Tìm kiếm và thay thế\"},\"fakeobjects\":{\"anchor\":\"Điểm neo\",\"flash\":\"Flash\",\"hiddenfield\":\"Trường ẩn\",\"iframe\":\"IFrame\",\"unknown\":\"Đối tượng không rõ ràng\"},\"flash\":{\"access\":\"Truy cập mã\",\"accessAlways\":\"Luôn luôn\",\"accessNever\":\"Không bao giờ\",\"accessSameDomain\":\"Cùng tên miền\",\"alignAbsBottom\":\"Dưới tuyệt đối\",\"alignAbsMiddle\":\"Giữa tuyệt đối\",\"alignBaseline\":\"Đường cơ sở\",\"alignTextTop\":\"Phía trên chữ\",\"bgcolor\":\"Màu nền\",\"chkFull\":\"Cho phép toàn màn hình\",\"chkLoop\":\"Lặp\",\"chkMenu\":\"Cho phép bật menu của Flash\",\"chkPlay\":\"Tự động chạy\",\"flashvars\":\"Các biến số dành cho Flash\",\"hSpace\":\"Khoảng đệm ngang\",\"properties\":\"Thuộc tính Flash\",\"propertiesTab\":\"Thuộc tính\",\"quality\":\"Chất lượng\",\"qualityAutoHigh\":\"Cao tự động\",\"qualityAutoLow\":\"Thấp tự động\",\"qualityBest\":\"Tốt nhất\",\"qualityHigh\":\"Cao\",\"qualityLow\":\"Thấp\",\"qualityMedium\":\"Trung bình\",\"scale\":\"Tỷ lệ\",\"scaleAll\":\"Hiển thị tất cả\",\"scaleFit\":\"Vừa vặn\",\"scaleNoBorder\":\"Không đường viền\",\"title\":\"Thuộc tính Flash\",\"vSpace\":\"Khoảng đệm dọc\",\"validateHSpace\":\"Khoảng đệm ngang phải là số nguyên.\",\"validateSrc\":\"Hãy đưa vào đường dẫn liên kết\",\"validateVSpace\":\"Khoảng đệm dọc phải là số nguyên.\",\"windowMode\":\"Chế độ cửa sổ\",\"windowModeOpaque\":\"Mờ đục\",\"windowModeTransparent\":\"Trong suốt\",\"windowModeWindow\":\"Cửa sổ\"},\"font\":{\"fontSize\":{\"label\":\"Cỡ chữ\",\"voiceLabel\":\"Kích cỡ phông\",\"panelTitle\":\"Cỡ chữ\"},\"label\":\"Phông\",\"panelTitle\":\"Phông\",\"voiceLabel\":\"Phông\"},\"forms\":{\"button\":{\"title\":\"Thuộc tính của nút\",\"text\":\"Chuỗi hiển thị (giá trị)\",\"type\":\"Kiểu\",\"typeBtn\":\"Nút bấm\",\"typeSbm\":\"Nút gửi\",\"typeRst\":\"Nút nhập lại\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"Thuộc tính nút kiểm\",\"radioTitle\":\"Thuộc tính nút chọn\",\"value\":\"Giá trị\",\"selected\":\"Được chọn\",\"required\":\"Required\"},\"form\":{\"title\":\"Thuộc tính biểu mẫu\",\"menu\":\"Thuộc tính biểu mẫu\",\"action\":\"Hành động\",\"method\":\"Phương thức\",\"encoding\":\"Bảng mã\"},\"hidden\":{\"title\":\"Thuộc tính trường ẩn\",\"name\":\"Tên\",\"value\":\"Giá trị\"},\"select\":{\"title\":\"Thuộc tính ô chọn\",\"selectInfo\":\"Thông tin\",\"opAvail\":\"Các tùy chọn có thể sử dụng\",\"value\":\"Giá trị\",\"size\":\"Kích cỡ\",\"lines\":\"dòng\",\"chkMulti\":\"Cho phép chọn nhiều\",\"required\":\"Required\",\"opText\":\"Văn bản\",\"opValue\":\"Giá trị\",\"btnAdd\":\"Thêm\",\"btnModify\":\"Thay đổi\",\"btnUp\":\"Lên\",\"btnDown\":\"Xuống\",\"btnSetValue\":\"Giá trị được chọn\",\"btnDelete\":\"Nút xoá\"},\"textarea\":{\"title\":\"Thuộc tính vùng văn bản\",\"cols\":\"Số cột\",\"rows\":\"Số hàng\"},\"textfield\":{\"title\":\"Thuộc tính trường văn bản\",\"name\":\"Tên\",\"value\":\"Giá trị\",\"charWidth\":\"Độ rộng của ký tự\",\"maxChars\":\"Số ký tự tối đa\",\"required\":\"Required\",\"type\":\"Kiểu\",\"typeText\":\"Ký tự\",\"typePass\":\"Mật khẩu\",\"typeEmail\":\"Email\",\"typeSearch\":\"Tìm kiếm\",\"typeTel\":\"Số điện thoại\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"Định dạng\",\"panelTitle\":\"Định dạng\",\"tag_address\":\"Address\",\"tag_div\":\"Bình thường (DIV)\",\"tag_h1\":\"Heading 1\",\"tag_h2\":\"Heading 2\",\"tag_h3\":\"Heading 3\",\"tag_h4\":\"Heading 4\",\"tag_h5\":\"Heading 5\",\"tag_h6\":\"Heading 6\",\"tag_p\":\"Bình thường (P)\",\"tag_pre\":\"Đã thiết lập\"},\"horizontalrule\":{\"toolbar\":\"Chèn đường phân cách ngang\"},\"iframe\":{\"border\":\"Hiển thị viền khung\",\"noUrl\":\"Vui lòng nhập địa chỉ iframe\",\"scrolling\":\"Kích hoạt thanh cuộn\",\"title\":\"Thuộc tính iframe\",\"toolbar\":\"Iframe\"},\"image\":{\"alt\":\"Chú thích ảnh\",\"border\":\"Đường viền\",\"btnUpload\":\"Tải lên máy chủ\",\"button2Img\":\"Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?\",\"hSpace\":\"Khoảng đệm ngang\",\"img2Button\":\"Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?\",\"infoTab\":\"Thông tin của ảnh\",\"linkTab\":\"Tab liên kết\",\"lockRatio\":\"Giữ nguyên tỷ lệ\",\"menu\":\"Thuộc tính của ảnh\",\"resetSize\":\"Kích thước gốc\",\"title\":\"Thuộc tính của ảnh\",\"titleButton\":\"Thuộc tính nút của ảnh\",\"upload\":\"Tải lên\",\"urlMissing\":\"Thiếu đường dẫn hình ảnh\",\"vSpace\":\"Khoảng đệm dọc\",\"validateBorder\":\"Chiều rộng của đường viền phải là một số nguyên dương\",\"validateHSpace\":\"Khoảng đệm ngang phải là một số nguyên dương\",\"validateVSpace\":\"Khoảng đệm dọc phải là một số nguyên dương\"},\"indent\":{\"indent\":\"Dịch vào trong\",\"outdent\":\"Dịch ra ngoài\"},\"smiley\":{\"options\":\"Tùy chọn hình  biểu lộ cảm xúc\",\"title\":\"Chèn hình biểu lộ cảm xúc (mặt cười)\",\"toolbar\":\"Hình biểu lộ cảm xúc (mặt cười)\"},\"justify\":{\"block\":\"Canh đều\",\"center\":\"Canh giữa\",\"left\":\"Canh trái\",\"right\":\"Canh phải\"},\"language\":{\"button\":\"Thiết lập ngôn ngữ\",\"remove\":\"Loại bỏ ngôn ngữ\"},\"link\":{\"acccessKey\":\"Phím hỗ trợ truy cập\",\"advanced\":\"Mở rộng\",\"advisoryContentType\":\"Nội dung hướng dẫn\",\"advisoryTitle\":\"Nhan đề hướng dẫn\",\"anchor\":{\"toolbar\":\"Chèn/Sửa điểm neo\",\"menu\":\"Thuộc tính điểm neo\",\"title\":\"Thuộc tính điểm neo\",\"name\":\"Tên của điểm neo\",\"errorName\":\"Hãy nhập vào tên của điểm neo\",\"remove\":\"Xóa neo\"},\"anchorId\":\"Theo định danh thành phần\",\"anchorName\":\"Theo tên điểm neo\",\"charset\":\"Bảng mã của tài nguyên được liên kết đến\",\"cssClasses\":\"Lớp Stylesheet\",\"emailAddress\":\"Thư điện tử\",\"emailBody\":\"Nội dung thông điệp\",\"emailSubject\":\"Tiêu đề thông điệp\",\"id\":\"Định danh\",\"info\":\"Thông tin liên kết\",\"langCode\":\"Mã ngôn ngữ\",\"langDir\":\"Hướng ngôn ngữ\",\"langDirLTR\":\"Trái sang phải (LTR)\",\"langDirRTL\":\"Phải sang trái (RTL)\",\"menu\":\"Sửa liên kết\",\"name\":\"Tên\",\"noAnchors\":\"(Không có điểm neo nào trong tài liệu)\",\"noEmail\":\"Hãy đưa vào địa chỉ thư điện tử\",\"noUrl\":\"Hãy đưa vào đường dẫn liên kết (URL)\",\"other\":\"<khác>\",\"popupDependent\":\"Phụ thuộc (Netscape)\",\"popupFeatures\":\"Đặc điểm của cửa sổ Popup\",\"popupFullScreen\":\"Toàn màn hình (IE)\",\"popupLeft\":\"Vị trí bên trái\",\"popupLocationBar\":\"Thanh vị trí\",\"popupMenuBar\":\"Thanh Menu\",\"popupResizable\":\"Có thể thay đổi kích cỡ\",\"popupScrollBars\":\"Thanh cuộn\",\"popupStatusBar\":\"Thanh trạng thái\",\"popupToolbar\":\"Thanh công cụ\",\"popupTop\":\"Vị trí phía trên\",\"rel\":\"Quan hệ\",\"selectAnchor\":\"Chọn một điểm neo\",\"styles\":\"Kiểu (style)\",\"tabIndex\":\"Chỉ số của Tab\",\"target\":\"Đích\",\"targetFrame\":\"<khung>\",\"targetFrameName\":\"Tên khung đích\",\"targetPopup\":\"<cửa sổ popup>\",\"targetPopupName\":\"Tên cửa sổ Popup\",\"title\":\"Liên kết\",\"toAnchor\":\"Neo trong trang này\",\"toEmail\":\"Thư điện tử\",\"toUrl\":\"URL\",\"toolbar\":\"Chèn/Sửa liên kết\",\"type\":\"Kiểu liên kết\",\"unlink\":\"Xoá liên kết\",\"upload\":\"Tải lên\"},\"list\":{\"bulletedlist\":\"Chèn/Xoá Danh sách không thứ tự\",\"numberedlist\":\"Chèn/Xoá Danh sách có thứ tự\"},\"liststyle\":{\"armenian\":\"Số theo kiểu Armenian\",\"bulletedTitle\":\"Thuộc tính danh sách không thứ tự\",\"circle\":\"Khuyên tròn\",\"decimal\":\"Kiểu số (1, 2, 3 ...)\",\"decimalLeadingZero\":\"Kiểu số (01, 02, 03...)\",\"disc\":\"Hình đĩa\",\"georgian\":\"Số theo kiểu Georgian (an, ban, gan...)\",\"lowerAlpha\":\"Kiểu abc thường (a, b, c, d, e...)\",\"lowerGreek\":\"Kiểu Hy Lạp (alpha, beta, gamma...)\",\"lowerRoman\":\"Số La Mã kiểu thường (i, ii, iii, iv, v...)\",\"none\":\"Không gì cả\",\"notset\":\"<không thiết lập>\",\"numberedTitle\":\"Thuộc tính danh sách có thứ tự\",\"square\":\"Hình vuông\",\"start\":\"Bắt đầu\",\"type\":\"Kiểu loại\",\"upperAlpha\":\"Kiểu ABC HOA (A, B, C, D, E...)\",\"upperRoman\":\"Số La Mã kiểu HOA (I, II, III, IV, V...)\",\"validateStartNumber\":\"Số bắt đầu danh sách phải là một số nguyên.\"},\"magicline\":{\"title\":\"Chèn đoạn vào đây\"},\"maximize\":{\"maximize\":\"Phóng to tối đa\",\"minimize\":\"Thu nhỏ\"},\"newpage\":{\"toolbar\":\"Trang mới\"},\"pagebreak\":{\"alt\":\"Ngắt trang\",\"toolbar\":\"Chèn ngắt trang\"},\"pastetext\":{\"button\":\"Dán theo định dạng văn bản thuần\",\"title\":\"Dán theo định dạng văn bản thuần\"},\"pastefromword\":{\"confirmCleanup\":\"Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?\",\"error\":\"Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ\",\"title\":\"Dán với định dạng Word\",\"toolbar\":\"Dán với định dạng Word\"},\"preview\":{\"preview\":\"Xem trước\"},\"print\":{\"toolbar\":\"In\"},\"removeformat\":{\"toolbar\":\"Xoá định dạng\"},\"save\":{\"toolbar\":\"Lưu\"},\"selectall\":{\"toolbar\":\"Chọn tất cả\"},\"showblocks\":{\"toolbar\":\"Hiển thị các khối\"},\"sourcearea\":{\"toolbar\":\"Mã HTML\"},\"specialchar\":{\"options\":\"Tùy chọn các ký tự đặc biệt\",\"title\":\"Hãy chọn ký tự đặc biệt\",\"toolbar\":\"Chèn ký tự đặc biệt\"},\"scayt\":{\"btn_about\":\"Thông tin về SCAYT\",\"btn_dictionaries\":\"Từ điển\",\"btn_disable\":\"Tắt SCAYT\",\"btn_enable\":\"Bật SCAYT\",\"btn_langs\":\"Ngôn ngữ\",\"btn_options\":\"Tùy chọn\",\"text_title\":\"Kiểm tra chính tả ngay khi gõ chữ (SCAYT)\"},\"stylescombo\":{\"label\":\"Kiểu\",\"panelTitle\":\"Phong cách định dạng\",\"panelTitle1\":\"Kiểu khối\",\"panelTitle2\":\"Kiểu trực tiếp\",\"panelTitle3\":\"Kiểu đối tượng\"},\"table\":{\"border\":\"Kích thước đường viền\",\"caption\":\"Đầu đề\",\"cell\":{\"menu\":\"Ô\",\"insertBefore\":\"Chèn ô Phía trước\",\"insertAfter\":\"Chèn ô Phía sau\",\"deleteCell\":\"Xoá ô\",\"merge\":\"Kết hợp ô\",\"mergeRight\":\"Kết hợp sang phải\",\"mergeDown\":\"Kết hợp xuống dưới\",\"splitHorizontal\":\"Phân tách ô theo chiều ngang\",\"splitVertical\":\"Phân tách ô theo chiều dọc\",\"title\":\"Thuộc tính của ô\",\"cellType\":\"Kiểu của ô\",\"rowSpan\":\"Kết hợp hàng\",\"colSpan\":\"Kết hợp cột\",\"wordWrap\":\"Chữ liền hàng\",\"hAlign\":\"Canh lề ngang\",\"vAlign\":\"Canh lề dọc\",\"alignBaseline\":\"Đường cơ sở\",\"bgColor\":\"Màu nền\",\"borderColor\":\"Màu viền\",\"data\":\"Dữ liệu\",\"header\":\"Đầu đề\",\"yes\":\"Có\",\"no\":\"Không\",\"invalidWidth\":\"Chiều rộng của ô phải là một số nguyên.\",\"invalidHeight\":\"Chiều cao của ô phải là một số nguyên.\",\"invalidRowSpan\":\"Số hàng kết hợp phải là một số nguyên.\",\"invalidColSpan\":\"Số cột kết hợp phải là một số nguyên.\",\"chooseColor\":\"Chọn màu\"},\"cellPad\":\"Khoảng đệm giữ ô và nội dung\",\"cellSpace\":\"Khoảng cách giữa các ô\",\"column\":{\"menu\":\"Cột\",\"insertBefore\":\"Chèn cột phía trước\",\"insertAfter\":\"Chèn cột phía sau\",\"deleteColumn\":\"Xoá cột\"},\"columns\":\"Số cột\",\"deleteTable\":\"Xóa bảng\",\"headers\":\"Đầu đề\",\"headersBoth\":\"Cả hai\",\"headersColumn\":\"Cột đầu tiên\",\"headersNone\":\"Không có\",\"headersRow\":\"Hàng đầu tiên\",\"invalidBorder\":\"Kích cỡ của đường biên phải là một số nguyên.\",\"invalidCellPadding\":\"Khoảng đệm giữa ô và nội dung phải là một số nguyên.\",\"invalidCellSpacing\":\"Khoảng cách giữa các ô phải là một số nguyên.\",\"invalidCols\":\"Số lượng cột phải là một số lớn hơn 0.\",\"invalidHeight\":\"Chiều cao của bảng phải là một số nguyên.\",\"invalidRows\":\"Số lượng hàng phải là một số lớn hơn 0.\",\"invalidWidth\":\"Chiều rộng của bảng phải là một số nguyên.\",\"menu\":\"Thuộc tính bảng\",\"row\":{\"menu\":\"Hàng\",\"insertBefore\":\"Chèn hàng phía trước\",\"insertAfter\":\"Chèn hàng phía sau\",\"deleteRow\":\"Xoá hàng\"},\"rows\":\"Số hàng\",\"summary\":\"Tóm lược\",\"title\":\"Thuộc tính bảng\",\"toolbar\":\"Bảng\",\"widthPc\":\"Phần trăm (%)\",\"widthPx\":\"Điểm ảnh (px)\",\"widthUnit\":\"Đơn vị\"},\"undo\":{\"redo\":\"Làm lại thao tác\",\"undo\":\"Khôi phục thao tác\"},\"wsc\":{\"btnIgnore\":\"Bỏ qua\",\"btnIgnoreAll\":\"Bỏ qua tất cả\",\"btnReplace\":\"Thay thế\",\"btnReplaceAll\":\"Thay thế tất cả\",\"btnUndo\":\"Phục hồi lại\",\"changeTo\":\"Chuyển thành\",\"errorLoading\":\"Lỗi khi đang nạp dịch vụ ứng dụng: %s.\",\"ieSpellDownload\":\"Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải về ngay bây giờ?\",\"manyChanges\":\"Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi\",\"noChanges\":\"Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi\",\"noMispell\":\"Hoàn tất kiểm tra chính tả: Không có lỗi chính tả\",\"noSuggestions\":\"- Không đưa ra gợi ý về từ -\",\"notAvailable\":\"Xin lỗi, dịch vụ này hiện tại không có.\",\"notInDic\":\"Không có trong từ điển\",\"oneChange\":\"Hoàn tất kiểm tra chính tả: Một từ đã được thay đổi\",\"progress\":\"Đang tiến hành kiểm tra chính tả...\",\"title\":\"Kiểm tra chính tả\",\"toolbar\":\"Kiểm tra chính tả\"}};"
  },
  {
    "path": "assets/ckeditor/lang/zh-cn.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['zh-cn']={\"editor\":\"所见即所得编辑器\",\"editorPanel\":\"所见即所得编辑器面板\",\"common\":{\"editorHelp\":\"按 ALT+0 获得帮助\",\"browseServer\":\"浏览服务器\",\"url\":\"URL\",\"protocol\":\"协议\",\"upload\":\"上传\",\"uploadSubmit\":\"上传到服务器\",\"image\":\"图像\",\"flash\":\"Flash\",\"form\":\"表单\",\"checkbox\":\"复选框\",\"radio\":\"单选按钮\",\"textField\":\"单行文本\",\"textarea\":\"多行文本\",\"hiddenField\":\"隐藏域\",\"button\":\"按钮\",\"select\":\"列表/菜单\",\"imageButton\":\"图像按钮\",\"notSet\":\"<没有设置>\",\"id\":\"ID\",\"name\":\"名称\",\"langDir\":\"语言方向\",\"langDirLtr\":\"从左到右 (LTR)\",\"langDirRtl\":\"从右到左 (RTL)\",\"langCode\":\"语言代码\",\"longDescr\":\"详细说明 URL\",\"cssClass\":\"样式类名称\",\"advisoryTitle\":\"标题\",\"cssStyle\":\"行内样式\",\"ok\":\"确定\",\"cancel\":\"取消\",\"close\":\"关闭\",\"preview\":\"预览\",\"resize\":\"拖拽以改变大小\",\"generalTab\":\"常规\",\"advancedTab\":\"高级\",\"validateNumberFailed\":\"需要输入数字格式\",\"confirmNewPage\":\"当前文档内容未保存，是否确认新建文档？\",\"confirmCancel\":\"部分修改尚未保存，是否确认关闭对话框？\",\"options\":\"选项\",\"target\":\"目标窗口\",\"targetNew\":\"新窗口 (_blank)\",\"targetTop\":\"整页 (_top)\",\"targetSelf\":\"本窗口 (_self)\",\"targetParent\":\"父窗口 (_parent)\",\"langDirLTR\":\"从左到右 (LTR)\",\"langDirRTL\":\"从右到左 (RTL)\",\"styles\":\"样式\",\"cssClasses\":\"样式类\",\"width\":\"宽度\",\"height\":\"高度\",\"align\":\"对齐方式\",\"alignLeft\":\"左对齐\",\"alignRight\":\"右对齐\",\"alignCenter\":\"居中\",\"alignJustify\":\"两端对齐\",\"alignTop\":\"顶端\",\"alignMiddle\":\"居中\",\"alignBottom\":\"底部\",\"alignNone\":\"无\",\"invalidValue\":\"无效的值。\",\"invalidHeight\":\"高度必须为数字格式\",\"invalidWidth\":\"宽度必须为数字格式\",\"invalidCssLength\":\"此“%1”字段的值必须为正数，可以包含或不包含一个有效的 CSS 长度单位(px, %, in, cm, mm, em, ex, pt 或 pc)\",\"invalidHtmlLength\":\"此“%1”字段的值必须为正数，可以包含或不包含一个有效的 HTML 长度单位(px 或 %)\",\"invalidInlineStyle\":\"内联样式必须为格式是以分号分隔的一个或多个“属性名 : 属性值”。\",\"cssLengthTooltip\":\"输入一个表示像素值的数字，或加上一个有效的 CSS 长度单位(px, %, in, cm, mm, em, ex, pt 或 pc)。\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">，不可用</span>\"},\"about\":{\"copy\":\"版权所有 &copy; $1。<br />保留所有权利。\",\"dlgTitle\":\"关于 CKEditor\",\"help\":\"访问 $1 以获取帮助。\",\"moreInfo\":\"相关授权许可信息请访问我们的网站：\",\"title\":\"关于 CKEditor\",\"userGuide\":\"CKEditor 用户向导\"},\"basicstyles\":{\"bold\":\"加粗\",\"italic\":\"倾斜\",\"strike\":\"删除线\",\"subscript\":\"下标\",\"superscript\":\"上标\",\"underline\":\"下划线\"},\"bidi\":{\"ltr\":\"文字方向为从左至右\",\"rtl\":\"文字方向为从右至左\"},\"blockquote\":{\"toolbar\":\"块引用\"},\"clipboard\":{\"copy\":\"复制\",\"copyError\":\"您的浏览器安全设置不允许编辑器自动执行复制操作，请使用键盘快捷键(Ctrl/Cmd+C)来完成。\",\"cut\":\"剪切\",\"cutError\":\"您的浏览器安全设置不允许编辑器自动执行剪切操作，请使用键盘快捷键(Ctrl/Cmd+X)来完成。\",\"paste\":\"粘贴\",\"pasteArea\":\"粘贴区域\",\"pasteMsg\":\"请使用键盘快捷键(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>\",\"securityMsg\":\"因为您的浏览器的安全设置原因，本编辑器不能直接访问您的剪贴板内容，你需要在本窗口重新粘贴一次。\",\"title\":\"粘贴\"},\"button\":{\"selectedLabel\":\"已选中 %1 项\"},\"colorbutton\":{\"auto\":\"自动\",\"bgColorTitle\":\"背景颜色\",\"colors\":{\"000\":\"黑\",\"800000\":\"褐红\",\"8B4513\":\"深褐\",\"2F4F4F\":\"墨绿\",\"008080\":\"绿松石\",\"000080\":\"海军蓝\",\"4B0082\":\"靛蓝\",\"696969\":\"暗灰\",\"B22222\":\"砖红\",\"A52A2A\":\"褐\",\"DAA520\":\"金黄\",\"006400\":\"深绿\",\"40E0D0\":\"蓝绿\",\"0000CD\":\"中蓝\",\"800080\":\"紫\",\"808080\":\"灰\",\"F00\":\"红\",\"FF8C00\":\"深橙\",\"FFD700\":\"金\",\"008000\":\"绿\",\"0FF\":\"青\",\"00F\":\"蓝\",\"EE82EE\":\"紫罗兰\",\"A9A9A9\":\"深灰\",\"FFA07A\":\"亮橙\",\"FFA500\":\"橙\",\"FFFF00\":\"黄\",\"00FF00\":\"水绿\",\"AFEEEE\":\"粉蓝\",\"ADD8E6\":\"亮蓝\",\"DDA0DD\":\"梅红\",\"D3D3D3\":\"淡灰\",\"FFF0F5\":\"淡紫红\",\"FAEBD7\":\"古董白\",\"FFFFE0\":\"淡黄\",\"F0FFF0\":\"蜜白\",\"F0FFFF\":\"天蓝\",\"F0F8FF\":\"淡蓝\",\"E6E6FA\":\"淡紫\",\"FFF\":\"白\"},\"more\":\"其它颜色...\",\"panelTitle\":\"颜色\",\"textColorTitle\":\"文本颜色\"},\"colordialog\":{\"clear\":\"清除\",\"highlight\":\"高亮\",\"options\":\"颜色选项\",\"selected\":\"选择颜色\",\"title\":\"选择颜色\"},\"templates\":{\"button\":\"模板\",\"emptyListMsg\":\"(没有模板)\",\"insertOption\":\"替换当前内容\",\"options\":\"模板选项\",\"selectPromptMsg\":\"请选择要在编辑器中使用的模板：\",\"title\":\"内容模板\"},\"contextmenu\":{\"options\":\"快捷菜单选项\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"标题\",\"cssClassInputLabel\":\"样式类名称\",\"edit\":\"编辑 DIV\",\"inlineStyleInputLabel\":\"行内样式\",\"langDirLTRLabel\":\"从左到右 (LTR)\",\"langDirLabel\":\"语言方向\",\"langDirRTLLabel\":\"从右到左 (RTL)\",\"languageCodeInputLabel\":\"语言代码\",\"remove\":\"移除 DIV\",\"styleSelectLabel\":\"样式\",\"title\":\"创建 DIV 容器\",\"toolbar\":\"创建 DIV 容器\"},\"toolbar\":{\"toolbarCollapse\":\"折叠工具栏\",\"toolbarExpand\":\"展开工具栏\",\"toolbarGroups\":{\"document\":\"文档\",\"clipboard\":\"剪贴板/撤销\",\"editing\":\"编辑\",\"forms\":\"表单\",\"basicstyles\":\"基本格式\",\"paragraph\":\"段落\",\"links\":\"链接\",\"insert\":\"插入\",\"styles\":\"样式\",\"colors\":\"颜色\",\"tools\":\"工具\"},\"toolbars\":\"工具栏\"},\"elementspath\":{\"eleLabel\":\"元素路径\",\"eleTitle\":\"%1 元素\"},\"find\":{\"find\":\"查找\",\"findOptions\":\"查找选项\",\"findWhat\":\"查找:\",\"matchCase\":\"区分大小写\",\"matchCyclic\":\"循环匹配\",\"matchWord\":\"全字匹配\",\"notFoundMsg\":\"指定的文本没有找到。\",\"replace\":\"替换\",\"replaceAll\":\"全部替换\",\"replaceSuccessMsg\":\"共完成 %1 处替换。\",\"replaceWith\":\"替换:\",\"title\":\"查找和替换\"},\"fakeobjects\":{\"anchor\":\"锚点\",\"flash\":\"Flash 动画\",\"hiddenfield\":\"隐藏域\",\"iframe\":\"IFrame\",\"unknown\":\"未知对象\"},\"flash\":{\"access\":\"允许脚本访问\",\"accessAlways\":\"总是\",\"accessNever\":\"从不\",\"accessSameDomain\":\"同域\",\"alignAbsBottom\":\"绝对底部\",\"alignAbsMiddle\":\"绝对居中\",\"alignBaseline\":\"基线\",\"alignTextTop\":\"文本上方\",\"bgcolor\":\"背景颜色\",\"chkFull\":\"启用全屏\",\"chkLoop\":\"循环\",\"chkMenu\":\"启用 Flash 菜单\",\"chkPlay\":\"自动播放\",\"flashvars\":\"Flash 变量\",\"hSpace\":\"水平间距\",\"properties\":\"Flash 属性\",\"propertiesTab\":\"属性\",\"quality\":\"质量\",\"qualityAutoHigh\":\"高(自动)\",\"qualityAutoLow\":\"低(自动)\",\"qualityBest\":\"最好\",\"qualityHigh\":\"高\",\"qualityLow\":\"低\",\"qualityMedium\":\"中(自动)\",\"scale\":\"缩放\",\"scaleAll\":\"全部显示\",\"scaleFit\":\"严格匹配\",\"scaleNoBorder\":\"无边框\",\"title\":\"标题\",\"vSpace\":\"垂直间距\",\"validateHSpace\":\"水平间距必须为数字格式\",\"validateSrc\":\"请输入源文件地址\",\"validateVSpace\":\"垂直间距必须为数字格式\",\"windowMode\":\"窗体模式\",\"windowModeOpaque\":\"不透明\",\"windowModeTransparent\":\"透明\",\"windowModeWindow\":\"窗体\"},\"font\":{\"fontSize\":{\"label\":\"大小\",\"voiceLabel\":\"文字大小\",\"panelTitle\":\"大小\"},\"label\":\"字体\",\"panelTitle\":\"字体\",\"voiceLabel\":\"字体\"},\"forms\":{\"button\":{\"title\":\"按钮属性\",\"text\":\"标签(值)\",\"type\":\"类型\",\"typeBtn\":\"按钮\",\"typeSbm\":\"提交\",\"typeRst\":\"重设\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"复选框属性\",\"radioTitle\":\"单选按钮属性\",\"value\":\"选定值\",\"selected\":\"已勾选\",\"required\":\"必选\"},\"form\":{\"title\":\"表单属性\",\"menu\":\"表单属性\",\"action\":\"动作\",\"method\":\"方法\",\"encoding\":\"表单编码\"},\"hidden\":{\"title\":\"隐藏域属性\",\"name\":\"名称\",\"value\":\"初始值\"},\"select\":{\"title\":\"菜单/列表属性\",\"selectInfo\":\"选择信息\",\"opAvail\":\"可选项\",\"value\":\"值\",\"size\":\"高度\",\"lines\":\"行\",\"chkMulti\":\"允许多选\",\"required\":\"必选\",\"opText\":\"选项文本\",\"opValue\":\"选项值\",\"btnAdd\":\"添加\",\"btnModify\":\"修改\",\"btnUp\":\"上移\",\"btnDown\":\"下移\",\"btnSetValue\":\"设为初始选定\",\"btnDelete\":\"删除\"},\"textarea\":{\"title\":\"多行文本属性\",\"cols\":\"字符宽度\",\"rows\":\"行数\"},\"textfield\":{\"title\":\"单行文本属性\",\"name\":\"名称\",\"value\":\"初始值\",\"charWidth\":\"字符宽度\",\"maxChars\":\"最多字符数\",\"required\":\"必填\",\"type\":\"类型\",\"typeText\":\"文本\",\"typePass\":\"密码\",\"typeEmail\":\"Email\",\"typeSearch\":\"搜索\",\"typeTel\":\"电话号码\",\"typeUrl\":\"地址\"}},\"format\":{\"label\":\"格式\",\"panelTitle\":\"格式\",\"tag_address\":\"地址\",\"tag_div\":\"段落(DIV)\",\"tag_h1\":\"标题 1\",\"tag_h2\":\"标题 2\",\"tag_h3\":\"标题 3\",\"tag_h4\":\"标题 4\",\"tag_h5\":\"标题 5\",\"tag_h6\":\"标题 6\",\"tag_p\":\"普通\",\"tag_pre\":\"已编排格式\"},\"horizontalrule\":{\"toolbar\":\"插入水平线\"},\"iframe\":{\"border\":\"显示框架边框\",\"noUrl\":\"请输入框架的 URL\",\"scrolling\":\"允许滚动条\",\"title\":\"IFrame 属性\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"替换文本\",\"border\":\"边框大小\",\"btnUpload\":\"上传到服务器\",\"button2Img\":\"确定要把当前图像按钮转换为普通图像吗？\",\"hSpace\":\"水平间距\",\"img2Button\":\"确定要把当前图像改变为图像按钮吗？\",\"infoTab\":\"图像信息\",\"linkTab\":\"链接\",\"lockRatio\":\"锁定比例\",\"menu\":\"图像属性\",\"resetSize\":\"原始尺寸\",\"title\":\"图像属性\",\"titleButton\":\"图像域属性\",\"upload\":\"上传\",\"urlMissing\":\"缺少图像源文件地址\",\"vSpace\":\"垂直间距\",\"validateBorder\":\"边框大小必须为整数格式\",\"validateHSpace\":\"水平间距必须为整数格式\",\"validateVSpace\":\"垂直间距必须为整数格式\"},\"indent\":{\"indent\":\"增加缩进量\",\"outdent\":\"减少缩进量\"},\"smiley\":{\"options\":\"表情图标选项\",\"title\":\"插入表情图标\",\"toolbar\":\"表情符\"},\"justify\":{\"block\":\"两端对齐\",\"center\":\"居中\",\"left\":\"左对齐\",\"right\":\"右对齐\"},\"language\":{\"button\":\"设置语言\",\"remove\":\"移除语言\"},\"link\":{\"acccessKey\":\"访问键\",\"advanced\":\"高级\",\"advisoryContentType\":\"内容类型\",\"advisoryTitle\":\"标题\",\"anchor\":{\"toolbar\":\"插入/编辑锚点链接\",\"menu\":\"锚点链接属性\",\"title\":\"锚点链接属性\",\"name\":\"锚点名称\",\"errorName\":\"请输入锚点名称\",\"remove\":\"删除锚点\"},\"anchorId\":\"按锚点 ID\",\"anchorName\":\"按锚点名称\",\"charset\":\"字符编码\",\"cssClasses\":\"样式类名称\",\"emailAddress\":\"地址\",\"emailBody\":\"内容\",\"emailSubject\":\"主题\",\"id\":\"ID\",\"info\":\"超链接信息\",\"langCode\":\"语言代码\",\"langDir\":\"语言方向\",\"langDirLTR\":\"从左到右 (LTR)\",\"langDirRTL\":\"从右到左 (RTL)\",\"menu\":\"编辑超链接\",\"name\":\"名称\",\"noAnchors\":\"(此文档没有可用的锚点)\",\"noEmail\":\"请输入电子邮件地址\",\"noUrl\":\"请输入超链接地址\",\"other\":\"<其他>\",\"popupDependent\":\"依附 (NS)\",\"popupFeatures\":\"弹出窗口属性\",\"popupFullScreen\":\"全屏 (IE)\",\"popupLeft\":\"左\",\"popupLocationBar\":\"地址栏\",\"popupMenuBar\":\"菜单栏\",\"popupResizable\":\"可缩放\",\"popupScrollBars\":\"滚动条\",\"popupStatusBar\":\"状态栏\",\"popupToolbar\":\"工具栏\",\"popupTop\":\"右\",\"rel\":\"关联\",\"selectAnchor\":\"选择一个锚点\",\"styles\":\"行内样式\",\"tabIndex\":\"Tab 键次序\",\"target\":\"目标\",\"targetFrame\":\"<框架>\",\"targetFrameName\":\"目标框架名称\",\"targetPopup\":\"<弹出窗口>\",\"targetPopupName\":\"弹出窗口名称\",\"title\":\"超链接\",\"toAnchor\":\"页内锚点链接\",\"toEmail\":\"电子邮件\",\"toUrl\":\"地址\",\"toolbar\":\"插入/编辑超链接\",\"type\":\"超链接类型\",\"unlink\":\"取消超链接\",\"upload\":\"上传\"},\"list\":{\"bulletedlist\":\"项目列表\",\"numberedlist\":\"编号列表\"},\"liststyle\":{\"armenian\":\"传统的亚美尼亚编号方式\",\"bulletedTitle\":\"项目列表属性\",\"circle\":\"空心圆\",\"decimal\":\"数字 (1, 2, 3, 等)\",\"decimalLeadingZero\":\"0开头的数字标记(01, 02, 03, 等)\",\"disc\":\"实心圆\",\"georgian\":\"传统的乔治亚编号方式(an, ban, gan, 等)\",\"lowerAlpha\":\"小写英文字母(a, b, c, d, e, 等)\",\"lowerGreek\":\"小写希腊字母(alpha, beta, gamma, 等)\",\"lowerRoman\":\"小写罗马数字(i, ii, iii, iv, v, 等)\",\"none\":\"无标记\",\"notset\":\"<没有设置>\",\"numberedTitle\":\"编号列表属性\",\"square\":\"实心方块\",\"start\":\"开始序号\",\"type\":\"标记类型\",\"upperAlpha\":\"大写英文字母(A, B, C, D, E, 等)\",\"upperRoman\":\"大写罗马数字(I, II, III, IV, V, 等)\",\"validateStartNumber\":\"列表开始序号必须为整数格式\"},\"magicline\":{\"title\":\"在这插入段落\"},\"maximize\":{\"maximize\":\"全屏\",\"minimize\":\"最小化\"},\"newpage\":{\"toolbar\":\"新建\"},\"pagebreak\":{\"alt\":\"分页符\",\"toolbar\":\"插入打印分页符\"},\"pastetext\":{\"button\":\"粘贴为无格式文本\",\"title\":\"粘贴为无格式文本\"},\"pastefromword\":{\"confirmCleanup\":\"您要粘贴的内容好像是来自 MS Word，是否要清除 MS Word 格式后再粘贴？\",\"error\":\"由于内部错误无法清理要粘贴的数据\",\"title\":\"从 MS Word 粘贴\",\"toolbar\":\"从 MS Word 粘贴\"},\"preview\":{\"preview\":\"预览\"},\"print\":{\"toolbar\":\"打印\"},\"removeformat\":{\"toolbar\":\"清除格式\"},\"save\":{\"toolbar\":\"保存\"},\"selectall\":{\"toolbar\":\"全选\"},\"showblocks\":{\"toolbar\":\"显示区块\"},\"sourcearea\":{\"toolbar\":\"源码\"},\"specialchar\":{\"options\":\"特殊符号选项\",\"title\":\"选择特殊符号\",\"toolbar\":\"插入特殊符号\"},\"scayt\":{\"btn_about\":\"关于即时拼写检查\",\"btn_dictionaries\":\"字典\",\"btn_disable\":\"禁用即时拼写检查\",\"btn_enable\":\"启用即时拼写检查\",\"btn_langs\":\"语言\",\"btn_options\":\"选项\",\"text_title\":\"即时拼写检查\"},\"stylescombo\":{\"label\":\"样式\",\"panelTitle\":\"样式\",\"panelTitle1\":\"块级元素样式\",\"panelTitle2\":\"内联元素样式\",\"panelTitle3\":\"对象元素样式\"},\"table\":{\"border\":\"边框\",\"caption\":\"标题\",\"cell\":{\"menu\":\"单元格\",\"insertBefore\":\"在左侧插入单元格\",\"insertAfter\":\"在右侧插入单元格\",\"deleteCell\":\"删除单元格\",\"merge\":\"合并单元格\",\"mergeRight\":\"向右合并单元格\",\"mergeDown\":\"向下合并单元格\",\"splitHorizontal\":\"水平拆分单元格\",\"splitVertical\":\"垂直拆分单元格\",\"title\":\"单元格属性\",\"cellType\":\"单元格类型\",\"rowSpan\":\"纵跨行数\",\"colSpan\":\"横跨列数\",\"wordWrap\":\"自动换行\",\"hAlign\":\"水平对齐\",\"vAlign\":\"垂直对齐\",\"alignBaseline\":\"基线\",\"bgColor\":\"背景颜色\",\"borderColor\":\"边框颜色\",\"data\":\"数据\",\"header\":\"表头\",\"yes\":\"是\",\"no\":\"否\",\"invalidWidth\":\"单元格宽度必须为数字格式\",\"invalidHeight\":\"单元格高度必须为数字格式\",\"invalidRowSpan\":\"行跨度必须为整数格式\",\"invalidColSpan\":\"列跨度必须为整数格式\",\"chooseColor\":\"选择\"},\"cellPad\":\"边距\",\"cellSpace\":\"间距\",\"column\":{\"menu\":\"列\",\"insertBefore\":\"在左侧插入列\",\"insertAfter\":\"在右侧插入列\",\"deleteColumn\":\"删除列\"},\"columns\":\"列数\",\"deleteTable\":\"删除表格\",\"headers\":\"标题单元格\",\"headersBoth\":\"第一列和第一行\",\"headersColumn\":\"第一列\",\"headersNone\":\"无\",\"headersRow\":\"第一行\",\"invalidBorder\":\"边框粗细必须为数字格式\",\"invalidCellPadding\":\"单元格填充必须为数字格式\",\"invalidCellSpacing\":\"单元格间距必须为数字格式\",\"invalidCols\":\"指定的行数必须大于零\",\"invalidHeight\":\"表格高度必须为数字格式\",\"invalidRows\":\"指定的列数必须大于零\",\"invalidWidth\":\"表格宽度必须为数字格式\",\"menu\":\"表格属性\",\"row\":{\"menu\":\"行\",\"insertBefore\":\"在上方插入行\",\"insertAfter\":\"在下方插入行\",\"deleteRow\":\"删除行\"},\"rows\":\"行数\",\"summary\":\"摘要\",\"title\":\"表格属性\",\"toolbar\":\"表格\",\"widthPc\":\"百分比\",\"widthPx\":\"像素\",\"widthUnit\":\"宽度单位\"},\"undo\":{\"redo\":\"重做\",\"undo\":\"撤消\"},\"wsc\":{\"btnIgnore\":\"忽略\",\"btnIgnoreAll\":\"全部忽略\",\"btnReplace\":\"替换\",\"btnReplaceAll\":\"全部替换\",\"btnUndo\":\"撤消\",\"changeTo\":\"更改为\",\"errorLoading\":\"加载应该服务主机时出错: %s.\",\"ieSpellDownload\":\"拼写检查插件还没安装, 您是否想现在就下载?\",\"manyChanges\":\"拼写检查完成: 更改了 %1 个单词\",\"noChanges\":\"拼写检查完成: 没有更改任何单词\",\"noMispell\":\"拼写检查完成: 没有发现拼写错误\",\"noSuggestions\":\"- 没有建议 -\",\"notAvailable\":\"抱歉, 服务目前暂不可用\",\"notInDic\":\"没有在字典里\",\"oneChange\":\"拼写检查完成: 更改了一个单词\",\"progress\":\"正在进行拼写检查...\",\"title\":\"拼写检查\",\"toolbar\":\"拼写检查\"}};"
  },
  {
    "path": "assets/ckeditor/lang/zh.js",
    "content": "﻿/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.lang['zh']={\"editor\":\"RTF 編輯器\",\"editorPanel\":\"RTF 編輯器面板\",\"common\":{\"editorHelp\":\"按下 ALT 0 取得說明。\",\"browseServer\":\"瀏覽伺服器\",\"url\":\"URL\",\"protocol\":\"通訊協定\",\"upload\":\"上傳\",\"uploadSubmit\":\"傳送至伺服器\",\"image\":\"圖像\",\"flash\":\"Flash\",\"form\":\"表格\",\"checkbox\":\"核取方塊\",\"radio\":\"選項按鈕\",\"textField\":\"文字欄位\",\"textarea\":\"文字區域\",\"hiddenField\":\"隱藏欄位\",\"button\":\"按鈕\",\"select\":\"選取欄位\",\"imageButton\":\"影像按鈕\",\"notSet\":\"<未設定>\",\"id\":\"ID\",\"name\":\"名稱\",\"langDir\":\"語言方向\",\"langDirLtr\":\"由左至右 (LTR)\",\"langDirRtl\":\"由右至左 (RTL)\",\"langCode\":\"語言代碼\",\"longDescr\":\"完整描述 URL\",\"cssClass\":\"樣式表類別\",\"advisoryTitle\":\"標題\",\"cssStyle\":\"樣式\",\"ok\":\"確定\",\"cancel\":\"取消\",\"close\":\"關閉\",\"preview\":\"預覽\",\"resize\":\"調整大小\",\"generalTab\":\"一般\",\"advancedTab\":\"進階\",\"validateNumberFailed\":\"此值不是數值。\",\"confirmNewPage\":\"現存的修改尚未儲存，要開新檔案？\",\"confirmCancel\":\"部份選項尚未儲存，要關閉對話框？\",\"options\":\"選項\",\"target\":\"目標\",\"targetNew\":\"開新視窗 (_blank)\",\"targetTop\":\"最上層視窗 (_top)\",\"targetSelf\":\"相同視窗 (_self)\",\"targetParent\":\"父視窗 (_parent)\",\"langDirLTR\":\"由左至右 (LTR)\",\"langDirRTL\":\"由右至左 (RTL)\",\"styles\":\"樣式\",\"cssClasses\":\"樣式表類別\",\"width\":\"寬度\",\"height\":\"高度\",\"align\":\"對齊方式\",\"alignLeft\":\"靠左對齊\",\"alignRight\":\"靠右對齊\",\"alignCenter\":\"置中對齊\",\"alignJustify\":\"左右對齊\",\"alignTop\":\"頂端\",\"alignMiddle\":\"中間對齊\",\"alignBottom\":\"底端\",\"alignNone\":\"無\",\"invalidValue\":\"無效值。\",\"invalidHeight\":\"高度必須為數字。\",\"invalidWidth\":\"寬度必須為數字。\",\"invalidCssLength\":\"「%1」的值應為正數，並可包含有效的 CSS 單位 (px, %, in, cm, mm, em, ex, pt, 或 pc)。\",\"invalidHtmlLength\":\"「%1」的值應為正數，並可包含有效的 HTML 單位 (px 或 %)。\",\"invalidInlineStyle\":\"行內樣式的值應包含一個以上的變數值組，其格式如「名稱:值」，並以分號區隔之。\",\"cssLengthTooltip\":\"請輸入數值，單位是像素或有效的 CSS 單位 (px, %, in, cm, mm, em, ex, pt, 或 pc)。\",\"unavailable\":\"%1<span class=\\\"cke_accessibility\\\">，無法使用</span>\"},\"about\":{\"copy\":\"Copyright &copy; $1. All rights reserved.\",\"dlgTitle\":\"關於 CKEditor\",\"help\":\"檢閱 $1 尋求幫助。\",\"moreInfo\":\"關於授權資訊，請參閱我們的網站：\",\"title\":\"關於 CKEditor\",\"userGuide\":\"CKEditor 使用者手冊\"},\"basicstyles\":{\"bold\":\"粗體\",\"italic\":\"斜體\",\"strike\":\"刪除線\",\"subscript\":\"下標\",\"superscript\":\"上標\",\"underline\":\"底線\"},\"bidi\":{\"ltr\":\"文字方向從左至右\",\"rtl\":\"文字方向從右至左\"},\"blockquote\":{\"toolbar\":\"引用段落\"},\"clipboard\":{\"copy\":\"複製\",\"copyError\":\"瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用鍵盤快捷鍵 (Ctrl/Cmd+C) 複製。\",\"cut\":\"剪下\",\"cutError\":\"瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用鏐盤快捷鍵 (Ctrl/Cmd+X) 剪下。\",\"paste\":\"貼上\",\"pasteArea\":\"貼上區\",\"pasteMsg\":\"請使用鍵盤快捷鍵 (<strong>Ctrl/Cmd+V</strong>) 貼到下方區域中並按下「確定」。\",\"securityMsg\":\"因為瀏覽器的安全性設定，本編輯器無法直接存取您的剪貼簿資料，請您自行在本視窗進行貼上動作。\",\"title\":\"貼上\"},\"button\":{\"selectedLabel\":\"%1 (已選取)\"},\"colorbutton\":{\"auto\":\"自動\",\"bgColorTitle\":\"背景顏色\",\"colors\":{\"000\":\"黑色\",\"800000\":\"栗色\",\"8B4513\":\"鞍褐色\",\"2F4F4F\":\"暗瓦灰色\",\"008080\":\"水壓色\",\"000080\":\"丈青澀\",\"4B0082\":\"靛青\",\"696969\":\"深灰色\",\"B22222\":\"磚紅色\",\"A52A2A\":\"褐色\",\"DAA520\":\"金黃色\",\"006400\":\"深綠色\",\"40E0D0\":\"青綠色\",\"0000CD\":\"藍色\",\"800080\":\"紫色\",\"808080\":\"灰色\",\"F00\":\"紅色\",\"FF8C00\":\"深橘色\",\"FFD700\":\"金色\",\"008000\":\"綠色\",\"0FF\":\"藍綠色\",\"00F\":\"藍色\",\"EE82EE\":\"紫色\",\"A9A9A9\":\"暗灰色\",\"FFA07A\":\"亮鮭紅\",\"FFA500\":\"橘色\",\"FFFF00\":\"黃色\",\"00FF00\":\"鮮綠色\",\"AFEEEE\":\"綠松色\",\"ADD8E6\":\"淺藍色\",\"DDA0DD\":\"枚紅色\",\"D3D3D3\":\"淺灰色\",\"FFF0F5\":\"淺紫色\",\"FAEBD7\":\"骨董白\",\"FFFFE0\":\"淺黃色\",\"F0FFF0\":\"蜜瓜綠\",\"F0FFFF\":\"天藍色\",\"F0F8FF\":\"愛麗斯蘭\",\"E6E6FA\":\"淺紫色\",\"FFF\":\"白色\"},\"more\":\"更多顏色\",\"panelTitle\":\"顏色\",\"textColorTitle\":\"文字顏色\"},\"colordialog\":{\"clear\":\"清除\",\"highlight\":\"高亮\",\"options\":\"色彩選項\",\"selected\":\"選取的色彩\",\"title\":\"選取色彩\"},\"templates\":{\"button\":\"範本\",\"emptyListMsg\":\"(尚未定義任何範本)\",\"insertOption\":\"替代實際內容\",\"options\":\"範本選項\",\"selectPromptMsg\":\"請選擇要在編輯器中開啟的範本。\",\"title\":\"內容範本\"},\"contextmenu\":{\"options\":\"內容功能表選項\"},\"div\":{\"IdInputLabel\":\"ID\",\"advisoryTitleInputLabel\":\"標題\",\"cssClassInputLabel\":\"樣式表類別\",\"edit\":\"編輯 Div\",\"inlineStyleInputLabel\":\"行內樣式\",\"langDirLTRLabel\":\"由左至右 (LTR)\",\"langDirLabel\":\"語言方向\",\"langDirRTLLabel\":\"由右至左 (RTL)\",\"languageCodeInputLabel\":\"語言碼\",\"remove\":\"移除 Div\",\"styleSelectLabel\":\"樣式\",\"title\":\"建立 Div 容器\",\"toolbar\":\"建立 Div 容器\"},\"toolbar\":{\"toolbarCollapse\":\"摺疊工具列\",\"toolbarExpand\":\"展開工具列\",\"toolbarGroups\":{\"document\":\"文件\",\"clipboard\":\"剪貼簿/復原\",\"editing\":\"編輯選項\",\"forms\":\"格式\",\"basicstyles\":\"基本樣式\",\"paragraph\":\"段落\",\"links\":\"連結\",\"insert\":\"插入\",\"styles\":\"樣式\",\"colors\":\"顏色\",\"tools\":\"工具\"},\"toolbars\":\"編輯器工具列\"},\"elementspath\":{\"eleLabel\":\"元件路徑\",\"eleTitle\":\"%1 個元件\"},\"find\":{\"find\":\"尋找\",\"findOptions\":\"尋找選項\",\"findWhat\":\"尋找目標：\",\"matchCase\":\"大小寫須相符\",\"matchCyclic\":\"循環搜尋\",\"matchWord\":\"全字拼寫須相符\",\"notFoundMsg\":\"找不到指定的文字。\",\"replace\":\"取代\",\"replaceAll\":\"全部取代\",\"replaceSuccessMsg\":\"已取代  %1 個指定項目。\",\"replaceWith\":\"取代成：\",\"title\":\"尋找及取代\"},\"fakeobjects\":{\"anchor\":\"錨點\",\"flash\":\"Flash 動畫\",\"hiddenfield\":\"隱藏欄位\",\"iframe\":\"IFrame\",\"unknown\":\"無法辨識的物件\"},\"flash\":{\"access\":\"腳本存取\",\"accessAlways\":\"永遠\",\"accessNever\":\"從不\",\"accessSameDomain\":\"相同網域\",\"alignAbsBottom\":\"絕對下方\",\"alignAbsMiddle\":\"絕對置中\",\"alignBaseline\":\"基準線\",\"alignTextTop\":\"上層文字\",\"bgcolor\":\"背景顏色\",\"chkFull\":\"允許全螢幕\",\"chkLoop\":\"重複播放\",\"chkMenu\":\"啟用 Flash 選單\",\"chkPlay\":\"自動播放\",\"flashvars\":\"Flash 變數\",\"hSpace\":\"HSpace\",\"properties\":\"Flash 屬性​​\",\"propertiesTab\":\"屬性\",\"quality\":\"品質\",\"qualityAutoHigh\":\"自動高\",\"qualityAutoLow\":\"自動低\",\"qualityBest\":\"最佳\",\"qualityHigh\":\"高\",\"qualityLow\":\"低\",\"qualityMedium\":\"中\",\"scale\":\"縮放比例\",\"scaleAll\":\"全部顯示\",\"scaleFit\":\"最適化\",\"scaleNoBorder\":\"無框線\",\"title\":\"Flash 屬性​​\",\"vSpace\":\"VSpace\",\"validateHSpace\":\"HSpace 必須為數字。\",\"validateSrc\":\"URL 不可為空白。\",\"validateVSpace\":\"VSpace  必須為數字。\",\"windowMode\":\"視窗模式\",\"windowModeOpaque\":\"不透明\",\"windowModeTransparent\":\"透明\",\"windowModeWindow\":\"視窗\"},\"font\":{\"fontSize\":{\"label\":\"大小\",\"voiceLabel\":\"字型大小\",\"panelTitle\":\"字型大小\"},\"label\":\"字型\",\"panelTitle\":\"字型名稱\",\"voiceLabel\":\"字型\"},\"forms\":{\"button\":{\"title\":\"按鈕內容\",\"text\":\"顯示文字 (值)\",\"type\":\"類型\",\"typeBtn\":\"按鈕\",\"typeSbm\":\"送出\",\"typeRst\":\"重設\"},\"checkboxAndRadio\":{\"checkboxTitle\":\"核取方塊內容\",\"radioTitle\":\"選項按鈕內容\",\"value\":\"數值\",\"selected\":\"已選\",\"required\":\"必填\"},\"form\":{\"title\":\"表單內容\",\"menu\":\"表單內容\",\"action\":\"動作\",\"method\":\"方式\",\"encoding\":\"編碼\"},\"hidden\":{\"title\":\"隱藏欄位內容\",\"name\":\"名稱\",\"value\":\"數值\"},\"select\":{\"title\":\"選取欄位內容\",\"selectInfo\":\"選擇資訊\",\"opAvail\":\"可用選項\",\"value\":\"數值\",\"size\":\"大小\",\"lines\":\"行數\",\"chkMulti\":\"允許多選\",\"required\":\"必填\",\"opText\":\"文字\",\"opValue\":\"數值\",\"btnAdd\":\"新增\",\"btnModify\":\"修改\",\"btnUp\":\"向上\",\"btnDown\":\"向下\",\"btnSetValue\":\"設為已選\",\"btnDelete\":\"刪除\"},\"textarea\":{\"title\":\"文字區域內容\",\"cols\":\"列\",\"rows\":\"行\"},\"textfield\":{\"title\":\"文字欄位內容\",\"name\":\"名字\",\"value\":\"數值\",\"charWidth\":\"字元寬度\",\"maxChars\":\"最大字元數\",\"required\":\"必填\",\"type\":\"類型\",\"typeText\":\"文字\",\"typePass\":\"密碼\",\"typeEmail\":\"電子郵件\",\"typeSearch\":\"搜尋\",\"typeTel\":\"電話號碼\",\"typeUrl\":\"URL\"}},\"format\":{\"label\":\"格式\",\"panelTitle\":\"段落格式\",\"tag_address\":\"地址\",\"tag_div\":\"標準 (DIV)\",\"tag_h1\":\"標題 1\",\"tag_h2\":\"標題 2\",\"tag_h3\":\"標題 3\",\"tag_h4\":\"標題 4\",\"tag_h5\":\"標題 5\",\"tag_h6\":\"標題 6\",\"tag_p\":\"標準\",\"tag_pre\":\"格式設定\"},\"horizontalrule\":{\"toolbar\":\"插入水平線\"},\"iframe\":{\"border\":\"顯示框架框線\",\"noUrl\":\"請輸入 iframe URL\",\"scrolling\":\"啟用捲軸列\",\"title\":\"IFrame 屬性\",\"toolbar\":\"IFrame\"},\"image\":{\"alt\":\"替代文字\",\"border\":\"框線\",\"btnUpload\":\"傳送到伺服器\",\"button2Img\":\"請問您確定要將「圖片按鈕」轉換成「圖片」嗎？\",\"hSpace\":\"HSpace\",\"img2Button\":\"請問您確定要將「圖片」轉換成「圖片按鈕」嗎？\",\"infoTab\":\"影像資訊\",\"linkTab\":\"連結\",\"lockRatio\":\"固定比例\",\"menu\":\"影像屬性\",\"resetSize\":\"重設大小\",\"title\":\"影像屬性\",\"titleButton\":\"影像按鈕屬性\",\"upload\":\"上傳\",\"urlMissing\":\"遺失圖片來源之 URL \",\"vSpace\":\"VSpace\",\"validateBorder\":\"框線必須是整數。\",\"validateHSpace\":\"HSpace 必須是整數。\",\"validateVSpace\":\"VSpace 必須是整數。\"},\"indent\":{\"indent\":\"增加縮排\",\"outdent\":\"減少縮排\"},\"smiley\":{\"options\":\"表情符號選項\",\"title\":\"插入表情符號\",\"toolbar\":\"表情符號\"},\"justify\":{\"block\":\"左右對齊\",\"center\":\"置中\",\"left\":\"靠左對齊\",\"right\":\"靠右對齊\"},\"language\":{\"button\":\"設定語言\",\"remove\":\"移除語言\"},\"link\":{\"acccessKey\":\"便捷鍵\",\"advanced\":\"進階\",\"advisoryContentType\":\"建議內容類型\",\"advisoryTitle\":\"標題\",\"anchor\":{\"toolbar\":\"錨點\",\"menu\":\"編輯錨點\",\"title\":\"錨點內容\",\"name\":\"錨點名稱\",\"errorName\":\"請輸入錨點名稱\",\"remove\":\"移除錨點\"},\"anchorId\":\"依元件編號\",\"anchorName\":\"依錨點名稱\",\"charset\":\"連結資源的字元集\",\"cssClasses\":\"樣式表類別\",\"emailAddress\":\"電子郵件地址\",\"emailBody\":\"郵件本文\",\"emailSubject\":\"郵件主旨\",\"id\":\"ID\",\"info\":\"連結資訊\",\"langCode\":\"語言碼\",\"langDir\":\"語言方向\",\"langDirLTR\":\"由左至右 (LTR)\",\"langDirRTL\":\"由右至左 (RTL)\",\"menu\":\"編輯連結\",\"name\":\"名稱\",\"noAnchors\":\"(本文件中無可用之錨點)\",\"noEmail\":\"請輸入電子郵件\",\"noUrl\":\"請輸入連結 URL\",\"other\":\"<其他>\",\"popupDependent\":\"獨立 (Netscape)\",\"popupFeatures\":\"快顯視窗功能\",\"popupFullScreen\":\"全螢幕 (IE)\",\"popupLeft\":\"左側位置\",\"popupLocationBar\":\"位置列\",\"popupMenuBar\":\"功能表列\",\"popupResizable\":\"可調大小\",\"popupScrollBars\":\"捲軸\",\"popupStatusBar\":\"狀態列\",\"popupToolbar\":\"工具列\",\"popupTop\":\"頂端位置\",\"rel\":\"關係\",\"selectAnchor\":\"選取一個錨點\",\"styles\":\"樣式\",\"tabIndex\":\"定位順序\",\"target\":\"目標\",\"targetFrame\":\"<框架>\",\"targetFrameName\":\"目標框架名稱\",\"targetPopup\":\"<快顯視窗>\",\"targetPopupName\":\"快顯視窗名稱\",\"title\":\"連結\",\"toAnchor\":\"文字中的錨點連結\",\"toEmail\":\"電子郵件\",\"toUrl\":\"網址\",\"toolbar\":\"連結\",\"type\":\"連結類型\",\"unlink\":\"取消連結\",\"upload\":\"上傳\"},\"list\":{\"bulletedlist\":\"插入/移除項目符號清單\",\"numberedlist\":\"插入/移除編號清單清單\"},\"liststyle\":{\"armenian\":\"亞美尼亞數字\",\"bulletedTitle\":\"項目符號清單屬性\",\"circle\":\"圓圈\",\"decimal\":\"小數點 (1, 2, 3, etc.)\",\"decimalLeadingZero\":\"前綴 0 十位數字 (01, 02, 03, 等)\",\"disc\":\"圓點\",\"georgian\":\"喬治王時代數字 (an, ban, gan, 等)\",\"lowerAlpha\":\"小寫字母 (a, b, c, d, e 等)\",\"lowerGreek\":\"小寫希臘字母 (alpha, beta, gamma, 等)\",\"lowerRoman\":\"小寫羅馬數字 (i, ii, iii, iv, v 等)\",\"none\":\"無\",\"notset\":\"<未設定>\",\"numberedTitle\":\"編號清單屬性\",\"square\":\"方塊\",\"start\":\"開始\",\"type\":\"類型\",\"upperAlpha\":\"大寫字母 (A, B, C, D, E 等)\",\"upperRoman\":\"大寫羅馬數字 (I, II, III, IV, V 等)\",\"validateStartNumber\":\"清單起始號碼須為一完整數字。\"},\"magicline\":{\"title\":\"在此插入段落\"},\"maximize\":{\"maximize\":\"最大化\",\"minimize\":\"最小化\"},\"newpage\":{\"toolbar\":\"新增網頁\"},\"pagebreak\":{\"alt\":\"換頁\",\"toolbar\":\"插入換頁符號以便列印\"},\"pastetext\":{\"button\":\"貼成純文字\",\"title\":\"貼成純文字\"},\"pastefromword\":{\"confirmCleanup\":\"您想貼上的文字似乎是自 Word 複製而來，請問您是否要先清除 Word 的格式後再行貼上？\",\"error\":\"由於發生內部錯誤，無法清除清除 Word 的格式。\",\"title\":\"自 Word 貼上\",\"toolbar\":\"自 Word 貼上\"},\"preview\":{\"preview\":\"預覽\"},\"print\":{\"toolbar\":\"列印\"},\"removeformat\":{\"toolbar\":\"移除格式\"},\"save\":{\"toolbar\":\"儲存\"},\"selectall\":{\"toolbar\":\"全選\"},\"showblocks\":{\"toolbar\":\"顯示區塊\"},\"sourcearea\":{\"toolbar\":\"原始碼\"},\"specialchar\":{\"options\":\"特殊字元選項\",\"title\":\"選取特殊字元\",\"toolbar\":\"插入特殊字元\"},\"scayt\":{\"btn_about\":\"關於即時拼寫檢查\",\"btn_dictionaries\":\"字典\",\"btn_disable\":\"關閉即時拼寫檢查\",\"btn_enable\":\"啟用即時拼寫檢查\",\"btn_langs\":\"語言\",\"btn_options\":\"選項\",\"text_title\":\"即時拼寫檢查\"},\"stylescombo\":{\"label\":\"樣式\",\"panelTitle\":\"格式化樣式\",\"panelTitle1\":\"區塊樣式\",\"panelTitle2\":\"內嵌樣式\",\"panelTitle3\":\"物件樣式\"},\"table\":{\"border\":\"框線大小\",\"caption\":\"標題\",\"cell\":{\"menu\":\"儲存格\",\"insertBefore\":\"前方插入儲存格\",\"insertAfter\":\"後方插入儲存格\",\"deleteCell\":\"刪除儲存格\",\"merge\":\"合併儲存格\",\"mergeRight\":\"向右合併\",\"mergeDown\":\"向下合併\",\"splitHorizontal\":\"水平分割儲存格\",\"splitVertical\":\"垂直分割儲存格\",\"title\":\"儲存格屬性\",\"cellType\":\"儲存格類型\",\"rowSpan\":\"列全長\",\"colSpan\":\"行全長\",\"wordWrap\":\"自動斷行\",\"hAlign\":\"水平對齊\",\"vAlign\":\"垂直對齊\",\"alignBaseline\":\"基準線\",\"bgColor\":\"背景顏色\",\"borderColor\":\"框線顏色\",\"data\":\"資料\",\"header\":\"頁首\",\"yes\":\"是\",\"no\":\"否\",\"invalidWidth\":\"儲存格寬度必須為數字。\",\"invalidHeight\":\"儲存格高度必須為數字。\",\"invalidRowSpan\":\"列全長必須是整數。\",\"invalidColSpan\":\"行全長必須是整數。\",\"chooseColor\":\"選擇\"},\"cellPad\":\"儲存格邊距\",\"cellSpace\":\"儲存格間距\",\"column\":{\"menu\":\"行\",\"insertBefore\":\"左方插入行\",\"insertAfter\":\"右方插入行\",\"deleteColumn\":\"刪除行\"},\"columns\":\"行\",\"deleteTable\":\"刪除表格\",\"headers\":\"頁首\",\"headersBoth\":\"同時\",\"headersColumn\":\"第一行\",\"headersNone\":\"無\",\"headersRow\":\"第一列\",\"invalidBorder\":\"框線大小必須是整數。\",\"invalidCellPadding\":\"儲存格邊距必須為正數。\",\"invalidCellSpacing\":\"儲存格間距必須為正數。\",\"invalidCols\":\"行數須為大於 0 的正整數。\",\"invalidHeight\":\"表格高度必須為數字。\",\"invalidRows\":\"列數須為大於 0 的正整數。\",\"invalidWidth\":\"表格寬度必須為數字。\",\"menu\":\"表格屬性\",\"row\":{\"menu\":\"列\",\"insertBefore\":\"上方插入列\",\"insertAfter\":\"下方插入列\",\"deleteRow\":\"刪除列\"},\"rows\":\"列\",\"summary\":\"總結\",\"title\":\"表格屬性\",\"toolbar\":\"表格\",\"widthPc\":\"百分比\",\"widthPx\":\"像素\",\"widthUnit\":\"寬度單位\"},\"undo\":{\"redo\":\"取消復原\",\"undo\":\"復原\"},\"wsc\":{\"btnIgnore\":\"忽略\",\"btnIgnoreAll\":\"全部忽略\",\"btnReplace\":\"取代\",\"btnReplaceAll\":\"全部取代\",\"btnUndo\":\"復原\",\"changeTo\":\"更改為\",\"errorLoading\":\"無法聯系侍服器: %s.\",\"ieSpellDownload\":\"尚未安裝拼字檢查元件。您是否想要現在下載？\",\"manyChanges\":\"拼字檢查完成：更改了 %1 個單字\",\"noChanges\":\"拼字檢查完成：未更改任何單字\",\"noMispell\":\"拼字檢查完成：未發現拼字錯誤\",\"noSuggestions\":\"- 無建議值 -\",\"notAvailable\":\"抱歉，服務目前暫不可用\",\"notInDic\":\"不在字典中\",\"oneChange\":\"拼字檢查完成：更改了 1 個單字\",\"progress\":\"進行拼字檢查中…\",\"title\":\"拼字檢查\",\"toolbar\":\"拼字檢查\"}};"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"a11yHelp\",function(l){var a=l.lang.a11yhelp,n=CKEDITOR.tools.getNextId(),e={8:a.backspace,9:a.tab,13:a.enter,16:a.shift,17:a.ctrl,18:a.alt,19:a.pause,20:a.capslock,27:a.escape,33:a.pageUp,34:a.pageDown,35:a.end,36:a.home,37:a.leftArrow,38:a.upArrow,39:a.rightArrow,40:a.downArrow,45:a.insert,46:a[\"delete\"],91:a.leftWindowKey,92:a.rightWindowKey,93:a.selectKey,96:a.numpad0,97:a.numpad1,98:a.numpad2,99:a.numpad3,100:a.numpad4,101:a.numpad5,102:a.numpad6,103:a.numpad7,104:a.numpad8,\n105:a.numpad9,106:a.multiply,107:a.add,109:a.subtract,110:a.decimalPoint,111:a.divide,112:a.f1,113:a.f2,114:a.f3,115:a.f4,116:a.f5,117:a.f6,118:a.f7,119:a.f8,120:a.f9,121:a.f10,122:a.f11,123:a.f12,144:a.numLock,145:a.scrollLock,186:a.semiColon,187:a.equalSign,188:a.comma,189:a.dash,190:a.period,191:a.forwardSlash,192:a.graveAccent,219:a.openBracket,220:a.backSlash,221:a.closeBracket,222:a.singleQuote};e[CKEDITOR.ALT]=a.alt;e[CKEDITOR.SHIFT]=a.shift;e[CKEDITOR.CTRL]=a.ctrl;var f=[CKEDITOR.ALT,CKEDITOR.SHIFT,\nCKEDITOR.CTRL],p=/\\$\\{(.*?)\\}/g,t=function(){var a=l.keystrokeHandler.keystrokes,g={},c;for(c in a)g[a[c]]=c;return function(a,c){var b;if(g[c]){b=g[c];for(var h,k,m=[],d=0;d<f.length;d++)k=f[d],h=b/f[d],1<h&&2>=h&&(b-=k,m.push(e[k]));m.push(e[b]||String.fromCharCode(b));b=m.join(\"+\")}else b=a;return b}}();return{title:a.title,minWidth:600,minHeight:400,contents:[{id:\"info\",label:l.lang.common.generalTab,expand:!0,elements:[{type:\"html\",id:\"legends\",style:\"white-space:normal;\",focus:function(){this.getElement().focus()},\nhtml:function(){for(var e='\\x3cdiv class\\x3d\"cke_accessibility_legend\" role\\x3d\"document\" aria-labelledby\\x3d\"'+n+'_arialbl\" tabIndex\\x3d\"-1\"\\x3e%1\\x3c/div\\x3e\\x3cspan id\\x3d\"'+n+'_arialbl\" class\\x3d\"cke_voice_label\"\\x3e'+a.contents+\" \\x3c/span\\x3e\",g=[],c=a.legend,l=c.length,f=0;f<l;f++){for(var b=c[f],h=[],k=b.items,m=k.length,d=0;d<m;d++){var q=k[d],r=q.legend.replace(p,t);r.match(p)||h.push(\"\\x3cdt\\x3e%1\\x3c/dt\\x3e\\x3cdd\\x3e%2\\x3c/dd\\x3e\".replace(\"%1\",q.name).replace(\"%2\",r))}g.push(\"\\x3ch1\\x3e%1\\x3c/h1\\x3e\\x3cdl\\x3e%2\\x3c/dl\\x3e\".replace(\"%1\",\nb.name).replace(\"%2\",h.join(\"\")))}return e.replace(\"%1\",g.join(\"\"))}()+'\\x3cstyle type\\x3d\"text/css\"\\x3e.cke_accessibility_legend{width:600px;height:400px;padding-right:5px;overflow-y:auto;overflow-x:hidden;}.cke_browser_quirks .cke_accessibility_legend,{height:390px}.cke_accessibility_legend *{white-space:normal;}.cke_accessibility_legend h1{font-size: 20px;border-bottom: 1px solid #AAA;margin: 5px 0px 15px;}.cke_accessibility_legend dl{margin-left: 5px;}.cke_accessibility_legend dt{font-size: 13px;font-weight: bold;}.cke_accessibility_legend dd{margin:10px}\\x3c/style\\x3e'}]}],\nbuttons:[CKEDITOR.dialog.cancelButton]}});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt",
    "content": "Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n\ncs.js      Found: 30 Missing: 0\ncy.js      Found: 30 Missing: 0\nda.js      Found: 12 Missing: 18\nde.js      Found: 30 Missing: 0\nel.js      Found: 25 Missing: 5\neo.js      Found: 30 Missing: 0\nfa.js      Found: 30 Missing: 0\nfi.js      Found: 30 Missing: 0\nfr.js      Found: 30 Missing: 0\ngu.js      Found: 12 Missing: 18\nhe.js      Found: 30 Missing: 0\nit.js      Found: 30 Missing: 0\nmk.js      Found: 5 Missing: 25\nnb.js      Found: 30 Missing: 0\nnl.js      Found: 30 Missing: 0\nno.js      Found: 30 Missing: 0\npt-br.js   Found: 30 Missing: 0\nro.js      Found: 6 Missing: 24\ntr.js      Found: 30 Missing: 0\nug.js      Found: 27 Missing: 3\nvi.js      Found: 6 Missing: 24\nzh-cn.js   Found: 30 Missing: 0\n"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/af.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"af\",{title:\"Toeganglikheid instruksies\",contents:\"Hulp inhoud. Druk ESC om toe te maak.\",legend:[{name:\"Algemeen\",items:[{name:\"Bewerker balk\",legend:\"Druk ${toolbarFocus} om op die werkbalk te land. Beweeg na die volgende en voorige wekrbalkgroep met TAB and SHIFT+TAB. Beweeg na die volgende en voorige werkbalkknop met die regter of linker pyl. Druk SPASIE of ENTER om die knop te bevestig.\"},{name:\"Bewerker dialoog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Bewerkerinhoudmenu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pouse\",capslock:\"Hoofletterslot\",escape:\"Ontsnap\",pageUp:\"Blaaiop\",pageDown:\"Blaaiaf\",end:\"Einde\",home:\"Tuis\",leftArrow:\"Linkspyl\",upArrow:\"Oppyl\",rightArrow:\"Regterpyl\",downArrow:\"Afpyl\",insert:\"Toevoeg\",\"delete\":\"Verwyder\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Nommerblok 0\",numpad1:\"Nommerblok 1\",\nnumpad2:\"Nommerblok 2\",numpad3:\"Nommerblok 3\",numpad4:\"Nommerblok 4\",numpad5:\"Nommerblok 5\",numpad6:\"Nommerblok 6\",numpad7:\"Nommerblok 7\",numpad8:\"Nommerblok 8\",numpad9:\"Nommerblok 9\",multiply:\"Maal\",add:\"Plus\",subtract:\"Minus\",decimalPoint:\"Desimaalepunt\",divide:\"Gedeeldeur\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Nommervergrendel\",scrollLock:\"Rolvergrendel\",semiColon:\"Kommapunt\",equalSign:\"Isgelykaan\",comma:\"Komma\",dash:\"Koppelteken\",\nperiod:\"Punt\",forwardSlash:\"Skuinsstreep\",graveAccent:\"Aksentteken\",openBracket:\"Oopblokhakkie\",backSlash:\"Trustreep\",closeBracket:\"Toeblokhakkie\",singleQuote:\"Enkelaanhaalingsteken\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ar\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"عام\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"إضافة\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"تقسيم\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"فاصلة\",dash:\"Dash\",period:\"نقطة\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"bg\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"Общо\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ca\",{title:\"Instruccions d'Accessibilitat\",contents:\"Continguts de l'Ajuda. Per tancar aquest quadre de diàleg premi ESC.\",legend:[{name:\"General\",items:[{name:\"Editor de barra d'eines\",legend:\"Premi ${toolbarFocus} per desplaçar-se per la barra d'eines. Vagi en el següent i anterior grup de barra d'eines amb TAB i SHIFT+TAB. Vagi en el següent i anterior botó de la barra d'eines amb RIGHT ARROW i LEFT ARROW. Premi SPACE o ENTER per activar el botó de la barra d'eines.\"},\n{name:\"Editor de quadre de diàleg\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editor de menú contextual\",legend:\"Premi ${contextMenu} o APPLICATION KEY per obrir el menú contextual. Després desplacis a la següent opció del menú amb TAB o DOWN ARROW. Desplacis a l'anterior opció amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció del menú. Obri el submenú de l'actual opció utilitzant SPACE o ENTER o RIGHT ARROW. Pot tornar a l'opció del menú pare amb ESC o LEFT ARROW. Tanqui el menú contextual amb ESC.\"},\n{name:\"Editor de caixa de llista\",legend:\"Dins d'un quadre de llista, desplacis al següent element de la llista amb TAB o DOWN ARROW. Desplacis a l'anterior element de la llista amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció de la llista. Premi ESC per tancar el quadre de llista.\"},{name:\"Editor de barra de ruta de l'element\",legend:\"Premi ${elementsPathFocus} per anar als elements de la barra de ruta. Desplacis al botó de l'element següent amb TAB o RIGHT ARROW. Desplacis a l'anterior botó amb SHIFT+TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar l'element a l'editor.\"}]},\n{name:\"Ordres\",items:[{name:\"Desfer ordre\",legend:\"Premi ${undo}\"},{name:\"Refer ordre\",legend:\"Premi ${redo}\"},{name:\"Ordre negreta\",legend:\"Premi ${bold}\"},{name:\"Ordre cursiva\",legend:\"Premi ${italic}\"},{name:\"Ordre subratllat\",legend:\"Premi ${underline}\"},{name:\"Ordre enllaç\",legend:\"Premi ${link}\"},{name:\"Ordre amagar barra d'eines\",legend:\"Premi ${toolbarCollapse}\"},{name:\"Ordre per accedir a l'anterior espai enfocat\",legend:\"Premi ${accessPreviousSpace} per accedir a l'enfocament d'espai més proper inabastable abans del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants.\"},\n{name:\"Ordre per accedir al següent espai enfocat\",legend:\"Premi ${accessNextSpace} per accedir a l'enfocament d'espai més proper inabastable després del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants.\"},{name:\"Ajuda d'accessibilitat\",legend:\"Premi ${a11yHelp}\"}]}],backspace:\"Retrocés\",tab:\"Tabulació\",enter:\"Intro\",shift:\"Majúscules\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pausa\",capslock:\"Bloqueig de majúscules\",escape:\"Escape\",\npageUp:\"Pàgina Amunt\",pageDown:\"Pàgina Avall\",end:\"Fi\",home:\"Inici\",leftArrow:\"Fletxa Esquerra\",upArrow:\"Fletxa Amunt\",rightArrow:\"Fletxa Dreta\",downArrow:\"Fletxa Avall\",insert:\"Inserir\",\"delete\":\"Eliminar\",leftWindowKey:\"Tecla Windows Esquerra\",rightWindowKey:\"Tecla Windows Dreta\",selectKey:\"Tecla Seleccionar\",numpad0:\"Teclat Numèric 0\",numpad1:\"Teclat Numèric 1\",numpad2:\"Teclat Numèric 2\",numpad3:\"Teclat Numèric 3\",numpad4:\"Teclat Numèric 4\",numpad5:\"Teclat Numèric 5\",numpad6:\"Teclat Numèric 6\",\nnumpad7:\"Teclat Numèric 7\",numpad8:\"Teclat Numèric 8\",numpad9:\"Teclat Numèric 9\",multiply:\"Multiplicació\",add:\"Suma\",subtract:\"Resta\",decimalPoint:\"Punt Decimal\",divide:\"Divisió\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Bloqueig Teclat Numèric\",scrollLock:\"Bloqueig de Desplaçament\",semiColon:\"Punt i Coma\",equalSign:\"Símbol Igual\",comma:\"Coma\",dash:\"Guió\",period:\"Punt\",forwardSlash:\"Barra Diagonal\",graveAccent:\"Accent Obert\",openBracket:\"Claudàtor Obert\",\nbackSlash:\"Barra Invertida\",closeBracket:\"Claudàtor Tancat\",singleQuote:\"Cometa Simple\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"cs\",{title:\"Instrukce pro přístupnost\",contents:\"Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.\",legend:[{name:\"Obecné\",items:[{name:\"Panel nástrojů editoru\",legend:\"Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT+TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete.\"},{name:\"Dialogové okno editoru\",\nlegend:\"Uvnitř dialogového okna stiskněte TAB pro přesunutí na další prvek okna, stiskněte SHIFT+TAB pro přesun na předchozí prvek okna, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT+F10 pro zaměření seznamu karet, nebo TAB, pro posun podle pořadí karet.Při zaměření seznamu karet se můžete jimi posouvat pomocí ŠIPKY VPRAVO a VLEVO.\"},{name:\"Kontextové menu editoru\",legend:\"Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí  SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC.\"},\n{name:\"Rámeček seznamu editoru\",legend:\"Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT+TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu.\"},{name:\"Lišta cesty prvku v editoru\",legend:\"Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí tlačítko se přesunete pomocí SHIFT+TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru.\"}]},\n{name:\"Příkazy\",items:[{name:\" Příkaz Zpět\",legend:\"Stiskněte ${undo}\"},{name:\" Příkaz Znovu\",legend:\"Stiskněte ${redo}\"},{name:\" Příkaz Tučné\",legend:\"Stiskněte ${bold}\"},{name:\" Příkaz Kurzíva\",legend:\"Stiskněte ${italic}\"},{name:\" Příkaz Podtržení\",legend:\"Stiskněte ${underline}\"},{name:\" Příkaz Odkaz\",legend:\"Stiskněte ${link}\"},{name:\" Příkaz Skrýt panel nástrojů\",legend:\"Stiskněte ${toolbarCollapse}\"},{name:\"Příkaz pro přístup k předchozímu prostoru zaměření\",legend:\"Stiskněte ${accessPreviousSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření před stříškou, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte.\"},\n{name:\"Příkaz pro přístup k dalšímu prostoru zaměření\",legend:\"Stiskněte ${accessNextSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření po stříšce, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte.\"},{name:\" Nápověda přístupnosti\",legend:\"Stiskněte ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tabulátor\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pauza\",capslock:\"Caps lock\",escape:\"Escape\",pageUp:\"Stránka nahoru\",\npageDown:\"Stránka dolů\",end:\"Konec\",home:\"Domů\",leftArrow:\"Šipka vlevo\",upArrow:\"Šipka nahoru\",rightArrow:\"Šipka vpravo\",downArrow:\"Šipka dolů\",insert:\"Vložit\",\"delete\":\"Smazat\",leftWindowKey:\"Levá klávesa Windows\",rightWindowKey:\"Pravá klávesa Windows\",selectKey:\"Vyberte klávesu\",numpad0:\"Numerická klávesa 0\",numpad1:\"Numerická klávesa 1\",numpad2:\"Numerická klávesa 2\",numpad3:\"Numerická klávesa 3\",numpad4:\"Numerická klávesa 4\",numpad5:\"Numerická klávesa 5\",numpad6:\"Numerická klávesa 6\",numpad7:\"Numerická klávesa 7\",\nnumpad8:\"Numerická klávesa 8\",numpad9:\"Numerická klávesa 9\",multiply:\"Numerická klávesa násobení\",add:\"Přidat\",subtract:\"Numerická klávesa odečítání\",decimalPoint:\"Desetinná tečka\",divide:\"Numerická klávesa dělení\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num lock\",scrollLock:\"Scroll lock\",semiColon:\"Středník\",equalSign:\"Rovnítko\",comma:\"Čárka\",dash:\"Pomlčka\",period:\"Tečka\",forwardSlash:\"Lomítko\",graveAccent:\"Přízvuk\",openBracket:\"Otevřená hranatá závorka\",\nbackSlash:\"Obrácené lomítko\",closeBracket:\"Uzavřená hranatá závorka\",singleQuote:\"Jednoduchá uvozovka\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"cy\",{title:\"Canllawiau Hygyrchedd\",contents:\"Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.\",legend:[{name:\"Cyffredinol\",items:[{name:\"Bar Offer y Golygydd\",legend:\"Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT+TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol.\"},{name:\"Deialog y Golygydd\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Dewislen Cyd-destun y Golygydd\",legend:\"Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT+TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC.\"},\n{name:\"Blwch Rhestr y Golygydd\",legend:\"Tu mewn y blwch rhestr, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT+TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr.\"},{name:\"Bar Llwybr Elfen y Golygydd\",legend:\"Pwyswch ${elementsPathFocus} i fynd i'r bar llwybr elfennau. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT+TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd.\"}]},\n{name:\"Gorchmynion\",items:[{name:\"Gorchymyn dadwneud\",legend:\"Pwyswch ${undo}\"},{name:\"Gorchymyn ailadrodd\",legend:\"Pwyswch ${redo}\"},{name:\"Gorchymyn Bras\",legend:\"Pwyswch ${bold}\"},{name:\"Gorchymyn italig\",legend:\"Pwyswch ${italig}\"},{name:\"Gorchymyn tanlinellu\",legend:\"Pwyso ${underline}\"},{name:\"Gorchymyn dolen\",legend:\"Pwyswch ${link}\"},{name:\"Gorchymyn Cwympo'r Dewislen\",legend:\"Pwyswch ${toolbarCollapse}\"},{name:\"Myned i orchymyn bwlch ffocws blaenorol\",legend:\"Pwyswch ${accessPreviousSpace} i fyned i'r \\\"blwch ffocws sydd methu ei gyrraedd\\\" cyn y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. AIladroddwch y cyfuniad allwedd i gyrraedd bylchau ffocws pell.\"},\n{name:\"Ewch i'r gorchymyn blwch ffocws nesaf\",legend:\"Pwyswch ${accessNextSpace} i fyned i'r blwch ffocws agosaf nad oes modd ei gyrraedd ar ôl y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. Ailadroddwch y cyfuniad allwedd i gyrraedd blychau ffocws pell.\"},{name:\"Cymorth Hygyrchedd\",legend:\"Pwyswch ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",\nend:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",\ndivide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/da.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"da\",{title:\"Tilgængelighedsinstrukser\",contents:\"Onlinehjælp. For at lukke dette vindue klik ESC\",legend:[{name:\"Generelt\",items:[{name:\"Editor værktøjslinje\",legend:\"Tryk ${toolbarFocus} for at navigere til værktøjslinjen. Flyt til næste eller forrige værktøjsline gruppe ved hjælp af TAB eller SHIFT+TAB. Flyt til næste eller forrige værktøjslinje knap med venstre- eller højre piltast. Tryk på SPACE eller ENTER for at aktivere værktøjslinje knappen.\"},{name:\"Editor dialogboks\",\nlegend:\"Inde i en dialogboks kan du, trykke på TAB for at navigere til næste element, trykke på SHIFT+TAB for at navigere til forrige element, trykke på ENTER for at afsende eller trykke på ESC for at lukke dialogboksen.\\r\\nNår en dialogboks har flere faner, fanelisten kan tilgås med ALT+F10 eller med TAB. Hvis fanelisten er i fokus kan du skifte til næste eller forrige tab, med højre- og venstre piltast.\"},{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},\n{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},\n{name:\"Kommandoer\",items:[{name:\"Fortryd kommando\",legend:\"Klik på ${undo}\"},{name:\"Gentag kommando\",legend:\"Klik ${redo}\"},{name:\"Fed kommando\",legend:\"Klik ${bold}\"},{name:\"Kursiv kommando\",legend:\"Klik ${italic}\"},{name:\"Understregnings kommando\",legend:\"Klik ${underline}\"},{name:\"Link kommando\",legend:\"Klik ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Klik ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\"Tilgængelighedshjælp\",legend:\"Kilk ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Venstre pil\",\nupArrow:\"Pil op\",rightArrow:\"Højre pil\",downArrow:\"Pil ned\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Venstre Windows tast\",rightWindowKey:\"Højre Windows tast\",selectKey:\"Select-knap\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Gange\",add:\"Plus\",subtract:\"Minus\",decimalPoint:\"Komma\",divide:\"Divider\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",\nf6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semikolon\",equalSign:\"Lighedstegn\",comma:\"Komma\",dash:\"Bindestreg\",period:\"Punktum\",forwardSlash:\"Skråstreg\",graveAccent:\"Accent grave\",openBracket:\"Start klamme\",backSlash:\"Omvendt skråstreg\",closeBracket:\"Slut klamme\",singleQuote:\"Enkelt citationstegn\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/de-ch.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"de-ch\",{title:\"Barrierefreiheitinformationen\",contents:\"Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.\",legend:[{name:\"Allgemein\",items:[{name:\"Editorwerkzeugleiste\",legend:\"Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.\"},\n{name:\"Editordialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editor-Kontextmenü\",legend:\"Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.\"},\n{name:\"Editor-Listenbox\",legend:\"Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.\"},{name:\"Editor-Elementpfadleiste\",legend:\"Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.\"}]},\n{name:\"Befehle\",items:[{name:\"Rückgängig-Befehl\",legend:\"Drücken Sie ${undo}\"},{name:\"Wiederherstellen-Befehl\",legend:\"Drücken Sie ${redo}\"},{name:\"Fettschrift-Befehl\",legend:\"Drücken Sie ${bold}\"},{name:\"Kursiv-Befehl\",legend:\"Drücken Sie ${italic}\"},{name:\"Unterstreichen-Befehl\",legend:\"Drücken Sie ${underline}\"},{name:\"Link-Befehl\",legend:\"Drücken Sie ${link}\"},{name:\"Werkzeugleiste einklappen-Befehl\",legend:\"Drücken Sie ${toolbarCollapse}\"},{name:\"Zugang bisheriger Fokussierung Raumbefehl \",legend:\"Drücken Sie ${accessPreviousSpace}  auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. \"},\n{name:\"Zugang nächster Schwerpunkt Raumbefehl \",legend:\"Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. \"},{name:\"Eingabehilfen\",legend:\"Drücken Sie ${a11yHelp}\"}]}],backspace:\"Rücktaste\",tab:\"Tab\",enter:\"Eingabe\",shift:\"Umschalt\",ctrl:\"Strg\",alt:\"Alt\",pause:\"Pause\",capslock:\"Feststell\",escape:\"Escape\",pageUp:\"Bild auf\",pageDown:\"Bild ab\",\nend:\"Ende\",home:\"Pos1\",leftArrow:\"Linke Pfeiltaste\",upArrow:\"Obere Pfeiltaste\",rightArrow:\"Rechte Pfeiltaste\",downArrow:\"Untere Pfeiltaste\",insert:\"Einfügen\",\"delete\":\"Entfernen\",leftWindowKey:\"Linke Windowstaste\",rightWindowKey:\"Rechte Windowstaste\",selectKey:\"Taste auswählen\",numpad0:\"Ziffernblock 0\",numpad1:\"Ziffernblock 1\",numpad2:\"Ziffernblock 2\",numpad3:\"Ziffernblock 3\",numpad4:\"Ziffernblock 4\",numpad5:\"Ziffernblock 5\",numpad6:\"Ziffernblock 6\",numpad7:\"Ziffernblock 7\",numpad8:\"Ziffernblock 8\",\nnumpad9:\"Ziffernblock 9\",multiply:\"Multiplizieren\",add:\"Addieren\",subtract:\"Subtrahieren\",decimalPoint:\"Punkt\",divide:\"Dividieren\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Ziffernblock feststellen\",scrollLock:\"Rollen\",semiColon:\"Semikolon\",equalSign:\"Gleichheitszeichen\",comma:\"Komma\",dash:\"Bindestrich\",period:\"Punkt\",forwardSlash:\"Schrägstrich\",graveAccent:\"Gravis\",openBracket:\"Öffnende eckige Klammer\",backSlash:\"Rückwärtsgewandter Schrägstrich\",\ncloseBracket:\"Schliessende eckige Klammer\",singleQuote:\"Einfaches Anführungszeichen\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/de.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"de\",{title:\"Barrierefreiheitinformationen\",contents:\"Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.\",legend:[{name:\"Allgemein\",items:[{name:\"Editorwerkzeugleiste\",legend:\"Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.\"},\n{name:\"Editordialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editor-Kontextmenü\",legend:\"Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.\"},\n{name:\"Editor-Listenbox\",legend:\"Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.\"},{name:\"Editor-Elementpfadleiste\",legend:\"Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.\"}]},\n{name:\"Befehle\",items:[{name:\"Rückgängig-Befehl\",legend:\"Drücken Sie ${undo}\"},{name:\"Wiederherstellen-Befehl\",legend:\"Drücken Sie ${redo}\"},{name:\"Fettschrift-Befehl\",legend:\"Drücken Sie ${bold}\"},{name:\"Kursiv-Befehl\",legend:\"Drücken Sie ${italic}\"},{name:\"Unterstreichen-Befehl\",legend:\"Drücken Sie ${underline}\"},{name:\"Link-Befehl\",legend:\"Drücken Sie ${link}\"},{name:\"Werkzeugleiste einklappen-Befehl\",legend:\"Drücken Sie ${toolbarCollapse}\"},{name:\"Zugang bisheriger Fokussierung Raumbefehl \",legend:\"Drücken Sie ${accessPreviousSpace}  auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. \"},\n{name:\"Zugang nächster Schwerpunkt Raumbefehl \",legend:\"Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. \"},{name:\"Eingabehilfen\",legend:\"Drücken Sie ${a11yHelp}\"}]}],backspace:\"Rücktaste\",tab:\"Tab\",enter:\"Eingabe\",shift:\"Umschalt\",ctrl:\"Strg\",alt:\"Alt\",pause:\"Pause\",capslock:\"Feststell\",escape:\"Escape\",pageUp:\"Bild auf\",pageDown:\"Bild ab\",\nend:\"Ende\",home:\"Pos1\",leftArrow:\"Linke Pfeiltaste\",upArrow:\"Obere Pfeiltaste\",rightArrow:\"Rechte Pfeiltaste\",downArrow:\"Untere Pfeiltaste\",insert:\"Einfügen\",\"delete\":\"Entfernen\",leftWindowKey:\"Linke Windowstaste\",rightWindowKey:\"Rechte Windowstaste\",selectKey:\"Taste auswählen\",numpad0:\"Ziffernblock 0\",numpad1:\"Ziffernblock 1\",numpad2:\"Ziffernblock 2\",numpad3:\"Ziffernblock 3\",numpad4:\"Ziffernblock 4\",numpad5:\"Ziffernblock 5\",numpad6:\"Ziffernblock 6\",numpad7:\"Ziffernblock 7\",numpad8:\"Ziffernblock 8\",\nnumpad9:\"Ziffernblock 9\",multiply:\"Multiplizieren\",add:\"Addieren\",subtract:\"Subtrahieren\",decimalPoint:\"Punkt\",divide:\"Dividieren\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Ziffernblock feststellen\",scrollLock:\"Rollen\",semiColon:\"Semikolon\",equalSign:\"Gleichheitszeichen\",comma:\"Komma\",dash:\"Bindestrich\",period:\"Punkt\",forwardSlash:\"Schrägstrich\",graveAccent:\"Gravis\",openBracket:\"Öffnende eckige Klammer\",backSlash:\"Rückwärtsgewandter Schrägstrich\",\ncloseBracket:\"Schließende eckige Klammer\",singleQuote:\"Einfaches Anführungszeichen\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/el.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"el\",{title:\"Οδηγίες Προσβασιμότητας\",contents:\"Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.\",legend:[{name:\"Γενικά\",items:[{name:\"Εργαλειοθήκη Επεξεργαστή\",legend:\"Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και SHIFT+TAB. Μετακινηθείτε ανάμεσα στα κουμπιά εργαλείων με το ΔΕΞΙ ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου.\"},{name:\"Παράθυρο Διαλόγου Επεξεργαστή\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Αναδυόμενο Μενού Επεξεργαστή\",legend:\"Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με  TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με το ESC ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC.\"},\n{name:\"Κουτί Λίστας Επεξεργαστών\",legend:\"Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας.\"},{name:\"Μπάρα Διαδρομών Στοιχείων Επεξεργαστή\",legend:\"Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή.\"}]},\n{name:\"Εντολές\",items:[{name:\"Εντολή αναίρεσης\",legend:\"Πατήστε ${undo}\"},{name:\"Εντολή επανάληψης\",legend:\"Πατήστε ${redo}\"},{name:\"Εντολή έντονης γραφής\",legend:\"Πατήστε ${bold}\"},{name:\"Εντολή πλάγιας γραφής\",legend:\"Πατήστε ${italic}\"},{name:\"Εντολή υπογράμμισης\",legend:\"Πατήστε ${underline}\"},{name:\"Εντολή συνδέσμου\",legend:\"Πατήστε ${link}\"},{name:\"Εντολή Σύμπτηξης Εργαλειοθήκης\",legend:\"Πατήστε ${toolbarCollapse}\"},{name:\"Πρόσβαση στην προηγούμενη εντολή του χώρου εστίασης \",legend:\"Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. \"},\n{name:\"Πρόσβαση στην επόμενη εντολή του χώρου εστίασης\",legend:\"Πατήστε ${accessNextSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. \"},{name:\"Βοήθεια Προσβασιμότητας\",legend:\"Πατήστε ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",\nend:\"End\",home:\"Home\",leftArrow:\"Αριστερό Βέλος\",upArrow:\"Πάνω Βέλος\",rightArrow:\"Δεξί Βέλος\",downArrow:\"Κάτω Βέλος\",insert:\"Insert \",\"delete\":\"Delete\",leftWindowKey:\"Αριστερό Πλήκτρο Windows\",rightWindowKey:\"Δεξί Πλήκτρο Windows\",selectKey:\"Πλήκτρο Select\",numpad0:\"Αριθμητικό πληκτρολόγιο 0\",numpad1:\"Αριθμητικό Πληκτρολόγιο 1\",numpad2:\"Αριθμητικό πληκτρολόγιο 2\",numpad3:\"Αριθμητικό πληκτρολόγιο 3\",numpad4:\"Αριθμητικό πληκτρολόγιο 4\",numpad5:\"Αριθμητικό πληκτρολόγιο 5\",numpad6:\"Αριθμητικό πληκτρολόγιο 6\",\nnumpad7:\"Αριθμητικό πληκτρολόγιο 7\",numpad8:\"Αριθμητικό πληκτρολόγιο 8\",numpad9:\"Αριθμητικό πληκτρολόγιο 9\",multiply:\"Πολλαπλασιασμός\",add:\"Πρόσθεση\",subtract:\"Αφαίρεση\",decimalPoint:\"Υποδιαστολή\",divide:\"Διαίρεση\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"6\",f7:\"7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Ερωτηματικό\",equalSign:\"Σύμβολο Ισότητας\",comma:\"Κόμμα\",dash:\"Παύλα\",period:\"Τελεία\",forwardSlash:\"Κάθετος\",graveAccent:\"Βαρεία\",openBracket:\"Άνοιγμα Παρένθεσης\",\nbackSlash:\"Ανάστροφη Κάθετος\",closeBracket:\"Κλείσιμο Παρένθεσης\",singleQuote:\"Απόστροφος\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"en-gb\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"General\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/en.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"en\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"General\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"eo\",{title:\"Uzindikoj pri atingeblo\",contents:\"Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.\",legend:[{name:\"Ĝeneralaĵoj\",items:[{name:\"Ilbreto de la redaktilo\",legend:\"Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA+TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon.\"},\n{name:\"Redaktildialogo\",legend:\"En dialogo, premu la TABAN klavon por navigi al la sekva dialogelemento, premu la MAJUSKLIGAN+TABAN klavon por iri al la antaŭa dialogelemento, premu la ENEN klavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Kiam dialogo havas multajn langetojn, eblas atingi la langetliston aŭ per ALT+F10 aŭ per la TABA klavo kiel parton de la dialoga taba ordo. En langetlisto, moviĝu al la sekva kaj antaŭa langeto per la klavoj SAGO DEKSTREN KAJ MALDEKSTREN respektive.\"},\n{name:\"Kunteksta menuo de la redaktilo\",legend:\"Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo.\"},\n{name:\"Fallisto de la redaktilo\",legend:\"En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon.\"},{name:\"Breto indikanta la vojon al la redaktilelementoj\",legend:\"Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo.\"}]},\n{name:\"Komandoj\",items:[{name:\"Komando malfari\",legend:\"Premu ${undo}\"},{name:\"Komando refari\",legend:\"Premu ${redo}\"},{name:\"Komando grasa\",legend:\"Premu ${bold}\"},{name:\"Komando kursiva\",legend:\"Premu ${italic}\"},{name:\"Komando substreki\",legend:\"Premu ${underline}\"},{name:\"Komando ligilo\",legend:\"Premu ${link}\"},{name:\"Komando faldi la ilbreton\",legend:\"Premu ${toolbarCollapse}\"},{name:\"Komando por atingi la antaŭan fokusan spacon\",legend:\"Press ${accessPreviousSpace} por atingi la plej proksiman neatingeblan fokusan spacon antaŭ la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinaĵon por atingi malproksimajn fokusajn spacojn.\"},\n{name:\"Komando por atingi la sekvan fokusan spacon\",legend:\"Press ${accessNextSpace} por atingi la plej proksiman neatingeblan fokusan spacon post la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinajôn por atingi malproksimajn fokusajn spacojn\"},{name:\"Helpilo pri atingeblo\",legend:\"Premu ${a11yHelp}\"}]}],backspace:\"Retropaŝo\",tab:\"Tabo\",enter:\"Enigi\",shift:\"Registrumo\",ctrl:\"Stirklavo\",alt:\"Alt-klavo\",pause:\"Paŭzo\",capslock:\"Majuskla baskulo\",escape:\"Eskapa klavo\",pageUp:\"Antaŭa Paĝo\",\npageDown:\"Sekva Paĝo\",end:\"Fino\",home:\"Hejmo\",leftArrow:\"Sago Maldekstren\",upArrow:\"Sago Supren\",rightArrow:\"Sago Dekstren\",downArrow:\"Sago Suben\",insert:\"Enmeti\",\"delete\":\"Forigi\",leftWindowKey:\"Maldekstra Windows-klavo\",rightWindowKey:\"Dekstra Windows-klavo\",selectKey:\"Selektklavo\",numpad0:\"Nombra Klavaro 0\",numpad1:\"Nombra Klavaro 1\",numpad2:\"Nombra Klavaro 2\",numpad3:\"Nombra Klavaro 3\",numpad4:\"Nombra Klavaro 4\",numpad5:\"Nombra Klavaro 5\",numpad6:\"Nombra Klavaro 6\",numpad7:\"Nombra Klavaro 7\",\nnumpad8:\"Nombra Klavaro 8\",numpad9:\"Nombra Klavaro 9\",multiply:\"Obligi\",add:\"Almeti\",subtract:\"Subtrahi\",decimalPoint:\"Dekuma Punkto\",divide:\"Dividi\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Nombra Baskulo\",scrollLock:\"Ruluma Baskulo\",semiColon:\"Punktokomo\",equalSign:\"Egalsigno\",comma:\"Komo\",dash:\"Haltostreko\",period:\"Punkto\",forwardSlash:\"Oblikvo\",graveAccent:\"Malakuto\",openBracket:\"Malferma Krampo\",backSlash:\"Retroklino\",closeBracket:\"Ferma Krampo\",\nsingleQuote:\"Citilo\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/es.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"es\",{title:\"Instrucciones de accesibilidad\",contents:\"Ayuda. Para cerrar presione ESC.\",legend:[{name:\"General\",items:[{name:\"Barra de herramientas del editor\",legend:'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY+TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona \"espacio\" o \"intro\" para activar la herramienta.'},{name:\"Editor de diálogo\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editor del menú contextual\",legend:\"Presiona ${contextMenu} o TECLA MENÚ para abrir el menú contextual. Entonces muévete a la siguiente opción del menú con TAB o FLECHA ABAJO. Muévete a la opción previa con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para seleccionar la opción del menú. Abre el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Regresa al elemento padre del menú con ESC o FLECHA IZQUIERDA. Cierra el menú contextual con ESC.\"},\n{name:\"Lista del Editor\",legend:\"Dentro de una lista, te mueves al siguiente elemento de la lista con TAB o FLECHA ABAJO. Te mueves al elemento previo de la lista con SHIFT+TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para elegir la opción de la lista. Presiona ESC para cerrar la lista.\"},{name:\"Barra de Ruta del Elemento en el Editor\",legend:\"Presiona ${elementsPathFocus} para navegar a los elementos de la barra de ruta. Te mueves al siguiente elemento botón con TAB o FLECHA DERECHA. Te mueves al botón previo con SHIFT+TAB o FLECHA IZQUIERDA. Presiona ESPACIO o ENTER para seleccionar el elemento en el editor.\"}]},\n{name:\"Comandos\",items:[{name:\"Comando deshacer\",legend:\"Presiona ${undo}\"},{name:\"Comando rehacer\",legend:\"Presiona ${redo}\"},{name:\"Comando negrita\",legend:\"Presiona ${bold}\"},{name:\"Comando itálica\",legend:\"Presiona ${italic}\"},{name:\"Comando subrayar\",legend:\"Presiona ${underline}\"},{name:\"Comando liga\",legend:\"Presiona ${liga}\"},{name:\"Comando colapsar barra de herramientas\",legend:\"Presiona ${toolbarCollapse}\"},{name:\"Comando accesar el anterior espacio de foco\",legend:\"Presiona ${accessPreviousSpace} para accesar el espacio de foco no disponible más cercano anterior al cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes.\"},\n{name:\"Comando accesar el siguiente spacio de foco\",legend:\"Presiona ${accessNextSpace} para accesar el espacio de foco no disponible más cercano después del cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes.\"},{name:\"Ayuda de Accesibilidad\",legend:\"Presiona ${a11yHelp}\"}]}],backspace:\"Retroceso\",tab:\"Tabulador\",enter:\"Ingresar\",shift:\"Mayús.\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pausa\",capslock:\"Bloq. Mayús.\",escape:\"Escape\",pageUp:\"Regresar Página\",\npageDown:\"Avanzar Página\",end:\"Fin\",home:\"Inicio\",leftArrow:\"Flecha Izquierda\",upArrow:\"Flecha Arriba\",rightArrow:\"Flecha Derecha\",downArrow:\"Flecha Abajo\",insert:\"Insertar\",\"delete\":\"Suprimir\",leftWindowKey:\"Tecla Windows Izquierda\",rightWindowKey:\"Tecla Windows Derecha\",selectKey:\"Tecla de Selección\",numpad0:\"Tecla 0 del teclado numérico\",numpad1:\"Tecla 1 del teclado numérico\",numpad2:\"Tecla 2 del teclado numérico\",numpad3:\"Tecla 3 del teclado numérico\",numpad4:\"Tecla 4 del teclado numérico\",numpad5:\"Tecla 5 del teclado numérico\",\nnumpad6:\"Tecla 6 del teclado numérico\",numpad7:\"Tecla 7 del teclado numérico\",numpad8:\"Tecla 8 del teclado numérico\",numpad9:\"Tecla 9 del teclado numérico\",multiply:\"Multiplicar\",add:\"Sumar\",subtract:\"Restar\",decimalPoint:\"Punto Decimal\",divide:\"Dividir\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Punto y coma\",equalSign:\"Signo de Igual\",comma:\"Coma\",dash:\"Guión\",period:\"Punto\",forwardSlash:\"Diagonal\",\ngraveAccent:\"Acento Grave\",openBracket:\"Abrir llave\",backSlash:\"Diagonal Invertida\",closeBracket:\"Cerrar llave\",singleQuote:\"Comillas simples\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/et.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"et\",{title:\"Accessibility Instructions\",contents:\"Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.\",legend:[{name:\"Üldine\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/eu.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"eu\",{title:\"Erabilerraztasunaren argibideak\",contents:\"Laguntzaren edukiak. Elkarrizketa-koadro hau ixteko sakatu ESC.\",legend:[{name:\"Orokorra\",items:[{name:\"Editorearen tresna-barra\",legend:\"Sakatu ${toolbarFocus} tresna-barrara nabigatzeko. Tresna-barrako aurreko eta hurrengo taldera joateko erabili TAB eta MAIUS+TAB. Tresna-barrako aurreko eta hurrengo botoira joateko erabili ESKUIN-GEZIA eta EZKER-GEZIA. Sakatu ZURIUNEA edo SARTU tresna-barrako botoia aktibatzeko.\"},\n{name:\"Editorearen elkarrizketa-koadroa\",legend:\"Elkarrizketa-koadro baten barruan sakatu TAB hurrengo elementura nabigatzeko, sakatu MAIUS+TAB aurreko elementura joateko, sakatu SARTU elkarrizketa-koadroa bidaltzeko eta sakatu ESC uzteko. Elkarrizketa-koadro batek hainbat fitxa dituenean, ALT+F10 erabiliz irits daiteke fitxen zerrendara, edo TAB erabiliz. Fokoa fitxen zerrendak duenean, aurreko eta hurrengo fitxetara joateko erabili EZKER-GEZIA eta ESKUIN-GEZIA.\"},{name:\"Editorearen testuinguru-menua\",\nlegend:\"Sakatu ${contextMenu} edo APLIKAZIO TEKLA testuinguru-menua irekitzeko. Menuko hurrengo aukerara joateko erabili TAB edo BEHERA GEZIA. Aurreko aukerara nabigatzeko erabili MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU menuko aukera hautatzeko. Ireki uneko aukeraren azpi-menua ZURIUNEA edo SARTU edo ESKUIN-GEZIA erabiliz. Menuko aukera gurasora itzultzeko erabili ESC edo EZKER-GEZIA. Testuinguru-menua ixteko sakatu ESC.\"},{name:\"Editorearen zerrenda-koadroa\",legend:\"Zerrenda-koadro baten barruan, zerrendako hurrengo elementura joateko erabili TAB edo BEHERA GEZIA. Zerrendako aurreko elementura nabigatzeko MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU zerrendako aukera hautatzeko. Sakatu ESC zerrenda-koadroa ixteko.\"},\n{name:\"Editorearen elementuaren bide-barra\",legend:\"Sakatu ${elementsPathFocus} elementuaren bide-barrara nabigatzeko. Hurrengo elementuaren botoira joateko erabili TAB edo ESKUIN-GEZIA. Aurreko botoira joateko aldiz erabili MAIUS+TAB edo EZKER-GEZIA. Elementua editorean hautatzeko sakatu ZURIUNEA edo SARTU.\"}]},{name:\"Komandoak\",items:[{name:\"Desegin komandoa\",legend:\"Sakatu ${undo}\"},{name:\"Berregin komandoa\",legend:\"Sakatu ${redo}\"},{name:\"Lodia komandoa\",legend:\"Sakatu ${bold}\"},{name:\"Etzana komandoa\",\nlegend:\"Sakatu ${italic}\"},{name:\"Azpimarratu komandoa\",legend:\"Sakatu ${underline}\"},{name:\"Esteka komandoa\",legend:\"Sakatu ${link}\"},{name:\"Tolestu tresna-barra komandoa\",legend:\"Sakatu ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\"Erabilerraztasunaren laguntza\",legend:\"Sakatu ${a11yHelp}\"}]}],backspace:\"Atzera tekla\",tab:\"Tabuladorea\",enter:\"Sartu\",shift:\"Maius\",ctrl:\"Ktrl\",alt:\"Alt\",pause:\"Pausatu\",capslock:\"Blok Maius\",escape:\"Ihes\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"Buka\",home:\"Etxea\",leftArrow:\"Ezker-gezia\",upArrow:\"Gora gezia\",rightArrow:\"Eskuin-gezia\",downArrow:\"Behera gezia\",insert:\"Txertatu\",\"delete\":\"Ezabatu\",leftWindowKey:\"Ezkerreko Windows tekla\",rightWindowKey:\"Eskuineko Windows tekla\",selectKey:\"Hautatu tekla\",\nnumpad0:\"Zenbakizko teklatua 0\",numpad1:\"Zenbakizko teklatua 1\",numpad2:\"Zenbakizko teklatua 2\",numpad3:\"Zenbakizko teklatua 3\",numpad4:\"Zenbakizko teklatua 4\",numpad5:\"Zenbakizko teklatua 5\",numpad6:\"Zenbakizko teklatua 6\",numpad7:\"Zenbakizko teklatua 7\",numpad8:\"Zenbakizko teklatua 8\",numpad9:\"Zenbakizko teklatua 9\",multiply:\"Biderkatu\",add:\"Gehitu\",subtract:\"Kendu\",decimalPoint:\"Koma hamartarra\",divide:\"Zatitu\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",\nf12:\"F12\",numLock:\"Blok Zenb\",scrollLock:\"Blok Korr\",semiColon:\"Puntu eta koma\",equalSign:\"Berdin zeinua\",comma:\"Koma\",dash:\"Marratxoa\",period:\"Puntua\",forwardSlash:\"Barra\",graveAccent:\"Azentu kamutsa\",openBracket:\"Parentesia ireki\",backSlash:\"Alderantzizko barra\",closeBracket:\"Itxi parentesia\",singleQuote:\"Komatxo bakuna\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"fa\",{title:\"دستورالعمل‌های دسترسی\",contents:\"راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.\",legend:[{name:\"عمومی\",items:[{name:\"نوار ابزار ویرایشگر\",legend:\"${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shift+Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهت‌نمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید.\"},{name:\"پنجره محاورهای ویرایشگر\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"منوی متنی ویرایشگر\",legend:\"${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc.\"},\n{name:\"جعبه فهرست ویرایشگر\",legend:\"در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید.\"},{name:\"ویرایشگر عنصر نوار راه\",legend:\"برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر.\"}]},\n{name:\"فرمان‌ها\",items:[{name:\"بازگشت به آخرین فرمان\",legend:\"فشردن ${undo}\"},{name:\"انجام مجدد فرمان\",legend:\"فشردن ${redo}\"},{name:\"فرمان درشت کردن متن\",legend:\"فشردن ${bold}\"},{name:\"فرمان کج کردن متن\",legend:\"فشردن ${italic}\"},{name:\"فرمان زیرخطدار کردن متن\",legend:\"فشردن ${underline}\"},{name:\"فرمان پیوند دادن\",legend:\"فشردن ${link}\"},{name:\"بستن نوار ابزار فرمان\",legend:\"فشردن ${toolbarCollapse}\"},{name:\"دسترسی به فرمان محل تمرکز قبلی\",legend:\"فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور.\"},\n{name:\"دسترسی به فضای دستور بعدی\",legend:\"برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال:  دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید.\"},{name:\"راهنمای دسترسی\",legend:\"فشردن ${a11yHelp}\"}]}],backspace:\"عقبگرد\",tab:\"برگه\",enter:\"ورود\",shift:\"تعویض\",ctrl:\"کنترل\",alt:\"دگرساز\",pause:\"توقف\",capslock:\"Caps Lock\",escape:\"گریز\",pageUp:\"صفحه به بالا\",pageDown:\"صفحه به پایین\",end:\"پایان\",home:\"خانه\",leftArrow:\"پیکان چپ\",\nupArrow:\"پیکان بالا\",rightArrow:\"پیکان راست\",downArrow:\"پیکان پایین\",insert:\"ورود\",\"delete\":\"حذف\",leftWindowKey:\"کلید چپ ویندوز\",rightWindowKey:\"کلید راست ویندوز\",selectKey:\"انتخاب کلید\",numpad0:\"کلید شماره 0\",numpad1:\"کلید شماره 1\",numpad2:\"کلید شماره 2\",numpad3:\"کلید شماره 3\",numpad4:\"کلید شماره 4\",numpad5:\"کلید شماره 5\",numpad6:\"کلید شماره 6\",numpad7:\"کلید شماره 7\",numpad8:\"کلید شماره 8\",numpad9:\"کلید شماره 9\",multiply:\"ضرب\",add:\"افزودن\",subtract:\"تفریق\",decimalPoint:\"نقطه‌ی اعشار\",divide:\"جدا کردن\",\nf1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"علامت تساوی\",comma:\"کاما\",dash:\"خط تیره\",period:\"دوره\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"fi\",{title:\"Saavutettavuus ohjeet\",contents:\"Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.\",legend:[{name:\"Yleinen\",items:[{name:\"Editorin työkalupalkki\",legend:\"Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT+TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen.\"},\n{name:\"Editorin dialogi\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editorin oheisvalikko\",legend:\"Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella.\"},\n{name:\"Editorin listalaatikko\",legend:\"Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon.\"},{name:\"Editorin elementtipolun palkki\",legend:\"Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa.\"}]},\n{name:\"Komennot\",items:[{name:\"Peruuta komento\",legend:\"Paina ${undo}\"},{name:\"Tee uudelleen komento\",legend:\"Paina ${redo}\"},{name:\"Lihavoi komento\",legend:\"Paina ${bold}\"},{name:\"Kursivoi komento\",legend:\"Paina ${italic}\"},{name:\"Alleviivaa komento\",legend:\"Paina ${underline}\"},{name:\"Linkki komento\",legend:\"Paina ${link}\"},{name:\"Pienennä työkalupalkki komento\",legend:\"Paina ${toolbarCollapse}\"},{name:\"Siirry aiempaan fokustilaan komento\",legend:\"Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin edellä olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin.\"},\n{name:\"Siirry seuraavaan fokustilaan komento\",legend:\"Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin jälkeen olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin.\"},{name:\"Saavutettavuus ohjeet\",legend:\"Paina ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",\nend:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numeronäppäimistö 0\",numpad1:\"Numeronäppäimistö 1\",numpad2:\"Numeronäppäimistö 2\",numpad3:\"Numeronäppäimistö 3\",numpad4:\"Numeronäppäimistö 4\",numpad5:\"Numeronäppäimistö 5\",numpad6:\"Numeronäppäimistö 6\",numpad7:\"Numeronäppäimistö 7\",numpad8:\"Numeronäppäimistö 8\",\nnumpad9:\"Numeronäppäimistö 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Puolipiste\",equalSign:\"Equal Sign\",comma:\"Pilkku\",dash:\"Dash\",period:\"Piste\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/fo.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"fo\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"General\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Falda\",add:\"Pluss\",subtract:\"Frádráttar\",decimalPoint:\"Decimal Point\",divide:\"Býta\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semikolon\",equalSign:\"Javnatekn\",comma:\"Komma\",dash:\"Dash\",period:\"Punktum\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"fr-ca\",{title:\"Instructions d'accessibilité\",contents:\"Contenu de l'aide.  Pour fermer cette fenêtre, appuyez sur ESC.\",legend:[{name:\"Général\",items:[{name:\"Barre d'outil de l'éditeur\",legend:\"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT+TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils.\"},\n{name:\"Dialogue de l'éditeur\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Menu contextuel de l'éditeur\",legend:\"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC.\"},\n{name:\"Menu déroulant de l'éditeur\",legend:\"A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT+TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant.\"},{name:\"Barre d'emplacement des éléments de l'éditeur\",legend:\"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur.\"}]},\n{name:\"Commandes\",items:[{name:\"Annuler\",legend:\"Appuyer sur ${undo}\"},{name:\"Refaire\",legend:\"Appuyer sur ${redo}\"},{name:\"Gras\",legend:\"Appuyer sur ${bold}\"},{name:\"Italique\",legend:\"Appuyer sur ${italic}\"},{name:\"Souligné\",legend:\"Appuyer sur ${underline}\"},{name:\"Lien\",legend:\"Appuyer sur ${link}\"},{name:\"Enrouler la barre d'outils\",legend:\"Appuyer sur ${toolbarCollapse}\"},{name:\"Accéder à l'objet de focus précédent\",legend:\"Appuyer ${accessPreviousSpace} pour accéder au prochain espace disponible avant le curseur, par exemple: deux éléments HR adjacents.  Répéter la combinaison pour joindre les éléments d'espaces distantes.\"},\n{name:\"Accéder au prochain objet de focus\",legend:\"Appuyer ${accessNextSpace} pour accéder au prochain espace disponible après le curseur, par exemple: deux éléments HR adjacents.  Répéter la combinaison pour joindre les éléments d'espaces distantes.\"},{name:\"Aide d'accessibilité\",legend:\"Appuyer sur ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",\nleftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",\nf2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"fr\",{title:\"Instructions d'accessibilité\",contents:\"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche ÉCHAP (Echappement).\",legend:[{name:\"Général\",items:[{name:\"Barre d'outils de l'éditeur\",legend:\"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches MAJ et MAJ+TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLÈCHE DROITE et FLÈCHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRÉE pour activer le bouton de barre d'outils.\"},\n{name:\"Dialogue de l'éditeur\",legend:\"Dans un dialogue, appuyer sur TAB pour aller à l'élément suivant du dialogue, appuyer sur MAJ+TAB pour aller à l'élément précédent du dialogue, appuyer sur ECHAP pour annuler le dialogue. Quand un dialogue a de multiples onglets, on peut accéder à la liste des onglets avec ALT+F10 ou avec TAB. Dans la liste des onglets, se déplacer vers le suivant ou le précédent avec les FLECHES DROITE et GAUCHE respectivement.\"},{name:\"Menu contextuel de l'éditeur\",legend:\"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLÈCHE BAS. Se déplacer vers l'option précédente avec les touches  MAJ+TAB ou FLÈCHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTRÉE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTRÉE ou FLÈCHE DROITE. Revenir à l'élément de menu parent avec les touches ÉCHAP ou FLÈCHE GAUCHE. Fermer le menu contextuel avec ÉCHAP.\"},\n{name:\"Zone de liste de l'éditeur\",legend:\"Dans la liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLÈCHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches MAJ+TAB ou FLÈCHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTRÉE pour sélectionner l'option dans la liste. Appuyer sur ÉCHAP pour fermer le menu déroulant.\"},{name:\"Barre d'emplacement des éléments de l'éditeur\",legend:\"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de l'éditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLÈCHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches MAJ+TAB ou FLÈCHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTRÉE pour sélectionner l'élément dans l'éditeur.\"}]},\n{name:\"Commandes\",items:[{name:\" Annuler la commande\",legend:\"Appuyer sur ${undo}\"},{name:\"Refaire la commande\",legend:\"Appuyer sur ${redo}\"},{name:\" Commande gras\",legend:\"Appuyer sur ${bold}\"},{name:\" Commande italique\",legend:\"Appuyer sur ${italic}\"},{name:\" Commande souligné\",legend:\"Appuyer sur ${underline}\"},{name:\" Commande lien\",legend:\"Appuyer sur ${link}\"},{name:\" Commande enrouler la barre d'outils\",legend:\"Appuyer sur ${toolbarCollapse}\"},{name:\"Accéder à la précédente commande d'espace de mise au point\",\nlegend:\"Appuyez sur ${accessPreviousSpace} pour accéder à l'espace hors d'atteinte le plus proche avant le caret, par exemple: deux éléments HR adjacents. Répétez la combinaison de touches pour atteindre les espaces de mise au point distants.\"},{name:\"Accès à la prochaine commande de l'espace de mise au point\",legend:\"Appuyez sur ${accessNextSpace} pour accéder au plus proche espace de mise au point hors d'atteinte après le caret, par exemple: deux éléments HR adjacents. répétez la combinaison de touches pour atteindre les espace de mise au point distants.\"},\n{name:\" Aide Accessibilité\",legend:\"Appuyer sur ${a11yHelp}\"}]}],backspace:\"Retour arrière\",tab:\"Tabulation\",enter:\"Entrée\",shift:\"Majuscule\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Verr. Maj.\",escape:\"Échap\",pageUp:\"Page supérieure\",pageDown:\"Page inférieure\",end:\"Fin\",home:\"Retour\",leftArrow:\"Flèche gauche\",upArrow:\"Flèche haute\",rightArrow:\"Flèche droite\",downArrow:\"Flèche basse\",insert:\"Insertion\",\"delete\":\"Supprimer\",leftWindowKey:\"Touche Windows gauche\",rightWindowKey:\"Touche Windows droite\",\nselectKey:\"Touche menu\",numpad0:\"Pavé numérique 0\",numpad1:\"Pavé numérique 1\",numpad2:\"Pavé numérique 2\",numpad3:\"Pavé numérique 3\",numpad4:\"Pavé numérique 4\",numpad5:\"Pavé numérique 5\",numpad6:\"Pavé numérique 6\",numpad7:\"Pavé numérique 7\",numpad8:\"Pavé numérique 8\",numpad9:\"Pavé numérique 9\",multiply:\"Multiplier\",add:\"Addition\",subtract:\"Soustraire\",decimalPoint:\"Point décimal\",divide:\"Diviser\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",\nnumLock:\"Verrouillage numérique\",scrollLock:\"Arrêt défilement\",semiColon:\"Point virgule\",equalSign:\"Signe égal\",comma:\"Virgule\",dash:\"Tiret\",period:\"Point\",forwardSlash:\"Barre oblique\",graveAccent:\"Accent grave\",openBracket:\"Parenthèse ouvrante\",backSlash:\"Barre oblique inverse\",closeBracket:\"Parenthèse fermante\",singleQuote:\"Apostrophe\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"gl\",{title:\"Instrucións de accesibilidade\",contents:\"Axuda. Para pechar este diálogo prema ESC.\",legend:[{name:\"Xeral\",items:[{name:\"Barra de ferramentas do editor\",legend:\"Prema ${toolbarFocus} para navegar pola barra de ferramentas. Para moverse polos distintos grupos de ferramentas use as teclas TAB e MAIÚS+TAB. Para moverse polas distintas ferramentas use FRECHA DEREITA ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para activar o botón da barra de ferramentas.\"},\n{name:\"Editor de diálogo\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editor do menú contextual\",legend:\"Prema ${contextMenu} ou a TECLA MENÚ para abrir o menú contextual. A seguir móvase á seguinte opción do menú con TAB ou FRECHA ABAIXO. Móvase á opción anterior con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para seleccionar a opción do menú. Abra o submenú da opción actual con ESPAZO ou INTRO ou FRECHA DEREITA. Regrese ao elemento principal do menú con ESC ou FRECHA ESQUERDA. Peche o menú contextual con ESC.\"},\n{name:\"Lista do editor\",legend:\"Dentro dunha lista, móvase ao seguinte elemento da lista con TAB ou FRECHA ABAIXO. Móvase ao elemento anterior da lista con MAIÚS+TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para escoller a opción da lista. Prema ESC para pechar a lista.\"},{name:\"Barra da ruta ao elemento no editor\",legend:\"Prema ${elementsPathFocus} para navegar ata os elementos da barra de ruta. Móvase ao seguinte elemento botón con TAB ou FRECHA DEREITA. Móvase ao botón anterior con MAIÚS+TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar o elemento no editor.\"}]},\n{name:\"Ordes\",items:[{name:\"Orde «desfacer»\",legend:\"Prema ${undo}\"},{name:\"Orde «refacer»\",legend:\"Prema ${redo}\"},{name:\"Orde «negra»\",legend:\"Prema ${bold}\"},{name:\"Orde «cursiva»\",legend:\"Prema ${italic}\"},{name:\"Orde «subliñar»\",legend:\"Prema ${underline}\"},{name:\"Orde «ligazón»\",legend:\"Prema ${link}\"},{name:\"Orde «contraer a barra de ferramentas»\",legend:\"Prema ${toolbarCollapse}\"},{name:\"Orde «acceder ao anterior espazo en foco»\",legend:\"Prema ${accessPreviousSpace} para acceder ao espazo máis próximo de foco inalcanzábel anterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes.\"},\n{name:\"Orde «acceder ao seguinte espazo en foco»\",legend:\"Prema ${accessNextSpace} para acceder ao espazo máis próximo de foco inalcanzábel posterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes.\"},{name:\"Axuda da accesibilidade\",legend:\"Prema ${a11yHelp}\"}]}],backspace:\"Ir atrás\",tab:\"Tabulador\",enter:\"Intro\",shift:\"Maiús\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pausa\",capslock:\"Bloq. Maiús\",escape:\"Escape\",pageUp:\"Páxina arriba\",\npageDown:\"Páxina abaixo\",end:\"Fin\",home:\"Inicio\",leftArrow:\"Frecha esquerda\",upArrow:\"Frecha arriba\",rightArrow:\"Frecha dereita\",downArrow:\"Frecha abaixo\",insert:\"Inserir\",\"delete\":\"Supr\",leftWindowKey:\"Tecla Windows esquerda\",rightWindowKey:\"Tecla Windows dereita\",selectKey:\"Escolla a tecla\",numpad0:\"Tec. numérico 0\",numpad1:\"Tec. numérico 1\",numpad2:\"Tec. numérico 2\",numpad3:\"Tec. numérico 3\",numpad4:\"Tec. numérico 4\",numpad5:\"Tec. numérico 5\",numpad6:\"Tec. numérico 6\",numpad7:\"Tec. numérico 7\",\nnumpad8:\"Tec. numérico 8\",numpad9:\"Tec. numérico 9\",multiply:\"Multiplicar\",add:\"Sumar\",subtract:\"Restar\",decimalPoint:\"Punto decimal\",divide:\"Dividir\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Bloq. num.\",scrollLock:\"Bloq. despraz.\",semiColon:\"Punto e coma\",equalSign:\"Signo igual\",comma:\"Coma\",dash:\"Guión\",period:\"Punto\",forwardSlash:\"Barra inclinada\",graveAccent:\"Acento grave\",openBracket:\"Abrir corchete\",backSlash:\"Barra invertida\",\ncloseBracket:\"Pechar corchete\",singleQuote:\"Comiña simple\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"gu\",{title:\"એક્ક્ષેબિલિટી ની વિગતો\",contents:\"હેલ્પ. આ બંધ કરવા ESC દબાવો.\",legend:[{name:\"જનરલ\",items:[{name:\"એડિટર ટૂલબાર\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"એડિટર ડાયલોગ\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"કમાંડસ\",items:[{name:\"અન્ડું કમાંડ\",legend:\"$ દબાવો {undo}\"},{name:\"ફરી કરો કમાંડ\",legend:\"$ દબાવો {redo}\"},{name:\"બોલ્દનો કમાંડ\",legend:\"$ દબાવો {bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/he.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"he\",{title:\"הוראות נגישות\",contents:\"הוראות נגישות. לסגירה לחץ אסקייפ (ESC).\",legend:[{name:\"כללי\",items:[{name:\"סרגל הכלים\",legend:\"לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר.\"},{name:\"דיאלוגים (חלונות תשאול)\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"תפריט ההקשר (Context Menu)\",legend:\"לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC).\"},{name:\"תפריטים צפים (List boxes)\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"עץ אלמנטים (Elements Path)\",legend:\"לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך.\"}]},{name:\"פקודות\",items:[{name:\" ביטול צעד אחרון\",legend:\"לחץ ${undo}\"},{name:\" חזרה על צעד אחרון\",legend:\"לחץ ${redo}\"},{name:\" הדגשה\",legend:\"לחץ ${bold}\"},{name:\" הטייה\",legend:\"לחץ ${italic}\"},{name:\" הוספת קו תחתון\",legend:\"לחץ ${underline}\"},{name:\" הוספת לינק\",\nlegend:\"לחץ ${link}\"},{name:\" כיווץ סרגל הכלים\",legend:\"לחץ ${toolbarCollapse}\"},{name:\"גישה למיקום המיקוד הקודם\",legend:\"לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.\"},{name:\"גישה למיקום המיקוד הבא\",legend:\"לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.\"},\n{name:\" הוראות נגישות\",legend:\"לחץ ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"חץ שמאלה\",upArrow:\"חץ למעלה\",rightArrow:\"חץ ימינה\",downArrow:\"חץ למטה\",insert:\"הכנס\",\"delete\":\"מחק\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"בחר מקש\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",\nnumpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"הוסף\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"סלאש\",graveAccent:\"Grave Accent\",\nopenBracket:\"Open Bracket\",backSlash:\"סלאש הפוך\",closeBracket:\"Close Bracket\",singleQuote:\"ציטוט יחיד\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"hi\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"सामान्य\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"hr\",{title:\"Upute dostupnosti\",contents:\"Sadržaj pomoći. Za zatvaranje pritisnite ESC.\",legend:[{name:\"Općenito\",items:[{name:\"Alatna traka\",legend:\"Pritisni ${toolbarFocus} za navigaciju do alatne trake. Pomicanje do prethodne ili sljedeće alatne grupe vrši se pomoću SHIFT+TAB i TAB. Pomicanje do prethodnog ili sljedećeg gumba u alatnoj traci vrši se pomoću lijeve i desne strelice kursora. Pritisnite SPACE ili ENTER za aktivaciju alatne trake.\"},{name:\"Dijalog\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Kontekstni izbornik\",legend:\"Pritisnite ${contextMenu} ili APPLICATION tipku za otvaranje kontekstnog izbornika. Pomicanje se vrši TAB ili strelicom kursora prema dolje ili SHIFT+TAB ili strelica kursora prema gore. SPACE ili ENTER odabiru opciju izbornika. Otvorite podizbornik trenutne opcije sa  SPACE, ENTER ili desna strelica kursora. Povratak na prethodni izbornik vrši se sa ESC ili lijevom strelicom kursora. Zatvaranje se vrši pritiskom na tipku ESC.\"},\n{name:\"Lista\",legend:\"Unutar list-boxa, pomicanje na sljedeću stavku vrši se sa TAB ili strelica kursora prema dolje. Na prethodnu sa SHIFT+TAB ili strelica prema gore. Pritiskom na SPACE ili ENTER odabire se stavka ili ESC za zatvaranje.\"},{name:\"Traka putanje elemenata\",legend:\"Pritisnite ${elementsPathFocus} za navigaciju po putanji elemenata. Pritisnite TAB ili desnu strelicu kursora za pomicanje na sljedeći element ili SHIFT+TAB ili lijeva strelica kursora za pomicanje na prethodni element. Pritiskom na SPACE ili ENTER vrši se odabir elementa.\"}]},\n{name:\"Naredbe\",items:[{name:\"Vrati naredbu\",legend:\"Pritisni ${undo}\"},{name:\"Ponovi naredbu\",legend:\"Pritisni ${redo}\"},{name:\"Bold naredba\",legend:\"Pritisni ${bold}\"},{name:\"Italic naredba\",legend:\"Pritisni ${italic}\"},{name:\"Underline naredba\",legend:\"Pritisni ${underline}\"},{name:\"Link naredba\",legend:\"Pritisni ${link}\"},{name:\"Smanji alatnu traku naredba\",legend:\"Pritisni ${toolbarCollapse}\"},{name:\"Access previous focus space naredba\",legend:\"Pritisni ${accessPreviousSpace} za pristup najbližem nedostupnom razmaku prije kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak.\"},\n{name:\"Access next focus space naredba\",legend:\"Pritisni ${accessNextSpace} za pristup najbližem nedostupnom razmaku nakon kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak.\"},{name:\"Pomoć za dostupnost\",legend:\"Pritisni ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",\nupArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",\nf4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"hu\",{title:\"Kisegítő utasítások\",contents:\"Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.\",legend:[{name:\"Általános\",items:[{name:\"Szerkesztő Eszköztár\",legend:\"Nyomjon ${toolbarFocus} hogy kijelölje az eszköztárat. A következő és előző eszköztár csoporthoz a TAB és SHIFT+TAB-al juthat el. A következő és előző eszköztár gombhoz a BAL NYÍL vagy JOBB NYÍL gombbal juthat el. Nyomjon SPACE-t vagy ENTER-t hogy aktiválja az eszköztár gombot.\"},{name:\"Szerkesző párbeszéd ablak\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Szerkesztő helyi menü\",legend:\"Nyomjon ${contextMenu}-t vagy ALKALMAZÁS BILLENTYŰT a helyi menü megnyitásához. Ezután a következő menüpontra léphet a TAB vagy LEFELÉ NYÍLLAL. Az előző opciót a SHIFT+TAB vagy FELFELÉ NYÍLLAL érheti el. Nyomjon SPACE-t vagy ENTER-t a menüpont kiválasztásához. A jelenlegi menüpont almenüjének megnyitásához nyomjon SPACE-t vagy ENTER-t, vagy JOBB NYILAT. A főmenühöz való visszatéréshez nyomjon ESC-et vagy BAL NYILAT. A helyi menü bezárása az ESC billentyűvel lehetséges.\"},\n{name:\"Szerkesztő lista\",legend:\"A listán belül a következő elemre a TAB vagy LEFELÉ NYÍLLAL mozoghat. Az előző elem kiválasztásához nyomjon SHIFT+TAB-ot vagy FELFELÉ NYILAT. Nyomjon SPACE-t vagy ENTER-t az elem kiválasztásához. Az ESC billentyű megnyomásával bezárhatja a listát.\"},{name:\"Szerkesztő elem utak sáv\",legend:\"Nyomj ${elementsPathFocus} hogy kijelöld a elemek út sávját. A következő elem gombhoz a TAB-al vagy a JOBB NYÍLLAL juthatsz el. Az előző gombhoz a SHIFT+TAB vagy BAL NYÍLLAL mehetsz. A SPACE vagy ENTER billentyűvel kiválaszthatod az elemet a szerkesztőben.\"}]},\n{name:\"Parancsok\",items:[{name:\"Parancs visszavonása\",legend:\"Nyomj ${undo}\"},{name:\"Parancs megismétlése\",legend:\"Nyomjon ${redo}\"},{name:\"Félkövér parancs\",legend:\"Nyomjon ${bold}\"},{name:\"Dőlt parancs\",legend:\"Nyomjon ${italic}\"},{name:\"Aláhúzott parancs\",legend:\"Nyomjon ${underline}\"},{name:\"Link parancs\",legend:\"Nyomjon ${link}\"},{name:\"Szerkesztősáv összecsukása parancs\",legend:\"Nyomjon ${toolbarCollapse}\"},{name:\"Hozzáférés az előző fókusz helyhez parancs\",legend:\"Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel előtt, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket.\"},\n{name:\"Hozzáférés a következő fókusz helyhez parancs\",legend:\"Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel után, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket.\"},{name:\"Kisegítő súgó\",legend:\"Nyomjon ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",\nend:\"End\",home:\"Home\",leftArrow:\"balra nyíl\",upArrow:\"felfelé nyíl\",rightArrow:\"jobbra nyíl\",downArrow:\"lefelé nyíl\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"bal Windows-billentyű\",rightWindowKey:\"jobb Windows-billentyű\",selectKey:\"Billentyű választása\",numpad0:\"Számbillentyűk 0\",numpad1:\"Számbillentyűk 1\",numpad2:\"Számbillentyűk 2\",numpad3:\"Számbillentyűk 3\",numpad4:\"Számbillentyűk 4\",numpad5:\"Számbillentyűk 5\",numpad6:\"Számbillentyűk 6\",numpad7:\"Számbillentyűk 7\",numpad8:\"Számbillentyűk 8\",\nnumpad9:\"Számbillentyűk 9\",multiply:\"Szorzás\",add:\"Hozzáadás\",subtract:\"Kivonás\",decimalPoint:\"Tizedespont\",divide:\"Osztás\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Pontosvessző\",equalSign:\"Egyenlőségjel\",comma:\"Vessző\",dash:\"Kötőjel\",period:\"Pont\",forwardSlash:\"Perjel\",graveAccent:\"Visszafelé dőlő ékezet\",openBracket:\"Nyitó szögletes zárójel\",backSlash:\"fordított perjel\",closeBracket:\"Záró szögletes zárójel\",\nsingleQuote:\"szimpla idézőjel\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/id.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"id\",{title:\"Accessibility Instructions\",contents:\"Bantuan. Tekan ESC untuk menutup dialog ini.\",legend:[{name:\"Umum\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/it.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"it\",{title:\"Istruzioni di Accessibilità\",contents:\"Contenuti di Aiuto. Per chiudere questa finestra premi ESC.\",legend:[{name:\"Generale\",items:[{name:\"Barra degli strumenti Editor\",legend:\"Premere ${toolbarFocus} per passare alla barra degli strumenti. Usare TAB per spostarsi al gruppo successivo, MAIUSC+TAB per spostarsi a quello precedente. Usare FRECCIA DESTRA per spostarsi al pulsante successivo, FRECCIA SINISTRA per spostarsi a quello precedente. Premere SPAZIO o INVIO per attivare il pulsante della barra degli strumenti.\"},\n{name:\"Finestra Editor\",legend:\"All'interno di una finestra di dialogo è possibile premere TAB per passare all'elemento successivo della finestra, MAIUSC+TAB per passare a quello precedente; premere INVIO per inviare i dati della finestra, oppure ESC per annullare l'operazione. Quando una finestra di dialogo ha più schede, è possibile passare all'elenco delle schede sia con ALT+F10 che con TAB, in base all'ordine delle tabulazioni della finestra. Quando l'elenco delle schede è attivo, premere la FRECCIA DESTRA o la FRECCIA SINISTRA per passare rispettivamente alla scheda successiva o a quella precedente.\"},\n{name:\"Menù contestuale Editor\",legend:\"Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con  MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC.\"},\n{name:\"Box Lista Editor\",legend:\"All'interno di un elenco di opzioni, per spostarsi all'elemento successivo premere TAB oppure FRECCIA GIÙ. Per spostarsi all'elemento precedente usare SHIFT+TAB oppure FRECCIA SU. Premere SPAZIO o INVIO per selezionare l'elemento della lista. Premere ESC per chiudere l'elenco di opzioni.\"},{name:\"Barra percorso elementi editor\",legend:\"Premere ${elementsPathFocus} per passare agli elementi della barra del percorso. Usare TAB o FRECCIA DESTRA per passare al pulsante successivo. Per passare al pulsante precedente premere MAIUSC+TAB o FRECCIA SINISTRA. Premere SPAZIO o INVIO per selezionare l'elemento nell'editor.\"}]},\n{name:\"Comandi\",items:[{name:\" Annulla comando\",legend:\"Premi ${undo}\"},{name:\" Ripeti comando\",legend:\"Premi ${redo}\"},{name:\" Comando Grassetto\",legend:\"Premi ${bold}\"},{name:\" Comando Corsivo\",legend:\"Premi ${italic}\"},{name:\" Comando Sottolineato\",legend:\"Premi ${underline}\"},{name:\" Comando Link\",legend:\"Premi ${link}\"},{name:\" Comando riduci barra degli strumenti\",legend:\"Premi ${toolbarCollapse}\"},{name:\"Comando di accesso al precedente spazio di focus\",legend:\"Premi ${accessPreviousSpace} per accedere il più vicino spazio di focus non raggiungibile prima del simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti.\"},\n{name:\"Comando di accesso al prossimo spazio di focus\",legend:\"Premi ${accessNextSpace} per accedere il più vicino spazio di focus non raggiungibile dopo il simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti.\"},{name:\" Aiuto Accessibilità\",legend:\"Premi ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Invio\",shift:\"Maiusc\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pausa\",capslock:\"Bloc Maiusc\",escape:\"Esc\",pageUp:\"Pagina sù\",pageDown:\"Pagina giù\",\nend:\"Fine\",home:\"Inizio\",leftArrow:\"Freccia sinistra\",upArrow:\"Freccia su\",rightArrow:\"Freccia destra\",downArrow:\"Freccia giù\",insert:\"Ins\",\"delete\":\"Canc\",leftWindowKey:\"Tasto di Windows sinistro\",rightWindowKey:\"Tasto di Windows destro\",selectKey:\"Tasto di selezione\",numpad0:\"0 sul tastierino numerico\",numpad1:\"1 sul tastierino numerico\",numpad2:\"2 sul tastierino numerico\",numpad3:\"3 sul tastierino numerico\",numpad4:\"4 sul tastierino numerico\",numpad5:\"5 sul tastierino numerico\",numpad6:\"6 sul tastierino numerico\",\nnumpad7:\"7 sul tastierino numerico\",numpad8:\"8 sul tastierino numerico\",numpad9:\"9 sul tastierino numerico\",multiply:\"Moltiplicazione\",add:\"Più\",subtract:\"Sottrazione\",decimalPoint:\"Punto decimale\",divide:\"Divisione\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Bloc Num\",scrollLock:\"Bloc Scorr\",semiColon:\"Punto-e-virgola\",equalSign:\"Segno di uguale\",comma:\"Virgola\",dash:\"Trattino\",period:\"Punto\",forwardSlash:\"Barra\",graveAccent:\"Accento grave\",\nopenBracket:\"Parentesi quadra aperta\",backSlash:\"Barra rovesciata\",closeBracket:\"Parentesi quadra chiusa\",singleQuote:\"Apostrofo\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ja\",{title:\"ユーザー補助の説明\",contents:\"ヘルプ　このダイアログを閉じるには ESCを押してください。\",legend:[{name:\"全般\",items:[{name:\"エディターツールバー\",legend:\"${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。\"},{name:\"編集ダイアログ\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"エディターのメニュー\",legend:\"${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。\"},{name:\"エディターリストボックス\",legend:\"リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。\"},{name:\"エディター要素パスバー\",legend:\"${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。\"}]},\n{name:\"コマンド\",items:[{name:\"元に戻す\",legend:\"${undo} をクリック\"},{name:\"やり直し\",legend:\"${redo} をクリック\"},{name:\"太字\",legend:\"${bold} をクリック\"},{name:\"斜体 \",legend:\"${italic} をクリック\"},{name:\"下線\",legend:\"${underline} をクリック\"},{name:\"リンク\",legend:\"${link} をクリック\"},{name:\"ツールバーを縮める\",legend:\"${toolbarCollapse} をクリック\"},{name:\"前のカーソル移動のできないポイントへ\",legend:\"${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。\"},{name:\"次のカーソル移動のできないポイントへ\",legend:\"${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。\"},\n{name:\"ユーザー補助ヘルプ\",legend:\"${a11yHelp} をクリック\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"左矢印\",upArrow:\"上矢印\",rightArrow:\"右矢印\",downArrow:\"下矢印\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"左Windowキー\",rightWindowKey:\"右のWindowキー\",selectKey:\"Select\",numpad0:\"Num 0\",numpad1:\"Num 1\",numpad2:\"Num 2\",numpad3:\"Num 3\",numpad4:\"Num 4\",numpad5:\"Num 5\",\nnumpad6:\"Num 6\",numpad7:\"Num 7\",numpad8:\"Num 8\",numpad9:\"Num 9\",multiply:\"掛ける\",add:\"足す\",subtract:\"引く\",decimalPoint:\"小数点\",divide:\"割る\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"セミコロン\",equalSign:\"イコール記号\",comma:\"カンマ\",dash:\"ダッシュ\",period:\"ピリオド\",forwardSlash:\"フォワードスラッシュ\",graveAccent:\"グレイヴアクセント\",openBracket:\"開きカッコ\",backSlash:\"バックスラッシュ\",closeBracket:\"閉じカッコ\",singleQuote:\"シングルクォート\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/km.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"km\",{title:\"Accessibility Instructions\",contents:\"មាតិកា​ជំនួយ។ ដើម្បី​បិទ​ផ្ទាំង​នេះ សូម​ចុច ESC ។\",legend:[{name:\"ទូទៅ\",items:[{name:\"របារ​ឧបករណ៍​កម្មវិធី​និពន្ធ\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"ផ្ទាំង​កម្មវិធីនិពន្ធ\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"ម៉ីនុយបរិបទអ្នកកែសម្រួល\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"ប្រអប់បញ្ជីអ្នកកែសម្រួល\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"ពាក្យបញ្ជា\",items:[{name:\"ការ​បញ្ជា​មិនធ្វើវិញ\",legend:\"ចុច ${undo}\"},{name:\"ការបញ្ជា​ធ្វើវិញ\",legend:\"ចុច ${redo}\"},{name:\"ការបញ្ជា​អក្សរ​ដិត\",legend:\"ចុច ${bold}\"},{name:\"ការបញ្ជា​អក្សរ​ទ្រេត\",legend:\"ចុច ${italic}\"},{name:\"ពាក្យបញ្ជា​បន្ទាត់​ពីក្រោម\",\nlegend:\"ចុច ${underline}\"},{name:\"ពាក្យបញ្ជា​តំណ\",legend:\"ចុច ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\"ជំនួយ​ពី​ភាព​ងាយស្រួល\",legend:\"ជួយ ${a11yHelp}\"}]}],backspace:\"លុបថយក្រោយ\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"ផ្អាក\",capslock:\"Caps Lock\",escape:\"ចាកចេញ\",pageUp:\"ទំព័រ​លើ\",pageDown:\"ទំព័រ​ក្រោម\",end:\"ចុង\",home:\"ផ្ទះ\",leftArrow:\"ព្រួញ​ឆ្វេង\",upArrow:\"ព្រួញ​លើ\",rightArrow:\"ព្រួញ​ស្ដាំ\",downArrow:\"ព្រួញ​ក្រោម\",insert:\"បញ្ចូល\",\"delete\":\"លុប\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"ជ្រើស​គ្រាប់​ចុច\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"គុណ\",add:\"បន្ថែម\",subtract:\"ដក\",decimalPoint:\"ចំណុចទសភាគ\",divide:\"ចែក\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"បិទ​រំកិល\",semiColon:\"ចុច​ក្បៀស\",equalSign:\"សញ្ញា​អឺរ៉ូ\",comma:\"ក្បៀស\",dash:\"Dash\",period:\"ចុច\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",\nopenBracket:\"តង្កៀប​បើក\",backSlash:\"Backslash\",closeBracket:\"តង្កៀប​បិទ\",singleQuote:\"បន្តក់​មួយ\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ko\",{title:\"접근성 설명\",contents:\"도움말. 이 창을 닫으시려면 ESC 를 누르세요.\",legend:[{name:\"일반\",items:[{name:\"편집기 툴바\",legend:\"툴바를 탐색하시려면 ${toolbarFocus} 를 투르세요. 이전/다음 툴바 그룹으로 이동하시려면 TAB 키 또는 SHIFT+TAB 키를 누르세요. 이전/다음 툴바 버튼으로 이동하시려면 오른쪽 화살표 키 또는 왼쪽 화살표 키를 누르세요. 툴바 버튼을 활성화 하려면 SPACE 키 또는 ENTER 키를 누르세요.\"},{name:\"편집기 다이얼로그\",legend:\"TAB 키를 누르면 다음 대화상자로 이동하고, SHIFT+TAB 키를 누르면 이전 대화상자로 이동합니다. 대화상자를 제출하려면 ENTER 키를 누르고, ESC 키를 누르면 대화상자를 취소합니다. 대화상자에 탭이 여러개 있을 때, ALT+F10 키 또는 TAB 키를 누르면 순서에 따라 탭 목록에 도달할 수 있습니다. 탭 목록에 초점이 맞을 때, 오른쪽과 왼쪽 화살표 키를 이용하면 각각 다음과 이전 탭으로 이동할 수 있습니다.\"},\n{name:\"편집기 환경 메뉴\",legend:\"${contextMenu} 또는 어플리케이션 키를 누르면 환경-메뉴를 열 수 있습니다. 환경-메뉴에서 TAB 키 또는 아래 화살표 키를 누르면 다음 메뉴 옵션으로 이동할 수 있습니다. 이전 옵션으로 이동은 SHIFT+TAB 키 또는 위 화살표 키를 눌러서 할 수 있습니다. 스페이스 키 또는 ENTER 키를 눌러서 메뉴 옵션을 선택할 수 있습니다. 스페이스 키 또는 ENTER 키 또는 오른쪽 화살표 키를 눌러서 하위 메뉴를 열 수 있습니다. 부모 메뉴 항목으로 돌아가려면 ESC 키 또는 왼쪽 화살표 키를 누릅니다. ESC 키를 눌러서 환경-메뉴를 닫습니다.\"},{name:\"편집기 목록 박스\",legend:\"리스트-박스 내에서, 목록의 다음 항목으로 이동하려면 TAB 키 또는 아래쪽 화살표 키를 누릅니다. 목록의 이전 항목으로 이동하려면 SHIFT+TAB 키 또는 위쪽 화살표 키를 누릅니다. 스페이스 키 또는 ENTER 키를 누르면 목록의 해당 옵션을 선택합니다. ESC 키를 눌러서 리스트-박스를 닫을 수 있습니다.\"},\n{name:\"편집기 요소 경로 막대\",legend:\"${elementsPathFocus}를 눌러서 요소 경로 막대를 탐색할 수 있습니다. 다음 요소로 이동하려면 TAB 키 또는 오른쪽 화살표 키를 누릅니다. SHIFT+TAB 키 또는 왼쪽 화살표 키를 누르면 이전 버튼으로 이동할 수 있습니다. 스페이스 키나 ENTER 키를 누르면 편집기의 해당 항목을 선택합니다.\"}]},{name:\"명령\",items:[{name:\" 명령 실행 취소\",legend:\"${undo} 누르시오\"},{name:\" 명령 다시 실행\",legend:\"${redo} 누르시오\"},{name:\" 굵게 명령\",legend:\"${bold} 누르시오\"},{name:\" 기울임 꼴 명령\",legend:\"${italic} 누르시오\"},{name:\" 밑줄 명령\",legend:\"${underline} 누르시오\"},{name:\" 링크 명령\",legend:\"${link} 누르시오\"},{name:\" 툴바 줄이기 명령\",legend:\"${toolbarCollapse} 누르시오\"},\n{name:\" 이전 포커스 공간 접근 명령\",legend:\"탈자 기호(^) 이전에 ${accessPreviousSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다.\"},{name:\"다음 포커스 공간 접근 명령\",legend:\"탈자 기호(^) 다음에 ${accessNextSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다. \"},{name:\" 접근성 도움말\",legend:\"${a11yHelp} 누르시오\"}]}],backspace:\"Backspace 키\",tab:\"탭 키\",enter:\"엔터 키\",shift:\"시프트 키\",ctrl:\"컨트롤 키\",alt:\"알트 키\",pause:\"일시정지 키\",capslock:\"캡스 록 키\",\nescape:\"이스케이프 키\",pageUp:\"페이지 업 키\",pageDown:\"페이지 다운 키\",end:\"엔드 키\",home:\"홈 키\",leftArrow:\"왼쪽 화살표 키\",upArrow:\"위쪽 화살표 키\",rightArrow:\"오른쪽 화살표 키\",downArrow:\"아래쪽 화살표 키\",insert:\"인서트 키\",\"delete\":\"삭제 키\",leftWindowKey:\"왼쪽 윈도우 키\",rightWindowKey:\"오른쪽 윈도우 키\",selectKey:\"셀렉트 키\",numpad0:\"숫자 패드 0 키\",numpad1:\"숫자 패드 1 키\",numpad2:\"숫자 패드 2 키\",numpad3:\"숫자 패드 3 키\",numpad4:\"숫자 패드 4 키\",numpad5:\"숫자 패드 5 키\",numpad6:\"숫자 패드 6 키\",numpad7:\"숫자 패드 7 키\",numpad8:\"숫자 패드 8 키\",numpad9:\"숫자 패드 9 키\",multiply:\"곱셈(*) 키\",add:\"덧셈(+) 키\",subtract:\"뺄셈(-) 키\",\ndecimalPoint:\"온점(.) 키\",divide:\"나눗셈(/) 키\",f1:\"F1 키\",f2:\"F2 키\",f3:\"F3 키\",f4:\"F4 키\",f5:\"F5 키\",f6:\"F6 키\",f7:\"F7 키\",f8:\"F8 키\",f9:\"F9 키\",f10:\"F10 키\",f11:\"F11 키\",f12:\"F12 키\",numLock:\"Num Lock 키\",scrollLock:\"Scroll Lock 키\",semiColon:\"세미콜론(;) 키\",equalSign:\"등호(\\x3d) 키\",comma:\"쉼표(,) 키\",dash:\"대시(-) 키\",period:\"온점(.) 키\",forwardSlash:\"슬래시(/) 키\",graveAccent:\"억음 악센트(`) 키\",openBracket:\"브라켓 열기([) 키\",backSlash:\"역슬래시(\\\\\\\\) 키\",closeBracket:\"브라켓 닫기(]) 키\",singleQuote:\"외 따옴표(') 키\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ku\",{title:\"ڕێنمای لەبەردەستدابوون\",contents:\"پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.\",legend:[{name:\"گشتی\",items:[{name:\"تووڵامرازی دەستكاریكەر\",legend:\"کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT+TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز.\"},{name:\"دیالۆگی دەستكاریكەر\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"پێڕستی سەرنووسەر\",legend:\"کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە.\"},\n{name:\"لیستی سنووقی سەرنووسەر\",legend:\"لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست.\"},{name:\"تووڵامرازی توخم\",legend:\"کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه.\"}]},\n{name:\"فەرمانەکان\",items:[{name:\"پووچکردنەوەی فەرمان\",legend:\"کلیك ${undo}\"},{name:\"هەڵگەڕانەوەی فەرمان\",legend:\"کلیك ${redo}\"},{name:\"فەرمانی دەقی قەڵەو\",legend:\"کلیك ${bold}\"},{name:\"فەرمانی دەقی لار\",legend:\"کلیك ${italic}\"},{name:\"فەرمانی ژێرهێڵ\",legend:\"کلیك ${underline}\"},{name:\"فەرمانی به‌ستەر\",legend:\"کلیك ${link}\"},{name:\"شاردەنەوەی تووڵامراز\",legend:\"کلیك ${toolbarCollapse}\"},{name:\"چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی\",legend:\"کلیک ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\"چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی\",legend:\"کلیک ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\"دەستپێگەیشتنی یارمەتی\",legend:\"کلیك ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",\nupArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"پەنجەرەی چەپ\",rightWindowKey:\"پەنجەرەی ڕاست\",selectKey:\"Select\",numpad0:\"Numpad 0\",numpad1:\"1\",numpad2:\"2\",numpad3:\"3\",numpad4:\"4\",numpad5:\"5\",numpad6:\"6\",numpad7:\"7\",numpad8:\"8\",numpad9:\"9\",multiply:\"*\",add:\"+\",subtract:\"-\",decimalPoint:\".\",divide:\"/\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",\nsemiColon:\";\",equalSign:\"\\x3d\",comma:\",\",dash:\"-\",period:\".\",forwardSlash:\"/\",graveAccent:\"`\",openBracket:\"[\",backSlash:\"\\\\\\\\\",closeBracket:\"}\",singleQuote:\"'\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"lt\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"Bendros savybės\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"lv\",{title:\"Pieejamības instrukcija\",contents:\"Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.\",legend:[{name:\"Galvenais\",items:[{name:\"Redaktora rīkjosla\",legend:\"Nospiediet ${toolbarFocus} lai pārvietotos uz rīkjoslu. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas grupu izmantojiet pogu TAB un SHIFT+TAB. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizētu rīkjosla pogu.\"},\n{name:\"Redaktora dialoga  logs\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Redaktora satura izvēle\",legend:\"Nospiediet ${contextMenu} vai APPLICATION KEY lai atvērtu satura izvēlni. Lai pārvietotos uz nākošo izvēlnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pārvietotos uz iepriekšējo opciju izmantojiet  SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvelētos izvēlnes opciju. Atveriet tekošajā opcija apakšizvēlni ar SAPCE vai ENTER ka ari to var izdarīt ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvēlni nospiediet ESC vai Kreiso bultiņu. Lai aizvērtu ciet izvēlnes saturu nospiediet ESC.\"},\n{name:\"Redaktora saraksta lauks\",legend:\"Saraksta laukā, lai pārvietotos uz nākošo saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pārvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvēlētos saraksta opcijas. Nospiediet ESC lai aizvērtu saraksta lauku.\"},{name:\"Redaktora elementa ceļa josla\",legend:\"Nospiediet ${elementsPathFocus} lai pārvietotos uz elementa ceļa joslu. Lai pārvietotos uz nākošo elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo elementa pogu izmantojiet SHIFT+TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos elementu redaktorā.\"}]},\n{name:\"Komandas\",items:[{name:\"Komanda atcelt darbību\",legend:\"Nospiediet ${undo}\"},{name:\"Komanda atkārtot darbību\",legend:\"Nospiediet ${redo}\"},{name:\"Treknraksta komanda\",legend:\"Nospiediet ${bold}\"},{name:\"Kursīva komanda\",legend:\"Nospiediet ${italic}\"},{name:\"Apakšsvītras komanda \",legend:\"Nospiediet ${underline}\"},{name:\"Hipersaites komanda\",legend:\"Nospiediet ${link}\"},{name:\"Rīkjoslas aizvēršanas komanda\",legend:\"Nospiediet ${toolbarCollapse}\"},{name:\"Piekļūt iepriekšējai fokusa vietas komandai\",\nlegend:\"Nospiediet ${accessPreviousSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pirms kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām.\"},{name:\"Piekļūt nākošā fokusa apgabala komandai\",legend:\"Nospiediet ${accessNextSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pēc kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām.\"},\n{name:\"Pieejamības palīdzība\",legend:\"Nospiediet ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"mk\",{title:\"Инструкции за пристапност\",contents:\"Содржина на делот за помош. За да го затворите овој дијалог притиснете ESC.\",legend:[{name:\"Општо\",items:[{name:\"Мени за уредувачот\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Дијалот за едиторот\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Контекст-мени на уредувачот\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},\n{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},\n{name:\"Наредби\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",legend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Пауза\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Up\",end:\"End\",home:\"Home\",leftArrow:\"Стрелка лево\",\nupArrow:\"Стрелка горе\",rightArrow:\"Стрелка десно\",downArrow:\"Стрелка доле\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Лево Windows копче\",rightWindowKey:\"Десно Windows копче\",selectKey:\"Select копче\",numpad0:\"Нум. таст. 0\",numpad1:\"Нум. таст. 1\",numpad2:\"Нум. таст. 2\",numpad3:\"Нум. таст. 3\",numpad4:\"Нум. таст. 4\",numpad5:\"Нум. таст. 5\",numpad6:\"Нум. таст. 6\",numpad7:\"Нум. таст. 7\",numpad8:\"Нум. таст. 8\",numpad9:\"Нум. таст. 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",\ndivide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"mn\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"Ерөнхий\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"nb\",{title:\"Instruksjoner for tilgjengelighet\",contents:\"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.\",legend:[{name:\"Generelt\",items:[{name:\"Verktøylinje for editor\",legend:\"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.\"},{name:\"Dialog for editor\",\nlegend:\"Mens du er i en dialog, trykk TAB for å navigere til neste dialogelement, trykk SHIFT+TAB for å flytte til forrige dialogelement, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. Når en dialog har flere faner, kan fanelisten nås med enten ALT+F10 eller med TAB. Når fanelisten er fokusert, går man til neste og forrige fane med henholdsvis HØYRE og VENSTRE PILTAST.\"},{name:\"Kontekstmeny for editor\",legend:\"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.\"},\n{name:\"Listeboks for editor\",legend:\"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.\"},{name:\"Verktøylinje for elementsti\",legend:\"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.\"}]},\n{name:\"Hurtigtaster\",items:[{name:\"Angre\",legend:\"Trykk ${undo}\"},{name:\"Gjør om\",legend:\"Trykk ${redo}\"},{name:\"Fet tekst\",legend:\"Trykk ${bold}\"},{name:\"Kursiv tekst\",legend:\"Trykk ${italic}\"},{name:\"Understreking\",legend:\"Trykk ${underline}\"},{name:\"Lenke\",legend:\"Trykk ${link}\"},{name:\"Skjul verktøylinje\",legend:\"Trykk ${toolbarCollapse}\"},{name:\"Gå til forrige fokusområde\",legend:\"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.\"},\n{name:\"Gå til neste fokusområde\",legend:\"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.\"},{name:\"Hjelp for tilgjengelighet\",legend:\"Trykk ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tabulator\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",\npageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Venstre piltast\",upArrow:\"Opp-piltast\",rightArrow:\"Høyre piltast\",downArrow:\"Ned-piltast\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Venstre Windows-tast\",rightWindowKey:\"Høyre Windows-tast\",selectKey:\"Velg nøkkel\",numpad0:\"Numerisk tastatur 0\",numpad1:\"Numerisk tastatur 1\",numpad2:\"Numerisk tastatur 2\",numpad3:\"Numerisk tastatur 3\",numpad4:\"Numerisk tastatur 4\",numpad5:\"Numerisk tastatur 5\",numpad6:\"Numerisk tastatur 6\",numpad7:\"Numerisk tastatur 7\",\nnumpad8:\"Numerisk tastatur 8\",numpad9:\"Numerisk tastatur 9\",multiply:\"Multipliser\",add:\"Legg til\",subtract:\"Trekk fra\",decimalPoint:\"Desimaltegn\",divide:\"Divider\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semikolon\",equalSign:\"Likhetstegn\",comma:\"Komma\",dash:\"Bindestrek\",period:\"Punktum\",forwardSlash:\"Forover skråstrek\",graveAccent:\"Grav aksent\",openBracket:\"Åpne parentes\",backSlash:\"Bakover skråstrek\",\ncloseBracket:\"Lukk parentes\",singleQuote:\"Enkelt sitattegn\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"nl\",{title:\"Toegankelijkheidsinstructies\",contents:\"Help-inhoud. Druk op ESC om dit dialoog te sluiten.\",legend:[{name:\"Algemeen\",items:[{name:\"Werkbalk tekstverwerker\",legend:\"Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren.\"},\n{name:\"Dialoog tekstverwerker\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Contextmenu tekstverwerker\",legend:\"Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC.\"},\n{name:\"Keuzelijst tekstverwerker\",legend:\"In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten.\"},{name:\"Elementenpad werkbalk tekstverwerker\",legend:\"Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker.\"}]},\n{name:\"Opdrachten\",items:[{name:\"Ongedaan maken opdracht\",legend:\"Druk op ${undo}\"},{name:\"Opnieuw uitvoeren opdracht\",legend:\"Druk op ${redo}\"},{name:\"Vetgedrukt opdracht\",legend:\"Druk op ${bold}\"},{name:\"Cursief opdracht\",legend:\"Druk op ${italic}\"},{name:\"Onderstrepen opdracht\",legend:\"Druk op ${underline}\"},{name:\"Link opdracht\",legend:\"Druk op ${link}\"},{name:\"Werkbalk inklappen opdracht\",legend:\"Druk op ${toolbarCollapse}\"},{name:\"Ga naar vorige focus spatie commando\",legend:\"Druk ${accessPreviousSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie voor de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken.\"},\n{name:\"Ga naar volgende focus spatie commando\",legend:\"Druk ${accessNextSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie na de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken.\"},{name:\"Toegankelijkheidshulp\",legend:\"Druk op ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",\nend:\"End\",home:\"Home\",leftArrow:\"Pijl naar links\",upArrow:\"Pijl omhoog\",rightArrow:\"Pijl naar rechts\",downArrow:\"Pijl naar beneden\",insert:\"Invoegen\",\"delete\":\"Verwijderen\",leftWindowKey:\"Linker Windows-toets\",rightWindowKey:\"Rechter Windows-toets\",selectKey:\"Selecteer toets\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Vermenigvuldigen\",add:\"Toevoegen\",\nsubtract:\"Aftrekken\",decimalPoint:\"Decimaalteken\",divide:\"Delen\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Puntkomma\",equalSign:\"Is gelijk-teken\",comma:\"Komma\",dash:\"Koppelteken\",period:\"Punt\",forwardSlash:\"Slash\",graveAccent:\"Accent grave\",openBracket:\"Vierkant haakje openen\",backSlash:\"Backslash\",closeBracket:\"Vierkant haakje sluiten\",singleQuote:\"Apostrof\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/no.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"no\",{title:\"Instruksjoner for tilgjengelighet\",contents:\"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.\",legend:[{name:\"Generelt\",items:[{name:\"Verktøylinje for editor\",legend:\"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.\"},{name:\"Dialog for editor\",\nlegend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Kontekstmeny for editor\",legend:\"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.\"},\n{name:\"Listeboks for editor\",legend:\"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.\"},{name:\"Verktøylinje for elementsti\",legend:\"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.\"}]},\n{name:\"Kommandoer\",items:[{name:\"Angre\",legend:\"Trykk ${undo}\"},{name:\"Gjør om\",legend:\"Trykk ${redo}\"},{name:\"Fet tekst\",legend:\"Trykk ${bold}\"},{name:\"Kursiv tekst\",legend:\"Trykk ${italic}\"},{name:\"Understreking\",legend:\"Trykk ${underline}\"},{name:\"Link\",legend:\"Trykk ${link}\"},{name:\"Skjul verktøylinje\",legend:\"Trykk ${toolbarCollapse}\"},{name:\"Gå til forrige fokusområde\",legend:\"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.\"},\n{name:\"Gå til neste fokusområde\",legend:\"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.\"},{name:\"Hjelp for tilgjengelighet\",legend:\"Trykk ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",\nend:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",\ndivide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"pl\",{title:\"Instrukcje dotyczące dostępności\",contents:\"Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.\",legend:[{name:\"Informacje ogólne\",items:[{name:\"Pasek narzędzi edytora\",legend:\"Naciśnij ${toolbarFocus}, by przejść do paska narzędzi. Przejdź do następnej i poprzedniej grupy narzędzi używając TAB oraz SHIFT+TAB. Przejdź do następnego i poprzedniego przycisku paska narzędzi za pomocą STRZAŁKI W PRAWO lub STRZAŁKI W LEWO. Naciśnij SPACJĘ lub ENTER by aktywować przycisk paska narzędzi.\"},\n{name:\"Okno dialogowe edytora\",legend:\"Wewnątrz okna dialogowego naciśnij TAB, by przejść do kolejnego elementu tego okna lub SHIFT+TAB, by przejść do poprzedniego elementu okna. Naciśnij ENTER w celu zatwierdzenia opcji okna dialogowego lub ESC w celu anulowania zmian. Jeśli okno dialogowe ma kilka zakładek, do listy zakładek można przejść za pomocą ALT+F10 lub TAB. Gdy lista zakładek jest aktywna, możesz przejść do kolejnej i poprzedniej zakładki za pomocą STRZAŁKI W PRAWO i STRZAŁKI W LEWO.\"},\n{name:\"Menu kontekstowe edytora\",legend:\"Wciśnij ${contextMenu} lub PRZYCISK APLIKACJI aby otworzyć menu kontekstowe. Przejdź do następnej pozycji menu wciskając TAB lub STRZAŁKĘ W DÓŁ. Przejdź do poprzedniej pozycji menu wciskając SHIFT + TAB lub STRZAŁKĘ W GÓRĘ. Wciśnij SPACJĘ lub ENTER aby wygrać pozycję menu. Otwórz pod-menu obecnej pozycji wciskając SPACJĘ lub ENTER lub STRZAŁKĘ W PRAWO. Wróć do pozycji nadrzędnego menu wciskając ESC lub STRZAŁKĘ W LEWO. Zamknij menu wciskając ESC.\"},{name:\"Lista w edytorze\",\nlegend:\"Wewnątrz listy przejdź do kolejnego elementu listy za pomocą przycisku TAB lub STRZAŁKI W DÓŁ. Przejdź do poprzedniego elementu listy za pomocą SHIFT+TAB lub STRZAŁKI W GÓRĘ. Naciśnij SPACJĘ lub ENTER w celu wybrania opcji z listy. Naciśnij ESC, by zamknąć listę.\"},{name:\"Pasek ścieżki elementów edytora\",legend:\"Naciśnij ${elementsPathFocus} w celu przejścia do paska ścieżki elementów edytora. W celu przejścia do kolejnego elementu naciśnij klawisz TAB lub STRZAŁKI W PRAWO. W celu przejścia do poprzedniego elementu naciśnij klawisze SHIFT+TAB lub STRZAŁKI W LEWO. By wybrać element w edytorze, użyj klawisza SPACJI lub ENTER.\"}]},\n{name:\"Polecenia\",items:[{name:\"Polecenie Cofnij\",legend:\"Naciśnij ${undo}\"},{name:\"Polecenie Ponów\",legend:\"Naciśnij ${redo}\"},{name:\"Polecenie Pogrubienie\",legend:\"Naciśnij ${bold}\"},{name:\"Polecenie Kursywa\",legend:\"Naciśnij ${italic}\"},{name:\"Polecenie Podkreślenie\",legend:\"Naciśnij ${underline}\"},{name:\"Polecenie Wstaw/ edytuj odnośnik\",legend:\"Naciśnij ${link}\"},{name:\"Polecenie schowaj pasek narzędzi\",legend:\"Naciśnij ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\"Pomoc dotycząca dostępności\",legend:\"Naciśnij ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Strzałka w lewo\",\nupArrow:\"Strzałka w górę\",rightArrow:\"Strzałka w prawo\",downArrow:\"Strzałka w dół\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Lewy klawisz Windows\",rightWindowKey:\"Prawy klawisz Windows\",selectKey:\"Klawisz wyboru\",numpad0:\"Klawisz 0 na klawiaturze numerycznej\",numpad1:\"Klawisz 1 na klawiaturze numerycznej\",numpad2:\"Klawisz 2 na klawiaturze numerycznej\",numpad3:\"Klawisz 3 na klawiaturze numerycznej\",numpad4:\"Klawisz 4 na klawiaturze numerycznej\",numpad5:\"Klawisz 5 na klawiaturze numerycznej\",\nnumpad6:\"Klawisz 6 na klawiaturze numerycznej\",numpad7:\"Klawisz 7 na klawiaturze numerycznej\",numpad8:\"Klawisz 8 na klawiaturze numerycznej\",numpad9:\"Klawisz 9 na klawiaturze numerycznej\",multiply:\"Przemnóż\",add:\"Plus\",subtract:\"Minus\",decimalPoint:\"Separator dziesiętny\",divide:\"Podziel\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Średnik\",equalSign:\"Znak równości\",comma:\"Przecinek\",dash:\"Pauza\",\nperiod:\"Kropka\",forwardSlash:\"Ukośnik prawy\",graveAccent:\"Akcent słaby\",openBracket:\"Nawias kwadratowy otwierający\",backSlash:\"Ukośnik lewy\",closeBracket:\"Nawias kwadratowy zamykający\",singleQuote:\"Apostrof\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"pt-br\",{title:\"Instruções de Acessibilidade\",contents:\"Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.\",legend:[{name:\"Geral\",items:[{name:\"Barra de Ferramentas do Editor\",legend:\"Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT+TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.\"},\n{name:\"Diálogo do Editor\",legend:\"Dentro de um diálogo, pressione TAB para navegar para o próximo elemento. Pressione SHIFT+TAB para mover para o elemento anterior. Pressione ENTER ara enviar o diálogo. pressione ESC para cancelar o diálogo. Quando um diálogo tem múltiplas abas, a lista de abas pode ser acessada com ALT+F10 ou TAB, como parte da ordem de tabulação do diálogo. Com a lista de abas em foco, mova para a próxima aba e para a aba anterior com a SETA DIREITA ou SETA ESQUERDA, respectivamente.\"},\n{name:\"Menu de Contexto do Editor\",legend:\"Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC.\"},{name:\"Caixa de Lista do Editor\",legend:\"Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista.\"},\n{name:\"Barra de Caminho do Elementos do Editor\",legend:\"Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.\"}]},{name:\"Comandos\",items:[{name:\" Comando Desfazer\",legend:\"Pressione ${undo}\"},{name:\" Comando Refazer\",legend:\"Pressione ${redo}\"},{name:\" Comando Negrito\",legend:\"Pressione ${bold}\"},\n{name:\" Comando Itálico\",legend:\"Pressione ${italic}\"},{name:\" Comando Sublinhado\",legend:\"Pressione ${underline}\"},{name:\" Comando Link\",legend:\"Pressione ${link}\"},{name:\" Comando Fechar Barra de Ferramentas\",legend:\"Pressione ${toolbarCollapse}\"},{name:\"Acessar o comando anterior de spaço de foco\",legend:\"Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo antes do cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes.\"},\n{name:\"Acessar próximo fomando de spaço de foco\",legend:\"Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo após o cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes.\"},{name:\" Ajuda de Acessibilidade\",legend:\"Pressione ${a11yHelp}\"}]}],backspace:\"Tecla Backspace\",tab:\"Tecla Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",\npageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Seta à Esquerda\",upArrow:\"Seta à Cima\",rightArrow:\"Seta à Direita\",downArrow:\"Seta à Baixo\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Tecla do Windows Esquerda\",rightWindowKey:\"Tecla do Windows Direita\",selectKey:\"Tecla Selecionar\",numpad0:\"0 do Teclado Numérico\",numpad1:\"1 do Teclado Numérico\",numpad2:\"2 do Teclado Numérico\",numpad3:\"3 do Teclado Numérico\",numpad4:\"4 do Teclado Numérico\",numpad5:\"5 do Teclado Numérico\",numpad6:\"6 do Teclado Numérico\",\nnumpad7:\"7 do Teclado Numérico\",numpad8:\"8 do Teclado Numérico\",numpad9:\"9 do Teclado Numérico\",multiply:\"Multiplicar\",add:\"Mais\",subtract:\"Subtrair\",decimalPoint:\"Ponto\",divide:\"Dividir\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Ponto-e-vírgula\",equalSign:\"Igual\",comma:\"Vírgula\",dash:\"Hífen\",period:\"Ponto\",forwardSlash:\"Barra\",graveAccent:\"Acento Grave\",openBracket:\"Abrir Conchetes\",\nbackSlash:\"Contra-barra\",closeBracket:\"Fechar Colchetes\",singleQuote:\"Aspas Simples\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"pt\",{title:\"Instruções de acessibilidade\",contents:\"Conteúdo de ajuda. Use a tecla ESC para fechar esta janela.\",legend:[{name:\"Geral\",items:[{name:\"Barra de ferramentas do editor\",legend:\"Clique em ${toolbarFocus} para navegar para a barra de ferramentas. Vá para o grupo da barra de ferramentas anterior e seguinte com TAB e SHIFT+TAB. Vá para o botão da barra de ferramentas anterior com a SETA DIREITA ou ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.\"},\n{name:\"Janela do Editor\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Menu de Contexto do Editor\",legend:\"Clique em ${contextMenu} ou TECLA APLICAÇÃO para abrir o menu de contexto. Depois vá para a opção do menu seguinte com TAB ou SETA PARA BAIXO. Vá para a opção anterior com  SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu.  Abra o submenu da opção atual com ESPAÇO, ENTER ou SETA DIREITA. GVá para o item do menu parente  com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC.\"},\n{name:\"Editor de caixa em lista\",legend:\"Dentro da caixa da lista, vá para o itemda lista seguinte com TAB ou SETA PARA BAIXO. Move Vá parao item da lista anterior com SHIFT+TAB ou SETA PARA BAIXO. Pressione ESPAÇO ou ENTER para selecionar a opção da lista. Pressione ESC para fechar a caisa da lista.\"},{name:\"Caminho Barra Elemento Editor\",legend:\"Clique em ${elementsPathFocus} para navegar para a barra do caminho dos elementos. Vá para o botão do elemento seguinte com TAB ou SETA DIREITA. Vá para o botão anterior com SHIFT+TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.\"}]},\n{name:\"Comandos\",items:[{name:\"Comando de Anular\",legend:\"Carregar ${undo}\"},{name:\"Comando de Refazer\",legend:\"Pressione ${redo}\"},{name:\"Comando de Negrito\",legend:\"Pressione ${bold}\"},{name:\"Comando de Itálico\",legend:\"Pressione ${italic}\"},{name:\"Comando de Sublinhado\",legend:\"Pressione ${underline}\"},{name:\"Comando de Hiperligação\",legend:\"Pressione ${link}\"},{name:\"Comando de Ocultar Barra de Ferramentas\",legend:\"Pressione ${toolbarCollapse}\"},{name:\"Acesso comando do espaço focus anterior\",\nlegend:\"Clique em ${accessPreviousSpace} para aceder ao espaço do focos inalcançável mais perto antes do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes.\"},{name:\"Acesso comando do espaço focus seguinte\",legend:\"Pressione ${accessNextSpace} para aceder ao espaço do focos inalcançável mais perto depois do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes.\"},\n{name:\"Ajuda a acessibilidade\",legend:\"Pressione ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pausa\",capslock:\"Maiúsculas\",escape:\"Esc\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"Fim\",home:\"Entrada\",leftArrow:\"Seta esquerda\",upArrow:\"Seta para cima\",rightArrow:\"Seta direita\",downArrow:\"Seta para baixo\",insert:\"Inserir\",\"delete\":\"Eliminar\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",\nnumpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiplicar\",add:\"Adicionar\",subtract:\"Subtrair\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Vírgula\",dash:\"Dash\",period:\"Period\",\nforwardSlash:\"Forward Slash\",graveAccent:\"Acento grave\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ro\",{title:\"Instrucțiuni de accesibilitate\",contents:\"Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.\",legend:[{name:\"General\",items:[{name:\"Editează bara instrumente.\",legend:\"Apasă ${toolbarFocus} pentru a naviga prin bara de instrumente. Pentru a te mișca prin grupurile de instrumente folosește tastele TAB și SHIFT+TAB. Pentru a te mișca intre diverse instrumente folosește tastele SĂGEATĂ DREAPTA sau SĂGEATĂ STÂNGA. Apasă butonul SPAȚIU sau ENTER pentru activarea instrumentului.\"},\n{name:\"Dialog editor\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editor meniu contextual\",legend:\"Apasă ${contextMenu} sau TASTA MENIU pentru a deschide meniul contextual. Treci la următoarea opțiune din meniu cu TAB sau SĂGEATĂ JOS. Treci la opțiunea anterioară cu  SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta opțiunea din meniu. Deschide sub-meniul opțiunii curente cu SPAȚIU sau ENTER sau SĂGEATĂ DREAPTA. Revino la elementul din meniul părinte cu ESC sau SĂGEATĂ STÂNGA. Închide meniul de context cu ESC.\"},\n{name:\"Editor Casetă Listă\",legend:\"În interiorul unei liste, treci la următorull element cu TAB sau SĂGEATĂ JOS. Treci la elementul anterior din listă cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta opțiunea din listă. Apasă ESC pentru a închide lista.\"},{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},\n{name:\"Comenzi\",items:[{name:\" Undo command\",legend:\"Apasă ${undo}\"},{name:\"Comanda precedentă\",legend:\"Apasă ${redo}\"},{name:\"Comanda Îngroșat\",legend:\"Apasă ${bold}\"},{name:\"Comanda Inclinat\",legend:\"Apasă ${italic}\"},{name:\"Comanda Subliniere\",legend:\"Apasă ${underline}\"},{name:\"Comanda Legatură\",legend:\"Apasă ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",\nupArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",\nf4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ru\",{title:\"Горячие клавиши\",contents:\"Помощь. Для закрытия этого окна нажмите ESC.\",legend:[{name:\"Основное\",items:[{name:\"Панель инструментов\",legend:\"Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT+TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов.\"},{name:\"Диалоги\",legend:'Внутри диалога, нажмите TAB чтобы перейти к следующему элементу диалога, нажмите SHIFT+TAB чтобы перейти к предыдущему элементу диалога, нажмите ENTER чтобы отправить диалог, нажмите ESC чтобы отменить диалог. Когда диалоговое окно имеет несколько вкладок, получить доступ к панели вкладок как части диалога можно нажатием или сочетания ALT+F10 или TAB, при этом активные элементы диалога будут перебираться с учетом порядка табуляции. При активной панели вкладок, переход к следующей или предыдущей вкладке осуществляется нажатием стрелки \"ВПРАВО\" или стрелки \"ВЛЕВО\" соответственно.'},\n{name:\"Контекстное меню\",legend:'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой \"ВНИЗ\". Переход к предыдущей опции - SHIFT+TAB или стрелкой \"ВВЕРХ\". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой \"ВПРАВО\". Возврат к родительскому пункту меню - ESC или стрелкой \"ВЛЕВО\". Закрытие контекстного меню - ESC.'},{name:\"Редактор списка\",\nlegend:'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой \"ВНИЗ\". Переход к предыдущему пункту списка - SHIFT+TAB или стрелкой \"ВВЕРХ\". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.'},{name:\"Путь к элементу\",legend:'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой \"ВПРАВО\". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой \"ВЛЕВО\". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.'}]},\n{name:\"Команды\",items:[{name:\"Отменить\",legend:\"Нажмите ${undo}\"},{name:\"Повторить\",legend:\"Нажмите ${redo}\"},{name:\"Полужирный\",legend:\"Нажмите ${bold}\"},{name:\"Курсив\",legend:\"Нажмите ${italic}\"},{name:\"Подчеркнутый\",legend:\"Нажмите ${underline}\"},{name:\"Гиперссылка\",legend:\"Нажмите ${link}\"},{name:\"Свернуть панель инструментов\",legend:\"Нажмите ${toolbarCollapse}\"},{name:\"Команды доступа к предыдущему фокусному пространству\",legend:'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом \"^\", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.'},\n{name:\"Команды доступа к следующему фокусному пространству\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\"Справка по горячим клавишам\",legend:\"Нажмите ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Esc\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",\nhome:\"Home\",leftArrow:\"Стрелка влево\",upArrow:\"Стрелка вверх\",rightArrow:\"Стрелка вправо\",downArrow:\"Стрелка вниз\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Левая клавиша Windows\",rightWindowKey:\"Правая клавиша Windows\",selectKey:\"Выбрать\",numpad0:\"Цифра 0\",numpad1:\"Цифра 1\",numpad2:\"Цифра 2\",numpad3:\"Цифра 3\",numpad4:\"Цифра 4\",numpad5:\"Цифра 5\",numpad6:\"Цифра 6\",numpad7:\"Цифра 7\",numpad8:\"Цифра 8\",numpad9:\"Цифра 9\",multiply:\"Умножить\",add:\"Плюс\",subtract:\"Вычесть\",decimalPoint:\"Десятичная точка\",\ndivide:\"Делить\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Точка с запятой\",equalSign:\"Равно\",comma:\"Запятая\",dash:\"Тире\",period:\"Точка\",forwardSlash:\"Наклонная черта\",graveAccent:\"Апостроф\",openBracket:\"Открыть скобку\",backSlash:\"Обратная наклонная черта\",closeBracket:\"Закрыть скобку\",singleQuote:\"Одинарная кавычка\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/si.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"si\",{title:\"ළඟා වියහැකි \",contents:\"උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න\",legend:[{name:\"පොදු කරුණු\",items:[{name:\"සංස්කරණ මෙවලම් \",legend:\"ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.\"},{name:\"සංස්කරණ \",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"සංස්කරණ අඩංගුවට \",legend:\"ඔබන්න ${අන්තර්ගත මෙනුව} හෝ  APPLICATION KEY  අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ  UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද,  දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට  ESC හෝ LEFT ARROW බොත්තම ද.  අන්තර්ගත-මෙනුව වැසීමට  ESC බොත්තම ද ඔබන්න.\"},{name:\"සංස්කරණ තේරුම් \",legend:\"තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට SHIFT+TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට SPACE හෝ ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න.\"},\n{name:\"සංස්කරණ අංග සහිත \",legend:\"ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.\"}]},{name:\"විධාන\",items:[{name:\"විධානය වෙනස් \",legend:\"ඔබන්න ${වෙනස් කිරීම}\"},{name:\"විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.\",legend:\"ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}\"},{name:\"තද අකුරින් විධාන\",legend:\"ඔබන්න ${තද }\"},\n{name:\"බැධී අකුරු විධාන\",legend:\"ඔබන්න ${බැධී අකුරු }\"},{name:\"යටින් ඉරි ඇද ඇති විධාන.\",legend:\"ඔබන්න ${යටින් ඉරි ඇද ඇති}\"},{name:\"සම්බන්ධිත විධාන\",legend:\"ඔබන්න ${සම්බන්ධ }\"},{name:\"මෙවලම් තීරු හැකුලුම් විධාන\",legend:\"ඔබන්න ${මෙවලම් තීරු හැකුලුම් }\"},{name:\"යොමුවීමට පෙර  වැදගත්  විධාන\",legend:\"ඔබන්න ${යොමුවීමට ඊළඟ }\"},{name:\"යොමුවීමට ඊළග වැදගත්  විධාන\",legend:\"ඔබන්න ${යොමුවීමට ඊළඟ }\"},{name:\"ප්‍රවේශ \",legend:\"ඔබන්න  ${a11y }\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",\nalt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",\nnumpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",graveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"sk\",{title:\"Inštrukcie prístupnosti\",contents:\"Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.\",legend:[{name:\"Všeobecne\",items:[{name:\"Lišta nástrojov editora\",legend:\"Stlačte ${toolbarFocus} pre navigáciu na lištu nástrojov. Medzi ďalšou a predchádzajúcou lištou nástrojov sa pohybujete s TAB a SHIFT+TAB. Medzi ďalším a predchádzajúcim tlačidlom na lište nástrojov sa pohybujete s pravou šípkou a ľavou šípkou. Stlačte medzerník alebo ENTER pre aktiváciu tlačidla lišty nástrojov.\"},\n{name:\"Editorový dialóg\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Editorové kontextové menu\",legend:\"Stlačte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ďalšie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodičovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC.\"},\n{name:\"Editorov box zoznamu\",legend:\"V boxe zoznamu, presuňte sa na ďalšiu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti zoznamu. Stlačte ESC pre zatvorenie boxu zoznamu.\"},{name:\"Editorove pásmo cesty prvku\",legend:\"Stlačte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlačidlo ďalšieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlačidlu s SHIFT+TAB alebo ľavou šípkou. Stlačte medzerník alebo ENTER pre výber prvku v editore.\"}]},\n{name:\"Príkazy\",items:[{name:\"Vrátiť príkazy\",legend:\"Stlačte ${undo}\"},{name:\"Nanovo vrátiť príkaz\",legend:\"Stlačte ${redo}\"},{name:\"Príkaz na stučnenie\",legend:\"Stlačte ${bold}\"},{name:\"Príkaz na kurzívu\",legend:\"Stlačte ${italic}\"},{name:\"Príkaz na podčiarknutie\",legend:\"Stlačte ${underline}\"},{name:\"Príkaz na odkaz\",legend:\"Stlačte ${link}\"},{name:\"Príkaz na zbalenie lišty nástrojov\",legend:\"Stlačte ${toolbarCollapse}\"},{name:\"Prejsť na predchádzajúcu zamerateľnú medzeru príkazu\",legend:\"Stlačte ${accessPreviousSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery pred vsuvkuo. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier.\"},\n{name:\"Prejsť na ďalší \",legend:\"Stlačte ${accessNextSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery po vsuvke. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier.\"},{name:\"Pomoc prístupnosti\",legend:\"Stlačte ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Stránka hore\",pageDown:\"Stránka dole\",\nend:\"End\",home:\"Home\",leftArrow:\"Šípka naľavo\",upArrow:\"Šípka hore\",rightArrow:\"Šípka napravo\",downArrow:\"Šípka dole\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Ľavé Windows tlačidlo\",rightWindowKey:\"Pravé Windows tlačidlo\",selectKey:\"Tlačidlo Select\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Násobenie\",add:\"Sčítanie\",subtract:\"Odčítanie\",\ndecimalPoint:\"Desatinná čiarka\",divide:\"Delenie\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Bodkočiarka\",equalSign:\"Rovná sa\",comma:\"Čiarka\",dash:\"Pomĺčka\",period:\"Bodka\",forwardSlash:\"Lomítko\",graveAccent:\"Zdôrazňovanie prízvuku\",openBracket:\"Hranatá zátvorka otváracia\",backSlash:\"Backslash\",closeBracket:\"Hranatá zátvorka zatváracia\",singleQuote:\"Jednoduché úvodzovky\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"sl\",{title:\"Navodila Dostopnosti\",contents:\"Vsebina Pomoči. Če želite zapreti to pogovorno okno pritisnite ESC.\",legend:[{name:\"Splošno\",items:[{name:\"Urejevalna Orodna Vrstica\",legend:\"Pritisnite ${toolbarFocus} za pomik v orodno vrstico. Z TAB in SHIFT+TAB se pomikate na naslednjo in prejšnjo skupino orodne vrstice. Z DESNO PUŠČICO ali LEVO PUŠČICO se pomikate na naslednji in prejšnji gumb orodne vrstice. Pritisnite SPACE ali ENTER, da aktivirate gumb orodne vrstice.\"},\n{name:\"Urejevalno Pogovorno Okno\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},{name:\"Urejevalni Kontekstni Meni\",legend:\"Pritisnite ${contextMenu} ali APPLICATION KEY, da odprete kontekstni meni. Nato se premaknite na naslednjo možnost menija s tipko TAB ali PUŠČICA DOL. Premakniti se na prejšnjo možnost z SHIFT + TAB ali PUŠČICA GOR. Pritisnite SPACE ali ENTER za izbiro možnosti menija. Odprite podmeni trenutne možnosti menija s tipko SPACE ali ENTER ali DESNA PUŠČICA. Vrnite se na matični element menija s tipko ESC ali LEVA PUŠČICA. Zaprite kontekstni meni z ESC.\"},\n{name:\"Urejevalno Seznamsko Polje\",legend:\"Znotraj seznama, se premaknete na naslednji element seznama s tipko TAB ali PUŠČICO DOL. Z SHIFT+TAB ali PUŠČICO GOR se premaknete na prejšnji element seznama. Pritisnite tipko SPACE ali ENTER za izbiro elementa. Pritisnite tipko ESC, da zaprete seznam.\"},{name:\"Urejevalna vrstica poti elementa\",legend:\"Pritisnite ${elementsPathFocus} za pomikanje po vrstici elementnih poti. S TAB ali DESNA PUŠČICA se premaknete na naslednji gumb elementa. Z SHIFT+TAB ali LEVO PUŠČICO se premaknete na prejšnji gumb elementa. Pritisnite SPACE ali ENTER za izbiro elementa v urejevalniku.\"}]},\n{name:\"Ukazi\",items:[{name:\"Razveljavi ukaz\",legend:\"Pritisnite ${undo}\"},{name:\"Ponovi ukaz\",legend:\"Pritisnite ${redo}\"},{name:\"Krepki ukaz\",legend:\"Pritisnite ${bold}\"},{name:\"Ležeči ukaz\",legend:\"Pritisnite ${italic}\"},{name:\"Poudarni ukaz\",legend:\"Pritisnite ${underline}\"},{name:\"Ukaz povezave\",legend:\"Pritisnite ${link}\"},{name:\"Skrči Orodno Vrstico Ukaz\",legend:\"Pritisnite ${toolbarCollapse}\"},{name:\"Dostop do prejšnjega ukaza ostrenja\",legend:\"Pritisnite ${accessPreviousSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora pred strešico, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore.\"},\n{name:\"Dostop do naslednjega ukaza ostrenja\",legend:\"Pritisnite ${accessNextSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora po strešici, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore.\"},{name:\"Pomoč Dostopnosti\",legend:\"Pritisnite ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",\nhome:\"Home\",leftArrow:\"Levo puščica\",upArrow:\"Gor puščica\",rightArrow:\"Desno puščica\",downArrow:\"Dol puščica\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Leva Windows tipka\",rightWindowKey:\"Desna Windows tipka\",selectKey:\"Select tipka\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Zmnoži\",add:\"Dodaj\",subtract:\"Odštej\",decimalPoint:\"Decimalna vejica\",\ndivide:\"Deli\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Podpičje\",equalSign:\"enačaj\",comma:\"Vejica\",dash:\"Vezaj\",period:\"Pika\",forwardSlash:\"Desna poševnica\",graveAccent:\"Krativec\",openBracket:\"Oklepaj\",backSlash:\"Leva poševnica\",closeBracket:\"Oklepaj\",singleQuote:\"Opuščaj\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"sq\",{title:\"Udhëzimet e Qasjes\",contents:\"Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.\",legend:[{name:\"Të përgjithshme\",items:[{name:\"Shiriti i Redaktuesit\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Dialogu i Redaktuesit\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Komandat\",items:[{name:\"Rikthe komandën\",legend:\"Shtyp ${undo}\"},{name:\"Ribëj komandën\",legend:\"Shtyp ${redo}\"},{name:\"Komanda e trashjes së tekstit\",legend:\"Shtyp ${bold}\"},{name:\"Komanda kursive\",legend:\"Shtyp ${italic}\"},\n{name:\"Komanda e nënvijëzimit\",legend:\"Shtyp ${underline}\"},{name:\"Komanda e Nyjes\",legend:\"Shtyp ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Shtyp ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\"Ndihmë Qasjeje\",legend:\"Shtyp ${a11yHelp}\"}]}],backspace:\"Prapa\",tab:\"Fletë\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Shenja majtas\",upArrow:\"Shenja sipër\",rightArrow:\"Shenja djathtas\",downArrow:\"Shenja poshtë\",insert:\"Shto\",\"delete\":\"Grise\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Shto\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Presje\",dash:\"vizë\",period:\"Pikë\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Hape kllapën\",backSlash:\"Backslash\",closeBracket:\"Mbylle kllapën\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"sr-latn\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"Opšte\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"sr\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"Опште\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Commands\",items:[{name:\" Undo command\",legend:\"Press ${undo}\"},{name:\" Redo command\",legend:\"Press ${redo}\"},{name:\" Bold command\",legend:\"Press ${bold}\"},{name:\" Italic command\",legend:\"Press ${italic}\"},{name:\" Underline command\",\nlegend:\"Press ${underline}\"},{name:\" Link command\",legend:\"Press ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"sv\",{title:\"Hjälpmedelsinstruktioner\",contents:\"Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.\",legend:[{name:\"Allmänt\",items:[{name:\"Editor verktygsfält\",legend:\"Tryck på ${toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT+TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck SPACE eller ENTER för att aktivera knappen i verktygsfältet.\"},\n{name:\"Dialogeditor\",legend:\"Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan, tryck SKIFT+TAB för att flytta till föregående fält, tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT+F10 eller TAB för att navigera till fliklistan. med fliklistan vald flytta till nästa och föregående flik med HÖGER- eller VÄNSTERPIL.\"},{name:\"Editor för innehållsmeny\",legend:\"Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC.\"},\n{name:\"Editor för list-box\",legend:\"Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT+TAB eller UPPIL. Tryck SPACE eller ENTER för att välja listan alternativet. Tryck ESC för att stänga list-boxen.\"},{name:\"Editor för elementens sökväg\",legend:\"Tryck på ${elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT+TAB eller VÄNSTERPIL. Tryck SPACE eller ENTER för att välja element i redigeraren.\"}]},\n{name:\"Kommandon\",items:[{name:\"Ångra kommando\",legend:\"Tryck på ${undo}\"},{name:\"Gör om kommando\",legend:\"Tryck på ${redo}\"},{name:\"Kommandot fet stil\",legend:\"Tryck på ${bold}\"},{name:\"Kommandot kursiv\",legend:\"Tryck på ${italic}\"},{name:\"Kommandot understruken\",legend:\"Tryck på ${underline}\"},{name:\"Kommandot länk\",legend:\"Tryck på ${link}\"},{name:\"Verktygsfält Dölj kommandot\",legend:\"Tryck på ${toolbarCollapse}\"},{name:\"Gå till föregående fokus plats\",legend:\"Tryck på ${accessPreviousSpace} för att gå till närmast onåbara utrymme före markören, exempel: två intilliggande HR element. Repetera tangentkombinationen för att gå till nästa.\"},\n{name:\"Tillgå nästa fokuskommandots utrymme\",legend:\"Tryck ${accessNextSpace} på för att komma åt den närmaste onåbar fokus utrymme efter cirkumflex, till exempel: två intilliggande HR element. Upprepa tangentkombinationen för att nå avlägsna fokus utrymmen.\"},{name:\"Hjälp om tillgänglighet\",legend:\"Tryck ${a11yHelp}\"}]}],backspace:\"Backsteg\",tab:\"Tab\",enter:\"Retur\",shift:\"Skift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Paus\",capslock:\"Caps lock\",escape:\"Escape\",pageUp:\"Sida Up\",pageDown:\"Sida Ned\",end:\"Slut\",\nhome:\"Hem\",leftArrow:\"Vänsterpil\",upArrow:\"Uppil\",rightArrow:\"Högerpil\",downArrow:\"Nedåtpil\",insert:\"Infoga\",\"delete\":\"Radera\",leftWindowKey:\"Vänster Windowstangent\",rightWindowKey:\"Höger Windowstangent\",selectKey:\"Välj tangent\",numpad0:\"Nummer 0\",numpad1:\"Nummer 1\",numpad2:\"Nummer 2\",numpad3:\"Nummer 3\",numpad4:\"Nummer 4\",numpad5:\"Nummer 5\",numpad6:\"Nummer 6\",numpad7:\"Nummer 7\",numpad8:\"Nummer 8\",numpad9:\"Nummer 9\",multiply:\"Multiplicera\",add:\"Addera\",subtract:\"Minus\",decimalPoint:\"Decimalpunkt\",\ndivide:\"Dividera\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semikolon\",equalSign:\"Lika med tecken\",comma:\"Komma\",dash:\"Minus\",period:\"Punkt\",forwardSlash:\"Snedstreck framåt\",graveAccent:\"Accent\",openBracket:\"Öppningsparentes\",backSlash:\"Snedstreck bakåt\",closeBracket:\"Slutparentes\",singleQuote:\"Enkelt Citattecken\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/th.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"th\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"ทั่วไป\",items:[{name:\"แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"คำสั่ง\",items:[{name:\"เลิกทำคำสั่ง\",legend:\"วาง ${undo}\"},{name:\"คำสั่งสำหรับทำซ้ำ\",legend:\"วาง ${redo}\"},{name:\"คำสั่งสำหรับตัวหนา\",legend:\"วาง ${bold}\"},{name:\"คำสั่งสำหรับตัวเอียง\",legend:\"วาง ${italic}\"},{name:\"คำสั่งสำหรับขีดเส้นใต้\",\nlegend:\"วาง ${underline}\"},{name:\"คำสั่งสำหรับลิงก์\",legend:\"วาง ${link}\"},{name:\" Toolbar Collapse command\",legend:\"Press ${toolbarCollapse}\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"Press ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Left Arrow\",upArrow:\"Up Arrow\",rightArrow:\"Right Arrow\",downArrow:\"Down Arrow\",insert:\"Insert\",\"delete\":\"Delete\",leftWindowKey:\"Left Windows key\",rightWindowKey:\"Right Windows key\",selectKey:\"Select key\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Multiply\",add:\"Add\",subtract:\"Subtract\",decimalPoint:\"Decimal Point\",divide:\"Divide\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Semicolon\",equalSign:\"Equal Sign\",comma:\"Comma\",dash:\"Dash\",period:\"Period\",forwardSlash:\"Forward Slash\",\ngraveAccent:\"Grave Accent\",openBracket:\"Open Bracket\",backSlash:\"Backslash\",closeBracket:\"Close Bracket\",singleQuote:\"Single Quote\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"tr\",{title:\"Erişilebilirlik Talimatları\",contents:\"Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.\",legend:[{name:\"Genel\",items:[{name:\"Düzenleyici Araç Çubuğu\",legend:\"Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT+TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın.\"},\n{name:\"Diyalog Düzenleyici\",legend:\"Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın.\"},\n{name:\"İçerik Menü Editörü\",legend:\"İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın.\"},{name:\"Liste Kutusu Editörü\",legend:\"Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT+TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın.\"},\n{name:\"Element Yol Çubuğu Editörü\",legend:\"Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT+TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın.\"}]},{name:\"Komutlar\",items:[{name:\"Komutu geri al\",legend:\"$(undo)'ya basın\"},{name:\"Komutu geri al\",legend:\"${redo} basın\"},{name:\" Kalın komut\",legend:\"${bold} basın\"},{name:\" İtalik komutu\",legend:\"${italic} basın\"},\n{name:\" Alttan çizgi komutu\",legend:\"${underline} basın\"},{name:\" Bağlantı komutu\",legend:\"${link} basın\"},{name:\" Araç çubuğu Toplama komutu\",legend:\"${toolbarCollapse} basın\"},{name:\"Önceki komut alanına odaklan\",legend:\"Düzeltme imleçinden önce, en yakın uzaktaki alana erişmek için ${accessPreviousSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın.\"},{name:\"Sonraki komut alanına odaklan\",legend:\"Düzeltme imleçinden sonra, en yakın uzaktaki alana erişmek için ${accessNextSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın.\"},\n{name:\"Erişilebilirlik Yardımı\",legend:\"${a11yHelp}'e basın\"}]}],backspace:\"Silme\",tab:\"Sekme tuşu\",enter:\"Gir tuşu\",shift:'\"Shift\" Kaydırma tuşu',ctrl:'\"Ctrl\" Kontrol tuşu',alt:'\"Alt\" Anahtar tuşu',pause:\"Durdurma tuşu\",capslock:\"Büyük harf tuşu\",escape:\"Vazgeç tuşu\",pageUp:\"Sayfa Yukarı\",pageDown:\"Sayfa Aşağı\",end:\"Sona\",home:\"En başa\",leftArrow:\"Sol ok\",upArrow:\"Yukarı ok\",rightArrow:\"Sağ ok\",downArrow:\"Aşağı ok\",insert:\"Araya gir\",\"delete\":\"Silme\",leftWindowKey:\"Sol windows tuşu\",rightWindowKey:\"Sağ windows tuşu\",\nselectKey:\"Seçme tuşu\",numpad0:\"Nümerik 0\",numpad1:\"Nümerik 1\",numpad2:\"Nümerik 2\",numpad3:\"Nümerik 3\",numpad4:\"Nümerik 4\",numpad5:\"Nümerik 5\",numpad6:\"Nümerik 6\",numpad7:\"Nümerik 7\",numpad8:\"Nümerik 8\",numpad9:\"Nümerik 9\",multiply:\"Çarpma\",add:\"Toplama\",subtract:\"Çıkarma\",decimalPoint:\"Ondalık işareti\",divide:\"Bölme\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lk\",scrollLock:\"Scr Lk\",semiColon:\"Noktalı virgül\",equalSign:\"Eşittir\",\ncomma:\"Virgül\",dash:\"Eksi\",period:\"Nokta\",forwardSlash:\"İleri eğik çizgi\",graveAccent:\"Üst tırnak\",openBracket:\"Parantez aç\",backSlash:\"Ters eğik çizgi\",closeBracket:\"Parantez kapa\",singleQuote:\"Tek tırnak\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"tt\",{title:\"Accessibility Instructions\",contents:\"Help Contents. To close this dialog press ESC.\",legend:[{name:\"Гомуми\",items:[{name:\"Editor Toolbar\",legend:\"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.\"},{name:\"Editor Dialog\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Editor Context Menu\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.\"},{name:\"Editor List Box\",legend:\"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.\"},\n{name:\"Editor Element Path Bar\",legend:\"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.\"}]},{name:\"Командалар\",items:[{name:\"Кайтару\",legend:\"${undo} басыгыз\"},{name:\"Кабатлау\",legend:\"${redo} басыгыз\"},{name:\"Калын\",legend:\"${bold} басыгыз\"},{name:\"Курсив\",legend:\"${italic} басыгыз\"},{name:\"Астына сызылган\",legend:\"${underline} басыгыз\"},\n{name:\"Сылталама\",legend:\"${link} басыгыз\"},{name:\" Toolbar Collapse command\",legend:\"${toolbarCollapse} басыгыз\"},{name:\" Access previous focus space command\",legend:\"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},{name:\" Access next focus space command\",legend:\"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.\"},\n{name:\" Accessibility Help\",legend:\"${a11yHelp} басыгыз\"}]}],backspace:\"Кайтару\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Тыныш\",capslock:\"Caps Lock\",escape:\"Escape\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Сул якка ук\",upArrow:\"Өскә таба ук\",rightArrow:\"Уң якка ук\",downArrow:\"Аска таба ук\",insert:\"Өстәү\",\"delete\":\"Бетерү\",leftWindowKey:\"Сул Windows төймəсе\",rightWindowKey:\"Уң Windows төймəсе\",selectKey:\"Select төймəсе\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",\nnumpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Тапкырлау\",add:\"Кушу\",subtract:\"Алу\",decimalPoint:\"Унарлы нокта\",divide:\"Бүлү\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Нокталы өтер\",equalSign:\"Тигезлек билгесе\",comma:\"Өтер\",dash:\"Сызык\",period:\"Дәрәҗә\",forwardSlash:\"Кыек сызык\",\ngraveAccent:\"Гравис\",openBracket:\"Җәя ачу\",backSlash:\"Кире кыек сызык\",closeBracket:\"Җәя ябу\",singleQuote:\"Бер иңле куштырнаклар\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"ug\",{title:\"قوشۇمچە چۈشەندۈرۈش\",contents:\"ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.\",legend:[{name:\"ئادەتتىكى\",items:[{name:\"قورال بالداق تەھرىر\",legend:\"${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ.\"},{name:\"تەھرىرلىگۈچ سۆزلەشكۈسى\",legend:\"سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT+TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT+F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛SHIFT+ TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ.\"},\n{name:\"تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى\",legend:\"${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ.\"},{name:\"تەھرىرلىگۈچ تىزىمى\",\nlegend:\"تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ.\"},{name:\"تەھرىرلىگۈچ ئېلېمېنت يول بالداق\",legend:\"${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ.\"}]},\n{name:\"بۇيرۇق\",items:[{name:\"بۇيرۇقتىن يېنىۋال\",legend:\"${undo} نى بېسىڭ\"},{name:\"قايتىلاش بۇيرۇقى\",legend:\"${redo} نى بېسىڭ\"},{name:\"توملىتىش بۇيرۇقى\",legend:\"${bold} نى بېسىڭ\"},{name:\"يانتۇ بۇيرۇقى\",legend:\"${italic} نى بېسىڭ\"},{name:\"ئاستى سىزىق بۇيرۇقى\",legend:\"${underline} نى بېسىڭ\"},{name:\"ئۇلانما بۇيرۇقى\",legend:\"${link} نى بېسىڭ\"},{name:\"قورال بالداق قاتلاش بۇيرۇقى\",legend:\"${toolbarCollapse} نى بېسىڭ\"},{name:\"ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق\",legend:\"${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.\"},\n{name:\"كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق\",legend:\"${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.\"},{name:\"توسالغۇسىز لايىھە چۈشەندۈرۈشى\",legend:\"${a11yHelp} نى بېسىڭ\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Escape\",\npageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"سول يا ئوق\",upArrow:\"ئۈستى يا ئوق\",rightArrow:\"ئوڭ يا ئوق\",downArrow:\"ئاستى يا ئوق\",insert:\"قىستۇر\",\"delete\":\"ئۆچۈر\",leftWindowKey:\"سول Windows كۇنۇپكىسى\",rightWindowKey:\"ئوڭ Windows كۇنۇپكىسى\",selectKey:\"تاللاش كۇنۇپكىسى\",numpad0:\"سان تاختا 0\",numpad1:\"سان تاختا 1\",numpad2:\"سان تاختا 2\",numpad3:\"سان تاختا 3\",numpad4:\"سان تاختا 4\",numpad5:\"سان تاختا 5\",numpad6:\"سان تاختا 6\",numpad7:\"سان تاختا 7\",numpad8:\"سان تاختا 8\",numpad9:\"سان تاختا 9\",\nmultiply:\"يۇلتۇز كۇنۇپكىسى\",add:\"قوشۇش\",subtract:\"ئېلىش\",decimalPoint:\"كەسىر چېكىت\",divide:\"بۆلۈش\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"سان قۇلۇپ كۇنۇپكىسى\",scrollLock:\"سۈرگۈچ قۇلۇپ كۇنۇپكىسى\",semiColon:\"چېكىتلىك پەش\",equalSign:\"تەڭلىك بەلگىسى\",comma:\"پەش\",dash:\"سىزىقچە\",period:\"چېكىت\",forwardSlash:\"سولغا يانتۇ سىزىق\",graveAccent:\"ئۇرغۇ بەلگىسى\",openBracket:\"ئېچىلغان تىرناق\",backSlash:\"ئوڭغا يانتۇ سىزىق\",closeBracket:\"يېپىلغان تىرناق\",\nsingleQuote:\"يالاڭ پەش\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"uk\",{title:\"Спеціальні Інструкції\",contents:\"Довідка. Натисніть ESC і вона зникне.\",legend:[{name:\"Основне\",items:[{name:\"Панель Редактора\",legend:\"Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT+TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів.\"},{name:\"Діалог Редактора\",\nlegend:'Усередині діалогу, натисніть TAB щоб перейти до наступного елементу діалогу, натисніть SHIFT+TAB щоб перейти до попереднього елемента діалогу, натисніть ENTER щоб відправити діалог, натисніть ESC щоб скасувати діалог. Коли діалогове вікно має декілька вкладок, отримати доступ до панелі вкладок як частині діалогу можна натисканням або поєднання ALT+F10 або TAB, при цьому активні елементи діалогу будуть перебиратися з урахуванням порядку табуляції. При активній панелі вкладок, перехід до наступної або попередньої вкладці здійснюється натисканням стрілки \"ВПРАВО\" або стрілки \"ВЛЕВО\" відповідно.'},\n{name:\"Контекстне Меню Редактора\",legend:\"Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC.\"},{name:\"Скринька Списків Редактора\",legend:\"Усередині списку, перехід до наступного пункту списку виконується клавішею TAB або СТРІЛКА ВНИЗ. Перехід до попереднього елемента списку клавішею SHIFT+TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список.\"},\n{name:\"Шлях до елемента редактора\",legend:\"Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі.\"}]},{name:\"Команди\",items:[{name:\"Відмінити команду\",legend:\"Натисніть ${undo}\"},{name:\"Повторити\",legend:\"Натисніть ${redo}\"},{name:\"Жирний\",legend:\"Натисніть ${bold}\"},{name:\"Курсив\",legend:\"Натисніть ${italic}\"},\n{name:\"Підкреслений\",legend:\"Натисніть ${underline}\"},{name:\"Посилання\",legend:\"Натисніть ${link}\"},{name:\"Згорнути панель інструментів\",legend:\"Натисніть ${toolbarCollapse}\"},{name:\"Доступ до попереднього місця фокусування\",legend:\"Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.\"},{name:\"Доступ до наступного місця фокусування\",legend:\"Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.\"},\n{name:\"Допомога з доступності\",legend:\"Натисніть ${a11yHelp}\"}]}],backspace:\"Backspace\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Esc\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",leftArrow:\"Ліва стрілка\",upArrow:\"Стрілка вгору\",rightArrow:\"Права стрілка\",downArrow:\"Стрілка вниз\",insert:\"Вставити\",\"delete\":\"Видалити\",leftWindowKey:\"Ліва клавіша Windows\",rightWindowKey:\"Права клавіша Windows\",selectKey:\"Виберіть клавішу\",numpad0:\"Numpad 0\",\nnumpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"Множення\",add:\"Додати\",subtract:\"Віднімання\",decimalPoint:\"Десяткова кома\",divide:\"Ділення\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Крапка з комою\",equalSign:\"Знак рівності\",comma:\"Кома\",dash:\"Тире\",period:\"Період\",\nforwardSlash:\"Коса риска\",graveAccent:\"Гравіс\",openBracket:\"Відкрити дужку\",backSlash:\"Зворотна коса риска\",closeBracket:\"Закрити дужку\",singleQuote:\"Одинарні лапки\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"vi\",{title:\"Hướng dẫn trợ năng\",contents:\"Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.\",legend:[{name:\"Chung\",items:[{name:\"Thanh công cụ soạn thảo\",legend:\"Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT+TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công cụ.\"},{name:\"Hộp thoại Biên t\",legend:\"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively.\"},\n{name:\"Trình đơn Ngữ cảnh cBộ soạn thảo\",legend:\"Nhấn ${contextMenu} hoặc PHÍM ỨNG DỤNG để mở thực đơn ngữ cảnh. Sau đó nhấn TAB hoặc MŨI TÊN XUỐNG để di chuyển đến tuỳ chọn tiếp theo của thực đơn. Nhấn SHIFT+TAB hoặc MŨI TÊN LÊN để quay lại tuỳ chọn trước. Nhấn DẤU CÁCH hoặc ENTER để chọn tuỳ chọn của thực đơn. Nhấn DẤU CÁCH hoặc ENTER hoặc MŨI TÊN SANG PHẢI để mở thực đơn con của tuỳ chọn hiện tại. Nhấn ESC hoặc MŨI TÊN SANG TRÁI để quay trở lại thực đơn gốc. Nhấn ESC để đóng thực đơn ngữ cảnh.\"},\n{name:\"Hộp danh sách trình biên tập\",legend:\"Trong một danh sách chọn, di chuyển đối tượng tiếp theo với phím TAB hoặc phím mũi tên hướng xuống. Di chuyển đến đối tượng trước đó bằng cách nhấn tổ hợp phím SHIFT+TAB hoặc mũi tên hướng lên. Phím khoảng cách hoặc phím ENTER để chọn các tùy chọn trong danh sách. Nhấn phím ESC để đóng lại danh sách chọn.\"},{name:\"Thanh đường dẫn các đối tượng\",legend:\"Nhấn ${elementsPathFocus} để điều hướng các đối tượng trong thanh đường dẫn. Di chuyển đến đối tượng tiếp theo bằng phím TAB hoặc phím mũi tên bên phải. Di chuyển đến đối tượng trước đó bằng tổ hợp phím SHIFT+TAB hoặc phím mũi tên bên trái. Nhấn phím khoảng cách hoặc ENTER để chọn đối tượng trong trình soạn thảo.\"}]},\n{name:\"Lệnh\",items:[{name:\"Làm lại lện\",legend:\"Ấn ${undo}\"},{name:\"Làm lại lệnh\",legend:\"Ấn ${redo}\"},{name:\"Lệnh in đậm\",legend:\"Ấn ${bold}\"},{name:\"Lệnh in nghiêng\",legend:\"Ấn ${italic}\"},{name:\"Lệnh gạch dưới\",legend:\"Ấn ${underline}\"},{name:\"Lệnh liên kết\",legend:\"Nhấn ${link}\"},{name:\"Lệnh hiển thị thanh công cụ\",legend:\"Nhấn${toolbarCollapse}\"},{name:\"Truy cập đến lệnh tập trung vào khoảng cách trước đó\",legend:\"Ấn ${accessPreviousSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách.\"},\n{name:\"Truy cập phần đối tượng lệnh khoảng trống\",legend:\"Ấn ${accessNextSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách.\"},{name:\"Trợ giúp liên quan\",legend:\"Nhấn ${a11yHelp}\"}]}],backspace:\"Phím Backspace\",tab:\"Phím Tab\",enter:\"Phím Tab\",shift:\"Phím Shift\",ctrl:\"Phím Ctrl\",alt:\"Phím Alt\",pause:\"Phím Pause\",capslock:\"Phím Caps Lock\",\nescape:\"Phím Escape\",pageUp:\"Phím Page Up\",pageDown:\"Phím Page Down\",end:\"Phím End\",home:\"Phím Home\",leftArrow:\"Phím Left Arrow\",upArrow:\"Phím Up Arrow\",rightArrow:\"Phím Right Arrow\",downArrow:\"Phím Down Arrow\",insert:\"Chèn\",\"delete\":\"Xóa\",leftWindowKey:\"Phím Left Windows\",rightWindowKey:\"Phím Right Windows \",selectKey:\"Chọn phím\",numpad0:\"Phím 0\",numpad1:\"Phím 1\",numpad2:\"Phím 2\",numpad3:\"Phím 3\",numpad4:\"Phím 4\",numpad5:\"Phím 5\",numpad6:\"Phím 6\",numpad7:\"Phím 7\",numpad8:\"Phím 8\",numpad9:\"Phím 9\",\nmultiply:\"Nhân\",add:\"Thêm\",subtract:\"Trừ\",decimalPoint:\"Điểm số thập phân\",divide:\"Chia\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",f11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"Dấu chấm phẩy\",equalSign:\"Đăng nhập bằng\",comma:\"Dấu phẩy\",dash:\"Dấu gạch ngang\",period:\"Phím .\",forwardSlash:\"Phím /\",graveAccent:\"Phím `\",openBracket:\"Open Bracket\",backSlash:\"Dấu gạch chéo ngược\",closeBracket:\"Gần giá đỡ\",singleQuote:\"Trích dẫn\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"zh-cn\",{title:\"辅助功能说明\",contents:\"帮助内容。要关闭此对话框请按 ESC 键。\",legend:[{name:\"常规\",items:[{name:\"编辑器工具栏\",legend:\"按 ${toolbarFocus} 切换到工具栏，使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个或下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。\"},{name:\"编辑器对话框\",legend:\"在对话框内，按 TAB 键移动到下一个字段，按 SHIFT + TAB 组合键移动到上一个字段，按 ENTER 键提交对话框，按 ESC 键取消对话框。对于有多选项卡的对话框，可以按 ALT + F10 直接切换到或者按 TAB 键逐步移到选项卡列表，当焦点移到选项卡列表时可以用左右箭头键来移动到前后的选项卡。\"},{name:\"编辑器上下文菜单\",legend:\"用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项；SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键，ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。\"},\n{name:\"编辑器列表框\",legend:\"在列表框中，移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT+TAB 组合键或者上箭头键，用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。\"},{name:\"编辑器元素路径栏\",legend:\"按 ${elementsPathFocus} 以导航到元素路径栏，使用 TAB 键或右箭头键选择下一个元素，使用 SHIFT+TAB 组合键或左箭头键选择上一个元素，按空格键或回车键以选定编辑器里的元素。\"}]},{name:\"命令\",items:[{name:\" 撤消命令\",legend:\"按 ${undo}\"},{name:\" 重做命令\",legend:\"按 ${redo}\"},{name:\" 加粗命令\",legend:\"按 ${bold}\"},{name:\" 倾斜命令\",legend:\"按 ${italic}\"},{name:\" 下划线命令\",legend:\"按 ${underline}\"},{name:\" 链接命令\",legend:\"按 ${link}\"},{name:\" 工具栏折叠命令\",legend:\"按 ${toolbarCollapse}\"},\n{name:\"访问前一个焦点区域的命令\",legend:\"按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域，例如：两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。\"},{name:\"访问下一个焦点区域命令\",legend:\"按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如：两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。\"},{name:\"辅助功能帮助\",legend:\"按 ${a11yHelp}\"}]}],backspace:\"退格键\",tab:\"Tab 键\",enter:\"回车键\",shift:\"Shift 键\",ctrl:\"Ctrl 键\",alt:\"Alt 键\",pause:\"暂停键\",capslock:\"大写锁定键\",escape:\"Esc 键\",pageUp:\"上翻页键\",pageDown:\"下翻页键\",end:\"行尾键\",home:\"行首键\",leftArrow:\"向左箭头键\",upArrow:\"向上箭头键\",rightArrow:\"向右箭头键\",downArrow:\"向下箭头键\",\ninsert:\"插入键\",\"delete\":\"删除键\",leftWindowKey:\"左 WIN 键\",rightWindowKey:\"右 WIN 键\",selectKey:\"选择键\",numpad0:\"小键盘 0 键\",numpad1:\"小键盘 1 键\",numpad2:\"小键盘 2 键\",numpad3:\"小键盘 3 键\",numpad4:\"小键盘 4 键\",numpad5:\"小键盘 5 键\",numpad6:\"小键盘 6 键\",numpad7:\"小键盘 7 键\",numpad8:\"小键盘 8 键\",numpad9:\"小键盘 9 键\",multiply:\"星号键\",add:\"加号键\",subtract:\"减号键\",decimalPoint:\"小数点键\",divide:\"除号键\",f1:\"F1 键\",f2:\"F2 键\",f3:\"F3 键\",f4:\"F4 键\",f5:\"F5 键\",f6:\"F6 键\",f7:\"F7 键\",f8:\"F8 键\",f9:\"F9 键\",f10:\"F10 键\",f11:\"F11 键\",f12:\"F12 键\",numLock:\"数字锁定键\",scrollLock:\"滚动锁定键\",\nsemiColon:\"分号键\",equalSign:\"等号键\",comma:\"逗号键\",dash:\"短划线键\",period:\"句号键\",forwardSlash:\"斜杠键\",graveAccent:\"重音符键\",openBracket:\"左中括号键\",backSlash:\"反斜杠键\",closeBracket:\"右中括号键\",singleQuote:\"单引号键\"});"
  },
  {
    "path": "assets/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"a11yhelp\",\"zh\",{title:\"輔助工具指南\",contents:\"說明內容。若要關閉此對話框請按「ESC」。\",legend:[{name:\"一般\",items:[{name:\"編輯器工具列\",legend:\"請按 ${toolbarFocus} 以導覽到工具列。利用 TAB 或 SHIFT+TAB 以便移動到下一個及前一個工具列群組。利用右方向鍵或左方向鍵以便移動到下一個及上一個工具列按鈕。按下空白鍵或 ENTER 鍵啟用工具列按鈕。\"},{name:\"編輯器對話方塊\",legend:\"在對話框中，按下 TAB 鍵以導覽到下一個對話框元素，按下 SHIFT+TAB 以移動到上一個對話框元素，按下 ENTER 以遞交對話框，按下 ESC 以取消對話框。當對話框有多個分頁時，可以使用 ALT+F10 或是在對話框分頁順序中的一部份按下 TAB 以使用分頁列表。焦點在分頁列表上時，分別使用右方向鍵及左方向鍵移動到下一個及上一個分頁。\"},{name:\"編輯器內容功能表\",legend:\"請按下「${contextMenu}」或是「應用程式鍵」以開啟內容選單。以「TAB」或是「↓」鍵移動到下一個選單選項。以「SHIFT + TAB」或是「↑」鍵移動到上一個選單選項。按下「空白鍵」或是「ENTER」鍵以選取選單選項。以「空白鍵」或「ENTER」或「→」開啟目前選項之子選單。以「ESC」或「←」回到父選單。以「ESC」鍵關閉內容選單」。\"},\n{name:\"編輯器清單方塊\",legend:\"在清單方塊中，使用 TAB 或下方向鍵移動到下一個列表項目。使用 SHIFT+TAB 或上方向鍵移動到上一個列表項目。按下空白鍵或 ENTER 以選取列表選項。按下 ESC 以關閉清單方塊。\"},{name:\"編輯器元件路徑工具列\",legend:\"請按 ${elementsPathFocus} 以瀏覽元素路徑列。利用 TAB 或右方向鍵以便移動到下一個元素按鈕。利用 SHIFT 或左方向鍵以便移動到上一個按鈕。按下空白鍵或 ENTER 鍵來選取在編輯器中的元素。\"}]},{name:\"命令\",items:[{name:\"復原命令\",legend:\"請按下「${undo}」\"},{name:\"重複命令\",legend:\"請按下「 ${redo}」\"},{name:\"粗體命令\",legend:\"請按下「${bold}」\"},{name:\"斜體\",legend:\"請按下「${italic}」\"},{name:\"底線命令\",legend:\"請按下「${underline}」\"},{name:\"連結\",legend:\"請按下「${link}」\"},\n{name:\"隱藏工具列\",legend:\"請按下「${toolbarCollapse}」\"},{name:\"存取前一個焦點空間命令\",legend:\"請按下 ${accessPreviousSpace} 以存取最近但無法靠近之插字符號前的焦點空間。舉例：二個相鄰的 HR 元素。\\r\\n重複按鍵以存取較遠的焦點空間。\"},{name:\"存取下一個焦點空間命令\",legend:\"請按下 ${accessNextSpace} 以存取最近但無法靠近之插字符號後的焦點空間。舉例：二個相鄰的 HR 元素。\\r\\n重複按鍵以存取較遠的焦點空間。\"},{name:\"協助工具說明\",legend:\"請按下「${a11yHelp}」\"}]}],backspace:\"退格鍵\",tab:\"Tab\",enter:\"Enter\",shift:\"Shift\",ctrl:\"Ctrl\",alt:\"Alt\",pause:\"Pause\",capslock:\"Caps Lock\",escape:\"Esc\",pageUp:\"Page Up\",pageDown:\"Page Down\",end:\"End\",home:\"Home\",\nleftArrow:\"向左箭號\",upArrow:\"向上鍵號\",rightArrow:\"向右鍵號\",downArrow:\"向下鍵號\",insert:\"插入\",\"delete\":\"刪除\",leftWindowKey:\"左方 Windows 鍵\",rightWindowKey:\"右方 Windows 鍵\",selectKey:\"選擇鍵\",numpad0:\"Numpad 0\",numpad1:\"Numpad 1\",numpad2:\"Numpad 2\",numpad3:\"Numpad 3\",numpad4:\"Numpad 4\",numpad5:\"Numpad 5\",numpad6:\"Numpad 6\",numpad7:\"Numpad 7\",numpad8:\"Numpad 8\",numpad9:\"Numpad 9\",multiply:\"乘號\",add:\"新增\",subtract:\"減號\",decimalPoint:\"小數點\",divide:\"除號\",f1:\"F1\",f2:\"F2\",f3:\"F3\",f4:\"F4\",f5:\"F5\",f6:\"F6\",f7:\"F7\",f8:\"F8\",f9:\"F9\",f10:\"F10\",\nf11:\"F11\",f12:\"F12\",numLock:\"Num Lock\",scrollLock:\"Scroll Lock\",semiColon:\"分號\",equalSign:\"等號\",comma:\"逗號\",dash:\"虛線\",period:\"句點\",forwardSlash:\"斜線\",graveAccent:\"抑音符號\",openBracket:\"左方括號\",backSlash:\"反斜線\",closeBracket:\"右方括號\",singleQuote:\"單引號\"});"
  },
  {
    "path": "assets/ckeditor/plugins/about/dialogs/about.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"about\",function(a){a=a.lang.about;var b=CKEDITOR.getUrl(CKEDITOR.plugins.get(\"about\").path+\"dialogs/\"+(CKEDITOR.env.hidpi?\"hidpi/\":\"\")+\"logo_ckeditor.png\");return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:\"tab1\",label:\"\",title:\"\",expand:!0,padding:0,elements:[{type:\"html\",html:'\\x3cstyle type\\x3d\"text/css\"\\x3e.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+\nb+\");\"+(CKEDITOR.env.hidpi?\"background-size:163px 58px;\":\"\")+'background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}\\x3c/style\\x3e\\x3cdiv class\\x3d\"cke_about_container\"\\x3e\\x3cdiv class\\x3d\"cke_about_logo\"\\x3e\\x3c/div\\x3e\\x3cp\\x3eCKEditor '+CKEDITOR.version+\" (revision \"+CKEDITOR.revision+')\\x3cbr\\x3e\\x3ca target\\x3d\"_blank\" href\\x3d\"http://ckeditor.com/\"\\x3ehttp://ckeditor.com\\x3c/a\\x3e\\x3c/p\\x3e\\x3cp\\x3e'+\na.help.replace(\"$1\",'\\x3ca target\\x3d\"_blank\" href\\x3d\"http://docs.ckeditor.com/user\"\\x3e'+a.userGuide+\"\\x3c/a\\x3e\")+\"\\x3c/p\\x3e\\x3cp\\x3e\"+a.moreInfo+'\\x3cbr\\x3e\\x3ca target\\x3d\"_blank\" href\\x3d\"http://ckeditor.com/about/license\"\\x3ehttp://ckeditor.com/about/license\\x3c/a\\x3e\\x3c/p\\x3e\\x3cp\\x3e'+a.copy.replace(\"$1\",'\\x3ca target\\x3d\"_blank\" href\\x3d\"http://cksource.com/\"\\x3eCKSource\\x3c/a\\x3e - Frederico Knabben')+\"\\x3c/p\\x3e\\x3c/div\\x3e\"}]}],buttons:[CKEDITOR.dialog.cancelButton]}});"
  },
  {
    "path": "assets/ckeditor/plugins/clipboard/dialogs/paste.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"paste\",function(c){function k(a){var b=new CKEDITOR.dom.document(a.document),g=b.getBody(),d=b.getById(\"cke_actscrpt\");d&&d.remove();g.setAttribute(\"contenteditable\",!0);g.on(e.mainPasteEvent,function(a){a=e.initPasteDataTransfer(a);f?a!=f&&(f=e.initPasteDataTransfer()):f=a});if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on(\"blur\",function(){b.$.selection.empty()});b.on(\"keydown\",function(a){a=a.data;var b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+\n9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire(\"ariaWidget\",new CKEDITOR.dom.element(a.frameElement));b.getWindow().getFrame().removeCustomData(\"pendingFocus\")&&g.focus()}var h=c.lang.clipboard,e=CKEDITOR.plugins.clipboard,f;c.on(\"pasteDialogCommit\",function(a){a.data&&c.fire(\"paste\",{type:\"auto\",dataValue:a.data.dataValue,method:\"paste\",dataTransfer:a.data.dataTransfer||e.initPasteDataTransfer()})},null,null,1E3);return{title:h.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:\n350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||h.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&\"rtl\"==c.lang.dir&&this.parts.contents.setStyle(\"overflow\",\"hidden\")},onOk:function(){this.commitContent()},contents:[{id:\"general\",label:c.lang.common.generalTab,elements:[{type:\"html\",id:\"securityMsg\",html:'\\x3cdiv style\\x3d\"white-space:normal;width:340px\"\\x3e'+\nh.securityMsg+\"\\x3c/div\\x3e\"},{type:\"html\",id:\"pasteMsg\",html:'\\x3cdiv style\\x3d\"white-space:normal;width:340px\"\\x3e'+h.pasteMsg+\"\\x3c/div\\x3e\"},{type:\"html\",id:\"editing_area\",style:\"width:100%;height:100%\",html:\"\",focus:function(){var a=this.getInputElement(),b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData(\"pendingFocus\",1):b.focus()},setup:function(){var a=this.getDialog(),b='\\x3chtml dir\\x3d\"'+c.config.contentsLangDirection+'\" lang\\x3d\"'+(c.config.contentsLanguage||c.langCode)+\n'\"\\x3e\\x3chead\\x3e\\x3cstyle\\x3ebody{margin:3px;height:95%;word-break:break-all;}\\x3c/style\\x3e\\x3c/head\\x3e\\x3cbody\\x3e\\x3cscript id\\x3d\"cke_actscrpt\" type\\x3d\"text/javascript\"\\x3ewindow.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(k,a)+\",this);\\x3c/script\\x3e\\x3c/body\\x3e\\x3c/html\\x3e\",g=CKEDITOR.env.air?\"javascript:void(0)\":CKEDITOR.env.ie&&!CKEDITOR.env.edge?\"javascript:void((function(){\"+encodeURIComponent(\"document.open();(\"+CKEDITOR.tools.fixDomain+\")();document.close();\")+\n'})())\"':\"\",d=CKEDITOR.dom.element.createFromHtml('\\x3ciframe class\\x3d\"cke_pasteframe\" frameborder\\x3d\"0\"  allowTransparency\\x3d\"true\" src\\x3d\"'+g+'\" aria-label\\x3d\"'+h.pasteArea+'\" aria-describedby\\x3d\"'+a.getContentElement(\"general\",\"pasteMsg\").domId+'\"\\x3e\\x3c/iframe\\x3e');f=null;d.on(\"load\",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());CKEDITOR.env.air&&k.call(this,a.getWindow().$)},a);d.setCustomData(\"dialog\",a);a=this.getElement();a.setHtml(\"\");\na.append(d);if(CKEDITOR.env.ie&&!CKEDITOR.env.edge){var e=CKEDITOR.dom.element.createFromHtml('\\x3cspan tabindex\\x3d\"-1\" style\\x3d\"position:absolute\" role\\x3d\"presentation\"\\x3e\\x3c/span\\x3e');e.on(\"focus\",function(){setTimeout(function(){d.$.contentWindow.focus()})});a.append(e);this.focus=function(){e.focus();this.fire(\"focus\")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle(\"display\",\"block\"),a.setStyle(\"height\",d.$.offsetHeight+2+\"px\"))},commit:function(){var a=this.getDialog().getParentEditor(),\nb=this.getInputElement().getFrameDocument().getBody(),c=b.getBogus(),d;c&&c.remove();d=b.getHtml();setTimeout(function(){a.fire(\"pasteDialogCommit\",{dataValue:d,dataTransfer:f||e.initPasteDataTransfer()})},0)}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/af.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'af', {\n\ttoolbar: 'Bron',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ar.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ar', {\n\ttoolbar: 'المصدر',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/bg.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'bg', {\n\ttoolbar: 'Източник',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/bn.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'bn', {\n\ttoolbar: 'সোর্স',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/bs.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'bs', {\n\ttoolbar: 'HTML kôd',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ca.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ca', {\n\ttoolbar: 'Codi font',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/cs.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'cs', {\n\ttoolbar: 'Zdroj',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/cy.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'cy', {\n\ttoolbar: 'HTML',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/da.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'da', {\n\ttoolbar: 'Kilde',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/de.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'de', {\n    toolbar: 'Quellcode',\n    searchCode: 'Quellcode durchsuchen',\n\tautoFormat: 'Auswahl formatieren',\n\tcommentSelectedRange: 'Auswahl auskommentieren',\n\tuncommentSelectedRange: 'Auskommentierung entfernen',\n\tautoCompleteToggle: 'HTML Tag Autovervollständigen de-/aktivieren'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/el.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'el', {\n\ttoolbar: 'HTML κώδικας',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/en-au.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'en-au', {\n\ttoolbar: 'Source',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/en-ca.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'en-ca', {\n\ttoolbar: 'Source',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/en-gb.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'en-gb', {\n\ttoolbar: 'Source',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/en.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'en', {\n    toolbar: 'Source',\n    searchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/eo.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'eo', {\n\ttoolbar: 'Fonto',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/es.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'es', {\n\ttoolbar: 'Fuente HTML',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/et.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'et', {\n\ttoolbar: 'Lähtekood',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/eu.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'eu', {\n\ttoolbar: 'HTML Iturburua',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/fa.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'fa', {\n\ttoolbar: 'منبع',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/fi.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'fi', {\n\ttoolbar: 'Koodi',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/fo.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'fo', {\n\ttoolbar: 'Kelda',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/fr-ca.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'fr-ca', {\n\ttoolbar: 'Source',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/fr.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'fr', {\n\ttoolbar: 'Source',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/gl.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'gl', {\n\ttoolbar: 'Código Fonte',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/gu.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'gu', {\n\ttoolbar: 'મૂળ કે પ્રાથમિક દસ્તાવેજ',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/he.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'he', {\n\ttoolbar: 'מקור',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/hi.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'hi', {\n\ttoolbar: 'सोर्स',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/hr.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'hr', {\n\ttoolbar: 'Kôd',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/hu.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'hu', {\n\ttoolbar: 'Forráskód',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/is.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'is', {\n\ttoolbar: 'Kóði',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/it.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'it', {\n\ttoolbar: 'Codice Sorgente',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ja.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ja', {\n\ttoolbar: 'ソース',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ka.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ka', {\n\ttoolbar: 'კოდები',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/km.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'km', {\n\ttoolbar: 'កូត',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ko.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ko', {\n\ttoolbar: '소스',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ku.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ku', {\n\ttoolbar: 'سەرچاوە',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/lt.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'lt', {\n\ttoolbar: 'Šaltinis',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/lv.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'lv', {\n\ttoolbar: 'HTML kods',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/mk.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'mk', {\n\ttoolbar: 'Source',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/mn.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'mn', {\n\ttoolbar: 'Код',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ms.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ms', {\n\ttoolbar: 'Sumber',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/nb.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'nb', {\n\ttoolbar: 'Kilde',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/nl.js",
    "content": "/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'nl', {\n\ttoolbar: 'Broncode',\n\tsearchCode: 'Zoek in broncode',\n\tautoFormat: 'Formatteer selectie',\n\tcommentSelectedRange: 'Zet selectie in commentaar',\n\tuncommentSelectedRange: 'Haal selectie uit commentaar',\n\tautoCompleteToggle: 'Zet automatisch aanvullen van HTML tags aan/uit'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/no.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'no', {\n\ttoolbar: 'Kilde',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/pl.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'pl', {\n\ttoolbar: 'Źródło dokumentu',\n\tautoFormat: 'Sformatuj zaznaczenie',\n\tcommentSelectedRange: 'Zakomentuj zaznaczenie',\n\tuncommentSelectedRange: 'Odkomentuj zaznaczenie',\n\tsearchCode: 'Wyszukaj w źródle',\n\tautoCompleteToggle: 'Włącza/Wyłącza automatyczne uzupełniania tagów HTML'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/pt-br.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'pt-br', {\n\ttoolbar: 'Código-Fonte',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/pt.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'pt', {\n\ttoolbar: 'Fonte',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ro.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ro', {\n\ttoolbar: 'Sursa',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ru.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ru', {\n\ttoolbar: 'Источник',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/sk.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'sk', {\n\ttoolbar: 'Zdroj',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/sl.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'sl', {\n\ttoolbar: 'Izvorna koda',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/sr-latn.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'sr-latn', {\n\ttoolbar: 'Kôd',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/sr.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'sr', {\n\ttoolbar: 'Kôд',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/sv.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'sv', {\n\ttoolbar: 'Källa',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/th.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'th', {\n\ttoolbar: 'ดูรหัส HTML',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/tr.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'tr', {\n\ttoolbar: 'Kaynak',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/ug.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'ug', {\n\ttoolbar: 'مەنبە',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/uk.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'uk', {\n\ttoolbar: 'Джерело',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/vi.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'vi', {\n\ttoolbar: 'Mã HTML',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/zh-cn.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'zh-cn', {\n\ttoolbar: '源码',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/lang/zh.js",
    "content": "﻿/*\nCopyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang( 'codemirror', 'zh', {\n\ttoolbar: '原始碼',\n\tsearchCode: 'Search Source',\n\tautoFormat: 'Format Selection',\n\tcommentSelectedRange: 'Comment Selection',\n\tuncommentSelectedRange: 'Uncomment Selection',\n\tautoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'\n});\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/plugin.js",
    "content": "/*\n*  The \"codemirror\" plugin. It's indented to enhance the\n*  \"sourcearea\" editing mode, which displays the xhtml source code with\n*  syntax highlight and line numbers.\n* Licensed under the MIT license\n* CodeMirror Plugin: http://codemirror.net/ (MIT License)\n*/\n\n(function() {\n    CKEDITOR.plugins.add('codemirror', {\n        icons: 'searchcode,autoformat,commentselectedrange,uncommentselectedrange,autocomplete', // %REMOVE_LINE_CORE%\n        lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en-au,en-ca,en-gb,en,eo,es,et,eu,fa,fi,fo,fr-ca,fr,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt-br,pt,ro,ru,sk,sl,sr-latn,sr,sv,th,tr,ug,uk,vi,zh-cn,zh', // %REMOVE_LINE_CORE%\n        version: 1.13,\n        init: function (editor) {\n            var rootPath = this.path,\n                defaultConfig = {\n                    autoCloseBrackets: true,\n                    autoCloseTags: true,\n                    autoFormatOnStart: false,\n                    autoFormatOnUncomment: true,\n                    continueComments: true,\n                    enableCodeFolding: true,\n                    enableCodeFormatting: true,\n                    enableSearchTools: true,\n                    highlightMatches: true,\n                    indentWithTabs: false,\n                    lineNumbers: true,\n                    lineWrapping: true,\n                    mode: 'htmlmixed',\n                    matchBrackets: true,\n                    matchTags: true,\n                    showAutoCompleteButton: true,\n                    showCommentButton: true,\n                    showFormatButton: true,\n                    showSearchButton: true,\n                    showTrailingSpace: true,\n                    showUncommentButton: true,\n                    styleActiveLine: true,\n                    theme: 'default',\n                    useBeautify: false\n                };\n            \n            // Get Config & Lang\n            var config = CKEDITOR.tools.extend(defaultConfig, editor.config.codemirror || {}, true),\n                lang = editor.lang.codemirror;\n            \n            // check for old config settings for legacy support\n            if (editor.config.codemirror_theme) {\n                config.theme = editor.config.codemirror_theme;\n            }\n            if (editor.config.codemirror_autoFormatOnStart) {\n                config.autoFormatOnStart = editor.config.codemirror_autoFormatOnStart;\n            }\n\n            // automatically switch to bbcode mode if bbcode plugin is enabled\n            if (editor.plugins.bbcode && config.mode.indexOf(\"bbcode\") <= 0) {\n                config.mode = \"bbcode\";\n            }\n\n            // Source mode isn't available in inline mode yet.\n            if (editor.elementMode === CKEDITOR.ELEMENT_MODE_INLINE || editor.plugins.sourcedialog) {\n                \n                // Override Source Dialog\n                CKEDITOR.dialog.add('sourcedialog', function (editor) {\n                    var size = CKEDITOR.document.getWindow().getViewPaneSize(),\n                        width = Math.min(size.width - 70, 800),\n                        height = size.height / 1.5,\n                        oldData;\n\n                    function loadCodeMirrorInline(editor, textarea) {\n                        window[\"codemirror_\" + editor.id] = CodeMirror.fromTextArea(textarea, {\n                            mode: config.mode,\n                            matchBrackets: config.matchBrackets,\n                            matchTags: config.matchTags,\n                            workDelay: 300,\n                            workTime: 35,\n                            readOnly: editor.readOnly,\n                            lineNumbers: config.lineNumbers,\n                            lineWrapping: config.lineWrapping,\n                            autoCloseTags: config.autoCloseTags,\n                            autoCloseBrackets: config.autoCloseBrackets,\n                            highlightSelectionMatches: config.highlightMatches,\n                            continueComments: config.continueComments,\n                            indentWithTabs: config.indentWithTabs,\n                            theme: config.theme,\n                            showTrailingSpace: config.showTrailingSpace,\n                            showCursorWhenSelecting: true,\n                            styleActiveLine: config.styleActiveLine,\n                            viewportMargin: Infinity,\n                            //extraKeys: {\"Ctrl-Space\": \"autocomplete\"},\n                            extraKeys: {\n                                \"Ctrl-Q\": function (codeMirror_Editor) {\n                                    if (config.enableCodeFolding) {\n                                        window[\"foldFunc_\" + editor.id](codeMirror_Editor, codeMirror_Editor.getCursor().line);\n                                    }\n                                },\n                                \"'>'\": function (codeMirror_Editor) {\n                                    codeMirror_Editor.closeTag(codeMirror_Editor, '>');\n                                },\n                                \"'/'\": function (codeMirror_Editor) {\n                                    codeMirror_Editor.closeTag(codeMirror_Editor, '/');\n                                }\n                            },\n                            foldGutter: true,\n                            gutters: [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"],\n                            onKeyEvent: function (codeMirror_Editor, evt) {\n                                if (config.enableCodeFormatting) {\n                                    var range = getSelectedRange();\n                                    if (evt.type === \"keydown\" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && !evt.altKey) {\n                                        window[\"codemirror_\" + editor.id].commentRange(true, range.from, range.to);\n                                    } else if (evt.type === \"keydown\" && evt.ctrlKey && evt.keyCode === 75 && evt.shiftKey && !evt.altKey) {\n                                        window[\"codemirror_\" + editor.id].commentRange(false, range.from, range.to);\n                                        if (config.autoFormatOnUncomment) {\n                                            window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n                                        }\n                                    } else if (evt.type === \"keydown\" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && evt.altKey) {\n                                        window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n                                    }\n                                    /*else if (evt.type === \"keydown\") {\n                                        CodeMirror.commands.newlineAndIndentContinueMarkdownList(window[\"codemirror_\" + editor.id]);\n                                    }*/\n                                }\n                            }\n                        });\n\n                        var holderHeight = height + 'px';\n                        var holderWidth = width + 'px';\n\n                        // Store config so we can access it within commands etc.\n                        window[\"codemirror_\" + editor.id].config = config;\n                        \n                        if (config.autoFormatOnStart) {\n                            if (config.useBeautify) {\n                                var indent_size = 4,\n                                    indent_char = ' ',\n                                    brace_style = 'collapse'; //collapse, expand, end-expand \n\n                                var source = window[\"codemirror_\" + editor.id].getValue();\n\n                                window[\"codemirror_\" + editor.id].setValue(html_beautify(source, indent_size, indent_char, 120, brace_style));\n                            } else {\n                                window[\"codemirror_\" + editor.id].autoFormatAll({\n                                    line: 0,\n                                    ch: 0\n                                }, {\n                                    line: window[\"codemirror_\" + editor.id].lineCount(),\n                                    ch: 0\n                                });\n                            }\n                        }\n\n                        function getSelectedRange() {\n                            return {\n                                from: window[\"codemirror_\" + editor.id].getCursor(true),\n                                to: window[\"codemirror_\" + editor.id].getCursor(false)\n                            };\n                        }\n\n                        window[\"codemirror_\" + editor.id].on(\"change\", function () {\n                            window[\"codemirror_\" + editor.id].save();\n                            editor.fire('change', this);\n                        });\n\n                        window[\"codemirror_\" + editor.id].setSize(holderWidth, holderHeight);\n\n                        // Enable Code Folding (Requires 'lineNumbers' to be set to 'true')\n                        if (config.lineNumbers && config.enableCodeFolding) {\n                            window[\"codemirror_\" + editor.id].on(\"gutterClick\", window[\"foldFunc_\" + editor.id]);\n                        }\n                        // Run config.onLoad callback, if present.\n                        if (typeof config.onLoad === 'function') {\n                            config.onLoad(window[\"codemirror_\" + editor.id], editor);\n                        }\n\n                        // inherit blur event\n                        window[\"codemirror_\" + editor.id].on(\"blur\", function () {\n                            editor.fire('blur', this);\n                        });\n                    }\n\n                    return {\n                        title: editor.lang.sourcedialog.title,\n                        minWidth: width,\n                        minHeight: height,\n                        resizable : CKEDITOR.DIALOG_RESIZE_NONE,\n                        onShow: function () {\n                            // Set Elements\n                            this.getContentElement('main', 'data').focus();\n                            this.getContentElement('main', 'AutoComplete').setValue(config.autoCloseTags, true);\n                            \n                            var textArea = this.getContentElement('main', 'data').getInputElement().$;\n                            \n                            // Load the content\n                            this.setValueOf('main', 'data', oldData = editor.getData());\n\n                            if (!IsStyleSheetAlreadyLoaded(rootPath + 'css/codemirror.min.css')) {\n                                CKEDITOR.document.appendStyleSheet(rootPath + 'css/codemirror.min.css');\n                            }\n\n                            if (config.theme.length && config.theme != 'default' && !IsStyleSheetAlreadyLoaded(rootPath + 'theme/' + config.theme + '.css')) {\n                                CKEDITOR.document.appendStyleSheet(rootPath + 'theme/' + config.theme + '.css');\n                            }\n\n                            if (typeof (CodeMirror) == 'undefined') {\n\n                                CKEDITOR.scriptLoader.load(rootPath + 'js/codemirror.min.js', function() {\n\n                                    CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {\n                                        loadCodeMirrorInline(editor, textArea);\n                                    });\n                                });\n\n\n                            } else {\n                                //loadCodeMirrorInline(editor, textArea);\n                                if (CodeMirror.prototype['autoFormatAll']) {\n                                    loadCodeMirrorInline(editor, textArea);\n                                } else {\n                                    // loading the add-on scripts.\n                                    CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {\n                                        loadCodeMirrorInline(editor, textArea);\n                                    });\n                                }\n                            }\n                        },\n                        onCancel: function (event) {\n                            if (event.data.hide) {\n                                window[\"codemirror_\" + editor.id].toTextArea();\n\n                                // Free Memory\n                                window[\"codemirror_\" + editor.id] = null;\n                            }\n                        },\n                        onOk: (function () {\n\n                            function setData(newData) {\n                                var that = this;\n\n                                editor.setData(newData, function () {\n                                    that.hide();\n\n                                    // Ensure correct selection.\n                                    var range = editor.createRange();\n                                    range.moveToElementEditStart(editor.editable());\n                                    range.select();\n                                });\n                            }\n\n                            return function () {\n                                window[\"codemirror_\" + editor.id].toTextArea();\n\n                                // Free Memory\n                                window[\"codemirror_\" + editor.id] = null;\n\n                                // Remove CR from input data for reliable comparison with editor data.\n                                var newData = this.getValueOf('main', 'data').replace(/\\r/g, '');\n\n                                // Avoid unnecessary setData. Also preserve selection\n                                // when user changed his mind and goes back to wysiwyg editing.\n                                if (newData === oldData)\n                                    return true;\n\n                                // Set data asynchronously to avoid errors in IE.\n                                CKEDITOR.env.ie ? CKEDITOR.tools.setTimeout(setData, 0, this, newData) : setData.call(this, newData);\n\n                                // Don't let the dialog close before setData is over.\n                                return false;\n                            };\n                        })(),\n\n                        contents: [{\n                            id: 'main',\n                            label: editor.lang.sourcedialog.title,\n                            elements: [\n                                {\n                                    type: 'hbox',\n                                    style: 'width: 80px;margin:0;',\n                                    widths: ['20px', '20px', '20px', '20px'],\n                                    children: [\n                                        {\n                                            type: 'button',\n                                            id: 'searchCode',\n                                            label: '',\n                                            title: lang.searchCode,\n                                            'class': 'searchCodeButton',\n                                            onClick: function() {\n                                                CodeMirror.commands.find(window[\"codemirror_\" + editor.id]);\n                                            }\n                                        }, {\n                                            type: 'button',\n                                            id: 'autoFormat',\n                                            label: '',\n                                            title: lang.autoFormat,\n                                            'class': 'autoFormat',\n                                            onClick: function() {\n                                                var range = {\n                                                    from: window[\"codemirror_\" + editor.id].getCursor(true),\n                                                    to: window[\"codemirror_\" + editor.id].getCursor(false)\n                                                };\n                                                window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n                                            }\n                                        }, {\n                                            type: 'button',\n                                            id: 'CommentSelectedRange',\n                                            label: '',\n                                            title: lang.commentSelectedRange,\n                                            'class': 'CommentSelectedRange',\n                                            onClick: function () {\n                                                var range = {\n                                                    from: window[\"codemirror_\" + editor.id].getCursor(true),\n                                                    to: window[\"codemirror_\" + editor.id].getCursor(false)\n                                                };\n                                                window[\"codemirror_\" + editor.id].commentRange(true, range.from, range.to);\n                                            }\n                                        }, {\n                                            type: 'button',\n                                            id: 'UncommentSelectedRange',\n                                            label: '',\n                                            title: lang.uncommentSelectedRange,\n                                            'class': 'UncommentSelectedRange',\n                                            onClick: function () {\n                                                var range = {\n                                                    from: window[\"codemirror_\" + editor.id].getCursor(true),\n                                                    to: window[\"codemirror_\" + editor.id].getCursor(false)\n                                                };\n                                                window[\"codemirror_\" + editor.id].commentRange(false, range.from, range.to);\n                                                if (window[\"codemirror_\" + editor.id].config.autoFormatOnUncomment) {\n                                                    window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n                                                }\n                                            }\n                                        }]\n                                }, {\n                                    type: 'checkbox',\n                                    id: 'AutoComplete',\n                                    label: lang.autoCompleteToggle,\n                                    title: lang.autoCompleteToggle,\n                                    onChange: function () {\n                                        window[\"codemirror_\" + editor.id].setOption(\"autoCloseTags\", this.getValue());\n                                    }\n                                }, {\n                                    type: 'textarea',\n                                    id: 'data',\n                                    dir: 'ltr',\n                                    inputStyle: 'cursor:auto;' +\n                                        'width:' + width + 'px;' +\n                                        'height:' + height + 'px;' +\n                                        'tab-size:4;' +\n                                        'text-align:left;',\n                                    'class': 'cke_source cke_enable_context_menu'\n                                }\n                            ]\n                        }]\n                    };\n                });\n\n               // return;\n            }\n            \n            /*\n            // Override Copy Button\n            if (editor.commands.copy) {\n                editor.commands.copy.modes = {\n                    wysiwyg: 1,\n                    source: 1\n                };\n\n                // TODO\n            }\n\n            // Override Paste Button\n            if (editor.commands.paste) {\n                editor.commands.paste.modes = {\n                    wysiwyg: 1,\n                    source: 1\n                };\n                // TODO\n\n            }\n\n            // Override Cut Button\n            if (editor.commands.cut) {\n                editor.commands.cut.modes = {\n                    wysiwyg: 1,\n                    source: 1\n                };\n\n                // TODO\n            }*/\n\n            // Override Find Button\n            if (editor.commands.find) {\n                editor.commands.find.modes = {\n                    wysiwyg: 1,\n                    source: 1\n                };\n\n                editor.commands.find.exec = function() {\n                    if (editor.mode === 'wysiwyg') {\n                        editor.openDialog('find');\n                    } else {\n                        CodeMirror.commands.find(window[\"codemirror_\" + editor.id]);\n                    }\n                };\n            }\n            \n            // Override Replace Button\n            if (editor.commands.replace) {\n                editor.commands.replace.modes = {\n                    wysiwyg: 1,\n                    source: 1\n                };\n\n                editor.commands.replace.exec = function () {\n                    if (editor.mode === 'wysiwyg') {\n                        editor.openDialog('replace');\n                    } else {\n                        CodeMirror.commands.replace(window[\"codemirror_\" + editor.id]);\n                    }\n                };\n            }\n            \n            var sourcearea = CKEDITOR.plugins.sourcearea;\n            \n            // check if sourcearea plugin is overrriden\n            if (!sourcearea.commands.searchCode) {\n\n                CKEDITOR.plugins.sourcearea.commands = {\n                    source: {\n                        modes: {\n                            wysiwyg: 1,\n                            source: 1\n                        },\n                        editorFocus: false,\n                        readOnly: 1,\n                        exec: function(editorInstance) {\n                            if (editorInstance.mode === 'wysiwyg') {\n                                editorInstance.fire('saveSnapshot');\n                            }\n                            editorInstance.getCommand('source').setState(CKEDITOR.TRISTATE_DISABLED);\n                            editorInstance.setMode(editorInstance.mode === 'source' ? 'wysiwyg' : 'source');\n                        },\n                        canUndo: false\n                    },\n                    searchCode: {\n                        modes: {\n                            wysiwyg: 0,\n                            source: 1\n                        },\n                        editorFocus: false,\n                        readOnly: 1,\n                        exec: function (editorInstance) {\n                            CodeMirror.commands.find(window[\"codemirror_\" + editorInstance.id]);\n                        },\n                        canUndo: true\n                    },\n                    autoFormat: {\n                        modes: {\n                            wysiwyg: 0,\n                            source: 1\n                        },\n                        editorFocus: false,\n                        readOnly: 1,\n                        exec: function (editorInstance) {\n                            var range = {\n                                from: window[\"codemirror_\" + editorInstance.id].getCursor(true),\n                                to: window[\"codemirror_\" + editorInstance.id].getCursor(false)\n                            };\n                            window[\"codemirror_\" + editorInstance.id].autoFormatRange(range.from, range.to);\n                        },\n                        canUndo: true\n                    },\n                    commentSelectedRange: {\n                        modes: {\n                            wysiwyg: 0,\n                            source: 1\n                        },\n                        editorFocus: false,\n                        readOnly: 1,\n                        exec: function (editorInstance) {\n                            var range = {\n                                from: window[\"codemirror_\" + editorInstance.id].getCursor(true),\n                                to: window[\"codemirror_\" + editorInstance.id].getCursor(false)\n                            };\n                            window[\"codemirror_\" + editorInstance.id].commentRange(true, range.from, range.to);\n                        },\n                        canUndo: true\n                    },\n                    uncommentSelectedRange: {\n                        modes: {\n                            wysiwyg: 0,\n                            source: 1\n                        },\n                        editorFocus: false,\n                        readOnly: 1,\n                        exec: function (editorInstance) {\n                            var range = {\n                                from: window[\"codemirror_\" + editorInstance.id].getCursor(true),\n                                to: window[\"codemirror_\" + editorInstance.id].getCursor(false)\n                            };\n                            window[\"codemirror_\" + editorInstance.id].commentRange(false, range.from, range.to);\n                            if (window[\"codemirror_\" + editorInstance.id].config.autoFormatOnUncomment) {\n                                window[\"codemirror_\" + editorInstance.id].autoFormatRange(\n                                    range.from,\n                                    range.to);\n                            }\n                        },\n                        canUndo: true\n                    },\n                    autoCompleteToggle: {\n                        modes: {\n                            wysiwyg: 0,\n                            source: 1\n                        },\n                        editorFocus: false,\n                        readOnly: 1,\n                        exec: function (editorInstance) {\n                            if (this.state == CKEDITOR.TRISTATE_ON) {\n                                window[\"codemirror_\" + editorInstance.id].setOption(\"autoCloseTags\", false);\n                            } else if (this.state == CKEDITOR.TRISTATE_OFF) {\n                                window[\"codemirror_\" + editorInstance.id].setOption(\"autoCloseTags\", true);\n                            }\n\n                            this.toggleState();\n                        },\n                        canUndo: true\n                    }\n                };\n            }\n\n            editor.addMode('source', function (callback) {\n                if (!IsStyleSheetAlreadyLoaded(rootPath + 'css/codemirror.min.css')) {\n                    CKEDITOR.document.appendStyleSheet(rootPath + 'css/codemirror.min.css');\n                }\n\n                if (config.theme.length && config.theme != 'default' && !IsStyleSheetAlreadyLoaded(rootPath + 'theme/' + config.theme + '.css')) {\n                    CKEDITOR.document.appendStyleSheet(rootPath + 'theme/' + config.theme + '.css');\n                }\n\n                if (typeof (CodeMirror) == 'undefined') {\n\n                    CKEDITOR.scriptLoader.load(rootPath + 'js/codemirror.min.js', function() {\n\n                        CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {\n                            loadCodeMirror(editor);\n                            callback();\n                        });\n                    });\n                } else {\n                    if (CodeMirror.prototype['autoFormatAll']) {\n                        loadCodeMirror(editor);\n                        callback();\n                    } else {\n                        // loading the add-on scripts.\n                        CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {\n                            loadCodeMirror(editor);\n                            callback();\n                        });\n                    }\n                }\n            });\n\n            function getCodeMirrorScripts() {\n                var scriptFiles = [rootPath + 'js/codemirror.addons.min.js'];\n\n                switch (config.mode) {\n                case \"bbcode\":\n                    {\n                        scriptFiles.push(rootPath + 'js/codemirror.mode.bbcode.min.js');\n                    }\n\n                    break;\n                case \"bbcodemixed\":\n                        {\n                            scriptFiles.push(rootPath + 'js/codemirror.mode.bbcodemixed.min.js');\n                        }\n\n                        break;\n                case \"htmlmixed\":\n                    {\n                        scriptFiles.push(rootPath + 'js/codemirror.mode.htmlmixed.min.js');\n                    }\n\n                    break;\n                case \"text/html\":\n                    {\n                        scriptFiles.push(rootPath + 'js/codemirror.mode.htmlmixed.min.js');\n                    }\n\n                    break;\n                case \"application/x-httpd-php\":\n                    {\n                        scriptFiles.push(rootPath + 'js/codemirror.mode.php.min.js');\n                    }\n\n                    break;\n                case \"text/javascript\":\n                    {\n                        scriptFiles.push(rootPath + 'js/codemirror.mode.javascript.min.js');\n                    }\n\n                    break;\n                default:\n                    scriptFiles.push(rootPath + 'js/codemirror.mode.htmlmixed.min.js');\n                }\n\n                if (config.useBeautify) {\n                    scriptFiles.push(rootPath + 'js/beautify.min.js');\n                }\n\n                if (config.enableSearchTools) {\n                    scriptFiles.push(rootPath + 'js/codemirror.addons.search.min.js');\n                }\n                return scriptFiles;\n            }\n\n            function loadCodeMirror(editor) {\n                var contentsSpace = editor.ui.space('contents'),\n                    textarea = contentsSpace.getDocument().createElement('textarea');\n\n                textarea.setStyles(\n                    CKEDITOR.tools.extend({\n                            // IE7 has overflow the <textarea> from wrapping table cell.\n                            width: CKEDITOR.env.ie7Compat ? '99%' : '100%',\n                            height: '100%',\n                            resize: 'none',\n                            outline: 'none',\n                            'text-align': 'left'\n                        },\n                        CKEDITOR.tools.cssVendorPrefix('tab-size', editor.config.sourceAreaTabSize || 4)));\n                var ariaLabel = [editor.lang.editor, editor.name].join(',');\n                textarea.setAttributes({\n                    dir: 'ltr',\n                    tabIndex: CKEDITOR.env.webkit ? -1 : editor.tabIndex,\n                    'role': 'textbox',\n                    'aria-label': ariaLabel\n                });\n                textarea.addClass('cke_source');\n                textarea.addClass('cke_reset');\n                textarea.addClass('cke_enable_context_menu');\n                editor.ui.space('contents').append(textarea);\n                window[\"editable_\" + editor.id] = editor.editable(new sourceEditable(editor, textarea));\n                // Fill the textarea with the current editor data.\n                window[\"editable_\" + editor.id].setData(editor.getData(1));\n                window[\"editable_\" + editor.id].editorID = editor.id;\n                editor.fire('ariaWidget', this);\n\n                var sourceAreaElement = window[\"editable_\" + editor.id],\n                    holderElement = sourceAreaElement.getParent();\n\n                /*CodeMirror.commands.autocomplete = function(cm) {\n                    CodeMirror.showHint(cm, CodeMirror.htmlHint);\n                };*/\n\n                // Enable Code Folding (Requires 'lineNumbers' to be set to 'true')\n                if (config.lineNumbers && config.enableCodeFolding) {\n                    window[\"foldFunc_\" + editor.id] = CodeMirror.newFoldFunction(CodeMirror.tagRangeFinder);\n                }\n\n                function getCodeMirrorKey(ckeditorKeystroke) {\n                    var MODIFIERS = [\n                        [CKEDITOR.SHIFT, \"Shift-\"],\n                        [CKEDITOR.CTRL, \"Ctrl-\"],\n                        [CKEDITOR.ALT, \"Alt-\"]\n                    ];\n                    var keyModifiers = \"\";\n                    for (var i = 0; i < MODIFIERS.length; i++) {\n                        if (ckeditorKeystroke & MODIFIERS[i][0]) {\n                            ckeditorKeystroke -= MODIFIERS[i][0];\n                            keyModifiers += MODIFIERS[i][1];\n                        }\n                    }\n                    if (CodeMirror.keyNames[ckeditorKeystroke]) {\n                        return keyModifiers + CodeMirror.keyNames[ckeditorKeystroke];\n                    }\n                    return null;\n                }\n\n                function addCKEditorKeystrokes(editorExtraKeys) {\n                    var ckeditorKeystrokes = editor.config.keystrokes;\n                    if (CKEDITOR.tools.isArray(ckeditorKeystrokes)) {\n                        for (var i = 0; i < ckeditorKeystrokes.length; i++) {\n                            var key = getCodeMirrorKey(ckeditorKeystrokes[i][0]);\n                            if (key !== null) {\n                                (function (command) {\n                                    editorExtraKeys[key] = function () {\n                                        editor.execCommand(command);\n                                    }\n                                })(ckeditorKeystrokes[i][1]);\n                            }\n                        }\n                    }\n                }\n\n                var extraKeys = {\n                    \"Ctrl-Q\": function(codeMirror_Editor) {\n                        if (config.enableCodeFolding) {\n                            window[\"foldFunc_\" + editor.id](codeMirror_Editor, codeMirror_Editor.getCursor().line);\n                        }\n                    },\n                    \"'>'\": function (codeMirror_Editor) {\n                        codeMirror_Editor.closeTag(codeMirror_Editor, '>');\n                    },\n                    \"'/'\": function (codeMirror_Editor) {\n                        codeMirror_Editor.closeTag(codeMirror_Editor, '/');\n                    }\n                };\n\n                addCKEditorKeystrokes(extraKeys);\n\n                window[\"codemirror_\" + editor.id] = CodeMirror.fromTextArea(sourceAreaElement.$, {\n                    mode: config.mode,\n                    matchBrackets: config.matchBrackets,\n                    matchTags: config.matchTags,\n                    workDelay: 300,\n                    workTime: 35,\n                    readOnly: editor.readOnly,\n                    lineNumbers: config.lineNumbers,\n                    lineWrapping: true,\n                    autoCloseTags: config.autoCloseTags,\n                    autoCloseBrackets: config.autoCloseBrackets,\n                    highlightSelectionMatches: config.highlightMatches,\n                    continueComments: config.continueComments,\n                    indentWithTabs: config.indentWithTabs,\n                    theme: config.theme,\n                    showTrailingSpace: config.showTrailingSpace,\n                    showCursorWhenSelecting: true,\n                    styleActiveLine: config.styleActiveLine,\n                    //extraKeys: {\"Ctrl-Space\": \"autocomplete\"},\n                    extraKeys: extraKeys,\n                    foldGutter: true,\n                    gutters: [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"],\n                    onKeyEvent: function (codeMirror_Editor, evt) {\n                        \n                        if (config.enableCodeFormatting) {\n                            var range = getSelectedRange();\n                            if (evt.type === \"keydown\" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && !evt.altKey) {\n                                window[\"codemirror_\" + editor.id].commentRange(true, range.from, range.to);\n                            } else if (evt.type === \"keydown\" && evt.ctrlKey && evt.keyCode === 75 && evt.shiftKey && !evt.altKey) {\n                                window[\"codemirror_\" + editor.id].commentRange(false, range.from, range.to);\n                                if (config.autoFormatOnUncomment) {\n                                    window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n                                }\n                            } else if (evt.type === \"keydown\" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && evt.altKey) {\n                                window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n                            }/* else if (evt.type === \"keydown\") {\n                                CodeMirror.commands.newlineAndIndentContinueMarkdownList(window[\"codemirror_\" + editor.id]);\n                            }*/\n                        }\n                    }\n                });\n\n                var holderHeight = holderElement.$.clientHeight == 0 ? editor.ui.space('contents').getStyle('height') : holderElement.$.clientHeight + 'px';\n                var holderWidth = holderElement.$.clientWidth + 'px';\n\n                // Store config so we can access it within commands etc.\n                window[\"codemirror_\" + editor.id].config = config;\n                if (config.autoFormatOnStart) {\n                    if (config.useBeautify) {\n                        var indent_size = 4;\n                        var indent_char = ' ';\n                        var brace_style = 'collapse'; //collapse, expand, end-expand \n\n                        var source = window[\"codemirror_\" + editor.id].getValue();\n\n                        window[\"codemirror_\" + editor.id].setValue(html_beautify(source, indent_size, indent_char, 120, brace_style));\n                    } else {\n                        window[\"codemirror_\" + editor.id].autoFormatAll({\n                            line: 0,\n                            ch: 0\n                        }, {\n                            line: window[\"codemirror_\" + editor.id].lineCount(),\n                            ch: 0\n                        });\n                    }\n                }\n\n                function getSelectedRange() {\n                    return {\n                        from: window[\"codemirror_\" + editor.id].getCursor(true),\n                        to: window[\"codemirror_\" + editor.id].getCursor(false)\n                    };\n                }\n\n                window[\"codemirror_\" + editor.id].on(\"change\", function () {\n                    window[\"codemirror_\" + editor.id].save();\n                    editor.fire('change', this);\n                });\n\n                window[\"codemirror_\" + editor.id].setSize(null, holderHeight);\n                \n                // Enable Code Folding (Requires 'lineNumbers' to be set to 'true')\n                if (config.lineNumbers && config.enableCodeFolding) {\n                    window[\"codemirror_\" + editor.id].on(\"gutterClick\", window[\"foldFunc_\" + editor.id]);\n                }\n\n                // Run config.onLoad callback, if present.\n                if (typeof config.onLoad === 'function') {\n                    config.onLoad(window[\"codemirror_\" + editor.id], editor);\n                }\n\n                // inherit blur event\n                window[\"codemirror_\" + editor.id].on(\"blur\", function () {\n                    editor.fire('blur', this);\n                });\n            }\n\n            editor.addCommand('source', sourcearea.commands.source);\n            if (editor.ui.addButton) {\n                editor.ui.addButton('Source', {\n                    label: editor.lang.codemirror.toolbar,\n                    command: 'source',\n                    toolbar: 'mode,10'\n                });\n            }\n            if (config.enableCodeFormatting) {\n                editor.addCommand('searchCode', sourcearea.commands.searchCode);\n                editor.addCommand('autoFormat', sourcearea.commands.autoFormat);\n                editor.addCommand('commentSelectedRange', sourcearea.commands.commentSelectedRange);\n                editor.addCommand('uncommentSelectedRange', sourcearea.commands.uncommentSelectedRange);\n                editor.addCommand('autoCompleteToggle', sourcearea.commands.autoCompleteToggle);\n\n                if (editor.ui.addButton) {\n                    if (config.showFormatButton || config.showCommentButton || config.showUncommentButton || config.showSearchButton) {\n                        editor.ui.add('-', CKEDITOR.UI_SEPARATOR, { toolbar: 'mode,30' });\n                    }\n                    /*if (config.showSearchButton && config.enableSearchTools) {\n                        editor.ui.addButton('searchCode', {\n                            label: lang.searchCode,\n                            command: 'searchCode',\n                            toolbar: 'mode,40'\n                        });\n                    }*/\n                    if (config.showFormatButton) {\n                        editor.ui.addButton('autoFormat', {\n                            label: lang.autoFormat,\n                            command: 'autoFormat',\n                            toolbar: 'mode,50'\n                        });\n                    }\n                    if (config.showCommentButton) {\n                        editor.ui.addButton('CommentSelectedRange', {\n                            label: lang.commentSelectedRange,\n                            command: 'commentSelectedRange',\n                            toolbar: 'mode,60'\n                        });\n                    }\n                    if (config.showUncommentButton) {\n                        editor.ui.addButton('UncommentSelectedRange', {\n                            label: lang.uncommentSelectedRange,\n                            command: 'uncommentSelectedRange',\n                            toolbar: 'mode,70'\n                        });\n                    }\n                    if (config.showAutoCompleteButton) {\n                        editor.ui.addButton('AutoComplete', {\n                            label: lang.autoCompleteToggle,\n                            command: 'autoCompleteToggle',\n                            toolbar: 'mode,80'\n                        });\n                    }\n                }\n            }\n            \n            editor.on('beforeModeUnload', function (evt) {\n                if (editor.mode === 'source' && editor.plugins.textselection) {\n\n                    var range = editor.getTextSelection();\n\n                    range.startOffset = LineChannelToOffSet(window[\"codemirror_\" + editor.id], window[\"codemirror_\" + editor.id].getCursor(true));\n                    range.endOffset = LineChannelToOffSet(window[\"codemirror_\" + editor.id], window[\"codemirror_\" + editor.id].getCursor(false));\n\n                    // Fly the range when create bookmark. \n                    delete range.element;\n                    range.createBookmark(editor);\n                    sourceBookmark = true;\n\n                    evt.data = range.content;\n                }\n            });\n            editor.on('mode', function () {\n                editor.getCommand('source').setState(editor.mode === 'source' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF);\n\n                if (editor.mode === 'source') {\n                    editor.getCommand('autoCompleteToggle').setState(window[\"codemirror_\" + editor.id].config.autoCloseTags ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF);\n\n                    if (editor.plugins.textselection && textRange) {\n\n                        //textRange.element = new CKEDITOR.dom.element(editor._.editable.$);\n                        //textRange.select();\n\n                        var start, end;\n\n                        start = OffSetToLineChannel(window[\"codemirror_\" + editor.id], textRange.startOffset);\n\n                        if (typeof (textRange.endOffset) == 'undefined') {\n                            window[\"codemirror_\" + editor.id].focus();\n                            window[\"codemirror_\" + editor.id].setCursor(start);\n                        } else {\n                            window[\"codemirror_\" + editor.id].focus();\n                            end = OffSetToLineChannel(window[\"codemirror_\" + editor.id], textRange.endOffset);\n                            window[\"codemirror_\" + editor.id].setSelection(start, end);\n                        }\n                    }\n                }\n\n            });\n            editor.on('resize', function() {\n                if (window[\"editable_\" + editor.id] && editor.mode === 'source') {\n                    var holderElement = window[\"editable_\" + editor.id].getParent();\n                    var holderHeight = holderElement.$.clientHeight + 'px';\n                    var holderWidth = holderElement.$.clientWidth + 'px';\n                    window[\"codemirror_\" + editor.id].setSize(holderWidth, holderHeight);\n                }\n            });\n            \n            editor.on('readOnly', function () {\n                if (window[\"editable_\" + editor.id] && editor.mode === 'source') {\n                    window[\"codemirror_\" + editor.id].setOption(\"readOnly\", this.readOnly);\n                }\n            });\n            \n            editor.on('instanceReady', function (evt) {\n\n                // Fix native context menu\n                editor.container.getPrivate().events.contextmenu.listeners.splice(0, 1);\n\n                var selectAllCommand = editor.commands.selectAll;\n\n                // Replace Complete SelectAll command from the plugin, otherwise it will not work in IE10\n                if (selectAllCommand != null) {\n                    selectAllCommand.exec = function () {\n                        if (editor.mode === 'source') {\n                            window[\"codemirror_\" + editor.id].setSelection({\n                                line: 0,\n                                ch: 0\n                            }, {\n                                line: window[\"codemirror_\" + editor.id].lineCount(),\n                                ch: 0\n                            });\n                        } else {\n                            var editable = editor.editable();\n                            if (editable.is('body'))\n                                editor.document.$.execCommand('SelectAll', false, null);\n                            else {\n                                var range = editor.createRange();\n                                range.selectNodeContents(editable);\n                                range.select();\n                            }\n\n                            // Force triggering selectionChange (#7008)\n                            editor.forceNextSelectionCheck();\n                            editor.selectionChange();\n                        }\n                    };\n                }\n            });\n\n            if (typeof (jQuery) != 'undefined' && jQuery('a[data-toggle=\"tab\"]') && window[\"codemirror_\" + editor.id]) {\n                jQuery('a[data-toggle=\"tab\"]').on('shown.bs.tab', function() {\n                    window[\"codemirror_\" + editor.id].refresh();\n                });\n            }\n\n            editor.on('setData', function (data) {\n \n                if (window[\"editable_\" + editor.id] && editor.mode === 'source') {\n                    window[\"codemirror_\" + editor.id].setValue(data.data.dataValue);\n                }\n            });\n        }\n    });\n    var sourceEditable = CKEDITOR.tools.createClass({\n        base: CKEDITOR.editable,\n        proto: {\n            setData: function(data) {\n\n                this.setValue(data);\n\n                if (this.codeMirror != null) {\n                    this.codeMirror.setValue(data);\n                }\n\n                this.editor.fire('dataReady');\n            },\n            getData: function() {\n                return this.getValue();\n            },\n            // Insertions are not supported in source editable.\n            insertHtml: function() {\n            },\n            insertElement: function() {\n            },\n            insertText: function() {\n            },\n            // Read-only support for textarea.\n            setReadOnly: function(isReadOnly) {\n                this[(isReadOnly ? 'set' : 'remove') + 'Attribute']('readOnly', 'readonly');\n            },\n            editorID: null,\n            detach: function() {\n                window[\"codemirror_\" + this.editorID].toTextArea();\n                \n                // Free Memory on destroy\n                window[\"editable_\" + this.editorID] = null;\n                window[\"codemirror_\" + this.editorID] = null;\n\n                sourceEditable.baseProto.detach.call(this);\n                \n                this.clearCustomData();\n                this.remove();\n            }\n        }\n    });\n})();\nCKEDITOR.plugins.sourcearea = {\n    commands: {\n        source: {\n            modes: {\n                wysiwyg: 1,\n                source: 1\n            },\n            editorFocus: false,\n            readOnly: 1,\n            exec: function(editor) {\n                if (editor.mode === 'wysiwyg') {\n                    editor.fire('saveSnapshot');\n                }\n\n                editor.getCommand('source').setState(CKEDITOR.TRISTATE_DISABLED);\n                editor.setMode(editor.mode === 'source' ? 'wysiwyg' : 'source');\n            },\n            canUndo: false\n        },\n        searchCode: {\n            modes: {\n                wysiwyg: 0,\n                source: 1\n            },\n            editorFocus: false,\n            readOnly: 1,\n            exec: function(editor) {\n                CodeMirror.commands.find(window[\"codemirror_\" + editor.id]);\n            },\n            canUndo: true\n        },\n        autoFormat: {\n            modes: {\n                wysiwyg: 0,\n                source: 1\n            },\n            editorFocus: false,\n            readOnly: 0,\n            exec: function (editor) {\n                var range = {\n                    from: window[\"codemirror_\" + editor.id].getCursor(true),\n                    to: window[\"codemirror_\" + editor.id].getCursor(false)\n                };\n                window[\"codemirror_\" + editor.id].autoFormatRange(range.from, range.to);\n            },\n            canUndo: true\n        },\n        commentSelectedRange: {\n            modes: {\n                wysiwyg: 0,\n                source: 1\n            },\n            editorFocus: false,\n            readOnly: 0,\n            exec: function (editor) {\n                var range = {\n                    from: window[\"codemirror_\" + editor.id].getCursor(true),\n                    to: window[\"codemirror_\" + editor.id].getCursor(false)\n                };\n                window[\"codemirror_\" + editor.id].commentRange(true, range.from, range.to);\n            },\n            canUndo: true\n        },\n        uncommentSelectedRange: {\n            modes: {\n                wysiwyg: 0,\n                source: 1\n            },\n            editorFocus: false,\n            readOnly: 0,\n            exec: function(editor) {\n                var range = {\n                    from: window[\"codemirror_\" + editor.id].getCursor(true),\n                    to: window[\"codemirror_\" + editor.id].getCursor(false)\n                };\n                window[\"codemirror_\" + editor.id].commentRange(false, range.from, range.to);\n                if (window[\"codemirror_\" + editor.id].config.autoFormatOnUncomment) {\n                    window[\"codemirror_\" + editor.id].autoFormatRange(\n                        range.from,\n                        range.to);\n                }\n            },\n            canUndo: true\n        },\n        autoCompleteToggle: {\n            modes: {\n                wysiwyg: 0,\n                source: 1\n            },\n            editorFocus: false,\n            readOnly: 1,\n            exec: function (editor) {\n                if (this.state == CKEDITOR.TRISTATE_ON) {\n                    window[\"codemirror_\" + editor.id].setOption(\"autoCloseTags\", false);\n                } else if (this.state == CKEDITOR.TRISTATE_OFF) {\n                    window[\"codemirror_\" + editor.id].setOption(\"autoCloseTags\", true);\n                }\n\n                this.toggleState();\n            },\n            canUndo: true\n        }\n    }\n};\n\nfunction LineChannelToOffSet(ed, linech) {\n    var line = linech.line;\n    var ch = linech.ch;\n    var n = (line + ch); //for the \\n s & chars in the line\n    for (i = 0; i < line; i++) {\n        n += (ed.getLine(i)).length;//for the chars in all preceeding lines\n    }\n    return n;\n}\n\nfunction OffSetToLineChannel(ed, n) {\n    var line = 0, ch = 0, index = 0;\n    for (i = 0; i < ed.lineCount() ; i++) {\n        len = (ed.getLine(i)).length;\n        if (n < index + len) {\n            \n            line = i;\n            ch = n - index;\n            return { line: line, ch: ch };\n        }\n        len++;//for \\n char\n        index += len;\n    }\n    return { line: line, ch: ch };\n}\n\nfunction IsStyleSheetAlreadyLoaded(href) {\n    var links = CKEDITOR.document.getHead().find('link');\n\n    for (var i = 0; i < links.count() ; i++) {\n        if (links.getItem(i).$.href === href) {\n            return true;\n        }\n    }\n\n    return false;\n}"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/3024-day.css",
    "content": "/*\n\n    Name:       3024 day\n    Author:     Jan T. Sott (http://github.com/idleberg)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-3024-day.CodeMirror {background: #f7f7f7; color: #3a3432;}\n.cm-s-3024-day div.CodeMirror-selected {background: #d6d5d4 !important;}\n.cm-s-3024-day.CodeMirror ::selection { background: #d6d5d4; }\n.cm-s-3024-day.CodeMirror ::-moz-selection { background: #d9d9d9; }\n\n.cm-s-3024-day .CodeMirror-gutters {background: #f7f7f7; border-right: 0px;}\n.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; }\n.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; }\n.cm-s-3024-day .CodeMirror-linenumber {color: #807d7c;}\n\n.cm-s-3024-day .CodeMirror-cursor {border-left: 1px solid #5c5855 !important;}\n\n.cm-s-3024-day span.cm-comment {color: #cdab53;}\n.cm-s-3024-day span.cm-atom {color: #a16a94;}\n.cm-s-3024-day span.cm-number {color: #a16a94;}\n\n.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute {color: #01a252;}\n.cm-s-3024-day span.cm-keyword {color: #db2d20;}\n.cm-s-3024-day span.cm-string {color: #fded02;}\n\n.cm-s-3024-day span.cm-variable {color: #01a252;}\n.cm-s-3024-day span.cm-variable-2 {color: #01a0e4;}\n.cm-s-3024-day span.cm-def {color: #e8bbd0;}\n.cm-s-3024-day span.cm-bracket {color: #3a3432;}\n.cm-s-3024-day span.cm-tag {color: #db2d20;}\n.cm-s-3024-day span.cm-link {color: #a16a94;}\n.cm-s-3024-day span.cm-error {background: #db2d20; color: #5c5855;}\n\n.cm-s-3024-day .CodeMirror-activeline-background {background: #e8f2ff !important;}\n.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/3024-night.css",
    "content": "/*\n\n    Name:       3024 night\n    Author:     Jan T. Sott (http://github.com/idleberg)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-3024-night.CodeMirror {background: #090300; color: #d6d5d4;}\n.cm-s-3024-night div.CodeMirror-selected {background: #3a3432 !important;}\n.cm-s-3024-night.CodeMirror ::selection { background: rgba(58, 52, 50, .99); }\n.cm-s-3024-night.CodeMirror ::-moz-selection { background: rgba(58, 52, 50, .99); }\n.cm-s-3024-night .CodeMirror-gutters {background: #090300; border-right: 0px;}\n.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; }\n.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; }\n.cm-s-3024-night .CodeMirror-linenumber {color: #5c5855;}\n\n.cm-s-3024-night .CodeMirror-cursor {border-left: 1px solid #807d7c !important;}\n\n.cm-s-3024-night span.cm-comment {color: #cdab53;}\n.cm-s-3024-night span.cm-atom {color: #a16a94;}\n.cm-s-3024-night span.cm-number {color: #a16a94;}\n\n.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute {color: #01a252;}\n.cm-s-3024-night span.cm-keyword {color: #db2d20;}\n.cm-s-3024-night span.cm-string {color: #fded02;}\n\n.cm-s-3024-night span.cm-variable {color: #01a252;}\n.cm-s-3024-night span.cm-variable-2 {color: #01a0e4;}\n.cm-s-3024-night span.cm-def {color: #e8bbd0;}\n.cm-s-3024-night span.cm-bracket {color: #d6d5d4;}\n.cm-s-3024-night span.cm-tag {color: #db2d20;}\n.cm-s-3024-night span.cm-link {color: #a16a94;}\n.cm-s-3024-night span.cm-error {background: #db2d20; color: #807d7c;}\n\n.cm-s-3024-night .CodeMirror-activeline-background {background: #2F2F2F !important;}\n.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/ambiance-mobile.css",
    "content": ".cm-s-ambiance.CodeMirror {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/ambiance.css",
    "content": "/* ambiance theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-ambiance .cm-header {color: blue;}\n.cm-s-ambiance .cm-quote { color: #24C2C7; }\n\n.cm-s-ambiance .cm-keyword { color: #cda869; }\n.cm-s-ambiance .cm-atom { color: #CF7EA9; }\n.cm-s-ambiance .cm-number { color: #78CF8A; }\n.cm-s-ambiance .cm-def { color: #aac6e3; }\n.cm-s-ambiance .cm-variable { color: #ffb795; }\n.cm-s-ambiance .cm-variable-2 { color: #eed1b3; }\n.cm-s-ambiance .cm-variable-3 { color: #faded3; }\n.cm-s-ambiance .cm-property { color: #eed1b3; }\n.cm-s-ambiance .cm-operator {color: #fa8d6a;}\n.cm-s-ambiance .cm-comment { color: #555; font-style:italic; }\n.cm-s-ambiance .cm-string { color: #8f9d6a; }\n.cm-s-ambiance .cm-string-2 { color: #9d937c; }\n.cm-s-ambiance .cm-meta { color: #D2A8A1; }\n.cm-s-ambiance .cm-qualifier { color: yellow; }\n.cm-s-ambiance .cm-builtin { color: #9999cc; }\n.cm-s-ambiance .cm-bracket { color: #24C2C7; }\n.cm-s-ambiance .cm-tag { color: #fee4ff }\n.cm-s-ambiance .cm-attribute {  color: #9B859D; }\n.cm-s-ambiance .cm-hr { color: pink; }\n.cm-s-ambiance .cm-link { color: #F4C20B; }\n.cm-s-ambiance .cm-special { color: #FF9D00; }\n.cm-s-ambiance .cm-error { color: #AF2018; }\n\n.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; }\n.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; }\n\n.cm-s-ambiance .CodeMirror-selected { background: rgba(255, 255, 255, 0.15); }\n.cm-s-ambiance.CodeMirror-focused .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }\n.cm-s-ambiance.CodeMirror ::selection { background: rgba(255, 255, 255, 0.10); }\n.cm-s-ambiance.CodeMirror ::-moz-selection { background: rgba(255, 255, 255, 0.10); }\n\n/* Editor styling */\n\n.cm-s-ambiance.CodeMirror {\n  line-height: 1.40em;\n  color: #E6E1DC;\n  background-color: #202020;\n  -webkit-box-shadow: inset 0 0 10px black;\n  -moz-box-shadow: inset 0 0 10px black;\n  box-shadow: inset 0 0 10px black;\n}\n\n.cm-s-ambiance .CodeMirror-gutters {\n  background: #3D3D3D;\n  border-right: 1px solid #4D4D4D;\n  box-shadow: 0 10px 20px black;\n}\n\n.cm-s-ambiance .CodeMirror-linenumber {\n  text-shadow: 0px 1px 1px #4d4d4d;\n  color: #111;\n  padding: 0 5px;\n}\n\n.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; }\n.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; }\n\n.cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor {\n  border-left: 1px solid #7991E8;\n}\n\n.cm-s-ambiance .CodeMirror-activeline-background {\n  background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);\n}\n\n.cm-s-ambiance.CodeMirror,\n.cm-s-ambiance .CodeMirror-gutters {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\");\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/base16-dark.css",
    "content": "/*\n\n    Name:       Base16 Default Dark\n    Author:     Chris Kempson (http://chriskempson.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-base16-dark.CodeMirror {background: #151515; color: #e0e0e0;}\n.cm-s-base16-dark div.CodeMirror-selected {background: #303030 !important;}\n.cm-s-base16-dark.CodeMirror ::selection { background: rgba(48, 48, 48, .99); }\n.cm-s-base16-dark.CodeMirror ::-moz-selection { background: rgba(48, 48, 48, .99); }\n.cm-s-base16-dark .CodeMirror-gutters {background: #151515; border-right: 0px;}\n.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; }\n.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; }\n.cm-s-base16-dark .CodeMirror-linenumber {color: #505050;}\n.cm-s-base16-dark .CodeMirror-cursor {border-left: 1px solid #b0b0b0 !important;}\n\n.cm-s-base16-dark span.cm-comment {color: #8f5536;}\n.cm-s-base16-dark span.cm-atom {color: #aa759f;}\n.cm-s-base16-dark span.cm-number {color: #aa759f;}\n\n.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute {color: #90a959;}\n.cm-s-base16-dark span.cm-keyword {color: #ac4142;}\n.cm-s-base16-dark span.cm-string {color: #f4bf75;}\n\n.cm-s-base16-dark span.cm-variable {color: #90a959;}\n.cm-s-base16-dark span.cm-variable-2 {color: #6a9fb5;}\n.cm-s-base16-dark span.cm-def {color: #d28445;}\n.cm-s-base16-dark span.cm-bracket {color: #e0e0e0;}\n.cm-s-base16-dark span.cm-tag {color: #ac4142;}\n.cm-s-base16-dark span.cm-link {color: #aa759f;}\n.cm-s-base16-dark span.cm-error {background: #ac4142; color: #b0b0b0;}\n\n.cm-s-base16-dark .CodeMirror-activeline-background {background: #202020 !important;}\n.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/base16-light.css",
    "content": "/*\n\n    Name:       Base16 Default Light\n    Author:     Chris Kempson (http://chriskempson.com)\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-base16-light.CodeMirror {background: #f5f5f5; color: #202020;}\n.cm-s-base16-light div.CodeMirror-selected {background: #e0e0e0 !important;}\n.cm-s-base16-light.CodeMirror ::selection { background: #e0e0e0; }\n.cm-s-base16-light.CodeMirror ::-moz-selection { background: #e0e0e0; }\n.cm-s-base16-light .CodeMirror-gutters {background: #f5f5f5; border-right: 0px;}\n.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; }\n.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; }\n.cm-s-base16-light .CodeMirror-linenumber {color: #b0b0b0;}\n.cm-s-base16-light .CodeMirror-cursor {border-left: 1px solid #505050 !important;}\n\n.cm-s-base16-light span.cm-comment {color: #8f5536;}\n.cm-s-base16-light span.cm-atom {color: #aa759f;}\n.cm-s-base16-light span.cm-number {color: #aa759f;}\n\n.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute {color: #90a959;}\n.cm-s-base16-light span.cm-keyword {color: #ac4142;}\n.cm-s-base16-light span.cm-string {color: #f4bf75;}\n\n.cm-s-base16-light span.cm-variable {color: #90a959;}\n.cm-s-base16-light span.cm-variable-2 {color: #6a9fb5;}\n.cm-s-base16-light span.cm-def {color: #d28445;}\n.cm-s-base16-light span.cm-bracket {color: #202020;}\n.cm-s-base16-light span.cm-tag {color: #ac4142;}\n.cm-s-base16-light span.cm-link {color: #aa759f;}\n.cm-s-base16-light span.cm-error {background: #ac4142; color: #505050;}\n\n.cm-s-base16-light .CodeMirror-activeline-background {background: #DDDCDC !important;}\n.cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/blackboard.css",
    "content": "/* Port of TextMate's Blackboard theme */\n\n.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; }\n.cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; }\n.cm-s-blackboard.CodeMirror ::selection { background: rgba(37, 59, 118, .99); }\n.cm-s-blackboard.CodeMirror ::-moz-selection { background: rgba(37, 59, 118, .99); }\n.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; }\n.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; }\n.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; }\n.cm-s-blackboard .CodeMirror-linenumber { color: #888; }\n.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; }\n\n.cm-s-blackboard .cm-keyword { color: #FBDE2D; }\n.cm-s-blackboard .cm-atom { color: #D8FA3C; }\n.cm-s-blackboard .cm-number { color: #D8FA3C; }\n.cm-s-blackboard .cm-def { color: #8DA6CE; }\n.cm-s-blackboard .cm-variable { color: #FF6400; }\n.cm-s-blackboard .cm-operator { color: #FBDE2D;}\n.cm-s-blackboard .cm-comment { color: #AEAEAE; }\n.cm-s-blackboard .cm-string { color: #61CE3C; }\n.cm-s-blackboard .cm-string-2 { color: #61CE3C; }\n.cm-s-blackboard .cm-meta { color: #D8FA3C; }\n.cm-s-blackboard .cm-builtin { color: #8DA6CE; }\n.cm-s-blackboard .cm-tag { color: #8DA6CE; }\n.cm-s-blackboard .cm-attribute { color: #8DA6CE; }\n.cm-s-blackboard .cm-header { color: #FF6400; }\n.cm-s-blackboard .cm-hr { color: #AEAEAE; }\n.cm-s-blackboard .cm-link { color: #8DA6CE; }\n.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; }\n\n.cm-s-blackboard .CodeMirror-activeline-background {background: #3C3636 !important;}\n.cm-s-blackboard .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important}"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/cobalt.css",
    "content": ".cm-s-cobalt.CodeMirror { background: #002240; color: white; }\n.cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; }\n.cm-s-cobalt.CodeMirror ::selection { background: rgba(179, 101, 57, .99); }\n.cm-s-cobalt.CodeMirror ::-moz-selection { background: rgba(179, 101, 57, .99); }\n.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; }\n.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-cobalt span.cm-comment { color: #08f; }\n.cm-s-cobalt span.cm-atom { color: #845dc4; }\n.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; }\n.cm-s-cobalt span.cm-keyword { color: #ffee80; }\n.cm-s-cobalt span.cm-string { color: #3ad900; }\n.cm-s-cobalt span.cm-meta { color: #ff9d00; }\n.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; }\n.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; }\n.cm-s-cobalt span.cm-bracket { color: #d8d8d8; }\n.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }\n.cm-s-cobalt span.cm-link { color: #845dc4; }\n.cm-s-cobalt span.cm-error { color: #9d1e15; }\n\n.cm-s-cobalt .CodeMirror-activeline-background {background: #002D57 !important;}\n.cm-s-cobalt .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/colorforth.css",
    "content": ".cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; }\n.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; }\n.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; }\n.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; }\n.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-colorforth span.cm-comment     { color: #ededed; }\n.cm-s-colorforth span.cm-def         { color: #ff1c1c; font-weight:bold; }\n.cm-s-colorforth span.cm-keyword     { color: #ffd900; }\n.cm-s-colorforth span.cm-builtin     { color: #00d95a; }\n.cm-s-colorforth span.cm-variable    { color: #73ff00; }\n.cm-s-colorforth span.cm-string      { color: #007bff; }\n.cm-s-colorforth span.cm-number      { color: #00c4ff; }\n.cm-s-colorforth span.cm-atom        { color: #606060; }\n\n.cm-s-colorforth span.cm-variable-2  { color: #EEE; }\n.cm-s-colorforth span.cm-variable-3  { color: #DDD; }\n.cm-s-colorforth span.cm-property    {}\n.cm-s-colorforth span.cm-operator    {}\n\n.cm-s-colorforth span.cm-meta        { color: yellow; }\n.cm-s-colorforth span.cm-qualifier   { color: #FFF700; }\n.cm-s-colorforth span.cm-bracket     { color: #cc7; }\n.cm-s-colorforth span.cm-tag         { color: #FFBD40; }\n.cm-s-colorforth span.cm-attribute   { color: #FFF700; }\n.cm-s-colorforth span.cm-error       { color: #f00; }\n\n.cm-s-colorforth .CodeMirror-selected { background: #333d53 !important; }\n\n.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); }\n\n.cm-s-colorforth .CodeMirror-activeline-background {background: #253540 !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/eclipse.css",
    "content": ".cm-s-eclipse span.cm-meta {color: #FF1717;}\n.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; }\n.cm-s-eclipse span.cm-atom {color: #219;}\n.cm-s-eclipse span.cm-number {color: #164;}\n.cm-s-eclipse span.cm-def {color: #00f;}\n.cm-s-eclipse span.cm-variable {color: black;}\n.cm-s-eclipse span.cm-variable-2 {color: #0000C0;}\n.cm-s-eclipse span.cm-variable-3 {color: #0000C0;}\n.cm-s-eclipse span.cm-property {color: black;}\n.cm-s-eclipse span.cm-operator {color: black;}\n.cm-s-eclipse span.cm-comment {color: #3F7F5F;}\n.cm-s-eclipse span.cm-string {color: #2A00FF;}\n.cm-s-eclipse span.cm-string-2 {color: #f50;}\n.cm-s-eclipse span.cm-qualifier {color: #555;}\n.cm-s-eclipse span.cm-builtin {color: #30a;}\n.cm-s-eclipse span.cm-bracket {color: #cc7;}\n.cm-s-eclipse span.cm-tag {color: #170;}\n.cm-s-eclipse span.cm-attribute {color: #00c;}\n.cm-s-eclipse span.cm-link {color: #219;}\n.cm-s-eclipse span.cm-error {color: #f00;}\n\n.cm-s-eclipse .CodeMirror-activeline-background {background: #e8f2ff !important;}\n.cm-s-eclipse .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/elegant.css",
    "content": ".cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;}\n.cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;}\n.cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;}\n.cm-s-elegant span.cm-variable {color: black;}\n.cm-s-elegant span.cm-variable-2 {color: #b11;}\n.cm-s-elegant span.cm-qualifier {color: #555;}\n.cm-s-elegant span.cm-keyword {color: #730;}\n.cm-s-elegant span.cm-builtin {color: #30a;}\n.cm-s-elegant span.cm-link {color: #762;}\n.cm-s-elegant span.cm-error {background-color: #fdd;}\n\n.cm-s-elegant .CodeMirror-activeline-background {background: #e8f2ff !important;}\n.cm-s-elegant .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/erlang-dark.css",
    "content": ".cm-s-erlang-dark.CodeMirror { background: #002240; color: white; }\n.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; }\n.cm-s-erlang-dark.CodeMirror ::selection { background: rgba(179, 101, 57, .99); }\n.cm-s-erlang-dark.CodeMirror ::-moz-selection { background: rgba(179, 101, 57, .99); }\n.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-erlang-dark span.cm-quote      { color: #ccc; }\n.cm-s-erlang-dark span.cm-atom       { color: #f133f1; }\n.cm-s-erlang-dark span.cm-attribute  { color: #ff80e1; }\n.cm-s-erlang-dark span.cm-bracket    { color: #ff9d00; }\n.cm-s-erlang-dark span.cm-builtin    { color: #eaa; }\n.cm-s-erlang-dark span.cm-comment    { color: #77f; }\n.cm-s-erlang-dark span.cm-def        { color: #e7a; }\n.cm-s-erlang-dark span.cm-keyword    { color: #ffee80; }\n.cm-s-erlang-dark span.cm-meta       { color: #50fefe; }\n.cm-s-erlang-dark span.cm-number     { color: #ffd0d0; }\n.cm-s-erlang-dark span.cm-operator   { color: #d55; }\n.cm-s-erlang-dark span.cm-property   { color: #ccc; }\n.cm-s-erlang-dark span.cm-qualifier  { color: #ccc; }\n.cm-s-erlang-dark span.cm-special    { color: #ffbbbb; }\n.cm-s-erlang-dark span.cm-string     { color: #3ad900; }\n.cm-s-erlang-dark span.cm-string-2   { color: #ccc; }\n.cm-s-erlang-dark span.cm-tag        { color: #9effff; }\n.cm-s-erlang-dark span.cm-variable   { color: #50fe50; }\n.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; }\n.cm-s-erlang-dark span.cm-variable-3 { color: #ccc; }\n.cm-s-erlang-dark span.cm-error      { color: #9d1e15; }\n\n.cm-s-erlang-dark .CodeMirror-activeline-background {background: #013461 !important;}\n.cm-s-erlang-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/lesser-dark.css",
    "content": "/*\nhttp://lesscss.org/ dark theme\nPorted to CodeMirror by Peter Kroon\n*/\n.cm-s-lesser-dark {\n  line-height: 1.3em;\n}\n.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; }\n.cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/\n.cm-s-lesser-dark.CodeMirror ::selection { background: rgba(69, 68, 59, .99); }\n.cm-s-lesser-dark.CodeMirror ::-moz-selection { background: rgba(69, 68, 59, .99); }\n.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; }\n.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/\n\n.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/\n\n.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; }\n.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; }\n.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; }\n\n.cm-s-lesser-dark span.cm-header {color: #a0a;}\n.cm-s-lesser-dark span.cm-quote {color: #090;}\n.cm-s-lesser-dark span.cm-keyword { color: #599eff; }\n.cm-s-lesser-dark span.cm-atom { color: #C2B470; }\n.cm-s-lesser-dark span.cm-number { color: #B35E4D; }\n.cm-s-lesser-dark span.cm-def {color: white;}\n.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; }\n.cm-s-lesser-dark span.cm-variable-2 { color: #669199; }\n.cm-s-lesser-dark span.cm-variable-3 { color: white; }\n.cm-s-lesser-dark span.cm-property {color: #92A75C;}\n.cm-s-lesser-dark span.cm-operator {color: #92A75C;}\n.cm-s-lesser-dark span.cm-comment { color: #666; }\n.cm-s-lesser-dark span.cm-string { color: #BCD279; }\n.cm-s-lesser-dark span.cm-string-2 {color: #f50;}\n.cm-s-lesser-dark span.cm-meta { color: #738C73; }\n.cm-s-lesser-dark span.cm-qualifier {color: #555;}\n.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; }\n.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; }\n.cm-s-lesser-dark span.cm-tag { color: #669199; }\n.cm-s-lesser-dark span.cm-attribute {color: #00c;}\n.cm-s-lesser-dark span.cm-hr {color: #999;}\n.cm-s-lesser-dark span.cm-link {color: #00c;}\n.cm-s-lesser-dark span.cm-error { color: #9d1e15; }\n\n.cm-s-lesser-dark .CodeMirror-activeline-background {background: #3C3A3A !important;}\n.cm-s-lesser-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/liquibyte.css",
    "content": ".cm-s-liquibyte.CodeMirror {\n\tbackground-color: #000;\n\tcolor: #fff;\n\tline-height: 1.2em;\n\tfont-size: 1em;\n}\n.CodeMirror-focused .cm-matchhighlight {\n\ttext-decoration: underline;\n\ttext-decoration-color: #0f0;\n\ttext-decoration-style: wavy;\n}\n.cm-trailingspace {\n\ttext-decoration: line-through;\n\ttext-decoration-color: #f00;\n\ttext-decoration-style: dotted;\n}\n.cm-tab {\n\ttext-decoration: line-through;\n\ttext-decoration-color: #404040;\n\ttext-decoration-style: dotted;\n}\n.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; }\n.cm-s-liquibyte .CodeMirror-gutter-elt div{ font-size: 1.2em; }\n.cm-s-liquibyte .CodeMirror-guttermarker {  }\n.cm-s-liquibyte .CodeMirror-guttermarker-subtle {  }\n.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0;}\n.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee !important; }\n\n.cm-s-liquibyte span.cm-comment     { color: #008000; }\n.cm-s-liquibyte span.cm-def         { color: #ffaf40; font-weight: bold; }\n.cm-s-liquibyte span.cm-keyword     { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-builtin     { color: #ffaf40; font-weight: bold; }\n.cm-s-liquibyte span.cm-variable    { color: #5967ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-string      { color: #ff8000; }\n.cm-s-liquibyte span.cm-number      { color: #0f0; font-weight: bold; }\n.cm-s-liquibyte span.cm-atom        { color: #bf3030; font-weight: bold; }\n\n.cm-s-liquibyte span.cm-variable-2  { color: #007f7f; font-weight: bold; }\n.cm-s-liquibyte span.cm-variable-3  { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-property    { color: #999; font-weight: bold; }\n.cm-s-liquibyte span.cm-operator    { color: #fff; }\n\n.cm-s-liquibyte span.cm-meta        { color: #0f0; }\n.cm-s-liquibyte span.cm-qualifier   { color: #fff700; font-weight: bold; }\n.cm-s-liquibyte span.cm-bracket     { color: #cc7; }\n.cm-s-liquibyte span.cm-tag         { color: #ff0; font-weight: bold; }\n.cm-s-liquibyte span.cm-attribute   { color: #c080ff; font-weight: bold; }\n.cm-s-liquibyte span.cm-error       { color: #f00; }\n\n.cm-s-liquibyte .CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25) !important; }\n\n.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); }\n\n.cm-s-liquibyte .CodeMirror-activeline-background {background-color: rgba(0, 255, 0, 0.15) !important;}\n\n/* Default styles for common addons */\ndiv.CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; }\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; }\n.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); }\n/* Scrollbars */\n/* Simple */\ndiv.CodeMirror-simplescroll-horizontal div:hover, div.CodeMirror-simplescroll-vertical div:hover {\n\tbackground-color: rgba(80, 80, 80, .7);\n}\ndiv.CodeMirror-simplescroll-horizontal div, div.CodeMirror-simplescroll-vertical div {\n\tbackground-color: rgba(80, 80, 80, .3);\n\tborder: 1px solid #404040;\n\tborder-radius: 5px;\n}\ndiv.CodeMirror-simplescroll-vertical div {\n\tborder-top: 1px solid #404040;\n\tborder-bottom: 1px solid #404040;\n}\ndiv.CodeMirror-simplescroll-horizontal div {\n\tborder-left: 1px solid #404040;\n\tborder-right: 1px solid #404040;\n}\ndiv.CodeMirror-simplescroll-vertical {\n\tbackground-color: #262626;\n}\ndiv.CodeMirror-simplescroll-horizontal {\n\tbackground-color: #262626;\n\tborder-top: 1px solid #404040;\n}\n/* Overlay */\ndiv.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div {\n\tbackground-color: #404040;\n\tborder-radius: 5px;\n}\ndiv.CodeMirror-overlayscroll-vertical div {\n\tborder: 1px solid #404040;\n}\ndiv.CodeMirror-overlayscroll-horizontal div {\n\tborder: 1px solid #404040;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/mbo.css",
    "content": "/****************************************************************/\n/*   Based on mbonaci's Brackets mbo theme                      */\n/*   https://github.com/mbonaci/global/blob/master/Mbo.tmTheme  */\n/*   Create your own: http://tmtheme-editor.herokuapp.com       */\n/****************************************************************/\n\n.cm-s-mbo.CodeMirror {background: #2c2c2c; color: #ffffec;}\n.cm-s-mbo div.CodeMirror-selected {background: #716C62 !important;}\n.cm-s-mbo.CodeMirror ::selection { background: rgba(113, 108, 98, .99); }\n.cm-s-mbo.CodeMirror ::-moz-selection { background: rgba(113, 108, 98, .99); }\n.cm-s-mbo .CodeMirror-gutters {background: #4e4e4e; border-right: 0px;}\n.cm-s-mbo .CodeMirror-guttermarker { color: white; }\n.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; }\n.cm-s-mbo .CodeMirror-linenumber {color: #dadada;}\n.cm-s-mbo .CodeMirror-cursor {border-left: 1px solid #ffffec !important;}\n\n.cm-s-mbo span.cm-comment {color: #95958a;}\n.cm-s-mbo span.cm-atom {color: #00a8c6;}\n.cm-s-mbo span.cm-number {color: #00a8c6;}\n\n.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute {color: #9ddfe9;}\n.cm-s-mbo span.cm-keyword {color: #ffb928;}\n.cm-s-mbo span.cm-string {color: #ffcf6c;}\n.cm-s-mbo span.cm-string.cm-property {color: #ffffec;}\n\n.cm-s-mbo span.cm-variable {color: #ffffec;}\n.cm-s-mbo span.cm-variable-2 {color: #00a8c6;}\n.cm-s-mbo span.cm-def {color: #ffffec;}\n.cm-s-mbo span.cm-bracket {color: #fffffc; font-weight: bold;}\n.cm-s-mbo span.cm-tag {color: #9ddfe9;}\n.cm-s-mbo span.cm-link {color: #f54b07;}\n.cm-s-mbo span.cm-error {border-bottom: #636363; color: #ffffec;}\n.cm-s-mbo span.cm-qualifier {color: #ffffec;}\n\n.cm-s-mbo .CodeMirror-activeline-background {background: #494b41 !important;}\n.cm-s-mbo .CodeMirror-matchingbracket {color: #222 !important;}\n.cm-s-mbo .CodeMirror-matchingtag {background: rgba(255, 255, 255, .37);}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/mdn-like.css",
    "content": "/*\n  MDN-LIKE Theme - Mozilla\n  Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>\n  Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues\n  GitHub: @peterkroon\n\n  The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation\n\n*/\n.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; }\n.cm-s-mdn-like .CodeMirror-selected { background: #cfc !important; }\n.cm-s-mdn-like.CodeMirror ::selection { background: #cfc; }\n.cm-s-mdn-like.CodeMirror ::-moz-selection { background: #cfc; }\n\n.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; }\n.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; }\ndiv.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; }\n\n.cm-s-mdn-like .cm-keyword {  color: #6262FF; }\n.cm-s-mdn-like .cm-atom { color: #F90; }\n.cm-s-mdn-like .cm-number { color:  #ca7841; }\n.cm-s-mdn-like .cm-def { color: #8DA6CE; }\n.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; }\n.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; }\n\n.cm-s-mdn-like .cm-variable { color: #07a; }\n.cm-s-mdn-like .cm-property { color: #905; }\n.cm-s-mdn-like .cm-qualifier { color: #690; }\n\n.cm-s-mdn-like .cm-operator { color: #cda869; }\n.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; }\n.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; }\n.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/\n.cm-s-mdn-like .cm-meta { color: #000; } /*?*/\n.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/\n.cm-s-mdn-like .cm-tag { color: #997643; }\n.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/\n.cm-s-mdn-like .cm-header { color: #FF6400; }\n.cm-s-mdn-like .cm-hr { color: #AEAEAE; }\n.cm-s-mdn-like .cm-link {   color:#ad9361; font-style:italic; text-decoration:none; }\n.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; }\n\ndiv.cm-s-mdn-like .CodeMirror-activeline-background {background: #efefff;}\ndiv.cm-s-mdn-like span.CodeMirror-matchingbracket {outline:1px solid grey; color: inherit;}\n\n.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=); }\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/midnight.css",
    "content": "/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */\n\n/*<!--match-->*/\n.cm-s-midnight span.CodeMirror-matchhighlight { background: #494949; }\n.cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight { background: #314D67 !important; }\n\n/*<!--activeline-->*/\n.cm-s-midnight .CodeMirror-activeline-background {background: #253540 !important;}\n\n.cm-s-midnight.CodeMirror {\n    background: #0F192A;\n    color: #D1EDFF;\n}\n\n.cm-s-midnight.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}\n\n.cm-s-midnight div.CodeMirror-selected {background: #314D67 !important;}\n.cm-s-midnight.CodeMirror ::selection { background: rgba(49, 77, 103, .99); }\n.cm-s-midnight.CodeMirror ::-moz-selection { background: rgba(49, 77, 103, .99); }\n.cm-s-midnight .CodeMirror-gutters {background: #0F192A; border-right: 1px solid;}\n.cm-s-midnight .CodeMirror-guttermarker { color: white; }\n.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-midnight .CodeMirror-linenumber {color: #D0D0D0;}\n.cm-s-midnight .CodeMirror-cursor {\n    border-left: 1px solid #F8F8F0 !important;\n}\n\n.cm-s-midnight span.cm-comment {color: #428BDD;}\n.cm-s-midnight span.cm-atom {color: #AE81FF;}\n.cm-s-midnight span.cm-number {color: #D1EDFF;}\n\n.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute {color: #A6E22E;}\n.cm-s-midnight span.cm-keyword {color: #E83737;}\n.cm-s-midnight span.cm-string {color: #1DC116;}\n\n.cm-s-midnight span.cm-variable {color: #FFAA3E;}\n.cm-s-midnight span.cm-variable-2 {color: #FFAA3E;}\n.cm-s-midnight span.cm-def {color: #4DD;}\n.cm-s-midnight span.cm-bracket {color: #D1EDFF;}\n.cm-s-midnight span.cm-tag {color: #449;}\n.cm-s-midnight span.cm-link {color: #AE81FF;}\n.cm-s-midnight span.cm-error {background: #F92672; color: #F8F8F0;}\n\n.cm-s-midnight .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/monokai.css",
    "content": "/* Based on Sublime Text's Monokai theme */\n\n.cm-s-monokai.CodeMirror {background: #272822; color: #f8f8f2;}\n.cm-s-monokai div.CodeMirror-selected {background: #49483E !important;}\n.cm-s-monokai.CodeMirror ::selection { background: rgba(73, 72, 62, .99); }\n.cm-s-monokai.CodeMirror ::-moz-selection { background: rgba(73, 72, 62, .99); }\n.cm-s-monokai .CodeMirror-gutters {background: #272822; border-right: 0px;}\n.cm-s-monokai .CodeMirror-guttermarker { color: white; }\n.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-monokai .CodeMirror-linenumber {color: #d0d0d0;}\n.cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;}\n\n.cm-s-monokai span.cm-comment {color: #75715e;}\n.cm-s-monokai span.cm-atom {color: #ae81ff;}\n.cm-s-monokai span.cm-number {color: #ae81ff;}\n\n.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;}\n.cm-s-monokai span.cm-keyword {color: #f92672;}\n.cm-s-monokai span.cm-string {color: #e6db74;}\n\n.cm-s-monokai span.cm-variable {color: #f8f8f2;}\n.cm-s-monokai span.cm-variable-2 {color: #9effff;}\n.cm-s-monokai span.cm-variable-3 {color: #66d9ef;}\n.cm-s-monokai span.cm-def {color: #fd971f;}\n.cm-s-monokai span.cm-bracket {color: #f8f8f2;}\n.cm-s-monokai span.cm-tag {color: #f92672;}\n.cm-s-monokai span.cm-header {color: #ae81ff;}\n.cm-s-monokai span.cm-link {color: #ae81ff;}\n.cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;}\n\n.cm-s-monokai .CodeMirror-activeline-background {background: #373831 !important;}\n.cm-s-monokai .CodeMirror-matchingbracket {\n  text-decoration: underline;\n  color: white !important;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/neat.css",
    "content": ".cm-s-neat span.cm-comment { color: #a86; }\n.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; }\n.cm-s-neat span.cm-string { color: #a22; }\n.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; }\n.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; }\n.cm-s-neat span.cm-variable { color: black; }\n.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; }\n.cm-s-neat span.cm-meta {color: #555;}\n.cm-s-neat span.cm-link { color: #3a3; }\n\n.cm-s-neat .CodeMirror-activeline-background {background: #e8f2ff !important;}\n.cm-s-neat .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/neo.css",
    "content": "/* neo theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-neo.CodeMirror {\n  background-color:#ffffff;\n  color:#2e383c;\n  line-height:1.4375;\n}\n.cm-s-neo .cm-comment {color:#75787b}\n.cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3}\n.cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a}\n.cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328}\n.cm-s-neo .cm-string {color:#b35e14}\n.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65}\n\n\n/* Editor styling */\n\n.cm-s-neo pre {\n  padding:0;\n}\n\n.cm-s-neo .CodeMirror-gutters {\n  border:none;\n  border-right:10px solid transparent;\n  background-color:transparent;\n}\n\n.cm-s-neo .CodeMirror-linenumber {\n  padding:0;\n  color:#e0e2e5;\n}\n\n.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; }\n.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; }\n\n.cm-s-neo div.CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: rgba(155,157,162,0.37);\n  z-index: 1;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/night.css",
    "content": "/* Loosely based on the Midnight Textmate theme */\n\n.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; }\n.cm-s-night div.CodeMirror-selected { background: #447 !important; }\n.cm-s-night.CodeMirror ::selection { background: rgba(68, 68, 119, .99); }\n.cm-s-night.CodeMirror ::-moz-selection { background: rgba(68, 68, 119, .99); }\n.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-night .CodeMirror-guttermarker { color: white; }\n.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; }\n.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; }\n.cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-night span.cm-comment { color: #6900a1; }\n.cm-s-night span.cm-atom { color: #845dc4; }\n.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; }\n.cm-s-night span.cm-keyword { color: #599eff; }\n.cm-s-night span.cm-string { color: #37f14a; }\n.cm-s-night span.cm-meta { color: #7678e2; }\n.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; }\n.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; }\n.cm-s-night span.cm-bracket { color: #8da6ce; }\n.cm-s-night span.cm-comment { color: #6900a1; }\n.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }\n.cm-s-night span.cm-link { color: #845dc4; }\n.cm-s-night span.cm-error { color: #9d1e15; }\n\n.cm-s-night .CodeMirror-activeline-background {background: #1C005A !important;}\n.cm-s-night .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/paraiso-dark.css",
    "content": "/*\n\n    Name:       Paraíso (Dark)\n    Author:     Jan T. Sott\n\n    Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n\n*/\n\n.cm-s-paraiso-dark.CodeMirror {background: #2f1e2e; color: #b9b6b0;}\n.cm-s-paraiso-dark div.CodeMirror-selected {background: #41323f !important;}\n.cm-s-paraiso-dark.CodeMirror ::selection { background: rgba(65, 50, 63, .99); }\n.cm-s-paraiso-dark.CodeMirror ::-moz-selection { background: rgba(65, 50, 63, .99); }\n.cm-s-paraiso-dark .CodeMirror-gutters {background: #2f1e2e; border-right: 0px;}\n.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; }\n.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; }\n.cm-s-paraiso-dark .CodeMirror-linenumber {color: #776e71;}\n.cm-s-paraiso-dark .CodeMirror-cursor {border-left: 1px solid #8d8687 !important;}\n\n.cm-s-paraiso-dark span.cm-comment {color: #e96ba8;}\n.cm-s-paraiso-dark span.cm-atom {color: #815ba4;}\n.cm-s-paraiso-dark span.cm-number {color: #815ba4;}\n\n.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute {color: #48b685;}\n.cm-s-paraiso-dark span.cm-keyword {color: #ef6155;}\n.cm-s-paraiso-dark span.cm-string {color: #fec418;}\n\n.cm-s-paraiso-dark span.cm-variable {color: #48b685;}\n.cm-s-paraiso-dark span.cm-variable-2 {color: #06b6ef;}\n.cm-s-paraiso-dark span.cm-def {color: #f99b15;}\n.cm-s-paraiso-dark span.cm-bracket {color: #b9b6b0;}\n.cm-s-paraiso-dark span.cm-tag {color: #ef6155;}\n.cm-s-paraiso-dark span.cm-link {color: #815ba4;}\n.cm-s-paraiso-dark span.cm-error {background: #ef6155; color: #8d8687;}\n\n.cm-s-paraiso-dark .CodeMirror-activeline-background {background: #4D344A !important;}\n.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/paraiso-light.css",
    "content": "/*\n\n    Name:       Paraíso (Light)\n    Author:     Jan T. Sott\n\n    Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n\n*/\n\n.cm-s-paraiso-light.CodeMirror {background: #e7e9db; color: #41323f;}\n.cm-s-paraiso-light div.CodeMirror-selected {background: #b9b6b0 !important;}\n.cm-s-paraiso-light.CodeMirror ::selection { background: #b9b6b0; }\n.cm-s-paraiso-light.CodeMirror ::-moz-selection { background: #b9b6b0; }\n.cm-s-paraiso-light .CodeMirror-gutters {background: #e7e9db; border-right: 0px;}\n.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; }\n.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; }\n.cm-s-paraiso-light .CodeMirror-linenumber {color: #8d8687;}\n.cm-s-paraiso-light .CodeMirror-cursor {border-left: 1px solid #776e71 !important;}\n\n.cm-s-paraiso-light span.cm-comment {color: #e96ba8;}\n.cm-s-paraiso-light span.cm-atom {color: #815ba4;}\n.cm-s-paraiso-light span.cm-number {color: #815ba4;}\n\n.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute {color: #48b685;}\n.cm-s-paraiso-light span.cm-keyword {color: #ef6155;}\n.cm-s-paraiso-light span.cm-string {color: #fec418;}\n\n.cm-s-paraiso-light span.cm-variable {color: #48b685;}\n.cm-s-paraiso-light span.cm-variable-2 {color: #06b6ef;}\n.cm-s-paraiso-light span.cm-def {color: #f99b15;}\n.cm-s-paraiso-light span.cm-bracket {color: #41323f;}\n.cm-s-paraiso-light span.cm-tag {color: #ef6155;}\n.cm-s-paraiso-light span.cm-link {color: #815ba4;}\n.cm-s-paraiso-light span.cm-error {background: #ef6155; color: #776e71;}\n\n.cm-s-paraiso-light .CodeMirror-activeline-background {background: #CFD1C4 !important;}\n.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/pastel-on-dark.css",
    "content": "/**\n * Pastel On Dark theme ported from ACE editor\n * @license MIT\n * @copyright AtomicPages LLC 2014\n * @author Dennis Thompson, AtomicPages LLC\n * @version 1.1\n * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme\n */\n\n.cm-s-pastel-on-dark.CodeMirror {\n\tbackground: #2c2827;\n\tcolor: #8F938F;\n\tline-height: 1.5;\n\tfont-size: 14px;\n}\n.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2) !important; }\n.cm-s-pastel-on-dark.CodeMirror ::selection { background: rgba(221,240,255,0.2); }\n.cm-s-pastel-on-dark.CodeMirror ::-moz-selection { background: rgba(221,240,255,0.2); }\n\n.cm-s-pastel-on-dark .CodeMirror-gutters {\n\tbackground: #34302f;\n\tborder-right: 0px;\n\tpadding: 0 3px;\n}\n.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; }\n.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; }\n.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; }\n.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; }\n.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; }\n.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; }\n.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; }\n.cm-s-pastel-on-dark span.cm-property { color: #8F938F; }\n.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; }\n.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; }\n.cm-s-pastel-on-dark span.cm-string { color: #66A968; }\n.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; }\n.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; }\n.cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; }\n.cm-s-pastel-on-dark span.cm-def { color: #757aD8; }\n.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; }\n.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; }\n.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; }\n.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; }\n.cm-s-pastel-on-dark span.cm-error {\n\tbackground: #757aD8;\n\tcolor: #f8f8f0;\n}\n.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031) !important; }\n.cm-s-pastel-on-dark .CodeMirror-matchingbracket {\n\tborder: 1px solid rgba(255,255,255,0.25);\n\tcolor: #8F938F !important;\n\tmargin: -1px -1px 0 -1px;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/rubyblue.css",
    "content": ".cm-s-rubyblue.CodeMirror { background: #112435; color: white; }\n.cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; }\n.cm-s-rubyblue.CodeMirror ::selection { background: rgba(56, 86, 111, 0.99); }\n.cm-s-rubyblue.CodeMirror ::-moz-selection { background: rgba(56, 86, 111, 0.99); }\n.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; }\n.cm-s-rubyblue .CodeMirror-guttermarker { color: white; }\n.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; }\n.cm-s-rubyblue .CodeMirror-linenumber { color: white; }\n.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; }\n.cm-s-rubyblue span.cm-atom { color: #F4C20B; }\n.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; }\n.cm-s-rubyblue span.cm-keyword { color: #F0F; }\n.cm-s-rubyblue span.cm-string { color: #F08047; }\n.cm-s-rubyblue span.cm-meta { color: #F0F; }\n.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; }\n.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; }\n.cm-s-rubyblue span.cm-bracket { color: #F0F; }\n.cm-s-rubyblue span.cm-link { color: #F4C20B; }\n.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }\n.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; }\n.cm-s-rubyblue span.cm-error { color: #AF2018; }\n\n.cm-s-rubyblue .CodeMirror-activeline-background {background: #173047 !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/solarized.css",
    "content": "/*\nSolarized theme for code-mirror\nhttp://ethanschoonover.com/solarized\n*/\n\n/*\nSolarized color pallet\nhttp://ethanschoonover.com/solarized/img/solarized-palette.png\n*/\n\n.solarized.base03 { color: #002b36; }\n.solarized.base02 { color: #073642; }\n.solarized.base01 { color: #586e75; }\n.solarized.base00 { color: #657b83; }\n.solarized.base0 { color: #839496; }\n.solarized.base1 { color: #93a1a1; }\n.solarized.base2 { color: #eee8d5; }\n.solarized.base3  { color: #fdf6e3; }\n.solarized.solar-yellow  { color: #b58900; }\n.solarized.solar-orange  { color: #cb4b16; }\n.solarized.solar-red { color: #dc322f; }\n.solarized.solar-magenta { color: #d33682; }\n.solarized.solar-violet  { color: #6c71c4; }\n.solarized.solar-blue { color: #268bd2; }\n.solarized.solar-cyan { color: #2aa198; }\n.solarized.solar-green { color: #859900; }\n\n/* Color scheme for code-mirror */\n\n.cm-s-solarized {\n  line-height: 1.45em;\n  color-profile: sRGB;\n  rendering-intent: auto;\n}\n.cm-s-solarized.cm-s-dark {\n  color: #839496;\n  background-color:  #002b36;\n  text-shadow: #002b36 0 1px;\n}\n.cm-s-solarized.cm-s-light {\n  background-color: #fdf6e3;\n  color: #657b83;\n  text-shadow: #eee8d5 0 1px;\n}\n\n.cm-s-solarized .CodeMirror-widget {\n  text-shadow: none;\n}\n\n.cm-s-solarized .cm-header { color: #586e75; }\n.cm-s-solarized .cm-quote { color: #93a1a1; }\n\n.cm-s-solarized .cm-keyword { color: #cb4b16 }\n.cm-s-solarized .cm-atom { color: #d33682; }\n.cm-s-solarized .cm-number { color: #d33682; }\n.cm-s-solarized .cm-def { color: #2aa198; }\n\n.cm-s-solarized .cm-variable { color: #839496; }\n.cm-s-solarized .cm-variable-2 { color: #b58900; }\n.cm-s-solarized .cm-variable-3 { color: #6c71c4; }\n\n.cm-s-solarized .cm-property { color: #2aa198; }\n.cm-s-solarized .cm-operator {color: #6c71c4;}\n\n.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; }\n\n.cm-s-solarized .cm-string { color: #859900; }\n.cm-s-solarized .cm-string-2 { color: #b58900; }\n\n.cm-s-solarized .cm-meta { color: #859900; }\n.cm-s-solarized .cm-qualifier { color: #b58900; }\n.cm-s-solarized .cm-builtin { color: #d33682; }\n.cm-s-solarized .cm-bracket { color: #cb4b16; }\n.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; }\n.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; }\n.cm-s-solarized .cm-tag { color: #93a1a1 }\n.cm-s-solarized .cm-attribute {  color: #2aa198; }\n.cm-s-solarized .cm-hr {\n  color: transparent;\n  border-top: 1px solid #586e75;\n  display: block;\n}\n.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; }\n.cm-s-solarized .cm-special { color: #6c71c4; }\n.cm-s-solarized .cm-em {\n  color: #999;\n  text-decoration: underline;\n  text-decoration-style: dotted;\n}\n.cm-s-solarized .cm-strong { color: #eee; }\n.cm-s-solarized .cm-error,\n.cm-s-solarized .cm-invalidchar {\n  color: #586e75;\n  border-bottom: 1px dotted #dc322f;\n}\n\n.cm-s-solarized.cm-s-dark .CodeMirror-selected { background: #073642; }\n.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); }\n.cm-s-solarized.cm-s-dark.CodeMirror ::-moz-selection { background: rgba(7, 54, 66, 0.99); }\n\n.cm-s-solarized.cm-s-light .CodeMirror-selected { background: #eee8d5; }\n.cm-s-solarized.cm-s-light.CodeMirror ::selection { background: #eee8d5; }\n.cm-s-solarized.cm-s-lightCodeMirror ::-moz-selection { background: #eee8d5; }\n\n/* Editor styling */\n\n\n\n/* Little shadow on the view-port of the buffer view */\n.cm-s-solarized.CodeMirror {\n  -moz-box-shadow: inset 7px 0 12px -6px #000;\n  -webkit-box-shadow: inset 7px 0 12px -6px #000;\n  box-shadow: inset 7px 0 12px -6px #000;\n}\n\n/* Gutter border and some shadow from it  */\n.cm-s-solarized .CodeMirror-gutters {\n  border-right: 1px solid;\n}\n\n/* Gutter colors and line number styling based of color scheme (dark / light) */\n\n/* Dark */\n.cm-s-solarized.cm-s-dark .CodeMirror-gutters {\n  background-color:  #002b36;\n  border-color: #00232c;\n}\n\n.cm-s-solarized.cm-s-dark .CodeMirror-linenumber {\n  text-shadow: #021014 0 -1px;\n}\n\n/* Light */\n.cm-s-solarized.cm-s-light .CodeMirror-gutters {\n  background-color: #fdf6e3;\n  border-color: #eee8d5;\n}\n\n/* Common */\n.cm-s-solarized .CodeMirror-linenumber {\n  color: #586e75;\n  padding: 0 5px;\n}\n.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; }\n.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; }\n.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; }\n\n.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text {\n  color: #586e75;\n}\n\n.cm-s-solarized .CodeMirror-lines .CodeMirror-cursor {\n  border-left: 1px solid #819090;\n}\n\n/*\nActive line. Negative margin compensates left padding of the text in the\nview-port\n*/\n.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background {\n  background: rgba(255, 255, 255, 0.10);\n}\n.cm-s-solarized.cm-s-light .CodeMirror-activeline-background {\n  background: rgba(0, 0, 0, 0.10);\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/the-matrix.css",
    "content": ".cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; }\n.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D !important; }\n.cm-s-the-matrix.CodeMirror ::selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-the-matrix.CodeMirror ::-moz-selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; }\n.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; }\n.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; }\n.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; }\n.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00 !important; }\n\n.cm-s-the-matrix span.cm-keyword {color: #008803; font-weight: bold;}\n.cm-s-the-matrix span.cm-atom {color: #3FF;}\n.cm-s-the-matrix span.cm-number {color: #FFB94F;}\n.cm-s-the-matrix span.cm-def {color: #99C;}\n.cm-s-the-matrix span.cm-variable {color: #F6C;}\n.cm-s-the-matrix span.cm-variable-2 {color: #C6F;}\n.cm-s-the-matrix span.cm-variable-3 {color: #96F;}\n.cm-s-the-matrix span.cm-property {color: #62FFA0;}\n.cm-s-the-matrix span.cm-operator {color: #999}\n.cm-s-the-matrix span.cm-comment {color: #CCCCCC;}\n.cm-s-the-matrix span.cm-string {color: #39C;}\n.cm-s-the-matrix span.cm-meta {color: #C9F;}\n.cm-s-the-matrix span.cm-qualifier {color: #FFF700;}\n.cm-s-the-matrix span.cm-builtin {color: #30a;}\n.cm-s-the-matrix span.cm-bracket {color: #cc7;}\n.cm-s-the-matrix span.cm-tag {color: #FFBD40;}\n.cm-s-the-matrix span.cm-attribute {color: #FFF700;}\n.cm-s-the-matrix span.cm-error {color: #FF0000;}\n\n.cm-s-the-matrix .CodeMirror-activeline-background {background: #040;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/tomorrow-night-bright.css",
    "content": "/*\n\n    Name:       Tomorrow Night - Bright\n    Author:     Chris Kempson\n\n    Port done by Gerard Braad <me@gbraad.nl>\n\n*/\n\n.cm-s-tomorrow-night-bright.CodeMirror {background: #000000; color: #eaeaea;}\n.cm-s-tomorrow-night-bright div.CodeMirror-selected {background: #424242 !important;}\n.cm-s-tomorrow-night-bright .CodeMirror-gutters {background: #000000; border-right: 0px;}\n.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; }\n.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-tomorrow-night-bright .CodeMirror-linenumber {color: #424242;}\n.cm-s-tomorrow-night-bright .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;}\n\n.cm-s-tomorrow-night-bright span.cm-comment {color: #d27b53;}\n.cm-s-tomorrow-night-bright span.cm-atom {color: #a16a94;}\n.cm-s-tomorrow-night-bright span.cm-number {color: #a16a94;}\n\n.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute {color: #99cc99;}\n.cm-s-tomorrow-night-bright span.cm-keyword {color: #d54e53;}\n.cm-s-tomorrow-night-bright span.cm-string {color: #e7c547;}\n\n.cm-s-tomorrow-night-bright span.cm-variable {color: #b9ca4a;}\n.cm-s-tomorrow-night-bright span.cm-variable-2 {color: #7aa6da;}\n.cm-s-tomorrow-night-bright span.cm-def {color: #e78c45;}\n.cm-s-tomorrow-night-bright span.cm-bracket {color: #eaeaea;}\n.cm-s-tomorrow-night-bright span.cm-tag {color: #d54e53;}\n.cm-s-tomorrow-night-bright span.cm-link {color: #a16a94;}\n.cm-s-tomorrow-night-bright span.cm-error {background: #d54e53; color: #6A6A6A;}\n\n.cm-s-tomorrow-night-bright .CodeMirror-activeline-background {background: #2a2a2a !important;}\n.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/tomorrow-night-eighties.css",
    "content": "/*\n\n    Name:       Tomorrow Night - Eighties\n    Author:     Chris Kempson\n\n    CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror)\n    Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16)\n\n*/\n\n.cm-s-tomorrow-night-eighties.CodeMirror {background: #000000; color: #CCCCCC;}\n.cm-s-tomorrow-night-eighties div.CodeMirror-selected {background: #2D2D2D !important;}\n.cm-s-tomorrow-night-eighties.CodeMirror ::selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-tomorrow-night-eighties.CodeMirror ::-moz-selection { background: rgba(45, 45, 45, 0.99); }\n.cm-s-tomorrow-night-eighties .CodeMirror-gutters {background: #000000; border-right: 0px;}\n.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; }\n.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; }\n.cm-s-tomorrow-night-eighties .CodeMirror-linenumber {color: #515151;}\n.cm-s-tomorrow-night-eighties .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;}\n\n.cm-s-tomorrow-night-eighties span.cm-comment {color: #d27b53;}\n.cm-s-tomorrow-night-eighties span.cm-atom {color: #a16a94;}\n.cm-s-tomorrow-night-eighties span.cm-number {color: #a16a94;}\n\n.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute {color: #99cc99;}\n.cm-s-tomorrow-night-eighties span.cm-keyword {color: #f2777a;}\n.cm-s-tomorrow-night-eighties span.cm-string {color: #ffcc66;}\n\n.cm-s-tomorrow-night-eighties span.cm-variable {color: #99cc99;}\n.cm-s-tomorrow-night-eighties span.cm-variable-2 {color: #6699cc;}\n.cm-s-tomorrow-night-eighties span.cm-def {color: #f99157;}\n.cm-s-tomorrow-night-eighties span.cm-bracket {color: #CCCCCC;}\n.cm-s-tomorrow-night-eighties span.cm-tag {color: #f2777a;}\n.cm-s-tomorrow-night-eighties span.cm-link {color: #a16a94;}\n.cm-s-tomorrow-night-eighties span.cm-error {background: #f2777a; color: #6A6A6A;}\n\n.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background {background: #343600 !important;}\n.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/ttcn.css",
    "content": ".cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n.cm-header {color: #00f; font-weight: bold;}\n\n.cm-atom {color: #219;}\n.cm-attribute {color: #00c;}\n.cm-bracket {color: #997;}\n.cm-comment {color: #333333;}\n.cm-def {color: #00f;}\n.cm-em {font-style: italic;}\n.cm-error {color: #f00;}\n.cm-hr {color: #999;}\n.cm-invalidchar {color: #f00;}\n.cm-keyword {font-weight:bold}\n.cm-link {color: #00c; text-decoration: underline;}\n.cm-meta {color: #555;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-qualifier {color: #555;}\n.cm-strikethrough {text-decoration: line-through;}\n.cm-string {color: #006400;}\n.cm-string-2 {color: #f50;}\n.cm-strong {font-weight: bold;}\n.cm-tag {color: #170;}\n.cm-variable {color: #8B2252;}\n.cm-variable-2 {color: #05a;}\n.cm-variable-3 {color: #085;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n/* ASN */\n.cm-s-ttcn .cm-accessTypes,\n.cm-s-ttcn .cm-compareTypes {color: #27408B}\n.cm-s-ttcn .cm-cmipVerbs {color: #8B2252}\n.cm-s-ttcn .cm-modifier {color:#D2691E}\n.cm-s-ttcn .cm-status {color:#8B4545}\n.cm-s-ttcn .cm-storage {color:#A020F0}\n.cm-s-ttcn .cm-tags {color:#006400}\n\n/* CFG */\n.cm-s-ttcn .cm-externalCommands {color: #8B4545; font-weight:bold}\n.cm-s-ttcn .cm-fileNCtrlMaskOptions,\n.cm-s-ttcn .cm-sectionTitle {color: #2E8B57; font-weight:bold}\n\n/* TTCN */\n.cm-s-ttcn .cm-booleanConsts,\n.cm-s-ttcn .cm-otherConsts,\n.cm-s-ttcn .cm-verdictConsts {color: #006400}\n.cm-s-ttcn .cm-configOps,\n.cm-s-ttcn .cm-functionOps,\n.cm-s-ttcn .cm-portOps,\n.cm-s-ttcn .cm-sutOps,\n.cm-s-ttcn .cm-timerOps,\n.cm-s-ttcn .cm-verdictOps {color: #0000FF}\n.cm-s-ttcn .cm-preprocessor,\n.cm-s-ttcn .cm-templateMatch,\n.cm-s-ttcn .cm-ttcn3Macros {color: #27408B}\n.cm-s-ttcn .cm-types {color: #A52A2A; font-weight:bold}\n.cm-s-ttcn .cm-visibilityModifiers {font-weight:bold}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/twilight.css",
    "content": ".cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/\n.cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/\n.cm-s-twilight.CodeMirror ::selection { background: rgba(50, 50, 50, 0.99); }\n.cm-s-twilight.CodeMirror ::-moz-selection { background: rgba(50, 50, 50, 0.99); }\n\n.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; }\n.cm-s-twilight .CodeMirror-guttermarker { color: white; }\n.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; }\n.cm-s-twilight .CodeMirror-linenumber { color: #aaa; }\n.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-twilight .cm-keyword {  color: #f9ee98; } /**/\n.cm-s-twilight .cm-atom { color: #FC0; }\n.cm-s-twilight .cm-number { color:  #ca7841; } /**/\n.cm-s-twilight .cm-def { color: #8DA6CE; }\n.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/\n.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/\n.cm-s-twilight .cm-operator { color: #cda869; } /**/\n.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/\n.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/\n.cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/\n.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/\n.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/\n.cm-s-twilight .cm-tag { color: #997643; } /**/\n.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/\n.cm-s-twilight .cm-header { color: #FF6400; }\n.cm-s-twilight .cm-hr { color: #AEAEAE; }\n.cm-s-twilight .cm-link {   color:#ad9361; font-style:italic; text-decoration:none; } /**/\n.cm-s-twilight .cm-error { border-bottom: 1px solid red; }\n\n.cm-s-twilight .CodeMirror-activeline-background {background: #27282E !important;}\n.cm-s-twilight .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/vibrant-ink.css",
    "content": "/* Taken from the popular Visual Studio Vibrant Ink Schema */\n\n.cm-s-vibrant-ink.CodeMirror { background: black; color: white; }\n.cm-s-vibrant-ink .CodeMirror-selected { background: #35493c !important; }\n.cm-s-vibrant-ink.CodeMirror ::selection { background: rgba(53, 73, 60, 0.99); }\n.cm-s-vibrant-ink.CodeMirror ::-moz-selection { background: rgba(53, 73, 60, 0.99); }\n\n.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; }\n.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; }\n.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; }\n.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; }\n.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-vibrant-ink .cm-keyword {  color: #CC7832; }\n.cm-s-vibrant-ink .cm-atom { color: #FC0; }\n.cm-s-vibrant-ink .cm-number { color:  #FFEE98; }\n.cm-s-vibrant-ink .cm-def { color: #8DA6CE; }\n.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D }\n.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D }\n.cm-s-vibrant-ink .cm-operator { color: #888; }\n.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; }\n.cm-s-vibrant-ink .cm-string { color:  #A5C25C }\n.cm-s-vibrant-ink .cm-string-2 { color: red }\n.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; }\n.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; }\n.cm-s-vibrant-ink .cm-header { color: #FF6400; }\n.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; }\n.cm-s-vibrant-ink .cm-link { color: blue; }\n.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; }\n\n.cm-s-vibrant-ink .CodeMirror-activeline-background {background: #27282E !important;}\n.cm-s-vibrant-ink .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}\n"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/xq-dark.css",
    "content": "/*\nCopyright (C) 2011 by MarkLogic Corporation\nAuthor: Mike Brevoort <mike@brevoort.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-selected { background: #27007A !important; }\n.cm-s-xq-dark.CodeMirror ::selection { background: rgba(39, 0, 122, 0.99); }\n.cm-s-xq-dark.CodeMirror ::-moz-selection { background: rgba(39, 0, 122, 0.99); }\n.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; }\n.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; }\n.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; }\n.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; }\n\n.cm-s-xq-dark span.cm-keyword {color: #FFBD40;}\n.cm-s-xq-dark span.cm-atom {color: #6C8CD5;}\n.cm-s-xq-dark span.cm-number {color: #164;}\n.cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;}\n.cm-s-xq-dark span.cm-variable {color: #FFF;}\n.cm-s-xq-dark span.cm-variable-2 {color: #EEE;}\n.cm-s-xq-dark span.cm-variable-3 {color: #DDD;}\n.cm-s-xq-dark span.cm-property {}\n.cm-s-xq-dark span.cm-operator {}\n.cm-s-xq-dark span.cm-comment {color: gray;}\n.cm-s-xq-dark span.cm-string {color: #9FEE00;}\n.cm-s-xq-dark span.cm-meta {color: yellow;}\n.cm-s-xq-dark span.cm-qualifier {color: #FFF700;}\n.cm-s-xq-dark span.cm-builtin {color: #30a;}\n.cm-s-xq-dark span.cm-bracket {color: #cc7;}\n.cm-s-xq-dark span.cm-tag {color: #FFBD40;}\n.cm-s-xq-dark span.cm-attribute {color: #FFF700;}\n.cm-s-xq-dark span.cm-error {color: #f00;}\n\n.cm-s-xq-dark .CodeMirror-activeline-background {background: #27282E !important;}\n.cm-s-xq-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;}"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/xq-light.css",
    "content": "/*\nCopyright (C) 2011 by MarkLogic Corporation\nAuthor: Mike Brevoort <mike@brevoort.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n.cm-s-xq-light span.cm-keyword {line-height: 1em; font-weight: bold; color: #5A5CAD; }\n.cm-s-xq-light span.cm-atom {color: #6C8CD5;}\n.cm-s-xq-light span.cm-number {color: #164;}\n.cm-s-xq-light span.cm-def {text-decoration:underline;}\n.cm-s-xq-light span.cm-variable {color: black; }\n.cm-s-xq-light span.cm-variable-2 {color:black;}\n.cm-s-xq-light span.cm-variable-3 {color: black; }\n.cm-s-xq-light span.cm-property {}\n.cm-s-xq-light span.cm-operator {}\n.cm-s-xq-light span.cm-comment {color: #0080FF; font-style: italic;}\n.cm-s-xq-light span.cm-string {color: red;}\n.cm-s-xq-light span.cm-meta {color: yellow;}\n.cm-s-xq-light span.cm-qualifier {color: grey}\n.cm-s-xq-light span.cm-builtin {color: #7EA656;}\n.cm-s-xq-light span.cm-bracket {color: #cc7;}\n.cm-s-xq-light span.cm-tag {color: #3F7F7F;}\n.cm-s-xq-light span.cm-attribute {color: #7F007F;}\n.cm-s-xq-light span.cm-error {color: #f00;}\n\n.cm-s-xq-light .CodeMirror-activeline-background {background: #e8f2ff !important;}\n.cm-s-xq-light .CodeMirror-matchingbracket {outline:1px solid grey;color:black !important;background:yellow;}"
  },
  {
    "path": "assets/ckeditor/plugins/codemirror/theme/zenburn.css",
    "content": "/**\n * \"\n *  Using Zenburn color palette from the Emacs Zenburn Theme\n *  https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el\n *\n *  Also using parts of https://github.com/xavi/coderay-lighttable-theme\n * \"\n * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css\n */\n\n.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; }\n.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; }\n.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white !important; }\n.cm-s-zenburn { background-color: #3f3f3f; color: #dcdccc; }\n.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; }\n.cm-s-zenburn span.cm-comment { color: #7f9f7f; }\n.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; }\n.cm-s-zenburn span.cm-atom { color: #bfebbf; }\n.cm-s-zenburn span.cm-def { color: #dcdccc; }\n.cm-s-zenburn span.cm-variable { color: #dfaf8f; }\n.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; }\n.cm-s-zenburn span.cm-string { color: #cc9393; }\n.cm-s-zenburn span.cm-string-2 { color: #cc9393; }\n.cm-s-zenburn span.cm-number { color: #dcdccc; }\n.cm-s-zenburn span.cm-tag { color: #93e0e3; }\n.cm-s-zenburn span.cm-property { color: #dfaf8f; }\n.cm-s-zenburn span.cm-attribute { color: #dfaf8f; }\n.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; }\n.cm-s-zenburn span.cm-meta { color: #f0dfaf; }\n.cm-s-zenburn span.cm-header { color: #f0efd0; }\n.cm-s-zenburn span.cm-operator { color: #f0efd0; }\n.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; }\n.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; }\n.cm-s-zenburn .CodeMirror-activeline { background: #000000; }\n.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; }\n.cm-s-zenburn .CodeMirror-selected { background: #545454; }\n.cm-s-zenburn .CodeMirror-focused .CodeMirror-selected { background: #4f4f4f; }\n"
  },
  {
    "path": "assets/ckeditor/plugins/colordialog/dialogs/colordialog.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"colordialog\",function(x){function q(){d.getById(r).removeStyle(\"background-color\");t.getContentElement(\"picker\",\"selectedColor\").setValue(\"\");l&&l.removeAttribute(\"aria-selected\");l=null}function y(a){a=a.data.getTarget();var c;\"td\"==a.getName()&&(c=a.getChild(0).getHtml())&&(l=a,l.setAttribute(\"aria-selected\",!0),t.getContentElement(\"picker\",\"selectedColor\").setValue(c))}function C(a){a=a.replace(/^#/,\"\");for(var c=0,b=[];2>=c;c++)b[c]=parseInt(a.substr(2*c,2),16);return\"#\"+\n(165<=.2126*b[0]+.7152*b[1]+.0722*b[2]?\"000\":\"fff\")}function z(a){!a.name&&(a=new CKEDITOR.event(a));var c=!/mouse/.test(a.name),b=a.data.getTarget(),g;\"td\"==b.getName()&&(g=b.getChild(0).getHtml())&&(u(a),c?e=b:A=b,c&&(b.setStyle(\"border-color\",C(g)),b.setStyle(\"border-style\",\"dotted\")),d.getById(m).setStyle(\"background-color\",g),d.getById(n).setHtml(g))}function u(a){if(a=!/mouse/.test(a.name)&&e){var c=a.getChild(0).getHtml();a.setStyle(\"border-color\",c);a.setStyle(\"border-style\",\"solid\")}e||A||\n(d.getById(m).removeStyle(\"background-color\"),d.getById(n).setHtml(\"\\x26nbsp;\"))}function D(a){var c=a.data,b=c.getTarget(),g=c.getKeystroke(),d=\"rtl\"==x.lang.dir;switch(g){case 38:if(a=b.getParent().getPrevious())a=a.getChild([b.getIndex()]),a.focus();c.preventDefault();break;case 40:(a=b.getParent().getNext())&&(a=a.getChild([b.getIndex()]))&&1==a.type&&a.focus();c.preventDefault();break;case 32:case 13:y(a);c.preventDefault();break;case d?37:39:(a=b.getNext())?1==a.type&&(a.focus(),c.preventDefault(!0)):\n(a=b.getParent().getNext())&&(a=a.getChild([0]))&&1==a.type&&(a.focus(),c.preventDefault(!0));break;case d?39:37:if(a=b.getPrevious())a.focus(),c.preventDefault(!0);else if(a=b.getParent().getPrevious())a=a.getLast(),a.focus(),c.preventDefault(!0)}}var v=CKEDITOR.dom.element,d=CKEDITOR.document,f=x.lang.colordialog,t,B={type:\"html\",html:\"\\x26nbsp;\"},l,e,A,p=function(a){return CKEDITOR.tools.getNextId()+\"_\"+a},m=p(\"hicolor\"),n=p(\"hicolortext\"),r=p(\"selhicolor\"),h;(function(){function a(a,d){for(var w=\na;w<a+3;w++){var e=new v(h.$.insertRow(-1));e.setAttribute(\"role\",\"row\");for(var f=d;f<d+3;f++)for(var g=0;6>g;g++)c(e.$,\"#\"+b[f]+b[g]+b[w])}}function c(a,c){var b=new v(a.insertCell(-1));b.setAttribute(\"class\",\"ColorCell\");b.setAttribute(\"tabIndex\",-1);b.setAttribute(\"role\",\"gridcell\");b.on(\"keydown\",D);b.on(\"click\",y);b.on(\"focus\",z);b.on(\"blur\",u);b.setStyle(\"background-color\",c);b.setStyle(\"border\",\"1px solid \"+c);b.setStyle(\"width\",\"14px\");b.setStyle(\"height\",\"14px\");var d=p(\"color_table_cell\");\nb.setAttribute(\"aria-labelledby\",d);b.append(CKEDITOR.dom.element.createFromHtml('\\x3cspan id\\x3d\"'+d+'\" class\\x3d\"cke_voice_label\"\\x3e'+c+\"\\x3c/span\\x3e\",CKEDITOR.document))}h=CKEDITOR.dom.element.createFromHtml('\\x3ctable tabIndex\\x3d\"-1\" aria-label\\x3d\"'+f.options+'\" role\\x3d\"grid\" style\\x3d\"border-collapse:separate;\" cellspacing\\x3d\"0\"\\x3e\\x3ccaption class\\x3d\"cke_voice_label\"\\x3e'+f.options+'\\x3c/caption\\x3e\\x3ctbody role\\x3d\"presentation\"\\x3e\\x3c/tbody\\x3e\\x3c/table\\x3e');h.on(\"mouseover\",z);\nh.on(\"mouseout\",u);var b=\"00 33 66 99 cc ff\".split(\" \");a(0,0);a(3,0);a(0,3);a(3,3);var d=new v(h.$.insertRow(-1));d.setAttribute(\"role\",\"row\");c(d.$,\"#000000\");for(var e=0;16>e;e++){var k=e.toString(16);c(d.$,\"#\"+k+k+k+k+k+k)}c(d.$,\"#ffffff\")})();return{title:f.title,minWidth:360,minHeight:220,onLoad:function(){t=this},onHide:function(){q();var a=e.getChild(0).getHtml();e.setStyle(\"border-color\",a);e.setStyle(\"border-style\",\"solid\");d.getById(m).removeStyle(\"background-color\");d.getById(n).setHtml(\"\\x26nbsp;\");\ne=null},contents:[{id:\"picker\",label:f.title,accessKey:\"I\",elements:[{type:\"hbox\",padding:0,widths:[\"70%\",\"10%\",\"30%\"],children:[{type:\"html\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\",onLoad:function(){CKEDITOR.document.getById(this.domId).append(h)},focus:function(){(e||this.getElement().getElementsByTag(\"td\").getItem(0)).focus()}},B,{type:\"vbox\",padding:0,widths:[\"70%\",\"5%\",\"25%\"],children:[{type:\"html\",html:\"\\x3cspan\\x3e\"+f.highlight+'\\x3c/span\\x3e\\x3cdiv id\\x3d\"'+m+'\" style\\x3d\"border: 1px solid; height: 74px; width: 74px;\"\\x3e\\x3c/div\\x3e\\x3cdiv id\\x3d\"'+\nn+'\"\\x3e\\x26nbsp;\\x3c/div\\x3e\\x3cspan\\x3e'+f.selected+'\\x3c/span\\x3e\\x3cdiv id\\x3d\"'+r+'\" style\\x3d\"border: 1px solid; height: 20px; width: 74px;\"\\x3e\\x3c/div\\x3e'},{type:\"text\",label:f.selected,labelStyle:\"display:none\",id:\"selectedColor\",style:\"width: 76px;margin-top:4px\",onChange:function(){try{d.getById(r).setStyle(\"background-color\",this.getValue())}catch(a){q()}}},B,{type:\"button\",id:\"clear\",label:f.clear,onClick:q}]}]}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/dialog/dialogDefinition.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n"
  },
  {
    "path": "assets/ckeditor/plugins/div/dialogs/div.js",
    "content": "﻿(function(){function t(a,m,r){m.is&&m.getCustomData(\"block_processed\")||(m.is&&CKEDITOR.dom.element.setMarker(r,m,\"block_processed\",!0),a.push(m))}function q(a,m){function r(){this.foreach(function(a){/^(?!vbox|hbox)/.test(a.type)&&(a.setup||(a.setup=function(c){a.setValue(c.getAttribute(a.id)||\"\",1)}),a.commit||(a.commit=function(c){var g=this.getValue();if(\"dir\"!=a.id||c.getComputedStyle(\"direction\")!=g)g?c.setAttribute(a.id,g):c.removeAttribute(a.id)}))})}var q=function(){var f=CKEDITOR.tools.extend({},\nCKEDITOR.dtd.$blockLimit);a.config.div_wrapTable&&(delete f.td,delete f.th);return f}(),u=CKEDITOR.dtd.div,n={},p=[];return{title:a.lang.div.title,minWidth:400,minHeight:165,contents:[{id:\"info\",label:a.lang.common.generalTab,title:a.lang.common.generalTab,elements:[{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"elementStyle\",type:\"select\",style:\"width: 100%;\",label:a.lang.div.styleSelectLabel,\"default\":\"\",items:[[a.lang.common.notSet,\"\"]],onChange:function(){var f=[\"info:elementStyle\",\"info:class\",\n\"advanced:dir\",\"advanced:style\"],c=this.getDialog(),g=c._element&&c._element.clone()||new CKEDITOR.dom.element(\"div\",a.document);this.commit(g,!0);for(var f=[].concat(f),b=f.length,k,e=0;e<b;e++)(k=c.getContentElement.apply(c,f[e].split(\":\")))&&k.setup&&k.setup(g,!0)},setup:function(f){for(var c in n)n[c].checkElementRemovable(f,!0,a)&&this.setValue(c,1)},commit:function(f){var c;(c=this.getValue())?n[c].applyToObject(f,a):f.removeAttribute(\"style\")}},{id:\"class\",type:\"text\",requiredContent:\"div(cke-xyz)\",\nlabel:a.lang.common.cssClass,\"default\":\"\"}]}]},{id:\"advanced\",label:a.lang.common.advancedTab,title:a.lang.common.advancedTab,elements:[{type:\"vbox\",padding:1,children:[{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{type:\"text\",id:\"id\",requiredContent:\"div[id]\",label:a.lang.common.id,\"default\":\"\"},{type:\"text\",id:\"lang\",requiredContent:\"div[lang]\",label:a.lang.common.langCode,\"default\":\"\"}]},{type:\"hbox\",children:[{type:\"text\",id:\"style\",requiredContent:\"div{cke-xyz}\",style:\"width: 100%;\",label:a.lang.common.cssStyle,\n\"default\":\"\",commit:function(a){a.setAttribute(\"style\",this.getValue())}}]},{type:\"hbox\",children:[{type:\"text\",id:\"title\",requiredContent:\"div[title]\",style:\"width: 100%;\",label:a.lang.common.advisoryTitle,\"default\":\"\"}]},{type:\"select\",id:\"dir\",requiredContent:\"div[dir]\",style:\"width: 100%;\",label:a.lang.common.langDir,\"default\":\"\",items:[[a.lang.common.notSet,\"\"],[a.lang.common.langDirLtr,\"ltr\"],[a.lang.common.langDirRtl,\"rtl\"]]}]}]}],onLoad:function(){r.call(this);var f=this,c=this.getContentElement(\"info\",\n\"elementStyle\");a.getStylesSet(function(g){var b,k;if(g)for(var e=0;e<g.length;e++)k=g[e],k.element&&\"div\"==k.element&&(b=k.name,n[b]=k=new CKEDITOR.style(k),a.filter.check(k)&&(c.items.push([b,b]),c.add(b,b)));c[1<c.items.length?\"enable\":\"disable\"]();setTimeout(function(){f._element&&c.setup(f._element)},0)})},onShow:function(){\"editdiv\"==m&&this.setupContent(this._element=CKEDITOR.plugins.div.getSurroundDiv(a))},onOk:function(){if(\"editdiv\"==m)p=[this._element];else{var f=[],c={},g=[],b,k=a.getSelection(),\ne=k.getRanges(),n=k.createBookmarks(),h,l;for(h=0;h<e.length;h++)for(l=e[h].createIterator();b=l.getNextParagraph();)if(b.getName()in q&&!b.isReadOnly()){var d=b.getChildren();for(b=0;b<d.count();b++)t(g,d.getItem(b),c)}else{for(;!u[b.getName()]&&!b.equals(e[h].root);)b=b.getParent();t(g,b,c)}CKEDITOR.dom.element.clearAllMarkers(c);e=[];h=null;for(l=0;l<g.length;l++)b=g[l],d=a.elementPath(b).blockLimit,d.isReadOnly()&&(d=d.getParent()),a.config.div_wrapTable&&d.is([\"td\",\"th\"])&&(d=a.elementPath(d.getParent()).blockLimit),\nd.equals(h)||(h=d,e.push([])),e[e.length-1].push(b);for(h=0;h<e.length;h++){d=e[h][0];g=d.getParent();for(b=1;b<e[h].length;b++)g=g.getCommonAncestor(e[h][b]);l=new CKEDITOR.dom.element(\"div\",a.document);for(b=0;b<e[h].length;b++){for(d=e[h][b];!d.getParent().equals(g);)d=d.getParent();e[h][b]=d}for(b=0;b<e[h].length;b++)d=e[h][b],d.getCustomData&&d.getCustomData(\"block_processed\")||(d.is&&CKEDITOR.dom.element.setMarker(c,d,\"block_processed\",!0),b||l.insertBefore(d),l.append(d));CKEDITOR.dom.element.clearAllMarkers(c);\nf.push(l)}k.selectBookmarks(n);p=f}f=p.length;for(c=0;c<f;c++)this.commitContent(p[c]),!p[c].getAttribute(\"style\")&&p[c].removeAttribute(\"style\");this.hide()},onHide:function(){\"editdiv\"==m&&this._element.removeCustomData(\"elementStyle\");delete this._element}}}CKEDITOR.dialog.add(\"creatediv\",function(a){return q(a,\"creatediv\")});CKEDITOR.dialog.add(\"editdiv\",function(a){return q(a,\"editdiv\")})})();"
  },
  {
    "path": "assets/ckeditor/plugins/find/dialogs/find.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){function C(c){return c.type==CKEDITOR.NODE_TEXT&&0<c.getLength()&&(!r||!c.isReadOnly())}function w(c){return!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary(CKEDITOR.tools.extend({},CKEDITOR.dtd.$empty,CKEDITOR.dtd.$nonEditable)))}function q(c,g){function n(a,b){var d=this,c=new CKEDITOR.dom.walker(a);c.guard=b?w:function(a){!w(a)&&(d._.matchBoundary=!0)};c.evaluator=C;c.breakOnFalse=1;a.startContainer.type==CKEDITOR.NODE_TEXT&&(this.textNode=a.startContainer,this.offset=a.startOffset-\n1);this._={matchWord:b,walker:c,matchBoundary:!1}}function q(a,b){var d=c.createRange();d.setStart(a.textNode,b?a.offset:a.offset+1);d.setEndAt(c.editable(),CKEDITOR.POSITION_BEFORE_END);return d}function t(a){var b=c.getSelection().getRanges()[0],d=c.editable();b&&!a?(a=b.clone(),a.collapse(!0)):(a=c.createRange(),a.setStartAt(d,CKEDITOR.POSITION_AFTER_START));a.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);return a}var x=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{\"data-cke-highlight\":1},fullMatch:1,\nignoreReadonly:1,childRule:function(){return 0}},c.config.find_highlight,!0));n.prototype={next:function(){return this.move()},back:function(){return this.move(!0)},move:function(a){var b=this.textNode;if(null===b)return y.call(this);this._.matchBoundary=!1;if(b&&a&&0<this.offset)this.offset--;else if(b&&this.offset<b.getLength()-1)this.offset++;else{for(b=null;!b&&!(b=this._.walker[a?\"previous\":\"next\"].call(this._.walker),this._.matchWord&&!b||this._.walker._.end););this.offset=(this.textNode=b)?\na?b.getLength()-1:0:0}return y.call(this)}};var u=function(a,b){this._={walker:a,cursors:[],rangeLength:b,highlightRange:null,isMatched:0}};u.prototype={toDomRange:function(){var a=c.createRange(),b=this._.cursors;if(1>b.length){var d=this._.walker.textNode;if(d)a.setStartAfter(d);else return null}else d=b[0],b=b[b.length-1],a.setStart(d.textNode,d.offset),a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new n(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a);\nwhile(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched=!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();x.applyToRange(a,c);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}},\nremoveHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();x.removeFromRange(this._.highlightRange,c);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);this._.highlightRange=null}},isReadOnly:function(){return this._.highlightRange?this._.highlightRange.startContainer.isReadOnly():0},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&&\nb.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a);b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,d;d=this._.cursors;d=(b=d[d.length-1])&&b.textNode?new n(q(b)):this._.walker;return new u(d,a)},getCursors:function(){return this._.cursors}};var z=function(a,b){var d=[-1];b&&(a=a.toLowerCase());\nfor(var c=0;c<a.length;c++)for(d.push(d[c]+1);0<d[c+1]&&a.charAt(c)!=a.charAt(d[c+1]-1);)d[c+1]=d[d[c+1]-1]+1;this._={overlap:d,state:0,ignoreCase:!!b,pattern:a}};z.prototype={feedCharacter:function(a){for(this._.ignoreCase&&(a=a.toLowerCase());;){if(a==this._.pattern.charAt(this._.state))return this._.state++,this._.state==this._.pattern.length?(this._.state=0,2):1;if(this._.state)this._.state=this._.overlap[this._.state];else return 0}},reset:function(){this._.state=0}};var D=/[.,\"'?!;: \\u0085\\u00a0\\u1680\\u280e\\u2028\\u2029\\u202f\\u205f\\u3000]/,\nA=function(a){if(!a)return!0;var b=a.charCodeAt(0);return 9<=b&&13>=b||8192<=b&&8202>=b||D.test(a)},e={searchRange:null,matchRange:null,find:function(a,b,d,f,e,E){this.matchRange?(this.matchRange.removeHighlight(),this.matchRange=this.matchRange.getNextCharacterRange(a.length)):this.matchRange=new u(new n(this.searchRange),a.length);for(var k=new z(a,!b),l=0,m=\"%\";null!==m;){for(this.matchRange.moveNext();m=this.matchRange.getEndCharacter();){l=k.feedCharacter(m);if(2==l)break;this.matchRange.moveNext().hitMatchBoundary&&\nk.reset()}if(2==l){if(d){var h=this.matchRange.getCursors(),p=h[h.length-1],h=h[0],g=c.createRange();g.setStartAt(c.editable(),CKEDITOR.POSITION_AFTER_START);g.setEnd(h.textNode,h.offset);h=g;p=q(p);h.trim();p.trim();h=new n(h,!0);p=new n(p,!0);if(!A(h.back().character)||!A(p.next().character))continue}this.matchRange.setMatched();!1!==e&&this.matchRange.highlight();return!0}}this.matchRange.clearMatched();this.matchRange.removeHighlight();return f&&!E?(this.searchRange=t(1),this.matchRange=null,\narguments.callee.apply(this,Array.prototype.slice.call(arguments).concat([!0]))):!1},replaceCounter:0,replace:function(a,b,d,f,e,g,k){r=1;a=0;if(this.matchRange&&this.matchRange.isMatched()&&!this.matchRange._.isReplaced&&!this.matchRange.isReadOnly()){this.matchRange.removeHighlight();b=this.matchRange.toDomRange();d=c.document.createText(d);if(!k){var l=c.getSelection();l.selectRanges([b]);c.fire(\"saveSnapshot\")}b.deleteContents();b.insertNode(d);k||(l.selectRanges([b]),c.fire(\"saveSnapshot\"));\nthis.matchRange.updateFromDomRange(b);k||this.matchRange.highlight();this.matchRange._.isReplaced=!0;this.replaceCounter++;a=1}else a=this.find(b,f,e,g,!k);r=0;return a}},f=c.lang.find;return{title:f.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton(c,{label:c.lang.common.close})],contents:[{id:\"find\",label:f.find,title:f.find,accessKey:\"\",elements:[{type:\"hbox\",widths:[\"230px\",\"90px\"],children:[{type:\"text\",id:\"txtFindFind\",label:f.findWhat,\nisChanged:!1,labelLayout:\"horizontal\",accessKey:\"F\"},{type:\"button\",id:\"btnFind\",align:\"left\",style:\"width:100%\",label:f.find,onClick:function(){var a=this.getDialog();e.find(a.getValueOf(\"find\",\"txtFindFind\"),a.getValueOf(\"find\",\"txtFindCaseChk\"),a.getValueOf(\"find\",\"txtFindWordChk\"),a.getValueOf(\"find\",\"txtFindCyclic\"))||alert(f.notFoundMsg)}}]},{type:\"fieldset\",label:CKEDITOR.tools.htmlEncode(f.findOptions),style:\"margin-top:29px\",children:[{type:\"vbox\",padding:0,children:[{type:\"checkbox\",id:\"txtFindCaseChk\",\nisChanged:!1,label:f.matchCase},{type:\"checkbox\",id:\"txtFindWordChk\",isChanged:!1,label:f.matchWord},{type:\"checkbox\",id:\"txtFindCyclic\",isChanged:!1,\"default\":!0,label:f.matchCyclic}]}]}]},{id:\"replace\",label:f.replace,accessKey:\"M\",elements:[{type:\"hbox\",widths:[\"230px\",\"90px\"],children:[{type:\"text\",id:\"txtFindReplace\",label:f.findWhat,isChanged:!1,labelLayout:\"horizontal\",accessKey:\"F\"},{type:\"button\",id:\"btnFindReplace\",align:\"left\",style:\"width:100%\",label:f.replace,onClick:function(){var a=\nthis.getDialog();e.replace(a,a.getValueOf(\"replace\",\"txtFindReplace\"),a.getValueOf(\"replace\",\"txtReplace\"),a.getValueOf(\"replace\",\"txtReplaceCaseChk\"),a.getValueOf(\"replace\",\"txtReplaceWordChk\"),a.getValueOf(\"replace\",\"txtReplaceCyclic\"))||alert(f.notFoundMsg)}}]},{type:\"hbox\",widths:[\"230px\",\"90px\"],children:[{type:\"text\",id:\"txtReplace\",label:f.replaceWith,isChanged:!1,labelLayout:\"horizontal\",accessKey:\"R\"},{type:\"button\",id:\"btnReplaceAll\",align:\"left\",style:\"width:100%\",label:f.replaceAll,isChanged:!1,\nonClick:function(){var a=this.getDialog();e.replaceCounter=0;e.searchRange=t(1);e.matchRange&&(e.matchRange.removeHighlight(),e.matchRange=null);for(c.fire(\"saveSnapshot\");e.replace(a,a.getValueOf(\"replace\",\"txtFindReplace\"),a.getValueOf(\"replace\",\"txtReplace\"),a.getValueOf(\"replace\",\"txtReplaceCaseChk\"),a.getValueOf(\"replace\",\"txtReplaceWordChk\"),!1,!0););e.replaceCounter?(alert(f.replaceSuccessMsg.replace(/%1/,e.replaceCounter)),c.fire(\"saveSnapshot\")):alert(f.notFoundMsg)}}]},{type:\"fieldset\",\nlabel:CKEDITOR.tools.htmlEncode(f.findOptions),children:[{type:\"vbox\",padding:0,children:[{type:\"checkbox\",id:\"txtReplaceCaseChk\",isChanged:!1,label:f.matchCase},{type:\"checkbox\",id:\"txtReplaceWordChk\",isChanged:!1,label:f.matchWord},{type:\"checkbox\",id:\"txtReplaceCyclic\",isChanged:!1,\"default\":!0,label:f.matchCyclic}]}]}]}],onLoad:function(){var a=this,b,c=0;this.on(\"hide\",function(){c=0});this.on(\"show\",function(){c=1});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(f){return function(e){f.call(a,\ne);var g=a._.tabs[e],k;k=\"find\"===e?\"txtFindWordChk\":\"txtReplaceWordChk\";b=a.getContentElement(e,\"find\"===e?\"txtFindFind\":\"txtFindReplace\");a.getContentElement(e,k);g.initialized||(CKEDITOR.document.getById(b._.inputId),g.initialized=!0);if(c){var l;e=\"find\"===e?1:0;var g=1-e,m,h=v.length;for(m=0;m<h;m++)k=this.getContentElement(B[e],v[m][e]),l=this.getContentElement(B[g],v[m][g]),l.setValue(k.getValue())}}})},onShow:function(){e.searchRange=t();var a=this.getParentEditor().getSelection().getSelectedText(),\nb=this.getContentElement(g,\"find\"==g?\"txtFindFind\":\"txtFindReplace\");b.setValue(a);b.select();this.selectPage(g);this[(\"find\"==g&&this._.editor.readOnly?\"hide\":\"show\")+\"Page\"](\"replace\")},onHide:function(){var a;e.matchRange&&e.matchRange.isMatched()&&(e.matchRange.removeHighlight(),c.focus(),(a=e.matchRange.toDomRange())&&c.getSelection().selectRanges([a]));delete e.matchRange},onFocus:function(){return\"replace\"==g?this.getContentElement(\"replace\",\"txtFindReplace\"):this.getContentElement(\"find\",\n\"txtFindFind\")}}}var r,y=function(){return{textNode:this.textNode,offset:this.offset,character:this.textNode?this.textNode.getText().charAt(this.offset):null,hitMatchBoundary:this._.matchBoundary}},B=[\"find\",\"replace\"],v=[[\"txtFindFind\",\"txtFindReplace\"],[\"txtFindCaseChk\",\"txtReplaceCaseChk\"],[\"txtFindWordChk\",\"txtReplaceWordChk\"],[\"txtFindCyclic\",\"txtReplaceCyclic\"]];CKEDITOR.dialog.add(\"find\",function(c){return q(c,\"find\")});CKEDITOR.dialog.add(\"replace\",function(c){return q(c,\"replace\")})})();"
  },
  {
    "path": "assets/ckeditor/plugins/flash/dialogs/flash.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){function b(a,b,c){var h=n[this.id];if(h)for(var f=this instanceof CKEDITOR.ui.dialog.checkbox,e=0;e<h.length;e++){var d=h[e];switch(d.type){case 1:if(!a)continue;if(null!==a.getAttribute(d.name)){a=a.getAttribute(d.name);f?this.setValue(\"true\"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d[\"default\"]);break;case 2:if(!a)continue;if(d.name in c){a=c[d.name];f?this.setValue(\"true\"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d[\"default\"]);break;case 4:if(!b)continue;\nif(b.getAttribute(d.name)){a=b.getAttribute(d.name);f?this.setValue(\"true\"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d[\"default\"])}}}function c(a,b,c){var h=n[this.id];if(h)for(var f=\"\"===this.getValue(),e=this instanceof CKEDITOR.ui.dialog.checkbox,d=0;d<h.length;d++){var g=h[d];switch(g.type){case 1:if(!a||\"data\"==g.name&&b&&!a.hasAttribute(\"data\"))continue;var m=this.getValue();f||e&&m===g[\"default\"]?a.removeAttribute(g.name):a.setAttribute(g.name,m);break;case 2:if(!a)continue;\nm=this.getValue();if(f||e&&m===g[\"default\"])g.name in c&&c[g.name].remove();else if(g.name in c)c[g.name].setAttribute(\"value\",m);else{var p=CKEDITOR.dom.element.createFromHtml(\"\\x3ccke:param\\x3e\\x3c/cke:param\\x3e\",a.getDocument());p.setAttributes({name:g.name,value:m});1>a.getChildCount()?p.appendTo(a):p.insertBefore(a.getFirst())}break;case 4:if(!b)continue;m=this.getValue();f||e&&m===g[\"default\"]?b.removeAttribute(g.name):b.setAttribute(g.name,m)}}}for(var n={id:[{type:1,name:\"id\"}],classid:[{type:1,\nname:\"classid\"}],codebase:[{type:1,name:\"codebase\"}],pluginspage:[{type:4,name:\"pluginspage\"}],src:[{type:2,name:\"movie\"},{type:4,name:\"src\"},{type:1,name:\"data\"}],name:[{type:4,name:\"name\"}],align:[{type:1,name:\"align\"}],\"class\":[{type:1,name:\"class\"},{type:4,name:\"class\"}],width:[{type:1,name:\"width\"},{type:4,name:\"width\"}],height:[{type:1,name:\"height\"},{type:4,name:\"height\"}],hSpace:[{type:1,name:\"hSpace\"},{type:4,name:\"hSpace\"}],vSpace:[{type:1,name:\"vSpace\"},{type:4,name:\"vSpace\"}],style:[{type:1,\nname:\"style\"},{type:4,name:\"style\"}],type:[{type:4,name:\"type\"}]},k=\"play loop menu quality scale salign wmode bgcolor base flashvars allowScriptAccess allowFullScreen\".split(\" \"),l=0;l<k.length;l++)n[k[l]]=[{type:4,name:k[l]},{type:2,name:k[l]}];k=[\"play\",\"loop\",\"menu\"];for(l=0;l<k.length;l++)n[k[l]][0][\"default\"]=n[k[l]][1][\"default\"]=!0;CKEDITOR.dialog.add(\"flash\",function(a){var l=!a.config.flashEmbedTagOnly,k=a.config.flashAddEmbedTag||a.config.flashEmbedTagOnly,h,f=\"\\x3cdiv\\x3e\"+CKEDITOR.tools.htmlEncode(a.lang.common.preview)+\n'\\x3cbr\\x3e\\x3cdiv id\\x3d\"cke_FlashPreviewLoader'+CKEDITOR.tools.getNextNumber()+'\" style\\x3d\"display:none\"\\x3e\\x3cdiv class\\x3d\"loading\"\\x3e\\x26nbsp;\\x3c/div\\x3e\\x3c/div\\x3e\\x3cdiv id\\x3d\"cke_FlashPreviewBox'+CKEDITOR.tools.getNextNumber()+'\" class\\x3d\"FlashPreviewBox\"\\x3e\\x3c/div\\x3e\\x3c/div\\x3e';return{title:a.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){this.fakeImage=this.objectNode=this.embedNode=null;h=new CKEDITOR.dom.element(\"embed\",a.document);var e=this.getSelectedElement();\nif(e&&e.data(\"cke-real-element-type\")&&\"flash\"==e.data(\"cke-real-element-type\")){this.fakeImage=e;var d=a.restoreRealElement(e),g=null,b=null,c={};if(\"cke:object\"==d.getName()){g=d;d=g.getElementsByTag(\"embed\",\"cke\");0<d.count()&&(b=d.getItem(0));for(var d=g.getElementsByTag(\"param\",\"cke\"),f=0,l=d.count();f<l;f++){var k=d.getItem(f),n=k.getAttribute(\"name\"),k=k.getAttribute(\"value\");c[n]=k}}else\"cke:embed\"==d.getName()&&(b=d);this.objectNode=g;this.embedNode=b;this.setupContent(g,b,c,e)}},onOk:function(){var e=\nnull,d=null,b=null;this.fakeImage?(e=this.objectNode,d=this.embedNode):(l&&(e=CKEDITOR.dom.element.createFromHtml(\"\\x3ccke:object\\x3e\\x3c/cke:object\\x3e\",a.document),e.setAttributes({classid:\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\",codebase:\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version\\x3d6,0,40,0\"})),k&&(d=CKEDITOR.dom.element.createFromHtml(\"\\x3ccke:embed\\x3e\\x3c/cke:embed\\x3e\",a.document),d.setAttributes({type:\"application/x-shockwave-flash\",pluginspage:\"http://www.macromedia.com/go/getflashplayer\"}),\ne&&d.appendTo(e)));if(e)for(var b={},c=e.getElementsByTag(\"param\",\"cke\"),f=0,h=c.count();f<h;f++)b[c.getItem(f).getAttribute(\"name\")]=c.getItem(f);c={};f={};this.commitContent(e,d,b,c,f);e=a.createFakeElement(e||d,\"cke_flash\",\"flash\",!0);e.setAttributes(f);e.setStyles(c);this.fakeImage?(e.replace(this.fakeImage),a.getSelection().selectElement(e)):a.insertElement(e)},onHide:function(){this.preview&&this.preview.setHtml(\"\")},contents:[{id:\"info\",label:a.lang.common.generalTab,accessKey:\"I\",elements:[{type:\"vbox\",\npadding:0,children:[{type:\"hbox\",widths:[\"280px\",\"110px\"],align:\"right\",children:[{id:\"src\",type:\"text\",label:a.lang.common.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(a.lang.flash.validateSrc),setup:b,commit:c,onLoad:function(){var a=this.getDialog(),b=function(b){h.setAttribute(\"src\",b);a.preview.setHtml('\\x3cembed height\\x3d\"100%\" width\\x3d\"100%\" src\\x3d\"'+CKEDITOR.tools.htmlEncode(h.getAttribute(\"src\"))+'\" type\\x3d\"application/x-shockwave-flash\"\\x3e\\x3c/embed\\x3e')};a.preview=a.getContentElement(\"info\",\n\"preview\").getElement().getChild(3);this.on(\"change\",function(a){a.data&&a.data.value&&b(a.data.value)});this.getInputElement().on(\"change\",function(){b(this.getValue())},this)}},{type:\"button\",id:\"browse\",filebrowser:\"info:src\",hidden:!0,style:\"display:inline-block;margin-top:14px;\",label:a.lang.common.browseServer}]}]},{type:\"hbox\",widths:[\"25%\",\"25%\",\"25%\",\"25%\",\"25%\"],children:[{type:\"text\",id:\"width\",requiredContent:\"embed[width]\",style:\"width:95px\",label:a.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace(\"%1\",\na.lang.common.width)),setup:b,commit:c},{type:\"text\",id:\"height\",requiredContent:\"embed[height]\",style:\"width:95px\",label:a.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace(\"%1\",a.lang.common.height)),setup:b,commit:c},{type:\"text\",id:\"hSpace\",requiredContent:\"embed[hspace]\",style:\"width:95px\",label:a.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateHSpace),setup:b,commit:c},{type:\"text\",id:\"vSpace\",requiredContent:\"embed[vspace]\",\nstyle:\"width:95px\",label:a.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateVSpace),setup:b,commit:c}]},{type:\"vbox\",children:[{type:\"html\",id:\"preview\",style:\"width:95%;\",html:f}]}]},{id:\"Upload\",hidden:!0,filebrowser:\"uploadButton\",label:a.lang.common.upload,elements:[{type:\"file\",id:\"upload\",label:a.lang.common.upload,size:38},{type:\"fileButton\",id:\"uploadButton\",label:a.lang.common.uploadSubmit,filebrowser:\"info:src\",\"for\":[\"Upload\",\"upload\"]}]},{id:\"properties\",\nlabel:a.lang.flash.propertiesTab,elements:[{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"scale\",type:\"select\",requiredContent:\"embed[scale]\",label:a.lang.flash.scale,\"default\":\"\",style:\"width : 100%;\",items:[[a.lang.common.notSet,\"\"],[a.lang.flash.scaleAll,\"showall\"],[a.lang.flash.scaleNoBorder,\"noborder\"],[a.lang.flash.scaleFit,\"exactfit\"]],setup:b,commit:c},{id:\"allowScriptAccess\",type:\"select\",requiredContent:\"embed[allowscriptaccess]\",label:a.lang.flash.access,\"default\":\"\",style:\"width : 100%;\",\nitems:[[a.lang.common.notSet,\"\"],[a.lang.flash.accessAlways,\"always\"],[a.lang.flash.accessSameDomain,\"samedomain\"],[a.lang.flash.accessNever,\"never\"]],setup:b,commit:c}]},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"wmode\",type:\"select\",requiredContent:\"embed[wmode]\",label:a.lang.flash.windowMode,\"default\":\"\",style:\"width : 100%;\",items:[[a.lang.common.notSet,\"\"],[a.lang.flash.windowModeWindow,\"window\"],[a.lang.flash.windowModeOpaque,\"opaque\"],[a.lang.flash.windowModeTransparent,\"transparent\"]],\nsetup:b,commit:c},{id:\"quality\",type:\"select\",requiredContent:\"embed[quality]\",label:a.lang.flash.quality,\"default\":\"high\",style:\"width : 100%;\",items:[[a.lang.common.notSet,\"\"],[a.lang.flash.qualityBest,\"best\"],[a.lang.flash.qualityHigh,\"high\"],[a.lang.flash.qualityAutoHigh,\"autohigh\"],[a.lang.flash.qualityMedium,\"medium\"],[a.lang.flash.qualityAutoLow,\"autolow\"],[a.lang.flash.qualityLow,\"low\"]],setup:b,commit:c}]},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"align\",type:\"select\",requiredContent:\"object[align]\",\nlabel:a.lang.common.align,\"default\":\"\",style:\"width : 100%;\",items:[[a.lang.common.notSet,\"\"],[a.lang.common.alignLeft,\"left\"],[a.lang.flash.alignAbsBottom,\"absBottom\"],[a.lang.flash.alignAbsMiddle,\"absMiddle\"],[a.lang.flash.alignBaseline,\"baseline\"],[a.lang.common.alignBottom,\"bottom\"],[a.lang.common.alignMiddle,\"middle\"],[a.lang.common.alignRight,\"right\"],[a.lang.flash.alignTextTop,\"textTop\"],[a.lang.common.alignTop,\"top\"]],setup:b,commit:function(a,b,f,k,l){var h=this.getValue();c.apply(this,arguments);\nh&&(l.align=h)}},{type:\"html\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\"}]},{type:\"fieldset\",label:CKEDITOR.tools.htmlEncode(a.lang.flash.flashvars),children:[{type:\"vbox\",padding:0,children:[{type:\"checkbox\",id:\"menu\",label:a.lang.flash.chkMenu,\"default\":!0,setup:b,commit:c},{type:\"checkbox\",id:\"play\",label:a.lang.flash.chkPlay,\"default\":!0,setup:b,commit:c},{type:\"checkbox\",id:\"loop\",label:a.lang.flash.chkLoop,\"default\":!0,setup:b,commit:c},{type:\"checkbox\",id:\"allowFullScreen\",label:a.lang.flash.chkFull,\"default\":!0,\nsetup:b,commit:c}]}]}]},{id:\"advanced\",label:a.lang.common.advancedTab,elements:[{type:\"hbox\",children:[{type:\"text\",id:\"id\",requiredContent:\"object[id]\",label:a.lang.common.id,setup:b,commit:c}]},{type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{type:\"text\",id:\"bgcolor\",requiredContent:\"embed[bgcolor]\",label:a.lang.flash.bgcolor,setup:b,commit:c},{type:\"text\",id:\"class\",requiredContent:\"embed(cke-xyz)\",label:a.lang.common.cssClass,setup:b,commit:c}]},{type:\"text\",id:\"style\",requiredContent:\"embed{cke-xyz}\",\nvalidate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),label:a.lang.common.cssStyle,setup:b,commit:c}]}]}})})();"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/button.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"button\",function(b){function d(a){var b=this.getValue();b?(a.attributes[this.id]=b,\"name\"==this.id&&(a.attributes[\"data-cke-saved-name\"]=b)):(delete a.attributes[this.id],\"name\"==this.id&&delete a.attributes[\"data-cke-saved-name\"])}return{title:b.lang.forms.button.title,minWidth:350,minHeight:150,onShow:function(){delete this.button;var a=this.getParentEditor().getSelection().getSelectedElement();a&&a.is(\"input\")&&a.getAttribute(\"type\")in{button:1,reset:1,submit:1}&&(this.button=\na,this.setupContent(a))},onOk:function(){var a=this.getParentEditor(),b=this.button,d=!b,c=b?CKEDITOR.htmlParser.fragment.fromHtml(b.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element(\"input\");this.commitContent(c);var e=new CKEDITOR.htmlParser.basicWriter;c.writeHtml(e);c=CKEDITOR.dom.element.createFromHtml(e.getHtml(),a.document);d?a.insertElement(c):(c.replace(b),a.getSelection().selectElement(c))},contents:[{id:\"info\",label:b.lang.forms.button.title,title:b.lang.forms.button.title,elements:[{id:\"name\",\ntype:\"text\",bidi:!0,label:b.lang.common.name,\"default\":\"\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:d},{id:\"value\",type:\"text\",label:b.lang.forms.button.text,accessKey:\"V\",\"default\":\"\",setup:function(a){this.setValue(a.getAttribute(\"value\")||\"\")},commit:d},{id:\"type\",type:\"select\",label:b.lang.forms.button.type,\"default\":\"button\",accessKey:\"T\",items:[[b.lang.forms.button.typeBtn,\"button\"],[b.lang.forms.button.typeSbm,\"submit\"],[b.lang.forms.button.typeRst,\n\"reset\"]],setup:function(a){this.setValue(a.getAttribute(\"type\")||\"\")},commit:d}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/checkbox.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"checkbox\",function(d){return{title:d.lang.forms.checkboxAndRadio.checkboxTitle,minWidth:350,minHeight:140,onShow:function(){delete this.checkbox;var a=this.getParentEditor().getSelection().getSelectedElement();a&&\"checkbox\"==a.getAttribute(\"type\")&&(this.checkbox=a,this.setupContent(a))},onOk:function(){var a,b=this.checkbox;b||(a=this.getParentEditor(),b=a.document.createElement(\"input\"),b.setAttribute(\"type\",\"checkbox\"),a.insertElement(b));this.commitContent({element:b})},contents:[{id:\"info\",\nlabel:d.lang.forms.checkboxAndRadio.checkboxTitle,title:d.lang.forms.checkboxAndRadio.checkboxTitle,startupFocus:\"txtName\",elements:[{id:\"txtName\",type:\"text\",label:d.lang.common.name,\"default\":\"\",accessKey:\"N\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:function(a){a=a.element;this.getValue()?a.data(\"cke-saved-name\",this.getValue()):(a.data(\"cke-saved-name\",!1),a.removeAttribute(\"name\"))}},{id:\"txtValue\",type:\"text\",label:d.lang.forms.checkboxAndRadio.value,\n\"default\":\"\",accessKey:\"V\",setup:function(a){a=a.getAttribute(\"value\");this.setValue(CKEDITOR.env.ie&&\"on\"==a?\"\":a)},commit:function(a){var b=a.element,c=this.getValue();!c||CKEDITOR.env.ie&&\"on\"==c?CKEDITOR.env.ie?(c=new CKEDITOR.dom.element(\"input\",b.getDocument()),b.copyAttributes(c,{value:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c):b.removeAttribute(\"value\"):b.setAttribute(\"value\",c)}},{id:\"cmbSelected\",type:\"checkbox\",label:d.lang.forms.checkboxAndRadio.selected,\"default\":\"\",\naccessKey:\"S\",value:\"checked\",setup:function(a){this.setValue(a.getAttribute(\"checked\"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var c=!!b.getAttribute(\"checked\"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('\\x3cinput type\\x3d\"checkbox\"'+(e?' checked\\x3d\"checked\"':\"\")+\"/\\x3e\",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute(\"checked\",\"checked\"):b.removeAttribute(\"checked\")}},\n{id:\"required\",type:\"checkbox\",label:d.lang.forms.checkboxAndRadio.required,\"default\":\"\",accessKey:\"Q\",value:\"required\",setup:function(a){this.setValue(a.getAttribute(\"required\"))},commit:function(a){a=a.element;this.getValue()?a.setAttribute(\"required\",\"required\"):a.removeAttribute(\"required\")}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/form.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"form\",function(a){var d={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.forms.form.title,minWidth:350,minHeight:200,onShow:function(){delete this.form;var b=this.getParentEditor().elementPath().contains(\"form\",1);b&&(this.form=b,this.setupContent(b))},onOk:function(){var b,a=this.form,c=!a;c&&(b=this.getParentEditor(),a=b.document.createElement(\"form\"),a.appendBogus());c&&b.insertElement(a);this.commitContent(a)},onLoad:function(){function a(b){this.setValue(b.getAttribute(this.id)||\n\"\")}function e(a){this.getValue()?a.setAttribute(this.id,this.getValue()):a.removeAttribute(this.id)}this.foreach(function(c){d[c.id]&&(c.setup=a,c.commit=e)})},contents:[{id:\"info\",label:a.lang.forms.form.title,title:a.lang.forms.form.title,elements:[{id:\"txtName\",bidi:!0,type:\"text\",label:a.lang.common.name,\"default\":\"\",accessKey:\"N\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:function(a){this.getValue()?a.data(\"cke-saved-name\",this.getValue()):\n(a.data(\"cke-saved-name\",!1),a.removeAttribute(\"name\"))}},{id:\"action\",type:\"text\",label:a.lang.forms.form.action,\"default\":\"\",accessKey:\"T\"},{type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{id:\"id\",type:\"text\",label:a.lang.common.id,\"default\":\"\",accessKey:\"I\"},{id:\"enctype\",type:\"select\",label:a.lang.forms.form.encoding,style:\"width:100%\",accessKey:\"E\",\"default\":\"\",items:[[\"\"],[\"text/plain\"],[\"multipart/form-data\"],[\"application/x-www-form-urlencoded\"]]}]},{type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{id:\"target\",\ntype:\"select\",label:a.lang.common.target,style:\"width:100%\",accessKey:\"M\",\"default\":\"\",items:[[a.lang.common.notSet,\"\"],[a.lang.common.targetNew,\"_blank\"],[a.lang.common.targetTop,\"_top\"],[a.lang.common.targetSelf,\"_self\"],[a.lang.common.targetParent,\"_parent\"]]},{id:\"method\",type:\"select\",label:a.lang.forms.form.method,accessKey:\"M\",\"default\":\"GET\",items:[[\"GET\",\"get\"],[\"POST\",\"post\"]]}]}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/hiddenfield.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"hiddenfield\",function(d){return{title:d.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){delete this.hiddenField;var a=this.getParentEditor(),b=a.getSelection(),c=b.getSelectedElement();c&&c.data(\"cke-real-element-type\")&&\"hiddenfield\"==c.data(\"cke-real-element-type\")&&(this.hiddenField=c,c=a.restoreRealElement(this.hiddenField),this.setupContent(c),b.selectElement(this.hiddenField))},onOk:function(){var a=this.getValueOf(\"info\",\"_cke_saved_name\"),\nb=this.getParentEditor(),a=CKEDITOR.env.ie&&8>CKEDITOR.document.$.documentMode?b.document.createElement('\\x3cinput name\\x3d\"'+CKEDITOR.tools.htmlEncode(a)+'\"\\x3e'):b.document.createElement(\"input\");a.setAttribute(\"type\",\"hidden\");this.commitContent(a);a=b.createFakeElement(a,\"cke_hidden\",\"hiddenfield\");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:\"info\",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,elements:[{id:\"_cke_saved_name\",\ntype:\"text\",label:d.lang.forms.hidden.name,\"default\":\"\",accessKey:\"N\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:function(a){this.getValue()?a.setAttribute(\"name\",this.getValue()):a.removeAttribute(\"name\")}},{id:\"value\",type:\"text\",label:d.lang.forms.hidden.value,\"default\":\"\",accessKey:\"V\",setup:function(a){this.setValue(a.getAttribute(\"value\")||\"\")},commit:function(a){this.getValue()?a.setAttribute(\"value\",this.getValue()):a.removeAttribute(\"value\")}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/radio.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"radio\",function(b){return{title:b.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){delete this.radioButton;var a=this.getParentEditor().getSelection().getSelectedElement();a&&\"input\"==a.getName()&&\"radio\"==a.getAttribute(\"type\")&&(this.radioButton=a,this.setupContent(a))},onOk:function(){var a,c=this.radioButton,b=!c;b&&(a=this.getParentEditor(),c=a.document.createElement(\"input\"),c.setAttribute(\"type\",\"radio\"));b&&a.insertElement(c);this.commitContent({element:c})},\ncontents:[{id:\"info\",label:b.lang.forms.checkboxAndRadio.radioTitle,title:b.lang.forms.checkboxAndRadio.radioTitle,elements:[{id:\"name\",type:\"text\",label:b.lang.common.name,\"default\":\"\",accessKey:\"N\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:function(a){a=a.element;this.getValue()?a.data(\"cke-saved-name\",this.getValue()):(a.data(\"cke-saved-name\",!1),a.removeAttribute(\"name\"))}},{id:\"value\",type:\"text\",label:b.lang.forms.checkboxAndRadio.value,\"default\":\"\",\naccessKey:\"V\",setup:function(a){this.setValue(a.getAttribute(\"value\")||\"\")},commit:function(a){a=a.element;this.getValue()?a.setAttribute(\"value\",this.getValue()):a.removeAttribute(\"value\")}},{id:\"checked\",type:\"checkbox\",label:b.lang.forms.checkboxAndRadio.selected,\"default\":\"\",accessKey:\"S\",value:\"checked\",setup:function(a){this.setValue(a.getAttribute(\"checked\"))},commit:function(a){var c=a.element;if(CKEDITOR.env.ie){var d=c.getAttribute(\"checked\"),e=!!this.getValue();d!=e&&(d=CKEDITOR.dom.element.createFromHtml('\\x3cinput type\\x3d\"radio\"'+\n(e?' checked\\x3d\"checked\"':\"\")+\"\\x3e\\x3c/input\\x3e\",b.document),c.copyAttributes(d,{type:1,checked:1}),d.replace(c),b.getSelection().selectElement(d),a.element=d)}else this.getValue()?c.setAttribute(\"checked\",\"checked\"):c.removeAttribute(\"checked\")}},{id:\"required\",type:\"checkbox\",label:b.lang.forms.checkboxAndRadio.required,\"default\":\"\",accessKey:\"Q\",value:\"required\",setup:function(a){this.setValue(a.getAttribute(\"required\"))},commit:function(a){a=a.element;this.getValue()?a.setAttribute(\"required\",\n\"required\"):a.removeAttribute(\"required\")}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/select.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"select\",function(c){function h(a,b,e,d,c){a=f(a);d=d?d.createElement(\"OPTION\"):document.createElement(\"OPTION\");if(a&&d&&\"option\"==d.getName())CKEDITOR.env.ie?(isNaN(parseInt(c,10))?a.$.options.add(d.$):a.$.options.add(d.$,c),d.$.innerHTML=0<b.length?b:\"\",d.$.value=e):(null!==c&&c<a.getChildCount()?a.getChild(0>c?0:c).insertBeforeMe(d):a.append(d),d.setText(0<b.length?b:\"\"),d.setValue(e));else return!1;return d}function p(a){a=f(a);for(var b=g(a),e=a.getChildren().count()-1;0<=\ne;e--)a.getChild(e).$.selected&&a.getChild(e).remove();k(a,b)}function q(a,b,e,d){a=f(a);if(0>b)return!1;a=a.getChild(b);a.setText(e);a.setValue(d);return a}function m(a){for(a=f(a);a.getChild(0)&&a.getChild(0).remove(););}function l(a,b,e){a=f(a);var d=g(a);if(0>d)return!1;b=d+b;b=0>b?0:b;b=b>=a.getChildCount()?a.getChildCount()-1:b;if(d==b)return!1;var d=a.getChild(d),c=d.getText(),r=d.getValue();d.remove();d=h(a,c,r,e?e:null,b);k(a,b);return d}function g(a){return(a=f(a))?a.$.selectedIndex:-1}\nfunction k(a,b){a=f(a);if(0>b)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function n(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){delete this.selectBox;this.setupContent(\"clear\");var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&\"select\"==a.getName()){this.selectBox=\na;this.setupContent(a.getName(),a);for(var a=n(a),b=0;b<a.count();b++)this.setupContent(\"option\",a.getItem(b))}},onOk:function(){var a=this.getParentEditor(),b=this.selectBox,e=!b;e&&(b=a.document.createElement(\"select\"));this.commitContent(b);if(e&&(a.insertElement(b),CKEDITOR.env.ie)){var d=a.getSelection(),c=d.createBookmarks();setTimeout(function(){d.selectBookmarks(c)},0)}},contents:[{id:\"info\",label:c.lang.forms.select.selectInfo,title:c.lang.forms.select.selectInfo,accessKey:\"\",elements:[{id:\"txtName\",\ntype:\"text\",widths:[\"25%\",\"75%\"],labelLayout:\"horizontal\",label:c.lang.common.name,\"default\":\"\",accessKey:\"N\",style:\"width:350px\",setup:function(a,b){\"clear\"==a?this.setValue(this[\"default\"]||\"\"):\"select\"==a&&this.setValue(b.data(\"cke-saved-name\")||b.getAttribute(\"name\")||\"\")},commit:function(a){this.getValue()?a.data(\"cke-saved-name\",this.getValue()):(a.data(\"cke-saved-name\",!1),a.removeAttribute(\"name\"))}},{id:\"txtValue\",type:\"text\",widths:[\"25%\",\"75%\"],labelLayout:\"horizontal\",label:c.lang.forms.select.value,\nstyle:\"width:350px\",\"default\":\"\",className:\"cke_disabled\",onLoad:function(){this.getInputElement().setAttribute(\"readOnly\",!0)},setup:function(a,b){\"clear\"==a?this.setValue(\"\"):\"option\"==a&&b.getAttribute(\"selected\")&&this.setValue(b.$.value)}},{type:\"hbox\",widths:[\"175px\",\"170px\"],children:[{id:\"txtSize\",type:\"text\",labelLayout:\"horizontal\",label:c.lang.forms.select.size,\"default\":\"\",accessKey:\"S\",style:\"width:175px\",validate:function(){var a=CKEDITOR.dialog.validate.integer(c.lang.common.validateNumberFailed);\nreturn\"\"===this.getValue()||a.apply(this)},setup:function(a,b){\"select\"==a&&this.setValue(b.getAttribute(\"size\")||\"\");CKEDITOR.env.webkit&&this.getInputElement().setStyle(\"width\",\"86px\")},commit:function(a){this.getValue()?a.setAttribute(\"size\",this.getValue()):a.removeAttribute(\"size\")}},{type:\"html\",html:\"\\x3cspan\\x3e\"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.lines)+\"\\x3c/span\\x3e\"}]},{type:\"html\",html:\"\\x3cspan\\x3e\"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.opAvail)+\"\\x3c/span\\x3e\"},{type:\"hbox\",\nwidths:[\"115px\",\"115px\",\"100px\"],children:[{type:\"vbox\",children:[{id:\"txtOptName\",type:\"text\",label:c.lang.forms.select.opText,style:\"width:115px\",setup:function(a){\"clear\"==a&&this.setValue(\"\")}},{type:\"select\",id:\"cmbName\",label:\"\",title:\"\",size:5,style:\"width:115px;height:75px\",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"cmbValue\"),e=a.getContentElement(\"info\",\"txtOptName\"),a=a.getContentElement(\"info\",\"txtOptValue\"),d=g(this);k(b,d);e.setValue(this.getValue());\na.setValue(b.getValue())},setup:function(a,b){\"clear\"==a?m(this):\"option\"==a&&h(this,b.getText(),b.getText(),this.getDialog().getParentEditor().document)},commit:function(a){var b=this.getDialog(),e=n(this),d=n(b.getContentElement(\"info\",\"cmbValue\")),c=b.getContentElement(\"info\",\"txtValue\").getValue();m(a);for(var f=0;f<e.count();f++){var g=h(a,e.getItem(f).getValue(),d.getItem(f).getValue(),b.getParentEditor().document);d.getItem(f).getValue()==c&&(g.setAttribute(\"selected\",\"selected\"),g.selected=\n!0)}}}]},{type:\"vbox\",children:[{id:\"txtOptValue\",type:\"text\",label:c.lang.forms.select.opValue,style:\"width:115px\",setup:function(a){\"clear\"==a&&this.setValue(\"\")}},{type:\"select\",id:\"cmbValue\",label:\"\",size:5,style:\"width:115px;height:75px\",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"cmbName\"),e=a.getContentElement(\"info\",\"txtOptName\"),a=a.getContentElement(\"info\",\"txtOptValue\"),d=g(this);k(b,d);e.setValue(b.getValue());a.setValue(this.getValue())},setup:function(a,\nb){if(\"clear\"==a)m(this);else if(\"option\"==a){var e=b.getValue();h(this,e,e,this.getDialog().getParentEditor().document);\"selected\"==b.getAttribute(\"selected\")&&this.getDialog().getContentElement(\"info\",\"txtValue\").setValue(e)}}}]},{type:\"vbox\",padding:5,children:[{type:\"button\",id:\"btnAdd\",label:c.lang.forms.select.btnAdd,title:c.lang.forms.select.btnAdd,style:\"width:100%;\",onClick:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"txtOptName\"),e=a.getContentElement(\"info\",\"txtOptValue\"),\nd=a.getContentElement(\"info\",\"cmbName\"),c=a.getContentElement(\"info\",\"cmbValue\");h(d,b.getValue(),b.getValue(),a.getParentEditor().document);h(c,e.getValue(),e.getValue(),a.getParentEditor().document);b.setValue(\"\");e.setValue(\"\")}},{type:\"button\",id:\"btnModify\",label:c.lang.forms.select.btnModify,title:c.lang.forms.select.btnModify,style:\"width:100%;\",onClick:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"txtOptName\"),e=a.getContentElement(\"info\",\"txtOptValue\"),d=a.getContentElement(\"info\",\n\"cmbName\"),a=a.getContentElement(\"info\",\"cmbValue\"),c=g(d);0<=c&&(q(d,c,b.getValue(),b.getValue()),q(a,c,e.getValue(),e.getValue()))}},{type:\"button\",id:\"btnUp\",style:\"width:100%;\",label:c.lang.forms.select.btnUp,title:c.lang.forms.select.btnUp,onClick:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"cmbName\"),c=a.getContentElement(\"info\",\"cmbValue\");l(b,-1,a.getParentEditor().document);l(c,-1,a.getParentEditor().document)}},{type:\"button\",id:\"btnDown\",style:\"width:100%;\",label:c.lang.forms.select.btnDown,\ntitle:c.lang.forms.select.btnDown,onClick:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"cmbName\"),c=a.getContentElement(\"info\",\"cmbValue\");l(b,1,a.getParentEditor().document);l(c,1,a.getParentEditor().document)}}]}]},{type:\"hbox\",widths:[\"40%\",\"20%\",\"40%\"],children:[{type:\"button\",id:\"btnSetValue\",label:c.lang.forms.select.btnSetValue,title:c.lang.forms.select.btnSetValue,onClick:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"cmbValue\");a.getContentElement(\"info\",\n\"txtValue\").setValue(b.getValue())}},{type:\"button\",id:\"btnDelete\",label:c.lang.forms.select.btnDelete,title:c.lang.forms.select.btnDelete,onClick:function(){var a=this.getDialog(),b=a.getContentElement(\"info\",\"cmbName\"),c=a.getContentElement(\"info\",\"cmbValue\"),d=a.getContentElement(\"info\",\"txtOptName\"),a=a.getContentElement(\"info\",\"txtOptValue\");p(b);p(c);d.setValue(\"\");a.setValue(\"\")}},{type:\"vbox\",children:[{id:\"chkMulti\",type:\"checkbox\",label:c.lang.forms.select.chkMulti,\"default\":\"\",accessKey:\"M\",\nvalue:\"checked\",setup:function(a,b){\"select\"==a&&this.setValue(b.getAttribute(\"multiple\"))},commit:function(a){this.getValue()?a.setAttribute(\"multiple\",this.getValue()):a.removeAttribute(\"multiple\")}},{id:\"required\",type:\"checkbox\",label:c.lang.forms.select.required,\"default\":\"\",accessKey:\"Q\",value:\"checked\",setup:function(a,b){\"select\"==a&&this.setValue(b.getAttribute(\"required\"))},commit:function(a){this.getValue()?a.setAttribute(\"required\",\"required\"):a.removeAttribute(\"required\")}}]}]}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/textarea.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"textarea\",function(b){return{title:b.lang.forms.textarea.title,minWidth:350,minHeight:220,onShow:function(){delete this.textarea;var a=this.getParentEditor().getSelection().getSelectedElement();a&&\"textarea\"==a.getName()&&(this.textarea=a,this.setupContent(a))},onOk:function(){var a,b=this.textarea,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement(\"textarea\"));this.commitContent(b);c&&a.insertElement(b)},contents:[{id:\"info\",label:b.lang.forms.textarea.title,title:b.lang.forms.textarea.title,\nelements:[{id:\"_cke_saved_name\",type:\"text\",label:b.lang.common.name,\"default\":\"\",accessKey:\"N\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:function(a){this.getValue()?a.data(\"cke-saved-name\",this.getValue()):(a.data(\"cke-saved-name\",!1),a.removeAttribute(\"name\"))}},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"cols\",type:\"text\",label:b.lang.forms.textarea.cols,\"default\":\"\",accessKey:\"C\",style:\"width:50px\",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),\nsetup:function(a){a=a.hasAttribute(\"cols\")&&a.getAttribute(\"cols\");this.setValue(a||\"\")},commit:function(a){this.getValue()?a.setAttribute(\"cols\",this.getValue()):a.removeAttribute(\"cols\")}},{id:\"rows\",type:\"text\",label:b.lang.forms.textarea.rows,\"default\":\"\",accessKey:\"R\",style:\"width:50px\",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),setup:function(a){a=a.hasAttribute(\"rows\")&&a.getAttribute(\"rows\");this.setValue(a||\"\")},commit:function(a){this.getValue()?a.setAttribute(\"rows\",\nthis.getValue()):a.removeAttribute(\"rows\")}}]},{id:\"value\",type:\"textarea\",label:b.lang.forms.textfield.value,\"default\":\"\",setup:function(a){this.setValue(a.$.defaultValue)},commit:function(a){a.$.value=a.$.defaultValue=this.getValue()}},{id:\"required\",type:\"checkbox\",label:b.lang.forms.textfield.required,\"default\":\"\",accessKey:\"Q\",value:\"required\",setup:function(a){this.setValue(a.getAttribute(\"required\"))},commit:function(a){this.getValue()?a.setAttribute(\"required\",\"required\"):a.removeAttribute(\"required\")}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/forms/dialogs/textfield.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"textfield\",function(b){function e(a){a=a.element;var b=this.getValue();b?a.setAttribute(this.id,b):a.removeAttribute(this.id)}function f(a){a=a.hasAttribute(this.id)&&a.getAttribute(this.id);this.setValue(a||\"\")}var g={email:1,password:1,search:1,tel:1,text:1,url:1};return{title:b.lang.forms.textfield.title,minWidth:350,minHeight:150,onShow:function(){delete this.textField;var a=this.getParentEditor().getSelection().getSelectedElement();!a||\"input\"!=a.getName()||!g[a.getAttribute(\"type\")]&&\na.getAttribute(\"type\")||(this.textField=a,this.setupContent(a))},onOk:function(){var a=this.getParentEditor(),b=this.textField,c=!b;c&&(b=a.document.createElement(\"input\"),b.setAttribute(\"type\",\"text\"));b={element:b};c&&a.insertElement(b.element);this.commitContent(b);c||a.getSelection().selectElement(b.element)},onLoad:function(){this.foreach(function(a){a.getValue&&(a.setup||(a.setup=f),a.commit||(a.commit=e))})},contents:[{id:\"info\",label:b.lang.forms.textfield.title,title:b.lang.forms.textfield.title,\nelements:[{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"_cke_saved_name\",type:\"text\",label:b.lang.forms.textfield.name,\"default\":\"\",accessKey:\"N\",setup:function(a){this.setValue(a.data(\"cke-saved-name\")||a.getAttribute(\"name\")||\"\")},commit:function(a){a=a.element;this.getValue()?a.data(\"cke-saved-name\",this.getValue()):(a.data(\"cke-saved-name\",!1),a.removeAttribute(\"name\"))}},{id:\"value\",type:\"text\",label:b.lang.forms.textfield.value,\"default\":\"\",accessKey:\"V\",commit:function(a){if(CKEDITOR.env.ie&&\n!this.getValue()){var d=a.element,c=new CKEDITOR.dom.element(\"input\",b.document);d.copyAttributes(c,{value:1});c.replace(d);a.element=c}else e.call(this,a)}}]},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"size\",type:\"text\",label:b.lang.forms.textfield.charWidth,\"default\":\"\",accessKey:\"C\",style:\"width:50px\",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)},{id:\"maxLength\",type:\"text\",label:b.lang.forms.textfield.maxChars,\"default\":\"\",accessKey:\"M\",style:\"width:50px\",\nvalidate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)}],onLoad:function(){CKEDITOR.env.ie7Compat&&this.getElement().setStyle(\"zoom\",\"100%\")}},{id:\"type\",type:\"select\",label:b.lang.forms.textfield.type,\"default\":\"text\",accessKey:\"M\",items:[[b.lang.forms.textfield.typeEmail,\"email\"],[b.lang.forms.textfield.typePass,\"password\"],[b.lang.forms.textfield.typeSearch,\"search\"],[b.lang.forms.textfield.typeTel,\"tel\"],[b.lang.forms.textfield.typeText,\"text\"],[b.lang.forms.textfield.typeUrl,\n\"url\"]],setup:function(a){this.setValue(a.getAttribute(\"type\"))},commit:function(a){var d=a.element;if(CKEDITOR.env.ie){var c=d.getAttribute(\"type\"),e=this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('\\x3cinput type\\x3d\"'+e+'\"\\x3e\\x3c/input\\x3e',b.document),d.copyAttributes(c,{type:1}),c.replace(d),a.element=c)}else d.setAttribute(\"type\",this.getValue())}},{id:\"required\",type:\"checkbox\",label:b.lang.forms.textfield.required,\"default\":\"\",accessKey:\"Q\",value:\"required\",setup:function(a){this.setValue(a.getAttribute(\"required\"))},\ncommit:function(a){a=a.element;this.getValue()?a.setAttribute(\"required\",\"required\"):a.removeAttribute(\"required\")}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/iframe/dialogs/iframe.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){function c(b){var c=this instanceof CKEDITOR.ui.dialog.checkbox;b.hasAttribute(this.id)&&(b=b.getAttribute(this.id),c?this.setValue(e[this.id][\"true\"]==b.toLowerCase()):this.setValue(b))}function d(b){var c=\"\"===this.getValue(),a=this instanceof CKEDITOR.ui.dialog.checkbox,d=this.getValue();c?b.removeAttribute(this.att||this.id):a?b.setAttribute(this.id,e[this.id][d]):b.setAttribute(this.att||this.id,d)}var e={scrolling:{\"true\":\"yes\",\"false\":\"no\"},frameborder:{\"true\":\"1\",\"false\":\"0\"}};\nCKEDITOR.dialog.add(\"iframe\",function(b){var f=b.lang.iframe,a=b.lang.common,e=b.plugins.dialogadvtab;return{title:f.title,minWidth:350,minHeight:260,onShow:function(){this.fakeImage=this.iframeNode=null;var a=this.getSelectedElement();a&&a.data(\"cke-real-element-type\")&&\"iframe\"==a.data(\"cke-real-element-type\")&&(this.fakeImage=a,this.iframeNode=a=b.restoreRealElement(a),this.setupContent(a))},onOk:function(){var a;a=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element(\"iframe\");var c={},d={};\nthis.commitContent(a,c,d);a=b.createFakeElement(a,\"cke_iframe\",\"iframe\",!0);a.setAttributes(d);a.setStyles(c);this.fakeImage?(a.replace(this.fakeImage),b.getSelection().selectElement(a)):b.insertElement(a)},contents:[{id:\"info\",label:a.generalTab,accessKey:\"I\",elements:[{type:\"vbox\",padding:0,children:[{id:\"src\",type:\"text\",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(f.noUrl),setup:c,commit:d}]},{type:\"hbox\",children:[{id:\"width\",type:\"text\",requiredContent:\"iframe[width]\",\nstyle:\"width:100%\",labelLayout:\"vertical\",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace(\"%1\",a.width)),setup:c,commit:d},{id:\"height\",type:\"text\",requiredContent:\"iframe[height]\",style:\"width:100%\",labelLayout:\"vertical\",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace(\"%1\",a.height)),setup:c,commit:d},{id:\"align\",type:\"select\",requiredContent:\"iframe[align]\",\"default\":\"\",items:[[a.notSet,\"\"],[a.alignLeft,\"left\"],[a.alignRight,\n\"right\"],[a.alignTop,\"top\"],[a.alignMiddle,\"middle\"],[a.alignBottom,\"bottom\"]],style:\"width:100%\",labelLayout:\"vertical\",label:a.align,setup:function(a,b){c.apply(this,arguments);if(b){var d=b.getAttribute(\"align\");this.setValue(d&&d.toLowerCase()||\"\")}},commit:function(a,b,c){d.apply(this,arguments);this.getValue()&&(c.align=this.getValue())}}]},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"scrolling\",type:\"checkbox\",requiredContent:\"iframe[scrolling]\",label:f.scrolling,setup:c,commit:d},{id:\"frameborder\",\ntype:\"checkbox\",requiredContent:\"iframe[frameborder]\",label:f.border,setup:c,commit:d}]},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{id:\"name\",type:\"text\",requiredContent:\"iframe[name]\",label:a.name,setup:c,commit:d},{id:\"title\",type:\"text\",requiredContent:\"iframe[title]\",label:a.advisoryTitle,setup:c,commit:d}]},{id:\"longdesc\",type:\"text\",requiredContent:\"iframe[longdesc]\",label:a.longDescr,setup:c,commit:d}]},e&&e.createAdvancedTab(b,{id:1,classes:1,styles:1},\"iframe\")]}})})();"
  },
  {
    "path": "assets/ckeditor/plugins/image/dialogs/image.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){var v=function(d,l){function v(){var a=arguments,b=this.getContentElement(\"advanced\",\"txtdlgGenStyle\");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&\"txtdlgGenStyle\"!=b.id&&b.commit.apply(b,a)})}function k(a){if(!w){w=1;var b=this.getDialog(),c=b.imageElement;if(c){this.commit(1,c);a=[].concat(a);for(var d=a.length,f,g=0;g<d;g++)(f=b.getContentElement.apply(b,a[g].split(\":\")))&&f.setup(1,c)}w=0}}var m=/^\\s*(\\d+)((px)|\\%)?\\s*$/i,z=/(^\\s*(\\d+)((px)|\\%)?\\s*$)|^$/i,r=/^\\d+px$/,\nA=function(){var a=this.getValue(),b=this.getDialog(),c=a.match(m);c&&(\"%\"==c[2]&&n(b,!1),a=c[1]);b.lockRatio&&(c=b.originalElement,\"true\"==c.getCustomData(\"isReady\")&&(\"txtHeight\"==this.id?(a&&\"0\"!=a&&(a=Math.round(a/c.$.height*c.$.width)),isNaN(a)||b.setValueOf(\"info\",\"txtWidth\",a)):(a&&\"0\"!=a&&(a=Math.round(a/c.$.width*c.$.height)),isNaN(a)||b.setValueOf(\"info\",\"txtHeight\",a))));e(b)},e=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},w,n=function(a,\nb){if(!a.getContentElement(\"info\",\"ratioLock\"))return null;var c=a.originalElement;if(!c)return null;if(\"check\"==b){if(!a.userlockRatio&&\"true\"==c.getCustomData(\"isReady\")){var d=a.getValueOf(\"info\",\"txtWidth\"),f=a.getValueOf(\"info\",\"txtHeight\"),c=1E3*c.$.width/c.$.height,g=1E3*d/f;a.lockRatio=!1;d||f?isNaN(c)||isNaN(g)||Math.round(c)!=Math.round(g)||(a.lockRatio=!0):a.lockRatio=!0}}else void 0!==b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);d=CKEDITOR.document.getById(t);a.lockRatio?\nd.removeClass(\"cke_btn_unlocked\"):d.addClass(\"cke_btn_unlocked\");d.setAttribute(\"aria-checked\",a.lockRatio);CKEDITOR.env.hc&&d.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?\"■\":\"▣\":CKEDITOR.env.ie?\"□\":\"▢\");return a.lockRatio},B=function(a,b){var c=a.originalElement;if(\"true\"==c.getCustomData(\"isReady\")){var d=a.getContentElement(\"info\",\"txtWidth\"),f=a.getContentElement(\"info\",\"txtHeight\"),g;b?c=g=0:(g=c.$.width,c=c.$.height);d&&d.setValue(g);f&&f.setValue(c)}e(a)},C=function(a,b){function c(a,b){var c=\na.match(m);return c?(\"%\"==c[2]&&(c[1]+=\"%\",n(d,!1)),c[1]):b}if(1==a){var d=this.getDialog(),f=\"\",g=\"txtWidth\"==this.id?\"width\":\"height\",e=b.getAttribute(g);e&&(f=c(e,f));f=c(b.getStyle(g),f);this.setValue(f)}},x,u=function(){var a=this.originalElement,b=CKEDITOR.document.getById(p);a.setCustomData(\"isReady\",\"true\");a.removeListener(\"load\",u);a.removeListener(\"error\",h);a.removeListener(\"abort\",h);b&&b.setStyle(\"display\",\"none\");this.dontResetSize||B(this,!1===d.config.image_prefillDimensions);this.firstLoad&&\nCKEDITOR.tools.setTimeout(function(){n(this,\"check\")},0,this);this.dontResetSize=this.firstLoad=!1;e(this)},h=function(){var a=this.originalElement,b=CKEDITOR.document.getById(p);a.removeListener(\"load\",u);a.removeListener(\"error\",h);a.removeListener(\"abort\",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get(\"image\").path+\"images/noimage.png\");this.preview&&this.preview.setAttribute(\"src\",a);b&&b.setStyle(\"display\",\"none\");n(this,!1)},q=function(a){return CKEDITOR.tools.getNextId()+\"_\"+a},t=q(\"btnLockSizes\"),\ny=q(\"btnResetSize\"),p=q(\"ImagePreviewLoader\"),E=q(\"previewLink\"),D=q(\"previewImage\");return{title:d.lang.image[\"image\"==l?\"title\":\"titleButton\"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),c=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains(\"a\",1),d=CKEDITOR.document.getById(p);\nd&&d.setStyle(\"display\",\"none\");x=new CKEDITOR.dom.element(\"img\",a.document);this.preview=CKEDITOR.document.getById(D);this.originalElement=a.document.createElement(\"img\");this.originalElement.setAttribute(\"alt\",\"\");this.originalElement.setCustomData(\"isReady\",\"false\");c&&(this.linkElement=c,this.addLink=this.linkEditMode=!0,a=c.getChildren(),1==a.count()&&(d=a.getItem(0),d.type==CKEDITOR.NODE_ELEMENT&&(d.is(\"img\")||d.is(\"input\"))&&(this.imageElement=a.getItem(0),this.imageElement.is(\"img\")?this.imageEditMode=\n\"img\":this.imageElement.is(\"input\")&&(this.imageEditMode=\"input\"))),\"image\"==l&&this.setupContent(2,c));if(this.customImageElement)this.imageEditMode=\"img\",this.imageElement=this.customImageElement,delete this.customImageElement;else if(b&&\"img\"==b.getName()&&!b.data(\"cke-realelement\")||b&&\"input\"==b.getName()&&\"image\"==b.getAttribute(\"type\"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode&&(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,\n!0),this.setupContent(1,this.imageElement));n(this,!0);CKEDITOR.tools.trim(this.getValueOf(\"info\",\"txtUrl\"))||(this.preview.removeAttribute(\"src\"),this.preview.setStyle(\"display\",\"none\"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;\"image\"==l&&\"input\"==a&&confirm(d.lang.image.button2Img)?(this.imageElement=d.document.createElement(\"img\"),this.imageElement.setAttribute(\"alt\",\"\"),d.insertElement(this.imageElement)):\"image\"!=l&&\"img\"==a&&confirm(d.lang.image.img2Button)?(this.imageElement=\nd.document.createElement(\"input\"),this.imageElement.setAttributes({type:\"image\",alt:\"\"}),d.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else\"image\"==l?this.imageElement=d.document.createElement(\"img\"):(this.imageElement=d.document.createElement(\"input\"),this.imageElement.setAttribute(\"type\",\"image\")),this.imageElement.setAttribute(\"alt\",\"\");this.linkEditMode||(this.linkElement=d.document.createElement(\"a\"));this.commitContent(1,this.imageElement);\nthis.commitContent(2,this.linkElement);this.imageElement.getAttribute(\"style\")||this.imageElement.removeAttribute(\"style\");this.imageEditMode?!this.linkEditMode&&this.addLink?(d.insertElement(this.linkElement),this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(d.getSelection().selectElement(this.linkElement),d.insertElement(this.imageElement)):this.addLink?this.linkEditMode?this.linkElement.equals(d.getSelection().getSelectedElement())?(this.linkElement.setHtml(\"\"),this.linkElement.append(this.imageElement,\n!1)):d.insertElement(this.imageElement):(d.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):d.insertElement(this.imageElement)},onLoad:function(){\"image\"!=l&&this.hidePage(\"Link\");var a=this._.element.getDocument();this.getContentElement(\"info\",\"ratioLock\")&&(this.addFocusable(a.getById(y),5),this.addFocusable(a.getById(t),5));this.commitContent=v},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener(\"load\",\nu),this.originalElement.removeListener(\"error\",h),this.originalElement.removeListener(\"abort\",h),this.originalElement.remove(),this.originalElement=!1);delete this.imageElement},contents:[{id:\"info\",label:d.lang.image.infoTab,accessKey:\"I\",elements:[{type:\"vbox\",padding:0,children:[{type:\"hbox\",widths:[\"280px\",\"110px\"],align:\"right\",children:[{id:\"txtUrl\",type:\"text\",label:d.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),\nc=a.originalElement;a.preview&&a.preview.removeStyle(\"display\");c.setCustomData(\"isReady\",\"false\");var d=CKEDITOR.document.getById(p);d&&d.setStyle(\"display\",\"\");c.on(\"load\",u,a);c.on(\"error\",h,a);c.on(\"abort\",h,a);c.setAttribute(\"src\",b);a.preview&&(x.setAttribute(\"src\",b),a.preview.setAttribute(\"src\",x.$.src),e(a))}else a.preview&&(a.preview.removeAttribute(\"src\"),a.preview.setStyle(\"display\",\"none\"))},setup:function(a,b){if(1==a){var c=b.data(\"cke-saved-src\")||b.getAttribute(\"src\");this.getDialog().dontResetSize=\n!0;this.setValue(c);this.setInitValue()}},commit:function(a,b){1==a&&(this.getValue()||this.isChanged())?(b.data(\"cke-saved-src\",this.getValue()),b.setAttribute(\"src\",this.getValue())):8==a&&(b.setAttribute(\"src\",\"\"),b.removeAttribute(\"src\"))},validate:CKEDITOR.dialog.validate.notEmpty(d.lang.image.urlMissing)},{type:\"button\",id:\"browse\",style:\"display:inline-block;margin-top:14px;\",align:\"center\",label:d.lang.common.browseServer,hidden:!0,filebrowser:\"info:txtUrl\"}]}]},{id:\"txtAlt\",type:\"text\",label:d.lang.image.alt,\naccessKey:\"T\",\"default\":\"\",onChange:function(){e(this.getDialog())},setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"alt\"))},commit:function(a,b){1==a?(this.getValue()||this.isChanged())&&b.setAttribute(\"alt\",this.getValue()):4==a?b.setAttribute(\"alt\",this.getValue()):8==a&&b.removeAttribute(\"alt\")}},{type:\"hbox\",children:[{id:\"basic\",type:\"vbox\",children:[{type:\"hbox\",requiredContent:\"img{width,height}\",widths:[\"50%\",\"50%\"],children:[{type:\"vbox\",padding:1,children:[{type:\"text\",width:\"45px\",\nid:\"txtWidth\",label:d.lang.common.width,onKeyUp:A,onChange:function(){k.call(this,\"advanced:txtdlgGenStyle\")},validate:function(){var a=this.getValue().match(z);(a=!(!a||0===parseInt(a[1],10)))||alert(d.lang.common.invalidWidth);return a},setup:C,commit:function(a,b){var c=this.getValue();1==a?(c&&d.activeFilter.check(\"img{width,height}\")?b.setStyle(\"width\",CKEDITOR.tools.cssLength(c)):b.removeStyle(\"width\"),b.removeAttribute(\"width\")):4==a?c.match(m)?b.setStyle(\"width\",CKEDITOR.tools.cssLength(c)):\n(c=this.getDialog().originalElement,\"true\"==c.getCustomData(\"isReady\")&&b.setStyle(\"width\",c.$.width+\"px\")):8==a&&(b.removeAttribute(\"width\"),b.removeStyle(\"width\"))}},{type:\"text\",id:\"txtHeight\",width:\"45px\",label:d.lang.common.height,onKeyUp:A,onChange:function(){k.call(this,\"advanced:txtdlgGenStyle\")},validate:function(){var a=this.getValue().match(z);(a=!(!a||0===parseInt(a[1],10)))||alert(d.lang.common.invalidHeight);return a},setup:C,commit:function(a,b){var c=this.getValue();1==a?(c&&d.activeFilter.check(\"img{width,height}\")?\nb.setStyle(\"height\",CKEDITOR.tools.cssLength(c)):b.removeStyle(\"height\"),b.removeAttribute(\"height\")):4==a?c.match(m)?b.setStyle(\"height\",CKEDITOR.tools.cssLength(c)):(c=this.getDialog().originalElement,\"true\"==c.getCustomData(\"isReady\")&&b.setStyle(\"height\",c.$.height+\"px\")):8==a&&(b.removeAttribute(\"height\"),b.removeStyle(\"height\"))}}]},{id:\"ratioLock\",type:\"html\",style:\"margin-top:30px;width:40px;height:40px;\",onLoad:function(){var a=CKEDITOR.document.getById(y),b=CKEDITOR.document.getById(t);\na&&(a.on(\"click\",function(a){B(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on(\"mouseover\",function(){this.addClass(\"cke_btn_over\")},a),a.on(\"mouseout\",function(){this.removeClass(\"cke_btn_over\")},a));b&&(b.on(\"click\",function(a){n(this);var b=this.originalElement,d=this.getValueOf(\"info\",\"txtWidth\");\"true\"==b.getCustomData(\"isReady\")&&d&&(b=b.$.height/b.$.width*d,isNaN(b)||(this.setValueOf(\"info\",\"txtHeight\",Math.round(b)),e(this)));a.data&&a.data.preventDefault()},this.getDialog()),\nb.on(\"mouseover\",function(){this.addClass(\"cke_btn_over\")},b),b.on(\"mouseout\",function(){this.removeClass(\"cke_btn_over\")},b))},html:'\\x3cdiv\\x3e\\x3ca href\\x3d\"javascript:void(0)\" tabindex\\x3d\"-1\" title\\x3d\"'+d.lang.image.lockRatio+'\" class\\x3d\"cke_btn_locked\" id\\x3d\"'+t+'\" role\\x3d\"checkbox\"\\x3e\\x3cspan class\\x3d\"cke_icon\"\\x3e\\x3c/span\\x3e\\x3cspan class\\x3d\"cke_label\"\\x3e'+d.lang.image.lockRatio+'\\x3c/span\\x3e\\x3c/a\\x3e\\x3ca href\\x3d\"javascript:void(0)\" tabindex\\x3d\"-1\" title\\x3d\"'+d.lang.image.resetSize+\n'\" class\\x3d\"cke_btn_reset\" id\\x3d\"'+y+'\" role\\x3d\"button\"\\x3e\\x3cspan class\\x3d\"cke_label\"\\x3e'+d.lang.image.resetSize+\"\\x3c/span\\x3e\\x3c/a\\x3e\\x3c/div\\x3e\"}]},{type:\"vbox\",padding:1,children:[{type:\"text\",id:\"txtBorder\",requiredContent:\"img{border-width}\",width:\"60px\",label:d.lang.image.border,\"default\":\"\",onKeyUp:function(){e(this.getDialog())},onChange:function(){k.call(this,\"advanced:txtdlgGenStyle\")},validate:CKEDITOR.dialog.validate.integer(d.lang.image.validateBorder),setup:function(a,b){if(1==\na){var c;c=(c=(c=b.getStyle(\"border-width\"))&&c.match(/^(\\d+px)(?: \\1 \\1 \\1)?$/))&&parseInt(c[1],10);isNaN(parseInt(c,10))&&(c=b.getAttribute(\"border\"));this.setValue(c)}},commit:function(a,b){var c=parseInt(this.getValue(),10);1==a||4==a?(isNaN(c)?!c&&this.isChanged()&&b.removeStyle(\"border\"):(b.setStyle(\"border-width\",CKEDITOR.tools.cssLength(c)),b.setStyle(\"border-style\",\"solid\")),1==a&&b.removeAttribute(\"border\")):8==a&&(b.removeAttribute(\"border\"),b.removeStyle(\"border-width\"),b.removeStyle(\"border-style\"),\nb.removeStyle(\"border-color\"))}},{type:\"text\",id:\"txtHSpace\",requiredContent:\"img{margin-left,margin-right}\",width:\"60px\",label:d.lang.image.hSpace,\"default\":\"\",onKeyUp:function(){e(this.getDialog())},onChange:function(){k.call(this,\"advanced:txtdlgGenStyle\")},validate:CKEDITOR.dialog.validate.integer(d.lang.image.validateHSpace),setup:function(a,b){if(1==a){var c,d;c=b.getStyle(\"margin-left\");d=b.getStyle(\"margin-right\");c=c&&c.match(r);d=d&&d.match(r);c=parseInt(c,10);d=parseInt(d,10);c=c==d&&c;\nisNaN(parseInt(c,10))&&(c=b.getAttribute(\"hspace\"));this.setValue(c)}},commit:function(a,b){var c=parseInt(this.getValue(),10);1==a||4==a?(isNaN(c)?!c&&this.isChanged()&&(b.removeStyle(\"margin-left\"),b.removeStyle(\"margin-right\")):(b.setStyle(\"margin-left\",CKEDITOR.tools.cssLength(c)),b.setStyle(\"margin-right\",CKEDITOR.tools.cssLength(c))),1==a&&b.removeAttribute(\"hspace\")):8==a&&(b.removeAttribute(\"hspace\"),b.removeStyle(\"margin-left\"),b.removeStyle(\"margin-right\"))}},{type:\"text\",id:\"txtVSpace\",\nrequiredContent:\"img{margin-top,margin-bottom}\",width:\"60px\",label:d.lang.image.vSpace,\"default\":\"\",onKeyUp:function(){e(this.getDialog())},onChange:function(){k.call(this,\"advanced:txtdlgGenStyle\")},validate:CKEDITOR.dialog.validate.integer(d.lang.image.validateVSpace),setup:function(a,b){if(1==a){var c,d;c=b.getStyle(\"margin-top\");d=b.getStyle(\"margin-bottom\");c=c&&c.match(r);d=d&&d.match(r);c=parseInt(c,10);d=parseInt(d,10);c=c==d&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute(\"vspace\"));this.setValue(c)}},\ncommit:function(a,b){var c=parseInt(this.getValue(),10);1==a||4==a?(isNaN(c)?!c&&this.isChanged()&&(b.removeStyle(\"margin-top\"),b.removeStyle(\"margin-bottom\")):(b.setStyle(\"margin-top\",CKEDITOR.tools.cssLength(c)),b.setStyle(\"margin-bottom\",CKEDITOR.tools.cssLength(c))),1==a&&b.removeAttribute(\"vspace\")):8==a&&(b.removeAttribute(\"vspace\"),b.removeStyle(\"margin-top\"),b.removeStyle(\"margin-bottom\"))}},{id:\"cmbAlign\",requiredContent:\"img{float}\",type:\"select\",widths:[\"35%\",\"65%\"],style:\"width:90px\",\nlabel:d.lang.common.align,\"default\":\"\",items:[[d.lang.common.notSet,\"\"],[d.lang.common.alignLeft,\"left\"],[d.lang.common.alignRight,\"right\"]],onChange:function(){e(this.getDialog());k.call(this,\"advanced:txtdlgGenStyle\")},setup:function(a,b){if(1==a){var c=b.getStyle(\"float\");switch(c){case \"inherit\":case \"none\":c=\"\"}!c&&(c=(b.getAttribute(\"align\")||\"\").toLowerCase());this.setValue(c)}},commit:function(a,b){var c=this.getValue();if(1==a||4==a){if(c?b.setStyle(\"float\",c):b.removeStyle(\"float\"),1==a)switch(c=\n(b.getAttribute(\"align\")||\"\").toLowerCase(),c){case \"left\":case \"right\":b.removeAttribute(\"align\")}}else 8==a&&b.removeStyle(\"float\")}}]}]},{type:\"vbox\",height:\"250px\",children:[{type:\"html\",id:\"htmlPreview\",style:\"width:95%;\",html:\"\\x3cdiv\\x3e\"+CKEDITOR.tools.htmlEncode(d.lang.common.preview)+'\\x3cbr\\x3e\\x3cdiv id\\x3d\"'+p+'\" class\\x3d\"ImagePreviewLoader\" style\\x3d\"display:none\"\\x3e\\x3cdiv class\\x3d\"loading\"\\x3e\\x26nbsp;\\x3c/div\\x3e\\x3c/div\\x3e\\x3cdiv class\\x3d\"ImagePreviewBox\"\\x3e\\x3ctable\\x3e\\x3ctr\\x3e\\x3ctd\\x3e\\x3ca href\\x3d\"javascript:void(0)\" target\\x3d\"_blank\" onclick\\x3d\"return false;\" id\\x3d\"'+\nE+'\"\\x3e\\x3cimg id\\x3d\"'+D+'\" alt\\x3d\"\" /\\x3e\\x3c/a\\x3e'+(d.config.image_previewText||\"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.\")+\n\"\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\\x3c/div\\x3e\\x3c/div\\x3e\"}]}]}]},{id:\"Link\",requiredContent:\"a[href]\",label:d.lang.image.linkTab,padding:0,elements:[{id:\"txtUrl\",type:\"text\",label:d.lang.common.url,style:\"width: 100%\",\"default\":\"\",setup:function(a,b){if(2==a){var c=b.data(\"cke-saved-href\");c||(c=b.getAttribute(\"href\"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var c=this.getValue();b.data(\"cke-saved-href\",c);b.setAttribute(\"href\",c);this.getValue()||\n!d.config.image_removeLinkByEmptyURL?this.getDialog().addLink=!0:this.getDialog().addLink=!1}}},{type:\"button\",id:\"browse\",filebrowser:{action:\"Browse\",target:\"Link:txtUrl\",url:d.config.filebrowserImageBrowseLinkUrl},style:\"float:right\",hidden:!0,label:d.lang.common.browseServer},{id:\"cmbTarget\",type:\"select\",requiredContent:\"a[target]\",label:d.lang.common.target,\"default\":\"\",items:[[d.lang.common.notSet,\"\"],[d.lang.common.targetNew,\"_blank\"],[d.lang.common.targetTop,\"_top\"],[d.lang.common.targetSelf,\n\"_self\"],[d.lang.common.targetParent,\"_parent\"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute(\"target\")||\"\")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"target\",this.getValue())}}]},{id:\"Upload\",hidden:!0,filebrowser:\"uploadButton\",label:d.lang.image.upload,elements:[{type:\"file\",id:\"upload\",label:d.lang.image.btnUpload,style:\"height:40px\",size:38},{type:\"fileButton\",id:\"uploadButton\",filebrowser:\"info:txtUrl\",label:d.lang.image.btnUpload,\"for\":[\"Upload\",\n\"upload\"]}]},{id:\"advanced\",label:d.lang.common.advancedTab,elements:[{type:\"hbox\",widths:[\"50%\",\"25%\",\"25%\"],children:[{type:\"text\",id:\"linkId\",requiredContent:\"img[id]\",label:d.lang.common.id,setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"id\"))},commit:function(a,b){1==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"id\",this.getValue())}},{id:\"cmbLangDir\",type:\"select\",requiredContent:\"img[dir]\",style:\"width : 100px;\",label:d.lang.common.langDir,\"default\":\"\",items:[[d.lang.common.notSet,\n\"\"],[d.lang.common.langDirLtr,\"ltr\"],[d.lang.common.langDirRtl,\"rtl\"]],setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"dir\"))},commit:function(a,b){1==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"dir\",this.getValue())}},{type:\"text\",id:\"txtLangCode\",requiredContent:\"img[lang]\",label:d.lang.common.langCode,\"default\":\"\",setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"lang\"))},commit:function(a,b){1==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"lang\",this.getValue())}}]},\n{type:\"text\",id:\"txtGenLongDescr\",requiredContent:\"img[longdesc]\",label:d.lang.common.longDescr,setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"longDesc\"))},commit:function(a,b){1==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"longDesc\",this.getValue())}},{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{type:\"text\",id:\"txtGenClass\",requiredContent:\"img(cke-xyz)\",label:d.lang.common.cssClass,\"default\":\"\",setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"class\"))},commit:function(a,\nb){1==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"class\",this.getValue())}},{type:\"text\",id:\"txtGenTitle\",requiredContent:\"img[title]\",label:d.lang.common.advisoryTitle,\"default\":\"\",onChange:function(){e(this.getDialog())},setup:function(a,b){1==a&&this.setValue(b.getAttribute(\"title\"))},commit:function(a,b){1==a?(this.getValue()||this.isChanged())&&b.setAttribute(\"title\",this.getValue()):4==a?b.setAttribute(\"title\",this.getValue()):8==a&&b.removeAttribute(\"title\")}}]},{type:\"text\",id:\"txtdlgGenStyle\",\nrequiredContent:\"img{cke-xyz}\",label:d.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(d.lang.common.invalidInlineStyle),\"default\":\"\",setup:function(a,b){if(1==a){var c=b.getAttribute(\"style\");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var d=b.$.style.height,c=b.$.style.width,d=(d?d:\"\").match(m),c=(c?c:\"\").match(m);this.attributesInStyle={height:!!d,width:!!c}}},onChange:function(){k.call(this,\"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight\".split(\" \"));\ne(this)},commit:function(a,b){1==a&&(this.getValue()||this.isChanged())&&b.setAttribute(\"style\",this.getValue())}}]}]}};CKEDITOR.dialog.add(\"image\",function(d){return v(d,\"image\")});CKEDITOR.dialog.add(\"imagebutton\",function(d){return v(d,\"imagebutton\")})})();"
  },
  {
    "path": "assets/ckeditor/plugins/link/dialogs/anchor.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"anchor\",function(c){function d(a,b){return a.createFakeElement(a.document.createElement(\"a\",{attributes:b}),\"cke_anchor\",\"anchor\")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf(\"info\",\"txtName\")),a={id:a,name:a,\"data-cke-saved-name\":a};if(this._.selectedElement)this._.selectedElement.data(\"cke-realelement\")?(a=d(c,a),a.replace(this._.selectedElement),CKEDITOR.env.ie&&c.getSelection().selectElement(a)):\nthis._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(a=d(c,a),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a[\"class\"]=\"cke_anchor\"),a=new CKEDITOR.style({element:\"a\",attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement(),d=b&&b.data(\"cke-realelement\"),e=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b):CKEDITOR.plugins.link.getSelectedLink(c);\nif(e){this._.selectedElement=e;var f=e.data(\"cke-saved-name\");this.setValueOf(\"info\",\"txtName\",f||\"\");!d&&a.selectElement(e);b&&(this._.selectedElement=b)}this.getContentElement(\"info\",\"txtName\").focus()},contents:[{id:\"info\",label:c.lang.link.anchor.title,accessKey:\"I\",elements:[{type:\"text\",id:\"txtName\",label:c.lang.link.anchor.name,required:!0,validate:function(){return this.getValue()?!0:(alert(c.lang.link.anchor.errorName),!1)}}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/link/dialogs/link.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){CKEDITOR.dialog.add(\"link\",function(g){var n=CKEDITOR.plugins.link,p=function(){var a=this.getDialog(),b=a.getContentElement(\"target\",\"popupFeatures\"),a=a.getContentElement(\"target\",\"linkTargetName\"),m=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(\"\"),m){case \"frame\":a.setLabel(g.lang.link.targetFrameName);a.getElement().show();break;case \"popup\":b.show();a.setLabel(g.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(m),a.getElement().hide()}},\nf=function(a){a.target&&this.setValue(a.target[this.id]||\"\")},h=function(a){a.advanced&&this.setValue(a.advanced[this.id]||\"\")},k=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||\"\"},l=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||\"\"},c=g.lang.common,b=g.lang.link,d;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:\"info\",label:b.info,title:b.info,elements:[{id:\"linkType\",type:\"select\",label:b.type,\"default\":\"url\",items:[[b.toUrl,\"url\"],\n[b.toAnchor,\"anchor\"],[b.toEmail,\"email\"]],onChange:function(){var a=this.getDialog(),b=[\"urlOptions\",\"anchorOptions\",\"emailOptions\"],m=this.getValue(),e=a.definition.getContents(\"upload\"),e=e&&e.hidden;\"url\"==m?(g.config.linkShowTargetTab&&a.showPage(\"target\"),e||a.showPage(\"upload\")):(a.hidePage(\"target\"),e||a.hidePage(\"upload\"));for(e=0;e<b.length;e++){var c=a.getContentElement(\"info\",b[e]);c&&(c=c.getElement().getParent().getParent(),b[e]==m+\"Options\"?c.show():c.hide())}a.layout()},setup:function(a){this.setValue(a.type||\n\"url\")},commit:function(a){a.type=this.getValue()}},{type:\"vbox\",id:\"urlOptions\",children:[{type:\"hbox\",widths:[\"25%\",\"75%\"],children:[{id:\"protocol\",type:\"select\",label:c.protocol,\"default\":\"http://\",items:[[\"http://‎\",\"http://\"],[\"https://‎\",\"https://\"],[\"ftp://‎\",\"ftp://\"],[\"news://‎\",\"news://\"],[b.other,\"\"]],setup:function(a){a.url&&this.setValue(a.url.protocol||\"\")},commit:function(a){a.url||(a.url={});a.url.protocol=this.getValue()}},{type:\"text\",id:\"url\",label:c.url,required:!0,onLoad:function(){this.allowOnChange=\n!0},onKeyUp:function(){this.allowOnChange=!1;var a=this.getDialog().getContentElement(\"info\",\"protocol\"),b=this.getValue(),m=/^((javascript:)|[#\\/\\.\\?])/i,c=/^(http|https|ftp|news):\\/\\/(?=.)/i.exec(b);c?(this.setValue(b.substr(c[0].length)),a.setValue(c[0].toLowerCase())):m.test(b)&&a.setValue(\"\");this.allowOnChange=!0},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();return a.getContentElement(\"info\",\"linkType\")&&\"url\"!=a.getValueOf(\"info\",\"linkType\")?\n!0:!g.config.linkJavaScriptLinksAllowed&&/javascript\\:/.test(this.getValue())?(alert(c.invalidValue),!1):this.getDialog().fakeObj?!0:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=!1;a.url&&this.setValue(a.url.url);this.allowOnChange=!0},commit:function(a){this.onChange();a.url||(a.url={});a.url.url=this.getValue();this.allowOnChange=!1}}],setup:function(){this.getDialog().getContentElement(\"info\",\"linkType\")||this.getElement().show()}},{type:\"button\",\nid:\"browse\",hidden:\"true\",filebrowser:\"info:url\",label:c.browseServer}]},{type:\"vbox\",id:\"anchorOptions\",width:260,align:\"center\",padding:0,children:[{type:\"fieldset\",id:\"selectAnchorText\",label:b.selectAnchor,setup:function(){d=n.getEditorAnchors(g);this.getElement()[d&&d.length?\"show\":\"hide\"]()},children:[{type:\"hbox\",id:\"selectAnchor\",children:[{type:\"select\",id:\"anchorName\",\"default\":\"\",label:b.anchorName,style:\"width: 100%;\",items:[[\"\"]],setup:function(a){this.clear();this.add(\"\");if(d)for(var b=\n0;b<d.length;b++)d[b].name&&this.add(d[b].name);a.anchor&&this.setValue(a.anchor.name);(a=this.getDialog().getContentElement(\"info\",\"linkType\"))&&\"email\"==a.getValue()&&this.focus()},commit:function(a){a.anchor||(a.anchor={});a.anchor.name=this.getValue()}},{type:\"select\",id:\"anchorId\",\"default\":\"\",label:b.anchorId,style:\"width: 100%;\",items:[[\"\"]],setup:function(a){this.clear();this.add(\"\");if(d)for(var b=0;b<d.length;b++)d[b].id&&this.add(d[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){a.anchor||\n(a.anchor={});a.anchor.id=this.getValue()}}],setup:function(){this.getElement()[d&&d.length?\"show\":\"hide\"]()}}]},{type:\"html\",id:\"noAnchors\",style:\"text-align: center;\",html:'\\x3cdiv role\\x3d\"note\" tabIndex\\x3d\"-1\"\\x3e'+CKEDITOR.tools.htmlEncode(b.noAnchors)+\"\\x3c/div\\x3e\",focus:!0,setup:function(){this.getElement()[d&&d.length?\"hide\":\"show\"]()}}],setup:function(){this.getDialog().getContentElement(\"info\",\"linkType\")||this.getElement().hide()}},{type:\"vbox\",id:\"emailOptions\",padding:1,children:[{type:\"text\",\nid:\"emailAddress\",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return a.getContentElement(\"info\",\"linkType\")&&\"email\"==a.getValueOf(\"info\",\"linkType\")?CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this):!0},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement(\"info\",\"linkType\"))&&\"email\"==a.getValue()&&this.select()},commit:function(a){a.email||(a.email={});a.email.address=this.getValue()}},{type:\"text\",id:\"emailSubject\",\nlabel:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){a.email||(a.email={});a.email.subject=this.getValue()}},{type:\"textarea\",id:\"emailBody\",label:b.emailBody,rows:3,\"default\":\"\",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){a.email||(a.email={});a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement(\"info\",\"linkType\")||this.getElement().hide()}}]},{id:\"target\",requiredContent:\"a[target]\",label:b.target,\ntitle:b.target,elements:[{type:\"hbox\",widths:[\"50%\",\"50%\"],children:[{type:\"select\",id:\"linkTargetType\",label:c.target,\"default\":\"notSet\",style:\"width : 100%;\",items:[[c.notSet,\"notSet\"],[b.targetFrame,\"frame\"],[b.targetPopup,\"popup\"],[c.targetNew,\"_blank\"],[c.targetTop,\"_top\"],[c.targetSelf,\"_self\"],[c.targetParent,\"_parent\"]],onChange:p,setup:function(a){a.target&&this.setValue(a.target.type||\"notSet\");p.call(this)},commit:function(a){a.target||(a.target={});a.target.type=this.getValue()}},{type:\"text\",\nid:\"linkTargetName\",label:b.targetFrameName,\"default\":\"\",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){a.target||(a.target={});a.target.name=this.getValue().replace(/([^\\x00-\\x7F]|\\s)/gi,\"\")}}]},{type:\"vbox\",width:\"100%\",align:\"center\",padding:2,id:\"popupFeatures\",children:[{type:\"fieldset\",label:b.popupFeatures,children:[{type:\"hbox\",children:[{type:\"checkbox\",id:\"resizable\",label:b.popupResizable,setup:f,commit:k},{type:\"checkbox\",id:\"status\",label:b.popupStatusBar,\nsetup:f,commit:k}]},{type:\"hbox\",children:[{type:\"checkbox\",id:\"location\",label:b.popupLocationBar,setup:f,commit:k},{type:\"checkbox\",id:\"toolbar\",label:b.popupToolbar,setup:f,commit:k}]},{type:\"hbox\",children:[{type:\"checkbox\",id:\"menubar\",label:b.popupMenuBar,setup:f,commit:k},{type:\"checkbox\",id:\"fullscreen\",label:b.popupFullScreen,setup:f,commit:k}]},{type:\"hbox\",children:[{type:\"checkbox\",id:\"scrollbars\",label:b.popupScrollBars,setup:f,commit:k},{type:\"checkbox\",id:\"dependent\",label:b.popupDependent,\nsetup:f,commit:k}]},{type:\"hbox\",children:[{type:\"text\",widths:[\"50%\",\"50%\"],labelLayout:\"horizontal\",label:c.width,id:\"width\",setup:f,commit:k},{type:\"text\",labelLayout:\"horizontal\",widths:[\"50%\",\"50%\"],label:b.popupLeft,id:\"left\",setup:f,commit:k}]},{type:\"hbox\",children:[{type:\"text\",labelLayout:\"horizontal\",widths:[\"50%\",\"50%\"],label:c.height,id:\"height\",setup:f,commit:k},{type:\"text\",labelLayout:\"horizontal\",label:b.popupTop,widths:[\"50%\",\"50%\"],id:\"top\",setup:f,commit:k}]}]}]}]},{id:\"upload\",\nlabel:b.upload,title:b.upload,hidden:!0,filebrowser:\"uploadButton\",elements:[{type:\"file\",id:\"upload\",label:c.upload,style:\"height:40px\",size:29},{type:\"fileButton\",id:\"uploadButton\",label:c.uploadSubmit,filebrowser:\"info:url\",\"for\":[\"upload\",\"upload\"]}]},{id:\"advanced\",label:b.advanced,title:b.advanced,elements:[{type:\"vbox\",padding:1,children:[{type:\"hbox\",widths:[\"45%\",\"35%\",\"20%\"],children:[{type:\"text\",id:\"advId\",requiredContent:\"a[id]\",label:b.id,setup:h,commit:l},{type:\"select\",id:\"advLangDir\",\nrequiredContent:\"a[dir]\",label:b.langDir,\"default\":\"\",style:\"width:110px\",items:[[c.notSet,\"\"],[b.langDirLTR,\"ltr\"],[b.langDirRTL,\"rtl\"]],setup:h,commit:l},{type:\"text\",id:\"advAccessKey\",requiredContent:\"a[accesskey]\",width:\"80px\",label:b.acccessKey,maxLength:1,setup:h,commit:l}]},{type:\"hbox\",widths:[\"45%\",\"35%\",\"20%\"],children:[{type:\"text\",label:b.name,id:\"advName\",requiredContent:\"a[name]\",setup:h,commit:l},{type:\"text\",label:b.langCode,id:\"advLangCode\",requiredContent:\"a[lang]\",width:\"110px\",\n\"default\":\"\",setup:h,commit:l},{type:\"text\",label:b.tabIndex,id:\"advTabIndex\",requiredContent:\"a[tabindex]\",width:\"80px\",maxLength:5,setup:h,commit:l}]}]},{type:\"vbox\",padding:1,children:[{type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{type:\"text\",label:b.advisoryTitle,requiredContent:\"a[title]\",\"default\":\"\",id:\"advTitle\",setup:h,commit:l},{type:\"text\",label:b.advisoryContentType,requiredContent:\"a[type]\",\"default\":\"\",id:\"advContentType\",setup:h,commit:l}]},{type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{type:\"text\",\nlabel:b.cssClasses,requiredContent:\"a(cke-xyz)\",\"default\":\"\",id:\"advCSSClasses\",setup:h,commit:l},{type:\"text\",label:b.charset,requiredContent:\"a[charset]\",\"default\":\"\",id:\"advCharset\",setup:h,commit:l}]},{type:\"hbox\",widths:[\"45%\",\"55%\"],children:[{type:\"text\",label:b.rel,requiredContent:\"a[rel]\",\"default\":\"\",id:\"advRel\",setup:h,commit:l},{type:\"text\",label:b.styles,requiredContent:\"a{cke-xyz}\",\"default\":\"\",id:\"advStyles\",validate:CKEDITOR.dialog.validate.inlineStyle(g.lang.common.invalidInlineStyle),\nsetup:h,commit:l}]}]}]}],onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=null;(c=n.getSelectedLink(a))&&c.hasAttribute(\"href\")?b.getSelectedElement()||b.selectElement(c):c=null;a=n.parseLinkAttributes(a,c);this._.selectedElement=c;this.setupContent(a)},onOk:function(){var a={};this.commitContent(a);var b=g.getSelection(),c=n.getLinkAttributes(g,a);if(this._.selectedElement){var e=this._.selectedElement,d=e.data(\"cke-saved-href\"),f=e.getHtml();e.setAttributes(c.set);e.removeAttributes(c.removed);\nif(d==f||\"email\"==a.type&&-1!=f.indexOf(\"@\"))e.setHtml(\"email\"==a.type?a.email.address:c.set[\"data-cke-saved-href\"]),b.selectElement(e);delete this._.selectedElement}else b=b.getRanges()[0],b.collapsed&&(a=new CKEDITOR.dom.text(\"email\"==a.type?a.email.address:c.set[\"data-cke-saved-href\"],g.document),b.insertNode(a),b.selectNodeContents(a)),c=new CKEDITOR.style({element:\"a\",attributes:c.set}),c.type=CKEDITOR.STYLE_INLINE,c.applyToRange(b,g),b.select()},onLoad:function(){g.config.linkShowAdvancedTab||\nthis.hidePage(\"advanced\");g.config.linkShowTargetTab||this.hidePage(\"target\")},onFocus:function(){var a=this.getContentElement(\"info\",\"linkType\");a&&\"url\"==a.getValue()&&(a=this.getContentElement(\"info\",\"url\"),a.select())}}})})();"
  },
  {
    "path": "assets/ckeditor/plugins/liststyle/dialogs/liststyle.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){function d(c,d){var b;try{b=c.getSelection().getRanges()[0]}catch(f){return null}b.shrink(CKEDITOR.SHRINK_TEXT);return c.elementPath(b.getCommonAncestor()).contains(d,1)}function e(c,e){var b=c.lang.liststyle;if(\"bulletedListStyle\"==e)return{title:b.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:\"info\",accessKey:\"I\",elements:[{type:\"select\",label:b.type,id:\"type\",align:\"center\",style:\"width:150px\",items:[[b.notset,\"\"],[b.circle,\"circle\"],[b.disc,\"disc\"],[b.square,\"square\"]],setup:function(a){a=\na.getStyle(\"list-style-type\")||h[a.getAttribute(\"type\")]||a.getAttribute(\"type\")||\"\";this.setValue(a)},commit:function(a){var b=this.getValue();b?a.setStyle(\"list-style-type\",b):a.removeStyle(\"list-style-type\")}}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,\"ul\"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,\"ul\"))&&this.commitContent(a)}};if(\"numberedListStyle\"==e){var g=[[b.notset,\"\"],[b.lowerRoman,\"lower-roman\"],[b.upperRoman,\"upper-roman\"],[b.lowerAlpha,\n\"lower-alpha\"],[b.upperAlpha,\"upper-alpha\"],[b.decimal,\"decimal\"]];(!CKEDITOR.env.ie||7<CKEDITOR.env.version)&&g.concat([[b.armenian,\"armenian\"],[b.decimalLeadingZero,\"decimal-leading-zero\"],[b.georgian,\"georgian\"],[b.lowerGreek,\"lower-greek\"]]);return{title:b.numberedTitle,minWidth:300,minHeight:50,contents:[{id:\"info\",accessKey:\"I\",elements:[{type:\"hbox\",widths:[\"25%\",\"75%\"],children:[{label:b.start,type:\"text\",id:\"start\",validate:CKEDITOR.dialog.validate.integer(b.validateStartNumber),setup:function(a){a=\na.getFirst(f).getAttribute(\"value\")||a.getAttribute(\"start\")||1;this.setValue(a)},commit:function(a){var b=a.getFirst(f),c=b.getAttribute(\"value\")||a.getAttribute(\"start\")||1;a.getFirst(f).removeAttribute(\"value\");var d=parseInt(this.getValue(),10);isNaN(d)?a.removeAttribute(\"start\"):a.setAttribute(\"start\",d);a=b;b=c;for(d=isNaN(d)?1:d;(a=a.getNext(f))&&b++;)a.getAttribute(\"value\")==b&&a.setAttribute(\"value\",d+b-c)}},{type:\"select\",label:b.type,id:\"type\",style:\"width: 100%;\",items:g,setup:function(a){a=\na.getStyle(\"list-style-type\")||h[a.getAttribute(\"type\")]||a.getAttribute(\"type\")||\"\";this.setValue(a)},commit:function(a){var b=this.getValue();b?a.setStyle(\"list-style-type\",b):a.removeStyle(\"list-style-type\")}}]}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,\"ol\"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,\"ol\"))&&this.commitContent(a)}}}}var f=function(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is(\"li\")},h={a:\"lower-alpha\",A:\"upper-alpha\",i:\"lower-roman\",\nI:\"upper-roman\",1:\"decimal\",disc:\"disc\",circle:\"circle\",square:\"square\"};CKEDITOR.dialog.add(\"numberedListStyle\",function(c){return e(c,\"numberedListStyle\")});CKEDITOR.dialog.add(\"bulletedListStyle\",function(c){return e(c,\"bulletedListStyle\")})})();"
  },
  {
    "path": "assets/ckeditor/plugins/pastefromword/filter/default.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){function C(a){a=a.toUpperCase();for(var c=D.length,b=0,f=0;f<c;++f)for(var d=D[f],e=d[1].length;a.substr(0,e)==d[1];a=a.substr(e))b+=d[0];return b}function E(a){a=a.toUpperCase();for(var c=1,b=1;0<a.length;b*=26)c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".indexOf(a.charAt(a.length-1))*b,a=a.substr(0,a.length-1);return c}var F=CKEDITOR.htmlParser.fragment.prototype,r=CKEDITOR.htmlParser.element.prototype;F.onlyChild=r.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};r.removeAnyChildWithName=\nfunction(a){for(var c=this.children,b=[],f,d=0;d<c.length;d++)f=c[d],f.name&&(f.name==a&&(b.push(f),c.splice(d--,1)),b=b.concat(f.removeAnyChildWithName(a)));return b};r.getAncestor=function(a){for(var c=this.parent;c&&(!c.name||!c.name.match(a));)c=c.parent;return c};F.firstChild=r.firstChild=function(a){for(var c,b=0;b<this.children.length;b++)if(c=this.children[b],a(c)||c.name&&(c=c.firstChild(a)))return c;return null};r.addStyle=function(a,c,b){var f=\"\";if(\"string\"==typeof c)f+=a+\":\"+c+\";\";else{if(\"object\"==\ntypeof a)for(var d in a)a.hasOwnProperty(d)&&(f+=d+\":\"+a[d]+\";\");else f+=a;b=c}this.attributes||(this.attributes={});a=this.attributes.style||\"\";a=(b?[f,a]:[a,f]).join(\";\");this.attributes.style=a.replace(/^;+|;(?=;)/g,\"\")};r.getStyle=function(a){var c=this.attributes.style;if(c)return c=CKEDITOR.tools.parseCssText(c,1),c[a]};CKEDITOR.dtd.parentOf=function(a){var c={},b;for(b in this)-1==b.indexOf(\"$\")&&this[b][a]&&(c[b]=1);return c};var G=/^(?:\\b0[^\\s]*\\s*){1,4}$/,B={ol:{decimal:/\\d+/,\"lower-roman\":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,\n\"upper-roman\":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,\"lower-alpha\":/^[a-z]+$/,\"upper-alpha\":/^[A-Z]+$/},ul:{disc:/[l\\u00B7\\u2002]/,circle:/[\\u006F\\u00D8]/,square:/[\\u006E\\u25C6]/}},D=[[1E3,\"M\"],[900,\"CM\"],[500,\"D\"],[400,\"CD\"],[100,\"C\"],[90,\"XC\"],[50,\"L\"],[40,\"XL\"],[10,\"X\"],[9,\"IX\"],[5,\"V\"],[4,\"IV\"],[1,\"I\"]],w=0,x=null,A,H=CKEDITOR.plugins.pastefromword={utils:{createListBulletMarker:function(a,c){var b=new CKEDITOR.htmlParser.element(\"cke:listbullet\");b.attributes={\"cke:listsymbol\":a[0]};\nb.add(new CKEDITOR.htmlParser.text(c));return b},isListBulletIndicator:function(a){if(/mso-list\\s*:\\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var c;return(c=a.onlyChild())&&/^(:?\\s|&nbsp;)+$/.test(c.value)},resolveList:function(a){var c=a.attributes,b;if((b=a.removeAnyChildWithName(\"cke:listbullet\"))&&b.length&&(b=b[0]))return a.name=\"cke:li\",c.style&&(c.style=H.filters.stylesFilter([[\"text-indent\"],[\"line-height\"],[/^margin(:?-left)?$/,null,function(a){a=\na.split(\" \");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!w&&null!==x&&a>x&&(w=a-x);x=a;c[\"cke:indent\"]=w&&Math.ceil(a/w)+1||1}],[/^mso-list$/,null,function(a){a=a.split(\" \");if(!(2>a.length)){var b=Number(a[0].match(/\\d+/));a=Number(a[1].match(/\\d+/));1==a&&(b!==A&&(c[\"cke:reset\"]=1),A=b);c[\"cke:indent\"]=a}}]])(c.style,a)||\"\"),c[\"cke:indent\"]||(x=0,c[\"cke:indent\"]=1),CKEDITOR.tools.extend(c,b.attributes),!0;A=x=w=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('\\x3cdiv style\\x3d\"position:absolute;left:-9999px;top:-9999px;\"\\x3e\\x3c/div\\x3e',\nCKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);c={};b=f.length;for(var d=0;d<b;d++)c[f[d]]=a.getStyle(f[d]);return c}}(),listDtdParents:CKEDITOR.dtd.parentOf(\"ol\")},filters:{flattenList:function(a,c){c=\"number\"==typeof c?c:1;var b=a.attributes,f;switch(b.type){case \"a\":f=\"lower-alpha\";break;case \"1\":f=\"decimal\"}for(var d=a.children,e,k=0;k<d.length;k++)if(e=d[k],e.name in CKEDITOR.dtd.$listItem){var l=e.attributes,g=e.children,n=g[0],h=g[g.length-1];\nn.attributes&&n.attributes.style&&-1<n.attributes.style.indexOf(\"mso-list\")&&(e.attributes.style=n.attributes.style,n.replaceWithChildren());h.name in CKEDITOR.dtd.$list&&(a.add(h,k+1),--g.length||d.splice(k--,1));e.name=\"cke:li\";b.start&&!k&&(l.value=b.start);H.filters.stylesFilter([[\"tab-stops\",null,function(a){(a=a.match(/0$|\\d+\\.?\\d*\\w+/))&&(x=CKEDITOR.tools.convertToPx(a[0]))}],1==c?[\"mso-list\",null,function(a){a=a.split(\" \");a=Number(a[0].match(/\\d+/));a!==A&&(l[\"cke:reset\"]=1);A=a}]:null])(l.style);\nl[\"cke:indent\"]=c;l[\"cke:listtype\"]=a.name;l[\"cke:list-style-type\"]=f}else if(e.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[e,c+1]);d=d.slice(0,k).concat(e.children).concat(d.slice(k+1));a.children=[];e=0;for(g=d.length;e<g;e++)a.add(d[e]);d=a.children}delete a.name;b[\"cke:list\"]=1},assembleList:function(a){var c=a.children,b,f,d,e,k,l;a=[];for(var g,n,h,p,m,t,q=0;q<c.length;q++)if(b=c[q],\"cke:li\"==b.name)if(b.name=\"li\",f=b.attributes,h=(h=f[\"cke:listsymbol\"])&&h.match(/^(?:[(]?)([^\\s]+?)([.)]?)$/),\np=m=t=null,f[\"cke:ignored\"])c.splice(q--,1);else{f[\"cke:reset\"]&&(l=e=k=null);d=Number(f[\"cke:indent\"]);d!=e&&(n=g=null);if(h){if(n&&B[n][g].test(h[1]))p=n,m=g;else for(var u in B)for(var y in B[u])if(B[u][y].test(h[1]))if(\"ol\"==u&&/alpha|roman/.test(y)){if(g=/roman/.test(y)?C(h[1]):E(h[1]),!t||g<t)t=g,p=u,m=y}else{p=u;m=y;break}!p&&(p=h[2]?\"ol\":\"ul\")}else p=f[\"cke:listtype\"]||\"ol\",m=f[\"cke:list-style-type\"];n=p;g=m||(\"ol\"==p?\"decimal\":\"disc\");m&&m!=(\"ol\"==p?\"decimal\":\"disc\")&&b.addStyle(\"list-style-type\",\nm);if(\"ol\"==p&&h){switch(m){case \"decimal\":t=Number(h[1]);break;case \"lower-roman\":case \"upper-roman\":t=C(h[1]);break;case \"lower-alpha\":case \"upper-alpha\":t=E(h[1])}b.attributes.value=t}if(l){if(d>e)a.push(l=new CKEDITOR.htmlParser.element(p)),l.add(b),k.add(l);else{if(d<e){e-=d;for(var v;e--&&(v=l.parent);)l=v.parent}l.add(b)}c.splice(q--,1)}else a.push(l=new CKEDITOR.htmlParser.element(p)),l.add(b),c[q]=l;k=b;e=d}else l&&(l=e=k=null);for(q=0;q<a.length;q++)if(l=a[q],u=l.children,g=g=void 0,y=l.children.length,\nv=g=void 0,c=/list-style-type:(.*?)(?:;|$)/,e=CKEDITOR.plugins.pastefromword.filters.stylesFilter,g=l.attributes,!c.exec(g.style)){for(k=0;k<y;k++)if(g=u[k],g.attributes.value&&Number(g.attributes.value)==k+1&&delete g.attributes.value,g=c.exec(g.attributes.style))if(g[1]!=v&&v){v=null;break}else v=g[1];if(v){for(k=0;k<y;k++)g=u[k].attributes,g.style&&(g.style=e([[\"list-style-type\"]])(g.style)||\"\");l.addStyle(\"list-style-type\",v)}}A=x=w=null},falsyFilter:function(){return!1},stylesFilter:function(a,\nc){return function(b,f){var d=[];(b||\"\").replace(/&quot;/g,'\"').replace(/\\s*([^ :;]+)\\s*:\\s*([^;]+)\\s*(?=;|$)/g,function(b,e,g){e=e.toLowerCase();\"font-family\"==e&&(g=g.replace(/[\"']/g,\"\"));for(var n,h,p,m=0;m<a.length;m++)if(a[m]&&(b=a[m][0],n=a[m][1],h=a[m][2],p=a[m][3],e.match(b)&&(!n||g.match(n)))){e=p||e;c&&(h=h||g);\"function\"==typeof h&&(h=h(g,f,e));h&&h.push&&(e=h[0],h=h[1]);\"string\"==typeof h&&d.push([e,h]);return}!c&&d.push([e,g])});for(var e=0;e<d.length;e++)d[e]=d[e].join(\":\");return d.length?\nd.join(\";\")+\";\":!1}},elementMigrateFilter:function(a,c){return a?function(b){var f=c?(new CKEDITOR.style(a,c))._.definition:a;b.name=f.element;CKEDITOR.tools.extend(b.attributes,CKEDITOR.tools.clone(f.attributes));b.addStyle(CKEDITOR.style.getStyleText(f));f.attributes&&f.attributes[\"class\"]&&(b.classWhiteList=\" \"+f.attributes[\"class\"]+\" \")}:function(){}},styleMigrateFilter:function(a,c){var b=this.elementMigrateFilter;return a?function(f,d){var e=new CKEDITOR.htmlParser.element(null),k={};k[c]=f;\nb(a,k)(e);e.children=d.children;d.children=[e];e.filter=function(){};e.parent=d}:function(){}},bogusAttrFilter:function(a,c){if(-1==c.name.indexOf(\"cke:\"))return!1},applyStyleFilter:null},getRules:function(a,c){var b=CKEDITOR.dtd,f=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,k=e.falsyFilter,l=e.stylesFilter,g=e.elementMigrateFilter,n=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),h=this.utils.createListBulletMarker,p=e.flattenList,m=\ne.assembleList,t=this.utils.isListBulletIndicator,q=this.utils.isContainingOnlySpaces,u=this.utils.resolveList,y=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+\"px\"},v=this.utils.getStyleComponents,x=this.utils.listDtdParents,r=!1!==d.pasteFromWordRemoveFontStyles,w=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,\"\"]],root:function(a){a.filterChildren(c);m(a)},elements:{\"^\":function(a){var c;CKEDITOR.env.gecko&&(c=e.applyStyleFilter)&&c(a)},$:function(a){var z=\na.name||\"\",e=a.attributes;z in f&&e.style&&(e.style=l([[/^(:?width|height)$/,null,y]])(e.style)||\"\");if(z.match(/h\\d/)){a.filterChildren(c);if(u(a))return;g(d[\"format_\"+z])(a)}else if(z in b.$inline)a.filterChildren(c),q(a)&&delete a.name;else if(-1!=z.indexOf(\":\")&&-1==z.indexOf(\"cke\")){a.filterChildren(c);if(\"v:imagedata\"==z){if(z=a.attributes[\"o:href\"])a.attributes.src=z;a.name=\"img\";return}delete a.name}z in x&&(a.filterChildren(c),m(a))},style:function(a){if(CKEDITOR.env.gecko){a=(a=a.onlyChild().value.match(/\\/\\* Style Definitions \\*\\/([\\s\\S]*?)\\/\\*/))&&\na[1];var c={};a&&(a.replace(/[\\n\\r]/g,\"\").replace(/(.+?)\\{(.+?)\\}/g,function(a,b,I){b=b.split(\",\");a=b.length;for(var d=0;d<a;d++)CKEDITOR.tools.trim(b[d]).replace(/^(\\w+)(\\.[\\w-]+)?$/g,function(a,b,d){b=b||\"*\";d=d.substring(1,d.length);d.match(/MsoNormal/)||(c[b]||(c[b]={}),d?c[b][d]=I:c[b]=I)})}),e.applyStyleFilter=function(a){var b=c[\"*\"]?\"*\":a.name,d=a.attributes&&a.attributes[\"class\"];b in c&&(b=c[b],\"object\"==typeof b&&(b=b[d]),b&&a.addStyle(b,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes[\"class\"])||\na.getStyle(\"mso-list\")&&!a.getStyle(\"mso-list\").match(/^(none|skip)$/i)){var b=a.firstChild(function(a){return a.type==CKEDITOR.NODE_TEXT&&!q(a.parent)});(b=b&&b.parent)&&b.addStyle(\"mso-list\",\"Ignore\")}a.filterChildren(c);u(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element(\"br\"))):g(d[\"format_\"+(d.enterMode==CKEDITOR.ENTER_P?\"p\":\"div\")])(a))},div:function(a){var c=a.onlyChild();if(c&&\"table\"==c.name){var b=a.attributes;c.attributes=CKEDITOR.tools.extend(c.attributes,\nb);b.style&&c.addStyle(b.style);c=new CKEDITOR.htmlParser.element(\"div\");c.addStyle(\"clear\",\"both\");a.add(c);delete a.name}},td:function(a){a.getAncestor(\"thead\")&&(a.name=\"th\")},ol:p,ul:p,dl:p,font:function(a){if(t(a.parent))delete a.name;else{a.filterChildren(c);var b=a.attributes,d=b.style,e=a.parent;\"font\"==e.name?(CKEDITOR.tools.extend(e.attributes,a.attributes),d&&e.addStyle(d),delete a.name):(d=(d||\"\").split(\";\"),b.color&&(\"#000000\"!=b.color&&d.push(\"color:\"+b.color),delete b.color),b.face&&\n(d.push(\"font-family:\"+b.face),delete b.face),b.size&&(d.push(\"font-size:\"+(3<b.size?\"large\":3>b.size?\"small\":\"medium\")),delete b.size),a.name=\"span\",a.addStyle(d.join(\";\")))}},span:function(a){if(t(a.parent))return!1;a.filterChildren(c);if(q(a))return delete a.name,null;if(t(a)){var b=a.firstChild(function(a){return a.value||\"img\"==a.name}),e=(b=b&&(b.value||\"l.\"))&&b.match(/^(?:[(]?)([^\\s]+?)([.)]?)$/);if(e)return b=h(e,b),(a=a.getAncestor(\"span\"))&&/ mso-hide:\\s*all|display:\\s*none /.test(a.attributes.style)&&\n(b.attributes[\"cke:ignored\"]=1),b}if(e=(b=a.attributes)&&b.style)b.style=l([[\"line-height\"],[/^font-family$/,null,r?null:n(d.font_style,\"family\")],[/^font-size$/,null,r?null:n(d.fontSize_style,\"size\")],[/^color$/,null,r?null:n(d.colorButton_foreStyle,\"color\")],[/^background-color$/,null,r?null:n(d.colorButton_backStyle,\"color\")]])(e,a)||\"\";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),\nsup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript),a:function(a){var b=a.attributes;b.name&&b.name.match(/ole_link\\d+/i)?delete a.name:b.href&&b.href.match(/^file:\\/\\/\\/[\\S]+#/i)&&(b.href=b.href.replace(/^file:\\/\\/\\/[^#]+/i,\"\"))},\"cke:listbullet\":function(a){a.getAncestor(/h\\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,\"\"],[/^onload$/,\"\"],[/(?:v|o):\\w+/,\"\"],[/^lang/,\"\"]],attributes:{style:l(w?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,\nnull,function(a,b,c){if(b.name in{p:1,div:1}){b=\"ltr\"==d.contentsLangDirection?\"margin-left\":\"margin-right\";if(\"margin\"==c)a=v(c,a,[b])[b];else if(c!=b)return null;if(a&&!G.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if(\"img\"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if(\"transparent\"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,\n\"transparent\")}],[/^margin$/,G],[\"text-indent\",\"0cm\"],[\"page-break-before\"],[\"tab-stops\"],[\"display\",\"none\"],r?[/font-?/]:null],w),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},\"class\":function(a,b){return b.classWhiteList&&-1!=b.classWhiteList.indexOf(\" \"+a+\" \")?a:!1},bgcolor:k,valign:w?k:function(a,b){b.addStyle(\"vertical-align\",a);return!1}},comment:CKEDITOR.env.ie?k:function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\\[if !supportLists\\]([\\s\\S]*?)\\[endif\\]$/);\nreturn d?(d=(c=d[1]||c&&\"l.\")&&c.match(/>(?:[(]?)([^\\s]+?)([.)]?)</),h(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0],(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['\"](.*?)['\"]/))&&d[1])&&(c.attributes.src=d),c):!1}}}},J=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};J.prototype={toHtml:function(a){a=CKEDITOR.htmlParser.fragment.fromHtml(a);var c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};\nCKEDITOR.cleanWord=function(a,c){a=a.replace(/<!\\[([^\\]]*?)\\]>/g,\"\\x3c!--[$1]--\\x3e\");CKEDITOR.env.gecko&&(a=a.replace(/(\\x3c!--\\[if[^<]*?\\])--\\x3e([\\S\\s]*?)\\x3c!--(\\[endif\\]--\\x3e)/gi,\"$1$2$3\"));CKEDITOR.env.webkit&&(a=a.replace(/(class=\"MsoListParagraph[^>]+>\\x3c!--\\[if !supportLists\\]--\\x3e)([^<]+<span[^<]+<\\/span>)(\\x3c!--\\[endif\\]--\\x3e)/gi,\"$1\\x3cspan\\x3e$2\\x3c/span\\x3e$3\"));var b=new J,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire(\"beforeCleanWord\",{filter:f});\ntry{a=b.toHtml(a)}catch(d){c.showNotification(c.lang.pastefromword.error)}a=a.replace(/cke:.*?\".*?\"/g,\"\");a=a.replace(/style=\"\"/g,\"\");return a=a.replace(/<span>/g,\"\")}})();"
  },
  {
    "path": "assets/ckeditor/plugins/preview/preview.html",
    "content": "<script>\n\n// Prevent from DOM clobbering.\nif ( typeof window.opener._cke_htmlToLoad == 'string' ) {\n\tvar doc = document;\n\tdoc.open();\n\tdoc.write( window.opener._cke_htmlToLoad );\n\tdoc.close();\n\n\tdelete window.opener._cke_htmlToLoad;\n}\n\n</script>\n"
  },
  {
    "path": "assets/ckeditor/plugins/scayt/CHANGELOG.md",
    "content": "SCAYT plugin for CKEditor 4 Changelog\r\n====================\r\n### CKEditor 4.5.6\r\n\r\nNew Features:\r\n* CKEditor [language addon](http://ckeditor.com/addon/language) support\r\n* CKEditor [placeholder addon](http://ckeditor.com/addon/placeholder) support\r\n* Drag and Drop support\r\n* *Experimental* GRAYT functionality http://www.webspellchecker.net/samples/scayt-ckeditor-plugin.html#25\r\n\r\nFixed issues:\r\n* [#98](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/98) SCAYT Affects Dialog Double Click. Fixed in SCAYT Core.\r\n* [#102](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/102) SCAYT Core performance enhancements\r\n* [#104](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/104) SCAYT's spans leak into the clipboard and after pasting\r\n* [#105](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/105) Javascript error fired in case of multiple instances of CKEditor in one page\r\n* [#107](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/107) SCAYT should not check non-editable parts of content\r\n* [#108](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/108) Latest SCAYT copies id of editor element to the iframe\r\n* SCAYT stops working when CKEditor Undo plug-in not enabled\r\n* Issue with pasting SCAYT markup in CKEditor\r\n* [#32](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/32) SCAYT stops working after pressing Cancel button in WSC dialog\r\n"
  },
  {
    "path": "assets/ckeditor/plugins/scayt/LICENSE.md",
    "content": "Software License Agreement\r\n==========================\r\n\r\n**CKEditor SCAYT Plugin**\r\nCopyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.\r\n\r\nLicensed under the terms of any of the following licenses at your choice:\r\n\r\n*   GNU General Public License Version 2 or later (the \"GPL\"):\r\n    http://www.gnu.org/licenses/gpl.html\r\n\r\n*   GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"):\r\n    http://www.gnu.org/licenses/lgpl.html\r\n\r\n*   Mozilla Public License Version 1.1 or later (the \"MPL\"):\r\n    http://www.mozilla.org/MPL/MPL-1.1.html\r\n\r\nYou are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled \"legal.txt\" in your version of this software, indicating your license choice.\r\n\r\nSources of Intellectual Property Included in this plugin\r\n--------------------------------------------------------\r\n\r\nWhere not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.\r\n\r\nTrademarks\r\n----------\r\n\r\nCKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.\r\n"
  },
  {
    "path": "assets/ckeditor/plugins/scayt/README.md",
    "content": "CKEditor SCAYT Plugin\r\n=====================\r\n\r\nThis plugin brings Spell Check As You Type (SCAYT) into up to CKEditor 4+.\r\n\r\nSCAYT is a \"installation-less\", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.\r\n\r\nInstallation\r\n------------\r\n\r\n1. Clone/copy this repository contents in a new \"plugins/scayt\" folder in your CKEditor installation.\r\n2. Enable the \"scayt\" plugin in the CKEditor configuration file (config.js):\r\n\r\n        config.extraPlugins = 'scayt';\r\n\r\nThat's all. SCAYT will appear on the editor toolbar and will be ready to use.\r\n\r\nLicense\r\n-------\r\n\r\nLicensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).\r\n\r\nSee LICENSE.md for more information.\r\n\r\nDeveloped in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).\r\n"
  },
  {
    "path": "assets/ckeditor/plugins/scayt/dialogs/options.js",
    "content": "﻿CKEDITOR.dialog.add(\"scaytDialog\",function(c){var f=c.scayt,q='\\x3cp\\x3e\\x3cimg src\\x3d\"'+f.getLogo()+'\" /\\x3e\\x3c/p\\x3e\\x3cp\\x3e'+f.getLocal(\"version\")+f.getVersion()+\"\\x3c/p\\x3e\\x3cp\\x3e\"+f.getLocal(\"text_copyrights\")+\"\\x3c/p\\x3e\",r=CKEDITOR.document,n={isChanged:function(){return null===this.newLang||this.currentLang===this.newLang?!1:!0},currentLang:f.getLang(),newLang:null,reset:function(){this.currentLang=f.getLang();this.newLang=null},id:\"lang\"},q=[{id:\"options\",label:f.getLocal(\"tab_options\"),\nonShow:function(){},elements:[{type:\"vbox\",id:\"scaytOptions\",children:function(){var a=f.getApplicationConfig(),b=[],g={\"ignore-all-caps-words\":\"label_allCaps\",\"ignore-domain-names\":\"label_ignoreDomainNames\",\"ignore-words-with-mixed-cases\":\"label_mixedCase\",\"ignore-words-with-numbers\":\"label_mixedWithDigits\"},e;for(e in a)a={type:\"checkbox\"},a.id=e,a.label=f.getLocal(g[e]),b.push(a);return b}(),onShow:function(){this.getChild();for(var a=c.scayt,b=0;b<this.getChild().length;b++)this.getChild()[b].setValue(a.getApplicationConfig()[this.getChild()[b].id])}}]},\n{id:\"langs\",label:f.getLocal(\"tab_languages\"),elements:[{id:\"leftLangColumn\",type:\"vbox\",align:\"left\",widths:[\"100\"],children:[{type:\"html\",id:\"langBox\",style:\"overflow: hidden; white-space: normal;margin-bottom:15px;\",html:'\\x3cdiv\\x3e\\x3cdiv style\\x3d\"float:left;width:45%;margin-left:5px;\" id\\x3d\"left-col-'+c.name+'\"\\x3e\\x3c/div\\x3e\\x3cdiv style\\x3d\"float:left;width:45%;margin-left:15px;\" id\\x3d\"right-col-'+c.name+'\"\\x3e\\x3c/div\\x3e\\x3c/div\\x3e',onShow:function(){var a=c.scayt.getLang();r.getById(\"scaytLang_\"+\nc.name+\"_\"+a).$.checked=!0}},{type:\"html\",id:\"graytLanguagesHint\",html:'\\x3cdiv style\\x3d\"margin:5px auto; width:95%;white-space:normal;\" id\\x3d\"'+c.name+'graytLanguagesHint\"\\x3e\\x3cspan style\\x3d\"width:10px;height:10px;display: inline-block; background:#02b620;vertical-align:top;margin-top:2px;\"\\x3e\\x3c/span\\x3e - This languages are supported by Grammar As You Type(GRAYT).\\x3c/div\\x3e',onShow:function(){var a=r.getById(c.name+\"graytLanguagesHint\");c.config.grayt_autoStartup||(a.$.style.display=\"none\")}}]}]},\n{id:\"dictionaries\",label:f.getLocal(\"tab_dictionaries\"),elements:[{type:\"vbox\",id:\"rightCol_col__left\",children:[{type:\"html\",id:\"dictionaryNote\",html:\"\"},{type:\"text\",id:\"dictionaryName\",label:f.getLocal(\"label_fieldNameDic\")||\"Dictionary name\",onShow:function(a){var b=a.sender,g=c.scayt;setTimeout(function(){b.getContentElement(\"dictionaries\",\"dictionaryNote\").getElement().setText(\"\");null!=g.getUserDictionaryName()&&\"\"!=g.getUserDictionaryName()&&b.getContentElement(\"dictionaries\",\"dictionaryName\").setValue(g.getUserDictionaryName())},\n0)}},{type:\"hbox\",id:\"notExistDic\",align:\"left\",style:\"width:auto;\",widths:[\"50%\",\"50%\"],children:[{type:\"button\",id:\"createDic\",label:f.getLocal(\"btn_createDic\"),title:f.getLocal(\"btn_createDic\"),onClick:function(){var a=this.getDialog(),b=p,g=c.scayt,e=a.getContentElement(\"dictionaries\",\"dictionaryName\").getValue();g.createUserDictionary(e,function(d){d.error||b.toggleDictionaryButtons.call(a,!0);d.dialog=a;d.command=\"create\";d.name=e;c.fire(\"scaytUserDictionaryAction\",d)},function(d){d.dialog=\na;d.command=\"create\";d.name=e;c.fire(\"scaytUserDictionaryActionError\",d)})}},{type:\"button\",id:\"restoreDic\",label:f.getLocal(\"btn_restoreDic\"),title:f.getLocal(\"btn_restoreDic\"),onClick:function(){var a=this.getDialog(),b=c.scayt,g=p,e=a.getContentElement(\"dictionaries\",\"dictionaryName\").getValue();b.restoreUserDictionary(e,function(d){d.dialog=a;d.error||g.toggleDictionaryButtons.call(a,!0);d.command=\"restore\";d.name=e;c.fire(\"scaytUserDictionaryAction\",d)},function(d){d.dialog=a;d.command=\"restore\";\nd.name=e;c.fire(\"scaytUserDictionaryActionError\",d)})}}]},{type:\"hbox\",id:\"existDic\",align:\"left\",style:\"width:auto;\",widths:[\"50%\",\"50%\"],children:[{type:\"button\",id:\"removeDic\",label:f.getLocal(\"btn_deleteDic\"),title:f.getLocal(\"btn_deleteDic\"),onClick:function(){var a=this.getDialog(),b=c.scayt,g=p,e=a.getContentElement(\"dictionaries\",\"dictionaryName\"),d=e.getValue();b.removeUserDictionary(d,function(b){e.setValue(\"\");b.error||g.toggleDictionaryButtons.call(a,!1);b.dialog=a;b.command=\"remove\";\nb.name=d;c.fire(\"scaytUserDictionaryAction\",b)},function(b){b.dialog=a;b.command=\"remove\";b.name=d;c.fire(\"scaytUserDictionaryActionError\",b)})}},{type:\"button\",id:\"renameDic\",label:f.getLocal(\"btn_renameDic\"),title:f.getLocal(\"btn_renameDic\"),onClick:function(){var a=this.getDialog(),b=c.scayt,g=a.getContentElement(\"dictionaries\",\"dictionaryName\").getValue();b.renameUserDictionary(g,function(b){b.dialog=a;b.command=\"rename\";b.name=g;c.fire(\"scaytUserDictionaryAction\",b)},function(b){b.dialog=a;b.command=\n\"rename\";b.name=g;c.fire(\"scaytUserDictionaryActionError\",b)})}}]},{type:\"html\",id:\"dicInfo\",html:'\\x3cdiv id\\x3d\"dic_info_editor1\" style\\x3d\"margin:5px auto; width:95%;white-space:normal;\"\\x3e'+f.getLocal(\"text_descriptionDic\")+\"\\x3c/div\\x3e\"}]}]},{id:\"about\",label:f.getLocal(\"tab_about\"),elements:[{type:\"html\",id:\"about\",style:\"margin: 5px 5px;\",html:'\\x3cdiv\\x3e\\x3cdiv id\\x3d\"scayt_about_\"\\x3e'+q+\"\\x3c/div\\x3e\\x3c/div\\x3e\"}]}];c.on(\"scaytUserDictionaryAction\",function(a){var b=SCAYT.prototype.UILib,\ng=a.data.dialog,e=g.getContentElement(\"dictionaries\",\"dictionaryNote\").getElement(),d=a.editor.scayt,c;void 0===a.data.error?(c=d.getLocal(\"message_success_\"+a.data.command+\"Dic\"),c=c.replace(\"%s\",a.data.name),e.setText(c),b.css(e.$,{color:\"blue\"})):(\"\"===a.data.name?e.setText(d.getLocal(\"message_info_emptyDic\")):(c=d.getLocal(\"message_error_\"+a.data.command+\"Dic\"),c=c.replace(\"%s\",a.data.name),e.setText(c)),b.css(e.$,{color:\"red\"}),null!=d.getUserDictionaryName()&&\"\"!=d.getUserDictionaryName()?g.getContentElement(\"dictionaries\",\n\"dictionaryName\").setValue(d.getUserDictionaryName()):g.getContentElement(\"dictionaries\",\"dictionaryName\").setValue(\"\"))});c.on(\"scaytUserDictionaryActionError\",function(a){var b=SCAYT.prototype.UILib,c=a.data.dialog,e=c.getContentElement(\"dictionaries\",\"dictionaryNote\").getElement(),d=a.editor.scayt,f;\"\"===a.data.name?e.setText(d.getLocal(\"message_info_emptyDic\")):(f=d.getLocal(\"message_error_\"+a.data.command+\"Dic\"),f=f.replace(\"%s\",a.data.name),e.setText(f));b.css(e.$,{color:\"red\"});null!=d.getUserDictionaryName()&&\n\"\"!=d.getUserDictionaryName()?c.getContentElement(\"dictionaries\",\"dictionaryName\").setValue(d.getUserDictionaryName()):c.getContentElement(\"dictionaries\",\"dictionaryName\").setValue(\"\")});var p={title:f.getLocal(\"text_title\"),resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:340,minHeight:260,onLoad:function(){if(0!=c.config.scayt_uiTabs[1]){var a=p,b=a.getLangBoxes.call(this);b.getParent().setStyle(\"white-space\",\"normal\");a.renderLangList(b);this.definition.minWidth=this.getSize().width;this.resize(this.definition.minWidth,\nthis.definition.minHeight)}},onCancel:function(){n.reset()},onHide:function(){c.unlockSelection()},onShow:function(){c.fire(\"scaytDialogShown\",this);if(0!=c.config.scayt_uiTabs[2]){var a=c.scayt,b=this.getContentElement(\"dictionaries\",\"dictionaryName\"),g=this.getContentElement(\"dictionaries\",\"existDic\").getElement().getParent(),e=this.getContentElement(\"dictionaries\",\"notExistDic\").getElement().getParent();g.hide();e.hide();null!=a.getUserDictionaryName()&&\"\"!=a.getUserDictionaryName()?(this.getContentElement(\"dictionaries\",\n\"dictionaryName\").setValue(a.getUserDictionaryName()),g.show()):(b.setValue(\"\"),e.show())}},onOk:function(){var a=p,b=c.scayt;this.getContentElement(\"options\",\"scaytOptions\");a=a.getChangedOption.call(this);b.commitOption({changedOptions:a})},toggleDictionaryButtons:function(a){var b=this.getContentElement(\"dictionaries\",\"existDic\").getElement().getParent(),c=this.getContentElement(\"dictionaries\",\"notExistDic\").getElement().getParent();a?(b.show(),c.hide()):(b.hide(),c.show())},getChangedOption:function(){var a=\n{};if(1==c.config.scayt_uiTabs[0])for(var b=this.getContentElement(\"options\",\"scaytOptions\").getChild(),g=0;g<b.length;g++)b[g].isChanged()&&(a[b[g].id]=b[g].getValue());n.isChanged()&&(a[n.id]=c.config.scayt_sLang=n.currentLang=n.newLang);return a},buildRadioInputs:function(a,b,g){var e=new CKEDITOR.dom.element(\"div\"),d=\"scaytLang_\"+c.name+\"_\"+b,f=CKEDITOR.dom.element.createFromHtml('\\x3cinput id\\x3d\"'+d+'\" type\\x3d\"radio\"  value\\x3d\"'+b+'\" name\\x3d\"scayt_lang\" /\\x3e'),m=new CKEDITOR.dom.element(\"label\"),\nk=c.scayt;e.setStyles({\"white-space\":\"normal\",position:\"relative\",\"padding-bottom\":\"2px\"});f.on(\"click\",function(a){n.newLang=a.sender.getValue()});m.appendText(a);m.setAttribute(\"for\",d);g&&c.config.grayt_autoStartup&&m.setStyles({color:\"#02b620\"});e.append(f);e.append(m);b===k.getLang()&&(f.setAttribute(\"checked\",!0),f.setAttribute(\"defaultChecked\",\"defaultChecked\"));return e},renderLangList:function(a){var b=a.find(\"#left-col-\"+c.name).getItem(0);a=a.find(\"#right-col-\"+c.name).getItem(0);var g=\nf.getScaytLangList(),e=f.getGraytLangList(),d={},l=[],m=0,k=!1,h;for(h in g.ltr)d[h]=g.ltr[h];for(h in g.rtl)d[h]=g.rtl[h];for(h in d)l.push([h,d[h]]);l.sort(function(a,b){var c=0;a[1]>b[1]?c=1:a[1]<b[1]&&(c=-1);return c});d={};for(k=0;k<l.length;k++)d[l[k][0]]=l[k][1];l=Math.round(l.length/2);for(h in d)m++,k=h in e.ltr||h in e.rtl,this.buildRadioInputs(d[h],h,k).appendTo(m<=l?b:a)},getLangBoxes:function(){return this.getContentElement(\"langs\",\"langBox\").getElement()},contents:function(a,b){var c=\n[],e=b.config.scayt_uiTabs;if(e){for(var d in e)1==e[d]&&c.push(a[d]);c.push(a[a.length-1])}else return a;return c}(q,c)};return p});"
  },
  {
    "path": "assets/ckeditor/plugins/scayt/dialogs/toolbar.css",
    "content": "a\n{\n\ttext-decoration:none;\n\tpadding: 2px 4px 4px 6px;\n\tdisplay : block;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargin : 0px;\n}\n\na.cke_scayt_toogle:hover,\na.cke_scayt_toogle:focus,\na.cke_scayt_toogle:active\n{\n\tborder-color: #316ac5;\n\tbackground-color: #dff1ff;\n\tcolor : #000;\n\tcursor: pointer;\n\tmargin : 0px;\n}\na.cke_scayt_toogle {\n\tcolor : #316ac5;\n\tborder-color: #fff;\n}\n.scayt_enabled a.cke_scayt_item {\n\tcolor : #316ac5;\n\tborder-color: #fff;\n\tmargin : 0px;\n}\n.scayt_disabled a.cke_scayt_item {\n\tcolor : gray;\n\tborder-color : #fff;\n}\n.scayt_enabled a.cke_scayt_item:hover,\n.scayt_enabled a.cke_scayt_item:focus,\n.scayt_enabled a.cke_scayt_item:active\n{\n\tborder-color: #316ac5;\n\tbackground-color: #dff1ff;\n\tcolor : #000;\n\tcursor: pointer;\n}\n.scayt_disabled a.cke_scayt_item:hover,\n.scayt_disabled a.cke_scayt_item:focus,\n.scayt_disabled a.cke_scayt_item:active\n{\n\tborder-color: gray;\n\tbackground-color: #dff1ff;\n\tcolor : gray;\n\tcursor: no-drop;\n}\n.cke_scayt_set_on, .cke_scayt_set_off\n{\n\tdisplay: none;\n}\n.scayt_enabled .cke_scayt_set_on\n{\n\tdisplay: none;\n}\n.scayt_disabled .cke_scayt_set_on\n{\n\tdisplay: inline;\n}\n.scayt_disabled .cke_scayt_set_off\n{\n\tdisplay: none;\n}\n.scayt_enabled  .cke_scayt_set_off\n{\n\tdisplay: inline;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/smiley/dialogs/smiley.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"smiley\",function(f){for(var e=f.config,a=f.lang.smiley,h=e.smiley_images,g=e.smiley_columns||8,k,m=function(l){var c=l.data.getTarget(),b=c.getName();if(\"a\"==b)c=c.getChild(0);else if(\"img\"!=b)return;var b=c.getAttribute(\"cke_src\"),a=c.getAttribute(\"title\"),c=f.document.createElement(\"img\",{attributes:{src:b,\"data-cke-saved-src\":b,title:a,alt:a,width:c.$.width,height:c.$.height}});f.insertElement(c);k.hide();l.data.preventDefault()},q=CKEDITOR.tools.addFunction(function(a,c){a=\nnew CKEDITOR.dom.event(a);c=new CKEDITOR.dom.element(c);var b;b=a.getKeystroke();var d=\"rtl\"==f.lang.dir;switch(b){case 38:if(b=c.getParent().getParent().getPrevious())b=b.getChild([c.getParent().getIndex(),0]),b.focus();a.preventDefault();break;case 40:(b=c.getParent().getParent().getNext())&&(b=b.getChild([c.getParent().getIndex(),0]))&&b.focus();a.preventDefault();break;case 32:m({data:a});a.preventDefault();break;case d?37:39:if(b=c.getParent().getNext())b=b.getChild(0),b.focus(),a.preventDefault(!0);\nelse if(b=c.getParent().getParent().getNext())(b=b.getChild([0,0]))&&b.focus(),a.preventDefault(!0);break;case d?39:37:if(b=c.getParent().getPrevious())b=b.getChild(0),b.focus(),a.preventDefault(!0);else if(b=c.getParent().getParent().getPrevious())b=b.getLast().getChild(0),b.focus(),a.preventDefault(!0)}}),d=CKEDITOR.tools.getNextId()+\"_smiley_emtions_label\",d=['\\x3cdiv\\x3e\\x3cspan id\\x3d\"'+d+'\" class\\x3d\"cke_voice_label\"\\x3e'+a.options+\"\\x3c/span\\x3e\",'\\x3ctable role\\x3d\"listbox\" aria-labelledby\\x3d\"'+\nd+'\" style\\x3d\"width:100%;height:100%;border-collapse:separate;\" cellspacing\\x3d\"2\" cellpadding\\x3d\"2\"',CKEDITOR.env.ie&&CKEDITOR.env.quirks?' style\\x3d\"position:absolute;\"':\"\",\"\\x3e\\x3ctbody\\x3e\"],n=h.length,a=0;a<n;a++){0===a%g&&d.push('\\x3ctr role\\x3d\"presentation\"\\x3e');var p=\"cke_smile_label_\"+a+\"_\"+CKEDITOR.tools.getNextNumber();d.push('\\x3ctd class\\x3d\"cke_dark_background cke_centered\" style\\x3d\"vertical-align: middle;\" role\\x3d\"presentation\"\\x3e\\x3ca href\\x3d\"javascript:void(0)\" role\\x3d\"option\"',\n' aria-posinset\\x3d\"'+(a+1)+'\"',' aria-setsize\\x3d\"'+n+'\"',' aria-labelledby\\x3d\"'+p+'\"',' class\\x3d\"cke_smile cke_hand\" tabindex\\x3d\"-1\" onkeydown\\x3d\"CKEDITOR.tools.callFunction( ',q,', event, this );\"\\x3e','\\x3cimg class\\x3d\"cke_hand\" title\\x3d\"',e.smiley_descriptions[a],'\" cke_src\\x3d\"',CKEDITOR.tools.htmlEncode(e.smiley_path+h[a]),'\" alt\\x3d\"',e.smiley_descriptions[a],'\"',' src\\x3d\"',CKEDITOR.tools.htmlEncode(e.smiley_path+h[a]),'\"',CKEDITOR.env.ie?\" onload\\x3d\\\"this.setAttribute('width', 2); this.removeAttribute('width');\\\" \":\n\"\",'\\x3e\\x3cspan id\\x3d\"'+p+'\" class\\x3d\"cke_voice_label\"\\x3e'+e.smiley_descriptions[a]+\"\\x3c/span\\x3e\\x3c/a\\x3e\",\"\\x3c/td\\x3e\");a%g==g-1&&d.push(\"\\x3c/tr\\x3e\")}if(a<g-1){for(;a<g-1;a++)d.push(\"\\x3ctd\\x3e\\x3c/td\\x3e\");d.push(\"\\x3c/tr\\x3e\")}d.push(\"\\x3c/tbody\\x3e\\x3c/table\\x3e\\x3c/div\\x3e\");e={type:\"html\",id:\"smileySelector\",html:d.join(\"\"),onLoad:function(a){k=a.sender},focus:function(){var a=this;setTimeout(function(){a.getElement().getElementsByTag(\"a\").getItem(0).focus()},0)},onClick:m,style:\"width: 100%; border-collapse: separate;\"};\nreturn{title:f.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:\"tab1\",label:\"\",title:\"\",expand:!0,padding:0,elements:[e]}],buttons:[CKEDITOR.dialog.cancelButton]}});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt",
    "content": "Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n\ncs.js      Found: 118 Missing: 0\ncy.js      Found: 118 Missing: 0\nde.js      Found: 118 Missing: 0\nel.js      Found: 16 Missing: 102\neo.js      Found: 118 Missing: 0\net.js      Found: 31 Missing: 87\nfa.js      Found: 24 Missing: 94\nfi.js      Found: 23 Missing: 95\nfr.js      Found: 118 Missing: 0\nhr.js      Found: 23 Missing: 95\nit.js      Found: 118 Missing: 0\nnb.js      Found: 118 Missing: 0\nnl.js      Found: 118 Missing: 0\nno.js      Found: 118 Missing: 0\ntr.js      Found: 118 Missing: 0\nug.js      Found: 39 Missing: 79\nzh-cn.js   Found: 118 Missing: 0\n"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/af.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"af\",{euro:\"Euroteken\",lsquo:\"Linker enkelkwotasie\",rsquo:\"Regter enkelkwotasie\",ldquo:\"Linker dubbelkwotasie\",rdquo:\"Regter dubbelkwotasie\",ndash:\"Kortkoppelteken\",mdash:\"Langkoppelteken\",iexcl:\"Omgekeerdeuitroepteken\",cent:\"Centteken\",pound:\"Pondteken\",curren:\"Geldeenheidteken\",yen:\"Yenteken\",brvbar:\"Gebreekte balk\",sect:\"Afdeelingsteken\",uml:\"Deelteken\",copy:\"Kopieregteken\",ordf:\"Vroulikekenteken\",laquo:\"Linkgeoorienteerde aanhaalingsteken\",not:\"Verbodeteken\",\nreg:\"Regestrasieteken\",macr:\"Lengteteken\",deg:\"Gradeteken\",sup2:\"Kwadraatteken\",sup3:\"Kubiekteken\",acute:\"Akuutaksentteken\",micro:\"Mikroteken\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ar.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ar\",{euro:\"رمز اليورو\",lsquo:\"علامة تنصيص فردية علي اليسار\",rsquo:\"علامة تنصيص فردية علي اليمين\",ldquo:\"علامة تنصيص مزدوجة علي اليسار\",rdquo:\"علامة تنصيص مزدوجة علي اليمين\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"علامة تعجب مقلوبة\",cent:\"رمز السنت\",pound:\"رمز الاسترليني\",curren:\"رمز العملة\",yen:\"رمز الين\",brvbar:\"شريط مقطوع\",sect:\"رمز القسم\",uml:\"Diaeresis\",copy:\"علامة حقوق الطبع\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"ليست علامة\",reg:\"علامة مسجّلة\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"علامة الإستفهام غير صحيحة\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/bg.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"bg\",{euro:\"Евро знак\",lsquo:\"Лява маркировка за цитат\",rsquo:\"Дясна маркировка за цитат\",ldquo:\"Лява двойна кавичка за цитат\",rdquo:\"Дясна двойна кавичка за цитат\",ndash:\"\\\\\\\\\",mdash:\"/\",iexcl:\"Обърната питанка\",cent:\"Знак за цент\",pound:\"Знак за паунд\",curren:\"Валутен знак\",yen:\"Знак за йена\",brvbar:\"Прекъсната линия\",sect:\"Знак за секция\",uml:\"Diaeresis\",copy:\"Знак за Copyright\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Registered sign\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ca.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ca\",{euro:\"Símbol d'euro\",lsquo:\"Signe de cometa simple esquerra\",rsquo:\"Signe de cometa simple dreta\",ldquo:\"Signe de cometa doble esquerra\",rdquo:\"Signe de cometa doble dreta\",ndash:\"Guió\",mdash:\"Guió baix\",iexcl:\"Signe d'exclamació inversa\",cent:\"Símbol de percentatge\",pound:\"Símbol de lliura\",curren:\"Símbol de moneda\",yen:\"Símbol de Yen\",brvbar:\"Barra trencada\",sect:\"Símbol de secció\",uml:\"Dièresi\",copy:\"Símbol de Copyright\",ordf:\"Indicador ordinal femení\",\nlaquo:\"Signe de cometes angulars esquerra\",not:\"Símbol de negació\",reg:\"Símbol registrat\",macr:\"Macron\",deg:\"Símbol de grau\",sup2:\"Superíndex dos\",sup3:\"Superíndex tres\",acute:\"Accent agut\",micro:\"Símbol de micro\",para:\"Símbol de calderó\",middot:\"Punt volat\",cedil:\"Ce trencada\",sup1:\"Superíndex u\",ordm:\"Indicador ordinal masculí\",raquo:\"Signe de cometes angulars dreta\",frac14:\"Fracció vulgar un quart\",frac12:\"Fracció vulgar una meitat\",frac34:\"Fracció vulgar tres quarts\",iquest:\"Símbol d'interrogació invertit\",\nAgrave:\"Lletra majúscula llatina A amb accent greu\",Aacute:\"Lletra majúscula llatina A amb accent agut\",Acirc:\"Lletra majúscula llatina A amb circumflex\",Atilde:\"Lletra majúscula llatina A amb titlla\",Auml:\"Lletra majúscula llatina A amb dièresi\",Aring:\"Lletra majúscula llatina A amb anell superior\",AElig:\"Lletra majúscula llatina Æ\",Ccedil:\"Lletra majúscula llatina C amb ce trencada\",Egrave:\"Lletra majúscula llatina E amb accent greu\",Eacute:\"Lletra majúscula llatina E amb accent agut\",Ecirc:\"Lletra majúscula llatina E amb circumflex\",\nEuml:\"Lletra majúscula llatina E amb dièresi\",Igrave:\"Lletra majúscula llatina I amb accent greu\",Iacute:\"Lletra majúscula llatina I amb accent agut\",Icirc:\"Lletra majúscula llatina I amb circumflex\",Iuml:\"Lletra majúscula llatina I amb dièresi\",ETH:\"Lletra majúscula llatina Eth\",Ntilde:\"Lletra majúscula llatina N amb titlla\",Ograve:\"Lletra majúscula llatina O amb accent greu\",Oacute:\"Lletra majúscula llatina O amb accent agut\",Ocirc:\"Lletra majúscula llatina O amb circumflex\",Otilde:\"Lletra majúscula llatina O amb titlla\",\nOuml:\"Lletra majúscula llatina O amb dièresi\",times:\"Símbol de multiplicació\",Oslash:\"Lletra majúscula llatina O amb barra\",Ugrave:\"Lletra majúscula llatina U amb accent greu\",Uacute:\"Lletra majúscula llatina U amb accent agut\",Ucirc:\"Lletra majúscula llatina U amb circumflex\",Uuml:\"Lletra majúscula llatina U amb dièresi\",Yacute:\"Lletra majúscula llatina Y amb accent agut\",THORN:\"Lletra majúscula llatina Thorn\",szlig:\"Lletra minúscula llatina sharp s\",agrave:\"Lletra minúscula llatina a amb accent greu\",\naacute:\"Lletra minúscula llatina a amb accent agut\",acirc:\"Lletra minúscula llatina a amb circumflex\",atilde:\"Lletra minúscula llatina a amb titlla\",auml:\"Lletra minúscula llatina a amb dièresi\",aring:\"Lletra minúscula llatina a amb anell superior\",aelig:\"Lletra minúscula llatina æ\",ccedil:\"Lletra minúscula llatina c amb ce trencada\",egrave:\"Lletra minúscula llatina e amb accent greu\",eacute:\"Lletra minúscula llatina e amb accent agut\",ecirc:\"Lletra minúscula llatina e amb circumflex\",euml:\"Lletra minúscula llatina e amb dièresi\",\nigrave:\"Lletra minúscula llatina i amb accent greu\",iacute:\"Lletra minúscula llatina i amb accent agut\",icirc:\"Lletra minúscula llatina i amb circumflex\",iuml:\"Lletra minúscula llatina i amb dièresi\",eth:\"Lletra minúscula llatina eth\",ntilde:\"Lletra minúscula llatina n amb titlla\",ograve:\"Lletra minúscula llatina o amb accent greu\",oacute:\"Lletra minúscula llatina o amb accent agut\",ocirc:\"Lletra minúscula llatina o amb circumflex\",otilde:\"Lletra minúscula llatina o amb titlla\",ouml:\"Lletra minúscula llatina o amb dièresi\",\ndivide:\"Símbol de divisió\",oslash:\"Lletra minúscula llatina o amb barra\",ugrave:\"Lletra minúscula llatina u amb accent greu\",uacute:\"Lletra minúscula llatina u amb accent agut\",ucirc:\"Lletra minúscula llatina u amb circumflex\",uuml:\"Lletra minúscula llatina u amb dièresi\",yacute:\"Lletra minúscula llatina y amb accent agut\",thorn:\"Lletra minúscula llatina thorn\",yuml:\"Lletra minúscula llatina y amb dièresi\",OElig:\"Lligadura majúscula llatina OE\",oelig:\"Lligadura minúscula llatina oe\",372:\"Lletra majúscula llatina W amb circumflex\",\n374:\"Lletra majúscula llatina Y amb circumflex\",373:\"Lletra minúscula llatina w amb circumflex\",375:\"Lletra minúscula llatina y amb circumflex\",sbquo:\"Signe de cita simple baixa-9\",8219:\"Signe de cita simple alta-invertida-9\",bdquo:\"Signe de cita doble baixa-9\",hellip:\"Punts suspensius\",trade:\"Símbol de marca registrada\",9658:\"Punter negre apuntant cap a la dreta\",bull:\"Vinyeta\",rarr:\"Fletxa cap a la dreta\",rArr:\"Doble fletxa cap a la dreta\",hArr:\"Doble fletxa esquerra dreta\",diams:\"Vestit negre diamant\",\nasymp:\"Gairebé igual a\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/cs.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"cs\",{euro:\"Znak eura\",lsquo:\"Počáteční uvozovka jednoduchá\",rsquo:\"Koncová uvozovka jednoduchá\",ldquo:\"Počáteční uvozovka dvojitá\",rdquo:\"Koncová uvozovka dvojitá\",ndash:\"En pomlčka\",mdash:\"Em pomlčka\",iexcl:\"Obrácený vykřičník\",cent:\"Znak centu\",pound:\"Znak libry\",curren:\"Znak měny\",yen:\"Znak jenu\",brvbar:\"Přerušená svislá čára\",sect:\"Znak oddílu\",uml:\"Přehláska\",copy:\"Znak copyrightu\",ordf:\"Ženský indikátor rodu\",laquo:\"Znak dvojitých lomených uvozovek vlevo\",\nnot:\"Logistický zápor\",reg:\"Znak registrace\",macr:\"Pomlčka nad\",deg:\"Znak stupně\",sup2:\"Dvojka jako horní index\",sup3:\"Trojka jako horní index\",acute:\"Čárka nad vpravo\",micro:\"Znak mikro\",para:\"Znak odstavce\",middot:\"Tečka uprostřed\",cedil:\"Ocásek vlevo\",sup1:\"Jednička jako horní index\",ordm:\"Mužský indikátor rodu\",raquo:\"Znak dvojitých lomených uvozovek vpravo\",frac14:\"Obyčejný zlomek jedna čtvrtina\",frac12:\"Obyčejný zlomek jedna polovina\",frac34:\"Obyčejný zlomek tři čtvrtiny\",iquest:\"Znak obráceného otazníku\",\nAgrave:\"Velké písmeno latinky A s čárkou nad vlevo\",Aacute:\"Velké písmeno latinky A s čárkou nad vpravo\",Acirc:\"Velké písmeno latinky A s vokáněm\",Atilde:\"Velké písmeno latinky A s tildou\",Auml:\"Velké písmeno latinky A s dvěma tečkami\",Aring:\"Velké písmeno latinky A s kroužkem nad\",AElig:\"Velké písmeno latinky Ae\",Ccedil:\"Velké písmeno latinky C s ocáskem vlevo\",Egrave:\"Velké písmeno latinky E s čárkou nad vlevo\",Eacute:\"Velké písmeno latinky E s čárkou nad vpravo\",Ecirc:\"Velké písmeno latinky E s vokáněm\",\nEuml:\"Velké písmeno latinky E s dvěma tečkami\",Igrave:\"Velké písmeno latinky I s čárkou nad vlevo\",Iacute:\"Velké písmeno latinky I s čárkou nad vpravo\",Icirc:\"Velké písmeno latinky I s vokáněm\",Iuml:\"Velké písmeno latinky I s dvěma tečkami\",ETH:\"Velké písmeno latinky Eth\",Ntilde:\"Velké písmeno latinky N s tildou\",Ograve:\"Velké písmeno latinky O s čárkou nad vlevo\",Oacute:\"Velké písmeno latinky O s čárkou nad vpravo\",Ocirc:\"Velké písmeno latinky O s vokáněm\",Otilde:\"Velké písmeno latinky O s tildou\",\nOuml:\"Velké písmeno latinky O s dvěma tečkami\",times:\"Znak násobení\",Oslash:\"Velké písmeno latinky O přeškrtnuté\",Ugrave:\"Velké písmeno latinky U s čárkou nad vlevo\",Uacute:\"Velké písmeno latinky U s čárkou nad vpravo\",Ucirc:\"Velké písmeno latinky U s vokáněm\",Uuml:\"Velké písmeno latinky U s dvěma tečkami\",Yacute:\"Velké písmeno latinky Y s čárkou nad vpravo\",THORN:\"Velké písmeno latinky Thorn\",szlig:\"Malé písmeno latinky ostré s\",agrave:\"Malé písmeno latinky a s čárkou nad vlevo\",aacute:\"Malé písmeno latinky a s čárkou nad vpravo\",\nacirc:\"Malé písmeno latinky a s vokáněm\",atilde:\"Malé písmeno latinky a s tildou\",auml:\"Malé písmeno latinky a s dvěma tečkami\",aring:\"Malé písmeno latinky a s kroužkem nad\",aelig:\"Malé písmeno latinky ae\",ccedil:\"Malé písmeno latinky c s ocáskem vlevo\",egrave:\"Malé písmeno latinky e s čárkou nad vlevo\",eacute:\"Malé písmeno latinky e s čárkou nad vpravo\",ecirc:\"Malé písmeno latinky e s vokáněm\",euml:\"Malé písmeno latinky e s dvěma tečkami\",igrave:\"Malé písmeno latinky i s čárkou nad vlevo\",iacute:\"Malé písmeno latinky i s čárkou nad vpravo\",\nicirc:\"Malé písmeno latinky i s vokáněm\",iuml:\"Malé písmeno latinky i s dvěma tečkami\",eth:\"Malé písmeno latinky eth\",ntilde:\"Malé písmeno latinky n s tildou\",ograve:\"Malé písmeno latinky o s čárkou nad vlevo\",oacute:\"Malé písmeno latinky o s čárkou nad vpravo\",ocirc:\"Malé písmeno latinky o s vokáněm\",otilde:\"Malé písmeno latinky o s tildou\",ouml:\"Malé písmeno latinky o s dvěma tečkami\",divide:\"Znak dělení\",oslash:\"Malé písmeno latinky o přeškrtnuté\",ugrave:\"Malé písmeno latinky u s čárkou nad vlevo\",\nuacute:\"Malé písmeno latinky u s čárkou nad vpravo\",ucirc:\"Malé písmeno latinky u s vokáněm\",uuml:\"Malé písmeno latinky u s dvěma tečkami\",yacute:\"Malé písmeno latinky y s čárkou nad vpravo\",thorn:\"Malé písmeno latinky thorn\",yuml:\"Malé písmeno latinky y s dvěma tečkami\",OElig:\"Velká ligatura latinky OE\",oelig:\"Malá ligatura latinky OE\",372:\"Velké písmeno latinky W s vokáněm\",374:\"Velké písmeno latinky Y s vokáněm\",373:\"Malé písmeno latinky w s vokáněm\",375:\"Malé písmeno latinky y s vokáněm\",sbquo:\"Dolní 9 uvozovka jednoduchá\",\n8219:\"Horní obrácená 9 uvozovka jednoduchá\",bdquo:\"Dolní 9 uvozovka dvojitá\",hellip:\"Trojtečkový úvod\",trade:\"Obchodní značka\",9658:\"Černý ukazatel směřující vpravo\",bull:\"Kolečko\",rarr:\"Šipka vpravo\",rArr:\"Dvojitá šipka vpravo\",hArr:\"Dvojitá šipka vlevo a vpravo\",diams:\"Černé piky\",asymp:\"Téměř se rovná\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/cy.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"cy\",{euro:\"Arwydd yr Ewro\",lsquo:\"Dyfynnod chwith unigol\",rsquo:\"Dyfynnod dde unigol\",ldquo:\"Dyfynnod chwith dwbl\",rdquo:\"Dyfynnod dde dwbl\",ndash:\"Cysylltnod en\",mdash:\"Cysylltnod em\",iexcl:\"Ebychnod gwrthdro\",cent:\"Arwydd sent\",pound:\"Arwydd punt\",curren:\"Arwydd arian cyfred\",yen:\"Arwydd yen\",brvbar:\"Bar toriedig\",sect:\"Arwydd adran\",uml:\"Didolnod\",copy:\"Arwydd hawlfraint\",ordf:\"Dangosydd benywaidd\",laquo:\"Dyfynnod dwbl ar ongl i'r chwith\",not:\"Arwydd Nid\",\nreg:\"Arwydd cofrestredig\",macr:\"Macron\",deg:\"Arwydd gradd\",sup2:\"Dau uwchsgript\",sup3:\"Tri uwchsgript\",acute:\"Acen ddyrchafedig\",micro:\"Arwydd micro\",para:\"Arwydd pilcrow\",middot:\"Dot canol\",cedil:\"Sedila\",sup1:\"Un uwchsgript\",ordm:\"Dangosydd gwrywaidd\",raquo:\"Dyfynnod dwbl ar ongl i'r dde\",frac14:\"Ffracsiwn cyffredin un cwarter\",frac12:\"Ffracsiwn cyffredin un hanner\",frac34:\"Ffracsiwn cyffredin tri chwarter\",iquest:\"Marc cwestiwn gwrthdroëdig\",Agrave:\"Priflythyren A Lladinaidd gydag acen ddisgynedig\",\nAacute:\"Priflythyren A Lladinaidd gydag acen ddyrchafedig\",Acirc:\"Priflythyren A Lladinaidd gydag acen grom\",Atilde:\"Priflythyren A Lladinaidd gyda thild\",Auml:\"Priflythyren A Lladinaidd gyda didolnod\",Aring:\"Priflythyren A Lladinaidd gyda chylch uwchben\",AElig:\"Priflythyren Æ Lladinaidd\",Ccedil:\"Priflythyren C Lladinaidd gyda sedila\",Egrave:\"Priflythyren E Lladinaidd gydag acen ddisgynedig\",Eacute:\"Priflythyren E Lladinaidd gydag acen ddyrchafedig\",Ecirc:\"Priflythyren E Lladinaidd gydag acen grom\",\nEuml:\"Priflythyren E Lladinaidd gyda didolnod\",Igrave:\"Priflythyren I Lladinaidd gydag acen ddisgynedig\",Iacute:\"Priflythyren I Lladinaidd gydag acen ddyrchafedig\",Icirc:\"Priflythyren I Lladinaidd gydag acen grom\",Iuml:\"Priflythyren I Lladinaidd gyda didolnod\",ETH:\"Priflythyren Eth\",Ntilde:\"Priflythyren N Lladinaidd gyda thild\",Ograve:\"Priflythyren O Lladinaidd gydag acen ddisgynedig\",Oacute:\"Priflythyren O Lladinaidd gydag acen ddyrchafedig\",Ocirc:\"Priflythyren O Lladinaidd gydag acen grom\",Otilde:\"Priflythyren O Lladinaidd gyda thild\",\nOuml:\"Priflythyren O Lladinaidd gyda didolnod\",times:\"Arwydd lluosi\",Oslash:\"Priflythyren O Lladinaidd gyda strôc\",Ugrave:\"Priflythyren U Lladinaidd gydag acen ddisgynedig\",Uacute:\"Priflythyren U Lladinaidd gydag acen ddyrchafedig\",Ucirc:\"Priflythyren U Lladinaidd gydag acen grom\",Uuml:\"Priflythyren U Lladinaidd gyda didolnod\",Yacute:\"Priflythyren Y Lladinaidd gydag acen ddyrchafedig\",THORN:\"Priflythyren Thorn\",szlig:\"Llythyren s fach Lladinaidd siarp \",agrave:\"Llythyren a fach Lladinaidd gydag acen ddisgynedig\",\naacute:\"Llythyren a fach Lladinaidd gydag acen ddyrchafedig\",acirc:\"Llythyren a fach Lladinaidd gydag acen grom\",atilde:\"Llythyren a fach Lladinaidd gyda thild\",auml:\"Llythyren a fach Lladinaidd gyda didolnod\",aring:\"Llythyren a fach Lladinaidd gyda chylch uwchben\",aelig:\"Llythyren æ fach Lladinaidd\",ccedil:\"Llythyren c fach Lladinaidd gyda sedila\",egrave:\"Llythyren e fach Lladinaidd gydag acen ddisgynedig\",eacute:\"Llythyren e fach Lladinaidd gydag acen ddyrchafedig\",ecirc:\"Llythyren e fach Lladinaidd gydag acen grom\",\neuml:\"Llythyren e fach Lladinaidd gyda didolnod\",igrave:\"Llythyren i fach Lladinaidd gydag acen ddisgynedig\",iacute:\"Llythyren i fach Lladinaidd gydag acen ddyrchafedig\",icirc:\"Llythyren i fach Lladinaidd gydag acen grom\",iuml:\"Llythyren i fach Lladinaidd gyda didolnod\",eth:\"Llythyren eth fach\",ntilde:\"Llythyren n fach Lladinaidd gyda thild\",ograve:\"Llythyren o fach Lladinaidd gydag acen ddisgynedig\",oacute:\"Llythyren o fach Lladinaidd gydag acen ddyrchafedig\",ocirc:\"Llythyren o fach Lladinaidd gydag acen grom\",\notilde:\"Llythyren o fach Lladinaidd gyda thild\",ouml:\"Llythyren o fach Lladinaidd gyda didolnod\",divide:\"Arwydd rhannu\",oslash:\"Llythyren o fach Lladinaidd gyda strôc\",ugrave:\"Llythyren u fach Lladinaidd gydag acen ddisgynedig\",uacute:\"Llythyren u fach Lladinaidd gydag acen ddyrchafedig\",ucirc:\"Llythyren u fach Lladinaidd gydag acen grom\",uuml:\"Llythyren u fach Lladinaidd gyda didolnod\",yacute:\"Llythyren y fach Lladinaidd gydag acen ddisgynedig\",thorn:\"Llythyren o fach Lladinaidd gyda strôc\",yuml:\"Llythyren y fach Lladinaidd gyda didolnod\",\nOElig:\"Priflythyren cwlwm OE Lladinaidd \",oelig:\"Priflythyren cwlwm oe Lladinaidd \",372:\"Priflythyren W gydag acen grom\",374:\"Priflythyren Y gydag acen grom\",373:\"Llythyren w fach gydag acen grom\",375:\"Llythyren y fach gydag acen grom\",sbquo:\"Dyfynnod sengl 9-isel\",8219:\"Dyfynnod sengl 9-uchel cildro\",bdquo:\"Dyfynnod dwbl 9-isel\",hellip:\"Coll geiriau llorweddol\",trade:\"Arwydd marc masnachol\",9658:\"Pwyntydd du i'r dde\",bull:\"Bwled\",rarr:\"Saeth i'r dde\",rArr:\"Saeth ddwbl i'r dde\",hArr:\"Saeth ddwbl i'r chwith\",\ndiams:\"Siwt diemwnt du\",asymp:\"Bron yn hafal iddo\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/da.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"da\",{euro:\"Euro-tegn\",lsquo:\"Venstre enkelt anførselstegn\",rsquo:\"Højre enkelt anførselstegn\",ldquo:\"Venstre dobbelt anførselstegn\",rdquo:\"Højre dobbelt anførselstegn\",ndash:\"Bindestreg\",mdash:\"Tankestreg\",iexcl:\"Omvendt udråbstegn\",cent:\"Cent-tegn\",pound:\"Pund-tegn\",curren:\"Kurs-tegn\",yen:\"Yen-tegn\",brvbar:\"Brudt streg\",sect:\"Paragraftegn\",uml:\"Umlaut\",copy:\"Copyright-tegn\",ordf:\"Feminin ordinal indikator\",laquo:\"Venstre dobbel citations-vinkel\",not:\"Negation\",\nreg:\"Registreret varemærke tegn\",macr:\"Macron\",deg:\"Grad-tegn\",sup2:\"Superscript to\",sup3:\"Superscript tre\",acute:\"Prim-tegn\",micro:\"Mikro-tegn\",para:\"Pilcrow-tegn\",middot:\"Punkt-tegn\",cedil:\"Cedille\",sup1:\"Superscript et\",ordm:\"Maskulin ordinal indikator\",raquo:\"Højre dobbel citations-vinkel\",frac14:\"En fjerdedel\",frac12:\"En halv\",frac34:\"En tredjedel\",iquest:\"Omvendt udråbstegn\",Agrave:\"Stort A med accent grave\",Aacute:\"Stort A med accent aigu\",Acirc:\"Stort A med cirkumfleks\",Atilde:\"Stort A med tilde\",\nAuml:\"Stort A med umlaut\",Aring:\"Stort Å\",AElig:\"Stort Æ\",Ccedil:\"Stort C med cedille\",Egrave:\"Stort E med accent grave\",Eacute:\"Stort E med accent aigu\",Ecirc:\"Stort E med cirkumfleks\",Euml:\"Stort E med umlaut\",Igrave:\"Stort I med accent grave\",Iacute:\"Stort I med accent aigu\",Icirc:\"Stort I med cirkumfleks\",Iuml:\"Stort I med umlaut\",ETH:\"Stort Ð (edd)\",Ntilde:\"Stort N med tilde\",Ograve:\"Stort O med accent grave\",Oacute:\"Stort O med accent aigu\",Ocirc:\"Stort O med cirkumfleks\",Otilde:\"Stort O med tilde\",\nOuml:\"Stort O med umlaut\",times:\"Gange-tegn\",Oslash:\"Stort Ø\",Ugrave:\"Stort U med accent grave\",Uacute:\"Stort U med accent aigu\",Ucirc:\"Stort U med cirkumfleks\",Uuml:\"Stort U med umlaut\",Yacute:\"Stort Y med accent aigu\",THORN:\"Stort Thorn\",szlig:\"Lille eszett\",agrave:\"Lille a med accent grave\",aacute:\"Lille a med accent aigu\",acirc:\"Lille a med cirkumfleks\",atilde:\"Lille a med tilde\",auml:\"Lille a med umlaut\",aring:\"Lilla å\",aelig:\"Lille æ\",ccedil:\"Lille c med cedille\",egrave:\"Lille e med accent grave\",\neacute:\"Lille e med accent aigu\",ecirc:\"Lille e med cirkumfleks\",euml:\"Lille e med umlaut\",igrave:\"Lille i med accent grave\",iacute:\"Lille i med accent aigu\",icirc:\"Lille i med cirkumfleks\",iuml:\"Lille i med umlaut\",eth:\"Lille ð (edd)\",ntilde:\"Lille n med tilde\",ograve:\"Lille o med accent grave\",oacute:\"Lille o med accent aigu\",ocirc:\"Lille o med cirkumfleks\",otilde:\"Lille o med tilde\",ouml:\"Lille o med umlaut\",divide:\"Divisions-tegn\",oslash:\"Lille ø\",ugrave:\"Lille u med accent grave\",uacute:\"Lille u med accent aigu\",\nucirc:\"Lille u med cirkumfleks\",uuml:\"Lille u med umlaut\",yacute:\"Lille y med accent aigu\",thorn:\"Lille thorn\",yuml:\"Lille y med umlaut\",OElig:\"Stort Æ\",oelig:\"Lille æ\",372:\"Stort W med cirkumfleks\",374:\"Stort Y med cirkumfleks\",373:\"Lille w med cirkumfleks\",375:\"Lille y med cirkumfleks\",sbquo:\"Lavt enkelt 9-komma citationstegn\",8219:\"Højt enkelt 9-komma citationstegn\",bdquo:\"Dobbelt 9-komma citationstegn\",hellip:\"Tre horizontale prikker\",trade:\"Varemærke-tegn\",9658:\"Sort højre pil\",bull:\"Punkt\",\nrarr:\"Højre pil\",rArr:\"Højre dobbelt pil\",hArr:\"Venstre højre dobbelt pil\",diams:\"Sort diamant\",asymp:\"Næsten lig med\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/de-ch.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"de-ch\",{euro:\"Euro Zeichen\",lsquo:\"Hochkomma links\",rsquo:\"Hochkomma rechts\",ldquo:\"Anführungszeichen links\",rdquo:\"Anführungszeichen rechts\",ndash:\"Kleiner Strich\",mdash:\"Mittlerer Strich\",iexcl:\"Invertiertes Ausrufezeichen\",cent:\"Cent-Zeichen\",pound:\"Pfund-Zeichen\",curren:\"Währungszeichen\",yen:\"Yen\",brvbar:\"Gestrichelte Linie\",sect:\"Paragrafenzeichen\",uml:\"Diäresis\",copy:\"Copyright-Zeichen\",ordf:\"Feminine ordinal Anzeige\",laquo:\"Nach links zeigenden Doppel-Winkel Anführungszeichen\",\nnot:\"Not-Zeichen\",reg:\"Registriert-Zeichen\",macr:\"Längezeichen\",deg:\"Grad-Zeichen\",sup2:\"Hoch 2\",sup3:\"Hoch 3\",acute:\"Akzentzeichen \",micro:\"Mikro-Zeichen\",para:\"Pilcrow-Zeichen\",middot:\"Mittelpunkt\",cedil:\"Cedilla\",sup1:\"Hoch 1\",ordm:\"Männliche Ordnungszahl Anzeige\",raquo:\"Nach rechts zeigenden Doppel-Winkel Anführungszeichen\",frac14:\"ein Viertel\",frac12:\"Hälfte\",frac34:\"Dreiviertel\",iquest:\"Umgekehrtes Fragezeichen\",Agrave:\"Lateinischer Buchstabe A mit AkzentGrave\",Aacute:\"Lateinischer Buchstabe A mit Akutakzent\",\nAcirc:\"Lateinischer Buchstabe A mit Zirkumflex\",Atilde:\"Lateinischer Buchstabe A mit Tilde\",Auml:\"Lateinischer Buchstabe A mit Trema\",Aring:\"Lateinischer Buchstabe A mit Ring oben\",AElig:\"Lateinischer Buchstabe Æ\",Ccedil:\"Lateinischer Buchstabe C mit Cedille\",Egrave:\"Lateinischer Buchstabe E mit AkzentGrave\",Eacute:\"Lateinischer Buchstabe E mit Akutakzent\",Ecirc:\"Lateinischer Buchstabe E mit Zirkumflex\",Euml:\"Lateinischer Buchstabe E Trema\",Igrave:\"Lateinischer Buchstabe I mit AkzentGrave\",Iacute:\"Lateinischer Buchstabe I mit Akutakzent\",\nIcirc:\"Lateinischer Buchstabe I mit Zirkumflex\",Iuml:\"Lateinischer Buchstabe I mit Trema\",ETH:\"Lateinischer Buchstabe Eth\",Ntilde:\"Lateinischer Buchstabe N mit Tilde\",Ograve:\"Lateinischer Buchstabe O mit AkzentGrave\",Oacute:\"Lateinischer Buchstabe O mit Akutakzent\",Ocirc:\"Lateinischer Buchstabe O mit Zirkumflex\",Otilde:\"Lateinischer Buchstabe O mit Tilde\",Ouml:\"Lateinischer Buchstabe O mit Trema\",times:\"Multiplikation\",Oslash:\"Lateinischer Buchstabe O durchgestrichen\",Ugrave:\"Lateinischer Buchstabe U mit Akzentgrave\",\nUacute:\"Lateinischer Buchstabe U mit Akutakzent\",Ucirc:\"Lateinischer Buchstabe U mit Zirkumflex\",Uuml:\"Lateinischer Buchstabe a mit Trema\",Yacute:\"Lateinischer Buchstabe a mit Akzent\",THORN:\"Lateinischer Buchstabe mit Dorn\",szlig:\"Kleiner lateinischer Buchstabe scharfe s\",agrave:\"Kleiner lateinischer Buchstabe a mit Accent grave\",aacute:\"Kleiner lateinischer Buchstabe a mit Akut\",acirc:\"Lateinischer Buchstabe a mit Zirkumflex\",atilde:\"Lateinischer Buchstabe a mit Tilde\",auml:\"Kleiner lateinischer Buchstabe a mit Trema\",\naring:\"Kleiner lateinischer Buchstabe a mit Ring oben\",aelig:\"Lateinischer Buchstabe æ\",ccedil:\"Kleiner lateinischer Buchstabe c mit Cedille\",egrave:\"Kleiner lateinischer Buchstabe e mit Accent grave\",eacute:\"Kleiner lateinischer Buchstabe e mit Akut\",ecirc:\"Kleiner lateinischer Buchstabe e mit Zirkumflex\",euml:\"Kleiner lateinischer Buchstabe e mit Trema\",igrave:\"Kleiner lateinischer Buchstabe i mit AkzentGrave\",iacute:\"Kleiner lateinischer Buchstabe i mit Akzent\",icirc:\"Kleiner lateinischer Buchstabe i mit Zirkumflex\",\niuml:\"Kleiner lateinischer Buchstabe i mit Trema\",eth:\"Kleiner lateinischer Buchstabe eth\",ntilde:\"Kleiner lateinischer Buchstabe n mit Tilde\",ograve:\"Kleiner lateinischer Buchstabe o mit Accent grave\",oacute:\"Kleiner lateinischer Buchstabe o mit Akzent\",ocirc:\"Kleiner lateinischer Buchstabe o mit Zirkumflex\",otilde:\"Lateinischer Buchstabe i mit Tilde\",ouml:\"Kleiner lateinischer Buchstabe o mit Trema\",divide:\"Divisionszeichen\",oslash:\"Kleiner lateinischer Buchstabe o durchgestrichen\",ugrave:\"Kleiner lateinischer Buchstabe u mit Accent grave\",\nuacute:\"Kleiner lateinischer Buchstabe u mit Akut\",ucirc:\"Kleiner lateinischer Buchstabe u mit Zirkumflex\",uuml:\"Kleiner lateinischer Buchstabe u mit Trema\",yacute:\"Kleiner lateinischer Buchstabe y mit Akut\",thorn:\"Kleiner lateinischer Buchstabe Dorn\",yuml:\"Kleiner lateinischer Buchstabe y mit Trema\",OElig:\"Lateinischer Buchstabe Ligatur OE\",oelig:\"Kleiner lateinischer Buchstabe Ligatur OE\",372:\"Lateinischer Buchstabe W mit Zirkumflex\",374:\"Lateinischer Buchstabe Y mit Zirkumflex\",373:\"Kleiner lateinischer Buchstabe w mit Zirkumflex\",\n375:\"Kleiner lateinischer Buchstabe y mit Zirkumflex\",sbquo:\"Tiefergestelltes Komma\",8219:\"Rumgedrehtes Komma\",bdquo:\"Doppeltes Anführungszeichen unten\",hellip:\"horizontale Auslassungspunkte\",trade:\"Handelszeichen\",9658:\"Dreickspfeil rechts\",bull:\"Bullet\",rarr:\"Pfeil rechts\",rArr:\"Doppelpfeil rechts\",hArr:\"Doppelpfeil links\",diams:\"Karo\",asymp:\"Ungefähr\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/de.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"de\",{euro:\"Euro Zeichen\",lsquo:\"Hochkomma links\",rsquo:\"Hochkomma rechts\",ldquo:\"Anführungszeichen links\",rdquo:\"Anführungszeichen rechts\",ndash:\"Kleiner Strich\",mdash:\"Mittlerer Strich\",iexcl:\"Invertiertes Ausrufezeichen\",cent:\"Cent-Zeichen\",pound:\"Pfund-Zeichen\",curren:\"Währungszeichen\",yen:\"Yen\",brvbar:\"Gestrichelte Linie\",sect:\"Paragrafenzeichen\",uml:\"Diäresis\",copy:\"Copyright-Zeichen\",ordf:\"Feminine ordinal Anzeige\",laquo:\"Nach links zeigenden Doppel-Winkel Anführungszeichen\",\nnot:\"Not-Zeichen\",reg:\"Registriert-Zeichen\",macr:\"Längezeichen\",deg:\"Grad-Zeichen\",sup2:\"Hoch 2\",sup3:\"Hoch 3\",acute:\"Akzentzeichen \",micro:\"Mikro-Zeichen\",para:\"Pilcrow-Zeichen\",middot:\"Mittelpunkt\",cedil:\"Cedilla\",sup1:\"Hoch 1\",ordm:\"Männliche Ordnungszahl Anzeige\",raquo:\"Nach rechts zeigenden Doppel-Winkel Anführungszeichen\",frac14:\"ein Viertel\",frac12:\"Hälfte\",frac34:\"Dreiviertel\",iquest:\"Umgekehrtes Fragezeichen\",Agrave:\"Lateinischer Buchstabe A mit AkzentGrave\",Aacute:\"Lateinischer Buchstabe A mit Akutakzent\",\nAcirc:\"Lateinischer Buchstabe A mit Zirkumflex\",Atilde:\"Lateinischer Buchstabe A mit Tilde\",Auml:\"Lateinischer Buchstabe A mit Trema\",Aring:\"Lateinischer Buchstabe A mit Ring oben\",AElig:\"Lateinischer Buchstabe Æ\",Ccedil:\"Lateinischer Buchstabe C mit Cedille\",Egrave:\"Lateinischer Buchstabe E mit AkzentGrave\",Eacute:\"Lateinischer Buchstabe E mit Akutakzent\",Ecirc:\"Lateinischer Buchstabe E mit Zirkumflex\",Euml:\"Lateinischer Buchstabe E Trema\",Igrave:\"Lateinischer Buchstabe I mit AkzentGrave\",Iacute:\"Lateinischer Buchstabe I mit Akutakzent\",\nIcirc:\"Lateinischer Buchstabe I mit Zirkumflex\",Iuml:\"Lateinischer Buchstabe I mit Trema\",ETH:\"Lateinischer Buchstabe Eth\",Ntilde:\"Lateinischer Buchstabe N mit Tilde\",Ograve:\"Lateinischer Buchstabe O mit AkzentGrave\",Oacute:\"Lateinischer Buchstabe O mit Akutakzent\",Ocirc:\"Lateinischer Buchstabe O mit Zirkumflex\",Otilde:\"Lateinischer Buchstabe O mit Tilde\",Ouml:\"Lateinischer Buchstabe O mit Trema\",times:\"Multiplikation\",Oslash:\"Lateinischer Buchstabe O durchgestrichen\",Ugrave:\"Lateinischer Buchstabe U mit Akzentgrave\",\nUacute:\"Lateinischer Buchstabe U mit Akutakzent\",Ucirc:\"Lateinischer Buchstabe U mit Zirkumflex\",Uuml:\"Lateinischer Buchstabe a mit Trema\",Yacute:\"Lateinischer Buchstabe a mit Akzent\",THORN:\"Lateinischer Buchstabe mit Dorn\",szlig:\"Kleiner lateinischer Buchstabe scharfe s\",agrave:\"Kleiner lateinischer Buchstabe a mit Accent grave\",aacute:\"Kleiner lateinischer Buchstabe a mit Akut\",acirc:\"Lateinischer Buchstabe a mit Zirkumflex\",atilde:\"Lateinischer Buchstabe a mit Tilde\",auml:\"Kleiner lateinischer Buchstabe a mit Trema\",\naring:\"Kleiner lateinischer Buchstabe a mit Ring oben\",aelig:\"Lateinischer Buchstabe æ\",ccedil:\"Kleiner lateinischer Buchstabe c mit Cedille\",egrave:\"Kleiner lateinischer Buchstabe e mit Accent grave\",eacute:\"Kleiner lateinischer Buchstabe e mit Akut\",ecirc:\"Kleiner lateinischer Buchstabe e mit Zirkumflex\",euml:\"Kleiner lateinischer Buchstabe e mit Trema\",igrave:\"Kleiner lateinischer Buchstabe i mit AkzentGrave\",iacute:\"Kleiner lateinischer Buchstabe i mit Akzent\",icirc:\"Kleiner lateinischer Buchstabe i mit Zirkumflex\",\niuml:\"Kleiner lateinischer Buchstabe i mit Trema\",eth:\"Kleiner lateinischer Buchstabe eth\",ntilde:\"Kleiner lateinischer Buchstabe n mit Tilde\",ograve:\"Kleiner lateinischer Buchstabe o mit Accent grave\",oacute:\"Kleiner lateinischer Buchstabe o mit Akzent\",ocirc:\"Kleiner lateinischer Buchstabe o mit Zirkumflex\",otilde:\"Lateinischer Buchstabe i mit Tilde\",ouml:\"Kleiner lateinischer Buchstabe o mit Trema\",divide:\"Divisionszeichen\",oslash:\"Kleiner lateinischer Buchstabe o durchgestrichen\",ugrave:\"Kleiner lateinischer Buchstabe u mit Accent grave\",\nuacute:\"Kleiner lateinischer Buchstabe u mit Akut\",ucirc:\"Kleiner lateinischer Buchstabe u mit Zirkumflex\",uuml:\"Kleiner lateinischer Buchstabe u mit Trema\",yacute:\"Kleiner lateinischer Buchstabe y mit Akut\",thorn:\"Kleiner lateinischer Buchstabe Dorn\",yuml:\"Kleiner lateinischer Buchstabe y mit Trema\",OElig:\"Lateinischer Buchstabe Ligatur OE\",oelig:\"Kleiner lateinischer Buchstabe Ligatur OE\",372:\"Lateinischer Buchstabe W mit Zirkumflex\",374:\"Lateinischer Buchstabe Y mit Zirkumflex\",373:\"Kleiner lateinischer Buchstabe w mit Zirkumflex\",\n375:\"Kleiner lateinischer Buchstabe y mit Zirkumflex\",sbquo:\"Tiefergestelltes Komma\",8219:\"Rumgedrehtes Komma\",bdquo:\"Doppeltes Anführungszeichen unten\",hellip:\"horizontale Auslassungspunkte\",trade:\"Handelszeichen\",9658:\"Dreickspfeil rechts\",bull:\"Bullet\",rarr:\"Pfeil rechts\",rArr:\"Doppelpfeil rechts\",hArr:\"Doppelpfeil links\",diams:\"Karo\",asymp:\"Ungefähr\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/el.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"el\",{euro:\"Σύμβολο Ευρώ\",lsquo:\"Αριστερός χαρακτήρας μονού εισαγωγικού\",rsquo:\"Δεξιός χαρακτήρας μονού εισαγωγικού\",ldquo:\"Αριστερός χαρακτήρας ευθύγραμμων εισαγωγικών\",rdquo:\"Δεξιός χαρακτήρας ευθύγραμμων εισαγωγικών\",ndash:\"Παύλα en\",mdash:\"Παύλα em\",iexcl:\"Ανάποδο θαυμαστικό\",cent:\"Σύμβολο σεντ\",pound:\"Σύμβολο λίρας\",curren:\"Σύμβολο συναλλαγματικής μονάδας\",yen:\"Σύμβολο Γιεν\",brvbar:\"Σπασμένη μπάρα\",sect:\"Σύμβολο τμήματος\",uml:\"Διαίρεση\",copy:\"Σύμβολο πνευματικών δικαιωμάτων\",\nordf:\"Θηλυκός τακτικός δείκτης\",laquo:\"Γωνιώδη εισαγωγικά αριστερής κατάδειξης\",not:\"Σύμβολο άρνησης\",reg:\"Σύμβολο σημάτων κατατεθέν\",macr:\"Μακρόν\",deg:\"Σύμβολο βαθμού\",sup2:\"Εκτεθειμένο δύο\",sup3:\"Εκτεθειμένο τρία\",acute:\"Οξεία\",micro:\"Σύμβολο μικρού\",para:\"Σύμβολο παραγράφου\",middot:\"Μέση τελεία\",cedil:\"Υπογεγραμμένη\",sup1:\"Εκτεθειμένο ένα\",ordm:\"Αρσενικός τακτικός δείκτης\",raquo:\"Γωνιώδη εισαγωγικά δεξιάς κατάδειξης\",frac14:\"Γνήσιο κλάσμα ενός τετάρτου\",frac12:\"Γνήσιο κλάσμα ενός δεύτερου\",frac34:\"Γνήσιο κλάσμα τριών τετάρτων\",\niquest:\"Ανάποδο θαυμαστικό\",Agrave:\"Λατινικό κεφαλαίο γράμμα A με βαρεία\",Aacute:\"Λατινικό κεφαλαίο γράμμα A με οξεία\",Acirc:\"Λατινικό κεφαλαίο γράμμα A με περισπωμένη\",Atilde:\"Λατινικό κεφαλαίο γράμμα A με περισπωμένη\",Auml:\"Λατινικό κεφαλαίο γράμμα A με διαλυτικά\",Aring:\"Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω\",AElig:\"Λατινικό κεφαλαίο γράμμα Æ\",Ccedil:\"Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη\",Egrave:\"Λατινικό κεφαλαίο γράμμα E με βαρεία\",Eacute:\"Λατινικό κεφαλαίο γράμμα E με οξεία\",Ecirc:\"Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη \",\nEuml:\"Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά\",Igrave:\"Λατινικό κεφαλαίο γράμμα I με βαρεία\",Iacute:\"Λατινικό κεφαλαίο γράμμα I με οξεία\",Icirc:\"Λατινικό κεφαλαίο γράμμα I  με περισπωμένη\",Iuml:\"Λατινικό κεφαλαίο γράμμα I με διαλυτικά \",ETH:\"Λατινικό κεφαλαίο γράμμα Eth\",Ntilde:\"Λατινικό κεφαλαίο γράμμα N με περισπωμένη\",Ograve:\"Λατινικό κεφαλαίο γράμμα O με βαρεία\",Oacute:\"Λατινικό κεφαλαίο γράμμα O με οξεία\",Ocirc:\"Λατινικό κεφαλαίο γράμμα O με περισπωμένη \",Otilde:\"Λατινικό κεφαλαίο γράμμα O με περισπωμένη\",\nOuml:\"Λατινικό κεφαλαίο γράμμα O με διαλυτικά\",times:\"Σύμβολο πολλαπλασιασμού\",Oslash:\"Λατινικό κεφαλαίο γράμμα O με μολυβιά\",Ugrave:\"Λατινικό κεφαλαίο γράμμα U με βαρεία\",Uacute:\"Λατινικό κεφαλαίο γράμμα U με οξεία\",Ucirc:\"Λατινικό κεφαλαίο γράμμα U με περισπωμένη\",Uuml:\"Λατινικό κεφαλαίο γράμμα U με διαλυτικά\",Yacute:\"Λατινικό κεφαλαίο γράμμα Y με οξεία\",THORN:\"Λατινικό κεφαλαίο γράμμα Thorn\",szlig:\"Λατινικό μικρό γράμμα απότομο s\",agrave:\"Λατινικό μικρό γράμμα a με βαρεία\",aacute:\"Λατινικό μικρό γράμμα a με οξεία\",\nacirc:\"Λατινικό μικρό γράμμα a με περισπωμένη\",atilde:\"Λατινικό μικρό γράμμα a με περισπωμένη\",auml:\"Λατινικό μικρό γράμμα a με διαλυτικά\",aring:\"Λατινικό μικρό γράμμα a με δακτύλιο πάνω\",aelig:\"Λατινικό μικρό γράμμα æ\",ccedil:\"Λατινικό μικρό γράμμα c με υπογεγραμμένη\",egrave:\"Λατινικό μικρό γράμμα ε με βαρεία\",eacute:\"Λατινικό μικρό γράμμα e με οξεία\",ecirc:\"Λατινικό μικρό γράμμα e με περισπωμένη\",euml:\"Λατινικό μικρό γράμμα e με διαλυτικά\",igrave:\"Λατινικό μικρό γράμμα i με βαρεία\",iacute:\"Λατινικό μικρό γράμμα i με οξεία\",\nicirc:\"Λατινικό μικρό γράμμα i με περισπωμένη\",iuml:\"Λατινικό μικρό γράμμα i με διαλυτικά\",eth:\"Λατινικό μικρό γράμμα eth\",ntilde:\"Λατινικό μικρό γράμμα n με περισπωμένη\",ograve:\"Λατινικό μικρό γράμμα o με βαρεία\",oacute:\"Λατινικό μικρό γράμμα o με οξεία \",ocirc:\"Λατινικό πεζό γράμμα o με περισπωμένη\",otilde:\"Λατινικό μικρό γράμμα o με περισπωμένη \",ouml:\"Λατινικό μικρό γράμμα o με διαλυτικά\",divide:\"Σύμβολο διαίρεσης\",oslash:\"Λατινικό μικρό γράμμα o με περισπωμένη\",ugrave:\"Λατινικό μικρό γράμμα u με βαρεία\",\nuacute:\"Λατινικό μικρό γράμμα u με οξεία\",ucirc:\"Λατινικό μικρό γράμμα u με περισπωμένη\",uuml:\"Λατινικό μικρό γράμμα u με διαλυτικά\",yacute:\"Λατινικό μικρό γράμμα y με οξεία\",thorn:\"Λατινικό μικρό γράμμα thorn\",yuml:\"Λατινικό μικρό γράμμα y με διαλυτικά\",OElig:\"Λατινικό κεφαλαίο σύμπλεγμα ΟΕ\",oelig:\"Λατινικό μικρό σύμπλεγμα oe\",372:\"Λατινικό κεφαλαίο γράμμα W με περισπωμένη\",374:\"Λατινικό κεφαλαίο γράμμα Y με περισπωμένη\",373:\"Λατινικό μικρό γράμμα w με περισπωμένη\",375:\"Λατινικό μικρό γράμμα y με περισπωμένη\",\nsbquo:\"Ενιαίο χαμηλο -9 εισαγωγικό \",8219:\"Ενιαίο υψηλο ανεστραμμένο-9 εισαγωγικό \",bdquo:\"Διπλό χαμηλό-9 εισαγωγικό \",hellip:\"Οριζόντια αποσιωπητικά\",trade:\"Σύμβολο εμπορικού κατατεθέν\",9658:\"Μαύρος δείκτης που δείχνει προς τα δεξιά\",bull:\"Κουκκίδα\",rarr:\"Δεξί βελάκι\",rArr:\"Διπλό δεξί βελάκι\",hArr:\"Διπλό βελάκι αριστερά-δεξιά\",diams:\"Μαύρο διαμάντι\",asymp:\"Σχεδόν ίσο με\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"en-gb\",{euro:\"Euro sign\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Cent sign\",pound:\"Pound sign\",curren:\"Currency sign\",yen:\"Yen sign\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Copyright sign\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Registered sign\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/en.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"en\",{euro:\"Euro sign\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Cent sign\",pound:\"Pound sign\",curren:\"Currency sign\",yen:\"Yen sign\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Copyright sign\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Registered sign\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/eo.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"eo\",{euro:\"Eŭrosigno\",lsquo:\"Supra 6-citilo\",rsquo:\"Supra 9-citilo\",ldquo:\"Supra 66-citilo\",rdquo:\"Supra 99-citilo\",ndash:\"Streketo\",mdash:\"Substreko\",iexcl:\"Renversita krisigno\",cent:\"Cendosigno\",pound:\"Pundosigno\",curren:\"Monersigno\",yen:\"Enosigno\",brvbar:\"Rompita vertikala streko\",sect:\"Kurba paragrafo\",uml:\"Tremao\",copy:\"Kopirajtosigno\",ordf:\"Adjektiva numerfinaĵo\",laquo:\"Duobla malplio-citilo\",not:\"Negohoko\",reg:\"Registrita marko\",macr:\"Superstreko\",deg:\"Gradosigno\",\nsup2:\"Supra indico 2\",sup3:\"Supra indico 3\",acute:\"Dekstra korno\",micro:\"Mikrosigno\",para:\"Rekta paragrafo\",middot:\"Meza punkto\",cedil:\"Zoeto\",sup1:\"Supra indico 1\",ordm:\"Substantiva numerfinaĵo\",raquo:\"Duobla plio-citilo\",frac14:\"Kvaronosigno\",frac12:\"Duonosigno\",frac34:\"Trikvaronosigno\",iquest:\"renversita demandosigno\",Agrave:\"Latina ĉeflitero A kun liva korno\",Aacute:\"Latina ĉeflitero A kun dekstra korno\",Acirc:\"Latina ĉeflitero A kun ĉapelo\",Atilde:\"Latina ĉeflitero A kun tildo\",Auml:\"Latina ĉeflitero A kun tremao\",\nAring:\"Latina ĉeflitero A kun superringo\",AElig:\"Latina ĉeflitera ligaturo Æ\",Ccedil:\"Latina ĉeflitero C kun zoeto\",Egrave:\"Latina ĉeflitero E kun liva korno\",Eacute:\"Latina ĉeflitero E kun dekstra korno\",Ecirc:\"Latina ĉeflitero E kun ĉapelo\",Euml:\"Latina ĉeflitero E kun tremao\",Igrave:\"Latina ĉeflitero I kun liva korno\",Iacute:\"Latina ĉeflitero I kun dekstra korno\",Icirc:\"Latina ĉeflitero I kun ĉapelo\",Iuml:\"Latina ĉeflitero I kun tremao\",ETH:\"Latina ĉeflitero islanda edo\",Ntilde:\"Latina ĉeflitero N kun tildo\",\nOgrave:\"Latina ĉeflitero O kun liva korno\",Oacute:\"Latina ĉeflitero O kun dekstra korno\",Ocirc:\"Latina ĉeflitero O kun ĉapelo\",Otilde:\"Latina ĉeflitero O kun tildo\",Ouml:\"Latina ĉeflitero O kun tremao\",times:\"Multipliko\",Oslash:\"Latina ĉeflitero O trastrekita\",Ugrave:\"Latina ĉeflitero U kun liva korno\",Uacute:\"Latina ĉeflitero U kun dekstra korno\",Ucirc:\"Latina ĉeflitero U kun ĉapelo\",Uuml:\"Latina ĉeflitero U kun tremao\",Yacute:\"Latina ĉeflitero Y kun dekstra korno\",THORN:\"Latina ĉeflitero islanda dorno\",\nszlig:\"Latina etlitero germana sozo (akra s)\",agrave:\"Latina etlitero a kun liva korno\",aacute:\"Latina etlitero a kun dekstra korno\",acirc:\"Latina etlitero a kun ĉapelo\",atilde:\"Latina etlitero a kun tildo\",auml:\"Latina etlitero a kun tremao\",aring:\"Latina etlitero a kun superringo\",aelig:\"Latina etlitera ligaturo æ\",ccedil:\"Latina etlitero c kun zoeto\",egrave:\"Latina etlitero e kun liva korno\",eacute:\"Latina etlitero e kun dekstra korno\",ecirc:\"Latina etlitero e kun ĉapelo\",euml:\"Latina etlitero e kun tremao\",\nigrave:\"Latina etlitero i kun liva korno\",iacute:\"Latina etlitero i kun dekstra korno\",icirc:\"Latina etlitero i kun ĉapelo\",iuml:\"Latina etlitero i kun tremao\",eth:\"Latina etlitero islanda edo\",ntilde:\"Latina etlitero n kun tildo\",ograve:\"Latina etlitero o kun liva korno\",oacute:\"Latina etlitero o kun dekstra korno\",ocirc:\"Latina etlitero o kun ĉapelo\",otilde:\"Latina etlitero o kun tildo\",ouml:\"Latina etlitero o kun tremao\",divide:\"Dividosigno\",oslash:\"Latina etlitero o trastrekita\",ugrave:\"Latina etlitero u kun liva korno\",\nuacute:\"Latina etlitero u kun dekstra korno\",ucirc:\"Latina etlitero u kun ĉapelo\",uuml:\"Latina etlitero u kun tremao\",yacute:\"Latina etlitero y kun dekstra korno\",thorn:\"Latina etlitero islanda dorno\",yuml:\"Latina etlitero y kun tremao\",OElig:\"Latina ĉeflitera ligaturo Œ\",oelig:\"Latina etlitera ligaturo œ\",372:\"Latina ĉeflitero W kun ĉapelo\",374:\"Latina ĉeflitero Y kun ĉapelo\",373:\"Latina etlitero w kun ĉapelo\",375:\"Latina etlitero y kun ĉapelo\",sbquo:\"Suba 9-citilo\",8219:\"Supra renversita 9-citilo\",\nbdquo:\"Suba 99-citilo\",hellip:\"Tripunkto\",trade:\"Varmarka signo\",9658:\"Nigra sago dekstren\",bull:\"Bulmarko\",rarr:\"Sago dekstren\",rArr:\"Duobla sago dekstren\",hArr:\"Duobla sago maldekstren\",diams:\"Nigra kvadrato\",asymp:\"Preskaŭ egala\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/es.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"es\",{euro:\"Símbolo de euro\",lsquo:\"Comilla simple izquierda\",rsquo:\"Comilla simple derecha\",ldquo:\"Comilla doble izquierda\",rdquo:\"Comilla doble derecha\",ndash:\"Guión corto\",mdash:\"Guión medio largo\",iexcl:\"Signo de admiración invertido\",cent:\"Símbolo centavo\",pound:\"Símbolo libra\",curren:\"Símbolo moneda\",yen:\"Símbolo yen\",brvbar:\"Barra vertical rota\",sect:\"Símbolo sección\",uml:\"Diéresis\",copy:\"Signo de derechos de autor\",ordf:\"Indicador ordinal femenino\",laquo:\"Abre comillas angulares\",\nnot:\"Signo negación\",reg:\"Signo de marca registrada\",macr:\"Guión alto\",deg:\"Signo de grado\",sup2:\"Superíndice dos\",sup3:\"Superíndice tres\",acute:\"Acento agudo\",micro:\"Signo micro\",para:\"Signo de pi\",middot:\"Punto medio\",cedil:\"Cedilla\",sup1:\"Superíndice uno\",ordm:\"Indicador orginal masculino\",raquo:\"Cierra comillas angulares\",frac14:\"Fracción ordinaria de un quarto\",frac12:\"Fracción ordinaria de una mitad\",frac34:\"Fracción ordinaria de tres cuartos\",iquest:\"Signo de interrogación invertido\",Agrave:\"Letra A latina mayúscula con acento grave\",\nAacute:\"Letra A latina  mayúscula con acento agudo\",Acirc:\"Letra A latina mayúscula con acento circunflejo\",Atilde:\"Letra A latina mayúscula con tilde\",Auml:\"Letra A latina mayúscula con diéresis\",Aring:\"Letra A latina mayúscula con aro arriba\",AElig:\"Letra Æ latina mayúscula\",Ccedil:\"Letra C latina mayúscula con cedilla\",Egrave:\"Letra E latina mayúscula con acento grave\",Eacute:\"Letra E latina mayúscula con acento agudo\",Ecirc:\"Letra E latina mayúscula con acento circunflejo\",Euml:\"Letra E latina mayúscula con diéresis\",\nIgrave:\"Letra I latina mayúscula con acento grave\",Iacute:\"Letra I latina mayúscula con acento agudo\",Icirc:\"Letra I latina mayúscula con acento circunflejo\",Iuml:\"Letra I latina mayúscula con diéresis\",ETH:\"Letra Eth latina mayúscula\",Ntilde:\"Letra N latina mayúscula con tilde\",Ograve:\"Letra O latina mayúscula con acento grave\",Oacute:\"Letra O latina mayúscula con acento agudo\",Ocirc:\"Letra O latina mayúscula con acento circunflejo\",Otilde:\"Letra O latina mayúscula con tilde\",Ouml:\"Letra O latina mayúscula con diéresis\",\ntimes:\"Signo de multiplicación\",Oslash:\"Letra O latina mayúscula con barra inclinada\",Ugrave:\"Letra U latina mayúscula con acento grave\",Uacute:\"Letra U latina mayúscula con acento agudo\",Ucirc:\"Letra U latina mayúscula con acento circunflejo\",Uuml:\"Letra U latina mayúscula con diéresis\",Yacute:\"Letra Y latina mayúscula con acento agudo\",THORN:\"Letra Thorn latina mayúscula\",szlig:\"Letra s latina fuerte pequeña\",agrave:\"Letra a latina pequeña con acento grave\",aacute:\"Letra a latina pequeña con acento agudo\",\nacirc:\"Letra a latina pequeña con acento circunflejo\",atilde:\"Letra a latina pequeña con tilde\",auml:\"Letra a latina pequeña con diéresis\",aring:\"Letra a latina pequeña con aro arriba\",aelig:\"Letra æ latina pequeña\",ccedil:\"Letra c latina pequeña con cedilla\",egrave:\"Letra e latina pequeña con acento grave\",eacute:\"Letra e latina pequeña con acento agudo\",ecirc:\"Letra e latina pequeña con acento circunflejo\",euml:\"Letra e latina pequeña con diéresis\",igrave:\"Letra i latina pequeña con acento grave\",\niacute:\"Letra i latina pequeña con acento agudo\",icirc:\"Letra i latina pequeña con acento circunflejo\",iuml:\"Letra i latina pequeña con diéresis\",eth:\"Letra eth latina pequeña\",ntilde:\"Letra n latina pequeña con tilde\",ograve:\"Letra o latina pequeña con acento grave\",oacute:\"Letra o latina pequeña con acento agudo\",ocirc:\"Letra o latina pequeña con acento circunflejo\",otilde:\"Letra o latina pequeña con tilde\",ouml:\"Letra o latina pequeña con diéresis\",divide:\"Signo de división\",oslash:\"Letra o latina minúscula con barra inclinada\",\nugrave:\"Letra u latina pequeña con acento grave\",uacute:\"Letra u latina pequeña con acento agudo\",ucirc:\"Letra u latina pequeña con acento circunflejo\",uuml:\"Letra u latina pequeña con diéresis\",yacute:\"Letra u latina pequeña con acento agudo\",thorn:\"Letra thorn latina minúscula\",yuml:\"Letra y latina pequeña con diéresis\",OElig:\"Diptongo OE latino en mayúscula\",oelig:\"Diptongo oe latino en minúscula\",372:\"Letra W latina mayúscula con acento circunflejo\",374:\"Letra Y latina mayúscula con acento circunflejo\",\n373:\"Letra w latina pequeña con acento circunflejo\",375:\"Letra y latina pequeña con acento circunflejo\",sbquo:\"Comilla simple baja-9\",8219:\"Comilla simple alta invertida-9\",bdquo:\"Comillas dobles bajas-9\",hellip:\"Puntos suspensivos horizontales\",trade:\"Signo de marca registrada\",9658:\"Apuntador negro apuntando a la derecha\",bull:\"Viñeta\",rarr:\"Flecha a la derecha\",rArr:\"Flecha doble a la derecha\",hArr:\"Flecha izquierda derecha doble\",diams:\"Diamante negro\",asymp:\"Casi igual a\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/et.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"et\",{euro:\"Euromärk\",lsquo:\"Alustav ühekordne jutumärk\",rsquo:\"Lõpetav ühekordne jutumärk\",ldquo:\"Alustav kahekordne jutumärk\",rdquo:\"Lõpetav kahekordne jutumärk\",ndash:\"Enn-kriips\",mdash:\"Emm-kriips\",iexcl:\"Pööratud hüüumärk\",cent:\"Sendimärk\",pound:\"Naela märk\",curren:\"Valuutamärk\",yen:\"Jeeni märk\",brvbar:\"Katkestatud kriips\",sect:\"Lõigu märk\",uml:\"Täpid\",copy:\"Autoriõiguse märk\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Ei-märk\",reg:\"Registered sign\",macr:\"Macron\",deg:\"Kraadimärk\",sup2:\"Ülaindeks kaks\",sup3:\"Ülaindeks kolm\",acute:\"Acute accent\",micro:\"Mikro-märk\",para:\"Pilcrow sign\",middot:\"Keskpunkt\",cedil:\"Cedilla\",sup1:\"Ülaindeks üks\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Ladina suur A tildega\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Täppidega ladina suur O\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Kandilise katusega suur ladina U\",Uuml:\"Täppidega ladina suur U\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Ladina väike terav s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Kandilise katusega ladina väike a\",atilde:\"Tildega ladina väike a\",auml:\"Täppidega ladina väike a\",aring:\"Latin small letter a with ring above\",\naelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",ntilde:\"Latin small letter n with tilde\",\nograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Jagamismärk\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",yacute:\"Latin small letter y with acute accent\",\nthorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",trade:\"Kaubamärgi märk\",9658:\"Black right-pointing pointer\",\nbull:\"Kuul\",rarr:\"Nool paremale\",rArr:\"Topeltnool paremale\",hArr:\"Topeltnool vasakule\",diams:\"Black diamond suit\",asymp:\"Ligikaudu võrdne\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/eu.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"eu\",{euro:\"Euro zeinua\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Cent sign\",pound:\"Pound sign\",curren:\"Currency sign\",yen:\"Yen sign\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Copyright sign\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Ez zeinua\",reg:\"Registered sign\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/fa.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"fa\",{euro:\"نشان یورو\",lsquo:\"علامت نقل قول تکی چپ\",rsquo:\"علامت نقل قول تکی راست\",ldquo:\"علامت نقل قول دوتایی چپ\",rdquo:\"علامت نقل قول دوتایی راست\",ndash:\"خط تیره En\",mdash:\"خط تیره Em\",iexcl:\"علامت تعجب وارونه\",cent:\"نشان سنت\",pound:\"نشان پوند\",curren:\"نشان ارز\",yen:\"نشان ین\",brvbar:\"نوار شکسته\",sect:\"نشان بخش\",uml:\"نشان سواگیری\",copy:\"نشان کپی رایت\",ordf:\"شاخص ترتیبی مونث\",laquo:\"اشاره چپ مکرر برای زاویه علامت نقل قول\",not:\"نشان ثبت نشده\",reg:\"نشان ثبت شده\",\nmacr:\"نشان خط بالای حرف\",deg:\"نشان درجه\",sup2:\"بالانویس دو\",sup3:\"بالانویس سه\",acute:\"لهجه غلیظ\",micro:\"نشان مایکرو\",para:\"نشان محل بند\",middot:\"نقطه میانی\",cedil:\"سدیل\",sup1:\"بالانویس 1\",ordm:\"شاخص ترتیبی مذکر\",raquo:\"نشان زاویه‌دار دوتایی نقل قول راست چین\",frac14:\"واحد عامیانه 1/4\",frac12:\"واحد عامینه نصف\",frac34:\"واحد عامیانه 3/4\",iquest:\"علامت سوال معکوس\",Agrave:\"حرف A بزرگ لاتین با تلفظ غلیظ\",Aacute:\"حرف A بزرگ لاتین با تلفظ شدید\",Acirc:\"حرف A بزرگ لاتین با دور\",Atilde:\"حرف A بزرگ لاتین با صدای کامی\",\nAuml:\"حرف A بزرگ لاتین با نشان سواگیری\",Aring:\"حرف A بزرگ لاتین با حلقه بالا\",AElig:\"حرف Æ بزرگ لاتین\",Ccedil:\"حرف C بزرگ لاتین با نشان سواگیری\",Egrave:\"حرف E بزرگ لاتین با تلفظ درشت\",Eacute:\"حرف E بزرگ لاتین با تلفظ زیر\",Ecirc:\"حرف E بزرگ لاتین با خمان\",Euml:\"حرف E بزرگ لاتین با نشان سواگیری\",Igrave:\"حرف I بزرگ لاتین با تلفظ درشت\",Iacute:\"حرف I بزرگ لاتین با تلفظ ریز\",Icirc:\"حرف I بزرگ لاتین با خمان\",Iuml:\"حرف I بزرگ لاتین با نشان سواگیری\",ETH:\"حرف لاتین بزرگ واکه ترتیبی\",Ntilde:\"حرف N بزرگ لاتین با مد\",\nOgrave:\"حرف O بزرگ لاتین با تلفظ درشت\",Oacute:\"حرف O بزرگ لاتین با تلفظ ریز\",Ocirc:\"حرف O بزرگ لاتین با خمان\",Otilde:\"حرف O بزرگ لاتین با مد\",Ouml:\"حرف O بزرگ لاتین با نشان سواگیری\",times:\"نشان ضربدر\",Oslash:\"حرف O بزرگ لاتین با میان خط\",Ugrave:\"حرف U بزرگ لاتین با تلفظ درشت\",Uacute:\"حرف U بزرگ لاتین با تلفظ ریز\",Ucirc:\"حرف U بزرگ لاتین با خمان\",Uuml:\"حرف U بزرگ لاتین با نشان سواگیری\",Yacute:\"حرف Y بزرگ لاتین با تلفظ ریز\",THORN:\"حرف بزرگ لاتین خاردار\",szlig:\"حرف کوچک لاتین شارپ s\",agrave:\"حرف a کوچک لاتین با تلفظ درشت\",\naacute:\"حرف a کوچک لاتین با تلفظ ریز\",acirc:\"حرف a کوچک لاتین با خمان\",atilde:\"حرف a کوچک لاتین با صدای کامی\",auml:\"حرف a کوچک لاتین با نشان سواگیری\",aring:\"حرف a کوچک لاتین گوشواره دار\",aelig:\"حرف کوچک لاتین æ\",ccedil:\"حرف c کوچک لاتین با نشان سدیل\",egrave:\"حرف e کوچک لاتین با تلفظ درشت\",eacute:\"حرف e کوچک لاتین با تلفظ ریز\",ecirc:\"حرف e کوچک لاتین با خمان\",euml:\"حرف e کوچک لاتین با نشان سواگیری\",igrave:\"حرف i کوچک لاتین با تلفظ درشت\",iacute:\"حرف i کوچک لاتین با تلفظ ریز\",icirc:\"حرف i کوچک لاتین با خمان\",\niuml:\"حرف i کوچک لاتین با نشان سواگیری\",eth:\"حرف کوچک لاتین eth\",ntilde:\"حرف n کوچک لاتین با صدای کامی\",ograve:\"حرف o کوچک لاتین با تلفظ درشت\",oacute:\"حرف o کوچک لاتین با تلفظ زیر\",ocirc:\"حرف o کوچک لاتین با خمان\",otilde:\"حرف o کوچک لاتین با صدای کامی\",ouml:\"حرف o کوچک لاتین با نشان سواگیری\",divide:\"نشان بخش\",oslash:\"حرف o کوچک لاتین با میان خط\",ugrave:\"حرف u کوچک لاتین با تلفظ درشت\",uacute:\"حرف u کوچک لاتین با تلفظ ریز\",ucirc:\"حرف u کوچک لاتین با خمان\",uuml:\"حرف u کوچک لاتین با نشان سواگیری\",yacute:\"حرف y کوچک لاتین با تلفظ ریز\",\nthorn:\"حرف کوچک لاتین خاردار\",yuml:\"حرف y کوچک لاتین با نشان سواگیری\",OElig:\"بند بزرگ لاتین OE\",oelig:\"بند کوچک لاتین oe\",372:\"حرف W بزرگ لاتین با خمان\",374:\"حرف Y بزرگ لاتین با خمان\",373:\"حرف w کوچک لاتین با خمان\",375:\"حرف y کوچک لاتین با خمان\",sbquo:\"نشان نقل قول تکی زیر-9\",8219:\"نشان نقل قول تکی high-reversed-9\",bdquo:\"نقل قول دوتایی پایین-9\",hellip:\"حذف افقی\",trade:\"نشان تجاری\",9658:\"نشانگر سیاه جهت راست\",bull:\"گلوله\",rarr:\"فلش راست\",rArr:\"فلش دوتایی راست\",hArr:\"فلش دوتایی چپ راست\",diams:\"نشان الماس سیاه\",\nasymp:\"تقریبا برابر با\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/fi.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"fi\",{euro:\"Euron merkki\",lsquo:\"Vasen yksittäinen lainausmerkki\",rsquo:\"Oikea yksittäinen lainausmerkki\",ldquo:\"Vasen kaksoislainausmerkki\",rdquo:\"Oikea kaksoislainausmerkki\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Sentin merkki\",pound:\"Punnan merkki\",curren:\"Valuuttamerkki\",yen:\"Yenin merkki\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Copyright sign\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Rekisteröity merkki\",macr:\"Macron\",deg:\"Asteen merkki\",sup2:\"Yläindeksi kaksi\",sup3:\"Yläindeksi kolme\",acute:\"Acute accent\",micro:\"Mikron merkki\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Yläindeksi yksi\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Ylösalaisin oleva kysymysmerkki\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Kertomerkki\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Jakomerkki\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Tavaramerkki merkki\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Nuoli oikealle\",rArr:\"Kaksoisnuoli oikealle\",hArr:\"Kaksoisnuoli oikealle ja vasemmalle\",diams:\"Black diamond suit\",asymp:\"Noin\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"fr-ca\",{euro:\"Symbole Euro\",lsquo:\"Guillemet simple ouvrant\",rsquo:\"Guillemet simple fermant\",ldquo:\"Guillemet double ouvrant\",rdquo:\"Guillemet double fermant\",ndash:\"Tiret haut\",mdash:\"Tiret\",iexcl:\"Point d'exclamation inversé\",cent:\"Symbole de cent\",pound:\"Symbole de Livre Sterling\",curren:\"Symbole monétaire\",yen:\"Symbole du Yen\",brvbar:\"Barre scindée\",sect:\"Symbole de section\",uml:\"Tréma\",copy:\"Symbole de copyright\",ordf:\"Indicateur ordinal féminin\",laquo:\"Guillemet français ouvrant\",\nnot:\"Indicateur de négation\",reg:\"Symbole de marque déposée\",macr:\"Macron\",deg:\"Degré\",sup2:\"Exposant 2\",sup3:\"Exposant 3\",acute:\"Accent aigüe\",micro:\"Symbole micro\",para:\"Paragraphe\",middot:\"Point médian\",cedil:\"Cédille\",sup1:\"Exposant 1\",ordm:\"Indicateur ordinal masculin\",raquo:\"Guillemet français fermant\",frac14:\"Un quart\",frac12:\"Une demi\",frac34:\"Trois quart\",iquest:\"Point d'interrogation inversé\",Agrave:\"A accent grave\",Aacute:\"A accent aigüe\",Acirc:\"A circonflexe\",Atilde:\"A tilde\",Auml:\"A tréma\",\nAring:\"A avec un rond au dessus\",AElig:\"Æ majuscule\",Ccedil:\"C cédille\",Egrave:\"E accent grave\",Eacute:\"E accent aigüe\",Ecirc:\"E accent circonflexe\",Euml:\"E tréma\",Igrave:\"I accent grave\",Iacute:\"I accent aigüe\",Icirc:\"I accent circonflexe\",Iuml:\"I tréma\",ETH:\"Lettre majuscule islandaise ED\",Ntilde:\"N tilde\",Ograve:\"O accent grave\",Oacute:\"O accent aigüe\",Ocirc:\"O accent circonflexe\",Otilde:\"O tilde\",Ouml:\"O tréma\",times:\"Symbole de multiplication\",Oslash:\"O barré\",Ugrave:\"U accent grave\",Uacute:\"U accent aigüe\",\nUcirc:\"U accent circonflexe\",Uuml:\"U tréma\",Yacute:\"Y accent aigüe\",THORN:\"Lettre islandaise Thorn majuscule\",szlig:\"Lettre minuscule allemande s dur\",agrave:\"a accent grave\",aacute:\"a accent aigüe\",acirc:\"a accent circonflexe\",atilde:\"a tilde\",auml:\"a tréma\",aring:\"a avec un cercle au dessus\",aelig:\"æ\",ccedil:\"c cédille\",egrave:\"e accent grave\",eacute:\"e accent aigüe\",ecirc:\"e accent circonflexe\",euml:\"e tréma\",igrave:\"i accent grave\",iacute:\"i accent aigüe\",icirc:\"i accent circonflexe\",iuml:\"i tréma\",\neth:\"Lettre minuscule islandaise ED\",ntilde:\"n tilde\",ograve:\"o accent grave\",oacute:\"o accent aigüe\",ocirc:\"O accent circonflexe\",otilde:\"O tilde\",ouml:\"O tréma\",divide:\"Symbole de division\",oslash:\"o barré\",ugrave:\"u accent grave\",uacute:\"u accent aigüe\",ucirc:\"u accent circonflexe\",uuml:\"u tréma\",yacute:\"y accent aigüe\",thorn:\"Lettre islandaise thorn minuscule\",yuml:\"y tréma\",OElig:\"ligature majuscule latine Œ\",oelig:\"ligature minuscule latine œ\",372:\"W accent circonflexe\",374:\"Y accent circonflexe\",\n373:\"w accent circonflexe\",375:\"y accent circonflexe\",sbquo:\"Guillemet simple fermant\",8219:\"Guillemet-virgule supérieur culbuté\",bdquo:\"Guillemet-virgule double inférieur\",hellip:\"Points de suspension\",trade:\"Symbole de marque déposée\",9658:\"Flèche noire pointant vers la droite\",bull:\"Puce\",rarr:\"Flèche vers la droite\",rArr:\"Flèche double vers la droite\",hArr:\"Flèche double vers la gauche\",diams:\"Carreau\",asymp:\"Presque égal\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/fr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"fr\",{euro:\"Symbole Euro\",lsquo:\"Guillemet simple ouvrant\",rsquo:\"Guillemet simple fermant\",ldquo:\"Guillemet double ouvrant\",rdquo:\"Guillemet double fermant\",ndash:\"Tiret haut\",mdash:\"Tiret cadratin\",iexcl:\"Point d'exclamation inversé\",cent:\"Symbole Cent\",pound:\"Symbole Livre Sterling\",curren:\"Symbole monétaire\",yen:\"Symbole Yen\",brvbar:\"Barre verticale scindée\",sect:\"Section\",uml:\"Tréma\",copy:\"Symbole Copyright\",ordf:\"Indicateur ordinal féminin\",laquo:\"Guillemet français ouvrant\",\nnot:\"Crochet de négation\",reg:\"Marque déposée\",macr:\"Macron\",deg:\"Degré\",sup2:\"Exposant 2\",sup3:\"Exposant 3\",acute:\"Accent aigu\",micro:\"Omicron\",para:\"Paragraphe\",middot:\"Point médian\",cedil:\"Cédille\",sup1:\"Exposant 1\",ordm:\"Indicateur ordinal masculin\",raquo:\"Guillemet français fermant\",frac14:\"Un quart\",frac12:\"Un demi\",frac34:\"Trois quarts\",iquest:\"Point d'interrogation inversé\",Agrave:\"A majuscule accent grave\",Aacute:\"A majuscule accent aigu\",Acirc:\"A majuscule accent circonflexe\",Atilde:\"A majuscule avec caron\",\nAuml:\"A majuscule tréma\",Aring:\"A majuscule avec un rond au-dessus\",AElig:\"Æ majuscule ligaturés\",Ccedil:\"C majuscule cédille\",Egrave:\"E majuscule accent grave\",Eacute:\"E majuscule accent aigu\",Ecirc:\"E majuscule accent circonflexe\",Euml:\"E majuscule tréma\",Igrave:\"I majuscule accent grave\",Iacute:\"I majuscule accent aigu\",Icirc:\"I majuscule accent circonflexe\",Iuml:\"I majuscule tréma\",ETH:\"Lettre majuscule islandaise ED\",Ntilde:\"N majuscule avec caron\",Ograve:\"O majuscule accent grave\",Oacute:\"O majuscule accent aigu\",\nOcirc:\"O majuscule accent circonflexe\",Otilde:\"O majuscule avec caron\",Ouml:\"O majuscule tréma\",times:\"Multiplication\",Oslash:\"O majuscule barré\",Ugrave:\"U majuscule accent grave\",Uacute:\"U majuscule accent aigu\",Ucirc:\"U majuscule accent circonflexe\",Uuml:\"U majuscule tréma\",Yacute:\"Y majuscule accent aigu\",THORN:\"Lettre islandaise Thorn majuscule\",szlig:\"Lettre minuscule allemande s dur\",agrave:\"a minuscule accent grave\",aacute:\"a minuscule accent aigu\",acirc:\"a minuscule accent circonflexe\",atilde:\"a minuscule avec caron\",\nauml:\"a minuscule tréma\",aring:\"a minuscule avec un rond au-dessus\",aelig:\"æ minuscule ligaturés\",ccedil:\"c minuscule cédille\",egrave:\"e minuscule accent grave\",eacute:\"e minuscule accent aigu\",ecirc:\"e minuscule accent circonflexe\",euml:\"e minuscule tréma\",igrave:\"i minuscule accent grave\",iacute:\"i minuscule accent aigu\",icirc:\"i minuscule accent circonflexe\",iuml:\"i minuscule tréma\",eth:\"Lettre minuscule islandaise ED\",ntilde:\"n minuscule avec caron\",ograve:\"o minuscule accent grave\",oacute:\"o minuscule accent aigu\",\nocirc:\"o minuscule accent circonflexe\",otilde:\"o minuscule avec caron\",ouml:\"o minuscule tréma\",divide:\"Division\",oslash:\"o minuscule barré\",ugrave:\"u minuscule accent grave\",uacute:\"u minuscule accent aigu\",ucirc:\"u minuscule accent circonflexe\",uuml:\"u minuscule tréma\",yacute:\"y minuscule accent aigu\",thorn:\"Lettre islandaise thorn minuscule\",yuml:\"y minuscule tréma\",OElig:\"ligature majuscule latine Œ\",oelig:\"ligature minuscule latine œ\",372:\"W majuscule accent circonflexe\",374:\"Y majuscule accent circonflexe\",\n373:\"w minuscule accent circonflexe\",375:\"y minuscule accent circonflexe\",sbquo:\"Guillemet simple fermant (anglais)\",8219:\"Guillemet-virgule supérieur culbuté\",bdquo:\"Guillemet-virgule double inférieur\",hellip:\"Points de suspension\",trade:\"Marque commerciale (trade mark)\",9658:\"Flèche noire pointant vers la droite\",bull:\"Gros point médian\",rarr:\"Flèche vers la droite\",rArr:\"Double flèche vers la droite\",hArr:\"Double flèche vers la gauche\",diams:\"Carreau noir\",asymp:\"Presque égal\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/gl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"gl\",{euro:\"Símbolo do euro\",lsquo:\"Comiña simple esquerda\",rsquo:\"Comiña simple dereita\",ldquo:\"Comiñas dobres esquerda\",rdquo:\"Comiñas dobres dereita\",ndash:\"Guión\",mdash:\"Raia\",iexcl:\"Signo de admiración invertido\",cent:\"Símbolo do centavo\",pound:\"Símbolo da libra\",curren:\"Símbolo de moeda\",yen:\"Símbolo do yen\",brvbar:\"Barra vertical rota\",sect:\"Símbolo de sección\",uml:\"Diérese\",copy:\"Símbolo de dereitos de autoría\",ordf:\"Indicador ordinal feminino\",laquo:\"Comiñas latinas, apertura\",\nnot:\"Signo negación\",reg:\"Símbolo de marca rexistrada\",macr:\"Guión alto\",deg:\"Signo de grao\",sup2:\"Superíndice dous\",sup3:\"Superíndice tres\",acute:\"Acento agudo\",micro:\"Signo de micro\",para:\"Signo de pi\",middot:\"Punto medio\",cedil:\"Cedilla\",sup1:\"Superíndice un\",ordm:\"Indicador ordinal masculino\",raquo:\"Comiñas latinas, peche\",frac14:\"Fracción ordinaria de un cuarto\",frac12:\"Fracción ordinaria de un medio\",frac34:\"Fracción ordinaria de tres cuartos\",iquest:\"Signo de interrogación invertido\",Agrave:\"Letra A latina maiúscula con acento grave\",\nAacute:\"Letra A latina maiúscula con acento agudo\",Acirc:\"Letra A latina maiúscula con acento circunflexo\",Atilde:\"Letra A latina maiúscula con til\",Auml:\"Letra A latina maiúscula con diérese\",Aring:\"Letra A latina maiúscula con aro enriba\",AElig:\"Letra Æ latina maiúscula\",Ccedil:\"Letra C latina maiúscula con cedilla\",Egrave:\"Letra E latina maiúscula con acento grave\",Eacute:\"Letra E latina maiúscula con acento agudo\",Ecirc:\"Letra E latina maiúscula con acento circunflexo\",Euml:\"Letra E latina maiúscula con diérese\",\nIgrave:\"Letra I latina maiúscula con acento grave\",Iacute:\"Letra I latina maiúscula con acento agudo\",Icirc:\"Letra I latina maiúscula con acento circunflexo\",Iuml:\"Letra I latina maiúscula con diérese\",ETH:\"Letra Ed latina maiúscula\",Ntilde:\"Letra N latina maiúscula con til\",Ograve:\"Letra O latina maiúscula con acento grave\",Oacute:\"Letra O latina maiúscula con acento agudo\",Ocirc:\"Letra O latina maiúscula con acento circunflexo\",Otilde:\"Letra O latina maiúscula con til\",Ouml:\"Letra O latina maiúscula con diérese\",\ntimes:\"Signo de multiplicación\",Oslash:\"Letra O latina maiúscula con barra transversal\",Ugrave:\"Letra U latina maiúscula con acento grave\",Uacute:\"Letra U latina maiúscula con acento agudo\",Ucirc:\"Letra U latina maiúscula con acento circunflexo\",Uuml:\"Letra U latina maiúscula con diérese\",Yacute:\"Letra Y latina maiúscula con acento agudo\",THORN:\"Letra Thorn latina maiúscula\",szlig:\"Letra s latina forte minúscula\",agrave:\"Letra a latina minúscula con acento grave\",aacute:\"Letra a latina minúscula con acento agudo\",\nacirc:\"Letra a latina minúscula con acento circunflexo\",atilde:\"Letra a latina minúscula con til\",auml:\"Letra a latina minúscula con diérese\",aring:\"Letra a latina minúscula con aro enriba\",aelig:\"Letra æ latina minúscula\",ccedil:\"Letra c latina minúscula con cedilla\",egrave:\"Letra e latina minúscula con acento grave\",eacute:\"Letra e latina minúscula con acento agudo\",ecirc:\"Letra e latina minúscula con acento circunflexo\",euml:\"Letra e latina minúscula con diérese\",igrave:\"Letra i latina minúscula con acento grave\",\niacute:\"Letra i latina minúscula con acento agudo\",icirc:\"Letra i latina minúscula con acento circunflexo\",iuml:\"Letra i latina minúscula con diérese\",eth:\"Letra ed latina minúscula\",ntilde:\"Letra n latina minúscula con til\",ograve:\"Letra o latina minúscula con acento grave\",oacute:\"Letra o latina minúscula con acento agudo\",ocirc:\"Letra o latina minúscula con acento circunflexo\",otilde:\"Letra o latina minúscula con til\",ouml:\"Letra o latina minúscula con diérese\",divide:\"Signo de división\",oslash:\"Letra o latina minúscula con barra transversal\",\nugrave:\"Letra u latina minúscula con acento grave\",uacute:\"Letra u latina minúscula con acento agudo\",ucirc:\"Letra u latina minúscula con acento circunflexo\",uuml:\"Letra u latina minúscula con diérese\",yacute:\"Letra y latina minúscula con acento agudo\",thorn:\"Letra Thorn latina minúscula\",yuml:\"Letra y latina minúscula con diérese\",OElig:\"Ligadura OE latina maiúscula\",oelig:\"Ligadura oe latina minúscula\",372:\"Letra W latina maiúscula con acento circunflexo\",374:\"Letra Y latina maiúscula con acento circunflexo\",\n373:\"Letra w latina minúscula con acento circunflexo\",375:\"Letra y latina minúscula con acento circunflexo\",sbquo:\"Comiña simple baixa, de apertura\",8219:\"Comiña simple alta, de peche\",bdquo:\"Comiñas dobres baixas, de apertura\",hellip:\"Elipse, puntos suspensivos\",trade:\"Signo de marca rexistrada\",9658:\"Apuntador negro apuntando á dereita\",bull:\"Viñeta\",rarr:\"Frecha á dereita\",rArr:\"Frecha dobre á dereita\",hArr:\"Frecha dobre da esquerda á dereita\",diams:\"Diamante negro\",asymp:\"Case igual a\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/he.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"he\",{euro:\"יורו\",lsquo:\"סימן ציטוט יחיד שמאלי\",rsquo:\"סימן ציטוט יחיד ימני\",ldquo:\"סימן ציטוט כפול שמאלי\",rdquo:\"סימן ציטוט כפול ימני\",ndash:\"קו מפריד קצר\",mdash:\"קו מפריד ארוך\",iexcl:\"סימן קריאה הפוך\",cent:\"סנט\",pound:\"פאונד\",curren:\"מטבע\",yen:\"ין\",brvbar:\"קו שבור\",sect:\"סימן מקטע\",uml:\"שתי נקודות אופקיות (Diaeresis)\",copy:\"סימן זכויות יוצרים (Copyright)\",ordf:\"סימן אורדינאלי נקבי\",laquo:\"סימן ציטוט זווית כפולה לשמאל\",not:\"סימן שלילה מתמטי\",reg:\"סימן רשום\",\nmacr:\"מקרון (הגיה ארוכה)\",deg:\"מעלות\",sup2:\"2 בכתיב עילי\",sup3:\"3 בכתיב עילי\",acute:\"סימן דגוש (Acute)\",micro:\"מיקרו\",para:\"סימון פסקה\",middot:\"נקודה אמצעית\",cedil:\"סדיליה\",sup1:\"1 בכתיב עילי\",ordm:\"סימן אורדינאלי זכרי\",raquo:\"סימן ציטוט זווית כפולה לימין\",frac14:\"רבע בשבר פשוט\",frac12:\"חצי בשבר פשוט\",frac34:\"שלושה רבעים בשבר פשוט\",iquest:\"סימן שאלה הפוך\",Agrave:\"אות לטינית A עם גרש (Grave)\",Aacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",\nAuml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"אות לטינית Æ גדולה\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"אות לטינית E עם גרש (Grave)\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"אות לטינית I עם גרש (Grave)\",Iacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",\nETH:\"אות לטינית Eth גדולה\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"אות לטינית O עם גרש (Grave)\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"סימן כפל\",Oslash:\"Latin capital letter O with stroke\",Ugrave:\"אות לטינית U עם גרש (Grave)\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",\nYacute:\"Latin capital letter Y with acute accent\",THORN:\"אות לטינית Thorn גדולה\",szlig:\"אות לטינית s חדה קטנה\",agrave:\"אות לטינית a עם גרש (Grave)\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",aring:\"Latin small letter a with ring above\",aelig:\"אות לטינית æ קטנה\",ccedil:\"Latin small letter c with cedilla\",egrave:\"אות לטינית e עם גרש (Grave)\",eacute:\"Latin small letter e with acute accent\",\necirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"אות לטינית i עם גרש (Grave)\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"אות לטינית eth קטנה\",ntilde:\"Latin small letter n with tilde\",ograve:\"אות לטינית o עם גרש (Grave)\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",\ndivide:\"סימן חלוקה\",oslash:\"Latin small letter o with stroke\",ugrave:\"אות לטינית u עם גרש (Grave)\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",yacute:\"Latin small letter y with acute accent\",thorn:\"אות לטינית thorn קטנה\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",\n373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"סימן ציטוט נמוך יחיד\",8219:\"סימן ציטוט\",bdquo:\"סימן ציטוט נמוך כפול\",hellip:\"שלוש נקודות\",trade:\"סימן טריידמארק\",9658:\"סמן שחור לצד ימין\",bull:\"תבליט (רשימה)\",rarr:\"חץ לימין\",rArr:\"חץ כפול לימין\",hArr:\"חץ כפול לימין ושמאל\",diams:\"יהלום מלא\",asymp:\"כמעט שווה\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/hr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"hr\",{euro:\"Euro znak\",lsquo:\"Lijevi jednostruki navodnik\",rsquo:\"Desni jednostruki navodnik\",ldquo:\"Lijevi dvostruki navodnik\",rdquo:\"Desni dvostruki navodnik\",ndash:\"En crtica\",mdash:\"Em crtica\",iexcl:\"Naopaki uskličnik\",cent:\"Cent znak\",pound:\"Funta znak\",curren:\"Znak valute\",yen:\"Yen znak\",brvbar:\"Potrgana prečka\",sect:\"Znak odjeljka\",uml:\"Prijeglasi\",copy:\"Copyright znak\",ordf:\"Feminine ordinal indicator\",laquo:\"Lijevi dvostruki uglati navodnik\",not:\"Not znak\",\nreg:\"Registered znak\",macr:\"Macron\",deg:\"Stupanj znak\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Mikro znak\",para:\"Pilcrow sign\",middot:\"Srednja točka\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Desni dvostruku uglati navodnik\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Naopaki upitnik\",Agrave:\"Veliko latinsko slovo A s akcentom\",Aacute:\"Latinično veliko slovo A sa oštrim naglaskom\",\nAcirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",Iacute:\"Latin capital letter I with acute accent\",\nIcirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",Ugrave:\"Latin capital letter U with grave accent\",\nUacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",aring:\"Latin small letter a with ring above\",\naelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",ntilde:\"Latin small letter n with tilde\",\nograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",yacute:\"Latin small letter y with acute accent\",\nthorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",trade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",\nbull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/hu.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"hu\",{euro:\"Euró jel\",lsquo:\"Bal szimpla idézőjel\",rsquo:\"Jobb szimpla idézőjel\",ldquo:\"Bal dupla idézőjel\",rdquo:\"Jobb dupla idézőjel\",ndash:\"Rövid gondolatjel\",mdash:\"Hosszú gondolatjel\",iexcl:\"Fordított felkiáltójel\",cent:\"Cent jel\",pound:\"Font jel\",curren:\"Valuta jel\",yen:\"Yen jel\",brvbar:\"Hosszú kettőspont\",sect:\"Paragrafus jel\",uml:\"Kettős hangzó jel\",copy:\"Szerzői jog jel\",ordf:\"Női sorrend mutatója\",laquo:\"Balra mutató duplanyíl\",not:\"Feltételes kötőjel\",\nreg:\"Bejegyzett védjegy jele\",macr:\"Hosszúsági jel\",deg:\"Fok jel\",sup2:\"Négyzeten jel\",sup3:\"Köbön jel\",acute:\"Éles ékezet\",micro:\"Mikro-jel\",para:\"Bekezdés jel\",middot:\"Közép pont\",cedil:\"Cédille\",sup1:\"Elsőn jel\",ordm:\"Férfi sorrend mutatója\",raquo:\"Jobbra mutató duplanyíl\",frac14:\"Egy negyed jel\",frac12:\"Egy ketted jel\",frac34:\"Három negyed jel\",iquest:\"Fordított kérdőjel\",Agrave:\"Latin nagy A fordított ékezettel\",Aacute:\"Latin nagy A normál ékezettel\",Acirc:\"Latin nagy A hajtott ékezettel\",Atilde:\"Latin nagy A hullámjellel\",\nAuml:\"Latin nagy A kettőspont ékezettel\",Aring:\"Latin nagy A gyűrű ékezettel\",AElig:\"Latin nagy Æ betű\",Ccedil:\"Latin nagy C cedillával\",Egrave:\"Latin nagy E fordított ékezettel\",Eacute:\"Latin nagy E normál ékezettel\",Ecirc:\"Latin nagy E hajtott ékezettel\",Euml:\"Latin nagy E dupla kettőspont ékezettel\",Igrave:\"Latin nagy I fordított ékezettel\",Iacute:\"Latin nagy I normál ékezettel\",Icirc:\"Latin nagy I hajtott ékezettel\",Iuml:\"Latin nagy I kettőspont ékezettel\",ETH:\"Latin nagy Eth betű\",Ntilde:\"Latin nagy N hullámjellel\",\nOgrave:\"Latin nagy O fordított ékezettel\",Oacute:\"Latin nagy O normál ékezettel\",Ocirc:\"Latin nagy O hajtott ékezettel\",Otilde:\"Latin nagy O hullámjellel\",Ouml:\"Latin nagy O kettőspont ékezettel\",times:\"Szorzás jel\",Oslash:\"Latin O betű áthúzással\",Ugrave:\"Latin nagy U fordított ékezettel\",Uacute:\"Latin nagy U normál ékezettel\",Ucirc:\"Latin nagy U hajtott ékezettel\",Uuml:\"Latin nagy U kettőspont ékezettel\",Yacute:\"Latin nagy Y normál ékezettel\",THORN:\"Latin nagy Thorn betű\",szlig:\"Latin kis s betű\",\nagrave:\"Latin kis a fordított ékezettel\",aacute:\"Latin kis a normál ékezettel\",acirc:\"Latin kis a hajtott ékezettel\",atilde:\"Latin kis a hullámjellel\",auml:\"Latin kis a kettőspont ékezettel\",aring:\"Latin kis a gyűrű ékezettel\",aelig:\"Latin kis æ betű\",ccedil:\"Latin kis c cedillával\",egrave:\"Latin kis e fordított ékezettel\",eacute:\"Latin kis e normál ékezettel\",ecirc:\"Latin kis e hajtott ékezettel\",euml:\"Latin kis e dupla kettőspont ékezettel\",igrave:\"Latin kis i fordított ékezettel\",iacute:\"Latin kis i normál ékezettel\",\nicirc:\"Latin kis i hajtott ékezettel\",iuml:\"Latin kis i kettőspont ékezettel\",eth:\"Latin kis eth betű\",ntilde:\"Latin kis n hullámjellel\",ograve:\"Latin kis o fordított ékezettel\",oacute:\"Latin kis o normál ékezettel\",ocirc:\"Latin kis o hajtott ékezettel\",otilde:\"Latin kis o hullámjellel\",ouml:\"Latin kis o kettőspont ékezettel\",divide:\"Osztásjel\",oslash:\"Latin kis o betű áthúzással\",ugrave:\"Latin kis u fordított ékezettel\",uacute:\"Latin kis u normál ékezettel\",ucirc:\"Latin kis u hajtott ékezettel\",\nuuml:\"Latin kis u kettőspont ékezettel\",yacute:\"Latin kis y normál ékezettel\",thorn:\"Latin kis thorn jel\",yuml:\"Latin kis y kettőspont ékezettel\",OElig:\"Latin nagy OE-jel\",oelig:\"Latin kis oe-jel\",372:\"Latin nagy W hajtott ékezettel\",374:\"Latin nagy Y hajtott ékezettel\",373:\"Latin kis w hajtott ékezettel\",375:\"Latin kis y hajtott ékezettel\",sbquo:\"Nyitó nyomdai szimpla idézőjel\",8219:\"Záró nyomdai záró idézőjel\",bdquo:\"Nyitó nyomdai dupla idézőjel\",hellip:\"Három pont\",trade:\"Kereskedelmi védjegy jele\",\n9658:\"Jobbra mutató fekete mutató\",bull:\"Golyó\",rarr:\"Jobbra mutató nyíl\",rArr:\"Jobbra mutató duplanyíl\",hArr:\"Bal-jobb duplanyíl\",diams:\"Fekete gyémánt jel\",asymp:\"Majdnem egyenlő jel\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/id.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"id\",{euro:\"Tanda Euro\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Cent sign\",pound:\"Pound sign\",curren:\"Currency sign\",yen:\"Tanda Yen\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Tanda Hak Cipta\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Tanda Telah Terdaftar\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/it.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"it\",{euro:\"Simbolo Euro\",lsquo:\"Virgoletta singola sinistra\",rsquo:\"Virgoletta singola destra\",ldquo:\"Virgolette aperte\",rdquo:\"Virgolette chiuse\",ndash:\"Trattino\",mdash:\"Trattino lungo\",iexcl:\"Punto esclavamativo invertito\",cent:\"Simbolo Cent\",pound:\"Simbolo Sterlina\",curren:\"Simbolo Moneta\",yen:\"Simbolo Yen\",brvbar:\"Barra interrotta\",sect:\"Simbolo di sezione\",uml:\"Dieresi\",copy:\"Simbolo Copyright\",ordf:\"Indicatore ordinale femminile\",laquo:\"Virgolette basse aperte\",\nnot:\"Nessun segno\",reg:\"Simbolo Registrato\",macr:\"Macron\",deg:\"Simbolo Grado\",sup2:\"Apice Due\",sup3:\"Apice Tre\",acute:\"Accento acuto\",micro:\"Simbolo Micro\",para:\"Simbolo Paragrafo\",middot:\"Punto centrale\",cedil:\"Cediglia\",sup1:\"Apice Uno\",ordm:\"Indicatore ordinale maschile\",raquo:\"Virgolette basse chiuse\",frac14:\"Frazione volgare un quarto\",frac12:\"Frazione volgare un mezzo\",frac34:\"Frazione volgare tre quarti\",iquest:\"Punto interrogativo invertito\",Agrave:\"Lettera maiuscola latina A con accento grave\",\nAacute:\"Lettera maiuscola latina A con accento acuto\",Acirc:\"Lettera maiuscola latina A con accento circonflesso\",Atilde:\"Lettera maiuscola latina A con tilde\",Auml:\"Lettera maiuscola latina A con dieresi\",Aring:\"Lettera maiuscola latina A con anello sopra\",AElig:\"Lettera maiuscola latina AE\",Ccedil:\"Lettera maiuscola latina C con cediglia\",Egrave:\"Lettera maiuscola latina E con accento grave\",Eacute:\"Lettera maiuscola latina E con accento acuto\",Ecirc:\"Lettera maiuscola latina E con accento circonflesso\",\nEuml:\"Lettera maiuscola latina E con dieresi\",Igrave:\"Lettera maiuscola latina I con accento grave\",Iacute:\"Lettera maiuscola latina I con accento acuto\",Icirc:\"Lettera maiuscola latina I con accento circonflesso\",Iuml:\"Lettera maiuscola latina I con dieresi\",ETH:\"Lettera maiuscola latina Eth\",Ntilde:\"Lettera maiuscola latina N con tilde\",Ograve:\"Lettera maiuscola latina O con accento grave\",Oacute:\"Lettera maiuscola latina O con accento acuto\",Ocirc:\"Lettera maiuscola latina O con accento circonflesso\",\nOtilde:\"Lettera maiuscola latina O con tilde\",Ouml:\"Lettera maiuscola latina O con dieresi\",times:\"Simbolo di moltiplicazione\",Oslash:\"Lettera maiuscola latina O barrata\",Ugrave:\"Lettera maiuscola latina U con accento grave\",Uacute:\"Lettera maiuscola latina U con accento acuto\",Ucirc:\"Lettera maiuscola latina U con accento circonflesso\",Uuml:\"Lettera maiuscola latina U con accento circonflesso\",Yacute:\"Lettera maiuscola latina Y con accento acuto\",THORN:\"Lettera maiuscola latina Thorn\",szlig:\"Lettera latina minuscola doppia S\",\nagrave:\"Lettera minuscola latina a con accento grave\",aacute:\"Lettera minuscola latina a con accento acuto\",acirc:\"Lettera minuscola latina a con accento circonflesso\",atilde:\"Lettera minuscola latina a con tilde\",auml:\"Lettera minuscola latina a con dieresi\",aring:\"Lettera minuscola latina a con anello superiore\",aelig:\"Lettera minuscola latina ae\",ccedil:\"Lettera minuscola latina c con cediglia\",egrave:\"Lettera minuscola latina e con accento grave\",eacute:\"Lettera minuscola latina e con accento acuto\",\necirc:\"Lettera minuscola latina e con accento circonflesso\",euml:\"Lettera minuscola latina e con dieresi\",igrave:\"Lettera minuscola latina i con accento grave\",iacute:\"Lettera minuscola latina i con accento acuto\",icirc:\"Lettera minuscola latina i con accento circonflesso\",iuml:\"Lettera minuscola latina i con dieresi\",eth:\"Lettera minuscola latina eth\",ntilde:\"Lettera minuscola latina n con tilde\",ograve:\"Lettera minuscola latina o con accento grave\",oacute:\"Lettera minuscola latina o con accento acuto\",\nocirc:\"Lettera minuscola latina o con accento circonflesso\",otilde:\"Lettera minuscola latina o con tilde\",ouml:\"Lettera minuscola latina o con dieresi\",divide:\"Simbolo di divisione\",oslash:\"Lettera minuscola latina o barrata\",ugrave:\"Lettera minuscola latina u con accento grave\",uacute:\"Lettera minuscola latina u con accento acuto\",ucirc:\"Lettera minuscola latina u con accento circonflesso\",uuml:\"Lettera minuscola latina u con dieresi\",yacute:\"Lettera minuscola latina y con accento acuto\",thorn:\"Lettera minuscola latina thorn\",\nyuml:\"Lettera minuscola latina y con dieresi\",OElig:\"Legatura maiuscola latina OE\",oelig:\"Legatura minuscola latina oe\",372:\"Lettera maiuscola latina W con accento circonflesso\",374:\"Lettera maiuscola latina Y con accento circonflesso\",373:\"Lettera minuscola latina w con accento circonflesso\",375:\"Lettera minuscola latina y con accento circonflesso\",sbquo:\"Singola virgoletta bassa low-9\",8219:\"Singola virgoletta bassa low-9 inversa\",bdquo:\"Doppia virgoletta bassa low-9\",hellip:\"Ellissi orizzontale\",\ntrade:\"Simbolo TM\",9658:\"Puntatore nero rivolto verso destra\",bull:\"Punto\",rarr:\"Freccia verso destra\",rArr:\"Doppia freccia verso destra\",hArr:\"Doppia freccia sinistra destra\",diams:\"Simbolo nero diamante\",asymp:\"Quasi uguale a\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ja.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ja\",{euro:\"ユーロ記号\",lsquo:\"左シングル引用符\",rsquo:\"右シングル引用符\",ldquo:\"左ダブル引用符\",rdquo:\"右ダブル引用符\",ndash:\"半角ダッシュ\",mdash:\"全角ダッシュ\",iexcl:\"逆さ感嘆符\",cent:\"セント記号\",pound:\"ポンド記号\",curren:\"通貨記号\",yen:\"円記号\",brvbar:\"上下に分かれた縦棒\",sect:\"節記号\",uml:\"分音記号(ウムラウト)\",copy:\"著作権表示記号\",ordf:\"女性序数標識\",laquo:\" 始め二重山括弧引用記号\",not:\"論理否定記号\",reg:\"登録商標記号\",macr:\"長音符\",deg:\"度記号\",sup2:\"上つき2, 2乗\",sup3:\"上つき3, 3乗\",acute:\"揚音符\",micro:\"ミクロン記号\",para:\"段落記号\",middot:\"中黒\",cedil:\"セディラ\",sup1:\"上つき1\",ordm:\"男性序数標識\",raquo:\"終わり二重山括弧引用記号\",\nfrac14:\"四分の一\",frac12:\"二分の一\",frac34:\"四分の三\",iquest:\"逆疑問符\",Agrave:\"抑音符つき大文字A\",Aacute:\"揚音符つき大文字A\",Acirc:\"曲折アクセントつき大文字A\",Atilde:\"チルダつき大文字A\",Auml:\"分音記号つき大文字A\",Aring:\"リングつき大文字A\",AElig:\"AとEの合字\",Ccedil:\"セディラつき大文字C\",Egrave:\"抑音符つき大文字E\",Eacute:\"揚音符つき大文字E\",Ecirc:\"曲折アクセントつき大文字E\",Euml:\"分音記号つき大文字E\",Igrave:\"抑音符つき大文字I\",Iacute:\"揚音符つき大文字I\",Icirc:\"曲折アクセントつき大文字I\",Iuml:\"分音記号つき大文字I\",ETH:\"[アイスランド語]大文字ETH\",Ntilde:\"チルダつき大文字N\",Ograve:\"抑音符つき大文字O\",Oacute:\"揚音符つき大文字O\",Ocirc:\"曲折アクセントつき大文字O\",Otilde:\"チルダつき大文字O\",Ouml:\" 分音記号つき大文字O\",\ntimes:\"乗算記号\",Oslash:\"打ち消し線つき大文字O\",Ugrave:\"抑音符つき大文字U\",Uacute:\"揚音符つき大文字U\",Ucirc:\"曲折アクセントつき大文字U\",Uuml:\"分音記号つき大文字U\",Yacute:\"揚音符つき大文字Y\",THORN:\"[アイスランド語]大文字THORN\",szlig:\"ドイツ語エスツェット\",agrave:\"抑音符つき小文字a\",aacute:\"揚音符つき小文字a\",acirc:\"曲折アクセントつき小文字a\",atilde:\"チルダつき小文字a\",auml:\"分音記号つき小文字a\",aring:\"リングつき小文字a\",aelig:\"aとeの合字\",ccedil:\"セディラつき小文字c\",egrave:\"抑音符つき小文字e\",eacute:\"揚音符つき小文字e\",ecirc:\"曲折アクセントつき小文字e\",euml:\"分音記号つき小文字e\",igrave:\"抑音符つき小文字i\",iacute:\"揚音符つき小文字i\",icirc:\"曲折アクセントつき小文字i\",iuml:\"分音記号つき小文字i\",eth:\"アイスランド語小文字eth\",\nntilde:\"チルダつき小文字n\",ograve:\"抑音符つき小文字o\",oacute:\"揚音符つき小文字o\",ocirc:\"曲折アクセントつき小文字o\",otilde:\"チルダつき小文字o\",ouml:\"分音記号つき小文字o\",divide:\"除算記号\",oslash:\"打ち消し線つき小文字o\",ugrave:\"抑音符つき小文字u\",uacute:\"揚音符つき小文字u\",ucirc:\"曲折アクセントつき小文字u\",uuml:\"分音記号つき小文字u\",yacute:\"揚音符つき小文字y\",thorn:\"アイスランド語小文字thorn\",yuml:\"分音記号つき小文字y\",OElig:\"OとEの合字\",oelig:\"oとeの合字\",372:\"曲折アクセントつき大文字W\",374:\"曲折アクセントつき大文字Y\",373:\"曲折アクセントつき小文字w\",375:\"曲折アクセントつき小文字y\",sbquo:\"シングル下引用符\",8219:\"左右逆の左引用符\",bdquo:\"ダブル下引用符\",hellip:\"三点リーダ\",trade:\"商標記号\",9658:\"右黒三角ポインタ\",bull:\"黒丸\",\nrarr:\"右矢印\",rArr:\"右二重矢印\",hArr:\"左右二重矢印\",diams:\"ダイヤ\",asymp:\"漸近\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/km.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"km\",{euro:\"សញ្ញា​អឺរ៉ូ\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"សញ្ញា​សេន\",pound:\"សញ្ញា​ផោន\",curren:\"សញ្ញា​រូបិយបណ្ណ\",yen:\"សញ្ញា​យ៉េន\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"សញ្ញា​រក្សា​សិទ្ធិ\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Registered sign\",macr:\"Macron\",deg:\"សញ្ញា​ដឺក្រេ\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"សញ្ញា​មីក្រូ\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ko.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ko\",{euro:\"유로화 기호\",lsquo:\"왼쪽 외 따옴표\",rsquo:\"오른쪽 외 따옴표\",ldquo:\"왼쪽 쌍 따옴표\",rdquo:\"오른쪽 쌍 따옴표\",ndash:\"반각 대시\",mdash:\"전각 대시\",iexcl:\"반전된 느낌표\",cent:\"센트 기호\",pound:\"파운드화 기호\",curren:\"커런시 기호\",yen:\"위안화 기호\",brvbar:\"Broken bar\",sect:\"섹션 기호\",uml:\"분음 부호\",copy:\"저작권 기호\",ordf:\"Feminine ordinal indicator\",laquo:\"왼쪽 쌍꺽쇠 인용 부호\",not:\"금지 기호\",reg:\"등록 기호\",macr:\"장음 기호\",deg:\"도 기호\",sup2:\"위첨자 2\",sup3:\"위첨자 3\",acute:\"양음 악센트 부호\",micro:\"마이크로 기호\",para:\"단락 기호\",middot:\"가운데 점\",cedil:\"세디유\",sup1:\"위첨자 1\",\nordm:\"Masculine ordinal indicator\",raquo:\"오른쪽 쌍꺽쇠 인용 부호\",frac14:\"분수 사분의 일\",frac12:\"분수 이분의 일\",frac34:\"분수 사분의 삼\",iquest:\"뒤집힌 물음표\",Agrave:\"억음 부호가 있는 라틴 대문자 A\",Aacute:\"양음 악센트 부호가 있는 라틴 대문자 A\",Acirc:\"곡절 악센트 부호가 있는 라틴 대문자 A\",Atilde:\"틸데가 있는 라틴 대문자 A\",Auml:\"분음 기호가 있는 라틴 대문자 A\",Aring:\"윗고리가 있는 라틴 대문자 A\",AElig:\"라틴 대문자 Æ\",Ccedil:\"세디유가 있는 라틴 대문자 C\",Egrave:\"억음 부호가 있는 라틴 대문자 E\",Eacute:\"양음 악센트 부호가 있는 라틴 대문자 E\",Ecirc:\"곡절 악센트 부호가 있는 라틴 대문자 E\",Euml:\"분음 기호가 있는 라틴 대문자 E\",Igrave:\"억음 부호가 있는 라틴 대문자 I\",Iacute:\"양음 악센트 부호가 있는 라틴 대문자 I\",\nIcirc:\"곡절 악센트 부호가 있는 라틴 대문자 I\",Iuml:\"분음 기호가 있는 라틴 대문자 I\",ETH:\"라틴 대문자 Eth\",Ntilde:\"틸데가 있는 라틴 대문자 N\",Ograve:\"억음 부호가 있는 라틴 대문자 O\",Oacute:\"양음 부호가 있는 라틴 대문자 O\",Ocirc:\"곡절 악센트 부호가 있는 라틴 대문자 O\",Otilde:\"틸데가 있는 라틴 대문자 O\",Ouml:\"분음 기호가 있는 라틴 대문자 O\",times:\"곱하기 기호\",Oslash:\"사선이 있는 라틴 대문자 O\",Ugrave:\"억음 부호가 있는 라틴 대문자 U\",Uacute:\"양음 부호가 있는 라틴 대문자 U\",Ucirc:\"곡절 악센트 부호가 있는 라틴 대문자 U\",Uuml:\"분음 기호가 있는 라틴 대문자 U\",Yacute:\"양음 부호가 있는 라틴 대문자 Y\",THORN:\"라틴 대문자 Thorn\",szlig:\"라틴 소문자 sharp s\",agrave:\"억음 부호가 있는 라틴 소문자 a\",aacute:\"양음 부호가 있는 라틴 소문자 a\",\nacirc:\"곡절 악센트 부호가 있는 라틴 소문자 a\",atilde:\"틸데가 있는 라틴 소문자 a\",auml:\"분음 기호가 있는 라틴 소문자 a\",aring:\"윗고리가 있는 라틴 소문자 a\",aelig:\"라틴 소문자 æ\",ccedil:\"세디유가 있는 라틴 소문자 c\",egrave:\"억음 부호가 있는 라틴 소문자 e\",eacute:\"양음 부호가 있는 라틴 소문자 e\",ecirc:\"곡절 악센트 부호가 있는 라틴 소문자 e\",euml:\"분음 기호가 있는 라틴 소문자 e\",igrave:\"억음 부호가 있는 라틴 소문자 i\",iacute:\"양음 부호가 있는 라틴 소문자 i\",icirc:\"곡절 악센트 부호가 있는 라틴 소문자 i\",iuml:\"분음 기호가 있는 라틴 소문자 i\",eth:\"라틴 소문자 eth\",ntilde:\"틸데가 있는 라틴 소문자 n\",ograve:\"억음 부호가 있는 라틴 소문자 o\",oacute:\"양음 부호가 있는 라틴 소문자 o\",ocirc:\"곡절 악센트 부호가 있는 라틴 소문자 o\",\notilde:\"틸데가 있는 라틴 소문자 o\",ouml:\"분음 기호가 있는 라틴 소문자 o\",divide:\"나누기 기호\",oslash:\"사선이 있는 라틴 소문자 o\",ugrave:\"억음 부호가 있는 라틴 소문자 u\",uacute:\"양음 부호가 있는 라틴 소문자 u\",ucirc:\"곡절 악센트 부호가 있는 라틴 소문자 u\",uuml:\"분음 기호가 있는 라틴 소문자 u\",yacute:\"양음 부호가 있는 라틴 소문자 y\",thorn:\"라틴 소문자 thorn\",yuml:\"분음 기호가 있는 라틴 소문자 y\",OElig:\"라틴 대문합자 OE\",oelig:\"라틴 소문합자 oe\",372:\"곡절 악센트 부호가 있는 라틴 대문자 W\",374:\"곡절 악센트 부호가 있는 라틴 대문자 Y\",373:\"곡절 악센트 부호가 있는 라틴 소문자 w\",375:\"곡절 악센트 부호가 있는 라틴 소문자 y\",sbquo:\"외 아래-9 인용 부호\",8219:\"외 위쪽-뒤집힌-9 인용 부호\",bdquo:\"쌍 아래-9 인용 부호\",hellip:\"수평 생략 부호\",\ntrade:\"상표 기호\",9658:\"검정 오른쪽 포인터\",bull:\"큰 점\",rarr:\"오른쪽 화살표\",rArr:\"오른쪽 두 줄 화살표\",hArr:\"양쪽 두 줄 화살표\",diams:\"검정 다이아몬드\",asymp:\"근사\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ku.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ku\",{euro:\"نیشانەی یۆرۆ\",lsquo:\"نیشانەی فاریزەی سەرووژێری تاکی چەپ\",rsquo:\"نیشانەی فاریزەی سەرووژێری تاکی ڕاست\",ldquo:\"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ\",rdquo:\"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست\",ndash:\"تەقەڵی کورت\",mdash:\"تەقەڵی درێژ\",iexcl:\"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر\",cent:\"نیشانەی سەنت\",pound:\"نیشانەی پاوەند\",curren:\"نیشانەی دراو\",yen:\"نیشانەی یەنی ژاپۆنی\",brvbar:\"شریتی ئەستوونی پچڕاو\",sect:\"نیشانەی دوو s لەسەریەک\",uml:\"خاڵ\",copy:\"نیشانەی مافی چاپ\",\nordf:\"هێڵ لەسەر پیتی a\",laquo:\"دوو تیری بەدووایەکی چەپ\",not:\"نیشانەی نەخێر\",reg:\"نیشانەی R لەناو بازنەدا\",macr:\"ماکڕۆن\",deg:\"نیشانەی پلە\",sup2:\"سەرنووسی دوو\",sup3:\"سەرنووسی سێ\",acute:\"لاری تیژ\",micro:\"نیشانەی u لق درێژی چەپی خواروو\",para:\"نیشانەی پەڕەگراف\",middot:\"ناوەڕاستی خاڵ\",cedil:\"نیشانەی c ژێر چووکرە\",sup1:\"سەرنووسی یەک\",ordm:\"هێڵ لەژێر پیتی o\",raquo:\"دوو تیری بەدووایەکی ڕاست\",frac14:\"یەک لەسەر چووار\",frac12:\"یەک لەسەر دوو\",frac34:\"سێ لەسەر چووار\",iquest:\"هێمای هەڵەوگێری پرسیار\",Agrave:\"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار\",\nAacute:\"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ\",Acirc:\"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری\",Atilde:\"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە\",Auml:\"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری\",Aring:\"پیتی لاتینی گەورەی Å\",AElig:\"پیتی لاتینی گەورەی Æ\",Ccedil:\"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە\",Egrave:\"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار\",Eacute:\"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ\",Ecirc:\"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری\",Euml:\"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری\",\nIgrave:\"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار\",Iacute:\"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ\",Icirc:\"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری\",Iuml:\"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری\",ETH:\"پیتی لاتینی E-ی گەورەی\",Ntilde:\"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە\",Ograve:\"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار\",Oacute:\"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ\",Ocirc:\"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری\",Otilde:\"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە\",Ouml:\"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری\",\ntimes:\"نیشانەی لێکدان\",Oslash:\"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان\",Ugrave:\"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار\",Uacute:\"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ\",Ucirc:\"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری\",Uuml:\"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری\",Yacute:\"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ\",THORN:\"پیتی لاتینی دڕکی گەورە\",szlig:\"پیتی لاتنی نووک تیژی s\",agrave:\"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار\",aacute:\"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ\",acirc:\"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری\",\natilde:\"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە\",auml:\"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری\",aring:\"پیتی لاتینی å-ی بچووك\",aelig:\"پیتی لاتینی æ-ی بچووك\",ccedil:\"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە\",egrave:\"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار\",eacute:\"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ\",ecirc:\"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری\",euml:\"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری\",igrave:\"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار\",iacute:\"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ\",\nicirc:\"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری\",iuml:\"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری\",eth:\"پیتی لاتینی e-ی بچووك\",ntilde:\"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە\",ograve:\"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار\",oacute:\"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ\",ocirc:\"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری\",otilde:\"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە\",ouml:\"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری\",divide:\"نیشانەی دابەش\",oslash:\"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان\",ugrave:\"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار\",\nuacute:\"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ\",ucirc:\"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری\",uuml:\"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری\",yacute:\"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ\",thorn:\"پیتی لاتینی دڕکی بچووك\",yuml:\"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری\",OElig:\"پیتی لاتینی گەورەی پێکەوەنووسراوی OE\",oelig:\"پیتی لاتینی بچووکی پێکەوەنووسراوی oe\",372:\"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری\",374:\"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری\",373:\"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری\",\n375:\"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری\",sbquo:\"نیشانەی فاریزەی نزم\",8219:\"نیشانەی فاریزەی بەرزی پێچەوانە\",bdquo:\"دوو فاریزەی تەنیش یەك\",hellip:\"ئاسۆیی بازنە\",trade:\"نیشانەی بازرگانی\",9658:\"ئاراستەی ڕەشی دەستی ڕاست\",bull:\"فیشەك\",rarr:\"تیری دەستی ڕاست\",rArr:\"دووتیری دەستی ڕاست\",hArr:\"دوو تیری ڕاست و چەپ\",diams:\"ڕەشی پاقڵاوەیی\",asymp:\"نیشانەی یەکسانە\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/lt.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"lt\",{euro:\"Euro ženklas\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Cento ženklas\",pound:\"Svaro ženklas\",curren:\"Valiutos ženklas\",yen:\"Jenos ženklas\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Copyright sign\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Ne ženklas\",reg:\"Registered sign\",macr:\"Makronas\",deg:\"Laipsnio ženklas\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Mikro ženklas\",para:\"Pilcrow sign\",middot:\"Vidurinis taškas\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/lv.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"lv\",{euro:\"Euro zīme\",lsquo:\"Kreisā  vienkārtīga pēdiņa\",rsquo:\"Labā  vienkārtīga pēdiņa\",ldquo:\"Kreisā  dubult pēdiņa\",rdquo:\"Labā dubult pēdiņa\",ndash:\"En svītra\",mdash:\"Em svītra\",iexcl:\"Apgriezta izsaukuma zīme\",cent:\"Centu naudas zīme\",pound:\"Sterliņu mārciņu naudas zīme\",curren:\"Valūtas zīme\",yen:\"Jenu naudas zīme\",brvbar:\"Vertikāla pārrauta līnija\",sect:\"Paragrāfa zīme\",uml:\"Diakritiska zīme\",copy:\"Autortiesību zīme\",ordf:\"Sievišķas kārtas rādītājs\",\nlaquo:\"Kreisā dubult stūra pēdiņu zīme\",not:\"Neparakstīts\",reg:\"Reģistrēta zīme\",macr:\"Garumzīme\",deg:\"Grādu zīme\",sup2:\"Augšraksts divi\",sup3:\"Augšraksts trīs\",acute:\"Akūta uzsvara zīme\",micro:\"Mikro zīme\",para:\"Rindkopas zīme \",middot:\"Vidējs punkts\",cedil:\"Āķītis zem burta\",sup1:\"Augšraksts viens\",ordm:\"Vīrišķīgas kārtas rādītājs\",raquo:\"Labā dubult stūra pēdiņu zīme\",frac14:\"Vulgāra frakcija 1/4\",frac12:\"Vulgāra frakcija 1/2\",frac34:\"Vulgāra frakcija 3/4\",iquest:\"Apgriezta jautājuma zīme\",Agrave:\"Lielais latīņu burts A ar uzsvara zīmi\",\nAacute:\"Lielais  latīņu burts A ar akūtu uzsvara zīmi\",Acirc:\"Lielais latīņu burts A ar diakritisku zīmi\",Atilde:\"Lielais latīņu burts A ar tildi \",Auml:\"Lielais latīņu burts A ar diakritisko zīmi\",Aring:\"Lielais latīņu burts A ar aplīti augšā\",AElig:\"Lielais latīņu burts Æ\",Ccedil:\"Lielais latīņu burts C ar āķīti zem burta\",Egrave:\"Lielais latīņu burts E ar apostrofu\",Eacute:\"Lielais latīņu burts E ar akūtu uzsvara zīmi\",Ecirc:\"Lielais latīņu burts E ar diakritisko zīmi\",Euml:\"Lielais latīņu burts E ar diakritisko zīmi\",\nIgrave:\"Lielais latīņu burts I ar uzsvaras  zīmi\",Iacute:\"Lielais latīņu burts I ar akūtu uzsvara zīmi\",Icirc:\"Lielais latīņu burts I ar diakritisko zīmi\",Iuml:\"Lielais latīņu burts I ar diakritisko zīmi\",ETH:\"Lielais latīņu burts Eth\",Ntilde:\"Lielais latīņu burts N ar tildi\",Ograve:\"Lielais latīņu burts O ar uzsvara zīmi\",Oacute:\"Lielais latīņu burts O ar akūto uzsvara zīmi\",Ocirc:\"Lielais latīņu burts O ar diakritisko zīmi\",Otilde:\"Lielais latīņu burts O ar tildi\",Ouml:\"Lielais latīņu burts O ar diakritisko zīmi\",\ntimes:\"Reizināšanas zīme \",Oslash:\"Lielais latīņu burts O ar iesvītrojumu\",Ugrave:\"Lielais latīņu burts U ar uzsvaras zīmi\",Uacute:\"Lielais latīņu burts U ar akūto uzsvars zīmi\",Ucirc:\"Lielais latīņu burts U ar diakritisko zīmi\",Uuml:\"Lielais latīņu burts U ar diakritisko zīmi\",Yacute:\"Lielais latīņu burts Y ar akūto uzsvaras zīmi\",THORN:\"Lielais latīņu burts torn\",szlig:\"Mazs latīņu burts ar ligatūru\",agrave:\"Mazs latīņu burts a ar uzsvara zīmi\",aacute:\"Mazs latīņu burts a ar akūto uzsvara zīmi\",\nacirc:\"Mazs latīņu burts a ar diakritisko zīmi\",atilde:\"Mazs latīņu burts a ar tildi\",auml:\"Mazs latīņu burts a ar diakritisko zīmi\",aring:\"Mazs latīņu burts a ar aplīti augšā\",aelig:\"Mazs latīņu burts æ\",ccedil:\"Mazs latīņu burts c ar āķīti zem burta\",egrave:\"Mazs latīņu burts e ar uzsvara zīmi \",eacute:\"Mazs latīņu burts e ar akūtu uzsvara zīmi\",ecirc:\"Mazs latīņu burts e ar diakritisko zīmi\",euml:\"Mazs latīņu burts e ar diakritisko zīmi\",igrave:\"Mazs latīņu burts i ar uzsvara zīmi \",iacute:\"Mazs latīņu burts i ar akūtu uzsvara zīmi\",\nicirc:\"Mazs latīņu burts i ar diakritisko zīmi\",iuml:\"Mazs latīņu burts i ar diakritisko zīmi\",eth:\"Mazs latīņu burts eth\",ntilde:\"Mazs latīņu burts n ar tildi\",ograve:\"Mazs latīņu burts o ar uzsvara zīmi \",oacute:\"Mazs latīņu burts o ar akūtu uzsvara zīmi\",ocirc:\"Mazs latīņu burts o ar diakritisko zīmi\",otilde:\"Mazs latīņu burts o ar tildi\",ouml:\"Mazs latīņu burts o ar diakritisko zīmi\",divide:\"Dalīšanas zīme\",oslash:\"Mazs latīņu burts o ar iesvītrojumu\",ugrave:\"Mazs latīņu burts u ar uzsvara zīmi \",\nuacute:\"Mazs latīņu burts u ar  akūtu uzsvara zīmi\",ucirc:\"Mazs latīņu burts u ar diakritisko zīmi\",uuml:\"Mazs latīņu burts u ar diakritisko zīmi\",yacute:\"Mazs latīņu burts y ar  akūtu uzsvaras zīmi\",thorn:\"Mazs latīņu burts torns\",yuml:\"Mazs latīņu burts y ar diakritisko zīmi\",OElig:\"Liela latīņu ligatūra OE\",oelig:\"Maza latīņu ligatūra oe\",372:\"Liels latīņu burts W ar diakritisko zīmi \",374:\"Liels latīņu burts Y ar diakritisko zīmi \",373:\"Mazs latīņu burts w ar diakritisko zīmi \",375:\"Mazs latīņu burts y ar diakritisko zīmi \",\nsbquo:\"Mazas-9 vienkārtīgas pēdiņas\",8219:\"Lielas-9 vienkārtīgas apgrieztas pēdiņas\",bdquo:\"Mazas-9 dubultas pēdiņas\",hellip:\"Horizontāli daudzpunkti\",trade:\"Preču zīmes zīme\",9658:\"Melns pa labi pagriezts radītājs\",bull:\"Lode\",rarr:\"Bulta pa labi\",rArr:\"Dubulta Bulta pa labi\",hArr:\"Bulta pa kreisi\",diams:\"Dubulta Bulta pa kreisi\",asymp:\"Gandrīz vienāds ar\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/nb.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"nb\",{euro:\"Eurosymbol\",lsquo:\"Venstre enkelt anførselstegn\",rsquo:\"Høyre enkelt anførselstegn\",ldquo:\"Venstre dobbelt anførselstegn\",rdquo:\"Høyre anførsesltegn\",ndash:\"Kort tankestrek\",mdash:\"Lang tankestrek\",iexcl:\"Omvendt utropstegn\",cent:\"Centsymbol\",pound:\"Pundsymbol\",curren:\"Valutategn\",yen:\"Yensymbol\",brvbar:\"Brutt loddrett strek\",sect:\"Paragraftegn\",uml:\"Tøddel\",copy:\"Copyrighttegn\",ordf:\"Feminin ordensindikator\",laquo:\"Venstre anførselstegn\",not:\"Negasjonstegn\",\nreg:\"Registrert varemerke-tegn\",macr:\"Makron\",deg:\"Gradsymbol\",sup2:\"Hevet totall\",sup3:\"Hevet tretall\",acute:\"Akutt aksent\",micro:\"Mikrosymbol\",para:\"Avsnittstegn\",middot:\"Midtstilt prikk\",cedil:\"Cedille\",sup1:\"Hevet ettall\",ordm:\"Maskulin ordensindikator\",raquo:\"Høyre anførselstegn\",frac14:\"Fjerdedelsbrøk\",frac12:\"Halvbrøk\",frac34:\"Tre fjerdedelers brøk\",iquest:\"Omvendt spørsmålstegn\",Agrave:\"Stor A med grav aksent\",Aacute:\"Stor A med akutt aksent\",Acirc:\"Stor A med cirkumfleks\",Atilde:\"Stor A med tilde\",\nAuml:\"Stor A med tøddel\",Aring:\"Stor Å\",AElig:\"Stor Æ\",Ccedil:\"Stor C med cedille\",Egrave:\"Stor E med grav aksent\",Eacute:\"Stor E med akutt aksent\",Ecirc:\"Stor E med cirkumfleks\",Euml:\"Stor E med tøddel\",Igrave:\"Stor I med grav aksent\",Iacute:\"Stor I med akutt aksent\",Icirc:\"Stor I med cirkumfleks\",Iuml:\"Stor I med tøddel\",ETH:\"Stor Edd/stungen D\",Ntilde:\"Stor N med tilde\",Ograve:\"Stor O med grav aksent\",Oacute:\"Stor O med akutt aksent\",Ocirc:\"Stor O med cirkumfleks\",Otilde:\"Stor O med tilde\",Ouml:\"Stor O med tøddel\",\ntimes:\"Multiplikasjonstegn\",Oslash:\"Stor Ø\",Ugrave:\"Stor U med grav aksent\",Uacute:\"Stor U med akutt aksent\",Ucirc:\"Stor U med cirkumfleks\",Uuml:\"Stor U med tøddel\",Yacute:\"Stor Y med akutt aksent\",THORN:\"Stor Thorn\",szlig:\"Liten dobbelt-s/Eszett\",agrave:\"Liten a med grav aksent\",aacute:\"Liten a med akutt aksent\",acirc:\"Liten a med cirkumfleks\",atilde:\"Liten a med tilde\",auml:\"Liten a med tøddel\",aring:\"Liten å\",aelig:\"Liten æ\",ccedil:\"Liten c med cedille\",egrave:\"Liten e med grav aksent\",eacute:\"Liten e med akutt aksent\",\necirc:\"Liten e med cirkumfleks\",euml:\"Liten e med tøddel\",igrave:\"Liten i med grav aksent\",iacute:\"Liten i med akutt aksent\",icirc:\"Liten i med cirkumfleks\",iuml:\"Liten i med tøddel\",eth:\"Liten edd/stungen d\",ntilde:\"Liten n med tilde\",ograve:\"Liten o med grav aksent\",oacute:\"Liten o med akutt aksent\",ocirc:\"Liten o med cirkumfleks\",otilde:\"Liten o med tilde\",ouml:\"Liten o med tøddel\",divide:\"Divisjonstegn\",oslash:\"Liten ø\",ugrave:\"Liten u med grav aksent\",uacute:\"Liten u med akutt aksent\",ucirc:\"Liten u med cirkumfleks\",\nuuml:\"Liten u med tøddel\",yacute:\"Liten y med akutt aksent\",thorn:\"Liten thorn\",yuml:\"Liten y med tøddel\",OElig:\"Stor ligatur av O og E\",oelig:\"Liten ligatur av o og e\",372:\"Stor W med cirkumfleks\",374:\"Stor Y med cirkumfleks\",373:\"Liten w med cirkumfleks\",375:\"Liten y med cirkumfleks\",sbquo:\"Enkelt lavt 9-anførselstegn\",8219:\"Enkelt høyt reversert 9-anførselstegn\",bdquo:\"Dobbelt lavt 9-anførselstegn\",hellip:\"Ellipse\",trade:\"Varemerkesymbol\",9658:\"Svart høyrevendt peker\",bull:\"Tykk interpunkt\",rarr:\"Høyrevendt pil\",\nrArr:\"Dobbel høyrevendt pil\",hArr:\"Dobbel venstrevendt pil\",diams:\"Svart ruter\",asymp:\"Omtrent likhetstegn\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/nl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"nl\",{euro:\"Euro-teken\",lsquo:\"Linker enkel aanhalingsteken\",rsquo:\"Rechter enkel aanhalingsteken\",ldquo:\"Linker dubbel aanhalingsteken\",rdquo:\"Rechter dubbel aanhalingsteken\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Omgekeerd uitroepteken\",cent:\"Cent-teken\",pound:\"Pond-teken\",curren:\"Valuta-teken\",yen:\"Yen-teken\",brvbar:\"Gebroken streep\",sect:\"Paragraaf-teken\",uml:\"Trema\",copy:\"Copyright-teken\",ordf:\"Vrouwelijk ordinaal\",laquo:\"Linker guillemet\",not:\"Ongelijk-teken\",\nreg:\"Geregistreerd handelsmerk-teken\",macr:\"Macron\",deg:\"Graden-teken\",sup2:\"Superscript twee\",sup3:\"Superscript drie\",acute:\"Accent aigu\",micro:\"Micro-teken\",para:\"Alinea-teken\",middot:\"Halfhoge punt\",cedil:\"Cedille\",sup1:\"Superscript een\",ordm:\"Mannelijk ordinaal\",raquo:\"Rechter guillemet\",frac14:\"Breuk kwart\",frac12:\"Breuk half\",frac34:\"Breuk driekwart\",iquest:\"Omgekeerd vraagteken\",Agrave:\"Latijnse hoofdletter A met een accent grave\",Aacute:\"Latijnse hoofdletter A met een accent aigu\",Acirc:\"Latijnse hoofdletter A met een circonflexe\",\nAtilde:\"Latijnse hoofdletter A met een tilde\",Auml:\"Latijnse hoofdletter A met een trema\",Aring:\"Latijnse hoofdletter A met een corona\",AElig:\"Latijnse hoofdletter Æ\",Ccedil:\"Latijnse hoofdletter C met een cedille\",Egrave:\"Latijnse hoofdletter E met een accent grave\",Eacute:\"Latijnse hoofdletter E met een accent aigu\",Ecirc:\"Latijnse hoofdletter E met een circonflexe\",Euml:\"Latijnse hoofdletter E met een trema\",Igrave:\"Latijnse hoofdletter I met een accent grave\",Iacute:\"Latijnse hoofdletter I met een accent aigu\",\nIcirc:\"Latijnse hoofdletter I met een circonflexe\",Iuml:\"Latijnse hoofdletter I met een trema\",ETH:\"Latijnse hoofdletter Eth\",Ntilde:\"Latijnse hoofdletter N met een tilde\",Ograve:\"Latijnse hoofdletter O met een accent grave\",Oacute:\"Latijnse hoofdletter O met een accent aigu\",Ocirc:\"Latijnse hoofdletter O met een circonflexe\",Otilde:\"Latijnse hoofdletter O met een tilde\",Ouml:\"Latijnse hoofdletter O met een trema\",times:\"Maal-teken\",Oslash:\"Latijnse hoofdletter O met een schuine streep\",Ugrave:\"Latijnse hoofdletter U met een accent grave\",\nUacute:\"Latijnse hoofdletter U met een accent aigu\",Ucirc:\"Latijnse hoofdletter U met een circonflexe\",Uuml:\"Latijnse hoofdletter U met een trema\",Yacute:\"Latijnse hoofdletter Y met een accent aigu\",THORN:\"Latijnse hoofdletter Thorn\",szlig:\"Latijnse kleine ringel-s\",agrave:\"Latijnse kleine letter a met een accent grave\",aacute:\"Latijnse kleine letter a met een accent aigu\",acirc:\"Latijnse kleine letter a met een circonflexe\",atilde:\"Latijnse kleine letter a met een tilde\",auml:\"Latijnse kleine letter a met een trema\",\naring:\"Latijnse kleine letter a met een corona\",aelig:\"Latijnse kleine letter æ\",ccedil:\"Latijnse kleine letter c met een cedille\",egrave:\"Latijnse kleine letter e met een accent grave\",eacute:\"Latijnse kleine letter e met een accent aigu\",ecirc:\"Latijnse kleine letter e met een circonflexe\",euml:\"Latijnse kleine letter e met een trema\",igrave:\"Latijnse kleine letter i met een accent grave\",iacute:\"Latijnse kleine letter i met een accent aigu\",icirc:\"Latijnse kleine letter i met een circonflexe\",\niuml:\"Latijnse kleine letter i met een trema\",eth:\"Latijnse kleine letter eth\",ntilde:\"Latijnse kleine letter n met een tilde\",ograve:\"Latijnse kleine letter o met een accent grave\",oacute:\"Latijnse kleine letter o met een accent aigu\",ocirc:\"Latijnse kleine letter o met een circonflexe\",otilde:\"Latijnse kleine letter o met een tilde\",ouml:\"Latijnse kleine letter o met een trema\",divide:\"Deel-teken\",oslash:\"Latijnse kleine letter o met een schuine streep\",ugrave:\"Latijnse kleine letter u met een accent grave\",\nuacute:\"Latijnse kleine letter u met een accent aigu\",ucirc:\"Latijnse kleine letter u met een circonflexe\",uuml:\"Latijnse kleine letter u met een trema\",yacute:\"Latijnse kleine letter y met een accent aigu\",thorn:\"Latijnse kleine letter thorn\",yuml:\"Latijnse kleine letter y met een trema\",OElig:\"Latijnse hoofdletter Œ\",oelig:\"Latijnse kleine letter œ\",372:\"Latijnse hoofdletter W met een circonflexe\",374:\"Latijnse hoofdletter Y met een circonflexe\",373:\"Latijnse kleine letter w met een circonflexe\",\n375:\"Latijnse kleine letter y met een circonflexe\",sbquo:\"Lage enkele aanhalingsteken\",8219:\"Hoge omgekeerde enkele aanhalingsteken\",bdquo:\"Lage dubbele aanhalingsteken\",hellip:\"Beletselteken\",trade:\"Trademark-teken\",9658:\"Zwarte driehoek naar rechts\",bull:\"Bullet\",rarr:\"Pijl naar rechts\",rArr:\"Dubbele pijl naar rechts\",hArr:\"Dubbele pijl naar links\",diams:\"Zwart ruitje\",asymp:\"Benaderingsteken\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/no.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"no\",{euro:\"Eurosymbol\",lsquo:\"Venstre enkelt anførselstegn\",rsquo:\"Høyre enkelt anførselstegn\",ldquo:\"Venstre dobbelt anførselstegn\",rdquo:\"Høyre anførsesltegn\",ndash:\"Kort tankestrek\",mdash:\"Lang tankestrek\",iexcl:\"Omvendt utropstegn\",cent:\"Centsymbol\",pound:\"Pundsymbol\",curren:\"Valutategn\",yen:\"Yensymbol\",brvbar:\"Brutt loddrett strek\",sect:\"Paragraftegn\",uml:\"Tøddel\",copy:\"Copyrighttegn\",ordf:\"Feminin ordensindikator\",laquo:\"Venstre anførselstegn\",not:\"Negasjonstegn\",\nreg:\"Registrert varemerke-tegn\",macr:\"Makron\",deg:\"Gradsymbol\",sup2:\"Hevet totall\",sup3:\"Hevet tretall\",acute:\"Akutt aksent\",micro:\"Mikrosymbol\",para:\"Avsnittstegn\",middot:\"Midtstilt prikk\",cedil:\"Cedille\",sup1:\"Hevet ettall\",ordm:\"Maskulin ordensindikator\",raquo:\"Høyre anførselstegn\",frac14:\"Fjerdedelsbrøk\",frac12:\"Halvbrøk\",frac34:\"Tre fjerdedelers brøk\",iquest:\"Omvendt spørsmålstegn\",Agrave:\"Stor A med grav aksent\",Aacute:\"Stor A med akutt aksent\",Acirc:\"Stor A med cirkumfleks\",Atilde:\"Stor A med tilde\",\nAuml:\"Stor A med tøddel\",Aring:\"Stor Å\",AElig:\"Stor Æ\",Ccedil:\"Stor C med cedille\",Egrave:\"Stor E med grav aksent\",Eacute:\"Stor E med akutt aksent\",Ecirc:\"Stor E med cirkumfleks\",Euml:\"Stor E med tøddel\",Igrave:\"Stor I med grav aksent\",Iacute:\"Stor I med akutt aksent\",Icirc:\"Stor I med cirkumfleks\",Iuml:\"Stor I med tøddel\",ETH:\"Stor Edd/stungen D\",Ntilde:\"Stor N med tilde\",Ograve:\"Stor O med grav aksent\",Oacute:\"Stor O med akutt aksent\",Ocirc:\"Stor O med cirkumfleks\",Otilde:\"Stor O med tilde\",Ouml:\"Stor O med tøddel\",\ntimes:\"Multiplikasjonstegn\",Oslash:\"Stor Ø\",Ugrave:\"Stor U med grav aksent\",Uacute:\"Stor U med akutt aksent\",Ucirc:\"Stor U med cirkumfleks\",Uuml:\"Stor U med tøddel\",Yacute:\"Stor Y med akutt aksent\",THORN:\"Stor Thorn\",szlig:\"Liten dobbelt-s/Eszett\",agrave:\"Liten a med grav aksent\",aacute:\"Liten a med akutt aksent\",acirc:\"Liten a med cirkumfleks\",atilde:\"Liten a med tilde\",auml:\"Liten a med tøddel\",aring:\"Liten å\",aelig:\"Liten æ\",ccedil:\"Liten c med cedille\",egrave:\"Liten e med grav aksent\",eacute:\"Liten e med akutt aksent\",\necirc:\"Liten e med cirkumfleks\",euml:\"Liten e med tøddel\",igrave:\"Liten i med grav aksent\",iacute:\"Liten i med akutt aksent\",icirc:\"Liten i med cirkumfleks\",iuml:\"Liten i med tøddel\",eth:\"Liten edd/stungen d\",ntilde:\"Liten n med tilde\",ograve:\"Liten o med grav aksent\",oacute:\"Liten o med akutt aksent\",ocirc:\"Liten o med cirkumfleks\",otilde:\"Liten o med tilde\",ouml:\"Liten o med tøddel\",divide:\"Divisjonstegn\",oslash:\"Liten ø\",ugrave:\"Liten u med grav aksent\",uacute:\"Liten u med akutt aksent\",ucirc:\"Liten u med cirkumfleks\",\nuuml:\"Liten u med tøddel\",yacute:\"Liten y med akutt aksent\",thorn:\"Liten thorn\",yuml:\"Liten y med tøddel\",OElig:\"Stor ligatur av O og E\",oelig:\"Liten ligatur av o og e\",372:\"Stor W med cirkumfleks\",374:\"Stor Y med cirkumfleks\",373:\"Liten w med cirkumfleks\",375:\"Liten y med cirkumfleks\",sbquo:\"Enkelt lavt 9-anførselstegn\",8219:\"Enkelt høyt reversert 9-anførselstegn\",bdquo:\"Dobbelt lavt 9-anførselstegn\",hellip:\"Ellipse\",trade:\"Varemerkesymbol\",9658:\"Svart høyrevendt peker\",bull:\"Tykk interpunkt\",rarr:\"Høyrevendt pil\",\nrArr:\"Dobbel høyrevendt pil\",hArr:\"Dobbel venstrevendt pil\",diams:\"Svart ruter\",asymp:\"Omtrent likhetstegn\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/pl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"pl\",{euro:\"Znak euro\",lsquo:\"Cudzysłów pojedynczy otwierający\",rsquo:\"Cudzysłów pojedynczy zamykający\",ldquo:\"Cudzysłów apostrofowy otwierający\",rdquo:\"Cudzysłów apostrofowy zamykający\",ndash:\"Półpauza\",mdash:\"Pauza\",iexcl:\"Odwrócony wykrzyknik\",cent:\"Znak centa\",pound:\"Znak funta\",curren:\"Znak waluty\",yen:\"Znak jena\",brvbar:\"Przerwana pionowa kreska\",sect:\"Paragraf\",uml:\"Diereza\",copy:\"Znak praw autorskich\",ordf:\"Wskaźnik rodzaju żeńskiego liczebnika porządkowego\",\nlaquo:\"Lewy cudzysłów ostrokątny\",not:\"Znak negacji\",reg:\"Zastrzeżony znak towarowy\",macr:\"Makron\",deg:\"Znak stopnia\",sup2:\"Druga potęga\",sup3:\"Trzecia potęga\",acute:\"Akcent ostry\",micro:\"Znak mikro\",para:\"Znak akapitu\",middot:\"Kropka środkowa\",cedil:\"Cedylla\",sup1:\"Pierwsza potęga\",ordm:\"Wskaźnik rodzaju męskiego liczebnika porządkowego\",raquo:\"Prawy cudzysłów ostrokątny\",frac14:\"Ułamek zwykły jedna czwarta\",frac12:\"Ułamek zwykły jedna druga\",frac34:\"Ułamek zwykły trzy czwarte\",iquest:\"Odwrócony znak zapytania\",\nAgrave:\"Wielka litera A z akcentem ciężkim\",Aacute:\"Wielka litera A z akcentem ostrym\",Acirc:\"Wielka litera A z akcentem przeciągłym\",Atilde:\"Wielka litera A z tyldą\",Auml:\"Wielka litera A z dierezą\",Aring:\"Wielka litera A z kółkiem\",AElig:\"Wielka ligatura Æ\",Ccedil:\"Wielka litera C z cedyllą\",Egrave:\"Wielka litera E z akcentem ciężkim\",Eacute:\"Wielka litera E z akcentem ostrym\",Ecirc:\"Wielka litera E z akcentem przeciągłym\",Euml:\"Wielka litera E z dierezą\",Igrave:\"Wielka litera I z akcentem ciężkim\",\nIacute:\"Wielka litera I z akcentem ostrym\",Icirc:\"Wielka litera I z akcentem przeciągłym\",Iuml:\"Wielka litera I z dierezą\",ETH:\"Wielka litera Eth\",Ntilde:\"Wielka litera N z tyldą\",Ograve:\"Wielka litera O z akcentem ciężkim\",Oacute:\"Wielka litera O z akcentem ostrym\",Ocirc:\"Wielka litera O z akcentem przeciągłym\",Otilde:\"Wielka litera O z tyldą\",Ouml:\"Wielka litera O z dierezą\",times:\"Znak mnożenia wektorowego\",Oslash:\"Wielka litera O z przekreśleniem\",Ugrave:\"Wielka litera U z akcentem ciężkim\",Uacute:\"Wielka litera U z akcentem ostrym\",\nUcirc:\"Wielka litera U z akcentem przeciągłym\",Uuml:\"Wielka litera U z dierezą\",Yacute:\"Wielka litera Y z akcentem ostrym\",THORN:\"Wielka litera Thorn\",szlig:\"Mała litera ostre s (eszet)\",agrave:\"Mała litera a z akcentem ciężkim\",aacute:\"Mała litera a z akcentem ostrym\",acirc:\"Mała litera a z akcentem przeciągłym\",atilde:\"Mała litera a z tyldą\",auml:\"Mała litera a z dierezą\",aring:\"Mała litera a z kółkiem\",aelig:\"Mała ligatura æ\",ccedil:\"Mała litera c z cedyllą\",egrave:\"Mała litera e z akcentem ciężkim\",\neacute:\"Mała litera e z akcentem ostrym\",ecirc:\"Mała litera e z akcentem przeciągłym\",euml:\"Mała litera e z dierezą\",igrave:\"Mała litera i z akcentem ciężkim\",iacute:\"Mała litera i z akcentem ostrym\",icirc:\"Mała litera i z akcentem przeciągłym\",iuml:\"Mała litera i z dierezą\",eth:\"Mała litera eth\",ntilde:\"Mała litera n z tyldą\",ograve:\"Mała litera o z akcentem ciężkim\",oacute:\"Mała litera o z akcentem ostrym\",ocirc:\"Mała litera o z akcentem przeciągłym\",otilde:\"Mała litera o z tyldą\",ouml:\"Mała litera o z dierezą\",\ndivide:\"Anglosaski znak dzielenia\",oslash:\"Mała litera o z przekreśleniem\",ugrave:\"Mała litera u z akcentem ciężkim\",uacute:\"Mała litera u z akcentem ostrym\",ucirc:\"Mała litera u z akcentem przeciągłym\",uuml:\"Mała litera u z dierezą\",yacute:\"Mała litera y z akcentem ostrym\",thorn:\"Mała litera thorn\",yuml:\"Mała litera y z dierezą\",OElig:\"Wielka ligatura OE\",oelig:\"Mała ligatura oe\",372:\"Wielka litera W z akcentem przeciągłym\",374:\"Wielka litera Y z akcentem przeciągłym\",373:\"Mała litera w z akcentem przeciągłym\",\n375:\"Mała litera y z akcentem przeciągłym\",sbquo:\"Pojedynczy apostrof dolny\",8219:\"Pojedynczy apostrof górny\",bdquo:\"Podwójny apostrof dolny\",hellip:\"Wielokropek\",trade:\"Znak towarowy\",9658:\"Czarny wskaźnik wskazujący w prawo\",bull:\"Punktor\",rarr:\"Strzałka w prawo\",rArr:\"Podwójna strzałka w prawo\",hArr:\"Podwójna strzałka obustronna\",diams:\"Czarny znak karo\",asymp:\"Znak prawie równe\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"pt-br\",{euro:\"Euro\",lsquo:\"Aspas simples esquerda\",rsquo:\"Aspas simples direita\",ldquo:\"Aspas duplas esquerda\",rdquo:\"Aspas duplas direita\",ndash:\"Traço\",mdash:\"Travessão\",iexcl:\"Ponto de exclamação invertido\",cent:\"Cent\",pound:\"Cerquilha\",curren:\"Dinheiro\",yen:\"Yen\",brvbar:\"Bara interrompida\",sect:\"Símbolo de Parágrafo\",uml:\"Trema\",copy:\"Direito de Cópia\",ordf:\"Indicador ordinal feminino\",laquo:\"Aspas duplas angulares esquerda\",not:\"Negação\",reg:\"Marca Registrada\",\nmacr:\"Mácron\",deg:\"Grau\",sup2:\"2 Superscrito\",sup3:\"3 Superscrito\",acute:\"Acento agudo\",micro:\"Micro\",para:\"Pé de mosca\",middot:\"Ponto mediano\",cedil:\"Cedilha\",sup1:\"1 Superscrito\",ordm:\"Indicador ordinal masculino\",raquo:\"Aspas duplas angulares direita\",frac14:\"Um quarto\",frac12:\"Um meio\",frac34:\"Três quartos\",iquest:\"Interrogação invertida\",Agrave:\"A maiúsculo com acento grave\",Aacute:\"A maiúsculo com acento agudo\",Acirc:\"A maiúsculo com acento circunflexo\",Atilde:\"A maiúsculo com til\",Auml:\"A maiúsculo com trema\",\nAring:\"A maiúsculo com anel acima\",AElig:\"Æ maiúsculo\",Ccedil:\"Ç maiúlculo\",Egrave:\"E maiúsculo com acento grave\",Eacute:\"E maiúsculo com acento agudo\",Ecirc:\"E maiúsculo com acento circumflexo\",Euml:\"E maiúsculo com trema\",Igrave:\"I maiúsculo com acento grave\",Iacute:\"I maiúsculo com acento agudo\",Icirc:\"I maiúsculo com acento circunflexo\",Iuml:\"I maiúsculo com crase\",ETH:\"Eth maiúsculo\",Ntilde:\"N maiúsculo com til\",Ograve:\"O maiúsculo com acento grave\",Oacute:\"O maiúsculo com acento agudo\",Ocirc:\"O maiúsculo com acento circunflexo\",\nOtilde:\"O maiúsculo com til\",Ouml:\"O maiúsculo com trema\",times:\"Multiplicação\",Oslash:\"Diâmetro\",Ugrave:\"U maiúsculo com acento grave\",Uacute:\"U maiúsculo com acento agudo\",Ucirc:\"U maiúsculo com acento circunflexo\",Uuml:\"U maiúsculo com trema\",Yacute:\"Y maiúsculo com acento agudo\",THORN:\"Thorn maiúsculo\",szlig:\"Eszett minúsculo\",agrave:\"a minúsculo com acento grave\",aacute:\"a minúsculo com acento agudo\",acirc:\"a minúsculo com acento circunflexo\",atilde:\"a minúsculo com til\",auml:\"a minúsculo com trema\",\naring:\"a minúsculo com anel acima\",aelig:\"æ minúsculo\",ccedil:\"ç minúsculo\",egrave:\"e minúsculo com acento grave\",eacute:\"e minúsculo com acento agudo\",ecirc:\"e minúsculo com acento circunflexo\",euml:\"e minúsculo com trema\",igrave:\"i minúsculo com acento grave\",iacute:\"i minúsculo com acento agudo\",icirc:\"i minúsculo com acento circunflexo\",iuml:\"i minúsculo com trema\",eth:\"eth minúsculo\",ntilde:\"n minúsculo com til\",ograve:\"o minúsculo com acento grave\",oacute:\"o minúsculo com acento agudo\",ocirc:\"o minúsculo com acento circunflexo\",\notilde:\"o minúsculo com til\",ouml:\"o minúsculo com trema\",divide:\"Divisão\",oslash:\"o minúsculo com cortado ou diâmetro\",ugrave:\"u minúsculo com acento grave\",uacute:\"u minúsculo com acento agudo\",ucirc:\"u minúsculo com acento circunflexo\",uuml:\"u minúsculo com trema\",yacute:\"y minúsculo com acento agudo\",thorn:\"thorn minúsculo\",yuml:\"y minúsculo com trema\",OElig:\"Ligação tipográfica OE maiúscula\",oelig:\"Ligação tipográfica oe minúscula\",372:\"W maiúsculo com acento circunflexo\",374:\"Y maiúsculo com acento circunflexo\",\n373:\"w minúsculo com acento circunflexo\",375:\"y minúsculo com acento circunflexo\",sbquo:\"Aspas simples inferior direita\",8219:\"Aspas simples superior esquerda\",bdquo:\"Aspas duplas inferior direita\",hellip:\"Reticências\",trade:\"Trade mark\",9658:\"Ponta de seta preta para direita\",bull:\"Ponto lista\",rarr:\"Seta para direita\",rArr:\"Seta dupla para direita\",hArr:\"Seta dupla direita e esquerda\",diams:\"Ouros\",asymp:\"Aproximadamente\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/pt.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"pt\",{euro:\"Símbolo do Euro\",lsquo:\"Aspa esquerda simples\",rsquo:\"Aspa direita simples\",ldquo:\"Aspa esquerda dupla\",rdquo:\"Aspa direita dupla\",ndash:\"Travessão Simples\",mdash:\"Travessão Longo\",iexcl:\"Ponto de exclamação invertido\",cent:\"Símbolo do Cêntimo\",pound:\"Símbolo da Libra\",curren:\"Símbolo de Moeda\",yen:\"Símbolo do Iene\",brvbar:\"Barra quebrada\",sect:\"Símbolo de Secção\",uml:\"Trema\",copy:\"Símbolo dos Direitos de Autor\",ordf:\"Indicador ordinal feminino\",\nlaquo:\"Aspa esquerda ângulo duplo\",not:\"Não Símbolo\",reg:\"Símbolo de Registado\",macr:\"Mácron\",deg:\"Símbolo de Grau\",sup2:\"Expoente 2\",sup3:\"Expoente 3\",acute:\"Acento agudo\",micro:\"Símbolo de Micro\",para:\"Símbolo de Parágrafo\",middot:\"Ponto do Meio\",cedil:\"Cedilha\",sup1:\"Expoente 1\",ordm:\"Indicador ordinal masculino\",raquo:\"Aspas ângulo duplo pra Direita\",frac14:\"Fração vulgar 1/4\",frac12:\"Fração vulgar 1/2\",frac34:\"Fração vulgar 3/4\",iquest:\"Ponto de interrogação invertido\",Agrave:\"Letra maiúscula latina A com acento grave\",\nAacute:\"Letra maiúscula latina A com acento agudo\",Acirc:\"Letra maiúscula latina A com circunflexo\",Atilde:\"Letra maiúscula latina A com til\",Auml:\"Letra maiúscula latina A com trema\",Aring:\"Letra maiúscula latina A com sinal diacrítico\",AElig:\"Letra maiúscula latina Æ\",Ccedil:\"Letra maiúscula latina C com cedilha\",Egrave:\"Letra maiúscula latina E com acento grave\",Eacute:\"Letra maiúscula latina E com acento agudo\",Ecirc:\"Letra maiúscula latina E com circunflexo\",Euml:\"Letra maiúscula latina E com trema\",\nIgrave:\"Letra maiúscula latina I com acento grave\",Iacute:\"Letra maiúscula latina I com acento agudo\",Icirc:\"Letra maiúscula latina I com cincunflexo\",Iuml:\"Letra maiúscula latina I com trema\",ETH:\"Letra maiúscula latina Eth (Ðð)\",Ntilde:\"Letra maiúscula latina N com til\",Ograve:\"Letra maiúscula latina O com acento grave\",Oacute:\"Letra maiúscula latina O com acento agudo\",Ocirc:\"Letra maiúscula latina I com circunflexo\",Otilde:\"Letra maiúscula latina O com til\",Ouml:\"Letra maiúscula latina O com trema\",\ntimes:\"Símbolo de multiplicação\",Oslash:\"Letra maiúscula O com barra\",Ugrave:\"Letra maiúscula latina U com acento grave\",Uacute:\"Letra maiúscula latina U com acento agudo\",Ucirc:\"Letra maiúscula latina U com circunflexo\",Uuml:\"Letra maiúscula latina E com trema\",Yacute:\"Letra maiúscula latina Y com acento agudo\",THORN:\"Letra maiúscula latina Rúnico\",szlig:\"Letra minúscula latina s forte\",agrave:\"Letra minúscula latina a com acento grave\",aacute:\"Letra minúscula latina a com acento agudo\",acirc:\"Letra minúscula latina a com circunflexo\",\natilde:\"Letra minúscula latina a com til\",auml:\"Letra minúscula latina a com trema\",aring:\"Letra minúscula latina a com sinal diacrítico\",aelig:\"Letra minúscula latina æ\",ccedil:\"Letra minúscula latina c com cedilha\",egrave:\"Letra minúscula latina e com acento grave\",eacute:\"Letra minúscula latina e com acento agudo\",ecirc:\"Letra minúscula latina e com circunflexo\",euml:\"Letra minúscula latina e com trema\",igrave:\"Letra minúscula latina i com acento grave\",iacute:\"Letra minúscula latina i com acento agudo\",\nicirc:\"Letra minúscula latina i com circunflexo\",iuml:\"Letra pequena latina i com trema\",eth:\"Letra minúscula latina eth\",ntilde:\"Letra minúscula latina n com til\",ograve:\"Letra minúscula latina o com acento grave\",oacute:\"Letra minúscula latina o com acento agudo\",ocirc:\"Letra minúscula latina o com circunflexo\",otilde:\"Letra minúscula latina o com til\",ouml:\"Letra minúscula latina o com trema\",divide:\"Símbolo de divisão\",oslash:\"Letra minúscula latina o com barra\",ugrave:\"Letra minúscula latina u com acento grave\",\nuacute:\"Letra minúscula latina u com acento agudo\",ucirc:\"Letra minúscula latina u com circunflexo\",uuml:\"Letra minúscula latina u com trema\",yacute:\"Letra minúscula latina y com acento agudo\",thorn:\"Letra minúscula latina Rúnico\",yuml:\"Letra minúscula latina y com trema\",OElig:\"Ligadura maiúscula latina OE\",oelig:\"Ligadura minúscula latina oe\",372:\"Letra maiúscula latina W com circunflexo\",374:\"Letra maiúscula latina Y com circunflexo\",373:\"Letra minúscula latina w com circunflexo\",375:\"Letra minúscula latina y com circunflexo\",\nsbquo:\"Aspa Simples inferior-9\",8219:\"Aspa Simples superior invertida-9\",bdquo:\"Aspa duplas inferior-9\",hellip:\"Elipse Horizontal \",trade:\"Símbolo de Marca Registada\",9658:\"Ponteiro preto direito\",bull:\"Marca\",rarr:\"Seta para a direita\",rArr:\"Seta dupla para a direita\",hArr:\"Seta dupla direita esquerda\",diams:\"Naipe diamante preto\",asymp:\"Quase igual a \"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ru.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ru\",{euro:\"Знак евро\",lsquo:\"Левая одинарная кавычка\",rsquo:\"Правая одинарная кавычка\",ldquo:\"Левая двойная кавычка\",rdquo:\"Левая двойная кавычка\",ndash:\"Среднее тире\",mdash:\"Длинное тире\",iexcl:\"перевёрнутый восклицательный знак\",cent:\"Цент\",pound:\"Фунт\",curren:\"Знак валюты\",yen:\"Йена\",brvbar:\"Вертикальная черта с разрывом\",sect:\"Знак параграфа\",uml:\"Умлаут\",copy:\"Знак охраны авторского права\",ordf:\"Указатель окончания женского рода ...ая\",laquo:\"Левая кавычка-«ёлочка»\",\nnot:\"Отрицание\",reg:\"Знак охраны смежных прав\\\\t\",macr:\"Макрон\",deg:\"Градус\",sup2:\"Надстрочное два\",sup3:\"Надстрочное три\",acute:\"Акут\",micro:\"Микро\",para:\"Абзац\",middot:\"Интерпункт\",cedil:\"Седиль\",sup1:\"Надстрочная единица\",ordm:\"Порядковое числительное\",raquo:\"Правая кавычка-«ёлочка»\",frac14:\"Одна четвертая\",frac12:\"Одна вторая\",frac34:\"Три четвёртых\",iquest:\"Перевёрнутый вопросительный знак\",Agrave:\"Латинская заглавная буква А с апострофом\",Aacute:\"Латинская заглавная буква A с ударением\",Acirc:\"Латинская заглавная буква А с циркумфлексом\",\nAtilde:\"Латинская заглавная буква А с тильдой\",Auml:\"Латинская заглавная буква А с тремой\",Aring:\"Латинская заглавная буква А с кольцом над ней\",AElig:\"Латинская большая буква Æ\",Ccedil:\"Латинская заглавная буква C с седилью\",Egrave:\"Латинская заглавная буква Е с апострофом\",Eacute:\"Латинская заглавная буква Е с ударением\",Ecirc:\"Латинская заглавная буква Е с циркумфлексом\",Euml:\"Латинская заглавная буква Е с тремой\",Igrave:\"Латинская заглавная буква I с апострофом\",Iacute:\"Латинская заглавная буква I с ударением\",\nIcirc:\"Латинская заглавная буква I с циркумфлексом\",Iuml:\"Латинская заглавная буква I с тремой\",ETH:\"Латинская большая буква Eth\",Ntilde:\"Латинская заглавная буква N с тильдой\",Ograve:\"Латинская заглавная буква O с апострофом\",Oacute:\"Латинская заглавная буква O с ударением\",Ocirc:\"Латинская заглавная буква O с циркумфлексом\",Otilde:\"Латинская заглавная буква O с тильдой\",Ouml:\"Латинская заглавная буква O с тремой\",times:\"Знак умножения\",Oslash:\"Латинская большая перечеркнутая O\",Ugrave:\"Латинская заглавная буква U с апострофом\",\nUacute:\"Латинская заглавная буква U с ударением\",Ucirc:\"Латинская заглавная буква U с циркумфлексом\",Uuml:\"Латинская заглавная буква U с тремой\",Yacute:\"Латинская заглавная буква Y с ударением\",THORN:\"Латинская заглавная буква Thorn\",szlig:\"Знак диеза\",agrave:\"Латинская маленькая буква a с апострофом\",aacute:\"Латинская маленькая буква a с ударением\",acirc:\"Латинская маленькая буква a с циркумфлексом\",atilde:\"Латинская маленькая буква a с тильдой\",auml:\"Латинская маленькая буква a с тремой\",aring:\"Латинская маленькая буква a с кольцом\",\naelig:\"Латинская маленькая буква æ\",ccedil:\"Латинская маленькая буква с с седилью\",egrave:\"Латинская маленькая буква е с апострофом\",eacute:\"Латинская маленькая буква е с ударением\",ecirc:\"Латинская маленькая буква е с циркумфлексом\",euml:\"Латинская маленькая буква е с тремой\",igrave:\"Латинская маленькая буква i с апострофом\",iacute:\"Латинская маленькая буква i с ударением\",icirc:\"Латинская маленькая буква i с циркумфлексом\",iuml:\"Латинская маленькая буква i с тремой\",eth:\"Латинская маленькая буква eth\",\nntilde:\"Латинская маленькая буква n с тильдой\",ograve:\"Латинская маленькая буква o с апострофом\",oacute:\"Латинская маленькая буква o с ударением\",ocirc:\"Латинская маленькая буква o с циркумфлексом\",otilde:\"Латинская маленькая буква o с тильдой\",ouml:\"Латинская маленькая буква o с тремой\",divide:\"Знак деления\",oslash:\"Латинская строчная перечеркнутая o\",ugrave:\"Латинская маленькая буква u с апострофом\",uacute:\"Латинская маленькая буква u с ударением\",ucirc:\"Латинская маленькая буква u с циркумфлексом\",\nuuml:\"Латинская маленькая буква u с тремой\",yacute:\"Латинская маленькая буква y с ударением\",thorn:\"Латинская маленькая буква thorn\",yuml:\"Латинская маленькая буква y с тремой\",OElig:\"Латинская прописная лигатура OE\",oelig:\"Латинская строчная лигатура oe\",372:\"Латинская заглавная буква W с циркумфлексом\",374:\"Латинская заглавная буква Y с циркумфлексом\",373:\"Латинская маленькая буква w с циркумфлексом\",375:\"Латинская маленькая буква y с циркумфлексом\",sbquo:\"Нижняя одинарная кавычка\",8219:\"Правая одинарная кавычка\",\nbdquo:\"Левая двойная кавычка\",hellip:\"Горизонтальное многоточие\",trade:\"Товарный знак\",9658:\"Черный указатель вправо\",bull:\"Маркер списка\",rarr:\"Стрелка вправо\",rArr:\"Двойная стрелка вправо\",hArr:\"Двойная стрелка влево-вправо\",diams:\"Черный ромб\",asymp:\"Примерно равно\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/si.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"si\",{euro:\"යුරෝ සලකුණ\",lsquo:\"වමේ තනි උපුටා දක්වීම \",rsquo:\"දකුණේ තනි උපුටා දක්වීම \",ldquo:\"වමේ දිත්ව  උපුටා දක්වීම \",rdquo:\"දකුණේ දිත්ව  උපුටා දක්වීම \",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"යටිකුරු හර්ෂදී \",cent:\"Cent sign\",pound:\"Pound sign\",curren:\"මුල්‍යමය \",yen:\"යෙන් \",brvbar:\"Broken bar\",sect:\"තෙරේම් \",uml:\"Diaeresis\",copy:\"පිටපත් අයිතිය \",ordf:\"දර්ශකය\",laquo:\"Left-pointing double angle quotation mark\",not:\"සලකුණක් නොවේ\",reg:\"සලකුණක් ලියාපදිංචි කිරීම\",\nmacr:\"මුද්‍රිත \",deg:\"සලකුණේ \",sup2:\"උඩු ලකුණු දෙක\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",Aacute:\"Latin capital letter A with acute accent\",\nAcirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",Iacute:\"Latin capital letter I with acute accent\",\nIcirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",Ugrave:\"Latin capital letter U with grave accent\",\nUacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",aring:\"Latin small letter a with ring above\",\naelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",ntilde:\"Latin small letter n with tilde\",\nograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",yacute:\"Latin small letter y with acute accent\",\nthorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",trade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",\nbull:\"Bullet\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/sk.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"sk\",{euro:\"Znak eura\",lsquo:\"Ľavá jednoduchá úvodzovka\",rsquo:\"Pravá jednoduchá úvodzovka\",ldquo:\"Pravá dvojitá úvodzovka\",rdquo:\"Pravá dvojitá úvodzovka\",ndash:\"En pomlčka\",mdash:\"Em pomlčka\",iexcl:\"Obrátený výkričník\",cent:\"Znak centu\",pound:\"Znak libry\",curren:\"Znak meny\",yen:\"Znak jenu\",brvbar:\"Prerušená zvislá čiara\",sect:\"Znak odseku\",uml:\"Prehláska\",copy:\"Znak copyrightu\",ordf:\"Ženský indikátor rodu\",laquo:\"Znak dvojitých lomených úvodzoviek vľavo\",not:\"Logistický zápor\",\nreg:\"Znak registrácie\",macr:\"Pomlčka nad\",deg:\"Znak stupňa\",sup2:\"Dvojka ako horný index\",sup3:\"Trojka ako horný index\",acute:\"Dĺžeň\",micro:\"Znak mikro\",para:\"Znak odstavca\",middot:\"Bodka uprostred\",cedil:\"Chvost vľavo\",sup1:\"Jednotka ako horný index\",ordm:\"Mužský indikátor rodu\",raquo:\"Znak dvojitých lomených úvodzoviek vpravo\",frac14:\"Obyčajný zlomok jedna štvrtina\",frac12:\"Obyčajný zlomok jedna polovica\",frac34:\"Obyčajný zlomok tri štvrtiny\",iquest:\"Otočený otáznik\",Agrave:\"Veľké písmeno latinky A s accentom\",\nAacute:\"Veľké písmeno latinky A s dĺžňom\",Acirc:\"Veľké písmeno latinky A s mäkčeňom\",Atilde:\"Veľké písmeno latinky A s tildou\",Auml:\"Veľké písmeno latinky A s dvoma bodkami\",Aring:\"Veľké písmeno latinky A s krúžkom nad\",AElig:\"Veľké písmeno latinky Æ\",Ccedil:\"Veľké písmeno latinky C s chvostom vľavo\",Egrave:\"Veľké písmeno latinky E s accentom\",Eacute:\"Veľké písmeno latinky E s dĺžňom\",Ecirc:\"Veľké písmeno latinky E s mäkčeňom\",Euml:\"Veľké písmeno latinky E s dvoma bodkami\",Igrave:\"Veľké písmeno latinky I s accentom\",\nIacute:\"Veľké písmeno latinky I s dĺžňom\",Icirc:\"Veľké písmeno latinky I s mäkčeňom\",Iuml:\"Veľké písmeno latinky I s dvoma bodkami\",ETH:\"Veľké písmeno latinky Eth\",Ntilde:\"Veľké písmeno latinky N s tildou\",Ograve:\"Veľké písmeno latinky O s accentom\",Oacute:\"Veľké písmeno latinky O s dĺžňom\",Ocirc:\"Veľké písmeno latinky O s mäkčeňom\",Otilde:\"Veľké písmeno latinky O s tildou\",Ouml:\"Veľké písmeno latinky O s dvoma bodkami\",times:\"Znak násobenia\",Oslash:\"Veľké písmeno latinky O preškrtnuté\",Ugrave:\"Veľké písmeno latinky U s accentom\",\nUacute:\"Veľké písmeno latinky U s dĺžňom\",Ucirc:\"Veľké písmeno latinky U s mäkčeňom\",Uuml:\"Veľké písmeno latinky U s dvoma bodkami\",Yacute:\"Veľké písmeno latinky Y s dĺžňom\",THORN:\"Veľké písmeno latinky Thorn\",szlig:\"Malé písmeno latinky ostré s\",agrave:\"Malé písmeno latinky a s accentom\",aacute:\"Malé písmeno latinky a s dĺžňom\",acirc:\"Malé písmeno latinky a s mäkčeňom\",atilde:\"Malé písmeno latinky a s tildou\",auml:\"Malé písmeno latinky a s dvoma bodkami\",aring:\"Malé písmeno latinky a s krúžkom nad\",\naelig:\"Malé písmeno latinky æ\",ccedil:\"Malé písmeno latinky c s chvostom vľavo\",egrave:\"Malé písmeno latinky e s accentom\",eacute:\"Malé písmeno latinky e s dĺžňom\",ecirc:\"Malé písmeno latinky e s mäkčeňom\",euml:\"Malé písmeno latinky e s dvoma bodkami\",igrave:\"Malé písmeno latinky i s accentom\",iacute:\"Malé písmeno latinky i s dĺžňom\",icirc:\"Malé písmeno latinky i s mäkčeňom\",iuml:\"Malé písmeno latinky i s dvoma bodkami\",eth:\"Malé písmeno latinky eth\",ntilde:\"Malé písmeno latinky n s tildou\",ograve:\"Malé písmeno latinky o s accentom\",\noacute:\"Malé písmeno latinky o s dĺžňom\",ocirc:\"Malé písmeno latinky o s mäkčeňom\",otilde:\"Malé písmeno latinky o s tildou\",ouml:\"Malé písmeno latinky o s dvoma bodkami\",divide:\"Znak delenia\",oslash:\"Malé písmeno latinky o preškrtnuté\",ugrave:\"Malé písmeno latinky u s accentom\",uacute:\"Malé písmeno latinky u s dĺžňom\",ucirc:\"Malé písmeno latinky u s mäkčeňom\",uuml:\"Malé písmeno latinky u s dvoma bodkami\",yacute:\"Malé písmeno latinky y s dĺžňom\",thorn:\"Malé písmeno latinky thorn\",yuml:\"Malé písmeno latinky y s dvoma bodkami\",\nOElig:\"Veľká ligatúra latinky OE\",oelig:\"Malá ligatúra latinky OE\",372:\"Veľké písmeno latinky W s mäkčeňom\",374:\"Veľké písmeno latinky Y s mäkčeňom\",373:\"Malé písmeno latinky w s mäkčeňom\",375:\"Malé písmeno latinky y s mäkčeňom\",sbquo:\"Dolná jednoduchá 9-úvodzovka\",8219:\"Horná jednoduchá otočená 9-úvodzovka\",bdquo:\"Dolná dvojitá 9-úvodzovka\",hellip:\"Trojbodkový úvod\",trade:\"Znak ibchodnej značky\",9658:\"Čierny ukazovateľ smerujúci vpravo\",bull:\"Kruh\",rarr:\"Šípka vpravo\",rArr:\"Dvojitá šipka vpravo\",\nhArr:\"Dvojitá šipka vľavo a vpravo\",diams:\"Čierne piky\",asymp:\"Skoro sa rovná\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/sl.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"sl\",{euro:\"Evro znak\",lsquo:\"Levi enojni narekovaj\",rsquo:\"Desni enojni narekovaj\",ldquo:\"Levi dvojni narekovaj\",rdquo:\"Desni dvojni narekovaj\",ndash:\"En pomišljaj\",mdash:\"Em pomišljaj\",iexcl:\"Obrnjen klicaj\",cent:\"Cent znak\",pound:\"Funt znak\",curren:\"Znak valute\",yen:\"Jen znak\",brvbar:\"Zlomljena črta\",sect:\"Znak oddelka\",uml:\"Diaeresis\",copy:\"Znak avtorskih pravic\",ordf:\"Ženski zaporedni kazalnik\",laquo:\"Levi obrnjen dvojni kotni narekovaj\",not:\"Ne znak\",reg:\"Registrirani znak\",\nmacr:\"Macron\",deg:\"Znak stopinj\",sup2:\"Nadpisano dva\",sup3:\"Nadpisano tri\",acute:\"Ostrivec\",micro:\"Mikro znak\",para:\"Pilcrow znak\",middot:\"Sredinska pika\",cedil:\"Cedilla\",sup1:\"Nadpisano ena\",ordm:\"Moški zaporedni kazalnik\",raquo:\"Desno obrnjen dvojni kotni narekovaj\",frac14:\"Ena četrtina\",frac12:\"Ena polovica\",frac34:\"Tri četrtine\",iquest:\"Obrnjen vprašaj\",Agrave:\"Velika latinska črka A s krativcem\",Aacute:\"Velika latinska črka A z ostrivcem\",Acirc:\"Velika latinska črka A s strešico\",Atilde:\"Velika latinska črka A z tildo\",\nAuml:\"Velika latinska črka A z diaeresis-om\",Aring:\"Velika latinska črka A z obročem\",AElig:\"Velika latinska črka Æ\",Ccedil:\"Velika latinska črka C s cedillo\",Egrave:\"Velika latinska črka E s krativcem\",Eacute:\"Velika latinska črka E z ostrivcem\",Ecirc:\"Velika latinska črka E s strešico\",Euml:\"Velika latinska črka E z diaeresis-om\",Igrave:\"Velika latinska črka I s krativcem\",Iacute:\"Velika latinska črka I z ostrivcem\",Icirc:\"Velika latinska črka I s strešico\",Iuml:\"Velika latinska črka I z diaeresis-om\",\nETH:\"Velika latinska črka Eth\",Ntilde:\"Velika latinska črka N s tildo\",Ograve:\"Velika latinska črka O s krativcem\",Oacute:\"Velika latinska črka O z ostrivcem\",Ocirc:\"Velika latinska črka O s strešico\",Otilde:\"Velika latinska črka O s tildo\",Ouml:\"Velika latinska črka O z diaeresis-om\",times:\"Znak za množenje\",Oslash:\"Velika prečrtana latinska črka O\",Ugrave:\"Velika latinska črka U s krativcem\",Uacute:\"Velika latinska črka U z ostrivcem\",Ucirc:\"Velika latinska črka U s strešico\",Uuml:\"Velika latinska črka U z diaeresis-om\",\nYacute:\"Velika latinska črka Y z ostrivcem\",THORN:\"Velika latinska črka Thorn\",szlig:\"Mala ostra latinska črka s\",agrave:\"Mala latinska črka a s krativcem\",aacute:\"Mala latinska črka a z ostrivcem\",acirc:\"Mala latinska črka a s strešico\",atilde:\"Mala latinska črka a s tildo\",auml:\"Mala latinska črka a z diaeresis-om\",aring:\"Mala latinska črka a z obročem\",aelig:\"Mala latinska črka æ\",ccedil:\"Mala latinska črka c s cedillo\",egrave:\"Mala latinska črka e s krativcem\",eacute:\"Mala latinska črka e z ostrivcem\",\necirc:\"Mala latinska črka e s strešico\",euml:\"Mala latinska črka e z diaeresis-om\",igrave:\"Mala latinska črka i s krativcem\",iacute:\"Mala latinska črka i z ostrivcem\",icirc:\"Mala latinska črka i s strešico\",iuml:\"Mala latinska črka i z diaeresis-om\",eth:\"Mala latinska črka eth\",ntilde:\"Mala latinska črka n s tildo\",ograve:\"Mala latinska črka o s krativcem\",oacute:\"Mala latinska črka o z ostrivcem\",ocirc:\"Mala latinska črka o s strešico\",otilde:\"Mala latinska črka o s tildo\",ouml:\"Mala latinska črka o z diaeresis-om\",\ndivide:\"Znak za deljenje\",oslash:\"Mala prečrtana latinska črka o\",ugrave:\"Mala latinska črka u s krativcem\",uacute:\"Mala latinska črka u z ostrivcem\",ucirc:\"Mala latinska črka u s strešico\",uuml:\"Mala latinska črka u z diaeresis-om\",yacute:\"Mala latinska črka y z ostrivcem\",thorn:\"Mala latinska črka thorn\",yuml:\"Mala latinska črka y z diaeresis-om\",OElig:\"Velika latinska ligatura OE\",oelig:\"Mala latinska ligatura oe\",372:\"Velika latinska črka W s strešico\",374:\"Velika latinska črka Y s strešico\",\n373:\"Mala latinska črka w s strešico\",375:\"Mala latinska črka y s strešico\",sbquo:\"Enojni nizki-9 narekovaj\",8219:\"Enojni visoki-obrnjen-9 narekovaj\",bdquo:\"Dvojni nizki-9 narekovaj\",hellip:\"Horizontalni izpust\",trade:\"Znak blagovne znamke\",9658:\"Črni desno-usmerjen kazalec\",bull:\"Krogla\",rarr:\"Desno-usmerjena puščica\",rArr:\"Desno-usmerjena dvojna puščica\",hArr:\"Leva in desna dvojna puščica\",diams:\"Črna kara\",asymp:\"Skoraj enako\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/sq.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"sq\",{euro:\"Shenja e Euros\",lsquo:\"Thonjëza majtas me një vi\",rsquo:\"Thonjëza djathtas me një vi\",ldquo:\"Thonjëza majtas\",rdquo:\"Thonjëza djathtas\",ndash:\"En viza lidhëse\",mdash:\"Em viza lidhëse\",iexcl:\"Pikëçuditëse e përmbysur\",cent:\"Shenja e Centit\",pound:\"Shejna e Funtit\",curren:\"Shenja e valutës\",yen:\"Shenja e Jenit\",brvbar:\"Viza e këputur\",sect:\"Shenja e pjesës\",uml:\"Diaeresis\",copy:\"Shenja e të drejtave të kopjimit\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Nuk ka shenjë\",reg:\"Shenja e të regjistruarit\",macr:\"Macron\",deg:\"Shenja e shkallës\",sup2:\"Super-skripta dy\",sup3:\"Super-skripta tre\",acute:\"Theks i mprehtë\",micro:\"Shjenja e Mikros\",para:\"Pilcrow sign\",middot:\"Pika e Mesme\",cedil:\"Hark nën shkronja\",sup1:\"Super-skripta një\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Thyesa një të katrat\",frac12:\"Thyesa një të dytat\",frac34:\"Thyesa tre të katrat\",iquest:\"Pikëpyetje e përmbysur\",Agrave:\"Shkronja e madhe latine A me theks të rëndë\",\nAacute:\"Shkronja e madhe latine A me theks akute\",Acirc:\"Shkronja e madhe latine A me theks lakor\",Atilde:\"Shkronja e madhe latine A me tildë\",Auml:\"Shkronja e madhe latine A me dy pika\",Aring:\"Shkronja e madhe latine A me unazë mbi\",AElig:\"Shkronja e madhe latine Æ\",Ccedil:\"Shkronja e madhe latine C me hark poshtë\",Egrave:\"Shkronja e madhe latine E me theks të rëndë\",Eacute:\"Shkronja e madhe latine E me theks akute\",Ecirc:\"Shkronja e madhe latine E me theks lakor\",Euml:\"Shkronja e madhe latine E me dy pika\",\nIgrave:\"Shkronja e madhe latine I me theks të rëndë\",Iacute:\"Shkronja e madhe latine I me theks akute\",Icirc:\"Shkronja e madhe latine I me theks lakor\",Iuml:\"Shkronja e madhe latine I me dy pika\",ETH:\"Shkronja e madhe latine Eth\",Ntilde:\"Shkronja e madhe latine N me tildë\",Ograve:\"Shkronja e madhe latine O me theks të rëndë\",Oacute:\"Shkronja e madhe latine O me theks akute\",Ocirc:\"Shkronja e madhe latine O me theks lakor\",Otilde:\"Shkronja e madhe latine O me tildë\",Ouml:\"Shkronja e madhe latine O me dy pika\",\ntimes:\"Shenja e shumëzimit\",Oslash:\"Shkronja e madhe latine O me vizë në mes\",Ugrave:\"Shkronja e madhe latine U me theks të rëndë\",Uacute:\"Shkronja e madhe latine U me theks akute\",Ucirc:\"Shkronja e madhe latine U me theks lakor\",Uuml:\"Shkronja e madhe latine U me dy pika\",Yacute:\"Shkronja e madhe latine Y me theks akute\",THORN:\"Shkronja e madhe latine Thorn\",szlig:\"Shkronja e vogë latine s e mprehtë\",agrave:\"Shkronja e vogë latine a me theks të rëndë\",aacute:\"Shkronja e vogë latine a me theks të mprehtë\",\nacirc:\"Shkronja e vogël latine a me theks lakor\",atilde:\"Shkronja e vogël latine a me tildë\",auml:\"Shkronja e vogël latine a me dy pika\",aring:\"Shkronja e vogë latine a me unazë mbi\",aelig:\"Shkronja e vogë latine æ\",ccedil:\"Shkronja e vogël latine c me hark poshtë\",egrave:\"Shkronja e vogë latine e me theks të rëndë\",eacute:\"Shkronja e vogë latine e me theks të mprehtë\",ecirc:\"Shkronja e vogël latine e me theks lakor\",euml:\"Shkronja e vogël latine e me dy pika\",igrave:\"Shkronja e vogë latine i me theks të rëndë\",\niacute:\"Shkronja e vogë latine i me theks të mprehtë\",icirc:\"Shkronja e vogël latine i me theks lakor\",iuml:\"Shkronja e vogël latine i me dy pika\",eth:\"Shkronja e vogë latine eth\",ntilde:\"Shkronja e vogël latine n me tildë\",ograve:\"Shkronja e vogë latine o me theks të rëndë\",oacute:\"Shkronja e vogë latine o me theks të mprehtë\",ocirc:\"Shkronja e vogël latine o me theks lakor\",otilde:\"Shkronja e vogël latine o me tildë\",ouml:\"Shkronja e vogël latine o me dy pika\",divide:\"Shenja ndarëse\",oslash:\"Shkronja e vogël latine o me vizë në mes\",\nugrave:\"Shkronja e vogë latine u me theks të rëndë\",uacute:\"Shkronja e vogë latine u me theks të mprehtë\",ucirc:\"Shkronja e vogël latine u me theks lakor\",uuml:\"Shkronja e vogël latine u me dy pika\",yacute:\"Shkronja e vogë latine y me theks të mprehtë\",thorn:\"Shkronja e vogël latine thorn\",yuml:\"Shkronja e vogël latine y me dy pika\",OElig:\"Shkronja e madhe e bashkuar latine OE\",oelig:\"Shkronja e vogël e bashkuar latine oe\",372:\"Shkronja e madhe latine W me theks lakor\",374:\"Shkronja e madhe latine Y me theks lakor\",\n373:\"Shkronja e vogël latine w me theks lakor\",375:\"Shkronja e vogël latine y me theks lakor\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",trade:\"Shenja e Simbolit Tregtarë\",9658:\"Black right-pointing pointer\",bull:\"Pulla\",rarr:\"Shigjeta djathtas\",rArr:\"Shenja të dyfishta djathtas\",hArr:\"Shigjeta e dyfishë majtas-djathtas\",diams:\"Black diamond suit\",asymp:\"Gati e barabar me\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/sv.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"sv\",{euro:\"Eurotecken\",lsquo:\"Enkelt vänster citattecken\",rsquo:\"Enkelt höger citattecken\",ldquo:\"Dubbelt vänster citattecken\",rdquo:\"Dubbelt höger citattecken\",ndash:\"Snedstreck\",mdash:\"Långt tankstreck\",iexcl:\"Inverterad utropstecken\",cent:\"Centtecken\",pound:\"Pundtecken\",curren:\"Valutatecken\",yen:\"Yentecken\",brvbar:\"Brutet lodrätt streck\",sect:\"Paragraftecken\",uml:\"Diaeresis\",copy:\"Upphovsrättstecken\",ordf:\"Feminit ordningstalsindikator\",laquo:\"Vänsterställt dubbelt vinkelcitationstecken\",\nnot:\"Icke-tecken\",reg:\"Registrerad\",macr:\"Macron\",deg:\"Grader\",sup2:\"Upphöjt två\",sup3:\"Upphöjt tre\",acute:\"Akut accent\",micro:\"Mikrotecken\",para:\"Alinea\",middot:\"Centrerad prick\",cedil:\"Cedilj\",sup1:\"Upphöjt en\",ordm:\"Maskulina ordningsändelsen\",raquo:\"Högerställt dubbelt vinkelcitationstecken\",frac14:\"Bråktal - en kvart\",frac12:\"Bråktal - en halv\",frac34:\"Bråktal - tre fjärdedelar\",iquest:\"Inverterat frågetecken\",Agrave:\"Stort A med grav accent\",Aacute:\"Stort A med akutaccent\",Acirc:\"Stort A med circumflex\",\nAtilde:\"Stort A med tilde\",Auml:\"Stort A med diaresis\",Aring:\"Stort A med ring ovan\",AElig:\"Stort Æ\",Ccedil:\"Stort C med cedilj\",Egrave:\"Stort E med grav accent\",Eacute:\"Stort E med aktuaccent\",Ecirc:\"Stort E med circumflex\",Euml:\"Stort E med diaeresis\",Igrave:\"Stort I med grav accent\",Iacute:\"Stort I med akutaccent\",Icirc:\"Stort I med circumflex\",Iuml:\"Stort I med diaeresis\",ETH:\"Stort Eth\",Ntilde:\"Stort N med tilde\",Ograve:\"Stort O med grav accent\",Oacute:\"Stort O med aktuaccent\",Ocirc:\"Stort O med circumflex\",\nOtilde:\"Stort O med tilde\",Ouml:\"Stort O med diaeresis\",times:\"Multiplicera\",Oslash:\"Stor Ø\",Ugrave:\"Stort U med grav accent\",Uacute:\"Stort U med akutaccent\",Ucirc:\"Stort U med circumflex\",Uuml:\"Stort U med diaeresis\",Yacute:\"Stort Y med akutaccent\",THORN:\"Stort Thorn\",szlig:\"Litet dubbel-s/Eszett\",agrave:\"Litet a med grav accent\",aacute:\"Litet a med akutaccent\",acirc:\"Litet a med circumflex\",atilde:\"Litet a med tilde\",auml:\"Litet a med diaeresis\",aring:\"Litet a med ring ovan\",aelig:\"Bokstaven æ\",\nccedil:\"Litet c med cedilj\",egrave:\"Litet e med grav accent\",eacute:\"Litet e med akutaccent\",ecirc:\"Litet e med circumflex\",euml:\"Litet e med diaeresis\",igrave:\"Litet i med grav accent\",iacute:\"Litet i med akutaccent\",icirc:\"LItet i med circumflex\",iuml:\"Litet i med didaeresis\",eth:\"Litet eth\",ntilde:\"Litet n med tilde\",ograve:\"LItet o med grav accent\",oacute:\"LItet o med akutaccent\",ocirc:\"Litet o med circumflex\",otilde:\"LItet o med tilde\",ouml:\"Litet o med diaeresis\",divide:\"Division\",oslash:\"ø\",\nugrave:\"Litet u med grav accent\",uacute:\"Litet u med akutaccent\",ucirc:\"LItet u med circumflex\",uuml:\"Litet u med diaeresis\",yacute:\"Litet y med akutaccent\",thorn:\"Litet thorn\",yuml:\"Litet y med diaeresis\",OElig:\"Stor ligatur av OE\",oelig:\"Liten ligatur av oe\",372:\"Stort W med circumflex\",374:\"Stort Y med circumflex\",373:\"Litet w med circumflex\",375:\"Litet y med circumflex\",sbquo:\"Enkelt lågt 9-citationstecken\",8219:\"Enkelt högt bakvänt 9-citationstecken\",bdquo:\"Dubbelt lågt 9-citationstecken\",hellip:\"Horisontellt uteslutningstecken\",\ntrade:\"Varumärke\",9658:\"Svart högervänd pekare\",bull:\"Listpunkt\",rarr:\"Högerpil\",rArr:\"Dubbel högerpil\",hArr:\"Dubbel vänsterpil\",diams:\"Svart ruter\",asymp:\"Ungefär lika med\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/th.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"th\",{euro:\"Euro sign\",lsquo:\"Left single quotation mark\",rsquo:\"Right single quotation mark\",ldquo:\"Left double quotation mark\",rdquo:\"Right double quotation mark\",ndash:\"En dash\",mdash:\"Em dash\",iexcl:\"Inverted exclamation mark\",cent:\"Cent sign\",pound:\"Pound sign\",curren:\"สัญลักษณ์สกุลเงิน\",yen:\"สัญลักษณ์เงินเยน\",brvbar:\"Broken bar\",sect:\"Section sign\",uml:\"Diaeresis\",copy:\"Copyright sign\",ordf:\"Feminine ordinal indicator\",laquo:\"Left-pointing double angle quotation mark\",\nnot:\"Not sign\",reg:\"Registered sign\",macr:\"Macron\",deg:\"Degree sign\",sup2:\"Superscript two\",sup3:\"Superscript three\",acute:\"Acute accent\",micro:\"Micro sign\",para:\"Pilcrow sign\",middot:\"Middle dot\",cedil:\"Cedilla\",sup1:\"Superscript one\",ordm:\"Masculine ordinal indicator\",raquo:\"Right-pointing double angle quotation mark\",frac14:\"Vulgar fraction one quarter\",frac12:\"Vulgar fraction one half\",frac34:\"Vulgar fraction three quarters\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",\nAacute:\"Latin capital letter A with acute accent\",Acirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",\nIacute:\"Latin capital letter I with acute accent\",Icirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"Latin capital letter O with grave accent\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",\nUgrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",Ucirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",\naring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",ccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",\nntilde:\"Latin small letter n with tilde\",ograve:\"Latin small letter o with grave accent\",oacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"Division sign\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",\nyacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",yuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",\ntrade:\"Trade mark sign\",9658:\"Black right-pointing pointer\",bull:\"สัญลักษณ์หัวข้อย่อย\",rarr:\"Rightwards arrow\",rArr:\"Rightwards double arrow\",hArr:\"Left right double arrow\",diams:\"Black diamond suit\",asymp:\"Almost equal to\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/tr.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"tr\",{euro:\"Euro işareti\",lsquo:\"Sol tek tırnak işareti\",rsquo:\"Sağ tek tırnak işareti\",ldquo:\"Sol çift tırnak işareti\",rdquo:\"Sağ çift tırnak işareti\",ndash:\"En tire\",mdash:\"Em tire\",iexcl:\"Ters ünlem işareti\",cent:\"Cent işareti\",pound:\"Pound işareti\",curren:\"Para birimi işareti\",yen:\"Yen işareti\",brvbar:\"Kırık bar\",sect:\"Bölüm işareti\",uml:\"İki sesli harfin ayrılması\",copy:\"Telif hakkı işareti\",ordf:\"Dişil sıralı gösterge\",laquo:\"Sol-işaret çift açı tırnak işareti\",\nnot:\"Not işareti\",reg:\"Kayıtlı işareti\",macr:\"Makron\",deg:\"Derece işareti\",sup2:\"İkili üstsimge\",sup3:\"Üçlü üstsimge\",acute:\"Aksan işareti\",micro:\"Mikro işareti\",para:\"Pilcrow işareti\",middot:\"Orta nokta\",cedil:\"Kedilla\",sup1:\"Üstsimge\",ordm:\"Eril sıralı gösterge\",raquo:\"Sağ işaret çift açı tırnak işareti\",frac14:\"Bayağı kesrin dörtte biri\",frac12:\"Bayağı kesrin bir yarım\",frac34:\"Bayağı kesrin dörtte üç\",iquest:\"Ters soru işareti\",Agrave:\"Aksanlı latin harfi\",Aacute:\"Aşırı aksanıyla Latin harfi\",\nAcirc:\"Çarpık Latin harfi\",Atilde:\"Tilde latin harfi\",Auml:\"Sesli harf ayrılımlıı latin harfi\",Aring:\"Halkalı latin büyük A harfi\",AElig:\"Latin büyük Æ harfi\",Ccedil:\"Latin büyük C harfi ile kedilla\",Egrave:\"Aksanlı latin büyük E harfi\",Eacute:\"Aşırı vurgulu latin büyük E harfi\",Ecirc:\"Çarpık latin büyük E harfi\",Euml:\"Sesli harf ayrılımlıı latin büyük E harfi\",Igrave:\"Aksanlı latin büyük I harfi\",Iacute:\"Aşırı aksanlı latin büyük I harfi\",Icirc:\"Çarpık latin büyük I harfi\",Iuml:\"Sesli harf ayrılımlıı latin büyük I harfi\",\nETH:\"Latin büyük Eth harfi\",Ntilde:\"Tildeli latin büyük N harfi\",Ograve:\"Aksanlı latin büyük O harfi\",Oacute:\"Aşırı aksanlı latin büyük O harfi\",Ocirc:\"Çarpık latin büyük O harfi\",Otilde:\"Tildeli latin büyük O harfi\",Ouml:\"Sesli harf ayrılımlı latin büyük O harfi\",times:\"Çarpma işareti\",Oslash:\"Vurgulu latin büyük O harfi\",Ugrave:\"Aksanlı latin büyük U harfi\",Uacute:\"Aşırı aksanlı latin büyük U harfi\",Ucirc:\"Çarpık latin büyük U harfi\",Uuml:\"Sesli harf ayrılımlı latin büyük U harfi\",Yacute:\"Aşırı aksanlı latin büyük Y harfi\",\nTHORN:\"Latin büyük Thorn harfi\",szlig:\"Latin küçük keskin s harfi\",agrave:\"Aksanlı latin küçük a harfi\",aacute:\"Aşırı aksanlı latin küçük a harfi\",acirc:\"Çarpık latin küçük a harfi\",atilde:\"Tildeli latin küçük a harfi\",auml:\"Sesli harf ayrılımlı latin küçük a harfi\",aring:\"Halkalı latin küçük a harfi\",aelig:\"Latin büyük æ harfi\",ccedil:\"Kedillalı latin küçük c harfi\",egrave:\"Aksanlı latin küçük e harfi\",eacute:\"Aşırı aksanlı latin küçük e harfi\",ecirc:\"Çarpık latin küçük e harfi\",euml:\"Sesli harf ayrılımlı latin küçük e harfi\",\nigrave:\"Aksanlı latin küçük i harfi\",iacute:\"Aşırı aksanlı latin küçük i harfi\",icirc:\"Çarpık latin küçük i harfi\",iuml:\"Sesli harf ayrılımlı latin küçük i harfi\",eth:\"Latin küçük eth harfi\",ntilde:\"Tildeli latin küçük n harfi\",ograve:\"Aksanlı latin küçük o harfi\",oacute:\"Aşırı aksanlı latin küçük o harfi\",ocirc:\"Çarpık latin küçük o harfi\",otilde:\"Tildeli latin küçük o harfi\",ouml:\"Sesli harf ayrılımlı latin küçük o harfi\",divide:\"Bölme işareti\",oslash:\"Vurgulu latin küçük o harfi\",ugrave:\"Aksanlı latin küçük u harfi\",\nuacute:\"Aşırı aksanlı latin küçük u harfi\",ucirc:\"Çarpık latin küçük u harfi\",uuml:\"Sesli harf ayrılımlı latin küçük u harfi\",yacute:\"Aşırı aksanlı latin küçük y harfi\",thorn:\"Latin küçük thorn harfi\",yuml:\"Sesli harf ayrılımlı latin küçük y harfi\",OElig:\"Latin büyük bağlı OE harfi\",oelig:\"Latin küçük bağlı oe harfi\",372:\"Çarpık latin büyük W harfi\",374:\"Çarpık latin büyük Y harfi\",373:\"Çarpık latin küçük w harfi\",375:\"Çarpık latin küçük y harfi\",sbquo:\"Tek düşük-9 tırnak işareti\",8219:\"Tek yüksek-ters-9 tırnak işareti\",\nbdquo:\"Çift düşük-9 tırnak işareti\",hellip:\"Yatay elips\",trade:\"Marka tescili işareti\",9658:\"Siyah sağ işaret işaretçisi\",bull:\"Koyu nokta\",rarr:\"Sağa doğru ok\",rArr:\"Sağa doğru çift ok\",hArr:\"Sol, sağ çift ok\",diams:\"Siyah elmas takımı\",asymp:\"Hemen hemen eşit\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/tt.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"tt\",{euro:\"Евро тамгасы\",lsquo:\"Сул бер иңле куштырнаклар\",rsquo:\"Уң бер иңле куштырнаклар\",ldquo:\"Сул ике иңле куштырнаклар\",rdquo:\"Уң ике иңле куштырнаклар\",ndash:\"Кыска сызык\",mdash:\"Озын сызык\",iexcl:\"Әйләндерелгән өндәү билгесе\",cent:\"Цент тамгасы\",pound:\"Фунт тамгасы\",curren:\"Акча берәмлеге тамгасы\",yen:\"Иена тамгасы\",brvbar:\"Broken bar\",sect:\"Параграф билгесе\",uml:\"Диерезис\",copy:\"Хокук иясе булу билгесе\",ordf:\"Feminine ordinal indicator\",laquo:\"Ачылучы чыршысыман җәя\",\nnot:\"Юклык ишарəсе\",reg:\"Теркәләнгән булу билгесе\",macr:\"Макрон\",deg:\"Градус билгесе\",sup2:\"Икенче өске индекс\",sup3:\"Өченче өске индекс\",acute:\"Басым билгесе\",micro:\"Микро билгесе\",para:\"Параграф билгесе\",middot:\"Уртадагы нокта\",cedil:\"Седиль\",sup1:\"Беренче өске индекс\",ordm:\"Masculine ordinal indicator\",raquo:\"Ябылучы чыршысыман җәя\",frac14:\"Гади дүрттән бер билгесе\",frac12:\"Гади икедән бер билгесе\",frac34:\"Гади дүрттән өч билгесе\",iquest:\"Әйләндерелгән өндәү билгесе\",Agrave:\"Гравис белән латин A баш хәрефе\",\nAacute:\"Басым билгесе белән латин A баш хәрефе\",Acirc:\"Циркумфлекс белән латин A баш хәрефе\",Atilde:\"Тильда белән латин A баш хәрефе\",Auml:\"Диерезис белән латин A баш хәрефе\",Aring:\"Өстендә боҗра булган латин A баш хәрефе\",AElig:\"Латин Æ баш хәрефе\",Ccedil:\"Седиль белән латин C баш хәрефе\",Egrave:\"Гравис белән латин E баш хәрефе\",Eacute:\"Басым билгесе белән латин E баш хәрефе\",Ecirc:\"Циркумфлекс белән латин E баш хәрефе\",Euml:\"Диерезис белән латин E баш хәрефе\",Igrave:\"Гравис белән латин I баш хәрефе\",\nIacute:\"Басым билгесе белән латин I баш хәрефе\",Icirc:\"Циркумфлекс белән латин I баш хәрефе\",Iuml:\"Диерезис белән латин I баш хәрефе\",ETH:\"Латин Eth баш хәрефе\",Ntilde:\"Тильда белән латин N баш хәрефе\",Ograve:\"Гравис белән латин O баш хәрефе\",Oacute:\"Басым билгесе белән латин O баш хәрефе\",Ocirc:\"Циркумфлекс белән латин O баш хәрефе\",Otilde:\"Тильда белән латин O баш хәрефе\",Ouml:\"Диерезис белән латин O баш хәрефе\",times:\"Тапкырлау билгесе\",Oslash:\"Сызык белән латин O баш хәрефе\",Ugrave:\"Гравис белән латин U баш хәрефе\",\nUacute:\"Басым билгесе белән латин U баш хәрефе\",Ucirc:\"Циркумфлекс белән латин U баш хәрефе\",Uuml:\"Диерезис белән латин U баш хәрефе\",Yacute:\"Басым билгесе белән латин Y баш хәрефе\",THORN:\"Латин Thorn баш хәрефе\",szlig:\"Латин beta юл хәрефе\",agrave:\"Гравис белән латин a юл хәрефе\",aacute:\"Басым билгесе белән латин a юл хәрефе\",acirc:\"Циркумфлекс белән латин a юл хәрефе\",atilde:\"Тильда белән латин a юл хәрефе\",auml:\"Диерезис белән латин a юл хәрефе\",aring:\"Өстендә боҗра булган латин a юл хәрефе\",aelig:\"Латин æ юл хәрефе\",\nccedil:\"Седиль белән латин c юл хәрефе\",egrave:\"Гравис белән латин e юл хәрефе\",eacute:\"Басым билгесе белән латин e юл хәрефе\",ecirc:\"Циркумфлекс белән латин e юл хәрефе\",euml:\"Диерезис белән латин e юл хәрефе\",igrave:\"Гравис белән латин i юл хәрефе\",iacute:\"Басым билгесе белән латин i юл хәрефе\",icirc:\"Циркумфлекс белән латин i юл хәрефе\",iuml:\"Диерезис белән латин i юл хәрефе\",eth:\"Латин eth юл хәрефе\",ntilde:\"Тильда белән латин n юл хәрефе\",ograve:\"Гравис белән латин o юл хәрефе\",oacute:\"Басым билгесе белән латин o юл хәрефе\",\nocirc:\"Циркумфлекс белән латин o юл хәрефе\",otilde:\"Тильда белән латин o юл хәрефе\",ouml:\"Диерезис белән латин o юл хәрефе\",divide:\"Бүлү билгесе\",oslash:\"Сызык белән латин o юл хәрефе\",ugrave:\"Гравис белән латин u юл хәрефе\",uacute:\"Басым билгесе белән латин u юл хәрефе\",ucirc:\"Циркумфлекс белән латин u юл хәрефе\",uuml:\"Диерезис белән латин u юл хәрефе\",yacute:\"Басым билгесе белән латин y юл хәрефе\",thorn:\"Латин thorn юл хәрефе\",yuml:\"Диерезис белән латин y юл хәрефе\",OElig:\"Латин лигатура OE баш хәрефе\",\noelig:\"Латин лигатура oe юл хәрефе\",372:\"Циркумфлекс белән латин W баш хәрефе\",374:\"Циркумфлекс белән латин Y баш хәрефе\",373:\"Циркумфлекс белән латин w юл хәрефе\",375:\"Циркумфлекс белән латин y юл хәрефе\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Ятма эллипс\",trade:\"Сәүдә маркасы билгесе\",9658:\"Black right-pointing pointer\",bull:\"Маркер\",rarr:\"Уң якка ук\",rArr:\"Уң якка икеләтә ук\",hArr:\"Ике якка икеләтә ук\",diams:\"Black diamond suit\",\nasymp:\"якынча\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/ug.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"ug\",{euro:\"ياۋرو بەلگىسى\",lsquo:\"يالاڭ پەش سول\",rsquo:\"يالاڭ پەش ئوڭ\",ldquo:\"قوش پەش سول\",rdquo:\"قوش پەش ئوڭ\",ndash:\"سىزىقچە\",mdash:\"سىزىق\",iexcl:\"ئۈندەش\",cent:\"تىيىن بەلگىسى\",pound:\"فوند ستېرلىڭ\",curren:\"پۇل بەلگىسى\",yen:\"ياپونىيە يىنى\",brvbar:\"ئۈزۈك بالداق\",sect:\"پاراگراف بەلگىسى\",uml:\"تاۋۇش ئايرىش بەلگىسى\",copy:\"نەشر ھوقۇقى بەلگىسى\",ordf:\"Feminine ordinal indicator\",laquo:\"قوش تىرناق سول\",not:\"غەيرى بەلگە\",reg:\"خەتلەتكەن تاۋار ماركىسى\",macr:\"سوزۇش بەلگىسى\",\ndeg:\"گىرادۇس بەلگىسى\",sup2:\"يۇقىرى ئىندېكىس 2\",sup3:\"يۇقىرى ئىندېكىس 3\",acute:\"ئۇرغۇ بەلگىسى\",micro:\"Micro sign\",para:\"ئابزاس بەلگىسى\",middot:\"ئوتتۇرا چېكىت\",cedil:\"ئاستىغا قوشۇلىدىغان بەلگە\",sup1:\"يۇقىرى ئىندېكىس 1\",ordm:\"Masculine ordinal indicator\",raquo:\"قوش تىرناق ئوڭ\",frac14:\"ئاددىي كەسىر تۆتتىن بىر\",frac12:\"ئاددىي كەسىر ئىككىدىن بىر\",frac34:\"ئاددىي كەسىر ئۈچتىن تۆرت\",iquest:\"Inverted question mark\",Agrave:\"Latin capital letter A with grave accent\",Aacute:\"Latin capital letter A with acute accent\",\nAcirc:\"Latin capital letter A with circumflex\",Atilde:\"Latin capital letter A with tilde\",Auml:\"Latin capital letter A with diaeresis\",Aring:\"Latin capital letter A with ring above\",AElig:\"Latin Capital letter Æ\",Ccedil:\"Latin capital letter C with cedilla\",Egrave:\"Latin capital letter E with grave accent\",Eacute:\"Latin capital letter E with acute accent\",Ecirc:\"Latin capital letter E with circumflex\",Euml:\"Latin capital letter E with diaeresis\",Igrave:\"Latin capital letter I with grave accent\",Iacute:\"Latin capital letter I with acute accent\",\nIcirc:\"Latin capital letter I with circumflex\",Iuml:\"Latin capital letter I with diaeresis\",ETH:\"Latin capital letter Eth\",Ntilde:\"Latin capital letter N with tilde\",Ograve:\"قوش پەش ئوڭ\",Oacute:\"Latin capital letter O with acute accent\",Ocirc:\"Latin capital letter O with circumflex\",Otilde:\"Latin capital letter O with tilde\",Ouml:\"Latin capital letter O with diaeresis\",times:\"Multiplication sign\",Oslash:\"Latin capital letter O with stroke\",Ugrave:\"Latin capital letter U with grave accent\",Uacute:\"Latin capital letter U with acute accent\",\nUcirc:\"Latin capital letter U with circumflex\",Uuml:\"Latin capital letter U with diaeresis\",Yacute:\"Latin capital letter Y with acute accent\",THORN:\"Latin capital letter Thorn\",szlig:\"Latin small letter sharp s\",agrave:\"Latin small letter a with grave accent\",aacute:\"Latin small letter a with acute accent\",acirc:\"Latin small letter a with circumflex\",atilde:\"Latin small letter a with tilde\",auml:\"Latin small letter a with diaeresis\",aring:\"Latin small letter a with ring above\",aelig:\"Latin small letter æ\",\nccedil:\"Latin small letter c with cedilla\",egrave:\"Latin small letter e with grave accent\",eacute:\"Latin small letter e with acute accent\",ecirc:\"Latin small letter e with circumflex\",euml:\"Latin small letter e with diaeresis\",igrave:\"Latin small letter i with grave accent\",iacute:\"Latin small letter i with acute accent\",icirc:\"Latin small letter i with circumflex\",iuml:\"Latin small letter i with diaeresis\",eth:\"Latin small letter eth\",ntilde:\"تىك موللاق سوئال بەلگىسى\",ograve:\"Latin small letter o with grave accent\",\noacute:\"Latin small letter o with acute accent\",ocirc:\"Latin small letter o with circumflex\",otilde:\"Latin small letter o with tilde\",ouml:\"Latin small letter o with diaeresis\",divide:\"بۆلۈش بەلگىسى\",oslash:\"Latin small letter o with stroke\",ugrave:\"Latin small letter u with grave accent\",uacute:\"Latin small letter u with acute accent\",ucirc:\"Latin small letter u with circumflex\",uuml:\"Latin small letter u with diaeresis\",yacute:\"Latin small letter y with acute accent\",thorn:\"Latin small letter thorn\",\nyuml:\"Latin small letter y with diaeresis\",OElig:\"Latin capital ligature OE\",oelig:\"Latin small ligature oe\",372:\"Latin capital letter W with circumflex\",374:\"Latin capital letter Y with circumflex\",373:\"Latin small letter w with circumflex\",375:\"Latin small letter y with circumflex\",sbquo:\"Single low-9 quotation mark\",8219:\"Single high-reversed-9 quotation mark\",bdquo:\"Double low-9 quotation mark\",hellip:\"Horizontal ellipsis\",trade:\"خەتلەتكەن تاۋار ماركىسى بەلگىسى\",9658:\"Black right-pointing pointer\",\nbull:\"Bullet\",rarr:\"ئوڭ يا ئوق\",rArr:\"ئوڭ قوش سىزىق يا ئوق\",hArr:\"ئوڭ سول قوش سىزىق يا ئوق\",diams:\"ئۇيۇل غىچ\",asymp:\"تەخمىنەن تەڭ\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/uk.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"uk\",{euro:\"Знак євро\",lsquo:\"Ліві одинарні лапки\",rsquo:\"Праві одинарні лапки\",ldquo:\"Ліві подвійні лапки\",rdquo:\"Праві подвійні лапки\",ndash:\"Середнє тире\",mdash:\"Довге тире\",iexcl:\"Перевернутий знак оклику\",cent:\"Знак цента\",pound:\"Знак фунта\",curren:\"Знак валюти\",yen:\"Знак єни\",brvbar:\"Переривчаста вертикальна лінія\",sect:\"Знак параграфу\",uml:\"Умлаут\",copy:\"Знак авторських прав\",ordf:\"Жіночий порядковий вказівник\",laquo:\"ліві вказівні подвійні кутові дужки\",\nnot:\"Заперечення\",reg:\"Знак охорони суміжних прав\",macr:\"Макрон\",deg:\"Знак градуса\",sup2:\"два у верхньому індексі\",sup3:\"три у верхньому індексі\",acute:\"Знак акута\",micro:\"Знак мікро\",para:\"Знак абзацу\",middot:\"Інтерпункт\",cedil:\"Седиль\",sup1:\"Один у верхньому індексі\",ordm:\"Чоловічий порядковий вказівник\",raquo:\"праві вказівні подвійні кутові дужки\",frac14:\"Одна четвертина\",frac12:\"Одна друга\",frac34:\"три четвертих\",iquest:\"Перевернутий знак питання\",Agrave:\"Велика латинська A з гравісом\",Aacute:\"Велика латинська А з акутом\",\nAcirc:\"Велика латинська А з циркумфлексом\",Atilde:\"Велика латинська А з тильдою\",Auml:\"Велике латинське А з умлаутом\",Aring:\"Велика латинська A з кільцем згори\",AElig:\"Велика латинська Æ\",Ccedil:\"Велика латинська C з седиллю\",Egrave:\"Велика латинська E з гравісом\",Eacute:\"Велика латинська E з акутом\",Ecirc:\"Велика латинська E з циркумфлексом\",Euml:\"Велика латинська А з умлаутом\",Igrave:\"Велика латинська I з гравісом\",Iacute:\"Велика латинська I з акутом\",Icirc:\"Велика латинська I з циркумфлексом\",\nIuml:\"Велика латинська І з умлаутом\",ETH:\"Велика латинська Eth\",Ntilde:\"Велика латинська N з тильдою\",Ograve:\"Велика латинська O з гравісом\",Oacute:\"Велика латинська O з акутом\",Ocirc:\"Велика латинська O з циркумфлексом\",Otilde:\"Велика латинська O з тильдою\",Ouml:\"Велика латинська О з умлаутом\",times:\"Знак множення\",Oslash:\"Велика латинська перекреслена O \",Ugrave:\"Велика латинська U з гравісом\",Uacute:\"Велика латинська U з акутом\",Ucirc:\"Велика латинська U з циркумфлексом\",Uuml:\"Велика латинська U з умлаутом\",\nYacute:\"Велика латинська Y з акутом\",THORN:\"Велика латинська Торн\",szlig:\"Мала латинська есцет\",agrave:\"Мала латинська a з гравісом\",aacute:\"Мала латинська a з акутом\",acirc:\"Мала латинська a з циркумфлексом\",atilde:\"Мала латинська a з тильдою\",auml:\"Мала латинська a з умлаутом\",aring:\"Мала латинська a з кільцем згори\",aelig:\"Мала латинська æ\",ccedil:\"Мала латинська C з седиллю\",egrave:\"Мала латинська e з гравісом\",eacute:\"Мала латинська e з акутом\",ecirc:\"Мала латинська e з циркумфлексом\",euml:\"Мала латинська e з умлаутом\",\nigrave:\"Мала латинська i з гравісом\",iacute:\"Мала латинська i з акутом\",icirc:\"Мала латинська i з циркумфлексом\",iuml:\"Мала латинська i з умлаутом\",eth:\"Мала латинська Eth\",ntilde:\"Мала латинська n з тильдою\",ograve:\"Мала латинська o з гравісом\",oacute:\"Мала латинська o з акутом\",ocirc:\"Мала латинська o з циркумфлексом\",otilde:\"Мала латинська o з тильдою\",ouml:\"Мала латинська o з умлаутом\",divide:\"Знак ділення\",oslash:\"Мала латинська перекреслена o\",ugrave:\"Мала латинська u з гравісом\",uacute:\"Мала латинська u з акутом\",\nucirc:\"Мала латинська u з циркумфлексом\",uuml:\"Мала латинська u з умлаутом\",yacute:\"Мала латинська y з акутом\",thorn:\"Мала латинська торн\",yuml:\"Мала латинська y з умлаутом\",OElig:\"Велика латинська лігатура OE\",oelig:\"Мала латинська лігатура oe\",372:\"Велика латинська W з циркумфлексом\",374:\"Велика латинська Y з циркумфлексом\",373:\"Мала латинська w з циркумфлексом\",375:\"Мала латинська y з циркумфлексом\",sbquo:\"Одиничні нижні лабки\",8219:\"Верхні одиничні обернені лабки\",bdquo:\"Подвійні нижні лабки\",\nhellip:\"Три крапки\",trade:\"Знак торгової марки\",9658:\"Чорний правий вказівник\",bull:\"Маркер списку\",rarr:\"Стрілка вправо\",rArr:\"Подвійна стрілка вправо\",hArr:\"Подвійна стрілка вліво-вправо\",diams:\"Чорний діамонт\",asymp:\"Наближено дорівнює\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/vi.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"vi\",{euro:\"Ký hiệu Euro\",lsquo:\"Dấu ngoặc đơn trái\",rsquo:\"Dấu ngoặc đơn phải\",ldquo:\"Dấu ngoặc đôi trái\",rdquo:\"Dấu ngoặc đôi phải\",ndash:\"Gạch ngang tiếng anh\",mdash:\"Gạch ngang Em\",iexcl:\"Chuyển đổi dấu chấm than\",cent:\"Ký tự tiền Mỹ\",pound:\"Ký tự tiền Anh\",curren:\"Ký tự tiền tệ\",yen:\"Ký tự tiền Yên Nhật\",brvbar:\"Thanh hỏng\",sect:\"Ký tự khu vực\",uml:\"Dấu tách đôi\",copy:\"Ký tự bản quyền\",ordf:\"Phần chỉ thị giống cái\",laquo:\"Chọn dấu ngoặc đôi trái\",not:\"Không có ký tự\",\nreg:\"Ký tự đăng ký\",macr:\"Dấu nguyên âm dài\",deg:\"Ký tự độ\",sup2:\"Chữ trồi lên trên dạng 2\",sup3:\"Chữ trồi lên trên dạng 3\",acute:\"Dấu trọng âm\",micro:\"Ký tự micro\",para:\"Ký tự đoạn văn\",middot:\"Dấu chấm tròn\",cedil:\"Dấu móc lưới\",sup1:\"Ký tự trồi lên cấp 1\",ordm:\"Ký tự biểu hiện giống đực\",raquo:\"Chọn dấu ngoặc đôi phải\",frac14:\"Tỉ lệ một phần tư\",frac12:\"Tỉ lệ một nửa\",frac34:\"Tỉ lệ ba phần tư\",iquest:\"Chuyển đổi dấu chấm hỏi\",Agrave:\"Ký tự la-tinh viết hoa A với dấu huyền\",Aacute:\"Ký tự la-tinh viết hoa A với dấu sắc\",\nAcirc:\"Ký tự la-tinh viết hoa A với dấu mũ\",Atilde:\"Ký tự la-tinh viết hoa A với dấu ngã\",Auml:\"Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu\",Aring:\"Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu\",AElig:\"Ký tự la-tinh viết hoa của Æ\",Ccedil:\"Ký tự la-tinh viết hoa C với dấu móc bên dưới\",Egrave:\"Ký tự la-tinh viết hoa E với dấu huyền\",Eacute:\"Ký tự la-tinh viết hoa E với dấu sắc\",Ecirc:\"Ký tự la-tinh viết hoa E với dấu mũ\",Euml:\"Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu\",\nIgrave:\"Ký tự la-tinh viết hoa I với dấu huyền\",Iacute:\"Ký tự la-tinh viết hoa I với dấu sắc\",Icirc:\"Ký tự la-tinh viết hoa I với dấu mũ\",Iuml:\"Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu\",ETH:\"Viết hoa của ký tự Eth\",Ntilde:\"Ký tự la-tinh viết hoa N với dấu ngã\",Ograve:\"Ký tự la-tinh viết hoa O với dấu huyền\",Oacute:\"Ký tự la-tinh viết hoa O với dấu sắc\",Ocirc:\"Ký tự la-tinh viết hoa O với dấu mũ\",Otilde:\"Ký tự la-tinh viết hoa O với dấu ngã\",Ouml:\"Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu\",\ntimes:\"Ký tự phép toán nhân\",Oslash:\"Ký tự la-tinh viết hoa A với dấu ngã xuống\",Ugrave:\"Ký tự la-tinh viết hoa U với dấu huyền\",Uacute:\"Ký tự la-tinh viết hoa U với dấu sắc\",Ucirc:\"Ký tự la-tinh viết hoa U với dấu mũ\",Uuml:\"Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu\",Yacute:\"Ký tự la-tinh viết hoa Y với dấu sắc\",THORN:\"Phần viết hoa của ký tự Thorn\",szlig:\"Ký tự viết nhỏ la-tinh của chữ s\",agrave:\"Ký tự la-tinh thường với dấu huyền\",aacute:\"Ký tự la-tinh thường với dấu sắc\",acirc:\"Ký tự la-tinh thường với dấu mũ\",\natilde:\"Ký tự la-tinh thường với dấu ngã\",auml:\"Ký tự la-tinh thường với dấu hai chấm trên đầu\",aring:\"Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu\",aelig:\"Ký tự la-tinh viết thường của æ\",ccedil:\"Ký tự la-tinh viết thường của c với dấu móc bên dưới\",egrave:\"Ký tự la-tinh viết thường e với dấu huyền\",eacute:\"Ký tự la-tinh viết thường e với dấu sắc\",ecirc:\"Ký tự la-tinh viết thường e với dấu mũ\",euml:\"Ký tự la-tinh viết thường e với dấu hai chấm trên đầu\",igrave:\"Ký tự la-tinh viết thường i với dấu huyền\",\niacute:\"Ký tự la-tinh viết thường i với dấu sắc\",icirc:\"Ký tự la-tinh viết thường i với dấu mũ\",iuml:\"Ký tự la-tinh viết thường i với dấu hai chấm trên đầu\",eth:\"Ký tự la-tinh viết thường của eth\",ntilde:\"Ký tự la-tinh viết thường n với dấu ngã\",ograve:\"Ký tự la-tinh viết thường o với dấu huyền\",oacute:\"Ký tự la-tinh viết thường o với dấu sắc\",ocirc:\"Ký tự la-tinh viết thường o với dấu mũ\",otilde:\"Ký tự la-tinh viết thường o với dấu ngã\",ouml:\"Ký tự la-tinh viết thường o với dấu hai chấm trên đầu\",\ndivide:\"Ký hiệu phép tính chia\",oslash:\"Ký tự la-tinh viết thường o với dấu ngã\",ugrave:\"Ký tự la-tinh viết thường u với dấu huyền\",uacute:\"Ký tự la-tinh viết thường u với dấu sắc\",ucirc:\"Ký tự la-tinh viết thường u với dấu mũ\",uuml:\"Ký tự la-tinh viết thường u với dấu hai chấm trên đầu\",yacute:\"Ký tự la-tinh viết thường y với dấu sắc\",thorn:\"Ký tự la-tinh viết thường của chữ thorn\",yuml:\"Ký tự la-tinh viết thường y với dấu hai chấm trên đầu\",OElig:\"Ký tự la-tinh viết hoa gạch nối OE\",oelig:\"Ký tự la-tinh viết thường gạch nối OE\",\n372:\"Ký tự la-tinh viết hoa W với dấu mũ\",374:\"Ký tự la-tinh viết hoa Y với dấu mũ\",373:\"Ký tự la-tinh viết thường w với dấu mũ\",375:\"Ký tự la-tinh viết thường y với dấu mũ\",sbquo:\"Dấu ngoặc đơn thấp số-9\",8219:\"Dấu ngoặc đơn đảo ngược số-9\",bdquo:\"Gấp đôi dấu ngoặc đơn số-9\",hellip:\"Tĩnh dược chiều ngang\",trade:\"Ký tự thương hiệu\",9658:\"Ký tự trỏ về hướng bên phải màu đen\",bull:\"Ký hiệu\",rarr:\"Mũi tên hướng bên phải\",rArr:\"Mũi tên hướng bên phải dạng đôi\",hArr:\"Mũi tên hướng bên trái dạng đôi\",diams:\"Ký hiệu hình thoi\",\nasymp:\"Gần bằng với\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"zh-cn\",{euro:\"欧元符号\",lsquo:\"左单引号\",rsquo:\"右单引号\",ldquo:\"左双引号\",rdquo:\"右双引号\",ndash:\"短划线\",mdash:\"长划线\",iexcl:\"竖翻叹号\",cent:\"分币符号\",pound:\"英镑符号\",curren:\"货币符号\",yen:\"日元符号\",brvbar:\"间断条\",sect:\"节标记\",uml:\"分音符\",copy:\"版权所有标记\",ordf:\"阴性顺序指示符\",laquo:\"左指双尖引号\",not:\"非标记\",reg:\"注册标记\",macr:\"长音符\",deg:\"度标记\",sup2:\"上标二\",sup3:\"上标三\",acute:\"锐音符\",micro:\"微符\",para:\"段落标记\",middot:\"中间点\",cedil:\"下加符\",sup1:\"上标一\",ordm:\"阳性顺序指示符\",raquo:\"右指双尖引号\",frac14:\"普通分数四分之一\",frac12:\"普通分数二分之一\",frac34:\"普通分数四分之三\",iquest:\"竖翻问号\",\nAgrave:\"带抑音符的拉丁文大写字母 A\",Aacute:\"带锐音符的拉丁文大写字母 A\",Acirc:\"带扬抑符的拉丁文大写字母 A\",Atilde:\"带颚化符的拉丁文大写字母 A\",Auml:\"带分音符的拉丁文大写字母 A\",Aring:\"带上圆圈的拉丁文大写字母 A\",AElig:\"拉丁文大写字母 Ae\",Ccedil:\"带下加符的拉丁文大写字母 C\",Egrave:\"带抑音符的拉丁文大写字母 E\",Eacute:\"带锐音符的拉丁文大写字母 E\",Ecirc:\"带扬抑符的拉丁文大写字母 E\",Euml:\"带分音符的拉丁文大写字母 E\",Igrave:\"带抑音符的拉丁文大写字母 I\",Iacute:\"带锐音符的拉丁文大写字母 I\",Icirc:\"带扬抑符的拉丁文大写字母 I\",Iuml:\"带分音符的拉丁文大写字母 I\",ETH:\"拉丁文大写字母 Eth\",Ntilde:\"带颚化符的拉丁文大写字母 N\",Ograve:\"带抑音符的拉丁文大写字母 O\",Oacute:\"带锐音符的拉丁文大写字母 O\",Ocirc:\"带扬抑符的拉丁文大写字母 O\",Otilde:\"带颚化符的拉丁文大写字母 O\",\nOuml:\"带分音符的拉丁文大写字母 O\",times:\"乘号\",Oslash:\"带粗线的拉丁文大写字母 O\",Ugrave:\"带抑音符的拉丁文大写字母 U\",Uacute:\"带锐音符的拉丁文大写字母 U\",Ucirc:\"带扬抑符的拉丁文大写字母 U\",Uuml:\"带分音符的拉丁文大写字母 U\",Yacute:\"带抑音符的拉丁文大写字母 Y\",THORN:\"拉丁文大写字母 Thorn\",szlig:\"拉丁文小写字母清音 S\",agrave:\"带抑音符的拉丁文小写字母 A\",aacute:\"带锐音符的拉丁文小写字母 A\",acirc:\"带扬抑符的拉丁文小写字母 A\",atilde:\"带颚化符的拉丁文小写字母 A\",auml:\"带分音符的拉丁文小写字母 A\",aring:\"带上圆圈的拉丁文小写字母 A\",aelig:\"拉丁文小写字母 Ae\",ccedil:\"带下加符的拉丁文小写字母 C\",egrave:\"带抑音符的拉丁文小写字母 E\",eacute:\"带锐音符的拉丁文小写字母 E\",ecirc:\"带扬抑符的拉丁文小写字母 E\",euml:\"带分音符的拉丁文小写字母 E\",igrave:\"带抑音符的拉丁文小写字母 I\",\niacute:\"带锐音符的拉丁文小写字母 I\",icirc:\"带扬抑符的拉丁文小写字母 I\",iuml:\"带分音符的拉丁文小写字母 I\",eth:\"拉丁文小写字母 Eth\",ntilde:\"带颚化符的拉丁文小写字母 N\",ograve:\"带抑音符的拉丁文小写字母 O\",oacute:\"带锐音符的拉丁文小写字母 O\",ocirc:\"带扬抑符的拉丁文小写字母 O\",otilde:\"带颚化符的拉丁文小写字母 O\",ouml:\"带分音符的拉丁文小写字母 O\",divide:\"除号\",oslash:\"带粗线的拉丁文小写字母 O\",ugrave:\"带抑音符的拉丁文小写字母 U\",uacute:\"带锐音符的拉丁文小写字母 U\",ucirc:\"带扬抑符的拉丁文小写字母 U\",uuml:\"带分音符的拉丁文小写字母 U\",yacute:\"带抑音符的拉丁文小写字母 Y\",thorn:\"拉丁文小写字母 Thorn\",yuml:\"带分音符的拉丁文小写字母 Y\",OElig:\"拉丁文大写连字 Oe\",oelig:\"拉丁文小写连字 Oe\",372:\"带扬抑符的拉丁文大写字母 W\",374:\"带扬抑符的拉丁文大写字母 Y\",\n373:\"带扬抑符的拉丁文小写字母 W\",375:\"带扬抑符的拉丁文小写字母 Y\",sbquo:\"单下 9 形引号\",8219:\"单高横翻 9 形引号\",bdquo:\"双下 9 形引号\",hellip:\"水平省略号\",trade:\"商标标志\",9658:\"实心右指指针\",bull:\"加重号\",rarr:\"向右箭头\",rArr:\"向右双线箭头\",hArr:\"左右双线箭头\",diams:\"实心方块纸牌\",asymp:\"约等于\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/lang/zh.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.plugins.setLang(\"specialchar\",\"zh\",{euro:\"歐元符號\",lsquo:\"左單引號\",rsquo:\"右單引號\",ldquo:\"左雙引號\",rdquo:\"右雙引號\",ndash:\"短破折號\",mdash:\"長破折號\",iexcl:\"倒置的驚嘆號\",cent:\"美分符號\",pound:\"英鎊符號\",curren:\"貨幣符號\",yen:\"日圓符號\",brvbar:\"破折號\",sect:\"章節符號\",uml:\"分音符號\",copy:\"版權符號\",ordf:\"雌性符號\",laquo:\"左雙角括號\",not:\"Not 符號\",reg:\"註冊商標符號\",macr:\"長音符號\",deg:\"度數符號\",sup2:\"上標字 2\",sup3:\"上標字 3\",acute:\"尖音符號\",micro:\"微\",para:\"段落符號\",middot:\"中間點\",cedil:\"字母 C 下面的尾型符號 \",sup1:\"上標\",ordm:\"雄性符號\",raquo:\"右雙角括號\",frac14:\"四分之一符號\",frac12:\"二分之一符號\",frac34:\"四分之三符號\",\niquest:\"倒置的問號\",Agrave:\"拉丁大寫字母 A 帶抑音符號\",Aacute:\"拉丁大寫字母 A 帶尖音符號\",Acirc:\"拉丁大寫字母 A 帶揚抑符\",Atilde:\"拉丁大寫字母 A 帶波浪號\",Auml:\"拉丁大寫字母 A 帶分音符號\",Aring:\"拉丁大寫字母 A 帶上圓圈\",AElig:\"拉丁大寫字母 Æ\",Ccedil:\"拉丁大寫字母 C 帶下尾符號\",Egrave:\"拉丁大寫字母 E 帶抑音符號\",Eacute:\"拉丁大寫字母 E 帶尖音符號\",Ecirc:\"拉丁大寫字母 E 帶揚抑符\",Euml:\"拉丁大寫字母 E 帶分音符號\",Igrave:\"拉丁大寫字母 I 帶抑音符號\",Iacute:\"拉丁大寫字母 I 帶尖音符號\",Icirc:\"拉丁大寫字母 I 帶揚抑符\",Iuml:\"拉丁大寫字母 I 帶分音符號\",ETH:\"拉丁大寫字母 Eth\",Ntilde:\"拉丁大寫字母 N 帶波浪號\",Ograve:\"拉丁大寫字母 O 帶抑音符號\",Oacute:\"拉丁大寫字母 O 帶尖音符號\",Ocirc:\"拉丁大寫字母 O 帶揚抑符\",Otilde:\"拉丁大寫字母 O 帶波浪號\",\nOuml:\"拉丁大寫字母 O 帶分音符號\",times:\"乘號\",Oslash:\"拉丁大寫字母 O 帶粗線符號\",Ugrave:\"拉丁大寫字母 U 帶抑音符號\",Uacute:\"拉丁大寫字母 U 帶尖音符號\",Ucirc:\"拉丁大寫字母 U 帶揚抑符\",Uuml:\"拉丁大寫字母 U 帶分音符號\",Yacute:\"拉丁大寫字母 Y 帶尖音符號\",THORN:\"拉丁大寫字母 Thorn\",szlig:\"拉丁小寫字母 s\",agrave:\"拉丁小寫字母 a 帶抑音符號\",aacute:\"拉丁小寫字母 a 帶尖音符號\",acirc:\"拉丁小寫字母 a 帶揚抑符\",atilde:\"拉丁小寫字母 a 帶波浪號\",auml:\"拉丁小寫字母 a 帶分音符號\",aring:\"拉丁小寫字母 a 帶上圓圈\",aelig:\"拉丁小寫字母 æ\",ccedil:\"拉丁小寫字母 c 帶下尾符號\",egrave:\"拉丁小寫字母 e 帶抑音符號\",eacute:\"拉丁小寫字母 e 帶尖音符號\",ecirc:\"拉丁小寫字母 e 帶揚抑符\",euml:\"拉丁小寫字母 e 帶分音符號\",igrave:\"拉丁小寫字母 i 帶抑音符號\",\niacute:\"拉丁小寫字母 i 帶尖音符號\",icirc:\"拉丁小寫字母 i 帶揚抑符\",iuml:\"拉丁小寫字母 i 帶分音符號\",eth:\"拉丁小寫字母 eth\",ntilde:\"拉丁小寫字母 n 帶波浪號\",ograve:\"拉丁小寫字母 o 帶抑音符號\",oacute:\"拉丁小寫字母 o 帶尖音符號\",ocirc:\"拉丁小寫字母 o 帶揚抑符\",otilde:\"拉丁小寫字母 o 帶波浪號\",ouml:\"拉丁小寫字母 o 帶分音符號\",divide:\"除號\",oslash:\"拉丁小寫字母 o 帶粗線符號\",ugrave:\"拉丁小寫字母 u 帶抑音符號\",uacute:\"拉丁小寫字母 u 帶尖音符號\",ucirc:\"拉丁小寫字母 u 帶揚抑符\",uuml:\"拉丁小寫字母 u 帶分音符號\",yacute:\"拉丁小寫字母 y 帶尖音符號\",thorn:\"拉丁小寫字母 thorn\",yuml:\"拉丁小寫字母 y 帶分音符號\",OElig:\"拉丁大寫字母 OE\",oelig:\"拉丁小寫字母 oe\",372:\"拉丁大寫字母 W 帶揚抑符\",374:\"拉丁大寫字母 Y 帶揚抑符\",373:\"拉丁小寫字母 w 帶揚抑符\",\n375:\"拉丁小寫字母 y 帶揚抑符\",sbquo:\"低 9 單引號\",8219:\"高 9 反轉單引號\",bdquo:\"低 9 雙引號\",hellip:\"水平刪節號\",trade:\"商標符號\",9658:\"黑色向右指箭號\",bull:\"項目符號\",rarr:\"向右箭號\",rArr:\"向右雙箭號\",hArr:\"左右雙箭號\",diams:\"黑鑽套裝\",asymp:\"約等於\"});"
  },
  {
    "path": "assets/ckeditor/plugins/specialchar/dialogs/specialchar.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"specialchar\",function(k){var e,n=k.lang.specialchar,m=function(c){var b;c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);\"a\"==c.getName()&&(b=c.getChild(0).getHtml())&&(c.removeClass(\"cke_light_background\"),e.hide(),c=k.document.createElement(\"span\"),c.setHtml(b),k.insertText(c.getText()))},p=CKEDITOR.tools.addFunction(m),l,g=function(c,b){var a;b=b||c.data.getTarget();\"span\"==b.getName()&&(b=b.getParent());if(\"a\"==b.getName()&&(a=b.getChild(0).getHtml())){l&&d(null,l);\nvar f=e.getContentElement(\"info\",\"htmlPreview\").getElement();e.getContentElement(\"info\",\"charPreview\").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass(\"cke_light_background\");l=b}},d=function(c,b){b=b||c.data.getTarget();\"span\"==b.getName()&&(b=b.getParent());\"a\"==b.getName()&&(e.getContentElement(\"info\",\"charPreview\").getElement().setHtml(\"\\x26nbsp;\"),e.getContentElement(\"info\",\"htmlPreview\").getElement().setHtml(\"\\x26nbsp;\"),b.getParent().removeClass(\"cke_light_background\"),\nl=void 0)},q=CKEDITOR.tools.addFunction(function(c){c=new CKEDITOR.dom.event(c);var b=c.getTarget(),a;a=c.getKeystroke();var f=\"rtl\"==k.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:(a=b.getParent().getParent().getNext())&&(a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type&&(a.focus(),d(null,b),g(null,a));c.preventDefault();break;case 32:m({data:c});c.preventDefault();\nbreak;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):\nd(null,b)}});return{title:n.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=k.config.specialChars,a=CKEDITOR.tools.getNextId()+\"_specialchar_table_label\",f=['\\x3ctable role\\x3d\"listbox\" aria-labelledby\\x3d\"'+a+'\" style\\x3d\"width: 320px; height: 100%; border-collapse: separate;\" align\\x3d\"center\" cellspacing\\x3d\"2\" cellpadding\\x3d\"2\" border\\x3d\"0\"\\x3e'],d=0,g=b.length,h,e;d<g;){f.push('\\x3ctr role\\x3d\"presentation\"\\x3e');\nfor(var l=0;l<c;l++,d++){if(h=b[d]){h instanceof Array?(e=h[1],h=h[0]):(e=h.replace(\"\\x26\",\"\").replace(\";\",\"\").replace(\"#\",\"\"),e=n[e]||h);var m=\"cke_specialchar_label_\"+d+\"_\"+CKEDITOR.tools.getNextNumber();f.push('\\x3ctd class\\x3d\"cke_dark_background\" style\\x3d\"cursor: default\" role\\x3d\"presentation\"\\x3e\\x3ca href\\x3d\"javascript: void(0);\" role\\x3d\"option\" aria-posinset\\x3d\"'+(d+1)+'\"',' aria-setsize\\x3d\"'+g+'\"',' aria-labelledby\\x3d\"'+m+'\"',' class\\x3d\"cke_specialchar\" title\\x3d\"',CKEDITOR.tools.htmlEncode(e),\n'\" onkeydown\\x3d\"CKEDITOR.tools.callFunction( '+q+', event, this )\" onclick\\x3d\"CKEDITOR.tools.callFunction('+p+', this); return false;\" tabindex\\x3d\"-1\"\\x3e\\x3cspan style\\x3d\"margin: 0 auto;cursor: inherit\"\\x3e'+h+'\\x3c/span\\x3e\\x3cspan class\\x3d\"cke_voice_label\" id\\x3d\"'+m+'\"\\x3e'+e+\"\\x3c/span\\x3e\\x3c/a\\x3e\")}else f.push('\\x3ctd class\\x3d\"cke_dark_background\"\\x3e\\x26nbsp;');f.push(\"\\x3c/td\\x3e\")}f.push(\"\\x3c/tr\\x3e\")}f.push(\"\\x3c/tbody\\x3e\\x3c/table\\x3e\",'\\x3cspan id\\x3d\"'+a+'\" class\\x3d\"cke_voice_label\"\\x3e'+\nn.options+\"\\x3c/span\\x3e\");this.getContentElement(\"info\",\"charContainer\").getElement().setHtml(f.join(\"\"))},contents:[{id:\"info\",label:k.lang.common.generalTab,title:k.lang.common.generalTab,padding:0,align:\"top\",elements:[{type:\"hbox\",align:\"top\",widths:[\"320px\",\"90px\"],children:[{type:\"html\",id:\"charContainer\",html:\"\",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag(\"a\").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,\n0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:\"hbox\",align:\"top\",widths:[\"100%\"],children:[{type:\"vbox\",align:\"top\",children:[{type:\"html\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\"},{type:\"html\",id:\"charPreview\",className:\"cke_dark_background\",style:\"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;\",html:\"\\x3cdiv\\x3e\\x26nbsp;\\x3c/div\\x3e\"},{type:\"html\",\nid:\"htmlPreview\",className:\"cke_dark_background\",style:\"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;\",html:\"\\x3cdiv\\x3e\\x26nbsp;\\x3c/div\\x3e\"}]}]}]}]}]}});"
  },
  {
    "path": "assets/ckeditor/plugins/table/dialogs/table.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){function v(a){for(var f=0,n=0,m=0,p,e=a.$.rows.length;m<e;m++){p=a.$.rows[m];for(var d=f=0,c,b=p.cells.length;d<b;d++)c=p.cells[d],f+=c.colSpan;f>n&&(n=f)}return n}function r(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dialog.validate.integer()(f)&&0<f);f||(alert(a),this.select());return f}}function q(a,f){var n=function(e){return new CKEDITOR.dom.element(e,a.document)},q=a.editable(),p=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?\n310:280,onLoad:function(){var e=this,a=e.getContentElement(\"advanced\",\"advStyles\");if(a)a.on(\"change\",function(){var a=this.getStyle(\"width\",\"\"),b=e.getContentElement(\"info\",\"txtWidth\");b&&b.setValue(a,!0);a=this.getStyle(\"height\",\"\");(b=e.getContentElement(\"info\",\"txtHeight\"))&&b.setValue(a,!0)})},onShow:function(){var e=a.getSelection(),d=e.getRanges(),c,b=this.getContentElement(\"info\",\"txtRows\"),h=this.getContentElement(\"info\",\"txtCols\"),t=this.getContentElement(\"info\",\"txtWidth\"),g=this.getContentElement(\"info\",\n\"txtHeight\");\"tableProperties\"==f&&((e=e.getSelectedElement())&&e.is(\"table\")?c=e:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains(\"table\",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());t&&t.onChange();g&&g.onChange()},onOk:function(){var e=a.getSelection(),d=this._.selectedElement&&e.createBookmarks(),c=this._.selectedElement||n(\"table\"),b={};this.commitContent(b,\nc);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(n(\"tbody\")),f=parseInt(b.txtRows,10)||0,g=parseInt(b.txtCols,10)||0,k=0;k<f;k++)for(var l=h.append(n(\"tr\")),m=0;m<g;m++)l.append(n(\"td\")).appendBogus();f=b.selHeaders;if(!c.$.tHead&&(\"row\"==f||\"both\"==f)){l=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag(\"tbody\").getItem(0);h=h.getElementsByTag(\"tr\").getItem(0);for(k=0;k<h.getChildCount();k++)g=h.getChild(k),g.type!=CKEDITOR.NODE_ELEMENT||g.data(\"cke-bookmark\")||\n(g.renameNode(\"th\"),g.setAttribute(\"scope\",\"col\"));l.append(h.remove())}if(null!==c.$.tHead&&\"row\"!=f&&\"both\"!=f){l=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag(\"tbody\").getItem(0);for(m=h.getFirst();0<l.getChildCount();){h=l.getFirst();for(k=0;k<h.getChildCount();k++)g=h.getChild(k),g.type==CKEDITOR.NODE_ELEMENT&&(g.renameNode(\"td\"),g.removeAttribute(\"scope\"));h.insertBefore(m)}l.remove()}if(!this.hasColumnHeaders&&(\"col\"==f||\"both\"==f))for(l=0;l<c.$.rows.length;l++)g=new CKEDITOR.dom.element(c.$.rows[l].cells[0]),\ng.renameNode(\"th\"),g.setAttribute(\"scope\",\"row\");if(this.hasColumnHeaders&&\"col\"!=f&&\"both\"!=f)for(k=0;k<c.$.rows.length;k++)l=new CKEDITOR.dom.element(c.$.rows[k]),\"tbody\"==l.getParent().getName()&&(g=new CKEDITOR.dom.element(l.$.cells[0]),g.renameNode(\"td\"),g.removeAttribute(\"scope\"));b.txtHeight?c.setStyle(\"height\",b.txtHeight):c.removeStyle(\"height\");b.txtWidth?c.setStyle(\"width\",b.txtWidth):c.removeStyle(\"width\");c.getAttribute(\"style\")||c.removeAttribute(\"style\")}if(this._.selectedElement)try{e.selectBookmarks(d)}catch(p){}else a.insertElement(c),\nsetTimeout(function(){var e=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(e,CKEDITOR.POSITION_AFTER_START);b.select()},0)},contents:[{id:\"info\",label:a.lang.table.title,elements:[{type:\"hbox\",widths:[null,null],styles:[\"vertical-align:top\"],children:[{type:\"vbox\",padding:0,children:[{type:\"text\",id:\"txtRows\",\"default\":3,label:a.lang.table.rows,required:!0,controlStyle:\"width:5em\",validate:r(a.lang.table.invalidRows),setup:function(e){this.setValue(e.$.rows.length)},\ncommit:m},{type:\"text\",id:\"txtCols\",\"default\":2,label:a.lang.table.columns,required:!0,controlStyle:\"width:5em\",validate:r(a.lang.table.invalidCols),setup:function(e){this.setValue(v(e))},commit:m},{type:\"html\",html:\"\\x26nbsp;\"},{type:\"select\",id:\"selHeaders\",requiredContent:\"th\",\"default\":\"\",label:a.lang.table.headers,items:[[a.lang.table.headersNone,\"\"],[a.lang.table.headersRow,\"row\"],[a.lang.table.headersColumn,\"col\"],[a.lang.table.headersBoth,\"both\"]],setup:function(e){var a=this.getDialog();\na.hasColumnHeaders=!0;for(var c=0;c<e.$.rows.length;c++){var b=e.$.rows[c].cells[0];if(b&&\"th\"!=b.nodeName.toLowerCase()){a.hasColumnHeaders=!1;break}}null!==e.$.tHead?this.setValue(a.hasColumnHeaders?\"both\":\"row\"):this.setValue(a.hasColumnHeaders?\"col\":\"\")},commit:m},{type:\"text\",id:\"txtBorder\",requiredContent:\"table[border]\",\"default\":a.filter.check(\"table[border]\")?1:0,label:a.lang.table.border,controlStyle:\"width:3em\",validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),setup:function(a){this.setValue(a.getAttribute(\"border\")||\n\"\")},commit:function(a,d){this.getValue()?d.setAttribute(\"border\",this.getValue()):d.removeAttribute(\"border\")}},{id:\"cmbAlign\",type:\"select\",requiredContent:\"table[align]\",\"default\":\"\",label:a.lang.common.align,items:[[a.lang.common.notSet,\"\"],[a.lang.common.alignLeft,\"left\"],[a.lang.common.alignCenter,\"center\"],[a.lang.common.alignRight,\"right\"]],setup:function(a){this.setValue(a.getAttribute(\"align\")||\"\")},commit:function(a,d){this.getValue()?d.setAttribute(\"align\",this.getValue()):d.removeAttribute(\"align\")}}]},\n{type:\"vbox\",padding:0,children:[{type:\"hbox\",widths:[\"5em\"],children:[{type:\"text\",id:\"txtWidth\",requiredContent:\"table{width}\",controlStyle:\"width:5em\",label:a.lang.common.width,title:a.lang.common.cssLengthTooltip,\"default\":a.filter.check(\"table{width}\")?500>q.getSize(\"width\")?\"100%\":500:0,getValue:u,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace(\"%1\",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement(\"advanced\",\"advStyles\");a&&\na.updateStyle(\"width\",this.getValue())},setup:function(a){a=a.getStyle(\"width\");this.setValue(a)},commit:m}]},{type:\"hbox\",widths:[\"5em\"],children:[{type:\"text\",id:\"txtHeight\",requiredContent:\"table{height}\",controlStyle:\"width:5em\",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,\"default\":\"\",getValue:u,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace(\"%1\",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement(\"advanced\",\n\"advStyles\");a&&a.updateStyle(\"height\",this.getValue())},setup:function(a){(a=a.getStyle(\"height\"))&&this.setValue(a)},commit:m}]},{type:\"html\",html:\"\\x26nbsp;\"},{type:\"text\",id:\"txtCellSpace\",requiredContent:\"table[cellspacing]\",controlStyle:\"width:3em\",label:a.lang.table.cellSpace,\"default\":a.filter.check(\"table[cellspacing]\")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute(\"cellSpacing\")||\"\")},commit:function(a,d){this.getValue()?\nd.setAttribute(\"cellSpacing\",this.getValue()):d.removeAttribute(\"cellSpacing\")}},{type:\"text\",id:\"txtCellPad\",requiredContent:\"table[cellpadding]\",controlStyle:\"width:3em\",label:a.lang.table.cellPad,\"default\":a.filter.check(\"table[cellpadding]\")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute(\"cellPadding\")||\"\")},commit:function(a,d){this.getValue()?d.setAttribute(\"cellPadding\",this.getValue()):d.removeAttribute(\"cellPadding\")}}]}]},\n{type:\"html\",align:\"right\",html:\"\"},{type:\"vbox\",padding:0,children:[{type:\"text\",id:\"txtCaption\",requiredContent:\"caption\",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag(\"caption\");if(0<a.count()){a=a.getItem(0);var d=a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));d&&!d.equals(a.getBogus())?(this.disable(),this.setValue(a.getText())):(a=CKEDITOR.tools.trim(a.getText()),this.setValue(a))}},commit:function(e,d){if(this.isEnabled()){var c=this.getValue(),\nb=d.getElementsByTag(\"caption\");if(c)0<b.count()?(b=b.getItem(0),b.setHtml(\"\")):(b=new CKEDITOR.dom.element(\"caption\",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:\"text\",id:\"txtSummary\",bidi:!0,requiredContent:\"table[summary]\",label:a.lang.table.summary,setup:function(a){this.setValue(a.getAttribute(\"summary\")||\"\")},commit:function(a,d){this.getValue()?\nd.setAttribute(\"summary\",this.getValue()):d.removeAttribute(\"summary\")}}]}]},p&&p.createAdvancedTab(a,null,\"table\")]}}var u=CKEDITOR.tools.cssLength,m=function(a){var f=this.id;a.info||(a.info={});a.info[f]=this.getValue()};CKEDITOR.dialog.add(\"table\",function(a){return q(a,\"table\")});CKEDITOR.dialog.add(\"tableProperties\",function(a){return q(a,\"tableProperties\")})})();"
  },
  {
    "path": "assets/ckeditor/plugins/tabletools/dialogs/tableCell.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"cellProperties\",function(g){function d(a){return function(b){for(var c=a(b[0]),d=1;d<b.length;d++)if(a(b[d])!==c){c=null;break}\"undefined\"!=typeof c&&(this.setValue(c),CKEDITOR.env.gecko&&\"select\"==this.type&&!c&&(this.getInputElement().$.selectedIndex=-1))}}function l(a){if(a=n.exec(a.getStyle(\"width\")||a.getAttribute(\"width\")))return a[2]}var h=g.lang.table,c=h.cell,e=g.lang.common,k=CKEDITOR.dialog.validate,n=/^(\\d+(?:\\.\\d+)?)(px|%)$/,f={type:\"html\",html:\"\\x26nbsp;\"},p=\"rtl\"==\ng.lang.dir,m=g.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:\"info\",label:c.title,accessKey:\"I\",elements:[{type:\"hbox\",widths:[\"40%\",\"5%\",\"40%\"],children:[{type:\"vbox\",padding:0,children:[{type:\"hbox\",widths:[\"70%\",\"30%\"],children:[{type:\"text\",id:\"width\",width:\"100px\",label:e.width,validate:k.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement(\"info\",\n\"widthType\").getElement(),b=this.getInputElement(),c=b.getAttribute(\"aria-labelledby\");b.setAttribute(\"aria-labelledby\",[c,a.$.id].join(\" \"))},setup:d(function(a){var b=parseInt(a.getAttribute(\"width\"),10);a=parseInt(a.getStyle(\"width\"),10);return isNaN(a)?isNaN(b)?\"\":b:a}),commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf(\"info\",\"widthType\")||l(a);isNaN(b)?a.removeStyle(\"width\"):a.setStyle(\"width\",b+c);a.removeAttribute(\"width\")},\"default\":\"\"},{type:\"select\",id:\"widthType\",\nlabel:g.lang.table.widthUnit,labelStyle:\"visibility:hidden\",\"default\":\"px\",items:[[h.widthPx,\"px\"],[h.widthPc,\"%\"]],setup:d(l)}]},{type:\"hbox\",widths:[\"70%\",\"30%\"],children:[{type:\"text\",id:\"height\",label:e.height,width:\"100px\",\"default\":\"\",validate:k.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement(\"info\",\"htmlHeightType\").getElement(),b=this.getInputElement(),c=b.getAttribute(\"aria-labelledby\");b.setAttribute(\"aria-labelledby\",[c,a.$.id].join(\" \"))},setup:d(function(a){var b=\nparseInt(a.getAttribute(\"height\"),10);a=parseInt(a.getStyle(\"height\"),10);return isNaN(a)?isNaN(b)?\"\":b:a}),commit:function(a){var b=parseInt(this.getValue(),10);isNaN(b)?a.removeStyle(\"height\"):a.setStyle(\"height\",CKEDITOR.tools.cssLength(b));a.removeAttribute(\"height\")}},{id:\"htmlHeightType\",type:\"html\",html:\"\\x3cbr /\\x3e\"+h.widthPx}]},f,{type:\"select\",id:\"wordWrap\",label:c.wordWrap,\"default\":\"yes\",items:[[c.yes,\"yes\"],[c.no,\"no\"]],setup:d(function(a){var b=a.getAttribute(\"noWrap\");if(\"nowrap\"==\na.getStyle(\"white-space\")||b)return\"no\"}),commit:function(a){\"no\"==this.getValue()?a.setStyle(\"white-space\",\"nowrap\"):a.removeStyle(\"white-space\");a.removeAttribute(\"noWrap\")}},f,{type:\"select\",id:\"hAlign\",label:c.hAlign,\"default\":\"\",items:[[e.notSet,\"\"],[e.alignLeft,\"left\"],[e.alignCenter,\"center\"],[e.alignRight,\"right\"],[e.alignJustify,\"justify\"]],setup:d(function(a){var b=a.getAttribute(\"align\");return a.getStyle(\"text-align\")||b||\"\"}),commit:function(a){var b=this.getValue();b?a.setStyle(\"text-align\",\nb):a.removeStyle(\"text-align\");a.removeAttribute(\"align\")}},{type:\"select\",id:\"vAlign\",label:c.vAlign,\"default\":\"\",items:[[e.notSet,\"\"],[e.alignTop,\"top\"],[e.alignMiddle,\"middle\"],[e.alignBottom,\"bottom\"],[c.alignBaseline,\"baseline\"]],setup:d(function(a){var b=a.getAttribute(\"vAlign\");a=a.getStyle(\"vertical-align\");switch(a){case \"top\":case \"middle\":case \"bottom\":case \"baseline\":break;default:a=\"\"}return a||b||\"\"}),commit:function(a){var b=this.getValue();b?a.setStyle(\"vertical-align\",b):a.removeStyle(\"vertical-align\");\na.removeAttribute(\"vAlign\")}}]},f,{type:\"vbox\",padding:0,children:[{type:\"select\",id:\"cellType\",label:c.cellType,\"default\":\"td\",items:[[c.data,\"td\"],[c.header,\"th\"]],setup:d(function(a){return a.getName()}),commit:function(a){a.renameNode(this.getValue())}},f,{type:\"text\",id:\"rowSpan\",label:c.rowSpan,\"default\":\"\",validate:k.integer(c.invalidRowSpan),setup:d(function(a){if((a=parseInt(a.getAttribute(\"rowSpan\"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute(\"rowSpan\",\nthis.getValue()):a.removeAttribute(\"rowSpan\")}},{type:\"text\",id:\"colSpan\",label:c.colSpan,\"default\":\"\",validate:k.integer(c.invalidColSpan),setup:d(function(a){if((a=parseInt(a.getAttribute(\"colSpan\"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute(\"colSpan\",this.getValue()):a.removeAttribute(\"colSpan\")}},f,{type:\"hbox\",padding:0,widths:[\"60%\",\"40%\"],children:[{type:\"text\",id:\"bgColor\",label:c.bgColor,\"default\":\"\",setup:d(function(a){var b=a.getAttribute(\"bgColor\");\nreturn a.getStyle(\"background-color\")||b}),commit:function(a){this.getValue()?a.setStyle(\"background-color\",this.getValue()):a.removeStyle(\"background-color\");a.removeAttribute(\"bgColor\")}},m?{type:\"button\",id:\"bgColorChoose\",\"class\":\"colorChooser\",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle(\"vertical-align\",\"bottom\")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement(\"info\",\"bgColor\").setValue(a);this.focus()},this)}}:f]},f,\n{type:\"hbox\",padding:0,widths:[\"60%\",\"40%\"],children:[{type:\"text\",id:\"borderColor\",label:c.borderColor,\"default\":\"\",setup:d(function(a){var b=a.getAttribute(\"borderColor\");return a.getStyle(\"border-color\")||b}),commit:function(a){this.getValue()?a.setStyle(\"border-color\",this.getValue()):a.removeStyle(\"border-color\");a.removeAttribute(\"borderColor\")}},m?{type:\"button\",id:\"borderColorChoose\",\"class\":\"colorChooser\",label:c.chooseColor,style:(p?\"margin-right\":\"margin-left\")+\": 10px\",onLoad:function(){this.getElement().getParent().setStyle(\"vertical-align\",\n\"bottom\")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement(\"info\",\"borderColor\").setValue(a);this.focus()},this)}}:f]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells)},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d<c.length;d++)this.commitContent(c[d]);this._.editor.forceNextSelectionCheck();a.selectBookmarks(b);this._.editor.selectionChange()},\nonLoad:function(){var a={};this.foreach(function(b){b.setup&&b.commit&&(b.setup=CKEDITOR.tools.override(b.setup,function(c){return function(){c.apply(this,arguments);a[b.id]=b.getValue()}}),b.commit=CKEDITOR.tools.override(b.commit,function(c){return function(){a[b.id]!==b.getValue()&&c.apply(this,arguments)}}))})}}});"
  },
  {
    "path": "assets/ckeditor/plugins/templates/dialogs/templates.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n\n.cke_tpl_list\n{\n\tborder: #dcdcdc 2px solid;\n\tbackground-color: #ffffff;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n\twidth: 100%;\n\theight: 220px;\n}\n\n.cke_tpl_item\n{\n\tmargin: 5px;\n\tpadding: 7px;\n\tborder: #eeeeee 1px solid;\n\t*width: 88%;\n}\n\n.cke_tpl_preview\n{\n\tborder-collapse: separate;\n\ttext-indent:0;\n\twidth: 100%;\n}\n.cke_tpl_preview td\n{\n\tpadding: 2px;\n\tvertical-align: middle;\n}\n.cke_tpl_preview .cke_tpl_preview_img\n{\n\twidth: 100px;\n}\n.cke_tpl_preview span\n{\n\twhite-space: normal;\n}\n\n.cke_tpl_title\n{\n\tfont-weight: bold;\n}\n\n.cke_tpl_list a:hover .cke_tpl_item,\n.cke_tpl_list a:focus .cke_tpl_item,\n.cke_tpl_list a:active .cke_tpl_item\n{\n\tborder: #ff9933 1px solid;\n\tbackground-color: #fffacd;\n}\n\n.cke_tpl_list a:hover *,\n.cke_tpl_list a:focus *,\n.cke_tpl_list a:active *\n{\n\tcursor: pointer;\n}\n\n/* IE Quirks contextual selectors children will not get :hover transition until\n\tthe hover style of the link itself contains certain CSS declarations. */\n.cke_browser_quirks .cke_tpl_list a:active,\n.cke_browser_quirks .cke_tpl_list a:hover,\n.cke_browser_quirks .cke_tpl_list a:focus\n{\n\tbackground-position: 0 0;\n}\n\n.cke_hc .cke_tpl_list a:hover .cke_tpl_item,\n.cke_hc .cke_tpl_list a:focus .cke_tpl_item,\n.cke_hc .cke_tpl_list a:active .cke_tpl_item\n{\n\tborder-width: 3px;\n}\n\n.cke_tpl_empty, .cke_tpl_loading\n{\n\ttext-align: center;\n\tpadding: 5px;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/templates/dialogs/templates.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n(function(){CKEDITOR.dialog.add(\"templates\",function(c){function r(a,b){var m=CKEDITOR.dom.element.createFromHtml('\\x3ca href\\x3d\"javascript:void(0)\" tabIndex\\x3d\"-1\" role\\x3d\"option\" \\x3e\\x3cdiv class\\x3d\"cke_tpl_item\"\\x3e\\x3c/div\\x3e\\x3c/a\\x3e'),d='\\x3ctable style\\x3d\"width:350px;\" class\\x3d\"cke_tpl_preview\" role\\x3d\"presentation\"\\x3e\\x3ctr\\x3e';a.image&&b&&(d+='\\x3ctd class\\x3d\"cke_tpl_preview_img\"\\x3e\\x3cimg src\\x3d\"'+CKEDITOR.getUrl(b+a.image)+'\"'+(CKEDITOR.env.ie6Compat?' onload\\x3d\"this.width\\x3dthis.width\"':\n\"\")+' alt\\x3d\"\" title\\x3d\"\"\\x3e\\x3c/td\\x3e');d+='\\x3ctd style\\x3d\"white-space:normal;\"\\x3e\\x3cspan class\\x3d\"cke_tpl_title\"\\x3e'+a.title+\"\\x3c/span\\x3e\\x3cbr/\\x3e\";a.description&&(d+=\"\\x3cspan\\x3e\"+a.description+\"\\x3c/span\\x3e\");d+=\"\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\";m.getFirst().setHtml(d);m.on(\"click\",function(){t(a.html)});return m}function t(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf(\"selectTpl\",\"chkInsertOpt\")?(c.fire(\"saveSnapshot\"),c.setData(a,function(){b.hide();var a=c.createRange();\na.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire(\"saveSnapshot\")},0)})):(c.insertHtml(a),b.hide())}function k(a){var b=a.data.getTarget(),c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag(\"a\"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire(\"click\")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get(\"templates\");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+\n\"dialogs/templates.css\"));var g,h=\"cke_tpl_list_label_\"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,n=c.config;return{title:c.lang.templates.title,minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:\"selectTpl\",label:f.title,elements:[{type:\"vbox\",padding:5,children:[{id:\"selectTplText\",type:\"html\",html:\"\\x3cspan\\x3e\"+f.selectPromptMsg+\"\\x3c/span\\x3e\"},{id:\"templatesList\",type:\"html\",focus:!0,html:'\\x3cdiv class\\x3d\"cke_tpl_list\" tabIndex\\x3d\"-1\" role\\x3d\"listbox\" aria-labelledby\\x3d\"'+\nh+'\"\\x3e\\x3cdiv class\\x3d\"cke_tpl_loading\"\\x3e\\x3cspan\\x3e\\x3c/span\\x3e\\x3c/div\\x3e\\x3c/div\\x3e\\x3cspan class\\x3d\"cke_voice_label\" id\\x3d\"'+h+'\"\\x3e'+f.options+\"\\x3c/span\\x3e\"},{id:\"chkInsertOpt\",type:\"checkbox\",label:f.insertOption,\"default\":n.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement(\"selectTpl\",\"templatesList\");g=a.getElement();CKEDITOR.loadTemplates(n.templates_files,function(){var b=(n.templates||\"default\").split(\",\");\nif(b.length){var c=g;c.setHtml(\"\");for(var d=0,h=b.length;d<h;d++)for(var e=CKEDITOR.getTemplates(b[d]),k=e.imagesPath,e=e.templates,q=e.length,l=0;l<q;l++){var p=r(e[l],k);p.setAttribute(\"aria-posinset\",l+1);p.setAttribute(\"aria-setsize\",q);c.append(p)}a.focus()}else g.setHtml('\\x3cdiv class\\x3d\"cke_tpl_empty\"\\x3e\\x3cspan\\x3e'+f.emptyListMsg+\"\\x3c/span\\x3e\\x3c/div\\x3e\")});this._.element.on(\"keydown\",k)},onHide:function(){this._.element.removeListener(\"keydown\",k)}}})})();"
  },
  {
    "path": "assets/ckeditor/plugins/templates/templates/default.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nCKEDITOR.addTemplates(\"default\",{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath(\"templates\")+\"templates/images/\"),templates:[{title:\"Image and Title\",image:\"template1.gif\",description:\"One main image with a title and text that surround the image.\",html:'\\x3ch3\\x3e\\x3cimg src\\x3d\" \" alt\\x3d\"\" style\\x3d\"margin-right: 10px\" height\\x3d\"100\" width\\x3d\"100\" align\\x3d\"left\" /\\x3eType the title here\\x3c/h3\\x3e\\x3cp\\x3eType the text here\\x3c/p\\x3e'},{title:\"Strange Template\",image:\"template2.gif\",description:\"A template that defines two colums, each one with a title, and some text.\",\nhtml:'\\x3ctable cellspacing\\x3d\"0\" cellpadding\\x3d\"0\" style\\x3d\"width:100%\" border\\x3d\"0\"\\x3e\\x3ctr\\x3e\\x3ctd style\\x3d\"width:50%\"\\x3e\\x3ch3\\x3eTitle 1\\x3c/h3\\x3e\\x3c/td\\x3e\\x3ctd\\x3e\\x3c/td\\x3e\\x3ctd style\\x3d\"width:50%\"\\x3e\\x3ch3\\x3eTitle 2\\x3c/h3\\x3e\\x3c/td\\x3e\\x3c/tr\\x3e\\x3ctr\\x3e\\x3ctd\\x3eText 1\\x3c/td\\x3e\\x3ctd\\x3e\\x3c/td\\x3e\\x3ctd\\x3eText 2\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\\x3cp\\x3eMore text goes here.\\x3c/p\\x3e'},{title:\"Text and Table\",image:\"template3.gif\",description:\"A title with some text and a table.\",\nhtml:'\\x3cdiv style\\x3d\"width: 80%\"\\x3e\\x3ch3\\x3eTitle goes here\\x3c/h3\\x3e\\x3ctable style\\x3d\"width:150px;float: right\" cellspacing\\x3d\"0\" cellpadding\\x3d\"0\" border\\x3d\"1\"\\x3e\\x3ccaption style\\x3d\"border:solid 1px black\"\\x3e\\x3cstrong\\x3eTable title\\x3c/strong\\x3e\\x3c/caption\\x3e\\x3ctr\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3c/tr\\x3e\\x3ctr\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3c/tr\\x3e\\x3ctr\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3ctd\\x3e\\x26nbsp;\\x3c/td\\x3e\\x3c/tr\\x3e\\x3c/table\\x3e\\x3cp\\x3eType the text here\\x3c/p\\x3e\\x3c/div\\x3e'}]});"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/LICENSE.md",
    "content": "Software License Agreement\r\n==========================\r\n\r\n**CKEditor WSC Plugin**\r\nCopyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.\r\n\r\nLicensed under the terms of any of the following licenses at your choice:\r\n\r\n*   GNU General Public License Version 2 or later (the \"GPL\"):\r\n    http://www.gnu.org/licenses/gpl.html\r\n\r\n*   GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"):\r\n    http://www.gnu.org/licenses/lgpl.html\r\n\r\n*   Mozilla Public License Version 1.1 or later (the \"MPL\"):\r\n    http://www.mozilla.org/MPL/MPL-1.1.html\r\n\r\nYou are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled \"legal.txt\" in your version of this software, indicating your license choice.\r\n\r\nSources of Intellectual Property Included in this plugin\r\n--------------------------------------------------------\r\n\r\nWhere not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.\r\n\r\nTrademarks\r\n----------\r\n\r\nCKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.\r\n"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/README.md",
    "content": "CKEditor WebSpellChecker Plugin\r\n===============================\r\n\r\nThis plugin brings Web Spell Checker (WSC) into CKEditor.\r\n\r\nWSC is \"installation-less\", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.\r\n\r\nInstallation\r\n------------\r\n\r\n1. Clone/copy this repository contents in a new \"plugins/wsc\" folder in your CKEditor installation.\r\n2. Enable the \"wsc\" plugin in the CKEditor configuration file (config.js):\r\n\r\n        config.extraPlugins = 'wsc';\r\n\r\nThat's all. WSC will appear on the editor toolbar and will be ready to use.\r\n\r\nLicense\r\n-------\r\n\r\nLicensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).\r\n\r\nSee LICENSE.md for more information.\r\n\r\nDeveloped in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).\r\n"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/dialogs/ciframe.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<!--\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<title></title>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<script type=\"text/javascript\">\n\nfunction gup( name )\n{\n\tname = name.replace( /[\\[]/, '\\\\\\[' ).replace( /[\\]]/, '\\\\\\]' ) ;\n\tvar regexS = '[\\\\?&]' + name + '=([^&#]*)' ;\n\tvar regex = new RegExp( regexS ) ;\n\tvar results = regex.exec( window.location.href ) ;\n\n\tif ( results )\n\t\treturn results[ 1 ] ;\n\telse\n\t\treturn '' ;\n}\n\nvar interval;\n\nfunction sendData2Master()\n{\n\tvar destination = window.parent.parent ;\n\ttry\n\t{\n\t\tif ( destination.XDTMaster )\n\t\t{\n\t\t\tvar t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;\n\t\t\twindow.clearInterval( interval ) ;\n\t\t}\n\t}\n\tcatch (e) {}\n}\n\nfunction OnMessage (event) {\n\t        var message = event.data;\n\t        var destination = window.parent.parent;\n\t        destination.XDTMaster.read( [ 'end', message, 'fpm' ] ) ;\n}\n\nfunction listenPostMessage() {\n    if (window.addEventListener) { // all browsers except IE before version 9\n            window.addEventListener (\"message\", OnMessage, false);\n    }else {\n            if (window.attachEvent) { // IE before version 9\n                        window.attachEvent(\"onmessage\", OnMessage);\n                }\n        }\n}\n\nfunction onLoad()\n{\n\tinterval = window.setInterval( sendData2Master, 100 );\n\tlistenPostMessage();\n}\n\n</script>\n</head>\n<body onload=\"onLoad()\"><p></p></body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">\n<!--\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<title></title>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<script type=\"text/javascript\">\n\nfunction doLoadScript( url )\n{\n\tif ( !url )\n\t\treturn false ;\n\n\tvar s = document.createElement( \"script\" ) ;\n\ts.type = \"text/javascript\" ;\n\ts.src = url ;\n\tdocument.getElementsByTagName( \"head\" )[ 0 ].appendChild( s ) ;\n\n\treturn true ;\n}\n\nvar opener;\nfunction tryLoad()\n{\n\topener = window.parent;\n\n\t// get access to global parameters\n\tvar oParams = window.opener.oldFramesetPageParams;\n\n\t// make frameset rows string prepare\n\tvar sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + \",*,\" + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;\n\tdocument.getElementById( 'itFrameset' ).rows = sFramesetRows ;\n\n\t// dynamic including init frames and crossdomain transport code\n\t// from config sproxy_js_frameset url\n\tvar addScriptUrl = oParams.sproxy_js_frameset ;\n\tdoLoadScript( addScriptUrl ) ;\n}\n\n\t</script>\n</head>\n\n<frameset id=\"itFrameset\" onload=\"tryLoad();\" border=\"0\" rows=\"30,*,*,0\">\n    <frame scrolling=\"no\" framespacing=\"0\" frameborder=\"0\" noresize=\"noresize\" marginheight=\"0\" marginwidth=\"2\" src=\"\" name=\"navbar\"></frame>\n    <frame scrolling=\"auto\" framespacing=\"0\" frameborder=\"0\" noresize=\"noresize\" marginheight=\"0\" marginwidth=\"0\" src=\"\" name=\"mid\"></frame>\n    <frame scrolling=\"no\" framespacing=\"0\" frameborder=\"0\" noresize=\"noresize\" marginheight=\"1\" marginwidth=\"1\" src=\"\" name=\"bot\"></frame>\n    <frame scrolling=\"no\" framespacing=\"0\" frameborder=\"0\" noresize=\"noresize\" marginheight=\"1\" marginwidth=\"1\" src=\"\" name=\"spellsuggestall\"></frame>\n</frameset>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/dialogs/wsc.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.html or http://ckeditor.com/license\n*/\n\nhtml, body\n{\n\tbackground-color: transparent;\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\nbody\n{\n\tpadding: 10px;\n}\n\nbody, td, input, select, textarea\n{\n\tfont-size: 11px;\n\tfont-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;\n}\n\n.midtext\n{\n\tpadding:0px;\n\tmargin:10px;\n}\n\n.midtext p\n{\n\tpadding:0px;\n\tmargin:10px;\n}\n\n.Button\n{\n\tborder: #737357 1px solid;\n\tcolor: #3b3b1f;\n\tbackground-color: #c7c78f;\n}\n\n.PopupTabArea\n{\n\tcolor: #737357;\n\tbackground-color: #e3e3c7;\n}\n\n.PopupTitleBorder\n{\n\tborder-bottom: #d5d59d 1px solid;\n}\n.PopupTabEmptyArea\n{\n\tpadding-left: 10px;\n\tborder-bottom: #d5d59d 1px solid;\n}\n\n.PopupTab, .PopupTabSelected\n{\n\tborder-right: #d5d59d 1px solid;\n\tborder-top: #d5d59d 1px solid;\n\tborder-left: #d5d59d 1px solid;\n\tpadding: 3px 5px 3px 5px;\n\tcolor: #737357;\n}\n\n.PopupTab\n{\n\tmargin-top: 1px;\n\tborder-bottom: #d5d59d 1px solid;\n\tcursor: pointer;\n}\n\n.PopupTabSelected\n{\n\tfont-weight: bold;\n\tcursor: default;\n\tpadding-top: 4px;\n\tborder-bottom: #f1f1e3 1px solid;\n\tbackground-color: #f1f1e3;\n}\n"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/dialogs/wsc.js",
    "content": "﻿/*\n Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.html or http://ckeditor.com/license\n*/\n(function(){function z(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}function I(a){if(!a)throw\"Languages-by-groups list are required for construct selectbox\";var c=[],e=\"\",d;for(d in a)for(var f in a[d]){var h=a[d][f];\"en_US\"==h?e=h:c.push(h)}c.sort();e&&c.unshift(e);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var e in a[d])if(e.toUpperCase()===c.toUpperCase()){c=d;break a}c=\"\"}return c},setLangList:function(){var c={},d;for(d in a)for(var e in a[d])c[a[d][e]]=\ne;return c}()}}var g=function(){var a=function(a,b,d){d=d||{};var f=d.expires;if(\"number\"==typeof f&&f){var h=new Date;h.setTime(h.getTime()+1E3*f);f=d.expires=h}f&&f.toUTCString&&(d.expires=f.toUTCString());b=encodeURIComponent(b);a=a+\"\\x3d\"+b;for(var k in d)b=d[k],a+=\"; \"+k,!0!==b&&(a+=\"\\x3d\"+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener(\"message\",a,!1):window.attachEvent(\"onmessage\",a)},send:function(a){var b=Object.prototype.toString,\nd=a.fn||null,f=a.id||\"\",h=a.target||window,k=a.message||{id:f};a.message&&\"[object Object]\"==b.call(a.message)&&(a.message.id?a.message.id:a.message.id=f,k=a.message);a=window.JSON.stringify(k,d);h.postMessage(a,\"*\")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener(\"message\",a,!1):window.detachEvent(\"onmessage\",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(new RegExp(\"(?:^|; )\"+a.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g,\n\"\\\\$1\")+\"\\x3d([^;]*)\")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,\"\",{expires:-1})}},misc:{findFocusable:function(a){var b=null;a&&(b=a.find(\"a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]\"));return b},isVisible:function(a){var b;(b=0===a.offsetWidth||0==a.offsetHeight)||(b=\"none\"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display));\nreturn!b},hasClass:function(a,b){return!(!a.className||!a.className.match(new RegExp(\"(\\\\s|^)\"+b+\"(\\\\s|$)\")))}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:\"spell\",Thesaurus:\"thes\",GrammTab:\"grammar\"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp=\"\";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner=\"\";a.show_grammar=null;a.div_overlay_no_check=\nnull;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.sessionid=\"\";a.LocalizationButton={ChangeTo_button:{instance:null,text:\"Change to\",localizationID:\"ChangeTo\"},ChangeAll:{instance:null,text:\"Change All\"},IgnoreWord:{instance:null,text:\"Ignore word\"},IgnoreAllWords:{instance:null,text:\"Ignore all words\"},Options:{instance:null,text:\"Options\",optionsDialog:{instance:null}},AddWord:{instance:null,text:\"Add word\"},FinishChecking_button:{instance:null,text:\"Finish Checking\",\nlocalizationID:\"FinishChecking\"},FinishChecking_button_block:{instance:null,text:\"Finish Checking\",localizationID:\"FinishChecking\"}};a.LocalizationLabel={ChangeTo_label:{instance:null,text:\"Change to\",localizationID:\"ChangeTo\"},Suggestions:{instance:null,text:\"Suggestions\"},Categories:{instance:null,text:\"Categories\"},Synonyms:{instance:null,text:\"Synonyms\"}};var J=function(b){var c,e,d;for(d in b)c=(c=a.dialog.getContentElement(a.dialog._.currentTabId,d))?c.getElement():b[d].instance.getElement().getFirst()||\nb[d].instance.getElement(),e=b[d].localizationID||d,c.setText(a.LocalizationComing[e])},K=function(b){var c,e,d;for(d in b)c=a.dialog.getContentElement(a.dialog._.currentTabId,d),c||(c=b[d].instance),c.setLabel&&(e=b[d].localizationID||d,c.setLabel(a.LocalizationComing[e]+\":\"))},r,A;a.framesetHtml=function(b){return\"\\x3ciframe id\\x3d\"+a.iframeNumber+\"_\"+b+' frameborder\\x3d\"0\" allowtransparency\\x3d\"1\" style\\x3d\"width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;\"\\x3e\\x3c/iframe\\x3e'};\na.setIframe=function(b,c){var e;e=a.framesetHtml(c);var d=a.iframeNumber+\"_\"+c;b.getElement().setHtml(e);e=document.getElementById(d);e=e.contentWindow?e.contentWindow:e.contentDocument.document?e.contentDocument.document:e.contentDocument;e.document.open();e.document.write('\\x3c!DOCTYPE html\\x3e\\x3chtml\\x3e\\x3chead\\x3e\\x3cmeta charset\\x3d\"UTF-8\"\\x3e\\x3ctitle\\x3eiframe\\x3c/title\\x3e\\x3cstyle\\x3ehtml,body{margin: 0;height: 100%;font: 13px/1.555 \"Trebuchet MS\", sans-serif;}a{color: #888;font-weight: bold;text-decoration: none;border-bottom: 1px solid #888;}.main-box {color:#252525;padding: 3px 5px;text-align: justify;}.main-box p{margin: 0 0 14px;}.main-box .cerr{color: #f00000;border-bottom-color: #f00000;}\\x3c/style\\x3e\\x3c/head\\x3e\\x3cbody\\x3e\\x3cdiv id\\x3d\"content\" class\\x3d\"main-box\"\\x3e\\x3c/div\\x3e\\x3ciframe src\\x3d\"\" frameborder\\x3d\"0\" id\\x3d\"spelltext\" name\\x3d\"spelltext\" style\\x3d\"display:none; width: 100%\" \\x3e\\x3c/iframe\\x3e\\x3ciframe src\\x3d\"\" frameborder\\x3d\"0\" id\\x3d\"loadsuggestfirst\" name\\x3d\"loadsuggestfirst\" style\\x3d\"display:none; width: 100%\" \\x3e\\x3c/iframe\\x3e\\x3ciframe src\\x3d\"\" frameborder\\x3d\"0\" id\\x3d\"loadspellsuggestall\" name\\x3d\"loadspellsuggestall\" style\\x3d\"display:none; width: 100%\" \\x3e\\x3c/iframe\\x3e\\x3ciframe src\\x3d\"\" frameborder\\x3d\"0\" id\\x3d\"loadOptionsForm\" name\\x3d\"loadOptionsForm\" style\\x3d\"display:none; width: 100%\" \\x3e\\x3c/iframe\\x3e\\x3cscript\\x3e(function(window) {var ManagerPostMessage \\x3d function() {var _init \\x3d function(handler) {if (document.addEventListener) {window.addEventListener(\"message\", handler, false);} else {window.attachEvent(\"onmessage\", handler);};};var _sendCmd \\x3d function(o) {var str,type \\x3d Object.prototype.toString,fn \\x3d o.fn || null,id \\x3d o.id || \"\",target \\x3d o.target || window,message \\x3d o.message || { \"id\": id };if (o.message \\x26\\x26 type.call(o.message) \\x3d\\x3d \"[object Object]\") {(o.message[\"id\"]) ? o.message[\"id\"] : o.message[\"id\"] \\x3d id;message \\x3d o.message;};str \\x3d JSON.stringify(message, fn);target.postMessage(str, \"*\");};return {init: _init,send: _sendCmd};};var manageMessageTmp \\x3d new ManagerPostMessage;var appString \\x3d (function(){var spell \\x3d parent.CKEDITOR.config.wsc.DefaultParams.scriptPath;var serverUrl \\x3d parent.CKEDITOR.config.wsc.DefaultParams.serviceHost;return serverUrl + spell;})();function loadScript(src, callback) {var scriptTag \\x3d document.createElement(\"script\");scriptTag.type \\x3d \"text/javascript\";callback ? callback : callback \\x3d function() {};if(scriptTag.readyState) {scriptTag.onreadystatechange \\x3d function() {if (scriptTag.readyState \\x3d\\x3d \"loaded\" ||scriptTag.readyState \\x3d\\x3d \"complete\") {scriptTag.onreadystatechange \\x3d null;setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);callback();}};}else{scriptTag.onload \\x3d function() {setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);callback();};};scriptTag.src \\x3d src;document.getElementsByTagName(\"head\")[0].appendChild(scriptTag);};window.onload \\x3d function(){loadScript(appString, function(){manageMessageTmp.send({\"id\": \"iframeOnload\",\"target\": window.parent});});}})(this);\\x3c/script\\x3e\\x3c/body\\x3e\\x3c/html\\x3e');\ne.document.close()};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement(\"SpellTab\",\"banner\").getElement(),c=a.dialog.getContentElement(\"GrammTab\",\"banner\").getElement(),e=a.dialog.getContentElement(\"Thesaurus\",\"banner\").getElement();b.setStyle(\"height\",\"90px\");c.setStyle(\"height\",\"90px\");e.setStyle(\"height\",\"90px\")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+\"_\"+a.dialog._.currentTabId).style.height=\n\"240px\"};a.sendData=function(b){var c=b._.currentTabId,e=b._.contents[c].Content,d,f;a.previousTab=c;a.setIframe(e,c);var h=function(h){c=b._.currentTabId;h=h||window.event;h.data.getTarget().is(\"a\")&&c!==a.previousTab&&(a.previousTab=c,e=b._.contents[c].Content,d=a.iframeNumber+\"_\"+c,a.div_overlay.setEnable(),e.getElement().getChildCount()?E(a.targetFromFrame[d],a.cmd[c]):(a.setIframe(e,c),f=document.getElementById(d),a.targetFromFrame[d]=f.contentWindow))};b.parts.tabs.removeListener(\"click\",h);\nb.parts.tabs.on(\"click\",h)};a.buildSelectLang=function(a){var c=new CKEDITOR.dom.element(\"div\"),e=new CKEDITOR.dom.element(\"select\");a=\"wscLang\"+a;c.addClass(\"cke_dialog_ui_input_select\");c.setAttribute(\"role\",\"presentation\");c.setStyles({height:\"auto\",position:\"absolute\",right:\"0\",top:\"-1px\",width:\"160px\",\"white-space\":\"normal\"});e.setAttribute(\"id\",a);e.addClass(\"cke_dialog_ui_input_select\");e.setStyles({width:\"160px\"});c.append(e);return c};a.buildOptionLang=function(b,c){var e=document.getElementById(\"wscLang\"+\nc),d=document.createDocumentFragment(),f,h,k=[];if(0===e.options.length){for(f in b)k.push([f,b[f]]);k.sort();for(var p=0;p<k.length;p++)f=document.createElement(\"option\"),f.setAttribute(\"value\",k[p][1]),h=document.createTextNode(k[p][0]),f.appendChild(h),d.appendChild(f);e.appendChild(d)}for(d=0;d<e.options.length;d++)e.options[d].value==a.selectingLang&&(e.options[d].selected=\"selected\")};a.buildOptionSynonyms=function(b){b=a.selectNodeResponce[b];var c=z(a.selectNode.Synonyms);a.selectNode.Synonyms.clear();\nfor(var e=0;e<b.length;e++){var d=document.createElement(\"option\");d.text=b[e];d.value=b[e];c.$.add(d,e)}a.selectNode.Synonyms.getInputElement().$.firstChild.selected=!0;a.textNode.Thesaurus.setValue(a.selectNode.Synonyms.getInputElement().getValue())};var B=function(a){var c=document,e=a.target||c.body,d=a.id||\"overlayBlock\",f=a.opacity||\"0.9\";a=a.background||\"#f1f1f1\";var h=c.getElementById(d),k=h||c.createElement(\"div\");k.style.cssText=\"position: absolute;top:30px;bottom:41px;left:1px;right:1px;z-index: 10020;padding:0;margin:0;background:\"+\na+\";opacity: \"+f+\";filter: alpha(opacity\\x3d\"+100*f+\");display: none;\";k.id=d;h||e.appendChild(k);return{setDisable:function(){k.style.display=\"none\"},setEnable:function(){k.style.display=\"block\"}}},L=function(b,c,e){var d=new CKEDITOR.dom.element(\"div\"),f=new CKEDITOR.dom.element(\"input\"),h=new CKEDITOR.dom.element(\"label\"),k=\"wscGrammerSuggest\"+b+\"_\"+c;d.addClass(\"cke_dialog_ui_input_radio\");d.setAttribute(\"role\",\"presentation\");d.setStyles({width:\"97%\",padding:\"5px\",\"white-space\":\"normal\"});f.setAttributes({type:\"radio\",\nvalue:c,name:\"wscGrammerSuggest\",id:k});f.setStyles({\"float\":\"left\"});f.on(\"click\",function(b){a.textNode.GrammTab.setValue(b.sender.getValue())});e?f.setAttribute(\"checked\",!0):!1;f.addClass(\"cke_dialog_ui_radio_input\");h.appendText(b);h.setAttribute(\"for\",k);h.setStyles({display:\"block\",\"line-height\":\"16px\",\"margin-left\":\"18px\",\"white-space\":\"normal\"});d.append(f);d.append(h);return d},F=function(a){a=a||\"true\";null!==a&&\"false\"==a&&t()},w=function(b){var c=new I(b);b=\"wscLang\"+a.dialog.getParentEditor().name;\nb=document.getElementById(b);var e=a.iframeNumber+\"_\"+a.dialog._.currentTabId;a.buildOptionLang(c.setLangList,a.dialog.getParentEditor().name);u[c.getCurrentLangGroup(a.selectingLang)].onShow();F(a.show_grammar);b.onchange=function(b){b=c.getCurrentLangGroup(this.value);var f=a.dialog._.currentTabId;u[b].onShow();F(a.show_grammar);a.div_overlay.setEnable();a.selectingLang=this.value;f=a.cmd[f];b&&u[b]&&u[b].allowedTabCommands[f]||(f=u[b].defaultTabCommand);for(var h in a.cmd)if(a.cmd[h]==f){a.previousTab=\nh;break}g.postMessage.send({message:{changeLang:a.selectingLang,text:a.dataTemp,cmd:f},target:a.targetFromFrame[e],id:\"selectionLang_outer__page\"})}},M=function(b){var c,e=function(b){b=a.dialog.getContentElement(a.dialog._.currentTabId,b)||a.LocalizationButton[b].instance;b.getElement().hasClass(\"cke_disabled\")?b.getElement().setStyle(\"color\",\"#a0a0a0\"):b.disable()};c=function(b){b=a.dialog.getContentElement(a.dialog._.currentTabId,b)||a.LocalizationButton[b].instance;b.enable();b.getElement().setStyle(\"color\",\n\"#333\")};\"no_any_suggestions\"==b?(b=\"No suggestions\",c=a.dialog.getContentElement(a.dialog._.currentTabId,\"ChangeTo_button\")||a.LocalizationButton.ChangeTo_button.instance,c.disable(),c=a.dialog.getContentElement(a.dialog._.currentTabId,\"ChangeAll\")||a.LocalizationButton.ChangeAll.instance,c.disable(),e(\"ChangeTo_button\"),e(\"ChangeAll\")):(c(\"ChangeTo_button\"),c(\"ChangeAll\"));return b},O={iframeOnload:function(b){a.div_overlay.setEnable();b=a.dialog._.currentTabId;E(a.targetFromFrame[a.iframeNumber+\n\"_\"+b],a.cmd[b])},suggestlist:function(b){delete b.id;a.div_overlay_no_check.setDisable();C();w(a.langList);var c=M(b.word),e=\"\";c instanceof Array&&(c=b.word[0]);e=c=c.split(\",\");a.textNode.SpellTab.setValue(e[0]);b=z(A);A.clear();for(c=0;c<e.length;c++){var d=document.createElement(\"option\");d.text=e[c];d.value=e[c];b.$.add(d,c)}v();a.div_overlay.setDisable()},grammerSuggest:function(b){delete b.id;delete b.mocklangs;C();w(a.langList);var c=b.grammSuggest[0];a.grammerSuggest.getElement().setHtml(\"\");\na.textNode.GrammTab.reset();a.textNode.GrammTab.setValue(c);a.textNodeInfo.GrammTab.getElement().setHtml(\"\");a.textNodeInfo.GrammTab.getElement().setText(b.info);b=b.grammSuggest;for(var c=b.length,e=!0,d=0;d<c;d++)a.grammerSuggest.getElement().append(L(b[d],b[d],e)),e=!1;v();a.div_overlay.setDisable()},thesaurusSuggest:function(b){delete b.id;delete b.mocklangs;C();w(a.langList);a.selectNodeResponce=b;a.textNode.Thesaurus.reset();var c=z(a.selectNode.Categories),e=0;a.selectNode.Categories.clear();\nfor(var d in b)b=document.createElement(\"option\"),b.text=d,b.value=d,c.$.add(b,e),e++;c=a.selectNode.Categories.getInputElement().getChildren().$[0].value;a.selectNode.Categories.getInputElement().getChildren().$[0].selected=!0;a.buildOptionSynonyms(c);v();a.div_overlay.setDisable()},finish:function(b){delete b.id;N();b=a.dialog.getContentElement(a.dialog._.currentTabId,\"BlockFinishChecking\").getElement();b.removeStyle(\"display\");b.removeStyle(\"position\");b.removeStyle(\"left\");b.show();a.div_overlay.setDisable()},\nsettext:function(b){delete b.id;a.dialog.getParentEditor().getCommand(\"checkspell\");var c=a.dialog.getParentEditor();if(c.scayt&&c.wsc.isSsrvSame){var e=c.wsc.udn;e?c.wsc.DataStorage.setData(\"scayt_user_dictionary_name\",e):c.wsc.DataStorage.setData(\"scayt_user_dictionary_name\",\"\")}try{c.focus()}catch(d){}c.setData(b.text,function(){a.dataTemp=\"\";c.unlockSelection();c.fire(\"saveSnapshot\");a.dialog.hide()})},ReplaceText:function(b){delete b.id;a.div_overlay.setEnable();a.dataTemp=b.text;a.selectingLang=\nb.currentLang;(b.cmd=\"0\"!==b.len&&b.len)?a.div_overlay.setDisable():window.setTimeout(function(){try{a.div_overlay.setDisable()}catch(b){}},500);J(a.LocalizationButton);K(a.LocalizationLabel)},options_checkbox_send:function(b){delete b.id;b={osp:g.cookie.get(\"osp\"),udn:g.cookie.get(\"udn\"),cust_dic_ids:a.cust_dic_ids};g.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+\"_\"+a.dialog._.currentTabId],id:\"options_outer__page\"})},getOptions:function(b){var c=b.DefOptions.udn;a.LocalizationComing=\nb.DefOptions.localizationButtonsAndText;a.show_grammar=b.show_grammar;a.langList=b.lang;a.bnr=b.bannerId;a.sessionid=b.sessionid;if(b.bannerId){a.setHeightBannerFrame();var e=b.banner;a.dialog.getContentElement(a.dialog._.currentTabId,\"banner\").getElement().setHtml(e)}else a.setHeightFrame();\"undefined\"==c&&(a.userDictionaryName?(c=a.userDictionaryName,e={osp:g.cookie.get(\"osp\"),udn:a.userDictionaryName,cust_dic_ids:a.cust_dic_ids,id:\"options_dic_send\",udnCmd:\"create\"},g.postMessage.send({message:e,\ntarget:a.targetFromFrame[void 0]})):c=\"\");g.cookie.set(\"osp\",b.DefOptions.osp);g.cookie.set(\"udn\",c);g.cookie.set(\"cust_dic_ids\",b.DefOptions.cust_dic_ids);g.postMessage.send({id:\"giveOptions\"})},options_dic_send:function(b){b={osp:g.cookie.get(\"osp\"),udn:g.cookie.get(\"udn\"),cust_dic_ids:a.cust_dic_ids,id:\"options_dic_send\",udnCmd:g.cookie.get(\"udnCmd\")};g.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+\"_\"+a.dialog._.currentTabId]})},data:function(a){delete a.id},giveOptions:function(){},\nsetOptionsConfirmF:function(){},setOptionsConfirmT:function(){r.setValue(\"\")},clickBusy:function(){a.div_overlay.setEnable()},suggestAllCame:function(){a.div_overlay.setDisable();a.div_overlay_no_check.setDisable()},TextCorrect:function(){w(a.langList)}},G=function(a){a=a||window.event;if((a=window.JSON.parse(a.data))&&a.id)O[a.id](a)},E=function(b,c,e,d){c=c||CKEDITOR.config.wsc_cmd;e=e||a.dataTemp;g.postMessage.send({message:{customerId:a.wsc_customerId,text:e,txt_ctrl:a.TextAreaNumber,cmd:c,cust_dic_ids:a.cust_dic_ids,\nudn:a.userDictionaryName,slang:a.selectingLang,reset_suggest:d||!1,sessionid:a.sessionid},target:b,id:\"data_outer__page\"});a.div_overlay.setEnable()},u={superset:{onShow:function(){a.dialog.showPage(\"Thesaurus\");a.dialog.showPage(\"GrammTab\");l()},allowedTabCommands:{spell:!0,grammar:!0,thes:!0},defaultTabCommand:\"spell\"},usual:{onShow:function(){x();t();l()},allowedTabCommands:{spell:!0},defaultTabCommand:\"spell\"},rtl:{onShow:function(){x();t();l()},allowedTabCommands:{spell:!0},defaultTabCommand:\"spell\"},\nspellgrammar:{onShow:function(){x();a.dialog.showPage(\"GrammTab\");l()},allowedTabCommands:{spell:!0,grammar:!0},defaultTabCommand:\"spell\"},spellthes:{onShow:function(){a.dialog.showPage(\"Thesaurus\");t();l()},allowedTabCommands:{spell:!0,thes:!0},defaultTabCommand:\"spell\"}},H=function(b){var c=(new function(a){var b={};return{getCmdByTab:function(c){for(var h in a)b[a[h]]=h;return b[c]}}}(a.cmd)).getCmdByTab(CKEDITOR.config.wsc_cmd);b.selectPage(c);a.sendData(b)},x=function(){a.dialog.hidePage(\"Thesaurus\")},\nt=function(){a.dialog.hidePage(\"GrammTab\")},l=function(){a.dialog.showPage(\"SpellTab\")},v=function(){var b=a.dialog.getContentElement(a.dialog._.currentTabId,\"bottomGroup\").getElement();b.removeStyle(\"display\");b.removeStyle(\"position\");b.removeStyle(\"left\");b.show()},N=function(){var b=a.dialog.getContentElement(a.dialog._.currentTabId,\"bottomGroup\").getElement(),c=document.activeElement,e;b.setStyles({display:\"block\",position:\"absolute\",left:\"-9999px\"});setTimeout(function(){b.removeStyle(\"display\");\nb.removeStyle(\"position\");b.removeStyle(\"left\");b.hide();a.dialog._.editor.focusManager.currentActive.focusNext();e=g.misc.findFocusable(a.dialog.parts.contents);if(g.misc.hasClass(c,\"cke_dialog_tab\")||g.misc.hasClass(c,\"cke_dialog_contents_body\")||!g.misc.isVisible(c))for(var d=0,f;d<e.count();d++){if(f=e.getItem(d),g.misc.isVisible(f.$)){try{f.$.focus()}catch(h){}break}}else try{c.focus()}catch(k){}},0)},C=function(){var b=a.dialog.getContentElement(a.dialog._.currentTabId,\"BlockFinishChecking\").getElement(),\nc=document.activeElement,e;b.setStyles({display:\"block\",position:\"absolute\",left:\"-9999px\"});setTimeout(function(){b.removeStyle(\"display\");b.removeStyle(\"position\");b.removeStyle(\"left\");b.hide();a.dialog._.editor.focusManager.currentActive.focusNext();e=g.misc.findFocusable(a.dialog.parts.contents);if(g.misc.hasClass(c,\"cke_dialog_tab\")||g.misc.hasClass(c,\"cke_dialog_contents_body\")||!g.misc.isVisible(c))for(var d=0,f;d<e.count();d++){if(f=e.getItem(d),g.misc.isVisible(f.$)){try{f.$.focus()}catch(h){}break}}else try{c.focus()}catch(k){}},\n0)};CKEDITOR.dialog.add(\"checkspell\",function(b){function c(a){var c=parseInt(b.config.wsc_left,10),d=parseInt(b.config.wsc_top,10),e=parseInt(b.config.wsc_width,10),g=parseInt(b.config.wsc_height,10),m=CKEDITOR.document.getWindow().getViewPaneSize();a.getPosition();var n=a.getSize(),q=0;if(!a._.resized){var q=n.height-a.parts.contents.getSize(\"height\",!(CKEDITOR.env.gecko||CKEDITOR.env.opera||CKEDITOR.env.ie&&CKEDITOR.env.quirks)),D=n.width-a.parts.contents.getSize(\"width\",1);if(e<f.minWidth||isNaN(e))e=\nf.minWidth;e>m.width-D&&(e=m.width-D);if(g<f.minHeight||isNaN(g))g=f.minHeight;g>m.height-q&&(g=m.height-q);n.width=e+D;n.height=g+q;a._.fromResizeEvent=!1;a.resize(e,g);setTimeout(function(){a._.fromResizeEvent=!1;CKEDITOR.dialog.fire(\"resize\",{dialog:a,width:e,height:g},b)},300)}a._.moved||(q=isNaN(c)&&isNaN(d)?0:1,isNaN(c)&&(c=(m.width-n.width)/2),0>c&&(c=0),c>m.width-n.width&&(c=m.width-n.width),isNaN(d)&&(d=(m.height-n.height)/2),0>d&&(d=0),d>m.height-n.height&&(d=m.height-n.height),a.move(c,\nd,q))}function e(){b.wsc={};(function(a){var b={separator:\"\\x3c$\\x3e\",getDataType:function(a){return\"undefined\"===typeof a?\"undefined\":null===a?\"null\":Object.prototype.toString.call(a).slice(8,-1)},convertDataToString:function(a){return this.getDataType(a).toLowerCase()+this.separator+a},restoreDataFromString:function(a){var b=a,c;a=this.backCompatibility(a);if(\"string\"===typeof a)switch(b=a.indexOf(this.separator),c=a.substring(0,b),b=a.substring(b+this.separator.length),c){case \"boolean\":b=\"true\"===\nb;break;case \"number\":b=parseFloat(b);break;case \"array\":b=\"\"===b?[]:b.split(\",\");break;case \"null\":b=null;break;case \"undefined\":b=void 0}return b},backCompatibility:function(a){var b=a,c;\"string\"===typeof a&&(c=a.indexOf(this.separator),0>c&&(b=parseFloat(a),isNaN(b)&&(\"[\"===a[0]&&\"]\"===a[a.length-1]?(a=a.replace(\"[\",\"\"),a=a.replace(\"]\",\"\"),b=\"\"===a?[]:a.split(\",\")):b=\"true\"===a||\"false\"===a?\"true\"===a:a),b=this.convertDataToString(b)));return b}},c={get:function(a){return b.restoreDataFromString(window.localStorage.getItem(a))},\nset:function(a,c){var d=b.convertDataToString(c);window.localStorage.setItem(a,d)},del:function(a){window.localStorage.removeItem(a)},clear:function(){window.localStorage.clear()}},d={expiration:31622400,get:function(a){return b.restoreDataFromString(this.getCookie(a))},set:function(a,c){var d=b.convertDataToString(c);this.setCookie(a,d,{expires:this.expiration})},del:function(a){this.deleteCookie(a)},getCookie:function(a){return(a=document.cookie.match(new RegExp(\"(?:^|; )\"+a.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g,\n\"\\\\$1\")+\"\\x3d([^;]*)\")))?decodeURIComponent(a[1]):void 0},setCookie:function(a,b,c){c=c||{};var d=c.expires;if(\"number\"===typeof d&&d){var e=new Date;e.setTime(e.getTime()+1E3*d);d=c.expires=e}d&&d.toUTCString&&(c.expires=d.toUTCString());b=encodeURIComponent(b);a=a+\"\\x3d\"+b;for(var h in c)b=c[h],a+=\"; \"+h,!0!==b&&(a+=\"\\x3d\"+b);document.cookie=a},deleteCookie:function(a){this.setCookie(a,null,{expires:-1})},clear:function(){for(var a=document.cookie.split(\";\"),b=0;b<a.length;b++){var c=a[b],d=c.indexOf(\"\\x3d\"),\nc=-1<d?c.substr(0,d):c;this.deleteCookie(c)}}},e=window.localStorage?c:d;a.DataStorage={getData:function(a){return e.get(a)},setData:function(a,b){e.set(a,b)},deleteData:function(a){e.del(a)},clear:function(){e.clear()}}})(b.wsc);b.wsc.operationWithUDN=function(b,c){g.postMessage.send({message:{udn:c,id:\"operationWithUDN\",udnCmd:b},target:a.targetFromFrame[a.iframeNumber+\"_\"+a.dialog._.currentTabId]})};b.wsc.getLocalStorageUDN=function(){var a=b.wsc.DataStorage.getData(\"scayt_user_dictionary_name\");\nif(a)return a};b.wsc.getLocalStorageUD=function(){var a=b.wsc.DataStorage.getData(\"scayt_user_dictionary\");if(a)return a};b.wsc.addWords=function(a,c){var d=b.config.wsc.DefaultParams.serviceHost+b.config.wsc.DefaultParams.ssrvHost+\"?cmd\\x3ddictionary\\x26format\\x3djson\\x26customerid\\x3d1%3AncttD3-fIoSf2-huzwE4-Y5muI2-mD0Tt-kG9Wz-UEDFC-tYu243-1Uq474-d9Z2l3\\x26action\\x3daddword\\x26word\\x3d\"+a+\"\\x26callback\\x3dtoString\\x26synchronization\\x3dtrue\",e=document.createElement(\"script\");e.type=\"text/javascript\";\ne.src=d;document.getElementsByTagName(\"head\")[0].appendChild(e);e.onload=c;e.onreadystatechange=function(){\"loaded\"===this.readyState&&c()}};b.wsc.cgiOrigin=function(){var a=b.config.wsc.DefaultParams.serviceHost.split(\"/\");return a[0]+\"//\"+a[2]};b.wsc.isSsrvSame=!1}var d=function(c){this.getElement().focus();a.div_overlay.setEnable();c=a.dialog._.currentTabId;var d=a.iframeNumber+\"_\"+c,e=a.textNode[c].getValue(),f=this.getElement().getAttribute(\"title-cmd\");g.postMessage.send({message:{cmd:f,tabId:c,\nnew_word:e},target:a.targetFromFrame[d],id:\"cmd_outer__page\"});\"ChangeTo\"!=f&&\"ChangeAll\"!=f||b.fire(\"saveSnapshot\");\"FinishChecking\"==f&&b.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame())},f={minWidth:560,minHeight:444};return{title:b.config.wsc_dialogTitle||b.lang.wsc.title,minWidth:f.minWidth,minHeight:f.minHeight,buttons:[CKEDITOR.dialog.cancelButton],onLoad:function(){a.dialog=this;x();t();l();b.plugins.scayt&&e()},onShow:function(){a.dialog=this;b.lockSelection(b.getSelection());\na.TextAreaNumber=\"cke_textarea_\"+b.name;g.postMessage.init(G);a.dataTemp=b.getData();a.OverlayPlace=a.dialog.parts.tabs.getParent().$;if(CKEDITOR&&CKEDITOR.config){a.wsc_customerId=b.config.wsc_customerId;a.cust_dic_ids=b.config.wsc_customDictionaryIds;a.userDictionaryName=b.config.wsc_userDictionaryName;a.defaultLanguage=CKEDITOR.config.defaultLanguage;var d=\"file:\"==document.location.protocol?\"http:\":document.location.protocol,d=b.config.wsc_customLoaderScript||d+\"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin\\x3dfck2\\x26customerid\\x3d\"+\na.wsc_customerId+\"\\x26cmd\\x3dscript\\x26doc\\x3dwsc\\x26schema\\x3d22\";c(this);CKEDITOR.scriptLoader.load(d,function(c){CKEDITOR.config&&CKEDITOR.config.wsc&&CKEDITOR.config.wsc.DefaultParams?(a.serverLocationHash=CKEDITOR.config.wsc.DefaultParams.serviceHost,a.logotype=CKEDITOR.config.wsc.DefaultParams.logoPath,a.loadIcon=CKEDITOR.config.wsc.DefaultParams.iconPath,a.loadIconEmptyEditor=CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor,a.LangComparer=new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare):\n(a.serverLocationHash=DefaultParams.serviceHost,a.logotype=DefaultParams.logoPath,a.loadIcon=DefaultParams.iconPath,a.loadIconEmptyEditor=DefaultParams.iconPathEmptyEditor,a.LangComparer=new _SP_FCK_LangCompare);a.pluginPath=CKEDITOR.getUrl(b.plugins.wsc.path);a.iframeNumber=a.TextAreaNumber;a.templatePath=a.pluginPath+\"dialogs/tmp.html\";a.LangComparer.setDefaulLangCode(a.defaultLanguage);a.currentLang=b.config.wsc_lang||a.LangComparer.getSPLangCode(b.langCode)||\"en_US\";a.selectingLang=a.currentLang;\na.div_overlay=new B({opacity:\"1\",background:\"#fff url(\"+a.loadIcon+\") no-repeat 50% 50%\",target:a.OverlayPlace});var d=a.dialog.parts.tabs.getId(),d=CKEDITOR.document.getById(d);d.setStyle(\"width\",\"97%\");d.getElementsByTag(\"DIV\").count()||d.append(a.buildSelectLang(a.dialog.getParentEditor().name));a.div_overlay_no_check=new B({opacity:\"1\",id:\"no_check_over\",background:\"#fff url(\"+a.loadIconEmptyEditor+\") no-repeat 50% 50%\",target:a.OverlayPlace});c&&(H(a.dialog),a.dialog.setupContent(a.dialog));\nb.plugins.scayt&&(b.wsc.isSsrvSame=function(){var a=CKEDITOR.config.wsc.DefaultParams.serviceHost.replace(\"lf/22/js/../../../\",\"\").split(\"//\")[1],c=CKEDITOR.config.wsc.DefaultParams.ssrvHost,d=b.config.scayt_srcUrl,e,h,f,g,p;window.SCAYT&&window.SCAYT.CKSCAYT&&(f=SCAYT.CKSCAYT.prototype.basePath,f.split(\"//\"),g=f.split(\"//\")[1].split(\"/\")[0],p=f.split(g+\"/\")[1].replace(\"/lf/scayt3/ckscayt/\",\"\")+\"/script/ssrv.cgi\");!d||f||b.config.scayt_servicePath||(d.split(\"//\"),e=d.split(\"//\")[1].split(\"/\")[0],\nh=d.split(e+\"/\")[1].replace(\"/lf/scayt3/ckscayt/ckscayt.js\",\"\")+\"/script/ssrv.cgi\");return\"//\"+a+c===\"//\"+(b.config.scayt_serviceHost||g||e)+\"/\"+(b.config.scayt_servicePath||p||h)}());if(window.SCAYT&&b.wsc&&b.wsc.isSsrvSame){var e=b.wsc.cgiOrigin();b.wsc.syncIsDone=!1;c=function(a){a.origin===e&&(a=JSON.parse(a.data),a.ud&&\"undefined\"!==a.ud?b.wsc.ud=a.ud:\"undefined\"===a.ud&&(b.wsc.ud=void 0),a.udn&&\"undefined\"!==a.udn?b.wsc.udn=a.udn:\"undefined\"===a.udn&&(b.wsc.udn=void 0),b.wsc.syncIsDone||(h(b.wsc.ud),\nb.wsc.syncIsDone=!0))};var h=function(c){c=b.wsc.getLocalStorageUD();var d;c instanceof Array&&(d=c.toString());void 0!==d&&\"\"!==d&&setTimeout(function(){b.wsc.addWords(d,function(){H(a.dialog);a.dialog.setupContent(a.dialog)})},400)};window.addEventListener?addEventListener(\"message\",c,!1):window.attachEvent(\"onmessage\",c);setTimeout(function(){var a=b.wsc.getLocalStorageUDN();void 0!==a&&b.wsc.operationWithUDN(\"restore\",a)},500)}})}else a.dialog.hide()},onHide:function(){var c=CKEDITOR.plugins.scayt,\nd=b.scayt;b.unlockSelection();c&&d&&c.state[b.name]&&d.setMarkupPaused(!1);a.dataTemp=\"\";a.sessionid=\"\";g.postMessage.unbindHandler(G);if(b.plugins.scayt&&b.wsc&&b.wsc.isSsrvSame){var c=b.wsc.udn,e=b.wsc.ud,f,l;b.scayt?(c?(b.wsc.DataStorage.setData(\"scayt_user_dictionary_name\",c),b.scayt.restoreUserDictionary(c)):(b.wsc.DataStorage.setData(\"scayt_user_dictionary_name\",\"\"),b.scayt.removeUserDictionary()),e&&setTimeout(function(){f=e.split(\",\");for(l=0;l<f.length;l+=1)b.scayt.addWordToUserDictionary(f[l])},\n200),e||b.wsc.DataStorage.setData(\"scayt_user_dictionary\",[])):(c?b.wsc.DataStorage.setData(\"scayt_user_dictionary_name\",c):b.wsc.DataStorage.setData(\"scayt_user_dictionary_name\",\"\"),e&&(f=e.split(\",\"),b.wsc.DataStorage.setData(\"scayt_user_dictionary\",f)))}},contents:[{id:\"SpellTab\",label:\"SpellChecker\",accessKey:\"S\",elements:[{type:\"html\",id:\"banner\",label:\"banner\",style:\"\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\"},{type:\"html\",id:\"Content\",label:\"spellContent\",html:\"\",setup:function(b){b=a.iframeNumber+\"_\"+\nb._.currentTabId;var c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:\"hbox\",id:\"bottomGroup\",style:\"width:560px; margin: 0 auto;\",widths:[\"50%\",\"50%\"],children:[{type:\"hbox\",id:\"leftCol\",align:\"left\",width:\"50%\",children:[{type:\"vbox\",id:\"rightCol1\",widths:[\"50%\",\"50%\"],children:[{type:\"text\",id:\"ChangeTo_label\",label:a.LocalizationLabel.ChangeTo_label.text+\":\",labelLayout:\"horizontal\",labelStyle:\"font: 12px/25px arial, sans-serif;\",width:\"140px\",\"default\":\"\",onShow:function(){a.textNode.SpellTab=\nthis;a.LocalizationLabel.ChangeTo_label.instance=this},onHide:function(){this.reset()}},{type:\"hbox\",id:\"rightCol\",align:\"right\",width:\"30%\",children:[{type:\"vbox\",id:\"rightCol_col__left\",children:[{type:\"text\",id:\"labelSuggestions\",label:a.LocalizationLabel.Suggestions.text+\":\",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().setStyles({display:\"none\"})}},{type:\"html\",id:\"logo\",html:'\\x3cimg width\\x3d\"99\" height\\x3d\"68\" border\\x3d\"0\" src\\x3d\"\" title\\x3d\"WebSpellChecker.net\" alt\\x3d\"WebSpellChecker.net\" style\\x3d\"display: inline-block;\"\\x3e',\nsetup:function(b){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({\"text-align\":\"left\"})}}]},{type:\"select\",id:\"list_of_suggestions\",labelStyle:\"font: 12px/25px arial, sans-serif;\",size:\"6\",inputStyle:\"width: 140px; height: auto;\",items:[[\"loading...\"]],onShow:function(){A=this},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:\"hbox\",id:\"rightCol\",align:\"right\",width:\"50%\",children:[{type:\"vbox\",id:\"rightCol_col__left\",widths:[\"50%\",\"50%\",\n\"50%\",\"50%\"],children:[{type:\"button\",id:\"ChangeTo_button\",label:a.LocalizationButton.ChangeTo_button.text,title:\"Change to\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"ChangeTo\");a.LocalizationButton.ChangeTo_button.instance=this},onClick:d},{type:\"button\",id:\"ChangeAll\",label:a.LocalizationButton.ChangeAll.text,title:\"Change All\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id);a.LocalizationButton.ChangeAll.instance=\nthis},onClick:d},{type:\"button\",id:\"AddWord\",label:a.LocalizationButton.AddWord.text,title:\"Add word\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id);a.LocalizationButton.AddWord.instance=this},onClick:d},{type:\"button\",id:\"FinishChecking_button\",label:a.LocalizationButton.FinishChecking_button.text,title:\"Finish Checking\",style:\"width: 100%;margin-top: 9px;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"FinishChecking\");a.LocalizationButton.FinishChecking_button.instance=\nthis},onClick:d}]},{type:\"vbox\",id:\"rightCol_col__right\",widths:[\"50%\",\"50%\",\"50%\"],children:[{type:\"button\",id:\"IgnoreWord\",label:a.LocalizationButton.IgnoreWord.text,title:\"Ignore word\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:d},{type:\"button\",id:\"IgnoreAllWords\",label:a.LocalizationButton.IgnoreAllWords.text,title:\"Ignore all words\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\nthis.id);a.LocalizationButton.IgnoreAllWords.instance=this},onClick:d},{type:\"button\",id:\"Options\",label:a.LocalizationButton.Options.text,title:\"Option\",style:\"width: 100%;\",onLoad:function(){a.LocalizationButton.Options.instance=this;\"file:\"==document.location.protocol&&this.disable()},onClick:function(){this.getElement().focus();\"file:\"==document.location.protocol?alert(\"WSC: Options functionality is disabled when runing from file system\"):(y=document.activeElement,b.openDialog(\"options\"))}}]}]}]},\n{type:\"hbox\",id:\"BlockFinishChecking\",style:\"width:560px; margin: 0 auto;\",widths:[\"70%\",\"30%\"],onShow:function(){this.getElement().setStyles({display:\"block\",position:\"absolute\",left:\"-9999px\"})},onHide:v,children:[{type:\"hbox\",id:\"leftCol\",align:\"left\",width:\"70%\",children:[{type:\"vbox\",id:\"rightCol1\",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({\"text-align\":\"center\"})},children:[{type:\"html\",id:\"logo\",html:'\\x3cimg width\\x3d\"99\" height\\x3d\"68\" border\\x3d\"0\" src\\x3d\"\" title\\x3d\"WebSpellChecker.net\" alt\\x3d\"WebSpellChecker.net\" style\\x3d\"display: inline-block;\"\\x3e'}]}]},\n{type:\"hbox\",id:\"rightCol\",align:\"right\",width:\"30%\",children:[{type:\"vbox\",id:\"rightCol_col__left\",children:[{type:\"button\",id:\"Option_button\",label:a.LocalizationButton.Options.text,title:\"Option\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id);\"file:\"==document.location.protocol&&this.disable()},onClick:function(){this.getElement().focus();\"file:\"==document.location.protocol?alert(\"WSC: Options functionality is disabled when runing from file system\"):\n(y=document.activeElement,b.openDialog(\"options\"))}},{type:\"button\",id:\"FinishChecking_button_block\",label:a.LocalizationButton.FinishChecking_button_block.text,title:\"Finish Checking\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"FinishChecking\")},onClick:d}]}]}]}]},{id:\"GrammTab\",label:\"Grammar\",accessKey:\"G\",elements:[{type:\"html\",id:\"banner\",label:\"banner\",style:\"\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\"},{type:\"html\",id:\"Content\",label:\"GrammarContent\",html:\"\",setup:function(){var b=\na.iframeNumber+\"_\"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:\"vbox\",id:\"bottomGroup\",style:\"width:560px; margin: 0 auto;\",children:[{type:\"hbox\",id:\"leftCol\",widths:[\"66%\",\"34%\"],children:[{type:\"vbox\",children:[{type:\"text\",id:\"text\",label:\"Change to:\",labelLayout:\"horizontal\",labelStyle:\"font: 12px/25px arial, sans-serif;\",inputStyle:\"float: right; width: 200px;\",\"default\":\"\",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},\n{type:\"html\",id:\"html_text\",html:\"\\x3cdiv style\\x3d'min-height: 17px; line-height: 17px; padding: 5px; text-align: left;background: #F1F1F1;color: #595959; white-space: normal!important;'\\x3e\\x3c/div\\x3e\",onShow:function(b){a.textNodeInfo.GrammTab=this}},{type:\"html\",id:\"radio\",html:\"\",onShow:function(){a.grammerSuggest=this}}]},{type:\"vbox\",children:[{type:\"button\",id:\"ChangeTo_button\",label:\"Change to\",title:\"Change to\",style:\"width: 133px; float: right;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\n\"ChangeTo\")},onClick:d},{type:\"button\",id:\"IgnoreWord\",label:\"Ignore word\",title:\"Ignore word\",style:\"width: 133px; float: right;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id)},onClick:d},{type:\"button\",id:\"IgnoreAllWords\",label:\"Ignore Problem\",title:\"Ignore Problem\",style:\"width: 133px; float: right;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id)},onClick:d},{type:\"button\",id:\"FinishChecking_button\",label:a.LocalizationButton.FinishChecking_button.text,\ntitle:\"Finish Checking\",style:\"width: 133px; float: right; margin-top: 9px;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"FinishChecking\")},onClick:d}]}]}]},{type:\"hbox\",id:\"BlockFinishChecking\",style:\"width:560px; margin: 0 auto;\",widths:[\"70%\",\"30%\"],onShow:function(){this.getElement().setStyles({display:\"block\",position:\"absolute\",left:\"-9999px\"})},onHide:v,children:[{type:\"hbox\",id:\"leftCol\",align:\"left\",width:\"70%\",children:[{type:\"vbox\",id:\"rightCol1\",children:[{type:\"html\",\nid:\"logo\",html:'\\x3cimg width\\x3d\"99\" height\\x3d\"68\" border\\x3d\"0\" src\\x3d\"\" title\\x3d\"WebSpellChecker.net\" alt\\x3d\"WebSpellChecker.net\" style\\x3d\"display: inline-block;\"\\x3e',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({\"text-align\":\"center\"})}}]}]},{type:\"hbox\",id:\"rightCol\",align:\"right\",width:\"30%\",children:[{type:\"vbox\",id:\"rightCol_col__left\",children:[{type:\"button\",id:\"FinishChecking_button_block\",label:a.LocalizationButton.FinishChecking_button_block.text,\ntitle:\"Finish Checking\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"FinishChecking\")},onClick:d}]}]}]}]},{id:\"Thesaurus\",label:\"Thesaurus\",accessKey:\"T\",elements:[{type:\"html\",id:\"banner\",label:\"banner\",style:\"\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\"},{type:\"html\",id:\"Content\",label:\"spellContent\",html:\"\",setup:function(){var b=a.iframeNumber+\"_\"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:\"vbox\",id:\"bottomGroup\",\nstyle:\"width:560px; margin: -10px auto; overflow: hidden;\",children:[{type:\"hbox\",widths:[\"75%\",\"25%\"],children:[{type:\"vbox\",children:[{type:\"hbox\",widths:[\"65%\",\"35%\"],children:[{type:\"text\",id:\"ChangeTo_label\",label:a.LocalizationLabel.ChangeTo_label.text+\":\",labelLayout:\"horizontal\",inputStyle:\"width: 160px;\",labelStyle:\"font: 12px/25px arial, sans-serif;\",\"default\":\"\",onShow:function(b){a.textNode.Thesaurus=this;a.LocalizationLabel.ChangeTo_label.instance=this},onHide:function(){this.reset()}},\n{type:\"button\",id:\"ChangeTo_button\",label:a.LocalizationButton.ChangeTo_button.text,title:\"Change to\",style:\"width: 121px; margin-top: 1px;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"ChangeTo\");a.LocalizationButton.ChangeTo_button.instance=this},onClick:d}]},{type:\"hbox\",children:[{type:\"select\",id:\"Categories\",label:a.LocalizationLabel.Categories.text+\":\",labelStyle:\"font: 12px/25px arial, sans-serif;\",size:\"5\",inputStyle:\"width: 180px; height: auto;\",items:[],onShow:function(){a.selectNode.Categories=\nthis;a.LocalizationLabel.Categories.instance=this},onChange:function(){a.buildOptionSynonyms(this.getValue())}},{type:\"select\",id:\"Synonyms\",label:a.LocalizationLabel.Synonyms.text+\":\",labelStyle:\"font: 12px/25px arial, sans-serif;\",size:\"5\",inputStyle:\"width: 180px; height: auto;\",items:[],onShow:function(){a.selectNode.Synonyms=this;a.textNode.Thesaurus.setValue(this.getValue());a.LocalizationLabel.Synonyms.instance=this},onChange:function(b){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},\n{type:\"vbox\",width:\"120px\",style:\"margin-top:46px;\",children:[{type:\"html\",id:\"logotype\",label:\"WebSpellChecker.net\",html:'\\x3cimg width\\x3d\"99\" height\\x3d\"68\" border\\x3d\"0\" src\\x3d\"\" title\\x3d\"WebSpellChecker.net\" alt\\x3d\"WebSpellChecker.net\" style\\x3d\"display: inline-block;\"\\x3e',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({\"text-align\":\"center\"})}},{type:\"button\",id:\"FinishChecking_button\",label:a.LocalizationButton.FinishChecking_button.text,title:\"Finish Checking\",\nstyle:\"width: 100%; float: right; margin-top: 9px;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"FinishChecking\")},onClick:d}]}]}]},{type:\"hbox\",id:\"BlockFinishChecking\",style:\"width:560px; margin: 0 auto;\",widths:[\"70%\",\"30%\"],onShow:function(){this.getElement().setStyles({display:\"block\",position:\"absolute\",left:\"-9999px\"})},children:[{type:\"hbox\",id:\"leftCol\",align:\"left\",width:\"70%\",children:[{type:\"vbox\",id:\"rightCol1\",children:[{type:\"html\",id:\"logo\",html:'\\x3cimg width\\x3d\"99\" height\\x3d\"68\" border\\x3d\"0\" src\\x3d\"\" title\\x3d\"WebSpellChecker.net\" alt\\x3d\"WebSpellChecker.net\" style\\x3d\"display: inline-block;\"\\x3e',\nsetup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({\"text-align\":\"center\"})}}]}]},{type:\"hbox\",id:\"rightCol\",align:\"right\",width:\"30%\",children:[{type:\"vbox\",id:\"rightCol_col__left\",children:[{type:\"button\",id:\"FinishChecking_button_block\",label:a.LocalizationButton.FinishChecking_button_block.text,title:\"Finish Checking\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",\"FinishChecking\")},onClick:d}]}]}]}]}]}});var y=null;CKEDITOR.dialog.add(\"options\",\nfunction(b){var c=null,e={},d={},f=null,h=null;g.cookie.get(\"udn\");g.cookie.get(\"osp\");b=function(a){h=this.getElement().getAttribute(\"title-cmd\");a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,\"\");g.cookie.set(\"osp\",a);g.cookie.set(\"udnCmd\",h?h:\"ignore\");\"delete\"!=h&&(a=\"\",\"\"!==r.getValue()&&(a=r.getValue()),g.cookie.set(\"udn\",a));g.postMessage.send({id:\"options_dic_send\"})};var k=function(){f.getElement().setHtml(a.LocalizationComing.error);\nf.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:\"OptionsTab\",label:\"Options\",accessKey:\"O\",elements:[{type:\"hbox\",id:\"options_error\",children:[{type:\"html\",style:\"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red\",html:\"\\x3cdiv\\x3e\\x3c/div\\x3e\",onShow:function(){f=this}}]},{type:\"vbox\",id:\"Options_content\",children:[{type:\"hbox\",id:\"Options_manager\",widths:[\"52%\",\n\"48%\"],children:[{type:\"fieldset\",label:\"Spell Checking Options\",style:\"border: none;margin-top: 13px;padding: 10px 0 10px 10px\",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:\"vbox\",id:\"Options_checkbox\",children:[{type:\"checkbox\",id:\"IgnoreAllCapsWords\",label:\"Ignore All-Caps Words\",labelStyle:\"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;\",style:\"float:left; min-height: 16px;\",\n\"default\":\"\",onClick:function(){d[this.id]=this.getValue()?1:0}},{type:\"checkbox\",id:\"IgnoreWordsNumbers\",label:\"Ignore Words with Numbers\",labelStyle:\"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;\",style:\"float:left; min-height: 16px;\",\"default\":\"\",onClick:function(){d[this.id]=this.getValue()?1:0}},{type:\"checkbox\",id:\"IgnoreMixedCaseWords\",label:\"Ignore Mixed-Case Words\",labelStyle:\"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;\",\nstyle:\"float:left; min-height: 16px;\",\"default\":\"\",onClick:function(){d[this.id]=this.getValue()?1:0}},{type:\"checkbox\",id:\"IgnoreDomainNames\",label:\"Ignore Domain Names\",labelStyle:\"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;\",style:\"float:left; min-height: 16px;\",\"default\":\"\",onClick:function(){d[this.id]=this.getValue()?1:0}}]}]},{type:\"vbox\",id:\"Options_DictionaryName\",children:[{type:\"text\",id:\"DictionaryName\",style:\"margin-bottom: 10px\",label:\"Dictionary Name:\",\nlabelLayout:\"vertical\",labelStyle:\"font: 12px/25px arial, sans-serif;\",\"default\":\"\",onLoad:function(){r=this;var b=a.userDictionaryName?a.userDictionaryName:(g.cookie.get(\"udn\"),this.getValue());this.setValue(b)},onShow:function(){r=this;var b=g.cookie.get(\"udn\")?g.cookie.get(\"udn\"):this.getValue();this.setValue(b);this.setLabel(a.LocalizationComing.DictionaryName)},onHide:function(){this.reset()}},{type:\"hbox\",id:\"Options_buttons\",children:[{type:\"vbox\",id:\"Options_leftCol_col\",widths:[\"50%\",\"50%\"],\nchildren:[{type:\"button\",id:\"create\",label:\"Create\",title:\"Create\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id)},onShow:function(){(this.getElement().getFirst()||this.getElement()).setText(a.LocalizationComing.Create)},onClick:b},{type:\"button\",id:\"restore\",label:\"Restore\",title:\"Restore\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id)},onShow:function(){(this.getElement().getFirst()||this.getElement()).setText(a.LocalizationComing.Restore)},\nonClick:b}]},{type:\"vbox\",id:\"Options_rightCol_col\",widths:[\"50%\",\"50%\"],children:[{type:\"button\",id:\"rename\",label:\"Rename\",title:\"Rename\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id)},onShow:function(){(this.getElement().getFirst()||this.getElement()).setText(a.LocalizationComing.Rename)},onClick:b},{type:\"button\",id:\"delete\",label:\"Remove\",title:\"Remove\",style:\"width: 100%;\",onLoad:function(){this.getElement().setAttribute(\"title-cmd\",this.id)},onShow:function(){(this.getElement().getFirst()||\nthis.getElement()).setText(a.LocalizationComing.Remove)},onClick:b}]}]}]}]},{type:\"hbox\",id:\"Options_text\",children:[{type:\"html\",style:\"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;\",html:\"\\x3cdiv\\x3e\"+a.LocalizationComing.OptionsTextIntro+\"\\x3c/div\\x3e\",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[];a[0]=d.IgnoreAllCapsWords;\na[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,\"\");g.cookie.set(\"osp\",a);g.postMessage.send({id:\"options_checkbox_send\"});f.getElement().hide();f.getElement().setHtml(\" \")},onLoad:function(){c=this;e.IgnoreAllCapsWords=c.getContentElement(\"OptionsTab\",\"IgnoreAllCapsWords\");e.IgnoreWordsNumbers=c.getContentElement(\"OptionsTab\",\"IgnoreWordsNumbers\");e.IgnoreMixedCaseWords=c.getContentElement(\"OptionsTab\",\"IgnoreMixedCaseWords\");e.IgnoreDomainNames=\nc.getContentElement(\"OptionsTab\",\"IgnoreDomainNames\")},onShow:function(){g.postMessage.init(k);var b=g.cookie.get(\"osp\").split(\"\");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];parseInt(d.IgnoreAllCapsWords,10)?e.IgnoreAllCapsWords.setValue(\"checked\",!1):e.IgnoreAllCapsWords.setValue(\"\",!1);parseInt(d.IgnoreWordsNumbers,10)?e.IgnoreWordsNumbers.setValue(\"checked\",!1):e.IgnoreWordsNumbers.setValue(\"\",!1);parseInt(d.IgnoreMixedCaseWords,10)?\ne.IgnoreMixedCaseWords.setValue(\"checked\",!1):e.IgnoreMixedCaseWords.setValue(\"\",!1);parseInt(d.IgnoreDomainNames,10)?e.IgnoreDomainNames.setValue(\"checked\",!1):e.IgnoreDomainNames.setValue(\"\",!1);d.IgnoreAllCapsWords=e.IgnoreAllCapsWords.getValue()?1:0;d.IgnoreWordsNumbers=e.IgnoreWordsNumbers.getValue()?1:0;d.IgnoreMixedCaseWords=e.IgnoreMixedCaseWords.getValue()?1:0;d.IgnoreDomainNames=e.IgnoreDomainNames.getValue()?1:0;e.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreAllCapsWords;\ne.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;e.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;e.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames},onHide:function(){g.postMessage.unbindHandler(k);if(y)try{y.focus()}catch(a){}}}});CKEDITOR.dialog.on(\"resize\",function(b){b=b.data;var c=b.dialog,e=CKEDITOR.document.getById(a.iframeNumber+\"_\"+c._.currentTabId);\n\"checkspell\"==c._.name&&(a.bnr?e&&e.setSize(\"height\",b.height-310):e&&e.setSize(\"height\",b.height-220),c._.fromResizeEvent&&!c._.resized&&(c._.resized=!0),c._.fromResizeEvent=!0)});CKEDITOR.on(\"dialogDefinition\",function(b){if(\"checkspell\"===b.data.name){var c=b.data.definition;a.onLoadOverlay=new B({opacity:\"1\",background:\"#fff\",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on(\"cancel\",function(b){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());\na.div_overlay.setDisable();a.onLoadOverlay.setDisable();return!1},this,null,-1)}})})();"
  },
  {
    "path": "assets/ckeditor/plugins/wsc/dialogs/wsc_ie.js",
    "content": "﻿/*\n Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.html or http://ckeditor.com/license\n*/\nCKEDITOR.dialog.add(\"checkspell\",function(a){function c(a,c){var d=0;return function(){\"function\"==typeof window.doSpell?(\"undefined\"!=typeof e&&window.clearInterval(e),l(a)):180==d++&&window._cancelOnError(c)}}function l(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+\"dialogs/\"),e=b+\"tmpFrameset.html\";window.gFCKPluginName=\"wsc\";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||\nf.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+\"ciframe.html\",schemaURI:b+\"wsc.css\",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(\",\"),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle(\"display\",\"none\");CKEDITOR.document.getById(d).setStyle(\"display\",\n\"block\")}var b=CKEDITOR.tools.getNextNumber(),d=\"cke_frame_\"+b,g=\"cke_data_\"+b,h=\"cke_error_\"+b,e,b=document.location.protocol||\"http:\",k=a.lang.wsc.notAvailable,m='\\x3ctextarea style\\x3d\"display: none\" id\\x3d\"'+g+'\" rows\\x3d\"10\" cols\\x3d\"40\"\\x3e \\x3c/textarea\\x3e\\x3cdiv id\\x3d\"'+h+'\" style\\x3d\"display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;\"\\x3e\\x3c/div\\x3e\\x3ciframe src\\x3d\"\" style\\x3d\"width:100%;background-color:#f1f1e3;\" frameborder\\x3d\"0\" name\\x3d\"'+\nd+'\" id\\x3d\"'+d+'\" allowtransparency\\x3d\"1\"\\x3e\\x3c/iframe\\x3e',n=a.config.wsc_customLoaderScript||b+\"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin\\x3dfck2\\x26customerid\\x3d\"+a.config.wsc_customerId+\"\\x26cmd\\x3dscript\\x26doc\\x3dwsc\\x26schema\\x3d22\";a.config.wsc_customLoaderScript&&(k+='\\x3cp style\\x3d\"color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px\"\\x3e'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+\"\\x3c/p\\x3e\");window._cancelOnError=\nfunction(c){if(\"undefined\"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle(\"display\",\"none\");var b=CKEDITOR.document.getById(h);b.setStyle(\"display\",\"block\");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement(\"general\",\"content\").getElement();b.setHtml(m);b.getChild(2).setStyle(\"height\",this._.contentSize.height+\"px\");\"function\"!=\ntypeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement(\"script\",{attributes:{type:\"text/javascript\",src:n}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,k),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:\"general\",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:\"html\",id:\"content\",html:\"\"}]}]}});\nCKEDITOR.dialog.on(\"resize\",function(a){a=a.data;var c=a.dialog;\"checkspell\"==c._.name&&((c=(c=c.getContentElement(\"general\",\"content\").getElement())&&c.getChild(2))&&c.setSize(\"height\",a.height),c&&c.setSize(\"width\",a.width))});"
  },
  {
    "path": "assets/ckeditor/samples/css/samples.css",
    "content": "/**\n * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n@media (max-width: 900px) {\n  .global-is-mobile-hidden {\n    display: none !important;\n  }\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection {\n  display: block;\n}\nbody,\nhtml {\n  margin: 0;\n  padding: 0;\n  font: 16px / 1.8 Arial, 'Helvetica Neue', Helvetica, sans-serif;\n  font-weight: 300;\n  color: #575757;\n}\n.grid-width-10 {\n  width: 10%;\n}\n.grid-width-20 {\n  width: 20%;\n}\n.grid-width-30 {\n  width: 30%;\n}\n.grid-width-40 {\n  width: 40%;\n}\n.grid-width-50 {\n  width: 50%;\n}\n.grid-width-60 {\n  width: 60%;\n}\n.grid-width-70 {\n  width: 70%;\n}\n.grid-width-80 {\n  width: 80%;\n}\n.grid-width-90 {\n  width: 90%;\n}\n.grid-width-100 {\n  width: 100%;\n}\n@media (max-width: 900px) {\n  .grid-width-10,\n  .grid-width-20,\n  .grid-width-30,\n  .grid-width-40,\n  .grid-width-50,\n  .grid-width-60,\n  .grid-width-70,\n  .grid-width-80,\n  .grid-width-90,\n  .grid-width-100 {\n    width: 100%;\n  }\n}\n*[class*=\"grid-width\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding-left: 4%;\n  padding-right: 4%;\n  float: left;\n}\n*[class*=\"grid-width\"]:after,\n.grid-container:after,\n*[class*=\"grid-width\"]:before,\n.grid-container:before {\n  content: '';\n  display: block;\n  overflow: hidden;\n  visibility: hidden;\n  font-size: 0;\n  line-height: 0;\n  width: 0;\n  height: 0;\n}\n*[class*=\"grid-width\"]:after,\n.grid-container:after {\n  clear: both;\n}\n.grid-container {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  margin-left: auto;\n  margin-right: auto;\n}\n.grid-container-nested *[class*=\"grid-width\"]:first-child {\n  padding-left: 0;\n}\n.grid-container-nested *[class*=\"grid-width\"]:last-child {\n  padding-right: 0;\n}\n@media (max-width: 900px) {\n  .grid-container-nested *[class*=\"grid-width\"]:first-child {\n    padding-left: 4%;\n  }\n  .grid-container-nested *[class*=\"grid-width\"]:last-child {\n    padding-right: 4%;\n  }\n}\n.header-a {\n  min-height: 140px;\n  overflow: hidden;\n}\n.header-a .header-a-logo {\n  margin: 40px 0 0;\n}\n@media (max-width: 900px) {\n  .header-a .header-a-logo {\n    text-align: center;\n  }\n}\n.header-a .header-a-logo img {\n  border: transparent;\n}\n.navigation-a {\n  height: 30px;\n  background: #3d3d3d;\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  padding: 0;\n  overflow: hidden;\n}\n@media (max-width: 900px) {\n  .navigation-a {\n    text-align: center;\n  }\n}\n.navigation-a ul {\n  list-style: none;\n  margin: 0;\n  overflow: hidden;\n}\n.navigation-a ul li,\n.navigation-a ul li a {\n  display: inline-block;\n}\n@media (max-width: 900px) {\n  .navigation-a ul {\n    width: auto;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    display: inline-block;\n    float: none;\n  }\n  .navigation-a ul:before,\n  .navigation-a ul:after {\n    display: none;\n  }\n}\n.navigation-a ul.navigation-a-left {\n  text-align: left;\n}\n@media (max-width: 900px) {\n  .navigation-a ul.navigation-a-left {\n    padding-right: 0;\n  }\n}\n.navigation-a ul.navigation-a-right {\n  text-align: right;\n}\n@media (max-width: 900px) {\n  .navigation-a ul.navigation-a-right {\n    padding-left: 23px;\n  }\n}\n.navigation-a ul li + li {\n  margin-left: 23px;\n}\n.navigation-a ul li a {\n  font-size: 10px;\n  font-size: 0.625rem;\n  line-height: 18px;\n  line-height: 1.13rem;\n  line-height: 30px;\n  float: left;\n  color: #dddddd;\n  font-weight: bold;\n  text-decoration: none;\n  text-transform: uppercase;\n}\n.navigation-a ul li a:hover {\n  cursor: pointer;\n  color: #ffffff;\n}\n.icon-navigation-a-github:before,\n.icon-navigation-a-github:after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAAXNSR0IArs4c6QAAAa9JREFUOBGNlM8rRGEUht0pDGosjKYZpUSIkuwsiCaxUEqK2VOUBcrWv2BjxUJho6wsLLDzY2fhD5iR5NeOcJvIjOfM3O927m3mmlPPnPec835nZprvjlVVJvL5fCOjMWiDCLzCLVxZlpUj/x8saYV9+IZS8UJzFWoCt2GYgk+oJG4wJUouZDANv5VsUZ47dNSzkEYHfIDEHixDWgoiB/rTHlPPwBNInPmXHRb7hdeUDFG10AN1Th1Fd5mD6BMwMVnoUyVA3t3EkjkQlDFfmwPkc7NsQTXf0bGgJWaGb16dk18+EmLYawzkC+6Q3KdK4kiZqtGdskx/kmdlCJS86RuGrDLFZJmtGi1KB0q+VhOGsDLZsiyjGsOY4qoOkrO+YUauwCDoOKWo9xk9JfM+MPdSzqZdA8UlyDO3AvKLPsIG9LsmBHUKduEHdCy6PrpJZyKXdwKMOemaissOHJ9O9xTeh57GluMYIsehWy8STW/d8ZhkI0b9PjFasA1fsAOb0KCN1PLXYyKLGNdzj2YYArnZDyDRrA3Ua4UuDzd5QM/KaoxhmAO5Om5Qt8OI2/CJP6MVa1dvltQ5AAAAAElFTkSuQmCC\");\n}\n.navigation-b {\n  text-align: right;\n  margin: 52px 0 0;\n  overflow: visible;\n}\n@media (max-width: 900px) {\n  .navigation-b {\n    text-align: center;\n    margin-top: 20px;\n    padding: 0;\n  }\n}\n.navigation-b ul {\n  padding: 0;\n  list-style: none;\n  margin: 0;\n  overflow: visible;\n}\n.navigation-b ul li,\n.navigation-b ul li a {\n  display: inline-block;\n}\n@media (max-width: 900px) {\n  .navigation-b ul {\n    display: table;\n    width: 100%;\n    padding-bottom: 1.5em;\n  }\n}\n@media (max-width: 900px) {\n  .navigation-b ul li {\n    display: table-row;\n  }\n}\n.navigation-b ul li + li {\n  margin-left: 20px;\n}\n@media (max-width: 900px) {\n  .navigation-b ul li + li {\n    margin-left: 0;\n  }\n}\n.navigation-b ul li a {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  text-transform: uppercase;\n  text-decoration: none;\n  outline: none;\n}\n@media (max-width: 900px) {\n  .navigation-b ul li a {\n    width: 100%;\n    -webkit-border-radius: 0;\n    -webkit-background-clip: padding-box;\n    -moz-border-radius: 0;\n    -moz-background-clip: padding;\n    border-radius: 0;\n    background-clip: padding-box;\n  }\n}\n.footer-a {\n  font-size: 13px;\n  font-size: 0.8125rem;\n  line-height: 23.4px;\n  line-height: 1.46rem;\n  padding-top: 2.25em;\n  padding-bottom: 2.25em;\n  overflow: hidden;\n  color: #8a8a8a;\n}\n.footer-a a {\n  color: #27c0d8;\n  text-decoration: none;\n  border-bottom: 1px dotted #27c0d8;\n}\n.footer-a a:hover {\n  color: #23adc2;\n}\n.footer-a p {\n  margin: 0;\n  display: inline-block;\n  text-align: center;\n}\n.content {\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 25.2px;\n  line-height: 1.57rem;\n  overflow: hidden;\n  padding-top: 1.5em;\n  padding-bottom: 1.5em;\n}\n.content p {\n  margin: 0.75em 0;\n}\n.content ul,\n.content ol,\n.content pre,\n.content blockquote,\n.content textarea:not([class^=\"cke\"]),\n.content .cke {\n  margin: 1.875em 0;\n}\n.content code,\n.content kbd {\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  padding: 3px 4px;\n}\n.content pre,\n.content code,\n.content kbd,\n.content blockquote {\n  background: #f5f5f5;\n}\n.content blockquote,\n.content pre {\n  background: none;\n  border-left: 4px solid #27c0d8;\n  padding: 1.5em 2.25em;\n}\n.content p a,\n.content ul a,\n.content ol a,\n.content blockquote a,\n.content h1 a,\n.content h2 a,\n.content h3 a,\n.content h4 a,\n.content h5 a {\n  color: #27c0d8;\n  text-decoration: none;\n  border-bottom: 1px dotted #27c0d8;\n}\n.content p a:hover,\n.content ul a:hover,\n.content ol a:hover,\n.content blockquote a:hover,\n.content h1 a:hover,\n.content h2 a:hover,\n.content h3 a:hover,\n.content h4 a:hover,\n.content h5 a:hover {\n  color: #23adc2;\n}\n.content h1,\n.content h2,\n.content h3,\n.content h4,\n.content h5 {\n  color: #000;\n  font-weight: 100;\n}\n.content h1 code,\n.content h2 code,\n.content h3 code,\n.content h4 code,\n.content h5 code,\n.content h1 kbd,\n.content h2 kbd,\n.content h3 kbd,\n.content h4 kbd,\n.content h5 kbd {\n  font-size: inherit;\n}\n.content h1 a.content-heading-anchor,\n.content h2 a.content-heading-anchor,\n.content h3 a.content-heading-anchor,\n.content h4 a.content-heading-anchor,\n.content h5 a.content-heading-anchor {\n  font-weight: 100;\n  vertical-align: middle;\n  opacity: 0;\n  border: 0;\n}\n.content h1:hover a.content-heading-anchor,\n.content h2:hover a.content-heading-anchor,\n.content h3:hover a.content-heading-anchor,\n.content h4:hover a.content-heading-anchor,\n.content h5:hover a.content-heading-anchor {\n  opacity: 1;\n}\n.content h1:target a,\n.content h2:target a,\n.content h3:target a,\n.content h4:target a,\n.content h5:target a {\n  -webkit-animation: targetLinkOpacity 0.5s linear alternate;\n  -moz-animation: targetLinkOpacity 0.5s linear alternate;\n  -o-animation: targetLinkOpacity 0.5s linear alternate;\n  animation: targetLinkOpacity 0.5s linear alternate;\n  opacity: 1;\n}\n.content input,\n.content select,\n.content textarea:not([class^=\"cke\"]) {\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);\n  font: inherit;\n  color: inherit;\n  border: 1px solid #d9d9d9;\n  padding: .2em .5em;\n}\n.content input:focus,\n.content select:focus,\n.content textarea:not([class^=\"cke\"]):focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08), 0 0 8px #93c6ef;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08), 0 0 8px #93c6ef;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08), 0 0 8px #93c6ef;\n}\n.content abbr {\n  border-bottom: 1px dotted #666;\n  cursor: pointer;\n}\n.content blockquote {\n  font-style: italic;\n  font-family: Georgia, Times, \"Times New Roman\", serif;\n  font-size: 16px;\n  font-size: 1rem;\n  line-height: 28.8px;\n  line-height: 1.8rem;\n}\n.content em {\n  font-style: italic;\n}\n.content h1 {\n  font-size: 36px;\n  font-size: 2.25rem;\n  line-height: 64.8px;\n  line-height: 4.05rem;\n  margin: 1.125em 0 0;\n}\n.content h2 {\n  font-size: 27.2px;\n  font-size: 1.7rem;\n  line-height: 48.96px;\n  line-height: 3.06rem;\n  margin: 0.9em 0 0;\n}\n.content h3 {\n  font-size: 24px;\n  font-size: 1.5rem;\n  line-height: 43.2px;\n  line-height: 2.7rem;\n  font-weight: 500;\n  margin: 0.75em 0 0;\n}\n.content h4 {\n  font-size: 19.2px;\n  font-size: 1.2rem;\n  line-height: 34.56px;\n  line-height: 2.16rem;\n  font-weight: 500;\n  margin: 0.75em 0 0;\n}\n.content h5 {\n  font-size: 17.6px;\n  font-size: 1.1rem;\n  line-height: 31.68px;\n  line-height: 1.98rem;\n  font-weight: 500;\n  margin: 0.75em 0 0;\n}\n.content hr {\n  border: 0;\n  border-top: 4px solid #d9d9d9;\n  margin: 1.5em 0;\n}\n.content input[type=\"text\"] {\n  height: 1.8em;\n  line-height: 1.8em;\n}\n.content input[type=\"button\"] {\n  -webkit-appearance: button;\n  -moz-appearance: button;\n  appearance: button;\n}\n.content kbd {\n  font-size: 12px;\n  font-size: 0.75rem;\n  line-height: 21.6px;\n  line-height: 1.35rem;\n  font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;\n  padding: 2px 6px;\n  -webkit-box-shadow: 0 0 4px #ffffff inset, 0 2px 0 #d9d9d9;\n  -moz-box-shadow: 0 0 4px #ffffff inset, 0 2px 0 #d9d9d9;\n  box-shadow: 0 0 4px #ffffff inset, 0 2px 0 #d9d9d9;\n}\n.content p img {\n  vertical-align: middle;\n}\n.content p pre {\n  padding: 1.5em;\n}\n.content pre {\n  padding: 0;\n  border: 0;\n  tab-size: 4;\n  -o-tab-size: 4;\n  -moz-tab-size: 4;\n}\n.content pre,\n.content code {\n  font-size: 11.89px;\n  font-size: 0.743rem;\n  line-height: 21.4px;\n  line-height: 1.34rem;\n  font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;\n}\n.content pre a,\n.content code a {\n  border: 0;\n}\n.content pre code {\n  padding: 0.75em;\n  display: block;\n}\n.content strong {\n  color: #000;\n}\n.content ul ul,\n.content ol ul,\n.content ul ol,\n.content ol ol {\n  margin: 0.75em 0;\n}\n.content ul li,\n.content ol li {\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 30.24px;\n  line-height: 1.89rem;\n}\n.content textarea:not([class^=\"cke\"]) {\n  width: 100%;\n}\n.content div.todo {\n  border: 2px dotted #444;\n  padding: 10px;\n  margin: 60px 0 10px 0;\n  /* Remove me some day */\n}\n.content div.todo:before {\n  content: \"TODO\";\n  font-weight: bold;\n}\nbody a.button-a,\nbody button.button-a,\nbody input.button-a {\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 25.2px;\n  line-height: 1.57rem;\n  height: 36px;\n  line-height: 36px;\n  padding: 0 1.1em;\n  font-weight: 700;\n  color: #3e3e3e;\n  white-space: nowrap;\n  text-decoration: none;\n  display: inline-block;\n  cursor: pointer;\n  border: 0;\n  vertical-align: middle;\n  margin: 1px 0;\n  background: transparent;\n}\nbody a.button-a.icon-pos-left,\nbody button.button-a.icon-pos-left,\nbody input.button-a.icon-pos-left {\n  padding-left: .8em;\n}\nbody a.button-a.icon-pos-right,\nbody button.button-a.icon-pos-right,\nbody input.button-a.icon-pos-right {\n  padding-right: .8em;\n}\nbody a.button-a.button-a-no-text,\nbody button.button-a.button-a-no-text,\nbody input.button-a.button-a-no-text {\n  -webkit-border-radius: 100px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 100px;\n  -moz-background-clip: padding;\n  border-radius: 100px;\n  background-clip: padding-box;\n  width: 36px;\n  padding: 0;\n  text-indent: -999px;\n  overflow: hidden;\n  position: relative;\n  text-align: center;\n}\nbody a.button-a.button-a-no-text:before,\nbody button.button-a.button-a-no-text:before,\nbody input.button-a.button-a-no-text:before {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  margin: -9px 0 0 -9px;\n}\n@media (max-width: 900px) {\n  body a.button-a.button-a-mobile-collapsed,\n  body button.button-a.button-a-mobile-collapsed,\n  body input.button-a.button-a-mobile-collapsed {\n    -webkit-border-radius: 100px;\n    -webkit-background-clip: padding-box;\n    -moz-border-radius: 100px;\n    -moz-background-clip: padding;\n    border-radius: 100px;\n    background-clip: padding-box;\n    width: 36px;\n    padding: 0;\n    text-indent: -999px;\n    overflow: hidden;\n    position: relative;\n    text-align: center;\n  }\n  body a.button-a.button-a-mobile-collapsed:before,\n  body button.button-a.button-a-mobile-collapsed:before,\n  body input.button-a.button-a-mobile-collapsed:before {\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    margin: -9px 0 0 -9px;\n  }\n  body a.button-a.button-a-mobile-collapsed:before,\n  body button.button-a.button-a-mobile-collapsed:before,\n  body input.button-a.button-a-mobile-collapsed:before {\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    margin: -9px 0 0 -9px;\n  }\n}\nbody a.button-a:active,\nbody button.button-a:active,\nbody input.button-a:active,\nbody a.button-a:hover,\nbody button.button-a:hover,\nbody input.button-a:hover {\n  color: #fff;\n  background: #23adc2;\n}\nbody a.button-a:focus,\nbody button.button-a:focus,\nbody input.button-a:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #93c6ef;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #93c6ef;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #93c6ef;\n}\nbody a.button-a-soft,\nbody button.button-a-soft,\nbody input.button-a-soft {\n  background: #e7e7e7;\n}\nbody a.button-a-soft:active,\nbody button.button-a-soft:active,\nbody input.button-a-soft:active,\nbody a.button-a-soft:hover,\nbody button.button-a-soft:hover,\nbody input.button-a-soft:hover {\n  color: #3e3e3e;\n  background: #cecece;\n}\nbody a.button-a-background,\nbody button.button-a-background,\nbody input.button-a-background,\nbody a.navigation-b ul li a:hover,\nbody button.navigation-b ul li a:hover,\nbody input.navigation-b ul li a:hover {\n  color: #fff;\n  background: #27c0d8;\n}\nbody a.button-a-background:active,\nbody button.button-a-background:active,\nbody input.button-a-background:active,\nbody a.button-a-background:hover,\nbody button.button-a-background:hover,\nbody input.button-a-background:hover,\nbody a.navigation-b ul li a:hover:active,\nbody button.navigation-b ul li a:hover:active,\nbody input.navigation-b ul li a:hover:active,\nbody a.navigation-b ul li a:hover:hover,\nbody button.navigation-b ul li a:hover:hover,\nbody input.navigation-b ul li a:hover:hover {\n  color: #fff;\n  background: #23adc2;\n}\n.balloon-a {\n  font-size: 12px;\n  font-size: 0.75rem;\n  line-height: 21.6px;\n  line-height: 1.35rem;\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  border-bottom: 3px solid #d4d4d4;\n  background: #ebebeb;\n  display: inline-block;\n  white-space: nowrap;\n  padding: .4em 1.2em .2em;\n  font-weight: 700;\n  position: relative;\n  z-index: 1000;\n  text-transform: none;\n  color: #575757;\n}\n.balloon-a:hover {\n  color: #575757;\n}\n.balloon-a:before {\n  content: '';\n  width: 0;\n  height: 0;\n  border-style: solid;\n  position: absolute;\n}\n.balloon-a-ne:before,\n.balloon-a-nw:before {\n  top: -13px;\n  border-width: 0 9px 15.6px 9px;\n  border-color: transparent transparent #ebebeb transparent;\n}\n.balloon-a-se:before,\n.balloon-a-sw:before {\n  bottom: -13px;\n  border-width: 15.6px 9px 0 9px;\n  border-color: #ebebeb transparent transparent transparent;\n}\n.balloon-a-nw:before,\n.balloon-a-sw:before {\n  left: 20px;\n}\n.balloon-a-ne:before,\n.balloon-a-se:before {\n  right: 20px;\n}\n.icon-pos-left:before,\n.icon-pos-right:after {\n  content: '';\n  display: inline-block;\n  width: 18px;\n  height: 18px;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n}\n.icon-pos-left:before {\n  margin-right: 10px;\n}\n.icon-pos-right:after {\n  margin-left: 10px;\n}\n.icon-download:before,\n.icon-download:after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAQFJREFUOBGtVDESgjAQBGfobHwE/AIa/AN/8EEWfMWGZ+gDaG2ws8BdyY13SRgGcGducre3WQ5NSJIIxnGsES3ijhhcMCdXR7ZYCqIc0SGWQE1ud7sKjRLxXHJQfWpLYwaCk6wxET/u+U2GIngd8yRViINau28bBH/YAGqvSQPhRNQHqBqj3FY0NKq27TW7qhSTDaCOhkaRAj7Hmm8S4V+c6C+gUa+crsizuWmoc70MKbWCnqPy2GvcUJxE4a/sIajRaGkU+/sf4IuISQGePR/T/QMbHEhwPLVnMWPuOCwGnWg41dwVeaN3ccHch70idIRi/6WV0WC2/zMiZm661R+2DxyEdjTuST3mAAAAAElFTkSuQmCC\");\n}\n.icon-question-mark:before,\n.icon-question-mark:after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAUhJREFUOBGllLFOAkEQhjk0WthT2JFA7Czsqc7OxFLewEeAZ/AVbO0tTLTSBKhstTBUNkYLEoVAbD2//zILe5e9uwCT/JnZmX/+m83ebq0WsCRJYnANxmBhUKxcHGjJpiC1wQBUmTjtbLetKHTAT5WCVxe3kxEjoUmKRL6pvYEZyJt6VpOxCG3nmfyx+yJxBM7BFPg2SDlkTv2sxZqi4YnUvfgswI9FuHAkzz9EUTTRmqYeTifXsvoj/s9i57oi6ljz9kviFdyBCbgHe+rCn4C8jVXQ18rshuKOiTSIXwLkRZWQTurARJrE7wERpea7kD7BkcgB+yB3CFGlPmgqCNiXhEagSGif2qU1Ln8FW/tupK3pXhXZrWNDuCoikY/rHPMT5KFr2MAPTSM90rIrUjJIeq1WV0RTwN7+0rrtILb9M+LEbLq1H7Z/Ea3+RvBddl0AAAAASUVORK5CYII=\");\n}\n.icon-close:before,\n.icon-close:after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAUlJREFUOBGllDFuwzAMRe3Cd+jYKUCzd/XkDtm9dsoVOuUqBnqBoodwgBwiW8ZsXTIWqPu+Iia0LMAoTOBbJEV+UZTkosjIMAwN6MARXCKky9dkUsYuglagB3OimNU4O1pM1OB7jsHNK7YekeFQJZ5kj/0LcnLA+RMnlHOvDMNv5wO7BFuQkn3hq0ALjKwPVeF4BSaqpLRy0T1ZIHFz75bE2BR8dBImqmBrwRplg09QmR/9GZyBSadAHauXCZkRROKURLlHEemepJIlIyhHotzLg1/N6erTxtmmvqA8muHGIbc1rTBqrEuwnqWnGbbmmz0hwaHtvM2QhWbrXZnosvnTWWPrdCY9w7cDJtf3h9VHjy5Zq9UZ08beyJh7Aicg6W/VYvgnIjJdNn9PMIOITJWcgnV9VvcnEitY/mitNFZZ/hsxsljdv39sfybRQ4R/kU0MAAAAAElFTkSuQmCC\");\n}\n.ie8 .switch > * {\n  vertical-align: middle;\n}\n.ie8 .switch input[type=\"radio\"] {\n  margin: 0 0.25em;\n  display: inline-block;\n}\n.ie8 .switch label {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n.ie8 .switch label[data-for=\"1\"] {\n  float: left;\n}\n.ie8 .switch label[data-for=\"2\"] {\n  float: right;\n}\n.ie8 .switch .switch-inner {\n  display: none;\n}\n.switch {\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 25.2px;\n  line-height: 1.57rem;\n  font-weight: bold;\n  background-color: #27c0d8;\n  overflow: hidden;\n  display: inline-block;\n  padding: 0.75em 0.25em;\n  color: #fff;\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  position: relative;\n}\n.switch input[type=\"radio\"] {\n  display: none;\n}\n.switch label {\n  position: relative;\n  z-index: 2;\n  float: left;\n  cursor: pointer;\n  padding: 0 0.75em;\n}\n.switch label:hover {\n  text-decoration: underline;\n}\n.switch .switch-inner {\n  float: left;\n  background-color: #FFF;\n  height: 1.5em;\n  width: 4.125em;\n  padding: 2px;\n  margin: 0 0.25em;\n  -webkit-border-radius: 5.5px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 5.5px;\n  -moz-background-clip: padding;\n  border-radius: 5.5px;\n  background-clip: padding-box;\n}\n.switch .switch-inner .handler {\n  overflow: hidden;\n  position: relative;\n  display: block;\n  height: 1.5em;\n  width: 1.5em;\n  background: #25b4cb;\n  -webkit-border-radius: 4.5px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 4.5px;\n  -moz-background-clip: padding;\n  border-radius: 4.5px;\n  background-clip: padding-box;\n}\n.switch .switch-inner .handler:before {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 3px;\n  left: 0;\n  background-color: #34c4da;\n  -webkit-border-bottom-left-radius: 4.5px;\n  -moz-border-radius-bottomleft: 4.5px;\n  border-bottom-left-radius: 4.5px;\n  -webkit-border-bottom-right-radius: 4.5px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius-bottomright: 4.5px;\n  -moz-background-clip: padding;\n  border-bottom-right-radius: 4.5px;\n  background-clip: padding-box;\n}\n.switch:hover .switch-inner .handler:before {\n  background: #45c9dd;\n}\n.switch input[data-num=\"2\"]:checked ~ .switch-inner > .handler {\n  margin-left: auto;\n}\n.switch input[data-num=\"2\"]:checked ~ label[data-for=\"1\"] {\n  padding-right: 5.125em;\n  margin-right: -4.375em;\n}\n.switch input[data-num=\"1\"]:checked ~ label[data-for=\"2\"] {\n  padding-left: 5.125em;\n  margin-left: -4.375em;\n}\n.toggler {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.toggler label {\n  cursor: pointer;\n}\n.toggler [data-collapse] {\n  display: inherit;\n}\n.toggler [data-expand] {\n  display: none;\n}\n.toggler.collapsed [data-collapse] {\n  display: none;\n}\n.toggler.collapsed [data-expand] {\n  display: inherit;\n}\n.toggler-container {\n  overflow: hidden;\n}\n.toggler-container.collapsed {\n  height: 0;\n}\n.icon-toggler-expanded:before,\n.icon-toggler-collapsed:before,\n.icon-toggler-expanded:after,\n.icon-toggler-collapsed:after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAByCAYAAABeOoENAAAAAXNSR0IArs4c6QAAAbxJREFUaAXtmT1KBEEQhRdFQdBEMfQEBoaGopl3MfECXsFERLyBh/AUIuwJDEUQM//eB11Dz1A1uzotGFTBY2rr58306+kNpmazP7Z98V8Kj8JrAT4xcgttXRVXwofwFYAcNdS6RuJegOBTuBUOhc0CfGLkqKHWJeMuFDwJJ0Jk5Kihlp6esW4embuNkVgTNdTS09MMEbkDj76sUUsPvZ2xIwTRATsQuBuxGsTIYdSSo7cztpggwprdyKlJ8ImZUUuM3s48ol1lXwQjwydm5hINl2bF53KMCL82d2mR2GvqnBfg1+aKPbb9p+oGtYXbT1GTFxKiZkfEyHgy7x0y0clR454zSGpDMzaA3fzV30hNln4qkAqkAqlAKpAKpAKpQCqQCqQCqUAqkAqkAqlAKpAKpAKpQCrw3xWY/GGcz++TP9U3Gx40GWdEAxabXA33NBywRCOfdzFcCztDJv12Rz7REMpmIc9qPBNWK0J3COWNxegxIrs+KHZcyHpjsZUSXPaypcLtseJFS3tT84WwUZG4S4vEZkl3wl5FYK4rdrT9R9Y1uIbbT12TFxKiZkfEyCYfWojMJv+NGNGPr99GI9DP7P9TCgAAAABJRU5ErkJggg==\");\n}\n.icon-toggler-expanded.icon-light:before,\n.icon-toggler-collapsed.icon-light:before,\n.icon-toggler-expanded.icon-light:after,\n.icon-toggler-collapsed.icon-light:after {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAByCAYAAABeOoENAAAAAXNSR0IArs4c6QAAAcVJREFUaAXtmT9KA1EQxhMlASE2SkpPkCJlStHOu3gGwRPYBAm5gYfwFBKwtrARRAh26vr7ljfx7TrLChtBcAa+zOSbPy/7vcTC6fV+04qimIArsALrBMXiJq1nUzQEc/AOmkw51QzdgUqAWyD7AEswA6MExeKUk6n2+zBInSJ7BKfuaZDKpRpcMa/UQUgTfWSd1jjEmlSTatXzpRlvJKJsacVtXrVlB72bWgjdiGwmEj8FOq1u4qapRprJVvkgXbFsZCTxomSqL4ssr0uQrY3TJ/AGjeFfVJlM8diaiCuDdlLiIfmNcP1+/wnu0hoVJ84oq7XeUhNXbE4dgPuEgU2Qh3PFbrx+Gs6E2hD/+tMJ3b+QadB2fiLZsG4/2poG3f6M5MMiDgVCgVAgFAgFQoFQIBQIBUKBUCAUCAVCgVAgFAgFQoFQIBQIBf66AiwLuv1jnAH/Zb/Go5abq/qdwvsLFhJNK583ctfg0Bnmrnwq+zVrYoDZM8E52M1yP9uvqcGmZP6O+CTl3LWYHdTm9yk4aCzilLZHe6XmAuzZEGL30ZrEpr64AUc2wDycK7a7X6P42BpzD+9fv4pIxn4tWznnwm0r/gQpiG1tFshTowAAAABJRU5ErkJggg==\");\n}\n.icon-toggler-expanded:before,\n.icon-toggler-expanded:after {\n  background-position: top left;\n}\n.icon-toggler-collapsed:before,\n.icon-toggler-collapsed:after {\n  background-position: bottom left;\n}\n.modal {\n  padding: 20px;\n  border-radius: 3px;\n  background-color: white;\n  max-width: 700px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  width: 80% !important;\n  top: 50% !important;\n  -webkit-transform: translate(-50%, -50%) !important;\n  -moz-transform: translate(-50%, -50%) !important;\n  -o-transform: translate(-50%, -50%) !important;\n  -ms-transform: translate(-50%, -50%) !important;\n  transform: translate(-50%, -50%) !important;\n}\n.modal-close {\n  -webkit-border-radius: 100px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 100px;\n  -moz-background-clip: padding;\n  border-radius: 100px;\n  background-clip: padding-box;\n  cursor: pointer;\n  height: 18px;\n  width: 18px;\n  position: absolute;\n  top: 10px;\n  right: 10px;\n  font-size: 17px;\n  text-align: center;\n  line-height: 19px;\n  background: #cccccc;\n}\nmain .grid-container,\nheader .grid-container,\n.navigation-a > div,\nfooter > div {\n  max-width: 968px;\n}\n.header-a {\n  margin-top: 30px;\n}\n.footer-a {\n  border-top: 1px solid #d9d9d9;\n}\n.adjoined-top {\n  background-color: #27c0d8;\n  color: #fff;\n}\n.adjoined-top .content h1,\n.adjoined-top .content h2,\n.adjoined-top .content h3,\n.adjoined-top .content h4,\n.adjoined-top .content h5 {\n  color: #fff;\n}\n.adjoined-top .content p {\n  font-size: 18px;\n  font-size: 1.125rem;\n  line-height: 32.4px;\n  line-height: 2.02rem;\n  font-weight: 100;\n}\n.adjoined-top .content p a {\n  text-decoration: none;\n  border-bottom: 1px dotted #fff;\n  color: inherit;\n}\n.adjoined-top .content p a:hover {\n  color: #e6e6e6;\n}\n.adjoined-top .content button {\n  color: #fff;\n}\n.adjoined-top .content strong {\n  color: #fff;\n}\n.adjoined-top .content code {\n  font-size: inherit;\n  color: #27c0d8;\n}\n.adjoined-bottom {\n  position: relative;\n}\n.adjoined-bottom:before {\n  z-index: -1;\n  content: '';\n  background: #27c0d8;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 50%;\n}\nmain .grid-container,\nheader .grid-container,\n.navigation-a > div,\nfooter > div {\n  max-width: 1052px;\n}\nmain .grid-container.freed-width {\n  max-width: none;\n}\n.switch {\n  background: #25b4cb;\n  float: right;\n  overflow: visible;\n}\n.switch .balloon-a {\n  position: absolute;\n  top: -40px;\n  right: 50%;\n  margin-right: -15px;\n  background: #FFEFC1;\n  border-bottom-color: #DCDCA4;\n}\n.switch .balloon-a:before {\n  border-color: #FFEFC1 transparent transparent transparent;\n}\n#toolbar .editors-container {\n  overflow: hidden;\n  height: 0;\n  transition: height 200ms;\n}\n#toolbar .editors-container.active {\n  height: auto;\n}\n#main #editor {\n  background: #FFF;\n  padding: 2% 4%;\n  border: dashed 5px #27c0d8;\n}\ndiv.cke a.cke_button,\ndiv.cke .cke_combo_button {\n  border-bottom: none;\n}\ndiv.cke a.cke_button.cke_combo_button,\ndiv.cke .cke_combo_button.cke_combo_button {\n  border-bottom: 1px solid #a6a6a6;\n}\n#main .adjoined-top:before {\n  height: 335px;\n}\n#toolbar .adjoined-top:before {\n  height: 219px;\n}\n#toolbar .adjoined-top .grid-container-nested {\n  height: 147px;\n}\n.content .grid-switch-magic {\n  margin: 3.5em 0 0;\n}\n#info-box {\n  padding-bottom: 0;\n}\n#info-box > div {\n  width: 100%;\n  text-align: right;\n}\n#info-box > div .toggler {\n  padding-right: 0;\n}\n#info-box > div .toggler:hover {\n  background: transparent;\n  color: #000;\n}\n#info-box > div .toggler:hover > label {\n  text-decoration: underline;\n}\n#info-box > div h2 {\n  float: left;\n  margin-top: 0;\n}\n#info-box > div#instructions-container {\n  text-align: left;\n}\n#toolbarModifierWrapper {\n  overflow: hidden;\n  height: 0;\n  opacity: 0;\n  transition: height 200ms;\n}\n#toolbarModifierWrapper.active {\n  height: auto;\n  opacity: 1;\n}\nheader {\n  overflow: visible;\n}\nheader div.grid-container {\n  overflow: visible;\n}\nheader .navigation-b {\n  overflow: visible;\n}\nheader .navigation-b ul {\n  overflow: visible;\n}\nheader .navigation-b a {\n  position: relative;\n}\nheader .balloon-a {\n  position: absolute;\n  top: 48px;\n  left: 50%;\n  margin-left: -35px;\n}\n@media (max-width: 1140px) {\n  header .balloon-a {\n    left: auto;\n    margin-left: auto;\n    right: 50%;\n    margin-right: -35px;\n  }\n  header .balloon-a:before {\n    left: auto;\n    right: 22px;\n  }\n}\n@media (max-width: 900px) {\n  header .balloon-a {\n    display: none;\n  }\n}\n#toolbar .cke_toolbar {\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  cursor: default;\n}\n.some-toolbar-active .cke_toolbar {\n  zoom: 1;\n  filter: alpha(opacity=50);\n  -webkit-opacity: 0.5;\n  -moz-opacity: 0.5;\n  opacity: 0.5;\n}\n.cke_toolbar.active {\n  position: relative;\n  zoom: 1;\n  filter: alpha(opacity=100);\n  -webkit-opacity: 1;\n  -moz-opacity: 1;\n  opacity: 1;\n}\n.cke_toolbar.active:after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 0;\n  right: 6px;\n  bottom: 5px;\n  left: 0;\n  -webkit-border-radius: 5px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 5px;\n  -moz-background-clip: padding;\n  border-radius: 5px;\n  background-clip: padding-box;\n  -webkit-box-shadow: 0px 0px 15px 3px #fff4b0;\n  -moz-box-shadow: 0px 0px 15px 3px #fff4b0;\n  box-shadow: 0px 0px 15px 3px #fff4b0;\n}\n.cke_toolbar.active .cke_toolgroup {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  border-color: #e3c300;\n}\n.cke_toolbar.active .cke_combo,\n.cke_toolbar.active .cke_toolgroup {\n  position: relative;\n  z-index: 2;\n}\n.cke_toolbar.active .cke_combo_button {\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.unselectable {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.toolbar {\n  padding: 5px 0;\n  margin-bottom: 2.4em;\n  overflow: hidden;\n  background: #fff;\n}\n.toolbar button.button-a.cke_button {\n  cursor: pointer;\n  display: inline-block;\n  padding: 4px 6px;\n  outline: 0;\n  border: 1px solid #a6a6a6;\n}\n.toolbar button.button-a.hidden {\n  display: none;\n}\n.toolbar button.button-a.left {\n  float: left;\n  margin-right: 8px;\n}\n.toolbar button.button-a.right {\n  float: right;\n  margin-left: 8px;\n}\n.toolbar button.button-a .highlight {\n  color: #ffefc1;\n}\n.configContainer.hidden,\n.toolbarModifier.hidden,\n.toolbarModifier-hints.hidden {\n  display: none;\n}\n.toolbarModifier :focus,\n.toolbar button:focus,\n.configContainer textarea.configCode:focus {\n  outline: none;\n}\ndiv.toolbarModifier {\n  padding: 0;\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n  display: table;\n  border-collapse: collapse;\n}\ndiv.toolbarModifier ::-moz-focus-inner {\n  border: 0;\n}\ndiv.toolbarModifier .empty {\n  display: none;\n}\ndiv.toolbarModifier.empty-visible .empty {\n  display: table-row;\n  zoom: 1;\n  filter: alpha(opacity=60);\n  -webkit-opacity: 0.6;\n  -moz-opacity: 0.6;\n  opacity: 0.6;\n}\ndiv.toolbarModifier .empty > p {\n  line-height: 31px;\n}\ndiv.toolbarModifier > ul {\n  padding: 0;\n  margin: 0;\n  border-top: 1px solid #cccccc;\n  width: 100%;\n}\ndiv.toolbarModifier > ul[data-type=\"table-header\"] {\n  display: table-header-group;\n}\ndiv.toolbarModifier > ul[data-type=\"table-body\"] {\n  display: table-row-group;\n}\ndiv.toolbarModifier > ul p {\n  padding: 0;\n  margin: 0;\n}\ndiv.toolbarModifier > ul > li {\n  display: table-row;\n}\ndiv.toolbarModifier > ul > li[data-type=\"header\"] {\n  font-weight: bold;\n  user-select: none;\n  cursor: default;\n}\ndiv.toolbarModifier > ul > li[data-type=\"group\"],\ndiv.toolbarModifier > ul > li[data-type=\"separator\"] {\n  border-bottom: 1px solid #cccccc;\n}\ndiv.toolbarModifier > ul > li[data-type=\"subgroup\"] {\n  border-top: 1px solid #eee;\n}\ndiv.toolbarModifier > ul > li[data-type=\"subgroup\"]:first-child {\n  border-top: none;\n}\ndiv.toolbarModifier > ul > li[data-type=\"group\"].active,\ndiv.toolbarModifier > ul > li[data-type=\"group\"]:hover,\ndiv.toolbarModifier > ul > li[data-type=\"separator\"].active,\ndiv.toolbarModifier > ul > li[data-type=\"separator\"]:hover {\n  overflow: hidden;\n  z-index: 2;\n}\ndiv.toolbarModifier > ul > li[data-type=\"group\"].active,\ndiv.toolbarModifier > ul > li[data-type=\"separator\"].active,\ndiv.toolbarModifier > ul > li[data-type=\"group\"].active:hover,\ndiv.toolbarModifier > ul > li[data-type=\"separator\"].active:hover {\n  background: #f0fafb;\n}\ndiv.toolbarModifier > ul > li[data-type=\"group\"]:hover,\ndiv.toolbarModifier > ul > li[data-type=\"separator\"]:hover {\n  background: #fffbe3;\n}\ndiv.toolbarModifier > ul > li[data-type=\"separator\"] {\n  background: #f5f5f5;\n}\ndiv.toolbarModifier > ul > li[data-type=\"separator\"]:after {\n  content: '';\n  width: 100%;\n}\ndiv.toolbarModifier > ul > li[data-type=\"separator\"] > p {\n  padding: 2px 5px;\n}\ndiv.toolbarModifier > ul > li > p,\ndiv.toolbarModifier > ul > li > ul {\n  display: table-cell;\n  vertical-align: middle;\n}\ndiv.toolbarModifier > ul > li p {\n  padding-left: 5px;\n  min-width: 200px;\n}\ndiv.toolbarModifier > ul > li p span {\n  white-space: nowrap;\n  cursor: default;\n}\ndiv.toolbarModifier > ul > li p span button {\n  font-size: 12.666px;\n  margin-right: 5px;\n  cursor: pointer;\n  background: #fff;\n  -webkit-border-radius: 5px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 5px;\n  -moz-background-clip: padding;\n  border-radius: 5px;\n  background-clip: padding-box;\n  border: 1px solid #bbb;\n  padding: 0 7px;\n  line-height: 12px;\n  height: 20px;\n}\ndiv.toolbarModifier > ul > li p span button:not(.disabled):hover,\ndiv.toolbarModifier > ul > li p span button:not(.disabled):focus {\n  color: #fff;\n  background-color: #454545;\n  border-color: transparent;\n}\ndiv.toolbarModifier > ul > li p span button.move.disabled {\n  cursor: default;\n  zoom: 1;\n  filter: alpha(opacity=20);\n  -webkit-opacity: 0.2;\n  -moz-opacity: 0.2;\n  opacity: 0.2;\n}\ndiv.toolbarModifier > ul > li ul {\n  border-collapse: collapse;\n  padding: 0;\n  width: 100%;\n}\ndiv.toolbarModifier > ul > li ul li {\n  display: table-row;\n  list-style-type: none;\n  line-height: 1;\n}\ndiv.toolbarModifier > ul > li ul li[data-type=\"subgroup\"] {\n  border-top: 1px solid #dddddd;\n}\ndiv.toolbarModifier > ul > li ul li[data-type=\"subgroup\"]:first-child {\n  border-top: 0;\n}\ndiv.toolbarModifier > ul > li ul li[data-type=\"subgroup\"] [data-type=\"button\"] {\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  padding: 0 2px;\n}\ndiv.toolbarModifier > ul > li ul li[data-type=\"subgroup\"] [data-type=\"button\"]:focus {\n  background: rgba(0, 0, 0, 0.04);\n}\ndiv.toolbarModifier > ul > li ul li[data-type=\"subgroup\"] [data-type=\"button\"] input {\n  vertical-align: middle;\n}\ndiv.toolbarModifier > ul > li ul li > p,\ndiv.toolbarModifier > ul > li ul li > ul {\n  display: table-cell;\n  vertical-align: middle;\n}\ndiv.toolbarModifier > ul > li ul li ul {\n  padding: 0;\n}\ndiv.toolbarModifier > ul > li ul li ul li {\n  padding: 0;\n  display: inline-block;\n  cursor: pointer;\n  margin: 2px 5px 2px 0;\n}\ndiv.toolbarModifier > ul > li ul li ul li .cke_combo_text {\n  cursor: pointer;\n  white-space: nowrap;\n}\ndiv.toolbarModifier > ul > li ul li ul li .cke_toolgroup,\ndiv.toolbarModifier > ul > li ul li ul li .cke_combo_button {\n  cursor: pointer;\n  margin: 0;\n  vertical-align: middle;\n  border: 1px solid #ddd;\n  font-size: 11.41px;\n  font-size: 0.713rem;\n  line-height: 20.54px;\n  line-height: 1.28rem;\n}\ndiv.toolbarModifier > .codemirror-wrapper {\n  overflow-y: auto;\n}\ndiv.toolbarModifier-hints {\n  float: right;\n  width: 350px;\n  min-width: 150px;\n  overflow-y: auto;\n  margin-left: 1.5em;\n}\ndiv.toolbarModifier-hints h3 {\n  font-size: 18.08px;\n  font-size: 1.13rem;\n  line-height: 32.54px;\n  line-height: 2.03rem;\n  padding: 0.36em 1.5em;\n  background: #f5f5f5;\n  border-bottom: 1px solid #dddddd;\n  margin-top: 0;\n  margin-bottom: 1.2em;\n}\ndiv.toolbarModifier-hints dl {\n  margin-bottom: 1.2em;\n  overflow: hidden;\n}\ndiv.toolbarModifier-hints dl .list-header {\n  font-weight: bold;\n  border: 0;\n  padding-bottom: 0.6em;\n}\ndiv.toolbarModifier-hints dl > p {\n  text-align: center;\n}\ndiv.toolbarModifier-hints dl dt {\n  float: left;\n  width: 9em;\n  clear: both;\n  text-align: right;\n  border-top: 1px solid #dddddd;\n  padding-left: 1.5em;\n  padding-right: .1em;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ndiv.toolbarModifier-hints dl dt code {\n  background: none;\n  border: none;\n  vertical-align: middle;\n}\ndiv.toolbarModifier-hints dl dd {\n  margin-left: 10em;\n  clear: right;\n  padding-right: 1.5em;\n}\ndiv.toolbarModifier-hints dl dd code {\n  line-height: 2.2em;\n}\ndiv.toolbarModifier-hints dl dd:after {\n  content: '\\00a0';\n  display: block;\n  clear: left;\n  float: right;\n  height: 0;\n  width: 0;\n}\n.toolbarModifier-hints,\n.configContainer textarea.configCode,\n.CodeMirror {\n  -webkit-border-radius: 3px;\n  -webkit-background-clip: padding-box;\n  -moz-border-radius: 3px;\n  -moz-background-clip: padding;\n  border-radius: 3px;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  font-size: 13.01px;\n  font-size: 0.813rem;\n  line-height: 23.42px;\n  line-height: 1.46rem;\n}\n.configContainer textarea.configCode,\n.CodeMirror pre,\n.CodeMirror-linenumber {\n  font-size: 13.01px;\n  font-size: 0.813rem;\n  line-height: 23.42px;\n  line-height: 1.46rem;\n  font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;\n}\n.CodeMirror pre {\n  border: none;\n  padding: 0;\n  margin: 0;\n}\n.configContainer textarea.configCode {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  color: #575757;\n  padding: 10px;\n  width: 100%;\n  min-height: 500px;\n  margin: 0;\n  resize: none;\n  outline: none;\n  -moz-tab-size: 4;\n  tab-size: 4;\n  white-space: pre;\n  word-wrap: normal;\n  overflow: auto;\n}\n.CodeMirror-hints.toolbar-modifier {\n  padding: 0;\n  color: #575757;\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 25.2px;\n  line-height: 1.57rem;\n  font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;\n}\n.CodeMirror-hints.toolbar-modifier .CodeMirror-hint-active {\n  color: #575757;\n  background: #f0fafb;\n}\n.CodeMirror-hints.toolbar-modifier > li:hover {\n  background: #fffbe3;\n}\n/* Text modifier */\n#toolbarModifierWrapper {\n  margin-bottom: 1.2em;\n}\n#toolbarModifierWrapper .invalid .CodeMirror {\n  background: #fff8f8;\n  border-color: red;\n}\n#toolbarModifierWrapper .CodeMirror {\n  height: auto;\n  padding: 0 0.6em;\n}\n.staticContainer {\n  position: fixed;\n  top: 0;\n  width: 100%;\n  z-index: 10;\n}\n.staticContainer > .grid-container {\n  max-width: 1052px;\n}\n.staticContainer > .grid-container .inner {\n  background: #fff;\n}\n.staticContainer > .grid-container .inner .toolbar {\n  margin-bottom: 0;\n}\n#help {\n  position: relative;\n  top: -15px;\n  left: -5px;\n}\n#help-content {\n  display: none;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2dsb2JhbC9nbG9iYWwubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2NvcmUvY29yZS5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvZ3JpZC9ncmlkLmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvY2tzb3VyY2Utc2FtcGxlcy1mcmFtZXdvcmsvbm9kZV9tb2R1bGVzL2xlc3NoYXQvYnVpbGQvbGVzc2hhdC5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvaGVhZGVyLWEvaGVhZGVyLWEubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL25hdmlnYXRpb24tYS9uYXZpZ2F0aW9uLWEubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL25hdmlnYXRpb24tYi9uYXZpZ2F0aW9uLWIubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2Zvb3Rlci1hL2Zvb3Rlci1hLmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvY2tzb3VyY2Utc2FtcGxlcy1mcmFtZXdvcmsvY29tcG9uZW50cy9jb250ZW50L2NvbnRlbnQubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2J1dHRvbi1hL2J1dHRvbi1hLmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvY2tzb3VyY2Utc2FtcGxlcy1mcmFtZXdvcmsvY29tcG9uZW50cy9iYWxsb29uLWEvYmFsbG9vbi1hLmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvY2tzb3VyY2Utc2FtcGxlcy1mcmFtZXdvcmsvY29tcG9uZW50cy9pY29uL2ljb24ubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL3N3aXRjaC9zd2l0Y2gubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL3RvZ2dsZXIvdG9nZ2xlci5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2Jhc2ljc2FtcGxlL2NvcmUubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2Jhc2ljc2FtcGxlL2Fkam9pbmVkLmxlc3MiLCIuLi8uLi9zYW1wbGVzL2xlc3MvY3VzdG9tLmxlc3MiLCIuLi8uLi9zYW1wbGVzL3Rvb2xiYXJjb25maWd1cmF0b3IvbGVzcy90b29sYmFybW9kaWZpZXIubGVzcyIsIi4uLy4uL3NhbXBsZXMvdG9vbGJhcmNvbmZpZ3VyYXRvci9sZXNzL2Jhc2UubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBc0RBLFFBSGlDO0VBeUNoQztJQUNDLHdCQUFBOzs7QUMxRkY7QUFBUztBQUFPO0FBQVM7QUFBWTtBQUFRO0FBQVE7QUFBUTtBQUFRO0FBQU07QUFBTTtBQUFLO0VBQ3JGLGNBQUE7O0FBR0Q7QUFBTTtFQUNMLFNBQUE7RUFDQSxVQUFBO0VBQ0Esd0JETitCLHVDQ00vQjtFQUNBLGdCQUFBO0VBQ0EsY0FBQTs7QUNIQSxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsVUFBQTs7QUFERCxZQUFZO0VBQ1gsV0FBQTs7QUY0Q0YsUUFIaUM7RUVqQ2hDO0VBS0MsWUFBWTtFQUFaLFlBQVk7RUFBWixZQUFZO0VBQVosWUFBWTtFQUFaLFlBQVk7RUFBWixZQUFZO0VBQVosWUFBWTtFQUFaLFlBQVk7RUFBWixZQUFZO0lBSlosV0FBQTs7O0FBYUYsQ0FBQztFQ3FSQyw4QkFBQTtFQUNBLDJCQUFBO0VBQ0Esc0JBQUE7RURyUkQsZ0JBQUE7RUFDQSxpQkFBQTtFQUNBLFdBQUE7O0FBSUEsQ0FEQSxxQkFDQztBQUFELGVBQUM7QUFBUSxDQURULHFCQUNVO0FBQUQsZUFBQztFQUNULFNBQVMsRUFBVDtFQUNBLGNBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLGNBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTs7QUFLRCxDQURBLHFCQUNDO0FBQUQsZUFBQztFQUNBLFdBQUE7O0FBSUY7RUMyUEUsOEJBQUE7RUFDQSwyQkFBQTtFQUNBLHNCQUFBO0VEM1BELGlCQUFBO0VBQ0Esa0JBQUE7O0FBS0Msc0JBREQsRUFBQyxxQkFDQztFQUNBLGVBQUE7O0FBR0Qsc0JBTEQsRUFBQyxxQkFLQztFQUNBLGdCQUFBOztBRmpCSCxRQUhpQztFRTBCOUIsc0JBREQsRUFBQyxxQkFDQztJQUNBLGdCQUFBOztFQUdELHNCQUxELEVBQUMscUJBS0M7SUFDQSxpQkFBQTs7O0FFN0VKO0VBQ0MsaUJBQUE7RUFHQSxnQkFBQTs7QUFKRCxTQU1DO0VBQ0MsZ0JBQUE7O0FKMENGLFFBSGlDO0VBR2pDLFNJM0NDO0lBSUUsa0JBQUE7OztBQVZILFNBTUMsZUFPQztFQUNDLG1CQUFBOztBQ1ZIO0VBQ0MsWUFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLE1BQUE7RUFDQSxVQUFBO0VBQ0EsZ0JBQUE7O0FMcUNELFFBSGlDO0VBR2pDO0lLbENFLGtCQUFBOzs7QUFYRixhQWNDO0VBQ0MsZ0JBQUE7RUFDQSxTQUFBO0VBQ0EsZ0JBQUE7O0FBakJGLGFBY0MsR0FLQztBQW5CRixhQWNDLEdBS0ssR0FBRztFQUNOLHFCQUFBOztBTHlCSCxRQUhpQztFQUdqQyxhSy9CQztJQVVFLFdBQUE7SUFDQSx1QkFBQTtJQUNBLG1CQUFBO0lBQ0EscUJBQUE7SUFDQSxXQUFBOztFQUVBLGFBaEJGLEdBZ0JHO0VBQVMsYUFoQlosR0FnQmE7SUFDVixhQUFBOzs7QUFLRCxhQXRCRixHQXFCRSxhQUNDO0VBQ0EsZ0JBQUE7O0FMUUosUUFIaUM7RUFHakMsYUsvQkMsR0FxQkUsYUFDQztJQUlDLGdCQUFBOzs7QUFJRixhQTlCRixHQXFCRSxhQVNDO0VBQ0EsaUJBQUE7O0FMQUosUUFIaUM7RUFHakMsYUsvQkMsR0FxQkUsYUFTQztJQUlDLGtCQUFBOzs7QUFNRixhQXhDRixHQXVDQyxHQUNHO0VBQ0QsaUJBQUE7O0FBdkRKLGFBY0MsR0F1Q0MsR0FLQztFTHhDRixlQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VLdUNHLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLGNBQUE7RUFDQSxpQkFBQTtFQUNBLHFCQUFBO0VBQ0EseUJBQUE7O0FBRUEsYUFyREgsR0F1Q0MsR0FLQyxFQVNFO0VBQ0EsZUFBQTtFQUNBLGNBQUE7O0FBUUoseUJBQUM7QUFBUyx5QkFBQztFQUNWLHNCQUFrQixxckJBQWxCOztBQ3BGRjtFQUNDLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxpQkFBQTs7QU5nREQsUUFIaUM7RUFHakM7SU03Q0Usa0JBQUE7SUFDQSxnQkFBQTtJQUdBLFVBQUE7OztBQVZGLGFBYUM7RUFDQyxVQUFBO0VBQ0EsZ0JBQUE7RUFDQSxTQUFBO0VBQ0EsaUJBQUE7O0FBakJGLGFBYUMsR0FNQztBQW5CRixhQWFDLEdBTUssR0FBRztFQUNOLHFCQUFBOztBTitCSCxRQUhpQztFQUdqQyxhTXRDQztJQVdFLGNBQUE7SUFDQSxXQUFBO0lBQ0EscUJBQUE7OztBTnlCSCxRQUhpQztFQUdqQyxhTXRDQyxHQWdCQztJQUVFLGtCQUFBOzs7QUFHRCxhQXJCRixHQWdCQyxHQUtHO0VBQ0QsaUJBQUE7O0FOZ0JKLFFBSGlDO0VBR2pDLGFNdENDLEdBZ0JDLEdBS0c7SUFJQSxjQUFBOzs7QUF0Q0wsYUFhQyxHQWdCQyxHQWFDO0VId1FELDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSxzQkFBQTtFR3hRRSx5QkFBQTtFQUNBLHFCQUFBO0VBQ0EsYUFBQTs7QU5LSixRQUhpQztFQUdqQyxhTXRDQyxHQWdCQyxHQWFDO0lBT0UsV0FBQTtJSHFPSCx3QkFBQTtJQUFpQyxvQ0FBQTtJQUNqQyxxQkFBQTtJQUE4Qiw2QkFBQTtJQUM5QixnQkFBQTtJQUF5Qiw0QkFBQTs7O0FJeFIzQjtFUHdCQyxlQUFBO0VBQ0Esb0JBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VPeEJBLG1CQUFBO0VBQ0Esc0JBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7O0FBTkQsU1A0RUM7RUFDQyxjQUFBO0VBQ0EscUJBQUE7RUFFQSxpQ0FBQTs7QUFFQSxTQU5ELEVBTUU7RUFDQSxjQUFBOztBT25GSCxTQVFDO0VBQ0MsU0FBQTtFQUNBLHFCQUFBO0VBQ0Esa0JBQUE7O0FDWEY7RVJ3QkMsZUFBQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFUXpCQSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EscUJBQUE7O0FBSkQsUUFTQztFQUNDLGdCQUFBOztBQVZGLFFBYUM7QUFiRCxRQWFLO0FBYkwsUUFhUztBQWJULFFBYWM7QUFiZCxRQWEwQixTQUFRLElBQUk7QUFidEMsUUFhd0Q7RUFDdEQsaUJBQUE7O0FBZEYsUUFpQkM7QUFqQkQsUUFpQk87RUxxUUwsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RUtyUXpCLGdCQUFBOztBQW5CRixRQXNCQztBQXRCRCxRQXNCTTtBQXRCTixRQXNCWTtBQXRCWixRQXNCaUI7RUFDZixtQkFBQTs7QUF2QkYsUUEwQkM7QUExQkQsUUEwQmE7RUFDWCxnQkFBQTtFQUNBLDhCQUFBO0VBQ0EscUJBQUE7O0FBN0JGLFFBb0NDLEVSd0NBO0FRNUVELFFBb0NJLEdSd0NIO0FRNUVELFFBb0NRLEdSd0NQO0FRNUVELFFBb0NZLFdSd0NYO0FRNUVELFFBb0N3QixHUndDdkI7QVE1RUQsUUFvQzRCLEdSd0MzQjtBUTVFRCxRQW9DZ0MsR1J3Qy9CO0FRNUVELFFBb0NvQyxHUndDbkM7QVE1RUQsUUFvQ3dDLEdSd0N2QztFQUNDLGNBQUE7RUFDQSxxQkFBQTtFQUVBLGlDQUFBOztBQUVBLFFROUNELEVSd0NBLEVBTUU7QUFBRCxRUTlDRSxHUndDSCxFQU1FO0FBQUQsUVE5Q00sR1J3Q1AsRUFNRTtBQUFELFFROUNVLFdSd0NYLEVBTUU7QUFBRCxRUTlDc0IsR1J3Q3ZCLEVBTUU7QUFBRCxRUTlDMEIsR1J3QzNCLEVBTUU7QUFBRCxRUTlDOEIsR1J3Qy9CLEVBTUU7QUFBRCxRUTlDa0MsR1J3Q25DLEVBTUU7QUFBRCxRUTlDc0MsR1J3Q3ZDLEVBTUU7RUFDQSxjQUFBOztBUW5GSCxRQXdDQztBQXhDRCxRQXdDSztBQXhDTCxRQXdDUztBQXhDVCxRQXdDYTtBQXhDYixRQXdDaUI7RUFDZixXQUFBO0VBQ0EsZ0JBQUE7O0FBMUNGLFFBd0NDLEdBS0M7QUE3Q0YsUUF3Q0ssR0FLSDtBQTdDRixRQXdDUyxHQUtQO0FBN0NGLFFBd0NhLEdBS1g7QUE3Q0YsUUF3Q2lCLEdBS2Y7QUE3Q0YsUUF3Q0MsR0FLTztBQTdDUixRQXdDSyxHQUtHO0FBN0NSLFFBd0NTLEdBS0Q7QUE3Q1IsUUF3Q2EsR0FLTDtBQTdDUixRQXdDaUIsR0FLVDtFQUNMLGtCQUFBOztBQTlDSCxRQXdDQyxHQVVDLEVBQUM7QUFsREgsUUF3Q0ssR0FVSCxFQUFDO0FBbERILFFBd0NTLEdBVVAsRUFBQztBQWxESCxRQXdDYSxHQVVYLEVBQUM7QUFsREgsUUF3Q2lCLEdBVWYsRUFBQztFQUNBLGdCQUFBO0VBQ0Esc0JBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTs7QUFHRCxRQWpCRCxHQWlCRSxNQUNBLEVBQUM7QUFERixRQWpCRyxHQWlCRixNQUNBLEVBQUM7QUFERixRQWpCTyxHQWlCTixNQUNBLEVBQUM7QUFERixRQWpCVyxHQWlCVixNQUNBLEVBQUM7QUFERixRQWpCZSxHQWlCZCxNQUNBLEVBQUM7RUFDQSxVQUFBOztBQUlGLFFBdkJELEdBdUJFLE9BQ0E7QUFERCxRQXZCRyxHQXVCRixPQUNBO0FBREQsUUF2Qk8sR0F1Qk4sT0FDQTtBQURELFFBdkJXLEdBdUJWLE9BQ0E7QUFERCxRQXZCZSxHQXVCZCxPQUNBO0VMOERELDBEQUFBO0VBQ0EsdURBQUE7RUFDQSxxREFBQTtFQUNBLGtEQUFBO0VLL0RFLFVBQUE7O0FBbEVKLFFBdUVDO0FBdkVELFFBdUVRO0FBdkVSLFFBdUVnQixTQUFRLElBQUk7RUwrTTFCLDBCQUFBO0VBQWlDLG9DQUFBO0VBQ2pDLHVCQUFBO0VBQThCLDZCQUFBO0VBQzlCLGtCQUFBO0VBQXlCLDRCQUFBO0VBbUJ6Qix1REFBQTtFQUNBLG9EQUFBO0VBQ0EsK0NBQUE7RUtsT0EsYUFBQTtFQUNBLGNBQUE7RUFFQSx5QkFBQTtFQUNBLGtCQUFBOztBQUVBLFFBVkQsTUFVRTtBQUFELFFBVk0sT0FVTDtBQUFELFFBVmMsU0FBUSxJQUFJLGdCQVV6QjtFQUNBLHFCQUFBO0VBQ0EsVUFBQTtFTHdORCx3RUFBQTtFQUNBLHFFQUFBO0VBQ0EsZ0VBQUE7O0FLN1NGLFFBOEZDO0VBQ0MsOEJBQUE7RUFDQSxlQUFBOztBQWhHRixRQW1HQztFQUNDLGtCQUFBO0VBQ0EsNkJSbkcyQyx3QlFtRzNDO0VSN0VELGVBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTs7QVEzQkQsUUF5R0M7RUFDQyxrQkFBQTs7QUExR0YsUUE2R0M7RVJyRkEsZUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFUW9GQyxtQkFBQTs7QUEvR0YsUUFrSEM7RVIxRkEsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esb0JBQUE7RVF5RkMsaUJBQUE7O0FBcEhGLFFBdUhDO0VSL0ZBLGVBQUE7RUFDQSxpQkFBQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7RVE4RkMsZ0JBQUE7RUFDQSxrQkFBQTs7QUExSEYsUUE2SEM7RVJyR0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esb0JBQUE7RVFvR0MsZ0JBQUE7RUFDQSxrQkFBQTs7QUFoSUYsUUFtSUM7RVIzR0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esb0JBQUE7RVEwR0MsZ0JBQUE7RUFDQSxrQkFBQTs7QUF0SUYsUUF5SUM7RUFDQyxTQUFBO0VBQ0EsNkJBQUE7RUFDQSxlQUFBOztBQUlBLFFBREQsTUFDRTtFQUNBLGFBQUE7RUFDQSxrQkFBQTs7QUFHRCxRQU5ELE1BTUU7RUxpREQsMEJBQUE7RUFDQSx1QkFBQTtFQUNBLGtCQUFBOztBS3hNRixRQTRKQztFUnBJQSxlQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VRbUlDLG9CUjdKOEIsdUNRNko5QjtFQUNBLGdCQUFBO0VMNElBLDBEQUFBO0VBQ0EsdURBQUE7RUFDQSxrREFBQTs7QUs3U0YsUUF1S0MsRUFDQztFQUNDLHNCQUFBOztBQXpLSCxRQXVLQyxFQUtDO0VBQ0MsY0FBQTs7QUE3S0gsUUFpTEM7RUFDQyxVQUFBO0VBQ0EsU0FBQTtFQUVBLFdBQUE7RUFDQSxjQUFBO0VBQ0EsZ0JBQUE7O0FBdkxGLFFBMExDO0FBMUxELFFBMExNO0VSbEtMLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VRa0tDLGdKQUFBOztBQTdMRixRQTBMQyxJQUtDO0FBL0xGLFFBMExNLEtBS0o7RUFDQyxTQUFBOztBQWhNSCxRQXFNQyxJQUFJO0VBQ0gsZUFBQTtFQUNBLGNBQUE7O0FBdk1GLFFBME1DO0VBQ0MsV0FBQTs7QUEzTUYsUUE4TUMsR0FFQztBQWhORixRQThNSyxHQUVIO0FBaE5GLFFBOE1DLEdBRUs7QUFoTk4sUUE4TUssR0FFQztFQUNILGdCQUFBOztBQWpOSCxRQThNQyxHQU1DO0FBcE5GLFFBOE1LLEdBTUg7RVI1TEQsZUFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RUFDQSxvQkFBQTs7QVEzQkQsUUEwTkMsU0FBUSxJQUFJO0VBQ1gsV0FBQTs7QUEzTkYsUUE4TkMsSUFBRztFQUNGLHVCQUFBO0VBQ0EsYUFBQTtFQUNBLHFCQUFBOzs7QUFHQSxRQU5ELElBQUcsS0FNRDtFQUNBLFNBQVMsTUFBVDtFQUNBLGlCQUFBOztBQ2pPRCxJQURELEVBQ0U7QUFBRCxJQURFLE9BQ0Q7QUFBRCxJQURVLE1BQ1Q7RU5pUkQsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RUhoUTFCLGVBQUE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RVNuQkUsWUFBQTtFQUNBLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxtQkFBQTtFQUNBLHFCQUFBO0VBQ0EscUJBQUE7RUFDQSxlQUFBO0VBQ0EsU0FBQTtFQUNBLHNCQUFBO0VBSUEsYUFBQTtFQUdBLHVCQUFBOztBQUVBLElBdkJGLEVBQ0UsU0FzQkM7QUFBRCxJQXZCQyxPQUNELFNBc0JDO0FBQUQsSUF2QlMsTUFDVCxTQXNCQztFQUNBLGtCQUFBOztBQUdELElBM0JGLEVBQ0UsU0EwQkM7QUFBRCxJQTNCQyxPQUNELFNBMEJDO0FBQUQsSUEzQlMsTUFDVCxTQTBCQztFQUNBLG1CQUFBOztBQW9CRCxJQWhERixFQUNFLFNBK0NDO0FBQUQsSUFoREMsT0FDRCxTQStDQztBQUFELElBaERTLE1BQ1QsU0ErQ0M7RU5rT0YsNEJBQUE7RUFBaUMsb0NBQUE7RUFDakMseUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsb0JBQUE7RUFBeUIsNEJBQUE7RU1uUHZCLFdBQUE7RUFDQSxVQUFBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0Esa0JBQUE7O0FBRUEsSUF4Q0gsRUFDRSxTQStDQyxpQkFSQztBQUFELElBeENBLE9BQ0QsU0ErQ0MsaUJBUkM7QUFBRCxJQXhDUSxNQUNULFNBK0NDLGlCQVJDO0VBQ0Esa0JBQUE7RUFDQSxTQUFBO0VBQ0EsUUFBQTtFQUNBLHFCQUFBOztBVEdMLFFBSGlDO0VBR2pDLElTL0NDLEVBQ0UsU0FtREM7RVRMSixJUy9DSSxPQUNELFNBbURDO0VUTEosSVMvQ1ksTUFDVCxTQW1EQztJTjhORiw0QkFBQTtJQUFpQyxvQ0FBQTtJQUNqQyx5QkFBQTtJQUE4Qiw2QkFBQTtJQUM5QixvQkFBQTtJQUF5Qiw0QkFBQTtJTW5QdkIsV0FBQTtJQUNBLFVBQUE7SUFDQSxtQkFBQTtJQUNBLGdCQUFBO0lBQ0Esa0JBQUE7SUFDQSxrQkFBQTs7RUFFQSxJQXhDSCxFQUNFLFNBbURDLDBCQVpDO0VBQUQsSUF4Q0EsT0FDRCxTQW1EQywwQkFaQztFQUFELElBeENRLE1BQ1QsU0FtREMsMEJBWkM7SUFDQSxrQkFBQTtJQUNBLFNBQUE7SUFDQSxRQUFBO0lBQ0EscUJBQUE7O0VBSkQsSUF4Q0gsRUFDRSxTQW1EQywwQkFaQztFQUFELElBeENBLE9BQ0QsU0FtREMsMEJBWkM7RUFBRCxJQXhDUSxNQUNULFNBbURDLDBCQVpDO0lBQ0Esa0JBQUE7SUFDQSxTQUFBO0lBQ0EsUUFBQTtJQUNBLHFCQUFBOzs7QUFjRixJQTFERixFQUNFLFNBeURDO0FBQUQsSUExREMsT0FDRCxTQXlEQztBQUFELElBMURTLE1BQ1QsU0F5REM7QUFDRCxJQTNERixFQUNFLFNBMERDO0FBQUQsSUEzREMsT0FDRCxTQTBEQztBQUFELElBM0RTLE1BQ1QsU0EwREM7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7O0FBR0QsSUFoRUYsRUFDRSxTQStEQztBQUFELElBaEVDLE9BQ0QsU0ErREM7QUFBRCxJQWhFUyxNQUNULFNBK0RDO0VBQ0EscUJBQUE7RUFDQSxVQUFBO0VOcU9GLHlFQUFBO0VBQ0Esc0VBQUE7RUFDQSxpRUFBQTs7QU01TkEsSUE3RUQsRUE2RUU7QUFBRCxJQTdFRSxPQTZFRDtBQUFELElBN0VVLE1BNkVUO0VBQ0EsbUJBQUE7O0FBRUEsSUFoRkYsRUE2RUUsY0FHQztBQUFELElBaEZDLE9BNkVELGNBR0M7QUFBRCxJQWhGUyxNQTZFVCxjQUdDO0FBQ0QsSUFqRkYsRUE2RUUsY0FJQztBQUFELElBakZDLE9BNkVELGNBSUM7QUFBRCxJQWpGUyxNQTZFVCxjQUlDO0VBQ0EsY0FBQTtFQUNBLG1CQUFBOztBQUlGLElBdkZELEVBdUZFO0FBQUQsSUF2RkUsT0F1RkQ7QUFBRCxJQXZGVSxNQXVGVDtBQUFELElBdkZELEVIaURHLGFBeENILEdBZ0JDLEdBYUMsRUFXRTtBR3NDSCxJQXZGRSxPSGlEQSxhQXhDSCxHQWdCQyxHQWFDLEVBV0U7QUdzQ0gsSUF2RlUsTUhpRFIsYUF4Q0gsR0FnQkMsR0FhQyxFQVdFO0VHdUNGLFdBQUE7RUFDQSxtQkFBQTs7QUFFQSxJQTNGRixFQXVGRSxvQkFJQztBQUFELElBM0ZDLE9BdUZELG9CQUlDO0FBQUQsSUEzRlMsTUF1RlQsb0JBSUM7QUFDRCxJQTVGRixFQXVGRSxvQkFLQztBQUFELElBNUZDLE9BdUZELG9CQUtDO0FBQUQsSUE1RlMsTUF1RlQsb0JBS0M7QUFERCxJQTNGRixFSGlERyxhQXhDSCxHQWdCQyxHQWFDLEVBV0UsTUcwQ0Q7QUFBRCxJQTNGQyxPSGlEQSxhQXhDSCxHQWdCQyxHQWFDLEVBV0UsTUcwQ0Q7QUFBRCxJQTNGUyxNSGlEUixhQXhDSCxHQWdCQyxHQWFDLEVBV0UsTUcwQ0Q7QUFDRCxJQTVGRixFSGlERyxhQXhDSCxHQWdCQyxHQWFDLEVBV0UsTUcyQ0Q7QUFBRCxJQTVGQyxPSGlEQSxhQXhDSCxHQWdCQyxHQWFDLEVBV0UsTUcyQ0Q7QUFBRCxJQTVGUyxNSGlEUixhQXhDSCxHQWdCQyxHQWFDLEVBV0UsTUcyQ0Q7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7O0FDaEdKO0VWc0JDLGVBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RUcyUEMsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RU9uUjFCLGdDQUFBO0VBRUEsbUJBQUE7RUFDQSxxQkFBQTtFQUNBLG1CQUFBO0VBQ0Esd0JBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EsYUFBQTtFQUNBLG9CQUFBO0VBQ0EsY0FBQTs7QUFFQSxVQUFDO0VBQ0EsY0FBQTs7QUFHRCxVQUFDO0VBQ0EsU0FBUyxFQUFUO0VBQ0EsUUFBQTtFQUNBLFNBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBOztBQU1ELGFBQUM7QUFBRCxhQUFDO0VBQ0EsVUFBQTtFQUNBLDhCQUFBO0VBQ0EseURBQUE7O0FBTUQsYUFBQztBQUFELGFBQUM7RUFDQSxhQUFBO0VBQ0EsOEJBQUE7RUFDQSx5REFBQTs7QUFNRCxhQUFDO0FBQUQsYUFBQztFQUNBLFVBQUE7O0FBTUQsYUFBQztBQUFELGFBQUM7RUFDQSxXQUFBOztBQ3ZERixjQUFjO0FBQ2QsZUFBZTtFQUNkLFNBQVMsRUFBVDtFQUNBLHFCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBOztBQUdELGNBQWM7RUFDYixrQkFBQTs7QUFHRCxlQUFlO0VBQ2QsaUJBQUE7O0FBSUEsY0FBQztBQUFTLGNBQUM7RUFDVixzQkFBa0IsNmNBQWxCOztBQUtELG1CQUFDO0FBQVMsbUJBQUM7RUFDVixzQkFBa0IsNmlCQUFsQjs7QUFLRCxXQUFDO0FBQVMsV0FBQztFQUNWLHNCQUFrQiw2aUJBQWxCOztBQzVCRixJQUFLLFFBRUo7RUFDQyxzQkFBQTs7QUFIRixJQUFLLFFBTUosTUFBSztFQUNKLGdCQUFBO0VBQ0EscUJBQUE7O0FBUkYsSUFBSyxRQVdKO0VBQ0MseUJBQUE7RUFDQSwwQkFBQTs7QUFFQSxJQWZHLFFBV0osTUFJRTtFQUNBLFdBQUE7O0FBR0QsSUFuQkcsUUFXSixNQVFFO0VBQ0EsWUFBQTs7QUFwQkgsSUFBSyxRQXdCSjtFQUNDLGFBQUE7O0FBSUY7RVpaQyxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VZV0EsaUJBQUE7RUFDQSx5QkFBQTtFQUNBLGdCQUFBO0VBQ0EscUJBQUE7RUFDQSxzQkFBQTtFQUNBLFdBQUE7RVQyT0MsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RVMzTzFCLGtCQUFBOztBQVRELE9BV0MsTUFBSztFQUNKLGFBQUE7O0FBWkYsT0FlQztFQUNDLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7O0FBRUEsT0FQRCxNQU9FO0VBQ0EsMEJBQUE7O0FBdkJILE9BMkJDO0VBQ0MsV0FBQTtFQUNBLHNCQUFBO0VBQ0EsYUFBQTtFQUNBLGNBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RVRpTkEsNEJBQUE7RUFBaUMsb0NBQUE7RUFDakMseUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsb0JBQUE7RUFBeUIsNEJBQUE7O0FTcFAzQixPQTJCQyxjQVNDO0VBQ0MsZ0JBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RUFDQSxhQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VUd01ELDRCQUFBO0VBQWlDLG9DQUFBO0VBQ2pDLHlCQUFBO0VBQThCLDZCQUFBO0VBQzlCLG9CQUFBO0VBQXlCLDRCQUFBOztBU3ZNeEIsT0FsQkYsY0FTQyxTQVNFO0VBQ0EsU0FBUyxFQUFUO0VBQ0EsY0FBQTtFQUNBLGtCQUFBO0VBQ0EsTUFBQTtFQUNBLFFBQUE7RUFDQSxXQUFBO0VBQ0EsT0FBQTtFQUVBLHlCQUFBO0VUc0tGLHdDQUFBO0VBQ0Esb0NBQUE7RUFDQSxnQ0FBQTtFQUtBLHlDQUFBO0VBQThDLG9DQUFBO0VBQzlDLHFDQUFBO0VBQTBDLDZCQUFBO0VBQzFDLGlDQUFBO0VBQXNDLDRCQUFBOztBU3ZLdkMsT0FBQyxNQUNBLGNBQWMsU0FBUTtFQUNyQixtQkFBQTs7QUFoRUgsT0FvRUMsTUFBSyxjQUFnQixRQUVwQixnQkFBZ0I7RUFDZixpQkFBQTs7QUF2RUgsT0FvRUMsTUFBSyxjQUFnQixRQVNwQixRQUFPO0VBQ04sc0JBQUE7RUFDQSxzQkFBQTs7QUEvRUgsT0FtRkMsTUFBSyxjQUFnQixRQUFTLFFBQU87RUFDcEMscUJBQUE7RUFDQSxxQkFBQTs7QUN6SEY7RVZrM0JFLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxxQkFBQTtFQUNBLGlCQUFBOztBVXIzQkYsUUFHQztFQUNDLGVBQUE7O0FBSkYsUUFNQztFQUNDLGdCQUFBOztBQVBGLFFBVUM7RUFDQyxhQUFBOztBQUdELFFBQUMsVUFDQTtFQUNDLGFBQUE7O0FBRkYsUUFBQyxVQUtBO0VBQ0MsZ0JBQUE7O0FBS0g7RUFDQyxnQkFBQTs7QUFFQSxrQkFBQztFQUNBLFNBQUE7O0FBTUQsc0JBQUM7QUFBRCx1QkFBQztBQUFTLHNCQUFDO0FBQUQsdUJBQUM7RUFDVixzQkFBa0IseXNCQUFsQjs7QUFJQSxzQkFEQSxXQUNDO0FBQUQsdUJBREEsV0FDQztBQUFTLHNCQURWLFdBQ1c7QUFBRCx1QkFEVixXQUNXO0VBQ1Ysc0JBQWtCLHF0QkFBbEI7O0FBTUYsc0JBQUM7QUFDRCxzQkFBQztFQUNBLDZCQUFBOztBQUtELHVCQUFDO0FBQ0QsdUJBQUM7RUFDQSxnQ0FBQTs7QUN0REY7RUFDQyxhQUFBO0VBQ0Esa0JBQUE7RUFDQSx1QkFBQTtFQUNBLGdCQUFBO0VYNFNDLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSxzQkFBQTtFV3pTRCxxQkFBQTtFQUNBLG1CQUFBO0VYZ3ZCQyx3Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsbUNBQUE7RUFDQSxvQ0FBQTtFQUNBLGdDQUFBOztBV2p2QkQsTUFBQztFWHVRQSw0QkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx5QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixvQkFBQTtFQUF5Qiw0QkFBQTtFV3ZRekIsZUFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0Esa0JBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxrQkFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7O0FDekJGLElBQUs7QUFDTCxNQUFPO0FBQ1AsYUFBYztBQUNkLE1BQU87RUFDTixnQkFBQTs7QUFJRDtFQUNDLGdCQUFBOztBQUdEO0VBQ0MsNkJBQUE7O0FDWEEsU0FBQztFQUNBLHlCQUFBO0VBQ0EsV0FBQTs7QUFGRCxTQUFDLElBSUEsU0FDQztBQUxGLFNBQUMsSUFJQSxTQUNLO0FBTE4sU0FBQyxJQUlBLFNBQ1M7QUFMVixTQUFDLElBSUEsU0FDYTtBQUxkLFNBQUMsSUFJQSxTQUNpQjtFQUNmLFdBQUE7O0FBTkgsU0FBQyxJQUlBLFNBS0M7RWhCWUYsZUFBQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFZ0JiRyxnQkFBQTs7QUFYSCxTQUFDLElBSUEsU0FLQyxFQUlDO0VBQ0MscUJBQUE7RUFDQSw4QkFBQTtFQUNBLGNBQUE7O0FBRUEsU0FsQkgsSUFJQSxTQUtDLEVBSUMsRUFLRTtFQUNBLGNBQUE7O0FBbkJMLFNBQUMsSUFJQSxTQW9CQztFQUNDLFdBQUE7O0FBekJILFNBQUMsSUFJQSxTQXdCQztFQUNDLFdBQUE7O0FBN0JILFNBQUMsSUFJQSxTQTRCQztFQUNDLGtCQUFBO0VBQ0EsY0FBQTs7QUFLSCxTQUFDO0VBQ0Esa0JBQUE7O0FBRUEsU0FIQSxPQUdDO0VBQ0EsV0FBQTtFQUNBLFNBQVMsRUFBVDtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxNQUFBO0VBQ0EsT0FBQTtFQUNBLFFBQUE7RUFDQSxXQUFBOztBQ3hESCxJQUFLO0FBQ0wsTUFBTztBQUNQLGFBQWM7QUFDZCxNQUFPO0VBQ04saUJBQUE7O0FBR0QsSUFBSyxnQkFBZTtFQUNuQixlQUFBOztBQUdEO0VBQ0MsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsaUJBQUE7O0FBSEQsT0FNQztFQUVDLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLFVBQUE7RUFDQSxtQkFBQTtFQUdBLG1CQUFBO0VBQ0EsNEJBQUE7O0FBRUEsT0FYRCxXQVdFO0VBQ0EseURBQUE7O0FBS0gsUUFBUztFQUNSLGdCQUFBO0VBQ0EsU0FBQTtFQUNBLHdCQUFBOztBQUVBLFFBTFEsbUJBS1A7RUFDQSxZQUFBOztBQUtGLEtBQU07RUFDTCxnQkFBQTtFQUNBLGNBQUE7RUFDQSwwQkFBQTs7QUFJRCxHQUFHLElBQUssRUFBQztBQUNULEdBQUcsSUFBSztFQUNQLG1CQUFBOztBQUVBLEdBSkUsSUFBSyxFQUFDLFdBSVA7QUFBRCxHQUhFLElBQUssa0JBR047RUFDQSxnQ0FBQTs7QUFJRixLQUFNLGNBQWE7RUFDbEIsYUFBQTs7QUFJQSxRQURRLGNBQ1A7RUFDQSxhQUFBOztBQUZGLFFBQVMsY0FLUjtFQUNDLGFBQUE7O0FBSUYsUUFDQztFQUNDLGlCQUFBOztBQUlGO0VBQ0MsaUJBQUE7O0FBREQsU0FHQztFQUNDLFdBQUE7RUFDQSxpQkFBQTs7QUFMRixTQUdDLE1BSUM7RUFDQyxnQkFBQTs7QUFFQSxTQVBGLE1BSUMsU0FHRTtFQUNBLHVCQUFBO0VBQ0EsV0FBQTs7QUFGRCxTQVBGLE1BSUMsU0FHRSxNQUlBO0VBQ0MsMEJBQUE7O0FBZkwsU0FHQyxNQWlCQztFQUNDLFdBQUE7RUFDQSxhQUFBOztBQUdELFNBdEJELE1Bc0JFO0VBQ0EsZ0JBQUE7O0FBS0g7RUFDQyxnQkFBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0Esd0JBQUE7O0FBRUEsdUJBQUM7RUFDQSxZQUFBO0VBQ0EsVUFBQTs7QUFLRjtFQUNDLGlCQUFBOztBQURELE1BR0MsSUFBRztFQUNGLGlCQUFBOztBQUpGLE1BT0M7RUFDQyxpQkFBQTs7QUFSRixNQU9DLGNBR0M7RUFDQyxpQkFBQTs7QUFYSCxNQU9DLGNBT0M7RUFFQyxrQkFBQTs7QUFoQkgsTUFvQkM7RUFDQyxrQkFBQTtFQUNBLFNBQUE7RUFFQSxTQUFBO0VBQ0Esa0JBQUE7O0FqQmhHRixRQUhpQztFQUdqQyxNaUIyRkM7SUFVRSxVQUFBO0lBQ0EsaUJBQUE7SUFFQSxVQUFBO0lBQ0EsbUJBQUE7O0VBRUEsTUFoQkYsV0FnQkc7SUFDQSxVQUFBO0lBQ0EsV0FBQTs7O0FqQjdHSixRQUhpQztFQUdqQyxNaUIyRkM7SUF3QkUsYUFBQTs7O0FDeEpILFFBQVM7RUFDUixvQkFBQTtFZm0yQkMseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7RWVwMkJELGVBQUE7O0FBSUQsb0JBQXFCO0VmNmVsQixPQUFBO0VBQVMseUJBQUE7RUFDVixvQkFBQTtFQUNBLGlCQUFBO0VBQ0EsWUFBQTs7QWU1ZUYsWUFBWTtFQUNYLGtCQUFBO0Vmd2VFLE9BQUE7RUFBUywwQkFBQTtFQUNWLGtCQUFBO0VBQ0EsZUFBQTtFQUNBLFVBQUE7O0FldGVELFlBTlcsT0FNVjtFQUNBLFNBQVMsRUFBVDtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLE1BQUE7RUFDQSxVQUFBO0VBQ0EsV0FBQTtFQUNBLE9BQUE7RWZnUEEsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RUFtQnpCLDRDQUFBO0VBQ0EseUNBQUE7RUFDQSxvQ0FBQTs7QWVwUkYsWUFBWSxPQWtCWDtFZmdRQyx3QkFBQTtFQUNBLHFCQUFBO0VBQ0EsZ0JBQUE7RWVoUUEscUJBQUE7O0FBcEJGLFlBQVksT0F1Qlg7QUF2QkQsWUFBWSxPQXdCWDtFQUNDLGtCQUFBO0VBQ0EsVUFBQTs7QUExQkYsWUFBWSxPQTZCWDtFZnFQQyx3QkFBQTtFQUNBLHFCQUFBO0VBQ0EsZ0JBQUE7O0FlbFBGO0VmdXpCRSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTs7QWV2ekJGO0VBQ0MsY0FBQTtFQUNBLG9CQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTs7QUFHQyxRQURELE9BQU0sU0FDSjtFQUNBLGVBQUE7RUFFQSxxQkFBQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLHlCQUFBOztBQUdELFFBVkQsT0FBTSxTQVVKO0VBQ0EsYUFBQTs7QUFHRCxRQWRELE9BQU0sU0FjSjtFQUNBLFdBQUE7RUFDQSxpQkFBQTs7QUFHRCxRQW5CRCxPQUFNLFNBbUJKO0VBQ0EsWUFBQTtFQUNBLGdCQUFBOztBQTNCSCxRQU1DLE9BQU0sU0F3Qkw7RUFDQyxjQUFBOztBQU1ILGdCQUFnQjtBQUNoQixnQkFBZ0I7QUFDaEIsc0JBQXNCO0VBQ3JCLGFBQUE7O0FBR0QsZ0JBQWlCO0FBQ2pCLFFBQVMsT0FBTTtBQUNmLGdCQUFpQixTQUFRLFdBQVc7RUFDbkMsYUFBQTs7QUFHRCxHQUFHO0VBQ0YsVUFBQTtFQUNBLGdCQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFQUNBLHlCQUFBOztBQU5ELEdBQUcsZ0JBUUY7RUFDQyxTQUFBOztBQVRGLEdBQUcsZ0JBWUY7RUFDQyxhQUFBOztBQUdELEdBaEJFLGdCQWdCRCxjQUFlO0VBQ2Ysa0JBQUE7RWZrWUMsT0FBQTtFQUFTLHlCQUFBO0VBQ1Ysb0JBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7O0FldFpGLEdBQUcsZ0JBdUJGLE9BQU87RUFDTixpQkFBQTs7QUFJRCxHQTVCRSxnQkE0QkE7RUFDRCxVQUFBO0VBQ0EsU0FBQTtFQUNBLDZCQUFBO0VBQ0EsV0FBQTs7QUFFQSxHQWxDQyxnQkE0QkEsS0FNQTtFQUNBLDJCQUFBOztBQUdELEdBdENDLGdCQTRCQSxLQVVBO0VBQ0Esd0JBQUE7O0FBWEYsR0E1QkUsZ0JBNEJBLEtBZUQ7RUFDQyxVQUFBO0VBQ0EsU0FBQTs7QUFJRCxHQWpEQyxnQkE0QkEsS0FxQkM7RUFDRCxrQkFBQTs7QUFFQSxHQXBEQSxnQkE0QkEsS0FxQkMsS0FHQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBOztBQUdELEdBMURBLGdCQTRCQSxLQXFCQyxLQVNBO0FBQ0QsR0EzREEsZ0JBNEJBLEtBcUJDLEtBVUE7RUFDQSxnQ0FBQTs7QUFHRCxHQS9EQSxnQkE0QkEsS0FxQkMsS0FjQTtFQUNBLDBCQUFBOztBQUVBLEdBbEVELGdCQTRCQSxLQXFCQyxLQWNBLHNCQUdDO0VBQ0EsZ0JBQUE7O0FBSUYsR0F2RUEsZ0JBNEJBLEtBcUJDLEtBc0JBLG1CQUFtQjtBQUNwQixHQXhFQSxnQkE0QkEsS0FxQkMsS0F1QkEsbUJBQW1CO0FBQ3BCLEdBekVBLGdCQTRCQSxLQXFCQyxLQXdCQSx1QkFBdUI7QUFDeEIsR0ExRUEsZ0JBNEJBLEtBcUJDLEtBeUJBLHVCQUF1QjtFQUN2QixnQkFBQTtFQUNBLFVBQUE7O0FBR0QsR0EvRUEsZ0JBNEJBLEtBcUJDLEtBOEJBLG1CQUFtQjtBQUNwQixHQWhGQSxnQkE0QkEsS0FxQkMsS0ErQkEsdUJBQXVCO0FBQ3hCLEdBakZBLGdCQTRCQSxLQXFCQyxLQWdDQSxtQkFBbUIsT0FBTztBQUMzQixHQWxGQSxnQkE0QkEsS0FxQkMsS0FpQ0EsdUJBQXVCLE9BQU87RUFDOUIsbUJBQUE7O0FBR0QsR0F0RkEsZ0JBNEJBLEtBcUJDLEtBcUNBLG1CQUFtQjtBQUNwQixHQXZGQSxnQkE0QkEsS0FxQkMsS0FzQ0EsdUJBQXVCO0VBQ3ZCLG1CQUFBOztBQUdELEdBM0ZBLGdCQTRCQSxLQXFCQyxLQTBDQTtFQU1BLG1CQUFBOztBQUxBLEdBNUZELGdCQTRCQSxLQXFCQyxLQTBDQSx1QkFDQztFQUNBLFNBQVMsRUFBVDtFQUNBLFdBQUE7O0FBS0QsR0FuR0QsZ0JBNEJBLEtBcUJDLEtBMENBLHVCQVFFO0VBQ0QsZ0JBQUE7O0FBSUYsR0F4R0EsZ0JBNEJBLEtBcUJDLEtBdURDO0FBQUssR0F4R1AsZ0JBNEJBLEtBcUJDLEtBdURRO0VBQ1IsbUJBQUE7RUFDQSxzQkFBQTs7QUF6REYsR0FqREMsZ0JBNEJBLEtBcUJDLEtBNkREO0VBQ0MsaUJBQUE7RUFDQSxnQkFBQTs7QUEvREYsR0FqREMsZ0JBNEJBLEtBcUJDLEtBNkRELEVBSUM7RUFDQyxtQkFBQTtFQUNBLGVBQUE7O0FBbkVILEdBakRDLGdCQTRCQSxLQXFCQyxLQTZERCxFQUlDLEtBSUM7RUFDQyxtQkFBQTtFQUNBLGlCQUFBO0VBQ0EsZUFBQTtFQUNBLGdCQUFBO0VmNkNKLDBCQUFBO0VBQWlDLG9DQUFBO0VBQ2pDLHVCQUFBO0VBQThCLDZCQUFBO0VBQzlCLGtCQUFBO0VBQXlCLDRCQUFBO0VlN0NyQixzQkFBQTtFQUNBLGNBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7O0FBR0MsR0FsSUosZ0JBNEJBLEtBcUJDLEtBNkRELEVBSUMsS0FJQyxPQVdFLElBQUksV0FDSDtBQUNELEdBbklKLGdCQTRCQSxLQXFCQyxLQTZERCxFQUlDLEtBSUMsT0FXRSxJQUFJLFdBRUg7RUFDQSxXQUFBO0VBQ0EseUJBQUE7RUFDQSx5QkFBQTs7QUFJRixHQTFJSCxnQkE0QkEsS0FxQkMsS0E2REQsRUFJQyxLQUlDLE9Bb0JFLEtBQUs7RUFDTCxlQUFBO0Vmd1FKLE9BQUE7RUFBUyx5QkFBQTtFQUNWLG9CQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBOztBZXJXQSxHQWpEQyxnQkE0QkEsS0FxQkMsS0FrR0Q7RUFDQyx5QkFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBOztBQXJHRixHQWpEQyxnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQztFQUNDLGtCQUFBO0VBQ0EscUJBQUE7RUFHQSxjQUFBOztBQUVBLEdBaEtGLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBT0U7RUFDQSw2QkFBQTs7QUFFQSxHQW5LSCxnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQU9FLHNCQUdDO0VBQ0EsYUFBQTs7QUFKRixHQWhLRixnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQU9FLHNCQU9BO0VmQUosMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RWVBcEIsY0FBQTs7QUFFQSxHQTNLSixnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQU9FLHNCQU9BLHFCQUlFO0VBQ0EsK0JBQUE7O0FBWkgsR0FoS0YsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0FPRSxzQkFPQSxxQkFRQztFQUNDLHNCQUFBOztBQUtILEdBckxGLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBNEJHO0FBQUssR0FyTFQsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0E0QlU7RUFDUixtQkFBQTtFQUNBLHNCQUFBOztBQXRJSixHQWpEQyxnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQWtDQztFQUNDLFVBQUE7O0FBM0lKLEdBakRDLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBa0NDLEdBSUM7RUFDQyxVQUFBO0VBQ0EscUJBQUE7RUFDQSxlQUFBO0VBQ0EscUJBQUE7O0FBbEpMLEdBakRDLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBa0NDLEdBSUMsR0FPQztFQUNDLGVBQUE7RUFDQSxtQkFBQTs7QUF2Sk4sR0FqREMsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0FrQ0MsR0FJQyxHQVlDO0FBMUpMLEdBakRDLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBa0NDLEdBSUMsR0FhQztFQUNDLGVBQUE7RUFDQSxTQUFBO0VBQ0Esc0JBQUE7RUFDQSxzQkFBQTtFQ2xTUCxrQkFBQTtFQUNBLG1CQUFBO0VBRUEsb0JBQUE7RUFDQSxvQkFBQTs7QUR3U0EsR0ExTkUsZ0JBME5BO0VBQ0QsZ0JBQUE7O0FBSUQsR0EvTkUsZ0JBK05EO0VBQ0EsWUFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7O0FBTEQsR0EvTkUsZ0JBK05ELE1BT0E7RUN4VEQsa0JBQUE7RUFDQSxrQkFBQTtFQUVBLG9CQUFBO0VBQ0Esb0JBQUE7RURzVEUscUJBQUE7RUFDQSxtQkFBQTtFQUNBLGdDQUFBO0VBQ0EsYUFBQTtFQUNBLG9CQUFBOztBQWJGLEdBL05FLGdCQStORCxNQWdCQTtFQUVDLG9CQUFBO0VBQ0EsZ0JBQUE7O0FBbkJGLEdBL05FLGdCQStORCxNQWdCQSxHQUtDO0VBQ0MsaUJBQUE7RUFDQSxTQUFBO0VBQ0EscUJBQUE7O0FBR0QsR0ExUEEsZ0JBK05ELE1BZ0JBLEdBV0c7RUFDRCxrQkFBQTs7QUE1QkgsR0EvTkUsZ0JBK05ELE1BZ0JBLEdBZUM7RUFDQyxXQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxpQkFBQTtFQUNBLDZCQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFZmxFRiw4QkFBQTtFQUNBLDJCQUFBO0VBQ0Esc0JBQUE7O0FlMEJELEdBL05FLGdCQStORCxNQWdCQSxHQWVDLEdBVUM7RUFDQyxnQkFBQTtFQUNBLFlBQUE7RUFDQSxzQkFBQTs7QUE1Q0osR0EvTkUsZ0JBK05ELE1BZ0JBLEdBZ0NDO0VBQ0MsaUJBQUE7RUFDQSxZQUFBO0VBQ0Esb0JBQUE7O0FBbkRILEdBL05FLGdCQStORCxNQWdCQSxHQWdDQyxHQUtDO0VBQ0Msa0JBQUE7O0FBR0QsR0F4UkQsZ0JBK05ELE1BZ0JBLEdBZ0NDLEdBU0U7RUFDQSxTQUFTLE9BQVQ7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxTQUFBO0VBQ0EsUUFBQTs7QUFPTDtBQUNBLGdCQUFpQixTQUFRO0FBQ3pCO0VmaElFLDBCQUFBO0VBQWlDLG9DQUFBO0VBQ2pDLHVCQUFBO0VBQThCLDZCQUFBO0VBQzlCLGtCQUFBO0VBQXlCLDRCQUFBO0VlZ0kxQixzQkFBQTtFQzNYQSxrQkFBQTtFQUNBLG1CQUFBO0VBRUEsb0JBQUE7RUFDQSxvQkFBQTs7QUQyWEQsZ0JBQWlCLFNBQVE7QUFDekIsV0FBWTtBQUNaO0VDallDLGtCQUFBO0VBQ0EsbUJBQUE7RUFFQSxvQkFBQTtFQUNBLG9CQUFBO0VEK1hBLGdKQUFBOztBQUdELFdBQVk7RUFDWCxZQUFBO0VBQ0EsVUFBQTtFQUNBLFNBQUE7O0FBR0QsZ0JBQWlCLFNBQVE7RWZ2SHZCLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSxzQkFBQTtFZXVIRCxjQUFBO0VBQ0EsYUFBQTtFQUNBLFdBQUE7RUFDQSxpQkFBQTtFQUNBLFNBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGdCQUFBO0VBQ0EsV0FBQTtFQUNBLGdCQUFBO0VBQ0EsaUJBQUE7RUFDQSxjQUFBOztBQUdELGlCQUFpQjtFQUNoQixVQUFBO0VBQ0EsY0FBQTtFQzlaQSxlQUFBO0VBQ0EsbUJBQUE7RUFFQSxtQkFBQTtFQUNBLG9CQUFBO0VEa2FBLGdKQUFBOztBQVZELGlCQUFpQixpQkFJaEI7RUFDQyxjQUFBO0VBQ0EsbUJBQUE7O0FBTUQsaUJBWmdCLGlCQVlkLEtBQUk7RUFDTCxtQkFBQTs7O0FBS0Y7RUFDQyxvQkFBQTs7QUFERCx1QkFHQyxTQUFTO0VBQ1IsbUJBQUE7RUFDQSxpQkFBQTs7QUFMRix1QkFRQztFQUVDLFlBQUE7RUFHQSxnQkFBQTs7QUFJRjtFQUNDLGVBQUE7RUFDQSxNQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7O0FBSkQsZ0JBTUM7RUFDQyxpQkFBQTs7QUFQRixnQkFNQyxrQkFHQztFQUNDLGdCQUFBOztBQVZILGdCQU1DLGtCQUdDLE9BR0M7RUFDQyxnQkFBQTs7QUFPSjtFQUNDLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLFVBQUE7O0FBRUEsS0FBQztFQUNBLGFBQUEifQ== */\n"
  },
  {
    "path": "assets/ckeditor/samples/index.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>CKEditor Sample</title>\n\t<script src=\"../ckeditor.js\"></script>\n\t<script src=\"js/sample.js\"></script>\n\t<link rel=\"stylesheet\" href=\"css/samples.css\">\n\t<link rel=\"stylesheet\" href=\"toolbarconfigurator/lib/codemirror/neo.css\">\n</head>\n<body id=\"main\">\n\n<nav class=\"navigation-a\">\n\t<div class=\"grid-container\">\n\t\t<ul class=\"navigation-a-left grid-width-70\">\n\t\t\t<li><a href=\"http://ckeditor.com\">Project Homepage</a></li>\n\t\t\t<li><a href=\"http://dev.ckeditor.com/\">I found a bug</a></li>\n\t\t\t<li><a href=\"http://github.com/ckeditor/ckeditor-dev\" class=\"icon-pos-right icon-navigation-a-github\">Fork CKEditor on GitHub</a></li>\n\t\t</ul>\n\t\t<ul class=\"navigation-a-right grid-width-30\">\n\t\t\t<li><a href=\"http://ckeditor.com/blog-list\">CKEditor Blog</a></li>\n\t\t</ul>\n\t</div>\n</nav>\n\n<header class=\"header-a\">\n\t<div class=\"grid-container\">\n\t\t<h1 class=\"header-a-logo grid-width-30\">\n\t\t\t<a href=\"index.html\"><img src=\"img/logo.png\" alt=\"CKEditor Sample\"></a>\n\t\t</h1>\n\n\t\t<nav class=\"navigation-b grid-width-70\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"index.html\" class=\"button-a button-a-background\">Start</a></li>\n\t\t\t\t<li><a href=\"toolbarconfigurator/index.html\" class=\"button-a\">Toolbar configurator <span class=\"balloon-a balloon-a-nw\">Edit your toolbar now!</span></a></li>\n\t\t\t</ul>\n\t\t</nav>\n\t</div>\n</header>\n\n<main>\n\t<div class=\"adjoined-top\">\n\t\t<div class=\"grid-container\">\n\t\t\t<div class=\"content grid-width-100\">\n\t\t\t\t<h1>Congratulations!</h1>\n\t\t\t\t<p>\n\t\t\t\t\tIf you can see CKEditor below, it means that the installation succeeded.\n\t\t\t\t\tYou can now try out your new editor version, see its features, and when you are ready to move on, check some of the <a href=\"#sample-customize\">most useful resources</a> recommended below.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"adjoined-bottom\">\n\t\t<div class=\"grid-container\">\n\t\t\t<div class=\"grid-width-100\">\n\t\t\t\t<div id=\"editor\">\n\t\t\t\t\t<h1>Hello world!</h1>\n\t\t\t\t\t<p>I'm an instance of <a href=\"http://ckeditor.com\">CKEditor</a>.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"grid-container\">\n\t\t<div class=\"content grid-width-100\">\n\t\t\t<section id=\"sample-customize\">\n\t\t\t\t<h2>Customize Your Editor</h2>\n\t\t\t\t<p>Modular build and <a href=\"http://docs.ckeditor.com/#!/guide/dev_configuration\">numerous configuration options</a> give you nearly endless possibilities to customize CKEditor. Replace the content of your <code><a href=\"../config.js\">config.js</a></code> file with the following code and refresh this page (<strong>remember to clear the browser cache</strong>)!</p>\n\t\t<pre class=\"cm-s-neo CodeMirror\"><code><span style=\"padding-right: 0.1px;\"><span class=\"cm-variable\">CKEDITOR</span>.<span class=\"cm-property\">editorConfig</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>( <span class=\"cm-def\">config</span> ) {</span>\n<span style=\"padding-right: 0.1px;\"><span class=\"cm-tab\">\t</span><span class=\"cm-variable-2\">config</span>.<span class=\"cm-property\">language</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">'es'</span>;</span>\n<span style=\"padding-right: 0.1px;\"><span class=\"cm-tab\">\t</span><span class=\"cm-variable-2\">config</span>.<span class=\"cm-property\">uiColor</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">'#F7B42C'</span>;</span>\n<span style=\"padding-right: 0.1px;\"><span class=\"cm-tab\">\t</span><span class=\"cm-variable-2\">config</span>.<span class=\"cm-property\">height</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">300</span>;</span>\n<span style=\"padding-right: 0.1px;\"><span class=\"cm-tab\">\t</span><span class=\"cm-variable-2\">config</span>.<span class=\"cm-property\">toolbarCanCollapse</span> <span class=\"cm-operator\">=</span> <span class=\"cm-atom\">true</span>;</span>\n<span style=\"padding-right: 0.1px;\">};</span></code></pre>\n\t\t\t</section>\n\n\t\t\t<section>\n\t\t\t\t<h2>Toolbar Configuration</h2>\n\t\t\t\t<p>If you want to reorder toolbar buttons or remove some of them, check <a href=\"toolbarconfigurator/index.html\">this handy tool</a>!</p>\n\t\t\t</section>\n\n\t\t\t<section>\n\t\t\t\t<h2>More Samples!</h2>\n\t\t\t\t<p>Visit the <a href=\"http://sdk.ckeditor.com\">CKEditor SDK</a> for a huge collection of samples showcasing editor features, with source code readily available to copy and use in your own implementation.</p>\n\t\t\t</section>\n\n\t\t\t<section>\n\t\t\t\t<h2>Developer's Guide</h2>\n\t\t\t\t<p>The most important resource for all developers working with CKEditor, integrating it with their websites and applications, and customizing to their needs. You can start from here:</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"http://docs.ckeditor.com/#!/guide/dev_installation\">Getting Started</a> &ndash; Explains most crucial editor concepts and practices as well as the installation process and integration with your website.</li>\n\t\t\t\t\t<li><a href=\"http://docs.ckeditor.com/#!/guide/dev_advanced_installation\">Advanced Installation Concepts</a> &ndash; Describes how to upgrade, install additional components (plugins, skins), or create a custom build.</li>\n\t\t\t\t</ul>\n\t\t\t\t\t<p>When you have the basics sorted out, feel free to browse some more advanced sections like:</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"http://docs.ckeditor.com/#!/guide/dev_features\">Functionality Overview</a> &ndash; Descriptions and samples of various editor features.</li>\n\t\t\t\t\t<li><a href=\"http://docs.ckeditor.com/#!/guide/plugin_sdk_intro\">Plugin SDK</a>, <a href=\"http://docs.ckeditor.com/#!/guide/widget_sdk_intro\">Widget SDK</a>, and <a href=\"http://docs.ckeditor.com/#!/guide/skin_sdk_intro\">Skin SDK</a> &ndash; Useful when you want to create your own editor components.</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<section>\n\t\t\t\t<h2>CKEditor JavaScript API</h2>\n\t\t\t\t<p>CKEditor boasts a rich <a href=\"http://docs.ckeditor.com/#!/api\">JavaScript API</a> that you can use to adjust the editor to your needs and integrate it with your website or application.</p>\n\t\t\t</section>\n\t\t</div>\n\t</div>\n</main>\n\n<footer class=\"footer-a grid-container\">\n\t<div class=\"grid-container\">\n\t\t<p class=\"grid-width-100\">\n\t\t\tCKEditor &ndash; The text editor for the Internet &ndash; <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p class=\"grid-width-100\" id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> &ndash; Frederico Knabben. All rights reserved.\n\t\t</p>\n\t</div>\n</footer>\n<script>\n\tinitSample();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/js/sample.js",
    "content": "﻿/**\n * Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n\n/* exported initSample */\n\nif ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 )\n\tCKEDITOR.tools.enableHtml5Elements( document );\n\n// The trick to keep the editor in the sample quite small\n// unless user specified own height.\nCKEDITOR.config.height = 150;\nCKEDITOR.config.width = 'auto';\n\nvar initSample = ( function() {\n\tvar wysiwygareaAvailable = isWysiwygareaAvailable(),\n\t\tisBBCodeBuiltIn = !!CKEDITOR.plugins.get( 'bbcode' );\n\n\treturn function() {\n\t\tvar editorElement = CKEDITOR.document.getById( 'editor' );\n\n\t\t// :(((\n\t\tif ( isBBCodeBuiltIn ) {\n\t\t\teditorElement.setHtml(\n\t\t\t\t'Hello world!\\n\\n' +\n\t\t\t\t'I\\'m an instance of [url=http://ckeditor.com]CKEditor[/url].'\n\t\t\t);\n\t\t}\n\n\t\t// Depending on the wysiwygare plugin availability initialize classic or inline editor.\n\t\tif ( wysiwygareaAvailable ) {\n\t\t\tCKEDITOR.replace( 'editor' );\n\t\t} else {\n\t\t\teditorElement.setAttribute( 'contenteditable', 'true' );\n\t\t\tCKEDITOR.inline( 'editor' );\n\n\t\t\t// TODO we can consider displaying some info box that\n\t\t\t// without wysiwygarea the classic editor may not work.\n\t\t}\n\t};\n\n\tfunction isWysiwygareaAvailable() {\n\t\t// If in development mode, then the wysiwygarea must be available.\n\t\t// Split REV into two strings so builder does not replace it :D.\n\t\tif ( CKEDITOR.revision == ( '%RE' + 'V%' ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn !!CKEDITOR.plugins.get( 'wysiwygarea' );\n\t}\n} )();\n\n"
  },
  {
    "path": "assets/ckeditor/samples/js/sf.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nvar SF=function(){function d(a){return(a=a.attributes?a.attributes.getNamedItem(\"class\"):null)?a.value.split(\" \"):[]}function c(a){var e=document.createAttribute(\"class\");e.value=a.join(\" \");return e}var b={attachListener:function(a,e,b){if(a.addEventListener)a.addEventListener(e,b,!1);else if(a.attachEvent)a.attachEvent(\"on\"+e,function(){b.apply(a,arguments)});else throw Error(\"Could not attach event.\");}};b.indexOf=function(){var a=Array.prototype.indexOf;return\"function\"===a?function(e,b){return a.call(e,\nb)}:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]===b)return d;return-1}}();b.accept=function(a,e){var c;a.children?(c=a.children,e(a)):\"number\"===typeof a.length&&(c=a);for(var d=c?c.length||0:0;d--;)b.accept(c[d],e)};b.getByClass=function(){var a=document.getElementsByClassName;return\"function\"===typeof a?function(e,b){\"string\"===typeof e&&(b=e,e=document);return a.call(e,b)}:function(a,c){\"string\"===typeof a&&(c=a,a=document.getElementsByTagName(\"html\")[0]);var d=[];b.accept(a,function(a){b.classList.contains(a,\nc)&&d.push(a)});return d}}();b.classList={};b.classList.add=function(a,b){var f=d(a);f.push(b);a.attributes.setNamedItem(c(f))};b.classList.remove=function(a,e){var f=d(a,e),n=b.indexOf(f,e);-1!==n&&(f.splice(n,1),a.attributes.setNamedItem(c(f)))};b.classList.contains=function(a,c){return-1!==b.indexOf(d(a),c)};b.classList.toggle=function(a,b){this.contains(a,b)?this.remove(a,b):this.add(a,b)};return b}();\"use strict\";\n(function(){function d(c){for(var b in c)delete c[b]}SF.modal=function(c){function b(a){27==a.keyCode&&f.close()}c.modalClass=\"modal content\";c.closeClass=\"modal-close\";c.modalStyles=d;c.closeStyles=d;var a=c.afterCreate,e=c.afterClose;c.afterCreate=function(c){a&&a(c);window.addEventListener(\"keydown\",b)};c.afterClose=function(a){e&&e(a);window.removeEventListener(\"keydown\",b)};var f=(new picoModal(c)).afterCreate(c.afterCreate).afterClose(c.afterClose);return f}})();\"use strict\";\n(function(){for(var d=SF.getByClass(\"toggler\"),c=d.length;c--;)SF.attachListener(d[c],\"click\",function(){var b=SF.classList.contains(this,\"icon-toggler-expanded\")||SF.classList.contains(this,\"icon-toggler-collapsed\"),a=document.getElementById(this.getAttribute(\"data-for\"));SF.classList.toggle(this,\"collapsed\");SF.classList.contains(this,\"collapsed\")?(SF.classList.add(a,\"collapsed\"),b&&(SF.classList.remove(this,\"icon-toggler-expanded\"),SF.classList.add(this,\"icon-toggler-collapsed\"))):(SF.classList.remove(a,\n\"collapsed\"),b&&(SF.classList.remove(this,\"icon-toggler-collapsed\"),SF.classList.add(this,\"icon-toggler-expanded\")))})})();\"use strict\";(function(){for(var d=SF.getByClass(\"tree-a\"),c=d.length;c--;)SF.attachListener(d[c],\"click\",function(b){b=b.target||b.srcElement;\"H2\"!==b.nodeName||SF.classList.contains(b,\"tree-a-no-sub\")||SF.classList.toggle(b,\"tree-a-active\")})})();\n(function(d,c){function b(a){return\"object\"===typeof Node?a instanceof Node:a&&\"object\"===typeof a&&\"number\"===typeof a.nodeType}function a(){var a=[];return{watch:a.push.bind(a),trigger:function(b){for(var c=!0,d={preventDefault:function(){c=!1}},e=0;e<a.length;e++)a[e](b,d);return c}}}function e(a){this.elem=a}function f(a,b){return e.div().clazz(\"pico-overlay\").clazz(a(\"overlayClass\",\"\")).stylize({display:\"block\",position:\"fixed\",top:\"0px\",left:\"0px\",height:\"100%\",width:\"100%\",zIndex:1E4}).stylize(a(\"overlayStyles\",\n{opacity:.5,background:\"#000\"})).onClick(function(){a(\"overlayClose\",!0)&&b()})}function n(a,b){var c=a(\"width\",\"auto\");\"number\"===typeof c&&(c=\"\"+c+\"px\");return e.div().clazz(\"pico-content\").clazz(a(\"modalClass\",\"\")).stylize({display:\"block\",position:\"fixed\",zIndex:10001,left:\"50%\",top:\"50px\",width:c,\"-ms-transform\":\"translateX(-50%)\",\"-moz-transform\":\"translateX(-50%)\",\"-webkit-transform\":\"translateX(-50%)\",\"-o-transform\":\"translateX(-50%)\",transform:\"translateX(-50%)\"}).stylize(a(\"modalStyles\",\n{backgroundColor:\"white\",padding:\"20px\",borderRadius:\"5px\"})).html(a(\"content\")).attr(\"role\",\"dialog\").onClick(function(a){(new e(a.target)).anyAncestor(function(a){return/\\bpico-close\\b/.test(a.elem.className)})&&b()})}function p(a){return function(){return a().elem}}function k(c){function e(a,b){var d=c[a];\"function\"===typeof d&&(d=d(b));return void 0===d?b:d}function k(){l().hide();m().hide();v.trigger(h)}function q(){w.trigger(h)&&k()}function g(a){return function(){a.apply(this,arguments);return h}}\nfunction r(a){if(!t){var c=n(e,q),b=f(e,q),d;d=e(\"closeButton\",!0)?c.child().html(e(\"closeHtml\",\"\\x26#xD7;\")).clazz(\"pico-close\").clazz(e(\"closeClass\")).stylize(e(\"closeStyles\",{borderRadius:\"2px\",cursor:\"pointer\",height:\"15px\",width:\"15px\",position:\"absolute\",top:\"5px\",right:\"5px\",fontSize:\"16px\",textAlign:\"center\",lineHeight:\"15px\",background:\"#CCC\"})):void 0;t={modal:c,overlay:b,close:d};x.trigger(h)}return t[a]}if(\"string\"===typeof c||b(c))c={content:c};var x=a(),y=a(),z=a(),w=a(),v=a(),t,m=r.bind(d,\n\"modal\"),l=r.bind(d,\"overlay\"),u=r.bind(d,\"close\"),h={modalElem:p(m),closeElem:p(u),overlayElem:p(l),show:function(){y.trigger(h)&&(l().show(),u(),m().show(),z.trigger(h));return this},close:g(q),forceClose:g(k),destroy:function(){m=m().destroy();l=l().destroy();u=void 0},options:function(a){c=a},afterCreate:g(x.watch),beforeShow:g(y.watch),afterShow:g(z.watch),beforeClose:g(w.watch),afterClose:g(v.watch)};return h}e.div=function(a){var b=c.createElement(\"div\");(a||c.body).appendChild(b);return new e(b)};\ne.prototype={child:function(){return e.div(this.elem)},stylize:function(a){a=a||{};\"undefined\"!==typeof a.opacity&&(a.filter=\"alpha(opacity\\x3d\"+100*a.opacity+\")\");for(var b in a)a.hasOwnProperty(b)&&(this.elem.style[b]=a[b]);return this},clazz:function(a){this.elem.className+=\" \"+a;return this},html:function(a){b(a)?this.elem.appendChild(a):this.elem.innerHTML=a;return this},onClick:function(a){this.elem.addEventListener(\"click\",a);return this},destroy:function(){c.body.removeChild(this.elem)},hide:function(){this.elem.style.display=\n\"none\"},show:function(){this.elem.style.display=\"block\"},attr:function(a,b){this.elem.setAttribute(a,b);return this},anyAncestor:function(a){for(var b=this.elem;b;){if(a(new e(b)))return!0;b=b.parentNode}return!1}};\"function\"===typeof d.define&&d.define.amd?d.define(function(){return k}):d.picoModal=k})(window,document);"
  },
  {
    "path": "assets/ckeditor/samples/old/ajax.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Ajax &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n\t<script>\n\n\t\tvar editor, html = '';\n\n\t\tfunction createEditor() {\n\t\t\tif ( editor )\n\t\t\t\treturn;\n\n\t\t\t// Create a new editor inside the <div id=\"editor\">, setting its value to html\n\t\t\tvar config = {};\n\t\t\teditor = CKEDITOR.appendTo( 'editor', config, html );\n\t\t}\n\n\t\tfunction removeEditor() {\n\t\t\tif ( !editor )\n\t\t\t\treturn;\n\n\t\t\t// Retrieve the editor contents. In an Ajax application, this data would be\n\t\t\t// sent to the server or used in any other way.\n\t\t\tdocument.getElementById( 'editorcontents' ).innerHTML = html = editor.getData();\n\t\t\tdocument.getElementById( 'contents' ).style.display = '';\n\n\t\t\t// Destroy the editor.\n\t\t\teditor.destroy();\n\t\t\teditor = null;\n\t\t}\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Create and Destroy Editor Instances for Ajax Applications\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/saveajax.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing\n\t\t\tarea will be displayed in a <code>&lt;div&gt;</code> element.\n\t\t</p>\n\t\t<p>\n\t\t\tFor details of how to create this setup check the source code of this sample page\n\t\t\tfor JavaScript code responsible for the creation and destruction of a CKEditor instance.\n\t\t</p>\n\t</div>\n\t<p>Click the buttons to create and remove a CKEditor instance.</p>\n\t<p>\n\t\t<input onclick=\"createEditor();\" type=\"button\" value=\"Create Editor\">\n\t\t<input onclick=\"removeEditor();\" type=\"button\" value=\"Remove Editor\">\n\t</p>\n\t<!-- This div will hold the editor. -->\n\t<div id=\"editor\">\n\t</div>\n\t<div id=\"contents\" style=\"display: none\">\n\t\t<p>\n\t\t\tEdited Contents:\n\t\t</p>\n\t\t<!-- This div will be used to display the editor contents. -->\n\t\t<div id=\"editorcontents\">\n\t\t</div>\n\t</div>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/api.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>API Usage &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<script>\n\n// The instanceReady event is fired, when an instance of CKEditor has finished\n// its initialization.\nCKEDITOR.on( 'instanceReady', function( ev ) {\n\t// Show the editor name and description in the browser status bar.\n\tdocument.getElementById( 'eMessage' ).innerHTML = 'Instance <code>' + ev.editor.name + '<\\/code> loaded.';\n\n\t// Show this sample buttons.\n\tdocument.getElementById( 'eButtons' ).style.display = 'block';\n});\n\nfunction InsertHTML() {\n\t// Get the editor instance that we want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\tvar value = document.getElementById( 'htmlArea' ).value;\n\n\t// Check the active editing mode.\n\tif ( editor.mode == 'wysiwyg' )\n\t{\n\t\t// Insert HTML code.\n\t\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertHtml\n\t\teditor.insertHtml( value );\n\t}\n\telse\n\t\talert( 'You must be in WYSIWYG mode!' );\n}\n\nfunction InsertText() {\n\t// Get the editor instance that we want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\tvar value = document.getElementById( 'txtArea' ).value;\n\n\t// Check the active editing mode.\n\tif ( editor.mode == 'wysiwyg' )\n\t{\n\t\t// Insert as plain text.\n\t\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText\n\t\teditor.insertText( value );\n\t}\n\telse\n\t\talert( 'You must be in WYSIWYG mode!' );\n}\n\nfunction SetContents() {\n\t// Get the editor instance that we want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\tvar value = document.getElementById( 'htmlArea' ).value;\n\n\t// Set editor contents (replace current contents).\n\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData\n\teditor.setData( value );\n}\n\nfunction GetContents() {\n\t// Get the editor instance that you want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\n\t// Get editor contents\n\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData\n\talert( editor.getData() );\n}\n\nfunction ExecuteCommand( commandName ) {\n\t// Get the editor instance that we want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\n\t// Check the active editing mode.\n\tif ( editor.mode == 'wysiwyg' )\n\t{\n\t\t// Execute the command.\n\t\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-execCommand\n\t\teditor.execCommand( commandName );\n\t}\n\telse\n\t\talert( 'You must be in WYSIWYG mode!' );\n}\n\nfunction CheckDirty() {\n\t// Get the editor instance that we want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\t// Checks whether the current editor contents present changes when compared\n\t// to the contents loaded into the editor at startup\n\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty\n\talert( editor.checkDirty() );\n}\n\nfunction ResetDirty() {\n\t// Get the editor instance that we want to interact with.\n\tvar editor = CKEDITOR.instances.editor1;\n\t// Resets the \"dirty state\" of the editor (see CheckDirty())\n\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-resetDirty\n\teditor.resetDirty();\n\talert( 'The \"IsDirty\" status has been reset' );\n}\n\nfunction Focus() {\n\tCKEDITOR.instances.editor1.focus();\n}\n\nfunction onFocus() {\n\tdocument.getElementById( 'eMessage' ).innerHTML = '<b>' + this.name + ' is focused </b>';\n}\n\nfunction onBlur() {\n\tdocument.getElementById( 'eMessage' ).innerHTML = this.name + ' lost focus';\n}\n\n\t</script>\n\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Using CKEditor JavaScript API\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/api.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t<p>\n\t\tThis sample shows how to use the\n\t\t<a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.editor\">CKEditor JavaScript API</a>\n\t\tto interact with the editor at runtime.\n\t</p>\n\t<p>\n\t\tFor details on how to create this setup check the source code of this sample page.\n\t</p>\n\t</div>\n\n\t<!-- This <div> holds alert messages to be display in the sample page. -->\n\t<div id=\"alerts\">\n\t\t<noscript>\n\t\t\t<p>\n\t\t\t\t<strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript\n\t\t\t\tsupport, like yours, you should still see the contents (HTML data) and you should\n\t\t\t\tbe able to edit it normally, without a rich editor interface.\n\t\t\t</p>\n\t\t</noscript>\n\t</div>\n\t<form action=\"../../../samples/sample_posteddata.php\" method=\"post\">\n\t\t<textarea cols=\"100\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\n\t\t<script>\n\t\t\t// Replace the <textarea id=\"editor1\"> with an CKEditor instance.\n\t\t\tCKEDITOR.replace( 'editor1', {\n\t\t\t\ton: {\n\t\t\t\t\tfocus: onFocus,\n\t\t\t\t\tblur: onBlur,\n\n\t\t\t\t\t// Check for availability of corresponding plugins.\n\t\t\t\t\tpluginsLoaded: function( evt ) {\n\t\t\t\t\t\tvar doc = CKEDITOR.document, ed = evt.editor;\n\t\t\t\t\t\tif ( !ed.getCommand( 'bold' ) )\n\t\t\t\t\t\t\tdoc.getById( 'exec-bold' ).hide();\n\t\t\t\t\t\tif ( !ed.getCommand( 'link' ) )\n\t\t\t\t\t\t\tdoc.getById( 'exec-link' ).hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t</script>\n\n\t\t<p id=\"eMessage\">\n\t\t</p>\n\n\t\t<div id=\"eButtons\" style=\"display: none\">\n\t\t\t<input id=\"exec-bold\" onclick=\"ExecuteCommand('bold');\" type=\"button\" value=\"Execute &quot;bold&quot; Command\">\n\t\t\t<input id=\"exec-link\" onclick=\"ExecuteCommand('link');\" type=\"button\" value=\"Execute &quot;link&quot; Command\">\n\t\t\t<input onclick=\"Focus();\" type=\"button\" value=\"Focus\">\n\t\t\t<br><br>\n\t\t\t<input onclick=\"InsertHTML();\" type=\"button\" value=\"Insert HTML\">\n\t\t\t<input onclick=\"SetContents();\" type=\"button\" value=\"Set Editor Contents\">\n\t\t\t<input onclick=\"GetContents();\" type=\"button\" value=\"Get Editor Contents (HTML)\">\n\t\t\t<br>\n\t\t\t<textarea cols=\"100\" id=\"htmlArea\" rows=\"3\">&lt;h2&gt;Test&lt;/h2&gt;&lt;p&gt;This is some &lt;a href=\"/Test1.html\"&gt;sample&lt;/a&gt; HTML code.&lt;/p&gt;</textarea>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<input onclick=\"InsertText();\" type=\"button\" value=\"Insert Text\">\n\t\t\t<br>\n\t\t\t<textarea cols=\"100\" id=\"txtArea\" rows=\"3\">   First line with some leading whitespaces.\n\nSecond line of text preceded by two line breaks.</textarea>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<input onclick=\"CheckDirty();\" type=\"button\" value=\"checkDirty()\">\n\t\t\t<input onclick=\"ResetDirty();\" type=\"button\" value=\"resetDirty()\">\n\t\t</div>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/appendto.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Append To Page Element Using JavaScript Code &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Append To Page Element Using JavaScript Code\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div id=\"section1\">\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThe <code><a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR-method-appendTo\">CKEDITOR.appendTo()</a></code> method serves to to place editors inside existing DOM elements. Unlike <code><a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR-method-replace\">CKEDITOR.replace()</a></code>,\n\t\t\t\ta target container to be replaced is no longer necessary. A new editor\n\t\t\t\tinstance is inserted directly wherever it is desired.\n\t\t\t</p>\n<pre class=\"samples\">CKEDITOR.appendTo( '<em>container_id</em>',\n\t{ /* Configuration options to be used. */ }\n\t'Editor content to be used.'\n);</pre>\n\t\t</div>\n\t\t<script>\n\n\t\t\t// This call can be placed at any point after the\n\t\t\t// DOM element to append CKEditor to or inside the <head><script>\n\t\t\t// in a window.onload event handler.\n\n\t\t\t// Append a CKEditor instance using the default configuration and the\n\t\t\t// provided content to the <div> element of ID \"section1\".\n\t\t\tCKEDITOR.appendTo( 'section1',\n\t\t\t\tnull,\n\t\t\t\t'<p>This is some <strong>sample text</strong>. You are using <a href=\"http://ckeditor.com/\">CKEditor</a>.</p>'\n\t\t\t);\n\n\t\t</script>\n\t</div>\n\t<br>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/assets/outputxhtml/outputxhtml.css",
    "content": "/*\n * Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n *\n * Styles used by the XHTML 1.1 sample page (xhtml.html).\n */\n\n/**\n * Basic definitions for the editing area.\n */\nbody\n{\n\tfont-family: Arial, Verdana, sans-serif;\n\tfont-size: 80%;\n\tcolor: #000000;\n\tbackground-color: #ffffff;\n\tpadding: 5px;\n\tmargin: 0px;\n}\n\n/**\n * Core styles.\n */\n\n.Bold\n{\n\tfont-weight: bold;\n}\n\n.Italic\n{\n\tfont-style: italic;\n}\n\n.Underline\n{\n\ttext-decoration: underline;\n}\n\n.StrikeThrough\n{\n\ttext-decoration: line-through;\n}\n\n.Subscript\n{\n\tvertical-align: sub;\n\tfont-size: smaller;\n}\n\n.Superscript\n{\n\tvertical-align: super;\n\tfont-size: smaller;\n}\n\n/**\n * Font faces.\n */\n\n.FontComic\n{\n\tfont-family: 'Comic Sans MS';\n}\n\n.FontCourier\n{\n\tfont-family: 'Courier New';\n}\n\n.FontTimes\n{\n\tfont-family: 'Times New Roman';\n}\n\n/**\n * Font sizes.\n */\n\n.FontSmaller\n{\n\tfont-size: smaller;\n}\n\n.FontLarger\n{\n\tfont-size: larger;\n}\n\n.FontSmall\n{\n\tfont-size: 8pt;\n}\n\n.FontBig\n{\n\tfont-size: 14pt;\n}\n\n.FontDouble\n{\n\tfont-size: 200%;\n}\n\n/**\n * Font colors.\n */\n.FontColor1\n{\n\tcolor: #ff9900;\n}\n\n.FontColor2\n{\n\tcolor: #0066cc;\n}\n\n.FontColor3\n{\n\tcolor: #ff0000;\n}\n\n.FontColor1BG\n{\n\tbackground-color: #ff9900;\n}\n\n.FontColor2BG\n{\n\tbackground-color: #0066cc;\n}\n\n.FontColor3BG\n{\n\tbackground-color: #ff0000;\n}\n\n/**\n * Indentation.\n */\n\n.Indent1\n{\n\tmargin-left: 40px;\n}\n\n.Indent2\n{\n\tmargin-left: 80px;\n}\n\n.Indent3\n{\n\tmargin-left: 120px;\n}\n\n/**\n * Alignment.\n */\n\n.JustifyLeft\n{\n\ttext-align: left;\n}\n\n.JustifyRight\n{\n\ttext-align: right;\n}\n\n.JustifyCenter\n{\n\ttext-align: center;\n}\n\n.JustifyFull\n{\n\ttext-align: justify;\n}\n\n/**\n * Other.\n */\n\ncode\n{\n\tfont-family: courier, monospace;\n\tbackground-color: #eeeeee;\n\tpadding-left: 1px;\n\tpadding-right: 1px;\n\tborder: #c0c0c0 1px solid;\n}\n\nkbd\n{\n\tpadding: 0px 1px 0px 1px;\n\tborder-width: 1px 2px 2px 1px;\n\tborder-style: solid;\n}\n\nblockquote\n{\n\tcolor: #808080;\n}\n"
  },
  {
    "path": "assets/ckeditor/samples/old/assets/posteddata.php",
    "content": "<!DOCTYPE html>\n<?php\n/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n?>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Sample &mdash; CKEditor</title>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\tCKEditor &mdash; Posted Data\n\t</h1>\n\t<table border=\"1\" cellspacing=\"0\" id=\"outputSample\">\n\t\t<colgroup><col width=\"120\"></colgroup>\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th>Field&nbsp;Name</th>\n\t\t\t\t<th>Value</th>\n\t\t\t</tr>\n\t\t</thead>\n<?php\n\nif (!empty($_POST))\n{\n\tforeach ( $_POST as $key => $value )\n\t{\n\t\tif ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) )\n\t\t\tcontinue;\n\n\t\tif ( get_magic_quotes_gpc() )\n\t\t\t$value = htmlspecialchars( stripslashes((string)$value) );\n\t\telse\n\t\t\t$value = htmlspecialchars( (string)$value );\n?>\n\t\t<tr>\n\t\t\t<th style=\"vertical-align: top\"><?php echo htmlspecialchars( (string)$key ); ?></th>\n\t\t\t<td><pre class=\"samples\"><?php echo $value; ?></pre></td>\n\t\t</tr>\n\t<?php\n\t}\n}\n?>\n\t</table>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico Knabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/assets/uilanguages/languages.js",
    "content": "﻿/*\n Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or http://ckeditor.com/license\n*/\nvar CKEDITOR_LANGS=function(){var c={af:\"Afrikaans\",ar:\"Arabic\",bg:\"Bulgarian\",bn:\"Bengali/Bangla\",bs:\"Bosnian\",ca:\"Catalan\",cs:\"Czech\",cy:\"Welsh\",da:\"Danish\",de:\"German\",\"de-ch\":\"German (Switzerland)\",el:\"Greek\",en:\"English\",\"en-au\":\"English (Australia)\",\"en-ca\":\"English (Canadian)\",\"en-gb\":\"English (United Kingdom)\",eo:\"Esperanto\",es:\"Spanish\",et:\"Estonian\",eu:\"Basque\",fa:\"Persian\",fi:\"Finnish\",fo:\"Faroese\",fr:\"French\",\"fr-ca\":\"French (Canada)\",gl:\"Galician\",gu:\"Gujarati\",he:\"Hebrew\",hi:\"Hindi\",\nhr:\"Croatian\",hu:\"Hungarian\",id:\"Indonesian\",is:\"Icelandic\",it:\"Italian\",ja:\"Japanese\",ka:\"Georgian\",km:\"Khmer\",ko:\"Korean\",ku:\"Kurdish\",lt:\"Lithuanian\",lv:\"Latvian\",mk:\"Macedonian\",mn:\"Mongolian\",ms:\"Malay\",nb:\"Norwegian Bokmal\",nl:\"Dutch\",no:\"Norwegian\",pl:\"Polish\",pt:\"Portuguese (Portugal)\",\"pt-br\":\"Portuguese (Brazil)\",ro:\"Romanian\",ru:\"Russian\",si:\"Sinhala\",sk:\"Slovak\",sq:\"Albanian\",sl:\"Slovenian\",sr:\"Serbian (Cyrillic)\",\"sr-latn\":\"Serbian (Latin)\",sv:\"Swedish\",th:\"Thai\",tr:\"Turkish\",tt:\"Tatar\",\nug:\"Uighur\",uk:\"Ukrainian\",vi:\"Vietnamese\",zh:\"Chinese Traditional\",\"zh-cn\":\"Chinese Simplified\"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name<b.name?-1:1});return b}();"
  },
  {
    "path": "assets/ckeditor/samples/old/datafiltering.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Data Filtering &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n\t<script>\n\t\t// Remove advanced tabs for all editors.\n\t\tCKEDITOR.config.removeDialogTabs = 'image:advanced;link:advanced;flash:advanced;creatediv:advanced;editdiv:advanced';\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Data Filtering and Features Activation\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/acf.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample page demonstrates the idea of Advanced Content Filter\n\t\t\t(<abbr title=\"Advanced Content Filter\">ACF</abbr>), a sophisticated\n\t\t\ttool that takes control over what kind of data is accepted by the editor and what\n\t\t\tkind of output is produced.\n\t\t</p>\n\t\t<h2>When and what is being filtered?</h2>\n\t\t<p>\n\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> controls\n\t\t\t<strong>every single source of data</strong> that comes to the editor.\n\t\t\tIt process both HTML that is inserted manually (i.e. pasted by the user)\n\t\t\tand programmatically like:\n\t\t</p>\n<pre class=\"samples\">\neditor.setData( '&lt;p&gt;Hello world!&lt;/p&gt;' );\n</pre>\n\t\t<p>\n\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> discards invalid,\n\t\t\tuseless HTML tags and attributes so the editor remains \"clean\" during\n\t\t\truntime. <abbr title=\"Advanced Content Filter\">ACF</abbr> behaviour\n\t\t\tcan be configured and adjusted for a particular case to prevent the\n\t\t\toutput HTML (i.e. in CMS systems) from being polluted.\n\n\t\t\tThis kind of filtering is a first, client-side line of defense\n\t\t\tagainst \"<a href=\"http://en.wikipedia.org/wiki/Tag_soup\">tag soups</a>\",\n\t\t\tthe tool that precisely restricts which tags, attributes and styles\n\t\t\tare allowed (desired). When properly configured, <abbr title=\"Advanced Content Filter\">ACF</abbr>\n\t\t\tis an easy and fast way to produce a high-quality, intentionally filtered HTML.\n\t\t</p>\n\n\t\t<h3>How to configure or disable ACF?</h3>\n\t\t<p>\n\t\t\tAdvanced Content Filter is enabled by default, working in \"automatic mode\", yet\n\t\t\tit provides a set of easy rules that allow adjusting filtering rules\n\t\t\tand disabling the entire feature when necessary. The config property\n\t\t\tresponsible for this feature is <code><a class=\"samples\"\n\t\t\thref=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent\">config.allowedContent</a></code>.\n\t\t</p>\n\t\t<p>\n\t\t\tBy \"automatic mode\" is meant that loaded plugins decide which kind\n\t\t\tof content is enabled and which is not. For example, if the link\n\t\t\tplugin is loaded it implies that <code>&lt;a&gt;</code> tag is\n\t\t\tautomatically allowed. Each plugin is given a set\n\t\t\tof predefined <abbr title=\"Advanced Content Filter\">ACF</abbr> rules\n\t\t\tthat control the editor until <code><a class=\"samples\"\n\t\t\thref=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent\">\n\t\t\tconfig.allowedContent</a></code>\n\t\t\tis defined manually.\n\t\t</p>\n\t\t<p>\n\t\t\tLet's assume our intention is to restrict the editor to accept (produce) <strong>paragraphs\n\t\t\tonly: no attributes, no styles, no other tags</strong>.\n\t\t\tWith <abbr title=\"Advanced Content Filter\">ACF</abbr>\n\t\t\tthis is very simple. Basically set <code><a class=\"samples\"\n\t\t\thref=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent\">\n\t\t\tconfig.allowedContent</a></code> to <code>'p'</code>:\n\t\t</p>\n<pre class=\"samples\">\nvar editor = CKEDITOR.replace( <em>textarea_id</em>, {\n\t<strong>allowedContent: 'p'</strong>\n} );\n</pre>\n\t\t<p>\n\t\t\tNow try to play with allowed content:\n\t\t</p>\n<pre class=\"samples\">\n// Trying to insert disallowed tag and attribute.\neditor.setData( '&lt;p <strong>style=\"color: red\"</strong>&gt;Hello <strong>&lt;em&gt;world&lt;/em&gt;</strong>!&lt;/p&gt;' );\nalert( editor.getData() );\n\n// Filtered data is returned.\n\"&lt;p&gt;Hello world!&lt;/p&gt;\"\n</pre>\n\t\t<p>\n\t\t\tWhat happened? Since <code>config.allowedContent: 'p'</code> is set the editor assumes\n\t\t\tthat only plain <code>&lt;p&gt;</code> are accepted. Nothing more. This is why\n\t\t\t<code>style</code> attribute and <code>&lt;em&gt;</code> tag are gone. The same\n\t\t\tfiltering would happen if we pasted disallowed HTML into this editor.\n\t\t</p>\n\t\t<p>\n\t\t\tThis is just a small sample of what <abbr title=\"Advanced Content Filter\">ACF</abbr>\n\t\t\tcan do. To know more, please refer to the sample section below and\n\t\t\t<a href=\"http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter\">the official Advanced Content Filter guide</a>.\n\t\t</p>\n\t\t<p>\n\t\t\tYou may, of course, want CKEditor to avoid filtering of any kind.\n\t\t\tTo get rid of <abbr title=\"Advanced Content Filter\">ACF</abbr>,\n\t\t\tbasically set <code><a class=\"samples\"\n\t\t\thref=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent\">\n\t\t\tconfig.allowedContent</a></code> to <code>true</code> like this:\n\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( <em>textarea_id</em>, {\n\t<strong>allowedContent: true</strong>\n} );\n</pre>\n\n\t\t<h2>Beyond data flow: Features activation</h2>\n\t\t<p>\n\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> is far more than\n\t\t\t<abbr title=\"Input/Output\">I/O</abbr> control: the entire\n\t\t\t<abbr title=\"User Interface\">UI</abbr> of the editor is adjusted to what\n\t\t\tfilters restrict. For example: if <code>&lt;a&gt;</code> tag is\n\t\t\t<strong>disallowed</strong>\n\t\t\tby <abbr title=\"Advanced Content Filter\">ACF</abbr>,\n\t\t\tthen accordingly <code>link</code> command, toolbar button and link dialog\n\t\t\tare also disabled. Editor is smart: it knows which features must be\n\t\t\tremoved from the interface to match filtering rules.\n\t\t</p>\n\t\t<p>\n\t\t\tCKEditor can be far more specific. If <code>&lt;a&gt;</code> tag is\n\t\t\t<strong>allowed</strong> by filtering rules to be used but it is restricted\n\t\t\tto have only one attribute (<code>href</code>)\n\t\t\t<code>config.allowedContent = 'a[!href]'</code>, then\n\t\t\t\"Target\" tab of the link dialog is automatically disabled as <code>target</code>\n\t\t\tattribute isn't included in <abbr title=\"Advanced Content Filter\">ACF</abbr> rules\n\t\t\tfor <code>&lt;a&gt;</code>. This behaviour applies to dialog fields, context\n\t\t\tmenus and toolbar buttons.\n\t\t</p>\n\n\t\t<h2>Sample configurations</h2>\n\t\t<p>\n\t\t\tThere are several editor instances below that present different\n\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> setups. <strong>All of them,\n\t\t\texcept the inline instance, share the same HTML content</strong> to visualize\n\t\t\thow different filtering rules affect the same input data.\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<label for=\"editor1\">\n\t\t\tEditor 1:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using default configuration (\"automatic mode\"). It means that\n\t\t\t\t<code><a class=\"samples\"\n\t\t\t\thref=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent\">\n\t\t\t\tconfig.allowedContent</a></code> is defined by loaded plugins.\n\t\t\t\tEach plugin extends filtering rules to make it's own associated content\n\t\t\t\tavailable for the user.\n\t\t\t</p>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor1' );\n\n\t\t</script>\n\t</div>\n\n\t<br>\n\n\t<div>\n\t\t<label for=\"editor2\">\n\t\t\tEditor 2:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using a custom configuration for\n\t\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr>:\n\t\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( 'editor2', {\n\tallowedContent:\n\t\t'h1 h2 h3 p blockquote strong em;' +\n\t\t'a[!href];' +\n\t\t'img(left,right)[!src,alt,width,height];' +\n\t\t'table tr th td caption;' +\n\t\t'span{!font-family};' +'\n\t\t'span{!color};' +\n\t\t'span(!marker);' +\n\t\t'del ins'\n} );\n</pre>\n\t\t\t<p>\n\t\t\t\tThe following rules may require additional explanation:\n\t\t\t</p>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<code>h1 h2 h3 p blockquote strong em</code> - These tags\n\t\t\t\t\tare accepted by the editor. Any tag attributes will be discarded.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<code>a[!href]</code> - <code>href</code> attribute is obligatory\n\t\t\t\t\tfor <code>&lt;a&gt;</code> tag. Tags without this attribute\n\t\t\t\t\tare disarded. No other attribute will be accepted.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<code>img(left,right)[!src,alt,width,height]</code> - <code>src</code>\n\t\t\t\t\tattribute is obligatory for <code>&lt;img&gt;</code> tag.\n\t\t\t\t\t<code>alt</code>, <code>width</code>, <code>height</code>\n\t\t\t\t\tand <code>class</code> attributes are accepted but\n\t\t\t\t\t<code>class</code> must be either <code>class=\"left\"</code>\n\t\t\t\t\tor <code>class=\"right\"</code>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<code>table tr th td caption</code> - These tags\n\t\t\t\t\tare accepted by the editor. Any tag attributes will be discarded.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<code>span{!font-family}</code>, <code>span{!color}</code>,\n\t\t\t\t\t<code>span(!marker)</code> - <code>&lt;span&gt;</code> tags\n\t\t\t\t\twill be accepted if either <code>font-family</code> or\n\t\t\t\t\t<code>color</code> style is set or <code>class=\"marker\"</code>\n\t\t\t\t\tis present.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<code>del ins</code> - These tags\n\t\t\t\t\tare accepted by the editor. Any tag attributes will be discarded.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<p>\n\t\t\t\tPlease note that <strong><abbr title=\"User Interface\">UI</abbr> of the\n\t\t\t\teditor is different</strong>. It's a response to what happened to the filters.\n\t\t\t\tSince <code>text-align</code> isn't allowed, the align toolbar is gone.\n\t\t\t\tThe same thing happened to subscript/superscript, strike, underline\n\t\t\t\t(<code>&lt;u&gt;</code>, <code>&lt;sub&gt;</code>, <code>&lt;sup&gt;</code>\n\t\t\t\tare disallowed by <code><a class=\"samples\"\n\t\t\t\thref=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent\">\n\t\t\t\tconfig.allowedContent</a></code>) and many other buttons.\n\t\t\t</p>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor2\" name=\"editor2\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor2', {\n\t\t\t\tallowedContent:\n\t\t\t\t\t'h1 h2 h3 p blockquote strong em;' +\n\t\t\t\t\t'a[!href];' +\n\t\t\t\t\t'img(left,right)[!src,alt,width,height];' +\n\t\t\t\t\t'table tr th td caption;' +\n\t\t\t\t\t'span{!font-family};' +\n\t\t\t\t\t'span{!color};' +\n\t\t\t\t\t'span(!marker);' +\n\t\t\t\t\t'del ins'\n\t\t\t} );\n\n\t\t</script>\n\t</div>\n\n\t<br>\n\n\t<div>\n\t\t<label for=\"editor3\">\n\t\t\tEditor 3:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using a custom configuration for\n\t\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr>.\n\t\t\t\tNote that filters can be configured as an object literal\n\t\t\t\tas an alternative to a string-based definition.\n\t\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( 'editor3', {\n\tallowedContent: {\n\t\t'b i ul ol big small': true,\n\t\t'h1 h2 h3 p blockquote li': {\n\t\t\tstyles: 'text-align'\n\t\t},\n\t\ta: { attributes: '!href,target' },\n\t\timg: {\n\t\t\tattributes: '!src,alt',\n\t\t\tstyles: 'width,height',\n\t\t\tclasses: 'left,right'\n\t\t}\n\t}\n} );\n</pre>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor3\" name=\"editor3\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor3', {\n\t\t\t\tallowedContent: {\n\t\t\t\t\t'b i ul ol big small': true,\n\t\t\t\t\t'h1 h2 h3 p blockquote li': {\n\t\t\t\t\t\tstyles: 'text-align'\n\t\t\t\t\t},\n\t\t\t\t\ta: { attributes: '!href,target' },\n\t\t\t\t\timg: {\n\t\t\t\t\t\tattributes: '!src,alt',\n\t\t\t\t\t\tstyles: 'width,height',\n\t\t\t\t\t\tclasses: 'left,right'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t</script>\n\t</div>\n\n\t<br>\n\n\t<div>\n\t\t<label for=\"editor4\">\n\t\t\tEditor 4:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using a custom set of plugins and buttons.\n\t\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( 'editor4', {\n\tremovePlugins: 'bidi,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',\n\tremoveButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',\n\tformat_tags: 'p;h1;h2;h3;pre;address'\n} );\n</pre>\n\t\t\t<p>\n\t\t\t\tAs you can see, removing plugins and buttons implies filtering.\n\t\t\t\tSeveral tags are not allowed in the editor because there's no\n\t\t\t\tplugin/button that is responsible for creating and editing this\n\t\t\t\tkind of content (for example: the image is missing because\n\t\t\t\tof <code>removeButtons: 'Image'</code>). The conclusion is that\n\t\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> works \"backwards\"\n\t\t\t\tas well: <strong>modifying <abbr title=\"User Interface\">UI</abbr>\n\t\t\t\telements is changing allowed content rules</strong>.\n\t\t\t</p>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor4\" name=\"editor4\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor4', {\n\t\t\t\tremovePlugins: 'bidi,div,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',\n\t\t\t\tremoveButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',\n\t\t\t\tformat_tags: 'p;h1;h2;h3;pre;address'\n\t\t\t} );\n\n\t\t</script>\n\t</div>\n\n\t<br>\n\n\t<div>\n\t\t<label for=\"editor5\">\n\t\t\tEditor 5:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is built on editable <code>&lt;h1&gt;</code> element.\n\t\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> takes care of\n\t\t\t\twhat can be included in <code>&lt;h1&gt;</code>. Note that there\n\t\t\t\tare no block styles in Styles combo. Also why lists, indentation,\n\t\t\t\tblockquote, div, form and other buttons are missing.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<abbr title=\"Advanced Content Filter\">ACF</abbr> makes sure that\n\t\t\t\tno disallowed tags will come to <code>&lt;h1&gt;</code> so the final\n\t\t\t\tmarkup is valid. If the user tried to paste some invalid HTML\n\t\t\t\tinto this editor (let's say a list), it would be automatically\n\t\t\t\tconverted into plain text.\n\t\t\t</p>\n\t\t</div>\n\t\t<h1 id=\"editor5\" contenteditable=\"true\">\n\t\t\t<em>Apollo 11</em> was the spaceflight that landed the first humans, Americans <a href=\"http://en.wikipedia.org/wiki/Neil_Armstrong\" title=\"Neil Armstrong\">Neil Armstrong</a> and <a href=\"http://en.wikipedia.org/wiki/Buzz_Aldrin\" title=\"Buzz Aldrin\">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC.\n\t\t</h1>\n\t</div>\n\n\t<br>\n\n\t<div>\n\t\t<label for=\"editor3\">\n\t\t\tEditor 6:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using a custom configuration for <abbr title=\"Advanced Content Filter\">ACF</abbr>.\n\t\t\t\tIt's using the <a href=\"http://docs.ckeditor.com/#!/guide/dev_disallowed_content\" target=\"_blank\">\n\t\t\t\tDisallowed Content</a> property of the filter to eliminate all <code>title</code> attributes.\n\t\t\t</p>\n\n<pre class=\"samples\">\nCKEDITOR.replace( 'editor6', {\n\tallowedContent: {\n\t\t'b i ul ol big small': true,\n\t\t'h1 h2 h3 p blockquote li': {\n\t\t\tstyles: 'text-align'\n\t\t},\n\t\ta: {attributes: '!href,target'},\n\t\timg: {\n\t\t\tattributes: '!src,alt',\n\t\t\tstyles: 'width,height',\n\t\t\tclasses: 'left,right'\n\t\t}\n\t},\n\tdisallowedContent: '*{title*}'\n} );\n</pre>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor6\" name=\"editor6\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor6', {\n\t\t\t\tallowedContent: {\n\t\t\t\t\t'b i ul ol big small': true,\n\t\t\t\t\t'h1 h2 h3 p blockquote li': {\n\t\t\t\t\t\tstyles: 'text-align'\n\t\t\t\t\t},\n\t\t\t\t\ta: {attributes: '!href,target'},\n\t\t\t\t\timg: {\n\t\t\t\t\t\tattributes: '!src,alt',\n\t\t\t\t\t\tstyles: 'width,height',\n\t\t\t\t\t\tclasses: 'left,right'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdisallowedContent: '*{title*}'\n\t\t\t} );\n\n\t\t</script>\n\t</div>\n\n\t<br>\n\n\t<div>\n\t\t<label for=\"editor7\">\n\t\t\tEditor 7:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using a custom configuration for <abbr title=\"Advanced Content Filter\">ACF</abbr>.\n\t\t\t\tIt's using the <a href=\"http://docs.ckeditor.com/#!/guide/dev_disallowed_content\" target=\"_blank\">\n\t\t\t\tDisallowed Content</a> property of the filter to eliminate all <code>a</code> and <code>img</code> tags,\n\t\t\t\twhile allowing all other tags.\n\t\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( 'editor7', {\n\tallowedContent: {\n\t\t// Allow all content.\n\t\t$1: {\n\t\t\telements: CKEDITOR.dtd,\n\t\t\tattributes: true,\n\t\t\tstyles: true,\n\t\t\tclasses: true\n\t\t}\n\t},\n\tdisallowedContent: 'img a'\n} );\n</pre>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor7\" name=\"editor7\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor7', {\n\t\t\t\tallowedContent: {\n\t\t\t\t\t// allow all content\n\t\t\t\t\t$1: {\n\t\t\t\t\t\telements: CKEDITOR.dtd,\n\t\t\t\t\t\tattributes: true,\n\t\t\t\t\t\tstyles: true,\n\t\t\t\t\t\tclasses: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdisallowedContent: 'img a'\n\t\t\t} );\n\n\t\t</script>\n\t</div>\n\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/dialog/assets/my_dialog.js",
    "content": "﻿/**\n * Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n\nCKEDITOR.dialog.add( 'myDialog', function() {\n\treturn {\n\t\ttitle: 'My Dialog',\n\t\tminWidth: 400,\n\t\tminHeight: 200,\n\t\tcontents: [\n\t\t\t{\n\t\t\t\tid: 'tab1',\n\t\t\t\tlabel: 'First Tab',\n\t\t\t\ttitle: 'First Tab',\n\t\t\t\telements: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'input1',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tlabel: 'Text Field'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'select1',\n\t\t\t\t\t\ttype: 'select',\n\t\t\t\t\t\tlabel: 'Select Field',\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t[ 'option1', 'value1' ],\n\t\t\t\t\t\t\t[ 'option2', 'value2' ]\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'tab2',\n\t\t\t\tlabel: 'Second Tab',\n\t\t\t\ttitle: 'Second Tab',\n\t\t\t\telements: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'button1',\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tlabel: 'Button Field'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n} );\n\n"
  },
  {
    "path": "assets/ckeditor/samples/old/dialog/dialog.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Using API to Customize Dialog Windows &mdash; CKEditor Sample</title>\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"../../../samples/old/sample.css\">\n\t<meta name=\"ckeditor-sample-name\" content=\"Using the JavaScript API to customize dialog windows\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Advanced Samples\">\n\t<meta name=\"ckeditor-sample-description\" content=\"Using the dialog windows API to customize dialog windows without changing the original editor code.\">\n\t<style>\n\n\t\t.cke_button__mybutton_icon\n\t\t{\n\t\t\tdisplay: none !important;\n\t\t}\n\n\t\t.cke_button__mybutton_label\n\t\t{\n\t\t\tdisplay: inline !important;\n\t\t}\n\n\t</style>\n\t<script>\n\n\t\tCKEDITOR.on( 'instanceCreated', function( ev ){\n\t\t\tvar editor = ev.editor;\n\n\t\t\t// Listen for the \"pluginsLoaded\" event, so we are sure that the\n\t\t\t// \"dialog\" plugin has been loaded and we are able to do our\n\t\t\t// customizations.\n\t\t\teditor.on( 'pluginsLoaded', function() {\n\n\t\t\t\t// If our custom dialog has not been registered, do that now.\n\t\t\t\tif ( !CKEDITOR.dialog.exists( 'myDialog' ) ) {\n\t\t\t\t\t// We need to do the following trick to find out the dialog\n\t\t\t\t\t// definition file URL path. In the real world, you would simply\n\t\t\t\t\t// point to an absolute path directly, like \"/mydir/mydialog.js\".\n\t\t\t\t\tvar href = document.location.href.split( '/' );\n\t\t\t\t\thref.pop();\n\t\t\t\t\thref.push( 'assets/my_dialog.js' );\n\t\t\t\t\thref = href.join( '/' );\n\n\t\t\t\t\t// Finally, register the dialog.\n\t\t\t\t\tCKEDITOR.dialog.add( 'myDialog', href );\n\t\t\t\t}\n\n\t\t\t\t// Register the command used to open the dialog.\n\t\t\t\teditor.addCommand( 'myDialogCmd', new CKEDITOR.dialogCommand( 'myDialog' ) );\n\n\t\t\t\t// Add the a custom toolbar buttons, which fires the above\n\t\t\t\t// command..\n\t\t\t\teditor.ui.add( 'MyButton', CKEDITOR.UI_BUTTON, {\n\t\t\t\t\tlabel: 'My Dialog',\n\t\t\t\t\tcommand: 'myDialogCmd'\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// When opening a dialog, its \"definition\" is created for it, for\n\t\t// each editor instance. The \"dialogDefinition\" event is then\n\t\t// fired. We should use this event to make customizations to the\n\t\t// definition of existing dialogs.\n\t\tCKEDITOR.on( 'dialogDefinition', function( ev ) {\n\t\t\t// Take the dialog name and its definition from the event data.\n\t\t\tvar dialogName = ev.data.name;\n\t\t\tvar dialogDefinition = ev.data.definition;\n\n\t\t\t// Check if the definition is from the dialog we're\n\t\t\t// interested on (the \"Link\" dialog).\n\t\t\tif ( dialogName == 'myDialog' && ev.editor.name == 'editor2' ) {\n\t\t\t\t// Get a reference to the \"Link Info\" tab.\n\t\t\t\tvar infoTab = dialogDefinition.getContents( 'tab1' );\n\n\t\t\t\t// Add a new text field to the \"tab1\" tab page.\n\t\t\t\tinfoTab.add( {\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tlabel: 'My Custom Field',\n\t\t\t\t\tid: 'customField',\n\t\t\t\t\t'default': 'Sample!',\n\t\t\t\t\tvalidate: function() {\n\t\t\t\t\t\tif ( ( /\\d/ ).test( this.getValue() ) )\n\t\t\t\t\t\t\treturn 'My Custom Field must not contain digits';\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Remove the \"select1\" field from the \"tab1\" tab.\n\t\t\t\tinfoTab.remove( 'select1' );\n\n\t\t\t\t// Set the default value for \"input1\" field.\n\t\t\t\tvar input1 = infoTab.get( 'input1' );\n\t\t\t\tinput1[ 'default' ] = 'www.example.com';\n\n\t\t\t\t// Remove the \"tab2\" tab page.\n\t\t\t\tdialogDefinition.removeContents( 'tab2' );\n\n\t\t\t\t// Add a new tab to the \"Link\" dialog.\n\t\t\t\tdialogDefinition.addContents( {\n\t\t\t\t\tid: 'customTab',\n\t\t\t\t\tlabel: 'My Tab',\n\t\t\t\t\taccessKey: 'M',\n\t\t\t\t\telements: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'myField1',\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tlabel: 'My Text Field'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'myField2',\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tlabel: 'Another Text Field'\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t});\n\n\t\t\t\t// Provide the focus handler to start initial focus in \"customField\" field.\n\t\t\t\tdialogDefinition.onFocus = function() {\n\t\t\t\t\tvar urlField = this.getContentElement( 'tab1', 'customField' );\n\t\t\t\t\turlField.select();\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tvar config = {\n\t\t\textraPlugins: 'dialog',\n\t\t\ttoolbar: [ [ 'MyButton' ] ]\n\t\t};\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; Using CKEditor Dialog API\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to use the\n\t\t\t<a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.dialog\">CKEditor Dialog API</a>\n\t\t\tto customize CKEditor dialog windows without changing the original editor code.\n\t\t\tThe following customizations are being done in the example below:\n\t\t</p>\n\t\t<p>\n\t\t\tFor details on how to create this setup check the source code of this sample page.\n\t\t</p>\n\t</div>\n\t<p>A custom dialog is added to the editors using the <code>pluginsLoaded</code> event, from an external <a target=\"_blank\" href=\"assets/my_dialog.js\">dialog definition file</a>:</p>\n\t<ol>\n\t\t<li><strong>Creating a custom dialog window</strong> &ndash; \"My Dialog\" dialog window opened with the \"My Dialog\" toolbar button.</li>\n\t\t<li><strong>Creating a custom button</strong> &ndash; Add button to open the dialog with \"My Dialog\" toolbar button.</li>\n\t</ol>\n\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t<script>\n\t\t// Replace the <textarea id=\"editor1\"> with an CKEditor instance.\n\t\tCKEDITOR.replace( 'editor1', config );\n\t</script>\n\t<p>The below editor modify the dialog definition of the above added dialog using the <code>dialogDefinition</code> event:</p>\n\t<ol>\n\t\t<li><strong>Adding dialog tab</strong> &ndash; Add new tab \"My Tab\" to dialog window.</li>\n\t\t<li><strong>Removing a dialog window tab</strong> &ndash; Remove \"Second Tab\" page from the dialog window.</li>\n\t\t<li><strong>Adding dialog window fields</strong> &ndash; Add \"My Custom Field\" to the dialog window.</li>\n\t\t<li><strong>Removing dialog window field</strong> &ndash; Remove \"Select Field\" selection field from the dialog window.</li>\n\t\t<li><strong>Setting default values for dialog window fields</strong> &ndash; Set default value of \"Text Field\" text field. </li>\n\t\t<li><strong>Setup initial focus for dialog window</strong> &ndash; Put initial focus on \"My Custom Field\" text field. </li>\n\t</ol>\n\t<textarea cols=\"80\" id=\"editor2\" name=\"editor2\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t<script>\n\n\t\t// Replace the <textarea id=\"editor1\"> with an CKEditor instance.\n\t\tCKEDITOR.replace( 'editor2', config );\n\n\t</script>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/divreplace.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Replace DIV &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<style>\n\n\t\tdiv.editable\n\t\t{\n\t\t\tborder: solid 2px transparent;\n\t\t\tpadding-left: 15px;\n\t\t\tpadding-right: 15px;\n\t\t}\n\n\t\tdiv.editable:hover\n\t\t{\n\t\t\tborder-color: black;\n\t\t}\n\n\t</style>\n\t<script>\n\n\t\t// Uncomment the following code to test the \"Timeout Loading Method\".\n\t\t// CKEDITOR.loadFullCoreTimeout = 5;\n\n\t\twindow.onload = function() {\n\t\t\t// Listen to the double click event.\n\t\t\tif ( window.addEventListener )\n\t\t\t\tdocument.body.addEventListener( 'dblclick', onDoubleClick, false );\n\t\t\telse if ( window.attachEvent )\n\t\t\t\tdocument.body.attachEvent( 'ondblclick', onDoubleClick );\n\n\t\t};\n\n\t\tfunction onDoubleClick( ev ) {\n\t\t\t// Get the element which fired the event. This is not necessarily the\n\t\t\t// element to which the event has been attached.\n\t\t\tvar element = ev.target || ev.srcElement;\n\n\t\t\t// Find out the div that holds this element.\n\t\t\tvar name;\n\n\t\t\tdo {\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\t\t\twhile ( element && ( name = element.nodeName.toLowerCase() ) &&\n\t\t\t\t( name != 'div' || element.className.indexOf( 'editable' ) == -1 ) && name != 'body' );\n\n\t\t\tif ( name == 'div' && element.className.indexOf( 'editable' ) != -1 )\n\t\t\t\treplaceDiv( element );\n\t\t}\n\n\t\tvar editor;\n\n\t\tfunction replaceDiv( div ) {\n\t\t\tif ( editor )\n\t\t\t\teditor.destroy();\n\n\t\t\teditor = CKEDITOR.replace( div );\n\t\t}\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Replace DIV with CKEditor on the Fly\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to automatically replace <code>&lt;div&gt;</code> elements\n\t\t\twith a CKEditor instance on the fly, following user's doubleclick. The content\n\t\t\tthat was previously placed inside the <code>&lt;div&gt;</code> element will now\n\t\t\tbe moved into CKEditor editing area.\n\t\t</p>\n\t\t<p>\n\t\t\tFor details on how to create this setup check the source code of this sample page.\n\t\t</p>\n\t</div>\n\t<p>\n\t\tDouble-click any of the following <code>&lt;div&gt;</code> elements to transform them into\n\t\teditor instances.\n\t</p>\n\t<div class=\"editable\">\n\t\t<h3>\n\t\t\tPart 1\n\t\t</h3>\n\t\t<p>\n\t\t\tLorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi\n\t\t\tsemper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna\n\t\t\trutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla\n\t\t\tnec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce\n\t\t\teu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.\n\t\t</p>\n\t</div>\n\t<div class=\"editable\">\n\t\t<h3>\n\t\t\tPart 2\n\t\t</h3>\n\t\t<p>\n\t\t\tLorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi\n\t\t\tsemper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna\n\t\t\trutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla\n\t\t\tnec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce\n\t\t\teu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.\n\t\t</p>\n\t\t<p>\n\t\t\tDonec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus\n\t\t\tsollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum\n\t\t\tvitae leo. Suspendisse nec mi tristique nulla laoreet vulputate.\n\t\t</p>\n\t</div>\n\t<div class=\"editable\">\n\t\t<h3>\n\t\t\tPart 3\n\t\t</h3>\n\t\t<p>\n\t\t\tLorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi\n\t\t\tsemper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna\n\t\t\trutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla\n\t\t\tnec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce\n\t\t\teu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.\n\t\t</p>\n\t</div>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/enterkey/enterkey.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>ENTER Key Configuration &mdash; CKEditor Sample</title>\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<link href=\"../../../samples/old/sample.css\" rel=\"stylesheet\">\n\t<meta name=\"ckeditor-sample-name\" content=\"Using the &quot;Enter&quot; key in CKEditor\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Advanced Samples\">\n\t<meta name=\"ckeditor-sample-description\" content=\"Configuring the behavior of &lt;em&gt;Enter&lt;/em&gt; and &lt;em&gt;Shift+Enter&lt;/em&gt; keys.\">\n\t<script>\n\n\t\tvar editor;\n\n\t\tfunction changeEnter() {\n\t\t\t// If we already have an editor, let's destroy it first.\n\t\t\tif ( editor )\n\t\t\t\teditor.destroy( true );\n\n\t\t\t// Create the editor again, with the appropriate settings.\n\t\t\teditor = CKEDITOR.replace( 'editor1', {\n\t\t\t\textraPlugins: 'enterkey',\n\t\t\t\tenterMode: Number( document.getElementById( 'xEnter' ).value ),\n\t\t\t\tshiftEnterMode: Number( document.getElementById( 'xShiftEnter' ).value )\n\t\t\t});\n\t\t}\n\n\t\twindow.onload = changeEnter;\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; ENTER Key Configuration\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/enterkey.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to configure the <em>Enter</em> and <em>Shift+Enter</em> keys\n\t\t\tto perform actions specified in the\n\t\t\t<a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode\"><code>enterMode</code></a>\n\t\t\tand <a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode\"><code>shiftEnterMode</code></a>\n\t\t\tparameters, respectively.\n\t \t\tYou can choose from the following options:\n\t\t</p>\n\t\t<ul class=\"samples\">\n\t\t\t<li><strong><code>ENTER_P</code></strong> &ndash; new <code>&lt;p&gt;</code> paragraphs are created;</li>\n\t\t\t<li><strong><code>ENTER_BR</code></strong> &ndash; lines are broken with <code>&lt;br&gt;</code> elements;</li>\n\t\t\t<li><strong><code>ENTER_DIV</code></strong> &ndash; new <code>&lt;div&gt;</code> blocks are created.</li>\n\t\t</ul>\n\t\t<p>\n\t\t\tThe sample code below shows how to configure CKEditor to create a <code>&lt;div&gt;</code> block when <em>Enter</em> key is pressed.\n\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>', {\n\t<strong>enterMode: CKEDITOR.ENTER_DIV</strong>\n});</pre>\n\t\t<p>\n\t\t\tNote that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of\n\t\t\tthe <code>&lt;textarea&gt;</code> element to be replaced.\n\t\t</p>\n\t</div>\n\t<div style=\"float: left; margin-right: 20px\">\n\t\tWhen <em>Enter</em> is pressed:<br>\n\t\t<select id=\"xEnter\" onchange=\"changeEnter();\">\n\t\t\t<option selected=\"selected\" value=\"1\">Create a new &lt;P&gt; (recommended)</option>\n\t\t\t<option value=\"3\">Create a new &lt;DIV&gt;</option>\n\t\t\t<option value=\"2\">Break the line with a &lt;BR&gt;</option>\n\t\t</select>\n\t</div>\n\t<div style=\"float: left\">\n\t\tWhen <em>Shift+Enter</em> is pressed:<br>\n\t\t<select id=\"xShiftEnter\" onchange=\"changeEnter();\">\n\t\t\t<option value=\"1\">Create a new &lt;P&gt;</option>\n\t\t\t<option value=\"3\">Create a new &lt;DIV&gt;</option>\n\t\t\t<option selected=\"selected\" value=\"2\">Break the line with a &lt;BR&gt; (recommended)</option>\n\t\t</select>\n\t</div>\n\t<br style=\"clear: both\">\n\t<form action=\"../../../samples/sample_posteddata.php\" method=\"post\">\n\t\t<p>\n\t\t\t<br>\n\t\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.</textarea>\n\t\t</p>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/htmlwriter/assets/outputforflash/swfobject.js",
    "content": "﻿var swfobject=function(){function w(){if(!u){try{var a=d.getElementsByTagName(\"body\")[0].appendChild(d.createElement(\"span\"));a.parentNode.removeChild(a)}catch(b){return}u=!0;for(var a=z.length,c=0;c<a;c++)z[c]()}}function M(a){u?a():z[z.length]=a}function N(a){if(\"undefined\"!=typeof n.addEventListener)n.addEventListener(\"load\",a,!1);else if(\"undefined\"!=typeof d.addEventListener)d.addEventListener(\"load\",a,!1);else if(\"undefined\"!=typeof n.attachEvent)U(n,\"onload\",a);else if(\"function\"==typeof n.onload){var b=\nn.onload;n.onload=function(){b();a()}}else n.onload=a}function V(){var a=d.getElementsByTagName(\"body\")[0],b=d.createElement(\"object\");b.setAttribute(\"type\",\"application/x-shockwave-flash\");var c=a.appendChild(b);if(c){var f=0;(function(){if(\"undefined\"!=typeof c.GetVariable){var g=c.GetVariable(\"$version\");g&&(g=g.split(\" \")[1].split(\",\"),e.pv=[parseInt(g[0],10),parseInt(g[1],10),parseInt(g[2],10)])}else if(10>f){f++;setTimeout(arguments.callee,10);return}a.removeChild(b);c=null;E()})()}else E()}\nfunction E(){var a=r.length;if(0<a)for(var b=0;b<a;b++){var c=r[b].id,f=r[b].callbackFn,g={success:!1,id:c};if(0<e.pv[0]){var d=p(c);if(d)if(!A(r[b].swfVersion)||e.wk&&312>e.wk)if(r[b].expressInstall&&F()){g={};g.data=r[b].expressInstall;g.width=d.getAttribute(\"width\")||\"0\";g.height=d.getAttribute(\"height\")||\"0\";d.getAttribute(\"class\")&&(g.styleclass=d.getAttribute(\"class\"));d.getAttribute(\"align\")&&(g.align=d.getAttribute(\"align\"));for(var h={},d=d.getElementsByTagName(\"param\"),k=d.length,l=0;l<\nk;l++)\"movie\"!=d[l].getAttribute(\"name\").toLowerCase()&&(h[d[l].getAttribute(\"name\")]=d[l].getAttribute(\"value\"));G(g,h,c,f)}else W(d),f&&f(g);else v(c,!0),f&&(g.success=!0,g.ref=H(c),f(g))}else v(c,!0),f&&((c=H(c))&&\"undefined\"!=typeof c.SetVariable&&(g.success=!0,g.ref=c),f(g))}}function H(a){var b=null;(a=p(a))&&\"OBJECT\"==a.nodeName&&(\"undefined\"!=typeof a.SetVariable?b=a:(a=a.getElementsByTagName(\"object\")[0])&&(b=a));return b}function F(){return!B&&A(\"6.0.65\")&&(e.win||e.mac)&&!(e.wk&&312>e.wk)}\nfunction G(a,b,c,f){B=!0;I=f||null;O={success:!1,id:c};var g=p(c);if(g){\"OBJECT\"==g.nodeName?(y=J(g),C=null):(y=g,C=c);a.id=\"SWFObjectExprInst\";if(\"undefined\"==typeof a.width||!/%$/.test(a.width)&&310>parseInt(a.width,10))a.width=\"310\";if(\"undefined\"==typeof a.height||!/%$/.test(a.height)&&137>parseInt(a.height,10))a.height=\"137\";d.title=d.title.slice(0,47)+\" - Flash Player Installation\";f=e.ie&&e.win?\"ActiveX\":\"PlugIn\";f=\"MMredirectURL\\x3d\"+n.location.toString().replace(/&/g,\"%26\")+\"\\x26MMplayerType\\x3d\"+\nf+\"\\x26MMdoctitle\\x3d\"+d.title;b.flashvars=\"undefined\"!=typeof b.flashvars?b.flashvars+(\"\\x26\"+f):f;e.ie&&e.win&&4!=g.readyState&&(f=d.createElement(\"div\"),c+=\"SWFObjectNew\",f.setAttribute(\"id\",c),g.parentNode.insertBefore(f,g),g.style.display=\"none\",function(){4==g.readyState?g.parentNode.removeChild(g):setTimeout(arguments.callee,10)}());K(a,b,c)}}function W(a){if(e.ie&&e.win&&4!=a.readyState){var b=d.createElement(\"div\");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(J(a),b);a.style.display=\n\"none\";(function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)})()}else a.parentNode.replaceChild(J(a),a)}function J(a){var b=d.createElement(\"div\");if(e.win&&e.ie)b.innerHTML=a.innerHTML;else if(a=a.getElementsByTagName(\"object\")[0])if(a=a.childNodes)for(var c=a.length,f=0;f<c;f++)1==a[f].nodeType&&\"PARAM\"==a[f].nodeName||8==a[f].nodeType||b.appendChild(a[f].cloneNode(!0));return b}function K(a,b,c){var f,g=p(c);if(e.wk&&312>e.wk)return f;if(g)if(\"undefined\"==typeof a.id&&\n(a.id=c),e.ie&&e.win){var q=\"\",h;for(h in a)a[h]!=Object.prototype[h]&&(\"data\"==h.toLowerCase()?b.movie=a[h]:\"styleclass\"==h.toLowerCase()?q+=' class\\x3d\"'+a[h]+'\"':\"classid\"!=h.toLowerCase()&&(q+=\" \"+h+'\\x3d\"'+a[h]+'\"'));h=\"\";for(var k in b)b[k]!=Object.prototype[k]&&(h+='\\x3cparam name\\x3d\"'+k+'\" value\\x3d\"'+b[k]+'\" /\\x3e');g.outerHTML='\\x3cobject classid\\x3d\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+q+\"\\x3e\"+h+\"\\x3c/object\\x3e\";D[D.length]=a.id;f=p(a.id)}else{k=d.createElement(\"object\");k.setAttribute(\"type\",\n\"application/x-shockwave-flash\");for(var l in a)a[l]!=Object.prototype[l]&&(\"styleclass\"==l.toLowerCase()?k.setAttribute(\"class\",a[l]):\"classid\"!=l.toLowerCase()&&k.setAttribute(l,a[l]));for(q in b)b[q]!=Object.prototype[q]&&\"movie\"!=q.toLowerCase()&&(a=k,h=q,l=b[q],c=d.createElement(\"param\"),c.setAttribute(\"name\",h),c.setAttribute(\"value\",l),a.appendChild(c));g.parentNode.replaceChild(k,g);f=k}return f}function P(a){var b=p(a);b&&\"OBJECT\"==b.nodeName&&(e.ie&&e.win?(b.style.display=\"none\",function(){if(4==\nb.readyState){var c=p(a);if(c){for(var f in c)\"function\"==typeof c[f]&&(c[f]=null);c.parentNode.removeChild(c)}}else setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))}function p(a){var b=null;try{b=d.getElementById(a)}catch(c){}return b}function U(a,b,c){a.attachEvent(b,c);x[x.length]=[a,b,c]}function A(a){var b=e.pv;a=a.split(\".\");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:\n!1}function Q(a,b,c,f){if(!e.ie||!e.mac){var g=d.getElementsByTagName(\"head\")[0];g&&(c=c&&\"string\"==typeof c?c:\"screen\",f&&(L=m=null),m&&L==c||(f=d.createElement(\"style\"),f.setAttribute(\"type\",\"text/css\"),f.setAttribute(\"media\",c),m=g.appendChild(f),e.ie&&e.win&&\"undefined\"!=typeof d.styleSheets&&0<d.styleSheets.length&&(m=d.styleSheets[d.styleSheets.length-1]),L=c),e.ie&&e.win?m&&\"object\"==typeof m.addRule&&m.addRule(a,b):m&&\"undefined\"!=typeof d.createTextNode&&m.appendChild(d.createTextNode(a+\n\" {\"+b+\"}\")))}}function v(a,b){if(R){var c=b?\"visible\":\"hidden\";u&&p(a)?p(a).style.visibility=c:Q(\"#\"+a,\"visibility:\"+c)}}function S(a){return null!=/[\\\\\\\"<>\\.;]/.exec(a)&&\"undefined\"!=typeof encodeURIComponent?encodeURIComponent(a):a}var n=window,d=document,t=navigator,T=!1,z=[function(){T?V():E()}],r=[],D=[],x=[],y,C,I,O,u=!1,B=!1,m,L,R=!0,e=function(){var a=\"undefined\"!=typeof d.getElementById&&\"undefined\"!=typeof d.getElementsByTagName&&\"undefined\"!=typeof d.createElement,b=t.userAgent.toLowerCase(),\nc=t.platform.toLowerCase(),f=c?/win/.test(c):/win/.test(b),c=c?/mac/.test(c):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):!1,g=!+\"\\v1\",e=[0,0,0],h=null;if(\"undefined\"!=typeof t.plugins&&\"object\"==typeof t.plugins[\"Shockwave Flash\"])!(h=t.plugins[\"Shockwave Flash\"].description)||\"undefined\"!=typeof t.mimeTypes&&t.mimeTypes[\"application/x-shockwave-flash\"]&&!t.mimeTypes[\"application/x-shockwave-flash\"].enabledPlugin||(T=!0,g=!1,h=h.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\n\"$1\"),e[0]=parseInt(h.replace(/^(.*)\\..*$/,\"$1\"),10),e[1]=parseInt(h.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10),e[2]=/[a-zA-Z]/.test(h)?parseInt(h.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0);else if(\"undefined\"!=typeof n.ActiveXObject)try{var k=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");k&&(h=k.GetVariable(\"$version\"))&&(g=!0,h=h.split(\" \")[1].split(\",\"),e=[parseInt(h[0],10),parseInt(h[1],10),parseInt(h[2],10)])}catch(l){}return{w3:a,pv:e,wk:b,ie:g,win:f,mac:c}}();(function(){e.w3&&((\"undefined\"!=typeof d.readyState&&\n\"complete\"==d.readyState||\"undefined\"==typeof d.readyState&&(d.getElementsByTagName(\"body\")[0]||d.body))&&w(),u||(\"undefined\"!=typeof d.addEventListener&&d.addEventListener(\"DOMContentLoaded\",w,!1),e.ie&&e.win&&(d.attachEvent(\"onreadystatechange\",function(){\"complete\"==d.readyState&&(d.detachEvent(\"onreadystatechange\",arguments.callee),w())}),n==top&&function(){if(!u){try{d.documentElement.doScroll(\"left\")}catch(a){setTimeout(arguments.callee,0);return}w()}}()),e.wk&&function(){u||(/loaded|complete/.test(d.readyState)?\nw():setTimeout(arguments.callee,0))}(),N(w)))})();(function(){e.ie&&e.win&&window.attachEvent(\"onunload\",function(){for(var a=x.length,b=0;b<a;b++)x[b][0].detachEvent(x[b][1],x[b][2]);a=D.length;for(b=0;b<a;b++)P(D[b]);for(var c in e)e[c]=null;e=null;for(var f in swfobject)swfobject[f]=null;swfobject=null})})();return{registerObject:function(a,b,c,f){if(e.w3&&a&&b){var d={};d.id=a;d.swfVersion=b;d.expressInstall=c;d.callbackFn=f;r[r.length]=d;v(a,!1)}else f&&f({success:!1,id:a})},getObjectById:function(a){if(e.w3)return H(a)},\nembedSWF:function(a,b,c,d,g,q,h,k,l,n){var p={success:!1,id:b};e.w3&&!(e.wk&&312>e.wk)&&a&&b&&c&&d&&g?(v(b,!1),M(function(){c+=\"\";d+=\"\";var e={};if(l&&\"object\"===typeof l)for(var m in l)e[m]=l[m];e.data=a;e.width=c;e.height=d;m={};if(k&&\"object\"===typeof k)for(var r in k)m[r]=k[r];if(h&&\"object\"===typeof h)for(var t in h)m.flashvars=\"undefined\"!=typeof m.flashvars?m.flashvars+(\"\\x26\"+t+\"\\x3d\"+h[t]):t+\"\\x3d\"+h[t];if(A(g))r=K(e,m,b),e.id==b&&v(b,!0),p.success=!0,p.ref=r;else{if(q&&F()){e.data=q;G(e,\nm,b,n);return}v(b,!0)}n&&n(p)})):n&&n(p)},switchOffAutoHideShow:function(){R=!1},ua:e,getFlashPlayerVersion:function(){return{major:e.pv[0],minor:e.pv[1],release:e.pv[2]}},hasFlashPlayerVersion:A,createSWF:function(a,b,c){if(e.w3)return K(a,b,c)},showExpressInstall:function(a,b,c,d){e.w3&&F()&&G(a,b,c,d)},removeSWF:function(a){e.w3&&P(a)},createCSS:function(a,b,c,d){e.w3&&Q(a,b,c,d)},addDomLoadEvent:M,addLoadEvent:N,getQueryParamValue:function(a){var b=d.location.search||d.location.hash;if(b){/\\?/.test(b)&&\n(b=b.split(\"?\")[1]);if(null==a)return S(b);for(var b=b.split(\"\\x26\"),c=0;c<b.length;c++)if(b[c].substring(0,b[c].indexOf(\"\\x3d\"))==a)return S(b[c].substring(b[c].indexOf(\"\\x3d\")+1))}return\"\"},expressInstallCallback:function(){if(B){var a=p(\"SWFObjectExprInst\");a&&y&&(a.parentNode.replaceChild(y,a),C&&(v(C,!0),e.ie&&e.win&&(y.style.display=\"block\")),I&&I(O));B=!1}}}}();"
  },
  {
    "path": "assets/ckeditor/samples/old/htmlwriter/outputforflash.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Output for Flash &mdash; CKEditor Sample</title>\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<script src=\"../../../samples/old/sample.js\"></script>\n\t<script src=\"assets/outputforflash/swfobject.js\"></script>\n\t<link href=\"../../../samples/old/sample.css\" rel=\"stylesheet\">\n\t<meta name=\"ckeditor-sample-required-plugins\" content=\"sourcearea\">\n\t<meta name=\"ckeditor-sample-name\" content=\"Output for Flash\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Advanced Samples\">\n\t<meta name=\"ckeditor-sample-description\" content=\"Configuring CKEditor to produce HTML code that can be used with Adobe Flash.\">\n\t<style>\n\n\t\t.alert\n\t\t{\n\t\t\tbackground: #ffa84c;\n\t\t\tpadding: 10px 15px;\n\t\t\tfont-weight: bold;\n\t\t\tdisplay: block;\n\t\t\tmargin-bottom: 20px;\n\t\t}\n\n\t</style>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; Producing Flash Compliant HTML Output\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to configure CKEditor to output\n\t\t\tHTML code that can be used with\n\t\t\t<a class=\"samples\" href=\"http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000922.html\">\n\t\t\tAdobe Flash</a>.\n\t\t\tThe code will contain a subset of standard HTML elements like <code>&lt;b&gt;</code>,\n\t\t\t<code>&lt;i&gt;</code>, and <code>&lt;p&gt;</code> as well as HTML attributes.\n\t\t</p>\n\t\t<p>\n\t\t\tTo add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard\n\t\t\tJavaScript call, and define CKEditor features to use HTML elements and attributes.\n\t\t</p>\n\t\t<p>\n\t\t\tFor details on how to create this setup check the source code of this sample page.\n\t\t</p>\n\t</div>\n\t<p>\n\t\tTo see how it works, create some content in the editing area of CKEditor on the left\n\t\tand send it to the Flash object on the right side of the page by using the\n\t\t<strong>Send to Flash</strong> button.\n\t</p>\n\t<table style=\"width: 100%; border-spacing: 0; border-collapse:collapse;\">\n\t\t<tr>\n\t\t\t<td style=\"width: 100%\">\n\t\t\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;&lt;b&gt;&lt;font size=&quot;18&quot; style=&quot;font-size:18px;&quot;&gt;Flash and HTML&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It is possible to have &lt;a href=&quot;http://ckeditor.com&quot;&gt;CKEditor&lt;/a&gt; creating content that will be later loaded inside &lt;b&gt;Flash&lt;/b&gt; objects and animations.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flash has a few limitations when dealing with HTML:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It has limited support on tags.&lt;/li&gt;&lt;li&gt;There is no margin between block elements, like paragraphs.&lt;/li&gt;&lt;/ul&gt;</textarea>\n\t\t\t\t<script>\n\n\t\t\t\t\tif ( document.location.protocol == 'file:' )\n\t\t\t\t\t\talert( 'Warning: This samples does not work when loaded from local filesystem' +\n\t\t\t\t\t\t\t'due to security restrictions implemented in Flash.' +\n\t\t\t\t\t\t\t'\\n\\nPlease load the sample from a web server instead.' );\n\n\t\t\t\t\tvar editor = CKEDITOR.replace( 'editor1', {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Ensure that htmlwriter plugin, which is required for this sample, is loaded.\n\t\t\t\t\t\t */\n\t\t\t\t\t\textraPlugins: 'htmlwriter',\n\n\t\t\t\t\t\theight: 290,\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\ttoolbar: [\n\t\t\t\t\t\t\t[ 'Source', '-', 'Bold', 'Italic', 'Underline', '-', 'BulletedList', '-', 'Link', 'Unlink' ],\n\t\t\t\t\t\t\t[ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ],\n\t\t\t\t\t\t\t'/',\n\t\t\t\t\t\t\t[ 'Font', 'FontSize' ],\n\t\t\t\t\t\t\t[ 'TextColor', '-', 'About' ]\n\t\t\t\t\t\t],\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Style sheet for the contents\n\t\t\t\t\t\t */\n\t\t\t\t\t\tcontentsCss: 'body {color:#000; background-color#FFF; font-family: Arial; font-size:80%;} p, ol, ul {margin-top: 0px; margin-bottom: 0px;}',\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Quirks doctype\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdocType: '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">',\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Core styles.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tcoreStyles_bold: { element: 'b' },\n\t\t\t\t\t\tcoreStyles_italic: { element: 'i' },\n\t\t\t\t\t\tcoreStyles_underline: { element: 'u' },\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Font face.\n\t\t\t\t\t\t */\n\n\t\t\t\t\t\t// Define the way font elements will be applied to the document. The \"font\"\n\t\t\t\t\t\t// element will be used.\n\t\t\t\t\t\tfont_style: {\n\t\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\t\tattributes: { 'face': '#(family)' }\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Font sizes.\n\t\t\t\t\t\t */\n\n\t\t\t\t\t\t// The CSS part of the font sizes isn't used by Flash, it is there to get the\n\t\t\t\t\t\t// font rendered correctly in CKEditor.\n\t\t\t\t\t\tfontSize_sizes: '8px/8;9px/9;10px/10;11px/11;12px/12;14px/14;16px/16;18px/18;20px/20;22px/22;24px/24;26px/26;28px/28;36px/36;48px/48;72px/72',\n\t\t\t\t\t\tfontSize_style: {\n\t\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\t\tattributes: { 'size': '#(size)' },\n\t\t\t\t\t\t\tstyles: { 'font-size': '#(size)px' }\n\t\t\t\t\t\t} ,\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Font colors.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tcolorButton_enableMore: true,\n\n\t\t\t\t\t\tcolorButton_foreStyle: {\n\t\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\t\tattributes: { 'color': '#(color)' }\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tcolorButton_backStyle: {\n\t\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\t\tstyles: { 'background-color': '#(color)' }\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\ton: { 'instanceReady': configureFlashOutput }\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Adjust the behavior of the dataProcessor to match the\n\t\t\t\t\t * requirements of Flash\n\t\t\t\t\t */\n\t\t\t\t\tfunction configureFlashOutput( ev ) {\n\t\t\t\t\t\tvar editor = ev.editor,\n\t\t\t\t\t\t\tdataProcessor = editor.dataProcessor,\n\t\t\t\t\t\t\thtmlFilter = dataProcessor && dataProcessor.htmlFilter;\n\n\t\t\t\t\t\t// Out self closing tags the HTML4 way, like <br>.\n\t\t\t\t\t\tdataProcessor.writer.selfClosingEnd = '>';\n\n\t\t\t\t\t\t// Make output formatting match Flash expectations\n\t\t\t\t\t\tvar dtd = CKEDITOR.dtd;\n\t\t\t\t\t\tfor ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {\n\t\t\t\t\t\t\tdataProcessor.writer.setRules( e, {\n\t\t\t\t\t\t\t\tindent: false,\n\t\t\t\t\t\t\t\tbreakBeforeOpen: false,\n\t\t\t\t\t\t\t\tbreakAfterOpen: false,\n\t\t\t\t\t\t\t\tbreakBeforeClose: false,\n\t\t\t\t\t\t\t\tbreakAfterClose: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataProcessor.writer.setRules( 'br', {\n\t\t\t\t\t\t\tindent: false,\n\t\t\t\t\t\t\tbreakBeforeOpen: false,\n\t\t\t\t\t\t\tbreakAfterOpen: false,\n\t\t\t\t\t\t\tbreakBeforeClose: false,\n\t\t\t\t\t\t\tbreakAfterClose: false\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Output properties as attributes, not styles.\n\t\t\t\t\t\thtmlFilter.addRules( {\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\t$: function( element ) {\n\t\t\t\t\t\t\t\t\tvar style, match, width, height, align;\n\n\t\t\t\t\t\t\t\t\t// Output dimensions of images as width and height\n\t\t\t\t\t\t\t\t\tif ( element.name == 'img' ) {\n\t\t\t\t\t\t\t\t\t\tstyle = element.attributes.style;\n\n\t\t\t\t\t\t\t\t\t\tif ( style ) {\n\t\t\t\t\t\t\t\t\t\t\t// Get the width from the style.\n\t\t\t\t\t\t\t\t\t\t\tmatch = ( /(?:^|\\s)width\\s*:\\s*(\\d+)px/i ).exec( style );\n\t\t\t\t\t\t\t\t\t\t\twidth = match && match[1];\n\n\t\t\t\t\t\t\t\t\t\t\t// Get the height from the style.\n\t\t\t\t\t\t\t\t\t\t\tmatch = ( /(?:^|\\s)height\\s*:\\s*(\\d+)px/i ).exec( style );\n\t\t\t\t\t\t\t\t\t\t\theight = match && match[1];\n\n\t\t\t\t\t\t\t\t\t\t\tif ( width ) {\n\t\t\t\t\t\t\t\t\t\t\t\telement.attributes.style = element.attributes.style.replace( /(?:^|\\s)width\\s*:\\s*(\\d+)px;?/i , '' );\n\t\t\t\t\t\t\t\t\t\t\t\telement.attributes.width = width;\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tif ( height ) {\n\t\t\t\t\t\t\t\t\t\t\t\telement.attributes.style = element.attributes.style.replace( /(?:^|\\s)height\\s*:\\s*(\\d+)px;?/i , '' );\n\t\t\t\t\t\t\t\t\t\t\t\telement.attributes.height = height;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Output alignment of paragraphs using align\n\t\t\t\t\t\t\t\t\tif ( element.name == 'p' ) {\n\t\t\t\t\t\t\t\t\t\tstyle = element.attributes.style;\n\n\t\t\t\t\t\t\t\t\t\tif ( style ) {\n\t\t\t\t\t\t\t\t\t\t\t// Get the align from the style.\n\t\t\t\t\t\t\t\t\t\t\tmatch = ( /(?:^|\\s)text-align\\s*:\\s*(\\w*);?/i ).exec( style );\n\t\t\t\t\t\t\t\t\t\t\talign = match && match[1];\n\n\t\t\t\t\t\t\t\t\t\t\tif ( align ) {\n\t\t\t\t\t\t\t\t\t\t\t\telement.attributes.style = element.attributes.style.replace( /(?:^|\\s)text-align\\s*:\\s*(\\w*);?/i , '' );\n\t\t\t\t\t\t\t\t\t\t\t\telement.attributes.align = align;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( element.attributes.style === '' )\n\t\t\t\t\t\t\t\t\t\tdelete element.attributes.style;\n\n\t\t\t\t\t\t\t\t\treturn element;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction sendToFlash() {\n\t\t\t\t\t\tvar html = CKEDITOR.instances.editor1.getData() ;\n\n\t\t\t\t\t\t// Quick fix for link color.\n\t\t\t\t\t\thtml = html.replace( /<a /g, '<font color=\"#0000FF\"><u><a ' )\n\t\t\t\t\t\thtml = html.replace( /<\\/a>/g, '</a></u></font>' )\n\n\t\t\t\t\t\tvar flash = document.getElementById( 'ckFlashContainer' ) ;\n\t\t\t\t\t\tflash.setData( html ) ;\n\t\t\t\t\t}\n\n\t\t\t\t\tCKEDITOR.domReady( function() {\n\t\t\t\t\t\tif ( !swfobject.hasFlashPlayerVersion( '8' ) ) {\n\t\t\t\t\t\t\tCKEDITOR.dom.element.createFromHtml( '<span class=\"alert\">' +\n\t\t\t\t\t\t\t\t\t'At least Adobe Flash Player 8 is required to run this sample. ' +\n\t\t\t\t\t\t\t\t\t'You can download it from <a href=\"http://get.adobe.com/flashplayer\">Adobe\\'s website</a>.' +\n\t\t\t\t\t\t\t\t'</span>' ).insertBefore( editor.element );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswfobject.embedSWF(\n\t\t\t\t\t\t\t'assets/outputforflash/outputforflash.swf',\n\t\t\t\t\t\t\t'ckFlashContainer',\n\t\t\t\t\t\t\t'550',\n\t\t\t\t\t\t\t'400',\n\t\t\t\t\t\t\t'8',\n\t\t\t\t\t\t\t{ wmode: 'transparent' }\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t</script>\n\t\t\t\t<p>\n\t\t\t\t\t<input type=\"button\" value=\"Send to Flash\" onclick=\"sendToFlash();\">\n\t\t\t\t</p>\n\t\t\t</td>\n\t\t\t<td style=\"vertical-align: top; padding-left: 20px\">\n\t\t\t\t<div id=\"ckFlashContainer\"></div>\n\t\t\t</td>\n\t\t</tr>\n\t</table>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/htmlwriter/outputhtml.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>HTML Compliant Output &mdash; CKEditor Sample</title>\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<script src=\"../../../samples/old/sample.js\"></script>\n\t<link href=\"../../../samples/old/sample.css\" rel=\"stylesheet\">\n\t<meta name=\"ckeditor-sample-required-plugins\" content=\"sourcearea\">\n\t<meta name=\"ckeditor-sample-name\" content=\"Output HTML\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Advanced Samples\">\n\t<meta name=\"ckeditor-sample-description\" content=\"Configuring CKEditor to produce legacy HTML 4 code.\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; Producing HTML Compliant Output\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to configure CKEditor to output valid\n\t\t\t<a class=\"samples\" href=\"http://www.w3.org/TR/html401/\">HTML 4.01</a> code.\n\t\t\tTraditional HTML elements like <code>&lt;b&gt;</code>,\n\t\t\t<code>&lt;i&gt;</code>, and <code>&lt;font&gt;</code> are used in place of\n\t\t\t<code>&lt;strong&gt;</code>, <code>&lt;em&gt;</code>, and CSS styles.\n\t\t</p>\n\t\t<p>\n\t\t\tTo add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard\n\t\t\tJavaScript call, and define CKEditor features to use the HTML compliant elements and attributes.\n\t\t</p>\n\t\t<p>\n\t\t\tA snippet of the configuration code can be seen below; check the source of this page for\n\t\t\tfull definition:\n\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>', {\n\tcoreStyles_bold: { element: 'b' },\n\tcoreStyles_italic: { element: 'i' },\n\n\tfontSize_style: {\n\t\telement: 'font',\n\t\tattributes: { 'size': '#(size)' }\n\t}\n\n\t...\n});</pre>\n\t</div>\n\t<form action=\"../../../samples/sample_posteddata.php\" method=\"post\">\n\t\t<p>\n\t\t\t<label for=\"editor1\">\n\t\t\t\tEditor 1:\n\t\t\t</label>\n\t\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;This is some &lt;b&gt;sample text&lt;/b&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t\t<script>\n\n\t\t\t\tCKEDITOR.replace( 'editor1', {\n\t\t\t\t\t/*\n\t\t\t\t\t * Ensure that htmlwriter plugin, which is required for this sample, is loaded.\n\t\t\t\t\t */\n\t\t\t\t\textraPlugins: 'htmlwriter',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Style sheet for the contents\n\t\t\t\t\t */\n\t\t\t\t\tcontentsCss: 'body {color:#000; background-color#:FFF;}',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Simple HTML5 doctype\n\t\t\t\t\t */\n\t\t\t\t\tdocType: '<!DOCTYPE HTML>',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Allowed content rules which beside limiting allowed HTML\n\t\t\t\t\t * will also take care of transforming styles to attributes\n\t\t\t\t\t * (currently only for img - see transformation rules defined below).\n\t\t\t\t\t *\n\t\t\t\t\t * Read more: http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter\n\t\t\t\t\t */\n\t\t\t\t\tallowedContent:\n\t\t\t\t\t\t'h1 h2 h3 p pre[align]; ' +\n\t\t\t\t\t\t'blockquote code kbd samp var del ins cite q b i u strike ul ol li hr table tbody tr td th caption; ' +\n\t\t\t\t\t\t'img[!src,alt,align,width,height]; font[!face]; font[!family]; font[!color]; font[!size]; font{!background-color}; a[!href]; a[!name]',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Core styles.\n\t\t\t\t\t */\n\t\t\t\t\tcoreStyles_bold: { element: 'b' },\n\t\t\t\t\tcoreStyles_italic: { element: 'i' },\n\t\t\t\t\tcoreStyles_underline: { element: 'u' },\n\t\t\t\t\tcoreStyles_strike: { element: 'strike' },\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Font face.\n\t\t\t\t\t */\n\n\t\t\t\t\t// Define the way font elements will be applied to the document.\n\t\t\t\t\t// The \"font\" element will be used.\n\t\t\t\t\tfont_style: {\n\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\tattributes: { 'face': '#(family)' }\n\t\t\t\t\t},\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Font sizes.\n\t\t\t\t\t */\n\t\t\t\t\tfontSize_sizes: 'xx-small/1;x-small/2;small/3;medium/4;large/5;x-large/6;xx-large/7',\n\t\t\t\t\tfontSize_style: {\n\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\tattributes: { 'size': '#(size)' }\n\t\t\t\t\t},\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Font colors.\n\t\t\t\t\t */\n\n\t\t\t\t\tcolorButton_foreStyle: {\n\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\tattributes: { 'color': '#(color)' }\n\t\t\t\t\t},\n\n\t\t\t\t\tcolorButton_backStyle: {\n\t\t\t\t\t\telement: 'font',\n\t\t\t\t\t\tstyles: { 'background-color': '#(color)' }\n\t\t\t\t\t},\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Styles combo.\n\t\t\t\t\t */\n\t\t\t\t\tstylesSet: [\n\t\t\t\t\t\t{ name: 'Computer Code', element: 'code' },\n\t\t\t\t\t\t{ name: 'Keyboard Phrase', element: 'kbd' },\n\t\t\t\t\t\t{ name: 'Sample Text', element: 'samp' },\n\t\t\t\t\t\t{ name: 'Variable', element: 'var' },\n\t\t\t\t\t\t{ name: 'Deleted Text', element: 'del' },\n\t\t\t\t\t\t{ name: 'Inserted Text', element: 'ins' },\n\t\t\t\t\t\t{ name: 'Cited Work', element: 'cite' },\n\t\t\t\t\t\t{ name: 'Inline Quotation', element: 'q' }\n\t\t\t\t\t],\n\n\t\t\t\t\ton: {\n\t\t\t\t\t\tpluginsLoaded: configureTransformations,\n\t\t\t\t\t\tloaded: configureHtmlWriter\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t/*\n\t\t\t\t * Add missing content transformations.\n\t\t\t\t */\n\t\t\t\tfunction configureTransformations( evt ) {\n\t\t\t\t\tvar editor = evt.editor;\n\n\t\t\t\t\teditor.dataProcessor.htmlFilter.addRules( {\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tstyle: function( value, element ) {\n\t\t\t\t\t\t\t\t// Return #RGB for background and border colors\n\t\t\t\t\t\t\t\treturn CKEDITOR.tools.convertRgbToHex( value );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Default automatic content transformations do not yet take care of\n\t\t\t\t\t// align attributes on blocks, so we need to add our own transformation rules.\n\t\t\t\t\tfunction alignToAttribute( element ) {\n\t\t\t\t\t\tif ( element.styles[ 'text-align' ] ) {\n\t\t\t\t\t\t\telement.attributes.align = element.styles[ 'text-align' ];\n\t\t\t\t\t\t\tdelete element.styles[ 'text-align' ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\teditor.filter.addTransformations( [\n\t\t\t\t\t\t[ { element: 'p',\tright: alignToAttribute } ],\n\t\t\t\t\t\t[ { element: 'h1',\tright: alignToAttribute } ],\n\t\t\t\t\t\t[ { element: 'h2',\tright: alignToAttribute } ],\n\t\t\t\t\t\t[ { element: 'h3',\tright: alignToAttribute } ],\n\t\t\t\t\t\t[ { element: 'pre',\tright: alignToAttribute } ]\n\t\t\t\t\t] );\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Adjust the behavior of htmlWriter to make it output HTML like FCKeditor.\n\t\t\t\t */\n\t\t\t\tfunction configureHtmlWriter( evt ) {\n\t\t\t\t\tvar editor = evt.editor,\n\t\t\t\t\t\tdataProcessor = editor.dataProcessor;\n\n\t\t\t\t\t// Out self closing tags the HTML4 way, like <br>.\n\t\t\t\t\tdataProcessor.writer.selfClosingEnd = '>';\n\n\t\t\t\t\t// Make output formatting behave similar to FCKeditor.\n\t\t\t\t\tvar dtd = CKEDITOR.dtd;\n\t\t\t\t\tfor ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {\n\t\t\t\t\t\tdataProcessor.writer.setRules( e, {\n\t\t\t\t\t\t\tindent: true,\n\t\t\t\t\t\t\tbreakBeforeOpen: true,\n\t\t\t\t\t\t\tbreakAfterOpen: false,\n\t\t\t\t\t\t\tbreakBeforeClose: !dtd[ e ][ '#' ],\n\t\t\t\t\t\t\tbreakAfterClose: true\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t</script>\n\t\t</p>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/index.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>CKEditor Samples</title>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\tCKEditor Samples\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThese samples are not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"twoColumns\">\n\t\t<div class=\"twoColumnsLeft\">\n\t\t\t<h2 class=\"samples\">\n\t\t\t\tBasic Samples\n\t\t\t</h2>\n\t\t\t<dl class=\"samples\">\n\t\t\t\t<dt><a class=\"samples\" href=\"replacebyclass.html\">Replace textarea elements by class name</a></dt>\n\t\t\t\t<dd>Automatic replacement of all textarea elements of a given class with a CKEditor instance.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"replacebycode.html\">Replace textarea elements by code</a></dt>\n\t\t\t\t<dd>Replacement of textarea elements with CKEditor instances by using a JavaScript call.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"jquery.html\">Create editors with jQuery</a></dt>\n\t\t\t\t<dd>Creating standard and inline CKEditor instances with jQuery adapter.</dd>\n\t\t\t</dl>\n\n\t\t\t<h2 class=\"samples\">\n\t\t\t\tBasic Customization\n\t\t\t</h2>\n\t\t\t<dl class=\"samples\">\n\t\t\t\t<dt><a class=\"samples\" href=\"uicolor.html\">User Interface color</a></dt>\n\t\t\t\t<dd>Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI color.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"uilanguages.html\">User Interface languages</a></dt>\n\t\t\t\t<dd>Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the UI language.</dd>\n\t\t\t</dl>\n\n\n\t\t\t<h2 class=\"samples\">Plugins</h2>\n<dl class=\"samples\">\n<dt><a class=\"samples\" href=\"magicline/magicline.html\">Magicline plugin</a></dt>\n<dd>Using the Magicline plugin to access difficult focus spaces.</dd>\n\n<dt><a class=\"samples\" href=\"wysiwygarea/fullpage.html\">Full page support</a></dt>\n<dd>CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.</dd>\n</dl>\n\t\t</div>\n\t\t<div class=\"twoColumnsRight\">\n\t\t\t<h2 class=\"samples\">\n\t\t\t\tInline Editing\n\t\t\t</h2>\n\t\t\t<dl class=\"samples\">\n\t\t\t\t<dt><a class=\"samples\" href=\"inlineall.html\">Massive inline editor creation</a></dt>\n\t\t\t\t<dd>Turn all elements with <code>contentEditable = true</code> attribute into inline editors.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"inlinebycode.html\">Convert element into an inline editor by code</a></dt>\n\t\t\t\t<dd>Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"inlinetextarea.html\">Replace textarea with inline editor</a> <span class=\"new\">New!</span></dt>\n\t\t\t\t<dd>A form with a textarea that is replaced by an inline editor at runtime.</dd>\n\n\t\t\t\t\n\t\t\t</dl>\n\n\t\t\t<h2 class=\"samples\">\n\t\t\t\tAdvanced Samples\n\t\t\t</h2>\n\t\t\t<dl class=\"samples\">\n\t\t\t\t<dt><a class=\"samples\" href=\"datafiltering.html\">Data filtering and features activation</a> <span class=\"new\">New!</span></dt>\n\t\t\t\t<dd>Data filtering and automatic features activation basing on configuration.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"divreplace.html\">Replace DIV elements on the fly</a></dt>\n\t\t\t\t<dd>Transforming a <code>div</code> element into an instance of CKEditor with a mouse click.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"appendto.html\">Append editor instances</a></dt>\n\t\t\t\t<dd>Appending editor instances to existing DOM elements.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"ajax.html\">Create and destroy editor instances for Ajax applications</a></dt>\n\t\t\t\t<dd>Creating and destroying CKEditor instances on the fly and saving the contents entered into the editor window.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"api.html\">Basic usage of the API</a></dt>\n\t\t\t\t<dd>Using the CKEditor JavaScript API to interact with the editor at runtime.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"xhtmlstyle.html\">XHTML-compliant style</a></dt>\n\t\t\t\t<dd>Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"readonly.html\">Read-only mode</a></dt>\n\t\t\t\t<dd>Using the readOnly API to block introducing changes to the editor contents.</dd>\n\n\t\t\t\t<dt><a class=\"samples\" href=\"tabindex.html\">\"Tab\" key-based navigation</a></dt>\n\t\t\t\t<dd>Navigating among editor instances with tab key.</dd>\n\n\n\t\t\t\t\n<dt><a class=\"samples\" href=\"dialog/dialog.html\">Using the JavaScript API to customize dialog windows</a></dt>\n<dd>Using the dialog windows API to customize dialog windows without changing the original editor code.</dd>\n\n<dt><a class=\"samples\" href=\"enterkey/enterkey.html\">Using the &quot;Enter&quot; key in CKEditor</a></dt>\n<dd>Configuring the behavior of <em>Enter</em> and <em>Shift+Enter</em> keys.</dd>\n\n<dt><a class=\"samples\" href=\"htmlwriter/outputforflash.html\">Output for Flash</a></dt>\n<dd>Configuring CKEditor to produce HTML code that can be used with Adobe Flash.</dd>\n\n<dt><a class=\"samples\" href=\"htmlwriter/outputhtml.html\">Output HTML</a></dt>\n<dd>Configuring CKEditor to produce legacy HTML 4 code.</dd>\n\n<dt><a class=\"samples\" href=\"toolbar/toolbar.html\">Toolbar Configurations</a></dt>\n<dd>Configuring CKEditor to display full or custom toolbar layout.</dd>\n\n\t\t\t</dl>\n\t\t</div>\n\t</div>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico Knabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/inlineall.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Massive inline editing &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<script>\n\n\t\t// This code is generally not necessary, but it is here to demonstrate\n\t\t// how to customize specific editor instances on the fly. This fits well\n\t\t// this demo because we have editable elements (like headers) that\n\t\t// require less features.\n\n\t\t// The \"instanceCreated\" event is fired for every editor instance created.\n\t\tCKEDITOR.on( 'instanceCreated', function( event ) {\n\t\t\tvar editor = event.editor,\n\t\t\t\telement = editor.element;\n\n\t\t\t// Customize editors for headers and tag list.\n\t\t\t// These editors don't need features like smileys, templates, iframes etc.\n\t\t\tif ( element.is( 'h1', 'h2', 'h3' ) || element.getAttribute( 'id' ) == 'taglist' ) {\n\t\t\t\t// Customize the editor configurations on \"configLoaded\" event,\n\t\t\t\t// which is fired after the configuration file loading and\n\t\t\t\t// execution. This makes it possible to change the\n\t\t\t\t// configurations before the editor initialization takes place.\n\t\t\t\teditor.on( 'configLoaded', function() {\n\n\t\t\t\t\t// Remove unnecessary plugins to make the editor simpler.\n\t\t\t\t\teditor.config.removePlugins = 'colorbutton,find,flash,font,' +\n\t\t\t\t\t\t'forms,iframe,image,newpage,removeformat,' +\n\t\t\t\t\t\t'smiley,specialchar,stylescombo,templates';\n\n\t\t\t\t\t// Rearrange the layout of the toolbar.\n\t\t\t\t\teditor.config.toolbarGroups = [\n\t\t\t\t\t\t{ name: 'editing',\t\tgroups: [ 'basicstyles', 'links' ] },\n\t\t\t\t\t\t{ name: 'undo' },\n\t\t\t\t\t\t{ name: 'clipboard',\tgroups: [ 'selection', 'clipboard' ] },\n\t\t\t\t\t\t{ name: 'about' }\n\t\t\t\t\t];\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t</script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<style>\n\n\t\t/* The following styles are just to make the page look nice. */\n\n\t\t/* Workaround to show Arial Black in Firefox. */\n\t\t@font-face\n\t\t{\n\t\t\tfont-family: 'arial-black';\n\t\t\tsrc: local('Arial Black');\n\t\t}\n\n\t\t*[contenteditable=\"true\"]\n\t\t{\n\t\t\tpadding: 10px;\n\t\t}\n\n\t\t#container\n\t\t{\n\t\t\twidth: 960px;\n\t\t\tmargin: 30px auto 0;\n\t\t}\n\n\t\t#header\n\t\t{\n\t\t\toverflow: hidden;\n\t\t\tpadding: 0 0 30px;\n\t\t\tborder-bottom: 5px solid #05B2D2;\n\t\t\tposition: relative;\n\t\t}\n\n\t\t#headerLeft,\n\t\t#headerRight\n\t\t{\n\t\t\twidth: 49%;\n\t\t\toverflow: hidden;\n\t\t}\n\n\t\t#headerLeft\n\t\t{\n\t\t\tfloat: left;\n\t\t\tpadding: 10px 1px 1px;\n\t\t}\n\n\t\t#headerLeft h2,\n\t\t#headerLeft h3\n\t\t{\n\t\t\ttext-align: right;\n\t\t\tmargin: 0;\n\t\t\toverflow: hidden;\n\t\t\tfont-weight: normal;\n\t\t}\n\n\t\t#headerLeft h2\n\t\t{\n\t\t\tfont-family: \"Arial Black\",arial-black;\n\t\t\tfont-size: 4.6em;\n\t\t\tline-height: 1.1;\n\t\t\ttext-transform: uppercase;\n\t\t}\n\n\t\t#headerLeft h3\n\t\t{\n\t\t\tfont-size: 2.3em;\n\t\t\tline-height: 1.1;\n\t\t\tmargin: .2em 0 0;\n\t\t\tcolor: #666;\n\t\t}\n\n\t\t#headerRight\n\t\t{\n\t\t\tfloat: right;\n\t\t\tpadding: 1px;\n\t\t}\n\n\t\t#headerRight p\n\t\t{\n\t\t\tline-height: 1.8;\n\t\t\ttext-align: justify;\n\t\t\tmargin: 0;\n\t\t}\n\n\t\t#headerRight p + p\n\t\t{\n\t\t\tmargin-top: 20px;\n\t\t}\n\n\t\t#headerRight > div\n\t\t{\n\t\t\tpadding: 20px;\n\t\t\tmargin: 0 0 0 30px;\n\t\t\tfont-size: 1.4em;\n\t\t\tcolor: #666;\n\t\t}\n\n\t\t#columns\n\t\t{\n\t\t\tcolor: #333;\n\t\t\toverflow: hidden;\n\t\t\tpadding: 20px 0;\n\t\t}\n\n\t\t#columns > div\n\t\t{\n\t\t\tfloat: left;\n\t\t\twidth: 33.3%;\n\t\t}\n\n\t\t#columns #column1 > div\n\t\t{\n\t\t\tmargin-left: 1px;\n\t\t}\n\n\t\t#columns #column3 > div\n\t\t{\n\t\t\tmargin-right: 1px;\n\t\t}\n\n\t\t#columns > div > div\n\t\t{\n\t\t\tmargin: 0px 10px;\n\t\t\tpadding: 10px 20px;\n\t\t}\n\n\t\t#columns blockquote\n\t\t{\n\t\t\tmargin-left: 15px;\n\t\t}\n\n\t\t#tagLine\n\t\t{\n\t\t\tborder-top: 5px solid #05B2D2;\n\t\t\tpadding-top: 20px;\n\t\t}\n\n\t\t#taglist {\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-left: 20px;\n\t\t\tfont-weight: bold;\n\t\t\tmargin: 0 0 0 20px;\n\t\t}\n\n\t</style>\n</head>\n<body>\n<div>\n\t<h1 class=\"samples\"><a href=\"index.html\">CKEditor Samples</a> &raquo; Massive inline editing</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/inline.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>This sample page demonstrates the inline editing feature - CKEditor instances will be created automatically from page elements with <strong>contentEditable</strong> attribute set to value <strong>true</strong>:</p>\n\t\t<pre class=\"samples\">&lt;div <strong>contenteditable=\"true</strong>\" &gt; ... &lt;/div&gt;</pre>\n\t\t<p>Click inside of any element below to start editing.</p>\n\t</div>\n</div>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\t<div id=\"headerLeft\">\n\t\t\t<h2 id=\"sampleTitle\" contenteditable=\"true\">\n\t\t\t\tCKEditor<br> Goes Inline!\n\t\t\t</h2>\n\t\t\t<h3 contenteditable=\"true\">\n\t\t\t\tLorem ipsum dolor sit amet dolor duis blandit vestibulum faucibus a, tortor.\n\t\t\t</h3>\n\t\t</div>\n\t\t<div id=\"headerRight\">\n\t\t\t<div contenteditable=\"true\">\n\t\t\t\t<p>\n\t\t\t\t\tLorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies.\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\tCurabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div id=\"columns\">\n\t\t<div id=\"column1\">\n\t\t\t<div contenteditable=\"true\">\n\t\t\t\t<h3>\n\t\t\t\t\tFusce vitae porttitor\n\t\t\t\t</h3>\n\t\t\t\t<p>\n\t\t\t\t\t<strong>\n\t\t\t\t\t\tLorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor.\n\t\t\t\t\t</strong>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\tProin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum <a href=\"http://ckeditor.com/\">nisl nulla sem in</a> metus. Maecenas wisi. Donec nec erat volutpat.\n\t\t\t\t</p>\n\t\t\t\t<blockquote>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tFusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium.\n\t\t\t\t\t\tVehicula vitae, imperdiet vel, ornare enim vel sodales rutrum\n\t\t\t\t\t</p>\n\t\t\t\t</blockquote>\n\t\t\t\t<blockquote>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tLibero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin fringilla. Phasellus ultrices, velit ac arcu.\n\t\t\t\t\t</p>\n\t\t\t\t</blockquote>\n\t\t\t\t<p>Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.</p>\n\t\t\t\t<p><s>Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.</s></p>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"column2\">\n\t\t\t<div contenteditable=\"true\">\n\t\t\t\t<h3>\n\t\t\t\t\tInteger condimentum sit amet\n\t\t\t\t</h3>\n\t\t\t\t<p>\n\t\t\t\t\t<strong>Aenean nonummy a, mattis varius. Cras aliquet.</strong>\n\t\t\t\t\tPraesent <a href=\"http://ckeditor.com/\">magna non mattis ac, rhoncus nunc</a>, rhoncus eget, cursus pulvinar mollis.</p>\n\t\t\t\t<p>Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.</p>\n\t\t\t\t<p>Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.</p>\n\t\t\t</div>\n\t\t\t<div contenteditable=\"true\">\n\t\t\t\t<h3>\n\t\t\t\t\tPraesent wisi accumsan sit amet nibh\n\t\t\t\t</h3>\n\t\t\t\t<p>Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.</p>\n\t\t\t\t<p style=\"margin-left: 40px; \">Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce <a href=\"http://ckeditor.com/\">gravida, erat vitae augue</a>. Fusce urna fringilla gravida.</p>\n\t\t\t\t<p>In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.</p>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"column3\">\n\t\t\t<div contenteditable=\"true\">\n\t\t\t\t<p>\n\t\t\t\t\t<img src=\"assets/inlineall/logo.png\" alt=\"CKEditor logo\" style=\"float:left\">\n\t\t\t\t</p>\n\t\t\t\t<p>Quisque justo neque, mattis sed, fermentum ultrices <strong>posuere cubilia Curae</strong>, Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.</p>\n\t\t\t\t<h3>\n\t\t\t\t\tNullam laoreet vel consectetuer tellus suscipit\n\t\t\t\t</h3>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.</li>\n\t\t\t\t\t<li>Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi.</li>\n\t\t\t\t\t<li>Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Quisque justo neque, mattis sed, <a href=\"http://ckeditor.com/\">fermentum ultrices posuere cubilia</a> Curae, Vestibulum elit metus, quis placerat ut, lectus.</p>\n\t\t\t\t<p>Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis.</p>\n\t\t\t\t<p>Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div id=\"tagLine\">\n\t\tTags of this article:\n\t\t<p id=\"taglist\" contenteditable=\"true\">\n\t\t\tinline, editing, floating, CKEditor\n\t\t</p>\n\t</div>\n</div>\n<div id=\"footer\">\n\t<hr>\n\t<p>\n\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">\n\t\t\thttp://ckeditor.com</a>\n\t</p>\n\t<p id=\"copy\">\n\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a>\n\t\t- Frederico Knabben. All rights reserved.\n\t</p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/inlinebycode.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Inline Editing by Code &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<style>\n\n\t\t#editable\n\t\t{\n\t\t\tpadding: 10px;\n\t\t\tfloat: left;\n\t\t}\n\n\t</style>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Inline Editing by Code\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/inline.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to create an inline editor instance of CKEditor. It is created\n\t\t\twith a JavaScript call using the following code:\n\t\t</p>\n<pre class=\"samples\">\n// This property tells CKEditor to not activate every element with contenteditable=true element.\nCKEDITOR.disableAutoInline = true;\n\nvar editor = CKEDITOR.inline( document.getElementById( 'editable' ) );\n</pre>\n\t\t<p>\n\t\t\tNote that <code>editable</code> in the code above is the <code>id</code>\n\t\t\tattribute of the <code>&lt;div&gt;</code> element to be converted into an inline instance.\n\t\t</p>\n\t</div>\n\t<div id=\"editable\" contenteditable=\"true\">\n\t\t<h1><img alt=\"Saturn V carrying Apollo 11\" class=\"right\" src=\"assets/sample.jpg\" /> Apollo 11</h1>\n\n\t\t<p><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a href=\"http://en.wikipedia.org/wiki/Neil_Armstrong\" title=\"Neil Armstrong\">Neil Armstrong</a> and <a href=\"http://en.wikipedia.org/wiki/Buzz_Aldrin\" title=\"Buzz Aldrin\">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</p>\n\n\t\t<p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third member of the mission, <a href=\"http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)\" title=\"Michael Collins (astronaut)\">Michael Collins</a>, piloted the <a href=\"http://en.wikipedia.org/wiki/Apollo_Command/Service_Module\" title=\"Apollo Command/Service Module\">command</a> spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.</p>\n\n\t\t<h2>Broadcasting and <em>quotes</em> <a id=\"quotes\" name=\"quotes\"></a></h2>\n\n\t\t<p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:</p>\n\n\t\t<blockquote>\n\t\t\t<p>One small step for [a] man, one giant leap for mankind.</p>\n\t\t</blockquote>\n\n\t\t<p>Apollo 11 effectively ended the <a href=\"http://en.wikipedia.org/wiki/Space_Race\" title=\"Space Race\">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a href=\"http://en.wikipedia.org/wiki/John_F._Kennedy\" title=\"John F. Kennedy\">John F. Kennedy</a> in a speech before the United States Congress:</p>\n\n\t\t<blockquote>\n\t\t\t<p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p>\n\t\t</blockquote>\n\n\t\t<h2>Technical details <a id=\"tech-details\" name=\"tech-details\"></a></h2>\n\n\t\t<table align=\"right\" border=\"1\" bordercolor=\"#ccc\" cellpadding=\"5\" cellspacing=\"0\" style=\"border-collapse:collapse;margin:10px 0 10px 15px;\">\n\t\t\t<caption><strong>Mission crew</strong></caption>\n\t\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"col\">Position</th>\n\t\t\t\t<th scope=\"col\">Astronaut</th>\n\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td>Commander</td>\n\t\t\t\t<td>Neil A. Armstrong</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Command Module Pilot</td>\n\t\t\t\t<td>Michael Collins</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>Lunar Module Pilot</td>\n\t\t\t\t<td>Edwin &quot;Buzz&quot; E. Aldrin, Jr.</td>\n\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\n\t\t<p>Launched by a <strong>Saturn V</strong> rocket from <a href=\"http://en.wikipedia.org/wiki/Kennedy_Space_Center\" title=\"Kennedy Space Center\">Kennedy Space Center</a> in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of <a href=\"http://en.wikipedia.org/wiki/NASA\" title=\"NASA\">NASA</a>&#39;s Apollo program. The Apollo spacecraft had three parts:</p>\n\n\t\t<ol>\n\t\t\t<li><strong>Command Module</strong> with a cabin for the three astronauts which was the only part which landed back on Earth</li>\n\t\t\t<li><strong>Service Module</strong> which supported the Command Module with propulsion, electrical power, oxygen and water</li>\n\t\t\t<li><strong>Lunar Module</strong> for landing on the Moon.</li>\n\t\t</ol>\n\n\t\t<p>After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the <a href=\"http://en.wikipedia.org/wiki/Mare_Tranquillitatis\" title=\"Mare Tranquillitatis\">Sea of Tranquility</a>. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the <a href=\"http://en.wikipedia.org/wiki/Pacific_Ocean\" title=\"Pacific Ocean\">Pacific Ocean</a> on July 24.</p>\n\n\t\t<hr />\n\t\t<p style=\"text-align: right;\"><small>Source: <a href=\"http://en.wikipedia.org/wiki/Apollo_11\">Wikipedia.org</a></small></p>\n\t</div>\n\n\t<script>\n\t\t// We need to turn off the automatic editor creation first.\n\t\tCKEDITOR.disableAutoInline = true;\n\n\t\tvar editor = CKEDITOR.inline( 'editable' );\n\t</script>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p contenteditable=\"true\">\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">\n\t\t\t\thttp://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a>\n\t\t\t- Frederico Knabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/inlinetextarea.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Replace Textarea with Inline Editor &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<style>\n\n\t\t/* Style the CKEditor element to look like a textfield */\n\t\t.cke_textarea_inline\n\t\t{\n\t\t\tpadding: 10px;\n\t\t\theight: 200px;\n\t\t\toverflow: auto;\n\n\t\t\tborder: 1px solid gray;\n\t\t\t-webkit-appearance: textfield;\n\t\t}\n\n\t</style>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Replace Textarea with Inline Editor\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/inline.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tYou can also create an inline editor from a <code>textarea</code>\n\t\t\telement. In this case the <code>textarea</code> will be replaced\n\t\t\tby a <code>div</code> element with inline editing enabled.\n\t\t</p>\n<pre class=\"samples\">\n// \"article-body\" is the name of a textarea element.\nvar editor = CKEDITOR.inline( 'article-body' );\n</pre>\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<h2>This is a sample form with some fields</h2>\n\t\t<p>\n\t\t\tTitle:<br>\n\t\t\t<input type=\"text\" name=\"title\" value=\"Sample Form\"></p>\n\t\t<p>\n\t\t\tArticle Body (Textarea converted to CKEditor):<br>\n\t\t\t<textarea name=\"article-body\" style=\"height: 200px\">\n\t\t\t\t&lt;h2&gt;Technical details &lt;a id=\"tech-details\" name=\"tech-details\"&gt;&lt;/a&gt;&lt;/h2&gt;\n\n\t\t\t\t&lt;table align=\"right\" border=\"1\" bordercolor=\"#ccc\" cellpadding=\"5\" cellspacing=\"0\" style=\"border-collapse:collapse;margin:10px 0 10px 15px;\"&gt;\n\t\t\t\t\t&lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt;\n\t\t\t\t\t&lt;thead&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;th scope=\"col\"&gt;Position&lt;/th&gt;\n\t\t\t\t\t\t&lt;th scope=\"col\"&gt;Astronaut&lt;/th&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t&lt;/thead&gt;\n\t\t\t\t\t&lt;tbody&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;Commander&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;Neil A. Armstrong&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;Command Module Pilot&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;Michael Collins&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;Lunar Module Pilot&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;Edwin &quot;Buzz&quot; E. Aldrin, Jr.&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t&lt;/tbody&gt;\n\t\t\t\t&lt;/table&gt;\n\n\t\t\t\t&lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=\"http://en.wikipedia.org/wiki/Kennedy_Space_Center\" title=\"Kennedy Space Center\"&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=\"http://en.wikipedia.org/wiki/NASA\" title=\"NASA\"&gt;NASA&lt;/a&gt;&#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt;\n\n\t\t\t\t&lt;ol&gt;\n\t\t\t\t\t&lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt;\n\t\t\t\t\t&lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt;\n\t\t\t\t\t&lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt;\n\t\t\t\t&lt;/ol&gt;\n\n\t\t\t\t&lt;p&gt;After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=\"http://en.wikipedia.org/wiki/Mare_Tranquillitatis\" title=\"Mare Tranquillitatis\"&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=\"http://en.wikipedia.org/wiki/Pacific_Ocean\" title=\"Pacific Ocean\"&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt;\n\n\t\t\t\t&lt;hr /&gt;\n\t\t\t\t&lt;p style=\"text-align: right;\"&gt;&lt;small&gt;Source: &lt;a href=\"http://en.wikipedia.org/wiki/Apollo_11\"&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t\t</textarea>\n\t\t</p>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\n\t<script>\n\t\tCKEDITOR.inline( 'article-body' );\n\t</script>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">\n\t\t\t\thttp://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a>\n\t\t\t- Frederico Knabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/jquery.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>jQuery Adapter &mdash; CKEditor Sample</title>\n\t<script src=\"http://code.jquery.com/jquery-1.11.0.min.js\"></script>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<script src=\"../../adapters/jquery.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<style>\n\n\t\t#editable\n\t\t{\n\t\t\tpadding: 10px;\n\t\t\tfloat: left;\n\t\t}\n\n\t</style>\n\t<script>\n\n\t\tCKEDITOR.disableAutoInline = true;\n\n\t\t$( document ).ready( function() {\n\t\t\t$( '#editor1' ).ckeditor(); // Use CKEDITOR.replace() if element is <textarea>.\n\t\t\t$( '#editable' ).ckeditor(); // Use CKEDITOR.inline().\n\t\t} );\n\n\t\tfunction setValue() {\n\t\t\t$( '#editor1' ).val( $( 'input#val' ).val() );\n\t\t}\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\" id=\"a-test\">CKEditor Samples</a> &raquo; Create Editors with jQuery\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis sample shows how to use the <a href=\"http://docs.ckeditor.com/#!/guide/dev_jquery\">jQuery adapter</a>.\n\t\t\t\tNote that you have to include both CKEditor and jQuery scripts before including the adapter.\n\t\t\t</p>\n\n<pre class=\"samples\">\n&lt;script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js\"&gt;&lt;/script&gt;\n&lt;script src=\"/ckedit../../ckeditor.js\"&gt;&lt;/script&gt;\n&lt;script src=\"/ckeditor/adapters/jquery.js\"&gt;&lt;/script&gt;\n</pre>\n\n\t\t\t<p>Then you can replace HTML elements with a CKEditor instance using the <code>ckeditor()</code> method.</p>\n\n<pre class=\"samples\">\n$( document ).ready( function() {\n\t$( 'textarea#editor1' ).ckeditor();\n} );\n</pre>\n\t\t</div>\n\n\t\t<h2 class=\"samples\">Inline Example</h2>\n\n\t\t<div id=\"editable\" contenteditable=\"true\">\n\t\t\t<p><img alt=\"Saturn V carrying Apollo 11\" class=\"right\" src=\"assets/sample.jpg\"/><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a href=\"http://en.wikipedia.org/wiki/Neil_Armstrong\" title=\"Neil Armstrong\">Neil Armstrong</a> and <a href=\"http://en.wikipedia.org/wiki/Buzz_Aldrin\" title=\"Buzz Aldrin\">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</p>\n\t\t\t<p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third member of the mission, <a href=\"http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)\" title=\"Michael Collins (astronaut)\">Michael Collins</a>, piloted the <a href=\"http://en.wikipedia.org/wiki/Apollo_Command/Service_Module\" title=\"Apollo Command/Service Module\">command</a> spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.\n\t\t\t<p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:</p>\n\t\t\t<blockquote><p>One small step for [a] man, one giant leap for mankind.</p></blockquote> <p>Apollo 11 effectively ended the <a href=\"http://en.wikipedia.org/wiki/Space_Race\" title=\"Space Race\">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a href=\"http://en.wikipedia.org/wiki/John_F._Kennedy\" title=\"John F. Kennedy\">John F. Kennedy</a> in a speech before the United States Congress:</p> <blockquote><p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p></blockquote>\n\t\t</div>\n\n\t\t<br style=\"clear: both\">\n\n\t\t<h2 class=\"samples\">Classic (iframe-based) Example</h2>\n\n\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">\n\t\t\t&lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\n\t\t<p style=\"overflow: hidden\">\n\t\t\t<input style=\"float: left\" type=\"submit\" value=\"Submit\">\n\t\t\t<span style=\"float: right\">\n\t\t\t\t<input type=\"text\" id=\"val\" value=\"I'm using jQuery val()!\" size=\"30\">\n\t\t\t\t<input onclick=\"setValue();\" type=\"button\" value=\"Set value\">\n\t\t\t</span>\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/magicline/magicline.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Using Magicline plugin &mdash; CKEditor Sample</title>\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"../../../samples/old/sample.css\">\n\t<meta name=\"ckeditor-sample-name\" content=\"Magicline plugin\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Plugins\">\n\t<meta name=\"ckeditor-sample-description\" content=\"Using the Magicline plugin to access difficult focus spaces.\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; Using Magicline plugin\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/magicline.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows the advantages of <strong>Magicline</strong> plugin\n\t\t\twhich is to enhance the editing process. Thanks to this plugin,\n\t\t\ta number of difficult focus spaces which are inaccessible due to\n\t\t\tbrowser issues can now be focused.\n\t\t</p>\n\t\t<p>\n\t\t\t<strong>Magicline</strong> plugin shows a red line with a handler\n\t\t\twhich, when clicked, inserts a paragraph and allows typing. To see this,\n\t\t\tfocus an editor and move your mouse above the focus space you want\n\t\t\tto access. The plugin is enabled by default so no additional\n\t\t\tconfiguration is necessary.\n\t\t</p>\n\t</div>\n\t<div>\n\t\t<label for=\"editor1\">\n\t\t\tEditor 1:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor uses a default <strong>Magicline</strong> setup.\n\t\t\t</p>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">\n\t\t\t&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;\n\t\t\t\t&lt;tbody&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;This table&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;is the&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;very first&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;element of the document.&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;We are still&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;able to acces&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;the space before it.&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;\n\t\t\t\t\t\t&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;\n\t\t\t\t\t\t\t&lt;tbody&gt;\n\t\t\t\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t\t\t\t&lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;\n\t\t\t\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t\t\t\t&lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;\n\t\t\t\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t\t\t&lt;/tbody&gt;\n\t\t\t\t\t\t&lt;/table&gt;\n\t\t\t\t\t\t&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t&lt;/tbody&gt;\n\t\t\t&lt;/table&gt;\n\n\t\t\t&lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;\n\n\t\t\t&lt;hr /&gt;\n\t\t\t&lt;hr /&gt;\n\t\t\t&lt;ol&gt;\n\t\t\t\t&lt;li&gt;This numbered list...&lt;/li&gt;\n\t\t\t\t&lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;\n\t\t\t\t&lt;li&gt;...and another list.&lt;/li&gt;\n\t\t\t&lt;/ol&gt;\n\n\t\t\t&lt;ul&gt;\n\t\t\t\t&lt;li&gt;We can type between the lists...&lt;/li&gt;\n\t\t\t\t&lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;\n\t\t\t&lt;/ul&gt;\n\n\t\t\t&lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;\n\n\t\t\t&lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;\n\n\t\t\t&lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;\n\n\t\t\t&lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;\n\t\t\t&lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;\n\t\t\t&lt;/div&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\t// This call can be placed at any point after the\n\t\t\t// <textarea>, or inside a <head><script> in a\n\t\t\t// window.onload event handler.\n\n\t\t\tCKEDITOR.replace( 'editor1', {\n\t\t\t\textraPlugins: 'magicline',\t// Ensure that magicline plugin, which is required for this sample, is loaded.\n\t\t\t\tallowedContent: true\t\t// Switch off the ACF, so very complex content created to\n\t\t\t\t\t\t\t\t\t\t\t// show magicline's power isn't filtered.\n\t\t\t} );\n\n\t\t</script>\n\t</div>\n\t<br>\n\t<div>\n\t\t<label for=\"editor2\">\n\t\t\tEditor 2:\n\t\t</label>\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using a blue line.\n\t\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( 'editor2', {\n\tmagicline_color: 'blue'\n});</pre>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor2\" name=\"editor2\" rows=\"10\">\n\t\t\t&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;\n\t\t\t\t&lt;tbody&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;This table&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;is the&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;very first&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;element of the document.&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t&lt;td&gt;We are still&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;able to acces&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;the space before it.&lt;/td&gt;\n\t\t\t\t\t\t&lt;td&gt;\n\t\t\t\t\t\t&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;\n\t\t\t\t\t\t\t&lt;tbody&gt;\n\t\t\t\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t\t\t\t&lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;\n\t\t\t\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t\t\t\t&lt;tr&gt;\n\t\t\t\t\t\t\t\t\t&lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;\n\t\t\t\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t\t\t\t&lt;/tbody&gt;\n\t\t\t\t\t\t&lt;/table&gt;\n\t\t\t\t\t\t&lt;/td&gt;\n\t\t\t\t\t&lt;/tr&gt;\n\t\t\t\t&lt;/tbody&gt;\n\t\t\t&lt;/table&gt;\n\n\t\t\t&lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;\n\n\t\t\t&lt;hr /&gt;\n\t\t\t&lt;hr /&gt;\n\t\t\t&lt;ol&gt;\n\t\t\t\t&lt;li&gt;This numbered list...&lt;/li&gt;\n\t\t\t\t&lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;\n\t\t\t\t&lt;li&gt;...and another list.&lt;/li&gt;\n\t\t\t&lt;/ol&gt;\n\n\t\t\t&lt;ul&gt;\n\t\t\t\t&lt;li&gt;We can type between the lists...&lt;/li&gt;\n\t\t\t\t&lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;\n\t\t\t&lt;/ul&gt;\n\n\t\t\t&lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;\n\n\t\t\t&lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;\n\n\t\t\t&lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;\n\n\t\t\t&lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;\n\t\t\t&lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;\n\t\t\t&lt;/div&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\t// This call can be placed at any point after the\n\t\t\t// <textarea>, or inside a <head><script> in a\n\t\t\t// window.onload event handler.\n\n\t\t\tCKEDITOR.replace( 'editor2', {\n\t\t\t\textraPlugins: 'magicline',\t// Ensure that magicline plugin, which is required for this sample, is loaded.\n\t\t\t\tmagicline_color: 'blue',\t// Blue line\n\t\t\t\tallowedContent: true\t\t// Switch off the ACF, so very complex content created to\n\t\t\t\t\t\t\t\t\t\t\t// show magicline's power isn't filtered.\n\t\t\t});\n\n\t\t</script>\n\t</div>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/readonly.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Using the CKEditor Read-Only API &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n\t<script>\n\n\t\tvar editor;\n\n\t\t// The instanceReady event is fired, when an instance of CKEditor has finished\n\t\t// its initialization.\n\t\tCKEDITOR.on( 'instanceReady', function( ev ) {\n\t\t\teditor = ev.editor;\n\n\t\t\t// Show this \"on\" button.\n\t\t\tdocument.getElementById( 'readOnlyOn' ).style.display = '';\n\n\t\t\t// Event fired when the readOnly property changes.\n\t\t\teditor.on( 'readOnly', function() {\n\t\t\t\tdocument.getElementById( 'readOnlyOn' ).style.display = this.readOnly ? 'none' : '';\n\t\t\t\tdocument.getElementById( 'readOnlyOff' ).style.display = this.readOnly ? '' : 'none';\n\t\t\t});\n\t\t});\n\n\t\tfunction toggleReadOnly( isReadOnly ) {\n\t\t\t// Change the read-only state of the editor.\n\t\t\t// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly\n\t\t\teditor.setReadOnly( isReadOnly );\n\t\t}\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Using the CKEditor Read-Only API\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/readonly.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to use the\n\t\t\t<code><a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly\">setReadOnly</a></code>\n\t\t\tAPI to put editor into the read-only state that makes it impossible for users to change the editor contents.\n\t\t</p>\n\t\t<p>\n\t\t\tFor details on how to create this setup check the source code of this sample page.\n\t\t</p>\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<p>\n\t\t\t<textarea class=\"ckeditor\" id=\"editor1\" name=\"editor1\" cols=\"100\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t</p>\n\t\t<p>\n\t\t\t<input id=\"readOnlyOn\" onclick=\"toggleReadOnly();\" type=\"button\" value=\"Make it read-only\" style=\"display:none\">\n\t\t\t<input id=\"readOnlyOff\" onclick=\"toggleReadOnly( false );\" type=\"button\" value=\"Make it editable again\" style=\"display:none\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/replacebyclass.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Replace Textareas by Class Name &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Replace Textarea Elements by Class Name\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"http://sdk.ckeditor.com/\">brand new samples in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to automatically replace all <code>&lt;textarea&gt;</code> elements\n\t\t\tof a given class with a CKEditor instance.\n\t\t</p>\n\t\t<p>\n\t\t\tTo replace a <code>&lt;textarea&gt;</code> element, simply assign it the <code>ckeditor</code>\n\t\t\tclass, as in the code below:\n\t\t</p>\n<pre class=\"samples\">\n&lt;textarea <strong>class=\"ckeditor</strong>\" name=\"editor1\"&gt;&lt;/textarea&gt;\n</pre>\n\t\t<p>\n\t\t\tNote that other <code>&lt;textarea&gt;</code> attributes (like <code>id</code> or <code>name</code>) need to be adjusted to your document.\n\t\t</p>\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<p>\n\t\t\t<label for=\"editor1\">\n\t\t\t\tEditor 1:\n\t\t\t</label>\n\t\t\t<textarea class=\"ckeditor\" cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">\n\t\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t\t</textarea>\n\t\t</p>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/replacebycode.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Replace Textarea by Code &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Replace Textarea Elements Using JavaScript Code\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/classic.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<div class=\"description\">\n\t\t\t<p>\n\t\t\t\tThis editor is using an <code>&lt;iframe&gt;</code> element-based editing area, provided by the <strong>Wysiwygarea</strong> plugin.\n\t\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>' )\n</pre>\n\t\t</div>\n\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\t// This call can be placed at any point after the\n\t\t\t// <textarea>, or inside a <head><script> in a\n\t\t\t// window.onload event handler.\n\n\t\t\t// Replace the <textarea id=\"editor\"> with an CKEditor\n\t\t\t// instance, using default configurations.\n\n\t\t\tCKEDITOR.replace( 'editor1' );\n\n\t\t</script>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/sample.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n\nhtml, body, h1, h2, h3, h4, h5, h6, div, span, blockquote, p, address, form, fieldset, img, ul, ol, dl, dt, dd, li, hr, table, td, th, strong, em, sup, sub, dfn, ins, del, q, cite, var, samp, code, kbd, tt, pre\n{\n\tline-height: 1.5;\n}\n\nbody\n{\n\tpadding: 10px 30px;\n}\n\ninput, textarea, select, option, optgroup, button, td, th\n{\n\tfont-size: 100%;\n}\n\npre\n{\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\npre, code, kbd, samp, tt\n{\n\tfont-family: monospace,monospace;\n\tfont-size: 1em;\n}\n\nbody {\n\twidth: 960px;\n\tmargin: 0 auto;\n}\n\ncode\n{\n\tbackground: #f3f3f3;\n\tborder: 1px solid #ddd;\n\tpadding: 1px 4px;\n\tborder-radius: 3px;\n}\n\nabbr\n{\n\tborder-bottom: 1px dotted #555;\n\tcursor: pointer;\n}\n\n.new, .beta\n{\n\ttext-transform: uppercase;\n\tfont-size: 10px;\n\tfont-weight: bold;\n\tpadding: 1px 4px;\n\tmargin: 0 0 0 5px;\n\tcolor: #fff;\n\tfloat: right;\n\tborder-radius: 3px;\n}\n\n.new\n{\n\tbackground: #FF7E00;\n\tborder: 1px solid #DA8028;\n\ttext-shadow: 0 1px 0 #C97626;\n\n\tbox-shadow: 0 2px 3px 0 #FFA54E inset;\n}\n\n.beta\n{\n\tbackground: #18C0DF;\n\tborder: 1px solid #19AAD8;\n\ttext-shadow: 0 1px 0 #048CAD;\n\tfont-style: italic;\n\n\tbox-shadow: 0 2px 3px 0 #50D4FD inset;\n}\n\nh1.samples\n{\n\tcolor: #0782C1;\n\tfont-size: 200%;\n\tfont-weight: normal;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nh1.samples a\n{\n\tcolor: #0782C1;\n\ttext-decoration: none;\n\tborder-bottom: 1px dotted #0782C1;\n}\n\n.samples a:hover\n{\n\tborder-bottom: 1px dotted #0782C1;\n}\n\nh2.samples\n{\n\tcolor: #000000;\n\tfont-size: 130%;\n\tmargin: 15px 0 0 0;\n\tpadding: 0;\n}\n\np, blockquote, address, form, pre, dl, h1.samples, h2.samples\n{\n\tmargin-bottom: 15px;\n}\n\nul.samples\n{\n\tmargin-bottom: 15px;\n}\n\n.clear\n{\n\tclear: both;\n}\n\nfieldset\n{\n\tmargin: 0;\n\tpadding: 10px;\n}\n\nbody, input, textarea\n{\n\tcolor: #333333;\n\tfont-family: Arial, Helvetica, sans-serif;\n}\n\nbody\n{\n\tfont-size: 75%;\n}\n\na.samples\n{\n\tcolor: #189DE1;\n\ttext-decoration: none;\n}\n\nform\n{\n\tmargin: 0;\n\tpadding: 0;\n}\n\npre.samples\n{\n\tbackground-color: #F7F7F7;\n\tborder: 1px solid #D7D7D7;\n\toverflow: auto;\n\tpadding: 0.25em;\n\twhite-space: pre-wrap; /* CSS 2.1 */\n\tword-wrap: break-word; /* IE7 */\n}\n\n#footer\n{\n\tclear: both;\n\tpadding-top: 10px;\n}\n\n#footer hr\n{\n\tmargin: 10px 0 15px 0;\n\theight: 1px;\n\tborder: solid 1px gray;\n\tborder-bottom: none;\n}\n\n#footer p\n{\n\tmargin: 0 10px 10px 10px;\n\tfloat: left;\n}\n\n#footer #copy\n{\n\tfloat: right;\n}\n\n#outputSample\n{\n\twidth: 100%;\n\ttable-layout: fixed;\n}\n\n#outputSample thead th\n{\n\tcolor: #dddddd;\n\tbackground-color: #999999;\n\tpadding: 4px;\n\twhite-space: nowrap;\n}\n\n#outputSample tbody th\n{\n\tvertical-align: top;\n\ttext-align: left;\n}\n\n#outputSample pre\n{\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.description\n{\n\tborder: 1px dotted #B7B7B7;\n\tmargin-bottom: 10px;\n\tpadding: 10px 10px 0;\n\toverflow: hidden;\n}\n\nlabel\n{\n\tdisplay: block;\n\tmargin-bottom: 6px;\n}\n\n/**\n *\tCKEditor editables are automatically set with the \"cke_editable\" class\n *\tplus cke_editable_(inline|themed) depending on the editor type.\n */\n\n/* Style a bit the inline editables. */\n.cke_editable.cke_editable_inline\n{\n\tcursor: pointer;\n}\n\n/* Once an editable element gets focused, the \"cke_focus\" class is\n   added to it, so we can style it differently. */\n.cke_editable.cke_editable_inline.cke_focus\n{\n\tbox-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000;\n\toutline: none;\n\tbackground: #eee;\n\tcursor: text;\n}\n\n/* Avoid pre-formatted overflows inline editable. */\n.cke_editable_inline pre\n{\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n/**\n *\tSamples index styles.\n */\n\n.twoColumns,\n.twoColumnsLeft,\n.twoColumnsRight\n{\n\toverflow: hidden;\n}\n\n.twoColumnsLeft,\n.twoColumnsRight\n{\n\twidth: 45%;\n}\n\n.twoColumnsLeft\n{\n\tfloat: left;\n}\n\n.twoColumnsRight\n{\n\tfloat: right;\n}\n\ndl.samples\n{\n\tpadding: 0 0 0 40px;\n}\ndl.samples > dt\n{\n\tdisplay: list-item;\n\tlist-style-type: disc;\n\tlist-style-position: outside;\n\tmargin: 0 0 3px;\n}\ndl.samples > dd\n{\n\tmargin: 0 0 3px;\n}\n.warning\n{\n\tcolor: #ff0000;\n\tbackground-color: #FFCCBA;\n\tborder: 2px dotted #ff0000;\n\tpadding: 15px 10px;\n\tmargin: 10px 0;\n}\n\n.warning.deprecated {\n\tfont-size: 1.3em;\n}\n\n/* Used on inline samples */\n\nblockquote\n{\n\tfont-style: italic;\n\tfont-family: Georgia, Times, \"Times New Roman\", serif;\n\tpadding: 2px 0;\n\tborder-style: solid;\n\tborder-color: #ccc;\n\tborder-width: 0;\n}\n\n.cke_contents_ltr blockquote\n{\n\tpadding-left: 20px;\n\tpadding-right: 8px;\n\tborder-left-width: 5px;\n}\n\n.cke_contents_rtl blockquote\n{\n\tpadding-left: 8px;\n\tpadding-right: 20px;\n\tborder-right-width: 5px;\n}\n\nimg.right {\n\tborder: 1px solid #ccc;\n\tfloat: right;\n\tmargin-left: 15px;\n\tpadding: 5px;\n}\n\nimg.left {\n\tborder: 1px solid #ccc;\n\tfloat: left;\n\tmargin-right: 15px;\n\tpadding: 5px;\n}\n\n.marker\n{\n\tbackground-color: Yellow;\n}\n"
  },
  {
    "path": "assets/ckeditor/samples/old/sample.js",
    "content": "﻿/**\n * Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n\n// Tool scripts for the sample pages.\n// This file can be ignored and is not required to make use of CKEditor.\n\n( function() {\n\tCKEDITOR.on( 'instanceReady', function( ev ) {\n\t\t// Check for sample compliance.\n\t\tvar editor = ev.editor,\n\t\t\tmeta = CKEDITOR.document.$.getElementsByName( 'ckeditor-sample-required-plugins' ),\n\t\t\trequires = meta.length ? CKEDITOR.dom.element.get( meta[ 0 ] ).getAttribute( 'content' ).split( ',' ) : [],\n\t\t\tmissing = [],\n\t\t\ti;\n\n\t\tif ( requires.length ) {\n\t\t\tfor ( i = 0; i < requires.length; i++ ) {\n\t\t\t\tif ( !editor.plugins[ requires[ i ] ] )\n\t\t\t\t\tmissing.push( '<code>' + requires[ i ] + '</code>' );\n\t\t\t}\n\n\t\t\tif ( missing.length ) {\n\t\t\t\tvar warn = CKEDITOR.dom.element.createFromHtml(\n\t\t\t\t\t'<div class=\"warning\">' +\n\t\t\t\t\t\t'<span>To fully experience this demo, the ' + missing.join( ', ' ) + ' plugin' + ( missing.length > 1 ? 's are' : ' is' ) + ' required.</span>' +\n\t\t\t\t\t'</div>'\n\t\t\t\t);\n\t\t\t\twarn.insertBefore( editor.container );\n\t\t\t}\n\t\t}\n\n\t\t// Set icons.\n\t\tvar doc = new CKEDITOR.dom.document( document ),\n\t\t\ticons = doc.find( '.button_icon' );\n\n\t\tfor ( i = 0; i < icons.count(); i++ ) {\n\t\t\tvar icon = icons.getItem( i ),\n\t\t\t\tname = icon.getAttribute( 'data-icon' ),\n\t\t\t\tstyle = CKEDITOR.skin.getIconStyle( name, ( CKEDITOR.lang.dir == 'rtl' ) );\n\n\t\t\ticon.addClass( 'cke_button_icon' );\n\t\t\ticon.addClass( 'cke_button__' + name + '_icon' );\n\t\t\ticon.setAttribute( 'style', style );\n\t\t\ticon.setStyle( 'float', 'none' );\n\n\t\t}\n\t} );\n} )();\n"
  },
  {
    "path": "assets/ckeditor/samples/old/sample_posteddata.php",
    "content": "<?php /* <body><pre>\n\n-------------------------------------------------------------------------------------------\n  CKEditor - Posted Data\n\n  We are sorry, but your Web server does not support the PHP language used in this script.\n\n  Please note that CKEditor can be used with any other server-side language than just PHP.\n  To save the content created with CKEditor you need to read the POST data on the server\n  side and write it to a file or the database.\n\n  Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n  For licensing, see LICENSE.md or http://ckeditor.com/license\n-------------------------------------------------------------------------------------------\n\n</pre><div style=\"display:none\"></body> */ include \"assets/posteddata.php\"; ?>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/tabindex.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>TAB Key-Based Navigation &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n\t<style>\n\n\t\t.cke_focused,\n\t\t.cke_editable.cke_focused\n\t\t{\n\t\t\toutline: 3px dotted blue !important;\n\t\t\t*border: 3px dotted blue !important;\t/* For IE7 */\n\t\t}\n\n\t</style>\n\t<script>\n\n\t\tCKEDITOR.on( 'instanceReady', function( evt ) {\n\t\t\tvar editor = evt.editor;\n\t\t\teditor.setData( 'This editor has it\\'s tabIndex set to <strong>' + editor.tabIndex + '</strong>' );\n\n\t\t\t// Apply focus class name.\n\t\t\teditor.on( 'focus', function() {\n\t\t\t\teditor.container.addClass( 'cke_focused' );\n\t\t\t});\n\t\t\teditor.on( 'blur', function() {\n\t\t\t\teditor.container.removeClass( 'cke_focused' );\n\t\t\t});\n\n\t\t\t// Put startup focus on the first editor in tab order.\n\t\t\tif ( editor.tabIndex == 1 )\n\t\t\t\teditor.focus();\n\t\t});\n\n\t</script>\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; TAB Key-Based Navigation\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/tabindex.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how tab key navigation among editor instances is\n\t\t\taffected by the <code>tabIndex</code> attribute from\n\t\t\tthe original page element. Use TAB key to move between the editors.\n\t\t</p>\n\t</div>\n\t<p>\n\t\t<textarea class=\"ckeditor\" cols=\"80\" id=\"editor4\" rows=\"10\" tabindex=\"1\"></textarea>\n\t</p>\n\t<div class=\"ckeditor\" contenteditable=\"true\" id=\"editor1\" tabindex=\"4\"></div>\n\t<p>\n\t\t<textarea class=\"ckeditor\" cols=\"80\" id=\"editor2\" rows=\"10\" tabindex=\"2\"></textarea>\n\t</p>\n\t<p>\n\t\t<textarea class=\"ckeditor\" cols=\"80\" id=\"editor3\" rows=\"10\" tabindex=\"3\"></textarea>\n\t</p>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/toolbar/toolbar.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Toolbar Configuration &mdash; CKEditor Sample</title>\n\t<meta name=\"ckeditor-sample-name\" content=\"Toolbar Configurations\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Advanced Samples\">\n\t<meta name=\"ckeditor-sample-description\" content=\"Configuring CKEditor to display full or custom toolbar layout.\">\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<link href=\"../../../samples/old/sample.css\" rel=\"stylesheet\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; Toolbar Configuration\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out the <a href=\"../../../samples/toolbarconfigurator/index.html#basic\">brand new CKEditor Toolbar Configurator</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample page demonstrates editor with loaded <a href=\"#fullToolbar\">full toolbar</a> (all registered buttons) and, if\n\t\t\tcurrent editor's configuration modifies default settings, also editor with <a href=\"#currentToolbar\">modified toolbar</a>.\n\t\t</p>\n\n\t\t<p>Since CKEditor 4 there are two ways to configure toolbar buttons.</p>\n\n\t\t<h2 class=\"samples\">By <a href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbar\">config.toolbar</a></h2>\n\n\t\t<p>\n\t\t\tYou can explicitly define which buttons are displayed in which groups and in which order.\n\t\t\tThis is the more precise setting, but less flexible. If newly added plugin adds its\n\t\t\town button you'll have to add it manually to your <code>config.toolbar</code> setting as well.\n\t\t</p>\n\n\t\t<p>To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:</p>\n\n\t\t<pre class=\"samples\">\nCKEDITOR.replace( <em>'textarea_id'</em>, {\n\t<strong>toolbar:</strong> [\n\t\t{ name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] },\t// Defines toolbar group with name (used to create voice label) and items in 3 subgroups.\n\t\t[ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],\t\t\t// Defines toolbar group without name.\n\t\t'/',\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Line break - next group will be placed in new line.\n\t\t{ name: 'basicstyles', items: [ 'Bold', 'Italic' ] }\n\t]\n});</pre>\n\n\t\t<h2 class=\"samples\">By <a href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbarGroups\">config.toolbarGroups</a></h2>\n\n\t\t<p>\n\t\t\tYou can define which groups of buttons (like e.g. <code>basicstyles</code>, <code>clipboard</code>\n\t\t\tand <code>forms</code>) are displayed and in which order. Registered buttons are associated\n\t\t\twith toolbar groups by <code>toolbar</code> property in their definition.\n\t\t\tThis setting's advantage is that you don't have to modify toolbar configuration\n\t\t\twhen adding/removing plugins which register their own buttons.\n\t\t</p>\n\n\t\t<p>To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:</p>\n\n\t\t<pre class=\"samples\">\nCKEDITOR.replace( <em>'textarea_id'</em>, {\n\t<strong>toolbarGroups:</strong> [\n\t\t{ name: 'document',\t   groups: [ 'mode', 'document' ] },\t\t\t// Displays document group with its two subgroups.\n \t\t{ name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },\t\t\t// Group's name will be used to create voice label.\n \t\t'/',\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Line break - next group will be placed in new line.\n \t\t{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },\n \t\t{ name: 'links' }\n\t]\n\n\t// NOTE: Remember to leave 'toolbar' property with the default value (null).\n});</pre>\n\t</div>\n\n\t<div id=\"currentToolbar\" style=\"display: none\">\n\t\t<h2 class=\"samples\">Current toolbar configuration</h2>\n\t\t<p>Below you can see editor with current toolbar definition.</p>\n\t\t<textarea cols=\"80\" id=\"editorCurrent\" name=\"editorCurrent\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t<pre id=\"editorCurrentCfg\" class=\"samples\"></pre>\n\t</div>\n\n\t<div id=\"fullToolbar\">\n\t\t<h2 class=\"samples\">Full toolbar configuration</h2>\n\t\t<p>Below you can see editor with full toolbar, generated automatically by the editor.</p>\n\t\t<p>\n\t\t\t<strong>Note</strong>: To create editor instance with full toolbar you don't have to set anything.\n\t\t\tJust leave <code>toolbar</code> and <code>toolbarGroups</code> with the default, <code>null</code> values.\n\t\t</p>\n\t\t<textarea cols=\"80\" id=\"editorFull\" name=\"editorFull\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t<pre id=\"editorFullCfg\" class=\"samples\"></pre>\n\t</div>\n\n\t<script>\n\n(function() {\n\t'use strict';\n\n\tvar buttonsNames;\n\n\tCKEDITOR.config.extraPlugins = 'toolbar';\n\n\tCKEDITOR.on( 'instanceReady', function( evt ) {\n\t\tvar editor = evt.editor,\n\t\t\teditorCurrent = editor.name == 'editorCurrent',\n\t\t\tdefaultToolbar = !( editor.config.toolbar || editor.config.toolbarGroups || editor.config.removeButtons ),\n\t\t\tpre = CKEDITOR.document.getById( editor.name + 'Cfg' ),\n\t\t\toutput = '';\n\n\t\tif ( editorCurrent ) {\n\t\t\t// If default toolbar configuration has been modified, show \"current toolbar\" section.\n\t\t\tif ( !defaultToolbar )\n\t\t\t\tCKEDITOR.document.getById( 'currentToolbar' ).show();\n\t\t\telse\n\t\t\t\treturn;\n\t\t}\n\n\t\tif ( !buttonsNames )\n\t\t\tbuttonsNames = createButtonsNamesHash( editor.ui.items );\n\n\t\t// Toolbar isn't set explicitly, so it was created automatically from toolbarGroups.\n\t\tif ( !editor.config.toolbar ) {\n\t\t\toutput +=\n\t\t\t\t'// Toolbar configuration generated automatically by the editor based on config.toolbarGroups.\\n' +\n\t\t\t\tdumpToolbarConfiguration( editor ) +\n\t\t\t\t'\\n\\n' +\n\t\t\t\t'// Toolbar groups configuration.\\n' +\n\t\t\t\tdumpToolbarConfiguration( editor, true )\n\t\t}\n\t\t// Toolbar groups doesn't count in this case - print only toolbar.\n\t\telse {\n\t\t\toutput += '// Toolbar configuration.\\n' +\n\t\t\t\tdumpToolbarConfiguration( editor );\n\t\t}\n\n\t\t// Recreate to avoid old IE from loosing whitespaces on filling <pre> content.\n\t\tvar preOutput = pre.getOuterHtml().replace( /(?=<\\/)/, output );\n\t\tCKEDITOR.dom.element.createFromHtml( preOutput ).replace( pre );\n\t} );\n\n\tCKEDITOR.replace( 'editorCurrent', { height: 100 } );\n\tCKEDITOR.replace( 'editorFull', {\n\t\t// Reset toolbar settings, so full toolbar will be generated automatically.\n\t\ttoolbar: null,\n\t\ttoolbarGroups: null,\n\t\tremoveButtons: null,\n\t\theight: 100\n\t} );\n\n\tfunction dumpToolbarConfiguration( editor, printGroups ) {\n\t\tvar output = [],\n\t\t\ttoolbar = editor.toolbar;\n\n\t\tfor ( var i = 0; i < toolbar.length; ++i ) {\n\t\t\tvar group = dumpToolbarGroup( toolbar[ i ], printGroups );\n\t\t\tif ( group )\n\t\t\t\toutput.push( group );\n\t\t}\n\n\t\treturn 'config.toolbar' + ( printGroups ? 'Groups' : '' ) + ' = [\\n\\t' + output.join( ',\\n\\t' ) + '\\n];';\n\t}\n\n\tfunction dumpToolbarGroup( group, printGroups ) {\n\t\tvar output = [];\n\n\t\tif ( typeof group == 'string' )\n\t\t\treturn '\\'' + group + '\\'';\n\t\tif ( CKEDITOR.tools.isArray( group ) )\n\t\t\treturn dumpToolbarItems( group );\n\t\t// Skip group when printing entire toolbar configuration and there are no items in this group.\n\t\tif ( !printGroups && !group.items )\n\t\t\treturn;\n\n\t\tif ( group.name )\n\t\t\toutput.push( 'name: \\'' + group.name + '\\'' );\n\n\t\tif ( group.groups )\n\t\t\toutput.push( 'groups: ' + dumpToolbarItems( group.groups ) );\n\n\t\tif ( !printGroups )\n\t\t\toutput.push( 'items: ' + dumpToolbarItems( group.items ) );\n\n\t\treturn '{ ' + output.join( ', ' ) + ' }';\n\t}\n\n\tfunction dumpToolbarItems( items ) {\n\t\tif ( typeof items == 'string' )\n\t\t\treturn '\\'' + items + '\\'';\n\n\t\tvar names = [],\n\t\t\ti, item;\n\n\t\tfor ( var i = 0; i < items.length; ++i ) {\n\t\t\titem = items[ i ];\n\t\t\tif ( typeof item == 'string' )\n\t\t\t\tnames.push( item );\n\t\t\telse {\n\t\t\t\tif ( item.type == CKEDITOR.UI_SEPARATOR )\n\t\t\t\t\tnames.push( '-' );\n\t\t\t\telse\n\t\t\t\t\tnames.push( buttonsNames[ item.name ] );\n\t\t\t}\n\t\t}\n\n\t\treturn '[ \\'' + names.join( '\\', \\'' ) + '\\' ]';\n\t}\n\n\t// Creates { 'lowercased': 'LowerCased' } buttons names hash.\n\tfunction createButtonsNamesHash( items ) {\n\t\tvar hash = {},\n\t\t\tname;\n\n\t\tfor ( name in items ) {\n\t\t\thash[ items[ name ].name ] = name;\n\t\t}\n\n\t\treturn hash;\n\t}\n\n})();\n\t</script>\n\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/uicolor.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>UI Color Picker &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; UI Color\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/uicolor.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements\n\t\t\twith a CKEditor instance with an option to change the color of its user interface.<br>\n\t\t\t<strong>Note:</strong>The UI skin color feature depends on the CKEditor skin\n\t\t\tcompatibility. The Moono and Kama skins are examples of skins that work with it.\n\t\t</p>\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t<p>\n\t\tThis editor instance has a UI color value defined in configuration to change the skin color,\n\t\tTo specify the color of the user interface, set the <code>uiColor</code> property:\n\t</p>\n\t<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>', {\n\t<strong>uiColor: '#14B8C4'</strong>\n});</pre>\n\t<p>\n\t\tNote that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of\n\t\tthe <code>&lt;textarea&gt;</code> element to be replaced.\n\t</p>\n\t<p>\n\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t<script>\n\n\t\t\t// Replace the <textarea id=\"editor\"> with an CKEditor\n\t\t\t// instance, using default configurations.\n\t\t\tCKEDITOR.replace( 'editor1', {\n\t\t\t\tuiColor: '#14B8C4',\n\t\t\t\ttoolbar: [\n\t\t\t\t\t[ 'Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],\n\t\t\t\t\t[ 'FontSize', 'TextColor', 'BGColor' ]\n\t\t\t\t]\n\t\t\t});\n\n\t\t</script>\n\t</p>\n\t<p>\n\t\t<input type=\"submit\" value=\"Submit\">\n\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/uilanguages.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>User Interface Globalization &mdash; CKEditor Sample</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<script src=\"assets/uilanguages/languages.js\"></script>\n\t<link rel=\"stylesheet\" href=\"sample.css\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; User Interface Languages\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/uilanguages.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements\n\t\t\twith a CKEditor instance with an option to change the language of its user interface.\n\t\t</p>\n\t\t<p>\n\t\t\tIt pulls the language list from CKEditor <code>_languages.js</code> file that contains the list of supported languages and creates\n\t\t\ta drop-down list that lets the user change the UI language.\n\t\t</p>\n\t\t<p>\n\t\t\tBy default, CKEditor automatically localizes the editor to the language of the user.\n\t\t\tThe UI language can be controlled with two configuration options:\n\t\t\t<code><a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-language\">language</a></code> and\n\t\t\t<code><a class=\"samples\" href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-defaultLanguage\">\n\t\t\tdefaultLanguage</a></code>. The <code>defaultLanguage</code> setting specifies the\n\t\t\tdefault CKEditor language to be used when a localization suitable for user's settings is not available.\n\t\t</p>\n\t\t<p>\n\t\t\tTo specify the user interface language that will be used no matter what language is\n\t\t\tspecified in user's browser or operating system, set the <code>language</code> property:\n\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>', {\n\t// Load the German interface.\n\t<strong>language: 'de'</strong>\n});</pre>\n\t\t<p>\n\t\t\tNote that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of\n\t\t\tthe <code>&lt;textarea&gt;</code> element to be replaced.\n\t\t</p>\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<p>\n\t\t\tAvailable languages (<span id=\"count\"> </span> languages!):<br>\n\t\t\t<script>\n\n\t\t\t\tdocument.write( '<select disabled=\"disabled\" id=\"languages\" onchange=\"createEditor( this.value );\">' );\n\n\t\t\t\t// Get the language list from the _languages.js file.\n\t\t\t\tfor ( var i = 0 ; i < window.CKEDITOR_LANGS.length ; i++ ) {\n\t\t\t\t\tdocument.write(\n\t\t\t\t\t\t'<option value=\"' + window.CKEDITOR_LANGS[i].code + '\">' +\n\t\t\t\t\t\t\twindow.CKEDITOR_LANGS[i].name +\n\t\t\t\t\t\t'</option>' );\n\t\t\t\t}\n\n\t\t\t\tdocument.write( '</select>' );\n\n\t\t\t</script>\n\t\t\t<br>\n\t\t\t<span style=\"color: #888888\">\n\t\t\t\t(You may see strange characters if your system does not support the selected language)\n\t\t\t</span>\n\t\t</p>\n\t\t<p>\n\t\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t\t<script>\n\n\t\t\t\t// Set the number of languages.\n\t\t\t\tdocument.getElementById( 'count' ).innerHTML = window.CKEDITOR_LANGS.length;\n\n\t\t\t\tvar editor;\n\n\t\t\t\tfunction createEditor( languageCode ) {\n\t\t\t\t\tif ( editor )\n\t\t\t\t\t\teditor.destroy();\n\n\t\t\t\t\t// Replace the <textarea id=\"editor\"> with an CKEditor\n\t\t\t\t\t// instance, using default configurations.\n\t\t\t\t\teditor = CKEDITOR.replace( 'editor1', {\n\t\t\t\t\t\tlanguage: languageCode,\n\n\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\tinstanceReady: function() {\n\t\t\t\t\t\t\t\t// Wait for the editor to be ready to set\n\t\t\t\t\t\t\t\t// the language combo.\n\t\t\t\t\t\t\t\tvar languages = document.getElementById( 'languages' );\n\t\t\t\t\t\t\t\tlanguages.value = this.langCode;\n\t\t\t\t\t\t\t\tlanguages.disabled = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// At page startup, load the default language:\n\t\t\t\tcreateEditor( '' );\n\n\t\t\t</script>\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/wysiwygarea/fullpage.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Full Page Editing &mdash; CKEditor Sample</title>\n\t<script src=\"../../../ckeditor.js\"></script>\n\t<script src=\"../../../samples/old/sample.js\"></script>\n\t<link rel=\"stylesheet\" href=\"../../../samples/old/sample.css\">\n\t<meta name=\"ckeditor-sample-required-plugins\" content=\"sourcearea\">\n\t<meta name=\"ckeditor-sample-name\" content=\"Full page support\">\n\t<meta name=\"ckeditor-sample-group\" content=\"Plugins\">\n\t<meta name=\"ckeditor-sample-description\" content=\"CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"../../../samples/old/index.html\">CKEditor Samples</a> &raquo; Full Page Editing\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/fullpage.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to configure CKEditor to edit entire HTML pages, from the\n\t\t\t<code>&lt;html&gt;</code> tag to the <code>&lt;/html&gt;</code> tag.\n\t\t</p>\n\t\t<p>\n\t\t\tThe CKEditor instance below is inserted with a JavaScript call using the following code:\n\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>', {\n\t<strong>fullPage: true</strong>,\n\t<strong>allowedContent: true</strong>\n});\n</pre>\n\t\t<p>\n\t\t\tNote that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of\n\t\t\tthe <code>&lt;textarea&gt;</code> element to be replaced.\n\t\t</p>\n\t\t<p>\n\t\t\tThe <code><em>allowedContent</em></code> in the code above is set to <code>true</code> to disable content filtering.\n\t\t\tSetting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations.\n\t\t</p>\n\t</div>\n\t<form action=\"../../../samples/sample_posteddata.php\" method=\"post\">\n\t\t<label for=\"editor1\">\n\t\t\tCKEditor output the entire page including content outside of\n\t\t\t<code>&lt;body&gt;</code> element, so content like meta and title can be changed:\n\t\t</label>\n\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">\n\t\t\t&lt;h1&gt;&lt;img align=&quot;right&quot; alt=&quot;Saturn V carrying Apollo 11&quot; src=&quot;../../../samples/old/assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;\n\t\t</textarea>\n\t\t<script>\n\n\t\t\tCKEDITOR.replace( 'editor1', {\n\t\t\t\tfullPage: true,\n\t\t\t\tallowedContent: true,\n\t\t\t\textraPlugins: 'wysiwygarea'\n\t\t\t});\n\n\t\t</script>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/old/xhtmlstyle.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>XHTML Compliant Output &mdash; CKEditor Sample</title>\n\t<meta name=\"ckeditor-sample-required-plugins\" content=\"sourcearea\">\n\t<script src=\"../../ckeditor.js\"></script>\n\t<script src=\"sample.js\"></script>\n\t<link href=\"sample.css\" rel=\"stylesheet\">\n</head>\n<body>\n\t<h1 class=\"samples\">\n\t\t<a href=\"index.html\">CKEditor Samples</a> &raquo; Producing XHTML Compliant Output\n\t</h1>\n\t<div class=\"warning deprecated\">\n\t\tThis sample is not maintained anymore. Check out its <a href=\"http://sdk.ckeditor.com/samples/basicstyles.html\">brand new version in CKEditor SDK</a>.\n\t</div>\n\t<div class=\"description\">\n\t\t<p>\n\t\t\tThis sample shows how to configure CKEditor to output valid\n\t\t\t<a class=\"samples\" href=\"http://www.w3.org/TR/xhtml11/\">XHTML 1.1</a> code.\n\t\t\tDeprecated elements (<code>&lt;font&gt;</code>, <code>&lt;u&gt;</code>) or attributes\n\t\t\t(<code>size</code>, <code>face</code>) will be replaced with XHTML compliant code.\n\t\t</p>\n\t\t<p>\n\t\t\tTo add a CKEditor instance outputting valid XHTML code, load the editor using a standard\n\t\t\tJavaScript call and define CKEditor features to use the XHTML compliant elements and styles.\n\t\t</p>\n\t\t<p>\n\t\t\tA snippet of the configuration code can be seen below; check the source of this page for\n\t\t\tfull definition:\n\t\t</p>\n<pre class=\"samples\">\nCKEDITOR.replace( '<em>textarea_id</em>', {\n\tcontentsCss: 'assets/outputxhtml.css',\n\n\tcoreStyles_bold: {\n\t\telement: 'span',\n\t\tattributes: { 'class': 'Bold' }\n\t},\n\tcoreStyles_italic: {\n\t\telement: 'span',\n\t\tattributes: { 'class': 'Italic' }\n\t},\n\n\t...\n});</pre>\n\t</div>\n\t<form action=\"sample_posteddata.php\" method=\"post\">\n\t\t<p>\n\t\t\t<label for=\"editor1\">\n\t\t\t\tEditor 1:\n\t\t\t</label>\n\t\t\t<textarea cols=\"80\" id=\"editor1\" name=\"editor1\" rows=\"10\">&lt;p&gt;This is some &lt;span class=\"Bold\"&gt;sample text&lt;/span&gt;. You are using &lt;a href=\"http://ckeditor.com/\"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>\n\t\t\t<script>\n\n\t\t\t\tCKEDITOR.replace( 'editor1', {\n\t\t\t\t\t/*\n\t\t\t\t\t * Style sheet for the contents\n\t\t\t\t\t */\n\t\t\t\t\tcontentsCss: 'assets/outputxhtml/outputxhtml.css',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Special allowed content rules for spans used by\n\t\t\t\t\t * font face, size, and color buttons.\n\t\t\t\t\t *\n\t\t\t\t\t * Note: all rules have been written separately so\n\t\t\t\t\t * it was possible to specify required classes.\n\t\t\t\t\t */\n\t\t\t\t\textraAllowedContent: 'span(!FontColor1);span(!FontColor2);span(!FontColor3);' +\n\t\t\t\t\t\t'span(!FontColor1BG);span(!FontColor2BG);span(!FontColor3BG);' +\n\t\t\t\t\t\t'span(!FontComic);span(!FontCourier);span(!FontTimes);' +\n\t\t\t\t\t\t'span(!FontSmaller);span(!FontLarger);span(!FontSmall);span(!FontBig);span(!FontDouble)',\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Core styles.\n\t\t\t\t\t */\n\t\t\t\t\tcoreStyles_bold: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': 'Bold' }\n\t\t\t\t\t},\n\t\t\t\t\tcoreStyles_italic: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': 'Italic' }\n\t\t\t\t\t},\n\t\t\t\t\tcoreStyles_underline: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': 'Underline' }\n\t\t\t\t\t},\n\t\t\t\t\tcoreStyles_strike: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': 'StrikeThrough' },\n\t\t\t\t\t\toverrides: 'strike'\n\t\t\t\t\t},\n\t\t\t\t\tcoreStyles_subscript: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': 'Subscript' },\n\t\t\t\t\t\toverrides: 'sub'\n\t\t\t\t\t},\n\t\t\t\t\tcoreStyles_superscript: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': 'Superscript' },\n\t\t\t\t\t\toverrides: 'sup'\n\t\t\t\t\t},\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Font face.\n\t\t\t\t\t */\n\n\t\t\t\t\t// List of fonts available in the toolbar combo. Each font definition is\n\t\t\t\t\t// separated by a semi-colon (;). We are using class names here, so each font\n\t\t\t\t\t// is defined by {Combo Label}/{Class Name}.\n\t\t\t\t\tfont_names: 'Comic Sans MS/FontComic;Courier New/FontCourier;Times New Roman/FontTimes',\n\n\t\t\t\t\t// Define the way font elements will be applied to the document. The \"span\"\n\t\t\t\t\t// element will be used. When a font is selected, the font name defined in the\n\t\t\t\t\t// above list is passed to this definition with the name \"Font\", being it\n\t\t\t\t\t// injected in the \"class\" attribute.\n\t\t\t\t\t// We must also instruct the editor to replace span elements that are used to\n\t\t\t\t\t// set the font (Overrides).\n\t\t\t\t\tfont_style: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': '#(family)' },\n\t\t\t\t\t\toverrides: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\t'class': /^Font(?:Comic|Courier|Times)$/\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Font sizes.\n\t\t\t\t\t */\n\t\t\t\t\tfontSize_sizes: 'Smaller/FontSmaller;Larger/FontLarger;8pt/FontSmall;14pt/FontBig;Double Size/FontDouble',\n\t\t\t\t\tfontSize_style: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': '#(size)' },\n\t\t\t\t\t\toverrides: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\t'class': /^Font(?:Smaller|Larger|Small|Big|Double)$/\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t} ,\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Font colors.\n\t\t\t\t\t */\n\t\t\t\t\tcolorButton_enableMore: false,\n\n\t\t\t\t\tcolorButton_colors: 'FontColor1/FF9900,FontColor2/0066CC,FontColor3/F00',\n\t\t\t\t\tcolorButton_foreStyle: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': '#(color)' },\n\t\t\t\t\t\toverrides: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\t'class': /^FontColor(?:1|2|3)$/\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\n\t\t\t\t\tcolorButton_backStyle: {\n\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\tattributes: { 'class': '#(color)BG' },\n\t\t\t\t\t\toverrides: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\telement: 'span',\n\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\t'class': /^FontColor(?:1|2|3)BG$/\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Indentation.\n\t\t\t\t\t */\n\t\t\t\t\tindentClasses: [ 'Indent1', 'Indent2', 'Indent3' ],\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Paragraph justification.\n\t\t\t\t\t */\n\t\t\t\t\tjustifyClasses: [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyFull' ],\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Styles combo.\n\t\t\t\t\t */\n\t\t\t\t\tstylesSet: [\n\t\t\t\t\t\t{ name: 'Strong Emphasis', element: 'strong' },\n\t\t\t\t\t\t{ name: 'Emphasis', element: 'em' },\n\n\t\t\t\t\t\t{ name: 'Computer Code', element: 'code' },\n\t\t\t\t\t\t{ name: 'Keyboard Phrase', element: 'kbd' },\n\t\t\t\t\t\t{ name: 'Sample Text', element: 'samp' },\n\t\t\t\t\t\t{ name: 'Variable', element: 'var' },\n\n\t\t\t\t\t\t{ name: 'Deleted Text', element: 'del' },\n\t\t\t\t\t\t{ name: 'Inserted Text', element: 'ins' },\n\n\t\t\t\t\t\t{ name: 'Cited Work', element: 'cite' },\n\t\t\t\t\t\t{ name: 'Inline Quotation', element: 'q' }\n\t\t\t\t\t]\n\t\t\t\t});\n\n\t\t\t</script>\n\t\t</p>\n\t\t<p>\n\t\t\t<input type=\"submit\" value=\"Submit\">\n\t\t</p>\n\t</form>\n\t<div id=\"footer\">\n\t\t<hr>\n\t\t<p>\n\t\t\tCKEditor - The text editor for the Internet - <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t\t</p>\n\t\t<p id=\"copy\">\n\t\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> - Frederico\n\t\t\tKnabben. All rights reserved.\n\t\t</p>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/css/fontello.css",
    "content": "@font-face {\n  font-family: 'fontello';\n  src: url('../font/fontello.eot?89024372');\n  src: url('../font/fontello.eot?89024372#iefix') format('embedded-opentype'),\n       url('../font/fontello.woff?89024372') format('woff'),\n       url('../font/fontello.ttf?89024372') format('truetype'),\n       url('../font/fontello.svg?89024372#fontello') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */\n/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */\n/*\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: 'fontello';\n    src: url('../font/fontello.svg?89024372#fontello') format('svg');\n  }\n}\n*/\n\n [class^=\"icon-\"]:before, [class*=\" icon-\"]:before {\n  font-family: \"fontello\";\n  font-style: normal;\n  font-weight: normal;\n  speak: none;\n\n  display: inline-block;\n  text-decoration: inherit;\n  width: 1em;\n  margin-right: .2em;\n  text-align: center;\n  /* opacity: .8; */\n\n  /* For safety - reset parent styles, that can break glyph codes*/\n  font-variant: normal;\n  text-transform: none;\n\n  /* fix buttons height, for twitter bootstrap */\n  line-height: 1em;\n\n  /* Animation center compensation - margins should be symmetric */\n  /* remove if not needed */\n  margin-left: .2em;\n\n  /* you can be more comfortable with increased icons size */\n  /* font-size: 120%; */\n\n  /* Uncomment for 3D effect */\n  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */\n}\n\n.icon-trash:before { content: '\\e802'; } /* '' */\n.icon-down-big:before { content: '\\e800'; } /* '' */\n.icon-up-big:before { content: '\\e801'; } /* '' */\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/font/LICENSE.txt",
    "content": "Font license info\n\n\n## Font Awesome\n\n   Copyright (C) 2012 by Dave Gandy\n\n   Author:    Dave Gandy\n   License:   SIL ()\n   Homepage:  http://fortawesome.github.com/Font-Awesome/\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/font/config.json",
    "content": "{\n  \"name\": \"\",\n  \"css_prefix_text\": \"icon-\",\n  \"css_use_suffix\": false,\n  \"hinting\": true,\n  \"units_per_em\": 1000,\n  \"ascent\": 850,\n  \"glyphs\": [\n    {\n      \"uid\": \"f48ae54adfb27d8ada53d0fd9e34ee10\",\n      \"css\": \"trash-empty\",\n      \"code\": 59392,\n      \"src\": \"fontawesome\"\n    },\n    {\n      \"uid\": \"1c4068ed75209e21af36017df8871802\",\n      \"css\": \"down-big\",\n      \"code\": 59393,\n      \"src\": \"fontawesome\"\n    },\n    {\n      \"uid\": \"95376bf082bfec6ce06ea1cda7bd7ead\",\n      \"css\": \"up-big\",\n      \"code\": 59394,\n      \"src\": \"fontawesome\"\n    }\n  ]\n}"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/index.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n-->\n<!--[if IE 8]><html class=\"ie8\"><![endif]-->\n<!--[if gt IE 8]><html><![endif]-->\n<!--[if !IE]><!--><html><!--<![endif]-->\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Toolbar Configurator</title>\n\t<script src=\"../../ckeditor.js\"></script>\n\t<script>\n\t\tif ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 )\n\t\t\tCKEDITOR.tools.enableHtml5Elements( document );\n\t</script>\n\t<link rel=\"stylesheet\" href=\"lib/codemirror/codemirror.css\">\n\t<link rel=\"stylesheet\" href=\"lib/codemirror/show-hint.css\">\n\t<link rel=\"stylesheet\" href=\"lib/codemirror/neo.css\">\n\t<link rel=\"stylesheet\" href=\"css/fontello.css\">\n\t<link rel=\"stylesheet\" href=\"../css/samples.css\">\n</head>\n<body id=\"toolbar\">\n\n<nav class=\"navigation-a\">\n\t<div class=\"grid-container\">\n\t\t<ul class=\"navigation-a-left grid-width-70\">\n\t\t\t<li><a href=\"http://ckeditor.com\">Project Homepage</a></li>\n\t\t\t<li><a href=\"http://dev.ckeditor.com/\">I found a bug</a></li>\n\t\t\t<li><a href=\"http://github.com/ckeditor/ckeditor-dev\" class=\"icon-pos-right icon-navigation-a-github\">Fork CKEditor on GitHub</a></li>\n\t\t</ul>\n\t\t<ul class=\"navigation-a-right grid-width-30\">\n\t\t\t<li><a href=\"http://ckeditor.com/blog-list\">CKEditor Blog</a></li>\n\t\t</ul>\n\t</div>\n</nav>\n\n<header class=\"header-a\">\n\t<div class=\"grid-container\">\n\t\t<h1 class=\"header-a-logo grid-width-30\">\n\t\t\t<a href=\"../index.html\"><img src=\"../img/logo.png\" alt=\"CKEditor Logo\"></a>\n\t\t</h1>\n\t\t<nav class=\"navigation-b grid-width-70\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"../index.html\"  class=\"button-a\">Start</a></li>\n\t\t\t\t<li><a href=\"index.html\"  class=\"button-a button-a-background\">Toolbar configurator</a></li>\n\t\t\t</ul>\n\t\t</nav>\n\t</div>\n</header>\n\n<main>\n\t<div class=\"adjoined-top\">\n\t\t<div class=\"grid-container\">\n\t\t\t<div class=\"content grid-width-100\">\n\t\t\t\t<div class=\"grid-container-nested\">\n\t\t\t\t\t<h1 class=\"grid-width-60\">\n\t\t\t\t\t\tToolbar Configurator\n\t\t\t\t\t\t<a href=\"#help-content\" type=\"button\" title=\"Configurator help\" id=\"help\" class=\"button-a button-a-background button-a-no-text icon-pos-left icon-question-mark\">Help</a>\n\t\t\t\t\t</h1>\n\n\t\t\t\t\t<div class=\"grid-width-40 grid-switch-magic\">\n\t\t\t\t\t\t<div class=\"switch\">\n\t\t\t\t\t\t\t<span class=\"balloon-a balloon-a-se\">Select configurator type</span>\n\t\t\t\t\t\t\t<input type=\"radio\" name=\"radio\" data-num=\"1\" id=\"radio-basic\" />\n\t\t\t\t\t\t\t<input type=\"radio\" name=\"radio\" data-num=\"2\" id=\"radio-advanced\" />\n\t\t\t\t\t\t\t<label data-for=\"1\" for=\"radio-basic\">Basic</label>\n\t\t\t\t\t\t\t<span class=\"switch-inner\">\n\t\t\t\t\t\t\t\t<span class=\"handler\"></span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<label data-for=\"2\" for=\"radio-advanced\">Advanced</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"adjoined-bottom\">\n\t\t<div class=\"grid-container\">\n\t\t\t<div class=\"grid-width-100\">\n\t\t\t\t<div class=\"editors-container\">\n\t\t\t\t\t<div id=\"editor-basic\"></div>\n\t\t\t\t\t<div id=\"editor-advanced\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"grid-container configurator\">\n\t\t<div class=\"content grid-width-100\">\n\t\t\t<div class=\"configurator\">\n\t\t\t\t<div>\n\t\t\t\t\t<div id=\"toolbarModifierWrapper\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div id=\"help-content\">\n\t\t<div class=\"grid-container\">\n\t\t\t<div class=\"grid-width-100\">\n\t\t\t\t<h2>What Am I Doing Here?</h2>\n\n\t\t\t\t<div class=\"grid-container grid-container-nested\">\n\t\t\t\t\t<div class=\"basic\">\n\t\t\t\t\t\t<div class=\"grid-width-50\">\n\t\t\t\t\t\t\t<p>Arrange <a href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbarGroups\">toolbar groups</a>, toggle <a href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-removeButtons\">button visibility</a> according to your needs and get your toolbar configuration.</p>\n\t\t\t\t\t\t\t<p>You can replace the content of the <a href=\"../../config.js\"><code>config.js</code></a> file with the generated configuration. If you already set some configuration options you will need to merge both configurations.</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"grid-width-50\">\n\t\t\t\t\t\t\t<p>Read more about different ways of <a href=\"http://docs.ckeditor.com/#!/guide/dev_configuration\">setting configuration</a> and do not forget about <strong>clearing browser cache</strong>.</p>\n\t\t\t\t\t\t\t<p>Arranging toolbar groups is the recommended way of configuring the toolbar, but if you need more freedom you can use the <a href=\"#advanced\">advanced configurator</a>.</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"advanced\" style=\"display: none;\">\n\t\t\t\t\t\t<div class=\"grid-width-50\">\n\t\t\t\t\t\t\t<p>With this code editor you can edit your <a href=\"http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbar\">toolbar configuration</a> live.</p>\n\t\t\t\t\t\t\t<p>You can replace the content of the <a href=\"../../config.js\"><code>config.js</code></a> file with the generated configuration. If you already set some configuration options you will need to merge both configurations.</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"grid-width-50\">\n\t\t\t\t\t\t\t<p>Read more about different ways of <a href=\"http://docs.ckeditor.com/#!/guide/dev_configuration\">setting configuration</a> and do not forget about <strong>clearing browser cache</strong>.</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<p class=\"grid-container grid-container-nested\">\n\t\t\t\t\t<button type=\"button\" class=\"help-content-close grid-width-100 button-a button-a-background\">Got it. Let's play!</button>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</main>\n\n<footer class=\"footer-a grid-container\">\n\t<p class=\"grid-width-100\">\n\t\tCKEditor &ndash; The text editor for the Internet &ndash; <a class=\"samples\" href=\"http://ckeditor.com/\">http://ckeditor.com</a>\n\t</p>\n\t<p class=\"grid-width-100\" id=\"copy\">\n\t\tCopyright &copy; 2003-2016, <a class=\"samples\" href=\"http://cksource.com/\">CKSource</a> &ndash; Frederico Knabben. All rights reserved.\n\t</p>\n</footer>\n\n<script src=\"lib/codemirror/codemirror.js\"></script>\n<script src=\"lib/codemirror/javascript.js\"></script>\n<script src=\"lib/codemirror/show-hint.js\"></script>\n\n<script src=\"js/fulltoolbareditor.js\"></script>\n<script src=\"js/abstracttoolbarmodifier.js\"></script>\n<script src=\"js/toolbarmodifier.js\"></script>\n<script src=\"js/toolbartextmodifier.js\"></script>\n<script src=\"../js/sf.js\"></script>\n\n<script>\n\t( function() {\n\t\t'use strict';\n\n\t\tvar mode = ( window.location.hash.substr( 1 ) === 'advanced' ) ? 'advanced' : 'basic',\n\t\t\tconfiguratorSection = CKEDITOR.document.findOne( 'main > .grid-container.configurator' ),\n\t\t\tbasicInstruction = CKEDITOR.document.findOne( '#help-content .basic' ),\n\t\t\tadvancedInstruction = CKEDITOR.document.findOne( '#help-content .advanced' ),\n\n\t\t\t// Configurator mode switcher.\n\t\t\tmodeSwitchBasic = CKEDITOR.document.getById( 'radio-basic' ),\n\t\t\tmodeSwitchAdvanced = CKEDITOR.document.getById( 'radio-advanced' );\n\n\t\t// Initial setup\n\t\tfunction updateSwitcher() {\n\t\t\tif ( mode === 'advanced' ) {\n\t\t\t\tmodeSwitchAdvanced.$.checked = true;\n\t\t\t} else {\n\t\t\t\tmodeSwitchBasic.$.checked = true;\n\t\t\t}\n\t\t}\n\n\t\tupdateSwitcher();\n\n\t\tCKEDITOR.document.getWindow().on( 'hashchange', function( e ) {\n\t\t\tvar hash = window.location.hash.substr( 1 );\n\t\t\tif ( !( hash === 'advanced' || hash === 'basic' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmode = hash;\n\t\t\tonToolbarsDone( mode );\n\t\t} );\n\n\t\tCKEDITOR.document.getWindow().on( 'resize', function() {\n\t\t\tupdateToolbar( ( mode === 'basic' ? toolbarModifier : toolbarTextModifier )[ 'editorInstance' ] );\n\t\t} );\n\n\t\tfunction onRefresh( modifier ) {\n\t\t\tmodifier = modifier || this;\n\n\t\t\tif ( mode === 'basic' && modifier instanceof ToolbarConfigurator.ToolbarTextModifier ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// CodeMirror container becomes visible, so we need to refresh and to avoid rendering problems.\n\t\t\tif ( mode === 'advanced' && modifier instanceof ToolbarConfigurator.ToolbarTextModifier ) {\n\t\t\t\tmodifier.codeContainer.refresh();\n\t\t\t}\n\n\t\t\tupdateToolbar( modifier.editorInstance );\n\t\t}\n\n\t\tfunction updateToolbar( editor ) {\n\t\t\tvar editorContainer = editor.container;\n\n\t\t\t// Not always editor is loaded.\n\t\t\tif ( !editorContainer ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar displayStyle = editorContainer.getStyle( 'display' );\n\n\t\t\teditorContainer.setStyle( 'display', 'block' );\n\n\t\t\tvar newHeight = editorContainer.getSize( 'height' );\n\n\t\t\tvar newMarginTop = parseInt( editorContainer.getComputedStyle( 'margin-top' ), 10 );\n\t\t\tnewMarginTop = ( isNaN( newMarginTop ) ? 0 : Number( newMarginTop ) );\n\n\t\t\tvar newMarginBottom = parseInt( editorContainer.getComputedStyle( 'margin-bottom' ), 10 );\n\t\t\tnewMarginBottom = ( isNaN( newMarginBottom ) ? 0 : Number( newMarginBottom ) );\n\n\t\t\tvar result = newHeight + newMarginTop + newMarginBottom;\n\n\t\t\teditorContainer.setStyle( 'display', displayStyle );\n\n\t\t\teditor.container.getAscendant( 'div' ).setStyle( 'height', result + 'px' );\n\t\t}\n\n\t\tvar toolbarModifier = new ToolbarConfigurator.ToolbarModifier( 'editor-basic' );\n\n\t\tvar done = 0;\n\t\ttoolbarModifier.init( onToolbarInit );\n\t\ttoolbarModifier.onRefresh = onRefresh;\n\n\t\tCKEDITOR.document.getById( 'toolbarModifierWrapper' ).append( toolbarModifier.mainContainer );\n\n\t\tvar toolbarTextModifier = new ToolbarConfigurator.ToolbarTextModifier( 'editor-advanced' );\n\t\ttoolbarTextModifier.init( onToolbarInit );\n\t\ttoolbarTextModifier.onRefresh = onRefresh;\n\n\t\tfunction onToolbarInit() {\n\t\t\tif ( ++done === 2 ) {\n\t\t\t\tonToolbarsDone();\n\n\t\t\t\tpositionSticky.watch( CKEDITOR.document.findOne( '.toolbar' ), function() {\n\t\t\t\t\treturn mode === 'advanced';\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfunction onToolbarsDone() {\n\t\t\tif ( mode === 'basic' ) {\n\t\t\t\ttoggleModeBasic( false );\n\t\t\t} else {\n\t\t\t\ttoggleModeAdvanced( false );\n\t\t\t}\n\n\t\t\tupdateSwitcher();\n\n\t\t\tsetTimeout( function() {\n\t\t\t\tCKEDITOR.document.findOne( '.editors-container' ).addClass( 'active' );\n\t\t\t\tCKEDITOR.document.findOne( '#toolbarModifierWrapper' ).addClass( 'active' );\n\t\t\t}, 200 );\n\t\t}\n\n\t\tCKEDITOR.document.getById( 'toolbarModifierWrapper' ).append( toolbarTextModifier.mainContainer );\n\n\t\tfunction toogleModeSwitch( onElement, offElement, onModifier, offModifier ) {\n\t\t\tonElement.addClass( 'fancy-button-active' );\n\t\t\toffElement.removeClass( 'fancy-button-active' );\n\n\t\t\tonModifier.showUI();\n\t\t\toffModifier.hideUI();\n\t\t}\n\n\t\tfunction toggleModeBasic( callOnRefresh ) {\n\t\t\tcallOnRefresh = ( callOnRefresh !== false );\n\t\t\tmode = 'basic';\n\t\t\twindow.location.hash = '#basic';\n\t\t\ttoogleModeSwitch( modeSwitchBasic, modeSwitchAdvanced, toolbarModifier, toolbarTextModifier );\n\n\t\t\tconfiguratorSection.removeClass( 'freed-width' );\n\t\t\tbasicInstruction.show();\n\t\t\tadvancedInstruction.hide();\n\n\t\t\tcallOnRefresh && onRefresh( toolbarModifier );\n\t\t}\n\n\t\tfunction toggleModeAdvanced( callOnRefresh ) {\n\t\t\tcallOnRefresh = ( callOnRefresh !== false );\n\t\t\tmode = 'advanced';\n\t\t\twindow.location.hash = '#advanced';\n\t\t\ttoogleModeSwitch( modeSwitchAdvanced, modeSwitchBasic, toolbarTextModifier, toolbarModifier );\n\n\t\t\tconfiguratorSection.addClass( 'freed-width' );\n\t\t\tadvancedInstruction.show();\n\t\t\tbasicInstruction.hide();\n\n\t\t\tcallOnRefresh && onRefresh( toolbarTextModifier );\n\t\t}\n\n\t\tmodeSwitchBasic.on( 'click', toggleModeBasic );\n\t\tmodeSwitchAdvanced.on( 'click', toggleModeAdvanced );\n\n\t\t//\n\t\t// Position:sticky for the toolbar.\n\t\t//\n\n\t\t// Will make elements behave like they were styled with position:sticky.\n\t\tvar positionSticky = {\n\t\t\t// Store object: {\n\t\t\t// \t\telement: CKEDITOR.dom.element, // Element which will float.\n\t\t\t// \t\tplaceholder: CKEDITOR.dom.element, // Placeholder which is place to prevent page bounce.\n\t\t\t// \t\tisFixed: boolean // Whether element float now.\n\t\t\t// }\n\t\t\twatched: [],\n\n\t\t\tactive: [],\n\n\t\t\tstaticContainer: null,\n\n\t\t\tinit: function() {\n\t\t\t\tvar element = CKEDITOR.dom.element.createFromHtml(\n\t\t\t\t\t'<div class=\"staticContainer\">' +\n\t\t\t\t\t\t'<div class=\"grid-container\" >' +\n\t\t\t\t\t\t\t'<div class=\"grid-width-100\">' +\n\t\t\t\t\t\t\t\t'<div class=\"inner\"></div>' +\n\t\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t'</div>' );\n\n\t\t\t\tthis.staticContainer = element.findOne( '.inner' );\n\n\t\t\t\tCKEDITOR.document.getBody().append( element );\n\t\t\t},\n\n\t\t\twatch: function( element, preventFunc ) {\n\t\t\t\tthis.watched.push( {\n\t\t\t\t\telement: element,\n\t\t\t\t\tplaceholder: new CKEDITOR.dom.element( 'div' ),\n\t\t\t\t\tisFixed: false,\n\t\t\t\t\tpreventFunc: preventFunc\n\t\t\t\t} );\n\t\t\t},\n\n\t\t\tcheckAll: function() {\n\t\t\t\tfor ( var i = 0; i < this.watched.length; i++ ) {\n\t\t\t\t\tthis.check( this.watched[ i ] );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tcheck: function( element ) {\n\t\t\t\tvar isFixed = element.isFixed;\n\t\t\t\tvar shouldBeFixed = this.shouldBeFixed( element );\n\n\t\t\t\t// Nothing to be done.\n\t\t\t\tif ( isFixed === shouldBeFixed ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar placeholder = element.placeholder;\n\n\t\t\t\tif ( isFixed ) {\n\t\t\t\t\t// Unfixing.\n\n\t\t\t\t\telement.element.insertBefore( placeholder );\n\t\t\t\t\tplaceholder.remove();\n\n\t\t\t\t\telement.element.removeStyle( 'margin' );\n\n\t\t\t\t\tthis.active.splice( CKEDITOR.tools.indexOf( this.active, element ), 1 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// Fixing.\n\t\t\t\t\tplaceholder.setStyle( 'width', element.element.getSize( 'width' ) + 'px' );\n\t\t\t\t\tplaceholder.setStyle( 'height', element.element.getSize( 'height' ) + 'px' );\n\t\t\t\t\tplaceholder.setStyle( 'margin-bottom', element.element.getComputedStyle( 'margin-bottom' ) );\n\t\t\t\t\tplaceholder.setStyle( 'display', element.element.getComputedStyle( 'display' ) );\n\t\t\t\t\tplaceholder.insertAfter( element.element );\n\n\t\t\t\t\tthis.staticContainer.append( element.element );\n\n\t\t\t\t\tthis.active.push( element );\n\t\t\t\t}\n\n\t\t\t\telement.isFixed = !element.isFixed;\n\t\t\t},\n\n\t\t\tshouldBeFixed: function( element ) {\n\t\t\t\tif ( element.preventFunc && element.preventFunc() ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// If element is already fixed we are checking it's placeholder.\n\t\t\t\tvar related = ( element.isFixed ? element.placeholder : element.element ),\n\t\t\t\t\tclientRect = related.$.getBoundingClientRect(),\n\t\t\t\t\tstaticHeight = this.staticContainer.getSize('height' ),\n\t\t\t\t\telemHeight = element.element.getSize( 'height' );\n\n\t\t\t\tif ( element.isFixed ) {\n\t\t\t\t\treturn ( clientRect.top + elemHeight < staticHeight );\n\t\t\t\t} else {\n\t\t\t\t\treturn ( clientRect.top < staticHeight );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tpositionSticky.init();\n\n\t\tCKEDITOR.document.getWindow().on( 'scroll',\n\t\t\tnew CKEDITOR.tools.eventsBuffer( 100, positionSticky.checkAll, positionSticky ).input\n\t\t);\n\n\t\t// Make the toolbar sticky.\n\t\tpositionSticky.watch( CKEDITOR.document.findOne( '.editors-container' ) );\n\n\t\t// Help button and help-content.\n\t\t( function() {\n\t\t\tvar helpButton = CKEDITOR.document.getById( 'help' ),\n\t\t\t\thelpContent = CKEDITOR.document.getById( 'help-content' );\n\n\t\t\t// Don't show help button on IE8 because it's unsupported by Pico Modal.\n\t\t\tif ( CKEDITOR.env.ie && CKEDITOR.env.version == 8 ) {\n\t\t\t\thelpButton.hide();\n\t\t\t} else {\n\t\t\t\t// Display help modal when the button is clicked.\n\t\t\t\thelpButton.on( 'click', function( evt ) {\n\t\t\t\t\tSF.modal( {\n\t\t\t\t\t\t// Clone modal content from DOM.\n\t\t\t\t\t\tcontent: helpContent.getHtml(),\n\n\t\t\t\t\t\tafterCreate: function( modal ) {\n\t\t\t\t\t\t\t// Enable modal content button to close the modal.\n\t\t\t\t\t\t\tnew CKEDITOR.dom.element( modal.modalElem() ).findOne( '.help-content-close' ).once( 'click', modal.close );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ).show();\n\t\t\t\t} );\n\t\t\t}\n\t\t} )();\n\t} )();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js",
    "content": "﻿\"function\"!=typeof Object.create&&function(){var a=function(){};Object.create=function(b){if(1<arguments.length)throw Error(\"Second argument not supported\");if(null===b)throw Error(\"Cannot set a null [[Prototype]]\");if(\"object\"!=typeof b)throw TypeError(\"Argument must be an object\");a.prototype=b;return new a}}();\nCKEDITOR.plugins.add(\"toolbarconfiguratorarea\",{afterInit:function(a){a.addMode(\"wysiwyg\",function(b){var c=CKEDITOR.dom.element.createFromHtml('\\x3cdiv class\\x3d\"cke_wysiwyg_div cke_reset\" hidefocus\\x3d\"true\"\\x3e\\x3c/div\\x3e');a.ui.space(\"contents\").append(c);c=a.editable(c);c.detach=CKEDITOR.tools.override(c.detach,function(b){return function(){b.apply(this,arguments);this.remove()}});a.setData(a.getData(1),b);a.fire(\"contentDom\")});a.dataProcessor.toHtml=function(b){return b};a.dataProcessor.toDataFormat=\nfunction(b){return b}}});Object.keys||(Object.keys=function(){var a=Object.prototype.hasOwnProperty,b=!{toString:null}.propertyIsEnumerable(\"toString\"),c=\"toString toLocaleString valueOf hasOwnProperty isPrototypeOf propertyIsEnumerable constructor\".split(\" \"),e=c.length;return function(d){if(\"object\"!==typeof d&&(\"function\"!==typeof d||null===d))throw new TypeError(\"Object.keys called on non-object\");var g=[],f;for(f in d)a.call(d,f)&&g.push(f);if(b)for(f=0;f<e;f++)a.call(d,c[f])&&g.push(c[f]);return g}}());\n(function(){function a(b,c){this.cfg=c||{};this.hidden=!1;this.editorId=b;this.fullToolbarEditor=new ToolbarConfigurator.FullToolbarEditor;this.actualConfig=this.originalConfig=this.mainContainer=null;this.isEditableVisible=this.waitForReady=!1;this.toolbarContainer=null;this.toolbarButtons=[]}ToolbarConfigurator.AbstractToolbarModifier=a;a.prototype.setConfig=function(b){this._onInit(void 0,b,!0)};a.prototype.init=function(b){var c=this;this.mainContainer=new CKEDITOR.dom.element(\"div\");if(null!==\nthis.fullToolbarEditor.editorInstance)throw\"Only one instance of ToolbarModifier is allowed\";this.editorInstance||this._createEditor(!1);this.editorInstance.once(\"loaded\",function(){c.fullToolbarEditor.init(function(){c._onInit(b);if(\"function\"==typeof c.onRefresh)c.onRefresh()},c.editorInstance.config)});return this.mainContainer};a.prototype._onInit=function(b,c){this.originalConfig=this.editorInstance.config;this.actualConfig=c?JSON.parse(c):JSON.parse(JSON.stringify(this.originalConfig));if(!this.actualConfig.toolbarGroups&&\n!this.actualConfig.toolbar){for(var a=this.actualConfig,d=this.editorInstance.toolbar,g=[],f=d.length,k=0;k<f;k++){var h=d[k];\"string\"==typeof h?g.push(h):g.push({name:h.name,groups:h.groups?h.groups.slice():[]})}a.toolbarGroups=g}\"function\"===typeof b&&b(this.mainContainer)};a.prototype._createModifier=function(){this.mainContainer.addClass(\"unselectable\");this.modifyContainer&&this.modifyContainer.remove();this.modifyContainer=new CKEDITOR.dom.element(\"div\");this.modifyContainer.addClass(\"toolbarModifier\");\nthis.mainContainer.append(this.modifyContainer);return this.mainContainer};a.prototype.getEditableArea=function(){return this.editorInstance.container.findOne(\"#\"+this.editorInstance.id+\"_contents\")};a.prototype._hideEditable=function(){var b=this.getEditableArea();this.isEditableVisible=!1;this.lastEditableAreaHeight=b.getStyle(\"height\");b.setStyle(\"height\",\"0\")};a.prototype._showEditable=function(){this.isEditableVisible=!0;this.getEditableArea().setStyle(\"height\",this.lastEditableAreaHeight||\"auto\")};\na.prototype._toggleEditable=function(){this.isEditableVisible?this._hideEditable():this._showEditable()};a.prototype._refreshEditor=function(){function b(){c.editorInstance.destroy();c._createEditor(!0,c.getActualConfig());c.waitForReady=!1}var c=this,a=this.editorInstance.status;this.waitForReady||(\"unloaded\"==a||\"loaded\"==a?(this.waitForReady=!0,this.editorInstance.once(\"instanceReady\",function(){b()},this)):b())};a.prototype._createEditor=function(b,c){function e(){}var d=this;this.editorInstance=\nCKEDITOR.replace(this.editorId);this.editorInstance.on(\"configLoaded\",function(){var b=d.editorInstance.config;c&&CKEDITOR.tools.extend(b,c,!0);a.extendPluginsConfig(b)});this.editorInstance.on(\"uiSpace\",function(b){\"top\"!=b.data.space&&b.stop()},null,null,-999);this.editorInstance.once(\"loaded\",function(){var c=d.editorInstance.ui.instances,a;for(a in c)c[a]&&(c[a].click=e,c[a].onClick=e);d.isEditableVisible||d._hideEditable();d.currentActive&&d.currentActive.name&&d._highlightGroup(d.currentActive.name);\nd.hidden?d.hideUI():d.showUI();if(b&&\"function\"===typeof d.onRefresh)d.onRefresh()})};a.prototype.getActualConfig=function(){return JSON.parse(JSON.stringify(this.actualConfig))};a.prototype._createToolbar=function(){if(this.toolbarButtons.length){this.toolbarContainer=new CKEDITOR.dom.element(\"div\");this.toolbarContainer.addClass(\"toolbar\");for(var b=this.toolbarButtons.length,c=0;c<b;c+=1)this._createToolbarBtn(this.toolbarButtons[c])}};a.prototype._createToolbarBtn=function(b){var c=ToolbarConfigurator.FullToolbarEditor.createButton(\"string\"===\ntypeof b.text?b.text:b.text.inactive,b.cssClass);this.toolbarContainer.append(c);c.data(\"group\",b.group);c.addClass(b.position);c.on(\"click\",function(){b.clickCallback.call(this,c,b)},this);return c};a.prototype._fixGroups=function(b){b=b.toolbarGroups||[];for(var c=b.length,a=0;a<c;a+=1){var d=b[a];\"/\"==d?(d=b[a]={},d.type=\"separator\",d.name=\"separator\"+CKEDITOR.tools.getNextNumber()):(d.groups=d.groups||[],-1==CKEDITOR.tools.indexOf(d.groups,d.name)&&(this.editorInstance.ui.addToolbarGroup(d.name,\nd.groups[d.groups.length-1],d.name),d.groups.push(d.name)),this._fixSubgroups(d))}};a.prototype._fixSubgroups=function(b){b=b.groups;for(var c=b.length,a=0;a<c;a+=1){var d=b[a];b[a]={name:d,totalBtns:ToolbarConfigurator.ToolbarModifier.getTotalSubGroupButtonsNumber(d,this.fullToolbarEditor)}}};a.stringifyJSONintoOneLine=function(b,a){a=a||{};var e=JSON.stringify(b,null,\"\"),e=e.replace(/\\n/g,\"\");a.addSpaces&&(e=e.replace(/(\\{|:|,|\\[|\\])/g,function(a){return a+\" \"}),e=e.replace(/(\\])/g,function(a){return\" \"+\na}));a.noQuotesOnKey&&(e=e.replace(/\"(\\w*)\":/g,function(a,b){return b+\":\"}));a.singleQuotes&&(e=e.replace(/\\\"/g,\"'\"));return e};a.prototype.hideUI=function(){this.hidden=!0;this.mainContainer.hide();this.editorInstance.container&&this.editorInstance.container.hide()};a.prototype.showUI=function(){this.hidden=!1;this.mainContainer.show();this.editorInstance.container&&this.editorInstance.container.show()};a.extendPluginsConfig=function(a){var c=a.extraPlugins;a.extraPlugins=(c?c+\",\":\"\")+\"toolbarconfiguratorarea\"}})();"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/js/fulltoolbareditor.js",
    "content": "﻿window.ToolbarConfigurator={};\n(function(){function e(){this.instanceid=\"fte\"+CKEDITOR.tools.getNextId();this.textarea=new CKEDITOR.dom.element(\"textarea\");this.textarea.setAttributes({id:this.instanceid,name:this.instanceid,contentEditable:!0});this.editorInstance=this.buttons=null}ToolbarConfigurator.FullToolbarEditor=e;e.prototype.init=function(b){var a=this;document.body.appendChild(this.textarea.$);CKEDITOR.replace(this.instanceid);this.editorInstance=CKEDITOR.instances[this.instanceid];this.editorInstance.once(\"configLoaded\",function(d){var c=\nd.editor.config;delete c.removeButtons;delete c.toolbarGroups;delete c.toolbar;ToolbarConfigurator.AbstractToolbarModifier.extendPluginsConfig(c);d.editor.once(\"loaded\",function(){a.buttons=e.toolbarToButtons(a.editorInstance.toolbar);a.buttonsByGroup=e.groupButtons(a.buttons);a.buttonNamesByGroup=a.groupButtonNamesByGroup(a.buttons);d.editor.container.hide();\"function\"===typeof b&&b(a.buttons)})})};e.prototype.groupButtonNamesByGroup=function(b){var a=this;b=e.groupButtons(b);for(var d in b)b[d]=\ne.map(b[d],function(b){return a.getCamelCasedButtonName(b.name)});return b};e.prototype.getGroupByName=function(b){for(var a=this.editorInstance.config.toolbarGroups||this.getFullToolbarGroupsConfig(),d=a.length,c=0;c<d;c+=1)if(a[c].name===b)return a[c];return null};e.prototype.getCamelCasedButtonName=function(b){var a=this.editorInstance.ui.items,d;for(d in a)if(a[d].name==b)return d;return null};e.prototype.getFullToolbarGroupsConfig=function(b){b=!0===b?!0:!1;for(var a=[],d=this.editorInstance.toolbar,\nc=d.length,f=0;f<c;f+=1){var e=d[f],g={};\"string\"!=typeof e.name?b&&a.push(\"/\"):(g.name=e.name,e.groups&&(g.groups=Array.prototype.slice.call(e.groups)),a.push(g))}return a};e.filter=function(b,a){for(var d=b&&b.length?b.length:0,c=[],f=0;f<d;f+=1)a(b[f])&&c.push(b[f]);return c};e.map=function(b,a){var d;if(CKEDITOR.tools.isArray(b)){d=[];for(var c=b.length,f=0;f<c;f+=1)d.push(a(b[f]))}else for(c in d={},b)d[c]=a(b[c]);return d};e.groupButtons=function(b){for(var a={},d=b.length,c=0;c<d;c+=1){var f=\nb[c],e=f.toolbar.split(\",\")[0];a[e]=a[e]||[];a[e].push(f)}return a};e.toolbarToButtons=function(b){for(var a=[],d=b.length,c=0;c<d;c+=1)\"object\"==typeof b[c]&&(a=a.concat(e.groupToButtons(b[c])));return a};e.createToolbarButton=function(b){var a=new CKEDITOR.dom.element(\"a\"),d=e.createIcon(b.name,b.icon,b.command);a.setStyle(\"float\",\"none\");a.addClass(\"cke_\"+(\"rtl\"==CKEDITOR.lang.dir?\"rtl\":\"ltr\"));if(b instanceof CKEDITOR.ui.button)a.addClass(\"cke_button\"),a.addClass(\"cke_toolgroup\"),a.append(d);\nelse if(CKEDITOR.ui.richCombo&&b instanceof CKEDITOR.ui.richCombo){var d=new CKEDITOR.dom.element(\"span\"),c=new CKEDITOR.dom.element(\"span\"),f=new CKEDITOR.dom.element(\"span\");a.addClass(\"cke_combo_button\");d.addClass(\"cke_combo_text\");d.addClass(\"cke_combo_inlinelabel\");d.setText(b.label);c.addClass(\"cke_combo_open\");f.addClass(\"cke_combo_arrow\");c.append(f);a.append(d);a.append(c)}return a};e.createIcon=function(b,a,d){var c=CKEDITOR.skin.getIconStyle(b,\"rtl\"==CKEDITOR.lang.dir),c=(c=c||CKEDITOR.skin.getIconStyle(a,\n\"rtl\"==CKEDITOR.lang.dir))||CKEDITOR.skin.getIconStyle(d,\"rtl\"==CKEDITOR.lang.dir);a=new CKEDITOR.dom.element(\"span\");a.addClass(\"cke_button_icon\");a.addClass(\"cke_button__\"+b+\"_icon\");a.setAttribute(\"style\",c);a.setStyle(\"float\",\"none\");return a};e.createButton=function(b,a){var d=new CKEDITOR.dom.element(\"button\");d.addClass(\"button-a\");d.setAttribute(\"type\",\"button\");if(\"string\"==typeof a){a=a.split(\" \");for(var c=a.length;c--;)d.addClass(a[c])}d.setHtml(b);return d};e.groupToButtons=function(b){for(var a=\n[],d=(b=b.items)?b.length:0,c=0;c<d;c+=1){var f=b[c];if(f instanceof CKEDITOR.ui.button||CKEDITOR.ui.richCombo&&f instanceof CKEDITOR.ui.richCombo)f.$=e.createToolbarButton(f),a.push(f)}return a}})();"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/js/toolbarmodifier.js",
    "content": "﻿(function(){function d(a,b){l.call(this,a,b);this.actualConfig=this.originalConfig=this.removedButtons=null;this.emptyVisible=!1;this.state=\"edit\";this.toolbarButtons=[{text:{active:\"Hide empty toolbar groups\",inactive:\"Show empty toolbar groups\"},group:\"edit\",position:\"left\",cssClass:\"button-a-soft\",clickCallback:function(a,b){a[a.hasClass(\"button-a-background\")?\"removeClass\":\"addClass\"](\"button-a-background\");this._toggleVisibilityEmptyElements();this.emptyVisible?a.setText(b.text.active):a.setText(b.text.inactive)}},\n{text:\"Add row separator\",group:\"edit\",position:\"left\",cssClass:\"button-a-soft\",clickCallback:function(){this._addSeparator()}},{text:\"Select config\",group:\"config\",position:\"left\",cssClass:\"button-a-soft\",clickCallback:function(){this.configContainer.findOne(\"textarea\").$.select()}},{text:\"Back to configurator\",group:\"config\",position:\"right\",cssClass:\"button-a-background\",clickCallback:function(){if(\"paste\"===this.state){var a=this.configContainer.findOne(\"textarea\").getValue();(a=d.evaluateToolbarGroupsConfig(a))?\nthis.setConfig(a):alert(\"Your pasted config is wrong.\")}this.state=\"edit\";this._showConfigurationTool();this.showToolbarBtnsByGroupName(this.state)}},{text:'Get toolbar \\x3cspan class\\x3d\"highlight\"\\x3econfig\\x3c/span\\x3e',group:\"edit\",position:\"right\",cssClass:\"button-a-background icon-pos-left icon-download\",clickCallback:function(){this.state=\"config\";this._showConfig();this.showToolbarBtnsByGroupName(this.state)}}];this.cachedActiveElement=null}var l=ToolbarConfigurator.AbstractToolbarModifier;\nToolbarConfigurator.ToolbarModifier=d;d.prototype=Object.create(ToolbarConfigurator.AbstractToolbarModifier.prototype);d.prototype.getActualConfig=function(){var a=l.prototype.getActualConfig.call(this);if(a.toolbarGroups)for(var b=a.toolbarGroups.length,c=0;c<b;c+=1)a.toolbarGroups[c]=d.parseGroupToConfigValue(a.toolbarGroups[c]);return a};d.prototype._onInit=function(a,b,c){c=!0===c;l.prototype._onInit.call(this,void 0,b);this.removedButtons=[];c?this.removedButtons=this.actualConfig.removeButtons?\nthis.actualConfig.removeButtons.split(\",\"):[]:\"removeButtons\"in this.originalConfig?this.removedButtons=this.originalConfig.removeButtons?this.originalConfig.removeButtons.split(\",\"):[]:(this.originalConfig.removeButtons=\"\",this.removedButtons=[]);this.actualConfig.toolbarGroups||(this.actualConfig.toolbarGroups=this.fullToolbarEditor.getFullToolbarGroupsConfig());this._fixGroups(this.actualConfig);this._calculateTotalBtns();this._createModifier();this._refreshMoveBtnsAvalibility();this._refreshBtnTabIndexes();\n\"function\"===typeof a&&a(this.mainContainer)};d.prototype._showConfigurationTool=function(){this.configContainer.addClass(\"hidden\");this.modifyContainer.removeClass(\"hidden\")};d.prototype._showConfig=function(){var a=this.getActualConfig(),b,c;if(a.toolbarGroups){b=a.toolbarGroups;for(var e=this.cfg.trimEmptyGroups,f=[],g=b.length,m=0;m<g;m++){var h=b[m];if(\"/\"===h)f.push(\"'/'\");else{if(e)for(var k=h.groups.length;k--;)0===d.getTotalSubGroupButtonsNumber(h.groups[k],this.fullToolbarEditor)&&h.groups.splice(k,\n1);e&&0===h.groups.length||f.push(l.stringifyJSONintoOneLine(h,{addSpaces:!0,noQuotesOnKey:!0,singleQuotes:!0}))}}b=\"\\n\\t\\t\"+f.join(\",\\n\\t\\t\")}a.removeButtons&&(c=a.removeButtons);a=['\\x3ctextarea class\\x3d\"configCode\" readonly\\x3eCKEDITOR.editorConfig \\x3d function( config ) {\\n',b?\"\\tconfig.toolbarGroups \\x3d [\"+b+\"\\n\\t];\":\"\",c?\"\\n\\n\":\"\",c?\"\\tconfig.removeButtons \\x3d '\"+c+\"';\":\"\",\"\\n};\\x3c/textarea\\x3e\"].join(\"\");this.modifyContainer.addClass(\"hidden\");this.configContainer.removeClass(\"hidden\");\nthis.configContainer.setHtml(a)};d.prototype._toggleVisibilityEmptyElements=function(){this.modifyContainer.hasClass(\"empty-visible\")?(this.modifyContainer.removeClass(\"empty-visible\"),this.emptyVisible=!1):(this.modifyContainer.addClass(\"empty-visible\"),this.emptyVisible=!0);this._refreshMoveBtnsAvalibility()};d.prototype._createModifier=function(){function a(){b._highlightGroup(this.data(\"name\"))}var b=this;l.prototype._createModifier.call(this);this.modifyContainer.setHtml(this._toolbarConfigToListString());\nvar c=this.modifyContainer.find('li[data-type\\x3d\"group\"]');this.modifyContainer.on(\"mouseleave\",function(){this._dehighlightActiveToolGroup()},this);for(var e=c.count(),f=0;f<e;f+=1)c.getItem(f).on(\"mouseenter\",a);CKEDITOR.document.on(\"keypress\",function(a){a=a.data.$.keyCode;a=32===a||13===a;var c=new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);c.getAscendant(function(a){return a.$===b.mainContainer.$})&&a&&\"button\"===c.data(\"type\")&&c.findOne(\"input\").$.click()});this.modifyContainer.on(\"click\",\nfunction(a){var c=a.data.$,e=new CKEDITOR.dom.element(c.target||c.srcElement);if(a=d.getGroupOrSeparatorLiAncestor(e)){b.cachedActiveElement=document.activeElement;if(e.$ instanceof HTMLInputElement)b._handleCheckboxClicked(e);else if(e.$ instanceof HTMLButtonElement&&(c.preventDefault?c.preventDefault():c.returnValue=!1,(c=b._handleAnchorClicked(e.$))&&\"remove\"==c.action))return;c=a.data(\"type\");a=a.data(\"name\");b._setActiveElement(c,a);b.cachedActiveElement&&b.cachedActiveElement.focus()}});this.toolbarContainer||\n(this._createToolbar(),this.toolbarContainer.insertBefore(this.mainContainer.getChildren().getItem(0)));this.showToolbarBtnsByGroupName(\"edit\");this.configContainer||(this.configContainer=new CKEDITOR.dom.element(\"div\"),this.configContainer.addClass(\"configContainer\"),this.configContainer.addClass(\"hidden\"),this.mainContainer.append(this.configContainer));return this.mainContainer};d.prototype.showToolbarBtnsByGroupName=function(a){if(this.toolbarContainer)for(var b=this.toolbarContainer.find(\"button\"),\nc=b.count(),e=0;e<c;e+=1){var d=b.getItem(e);d.data(\"group\")==a?d.removeClass(\"hidden\"):d.addClass(\"hidden\")}};d.parseGroupToConfigValue=function(a){if(\"separator\"==a.type)return\"/\";var b=a.groups,c=b.length;delete a.totalBtns;for(var e=0;e<c;e+=1)b[e]=b[e].name;return a};d.getGroupOrSeparatorLiAncestor=function(a){return a.$ instanceof HTMLLIElement&&\"group\"==a.data(\"type\")?a:d.getFirstAncestor(a,function(a){a=a.data(\"type\");return\"group\"==a||\"separator\"==a})};d.prototype._setActiveElement=function(a,\nb){this.currentActive&&this.currentActive.elem.removeClass(\"active\");if(null===a)this._dehighlightActiveToolGroup(),this.currentActive=null;else{var c=this.mainContainer.findOne('ul[data-type\\x3dtable-body] li[data-type\\x3d\"'+a+'\"][data-name\\x3d\"'+b+'\"]');c.addClass(\"active\");this.currentActive={type:a,name:b,elem:c};\"group\"==a&&this._highlightGroup(b);\"separator\"==a&&this._dehighlightActiveToolGroup()}};d.prototype.getActiveToolGroup=function(){return this.editorInstance.container?this.editorInstance.container.findOne(\".cke_toolgroup.active, .cke_toolbar.active\"):\nnull};d.prototype._dehighlightActiveToolGroup=function(){var a=this.getActiveToolGroup();a&&a.removeClass(\"active\");this.editorInstance.container&&this.editorInstance.container.removeClass(\"some-toolbar-active\")};d.prototype._highlightGroup=function(a){this.editorInstance.container&&(a=this.getFirstEnabledButtonInGroup(a),a=this.editorInstance.container.findOne(\".cke_button__\"+a+\", .cke_combo__\"+a),this._dehighlightActiveToolGroup(),this.editorInstance.container&&this.editorInstance.container.addClass(\"some-toolbar-active\"),\na&&(a=d.getFirstAncestor(a,function(a){return a.hasClass(\"cke_toolbar\")}))&&a.addClass(\"active\"))};d.prototype.getFirstEnabledButtonInGroup=function(a){var b=this.actualConfig.toolbarGroups;a=this.getGroupIndex(a);b=b[a];if(-1===a)return null;a=b.groups?b.groups.length:0;for(var c=0;c<a;c+=1){var e=this.getFirstEnabledButtonInSubgroup(b.groups[c].name);if(e)return e}return null};d.prototype.getFirstEnabledButtonInSubgroup=function(a){for(var b=(a=this.fullToolbarEditor.buttonsByGroup[a])?a.length:\n0,c=0;c<b;c+=1){var e=a[c].name;if(!this.isButtonRemoved(e))return e}return null};d.prototype._handleCheckboxClicked=function(a){var b=a.getAscendant(\"li\").data(\"name\");a.$.checked?this._removeButtonFromRemoved(b):this._addButtonToRemoved(b)};d.prototype._handleAnchorClicked=function(a){a=new CKEDITOR.dom.element(a);var b=a.getAscendant(\"li\"),c=b.getAscendant(\"ul\"),e=b.data(\"type\"),d=b.data(\"name\"),g=a.data(\"direction\"),m=\"up\"===g?b.getPrevious():b.getNext(),h;if(a.hasClass(\"disabled\"))return null;\nif(a.hasClass(\"remove\"))return b.remove(),this._removeSeparator(b.data(\"name\")),this._setActiveElement(null),{action:\"remove\"};if(!a.hasClass(\"move\")||!m)return{action:null};if(\"group\"===e||\"separator\"===e)h=this._moveGroup(g,d);\"subgroup\"===e&&(h=b.getAscendant(\"li\").data(\"name\"),h=this._moveSubgroup(g,h,d));\"up\"===g&&b.insertBefore(c.getChild(h));\"down\"===g&&b.insertAfter(c.getChild(h));for(var k;b=\"up\"===g?b.getPrevious():b.getNext();)if(this.emptyVisible||!b.hasClass(\"empty\")){k=b;break}k||(k=\n'[data-direction\\x3d\"'+(\"up\"===g?\"down\":\"up\")+'\"]',this.cachedActiveElement=a.getParent().findOne(k));this._refreshMoveBtnsAvalibility();this._refreshBtnTabIndexes();return{action:\"move\"}};d.prototype._refreshMoveBtnsAvalibility=function(){function a(a){var c=a.count();for(d=0;d<c;d+=1)b._disableElementsInList(a.getItem(d))}for(var b=this,c=this.mainContainer.find(\"ul[data-type\\x3dtable-body] li \\x3e p \\x3e span \\x3e button.move.disabled\"),e=c.count(),d=0;d<e;d+=1)c.getItem(d).removeClass(\"disabled\");\na(this.mainContainer.find(\"ul[data-type\\x3dtable-body]\"));a(this.mainContainer.find(\"ul[data-type\\x3dtable-body] \\x3e li \\x3e ul\"))};d.prototype._refreshBtnTabIndexes=function(){for(var a=this.mainContainer.find('[data-tab\\x3d\"true\"]'),b=a.count(),c=0;c<b;c++){var e=a.getItem(c),d=e.hasClass(\"disabled\");e.setAttribute(\"tabindex\",d?-1:c)}};d.prototype._disableElementsInList=function(a){function b(a){return!a.hasClass(\"empty\")}if(a.getChildren().count()){var c;this.emptyVisible?(c=a.getFirst(),a=a.getLast()):\n(c=a.getFirst(b),a=a.getLast(b));if(c)var e=c.findOne('p button[data-direction\\x3d\"up\"]');if(a)var d=a.findOne('p button[data-direction\\x3d\"down\"]');e&&(e.addClass(\"disabled\"),e.setAttribute(\"tabindex\",\"-1\"));d&&(d.addClass(\"disabled\"),d.setAttribute(\"tabindex\",\"-1\"))}};d.prototype.getGroupIndex=function(a){for(var b=this.actualConfig.toolbarGroups,c=b.length,d=0;d<c;d+=1)if(b[d].name===a)return d;return-1};d.prototype._addSeparator=function(){var a=this._determineSeparatorToAddIndex(),b=d.createSeparatorLiteral(),\nc=CKEDITOR.dom.element.createFromHtml(d.getToolbarSeparatorString(b));this.actualConfig.toolbarGroups.splice(a,0,b);c.insertBefore(this.modifyContainer.findOne(\"ul[data-type\\x3dtable-body]\").getChild(a));this._setActiveElement(\"separator\",b.name);this._refreshMoveBtnsAvalibility();this._refreshBtnTabIndexes();this._refreshEditor()};d.prototype._removeSeparator=function(a){var b=CKEDITOR.tools.indexOf(this.actualConfig.toolbarGroups,function(b){return\"separator\"==b.type&&b.name==a});this.actualConfig.toolbarGroups.splice(b,\n1);this._refreshMoveBtnsAvalibility();this._refreshBtnTabIndexes();this._refreshEditor()};d.prototype._determineSeparatorToAddIndex=function(){return this.currentActive?(\"group\"==this.currentActive.elem.data(\"type\")||\"separator\"==this.currentActive.elem.data(\"type\")?this.currentActive.elem:this.currentActive.elem.getAscendant(\"li\")).getIndex():0};d.prototype._moveElement=function(a,b,c){function e(a){return a.totalBtns||\"separator\"==a.type}c=this.emptyVisible?\"down\"==c?b+1:b-1:d.getFirstElementIndexWith(a,\nb,c,e);return d.moveTo(c-b,a,b)};d.prototype._moveGroup=function(a,b){var c=this.getGroupIndex(b),c=this._moveElement(this.actualConfig.toolbarGroups,c,a);this._refreshMoveBtnsAvalibility();this._refreshBtnTabIndexes();this._refreshEditor();return c};d.prototype._moveSubgroup=function(a,b,c){b=this.getGroupIndex(b);b=this.actualConfig.toolbarGroups[b];var d=CKEDITOR.tools.indexOf(b.groups,function(a){return a.name==c});a=this._moveElement(b.groups,d,a);this._refreshEditor();return a};d.prototype._calculateTotalBtns=\nfunction(){for(var a=this.actualConfig.toolbarGroups,b=a.length;b--;){var c=a[b],e=d.getTotalGroupButtonsNumber(c,this.fullToolbarEditor);\"separator\"!=c.type&&(c.totalBtns=e)}};d.prototype._addButtonToRemoved=function(a){if(-1!=CKEDITOR.tools.indexOf(this.removedButtons,a))throw\"Button already added to removed\";this.removedButtons.push(a);this.actualConfig.removeButtons=this.removedButtons.join(\",\");this._refreshEditor()};d.prototype._removeButtonFromRemoved=function(a){a=CKEDITOR.tools.indexOf(this.removedButtons,\na);if(-1===a)throw\"Trying to remove button from removed, but not found\";this.removedButtons.splice(a,1);this.actualConfig.removeButtons=this.removedButtons.join(\",\");this._refreshEditor()};d.parseGroupToConfigValue=function(a){if(\"separator\"==a.type)return\"/\";var b=a.groups,c=b.length;delete a.totalBtns;for(var d=0;d<c;d+=1)b[d]=b[d].name;return a};d.getGroupOrSeparatorLiAncestor=function(a){return a.$ instanceof HTMLLIElement&&\"group\"==a.data(\"type\")?a:d.getFirstAncestor(a,function(a){a=a.data(\"type\");\nreturn\"group\"==a||\"separator\"==a})};d.createSeparatorLiteral=function(){return{type:\"separator\",name:\"separator\"+CKEDITOR.tools.getNextNumber()}};d.prototype._toolbarConfigToListString=function(){for(var a=this.actualConfig.toolbarGroups||[],b='\\x3cul data-type\\x3d\"table-body\"\\x3e',c=a.length,e=0;e<c;e+=1)var f=a[e],b=\"separator\"===f.type?b+d.getToolbarSeparatorString(f):b+this._getToolbarGroupString(f);b+=\"\\x3c/ul\\x3e\";return d.getToolbarHeaderString()+b};d.prototype._getToolbarGroupString=function(a){var b=\na.groups,c;c=\"\"+['\\x3cli data-type\\x3d\"group\" data-name\\x3d\"',a.name,'\" ',a.totalBtns?\"\":'class\\x3d\"empty\"',\"\\x3e\"].join(\"\");c+=d.getToolbarElementPreString(a)+\"\\x3cul\\x3e\";a=b.length;for(var e=0;e<a;e+=1){var f=b[e];c+=this._getToolbarSubgroupString(f,this.fullToolbarEditor.buttonsByGroup[f.name])}return c+\"\\x3c/ul\\x3e\\x3c/li\\x3e\"};d.getToolbarSeparatorString=function(a){return['\\x3cli data-type\\x3d\"',a.type,'\" data-name\\x3d\"',a.name,'\"\\x3e',d.getToolbarElementPreString(\"row separator\"),\"\\x3c/li\\x3e\"].join(\"\")};\nd.getToolbarHeaderString=function(){return'\\x3cul data-type\\x3d\"table-header\"\\x3e\\x3cli data-type\\x3d\"header\"\\x3e\\x3cp\\x3eToolbars\\x3c/p\\x3e\\x3cul\\x3e\\x3cli\\x3e\\x3cp\\x3eToolbar groups\\x3c/p\\x3e\\x3cp\\x3eToolbar group items\\x3c/p\\x3e\\x3c/li\\x3e\\x3c/ul\\x3e\\x3c/li\\x3e\\x3c/ul\\x3e'};d.getFirstAncestor=function(a,b){for(var c=a.getParents(),d=c.length;d--;)if(b(c[d]))return c[d];return null};d.getFirstElementIndexWith=function(a,b,c,d){for(;\"up\"===c?b--:++b<a.length;)if(d(a[b]))return b;return-1};d.moveTo=\nfunction(a,b,c){var d;-1!==c&&(d=b.splice(c,1)[0]);a=c+a;b.splice(a,0,d);return a};d.getTotalSubGroupButtonsNumber=function(a,b){var c=b.buttonsByGroup[\"string\"==typeof a?a:a.name];return c?c.length:0};d.getTotalGroupButtonsNumber=function(a,b){for(var c=0,e=a.groups,f=e?e.length:0,g=0;g<f;g+=1)c+=d.getTotalSubGroupButtonsNumber(e[g],b);return c};d.prototype._getToolbarSubgroupString=function(a,b){var c;c=\"\"+['\\x3cli data-type\\x3d\"subgroup\" data-name\\x3d\"',a.name,'\" ',a.totalBtns?\"\":'class\\x3d\"empty\" ',\n\"\\x3e\"].join(\"\");c+=d.getToolbarElementPreString(a.name);c+=\"\\x3cul\\x3e\";for(var e=b?b.length:0,f=0;f<e;f+=1)c+=this.getButtonString(b[f]);return c+=\"\\x3c/ul\\x3e\\x3c/li\\x3e\"};d.prototype._getConfigButtonName=function(a){var b=this.fullToolbarEditor.editorInstance.ui.items,c;for(c in b)if(b[c].name==a)return c;return null};d.prototype.isButtonRemoved=function(a){return-1!=CKEDITOR.tools.indexOf(this.removedButtons,this._getConfigButtonName(a))};d.prototype.getButtonString=function(a){var b=this.isButtonRemoved(a.name)?\n\"\":'checked\\x3d\"checked\"';return['\\x3cli data-tab\\x3d\"true\" data-type\\x3d\"button\" data-name\\x3d\"',this._getConfigButtonName(a.name),'\"\\x3e\\x3clabel title\\x3d\"',a.label,'\" \\x3e\\x3cinput tabindex\\x3d\"-1\"type\\x3d\"checkbox\"',b,\"/\\x3e\",a.$.getOuterHtml(),\"\\x3c/label\\x3e\\x3c/li\\x3e\"].join(\"\")};d.getToolbarElementPreString=function(a){a=a.name?a.name:a;return['\\x3cp\\x3e\\x3cspan\\x3e\\x3cbutton title\\x3d\"Move element upward\" data-tab\\x3d\"true\" data-direction\\x3d\"up\" class\\x3d\"move icon-up-big\"\\x3e\\x3c/button\\x3e\\x3cbutton title\\x3d\"Move element downward\" data-tab\\x3d\"true\" data-direction\\x3d\"down\" class\\x3d\"move icon-down-big\"\\x3e\\x3c/button\\x3e',\n\"row separator\"==a?'\\x3cbutton title\\x3d\"Remove element\" data-tab\\x3d\"true\" class\\x3d\"remove icon-trash\"\\x3e\\x3c/button\\x3e':\"\",a,\"\\x3c/span\\x3e\\x3c/p\\x3e\"].join(\"\")};d.evaluateToolbarGroupsConfig=function(a){return a=function(a){var c={},d;try{d=eval(\"(\"+a+\")\")}catch(f){try{d=eval(a)}catch(g){return null}}return c.toolbarGroups&&\"number\"===typeof c.toolbarGroups.length?JSON.stringify(c):d&&\"number\"===typeof d.length?JSON.stringify({toolbarGroups:d}):d&&d.toolbarGroups?JSON.stringify(d):null}(a)};\nreturn d})();"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/js/toolbartextmodifier.js",
    "content": "﻿(function(){function e(a){l.call(this,a);this.hintContainer=this.codeContainer=null}var l=ToolbarConfigurator.AbstractToolbarModifier,g=ToolbarConfigurator.FullToolbarEditor;ToolbarConfigurator.ToolbarTextModifier=e;e.prototype=Object.create(l.prototype);e.prototype._onInit=function(a,d){l.prototype._onInit.call(this,void 0,d);this._createModifier(d?this.actualConfig:void 0);\"function\"===typeof a&&a(this.mainContainer)};e.prototype._createModifier=function(a){function d(a){var b=c(a);if(null!==b.charsBetween){var d=\nk.getUnusedButtonsArray(k.actualConfig.toolbar,!0,b.charsBetween),e=a.getCursor(),b=CodeMirror.Pos(e.line,e.ch-b.charsBetween.length),h=a.getTokenAt(e);\"{\"===a.getTokenAt({line:e.line,ch:h.start}).string&&(d=[\"name\"]);if(0!==d.length)return new f(b,e,d)}}function f(a,c,b){this.from=a;this.to=c;this.list=b;this._handlers=[]}function c(a,c){var b={};b.cur=a.getCursor();b.tok=a.getTokenAt(b.cur);b[\"char\"]=c||b.tok.string.charAt(b.tok.string.length-1);var d=a.getRange(CodeMirror.Pos(b.cur.line,0),b.cur).split(\"\").reverse().join(\"\"),\nd=d.replace(/(['|\"]\\w*['|\"])/g,\"\");b.charsBetween=d.match(/(^\\w*)(['|\"])/);b.charsBetween&&(b.endChar=b.charsBetween[2],b.charsBetween=b.charsBetween[1].split(\"\").reverse().join(\"\"));return b}function b(a){setTimeout(function(){a.state.completionActive||CodeMirror.showHint(a,d,{hintsClass:\"toolbar-modifier\",completeSingle:!1})},100);return CodeMirror.Pass}var k=this;this._createToolbar();this.toolbarContainer&&this.mainContainer.append(this.toolbarContainer);l.prototype._createModifier.call(this);\nthis._setupActualConfig(a);a=this.actualConfig.toolbar;a=CKEDITOR.tools.isArray(a)?\"\\tconfig.toolbar \\x3d \"+(\"[\\n\\t\\t\"+g.map(a,function(a){return l.stringifyJSONintoOneLine(a,{addSpaces:!0,noQuotesOnKey:!0,singleQuotes:!0})}).join(\",\\n\\t\\t\")+\"\\n\\t]\")+\";\":\"config.toolbar \\x3d [];\";a=[\"CKEDITOR.editorConfig \\x3d function( config ) {\\n\",a,\"\\n};\"].join(\"\");var e=new CKEDITOR.dom.element(\"div\");e.addClass(\"codemirror-wrapper\");this.modifyContainer.append(e);this.codeContainer=CodeMirror(e.$,{mode:{name:\"javascript\",\njson:!0},lineNumbers:!1,lineWrapping:!0,viewportMargin:Infinity,value:a,smartIndent:!1,indentWithTabs:!0,indentUnit:4,tabSize:4,theme:\"neo\",extraKeys:{Left:b,Right:b,\"'''\":b,\"'\\\"'\":b,Backspace:b,Delete:b,\"Shift-Tab\":\"indentLess\"}});this.codeContainer.on(\"endCompletion\",function(a,b){var d=c(a);void 0!==b&&a.replaceSelection(d.endChar)});this.codeContainer.on(\"change\",function(){var a=k.codeContainer.getValue(),a=k._evaluateValue(a);null!==a?(k.actualConfig.toolbar=a.toolbar?a.toolbar:k.actualConfig.toolbar,\nk._fillHintByUnusedElements(),k._refreshEditor(),k.mainContainer.removeClass(\"invalid\")):k.mainContainer.addClass(\"invalid\")});this.hintContainer=new CKEDITOR.dom.element(\"div\");this.hintContainer.addClass(\"toolbarModifier-hints\");this._fillHintByUnusedElements();this.hintContainer.insertBefore(e)};e.prototype._fillHintByUnusedElements=function(){var a=this.getUnusedButtonsArray(this.actualConfig.toolbar,!0),a=this.groupButtonNamesByGroup(a),d=g.map(a,function(a){var b=g.map(a.buttons,function(a){return\"\\x3ccode\\x3e\"+\na+\"\\x3c/code\\x3e \"}).join(\"\");return[\"\\x3cdt\\x3e\\x3ccode\\x3e\",a.name,\"\\x3c/code\\x3e\\x3c/dt\\x3e\\x3cdd\\x3e\",b,\"\\x3c/dd\\x3e\"].join(\"\")}).join(\" \"),f='\\x3cdt class\\x3d\"list-header\"\\x3eToolbar group\\x3c/dt\\x3e\\x3cdd class\\x3d\"list-header\"\\x3eUnused items\\x3c/dd\\x3e';a.length||(f=\"\\x3cp\\x3eAll items are in use.\\x3c/p\\x3e\");this.codeContainer.refresh();this.hintContainer.setHtml(\"\\x3ch3\\x3eUnused toolbar items\\x3c/h3\\x3e\\x3cdl\\x3e\"+f+d+\"\\x3c/dl\\x3e\")};e.prototype.getToolbarGroupByButtonName=function(a){var d=\nthis.fullToolbarEditor.buttonNamesByGroup,f;for(f in d)for(var c=d[f],b=c.length;b--;)if(a===c[b])return f;return null};e.prototype.getUnusedButtonsArray=function(a,d,f){d=!0===d?!0:!1;var c=e.mapToolbarCfgToElementsList(a);a=Object.keys(this.fullToolbarEditor.editorInstance.ui.items);a=g.filter(a,function(a){var d=\"-\"===a;a=void 0===f||0===a.toLowerCase().indexOf(f.toLowerCase());return!d&&a});a=g.filter(a,function(a){return-1==CKEDITOR.tools.indexOf(c,a)});d&&a.sort();return a};e.prototype.groupButtonNamesByGroup=\nfunction(a){var d=[],f=JSON.parse(JSON.stringify(this.fullToolbarEditor.buttonNamesByGroup)),c;for(c in f){var b=f[c],b=g.filter(b,function(b){return-1!==CKEDITOR.tools.indexOf(a,b)});b.length&&d.push({name:c,buttons:b})}return d};e.mapToolbarCfgToElementsList=function(a){function d(a){return\"-\"!==a}for(var f=[],c=a.length,b=0;b<c;b+=1)a[b]&&\"string\"!==typeof a[b]&&(f=f.concat(g.filter(a[b].items,d)));return f};e.prototype._setupActualConfig=function(a){a=a||this.editorInstance.config;CKEDITOR.tools.isArray(a.toolbar)||\n(a.toolbarGroups||(a.toolbarGroups=this.fullToolbarEditor.getFullToolbarGroupsConfig(!0)),this._fixGroups(a),a.toolbar=this._mapToolbarGroupsToToolbar(a.toolbarGroups,this.actualConfig.removeButtons),this.actualConfig.toolbar=a.toolbar,this.actualConfig.removeButtons=\"\")};e.prototype._mapToolbarGroupsToToolbar=function(a,d){d=d||this.editorInstance.config.removedBtns;d=\"string\"==typeof d?d.split(\",\"):[];for(var f=a.length;f--;){var c=this._mapToolbarSubgroup(a[f],d);\"separator\"===a[f].type?a[f]=\"/\":\nCKEDITOR.tools.isArray(c)&&0===c.length?a.splice(f,1):a[f]=\"string\"==typeof c?c:{name:a[f].name,items:c}}return a};e.prototype._mapToolbarSubgroup=function(a,d){if(\"string\"==typeof a)return a;for(var f=a.groups?a.groups.length:0,c=[],b=0;b<f;b+=1){var e=a.groups[b],e=this.fullToolbarEditor.buttonsByGroup[\"string\"===typeof e?e:e.name]||[],e=this._mapButtonsToButtonsNames(e,d),g=e.length,c=c.concat(e);g&&c.push(\"-\")}\"-\"==c[c.length-1]&&c.pop();return c};e.prototype._mapButtonsToButtonsNames=function(a,\nd){for(var f=a.length;f--;){var c=a[f],c=\"string\"===typeof c?c:this.fullToolbarEditor.getCamelCasedButtonName(c.name);-1!==CKEDITOR.tools.indexOf(d,c)?a.splice(f,1):a[f]=c}return a};e.prototype._evaluateValue=function(a){var d;try{var f={};Function(\"var CKEDITOR \\x3d {}; \"+a+\"; return CKEDITOR;\")().editorConfig(f);d=f;for(var c=d.toolbar.length;c--;)d.toolbar[c]||d.toolbar.splice(c,1)}catch(b){d=null}return d};e.prototype.mapToolbarToToolbarGroups=function(a){function d(a,b){a=a.slice();for(var d=\nb.length;d--;){var c=a.indexOf(b[d]);-1!==c&&a.splice(c,1)}return a}for(var f={},c=[],b=[],c=a.length,e=0;e<c;e++)if(\"/\"===a[e])b.push(\"/\");else{var g=a[e].items,m={};m.name=a[e].name;m.groups=[];for(var l=g.length,p=0;p<l;p++){var n=g[p];if(\"-\"!==n){var h=this.getToolbarGroupByButtonName(n);-1===m.groups.indexOf(h)&&m.groups.push(h);f[h]=f[h]||{};h=f[h].buttons=f[h].buttons||{};h[n]=h[n]||{used:0,origin:m.name};h[n].used++}}b.push(m)}c=function(a,b){var c=[],e;for(e in a)var f=a[e],g=b[e].slice(),\nc=c.concat(d(g,Object.keys(f.buttons)));return c}(f,this.fullToolbarEditor.buttonNamesByGroup);return{toolbarGroups:b,removeButtons:c.join(\",\")}};return e})();"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/LICENSE",
    "content": "Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n  color: black;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror div.CodeMirror-cursor {\n  border-left: 1px solid black;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: #7e7;\n}\n.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n\n.cm-animate-fat-cursor {\n  width: auto;\n  border: 0;\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n}\n@-moz-keyframes blink {\n  0% { background: #7e7; }\n  50% { background: none; }\n  100% { background: #7e7; }\n}\n@-webkit-keyframes blink {\n  0% { background: #7e7; }\n  50% { background: none; }\n  100% { background: #7e7; }\n}\n@keyframes blink {\n  0% { background: #7e7; }\n  50% { background: none; }\n  100% { background: #7e7; }\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\ndiv.CodeMirror-overwrite div.CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3 {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  position: relative;\n  overflow: hidden;\n  background: white;\n}\n\n.CodeMirror-scroll {\n  overflow: scroll !important; /* Things will break if this is overridden */\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px; margin-right: -30px;\n  padding-bottom: 30px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 30px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actuall scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  display: inline-block;\n  margin-bottom: -30px;\n  /* Hack to make IE7 behave */\n  *zoom:1;\n  *display:inline;\n}\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  height: 100%;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n.CodeMirror-gutter-wrapper {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n  -webkit-tap-highlight-color: transparent;\n}\n.CodeMirror-wrap pre {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n.CodeMirror-measure pre { position: static; }\n\n.CodeMirror div.CodeMirror-cursor {\n  position: absolute;\n  border-right: none;\n  width: 0;\n}\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror ::selection { background: #d7d4f0; }\n.CodeMirror ::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n  background: #ffa;\n  background: rgba(255, 255, 0, .4);\n}\n\n/* IE7 hack to prevent it from returning funny offsetTops on the spans */\n.CodeMirror span { *vertical-align: text-bottom; }\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/codemirror.js",
    "content": "﻿(function(q){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=q();else{if(\"function\"==typeof define&&define.amd)return define([],q);this.CodeMirror=q()}})(function(){function q(a,b){if(!(this instanceof q))return new q(a,b);this.options=b=b?V(b):{};V(qf,b,!1);wc(b);var c=b.value;\"string\"==typeof c&&(c=new P(c,b.mode));this.doc=c;var d=new q.inputStyles[b.inputStyle](this),d=this.display=new rf(a,c,d);d.wrapper.CodeMirror=this;Ad(this);Bd(this);b.lineWrapping&&(this.display.wrapper.className+=\n\" CodeMirror-wrap\");b.autofocus&&!ab&&d.input.focus();Cd(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new bb,keySeq:null,specialChars:null};var e=this;B&&11>C&&setTimeout(function(){e.display.input.reset(!0)},20);sf(this);Dd||(tf(),Dd=!0);Ja(this);this.curOp.forceUpdate=!0;Ed(this,c);b.autofocus&&!ab||e.hasFocus()?setTimeout(cb(xc,this),20):db(this);for(var f in Ka)if(Ka.hasOwnProperty(f))Ka[f](this,\nb[f],Fd);Gd(this);b.finishInit&&b.finishInit(this);for(c=0;c<yc.length;++c)yc[c](this);La(this);J&&b.lineWrapping&&\"optimizelegibility\"==getComputedStyle(d.lineDiv).textRendering&&(d.lineDiv.style.textRendering=\"auto\")}function rf(a,b,c){this.input=c;this.scrollbarFiller=t(\"div\",null,\"CodeMirror-scrollbar-filler\");this.scrollbarFiller.setAttribute(\"cm-not-content\",\"true\");this.gutterFiller=t(\"div\",null,\"CodeMirror-gutter-filler\");this.gutterFiller.setAttribute(\"cm-not-content\",\"true\");this.lineDiv=\nt(\"div\",null,\"CodeMirror-code\");this.selectionDiv=t(\"div\",null,null,\"position: relative; z-index: 1\");this.cursorDiv=t(\"div\",null,\"CodeMirror-cursors\");this.measure=t(\"div\",null,\"CodeMirror-measure\");this.lineMeasure=t(\"div\",null,\"CodeMirror-measure\");this.lineSpace=t(\"div\",[this.measure,this.lineMeasure,this.selectionDiv,this.cursorDiv,this.lineDiv],null,\"position: relative; outline: none\");this.mover=t(\"div\",[t(\"div\",[this.lineSpace],\"CodeMirror-lines\")],null,\"position: relative\");this.sizer=t(\"div\",\n[this.mover],\"CodeMirror-sizer\");this.sizerWidth=null;this.heightForcer=t(\"div\",null,null,\"position: absolute; height: \"+Hd+\"px; width: 1px;\");this.gutters=t(\"div\",null,\"CodeMirror-gutters\");this.lineGutter=null;this.scroller=t(\"div\",[this.sizer,this.heightForcer,this.gutters],\"CodeMirror-scroll\");this.scroller.setAttribute(\"tabIndex\",\"-1\");this.wrapper=t(\"div\",[this.scrollbarFiller,this.gutterFiller,this.scroller],\"CodeMirror\");B&&8>C&&(this.gutters.style.zIndex=-1,this.scroller.style.paddingRight=\n0);J||wa&&ab||(this.scroller.draggable=!0);a&&(a.appendChild?a.appendChild(this.wrapper):a(this.wrapper));this.reportedViewFrom=this.reportedViewTo=this.viewFrom=this.viewTo=b.first;this.view=[];this.externalMeasured=this.renderedView=null;this.lastWrapHeight=this.lastWrapWidth=this.viewOffset=0;this.updateLineNumbers=null;this.nativeBarWidth=this.barHeight=this.barWidth=0;this.scrollbarsClipped=!1;this.lineNumWidth=this.lineNumInnerWidth=this.lineNumChars=null;this.alignWidgets=!1;this.maxLine=this.cachedCharWidth=\nthis.cachedTextHeight=this.cachedPaddingH=null;this.maxLineLength=0;this.maxLineChanged=!1;this.wheelDX=this.wheelDY=this.wheelStartX=this.wheelStartY=null;this.shift=!1;this.activeTouch=this.selForContextMenu=null;c.init(this)}function zc(a){a.doc.mode=q.getMode(a.options,a.doc.modeOption);eb(a)}function eb(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null)});a.doc.frontier=a.doc.first;fb(a,100);a.state.modeGen++;a.curOp&&Q(a)}function Id(a){var b=xa(a.display),\nc=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/gb(a.display)-3);return function(e){if(ya(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function Ac(a){var b=a.doc,c=Id(a);b.iter(function(a){var b=c(a);b!=a.height&&ca(a,b)})}function Bd(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\\s*cm-s-\\S+/g,\"\")+a.options.theme.replace(/(^|\\s)\\s*/g,\n\" cm-s-\");hb(a)}function ib(a){Ad(a);Q(a);setTimeout(function(){Bc(a)},20)}function Ad(a){var b=a.display.gutters,c=a.options.gutters;za(b);for(var d=0;d<c.length;++d){var e=c[d],f=b.appendChild(t(\"div\",null,\"CodeMirror-gutter \"+e));\"CodeMirror-linenumbers\"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+\"px\")}b.style.display=d?\"\":\"none\";Cc(a)}function Cc(a){a.display.sizer.style.marginLeft=a.display.gutters.offsetWidth+\"px\"}function Kb(a){if(0==a.height)return 0;for(var b=a.text.length,\nc,d=a;c=Aa(d,!0);)c=c.find(0,!0),d=c.from.line,b+=c.from.ch-c.to.ch;for(d=a;c=Aa(d,!1);)c=c.find(0,!0),b-=d.text.length-c.from.ch,d=c.to.line,b+=d.text.length-c.to.ch;return b}function Dc(a){var b=a.display;a=a.doc;b.maxLine=u(a,a.first);b.maxLineLength=Kb(b.maxLine);b.maxLineChanged=!0;a.iter(function(a){var d=Kb(a);d>b.maxLineLength&&(b.maxLineLength=d,b.maxLine=a)})}function wc(a){var b=D(a.gutters,\"CodeMirror-linenumbers\");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat([\"CodeMirror-linenumbers\"]):\n-1<b&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function jb(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+Ec(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+da(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function Fc(a,b,c){this.cm=\nc;var d=this.vert=t(\"div\",[t(\"div\",null,null,\"min-width: 1px\")],\"CodeMirror-vscrollbar\"),e=this.horiz=t(\"div\",[t(\"div\",null,null,\"height: 100%; min-height: 1px\")],\"CodeMirror-hscrollbar\");a(d);a(e);v(d,\"scroll\",function(){d.clientHeight&&b(d.scrollTop,\"vertical\")});v(e,\"scroll\",function(){e.clientWidth&&b(e.scrollLeft,\"horizontal\")});this.checkedOverlay=!1;B&&8>C&&(this.horiz.style.minHeight=this.vert.style.minWidth=\"18px\")}function Gc(){}function Cd(a){a.display.scrollbars&&(a.display.scrollbars.clear(),\na.display.scrollbars.addClass&&kb(a.display.wrapper,a.display.scrollbars.addClass));a.display.scrollbars=new q.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller);v(b,\"mousedown\",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)});b.setAttribute(\"cm-not-content\",\"true\")},function(b,c){\"horizontal\"==c?Ma(a,b):lb(a,b)},a);a.display.scrollbars.addClass&&mb(a.display.wrapper,a.display.scrollbars.addClass)}function Na(a,\nb){b||(b=jb(a));var c=a.display.barWidth,d=a.display.barHeight;Jd(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&Lb(a),Jd(a,jb(a)),c=a.display.barWidth,d=a.display.barHeight}function Jd(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+\"px\";c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+\"px\";d.right&&d.bottom?(c.scrollbarFiller.style.display=\"block\",c.scrollbarFiller.style.height=\nd.bottom+\"px\",c.scrollbarFiller.style.width=d.right+\"px\"):c.scrollbarFiller.style.display=\"\";d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display=\"block\",c.gutterFiller.style.height=d.bottom+\"px\",c.gutterFiller.style.width=b.gutterWidth+\"px\"):c.gutterFiller.style.display=\"\"}function Hc(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop,d=Math.floor(d-a.lineSpace.offsetTop),e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,d=Ba(b,d),\ne=Ba(b,e);if(c&&c.ensure){var f=c.ensure.from.line;c=c.ensure.to.line;f<d?(d=f,e=Ba(b,ea(u(b,f))+a.wrapper.clientHeight)):Math.min(c,b.lastLine())>=e&&(d=Ba(b,ea(u(b,c))-a.wrapper.clientHeight),e=c)}return{from:d,to:Math.max(e,d+1)}}function Bc(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=Ic(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+\"px\",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&c[g].gutter&&(c[g].gutter.style.left=\nf);var h=c[g].alignable;if(h)for(var k=0;k<h.length;k++)h[k].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+\"px\")}}function Gd(a){if(!a.options.lineNumbers)return!1;var b=a.doc,b=Jc(a.options,b.first+b.size-1),c=a.display;if(b.length!=c.lineNumChars){var d=c.measure.appendChild(t(\"div\",[t(\"div\",b)],\"CodeMirror-linenumber CodeMirror-gutter-elt\")),e=d.firstChild.offsetWidth,d=d.offsetWidth-e;c.lineGutter.style.width=\"\";c.lineNumInnerWidth=Math.max(e,c.lineGutter.offsetWidth-d)+1;c.lineNumWidth=\nc.lineNumInnerWidth+d;c.lineNumChars=c.lineNumInnerWidth?b.length:-1;c.lineGutter.style.width=c.lineNumWidth+\"px\";Cc(a);return!0}return!1}function Jc(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function Ic(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function Mb(a,b,c){var d=a.display;this.viewport=b;this.visible=Hc(d,a.doc,b);this.editorIsHidden=!d.wrapper.offsetWidth;this.wrapperHeight=d.wrapper.clientHeight;this.wrapperWidth=d.wrapper.clientWidth;\nthis.oldDisplayWidth=pa(a);this.force=c;this.dims=Kc(a);this.events=[]}function Lc(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return qa(a),!1;if(!b.force&&b.visible.from>=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==Kd(a))return!1;Gd(a)&&(qa(a),b.dims=Kc(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFrom<f&&20>f-c.viewFrom&&\n(f=Math.max(d.first,c.viewFrom));c.viewTo>g&&20>c.viewTo-g&&(g=Math.min(e,c.viewTo));ra&&(f=Mc(a.doc,f),g=Ld(a.doc,g));d=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;e=a.display;0==e.view.length||f>=e.viewTo||g<=e.viewFrom?(e.view=Nb(a,f,g),e.viewFrom=f):(e.viewFrom>f?e.view=Nb(a,f,e.viewFrom).concat(e.view):e.viewFrom<f&&(e.view=e.view.slice(Ca(a,f))),e.viewFrom=f,e.viewTo<g?e.view=e.view.concat(Nb(a,e.viewTo,g)):e.viewTo>g&&(e.view=e.view.slice(0,\nCa(a,g))));e.viewTo=g;c.viewOffset=ea(u(a.doc,c.viewFrom));a.display.mover.style.top=c.viewOffset+\"px\";g=Kd(a);if(!d&&0==g&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;f=fa();4<g&&(c.lineDiv.style.display=\"none\");uf(a,c.updateLineNumbers,b.dims);4<g&&(c.lineDiv.style.display=\"\");c.renderedView=c.view;f&&fa()!=f&&f.offsetHeight&&f.focus();za(c.cursorDiv);za(c.selectionDiv);c.gutters.style.height=0;d&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=\nb.wrapperWidth,fb(a,400));c.updateLineNumbers=null;return!0}function Md(a,b){for(var c=b.viewport,d=!0;;d=!1){if(!d||!a.options.lineWrapping||b.oldDisplayWidth==pa(a))if(c&&null!=c.top&&(c={top:Math.min(a.doc.height+Ec(a.display)-Nc(a),c.top)}),b.visible=Hc(a.display,a.doc,c),b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!Lc(a,b))break;Lb(a);d=jb(a);nb(a);Oc(a,d);Na(a,d)}b.signal(a,\"update\",a);if(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)b.signal(a,\n\"viewportChange\",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo}function Pc(a,b){var c=new Mb(a,b);if(Lc(a,c)){Lb(a);Md(a,c);var d=jb(a);nb(a);Oc(a,d);Na(a,d);c.finish()}}function Oc(a,b){a.display.sizer.style.minHeight=b.docHeight+\"px\";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+\"px\";a.display.gutters.style.height=Math.max(c+da(a),b.clientHeight)+\"px\"}function Lb(a){a=a.display;for(var b=\na.lineDiv.offsetTop,c=0;c<a.view.length;c++){var d=a.view[c],e;if(!d.hidden){if(B&&8>C){var f=d.node.offsetTop+d.node.offsetHeight;e=f-b;b=f}else e=d.node.getBoundingClientRect(),e=e.bottom-e.top;f=d.line.height-e;2>e&&(e=xa(a));if(.001<f||-.001>f)if(ca(d.line,e),Nd(d.line),d.rest)for(e=0;e<d.rest.length;e++)Nd(d.rest[e])}}}function Nd(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[b].height=a.widgets[b].node.offsetHeight}function Kc(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,\nf=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g)c[a.options.gutters[g]]=f.offsetLeft+f.clientLeft+e,d[a.options.gutters[g]]=f.clientWidth;return{fixedPos:Ic(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function uf(a,b,c){function d(b){var c=b.nextSibling;J&&W&&a.display.currentWheelTarget==b?b.style.display=\"none\":b.parentNode.removeChild(b);return c}for(var e=a.display,f=a.options.lineNumbers,g=e.lineDiv,h=g.firstChild,k=e.view,e=e.viewFrom,\nl=0;l<k.length;l++){var m=k[l];if(!m.hidden)if(m.node&&m.node.parentNode==g){for(;h!=m.node;)h=d(h);h=f&&null!=b&&b<=e&&m.lineNumber;m.changes&&(-1<D(m.changes,\"gutter\")&&(h=!1),Od(a,m,e,c));h&&(za(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(Jc(a.options,e))));h=m.node.nextSibling}else{var p=vf(a,m,e,c);g.insertBefore(p,h)}e+=m.size}for(;h;)h=d(h)}function Od(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes[e];if(\"text\"==f){var f=b,g=f.text.className,h=Pd(a,f);f.text==\nf.node&&(f.node=h.pre);f.text.parentNode.replaceChild(h.pre,f.text);f.text=h.pre;h.bgClass!=f.bgClass||h.textClass!=f.textClass?(f.bgClass=h.bgClass,f.textClass=h.textClass,Qc(f)):g&&(f.text.className=g)}else if(\"gutter\"==f)Qd(a,b,c,d);else if(\"class\"==f)Qc(b);else if(\"widget\"==f){f=a;g=b;h=d;g.alignable&&(g.alignable=null);for(var k=g.node.firstChild,l=void 0;k;k=l)l=k.nextSibling,\"CodeMirror-linewidget\"==k.className&&g.node.removeChild(k);Rd(f,g,h)}}b.changes=null}function Ob(a){a.node==a.text&&\n(a.node=t(\"div\",null,null,\"position: relative\"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),B&&8>C&&(a.node.style.zIndex=2));return a.node}function Pd(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Sd(a,b)}function Qc(a){var b=a.bgClass?a.bgClass+\" \"+(a.line.bgClass||\"\"):a.line.bgClass;b&&(b+=\" CodeMirror-linebackground\");if(a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),\na.background=null);else if(b){var c=Ob(a);a.background=c.insertBefore(t(\"div\",null,b),c.firstChild)}a.line.wrapClass?Ob(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className=\"\");a.text.className=(a.textClass?a.textClass+\" \"+(a.line.textClass||\"\"):a.line.textClass)||\"\"}function Qd(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null);var e=b.line.gutterMarkers;if(a.options.lineNumbers||e){var f=Ob(b),g=b.gutter=t(\"div\",null,\"CodeMirror-gutter-wrapper\",\"left: \"+(a.options.fixedGutter?\nd.fixedPos:-d.gutterTotalWidth)+\"px; width: \"+d.gutterTotalWidth+\"px\");a.display.input.setUneditable(g);f.insertBefore(g,b.text);b.line.gutterClass&&(g.className+=\" \"+b.line.gutterClass);!a.options.lineNumbers||e&&e[\"CodeMirror-linenumbers\"]||(b.lineNumber=g.appendChild(t(\"div\",Jc(a.options,c),\"CodeMirror-linenumber CodeMirror-gutter-elt\",\"left: \"+d.gutterLeft[\"CodeMirror-linenumbers\"]+\"px; width: \"+a.display.lineNumInnerWidth+\"px\")));if(e)for(b=0;b<a.options.gutters.length;++b)c=a.options.gutters[b],\n(f=e.hasOwnProperty(c)&&e[c])&&g.appendChild(t(\"div\",[f],\"CodeMirror-gutter-elt\",\"left: \"+d.gutterLeft[c]+\"px; width: \"+d.gutterWidth[c]+\"px\"))}}function vf(a,b,c,d){var e=Pd(a,b);b.text=b.node=e.pre;e.bgClass&&(b.bgClass=e.bgClass);e.textClass&&(b.textClass=e.textClass);Qc(b);Qd(a,b,c,d);Rd(a,b,d);return b.node}function Rd(a,b,c){Td(a,b.line,b,c,!0);if(b.rest)for(var d=0;d<b.rest.length;d++)Td(a,b.rest[d],b,c,!1)}function Td(a,b,c,d,e){if(b.widgets){var f=Ob(c),g=0;for(b=b.widgets;g<b.length;++g){var h=\nb[g],k=t(\"div\",[h.node],\"CodeMirror-linewidget\");h.handleMouseEvents||k.setAttribute(\"cm-ignore-events\",\"true\");var l=h,m=k,p=d;if(l.noHScroll){(c.alignable||(c.alignable=[])).push(m);var n=p.wrapperWidth;m.style.left=p.fixedPos+\"px\";l.coverGutter||(n-=p.gutterTotalWidth,m.style.paddingLeft=p.gutterTotalWidth+\"px\");m.style.width=n+\"px\"}l.coverGutter&&(m.style.zIndex=5,m.style.position=\"relative\",l.noHScroll||(m.style.marginLeft=-p.gutterTotalWidth+\"px\"));a.display.input.setUneditable(k);e&&h.above?\nf.insertBefore(k,c.gutter||c.text):f.appendChild(k);L(h,\"redraw\")}}}function Rc(a){return r(a.line,a.ch)}function Pb(a,b){return 0>y(a,b)?b:a}function Qb(a,b){return 0>y(a,b)?a:b}function Ud(a){a.state.focused||(a.display.input.focus(),xc(a))}function Rb(a){return a.options.readOnly||a.doc.cantEdit}function Sc(a,b,c,d,e){var f=a.doc;a.display.shift=!1;d||(d=f.sel);var g=sa(b),h=null;a.state.pasteIncoming&&1<d.ranges.length&&(X&&X.join(\"\\n\")==b?h=0==d.ranges.length%X.length&&ob(X,sa):g.length==d.ranges.length&&\n(h=ob(g,function(a){return[a]})));for(var k=d.ranges.length-1;0<=k;k--){var l=d.ranges[k],m=l.from(),p=l.to();l.empty()&&(c&&0<c?m=r(m.line,m.ch-c):a.state.overwrite&&!a.state.pasteIncoming&&(p=r(p.line,Math.min(u(f,p.line).text.length,p.ch+A(g).length))));var n=a.curOp.updateInput,m={from:m,to:p,text:h?h[k%h.length]:g,origin:e||(a.state.pasteIncoming?\"paste\":a.state.cutIncoming?\"cut\":\"+input\")};Oa(a.doc,m);L(a,\"inputRead\",a,m);if(b&&!a.state.pasteIncoming&&a.options.electricChars&&a.options.smartIndent&&\n100>l.head.ch&&(!k||d.ranges[k-1].head.line!=l.head.line)){l=a.getModeAt(l.head);m=ta(m);p=!1;if(l.electricChars)for(var E=0;E<l.electricChars.length;E++){if(-1<b.indexOf(l.electricChars.charAt(E))){p=pb(a,m.line,\"smart\");break}}else l.electricInput&&l.electricInput.test(u(f,m.line).text.slice(0,m.ch))&&(p=pb(a,m.line,\"smart\"));p&&L(a,\"electricInput\",a,m.line)}}Pa(a);a.curOp.updateInput=n;a.curOp.typing=!0;a.state.pasteIncoming=a.state.cutIncoming=!1}function Vd(a){for(var b=[],c=[],d=0;d<a.doc.sel.ranges.length;d++){var e=\na.doc.sel.ranges[d].head.line,e={anchor:r(e,0),head:r(e+1,0)};c.push(e);b.push(a.getRange(e.anchor,e.head))}return{text:b,ranges:c}}function Wd(a){a.setAttribute(\"autocorrect\",\"off\");a.setAttribute(\"autocapitalize\",\"off\");a.setAttribute(\"spellcheck\",\"false\")}function Tc(a){this.cm=a;this.prevInput=\"\";this.pollingFast=!1;this.polling=new bb;this.hasSelection=this.inaccurateSelection=!1;this.composing=null}function Xd(){var a=t(\"textarea\",null,null,\"position: absolute; padding: 0; width: 1px; height: 1em; outline: none\"),\nb=t(\"div\",[a],null,\"overflow: hidden; position: relative; width: 3px; height: 0px;\");J?a.style.width=\"1000px\":a.setAttribute(\"wrap\",\"off\");Qa&&(a.style.border=\"1px solid black\");Wd(a);return b}function Uc(a){this.cm=a;this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null;this.polling=new bb;this.gracePeriod=!1}function Yd(a,b){var c=Vc(a,b.line);if(!c||c.hidden)return null;var d=u(a.doc,b.line),c=Zd(c,d,b.line);(d=Y(d))&&Sb(d,b.ch);d=$d(c.map,b.ch,\"left\");d.offset=\n\"right\"==d.collapse?d.end:d.start;return d}function Ra(a,b){b&&(a.bad=!0);return a}function Tb(a,b,c){var d;if(b==a.display.lineDiv){d=a.display.lineDiv.childNodes[c];if(!d)return Ra(a.clipPos(r(a.display.viewTo-1)),!0);b=null;c=0}else for(d=b;;d=d.parentNode){if(!d||d==a.display.lineDiv)return null;if(d.parentNode&&d.parentNode==a.display.lineDiv)break}for(var e=0;e<a.display.view.length;e++){var f=a.display.view[e];if(f.node==d)return wf(f,b,c)}}function wf(a,b,c){function d(b,c,d){for(var e=-1;e<\n(l?l.length:0);e++)for(var f=0>e?k.map:l[e],g=0;g<f.length;g+=3){var h=f[g+2];if(h==b||h==c){c=F(0>e?a.line:a.rest[e]);e=f[g]+d;if(0>d||h!=b)e=f[g+(d?1:0)];return r(c,e)}}}var e=a.text.firstChild,f=!1;if(!b||!Wc(e,b))return Ra(r(F(a.line),0),!0);if(b==e&&(f=!0,b=e.childNodes[c],c=0,!b))return c=a.rest?A(a.rest):a.line,Ra(r(F(c),c.text.length),f);var g=3==b.nodeType?b:null,h=b;g||1!=b.childNodes.length||3!=b.firstChild.nodeType||(g=b.firstChild,c&&(c=g.nodeValue.length));for(;h.parentNode!=e;)h=h.parentNode;\nvar k=a.measure,l=k.maps;if(b=d(g,h,c))return Ra(b,f);e=h.nextSibling;for(g=g?g.nodeValue.length-c:0;e;e=e.nextSibling){if(b=d(e,e.firstChild,0))return Ra(r(b.line,b.ch-g),f);g+=e.textContent.length}h=h.previousSibling;for(g=c;h;h=h.previousSibling){if(b=d(h,h.firstChild,-1))return Ra(r(b.line,b.ch+g),f);g+=e.textContent.length}}function xf(a,b,c,d,e){function f(a){return function(b){return b.id==a}}function g(b){if(1==b.nodeType){var c=b.getAttribute(\"cm-text\");if(null!=c)\"\"==c&&(c=b.textContent.replace(/\\u200b/g,\n\"\")),h+=c;else{var c=b.getAttribute(\"cm-marker\"),p;if(c)b=a.findMarks(r(d,0),r(e+1,0),f(+c)),b.length&&(p=b[0].find())&&(h+=Da(a.doc,p.from,p.to).join(\"\\n\"));else if(\"false\"!=b.getAttribute(\"contenteditable\")){for(p=0;p<b.childNodes.length;p++)g(b.childNodes[p]);/^(pre|div|p)$/i.test(b.nodeName)&&(k=!0)}}}else 3==b.nodeType&&(b=b.nodeValue)&&(k&&(h+=\"\\n\",k=!1),h+=b)}for(var h=\"\",k=!1;;){g(b);if(b==c)break;b=b.nextSibling}return h}function la(a,b){this.ranges=a;this.primIndex=b}function z(a,b){this.anchor=\na;this.head=b}function Z(a,b){var c=a[b];a.sort(function(a,b){return y(a.from(),b.from())});b=D(a,c);for(c=1;c<a.length;c++){var d=a[c],e=a[c-1];if(0<=y(e.to(),d.from())){var f=Qb(e.from(),d.from()),g=Pb(e.to(),d.to()),d=e.empty()?d.from()==d.head:e.from()==e.head;c<=b&&--b;a.splice(--c,2,new z(d?g:f,d?f:g))}}return new la(a,b)}function ga(a,b){return new la([new z(a,b||a)],0)}function w(a,b){if(b.line<a.first)return r(a.first,0);var c=a.first+a.size-1;if(b.line>c)return r(c,u(a,c).text.length);var c=\nu(a,b.line).text.length,d=b.ch,c=null==d||d>c?r(b.line,c):0>d?r(b.line,0):b;return c}function qb(a,b){return b>=a.first&&b<a.first+a.size}function rb(a,b,c,d){return a.cm&&a.cm.display.shift||a.extend?(a=b.anchor,d&&(b=0>y(c,a),b!=0>y(d,a)?(a=c,c=d):b!=0>y(c,d)&&(c=d)),new z(a,c)):new z(d||c,c)}function Ub(a,b,c,d){H(a,new la([rb(a,a.sel.primary(),b,c)],0),d)}function ae(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=rb(a,a.sel.ranges[e],b[e],null);b=Z(d,a.sel.primIndex);H(a,b,c)}function Xc(a,\nb,c,d){var e=a.sel.ranges.slice(0);e[b]=c;H(a,Z(e,a.sel.primIndex),d)}function yf(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[];for(var c=0;c<b.length;c++)this.ranges[c]=new z(w(a,b[c].anchor),w(a,b[c].head))}};K(a,\"beforeSelectionChange\",a,c);a.cm&&K(a.cm,\"beforeSelectionChange\",a.cm,c);return c.ranges!=b.ranges?Z(c.ranges,c.ranges.length-1):b}function be(a,b,c){var d=a.history.done,e=A(d);e&&e.ranges?(d[d.length-1]=b,Vb(a,b,c)):H(a,b,c)}function H(a,b,c){Vb(a,b,c);b=a.sel;var d=\na.cm?a.cm.curOp.id:NaN,e=a.history,f=c&&c.origin,g;if(!(g=d==e.lastSelOp)&&(g=f&&e.lastSelOrigin==f)&&!(g=e.lastModTime==e.lastSelTime&&e.lastOrigin==f)){g=A(e.done);var h=f.charAt(0);g=\"*\"==h||\"+\"==h&&g.ranges.length==b.ranges.length&&g.somethingSelected()==b.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}g?e.done[e.done.length-1]=b:Wb(b,e.done);e.lastSelTime=+new Date;e.lastSelOrigin=f;e.lastSelOp=d;c&&!1!==c.clearRedo&&ce(e.undone)}function Vb(a,\nb,c){if(S(a,\"beforeSelectionChange\")||a.cm&&S(a.cm,\"beforeSelectionChange\"))b=yf(a,b);var d=c&&c.bias||(0>y(b.primary().head,a.sel.primary().head)?-1:1);de(a,ee(a,b,d,!0));c&&!1===c.scroll||!a.cm||Pa(a.cm)}function de(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,fe(a.cm)),L(a,\"cursorActivity\",a))}function ge(a){de(a,ee(a,a.sel,null,!1),ha)}function ee(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=Xb(a,g.anchor,c,d),k=Xb(a,g.head,c,\nd);if(e||h!=g.anchor||k!=g.head)e||(e=b.ranges.slice(0,f)),e[f]=new z(h,k)}return e?Z(e,b.primIndex):b}function Xb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=u(a,f.line);if(h.markedSpans)for(var k=0;k<h.markedSpans.length;++k){var l=h.markedSpans[k],m=l.marker;if((null==l.from||(m.inclusiveLeft?l.from<=f.ch:l.from<f.ch))&&(null==l.to||(m.inclusiveRight?l.to>=f.ch:l.to>f.ch))){if(d&&(K(m,\"beforeCursorEnter\"),m.explicitlyCleared))if(h.markedSpans){--k;continue}else break;if(m.atomic){k=\nm.find(0>g?-1:1);if(0==y(k,f)&&(k.ch+=g,0>k.ch?k=k.line>a.first?w(a,r(k.line-1)):null:k.ch>h.text.length&&(k=k.line<a.first+a.size-1?r(k.line+1,0):null),!k)){if(e){if(!d)return Xb(a,b,c,!0);a.cantEdit=!0;return r(a.first,0)}e=!0;k=b;g=-g}f=k;continue a}}}return f}}function nb(a){a.display.input.showSelection(a.display.input.prepareSelection())}function he(a,b){for(var c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++)if(!1!==\nb||g!=c.sel.primIndex){var h=c.sel.ranges[g],k=h.empty();if(k||a.options.showCursorWhenSelecting){var l=a,m=e,p=ma(l,h.head,\"div\",null,null,!l.options.singleCursorHeightPerLine),n=m.appendChild(t(\"div\",\" \",\"CodeMirror-cursor\"));n.style.left=p.left+\"px\";n.style.top=p.top+\"px\";n.style.height=Math.max(0,p.bottom-p.top)*l.options.cursorHeight+\"px\";p.other&&(l=m.appendChild(t(\"div\",\" \",\"CodeMirror-cursor CodeMirror-secondarycursor\")),l.style.display=\"\",l.style.left=p.other.left+\"px\",l.style.top=p.other.top+\n\"px\",l.style.height=.85*(p.other.bottom-p.other.top)+\"px\")}k||zf(a,h,f)}return d}function zf(a,b,c){function d(a,b,c,d){0>b&&(b=0);b=Math.round(b);d=Math.round(d);h.appendChild(t(\"div\",null,\"CodeMirror-selected\",\"position: absolute; left: \"+a+\"px; top: \"+b+\"px; width: \"+(null==c?m-a:c)+\"px; height: \"+(d-b)+\"px\"))}function e(b,c,e){var f=u(g,b),h=f.text.length,k,p;Af(Y(f),c||0,null==e?h:e,function(g,q,t){var u=Yb(a,r(b,g),\"div\",f,\"left\"),v,w;g==q?(v=u,t=w=u.left):(v=Yb(a,r(b,q-1),\"div\",f,\"right\"),\n\"rtl\"==t&&(t=u,u=v,v=t),t=u.left,w=v.right);null==c&&0==g&&(t=l);3<v.top-u.top&&(d(t,u.top,null,u.bottom),t=l,u.bottom<v.top&&d(t,u.bottom,null,v.top));null==e&&q==h&&(w=m);if(!k||u.top<k.top||u.top==k.top&&u.left<k.left)k=u;if(!p||v.bottom>p.bottom||v.bottom==p.bottom&&v.right>p.right)p=v;t<l+1&&(t=l);d(t,v.top,w-t,v.bottom)});return{start:k,end:p}}var f=a.display,g=a.doc,h=document.createDocumentFragment(),k=ie(a.display),l=k.left,m=Math.max(f.sizerWidth,pa(a)-f.sizer.offsetLeft)-k.right,f=b.from();\nb=b.to();if(f.line==b.line)e(f.line,f.ch,b.ch);else{var p=u(g,f.line),k=u(g,b.line),k=ia(p)==ia(k),f=e(f.line,f.ch,k?p.text.length+1:null).end;b=e(b.line,k?0:null,b.ch).start;k&&(f.top<b.top-2?(d(f.right,f.top,null,f.bottom),d(l,b.top,b.left,b.bottom)):d(f.right,f.top,b.left-f.right,f.bottom));f.bottom<b.top&&d(l,f.bottom,null,b.top)}c.appendChild(h)}function Yc(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility=\"\";0<a.options.cursorBlinkRate?b.blinker=\nsetInterval(function(){b.cursorDiv.style.visibility=(c=!c)?\"\":\"hidden\"},a.options.cursorBlinkRate):0>a.options.cursorBlinkRate&&(b.cursorDiv.style.visibility=\"hidden\")}}function fb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&&a.state.highlight.set(b,cb(Bf,a))}function Bf(a){var b=a.doc;b.frontier<b.first&&(b.frontier=b.first);if(!(b.frontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=Sa(b.mode,sb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+\n500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=je(a,f,d,!0);f.styles=h.styles;var k=f.styleClasses;(h=h.classes)?f.styleClasses=h:k&&(f.styleClasses=null);k=!g||g.length!=f.styles.length||k!=h&&(!k||!h||k.bgClass!=h.bgClass||k.textClass!=h.textClass);for(h=0;!k&&h<g.length;++h)k=g[h]!=f.styles[h];k&&e.push(b.frontier);f.stateAfter=Sa(b.mode,d)}else Zc(a,f.text,d),f.stateAfter=0==b.frontier%5?Sa(b.mode,d):null;++b.frontier;if(+new Date>c)return fb(a,a.options.workDelay),!0});\ne.length&&T(a,function(){for(var b=0;b<e.length;b++)na(a,e[b],\"text\")})}}function Cf(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1E3:100);b>g;--b){if(b<=f.first)return f.first;var h=u(f,b-1);if(h.stateAfter&&(!c||b<=f.frontier))return b;h=aa(h.text,null,a.options.tabSize);if(null==e||d>h)e=b-1,d=h}return e}function sb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=Cf(a,b,c),g=f>d.first&&u(d,f-1).stateAfter,g=g?Sa(d.mode,g):Df(d.mode);d.iter(f,b,function(c){Zc(a,\nc.text,g);c.stateAfter=f==b-1||0==f%5||f>=e.viewFrom&&f<e.viewTo?Sa(d.mode,g):null;++f});c&&(d.frontier=f);return g}function Ec(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function ie(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=U(a.measure,t(\"pre\",\"x\")),b=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,b={left:parseInt(b.paddingLeft),right:parseInt(b.paddingRight)};isNaN(b.left)||isNaN(b.right)||(a.cachedPaddingH=b);return b}function da(a){return Hd-a.display.nativeBarWidth}\nfunction pa(a){return a.display.scroller.clientWidth-da(a)-a.display.barWidth}function Nc(a){return a.display.scroller.clientHeight-da(a)-a.display.barHeight}function Zd(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(d=0;d<a.rest.length;d++)if(F(a.rest[d])>c)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function Vc(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[Ca(a,\nb)];var c=a.display.externalMeasured;if(c&&b>=c.lineN&&b<c.lineN+c.size)return c}function Zb(a,b){var c=F(b),d=Vc(a,c);d&&!d.text?d=null:d&&d.changes&&Od(a,d,c,Kc(a));if(!d){var e;e=ia(b);d=F(e);e=a.display.externalMeasured=new ke(a.doc,e,d);e.lineN=d;d=e.built=Sd(a,e);e.text=d.pre;U(a.display.lineMeasure,d.pre);d=e}c=Zd(d,b,c);return{line:b,view:d,rect:null,map:c.map,cache:c.cache,before:c.before,hasHeights:!1}}function $c(a,b,c,d,e){b.before&&(c=-1);var f=c+(d||\"\");if(b.cache.hasOwnProperty(f))a=\nb.cache[f];else{b.rect||(b.rect=b.view.text.getBoundingClientRect());if(!b.hasHeights){var g=b.view,h=b.rect,k=a.options.lineWrapping,l=k&&pa(a);if(!g.measure.heights||k&&g.measure.width!=l){var m=g.measure.heights=[];if(k)for(g.measure.width=l,g=g.text.firstChild.getClientRects(),k=0;k<g.length-1;k++){var l=g[k],p=g[k+1];2<Math.abs(l.bottom-p.bottom)&&m.push((l.bottom+p.top)/2-h.top)}m.push(h.bottom-h.top)}b.hasHeights=!0}g=d;k=$d(b.map,c,g);d=k.node;h=k.start;l=k.end;c=k.collapse;var n;if(3==d.nodeType){for(m=\n0;4>m;m++){for(;h&&tb(b.line.text.charAt(k.coverStart+h));)--h;for(;k.coverStart+l<k.coverEnd&&tb(b.line.text.charAt(k.coverStart+l));)++l;if(B&&9>C&&0==h&&l==k.coverEnd-k.coverStart)n=d.parentNode.getBoundingClientRect();else if(B&&a.options.lineWrapping){var E=Ea(d,h,l).getClientRects();n=E.length?E[\"right\"==g?E.length-1:0]:ad}else n=Ea(d,h,l).getBoundingClientRect()||ad;if(n.left||n.right||0==h)break;l=h;--h;c=\"right\"}B&&11>C&&((E=!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI)||\n(null!=bd?E=bd:(m=U(a.display.measure,t(\"span\",\"x\")),E=m.getBoundingClientRect(),m=Ea(m,0,1).getBoundingClientRect(),E=bd=1<Math.abs(E.left-m.left)),E=!E),E||(E=screen.logicalXDPI/screen.deviceXDPI,m=screen.logicalYDPI/screen.deviceYDPI,n={left:n.left*E,right:n.right*E,top:n.top*m,bottom:n.bottom*m}))}else 0<h&&(c=g=\"right\"),n=a.options.lineWrapping&&1<(E=d.getClientRects()).length?E[\"right\"==g?E.length-1:0]:d.getBoundingClientRect();!(B&&9>C)||h||n&&(n.left||n.right)||(n=(n=d.parentNode.getClientRects()[0])?\n{left:n.left,right:n.left+gb(a.display),top:n.top,bottom:n.bottom}:ad);E=n.top-b.rect.top;d=n.bottom-b.rect.top;h=(E+d)/2;g=b.view.measure.heights;for(m=0;m<g.length-1&&!(h<g[m]);m++);c={left:(\"right\"==c?n.right:n.left)-b.rect.left,right:(\"left\"==c?n.left:n.right)-b.rect.left,top:m?g[m-1]:0,bottom:g[m]};n.left||n.right||(c.bogus=!0);a.options.singleCursorHeightPerLine||(c.rtop=E,c.rbottom=d);a=c;a.bogus||(b.cache[f]=a)}return{left:a.left,right:a.right,top:e?a.rtop:a.top,bottom:e?a.rbottom:a.bottom}}\nfunction $d(a,b,c){for(var d,e,f,g,h=0;h<a.length;h+=3){var k=a[h],l=a[h+1];if(b<k)e=0,f=1,g=\"left\";else if(b<l)e=b-k,f=e+1;else if(h==a.length-3||b==l&&a[h+3]>b)f=l-k,e=f-1,b>=l&&(g=\"right\");if(null!=e){d=a[h+2];k==l&&c==(d.insertLeft?\"left\":\"right\")&&(g=c);if(\"left\"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g=\"left\";if(\"right\"==c&&e==l-k)for(;h<a.length-3&&a[h+3]==a[h+4]&&!a[h+5].insertLeft;)d=a[(h+=3)+2],g=\"right\";break}}return{node:d,start:e,end:f,collapse:g,coverStart:k,\ncoverEnd:l}}function le(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function me(a){a.display.externalMeasure=null;za(a.display.lineMeasure);for(var b=0;b<a.display.view.length;b++)le(a.display.view[b])}function hb(a){me(a);a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null;a.options.lineWrapping||(a.display.maxLineChanged=!0);a.display.lineNumChars=null}function cd(a,b,c,d){if(b.widgets)for(var e=\n0;e<b.widgets.length;++e)if(b.widgets[e].above){var f=ub(b.widgets[e]);c.top+=f;c.bottom+=f}if(\"line\"==d)return c;d||(d=\"local\");b=ea(b);b=\"local\"==d?b+a.display.lineSpace.offsetTop:b-a.display.viewOffset;if(\"page\"==d||\"window\"==d)a=a.display.lineSpace.getBoundingClientRect(),b+=a.top+(\"window\"==d?0:window.pageYOffset||(document.documentElement||document.body).scrollTop),d=a.left+(\"window\"==d?0:window.pageXOffset||(document.documentElement||document.body).scrollLeft),c.left+=d,c.right+=d;c.top+=b;\nc.bottom+=b;return c}function ne(a,b,c){if(\"div\"==c)return b;var d=b.left;b=b.top;\"page\"==c?(d-=window.pageXOffset||(document.documentElement||document.body).scrollLeft,b-=window.pageYOffset||(document.documentElement||document.body).scrollTop):\"local\"!=c&&c||(c=a.display.sizer.getBoundingClientRect(),d+=c.left,b+=c.top);a=a.display.lineSpace.getBoundingClientRect();return{left:d-a.left,top:b-a.top}}function Yb(a,b,c,d,e){d||(d=u(a.doc,b.line));var f=d;b=b.ch;d=$c(a,Zb(a,d),b,e);return cd(a,f,d,c)}\nfunction ma(a,b,c,d,e,f){function g(b,g){var h=$c(a,e,b,g?\"right\":\"left\",f);g?h.left=h.right:h.right=h.left;return cd(a,d,h,c)}function h(a,b){var c=k[b],d=c.level%2;a==dd(c)&&b&&c.level<k[b-1].level?(c=k[--b],a=ed(c)-(c.level%2?0:1),d=!0):a==ed(c)&&b<k.length-1&&c.level<k[b+1].level&&(c=k[++b],a=dd(c)-c.level%2,d=!1);return d&&a==c.to&&a>c.from?g(a-1):g(a,d)}d=d||u(a.doc,b.line);e||(e=Zb(a,d));var k=Y(d);b=b.ch;if(!k)return g(b);var l=Sb(k,b),l=h(b,l);null!=vb&&(l.other=h(b,vb));return l}function oe(a,\nb){var c=0;b=w(a.doc,b);a.options.lineWrapping||(c=gb(a.display)*b.ch);var d=u(a.doc,b.line),e=ea(d)+a.display.lineSpace.offsetTop;return{left:c,right:c,top:e,bottom:e+d.height}}function $b(a,b,c,d){a=r(a,b);a.xRel=d;c&&(a.outside=!0);return a}function fd(a,b,c){var d=a.doc;c+=a.display.viewOffset;if(0>c)return $b(d.first,0,!0,-1);var e=Ba(d,c),f=d.first+d.size-1;if(e>f)return $b(d.first+d.size-1,u(d,f).text.length,!0,1);0>b&&(b=0);for(d=u(d,e);;)if(e=Ef(a,d,e,b,c),f=(d=Aa(d,!1))&&d.find(0,!0),d&&\n(e.ch>f.from.ch||e.ch==f.from.ch&&0<e.xRel))e=F(d=f.to.line);else return e}function Ef(a,b,c,d,e){function f(d){d=ma(a,r(c,d),\"line\",b,l);h=!0;if(g>d.bottom)return d.left-k;if(g<d.top)return d.left+k;h=!1;return d.left}var g=e-ea(b),h=!1,k=2*a.display.wrapper.clientWidth,l=Zb(a,b),m=Y(b),p=b.text.length;e=ac(b);var n=bc(b),E=f(e),q=h,t=f(n),u=h;if(d>t)return $b(c,n,u,1);for(;;){if(m?n==e||n==gd(b,e,1):1>=n-e){m=d<E||d-E<=t-d?e:n;for(d-=m==e?E:t;tb(b.text.charAt(m));)++m;return $b(c,m,m==e?q:u,-1>\nd?-1:1<d?1:0)}var v=Math.ceil(p/2),w=e+v;if(m)for(var w=e,x=0;x<v;++x)w=gd(b,w,1);x=f(w);if(x>d){n=w;t=x;if(u=h)t+=1E3;p=v}else e=w,E=x,q=h,p-=v}}function xa(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Fa){Fa=t(\"pre\");for(var b=0;49>b;++b)Fa.appendChild(document.createTextNode(\"x\")),Fa.appendChild(t(\"br\"));Fa.appendChild(document.createTextNode(\"x\"))}U(a.measure,Fa);b=Fa.offsetHeight/50;3<b&&(a.cachedTextHeight=b);za(a.measure);return b||1}function gb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;\nvar b=t(\"span\",\"xxxxxxxxxx\"),c=t(\"pre\",[b]);U(a.measure,c);b=b.getBoundingClientRect();b=(b.right-b.left)/10;2<b&&(a.cachedCharWidth=b);return b||10}function Ja(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ff};Ta?Ta.ops.push(a.curOp):a.curOp.ownsGroup=Ta={ops:[a.curOp],delayedCallbacks:[]}}\nfunction La(a){if(a=a.curOp.ownsGroup)try{var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c]();for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm)}}while(c<b.length)}finally{Ta=null;for(b=0;b<a.ops.length;b++)a.ops[b].cm.curOp=null;a=a.ops;for(b=0;b<a.length;b++){var e=a[b],c=e.cm,f=d=c.display;!f.scrollbarsClipped&&f.scroller.offsetWidth&&(f.nativeBarWidth=\nf.scroller.offsetWidth-f.scroller.clientWidth,f.heightForcer.style.height=da(c)+\"px\",f.sizer.style.marginBottom=-f.nativeBarWidth+\"px\",f.sizer.style.borderRightWidth=da(c)+\"px\",f.scrollbarsClipped=!0);e.updateMaxLine&&Dc(c);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<d.viewFrom||e.scrollToPos.to.line>=d.viewTo)||d.maxLineChanged&&c.options.lineWrapping;e.update=e.mustUpdate&&new Mb(c,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}for(b=\n0;b<a.length;b++)e=a[b],e.updatedDisplay=e.mustUpdate&&Lc(e.cm,e.update);for(b=0;b<a.length;b++)if(e=a[b],c=e.cm,d=c.display,e.updatedDisplay&&Lb(c),e.barMeasure=jb(c),d.maxLineChanged&&!c.options.lineWrapping&&(f=void 0,f=d.maxLine.text.length,f=$c(c,Zb(c,d.maxLine),f,void 0),e.adjustWidthTo=f.left+3,c.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(d.scroller.clientWidth,d.sizer.offsetLeft+e.adjustWidthTo+da(c)+c.display.barWidth),e.maxScrollLeft=Math.max(0,d.sizer.offsetLeft+\ne.adjustWidthTo-pa(c))),e.updatedDisplay||e.selectionChanged)e.preparedSelection=d.input.prepareSelection();for(b=0;b<a.length;b++)e=a[b],c=e.cm,null!=e.adjustWidthTo&&(c.display.sizer.style.minWidth=e.adjustWidthTo+\"px\",e.maxScrollLeft<c.doc.scrollLeft&&Ma(c,Math.min(c.display.scroller.scrollLeft,e.maxScrollLeft),!0),c.display.maxLineChanged=!1),e.preparedSelection&&c.display.input.showSelection(e.preparedSelection),e.updatedDisplay&&Oc(c,e.barMeasure),(e.updatedDisplay||e.startHeight!=c.doc.height)&&\nNa(c,e.barMeasure),e.selectionChanged&&Yc(c),c.state.focused&&e.updateInput&&c.display.input.reset(e.typing),e.focus&&e.focus==fa()&&Ud(e.cm);for(b=0;b<a.length;b++){e=a[b];c=e.cm;d=c.display;f=c.doc;e.updatedDisplay&&Md(c,e.update);null==d.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(d.wheelStartX=d.wheelStartY=null);null==e.scrollTop||d.scroller.scrollTop==e.scrollTop&&!e.forceScroll||(f.scrollTop=Math.max(0,Math.min(d.scroller.scrollHeight-d.scroller.clientHeight,e.scrollTop)),\nd.scrollbars.setScrollTop(f.scrollTop),d.scroller.scrollTop=f.scrollTop);null==e.scrollLeft||d.scroller.scrollLeft==e.scrollLeft&&!e.forceScroll||(f.scrollLeft=Math.max(0,Math.min(d.scroller.scrollWidth-pa(c),e.scrollLeft)),d.scrollbars.setScrollLeft(f.scrollLeft),d.scroller.scrollLeft=f.scrollLeft,Bc(c));if(e.scrollToPos){var g=void 0,h=w(f,e.scrollToPos.from),g=w(f,e.scrollToPos.to),k=e.scrollToPos.margin;null==k&&(k=0);for(var l=0;5>l;l++){var m=!1,p=ma(c,h),n=g&&g!=h?ma(c,g):p,n=cc(c,Math.min(p.left,\nn.left),Math.min(p.top,n.top)-k,Math.max(p.left,n.left),Math.max(p.bottom,n.bottom)+k),q=c.doc.scrollTop,r=c.doc.scrollLeft;null!=n.scrollTop&&(lb(c,n.scrollTop),1<Math.abs(c.doc.scrollTop-q)&&(m=!0));null!=n.scrollLeft&&(Ma(c,n.scrollLeft),1<Math.abs(c.doc.scrollLeft-r)&&(m=!0));if(!m)break}g=p;e.scrollToPos.isCursor&&c.state.focused&&(ja(c,\"scrollCursorIntoView\")||(k=c.display,l=k.sizer.getBoundingClientRect(),h=null,0>g.top+l.top?h=!0:g.bottom+l.top>(window.innerHeight||document.documentElement.clientHeight)&&\n(h=!1),null==h||Gf||(g=t(\"div\",\"​\",null,\"position: absolute; top: \"+(g.top-k.viewOffset-c.display.lineSpace.offsetTop)+\"px; height: \"+(g.bottom-g.top+da(c)+k.barHeight)+\"px; left: \"+g.left+\"px; width: 2px;\"),c.display.lineSpace.appendChild(g),g.scrollIntoView(h),c.display.lineSpace.removeChild(g))))}h=e.maybeHiddenMarkers;g=e.maybeUnhiddenMarkers;if(h)for(k=0;k<h.length;++k)h[k].lines.length||K(h[k],\"hide\");if(g)for(k=0;k<g.length;++k)g[k].lines.length&&K(g[k],\"unhide\");d.wrapper.offsetHeight&&(f.scrollTop=\nc.display.scroller.scrollTop);e.changeObjs&&K(c,\"changes\",c,e.changeObjs);e.update&&e.update.finish()}}}function T(a,b){if(a.curOp)return b();Ja(a);try{return b()}finally{La(a)}}function G(a,b){return function(){if(a.curOp)return b.apply(a,arguments);Ja(a);try{return b.apply(a,arguments)}finally{La(a)}}}function M(a){return function(){if(this.curOp)return a.apply(this,arguments);Ja(this);try{return a.apply(this,arguments)}finally{La(this)}}}function N(a){return function(){var b=this.cm;if(!b||b.curOp)return a.apply(this,\narguments);Ja(b);try{return a.apply(this,arguments)}finally{La(b)}}}function ke(a,b,c){for(var d=this.line=b,e;d=Aa(d,!1);)d=d.find(1,!0).line,(e||(e=[])).push(d);this.size=(this.rest=e)?F(A(this.rest))-c+1:1;this.node=this.text=null;this.hidden=ya(a,b)}function Nb(a,b,c){var d=[],e;for(e=b;e<c;)b=new ke(a.doc,u(a.doc,e),e),e+=b.size,d.push(b);return d}function Q(a,b,c,d){null==b&&(b=a.doc.first);null==c&&(c=a.doc.first+a.doc.size);d||(d=0);var e=a.display;d&&c<e.viewTo&&(null==e.updateLineNumbers||\ne.updateLineNumbers>b)&&(e.updateLineNumbers=b);a.curOp.viewChanged=!0;if(b>=e.viewTo)ra&&Mc(a.doc,b)<e.viewTo&&qa(a);else if(c<=e.viewFrom)ra&&Ld(a.doc,c+d)>e.viewFrom?qa(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)qa(a);else if(b<=e.viewFrom){var f=dc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):qa(a)}else if(c>=e.viewTo)(f=dc(a,b,b,-1))?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):qa(a);else{var f=dc(a,b,b,-1),g=dc(a,c,c+d,1);f&&g?(e.view=\ne.view.slice(0,f.index).concat(Nb(a,f.lineN,g.lineN)).concat(e.view.slice(g.index)),e.viewTo+=d):qa(a)}if(a=e.externalMeasured)c<a.lineN?a.lineN+=d:b<a.lineN+a.size&&(e.externalMeasured=null)}function na(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.externalMeasured;e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null);b<d.viewFrom||b>=d.viewTo||(a=d.view[Ca(a,b)],null!=a.node&&(a=a.changes||(a.changes=[]),-1==D(a,c)&&a.push(c)))}function qa(a){a.display.viewFrom=a.display.viewTo=\na.doc.first;a.display.view=[];a.display.viewOffset=0}function Ca(a,b){if(b>=a.display.viewTo)return null;b-=a.display.viewFrom;if(0>b)return null;for(var c=a.display.view,d=0;d<c.length;d++)if(b-=c[d].size,0>b)return d}function dc(a,b,c,d){var e=Ca(a,b),f=a.display.view;if(!ra||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var g=0,h=a.display.viewFrom;g<e;g++)h+=f[g].size;if(h!=b){if(0<d){if(e==f.length-1)return null;b=h+f[e].size-b;e++}else b=h-b;c+=b}for(;Mc(a.doc,c)!=c;){if(e==(0>d?0:f.length-\n1))return null;c+=d*f[e-(0>d?1:0)].size;e+=d}return{index:e,lineN:c}}function Kd(a){a=a.display.view;for(var b=0,c=0;c<a.length;c++){var d=a[c];d.hidden||d.node&&!d.changes||++b}return b}function sf(a){function b(){d.activeTouch&&(e=setTimeout(function(){d.activeTouch=null},1E3),f=d.activeTouch,f.end=+new Date)}function c(a,b){if(null==b.left)return!0;var c=b.left-a.left,d=b.top-a.top;return 400<c*c+d*d}var d=a.display;v(d.scroller,\"mousedown\",G(a,pe));B&&11>C?v(d.scroller,\"dblclick\",G(a,function(b){if(!ja(a,\nb)){var c=Ua(a,b);!c||hd(a,b,\"gutterClick\",!0,L)||oa(a.display,b)||(O(b),b=a.findWordAt(c),Ub(a.doc,b.anchor,b.head))}})):v(d.scroller,\"dblclick\",function(b){ja(a,b)||O(b)});id||v(d.scroller,\"contextmenu\",function(b){qe(a,b)});var e,f={end:0};v(d.scroller,\"touchstart\",function(a){var b;1!=a.touches.length?b=!1:(b=a.touches[0],b=1>=b.radiusX&&1>=b.radiusY);b||(clearTimeout(e),b=+new Date,d.activeTouch={start:b,moved:!1,prev:300>=b-f.end?f:null},1==a.touches.length&&(d.activeTouch.left=a.touches[0].pageX,\nd.activeTouch.top=a.touches[0].pageY))});v(d.scroller,\"touchmove\",function(){d.activeTouch&&(d.activeTouch.moved=!0)});v(d.scroller,\"touchend\",function(e){var f=d.activeTouch;if(f&&!oa(d,e)&&null!=f.left&&!f.moved&&300>new Date-f.start){var g=a.coordsChar(d.activeTouch,\"page\"),f=!f.prev||c(f,f.prev)?new z(g,g):!f.prev.prev||c(f,f.prev.prev)?a.findWordAt(g):new z(r(g.line,0),w(a.doc,r(g.line+1,0)));a.setSelection(f.anchor,f.head);a.focus();O(e)}b()});v(d.scroller,\"touchcancel\",b);v(d.scroller,\"scroll\",\nfunction(){d.scroller.clientHeight&&(lb(a,d.scroller.scrollTop),Ma(a,d.scroller.scrollLeft,!0),K(a,\"scroll\",a))});v(d.scroller,\"mousewheel\",function(b){re(a,b)});v(d.scroller,\"DOMMouseScroll\",function(b){re(a,b)});v(d.wrapper,\"scroll\",function(){d.wrapper.scrollTop=d.wrapper.scrollLeft=0});d.dragFunctions={simple:function(b){ja(a,b)||jd(b)},start:function(b){if(B&&(!a.state.draggingText||100>+new Date-se))jd(b);else if(!ja(a,b)&&!oa(a.display,b)&&(b.dataTransfer.setData(\"Text\",a.getSelection()),b.dataTransfer.setDragImage&&\n!te)){var c=t(\"img\",null,null,\"position: fixed; left: 0; top: 0;\");c.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw\\x3d\\x3d\";ba&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop);b.dataTransfer.setDragImage(c,0,0);ba&&c.parentNode.removeChild(c)}},drop:G(a,Hf)};var g=d.input.getField();v(g,\"keyup\",function(b){ue.call(a,b)});v(g,\"keydown\",G(a,ve));v(g,\"keypress\",G(a,we));v(g,\"focus\",cb(xc,a));v(g,\"blur\",cb(db,a))}function If(a){var b=a.display;\nif(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize()}function oa(a,b){for(var c=b.target||b.srcElement;c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&\"true\"==c.getAttribute(\"cm-ignore-events\")||c.parentNode==a.sizer&&c!=a.mover)return!0}function Ua(a,b,c,d){var e=a.display;if(!c&&\"true\"==(b.target||b.srcElement).getAttribute(\"cm-not-content\"))return null;var f,g;c=e.lineSpace.getBoundingClientRect();\ntry{f=b.clientX-c.left,g=b.clientY-c.top}catch(h){return null}b=fd(a,f,g);var k;d&&1==b.xRel&&(k=u(a.doc,b.line).text).length==b.ch&&(d=aa(k,k.length,a.options.tabSize)-k.length,b=r(b.line,Math.max(0,Math.round((f-ie(a.display).left)/gb(a.display))-d)));return b}function pe(a){var b=this.display;if(!(b.activeTouch&&b.input.supportsTouch()||ja(this,a)))if(b.shift=a.shiftKey,oa(b,a))J||(b.scroller.draggable=!1,setTimeout(function(){b.scroller.draggable=!0},100));else if(!hd(this,a,\"gutterClick\",!0,\nL)){var c=Ua(this,a);window.focus();switch(xe(a)){case 1:c?Jf(this,a,c):(a.target||a.srcElement)==b.scroller&&O(a);break;case 2:J&&(this.state.lastMiddleDown=+new Date);c&&Ub(this.doc,c);setTimeout(function(){b.input.focus()},20);O(a);break;case 3:id?qe(this,a):Kf(this)}}}function Jf(a,b,c){B?setTimeout(cb(Ud,a),0):a.curOp.focus=fa();var d=+new Date,e;ec&&ec.time>d-400&&0==y(ec.pos,c)?e=\"triple\":fc&&fc.time>d-400&&0==y(fc.pos,c)?(e=\"double\",ec={time:d,pos:c}):(e=\"single\",fc={time:d,pos:c});var d=\na.doc.sel,f=W?b.metaKey:b.ctrlKey,g;a.options.dragDrop&&Lf&&!Rb(a)&&\"single\"==e&&-1<(g=d.contains(c))&&!d.ranges[g].empty()?Mf(a,b,c,f):Nf(a,b,c,e,f)}function Mf(a,b,c,d){var e=a.display,f=+new Date,g=G(a,function(h){J&&(e.scroller.draggable=!1);a.state.draggingText=!1;ka(document,\"mouseup\",g);ka(e.scroller,\"drop\",g);10>Math.abs(b.clientX-h.clientX)+Math.abs(b.clientY-h.clientY)&&(O(h),!d&&+new Date-200<f&&Ub(a.doc,c),J||B&&9==C?setTimeout(function(){document.body.focus();e.input.focus()},20):e.input.focus())});\nJ&&(e.scroller.draggable=!0);a.state.draggingText=g;e.scroller.dragDrop&&e.scroller.dragDrop();v(document,\"mouseup\",g);v(e.scroller,\"drop\",g)}function Nf(a,b,c,d,e){function f(b){if(0!=y(x,b))if(x=b,\"rect\"==d){for(var e=[],f=a.options.tabSize,g=aa(u(l,c.line).text,c.ch,f),h=aa(u(l,b.line).text,b.ch,f),k=Math.min(g,h),g=Math.max(g,h),h=Math.min(c.line,b.line),q=Math.min(a.lastLine(),Math.max(c.line,b.line));h<=q;h++){var E=u(l,h).text,t=ye(E,k,f);k==g?e.push(new z(r(h,t),r(h,t))):E.length>t&&e.push(new z(r(h,\nt),r(h,ye(E,g,f))))}e.length||e.push(new z(c,c));H(l,Z(n.ranges.slice(0,p).concat(e),p),{origin:\"*mouse\",scroll:!1});a.scrollIntoView(b)}else e=m,f=e.anchor,k=b,\"single\"!=d&&(b=\"double\"==d?a.findWordAt(b):new z(r(b.line,0),w(l,r(b.line+1,0))),0<y(b.anchor,f)?(k=b.head,f=Qb(e.from(),b.anchor)):(k=b.anchor,f=Pb(e.to(),b.head))),e=n.ranges.slice(0),e[p]=new z(w(l,f),k),H(l,Z(e,p),kd)}function g(b){var c=++A,e=Ua(a,b,!0,\"rect\"==d);if(e)if(0!=y(e,x)){a.curOp.focus=fa();f(e);var h=Hc(k,l);(e.line>=h.to||\ne.line<h.from)&&setTimeout(G(a,function(){A==c&&g(b)}),150)}else{var m=b.clientY<B.top?-20:b.clientY>B.bottom?20:0;m&&setTimeout(G(a,function(){A==c&&(k.scroller.scrollTop+=m,g(b))}),50)}}function h(a){A=Infinity;O(a);k.input.focus();ka(document,\"mousemove\",F);ka(document,\"mouseup\",C);l.history.lastSelOrigin=null}var k=a.display,l=a.doc;O(b);var m,p,n=l.sel,q=n.ranges;e&&!b.shiftKey?(p=l.sel.contains(c),m=-1<p?q[p]:new z(c,c)):(m=l.sel.primary(),p=l.sel.primIndex);if(b.altKey)d=\"rect\",e||(m=new z(c,\nc)),c=Ua(a,b,!0,!0),p=-1;else if(\"double\"==d){var t=a.findWordAt(c);m=a.display.shift||l.extend?rb(l,m,t.anchor,t.head):t}else\"triple\"==d?(t=new z(r(c.line,0),w(l,r(c.line+1,0))),m=a.display.shift||l.extend?rb(l,m,t.anchor,t.head):t):m=rb(l,m,c);e?-1==p?(p=q.length,H(l,Z(q.concat([m]),p),{scroll:!1,origin:\"*mouse\"})):1<q.length&&q[p].empty()&&\"single\"==d&&!b.shiftKey?(H(l,Z(q.slice(0,p).concat(q.slice(p+1)),0)),n=l.sel):Xc(l,p,m,kd):(p=0,H(l,new la([m],0),kd),n=l.sel);var x=c,B=k.wrapper.getBoundingClientRect(),\nA=0,F=G(a,function(a){xe(a)?g(a):h(a)}),C=G(a,h);v(document,\"mousemove\",F);v(document,\"mouseup\",C)}function hd(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(h){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&O(b);d=a.display;var k=d.lineDiv.getBoundingClientRect();if(g>k.bottom||!S(a,c))return ld(b);g-=k.top-d.viewOffset;for(k=0;k<a.options.gutters.length;++k){var l=d.gutters.childNodes[k];if(l&&l.getBoundingClientRect().right>=f)return f=Ba(a.doc,g),e(a,\nc,a,f,a.options.gutters[k],b),ld(b)}}function Hf(a){var b=this;if(!ja(b,a)&&!oa(b.display,a)){O(a);B&&(se=+new Date);var c=Ua(b,a,!0),d=a.dataTransfer.files;if(c&&!Rb(b))if(d&&d.length&&window.FileReader&&window.File){var e=d.length,f=Array(e),g=0;a=function(a,d){var h=new FileReader;h.onload=G(b,function(){f[d]=h.result;if(++g==e){c=w(b.doc,c);var a={from:c,to:c,text:sa(f.join(\"\\n\")),origin:\"paste\"};Oa(b.doc,a);be(b.doc,ga(c,ta(a)))}});h.readAsText(a)};for(var h=0;h<e;++h)a(d[h],h)}else if(b.state.draggingText&&\n-1<b.doc.sel.contains(c))b.state.draggingText(a),setTimeout(function(){b.display.input.focus()},20);else try{if(f=a.dataTransfer.getData(\"Text\")){if(b.state.draggingText&&(W?!a.altKey:!a.ctrlKey))var k=b.listSelections();Vb(b.doc,ga(c,c));if(k)for(h=0;h<k.length;++h)wb(b.doc,\"\",k[h].anchor,k[h].head,\"drag\");b.replaceSelection(f,\"around\",\"paste\");b.display.input.focus()}}catch(l){}}}function lb(a,b){2>Math.abs(a.doc.scrollTop-b)||(a.doc.scrollTop=b,wa||Pc(a,{top:b}),a.display.scroller.scrollTop!=b&&\n(a.display.scroller.scrollTop=b),a.display.scrollbars.setScrollTop(b),wa&&Pc(a),fb(a,100))}function Ma(a,b,c){(c?b==a.doc.scrollLeft:2>Math.abs(a.doc.scrollLeft-b))||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,Bc(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}function re(a,b){var c=ze(b),d=c.x,c=c.y,e=a.display,f=e.scroller;if(d&&f.scrollWidth>f.clientWidth||c&&f.scrollHeight>f.clientHeight){if(c&&\nW&&J){var g=b.target,h=e.view;a:for(;g!=f;g=g.parentNode)for(var k=0;k<h.length;k++)if(h[k].node==g){a.display.currentWheelTarget=g;break a}}!d||wa||ba||null==R?(c&&null!=R&&(g=c*R,h=a.doc.scrollTop,k=h+e.wrapper.clientHeight,0>g?h=Math.max(0,h+g-50):k=Math.min(a.doc.height,k+g+50),Pc(a,{top:h,bottom:k})),20>gc&&(null==e.wheelStartX?(e.wheelStartX=f.scrollLeft,e.wheelStartY=f.scrollTop,e.wheelDX=d,e.wheelDY=c,setTimeout(function(){if(null!=e.wheelStartX){var a=f.scrollLeft-e.wheelStartX,b=f.scrollTop-\ne.wheelStartY,a=b&&e.wheelDY&&b/e.wheelDY||a&&e.wheelDX&&a/e.wheelDX;e.wheelStartX=e.wheelStartY=null;a&&(R=(R*gc+a)/(gc+1),++gc)}},200)):(e.wheelDX+=d,e.wheelDY+=c))):(c&&lb(a,Math.max(0,Math.min(f.scrollTop+c*R,f.scrollHeight-f.clientHeight))),Ma(a,Math.max(0,Math.min(f.scrollLeft+d*R,f.scrollWidth-f.clientWidth))),O(b),e.wheelStartX=null)}}function hc(a,b,c){if(\"string\"==typeof b&&(b=ic[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{Rb(a)&&(a.state.suppressEdits=\n!0),c&&(a.display.shift=!1),e=b(a)!=Ae}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Of(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=xb(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&xb(b,a.options.extraKeys,c,a)||xb(b,a.options.keyMap,c,a)}function jc(a,b,c,d){var e=a.state.keySeq;if(e){if(Pf(b))return\"handled\";Qf.set(50,function(){a.state.keySeq==e&&(a.state.keySeq=null,a.display.input.reset())});b=e+\" \"+b}d=Of(a,b,d);\"multi\"==d&&(a.state.keySeq=\nb);\"handled\"==d&&L(a,\"keyHandled\",a,b,c);if(\"handled\"==d||\"multi\"==d)O(c),Yc(a);return e&&!d&&/\\'$/.test(b)?(O(c),!0):!!d}function Be(a,b){var c=Rf(b,!0);return c?b.shiftKey&&!a.state.keySeq?jc(a,\"Shift-\"+c,b,function(b){return hc(a,b,!0)})||jc(a,c,b,function(b){if(\"string\"==typeof b?/^go[A-Z]/.test(b):b.motion)return hc(a,b)}):jc(a,c,b,function(b){return hc(a,b)}):!1}function Sf(a,b,c){return jc(a,\"'\"+c+\"'\",b,function(b){return hc(a,b,!0)})}function ve(a){this.curOp.focus=fa();if(!ja(this,a)){B&&\n11>C&&27==a.keyCode&&(a.returnValue=!1);var b=a.keyCode;this.display.shift=16==b||a.shiftKey;var c=Be(this,a);ba&&(md=c?b:null,!c&&88==b&&!Ce&&(W?a.metaKey:a.ctrlKey)&&this.replaceSelection(\"\",null,\"cut\"));18!=b||/\\bCodeMirror-crosshair\\b/.test(this.display.lineDiv.className)||Tf(this)}}function Tf(a){function b(a){18!=a.keyCode&&a.altKey||(kb(c,\"CodeMirror-crosshair\"),ka(document,\"keyup\",b),ka(document,\"mouseover\",b))}var c=a.display.lineDiv;mb(c,\"CodeMirror-crosshair\");v(document,\"keyup\",b);v(document,\n\"mouseover\",b)}function ue(a){16==a.keyCode&&(this.doc.sel.shift=!1);ja(this,a)}function we(a){if(!(oa(this.display,a)||ja(this,a)||a.ctrlKey&&!a.altKey||W&&a.metaKey)){var b=a.keyCode,c=a.charCode;if(ba&&b==md)md=null,O(a);else if(!ba||a.which&&!(10>a.which)||!Be(this,a))if(b=String.fromCharCode(null==c?b:c),!Sf(this,a,b))this.display.input.onKeyPress(a)}}function Kf(a){a.state.delayingBlurEvent=!0;setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,db(a))},100)}function xc(a){a.state.delayingBlurEvent&&\n(a.state.delayingBlurEvent=!1);\"nocursor\"!=a.options.readOnly&&(a.state.focused||(K(a,\"focus\",a),a.state.focused=!0,mb(a.display.wrapper,\"CodeMirror-focused\"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),J&&setTimeout(function(){a.display.input.reset(!0)},20)),a.display.input.receivedFocus()),Yc(a))}function db(a){a.state.delayingBlurEvent||(a.state.focused&&(K(a,\"blur\",a),a.state.focused=!1,kb(a.display.wrapper,\"CodeMirror-focused\")),clearInterval(a.display.blinker),\nsetTimeout(function(){a.state.focused||(a.display.shift=!1)},150))}function qe(a,b){var c;(c=oa(a.display,b))||(c=S(a,\"gutterContextMenu\")?hd(a,b,\"gutterContextMenu\",!1,K):!1);if(!c)a.display.input.onContextMenu(b)}function De(a,b){if(0>y(a,b.from))return a;if(0>=y(a,b.to))return ta(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;a.line==b.to.line&&(d+=ta(b).ch-b.to.ch);return r(c,d)}function nd(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel.ranges[d];c.push(new z(De(e.anchor,\nb),De(e.head,b)))}return Z(c,a.sel.primIndex)}function Ee(a,b,c){return a.line==b.line?r(c.line,a.ch-b.ch+c.ch):r(c.line+(a.line-b.line),a.ch)}function Fe(a,b,c){b={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){this.canceled=!0}};c&&(b.update=function(b,c,f,g){b&&(this.from=w(a,b));c&&(this.to=w(a,c));f&&(this.text=f);void 0!==g&&(this.origin=g)});K(a,\"beforeChange\",a,b);a.cm&&K(a.cm,\"beforeChange\",a.cm,b);return b.canceled?null:{from:b.from,to:b.to,text:b.text,origin:b.origin}}\nfunction Oa(a,b,c){if(a.cm){if(!a.cm.curOp)return G(a.cm,Oa)(a,b,c);if(a.cm.state.suppressEdits)return}if(S(a,\"beforeChange\")||a.cm&&S(a.cm,\"beforeChange\"))if(b=Fe(a,b,!0),!b)return;if(c=Ge&&!c&&Uf(a,b.from,b.to))for(var d=c.length-1;0<=d;--d)He(a,{from:c[d].from,to:c[d].to,text:d?[\"\"]:b.text});else He(a,b)}function He(a,b){if(1!=b.text.length||\"\"!=b.text[0]||0!=y(b.from,b.to)){var c=nd(a,b);Ie(a,b,c,a.cm?a.cm.curOp.id:NaN);yb(a,b,c,od(a,b));var d=[];Ga(a,function(a,c){c||-1!=D(d,a.history)||(Je(a.history,\nb),d.push(a.history));yb(a,b,null,od(a,b))})}}function kc(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var d=a.history,e,f=a.sel,g=\"undo\"==b?d.done:d.undone,h=\"undo\"==b?d.undone:d.done,k=0;k<g.length&&(e=g[k],c?!e.ranges||e.equals(a.sel):e.ranges);k++);if(k!=g.length){for(d.lastOrigin=d.lastSelOrigin=null;;)if(e=g.pop(),e.ranges){Wb(e,h);if(c&&!e.equals(a.sel)){H(a,e,{clearRedo:!1});return}f=e}else break;c=[];Wb(f,h);h.push({changes:c,generation:d.generation});d.generation=e.generation||++d.maxGeneration;\nd=S(a,\"beforeChange\")||a.cm&&S(a.cm,\"beforeChange\");for(k=e.changes.length-1;0<=k;--k){var l=e.changes[k];l.origin=b;if(d&&!Fe(a,l,!1)){g.length=0;break}c.push(pd(a,l));f=k?nd(a,l):A(g);yb(a,l,f,Ke(a,l));!k&&a.cm&&a.cm.scrollIntoView({from:l.from,to:ta(l)});var m=[];Ga(a,function(a,b){b||-1!=D(m,a.history)||(Je(a.history,l),m.push(a.history));yb(a,l,null,Ke(a,l))})}}}}function Le(a,b){if(0!=b&&(a.first+=b,a.sel=new la(ob(a.sel.ranges,function(a){return new z(r(a.anchor.line+b,a.anchor.ch),r(a.head.line+\nb,a.head.ch))}),a.sel.primIndex),a.cm)){Q(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)na(a.cm,d,\"gutter\")}}function yb(a,b,c,d){if(a.cm&&!a.cm.curOp)return G(a.cm,yb)(a,b,c,d);if(b.to.line<a.first)Le(a,b.text.length-1-(b.to.line-b.from.line));else if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);Le(a,e);b={from:r(a.first,0),to:r(b.to.line+e,b.to.ch),text:[A(b.text)],origin:b.origin}}e=a.lastLine();b.to.line>e&&(b=\n{from:b.from,to:r(e,u(a,e).text.length),text:[b.text[0]],origin:b.origin});b.removed=Da(a,b.from,b.to);c||(c=nd(a,b));a.cm?Vf(a.cm,b,d):qd(a,b,d);Vb(a,c,ha)}}function Vf(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,k=f.line;a.options.lineWrapping||(k=F(ia(u(d,f.line))),d.iter(k,g.line+1,function(a){if(a==e.maxLine)return h=!0}));-1<d.sel.contains(b.from,b.to)&&fe(a);qd(d,b,c,Id(a));a.options.lineWrapping||(d.iter(k,f.line+b.text.length,function(a){var b=Kb(a);b>e.maxLineLength&&(e.maxLine=\na,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0));d.frontier=Math.min(d.frontier,f.line);fb(a,400);c=b.text.length-(g.line-f.line)-1;b.full?Q(a):f.line!=g.line||1!=b.text.length||Me(a.doc,b)?Q(a,f.line,g.line+1,c):na(a,f.line,\"text\");c=S(a,\"changes\");if((d=S(a,\"change\"))||c)b={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin},d&&L(a,\"change\",a,b),c&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(b);a.display.selForContextMenu=null}function wb(a,b,c,d,e){d||\n(d=c);if(0>y(d,c)){var f=d;d=c;c=f}\"string\"==typeof b&&(b=sa(b));Oa(a,{from:c,to:d,text:b,origin:e})}function cc(a,b,c,d,e){var f=a.display,g=xa(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,k=Nc(a),l={};e-c>k&&(e=c+k);var m=a.doc.height+Ec(f),p=c<g,g=e>m-g;c<h?l.scrollTop=p?0:c:e>h+k&&(c=Math.min(c,(g?m:e)-k),c!=h&&(l.scrollTop=c));h=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft;a=pa(a)-(a.options.fixedGutter?f.gutters.offsetWidth:\n0);(f=d-b>a)&&(d=b+a);10>b?l.scrollLeft=0:b<h?l.scrollLeft=Math.max(0,b-(f?0:10)):d>a+h-3&&(l.scrollLeft=d+(f?0:10)-a);return l}function lc(a,b,c){null==b&&null==c||mc(a);null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b);null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function Pa(a){mc(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?r(b.line,b.ch-1):b,d=r(b.line,b.ch+1));a.curOp.scrollToPos={from:c,\nto:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function mc(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=oe(a,b.from),d=oe(a,b.to),b=cc(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(b.scrollLeft,b.scrollTop)}}function pb(a,b,c,d){var e=a.doc,f;null==c&&(c=\"add\");\"smart\"==c&&(e.mode.indent?f=sb(a,b):c=\"prev\");var g=a.options.tabSize,h=u(e,b),k=aa(h.text,null,g);h.stateAfter&&(h.stateAfter=\nnull);var l=h.text.match(/^\\s*/)[0],m;if(!d&&!/\\S/.test(h.text))m=0,c=\"not\";else if(\"smart\"==c&&(m=e.mode.indent(f,h.text.slice(l.length),h.text),m==Ae||150<m)){if(!d)return;c=\"prev\"}\"prev\"==c?m=b>e.first?aa(u(e,b-1).text,null,g):0:\"add\"==c?m=k+a.options.indentUnit:\"subtract\"==c?m=k-a.options.indentUnit:\"number\"==typeof c&&(m=k+c);m=Math.max(0,m);c=\"\";d=0;if(a.options.indentWithTabs)for(a=Math.floor(m/g);a;--a)d+=g,c+=\"\\t\";d<m&&(c+=Ne(m-d));if(c!=l)return wb(e,c,r(b,0),r(b,l.length),\"+input\"),h.stateAfter=\nnull,!0;for(a=0;a<e.sel.ranges.length;a++)if(g=e.sel.ranges[a],g.head.line==b&&g.head.ch<l.length){d=r(b,l.length);Xc(e,a,new z(d,d));break}}function nc(a,b,c,d){var e=b,f=b;\"number\"==typeof b?f=u(a,Math.max(a.first,Math.min(b,a.first+a.size-1))):e=F(b);if(null==e)return null;d(f,e)&&a.cm&&na(a.cm,e,c);return f}function Va(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&0>=y(f.from,A(d).to);){var g=d.pop();if(0>y(g.from,f.from)){f.from=g.from;break}}d.push(f)}T(a,\nfunction(){for(var b=d.length-1;0<=b;b--)wb(a.doc,\"\",d[b].from,d[b].to,\"+delete\");Pa(a)})}function rd(a,b,c,d,e){function f(b){var d=(e?gd:Oe)(l,h,c,!0);if(null==d){if(b=!b)b=g+c,b<a.first||b>=a.first+a.size?b=m=!1:(g=b,b=l=u(a,b));if(b)h=e?(0>c?bc:ac)(l):0>c?l.text.length:0;else return m=!1}else h=d;return!0}var g=b.line,h=b.ch,k=c,l=u(a,g),m=!0;if(\"char\"==d)f();else if(\"column\"==d)f(!0);else if(\"word\"==d||\"group\"==d){var p=null;d=\"group\"==d;b=a.cm&&a.cm.getHelper(b,\"wordChars\");for(var n=!0;!(0>\nc)||f(!n);n=!1){var q=l.text.charAt(h)||\"\\n\",q=oc(q,b)?\"w\":d&&\"\\n\"==q?\"n\":!d||/\\s/.test(q)?null:\"p\";!d||n||q||(q=\"s\");if(p&&p!=q){0>c&&(c=1,f());break}q&&(p=q);if(0<c&&!f(!n))break}}k=Xb(a,r(g,h),k,!0);m||(k.hitSide=!0);return k}function Pe(a,b,c,d){var e=a.doc,f=b.left,g;\"page\"==d?(g=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),g=b.top+c*(g-(0>c?1.5:.5)*xa(a.display))):\"line\"==d&&(g=0<c?b.bottom+3:b.top-3);for(;;){b=fd(a,f,g);if(!b.outside)break;\nif(0>c?0>=g:g>=e.height){b.hitSide=!0;break}g+=5*c}return b}function x(a,b,c,d){q.defaults[a]=b;c&&(Ka[a]=d?function(a,b,d){d!=Fd&&c(a,b,d)}:c)}function Wf(a){var b=a.split(/-(?!$)/);a=b[b.length-1];for(var c,d,e,f,g=0;g<b.length-1;g++){var h=b[g];if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else if(/^s(hift)$/i.test(h))e=!0;else throw Error(\"Unrecognized modifier name: \"+h);}c&&(a=\"Alt-\"+a);d&&(a=\"Ctrl-\"+a);f&&(a=\"Cmd-\"+a);e&&(a=\"Shift-\"+\na);return a}function pc(a){return\"string\"==typeof a?ua[a]:a}function Wa(a,b,c,d,e){if(d&&d.shared)return Xf(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return G(a.cm,Wa)(a,b,c,d,e);var f=new Ha(a,e);e=y(b,c);d&&V(d,f,!1);if(0<e||0==e&&!1!==f.clearWhenEmpty)return f;f.replacedWith&&(f.collapsed=!0,f.widgetNode=t(\"span\",[f.replacedWith],\"CodeMirror-widget\"),d.handleMouseEvents||f.widgetNode.setAttribute(\"cm-ignore-events\",\"true\"),d.insertLeft&&(f.widgetNode.insertLeft=!0));if(f.collapsed){if(Qe(a,b.line,b,c,f)||\nb.line!=c.line&&Qe(a,c.line,b,c,f))throw Error(\"Inserting collapsed marker partially overlapping an existing one\");ra=!0}f.addToHistory&&Ie(a,{from:b,to:c,origin:\"markText\"},a.sel,NaN);var g=b.line,h=a.cm,k;a.iter(g,c.line+1,function(a){h&&f.collapsed&&!h.options.lineWrapping&&ia(a)==h.display.maxLine&&(k=!0);f.collapsed&&g!=b.line&&ca(a,0);var d=new qc(f,g==b.line?b.ch:null,g==c.line?c.ch:null);a.markedSpans=a.markedSpans?a.markedSpans.concat([d]):[d];d.marker.attachLine(a);++g});f.collapsed&&a.iter(b.line,\nc.line+1,function(b){ya(a,b)&&ca(b,0)});f.clearOnEnter&&v(f,\"beforeCursorEnter\",function(){f.clear()});f.readOnly&&(Ge=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory());f.collapsed&&(f.id=++sd,f.atomic=!0);if(h){k&&(h.curOp.updateMaxLine=!0);if(f.collapsed)Q(h,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(d=b.line;d<=c.line;d++)na(h,d,\"text\");f.atomic&&ge(h.doc);L(h,\"markerAdded\",h,f)}return f}function Xf(a,b,c,d,e){d=V(d);d.shared=!1;var f=\n[Wa(a,b,c,d,e)],g=f[0],h=d.widgetNode;Ga(a,function(a){h&&(d.widgetNode=h.cloneNode(!0));f.push(Wa(a,w(a,b),w(a,c),d,e));for(var l=0;l<a.linked.length;++l)if(a.linked[l].isParent)return;g=A(f)});return new rc(f,g)}function Re(a){return a.findMarks(r(a.first,0),a.clipPos(r(a.lastLine())),function(a){return a.parent})}function Yf(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];Ga(c.primary.doc,function(a){d.push(a)});for(var e=0;e<c.markers.length;e++){var f=c.markers[e];-1==D(d,f.doc)&&\n(f.parent=null,c.markers.splice(e--,1))}}}function qc(a,b,c){this.marker=a;this.from=b;this.to=c}function zb(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function od(a,b){if(b.full)return null;var c=qb(a,b.from.line)&&u(a,b.from.line).markedSpans,d=qb(a,b.to.line)&&u(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=0==y(b.from,b.to);if(c)for(var h=0,k;h<c.length;++h){var l=c[h],m=l.marker;if(null==l.from||(m.inclusiveLeft?l.from<=e:l.from<e)||\n!(l.from!=e||\"bookmark\"!=m.type||g&&l.marker.insertLeft)){var p=null==l.to||(m.inclusiveRight?l.to>=e:l.to>e);(k||(k=[])).push(new qc(m,l.from,p?null:l.to))}}c=k;if(d)for(var h=0,n;h<d.length;++h)if(k=d[h],l=k.marker,null==k.to||(l.inclusiveRight?k.to>=f:k.to>f)||k.from==f&&\"bookmark\"==l.type&&(!g||k.marker.insertLeft))m=null==k.from||(l.inclusiveLeft?k.from<=f:k.from<f),(n||(n=[])).push(new qc(l,m?null:k.from-f,null==k.to?null:k.to-f));d=n;g=1==b.text.length;n=A(b.text).length+(g?e:0);if(c)for(f=\n0;f<c.length;++f)if(h=c[f],null==h.to)(k=zb(d,h.marker),k)?g&&(h.to=null==k.to?null:k.to+n):h.to=e;if(d)for(f=0;f<d.length;++f)h=d[f],null!=h.to&&(h.to+=n),null==h.from?(k=zb(c,h.marker),k||(h.from=n,g&&(c||(c=[])).push(h))):(h.from+=n,g&&(c||(c=[])).push(h));c&&(c=Se(c));d&&d!=c&&(d=Se(d));e=[c];if(!g){var g=b.text.length-2,q;if(0<g&&c)for(f=0;f<c.length;++f)null==c[f].to&&(q||(q=[])).push(new qc(c[f].marker,null,null));for(f=0;f<g;++f)e.push(q);e.push(d)}return e}function Se(a){for(var b=0;b<a.length;++b){var c=\na[b];null!=c.from&&c.from==c.to&&!1!==c.marker.clearWhenEmpty&&a.splice(b--,1)}return a.length?a:null}function Ke(a,b){var c;if(c=b[\"spans_\"+a.id]){for(var d=0,e=[];d<b.text.length;++d)e.push(Zf(c[d]));c=e}else c=null;d=od(a,b);if(!c)return d;if(!d)return c;for(e=0;e<c.length;++e){var f=c[e],g=d[e];if(f&&g){var h=0;a:for(;h<g.length;++h){for(var k=g[h],l=0;l<f.length;++l)if(f[l].marker==k.marker)continue a;f.push(k)}}else g&&(c[e]=g)}return c}function Uf(a,b,c){var d=null;a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=\n0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=D(d,c)||(d||(d=[])).push(c)}});if(!d)return null;a=[{from:b,to:c}];for(b=0;b<d.length;++b){c=d[b];for(var e=c.find(0),f=0;f<a.length;++f){var g=a[f];if(!(0>y(g.to,e.from)||0<y(g.from,e.to))){var h=[f,1],k=y(g.from,e.from),l=y(g.to,e.to);(0>k||!c.inclusiveLeft&&!k)&&h.push({from:g.from,to:e.from});(0<l||!c.inclusiveRight&&!l)&&h.push({from:e.to,to:g.to});a.splice.apply(a,h);f+=h.length-1}}}return a}function Te(a){var b=\na.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function Ue(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function Ve(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;var c=a.find(),d=b.find(),e=y(c.from,d.from)||(a.inclusiveLeft?-1:0)-(b.inclusiveLeft?-1:0);return e?-e:(c=y(c.to,d.to)||(a.inclusiveRight?1:0)-(b.inclusiveRight?1:0))?c:b.id-a.id}function Aa(a,b){var c=ra&&a.markedSpans,d;if(c)for(var e,f=0;f<c.length;++f)e=\nc[f],e.marker.collapsed&&null==(b?e.from:e.to)&&(!d||0>Ve(d,e.marker))&&(d=e.marker);return d}function Qe(a,b,c,d,e){a=u(a,b);if(a=ra&&a.markedSpans)for(b=0;b<a.length;++b){var f=a[b];if(f.marker.collapsed){var g=f.marker.find(0),h=y(g.from,c)||(f.marker.inclusiveLeft?-1:0)-(e.inclusiveLeft?-1:0),k=y(g.to,d)||(f.marker.inclusiveRight?1:0)-(e.inclusiveRight?1:0);if(!(0<=h&&0>=k||0>=h&&0<=k)&&(0>=h&&(0<y(g.to,c)||f.marker.inclusiveRight&&e.inclusiveLeft)||0<=h&&(0>y(g.from,d)||f.marker.inclusiveLeft&&\ne.inclusiveRight)))return!0}}}function ia(a){for(var b;b=Aa(a,!0);)a=b.find(-1,!0).line;return a}function Mc(a,b){var c=u(a,b),d=ia(c);return c==d?b:F(d)}function Ld(a,b){if(b>a.lastLine())return b;var c=u(a,b),d;if(!ya(a,c))return b;for(;d=Aa(c,!1);)c=d.find(1,!0).line;return F(c)+1}function ya(a,b){var c=ra&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed&&(null==d.from||!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&td(a,b,d)))return!0}function td(a,b,c){if(null==\nc.to)return b=c.marker.find(1,!0),td(a,b.line,zb(b.line.markedSpans,c.marker));if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var d,e=0;e<b.markedSpans.length;++e)if(d=b.markedSpans[e],d.marker.collapsed&&!d.marker.widgetNode&&d.from==c.to&&(null==d.to||d.to!=c.from)&&(d.marker.inclusiveLeft||c.marker.inclusiveRight)&&td(a,b,d))return!0}function ub(a){if(null!=a.height)return a.height;var b=a.doc.cm;if(!b)return 0;if(!Wc(document.body,a.node)){var c=\"position: relative;\";a.coverGutter&&\n(c+=\"margin-left: -\"+b.display.gutters.offsetWidth+\"px;\");a.noHScroll&&(c+=\"width: \"+b.display.wrapper.clientWidth+\"px;\");U(b.display.measure,t(\"div\",[a.node],null,c))}return a.height=a.node.offsetHeight}function $f(a,b,c,d){var e=new sc(a,c,d),f=a.cm;f&&e.noHScroll&&(f.display.alignWidgets=!0);nc(a,b,\"widget\",function(b){var c=b.widgets||(b.widgets=[]);null==e.insertAt?c.push(e):c.splice(Math.min(c.length-1,Math.max(0,e.insertAt)),0,e);e.line=b;f&&!ya(a,b)&&(c=ea(b)<a.scrollTop,ca(b,b.height+ub(e)),\nc&&lc(f,null,e.height),f.curOp.forceUpdate=!0);return!0});return e}function We(a,b){if(a)for(;;){var c=a.match(/(?:^|\\s+)line-(background-)?(\\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);var d=c[1]?\"bgClass\":\"textClass\";null==b[d]?b[d]=c[2]:(new RegExp(\"(?:^|s)\"+c[2]+\"(?:$|s)\")).test(b[d])||(b[d]+=\" \"+c[2])}return a}function Xe(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){var c=q.innerMode(a,b);if(c.mode.blankLine)return c.mode.blankLine(c.state)}}function ud(a,\nb,c,d){for(var e=0;10>e;e++){d&&(d[0]=q.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw Error(\"Mode \"+a.name+\" failed to advance stream.\");}function Ye(a,b,c,d){function e(a){return{start:m.start,end:m.pos,string:m.current(),type:h||null,state:a?Sa(f.mode,l):l}}var f=a.doc,g=f.mode,h;b=w(f,b);var k=u(f,b.line),l=sb(a,b.line,c),m=new tc(k.text,a.options.tabSize),p;for(d&&(p=[]);(d||m.pos<b.ch)&&!m.eol();)m.start=m.pos,h=ud(g,m,l),d&&p.push(e(!0));return d?p:e()}function Ze(a,\nb,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var k=0,l=null,m=new tc(b,a.options.tabSize),p,n=a.options.addModeClass&&[null];for(\"\"==b&&We(Xe(c,d),f);!m.eol();){m.pos>a.options.maxHighlightLength?(h=!1,g&&Zc(a,b,d,m.pos),m.pos=b.length,p=null):p=We(ud(c,m,d,n),f);if(n){var q=n[0].name;q&&(p=\"m-\"+(p?q+\" \"+p:q))}if(!h||l!=p){for(;k<m.start;)k=Math.min(m.start,k+5E4),e(k,l);l=p}m.start=m.pos}for(;k<m.pos;)a=Math.min(m.pos,k+5E4),e(a,l),k=a}function je(a,b,c,d){var e=[a.state.modeGen],\nf={};Ze(a,b.text,a.doc.mode,c,function(a,b){e.push(a,b)},f,d);for(c=0;c<a.state.overlays.length;++c){var g=a.state.overlays[c],h=1,k=0;Ze(a,b.text,g.mode,!0,function(a,b){for(var c=h;k<a;){var d=e[h];d>a&&e.splice(h,1,a,e[h+1],d);h+=2;k=Math.min(a,d)}if(b)if(g.opaque)e.splice(c,h-c,a,\"cm-overlay \"+b),h=c+2;else for(;c<h;c+=2)d=e[c+1],e[c+1]=(d?d+\" \":\"\")+\"cm-overlay \"+b},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function $e(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=je(a,\nb,b.stateAfter=sb(a,F(b)));b.styles=d.styles;d.classes?b.styleClasses=d.classes:b.styleClasses&&(b.styleClasses=null);c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Zc(a,b,c,d){var e=a.doc.mode,f=new tc(b,a.options.tabSize);f.start=f.pos=d||0;for(\"\"==b&&Xe(e,c);!f.eol()&&f.pos<=a.options.maxHighlightLength;)ud(e,f,c),f.start=f.pos}function af(a,b){if(!a||/^\\s*$/.test(a))return null;var c=b.addModeClass?ag:bg;return c[a]||(c[a]=a.replace(/\\S+/g,\"cm-$\\x26\"))}function Sd(a,b){var c=t(\"span\",\nnull,null,J?\"padding-right: .1px\":null),c={pre:t(\"pre\",[c]),content:c,col:0,pos:0,cm:a,splitSpaces:(B||J)&&a.getOption(\"lineWrapping\")};b.measure={};for(var d=0;d<=(b.rest?b.rest.length:0);d++){var e=d?b.rest[d-1]:b.line,f;c.pos=0;c.addToken=cg;var g;if(null!=vd)g=vd;else{g=U(a.display.measure,document.createTextNode(\"AخA\"));var h=Ea(g,0,1).getBoundingClientRect();g=h&&h.left!=h.right?vd=3>Ea(g,1,2).getBoundingClientRect().right-h.right:!1}g&&(f=Y(e))&&(c.addToken=dg(c.addToken,f));c.map=[];h=b!=\na.display.externalMeasured&&F(e);a:{g=c;var h=$e(a,e,h),k=e.markedSpans,l=e.text,m=0;if(k)for(var p=l.length,n=0,q=1,r=\"\",u=void 0,v=void 0,w=0,x=void 0,y=void 0,A=void 0,C=void 0,z=void 0;;){if(w==n){for(var x=y=A=C=v=\"\",z=null,w=Infinity,G=[],H=0;H<k.length;++H){var I=k[H],D=I.marker;\"bookmark\"==D.type&&I.from==n&&D.widgetNode?G.push(D):I.from<=n&&(null==I.to||I.to>n||D.collapsed&&I.to==n&&I.from==n)?(null!=I.to&&I.to!=n&&w>I.to&&(w=I.to,y=\"\"),D.className&&(x+=\" \"+D.className),D.css&&(v=D.css),\nD.startStyle&&I.from==n&&(A+=\" \"+D.startStyle),D.endStyle&&I.to==w&&(y+=\" \"+D.endStyle),D.title&&!C&&(C=D.title),D.collapsed&&(!z||0>Ve(z.marker,D))&&(z=I)):I.from>n&&w>I.from&&(w=I.from)}if(z&&(z.from||0)==n){bf(g,(null==z.to?p+1:z.to)-n,z.marker,null==z.from);if(null==z.to)break a;z.to==n&&(z=!1)}if(!z&&G.length)for(H=0;H<G.length;++H)bf(g,0,G[H])}if(n>=p)break;for(G=Math.min(p,w);;){if(r){H=n+r.length;z||(I=H>G?r.slice(0,G-n):r,g.addToken(g,I,u?u+x:x,A,n+I.length==w?y:\"\",C,v));if(H>=G){r=r.slice(G-\nn);n=G;break}n=H;A=\"\"}r=l.slice(m,m=h[q++]);u=af(h[q++],g.cm.options)}}else for(var q=1;q<h.length;q+=2)g.addToken(g,l.slice(m,m=h[q]),af(h[q+1],g.cm.options))}e.styleClasses&&(e.styleClasses.bgClass&&(c.bgClass=wd(e.styleClasses.bgClass,c.bgClass||\"\")),e.styleClasses.textClass&&(c.textClass=wd(e.styleClasses.textClass,c.textClass||\"\")));0==c.map.length&&c.map.push(0,0,c.content.appendChild(eg(a.display.measure)));0==d?(b.measure.map=c.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(c.map),\n(b.measure.caches||(b.measure.caches=[])).push({}))}J&&/\\bcm-tab\\b/.test(c.content.lastChild.className)&&(c.content.className=\"cm-tab-wrap-hack\");K(a,\"renderLine\",a,b.line,c.pre);c.pre.className&&(c.textClass=wd(c.pre.className,c.textClass||\"\"));return c}function cg(a,b,c,d,e,f,g){if(b){var h=a.splitSpaces?b.replace(/ {3,}/g,fg):b,k=a.cm.state.specialChars,l=!1;if(k.test(b))for(var m=document.createDocumentFragment(),p=0;;){k.lastIndex=p;var n=k.exec(b),q=n?n.index-p:b.length-p;if(q){var r=document.createTextNode(h.slice(p,\np+q));B&&9>C?m.appendChild(t(\"span\",[r])):m.appendChild(r);a.map.push(a.pos,a.pos+q,r);a.col+=q;a.pos+=q}if(!n)break;p+=q+1;\"\\t\"==n[0]?(r=a.cm.options.tabSize,n=r-a.col%r,r=m.appendChild(t(\"span\",Ne(n),\"cm-tab\")),r.setAttribute(\"role\",\"presentation\"),r.setAttribute(\"cm-text\",\"\\t\"),a.col+=n):(r=a.cm.options.specialCharPlaceholder(n[0]),r.setAttribute(\"cm-text\",n[0]),B&&9>C?m.appendChild(t(\"span\",[r])):m.appendChild(r),a.col+=1);a.map.push(a.pos,a.pos+1,r);a.pos++}else{a.col+=b.length;var m=document.createTextNode(h);\na.map.push(a.pos,a.pos+b.length,m);B&&9>C&&(l=!0);a.pos+=b.length}if(c||d||e||l||g)return b=c||\"\",d&&(b+=d),e&&(b+=e),d=t(\"span\",[m],b,g),f&&(d.title=f),a.content.appendChild(d);a.content.appendChild(m)}}function fg(a){for(var b=\" \",c=0;c<a.length-2;++c)b+=c%2?\" \":\" \";return b+\" \"}function dg(a,b){return function(c,d,e,f,g,h,k){e=e?e+\" cm-force-border\":\"cm-force-border\";for(var l=c.pos,m=l+d.length;;){for(var p=0;p<b.length;p++){var n=b[p];if(n.to>l&&n.from<=l)break}if(n.to>=m)return a(c,d,e,f,g,\nh,k);a(c,d.slice(0,n.to-l),e,f,null,h,k);f=null;d=d.slice(n.to-l);l=n.to}}}function bf(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e);!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement(\"span\"))),e.setAttribute(\"cm-marker\",c.id));e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e));a.pos+=b}function Me(a,b){return 0==b.from.ch&&0==b.to.ch&&\"\"==A(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function qd(a,b,c,d){function e(a,\nc,e){a.text=c;a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null);null!=a.order&&(a.order=null);Te(a);Ue(a,e);c=d?d(a):1;c!=a.height&&ca(a,c);L(a,\"change\",a,b)}function f(a,b){for(var e=a,f=[];e<b;++e)f.push(new Ab(k[e],c?c[e]:null,d));return f}var g=b.from,h=b.to,k=b.text,l=u(a,g.line),m=u(a,h.line),p=A(k),n=c?c[k.length-1]:null,q=h.line-g.line;if(b.full)a.insert(0,f(0,k.length)),a.remove(k.length,a.size-k.length);else if(Me(a,b)){var r=f(0,k.length-1);e(m,m.text,n);q&&a.remove(g.line,q);\nr.length&&a.insert(g.line,r)}else l==m?1==k.length?e(l,l.text.slice(0,g.ch)+p+l.text.slice(h.ch),n):(r=f(1,k.length-1),r.push(new Ab(p+l.text.slice(h.ch),n,d)),e(l,l.text.slice(0,g.ch)+k[0],c?c[0]:null),a.insert(g.line+1,r)):1==k.length?(e(l,l.text.slice(0,g.ch)+k[0]+m.text.slice(h.ch),c?c[0]:null),a.remove(g.line+1,q)):(e(l,l.text.slice(0,g.ch)+k[0],c?c[0]:null),e(m,p+m.text.slice(h.ch),n),r=f(1,k.length-1),1<q&&a.remove(g.line+1,q-1),a.insert(g.line+1,r));L(a,\"change\",a,b)}function Bb(a){this.lines=\na;this.parent=null;for(var b=0,c=0;b<a.length;++b)a[b].parent=this,c+=a[b].height;this.height=c}function Cb(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d],b=b+e.chunkSize(),c=c+e.height;e.parent=this}this.size=b;this.height=c;this.parent=null}function Ga(a,b,c){function d(a,f,g){if(a.linked)for(var h=0;h<a.linked.length;++h){var k=a.linked[h];if(k.doc!=f){var l=g&&k.sharedHist;if(!c||l)b(k.doc,l),d(k.doc,a,l)}}}d(a,null,!0)}function Ed(a,b){if(b.cm)throw Error(\"This document is already in use.\");\na.doc=b;b.cm=a;Ac(a);zc(a);a.options.lineWrapping||Dc(a);a.options.mode=b.modeOption;Q(a)}function u(a,b){b-=a.first;if(0>b||b>=a.size)throw Error(\"There is no line \"+(b+a.first)+\" in the document.\");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(b<f){c=e;break}b-=f}return c.lines[b]}function Da(a,b,c){var d=[],e=b.line;a.iter(b.line,c.line+1,function(a){a=a.text;e==c.line&&(a=a.slice(0,c.ch));e==b.line&&(a=a.slice(b.ch));d.push(a);++e});return d}function xd(a,b,c){var d=\n[];a.iter(b,c,function(a){d.push(a.text)});return d}function ca(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function F(a){if(null==a.parent)return null;var b=a.parent;a=D(b.lines,a);for(var c=b.parent;c;b=c,c=c.parent)for(var d=0;c.children[d]!=b;++d)a+=c.children[d].chunkSize();return a+b.first}function Ba(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(b<f){a=e;continue a}b-=f;c+=e.chunkSize()}return c}while(!a.lines);for(d=0;d<\na.lines.length;++d){e=a.lines[d].height;if(b<e)break;b-=e}return c+d}function ea(a){a=ia(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;else b+=e.height}for(a=c.parent;a;c=a,a=c.parent)for(d=0;d<a.children.length&&(e=a.children[d],e!=c);++d)b+=e.height;return b}function Y(a){var b=a.order;null==b&&(b=a.order=gg(a.text));return b}function uc(a){this.done=[];this.undone=[];this.undoDepth=Infinity;this.lastModTime=this.lastSelTime=0;this.lastOrigin=this.lastSelOrigin=\nthis.lastOp=this.lastSelOp=null;this.generation=this.maxGeneration=a||1}function pd(a,b){var c={from:Rc(b.from),to:ta(b),text:Da(a,b.from,b.to)};cf(a,c,b.from.line,b.to.line+1);Ga(a,function(a){cf(a,c,b.from.line,b.to.line+1)},!0);return c}function ce(a){for(;a.length;)if(A(a).ranges)a.pop();else break}function Ie(a,b,c,d){var e=a.history;e.undone.length=0;var f=+new Date,g,h;if(h=e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&(\"+\"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||\n\"*\"==b.origin.charAt(0)))e.lastOp==d?(ce(e.done),g=A(e.done)):e.done.length&&!A(e.done).ranges?g=A(e.done):1<e.done.length&&!e.done[e.done.length-2].ranges?(e.done.pop(),g=A(e.done)):g=void 0,h=g;if(h){var k=A(g.changes);0==y(b.from,b.to)&&0==y(b.from,k.to)?k.to=ta(b):g.changes.push(pd(a,b))}else for((g=A(e.done))&&g.ranges||Wb(a.sel,e.done),g={changes:[pd(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift();e.done.push(c);e.generation=\n++e.maxGeneration;e.lastModTime=e.lastSelTime=f;e.lastOp=e.lastSelOp=d;e.lastOrigin=e.lastSelOrigin=b.origin;k||K(a,\"historyAdded\")}function Wb(a,b){var c=A(b);c&&c.ranges&&c.equals(a)||b.push(a)}function cf(a,b,c,d){var e=b[\"spans_\"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b[\"spans_\"+a.id]={}))[f]=c.markedSpans);++f})}function Zf(a){if(!a)return null;for(var b=0,c;b<a.length;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);\nreturn c?c.length?c:null:a}function Xa(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.ranges)e.push(c?la.prototype.deepCopy.call(f):f);else{var f=f.changes,g=[];e.push({changes:g});for(var h=0;h<f.length;++h){var k=f[h],l;g.push({from:k.from,to:k.to,text:k.text});if(b)for(var m in k)(l=m.match(/^spans_(\\d+)$/))&&-1<D(b,Number(l[1]))&&(A(g)[m]=k[m],delete k[m])}}}return e}function df(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function ef(a,b,c,d){for(var e=0;e<a.length;++e){var f=\na[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)df(f.ranges[h].anchor,b,c,d),df(f.ranges[h].head,b,c,d)}else{for(h=0;h<f.changes.length;++h){var k=f.changes[h];if(c<k.from.line)k.from=r(k.from.line+d,k.from.ch),k.to=r(k.to.line+d,k.to.ch);else if(b<=k.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function Je(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;ef(a.done,c,d,e);ef(a.undone,c,d,e)}function ld(a){return null!=a.defaultPrevented?\na.defaultPrevented:0==a.returnValue}function xe(a){var b=a.which;null==b&&(a.button&1?b=1:a.button&2?b=3:a.button&4&&(b=2));W&&a.ctrlKey&&1==b&&(b=3);return b}function L(a,b){function c(a){return function(){a.apply(null,e)}}var d=a._handlers&&a._handlers[b];if(d){var e=Array.prototype.slice.call(arguments,2),f;Ta?f=Ta.delayedCallbacks:Db?f=Db:(f=Db=[],setTimeout(hg,0));for(var g=0;g<d.length;++g)f.push(c(d[g]))}}function hg(){var a=Db;Db=null;for(var b=0;b<a.length;++b)a[b]()}function ja(a,b,c){\"string\"==\ntypeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}});K(a,c||b.type,a,b);return ld(b)||b.codemirrorIgnore}function fe(a){var b=a._handlers&&a._handlers.cursorActivity;if(b){a=a.curOp.cursorActivityHandlers||(a.curOp.cursorActivityHandlers=[]);for(var c=0;c<b.length;++c)-1==D(a,b[c])&&a.push(b[c])}}function S(a,b){var c=a._handlers&&a._handlers[b];return c&&0<c.length}function Ya(a){a.prototype.on=function(a,c){v(this,a,c)};a.prototype.off=function(a,c){ka(this,a,c)}}function bb(){this.id=\nnull}function ye(a,b,c){for(var d=0,e=0;;){var f=a.indexOf(\"\\t\",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);e+=f-d;e+=c-e%c;d=f+1;if(e>=b)return d}}function Ne(a){for(;vc.length<=a;)vc.push(A(vc)+\" \");return vc[a]}function A(a){return a[a.length-1]}function D(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function ob(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}function Eb(){}function ff(a,b){var c;Object.create?c=Object.create(a):\n(Eb.prototype=a,c=new Eb);b&&V(b,c);return c}function V(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||!1===c&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function cb(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function oc(a,b){return b?-1<b.source.indexOf(\"\\\\w\")&&gf(a)?!0:b.test(a):gf(a)}function hf(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function tb(a){return 768<=a.charCodeAt(0)&&ig.test(a)}function t(a,b,c,d){a=document.createElement(a);\nc&&(a.className=c);d&&(a.style.cssText=d);if(\"string\"==typeof b)a.appendChild(document.createTextNode(b));else if(b)for(c=0;c<b.length;++c)a.appendChild(b[c]);return a}function za(a){for(var b=a.childNodes.length;0<b;--b)a.removeChild(a.firstChild);return a}function U(a,b){return za(a).appendChild(b)}function fa(){return document.activeElement}function Fb(a){return new RegExp(\"(^|\\\\s)\"+a+\"(?:$|\\\\s)\\\\s*\")}function wd(a,b){for(var c=a.split(\" \"),d=0;d<c.length;d++)c[d]&&!Fb(c[d]).test(b)&&(b+=\" \"+c[d]);\nreturn b}function jf(a){if(document.body.getElementsByClassName)for(var b=document.body.getElementsByClassName(\"CodeMirror\"),c=0;c<b.length;c++){var d=b[c].CodeMirror;d&&a(d)}}function tf(){var a;v(window,\"resize\",function(){null==a&&(a=setTimeout(function(){a=null;jf(If)},100))});v(window,\"blur\",function(){jf(db)})}function eg(a){if(null==yd){var b=t(\"span\",\"​\");U(a,t(\"span\",[b,document.createTextNode(\"x\")]));0!=a.firstChild.offsetHeight&&(yd=1>=b.offsetWidth&&2<b.offsetHeight&&!(B&&8>C))}a=yd?t(\"span\",\n\"​\"):t(\"span\",\" \",null,\"display: inline-block; width: 1px; margin-right: -1px\");a.setAttribute(\"cm-text\",\"\");return a}function Af(a,b,c,d){if(!a)return d(b,c,\"ltr\");for(var e=!1,f=0;f<a.length;++f){var g=a[f];if(g.from<c&&g.to>b||b==c&&g.to==b)d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?\"rtl\":\"ltr\"),e=!0}e||d(b,c,\"ltr\")}function dd(a){return a.level%2?a.to:a.from}function ed(a){return a.level%2?a.from:a.to}function ac(a){return(a=Y(a))?dd(a[0]):0}function bc(a){var b=Y(a);return b?ed(A(b)):a.text.length}\nfunction kf(a,b){var c=u(a.doc,b),d=ia(c);d!=c&&(b=F(d));d=(c=Y(d))?c[0].level%2?bc(d):ac(d):0;return r(b,d)}function lf(a,b){var c=kf(a,b.line),d=u(a.doc,c.line),e=Y(d);return e&&0!=e[0].level?c:(d=Math.max(0,d.text.search(/\\S/)),r(c.line,b.line==c.line&&b.ch<=d&&b.ch?0:d))}function Sb(a,b){vb=null;for(var c=0,d;c<a.length;++c){var e=a[c];if(e.from<b&&e.to>b)return c;if(e.from==b||e.to==b)if(null==d)d=c;else{var f;f=e.level;var g=a[d].level,h=a[0].level;f=f==h?!0:g==h?!1:f<g;if(f)return e.from!=\ne.to&&(vb=d),c;e.from!=e.to&&(vb=c);break}}return d}function zd(a,b,c,d){if(!d)return b+c;do b+=c;while(0<b&&tb(a.text.charAt(b)));return b}function gd(a,b,c,d){var e=Y(a);if(!e)return Oe(a,b,c,d);var f=Sb(e,b),g=e[f];for(b=zd(a,b,g.level%2?-c:c,d);;){if(b>g.from&&b<g.to)return b;if(b==g.from||b==g.to){if(Sb(e,b)==f)return b;g=e[f+c];return 0<c==g.level%2?g.to:g.from}g=e[f+=c];if(!g)return null;b=0<c==g.level%2?zd(a,g.to,-1,d):zd(a,g.from,1,d)}}function Oe(a,b,c,d){b+=c;if(d)for(;0<b&&tb(a.text.charAt(b));)b+=\nc;return 0>b||b>a.text.length?null:b}var wa=/gecko\\/\\d/i.test(navigator.userAgent),mf=/MSIE \\d/.test(navigator.userAgent),nf=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent),B=mf||nf,C=B&&(mf?document.documentMode||6:nf[1]),J=/WebKit\\//.test(navigator.userAgent),jg=J&&/Qt\\/\\d+\\.\\d+/.test(navigator.userAgent),kg=/Chrome\\//.test(navigator.userAgent),ba=/Opera\\//.test(navigator.userAgent),te=/Apple Computer/.test(navigator.vendor),lg=/Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(navigator.userAgent),\nGf=/PhantomJS/.test(navigator.userAgent),Qa=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\\/\\w+/.test(navigator.userAgent),ab=Qa||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),W=Qa||/Mac/.test(navigator.platform),mg=/win/i.test(navigator.platform),Ia=ba&&navigator.userAgent.match(/Version\\/(\\d*\\.\\d*)/);Ia&&(Ia=Number(Ia[1]));Ia&&15<=Ia&&(ba=!1,J=!0);var of=W&&(jg||ba&&(null==Ia||12.11>Ia)),id=wa||B&&9<=C,Ge=!1,ra=!1;Fc.prototype=V({update:function(a){var b=\na.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;c?(this.vert.style.display=\"block\",this.vert.style.bottom=b?d+\"px\":\"0\",this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+(a.viewHeight-(b?d:0)))+\"px\"):(this.vert.style.display=\"\",this.vert.firstChild.style.height=\"0\");b?(this.horiz.style.display=\"block\",this.horiz.style.right=c?d+\"px\":\"0\",this.horiz.style.left=a.barLeft+\"px\",this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+(a.viewWidth-\na.barLeft-(c?d:0))+\"px\"):(this.horiz.style.display=\"\",this.horiz.firstChild.style.width=\"0\");!this.checkedOverlay&&0<a.clientHeight&&(0==d&&this.overlayHack(),this.checkedOverlay=!0);return{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){this.horiz.style.minHeight=this.vert.style.minWidth=W&&!lg?\"12px\":\"18px\";var a=this,b=function(b){(b.target||\nb.srcElement)!=a.vert&&(b.target||b.srcElement)!=a.horiz&&G(a.cm,pe)(b)};v(this.vert,\"mousedown\",b);v(this.horiz,\"mousedown\",b)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz);a.removeChild(this.vert)}},Fc.prototype);Gc.prototype=V({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},Gc.prototype);q.scrollbarModel={\"native\":Fc,\"null\":Gc};Mb.prototype.signal=function(a,b){S(a,b)&&this.events.push(arguments)};Mb.prototype.finish=\nfunction(){for(var a=0;a<this.events.length;a++)K.apply(null,this.events[a])};var r=q.Pos=function(a,b){if(!(this instanceof r))return new r(a,b);this.line=a;this.ch=b},y=q.cmpPos=function(a,b){return a.line-b.line||a.ch-b.ch},X=null;Tc.prototype=V({init:function(a){function b(a){if(d.somethingSelected())X=d.getSelections(),c.inaccurateSelection&&(c.prevInput=\"\",c.inaccurateSelection=!1,f.value=X.join(\"\\n\"),Za(f));else if(d.options.lineWiseCopyCut){var b=Vd(d);X=b.text;\"cut\"==a.type?d.setSelections(b.ranges,\nnull,ha):(c.prevInput=\"\",f.value=b.text.join(\"\\n\"),Za(f))}else return;\"cut\"==a.type&&(d.state.cutIncoming=!0)}var c=this,d=this.cm,e=this.wrapper=Xd(),f=this.textarea=e.firstChild;a.wrapper.insertBefore(e,a.wrapper.firstChild);Qa&&(f.style.width=\"0px\");v(f,\"input\",function(){B&&9<=C&&c.hasSelection&&(c.hasSelection=null);c.poll()});v(f,\"paste\",function(){if(J&&!d.state.fakedLastChar&&!(200>new Date-d.state.lastMiddleDown)){var a=f.selectionStart,b=f.selectionEnd;f.value+=\"$\";f.selectionEnd=b;f.selectionStart=\na;d.state.fakedLastChar=!0}d.state.pasteIncoming=!0;c.fastPoll()});v(f,\"cut\",b);v(f,\"copy\",b);v(a.scroller,\"paste\",function(b){oa(a,b)||(d.state.pasteIncoming=!0,c.focus())});v(a.lineSpace,\"selectstart\",function(b){oa(a,b)||O(b)});v(f,\"compositionstart\",function(){var a=d.getCursor(\"from\");c.composing={start:a,range:d.markText(a,d.getCursor(\"to\"),{className:\"CodeMirror-composing\"})}});v(f,\"compositionend\",function(){c.composing&&(c.poll(),c.composing.range.clear(),c.composing=null)})},prepareSelection:function(){var a=\nthis.cm,b=a.display,c=a.doc,d=he(a);if(a.options.moveInputWithCursor){var a=ma(a,c.sel.primary().head,\"div\"),c=b.wrapper.getBoundingClientRect(),e=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,a.top+e.top-c.top));d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,a.left+e.left-c.left))}return d},showSelection:function(a){var b=this.cm.display;U(b.cursorDiv,a.cursors);U(b.selectionDiv,a.selection);null!=a.teTop&&(this.wrapper.style.top=a.teTop+\"px\",this.wrapper.style.left=\na.teLeft+\"px\")},reset:function(a){if(!this.contextMenuPending){var b,c,d=this.cm,e=d.doc;d.somethingSelected()?(this.prevInput=\"\",b=e.sel.primary(),c=(b=Ce&&(100<b.to().line-b.from().line||1E3<(c=d.getSelection()).length))?\"-\":c||d.getSelection(),this.textarea.value=c,d.state.focused&&Za(this.textarea),B&&9<=C&&(this.hasSelection=c)):a||(this.prevInput=this.textarea.value=\"\",B&&9<=C&&(this.hasSelection=null));this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return!1},\nfocus:function(){if(\"nocursor\"!=this.cm.options.readOnly&&(!ab||fa()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll();a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function a(){c.poll()||b?(c.pollingFast=!1,c.slowPoll()):(b=\n!0,c.polling.set(60,a))}var b=!1,c=this;c.pollingFast=!0;c.polling.set(20,a)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput;if(!a.state.focused||ng(b)&&!c||Rb(a)||a.options.disableInput||a.state.keySeq)return!1;a.state.pasteIncoming&&a.state.fakedLastChar&&(b.value=b.value.substring(0,b.value.length-1),a.state.fakedLastChar=!1);var d=b.value;if(d==c&&!a.somethingSelected())return!1;if(B&&9<=C&&this.hasSelection===d||W&&/[\\uf700-\\uf7ff]/.test(d))return a.display.input.reset(),!1;if(a.doc.sel==\na.display.selForContextMenu){var e=d.charCodeAt(0);8203!=e||c||(c=\"​\");if(8666==e)return this.reset(),this.cm.execCommand(\"undo\")}for(var f=0,e=Math.min(c.length,d.length);f<e&&c.charCodeAt(f)==d.charCodeAt(f);)++f;var g=this;T(a,function(){Sc(a,d.slice(f),c.length-f,null,g.composing?\"*compose\":null);1E3<d.length||-1<d.indexOf(\"\\n\")?b.value=g.prevInput=\"\":g.prevInput=d;g.composing&&(g.composing.range.clear(),g.composing.range=a.markText(g.composing.start,a.getCursor(\"to\"),{className:\"CodeMirror-composing\"}))});\nreturn!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){B&&9<=C&&(this.hasSelection=null);this.fastPoll()},onContextMenu:function(a){function b(){if(null!=g.selectionStart){var a=e.somethingSelected(),b=\"​\"+(a?g.value:\"\");g.value=\"⇚\";g.value=b;d.prevInput=a?\"\":\"​\";g.selectionStart=1;g.selectionEnd=b.length;f.selForContextMenu=e.doc.sel}}function c(){d.contextMenuPending=!1;d.wrapper.style.position=\"relative\";g.style.cssText=l;B&&9>C&&f.scrollbars.setScrollTop(f.scroller.scrollTop=\nk);if(null!=g.selectionStart){(!B||B&&9>C)&&b();var a=0,c=function(){f.selForContextMenu==e.doc.sel&&0==g.selectionStart&&0<g.selectionEnd&&\"​\"==d.prevInput?G(e,ic.selectAll)(e):10>a++?f.detectingSelectAll=setTimeout(c,500):f.input.reset()};f.detectingSelectAll=setTimeout(c,200)}}var d=this,e=d.cm,f=e.display,g=d.textarea,h=Ua(e,a),k=f.scroller.scrollTop;if(h&&!ba){e.options.resetSelectionOnContextMenu&&-1==e.doc.sel.contains(h)&&G(e,H)(e.doc,ga(h),ha);var l=g.style.cssText;d.wrapper.style.position=\n\"absolute\";g.style.cssText=\"position: fixed; width: 30px; height: 30px; top: \"+(a.clientY-5)+\"px; left: \"+(a.clientX-5)+\"px; z-index: 1000; background: \"+(B?\"rgba(255, 255, 255, .05)\":\"transparent\")+\"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity\\x3d5);\";if(J)var m=window.scrollY;f.input.focus();J&&window.scrollTo(null,m);f.input.reset();e.somethingSelected()||(g.value=d.prevInput=\" \");d.contextMenuPending=!0;f.selForContextMenu=e.doc.sel;clearTimeout(f.detectingSelectAll);\nB&&9<=C&&b();if(id){jd(a);var p=function(){ka(window,\"mouseup\",p);setTimeout(c,20)};v(window,\"mouseup\",p)}else setTimeout(c,50)}},setUneditable:Eb,needsContentAttribute:!1},Tc.prototype);Uc.prototype=V({init:function(a){function b(a){if(d.somethingSelected())X=d.getSelections(),\"cut\"==a.type&&d.replaceSelection(\"\",null,\"cut\");else if(d.options.lineWiseCopyCut){var b=Vd(d);X=b.text;\"cut\"==a.type&&d.operation(function(){d.setSelections(b.ranges,0,ha);d.replaceSelection(\"\",null,\"cut\")})}else return;\nif(a.clipboardData&&!Qa)a.preventDefault(),a.clipboardData.clearData(),a.clipboardData.setData(\"text/plain\",X.join(\"\\n\"));else{var c=Xd();a=c.firstChild;d.display.lineSpace.insertBefore(c,d.display.lineSpace.firstChild);a.value=X.join(\"\\n\");var h=document.activeElement;Za(a);setTimeout(function(){d.display.lineSpace.removeChild(c);h.focus()},50)}}var c=this,d=c.cm;a=c.div=a.lineDiv;a.contentEditable=\"true\";Wd(a);v(a,\"paste\",function(a){var b=a.clipboardData&&a.clipboardData.getData(\"text/plain\");\nb&&(a.preventDefault(),d.replaceSelection(b,null,\"paste\"))});v(a,\"compositionstart\",function(a){a=a.data;c.composing={sel:d.doc.sel,data:a,startData:a};if(a){var b=d.doc.sel.primary(),g=d.getLine(b.head.line).indexOf(a,Math.max(0,b.head.ch-a.length));-1<g&&g<=b.head.ch&&(c.composing.sel=ga(r(b.head.line,g),r(b.head.line,g+a.length)))}});v(a,\"compositionupdate\",function(a){c.composing.data=a.data});v(a,\"compositionend\",function(a){var b=c.composing;b&&(a.data==b.startData||/\\u200b/.test(a.data)||(b.data=\na.data),setTimeout(function(){b.handled||c.applyComposition(b);c.composing==b&&(c.composing=null)},50))});v(a,\"touchstart\",function(){c.forceCompositionEnd()});v(a,\"input\",function(){c.composing||c.pollContent()||T(c.cm,function(){Q(d)})});v(a,\"copy\",b);v(a,\"cut\",b)},prepareSelection:function(){var a=he(this.cm,!1);a.focus=this.cm.state.focused;return a},showSelection:function(a){a&&this.cm.display.view.length&&(a.focus&&this.showPrimarySelection(),this.showMultipleSelections(a))},showPrimarySelection:function(){var a=\nwindow.getSelection(),b=this.cm.doc.sel.primary(),c=Tb(this.cm,a.anchorNode,a.anchorOffset),d=Tb(this.cm,a.focusNode,a.focusOffset);if(!c||c.bad||!d||d.bad||0!=y(Qb(c,d),b.from())||0!=y(Pb(c,d),b.to()))if(c=Yd(this.cm,b.from()),d=Yd(this.cm,b.to()),c||d){var e=this.cm.display.view,b=a.rangeCount&&a.getRangeAt(0);c?d||(d=e[e.length-1].measure,d=d.maps?d.maps[d.maps.length-1]:d.map,d={node:d[d.length-1],offset:d[d.length-2]-d[d.length-3]}):c={node:e[0].measure.map[2],offset:0};try{var f=Ea(c.node,c.offset,\nd.offset,d.node)}catch(g){}f&&(a.removeAllRanges(),a.addRange(f),b&&null==a.anchorNode?a.addRange(b):wa&&this.startGracePeriod());this.rememberSelection()}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod);this.gracePeriod=setTimeout(function(){a.gracePeriod=!1;a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(a){U(this.cm.display.cursorDiv,a.cursors);U(this.cm.display.selectionDiv,a.selection)},rememberSelection:function(){var a=\nwindow.getSelection();this.lastAnchorNode=a.anchorNode;this.lastAnchorOffset=a.anchorOffset;this.lastFocusNode=a.focusNode;this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return!1;a=a.getRangeAt(0).commonAncestorContainer;return Wc(this.div,a)},focus:function(){\"nocursor\"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function a(){b.cm.state.focused&&\n(b.pollSelection(),b.polling.set(b.cm.options.pollInterval,a))}var b=this;this.selectionInEditor()?this.pollSelection():T(this.cm,function(){b.cm.curOp.selectionChanged=!0});this.polling.set(this.cm.options.pollInterval,a)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var a=\nwindow.getSelection(),b=this.cm;this.rememberSelection();var c=Tb(b,a.anchorNode,a.anchorOffset),d=Tb(b,a.focusNode,a.focusOffset);c&&d&&T(b,function(){H(b.doc,ga(c,d),ha);if(c.bad||d.bad)b.curOp.selectionChanged=!0})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),c=c.to();if(d.line<b.viewFrom||c.line>b.viewTo-1)return!1;var e;d.line==b.viewFrom||0==(e=Ca(a,d.line))?(d=F(b.view[0].line),e=b.view[0].node):(d=F(b.view[e].line),e=b.view[e-1].node.nextSibling);var f=\nCa(a,c.line);f==b.view.length-1?(c=b.viewTo-1,b=b.view[f].node):(c=F(b.view[f+1].line)-1,b=b.view[f+1].node.previousSibling);b=sa(xf(a,e,b,d,c));for(e=Da(a.doc,r(d,0),r(c,u(a.doc,c).text.length));1<b.length&&1<e.length;)if(A(b)==A(e))b.pop(),e.pop(),c--;else if(b[0]==e[0])b.shift(),e.shift(),d++;else break;for(var g=0,f=0,h=b[0],k=e[0],l=Math.min(h.length,k.length);g<l&&h.charCodeAt(g)==k.charCodeAt(g);)++g;h=A(b);k=A(e);for(l=Math.min(h.length-(1==b.length?g:0),k.length-(1==e.length?g:0));f<l&&h.charCodeAt(h.length-\nf-1)==k.charCodeAt(k.length-f-1);)++f;b[b.length-1]=h.slice(0,h.length-f);b[0]=b[0].slice(g);d=r(d,g);c=r(c,e.length?A(e).length-f:0);if(1<b.length||b[0]||y(d,c))return wb(a.doc,b,d,c,\"+input\"),!0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(a){a.data&&\na.data!=a.startData&&G(this.cm,Sc)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.setAttribute(\"contenteditable\",\"false\")},onKeyPress:function(a){a.preventDefault();G(this.cm,Sc)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0)},onContextMenu:Eb,resetPosition:Eb,needsContentAttribute:!0},Uc.prototype);q.inputStyles={textarea:Tc,contenteditable:Uc};la.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=\nthis.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(0!=y(c.anchor,d.anchor)||0!=y(c.head,d.head))return!1}return!0},deepCopy:function(){for(var a=[],b=0;b<this.ranges.length;b++)a[b]=new z(Rc(this.ranges[b].anchor),Rc(this.ranges[b].head));return new la(a,this.primIndex)},somethingSelected:function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;return!1},contains:function(a,b){b||(b=a);\nfor(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(0<=y(b,d.from())&&0>=y(a,d.to()))return c}return-1}};z.prototype={from:function(){return Qb(this.anchor,this.head)},to:function(){return Pb(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var ad={left:0,right:0,top:0,bottom:0},Fa,Ta=null,Ff=0,fc,ec,se=0,gc=0,R=null;B?R=-.53:wa?R=15:kg?R=-.7:te&&(R=-1/3);var ze=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;null==b&&a.detail&&\na.axis==a.HORIZONTAL_AXIS&&(b=a.detail);null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta);return{x:b,y:c}};q.wheelEventPixels=function(a){a=ze(a);a.x*=R;a.y*=R;return a};var Qf=new bb,md=null,ta=q.changeEnd=function(a){return a.text?r(a.from.line+a.text.length-1,A(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};q.prototype={constructor:q,focus:function(){window.focus();this.display.input.focus()},setOption:function(a,b){var c=this.options,d=c[a];if(c[a]!=b||\"mode\"==\na)c[a]=b,Ka.hasOwnProperty(a)&&G(this,Ka[a])(this,b,d)},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?\"push\":\"unshift\"](pc(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:M(function(a,b){var c=a.token?a:q.getMode(this.options,a);if(c.startState)throw Error(\"Overlays may not be stateful.\");this.state.overlays.push({mode:c,modeSpec:a,\nopaque:b&&b.opaque});this.state.modeGen++;Q(this)}),removeOverlay:M(function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||\"string\"==typeof a&&d.name==a){b.splice(c,1);this.state.modeGen++;Q(this);break}}}),indentLine:M(function(a,b,c){\"string\"!=typeof b&&\"number\"!=typeof b&&(b=null==b?this.options.smartIndent?\"smart\":\"prev\":b?\"add\":\"subtract\");qb(this.doc,a)&&pb(this,a,b,c)}),indentSelection:M(function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=\nb[d];if(e.empty())e.head.line>c&&(pb(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&Pa(this));else{for(var f=e.from(),e=e.to(),g=Math.max(c,f.line),c=Math.min(this.lastLine(),e.line-(e.ch?0:1))+1,e=g;e<c;++e)pb(this,e,a);e=this.doc.sel.ranges;0==f.ch&&b.length==e.length&&0<e[d].from().ch&&Xc(this.doc,d,new z(f,e[d].to()),ha)}}}),getTokenAt:function(a,b){return Ye(this,a,b)},getLineTokens:function(a,b){return Ye(this,r(a),b,!0)},getTokenTypeAt:function(a){a=w(this.doc,a);var b=$e(this,\nu(this.doc,a.line)),c=0,d=(b.length-1)/2;a=a.ch;if(0==a)b=b[2];else for(;;){var e=c+d>>1;if((e?b[2*e-1]:0)>=a)d=e;else if(b[2*e+1]<a)c=e+1;else{b=b[2*e+2];break}}c=b?b.indexOf(\"cm-overlay \"):-1;return 0>c?b:0==c?null:b.slice(0,c-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?q.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!$a.hasOwnProperty(b))return c;var d=$a[b],e=this.getModeAt(a);if(\"string\"==\ntypeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;f<e[b].length;f++){var g=d[e[b][f]];g&&c.push(g)}else e.helperType&&d[e.helperType]?c.push(d[e.helperType]):d[e.name]&&c.push(d[e.name]);for(f=0;f<d._global.length;f++)g=d._global[f],g.pred(e,this)&&-1==D(c,g.val)&&c.push(g.val);return c},getStateAfter:function(a,b){var c=this.doc;a=Math.max(c.first,Math.min(null==a?c.first+c.size-1:a,c.first+c.size-1));return sb(this,a+1,b)},cursorCoords:function(a,b){var c;c=this.doc.sel.primary();c=\nnull==a?c.head:\"object\"==typeof a?w(this.doc,a):a?c.from():c.to();return ma(this,c,b||\"page\")},charCoords:function(a,b){return Yb(this,w(this.doc,a),b||\"page\")},coordsChar:function(a,b){a=ne(this,a,b||\"page\");return fd(this,a.left,a.top)},lineAtHeight:function(a,b){a=ne(this,{top:a,left:0},b||\"page\").top;return Ba(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b){var c=!1,d;\"number\"==typeof a?(d=this.doc.first+this.doc.size-1,a<this.doc.first?a=this.doc.first:a>d&&(a=d,c=!0),d=u(this.doc,\na)):d=a;return cd(this,d,{top:0,left:0},b||\"page\").top+(c?this.doc.height-ea(d):0)},defaultTextHeight:function(){return xa(this.display)},defaultCharWidth:function(){return gb(this.display)},setGutterMarker:M(function(a,b,c){return nc(this.doc,a,\"gutter\",function(a){var e=a.gutterMarkers||(a.gutterMarkers={});e[b]=c;!c&&hf(e)&&(a.gutterMarkers=null);return!0})}),clearGutter:M(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,\nna(b,d,\"gutter\"),hf(c.gutterMarkers)&&(c.gutterMarkers=null));++d})}),lineInfo:function(a){if(\"number\"==typeof a){if(!qb(this.doc,a))return null;var b=a;a=u(this.doc,a);if(!a)return null}else if(b=F(a),null==b)return null;return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=\nma(this,w(this.doc,a));var g=a.bottom,h=a.left;b.style.position=\"absolute\";b.setAttribute(\"cm-ignore-events\",\"true\");this.display.input.setUneditable(b);f.sizer.appendChild(b);if(\"over\"==d)g=a.top;else if(\"above\"==d||\"near\"==d){var k=Math.max(f.wrapper.clientHeight,this.doc.height),l=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);(\"above\"==d||a.bottom+b.offsetHeight>k)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=k&&(g=a.bottom);h+b.offsetWidth>l&&(h=l-b.offsetWidth)}b.style.top=\ng+\"px\";b.style.left=b.style.right=\"\";\"right\"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right=\"0px\"):(\"left\"==e?h=0:\"middle\"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+\"px\");c&&(a=cc(this,h,g,h+b.offsetWidth,g+b.offsetHeight),null!=a.scrollTop&&lb(this,a.scrollTop),null!=a.scrollLeft&&Ma(this,a.scrollLeft))},triggerOnKeyDown:M(ve),triggerOnKeyPress:M(we),triggerOnKeyUp:ue,execCommand:function(a){if(ic.hasOwnProperty(a))return ic[a](this)},findPosH:function(a,b,c,d){var e=1;\n0>b&&(e=-1,b=-b);var f=0;for(a=w(this.doc,a);f<b&&(a=rd(this.doc,a,e,c,d),!a.hitSide);++f);return a},moveH:M(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?rd(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Gb)}),deleteH:M(function(a,b){var c=this.doc;this.doc.sel.somethingSelected()?c.replaceSelection(\"\",null,\"+delete\"):Va(this,function(d){var e=rd(c,d.head,a,b,!1);return 0>a?{from:e,to:d.head}:{from:d.head,to:e}})}),findPosV:function(a,\nb,c,d){var e=1;0>b&&(e=-1,b=-b);var f=0;for(a=w(this.doc,a);f<b&&(a=ma(this,a,\"div\"),null==d?d=a.left:a.left=d,a=Pe(this,a,e,c),!a.hitSide);++f);return a},moveV:M(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var k=ma(c,g.head,\"div\");null!=g.goalColumn&&(k.left=g.goalColumn);e.push(k.left);var l=Pe(c,k,a,b);\"page\"==b&&g==d.sel.primary()&&lc(c,null,Yb(c,l,\"div\").top-k.top);return l},\nGb);if(e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]}),findWordAt:function(a){var b=u(this.doc,a.line).text,c=a.ch,d=a.ch;if(b){var e=this.getHelper(a,\"wordChars\");(0>a.xRel||d==b.length)&&c?--c:++d;for(var f=b.charAt(c),f=oc(f,e)?function(a){return oc(a,e)}:/\\s/.test(f)?function(a){return/\\s/.test(a)}:function(a){return!/\\s/.test(a)&&!oc(a)};0<c&&f(b.charAt(c-1));)--c;for(;d<b.length&&f(b.charAt(d));)++d}return new z(r(a.line,c),r(a.line,d))},toggleOverwrite:function(a){if(null==\na||a!=this.state.overwrite)(this.state.overwrite=!this.state.overwrite)?mb(this.display.cursorDiv,\"CodeMirror-overwrite\"):kb(this.display.cursorDiv,\"CodeMirror-overwrite\"),K(this,\"overwriteToggle\",this,this.state.overwrite)},hasFocus:function(){return this.display.input.getField()==fa()},scrollTo:M(function(a,b){null==a&&null==b||mc(this);null!=a&&(this.curOp.scrollLeft=a);null!=b&&(this.curOp.scrollTop=b)}),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,\nheight:a.scrollHeight-da(this)-this.display.barHeight,width:a.scrollWidth-da(this)-this.display.barWidth,clientHeight:Nc(this),clientWidth:pa(this)}},scrollIntoView:M(function(a,b){null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):\"number\"==typeof a?a={from:r(a,0),to:null}:null==a.from&&(a={from:a,to:null});a.to||(a.to=a.from);a.margin=b||0;if(null!=a.from.line)mc(this),this.curOp.scrollToPos=a;else{var c=cc(this,Math.min(a.from.left,a.to.left),Math.min(a.from.top,\na.to.top)-a.margin,Math.max(a.from.right,a.to.right),Math.max(a.from.bottom,a.to.bottom)+a.margin);this.scrollTo(c.scrollLeft,c.scrollTop)}}),setSize:M(function(a,b){function c(a){return\"number\"==typeof a||/^\\d+$/.test(String(a))?a+\"px\":a}var d=this;null!=a&&(d.display.wrapper.style.width=c(a));null!=b&&(d.display.wrapper.style.height=c(b));d.options.lineWrapping&&me(this);var e=d.display.viewFrom;d.doc.iter(e,d.display.viewTo,function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){na(d,\ne,\"widget\");break}++e});d.curOp.forceUpdate=!0;K(d,\"refresh\",this)}),operation:function(a){return T(this,a)},refresh:M(function(){var a=this.display.cachedTextHeight;Q(this);this.curOp.forceUpdate=!0;hb(this);this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop);Cc(this);(null==a||.5<Math.abs(a-xa(this.display)))&&Ac(this);K(this,\"refresh\",this)}),swapDoc:M(function(a){var b=this.doc;b.cm=null;Ed(this,a);hb(this);this.display.input.reset();this.scrollTo(a.scrollLeft,a.scrollTop);this.curOp.forceScroll=\n!0;L(this,\"swapDoc\",this,b);return b}),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}};Ya(q);var qf=q.defaults={},Ka=q.optionHandlers={},Fd=q.Init={toString:function(){return\"CodeMirror.Init\"}};x(\"value\",\"\",function(a,b){a.setValue(b)},!0);x(\"mode\",null,function(a,b){a.doc.modeOption=b;zc(a)},!0);x(\"indentUnit\",\n2,zc,!0);x(\"indentWithTabs\",!1);x(\"smartIndent\",!0);x(\"tabSize\",4,function(a){eb(a);hb(a);Q(a)},!0);x(\"specialChars\",/[\\t\\u0000-\\u0019\\u00ad\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g,function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test(\"\\t\")?\"\":\"|\\t\"),\"g\");c!=q.Init&&a.refresh()});x(\"specialCharPlaceholder\",function(a){var b=t(\"span\",\"•\",\"cm-invalidchar\");b.title=\"\\\\u\"+a.charCodeAt(0).toString(16);b.setAttribute(\"aria-label\",b.title);return b},function(a){a.refresh()},!0);x(\"electricChars\",!0);\nx(\"inputStyle\",ab?\"contenteditable\":\"textarea\",function(){throw Error(\"inputStyle can not (yet) be changed in a running editor\");},!0);x(\"rtlMoveVisually\",!mg);x(\"wholeLineUpdateBefore\",!0);x(\"theme\",\"default\",function(a){Bd(a);ib(a)},!0);x(\"keyMap\",\"default\",function(a,b,c){b=pc(b);(c=c!=q.Init&&pc(c))&&c.detach&&c.detach(a,b);b.attach&&b.attach(a,c||null)});x(\"extraKeys\",null);x(\"lineWrapping\",!1,function(a){a.options.lineWrapping?(mb(a.display.wrapper,\"CodeMirror-wrap\"),a.display.sizer.style.minWidth=\n\"\",a.display.sizerWidth=null):(kb(a.display.wrapper,\"CodeMirror-wrap\"),Dc(a));Ac(a);Q(a);hb(a);setTimeout(function(){Na(a)},100)},!0);x(\"gutters\",[],function(a){wc(a.options);ib(a)},!0);x(\"fixedGutter\",!0,function(a,b){a.display.gutters.style.left=b?Ic(a.display)+\"px\":\"0\";a.refresh()},!0);x(\"coverGutterNextToScrollbar\",!1,function(a){Na(a)},!0);x(\"scrollbarStyle\",\"native\",function(a){Cd(a);Na(a);a.display.scrollbars.setScrollTop(a.doc.scrollTop);a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},\n!0);x(\"lineNumbers\",!1,function(a){wc(a.options);ib(a)},!0);x(\"firstLineNumber\",1,ib,!0);x(\"lineNumberFormatter\",function(a){return a},ib,!0);x(\"showCursorWhenSelecting\",!1,nb,!0);x(\"resetSelectionOnContextMenu\",!0);x(\"lineWiseCopyCut\",!0);x(\"readOnly\",!1,function(a,b){\"nocursor\"==b?(db(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||a.display.input.reset())});x(\"disableInput\",!1,function(a,b){b||a.display.input.reset()},!0);x(\"dragDrop\",!0,function(a,b,c){!b!=!(c&&c!=q.Init)&&\n(c=a.display.dragFunctions,b=b?v:ka,b(a.display.scroller,\"dragstart\",c.start),b(a.display.scroller,\"dragenter\",c.simple),b(a.display.scroller,\"dragover\",c.simple),b(a.display.scroller,\"drop\",c.drop))});x(\"cursorBlinkRate\",530);x(\"cursorScrollMargin\",0);x(\"cursorHeight\",1,nb,!0);x(\"singleCursorHeightPerLine\",!0,nb,!0);x(\"workTime\",100);x(\"workDelay\",100);x(\"flattenSpans\",!0,eb,!0);x(\"addModeClass\",!1,eb,!0);x(\"pollInterval\",100);x(\"undoDepth\",200,function(a,b){a.doc.history.undoDepth=b});x(\"historyEventDelay\",\n1250);x(\"viewportMargin\",10,function(a){a.refresh()},!0);x(\"maxHighlightLength\",1E4,eb,!0);x(\"moveInputWithCursor\",!0,function(a,b){b||a.display.input.resetPosition()});x(\"tabindex\",null,function(a,b){a.display.input.getField().tabIndex=b||\"\"});x(\"autofocus\",null);var pf=q.modes={},Hb=q.mimeModes={};q.defineMode=function(a,b){q.defaults.mode||\"null\"==a||(q.defaults.mode=a);2<arguments.length&&(b.dependencies=Array.prototype.slice.call(arguments,2));pf[a]=b};q.defineMIME=function(a,b){Hb[a]=b};q.resolveMode=\nfunction(a){if(\"string\"==typeof a&&Hb.hasOwnProperty(a))a=Hb[a];else if(a&&\"string\"==typeof a.name&&Hb.hasOwnProperty(a.name)){var b=Hb[a.name];\"string\"==typeof b&&(b={name:b});a=ff(b,a);a.name=b.name}else if(\"string\"==typeof a&&/^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(a))return q.resolveMode(\"application/xml\");return\"string\"==typeof a?{name:a}:a||{name:\"null\"}};q.getMode=function(a,b){b=q.resolveMode(b);var c=pf[b.name];if(!c)return q.getMode(a,\"text/plain\");c=c(a,b);if(Ib.hasOwnProperty(b.name)){var d=Ib[b.name],\ne;for(e in d)d.hasOwnProperty(e)&&(c.hasOwnProperty(e)&&(c[\"_\"+e]=c[e]),c[e]=d[e])}c.name=b.name;b.helperType&&(c.helperType=b.helperType);if(b.modeProps)for(e in b.modeProps)c[e]=b.modeProps[e];return c};q.defineMode(\"null\",function(){return{token:function(a){a.skipToEnd()}}});q.defineMIME(\"text/plain\",\"null\");var Ib=q.modeExtensions={};q.extendMode=function(a,b){var c=Ib.hasOwnProperty(a)?Ib[a]:Ib[a]={};V(b,c)};q.defineExtension=function(a,b){q.prototype[a]=b};q.defineDocExtension=function(a,b){P.prototype[a]=\nb};q.defineOption=x;var yc=[];q.defineInitHook=function(a){yc.push(a)};var $a=q.helpers={};q.registerHelper=function(a,b,c){$a.hasOwnProperty(a)||($a[a]=q[a]={_global:[]});$a[a][b]=c};q.registerGlobalHelper=function(a,b,c,d){q.registerHelper(a,b,d);$a[a]._global.push({pred:c,val:d})};var Sa=q.copyState=function(a,b){if(!0===b)return b;if(a.copyState)return a.copyState(b);var c={},d;for(d in b){var e=b[d];e instanceof Array&&(e=e.concat([]));c[d]=e}return c},Df=q.startState=function(a,b,c){return a.startState?\na.startState(b,c):!0};q.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state;a=c.mode}return c||{mode:a,state:b}};var ic=q.commands={selectAll:function(a){a.setSelection(r(a.firstLine(),0),r(a.lastLine()),ha)},singleSelection:function(a){a.setSelection(a.getCursor(\"anchor\"),a.getCursor(\"head\"),ha)},killLine:function(a){Va(a,function(b){if(b.empty()){var c=u(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:r(b.head.line+\n1,0)}:{from:b.head,to:r(b.head.line,c)}}return{from:b.from(),to:b.to()}})},deleteLine:function(a){Va(a,function(b){return{from:r(b.from().line,0),to:w(a.doc,r(b.to().line+1,0))}})},delLineLeft:function(a){Va(a,function(a){return{from:r(a.from().line,0),to:a.from()}})},delWrappedLineLeft:function(a){Va(a,function(b){var c=a.charCoords(b.head,\"div\").top+5;return{from:a.coordsChar({left:0,top:c},\"div\"),to:b.from()}})},delWrappedLineRight:function(a){Va(a,function(b){var c=a.charCoords(b.head,\"div\").top+\n5,c=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},\"div\");return{from:b.from(),to:c}})},undo:function(a){a.undo()},redo:function(a){a.redo()},undoSelection:function(a){a.undoSelection()},redoSelection:function(a){a.redoSelection()},goDocStart:function(a){a.extendSelection(r(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(r(a.lastLine()))},goLineStart:function(a){a.extendSelectionsBy(function(b){return kf(a,b.head.line)},{origin:\"+move\",bias:1})},goLineStartSmart:function(a){a.extendSelectionsBy(function(b){return lf(a,\nb.head)},{origin:\"+move\",bias:1})},goLineEnd:function(a){a.extendSelectionsBy(function(b){b=b.head.line;for(var c,d=u(a.doc,b);c=Aa(d,!1);)d=c.find(1,!0).line,b=null;c=(c=Y(d))?c[0].level%2?ac(d):bc(d):d.text.length;return r(null==b?F(d):b,c)},{origin:\"+move\",bias:-1})},goLineRight:function(a){a.extendSelectionsBy(function(b){b=a.charCoords(b.head,\"div\").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:b},\"div\")},Gb)},goLineLeft:function(a){a.extendSelectionsBy(function(b){b=\na.charCoords(b.head,\"div\").top+5;return a.coordsChar({left:0,top:b},\"div\")},Gb)},goLineLeftSmart:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,\"div\").top+5,c=a.coordsChar({left:0,top:c},\"div\");return c.ch<a.getLine(c.line).search(/\\S/)?lf(a,b.head):c},Gb)},goLineUp:function(a){a.moveV(-1,\"line\")},goLineDown:function(a){a.moveV(1,\"line\")},goPageUp:function(a){a.moveV(-1,\"page\")},goPageDown:function(a){a.moveV(1,\"page\")},goCharLeft:function(a){a.moveH(-1,\"char\")},goCharRight:function(a){a.moveH(1,\n\"char\")},goColumnLeft:function(a){a.moveH(-1,\"column\")},goColumnRight:function(a){a.moveH(1,\"column\")},goWordLeft:function(a){a.moveH(-1,\"word\")},goGroupRight:function(a){a.moveH(1,\"group\")},goGroupLeft:function(a){a.moveH(-1,\"group\")},goWordRight:function(a){a.moveH(1,\"word\")},delCharBefore:function(a){a.deleteH(-1,\"char\")},delCharAfter:function(a){a.deleteH(1,\"char\")},delWordBefore:function(a){a.deleteH(-1,\"word\")},delWordAfter:function(a){a.deleteH(1,\"word\")},delGroupBefore:function(a){a.deleteH(-1,\n\"group\")},delGroupAfter:function(a){a.deleteH(1,\"group\")},indentAuto:function(a){a.indentSelection(\"smart\")},indentMore:function(a){a.indentSelection(\"add\")},indentLess:function(a){a.indentSelection(\"subtract\")},insertTab:function(a){a.replaceSelection(\"\\t\")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),f=aa(a.getLine(f.line),f.ch,d);b.push(Array(d-f%d+1).join(\" \"))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?\na.indentSelection(\"add\"):a.execCommand(\"insertTab\")},transposeChars:function(a){T(a,function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++){var e=b[d].head,f=u(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new r(e.line,e.ch-1)),0<e.ch)e=new r(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),r(e.line,e.ch-2),e,\"+transpose\");else if(e.line>a.doc.first){var g=u(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+\"\\n\"+g.charAt(g.length-1),r(e.line-1,g.length-1),r(e.line,1),\"+transpose\")}c.push(new z(e,\ne))}a.setSelections(c)})},newlineAndIndent:function(a){T(a,function(){for(var b=a.listSelections().length,c=0;c<b;c++){var d=a.listSelections()[c];a.replaceRange(\"\\n\",d.anchor,d.head,\"+input\");a.indentLine(d.from().line+1,null,!0);Pa(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},ua=q.keyMap={};ua.basic={Left:\"goCharLeft\",Right:\"goCharRight\",Up:\"goLineUp\",Down:\"goLineDown\",End:\"goLineEnd\",Home:\"goLineStartSmart\",PageUp:\"goPageUp\",PageDown:\"goPageDown\",Delete:\"delCharAfter\",Backspace:\"delCharBefore\",\n\"Shift-Backspace\":\"delCharBefore\",Tab:\"defaultTab\",\"Shift-Tab\":\"indentAuto\",Enter:\"newlineAndIndent\",Insert:\"toggleOverwrite\",Esc:\"singleSelection\"};ua.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\",\n\"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\"};ua.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\",\n\"Ctrl-D\":\"delCharAfter\",\"Ctrl-H\":\"delCharBefore\",\"Alt-D\":\"delWordAfter\",\"Alt-Backspace\":\"delWordBefore\",\"Ctrl-K\":\"killLine\",\"Ctrl-T\":\"transposeChars\"};ua.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\",\n\"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\"]};ua[\"default\"]=W?ua.macDefault:ua.pcDefault;q.normalizeKeyMap=function(a){var b={},c;for(c in a)if(a.hasOwnProperty(c)){var d=\na[c];if(!/^(name|fallthrough|(de|at)tach)$/.test(c)){if(\"...\"!=d)for(var e=ob(c.split(\" \"),Wf),f=0;f<e.length;f++){var g,h;f==e.length-1?(h=c,g=d):(h=e.slice(0,f+1).join(\" \"),g=\"...\");var k=b[h];if(!k)b[h]=g;else if(k!=g)throw Error(\"Inconsistent bindings for \"+h);}delete a[c]}}for(var l in b)a[l]=b[l];return a};var xb=q.lookupKey=function(a,b,c,d){b=pc(b);var e=b.call?b.call(a,d):b[a];if(!1===e)return\"nothing\";if(\"...\"===e)return\"multi\";if(null!=e&&c(e))return\"handled\";if(b.fallthrough){if(\"[object Array]\"!=\nObject.prototype.toString.call(b.fallthrough))return xb(a,b.fallthrough,c,d);for(e=0;e<b.fallthrough.length;e++){var f=xb(a,b.fallthrough[e],c,d);if(f)return f}}},Pf=q.isModifierKey=function(a){a=\"string\"==typeof a?a:va[a.keyCode];return\"Ctrl\"==a||\"Alt\"==a||\"Shift\"==a||\"Mod\"==a},Rf=q.keyName=function(a,b){if(ba&&34==a.keyCode&&a[\"char\"])return!1;var c=va[a.keyCode],d=c;if(null==d||a.altGraphKey)return!1;a.altKey&&\"Alt\"!=c&&(d=\"Alt-\"+d);(of?a.metaKey:a.ctrlKey)&&\"Ctrl\"!=c&&(d=\"Ctrl-\"+d);(of?a.ctrlKey:\na.metaKey)&&\"Cmd\"!=c&&(d=\"Cmd-\"+d);!b&&a.shiftKey&&\"Shift\"!=c&&(d=\"Shift-\"+d);return d};q.fromTextArea=function(a,b){function c(){a.value=k.getValue()}b=b?V(b):{};b.value=a.value;!b.tabindex&&a.tabIndex&&(b.tabindex=a.tabIndex);!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder);if(null==b.autofocus){var d=fa();b.autofocus=d==a||null!=a.getAttribute(\"autofocus\")&&d==document.body}if(a.form&&(v(a.form,\"submit\",c),!b.leaveSubmitMethodAlone)){var e=a.form,f=e.submit;try{var g=e.submit=function(){c();\ne.submit=f;e.submit();e.submit=g}}catch(h){}}b.finishInit=function(b){b.save=c;b.getTextArea=function(){return a};b.toTextArea=function(){b.toTextArea=isNaN;c();a.parentNode.removeChild(b.getWrapperElement());a.style.display=\"\";a.form&&(ka(a.form,\"submit\",c),\"function\"==typeof a.form.submit&&(a.form.submit=f))}};a.style.display=\"none\";var k=q(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return k};var tc=q.StringStream=function(a,b){this.pos=this.start=0;this.string=a;this.tabSize=b||\n8;this.lineStart=this.lastColumnPos=this.lastColumnValue=0};tc.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(a){var b=this.string.charAt(this.pos);if(\"string\"==typeof a?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>\nb},eatSpace:function(){for(var a=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);if(-1<a)return this.pos=a,!0},backUp:function(a){this.pos-=a},column:function(){this.lastColumnPos<this.start&&(this.lastColumnValue=aa(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start);return this.lastColumnValue-(this.lineStart?\naa(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return aa(this.string,null,this.tabSize)-(this.lineStart?aa(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,c){if(\"string\"==typeof a){var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);if(d(e)==d(a))return!1!==b&&(this.pos+=a.length),!0}else{if((a=this.string.slice(this.pos).match(a))&&0<a.index)return null;a&&!1!==b&&(this.pos+=a[0].length);return a}},current:function(){return this.string.slice(this.start,\nthis.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var sd=0,Ha=q.TextMarker=function(a,b){this.lines=[];this.type=b;this.doc=a;this.id=++sd};Ya(Ha);Ha.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;b&&Ja(a);if(S(this,\"clear\")){var c=this.find();c&&L(this,\"clear\",c.from,c.to)}for(var d=c=null,e=0;e<this.lines.length;++e){var f=this.lines[e],g=zb(f.markedSpans,this);a&&!this.collapsed?na(a,F(f),\"text\"):a&&(null!=\ng.to&&(d=F(f)),null!=g.from&&(c=F(f)));for(var h=f,k=f.markedSpans,l=g,m=void 0,p=0;p<k.length;++p)k[p]!=l&&(m||(m=[])).push(k[p]);h.markedSpans=m;null==g.from&&this.collapsed&&!ya(this.doc,f)&&a&&ca(f,xa(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(e=0;e<this.lines.length;++e)f=ia(this.lines[e]),g=Kb(f),g>a.display.maxLineLength&&(a.display.maxLine=f,a.display.maxLineLength=g,a.display.maxLineChanged=!0);null!=c&&a&&this.collapsed&&Q(a,c,d+1);this.lines.length=0;this.explicitlyCleared=\n!0;this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&ge(a.doc));a&&L(a,\"markerCleared\",a,this);b&&La(a);this.parent&&this.parent.clear()}};Ha.prototype.find=function(a,b){null==a&&\"bookmark\"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=zb(f.markedSpans,this);if(null!=g.from&&(c=r(b?f:F(f),g.from),-1==a))return c;if(null!=g.to&&(d=r(b?f:F(f),g.to),1==a))return d}return c&&{from:c,to:d}};Ha.prototype.changed=function(){var a=this.find(-1,!0),b=this,c=this.doc.cm;\na&&c&&T(c,function(){var d=a.line,e=F(a.line);if(e=Vc(c,e))le(e),c.curOp.selectionChanged=c.curOp.forceUpdate=!0;c.curOp.updateMaxLine=!0;ya(b.doc,d)||null==b.height||(e=b.height,b.height=null,(e=ub(b)-e)&&ca(d,d.height+e))})};Ha.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=D(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)};Ha.prototype.detachLine=function(a){this.lines.splice(D(this.lines,\na),1);!this.lines.length&&this.doc.cm&&(a=this.doc.cm.curOp,(a.maybeHiddenMarkers||(a.maybeHiddenMarkers=[])).push(this))};var sd=0,rc=q.SharedTextMarker=function(a,b){this.markers=a;this.primary=b;for(var c=0;c<a.length;++c)a[c].parent=this};Ya(rc);rc.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();L(this,\"clear\")}};rc.prototype.find=function(a,b){return this.primary.find(a,b)};var sc=q.LineWidget=function(a,\nb,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.doc=a;this.node=b};Ya(sc);sc.prototype.clear=function(){var a=this.doc.cm,b=this.line.widgets,c=this.line,d=F(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=ub(this);ca(c,Math.max(0,c.height-f));a&&T(a,function(){var b=-f;ea(c)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&lc(a,null,b);na(a,d,\"widget\")})}};sc.prototype.changed=function(){var a=this.height,b=this.doc.cm,c=this.line;\nthis.height=null;var d=ub(this)-a;d&&(ca(c,c.height+d),b&&T(b,function(){b.curOp.forceUpdate=!0;ea(c)<(b.curOp&&b.curOp.scrollTop||b.doc.scrollTop)&&lc(b,null,d)}))};var Ab=q.Line=function(a,b,c){this.text=a;Ue(this,b);this.height=c?c(this):1};Ya(Ab);Ab.prototype.lineNo=function(){return F(this)};var bg={},ag={};Bb.prototype={chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;c<d;++c){var e=this.lines[c];this.height-=e.height;var f=e;f.parent=null;Te(f);L(e,\n\"delete\")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c;this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(a=0;a<b.length;++a)b[a].parent=this},iterN:function(a,b,c){for(b=a+b;a<b;++a)if(c(this.lines[a]))return!0}};Cb.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(a<e){var f=Math.min(b,\ne-a),g=d.height;d.removeInner(a,f);this.height-=g-d.height;e==f&&(this.children.splice(c--,1),d.parent=null);if(0==(b-=f))break;a=0}else a-=e}25>this.size-b&&(1<this.children.length||!(this.children[0]instanceof Bb))&&(c=[],this.collapse(c),this.children=[new Bb(c)],this.children[0].parent=this)},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length;this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],\nf=e.chunkSize();if(a<=f){e.insertInner(a,b,c);if(e.lines&&50<e.lines.length){for(;50<e.lines.length;)a=e.lines.splice(e.lines.length-25,25),a=new Bb(a),e.height-=a.height,this.children.splice(d+1,0,a),a.parent=this;this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(10>=this.children.length)){var a=this;do{var b=a.children.splice(a.children.length-5,5),b=new Cb(b);if(a.parent){a.size-=b.size;a.height-=b.height;var c=D(a.parent.children,a);a.parent.children.splice(c+1,0,b)}else c=new Cb(a.children),\nc.parent=a,a.children=[c,b],a=c;b.parent=a.parent}while(10<a.children.length);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(a<f){f=Math.min(b,f-a);if(e.iterN(a,f,c))return!0;if(0==(b-=f))break;a=0}else a-=f}}};var og=0,P=q.Doc=function(a,b,c){if(!(this instanceof P))return new P(a,b,c);null==c&&(c=0);Cb.call(this,[new Bb([new Ab(\"\",null)])]);this.first=c;this.scrollTop=this.scrollLeft=0;this.cantEdit=!1;this.cleanGeneration=\n1;this.frontier=c;c=r(c,0);this.sel=ga(c);this.history=new uc(null);this.id=++og;this.modeOption=b;\"string\"==typeof a&&(a=sa(a));qd(this,{from:c,to:c,text:a});H(this,ga(c),ha)};P.prototype=ff(Cb.prototype,{constructor:P,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=\nxd(this,this.first,this.first+this.size);return!1===a?b:b.join(a||\"\\n\")},setValue:N(function(a){var b=r(this.first,0),c=this.first+this.size-1;Oa(this,{from:b,to:r(c,u(this,c).text.length),text:sa(a),origin:\"setValue\",full:!0},!0);H(this,ga(b))}),replaceRange:function(a,b,c,d){b=w(this,b);c=c?w(this,c):b;wb(this,a,b,c,d)},getRange:function(a,b,c){a=Da(this,w(this,a),w(this,b));return!1===c?a:a.join(c||\"\\n\")},getLine:function(a){return(a=this.getLineHandle(a))&&a.text},getLineHandle:function(a){if(qb(this,\na))return u(this,a)},getLineNumber:function(a){return F(a)},getLineHandleVisualStart:function(a){\"number\"==typeof a&&(a=u(this,a));return ia(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return w(this,a)},getCursor:function(a){var b=this.sel.primary();return null==a||\"head\"==a?b.head:\"anchor\"==a?b.anchor:\"end\"==a||\"to\"==a||!1===a?b.to():b.from()},listSelections:function(){return this.sel.ranges},\nsomethingSelected:function(){return this.sel.somethingSelected()},setCursor:N(function(a,b,c){a=w(this,\"number\"==typeof a?r(a,b||0):a);H(this,ga(a,null),c)}),setSelection:N(function(a,b,c){var d=w(this,a);a=w(this,b||a);H(this,ga(d,a),c)}),extendSelection:N(function(a,b,c){Ub(this,w(this,a),b&&w(this,b),c)}),extendSelections:N(function(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=w(this,a[d]);ae(this,c)}),extendSelectionsBy:N(function(a,b){ae(this,ob(this.sel.ranges,a),b)}),setSelections:N(function(a,\nb,c){if(a.length){for(var d=0,e=[];d<a.length;d++)e[d]=new z(w(this,a[d].anchor),w(this,a[d].head));null==b&&(b=Math.min(a.length-1,this.sel.primIndex));H(this,Z(e,b),c)}}),addSelection:N(function(a,b,c){var d=this.sel.ranges.slice(0);d.push(new z(w(this,a),w(this,b||a)));H(this,Z(d,d.length-1),c)}),getSelection:function(a){for(var b=this.sel.ranges,c,d=0;d<b.length;d++){var e=Da(this,b[d].from(),b[d].to());c=c?c.concat(e):e}return!1===a?c:c.join(a||\"\\n\")},getSelections:function(a){for(var b=[],c=\nthis.sel.ranges,d=0;d<c.length;d++){var e=Da(this,c[d].from(),c[d].to());!1!==a&&(e=e.join(a||\"\\n\"));b[d]=e}return b},replaceSelection:function(a,b,c){for(var d=[],e=0;e<this.sel.ranges.length;e++)d[e]=a;this.replaceSelections(d,b,c||\"+input\")},replaceSelections:N(function(a,b,c){for(var d=[],e=this.sel,f=0;f<e.ranges.length;f++){var g=e.ranges[f];d[f]={from:g.from(),to:g.to(),text:sa(a[f]),origin:c}}if(f=b&&\"end\"!=b){f=[];c=a=r(this.first,0);for(e=0;e<d.length;e++){var h=d[e],g=Ee(h.from,a,c),k=\nEe(ta(h),a,c);a=h.to;c=k;\"around\"==b?(h=this.sel.ranges[e],h=0>y(h.head,h.anchor),f[e]=new z(h?k:g,h?g:k)):f[e]=new z(g,g)}f=new la(f,this.sel.primIndex)}b=f;for(f=d.length-1;0<=f;f--)Oa(this,d[f]);b?be(this,b):this.cm&&Pa(this.cm)}),undo:N(function(){kc(this,\"undo\")}),redo:N(function(){kc(this,\"redo\")}),undoSelection:N(function(){kc(this,\"undo\",!0)}),redoSelection:N(function(){kc(this,\"redo\",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=\nthis.history,b=0,c=0,d=0;d<a.done.length;d++)a.done[d].ranges||++b;for(d=0;d<a.undone.length;d++)a.undone[d].ranges||++c;return{undo:b,redo:c}},clearHistory:function(){this.history=new uc(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(a){a&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null);return this.history.generation},isClean:function(a){return this.history.generation==(a||this.cleanGeneration)},\ngetHistory:function(){return{done:Xa(this.history.done),undone:Xa(this.history.undone)}},setHistory:function(a){var b=this.history=new uc(this.history.maxGeneration);b.done=Xa(a.done.slice(0),null,!0);b.undone=Xa(a.undone.slice(0),null,!0)},addLineClass:N(function(a,b,c){return nc(this,a,\"gutter\"==b?\"gutter\":\"class\",function(a){var e=\"text\"==b?\"textClass\":\"background\"==b?\"bgClass\":\"gutter\"==b?\"gutterClass\":\"wrapClass\";if(a[e]){if(Fb(c).test(a[e]))return!1;a[e]+=\" \"+c}else a[e]=c;return!0})}),removeLineClass:N(function(a,\nb,c){return nc(this,a,\"gutter\"==b?\"gutter\":\"class\",function(a){var e=\"text\"==b?\"textClass\":\"background\"==b?\"bgClass\":\"gutter\"==b?\"gutterClass\":\"wrapClass\",f=a[e];if(f)if(null==c)a[e]=null;else{var g=f.match(Fb(c));if(!g)return!1;var h=g.index+g[0].length;a[e]=f.slice(0,g.index)+(g.index&&h!=f.length?\" \":\"\")+f.slice(h)||null}else return!1;return!0})}),addLineWidget:N(function(a,b,c){return $f(this,a,b,c)}),removeLineWidget:function(a){a.clear()},markText:function(a,b,c){return Wa(this,w(this,a),w(this,\nb),c,\"range\")},setBookmark:function(a,b){var c={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft,clearWhenEmpty:!1,shared:b&&b.shared,handleMouseEvents:b&&b.handleMouseEvents};a=w(this,a);return Wa(this,a,a,c,\"bookmark\")},findMarksAt:function(a){a=w(this,a);var b=[],c=u(this,a.line).markedSpans;if(c)for(var d=0;d<c.length;++d){var e=c[d];(null==e.from||e.from<=a.ch)&&(null==e.to||e.to>=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=w(this,a);\nb=w(this,b);var d=[],e=a.line;this.iter(a.line,b.line+1,function(f){if(f=f.markedSpans)for(var g=0;g<f.length;g++){var h=f[g];e==a.line&&a.ch>h.to||null==h.from&&e!=a.line||e==b.line&&h.from>b.ch||c&&!c(h.marker)||d.push(h.marker.parent||h.marker)}++e});return d},getAllMarks:function(){var a=[];this.iter(function(b){if(b=b.markedSpans)for(var c=0;c<b.length;++c)null!=b[c].from&&a.push(b[c].marker)});return a},posFromIndex:function(a){var b,c=this.first;this.iter(function(d){d=d.text.length+1;if(d>\na)return b=a,!0;a-=d;++c});return w(this,r(c,b))},indexFromPos:function(a){a=w(this,a);var b=a.ch;if(a.line<this.first||0>a.ch)return 0;this.iter(this.first,a.line,function(a){b+=a.text.length+1});return b},copy:function(a){var b=new P(xd(this,this.first,this.first+this.size),this.modeOption,this.first);b.scrollTop=this.scrollTop;b.scrollLeft=this.scrollLeft;b.sel=this.sel;b.extend=!1;a&&(b.history.undoDepth=this.history.undoDepth,b.setHistory(this.getHistory()));return b},linkedDoc:function(a){a||\n(a={});var b=this.first,c=this.first+this.size;null!=a.from&&a.from>b&&(b=a.from);null!=a.to&&a.to<c&&(c=a.to);b=new P(xd(this,b,c),a.mode||this.modeOption,b);a.sharedHist&&(b.history=this.history);(this.linked||(this.linked=[])).push({doc:b,sharedHist:a.sharedHist});b.linked=[{doc:this,isParent:!0,sharedHist:a.sharedHist}];a=Re(this);for(c=0;c<a.length;c++){var d=a[c],e=d.find(),f=b.clipPos(e.from),e=b.clipPos(e.to);y(f,e)&&(f=Wa(b,f,e,d.primary,d.primary.type),d.markers.push(f),f.parent=d)}return b},\nunlinkDoc:function(a){a instanceof q&&(a=a.doc);if(this.linked)for(var b=0;b<this.linked.length;++b)if(this.linked[b].doc==a){this.linked.splice(b,1);a.unlinkDoc(this);Yf(Re(this));break}if(a.history==this.history){var c=[a.id];Ga(a,function(a){c.push(a.id)},!0);a.history=new uc(null);a.history.done=Xa(this.history.done,c);a.history.undone=Xa(this.history.undone,c)}},iterLinkedDocs:function(a){Ga(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm}});P.prototype.eachLine=\nP.prototype.iter;var pg=[\"iter\",\"insert\",\"remove\",\"copy\",\"getEditor\"],Jb;for(Jb in P.prototype)P.prototype.hasOwnProperty(Jb)&&0>D(pg,Jb)&&(q.prototype[Jb]=function(a){return function(){return a.apply(this.doc,arguments)}}(P.prototype[Jb]));Ya(P);var O=q.e_preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},qg=q.e_stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},jd=q.e_stop=function(a){O(a);qg(a)},v=q.on=function(a,b,c){a.addEventListener?\na.addEventListener(b,c,!1):a.attachEvent?a.attachEvent(\"on\"+b,c):(a=a._handlers||(a._handlers={}),(a[b]||(a[b]=[])).push(c))},ka=q.off=function(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent(\"on\"+b,c);else if(a=a._handlers&&a._handlers[b])for(b=0;b<a.length;++b)if(a[b]==c){a.splice(b,1);break}},K=q.signal=function(a,b){var c=a._handlers&&a._handlers[b];if(c)for(var d=Array.prototype.slice.call(arguments,2),e=0;e<c.length;++e)c[e].apply(null,d)},Db=\nnull,Hd=30,Ae=q.Pass={toString:function(){return\"CodeMirror.Pass\"}},ha={scroll:!1},kd={origin:\"*mouse\"},Gb={origin:\"+move\"};bb.prototype.set=function(a,b){clearTimeout(this.id);this.id=setTimeout(b,a)};var aa=q.countColumn=function(a,b,c,d,e){null==b&&(b=a.search(/[^\\s\\u00a0]/),-1==b&&(b=a.length));d=d||0;for(e=e||0;;){var f=a.indexOf(\"\\t\",d);if(0>f||f>=b)return e+(b-d);e+=f-d;e+=c-e%c;d=f+1}},vc=[\"\"],Za=function(a){a.select()};Qa?Za=function(a){a.selectionStart=0;a.selectionEnd=a.value.length}:B&&\n(Za=function(a){try{a.select()}catch(b){}});var rg=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,gf=q.isWordChar=function(a){return/\\w/.test(a)||\"\"<a&&(a.toUpperCase()!=a.toLowerCase()||rg.test(a))},ig=/[\\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]/,\nEa;Ea=document.createRange?function(a,b,c,d){var e=document.createRange();e.setEnd(d||a,c);e.setStart(a,b);return e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}d.collapse(!0);d.moveEnd(\"character\",c);d.moveStart(\"character\",b);return d};var Wc=q.contains=function(a,b){3==b.nodeType&&(b=b.parentNode);if(a.contains)return a.contains(b);do if(11==b.nodeType&&(b=b.host),b==a)return!0;while(b=b.parentNode)};B&&11>C&&(fa=function(){try{return document.activeElement}catch(a){return document.body}});\nvar kb=q.rmClass=function(a,b){var c=a.className,d=Fb(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:\"\")}},mb=q.addClass=function(a,b){var c=a.className;Fb(b).test(c)||(a.className+=(c?\" \":\"\")+b)},Dd=!1,Lf=function(){if(B&&9>C)return!1;var a=t(\"div\");return\"draggable\"in a||\"dragDrop\"in a}(),yd,vd,sa=q.splitLines=3!=\"\\n\\nb\".split(/\\n/).length?function(a){for(var b=0,c=[],d=a.length;b<=d;){var e=a.indexOf(\"\\n\",b);-1==e&&(e=a.length);var f=a.slice(b,\"\\r\"==\na.charAt(e-1)?e-1:e),g=f.indexOf(\"\\r\");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\\r\\n?|\\n/)},ng=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints(\"StartToEnd\",b):!1},Ce=function(){var a=t(\"div\");if(\"oncopy\"in a)return!0;a.setAttribute(\"oncopy\",\"return;\");return\"function\"==typeof a.oncopy}(),\nbd=null,va={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:\"\\x3d\",91:\"Mod\",92:\"Mod\",93:\"Mod\",107:\"\\x3d\",109:\"-\",127:\"Delete\",173:\"-\",186:\";\",187:\"\\x3d\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",63232:\"Up\",63233:\"Down\",63234:\"Left\",63235:\"Right\",63272:\"Delete\",63273:\"Home\",\n63275:\"End\",63276:\"PageUp\",63277:\"PageDown\",63302:\"Insert\"};q.keyNames=va;(function(){for(var a=0;10>a;a++)va[a+48]=va[a+96]=String(a);for(a=65;90>=a;a++)va[a]=String.fromCharCode(a);for(a=1;12>=a;a++)va[a+111]=va[a+63235]=\"F\"+a})();var vb,gg=function(){function a(a){return 247>=a?\"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\".charAt(a):\n1424<=a&&1524>=a?\"R\":1536<=a&&1773>=a?\"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\".charAt(a-1536):1774<=a&&2220>=a?\"r\":8192<=a&&8203>=a?\"w\":8204==a?\"b\":\"L\"}function b(a,b,c){this.level=a;this.from=b;this.to=c}var c=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/,d=/[stwN]/,e=/[LRr]/,f=/[Lb1n]/,g=/[1n]/;return function(h){if(!c.test(h))return!1;\nfor(var k=h.length,l=[],m=0,p;m<k;++m)l.push(a(h.charCodeAt(m)));for(var m=0,n=\"L\";m<k;++m)p=l[m],\"m\"==p?l[m]=n:n=p;m=0;for(n=\"L\";m<k;++m)p=l[m],\"1\"==p&&\"r\"==n?l[m]=\"n\":e.test(p)&&(n=p,\"r\"==p&&(l[m]=\"R\"));m=1;for(n=l[0];m<k-1;++m)p=l[m],\"+\"==p&&\"1\"==n&&\"1\"==l[m+1]?l[m]=\"1\":\",\"!=p||n!=l[m+1]||\"1\"!=n&&\"n\"!=n||(l[m]=n),n=p;for(m=0;m<k;++m)if(p=l[m],\",\"==p)l[m]=\"N\";else if(\"%\"==p){for(n=m+1;n<k&&\"%\"==l[n];++n);var q=m&&\"!\"==l[m-1]||n<k&&\"1\"==l[n]?\"1\":\"N\";for(p=m;p<n;++p)l[p]=q;m=n-1}m=0;for(n=\"L\";m<k;++m)p=\nl[m],\"L\"==n&&\"1\"==p?l[m]=\"L\":e.test(p)&&(n=p);for(m=0;m<k;++m)if(d.test(l[m])){for(n=m+1;n<k&&d.test(l[n]);++n);p=\"L\"==(n<k?l[n]:\"L\");q=\"L\"==(m?l[m-1]:\"L\")||p?\"L\":\"R\";for(p=m;p<n;++p)l[p]=q;m=n-1}for(var n=[],r,m=0;m<k;)if(f.test(l[m])){p=m;for(++m;m<k&&f.test(l[m]);++m);n.push(new b(0,p,m))}else{var t=m,q=n.length;for(++m;m<k&&\"L\"!=l[m];++m);for(p=t;p<m;)if(g.test(l[p])){t<p&&n.splice(q,0,new b(1,t,p));t=p;for(++p;p<m&&g.test(l[p]);++p);n.splice(q,0,new b(2,t,p));t=p}else++p;t<m&&n.splice(q,0,new b(1,\nt,m))}1==n[0].level&&(r=h.match(/^\\s+/))&&(n[0].from=r[0].length,n.unshift(new b(0,0,r[0].length)));1==A(n).level&&(r=h.match(/\\s+$/))&&(A(n).to-=r[0].length,n.push(new b(0,k-r[0].length,k)));2==n[0].level&&n.unshift(new b(1,n[0].to,n[0].to));n[0].level!=A(n).level&&n.push(new b(n[0].level,k,k));return n}}();q.version=\"5.2.0\";return q});"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/javascript.js",
    "content": "﻿(function(p){\"object\"==typeof exports&&\"object\"==typeof module?p(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],p):p(CodeMirror)})(function(p){p.defineMode(\"javascript\",function(oa,t){function q(a,c,e){E=a;I=e;return c}function w(a,c){var e=a.next();if('\"'==e||\"'\"==e)return c.tokenize=pa(e),c.tokenize(a,c);if(\".\"==e&&a.match(/^\\d+(?:[eE][+\\-]?\\d+)?/))return q(\"number\",\"number\");if(\".\"==e&&a.match(\"..\"))return q(\"spread\",\"meta\");if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(e))return q(e);\nif(\"\\x3d\"==e&&a.eat(\"\\x3e\"))return q(\"\\x3d\\x3e\",\"operator\");if(\"0\"==e&&a.eat(/x/i))return a.eatWhile(/[\\da-f]/i),q(\"number\",\"number\");if(/\\d/.test(e))return a.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/),q(\"number\",\"number\");if(\"/\"==e){if(a.eat(\"*\"))return c.tokenize=J,J(a,c);if(a.eat(\"/\"))return a.skipToEnd(),q(\"comment\",\"comment\");if(\"operator\"==c.lastType||\"keyword c\"==c.lastType||\"sof\"==c.lastType||/^[\\[{}\\(,;:]$/.test(c.lastType)){a:for(var e=!1,d,b=!1;null!=(d=a.next());){if(!e){if(\"/\"==d&&!b)break a;\n\"[\"==d?b=!0:b&&\"]\"==d&&(b=!1)}e=!e&&\"\\\\\"==d}a.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/);return q(\"regexp\",\"string-2\")}a.eatWhile(K);return q(\"operator\",\"operator\",a.current())}if(\"`\"==e)return c.tokenize=Q,Q(a,c);if(\"#\"==e)return a.skipToEnd(),q(\"error\",\"error\");if(K.test(e))return a.eatWhile(K),q(\"operator\",\"operator\",a.current());if(R.test(e))return a.eatWhile(R),e=a.current(),(d=ba.propertyIsEnumerable(e)&&ba[e])&&\".\"!=c.lastType?q(d.type,d.style,e):q(\"variable\",\"variable\",e)}function pa(a){return function(c,\ne){var d=!1,b;if(L&&\"@\"==c.peek()&&c.match(qa))return e.tokenize=w,q(\"jsonld-keyword\",\"meta\");for(;null!=(b=c.next())&&(b!=a||d);)d=!d&&\"\\\\\"==b;d||(e.tokenize=w);return q(\"string\",\"string\")}}function J(a,c){for(var e=!1,d;d=a.next();){if(\"/\"==d&&e){c.tokenize=w;break}e=\"*\"==d}return q(\"comment\",\"comment\")}function Q(a,c){for(var e=!1,d;null!=(d=a.next());){if(!e&&(\"`\"==d||\"$\"==d&&a.eat(\"{\"))){c.tokenize=w;break}e=!e&&\"\\\\\"==d}return q(\"quasi\",\"string-2\",a.current())}function S(a,c){c.fatArrowAt&&(c.fatArrowAt=\nnull);var e=a.string.indexOf(\"\\x3d\\x3e\",a.start);if(!(0>e)){for(var d=0,b=!1,e=e-1;0<=e;--e){var f=a.string.charAt(e),g=\"([{}])\".indexOf(f);if(0<=g&&3>g){if(!d){++e;break}if(0==--d)break}else if(3<=g&&6>g)++d;else if(R.test(f))b=!0;else{if(/[\"'\\/]/.test(f))return;if(b&&!d){++e;break}}}b&&!d&&(c.fatArrowAt=e)}}function ca(a,c,b,d,f,h){this.indented=a;this.column=c;this.type=b;this.prev=f;this.info=h;null!=d&&(this.align=d)}function g(){for(var a=arguments.length-1;0<=a;a--)f.cc.push(arguments[a])}\nfunction b(){g.apply(null,arguments);return!0}function x(a){function c(c){for(;c;c=c.next)if(c.name==a)return!0;return!1}var b=f.state;b.context?(f.marked=\"def\",c(b.localVars)||(b.localVars={name:a,next:b.localVars})):!c(b.globalVars)&&t.globalVars&&(b.globalVars={name:a,next:b.globalVars})}function y(){f.state.context={prev:f.state.context,vars:f.state.localVars};f.state.localVars=ra}function z(){f.state.localVars=f.state.context.vars;f.state.context=f.state.context.prev}function l(a,c){var b=function(){var b=\nf.state,e=b.indented;if(\"stat\"==b.lexical.type)e=b.lexical.indented;else for(var h=b.lexical;h&&\")\"==h.type&&h.align;h=h.prev)e=h.indented;b.lexical=new ca(e,f.stream.column(),a,null,b.lexical,c)};b.lex=!0;return b}function k(){var a=f.state;a.lexical.prev&&(\")\"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function m(a){function c(e){return e==a?b():\";\"==a?g():b(c)}return c}function r(a,c){return\"var\"==a?b(l(\"vardef\",c.length),T,m(\";\"),k):\"keyword a\"==a?b(l(\"form\"),n,\nr,k):\"keyword b\"==a?b(l(\"form\"),r,k):\"{\"==a?b(l(\"}\"),U,k):\";\"==a?b():\"if\"==a?(\"else\"==f.state.lexical.info&&f.state.cc[f.state.cc.length-1]==k&&f.state.cc.pop()(),b(l(\"form\"),n,r,k,da)):\"function\"==a?b(v):\"for\"==a?b(l(\"form\"),ea,r,k):\"variable\"==a?b(l(\"stat\"),sa):\"switch\"==a?b(l(\"form\"),n,l(\"}\",\"switch\"),m(\"{\"),U,k,k):\"case\"==a?b(n,m(\":\")):\"default\"==a?b(m(\":\")):\"catch\"==a?b(l(\"form\"),y,m(\"(\"),V,m(\")\"),r,k,z):\"module\"==a?b(l(\"form\"),y,ta,z,k):\"class\"==a?b(l(\"form\"),ua,k):\"export\"==a?b(l(\"form\"),va,\nk):\"import\"==a?b(l(\"form\"),wa,k):g(l(\"stat\"),n,m(\";\"),k)}function n(a){return fa(a,!1)}function u(a){return fa(a,!0)}function fa(a,c){if(f.state.fatArrowAt==f.stream.start){var e=c?ga:ha;if(\"(\"==a)return b(y,l(\")\"),F(A,\")\"),k,m(\"\\x3d\\x3e\"),e,z);if(\"variable\"==a)return g(y,A,m(\"\\x3d\\x3e\"),e,z)}e=c?W:M;return xa.hasOwnProperty(a)?b(e):\"function\"==a?b(v,e):\"keyword c\"==a?b(c?ia:X):\"(\"==a?b(l(\")\"),X,N,m(\")\"),k,e):\"operator\"==a||\"spread\"==a?b(c?u:n):\"[\"==a?b(l(\"]\"),ya,k,e):\"{\"==a?G(za,\"}\",null,e):\"quasi\"==\na?g(O,e):b()}function X(a){return a.match(/[;\\}\\)\\],]/)?g():g(n)}function ia(a){return a.match(/[;\\}\\)\\],]/)?g():g(u)}function M(a,c){return\",\"==a?b(n):W(a,c,!1)}function W(a,c,e){var d=0==e?M:W,f=0==e?n:u;if(\"\\x3d\\x3e\"==a)return b(y,e?ga:ha,z);if(\"operator\"==a)return/\\+\\+|--/.test(c)?b(d):\"?\"==c?b(n,m(\":\"),f):b(f);if(\"quasi\"==a)return g(O,d);if(\";\"!=a){if(\"(\"==a)return G(u,\")\",\"call\",d);if(\".\"==a)return b(Aa,d);if(\"[\"==a)return b(l(\"]\"),X,m(\"]\"),k,d)}}function O(a,c){return\"quasi\"!=a?g():\"${\"!=c.slice(c.length-\n2)?b(O):b(n,Ba)}function Ba(a){if(\"}\"==a)return f.marked=\"string-2\",f.state.tokenize=Q,b(O)}function ha(a){S(f.stream,f.state);return g(\"{\"==a?r:n)}function ga(a){S(f.stream,f.state);return g(\"{\"==a?r:u)}function sa(a){return\":\"==a?b(k,r):g(M,m(\";\"),k)}function Aa(a){if(\"variable\"==a)return f.marked=\"property\",b()}function za(a,c){if(\"variable\"==a||\"keyword\"==f.style)return f.marked=\"property\",\"get\"==c||\"set\"==c?b(Ca):b(H);if(\"number\"==a||\"string\"==a)return f.marked=L?\"property\":f.style+\" property\",\nb(H);if(\"jsonld-keyword\"==a)return b(H);if(\"[\"==a)return b(n,m(\"]\"),H)}function Ca(a){if(\"variable\"!=a)return g(H);f.marked=\"property\";return b(v)}function H(a){if(\":\"==a)return b(u);if(\"(\"==a)return g(v)}function F(a,c){function e(d){return\",\"==d?(d=f.state.lexical,\"call\"==d.info&&(d.pos=(d.pos||0)+1),b(a,e)):d==c?b():b(m(c))}return function(d){return d==c?b():g(a,e)}}function G(a,c,e){for(var d=3;d<arguments.length;d++)f.cc.push(arguments[d]);return b(l(c,e),F(a,c),k)}function U(a){return\"}\"==a?\nb():g(r,U)}function ja(a){if(ka&&\":\"==a)return b(Da)}function Da(a){if(\"variable\"==a)return f.marked=\"variable-3\",b()}function T(){return g(A,ja,Y,Ea)}function A(a,c){if(\"variable\"==a)return x(c),b();if(\"[\"==a)return G(A,\"]\");if(\"{\"==a)return G(Fa,\"}\")}function Fa(a,c){if(\"variable\"==a&&!f.stream.match(/^\\s*:/,!1))return x(c),b(Y);\"variable\"==a&&(f.marked=\"property\");return b(m(\":\"),A,Y)}function Y(a,c){if(\"\\x3d\"==c)return b(u)}function Ea(a){if(\",\"==a)return b(T)}function da(a,c){if(\"keyword b\"==\na&&\"else\"==c)return b(l(\"form\",\"else\"),r,k)}function ea(a){if(\"(\"==a)return b(l(\")\"),Ga,m(\")\"),k)}function Ga(a){return\"var\"==a?b(T,m(\";\"),P):\";\"==a?b(P):\"variable\"==a?b(Ha):g(n,m(\";\"),P)}function Ha(a,c){return\"in\"==c||\"of\"==c?(f.marked=\"keyword\",b(n)):b(M,P)}function P(a,c){return\";\"==a?b(la):\"in\"==c||\"of\"==c?(f.marked=\"keyword\",b(n)):g(n,m(\";\"),la)}function la(a){\")\"!=a&&b(n)}function v(a,c){if(\"*\"==c)return f.marked=\"keyword\",b(v);if(\"variable\"==a)return x(c),b(v);if(\"(\"==a)return b(y,l(\")\"),\nF(V,\")\"),k,r,z)}function V(a){return\"spread\"==a?b(V):g(A,ja)}function ua(a,c){if(\"variable\"==a)return x(c),b(ma)}function ma(a,c){if(\"extends\"==c)return b(n,ma);if(\"{\"==a)return b(l(\"}\"),B,k)}function B(a,c){if(\"variable\"==a||\"keyword\"==f.style){if(\"static\"==c)return f.marked=\"keyword\",b(B);f.marked=\"property\";return\"get\"==c||\"set\"==c?b(Ia,v,B):b(v,B)}if(\"*\"==c)return f.marked=\"keyword\",b(B);if(\";\"==a)return b(B);if(\"}\"==a)return b()}function Ia(a){if(\"variable\"!=a)return g();f.marked=\"property\";\nreturn b()}function ta(a,c){if(\"string\"==a)return b(r);if(\"variable\"==a)return x(c),b(Z)}function va(a,c){return\"*\"==c?(f.marked=\"keyword\",b(Z,m(\";\"))):\"default\"==c?(f.marked=\"keyword\",b(n,m(\";\"))):g(r)}function wa(a){return\"string\"==a?b():g(aa,Z)}function aa(a,c){if(\"{\"==a)return G(aa,\"}\");\"variable\"==a&&x(c);\"*\"==c&&(f.marked=\"keyword\");return b(Ja)}function Ja(a,c){if(\"as\"==c)return f.marked=\"keyword\",b(aa)}function Z(a,c){if(\"from\"==c)return f.marked=\"keyword\",b(n)}function ya(a){return\"]\"==a?\nb():g(u,Ka)}function Ka(a){return\"for\"==a?g(N,m(\"]\")):\",\"==a?b(F(ia,\"]\")):g(F(u,\"]\"))}function N(a){if(\"for\"==a)return b(ea,N);if(\"if\"==a)return b(n,N)}var C=oa.indentUnit,na=t.statementIndent,L=t.jsonld,D=t.json||L,ka=t.typescript,R=t.wordCharacters||/[\\w$\\xa1-\\uffff]/,ba=function(){function a(a){return{type:a,style:\"keyword\"}}var c=a(\"keyword a\"),b=a(\"keyword b\"),d=a(\"keyword c\"),f=a(\"operator\"),h={type:\"atom\",style:\"atom\"},c={\"if\":a(\"if\"),\"while\":c,\"with\":c,\"else\":b,\"do\":b,\"try\":b,\"finally\":b,\n\"return\":d,\"break\":d,\"continue\":d,\"new\":d,\"delete\":d,\"throw\":d,\"debugger\":d,\"var\":a(\"var\"),\"const\":a(\"var\"),let:a(\"var\"),\"function\":a(\"function\"),\"catch\":a(\"catch\"),\"for\":a(\"for\"),\"switch\":a(\"switch\"),\"case\":a(\"case\"),\"default\":a(\"default\"),\"in\":f,\"typeof\":f,\"instanceof\":f,\"true\":h,\"false\":h,\"null\":h,undefined:h,NaN:h,Infinity:h,\"this\":a(\"this\"),module:a(\"module\"),\"class\":a(\"class\"),\"super\":a(\"atom\"),yield:d,\"export\":a(\"export\"),\"import\":a(\"import\"),\"extends\":d};if(ka){var b={type:\"variable\",style:\"variable-3\"},\nb={\"interface\":a(\"interface\"),\"extends\":a(\"extends\"),constructor:a(\"constructor\"),\"public\":a(\"public\"),\"private\":a(\"private\"),\"protected\":a(\"protected\"),\"static\":a(\"static\"),string:b,number:b,bool:b,any:b},g;for(g in b)c[g]=b[g]}return c}(),K=/[+\\-*&%=<>!?|~^]/,qa=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/,E,I,xa={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,\"this\":!0,\"jsonld-keyword\":!0},f={state:null,column:null,marked:null,cc:null},ra={name:\"this\",\nnext:{name:\"arguments\"}};k.lex=!0;return{startState:function(a){a={tokenize:w,lastType:\"sof\",cc:[],lexical:new ca((a||0)-C,0,\"block\",!1),localVars:t.localVars,context:t.localVars&&{vars:t.localVars},indented:0};t.globalVars&&\"object\"==typeof t.globalVars&&(a.globalVars=t.globalVars);return a},token:function(a,b){a.sol()&&(b.lexical.hasOwnProperty(\"align\")||(b.lexical.align=!1),b.indented=a.indentation(),S(a,b));if(b.tokenize!=J&&a.eatSpace())return null;var e=b.tokenize(a,b);if(\"comment\"==E)return e;\nb.lastType=\"operator\"!=E||\"++\"!=I&&\"--\"!=I?E:\"incdec\";a:{var d=E,g=I,h=b.cc;f.state=b;f.stream=a;f.marked=null;f.cc=h;f.style=e;b.lexical.hasOwnProperty(\"align\")||(b.lexical.align=!0);for(;;)if((h.length?h.pop():D?n:r)(d,g)){for(;h.length&&h[h.length-1].lex;)h.pop()();if(f.marked){e=f.marked;break a}if(d=\"variable\"==d)b:{for(d=b.localVars;d;d=d.next)if(d.name==g){d=!0;break b}for(h=b.context;h;h=h.prev)for(d=h.vars;d;d=d.next)if(d.name==g){d=!0;break b}d=void 0}if(d){e=\"variable-2\";break a}break a}}return e},\nindent:function(a,b){if(a.tokenize==J)return p.Pass;if(a.tokenize!=w)return 0;var e=b&&b.charAt(0),d=a.lexical;if(!/^\\s*else\\b/.test(b))for(var f=a.cc.length-1;0<=f;--f){var g=a.cc[f];if(g==k)d=d.prev;else if(g!=da)break}\"stat\"==d.type&&\"}\"==e&&(d=d.prev);na&&\")\"==d.type&&\"stat\"==d.prev.type&&(d=d.prev);f=d.type;g=e==f;return\"vardef\"==f?d.indented+(\"operator\"==a.lastType||\",\"==a.lastType?d.info+1:0):\"form\"==f&&\"{\"==e?d.indented:\"form\"==f?d.indented+C:\"stat\"==f?(e=d.indented,d=\"operator\"==a.lastType||\n\",\"==a.lastType||K.test(b.charAt(0))||/[,.]/.test(b.charAt(0)),e+(d?na||C:0)):\"switch\"!=d.info||g||0==t.doubleIndentSwitch?d.align?d.column+(g?0:1):d.indented+(g?0:C):d.indented+(/^(?:case|default)\\b/.test(b)?C:2*C)},electricInput:/^\\s*(?:case .*?:|default:|\\{|\\})$/,blockCommentStart:D?null:\"/*\",blockCommentEnd:D?null:\"*/\",lineComment:D?null:\"//\",fold:\"brace\",closeBrackets:\"()[]{}''\\\"\\\"``\",helperType:D?\"json\":\"javascript\",jsonldMode:L,jsonMode:D}});p.registerHelper(\"wordChars\",\"javascript\",/[\\w$]/);\np.defineMIME(\"text/javascript\",\"javascript\");p.defineMIME(\"text/ecmascript\",\"javascript\");p.defineMIME(\"application/javascript\",\"javascript\");p.defineMIME(\"application/x-javascript\",\"javascript\");p.defineMIME(\"application/ecmascript\",\"javascript\");p.defineMIME(\"application/json\",{name:\"javascript\",json:!0});p.defineMIME(\"application/x-json\",{name:\"javascript\",json:!0});p.defineMIME(\"application/ld+json\",{name:\"javascript\",jsonld:!0});p.defineMIME(\"text/typescript\",{name:\"javascript\",typescript:!0});\np.defineMIME(\"application/typescript\",{name:\"javascript\",typescript:!0})});"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/neo.css",
    "content": "/* neo theme for codemirror */\n\n/* Color scheme */\n\n.cm-s-neo.CodeMirror {\n  background-color:#ffffff;\n  color:#2e383c;\n  line-height:1.4375;\n}\n.cm-s-neo .cm-comment {color:#75787b}\n.cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3}\n.cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a}\n.cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328}\n.cm-s-neo .cm-string {color:#b35e14}\n.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65}\n\n\n/* Editor styling */\n\n.cm-s-neo pre {\n  padding:0;\n}\n\n.cm-s-neo .CodeMirror-gutters {\n  border:none;\n  border-right:10px solid transparent;\n  background-color:transparent;\n}\n\n.cm-s-neo .CodeMirror-linenumber {\n  padding:0;\n  color:#e0e2e5;\n}\n\n.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; }\n.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; }\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.css",
    "content": ".CodeMirror-hints {\n  position: absolute;\n  z-index: 10;\n  overflow: hidden;\n  list-style: none;\n\n  margin: 0;\n  padding: 2px;\n\n  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  border-radius: 3px;\n  border: 1px solid silver;\n\n  background: white;\n  font-size: 90%;\n  font-family: monospace;\n\n  max-height: 20em;\n  overflow-y: auto;\n}\n\n.CodeMirror-hint {\n  margin: 0;\n  padding: 0 4px;\n  border-radius: 2px;\n  max-width: 19em;\n  overflow: hidden;\n  white-space: pre;\n  color: black;\n  cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n  background: #08f;\n  color: white;\n}\n"
  },
  {
    "path": "assets/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.js",
    "content": "﻿(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){function p(a,b){this.cm=a;this.options=this.buildOptions(b);this.widget=null;this.tick=this.debounce=0;this.startPos=this.cm.getCursor();this.startLen=this.cm.getLine(this.startPos.line).length;var c=this;a.on(\"cursorActivity\",this.activityFunc=function(){c.cursorActivity()})}function w(a,b){function c(a,\nc){var d;d=\"string\"!=typeof c?function(a){return c(a,b)}:e.hasOwnProperty(c)?e[c]:c;f[a]=d}var e={Up:function(){b.moveFocus(-1)},Down:function(){b.moveFocus(1)},PageUp:function(){b.moveFocus(-b.menuSize()+1,!0)},PageDown:function(){b.moveFocus(b.menuSize()-1,!0)},Home:function(){b.setFocus(0)},End:function(){b.setFocus(b.length-1)},Enter:b.pick,Tab:b.pick,Esc:b.close},d=a.options.customKeys,f=d?{}:e;if(d)for(var g in d)d.hasOwnProperty(g)&&c(g,d[g]);if(d=a.options.extraKeys)for(g in d)d.hasOwnProperty(g)&&\nc(g,d[g]);return f}function v(a,b){for(;b&&b!=a;){if(\"LI\"===b.nodeName.toUpperCase()&&b.parentNode==a)return b;b=b.parentNode}}function n(a,b){this.completion=a;this.data=b;this.picked=!1;var c=this,e=a.cm,d=this.hints=document.createElement(\"ul\");d.className=\"CodeMirror-hints\";this.selectedHint=b.selectedHint||0;for(var m=b.list,g=0;g<m.length;++g){var l=d.appendChild(document.createElement(\"li\")),h=m[g],k=\"CodeMirror-hint\"+(g!=this.selectedHint?\"\":\" CodeMirror-hint-active\");null!=h.className&&(k=\nh.className+\" \"+k);l.className=k;h.render?h.render(l,b,h):l.appendChild(document.createTextNode(h.displayText||(\"string\"==typeof h?h:h.text)));l.hintId=g}var g=e.cursorCoords(a.options.alignWithWord?b.from:null),r=g.left,t=g.bottom,n=!0;d.style.left=r+\"px\";d.style.top=t+\"px\";l=window.innerWidth||Math.max(document.body.offsetWidth,document.documentElement.offsetWidth);k=window.innerHeight||Math.max(document.body.offsetHeight,document.documentElement.offsetHeight);(a.options.container||document.body).appendChild(d);\nh=d.getBoundingClientRect();if(0<h.bottom-k){var u=h.bottom-h.top;0<g.top-(g.bottom-h.top)-u?(d.style.top=(t=g.top-u)+\"px\",n=!1):u>k&&(d.style.height=k-5+\"px\",d.style.top=(t=g.bottom-h.top)+\"px\",k=e.getCursor(),b.from.ch!=k.ch&&(g=e.cursorCoords(k),d.style.left=(r=g.left)+\"px\",h=d.getBoundingClientRect()))}k=h.right-l;0<k&&(h.right-h.left>l&&(d.style.width=l-5+\"px\",k-=h.right-h.left-l),d.style.left=(r=g.left-k)+\"px\");e.addKeyMap(this.keyMap=w(a,{moveFocus:function(a,b){c.changeActive(c.selectedHint+\na,b)},setFocus:function(a){c.changeActive(a)},menuSize:function(){return c.screenAmount()},length:m.length,close:function(){a.close()},pick:function(){c.pick()},data:b}));if(a.options.closeOnUnfocus){var p;e.on(\"blur\",this.onBlur=function(){p=setTimeout(function(){a.close()},100)});e.on(\"focus\",this.onFocus=function(){clearTimeout(p)})}var q=e.getScrollInfo();e.on(\"scroll\",this.onScroll=function(){var c=e.getScrollInfo(),b=e.getWrapperElement().getBoundingClientRect(),f=t+q.top-c.top,g=f-(window.pageYOffset||\n(document.documentElement||document.body).scrollTop);n||(g+=d.offsetHeight);if(g<=b.top||g>=b.bottom)return a.close();d.style.top=f+\"px\";d.style.left=r+q.left-c.left+\"px\"});f.on(d,\"dblclick\",function(a){(a=v(d,a.target||a.srcElement))&&null!=a.hintId&&(c.changeActive(a.hintId),c.pick())});f.on(d,\"click\",function(b){(b=v(d,b.target||b.srcElement))&&null!=b.hintId&&(c.changeActive(b.hintId),a.options.completeOnSingleClick&&c.pick())});f.on(d,\"mousedown\",function(){setTimeout(function(){e.focus()},20)});\nf.signal(b,\"select\",m[0],d.firstChild);return!0}f.showHint=function(a,b,c){if(!b)return a.showHint(c);c&&c.async&&(b.async=!0);b={hint:b};if(c)for(var e in c)b[e]=c[e];return a.showHint(b)};f.defineExtension(\"showHint\",function(a){1<this.listSelections().length||this.somethingSelected()||(this.state.completionActive&&this.state.completionActive.close(),a=this.state.completionActive=new p(this,a),a.options.hint&&(f.signal(this,\"startCompletion\",this),a.update()))});var x=window.requestAnimationFrame||\nfunction(a){return setTimeout(a,1E3/60)},y=window.cancelAnimationFrame||clearTimeout;p.prototype={close:function(){this.active()&&(this.tick=this.cm.state.completionActive=null,this.cm.off(\"cursorActivity\",this.activityFunc),this.widget&&this.widget.close(),f.signal(this.cm,\"endCompletion\",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(a,b){var c=a.list[b];c.hint?c.hint(this.cm,a,c):this.cm.replaceRange(\"string\"==typeof c?c:c.text,c.from||a.from,c.to||a.to,\n\"complete\");f.signal(a,\"pick\",c);this.close()},showHints:function(a){if(!a||!a.list.length||!this.active())return this.close();this.options.completeSingle&&1==a.list.length?this.pick(a,0):this.showWidget(a)},cursorActivity:function(){this.debounce&&(y(this.debounce),this.debounce=0);var a=this.cm.getCursor(),b=this.cm.getLine(a.line);if(a.line!=this.startPos.line||b.length-a.ch!=this.startLen-this.startPos.ch||a.ch<this.startPos.ch||this.cm.somethingSelected()||a.ch&&this.options.closeCharacters.test(b.charAt(a.ch-\n1)))this.close();else{var c=this;this.debounce=x(function(){c.update()});this.widget&&this.widget.disable()}},update:function(){if(null!=this.tick)if(this.data&&f.signal(this.data,\"update\"),this.options.hint.async){var a=++this.tick,b=this;this.options.hint(this.cm,function(c){b.tick==a&&b.finishUpdate(c)},this.options)}else this.finishUpdate(this.options.hint(this.cm,this.options),a)},finishUpdate:function(a){this.data=a;var b=this.widget&&this.widget.picked;this.widget&&this.widget.close();a&&a.list.length&&\n(b&&1==a.list.length?this.pick(a,0):this.widget=new n(this,a))},showWidget:function(a){this.data=a;this.widget=new n(this,a);f.signal(a,\"shown\")},buildOptions:function(a){var b=this.cm.options.hintOptions,c={},e;for(e in q)c[e]=q[e];if(b)for(e in b)void 0!==b[e]&&(c[e]=b[e]);if(a)for(e in a)void 0!==a[e]&&(c[e]=a[e]);return c}};n.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null;this.hints.parentNode.removeChild(this.hints);this.completion.cm.removeKeyMap(this.keyMap);\nvar a=this.completion.cm;this.completion.options.closeOnUnfocus&&(a.off(\"blur\",this.onBlur),a.off(\"focus\",this.onFocus));a.off(\"scroll\",this.onScroll)}},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var a=this;this.keyMap={Enter:function(){a.picked=!0}};this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(a,b){a>=this.data.list.length?a=b?this.data.list.length-1:0:0>a&&(a=b?0:this.data.list.length-1);\nif(this.selectedHint!=a){var c=this.hints.childNodes[this.selectedHint];c.className=c.className.replace(\" CodeMirror-hint-active\",\"\");c=this.hints.childNodes[this.selectedHint=a];c.className+=\" CodeMirror-hint-active\";c.offsetTop<this.hints.scrollTop?this.hints.scrollTop=c.offsetTop-3:c.offsetTop+c.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=c.offsetTop+c.offsetHeight-this.hints.clientHeight+3);f.signal(this.data,\"select\",this.data.list[this.selectedHint],c)}},\nscreenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}};f.registerHelper(\"hint\",\"auto\",function(a,b){var c=a.getHelpers(a.getCursor(),\"hint\");if(c.length)for(var e=0;e<c.length;e++){var d=c[e](a,b);if(d&&d.list.length)return d}else if(c=a.getHelper(a.getCursor(),\"hintWords\")){if(c)return f.hint.fromList(a,{words:c})}else if(f.hint.anyword)return f.hint.anyword(a,b)});f.registerHelper(\"hint\",\"fromList\",function(a,b){for(var c=a.getCursor(),e=a.getTokenAt(c),\nd=[],m=0;m<b.words.length;m++){var g=b.words[m];g.slice(0,e.string.length)==e.string&&d.push(g)}if(d.length)return{list:d,from:f.Pos(c.line,e.start),to:f.Pos(c.line,e.end)}});f.commands.autocomplete=f.showHint;var q={hint:f.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\\s()\\[\\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!1,container:null,customKeys:null,extraKeys:null};f.defineOption(\"hintOptions\",null)});"
  },
  {
    "path": "assets/ckeditor/skins/moono/dialog.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}"
  },
  {
    "path": "assets/ckeditor/skins/moono/dialog_ie.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}"
  },
  {
    "path": "assets/ckeditor/skins/moono/dialog_ie7.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}"
  },
  {
    "path": "assets/ckeditor/skins/moono/dialog_ie8.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}"
  },
  {
    "path": "assets/ckeditor/skins/moono/dialog_iequirks.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:\"\"}"
  },
  {
    "path": "assets/ckeditor/skins/moono/editor.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moono/editor_gecko.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moono/editor_ie.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moono/editor_ie7.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moono/editor_ie8.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moono/editor_iequirks.css",
    "content": "/*\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moono/readme.md",
    "content": "\"Moono\" Skin\r\n====================\r\n\r\nThis skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor\r\n[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by\r\nthe CKEditor team. \"Moono\" is maintained by the core developers.\r\n\r\nFor more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)\r\ndocumentation.\r\n\r\nFeatures\r\n-------------------\r\n\"Moono\" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.\r\nIt comes with the following features:\r\n\r\n- Chameleon feature with brightness,\r\n- high-contrast compatibility,\r\n- graphics source provided in SVG.\r\n\r\nDirectory Structure\r\n-------------------\r\n\r\nCSS parts:\r\n- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,\r\n- **mainui.css**: the file contains styles of entire editor outline structures,\r\n- **toolbar.css**: the file contains styles of the editor toolbar space (top),\r\n- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,\r\n- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded\r\nuntil the first panel open up,\r\n- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),\r\n- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,\r\nit's not loaded until the first menu open up,\r\n- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,\r\n- **reset.css**: the file defines the basis of style resets among all editor UI spaces,\r\n- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,\r\n- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.\r\n\r\nOther parts:\r\n- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,\r\n- **icons/**: contains all skin defined icons,\r\n- **images/**: contains a fill general used images,\r\n- **dev/**: contains SVG source of the skin icons.\r\n\r\nLicense\r\n-------\r\n\r\nCopyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\r\n\r\nFor licensing, see LICENSE.md or [http://ckeditor.com/license](http://ckeditor.com/license)\r\n"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/dialog.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/dialog_ie.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/dialog_ie7.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/dialog_ie8.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/dialog_iequirks.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:\"\"}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/editor.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2064px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -2160px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -2256px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2448px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -2544px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2640px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2688px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2736px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -2784px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2832px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2880px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2928px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2976px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3024px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3072px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3120px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3168px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3216px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3264px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -3312px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -3360px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -3408px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -3456px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3504px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3552px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3600px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3648px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -3696px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -3744px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -3792px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3840px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3888px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3936px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3984px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -4032px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/editor_gecko.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2064px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -2160px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -2256px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2448px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -2544px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2640px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2688px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2736px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -2784px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2832px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2880px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2928px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2976px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3024px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3072px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3120px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3168px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3216px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3264px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -3312px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -3360px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -3408px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -3456px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3504px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3552px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3600px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3648px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -3696px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -3744px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -3792px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3840px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3888px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3936px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3984px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -4032px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/editor_ie.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2064px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -2160px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -2256px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2448px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -2544px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2640px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2688px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2736px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -2784px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2832px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2880px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2928px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2976px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3024px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3072px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3120px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3168px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3216px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3264px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -3312px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -3360px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -3408px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -3456px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3504px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3552px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3600px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3648px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -3696px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -3744px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -3792px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3840px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3888px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3936px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3984px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -4032px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/editor_ie7.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2064px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -2160px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -2256px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2448px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -2544px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2640px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2688px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2736px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -2784px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2832px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2880px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2928px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2976px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3024px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3072px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3120px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3168px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3216px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3264px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -3312px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -3360px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -3408px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -3456px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3504px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3552px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3600px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3648px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -3696px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -3744px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -3792px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3840px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3888px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3936px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3984px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -4032px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/editor_ie8.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2064px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -2160px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -2256px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2448px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -2544px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2640px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2688px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2736px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -2784px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2832px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2880px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2928px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2976px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3024px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3072px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3120px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3168px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3216px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3264px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -3312px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -3360px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -3408px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -3456px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3504px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3552px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3600px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3648px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -3696px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -3744px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -3792px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3840px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3888px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3936px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3984px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -4032px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/editor_iequirks.css",
    "content": "/*\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or http://ckeditor.com/license\n*/\n.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type=\"text\"],.cke_reset_all input[type=\"password\"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type=\"text\"][disabled],.cke_reset_all input[type=\"password\"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -2064px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -2160px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -2256px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -2448px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -2544px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2640px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2688px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -2736px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -2784px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2832px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -2880px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2928px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -2976px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3024px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -3072px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3120px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -3168px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3216px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -3264px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -3312px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -3360px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -3408px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -3456px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3504px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -3552px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3600px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -3648px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -3696px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -3744px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -3792px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3840px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -3888px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3936px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -3984px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -4032px !important;}"
  },
  {
    "path": "assets/ckeditor/skins/moonocolor/readme.md",
    "content": "\"Moono\" Skin\r\n====================\r\n\r\nThis skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor\r\n[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by\r\nthe CKEditor team. \"Moono\" is maintained by the core developers.\r\n\r\nFor more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)\r\ndocumentation.\r\n\r\nFeatures\r\n-------------------\r\n\"Moono\" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.\r\nIt comes with the following features:\r\n\r\n- Chameleon feature with brightness,\r\n- high-contrast compatibility,\r\n- graphics source provided in SVG.\r\n\r\nDirectory Structure\r\n-------------------\r\n\r\nCSS parts:\r\n- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,\r\n- **mainui.css**: the file contains styles of entire editor outline structures,\r\n- **toolbar.css**: the file contains styles of the editor toolbar space (top),\r\n- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,\r\n- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded\r\nuntil the first panel open up,\r\n- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),\r\n- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,\r\nit's not loaded until the first menu open up,\r\n- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,\r\n- **reset.css**: the file defines the basis of style resets among all editor UI spaces,\r\n- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,\r\n- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.\r\n\r\nOther parts:\r\n- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,\r\n- **icons/**: contains all skin defined icons,\r\n- **images/**: contains a fill general used images,\r\n- **dev/**: contains SVG source of the skin icons.\r\n\r\nLicense\r\n-------\r\n\r\nCopyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\r\n\r\nLicensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).\r\n\r\nSee LICENSE.md for more information.\r\n"
  },
  {
    "path": "assets/ckeditor/styles.js",
    "content": "﻿/**\n * Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or http://ckeditor.com/license\n */\n\n// This file contains style definitions that can be used by CKEditor plugins.\n//\n// The most common use for it is the \"stylescombo\" plugin, which shows a combo\n// in the editor toolbar, containing all styles. Other plugins instead, like\n// the div plugin, use a subset of the styles on their feature.\n//\n// If you don't have plugins that depend on this file, you can simply ignore it.\n// Otherwise it is strongly recommended to customize this file to match your\n// website requirements and design properly.\n\nCKEDITOR.stylesSet.add( 'default', [\n\t/* Block Styles */\n\n\t// These styles are already available in the \"Format\" combo (\"format\" plugin),\n\t// so they are not needed here by default. You may enable them to avoid\n\t// placing the \"Format\" combo in the toolbar, maintaining the same features.\n\t/*\n\t{ name: 'Paragraph',\t\telement: 'p' },\n\t{ name: 'Heading 1',\t\telement: 'h1' },\n\t{ name: 'Heading 2',\t\telement: 'h2' },\n\t{ name: 'Heading 3',\t\telement: 'h3' },\n\t{ name: 'Heading 4',\t\telement: 'h4' },\n\t{ name: 'Heading 5',\t\telement: 'h5' },\n\t{ name: 'Heading 6',\t\telement: 'h6' },\n\t{ name: 'Preformatted Text',element: 'pre' },\n\t{ name: 'Address',\t\t\telement: 'address' },\n\t*/\n\n\t{ name: 'Italic Title',\t\telement: 'h2', styles: { 'font-style': 'italic' } },\n\t{ name: 'Subtitle',\t\t\telement: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },\n\t{\n\t\tname: 'Special Container',\n\t\telement: 'div',\n\t\tstyles: {\n\t\t\tpadding: '5px 10px',\n\t\t\tbackground: '#eee',\n\t\t\tborder: '1px solid #ccc'\n\t\t}\n\t},\n\n\t/* Inline Styles */\n\n\t// These are core styles available as toolbar buttons. You may opt enabling\n\t// some of them in the Styles combo, removing them from the toolbar.\n\t// (This requires the \"stylescombo\" plugin)\n\t/*\n\t{ name: 'Strong',\t\t\telement: 'strong', overrides: 'b' },\n\t{ name: 'Emphasis',\t\t\telement: 'em'\t, overrides: 'i' },\n\t{ name: 'Underline',\t\telement: 'u' },\n\t{ name: 'Strikethrough',\telement: 'strike' },\n\t{ name: 'Subscript',\t\telement: 'sub' },\n\t{ name: 'Superscript',\t\telement: 'sup' },\n\t*/\n\n\t{ name: 'Marker',\t\t\telement: 'span', attributes: { 'class': 'marker' } },\n\n\t{ name: 'Big',\t\t\t\telement: 'big' },\n\t{ name: 'Small',\t\t\telement: 'small' },\n\t{ name: 'Typewriter',\t\telement: 'tt' },\n\n\t{ name: 'Computer Code',\telement: 'code' },\n\t{ name: 'Keyboard Phrase',\telement: 'kbd' },\n\t{ name: 'Sample Text',\t\telement: 'samp' },\n\t{ name: 'Variable',\t\t\telement: 'var' },\n\n\t{ name: 'Deleted Text',\t\telement: 'del' },\n\t{ name: 'Inserted Text',\telement: 'ins' },\n\n\t{ name: 'Cited Work',\t\telement: 'cite' },\n\t{ name: 'Inline Quotation',\telement: 'q' },\n\n\t{ name: 'Language: RTL',\telement: 'span', attributes: { 'dir': 'rtl' } },\n\t{ name: 'Language: LTR',\telement: 'span', attributes: { 'dir': 'ltr' } },\n\n\t/* Object Styles */\n\n\t{\n\t\tname: 'Styled image (left)',\n\t\telement: 'img',\n\t\tattributes: { 'class': 'left' }\n\t},\n\n\t{\n\t\tname: 'Styled image (right)',\n\t\telement: 'img',\n\t\tattributes: { 'class': 'right' }\n\t},\n\n\t{\n\t\tname: 'Compact table',\n\t\telement: 'table',\n\t\tattributes: {\n\t\t\tcellpadding: '5',\n\t\t\tcellspacing: '0',\n\t\t\tborder: '1',\n\t\t\tbordercolor: '#ccc'\n\t\t},\n\t\tstyles: {\n\t\t\t'border-collapse': 'collapse'\n\t\t}\n\t},\n\n\t{ name: 'Borderless Table',\t\telement: 'table',\tstyles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },\n\t{ name: 'Square Bulleted List',\telement: 'ul',\t\tstyles: { 'list-style-type': 'square' } }\n] );\n\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/HELP-US-OUT.txt",
    "content": "I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,\nFort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,\ncomprehensive icon sets or copy and paste your own.\n\nPlease. Check it out.\n\n-Dave Gandy\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.fa-pull-left {\n  float: left;\n}\n.fa-pull-right {\n  float: right;\n}\n.fa.fa-pull-left {\n  margin-right: .3em;\n}\n.fa.fa-pull-right {\n  margin-left: .3em;\n}\n/* Deprecated as of 4.4.0 */\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-feed:before,\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-resistance:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-genderless:before {\n  content: \"\\f22d\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n  content: \"\\f23b\";\n}\n.fa-optin-monster:before {\n  content: \"\\f23c\";\n}\n.fa-opencart:before {\n  content: \"\\f23d\";\n}\n.fa-expeditedssl:before {\n  content: \"\\f23e\";\n}\n.fa-battery-4:before,\n.fa-battery:before,\n.fa-battery-full:before {\n  content: \"\\f240\";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n  content: \"\\f241\";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n  content: \"\\f242\";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n  content: \"\\f243\";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n  content: \"\\f244\";\n}\n.fa-mouse-pointer:before {\n  content: \"\\f245\";\n}\n.fa-i-cursor:before {\n  content: \"\\f246\";\n}\n.fa-object-group:before {\n  content: \"\\f247\";\n}\n.fa-object-ungroup:before {\n  content: \"\\f248\";\n}\n.fa-sticky-note:before {\n  content: \"\\f249\";\n}\n.fa-sticky-note-o:before {\n  content: \"\\f24a\";\n}\n.fa-cc-jcb:before {\n  content: \"\\f24b\";\n}\n.fa-cc-diners-club:before {\n  content: \"\\f24c\";\n}\n.fa-clone:before {\n  content: \"\\f24d\";\n}\n.fa-balance-scale:before {\n  content: \"\\f24e\";\n}\n.fa-hourglass-o:before {\n  content: \"\\f250\";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n  content: \"\\f251\";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n  content: \"\\f252\";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n  content: \"\\f253\";\n}\n.fa-hourglass:before {\n  content: \"\\f254\";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n  content: \"\\f255\";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n  content: \"\\f256\";\n}\n.fa-hand-scissors-o:before {\n  content: \"\\f257\";\n}\n.fa-hand-lizard-o:before {\n  content: \"\\f258\";\n}\n.fa-hand-spock-o:before {\n  content: \"\\f259\";\n}\n.fa-hand-pointer-o:before {\n  content: \"\\f25a\";\n}\n.fa-hand-peace-o:before {\n  content: \"\\f25b\";\n}\n.fa-trademark:before {\n  content: \"\\f25c\";\n}\n.fa-registered:before {\n  content: \"\\f25d\";\n}\n.fa-creative-commons:before {\n  content: \"\\f25e\";\n}\n.fa-gg:before {\n  content: \"\\f260\";\n}\n.fa-gg-circle:before {\n  content: \"\\f261\";\n}\n.fa-tripadvisor:before {\n  content: \"\\f262\";\n}\n.fa-odnoklassniki:before {\n  content: \"\\f263\";\n}\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\";\n}\n.fa-get-pocket:before {\n  content: \"\\f265\";\n}\n.fa-wikipedia-w:before {\n  content: \"\\f266\";\n}\n.fa-safari:before {\n  content: \"\\f267\";\n}\n.fa-chrome:before {\n  content: \"\\f268\";\n}\n.fa-firefox:before {\n  content: \"\\f269\";\n}\n.fa-opera:before {\n  content: \"\\f26a\";\n}\n.fa-internet-explorer:before {\n  content: \"\\f26b\";\n}\n.fa-tv:before,\n.fa-television:before {\n  content: \"\\f26c\";\n}\n.fa-contao:before {\n  content: \"\\f26d\";\n}\n.fa-500px:before {\n  content: \"\\f26e\";\n}\n.fa-amazon:before {\n  content: \"\\f270\";\n}\n.fa-calendar-plus-o:before {\n  content: \"\\f271\";\n}\n.fa-calendar-minus-o:before {\n  content: \"\\f272\";\n}\n.fa-calendar-times-o:before {\n  content: \"\\f273\";\n}\n.fa-calendar-check-o:before {\n  content: \"\\f274\";\n}\n.fa-industry:before {\n  content: \"\\f275\";\n}\n.fa-map-pin:before {\n  content: \"\\f276\";\n}\n.fa-map-signs:before {\n  content: \"\\f277\";\n}\n.fa-map-o:before {\n  content: \"\\f278\";\n}\n.fa-map:before {\n  content: \"\\f279\";\n}\n.fa-commenting:before {\n  content: \"\\f27a\";\n}\n.fa-commenting-o:before {\n  content: \"\\f27b\";\n}\n.fa-houzz:before {\n  content: \"\\f27c\";\n}\n.fa-vimeo:before {\n  content: \"\\f27d\";\n}\n.fa-black-tie:before {\n  content: \"\\f27e\";\n}\n.fa-fonticons:before {\n  content: \"\\f280\";\n}\n.fa-reddit-alien:before {\n  content: \"\\f281\";\n}\n.fa-edge:before {\n  content: \"\\f282\";\n}\n.fa-credit-card-alt:before {\n  content: \"\\f283\";\n}\n.fa-codiepie:before {\n  content: \"\\f284\";\n}\n.fa-modx:before {\n  content: \"\\f285\";\n}\n.fa-fort-awesome:before {\n  content: \"\\f286\";\n}\n.fa-usb:before {\n  content: \"\\f287\";\n}\n.fa-product-hunt:before {\n  content: \"\\f288\";\n}\n.fa-mixcloud:before {\n  content: \"\\f289\";\n}\n.fa-scribd:before {\n  content: \"\\f28a\";\n}\n.fa-pause-circle:before {\n  content: \"\\f28b\";\n}\n.fa-pause-circle-o:before {\n  content: \"\\f28c\";\n}\n.fa-stop-circle:before {\n  content: \"\\f28d\";\n}\n.fa-stop-circle-o:before {\n  content: \"\\f28e\";\n}\n.fa-shopping-bag:before {\n  content: \"\\f290\";\n}\n.fa-shopping-basket:before {\n  content: \"\\f291\";\n}\n.fa-hashtag:before {\n  content: \"\\f292\";\n}\n.fa-bluetooth:before {\n  content: \"\\f293\";\n}\n.fa-bluetooth-b:before {\n  content: \"\\f294\";\n}\n.fa-percent:before {\n  content: \"\\f295\";\n}\n.fa-gitlab:before {\n  content: \"\\f296\";\n}\n.fa-wpbeginner:before {\n  content: \"\\f297\";\n}\n.fa-wpforms:before {\n  content: \"\\f298\";\n}\n.fa-envira:before {\n  content: \"\\f299\";\n}\n.fa-universal-access:before {\n  content: \"\\f29a\";\n}\n.fa-wheelchair-alt:before {\n  content: \"\\f29b\";\n}\n.fa-question-circle-o:before {\n  content: \"\\f29c\";\n}\n.fa-blind:before {\n  content: \"\\f29d\";\n}\n.fa-audio-description:before {\n  content: \"\\f29e\";\n}\n.fa-volume-control-phone:before {\n  content: \"\\f2a0\";\n}\n.fa-braille:before {\n  content: \"\\f2a1\";\n}\n.fa-assistive-listening-systems:before {\n  content: \"\\f2a2\";\n}\n.fa-asl-interpreting:before,\n.fa-american-sign-language-interpreting:before {\n  content: \"\\f2a3\";\n}\n.fa-deafness:before,\n.fa-hard-of-hearing:before,\n.fa-deaf:before {\n  content: \"\\f2a4\";\n}\n.fa-glide:before {\n  content: \"\\f2a5\";\n}\n.fa-glide-g:before {\n  content: \"\\f2a6\";\n}\n.fa-signing:before,\n.fa-sign-language:before {\n  content: \"\\f2a7\";\n}\n.fa-low-vision:before {\n  content: \"\\f2a8\";\n}\n.fa-viadeo:before {\n  content: \"\\f2a9\";\n}\n.fa-viadeo-square:before {\n  content: \"\\f2aa\";\n}\n.fa-snapchat:before {\n  content: \"\\f2ab\";\n}\n.fa-snapchat-ghost:before {\n  content: \"\\f2ac\";\n}\n.fa-snapchat-square:before {\n  content: \"\\f2ad\";\n}\n.fa-pied-piper:before {\n  content: \"\\f2ae\";\n}\n.fa-first-order:before {\n  content: \"\\f2b0\";\n}\n.fa-yoast:before {\n  content: \"\\f2b1\";\n}\n.fa-themeisle:before {\n  content: \"\\f2b2\";\n}\n.fa-google-plus-circle:before,\n.fa-google-plus-official:before {\n  content: \"\\f2b3\";\n}\n.fa-fa:before,\n.fa-font-awesome:before {\n  content: \"\\f2b4\";\n}\n.fa-handshake-o:before {\n  content: \"\\f2b5\";\n}\n.fa-envelope-open:before {\n  content: \"\\f2b6\";\n}\n.fa-envelope-open-o:before {\n  content: \"\\f2b7\";\n}\n.fa-linode:before {\n  content: \"\\f2b8\";\n}\n.fa-address-book:before {\n  content: \"\\f2b9\";\n}\n.fa-address-book-o:before {\n  content: \"\\f2ba\";\n}\n.fa-vcard:before,\n.fa-address-card:before {\n  content: \"\\f2bb\";\n}\n.fa-vcard-o:before,\n.fa-address-card-o:before {\n  content: \"\\f2bc\";\n}\n.fa-user-circle:before {\n  content: \"\\f2bd\";\n}\n.fa-user-circle-o:before {\n  content: \"\\f2be\";\n}\n.fa-user-o:before {\n  content: \"\\f2c0\";\n}\n.fa-id-badge:before {\n  content: \"\\f2c1\";\n}\n.fa-drivers-license:before,\n.fa-id-card:before {\n  content: \"\\f2c2\";\n}\n.fa-drivers-license-o:before,\n.fa-id-card-o:before {\n  content: \"\\f2c3\";\n}\n.fa-quora:before {\n  content: \"\\f2c4\";\n}\n.fa-free-code-camp:before {\n  content: \"\\f2c5\";\n}\n.fa-telegram:before {\n  content: \"\\f2c6\";\n}\n.fa-thermometer-4:before,\n.fa-thermometer:before,\n.fa-thermometer-full:before {\n  content: \"\\f2c7\";\n}\n.fa-thermometer-3:before,\n.fa-thermometer-three-quarters:before {\n  content: \"\\f2c8\";\n}\n.fa-thermometer-2:before,\n.fa-thermometer-half:before {\n  content: \"\\f2c9\";\n}\n.fa-thermometer-1:before,\n.fa-thermometer-quarter:before {\n  content: \"\\f2ca\";\n}\n.fa-thermometer-0:before,\n.fa-thermometer-empty:before {\n  content: \"\\f2cb\";\n}\n.fa-shower:before {\n  content: \"\\f2cc\";\n}\n.fa-bathtub:before,\n.fa-s15:before,\n.fa-bath:before {\n  content: \"\\f2cd\";\n}\n.fa-podcast:before {\n  content: \"\\f2ce\";\n}\n.fa-window-maximize:before {\n  content: \"\\f2d0\";\n}\n.fa-window-minimize:before {\n  content: \"\\f2d1\";\n}\n.fa-window-restore:before {\n  content: \"\\f2d2\";\n}\n.fa-times-rectangle:before,\n.fa-window-close:before {\n  content: \"\\f2d3\";\n}\n.fa-times-rectangle-o:before,\n.fa-window-close-o:before {\n  content: \"\\f2d4\";\n}\n.fa-bandcamp:before {\n  content: \"\\f2d5\";\n}\n.fa-grav:before {\n  content: \"\\f2d6\";\n}\n.fa-etsy:before {\n  content: \"\\f2d7\";\n}\n.fa-imdb:before {\n  content: \"\\f2d8\";\n}\n.fa-ravelry:before {\n  content: \"\\f2d9\";\n}\n.fa-eercast:before {\n  content: \"\\f2da\";\n}\n.fa-microchip:before {\n  content: \"\\f2db\";\n}\n.fa-snowflake-o:before {\n  content: \"\\f2dc\";\n}\n.fa-superpowers:before {\n  content: \"\\f2dd\";\n}\n.fa-wpexplorer:before {\n  content: \"\\f2de\";\n}\n.fa-meetup:before {\n  content: \"\\f2e0\";\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/animated.less",
    "content": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.@{fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/bordered-pulled.less",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em @fa-border-color;\n  border-radius: .1em;\n}\n\n.@{fa-css-prefix}-pull-left { float: left; }\n.@{fa-css-prefix}-pull-right { float: right; }\n\n.@{fa-css-prefix} {\n  &.@{fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.@{fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.@{fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/core.less",
    "content": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/fixed-width.less",
    "content": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"animated.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n@import \"screen-reader.less\";\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/icons.less",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }\n.@{fa-css-prefix}-music:before { content: @fa-var-music; }\n.@{fa-css-prefix}-search:before { content: @fa-var-search; }\n.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }\n.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }\n.@{fa-css-prefix}-star:before { content: @fa-var-star; }\n.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }\n.@{fa-css-prefix}-user:before { content: @fa-var-user; }\n.@{fa-css-prefix}-film:before { content: @fa-var-film; }\n.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }\n.@{fa-css-prefix}-th:before { content: @fa-var-th; }\n.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }\n.@{fa-css-prefix}-check:before { content: @fa-var-check; }\n.@{fa-css-prefix}-remove:before,\n.@{fa-css-prefix}-close:before,\n.@{fa-css-prefix}-times:before { content: @fa-var-times; }\n.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }\n.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }\n.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }\n.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }\n.@{fa-css-prefix}-gear:before,\n.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }\n.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }\n.@{fa-css-prefix}-home:before { content: @fa-var-home; }\n.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }\n.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }\n.@{fa-css-prefix}-road:before { content: @fa-var-road; }\n.@{fa-css-prefix}-download:before { content: @fa-var-download; }\n.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }\n.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }\n.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }\n.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }\n.@{fa-css-prefix}-rotate-right:before,\n.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }\n.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }\n.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }\n.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }\n.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }\n.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }\n.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }\n.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }\n.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }\n.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }\n.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }\n.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }\n.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }\n.@{fa-css-prefix}-book:before { content: @fa-var-book; }\n.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }\n.@{fa-css-prefix}-print:before { content: @fa-var-print; }\n.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }\n.@{fa-css-prefix}-font:before { content: @fa-var-font; }\n.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }\n.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }\n.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }\n.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }\n.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }\n.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }\n.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }\n.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }\n.@{fa-css-prefix}-list:before { content: @fa-var-list; }\n.@{fa-css-prefix}-dedent:before,\n.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }\n.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }\n.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }\n.@{fa-css-prefix}-photo:before,\n.@{fa-css-prefix}-image:before,\n.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }\n.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }\n.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }\n.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }\n.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }\n.@{fa-css-prefix}-edit:before,\n.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }\n.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }\n.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }\n.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }\n.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }\n.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }\n.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }\n.@{fa-css-prefix}-play:before { content: @fa-var-play; }\n.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }\n.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }\n.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }\n.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }\n.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }\n.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }\n.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }\n.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }\n.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }\n.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }\n.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }\n.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }\n.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }\n.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }\n.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }\n.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }\n.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }\n.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }\n.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }\n.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }\n.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }\n.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }\n.@{fa-css-prefix}-mail-forward:before,\n.@{fa-css-prefix}-share:before { content: @fa-var-share; }\n.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }\n.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }\n.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }\n.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }\n.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }\n.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }\n.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }\n.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }\n.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }\n.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }\n.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }\n.@{fa-css-prefix}-warning:before,\n.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }\n.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }\n.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }\n.@{fa-css-prefix}-random:before { content: @fa-var-random; }\n.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }\n.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }\n.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }\n.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }\n.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }\n.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }\n.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }\n.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }\n.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }\n.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }\n.@{fa-css-prefix}-bar-chart-o:before,\n.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }\n.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }\n.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }\n.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }\n.@{fa-css-prefix}-key:before { content: @fa-var-key; }\n.@{fa-css-prefix}-gears:before,\n.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }\n.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }\n.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }\n.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }\n.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }\n.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }\n.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }\n.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }\n.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }\n.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }\n.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }\n.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }\n.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }\n.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }\n.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }\n.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }\n.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }\n.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }\n.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }\n.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }\n.@{fa-css-prefix}-facebook-f:before,\n.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }\n.@{fa-css-prefix}-github:before { content: @fa-var-github; }\n.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }\n.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }\n.@{fa-css-prefix}-feed:before,\n.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }\n.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }\n.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }\n.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }\n.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }\n.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }\n.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }\n.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }\n.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }\n.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }\n.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }\n.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }\n.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }\n.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }\n.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }\n.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }\n.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }\n.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }\n.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }\n.@{fa-css-prefix}-group:before,\n.@{fa-css-prefix}-users:before { content: @fa-var-users; }\n.@{fa-css-prefix}-chain:before,\n.@{fa-css-prefix}-link:before { content: @fa-var-link; }\n.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }\n.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }\n.@{fa-css-prefix}-cut:before,\n.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }\n.@{fa-css-prefix}-copy:before,\n.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }\n.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }\n.@{fa-css-prefix}-save:before,\n.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }\n.@{fa-css-prefix}-square:before { content: @fa-var-square; }\n.@{fa-css-prefix}-navicon:before,\n.@{fa-css-prefix}-reorder:before,\n.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }\n.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }\n.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }\n.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }\n.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }\n.@{fa-css-prefix}-table:before { content: @fa-var-table; }\n.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }\n.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }\n.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }\n.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }\n.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }\n.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }\n.@{fa-css-prefix}-money:before { content: @fa-var-money; }\n.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }\n.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }\n.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }\n.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }\n.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }\n.@{fa-css-prefix}-unsorted:before,\n.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }\n.@{fa-css-prefix}-sort-down:before,\n.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }\n.@{fa-css-prefix}-sort-up:before,\n.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }\n.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }\n.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }\n.@{fa-css-prefix}-rotate-left:before,\n.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }\n.@{fa-css-prefix}-legal:before,\n.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }\n.@{fa-css-prefix}-dashboard:before,\n.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }\n.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }\n.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }\n.@{fa-css-prefix}-flash:before,\n.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }\n.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }\n.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }\n.@{fa-css-prefix}-paste:before,\n.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }\n.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }\n.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }\n.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }\n.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }\n.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }\n.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }\n.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }\n.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }\n.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }\n.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }\n.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }\n.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }\n.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }\n.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }\n.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }\n.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }\n.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }\n.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }\n.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }\n.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }\n.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }\n.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }\n.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }\n.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }\n.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }\n.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }\n.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }\n.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }\n.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }\n.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }\n.@{fa-css-prefix}-mobile-phone:before,\n.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }\n.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }\n.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }\n.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }\n.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }\n.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }\n.@{fa-css-prefix}-mail-reply:before,\n.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }\n.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }\n.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }\n.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }\n.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }\n.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }\n.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }\n.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }\n.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }\n.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }\n.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }\n.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }\n.@{fa-css-prefix}-code:before { content: @fa-var-code; }\n.@{fa-css-prefix}-mail-reply-all:before,\n.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }\n.@{fa-css-prefix}-star-half-empty:before,\n.@{fa-css-prefix}-star-half-full:before,\n.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }\n.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }\n.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }\n.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }\n.@{fa-css-prefix}-unlink:before,\n.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }\n.@{fa-css-prefix}-question:before { content: @fa-var-question; }\n.@{fa-css-prefix}-info:before { content: @fa-var-info; }\n.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }\n.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }\n.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }\n.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }\n.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }\n.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }\n.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }\n.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }\n.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }\n.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }\n.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }\n.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }\n.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }\n.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }\n.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }\n.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }\n.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }\n.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }\n.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }\n.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }\n.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }\n.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }\n.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }\n.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }\n.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }\n.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }\n.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }\n.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }\n.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }\n.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }\n.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }\n.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }\n.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }\n.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }\n.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }\n.@{fa-css-prefix}-toggle-down:before,\n.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }\n.@{fa-css-prefix}-toggle-up:before,\n.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }\n.@{fa-css-prefix}-toggle-right:before,\n.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }\n.@{fa-css-prefix}-euro:before,\n.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }\n.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }\n.@{fa-css-prefix}-dollar:before,\n.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }\n.@{fa-css-prefix}-rupee:before,\n.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }\n.@{fa-css-prefix}-cny:before,\n.@{fa-css-prefix}-rmb:before,\n.@{fa-css-prefix}-yen:before,\n.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }\n.@{fa-css-prefix}-ruble:before,\n.@{fa-css-prefix}-rouble:before,\n.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }\n.@{fa-css-prefix}-won:before,\n.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }\n.@{fa-css-prefix}-bitcoin:before,\n.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }\n.@{fa-css-prefix}-file:before { content: @fa-var-file; }\n.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }\n.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }\n.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }\n.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }\n.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }\n.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }\n.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }\n.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }\n.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }\n.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }\n.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }\n.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }\n.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }\n.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }\n.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }\n.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }\n.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }\n.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }\n.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }\n.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }\n.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }\n.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }\n.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }\n.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }\n.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }\n.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }\n.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }\n.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }\n.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }\n.@{fa-css-prefix}-android:before { content: @fa-var-android; }\n.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }\n.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }\n.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }\n.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }\n.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }\n.@{fa-css-prefix}-female:before { content: @fa-var-female; }\n.@{fa-css-prefix}-male:before { content: @fa-var-male; }\n.@{fa-css-prefix}-gittip:before,\n.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }\n.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }\n.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }\n.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }\n.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }\n.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }\n.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }\n.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }\n.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }\n.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }\n.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }\n.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }\n.@{fa-css-prefix}-toggle-left:before,\n.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }\n.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }\n.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }\n.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }\n.@{fa-css-prefix}-turkish-lira:before,\n.@{fa-css-prefix}-try:before { content: @fa-var-try; }\n.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }\n.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }\n.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }\n.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }\n.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }\n.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }\n.@{fa-css-prefix}-institution:before,\n.@{fa-css-prefix}-bank:before,\n.@{fa-css-prefix}-university:before { content: @fa-var-university; }\n.@{fa-css-prefix}-mortar-board:before,\n.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }\n.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }\n.@{fa-css-prefix}-google:before { content: @fa-var-google; }\n.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }\n.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }\n.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }\n.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }\n.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }\n.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }\n.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }\n.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }\n.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }\n.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }\n.@{fa-css-prefix}-language:before { content: @fa-var-language; }\n.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }\n.@{fa-css-prefix}-building:before { content: @fa-var-building; }\n.@{fa-css-prefix}-child:before { content: @fa-var-child; }\n.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }\n.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }\n.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }\n.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }\n.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }\n.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }\n.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }\n.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }\n.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }\n.@{fa-css-prefix}-automobile:before,\n.@{fa-css-prefix}-car:before { content: @fa-var-car; }\n.@{fa-css-prefix}-cab:before,\n.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }\n.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }\n.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }\n.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }\n.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }\n.@{fa-css-prefix}-database:before { content: @fa-var-database; }\n.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }\n.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }\n.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }\n.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }\n.@{fa-css-prefix}-file-photo-o:before,\n.@{fa-css-prefix}-file-picture-o:before,\n.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }\n.@{fa-css-prefix}-file-zip-o:before,\n.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }\n.@{fa-css-prefix}-file-sound-o:before,\n.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }\n.@{fa-css-prefix}-file-movie-o:before,\n.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }\n.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }\n.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }\n.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }\n.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }\n.@{fa-css-prefix}-life-bouy:before,\n.@{fa-css-prefix}-life-buoy:before,\n.@{fa-css-prefix}-life-saver:before,\n.@{fa-css-prefix}-support:before,\n.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }\n.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }\n.@{fa-css-prefix}-ra:before,\n.@{fa-css-prefix}-resistance:before,\n.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }\n.@{fa-css-prefix}-ge:before,\n.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }\n.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }\n.@{fa-css-prefix}-git:before { content: @fa-var-git; }\n.@{fa-css-prefix}-y-combinator-square:before,\n.@{fa-css-prefix}-yc-square:before,\n.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }\n.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }\n.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }\n.@{fa-css-prefix}-wechat:before,\n.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }\n.@{fa-css-prefix}-send:before,\n.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }\n.@{fa-css-prefix}-send-o:before,\n.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }\n.@{fa-css-prefix}-history:before { content: @fa-var-history; }\n.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }\n.@{fa-css-prefix}-header:before { content: @fa-var-header; }\n.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }\n.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }\n.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }\n.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }\n.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }\n.@{fa-css-prefix}-soccer-ball-o:before,\n.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }\n.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }\n.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }\n.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }\n.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }\n.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }\n.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }\n.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }\n.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }\n.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }\n.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }\n.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }\n.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }\n.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }\n.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }\n.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }\n.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }\n.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }\n.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }\n.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }\n.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }\n.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }\n.@{fa-css-prefix}-at:before { content: @fa-var-at; }\n.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }\n.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }\n.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }\n.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }\n.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }\n.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }\n.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }\n.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }\n.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }\n.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }\n.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }\n.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }\n.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }\n.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }\n.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }\n.@{fa-css-prefix}-shekel:before,\n.@{fa-css-prefix}-sheqel:before,\n.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }\n.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }\n.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }\n.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }\n.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }\n.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }\n.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }\n.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }\n.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }\n.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }\n.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }\n.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }\n.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }\n.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }\n.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }\n.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }\n.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }\n.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }\n.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }\n.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }\n.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }\n.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }\n.@{fa-css-prefix}-intersex:before,\n.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }\n.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }\n.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }\n.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }\n.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }\n.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }\n.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }\n.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }\n.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }\n.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }\n.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }\n.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }\n.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }\n.@{fa-css-prefix}-server:before { content: @fa-var-server; }\n.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }\n.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }\n.@{fa-css-prefix}-hotel:before,\n.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }\n.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }\n.@{fa-css-prefix}-train:before { content: @fa-var-train; }\n.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }\n.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }\n.@{fa-css-prefix}-yc:before,\n.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }\n.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }\n.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }\n.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }\n.@{fa-css-prefix}-battery-4:before,\n.@{fa-css-prefix}-battery:before,\n.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }\n.@{fa-css-prefix}-battery-3:before,\n.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }\n.@{fa-css-prefix}-battery-2:before,\n.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }\n.@{fa-css-prefix}-battery-1:before,\n.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }\n.@{fa-css-prefix}-battery-0:before,\n.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }\n.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }\n.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }\n.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }\n.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }\n.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }\n.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }\n.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }\n.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }\n.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }\n.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }\n.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }\n.@{fa-css-prefix}-hourglass-1:before,\n.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }\n.@{fa-css-prefix}-hourglass-2:before,\n.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }\n.@{fa-css-prefix}-hourglass-3:before,\n.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }\n.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }\n.@{fa-css-prefix}-hand-grab-o:before,\n.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }\n.@{fa-css-prefix}-hand-stop-o:before,\n.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }\n.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }\n.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }\n.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }\n.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }\n.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }\n.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }\n.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }\n.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }\n.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }\n.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }\n.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }\n.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }\n.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }\n.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }\n.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }\n.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }\n.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }\n.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }\n.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }\n.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }\n.@{fa-css-prefix}-tv:before,\n.@{fa-css-prefix}-television:before { content: @fa-var-television; }\n.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }\n.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }\n.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }\n.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }\n.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }\n.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }\n.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }\n.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }\n.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }\n.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }\n.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }\n.@{fa-css-prefix}-map:before { content: @fa-var-map; }\n.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }\n.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }\n.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }\n.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }\n.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }\n.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }\n.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }\n.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }\n.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }\n.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }\n.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }\n.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }\n.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }\n.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }\n.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }\n.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }\n.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }\n.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }\n.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }\n.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }\n.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }\n.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }\n.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }\n.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }\n.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }\n.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }\n.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }\n.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }\n.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }\n.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }\n.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }\n.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }\n.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }\n.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }\n.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }\n.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }\n.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }\n.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }\n.@{fa-css-prefix}-asl-interpreting:before,\n.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }\n.@{fa-css-prefix}-deafness:before,\n.@{fa-css-prefix}-hard-of-hearing:before,\n.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }\n.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }\n.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }\n.@{fa-css-prefix}-signing:before,\n.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }\n.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }\n.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }\n.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }\n.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }\n.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }\n.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }\n.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }\n.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }\n.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }\n.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }\n.@{fa-css-prefix}-google-plus-circle:before,\n.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }\n.@{fa-css-prefix}-fa:before,\n.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }\n.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; }\n.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; }\n.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; }\n.@{fa-css-prefix}-linode:before { content: @fa-var-linode; }\n.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; }\n.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; }\n.@{fa-css-prefix}-vcard:before,\n.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; }\n.@{fa-css-prefix}-vcard-o:before,\n.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; }\n.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; }\n.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; }\n.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; }\n.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; }\n.@{fa-css-prefix}-drivers-license:before,\n.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; }\n.@{fa-css-prefix}-drivers-license-o:before,\n.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; }\n.@{fa-css-prefix}-quora:before { content: @fa-var-quora; }\n.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; }\n.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; }\n.@{fa-css-prefix}-thermometer-4:before,\n.@{fa-css-prefix}-thermometer:before,\n.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; }\n.@{fa-css-prefix}-thermometer-3:before,\n.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; }\n.@{fa-css-prefix}-thermometer-2:before,\n.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; }\n.@{fa-css-prefix}-thermometer-1:before,\n.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; }\n.@{fa-css-prefix}-thermometer-0:before,\n.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; }\n.@{fa-css-prefix}-shower:before { content: @fa-var-shower; }\n.@{fa-css-prefix}-bathtub:before,\n.@{fa-css-prefix}-s15:before,\n.@{fa-css-prefix}-bath:before { content: @fa-var-bath; }\n.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; }\n.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; }\n.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; }\n.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; }\n.@{fa-css-prefix}-times-rectangle:before,\n.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; }\n.@{fa-css-prefix}-times-rectangle-o:before,\n.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; }\n.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; }\n.@{fa-css-prefix}-grav:before { content: @fa-var-grav; }\n.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; }\n.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; }\n.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; }\n.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; }\n.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; }\n.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; }\n.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; }\n.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; }\n.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/larger.less",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.@{fa-css-prefix}-2x { font-size: 2em; }\n.@{fa-css-prefix}-3x { font-size: 3em; }\n.@{fa-css-prefix}-4x { font-size: 4em; }\n.@{fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/list.less",
    "content": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.@{fa-css-prefix}-li {\n  position: absolute;\n  left: -@fa-li-width;\n  width: @fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.@{fa-css-prefix}-lg {\n    left: (-@fa-li-width + (4em / 14));\n  }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/mixins.less",
    "content": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n.fa-icon-rotate(@degrees, @rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})\";\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n\n.fa-icon-flip(@horiz, @vert, @rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)\";\n  -webkit-transform: scale(@horiz, @vert);\n      -ms-transform: scale(@horiz, @vert);\n          transform: scale(@horiz, @vert);\n}\n\n\n// Only display content to screen readers. A la Bootstrap 4.\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only() {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable() {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/path.less",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),\n    url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),\n    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),\n    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),\n    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');\n  // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/rotated-flipped.less",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }\n.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }\n\n.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }\n.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .@{fa-css-prefix}-rotate-90,\n:root .@{fa-css-prefix}-rotate-180,\n:root .@{fa-css-prefix}-rotate-270,\n:root .@{fa-css-prefix}-flip-horizontal,\n:root .@{fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/screen-reader.less",
    "content": "// Screen Readers\n// -------------------------\n\n.sr-only { .sr-only(); }\n.sr-only-focusable { .sr-only-focusable(); }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/stacked.less",
    "content": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.@{fa-css-prefix}-stack-1x { line-height: inherit; }\n.@{fa-css-prefix}-stack-2x { font-size: 2em; }\n.@{fa-css-prefix}-inverse { color: @fa-inverse; }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/less/variables.less",
    "content": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n@fa-font-size-base:   14px;\n@fa-line-height-base: 1;\n//@fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts\"; // for referencing Bootstrap CDN font files directly\n@fa-css-prefix:       fa;\n@fa-version:          \"4.7.0\";\n@fa-border-color:     #eee;\n@fa-inverse:          #fff;\n@fa-li-width:         (30em / 14);\n\n@fa-var-500px: \"\\f26e\";\n@fa-var-address-book: \"\\f2b9\";\n@fa-var-address-book-o: \"\\f2ba\";\n@fa-var-address-card: \"\\f2bb\";\n@fa-var-address-card-o: \"\\f2bc\";\n@fa-var-adjust: \"\\f042\";\n@fa-var-adn: \"\\f170\";\n@fa-var-align-center: \"\\f037\";\n@fa-var-align-justify: \"\\f039\";\n@fa-var-align-left: \"\\f036\";\n@fa-var-align-right: \"\\f038\";\n@fa-var-amazon: \"\\f270\";\n@fa-var-ambulance: \"\\f0f9\";\n@fa-var-american-sign-language-interpreting: \"\\f2a3\";\n@fa-var-anchor: \"\\f13d\";\n@fa-var-android: \"\\f17b\";\n@fa-var-angellist: \"\\f209\";\n@fa-var-angle-double-down: \"\\f103\";\n@fa-var-angle-double-left: \"\\f100\";\n@fa-var-angle-double-right: \"\\f101\";\n@fa-var-angle-double-up: \"\\f102\";\n@fa-var-angle-down: \"\\f107\";\n@fa-var-angle-left: \"\\f104\";\n@fa-var-angle-right: \"\\f105\";\n@fa-var-angle-up: \"\\f106\";\n@fa-var-apple: \"\\f179\";\n@fa-var-archive: \"\\f187\";\n@fa-var-area-chart: \"\\f1fe\";\n@fa-var-arrow-circle-down: \"\\f0ab\";\n@fa-var-arrow-circle-left: \"\\f0a8\";\n@fa-var-arrow-circle-o-down: \"\\f01a\";\n@fa-var-arrow-circle-o-left: \"\\f190\";\n@fa-var-arrow-circle-o-right: \"\\f18e\";\n@fa-var-arrow-circle-o-up: \"\\f01b\";\n@fa-var-arrow-circle-right: \"\\f0a9\";\n@fa-var-arrow-circle-up: \"\\f0aa\";\n@fa-var-arrow-down: \"\\f063\";\n@fa-var-arrow-left: \"\\f060\";\n@fa-var-arrow-right: \"\\f061\";\n@fa-var-arrow-up: \"\\f062\";\n@fa-var-arrows: \"\\f047\";\n@fa-var-arrows-alt: \"\\f0b2\";\n@fa-var-arrows-h: \"\\f07e\";\n@fa-var-arrows-v: \"\\f07d\";\n@fa-var-asl-interpreting: \"\\f2a3\";\n@fa-var-assistive-listening-systems: \"\\f2a2\";\n@fa-var-asterisk: \"\\f069\";\n@fa-var-at: \"\\f1fa\";\n@fa-var-audio-description: \"\\f29e\";\n@fa-var-automobile: \"\\f1b9\";\n@fa-var-backward: \"\\f04a\";\n@fa-var-balance-scale: \"\\f24e\";\n@fa-var-ban: \"\\f05e\";\n@fa-var-bandcamp: \"\\f2d5\";\n@fa-var-bank: \"\\f19c\";\n@fa-var-bar-chart: \"\\f080\";\n@fa-var-bar-chart-o: \"\\f080\";\n@fa-var-barcode: \"\\f02a\";\n@fa-var-bars: \"\\f0c9\";\n@fa-var-bath: \"\\f2cd\";\n@fa-var-bathtub: \"\\f2cd\";\n@fa-var-battery: \"\\f240\";\n@fa-var-battery-0: \"\\f244\";\n@fa-var-battery-1: \"\\f243\";\n@fa-var-battery-2: \"\\f242\";\n@fa-var-battery-3: \"\\f241\";\n@fa-var-battery-4: \"\\f240\";\n@fa-var-battery-empty: \"\\f244\";\n@fa-var-battery-full: \"\\f240\";\n@fa-var-battery-half: \"\\f242\";\n@fa-var-battery-quarter: \"\\f243\";\n@fa-var-battery-three-quarters: \"\\f241\";\n@fa-var-bed: \"\\f236\";\n@fa-var-beer: \"\\f0fc\";\n@fa-var-behance: \"\\f1b4\";\n@fa-var-behance-square: \"\\f1b5\";\n@fa-var-bell: \"\\f0f3\";\n@fa-var-bell-o: \"\\f0a2\";\n@fa-var-bell-slash: \"\\f1f6\";\n@fa-var-bell-slash-o: \"\\f1f7\";\n@fa-var-bicycle: \"\\f206\";\n@fa-var-binoculars: \"\\f1e5\";\n@fa-var-birthday-cake: \"\\f1fd\";\n@fa-var-bitbucket: \"\\f171\";\n@fa-var-bitbucket-square: \"\\f172\";\n@fa-var-bitcoin: \"\\f15a\";\n@fa-var-black-tie: \"\\f27e\";\n@fa-var-blind: \"\\f29d\";\n@fa-var-bluetooth: \"\\f293\";\n@fa-var-bluetooth-b: \"\\f294\";\n@fa-var-bold: \"\\f032\";\n@fa-var-bolt: \"\\f0e7\";\n@fa-var-bomb: \"\\f1e2\";\n@fa-var-book: \"\\f02d\";\n@fa-var-bookmark: \"\\f02e\";\n@fa-var-bookmark-o: \"\\f097\";\n@fa-var-braille: \"\\f2a1\";\n@fa-var-briefcase: \"\\f0b1\";\n@fa-var-btc: \"\\f15a\";\n@fa-var-bug: \"\\f188\";\n@fa-var-building: \"\\f1ad\";\n@fa-var-building-o: \"\\f0f7\";\n@fa-var-bullhorn: \"\\f0a1\";\n@fa-var-bullseye: \"\\f140\";\n@fa-var-bus: \"\\f207\";\n@fa-var-buysellads: \"\\f20d\";\n@fa-var-cab: \"\\f1ba\";\n@fa-var-calculator: \"\\f1ec\";\n@fa-var-calendar: \"\\f073\";\n@fa-var-calendar-check-o: \"\\f274\";\n@fa-var-calendar-minus-o: \"\\f272\";\n@fa-var-calendar-o: \"\\f133\";\n@fa-var-calendar-plus-o: \"\\f271\";\n@fa-var-calendar-times-o: \"\\f273\";\n@fa-var-camera: \"\\f030\";\n@fa-var-camera-retro: \"\\f083\";\n@fa-var-car: \"\\f1b9\";\n@fa-var-caret-down: \"\\f0d7\";\n@fa-var-caret-left: \"\\f0d9\";\n@fa-var-caret-right: \"\\f0da\";\n@fa-var-caret-square-o-down: \"\\f150\";\n@fa-var-caret-square-o-left: \"\\f191\";\n@fa-var-caret-square-o-right: \"\\f152\";\n@fa-var-caret-square-o-up: \"\\f151\";\n@fa-var-caret-up: \"\\f0d8\";\n@fa-var-cart-arrow-down: \"\\f218\";\n@fa-var-cart-plus: \"\\f217\";\n@fa-var-cc: \"\\f20a\";\n@fa-var-cc-amex: \"\\f1f3\";\n@fa-var-cc-diners-club: \"\\f24c\";\n@fa-var-cc-discover: \"\\f1f2\";\n@fa-var-cc-jcb: \"\\f24b\";\n@fa-var-cc-mastercard: \"\\f1f1\";\n@fa-var-cc-paypal: \"\\f1f4\";\n@fa-var-cc-stripe: \"\\f1f5\";\n@fa-var-cc-visa: \"\\f1f0\";\n@fa-var-certificate: \"\\f0a3\";\n@fa-var-chain: \"\\f0c1\";\n@fa-var-chain-broken: \"\\f127\";\n@fa-var-check: \"\\f00c\";\n@fa-var-check-circle: \"\\f058\";\n@fa-var-check-circle-o: \"\\f05d\";\n@fa-var-check-square: \"\\f14a\";\n@fa-var-check-square-o: \"\\f046\";\n@fa-var-chevron-circle-down: \"\\f13a\";\n@fa-var-chevron-circle-left: \"\\f137\";\n@fa-var-chevron-circle-right: \"\\f138\";\n@fa-var-chevron-circle-up: \"\\f139\";\n@fa-var-chevron-down: \"\\f078\";\n@fa-var-chevron-left: \"\\f053\";\n@fa-var-chevron-right: \"\\f054\";\n@fa-var-chevron-up: \"\\f077\";\n@fa-var-child: \"\\f1ae\";\n@fa-var-chrome: \"\\f268\";\n@fa-var-circle: \"\\f111\";\n@fa-var-circle-o: \"\\f10c\";\n@fa-var-circle-o-notch: \"\\f1ce\";\n@fa-var-circle-thin: \"\\f1db\";\n@fa-var-clipboard: \"\\f0ea\";\n@fa-var-clock-o: \"\\f017\";\n@fa-var-clone: \"\\f24d\";\n@fa-var-close: \"\\f00d\";\n@fa-var-cloud: \"\\f0c2\";\n@fa-var-cloud-download: \"\\f0ed\";\n@fa-var-cloud-upload: \"\\f0ee\";\n@fa-var-cny: \"\\f157\";\n@fa-var-code: \"\\f121\";\n@fa-var-code-fork: \"\\f126\";\n@fa-var-codepen: \"\\f1cb\";\n@fa-var-codiepie: \"\\f284\";\n@fa-var-coffee: \"\\f0f4\";\n@fa-var-cog: \"\\f013\";\n@fa-var-cogs: \"\\f085\";\n@fa-var-columns: \"\\f0db\";\n@fa-var-comment: \"\\f075\";\n@fa-var-comment-o: \"\\f0e5\";\n@fa-var-commenting: \"\\f27a\";\n@fa-var-commenting-o: \"\\f27b\";\n@fa-var-comments: \"\\f086\";\n@fa-var-comments-o: \"\\f0e6\";\n@fa-var-compass: \"\\f14e\";\n@fa-var-compress: \"\\f066\";\n@fa-var-connectdevelop: \"\\f20e\";\n@fa-var-contao: \"\\f26d\";\n@fa-var-copy: \"\\f0c5\";\n@fa-var-copyright: \"\\f1f9\";\n@fa-var-creative-commons: \"\\f25e\";\n@fa-var-credit-card: \"\\f09d\";\n@fa-var-credit-card-alt: \"\\f283\";\n@fa-var-crop: \"\\f125\";\n@fa-var-crosshairs: \"\\f05b\";\n@fa-var-css3: \"\\f13c\";\n@fa-var-cube: \"\\f1b2\";\n@fa-var-cubes: \"\\f1b3\";\n@fa-var-cut: \"\\f0c4\";\n@fa-var-cutlery: \"\\f0f5\";\n@fa-var-dashboard: \"\\f0e4\";\n@fa-var-dashcube: \"\\f210\";\n@fa-var-database: \"\\f1c0\";\n@fa-var-deaf: \"\\f2a4\";\n@fa-var-deafness: \"\\f2a4\";\n@fa-var-dedent: \"\\f03b\";\n@fa-var-delicious: \"\\f1a5\";\n@fa-var-desktop: \"\\f108\";\n@fa-var-deviantart: \"\\f1bd\";\n@fa-var-diamond: \"\\f219\";\n@fa-var-digg: \"\\f1a6\";\n@fa-var-dollar: \"\\f155\";\n@fa-var-dot-circle-o: \"\\f192\";\n@fa-var-download: \"\\f019\";\n@fa-var-dribbble: \"\\f17d\";\n@fa-var-drivers-license: \"\\f2c2\";\n@fa-var-drivers-license-o: \"\\f2c3\";\n@fa-var-dropbox: \"\\f16b\";\n@fa-var-drupal: \"\\f1a9\";\n@fa-var-edge: \"\\f282\";\n@fa-var-edit: \"\\f044\";\n@fa-var-eercast: \"\\f2da\";\n@fa-var-eject: \"\\f052\";\n@fa-var-ellipsis-h: \"\\f141\";\n@fa-var-ellipsis-v: \"\\f142\";\n@fa-var-empire: \"\\f1d1\";\n@fa-var-envelope: \"\\f0e0\";\n@fa-var-envelope-o: \"\\f003\";\n@fa-var-envelope-open: \"\\f2b6\";\n@fa-var-envelope-open-o: \"\\f2b7\";\n@fa-var-envelope-square: \"\\f199\";\n@fa-var-envira: \"\\f299\";\n@fa-var-eraser: \"\\f12d\";\n@fa-var-etsy: \"\\f2d7\";\n@fa-var-eur: \"\\f153\";\n@fa-var-euro: \"\\f153\";\n@fa-var-exchange: \"\\f0ec\";\n@fa-var-exclamation: \"\\f12a\";\n@fa-var-exclamation-circle: \"\\f06a\";\n@fa-var-exclamation-triangle: \"\\f071\";\n@fa-var-expand: \"\\f065\";\n@fa-var-expeditedssl: \"\\f23e\";\n@fa-var-external-link: \"\\f08e\";\n@fa-var-external-link-square: \"\\f14c\";\n@fa-var-eye: \"\\f06e\";\n@fa-var-eye-slash: \"\\f070\";\n@fa-var-eyedropper: \"\\f1fb\";\n@fa-var-fa: \"\\f2b4\";\n@fa-var-facebook: \"\\f09a\";\n@fa-var-facebook-f: \"\\f09a\";\n@fa-var-facebook-official: \"\\f230\";\n@fa-var-facebook-square: \"\\f082\";\n@fa-var-fast-backward: \"\\f049\";\n@fa-var-fast-forward: \"\\f050\";\n@fa-var-fax: \"\\f1ac\";\n@fa-var-feed: \"\\f09e\";\n@fa-var-female: \"\\f182\";\n@fa-var-fighter-jet: \"\\f0fb\";\n@fa-var-file: \"\\f15b\";\n@fa-var-file-archive-o: \"\\f1c6\";\n@fa-var-file-audio-o: \"\\f1c7\";\n@fa-var-file-code-o: \"\\f1c9\";\n@fa-var-file-excel-o: \"\\f1c3\";\n@fa-var-file-image-o: \"\\f1c5\";\n@fa-var-file-movie-o: \"\\f1c8\";\n@fa-var-file-o: \"\\f016\";\n@fa-var-file-pdf-o: \"\\f1c1\";\n@fa-var-file-photo-o: \"\\f1c5\";\n@fa-var-file-picture-o: \"\\f1c5\";\n@fa-var-file-powerpoint-o: \"\\f1c4\";\n@fa-var-file-sound-o: \"\\f1c7\";\n@fa-var-file-text: \"\\f15c\";\n@fa-var-file-text-o: \"\\f0f6\";\n@fa-var-file-video-o: \"\\f1c8\";\n@fa-var-file-word-o: \"\\f1c2\";\n@fa-var-file-zip-o: \"\\f1c6\";\n@fa-var-files-o: \"\\f0c5\";\n@fa-var-film: \"\\f008\";\n@fa-var-filter: \"\\f0b0\";\n@fa-var-fire: \"\\f06d\";\n@fa-var-fire-extinguisher: \"\\f134\";\n@fa-var-firefox: \"\\f269\";\n@fa-var-first-order: \"\\f2b0\";\n@fa-var-flag: \"\\f024\";\n@fa-var-flag-checkered: \"\\f11e\";\n@fa-var-flag-o: \"\\f11d\";\n@fa-var-flash: \"\\f0e7\";\n@fa-var-flask: \"\\f0c3\";\n@fa-var-flickr: \"\\f16e\";\n@fa-var-floppy-o: \"\\f0c7\";\n@fa-var-folder: \"\\f07b\";\n@fa-var-folder-o: \"\\f114\";\n@fa-var-folder-open: \"\\f07c\";\n@fa-var-folder-open-o: \"\\f115\";\n@fa-var-font: \"\\f031\";\n@fa-var-font-awesome: \"\\f2b4\";\n@fa-var-fonticons: \"\\f280\";\n@fa-var-fort-awesome: \"\\f286\";\n@fa-var-forumbee: \"\\f211\";\n@fa-var-forward: \"\\f04e\";\n@fa-var-foursquare: \"\\f180\";\n@fa-var-free-code-camp: \"\\f2c5\";\n@fa-var-frown-o: \"\\f119\";\n@fa-var-futbol-o: \"\\f1e3\";\n@fa-var-gamepad: \"\\f11b\";\n@fa-var-gavel: \"\\f0e3\";\n@fa-var-gbp: \"\\f154\";\n@fa-var-ge: \"\\f1d1\";\n@fa-var-gear: \"\\f013\";\n@fa-var-gears: \"\\f085\";\n@fa-var-genderless: \"\\f22d\";\n@fa-var-get-pocket: \"\\f265\";\n@fa-var-gg: \"\\f260\";\n@fa-var-gg-circle: \"\\f261\";\n@fa-var-gift: \"\\f06b\";\n@fa-var-git: \"\\f1d3\";\n@fa-var-git-square: \"\\f1d2\";\n@fa-var-github: \"\\f09b\";\n@fa-var-github-alt: \"\\f113\";\n@fa-var-github-square: \"\\f092\";\n@fa-var-gitlab: \"\\f296\";\n@fa-var-gittip: \"\\f184\";\n@fa-var-glass: \"\\f000\";\n@fa-var-glide: \"\\f2a5\";\n@fa-var-glide-g: \"\\f2a6\";\n@fa-var-globe: \"\\f0ac\";\n@fa-var-google: \"\\f1a0\";\n@fa-var-google-plus: \"\\f0d5\";\n@fa-var-google-plus-circle: \"\\f2b3\";\n@fa-var-google-plus-official: \"\\f2b3\";\n@fa-var-google-plus-square: \"\\f0d4\";\n@fa-var-google-wallet: \"\\f1ee\";\n@fa-var-graduation-cap: \"\\f19d\";\n@fa-var-gratipay: \"\\f184\";\n@fa-var-grav: \"\\f2d6\";\n@fa-var-group: \"\\f0c0\";\n@fa-var-h-square: \"\\f0fd\";\n@fa-var-hacker-news: \"\\f1d4\";\n@fa-var-hand-grab-o: \"\\f255\";\n@fa-var-hand-lizard-o: \"\\f258\";\n@fa-var-hand-o-down: \"\\f0a7\";\n@fa-var-hand-o-left: \"\\f0a5\";\n@fa-var-hand-o-right: \"\\f0a4\";\n@fa-var-hand-o-up: \"\\f0a6\";\n@fa-var-hand-paper-o: \"\\f256\";\n@fa-var-hand-peace-o: \"\\f25b\";\n@fa-var-hand-pointer-o: \"\\f25a\";\n@fa-var-hand-rock-o: \"\\f255\";\n@fa-var-hand-scissors-o: \"\\f257\";\n@fa-var-hand-spock-o: \"\\f259\";\n@fa-var-hand-stop-o: \"\\f256\";\n@fa-var-handshake-o: \"\\f2b5\";\n@fa-var-hard-of-hearing: \"\\f2a4\";\n@fa-var-hashtag: \"\\f292\";\n@fa-var-hdd-o: \"\\f0a0\";\n@fa-var-header: \"\\f1dc\";\n@fa-var-headphones: \"\\f025\";\n@fa-var-heart: \"\\f004\";\n@fa-var-heart-o: \"\\f08a\";\n@fa-var-heartbeat: \"\\f21e\";\n@fa-var-history: \"\\f1da\";\n@fa-var-home: \"\\f015\";\n@fa-var-hospital-o: \"\\f0f8\";\n@fa-var-hotel: \"\\f236\";\n@fa-var-hourglass: \"\\f254\";\n@fa-var-hourglass-1: \"\\f251\";\n@fa-var-hourglass-2: \"\\f252\";\n@fa-var-hourglass-3: \"\\f253\";\n@fa-var-hourglass-end: \"\\f253\";\n@fa-var-hourglass-half: \"\\f252\";\n@fa-var-hourglass-o: \"\\f250\";\n@fa-var-hourglass-start: \"\\f251\";\n@fa-var-houzz: \"\\f27c\";\n@fa-var-html5: \"\\f13b\";\n@fa-var-i-cursor: \"\\f246\";\n@fa-var-id-badge: \"\\f2c1\";\n@fa-var-id-card: \"\\f2c2\";\n@fa-var-id-card-o: \"\\f2c3\";\n@fa-var-ils: \"\\f20b\";\n@fa-var-image: \"\\f03e\";\n@fa-var-imdb: \"\\f2d8\";\n@fa-var-inbox: \"\\f01c\";\n@fa-var-indent: \"\\f03c\";\n@fa-var-industry: \"\\f275\";\n@fa-var-info: \"\\f129\";\n@fa-var-info-circle: \"\\f05a\";\n@fa-var-inr: \"\\f156\";\n@fa-var-instagram: \"\\f16d\";\n@fa-var-institution: \"\\f19c\";\n@fa-var-internet-explorer: \"\\f26b\";\n@fa-var-intersex: \"\\f224\";\n@fa-var-ioxhost: \"\\f208\";\n@fa-var-italic: \"\\f033\";\n@fa-var-joomla: \"\\f1aa\";\n@fa-var-jpy: \"\\f157\";\n@fa-var-jsfiddle: \"\\f1cc\";\n@fa-var-key: \"\\f084\";\n@fa-var-keyboard-o: \"\\f11c\";\n@fa-var-krw: \"\\f159\";\n@fa-var-language: \"\\f1ab\";\n@fa-var-laptop: \"\\f109\";\n@fa-var-lastfm: \"\\f202\";\n@fa-var-lastfm-square: \"\\f203\";\n@fa-var-leaf: \"\\f06c\";\n@fa-var-leanpub: \"\\f212\";\n@fa-var-legal: \"\\f0e3\";\n@fa-var-lemon-o: \"\\f094\";\n@fa-var-level-down: \"\\f149\";\n@fa-var-level-up: \"\\f148\";\n@fa-var-life-bouy: \"\\f1cd\";\n@fa-var-life-buoy: \"\\f1cd\";\n@fa-var-life-ring: \"\\f1cd\";\n@fa-var-life-saver: \"\\f1cd\";\n@fa-var-lightbulb-o: \"\\f0eb\";\n@fa-var-line-chart: \"\\f201\";\n@fa-var-link: \"\\f0c1\";\n@fa-var-linkedin: \"\\f0e1\";\n@fa-var-linkedin-square: \"\\f08c\";\n@fa-var-linode: \"\\f2b8\";\n@fa-var-linux: \"\\f17c\";\n@fa-var-list: \"\\f03a\";\n@fa-var-list-alt: \"\\f022\";\n@fa-var-list-ol: \"\\f0cb\";\n@fa-var-list-ul: \"\\f0ca\";\n@fa-var-location-arrow: \"\\f124\";\n@fa-var-lock: \"\\f023\";\n@fa-var-long-arrow-down: \"\\f175\";\n@fa-var-long-arrow-left: \"\\f177\";\n@fa-var-long-arrow-right: \"\\f178\";\n@fa-var-long-arrow-up: \"\\f176\";\n@fa-var-low-vision: \"\\f2a8\";\n@fa-var-magic: \"\\f0d0\";\n@fa-var-magnet: \"\\f076\";\n@fa-var-mail-forward: \"\\f064\";\n@fa-var-mail-reply: \"\\f112\";\n@fa-var-mail-reply-all: \"\\f122\";\n@fa-var-male: \"\\f183\";\n@fa-var-map: \"\\f279\";\n@fa-var-map-marker: \"\\f041\";\n@fa-var-map-o: \"\\f278\";\n@fa-var-map-pin: \"\\f276\";\n@fa-var-map-signs: \"\\f277\";\n@fa-var-mars: \"\\f222\";\n@fa-var-mars-double: \"\\f227\";\n@fa-var-mars-stroke: \"\\f229\";\n@fa-var-mars-stroke-h: \"\\f22b\";\n@fa-var-mars-stroke-v: \"\\f22a\";\n@fa-var-maxcdn: \"\\f136\";\n@fa-var-meanpath: \"\\f20c\";\n@fa-var-medium: \"\\f23a\";\n@fa-var-medkit: \"\\f0fa\";\n@fa-var-meetup: \"\\f2e0\";\n@fa-var-meh-o: \"\\f11a\";\n@fa-var-mercury: \"\\f223\";\n@fa-var-microchip: \"\\f2db\";\n@fa-var-microphone: \"\\f130\";\n@fa-var-microphone-slash: \"\\f131\";\n@fa-var-minus: \"\\f068\";\n@fa-var-minus-circle: \"\\f056\";\n@fa-var-minus-square: \"\\f146\";\n@fa-var-minus-square-o: \"\\f147\";\n@fa-var-mixcloud: \"\\f289\";\n@fa-var-mobile: \"\\f10b\";\n@fa-var-mobile-phone: \"\\f10b\";\n@fa-var-modx: \"\\f285\";\n@fa-var-money: \"\\f0d6\";\n@fa-var-moon-o: \"\\f186\";\n@fa-var-mortar-board: \"\\f19d\";\n@fa-var-motorcycle: \"\\f21c\";\n@fa-var-mouse-pointer: \"\\f245\";\n@fa-var-music: \"\\f001\";\n@fa-var-navicon: \"\\f0c9\";\n@fa-var-neuter: \"\\f22c\";\n@fa-var-newspaper-o: \"\\f1ea\";\n@fa-var-object-group: \"\\f247\";\n@fa-var-object-ungroup: \"\\f248\";\n@fa-var-odnoklassniki: \"\\f263\";\n@fa-var-odnoklassniki-square: \"\\f264\";\n@fa-var-opencart: \"\\f23d\";\n@fa-var-openid: \"\\f19b\";\n@fa-var-opera: \"\\f26a\";\n@fa-var-optin-monster: \"\\f23c\";\n@fa-var-outdent: \"\\f03b\";\n@fa-var-pagelines: \"\\f18c\";\n@fa-var-paint-brush: \"\\f1fc\";\n@fa-var-paper-plane: \"\\f1d8\";\n@fa-var-paper-plane-o: \"\\f1d9\";\n@fa-var-paperclip: \"\\f0c6\";\n@fa-var-paragraph: \"\\f1dd\";\n@fa-var-paste: \"\\f0ea\";\n@fa-var-pause: \"\\f04c\";\n@fa-var-pause-circle: \"\\f28b\";\n@fa-var-pause-circle-o: \"\\f28c\";\n@fa-var-paw: \"\\f1b0\";\n@fa-var-paypal: \"\\f1ed\";\n@fa-var-pencil: \"\\f040\";\n@fa-var-pencil-square: \"\\f14b\";\n@fa-var-pencil-square-o: \"\\f044\";\n@fa-var-percent: \"\\f295\";\n@fa-var-phone: \"\\f095\";\n@fa-var-phone-square: \"\\f098\";\n@fa-var-photo: \"\\f03e\";\n@fa-var-picture-o: \"\\f03e\";\n@fa-var-pie-chart: \"\\f200\";\n@fa-var-pied-piper: \"\\f2ae\";\n@fa-var-pied-piper-alt: \"\\f1a8\";\n@fa-var-pied-piper-pp: \"\\f1a7\";\n@fa-var-pinterest: \"\\f0d2\";\n@fa-var-pinterest-p: \"\\f231\";\n@fa-var-pinterest-square: \"\\f0d3\";\n@fa-var-plane: \"\\f072\";\n@fa-var-play: \"\\f04b\";\n@fa-var-play-circle: \"\\f144\";\n@fa-var-play-circle-o: \"\\f01d\";\n@fa-var-plug: \"\\f1e6\";\n@fa-var-plus: \"\\f067\";\n@fa-var-plus-circle: \"\\f055\";\n@fa-var-plus-square: \"\\f0fe\";\n@fa-var-plus-square-o: \"\\f196\";\n@fa-var-podcast: \"\\f2ce\";\n@fa-var-power-off: \"\\f011\";\n@fa-var-print: \"\\f02f\";\n@fa-var-product-hunt: \"\\f288\";\n@fa-var-puzzle-piece: \"\\f12e\";\n@fa-var-qq: \"\\f1d6\";\n@fa-var-qrcode: \"\\f029\";\n@fa-var-question: \"\\f128\";\n@fa-var-question-circle: \"\\f059\";\n@fa-var-question-circle-o: \"\\f29c\";\n@fa-var-quora: \"\\f2c4\";\n@fa-var-quote-left: \"\\f10d\";\n@fa-var-quote-right: \"\\f10e\";\n@fa-var-ra: \"\\f1d0\";\n@fa-var-random: \"\\f074\";\n@fa-var-ravelry: \"\\f2d9\";\n@fa-var-rebel: \"\\f1d0\";\n@fa-var-recycle: \"\\f1b8\";\n@fa-var-reddit: \"\\f1a1\";\n@fa-var-reddit-alien: \"\\f281\";\n@fa-var-reddit-square: \"\\f1a2\";\n@fa-var-refresh: \"\\f021\";\n@fa-var-registered: \"\\f25d\";\n@fa-var-remove: \"\\f00d\";\n@fa-var-renren: \"\\f18b\";\n@fa-var-reorder: \"\\f0c9\";\n@fa-var-repeat: \"\\f01e\";\n@fa-var-reply: \"\\f112\";\n@fa-var-reply-all: \"\\f122\";\n@fa-var-resistance: \"\\f1d0\";\n@fa-var-retweet: \"\\f079\";\n@fa-var-rmb: \"\\f157\";\n@fa-var-road: \"\\f018\";\n@fa-var-rocket: \"\\f135\";\n@fa-var-rotate-left: \"\\f0e2\";\n@fa-var-rotate-right: \"\\f01e\";\n@fa-var-rouble: \"\\f158\";\n@fa-var-rss: \"\\f09e\";\n@fa-var-rss-square: \"\\f143\";\n@fa-var-rub: \"\\f158\";\n@fa-var-ruble: \"\\f158\";\n@fa-var-rupee: \"\\f156\";\n@fa-var-s15: \"\\f2cd\";\n@fa-var-safari: \"\\f267\";\n@fa-var-save: \"\\f0c7\";\n@fa-var-scissors: \"\\f0c4\";\n@fa-var-scribd: \"\\f28a\";\n@fa-var-search: \"\\f002\";\n@fa-var-search-minus: \"\\f010\";\n@fa-var-search-plus: \"\\f00e\";\n@fa-var-sellsy: \"\\f213\";\n@fa-var-send: \"\\f1d8\";\n@fa-var-send-o: \"\\f1d9\";\n@fa-var-server: \"\\f233\";\n@fa-var-share: \"\\f064\";\n@fa-var-share-alt: \"\\f1e0\";\n@fa-var-share-alt-square: \"\\f1e1\";\n@fa-var-share-square: \"\\f14d\";\n@fa-var-share-square-o: \"\\f045\";\n@fa-var-shekel: \"\\f20b\";\n@fa-var-sheqel: \"\\f20b\";\n@fa-var-shield: \"\\f132\";\n@fa-var-ship: \"\\f21a\";\n@fa-var-shirtsinbulk: \"\\f214\";\n@fa-var-shopping-bag: \"\\f290\";\n@fa-var-shopping-basket: \"\\f291\";\n@fa-var-shopping-cart: \"\\f07a\";\n@fa-var-shower: \"\\f2cc\";\n@fa-var-sign-in: \"\\f090\";\n@fa-var-sign-language: \"\\f2a7\";\n@fa-var-sign-out: \"\\f08b\";\n@fa-var-signal: \"\\f012\";\n@fa-var-signing: \"\\f2a7\";\n@fa-var-simplybuilt: \"\\f215\";\n@fa-var-sitemap: \"\\f0e8\";\n@fa-var-skyatlas: \"\\f216\";\n@fa-var-skype: \"\\f17e\";\n@fa-var-slack: \"\\f198\";\n@fa-var-sliders: \"\\f1de\";\n@fa-var-slideshare: \"\\f1e7\";\n@fa-var-smile-o: \"\\f118\";\n@fa-var-snapchat: \"\\f2ab\";\n@fa-var-snapchat-ghost: \"\\f2ac\";\n@fa-var-snapchat-square: \"\\f2ad\";\n@fa-var-snowflake-o: \"\\f2dc\";\n@fa-var-soccer-ball-o: \"\\f1e3\";\n@fa-var-sort: \"\\f0dc\";\n@fa-var-sort-alpha-asc: \"\\f15d\";\n@fa-var-sort-alpha-desc: \"\\f15e\";\n@fa-var-sort-amount-asc: \"\\f160\";\n@fa-var-sort-amount-desc: \"\\f161\";\n@fa-var-sort-asc: \"\\f0de\";\n@fa-var-sort-desc: \"\\f0dd\";\n@fa-var-sort-down: \"\\f0dd\";\n@fa-var-sort-numeric-asc: \"\\f162\";\n@fa-var-sort-numeric-desc: \"\\f163\";\n@fa-var-sort-up: \"\\f0de\";\n@fa-var-soundcloud: \"\\f1be\";\n@fa-var-space-shuttle: \"\\f197\";\n@fa-var-spinner: \"\\f110\";\n@fa-var-spoon: \"\\f1b1\";\n@fa-var-spotify: \"\\f1bc\";\n@fa-var-square: \"\\f0c8\";\n@fa-var-square-o: \"\\f096\";\n@fa-var-stack-exchange: \"\\f18d\";\n@fa-var-stack-overflow: \"\\f16c\";\n@fa-var-star: \"\\f005\";\n@fa-var-star-half: \"\\f089\";\n@fa-var-star-half-empty: \"\\f123\";\n@fa-var-star-half-full: \"\\f123\";\n@fa-var-star-half-o: \"\\f123\";\n@fa-var-star-o: \"\\f006\";\n@fa-var-steam: \"\\f1b6\";\n@fa-var-steam-square: \"\\f1b7\";\n@fa-var-step-backward: \"\\f048\";\n@fa-var-step-forward: \"\\f051\";\n@fa-var-stethoscope: \"\\f0f1\";\n@fa-var-sticky-note: \"\\f249\";\n@fa-var-sticky-note-o: \"\\f24a\";\n@fa-var-stop: \"\\f04d\";\n@fa-var-stop-circle: \"\\f28d\";\n@fa-var-stop-circle-o: \"\\f28e\";\n@fa-var-street-view: \"\\f21d\";\n@fa-var-strikethrough: \"\\f0cc\";\n@fa-var-stumbleupon: \"\\f1a4\";\n@fa-var-stumbleupon-circle: \"\\f1a3\";\n@fa-var-subscript: \"\\f12c\";\n@fa-var-subway: \"\\f239\";\n@fa-var-suitcase: \"\\f0f2\";\n@fa-var-sun-o: \"\\f185\";\n@fa-var-superpowers: \"\\f2dd\";\n@fa-var-superscript: \"\\f12b\";\n@fa-var-support: \"\\f1cd\";\n@fa-var-table: \"\\f0ce\";\n@fa-var-tablet: \"\\f10a\";\n@fa-var-tachometer: \"\\f0e4\";\n@fa-var-tag: \"\\f02b\";\n@fa-var-tags: \"\\f02c\";\n@fa-var-tasks: \"\\f0ae\";\n@fa-var-taxi: \"\\f1ba\";\n@fa-var-telegram: \"\\f2c6\";\n@fa-var-television: \"\\f26c\";\n@fa-var-tencent-weibo: \"\\f1d5\";\n@fa-var-terminal: \"\\f120\";\n@fa-var-text-height: \"\\f034\";\n@fa-var-text-width: \"\\f035\";\n@fa-var-th: \"\\f00a\";\n@fa-var-th-large: \"\\f009\";\n@fa-var-th-list: \"\\f00b\";\n@fa-var-themeisle: \"\\f2b2\";\n@fa-var-thermometer: \"\\f2c7\";\n@fa-var-thermometer-0: \"\\f2cb\";\n@fa-var-thermometer-1: \"\\f2ca\";\n@fa-var-thermometer-2: \"\\f2c9\";\n@fa-var-thermometer-3: \"\\f2c8\";\n@fa-var-thermometer-4: \"\\f2c7\";\n@fa-var-thermometer-empty: \"\\f2cb\";\n@fa-var-thermometer-full: \"\\f2c7\";\n@fa-var-thermometer-half: \"\\f2c9\";\n@fa-var-thermometer-quarter: \"\\f2ca\";\n@fa-var-thermometer-three-quarters: \"\\f2c8\";\n@fa-var-thumb-tack: \"\\f08d\";\n@fa-var-thumbs-down: \"\\f165\";\n@fa-var-thumbs-o-down: \"\\f088\";\n@fa-var-thumbs-o-up: \"\\f087\";\n@fa-var-thumbs-up: \"\\f164\";\n@fa-var-ticket: \"\\f145\";\n@fa-var-times: \"\\f00d\";\n@fa-var-times-circle: \"\\f057\";\n@fa-var-times-circle-o: \"\\f05c\";\n@fa-var-times-rectangle: \"\\f2d3\";\n@fa-var-times-rectangle-o: \"\\f2d4\";\n@fa-var-tint: \"\\f043\";\n@fa-var-toggle-down: \"\\f150\";\n@fa-var-toggle-left: \"\\f191\";\n@fa-var-toggle-off: \"\\f204\";\n@fa-var-toggle-on: \"\\f205\";\n@fa-var-toggle-right: \"\\f152\";\n@fa-var-toggle-up: \"\\f151\";\n@fa-var-trademark: \"\\f25c\";\n@fa-var-train: \"\\f238\";\n@fa-var-transgender: \"\\f224\";\n@fa-var-transgender-alt: \"\\f225\";\n@fa-var-trash: \"\\f1f8\";\n@fa-var-trash-o: \"\\f014\";\n@fa-var-tree: \"\\f1bb\";\n@fa-var-trello: \"\\f181\";\n@fa-var-tripadvisor: \"\\f262\";\n@fa-var-trophy: \"\\f091\";\n@fa-var-truck: \"\\f0d1\";\n@fa-var-try: \"\\f195\";\n@fa-var-tty: \"\\f1e4\";\n@fa-var-tumblr: \"\\f173\";\n@fa-var-tumblr-square: \"\\f174\";\n@fa-var-turkish-lira: \"\\f195\";\n@fa-var-tv: \"\\f26c\";\n@fa-var-twitch: \"\\f1e8\";\n@fa-var-twitter: \"\\f099\";\n@fa-var-twitter-square: \"\\f081\";\n@fa-var-umbrella: \"\\f0e9\";\n@fa-var-underline: \"\\f0cd\";\n@fa-var-undo: \"\\f0e2\";\n@fa-var-universal-access: \"\\f29a\";\n@fa-var-university: \"\\f19c\";\n@fa-var-unlink: \"\\f127\";\n@fa-var-unlock: \"\\f09c\";\n@fa-var-unlock-alt: \"\\f13e\";\n@fa-var-unsorted: \"\\f0dc\";\n@fa-var-upload: \"\\f093\";\n@fa-var-usb: \"\\f287\";\n@fa-var-usd: \"\\f155\";\n@fa-var-user: \"\\f007\";\n@fa-var-user-circle: \"\\f2bd\";\n@fa-var-user-circle-o: \"\\f2be\";\n@fa-var-user-md: \"\\f0f0\";\n@fa-var-user-o: \"\\f2c0\";\n@fa-var-user-plus: \"\\f234\";\n@fa-var-user-secret: \"\\f21b\";\n@fa-var-user-times: \"\\f235\";\n@fa-var-users: \"\\f0c0\";\n@fa-var-vcard: \"\\f2bb\";\n@fa-var-vcard-o: \"\\f2bc\";\n@fa-var-venus: \"\\f221\";\n@fa-var-venus-double: \"\\f226\";\n@fa-var-venus-mars: \"\\f228\";\n@fa-var-viacoin: \"\\f237\";\n@fa-var-viadeo: \"\\f2a9\";\n@fa-var-viadeo-square: \"\\f2aa\";\n@fa-var-video-camera: \"\\f03d\";\n@fa-var-vimeo: \"\\f27d\";\n@fa-var-vimeo-square: \"\\f194\";\n@fa-var-vine: \"\\f1ca\";\n@fa-var-vk: \"\\f189\";\n@fa-var-volume-control-phone: \"\\f2a0\";\n@fa-var-volume-down: \"\\f027\";\n@fa-var-volume-off: \"\\f026\";\n@fa-var-volume-up: \"\\f028\";\n@fa-var-warning: \"\\f071\";\n@fa-var-wechat: \"\\f1d7\";\n@fa-var-weibo: \"\\f18a\";\n@fa-var-weixin: \"\\f1d7\";\n@fa-var-whatsapp: \"\\f232\";\n@fa-var-wheelchair: \"\\f193\";\n@fa-var-wheelchair-alt: \"\\f29b\";\n@fa-var-wifi: \"\\f1eb\";\n@fa-var-wikipedia-w: \"\\f266\";\n@fa-var-window-close: \"\\f2d3\";\n@fa-var-window-close-o: \"\\f2d4\";\n@fa-var-window-maximize: \"\\f2d0\";\n@fa-var-window-minimize: \"\\f2d1\";\n@fa-var-window-restore: \"\\f2d2\";\n@fa-var-windows: \"\\f17a\";\n@fa-var-won: \"\\f159\";\n@fa-var-wordpress: \"\\f19a\";\n@fa-var-wpbeginner: \"\\f297\";\n@fa-var-wpexplorer: \"\\f2de\";\n@fa-var-wpforms: \"\\f298\";\n@fa-var-wrench: \"\\f0ad\";\n@fa-var-xing: \"\\f168\";\n@fa-var-xing-square: \"\\f169\";\n@fa-var-y-combinator: \"\\f23b\";\n@fa-var-y-combinator-square: \"\\f1d4\";\n@fa-var-yahoo: \"\\f19e\";\n@fa-var-yc: \"\\f23b\";\n@fa-var-yc-square: \"\\f1d4\";\n@fa-var-yelp: \"\\f1e9\";\n@fa-var-yen: \"\\f157\";\n@fa-var-yoast: \"\\f2b1\";\n@fa-var-youtube: \"\\f167\";\n@fa-var-youtube-play: \"\\f16a\";\n@fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_animated.scss",
    "content": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_bordered-pulled.scss",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em $fa-border-color;\n  border-radius: .1em;\n}\n\n.#{$fa-css-prefix}-pull-left { float: left; }\n.#{$fa-css-prefix}-pull-right { float: right; }\n\n.#{$fa-css-prefix} {\n  &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_core.scss",
    "content": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_fixed-width.scss",
    "content": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_icons.scss",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-feed:before,\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-resistance:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-y-combinator-square:before,\n.#{$fa-css-prefix}-yc-square:before,\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-intersex:before,\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n.#{$fa-css-prefix}-yc:before,\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\n.#{$fa-css-prefix}-battery-4:before,\n.#{$fa-css-prefix}-battery:before,\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\n.#{$fa-css-prefix}-battery-3:before,\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\n.#{$fa-css-prefix}-battery-2:before,\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\n.#{$fa-css-prefix}-battery-1:before,\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\n.#{$fa-css-prefix}-battery-0:before,\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\n.#{$fa-css-prefix}-hourglass-1:before,\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\n.#{$fa-css-prefix}-hourglass-2:before,\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\n.#{$fa-css-prefix}-hourglass-3:before,\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\n.#{$fa-css-prefix}-hand-grab-o:before,\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\n.#{$fa-css-prefix}-hand-stop-o:before,\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\n.#{$fa-css-prefix}-tv:before,\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\n.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }\n.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }\n.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }\n.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }\n.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }\n.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }\n.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }\n.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }\n.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }\n.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }\n.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }\n.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }\n.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }\n.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }\n.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }\n.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }\n.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }\n.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }\n.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }\n.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }\n.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }\n.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }\n.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }\n.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }\n.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }\n.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }\n.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }\n.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }\n.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }\n.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }\n.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }\n.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }\n.#{$fa-css-prefix}-asl-interpreting:before,\n.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }\n.#{$fa-css-prefix}-deafness:before,\n.#{$fa-css-prefix}-hard-of-hearing:before,\n.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }\n.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }\n.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }\n.#{$fa-css-prefix}-signing:before,\n.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }\n.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }\n.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }\n.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }\n.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }\n.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }\n.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }\n.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }\n.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }\n.#{$fa-css-prefix}-google-plus-circle:before,\n.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }\n.#{$fa-css-prefix}-fa:before,\n.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }\n.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; }\n.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; }\n.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; }\n.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; }\n.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; }\n.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; }\n.#{$fa-css-prefix}-vcard:before,\n.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; }\n.#{$fa-css-prefix}-vcard-o:before,\n.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; }\n.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; }\n.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; }\n.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; }\n.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; }\n.#{$fa-css-prefix}-drivers-license:before,\n.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; }\n.#{$fa-css-prefix}-drivers-license-o:before,\n.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; }\n.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; }\n.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; }\n.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; }\n.#{$fa-css-prefix}-thermometer-4:before,\n.#{$fa-css-prefix}-thermometer:before,\n.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; }\n.#{$fa-css-prefix}-thermometer-3:before,\n.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; }\n.#{$fa-css-prefix}-thermometer-2:before,\n.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; }\n.#{$fa-css-prefix}-thermometer-1:before,\n.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; }\n.#{$fa-css-prefix}-thermometer-0:before,\n.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; }\n.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; }\n.#{$fa-css-prefix}-bathtub:before,\n.#{$fa-css-prefix}-s15:before,\n.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; }\n.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; }\n.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; }\n.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; }\n.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; }\n.#{$fa-css-prefix}-times-rectangle:before,\n.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; }\n.#{$fa-css-prefix}-times-rectangle-o:before,\n.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; }\n.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; }\n.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; }\n.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; }\n.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; }\n.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; }\n.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; }\n.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; }\n.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; }\n.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; }\n.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; }\n.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_larger.scss",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_list.scss",
    "content": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n  position: absolute;\n  left: -$fa-li-width;\n  width: $fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.#{$fa-css-prefix}-lg {\n    left: -$fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_mixins.scss",
    "content": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})\";\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)\";\n  -webkit-transform: scale($horiz, $vert);\n      -ms-transform: scale($horiz, $vert);\n          transform: scale($horiz, $vert);\n}\n\n\n// Only display content to screen readers. A la Bootstrap 4.\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n@mixin sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_path.scss",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n//  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_rotated-flipped.scss",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_screen-reader.scss",
    "content": "// Screen Readers\n// -------------------------\n\n.sr-only { @include sr-only(); }\n.sr-only-focusable { @include sr-only-focusable(); }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_stacked.scss",
    "content": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/_variables.scss",
    "content": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts\" !default;\n$fa-font-size-base:   14px !default;\n$fa-line-height-base: 1 !default;\n//$fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix:       fa !default;\n$fa-version:          \"4.7.0\" !default;\n$fa-border-color:     #eee !default;\n$fa-inverse:          #fff !default;\n$fa-li-width:         (30em / 14) !default;\n\n$fa-var-500px: \"\\f26e\";\n$fa-var-address-book: \"\\f2b9\";\n$fa-var-address-book-o: \"\\f2ba\";\n$fa-var-address-card: \"\\f2bb\";\n$fa-var-address-card-o: \"\\f2bc\";\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-amazon: \"\\f270\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-american-sign-language-interpreting: \"\\f2a3\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asl-interpreting: \"\\f2a3\";\n$fa-var-assistive-listening-systems: \"\\f2a2\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-audio-description: \"\\f29e\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-balance-scale: \"\\f24e\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bandcamp: \"\\f2d5\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-bath: \"\\f2cd\";\n$fa-var-bathtub: \"\\f2cd\";\n$fa-var-battery: \"\\f240\";\n$fa-var-battery-0: \"\\f244\";\n$fa-var-battery-1: \"\\f243\";\n$fa-var-battery-2: \"\\f242\";\n$fa-var-battery-3: \"\\f241\";\n$fa-var-battery-4: \"\\f240\";\n$fa-var-battery-empty: \"\\f244\";\n$fa-var-battery-full: \"\\f240\";\n$fa-var-battery-half: \"\\f242\";\n$fa-var-battery-quarter: \"\\f243\";\n$fa-var-battery-three-quarters: \"\\f241\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-black-tie: \"\\f27e\";\n$fa-var-blind: \"\\f29d\";\n$fa-var-bluetooth: \"\\f293\";\n$fa-var-bluetooth-b: \"\\f294\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-braille: \"\\f2a1\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-check-o: \"\\f274\";\n$fa-var-calendar-minus-o: \"\\f272\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-calendar-plus-o: \"\\f271\";\n$fa-var-calendar-times-o: \"\\f273\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-diners-club: \"\\f24c\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-jcb: \"\\f24b\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-chrome: \"\\f268\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-clone: \"\\f24d\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-codiepie: \"\\f284\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-commenting: \"\\f27a\";\n$fa-var-commenting-o: \"\\f27b\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-contao: \"\\f26d\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-creative-commons: \"\\f25e\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-credit-card-alt: \"\\f283\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-deaf: \"\\f2a4\";\n$fa-var-deafness: \"\\f2a4\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-drivers-license: \"\\f2c2\";\n$fa-var-drivers-license-o: \"\\f2c3\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edge: \"\\f282\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eercast: \"\\f2da\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-open: \"\\f2b6\";\n$fa-var-envelope-open-o: \"\\f2b7\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-envira: \"\\f299\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-etsy: \"\\f2d7\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-expeditedssl: \"\\f23e\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-fa: \"\\f2b4\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-feed: \"\\f09e\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-firefox: \"\\f269\";\n$fa-var-first-order: \"\\f2b0\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-font-awesome: \"\\f2b4\";\n$fa-var-fonticons: \"\\f280\";\n$fa-var-fort-awesome: \"\\f286\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-free-code-camp: \"\\f2c5\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f22d\";\n$fa-var-get-pocket: \"\\f265\";\n$fa-var-gg: \"\\f260\";\n$fa-var-gg-circle: \"\\f261\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gitlab: \"\\f296\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-glide: \"\\f2a5\";\n$fa-var-glide-g: \"\\f2a6\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-circle: \"\\f2b3\";\n$fa-var-google-plus-official: \"\\f2b3\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-grav: \"\\f2d6\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-grab-o: \"\\f255\";\n$fa-var-hand-lizard-o: \"\\f258\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hand-paper-o: \"\\f256\";\n$fa-var-hand-peace-o: \"\\f25b\";\n$fa-var-hand-pointer-o: \"\\f25a\";\n$fa-var-hand-rock-o: \"\\f255\";\n$fa-var-hand-scissors-o: \"\\f257\";\n$fa-var-hand-spock-o: \"\\f259\";\n$fa-var-hand-stop-o: \"\\f256\";\n$fa-var-handshake-o: \"\\f2b5\";\n$fa-var-hard-of-hearing: \"\\f2a4\";\n$fa-var-hashtag: \"\\f292\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-hourglass: \"\\f254\";\n$fa-var-hourglass-1: \"\\f251\";\n$fa-var-hourglass-2: \"\\f252\";\n$fa-var-hourglass-3: \"\\f253\";\n$fa-var-hourglass-end: \"\\f253\";\n$fa-var-hourglass-half: \"\\f252\";\n$fa-var-hourglass-o: \"\\f250\";\n$fa-var-hourglass-start: \"\\f251\";\n$fa-var-houzz: \"\\f27c\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-i-cursor: \"\\f246\";\n$fa-var-id-badge: \"\\f2c1\";\n$fa-var-id-card: \"\\f2c2\";\n$fa-var-id-card-o: \"\\f2c3\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-imdb: \"\\f2d8\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-industry: \"\\f275\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-internet-explorer: \"\\f26b\";\n$fa-var-intersex: \"\\f224\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linode: \"\\f2b8\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-low-vision: \"\\f2a8\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map: \"\\f279\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-map-o: \"\\f278\";\n$fa-var-map-pin: \"\\f276\";\n$fa-var-map-signs: \"\\f277\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meetup: \"\\f2e0\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microchip: \"\\f2db\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mixcloud: \"\\f289\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-modx: \"\\f285\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-mouse-pointer: \"\\f245\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-object-group: \"\\f247\";\n$fa-var-object-ungroup: \"\\f248\";\n$fa-var-odnoklassniki: \"\\f263\";\n$fa-var-odnoklassniki-square: \"\\f264\";\n$fa-var-opencart: \"\\f23d\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-opera: \"\\f26a\";\n$fa-var-optin-monster: \"\\f23c\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-pause-circle: \"\\f28b\";\n$fa-var-pause-circle-o: \"\\f28c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-percent: \"\\f295\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f2ae\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pied-piper-pp: \"\\f1a7\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-podcast: \"\\f2ce\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-product-hunt: \"\\f288\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-question-circle-o: \"\\f29c\";\n$fa-var-quora: \"\\f2c4\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-ravelry: \"\\f2d9\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-alien: \"\\f281\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-registered: \"\\f25d\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-resistance: \"\\f1d0\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-s15: \"\\f2cd\";\n$fa-var-safari: \"\\f267\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-scribd: \"\\f28a\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-bag: \"\\f290\";\n$fa-var-shopping-basket: \"\\f291\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-shower: \"\\f2cc\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-language: \"\\f2a7\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-signing: \"\\f2a7\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-snapchat: \"\\f2ab\";\n$fa-var-snapchat-ghost: \"\\f2ac\";\n$fa-var-snapchat-square: \"\\f2ad\";\n$fa-var-snowflake-o: \"\\f2dc\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-sticky-note: \"\\f249\";\n$fa-var-sticky-note-o: \"\\f24a\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-stop-circle: \"\\f28d\";\n$fa-var-stop-circle-o: \"\\f28e\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superpowers: \"\\f2dd\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-telegram: \"\\f2c6\";\n$fa-var-television: \"\\f26c\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-themeisle: \"\\f2b2\";\n$fa-var-thermometer: \"\\f2c7\";\n$fa-var-thermometer-0: \"\\f2cb\";\n$fa-var-thermometer-1: \"\\f2ca\";\n$fa-var-thermometer-2: \"\\f2c9\";\n$fa-var-thermometer-3: \"\\f2c8\";\n$fa-var-thermometer-4: \"\\f2c7\";\n$fa-var-thermometer-empty: \"\\f2cb\";\n$fa-var-thermometer-full: \"\\f2c7\";\n$fa-var-thermometer-half: \"\\f2c9\";\n$fa-var-thermometer-quarter: \"\\f2ca\";\n$fa-var-thermometer-three-quarters: \"\\f2c8\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-times-rectangle: \"\\f2d3\";\n$fa-var-times-rectangle-o: \"\\f2d4\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trademark: \"\\f25c\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-tripadvisor: \"\\f262\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-tv: \"\\f26c\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-universal-access: \"\\f29a\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usb: \"\\f287\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-circle: \"\\f2bd\";\n$fa-var-user-circle-o: \"\\f2be\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-o: \"\\f2c0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-vcard: \"\\f2bb\";\n$fa-var-vcard-o: \"\\f2bc\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-viadeo: \"\\f2a9\";\n$fa-var-viadeo-square: \"\\f2aa\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo: \"\\f27d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-control-phone: \"\\f2a0\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wheelchair-alt: \"\\f29b\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-wikipedia-w: \"\\f266\";\n$fa-var-window-close: \"\\f2d3\";\n$fa-var-window-close-o: \"\\f2d4\";\n$fa-var-window-maximize: \"\\f2d0\";\n$fa-var-window-minimize: \"\\f2d1\";\n$fa-var-window-restore: \"\\f2d2\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wpbeginner: \"\\f297\";\n$fa-var-wpexplorer: \"\\f2de\";\n$fa-var-wpforms: \"\\f298\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-y-combinator: \"\\f23b\";\n$fa-var-y-combinator-square: \"\\f1d4\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yc: \"\\f23b\";\n$fa-var-yc-square: \"\\f1d4\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-yoast: \"\\f2b1\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "assets/font-awesome-4.7.0/scss/font-awesome.scss",
    "content": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n@import \"screen-reader\";\n"
  },
  {
    "path": "assets/highcharts/css/highcharts.css",
    "content": "/**\n * @license Highcharts\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n.highcharts-container {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  height: 100%;\n  text-align: left;\n  line-height: normal;\n  z-index: 0;\n  /* #1072 */\n  -webkit-tap-highlight-color: transparent;\n  font-family: \"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif;\n  font-size: 12px;\n}\n\n.highcharts-root text {\n  stroke-width: 0;\n}\n\n.highcharts-strong {\n  font-weight: bold;\n}\n\n.highcharts-emphasized {\n  font-style: italic;\n}\n\n.highcharts-background {\n  fill: #ffffff;\n}\n\n.highcharts-plot-border, .highcharts-plot-background {\n  fill: none;\n}\n\n.highcharts-label-box {\n  fill: none;\n}\n\n.highcharts-button-box {\n  fill: inherit;\n}\n\n/* Titles */\n.highcharts-title {\n  fill: #333333;\n  font-size: 1.5em;\n}\n\n.highcharts-subtitle {\n  fill: #666666;\n}\n\n/* Axes */\n.highcharts-axis-line {\n  fill: none;\n  stroke: #ccd6eb;\n}\n\n.highcharts-yaxis .highcharts-axis-line {\n  stroke-width: 0;\n}\n\n.highcharts-axis-title {\n  fill: #666666;\n}\n\n.highcharts-axis-labels {\n  fill: #666666;\n  cursor: default;\n  font-size: 0.9em;\n}\n\n.highcharts-grid-line {\n  fill: none;\n  stroke: #e6e6e6;\n}\n\n.highcharts-xaxis-grid .highcharts-grid-line {\n  stroke-width: 0;\n}\n\n.highcharts-tick {\n  stroke: #ccd6eb;\n}\n\n.highcharts-yaxis .highcharts-tick {\n  stroke-width: 0;\n}\n\n.highcharts-minor-grid-line {\n  stroke: #f2f2f2;\n}\n\n.highcharts-crosshair-thin {\n  stroke-width: 1px;\n  stroke: #cccccc;\n}\n\n.highcharts-crosshair-category {\n  stroke: #ccd6eb;\n  stroke-opacity: 0.25;\n}\n\n/* Credits */\n.highcharts-credits {\n  cursor: pointer;\n  fill: #999999;\n  font-size: 0.7em;\n  transition: fill 250ms, font-size 250ms;\n}\n\n.highcharts-credits:hover {\n  fill: black;\n  font-size: 1em;\n}\n\n/* Tooltip */\n.highcharts-tooltip {\n  cursor: default;\n  pointer-events: none;\n  white-space: nowrap;\n  transition: stroke 150ms;\n}\n\n.highcharts-tooltip text {\n  fill: #333333;\n}\n\n.highcharts-tooltip .highcharts-header {\n  font-size: 0.85em;\n}\n\n.highcharts-tooltip-box {\n  stroke-width: 1px;\n  fill: #f7f7f7;\n  fill-opacity: 0.85;\n}\n\n.highcharts-selection-marker {\n  fill: #335cad;\n  fill-opacity: 0.25;\n}\n\n.highcharts-graph {\n  fill: none;\n  stroke-width: 2px;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n.highcharts-state-hover .highcharts-graph {\n  stroke-width: 3;\n}\n\n.highcharts-state-hover path {\n  transition: stroke-width 50;\n  /* quick in */\n}\n\n.highcharts-state-normal path {\n  transition: stroke-width 250ms;\n  /* slow out */\n}\n\n/* Legend hover affects points and series */\ng.highcharts-series,\n.highcharts-point,\n.highcharts-markers,\n.highcharts-data-labels {\n  transition: opacity 250ms;\n}\n\n.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover),\n.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover),\n.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover),\n.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) {\n  opacity: 0.2;\n}\n\n/* Series options */\n/* Default colors */\n.highcharts-color-0 {\n  fill: #7cb5ec;\n  stroke: #7cb5ec;\n}\n\n.highcharts-color-1 {\n  fill: #434348;\n  stroke: #434348;\n}\n\n.highcharts-color-2 {\n  fill: #90ed7d;\n  stroke: #90ed7d;\n}\n\n.highcharts-color-3 {\n  fill: #f7a35c;\n  stroke: #f7a35c;\n}\n\n.highcharts-color-4 {\n  fill: #8085e9;\n  stroke: #8085e9;\n}\n\n.highcharts-color-5 {\n  fill: #f15c80;\n  stroke: #f15c80;\n}\n\n.highcharts-color-6 {\n  fill: #e4d354;\n  stroke: #e4d354;\n}\n\n.highcharts-color-7 {\n  fill: #2b908f;\n  stroke: #2b908f;\n}\n\n.highcharts-color-8 {\n  fill: #f45b5b;\n  stroke: #f45b5b;\n}\n\n.highcharts-color-9 {\n  fill: #91e8e1;\n  stroke: #91e8e1;\n}\n\n.highcharts-area {\n  fill-opacity: 0.75;\n  stroke-width: 0;\n}\n\n.highcharts-markers {\n  stroke-width: 1px;\n  stroke: #ffffff;\n}\n\n.highcharts-point {\n  stroke-width: 1px;\n}\n\n.highcharts-dense-data .highcharts-point {\n  stroke-width: 0;\n}\n\n.highcharts-data-label {\n  font-size: 0.9em;\n  font-weight: bold;\n}\n\n.highcharts-data-label-box {\n  fill: none;\n  stroke-width: 0;\n}\n\n.highcharts-data-label text {\n  fill: #333333;\n}\n\n.highcharts-data-label-connector {\n  fill: none;\n}\n\n.highcharts-halo {\n  fill-opacity: 0.25;\n  stroke-width: 0;\n}\n\n.highcharts-point-select {\n  fill: #cccccc;\n  stroke: #000000;\n}\n\n.highcharts-column-series rect.highcharts-point {\n  stroke: #ffffff;\n}\n\n.highcharts-column-series .highcharts-point {\n  transition: fill-opacity 250ms;\n}\n\n.highcharts-column-series .highcharts-point-hover {\n  fill-opacity: 0.75;\n  transition: fill-opacity 50ms;\n}\n\n.highcharts-pie-series .highcharts-point {\n  stroke-linejoin: round;\n  stroke: #ffffff;\n}\n\n.highcharts-pie-series .highcharts-point-hover {\n  fill-opacity: 0.75;\n  transition: fill-opacity 50ms;\n}\n\n.highcharts-pie-series .highcharts-point-select {\n  fill: inherit;\n  stroke: inherit;\n}\n\n.highcharts-funnel-series .highcharts-point {\n  stroke-linejoin: round;\n  stroke: #ffffff;\n}\n\n.highcharts-funnel-series .highcharts-point-hover {\n  fill-opacity: 0.75;\n  transition: fill-opacity 50ms;\n}\n\n.highcharts-funnel-series .highcharts-point-select {\n  fill: inherit;\n  stroke: inherit;\n}\n\n.highcharts-pyramid-series .highcharts-point {\n  stroke-linejoin: round;\n  stroke: #ffffff;\n}\n\n.highcharts-pyramid-series .highcharts-point-hover {\n  fill-opacity: 0.75;\n  transition: fill-opacity 50ms;\n}\n\n.highcharts-pyramid-series .highcharts-point-select {\n  fill: inherit;\n  stroke: inherit;\n}\n\n.highcharts-solidgauge-series .highcharts-point {\n  stroke-width: 0;\n}\n\n.highcharts-treemap-series .highcharts-point {\n  stroke-width: 1px;\n  stroke: #e6e6e6;\n  transition: stroke 250ms, fill 250ms, fill-opacity 250ms;\n}\n\n.highcharts-treemap-series .highcharts-point-hover {\n  stroke: #999999;\n  transition: stroke 25ms, fill 25ms, fill-opacity 25ms;\n}\n\n.highcharts-treemap-series .highcharts-above-level {\n  display: none;\n}\n\n.highcharts-treemap-series .highcharts-internal-node {\n  fill: none;\n}\n\n.highcharts-treemap-series .highcharts-internal-node-interactive {\n  fill-opacity: 0.15;\n  cursor: pointer;\n}\n\n.highcharts-treemap-series .highcharts-internal-node-interactive:hover {\n  fill-opacity: 0.75;\n}\n\n/* Legend */\n.highcharts-legend-box {\n  fill: none;\n  stroke-width: 0;\n}\n\n.highcharts-legend-item text {\n  fill: #333333;\n  font-weight: bold;\n  cursor: pointer;\n  stroke-width: 0;\n}\n\n.highcharts-legend-item:hover text {\n  fill: #000000;\n}\n\n.highcharts-legend-item-hidden * {\n  fill: #cccccc !important;\n  stroke: #cccccc !important;\n  transition: fill 250ms;\n}\n\n.highcharts-legend-nav-active {\n  fill: #003399;\n  cursor: pointer;\n}\n\n.highcharts-legend-nav-inactive {\n  fill: #cccccc;\n}\n\n.highcharts-legend-title-box {\n  fill: none;\n  stroke-width: 0;\n}\n\n/* Loading */\n.highcharts-loading {\n  position: absolute;\n  background-color: #ffffff;\n  opacity: 0.5;\n  text-align: center;\n  z-index: 10;\n  transition: opacity 250ms;\n}\n\n.highcharts-loading-hidden {\n  height: 0 !important;\n  opacity: 0;\n  overflow: hidden;\n  transition: opacity 250ms, height 250ms step-end;\n}\n\n.highcharts-loading-inner {\n  font-weight: bold;\n  position: relative;\n  top: 45%;\n}\n\n/* Plot bands and polar pane backgrounds */\n.highcharts-plot-band, .highcharts-pane {\n  fill: #000000;\n  fill-opacity: 0.05;\n}\n\n.highcharts-plot-line {\n  fill: none;\n  stroke: #999999;\n  stroke-width: 1px;\n}\n\n/* Highcharts More */\n.highcharts-boxplot-box {\n  fill: #ffffff;\n}\n\n.highcharts-boxplot-median {\n  stroke-width: 2px;\n}\n\n.highcharts-bubble-series .highcharts-point {\n  fill-opacity: 0.5;\n}\n\n.highcharts-errorbar-series .highcharts-point {\n  stroke: #000000;\n}\n\n.highcharts-gauge-series .highcharts-data-label-box {\n  stroke: #cccccc;\n  stroke-width: 1px;\n}\n\n.highcharts-gauge-series .highcharts-dial {\n  fill: #000000;\n  stroke-width: 0;\n}\n\n.highcharts-polygon-series .highcharts-graph {\n  fill: inherit;\n  stroke-width: 0;\n}\n\n.highcharts-waterfall-series .highcharts-graph {\n  stroke: #333333;\n  stroke-dasharray: 1, 3;\n}\n\n/* Highstock */\n.highcharts-navigator-mask-outside {\n  fill-opacity: 0;\n}\n\n.highcharts-navigator-mask-inside {\n  fill: #6685c2;\n  /* navigator.maskFill option */\n  fill-opacity: 0.25;\n  cursor: ew-resize;\n}\n\n.highcharts-navigator-outline {\n  stroke: #cccccc;\n  fill: none;\n}\n\n.highcharts-navigator-handle {\n  stroke: #cccccc;\n  fill: #f2f2f2;\n  cursor: ew-resize;\n}\n\n.highcharts-navigator-series {\n  fill: #335cad;\n  stroke: #335cad;\n}\n\n.highcharts-navigator-series .highcharts-graph {\n  stroke-width: 1px;\n}\n\n.highcharts-navigator-series .highcharts-area {\n  fill-opacity: 0.05;\n}\n\n.highcharts-navigator-xaxis .highcharts-axis-line {\n  stroke-width: 0;\n}\n\n.highcharts-navigator-xaxis .highcharts-grid-line {\n  stroke-width: 1px;\n  stroke: #e6e6e6;\n}\n\n.highcharts-navigator-xaxis.highcharts-axis-labels {\n  fill: #999999;\n}\n\n.highcharts-navigator-yaxis .highcharts-grid-line {\n  stroke-width: 0;\n}\n\n.highcharts-scrollbar-thumb {\n  fill: #cccccc;\n  stroke: #cccccc;\n  stroke-width: 1px;\n}\n\n.highcharts-scrollbar-button {\n  fill: #e6e6e6;\n  stroke: #cccccc;\n  stroke-width: 1px;\n}\n\n.highcharts-scrollbar-arrow {\n  fill: #666666;\n}\n\n.highcharts-scrollbar-rifles {\n  stroke: #666666;\n  stroke-width: 1px;\n}\n\n.highcharts-scrollbar-track {\n  fill: #f2f2f2;\n  stroke: #f2f2f2;\n  stroke-width: 1px;\n}\n\n.highcharts-button {\n  fill: #f7f7f7;\n  stroke: #cccccc;\n  cursor: default;\n  stroke-width: 1px;\n  transition: fill 250ms;\n}\n\n.highcharts-button text {\n  fill: #333333;\n}\n\n.highcharts-button-hover {\n  transition: fill 0ms;\n  fill: #e6e6e6;\n  stroke: #333333;\n}\n\n.highcharts-button-pressed {\n  font-weight: bold;\n  fill: #e6ebf5;\n  stroke: #335cad;\n}\n\n.highcharts-button-disabled text {\n  fill: #cccccc;\n}\n\n.highcharts-range-selector-buttons .highcharts-button {\n  stroke-width: 0;\n}\n\n.highcharts-range-label rect {\n  fill: none;\n}\n\n.highcharts-range-label text {\n  fill: #666666;\n}\n\n.highcharts-range-input rect {\n  fill: none;\n}\n\n.highcharts-range-input text {\n  fill: #333333;\n}\n\ninput.highcharts-range-selector {\n  position: absolute;\n  border: 0;\n  width: 1px;\n  /* Chrome needs a pixel to see it */\n  height: 1px;\n  padding: 0;\n  text-align: center;\n  left: -9em;\n  /* #4798 */\n}\n\n.highcharts-crosshair-label text {\n  fill: #ffffff;\n  font-size: 1.1em;\n}\n\n.highcharts-crosshair-label .highcharts-label-box {\n  fill: inherit;\n}\n\n.highcharts-candlestick-series .highcharts-point {\n  stroke: #000000;\n  stroke-width: 1px;\n}\n\n.highcharts-candlestick-series .highcharts-point-up {\n  fill: #ffffff;\n}\n\n.highcharts-ohlc-series .highcharts-point-hover {\n  stroke-width: 3px;\n}\n\n.highcharts-flags-series .highcharts-point {\n  stroke: #999999;\n  fill: #ffffff;\n}\n\n.highcharts-flags-series .highcharts-point-hover {\n  stroke: #000000;\n  fill: #ccd6eb;\n}\n\n.highcharts-flags-series .highcharts-point text {\n  fill: #000000;\n  font-size: 0.9em;\n  font-weight: bold;\n}\n\n/* Highmaps */\n.highcharts-map-series .highcharts-point {\n  transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms;\n  stroke: #cccccc;\n}\n\n.highcharts-map-series .highcharts-point-hover {\n  transition: fill 0ms, fill-opacity 0ms;\n  fill-opacity: 0.5;\n  stroke-width: 2px;\n}\n\n.highcharts-mapline-series .highcharts-point {\n  fill: none;\n}\n\n.highcharts-heatmap-series .highcharts-point {\n  stroke-width: 0;\n}\n\n.highcharts-map-navigation {\n  font-size: 1.3em;\n  font-weight: bold;\n  text-align: center;\n}\n\n.highcharts-coloraxis {\n  stroke-width: 0;\n}\n\n.highcharts-coloraxis-marker {\n  fill: #999999;\n}\n\n.highcharts-null-point {\n  fill: #f7f7f7;\n}\n\n/* 3d charts */\n.highcharts-3d-frame {\n  fill: transparent;\n}\n\n/* Exporting module */\n.highcharts-contextbutton {\n  fill: #ffffff;\n  /* needed to capture hover */\n  stroke: none;\n  stroke-linecap: round;\n}\n\n.highcharts-contextbutton:hover {\n  fill: #e6e6e6;\n  stroke: #e6e6e6;\n}\n\n.highcharts-button-symbol {\n  stroke: #666666;\n  stroke-width: 3px;\n}\n\n.highcharts-menu {\n  border: 1px solid #999999;\n  background: #ffffff;\n  padding: 5px 0;\n  box-shadow: 3px 3px 10px #888;\n}\n\n.highcharts-menu-item {\n  padding: 0.5em 1em;\n  background: none;\n  color: #333333;\n  cursor: pointer;\n  transition: background 250ms, color 250ms;\n}\n\n.highcharts-menu-item:hover {\n  background: #335cad;\n  color: #ffffff;\n}\n\n/* Drilldown module */\n.highcharts-drilldown-point {\n  cursor: pointer;\n}\n\n.highcharts-drilldown-data-label text, .highcharts-drilldown-axis-label {\n  cursor: pointer;\n  fill: #003399;\n  font-weight: bold;\n  text-decoration: underline;\n}\n\n/* No-data module */\n.highcharts-no-data text {\n  font-weight: bold;\n  font-size: 12px;\n  fill: #666666;\n}\n"
  },
  {
    "path": "assets/highcharts/highcharts-3d.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n 3D features for Highcharts JS\n\n @license: www.highcharts.com/license\n*/\n(function(A){\"object\"===typeof module&&module.exports?module.exports=A:A(Highcharts)})(function(A){(function(d){var w=d.deg2rad,r=d.pick;d.perspective=function(t,x,y){var m=x.options.chart.options3d,u=y?x.inverted:!1,h=x.plotWidth/2,v=x.plotHeight/2,g=m.depth/2,c=r(m.depth,1)*r(m.viewDistance,0),b=x.scale3d||1,e=w*m.beta*(u?-1:1),m=w*m.alpha*(u?-1:1),a=Math.cos(m),f=Math.cos(-e),k=Math.sin(m),p=Math.sin(-e);y||(h+=x.plotLeft,v+=x.plotTop);return d.map(t,function(e){var d,l;l=(u?e.y:e.x)-h;var n=(u?\ne.x:e.y)-v,F=(e.z||0)-g;d=f*l-p*F;e=-k*p*l+a*n-f*k*F;l=a*p*l+k*n+a*f*F;n=0<c&&c<Number.POSITIVE_INFINITY?c/(l+g+c):1;d=d*n*b+h;e=e*n*b+v;return{x:u?e:d,y:u?d:e,z:l*b+g}})};d.pointCameraDistance=function(d,x){var t=x.options.chart.options3d,m=x.plotWidth/2;x=x.plotHeight/2;t=r(t.depth,1)*r(t.viewDistance,0)+t.depth;return Math.sqrt(Math.pow(m-d.plotX,2)+Math.pow(x-d.plotY,2)+Math.pow(t-d.plotZ,2))};d.shapeArea=function(d){var t=0,r,m;for(r=0;r<d.length;r++)m=(r+1)%d.length,t+=d[r].x*d[m].y-d[m].x*\nd[r].y;return t/2};d.shapeArea3d=function(r,x,w){return d.shapeArea(d.perspective(r,x,w))}})(A);(function(d){function w(a,b,e,d,c,f,k,g){var B=[],n=f-c;return f>c&&f-c>Math.PI/2+.0001?(B=B.concat(w(a,b,e,d,c,c+Math.PI/2,k,g)),B=B.concat(w(a,b,e,d,c+Math.PI/2,f,k,g))):f<c&&c-f>Math.PI/2+.0001?(B=B.concat(w(a,b,e,d,c,c-Math.PI/2,k,g)),B=B.concat(w(a,b,e,d,c-Math.PI/2,f,k,g))):[\"C\",a+e*Math.cos(c)-e*l*n*Math.sin(c)+k,b+d*Math.sin(c)+d*l*n*Math.cos(c)+g,a+e*Math.cos(f)+e*l*n*Math.sin(f)+k,b+d*Math.sin(f)-\nd*l*n*Math.cos(f)+g,a+e*Math.cos(f)+k,b+d*Math.sin(f)+g]}var r=Math.cos,t=Math.PI,x=Math.sin,y=d.animObject,m=d.charts,u=d.color,h=d.defined,v=d.deg2rad,g=d.each,c=d.extend,b=d.inArray,e=d.map,a=d.merge,f=d.perspective,k=d.pick,p=d.SVGElement,z=d.SVGRenderer,q=d.wrap,l=4*(Math.sqrt(2)-1)/3/(t/2);z.prototype.toLinePath=function(a,b){var e=[];g(a,function(a){e.push(\"L\",a.x,a.y)});a.length&&(e[0]=\"M\",b&&e.push(\"Z\"));return e};z.prototype.toLineSegments=function(a){var b=[],e=!0;g(a,function(a){b.push(e?\n\"M\":\"L\",a.x,a.y);e=!e});return b};z.prototype.face3d=function(a){var b=this,e=this.createElement(\"path\");e.vertexes=[];e.insidePlotArea=!1;e.enabled=!0;q(e,\"attr\",function(a,e){if(\"object\"===typeof e&&(h(e.enabled)||h(e.vertexes)||h(e.insidePlotArea))){this.enabled=k(e.enabled,this.enabled);this.vertexes=k(e.vertexes,this.vertexes);this.insidePlotArea=k(e.insidePlotArea,this.insidePlotArea);delete e.enabled;delete e.vertexes;delete e.insidePlotArea;var c=f(this.vertexes,m[b.chartIndex],this.insidePlotArea),\nB=b.toLinePath(c,!0),c=d.shapeArea(c),c=this.enabled&&0<c?\"visible\":\"hidden\";e.d=B;e.visibility=c}return a.apply(this,[].slice.call(arguments,1))});q(e,\"animate\",function(a,e){if(\"object\"===typeof e&&(h(e.enabled)||h(e.vertexes)||h(e.insidePlotArea))){this.enabled=k(e.enabled,this.enabled);this.vertexes=k(e.vertexes,this.vertexes);this.insidePlotArea=k(e.insidePlotArea,this.insidePlotArea);delete e.enabled;delete e.vertexes;delete e.insidePlotArea;var c=f(this.vertexes,m[b.chartIndex],this.insidePlotArea),\nB=b.toLinePath(c,!0),c=d.shapeArea(c),c=this.enabled&&0<c?\"visible\":\"hidden\";e.d=B;this.attr(\"visibility\",c)}return a.apply(this,[].slice.call(arguments,1))});return e.attr(a)};z.prototype.polyhedron=function(a){var b=this,e=this.g(),c=e.destroy;e.attr({\"stroke-linejoin\":\"round\"});e.faces=[];e.destroy=function(){for(var a=0;a<e.faces.length;a++)e.faces[a].destroy();return c.call(this)};q(e,\"attr\",function(a,c,d,f,k){if(\"object\"===typeof c&&h(c.faces)){for(;e.faces.length>c.faces.length;)e.faces.pop().destroy();\nfor(;e.faces.length<c.faces.length;)e.faces.push(b.face3d().add(e));for(var g=0;g<c.faces.length;g++)e.faces[g].attr(c.faces[g],null,f,k);delete c.faces}return a.apply(this,[].slice.call(arguments,1))});q(e,\"animate\",function(a,c,d,f){if(c&&c.faces){for(;e.faces.length>c.faces.length;)e.faces.pop().destroy();for(;e.faces.length<c.faces.length;)e.faces.push(b.face3d().add(e));for(var k=0;k<c.faces.length;k++)e.faces[k].animate(c.faces[k],d,f);delete c.faces}return a.apply(this,[].slice.call(arguments,\n1))});return e.attr(a)};z.prototype.cuboid=function(a){var e=this.g(),b=e.destroy;a=this.cuboidPath(a);e.attr({\"stroke-linejoin\":\"round\"});e.front=this.path(a[0]).attr({\"class\":\"highcharts-3d-front\"}).add(e);e.top=this.path(a[1]).attr({\"class\":\"highcharts-3d-top\"}).add(e);e.side=this.path(a[2]).attr({\"class\":\"highcharts-3d-side\"}).add(e);e.fillSetter=function(a){this.front.attr({fill:a});this.top.attr({fill:u(a).brighten(.1).get()});this.side.attr({fill:u(a).brighten(-.1).get()});this.color=a;return this};\ne.opacitySetter=function(a){this.front.attr({opacity:a});this.top.attr({opacity:a});this.side.attr({opacity:a});return this};e.attr=function(a,e){if(\"string\"===typeof a&&\"undefined\"!==typeof e){var b=a;a={};a[b]=e}if(a.shapeArgs||h(a.x))a=this.renderer.cuboidPath(a.shapeArgs||a),this.front.attr({d:a[0]}),this.top.attr({d:a[1]}),this.side.attr({d:a[2]});else return d.SVGElement.prototype.attr.call(this,a);return this};e.animate=function(a,e,b){h(a.x)&&h(a.y)?(a=this.renderer.cuboidPath(a),this.front.animate({d:a[0]},\ne,b),this.top.animate({d:a[1]},e,b),this.side.animate({d:a[2]},e,b),this.attr({zIndex:-a[3]})):a.opacity?(this.front.animate(a,e,b),this.top.animate(a,e,b),this.side.animate(a,e,b)):p.prototype.animate.call(this,a,e,b);return this};e.destroy=function(){this.front.destroy();this.top.destroy();this.side.destroy();return b.call(this)};e.attr({zIndex:-a[3]});return e};d.SVGRenderer.prototype.cuboidPath=function(a){function b(a){return r[a]}var c=a.x,k=a.y,g=a.z,n=a.height,v=a.width,l=a.depth,p=m[this.chartIndex],\nq,z,u=p.options.chart.options3d.alpha,h=0,r=[{x:c,y:k,z:g},{x:c+v,y:k,z:g},{x:c+v,y:k+n,z:g},{x:c,y:k+n,z:g},{x:c,y:k+n,z:g+l},{x:c+v,y:k+n,z:g+l},{x:c+v,y:k,z:g+l},{x:c,y:k,z:g+l}],r=f(r,p,a.insidePlotArea);z=function(a,c){var f=[[],-1];a=e(a,b);c=e(c,b);0>d.shapeArea(a)?f=[a,0]:0>d.shapeArea(c)&&(f=[c,1]);return f};q=z([3,2,1,0],[7,6,5,4]);a=q[0];v=q[1];q=z([1,6,7,0],[4,5,2,3]);n=q[0];l=q[1];q=z([1,2,5,6],[0,7,4,3]);z=q[0];q=q[1];1===q?h+=1E4*(1E3-c):q||(h+=1E4*c);h+=10*(!l||0<=u&&180>=u||360>u&&\n357.5<u?p.plotHeight-k:10+k);1===v?h+=100*g:v||(h+=100*(1E3-g));h=-Math.round(h);return[this.toLinePath(a,!0),this.toLinePath(n,!0),this.toLinePath(z,!0),h]};d.SVGRenderer.prototype.arc3d=function(e){function d(e){var c=!1,f={};e=a(e);for(var d in e)-1!==b(d,l)&&(f[d]=e[d],delete e[d],c=!0);return c?f:!1}var f=this.g(),n=f.renderer,l=\"x y r innerR start end\".split(\" \");e=a(e);e.alpha*=v;e.beta*=v;f.top=n.path();f.side1=n.path();f.side2=n.path();f.inn=n.path();f.out=n.path();f.onAdd=function(){var a=\nf.parentGroup,e=f.attr(\"class\");f.top.add(f);g([\"out\",\"inn\",\"side1\",\"side2\"],function(b){f[b].addClass(e+\" highcharts-3d-side\").add(a)})};f.setPaths=function(a){var e=f.renderer.arc3dPath(a),b=100*e.zTop;f.attribs=a;f.top.attr({d:e.top,zIndex:e.zTop});f.inn.attr({d:e.inn,zIndex:e.zInn});f.out.attr({d:e.out,zIndex:e.zOut});f.side1.attr({d:e.side1,zIndex:e.zSide1});f.side2.attr({d:e.side2,zIndex:e.zSide2});f.zIndex=b;f.attr({zIndex:b});a.center&&(f.top.setRadialReference(a.center),delete a.center)};\nf.setPaths(e);f.fillSetter=function(a){var e=u(a).brighten(-.1).get();this.fill=a;this.side1.attr({fill:e});this.side2.attr({fill:e});this.inn.attr({fill:e});this.out.attr({fill:e});this.top.attr({fill:a});return this};g([\"opacity\",\"translateX\",\"translateY\",\"visibility\"],function(a){f[a+\"Setter\"]=function(a,e){f[e]=a;g([\"out\",\"inn\",\"side1\",\"side2\",\"top\"],function(b){f[b].attr(e,a)})}});q(f,\"attr\",function(a,e){var b;\"object\"===typeof e&&(b=d(e))&&(c(f.attribs,b),f.setPaths(f.attribs));return a.apply(this,\n[].slice.call(arguments,1))});q(f,\"animate\",function(e,b,c,f){var g,n=this.attribs,v;delete b.center;delete b.z;delete b.depth;delete b.alpha;delete b.beta;v=y(k(c,this.renderer.globalAnimation));v.duration&&(g=d(b),b.dummy=1,g&&(v.step=function(e,b){function c(a){return n[a]+(k(g[a],n[a])-n[a])*b.pos}\"dummy\"===b.prop&&b.elem.setPaths(a(n,{x:c(\"x\"),y:c(\"y\"),r:c(\"r\"),innerR:c(\"innerR\"),start:c(\"start\"),end:c(\"end\")}))}),c=v);return e.call(this,b,c,f)});f.destroy=function(){this.top.destroy();this.out.destroy();\nthis.inn.destroy();this.side1.destroy();this.side2.destroy();p.prototype.destroy.call(this)};f.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};f.show=function(){this.top.show();this.out.show();this.inn.show();this.side1.show();this.side2.show()};return f};z.prototype.arc3dPath=function(a){function e(a){a%=2*Math.PI;a>Math.PI&&(a=2*Math.PI-a);return a}var b=a.x,c=a.y,f=a.start,d=a.end-.00001,k=a.r,g=a.innerR,v=a.depth,l=a.alpha,p=a.beta,n=Math.cos(f),\nq=Math.sin(f);a=Math.cos(d);var h=Math.sin(d),z=k*Math.cos(p),k=k*Math.cos(l),m=g*Math.cos(p),u=g*Math.cos(l),g=v*Math.sin(p),y=v*Math.sin(l),v=[\"M\",b+z*n,c+k*q],v=v.concat(w(b,c,z,k,f,d,0,0)),v=v.concat([\"L\",b+m*a,c+u*h]),v=v.concat(w(b,c,m,u,d,f,0,0)),v=v.concat([\"Z\"]),A=0<p?Math.PI/2:0,p=0<l?0:Math.PI/2,A=f>-A?f:d>-A?-A:f,C=d<t-p?d:f<t-p?t-p:d,D=2*t-p,l=[\"M\",b+z*r(A),c+k*x(A)],l=l.concat(w(b,c,z,k,A,C,0,0));d>D&&f<D?(l=l.concat([\"L\",b+z*r(C)+g,c+k*x(C)+y]),l=l.concat(w(b,c,z,k,C,D,g,y)),l=l.concat([\"L\",\nb+z*r(D),c+k*x(D)]),l=l.concat(w(b,c,z,k,D,d,0,0)),l=l.concat([\"L\",b+z*r(d)+g,c+k*x(d)+y]),l=l.concat(w(b,c,z,k,d,D,g,y)),l=l.concat([\"L\",b+z*r(D),c+k*x(D)]),l=l.concat(w(b,c,z,k,D,C,0,0))):d>t-p&&f<t-p&&(l=l.concat([\"L\",b+z*Math.cos(C)+g,c+k*Math.sin(C)+y]),l=l.concat(w(b,c,z,k,C,d,g,y)),l=l.concat([\"L\",b+z*Math.cos(d),c+k*Math.sin(d)]),l=l.concat(w(b,c,z,k,d,C,0,0)));l=l.concat([\"L\",b+z*Math.cos(C)+g,c+k*Math.sin(C)+y]);l=l.concat(w(b,c,z,k,C,A,g,y));l=l.concat([\"Z\"]);p=[\"M\",b+m*n,c+u*q];p=p.concat(w(b,\nc,m,u,f,d,0,0));p=p.concat([\"L\",b+m*Math.cos(d)+g,c+u*Math.sin(d)+y]);p=p.concat(w(b,c,m,u,d,f,g,y));p=p.concat([\"Z\"]);n=[\"M\",b+z*n,c+k*q,\"L\",b+z*n+g,c+k*q+y,\"L\",b+m*n+g,c+u*q+y,\"L\",b+m*n,c+u*q,\"Z\"];b=[\"M\",b+z*a,c+k*h,\"L\",b+z*a+g,c+k*h+y,\"L\",b+m*a+g,c+u*h+y,\"L\",b+m*a,c+u*h,\"Z\"];h=Math.atan2(y,-g);c=Math.abs(d+h);a=Math.abs(f+h);f=Math.abs((f+d)/2+h);c=e(c);a=e(a);f=e(f);f*=1E5;d=1E5*a;c*=1E5;return{top:v,zTop:1E5*Math.PI+1,out:l,zOut:Math.max(f,d,c),inn:p,zInn:Math.max(f,d,c),side1:n,zSide1:.99*c,\nside2:b,zSide2:.99*d}}})(A);(function(d){function w(d,g){var c=d.plotLeft,b=d.plotWidth+c,e=d.plotTop,a=d.plotHeight+e,f=c+d.plotWidth/2,k=e+d.plotHeight/2,p=Number.MAX_VALUE,v=-Number.MAX_VALUE,q=Number.MAX_VALUE,l=-Number.MAX_VALUE,n,h=1;n=[{x:c,y:e,z:0},{x:c,y:e,z:g}];t([0,1],function(a){n.push({x:b,y:n[a].y,z:n[a].z})});t([0,1,2,3],function(e){n.push({x:n[e].x,y:a,z:n[e].z})});n=y(n,d,!1);t(n,function(a){p=Math.min(p,a.x);v=Math.max(v,a.x);q=Math.min(q,a.y);l=Math.max(l,a.y)});c>p&&(h=Math.min(h,\n1-Math.abs((c+f)/(p+f))%1));b<v&&(h=Math.min(h,(b-f)/(v-f)));e>q&&(h=0>q?Math.min(h,(e+k)/(-q+e+k)):Math.min(h,1-(e+k)/(q+k)%1));a<l&&(h=Math.min(h,Math.abs((a-k)/(l-k))));return h}var r=d.Chart,t=d.each,x=d.merge,y=d.perspective,m=d.pick,u=d.wrap;r.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};r.prototype.propsRequireDirtyBox.push(\"chart.options3d\");r.prototype.propsRequireUpdateSeries.push(\"chart.options3d\");d.wrap(d.Chart.prototype,\"isInsidePlot\",\nfunction(d){return this.is3d()||d.apply(this,[].slice.call(arguments,1))});var h=d.getOptions();x(!0,h,{chart:{options3d:{enabled:!1,alpha:0,beta:0,depth:100,fitToPlot:!0,viewDistance:25,axisLabelPosition:\"default\",frame:{visible:\"default\",size:1,bottom:{},top:{},left:{},right:{},back:{},front:{}}}}});u(r.prototype,\"setClassName\",function(d){d.apply(this,[].slice.call(arguments,1));this.is3d()&&(this.container.className+=\" highcharts-3d-chart\")});d.wrap(d.Chart.prototype,\"setChartSize\",function(d){var g=\nthis.options.chart.options3d;d.apply(this,[].slice.call(arguments,1));if(this.is3d()){var c=this.inverted,b=this.clipBox,e=this.margin;b[c?\"y\":\"x\"]=-(e[3]||0);b[c?\"x\":\"y\"]=-(e[0]||0);b[c?\"height\":\"width\"]=this.chartWidth+(e[3]||0)+(e[1]||0);b[c?\"width\":\"height\"]=this.chartHeight+(e[0]||0)+(e[2]||0);this.scale3d=1;!0===g.fitToPlot&&(this.scale3d=w(this,g.depth))}});u(r.prototype,\"redraw\",function(d){this.is3d()&&(this.isDirtyBox=!0,this.frame3d=this.get3dFrame());d.apply(this,[].slice.call(arguments,\n1))});u(r.prototype,\"render\",function(d){this.is3d()&&(this.frame3d=this.get3dFrame());d.apply(this,[].slice.call(arguments,1))});u(r.prototype,\"renderSeries\",function(d){var g=this.series.length;if(this.is3d())for(;g--;)d=this.series[g],d.translate(),d.render();else d.call(this)});u(r.prototype,\"drawChartBox\",function(v){if(this.is3d()){var g=this.renderer,c=this.options.chart.options3d,b=this.get3dFrame(),e=this.plotLeft,a=this.plotLeft+this.plotWidth,f=this.plotTop,k=this.plotTop+this.plotHeight,\nc=c.depth,p=e-(b.left.visible?b.left.size:0),h=a+(b.right.visible?b.right.size:0),q=f-(b.top.visible?b.top.size:0),l=k+(b.bottom.visible?b.bottom.size:0),n=0-(b.front.visible?b.front.size:0),m=c+(b.back.visible?b.back.size:0),u=this.hasRendered?\"animate\":\"attr\";this.frame3d=b;this.frameShapes||(this.frameShapes={bottom:g.polyhedron().add(),top:g.polyhedron().add(),left:g.polyhedron().add(),right:g.polyhedron().add(),back:g.polyhedron().add(),front:g.polyhedron().add()});this.frameShapes.bottom[u]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-bottom\",\nzIndex:b.bottom.frontFacing?-1E3:1E3,faces:[{fill:d.color(b.bottom.color).brighten(.1).get(),vertexes:[{x:p,y:l,z:n},{x:h,y:l,z:n},{x:h,y:l,z:m},{x:p,y:l,z:m}],enabled:b.bottom.visible},{fill:d.color(b.bottom.color).brighten(.1).get(),vertexes:[{x:e,y:k,z:c},{x:a,y:k,z:c},{x:a,y:k,z:0},{x:e,y:k,z:0}],enabled:b.bottom.visible},{fill:d.color(b.bottom.color).brighten(-.1).get(),vertexes:[{x:p,y:l,z:n},{x:p,y:l,z:m},{x:e,y:k,z:c},{x:e,y:k,z:0}],enabled:b.bottom.visible&&!b.left.visible},{fill:d.color(b.bottom.color).brighten(-.1).get(),\nvertexes:[{x:h,y:l,z:m},{x:h,y:l,z:n},{x:a,y:k,z:0},{x:a,y:k,z:c}],enabled:b.bottom.visible&&!b.right.visible},{fill:d.color(b.bottom.color).get(),vertexes:[{x:h,y:l,z:n},{x:p,y:l,z:n},{x:e,y:k,z:0},{x:a,y:k,z:0}],enabled:b.bottom.visible&&!b.front.visible},{fill:d.color(b.bottom.color).get(),vertexes:[{x:p,y:l,z:m},{x:h,y:l,z:m},{x:a,y:k,z:c},{x:e,y:k,z:c}],enabled:b.bottom.visible&&!b.back.visible}]});this.frameShapes.top[u]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-top\",zIndex:b.top.frontFacing?\n-1E3:1E3,faces:[{fill:d.color(b.top.color).brighten(.1).get(),vertexes:[{x:p,y:q,z:m},{x:h,y:q,z:m},{x:h,y:q,z:n},{x:p,y:q,z:n}],enabled:b.top.visible},{fill:d.color(b.top.color).brighten(.1).get(),vertexes:[{x:e,y:f,z:0},{x:a,y:f,z:0},{x:a,y:f,z:c},{x:e,y:f,z:c}],enabled:b.top.visible},{fill:d.color(b.top.color).brighten(-.1).get(),vertexes:[{x:p,y:q,z:m},{x:p,y:q,z:n},{x:e,y:f,z:0},{x:e,y:f,z:c}],enabled:b.top.visible&&!b.left.visible},{fill:d.color(b.top.color).brighten(-.1).get(),vertexes:[{x:h,\ny:q,z:n},{x:h,y:q,z:m},{x:a,y:f,z:c},{x:a,y:f,z:0}],enabled:b.top.visible&&!b.right.visible},{fill:d.color(b.top.color).get(),vertexes:[{x:p,y:q,z:n},{x:h,y:q,z:n},{x:a,y:f,z:0},{x:e,y:f,z:0}],enabled:b.top.visible&&!b.front.visible},{fill:d.color(b.top.color).get(),vertexes:[{x:h,y:q,z:m},{x:p,y:q,z:m},{x:e,y:f,z:c},{x:a,y:f,z:c}],enabled:b.top.visible&&!b.back.visible}]});this.frameShapes.left[u]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-left\",zIndex:b.left.frontFacing?-1E3:1E3,faces:[{fill:d.color(b.left.color).brighten(.1).get(),\nvertexes:[{x:p,y:l,z:n},{x:e,y:k,z:0},{x:e,y:k,z:c},{x:p,y:l,z:m}],enabled:b.left.visible&&!b.bottom.visible},{fill:d.color(b.left.color).brighten(.1).get(),vertexes:[{x:p,y:q,z:m},{x:e,y:f,z:c},{x:e,y:f,z:0},{x:p,y:q,z:n}],enabled:b.left.visible&&!b.top.visible},{fill:d.color(b.left.color).brighten(-.1).get(),vertexes:[{x:p,y:l,z:m},{x:p,y:q,z:m},{x:p,y:q,z:n},{x:p,y:l,z:n}],enabled:b.left.visible},{fill:d.color(b.left.color).brighten(-.1).get(),vertexes:[{x:e,y:f,z:c},{x:e,y:k,z:c},{x:e,y:k,z:0},\n{x:e,y:f,z:0}],enabled:b.left.visible},{fill:d.color(b.left.color).get(),vertexes:[{x:p,y:l,z:n},{x:p,y:q,z:n},{x:e,y:f,z:0},{x:e,y:k,z:0}],enabled:b.left.visible&&!b.front.visible},{fill:d.color(b.left.color).get(),vertexes:[{x:p,y:q,z:m},{x:p,y:l,z:m},{x:e,y:k,z:c},{x:e,y:f,z:c}],enabled:b.left.visible&&!b.back.visible}]});this.frameShapes.right[u]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-right\",zIndex:b.right.frontFacing?-1E3:1E3,faces:[{fill:d.color(b.right.color).brighten(.1).get(),\nvertexes:[{x:h,y:l,z:m},{x:a,y:k,z:c},{x:a,y:k,z:0},{x:h,y:l,z:n}],enabled:b.right.visible&&!b.bottom.visible},{fill:d.color(b.right.color).brighten(.1).get(),vertexes:[{x:h,y:q,z:n},{x:a,y:f,z:0},{x:a,y:f,z:c},{x:h,y:q,z:m}],enabled:b.right.visible&&!b.top.visible},{fill:d.color(b.right.color).brighten(-.1).get(),vertexes:[{x:a,y:f,z:0},{x:a,y:k,z:0},{x:a,y:k,z:c},{x:a,y:f,z:c}],enabled:b.right.visible},{fill:d.color(b.right.color).brighten(-.1).get(),vertexes:[{x:h,y:l,z:n},{x:h,y:q,z:n},{x:h,y:q,\nz:m},{x:h,y:l,z:m}],enabled:b.right.visible},{fill:d.color(b.right.color).get(),vertexes:[{x:h,y:q,z:n},{x:h,y:l,z:n},{x:a,y:k,z:0},{x:a,y:f,z:0}],enabled:b.right.visible&&!b.front.visible},{fill:d.color(b.right.color).get(),vertexes:[{x:h,y:l,z:m},{x:h,y:q,z:m},{x:a,y:f,z:c},{x:a,y:k,z:c}],enabled:b.right.visible&&!b.back.visible}]});this.frameShapes.back[u]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-back\",zIndex:b.back.frontFacing?-1E3:1E3,faces:[{fill:d.color(b.back.color).brighten(.1).get(),\nvertexes:[{x:h,y:l,z:m},{x:p,y:l,z:m},{x:e,y:k,z:c},{x:a,y:k,z:c}],enabled:b.back.visible&&!b.bottom.visible},{fill:d.color(b.back.color).brighten(.1).get(),vertexes:[{x:p,y:q,z:m},{x:h,y:q,z:m},{x:a,y:f,z:c},{x:e,y:f,z:c}],enabled:b.back.visible&&!b.top.visible},{fill:d.color(b.back.color).brighten(-.1).get(),vertexes:[{x:p,y:l,z:m},{x:p,y:q,z:m},{x:e,y:f,z:c},{x:e,y:k,z:c}],enabled:b.back.visible&&!b.left.visible},{fill:d.color(b.back.color).brighten(-.1).get(),vertexes:[{x:h,y:q,z:m},{x:h,y:l,\nz:m},{x:a,y:k,z:c},{x:a,y:f,z:c}],enabled:b.back.visible&&!b.right.visible},{fill:d.color(b.back.color).get(),vertexes:[{x:e,y:f,z:c},{x:a,y:f,z:c},{x:a,y:k,z:c},{x:e,y:k,z:c}],enabled:b.back.visible},{fill:d.color(b.back.color).get(),vertexes:[{x:p,y:l,z:m},{x:h,y:l,z:m},{x:h,y:q,z:m},{x:p,y:q,z:m}],enabled:b.back.visible}]});this.frameShapes.front[u]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-front\",zIndex:b.front.frontFacing?-1E3:1E3,faces:[{fill:d.color(b.front.color).brighten(.1).get(),\nvertexes:[{x:p,y:l,z:n},{x:h,y:l,z:n},{x:a,y:k,z:0},{x:e,y:k,z:0}],enabled:b.front.visible&&!b.bottom.visible},{fill:d.color(b.front.color).brighten(.1).get(),vertexes:[{x:h,y:q,z:n},{x:p,y:q,z:n},{x:e,y:f,z:0},{x:a,y:f,z:0}],enabled:b.front.visible&&!b.top.visible},{fill:d.color(b.front.color).brighten(-.1).get(),vertexes:[{x:p,y:q,z:n},{x:p,y:l,z:n},{x:e,y:k,z:0},{x:e,y:f,z:0}],enabled:b.front.visible&&!b.left.visible},{fill:d.color(b.front.color).brighten(-.1).get(),vertexes:[{x:h,y:l,z:n},{x:h,\ny:q,z:n},{x:a,y:f,z:0},{x:a,y:k,z:0}],enabled:b.front.visible&&!b.right.visible},{fill:d.color(b.front.color).get(),vertexes:[{x:a,y:f,z:0},{x:e,y:f,z:0},{x:e,y:k,z:0},{x:a,y:k,z:0}],enabled:b.front.visible},{fill:d.color(b.front.color).get(),vertexes:[{x:h,y:l,z:n},{x:p,y:l,z:n},{x:p,y:q,z:n},{x:h,y:q,z:n}],enabled:b.front.visible}]})}return v.apply(this,[].slice.call(arguments,1))});r.prototype.retrieveStacks=function(d){var g=this.series,c={},b,e=1;t(this.series,function(a){b=m(a.options.stack,\nd?0:g.length-1-a.index);c[b]?c[b].series.push(a):(c[b]={series:[a],position:e},e++)});c.totalStacks=e+1;return c};r.prototype.get3dFrame=function(){var h=this,g=h.options.chart.options3d,c=g.frame,b=h.plotLeft,e=h.plotLeft+h.plotWidth,a=h.plotTop,f=h.plotTop+h.plotHeight,k=g.depth,p=d.shapeArea3d([{x:b,y:f,z:k},{x:e,y:f,z:k},{x:e,y:f,z:0},{x:b,y:f,z:0}],h),u=d.shapeArea3d([{x:b,y:a,z:0},{x:e,y:a,z:0},{x:e,y:a,z:k},{x:b,y:a,z:k}],h),q=d.shapeArea3d([{x:b,y:a,z:0},{x:b,y:a,z:k},{x:b,y:f,z:k},{x:b,y:f,\nz:0}],h),l=d.shapeArea3d([{x:e,y:a,z:k},{x:e,y:a,z:0},{x:e,y:f,z:0},{x:e,y:f,z:k}],h),n=d.shapeArea3d([{x:b,y:f,z:0},{x:e,y:f,z:0},{x:e,y:a,z:0},{x:b,y:a,z:0}],h),r=d.shapeArea3d([{x:b,y:a,z:k},{x:e,y:a,z:k},{x:e,y:f,z:k},{x:b,y:f,z:k}],h),x=!1,w=!1,A=!1,G=!1;t([].concat(h.xAxis,h.yAxis,h.zAxis),function(a){a&&(a.horiz?a.opposite?w=!0:x=!0:a.opposite?G=!0:A=!0)});var E=function(a,e,b){for(var c=[\"size\",\"color\",\"visible\"],d={},f=0;f<c.length;f++)for(var k=c[f],g=0;g<a.length;g++)if(\"object\"===typeof a[g]){var h=\na[g][k];if(void 0!==h&&null!==h){d[k]=h;break}}a=b;!0===d.visible||!1===d.visible?a=d.visible:\"auto\"===d.visible&&(a=0<=e);return{size:m(d.size,1),color:m(d.color,\"none\"),frontFacing:0<e,visible:a}},c={bottom:E([c.bottom,c.top,c],p,x),top:E([c.top,c.bottom,c],u,w),left:E([c.left,c.right,c.side,c],q,A),right:E([c.right,c.left,c.side,c],l,G),back:E([c.back,c.front,c],r,!0),front:E([c.front,c.back,c],n,!1)};\"auto\"===g.axisLabelPosition?(l=function(a,e){return a.visible!==e.visible||a.visible&&e.visible&&\na.frontFacing!==e.frontFacing},g=[],l(c.left,c.front)&&g.push({y:(a+f)/2,x:b,z:0}),l(c.left,c.back)&&g.push({y:(a+f)/2,x:b,z:k}),l(c.right,c.front)&&g.push({y:(a+f)/2,x:e,z:0}),l(c.right,c.back)&&g.push({y:(a+f)/2,x:e,z:k}),p=[],l(c.bottom,c.front)&&p.push({x:(b+e)/2,y:f,z:0}),l(c.bottom,c.back)&&p.push({x:(b+e)/2,y:f,z:k}),u=[],l(c.top,c.front)&&u.push({x:(b+e)/2,y:a,z:0}),l(c.top,c.back)&&u.push({x:(b+e)/2,y:a,z:k}),q=[],l(c.bottom,c.left)&&q.push({z:(0+k)/2,y:f,x:b}),l(c.bottom,c.right)&&q.push({z:(0+\nk)/2,y:f,x:e}),f=[],l(c.top,c.left)&&f.push({z:(0+k)/2,y:a,x:b}),l(c.top,c.right)&&f.push({z:(0+k)/2,y:a,x:e}),b=function(a,e,b){if(0===a.length)return null;if(1===a.length)return a[0];for(var c=0,d=y(a,h,!1),f=1;f<d.length;f++)b*d[f][e]>b*d[c][e]?c=f:b*d[f][e]===b*d[c][e]&&d[f].z<d[c].z&&(c=f);return a[c]},c.axes={y:{left:b(g,\"x\",-1),right:b(g,\"x\",1)},x:{top:b(u,\"y\",-1),bottom:b(p,\"y\",1)},z:{top:b(f,\"y\",-1),bottom:b(q,\"y\",1)}}):c.axes={y:{left:{x:b,z:0},right:{x:e,z:0}},x:{top:{y:a,z:0},bottom:{y:f,\nz:0}},z:{top:{x:A?e:b,y:a},bottom:{x:A?e:b,y:f}}};return c}})(A);(function(d){function w(e,a){if(e.chart.is3d()&&\"colorAxis\"!==e.coll){var b=e.chart,c=b.frame3d,d=b.plotLeft,g=b.plotWidth+d,m=b.plotTop,b=b.plotHeight+m,l=0,n=0;a=e.swapZ({x:a.x,y:a.y,z:0});if(e.isZAxis)if(e.opposite){if(null===c.axes.z.top)return{};n=a.y-m;a.x=c.axes.z.top.x;a.y=c.axes.z.top.y}else{if(null===c.axes.z.bottom)return{};n=a.y-b;a.x=c.axes.z.bottom.x;a.y=c.axes.z.bottom.y}else if(e.horiz)if(e.opposite){if(null===c.axes.x.top)return{};\nn=a.y-m;a.y=c.axes.x.top.y;a.z=c.axes.x.top.z}else{if(null===c.axes.x.bottom)return{};n=a.y-b;a.y=c.axes.x.bottom.y;a.z=c.axes.x.bottom.z}else if(e.opposite){if(null===c.axes.y.right)return{};l=a.x-g;a.x=c.axes.y.right.x;a.z=c.axes.y.right.z}else{if(null===c.axes.y.left)return{};l=a.x-d;a.x=c.axes.y.left.x;a.z=c.axes.y.left.z}a=h([a],e.chart)[0];a.x+=l;a.y+=n}return a}var r,t=d.Axis,x=d.Chart,y=d.each,m=d.extend,u=d.merge,h=d.perspective,v=d.pick,g=d.splat,c=d.Tick,b=d.wrap;b(t.prototype,\"setOptions\",\nfunction(e,a){e.call(this,a);this.chart.is3d()&&\"colorAxis\"!==this.coll&&(e=this.options,e.tickWidth=v(e.tickWidth,0),e.gridLineWidth=v(e.gridLineWidth,1))});b(t.prototype,\"getPlotLinePath\",function(e){var a=e.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d()||\"colorAxis\"===this.coll||null===a)return a;var b=this.chart,c=b.options.chart.options3d,c=this.isZAxis?b.plotWidth:c.depth,b=b.frame3d,a=[this.swapZ({x:a[1],y:a[2],z:0}),this.swapZ({x:a[1],y:a[2],z:c}),this.swapZ({x:a[4],y:a[5],z:0}),\nthis.swapZ({x:a[4],y:a[5],z:c})],c=[];this.horiz?(this.isZAxis?(b.left.visible&&c.push(a[0],a[2]),b.right.visible&&c.push(a[1],a[3])):(b.front.visible&&c.push(a[0],a[2]),b.back.visible&&c.push(a[1],a[3])),b.top.visible&&c.push(a[0],a[1]),b.bottom.visible&&c.push(a[2],a[3])):(b.front.visible&&c.push(a[0],a[2]),b.back.visible&&c.push(a[1],a[3]),b.left.visible&&c.push(a[0],a[1]),b.right.visible&&c.push(a[2],a[3]));c=h(c,this.chart,!1);return this.chart.renderer.toLineSegments(c)});b(t.prototype,\"getLinePath\",\nfunction(b){return this.chart.is3d()?[]:b.apply(this,[].slice.call(arguments,1))});b(t.prototype,\"getPlotBandPath\",function(b){if(!this.chart.is3d()||\"colorAxis\"===this.coll)return b.apply(this,[].slice.call(arguments,1));var a=arguments,e=a[2],c=[],a=this.getPlotLinePath(a[1]),e=this.getPlotLinePath(e);if(a&&e)for(var d=0;d<a.length;d+=6)c.push(\"M\",a[d+1],a[d+2],\"L\",a[d+4],a[d+5],\"L\",e[d+4],e[d+5],\"L\",e[d+1],e[d+2],\"Z\");return c});b(c.prototype,\"getMarkPath\",function(b){var a=b.apply(this,[].slice.call(arguments,\n1)),a=[w(this.axis,{x:a[1],y:a[2],z:0}),w(this.axis,{x:a[4],y:a[5],z:0})];return this.axis.chart.renderer.toLineSegments(a)});b(c.prototype,\"getLabelPosition\",function(b){var a=b.apply(this,[].slice.call(arguments,1));return w(this.axis,a)});d.wrap(t.prototype,\"getTitlePosition\",function(b){var a=b.apply(this,[].slice.call(arguments,1));return w(this,a)});b(t.prototype,\"drawCrosshair\",function(b){var a=arguments;this.chart.is3d()&&a[2]&&(a[2]={plotX:a[2].plotXold||a[2].plotX,plotY:a[2].plotYold||\na[2].plotY});b.apply(this,[].slice.call(a,1))});b(t.prototype,\"destroy\",function(b){y([\"backFrame\",\"bottomFrame\",\"sideFrame\"],function(a){this[a]&&(this[a]=this[a].destroy())},this);b.apply(this,[].slice.call(arguments,1))});t.prototype.swapZ=function(b,a){return this.isZAxis?(a=a?0:this.chart.plotLeft,{x:a+b.z,y:b.y,z:b.x-a}):b};r=d.ZAxis=function(){this.init.apply(this,arguments)};m(r.prototype,t.prototype);m(r.prototype,{isZAxis:!0,setOptions:function(b){b=u({offset:0,lineWidth:0},b);t.prototype.setOptions.call(this,\nb);this.coll=\"zAxis\"},setAxisSize:function(){t.prototype.setAxisSize.call(this);this.width=this.len=this.chart.options.chart.options3d.depth;this.right=this.chart.chartWidth-this.width-this.left},getSeriesExtremes:function(){var b=this,a=b.chart;b.hasVisibleSeries=!1;b.dataMin=b.dataMax=b.ignoreMinPadding=b.ignoreMaxPadding=null;b.buildStacks&&b.buildStacks();y(b.series,function(c){if(c.visible||!a.options.chart.ignoreHiddenSeries)b.hasVisibleSeries=!0,c=c.zData,c.length&&(b.dataMin=Math.min(v(b.dataMin,\nc[0]),Math.min.apply(null,c)),b.dataMax=Math.max(v(b.dataMax,c[0]),Math.max.apply(null,c)))})}});b(x.prototype,\"getAxes\",function(b){var a=this,c=this.options,c=c.zAxis=g(c.zAxis||{});b.call(this);a.is3d()&&(this.zAxis=[],y(c,function(b,c){b.index=c;b.isX=!0;(new r(a,b)).setScale()}))})})(A);(function(d){function w(d){var g=d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&(g.stroke=this.options.edgeColor||g.fill,g[\"stroke-width\"]=x(this.options.edgeWidth,1));return g}var r=d.each,t=d.perspective,\nx=d.pick,y=d.Series,m=d.seriesTypes,u=d.inArray,h=d.svg;d=d.wrap;d(m.column.prototype,\"translate\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var g=this,c=g.chart,b=g.options,e=b.depth||25,a=g.borderWidth%2?.5:0;if(c.inverted&&!g.yAxis.reversed||!c.inverted&&g.yAxis.reversed)a*=-1;var f=(b.stacking?b.stack||0:g.index)*(e+(b.groupZPadding||1));!1!==b.grouping&&(f=0);f+=b.groupZPadding||1;r(g.data,function(b){if(null!==b.y){var d=b.shapeArgs,h=b.tooltipPos,k;r([[\"x\",\"width\"],\n[\"y\",\"height\"]],function(b){k=d[b[0]]-a;if(0>k+d[b[1]]||k>g[b[0]+\"Axis\"].len)for(var c in d)d[c]=0;0>k&&(d[b[1]]+=d[b[0]],d[b[0]]=0);k+d[b[1]]>g[b[0]+\"Axis\"].len&&(d[b[1]]=g[b[0]+\"Axis\"].len-d[b[0]])});b.shapeType=\"cuboid\";d.z=f;d.depth=e;d.insidePlotArea=!0;h=t([{x:h[0],y:h[1],z:f}],c,!0)[0];b.tooltipPos=[h.x,h.y]}});g.z=f}});d(m.column.prototype,\"animate\",function(d){if(this.chart.is3d()){var g=arguments[1],c=this.yAxis,b=this,e=this.yAxis.reversed;h&&(g?r(b.data,function(a){null!==a.y&&(a.height=\na.shapeArgs.height,a.shapey=a.shapeArgs.y,a.shapeArgs.height=1,e||(a.shapeArgs.y=a.stackY?a.plotY+c.translate(a.stackY):a.plotY+(a.negative?-a.height:a.height)))}):(r(b.data,function(a){null!==a.y&&(a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&&a.graphic.animate(a.shapeArgs,b.options.animation))}),this.drawDataLabels(),b.animate=null))}else d.apply(this,[].slice.call(arguments,1))});d(m.column.prototype,\"plotGroup\",function(d,g,c,b,e,a){this.chart.is3d()&&a&&!this[g]&&(this[g]=a,a.attr(this.getPlotBox()),\nthis[g].survive=!0);return d.apply(this,Array.prototype.slice.call(arguments,1))});d(m.column.prototype,\"setVisible\",function(d,g){var c=this,b;c.chart.is3d()&&r(c.data,function(e){b=(e.visible=e.options.visible=g=void 0===g?!e.visible:g)?\"visible\":\"hidden\";c.options.data[u(e,c.data)]=e.options;e.graphic&&e.graphic.attr({visibility:b})});d.apply(this,Array.prototype.slice.call(arguments,1))});d(m.column.prototype,\"init\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var g=\nthis.options,c=g.grouping,b=g.stacking,e=x(this.yAxis.options.reversedStacks,!0),a=0;if(void 0===c||c){c=this.chart.retrieveStacks(b);a=g.stack||0;for(b=0;b<c[a].series.length&&c[a].series[b]!==this;b++);a=10*(c.totalStacks-c[a].position)+(e?b:-b);this.xAxis.reversed||(a=10*c.totalStacks-a)}g.zIndex=a}});d(m.column.prototype,\"pointAttribs\",w);m.columnrange&&(d(m.columnrange.prototype,\"pointAttribs\",w),m.columnrange.prototype.plotGroup=m.column.prototype.plotGroup,m.columnrange.prototype.setVisible=\nm.column.prototype.setVisible);d(y.prototype,\"alignDataLabel\",function(d){if(this.chart.is3d()&&(\"column\"===this.type||\"columnrange\"===this.type)){var g=arguments[4],c={x:g.x,y:g.y,z:this.z},c=t([c],this.chart,!0)[0];g.x=c.x;g.y=c.y}d.apply(this,[].slice.call(arguments,1))})})(A);(function(d){var w=d.deg2rad,r=d.each,t=d.pick,x=d.seriesTypes,y=d.svg;d=d.wrap;d(x.pie.prototype,\"translate\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var m=this,h=m.options,v=h.depth||0,\ng=m.chart.options.chart.options3d,c=g.alpha,b=g.beta,e=h.stacking?(h.stack||0)*v:m._i*v,e=e+v/2;!1!==h.grouping&&(e=0);r(m.data,function(a){var d=a.shapeArgs;a.shapeType=\"arc3d\";d.z=e;d.depth=.75*v;d.alpha=c;d.beta=b;d.center=m.center;d=(d.end+d.start)/2;a.slicedTranslation={translateX:Math.round(Math.cos(d)*h.slicedOffset*Math.cos(c*w)),translateY:Math.round(Math.sin(d)*h.slicedOffset*Math.cos(c*w))}})}});d(x.pie.prototype.pointClass.prototype,\"haloPath\",function(d){var m=arguments;return this.series.chart.is3d()?\n[]:d.call(this,m[1])});d(x.pie.prototype,\"pointAttribs\",function(d,u,h){d=d.call(this,u,h);h=this.options;this.chart.is3d()&&(d.stroke=h.edgeColor||u.color||this.color,d[\"stroke-width\"]=t(h.edgeWidth,1));return d});d(x.pie.prototype,\"drawPoints\",function(d){d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&r(this.points,function(d){var h=d.graphic;if(h)h[d.y&&d.visible?\"show\":\"hide\"]()})});d(x.pie.prototype,\"drawDataLabels\",function(d){if(this.chart.is3d()){var m=this.chart.options.chart.options3d;\nr(this.data,function(d){var h=d.shapeArgs,g=h.r,c=(h.start+h.end)/2,b=d.labelPos,e=-g*(1-Math.cos((h.alpha||m.alpha)*w))*Math.sin(c),a=g*(Math.cos((h.beta||m.beta)*w)-1)*Math.cos(c);r([0,2,4],function(c){b[c]+=a;b[c+1]+=e})})}d.apply(this,[].slice.call(arguments,1))});d(x.pie.prototype,\"addPoint\",function(d){d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});d(x.pie.prototype,\"animate\",function(d){if(this.chart.is3d()){var m=arguments[1],h=this.options.animation,\nr=this.center,g=this.group,c=this.markerGroup;y&&(!0===h&&(h={}),m?(g.oldtranslateX=g.translateX,g.oldtranslateY=g.translateY,m={translateX:r[0],translateY:r[1],scaleX:.001,scaleY:.001},g.attr(m),c&&(c.attrSetters=g.attrSetters,c.attr(m))):(m={translateX:g.oldtranslateX,translateY:g.oldtranslateY,scaleX:1,scaleY:1},g.animate(m,h),c&&c.animate(m,h),this.animate=null))}else d.apply(this,[].slice.call(arguments,1))})})(A);(function(d){var w=d.perspective,r=d.pick,t=d.Point,x=d.seriesTypes,y=d.wrap;y(x.scatter.prototype,\n\"translate\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var m=this.chart,h=r(this.zAxis,m.options.zAxis[0]),t=[],g,c,b;for(b=0;b<this.data.length;b++)g=this.data[b],c=h.isLog&&h.val2lin?h.val2lin(g.z):g.z,g.plotZ=h.translate(c),g.isInside=g.isInside?c>=h.min&&c<=h.max:!1,t.push({x:g.plotX,y:g.plotY,z:g.plotZ});m=w(t,m,!0);for(b=0;b<this.data.length;b++)g=this.data[b],h=m[b],g.plotXold=g.plotX,g.plotYold=g.plotY,g.plotZold=g.plotZ,g.plotX=h.x,g.plotY=h.y,g.plotZ=h.z}});\ny(x.scatter.prototype,\"init\",function(d,r,h){r.is3d()&&(this.axisTypes=[\"xAxis\",\"yAxis\",\"zAxis\"],this.pointArrayMap=[\"x\",\"y\",\"z\"],this.parallelArrays=[\"x\",\"y\",\"z\"],this.directTouch=!0);d=d.apply(this,[r,h]);this.chart.is3d()&&(this.tooltipOptions.pointFormat=this.userOptions.tooltip?this.userOptions.tooltip.pointFormat||\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3ez: \\x3cb\\x3e{point.z}\\x3c/b\\x3e\\x3cbr/\\x3e\":\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3ez: \\x3cb\\x3e{point.z}\\x3c/b\\x3e\\x3cbr/\\x3e\");\nreturn d});y(x.scatter.prototype,\"pointAttribs\",function(m,r){var h=m.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&r&&(h.zIndex=d.pointCameraDistance(r,this.chart));return h});y(t.prototype,\"applyOptions\",function(d){var m=d.apply(this,[].slice.call(arguments,1));this.series.chart.is3d()&&void 0===m.z&&(m.z=0);return m})})(A);(function(d){var w=d.Axis,r=d.SVGRenderer,t=d.VMLRenderer;t&&(d.setOptions({animate:!1}),t.prototype.face3d=r.prototype.face3d,t.prototype.polyhedron=r.prototype.polyhedron,\nt.prototype.cuboid=r.prototype.cuboid,t.prototype.cuboidPath=r.prototype.cuboidPath,t.prototype.toLinePath=r.prototype.toLinePath,t.prototype.toLineSegments=r.prototype.toLineSegments,t.prototype.createElement3D=r.prototype.createElement3D,t.prototype.arc3d=function(d){d=r.prototype.arc3d.call(this,d);d.css({zIndex:d.zIndex});return d},d.VMLRenderer.prototype.arc3dPath=d.SVGRenderer.prototype.arc3dPath,d.wrap(w.prototype,\"render\",function(d){d.apply(this,[].slice.call(arguments,1));this.sideFrame&&\n(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))}))})(A)});\n"
  },
  {
    "path": "assets/highcharts/highcharts-3d.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * 3D features for Highcharts JS\n *\n * @license: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         *\tMathematical Functionility\n         */\n        var deg2rad = H.deg2rad,\n            pick = H.pick;\n        /**\n         * Apply 3-D rotation\n         * Euler Angles (XYZ): cosA = cos(Alfa|Roll), cosB = cos(Beta|Pitch), cosG = cos(Gamma|Yaw) \n         * \n         * Composite rotation:\n         * |          cosB * cosG             |           cosB * sinG            |    -sinB    |\n         * | sinA * sinB * cosG - cosA * sinG | sinA * sinB * sinG + cosA * cosG | sinA * cosB |\n         * | cosA * sinB * cosG + sinA * sinG | cosA * sinB * sinG - sinA * cosG | cosA * cosB |\n         * \n         * Now, Gamma/Yaw is not used (angle=0), so we assume cosG = 1 and sinG = 0, so we get:\n         * |     cosB    |   0    |   - sinB    |\n         * | sinA * sinB |  cosA  | sinA * cosB |\n         * | cosA * sinB | - sinA | cosA * cosB |\n         * \n         * But in browsers, y is reversed, so we get sinA => -sinA. The general result is:\n         * |      cosB     |   0    |    - sinB     |     | x |     | px |\n         * | - sinA * sinB |  cosA  | - sinA * cosB |  x  | y |  =  | py | \n         * |  cosA * sinB  |  sinA  |  cosA * cosB  |     | z |     | pz |\n         */\n        function rotate3D(x, y, z, angles) {\n            return {\n                x: angles.cosB * x - angles.sinB * z,\n                y: -angles.sinA * angles.sinB * x + angles.cosA * y - angles.cosB * angles.sinA * z,\n                z: angles.cosA * angles.sinB * x + angles.sinA * y + angles.cosA * angles.cosB * z\n            };\n        }\n\n        function perspective3D(coordinate, origin, distance) {\n            var projection = ((distance > 0) && (distance < Number.POSITIVE_INFINITY)) ? distance / (coordinate.z + origin.z + distance) : 1;\n            return {\n                x: coordinate.x * projection,\n                y: coordinate.y * projection\n            };\n        }\n\n        /**\n         * Transforms a given array of points according to the angles in chart.options.\n         * Parameters:\n         *\t\t- points: the array of points\n         *\t\t- chart: the chart\n         *\t\t- insidePlotArea: wether to verifiy the points are inside the plotArea\n         * Returns:\n         *\t\t- an array of transformed points\n         */\n        H.perspective = function(points, chart, insidePlotArea) {\n            var options3d = chart.options.chart.options3d,\n                inverted = insidePlotArea ? chart.inverted : false,\n                origin = {\n                    x: chart.plotWidth / 2,\n                    y: chart.plotHeight / 2,\n                    z: options3d.depth / 2,\n                    vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)\n                },\n                scale = chart.scale3d || 1,\n                beta = deg2rad * options3d.beta * (inverted ? -1 : 1),\n                alpha = deg2rad * options3d.alpha * (inverted ? -1 : 1),\n                angles = {\n                    cosA: Math.cos(alpha),\n                    cosB: Math.cos(-beta),\n                    sinA: Math.sin(alpha),\n                    sinB: Math.sin(-beta)\n                };\n\n            if (!insidePlotArea) {\n                origin.x += chart.plotLeft;\n                origin.y += chart.plotTop;\n            }\n\n            // Transform each point\n            return H.map(points, function(point) {\n                var rotated = rotate3D(\n                        (inverted ? point.y : point.x) - origin.x,\n                        (inverted ? point.x : point.y) - origin.y,\n                        (point.z || 0) - origin.z,\n                        angles\n                    ),\n                    coordinate = perspective3D(rotated, origin, origin.vd); // Apply perspective\n\n                // Apply translation\n                coordinate.x = coordinate.x * scale + origin.x;\n                coordinate.y = coordinate.y * scale + origin.y;\n                coordinate.z = rotated.z * scale + origin.z;\n\n                return {\n                    x: (inverted ? coordinate.y : coordinate.x),\n                    y: (inverted ? coordinate.x : coordinate.y),\n                    z: coordinate.z\n                };\n            });\n        };\n\n        /**\n         * Calculate a distance from camera to points - made for calculating zIndex of scatter points.\n         * Parameters:\n         *\t\t- coordinates: The coordinates of the specific point\n         *\t\t- chart: the chart\n         * Returns:\n         *\t\t- a distance from camera to point\n         */\n        H.pointCameraDistance = function(coordinates, chart) {\n            var options3d = chart.options.chart.options3d,\n                cameraPosition = {\n                    x: chart.plotWidth / 2,\n                    y: chart.plotHeight / 2,\n                    z: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) + options3d.depth\n                },\n                distance = Math.sqrt(Math.pow(cameraPosition.x - coordinates.plotX, 2) + Math.pow(cameraPosition.y - coordinates.plotY, 2) + Math.pow(cameraPosition.z - coordinates.plotZ, 2));\n            return distance;\n        };\n\n        /**\n         * Calculate area of a 2D polygon using Shoelace algorithm\n         * http://en.wikipedia.org/wiki/Shoelace_formula\n         */\n        H.shapeArea = function(vertexes) {\n            var area = 0,\n                i,\n                j;\n            for (i = 0; i < vertexes.length; i++) {\n                j = (i + 1) % vertexes.length;\n                area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y;\n            }\n            return area / 2;\n        };\n\n        /**\n         * Calculate area of a 3D polygon after perspective projection\n         */\n        H.shapeArea3d = function(vertexes, chart, insidePlotArea) {\n            return H.shapeArea(H.perspective(vertexes, chart, insidePlotArea));\n        };\n\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var cos = Math.cos,\n            PI = Math.PI,\n            sin = Math.sin;\n\n\n        var animObject = H.animObject,\n            charts = H.charts,\n            color = H.color,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            each = H.each,\n            extend = H.extend,\n            inArray = H.inArray,\n            map = H.map,\n            merge = H.merge,\n            perspective = H.perspective,\n            pick = H.pick,\n            SVGElement = H.SVGElement,\n            SVGRenderer = H.SVGRenderer,\n            wrap = H.wrap;\n        /*** \n        \tEXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES\n        \t***/\n        ////// HELPER METHODS //////\n\n        var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2);\n\n        /** Method to construct a curved path\n         * Can 'wrap' around more then 180 degrees\n         */\n        function curveTo(cx, cy, rx, ry, start, end, dx, dy) {\n            var result = [],\n                arcAngle = end - start;\n            if ((end > start) && (end - start > Math.PI / 2 + 0.0001)) {\n                result = result.concat(curveTo(cx, cy, rx, ry, start, start + (Math.PI / 2), dx, dy));\n                result = result.concat(curveTo(cx, cy, rx, ry, start + (Math.PI / 2), end, dx, dy));\n                return result;\n            }\n            if ((end < start) && (start - end > Math.PI / 2 + 0.0001)) {\n                result = result.concat(curveTo(cx, cy, rx, ry, start, start - (Math.PI / 2), dx, dy));\n                result = result.concat(curveTo(cx, cy, rx, ry, start - (Math.PI / 2), end, dx, dy));\n                return result;\n            }\n            return [\n                'C',\n                cx + (rx * Math.cos(start)) - ((rx * dFactor * arcAngle) * Math.sin(start)) + dx,\n                cy + (ry * Math.sin(start)) + ((ry * dFactor * arcAngle) * Math.cos(start)) + dy,\n                cx + (rx * Math.cos(end)) + ((rx * dFactor * arcAngle) * Math.sin(end)) + dx,\n                cy + (ry * Math.sin(end)) - ((ry * dFactor * arcAngle) * Math.cos(end)) + dy,\n\n                cx + (rx * Math.cos(end)) + dx,\n                cy + (ry * Math.sin(end)) + dy\n            ];\n        }\n\n\n\n        SVGRenderer.prototype.toLinePath = function(points, closed) {\n            var result = [];\n\n            // Put \"L x y\" for each point\n            each(points, function(point) {\n                result.push('L', point.x, point.y);\n            });\n\n            if (points.length) {\n                // Set the first element to M\n                result[0] = 'M';\n\n                // If it is a closed line, add Z\n                if (closed) {\n                    result.push('Z');\n                }\n            }\n\n            return result;\n        };\n\n        SVGRenderer.prototype.toLineSegments = function(points) {\n            var result = [];\n\n            var m = true;\n            each(points, function(point) {\n                result.push(m ? 'M' : 'L', point.x, point.y);\n                m = !m;\n            });\n\n            return result;\n        };\n\n        /**\n         * A 3-D Face is defined by it's 3D vertexes, and is only\n         * visible if it's vertexes are counter-clockwise (Back-face culling).\n         * It is used as a polyhedron Element\n         */\n        SVGRenderer.prototype.face3d = function(args) {\n            var renderer = this,\n                ret = this.createElement('path');\n            ret.vertexes = [];\n            ret.insidePlotArea = false;\n            ret.enabled = true;\n\n            wrap(ret, 'attr', function(proceed, hash) {\n                if (typeof hash === 'object' &&\n                    (defined(hash.enabled) || defined(hash.vertexes) || defined(hash.insidePlotArea))) {\n                    this.enabled = pick(hash.enabled, this.enabled);\n                    this.vertexes = pick(hash.vertexes, this.vertexes);\n                    this.insidePlotArea = pick(hash.insidePlotArea, this.insidePlotArea);\n                    delete hash.enabled;\n                    delete hash.vertexes;\n                    delete hash.insidePlotArea;\n\n                    var chart = charts[renderer.chartIndex],\n                        vertexes2d = perspective(this.vertexes, chart, this.insidePlotArea),\n                        path = renderer.toLinePath(vertexes2d, true),\n                        area = H.shapeArea(vertexes2d),\n                        visibility = (this.enabled && area > 0) ? 'visible' : 'hidden';\n\n                    hash.d = path;\n                    hash.visibility = visibility;\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            wrap(ret, 'animate', function(proceed, params) {\n                if (typeof params === 'object' &&\n                    (defined(params.enabled) || defined(params.vertexes) || defined(params.insidePlotArea))) {\n                    this.enabled = pick(params.enabled, this.enabled);\n                    this.vertexes = pick(params.vertexes, this.vertexes);\n                    this.insidePlotArea = pick(params.insidePlotArea, this.insidePlotArea);\n                    delete params.enabled;\n                    delete params.vertexes;\n                    delete params.insidePlotArea;\n\n                    var chart = charts[renderer.chartIndex],\n                        vertexes2d = perspective(this.vertexes, chart, this.insidePlotArea),\n                        path = renderer.toLinePath(vertexes2d, true),\n                        area = H.shapeArea(vertexes2d),\n                        visibility = (this.enabled && area > 0) ? 'visible' : 'hidden';\n\n                    params.d = path;\n                    this.attr('visibility', visibility);\n                }\n\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            return ret.attr(args);\n        };\n\n        /**\n         * A Polyhedron is a handy way of defining a group of 3-D faces.\n         * It's only attribute is `faces`, an array of attributes of each one of it's Face3D instances.\n         */\n        SVGRenderer.prototype.polyhedron = function(args) {\n            var renderer = this,\n                result = this.g(),\n                destroy = result.destroy;\n\n\n            result.attr({\n                'stroke-linejoin': 'round'\n            });\n\n\n            result.faces = [];\n\n\n            // destroy all children\n            result.destroy = function() {\n                for (var i = 0; i < result.faces.length; i++) {\n                    result.faces[i].destroy();\n                }\n                return destroy.call(this);\n            };\n\n            wrap(result, 'attr', function(proceed, hash, val, complete, continueAnimation) {\n                if (typeof hash === 'object' && defined(hash.faces)) {\n                    while (result.faces.length > hash.faces.length) {\n                        result.faces.pop().destroy();\n                    }\n                    while (result.faces.length < hash.faces.length) {\n                        result.faces.push(renderer.face3d().add(result));\n                    }\n                    for (var i = 0; i < hash.faces.length; i++) {\n                        result.faces[i].attr(hash.faces[i], null, complete, continueAnimation);\n                    }\n                    delete hash.faces;\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            wrap(result, 'animate', function(proceed, params, duration, complete) {\n                if (params && params.faces) {\n                    while (result.faces.length > params.faces.length) {\n                        result.faces.pop().destroy();\n                    }\n                    while (result.faces.length < params.faces.length) {\n                        result.faces.push(renderer.face3d().add(result));\n                    }\n                    for (var i = 0; i < params.faces.length; i++) {\n                        result.faces[i].animate(params.faces[i], duration, complete);\n                    }\n                    delete params.faces;\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            return result.attr(args);\n        };\n\n        ////// CUBOIDS //////\n        SVGRenderer.prototype.cuboid = function(shapeArgs) {\n\n            var result = this.g(),\n                destroy = result.destroy,\n                paths = this.cuboidPath(shapeArgs);\n\n\n            result.attr({\n                'stroke-linejoin': 'round'\n            });\n\n\n            // create the 3 sides\n            result.front = this.path(paths[0]).attr({\n                'class': 'highcharts-3d-front'\n            }).add(result); // Front, top and side are never overlapping in our case so it is redundant to set zIndex of every element.\n            result.top = this.path(paths[1]).attr({\n                'class': 'highcharts-3d-top'\n            }).add(result);\n            result.side = this.path(paths[2]).attr({\n                'class': 'highcharts-3d-side'\n            }).add(result);\n\n            // apply the fill everywhere, the top a bit brighter, the side a bit darker\n            result.fillSetter = function(fill) {\n                this.front.attr({\n                    fill: fill\n                });\n                this.top.attr({\n                    fill: color(fill).brighten(0.1).get()\n                });\n                this.side.attr({\n                    fill: color(fill).brighten(-0.1).get()\n                });\n\n                this.color = fill;\n                return this;\n            };\n\n            // apply opacaity everywhere\n            result.opacitySetter = function(opacity) {\n                this.front.attr({\n                    opacity: opacity\n                });\n                this.top.attr({\n                    opacity: opacity\n                });\n                this.side.attr({\n                    opacity: opacity\n                });\n                return this;\n            };\n\n            result.attr = function(args, val) {\n\n                // Resolve setting attributes by string name\n                if (typeof args === 'string' && typeof val !== 'undefined') {\n                    var key = args;\n                    args = {};\n                    args[key] = val;\n                }\n\n                if (args.shapeArgs || defined(args.x)) {\n                    var shapeArgs = args.shapeArgs || args;\n                    var paths = this.renderer.cuboidPath(shapeArgs);\n                    this.front.attr({\n                        d: paths[0]\n                    });\n                    this.top.attr({\n                        d: paths[1]\n                    });\n                    this.side.attr({\n                        d: paths[2]\n                    });\n                } else {\n                    return H.SVGElement.prototype.attr.call(this, args); // getter returns value\n                }\n\n                return this;\n            };\n\n            result.animate = function(args, duration, complete) {\n                if (defined(args.x) && defined(args.y)) {\n                    var paths = this.renderer.cuboidPath(args);\n                    this.front.animate({\n                        d: paths[0]\n                    }, duration, complete);\n                    this.top.animate({\n                        d: paths[1]\n                    }, duration, complete);\n                    this.side.animate({\n                        d: paths[2]\n                    }, duration, complete);\n                    this.attr({\n                        zIndex: -paths[3] // #4774\n                    });\n                } else if (args.opacity) {\n                    this.front.animate(args, duration, complete);\n                    this.top.animate(args, duration, complete);\n                    this.side.animate(args, duration, complete);\n                } else {\n                    SVGElement.prototype.animate.call(this, args, duration, complete);\n                }\n                return this;\n            };\n\n            // destroy all children\n            result.destroy = function() {\n                this.front.destroy();\n                this.top.destroy();\n                this.side.destroy();\n\n                return destroy.call(this);\n            };\n\n            // Apply the Z index to the cuboid group\n            result.attr({\n                zIndex: -paths[3]\n            });\n\n            return result;\n        };\n\n        /**\n         *\tGenerates a cuboid\n         */\n        H.SVGRenderer.prototype.cuboidPath = function(shapeArgs) {\n            var x = shapeArgs.x,\n                y = shapeArgs.y,\n                z = shapeArgs.z,\n                h = shapeArgs.height,\n                w = shapeArgs.width,\n                d = shapeArgs.depth,\n                chart = charts[this.chartIndex],\n                front,\n                back,\n                top,\n                bottom,\n                left,\n                right,\n                shape,\n                path1,\n                path2,\n                path3,\n                isFront,\n                isTop,\n                isRight,\n                options3d = chart.options.chart.options3d,\n                alpha = options3d.alpha,\n                // Priority for x axis is the biggest, \n                // because of x direction has biggest influence on zIndex\n                incrementX = 10000,\n                // y axis has the smallest priority in case of our charts \n                // (needs to be set because of stacking)\n                incrementY = 10,\n                incrementZ = 100,\n                zIndex = 0;\n\n            // The 8 corners of the cube\n            var pArr = [{\n                x: x,\n                y: y,\n                z: z\n            }, {\n                x: x + w,\n                y: y,\n                z: z\n            }, {\n                x: x + w,\n                y: y + h,\n                z: z\n            }, {\n                x: x,\n                y: y + h,\n                z: z\n            }, {\n                x: x,\n                y: y + h,\n                z: z + d\n            }, {\n                x: x + w,\n                y: y + h,\n                z: z + d\n            }, {\n                x: x + w,\n                y: y,\n                z: z + d\n            }, {\n                x: x,\n                y: y,\n                z: z + d\n            }];\n\n            // apply perspective\n            pArr = perspective(pArr, chart, shapeArgs.insidePlotArea);\n\n            // helper method to decide which side is visible\n            function mapPath(i) {\n                return pArr[i];\n            }\n\n            /*\n             * First value - path with specific side\n             * Second  value - added information about side for later calculations. \n             * Possible second values are 0 for path1, 1 for path2 and -1 for no path choosed.\n             */\n            var pickShape = function(path1, path2) {\n                var ret = [\n                    [], -1\n                ];\n                path1 = map(path1, mapPath);\n                path2 = map(path2, mapPath);\n                if (H.shapeArea(path1) < 0) {\n                    ret = [path1, 0];\n                } else if (H.shapeArea(path2) < 0) {\n                    ret = [path2, 1];\n                }\n                return ret;\n            };\n\n            // front or back\n            front = [3, 2, 1, 0];\n            back = [7, 6, 5, 4];\n            shape = pickShape(front, back);\n            path1 = shape[0];\n            isFront = shape[1];\n\n\n            // top or bottom\n            top = [1, 6, 7, 0];\n            bottom = [4, 5, 2, 3];\n            shape = pickShape(top, bottom);\n            path2 = shape[0];\n            isTop = shape[1];\n\n            // side\n            right = [1, 2, 5, 6];\n            left = [0, 7, 4, 3];\n            shape = pickShape(right, left);\n            path3 = shape[0];\n            isRight = shape[1];\n\n            /*\n             * New block used for calculating zIndex. It is basing on X, Y and Z position of specific columns.\n             * All zIndexes (for X, Y and Z values) are added to the final zIndex, where every value has different priority.\n             * The biggest priority is in X and Z directions, the lowest index is for stacked columns (Y direction and the same X and Z positions).\n             * Big differents between priorities is made because we need to ensure that even for big changes in Y and Z parameters\n             * all columns will be drawn correctly.\n             */\n\n            if (isRight === 1) {\n                zIndex += incrementX * (1000 - x);\n            } else if (!isRight) {\n                zIndex += incrementX * x;\n            }\n\n            zIndex += incrementY * (!isTop ||\n                (alpha >= 0 && alpha <= 180 || alpha < 360 && alpha > 357.5) ? // Numbers checked empirically\n                chart.plotHeight - y : 10 + y\n            );\n\n            if (isFront === 1) {\n                zIndex += incrementZ * (z);\n            } else if (!isFront) {\n                zIndex += incrementZ * (1000 - z);\n            }\n\n            zIndex = -Math.round(zIndex);\n\n            return [\n                this.toLinePath(path1, true),\n                this.toLinePath(path2, true),\n                this.toLinePath(path3, true),\n                zIndex\n            ]; // #4774\n        };\n\n        ////// SECTORS //////\n        H.SVGRenderer.prototype.arc3d = function(attribs) {\n\n            var wrapper = this.g(),\n                renderer = wrapper.renderer,\n                customAttribs = ['x', 'y', 'r', 'innerR', 'start', 'end'];\n\n            /**\n             * Get custom attributes. Don't mutate the original object and return an object with only custom attr.\n             */\n            function suckOutCustom(params) {\n                var hasCA = false,\n                    ca = {};\n\n                params = merge(params); // Don't mutate the original object\n\n                for (var key in params) {\n                    if (inArray(key, customAttribs) !== -1) {\n                        ca[key] = params[key];\n                        delete params[key];\n                        hasCA = true;\n                    }\n                }\n                return hasCA ? ca : false;\n            }\n\n            attribs = merge(attribs);\n\n            attribs.alpha *= deg2rad;\n            attribs.beta *= deg2rad;\n\n            // Create the different sub sections of the shape\n            wrapper.top = renderer.path();\n            wrapper.side1 = renderer.path();\n            wrapper.side2 = renderer.path();\n            wrapper.inn = renderer.path();\n            wrapper.out = renderer.path();\n\n            /**\n             * Add all faces\n             */\n            wrapper.onAdd = function() {\n                var parent = wrapper.parentGroup,\n                    className = wrapper.attr('class');\n                wrapper.top.add(wrapper);\n\n                // These faces are added outside the wrapper group because the z index\n                // relates to neighbour elements as well\n                each(['out', 'inn', 'side1', 'side2'], function(face) {\n                    wrapper[face]\n                        .addClass(className + ' highcharts-3d-side')\n                        .add(parent);\n                });\n            };\n\n            /**\n             * Compute the transformed paths and set them to the composite shapes\n             */\n            wrapper.setPaths = function(attribs) {\n\n                var paths = wrapper.renderer.arc3dPath(attribs),\n                    zIndex = paths.zTop * 100;\n\n                wrapper.attribs = attribs;\n\n                wrapper.top.attr({\n                    d: paths.top,\n                    zIndex: paths.zTop\n                });\n                wrapper.inn.attr({\n                    d: paths.inn,\n                    zIndex: paths.zInn\n                });\n                wrapper.out.attr({\n                    d: paths.out,\n                    zIndex: paths.zOut\n                });\n                wrapper.side1.attr({\n                    d: paths.side1,\n                    zIndex: paths.zSide1\n                });\n                wrapper.side2.attr({\n                    d: paths.side2,\n                    zIndex: paths.zSide2\n                });\n\n\n                // show all children\n                wrapper.zIndex = zIndex;\n                wrapper.attr({\n                    zIndex: zIndex\n                });\n\n                // Set the radial gradient center the first time\n                if (attribs.center) {\n                    wrapper.top.setRadialReference(attribs.center);\n                    delete attribs.center;\n                }\n            };\n            wrapper.setPaths(attribs);\n\n            // Apply the fill to the top and a darker shade to the sides\n            wrapper.fillSetter = function(value) {\n                var darker = color(value).brighten(-0.1).get();\n\n                this.fill = value;\n\n                this.side1.attr({\n                    fill: darker\n                });\n                this.side2.attr({\n                    fill: darker\n                });\n                this.inn.attr({\n                    fill: darker\n                });\n                this.out.attr({\n                    fill: darker\n                });\n                this.top.attr({\n                    fill: value\n                });\n                return this;\n            };\n\n            // Apply the same value to all. These properties cascade down to the children\n            // when set to the composite arc3d.\n            each(['opacity', 'translateX', 'translateY', 'visibility'], function(setter) {\n                wrapper[setter + 'Setter'] = function(value, key) {\n                    wrapper[key] = value;\n                    each(['out', 'inn', 'side1', 'side2', 'top'], function(el) {\n                        wrapper[el].attr(key, value);\n                    });\n                };\n            });\n\n            /**\n             * Override attr to remove shape attributes and use those to set child paths\n             */\n            wrap(wrapper, 'attr', function(proceed, params) {\n                var ca;\n                if (typeof params === 'object') {\n                    ca = suckOutCustom(params);\n                    if (ca) {\n                        extend(wrapper.attribs, ca);\n                        wrapper.setPaths(wrapper.attribs);\n                    }\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            /**\n             * Override the animate function by sucking out custom parameters related to the shapes directly,\n             * and update the shapes from the animation step.\n             */\n            wrap(wrapper, 'animate', function(proceed, params, animation, complete) {\n                var ca,\n                    from = this.attribs,\n                    to,\n                    anim;\n\n                // Attribute-line properties connected to 3D. These shouldn't have been in the \n                // attribs collection in the first place.\n                delete params.center;\n                delete params.z;\n                delete params.depth;\n                delete params.alpha;\n                delete params.beta;\n\n                anim = animObject(pick(animation, this.renderer.globalAnimation));\n\n                if (anim.duration) {\n                    ca = suckOutCustom(params);\n                    params.dummy = 1; // Params need to have a property in order for the step to run (#5765)\n\n                    if (ca) {\n                        to = ca;\n                        anim.step = function(a, fx) {\n                            function interpolate(key) {\n                                return from[key] + (pick(to[key], from[key]) - from[key]) * fx.pos;\n                            }\n\n                            if (fx.prop === 'dummy') {\n                                fx.elem.setPaths(merge(from, {\n                                    x: interpolate('x'),\n                                    y: interpolate('y'),\n                                    r: interpolate('r'),\n                                    innerR: interpolate('innerR'),\n                                    start: interpolate('start'),\n                                    end: interpolate('end')\n                                }));\n                            }\n                        };\n                    }\n                    animation = anim; // Only when duration (#5572)\n                }\n                return proceed.call(this, params, animation, complete);\n            });\n\n            // destroy all children\n            wrapper.destroy = function() {\n                this.top.destroy();\n                this.out.destroy();\n                this.inn.destroy();\n                this.side1.destroy();\n                this.side2.destroy();\n\n                SVGElement.prototype.destroy.call(this);\n            };\n            // hide all children\n            wrapper.hide = function() {\n                this.top.hide();\n                this.out.hide();\n                this.inn.hide();\n                this.side1.hide();\n                this.side2.hide();\n            };\n            wrapper.show = function() {\n                this.top.show();\n                this.out.show();\n                this.inn.show();\n                this.side1.show();\n                this.side2.show();\n            };\n            return wrapper;\n        };\n\n        /**\n         * Generate the paths required to draw a 3D arc\n         */\n        SVGRenderer.prototype.arc3dPath = function(shapeArgs) {\n            var cx = shapeArgs.x, // x coordinate of the center\n                cy = shapeArgs.y, // y coordinate of the center\n                start = shapeArgs.start, // start angle\n                end = shapeArgs.end - 0.00001, // end angle\n                r = shapeArgs.r, // radius\n                ir = shapeArgs.innerR, // inner radius\n                d = shapeArgs.depth, // depth\n                alpha = shapeArgs.alpha, // alpha rotation of the chart\n                beta = shapeArgs.beta; // beta rotation of the chart\n\n            // Derived Variables\n            var cs = Math.cos(start), // cosinus of the start angle\n                ss = Math.sin(start), // sinus of the start angle\n                ce = Math.cos(end), // cosinus of the end angle\n                se = Math.sin(end), // sinus of the end angle\n                rx = r * Math.cos(beta), // x-radius \n                ry = r * Math.cos(alpha), // y-radius\n                irx = ir * Math.cos(beta), // x-radius (inner)\n                iry = ir * Math.cos(alpha), // y-radius (inner)\n                dx = d * Math.sin(beta), // distance between top and bottom in x\n                dy = d * Math.sin(alpha); // distance between top and bottom in y\n\n            // TOP\n            var top = ['M', cx + (rx * cs), cy + (ry * ss)];\n            top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0));\n            top = top.concat([\n                'L', cx + (irx * ce), cy + (iry * se)\n            ]);\n            top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0));\n            top = top.concat(['Z']);\n            // OUTSIDE\n            var b = (beta > 0 ? Math.PI / 2 : 0),\n                a = (alpha > 0 ? 0 : Math.PI / 2);\n\n            var start2 = start > -b ? start : (end > -b ? -b : start),\n                end2 = end < PI - a ? end : (start < PI - a ? PI - a : end),\n                midEnd = 2 * PI - a;\n\n            // When slice goes over bottom middle, need to add both, left and right outer side.\n            // Additionally, when we cross right hand edge, create sharp edge. Outer shape/wall:\n            //\n            //            -------\n            //          /    ^    \\\n            //    4)   /   /   \\   \\  1)\n            //        /   /     \\   \\\n            //       /   /       \\   \\\n            // (c)=> ====         ==== <=(d) \n            //       \\   \\       /   /\n            //        \\   \\<=(a)/   /\n            //         \\   \\   /   / <=(b)\n            //    3)    \\    v    /  2)\n            //            -------\n            //\n            // (a) - inner side\n            // (b) - outer side\n            // (c) - left edge (sharp)\n            // (d) - right edge (sharp)\n            // 1..n - rendering order for startAngle = 0, when set to e.g 90, order changes clockwise (1->2, 2->3, n->1) and counterclockwise for negative startAngle\n\n            var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))];\n            out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0));\n\n            if (end > midEnd && start < midEnd) { // When shape is wide, it can cross both, (c) and (d) edges, when using startAngle\n                // Go to outer side\n                out = out.concat([\n                    'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy\n                ]);\n                // Curve to the right edge of the slice (d)\n                out = out.concat(curveTo(cx, cy, rx, ry, end2, midEnd, dx, dy));\n                // Go to the inner side\n                out = out.concat([\n                    'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd))\n                ]);\n                // Curve to the true end of the slice\n                out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end, 0, 0));\n                // Go to the outer side\n                out = out.concat([\n                    'L', cx + (rx * cos(end)) + dx, cy + (ry * sin(end)) + dy\n                ]);\n                // Go back to middle (d)\n                out = out.concat(curveTo(cx, cy, rx, ry, end, midEnd, dx, dy));\n                out = out.concat([\n                    'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd))\n                ]);\n                // Go back to the left edge\n                out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end2, 0, 0));\n            } else if (end > PI - a && start < PI - a) { // But shape can cross also only (c) edge:\n                // Go to outer side\n                out = out.concat([\n                    'L', cx + (rx * Math.cos(end2)) + dx, cy + (ry * Math.sin(end2)) + dy\n                ]);\n                // Curve to the true end of the slice\n                out = out.concat(curveTo(cx, cy, rx, ry, end2, end, dx, dy));\n                // Go to the inner side\n                out = out.concat([\n                    'L', cx + (rx * Math.cos(end)), cy + (ry * Math.sin(end))\n                ]);\n                // Go back to the artifical end2\n                out = out.concat(curveTo(cx, cy, rx, ry, end, end2, 0, 0));\n            }\n\n            out = out.concat([\n                'L', cx + (rx * Math.cos(end2)) + dx, cy + (ry * Math.sin(end2)) + dy\n            ]);\n            out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy));\n            out = out.concat(['Z']);\n\n            // INSIDE\n            var inn = ['M', cx + (irx * cs), cy + (iry * ss)];\n            inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0));\n            inn = inn.concat([\n                'L', cx + (irx * Math.cos(end)) + dx, cy + (iry * Math.sin(end)) + dy\n            ]);\n            inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy));\n            inn = inn.concat(['Z']);\n\n            // SIDES\n            var side1 = [\n                'M', cx + (rx * cs), cy + (ry * ss),\n                'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy,\n                'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy,\n                'L', cx + (irx * cs), cy + (iry * ss),\n                'Z'\n            ];\n            var side2 = [\n                'M', cx + (rx * ce), cy + (ry * se),\n                'L', cx + (rx * ce) + dx, cy + (ry * se) + dy,\n                'L', cx + (irx * ce) + dx, cy + (iry * se) + dy,\n                'L', cx + (irx * ce), cy + (iry * se),\n                'Z'\n            ];\n\n            // correction for changed position of vanishing point caused by alpha and beta rotations\n            var angleCorr = Math.atan2(dy, -dx),\n                angleEnd = Math.abs(end + angleCorr),\n                angleStart = Math.abs(start + angleCorr),\n                angleMid = Math.abs((start + end) / 2 + angleCorr);\n\n            // set to 0-PI range\n            function toZeroPIRange(angle) {\n                angle = angle % (2 * Math.PI);\n                if (angle > Math.PI) {\n                    angle = 2 * Math.PI - angle;\n                }\n                return angle;\n            }\n            angleEnd = toZeroPIRange(angleEnd);\n            angleStart = toZeroPIRange(angleStart);\n            angleMid = toZeroPIRange(angleMid);\n\n            // *1e5 is to compensate pInt in zIndexSetter\n            var incPrecision = 1e5,\n                a1 = angleMid * incPrecision,\n                a2 = angleStart * incPrecision,\n                a3 = angleEnd * incPrecision;\n\n            return {\n                top: top,\n                zTop: Math.PI * incPrecision + 1, // max angle is PI, so this is allways higher\n                out: out,\n                zOut: Math.max(a1, a2, a3),\n                inn: inn,\n                zInn: Math.max(a1, a2, a3),\n                side1: side1,\n                zSide1: a3 * 0.99, // to keep below zOut and zInn in case of same values\n                side2: side2,\n                zSide2: a2 * 0.99\n            };\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            merge = H.merge,\n            perspective = H.perspective,\n            pick = H.pick,\n            wrap = H.wrap;\n\n        /*** \n        \tEXTENSION FOR 3D CHARTS\n        ***/\n        // Shorthand to check the is3d flag\n        Chart.prototype.is3d = function() {\n            return this.options.chart.options3d && this.options.chart.options3d.enabled; // #4280\n        };\n\n        Chart.prototype.propsRequireDirtyBox.push('chart.options3d');\n        Chart.prototype.propsRequireUpdateSeries.push('chart.options3d');\n\n        /**\n         * Calculate scale of the 3D view. That is required to\n         * fit chart's 3D projection into the actual plotting area. Reported as #4933.\n         * @notice This function should ideally take the plot values instead of a chart object, \n         *         but since the chart object is needed for perspective it is not practical. \n         *         Possible to make both getScale and perspective more logical and also immutable.\n         * @param  {Object} chart Chart object\n         * @param  {Number} chart.plotLeft\n         * @param  {Number} chart.plotWidth\n         * @param  {Number} chart.plotTop\n         * @param  {Number} chart.plotHeight\n         * @param  {Number} depth The depth of the chart\n         * @return {Number} The scale to fit the 3D chart into the plotting area.\n         */\n        function getScale(chart, depth) {\n            var plotLeft = chart.plotLeft,\n                plotRight = chart.plotWidth + plotLeft,\n                plotTop = chart.plotTop,\n                plotBottom = chart.plotHeight + plotTop,\n                originX = plotLeft + chart.plotWidth / 2,\n                originY = plotTop + chart.plotHeight / 2,\n                bbox3d = {\n                    minX: Number.MAX_VALUE,\n                    maxX: -Number.MAX_VALUE,\n                    minY: Number.MAX_VALUE,\n                    maxY: -Number.MAX_VALUE\n                },\n                corners,\n                scale = 1;\n\n            // Top left corners:\n            corners = [{\n                x: plotLeft,\n                y: plotTop,\n                z: 0\n            }, {\n                x: plotLeft,\n                y: plotTop,\n                z: depth\n            }];\n\n            // Top right corners:\n            each([0, 1], function(i) {\n                corners.push({\n                    x: plotRight,\n                    y: corners[i].y,\n                    z: corners[i].z\n                });\n            });\n\n            // All bottom corners:\n            each([0, 1, 2, 3], function(i) {\n                corners.push({\n                    x: corners[i].x,\n                    y: plotBottom,\n                    z: corners[i].z\n                });\n            });\n\n            // Calculate 3D corners:\n            corners = perspective(corners, chart, false);\n\n            // Get bounding box of 3D element:\n            each(corners, function(corner) {\n                bbox3d.minX = Math.min(bbox3d.minX, corner.x);\n                bbox3d.maxX = Math.max(bbox3d.maxX, corner.x);\n                bbox3d.minY = Math.min(bbox3d.minY, corner.y);\n                bbox3d.maxY = Math.max(bbox3d.maxY, corner.y);\n            });\n\n            // Left edge:\n            if (plotLeft > bbox3d.minX) {\n                scale = Math.min(scale, 1 - Math.abs((plotLeft + originX) / (bbox3d.minX + originX)) % 1);\n            }\n\n            // Right edge:\n            if (plotRight < bbox3d.maxX) {\n                scale = Math.min(scale, (plotRight - originX) / (bbox3d.maxX - originX));\n            }\n\n            // Top edge:\n            if (plotTop > bbox3d.minY) {\n                if (bbox3d.minY < 0) {\n                    scale = Math.min(scale, (plotTop + originY) / (-bbox3d.minY + plotTop + originY));\n                } else {\n                    scale = Math.min(scale, 1 - (plotTop + originY) / (bbox3d.minY + originY) % 1);\n                }\n            }\n\n            // Bottom edge:\n            if (plotBottom < bbox3d.maxY) {\n                scale = Math.min(scale, Math.abs((plotBottom - originY) / (bbox3d.maxY - originY)));\n            }\n\n            return scale;\n        }\n\n\n\n        H.wrap(H.Chart.prototype, 'isInsidePlot', function(proceed) {\n            return this.is3d() || proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        var defaultOptions = H.getOptions();\n        merge(true, defaultOptions, {\n            chart: {\n                options3d: {\n                    enabled: false,\n                    alpha: 0,\n                    beta: 0,\n                    depth: 100,\n                    fitToPlot: true,\n                    viewDistance: 25,\n                    axisLabelPosition: 'default',\n                    frame: {\n                        visible: 'default',\n                        size: 1,\n                        bottom: {},\n                        top: {},\n                        left: {},\n                        right: {},\n                        back: {},\n                        front: {}\n                    }\n                }\n            }\n        });\n\n\n\n        wrap(Chart.prototype, 'setClassName', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.is3d()) {\n                this.container.className += ' highcharts-3d-chart';\n            }\n        });\n\n        H.wrap(H.Chart.prototype, 'setChartSize', function(proceed) {\n            var chart = this,\n                options3d = chart.options.chart.options3d;\n\n            proceed.apply(chart, [].slice.call(arguments, 1));\n\n            if (chart.is3d()) {\n                var inverted = chart.inverted,\n                    clipBox = chart.clipBox,\n                    margin = chart.margin,\n                    x = inverted ? 'y' : 'x',\n                    y = inverted ? 'x' : 'y',\n                    w = inverted ? 'height' : 'width',\n                    h = inverted ? 'width' : 'height';\n\n                clipBox[x] = -(margin[3] || 0);\n                clipBox[y] = -(margin[0] || 0);\n                clipBox[w] = chart.chartWidth + (margin[3] || 0) + (margin[1] || 0);\n                clipBox[h] = chart.chartHeight + (margin[0] || 0) + (margin[2] || 0);\n\n                // Set scale, used later in perspective method():\n                chart.scale3d = 1; // @notice getScale uses perspective, so scale3d has to be reset.\n                if (options3d.fitToPlot === true) {\n                    chart.scale3d = getScale(chart, options3d.depth);\n                }\n            }\n        });\n\n        wrap(Chart.prototype, 'redraw', function(proceed) {\n            if (this.is3d()) {\n                // Set to force a redraw of all elements\n                this.isDirtyBox = true;\n                this.frame3d = this.get3dFrame();\n            }\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        wrap(Chart.prototype, 'render', function(proceed) {\n            if (this.is3d()) {\n                this.frame3d = this.get3dFrame();\n            }\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        // Draw the series in the reverse order (#3803, #3917)\n        wrap(Chart.prototype, 'renderSeries', function(proceed) {\n            var series,\n                i = this.series.length;\n\n            if (this.is3d()) {\n                while (i--) {\n                    series = this.series[i];\n                    series.translate();\n                    series.render();\n                }\n            } else {\n                proceed.call(this);\n            }\n        });\n\n        wrap(Chart.prototype, 'drawChartBox', function(proceed) {\n            if (this.is3d()) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    options3d = this.options.chart.options3d,\n                    frame = chart.get3dFrame(),\n                    xm = this.plotLeft,\n                    xp = this.plotLeft + this.plotWidth,\n                    ym = this.plotTop,\n                    yp = this.plotTop + this.plotHeight,\n                    zm = 0,\n                    zp = options3d.depth,\n                    xmm = xm - (frame.left.visible ? frame.left.size : 0),\n                    xpp = xp + (frame.right.visible ? frame.right.size : 0),\n                    ymm = ym - (frame.top.visible ? frame.top.size : 0),\n                    ypp = yp + (frame.bottom.visible ? frame.bottom.size : 0),\n                    zmm = zm - (frame.front.visible ? frame.front.size : 0),\n                    zpp = zp + (frame.back.visible ? frame.back.size : 0),\n                    verb = chart.hasRendered ? 'animate' : 'attr';\n\n                this.frame3d = frame;\n\n                if (!this.frameShapes) {\n                    this.frameShapes = {\n                        bottom: renderer.polyhedron().add(),\n                        top: renderer.polyhedron().add(),\n                        left: renderer.polyhedron().add(),\n                        right: renderer.polyhedron().add(),\n                        back: renderer.polyhedron().add(),\n                        front: renderer.polyhedron().add()\n                    };\n                }\n\n                this.frameShapes.bottom[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-bottom',\n                    zIndex: frame.bottom.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.bottom.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }],\n                            enabled: frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.bottom.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.bottom.visible\n                        },\n                        { //left\n                            fill: H.color(frame.bottom.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.bottom.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.bottom.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.bottom.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.bottom.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.bottom.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.bottom.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.bottom.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.top[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-top',\n                    zIndex: frame.top.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.top.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }],\n                            enabled: frame.top.visible\n                        },\n                        { //top\n                            fill: H.color(frame.top.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.top.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.top.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.top.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.top.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.top.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.top.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.top.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.top.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.left[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-left',\n                    zIndex: frame.left.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.left.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }],\n                            enabled: frame.left.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.left.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }],\n                            enabled: frame.left.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.left.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }],\n                            enabled: frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.left.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.left.visible\n                        },\n                        { //front\n                            fill: H.color(frame.left.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.left.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.left.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.left.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.right[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-right',\n                    zIndex: frame.right.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.right.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }],\n                            enabled: frame.right.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.right.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }],\n                            enabled: frame.right.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.right.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.right.visible\n                        },\n                        { //right\n                            fill: H.color(frame.right.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }],\n                            enabled: frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.right.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.right.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.right.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.right.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.back[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-back',\n                    zIndex: frame.back.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.back.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.back.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.back.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.back.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.back.color).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible\n                        },\n                        { //back\n                            fill: H.color(frame.back.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }],\n                            enabled: frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.front[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-front',\n                    zIndex: frame.front.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.front.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.front.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.front.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.front.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.front.color).get(),\n                            vertexes: [{\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.front.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }],\n                            enabled: frame.front.visible\n                        }\n                    ]\n                });\n            }\n\n            return proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        Chart.prototype.retrieveStacks = function(stacking) {\n            var series = this.series,\n                stacks = {},\n                stackNumber,\n                i = 1;\n\n            each(this.series, function(s) {\n                stackNumber = pick(s.options.stack, (stacking ? 0 : series.length - 1 - s.index)); // #3841, #4532\n                if (!stacks[stackNumber]) {\n                    stacks[stackNumber] = {\n                        series: [s],\n                        position: i\n                    };\n                    i++;\n                } else {\n                    stacks[stackNumber].series.push(s);\n                }\n            });\n\n            stacks.totalStacks = i + 1;\n            return stacks;\n        };\n\n        Chart.prototype.get3dFrame = function() {\n            var chart = this,\n                options3d = chart.options.chart.options3d,\n                frameOptions = options3d.frame,\n                xm = chart.plotLeft,\n                xp = chart.plotLeft + chart.plotWidth,\n                ym = chart.plotTop,\n                yp = chart.plotTop + chart.plotHeight,\n                zm = 0,\n                zp = options3d.depth,\n                bottomOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zm\n                }], chart),\n                topOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: ym,\n                    z: zp\n                }], chart),\n                leftOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xm,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zm\n                }], chart),\n                rightOrientation = H.shapeArea3d([{\n                    x: xp,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zp\n                }], chart),\n                frontOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xm,\n                    y: ym,\n                    z: zm\n                }], chart),\n                backOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zp\n                }], chart),\n                defaultShowBottom = false,\n                defaultShowTop = false,\n                defaultShowLeft = false,\n                defaultShowRight = false,\n                defaultShowFront = false,\n                defaultShowBack = true;\n\n            // The 'default' criteria to visible faces of the frame is looking up every\n            // axis to decide whenever the left/right//top/bottom sides of the frame\n            // will be shown\n            each([].concat(chart.xAxis, chart.yAxis, chart.zAxis), function(axis) {\n                if (axis) {\n                    if (axis.horiz) {\n                        if (axis.opposite) {\n                            defaultShowTop = true;\n                        } else {\n                            defaultShowBottom = true;\n                        }\n                    } else {\n                        if (axis.opposite) {\n                            defaultShowRight = true;\n                        } else {\n                            defaultShowLeft = true;\n                        }\n                    }\n                }\n            });\n\n            var getFaceOptions = function(sources, faceOrientation, defaultVisible) {\n                var faceAttrs = ['size', 'color', 'visible'];\n                var options = {};\n                for (var i = 0; i < faceAttrs.length; i++) {\n                    var attr = faceAttrs[i];\n                    for (var j = 0; j < sources.length; j++) {\n                        if (typeof sources[j] === 'object') {\n                            var val = sources[j][attr];\n                            if (val !== undefined && val !== null) {\n                                options[attr] = val;\n                                break;\n                            }\n                        }\n                    }\n                }\n                var isVisible = defaultVisible;\n                if (options.visible === true || options.visible === false) {\n                    isVisible = options.visible;\n                } else if (options.visible === 'auto') {\n                    isVisible = faceOrientation >= 0;\n                }\n\n                return {\n                    size: pick(options.size, 1),\n                    color: pick(options.color, 'none'),\n                    frontFacing: faceOrientation > 0,\n                    visible: isVisible\n                };\n            };\n\n            // docs @TODO: Add all frame options (left, right, top, bottom, front, back) to\n            // apioptions JSDoc once the new system is up.\n            var ret = {\n                // FIXME: Previously, left/right, top/bottom and front/back pairs shared\n                // size and color.\n                // For compatibility and consistency sake, when one face have\n                // size/color/visibility set, the opposite face will default to the same\n                // values. Also, left/right used to be called 'side', so that's also\n                // added as a fallback\n                bottom: getFaceOptions(\n                    [frameOptions.bottom, frameOptions.top, frameOptions],\n                    bottomOrientation,\n                    defaultShowBottom\n                ),\n                top: getFaceOptions(\n                    [frameOptions.top, frameOptions.bottom, frameOptions],\n                    topOrientation,\n                    defaultShowTop\n                ),\n                left: getFaceOptions(\n                    [\n                        frameOptions.left,\n                        frameOptions.right,\n                        frameOptions.side,\n                        frameOptions\n                    ],\n                    leftOrientation,\n                    defaultShowLeft\n                ),\n                right: getFaceOptions(\n                    [\n                        frameOptions.right,\n                        frameOptions.left,\n                        frameOptions.side,\n                        frameOptions\n                    ],\n                    rightOrientation,\n                    defaultShowRight\n                ),\n                back: getFaceOptions(\n                    [frameOptions.back, frameOptions.front, frameOptions],\n                    backOrientation,\n                    defaultShowBack\n                ),\n                front: getFaceOptions(\n                    [frameOptions.front, frameOptions.back, frameOptions],\n                    frontOrientation,\n                    defaultShowFront\n                )\n            };\n\n\n            // Decide the bast place to put axis title/labels based on the visible faces.\n            // Ideally, The labels can only be on the edge between a visible face and an invisble one.\n            // Also, the Y label should be one the left-most edge (right-most if opposite),\n            if (options3d.axisLabelPosition === 'auto') {\n                var isValidEdge = function(face1, face2) {\n                    return (face1.visible !== face2.visible) ||\n                        (face1.visible && face2.visible && (face1.frontFacing !== face2.frontFacing));\n                };\n\n                var yEdges = [];\n                if (isValidEdge(ret.left, ret.front)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xm,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.left, ret.back)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xm,\n                        z: zp\n                    });\n                }\n                if (isValidEdge(ret.right, ret.front)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xp,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.right, ret.back)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xp,\n                        z: zp\n                    });\n                }\n\n                var xBottomEdges = [];\n                if (isValidEdge(ret.bottom, ret.front)) {\n                    xBottomEdges.push({\n                        x: (xm + xp) / 2,\n                        y: yp,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.bottom, ret.back)) {\n                    xBottomEdges.push({\n                        x: (xm + xp) / 2,\n                        y: yp,\n                        z: zp\n                    });\n                }\n\n                var xTopEdges = [];\n                if (isValidEdge(ret.top, ret.front)) {\n                    xTopEdges.push({\n                        x: (xm + xp) / 2,\n                        y: ym,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.top, ret.back)) {\n                    xTopEdges.push({\n                        x: (xm + xp) / 2,\n                        y: ym,\n                        z: zp\n                    });\n                }\n\n                var zBottomEdges = [];\n                if (isValidEdge(ret.bottom, ret.left)) {\n                    zBottomEdges.push({\n                        z: (zm + zp) / 2,\n                        y: yp,\n                        x: xm\n                    });\n                }\n                if (isValidEdge(ret.bottom, ret.right)) {\n                    zBottomEdges.push({\n                        z: (zm + zp) / 2,\n                        y: yp,\n                        x: xp\n                    });\n                }\n\n                var zTopEdges = [];\n                if (isValidEdge(ret.top, ret.left)) {\n                    zTopEdges.push({\n                        z: (zm + zp) / 2,\n                        y: ym,\n                        x: xm\n                    });\n                }\n                if (isValidEdge(ret.top, ret.right)) {\n                    zTopEdges.push({\n                        z: (zm + zp) / 2,\n                        y: ym,\n                        x: xp\n                    });\n                }\n\n                var pickEdge = function(edges, axis, mult) {\n                    if (edges.length === 0) {\n                        return null;\n                    } else if (edges.length === 1) {\n                        return edges[0];\n                    }\n                    var best = 0,\n                        projections = perspective(edges, chart, false);\n                    for (var i = 1; i < projections.length; i++) {\n                        if (mult * projections[i][axis] > mult * projections[best][axis]) {\n                            best = i;\n                        } else if ((mult * projections[i][axis] === mult * projections[best][axis]) && (projections[i].z < projections[best].z)) {\n                            best = i;\n                        }\n                    }\n                    return edges[best];\n                };\n                ret.axes = {\n                    y: {\n                        'left': pickEdge(yEdges, 'x', -1),\n                        'right': pickEdge(yEdges, 'x', +1)\n                    },\n                    x: {\n                        'top': pickEdge(xTopEdges, 'y', -1),\n                        'bottom': pickEdge(xBottomEdges, 'y', +1)\n                    },\n                    z: {\n                        'top': pickEdge(zTopEdges, 'y', -1),\n                        'bottom': pickEdge(zBottomEdges, 'y', +1)\n                    }\n                };\n            } else {\n                ret.axes = {\n                    y: {\n                        'left': {\n                            x: xm,\n                            z: zm\n                        },\n                        'right': {\n                            x: xp,\n                            z: zm\n                        }\n                    },\n                    x: {\n                        'top': {\n                            y: ym,\n                            z: zm\n                        },\n                        'bottom': {\n                            y: yp,\n                            z: zm\n                        }\n                    },\n                    z: {\n                        'top': {\n                            x: defaultShowLeft ? xp : xm,\n                            y: ym\n                        },\n                        'bottom': {\n                            x: defaultShowLeft ? xp : xm,\n                            y: yp\n                        }\n                    }\n                };\n            }\n\n            return ret;\n        };\n\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var ZAxis,\n\n            Axis = H.Axis,\n            Chart = H.Chart,\n            each = H.each,\n            extend = H.extend,\n            merge = H.merge,\n            perspective = H.perspective,\n            pick = H.pick,\n            splat = H.splat,\n            Tick = H.Tick,\n            wrap = H.wrap;\n        /***\n        \tEXTENSION TO THE AXIS\n        ***/\n        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {\n            var options;\n            proceed.call(this, userOptions);\n            if (this.chart.is3d() && this.coll !== 'colorAxis') {\n                options = this.options;\n                options.tickWidth = pick(options.tickWidth, 0);\n                options.gridLineWidth = pick(options.gridLineWidth, 1);\n            }\n        });\n\n        wrap(Axis.prototype, 'getPlotLinePath', function(proceed) {\n            var path = proceed.apply(this, [].slice.call(arguments, 1));\n\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d() || this.coll === 'colorAxis') {\n                return path;\n            }\n\n            if (path === null) {\n                return path;\n            }\n\n            var chart = this.chart,\n                options3d = chart.options.chart.options3d,\n                d = this.isZAxis ? chart.plotWidth : options3d.depth,\n                frame = chart.frame3d;\n\n            var pArr = [\n                this.swapZ({\n                    x: path[1],\n                    y: path[2],\n                    z: 0\n                }),\n                this.swapZ({\n                    x: path[1],\n                    y: path[2],\n                    z: d\n                }),\n                this.swapZ({\n                    x: path[4],\n                    y: path[5],\n                    z: 0\n                }),\n                this.swapZ({\n                    x: path[4],\n                    y: path[5],\n                    z: d\n                })\n            ];\n\n            var pathSegments = [];\n            if (!this.horiz) { // Y-Axis\n                if (frame.front.visible) {\n                    pathSegments.push(pArr[0], pArr[2]);\n                }\n                if (frame.back.visible) {\n                    pathSegments.push(pArr[1], pArr[3]);\n                }\n                if (frame.left.visible) {\n                    pathSegments.push(pArr[0], pArr[1]);\n                }\n                if (frame.right.visible) {\n                    pathSegments.push(pArr[2], pArr[3]);\n                }\n            } else if (this.isZAxis) { // Z-Axis\n                if (frame.left.visible) {\n                    pathSegments.push(pArr[0], pArr[2]);\n                }\n                if (frame.right.visible) {\n                    pathSegments.push(pArr[1], pArr[3]);\n                }\n                if (frame.top.visible) {\n                    pathSegments.push(pArr[0], pArr[1]);\n                }\n                if (frame.bottom.visible) {\n                    pathSegments.push(pArr[2], pArr[3]);\n                }\n            } else { // X-Axis\n                if (frame.front.visible) {\n                    pathSegments.push(pArr[0], pArr[2]);\n                }\n                if (frame.back.visible) {\n                    pathSegments.push(pArr[1], pArr[3]);\n                }\n                if (frame.top.visible) {\n                    pathSegments.push(pArr[0], pArr[1]);\n                }\n                if (frame.bottom.visible) {\n                    pathSegments.push(pArr[2], pArr[3]);\n                }\n            }\n\n            pathSegments = perspective(pathSegments, this.chart, false);\n\n            return this.chart.renderer.toLineSegments(pathSegments);\n        });\n\n        // Do not draw axislines in 3D\n        wrap(Axis.prototype, 'getLinePath', function(proceed) {\n            return this.chart.is3d() ? [] : proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        wrap(Axis.prototype, 'getPlotBandPath', function(proceed) {\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d() || this.coll === 'colorAxis') {\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            }\n\n            var args = arguments,\n                from = args[1],\n                to = args[2],\n                path = [],\n                fromPath = this.getPlotLinePath(from),\n                toPath = this.getPlotLinePath(to);\n\n            if (fromPath && toPath) {\n                for (var i = 0; i < fromPath.length; i += 6) {\n                    path.push(\n                        'M', fromPath[i + 1], fromPath[i + 2],\n                        'L', fromPath[i + 4], fromPath[i + 5],\n                        'L', toPath[i + 4], toPath[i + 5],\n                        'L', toPath[i + 1], toPath[i + 2],\n                        'Z');\n                }\n            }\n\n            return path;\n        });\n\n\n        function fix3dPosition(axis, pos) {\n            if (axis.chart.is3d() && axis.coll !== 'colorAxis') {\n                var chart = axis.chart,\n                    frame = chart.frame3d,\n                    plotLeft = chart.plotLeft,\n                    plotRight = chart.plotWidth + plotLeft,\n                    plotTop = chart.plotTop,\n                    plotBottom = chart.plotHeight + plotTop,\n                    dx = 0,\n                    dy = 0;\n\n                pos = axis.swapZ({\n                    x: pos.x,\n                    y: pos.y,\n                    z: 0\n                });\n\n\n                if (axis.isZAxis) { // Z Axis\n                    if (axis.opposite) {\n                        if (frame.axes.z.top === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotTop;\n                        pos.x = frame.axes.z.top.x;\n                        pos.y = frame.axes.z.top.y;\n                    } else {\n                        if (frame.axes.z.bottom === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotBottom;\n                        pos.x = frame.axes.z.bottom.x;\n                        pos.y = frame.axes.z.bottom.y;\n                    }\n                } else if (axis.horiz) { // X Axis\n                    if (axis.opposite) {\n                        if (frame.axes.x.top === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotTop;\n                        pos.y = frame.axes.x.top.y;\n                        pos.z = frame.axes.x.top.z;\n                    } else {\n                        if (frame.axes.x.bottom === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotBottom;\n                        pos.y = frame.axes.x.bottom.y;\n                        pos.z = frame.axes.x.bottom.z;\n                    }\n                } else { //Y Axis\n                    if (axis.opposite) {\n                        if (frame.axes.y.right === null) {\n                            return {};\n                        }\n                        dx = pos.x - plotRight;\n                        pos.x = frame.axes.y.right.x;\n                        pos.z = frame.axes.y.right.z;\n                    } else {\n                        if (frame.axes.y.left === null) {\n                            return {};\n                        }\n                        dx = pos.x - plotLeft;\n                        pos.x = frame.axes.y.left.x;\n                        pos.z = frame.axes.y.left.z;\n                    }\n                }\n                pos = perspective([pos], axis.chart)[0];\n                pos.x += dx;\n                pos.y += dy;\n            }\n            return pos;\n        }\n\n        /***\n        \tEXTENSION TO THE TICKS\n        ***/\n\n        wrap(Tick.prototype, 'getMarkPath', function(proceed) {\n            var path = proceed.apply(this, [].slice.call(arguments, 1));\n\n            var pArr = [\n                fix3dPosition(this.axis, {\n                    x: path[1],\n                    y: path[2],\n                    z: 0\n                }),\n                fix3dPosition(this.axis, {\n                    x: path[4],\n                    y: path[5],\n                    z: 0\n                })\n            ];\n\n            return this.axis.chart.renderer.toLineSegments(pArr);\n        });\n\n        wrap(Tick.prototype, 'getLabelPosition', function(proceed) {\n            var pos = proceed.apply(this, [].slice.call(arguments, 1));\n            return fix3dPosition(this.axis, pos);\n        });\n\n        H.wrap(Axis.prototype, 'getTitlePosition', function(proceed) {\n            var pos = proceed.apply(this, [].slice.call(arguments, 1));\n            return fix3dPosition(this, pos);\n        });\n\n        wrap(Axis.prototype, 'drawCrosshair', function(proceed) {\n            var args = arguments;\n            if (this.chart.is3d()) {\n                if (args[2]) {\n                    args[2] = {\n                        plotX: args[2].plotXold || args[2].plotX,\n                        plotY: args[2].plotYold || args[2].plotY\n                    };\n                }\n            }\n            proceed.apply(this, [].slice.call(args, 1));\n        });\n\n        wrap(Axis.prototype, 'destroy', function(proceed) {\n            each(['backFrame', 'bottomFrame', 'sideFrame'], function(prop) {\n                if (this[prop]) {\n                    this[prop] = this[prop].destroy();\n                }\n            }, this);\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        /***\n            Z-AXIS\n        ***/\n\n        Axis.prototype.swapZ = function(p, insidePlotArea) {\n            if (this.isZAxis) {\n                var plotLeft = insidePlotArea ? 0 : this.chart.plotLeft;\n                return {\n                    x: plotLeft + p.z,\n                    y: p.y,\n                    z: p.x - plotLeft\n                };\n            }\n            return p;\n        };\n\n        ZAxis = H.ZAxis = function() {\n            this.init.apply(this, arguments);\n        };\n        extend(ZAxis.prototype, Axis.prototype);\n        extend(ZAxis.prototype, {\n            isZAxis: true,\n            setOptions: function(userOptions) {\n                userOptions = merge({\n                    offset: 0,\n                    lineWidth: 0\n                }, userOptions);\n                Axis.prototype.setOptions.call(this, userOptions);\n                this.coll = 'zAxis';\n            },\n            setAxisSize: function() {\n                Axis.prototype.setAxisSize.call(this);\n                this.width = this.len = this.chart.options.chart.options3d.depth;\n                this.right = this.chart.chartWidth - this.width - this.left;\n            },\n            getSeriesExtremes: function() {\n                var axis = this,\n                    chart = axis.chart;\n\n                axis.hasVisibleSeries = false;\n\n                // Reset properties in case we're redrawing (#3353)\n                axis.dataMin = axis.dataMax = axis.ignoreMinPadding = axis.ignoreMaxPadding = null;\n\n                if (axis.buildStacks) {\n                    axis.buildStacks();\n                }\n\n                // loop through this axis' series\n                each(axis.series, function(series) {\n\n                    if (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n                        var seriesOptions = series.options,\n                            zData,\n                            threshold = seriesOptions.threshold;\n\n                        axis.hasVisibleSeries = true;\n\n                        // Validate threshold in logarithmic axes\n                        if (axis.positiveValuesOnly && threshold <= 0) {\n                            threshold = null;\n                        }\n\n                        zData = series.zData;\n                        if (zData.length) {\n                            axis.dataMin = Math.min(pick(axis.dataMin, zData[0]), Math.min.apply(null, zData));\n                            axis.dataMax = Math.max(pick(axis.dataMax, zData[0]), Math.max.apply(null, zData));\n                        }\n                    }\n                });\n            }\n        });\n\n\n        /**\n         * Extend the chart getAxes method to also get the color axis\n         */\n        wrap(Chart.prototype, 'getAxes', function(proceed) {\n            var chart = this,\n                options = this.options,\n                zAxisOptions = options.zAxis = splat(options.zAxis || {});\n\n            proceed.call(this);\n\n            if (!chart.is3d()) {\n                return;\n            }\n            this.zAxis = [];\n            each(zAxisOptions, function(axisOptions, i) {\n                axisOptions.index = i;\n                axisOptions.isX = true; //Z-Axis is shown horizontally, so it's kind of a X-Axis\n                var zAxis = new ZAxis(chart, axisOptions);\n                zAxis.setScale();\n            });\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            perspective = H.perspective,\n            pick = H.pick,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            inArray = H.inArray,\n            svg = H.svg,\n            wrap = H.wrap;\n\n        /***\n        \tEXTENSION FOR 3D COLUMNS\n        ***/\n        wrap(seriesTypes.column.prototype, 'translate', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d()) {\n                return;\n            }\n\n            var series = this,\n                chart = series.chart,\n                seriesOptions = series.options,\n                depth = seriesOptions.depth || 25,\n                borderCrisp = series.borderWidth % 2 ? 0.5 : 0;\n\n            if (\n                (chart.inverted && !series.yAxis.reversed) ||\n                (!chart.inverted && series.yAxis.reversed)\n            ) {\n                borderCrisp *= -1;\n            }\n\n            var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series.index; // #4743\n            var z = stack * (depth + (seriesOptions.groupZPadding || 1));\n\n            if (seriesOptions.grouping !== false) {\n                z = 0;\n            }\n\n            z += (seriesOptions.groupZPadding || 1);\n            each(series.data, function(point) {\n                if (point.y !== null) {\n                    var shapeArgs = point.shapeArgs,\n                        tooltipPos = point.tooltipPos,\n                        // Array for final shapeArgs calculation.\n                        // We are checking two dimensions (x and y).\n                        dimensions = [\n                            ['x', 'width'],\n                            ['y', 'height']\n                        ],\n                        borderlessBase; // crisped rects can have +/- 0.5 pixels offset\n\n                    // #3131 We need to check if column shape arguments are inside plotArea.\n                    each(dimensions, function(d) {\n                        borderlessBase = shapeArgs[d[0]] - borderCrisp;\n                        if (\n                            borderlessBase + shapeArgs[d[1]] < 0 || // End column position is smaller than axis start.\n                            borderlessBase > series[d[0] + 'Axis'].len // Start column position is bigger than axis end.\n                        ) {\n                            for (var key in shapeArgs) { // Set args to 0 if column is outside the chart.\n                                shapeArgs[key] = 0;\n                            }\n                        }\n                        if (borderlessBase < 0) {\n                            shapeArgs[d[1]] += shapeArgs[d[0]];\n                            shapeArgs[d[0]] = 0;\n                        }\n                        if (borderlessBase + shapeArgs[d[1]] > series[d[0] + 'Axis'].len) {\n                            shapeArgs[d[1]] = series[d[0] + 'Axis'].len - shapeArgs[d[0]];\n                        }\n                    });\n\n                    point.shapeType = 'cuboid';\n                    shapeArgs.z = z;\n                    shapeArgs.depth = depth;\n                    shapeArgs.insidePlotArea = true;\n\n                    // Translate the tooltip position in 3d space\n                    tooltipPos = perspective([{\n                        x: tooltipPos[0],\n                        y: tooltipPos[1],\n                        z: z\n                    }], chart, true)[0];\n                    point.tooltipPos = [tooltipPos.x, tooltipPos.y];\n                }\n            });\n            // store for later use #4067\n            series.z = z;\n        });\n\n        wrap(seriesTypes.column.prototype, 'animate', function(proceed) {\n            if (!this.chart.is3d()) {\n                proceed.apply(this, [].slice.call(arguments, 1));\n            } else {\n                var args = arguments,\n                    init = args[1],\n                    yAxis = this.yAxis,\n                    series = this,\n                    reversed = this.yAxis.reversed;\n\n                if (svg) { // VML is too slow anyway\n                    if (init) {\n                        each(series.data, function(point) {\n                            if (point.y !== null) {\n                                point.height = point.shapeArgs.height;\n                                point.shapey = point.shapeArgs.y; //#2968\n                                point.shapeArgs.height = 1;\n                                if (!reversed) {\n                                    if (point.stackY) {\n                                        point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY);\n                                    } else {\n                                        point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height);\n                                    }\n                                }\n                            }\n                        });\n\n                    } else { // run the animation\t\t\t\t\n                        each(series.data, function(point) {\n                            if (point.y !== null) {\n                                point.shapeArgs.height = point.height;\n                                point.shapeArgs.y = point.shapey; //#2968\n                                // null value do not have a graphic\n                                if (point.graphic) {\n                                    point.graphic.animate(point.shapeArgs, series.options.animation);\n                                }\n                            }\n                        });\n\n                        // redraw datalabels to the correct position\n                        this.drawDataLabels();\n\n                        // delete this function to allow it only once\n                        series.animate = null;\n                    }\n                }\n            }\n        });\n\n        /*\n         * In case of 3d columns there is no sense to add this columns\n         * to a specific series group - if series is added to a group\n         * all columns will have the same zIndex in comparison with different series\n         */\n\n        wrap(seriesTypes.column.prototype, 'plotGroup', function(proceed, prop, name, visibility, zIndex, parent) {\n            if (this.chart.is3d() && parent && !this[prop]) {\n                this[prop] = parent;\n                parent.attr(this.getPlotBox());\n                this[prop].survive = true;\n            }\n            return proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        /*\n         * When series is not added to group it is needed to change \n         * setVisible method to allow correct Legend funcionality\n         * This wrap is basing on pie chart series\n         */\n        wrap(seriesTypes.column.prototype, 'setVisible', function(proceed, vis) {\n            var series = this,\n                pointVis;\n            if (series.chart.is3d()) {\n                each(series.data, function(point) {\n                    point.visible = point.options.visible = vis = vis === undefined ? !point.visible : vis;\n                    pointVis = vis ? 'visible' : 'hidden';\n                    series.options.data[inArray(point, series.data)] = point.options;\n                    if (point.graphic) {\n                        point.graphic.attr({\n                            visibility: pointVis\n                        });\n                    }\n                });\n            }\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        wrap(seriesTypes.column.prototype, 'init', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.chart.is3d()) {\n                var seriesOptions = this.options,\n                    grouping = seriesOptions.grouping,\n                    stacking = seriesOptions.stacking,\n                    reversedStacks = pick(this.yAxis.options.reversedStacks, true),\n                    z = 0;\n\n                if (!(grouping !== undefined && !grouping)) {\n                    var stacks = this.chart.retrieveStacks(stacking),\n                        stack = seriesOptions.stack || 0,\n                        i; // position within the stack\n                    for (i = 0; i < stacks[stack].series.length; i++) {\n                        if (stacks[stack].series[i] === this) {\n                            break;\n                        }\n                    }\n                    z = (10 * (stacks.totalStacks - stacks[stack].position)) + (reversedStacks ? i : -i); // #4369\n\n                    // In case when axis is reversed, columns are also reversed inside the group (#3737)\n                    if (!this.xAxis.reversed) {\n                        z = (stacks.totalStacks * 10) - z;\n                    }\n                }\n\n                seriesOptions.zIndex = z;\n            }\n        });\n\n\n        function pointAttribs(proceed) {\n            var attr = proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.chart.is3d()) {\n                // Set the fill color to the fill color to provide a smooth edge\n                attr.stroke = this.options.edgeColor || attr.fill;\n                attr['stroke-width'] = pick(this.options.edgeWidth, 1); // #4055\n            }\n\n            return attr;\n        }\n\n        wrap(seriesTypes.column.prototype, 'pointAttribs', pointAttribs);\n        if (seriesTypes.columnrange) {\n            wrap(seriesTypes.columnrange.prototype, 'pointAttribs', pointAttribs);\n            seriesTypes.columnrange.prototype.plotGroup = seriesTypes.column.prototype.plotGroup;\n            seriesTypes.columnrange.prototype.setVisible = seriesTypes.column.prototype.setVisible;\n        }\n\n\n        wrap(Series.prototype, 'alignDataLabel', function(proceed) {\n\n            // Only do this for 3D columns and columnranges\n            if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) {\n                var series = this,\n                    chart = series.chart;\n\n                var args = arguments,\n                    alignTo = args[4];\n\n                var pos = ({\n                    x: alignTo.x,\n                    y: alignTo.y,\n                    z: series.z\n                });\n                pos = perspective([pos], chart, true)[0];\n                alignTo.x = pos.x;\n                alignTo.y = pos.y;\n            }\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        /***\n        \tEXTENSION FOR 3D CYLINDRICAL COLUMNS\n        \tNot supported\n        ***/\n        /*\n        var defaultOptions = H.getOptions();\n        defaultOptions.plotOptions.cylinder = H.merge(defaultOptions.plotOptions.column);\n        var CylinderSeries = H.extendClass(seriesTypes.column, {\n        \ttype: 'cylinder'\n        });\n        seriesTypes.cylinder = CylinderSeries;\n\n        wrap(seriesTypes.cylinder.prototype, 'translate', function (proceed) {\n        \tproceed.apply(this, [].slice.call(arguments, 1));\n\n        \t// Do not do this if the chart is not 3D\n        \tif (!this.chart.is3d()) {\n        \t\treturn;\n        \t}\n\n        \tvar series = this,\n        \t\tchart = series.chart,\n        \t\toptions = chart.options,\n        \t\tcylOptions = options.plotOptions.cylinder,\n        \t\toptions3d = options.chart.options3d,\n        \t\tdepth = cylOptions.depth || 0,\n        \t\talpha = chart.alpha3d;\n\n        \tvar z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth;\n        \tz += depth / 2;\n\n        \tif (cylOptions.grouping !== false) { z = 0; }\n\n        \teach(series.data, function (point) {\n        \t\tvar shapeArgs = point.shapeArgs,\n        \t\t\tdeg2rad = H.deg2rad;\n        \t\tpoint.shapeType = 'arc3d';\n        \t\tshapeArgs.x += depth / 2;\n        \t\tshapeArgs.z = z;\n        \t\tshapeArgs.start = 0;\n        \t\tshapeArgs.end = 2 * PI;\n        \t\tshapeArgs.r = depth * 0.95;\n        \t\tshapeArgs.innerR = 0;\n        \t\tshapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z;\n        \t\tshapeArgs.alpha = 90 - alpha;\n        \t\tshapeArgs.beta = 0;\n        \t});\n        });\n        */\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var deg2rad = H.deg2rad,\n            each = H.each,\n            pick = H.pick,\n            seriesTypes = H.seriesTypes,\n            svg = H.svg,\n            wrap = H.wrap;\n\n        /*** \n        \tEXTENSION FOR 3D PIES\n        ***/\n\n        wrap(seriesTypes.pie.prototype, 'translate', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d()) {\n                return;\n            }\n\n            var series = this,\n                seriesOptions = series.options,\n                depth = seriesOptions.depth || 0,\n                options3d = series.chart.options.chart.options3d,\n                alpha = options3d.alpha,\n                beta = options3d.beta,\n                z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth;\n\n            z += depth / 2;\n\n            if (seriesOptions.grouping !== false) {\n                z = 0;\n            }\n\n            each(series.data, function(point) {\n\n                var shapeArgs = point.shapeArgs,\n                    angle;\n\n                point.shapeType = 'arc3d';\n\n                shapeArgs.z = z;\n                shapeArgs.depth = depth * 0.75;\n                shapeArgs.alpha = alpha;\n                shapeArgs.beta = beta;\n                shapeArgs.center = series.center;\n\n                angle = (shapeArgs.end + shapeArgs.start) / 2;\n\n                point.slicedTranslation = {\n                    translateX: Math.round(Math.cos(angle) * seriesOptions.slicedOffset * Math.cos(alpha * deg2rad)),\n                    translateY: Math.round(Math.sin(angle) * seriesOptions.slicedOffset * Math.cos(alpha * deg2rad))\n                };\n            });\n        });\n\n        wrap(seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function(proceed) {\n            var args = arguments;\n            return this.series.chart.is3d() ? [] : proceed.call(this, args[1]);\n        });\n\n\n        wrap(seriesTypes.pie.prototype, 'pointAttribs', function(proceed, point, state) {\n            var attr = proceed.call(this, point, state),\n                options = this.options;\n\n            if (this.chart.is3d()) {\n                attr.stroke = options.edgeColor || point.color || this.color;\n                attr['stroke-width'] = pick(options.edgeWidth, 1);\n            }\n\n            return attr;\n        });\n\n\n        wrap(seriesTypes.pie.prototype, 'drawPoints', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.chart.is3d()) {\n                each(this.points, function(point) {\n                    var graphic = point.graphic;\n\n                    // #4584 Check if has graphic - null points don't have it\n                    if (graphic) {\n                        // Hide null or 0 points (#3006, 3650)\n                        graphic[point.y && point.visible ? 'show' : 'hide']();\n                    }\n                });\n            }\n        });\n\n        wrap(seriesTypes.pie.prototype, 'drawDataLabels', function(proceed) {\n            if (this.chart.is3d()) {\n                var series = this,\n                    chart = series.chart,\n                    options3d = chart.options.chart.options3d;\n                each(series.data, function(point) {\n                    var shapeArgs = point.shapeArgs,\n                        r = shapeArgs.r,\n                        a1 = (shapeArgs.alpha || options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values\n                        b1 = (shapeArgs.beta || options3d.beta) * deg2rad,\n                        a2 = (shapeArgs.start + shapeArgs.end) / 2,\n                        labelPos = point.labelPos,\n                        labelIndexes = [0, 2, 4], // [x1, y1, x2, y2, x3, y3]\n                        yOffset = (-r * (1 - Math.cos(a1)) * Math.sin(a2)), // + (sin(a2) > 0 ? sin(a1) * d : 0)\n                        xOffset = r * (Math.cos(b1) - 1) * Math.cos(a2);\n\n                    // Apply perspective on label positions\n                    each(labelIndexes, function(index) {\n                        labelPos[index] += xOffset;\n                        labelPos[index + 1] += yOffset;\n                    });\n                });\n            }\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        wrap(seriesTypes.pie.prototype, 'addPoint', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n            if (this.chart.is3d()) {\n                // destroy (and rebuild) everything!!!\n                this.update(this.userOptions, true); // #3845 pass the old options\n            }\n        });\n\n        wrap(seriesTypes.pie.prototype, 'animate', function(proceed) {\n            if (!this.chart.is3d()) {\n                proceed.apply(this, [].slice.call(arguments, 1));\n            } else {\n                var args = arguments,\n                    init = args[1],\n                    animation = this.options.animation,\n                    attribs,\n                    center = this.center,\n                    group = this.group,\n                    markerGroup = this.markerGroup;\n\n                if (svg) { // VML is too slow anyway\n\n                    if (animation === true) {\n                        animation = {};\n                    }\n                    // Initialize the animation\n                    if (init) {\n\n                        // Scale down the group and place it in the center\n                        group.oldtranslateX = group.translateX;\n                        group.oldtranslateY = group.translateY;\n                        attribs = {\n                            translateX: center[0],\n                            translateY: center[1],\n                            scaleX: 0.001, // #1499\n                            scaleY: 0.001\n                        };\n\n                        group.attr(attribs);\n                        if (markerGroup) {\n                            markerGroup.attrSetters = group.attrSetters;\n                            markerGroup.attr(attribs);\n                        }\n\n                        // Run the animation\n                    } else {\n                        attribs = {\n                            translateX: group.oldtranslateX,\n                            translateY: group.oldtranslateY,\n                            scaleX: 1,\n                            scaleY: 1\n                        };\n                        group.animate(attribs, animation);\n\n                        if (markerGroup) {\n                            markerGroup.animate(attribs, animation);\n                        }\n\n                        // Delete this function to allow it only once\n                        this.animate = null;\n                    }\n\n                }\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var perspective = H.perspective,\n            pick = H.pick,\n            Point = H.Point,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap;\n\n        /*** \n        \tEXTENSION FOR 3D SCATTER CHART\n        ***/\n\n        wrap(seriesTypes.scatter.prototype, 'translate', function(proceed) {\n            //function translate3d(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (!this.chart.is3d()) {\n                return;\n            }\n\n            var series = this,\n                chart = series.chart,\n                zAxis = pick(series.zAxis, chart.options.zAxis[0]),\n                rawPoints = [],\n                rawPoint,\n                projectedPoints,\n                projectedPoint,\n                zValue,\n                i;\n\n            for (i = 0; i < series.data.length; i++) {\n                rawPoint = series.data[i];\n                zValue = zAxis.isLog && zAxis.val2lin ? zAxis.val2lin(rawPoint.z) : rawPoint.z; // #4562\n                rawPoint.plotZ = zAxis.translate(zValue);\n\n                rawPoint.isInside = rawPoint.isInside ? (zValue >= zAxis.min && zValue <= zAxis.max) : false;\n\n                rawPoints.push({\n                    x: rawPoint.plotX,\n                    y: rawPoint.plotY,\n                    z: rawPoint.plotZ\n                });\n            }\n\n            projectedPoints = perspective(rawPoints, chart, true);\n\n            for (i = 0; i < series.data.length; i++) {\n                rawPoint = series.data[i];\n                projectedPoint = projectedPoints[i];\n\n                rawPoint.plotXold = rawPoint.plotX;\n                rawPoint.plotYold = rawPoint.plotY;\n                rawPoint.plotZold = rawPoint.plotZ;\n\n                rawPoint.plotX = projectedPoint.x;\n                rawPoint.plotY = projectedPoint.y;\n                rawPoint.plotZ = projectedPoint.z;\n\n            }\n\n        });\n\n\n        wrap(seriesTypes.scatter.prototype, 'init', function(proceed, chart, options) {\n            if (chart.is3d()) {\n                // add a third coordinate\n                this.axisTypes = ['xAxis', 'yAxis', 'zAxis'];\n                this.pointArrayMap = ['x', 'y', 'z'];\n                this.parallelArrays = ['x', 'y', 'z'];\n\n                // Require direct touch rather than using the k-d-tree, because the k-d-tree currently doesn't\n                // take the xyz coordinate system into account (#4552)\n                this.directTouch = true;\n            }\n\n            var result = proceed.apply(this, [chart, options]);\n\n            if (this.chart.is3d()) {\n                // Set a new default tooltip formatter\n                var default3dScatterTooltip = 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>';\n                if (this.userOptions.tooltip) {\n                    this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip;\n                } else {\n                    this.tooltipOptions.pointFormat = default3dScatterTooltip;\n                }\n            }\n            return result;\n        });\n\n        /**\n         * Updating zIndex for every point - based on the distance from point to camera\n         */\n        wrap(seriesTypes.scatter.prototype, 'pointAttribs', function(proceed, point) {\n            var pointOptions = proceed.apply(this, [].slice.call(arguments, 1));\n            if (this.chart.is3d() && point) {\n                pointOptions.zIndex = H.pointCameraDistance(point, this.chart);\n            }\n            return pointOptions;\n        });\n\n\n        wrap(Point.prototype, 'applyOptions', function(proceed) {\n            var point = proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.series.chart.is3d() && point.z === undefined) {\n                point.z = 0;\n            }\n            return point;\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var Axis = H.Axis,\n            SVGRenderer = H.SVGRenderer,\n            VMLRenderer = H.VMLRenderer;\n\n        /**\n         *\tExtension to the VML Renderer\n         */\n        if (VMLRenderer) {\n\n            H.setOptions({\n                animate: false\n            });\n\n            VMLRenderer.prototype.face3d = SVGRenderer.prototype.face3d;\n            VMLRenderer.prototype.polyhedron = SVGRenderer.prototype.polyhedron;\n            VMLRenderer.prototype.cuboid = SVGRenderer.prototype.cuboid;\n            VMLRenderer.prototype.cuboidPath = SVGRenderer.prototype.cuboidPath;\n\n            VMLRenderer.prototype.toLinePath = SVGRenderer.prototype.toLinePath;\n            VMLRenderer.prototype.toLineSegments = SVGRenderer.prototype.toLineSegments;\n\n            VMLRenderer.prototype.createElement3D = SVGRenderer.prototype.createElement3D;\n\n            VMLRenderer.prototype.arc3d = function(shapeArgs) {\n                var result = SVGRenderer.prototype.arc3d.call(this, shapeArgs);\n                result.css({\n                    zIndex: result.zIndex\n                });\n                return result;\n            };\n\n            H.VMLRenderer.prototype.arc3dPath = H.SVGRenderer.prototype.arc3dPath;\n\n            H.wrap(Axis.prototype, 'render', function(proceed) {\n                proceed.apply(this, [].slice.call(arguments, 1));\n                // VML doesn't support a negative z-index\n                if (this.sideFrame) {\n                    this.sideFrame.css({\n                        zIndex: 0\n                    });\n                    this.sideFrame.front.attr({\n                        fill: this.sideFrame.color\n                    });\n                }\n                if (this.bottomFrame) {\n                    this.bottomFrame.css({\n                        zIndex: 1\n                    });\n                    this.bottomFrame.front.attr({\n                        fill: this.bottomFrame.color\n                    });\n                }\n                if (this.backFrame) {\n                    this.backFrame.css({\n                        zIndex: 0\n                    });\n                    this.backFrame.front.attr({\n                        fill: this.backFrame.color\n                    });\n                }\n            });\n\n        }\n\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/highcharts-more.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2016 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(v){\"object\"===typeof module&&module.exports?module.exports=v:v(Highcharts)})(function(v){(function(a){function r(a,b){this.init(a,b)}var t=a.CenteredSeriesMixin,w=a.each,p=a.extend,m=a.merge,f=a.splat;p(r.prototype,{coll:\"pane\",init:function(a,b){this.chart=b;this.background=[];b.pane.push(this);this.setOptions(a)},setOptions:function(a){this.options=m(this.defaultOptions,this.chart.angular?{background:{}}:void 0,a)},render:function(){var a=this.options,b=this.options.background,d=this.chart.renderer;\nthis.group||(this.group=d.g(\"pane-group\").attr({zIndex:a.zIndex||0}).add());this.updateCenter();if(b)for(b=f(b),a=Math.max(b.length,this.background.length||0),d=0;d<a;d++)b[d]&&this.axis?this.renderBackground(m(this.defaultBackgroundOptions,b[d]),d):this.background[d]&&(this.background[d]=this.background[d].destroy(),this.background.splice(d,1))},renderBackground:function(a,b){var d=\"animate\";this.background[b]||(this.background[b]=this.chart.renderer.path().add(this.group),d=\"attr\");this.background[b][d]({d:this.axis.getPlotBandPath(a.from,\na.to,a)}).attr({fill:a.backgroundColor,stroke:a.borderColor,\"stroke-width\":a.borderWidth,\"class\":\"highcharts-pane \"+(a.className||\"\")})},defaultOptions:{center:[\"50%\",\"50%\"],size:\"85%\",startAngle:0},defaultBackgroundOptions:{shape:\"circle\",borderWidth:1,borderColor:\"#cccccc\",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,\"#ffffff\"],[1,\"#e6e6e6\"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:\"105%\"},updateCenter:function(a){this.center=(a||this.axis||{}).center=\nt.getCenter.call(this)},update:function(a,b){m(!0,this.options,a);this.setOptions(this.options);this.render();w(this.chart.axes,function(d){d.pane===this&&(d.pane=null,d.update({},b))},this)}});a.Pane=r})(v);(function(a){var r=a.each,t=a.extend,w=a.map,p=a.merge,m=a.noop,f=a.pick,h=a.pInt,b=a.wrap,d,e,k=a.Axis.prototype;a=a.Tick.prototype;d={getOffset:m,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:m,setCategories:m,setTitle:m};e={defaultRadialGaugeOptions:{labels:{align:\"center\",\nx:0,y:null},minorGridLineWidth:0,minorTickInterval:\"auto\",minorTickLength:10,minorTickPosition:\"inside\",minorTickWidth:1,tickLength:10,tickPosition:\"inside\",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:\"circle\",labels:{align:\"right\",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(c){c=\nthis.options=p(this.defaultOptions,this.defaultRadialOptions,c);c.plotBands||(c.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0},getLinePath:function(c,b){c=this.center;var d=this.chart,g=f(b,c[2]/2-this.offset);this.isCircular||void 0!==b?b=this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],g,g,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(b=this.postTranslate(this.angleRad,g),b=[\"M\",c[0]+d.plotLeft,c[1]+d.plotTop,\"L\",b.x,\nb.y]);return b},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===f(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||\n0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.pane.updateCenter(this),this.isCircular&&(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*f(this.sector,1)/2)},getPosition:function(c,b){return this.postTranslate(this.isCircular?this.translate(c):this.angleRad,f(this.isCircular?b:this.translate(c),this.center[2]/2)-this.offset)},postTranslate:function(c,b){var d=this.chart,g=this.center;c=this.startAngleRad+c;return{x:d.plotLeft+\ng[0]+Math.cos(c)*b,y:d.plotTop+g[1]+Math.sin(c)*b}},getPlotBandPath:function(c,b,d){var g=this.center,n=this.startAngleRad,a=g[2]/2,e=[f(d.outerRadius,\"100%\"),d.innerRadius,f(d.thickness,10)],k=Math.min(this.offset,0),z=/%$/,m,p=this.isCircular;\"polygon\"===this.options.gridLineInterpolation?g=this.getPlotLinePath(c).concat(this.getPlotLinePath(b,!0)):(c=Math.max(c,this.min),b=Math.min(b,this.max),p||(e[0]=this.translate(c),e[1]=this.translate(b)),e=w(e,function(b){z.test(b)&&(b=h(b,10)*a/100);return b}),\n\"circle\"!==d.shape&&p?(c=n+this.translate(c),b=n+this.translate(b)):(c=-Math.PI/2,b=1.5*Math.PI,m=!0),e[0]-=k,e[2]-=k,g=this.chart.renderer.symbols.arc(this.left+g[0],this.top+g[1],e[0],e[0],{start:Math.min(c,b),end:Math.max(c,b),innerR:f(e[1],e[0]-e[2]),open:m}));return g},getPlotLinePath:function(b,d){var c=this,g=c.center,e=c.chart,a=c.getPosition(b),k,h,f;c.isCircular?f=[\"M\",g[0]+e.plotLeft,g[1]+e.plotTop,\"L\",a.x,a.y]:\"circle\"===c.options.gridLineInterpolation?(b=c.translate(b))&&(f=c.getLinePath(0,\nb)):(r(e.xAxis,function(b){b.pane===c.pane&&(k=b)}),f=[],b=c.translate(b),g=k.tickPositions,k.autoConnect&&(g=g.concat([g[0]])),d&&(g=[].concat(g).reverse()),r(g,function(c,d){h=k.getPosition(c,b);f.push(d?\"L\":\"M\",h.x,h.y)}));return f},getTitlePosition:function(){var b=this.center,d=this.chart,e=this.options.title;return{x:d.plotLeft+b[0]+(e.x||0),y:d.plotTop+b[1]-{high:.5,middle:.25,low:0}[e.align]*b[2]+(e.y||0)}}};b(k,\"init\",function(b,g,a){var c=g.angular,n=g.polar,q=a.isX,k=c&&q,h,m=g.options,\nr=this.pane=g.pane[a.pane||0],y=r.options;if(c){if(t(this,k?d:e),h=!q)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else n&&(t(this,e),this.defaultRadialOptions=(h=q)?this.defaultRadialXOptions:p(this.defaultYAxisOptions,this.defaultRadialYOptions));c||n?(this.isRadial=!0,g.inverted=!1,m.chart.zoomType=null):this.isRadial=!1;h&&(r.axis=this);b.call(this,g,a);k||!c&&!n||(b=this.options,this.angleRad=(b.angle||0)*Math.PI/180,this.startAngleRad=(y.startAngle-90)*Math.PI/180,this.endAngleRad=\n(f(y.endAngle,y.startAngle+360)-90)*Math.PI/180,this.offset=b.offset||0,this.isCircular=h)});b(k,\"autoLabelAlign\",function(b){if(!this.isRadial)return b.apply(this,[].slice.call(arguments,1))});b(a,\"getPosition\",function(b,d,e,a,l){var c=this.axis;return c.getPosition?c.getPosition(e):b.call(this,d,e,a,l)});b(a,\"getLabelPosition\",function(b,d,e,a,l,q,k,h,m){var c=this.axis,g=q.y,n=20,u=q.align,x=(c.translate(this.pos)+c.startAngleRad+Math.PI/2)/Math.PI*180%360;c.isRadial?(b=c.getPosition(this.pos,\nc.center[2]/2+f(q.distance,-25)),\"auto\"===q.rotation?a.attr({rotation:x}):null===g&&(g=c.chart.renderer.fontMetrics(a.styles.fontSize).b-a.getBBox().height/2),null===u&&(c.isCircular?(this.label.getBBox().width>c.len*c.tickInterval/(c.max-c.min)&&(n=0),u=x>n&&x<180-n?\"left\":x>180+n&&x<360-n?\"right\":\"center\"):u=\"center\",a.attr({align:u})),b.x+=q.x,b.y+=g):b=b.call(this,d,e,a,l,q,k,h,m);return b});b(a,\"getMarkPath\",function(b,d,e,a,l,k,h){var c=this.axis;c.isRadial?(b=c.getPosition(this.pos,c.center[2]/\n2+a),d=[\"M\",d,e,\"L\",b.x,b.y]):d=b.call(this,d,e,a,l,k,h);return d})})(v);(function(a){var r=a.each,t=a.noop,w=a.pick,p=a.Series,m=a.seriesType,f=a.seriesTypes;m(\"arearange\",\"area\",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{series.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.low}\\x3c/b\\x3e - \\x3cb\\x3e{point.high}\\x3c/b\\x3e\\x3cbr/\\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},\n{pointArrayMap:[\"low\",\"high\"],dataLabelCollections:[\"dataLabel\",\"dataLabelUpper\"],toYData:function(a){return[a.low,a.high]},pointValKey:\"low\",deferTranslatePolar:!0,highToXY:function(a){var b=this.chart,d=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=d.x-b.plotLeft;a.plotHigh=d.y-b.plotTop},translate:function(){var a=this,b=a.yAxis,d=!!a.modifyValue;f.area.prototype.translate.apply(a);r(a.points,function(e){var k=e.low,c=e.high,g=e.plotY;null===c||null===k?e.isNull=!0:\n(e.plotLow=g,e.plotHigh=b.translate(d?a.modifyValue(c,e):c,0,1,0,1),d&&(e.yBottom=e.plotHigh))});this.chart.polar&&r(this.points,function(b){a.highToXY(b)})},getGraphPath:function(a){var b=[],d=[],e,k=f.area.prototype.getGraphPath,c,g,n;n=this.options;var u=this.chart.polar&&!1!==n.connectEnds,l=n.connectNulls,q=n.step;a=a||this.points;for(e=a.length;e--;)c=a[e],c.isNull||u||l||a[e+1]&&!a[e+1].isNull||d.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),g={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,\nyBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},d.push(g),b.push(g),c.isNull||u||l||a[e-1]&&!a[e-1].isNull||d.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=k.call(this,a);q&&(!0===q&&(q=\"left\"),n.step={left:\"right\",center:\"center\",right:\"left\"}[q]);b=k.call(this,b);d=k.call(this,d);n.step=q;n=[].concat(a,b);this.chart.polar||\"M\"!==d[0]||(d[0]=\"L\");this.graphPath=n;this.areaPath=this.areaPath.concat(a,d);n.isArea=!0;n.xMap=a.xMap;this.areaPath.xMap=a.xMap;return n},\ndrawDataLabels:function(){var a=this.data,b=a.length,d,e=[],k=p.prototype,c=this.options.dataLabels,g=c.align,n=c.verticalAlign,u=c.inside,l,q,x=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(d=b;d--;)if(l=a[d])q=u?l.plotHigh<l.plotLow:l.plotHigh>l.plotLow,l.y=l.high,l._plotY=l.plotY,l.plotY=l.plotHigh,e[d]=l.dataLabel,l.dataLabel=l.dataLabelUpper,l.below=q,x?g||(c.align=q?\"right\":\"left\"):n||(c.verticalAlign=q?\"top\":\"bottom\"),c.x=c.xHigh,c.y=c.yHigh;k.drawDataLabels&&k.drawDataLabels.apply(this,\narguments);for(d=b;d--;)if(l=a[d])q=u?l.plotHigh<l.plotLow:l.plotHigh>l.plotLow,l.dataLabelUpper=l.dataLabel,l.dataLabel=e[d],l.y=l.low,l.plotY=l._plotY,l.below=!q,x?g||(c.align=q?\"left\":\"right\"):n||(c.verticalAlign=q?\"bottom\":\"top\"),c.x=c.xLow,c.y=c.yLow;k.drawDataLabels&&k.drawDataLabels.apply(this,arguments)}c.align=g;c.verticalAlign=n},alignDataLabel:function(){f.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(v);(function(a){var r=a.seriesType;\nr(\"areasplinerange\",\"arearange\",null,{getPointSpline:a.seriesTypes.spline.prototype.getPointSpline})})(v);(function(a){var r=a.defaultPlotOptions,t=a.each,w=a.merge,p=a.noop,m=a.pick,f=a.seriesType,h=a.seriesTypes.column.prototype;f(\"columnrange\",\"arearange\",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var b=this,d=b.yAxis,a=b.xAxis,k=a.startAngleRad,c,g=b.chart,n=b.xAxis.isRadial,u;h.translate.apply(b);t(b.points,function(e){var q=e.shapeArgs,l=b.options.minPointLength,\nf,h;e.plotHigh=u=d.translate(e.high,0,1,0,1);e.plotLow=e.plotY;h=u;f=m(e.rectPlotY,e.plotY)-u;Math.abs(f)<l?(l-=f,f+=l,h-=l/2):0>f&&(f*=-1,h-=f);n?(c=e.barX+k,e.shapeType=\"path\",e.shapeArgs={d:b.polarArc(h+f,h,c,c+e.pointWidth)}):(q.height=f,q.y=h,e.tooltipPos=g.inverted?[d.len+d.pos-g.plotLeft-h-f/2,a.len+a.pos-g.plotTop-q.x-q.width/2,f]:[a.left-g.plotLeft+q.x+q.width/2,d.pos-g.plotTop+h+f/2,f])})},directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],drawGraph:p,crispCol:h.crispCol,drawPoints:h.drawPoints,\ndrawTracker:h.drawTracker,getColumnMetrics:h.getColumnMetrics,animate:function(){return h.animate.apply(this,arguments)},polarArc:function(){return h.polarArc.apply(this,arguments)},pointAttribs:h.pointAttribs})})(v);(function(a){var r=a.each,t=a.isNumber,w=a.merge,p=a.pick,m=a.pInt,f=a.Series,h=a.seriesType,b=a.TrackerMixin;h(\"gauge\",\"line\",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:\"top\",zIndex:2,borderWidth:1,borderColor:\"#cccccc\"},dial:{},pivot:{},tooltip:{headerFormat:\"\"},\nshowInLegend:!1},{angular:!0,directTouch:!0,drawGraph:a.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],translate:function(){var b=this.yAxis,a=this.options,k=b.center;this.generatePoints();r(this.points,function(c){var d=w(a.dial,c.dial),e=m(p(d.radius,80))*k[2]/200,u=m(p(d.baseLength,70))*e/100,l=m(p(d.rearLength,10))*e/100,q=d.baseWidth||3,f=d.topWidth||1,h=a.overshoot,r=b.startAngleRad+b.translate(c.y,null,null,null,!0);t(h)?(h=h/180*Math.PI,r=Math.max(b.startAngleRad-\nh,Math.min(b.endAngleRad+h,r))):!1===a.wrap&&(r=Math.max(b.startAngleRad,Math.min(b.endAngleRad,r)));r=180*r/Math.PI;c.shapeType=\"path\";c.shapeArgs={d:d.path||[\"M\",-l,-q/2,\"L\",u,-q/2,e,-f/2,e,f/2,u,q/2,-l,q/2,\"z\"],translateX:k[0],translateY:k[1],rotation:r};c.plotX=k[0];c.plotY=k[1]})},drawPoints:function(){var b=this,a=b.yAxis.center,k=b.pivot,c=b.options,g=c.pivot,n=b.chart.renderer;r(b.points,function(a){var d=a.graphic,e=a.shapeArgs,g=e.d,k=w(c.dial,a.dial);d?(d.animate(e),e.d=g):(a.graphic=n[a.shapeType](e).attr({rotation:e.rotation,\nzIndex:1}).addClass(\"highcharts-dial\").add(b.group),a.graphic.attr({stroke:k.borderColor||\"none\",\"stroke-width\":k.borderWidth||0,fill:k.backgroundColor||\"#000000\"}))});k?k.animate({translateX:a[0],translateY:a[1]}):(b.pivot=n.circle(0,0,p(g.radius,5)).attr({zIndex:2}).addClass(\"highcharts-pivot\").translate(a[0],a[1]).add(b.group),b.pivot.attr({\"stroke-width\":g.borderWidth||0,stroke:g.borderColor||\"#cccccc\",fill:g.backgroundColor||\"#000000\"}))},animate:function(b){var a=this;b||(r(a.points,function(b){var c=\nb.graphic;c&&(c.attr({rotation:180*a.yAxis.startAngleRad/Math.PI}),c.animate({rotation:b.shapeArgs.rotation},a.options.animation))}),a.animate=null)},render:function(){this.group=this.plotGroup(\"group\",\"series\",this.visible?\"visible\":\"hidden\",this.options.zIndex,this.chart.seriesGroup);f.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(b,a){f.prototype.setData.call(this,b,!1);this.processData();this.generatePoints();p(a,!0)&&this.chart.redraw()},drawTracker:b&&b.drawTrackerPoint},\n{setState:function(b){this.state=b}})})(v);(function(a){var r=a.each,t=a.noop,w=a.pick,p=a.seriesType,m=a.seriesTypes;p(\"boxplot\",\"column\",{threshold:null,tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cb\\x3e {series.name}\\x3c/b\\x3e\\x3cbr/\\x3eMaximum: {point.high}\\x3cbr/\\x3eUpper quartile: {point.q3}\\x3cbr/\\x3eMedian: {point.median}\\x3cbr/\\x3eLower quartile: {point.q1}\\x3cbr/\\x3eMinimum: {point.low}\\x3cbr/\\x3e'},whiskerLength:\"50%\",fillColor:\"#ffffff\",lineWidth:1,\nmedianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:[\"low\",\"q1\",\"median\",\"q3\",\"high\"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:\"high\",pointAttribs:function(a){var f=this.options,b=a&&a.color||this.color;return{fill:a.fillColor||f.fillColor||b,stroke:f.lineColor||b,\"stroke-width\":f.lineWidth||0}},drawDataLabels:t,translate:function(){var a=this.yAxis,h=this.pointArrayMap;m.column.prototype.translate.apply(this);r(this.points,function(b){r(h,\nfunction(d){null!==b[d]&&(b[d+\"Plot\"]=a.translate(b[d],0,1,0,1))})})},drawPoints:function(){var a=this,h=a.options,b=a.chart.renderer,d,e,k,c,g,n,u=0,l,q,m,p,z=!1!==a.doQuartiles,t,y=a.options.whiskerLength;r(a.points,function(f){var x=f.graphic,r=x?\"animate\":\"attr\",J=f.shapeArgs,v={},C={},H={},I=f.color||a.color;void 0!==f.plotY&&(l=J.width,q=Math.floor(J.x),m=q+l,p=Math.round(l/2),d=Math.floor(z?f.q1Plot:f.lowPlot),e=Math.floor(z?f.q3Plot:f.lowPlot),k=Math.floor(f.highPlot),c=Math.floor(f.lowPlot),\nx||(f.graphic=x=b.g(\"point\").add(a.group),f.stem=b.path().addClass(\"highcharts-boxplot-stem\").add(x),y&&(f.whiskers=b.path().addClass(\"highcharts-boxplot-whisker\").add(x)),z&&(f.box=b.path(void 0).addClass(\"highcharts-boxplot-box\").add(x)),f.medianShape=b.path(void 0).addClass(\"highcharts-boxplot-median\").add(x)),v.stroke=f.stemColor||h.stemColor||I,v[\"stroke-width\"]=w(f.stemWidth,h.stemWidth,h.lineWidth),v.dashstyle=f.stemDashStyle||h.stemDashStyle,f.stem.attr(v),y&&(C.stroke=f.whiskerColor||h.whiskerColor||\nI,C[\"stroke-width\"]=w(f.whiskerWidth,h.whiskerWidth,h.lineWidth),f.whiskers.attr(C)),z&&(x=a.pointAttribs(f),f.box.attr(x)),H.stroke=f.medianColor||h.medianColor||I,H[\"stroke-width\"]=w(f.medianWidth,h.medianWidth,h.lineWidth),f.medianShape.attr(H),n=f.stem.strokeWidth()%2/2,u=q+p+n,f.stem[r]({d:[\"M\",u,e,\"L\",u,k,\"M\",u,d,\"L\",u,c]}),z&&(n=f.box.strokeWidth()%2/2,d=Math.floor(d)+n,e=Math.floor(e)+n,q+=n,m+=n,f.box[r]({d:[\"M\",q,e,\"L\",q,d,\"L\",m,d,\"L\",m,e,\"L\",q,e,\"z\"]})),y&&(n=f.whiskers.strokeWidth()%2/\n2,k+=n,c+=n,t=/%$/.test(y)?p*parseFloat(y)/100:y/2,f.whiskers[r]({d:[\"M\",u-t,k,\"L\",u+t,k,\"M\",u-t,c,\"L\",u+t,c]})),g=Math.round(f.medianPlot),n=f.medianShape.strokeWidth()%2/2,g+=n,f.medianShape[r]({d:[\"M\",q,g,\"L\",m,g]}))})},setStackedPoints:t})})(v);(function(a){var r=a.each,t=a.noop,w=a.seriesType,p=a.seriesTypes;w(\"errorbar\",\"boxplot\",{color:\"#000000\",grouping:!1,linkedTo:\":previous\",tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.low}\\x3c/b\\x3e - \\x3cb\\x3e{point.high}\\x3c/b\\x3e\\x3cbr/\\x3e'},\nwhiskerWidth:null},{type:\"errorbar\",pointArrayMap:[\"low\",\"high\"],toYData:function(a){return[a.low,a.high]},pointValKey:\"high\",doQuartiles:!1,drawDataLabels:p.arearange?function(){var a=this.pointValKey;p.arearange.prototype.drawDataLabels.call(this);r(this.data,function(f){f.y=f[a]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||p.column.prototype.getColumnMetrics.call(this)}})})(v);(function(a){var r=a.correctFloat,t=a.isNumber,w=a.pick,p=a.Point,m=a.Series,\nf=a.seriesType,h=a.seriesTypes;f(\"waterfall\",\"column\",{dataLabels:{inside:!0},lineWidth:1,lineColor:\"#333333\",dashStyle:\"dot\",borderColor:\"#333333\",states:{hover:{lineWidthPlus:0}}},{pointValKey:\"y\",translate:function(){var b=this.options,a=this.yAxis,e,k,c,g,n,f,l,q,m,p,t=w(b.minPointLength,5),v=t/2,y=b.threshold,D=b.stacking,A;h.column.prototype.translate.apply(this);q=m=y;k=this.points;e=0;for(b=k.length;e<b;e++)c=k[e],l=this.processedYData[e],g=c.shapeArgs,n=D&&a.stacks[(this.negStacks&&l<y?\"-\":\n\"\")+this.stackKey],A=this.getStackIndicator(A,c.x,this.index),p=n?n[c.x].points[A.key]:[0,l],c.isSum?c.y=r(l):c.isIntermediateSum&&(c.y=r(l-m)),f=Math.max(q,q+c.y)+p[0],g.y=a.translate(f,0,1,0,1),c.isSum?(g.y=a.translate(p[1],0,1,0,1),g.height=Math.min(a.translate(p[0],0,1,0,1),a.len)-g.y):c.isIntermediateSum?(g.y=a.translate(p[1],0,1,0,1),g.height=Math.min(a.translate(m,0,1,0,1),a.len)-g.y,m=p[1]):(g.height=0<l?a.translate(q,0,1,0,1)-g.y:a.translate(q,0,1,0,1)-a.translate(q-l,0,1,0,1),q+=n&&n[c.x]?\nn[c.x].total:l),0>g.height&&(g.y+=g.height,g.height*=-1),c.plotY=g.y=Math.round(g.y)-this.borderWidth%2/2,g.height=Math.max(Math.round(g.height),.001),c.yBottom=g.y+g.height,g.height<=t&&!c.isNull?(g.height=t,g.y-=v,c.plotY=g.y,c.minPointLengthOffset=0>c.y?-v:v):c.minPointLengthOffset=0,g=c.plotY+(c.negative?g.height:0),this.chart.inverted?c.tooltipPos[0]=a.len-g:c.tooltipPos[1]=g},processData:function(b){var a=this.yData,e=this.options.data,k,c=a.length,g,n,f,l,q,h;n=g=f=l=this.options.threshold||\n0;for(h=0;h<c;h++)q=a[h],k=e&&e[h]?e[h]:{},\"sum\"===q||k.isSum?a[h]=r(n):\"intermediateSum\"===q||k.isIntermediateSum?a[h]=r(g):(n+=q,g+=q),f=Math.min(n,f),l=Math.max(n,l);m.prototype.processData.call(this,b);this.options.stacking||(this.dataMin=f,this.dataMax=l)},toYData:function(b){return b.isSum?0===b.x?null:\"sum\":b.isIntermediateSum?0===b.x?null:\"intermediateSum\":b.y},pointAttribs:function(b,a){var d=this.options.upColor;d&&!b.options.color&&(b.color=0<b.y?d:null);b=h.column.prototype.pointAttribs.call(this,\nb,a);delete b.dashstyle;return b},getGraphPath:function(){return[\"M\",0,0]},getCrispPath:function(){var b=this.data,a=b.length,e=this.graph.strokeWidth()+this.borderWidth,e=Math.round(e)%2/2,f=this.yAxis.reversed,c=[],g,n,u;for(u=1;u<a;u++){n=b[u].shapeArgs;g=b[u-1].shapeArgs;n=[\"M\",g.x+g.width,g.y+b[u-1].minPointLengthOffset+e,\"L\",n.x,g.y+b[u-1].minPointLengthOffset+e];if(0>b[u-1].y&&!f||0<b[u-1].y&&f)n[2]+=g.height,n[5]+=g.height;c=c.concat(n)}return c},drawGraph:function(){m.prototype.drawGraph.call(this);\nthis.graph.attr({d:this.getCrispPath()})},setStackedPoints:function(){var b=this.options,a,e;m.prototype.setStackedPoints.apply(this,arguments);a=this.stackedYData?this.stackedYData.length:0;for(e=1;e<a;e++)b.data[e].isSum||b.data[e].isIntermediateSum||(this.stackedYData[e]+=this.stackedYData[e-1])},getExtremes:function(){if(this.options.stacking)return m.prototype.getExtremes.apply(this,arguments)}},{getClassName:function(){var b=p.prototype.getClassName.call(this);this.isSum?b+=\" highcharts-sum\":\nthis.isIntermediateSum&&(b+=\" highcharts-intermediate-sum\");return b},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(v);(function(a){var r=a.Series,t=a.seriesType,v=a.seriesTypes;t(\"polygon\",\"scatter\",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:\"\"},trackByArea:!0},{type:\"polygon\",getGraphPath:function(){for(var a=r.prototype.getGraphPath.call(this),m=a.length+1;m--;)(m===a.length||\"M\"===a[m])&&0<m&&a.splice(m,\n0,\"z\");return this.areaPath=a},drawGraph:function(){this.options.fillColor=this.color;v.area.prototype.drawGraph.call(this)},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawTracker:r.prototype.drawTracker,setStackedPoints:a.noop})})(v);(function(a){var r=a.arrayMax,t=a.arrayMin,v=a.Axis,p=a.color,m=a.each,f=a.isNumber,h=a.noop,b=a.pick,d=a.pInt,e=a.Point,k=a.Series,c=a.seriesType,g=a.seriesTypes;c(\"bubble\",\"scatter\",{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:\"middle\"},\nmarker:{lineColor:null,lineWidth:1,radius:null,states:{hover:{radiusPlus:0}},symbol:\"circle\"},minSize:8,maxSize:\"20%\",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:\"({point.x}, {point.y}), Size: {point.z}\"},turboThreshold:0,zThreshold:0,zoneAxis:\"z\"},{pointArrayMap:[\"y\",\"z\"],parallelArrays:[\"x\",\"y\",\"z\"],trackerGroups:[\"group\",\"dataLabelsGroup\"],specialGroup:\"group\",bubblePadding:!0,zoneAxis:\"z\",directTouch:!0,pointAttribs:function(a,c){var d=b(this.options.marker.fillOpacity,\n.5);a=k.prototype.pointAttribs.call(this,a,c);1!==d&&(a.fill=p(a.fill).setOpacity(d).get(\"rgba\"));return a},getRadii:function(b,a,c,d){var g,e,f,n=this.zData,k=[],l=this.options,q=\"width\"!==l.sizeBy,h=l.zThreshold,m=a-b;e=0;for(g=n.length;e<g;e++)f=n[e],l.sizeByAbsoluteValue&&null!==f&&(f=Math.abs(f-h),a=Math.max(a-h,Math.abs(b-h)),b=0),null===f?f=null:f<b?f=c/2-1:(f=0<m?(f-b)/m:.5,q&&0<=f&&(f=Math.sqrt(f)),f=Math.ceil(c+f*(d-c))/2),k.push(f);this.radii=k},animate:function(b){var a=this.options.animation;\nb||(m(this.points,function(b){var c=b.graphic,d;c&&c.width&&(d={x:c.x,y:c.y,width:c.width,height:c.height},c.attr({x:b.plotX,y:b.plotY,width:1,height:1}),c.animate(d,a))}),this.animate=null)},translate:function(){var b,c=this.data,d,e,k=this.radii;g.scatter.prototype.translate.call(this);for(b=c.length;b--;)d=c[b],e=k?k[b]:0,f(e)&&e>=this.minPxSize/2?(d.marker=a.extend(d.marker,{radius:e,width:2*e,height:2*e}),d.dlBox={x:d.plotX-e,y:d.plotY-e,width:2*e,height:2*e}):d.shapeArgs=d.plotY=d.dlBox=void 0},\nalignDataLabel:g.column.prototype.alignDataLabel,buildKDTree:h,applyZones:h},{haloPath:function(b){return e.prototype.haloPath.call(this,0===b?0:(this.marker?this.marker.radius||0:0)+b)},ttBelow:!1});v.prototype.beforePadding=function(){var a=this,c=this.len,e=this.chart,g=0,k=c,h=this.isXAxis,p=h?\"xData\":\"yData\",v=this.min,w={},D=Math.min(e.plotWidth,e.plotHeight),A=Number.MAX_VALUE,E=-Number.MAX_VALUE,F=this.max-v,B=c/F,G=[];m(this.series,function(c){var g=c.options;!c.bubblePadding||!c.visible&&\ne.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,G.push(c),h&&(m([\"minSize\",\"maxSize\"],function(b){var a=g[b],c=/%$/.test(a),a=d(a);w[b]=c?D*a/100:a}),c.minPxSize=w.minSize,c.maxPxSize=Math.max(w.maxSize,w.minSize),c=c.zData,c.length&&(A=b(g.zMin,Math.min(A,Math.max(t(c),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),E=b(g.zMax,Math.max(E,r(c))))))});m(G,function(b){var c=b[p],d=c.length,e;h&&b.getRadii(A,E,b.minPxSize,b.maxPxSize);if(0<F)for(;d--;)f(c[d])&&a.dataMin<=c[d]&&c[d]<=\na.dataMax&&(e=b.radii[d],g=Math.min((c[d]-v)*B-e,g),k=Math.max((c[d]-v)*B+e,k))});G.length&&0<F&&!this.isLog&&(k-=c,B*=(c+g-k)/c,m([[\"min\",\"userMin\",g],[\"max\",\"userMax\",k]],function(c){void 0===b(a.options[c[0]],a[c[1]])&&(a[c[0]]+=c[2]/B)}))}})(v);(function(a){function r(b,a){var d=this.chart,f=this.options.animation,c=this.group,g=this.markerGroup,n=this.xAxis.center,h=d.plotLeft,l=d.plotTop;d.polar?d.renderer.isSVG&&(!0===f&&(f={}),a?(b={translateX:n[0]+h,translateY:n[1]+l,scaleX:.001,scaleY:.001},\nc.attr(b),g&&g.attr(b)):(b={translateX:h,translateY:l,scaleX:1,scaleY:1},c.animate(b,f),g&&g.animate(b,f),this.animate=null)):b.call(this,a)}var t=a.each,v=a.pick,p=a.seriesTypes,m=a.wrap,f=a.Series.prototype,h=a.Pointer.prototype;f.searchPointByAngle=function(b){var a=this.chart,e=this.xAxis.pane.center;return this.searchKDTree({clientX:180+-180/Math.PI*Math.atan2(b.chartX-e[0]-a.plotLeft,b.chartY-e[1]-a.plotTop)})};f.getConnectors=function(b,a,e,f){var c,d,k,h,l,m,p,r;d=f?1:0;c=0<=a&&a<=b.length-\n1?a:0>a?b.length-1+a:0;a=0>c-1?b.length-(1+d):c-1;d=c+1>b.length-1?d:c+1;k=b[a];d=b[d];h=k.plotX;k=k.plotY;l=d.plotX;m=d.plotY;d=b[c].plotX;c=b[c].plotY;h=(1.5*d+h)/2.5;k=(1.5*c+k)/2.5;l=(1.5*d+l)/2.5;p=(1.5*c+m)/2.5;m=Math.sqrt(Math.pow(h-d,2)+Math.pow(k-c,2));r=Math.sqrt(Math.pow(l-d,2)+Math.pow(p-c,2));h=Math.atan2(k-c,h-d);p=Math.PI/2+(h+Math.atan2(p-c,l-d))/2;Math.abs(h-p)>Math.PI/2&&(p-=Math.PI);h=d+Math.cos(p)*m;k=c+Math.sin(p)*m;l=d+Math.cos(Math.PI+p)*r;p=c+Math.sin(Math.PI+p)*r;d={rightContX:l,\nrightContY:p,leftContX:h,leftContY:k,plotX:d,plotY:c};e&&(d.prevPointCont=this.getConnectors(b,a,!1,f));return d};m(f,\"buildKDTree\",function(b){this.chart.polar&&(this.kdByAngle?this.searchPoint=this.searchPointByAngle:this.options.findNearestPointBy=\"xy\");b.apply(this)});f.toXY=function(b){var a,e=this.chart,f=b.plotX;a=b.plotY;b.rectPlotX=f;b.rectPlotY=a;a=this.xAxis.postTranslate(b.plotX,this.yAxis.len-a);b.plotX=b.polarPlotX=a.x-e.plotLeft;b.plotY=b.polarPlotY=a.y-e.plotTop;this.kdByAngle?(e=\n(f/Math.PI*180+this.xAxis.pane.options.startAngle)%360,0>e&&(e+=360),b.clientX=e):b.clientX=b.plotX};p.spline&&(m(p.spline.prototype,\"getPointSpline\",function(a,d,e,f){this.chart.polar?f?(a=this.getConnectors(d,f,!0,this.connectEnds),a=[\"C\",a.prevPointCont.rightContX,a.prevPointCont.rightContY,a.leftContX,a.leftContY,a.plotX,a.plotY]):a=[\"M\",e.plotX,e.plotY]:a=a.call(this,d,e,f);return a}),p.areasplinerange&&(p.areasplinerange.prototype.getPointSpline=p.spline.prototype.getPointSpline));m(f,\"translate\",\nfunction(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});m(f,\"getGraphPath\",function(a,d){var b=this,f,c,g;if(this.chart.polar){d=d||this.points;for(f=0;f<d.length;f++)if(!d[f].isNull){c=f;break}!1!==this.options.connectEnds&&void 0!==c&&(this.connectEnds=!0,d.splice(d.length,0,d[c]),g=!0);t(d,function(a){void 0===a.polarPlotY&&b.toXY(a)})}f=a.apply(this,[].slice.call(arguments,\n1));g&&d.pop();return f});m(f,\"animate\",r);p.column&&(p=p.column.prototype,p.polarArc=function(a,d,e,f){var b=this.xAxis.center,g=this.yAxis.len;return this.chart.renderer.symbols.arc(b[0],b[1],g-d,null,{start:e,end:f,innerR:g-v(a,g)})},m(p,\"animate\",r),m(p,\"translate\",function(a){var b=this.xAxis,e=b.startAngleRad,f,c,g;this.preventPostTranslate=!0;a.call(this);if(b.isRadial)for(f=this.points,g=f.length;g--;)c=f[g],a=c.barX+e,c.shapeType=\"path\",c.shapeArgs={d:this.polarArc(c.yBottom,c.plotY,a,a+\nc.pointWidth)},this.toXY(c),c.tooltipPos=[c.plotX,c.plotY],c.ttBelow=c.plotY>b.center[1]}),m(p,\"alignDataLabel\",function(a,d,e,k,c,g){this.chart.polar?(a=d.rectPlotX/Math.PI*180,null===k.align&&(k.align=20<a&&160>a?\"left\":200<a&&340>a?\"right\":\"center\"),null===k.verticalAlign&&(k.verticalAlign=45>a||315<a?\"bottom\":135<a&&225>a?\"top\":\"middle\"),f.alignDataLabel.call(this,d,e,k,c,g)):a.call(this,d,e,k,c,g)}));m(h,\"getCoordinates\",function(a,d){var b=this.chart,f={xAxis:[],yAxis:[]};b.polar?t(b.axes,function(a){var c=\na.isXAxis,e=a.center,h=d.chartX-e[0]-b.plotLeft,e=d.chartY-e[1]-b.plotTop;f[c?\"xAxis\":\"yAxis\"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,e):Math.sqrt(Math.pow(h,2)+Math.pow(e,2)),!0)})}):f=a.call(this,d);return f});m(a.Chart.prototype,\"getAxes\",function(b){this.pane||(this.pane=[]);t(a.splat(this.options.pane),function(b){new a.Pane(b,this)},this);b.call(this)});m(a.Chart.prototype,\"drawChartBox\",function(a){a.call(this);t(this.pane,function(a){a.render()})});m(a.Chart.prototype,\"get\",\nfunction(b,d){return a.find(this.pane,function(a){return a.options.id===d})||b.call(this,d)})})(v)});\n"
  },
  {
    "path": "assets/highcharts/highcharts-more.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var CenteredSeriesMixin = H.CenteredSeriesMixin,\n            each = H.each,\n            extend = H.extend,\n            merge = H.merge,\n            splat = H.splat;\n        /**\n         * The Pane object allows options that are common to a set of X and Y axes.\n         *\n         * In the future, this can be extended to basic Highcharts and Highstock.\n         *\n         */\n        function Pane(options, chart) {\n            this.init(options, chart);\n        }\n\n        // Extend the Pane prototype\n        extend(Pane.prototype, {\n\n            coll: 'pane', // Member of chart.pane\n\n            /**\n             * Initiate the Pane object\n             */\n            init: function(options, chart) {\n                this.chart = chart;\n                this.background = [];\n\n                chart.pane.push(this);\n\n                this.setOptions(options);\n            },\n\n            setOptions: function(options) {\n\n                // Set options. Angular charts have a default background (#3318)\n                this.options = options = merge(\n                    this.defaultOptions,\n                    this.chart.angular ? {\n                        background: {}\n                    } : undefined,\n                    options\n                );\n            },\n\n            /**\n             * Render the pane with its backgrounds.\n             */\n            render: function() {\n\n                var options = this.options,\n                    backgroundOption = this.options.background,\n                    renderer = this.chart.renderer,\n                    len,\n                    i;\n\n                if (!this.group) {\n                    this.group = renderer.g('pane-group')\n                        .attr({\n                            zIndex: options.zIndex || 0\n                        })\n                        .add();\n                }\n\n                this.updateCenter();\n\n                // Render the backgrounds\n                if (backgroundOption) {\n                    backgroundOption = splat(backgroundOption);\n\n                    len = Math.max(\n                        backgroundOption.length,\n                        this.background.length || 0\n                    );\n\n                    for (i = 0; i < len; i++) {\n                        if (backgroundOption[i] && this.axis) { // #6641 - if axis exists, chart is circular and apply background\n                            this.renderBackground(\n                                merge(\n                                    this.defaultBackgroundOptions,\n                                    backgroundOption[i]\n                                ),\n                                i\n                            );\n                        } else if (this.background[i]) {\n                            this.background[i] = this.background[i].destroy();\n                            this.background.splice(i, 1);\n                        }\n                    }\n                }\n            },\n\n            /**\n             * Render an individual pane background.\n             * @param  {Object} backgroundOptions Background options\n             * @param  {number} i The index of the background in this.backgrounds\n             */\n            renderBackground: function(backgroundOptions, i) {\n                var method = 'animate';\n\n                if (!this.background[i]) {\n                    this.background[i] = this.chart.renderer.path()\n                        .add(this.group);\n                    method = 'attr';\n                }\n\n                this.background[i][method]({\n                    'd': this.axis.getPlotBandPath(\n                        backgroundOptions.from,\n                        backgroundOptions.to,\n                        backgroundOptions\n                    )\n                }).attr({\n\n                    'fill': backgroundOptions.backgroundColor,\n                    'stroke': backgroundOptions.borderColor,\n                    'stroke-width': backgroundOptions.borderWidth,\n\n                    'class': 'highcharts-pane ' + (backgroundOptions.className || '')\n                });\n\n            },\n\n            /**\n             * The default options object\n             */\n            defaultOptions: {\n                // background: {conditional},\n                center: ['50%', '50%'],\n                size: '85%',\n                startAngle: 0\n                //endAngle: startAngle + 360\n            },\n\n            /**\n             * The default background options\n             */\n            defaultBackgroundOptions: {\n                //className: 'highcharts-pane',\n                shape: 'circle',\n\n                borderWidth: 1,\n                borderColor: '#cccccc',\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#ffffff'],\n                        [1, '#e6e6e6']\n                    ]\n                },\n\n                from: -Number.MAX_VALUE, // corrected to axis min\n                innerRadius: 0,\n                to: Number.MAX_VALUE, // corrected to axis max\n                outerRadius: '105%'\n            },\n\n            /**\n             * Gets the center for the pane and its axis.\n             */\n            updateCenter: function(axis) {\n                this.center = (axis || this.axis || {}).center =\n                    CenteredSeriesMixin.getCenter.call(this);\n            },\n\n            /**\n             * Destroy the pane item\n             * /\n            destroy: function () {\n            \tH.erase(this.chart.pane, this);\n            \teach(this.background, function (background) {\n            \t\tbackground.destroy();\n            \t});\n            \tthis.background.length = 0;\n            \tthis.group = this.group.destroy();\n            },\n            */\n\n            /**\n             * Update the pane item with new options\n             * @param  {Object} options New pane options\n             */\n            update: function(options, redraw) {\n\n                merge(true, this.options, options);\n                this.setOptions(this.options);\n                this.render();\n                each(this.chart.axes, function(axis) {\n                    if (axis.pane === this) {\n                        axis.pane = null;\n                        axis.update({}, redraw);\n                    }\n                }, this);\n            }\n\n        });\n\n        H.Pane = Pane;\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            each = H.each,\n            extend = H.extend,\n            map = H.map,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            Tick = H.Tick,\n            wrap = H.wrap,\n\n\n            hiddenAxisMixin, // @todo Extract this to a new file\n            radialAxisMixin, // @todo Extract this to a new file\n            axisProto = Axis.prototype,\n            tickProto = Tick.prototype;\n\n        /**\n         * Augmented methods for the x axis in order to hide it completely, used for the X axis in gauges\n         */\n        hiddenAxisMixin = {\n            getOffset: noop,\n            redraw: function() {\n                this.isDirty = false; // prevent setting Y axis dirty\n            },\n            render: function() {\n                this.isDirty = false; // prevent setting Y axis dirty\n            },\n            setScale: noop,\n            setCategories: noop,\n            setTitle: noop\n        };\n\n        /**\n         * Augmented methods for the value axis\n         */\n        radialAxisMixin = {\n\n            /**\n             * The default options extend defaultYAxisOptions\n             */\n            defaultRadialGaugeOptions: {\n                labels: {\n                    align: 'center',\n                    x: 0,\n                    y: null // auto\n                },\n                minorGridLineWidth: 0,\n                minorTickInterval: 'auto',\n                minorTickLength: 10,\n                minorTickPosition: 'inside',\n                minorTickWidth: 1,\n                tickLength: 10,\n                tickPosition: 'inside',\n                tickWidth: 2,\n                title: {\n                    rotation: 0\n                },\n                zIndex: 2 // behind dials, points in the series group\n            },\n\n            // Circular axis around the perimeter of a polar chart\n            defaultRadialXOptions: {\n                gridLineWidth: 1, // spokes\n                labels: {\n                    align: null, // auto\n                    distance: 15,\n                    x: 0,\n                    y: null // auto\n                },\n                maxPadding: 0,\n                minPadding: 0,\n                showLastLabel: false,\n                tickLength: 0\n            },\n\n            // Radial axis, like a spoke in a polar chart\n            defaultRadialYOptions: {\n                gridLineInterpolation: 'circle',\n                labels: {\n                    align: 'right',\n                    x: -3,\n                    y: -2\n                },\n                showLastLabel: false,\n                title: {\n                    x: 4,\n                    text: null,\n                    rotation: 90\n                }\n            },\n\n            /**\n             * Merge and set options\n             */\n            setOptions: function(userOptions) {\n\n                var options = this.options = merge(\n                    this.defaultOptions,\n                    this.defaultRadialOptions,\n                    userOptions\n                );\n\n                // Make sure the plotBands array is instanciated for each Axis (#2649)\n                if (!options.plotBands) {\n                    options.plotBands = [];\n                }\n\n            },\n\n            /**\n             * Wrap the getOffset method to return zero offset for title or labels in a radial\n             * axis\n             */\n            getOffset: function() {\n                // Call the Axis prototype method (the method we're in now is on the instance)\n                axisProto.getOffset.call(this);\n\n                // Title or label offsets are not counted\n                this.chart.axisOffset[this.side] = 0;\n\n            },\n\n\n            /**\n             * Get the path for the axis line. This method is also referenced in the getPlotLinePath\n             * method.\n             */\n            getLinePath: function(lineWidth, radius) {\n                var center = this.center,\n                    end,\n                    chart = this.chart,\n                    r = pick(radius, center[2] / 2 - this.offset),\n                    path;\n\n                if (this.isCircular || radius !== undefined) {\n                    path = this.chart.renderer.symbols.arc(\n                        this.left + center[0],\n                        this.top + center[1],\n                        r,\n                        r, {\n                            start: this.startAngleRad,\n                            end: this.endAngleRad,\n                            open: true,\n                            innerR: 0\n                        }\n                    );\n                } else {\n                    end = this.postTranslate(this.angleRad, r);\n                    path = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];\n                }\n                return path;\n            },\n\n            /**\n             * Override setAxisTranslation by setting the translation to the difference\n             * in rotation. This allows the translate method to return angle for\n             * any given value.\n             */\n            setAxisTranslation: function() {\n\n                // Call uber method\n                axisProto.setAxisTranslation.call(this);\n\n                // Set transA and minPixelPadding\n                if (this.center) { // it's not defined the first time\n                    if (this.isCircular) {\n\n                        this.transA = (this.endAngleRad - this.startAngleRad) /\n                            ((this.max - this.min) || 1);\n\n\n                    } else {\n                        this.transA = (this.center[2] / 2) / ((this.max - this.min) || 1);\n                    }\n\n                    if (this.isXAxis) {\n                        this.minPixelPadding = this.transA * this.minPointOffset;\n                    } else {\n                        // This is a workaround for regression #2593, but categories still don't position correctly.\n                        this.minPixelPadding = 0;\n                    }\n                }\n            },\n\n            /**\n             * In case of auto connect, add one closestPointRange to the max value right before\n             * tickPositions are computed, so that ticks will extend passed the real max.\n             */\n            beforeSetTickPositions: function() {\n                // If autoConnect is true, polygonal grid lines are connected, and one closestPointRange\n                // is added to the X axis to prevent the last point from overlapping the first.\n                this.autoConnect = this.isCircular && pick(this.userMax, this.options.max) === undefined &&\n                    this.endAngleRad - this.startAngleRad === 2 * Math.PI;\n\n                if (this.autoConnect) {\n                    this.max += (this.categories && 1) || this.pointRange || this.closestPointRange || 0; // #1197, #2260\n                }\n            },\n\n            /**\n             * Override the setAxisSize method to use the arc's circumference as length. This\n             * allows tickPixelInterval to apply to pixel lengths along the perimeter\n             */\n            setAxisSize: function() {\n\n                axisProto.setAxisSize.call(this);\n\n                if (this.isRadial) {\n\n                    // Set the center array\n                    this.pane.updateCenter(this);\n\n                    // The sector is used in Axis.translate to compute the translation of reversed axis points (#2570)\n                    if (this.isCircular) {\n                        this.sector = this.endAngleRad - this.startAngleRad;\n                    }\n\n                    // Axis len is used to lay out the ticks\n                    this.len = this.width = this.height = this.center[2] * pick(this.sector, 1) / 2;\n\n\n                }\n            },\n\n            /**\n             * Returns the x, y coordinate of a point given by a value and a pixel distance\n             * from center\n             */\n            getPosition: function(value, length) {\n                return this.postTranslate(\n                    this.isCircular ? this.translate(value) : this.angleRad, // #2848\n                    pick(this.isCircular ? length : this.translate(value), this.center[2] / 2) - this.offset\n                );\n            },\n\n            /**\n             * Translate from intermediate plotX (angle), plotY (axis.len - radius) to final chart coordinates.\n             */\n            postTranslate: function(angle, radius) {\n\n                var chart = this.chart,\n                    center = this.center;\n\n                angle = this.startAngleRad + angle;\n\n                return {\n                    x: chart.plotLeft + center[0] + Math.cos(angle) * radius,\n                    y: chart.plotTop + center[1] + Math.sin(angle) * radius\n                };\n\n            },\n\n            /**\n             * Find the path for plot bands along the radial axis\n             */\n            getPlotBandPath: function(from, to, options) {\n                var center = this.center,\n                    startAngleRad = this.startAngleRad,\n                    fullRadius = center[2] / 2,\n                    radii = [\n                        pick(options.outerRadius, '100%'),\n                        options.innerRadius,\n                        pick(options.thickness, 10)\n                    ],\n                    offset = Math.min(this.offset, 0),\n                    percentRegex = /%$/,\n                    start,\n                    end,\n                    open,\n                    isCircular = this.isCircular, // X axis in a polar chart\n                    ret;\n\n                // Polygonal plot bands\n                if (this.options.gridLineInterpolation === 'polygon') {\n                    ret = this.getPlotLinePath(from).concat(this.getPlotLinePath(to, true));\n\n                    // Circular grid bands\n                } else {\n\n                    // Keep within bounds\n                    from = Math.max(from, this.min);\n                    to = Math.min(to, this.max);\n\n                    // Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from\n                    if (!isCircular) {\n                        radii[0] = this.translate(from);\n                        radii[1] = this.translate(to);\n                    }\n\n                    // Convert percentages to pixel values\n                    radii = map(radii, function(radius) {\n                        if (percentRegex.test(radius)) {\n                            radius = (pInt(radius, 10) * fullRadius) / 100;\n                        }\n                        return radius;\n                    });\n\n                    // Handle full circle\n                    if (options.shape === 'circle' || !isCircular) {\n                        start = -Math.PI / 2;\n                        end = Math.PI * 1.5;\n                        open = true;\n                    } else {\n                        start = startAngleRad + this.translate(from);\n                        end = startAngleRad + this.translate(to);\n                    }\n\n                    radii[0] -= offset; // #5283\n                    radii[2] -= offset; // #5283\n\n                    ret = this.chart.renderer.symbols.arc(\n                        this.left + center[0],\n                        this.top + center[1],\n                        radii[0],\n                        radii[0], {\n                            start: Math.min(start, end), // Math is for reversed yAxis (#3606)\n                            end: Math.max(start, end),\n                            innerR: pick(radii[1], radii[0] - radii[2]),\n                            open: open\n                        }\n                    );\n                }\n\n                return ret;\n            },\n\n            /**\n             * Find the path for plot lines perpendicular to the radial axis.\n             */\n            getPlotLinePath: function(value, reverse) {\n                var axis = this,\n                    center = axis.center,\n                    chart = axis.chart,\n                    end = axis.getPosition(value),\n                    xAxis,\n                    xy,\n                    tickPositions,\n                    ret;\n\n                // Spokes\n                if (axis.isCircular) {\n                    ret = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];\n\n                    // Concentric circles\n                } else if (axis.options.gridLineInterpolation === 'circle') {\n                    value = axis.translate(value);\n                    if (value) { // a value of 0 is in the center\n                        ret = axis.getLinePath(0, value);\n                    }\n                    // Concentric polygons\n                } else {\n                    // Find the X axis in the same pane\n                    each(chart.xAxis, function(a) {\n                        if (a.pane === axis.pane) {\n                            xAxis = a;\n                        }\n                    });\n                    ret = [];\n                    value = axis.translate(value);\n                    tickPositions = xAxis.tickPositions;\n                    if (xAxis.autoConnect) {\n                        tickPositions = tickPositions.concat([tickPositions[0]]);\n                    }\n                    // Reverse the positions for concatenation of polygonal plot bands\n                    if (reverse) {\n                        tickPositions = [].concat(tickPositions).reverse();\n                    }\n\n                    each(tickPositions, function(pos, i) {\n                        xy = xAxis.getPosition(pos, value);\n                        ret.push(i ? 'L' : 'M', xy.x, xy.y);\n                    });\n\n                }\n                return ret;\n            },\n\n            /**\n             * Find the position for the axis title, by default inside the gauge\n             */\n            getTitlePosition: function() {\n                var center = this.center,\n                    chart = this.chart,\n                    titleOptions = this.options.title;\n\n                return {\n                    x: chart.plotLeft + center[0] + (titleOptions.x || 0),\n                    y: chart.plotTop + center[1] - ({\n                            high: 0.5,\n                            middle: 0.25,\n                            low: 0\n                        }[titleOptions.align] *\n                        center[2]) + (titleOptions.y || 0)\n                };\n            }\n\n        };\n\n        /**\n         * Override axisProto.init to mix in special axis instance functions and function overrides\n         */\n        wrap(axisProto, 'init', function(proceed, chart, userOptions) {\n            var angular = chart.angular,\n                polar = chart.polar,\n                isX = userOptions.isX,\n                isHidden = angular && isX,\n                isCircular,\n                options,\n                chartOptions = chart.options,\n                paneIndex = userOptions.pane || 0,\n                pane = this.pane = chart.pane[paneIndex],\n                paneOptions = pane.options;\n\n            // Before prototype.init\n            if (angular) {\n                extend(this, isHidden ? hiddenAxisMixin : radialAxisMixin);\n                isCircular = !isX;\n                if (isCircular) {\n                    this.defaultRadialOptions = this.defaultRadialGaugeOptions;\n                }\n\n            } else if (polar) {\n                extend(this, radialAxisMixin);\n                isCircular = isX;\n                this.defaultRadialOptions = isX ? this.defaultRadialXOptions : merge(this.defaultYAxisOptions, this.defaultRadialYOptions);\n\n            }\n\n            // Disable certain features on angular and polar axes\n            if (angular || polar) {\n                this.isRadial = true;\n                chart.inverted = false;\n                chartOptions.chart.zoomType = null;\n            } else {\n                this.isRadial = false;\n            }\n\n            // A pointer back to this axis to borrow geometry\n            if (isCircular) {\n                pane.axis = this;\n            }\n\n            // Run prototype.init\n            proceed.call(this, chart, userOptions);\n\n            if (!isHidden && (angular || polar)) {\n                options = this.options;\n\n                // Start and end angle options are\n                // given in degrees relative to top, while internal computations are\n                // in radians relative to right (like SVG).\n                this.angleRad = (options.angle || 0) * Math.PI / 180; // Y axis in polar charts\n                this.startAngleRad = (paneOptions.startAngle - 90) * Math.PI / 180; // Gauges\n                this.endAngleRad = (pick(paneOptions.endAngle, paneOptions.startAngle + 360) - 90) * Math.PI / 180; // Gauges\n                this.offset = options.offset || 0;\n\n                this.isCircular = isCircular;\n\n            }\n\n        });\n\n        /**\n         * Wrap auto label align to avoid setting axis-wide rotation on radial axes (#4920)\n         * @param   {Function} proceed\n         * @returns {String} Alignment\n         */\n        wrap(axisProto, 'autoLabelAlign', function(proceed) {\n            if (!this.isRadial) {\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            } // else return undefined\n        });\n\n        /**\n         * Add special cases within the Tick class' methods for radial axes.\n         */\n        wrap(tickProto, 'getPosition', function(proceed, horiz, pos, tickmarkOffset, old) {\n            var axis = this.axis;\n\n            return axis.getPosition ?\n                axis.getPosition(pos) :\n                proceed.call(this, horiz, pos, tickmarkOffset, old);\n        });\n\n        /**\n         * Wrap the getLabelPosition function to find the center position of the label\n         * based on the distance option\n         */\n        wrap(tickProto, 'getLabelPosition', function(proceed, x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n            var axis = this.axis,\n                optionsY = labelOptions.y,\n                ret,\n                centerSlot = 20, // 20 degrees to each side at the top and bottom\n                align = labelOptions.align,\n                angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;\n\n            if (axis.isRadial) { // Both X and Y axes in a polar chart\n                ret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));\n\n                // Automatically rotated\n                if (labelOptions.rotation === 'auto') {\n                    label.attr({\n                        rotation: angle\n                    });\n\n                    // Vertically centered\n                } else if (optionsY === null) {\n                    optionsY = axis.chart.renderer.fontMetrics(label.styles.fontSize).b - label.getBBox().height / 2;\n                }\n\n                // Automatic alignment\n                if (align === null) {\n                    if (axis.isCircular) { // Y axis\n                        if (this.label.getBBox().width > axis.len * axis.tickInterval / (axis.max - axis.min)) { // #3506\n                            centerSlot = 0;\n                        }\n                        if (angle > centerSlot && angle < 180 - centerSlot) {\n                            align = 'left'; // right hemisphere\n                        } else if (angle > 180 + centerSlot && angle < 360 - centerSlot) {\n                            align = 'right'; // left hemisphere\n                        } else {\n                            align = 'center'; // top or bottom\n                        }\n                    } else {\n                        align = 'center';\n                    }\n                    label.attr({\n                        align: align\n                    });\n                }\n\n                ret.x += labelOptions.x;\n                ret.y += optionsY;\n\n            } else {\n                ret = proceed.call(this, x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n            }\n            return ret;\n        });\n\n        /**\n         * Wrap the getMarkPath function to return the path of the radial marker\n         */\n        wrap(tickProto, 'getMarkPath', function(proceed, x, y, tickLength, tickWidth, horiz, renderer) {\n            var axis = this.axis,\n                endPoint,\n                ret;\n\n            if (axis.isRadial) {\n                endPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);\n                ret = [\n                    'M',\n                    x,\n                    y,\n                    'L',\n                    endPoint.x,\n                    endPoint.y\n                ];\n            } else {\n                ret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);\n            }\n            return ret;\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            noop = H.noop,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n        /* \n         * The arearangeseries series type\n         */\n        seriesType('arearange', 'area', {\n\n            lineWidth: 1,\n\n            marker: null,\n            threshold: null,\n            tooltip: {\n\n                pointFormat: '<span style=\"color:{series.color}\">\\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>' // eslint-disable-line no-dupe-keys\n\n            },\n            trackByArea: true,\n            dataLabels: {\n                align: null,\n                verticalAlign: null,\n                xLow: 0,\n                xHigh: 0,\n                yLow: 0,\n                yHigh: 0\n            },\n            states: {\n                hover: {\n                    halo: false\n                }\n            }\n\n            // Prototype members\n        }, {\n            pointArrayMap: ['low', 'high'],\n            dataLabelCollections: ['dataLabel', 'dataLabelUpper'],\n            toYData: function(point) {\n                return [point.low, point.high];\n            },\n            pointValKey: 'low',\n            deferTranslatePolar: true,\n\n            /**\n             * Translate a point's plotHigh from the internal angle and radius measures to\n             * true plotHigh coordinates. This is an addition of the toXY method found in\n             * Polar.js, because it runs too early for arearanges to be considered (#3419).\n             */\n            highToXY: function(point) {\n                // Find the polar plotX and plotY\n                var chart = this.chart,\n                    xy = this.xAxis.postTranslate(point.rectPlotX, this.yAxis.len - point.plotHigh);\n                point.plotHighX = xy.x - chart.plotLeft;\n                point.plotHigh = xy.y - chart.plotTop;\n            },\n\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    hasModifyValue = !!series.modifyValue;\n\n                seriesTypes.area.prototype.translate.apply(series);\n\n                // Set plotLow and plotHigh\n                each(series.points, function(point) {\n\n                    var low = point.low,\n                        high = point.high,\n                        plotY = point.plotY;\n\n                    if (high === null || low === null) {\n                        point.isNull = true;\n                    } else {\n                        point.plotLow = plotY;\n                        point.plotHigh = yAxis.translate(\n                            hasModifyValue ? series.modifyValue(high, point) : high,\n                            0,\n                            1,\n                            0,\n                            1\n                        );\n                        if (hasModifyValue) {\n                            point.yBottom = point.plotHigh;\n                        }\n                    }\n                });\n\n                // Postprocess plotHigh\n                if (this.chart.polar) {\n                    each(this.points, function(point) {\n                        series.highToXY(point);\n                    });\n                }\n            },\n\n            /**\n             * Extend the line series' getSegmentPath method by applying the segment\n             * path to both lower and higher values of the range\n             */\n            getGraphPath: function(points) {\n\n                var highPoints = [],\n                    highAreaPoints = [],\n                    i,\n                    getGraphPath = seriesTypes.area.prototype.getGraphPath,\n                    point,\n                    pointShim,\n                    linePath,\n                    lowerPath,\n                    options = this.options,\n                    connectEnds = this.chart.polar && options.connectEnds !== false,\n                    connectNulls = options.connectNulls,\n                    step = options.step,\n                    higherPath,\n                    higherAreaPath;\n\n                points = points || this.points;\n                i = points.length;\n\n                // Create the top line and the top part of the area fill. The area fill compensates for \n                // null points by drawing down to the lower graph, moving across the null gap and \n                // starting again at the lower graph.\n                i = points.length;\n                while (i--) {\n                    point = points[i];\n\n                    if (!point.isNull &&\n                        !connectEnds &&\n                        !connectNulls &&\n                        (!points[i + 1] || points[i + 1].isNull)\n                    ) {\n                        highAreaPoints.push({\n                            plotX: point.plotX,\n                            plotY: point.plotY,\n                            doCurve: false // #5186, gaps in areasplinerange fill\n                        });\n                    }\n\n                    pointShim = {\n                        polarPlotY: point.polarPlotY,\n                        rectPlotX: point.rectPlotX,\n                        yBottom: point.yBottom,\n                        plotX: pick(point.plotHighX, point.plotX), // plotHighX is for polar charts\n                        plotY: point.plotHigh,\n                        isNull: point.isNull\n                    };\n\n                    highAreaPoints.push(pointShim);\n\n                    highPoints.push(pointShim);\n\n                    if (!point.isNull &&\n                        !connectEnds &&\n                        !connectNulls &&\n                        (!points[i - 1] || points[i - 1].isNull)\n                    ) {\n                        highAreaPoints.push({\n                            plotX: point.plotX,\n                            plotY: point.plotY,\n                            doCurve: false // #5186, gaps in areasplinerange fill\n                        });\n                    }\n                }\n\n                // Get the paths\n                lowerPath = getGraphPath.call(this, points);\n                if (step) {\n                    if (step === true) {\n                        step = 'left';\n                    }\n                    options.step = {\n                        left: 'right',\n                        center: 'center',\n                        right: 'left'\n                    }[step]; // swap for reading in getGraphPath\n                }\n                higherPath = getGraphPath.call(this, highPoints);\n                higherAreaPath = getGraphPath.call(this, highAreaPoints);\n                options.step = step;\n\n                // Create a line on both top and bottom of the range\n                linePath = [].concat(lowerPath, higherPath);\n\n                // For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'\n                if (!this.chart.polar && higherAreaPath[0] === 'M') {\n                    higherAreaPath[0] = 'L'; // this probably doesn't work for spline\t\t\t\n                }\n\n                this.graphPath = linePath;\n                this.areaPath = this.areaPath.concat(lowerPath, higherAreaPath);\n\n                // Prepare for sideways animation\n                linePath.isArea = true;\n                linePath.xMap = lowerPath.xMap;\n                this.areaPath.xMap = lowerPath.xMap;\n\n                return linePath;\n            },\n\n            /**\n             * Extend the basic drawDataLabels method by running it for both lower and higher\n             * values.\n             */\n            drawDataLabels: function() {\n\n                var data = this.data,\n                    length = data.length,\n                    i,\n                    originalDataLabels = [],\n                    seriesProto = Series.prototype,\n                    dataLabelOptions = this.options.dataLabels,\n                    align = dataLabelOptions.align,\n                    verticalAlign = dataLabelOptions.verticalAlign,\n                    inside = dataLabelOptions.inside,\n                    point,\n                    up,\n                    inverted = this.chart.inverted;\n\n                if (dataLabelOptions.enabled || this._hasPointLabels) {\n\n                    // Step 1: set preliminary values for plotY and dataLabel and draw the upper labels\n                    i = length;\n                    while (i--) {\n                        point = data[i];\n                        if (point) {\n                            up = inside ? point.plotHigh < point.plotLow : point.plotHigh > point.plotLow;\n\n                            // Set preliminary values\n                            point.y = point.high;\n                            point._plotY = point.plotY;\n                            point.plotY = point.plotHigh;\n\n                            // Store original data labels and set preliminary label objects to be picked up\n                            // in the uber method\n                            originalDataLabels[i] = point.dataLabel;\n                            point.dataLabel = point.dataLabelUpper;\n\n                            // Set the default offset\n                            point.below = up;\n                            if (inverted) {\n                                if (!align) {\n                                    dataLabelOptions.align = up ? 'right' : 'left';\n                                }\n                            } else {\n                                if (!verticalAlign) {\n                                    dataLabelOptions.verticalAlign = up ? 'top' : 'bottom';\n                                }\n                            }\n\n                            dataLabelOptions.x = dataLabelOptions.xHigh;\n                            dataLabelOptions.y = dataLabelOptions.yHigh;\n                        }\n                    }\n\n                    if (seriesProto.drawDataLabels) {\n                        seriesProto.drawDataLabels.apply(this, arguments); // #1209\n                    }\n\n                    // Step 2: reorganize and handle data labels for the lower values\n                    i = length;\n                    while (i--) {\n                        point = data[i];\n                        if (point) {\n                            up = inside ? point.plotHigh < point.plotLow : point.plotHigh > point.plotLow;\n\n                            // Move the generated labels from step 1, and reassign the original data labels\n                            point.dataLabelUpper = point.dataLabel;\n                            point.dataLabel = originalDataLabels[i];\n\n                            // Reset values\n                            point.y = point.low;\n                            point.plotY = point._plotY;\n\n                            // Set the default offset\n                            point.below = !up;\n                            if (inverted) {\n                                if (!align) {\n                                    dataLabelOptions.align = up ? 'left' : 'right';\n                                }\n                            } else {\n                                if (!verticalAlign) {\n                                    dataLabelOptions.verticalAlign = up ? 'bottom' : 'top';\n                                }\n\n                            }\n\n                            dataLabelOptions.x = dataLabelOptions.xLow;\n                            dataLabelOptions.y = dataLabelOptions.yLow;\n                        }\n                    }\n                    if (seriesProto.drawDataLabels) {\n                        seriesProto.drawDataLabels.apply(this, arguments);\n                    }\n                }\n\n                dataLabelOptions.align = align;\n                dataLabelOptions.verticalAlign = verticalAlign;\n            },\n\n            alignDataLabel: function() {\n                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);\n            },\n\n            setStackedPoints: noop,\n\n            getSymbol: noop,\n\n            drawPoints: noop\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The areasplinerange series type\n         */\n        seriesType('areasplinerange', 'arearange', null, {\n            getPointSpline: seriesTypes.spline.prototype.getPointSpline\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var defaultPlotOptions = H.defaultPlotOptions,\n            each = H.each,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        var colProto = seriesTypes.column.prototype;\n\n        /**\n         * The ColumnRangeSeries class\n         */\n        seriesType('columnrange', 'arearange', merge(defaultPlotOptions.column, defaultPlotOptions.arearange, {\n            lineWidth: 1,\n            pointRange: null\n\n            // Prototype members\n        }), {\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    xAxis = series.xAxis,\n                    startAngleRad = xAxis.startAngleRad,\n                    start,\n                    chart = series.chart,\n                    isRadial = series.xAxis.isRadial,\n                    plotHigh;\n\n                colProto.translate.apply(series);\n\n                // Set plotLow and plotHigh\n                each(series.points, function(point) {\n                    var shapeArgs = point.shapeArgs,\n                        minPointLength = series.options.minPointLength,\n                        heightDifference,\n                        height,\n                        y;\n\n                    point.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);\n                    point.plotLow = point.plotY;\n\n                    // adjust shape\n                    y = plotHigh;\n                    height = pick(point.rectPlotY, point.plotY) - plotHigh;\n\n                    // Adjust for minPointLength\n                    if (Math.abs(height) < minPointLength) {\n                        heightDifference = (minPointLength - height);\n                        height += heightDifference;\n                        y -= heightDifference / 2;\n\n                        // Adjust for negative ranges or reversed Y axis (#1457)\n                    } else if (height < 0) {\n                        height *= -1;\n                        y -= height;\n                    }\n\n                    if (isRadial) {\n\n                        start = point.barX + startAngleRad;\n                        point.shapeType = 'path';\n                        point.shapeArgs = {\n                            d: series.polarArc(y + height, y, start, start + point.pointWidth)\n                        };\n                    } else {\n                        shapeArgs.height = height;\n                        shapeArgs.y = y;\n\n                        point.tooltipPos = chart.inverted ? [\n                            yAxis.len + yAxis.pos - chart.plotLeft - y - height / 2,\n                            xAxis.len + xAxis.pos - chart.plotTop - shapeArgs.x -\n                            shapeArgs.width / 2,\n                            height\n                        ] : [\n                            xAxis.left - chart.plotLeft + shapeArgs.x +\n                            shapeArgs.width / 2,\n                            yAxis.pos - chart.plotTop + y + height / 2,\n                            height\n                        ]; // don't inherit from column tooltip position - #3372\n                    }\n                });\n            },\n            directTouch: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            drawGraph: noop,\n            crispCol: colProto.crispCol,\n            drawPoints: colProto.drawPoints,\n            drawTracker: colProto.drawTracker,\n            getColumnMetrics: colProto.getColumnMetrics,\n            animate: function() {\n                return colProto.animate.apply(this, arguments);\n            },\n            polarArc: function() {\n                return colProto.polarArc.apply(this, arguments);\n            },\n            pointAttribs: colProto.pointAttribs\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            TrackerMixin = H.TrackerMixin;\n        /* \n         * The GaugeSeries class\n         */\n        seriesType('gauge', 'line', {\n            dataLabels: {\n                enabled: true,\n                defer: false,\n                y: 15,\n                borderRadius: 3,\n                crop: false,\n                verticalAlign: 'top',\n                zIndex: 2,\n\n                // Presentational\n                borderWidth: 1,\n                borderColor: '#cccccc'\n\n            },\n            dial: {\n                // radius: '80%',\n                // baseWidth: 3,\n                // topWidth: 1,\n                // baseLength: '70%' // of radius\n                // rearLength: '10%'\n\n                // backgroundColor: '#000000',\n                // borderColor: '#cccccc',\n                // borderWidth: 0\n\n\n            },\n            pivot: {\n                //radius: 5,\n\n                //borderWidth: 0\n                //borderColor: '#cccccc',\n                //backgroundColor: '#000000'\n\n            },\n            tooltip: {\n                headerFormat: ''\n            },\n            showInLegend: false\n\n            // Prototype members\n        }, {\n            // chart.angular will be set to true when a gauge series is present, and this will\n            // be used on the axes\n            angular: true,\n            directTouch: true, // #5063\n            drawGraph: noop,\n            fixedBox: true,\n            forceDL: true,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n\n            /**\n             * Calculate paths etc\n             */\n            translate: function() {\n\n                var series = this,\n                    yAxis = series.yAxis,\n                    options = series.options,\n                    center = yAxis.center;\n\n                series.generatePoints();\n\n                each(series.points, function(point) {\n\n                    var dialOptions = merge(options.dial, point.dial),\n                        radius = (pInt(pick(dialOptions.radius, 80)) * center[2]) / 200,\n                        baseLength = (pInt(pick(dialOptions.baseLength, 70)) * radius) / 100,\n                        rearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,\n                        baseWidth = dialOptions.baseWidth || 3,\n                        topWidth = dialOptions.topWidth || 1,\n                        overshoot = options.overshoot,\n                        rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);\n\n                    // Handle the wrap and overshoot options\n                    if (isNumber(overshoot)) {\n                        overshoot = overshoot / 180 * Math.PI;\n                        rotation = Math.max(yAxis.startAngleRad - overshoot, Math.min(yAxis.endAngleRad + overshoot, rotation));\n\n                    } else if (options.wrap === false) {\n                        rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));\n                    }\n\n                    rotation = rotation * 180 / Math.PI;\n\n                    point.shapeType = 'path';\n                    point.shapeArgs = {\n                        d: dialOptions.path || [\n                            'M', -rearLength, -baseWidth / 2,\n                            'L',\n                            baseLength, -baseWidth / 2,\n                            radius, -topWidth / 2,\n                            radius, topWidth / 2,\n                            baseLength, baseWidth / 2, -rearLength, baseWidth / 2,\n                            'z'\n                        ],\n                        translateX: center[0],\n                        translateY: center[1],\n                        rotation: rotation\n                    };\n\n                    // Positions for data label\n                    point.plotX = center[0];\n                    point.plotY = center[1];\n                });\n            },\n\n            /**\n             * Draw the points where each point is one needle\n             */\n            drawPoints: function() {\n\n                var series = this,\n                    center = series.yAxis.center,\n                    pivot = series.pivot,\n                    options = series.options,\n                    pivotOptions = options.pivot,\n                    renderer = series.chart.renderer;\n\n                each(series.points, function(point) {\n\n                    var graphic = point.graphic,\n                        shapeArgs = point.shapeArgs,\n                        d = shapeArgs.d,\n                        dialOptions = merge(options.dial, point.dial); // #1233\n\n                    if (graphic) {\n                        graphic.animate(shapeArgs);\n                        shapeArgs.d = d; // animate alters it\n                    } else {\n                        point.graphic = renderer[point.shapeType](shapeArgs)\n                            .attr({\n                                rotation: shapeArgs.rotation, // required by VML when animation is false\n                                zIndex: 1\n                            })\n                            .addClass('highcharts-dial')\n                            .add(series.group);\n\n\n                        // Presentational attributes\n                        point.graphic.attr({\n                            stroke: dialOptions.borderColor || 'none',\n                            'stroke-width': dialOptions.borderWidth || 0,\n                            fill: dialOptions.backgroundColor || '#000000'\n                        });\n\n                    }\n                });\n\n                // Add or move the pivot\n                if (pivot) {\n                    pivot.animate({ // #1235\n                        translateX: center[0],\n                        translateY: center[1]\n                    });\n                } else {\n                    series.pivot = renderer.circle(0, 0, pick(pivotOptions.radius, 5))\n                        .attr({\n                            zIndex: 2\n                        })\n                        .addClass('highcharts-pivot')\n                        .translate(center[0], center[1])\n                        .add(series.group);\n\n\n                    // Presentational attributes\n                    series.pivot.attr({\n                        'stroke-width': pivotOptions.borderWidth || 0,\n                        stroke: pivotOptions.borderColor || '#cccccc',\n                        fill: pivotOptions.backgroundColor || '#000000'\n                    });\n\n                }\n            },\n\n            /**\n             * Animate the arrow up from startAngle\n             */\n            animate: function(init) {\n                var series = this;\n\n                if (!init) {\n                    each(series.points, function(point) {\n                        var graphic = point.graphic;\n\n                        if (graphic) {\n                            // start value\n                            graphic.attr({\n                                rotation: series.yAxis.startAngleRad * 180 / Math.PI\n                            });\n\n                            // animate\n                            graphic.animate({\n                                rotation: point.shapeArgs.rotation\n                            }, series.options.animation);\n                        }\n                    });\n\n                    // delete this function to allow it only once\n                    series.animate = null;\n                }\n            },\n\n            render: function() {\n                this.group = this.plotGroup(\n                    'group',\n                    'series',\n                    this.visible ? 'visible' : 'hidden',\n                    this.options.zIndex,\n                    this.chart.seriesGroup\n                );\n                Series.prototype.render.call(this);\n                this.group.clip(this.chart.clipRect);\n            },\n\n            /**\n             * Extend the basic setData method by running processData and generatePoints immediately,\n             * in order to access the points from the legend.\n             */\n            setData: function(data, redraw) {\n                Series.prototype.setData.call(this, data, false);\n                this.processData();\n                this.generatePoints();\n                if (pick(redraw, true)) {\n                    this.chart.redraw();\n                }\n            },\n\n            /**\n             * If the tracking module is loaded, add the point tracker\n             */\n            drawTracker: TrackerMixin && TrackerMixin.drawTrackerPoint\n\n            // Point members\n        }, {\n            /**\n             * Don't do any hover colors or anything\n             */\n            setState: function(state) {\n                this.state = state;\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            noop = H.noop,\n            pick = H.pick,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The boxplot series type.\n         *\n         * @constructor seriesTypes.boxplot\n         * @augments seriesTypes.column\n         */\n        seriesType('boxplot', 'column', {\n            threshold: null,\n            tooltip: {\n\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> <b> {series.name}</b><br/>' + // eslint-disable-line no-dupe-keys\n                    'Maximum: {point.high}<br/>' +\n                    'Upper quartile: {point.q3}<br/>' +\n                    'Median: {point.median}<br/>' +\n                    'Lower quartile: {point.q1}<br/>' +\n                    'Minimum: {point.low}<br/>'\n\n            },\n            whiskerLength: '50%',\n\n            fillColor: '#ffffff',\n            lineWidth: 1,\n            //medianColor: null,\n            medianWidth: 2,\n            states: {\n                hover: {\n                    brightness: -0.3\n                }\n            },\n            //stemColor: null,\n            //stemDashStyle: 'solid'\n            //stemWidth: null,\n\n            //whiskerColor: null,\n            whiskerWidth: 2\n\n\n        }, /** @lends seriesTypes.boxplot */ {\n            pointArrayMap: ['low', 'q1', 'median', 'q3', 'high'], // array point configs are mapped to this\n            toYData: function(point) { // return a plain array for speedy calculation\n                return [point.low, point.q1, point.median, point.q3, point.high];\n            },\n            pointValKey: 'high', // defines the top of the tracker\n\n\n            /**\n             * Get presentational attributes\n             */\n            pointAttribs: function(point) {\n                var options = this.options,\n                    color = (point && point.color) || this.color;\n\n                return {\n                    'fill': point.fillColor || options.fillColor || color,\n                    'stroke': options.lineColor || color,\n                    'stroke-width': options.lineWidth || 0\n                };\n            },\n\n\n            /**\n             * Disable data labels for box plot\n             */\n            drawDataLabels: noop,\n\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    pointArrayMap = series.pointArrayMap;\n\n                seriesTypes.column.prototype.translate.apply(series);\n\n                // do the translation on each point dimension\n                each(series.points, function(point) {\n                    each(pointArrayMap, function(key) {\n                        if (point[key] !== null) {\n                            point[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);\n                        }\n                    });\n                });\n            },\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this, //state = series.state,\n                    points = series.points,\n                    options = series.options,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    q1Plot,\n                    q3Plot,\n                    highPlot,\n                    lowPlot,\n                    medianPlot,\n                    medianPath,\n                    crispCorr,\n                    crispX = 0,\n                    boxPath,\n                    width,\n                    left,\n                    right,\n                    halfWidth,\n                    doQuartiles = series.doQuartiles !== false, // error bar inherits this series type but doesn't do quartiles\n                    pointWiskerLength,\n                    whiskerLength = series.options.whiskerLength;\n\n\n                each(points, function(point) {\n\n                    var graphic = point.graphic,\n                        verb = graphic ? 'animate' : 'attr',\n                        shapeArgs = point.shapeArgs; // the box\n\n\n                    var boxAttr,\n                        stemAttr = {},\n                        whiskersAttr = {},\n                        medianAttr = {},\n                        color = point.color || series.color;\n\n\n                    if (point.plotY !== undefined) {\n\n                        // crisp vector coordinates\n                        width = shapeArgs.width;\n                        left = Math.floor(shapeArgs.x);\n                        right = left + width;\n                        halfWidth = Math.round(width / 2);\n                        q1Plot = Math.floor(doQuartiles ? point.q1Plot : point.lowPlot);\n                        q3Plot = Math.floor(doQuartiles ? point.q3Plot : point.lowPlot);\n                        highPlot = Math.floor(point.highPlot);\n                        lowPlot = Math.floor(point.lowPlot);\n\n                        if (!graphic) {\n                            point.graphic = graphic = renderer.g('point')\n                                .add(series.group);\n\n                            point.stem = renderer.path()\n                                .addClass('highcharts-boxplot-stem')\n                                .add(graphic);\n\n                            if (whiskerLength) {\n                                point.whiskers = renderer.path()\n                                    .addClass('highcharts-boxplot-whisker')\n                                    .add(graphic);\n                            }\n                            if (doQuartiles) {\n                                point.box = renderer.path(boxPath)\n                                    .addClass('highcharts-boxplot-box')\n                                    .add(graphic);\n                            }\n                            point.medianShape = renderer.path(medianPath)\n                                .addClass('highcharts-boxplot-median')\n                                .add(graphic);\n                        }\n\n\n\n\n\n\n                        // Stem attributes\n                        stemAttr.stroke = point.stemColor || options.stemColor || color;\n                        stemAttr['stroke-width'] = pick(point.stemWidth, options.stemWidth, options.lineWidth);\n                        stemAttr.dashstyle = point.stemDashStyle || options.stemDashStyle;\n                        point.stem.attr(stemAttr);\n\n                        // Whiskers attributes\n                        if (whiskerLength) {\n                            whiskersAttr.stroke = point.whiskerColor || options.whiskerColor || color;\n                            whiskersAttr['stroke-width'] = pick(point.whiskerWidth, options.whiskerWidth, options.lineWidth);\n                            point.whiskers.attr(whiskersAttr);\n                        }\n\n                        if (doQuartiles) {\n                            boxAttr = series.pointAttribs(point);\n                            point.box.attr(boxAttr);\n                        }\n\n\n                        // Median attributes\n                        medianAttr.stroke = point.medianColor || options.medianColor || color;\n                        medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);\n                        point.medianShape.attr(medianAttr);\n\n\n\n\n\n                        // The stem\n                        crispCorr = (point.stem.strokeWidth() % 2) / 2;\n                        crispX = left + halfWidth + crispCorr;\n                        point.stem[verb]({\n                            d: [\n                                // stem up\n                                'M',\n                                crispX, q3Plot,\n                                'L',\n                                crispX, highPlot,\n\n                                // stem down\n                                'M',\n                                crispX, q1Plot,\n                                'L',\n                                crispX, lowPlot\n                            ]\n                        });\n\n                        // The box\n                        if (doQuartiles) {\n                            crispCorr = (point.box.strokeWidth() % 2) / 2;\n                            q1Plot = Math.floor(q1Plot) + crispCorr;\n                            q3Plot = Math.floor(q3Plot) + crispCorr;\n                            left += crispCorr;\n                            right += crispCorr;\n                            point.box[verb]({\n                                d: [\n                                    'M',\n                                    left, q3Plot,\n                                    'L',\n                                    left, q1Plot,\n                                    'L',\n                                    right, q1Plot,\n                                    'L',\n                                    right, q3Plot,\n                                    'L',\n                                    left, q3Plot,\n                                    'z'\n                                ]\n                            });\n                        }\n\n                        // The whiskers\n                        if (whiskerLength) {\n                            crispCorr = (point.whiskers.strokeWidth() % 2) / 2;\n                            highPlot = highPlot + crispCorr;\n                            lowPlot = lowPlot + crispCorr;\n                            pointWiskerLength = (/%$/).test(whiskerLength) ? halfWidth * parseFloat(whiskerLength) / 100 : whiskerLength / 2;\n                            point.whiskers[verb]({\n                                d: [\n                                    // High whisker\n                                    'M',\n                                    crispX - pointWiskerLength,\n                                    highPlot,\n                                    'L',\n                                    crispX + pointWiskerLength,\n                                    highPlot,\n\n                                    // Low whisker\n                                    'M',\n                                    crispX - pointWiskerLength,\n                                    lowPlot,\n                                    'L',\n                                    crispX + pointWiskerLength,\n                                    lowPlot\n                                ]\n                            });\n                        }\n\n                        // The median\n                        medianPlot = Math.round(point.medianPlot);\n                        crispCorr = (point.medianShape.strokeWidth() % 2) / 2;\n                        medianPlot = medianPlot + crispCorr;\n\n                        point.medianShape[verb]({\n                            d: [\n                                'M',\n                                left,\n                                medianPlot,\n                                'L',\n                                right,\n                                medianPlot\n                            ]\n                        });\n                    }\n                });\n\n            },\n            setStackedPoints: noop // #3890\n\n\n        });\n\n        /* ****************************************************************************\n         * End Box plot series code\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            noop = H.noop,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n\n        /* ****************************************************************************\n         * Start error bar series code                                                *\n         *****************************************************************************/\n        seriesType('errorbar', 'boxplot', {\n\n            color: '#000000',\n\n            grouping: false,\n            linkedTo: ':previous',\n            tooltip: {\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'\n            },\n            whiskerWidth: null\n\n            // Prototype members\n        }, {\n            type: 'errorbar',\n            pointArrayMap: ['low', 'high'], // array point configs are mapped to this\n            toYData: function(point) { // return a plain array for speedy calculation\n                return [point.low, point.high];\n            },\n            pointValKey: 'high', // defines the top of the tracker\n            doQuartiles: false,\n            drawDataLabels: seriesTypes.arearange ? function() {\n                var valKey = this.pointValKey;\n                seriesTypes.arearange.prototype.drawDataLabels.call(this);\n                // Arearange drawDataLabels does not reset point.y to high, but to low after drawing. #4133 \n                each(this.data, function(point) {\n                    point.y = point[valKey];\n                });\n            } : noop,\n\n            /**\n             * Get the width and X offset, either on top of the linked series column\n             * or standalone\n             */\n            getColumnMetrics: function() {\n                return (this.linkedParent && this.linkedParent.columnMetrics) ||\n                    seriesTypes.column.prototype.getColumnMetrics.call(this);\n            }\n        });\n\n        /* ****************************************************************************\n         * End error bar series code                                                  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var correctFloat = H.correctFloat,\n            isNumber = H.isNumber,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /* ****************************************************************************\n         * Start Waterfall series code                                                *\n         *****************************************************************************/\n        seriesType('waterfall', 'column', {\n            dataLabels: {\n                inside: true\n            },\n\n            lineWidth: 1,\n            lineColor: '#333333',\n            dashStyle: 'dot',\n            borderColor: '#333333',\n            states: {\n                hover: {\n                    lineWidthPlus: 0 // #3126\n                }\n            }\n\n\n            // Prototype members\n        }, {\n            pointValKey: 'y',\n\n            /**\n             * Translate data points from raw values\n             */\n            translate: function() {\n                var series = this,\n                    options = series.options,\n                    yAxis = series.yAxis,\n                    len,\n                    i,\n                    points,\n                    point,\n                    shapeArgs,\n                    stack,\n                    y,\n                    yValue,\n                    previousY,\n                    previousIntermediate,\n                    range,\n                    minPointLength = pick(options.minPointLength, 5),\n                    halfMinPointLength = minPointLength / 2,\n                    threshold = options.threshold,\n                    stacking = options.stacking,\n                    stackIndicator,\n                    tooltipY;\n\n                // run column series translate\n                seriesTypes.column.prototype.translate.apply(series);\n\n                previousY = previousIntermediate = threshold;\n                points = series.points;\n\n                for (i = 0, len = points.length; i < len; i++) {\n                    // cache current point object\n                    point = points[i];\n                    yValue = series.processedYData[i];\n                    shapeArgs = point.shapeArgs;\n\n                    // get current stack\n                    stack = stacking && yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey];\n                    stackIndicator = series.getStackIndicator(\n                        stackIndicator,\n                        point.x,\n                        series.index\n                    );\n                    range = stack ?\n                        stack[point.x].points[stackIndicator.key] : [0, yValue];\n\n                    // override point value for sums\n                    // #3710 Update point does not propagate to sum\n                    if (point.isSum) {\n                        point.y = correctFloat(yValue);\n                    } else if (point.isIntermediateSum) {\n                        point.y = correctFloat(yValue - previousIntermediate); // #3840\n                    }\n                    // up points\n                    y = Math.max(previousY, previousY + point.y) + range[0];\n                    shapeArgs.y = yAxis.translate(y, 0, 1, 0, 1);\n\n                    // sum points\n                    if (point.isSum) {\n                        shapeArgs.y = yAxis.translate(range[1], 0, 1, 0, 1);\n                        shapeArgs.height = Math.min(yAxis.translate(range[0], 0, 1, 0, 1), yAxis.len) -\n                            shapeArgs.y; // #4256\n\n                    } else if (point.isIntermediateSum) {\n                        shapeArgs.y = yAxis.translate(range[1], 0, 1, 0, 1);\n                        shapeArgs.height = Math.min(yAxis.translate(previousIntermediate, 0, 1, 0, 1), yAxis.len) -\n                            shapeArgs.y;\n                        previousIntermediate = range[1];\n\n                        // If it's not the sum point, update previous stack end position and get\n                        // shape height (#3886)\n                    } else {\n                        shapeArgs.height = yValue > 0 ?\n                            yAxis.translate(previousY, 0, 1, 0, 1) - shapeArgs.y :\n                            yAxis.translate(previousY, 0, 1, 0, 1) - yAxis.translate(previousY - yValue, 0, 1, 0, 1);\n\n                        previousY += stack && stack[point.x] ? stack[point.x].total : yValue;\n                    }\n\n                    // #3952 Negative sum or intermediate sum not rendered correctly\n                    if (shapeArgs.height < 0) {\n                        shapeArgs.y += shapeArgs.height;\n                        shapeArgs.height *= -1;\n                    }\n\n                    point.plotY = shapeArgs.y = Math.round(shapeArgs.y) - (series.borderWidth % 2) / 2;\n                    shapeArgs.height = Math.max(Math.round(shapeArgs.height), 0.001); // #3151\n                    point.yBottom = shapeArgs.y + shapeArgs.height;\n\n                    if (shapeArgs.height <= minPointLength && !point.isNull) {\n                        shapeArgs.height = minPointLength;\n                        shapeArgs.y -= halfMinPointLength;\n                        point.plotY = shapeArgs.y;\n                        if (point.y < 0) {\n                            point.minPointLengthOffset = -halfMinPointLength;\n                        } else {\n                            point.minPointLengthOffset = halfMinPointLength;\n                        }\n                    } else {\n                        point.minPointLengthOffset = 0;\n                    }\n\n                    // Correct tooltip placement (#3014)\n                    tooltipY = point.plotY + (point.negative ? shapeArgs.height : 0);\n\n                    if (series.chart.inverted) {\n                        point.tooltipPos[0] = yAxis.len - tooltipY;\n                    } else {\n                        point.tooltipPos[1] = tooltipY;\n                    }\n                }\n            },\n\n            /**\n             * Call default processData then override yData to reflect waterfall's extremes on yAxis\n             */\n            processData: function(force) {\n                var series = this,\n                    options = series.options,\n                    yData = series.yData,\n                    points = series.options.data, // #3710 Update point does not propagate to sum\n                    point,\n                    dataLength = yData.length,\n                    threshold = options.threshold || 0,\n                    subSum,\n                    sum,\n                    dataMin,\n                    dataMax,\n                    y,\n                    i;\n\n                sum = subSum = dataMin = dataMax = threshold;\n\n                for (i = 0; i < dataLength; i++) {\n                    y = yData[i];\n                    point = points && points[i] ? points[i] : {};\n\n                    if (y === 'sum' || point.isSum) {\n                        yData[i] = correctFloat(sum);\n                    } else if (y === 'intermediateSum' || point.isIntermediateSum) {\n                        yData[i] = correctFloat(subSum);\n                    } else {\n                        sum += y;\n                        subSum += y;\n                    }\n                    dataMin = Math.min(sum, dataMin);\n                    dataMax = Math.max(sum, dataMax);\n                }\n\n                Series.prototype.processData.call(this, force);\n\n                // Record extremes only if stacking was not set:\n                if (!series.options.stacking) {\n                    series.dataMin = dataMin;\n                    series.dataMax = dataMax;\n                }\n            },\n\n            /**\n             * Return y value or string if point is sum\n             */\n            toYData: function(pt) {\n                if (pt.isSum) {\n                    return (pt.x === 0 ? null : 'sum'); //#3245 Error when first element is Sum or Intermediate Sum\n                }\n                if (pt.isIntermediateSum) {\n                    return (pt.x === 0 ? null : 'intermediateSum'); //#3245\n                }\n                return pt.y;\n            },\n\n\n            /**\n             * Postprocess mapping between options and SVG attributes\n             */\n            pointAttribs: function(point, state) {\n\n                var upColor = this.options.upColor,\n                    attr;\n\n                // Set or reset up color (#3710, update to negative)\n                if (upColor && !point.options.color) {\n                    point.color = point.y > 0 ? upColor : null;\n                }\n\n                attr = seriesTypes.column.prototype.pointAttribs.call(this, point, state);\n\n                // The dashStyle option in waterfall applies to the graph, not\n                // the points\n                delete attr.dashstyle;\n\n                return attr;\n            },\n\n\n            /**\n             * Return an empty path initially, because we need to know the stroke-width in order \n             * to set the final path.\n             */\n            getGraphPath: function() {\n                return ['M', 0, 0];\n            },\n\n            /**\n             * Draw columns' connector lines\n             */\n            getCrispPath: function() {\n\n                var data = this.data,\n                    length = data.length,\n                    lineWidth = this.graph.strokeWidth() + this.borderWidth,\n                    normalizer = Math.round(lineWidth) % 2 / 2,\n                    reversedYAxis = this.yAxis.reversed,\n                    path = [],\n                    prevArgs,\n                    pointArgs,\n                    i,\n                    d;\n\n                for (i = 1; i < length; i++) {\n                    pointArgs = data[i].shapeArgs;\n                    prevArgs = data[i - 1].shapeArgs;\n\n                    d = [\n                        'M',\n                        prevArgs.x + prevArgs.width,\n                        prevArgs.y + data[i - 1].minPointLengthOffset + normalizer,\n                        'L',\n                        pointArgs.x,\n                        prevArgs.y + data[i - 1].minPointLengthOffset + normalizer\n                    ];\n\n                    if (\n                        (data[i - 1].y < 0 && !reversedYAxis) ||\n                        (data[i - 1].y > 0 && reversedYAxis)\n                    ) {\n                        d[2] += prevArgs.height;\n                        d[5] += prevArgs.height;\n                    }\n\n                    path = path.concat(d);\n                }\n\n                return path;\n            },\n\n            /**\n             * The graph is initally drawn with an empty definition, then updated with\n             * crisp rendering.\n             */\n            drawGraph: function() {\n                Series.prototype.drawGraph.call(this);\n                this.graph.attr({\n                    d: this.getCrispPath()\n                });\n            },\n\n            /**\n             * Waterfall has stacking along the x-values too.\n             */\n            setStackedPoints: function() {\n                var series = this,\n                    options = series.options,\n                    stackedYLength,\n                    i;\n\n                Series.prototype.setStackedPoints.apply(series, arguments);\n\n                stackedYLength = series.stackedYData ? series.stackedYData.length : 0;\n\n                // Start from the second point:\n                for (i = 1; i < stackedYLength; i++) {\n                    if (!options.data[i].isSum &&\n                        !options.data[i].isIntermediateSum\n                    ) {\n                        // Sum previous stacked data as waterfall can grow up/down:\n                        series.stackedYData[i] += series.stackedYData[i - 1];\n                    }\n                }\n            },\n\n            /**\n             * Extremes for a non-stacked series are recorded in processData.\n             * In case of stacking, use Series.stackedYData to calculate extremes.\n             */\n            getExtremes: function() {\n                if (this.options.stacking) {\n                    return Series.prototype.getExtremes.apply(this, arguments);\n                }\n            }\n\n\n            // Point members\n        }, {\n            getClassName: function() {\n                var className = Point.prototype.getClassName.call(this);\n\n                if (this.isSum) {\n                    className += ' highcharts-sum';\n                } else if (this.isIntermediateSum) {\n                    className += ' highcharts-intermediate-sum';\n                }\n                return className;\n            },\n            /**\n             * Pass the null test in ColumnSeries.translate.\n             */\n            isValid: function() {\n                return isNumber(this.y, true) || this.isSum || this.isIntermediateSum;\n            }\n\n        });\n\n        /* ****************************************************************************\n         * End Waterfall series code                                                  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var LegendSymbolMixin = H.LegendSymbolMixin,\n            noop = H.noop,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n        /**\n         * The polygon series prototype\n         */\n        seriesType('polygon', 'scatter', {\n            marker: {\n                enabled: false,\n                states: {\n                    hover: {\n                        enabled: false\n                    }\n                }\n            },\n            stickyTracking: false,\n            tooltip: {\n                followPointer: true,\n                pointFormat: ''\n            },\n            trackByArea: true\n\n            // Prototype members\n        }, {\n            type: 'polygon',\n            getGraphPath: function() {\n\n                var graphPath = Series.prototype.getGraphPath.call(this),\n                    i = graphPath.length + 1;\n\n                // Close all segments\n                while (i--) {\n                    if ((i === graphPath.length || graphPath[i] === 'M') && i > 0) {\n                        graphPath.splice(i, 0, 'z');\n                    }\n                }\n                this.areaPath = graphPath;\n                return graphPath;\n            },\n            drawGraph: function() {\n\n                this.options.fillColor = this.color; // Hack into the fill logic in area.drawGraph\n\n                seriesTypes.area.prototype.drawGraph.call(this);\n            },\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            drawTracker: Series.prototype.drawTracker,\n            setStackedPoints: noop // No stacking points on polygons (#5310)\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            Axis = H.Axis,\n            color = H.color,\n            each = H.each,\n            isNumber = H.isNumber,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            Point = H.Point,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /* ****************************************************************************\n         * Start Bubble series code\t\t\t\t\t\t\t\t\t\t\t          *\n         *****************************************************************************/\n\n        seriesType('bubble', 'scatter', {\n            dataLabels: {\n                formatter: function() { // #2945\n                    return this.point.z;\n                },\n                inside: true,\n                verticalAlign: 'middle'\n            },\n            // displayNegative: true,\n            marker: {\n\n                // fillOpacity: 0.5,\n                lineColor: null, // inherit from series.color\n                lineWidth: 1,\n\n                // Avoid offset in Point.setState\n                radius: null,\n                states: {\n                    hover: {\n                        radiusPlus: 0\n                    }\n                },\n                symbol: 'circle'\n            },\n            minSize: 8,\n            maxSize: '20%',\n            // negativeColor: null,\n            // sizeBy: 'area'\n            softThreshold: false,\n            states: {\n                hover: {\n                    halo: {\n                        size: 5\n                    }\n                }\n            },\n            tooltip: {\n                pointFormat: '({point.x}, {point.y}), Size: {point.z}'\n            },\n            turboThreshold: 0,\n            zThreshold: 0,\n            zoneAxis: 'z'\n\n            // Prototype members\n        }, {\n            pointArrayMap: ['y', 'z'],\n            parallelArrays: ['x', 'y', 'z'],\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            specialGroup: 'group', // To allow clipping (#6296)\n            bubblePadding: true,\n            zoneAxis: 'z',\n            directTouch: true,\n\n\n            pointAttribs: function(point, state) {\n                var markerOptions = this.options.marker,\n                    fillOpacity = pick(markerOptions.fillOpacity, 0.5),\n                    attr = Series.prototype.pointAttribs.call(this, point, state);\n\n                if (fillOpacity !== 1) {\n                    attr.fill = color(attr.fill).setOpacity(fillOpacity).get('rgba');\n                }\n\n                return attr;\n            },\n\n\n            /**\n             * Get the radius for each point based on the minSize, maxSize and each point's Z value. This\n             * must be done prior to Series.translate because the axis needs to add padding in\n             * accordance with the point sizes.\n             */\n            getRadii: function(zMin, zMax, minSize, maxSize) {\n                var len,\n                    i,\n                    pos,\n                    zData = this.zData,\n                    radii = [],\n                    options = this.options,\n                    sizeByArea = options.sizeBy !== 'width',\n                    zThreshold = options.zThreshold,\n                    zRange = zMax - zMin,\n                    value,\n                    radius;\n\n                // Set the shape type and arguments to be picked up in drawPoints\n                for (i = 0, len = zData.length; i < len; i++) {\n\n                    value = zData[i];\n\n                    // When sizing by threshold, the absolute value of z determines the size\n                    // of the bubble.\n                    if (options.sizeByAbsoluteValue && value !== null) {\n                        value = Math.abs(value - zThreshold);\n                        zMax = Math.max(zMax - zThreshold, Math.abs(zMin - zThreshold));\n                        zMin = 0;\n                    }\n\n                    if (value === null) {\n                        radius = null;\n                        // Issue #4419 - if value is less than zMin, push a radius that's always smaller than the minimum size\n                    } else if (value < zMin) {\n                        radius = minSize / 2 - 1;\n                    } else {\n                        // Relative size, a number between 0 and 1\n                        pos = zRange > 0 ? (value - zMin) / zRange : 0.5;\n\n                        if (sizeByArea && pos >= 0) {\n                            pos = Math.sqrt(pos);\n                        }\n                        radius = Math.ceil(minSize + pos * (maxSize - minSize)) / 2;\n                    }\n                    radii.push(radius);\n                }\n                this.radii = radii;\n            },\n\n            /**\n             * Perform animation on the bubbles\n             */\n            animate: function(init) {\n                var animation = this.options.animation;\n\n                if (!init) { // run the animation\n                    each(this.points, function(point) {\n                        var graphic = point.graphic,\n                            animationTarget;\n\n                        if (graphic && graphic.width) { // URL symbols don't have width\n                            animationTarget = {\n                                x: graphic.x,\n                                y: graphic.y,\n                                width: graphic.width,\n                                height: graphic.height\n                            };\n\n                            // Start values\n                            graphic.attr({\n                                x: point.plotX,\n                                y: point.plotY,\n                                width: 1,\n                                height: 1\n                            });\n\n                            // Run animation\n                            graphic.animate(animationTarget, animation);\n                        }\n                    });\n\n                    // delete this function to allow it only once\n                    this.animate = null;\n                }\n            },\n\n            /**\n             * Extend the base translate method to handle bubble size\n             */\n            translate: function() {\n\n                var i,\n                    data = this.data,\n                    point,\n                    radius,\n                    radii = this.radii;\n\n                // Run the parent method\n                seriesTypes.scatter.prototype.translate.call(this);\n\n                // Set the shape type and arguments to be picked up in drawPoints\n                i = data.length;\n\n                while (i--) {\n                    point = data[i];\n                    radius = radii ? radii[i] : 0; // #1737\n\n                    if (isNumber(radius) && radius >= this.minPxSize / 2) {\n                        // Shape arguments\n                        point.marker = H.extend(point.marker, {\n                            radius: radius,\n                            width: 2 * radius,\n                            height: 2 * radius\n                        });\n\n                        // Alignment box for the data label\n                        point.dlBox = {\n                            x: point.plotX - radius,\n                            y: point.plotY - radius,\n                            width: 2 * radius,\n                            height: 2 * radius\n                        };\n                    } else { // below zThreshold\n                        point.shapeArgs = point.plotY = point.dlBox = undefined; // #1691\n                    }\n                }\n            },\n\n            alignDataLabel: seriesTypes.column.prototype.alignDataLabel,\n            buildKDTree: noop,\n            applyZones: noop\n\n            // Point class\n        }, {\n            haloPath: function(size) {\n                return Point.prototype.haloPath.call(\n                    this,\n                    size === 0 ? 0 : (this.marker ? this.marker.radius || 0 : 0) + size // #6067\n                );\n            },\n            ttBelow: false\n        });\n\n        /**\n         * Add logic to pad each axis with the amount of pixels\n         * necessary to avoid the bubbles to overflow.\n         */\n        Axis.prototype.beforePadding = function() {\n            var axis = this,\n                axisLength = this.len,\n                chart = this.chart,\n                pxMin = 0,\n                pxMax = axisLength,\n                isXAxis = this.isXAxis,\n                dataKey = isXAxis ? 'xData' : 'yData',\n                min = this.min,\n                extremes = {},\n                smallestSize = Math.min(chart.plotWidth, chart.plotHeight),\n                zMin = Number.MAX_VALUE,\n                zMax = -Number.MAX_VALUE,\n                range = this.max - min,\n                transA = axisLength / range,\n                activeSeries = [];\n\n            // Handle padding on the second pass, or on redraw\n            each(this.series, function(series) {\n\n                var seriesOptions = series.options,\n                    zData;\n\n                if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {\n\n                    // Correction for #1673\n                    axis.allowZoomOutside = true;\n\n                    // Cache it\n                    activeSeries.push(series);\n\n                    if (isXAxis) { // because X axis is evaluated first\n\n                        // For each series, translate the size extremes to pixel values\n                        each(['minSize', 'maxSize'], function(prop) {\n                            var length = seriesOptions[prop],\n                                isPercent = /%$/.test(length);\n\n                            length = pInt(length);\n                            extremes[prop] = isPercent ?\n                                smallestSize * length / 100 :\n                                length;\n\n                        });\n                        series.minPxSize = extremes.minSize;\n                        // Prioritize min size if conflict to make sure bubbles are\n                        // always visible. #5873\n                        series.maxPxSize = Math.max(extremes.maxSize, extremes.minSize);\n\n                        // Find the min and max Z\n                        zData = series.zData;\n                        if (zData.length) { // #1735\n                            zMin = pick(seriesOptions.zMin, Math.min(\n                                zMin,\n                                Math.max(\n                                    arrayMin(zData),\n                                    seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE\n                                )\n                            ));\n                            zMax = pick(seriesOptions.zMax, Math.max(zMax, arrayMax(zData)));\n                        }\n                    }\n                }\n            });\n\n            each(activeSeries, function(series) {\n\n                var data = series[dataKey],\n                    i = data.length,\n                    radius;\n\n                if (isXAxis) {\n                    series.getRadii(zMin, zMax, series.minPxSize, series.maxPxSize);\n                }\n\n                if (range > 0) {\n                    while (i--) {\n                        if (isNumber(data[i]) && axis.dataMin <= data[i] && data[i] <= axis.dataMax) {\n                            radius = series.radii[i];\n                            pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);\n                            pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);\n                        }\n                    }\n                }\n            });\n\n            if (activeSeries.length && range > 0 && !this.isLog) {\n                pxMax -= axisLength;\n                transA *= (axisLength + pxMin - pxMax) / axisLength;\n                each([\n                    ['min', 'userMin', pxMin],\n                    ['max', 'userMax', pxMax]\n                ], function(keys) {\n                    if (pick(axis.options[keys[0]], axis[keys[1]]) === undefined) {\n                        axis[keys[0]] += keys[2] / transA;\n                    }\n                });\n            }\n        };\n\n        /* ****************************************************************************\n         * End Bubble series code                                                     *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /**\n         * Extensions for polar charts. Additionally, much of the geometry required for polar charts is\n         * gathered in RadialAxes.js.\n         *\n         */\n\n        var each = H.each,\n            pick = H.pick,\n            Pointer = H.Pointer,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n\n            seriesProto = Series.prototype,\n            pointerProto = Pointer.prototype,\n            colProto;\n\n        /**\n         * Search a k-d tree by the point angle, used for shared tooltips in polar charts\n         */\n        seriesProto.searchPointByAngle = function(e) {\n            var series = this,\n                chart = series.chart,\n                xAxis = series.xAxis,\n                center = xAxis.pane.center,\n                plotX = e.chartX - center[0] - chart.plotLeft,\n                plotY = e.chartY - center[1] - chart.plotTop;\n\n            return this.searchKDTree({\n                clientX: 180 + (Math.atan2(plotX, plotY) * (-180 / Math.PI))\n            });\n\n        };\n\n        /**\n         * #6212 Calculate connectors for spline series in polar chart. \n         * @param {Boolean} calculateNeighbours - Check if connectors should be calculated for neighbour points as well\n         * allows short recurence\n         */\n        seriesProto.getConnectors = function(segment, index, calculateNeighbours, connectEnds) {\n\n            var i,\n                prevPointInd,\n                nextPointInd,\n                previousPoint,\n                nextPoint,\n                previousX,\n                previousY,\n                nextX,\n                nextY,\n                plotX,\n                plotY,\n                ret,\n                smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc;\n                denom = smoothing + 1,\n                leftContX,\n                leftContY,\n                rightContX,\n                rightContY,\n                dLControlPoint, //distance left control point\n                dRControlPoint,\n                leftContAngle,\n                rightContAngle,\n                jointAngle,\n                addedNumber = connectEnds ? 1 : 0;\n\n            /** calculate final index of points depending on the initial index value.\n             * Because of calculating neighbours, index may be outisde segment array.\n             */\n            if (index >= 0 && index <= segment.length - 1) {\n                i = index;\n            } else if (index < 0) {\n                i = segment.length - 1 + index;\n            } else {\n                i = 0;\n            }\n\n            prevPointInd = (i - 1 < 0) ? segment.length - (1 + addedNumber) : i - 1;\n            nextPointInd = (i + 1 > segment.length - 1) ? addedNumber : i + 1;\n            previousPoint = segment[prevPointInd];\n            nextPoint = segment[nextPointInd];\n            previousX = previousPoint.plotX;\n            previousY = previousPoint.plotY;\n            nextX = nextPoint.plotX;\n            nextY = nextPoint.plotY;\n            plotX = segment[i].plotX; // actual point\n            plotY = segment[i].plotY;\n            leftContX = (smoothing * plotX + previousX) / denom;\n            leftContY = (smoothing * plotY + previousY) / denom;\n            rightContX = (smoothing * plotX + nextX) / denom;\n            rightContY = (smoothing * plotY + nextY) / denom;\n            dLControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2));\n            dRControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2));\n            leftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX);\n            rightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);\n            jointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);\n            // Ensure the right direction, jointAngle should be in the same quadrant as leftContAngle\n            if (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {\n                jointAngle -= Math.PI;\n            }\n            // Find the corrected control points for a spline straight through the point\n            leftContX = plotX + Math.cos(jointAngle) * dLControlPoint;\n            leftContY = plotY + Math.sin(jointAngle) * dLControlPoint;\n            rightContX = plotX + Math.cos(Math.PI + jointAngle) * dRControlPoint;\n            rightContY = plotY + Math.sin(Math.PI + jointAngle) * dRControlPoint;\n\n            // push current point's connectors into returned object\n\n            ret = {\n                rightContX: rightContX,\n                rightContY: rightContY,\n                leftContX: leftContX,\n                leftContY: leftContY,\n                plotX: plotX,\n                plotY: plotY\n            };\n\n            // calculate connectors for previous and next point and push them inside returned object \n            if (calculateNeighbours) {\n                ret.prevPointCont = this.getConnectors(segment, prevPointInd, false, connectEnds);\n            }\n            return ret;\n        };\n\n        /**\n         * Wrap the buildKDTree function so that it searches by angle (clientX) in case of shared tooltip,\n         * and by two dimensional distance in case of non-shared.\n         */\n        wrap(seriesProto, 'buildKDTree', function(proceed) {\n            if (this.chart.polar) {\n                if (this.kdByAngle) {\n                    this.searchPoint = this.searchPointByAngle;\n                } else {\n                    this.options.findNearestPointBy = 'xy';\n                }\n            }\n            proceed.apply(this);\n        });\n\n        /**\n         * Translate a point's plotX and plotY from the internal angle and radius measures to\n         * true plotX, plotY coordinates\n         */\n        seriesProto.toXY = function(point) {\n            var xy,\n                chart = this.chart,\n                plotX = point.plotX,\n                plotY = point.plotY,\n                clientX;\n\n            // Save rectangular plotX, plotY for later computation\n            point.rectPlotX = plotX;\n            point.rectPlotY = plotY;\n\n            // Find the polar plotX and plotY\n            xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);\n            point.plotX = point.polarPlotX = xy.x - chart.plotLeft;\n            point.plotY = point.polarPlotY = xy.y - chart.plotTop;\n\n            // If shared tooltip, record the angle in degrees in order to align X points. Otherwise,\n            // use a standard k-d tree to get the nearest point in two dimensions.\n            if (this.kdByAngle) {\n                clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;\n                if (clientX < 0) { // #2665\n                    clientX += 360;\n                }\n                point.clientX = clientX;\n            } else {\n                point.clientX = point.plotX;\n            }\n        };\n\n        if (seriesTypes.spline) {\n            /**\n             * Overridden method for calculating a spline from one point to the next\n             */\n            wrap(seriesTypes.spline.prototype, 'getPointSpline', function(proceed, segment, point, i) {\n                var ret,\n                    connectors;\n\n                if (this.chart.polar) {\n                    // moveTo or lineTo\n                    if (!i) {\n                        ret = ['M', point.plotX, point.plotY];\n                    } else { // curve from last point to this\n                        connectors = this.getConnectors(segment, i, true, this.connectEnds);\n                        ret = [\n                            'C',\n                            connectors.prevPointCont.rightContX,\n                            connectors.prevPointCont.rightContY,\n                            connectors.leftContX,\n                            connectors.leftContY,\n                            connectors.plotX,\n                            connectors.plotY\n                        ];\n                    }\n                } else {\n                    ret = proceed.call(this, segment, point, i);\n                }\n                return ret;\n            });\n\n            // #6430 Areasplinerange series use unwrapped getPointSpline method, so we need to set this method again.\n            if (seriesTypes.areasplinerange) {\n                seriesTypes.areasplinerange.prototype.getPointSpline = seriesTypes.spline.prototype.getPointSpline;\n            }\n        }\n\n        /**\n         * Extend translate. The plotX and plotY values are computed as if the polar chart were a\n         * cartesian plane, where plotX denotes the angle in radians and (yAxis.len - plotY) is the pixel distance from\n         * center.\n         */\n        wrap(seriesProto, 'translate', function(proceed) {\n            var chart = this.chart,\n                points,\n                i;\n\n            // Run uber method\n            proceed.call(this);\n\n            // Postprocess plot coordinates\n            if (chart.polar) {\n                this.kdByAngle = chart.tooltip && chart.tooltip.shared;\n\n                if (!this.preventPostTranslate) {\n                    points = this.points;\n                    i = points.length;\n\n                    while (i--) {\n                        // Translate plotX, plotY from angle and radius to true plot coordinates\n                        this.toXY(points[i]);\n                    }\n                }\n            }\n        });\n\n        /**\n         * Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in\n         * line-like series.\n         */\n        wrap(seriesProto, 'getGraphPath', function(proceed, points) {\n            var series = this,\n                i,\n                firstValid,\n                popLastPoint;\n\n            // Connect the path\n            if (this.chart.polar) {\n                points = points || this.points;\n\n                // Append first valid point in order to connect the ends\n                for (i = 0; i < points.length; i++) {\n                    if (!points[i].isNull) {\n                        firstValid = i;\n                        break;\n                    }\n                }\n                if (this.options.connectEnds !== false && firstValid !== undefined) {\n                    this.connectEnds = true; // re-used in splines\n                    points.splice(points.length, 0, points[firstValid]);\n                    popLastPoint = true;\n                }\n\n                // For area charts, pseudo points are added to the graph, now we need to translate these\n                each(points, function(point) {\n                    if (point.polarPlotY === undefined) {\n                        series.toXY(point);\n                    }\n                });\n            }\n\n            // Run uber method\n            var ret = proceed.apply(this, [].slice.call(arguments, 1));\n\n            /** #6212 points.splice method is adding points to an array. In case of areaspline getGraphPath method is used two times\n             * and in both times points are added to an array. That is why points.pop is used, to get unmodified points.\n             */\n            if (popLastPoint) {\n                points.pop();\n            }\n            return ret;\n        });\n\n\n        function polarAnimate(proceed, init) {\n            var chart = this.chart,\n                animation = this.options.animation,\n                group = this.group,\n                markerGroup = this.markerGroup,\n                center = this.xAxis.center,\n                plotLeft = chart.plotLeft,\n                plotTop = chart.plotTop,\n                attribs;\n\n            // Specific animation for polar charts\n            if (chart.polar) {\n\n                // Enable animation on polar charts only in SVG. In VML, the scaling is different, plus animation\n                // would be so slow it would't matter.\n                if (chart.renderer.isSVG) {\n\n                    if (animation === true) {\n                        animation = {};\n                    }\n\n                    // Initialize the animation\n                    if (init) {\n\n                        // Scale down the group and place it in the center\n                        attribs = {\n                            translateX: center[0] + plotLeft,\n                            translateY: center[1] + plotTop,\n                            scaleX: 0.001, // #1499\n                            scaleY: 0.001\n                        };\n\n                        group.attr(attribs);\n                        if (markerGroup) {\n                            //markerGroup.attrSetters = group.attrSetters;\n                            markerGroup.attr(attribs);\n                        }\n\n                        // Run the animation\n                    } else {\n                        attribs = {\n                            translateX: plotLeft,\n                            translateY: plotTop,\n                            scaleX: 1,\n                            scaleY: 1\n                        };\n                        group.animate(attribs, animation);\n                        if (markerGroup) {\n                            markerGroup.animate(attribs, animation);\n                        }\n\n                        // Delete this function to allow it only once\n                        this.animate = null;\n                    }\n                }\n\n                // For non-polar charts, revert to the basic animation\n            } else {\n                proceed.call(this, init);\n            }\n        }\n\n        // Define the animate method for regular series\n        wrap(seriesProto, 'animate', polarAnimate);\n\n\n        if (seriesTypes.column) {\n\n            colProto = seriesTypes.column.prototype;\n\n            colProto.polarArc = function(low, high, start, end) {\n                var center = this.xAxis.center,\n                    len = this.yAxis.len;\n\n                return this.chart.renderer.symbols.arc(\n                    center[0],\n                    center[1],\n                    len - high,\n                    null, {\n                        start: start,\n                        end: end,\n                        innerR: len - pick(low, len)\n                    }\n                );\n            };\n\n            /**\n             * Define the animate method for columnseries\n             */\n            wrap(colProto, 'animate', polarAnimate);\n\n\n            /**\n             * Extend the column prototype's translate method\n             */\n            wrap(colProto, 'translate', function(proceed) {\n\n                var xAxis = this.xAxis,\n                    startAngleRad = xAxis.startAngleRad,\n                    start,\n                    points,\n                    point,\n                    i;\n\n                this.preventPostTranslate = true;\n\n                // Run uber method\n                proceed.call(this);\n\n                // Postprocess plot coordinates\n                if (xAxis.isRadial) {\n                    points = this.points;\n                    i = points.length;\n                    while (i--) {\n                        point = points[i];\n                        start = point.barX + startAngleRad;\n                        point.shapeType = 'path';\n                        point.shapeArgs = {\n                            d: this.polarArc(point.yBottom, point.plotY, start, start + point.pointWidth)\n                        };\n                        // Provide correct plotX, plotY for tooltip\n                        this.toXY(point);\n                        point.tooltipPos = [point.plotX, point.plotY];\n                        point.ttBelow = point.plotY > xAxis.center[1];\n                    }\n                }\n            });\n\n\n            /**\n             * Align column data labels outside the columns. #1199.\n             */\n            wrap(colProto, 'alignDataLabel', function(proceed, point, dataLabel, options, alignTo, isNew) {\n\n                if (this.chart.polar) {\n                    var angle = point.rectPlotX / Math.PI * 180,\n                        align,\n                        verticalAlign;\n\n                    // Align nicely outside the perimeter of the columns\n                    if (options.align === null) {\n                        if (angle > 20 && angle < 160) {\n                            align = 'left'; // right hemisphere\n                        } else if (angle > 200 && angle < 340) {\n                            align = 'right'; // left hemisphere\n                        } else {\n                            align = 'center'; // top or bottom\n                        }\n                        options.align = align;\n                    }\n                    if (options.verticalAlign === null) {\n                        if (angle < 45 || angle > 315) {\n                            verticalAlign = 'bottom'; // top part\n                        } else if (angle > 135 && angle < 225) {\n                            verticalAlign = 'top'; // bottom part\n                        } else {\n                            verticalAlign = 'middle'; // left or right\n                        }\n                        options.verticalAlign = verticalAlign;\n                    }\n\n                    seriesProto.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n                } else {\n                    proceed.call(this, point, dataLabel, options, alignTo, isNew);\n                }\n\n            });\n        }\n\n        /**\n         * Extend getCoordinates to prepare for polar axis values\n         */\n        wrap(pointerProto, 'getCoordinates', function(proceed, e) {\n            var chart = this.chart,\n                ret = {\n                    xAxis: [],\n                    yAxis: []\n                };\n\n            if (chart.polar) {\n\n                each(chart.axes, function(axis) {\n                    var isXAxis = axis.isXAxis,\n                        center = axis.center,\n                        x = e.chartX - center[0] - chart.plotLeft,\n                        y = e.chartY - center[1] - chart.plotTop;\n\n                    ret[isXAxis ? 'xAxis' : 'yAxis'].push({\n                        axis: axis,\n                        value: axis.translate(\n                            isXAxis ?\n                            Math.PI - Math.atan2(x, y) : // angle\n                            Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), // distance from center\n                            true\n                        )\n                    });\n                });\n\n            } else {\n                ret = proceed.call(this, e);\n            }\n\n            return ret;\n        });\n\n        wrap(H.Chart.prototype, 'getAxes', function(proceed) {\n\n            if (!this.pane) {\n                this.pane = [];\n            }\n            each(H.splat(this.options.pane), function(paneOptions) {\n                new H.Pane( // eslint-disable-line no-new\n                    paneOptions,\n                    this\n                );\n            }, this);\n\n            proceed.call(this);\n        });\n\n        wrap(H.Chart.prototype, 'drawChartBox', function(proceed) {\n            proceed.call(this);\n\n            each(this.pane, function(pane) {\n                pane.render();\n            });\n        });\n\n        /**\n         * Extend chart.get to also search in panes. Used internally in responsiveness\n         * and chart.update.\n         */\n        wrap(H.Chart.prototype, 'get', function(proceed, id) {\n            return H.find(this.pane, function(pane) {\n                return pane.options.id === id;\n            }) || proceed.call(this, id);\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/highcharts.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2016 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(K,S){\"object\"===typeof module&&module.exports?module.exports=K.document?S(K):S:K.Highcharts=S(K)})(\"undefined\"!==typeof window?window:this,function(K){K=function(){var a=window,C=a.document,A=a.navigator&&a.navigator.userAgent||\"\",G=C&&C.createElementNS&&!!C.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").createSVGRect,F=/(edge|msie|trident)/i.test(A)&&!window.opera,m=!G,g=/Firefox/.test(A),k=g&&4>parseInt(A.split(\"Firefox/\")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:\"Highcharts\",\nversion:\"5.0.12\",deg2rad:2*Math.PI/360,doc:C,hasBidiBug:k,hasTouch:C&&void 0!==C.documentElement.ontouchstart,isMS:F,isWebKit:/AppleWebKit/.test(A),isFirefox:g,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(A),SVG_NS:\"http://www.w3.org/2000/svg\",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:m,win:a,marginNames:[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"],noop:function(){},charts:[]}}();(function(a){var C=[],A=a.charts,G=a.doc,F=a.win;a.error=function(m,g){m=a.isNumber(m)?\"Highcharts error #\"+\nm+\": www.highcharts.com/errors/\"+m:m;if(g)throw Error(m);F.console&&console.log(m)};a.Fx=function(a,g,k){this.options=g;this.elem=a;this.prop=k};a.Fx.prototype={dSetter:function(){var a=this.paths[0],g=this.paths[1],k=[],q=this.now,v=a.length,u;if(1===q)k=this.toD;else if(v===g.length&&1>q)for(;v--;)u=parseFloat(a[v]),k[v]=isNaN(u)?a[v]:q*parseFloat(g[v]-u)+u;else k=g;this.elem.attr(\"d\",k,null,!0)},update:function(){var a=this.elem,g=this.prop,k=this.now,q=this.options.step;if(this[g+\"Setter\"])this[g+\n\"Setter\"]();else a.attr?a.element&&a.attr(g,k,null,!0):a.style[g]=k+this.unit;q&&q.call(a,k,this)},run:function(a,g,k){var m=this,v=function(a){return v.stopped?!1:m.step(a)},u;this.startTime=+new Date;this.start=a;this.end=g;this.unit=k;this.now=this.start;this.pos=0;v.elem=this.elem;v.prop=this.prop;v()&&1===C.push(v)&&(v.timerId=setInterval(function(){for(u=0;u<C.length;u++)C[u]()||C.splice(u--,1);C.length||clearInterval(v.timerId)},13))},step:function(m){var g=+new Date,k,q=this.options,v=this.elem,\nu=q.complete,h=q.duration,e=q.curAnim;v.attr&&!v.element?m=!1:m||g>=h+this.startTime?(this.now=this.end,this.pos=1,this.update(),k=e[this.prop]=!0,a.objectEach(e,function(a){!0!==a&&(k=!1)}),k&&u&&u.call(v),m=!1):(this.pos=q.easing((g-this.startTime)/h),this.now=this.start+(this.end-this.start)*this.pos,this.update(),m=!0);return m},initPath:function(m,g,k){function q(a){var b,l;for(y=a.length;y--;)b=\"M\"===a[y]||\"L\"===a[y],l=/[a-zA-Z]/.test(a[y+3]),b&&l&&a.splice(y+1,0,a[y+1],a[y+2],a[y+1],a[y+2])}\nfunction v(a,b){for(;a.length<w;){a[0]=b[w-a.length];var l=a.slice(0,c);[].splice.apply(a,[0,0].concat(l));D&&(l=a.slice(a.length-c),[].splice.apply(a,[a.length,0].concat(l)),y--)}a[0]=\"M\"}function u(a,l){for(var r=(w-a.length)/c;0<r&&r--;)b=a.slice().splice(a.length/H-c,c*H),b[0]=l[w-c-r*c],d&&(b[c-6]=b[c-2],b[c-5]=b[c-1]),[].splice.apply(a,[a.length/H,0].concat(b)),D&&r--}g=g||\"\";var h,e=m.startX,n=m.endX,d=-1<g.indexOf(\"C\"),c=d?7:3,w,b,y;g=g.split(\" \");k=k.slice();var D=m.isArea,H=D?2:1,l;d&&(q(g),\nq(k));if(e&&n){for(y=0;y<e.length;y++)if(e[y]===n[0]){h=y;break}else if(e[0]===n[n.length-e.length+y]){h=y;l=!0;break}void 0===h&&(g=[])}g.length&&a.isNumber(h)&&(w=k.length+h*H*c,l?(v(g,k),u(k,g)):(v(k,g),u(g,k)));return[g,k]}};a.Fx.prototype.fillSetter=a.Fx.prototype.strokeSetter=function(){this.elem.attr(this.prop,a.color(this.start).tweenTo(a.color(this.end),this.pos),null,!0)};a.extend=function(a,g){var m;a||(a={});for(m in g)a[m]=g[m];return a};a.merge=function(){var m,g=arguments,k,q={},v=\nfunction(g,h){\"object\"!==typeof g&&(g={});a.objectEach(h,function(e,n){!a.isObject(e,!0)||a.isClass(e)||a.isDOMElement(e)?g[n]=h[n]:g[n]=v(g[n]||{},e)});return g};!0===g[0]&&(q=g[1],g=Array.prototype.slice.call(g,2));k=g.length;for(m=0;m<k;m++)q=v(q,g[m]);return q};a.pInt=function(a,g){return parseInt(a,g||10)};a.isString=function(a){return\"string\"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return\"[object Array]\"===a||\"[object Array Iterator]\"===a};a.isObject=function(m,\ng){return!!m&&\"object\"===typeof m&&(!g||!a.isArray(m))};a.isDOMElement=function(m){return a.isObject(m)&&\"number\"===typeof m.nodeType};a.isClass=function(m){var g=m&&m.constructor;return!(!a.isObject(m,!0)||a.isDOMElement(m)||!g||!g.name||\"Object\"===g.name)};a.isNumber=function(a){return\"number\"===typeof a&&!isNaN(a)};a.erase=function(a,g){for(var m=a.length;m--;)if(a[m]===g){a.splice(m,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(m,g,k){var q;a.isString(g)?a.defined(k)?\nm.setAttribute(g,k):m&&m.getAttribute&&(q=m.getAttribute(g)):a.defined(g)&&a.isObject(g)&&a.objectEach(g,function(a,g){m.setAttribute(g,a)});return q};a.splat=function(m){return a.isArray(m)?m:[m]};a.syncTimeout=function(a,g,k){if(g)return setTimeout(a,g,k);a.call(0,k)};a.pick=function(){var a=arguments,g,k,q=a.length;for(g=0;g<q;g++)if(k=a[g],void 0!==k&&null!==k)return k};a.css=function(m,g){a.isMS&&!a.svg&&g&&void 0!==g.opacity&&(g.filter=\"alpha(opacity\\x3d\"+100*g.opacity+\")\");a.extend(m.style,\ng)};a.createElement=function(m,g,k,q,v){m=G.createElement(m);var u=a.css;g&&a.extend(m,g);v&&u(m,{padding:0,border:\"none\",margin:0});k&&u(m,k);q&&q.appendChild(m);return m};a.extendClass=function(m,g){var k=function(){};k.prototype=new m;a.extend(k.prototype,g);return k};a.pad=function(a,g,k){return Array((g||2)+1-String(a).length).join(k||0)+a};a.relativeLength=function(a,g){return/%$/.test(a)?g*parseFloat(a)/100:parseFloat(a)};a.wrap=function(a,g,k){var q=a[g];a[g]=function(){var a=Array.prototype.slice.call(arguments),\ng=arguments,h=this;h.proceed=function(){q.apply(h,arguments.length?arguments:g)};a.unshift(q);a=k.apply(this,a);h.proceed=null;return a}};a.getTZOffset=function(m){var g=a.Date;return 6E4*(g.hcGetTimezoneOffset&&g.hcGetTimezoneOffset(m)||g.hcTimezoneOffset||0)};a.dateFormat=function(m,g,k){if(!a.defined(g)||isNaN(g))return a.defaultOptions.lang.invalidDate||\"\";m=a.pick(m,\"%Y-%m-%d %H:%M:%S\");var q=a.Date,v=new q(g-a.getTZOffset(g)),u=v[q.hcGetHours](),h=v[q.hcGetDay](),e=v[q.hcGetDate](),n=v[q.hcGetMonth](),\nd=v[q.hcGetFullYear](),c=a.defaultOptions.lang,w=c.weekdays,b=c.shortWeekdays,y=a.pad,q=a.extend({a:b?b[h]:w[h].substr(0,3),A:w[h],d:y(e),e:y(e,2,\" \"),w:h,b:c.shortMonths[n],B:c.months[n],m:y(n+1),y:d.toString().substr(2,2),Y:d,H:y(u),k:u,I:y(u%12||12),l:u%12||12,M:y(v[q.hcGetMinutes]()),p:12>u?\"AM\":\"PM\",P:12>u?\"am\":\"pm\",S:y(v.getSeconds()),L:y(Math.round(g%1E3),3)},a.dateFormats);a.objectEach(q,function(a,b){for(;-1!==m.indexOf(\"%\"+b);)m=m.replace(\"%\"+b,\"function\"===typeof a?a(g):a)});return k?m.substr(0,\n1).toUpperCase()+m.substr(1):m};a.formatSingle=function(m,g){var k=/\\.([0-9])/,q=a.defaultOptions.lang;/f$/.test(m)?(k=(k=m.match(k))?k[1]:-1,null!==g&&(g=a.numberFormat(g,k,q.decimalPoint,-1<m.indexOf(\",\")?q.thousandsSep:\"\"))):g=a.dateFormat(m,g);return g};a.format=function(m,g){for(var k=\"{\",q=!1,v,u,h,e,n=[],d;m;){k=m.indexOf(k);if(-1===k)break;v=m.slice(0,k);if(q){v=v.split(\":\");u=v.shift().split(\".\");e=u.length;d=g;for(h=0;h<e;h++)d=d[u[h]];v.length&&(d=a.formatSingle(v.join(\":\"),d));n.push(d)}else n.push(v);\nm=m.slice(k+1);k=(q=!q)?\"}\":\"{\"}n.push(m);return n.join(\"\")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(m,g,k,q,v){var u,h=m;k=a.pick(k,1);u=m/k;g||(g=v?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===q&&(1===k?g=a.grep(g,function(a){return 0===a%1}):.1>=k&&(g=[1/k])));for(q=0;q<g.length&&!(h=g[q],v&&h*k>=m||!v&&u<=(g[q]+(g[q+1]||g[q]))/2);q++);return h=a.correctFloat(h*k,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=\nfunction(a,g){var k=a.length,q,m;for(m=0;m<k;m++)a[m].safeI=m;a.sort(function(a,h){q=g(a,h);return 0===q?a.safeI-h.safeI:q});for(m=0;m<k;m++)delete a[m].safeI};a.arrayMin=function(a){for(var g=a.length,k=a[0];g--;)a[g]<k&&(k=a[g]);return k};a.arrayMax=function(a){for(var g=a.length,k=a[0];g--;)a[g]>k&&(k=a[g]);return k};a.destroyObjectProperties=function(m,g){a.objectEach(m,function(a,q){a&&a!==g&&a.destroy&&a.destroy();delete m[q]})};a.discardElement=function(m){var g=a.garbageBin;g||(g=a.createElement(\"div\"));\nm&&g.appendChild(m);g.innerHTML=\"\"};a.correctFloat=function(a,g){return parseFloat(a.toPrecision(g||14))};a.setAnimation=function(m,g){g.renderer.globalAnimation=a.pick(m,g.options.chart.animation,!0)};a.animObject=function(m){return a.isObject(m)?a.merge(m):{duration:m?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(m,g,k,q){m=+m||0;g=+g;var v=a.defaultOptions.lang,u=(m.toString().split(\".\")[1]||\"\").length,\nh,e;-1===g?g=Math.min(u,20):a.isNumber(g)||(g=2);e=(Math.abs(m)+Math.pow(10,-Math.max(g,u)-1)).toFixed(g);u=String(a.pInt(e));h=3<u.length?u.length%3:0;k=a.pick(k,v.decimalPoint);q=a.pick(q,v.thousandsSep);m=(0>m?\"-\":\"\")+(h?u.substr(0,h)+q:\"\");m+=u.substr(h).replace(/(\\d{3})(?=\\d)/g,\"$1\"+q);g&&(m+=k+e.slice(-g));return m};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(m,g,k){if(\"width\"===g)return Math.min(m.offsetWidth,m.scrollWidth)-a.getStyle(m,\"padding-left\")-\na.getStyle(m,\"padding-right\");if(\"height\"===g)return Math.min(m.offsetHeight,m.scrollHeight)-a.getStyle(m,\"padding-top\")-a.getStyle(m,\"padding-bottom\");if(m=F.getComputedStyle(m,void 0))m=m.getPropertyValue(g),a.pick(k,!0)&&(m=a.pInt(m));return m};a.inArray=function(a,g){return g.indexOf?g.indexOf(a):[].indexOf.call(g,a)};a.grep=function(a,g){return[].filter.call(a,g)};a.find=function(a,g){return[].find.call(a,g)};a.map=function(a,g){for(var k=[],q=0,m=a.length;q<m;q++)k[q]=g.call(a[q],a[q],q,a);\nreturn k};a.offset=function(a){var g=G.documentElement;a=a.getBoundingClientRect();return{top:a.top+(F.pageYOffset||g.scrollTop)-(g.clientTop||0),left:a.left+(F.pageXOffset||g.scrollLeft)-(g.clientLeft||0)}};a.stop=function(a,g){for(var k=C.length;k--;)C[k].elem!==a||g&&g!==C[k].prop||(C[k].stopped=!0)};a.each=function(a,g,k){return Array.prototype.forEach.call(a,g,k)};a.objectEach=function(a,g,k){for(var q in a)a.hasOwnProperty(q)&&g.call(k,a[q],q,a)};a.addEvent=function(m,g,k){function q(a){a.target=\na.srcElement||F;k.call(m,a)}var v=m.hcEvents=m.hcEvents||{};m.addEventListener?m.addEventListener(g,k,!1):m.attachEvent&&(m.hcEventsIE||(m.hcEventsIE={}),m.hcEventsIE[k.toString()]=q,m.attachEvent(\"on\"+g,q));v[g]||(v[g]=[]);v[g].push(k);return function(){a.removeEvent(m,g,k)}};a.removeEvent=function(m,g,k){function q(a,d){m.removeEventListener?m.removeEventListener(a,d,!1):m.attachEvent&&(d=m.hcEventsIE[d.toString()],m.detachEvent(\"on\"+a,d))}function v(){var e,d;m.nodeName&&(g?(e={},e[g]=!0):e=h,\na.objectEach(e,function(a,e){if(h[e])for(d=h[e].length;d--;)q(e,h[e][d])}))}var u,h=m.hcEvents,e;h&&(g?(u=h[g]||[],k?(e=a.inArray(k,u),-1<e&&(u.splice(e,1),h[g]=u),q(g,k)):(v(),h[g]=[])):(v(),m.hcEvents={}))};a.fireEvent=function(m,g,k,q){var v;v=m.hcEvents;var u,h;k=k||{};if(G.createEvent&&(m.dispatchEvent||m.fireEvent))v=G.createEvent(\"Events\"),v.initEvent(g,!0,!0),a.extend(v,k),m.dispatchEvent?m.dispatchEvent(v):m.fireEvent(g,v);else if(v)for(v=v[g]||[],u=v.length,k.target||a.extend(k,{preventDefault:function(){k.defaultPrevented=\n!0},target:m,type:g}),g=0;g<u;g++)(h=v[g])&&!1===h.call(m,k)&&k.preventDefault();q&&!k.defaultPrevented&&q(k)};a.animate=function(m,g,k){var q,v=\"\",u,h,e;a.isObject(k)||(e=arguments,k={duration:e[2],easing:e[3],complete:e[4]});a.isNumber(k.duration)||(k.duration=400);k.easing=\"function\"===typeof k.easing?k.easing:Math[k.easing]||Math.easeInOutSine;k.curAnim=a.merge(g);a.objectEach(g,function(e,d){a.stop(m,d);h=new a.Fx(m,k,d);u=null;\"d\"===d?(h.paths=h.initPath(m,m.d,g.d),h.toD=g.d,q=0,u=1):m.attr?\nq=m.attr(d):(q=parseFloat(a.getStyle(m,d))||0,\"opacity\"!==d&&(v=\"px\"));u||(u=e);u&&u.match&&u.match(\"px\")&&(u=u.replace(/px/g,\"\"));h.run(q,u,v)})};a.seriesType=function(m,g,k,q,v){var u=a.getOptions(),h=a.seriesTypes;if(h[m])return a.error(27);u.plotOptions[m]=a.merge(u.plotOptions[g],k);h[m]=a.extendClass(h[g]||function(){},q);h[m].prototype.type=m;v&&(h[m].prototype.pointClass=a.extendClass(a.Point,v));return h[m]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),g=0;return function(){return\"highcharts-\"+\na+\"-\"+g++}}();F.jQuery&&(F.jQuery.fn.highcharts=function(){var m=[].slice.call(arguments);if(this[0])return m[0]?(new (a[a.isString(m[0])?m.shift():\"Chart\"])(this[0],m[0],m[1]),this):A[a.attr(this[0],\"data-highcharts-chart\")]});G&&!G.defaultView&&(a.getStyle=function(m,g){var k={width:\"clientWidth\",height:\"clientHeight\"}[g];if(m.style[g])return a.pInt(m.style[g]);\"opacity\"===g&&(g=\"filter\");if(k)return m.style.zoom=1,Math.max(m[k]-2*a.getStyle(m,\"padding\"),0);m=m.currentStyle[g.replace(/\\-(\\w)/g,\nfunction(a,g){return g.toUpperCase()})];\"filter\"===g&&(m=m.replace(/alpha\\(opacity=([0-9]+)\\)/,function(a,g){return g/100}));return\"\"===m?1:a.pInt(m)});Array.prototype.forEach||(a.each=function(a,g,k){for(var q=0,m=a.length;q<m;q++)if(!1===g.call(k,a[q],q,a))return q});Array.prototype.indexOf||(a.inArray=function(a,g){var k,q=0;if(g)for(k=g.length;q<k;q++)if(g[q]===a)return q;return-1});Array.prototype.filter||(a.grep=function(a,g){for(var k=[],q=0,m=a.length;q<m;q++)g(a[q],q)&&k.push(a[q]);return k});\nArray.prototype.find||(a.find=function(a,g){var k,q=a.length;for(k=0;k<q;k++)if(g(a[k],k))return a[k]})})(K);(function(a){var C=a.each,A=a.isNumber,G=a.map,F=a.merge,m=a.pInt;a.Color=function(g){if(!(this instanceof a.Color))return new a.Color(g);this.init(g)};a.Color.prototype={parsers:[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(a){return[m(a[1]),m(a[2]),m(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\nparse:function(a){return[m(a[1]),m(a[2]),m(a[3]),1]}}],names:{none:\"rgba(255,255,255,0)\",white:\"#ffffff\",black:\"#000000\"},init:function(g){var k,q,m,u;if((this.input=g=this.names[g&&g.toLowerCase?g.toLowerCase():\"\"]||g)&&g.stops)this.stops=G(g.stops,function(h){return new a.Color(h[1])});else if(g&&\"#\"===g[0]&&(k=g.length,g=parseInt(g.substr(1),16),7===k?q=[(g&16711680)>>16,(g&65280)>>8,g&255,1]:4===k&&(q=[(g&3840)>>4|(g&3840)>>8,(g&240)>>4|g&240,(g&15)<<4|g&15,1])),!q)for(m=this.parsers.length;m--&&\n!q;)u=this.parsers[m],(k=u.regex.exec(g))&&(q=u.parse(k));this.rgba=q||[]},get:function(a){var g=this.input,q=this.rgba,m;this.stops?(m=F(g),m.stops=[].concat(m.stops),C(this.stops,function(g,h){m.stops[h]=[m.stops[h][0],g.get(a)]})):m=q&&A(q[0])?\"rgb\"===a||!a&&1===q[3]?\"rgb(\"+q[0]+\",\"+q[1]+\",\"+q[2]+\")\":\"a\"===a?q[3]:\"rgba(\"+q.join(\",\")+\")\":g;return m},brighten:function(a){var g,q=this.rgba;if(this.stops)C(this.stops,function(g){g.brighten(a)});else if(A(a)&&0!==a)for(g=0;3>g;g++)q[g]+=m(255*a),0>\nq[g]&&(q[g]=0),255<q[g]&&(q[g]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this},tweenTo:function(a,k){var g,m;a.rgba.length?(g=this.rgba,a=a.rgba,m=1!==a[3]||1!==g[3],a=(m?\"rgba(\":\"rgb(\")+Math.round(a[0]+(g[0]-a[0])*(1-k))+\",\"+Math.round(a[1]+(g[1]-a[1])*(1-k))+\",\"+Math.round(a[2]+(g[2]-a[2])*(1-k))+(m?\",\"+(a[3]+(g[3]-a[3])*(1-k)):\"\")+\")\"):a=a.input||\"none\";return a}};a.color=function(g){return new a.Color(g)}})(K);(function(a){var C,A,G=a.addEvent,F=a.animate,m=a.attr,g=a.charts,\nk=a.color,q=a.css,v=a.createElement,u=a.defined,h=a.deg2rad,e=a.destroyObjectProperties,n=a.doc,d=a.each,c=a.extend,w=a.erase,b=a.grep,y=a.hasTouch,D=a.inArray,H=a.isArray,l=a.isFirefox,B=a.isMS,r=a.isObject,z=a.isString,M=a.isWebKit,p=a.merge,E=a.noop,I=a.objectEach,L=a.pick,f=a.pInt,t=a.removeEvent,R=a.stop,J=a.svg,N=a.SVG_NS,O=a.symbolSizes,P=a.win;C=a.SVGElement=function(){return this};c(C.prototype,{opacity:1,SVG_NS:N,textProps:\"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline\".split(\" \"),\ninit:function(a,f){this.element=\"span\"===f?v(f):n.createElementNS(this.SVG_NS,f);this.renderer=a},animate:function(x,f,t){f=a.animObject(L(f,this.renderer.globalAnimation,!0));0!==f.duration?(t&&(f.complete=t),F(this,x,f)):(this.attr(x,null,t),f.step&&f.step.call(this));return this},colorGradient:function(x,f,t){var b=this.renderer,l,c,r,Q,e,h,n,y,E,w,J=[],B;x.radialGradient?c=\"radialGradient\":x.linearGradient&&(c=\"linearGradient\");c&&(r=x[c],e=b.gradients,n=x.stops,w=t.radialReference,H(r)&&(x[c]=\nr={x1:r[0],y1:r[1],x2:r[2],y2:r[3],gradientUnits:\"userSpaceOnUse\"}),\"radialGradient\"===c&&w&&!u(r.gradientUnits)&&(Q=r,r=p(r,b.getRadialAttr(w,Q),{gradientUnits:\"userSpaceOnUse\"})),I(r,function(a,x){\"id\"!==x&&J.push(x,a)}),I(n,function(a){J.push(a)}),J=J.join(\",\"),e[J]?w=e[J].attr(\"id\"):(r.id=w=a.uniqueKey(),e[J]=h=b.createElement(c).attr(r).add(b.defs),h.radAttr=Q,h.stops=[],d(n,function(x){0===x[1].indexOf(\"rgba\")?(l=a.color(x[1]),y=l.get(\"rgb\"),E=l.get(\"a\")):(y=x[1],E=1);x=b.createElement(\"stop\").attr({offset:x[0],\n\"stop-color\":y,\"stop-opacity\":E}).add(h);h.stops.push(x)})),B=\"url(\"+b.url+\"#\"+w+\")\",t.setAttribute(f,B),t.gradient=J,x.toString=function(){return B})},applyTextOutline:function(x){var f=this.element,t,b,l,c,r;-1!==x.indexOf(\"contrast\")&&(x=x.replace(/contrast/g,this.renderer.getContrast(f.style.fill)));x=x.split(\" \");b=x[x.length-1];if((l=x[0])&&\"none\"!==l&&a.svg){this.fakeTS=!0;x=[].slice.call(f.getElementsByTagName(\"tspan\"));this.ySetter=this.xSetter;l=l.replace(/(^[\\d\\.]+)(.*?)$/g,function(a,\nx,f){return 2*x+f});for(r=x.length;r--;)t=x[r],\"highcharts-text-outline\"===t.getAttribute(\"class\")&&w(x,f.removeChild(t));c=f.firstChild;d(x,function(a,x){0===x&&(a.setAttribute(\"x\",f.getAttribute(\"x\")),x=f.getAttribute(\"y\"),a.setAttribute(\"y\",x||0),null===x&&f.setAttribute(\"y\",0));a=a.cloneNode(1);m(a,{\"class\":\"highcharts-text-outline\",fill:b,stroke:b,\"stroke-width\":l,\"stroke-linejoin\":\"round\"});f.insertBefore(a,c)})}},attr:function(a,f,t,b){var x,l=this.element,c,r=this,d,p;\"string\"===typeof a&&\nvoid 0!==f&&(x=a,a={},a[x]=f);\"string\"===typeof a?r=(this[a+\"Getter\"]||this._defaultGetter).call(this,a,l):(I(a,function(x,f){d=!1;b||R(this,f);this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(f)&&(c||(this.symbolAttr(a),c=!0),d=!0);!this.rotation||\"x\"!==f&&\"y\"!==f||(this.doTransform=!0);d||(p=this[f+\"Setter\"]||this._defaultSetter,p.call(this,x,f,l),this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(f)&&this.updateShadows(f,x,p))},this),this.afterSetters());\nt&&t();return r},afterSetters:function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)},updateShadows:function(a,f,t){for(var x=this.shadows,b=x.length;b--;)t.call(x[b],\"height\"===a?Math.max(f-(x[b].cutHeight||0),0):\"d\"===a?this.d:f,a,x[b])},addClass:function(a,f){var x=this.attr(\"class\")||\"\";-1===x.indexOf(a)&&(f||(a=(x+(x?\" \":\"\")+a).replace(\"  \",\" \")),this.attr(\"class\",a));return this},hasClass:function(a){return-1!==m(this.element,\"class\").indexOf(a)},removeClass:function(a){m(this.element,\n\"class\",(m(this.element,\"class\")||\"\").replace(a,\"\"));return this},symbolAttr:function(a){var x=this;d(\"x y r start end width height innerR anchorX anchorY\".split(\" \"),function(f){x[f]=L(a[f],x[f])});x.attr({d:x.renderer.symbols[x.symbolName](x.x,x.y,x.width,x.height,x)})},clip:function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")},crisp:function(a,f){var x=this,t={},b;f=f||a.strokeWidth||0;b=Math.round(f)%2/2;a.x=Math.floor(a.x||x.x||0)+b;a.y=Math.floor(a.y||x.y||\n0)+b;a.width=Math.floor((a.width||x.width||0)-2*b);a.height=Math.floor((a.height||x.height||0)-2*b);u(a.strokeWidth)&&(a.strokeWidth=f);I(a,function(a,f){x[f]!==a&&(x[f]=t[f]=a)});return t},css:function(a){var x=this.styles,t={},b=this.element,l,r=\"\",d,p=!x,e=[\"textOutline\",\"textOverflow\",\"width\"];a&&a.color&&(a.fill=a.color);x&&I(a,function(a,f){a!==x[f]&&(t[f]=a,p=!0)});p&&(x&&(a=c(x,t)),l=this.textWidth=a&&a.width&&\"auto\"!==a.width&&\"text\"===b.nodeName.toLowerCase()&&f(a.width),this.styles=a,l&&\n!J&&this.renderer.forExport&&delete a.width,B&&!J?q(this.element,a):(d=function(a,x){return\"-\"+x.toLowerCase()},I(a,function(a,x){-1===D(x,e)&&(r+=x.replace(/([A-Z])/g,d)+\":\"+a+\";\")}),r&&m(b,\"style\",r)),this.added&&(\"text\"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline)));return this},strokeWidth:function(){return this[\"stroke-width\"]||0},on:function(a,f){var x=this,t=x.element;y&&\"click\"===a?(t.ontouchstart=function(a){x.touchEventFired=\nDate.now();a.preventDefault();f.call(t,a)},t.onclick=function(a){(-1===P.navigator.userAgent.indexOf(\"Android\")||1100<Date.now()-(x.touchEventFired||0))&&f.call(t,a)}):t[\"on\"+a]=f;return this},setRadialReference:function(a){var x=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;x&&x.radAttr&&x.animate(this.renderer.getRadialAttr(a,x.radAttr));return this},translate:function(a,f){return this.attr({translateX:a,translateY:f})},invert:function(a){this.inverted=a;this.updateTransform();\nreturn this},updateTransform:function(){var a=this.translateX||0,f=this.translateY||0,t=this.scaleX,b=this.scaleY,l=this.inverted,c=this.rotation,r=this.element;l&&(a+=this.width,f+=this.height);a=[\"translate(\"+a+\",\"+f+\")\"];l?a.push(\"rotate(90) scale(-1,1)\"):c&&a.push(\"rotate(\"+c+\" \"+(r.getAttribute(\"x\")||0)+\" \"+(r.getAttribute(\"y\")||0)+\")\");(u(t)||u(b))&&a.push(\"scale(\"+L(t,1)+\" \"+L(b,1)+\")\");a.length&&r.setAttribute(\"transform\",a.join(\" \"))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);\nreturn this},align:function(a,f,t){var x,b,l,c,r={};b=this.renderer;l=b.alignedObjects;var d,p;if(a){if(this.alignOptions=a,this.alignByTranslate=f,!t||z(t))this.alignTo=x=t||\"renderer\",w(l,this),l.push(this),t=null}else a=this.alignOptions,f=this.alignByTranslate,x=this.alignTo;t=L(t,b[x],b);x=a.align;b=a.verticalAlign;l=(t.x||0)+(a.x||0);c=(t.y||0)+(a.y||0);\"right\"===x?d=1:\"center\"===x&&(d=2);d&&(l+=(t.width-(a.width||0))/d);r[f?\"translateX\":\"x\"]=Math.round(l);\"bottom\"===b?p=1:\"middle\"===b&&(p=\n2);p&&(c+=(t.height-(a.height||0))/p);r[f?\"translateY\":\"y\"]=Math.round(c);this[this.placed?\"animate\":\"attr\"](r);this.placed=!0;this.alignAttr=r;return this},getBBox:function(a,f){var x,t=this.renderer,b,l=this.element,r=this.styles,p,e=this.textStr,n,Q=t.cache,y=t.cacheKeys,E;f=L(f,this.rotation);b=f*h;p=r&&r.fontSize;void 0!==e&&(E=e.toString(),-1===E.indexOf(\"\\x3c\")&&(E=E.replace(/[0-9]/g,\"0\")),E+=[\"\",f||0,p,r&&r.width,r&&r.textOverflow].join());E&&!a&&(x=Q[E]);if(!x){if(l.namespaceURI===this.SVG_NS||\nt.forExport){try{(n=this.fakeTS&&function(a){d(l.querySelectorAll(\".highcharts-text-outline\"),function(x){x.style.display=a})})&&n(\"none\"),x=l.getBBox?c({},l.getBBox()):{width:l.offsetWidth,height:l.offsetHeight},n&&n(\"\")}catch(X){}if(!x||0>x.width)x={width:0,height:0}}else x=this.htmlGetBBox();t.isSVG&&(a=x.width,t=x.height,r&&\"11px\"===r.fontSize&&17===Math.round(t)&&(x.height=t=14),f&&(x.width=Math.abs(t*Math.sin(b))+Math.abs(a*Math.cos(b)),x.height=Math.abs(t*Math.cos(b))+Math.abs(a*Math.sin(b))));\nif(E&&0<x.height){for(;250<y.length;)delete Q[y.shift()];Q[E]||y.push(E);Q[E]=x}}return x},show:function(a){return this.attr({visibility:a?\"inherit\":\"visible\"})},hide:function(){return this.attr({visibility:\"hidden\"})},fadeOut:function(a){var x=this;x.animate({opacity:0},{duration:a||150,complete:function(){x.attr({y:-9999})}})},add:function(a){var x=this.renderer,f=this.element,t;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;void 0!==this.textStr&&x.buildText(this);this.added=!0;if(!a||\na.handleZ||this.zIndex)t=this.zIndexSetter();t||(a?a.element:x.box).appendChild(f);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var x=a.parentNode;x&&x.removeChild(a)},destroy:function(){var a=this,f=a.element||{},t=a.renderer.isSVG&&\"SPAN\"===f.nodeName&&a.parentGroup,b=f.ownerSVGElement;f.onclick=f.onmouseout=f.onmouseover=f.onmousemove=f.point=null;R(a);a.clipPath&&b&&(d(b.querySelectorAll(\"[clip-path]\"),function(x){-1<x.getAttribute(\"clip-path\").indexOf(a.clipPath.element.id+\n\")\")&&x.removeAttribute(\"clip-path\")}),a.clipPath=a.clipPath.destroy());if(a.stops){for(b=0;b<a.stops.length;b++)a.stops[b]=a.stops[b].destroy();a.stops=null}a.safeRemoveChild(f);for(a.destroyShadows();t&&t.div&&0===t.div.childNodes.length;)f=t.parentGroup,a.safeRemoveChild(t.div),delete t.div,t=f;a.alignTo&&w(a.renderer.alignedObjects,a);I(a,function(x,f){delete a[f]});return null},shadow:function(a,f,t){var x=[],b,l,c=this.element,r,d,p,e;if(!a)this.destroyShadows();else if(!this.shadows){d=L(a.width,\n3);p=(a.opacity||.15)/d;e=this.parentInverted?\"(-1,-1)\":\"(\"+L(a.offsetX,1)+\", \"+L(a.offsetY,1)+\")\";for(b=1;b<=d;b++)l=c.cloneNode(0),r=2*d+1-2*b,m(l,{isShadow:\"true\",stroke:a.color||\"#000000\",\"stroke-opacity\":p*b,\"stroke-width\":r,transform:\"translate\"+e,fill:\"none\"}),t&&(m(l,\"height\",Math.max(m(l,\"height\")-r,0)),l.cutHeight=r),f?f.element.appendChild(l):c.parentNode.insertBefore(l,c),x.push(l);this.shadows=x}return this},destroyShadows:function(){d(this.shadows||[],function(a){this.safeRemoveChild(a)},\nthis);this.shadows=void 0},xGetter:function(a){\"circle\"===this.element.nodeName&&(\"x\"===a?a=\"cx\":\"y\"===a&&(a=\"cy\"));return this._defaultGetter(a)},_defaultGetter:function(a){a=L(this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,f,t){a&&a.join&&(a=a.join(\" \"));/(NaN| {2}|^$)/.test(a)&&(a=\"M 0 0\");t.setAttribute(f,a);this[f]=a},dashstyleSetter:function(a){var x,t=this[\"stroke-width\"];\"inherit\"===t&&(t=1);if(a=a&&a.toLowerCase()){a=\na.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(x=a.length;x--;)a[x]=f(a[x])*t;a=a.join(\",\").replace(/NaN/g,\"none\");this.element.setAttribute(\"stroke-dasharray\",a)}},alignSetter:function(a){this.element.setAttribute(\"text-anchor\",{left:\"start\",center:\"middle\",right:\"end\"}[a])},opacitySetter:function(a,f,t){this[f]=\na;t.setAttribute(f,a)},titleSetter:function(a){var f=this.element.getElementsByTagName(\"title\")[0];f||(f=n.createElementNS(this.SVG_NS,\"title\"),this.element.appendChild(f));f.firstChild&&f.removeChild(f.firstChild);f.appendChild(n.createTextNode(String(L(a),\"\").replace(/<[^>]*>/g,\"\")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,f,t){\"string\"===typeof a?t.setAttribute(f,a):a&&this.colorGradient(a,f,t)},\nvisibilitySetter:function(a,f,t){\"inherit\"===a?t.removeAttribute(f):t.setAttribute(f,a)},zIndexSetter:function(a,t){var x=this.renderer,b=this.parentGroup,l=(b||x).element||x.box,c,r=this.element,d;c=this.added;var p;u(a)&&(r.zIndex=a,a=+a,this[t]===a&&(c=!1),this[t]=a);if(c){(a=this.zIndex)&&b&&(b.handleZ=!0);t=l.childNodes;for(p=0;p<t.length&&!d;p++)b=t[p],c=b.zIndex,b!==r&&(f(c)>a||!u(a)&&u(c)||0>a&&!u(c)&&l!==x.box)&&(l.insertBefore(r,b),d=!0);d||l.appendChild(r)}return d},_defaultSetter:function(a,\nf,t){t.setAttribute(f,a)}});C.prototype.yGetter=C.prototype.xGetter;C.prototype.translateXSetter=C.prototype.translateYSetter=C.prototype.rotationSetter=C.prototype.verticalAlignSetter=C.prototype.scaleXSetter=C.prototype.scaleYSetter=function(a,f){this[f]=a;this.doTransform=!0};C.prototype[\"stroke-widthSetter\"]=C.prototype.strokeSetter=function(a,f,t){this[f]=a;this.stroke&&this[\"stroke-width\"]?(C.prototype.fillSetter.call(this,this.stroke,\"stroke\",t),t.setAttribute(\"stroke-width\",this[\"stroke-width\"]),\nthis.hasStroke=!0):\"stroke-width\"===f&&0===a&&this.hasStroke&&(t.removeAttribute(\"stroke\"),this.hasStroke=!1)};A=a.SVGRenderer=function(){this.init.apply(this,arguments)};c(A.prototype,{Element:C,SVG_NS:N,init:function(a,f,t,b,c,r){var x;b=this.createElement(\"svg\").attr({version:\"1.1\",\"class\":\"highcharts-root\"}).css(this.getStyle(b));x=b.element;a.appendChild(x);-1===a.innerHTML.indexOf(\"xmlns\")&&m(x,\"xmlns\",this.SVG_NS);this.isSVG=!0;this.box=x;this.boxWrapper=b;this.alignedObjects=[];this.url=(l||\nM)&&n.getElementsByTagName(\"base\").length?P.location.href.replace(/#.*?$/,\"\").replace(/<[^>]*>/g,\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(n.createTextNode(\"Created with Highcharts 5.0.12\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=r;this.forExport=c;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(f,t,!1);var d;l&&a.getBoundingClientRect&&(f=function(){q(a,{left:0,top:0});d=a.getBoundingClientRect();\nq(a,{left:Math.ceil(d.left)-d.left+\"px\",top:Math.ceil(d.top)-d.top+\"px\"})},f(),this.unSubPixelFix=G(P,\"resize\",f))},getStyle:function(a){return this.style=c({fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif',fontSize:\"12px\"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients=\nnull;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var f=new this.Element;f.init(this,a);return f},draw:E,getRadialAttr:function(a,f){return{cx:a[0]-a[2]/2+f.cx*a[2],cy:a[1]-a[2]/2+f.cy*a[2],r:f.r*a[2]}},getSpanWidth:function(a,f){var t=a.getBBox(!0).width;!J&&this.forExport&&(t=this.measureSpanWidth(f.firstChild.data,a.styles));return t},applyEllipsis:function(a,f,t,b){var x=this.getSpanWidth(a,f),l=x>b,x=t,c,r=0,d=\nt.length,p=function(a){f.removeChild(f.firstChild);a&&f.appendChild(n.createTextNode(a))};if(l){for(;r<=d;)c=Math.ceil((r+d)/2),x=t.substring(0,c)+\"\\u2026\",p(x),x=this.getSpanWidth(a,f),r===d?r=d+1:x>b?d=c-1:r=c;0===d&&p(\"\")}return l},buildText:function(a){var t=a.element,x=this,l=x.forExport,c=L(a.textStr,\"\").toString(),r=-1!==c.indexOf(\"\\x3c\"),p=t.childNodes,e,h,E,y,w=m(t,\"x\"),B=a.styles,g=a.textWidth,I=B&&B.lineHeight,z=B&&B.textOutline,D=B&&\"ellipsis\"===B.textOverflow,k=B&&\"nowrap\"===B.whiteSpace,\nu=B&&B.fontSize,R,H,v=p.length,B=g&&!a.added&&this.box,M=function(a){var b;b=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:u||x.style.fontSize||12;return I?f(I):x.fontMetrics(b,a.getAttribute(\"style\")?a:t).h};R=[c,D,k,I,z,u,g].join();if(R!==a.textCache){for(a.textCache=R;v--;)t.removeChild(p[v]);r||z||D||g||-1!==c.indexOf(\" \")?(e=/<.*class=\"([^\"]+)\".*>/,h=/<.*style=\"([^\"]+)\".*>/,E=/<.*href=\"([^\"]+)\".*>/,B&&B.appendChild(t),c=r?c.replace(/<(b|strong)>/g,'\\x3cspan style\\x3d\"font-weight:bold\"\\x3e').replace(/<(i|em)>/g,\n'\\x3cspan style\\x3d\"font-style:italic\"\\x3e').replace(/<a/g,\"\\x3cspan\").replace(/<\\/(b|strong|i|em|a)>/g,\"\\x3c/span\\x3e\").split(/<br.*?>/g):[c],c=b(c,function(a){return\"\"!==a}),d(c,function(f,b){var c,r=0;f=f.replace(/^\\s+|\\s+$/g,\"\").replace(/<span/g,\"|||\\x3cspan\").replace(/<\\/span>/g,\"\\x3c/span\\x3e|||\");c=f.split(\"|||\");d(c,function(f){if(\"\"!==f||1===c.length){var d={},p=n.createElementNS(x.SVG_NS,\"tspan\"),B,I;e.test(f)&&(B=f.match(e)[1],m(p,\"class\",B));h.test(f)&&(I=f.match(h)[1].replace(/(;| |^)color([ :])/,\n\"$1fill$2\"),m(p,\"style\",I));E.test(f)&&!l&&(m(p,\"onclick\",'location.href\\x3d\"'+f.match(E)[1]+'\"'),q(p,{cursor:\"pointer\"}));f=(f.replace(/<(.|\\n)*?>/g,\"\")||\" \").replace(/&lt;/g,\"\\x3c\").replace(/&gt;/g,\"\\x3e\");if(\" \"!==f){p.appendChild(n.createTextNode(f));r?d.dx=0:b&&null!==w&&(d.x=w);m(p,d);t.appendChild(p);!r&&H&&(!J&&l&&q(p,{display:\"block\"}),m(p,\"dy\",M(p)));if(g){d=f.replace(/([^\\^])-/g,\"$1- \").split(\" \");B=1<c.length||b||1<d.length&&!k;var z=[],Q,u=M(p),R=a.rotation;for(D&&(y=x.applyEllipsis(a,\np,f,g));!D&&B&&(d.length||z.length);)a.rotation=0,Q=x.getSpanWidth(a,p),f=Q>g,void 0===y&&(y=f),f&&1!==d.length?(p.removeChild(p.firstChild),z.unshift(d.pop())):(d=z,z=[],d.length&&!k&&(p=n.createElementNS(N,\"tspan\"),m(p,{dy:u,x:w}),I&&m(p,\"style\",I),t.appendChild(p)),Q>g&&(g=Q)),d.length&&p.appendChild(n.createTextNode(d.join(\" \").replace(/- /g,\"-\")));a.rotation=R}r++}}});H=H||t.childNodes.length}),y&&a.attr(\"title\",a.textStr),B&&B.removeChild(t),z&&a.applyTextOutline&&a.applyTextOutline(z)):t.appendChild(n.createTextNode(c.replace(/&lt;/g,\n\"\\x3c\").replace(/&gt;/g,\"\\x3e\")))}},getContrast:function(a){a=k(a).rgba;return 510<a[0]+a[1]+a[2]?\"#000000\":\"#FFFFFF\"},button:function(a,f,t,b,l,r,d,e,h){var x=this.label(a,f,t,h,null,null,null,null,\"button\"),n=0;x.attr(p({padding:8,r:2},l));var E,y,w,J;l=p({fill:\"#f7f7f7\",stroke:\"#cccccc\",\"stroke-width\":1,style:{color:\"#333333\",cursor:\"pointer\",fontWeight:\"normal\"}},l);E=l.style;delete l.style;r=p(l,{fill:\"#e6e6e6\"},r);y=r.style;delete r.style;d=p(l,{fill:\"#e6ebf5\",style:{color:\"#000000\",fontWeight:\"bold\"}},\nd);w=d.style;delete d.style;e=p(l,{style:{color:\"#cccccc\"}},e);J=e.style;delete e.style;G(x.element,B?\"mouseover\":\"mouseenter\",function(){3!==n&&x.setState(1)});G(x.element,B?\"mouseout\":\"mouseleave\",function(){3!==n&&x.setState(n)});x.setState=function(a){1!==a&&(x.state=n=a);x.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass(\"highcharts-button-\"+[\"normal\",\"hover\",\"pressed\",\"disabled\"][a||0]);x.attr([l,r,d,e][a||0]).css([E,y,w,J][a||0])};x.attr(l).css(c({cursor:\"default\"},\nE));return x.on(\"click\",function(a){3!==n&&b.call(x,a)})},crispLine:function(a,f){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-f%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+f%2/2);return a},path:function(a){var f={fill:\"none\"};H(a)?f.d=a:r(a)&&c(f,a);return this.createElement(\"path\").attr(f)},circle:function(a,f,t){a=r(a)?a:{x:a,y:f,r:t};f=this.createElement(\"circle\");f.xSetter=f.ySetter=function(a,f,t){t.setAttribute(\"c\"+f,a)};return f.attr(a)},arc:function(a,f,t,b,l,c){r(a)?(b=a,f=b.y,t=b.r,a=b.x):\nb={innerR:b,start:l,end:c};a=this.symbol(\"arc\",a,f,t,t,b);a.r=t;return a},rect:function(a,f,t,b,l,c){l=r(a)?a.r:l;var x=this.createElement(\"rect\");a=r(a)?a:void 0===a?{}:{x:a,y:f,width:Math.max(t,0),height:Math.max(b,0)};void 0!==c&&(a.strokeWidth=c,a=x.crisp(a));a.fill=\"none\";l&&(a.r=l);x.rSetter=function(a,f,t){m(t,{rx:a,ry:a})};return x.attr(a)},setSize:function(a,f,t){var b=this.alignedObjects,l=b.length;this.width=a;this.height=f;for(this.boxWrapper.animate({width:a,height:f},{step:function(){this.attr({viewBox:\"0 0 \"+\nthis.attr(\"width\")+\" \"+this.attr(\"height\")})},duration:L(t,!0)?void 0:0});l--;)b[l].align()},g:function(a){var f=this.createElement(\"g\");return a?f.attr({\"class\":\"highcharts-\"+a}):f},image:function(a,f,t,b,l){var x={preserveAspectRatio:\"none\"};1<arguments.length&&c(x,{x:f,y:t,width:b,height:l});x=this.createElement(\"image\").attr(x);x.element.setAttributeNS?x.element.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",a):x.element.setAttribute(\"hc-svg-href\",a);return x},symbol:function(a,f,t,b,l,\nr){var x=this,p,e=/^url\\((.*?)\\)$/,h=e.test(a),E=!h&&(this.symbols[a]?a:\"circle\"),y=E&&this.symbols[E],B=u(f)&&y&&y.call(this.symbols,Math.round(f),Math.round(t),b,l,r),w,J;y?(p=this.path(B),p.attr(\"fill\",\"none\"),c(p,{symbolName:E,x:f,y:t,width:b,height:l}),r&&c(p,r)):h&&(w=a.match(e)[1],p=this.image(w),p.imgwidth=L(O[w]&&O[w].width,r&&r.width),p.imgheight=L(O[w]&&O[w].height,r&&r.height),J=function(){p.attr({width:p.width,height:p.height})},d([\"width\",\"height\"],function(a){p[a+\"Setter\"]=function(a,\nf){var t={},b=this[\"img\"+f],l=\"width\"===f?\"translateX\":\"translateY\";this[f]=a;u(b)&&(this.element&&this.element.setAttribute(f,b),this.alignByTranslate||(t[l]=((this[f]||0)-b)/2,this.attr(t)))}}),u(f)&&p.attr({x:f,y:t}),p.isImg=!0,u(p.imgwidth)&&u(p.imgheight)?J():(p.attr({width:0,height:0}),v(\"img\",{onload:function(){var a=g[x.chartIndex];0===this.width&&(q(this,{position:\"absolute\",top:\"-999em\"}),n.body.appendChild(this));O[w]={width:this.width,height:this.height};p.imgwidth=this.width;p.imgheight=\nthis.height;p.element&&J();this.parentNode&&this.parentNode.removeChild(this);x.imgCount--;if(!x.imgCount&&a&&a.onload)a.onload()},src:w}),this.imgCount++));return p},symbols:{circle:function(a,f,t,b){return this.arc(a+t/2,f+b/2,t/2,b/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,f,t,b){return[\"M\",a,f,\"L\",a+t,f,a+t,f+b,a,f+b,\"Z\"]},triangle:function(a,f,t,b){return[\"M\",a+t/2,f,\"L\",a+t,f+b,a,f+b,\"Z\"]},\"triangle-down\":function(a,f,t,b){return[\"M\",a,f,\"L\",a+t,f,a+t/2,f+b,\"Z\"]},diamond:function(a,\nf,t,b){return[\"M\",a+t/2,f,\"L\",a+t,f+b/2,a+t/2,f+b,a,f+b/2,\"Z\"]},arc:function(a,f,t,b,l){var c=l.start,x=l.r||t,r=l.r||b||t,p=l.end-.001;t=l.innerR;b=l.open;var d=Math.cos(c),e=Math.sin(c),h=Math.cos(p),p=Math.sin(p);l=l.end-c<Math.PI?0:1;x=[\"M\",a+x*d,f+r*e,\"A\",x,r,0,l,1,a+x*h,f+r*p];u(t)&&x.push(b?\"M\":\"L\",a+t*h,f+t*p,\"A\",t,t,0,l,0,a+t*d,f+t*e);x.push(b?\"\":\"Z\");return x},callout:function(a,f,t,b,l){var c=Math.min(l&&l.r||0,t,b),r=c+6,p=l&&l.anchorX;l=l&&l.anchorY;var d;d=[\"M\",a+c,f,\"L\",a+t-c,f,\"C\",\na+t,f,a+t,f,a+t,f+c,\"L\",a+t,f+b-c,\"C\",a+t,f+b,a+t,f+b,a+t-c,f+b,\"L\",a+c,f+b,\"C\",a,f+b,a,f+b,a,f+b-c,\"L\",a,f+c,\"C\",a,f,a,f,a+c,f];p&&p>t?l>f+r&&l<f+b-r?d.splice(13,3,\"L\",a+t,l-6,a+t+6,l,a+t,l+6,a+t,f+b-c):d.splice(13,3,\"L\",a+t,b/2,p,l,a+t,b/2,a+t,f+b-c):p&&0>p?l>f+r&&l<f+b-r?d.splice(33,3,\"L\",a,l+6,a-6,l,a,l-6,a,f+c):d.splice(33,3,\"L\",a,b/2,p,l,a,b/2,a,f+c):l&&l>b&&p>a+r&&p<a+t-r?d.splice(23,3,\"L\",p+6,f+b,p,f+b+6,p-6,f+b,a+c,f+b):l&&0>l&&p>a+r&&p<a+t-r&&d.splice(3,3,\"L\",p-6,f,p,f-6,p+6,f,t-c,f);return d}},\nclipRect:function(f,t,b,l){var c=a.uniqueKey(),r=this.createElement(\"clipPath\").attr({id:c}).add(this.defs);f=this.rect(f,t,b,l,0).add(r);f.id=c;f.clipPath=r;f.count=0;return f},text:function(a,f,t,b){var l=!J&&this.forExport,c={};if(b&&(this.allowHTML||!this.forExport))return this.html(a,f,t);c.x=Math.round(f||0);t&&(c.y=Math.round(t));if(a||0===a)c.text=a;a=this.createElement(\"text\").attr(c);l&&a.css({position:\"absolute\"});b||(a.xSetter=function(a,f,t){var b=t.getElementsByTagName(\"tspan\"),l,c=\nt.getAttribute(f),r;for(r=0;r<b.length;r++)l=b[r],l.getAttribute(f)===c&&l.setAttribute(f,a);t.setAttribute(f,a)});return a},fontMetrics:function(a,t){a=a||t&&t.style&&t.style.fontSize||this.style&&this.style.fontSize;a=/px/.test(a)?f(a):/em/.test(a)?parseFloat(a)*(t?this.fontMetrics(null,t.parentNode).f:16):12;t=24>a?a+3:Math.round(1.2*a);return{h:t,b:Math.round(.8*t),f:a}},rotCorr:function(a,f,t){var b=a;f&&t&&(b=Math.max(b*Math.cos(f*h),4));return{x:-a/3*Math.sin(f*h),y:b}},label:function(f,b,\nl,r,e,h,n,E,y){var x=this,B=x.g(\"button\"!==y&&\"label\"),w=B.text=x.text(\"\",0,0,n).attr({zIndex:1}),J,g,I=0,z=3,D=0,q,k,m,R,H,v={},N,M,L=/^url\\((.*?)\\)$/.test(r),Q=L,V,U,O,P;y&&B.addClass(\"highcharts-\"+y);Q=L;V=function(){return(N||0)%2/2};U=function(){var a=w.element.style,f={};g=(void 0===q||void 0===k||H)&&u(w.textStr)&&w.getBBox();B.width=(q||g.width||0)+2*z+D;B.height=(k||g.height||0)+2*z;M=z+x.fontMetrics(a&&a.fontSize,w).b;Q&&(J||(B.box=J=x.symbols[r]||L?x.symbol(r):x.rect(),J.addClass((\"button\"===\ny?\"\":\"highcharts-label-box\")+(y?\" highcharts-\"+y+\"-box\":\"\")),J.add(B),a=V(),f.x=a,f.y=(E?-M:0)+a),f.width=Math.round(B.width),f.height=Math.round(B.height),J.attr(c(f,v)),v={})};O=function(){var a=D+z,f;f=E?0:M;u(q)&&g&&(\"center\"===H||\"right\"===H)&&(a+={center:.5,right:1}[H]*(q-g.width));if(a!==w.x||f!==w.y)w.attr(\"x\",a),void 0!==f&&w.attr(\"y\",f);w.x=a;w.y=f};P=function(a,f){J?J.attr(a,f):v[a]=f};B.onAdd=function(){w.add(B);B.attr({text:f||0===f?f:\"\",x:b,y:l});J&&u(e)&&B.attr({anchorX:e,anchorY:h})};\nB.widthSetter=function(f){q=a.isNumber(f)?f:null};B.heightSetter=function(a){k=a};B[\"text-alignSetter\"]=function(a){H=a};B.paddingSetter=function(a){u(a)&&a!==z&&(z=B.padding=a,O())};B.paddingLeftSetter=function(a){u(a)&&a!==D&&(D=a,O())};B.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==I&&(I=a,g&&B.attr({x:m}))};B.textSetter=function(a){void 0!==a&&w.textSetter(a);U();O()};B[\"stroke-widthSetter\"]=function(a,f){a&&(Q=!0);N=this[\"stroke-width\"]=a;P(f,a)};B.strokeSetter=B.fillSetter=B.rSetter=\nfunction(a,f){\"fill\"===f&&a&&(Q=!0);P(f,a)};B.anchorXSetter=function(a,f){e=B.anchorX=a;P(f,Math.round(a)-V()-m)};B.anchorYSetter=function(a,f){h=B.anchorY=a;P(f,a-R)};B.xSetter=function(a){B.x=a;I&&(a-=I*((q||g.width)+2*z));m=Math.round(a);B.attr(\"translateX\",m)};B.ySetter=function(a){R=B.y=Math.round(a);B.attr(\"translateY\",R)};var W=B.css;return c(B,{css:function(a){if(a){var f={};a=p(a);d(B.textProps,function(t){void 0!==a[t]&&(f[t]=a[t],delete a[t])});w.css(f)}return W.call(B,a)},getBBox:function(){return{width:g.width+\n2*z,height:g.height+2*z,x:g.x-z,y:g.y-z}},shadow:function(a){a&&(U(),J&&J.shadow(a));return B},destroy:function(){t(B.element,\"mouseenter\");t(B.element,\"mouseleave\");w&&(w=w.destroy());J&&(J=J.destroy());C.prototype.destroy.call(B);B=x=U=O=P=null}})}});a.Renderer=A})(K);(function(a){var C=a.attr,A=a.createElement,G=a.css,F=a.defined,m=a.each,g=a.extend,k=a.isFirefox,q=a.isMS,v=a.isWebKit,u=a.pInt,h=a.SVGRenderer,e=a.win,n=a.wrap;g(a.SVGElement.prototype,{htmlCss:function(a){var c=this.element;if(c=\na&&\"SPAN\"===c.tagName&&a.width)delete a.width,this.textWidth=c,this.updateTransform();a&&\"ellipsis\"===a.textOverflow&&(a.whiteSpace=\"nowrap\",a.overflow=\"hidden\");this.styles=g(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;\"text\"===a.nodeName&&(a.style.position=\"absolute\");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,c=this.element,e=this.translateX||0,b=this.translateY||\n0,h=this.x||0,n=this.y||0,g=this.textAlign||\"left\",l={left:0,center:.5,right:1}[g],B=this.styles;G(c,{marginLeft:e,marginTop:b});this.shadows&&m(this.shadows,function(a){G(a,{marginLeft:e+1,marginTop:b+1})});this.inverted&&m(c.childNodes,function(b){a.invertChild(b,c)});if(\"SPAN\"===c.tagName){var r=this.rotation,z=u(this.textWidth),q=B&&B.whiteSpace,p=[r,g,c.innerHTML,this.textWidth,this.textAlign].join();p!==this.cTT&&(B=a.fontMetrics(c.style.fontSize).b,F(r)&&this.setSpanRotation(r,l,B),G(c,{width:\"\",\nwhiteSpace:q||\"nowrap\"}),c.offsetWidth>z&&/[ \\-]/.test(c.textContent||c.innerText)&&G(c,{width:z+\"px\",display:\"block\",whiteSpace:q||\"normal\"}),this.getSpanCorrection(c.offsetWidth,B,l,r,g));G(c,{left:h+(this.xCorr||0)+\"px\",top:n+(this.yCorr||0)+\"px\"});v&&(B=c.offsetHeight);this.cTT=p}}else this.alignOnAdd=!0},setSpanRotation:function(a,c,h){var b={},d=q?\"-ms-transform\":v?\"-webkit-transform\":k?\"MozTransform\":e.opera?\"-o-transform\":\"\";b[d]=b.transform=\"rotate(\"+a+\"deg)\";b[d+(k?\"Origin\":\"-origin\")]=\nb.transformOrigin=100*c+\"% \"+h+\"px\";G(this.element,b)},getSpanCorrection:function(a,c,e){this.xCorr=-a*e;this.yCorr=-c}});g(h.prototype,{html:function(a,c,e){var b=this.createElement(\"span\"),d=b.element,h=b.renderer,w=h.isSVG,l=function(a,b){m([\"opacity\",\"visibility\"],function(l){n(a,l+\"Setter\",function(a,l,c,r){a.call(this,l,c,r);b[c]=l})})};b.textSetter=function(a){a!==d.innerHTML&&delete this.bBox;d.innerHTML=this.textStr=a;b.htmlUpdateTransform()};w&&l(b,b.element.style);b.xSetter=b.ySetter=b.alignSetter=\nb.rotationSetter=function(a,l){\"align\"===l&&(l=\"textAlign\");b[l]=a;b.htmlUpdateTransform()};b.attr({text:a,x:Math.round(c),y:Math.round(e)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:\"absolute\"});d.style.whiteSpace=\"nowrap\";b.css=b.htmlCss;w&&(b.add=function(a){var c,e=h.box.parentNode,B=[];if(this.parentGroup=a){if(c=a.div,!c){for(;a;)B.push(a),a=a.parentGroup;m(B.reverse(),function(a){var r,p=C(a.element,\"class\");p&&(p={className:p});c=a.div=a.div||A(\"div\",p,{position:\"absolute\",\nleft:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},c||e);r=c.style;g(a,{on:function(){b.on.apply({element:B[0].div},arguments);return a},translateXSetter:function(b,f){r.left=b+\"px\";a[f]=b;a.doTransform=!0},translateYSetter:function(b,f){r.top=b+\"px\";a[f]=b;a.doTransform=!0}});l(a,r)})}}else c=e;c.appendChild(d);b.added=!0;b.alignOnAdd&&b.htmlUpdateTransform();return b});return b}})})(K);(function(a){var C,A,G=\na.createElement,F=a.css,m=a.defined,g=a.deg2rad,k=a.discardElement,q=a.doc,v=a.each,u=a.erase,h=a.extend;C=a.extendClass;var e=a.isArray,n=a.isNumber,d=a.isObject,c=a.merge;A=a.noop;var w=a.pick,b=a.pInt,y=a.SVGElement,D=a.SVGRenderer,H=a.win;a.svg||(A={docMode8:q&&8===q.documentMode,init:function(a,b){var l=[\"\\x3c\",b,' filled\\x3d\"f\" stroked\\x3d\"f\"'],c=[\"position: \",\"absolute\",\";\"],d=\"div\"===b;(\"shape\"===b||d)&&c.push(\"left:0;top:0;width:1px;height:1px;\");c.push(\"visibility: \",d?\"hidden\":\"visible\");\nl.push(' style\\x3d\"',c.join(\"\"),'\"/\\x3e');b&&(l=d||\"span\"===b||\"img\"===b?l.join(\"\"):a.prepVML(l),this.element=G(l));this.renderer=a},add:function(a){var b=this.renderer,l=this.element,c=b.box,d=a&&a.inverted,c=a?a.element||a:c;a&&(this.parentGroup=a);d&&b.invertChild(l,c);c.appendChild(l);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr(\"class\",this.className);return this},updateTransform:y.prototype.htmlUpdateTransform,\nsetSpanRotation:function(){var a=this.rotation,b=Math.cos(a*g),c=Math.sin(a*g);F(this.element,{filter:a?[\"progid:DXImageTransform.Microsoft.Matrix(M11\\x3d\",b,\", M12\\x3d\",-c,\", M21\\x3d\",c,\", M22\\x3d\",b,\", sizingMethod\\x3d'auto expand')\"].join(\"\"):\"none\"})},getSpanCorrection:function(a,b,c,d,e){var l=d?Math.cos(d*g):1,r=d?Math.sin(d*g):0,h=w(this.elemHeight,this.element.offsetHeight),n;this.xCorr=0>l&&-a;this.yCorr=0>r&&-h;n=0>l*r;this.xCorr+=r*b*(n?1-c:c);this.yCorr-=l*b*(d?n?c:1-c:1);e&&\"left\"!==\ne&&(this.xCorr-=a*c*(0>l?-1:1),d&&(this.yCorr-=h*c*(0>r?-1:1)),F(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,l=[];b--;)n(a[b])?l[b]=Math.round(10*a[b])-5:\"Z\"===a[b]?l[b]=\"x\":(l[b]=a[b],!a.isArc||\"wa\"!==a[b]&&\"at\"!==a[b]||(l[b+5]===l[b+7]&&(l[b+7]+=a[b+7]>a[b+5]?1:-1),l[b+6]===l[b+8]&&(l[b+8]+=a[b+8]>a[b+6]?1:-1)));return l.join(\" \")||\"x\"},clip:function(a){var b=this,l;a?(l=a.members,u(l,b),l.push(b),b.destroyClip=function(){u(l,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),\na={clip:b.docMode8?\"inherit\":\"rect(auto)\"});return b.css(a)},css:y.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&k(a)},destroy:function(){this.destroyClip&&this.destroyClip();return y.prototype.destroy.apply(this)},on:function(a,b){this.element[\"on\"+a]=function(){var a=H.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,c){var l;a=a.split(/[ ,]/);l=a.length;if(9===l||11===l)a[l-4]=a[l-2]=b(a[l-2])-10*c;return a.join(\" \")},shadow:function(a,c,d){var l=[],r,p=this.element,\ne=this.renderer,h,n=p.style,f,t=p.path,y,J,g,B;t&&\"string\"!==typeof t.value&&(t=\"x\");J=t;if(a){g=w(a.width,3);B=(a.opacity||.15)/g;for(r=1;3>=r;r++)y=2*g+1-2*r,d&&(J=this.cutOffPath(t.value,y+.5)),f=['\\x3cshape isShadow\\x3d\"true\" strokeweight\\x3d\"',y,'\" filled\\x3d\"false\" path\\x3d\"',J,'\" coordsize\\x3d\"10 10\" style\\x3d\"',p.style.cssText,'\" /\\x3e'],h=G(e.prepVML(f),null,{left:b(n.left)+w(a.offsetX,1),top:b(n.top)+w(a.offsetY,1)}),d&&(h.cutOff=y+1),f=['\\x3cstroke color\\x3d\"',a.color||\"#000000\",'\" opacity\\x3d\"',\nB*r,'\"/\\x3e'],G(e.prepVML(f),null,null,h),c?c.element.appendChild(h):p.parentNode.insertBefore(h,p),l.push(h);this.shadows=l}return this},updateShadows:A,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,c){(c.getElementsByTagName(\"stroke\")[0]||G(this.renderer.prepVML([\"\\x3cstroke/\\x3e\"]),null,null,c))[b]=a||\"solid\";this[b]=a},dSetter:function(a,b,c){var l=this.shadows;\na=a||[];this.d=a.join&&a.join(\" \");c.path=a=this.pathToVML(a);if(l)for(c=l.length;c--;)l[c].path=l[c].cutOff?this.cutOffPath(a,l[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var l=c.nodeName;\"SPAN\"===l?c.style.color=a:\"IMG\"!==l&&(c.filled=\"none\"!==a,this.setAttr(\"fillcolor\",this.renderer.color(a,c,b,this)))},\"fill-opacitySetter\":function(a,b,c){G(this.renderer.prepVML([\"\\x3c\",b.split(\"-\")[0],' opacity\\x3d\"',a,'\"/\\x3e']),null,null,c)},opacitySetter:A,rotationSetter:function(a,b,c){c=\nc.style;this[b]=c[b]=a;c.left=-Math.round(Math.sin(a*g)+1)+\"px\";c.top=Math.round(Math.cos(a*g))+\"px\"},strokeSetter:function(a,b,c){this.setAttr(\"strokecolor\",this.renderer.color(a,c,b,this))},\"stroke-widthSetter\":function(a,b,c){c.stroked=!!a;this[b]=a;n(a)&&(a+=\"px\");this.setAttr(\"strokeweight\",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){\"inherit\"===a&&(a=\"visible\");this.shadows&&v(this.shadows,function(c){c.style[b]=a});\"DIV\"===c.nodeName&&(a=\"hidden\"===a?\"-999em\":\n0,this.docMode8||(c.style[b]=a?\"visible\":\"hidden\"),b=\"top\");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;\"x\"===b?b=\"left\":\"y\"===b&&(b=\"top\");this.updateClipping?(this[b]=a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,b,c){c.style[b]=a}},A[\"stroke-opacitySetter\"]=A[\"fill-opacitySetter\"],a.VMLElement=A=C(y,A),A.prototype.ySetter=A.prototype.widthSetter=A.prototype.heightSetter=A.prototype.xSetter,A={Element:A,isIE8:-1<H.navigator.userAgent.indexOf(\"MSIE 8.0\"),init:function(a,b,c){var l,\nd;this.alignedObjects=[];l=this.createElement(\"div\").css({position:\"relative\"});d=l.element;a.appendChild(l.element);this.isVML=!0;this.box=d;this.boxWrapper=l;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(b,c,!1);if(!q.namespaces.hcv){q.namespaces.add(\"hcv\",\"urn:schemas-microsoft-com:vml\");try{q.createStyleSheet().cssText=\"hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke{ behavior:url(#default#VML); display: inline-block; } \"}catch(p){q.styleSheets[0].cssText+=\"hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke{ behavior:url(#default#VML); display: inline-block; } \"}}},\nisHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,e){var l=this.createElement(),p=d(a);return h(l,{members:[],count:0,left:(p?a.x:a)+1,top:(p?a.y:b)+1,width:(p?a.width:c)-1,height:(p?a.height:e)-1,getCSS:function(a){var b=a.element,c=b.nodeName,f=a.inverted,t=this.top-(\"shape\"===c?b.offsetTop:0),l=this.left,b=l+this.width,p=t+this.height,t={clip:\"rect(\"+Math.round(f?l:t)+\"px,\"+Math.round(f?p:b)+\"px,\"+Math.round(f?b:p)+\"px,\"+Math.round(f?t:l)+\"px)\"};!f&&a.docMode8&&\"DIV\"===c&&\nh(t,{width:b+\"px\",height:p+\"px\"});return t},updateClipping:function(){v(l.members,function(a){a.element&&a.css(l.getCSS(a))})}})},color:function(b,c,d,e){var l=this,p,r=/^rgba/,h,n,f=\"none\";b&&b.linearGradient?n=\"gradient\":b&&b.radialGradient&&(n=\"pattern\");if(n){var t,y,w=b.linearGradient||b.radialGradient,g,q,B,x,D,z=\"\";b=b.stops;var k,m=[],u=function(){h=['\\x3cfill colors\\x3d\"'+m.join(\",\")+'\" opacity\\x3d\"',B,'\" o:opacity2\\x3d\"',q,'\" type\\x3d\"',n,'\" ',z,'focus\\x3d\"100%\" method\\x3d\"any\" /\\x3e'];\nG(l.prepVML(h),null,null,c)};g=b[0];k=b[b.length-1];0<g[0]&&b.unshift([0,g[1]]);1>k[0]&&b.push([1,k[1]]);v(b,function(f,b){r.test(f[1])?(p=a.color(f[1]),t=p.get(\"rgb\"),y=p.get(\"a\")):(t=f[1],y=1);m.push(100*f[0]+\"% \"+t);b?(B=y,x=t):(q=y,D=t)});if(\"fill\"===d)if(\"gradient\"===n)d=w.x1||w[0]||0,b=w.y1||w[1]||0,g=w.x2||w[2]||0,w=w.y2||w[3]||0,z='angle\\x3d\"'+(90-180*Math.atan((w-b)/(g-d))/Math.PI)+'\"',u();else{var f=w.r,H=2*f,A=2*f,C=w.cx,F=w.cy,T=c.radialReference,K,f=function(){T&&(K=e.getBBox(),C+=(T[0]-\nK.x)/K.width-.5,F+=(T[1]-K.y)/K.height-.5,H*=T[2]/K.width,A*=T[2]/K.height);z='src\\x3d\"'+a.getOptions().global.VMLRadialGradientURL+'\" size\\x3d\"'+H+\",\"+A+'\" origin\\x3d\"0.5,0.5\" position\\x3d\"'+C+\",\"+F+'\" color2\\x3d\"'+D+'\" ';u()};e.added?f():e.onAdd=f;f=x}else f=t}else r.test(b)&&\"IMG\"!==c.tagName?(p=a.color(b),e[d+\"-opacitySetter\"](p.get(\"a\"),d,c),f=p.get(\"rgb\")):(f=c.getElementsByTagName(d),f.length&&(f[0].opacity=1,f[0].type=\"solid\"),f=b);return f},prepVML:function(a){var b=this.isIE8;a=a.join(\"\");\nb?(a=a.replace(\"/\\x3e\",' xmlns\\x3d\"urn:schemas-microsoft-com:vml\" /\\x3e'),a=-1===a.indexOf('style\\x3d\"')?a.replace(\"/\\x3e\",' style\\x3d\"display:inline-block;behavior:url(#default#VML);\" /\\x3e'):a.replace('style\\x3d\"','style\\x3d\"display:inline-block;behavior:url(#default#VML);')):a=a.replace(\"\\x3c\",\"\\x3chcv:\");return a},text:D.prototype.html,path:function(a){var b={coordsize:\"10 10\"};e(a)?b.d=a:d(a)&&h(b,a);return this.createElement(\"shape\").attr(b)},circle:function(a,b,c){var l=this.symbol(\"circle\");\nd(a)&&(c=a.r,b=a.y,a=a.x);l.isCircle=!0;l.r=c;return l.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:\"highcharts-\"+a,\"class\":\"highcharts-\"+a});return this.createElement(\"div\").attr(b)},image:function(a,b,c,d,e){var l=this.createElement(\"img\").attr({src:a});1<arguments.length&&l.attr({x:b,y:c,width:d,height:e});return l},createElement:function(a){return\"rect\"===a?this.symbol(a):D.prototype.createElement.call(this,a)},invertChild:function(a,c){var d=this;c=c.style;var l=\"IMG\"===a.tagName&&a.style;\nF(a,{flip:\"x\",left:b(c.width)-(l?b(l.top):1),top:b(c.height)-(l?b(l.left):1),rotation:-90});v(a.childNodes,function(b){d.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var p=e.start,l=e.end,r=e.r||c||d;c=e.innerR;d=Math.cos(p);var h=Math.sin(p),f=Math.cos(l),t=Math.sin(l);if(0===l-p)return[\"x\"];p=[\"wa\",a-r,b-r,a+r,b+r,a+r*d,b+r*h,a+r*f,b+r*t];e.open&&!c&&p.push(\"e\",\"M\",a,b);p.push(\"at\",a-c,b-c,a+c,b+c,a+c*f,b+c*t,a+c*d,b+c*h,\"x\",\"e\");p.isArc=!0;return p},circle:function(a,b,c,d,e){e&&m(e.r)&&\n(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return[\"wa\",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,\"e\"]},rect:function(a,b,c,d,e){return D.prototype.symbols[m(e)&&e.r?\"callout\":\"square\"].call(0,a,b,c,d,e)}}},a.VMLRenderer=C=function(){this.init.apply(this,arguments)},C.prototype=c(D.prototype,A),a.Renderer=C);D.prototype.measureSpanWidth=function(a,b){var c=q.createElement(\"span\");a=q.createTextNode(a);c.appendChild(a);F(c,b);this.box.appendChild(c);b=c.offsetWidth;k(c);return b}})(K);(function(a){function C(){var g=\na.defaultOptions.global,k=q.moment;if(g.timezone){if(k)return function(a){return-k.tz(a,g.timezone).utcOffset()};a.error(25)}return g.useUTC&&g.getTimezoneOffset}function A(){var g=a.defaultOptions.global,u,h=g.useUTC,e=h?\"getUTC\":\"get\",n=h?\"setUTC\":\"set\";a.Date=u=g.Date||q.Date;u.hcTimezoneOffset=h&&g.timezoneOffset;u.hcGetTimezoneOffset=C();u.hcMakeTime=function(a,c,e,b,n,g){var d;h?(d=u.UTC.apply(0,arguments),d+=m(d)):d=(new u(a,c,k(e,1),k(b,0),k(n,0),k(g,0))).getTime();return d};F(\"Minutes Hours Day Date Month FullYear\".split(\" \"),\nfunction(a){u[\"hcGet\"+a]=e+a});F(\"Milliseconds Seconds Minutes Hours Date Month FullYear\".split(\" \"),function(a){u[\"hcSet\"+a]=n+a})}var G=a.color,F=a.each,m=a.getTZOffset,g=a.merge,k=a.pick,q=a.win;a.defaultOptions={colors:\"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1\".split(\" \"),symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January February March April May June July August September October November December\".split(\" \"),\nshortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),weekdays:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),decimalPoint:\".\",numericSymbols:\"kMGTPE\".split(\"\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{useUTC:!0,VMLRadialGradientURL:\"http://code.highcharts.com/5.0.12/gfx/vml-radial-gradient.png\"},chart:{borderRadius:0,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:20},\nposition:{align:\"right\",x:-10,y:10}},width:null,height:null,borderColor:\"#335cad\",backgroundColor:\"#ffffff\",plotBorderColor:\"#cccccc\"},title:{text:\"Chart title\",align:\"center\",margin:15,widthAdjust:-44},subtitle:{text:\"\",align:\"center\",widthAdjust:-44},plotOptions:{},labels:{style:{position:\"absolute\",color:\"#333333\"}},legend:{enabled:!0,align:\"center\",layout:\"horizontal\",labelFormatter:function(){return this.name},borderColor:\"#999999\",borderRadius:0,navigation:{activeColor:\"#003399\",inactiveColor:\"#cccccc\"},\nitemStyle:{color:\"#333333\",fontSize:\"12px\",fontWeight:\"bold\",textOverflow:\"ellipsis\"},itemHoverStyle:{color:\"#000000\"},itemHiddenStyle:{color:\"#cccccc\"},shadow:!1,itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},squareSymbol:!0,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",position:\"relative\",top:\"45%\"},style:{position:\"absolute\",backgroundColor:\"#ffffff\",opacity:.5,textAlign:\"center\"}},tooltip:{enabled:!0,\nanimation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},footerFormat:\"\",padding:8,snap:a.isTouchDevice?25:10,backgroundColor:G(\"#f7f7f7\").setOpacity(.85).get(),borderWidth:1,headerFormat:'\\x3cspan style\\x3d\"font-size: 10px\"\\x3e{point.key}\\x3c/span\\x3e\\x3cbr/\\x3e',pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3e',\nshadow:!0,style:{color:\"#333333\",cursor:\"default\",fontSize:\"12px\",pointerEvents:\"none\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,href:\"http://www.highcharts.com\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:\"#999999\",fontSize:\"9px\"},text:\"Highcharts.com\"}};a.setOptions=function(q){a.defaultOptions=g(!0,a.defaultOptions,q);A();return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;A()})(K);\n(function(a){var C=a.correctFloat,A=a.defined,G=a.destroyObjectProperties,F=a.isNumber,m=a.merge,g=a.pick,k=a.deg2rad;a.Tick=function(a,g,k,h){this.axis=a;this.pos=g;this.type=k||\"\";this.isNewLabel=this.isNew=!0;k||h||this.addLabel()};a.Tick.prototype={addLabel:function(){var a=this.axis,k=a.options,u=a.chart,h=a.categories,e=a.names,n=this.pos,d=k.labels,c=a.tickPositions,w=n===c[0],b=n===c[c.length-1],e=h?g(h[n],e[n],n):n,h=this.label,c=c.info,y;a.isDatetimeAxis&&c&&(y=k.dateTimeLabelFormats[c.higherRanks[n]||\nc.unitName]);this.isFirst=w;this.isLast=b;k=a.labelFormatter.call({axis:a,chart:u,isFirst:w,isLast:b,dateTimeLabelFormat:y,value:a.isLog?C(a.lin2log(e)):e});A(h)?h&&h.attr({text:k}):(this.labelLength=(this.label=h=A(k)&&d.enabled?u.renderer.text(k,0,0,d.useHTML).css(m(d.style)).add(a.labelGroup):null)&&h.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0},handleOverflow:function(a){var q=this.axis,m=a.x,h=q.chart.chartWidth,\ne=q.chart.spacing,n=g(q.labelLeft,Math.min(q.pos,e[3])),e=g(q.labelRight,Math.max(q.pos+q.len,h-e[1])),d=this.label,c=this.rotation,w={left:0,center:.5,right:1}[q.labelAlign],b=d.getBBox().width,y=q.getSlotWidth(),D=y,H=1,l,B={};if(c)0>c&&m-w*b<n?l=Math.round(m/Math.cos(c*k)-n):0<c&&m+w*b>e&&(l=Math.round((h-m)/Math.cos(c*k)));else if(h=m+(1-w)*b,m-w*b<n?D=a.x+D*(1-w)-n:h>e&&(D=e-a.x+D*w,H=-1),D=Math.min(y,D),D<y&&\"center\"===q.labelAlign&&(a.x+=H*(y-D-w*(y-Math.min(b,D)))),b>D||q.autoRotation&&(d.styles||\n{}).width)l=D;l&&(B.width=l,(q.options.labels.style||{}).textOverflow||(B.textOverflow=\"ellipsis\"),d.css(B))},getPosition:function(a,g,k,h){var e=this.axis,n=e.chart,d=h&&n.oldChartHeight||n.chartHeight;return{x:a?e.translate(g+k,null,null,h)+e.transB:e.left+e.offset+(e.opposite?(h&&n.oldChartWidth||n.chartWidth)-e.right-e.left:0),y:a?d-e.bottom+e.offset-(e.opposite?e.height:0):d-e.translate(g+k,null,null,h)-e.transB}},getLabelPosition:function(a,g,m,h,e,n,d,c){var w=this.axis,b=w.transA,y=w.reversed,\nD=w.staggerLines,q=w.tickRotCorr||{x:0,y:0},l=e.y;A(l)||(l=0===w.side?m.rotation?-8:-m.getBBox().height:2===w.side?q.y+8:Math.cos(m.rotation*k)*(q.y-m.getBBox(!1,0).height/2));a=a+e.x+q.x-(n&&h?n*b*(y?-1:1):0);g=g+l-(n&&!h?n*b*(y?1:-1):0);D&&(m=d/(c||1)%D,w.opposite&&(m=D-m-1),g+=w.labelOffset/D*m);return{x:a,y:Math.round(g)}},getMarkPath:function(a,g,k,h,e,n){return n.crispLine([\"M\",a,g,\"L\",a+(e?0:-k),g+(e?k:0)],h)},renderGridLine:function(a,g,k){var h=this.axis,e=h.options,n=this.gridLine,d={},\nc=this.pos,w=this.type,b=h.tickmarkOffset,y=h.chart.renderer,D=w?w+\"Grid\":\"grid\",q=e[D+\"LineWidth\"],l=e[D+\"LineColor\"],e=e[D+\"LineDashStyle\"];n||(d.stroke=l,d[\"stroke-width\"]=q,e&&(d.dashstyle=e),w||(d.zIndex=1),a&&(d.opacity=0),this.gridLine=n=y.path().attr(d).addClass(\"highcharts-\"+(w?w+\"-\":\"\")+\"grid-line\").add(h.gridGroup));if(!a&&n&&(a=h.getPlotLinePath(c+b,n.strokeWidth()*k,a,!0)))n[this.isNew?\"attr\":\"animate\"]({d:a,opacity:g})},renderMark:function(a,k,m){var h=this.axis,e=h.options,n=h.chart.renderer,\nd=this.type,c=d?d+\"Tick\":\"tick\",w=h.tickSize(c),b=this.mark,y=!b,D=a.x;a=a.y;var q=g(e[c+\"Width\"],!d&&h.isXAxis?1:0),e=e[c+\"Color\"];w&&(h.opposite&&(w[0]=-w[0]),y&&(this.mark=b=n.path().addClass(\"highcharts-\"+(d?d+\"-\":\"\")+\"tick\").add(h.axisGroup),b.attr({stroke:e,\"stroke-width\":q})),b[y?\"attr\":\"animate\"]({d:this.getMarkPath(D,a,w[0],b.strokeWidth()*m,h.horiz,n),opacity:k}))},renderLabel:function(a,k,m,h){var e=this.axis,n=e.horiz,d=e.options,c=this.label,w=d.labels,b=w.step,y=e.tickmarkOffset,D=!0,\nq=a.x;a=a.y;c&&F(q)&&(c.xy=a=this.getLabelPosition(q,a,c,n,w,y,h,b),this.isFirst&&!this.isLast&&!g(d.showFirstLabel,1)||this.isLast&&!this.isFirst&&!g(d.showLastLabel,1)?D=!1:!n||e.isRadial||w.step||w.rotation||k||0===m||this.handleOverflow(a),b&&h%b&&(D=!1),D&&F(a.y)?(a.opacity=m,c[this.isNewLabel?\"attr\":\"animate\"](a),this.isNewLabel=!1):(c.attr(\"y\",-9999),this.isNewLabel=!0),this.isNew=!1)},render:function(a,k,m){var h=this.axis,e=h.horiz,n=this.getPosition(e,this.pos,h.tickmarkOffset,k),d=n.x,\nc=n.y,h=e&&d===h.pos+h.len||!e&&c===h.pos?-1:1;m=g(m,1);this.isActive=!0;this.renderGridLine(k,m,h);this.renderMark(n,m,h);this.renderLabel(n,k,m,a)},destroy:function(){G(this,this.axis)}}})(K);var S=function(a){var C=a.addEvent,A=a.animObject,G=a.arrayMax,F=a.arrayMin,m=a.color,g=a.correctFloat,k=a.defaultOptions,q=a.defined,v=a.deg2rad,u=a.destroyObjectProperties,h=a.each,e=a.extend,n=a.fireEvent,d=a.format,c=a.getMagnitude,w=a.grep,b=a.inArray,y=a.isArray,D=a.isNumber,H=a.isString,l=a.merge,B=\na.normalizeTickInterval,r=a.objectEach,z=a.pick,M=a.removeEvent,p=a.splat,E=a.syncTimeout,I=a.Tick,L=function(){this.init.apply(this,arguments)};a.extend(L.prototype,{defaultOptions:{dateTimeLabelFormats:{millisecond:\"%H:%M:%S.%L\",second:\"%H:%M:%S\",minute:\"%H:%M\",hour:\"%H:%M\",day:\"%e. %b\",week:\"%e. %b\",month:\"%b '%y\",year:\"%Y\"},endOnTick:!1,labels:{enabled:!0,style:{color:\"#666666\",cursor:\"default\",fontSize:\"11px\"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:\"outside\",startOfWeek:1,\nstartOnTick:!1,tickLength:10,tickmarkPlacement:\"between\",tickPixelInterval:100,tickPosition:\"outside\",title:{align:\"middle\",style:{color:\"#666666\"}},type:\"linear\",minorGridLineColor:\"#f2f2f2\",minorGridLineWidth:1,minorTickColor:\"#999999\",lineColor:\"#ccd6eb\",lineWidth:1,gridLineColor:\"#e6e6e6\",tickColor:\"#ccd6eb\"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:\"Values\"},stackLabels:{enabled:!1,\nformatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:\"11px\",fontWeight:\"bold\",color:\"#000000\",textOutline:\"1px contrast\"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,t){var f=t.isX,c=this;c.chart=a;c.horiz=\na.inverted&&!c.isZAxis?!f:f;c.isXAxis=f;c.coll=c.coll||(f?\"xAxis\":\"yAxis\");c.opposite=t.opposite;c.side=t.side||(c.horiz?c.opposite?0:2:c.opposite?1:3);c.setOptions(t);var d=this.options,e=d.type;c.labelFormatter=d.labels.formatter||c.defaultLabelFormatter;c.userOptions=t;c.minPixelPadding=0;c.reversed=d.reversed;c.visible=!1!==d.visible;c.zoomEnabled=!1!==d.zoomEnabled;c.hasNames=\"category\"===e||!0===d.categories;c.categories=d.categories||c.hasNames;c.names=c.names||[];c.plotLinesAndBandsGroups=\n{};c.isLog=\"logarithmic\"===e;c.isDatetimeAxis=\"datetime\"===e;c.positiveValuesOnly=c.isLog&&!c.allowNegativeLog;c.isLinked=q(d.linkedTo);c.ticks={};c.labelEdge=[];c.minorTicks={};c.plotLinesAndBands=[];c.alternateBands={};c.len=0;c.minRange=c.userMinRange=d.minRange||d.maxZoom;c.range=d.range;c.offset=d.offset||0;c.stacks={};c.oldStacks={};c.stacksTouched=0;c.max=null;c.min=null;c.crosshair=z(d.crosshair,p(a.options.tooltip.crosshairs)[f?0:1],!1);t=c.options.events;-1===b(c,a.axes)&&(f?a.axes.splice(a.xAxis.length,\n0,c):a.axes.push(c),a[c.coll].push(c));c.series=c.series||[];a.inverted&&!c.isZAxis&&f&&void 0===c.reversed&&(c.reversed=!0);r(t,function(a,f){C(c,f,a)});c.lin2log=d.linearToLogConverter||c.lin2log;c.isLog&&(c.val2lin=c.log2lin,c.lin2val=c.lin2log)},setOptions:function(a){this.options=l(this.defaultOptions,\"yAxis\"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],l(k[this.coll],a))},\ndefaultLabelFormatter:function(){var f=this.axis,b=this.value,c=f.categories,p=this.dateTimeLabelFormat,e=k.lang,l=e.numericSymbols,e=e.numericSymbolMagnitude||1E3,r=l&&l.length,x,h=f.options.labels.format,f=f.isLog?Math.abs(b):f.tickInterval;if(h)x=d(h,this);else if(c)x=b;else if(p)x=a.dateFormat(p,b);else if(r&&1E3<=f)for(;r--&&void 0===x;)c=Math.pow(e,r+1),f>=c&&0===10*b%c&&null!==l[r]&&0!==b&&(x=a.numberFormat(b/c,-1)+l[r]);void 0===x&&(x=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,\n-1,void 0,\"\"));return x},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();h(a.series,function(f){if(f.visible||!b.options.chart.ignoreHiddenSeries){var c=f.options,t=c.threshold,d;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=t&&(t=null);if(a.isXAxis)c=f.xData,c.length&&(f=F(c),D(f)||f instanceof Date||(c=w(c,function(a){return D(a)}),f=F(c)),a.dataMin=Math.min(z(a.dataMin,c[0]),\nf),a.dataMax=Math.max(z(a.dataMax,c[0]),G(c)));else if(f.getExtremes(),d=f.dataMax,f=f.dataMin,q(f)&&q(d)&&(a.dataMin=Math.min(z(a.dataMin,f),f),a.dataMax=Math.max(z(a.dataMax,d),d)),q(t)&&(a.threshold=t),!c.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})},translate:function(a,b,c,d,p,e){var f=this.linkedParent||this,t=1,l=0,r=d?f.oldTransA:f.transA;d=d?f.oldMin:f.min;var h=f.minPixelPadding;p=(f.isOrdinal||f.isBroken||f.isLog&&p)&&f.lin2val;r||(r=f.transA);c&&(t*=-1,l=f.len);f.reversed&&\n(t*=-1,l-=t*(f.sector||f.len));b?(a=(a*t+l-h)/r+d,p&&(a=f.lin2val(a))):(p&&(a=f.val2lin(a)),a=t*(a-d)*r+l+t*h+(D(e)?r*e:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,c,d,p){var f=this.chart,t=this.left,e=this.top,l,r,h=c&&f.oldChartHeight||f.chartHeight,n=c&&f.oldChartWidth||f.chartWidth,w;l=this.transB;var g=function(a,f,b){if(a<\nf||a>b)d?a=Math.min(Math.max(f,a),b):w=!0;return a};p=z(p,this.translate(a,null,null,c));a=c=Math.round(p+l);l=r=Math.round(h-p-l);D(p)?this.horiz?(l=e,r=h-this.bottom,a=c=g(a,t,t+this.width)):(a=t,c=n-this.right,l=r=g(l,e,e+this.height)):w=!0;return w&&!d?null:f.renderer.crispLine([\"M\",a,l,\"L\",c,r],b||1)},getLinearTickPositions:function(a,b,c){var f,t=g(Math.floor(b/a)*a);c=g(Math.ceil(c/a)*a);var d=[];if(this.single)return[b];for(b=t;b<=c;){d.push(b);b=g(b+a);if(b===f)break;f=b}return d},getMinorTickPositions:function(){var a=\nthis,b=a.options,c=a.tickPositions,d=a.minorTickInterval,p=[],e=a.pointRangePadding||0,l=a.min-e,e=a.max+e,x=e-l;if(x&&x/d<a.len/3)if(a.isLog)h(this.paddedTicks,function(b,f,c){f&&p.push.apply(p,a.getLogTickPositions(d,c[f-1],c[f],!0))});else if(a.isDatetimeAxis&&\"auto\"===b.minorTickInterval)p=p.concat(a.getTimeTicks(a.normalizeTimeTickInterval(d),l,e,b.startOfWeek));else for(b=l+(c[0]-l)%d;b<=e&&b!==p[0];b+=d)p.push(b);0!==p.length&&a.trimTicks(p);return p},adjustForMinRange:function(){var a=this.options,\nb=this.min,c=this.max,d,p,e,l,x,r,n,w;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(q(a.min)||q(a.max)?this.minRange=null:(h(this.series,function(a){r=a.xData;for(l=n=a.xIncrement?1:r.length-1;0<l;l--)if(x=r[l]-r[l-1],void 0===e||x<e)e=x}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));c-b<this.minRange&&(p=this.dataMax-this.dataMin>=this.minRange,w=this.minRange,d=(w-c+b)/2,d=[b-d,z(a.min,b-d)],p&&(d[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),b=G(d),c=[b+w,z(a.max,b+w)],\np&&(c[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),c=F(c),c-b<w&&(d[0]=c-w,d[1]=z(a.min,c-w),b=G(d)));this.min=b;this.max=c},getClosest:function(){var a;this.categories?a=1:h(this.series,function(b){var f=b.closestPointRange,c=b.visible||!b.chart.options.chart.ignoreHiddenSeries;!b.noSharedTooltip&&q(f)&&c&&(a=q(a)?Math.min(a,f):f)});return a},nameToX:function(a){var f=y(this.categories),c=f?this.categories:this.names,d=a.options.x,p;a.series.requireSorting=!1;q(d)||(d=!1===this.options.uniqueNames?\na.series.autoIncrement():b(a.name,c));-1===d?f||(p=c.length):p=d;void 0!==p&&(this.names[p]=a.name);return p},updateNames:function(){var a=this;0<this.names.length&&(this.names.length=0,this.minRange=this.userMinRange,h(this.series||[],function(b){b.xIncrement=null;if(!b.points||b.isDirtyData)b.processData(),b.generatePoints();h(b.points,function(f,c){var t;f.options&&(t=a.nameToX(f),void 0!==t&&t!==f.x&&(f.x=t,b.xData[c]=t))})}))},setAxisTranslation:function(a){var b=this,f=b.max-b.min,c=b.axisPointRange||\n0,d,p=0,e=0,l=b.linkedParent,r=!!b.categories,n=b.transA,w=b.isXAxis;if(w||r||c)d=b.getClosest(),l?(p=l.minPointOffset,e=l.pointRangePadding):h(b.series,function(a){var f=r?1:w?z(a.options.pointRange,d,0):b.axisPointRange||0;a=a.options.pointPlacement;c=Math.max(c,f);b.single||(p=Math.max(p,H(a)?0:f/2),e=Math.max(e,\"on\"===a?0:f))}),l=b.ordinalSlope&&d?b.ordinalSlope/d:1,b.minPointOffset=p*=l,b.pointRangePadding=e*=l,b.pointRange=Math.min(c,f),w&&(b.closestPointRange=d);a&&(b.oldTransA=n);b.translationSlope=\nb.transA=n=b.options.staticScale||b.len/(f+e||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=n*p},minFromRange:function(){return this.max-this.range},setTickInterval:function(b){var f=this,d=f.chart,p=f.options,e=f.isLog,l=f.log2lin,r=f.isDatetimeAxis,x=f.isXAxis,w=f.isLinked,y=p.maxPadding,E=p.minPadding,k=p.tickInterval,I=p.tickPixelInterval,m=f.categories,H=f.threshold,u=f.softThreshold,L,v,M,A;r||m||w||this.getTickAmount();M=z(f.userMin,p.min);A=z(f.userMax,p.max);w?(f.linkedParent=d[f.coll][p.linkedTo],\nd=f.linkedParent.getExtremes(),f.min=z(d.min,d.dataMin),f.max=z(d.max,d.dataMax),p.type!==f.linkedParent.options.type&&a.error(11,1)):(!u&&q(H)&&(f.dataMin>=H?(L=H,E=0):f.dataMax<=H&&(v=H,y=0)),f.min=z(M,L,f.dataMin),f.max=z(A,v,f.dataMax));e&&(f.positiveValuesOnly&&!b&&0>=Math.min(f.min,z(f.dataMin,f.min))&&a.error(10,1),f.min=g(l(f.min),15),f.max=g(l(f.max),15));f.range&&q(f.max)&&(f.userMin=f.min=M=Math.max(f.min,f.minFromRange()),f.userMax=A=f.max,f.range=null);n(f,\"foundExtremes\");f.beforePadding&&\nf.beforePadding();f.adjustForMinRange();!(m||f.axisPointRange||f.usePercentage||w)&&q(f.min)&&q(f.max)&&(l=f.max-f.min)&&(!q(M)&&E&&(f.min-=l*E),!q(A)&&y&&(f.max+=l*y));D(p.softMin)&&(f.min=Math.min(f.min,p.softMin));D(p.softMax)&&(f.max=Math.max(f.max,p.softMax));D(p.floor)&&(f.min=Math.max(f.min,p.floor));D(p.ceiling)&&(f.max=Math.min(f.max,p.ceiling));u&&q(f.dataMin)&&(H=H||0,!q(M)&&f.min<H&&f.dataMin>=H?f.min=H:!q(A)&&f.max>H&&f.dataMax<=H&&(f.max=H));f.tickInterval=f.min===f.max||void 0===f.min||\nvoid 0===f.max?1:w&&!k&&I===f.linkedParent.options.tickPixelInterval?k=f.linkedParent.tickInterval:z(k,this.tickAmount?(f.max-f.min)/Math.max(this.tickAmount-1,1):void 0,m?1:(f.max-f.min)*I/Math.max(f.len,I));x&&!b&&h(f.series,function(a){a.processData(f.min!==f.oldMin||f.max!==f.oldMax)});f.setAxisTranslation(!0);f.beforeSetTickPositions&&f.beforeSetTickPositions();f.postProcessTickInterval&&(f.tickInterval=f.postProcessTickInterval(f.tickInterval));f.pointRange&&!k&&(f.tickInterval=Math.max(f.pointRange,\nf.tickInterval));b=z(p.minTickInterval,f.isDatetimeAxis&&f.closestPointRange);!k&&f.tickInterval<b&&(f.tickInterval=b);r||e||k||(f.tickInterval=B(f.tickInterval,null,c(f.tickInterval),z(p.allowDecimals,!(.5<f.tickInterval&&5>f.tickInterval&&1E3<f.max&&9999>f.max)),!!this.tickAmount));this.tickAmount||(f.tickInterval=f.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,p=a.startOnTick,l=a.endOnTick;this.tickmarkOffset=this.categories&&\n\"between\"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval=\"auto\"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.single=this.min===this.max&&q(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==a.allowDecimals);this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,\n!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.paddedTicks=b.slice(0);this.trimTicks(b,p,l);this.isLinked||(this.single&&(this.min-=.5,this.max+=.5),c||d||this.adjustTickAmount())},trimTicks:function(a,b,c){var f=a[0],d=a[a.length-1],p=this.minPointOffset||0;if(!this.isLinked){if(b&&\n-Infinity!==f)this.min=f;else for(;this.min-p>a[0];)a.shift();if(c)this.max=d;else for(;this.max+p<a[a.length-1];)a.pop();0===a.length&&q(f)&&a.push((d+f)/2)}},alignToOthers:function(){var a={},b,c=this.options;!1===this.chart.options.chart.alignTicks||!1===c.alignTicks||this.isLog||h(this.chart[this.coll],function(f){var c=f.options,c=[f.horiz?c.left:c.top,c.width,c.height,c.pane].join();f.series.length&&(a[c]?b=!0:a[c]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,c=\na.tickPixelInterval;!q(a.tickInterval)&&this.len<c&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/c)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,p=b&&b.length;if(p<c){for(;b.length<c;)b.push(g(b[b.length-1]+a));this.transA*=(p-1)/(c-1);this.max=b[b.length-1]}else p>c&&(this.tickInterval*=2,this.setTickPositions());\nif(q(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0<a&&a<c-1)&&b.splice(a,1);this.finalTickAmt=void 0}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;h(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=\n!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,b,c,d,p){var f=this,l=f.chart;c=z(c,!0);h(f.series,function(a){delete a.kdTree});p=e(p,{min:a,max:b});n(f,\"setExtremes\",p,function(){f.userMin=a;f.userMax=b;f.eventArgs=p;c&&l.redraw(d)})},zoom:function(a,b){var f=this.dataMin,c=this.dataMax,d=this.options,\np=Math.min(f,z(d.min,f)),d=Math.max(c,z(d.max,c));if(a!==this.min||b!==this.max)this.allowZoomOutside||(q(f)&&(a<p&&(a=p),a>d&&(a=d)),q(c)&&(b<p&&(b=p),b>d&&(b=d))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:\"zoom\"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsets||[0,0,0,0],d=this.horiz,p=z(b.width,a.plotWidth-c[3]+c[1]),l=z(b.height,a.plotHeight-c[0]+c[2]),e=z(b.top,a.plotTop+c[0]),b=z(b.left,a.plotLeft+c[3]),c=/%$/;c.test(l)&&(l=\nMath.round(parseFloat(l)/100*a.plotHeight));c.test(e)&&(e=Math.round(parseFloat(e)/100*a.plotHeight+a.plotTop));this.left=b;this.top=e;this.width=p;this.height=l;this.bottom=a.chartHeight-l-e;this.right=a.chartWidth-p-b;this.len=Math.max(d?p:l,0);this.pos=d?b:e},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?g(b(this.min)):this.min,max:a?g(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=\nthis.isLog,f=this.lin2log,c=b?f(this.min):this.min,b=b?f(this.max):this.max;null===a?a=c:c>a?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(z(a,0)-90*this.side+720)%360;return 15<a&&165>a?\"right\":195<a&&345>a?\"left\":\"center\"},tickSize:function(a){var b=this.options,f=b[a+\"Length\"],c=z(b[a+\"Width\"],\"tick\"===a&&this.isXAxis?1:0);if(c&&f)return\"inside\"===b[a+\"Position\"]&&(f=-f),[f,c]},labelMetrics:function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&\nthis.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,p=this.len/(((this.categories?1:0)+this.max-this.min)/c),l,e=a.rotation,r=this.labelMetrics(),n,w=Number.MAX_VALUE,g,y=function(a){a/=p||1;a=1<a?Math.ceil(a):1;return a*c};b?(g=!a.staggerLines&&!a.step&&(q(e)?[e]:p<z(a.autoRotationLimit,80)&&a.autoRotation))&&h(g,function(a){var b;if(a===e||a&&-90<=a&&90>=a)n=y(Math.abs(r.h/Math.sin(v*a))),b=n+\nMath.abs(a/360),b<w&&(w=b,l=a,d=n)}):a.step||(d=y(r.h));this.autoRotation=g;this.labelRotation=z(l,e);return d},getSlotWidth:function(){var a=this.chart,b=this.horiz,c=this.options.labels,d=Math.max(this.tickPositions.length-(this.categories?0:1),1),p=a.margin[3];return b&&2>(c.step||0)&&!c.rotation&&(this.staggerLines||1)*this.len/d||!b&&(p&&p-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,p=this.options.labels,e=this.horiz,\nr=this.getSlotWidth(),x=Math.max(1,Math.round(r-2*(p.padding||5))),n={},w=this.labelMetrics(),g=p.style&&p.style.textOverflow,y,E=0,k,I;H(p.rotation)||(n.rotation=p.rotation||0);h(c,function(a){(a=d[a])&&a.labelLength>E&&(E=a.labelLength)});this.maxLabelLength=E;if(this.autoRotation)E>x&&E>w.h?n.rotation=this.labelRotation:this.labelRotation=0;else if(r&&(y={width:x+\"px\"},!g))for(y.textOverflow=\"clip\",k=c.length;!e&&k--;)if(I=c[k],x=d[I].label)x.styles&&\"ellipsis\"===x.styles.textOverflow?x.css({textOverflow:\"clip\"}):\nd[I].labelLength>r&&x.css({width:r+\"px\"}),x.getBBox().height>this.len/c.length-(w.h-w.f)&&(x.specCss={textOverflow:\"ellipsis\"});n.rotation&&(y={width:(E>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+\"px\"},g||(y.textOverflow=\"ellipsis\"));if(this.labelAlign=p.align||this.autoLabelAlign(this.labelRotation))n.align=this.labelAlign;h(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(n),y&&b.css(l(y,b.specCss)),delete b.specCss,a.rotation=n.rotation)});this.tickRotCorr=b.rotCorr(w.b,this.labelRotation||\n0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||q(this.min)&&q(this.max)&&!!this.tickPositions},addTitle:function(a){var b=this.chart.renderer,f=this.horiz,c=this.opposite,d=this.options.title,p;this.axisTitle||((p=d.textAlign)||(p=(f?{low:\"left\",middle:\"center\",high:\"right\"}:{low:c?\"right\":\"left\",middle:\"center\",high:c?\"left\":\"right\"})[d.align]),this.axisTitle=b.text(d.text,0,0,d.useHTML).attr({zIndex:7,rotation:d.rotation||0,align:p}).addClass(\"highcharts-axis-title\").css(d.style).add(this.axisGroup),\nthis.axisTitle.isNew=!0);this.axisTitle[a?\"show\":\"hide\"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new I(this,a)},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,p=a.tickPositions,l=a.ticks,e=a.horiz,x=a.side,n=b.inverted&&!a.isZAxis?[1,0,3,2][x]:x,w,g,y=0,E,k=0,I=d.title,D=d.labels,m=0,B=b.axisOffset,b=b.clipOffset,H=[-1,1,1,-1][x],u=d.className,L=a.axisParent,v=this.tickSize(\"tick\");w=a.hasData();a.showAxis=g=w||z(d.showEmpty,!0);a.staggerLines=\na.horiz&&D.staggerLines;a.axisGroup||(a.gridGroup=c.g(\"grid\").attr({zIndex:d.gridZIndex||1}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\"-grid \"+(u||\"\")).add(L),a.axisGroup=c.g(\"axis\").attr({zIndex:d.zIndex||2}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\" \"+(u||\"\")).add(L),a.labelGroup=c.g(\"axis-labels\").attr({zIndex:D.zIndex||7}).addClass(\"highcharts-\"+a.coll.toLowerCase()+\"-labels \"+(u||\"\")).add(L));w||a.isLinked?(h(p,function(b,c){a.generateTick(b,c)}),a.renderUnsquish(),!1===D.reserveSpace||\n0!==x&&2!==x&&{1:\"left\",3:\"right\"}[x]!==a.labelAlign&&\"center\"!==a.labelAlign||h(p,function(a){m=Math.max(l[a].getLabelSize(),m)}),a.staggerLines&&(m*=a.staggerLines,a.labelOffset=m*(a.opposite?-1:1))):r(l,function(a,b){a.destroy();delete l[b]});I&&I.text&&!1!==I.enabled&&(a.addTitle(g),g&&!1!==I.reserveSpace&&(a.titleOffset=y=a.axisTitle.getBBox()[e?\"height\":\"width\"],E=I.offset,k=q(E)?0:z(I.margin,e?5:10)));a.renderLine();a.offset=H*z(d.offset,B[x]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===x?\n-a.labelMetrics().h:2===x?a.tickRotCorr.y:0;k=Math.abs(m)+k;m&&(k=k-c+H*(e?z(D.y,a.tickRotCorr.y+8*H):D.x));a.axisTitleMargin=z(E,k);B[x]=Math.max(B[x],a.axisTitleMargin+y+H*a.offset,k,w&&p.length&&v?v[0]+H*a.offset:0);p=2*Math.floor(a.axisLine.strokeWidth()/2);0<d.offset&&(p-=2*d.offset);b[n]=Math.max(b[n]||p,p)},getLinePath:function(a){var b=this.chart,c=this.opposite,f=this.offset,d=this.horiz,p=this.left+(c?this.width:0)+f,f=b.chartHeight-this.bottom-(c?this.height:0)+f;c&&(a*=-1);return b.renderer.crispLine([\"M\",\nd?this.left:p,d?f:this.top,\"L\",d?b.chartWidth-this.right:p,d?f:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass(\"highcharts-axis-line\").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor,\"stroke-width\":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,p=this.options.title,l=a?b:c,e=this.opposite,r=this.offset,h=p.x||0,n=p.y||0,w=this.chart.renderer.fontMetrics(p.style&&\np.style.fontSize,this.axisTitle).f,d={low:l+(a?0:d),middle:l+d/2,high:l+(a?d:0)}[p.align],b=(a?c+this.height:b)+(a?1:-1)*(e?-1:1)*this.axisTitleMargin+(2===this.side?w:0);return{x:a?d+h:b+(e?this.width:0)+r+h,y:a?b+n-(e?this.height:0)+r:d+n}},renderMinorTick:function(a){var b=this.chart.hasRendered&&D(this.oldMin),c=this.minorTicks;c[a]||(c[a]=new I(this,a,\"minor\"));b&&c[a].isNew&&c[a].render(null,!0);c[a].render(null,!1,1)},renderTick:function(a,b){var c=this.isLinked,f=this.ticks,d=this.chart.hasRendered&&\nD(this.oldMin);if(!c||a>=this.min&&a<=this.max)f[a]||(f[a]=new I(this,a)),d&&f[a].isNew&&f[a].render(b,!0,.1),f[a].render(b)},render:function(){var b=this,c=b.chart,d=b.options,p=b.isLog,l=b.lin2log,e=b.isLinked,n=b.tickPositions,x=b.axisTitle,w=b.ticks,g=b.minorTicks,y=b.alternateBands,k=d.stackLabels,m=d.alternateGridColor,q=b.tickmarkOffset,z=b.axisLine,B=b.showAxis,H=A(c.renderer.globalAnimation),u,L;b.labelEdge.length=0;b.overlap=!1;h([w,g,y],function(a){r(a,function(a){a.isActive=!1})});if(b.hasData()||\ne)b.minorTickInterval&&!b.categories&&h(b.getMinorTickPositions(),function(a){b.renderMinorTick(a)}),n.length&&(h(n,function(a,c){b.renderTick(a,c)}),q&&(0===b.min||b.single)&&(w[-1]||(w[-1]=new I(b,-1,null,!0)),w[-1].render(-1))),m&&h(n,function(f,d){L=void 0!==n[d+1]?n[d+1]+q:b.max-q;0===d%2&&f<b.max&&L<=b.max+(c.polar?-q:q)&&(y[f]||(y[f]=new a.PlotLineOrBand(b)),u=f+q,y[f].options={from:p?l(u):u,to:p?l(L):L,color:m},y[f].render(),y[f].isActive=!0)}),b._addedPlotLB||(h((d.plotLines||[]).concat(d.plotBands||\n[]),function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=!0);h([w,g,y],function(a){var b,f=[],d=H.duration;r(a,function(a,b){a.isActive||(a.render(b,!1,0),a.isActive=!1,f.push(b))});E(function(){for(b=f.length;b--;)a[f[b]]&&!a[f[b]].isActive&&(a[f[b]].destroy(),delete a[f[b]])},a!==y&&c.hasRendered&&d?d:0)});z&&(z[z.isPlaced?\"animate\":\"attr\"]({d:this.getLinePath(z.strokeWidth())}),z.isPlaced=!0,z[B?\"show\":\"hide\"](!0));x&&B&&(d=b.getTitlePosition(),D(d.y)?(x[x.isNew?\"attr\":\"animate\"](d),x.isNew=!1):\n(x.attr(\"y\",-9999),x.isNew=!0));k&&k.enabled&&b.renderStackTotals();b.isDirty=!1},redraw:function(){this.visible&&(this.render(),h(this.plotLinesAndBands,function(a){a.render()}));h(this.series,function(a){a.isDirty=!0})},keepProps:\"extKey hcEvents names series userMax userMin\".split(\" \"),destroy:function(a){var c=this,f=c.stacks,d=c.plotLinesAndBands,p;a||M(c);r(f,function(a,b){u(a);f[b]=null});h([c.ticks,c.minorTicks,c.alternateBands],function(a){u(a)});if(d)for(a=d.length;a--;)d[a].destroy();h(\"stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross\".split(\" \"),\nfunction(a){c[a]&&(c[a]=c[a].destroy())});for(p in c.plotLinesAndBandsGroups)c.plotLinesAndBandsGroups[p]=c.plotLinesAndBandsGroups[p].destroy();r(c,function(a,f){-1===b(f,c.keepProps)&&delete c[f]})},drawCrosshair:function(a,b){var c,f=this.crosshair,d=z(f.snap,!0),p,l=this.cross;a||(a=this.cross&&this.cross.e);this.crosshair&&!1!==(q(b)||!d)?(d?q(b)&&(p=this.isXAxis?b.plotX:this.len-b.plotY):p=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos),q(p)&&(c=this.getPlotLinePath(b&&(this.isXAxis?\nb.x:z(b.stackY,b.y)),null,null,null,p)||null),q(c)?(b=this.categories&&!this.isRadial,l||(this.cross=l=this.chart.renderer.path().addClass(\"highcharts-crosshair highcharts-crosshair-\"+(b?\"category \":\"thin \")+f.className).attr({zIndex:z(f.zIndex,2)}).add(),l.attr({stroke:f.color||(b?m(\"#ccd6eb\").setOpacity(.25).get():\"#cccccc\"),\"stroke-width\":z(f.width,1)}),f.dashStyle&&l.attr({dashstyle:f.dashStyle})),l.show().attr({d:c}),b&&!f.width&&l.attr({\"stroke-width\":this.transA}),this.cross.e=a):this.hideCrosshair()):\nthis.hideCrosshair()},hideCrosshair:function(){this.cross&&this.cross.hide()}});return a.Axis=L}(K);(function(a){var C=a.Axis,A=a.Date,G=a.dateFormat,F=a.defaultOptions,m=a.defined,g=a.each,k=a.extend,q=a.getMagnitude,v=a.getTZOffset,u=a.normalizeTickInterval,h=a.pick,e=a.timeUnits;C.prototype.getTimeTicks=function(a,d,c,w){var b=[],n={},D=F.global.useUTC,q,l=new A(d-Math.max(v(d),v(c))),B=A.hcMakeTime,r=a.unitRange,z=a.count,u;if(m(d)){l[A.hcSetMilliseconds](r>=e.second?0:z*Math.floor(l.getMilliseconds()/\nz));if(r>=e.second)l[A.hcSetSeconds](r>=e.minute?0:z*Math.floor(l.getSeconds()/z));if(r>=e.minute)l[A.hcSetMinutes](r>=e.hour?0:z*Math.floor(l[A.hcGetMinutes]()/z));if(r>=e.hour)l[A.hcSetHours](r>=e.day?0:z*Math.floor(l[A.hcGetHours]()/z));if(r>=e.day)l[A.hcSetDate](r>=e.month?1:z*Math.floor(l[A.hcGetDate]()/z));r>=e.month&&(l[A.hcSetMonth](r>=e.year?0:z*Math.floor(l[A.hcGetMonth]()/z)),q=l[A.hcGetFullYear]());if(r>=e.year)l[A.hcSetFullYear](q-q%z);if(r===e.week)l[A.hcSetDate](l[A.hcGetDate]()-l[A.hcGetDay]()+\nh(w,1));q=l[A.hcGetFullYear]();w=l[A.hcGetMonth]();var p=l[A.hcGetDate](),E=l[A.hcGetHours]();if(A.hcTimezoneOffset||A.hcGetTimezoneOffset)u=(!D||!!A.hcGetTimezoneOffset)&&(c-d>4*e.month||v(d)!==v(c)),l=l.getTime(),l=new A(l+v(l));D=l.getTime();for(d=1;D<c;)b.push(D),D=r===e.year?B(q+d*z,0):r===e.month?B(q,w+d*z):!u||r!==e.day&&r!==e.week?u&&r===e.hour?B(q,w,p,E+d*z):D+r*z:B(q,w,p+d*z*(r===e.day?1:7)),d++;b.push(D);r<=e.hour&&1E4>b.length&&g(b,function(a){0===a%18E5&&\"000000000\"===G(\"%H%M%S%L\",a)&&\n(n[a]=\"day\")})}b.info=k(a,{higherRanks:n,totalRange:r*z});return b};C.prototype.normalizeTimeTickInterval=function(a,d){var c=d||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],[\"year\",null]];d=c[c.length-1];var h=e[d[0]],b=d[1],n;for(n=0;n<c.length&&!(d=c[n],h=e[d[0]],b=d[1],c[n+1]&&a<=(h*b[b.length-1]+e[c[n+1][0]])/2);n++);h===e.year&&a<5*h&&(b=[1,2,5]);a=u(a/h,b,\n\"year\"===d[0]?Math.max(q(a/h),1):1);return{unitRange:h,count:a,unitName:d[0]}}})(K);(function(a){var C=a.Axis,A=a.getMagnitude,G=a.map,F=a.normalizeTickInterval,m=a.pick;C.prototype.getLogTickPositions=function(a,k,q,v){var g=this.options,h=this.len,e=this.lin2log,n=this.log2lin,d=[];v||(this._minorAutoInterval=null);if(.5<=a)a=Math.round(a),d=this.getLinearTickPositions(a,k,q);else if(.08<=a)for(var h=Math.floor(k),c,w,b,y,D,g=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];h<q+1&&!D;h++)for(w=\ng.length,c=0;c<w&&!D;c++)b=n(e(h)*g[c]),b>k&&(!v||y<=q)&&void 0!==y&&d.push(y),y>q&&(D=!0),y=b;else k=e(k),q=e(q),a=g[v?\"minorTickInterval\":\"tickInterval\"],a=m(\"auto\"===a?null:a,this._minorAutoInterval,g.tickPixelInterval/(v?5:1)*(q-k)/((v?h/this.tickPositions.length:h)||1)),a=F(a,null,A(a)),d=G(this.getLinearTickPositions(a,k,q),n),v||(this._minorAutoInterval=a/5);v||(this.tickInterval=a);return d};C.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};C.prototype.lin2log=function(a){return Math.pow(10,\na)}})(K);(function(a,C){var A=a.arrayMax,G=a.arrayMin,F=a.defined,m=a.destroyObjectProperties,g=a.each,k=a.erase,q=a.merge,v=a.pick;a.PlotLineOrBand=function(a,h){this.axis=a;h&&(this.options=h,this.id=h.id)};a.PlotLineOrBand.prototype={render:function(){var g=this,h=g.axis,e=h.horiz,n=g.options,d=n.label,c=g.label,w=n.to,b=n.from,y=n.value,k=F(b)&&F(w),m=F(y),l=g.svgElem,B=!l,r=[],z=n.color,M=v(n.zIndex,0),p=n.events,r={\"class\":\"highcharts-plot-\"+(k?\"band \":\"line \")+(n.className||\"\")},E={},I=h.chart.renderer,\nL=k?\"bands\":\"lines\",f=h.log2lin;h.isLog&&(b=f(b),w=f(w),y=f(y));m?(r={stroke:z,\"stroke-width\":n.width},n.dashStyle&&(r.dashstyle=n.dashStyle)):k&&(z&&(r.fill=z),n.borderWidth&&(r.stroke=n.borderColor,r[\"stroke-width\"]=n.borderWidth));E.zIndex=M;L+=\"-\"+M;(z=h.plotLinesAndBandsGroups[L])||(h.plotLinesAndBandsGroups[L]=z=I.g(\"plot-\"+L).attr(E).add());B&&(g.svgElem=l=I.path().attr(r).add(z));if(m)r=h.getPlotLinePath(y,l.strokeWidth());else if(k)r=h.getPlotBandPath(b,w,n);else return;B&&r&&r.length?(l.attr({d:r}),\np&&a.objectEach(p,function(a,b){l.on(b,function(a){p[b].apply(g,[a])})})):l&&(r?(l.show(),l.animate({d:r})):(l.hide(),c&&(g.label=c=c.destroy())));d&&F(d.text)&&r&&r.length&&0<h.width&&0<h.height&&!r.flat?(d=q({align:e&&k&&\"center\",x:e?!k&&4:10,verticalAlign:!e&&k&&\"middle\",y:e?k?16:10:k?6:-4,rotation:e&&!k&&90},d),this.renderLabel(d,r,k,M)):c&&c.hide();return g},renderLabel:function(a,h,e,n){var d=this.label,c=this.axis.chart.renderer;d||(d={align:a.textAlign||a.align,rotation:a.rotation,\"class\":\"highcharts-plot-\"+\n(e?\"band\":\"line\")+\"-label \"+(a.className||\"\")},d.zIndex=n,this.label=d=c.text(a.text,0,0,a.useHTML).attr(d).add(),d.css(a.style));n=[h[1],h[4],e?h[6]:h[1]];h=[h[2],h[5],e?h[7]:h[2]];e=G(n);c=G(h);d.align(a,!1,{x:e,y:c,width:A(n)-e,height:A(h)-c});d.show()},destroy:function(){k(this.axis.plotLinesAndBands,this);delete this.axis;m(this)}};a.extend(C.prototype,{getPlotBandPath:function(a,h){var e=this.getPlotLinePath(h,null,null,!0),n=this.getPlotLinePath(a,null,null,!0),d=this.horiz,c=1;a=a<this.min&&\nh<this.min||a>this.max&&h>this.max;n&&e?(a&&(n.flat=n.toString()===e.toString(),c=0),n.push(d&&e[4]===n[4]?e[4]+c:e[4],d||e[5]!==n[5]?e[5]:e[5]+c,d&&e[1]===n[1]?e[1]+c:e[1],d||e[2]!==n[2]?e[2]:e[2]+c)):n=null;return n},addPlotBand:function(a){return this.addPlotBandOrLine(a,\"plotBands\")},addPlotLine:function(a){return this.addPlotBandOrLine(a,\"plotLines\")},addPlotBandOrLine:function(g,h){var e=(new a.PlotLineOrBand(this,g)).render(),n=this.userOptions;e&&(h&&(n[h]=n[h]||[],n[h].push(g)),this.plotLinesAndBands.push(e));\nreturn e},removePlotBandOrLine:function(a){for(var h=this.plotLinesAndBands,e=this.options,n=this.userOptions,d=h.length;d--;)h[d].id===a&&h[d].destroy();g([e.plotLines||[],n.plotLines||[],e.plotBands||[],n.plotBands||[]],function(c){for(d=c.length;d--;)c[d].id===a&&k(c,c[d])})},removePlotBand:function(a){this.removePlotBandOrLine(a)},removePlotLine:function(a){this.removePlotBandOrLine(a)}})})(K,S);(function(a){var C=a.dateFormat,A=a.each,G=a.extend,F=a.format,m=a.isNumber,g=a.map,k=a.merge,q=a.pick,\nv=a.splat,u=a.syncTimeout,h=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,h){this.chart=a;this.options=h;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=h.split&&!a.inverted;this.shared=h.shared||this.split},cleanSplit:function(a){A(this.chart.series,function(e){var d=e&&e.tt;d&&(!d.isActive||a?e.tt=d.destroy():d.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,h=this.options;this.label||(this.split?this.label=\na.g(\"tooltip\"):(this.label=a.label(\"\",0,0,h.shape||\"callout\",null,null,h.useHTML,null,\"tooltip\").attr({padding:h.padding,r:h.borderRadius}),this.label.attr({fill:h.backgroundColor,\"stroke-width\":h.borderWidth}).css(h.style).shadow(h.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();k(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,k(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&\n(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,h,d,c){var e=this,b=e.now,n=!1!==e.options.animation&&!e.isHidden&&(1<Math.abs(a-b.x)||1<Math.abs(h-b.y)),g=e.followPointer||1<e.len;G(b,{x:n?(2*b.x+a)/3:a,y:n?(b.y+h)/2:h,anchorX:g?void 0:n?(2*b.anchorX+d)/3:d,anchorY:g?void 0:n?(b.anchorY+c)/2:c});e.getLabel().attr(b);n&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,\nh,d,c)},32))},hide:function(a){var e=this;clearTimeout(this.hideTimer);a=q(a,this.options.hideDelay,500);this.isHidden||(this.hideTimer=u(function(){e.getLabel()[a?\"fadeOut\":\"hide\"]();e.isHidden=!0},a))},getAnchor:function(a,h){var d,c=this.chart,e=c.inverted,b=c.plotTop,n=c.plotLeft,k=0,m=0,l,q;a=v(a);d=a[0].tooltipPos;this.followPointer&&h&&(void 0===h.chartX&&(h=c.pointer.normalize(h)),d=[h.chartX-c.plotLeft,h.chartY-b]);d||(A(a,function(a){l=a.series.yAxis;q=a.series.xAxis;k+=a.plotX+(!e&&q?q.left-\nn:0);m+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&l?l.top-b:0)}),k/=a.length,m/=a.length,d=[e?c.plotWidth-m:k,this.shared&&!e&&1<a.length&&h?h.chartY-b:e?c.plotHeight-k:m]);return g(d,Math.round)},getPosition:function(a,h,d){var c=this.chart,e=this.distance,b={},n=d.h||0,g,k=[\"y\",c.chartHeight,h,d.plotY+c.plotTop,c.plotTop,c.plotTop+c.plotHeight],l=[\"x\",c.chartWidth,a,d.plotX+c.plotLeft,c.plotLeft,c.plotLeft+c.plotWidth],m=!this.followPointer&&q(d.ttBelow,!c.inverted===!!d.negative),r=function(a,\nc,d,f,p,l){var h=d<f-e,r=f+e+d<c,g=f-e-d;f+=e;if(m&&r)b[a]=f;else if(!m&&h)b[a]=g;else if(h)b[a]=Math.min(l-d,0>g-n?g:g-n);else if(r)b[a]=Math.max(p,f+n+d>c?f:f+n);else return!1},z=function(a,c,d,f){var p;f<e||f>c-e?p=!1:b[a]=f<d/2?1:f>c-d/2?c-d-2:f-d/2;return p},v=function(a){var b=k;k=l;l=b;g=a},p=function(){!1!==r.apply(0,k)?!1!==z.apply(0,l)||g||(v(!0),p()):g?b.x=b.y=0:(v(!0),p())};(c.inverted||1<this.len)&&v();p();return b},defaultFormatter:function(a){var e=this.points||v(this),d;d=[a.tooltipFooterHeaderFormatter(e[0])];\nd=d.concat(a.bodyFormatter(e));d.push(a.tooltipFooterHeaderFormatter(e[0],!0));return d},refresh:function(a,h){var d,c=this.options,e,b=a,g,n={},k=[];d=c.formatter||this.defaultFormatter;var n=this.shared,l;clearTimeout(this.hideTimer);this.followPointer=v(b)[0].series.tooltipOptions.followPointer;g=this.getAnchor(b,h);h=g[0];e=g[1];!n||b.series&&b.series.noSharedTooltip?n=b.getLabelConfig():(A(b,function(a){a.setState(\"hover\");k.push(a.getLabelConfig())}),n={x:b[0].category,y:b[0].y},n.points=k,\nb=b[0]);this.len=k.length;n=d.call(n,this);l=b.series;this.distance=q(l.tooltipOptions.distance,16);!1===n?this.hide():(d=this.getLabel(),this.isHidden&&d.attr({opacity:1}).show(),this.split?this.renderSplit(n,a):(c.style.width||d.css({width:this.chart.spacingBox.width}),d.attr({text:n&&n.join?n.join(\"\"):n}),d.removeClass(/highcharts-color-[\\d]+/g).addClass(\"highcharts-color-\"+q(b.colorIndex,l.colorIndex)),d.attr({stroke:c.borderColor||b.color||l.color||\"#666666\"}),this.updatePosition({plotX:h,plotY:e,\nnegative:b.negative,ttBelow:b.ttBelow,h:g[2]||0})),this.isHidden=!1)},renderSplit:function(e,h){var d=this,c=[],g=this.chart,b=g.renderer,n=!0,k=this.options,m,l=this.getLabel();A(e.slice(0,h.length+1),function(a,e){e=h[e-1]||{isHeader:!0,plotX:h[0].plotX};var r=e.series||d,w=r.tt,p=e.series||{},y=\"highcharts-color-\"+q(e.colorIndex,p.colorIndex,\"none\");w||(r.tt=w=b.label(null,null,null,\"callout\").addClass(\"highcharts-tooltip-box \"+y).attr({padding:k.padding,r:k.borderRadius,fill:k.backgroundColor,\nstroke:e.color||p.color||\"#333333\",\"stroke-width\":k.borderWidth}).add(l));w.isActive=!0;w.attr({text:a});w.css(k.style);a=w.getBBox();p=a.width+w.strokeWidth();e.isHeader?(m=a.height,p=Math.max(0,Math.min(e.plotX+g.plotLeft-p/2,g.chartWidth-p))):p=e.plotX+g.plotLeft-q(k.distance,16)-p;0>p&&(n=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=g.plotTop;c.push({target:e.isHeader?g.plotHeight+m:a,rank:e.isHeader?1:0,size:r.tt.getBBox().height+1,point:e,x:p,tt:w})});this.cleanSplit();\na.distribute(c,g.plotHeight+m);A(c,function(a){var b=a.point,c=b.series;a.tt.attr({visibility:void 0===a.pos?\"hidden\":\"inherit\",x:n||b.isHeader?a.x:b.plotX+g.plotLeft+q(k.distance,16),y:a.pos+g.plotTop,anchorX:b.isHeader?b.plotX+g.plotLeft:b.plotX+c.xAxis.pos,anchorY:b.isHeader?a.pos+g.plotTop-15:b.plotY+c.yAxis.pos})})},updatePosition:function(a){var e=this.chart,d=this.getLabel(),d=(this.options.positioner||this.getPosition).call(this,d.width,d.height,a);this.move(Math.round(d.x),Math.round(d.y||\n0),a.plotX+e.plotLeft,a.plotY+e.plotTop)},getDateFormat:function(a,g,d,c){var e=C(\"%m-%d %H:%M:%S.%L\",g),b,n,k={millisecond:15,second:12,minute:9,hour:6,day:3},m=\"millisecond\";for(n in h){if(a===h.week&&+C(\"%w\",g)===d&&\"00:00:00.000\"===e.substr(6)){n=\"week\";break}if(h[n]>a){n=m;break}if(k[n]&&e.substr(k[n])!==\"01-01 00:00:00.000\".substr(k[n]))break;\"week\"!==n&&(m=n)}n&&(b=c[n]);return b},getXDateFormat:function(a,h,d){h=h.dateTimeLabelFormats;var c=d&&d.closestPointRange;return(c?this.getDateFormat(c,\na.x,d.options.startOfWeek,h):h.day)||h.year},tooltipFooterHeaderFormatter:function(a,h){var d=h?\"footer\":\"header\";h=a.series;var c=h.tooltipOptions,e=c.xDateFormat,b=h.xAxis,g=b&&\"datetime\"===b.options.type&&m(a.key),d=c[d+\"Format\"];g&&!e&&(e=this.getXDateFormat(a,c,b));g&&e&&(d=d.replace(\"{point.key}\",\"{point.key:\"+e+\"}\"));return F(d,{point:a,series:h})},bodyFormatter:function(a){return g(a,function(a){var d=a.series.tooltipOptions;return(d.pointFormatter||a.point.tooltipFormatter).call(a.point,\nd.pointFormat)})}}})(K);(function(a){var C=a.addEvent,A=a.attr,G=a.charts,F=a.color,m=a.css,g=a.defined,k=a.doc,q=a.each,v=a.extend,u=a.fireEvent,h=a.offset,e=a.pick,n=a.removeEvent,d=a.splat,c=a.Tooltip,w=a.win;a.Pointer=function(a,c){this.init(a,c)};a.Pointer.prototype={init:function(a,d){this.options=d;this.chart=a;this.runChartClick=d.chart.events&&!!d.chart.events.click;this.pinchDown=[];this.lastValidTouch={};c&&d.tooltip.enabled&&(a.tooltip=new c(a,d.tooltip),this.followTouchMove=e(d.tooltip.followTouchMove,\n!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,c=b.options.chart,d=c.zoomType||\"\",b=b.inverted;/touch/.test(a.type)&&(d=e(c.pinchType,d));this.zoomX=a=/x/.test(d);this.zoomY=d=/y/.test(d);this.zoomHor=a&&!b||d&&b;this.zoomVert=d&&!b||a&&b;this.hasZoom=a||d},normalize:function(a,c){var b,d;a=a||w.event;a.target||(a.target=a.srcElement);d=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;c||(this.chartPosition=c=h(this.chart.container));void 0===d.pageX?(b=Math.max(a.x,\na.clientX-c.left),c=a.y):(b=d.pageX-c.left,c=d.pageY-c.top);return v(a,{chartX:Math.round(b),chartY:Math.round(c)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};q(this.chart.axes,function(c){b[c.isXAxis?\"xAxis\":\"yAxis\"].push({axis:c,value:c.toValue(a[c.horiz?\"chartX\":\"chartY\"])})});return b},getKDPoints:function(a,c,d){var b=[],l,h,r;q(a,function(a){l=a.noSharedTooltip&&c;h=!c&&a.directTouch;a.visible&&!h&&e(a.options.enableMouseTracking,!0)&&(r=a.searchPoint(d,!l&&0>a.options.findNearestPointBy.indexOf(\"y\")))&&\nr.series&&b.push(r)});b.sort(function(a,b){var d=a.distX-b.distX,l=a.dist-b.dist,e=(b.series.group&&b.series.group.zIndex)-(a.series.group&&a.series.group.zIndex);return 0!==d&&c?d:0!==l?l:0!==e?e:a.series.index>b.series.index?-1:1});if(c&&b[0]&&!b[0].series.noSharedTooltip)for(a=b.length;a--;)(b[a].x!==b[0].x||b[a].series.noSharedTooltip)&&b.splice(a,1);return b},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode;return b},getChartCoordinatesFromPoint:function(a,c){var b=\na.series,d=b.xAxis,b=b.yAxis;if(d&&b)return c?{chartX:d.len+d.pos-a.clientX,chartY:b.len+b.pos-a.plotY}:{chartX:a.clientX+d.pos,chartY:a.plotY+b.pos}},getHoverData:function(b,c,d,e,l,h){var r=b,g=c,r=l?d:[g];e=!(!e||!b);c=g&&!g.stickyTracking;var n=function(a,b){return 0===b},p;e?n=function(a){return a===b}:c?n=function(a){return a.series===g}:r=a.grep(d,function(a){return a.stickyTracking});p=e&&!l?[b]:this.getKDPoints(r,l,h);g=(r=a.find(p,n))&&r.series;e||c||!l||(p=this.getKDPoints(d,l,h));p.sort(function(a,\nb){return a.series.index-b.series.index});return{hoverPoint:r,hoverSeries:g,hoverPoints:p}},runPointActions:function(b,c){var d=this.chart,h=d.tooltip,l=h?h.shared:!1,g=c||d.hoverPoint,r=g&&g.series||d.hoverSeries;c=this.getHoverData(g,r,d.series,!!c||r&&r.directTouch&&this.isDirectTouch,l,b);var n,w,g=c.hoverPoint;n=(r=c.hoverSeries)&&r.tooltipOptions.followPointer;w=(l=l&&g&&!g.series.noSharedTooltip)?c.hoverPoints:g?[g]:[];if(g&&(g!==d.hoverPoint||h&&h.isHidden)){q(d.hoverPoints||[],function(b){-1===\na.inArray(b,w)&&b.setState()});q(w||[],function(a){a.setState(\"hover\")});if(d.hoverSeries!==r)r.onMouseOver();d.hoverPoint&&d.hoverPoint.firePointEvent(\"mouseOut\");g.firePointEvent(\"mouseOver\");d.hoverPoints=w;d.hoverPoint=g;h&&h.refresh(l?w:g,b)}else n&&h&&!h.isHidden&&(r=h.getAnchor([{}],b),h.updatePosition({plotX:r[0],plotY:r[1]}));this.unDocMouseMove||(this.unDocMouseMove=C(k,\"mousemove\",function(b){var c=G[a.hoverChartIndex];if(c)c.pointer.onDocumentMouseMove(b)}));q(d.axes,function(c){e(c.crosshair.snap,\n!0)?a.find(w,function(a){return a.series[c.coll]===c})?c.drawCrosshair(b,g):c.hideCrosshair():c.drawCrosshair(b)})},reset:function(a,c){var b=this.chart,e=b.hoverSeries,l=b.hoverPoint,h=b.hoverPoints,g=b.tooltip,n=g&&g.shared?h:l;a&&n&&q(d(n),function(b){b.series.isCartesian&&void 0===b.plotX&&(a=!1)});if(a)g&&n&&(g.refresh(n),l&&(l.setState(l.state,!0),q(b.axes,function(a){a.crosshair&&a.drawCrosshair(null,l)})));else{if(l)l.onMouseOut();h&&q(h,function(a){a.setState()});if(e)e.onMouseOut();g&&g.hide(c);\nthis.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());q(b.axes,function(a){a.hideCrosshair()});this.hoverX=b.hoverPoints=b.hoverPoint=null}},scaleGroups:function(a,c){var b=this.chart,d;q(b.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&e.group&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(c?b.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});b.clipRect.attr(c||b.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=\na.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,h=this.zoomHor,g=this.zoomVert,n=b.plotLeft,w=b.plotTop,p=b.plotWidth,k=b.plotHeight,m,q=this.selectionMarker,f=this.mouseDownX,t=this.mouseDownY,v=c.panKey&&a[c.panKey+\"Key\"];q&&q.touch||(d<n?d=n:d>n+p&&(d=n+p),e<w?e=w:e>w+k&&(e=w+k),this.hasDragged=Math.sqrt(Math.pow(f-d,2)+Math.pow(t-e,2)),10<this.hasDragged&&(m=b.isInsidePlot(f-\nn,t-w),b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&m&&!v&&!q&&(this.selectionMarker=q=b.renderer.rect(n,w,h?1:p,g?1:k,0).attr({fill:c.selectionMarkerFill||F(\"#335cad\").setOpacity(.25).get(),\"class\":\"highcharts-selection-marker\",zIndex:7}).add()),q&&h&&(d-=f,q.attr({width:Math.abs(d),x:(0<d?0:d)+f})),q&&g&&(d=e-t,q.attr({height:Math.abs(d),y:(0<d?0:d)+t})),m&&!q&&c.panning&&b.pan(a,c.panning)))},drop:function(a){var b=this,c=this.chart,d=this.hasPinched;if(this.selectionMarker){var e={originalEvent:a,\nxAxis:[],yAxis:[]},h=this.selectionMarker,r=h.attr?h.attr(\"x\"):h.x,n=h.attr?h.attr(\"y\"):h.y,w=h.attr?h.attr(\"width\"):h.width,p=h.attr?h.attr(\"height\"):h.height,k;if(this.hasDragged||d)q(c.axes,function(c){if(c.zoomEnabled&&g(c.min)&&(d||b[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[c.coll]])){var l=c.horiz,f=\"touchend\"===a.type?c.minPixelPadding:0,h=c.toValue((l?r:n)+f),l=c.toValue((l?r+w:n+p)-f);e[c.coll].push({axis:c,min:Math.min(h,l),max:Math.max(h,l)});k=!0}}),k&&u(c,\"selection\",e,function(a){c.zoom(v(a,d?\n{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();d&&this.scaleGroups()}c&&(m(c.container,{cursor:c._cursor}),c.cancelClick=10<this.hasDragged,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);this.zoomOption(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(b){G[a.hoverChartIndex]&&G[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=this.chart,\nc=this.chartPosition;a=this.normalize(a,c);!c||this.inClass(a.target,\"highcharts-tracker\")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var c=G[a.hoverChartIndex];c&&(b.relatedTarget||b.toElement)&&(c.pointer.reset(),c.pointer.chartPosition=null)},onContainerMouseMove:function(b){var c=this.chart;g(a.hoverChartIndex)&&G[a.hoverChartIndex]&&G[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=c.index);b=this.normalize(b);b.returnValue=!1;\n\"mousedown\"===c.mouseIsDown&&this.drag(b);!this.inClass(b.target,\"highcharts-tracker\")&&!c.isInsidePlot(b.chartX-c.plotLeft,b.chartY-c.plotTop)||c.openMenu||this.runPointActions(b)},inClass:function(a,c){for(var b;a;){if(b=A(a,\"class\")){if(-1!==b.indexOf(c))return!0;if(-1!==b.indexOf(\"highcharts-container\"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;this.isDirectTouch=!1;if(!(!b||!a||b.stickyTracking||this.inClass(a,\"highcharts-tooltip\")||\nthis.inClass(a,\"highcharts-series-\"+b.index)&&this.inClass(a,\"highcharts-tracker\")))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop;a=this.normalize(a);b.cancelClick||(c&&this.inClass(a.target,\"highcharts-tracker\")?(u(c.series,\"click\",v(a,{point:c})),b.hoverPoint&&c.firePointEvent(\"click\",a)):(v(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&u(b,\"click\",a)))},setDOMEvents:function(){var b=this,c=b.chart.container;c.onmousedown=\nfunction(a){b.onContainerMouseDown(a)};c.onmousemove=function(a){b.onContainerMouseMove(a)};c.onclick=function(a){b.onContainerClick(a)};C(c,\"mouseleave\",b.onContainerMouseLeave);1===a.chartCount&&C(k,\"mouseup\",b.onDocumentMouseUp);a.hasTouch&&(c.ontouchstart=function(a){b.onContainerTouchStart(a)},c.ontouchmove=function(a){b.onContainerTouchMove(a)},1===a.chartCount&&C(k,\"touchend\",b.onDocumentTouchEnd))},destroy:function(){var b=this;b.unDocMouseMove&&b.unDocMouseMove();n(b.chart.container,\"mouseleave\",\nb.onContainerMouseLeave);a.chartCount||(n(k,\"mouseup\",b.onDocumentMouseUp),n(k,\"touchend\",b.onDocumentTouchEnd));clearInterval(b.tooltipTimeout);a.objectEach(b,function(a,c){b[c]=null})}}})(K);(function(a){var C=a.charts,A=a.each,G=a.extend,F=a.map,m=a.noop,g=a.pick;G(a.Pointer.prototype,{pinchTranslate:function(a,g,m,u,h,e){this.zoomHor&&this.pinchTranslateDirection(!0,a,g,m,u,h,e);this.zoomVert&&this.pinchTranslateDirection(!1,a,g,m,u,h,e)},pinchTranslateDirection:function(a,g,m,u,h,e,n,d){var c=\nthis.chart,w=a?\"x\":\"y\",b=a?\"X\":\"Y\",k=\"chart\"+b,q=a?\"width\":\"height\",v=c[\"plot\"+(a?\"Left\":\"Top\")],l,B,r=d||1,z=c.inverted,M=c.bounds[a?\"h\":\"v\"],p=1===g.length,E=g[0][k],I=m[0][k],L=!p&&g[1][k],f=!p&&m[1][k],t;m=function(){!p&&20<Math.abs(E-L)&&(r=d||Math.abs(I-f)/Math.abs(E-L));B=(v-I)/r+E;l=c[\"plot\"+(a?\"Width\":\"Height\")]/r};m();g=B;g<M.min?(g=M.min,t=!0):g+l>M.max&&(g=M.max-l,t=!0);t?(I-=.8*(I-n[w][0]),p||(f-=.8*(f-n[w][1])),m()):n[w]=[I,f];z||(e[w]=B-v,e[q]=l);e=z?1/r:r;h[q]=l;h[w]=g;u[z?a?\"scaleY\":\n\"scaleX\":\"scale\"+b]=r;u[\"translate\"+b]=e*v+(I-e*E)},pinch:function(a){var k=this,v=k.chart,u=k.pinchDown,h=a.touches,e=h.length,n=k.lastValidTouch,d=k.hasZoom,c=k.selectionMarker,w={},b=1===e&&(k.inClass(a.target,\"highcharts-tracker\")&&v.runTrackerClick||k.runChartClick),y={};1<e&&(k.initiated=!0);d&&k.initiated&&!b&&a.preventDefault();F(h,function(a){return k.normalize(a)});\"touchstart\"===a.type?(A(h,function(a,b){u[b]={chartX:a.chartX,chartY:a.chartY}}),n.x=[u[0].chartX,u[1]&&u[1].chartX],n.y=[u[0].chartY,\nu[1]&&u[1].chartY],A(v.axes,function(a){if(a.zoomEnabled){var b=v.bounds[a.horiz?\"h\":\"v\"],c=a.minPixelPadding,d=a.toPixels(g(a.options.min,a.dataMin)),e=a.toPixels(g(a.options.max,a.dataMax)),h=Math.max(d,e);b.min=Math.min(a.pos,Math.min(d,e)-c);b.max=Math.max(a.pos+a.len,h+c)}}),k.res=!0):k.followTouchMove&&1===e?this.runPointActions(k.normalize(a)):u.length&&(c||(k.selectionMarker=c=G({destroy:m,touch:!0},v.plotBox)),k.pinchTranslate(u,h,w,c,y,n),k.hasPinched=d,k.scaleGroups(w,y),k.res&&(k.res=\n!1,this.reset(!1,0)))},touch:function(k,m){var q=this.chart,u,h;if(q.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=q.index;1===k.touches.length?(k=this.normalize(k),(h=q.isInsidePlot(k.chartX-q.plotLeft,k.chartY-q.plotTop))&&!q.openMenu?(m&&this.runPointActions(k),\"touchmove\"===k.type&&(m=this.pinchDown,u=m[0]?4<=Math.sqrt(Math.pow(m[0].chartX-k.chartX,2)+Math.pow(m[0].chartY-k.chartY,2)):!1),g(u,!0)&&this.pinch(k)):m&&this.reset()):2===k.touches.length&&\nthis.pinch(k)},onContainerTouchStart:function(a){this.zoomOption(a);this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(g){C[a.hoverChartIndex]&&C[a.hoverChartIndex].pointer.drop(g)}})})(K);(function(a){var C=a.addEvent,A=a.charts,G=a.css,F=a.doc,m=a.extend,g=a.noop,k=a.Pointer,q=a.removeEvent,v=a.win,u=a.wrap;if(!a.hasTouch&&(v.PointerEvent||v.MSPointerEvent)){var h={},e=!!v.PointerEvent,n=function(){var c=[];c.item=function(a){return this[a]};a.objectEach(h,\nfunction(a){c.push({pageX:a.pageX,pageY:a.pageY,target:a.target})});return c},d=function(c,d,b,e){\"touch\"!==c.pointerType&&c.pointerType!==c.MSPOINTER_TYPE_TOUCH||!A[a.hoverChartIndex]||(e(c),e=A[a.hoverChartIndex].pointer,e[d]({type:b,target:c.currentTarget,preventDefault:g,touches:n()}))};m(k.prototype,{onContainerPointerDown:function(a){d(a,\"onContainerTouchStart\",\"touchstart\",function(a){h[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){d(a,\n\"onContainerTouchMove\",\"touchmove\",function(a){h[a.pointerId]={pageX:a.pageX,pageY:a.pageY};h[a.pointerId].target||(h[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){d(a,\"onDocumentTouchEnd\",\"touchend\",function(a){delete h[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,e?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);a(this.chart.container,e?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);a(F,e?\"pointerup\":\"MSPointerUp\",this.onDocumentPointerUp)}});\nu(k.prototype,\"init\",function(a,d,b){a.call(this,d,b);this.hasZoom&&G(d.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})});u(k.prototype,\"setDOMEvents\",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(C)});u(k.prototype,\"destroy\",function(a){this.batchMSEvents(q);a.call(this)})}})(K);(function(a){var C=a.addEvent,A=a.css,G=a.discardElement,F=a.defined,m=a.each,g=a.isFirefox,k=a.marginNames,q=a.merge,v=a.pick,u=a.setAnimation,h=a.stableSort,e=a.win,n=a.wrap;\na.Legend=function(a,c){this.init(a,c)};a.Legend.prototype={init:function(a,c){this.chart=a;this.setOptions(c);c.enabled&&(this.render(),C(this.chart,\"endResize\",function(){this.legend.positionCheckboxes()}))},setOptions:function(a){var c=v(a.padding,8);this.options=a;this.itemStyle=a.itemStyle;this.itemHiddenStyle=q(this.itemStyle,a.itemHiddenStyle);this.itemMarginTop=a.itemMarginTop||0;this.padding=c;this.initialItemY=c-5;this.itemHeight=this.maxItemWidth=0;this.symbolWidth=v(a.symbolWidth,16);this.pages=\n[]},update:function(a,c){var d=this.chart;this.setOptions(q(!0,this.options,a));this.destroy();d.isDirtyLegend=d.isDirtyBox=!0;v(c,!0)&&d.redraw()},colorizeItem:function(d,c){d.legendGroup[c?\"removeClass\":\"addClass\"](\"highcharts-legend-item-hidden\");var e=this.options,b=d.legendItem,h=d.legendLine,g=d.legendSymbol,n=this.itemHiddenStyle.color,e=c?e.itemStyle.color:n,l=c?d.color||n:n,k=d.options&&d.options.marker,r={fill:l};b&&b.css({fill:e,color:e});h&&h.attr({stroke:l});g&&(k&&g.isMarker&&(r=d.pointAttribs(),\nc||a.objectEach(r,function(a,b){r[b]=n})),g.attr(r))},positionItem:function(a){var c=this.options,d=c.symbolPadding,c=!c.rtl,b=a._legendItemPos,e=b[0],b=b[1],h=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(c?e:this.legendWidth-e-2*d-4,b);h&&(h.x=e,h.y=b)},destroyItem:function(a){var c=a.checkbox;m([\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"],function(c){a[c]&&(a[c]=a[c].destroy())});c&&G(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}m(this.getAllItems(),\nfunction(c){m([\"legendItem\",\"legendGroup\"],a,c)});m(\"clipRect up down pager nav box title group\".split(\" \"),a,this);this.display=null},positionCheckboxes:function(a){var c=this.group&&this.group.alignAttr,d,b=this.clipHeight||this.legendHeight,e=this.titleHeight;c&&(d=c.translateY,m(this.allItems,function(h){var g=h.checkbox,l;g&&(l=d+e+g.y+(a||0)+3,A(g,{left:c.translateX+h.checkboxOffset+g.x-20+\"px\",top:l+\"px\",display:l>d-6&&l<d+b-6?\"\":\"none\"}))}))},renderTitle:function(){var a=this.options,c=this.padding,\ne=a.title,b=0;e.text&&(this.title||(this.title=this.chart.renderer.label(e.text,c-3,c-4,null,null,null,a.useHTML,null,\"legend-title\").attr({zIndex:1}).css(e.style).add(this.group)),a=this.title.getBBox(),b=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:b}));this.titleHeight=b},setText:function(d){var c=this.options;d.legendItem.attr({text:c.labelFormat?a.format(c.labelFormat,d):c.labelFormatter.call(d)})},renderItem:function(a){var c=this.chart,d=c.renderer,b=this.options,e=\n\"horizontal\"===b.layout,h=this.symbolWidth,g=b.symbolPadding,l=this.itemStyle,n=this.itemHiddenStyle,r=this.padding,k=e?v(b.itemDistance,20):0,m=!b.rtl,p=b.width,E=b.itemMarginBottom||0,I=this.itemMarginTop,u=a.legendItem,f=!a.series,t=!f&&a.series.drawLegendSymbol?a.series:a,A=t.options,J=this.createCheckboxForItem&&A&&A.showCheckbox,A=h+g+k+(J?20:0),N=b.useHTML,C=a.options.className;u||(a.legendGroup=d.g(\"legend-item\").addClass(\"highcharts-\"+t.type+\"-series highcharts-color-\"+a.colorIndex+(C?\" \"+\nC:\"\")+(f?\" highcharts-series-\"+a.index:\"\")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=u=d.text(\"\",m?h+g:-g,this.baseline||0,N).css(q(a.visible?l:n)).attr({align:m?\"left\":\"right\",zIndex:2}).add(a.legendGroup),this.baseline||(h=l.fontSize,this.fontMetrics=d.fontMetrics(h,u),this.baseline=this.fontMetrics.f+3+I,u.attr(\"y\",this.baseline)),this.symbolHeight=b.symbolHeight||this.fontMetrics.f,t.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,u,N),J&&this.createCheckboxForItem(a));\nthis.colorizeItem(a,a.visible);l.width||u.css({width:(b.itemWidth||c.spacingBox.width)-A});this.setText(a);d=u.getBBox();l=a.checkboxOffset=b.itemWidth||a.legendItemWidth||d.width+A;this.itemHeight=d=Math.round(a.legendItemHeight||d.height||this.symbolHeight);e&&this.itemX-r+l>(p||c.spacingBox.width-2*r-b.x)&&(this.itemX=r,this.itemY+=I+this.lastLineHeight+E,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,l);this.lastItemY=I+this.itemY+E;this.lastLineHeight=Math.max(d,this.lastLineHeight);\na._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=l:(this.itemY+=I+d+E,this.lastLineHeight=d);this.offsetWidth=p||Math.max((e?this.itemX-r-k:l)+r,this.offsetWidth)},getAllItems:function(){var a=[];m(this.chart.series,function(c){var d=c&&c.options;c&&v(d.showInLegend,F(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(c.legendItems||(\"point\"===d.legendType?c.data:c)))});return a},adjustMargins:function(a,c){var d=this.chart,b=this.options,e=b.align.charAt(0)+b.verticalAlign.charAt(0)+b.layout.charAt(0);\nb.floating||m([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(h,g){h.test(e)&&!F(a[g])&&(d[k[g]]=Math.max(d[k[g]],d.legend[(g+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][g]*b[g%2?\"x\":\"y\"]+v(b.margin,12)+c[g]))})},render:function(){var a=this,c=a.chart,e=c.renderer,b=a.group,g,n,k,l,B=a.box,r=a.options,z=a.padding;a.itemX=z;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;b||(a.group=b=e.g(\"legend\").attr({zIndex:7}).add(),a.contentGroup=e.g().attr({zIndex:1}).add(b),a.scrollGroup=\ne.g().add(a.contentGroup));a.renderTitle();g=a.getAllItems();h(g,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});r.reversed&&g.reverse();a.allItems=g;a.display=n=!!g.length;a.lastLineHeight=0;m(g,function(b){a.renderItem(b)});k=(r.width||a.offsetWidth)+z;l=a.lastItemY+a.lastLineHeight+a.titleHeight;l=a.handleOverflow(l);l+=z;B||(a.box=B=e.rect().addClass(\"highcharts-legend-box\").attr({r:r.borderRadius}).add(b),B.isNew=!0);B.attr({stroke:r.borderColor,\n\"stroke-width\":r.borderWidth||0,fill:r.backgroundColor||\"none\"}).shadow(r.shadow);0<k&&0<l&&(B[B.isNew?\"attr\":\"animate\"](B.crisp({x:0,y:0,width:k,height:l},B.strokeWidth())),B.isNew=!1);B[n?\"show\":\"hide\"]();a.legendWidth=k;a.legendHeight=l;m(g,function(b){a.positionItem(b)});n&&b.align(q(r,{width:k,height:l}),!0,\"spacingBox\");c.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var c=this,d=this.chart,b=d.renderer,e=this.options,h=e.y,g=this.padding,d=d.spacingBox.height+(\"top\"===e.verticalAlign?\n-h:h)-g,h=e.maxHeight,l,n=this.clipRect,r=e.navigation,k=v(r.animation,!0),q=r.arrowSize||12,p=this.nav,E=this.pages,I,u=this.allItems,f=function(a){\"number\"===typeof a?n.attr({height:a}):n&&(c.clipRect=n.destroy(),c.contentGroup.clip());c.contentGroup.div&&(c.contentGroup.div.style.clip=a?\"rect(\"+g+\"px,9999px,\"+(g+a)+\"px,0)\":\"auto\")};\"horizontal\"!==e.layout||\"middle\"===e.verticalAlign||e.floating||(d/=2);h&&(d=Math.min(d,h));E.length=0;a>d&&!1!==r.enabled?(this.clipHeight=l=Math.max(d-20-this.titleHeight-\ng,0),this.currentPage=v(this.currentPage,1),this.fullHeight=a,m(u,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var f=E.length;if(!f||c-E[f-1]>l&&(I||c)!==E[f-1])E.push(I||c),f++;b===u.length-1&&c+a-E[f-1]>l&&E.push(c);c!==I&&(I=c)}),n||(n=c.clipRect=b.clipRect(0,g,9999,0),c.contentGroup.clip(n)),f(l),p||(this.nav=p=b.g().attr({zIndex:1}).add(this.group),this.up=b.symbol(\"triangle\",0,0,q,q).on(\"click\",function(){c.scroll(-1,k)}).add(p),this.pager=b.text(\"\",15,\n10).addClass(\"highcharts-legend-navigation\").css(r.style).add(p),this.down=b.symbol(\"triangle-down\",0,0,q,q).on(\"click\",function(){c.scroll(1,k)}).add(p)),c.scroll(0),a=d):p&&(f(),this.nav=p.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,c){var d=this.pages,b=d.length;a=this.currentPage+a;var e=this.clipHeight,h=this.options.navigation,g=this.pager,l=this.padding;a>b&&(a=b);0<a&&(void 0!==c&&u(c,this.chart),this.nav.attr({translateX:l,translateY:e+this.padding+\n7+this.titleHeight,visibility:\"visible\"}),this.up.attr({\"class\":1===a?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"}),g.attr({text:a+\"/\"+b}),this.down.attr({x:18+this.pager.getBBox().width,\"class\":a===b?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"}),this.up.attr({fill:1===a?h.inactiveColor:h.activeColor}).css({cursor:1===a?\"default\":\"pointer\"}),this.down.attr({fill:a===b?h.inactiveColor:h.activeColor}).css({cursor:a===b?\"default\":\"pointer\"}),c=-d[a-1]+this.initialItemY,\nthis.scrollGroup.animate({translateY:c}),this.currentPage=a,this.positionCheckboxes(c))}};a.LegendSymbolMixin={drawRectangle:function(a,c){var d=a.symbolHeight,b=a.options.squareSymbol;c.legendSymbol=this.chart.renderer.rect(b?(a.symbolWidth-d)/2:0,a.baseline-d+1,b?d:a.symbolWidth,d,v(a.options.symbolRadius,d/2)).addClass(\"highcharts-point\").attr({zIndex:3}).add(c.legendGroup)},drawLineMarker:function(a){var c=this.options,d=c.marker,b=a.symbolWidth,e=a.symbolHeight,h=e/2,g=this.chart.renderer,l=\nthis.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var n;n={\"stroke-width\":c.lineWidth||0};c.dashStyle&&(n.dashstyle=c.dashStyle);this.legendLine=g.path([\"M\",0,a,\"L\",b,a]).addClass(\"highcharts-graph\").attr(n).add(l);d&&!1!==d.enabled&&(c=Math.min(v(d.radius,h),h),0===this.symbol.indexOf(\"url\")&&(d=q(d,{width:e,height:e}),c=0),this.legendSymbol=d=g.symbol(this.symbol,b/2-c,a-c,2*c,2*c,d).addClass(\"highcharts-point\").add(l),d.isMarker=!0)}};(/Trident\\/7\\.0/.test(e.navigator.userAgent)||g)&&\nn(a.Legend.prototype,\"positionItem\",function(a,c){var d=this,b=function(){c._legendItemPos&&a.call(d,c)};b();setTimeout(b)})})(K);(function(a){var C=a.addEvent,A=a.animate,G=a.animObject,F=a.attr,m=a.doc,g=a.Axis,k=a.createElement,q=a.defaultOptions,v=a.discardElement,u=a.charts,h=a.css,e=a.defined,n=a.each,d=a.extend,c=a.find,w=a.fireEvent,b=a.getStyle,y=a.grep,D=a.isNumber,H=a.isObject,l=a.isString,B=a.Legend,r=a.marginNames,z=a.merge,M=a.objectEach,p=a.Pointer,E=a.pick,I=a.pInt,L=a.removeEvent,\nf=a.seriesTypes,t=a.splat,R=a.svg,J=a.syncTimeout,N=a.win,O=a.Renderer,P=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,c){return new P(a,b,c)};d(P.prototype,{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(l(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(b,c){var f,d,e=b.series,p=b.plotOptions||{};b.series=null;f=z(q,b);for(d in f.plotOptions)f.plotOptions[d].tooltip=p[d]&&z(p[d].tooltip)||void 0;f.tooltip.userOptions=\nb.chart&&b.chart.forExport&&b.tooltip.userOptions||b.tooltip;f.series=b.series=e;this.userOptions=b;b=f.chart;d=b.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.callback=c;this.isResizing=0;this.options=f;this.axes=[];this.series=[];this.hasCartesianSeries=b.showAxes;var h=this;h.index=u.length;u.push(h);a.chartCount++;d&&M(d,function(a,b){C(h,b,a)});h.xAxis=[];h.yAxis=[];h.pointCount=h.colorCounter=h.symbolCounter=0;h.firstRender()},initSeries:function(b){var c=this.options.chart;\n(c=f[b.type||c.type||c.defaultSeriesType])||a.error(17,!0);c=new c;c.init(this,b);return c},orderSeries:function(a){var b=this.series;for(a=a||0;a<b.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].name||\"Series \"+(b[a].index+1))},isInsidePlot:function(a,b,c){var f=c?b:a;a=c?a:b;return 0<=f&&f<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(b){var c=this.axes,f=this.series,e=this.pointer,p=this.legend,h=this.isDirtyLegend,l,g,r=this.hasCartesianSeries,t=this.isDirtyBox,x,k=this.renderer,m=\nk.isHidden(),E=[];this.setResponsive&&this.setResponsive(!1);a.setAnimation(b,this);m&&this.temporaryDisplay();this.layOutTitles();for(b=f.length;b--;)if(x=f[b],x.options.stacking&&(l=!0,x.isDirty)){g=!0;break}if(g)for(b=f.length;b--;)x=f[b],x.options.stacking&&(x.isDirty=!0);n(f,function(a){a.isDirty&&\"point\"===a.options.legendType&&(a.updateTotals&&a.updateTotals(),h=!0);a.isDirtyData&&w(a,\"updatedData\")});h&&p.options.enabled&&(p.render(),this.isDirtyLegend=!1);l&&this.getStacks();r&&n(c,function(a){a.updateNames();\na.setScale()});this.getMargins();r&&(n(c,function(a){a.isDirty&&(t=!0)}),n(c,function(a){var b=a.min+\",\"+a.max;a.extKey!==b&&(a.extKey=b,E.push(function(){w(a,\"afterSetExtremes\",d(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(t||l)&&a.redraw()}));t&&this.drawChartBox();w(this,\"predraw\");n(f,function(a){(t||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});e&&e.reset(!0);k.draw();w(this,\"redraw\");w(this,\"render\");m&&this.temporaryDisplay(!0);n(E,function(a){a.call()})},get:function(a){function b(b){return b.id===\na||b.options&&b.options.id===a}var f,d=this.series,e;f=c(this.axes,b)||c(this.series,b);for(e=0;!f&&e<d.length;e++)f=c(d[e].points||[],b);return f},getAxes:function(){var a=this,b=this.options,c=b.xAxis=t(b.xAxis||{}),b=b.yAxis=t(b.yAxis||{});n(c,function(a,b){a.index=b;a.isX=!0});n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new g(a,b)})},getSelectedPoints:function(){var a=[];n(this.series,function(b){a=a.concat(y(b.data||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return y(this.series,\nfunction(a){return a.selected})},setTitle:function(a,b,c){var f=this,d=f.options,e;e=d.title=z({style:{color:\"#333333\",fontSize:d.isStock?\"16px\":\"18px\"}},d.title,a);d=d.subtitle=z({style:{color:\"#666666\"}},d.subtitle,b);n([[\"title\",a,e],[\"subtitle\",b,d]],function(a,b){var c=a[0],d=f[c],e=a[1];a=a[2];d&&e&&(f[c]=d=d.destroy());a&&a.text&&!d&&(f[c]=f.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,\"class\":\"highcharts-\"+c,zIndex:a.zIndex||4}).add(),f[c].update=function(a){f.setTitle(!b&&a,b&&\na)},f[c].css(a.style))});f.layOutTitles(c)},layOutTitles:function(a){var b=0,c,f=this.renderer,e=this.spacingBox;n([\"title\",\"subtitle\"],function(a){var c=this[a],p=this.options[a];a=\"title\"===a?-3:p.verticalAlign?0:b+2;var h;c&&(h=p.style.fontSize,h=f.fontMetrics(h,c).b,c.css({width:(p.width||e.width+p.widthAdjust)+\"px\"}).align(d({y:a+h},p),!1,\"spacingBox\"),p.floating||p.verticalAlign||(b=Math.ceil(b+c.getBBox(p.useHTML).height)))},this);c=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&\nc&&(this.isDirtyBox=c,this.hasRendered&&E(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var c=this.options.chart,f=c.width,c=c.height,d=this.renderTo;e(f)||(this.containerWidth=b(d,\"width\"));e(c)||(this.containerHeight=b(d,\"height\"));this.chartWidth=Math.max(0,f||this.containerWidth||600);this.chartHeight=Math.max(0,a.relativeLength(c,this.chartWidth)||this.containerHeight||400)},temporaryDisplay:function(c){var f=this.renderTo;if(c)for(;f&&f.style;)f.hcOrigStyle&&(a.css(f,f.hcOrigStyle),\ndelete f.hcOrigStyle),f=f.parentNode;else for(;f&&f.style;)\"none\"===b(f,\"display\",!1)&&(f.hcOrigStyle={display:f.style.display,height:f.style.height,overflow:f.style.overflow},c={display:\"block\",overflow:\"hidden\"},f!==this.renderTo&&(c.height=0),a.css(f,c),f.style.setProperty&&f.style.setProperty(\"display\",\"block\",\"important\")),f=f.parentNode},setClassName:function(a){this.container.className=\"highcharts-container \"+(a||\"\")},getContainer:function(){var b,c=this.options,f=c.chart,e,p;b=this.renderTo;\nvar h=a.uniqueKey(),g;b||(this.renderTo=b=f.renderTo);l(b)&&(this.renderTo=b=m.getElementById(b));b||a.error(13,!0);e=I(F(b,\"data-highcharts-chart\"));D(e)&&u[e]&&u[e].hasRendered&&u[e].destroy();F(b,\"data-highcharts-chart\",this.index);b.innerHTML=\"\";f.skipClone||b.offsetWidth||this.temporaryDisplay();this.getChartSize();e=this.chartWidth;p=this.chartHeight;g=d({position:\"relative\",overflow:\"hidden\",width:e+\"px\",height:p+\"px\",textAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\"},\nf.style);this.container=b=k(\"div\",{id:h},g,b);this._cursor=b.style.cursor;this.renderer=new (a[f.renderer]||O)(b,e,p,null,f.forExport,c.exporting&&c.exporting.allowHTML);this.setClassName(f.className);this.renderer.setStyle(f.style);this.renderer.chartIndex=this.index},getMargins:function(a){var b=this.spacing,c=this.margin,f=this.titleOffset;this.resetMargins();f&&!e(c[0])&&(this.plotTop=Math.max(this.plotTop,f+this.options.title.margin+b[0]));this.legend.display&&this.legend.adjustMargins(c,b);\nthis.extraMargin&&(this[this.extraMargin.type]=(this[this.extraMargin.type]||0)+this.extraMargin.value);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],c=a.margin;a.hasCartesianSeries&&n(a.axes,function(a){a.visible&&a.getOffset()});n(r,function(f,d){e(c[d])||(a[f]+=b[d])});a.setChartSize()},reflow:function(a){var c=this,f=c.options.chart,d=c.renderTo,p=e(f.width),h=f.width||b(d,\"width\"),f=f.height||b(d,\n\"height\"),d=a?a.target:N;if(!p&&!c.isPrinting&&h&&f&&(d===N||d===m)){if(h!==c.containerWidth||f!==c.containerHeight)clearTimeout(c.reflowTimeout),c.reflowTimeout=J(function(){c.container&&c.setSize(void 0,void 0,!1)},a?100:0);c.containerWidth=h;c.containerHeight=f}},initReflow:function(){var a=this,b;b=C(N,\"resize\",function(b){a.reflow(b)});C(a,\"destroy\",b)},setSize:function(b,c,f){var d=this,e=d.renderer;d.isResizing+=1;a.setAnimation(f,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;\nvoid 0!==b&&(d.options.chart.width=b);void 0!==c&&(d.options.chart.height=c);d.getChartSize();b=e.globalAnimation;(b?A:h)(d.container,{width:d.chartWidth+\"px\",height:d.chartHeight+\"px\"},b);d.setChartSize(!0);e.setSize(d.chartWidth,d.chartHeight,f);n(d.axes,function(a){a.isDirty=!0;a.setScale()});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(f);d.oldChartHeight=null;w(d,\"resize\");J(function(){d&&w(d,\"endResize\",null,function(){--d.isResizing})},G(b).duration)},setChartSize:function(a){function b(a){a=\nl[a]||0;return Math.max(m||a,a)/2}var c=this.inverted,f=this.renderer,d=this.chartWidth,e=this.chartHeight,p=this.options.chart,h=this.spacing,l=this.clipOffset,g,r,t,k,m;this.plotLeft=g=Math.round(this.plotLeft);this.plotTop=r=Math.round(this.plotTop);this.plotWidth=t=Math.max(0,Math.round(d-g-this.marginRight));this.plotHeight=k=Math.max(0,Math.round(e-r-this.marginBottom));this.plotSizeX=c?k:t;this.plotSizeY=c?t:k;this.plotBorderWidth=p.plotBorderWidth||0;this.spacingBox=f.spacingBox={x:h[3],y:h[0],\nwidth:d-h[3]-h[1],height:e-h[0]-h[2]};this.plotBox=f.plotBox={x:g,y:r,width:t,height:k};m=2*Math.floor(this.plotBorderWidth/2);c=Math.ceil(b(3));f=Math.ceil(b(0));this.clipBox={x:c,y:f,width:Math.floor(this.plotSizeX-b(1)-c),height:Math.max(0,Math.floor(this.plotSizeY-b(2)-f))};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this,b=a.options.chart;n([\"margin\",\"spacing\"],function(c){var f=b[c],d=H(f)?f:[f,f,f,f];n([\"Top\",\"Right\",\"Bottom\",\"Left\"],function(f,\ne){a[c][e]=E(b[c+f],d[e])})});n(r,function(b,c){a[b]=E(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,f=this.chartHeight,d=this.chartBackground,e=this.plotBackground,p=this.plotBorder,h,l=this.plotBGImage,g=a.backgroundColor,n=a.plotBackgroundColor,r=a.plotBackgroundImage,t,k=this.plotLeft,m=this.plotTop,E=this.plotWidth,w=this.plotHeight,q=this.plotBox,I=this.clipRect,z=this.clipBox,y=\"animate\";\nd||(this.chartBackground=d=b.rect().addClass(\"highcharts-background\").add(),y=\"attr\");h=a.borderWidth||0;t=h+(a.shadow?8:0);g={fill:g||\"none\"};if(h||d[\"stroke-width\"])g.stroke=a.borderColor,g[\"stroke-width\"]=h;d.attr(g).shadow(a.shadow);d[y]({x:t/2,y:t/2,width:c-t-h%2,height:f-t-h%2,r:a.borderRadius});y=\"animate\";e||(y=\"attr\",this.plotBackground=e=b.rect().addClass(\"highcharts-plot-background\").add());e[y](q);e.attr({fill:n||\"none\"}).shadow(a.plotShadow);r&&(l?l.animate(q):this.plotBGImage=b.image(r,\nk,m,E,w).add());I?I.animate({width:z.width,height:z.height}):this.clipRect=b.clipRect(z);y=\"animate\";p||(y=\"attr\",this.plotBorder=p=b.rect().addClass(\"highcharts-plot-border\").attr({zIndex:1}).add());p.attr({stroke:a.plotBorderColor,\"stroke-width\":a.plotBorderWidth||0,fill:\"none\"});p[y](p.crisp({x:k,y:m,width:E,height:w},-p.strokeWidth()));this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,p;n([\"inverted\",\"angular\",\"polar\"],function(h){c=f[b.type||b.defaultSeriesType];\np=b[h]||c&&c.prototype[h];for(e=d&&d.length;!p&&e--;)(c=f[d[e].type])&&c.prototype[h]&&(p=!0);a[h]=p})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var c=b.options.linkedTo;l(c)&&(c=\":previous\"===c?a.series[b.index-1]:a.get(c))&&c.linkedParent!==b&&(c.linkedSeries.push(b),b.linkedParent=c,b.visible=E(b.options.visible,c.options.visible,b.visible))})},renderSeries:function(){n(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=\nthis,b=a.options.labels;b.items&&n(b.items,function(c){var f=d(b.style,c.style),e=I(f.left)+a.plotLeft,p=I(f.top)+a.plotTop+12;delete f.left;delete f.top;a.renderer.text(c.html,e,p).attr({zIndex:2}).css(f).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options,f,d,e;this.setTitle();this.legend=new B(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();c=this.plotWidth;f=this.plotHeight-=21;n(a,function(a){a.setScale()});this.getAxisMargins();d=\n1.1<c/this.plotWidth;e=1.05<f/this.plotHeight;if(d||e)n(a,function(a){(a.horiz&&d||!a.horiz&&e)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&n(a,function(a){a.visible&&a.render()});this.seriesGroup||(this.seriesGroup=b.g(\"series-group\").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},addCredits:function(a){var b=this;a=z(!0,this.options.credits,a);a.enabled&&!this.credits&&\n(this.credits=this.renderer.text(a.text+(this.mapCredits||\"\"),0,0).addClass(\"highcharts-credits\").on(\"click\",function(){a.href&&(N.location.href=a.href)}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position),this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var b=this,c=b.axes,f=b.series,d=b.container,e,p=d&&d.parentNode;w(b,\"destroy\");b.renderer.forExport?a.erase(u,b):u[b.index]=void 0;a.chartCount--;b.renderTo.removeAttribute(\"data-highcharts-chart\");\nL(b);for(e=c.length;e--;)c[e]=c[e].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(e=f.length;e--;)f[e]=f[e].destroy();n(\"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer\".split(\" \"),function(a){var c=b[a];c&&c.destroy&&(b[a]=c.destroy())});d&&(d.innerHTML=\"\",L(d),p&&v(d));M(b,function(a,c){delete b[c]})},isReadyToRender:function(){var a=this;return R||N!=N.top||\n\"complete\"===m.readyState?!0:(m.attachEvent(\"onreadystatechange\",function(){m.detachEvent(\"onreadystatechange\",a.firstRender);\"complete\"===m.readyState&&a.firstRender()}),!1)},firstRender:function(){var a=this,b=a.options;if(a.isReadyToRender()){a.getContainer();w(a,\"init\");a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();n(b.series||[],function(b){a.initSeries(b)});a.linkSeries();w(a,\"beforeRender\");p&&(a.pointer=new p(a,b));a.render();if(!a.renderer.imgCount&&a.onload)a.onload();\na.temporaryDisplay(!0)}},onload:function(){n([this.callback].concat(this.callbacks),function(a){a&&void 0!==this.index&&a.apply(this,[this])},this);w(this,\"load\");w(this,\"render\");e(this.index)&&!1!==this.options.chart.reflow&&this.initReflow();this.onload=null}})})(K);(function(a){var C,A=a.each,G=a.extend,F=a.erase,m=a.fireEvent,g=a.format,k=a.isArray,q=a.isNumber,v=a.pick,u=a.removeEvent;a.Point=C=function(){};a.Point.prototype={init:function(a,e,g){this.series=a;this.color=a.color;this.applyOptions(e,\ng);a.options.colorByPoint?(e=a.options.colors||a.chart.options.colors,this.color=this.color||e[a.colorCounter],e=e.length,g=a.colorCounter,a.colorCounter++,a.colorCounter===e&&(a.colorCounter=0)):g=a.colorIndex;this.colorIndex=v(this.colorIndex,g);a.chart.pointCount++;return this},applyOptions:function(a,e){var h=this.series,d=h.options.pointValKey||h.pointValKey;a=C.prototype.optionsToObject.call(this,a);G(this,a);this.options=this.options?G(this.options,a):a;a.group&&delete this.group;d&&(this.y=\nthis[d]);this.isNull=v(this.isValid&&!this.isValid(),null===this.x||!q(this.y,!0));this.selected&&(this.state=\"select\");\"name\"in this&&void 0===e&&h.xAxis&&h.xAxis.hasNames&&(this.x=h.xAxis.nameToX(this));void 0===this.x&&h&&(this.x=void 0===e?h.autoIncrement(this):e);return this},optionsToObject:function(a){var e={},h=this.series,d=h.options.keys,c=d||h.pointArrayMap||[\"y\"],g=c.length,b=0,m=0;if(q(a)||null===a)e[c[0]]=a;else if(k(a))for(!d&&a.length>g&&(h=typeof a[0],\"string\"===h?e.name=a[0]:\"number\"===\nh&&(e.x=a[0]),b++);m<g;)d&&void 0===a[b]||(e[c[m]]=a[b]),b++,m++;else\"object\"===typeof a&&(e=a,a.dataLabels&&(h._hasPointLabels=!0),a.marker&&(h._hasPointMarkers=!0));return e},getClassName:function(){return\"highcharts-point\"+(this.selected?\" highcharts-point-select\":\"\")+(this.negative?\" highcharts-negative\":\"\")+(this.isNull?\" highcharts-null-point\":\"\")+(void 0!==this.colorIndex?\" highcharts-color-\"+this.colorIndex:\"\")+(this.options.className?\" \"+this.options.className:\"\")+(this.zone&&this.zone.className?\n\" \"+this.zone.className.replace(\"highcharts-negative\",\"\"):\"\")},getZone:function(){var a=this.series,e=a.zones,a=a.zoneAxis||\"y\",g=0,d;for(d=e[g];this[a]>=d.value;)d=e[++g];d&&d.color&&!this.options.color&&(this.color=d.color);return d},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),F(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)u(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);\nfor(g in this)this[g]=null},destroyElements:function(){for(var a=[\"graphic\",\"dataLabel\",\"dataLabelUpper\",\"connector\",\"shadowGroup\"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,h=e.tooltipOptions,d=v(h.valueDecimals,\"\"),\nc=h.valuePrefix||\"\",k=h.valueSuffix||\"\";A(e.pointArrayMap||[\"y\"],function(b){b=\"{point.\"+b;if(c||k)a=a.replace(b+\"}\",c+b+\"}\"+k);a=a.replace(b+\"}\",b+\":,.\"+d+\"f}\")});return g(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var d=this,c=this.series.options;(c.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();\"click\"===a&&c.allowPointSelect&&(g=function(a){d.select&&d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});m(this,a,e,g)},visible:!0}})(K);\n(function(a){var C=a.addEvent,A=a.animObject,G=a.arrayMax,F=a.arrayMin,m=a.correctFloat,g=a.Date,k=a.defaultOptions,q=a.defaultPlotOptions,v=a.defined,u=a.each,h=a.erase,e=a.extend,n=a.fireEvent,d=a.grep,c=a.isArray,w=a.isNumber,b=a.isString,y=a.merge,D=a.objectEach,H=a.pick,l=a.removeEvent,B=a.splat,r=a.SVGElement,z=a.syncTimeout,M=a.win;a.Series=a.seriesType(\"line\",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:\"#ffffff\",radius:4,\nstates:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:\"#cccccc\",lineColor:\"#000000\",lineWidth:2}}},point:{events:{}},dataLabels:{align:\"center\",formatter:function(){return null===this.y?\"\":a.numberFormat(this.y,-1)},style:{fontSize:\"11px\",fontWeight:\"bold\",color:\"contrast\",textOutline:\"1px contrast\"},verticalAlign:\"bottom\",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{animation:{duration:50},lineWidthPlus:1,marker:{},\nhalo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:\"x\"},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:[\"xAxis\",\"yAxis\"],colorCounter:0,parallelArrays:[\"x\",\"y\"],coll:\"series\",init:function(a,b){var c=this,d,f=a.series,p;c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();e(c,{name:b.name,state:\"\",visible:!1!==b.visible,selected:!0===b.selected});d=b.events;D(d,function(a,b){C(c,b,a)});if(d&&\nd.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();u(c.parallelArrays,function(a){c[a+\"Data\"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(p=f[f.length-1]);c._i=H(p&&p._i,-1)+1;a.orderSeries(this.insert(f))},insert:function(a){var b=this.options.index,c;if(w(b)){for(c=a.length;c--;)if(b>=H(a[c].options.index,a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return H(c,\na.length-1)},bindAxes:function(){var b=this,c=b.options,d=b.chart,e;u(b.axisTypes||[],function(f){u(d[f],function(a){e=a.options;if(c[f]===e.index||void 0!==c[f]&&c[f]===e.id||void 0===c[f]&&0===e.index)b.insert(a.series),b[f]=a,a.isDirty=!0});b[f]||b.optionalAxis===f||a.error(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments,f=w(b)?function(f){var d=\"y\"===f&&c.toYData?c.toYData(a):a[f];c[f+\"Data\"][b]=d}:function(a){Array.prototype[b].apply(c[a+\"Data\"],Array.prototype.slice.call(d,\n2))};u(c.parallelArrays,f)},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=H(b,a.pointStart,0);this.pointInterval=c=H(this.pointInterval,a.pointInterval,1);d&&(a=new g(b),\"day\"===d?a=+a[g.hcSetDate](a[g.hcGetDate]()+c):\"month\"===d?a=+a[g.hcSetMonth](a[g.hcGetMonth]()+c):\"year\"===d&&(a=+a[g.hcSetFullYear](a[g.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options,d=c.plotOptions,f=(b.userOptions||{}).plotOptions||\n{},e=d[this.type];this.userOptions=a;b=y(e,d.series,a);this.tooltipOptions=y(k.tooltip,k.plotOptions.series&&k.plotOptions.series.tooltip,k.plotOptions[this.type].tooltip,c.tooltip.userOptions,d.series&&d.series.tooltip,d[this.type].tooltip,a.tooltip);this.stickyTracking=H(a.stickyTracking,f[this.type]&&f[this.type].stickyTracking,f.series&&f.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:b.stickyTracking);null===e.marker&&delete b.marker;this.zoneAxis=b.zoneAxis;a=this.zones=\n(b.zones||[]).slice();!b.negativeColor&&!b.negativeFillColor||b.zones||a.push({value:b[this.zoneAxis+\"Threshold\"]||b.threshold||0,className:\"highcharts-negative\",color:b.negativeColor,fillColor:b.negativeFillColor});a.length&&v(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});return b},getCyclic:function(a,b,c){var d,f=this.chart,e=this.userOptions,p=a+\"Index\",h=a+\"Counter\",l=c?c.length:H(f.options.chart[a+\"Count\"],f[a+\"Count\"]);b||(d=H(e[p],e[\"_\"+p]),v(d)||(f.series.length||\n(f[h]=0),e[\"_\"+p]=d=f[h]%l,f[h]+=1),c&&(b=c[d]));void 0!==d&&(this[p]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic(\"color\",this.options.color||q[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic(\"symbol\",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(d,e,h,l){var f=this,p=f.points,g=p&&p.length||0,r,n=f.options,k=f.chart,m=null,q=f.xAxis,\nE=n.turboThreshold,z=this.xData,y=this.yData,I=(r=f.pointArrayMap)&&r.length;d=d||[];r=d.length;e=H(e,!0);if(!1!==l&&r&&g===r&&!f.cropped&&!f.hasGroupedData&&f.visible)u(d,function(a,b){p[b].update&&a!==n.data[b]&&p[b].update(a,!1,null,!1)});else{f.xIncrement=null;f.colorCounter=0;u(this.parallelArrays,function(a){f[a+\"Data\"].length=0});if(E&&r>E){for(h=0;null===m&&h<r;)m=d[h],h++;if(w(m))for(h=0;h<r;h++)z[h]=this.autoIncrement(),y[h]=d[h];else if(c(m))if(I)for(h=0;h<r;h++)m=d[h],z[h]=m[0],y[h]=m.slice(1,\nI+1);else for(h=0;h<r;h++)m=d[h],z[h]=m[0],y[h]=m[1];else a.error(12)}else for(h=0;h<r;h++)void 0!==d[h]&&(m={series:f},f.pointClass.prototype.applyOptions.apply(m,[d[h]]),f.updateParallelArrays(m,h));b(y[0])&&a.error(14,!0);f.data=[];f.options.data=f.userOptions.data=d;for(h=g;h--;)p[h]&&p[h].destroy&&p[h].destroy();q&&(q.minRange=q.userMinRange);f.isDirty=k.isDirtyBox=!0;f.isDirtyData=!!p;h=!1}\"point\"===n.legendType&&(this.processData(),this.generatePoints());e&&k.redraw(h)},processData:function(b){var c=\nthis.xData,d=this.yData,e=c.length,f;f=0;var h,p,l=this.xAxis,g,r=this.options;g=r.cropThreshold;var n=this.getExtremesFromAll||r.getExtremesFromAll,k=this.isCartesian,r=l&&l.val2lin,m=l&&l.isLog,q,w;if(k&&!this.isDirty&&!l.isDirty&&!this.yAxis.isDirty&&!b)return!1;l&&(b=l.getExtremes(),q=b.min,w=b.max);if(k&&this.sorted&&!n&&(!g||e>g||this.forceCrop))if(c[e-1]<q||c[0]>w)c=[],d=[];else if(c[0]<q||c[e-1]>w)f=this.cropData(this.xData,this.yData,q,w),c=f.xData,d=f.yData,f=f.start,h=!0;for(g=c.length||\n1;--g;)e=m?r(c[g])-r(c[g-1]):c[g]-c[g-1],0<e&&(void 0===p||e<p)?p=e:0>e&&this.requireSorting&&a.error(15);this.cropped=h;this.cropStart=f;this.processedXData=c;this.processedYData=d;this.closestPointRange=p},cropData:function(a,b,c,d){var f=a.length,e=0,h=f,p=H(this.cropShoulder,1),l;for(l=0;l<f;l++)if(a[l]>=c){e=Math.max(0,l-p);break}for(c=l;c<f;c++)if(a[c]>d){h=c+p;break}return{xData:a.slice(e,h),yData:b.slice(e,h),start:e,end:h}},generatePoints:function(){var a=this.options,b=a.data,c=this.data,\nd,f=this.processedXData,e=this.processedYData,h=this.pointClass,l=f.length,g=this.cropStart||0,r,n=this.hasGroupedData,a=a.keys,k,m=[],q;c||n||(c=[],c.length=b.length,c=this.data=c);a&&n&&(this.options.keys=!1);for(q=0;q<l;q++)r=g+q,n?(k=(new h).init(this,[f[q]].concat(B(e[q]))),k.dataGroup=this.groupMap[q]):(k=c[r])||void 0===b[r]||(c[r]=k=(new h).init(this,b[r],f[q])),k&&(k.index=r,m[q]=k);this.options.keys=a;if(c&&(l!==(d=c.length)||n))for(q=0;q<d;q++)q!==g||n||(q+=l),c[q]&&(c[q].destroyElements(),\nc[q].plotX=void 0);this.data=c;this.points=m},getExtremes:function(a){var b=this.yAxis,d=this.processedXData,e,f=[],h=0;e=this.xAxis.getExtremes();var p=e.min,l=e.max,g,r,n,k;a=a||this.stackedYData||this.processedYData||[];e=a.length;for(k=0;k<e;k++)if(r=d[k],n=a[k],g=(w(n,!0)||c(n))&&(!b.positiveValuesOnly||n.length||0<n),r=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(d[k]||r)>=p&&(d[k]||r)<=l,g&&r)if(g=n.length)for(;g--;)null!==n[g]&&(f[h++]=n[g]);else f[h++]=n;this.dataMin=\nF(f);this.dataMax=G(f)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,f=this.yAxis,e=this.points,h=e.length,l=!!this.modifyValue,g=a.pointPlacement,r=\"between\"===g||w(g),n=a.threshold,k=a.startFromThreshold?n:0,q,z,y,B,u=Number.MAX_VALUE;\"between\"===g&&(g=.5);w(g)&&(g*=H(a.pointRange||c.pointRange));for(a=0;a<h;a++){var D=e[a],M=D.x,A=D.y;z=D.low;var C=b&&f.stacks[(this.negStacks&&A<(k?0:n)?\"-\":\"\")+this.stackKey],\nF;f.positiveValuesOnly&&null!==A&&0>=A&&(D.isNull=!0);D.plotX=q=m(Math.min(Math.max(-1E5,c.translate(M,0,0,0,1,g,\"flags\"===this.type)),1E5));b&&this.visible&&!D.isNull&&C&&C[M]&&(B=this.getStackIndicator(B,M,this.index),F=C[M],A=F.points[B.key],z=A[0],A=A[1],z===k&&B.key===C[M].base&&(z=H(n,f.min)),f.positiveValuesOnly&&0>=z&&(z=null),D.total=D.stackTotal=F.total,D.percentage=F.total&&D.y/F.total*100,D.stackY=A,F.setOffset(this.pointXOffset||0,this.barW||0));D.yBottom=v(z)?f.translate(z,0,1,0,1):\nnull;l&&(A=this.modifyValue(A,D));D.plotY=z=\"number\"===typeof A&&Infinity!==A?Math.min(Math.max(-1E5,f.translate(A,0,1,0,1)),1E5):void 0;D.isInside=void 0!==z&&0<=z&&z<=f.len&&0<=q&&q<=c.len;D.clientX=r?m(c.translate(M,0,0,0,1,g)):q;D.negative=D.y<(n||0);D.category=d&&void 0!==d[D.x]?d[D.x]:D.x;D.isNull||(void 0!==y&&(u=Math.min(u,Math.abs(q-y))),y=q);D.zone=this.zones.length&&D.getZone()}this.closestPointRangePx=u},getValidPoints:function(a,b){var c=this.chart;return d(a||this.points||[],function(a){return b&&\n!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,f=b.inverted,e=this.clipBox,h=e||b.clipBox,l=this.sharedClipKey||[\"_sharedClip\",a&&a.duration,a&&a.easing,h.height,c.xAxis,c.yAxis].join(),g=b[l],p=b[l+\"m\"];g||(a&&(h.width=0,b[l+\"m\"]=p=d.clipRect(-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),b[l]=g=d.clipRect(h),g.count={length:0});a&&!g.count[this.index]&&(g.count[this.index]=!0,g.count.length+=1);!1!==c.clip&&\n(this.group.clip(a||e?g:b.clipRect),this.markerGroup.clip(p),this.sharedClipKey=l);a||(g.count[this.index]&&(delete g.count[this.index],--g.count.length),0===g.count.length&&l&&b[l]&&(e||(b[l]=b[l].destroy()),b[l+\"m\"]&&(b[l+\"m\"]=b[l+\"m\"].destroy())))},animate:function(a){var b=this.chart,c=A(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+\"m\"]&&b[d+\"m\"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();\nn(this,\"afterAnimate\")},drawPoints:function(){var a=this.points,b=this.chart,c,d,f,e,h=this.options.marker,l,g,r,n,k=this[this.specialGroup]||this.markerGroup,m=H(h.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>=2*h.radius);if(!1!==h.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++)f=a[d],c=f.plotY,e=f.graphic,l=f.marker||{},g=!!f.marker,r=m&&void 0===l.enabled||l.enabled,n=f.isInside,r&&w(c)&&null!==f.y?(c=H(l.symbol,this.symbol),f.hasImage=0===c.indexOf(\"url\"),r=this.markerAttribs(f,\nf.selected&&\"select\"),e?e[n?\"show\":\"hide\"](!0).animate(r):n&&(0<r.width||f.hasImage)&&(f.graphic=e=b.renderer.symbol(c,r.x,r.y,r.width,r.height,g?l:h).add(k)),e&&e.attr(this.pointAttribs(f,f.selected&&\"select\")),e&&e.addClass(f.getClassName(),!0)):e&&(f.graphic=e.destroy())},markerAttribs:function(a,b){var c=this.options.marker,d=a.marker||{},f=H(d.radius,c.radius);b&&(c=c.states[b],b=d.states&&d.states[b],f=H(b&&b.radius,c&&c.radius,f+(c&&c.radiusPlus||0)));a.hasImage&&(f=0);a={x:Math.floor(a.plotX)-\nf,y:a.plotY-f};f&&(a.width=a.height=2*f);return a},pointAttribs:function(a,b){var c=this.options.marker,d=a&&a.options,f=d&&d.marker||{},e=this.color,h=d&&d.color,l=a&&a.color,d=H(f.lineWidth,c.lineWidth);a=a&&a.zone&&a.zone.color;e=h||a||l||e;a=f.fillColor||c.fillColor||e;e=f.lineColor||c.lineColor||e;b&&(c=c.states[b],b=f.states&&f.states[b]||{},d=H(b.lineWidth,c.lineWidth,d+H(b.lineWidthPlus,c.lineWidthPlus,0)),a=b.fillColor||c.fillColor||a,e=b.lineColor||c.lineColor||e);return{stroke:e,\"stroke-width\":d,\nfill:a}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\\/533/.test(M.navigator.userAgent),d,f,e=a.data||[],g,k;n(a,\"destroy\");l(a);u(a.axisTypes||[],function(b){(k=a[b])&&k.series&&(h(k.series,a),k.isDirty=k.forceRedraw=!0)});a.legendItem&&a.chart.legend.destroyItem(a);for(f=e.length;f--;)(g=e[f])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);D(a,function(a,b){a instanceof r&&!a.survive&&(d=c&&\"group\"===b?\"hide\":\"destroy\",a[d]())});b.hoverSeries===a&&(b.hoverSeries=\nnull);h(b.series,a);b.orderSeries();D(a,function(b,c){delete a[c]})},getGraphPath:function(a,b,c){var d=this,f=d.options,e=f.step,h,l=[],g=[],p;a=a||d.points;(h=a.reversed)&&a.reverse();(e={right:1,center:2}[e]||e&&3)&&h&&(e=4-e);!f.connectNulls||b||c||(a=this.getValidPoints(a));u(a,function(h,r){var n=h.plotX,k=h.plotY,m=a[r-1];(h.leftCliff||m&&m.rightCliff)&&!c&&(p=!0);h.isNull&&!v(b)&&0<r?p=!f.connectNulls:h.isNull&&!b?p=!0:(0===r||p?r=[\"M\",h.plotX,h.plotY]:d.getPointSpline?r=d.getPointSpline(a,\nh,r):e?(r=1===e?[\"L\",m.plotX,k]:2===e?[\"L\",(m.plotX+n)/2,m.plotY,\"L\",(m.plotX+n)/2,k]:[\"L\",n,m.plotY],r.push(\"L\",n,k)):r=[\"L\",n,k],g.push(h.x),e&&g.push(h.x),l.push.apply(l,r),p=!1)});l.xMap=g;return d.graphPath=l},drawGraph:function(){var a=this,b=this.options,c=(this.gappedPath||this.getGraphPath).call(this),d=[[\"graph\",\"highcharts-graph\",b.lineColor||this.color,b.dashStyle]];u(this.zones,function(c,e){d.push([\"zone-graph-\"+e,\"highcharts-graph highcharts-zone-graph-\"+e+\" \"+(c.className||\"\"),c.color||\na.color,c.dashStyle||b.dashStyle])});u(d,function(f,d){var e=f[0],h=a[e];h?(h.endX=c.xMap,h.animate({d:c})):c.length&&(a[e]=a.chart.renderer.path(c).addClass(f[1]).attr({zIndex:1}).add(a.group),h={stroke:f[2],\"stroke-width\":b.lineWidth,fill:a.fillGraph&&a.color||\"none\"},f[3]?h.dashstyle=f[3]:\"square\"!==b.linecap&&(h[\"stroke-linecap\"]=h[\"stroke-linejoin\"]=\"round\"),h=a[e].attr(h).shadow(2>d&&b.shadow));h&&(h.startX=c.xMap,h.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,\nd=this.zones,f,e,h=this.clips||[],l,g=this.graph,r=this.area,n=Math.max(b.chartWidth,b.chartHeight),k=this[(this.zoneAxis||\"y\")+\"Axis\"],m,q,w=b.inverted,z,y,B,v,D=!1;d.length&&(g||r)&&k&&void 0!==k.min&&(q=k.reversed,z=k.horiz,g&&g.hide(),r&&r.hide(),m=k.getExtremes(),u(d,function(d,p){f=q?z?b.plotWidth:0:z?0:k.toPixels(m.min);f=Math.min(Math.max(H(e,f),0),n);e=Math.min(Math.max(Math.round(k.toPixels(H(d.value,m.max),!0)),0),n);D&&(f=e=k.toPixels(m.max));y=Math.abs(f-e);B=Math.min(f,e);v=Math.max(f,\ne);k.isXAxis?(l={x:w?v:B,y:0,width:y,height:n},z||(l.x=b.plotHeight-l.x)):(l={x:0,y:w?v:B,width:n,height:y},z&&(l.y=b.plotWidth-l.y));w&&c.isVML&&(l=k.isXAxis?{x:0,y:q?B:v,height:l.width,width:b.chartWidth}:{x:l.y-b.plotLeft-b.spacingBox.x,y:0,width:l.height,height:b.chartHeight});h[p]?h[p].animate(l):(h[p]=c.clipRect(l),g&&a[\"zone-graph-\"+p].clip(h[p]),r&&a[\"zone-area-\"+p].clip(h[p]));D=d.value>m.max}),this.clips=h)},invertGroups:function(a){function b(){u([\"group\",\"markerGroup\"],function(b){c[b]&&\n(d.renderer.isVML&&c[b].attr({width:c.yAxis.len,height:c.xAxis.len}),c[b].width=c.yAxis.len,c[b].height=c.xAxis.len,c[b].invert(a))})}var c=this,d=c.chart,f;c.xAxis&&(f=C(d,\"resize\",b),C(c,\"destroy\",f),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,f){var e=this[a],h=!e;h&&(this[a]=e=this.chart.renderer.g().attr({zIndex:d||.1}).add(f));e.addClass(\"highcharts-\"+b+\" highcharts-series-\"+this.index+\" highcharts-\"+this.type+\"-series highcharts-color-\"+this.colorIndex+\" \"+(this.options.className||\"\"),\n!0);e.attr({visibility:c})[h?\"attr\":\"animate\"](this.getPlotBox());return e},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,f=!!a.animate&&b.renderer.isSVG&&A(d.animation).duration,e=a.visible?\"inherit\":\"hidden\",h=d.zIndex,l=a.hasRendered,g=b.seriesGroup,r=b.inverted;c=a.plotGroup(\"group\",\"series\",e,h,g);a.markerGroup=\na.plotGroup(\"markerGroup\",\"markers\",e,h,g);f&&a.animate(!0);c.inverted=a.isCartesian?r:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(r);!1===d.clip||a.sharedClipKey||l||c.clip(b.clipRect);f&&a.animate();l||(a.animationTimeout=z(function(){a.afterAnimate()},f));a.isDirty=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,\nc=this.group,d=this.xAxis,f=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:H(d&&d.left,a.plotLeft),translateY:H(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:[\"clientX\",\"plotY\"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,f=this.chart.inverted;return this.searchKDTree({clientX:f?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:f?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(c,\nf,d){var e,h;if(h=c&&c.length)return e=b.kdAxisArray[f%d],c.sort(function(a,b){return a[e]-b[e]}),h=Math.floor(h/2),{point:c[h],left:a(c.slice(0,h),f+1,d),right:a(c.slice(h+1),f+1,d)}}this.buildingKdTree=!0;var b=this,c=-1<b.options.findNearestPointBy.indexOf(\"y\")?2:1;delete b.kdTree;z(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c);b.buildingKdTree=!1},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,l,g){var r=b.point,p=d.kdAxisArray[l%g],n,k,m=r;k=v(a[f])&&v(r[f])?\nMath.pow(a[f]-r[f],2):null;n=v(a[e])&&v(r[e])?Math.pow(a[e]-r[e],2):null;n=(k||0)+(n||0);r.dist=v(n)?Math.sqrt(n):Number.MAX_VALUE;r.distX=v(k)?Math.sqrt(k):Number.MAX_VALUE;p=a[p]-r[p];n=0>p?\"left\":\"right\";k=0>p?\"right\":\"left\";b[n]&&(n=c(a,b[n],l+1,g),m=n[h]<m[h]?n:r);b[k]&&Math.sqrt(p*p)<m[h]&&(a=c(a,b[k],l+1,g),m=a[h]<m[h]?a:m);return m}var d=this,f=this.kdAxisArray[0],e=this.kdAxisArray[1],h=b?\"distX\":\"dist\";b=-1<d.options.findNearestPointBy.indexOf(\"y\")?2:1;this.kdTree||this.buildingKdTree||\nthis.buildKDTree();if(this.kdTree)return c(a,this.kdTree,b,b)}})})(K);(function(a){function C(a,e,g,d,c){var h=a.chart.inverted;this.axis=a;this.isNegative=g;this.options=e;this.x=d;this.total=null;this.points={};this.stack=c;this.rightCliff=this.leftCliff=0;this.alignOptions={align:e.align||(h?g?\"left\":\"right\":\"center\"),verticalAlign:e.verticalAlign||(h?\"middle\":g?\"bottom\":\"top\"),y:u(e.y,h?4:g?14:-6),x:u(e.x,h?g?-6:6:0)};this.textAlign=e.textAlign||(h?g?\"right\":\"left\":\"center\")}var A=a.Axis,G=a.Chart,\nF=a.correctFloat,m=a.defined,g=a.destroyObjectProperties,k=a.each,q=a.format,v=a.objectEach,u=a.pick;a=a.Series;C.prototype={destroy:function(){g(this,this.axis)},render:function(a){var e=this.options,h=e.format,h=h?q(h,this):e.formatter.call(this);this.label?this.label.attr({text:h,visibility:\"hidden\"}):this.label=this.axis.chart.renderer.text(h,null,null,e.useHTML).css(e.style).attr({align:this.textAlign,rotation:e.rotation,visibility:\"hidden\"}).add(a)},setOffset:function(a,e){var h=this.axis,d=\nh.chart,c=d.inverted,g=h.reversed,g=this.isNegative&&!g||!this.isNegative&&g,b=h.translate(h.usePercentage?100:this.total,0,0,0,1),h=h.translate(0),h=Math.abs(b-h);a=d.xAxis[0].translate(this.x)+a;var k=d.plotHeight,c={x:c?g?b:b-h:a,y:c?k-a-e:g?k-b-h:k-b,width:c?h:e,height:c?e:h};if(e=this.label)e.align(this.alignOptions,null,c),c=e.alignAttr,e[!1===this.options.crop||d.isInsidePlot(c.x,c.y)?\"show\":\"hide\"](!0)}};G.prototype.getStacks=function(){var a=this;k(a.yAxis,function(a){a.stacks&&a.hasVisibleSeries&&\n(a.oldStacks=a.stacks)});k(a.series,function(e){!e.options.stacking||!0!==e.visible&&!1!==a.options.chart.ignoreHiddenSeries||(e.stackKey=e.type+u(e.options.stack,\"\"))})};A.prototype.buildStacks=function(){var a=this.series,e,g=u(this.options.reversedStacks,!0),d=a.length,c;if(!this.isXAxis){this.usePercentage=!1;for(c=d;c--;)a[g?c:d-c-1].setStackedPoints();for(c=d;c--;)e=a[g?c:d-c-1],e.setStackCliffs&&e.setStackCliffs();if(this.usePercentage)for(c=0;c<d;c++)a[c].setPercentStacks()}};A.prototype.renderStackTotals=\nfunction(){var a=this.chart,e=a.renderer,g=this.stacks,d=this.stackTotalGroup;d||(this.stackTotalGroup=d=e.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add());d.translate(a.plotLeft,a.plotTop);v(g,function(a){v(a,function(a){a.render(d)})})};A.prototype.resetStacks=function(){var a=this,e=a.stacks;a.isXAxis||v(e,function(e){v(e,function(d,c){d.touched<a.stacksTouched?(d.destroy(),delete e[c]):(d.total=null,d.cum=null)})})};A.prototype.cleanStacks=function(){var a;this.isXAxis||(this.oldStacks&&\n(a=this.stacks=this.oldStacks),v(a,function(a){v(a,function(a){a.cum=a.total})}))};a.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var a=this.processedXData,e=this.processedYData,g=[],d=e.length,c=this.options,k=c.threshold,b=c.startFromThreshold?k:0,q=c.stack,c=c.stacking,v=this.stackKey,H=\"-\"+v,l=this.negStacks,B=this.yAxis,r=B.stacks,z=B.oldStacks,M,p,E,I,A,f,t;B.stacksTouched+=1;for(A=0;A<d;A++)f=a[A],t=e[A],\nM=this.getStackIndicator(M,f,this.index),I=M.key,E=(p=l&&t<(b?0:k))?H:v,r[E]||(r[E]={}),r[E][f]||(z[E]&&z[E][f]?(r[E][f]=z[E][f],r[E][f].total=null):r[E][f]=new C(B,B.options.stackLabels,p,f,q)),E=r[E][f],null!==t&&(E.points[I]=E.points[this.index]=[u(E.cum,b)],m(E.cum)||(E.base=I),E.touched=B.stacksTouched,0<M.index&&!1===this.singleStacks&&(E.points[I][0]=E.points[this.index+\",\"+f+\",0\"][0])),\"percent\"===c?(p=p?v:H,l&&r[p]&&r[p][f]?(p=r[p][f],E.total=p.total=Math.max(p.total,E.total)+Math.abs(t)||\n0):E.total=F(E.total+(Math.abs(t)||0))):E.total=F(E.total+(t||0)),E.cum=u(E.cum,b)+(t||0),null!==t&&(E.points[I].push(E.cum),g[A]=E.cum);\"percent\"===c&&(B.usePercentage=!0);this.stackedYData=g;B.oldStacks={}}};a.prototype.setPercentStacks=function(){var a=this,e=a.stackKey,g=a.yAxis.stacks,d=a.processedXData,c;k([e,\"-\"+e],function(e){for(var b=d.length,h,k;b--;)if(h=d[b],c=a.getStackIndicator(c,h,a.index,e),h=(k=g[e]&&g[e][h])&&k.points[c.key])k=k.total?100/k.total:0,h[0]=F(h[0]*k),h[1]=F(h[1]*k),\na.stackedYData[b]=h[1]})};a.prototype.getStackIndicator=function(a,e,g,d){!m(a)||a.x!==e||d&&a.key!==d?a={x:e,index:0,key:d}:a.index++;a.key=[g,e,a.index].join();return a}})(K);(function(a){var C=a.addEvent,A=a.animate,G=a.Axis,F=a.createElement,m=a.css,g=a.defined,k=a.each,q=a.erase,v=a.extend,u=a.fireEvent,h=a.inArray,e=a.isNumber,n=a.isObject,d=a.isArray,c=a.merge,w=a.objectEach,b=a.pick,y=a.Point,D=a.Series,H=a.seriesTypes,l=a.setAnimation,B=a.splat;v(a.Chart.prototype,{addSeries:function(a,c,\nd){var e,h=this;a&&(c=b(c,!0),u(h,\"addSeries\",{options:a},function(){e=h.initSeries(a);h.isDirtyLegend=!0;h.linkSeries();c&&h.redraw(d)}));return e},addAxis:function(a,d,e,h){var g=d?\"xAxis\":\"yAxis\",l=this.options;a=c(a,{index:this[g].length,isX:d});new G(this,a);l[g]=B(l[g]||{});l[g].push(a);b(e,!0)&&this.redraw(h)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,h=function(){d&&m(d,{left:b.plotLeft+\"px\",top:b.plotTop+\"px\",width:b.plotWidth+\"px\",height:b.plotHeight+\"px\"})};\nd||(b.loadingDiv=d=F(\"div\",{className:\"highcharts-loading highcharts-loading-hidden\"},null,b.container),b.loadingSpan=F(\"span\",{className:\"highcharts-loading-inner\"},null,d),C(b,\"redraw\",h));d.className=\"highcharts-loading\";b.loadingSpan.innerHTML=a||c.lang.loading;m(d,v(e.style,{zIndex:10}));m(b.loadingSpan,e.labelStyle);b.loadingShown||(m(d,{opacity:0,display:\"\"}),A(d,{opacity:e.style.opacity||.5},{duration:e.showDuration||0}));b.loadingShown=!0;h()},hideLoading:function(){var a=this.options,b=\nthis.loadingDiv;b&&(b.className=\"highcharts-loading highcharts-loading-hidden\",A(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){m(b,{display:\"none\"})}}));this.loadingShown=!1},propsRequireDirtyBox:\"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow\".split(\" \"),propsRequireUpdateSeries:\"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions tooltip\".split(\" \"),\nupdate:function(a,d){var l=this,r={credits:\"addCredits\",title:\"setTitle\",subtitle:\"setSubtitle\"},n=a.chart,m,q;if(n){c(!0,l.options.chart,n);\"className\"in n&&l.setClassName(n.className);if(\"inverted\"in n||\"polar\"in n)l.propFromSeries(),m=!0;\"alignTicks\"in n&&(m=!0);w(n,function(a,b){-1!==h(\"chart.\"+b,l.propsRequireUpdateSeries)&&(q=!0);-1!==h(b,l.propsRequireDirtyBox)&&(l.isDirtyBox=!0)});\"style\"in n&&l.renderer.setStyle(n.style)}a.colors&&(this.options.colors=a.colors);a.plotOptions&&c(!0,this.options.plotOptions,\na.plotOptions);w(a,function(a,b){if(l[b]&&\"function\"===typeof l[b].update)l[b].update(a,!1);else if(\"function\"===typeof l[r[b]])l[r[b]](a);\"chart\"!==b&&-1!==h(b,l.propsRequireUpdateSeries)&&(q=!0)});k(\"xAxis yAxis zAxis series colorAxis pane\".split(\" \"),function(b){a[b]&&k(B(a[b]),function(a,c){(c=g(a.id)&&l.get(a.id)||l[b][c])&&c.coll===b&&c.update(a,!1)})});m&&k(l.axes,function(a){a.update({},!1)});q&&k(l.series,function(a){a.update({},!1)});a.loading&&c(!0,l.options.loading,a.loading);m=n&&n.width;\nn=n&&n.height;e(m)&&m!==l.chartWidth||e(n)&&n!==l.chartHeight?l.setSize(m,n):b(d,!0)&&l.redraw()},setSubtitle:function(a){this.setTitle(void 0,a)}});v(y.prototype,{update:function(a,c,d,e){function h(){l.applyOptions(a);null===l.y&&f&&(l.graphic=f.destroy());n(a,!0)&&(f&&f.element&&a&&a.marker&&a.marker.symbol&&(l.graphic=f.destroy()),a&&a.dataLabels&&l.dataLabel&&(l.dataLabel=l.dataLabel.destroy()));r=l.index;g.updateParallelArrays(l,r);p.data[r]=n(p.data[r],!0)||n(a,!0)?l.options:a;g.isDirty=g.isDirtyData=\n!0;!g.fixedBox&&g.hasCartesianSeries&&(k.isDirtyBox=!0);\"point\"===p.legendType&&(k.isDirtyLegend=!0);c&&k.redraw(d)}var l=this,g=l.series,f=l.graphic,r,k=g.chart,p=g.options;c=b(c,!0);!1===e?h():l.firePointEvent(\"update\",{options:a},h)},remove:function(a,b){this.series.removePoint(h(this,this.series.data),a,b)}});v(D.prototype,{addPoint:function(a,c,d,e){var h=this.options,l=this.data,g=this.chart,f=this.xAxis,f=f&&f.hasNames&&f.names,r=h.data,k,p,n=this.xData,m,q;c=b(c,!0);k={series:this};this.pointClass.prototype.applyOptions.apply(k,\n[a]);q=k.x;m=n.length;if(this.requireSorting&&q<n[m-1])for(p=!0;m&&n[m-1]>q;)m--;this.updateParallelArrays(k,\"splice\",m,0,0);this.updateParallelArrays(k,m);f&&k.name&&(f[q]=k.name);r.splice(m,0,a);p&&(this.data.splice(m,0,null),this.processData());\"point\"===h.legendType&&this.generatePoints();d&&(l[0]&&l[0].remove?l[0].remove(!1):(l.shift(),this.updateParallelArrays(k,\"shift\"),r.shift()));this.isDirtyData=this.isDirty=!0;c&&g.redraw(e)},removePoint:function(a,c,d){var e=this,h=e.data,g=h[a],k=e.points,\nf=e.chart,r=function(){k&&k.length===h.length&&k.splice(a,1);h.splice(a,1);e.options.data.splice(a,1);e.updateParallelArrays(g||{series:e},\"splice\",a,1);g&&g.destroy();e.isDirty=!0;e.isDirtyData=!0;c&&f.redraw()};l(d,f);c=b(c,!0);g?g.firePointEvent(\"remove\",null,r):r()},remove:function(a,c,d){function e(){h.destroy();l.isDirtyLegend=l.isDirtyBox=!0;l.linkSeries();b(a,!0)&&l.redraw(c)}var h=this,l=h.chart;!1!==d?u(h,\"remove\",null,e):e()},update:function(a,d){var e=this,h=e.chart,l=e.userOptions,g=\ne.oldType||e.type,r=a.type||l.type||h.options.chart.type,f=H[g].prototype,n=[\"group\",\"markerGroup\",\"dataLabelsGroup\"],m;if(Object.keys&&\"data\"===Object.keys(a).toString())return this.setData(a.data,d);if(r&&r!==g||void 0!==a.zIndex)n.length=0;k(n,function(a){n[a]=e[a];delete e[a]});a=c(l,{animation:!1,index:e.index,pointStart:e.xData[0]},{data:e.options.data},a);e.remove(!1,null,!1);for(m in f)e[m]=void 0;v(e,H[r||g].prototype);k(n,function(a){e[a]=n[a]});e.init(h,a);e.oldType=g;h.linkSeries();b(d,\n!0)&&h.redraw(!1)}});v(G.prototype,{update:function(a,d){var e=this.chart;a=e.options[this.coll][this.options.index]=c(this.userOptions,a);this.destroy(!0);this.init(e,v(a,{events:void 0}));e.isDirtyBox=!0;b(d,!0)&&e.redraw()},remove:function(a){for(var c=this.chart,e=this.coll,h=this.series,l=h.length;l--;)h[l]&&h[l].remove(!1);q(c.axes,this);q(c[e],this);d(c.options[e])?c.options[e].splice(this.options.index,1):delete c.options[e];k(c[e],function(a,b){a.options.index=b});this.destroy();c.isDirtyBox=\n!0;b(a,!0)&&c.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(K);(function(a){var C=a.color,A=a.each,G=a.map,F=a.pick,m=a.Series,g=a.seriesType;g(\"area\",\"line\",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var g=[],m=[],v=this.xAxis,u=this.yAxis,h=u.stacks[this.stackKey],e={},n=this.points,d=this.index,c=u.series,w=c.length,b,y=F(u.options.reversedStacks,!0)?1:-1,D;if(this.options.stacking){for(D=\n0;D<n.length;D++)e[n[D].x]=n[D];a.objectEach(h,function(a,b){null!==a.total&&m.push(b)});m.sort(function(a,b){return a-b});b=G(c,function(){return this.visible});A(m,function(a,c){var l=0,k,n;if(e[a]&&!e[a].isNull)g.push(e[a]),A([-1,1],function(l){var g=1===l?\"rightNull\":\"leftNull\",r=0,q=h[m[c+l]];if(q)for(D=d;0<=D&&D<w;)k=q.points[D],k||(D===d?e[a][g]=!0:b[D]&&(n=h[a].points[D])&&(r-=n[1]-n[0])),D+=y;e[a][1===l?\"rightCliff\":\"leftCliff\"]=r});else{for(D=d;0<=D&&D<w;){if(k=h[a].points[D]){l=k[1];break}D+=\ny}l=u.translate(l,0,1,0,1);g.push({isNull:!0,plotX:v.translate(a,0,0,0,1),x:a,plotY:l,yBottom:l})}})}return g},getGraphPath:function(a){var g=m.prototype.getGraphPath,k=this.options,u=k.stacking,h=this.yAxis,e,n,d=[],c=[],w=this.index,b,y=h.stacks[this.stackKey],D=k.threshold,A=h.getThreshold(k.threshold),l,k=k.connectNulls||\"percent\"===u,B=function(e,l,g){var k=a[e];e=u&&y[k.x].points[w];var n=k[g+\"Null\"]||0;g=k[g+\"Cliff\"]||0;var r,m,k=!0;g||n?(r=(n?e[0]:e[1])+g,m=e[0]+g,k=!!n):!u&&a[l]&&a[l].isNull&&\n(r=m=D);void 0!==r&&(c.push({plotX:b,plotY:null===r?A:h.getThreshold(r),isNull:k,isCliff:!0}),d.push({plotX:b,plotY:null===m?A:h.getThreshold(m),doCurve:!1}))};a=a||this.points;u&&(a=this.getStackPoints());for(e=0;e<a.length;e++)if(n=a[e].isNull,b=F(a[e].rectPlotX,a[e].plotX),l=F(a[e].yBottom,A),!n||k)k||B(e,e-1,\"left\"),n&&!u&&k||(c.push(a[e]),d.push({x:e,plotX:b,plotY:l})),k||B(e,e+1,\"right\");e=g.call(this,c,!0,!0);d.reversed=!0;n=g.call(this,d,!0,!0);n.length&&(n[0]=\"L\");n=e.concat(n);g=g.call(this,\nc,!1,k);n.xMap=e.xMap;this.areaPath=n;return g},drawGraph:function(){this.areaPath=[];m.prototype.drawGraph.apply(this);var a=this,g=this.areaPath,v=this.options,u=[[\"area\",\"highcharts-area\",this.color,v.fillColor]];A(this.zones,function(h,e){u.push([\"zone-area-\"+e,\"highcharts-area highcharts-zone-area-\"+e+\" \"+h.className,h.color||a.color,h.fillColor||v.fillColor])});A(u,function(h){var e=h[0],k=a[e];k?(k.endX=g.xMap,k.animate({d:g})):(k=a[e]=a.chart.renderer.path(g).addClass(h[1]).attr({fill:F(h[3],\nC(h[2]).setOpacity(F(v.fillOpacity,.75)).get()),zIndex:0}).add(a.group),k.isArea=!0);k.startX=g.xMap;k.shiftUnit=v.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(K);(function(a){var C=a.pick;a=a.seriesType;a(\"spline\",\"line\",{},{getPointSpline:function(a,G,F){var m=G.plotX,g=G.plotY,k=a[F-1];F=a[F+1];var q,v,u,h;if(k&&!k.isNull&&!1!==k.doCurve&&!G.isCliff&&F&&!F.isNull&&!1!==F.doCurve&&!G.isCliff){a=k.plotY;u=F.plotX;F=F.plotY;var e=0;q=(1.5*m+k.plotX)/2.5;v=(1.5*g+a)/2.5;u=(1.5*\nm+u)/2.5;h=(1.5*g+F)/2.5;u!==q&&(e=(h-v)*(u-m)/(u-q)+g-h);v+=e;h+=e;v>a&&v>g?(v=Math.max(a,g),h=2*g-v):v<a&&v<g&&(v=Math.min(a,g),h=2*g-v);h>F&&h>g?(h=Math.max(F,g),v=2*g-h):h<F&&h<g&&(h=Math.min(F,g),v=2*g-h);G.rightContX=u;G.rightContY=h}G=[\"C\",C(k.rightContX,k.plotX),C(k.rightContY,k.plotY),C(q,m),C(v,g),m,g];k.rightContX=k.rightContY=null;return G}})})(K);(function(a){var C=a.seriesTypes.area.prototype,A=a.seriesType;A(\"areaspline\",\"spline\",a.defaultPlotOptions.area,{getStackPoints:C.getStackPoints,\ngetGraphPath:C.getGraphPath,setStackCliffs:C.setStackCliffs,drawGraph:C.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(K);(function(a){var C=a.animObject,A=a.color,G=a.each,F=a.extend,m=a.isNumber,g=a.merge,k=a.pick,q=a.Series,v=a.seriesType,u=a.svg;v(\"column\",\"line\",{borderRadius:0,crisp:!0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1,shadow:!1},select:{color:\"#cccccc\",borderColor:\"#000000\",shadow:!1}},\ndataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:\"#ffffff\"},{cropShoulder:0,directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){q.prototype.init.apply(this,arguments);var a=this,e=a.chart;e.hasRendered&&G(e.series,function(e){e.type===a.type&&(e.isDirty=!0)})},getColumnMetrics:function(){var a=this,e=a.options,g=a.xAxis,d=a.yAxis,c=g.reversed,m,b={},q=0;!1===e.grouping?\nq=1:G(a.chart.series,function(c){var e=c.options,g=c.yAxis,h;c.type!==a.type||!c.visible&&a.chart.options.chart.ignoreHiddenSeries||d.len!==g.len||d.pos!==g.pos||(e.stacking?(m=c.stackKey,void 0===b[m]&&(b[m]=q++),h=b[m]):!1!==e.grouping&&(h=q++),c.columnIndex=h)});var u=Math.min(Math.abs(g.transA)*(g.ordinalSlope||e.pointRange||g.closestPointRange||g.tickInterval||1),g.len),v=u*e.groupPadding,l=(u-2*v)/(q||1),e=Math.min(e.maxPointWidth||g.len,k(e.pointWidth,l*(1-2*e.pointPadding)));a.columnMetrics=\n{width:e,offset:(l-e)/2+(v+((a.columnIndex||0)+(c?1:0))*l-u/2)*(c?-1:1)};return a.columnMetrics},crispCol:function(a,e,g,d){var c=this.chart,h=this.borderWidth,b=-(h%2?.5:0),h=h%2?.5:1;c.inverted&&c.renderer.isVML&&(h+=1);this.options.crisp&&(g=Math.round(a+g)+b,a=Math.round(a)+b,g-=a);d=Math.round(e+d)+h;b=.5>=Math.abs(e)&&.5<d;e=Math.round(e)+h;d-=e;b&&d&&(--e,d+=1);return{x:a,y:e,width:g,height:d}},translate:function(){var a=this,e=a.chart,g=a.options,d=a.dense=2>a.closestPointRange*a.xAxis.transA,\nd=a.borderWidth=k(g.borderWidth,d?0:1),c=a.yAxis,m=a.translatedThreshold=c.getThreshold(g.threshold),b=k(g.minPointLength,5),y=a.getColumnMetrics(),u=y.width,v=a.barW=Math.max(u,1+2*d),l=a.pointXOffset=y.offset;e.inverted&&(m-=.5);g.pointPadding&&(v=Math.ceil(v));q.prototype.translate.apply(a);G(a.points,function(d){var g=k(d.yBottom,m),h=999+Math.abs(g),h=Math.min(Math.max(-h,d.plotY),c.len+h),n=d.plotX+l,p=v,q=Math.min(h,g),w,y=Math.max(h,g)-q;Math.abs(y)<b&&b&&(y=b,w=!c.reversed&&!d.negative||\nc.reversed&&d.negative,q=Math.abs(q-m)>b?g-b:m-(w?b:0));d.barX=n;d.pointWidth=u;d.tooltipPos=e.inverted?[c.len+c.pos-e.plotLeft-h,a.xAxis.len-n-p/2,y]:[n+p/2,h+c.pos-e.plotTop,y];d.shapeType=\"rect\";d.shapeArgs=a.crispCol.apply(a,d.isNull?[n,m,p,0]:[n,q,p,y])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?\"addClass\":\"removeClass\"](\"highcharts-dense-data\")},pointAttribs:function(a,e){var h=this.options,d,c=this.pointAttrToOptions||{};\nd=c.stroke||\"borderColor\";var k=c[\"stroke-width\"]||\"borderWidth\",b=a&&a.color||this.color,m=a[d]||h[d]||this.color||b,q=a[k]||h[k]||this[k]||0,c=h.dashStyle;a&&this.zones.length&&(b=a.getZone(),b=a.options.color||b&&b.color||this.color);e&&(a=g(h.states[e],a.options.states&&a.options.states[e]||{}),e=a.brightness,b=a.color||void 0!==e&&A(b).brighten(a.brightness).get()||b,m=a[d]||m,q=a[k]||q,c=a.dashStyle||c);d={fill:b,stroke:m,\"stroke-width\":q};h.borderRadius&&(d.r=h.borderRadius);c&&(d.dashstyle=\nc);return d},drawPoints:function(){var a=this,e=this.chart,k=a.options,d=e.renderer,c=k.animationLimit||250,q;G(a.points,function(b){var h=b.graphic;if(m(b.plotY)&&null!==b.y){q=b.shapeArgs;if(h)h[e.pointCount<c?\"animate\":\"attr\"](g(q));else b.graphic=h=d[b.shapeType](q).add(b.group||a.group);h.attr(a.pointAttribs(b,b.selected&&\"select\")).shadow(k.shadow,null,k.stacking&&!k.borderRadius);h.addClass(b.getClassName(),!0)}else h&&(b.graphic=h.destroy())})},animate:function(a){var e=this,g=this.yAxis,\nd=e.options,c=this.chart.inverted,h={};u&&(a?(h.scaleY=.001,a=Math.min(g.pos+g.len,Math.max(g.pos,g.toPixels(d.threshold))),c?h.translateX=a-g.len:h.translateY=a,e.group.attr(h)):(h[c?\"translateX\":\"translateY\"]=g.pos,e.group.animate(h,F(C(e.options.animation),{step:function(a,c){e.group.attr({scaleY:Math.max(.001,c.pos)})}})),e.animate=null))},remove:function(){var a=this,e=a.chart;e.hasRendered&&G(e.series,function(e){e.type===a.type&&(e.isDirty=!0)});q.prototype.remove.apply(a,arguments)}})})(K);\n(function(a){a=a.seriesType;a(\"bar\",\"column\",null,{inverted:!0})})(K);(function(a){var C=a.Series;a=a.seriesType;a(\"scatter\",\"line\",{lineWidth:0,findNearestPointBy:\"xy\",marker:{enabled:!0},tooltip:{headerFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cspan style\\x3d\"font-size: 0.85em\"\\x3e {series.name}\\x3c/span\\x3e\\x3cbr/\\x3e',pointFormat:\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3e\"}},{sorted:!1,requireSorting:!1,noSharedTooltip:!0,\ntrackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&C.prototype.drawGraph.call(this)}})})(K);(function(a){var C=a.pick,A=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,F=this.chart,m=2*(a.slicedOffset||0),g=F.plotWidth-2*m,F=F.plotHeight-2*m,k=a.center,k=[C(k[0],\"50%\"),C(k[1],\"50%\"),a.size||\"100%\",a.innerSize||0],q=Math.min(g,F),v,u;for(v=0;4>v;++v)u=k[v],a=2>v||2===v&&/%$/.test(u),k[v]=A(u,[g,\nF,q,k[2]][v])+(a?m:0);k[3]>k[2]&&(k[3]=k[2]);return k}}})(K);(function(a){var C=a.addEvent,A=a.defined,G=a.each,F=a.extend,m=a.inArray,g=a.noop,k=a.pick,q=a.Point,v=a.Series,u=a.seriesType,h=a.setAnimation;u(\"pie\",\"line\",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},\nborderColor:\"#ffffff\",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,d=e.points,c=e.startAngleRad;a||(G(d,function(a){var b=a.graphic,d=a.shapeArgs;b&&(b.attr({r:a.startR||e.center[3]/2,start:c,end:c}),b.animate({r:d.r,start:d.start,end:d.end},e.options.animation))}),e.animate=null)},\nupdateTotals:function(){var a,g=0,d=this.points,c=d.length,h,b=this.options.ignoreHiddenPoint;for(a=0;a<c;a++)h=d[a],g+=b&&!h.visible?0:h.isNull?0:h.y;this.total=g;for(a=0;a<c;a++)h=d[a],h.percentage=0<g&&(h.visible||!b)?h.y/g*100:0,h.total=g},generatePoints:function(){v.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var e=0,d=this.options,c=d.slicedOffset,g=c+(d.borderWidth||0),b,h,m,q=d.startAngle||0,l=this.startAngleRad=Math.PI/180*(q-90),q=\n(this.endAngleRad=Math.PI/180*(k(d.endAngle,q+360)-90))-l,u=this.points,r,z=d.dataLabels.distance,d=d.ignoreHiddenPoint,v,p=u.length,E;a||(this.center=a=this.getCenter());this.getX=function(b,c,d){m=Math.asin(Math.min((b-a[1])/(a[2]/2+d.labelDistance),1));return a[0]+(c?-1:1)*Math.cos(m)*(a[2]/2+d.labelDistance)};for(v=0;v<p;v++){E=u[v];E.labelDistance=k(E.options.dataLabels&&E.options.dataLabels.distance,z);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,E.labelDistance);b=l+e*q;if(!d||E.visible)e+=\nE.percentage/100;h=l+e*q;E.shapeType=\"arc\";E.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*b)/1E3,end:Math.round(1E3*h)/1E3};m=(h+b)/2;m>1.5*Math.PI?m-=2*Math.PI:m<-Math.PI/2&&(m+=2*Math.PI);E.slicedTranslation={translateX:Math.round(Math.cos(m)*c),translateY:Math.round(Math.sin(m)*c)};h=Math.cos(m)*a[2]/2;r=Math.sin(m)*a[2]/2;E.tooltipPos=[a[0]+.7*h,a[1]+.7*r];E.half=m<-Math.PI/2||m>Math.PI/2?1:0;E.angle=m;b=Math.min(g,E.labelDistance/5);E.labelPos=[a[0]+h+Math.cos(m)*E.labelDistance,\na[1]+r+Math.sin(m)*E.labelDistance,a[0]+h+Math.cos(m)*b,a[1]+r+Math.sin(m)*b,a[0]+h,a[1]+r,0>E.labelDistance?\"center\":E.half?\"right\":\"left\",m]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,d,c,h,b,k=a.options.shadow;k&&!a.shadowGroup&&(a.shadowGroup=g.g(\"shadow\").add(a.group));G(a.points,function(e){if(!e.isNull){c=e.graphic;b=e.shapeArgs;d=e.getTranslate();var m=e.shadowGroup;k&&!m&&(m=e.shadowGroup=g.g(\"shadow\").add(a.shadowGroup));m&&m.attr(d);h=a.pointAttribs(e,e.selected&&\n\"select\");c?c.setRadialReference(a.center).attr(h).animate(F(b,d)):(e.graphic=c=g[e.shapeType](b).setRadialReference(a.center).attr(d).add(a.group),e.visible||c.attr({visibility:\"hidden\"}),c.attr(h).attr({\"stroke-linejoin\":\"round\"}).shadow(k,m));c.addClass(e.getClassName())}})},searchPoint:g,sortByAngle:function(a,g){a.sort(function(a,c){return void 0!==a.angle&&(c.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:g},{init:function(){q.prototype.init.apply(this,\narguments);var a=this,g;a.name=k(a.name,\"Slice\");g=function(d){a.slice(\"select\"===d.type)};C(a,\"select\",g);C(a,\"unselect\",g);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,g){var d=this,c=d.series,e=c.chart,b=c.options.ignoreHiddenPoint;g=k(g,b);a!==d.visible&&(d.visible=d.options.visible=a=void 0===a?!d.visible:a,c.options.data[m(d,c.data)]=d.options,G([\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"],function(b){if(d[b])d[b][a?\"show\":\"hide\"](!0)}),d.legendItem&&\ne.legend.colorizeItem(d,a),a||\"hover\"!==d.state||d.setState(\"\"),b&&(c.isDirty=!0),g&&e.redraw())},slice:function(a,g,d){var c=this.series;h(d,c.chart);k(g,!0);this.sliced=this.options.sliced=A(a)?a:!this.sliced;c.options.data[m(this,c.data)]=this.options;this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var e=this.shapeArgs;return this.sliced||\n!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(K);(function(a){var C=a.addEvent,A=a.arrayMax,G=a.defined,F=a.each,m=a.extend,g=a.format,k=a.map,q=a.merge,v=a.noop,u=a.pick,h=a.relativeLength,e=a.Series,n=a.seriesTypes,d=a.stableSort;a.distribute=function(a,e){function b(a,b){return a.target-b.target}var c,g=!0,h=a,l=[],m;m=0;for(c=a.length;c--;)m+=a[c].size;if(m>e){d(a,function(a,b){return(b.rank||0)-(a.rank||0)});\nfor(m=c=0;m<=e;)m+=a[c].size,c++;l=a.splice(c-1,a.length)}d(a,b);for(a=k(a,function(a){return{size:a.size,targets:[a.target]}});g;){for(c=a.length;c--;)g=a[c],m=(Math.min.apply(0,g.targets)+Math.max.apply(0,g.targets))/2,g.pos=Math.min(Math.max(0,m-g.size/2),e-g.size);c=a.length;for(g=!1;c--;)0<c&&a[c-1].pos+a[c-1].size>a[c].pos&&(a[c-1].size+=a[c].size,a[c-1].targets=a[c-1].targets.concat(a[c].targets),a[c-1].pos+a[c-1].size>e&&(a[c-1].pos=e-a[c-1].size),a.splice(c,1),g=!0)}c=0;F(a,function(a){var b=\n0;F(a.targets,function(){h[c].pos=a.pos+b;b+=h[c].size;c++})});h.push.apply(h,l);d(h,b)};e.prototype.drawDataLabels=function(){var c=this,d=c.options,b=d.dataLabels,e=c.points,h,k,l=c.hasRendered||0,m,r,n=u(b.defer,!!d.animation),v=c.chart.renderer;if(b.enabled||c._hasPointLabels)c.dlProcessOptions&&c.dlProcessOptions(b),r=c.plotGroup(\"dataLabelsGroup\",\"data-labels\",n&&!l?\"hidden\":\"visible\",b.zIndex||6),n&&(r.attr({opacity:+l}),l||C(c,\"afterAnimate\",function(){c.visible&&r.show(!0);r[d.animation?\n\"animate\":\"attr\"]({opacity:1},{duration:200})})),k=b,F(e,function(e){var l,p=e.dataLabel,n,f,t=e.connector,w=!p,z;h=e.dlOptions||e.options&&e.options.dataLabels;if(l=u(h&&h.enabled,k.enabled)&&null!==e.y)b=q(k,h),n=e.getLabelConfig(),m=b.format?g(b.format,n):b.formatter.call(n,b),z=b.style,n=b.rotation,z.color=u(b.color,z.color,c.color,\"#000000\"),\"contrast\"===z.color&&(e.contrastColor=v.getContrast(e.color||c.color),z.color=b.inside||0>u(e.labelDistance,b.distance)||d.stacking?e.contrastColor:\"#000000\"),\nd.cursor&&(z.cursor=d.cursor),f={fill:b.backgroundColor,stroke:b.borderColor,\"stroke-width\":b.borderWidth,r:b.borderRadius||0,rotation:n,padding:b.padding,zIndex:1},a.objectEach(f,function(a,b){void 0===a&&delete f[b]});!p||l&&G(m)?l&&G(m)&&(p?f.text=m:(p=e.dataLabel=v[n?\"text\":\"label\"](m,0,-9999,b.shape,null,null,b.useHTML,null,\"data-label\"),p.addClass(\"highcharts-data-label-color-\"+e.colorIndex+\" \"+(b.className||\"\")+(b.useHTML?\"highcharts-tracker\":\"\"))),p.attr(f),p.css(z).shadow(b.shadow),p.added||\np.add(r),c.alignDataLabel(e,p,b,null,w)):(e.dataLabel=p=p.destroy(),t&&(e.connector=t.destroy()))})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,h=c.inverted,k=u(a.plotX,-9999),r=u(a.plotY,-9999),n=d.getBBox(),q,p=b.rotation,w=b.align,v=this.visible&&(a.series.forceDL||c.isInsidePlot(k,Math.round(r),h)||e&&c.isInsidePlot(k,h?e.x+1:e.y+e.height-1,h)),y=\"justify\"===u(b.overflow,\"justify\");if(v&&(q=b.style.fontSize,q=c.renderer.fontMetrics(q,d).b,e=m({x:h?c.plotWidth-r:k,y:Math.round(h?\nc.plotHeight-k:r),width:0,height:0},e),m(b,{width:n.width,height:n.height}),p?(y=!1,k=c.renderer.rotCorr(q,p),k={x:e.x+b.x+e.width/2+k.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g?\"attr\":\"animate\"](k).attr({align:w}),r=(p+720)%360,r=180<r&&360>r,\"left\"===w?k.y-=r?n.height:0:\"center\"===w?(k.x-=n.width/2,k.y-=n.height/2):\"right\"===w&&(k.x-=n.width,k.y-=r?0:n.height)):(d.align(b,null,e),k=d.alignAttr),y?a.isLabelJustified=this.justifyDataLabel(d,b,k,n,e,g):u(b.crop,!0)&&(v=c.isInsidePlot(k.x,\nk.y)&&c.isInsidePlot(k.x+n.width,k.y+n.height)),b.shape&&!p))d[g?\"attr\":\"animate\"]({anchorX:h?c.plotWidth-a.plotY:a.plotX,anchorY:h?c.plotHeight-a.plotX:a.plotY});v||(d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,h){var c=this.chart,k=d.align,m=d.verticalAlign,n,q,p=a.box?0:a.padding||0;n=b.x+p;0>n&&(\"right\"===k?d.align=\"left\":d.x=-n,q=!0);n=b.x+e.width-p;n>c.plotWidth&&(\"left\"===k?d.align=\"right\":d.x=c.plotWidth-n,q=!0);n=b.y+p;0>n&&(\"bottom\"===m?d.verticalAlign=\n\"top\":d.y=-n,q=!0);n=b.y+e.height-p;n>c.plotHeight&&(\"top\"===m?d.verticalAlign=\"bottom\":d.y=c.plotHeight-n,q=!0);q&&(a.placed=!h,a.align(d,null,g));return q};n.pie&&(n.pie.prototype.drawDataLabels=function(){var c=this,d=c.data,b,g=c.chart,h=c.options.dataLabels,k=u(h.connectorPadding,10),l=u(h.connectorWidth,1),m=g.plotWidth,r=g.plotHeight,n,q=c.center,p=q[2]/2,v=q[1],C,L,f,t,K=[[],[]],J,N,O,P,x=[0,0,0,0];c.visible&&(h.enabled||c._hasPointLabels)&&(F(d,function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&\n(a.dataLabel.attr({width:\"auto\"}).css({width:\"auto\",textOverflow:\"clip\"}),a.dataLabel.shortened=!1)}),e.prototype.drawDataLabels.apply(c),F(d,function(a){a.dataLabel&&a.visible&&(K[a.half].push(a),a.dataLabel._pos=null)}),F(K,function(d,e){var l,n,u=d.length,w=[],z;if(u)for(c.sortByAngle(d,e-.5),0<c.maxLabelDistance&&(l=Math.max(0,v-p-c.maxLabelDistance),n=Math.min(v+p+c.maxLabelDistance,g.plotHeight),F(d,function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,v-p-a.labelDistance),a.bottom=\nMath.min(v+p+a.labelDistance,g.plotHeight),z=a.dataLabel.getBBox().height||21,a.positionsIndex=w.push({target:a.labelPos[1]-a.top+z/2,size:z,rank:a.y})-1)}),a.distribute(w,n+z-l)),P=0;P<u;P++)b=d[P],n=b.positionsIndex,f=b.labelPos,C=b.dataLabel,O=!1===b.visible?\"hidden\":\"inherit\",l=f[1],w&&G(w[n])?void 0===w[n].pos?O=\"hidden\":(t=w[n].size,N=b.top+w[n].pos):N=l,delete b.positionIndex,J=h.justify?q[0]+(e?-1:1)*(p+b.labelDistance):c.getX(N<b.top+2||N>b.bottom-2?l:N,e,b),C._attr={visibility:O,align:f[6]},\nC._pos={x:J+h.x+({left:k,right:-k}[f[6]]||0),y:N+h.y-10},f.x=J,f.y=N,L=C.getBBox().width,l=null,J-L<k?(l=Math.round(L-J+k),x[3]=Math.max(l,x[3])):J+L>m-k&&(l=Math.round(J+L-m+k),x[1]=Math.max(l,x[1])),0>N-t/2?x[0]=Math.max(Math.round(-N+t/2),x[0]):N+t/2>r&&(x[2]=Math.max(Math.round(N+t/2-r),x[2])),C.sideOverflow=l}),0===A(x)||this.verifyDataLabelOverflow(x))&&(this.placeDataLabels(),l&&F(this.points,function(a){var b;n=a.connector;if((C=a.dataLabel)&&C._pos&&a.visible&&0<a.labelDistance){O=C._attr.visibility;\nif(b=!n)a.connector=n=g.renderer.path().addClass(\"highcharts-data-label-connector highcharts-color-\"+a.colorIndex).add(c.dataLabelsGroup),n.attr({\"stroke-width\":l,stroke:h.connectorColor||a.color||\"#666666\"});n[b?\"attr\":\"animate\"]({d:c.connectorPath(a.labelPos)});n.attr(\"visibility\",O)}else n&&(a.connector=n.destroy())}))},n.pie.prototype.connectorPath=function(a){var c=a.x,b=a.y;return u(this.options.dataLabels.softConnector,!0)?[\"M\",c+(\"left\"===a[6]?5:-5),b,\"C\",c,b,2*a[2]-a[4],2*a[3]-a[5],a[2],\na[3],\"L\",a[4],a[5]]:[\"M\",c+(\"left\"===a[6]?5:-5),b,\"L\",a[2],a[3],\"L\",a[4],a[5]]},n.pie.prototype.placeDataLabels=function(){F(this.points,function(a){var c=a.dataLabel;c&&a.visible&&((a=c._pos)?(c.sideOverflow&&(c._attr.width=c.getBBox().width-c.sideOverflow,c.css({width:c._attr.width+\"px\",textOverflow:\"ellipsis\"}),c.shortened=!0),c.attr(c._attr),c[c.moved?\"animate\":\"attr\"](a),c.moved=!0):c&&c.attr({y:-9999}))},this)},n.pie.prototype.alignDataLabel=v,n.pie.prototype.verifyDataLabelOverflow=function(a){var c=\nthis.center,b=this.options,d=b.center,e=b.minSize||80,g,l=null!==b.size;l||(null!==d[0]?g=Math.max(c[2]-Math.max(a[1],a[3]),e):(g=Math.max(c[2]-a[1]-a[3],e),c[0]+=(a[3]-a[1])/2),null!==d[1]?g=Math.max(Math.min(g,c[2]-Math.max(a[0],a[2])),e):(g=Math.max(Math.min(g,c[2]-a[0]-a[2]),e),c[1]+=(a[0]-a[2])/2),g<c[2]?(c[2]=g,c[3]=Math.min(h(b.innerSize||0,g),g),this.translate(c),this.drawDataLabels&&this.drawDataLabels()):l=!0);return l});n.column&&(n.column.prototype.alignDataLabel=function(a,d,b,g,h){var c=\nthis.chart.inverted,l=a.series,k=a.dlBox||a.shapeArgs,m=u(a.below,a.plotY>u(this.translatedThreshold,l.yAxis.len)),n=u(b.inside,!!this.options.stacking);k&&(g=q(k),0>g.y&&(g.height+=g.y,g.y=0),k=g.y+g.height-l.yAxis.len,0<k&&(g.height-=k),c&&(g={x:l.yAxis.len-g.y-g.height,y:l.xAxis.len-g.x-g.width,width:g.height,height:g.width}),n||(c?(g.x+=m?0:g.width,g.width=0):(g.y+=m?g.height:0,g.height=0)));b.align=u(b.align,!c||n?\"center\":m?\"right\":\"left\");b.verticalAlign=u(b.verticalAlign,c||n?\"middle\":m?\"top\":\n\"bottom\");e.prototype.alignDataLabel.call(this,a,d,b,g,h);a.isLabelJustified&&a.contrastColor&&a.dataLabel.css({color:a.contrastColor})})})(K);(function(a){var C=a.Chart,A=a.each,G=a.pick,F=a.addEvent;C.prototype.callbacks.push(function(a){function g(){var g=[];A(a.series||[],function(a){var k=a.options.dataLabels,m=a.dataLabelCollections||[\"dataLabel\"];(k.enabled||a._hasPointLabels)&&!k.allowOverlap&&a.visible&&A(m,function(h){A(a.points,function(a){a[h]&&(a[h].labelrank=G(a.labelrank,a.shapeArgs&&\na.shapeArgs.height),g.push(a[h]))})})});a.hideOverlappingLabels(g)}g();F(a,\"redraw\",g)});C.prototype.hideOverlappingLabels=function(a){var g=a.length,k,m,v,u,h,e,n,d,c,w=function(a,c,d,e,g,h,k,m){return!(g>a+d||g+k<a||h>c+e||h+m<c)};for(m=0;m<g;m++)if(k=a[m])k.oldOpacity=k.opacity,k.newOpacity=1;a.sort(function(a,c){return(c.labelrank||0)-(a.labelrank||0)});for(m=0;m<g;m++)for(v=a[m],k=m+1;k<g;++k)if(u=a[k],v&&u&&v!==u&&v.placed&&u.placed&&0!==v.newOpacity&&0!==u.newOpacity&&(h=v.alignAttr,e=u.alignAttr,\nn=v.parentGroup,d=u.parentGroup,c=2*(v.box?0:v.padding),h=w(h.x+n.translateX,h.y+n.translateY,v.width-c,v.height-c,e.x+d.translateX,e.y+d.translateY,u.width-c,u.height-c)))(v.labelrank<u.labelrank?v:u).newOpacity=0;A(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&a.placed&&(c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?\"animate\":\"attr\"](a.alignAttr,null,b)),a.isOld=!0)})}})(K);(function(a){var C=a.addEvent,A=a.Chart,G=a.createElement,F=a.css,m=a.defaultOptions,g=\na.defaultPlotOptions,k=a.each,q=a.extend,v=a.fireEvent,u=a.hasTouch,h=a.inArray,e=a.isObject,n=a.Legend,d=a.merge,c=a.pick,w=a.Point,b=a.Series,y=a.seriesTypes,D=a.svg,H;H=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart.pointer,c=function(a){var c=b.getPointFromEvent(a);void 0!==c&&(b.isDirectTouch=!0,c.onMouseOver(a))};k(a.points,function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=a)});a._hasTracking||\n(k(a.trackerGroups,function(d){if(a[d]){a[d].addClass(\"highcharts-tracker\").on(\"mouseover\",c).on(\"mouseout\",function(a){b.onTrackerMouseOut(a)});if(u)a[d].on(\"touchstart\",c);a.options.cursor&&a[d].css(F).css({cursor:a.options.cursor})}}),a._hasTracking=!0)},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,g=a.chart,h=g.pointer,m=g.renderer,n=g.options.tooltip.snap,f=a.tracker,q,v=function(){if(g.hoverSeries!==a)a.onMouseOver()},w=\n\"rgba(192,192,192,\"+(D?.0001:.002)+\")\";if(e&&!c)for(q=e+1;q--;)\"M\"===d[q]&&d.splice(q+1,0,d[q+1]-n,d[q+2],\"L\"),(q&&\"M\"===d[q]||q===e)&&d.splice(q,0,\"L\",d[q-2]+n,d[q-1]);f?f.attr({d:d}):a.graph&&(a.tracker=m.path(d).attr({\"stroke-linejoin\":\"round\",visibility:a.visible?\"visible\":\"hidden\",stroke:w,fill:c?w:\"none\",\"stroke-width\":a.graph.strokeWidth()+(c?0:2*n),zIndex:2}).add(a.group),k([a.tracker,a.markerGroup],function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",v).on(\"mouseout\",function(a){h.onTrackerMouseOut(a)});\nb.cursor&&a.css({cursor:b.cursor});if(u)a.on(\"touchstart\",v)}))}};y.column&&(y.column.prototype.drawTracker=H.drawTrackerPoint);y.pie&&(y.pie.prototype.drawTracker=H.drawTrackerPoint);y.scatter&&(y.scatter.prototype.drawTracker=H.drawTrackerPoint);q(n.prototype,{setItemEvents:function(a,b,c){var e=this,g=e.chart.renderer.boxWrapper,h=\"highcharts-legend-\"+(a.series?\"point\":\"series\")+\"-active\";(c?b:a.legendGroup).on(\"mouseover\",function(){a.setState(\"hover\");g.addClass(h);b.css(e.options.itemHoverStyle)}).on(\"mouseout\",\nfunction(){b.css(d(a.visible?e.itemStyle:e.itemHiddenStyle));g.removeClass(h);a.setState()}).on(\"click\",function(b){var c=function(){a.setVisible&&a.setVisible()};b={browserEvent:b};a.firePointEvent?a.firePointEvent(\"legendItemClick\",b,c):v(a,\"legendItemClick\",b,c)})},createCheckboxForItem:function(a){a.checkbox=G(\"input\",{type:\"checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);C(a.checkbox,\"click\",function(b){v(a.series||a,\"checkboxClick\",\n{checked:b.target.checked,item:a},function(){a.select()})})}});m.legend.itemStyle.cursor=\"pointer\";q(A.prototype,{showResetZoom:function(){var a=this,b=m.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,g=\"chart\"===c.relativeTo?null:\"plotBox\";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).addClass(\"highcharts-reset-zoom\").add().align(c.position,!1,g)},zoomOut:function(){var a=this;\nv(a,\"selection\",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,d=this.pointer,g=!1,h;!a||a.resetSelection?k(this.axes,function(a){b=a.zoom()}):k(a.xAxis.concat(a.yAxis),function(a){var c=a.axis;d[c.isXAxis?\"zoomX\":\"zoomY\"]&&(b=c.zoom(a.min,a.max),c.displayBtn&&(g=!0))});h=this.resetZoomButton;g&&!h?this.showResetZoom():!g&&e(h)&&(this.resetZoomButton=h.destroy());b&&this.redraw(c(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints,\ne;d&&k(d,function(a){a.setState()});k(\"xy\"===b?[1,0]:[1],function(b){b=c[b?\"xAxis\":\"yAxis\"][0];var d=b.horiz,g=a[d?\"chartX\":\"chartY\"],d=d?\"mouseDownX\":\"mouseDownY\",h=c[d],f=(b.pointRange||0)/2,l=b.getExtremes(),k=b.toValue(h-g,!0)+f,f=b.toValue(h+b.len-g,!0)-f,m=f<k,h=m?f:k,k=m?k:f,f=Math.min(l.dataMin,b.toValue(b.toPixels(l.min)-b.minPixelPadding)),m=Math.max(l.dataMax,b.toValue(b.toPixels(l.max)+b.minPixelPadding)),n;n=f-h;0<n&&(k+=n,h=f);n=k-m;0<n&&(k=m,h-=n);b.series.length&&h!==l.min&&k!==l.max&&\n(b.setExtremes(h,k,!1,!1,{trigger:\"pan\"}),e=!0);c[d]=g});e&&c.redraw(!1);F(c.container,{cursor:\"move\"})}});q(w.prototype,{select:function(a,b){var d=this,e=d.series,g=e.chart;a=c(a,!d.selected);d.firePointEvent(a?\"select\":\"unselect\",{accumulate:b},function(){d.selected=d.options.selected=a;e.options.data[h(d,e.data)]=d.options;d.setState(a&&\"select\");b||k(g.getSelectedPoints(),function(a){a.selected&&a!==d&&(a.selected=a.options.selected=!1,e.options.data[h(a,e.data)]=a.options,a.setState(\"\"),a.firePointEvent(\"unselect\"))})})},\nonMouseOver:function(a){var b=this.series.chart,c=b.pointer;a=a?c.normalize(a):c.getChartCoordinatesFromPoint(this,b.inverted);c.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent(\"mouseOut\");k(a.hoverPoints||[],function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var b=this,c=d(b.series.options.point,b.options).events;b.events=c;a.objectEach(c,function(a,c){C(b,c,a)});this.hasImportedEvents=!0}},setState:function(a,\nb){var d=Math.floor(this.plotX),e=this.plotY,h=this.series,l=h.options.states[a]||{},k=g[h.type].marker&&h.options.marker,m=k&&!1===k.enabled,n=k&&k.states&&k.states[a]||{},f=!1===n.enabled,t=h.stateMarkerGraphic,u=this.marker||{},v=h.chart,w=h.halo,y,B=k&&h.markerAttribs;a=a||\"\";if(!(a===this.state&&!b||this.selected&&\"select\"!==a||!1===l.enabled||a&&(f||m&&!1===n.enabled)||a&&u.states&&u.states[a]&&!1===u.states[a].enabled)){B&&(y=h.markerAttribs(this,a));if(this.graphic)this.state&&this.graphic.removeClass(\"highcharts-point-\"+\nthis.state),a&&this.graphic.addClass(\"highcharts-point-\"+a),this.graphic.attr(h.pointAttribs(this,a)),y&&this.graphic.animate(y,c(v.options.chart.animation,n.animation,k.animation)),t&&t.hide();else{if(a&&n){k=u.symbol||h.symbol;t&&t.currentSymbol!==k&&(t=t.destroy());if(t)t[b?\"animate\":\"attr\"]({x:y.x,y:y.y});else k&&(h.stateMarkerGraphic=t=v.renderer.symbol(k,y.x,y.y,y.width,y.height).add(h.markerGroup),t.currentSymbol=k);t&&t.attr(h.pointAttribs(this,a))}t&&(t[a&&v.isInsidePlot(d,e,v.inverted)?\n\"show\":\"hide\"](),t.element.point=this)}(d=l.halo)&&d.size?(w||(h.halo=w=v.renderer.path().add((this.graphic||t).parentGroup)),w[b?\"animate\":\"attr\"]({d:this.haloPath(d.size)}),w.attr({\"class\":\"highcharts-halo highcharts-color-\"+c(this.colorIndex,h.colorIndex)}),w.point=this,w.attr(q({fill:this.color||h.color,\"fill-opacity\":d.opacity,zIndex:-1},d.attributes))):w&&w.point&&w.point.haloPath&&w.animate({d:w.point.haloPath(0)});this.state=a}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-\na,this.plotY-a,2*a,2*a)}});q(b.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&v(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&v(this,\"mouseOut\");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var b=this,\nd=b.options,e=b.graph,g=d.states,h=d.lineWidth,d=0;a=a||\"\";if(b.state!==a&&(k([b.group,b.markerGroup,b.dataLabelsGroup],function(c){c&&(b.state&&c.removeClass(\"highcharts-series-\"+b.state),a&&c.addClass(\"highcharts-series-\"+a))}),b.state=a,!g[a]||!1!==g[a].enabled)&&(a&&(h=g[a].lineWidth||h+(g[a].lineWidthPlus||0)),e&&!e.dashstyle))for(h={\"stroke-width\":h},e.animate(h,c(b.chart.options.chart.animation,g[a]&&g[a].animation));b[\"zone-graph-\"+d];)b[\"zone-graph-\"+d].attr(h),d+=1},setVisible:function(a,\nb){var c=this,d=c.chart,e=c.legendItem,g,h=d.options.chart.ignoreHiddenSeries,l=c.visible;g=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!l:a)?\"show\":\"hide\";k([\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\",\"tt\"],function(a){if(c[a])c[a][g]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&k(d.series,function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});k(c.linkedSeries,function(b){b.setVisible(a,\n!1)});h&&(d.isDirtyBox=!0);!1!==b&&d.redraw();v(c,g)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);v(this,a?\"select\":\"unselect\")},drawTracker:H.drawTrackerGraph})})(K);(function(a){var C=a.Chart,A=a.each,G=a.inArray,F=a.isArray,m=a.isObject,g=a.pick,k=a.splat;C.prototype.setResponsive=function(g){var k=this.options.responsive,m=[],h=this.currentResponsive;k&&k.rules&&\nA(k.rules,function(e){void 0===e._id&&(e._id=a.uniqueKey());this.matchResponsiveRule(e,m,g)},this);var e=a.merge.apply(0,a.map(m,function(e){return a.find(k.rules,function(a){return a._id===e}).chartOptions})),m=m.toString()||void 0;m!==(h&&h.ruleIds)&&(h&&this.update(h.undoOptions,g),m?(this.currentResponsive={ruleIds:m,mergedOptions:e,undoOptions:this.currentOptions(e)},this.update(e,g)):this.currentResponsive=void 0)};C.prototype.matchResponsiveRule=function(a,k){var m=a.condition;(m.callback||\nfunction(){return this.chartWidth<=g(m.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=g(m.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=g(m.minWidth,0)&&this.chartHeight>=g(m.minHeight,0)}).call(this)&&k.push(a._id)};C.prototype.currentOptions=function(g){function q(g,e,n,d){var c;a.objectEach(g,function(a,b){if(!d&&-1<G(b,[\"series\",\"xAxis\",\"yAxis\"]))for(g[b]=k(g[b]),n[b]=[],c=0;c<g[b].length;c++)e[b][c]&&(n[b][c]={},q(a[c],e[b][c],n[b][c],d+1));else m(a)?(n[b]=F(a)?[]:{},q(a,e[b]||{},n[b],d+1)):n[b]=\ne[b]||null})}var u={};q(g,this.options,u,0);return u}})(K);return K});\n"
  },
  {
    "path": "assets/highcharts/highcharts.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(root, factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = root.document ?\n            factory(root) :\n            factory;\n    } else {\n        root.Highcharts = factory(root);\n    }\n}(typeof window !== 'undefined' ? window : this, function(win) {\n    var Highcharts = (function() {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* global window */\n        var win = window,\n            doc = win.document;\n\n        var SVG_NS = 'http://www.w3.org/2000/svg',\n            userAgent = (win.navigator && win.navigator.userAgent) || '',\n            svg = doc && doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,\n            isMS = /(edge|msie|trident)/i.test(userAgent) && !window.opera,\n            vml = !svg,\n            isFirefox = /Firefox/.test(userAgent),\n            hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4; // issue #38\n\n        var Highcharts = win.Highcharts ? win.Highcharts.error(16, true) : {\n            product: 'Highcharts',\n            version: '5.0.12',\n            deg2rad: Math.PI * 2 / 360,\n            doc: doc,\n            hasBidiBug: hasBidiBug,\n            hasTouch: doc && doc.documentElement.ontouchstart !== undefined,\n            isMS: isMS,\n            isWebKit: /AppleWebKit/.test(userAgent),\n            isFirefox: isFirefox,\n            isTouchDevice: /(Mobile|Android|Windows Phone)/.test(userAgent),\n            SVG_NS: SVG_NS,\n            chartCount: 0,\n            seriesTypes: {},\n            symbolSizes: {},\n            svg: svg,\n            vml: vml,\n            win: win,\n            marginNames: ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],\n            noop: function() {\n                return undefined;\n            },\n            /**\n             * An array containing the current chart objects in the page. A chart's\n             * position in the array is preserved throughout the page's lifetime. When\n             * a chart is destroyed, the array item becomes `undefined`.\n             * @type {Array.<Highcharts.Chart>}\n             * @memberOf Highcharts\n             */\n            charts: []\n        };\n        return Highcharts;\n    }());\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* eslint max-len: [\"warn\", 80, 4] */\n\n        /**\n         * The Highcharts object is the placeholder for all other members, and various\n         * utility functions. The most important member of the namespace would be the\n         * chart constructor.\n         *\n         * @example\n         * var chart = Highcharts.chart('container', { ... });\n         * \n         * @namespace Highcharts\n         */\n\n        var timers = [];\n\n        var charts = H.charts,\n            doc = H.doc,\n            win = H.win;\n\n        /**\n         * Provide error messages for debugging, with links to online explanation. This\n         * function can be overridden to provide custom error handling.\n         *\n         * @function #error\n         * @memberOf Highcharts\n         * @param {Number|String} code - The error code. See [errors.xml]{@link \n         *     https://github.com/highcharts/highcharts/blob/master/errors/errors.xml}\n         *     for available codes. If it is a string, the error message is printed\n         *     directly in the console.\n         * @param {Boolean} [stop=false] - Whether to throw an error or just log a \n         *     warning in the console.\n         *\n         * @sample highcharts/chart/highcharts-error/ Custom error handler\n         */\n        H.error = function(code, stop) {\n            var msg = H.isNumber(code) ?\n                'Highcharts error #' + code + ': www.highcharts.com/errors/' + code :\n                code;\n            if (stop) {\n                throw new Error(msg);\n            }\n            // else ...\n            if (win.console) {\n                console.log(msg); // eslint-disable-line no-console\n            }\n        };\n\n        /**\n         * An animator object used internally. One instance applies to one property\n         * (attribute or style prop) on one element. Animation is always initiated\n         * through {@link SVGElement#animate}.\n         *\n         * @constructor Fx\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement|SVGElement} elem - The element to animate.\n         * @param {AnimationOptions} options - Animation options.\n         * @param {string} prop - The single attribute or CSS property to animate.\n         * @private\n         *\n         * @example\n         * var rect = renderer.rect(0, 0, 10, 10).add();\n         * rect.animate({ width: 100 });\n         */\n        H.Fx = function(elem, options, prop) {\n            this.options = options;\n            this.elem = elem;\n            this.prop = prop;\n        };\n        H.Fx.prototype = {\n\n            /**\n             * Set the current step of a path definition on SVGElement.\n             *\n             * @function #dSetter\n             * @memberOf Highcharts.Fx\n             */\n            dSetter: function() {\n                var start = this.paths[0],\n                    end = this.paths[1],\n                    ret = [],\n                    now = this.now,\n                    i = start.length,\n                    startVal;\n\n                // Land on the final path without adjustment points appended in the ends\n                if (now === 1) {\n                    ret = this.toD;\n\n                } else if (i === end.length && now < 1) {\n                    while (i--) {\n                        startVal = parseFloat(start[i]);\n                        ret[i] =\n                            isNaN(startVal) ? // a letter instruction like M or L\n                            start[i] :\n                            now * (parseFloat(end[i] - startVal)) + startVal;\n\n                    }\n                    // If animation is finished or length not matching, land on right value\n                } else {\n                    ret = end;\n                }\n                this.elem.attr('d', ret, null, true);\n            },\n\n            /**\n             * Update the element with the current animation step.\n             *\n             * @function #update\n             * @memberOf Highcharts.Fx\n             */\n            update: function() {\n                var elem = this.elem,\n                    prop = this.prop, // if destroyed, it is null\n                    now = this.now,\n                    step = this.options.step;\n\n                // Animation setter defined from outside\n                if (this[prop + 'Setter']) {\n                    this[prop + 'Setter']();\n\n                    // Other animations on SVGElement\n                } else if (elem.attr) {\n                    if (elem.element) {\n                        elem.attr(prop, now, null, true);\n                    }\n\n                    // HTML styles, raw HTML content like container size\n                } else {\n                    elem.style[prop] = now + this.unit;\n                }\n\n                if (step) {\n                    step.call(elem, now, this);\n                }\n\n            },\n\n            /**\n             * Run an animation.\n             *\n             * @function #run\n             * @memberOf Highcharts.Fx\n             * @param {Number} from - The current value, value to start from.\n             * @param {Number} to - The end value, value to land on.\n             * @param {String} [unit] - The property unit, for example `px`.\n             * @returns {void}\n             */\n            run: function(from, to, unit) {\n                var self = this,\n                    timer = function(gotoEnd) {\n                        return timer.stopped ? false : self.step(gotoEnd);\n                    },\n                    i;\n\n                this.startTime = +new Date();\n                this.start = from;\n                this.end = to;\n                this.unit = unit;\n                this.now = this.start;\n                this.pos = 0;\n\n                timer.elem = this.elem;\n                timer.prop = this.prop;\n\n                if (timer() && timers.push(timer) === 1) {\n                    timer.timerId = setInterval(function() {\n\n                        for (i = 0; i < timers.length; i++) {\n                            if (!timers[i]()) {\n                                timers.splice(i--, 1);\n                            }\n                        }\n\n                        if (!timers.length) {\n                            clearInterval(timer.timerId);\n                        }\n                    }, 13);\n                }\n            },\n\n            /**\n             * Run a single step in the animation.\n             *\n             * @function #step\n             * @memberOf Highcharts.Fx\n             * @param   {Boolean} [gotoEnd] - Whether to go to the endpoint of the\n             *     animation after abort.\n             * @returns {Boolean} Returns `true` if animation continues.\n             */\n            step: function(gotoEnd) {\n                var t = +new Date(),\n                    ret,\n                    done,\n                    options = this.options,\n                    elem = this.elem,\n                    complete = options.complete,\n                    duration = options.duration,\n                    curAnim = options.curAnim;\n\n                if (elem.attr && !elem.element) { // #2616, element is destroyed\n                    ret = false;\n\n                } else if (gotoEnd || t >= duration + this.startTime) {\n                    this.now = this.end;\n                    this.pos = 1;\n                    this.update();\n\n                    curAnim[this.prop] = true;\n\n                    done = true;\n\n                    H.objectEach(curAnim, function(val) {\n                        if (val !== true) {\n                            done = false;\n                        }\n                    });\n\n                    if (done && complete) {\n                        complete.call(elem);\n                    }\n                    ret = false;\n\n                } else {\n                    this.pos = options.easing((t - this.startTime) / duration);\n                    this.now = this.start + ((this.end - this.start) * this.pos);\n                    this.update();\n                    ret = true;\n                }\n                return ret;\n            },\n\n            /**\n             * Prepare start and end values so that the path can be animated one to one.\n             *\n             * @function #initPath\n             * @memberOf Highcharts.Fx\n             * @param {SVGElement} elem - The SVGElement item.\n             * @param {String} fromD - Starting path definition.\n             * @param {Array} toD - Ending path definition.\n             * @returns {Array} An array containing start and end paths in array form\n             * so that they can be animated in parallel.\n             */\n            initPath: function(elem, fromD, toD) {\n                fromD = fromD || '';\n                var shift,\n                    startX = elem.startX,\n                    endX = elem.endX,\n                    bezier = fromD.indexOf('C') > -1,\n                    numParams = bezier ? 7 : 3,\n                    fullLength,\n                    slice,\n                    i,\n                    start = fromD.split(' '),\n                    end = toD.slice(), // copy\n                    isArea = elem.isArea,\n                    positionFactor = isArea ? 2 : 1,\n                    reverse;\n\n                /**\n                 * In splines make moveTo and lineTo points have six parameters like\n                 * bezier curves, to allow animation one-to-one.\n                 */\n                function sixify(arr) {\n                    var isOperator,\n                        nextIsOperator;\n                    i = arr.length;\n                    while (i--) {\n\n                        // Fill in dummy coordinates only if the next operator comes\n                        // three places behind (#5788)\n                        isOperator = arr[i] === 'M' || arr[i] === 'L';\n                        nextIsOperator = /[a-zA-Z]/.test(arr[i + 3]);\n                        if (isOperator && nextIsOperator) {\n                            arr.splice(\n                                i + 1, 0,\n                                arr[i + 1], arr[i + 2],\n                                arr[i + 1], arr[i + 2]\n                            );\n                        }\n                    }\n                }\n\n                /**\n                 * Insert an array at the given position of another array\n                 */\n                function insertSlice(arr, subArr, index) {\n                    [].splice.apply(\n                        arr, [index, 0].concat(subArr)\n                    );\n                }\n\n                /**\n                 * If shifting points, prepend a dummy point to the end path. \n                 */\n                function prepend(arr, other) {\n                    while (arr.length < fullLength) {\n\n                        // Move to, line to or curve to?\n                        arr[0] = other[fullLength - arr.length];\n\n                        // Prepend a copy of the first point\n                        insertSlice(arr, arr.slice(0, numParams), 0);\n\n                        // For areas, the bottom path goes back again to the left, so we\n                        // need to append a copy of the last point.\n                        if (isArea) {\n                            insertSlice(\n                                arr,\n                                arr.slice(arr.length - numParams), arr.length\n                            );\n                            i--;\n                        }\n                    }\n                    arr[0] = 'M';\n                }\n\n                /**\n                 * Copy and append last point until the length matches the end length\n                 */\n                function append(arr, other) {\n                    var i = (fullLength - arr.length) / numParams;\n                    while (i > 0 && i--) {\n\n                        // Pull out the slice that is going to be appended or inserted.\n                        // In a line graph, the positionFactor is 1, and the last point\n                        // is sliced out. In an area graph, the positionFactor is 2,\n                        // causing the middle two points to be sliced out, since an area\n                        // path starts at left, follows the upper path then turns and\n                        // follows the bottom back. \n                        slice = arr.slice().splice(\n                            (arr.length / positionFactor) - numParams,\n                            numParams * positionFactor\n                        );\n\n                        // Move to, line to or curve to?\n                        slice[0] = other[fullLength - numParams - (i * numParams)];\n\n                        // Disable first control point\n                        if (bezier) {\n                            slice[numParams - 6] = slice[numParams - 2];\n                            slice[numParams - 5] = slice[numParams - 1];\n                        }\n\n                        // Now insert the slice, either in the middle (for areas) or at\n                        // the end (for lines)\n                        insertSlice(arr, slice, arr.length / positionFactor);\n\n                        if (isArea) {\n                            i--;\n                        }\n                    }\n                }\n\n                if (bezier) {\n                    sixify(start);\n                    sixify(end);\n                }\n\n                // For sideways animation, find out how much we need to shift to get the\n                // start path Xs to match the end path Xs.\n                if (startX && endX) {\n                    for (i = 0; i < startX.length; i++) {\n                        // Moving left, new points coming in on right\n                        if (startX[i] === endX[0]) {\n                            shift = i;\n                            break;\n                            // Moving right\n                        } else if (startX[0] ===\n                            endX[endX.length - startX.length + i]) {\n                            shift = i;\n                            reverse = true;\n                            break;\n                        }\n                    }\n                    if (shift === undefined) {\n                        start = [];\n                    }\n                }\n\n                if (start.length && H.isNumber(shift)) {\n\n                    // The common target length for the start and end array, where both \n                    // arrays are padded in opposite ends\n                    fullLength = end.length + shift * positionFactor * numParams;\n\n                    if (!reverse) {\n                        prepend(end, start);\n                        append(start, end);\n                    } else {\n                        prepend(start, end);\n                        append(end, start);\n                    }\n                }\n\n                return [start, end];\n            }\n        }; // End of Fx prototype\n\n        /**\n         * Handle animation of the color attributes directly.\n         */\n        H.Fx.prototype.fillSetter =\n            H.Fx.prototype.strokeSetter = function() {\n                this.elem.attr(\n                    this.prop,\n                    H.color(this.start).tweenTo(H.color(this.end), this.pos),\n                    null,\n                    true\n                );\n            };\n\n\n        /**\n         * Utility function to extend an object with the members of another.\n         *\n         * @function #extend\n         * @memberOf Highcharts\n         * @param {Object} a - The object to be extended.\n         * @param {Object} b - The object to add to the first one.\n         * @returns {Object} Object a, the original object.\n         */\n        H.extend = function(a, b) {\n            var n;\n            if (!a) {\n                a = {};\n            }\n            for (n in b) {\n                a[n] = b[n];\n            }\n            return a;\n        };\n\n        /**\n         * Utility function to deep merge two or more objects and return a third object.\n         * If the first argument is true, the contents of the second object is copied\n         * into the first object. The merge function can also be used with a single \n         * object argument to create a deep copy of an object.\n         *\n         * @function #merge\n         * @memberOf Highcharts\n         * @param {Boolean} [extend] - Whether to extend the left-side object (a) or\n                  return a whole new object.\n         * @param {Object} a - The first object to extend. When only this is given, the\n                  function returns a deep copy.\n         * @param {...Object} [n] - An object to merge into the previous one.\n         * @returns {Object} - The merged object. If the first argument is true, the \n         * return is the same as the second argument.\n         */\n        H.merge = function() {\n            var i,\n                args = arguments,\n                len,\n                ret = {},\n                doCopy = function(copy, original) {\n                    // An object is replacing a primitive\n                    if (typeof copy !== 'object') {\n                        copy = {};\n                    }\n\n                    H.objectEach(original, function(value, key) {\n\n                        // Copy the contents of objects, but not arrays or DOM nodes\n                        if (\n                            H.isObject(value, true) &&\n                            !H.isClass(value) &&\n                            !H.isDOMElement(value)\n                        ) {\n                            copy[key] = doCopy(copy[key] || {}, value);\n\n                            // Primitives and arrays are copied over directly\n                        } else {\n                            copy[key] = original[key];\n                        }\n                    });\n                    return copy;\n                };\n\n            // If first argument is true, copy into the existing object. Used in\n            // setOptions.\n            if (args[0] === true) {\n                ret = args[1];\n                args = Array.prototype.slice.call(args, 2);\n            }\n\n            // For each argument, extend the return\n            len = args.length;\n            for (i = 0; i < len; i++) {\n                ret = doCopy(ret, args[i]);\n            }\n\n            return ret;\n        };\n\n        /**\n         * Shortcut for parseInt\n         * @ignore\n         * @param {Object} s\n         * @param {Number} mag Magnitude\n         */\n        H.pInt = function(s, mag) {\n            return parseInt(s, mag || 10);\n        };\n\n        /**\n         * Utility function to check for string type.\n         *\n         * @function #isString\n         * @memberOf Highcharts\n         * @param {Object} s - The item to check.\n         * @returns {Boolean} - True if the argument is a string.\n         */\n        H.isString = function(s) {\n            return typeof s === 'string';\n        };\n\n        /**\n         * Utility function to check if an item is an array.\n         *\n         * @function #isArray\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @returns {Boolean} - True if the argument is an array.\n         */\n        H.isArray = function(obj) {\n            var str = Object.prototype.toString.call(obj);\n            return str === '[object Array]' || str === '[object Array Iterator]';\n        };\n\n        /**\n         * Utility function to check if an item is of type object.\n         *\n         * @function #isObject\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @param {Boolean} [strict=false] - Also checks that the object is not an\n         *    array.\n         * @returns {Boolean} - True if the argument is an object.\n         */\n        H.isObject = function(obj, strict) {\n            return !!obj && typeof obj === 'object' && (!strict || !H.isArray(obj));\n        };\n\n        /**\n         * Utility function to check if an Object is a HTML Element.\n         *\n         * @function #isDOMElement\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @returns {Boolean} - True if the argument is a HTML Element.\n         */\n        H.isDOMElement = function(obj) {\n            return H.isObject(obj) && typeof obj.nodeType === 'number';\n        };\n\n        /**\n         * Utility function to check if an Object is an class.\n         *\n         * @function #isClass\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @returns {Boolean} - True if the argument is an class.\n         */\n        H.isClass = function(obj) {\n            var c = obj && obj.constructor;\n            return !!(\n                H.isObject(obj, true) &&\n                !H.isDOMElement(obj) &&\n                (c && c.name && c.name !== 'Object')\n            );\n        };\n\n        /**\n         * Utility function to check if an item is of type number.\n         *\n         * @function #isNumber\n         * @memberOf Highcharts\n         * @param {Object} n - The item to check.\n         * @returns {Boolean} - True if the item is a number and is not NaN.\n         */\n        H.isNumber = function(n) {\n            return typeof n === 'number' && !isNaN(n);\n        };\n\n        /**\n         * Remove the last occurence of an item from an array.\n         *\n         * @function #erase\n         * @memberOf Highcharts\n         * @param {Array} arr - The array.\n         * @param {*} item - The item to remove.\n         */\n        H.erase = function(arr, item) {\n            var i = arr.length;\n            while (i--) {\n                if (arr[i] === item) {\n                    arr.splice(i, 1);\n                    break;\n                }\n            }\n        };\n\n        /**\n         * Check if an object is null or undefined.\n         *\n         * @function #defined\n         * @memberOf Highcharts\n         * @param {Object} obj - The object to check.\n         * @returns {Boolean} - False if the object is null or undefined, otherwise\n         *        true.\n         */\n        H.defined = function(obj) {\n            return obj !== undefined && obj !== null;\n        };\n\n        /**\n         * Set or get an attribute or an object of attributes. To use as a setter, pass\n         * a key and a value, or let the second argument be a collection of keys and\n         * values. To use as a getter, pass only a string as the second argument.\n         *\n         * @function #attr\n         * @memberOf Highcharts\n         * @param {Object} elem - The DOM element to receive the attribute(s).\n         * @param {String|Object} [prop] - The property or an object of key-value pairs.\n         * @param {String} [value] - The value if a single property is set.\n         * @returns {*} When used as a getter, return the value.\n         */\n        H.attr = function(elem, prop, value) {\n            var ret;\n\n            // if the prop is a string\n            if (H.isString(prop)) {\n                // set the value\n                if (H.defined(value)) {\n                    elem.setAttribute(prop, value);\n\n                    // get the value\n                } else if (elem && elem.getAttribute) {\n                    ret = elem.getAttribute(prop);\n                }\n\n                // else if prop is defined, it is a hash of key/value pairs\n            } else if (H.defined(prop) && H.isObject(prop)) {\n                H.objectEach(prop, function(val, key) {\n                    elem.setAttribute(key, val);\n                });\n            }\n            return ret;\n        };\n\n        /**\n         * Check if an element is an array, and if not, make it into an array.\n         *\n         * @function #splat\n         * @memberOf Highcharts\n         * @param obj {*} - The object to splat.\n         * @returns {Array} The produced or original array.\n         */\n        H.splat = function(obj) {\n            return H.isArray(obj) ? obj : [obj];\n        };\n\n        /**\n         * Set a timeout if the delay is given, otherwise perform the function\n         * synchronously.\n         *\n         * @function #syncTimeout\n         * @memberOf Highcharts\n         * @param   {Function} fn - The function callback.\n         * @param   {Number}   delay - Delay in milliseconds.\n         * @param   {Object}   [context] - The context.\n         * @returns {Number} An identifier for the timeout that can later be cleared\n         * with clearTimeout.\n         */\n        H.syncTimeout = function(fn, delay, context) {\n            if (delay) {\n                return setTimeout(fn, delay, context);\n            }\n            fn.call(0, context);\n        };\n\n\n        /**\n         * Return the first value that is not null or undefined.\n         *\n         * @function #pick\n         * @memberOf Highcharts\n         * @param {...*} items - Variable number of arguments to inspect.\n         * @returns {*} The value of the first argument that is not null or undefined.\n         */\n        H.pick = function() {\n            var args = arguments,\n                i,\n                arg,\n                length = args.length;\n            for (i = 0; i < length; i++) {\n                arg = args[i];\n                if (arg !== undefined && arg !== null) {\n                    return arg;\n                }\n            }\n        };\n\n        /**\n         * @typedef {Object} CSSObject - A style object with camel case property names.\n         * The properties can be whatever styles are supported on the given SVG or HTML\n         * element.\n         * @example\n         * {\n         *    fontFamily: 'monospace',\n         *    fontSize: '1.2em'\n         * }\n         */\n        /**\n         * Set CSS on a given element.\n         *\n         * @function #css\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} el - A HTML DOM element.\n         * @param {CSSObject} styles - Style object with camel case property names.\n         * @returns {void}\n         */\n        H.css = function(el, styles) {\n            if (H.isMS && !H.svg) { // #2686\n                if (styles && styles.opacity !== undefined) {\n                    styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';\n                }\n            }\n            H.extend(el.style, styles);\n        };\n\n        /**\n         * A HTML DOM element.\n         * @typedef {Object} HTMLDOMElement\n         */\n\n        /**\n         * Utility function to create an HTML element with attributes and styles.\n         *\n         * @function #createElement\n         * @memberOf Highcharts\n         * @param {String} tag - The HTML tag.\n         * @param {Object} [attribs] - Attributes as an object of key-value pairs.\n         * @param {CSSObject} [styles] - Styles as an object of key-value pairs.\n         * @param {Object} [parent] - The parent HTML object.\n         * @param {Boolean} [nopad=false] - If true, remove all padding, border and\n         *    margin.\n         * @returns {HTMLDOMElement} The created DOM element.\n         */\n        H.createElement = function(tag, attribs, styles, parent, nopad) {\n            var el = doc.createElement(tag),\n                css = H.css;\n            if (attribs) {\n                H.extend(el, attribs);\n            }\n            if (nopad) {\n                css(el, {\n                    padding: 0,\n                    border: 'none',\n                    margin: 0\n                });\n            }\n            if (styles) {\n                css(el, styles);\n            }\n            if (parent) {\n                parent.appendChild(el);\n            }\n            return el;\n        };\n\n        /**\n         * Extend a prototyped class by new members.\n         *\n         * @function #extendClass\n         * @memberOf Highcharts\n         * @param {Object} parent - The parent prototype to inherit.\n         * @param {Object} members - A collection of prototype members to add or\n         *        override compared to the parent prototype.\n         * @returns {Object} A new prototype.\n         */\n        H.extendClass = function(parent, members) {\n            var object = function() {};\n            object.prototype = new parent(); // eslint-disable-line new-cap\n            H.extend(object.prototype, members);\n            return object;\n        };\n\n        /**\n         * Left-pad a string to a given length by adding a character repetetively.\n         *\n         * @function #pad\n         * @memberOf Highcharts\n         * @param {Number} number - The input string or number.\n         * @param {Number} length - The desired string length.\n         * @param {String} [padder=0] - The character to pad with.\n         * @returns {String} The padded string.\n         */\n        H.pad = function(number, length, padder) {\n            return new Array((length || 2) + 1 -\n                String(number).length).join(padder || 0) + number;\n        };\n\n        /**\n         * @typedef {Number|String} RelativeSize - If a number is given, it defines the\n         *    pixel length. If a percentage string is given, like for example `'50%'`,\n         *    the setting defines a length relative to a base size, for example the size\n         *    of a container.\n         */\n        /**\n         * Return a length based on either the integer value, or a percentage of a base.\n         *\n         * @function #relativeLength\n         * @memberOf Highcharts\n         * @param {RelativeSize} value - A percentage string or a number.\n         * @param {Number} base - The full length that represents 100%.\n         * @returns {Number} The computed length.\n         */\n        H.relativeLength = function(value, base) {\n            return (/%$/).test(value) ?\n                base * parseFloat(value) / 100 :\n                parseFloat(value);\n        };\n\n        /**\n         * Wrap a method with extended functionality, preserving the original function.\n         *\n         * @function #wrap\n         * @memberOf Highcharts\n         * @param {Object} obj - The context object that the method belongs to. In real\n         *        cases, this is often a prototype.\n         * @param {String} method - The name of the method to extend.\n         * @param {Function} func - A wrapper function callback. This function is called\n         *        with the same arguments as the original function, except that the\n         *        original function is unshifted and passed as the first argument.\n         * @returns {void}\n         */\n        H.wrap = function(obj, method, func) {\n            var proceed = obj[method];\n            obj[method] = function() {\n                var args = Array.prototype.slice.call(arguments),\n                    outerArgs = arguments,\n                    ctx = this,\n                    ret;\n                ctx.proceed = function() {\n                    proceed.apply(ctx, arguments.length ? arguments : outerArgs);\n                };\n                args.unshift(proceed);\n                ret = func.apply(this, args);\n                ctx.proceed = null;\n                return ret;\n            };\n        };\n\n        /**\n         * Get the time zone offset based on the current timezone information as set in\n         * the global options.\n         *\n         * @function #getTZOffset\n         * @memberOf Highcharts\n         * @param  {Number} timestamp - The JavaScript timestamp to inspect.\n         * @return {Number} - The timezone offset in minutes compared to UTC.\n         */\n        H.getTZOffset = function(timestamp) {\n            var d = H.Date;\n            return ((d.hcGetTimezoneOffset && d.hcGetTimezoneOffset(timestamp)) ||\n                d.hcTimezoneOffset || 0) * 60000;\n        };\n\n        /**\n         * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n         * human readable date string. The format is a subset of the formats for PHP's\n         * [strftime]{@link\n         * http://www.php.net/manual/en/function.strftime.php} function. Additional\n         * formats can be given in the {@link Highcharts.dateFormats} hook.\n         *\n         * @function #dateFormat\n         * @memberOf Highcharts\n         * @param {String} format - The desired format where various time\n         *        representations are prefixed with %.\n         * @param {Number} timestamp - The JavaScript timestamp.\n         * @param {Boolean} [capitalize=false] - Upper case first letter in the return.\n         * @returns {String} The formatted date.\n         */\n        H.dateFormat = function(format, timestamp, capitalize) {\n            if (!H.defined(timestamp) || isNaN(timestamp)) {\n                return H.defaultOptions.lang.invalidDate || '';\n            }\n            format = H.pick(format, '%Y-%m-%d %H:%M:%S');\n\n            var D = H.Date,\n                date = new D(timestamp - H.getTZOffset(timestamp)),\n                // get the basic time values\n                hours = date[D.hcGetHours](),\n                day = date[D.hcGetDay](),\n                dayOfMonth = date[D.hcGetDate](),\n                month = date[D.hcGetMonth](),\n                fullYear = date[D.hcGetFullYear](),\n                lang = H.defaultOptions.lang,\n                langWeekdays = lang.weekdays,\n                shortWeekdays = lang.shortWeekdays,\n                pad = H.pad,\n\n                // List all format keys. Custom formats can be added from the outside. \n                replacements = H.extend({\n\n                        //-- Day\n                        // Short weekday, like 'Mon'\n                        'a': shortWeekdays ?\n                            shortWeekdays[day] : langWeekdays[day].substr(0, 3),\n                        // Long weekday, like 'Monday'\n                        'A': langWeekdays[day],\n                        // Two digit day of the month, 01 to 31\n                        'd': pad(dayOfMonth),\n                        // Day of the month, 1 through 31\n                        'e': pad(dayOfMonth, 2, ' '),\n                        'w': day,\n\n                        // Week (none implemented)\n                        //'W': weekNumber(),\n\n                        //-- Month\n                        // Short month, like 'Jan'\n                        'b': lang.shortMonths[month],\n                        // Long month, like 'January'\n                        'B': lang.months[month],\n                        // Two digit month number, 01 through 12\n                        'm': pad(month + 1),\n\n                        //-- Year\n                        // Two digits year, like 09 for 2009\n                        'y': fullYear.toString().substr(2, 2),\n                        // Four digits year, like 2009\n                        'Y': fullYear,\n\n                        //-- Time\n                        // Two digits hours in 24h format, 00 through 23\n                        'H': pad(hours),\n                        // Hours in 24h format, 0 through 23\n                        'k': hours,\n                        // Two digits hours in 12h format, 00 through 11\n                        'I': pad((hours % 12) || 12),\n                        // Hours in 12h format, 1 through 12\n                        'l': (hours % 12) || 12,\n                        // Two digits minutes, 00 through 59\n                        'M': pad(date[D.hcGetMinutes]()),\n                        // Upper case AM or PM\n                        'p': hours < 12 ? 'AM' : 'PM',\n                        // Lower case AM or PM\n                        'P': hours < 12 ? 'am' : 'pm',\n                        // Two digits seconds, 00 through  59\n                        'S': pad(date.getSeconds()),\n                        // Milliseconds (naming from Ruby)\n                        'L': pad(Math.round(timestamp % 1000), 3)\n                    },\n\n                    /**\n                     * A hook for defining additional date format specifiers. New\n                     * specifiers are defined as key-value pairs by using the specifier\n                     * as key, and a function which takes the timestamp as value. This\n                     * function returns the formatted portion of the date.\n                     *\n                     * @type {Object}\n                     * @name dateFormats\n                     * @memberOf Highcharts\n                     * @sample highcharts/global/dateformats/ Adding support for week\n                     * number\n                     */\n                    H.dateFormats\n                );\n\n\n            // Do the replaces\n            H.objectEach(replacements, function(val, key) {\n                // Regex would do it in one line, but this is faster\n                while (format.indexOf('%' + key) !== -1) {\n                    format = format.replace(\n                        '%' + key,\n                        typeof val === 'function' ? val(timestamp) : val\n                    );\n                }\n\n            });\n\n            // Optionally capitalize the string and return\n            return capitalize ?\n                format.substr(0, 1).toUpperCase() + format.substr(1) :\n                format;\n        };\n\n        /**\n         * Format a single variable. Similar to sprintf, without the % prefix.\n         *\n         * @example\n         * formatSingle('.2f', 5); // => '5.00'.\n         *\n         * @function #formatSingle\n         * @memberOf Highcharts\n         * @param {String} format The format string.\n         * @param {*} val The value.\n         * @returns {String} The formatted representation of the value.\n         */\n        H.formatSingle = function(format, val) {\n            var floatRegex = /f$/,\n                decRegex = /\\.([0-9])/,\n                lang = H.defaultOptions.lang,\n                decimals;\n\n            if (floatRegex.test(format)) { // float\n                decimals = format.match(decRegex);\n                decimals = decimals ? decimals[1] : -1;\n                if (val !== null) {\n                    val = H.numberFormat(\n                        val,\n                        decimals,\n                        lang.decimalPoint,\n                        format.indexOf(',') > -1 ? lang.thousandsSep : ''\n                    );\n                }\n            } else {\n                val = H.dateFormat(format, val);\n            }\n            return val;\n        };\n\n        /**\n         * Format a string according to a subset of the rules of Python's String.format\n         * method.\n         *\n         * @function #format\n         * @memberOf Highcharts\n         * @param {String} str The string to format.\n         * @param {Object} ctx The context, a collection of key-value pairs where each\n         *        key is replaced by its value.\n         * @returns {String} The formatted string.\n         *\n         * @example\n         * var s = Highcharts.format(\n         *     'The {color} fox was {len:.2f} feet long',\n         *     { color: 'red', len: Math.PI }\n         * );\n         * // => The red fox was 3.14 feet long\n         */\n        H.format = function(str, ctx) {\n            var splitter = '{',\n                isInside = false,\n                segment,\n                valueAndFormat,\n                path,\n                i,\n                len,\n                ret = [],\n                val,\n                index;\n\n            while (str) {\n                index = str.indexOf(splitter);\n                if (index === -1) {\n                    break;\n                }\n\n                segment = str.slice(0, index);\n                if (isInside) { // we're on the closing bracket looking back\n\n                    valueAndFormat = segment.split(':');\n                    path = valueAndFormat.shift().split('.'); // get first and leave\n                    len = path.length;\n                    val = ctx;\n\n                    // Assign deeper paths\n                    for (i = 0; i < len; i++) {\n                        val = val[path[i]];\n                    }\n\n                    // Format the replacement\n                    if (valueAndFormat.length) {\n                        val = H.formatSingle(valueAndFormat.join(':'), val);\n                    }\n\n                    // Push the result and advance the cursor\n                    ret.push(val);\n\n                } else {\n                    ret.push(segment);\n\n                }\n                str = str.slice(index + 1); // the rest\n                isInside = !isInside; // toggle\n                splitter = isInside ? '}' : '{'; // now look for next matching bracket\n            }\n            ret.push(str);\n            return ret.join('');\n        };\n\n        /**\n         * Get the magnitude of a number.\n         *\n         * @function #getMagnitude\n         * @memberOf Highcharts\n         * @param {Number} number The number.\n         * @returns {Number} The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2\n         *        etc.\n         */\n        H.getMagnitude = function(num) {\n            return Math.pow(10, Math.floor(Math.log(num) / Math.LN10));\n        };\n\n        /**\n         * Take an interval and normalize it to multiples of round numbers.\n         *\n         * @todo  Move this function to the Axis prototype. It is here only for\n         *        historical reasons.\n         * @function #normalizeTickInterval\n         * @memberOf Highcharts\n         * @param {Number} interval - The raw, un-rounded interval.\n         * @param {Array} [multiples] - Allowed multiples.\n         * @param {Number} [magnitude] - The magnitude of the number.\n         * @param {Boolean} [allowDecimals] - Whether to allow decimals.\n         * @param {Boolean} [hasTickAmount] - If it has tickAmount, avoid landing\n         *        on tick intervals lower than original.\n         * @returns {Number} The normalized interval.\n         */\n        H.normalizeTickInterval = function(interval, multiples, magnitude,\n            allowDecimals, hasTickAmount) {\n            var normalized,\n                i,\n                retInterval = interval;\n\n            // round to a tenfold of 1, 2, 2.5 or 5\n            magnitude = H.pick(magnitude, 1);\n            normalized = interval / magnitude;\n\n            // multiples for a linear scale\n            if (!multiples) {\n                multiples = hasTickAmount ?\n                    // Finer grained ticks when the tick amount is hard set, including\n                    // when alignTicks is true on multiple axes (#4580).\n                    [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n\n                    // Else, let ticks fall on rounder numbers\n                    [1, 2, 2.5, 5, 10];\n\n\n                // the allowDecimals option\n                if (allowDecimals === false) {\n                    if (magnitude === 1) {\n                        multiples = H.grep(multiples, function(num) {\n                            return num % 1 === 0;\n                        });\n                    } else if (magnitude <= 0.1) {\n                        multiples = [1 / magnitude];\n                    }\n                }\n            }\n\n            // normalize the interval to the nearest multiple\n            for (i = 0; i < multiples.length; i++) {\n                retInterval = multiples[i];\n                // only allow tick amounts smaller than natural\n                if ((hasTickAmount && retInterval * magnitude >= interval) ||\n                    (!hasTickAmount && (normalized <= (multiples[i] +\n                        (multiples[i + 1] || multiples[i])) / 2))) {\n                    break;\n                }\n            }\n\n            // Multiply back to the correct magnitude. Correct floats to appropriate \n            // precision (#6085).\n            retInterval = H.correctFloat(\n                retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10)\n            );\n\n            return retInterval;\n        };\n\n\n        /**\n         * Sort an object array and keep the order of equal items. The ECMAScript\n         * standard does not specify the behaviour when items are equal.\n         *\n         * @function #stableSort\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to sort.\n         * @param {Function} sortFunction - The function to sort it with, like with \n         *        regular Array.prototype.sort.\n         * @returns {void}\n         */\n        H.stableSort = function(arr, sortFunction) {\n            var length = arr.length,\n                sortValue,\n                i;\n\n            // Add index to each item\n            for (i = 0; i < length; i++) {\n                arr[i].safeI = i; // stable sort index\n            }\n\n            arr.sort(function(a, b) {\n                sortValue = sortFunction(a, b);\n                return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n            });\n\n            // Remove index from items\n            for (i = 0; i < length; i++) {\n                delete arr[i].safeI; // stable sort index\n            }\n        };\n\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.min` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function #arrayMin\n         * @memberOf  Highcharts\n         * @param {Array} data An array of numbers.\n         * @returns {Number} The lowest number.\n         */\n        H.arrayMin = function(data) {\n            var i = data.length,\n                min = data[0];\n\n            while (i--) {\n                if (data[i] < min) {\n                    min = data[i];\n                }\n            }\n            return min;\n        };\n\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.max` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function #arrayMax\n         * @memberOf  Highcharts\n         * @param {Array} data - An array of numbers.\n         * @returns {Number} The highest number.\n         */\n        H.arrayMax = function(data) {\n            var i = data.length,\n                max = data[0];\n\n            while (i--) {\n                if (data[i] > max) {\n                    max = data[i];\n                }\n            }\n            return max;\n        };\n\n        /**\n         * Utility method that destroys any SVGElement instances that are properties on\n         * the given object. It loops all properties and invokes destroy if there is a\n         * destroy method. The property is then delete.\n         *\n         * @function #destroyObjectProperties\n         * @memberOf Highcharts\n         * @param {Object} obj - The object to destroy properties on.\n         * @param {Object} [except] - Exception, do not destroy this property, only\n         *    delete it.\n         * @returns {void}\n         */\n        H.destroyObjectProperties = function(obj, except) {\n            H.objectEach(obj, function(val, n) {\n                // If the object is non-null and destroy is defined\n                if (val && val !== except && val.destroy) {\n                    // Invoke the destroy\n                    val.destroy();\n                }\n\n                // Delete the property from the object.\n                delete obj[n];\n            });\n        };\n\n\n        /**\n         * Discard a HTML element by moving it to the bin and delete.\n         *\n         * @function #discardElement\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} element - The HTML node to discard.\n         * @returns {void}\n         */\n        H.discardElement = function(element) {\n            var garbageBin = H.garbageBin;\n            // create a garbage bin element, not part of the DOM\n            if (!garbageBin) {\n                garbageBin = H.createElement('div');\n            }\n\n            // move the node and empty bin\n            if (element) {\n                garbageBin.appendChild(element);\n            }\n            garbageBin.innerHTML = '';\n        };\n\n        /**\n         * Fix JS round off float errors.\n         *\n         * @function #correctFloat\n         * @memberOf Highcharts\n         * @param {Number} num - A float number to fix.\n         * @param {Number} [prec=14] - The precision.\n         * @returns {Number} The corrected float number.\n         */\n        H.correctFloat = function(num, prec) {\n            return parseFloat(\n                num.toPrecision(prec || 14)\n            );\n        };\n\n        /**\n         * Set the global animation to either a given value, or fall back to the given\n         * chart's animation option.\n         *\n         * @function #setAnimation\n         * @memberOf Highcharts\n         * @param {Boolean|Animation} animation - The animation object.\n         * @param {Object} chart - The chart instance.\n         * @returns {void}\n         * @todo This function always relates to a chart, and sets a property on the\n         *        renderer, so it should be moved to the SVGRenderer.\n         */\n        H.setAnimation = function(animation, chart) {\n            chart.renderer.globalAnimation = H.pick(\n                animation,\n                chart.options.chart.animation,\n                true\n            );\n        };\n\n        /**\n         * Get the animation in object form, where a disabled animation is always\n         * returned as `{ duration: 0 }`.\n         *\n         * @function #animObject\n         * @memberOf Highcharts\n         * @param {Boolean|AnimationOptions} animation - An animation setting. Can be an\n         *        object with duration, complete and easing properties, or a boolean to\n         *        enable or disable.\n         * @returns {AnimationOptions} An object with at least a duration property.\n         */\n        H.animObject = function(animation) {\n            return H.isObject(animation) ?\n                H.merge(animation) : {\n                    duration: animation ? 500 : 0\n                };\n        };\n\n        /**\n         * The time unit lookup\n         */\n        H.timeUnits = {\n            millisecond: 1,\n            second: 1000,\n            minute: 60000,\n            hour: 3600000,\n            day: 24 * 3600000,\n            week: 7 * 24 * 3600000,\n            month: 28 * 24 * 3600000,\n            year: 364 * 24 * 3600000\n        };\n\n        /**\n         * Format a number and return a string based on input settings.\n         *\n         * @function #numberFormat\n         * @memberOf Highcharts\n         * @param {Number} number - The input number to format.\n         * @param {Number} decimals - The amount of decimals. A value of -1 preserves\n         *        the amount in the input number.\n         * @param {String} [decimalPoint] - The decimal point, defaults to the one given\n         *        in the lang options, or a dot.\n         * @param {String} [thousandsSep] - The thousands separator, defaults to the one\n         *        given in the lang options, or a space character.\n         * @returns {String} The formatted number.\n         *\n         * @sample members/highcharts-numberformat/ Custom number format\n         */\n        H.numberFormat = function(number, decimals, decimalPoint, thousandsSep) {\n            number = +number || 0;\n            decimals = +decimals;\n\n            var lang = H.defaultOptions.lang,\n                origDec = (number.toString().split('.')[1] || '').length,\n                strinteger,\n                thousands,\n                ret,\n                roundedNumber;\n\n            if (decimals === -1) {\n                // Preserve decimals. Not huge numbers (#3793).\n                decimals = Math.min(origDec, 20);\n            } else if (!H.isNumber(decimals)) {\n                decimals = 2;\n            }\n\n            // Add another decimal to avoid rounding errors of float numbers. (#4573)\n            // Then use toFixed to handle rounding.\n            roundedNumber = (\n                Math.abs(number) + Math.pow(10, -Math.max(decimals, origDec) - 1)\n            ).toFixed(decimals);\n\n            // A string containing the positive integer component of the number\n            strinteger = String(H.pInt(roundedNumber));\n\n            // Leftover after grouping into thousands. Can be 0, 1 or 3.\n            thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n\n            // Language\n            decimalPoint = H.pick(decimalPoint, lang.decimalPoint);\n            thousandsSep = H.pick(thousandsSep, lang.thousandsSep);\n\n            // Start building the return\n            ret = number < 0 ? '-' : '';\n\n            // Add the leftover after grouping into thousands. For example, in the\n            // number 42 000 000, this line adds 42.\n            ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n\n            // Add the remaining thousands groups, joined by the thousands separator\n            ret += strinteger\n                .substr(thousands)\n                .replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n\n            // Add the decimal point and the decimal component\n            if (decimals) {\n                // Get the decimal component\n                ret += decimalPoint + roundedNumber.slice(-decimals);\n            }\n\n            return ret;\n        };\n\n        /**\n         * Easing definition\n         * @ignore\n         * @param   {Number} pos Current position, ranging from 0 to 1.\n         */\n        Math.easeInOutSine = function(pos) {\n            return -0.5 * (Math.cos(Math.PI * pos) - 1);\n        };\n\n        /**\n         * Get the computed CSS value for given element and property, only for numerical\n         * properties. For width and height, the dimension of the inner box (excluding\n         * padding) is returned. Used for fitting the chart within the container.\n         *\n         * @function #getStyle\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} el - A HTML element.\n         * @param {String} prop - The property name.\n         * @param {Boolean} [toInt=true] - Parse to integer.\n         * @returns {Number} - The numeric value.\n         */\n        H.getStyle = function(el, prop, toInt) {\n\n            var style;\n\n            // For width and height, return the actual inner pixel size (#4913)\n            if (prop === 'width') {\n                return Math.min(el.offsetWidth, el.scrollWidth) -\n                    H.getStyle(el, 'padding-left') -\n                    H.getStyle(el, 'padding-right');\n            } else if (prop === 'height') {\n                return Math.min(el.offsetHeight, el.scrollHeight) -\n                    H.getStyle(el, 'padding-top') -\n                    H.getStyle(el, 'padding-bottom');\n            }\n\n            // Otherwise, get the computed style\n            style = win.getComputedStyle(el, undefined);\n            if (style) {\n                style = style.getPropertyValue(prop);\n                if (H.pick(toInt, true)) {\n                    style = H.pInt(style);\n                }\n            }\n            return style;\n        };\n\n        /**\n         * Search for an item in an array.\n         *\n         * @function #inArray\n         * @memberOf Highcharts\n         * @param {*} item - The item to search for.\n         * @param {arr} arr - The array or node collection to search in.\n         * @returns {Number} - The index within the array, or -1 if not found.\n         */\n        H.inArray = function(item, arr) {\n            return arr.indexOf ? arr.indexOf(item) : [].indexOf.call(arr, item);\n        };\n\n        /**\n         * Filter an array by a callback.\n         *\n         * @function #grep\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to filter.\n         * @param {Function} callback - The callback function. The function receives the\n         *        item as the first argument. Return `true` if the item is to be\n         *        preserved.\n         * @returns {Array} - A new, filtered array.\n         */\n        H.grep = function(arr, callback) {\n            return [].filter.call(arr, callback);\n        };\n\n        /**\n         * Return the value of the first element in the array that satisfies the \n         * provided testing function.\n         *\n         * @function #find\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to test.\n         * @param {Function} callback - The callback function. The function receives the\n         *        item as the first argument. Return `true` if this item satisfies the\n         *        condition.\n         * @returns {Mixed} - The value of the element.\n         */\n        H.find = function(arr, callback) {\n            return [].find.call(arr, callback);\n        };\n\n        /**\n         * Map an array by a callback.\n         *\n         * @function #map\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to map.\n         * @param {Function} fn - The callback function. Return the new value for the \n         *        new array.\n         * @returns {Array} - A new array item with modified items.\n         */\n        H.map = function(arr, fn) {\n            var results = [],\n                i = 0,\n                len = arr.length;\n\n            for (; i < len; i++) {\n                results[i] = fn.call(arr[i], arr[i], i, arr);\n            }\n\n            return results;\n        };\n\n        /**\n         * Get the element's offset position, corrected for `overflow: auto`.\n         *\n         * @function #offset\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} el - The HTML element.\n         * @returns {Object} An object containing `left` and `top` properties for the\n         * position in the page.\n         */\n        H.offset = function(el) {\n            var docElem = doc.documentElement,\n                box = el.getBoundingClientRect();\n\n            return {\n                top: box.top + (win.pageYOffset || docElem.scrollTop) -\n                    (docElem.clientTop || 0),\n                left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n                    (docElem.clientLeft || 0)\n            };\n        };\n\n        /**\n         * Stop running animation.\n         *\n         * @todo A possible extension to this would be to stop a single property, when\n         * we want to continue animating others. Then assign the prop to the timer\n         * in the Fx.run method, and check for the prop here. This would be an\n         * improvement in all cases where we stop the animation from .attr. Instead of\n         * stopping everything, we can just stop the actual attributes we're setting.\n         *\n         * @function #stop\n         * @memberOf Highcharts\n         * @param {SVGElement} el - The SVGElement to stop animation on.\n         * @param {string} [prop] - The property to stop animating. If given, the stop\n         *    method will stop a single property from animating, while others continue.\n         * @returns {void}\n         */\n        H.stop = function(el, prop) {\n\n            var i = timers.length;\n\n            // Remove timers related to this element (#4519)\n            while (i--) {\n                if (timers[i].elem === el && (!prop || prop === timers[i].prop)) {\n                    timers[i].stopped = true; // #4667\n                }\n            }\n        };\n\n        /**\n         * Iterate over an array.\n         *\n         * @function #each\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to iterate over.\n         * @param {Function} fn - The iterator callback. It passes three arguments:\n         * * item - The array item.\n         * * index - The item's index in the array.\n         * * arr - The array that each is being applied to.\n         * @param {Object} [ctx] The context.\n         */\n        H.each = function(arr, fn, ctx) { // modern browsers\n            return Array.prototype.forEach.call(arr, fn, ctx);\n        };\n\n        /**\n         * Iterate over object key pairs in an object.\n         *\n         * @function #objectEach\n         * @memberOf Highcharts\n         * @param  {Object}   obj - The object to iterate over.\n         * @param  {Function} fn  - The iterator callback. It passes three arguments:\n         * * value - The property value.\n         * * key - The property key.\n         * * obj - The object that objectEach is being applied to.\n         * @param  {Object}   ctx The context\n         */\n        H.objectEach = function(obj, fn, ctx) {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    fn.call(ctx, obj[key], key, obj);\n                }\n            }\n        };\n\n        /**\n         * Add an event listener.\n         *\n         * @function #addEvent\n         * @memberOf Highcharts\n         * @param {Object} el - The element or object to add a listener to. It can be a\n         *        {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n         * @param {String} type - The event type.\n         * @param {Function} fn - The function callback to execute when the event is \n         *        fired.\n         * @returns {Function} A callback function to remove the added event.\n         */\n        H.addEvent = function(el, type, fn) {\n\n            var events = el.hcEvents = el.hcEvents || {};\n\n            function wrappedFn(e) {\n                e.target = e.srcElement || win; // #2820\n                fn.call(el, e);\n            }\n\n            // Handle DOM events in modern browsers\n            if (el.addEventListener) {\n                el.addEventListener(type, fn, false);\n\n                // Handle old IE implementation\n            } else if (el.attachEvent) {\n\n                if (!el.hcEventsIE) {\n                    el.hcEventsIE = {};\n                }\n\n                // Link wrapped fn with original fn, so we can get this in removeEvent\n                el.hcEventsIE[fn.toString()] = wrappedFn;\n\n                el.attachEvent('on' + type, wrappedFn);\n            }\n\n            if (!events[type]) {\n                events[type] = [];\n            }\n\n            events[type].push(fn);\n\n            // Return a function that can be called to remove this event.\n            return function() {\n                H.removeEvent(el, type, fn);\n            };\n        };\n\n        /**\n         * Remove an event that was added with {@link Highcharts#addEvent}.\n         *\n         * @function #removeEvent\n         * @memberOf Highcharts\n         * @param {Object} el - The element to remove events on.\n         * @param {String} [type] - The type of events to remove. If undefined, all\n         *        events are removed from the element.\n         * @param {Function} [fn] - The specific callback to remove. If undefined, all\n         *        events that match the element and optionally the type are removed.\n         * @returns {void}\n         */\n        H.removeEvent = function(el, type, fn) {\n\n            var events,\n                hcEvents = el.hcEvents,\n                index;\n\n            function removeOneEvent(type, fn) {\n                if (el.removeEventListener) {\n                    el.removeEventListener(type, fn, false);\n                } else if (el.attachEvent) {\n                    fn = el.hcEventsIE[fn.toString()];\n                    el.detachEvent('on' + type, fn);\n                }\n            }\n\n            function removeAllEvents() {\n                var types,\n                    len;\n\n                if (!el.nodeName) {\n                    return; // break on non-DOM events\n                }\n\n                if (type) {\n                    types = {};\n                    types[type] = true;\n                } else {\n                    types = hcEvents;\n                }\n\n                H.objectEach(types, function(val, n) {\n                    if (hcEvents[n]) {\n                        len = hcEvents[n].length;\n                        while (len--) {\n                            removeOneEvent(n, hcEvents[n][len]);\n                        }\n                    }\n                });\n            }\n\n            if (hcEvents) {\n                if (type) {\n                    events = hcEvents[type] || [];\n                    if (fn) {\n                        index = H.inArray(fn, events);\n                        if (index > -1) {\n                            events.splice(index, 1);\n                            hcEvents[type] = events;\n                        }\n                        removeOneEvent(type, fn);\n\n                    } else {\n                        removeAllEvents();\n                        hcEvents[type] = [];\n                    }\n                } else {\n                    removeAllEvents();\n                    el.hcEvents = {};\n                }\n            }\n        };\n\n        /**\n         * Fire an event that was registered with {@link Highcharts#addEvent}.\n         *\n         * @function #fireEvent\n         * @memberOf Highcharts\n         * @param {Object} el - The object to fire the event on. It can be a\n         *        {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n         * @param {String} type - The type of event.\n         * @param {Object} [eventArguments] - Custom event arguments that are passed on\n         *        as an argument to the event handler.\n         * @param {Function} [defaultFunction] - The default function to execute if the \n         *        other listeners haven't returned false.\n         * @returns {void}\n         */\n        H.fireEvent = function(el, type, eventArguments, defaultFunction) {\n            var e,\n                hcEvents = el.hcEvents,\n                events,\n                len,\n                i,\n                fn;\n\n            eventArguments = eventArguments || {};\n\n            if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {\n                e = doc.createEvent('Events');\n                e.initEvent(type, true, true);\n                //e.target = el;\n\n                H.extend(e, eventArguments);\n\n                if (el.dispatchEvent) {\n                    el.dispatchEvent(e);\n                } else {\n                    el.fireEvent(type, e);\n                }\n\n            } else if (hcEvents) {\n\n                events = hcEvents[type] || [];\n                len = events.length;\n\n                if (!eventArguments.target) { // We're running a custom event\n\n                    H.extend(eventArguments, {\n                        // Attach a simple preventDefault function to skip default\n                        // handler if called. The built-in defaultPrevented property is\n                        // not overwritable (#5112)\n                        preventDefault: function() {\n                            eventArguments.defaultPrevented = true;\n                        },\n                        // Setting target to native events fails with clicking the\n                        // zoom-out button in Chrome.\n                        target: el,\n                        // If the type is not set, we're running a custom event (#2297).\n                        // If it is set, we're running a browser event, and setting it\n                        // will cause en error in IE8 (#2465).\t\t\n                        type: type\n                    });\n                }\n\n\n                for (i = 0; i < len; i++) {\n                    fn = events[i];\n\n                    // If the event handler return false, prevent the default handler\n                    // from executing\n                    if (fn && fn.call(el, eventArguments) === false) {\n                        eventArguments.preventDefault();\n                    }\n                }\n            }\n\n            // Run the default if not prevented\n            if (defaultFunction && !eventArguments.defaultPrevented) {\n                defaultFunction(eventArguments);\n            }\n        };\n\n        /**\n         * An animation configuration. Animation configurations can also be defined as\n         * booleans, where `false` turns off animation and `true` defaults to a duration\n         * of 500ms.\n         * @typedef {Object} AnimationOptions\n         * @property {Number} duration - The animation duration in milliseconds.\n         * @property {String} [easing] - The name of an easing function as defined on\n         *     the `Math` object.\n         * @property {Function} [complete] - A callback function to exectute when the\n         *     animation finishes.\n         * @property {Function} [step] - A callback function to execute on each step of\n         *     each attribute or CSS property that's being animated. The first argument\n         *     contains information about the animation and progress.\n         */\n\n\n        /**\n         * The global animate method, which uses Fx to create individual animators.\n         *\n         * @function #animate\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement|SVGElement} el - The element to animate.\n         * @param {Object} params - An object containing key-value pairs of the\n         *        properties to animate. Supports numeric as pixel-based CSS properties\n         *        for HTML objects and attributes for SVGElements.\n         * @param {AnimationOptions} [opt] - Animation options.\n         */\n        H.animate = function(el, params, opt) {\n            var start,\n                unit = '',\n                end,\n                fx,\n                args;\n\n            if (!H.isObject(opt)) { // Number or undefined/null\n                args = arguments;\n                opt = {\n                    duration: args[2],\n                    easing: args[3],\n                    complete: args[4]\n                };\n            }\n            if (!H.isNumber(opt.duration)) {\n                opt.duration = 400;\n            }\n            opt.easing = typeof opt.easing === 'function' ?\n                opt.easing :\n                (Math[opt.easing] || Math.easeInOutSine);\n            opt.curAnim = H.merge(params);\n\n            H.objectEach(params, function(val, prop) {\n                // Stop current running animation of this property\n                H.stop(el, prop);\n\n                fx = new H.Fx(el, opt, prop);\n                end = null;\n\n                if (prop === 'd') {\n                    fx.paths = fx.initPath(\n                        el,\n                        el.d,\n                        params.d\n                    );\n                    fx.toD = params.d;\n                    start = 0;\n                    end = 1;\n                } else if (el.attr) {\n                    start = el.attr(prop);\n                } else {\n                    start = parseFloat(H.getStyle(el, prop)) || 0;\n                    if (prop !== 'opacity') {\n                        unit = 'px';\n                    }\n                }\n\n                if (!end) {\n                    end = val;\n                }\n                if (end && end.match && end.match('px')) {\n                    end = end.replace(/px/g, ''); // #4351\n                }\n                fx.run(start, end, unit);\n            });\n        };\n\n        /**\n         * Factory to create new series prototypes.\n         *\n         * @function #seriesType\n         * @memberOf Highcharts\n         *\n         * @param {String} type - The series type name.\n         * @param {String} parent - The parent series type name. Use `line` to inherit\n         *        from the basic {@link Series} object.\n         * @param {Object} options - The additional default options that is merged with\n         *        the parent's options.\n         * @param {Object} props - The properties (functions and primitives) to set on\n         *        the new prototype.\n         * @param {Object} [pointProps] - Members for a series-specific extension of the\n         *        {@link Point} prototype if needed.\n         * @returns {*} - The newly created prototype as extended from {@link Series}\n         * or its derivatives.\n         */\n        // docs: add to API + extending Highcharts\n        H.seriesType = function(type, parent, options, props, pointProps) {\n            var defaultOptions = H.getOptions(),\n                seriesTypes = H.seriesTypes;\n\n            if (seriesTypes[type]) {\n                return H.error(27); // Series type already defined\n            }\n\n            // Merge the options\n            defaultOptions.plotOptions[type] = H.merge(\n                defaultOptions.plotOptions[parent],\n                options\n            );\n\n            // Create the class\n            seriesTypes[type] = H.extendClass(seriesTypes[parent] ||\n                function() {}, props);\n            seriesTypes[type].prototype.type = type;\n\n            // Create the point class if needed\n            if (pointProps) {\n                seriesTypes[type].prototype.pointClass =\n                    H.extendClass(H.Point, pointProps);\n            }\n\n            return seriesTypes[type];\n        };\n\n        /**\n         * Get a unique key for using in internal element id's and pointers. The key\n         * is composed of a random hash specific to this Highcharts instance, and a \n         * counter.\n         * @function #uniqueKey\n         * @memberOf Highcharts\n         * @return {string} The key.\n         * @example\n         * var id = H.uniqueKey(); // => 'highcharts-x45f6hp-0'\n         */\n        H.uniqueKey = (function() {\n\n            var uniqueKeyHash = Math.random().toString(36).substring(2, 9),\n                idCounter = 0;\n\n            return function() {\n                return 'highcharts-' + uniqueKeyHash + '-' + idCounter++;\n            };\n        }());\n\n        /**\n         * Register Highcharts as a plugin in jQuery\n         */\n        if (win.jQuery) {\n            win.jQuery.fn.highcharts = function() {\n                var args = [].slice.call(arguments);\n\n                if (this[0]) { // this[0] is the renderTo div\n\n                    // Create the chart\n                    if (args[0]) {\n                        new H[ // eslint-disable-line no-new\n                            // Constructor defaults to Chart\n                            H.isString(args[0]) ? args.shift() : 'Chart'\n                        ](this[0], args[0], args[1]);\n                        return this;\n                    }\n\n                    // When called without parameters or with the return argument,\n                    // return an existing chart\n                    return charts[H.attr(this[0], 'data-highcharts-chart')];\n                }\n            };\n        }\n\n\n        /**\n         * Compatibility section to add support for legacy IE. This can be removed if\n         * old IE support is not needed.\n         */\n        if (doc && !doc.defaultView) {\n            H.getStyle = function(el, prop) {\n                var val,\n                    alias = {\n                        width: 'clientWidth',\n                        height: 'clientHeight'\n                    }[prop];\n\n                if (el.style[prop]) {\n                    return H.pInt(el.style[prop]);\n                }\n                if (prop === 'opacity') {\n                    prop = 'filter';\n                }\n\n                // Getting the rendered width and height\n                if (alias) {\n                    el.style.zoom = 1;\n                    return Math.max(el[alias] - 2 * H.getStyle(el, 'padding'), 0);\n                }\n\n                val = el.currentStyle[prop.replace(/\\-(\\w)/g, function(a, b) {\n                    return b.toUpperCase();\n                })];\n                if (prop === 'filter') {\n                    val = val.replace(\n                        /alpha\\(opacity=([0-9]+)\\)/,\n                        function(a, b) {\n                            return b / 100;\n                        }\n                    );\n                }\n\n                return val === '' ? 1 : H.pInt(val);\n            };\n        }\n\n        if (!Array.prototype.forEach) {\n            H.each = function(arr, fn, ctx) { // legacy\n                var i = 0,\n                    len = arr.length;\n                for (; i < len; i++) {\n                    if (fn.call(ctx, arr[i], i, arr) === false) {\n                        return i;\n                    }\n                }\n            };\n        }\n\n        if (!Array.prototype.indexOf) {\n            H.inArray = function(item, arr) {\n                var len,\n                    i = 0;\n\n                if (arr) {\n                    len = arr.length;\n\n                    for (; i < len; i++) {\n                        if (arr[i] === item) {\n                            return i;\n                        }\n                    }\n                }\n\n                return -1;\n            };\n        }\n\n        if (!Array.prototype.filter) {\n            H.grep = function(elements, fn) {\n                var ret = [],\n                    i = 0,\n                    length = elements.length;\n\n                for (; i < length; i++) {\n                    if (fn(elements[i], i)) {\n                        ret.push(elements[i]);\n                    }\n                }\n\n                return ret;\n            };\n        }\n\n        if (!Array.prototype.find) {\n            H.find = function(arr, fn) {\n                var i,\n                    length = arr.length;\n\n                for (i = 0; i < length; i++) {\n                    if (fn(arr[i], i)) {\n                        return arr[i];\n                    }\n                }\n            };\n        }\n\n        //--- End compatibility section ---\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            isNumber = H.isNumber,\n            map = H.map,\n            merge = H.merge,\n            pInt = H.pInt;\n\n        /**\n         * @typedef {string} ColorString\n         * A valid color to be parsed and handled by Highcharts. Highcharts internally \n         * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n         * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n         * browsers and displayed correctly, but Highcharts is not able to process them\n         * and apply concepts like opacity and brightening.\n         */\n        /**\n         * Handle color operations. The object methods are chainable.\n         * @param {String} input The input color in either rbga or hex format\n         */\n        H.Color = function(input) {\n            // Backwards compatibility, allow instanciation without new\n            if (!(this instanceof H.Color)) {\n                return new H.Color(input);\n            }\n            // Initialize\n            this.init(input);\n        };\n        H.Color.prototype = {\n\n            // Collection of parsers. This can be extended from the outside by pushing parsers\n            // to Highcharts.Color.prototype.parsers.\n            parsers: [{\n                // RGBA color\n                regex: /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\n                parse: function(result) {\n                    return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];\n                }\n            }, {\n                // RGB color\n                regex: /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\n                parse: function(result) {\n                    return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n                }\n            }],\n\n            // Collection of named colors. Can be extended from the outside by adding\n            // colors to Highcharts.Color.prototype.names.\n            names: {\n                none: 'rgba(255,255,255,0)',\n                white: '#ffffff',\n                black: '#000000'\n            },\n\n            /**\n             * Parse the input color to rgba array\n             * @param {String} input\n             */\n            init: function(input) {\n                var result,\n                    rgba,\n                    i,\n                    parser,\n                    len;\n\n                this.input = input = this.names[\n                    input && input.toLowerCase ?\n                    input.toLowerCase() :\n                    ''\n                ] || input;\n\n                // Gradients\n                if (input && input.stops) {\n                    this.stops = map(input.stops, function(stop) {\n                        return new H.Color(stop[1]);\n                    });\n\n                    // Solid colors\n                } else {\n\n                    // Check if it's possible to do bitmasking instead of regex\n                    if (input && input[0] === '#') {\n\n                        len = input.length;\n                        input = parseInt(input.substr(1), 16);\n\n                        // Handle long-form, e.g. #AABBCC\n                        if (len === 7) {\n\n                            rgba = [\n                                (input & 0xFF0000) >> 16,\n                                (input & 0xFF00) >> 8,\n                                (input & 0xFF),\n                                1\n                            ];\n\n                            // Handle short-form, e.g. #ABC\n                            // In short form, the value is assumed to be the same \n                            // for both nibbles for each component. e.g. #ABC = #AABBCC\n                        } else if (len === 4) {\n\n                            rgba = [\n                                ((input & 0xF00) >> 4) | (input & 0xF00) >> 8,\n                                ((input & 0xF0) >> 4) | (input & 0xF0),\n                                ((input & 0xF) << 4) | (input & 0xF),\n                                1\n                            ];\n                        }\n                    }\n\n                    // Otherwise, check regex parsers\n                    if (!rgba) {\n                        i = this.parsers.length;\n                        while (i-- && !rgba) {\n                            parser = this.parsers[i];\n                            result = parser.regex.exec(input);\n                            if (result) {\n                                rgba = parser.parse(result);\n                            }\n                        }\n                    }\n                }\n                this.rgba = rgba || [];\n            },\n\n            /**\n             * Return the color a specified format\n             * @param {String} format\n             */\n            get: function(format) {\n                var input = this.input,\n                    rgba = this.rgba,\n                    ret;\n\n                if (this.stops) {\n                    ret = merge(input);\n                    ret.stops = [].concat(ret.stops);\n                    each(this.stops, function(stop, i) {\n                        ret.stops[i] = [ret.stops[i][0], stop.get(format)];\n                    });\n\n                    // it's NaN if gradient colors on a column chart\n                } else if (rgba && isNumber(rgba[0])) {\n                    if (format === 'rgb' || (!format && rgba[3] === 1)) {\n                        ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n                    } else if (format === 'a') {\n                        ret = rgba[3];\n                    } else {\n                        ret = 'rgba(' + rgba.join(',') + ')';\n                    }\n                } else {\n                    ret = input;\n                }\n                return ret;\n            },\n\n            /**\n             * Brighten the color\n             * @param {Number} alpha\n             */\n            brighten: function(alpha) {\n                var i,\n                    rgba = this.rgba;\n\n                if (this.stops) {\n                    each(this.stops, function(stop) {\n                        stop.brighten(alpha);\n                    });\n\n                } else if (isNumber(alpha) && alpha !== 0) {\n                    for (i = 0; i < 3; i++) {\n                        rgba[i] += pInt(alpha * 255);\n\n                        if (rgba[i] < 0) {\n                            rgba[i] = 0;\n                        }\n                        if (rgba[i] > 255) {\n                            rgba[i] = 255;\n                        }\n                    }\n                }\n                return this;\n            },\n\n            /**\n             * Set the color's opacity to a given alpha value\n             * @param {Number} alpha\n             */\n            setOpacity: function(alpha) {\n                this.rgba[3] = alpha;\n                return this;\n            },\n\n            /*\n             * Return an intermediate color between two colors.\n             *\n             * @param  {Highcharts.Color} to\n             *         The color object to tween to.\n             * @param  {Number} pos\n             *         The intermediate position, where 0 is the from color (current\n             *         color item), and 1 is the `to` color.\n             *\n             * @return {String}\n             *         The intermediate color in rgba notation.\n             */\n            tweenTo: function(to, pos) {\n                // Check for has alpha, because rgba colors perform worse due to lack of\n                // support in WebKit.\n                var from = this,\n                    hasAlpha,\n                    ret;\n\n                // Unsupported color, return to-color (#3920)\n                if (!to.rgba.length) {\n                    ret = to.input || 'none';\n\n                    // Interpolate\n                } else {\n                    from = from.rgba;\n                    to = to.rgba;\n                    hasAlpha = (to[3] !== 1 || from[3] !== 1);\n                    ret = (hasAlpha ? 'rgba(' : 'rgb(') +\n                        Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +\n                        Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +\n                        Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +\n                        (hasAlpha ?\n                            (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) :\n                            '') + ')';\n                }\n                return ret;\n            }\n        };\n        H.color = function(input) {\n            return new H.Color(input);\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var SVGElement,\n            SVGRenderer,\n\n            addEvent = H.addEvent,\n            animate = H.animate,\n            attr = H.attr,\n            charts = H.charts,\n            color = H.color,\n            css = H.css,\n            createElement = H.createElement,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            destroyObjectProperties = H.destroyObjectProperties,\n            doc = H.doc,\n            each = H.each,\n            extend = H.extend,\n            erase = H.erase,\n            grep = H.grep,\n            hasTouch = H.hasTouch,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isObject = H.isObject,\n            isString = H.isString,\n            isWebKit = H.isWebKit,\n            merge = H.merge,\n            noop = H.noop,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            pInt = H.pInt,\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            stop = H.stop,\n            svg = H.svg,\n            SVG_NS = H.SVG_NS,\n            symbolSizes = H.symbolSizes,\n            win = H.win;\n\n        /**\n         * @typedef {Object} SVGDOMElement - An SVG DOM element.\n         */\n        /**\n         * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n         * rendering layer of Highcharts. Combined with the {@link\n         * Highcharts.SVGRenderer} object, these prototypes allow freeform annotation\n         * in the charts or even in HTML pages without instanciating a chart. The\n         * SVGElement can also wrap HTML labels, when `text` or `label` elements are\n         * created with the `useHTML` parameter.\n         *\n         * The SVGElement instances are created through factory functions on the \n         * {@link Highcharts.SVGRenderer} object, like\n         * [rect]{@link Highcharts.SVGRenderer#rect}, [path]{@link\n         * Highcharts.SVGRenderer#path}, [text]{@link Highcharts.SVGRenderer#text},\n         * [label]{@link Highcharts.SVGRenderer#label}, [g]{@link\n         * Highcharts.SVGRenderer#g} and more.\n         *\n         * @class Highcharts.SVGElement\n         */\n        SVGElement = H.SVGElement = function() {\n            return this;\n        };\n        extend(SVGElement.prototype, /** @lends Highcharts.SVGElement.prototype */ {\n\n            // Default base for animation\n            opacity: 1,\n            SVG_NS: SVG_NS,\n\n            /**\n             * For labels, these CSS properties are applied to the `text` node directly.\n             * @type {Array.<string>}\n             */\n            textProps: ['direction', 'fontSize', 'fontWeight', 'fontFamily',\n                'fontStyle', 'color', 'lineHeight', 'width', 'textAlign',\n                'textDecoration', 'textOverflow', 'textOutline'\n            ],\n\n            /**\n             * Initialize the SVG renderer. This function only exists to make the\n             * initiation process overridable. It should not be called directly.\n             *\n             * @param  {HighchartsSVGRenderer} renderer\n             *         The SVGRenderer instance to initialize to.\n             * @param  {String} nodeName\n             *         The SVG node name.\n             * @returns {void}\n             */\n            init: function(renderer, nodeName) {\n\n                /** \n                 * The DOM node. Each SVGRenderer instance wraps a main DOM node, but \n                 * may also represent more nodes.\n                 * @type {SVGDOMNode|HTMLDOMNode}\n                 */\n                this.element = nodeName === 'span' ?\n                    createElement(nodeName) :\n                    doc.createElementNS(this.SVG_NS, nodeName);\n\n                /**\n                 * The renderer that the SVGElement belongs to.\n                 * @type {Highcharts.SVGRenderer}\n                 */\n                this.renderer = renderer;\n            },\n\n            /**\n             * Animate to given attributes or CSS properties.\n             * \n             * @param {SVGAttributes} params SVG attributes or CSS to animate.\n             * @param {AnimationOptions} [options] Animation options.\n             * @param {Function} [complete] Function to perform at the end of animation.\n             *\n             * @sample highcharts/members/element-on/\n             *         Setting some attributes by animation\n             * \n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            animate: function(params, options, complete) {\n                var animOptions = H.animObject(\n                    pick(options, this.renderer.globalAnimation, true)\n                );\n                if (animOptions.duration !== 0) {\n                    if (complete) { // allows using a callback with the global animation without overwriting it\n                        animOptions.complete = complete;\n                    }\n                    animate(this, params, animOptions);\n                } else {\n                    this.attr(params, null, complete);\n                    if (animOptions.step) {\n                        animOptions.step.call(this);\n                    }\n                }\n                return this;\n            },\n\n            /**\n             * @typedef {Object} GradientOptions\n             * @property {Object} linearGradient Holds an object that defines the start\n             *    position and the end position relative to the shape.\n             * @property {Number} linearGradient.x1 Start horizontal position of the\n             *    gradient. Ranges 0-1.\n             * @property {Number} linearGradient.x2 End horizontal position of the\n             *    gradient. Ranges 0-1.\n             * @property {Number} linearGradient.y1 Start vertical position of the\n             *    gradient. Ranges 0-1.\n             * @property {Number} linearGradient.y2 End vertical position of the\n             *    gradient. Ranges 0-1.\n             * @property {Object} radialGradient Holds an object that defines the center\n             *    position and the radius.\n             * @property {Number} radialGradient.cx Center horizontal position relative\n             *    to the shape. Ranges 0-1.\n             * @property {Number} radialGradient.cy Center vertical position relative\n             *    to the shape. Ranges 0-1.\n             * @property {Number} radialGradient.r Radius relative to the shape. Ranges\n             *    0-1.\n             * @property {Array.<Array>} stops The first item in each tuple is the\n             *    position in the gradient, where 0 is the start of the gradient and 1\n             *    is the end of the gradient. Multiple stops can be applied. The second\n             *    item is the color for each stop. This color can also be given in the\n             *    rgba format.\n             *\n             * @example\n             * // Linear gradient used as a color option\n             * color: {\n             *     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n             *         stops: [\n             *             [0, '#003399'], // start\n             *             [0.5, '#ffffff'], // middle\n             *             [1, '#3366AA'] // end\n             *         ]\n             *     }\n             * }\n             */\n            /**\n             * Build and apply an SVG gradient out of a common JavaScript configuration\n             * object. This function is called from the attribute setters.\n             *\n             * @private\n             * @param {GradientOptions} color The gradient options structure.\n             * @param {string} prop The property to apply, can either be `fill` or\n             * `stroke`. \n             * @param {SVGDOMElement} elem SVG DOM element to apply the gradient on.\n             */\n            colorGradient: function(color, prop, elem) {\n                var renderer = this.renderer,\n                    colorObject,\n                    gradName,\n                    gradAttr,\n                    radAttr,\n                    gradients,\n                    gradientObject,\n                    stops,\n                    stopColor,\n                    stopOpacity,\n                    radialReference,\n                    id,\n                    key = [],\n                    value;\n\n                // Apply linear or radial gradients\n                if (color.radialGradient) {\n                    gradName = 'radialGradient';\n                } else if (color.linearGradient) {\n                    gradName = 'linearGradient';\n                }\n\n                if (gradName) {\n                    gradAttr = color[gradName];\n                    gradients = renderer.gradients;\n                    stops = color.stops;\n                    radialReference = elem.radialReference;\n\n                    // Keep < 2.2 kompatibility\n                    if (isArray(gradAttr)) {\n                        color[gradName] = gradAttr = {\n                            x1: gradAttr[0],\n                            y1: gradAttr[1],\n                            x2: gradAttr[2],\n                            y2: gradAttr[3],\n                            gradientUnits: 'userSpaceOnUse'\n                        };\n                    }\n\n                    // Correct the radial gradient for the radial reference system\n                    if (\n                        gradName === 'radialGradient' &&\n                        radialReference &&\n                        !defined(gradAttr.gradientUnits)\n                    ) {\n                        radAttr = gradAttr; // Save the radial attributes for updating\n                        gradAttr = merge(\n                            gradAttr,\n                            renderer.getRadialAttr(radialReference, radAttr), {\n                                gradientUnits: 'userSpaceOnUse'\n                            }\n                        );\n                    }\n\n                    // Build the unique key to detect whether we need to create a new element (#1282)\n                    objectEach(gradAttr, function(val, n) {\n                        if (n !== 'id') {\n                            key.push(n, val);\n                        }\n                    });\n                    objectEach(stops, function(val) {\n                        key.push(val);\n                    });\n                    key = key.join(',');\n\n                    // Check if a gradient object with the same config object is created within this renderer\n                    if (gradients[key]) {\n                        id = gradients[key].attr('id');\n\n                    } else {\n\n                        // Set the id and create the element\n                        gradAttr.id = id = H.uniqueKey();\n                        gradients[key] = gradientObject = renderer.createElement(gradName)\n                            .attr(gradAttr)\n                            .add(renderer.defs);\n\n                        gradientObject.radAttr = radAttr;\n\n                        // The gradient needs to keep a list of stops to be able to destroy them\n                        gradientObject.stops = [];\n                        each(stops, function(stop) {\n                            var stopObject;\n                            if (stop[1].indexOf('rgba') === 0) {\n                                colorObject = H.color(stop[1]);\n                                stopColor = colorObject.get('rgb');\n                                stopOpacity = colorObject.get('a');\n                            } else {\n                                stopColor = stop[1];\n                                stopOpacity = 1;\n                            }\n                            stopObject = renderer.createElement('stop').attr({\n                                offset: stop[0],\n                                'stop-color': stopColor,\n                                'stop-opacity': stopOpacity\n                            }).add(gradientObject);\n\n                            // Add the stop element to the gradient\n                            gradientObject.stops.push(stopObject);\n                        });\n                    }\n\n                    // Set the reference to the gradient object\n                    value = 'url(' + renderer.url + '#' + id + ')';\n                    elem.setAttribute(prop, value);\n                    elem.gradient = key;\n\n                    // Allow the color to be concatenated into tooltips formatters etc. (#2995)\n                    color.toString = function() {\n                        return value;\n                    };\n                }\n            },\n\n            /**\n             * Apply a text outline through a custom CSS property, by copying the text\n             * element and apply stroke to the copy. Used internally. Contrast checks\n             * at http://jsfiddle.net/highcharts/43soe9m1/2/ .\n             *\n             * @private\n             * @param {String} textOutline A custom CSS `text-outline` setting, defined\n             *    by `width color`. \n             * @example\n             * // Specific color\n             * text.css({\n             *    textOutline: '1px black'\n             * });\n             * // Automatic contrast\n             * text.css({\n             *    color: '#000000', // black text\n             *    textOutline: '1px contrast' // => white outline\n             * });\n             */\n            applyTextOutline: function(textOutline) {\n                var elem = this.element,\n                    tspans,\n                    tspan,\n                    hasContrast = textOutline.indexOf('contrast') !== -1,\n                    styles = {},\n                    color,\n                    strokeWidth,\n                    firstRealChild,\n                    i;\n\n                // When the text shadow is set to contrast, use dark stroke for light\n                // text and vice versa.\n                if (hasContrast) {\n                    styles.textOutline = textOutline = textOutline.replace(\n                        /contrast/g,\n                        this.renderer.getContrast(elem.style.fill)\n                    );\n                }\n\n                // Extract the stroke width and color\n                textOutline = textOutline.split(' ');\n                color = textOutline[textOutline.length - 1];\n                strokeWidth = textOutline[0];\n\n                if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n\n                    this.fakeTS = true; // Fake text shadow\n\n                    tspans = [].slice.call(elem.getElementsByTagName('tspan'));\n\n                    // In order to get the right y position of the clone,\n                    // copy over the y setter\n                    this.ySetter = this.xSetter;\n\n                    // Since the stroke is applied on center of the actual outline, we\n                    // need to double it to get the correct stroke-width outside the \n                    // glyphs.\n                    strokeWidth = strokeWidth.replace(\n                        /(^[\\d\\.]+)(.*?)$/g,\n                        function(match, digit, unit) {\n                            return (2 * digit) + unit;\n                        }\n                    );\n\n                    // Remove shadows from previous runs. Iterate from the end to\n                    // support removing items inside the cycle (#6472).\n                    i = tspans.length;\n                    while (i--) {\n                        tspan = tspans[i];\n                        if (tspan.getAttribute('class') === 'highcharts-text-outline') {\n                            // Remove then erase\n                            erase(tspans, elem.removeChild(tspan));\n                        }\n                    }\n\n                    // For each of the tspans, create a stroked copy behind it.\n                    firstRealChild = elem.firstChild;\n                    each(tspans, function(tspan, y) {\n                        var clone;\n\n                        // Let the first line start at the correct X position\n                        if (y === 0) {\n                            tspan.setAttribute('x', elem.getAttribute('x'));\n                            y = elem.getAttribute('y');\n                            tspan.setAttribute('y', y || 0);\n                            if (y === null) {\n                                elem.setAttribute('y', 0);\n                            }\n                        }\n\n                        // Create the clone and apply outline properties\n                        clone = tspan.cloneNode(1);\n                        attr(clone, {\n                            'class': 'highcharts-text-outline',\n                            'fill': color,\n                            'stroke': color,\n                            'stroke-width': strokeWidth,\n                            'stroke-linejoin': 'round'\n                        });\n                        elem.insertBefore(clone, firstRealChild);\n                    });\n                }\n            },\n\n            /**\n             *\n             * @typedef {Object} SVGAttributes An object of key-value pairs for SVG\n             *   attributes. Attributes in Highcharts elements for the most parts\n             *   correspond to SVG, but some are specific to Highcharts, like `zIndex`,\n             *   `rotation`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n             *   attributes containing a hyphen are _not_ camel-cased, they should be\n             *   quoted to preserve the hyphen.\n             * @example\n             * {\n             *     'stroke': '#ff0000', // basic\n             *     'stroke-width': 2, // hyphenated\n             *     'rotation': 45 // custom\n             *     'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n             * }\n             */\n            /**\n             * Apply native and custom attributes to the SVG elements.\n             * \n             * In order to set the rotation center for rotation, set x and y to 0 and\n             * use `translateX` and `translateY` attributes to position the element\n             * instead.\n             *\n             * Attributes frequently used in Highcharts are `fill`, `stroke`,\n             * `stroke-width`.\n             *\n             * @param {SVGAttributes|String} hash - The native and custom SVG\n             *    attributes. \n             * @param {string} [val] - If the type of the first argument is `string`, \n             *    the second can be a value, which will serve as a single attribute\n             *    setter. If the first argument is a string and the second is undefined,\n             *    the function serves as a getter and the current value of the property\n             *    is returned.\n             * @param {Function} [complete] - A callback function to execute after setting\n             *    the attributes. This makes the function compliant and interchangeable\n             *    with the {@link SVGElement#animate} function.\n             * @param {boolean} [continueAnimation=true] Used internally when `.attr` is\n             *    called as part of an animation step. Otherwise, calling `.attr` for an\n             *    attribute will stop animation for that attribute.\n             *    \n             * @returns {SVGElement|string|number} If used as a setter, it returns the \n             *    current {@link SVGElement} so the calls can be chained. If used as a \n             *    getter, the current value of the attribute is returned.\n             *\n             * @sample highcharts/members/renderer-rect/\n             *         Setting some attributes\n             * \n             * @example\n             * // Set multiple attributes\n             * element.attr({\n             *     stroke: 'red',\n             *     fill: 'blue',\n             *     x: 10,\n             *     y: 10\n             * });\n             *\n             * // Set a single attribute\n             * element.attr('stroke', 'red');\n             *\n             * // Get an attribute\n             * element.attr('stroke'); // => 'red'\n             * \n             */\n            attr: function(hash, val, complete, continueAnimation) {\n                var key,\n                    element = this.element,\n                    hasSetSymbolSize,\n                    ret = this,\n                    skipAttr,\n                    setter;\n\n                // single key-value pair\n                if (typeof hash === 'string' && val !== undefined) {\n                    key = hash;\n                    hash = {};\n                    hash[key] = val;\n                }\n\n                // used as a getter: first argument is a string, second is undefined\n                if (typeof hash === 'string') {\n                    ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);\n\n                    // setter\n                } else {\n\n                    objectEach(hash, function(val, key) {\n                        skipAttr = false;\n\n                        // Unless .attr is from the animator update, stop current\n                        // running animation of this property\n                        if (!continueAnimation) {\n                            stop(this, key);\n                        }\n\n                        // Special handling of symbol attributes\n                        if (\n                            this.symbolName &&\n                            /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/\n                            .test(key)\n                        ) {\n                            if (!hasSetSymbolSize) {\n                                this.symbolAttr(hash);\n                                hasSetSymbolSize = true;\n                            }\n                            skipAttr = true;\n                        }\n\n                        if (this.rotation && (key === 'x' || key === 'y')) {\n                            this.doTransform = true;\n                        }\n\n                        if (!skipAttr) {\n                            setter = this[key + 'Setter'] || this._defaultSetter;\n                            setter.call(this, val, key, element);\n\n\n                            // Let the shadow follow the main element\n                            if (this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\n                                this.updateShadows(key, val, setter);\n                            }\n\n                        }\n                    }, this);\n\n                    this.afterSetters();\n                }\n\n                // In accordance with animate, run a complete callback\n                if (complete) {\n                    complete();\n                }\n\n                return ret;\n            },\n\n            /**\n             * This method is executed in the end of {attr}, after setting all attributes in the hash.\n             * In can be used to efficiently consolidate multiple attributes in one SVG property -- e.g.,\n             * translate, rotate and scale are merged in one \"transform\" attribute in the SVG node.\n             */\n            afterSetters: function() {\n                // Update transform. Do this outside the loop to prevent redundant updating for batch setting\n                // of attributes.\n                if (this.doTransform) {\n                    this.updateTransform();\n                    this.doTransform = false;\n                }\n            },\n\n\n            /**\n             * Update the shadow elements with new attributes.\n             *\n             * @private\n             * @param {String} key - The attribute name.\n             * @param {String|Number} value - The value of the attribute.\n             * @param {Function} setter - The setter function, inherited from the\n             *   parent wrapper\n             * @returns {void}\n             */\n            updateShadows: function(key, value, setter) {\n                var shadows = this.shadows,\n                    i = shadows.length;\n\n                while (i--) {\n                    setter.call(\n                        shadows[i],\n                        key === 'height' ?\n                        Math.max(value - (shadows[i].cutHeight || 0), 0) :\n                        key === 'd' ? this.d : value,\n                        key,\n                        shadows[i]\n                    );\n                }\n            },\n\n\n            /**\n             * Add a class name to an element.\n             *\n             * @param {string} className - The new class name to add.\n             * @param {boolean} [replace=false] - When true, the existing class name(s)\n             *    will be overwritten with the new one. When false, the new one is\n             *    added.\n             * @returns {Highcharts.SVGElement} Return the SVG element for chainability.\n             */\n            addClass: function(className, replace) {\n                var currentClassName = this.attr('class') || '';\n\n                if (currentClassName.indexOf(className) === -1) {\n                    if (!replace) {\n                        className =\n                            (currentClassName + (currentClassName ? ' ' : '') +\n                                className).replace('  ', ' ');\n                    }\n                    this.attr('class', className);\n                }\n                return this;\n            },\n\n            /**\n             * Check if an element has the given class name.\n             * @param  {string}  className - The class name to check for.\n             * @return {Boolean}\n             */\n            hasClass: function(className) {\n                return attr(this.element, 'class').indexOf(className) !== -1;\n            },\n\n            /**\n             * Remove a class name from the element.\n             * @param  {string} className The class name to remove.\n             * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n             */\n            removeClass: function(className) {\n                attr(this.element, 'class', (attr(this.element, 'class') || '').replace(className, ''));\n                return this;\n            },\n\n            /**\n             * If one of the symbol size affecting parameters are changed,\n             * check all the others only once for each call to an element's\n             * .attr() method\n             * @param {Object} hash - The attributes to set.\n             * @private\n             */\n            symbolAttr: function(hash) {\n                var wrapper = this;\n\n                each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function(key) {\n                    wrapper[key] = pick(hash[key], wrapper[key]);\n                });\n\n                wrapper.attr({\n                    d: wrapper.renderer.symbols[wrapper.symbolName](\n                        wrapper.x,\n                        wrapper.y,\n                        wrapper.width,\n                        wrapper.height,\n                        wrapper\n                    )\n                });\n            },\n\n            /**\n             * Apply a clipping rectangle to this element.\n             * \n             * @param {ClipRect} [clipRect] - The clipping rectangle. If skipped, the\n             *    current clip is removed.\n             * @returns {Highcharts.SVGElement} Returns the SVG element to allow chaining.\n             */\n            clip: function(clipRect) {\n                return this.attr(\n                    'clip-path',\n                    clipRect ?\n                    'url(' + this.renderer.url + '#' + clipRect.id + ')' :\n                    'none'\n                );\n            },\n\n            /**\n             * Calculate the coordinates needed for drawing a rectangle crisply and\n             * return the calculated attributes.\n             * \n             * @param {Object} rect - A rectangle.\n             * @param {number} rect.x - The x position.\n             * @param {number} rect.y - The y position.\n             * @param {number} rect.width - The width.\n             * @param {number} rect.height - The height.\n             * @param {number} [strokeWidth] - The stroke width to consider when\n             *    computing crisp positioning. It can also be set directly on the rect\n             *    parameter.\n             *\n             * @returns {{x: Number, y: Number, width: Number, height: Number}} The\n             *    modified rectangle arguments.\n             */\n            crisp: function(rect, strokeWidth) {\n\n                var wrapper = this,\n                    attribs = {},\n                    normalizer;\n\n                strokeWidth = strokeWidth || rect.strokeWidth || 0;\n                normalizer = Math.round(strokeWidth) % 2 / 2; // Math.round because strokeWidth can sometimes have roundoff errors\n\n                // normalize for crisp edges\n                rect.x = Math.floor(rect.x || wrapper.x || 0) + normalizer;\n                rect.y = Math.floor(rect.y || wrapper.y || 0) + normalizer;\n                rect.width = Math.floor((rect.width || wrapper.width || 0) - 2 * normalizer);\n                rect.height = Math.floor((rect.height || wrapper.height || 0) - 2 * normalizer);\n                if (defined(rect.strokeWidth)) {\n                    rect.strokeWidth = strokeWidth;\n                }\n\n                objectEach(rect, function(val, key) {\n                    if (wrapper[key] !== val) { // only set attribute if changed\n                        wrapper[key] = attribs[key] = val;\n                    }\n                });\n\n                return attribs;\n            },\n\n            /**\n             * Set styles for the element. In addition to CSS styles supported by \n             * native SVG and HTML elements, there are also some custom made for \n             * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n             * elements.\n             * @param {CSSObject} styles The new CSS styles.\n             * @returns {Highcharts.SVGElement} Return the SVG element for chaining.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Styled text\n             */\n            css: function(styles) {\n                var oldStyles = this.styles,\n                    newStyles = {},\n                    elem = this.element,\n                    textWidth,\n                    serializedCss = '',\n                    hyphenate,\n                    hasNew = !oldStyles,\n                    // These CSS properties are interpreted internally by the SVG\n                    // renderer, but are not supported by SVG and should not be added to\n                    // the DOM. In styled mode, no CSS should find its way to the DOM\n                    // whatsoever (#6173, #6474).\n                    svgPseudoProps = ['textOutline', 'textOverflow', 'width'];\n\n                // convert legacy\n                if (styles && styles.color) {\n                    styles.fill = styles.color;\n                }\n\n                // Filter out existing styles to increase performance (#2640)\n                if (oldStyles) {\n                    objectEach(styles, function(style, n) {\n                        if (style !== oldStyles[n]) {\n                            newStyles[n] = style;\n                            hasNew = true;\n                        }\n                    });\n                }\n                if (hasNew) {\n\n                    // Merge the new styles with the old ones\n                    if (oldStyles) {\n                        styles = extend(\n                            oldStyles,\n                            newStyles\n                        );\n                    }\n\n                    // Get the text width from style\n                    textWidth = this.textWidth = (\n                        styles &&\n                        styles.width &&\n                        styles.width !== 'auto' &&\n                        elem.nodeName.toLowerCase() === 'text' &&\n                        pInt(styles.width)\n                    );\n\n                    // store object\n                    this.styles = styles;\n\n                    if (textWidth && (!svg && this.renderer.forExport)) {\n                        delete styles.width;\n                    }\n\n                    // serialize and set style attribute\n                    if (isMS && !svg) {\n                        css(this.element, styles);\n                    } else {\n                        hyphenate = function(a, b) {\n                            return '-' + b.toLowerCase();\n                        };\n                        objectEach(styles, function(style, n) {\n                            if (inArray(n, svgPseudoProps) === -1) {\n                                serializedCss +=\n                                    n.replace(/([A-Z])/g, hyphenate) + ':' +\n                                    style + ';';\n                            }\n                        });\n                        if (serializedCss) {\n                            attr(elem, 'style', serializedCss); // #1881\n                        }\n                    }\n\n\n                    if (this.added) {\n\n                        // Rebuild text after added. Cache mechanisms in the buildText\n                        // will prevent building if there are no significant changes.\n                        if (this.element.nodeName === 'text') {\n                            this.renderer.buildText(this);\n                        }\n\n                        // Apply text outline after added\n                        if (styles && styles.textOutline) {\n                            this.applyTextOutline(styles.textOutline);\n                        }\n                    }\n                }\n\n                return this;\n            },\n\n\n            /**\n             * Get the current stroke width. In classic mode, the setter registers it \n             * directly on the element.\n             * @returns {number} The stroke width in pixels.\n             * @ignore\n             */\n            strokeWidth: function() {\n                return this['stroke-width'] || 0;\n            },\n\n\n            /**\n             * Add an event listener. This is a simple setter that replaces all other\n             * events of the same type, opposed to the {@link Highcharts#addEvent}\n             * function.\n             * @param {string} eventType - The event type. If the type is `click`, \n             *    Highcharts will internally translate it to a `touchstart` event on \n             *    touch devices, to prevent the browser from waiting for a click event\n             *    from firing.\n             * @param {Function} handler - The handler callback.\n             * @returns {Highcharts.SVGElement} The SVGElement for chaining.\n             *\n             * @sample highcharts/members/element-on/\n             *         A clickable rectangle\n             */\n            on: function(eventType, handler) {\n                var svgElement = this,\n                    element = svgElement.element;\n\n                // touch\n                if (hasTouch && eventType === 'click') {\n                    element.ontouchstart = function(e) {\n                        svgElement.touchEventFired = Date.now(); // #2269\n                        e.preventDefault();\n                        handler.call(element, e);\n                    };\n                    element.onclick = function(e) {\n                        if (win.navigator.userAgent.indexOf('Android') === -1 ||\n                            Date.now() - (svgElement.touchEventFired || 0) > 1100) {\n                            handler.call(element, e);\n                        }\n                    };\n                } else {\n                    // simplest possible event model for internal use\n                    element['on' + eventType] = handler;\n                }\n                return this;\n            },\n\n            /**\n             * Set the coordinates needed to draw a consistent radial gradient across\n             * a shape regardless of positioning inside the chart. Used on pie slices\n             * to make all the slices have the same radial reference point.\n             *\n             * @param {Array} coordinates The center reference. The format is\n             *    `[centerX, centerY, diameter]` in pixels.\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            setRadialReference: function(coordinates) {\n                var existingGradient = this.renderer.gradients[this.element.gradient];\n\n                this.element.radialReference = coordinates;\n\n                // On redrawing objects with an existing gradient, the gradient needs\n                // to be repositioned (#3801)\n                if (existingGradient && existingGradient.radAttr) {\n                    existingGradient.animate(\n                        this.renderer.getRadialAttr(\n                            coordinates,\n                            existingGradient.radAttr\n                        )\n                    );\n                }\n\n                return this;\n            },\n\n            /**\n             * Move an object and its children by x and y values.\n             * \n             * @param {number} x - The x value.\n             * @param {number} y - The y value.\n             */\n            translate: function(x, y) {\n                return this.attr({\n                    translateX: x,\n                    translateY: y\n                });\n            },\n\n            /**\n             * Invert a group, rotate and flip. This is used internally on inverted \n             * charts, where the points and graphs are drawn as if not inverted, then\n             * the series group elements are inverted.\n             *\n             * @param {boolean} inverted - Whether to invert or not. An inverted shape\n             *    can be un-inverted by setting it to false.\n             * @returns {Highcharts.SVGElement} Return the SVGElement for chaining.\n             */\n            invert: function(inverted) {\n                var wrapper = this;\n                wrapper.inverted = inverted;\n                wrapper.updateTransform();\n                return wrapper;\n            },\n\n            /**\n             * Update the transform attribute based on internal properties. Deals with\n             * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n             * attributes and updates the SVG `transform` attribute.\n             * @private\n             * @returns {void}\n             */\n            updateTransform: function() {\n                var wrapper = this,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    scaleX = wrapper.scaleX,\n                    scaleY = wrapper.scaleY,\n                    inverted = wrapper.inverted,\n                    rotation = wrapper.rotation,\n                    element = wrapper.element,\n                    transform;\n\n                // flipping affects translate as adjustment for flipping around the group's axis\n                if (inverted) {\n                    translateX += wrapper.width;\n                    translateY += wrapper.height;\n                }\n\n                // Apply translate. Nearly all transformed elements have translation, so instead\n                // of checking for translate = 0, do it always (#1767, #1846).\n                transform = ['translate(' + translateX + ',' + translateY + ')'];\n\n                // apply rotation\n                if (inverted) {\n                    transform.push('rotate(90) scale(-1,1)');\n                } else if (rotation) { // text rotation\n                    transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');\n\n                    // Delete bBox memo when the rotation changes\n                    //delete wrapper.bBox;\n                }\n\n                // apply scale\n                if (defined(scaleX) || defined(scaleY)) {\n                    transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n                }\n\n                if (transform.length) {\n                    element.setAttribute('transform', transform.join(' '));\n                }\n            },\n\n            /**\n             * Bring the element to the front. Alternatively, a new zIndex can be set.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             *\n             * @sample highcharts/members/element-tofront/\n             *         Click an element to bring it to front\n             */\n            toFront: function() {\n                var element = this.element;\n                element.parentNode.appendChild(element);\n                return this;\n            },\n\n\n            /**\n             * Align the element relative to the chart or another box.\n             * \n             * @param {Object} [alignOptions] The alignment options. The function can be\n             *   called without this parameter in order to re-align an element after the\n             *   box has been updated.\n             * @param {string} [alignOptions.align=left] Horizontal alignment. Can be\n             *   one of `left`, `center` and `right`.\n             * @param {string} [alignOptions.verticalAlign=top] Vertical alignment. Can\n             *   be one of `top`, `middle` and `bottom`.\n             * @param {number} [alignOptions.x=0] Horizontal pixel offset from\n             *   alignment.\n             * @param {number} [alignOptions.y=0] Vertical pixel offset from alignment.\n             * @param {Boolean} [alignByTranslate=false] Use the `transform` attribute\n             *   with translateX and translateY custom attributes to align this elements\n             *   rather than `x` and `y` attributes.\n             * @param {String|Object} box The box to align to, needs a width and height.\n             *   When the box is a string, it refers to an object in the Renderer. For\n             *   example, when box is `spacingBox`, it refers to `Renderer.spacingBox`\n             *   which holds `width`, `height`, `x` and `y` properties.\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            align: function(alignOptions, alignByTranslate, box) {\n                var align,\n                    vAlign,\n                    x,\n                    y,\n                    attribs = {},\n                    alignTo,\n                    renderer = this.renderer,\n                    alignedObjects = renderer.alignedObjects,\n                    alignFactor,\n                    vAlignFactor;\n\n                // First call on instanciate\n                if (alignOptions) {\n                    this.alignOptions = alignOptions;\n                    this.alignByTranslate = alignByTranslate;\n                    if (!box || isString(box)) { // boxes other than renderer handle this internally\n                        this.alignTo = alignTo = box || 'renderer';\n                        erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize\n                        alignedObjects.push(this);\n                        box = null; // reassign it below\n                    }\n\n                    // When called on resize, no arguments are supplied\n                } else {\n                    alignOptions = this.alignOptions;\n                    alignByTranslate = this.alignByTranslate;\n                    alignTo = this.alignTo;\n                }\n\n                box = pick(box, renderer[alignTo], renderer);\n\n                // Assign variables\n                align = alignOptions.align;\n                vAlign = alignOptions.verticalAlign;\n                x = (box.x || 0) + (alignOptions.x || 0); // default: left align\n                y = (box.y || 0) + (alignOptions.y || 0); // default: top align\n\n                // Align\n                if (align === 'right') {\n                    alignFactor = 1;\n                } else if (align === 'center') {\n                    alignFactor = 2;\n                }\n                if (alignFactor) {\n                    x += (box.width - (alignOptions.width || 0)) / alignFactor;\n                }\n                attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n\n\n                // Vertical align\n                if (vAlign === 'bottom') {\n                    vAlignFactor = 1;\n                } else if (vAlign === 'middle') {\n                    vAlignFactor = 2;\n                }\n                if (vAlignFactor) {\n                    y += (box.height - (alignOptions.height || 0)) / vAlignFactor;\n                }\n                attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n\n                // Animate only if already placed\n                this[this.placed ? 'animate' : 'attr'](attribs);\n                this.placed = true;\n                this.alignAttr = attribs;\n\n                return this;\n            },\n\n            /**\n             * Get the bounding box (width, height, x and y) for the element. Generally\n             * used to get rendered text size. Since this is called a lot in charts,\n             * the results are cached based on text properties, in order to save DOM\n             * traffic. The returned bounding box includes the rotation, so for example\n             * a single text line of rotation 90 will report a greater height, and a\n             * width corresponding to the line-height.\n             *\n             * @param {boolean} [reload] Skip the cache and get the updated DOM bouding\n             *   box.\n             * @param {number} [rot] Override the element's rotation. This is internally\n             *   used on axis labels with a value of 0 to find out what the bounding box\n             *   would be have been if it were not rotated.\n             * @returns {Object} The bounding box with `x`, `y`, `width` and `height`\n             * properties.\n             *\n             * @sample highcharts/members/renderer-on-chart/\n             *         Draw a rectangle based on a text's bounding box\n             */\n            getBBox: function(reload, rot) {\n                var wrapper = this,\n                    bBox, // = wrapper.bBox,\n                    renderer = wrapper.renderer,\n                    width,\n                    height,\n                    rotation,\n                    rad,\n                    element = wrapper.element,\n                    styles = wrapper.styles,\n                    fontSize,\n                    textStr = wrapper.textStr,\n                    toggleTextShadowShim,\n                    cache = renderer.cache,\n                    cacheKeys = renderer.cacheKeys,\n                    cacheKey;\n\n                rotation = pick(rot, wrapper.rotation);\n                rad = rotation * deg2rad;\n\n\n                fontSize = styles && styles.fontSize;\n\n\n                if (textStr !== undefined) {\n\n                    cacheKey = textStr.toString();\n\n                    // Since numbers are monospaced, and numerical labels appear a lot\n                    // in a chart, we assume that a label of n characters has the same\n                    // bounding box as others of the same length. Unless there is inner\n                    // HTML in the label. In that case, leave the numbers as is (#5899).\n                    if (cacheKey.indexOf('<') === -1) {\n                        cacheKey = cacheKey.replace(/[0-9]/g, '0');\n                    }\n\n                    // Properties that affect bounding box\n                    cacheKey += [\n                            '',\n                            rotation || 0,\n                            fontSize,\n                            styles && styles.width,\n                            styles && styles.textOverflow // #5968\n                        ]\n                        .join(',');\n\n                }\n\n                if (cacheKey && !reload) {\n                    bBox = cache[cacheKey];\n                }\n\n                // No cache found\n                if (!bBox) {\n\n                    // SVG elements\n                    if (element.namespaceURI === wrapper.SVG_NS || renderer.forExport) {\n                        try { // Fails in Firefox if the container has display: none.\n\n                            // When the text shadow shim is used, we need to hide the fake shadows\n                            // to get the correct bounding box (#3872)\n                            toggleTextShadowShim = this.fakeTS && function(display) {\n                                each(element.querySelectorAll('.highcharts-text-outline'), function(tspan) {\n                                    tspan.style.display = display;\n                                });\n                            };\n\n                            // Workaround for #3842, Firefox reporting wrong bounding box for shadows\n                            if (toggleTextShadowShim) {\n                                toggleTextShadowShim('none');\n                            }\n\n                            bBox = element.getBBox ?\n                                // SVG: use extend because IE9 is not allowed to change width and height in case\n                                // of rotation (below)\n                                extend({}, element.getBBox()) : {\n\n                                    // Legacy IE in export mode\n                                    width: element.offsetWidth,\n                                    height: element.offsetHeight\n                                };\n\n                            // #3842\n                            if (toggleTextShadowShim) {\n                                toggleTextShadowShim('');\n                            }\n                        } catch (e) {}\n\n                        // If the bBox is not set, the try-catch block above failed. The other condition\n                        // is for Opera that returns a width of -Infinity on hidden elements.\n                        if (!bBox || bBox.width < 0) {\n                            bBox = {\n                                width: 0,\n                                height: 0\n                            };\n                        }\n\n\n                        // VML Renderer or useHTML within SVG\n                    } else {\n\n                        bBox = wrapper.htmlGetBBox();\n\n                    }\n\n                    // True SVG elements as well as HTML elements in modern browsers using the .useHTML option\n                    // need to compensated for rotation\n                    if (renderer.isSVG) {\n                        width = bBox.width;\n                        height = bBox.height;\n\n                        // Workaround for wrong bounding box in IE, Edge and Chrome on\n                        // Windows. With Highcharts' default font, IE and Edge report\n                        // a box height of 16.899 and Chrome rounds it to 17. If this \n                        // stands uncorrected, it results in more padding added below\n                        // the text than above when adding a label border or background.\n                        // Also vertical positioning is affected.\n                        // http://jsfiddle.net/highcharts/em37nvuj/\n                        // (#1101, #1505, #1669, #2568, #6213).\n                        if (\n                            styles &&\n                            styles.fontSize === '11px' &&\n                            Math.round(height) === 17\n                        ) {\n                            bBox.height = height = 14;\n                        }\n\n                        // Adjust for rotated text\n                        if (rotation) {\n                            bBox.width = Math.abs(height * Math.sin(rad)) + Math.abs(width * Math.cos(rad));\n                            bBox.height = Math.abs(height * Math.cos(rad)) + Math.abs(width * Math.sin(rad));\n                        }\n                    }\n\n                    // Cache it. When loading a chart in a hidden iframe in Firefox and IE/Edge, the\n                    // bounding box height is 0, so don't cache it (#5620).\n                    if (cacheKey && bBox.height > 0) {\n\n                        // Rotate (#4681)\n                        while (cacheKeys.length > 250) {\n                            delete cache[cacheKeys.shift()];\n                        }\n\n                        if (!cache[cacheKey]) {\n                            cacheKeys.push(cacheKey);\n                        }\n                        cache[cacheKey] = bBox;\n                    }\n                }\n                return bBox;\n            },\n\n            /**\n             * Show the element after it has been hidden. \n             *\n             * @param {boolean} [inherit=false] Set the visibility attribute to\n             * `inherit` rather than `visible`. The difference is that an element with\n             * `visibility=\"visible\"` will be visible even if the parent is hidden.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            show: function(inherit) {\n                return this.attr({\n                    visibility: inherit ? 'inherit' : 'visible'\n                });\n            },\n\n            /**\n             * Hide the element, equivalent to setting the `visibility` attribute to\n             * `hidden`.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            hide: function() {\n                return this.attr({\n                    visibility: 'hidden'\n                });\n            },\n\n            /**\n             * Fade out an element by animating its opacity down to 0, and hide it on\n             * complete. Used internally for the tooltip.\n             * \n             * @param {number} [duration=150] The fade duration in milliseconds.\n             */\n            fadeOut: function(duration) {\n                var elemWrapper = this;\n                elemWrapper.animate({\n                    opacity: 0\n                }, {\n                    duration: duration || 150,\n                    complete: function() {\n                        elemWrapper.attr({\n                            y: -9999\n                        }); // #3088, assuming we're only using this for tooltips\n                    }\n                });\n            },\n\n            /**\n             * Add the element to the DOM. All elements must be added this way.\n             * \n             * @param {Highcharts.SVGElement|SVGDOMElement} [parent] The parent item to add it to.\n             *   If undefined, the element is added to the {@link\n             *   Highcharts.SVGRenderer.box}.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             *\n             * @sample highcharts/members/renderer-g - Elements added to a group\n             */\n            add: function(parent) {\n\n                var renderer = this.renderer,\n                    element = this.element,\n                    inserted;\n\n                if (parent) {\n                    this.parentGroup = parent;\n                }\n\n                // mark as inverted\n                this.parentInverted = parent && parent.inverted;\n\n                // build formatted text\n                if (this.textStr !== undefined) {\n                    renderer.buildText(this);\n                }\n\n                // Mark as added\n                this.added = true;\n\n                // If we're adding to renderer root, or other elements in the group\n                // have a z index, we need to handle it\n                if (!parent || parent.handleZ || this.zIndex) {\n                    inserted = this.zIndexSetter();\n                }\n\n                // If zIndex is not handled, append at the end\n                if (!inserted) {\n                    (parent ? parent.element : renderer.box).appendChild(element);\n                }\n\n                // fire an event for internal hooks\n                if (this.onAdd) {\n                    this.onAdd();\n                }\n\n                return this;\n            },\n\n            /**\n             * Removes an element from the DOM.\n             *\n             * @private\n             * @param {SVGDOMElement|HTMLDOMElement} element The DOM node to remove.\n             */\n            safeRemoveChild: function(element) {\n                var parentNode = element.parentNode;\n                if (parentNode) {\n                    parentNode.removeChild(element);\n                }\n            },\n\n            /**\n             * Destroy the element and element wrapper and clear up the DOM and event\n             * hooks.\n             *\n             * @returns {void}\n             */\n            destroy: function() {\n                var wrapper = this,\n                    element = wrapper.element || {},\n                    parentToClean =\n                    wrapper.renderer.isSVG &&\n                    element.nodeName === 'SPAN' &&\n                    wrapper.parentGroup,\n                    grandParent,\n                    ownerSVGElement = element.ownerSVGElement,\n                    i;\n\n                // remove events\n                element.onclick = element.onmouseout = element.onmouseover =\n                    element.onmousemove = element.point = null;\n                stop(wrapper); // stop running animations\n\n                if (wrapper.clipPath && ownerSVGElement) {\n                    // Look for existing references to this clipPath and remove them\n                    // before destroying the element (#6196).\n                    each(\n                        ownerSVGElement.querySelectorAll('[clip-path]'),\n                        function(el) {\n                            // Include the closing paranthesis in the test to rule out\n                            // id's from 10 and above (#6550)\n                            if (el.getAttribute('clip-path')\n                                .indexOf(wrapper.clipPath.element.id + ')') > -1) {\n                                el.removeAttribute('clip-path');\n                            }\n                        }\n                    );\n                    wrapper.clipPath = wrapper.clipPath.destroy();\n                }\n\n                // Destroy stops in case this is a gradient object\n                if (wrapper.stops) {\n                    for (i = 0; i < wrapper.stops.length; i++) {\n                        wrapper.stops[i] = wrapper.stops[i].destroy();\n                    }\n                    wrapper.stops = null;\n                }\n\n                // remove element\n                wrapper.safeRemoveChild(element);\n\n\n                wrapper.destroyShadows();\n\n\n                // In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393, #2697).\n                while (parentToClean && parentToClean.div && parentToClean.div.childNodes.length === 0) {\n                    grandParent = parentToClean.parentGroup;\n                    wrapper.safeRemoveChild(parentToClean.div);\n                    delete parentToClean.div;\n                    parentToClean = grandParent;\n                }\n\n                // remove from alignObjects\n                if (wrapper.alignTo) {\n                    erase(wrapper.renderer.alignedObjects, wrapper);\n                }\n\n                objectEach(wrapper, function(val, key) {\n                    delete wrapper[key];\n                });\n\n                return null;\n            },\n\n\n            /**\n             * @typedef {Object} ShadowOptions\n             * @property {string} [color=#000000] The shadow color.\n             * @property {number} [offsetX=1] The horizontal offset from the element.\n             * @property {number} [offsetY=1] The vertical offset from the element.\n             * @property {number} [opacity=0.15] The shadow opacity.\n             * @property {number} [width=3] The shadow width or distance from the\n             *    element.\n             */\n            /**\n             * Add a shadow to the element. Must be called after the element is added to\n             * the DOM. In styled mode, this method is not used, instead use `defs` and\n             * filters.\n             * \n             * @param {boolean|ShadowOptions} shadowOptions The shadow options. If\n             *    `true`, the default options are applied. If `false`, the current\n             *    shadow will be removed.\n             * @param {Highcharts.SVGElement} [group] The SVG group element where the shadows will \n             *    be applied. The default is to add it to the same parent as the current\n             *    element. Internally, this is ised for pie slices, where all the\n             *    shadows are added to an element behind all the slices.\n             * @param {boolean} [cutOff] Used internally for column shadows.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             *\n             * @example\n             * renderer.rect(10, 100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .shadow(true);\n             */\n            shadow: function(shadowOptions, group, cutOff) {\n                var shadows = [],\n                    i,\n                    shadow,\n                    element = this.element,\n                    strokeWidth,\n                    shadowWidth,\n                    shadowElementOpacity,\n\n                    // compensate for inverted plot area\n                    transform;\n\n                if (!shadowOptions) {\n                    this.destroyShadows();\n\n                } else if (!this.shadows) {\n                    shadowWidth = pick(shadowOptions.width, 3);\n                    shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n                    transform = this.parentInverted ?\n                        '(-1,-1)' :\n                        '(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';\n                    for (i = 1; i <= shadowWidth; i++) {\n                        shadow = element.cloneNode(0);\n                        strokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n                        attr(shadow, {\n                            'isShadow': 'true',\n                            'stroke': shadowOptions.color || '#000000',\n                            'stroke-opacity': shadowElementOpacity * i,\n                            'stroke-width': strokeWidth,\n                            'transform': 'translate' + transform,\n                            'fill': 'none'\n                        });\n                        if (cutOff) {\n                            attr(shadow, 'height', Math.max(attr(shadow, 'height') - strokeWidth, 0));\n                            shadow.cutHeight = strokeWidth;\n                        }\n\n                        if (group) {\n                            group.element.appendChild(shadow);\n                        } else {\n                            element.parentNode.insertBefore(shadow, element);\n                        }\n\n                        shadows.push(shadow);\n                    }\n\n                    this.shadows = shadows;\n                }\n                return this;\n\n            },\n\n            /**\n             * Destroy shadows on the element.\n             * @private\n             */\n            destroyShadows: function() {\n                each(this.shadows || [], function(shadow) {\n                    this.safeRemoveChild(shadow);\n                }, this);\n                this.shadows = undefined;\n            },\n\n\n\n            xGetter: function(key) {\n                if (this.element.nodeName === 'circle') {\n                    if (key === 'x') {\n                        key = 'cx';\n                    } else if (key === 'y') {\n                        key = 'cy';\n                    }\n                }\n                return this._defaultGetter(key);\n            },\n\n            /**\n             * Get the current value of an attribute or pseudo attribute, used mainly\n             * for animation. Called internally from the {@link\n             * Highcharts.SVGRenderer#attr}\n             * function.\n             *\n             * @private\n             */\n            _defaultGetter: function(key) {\n                var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);\n\n                if (/^[\\-0-9\\.]+$/.test(ret)) { // is numerical\n                    ret = parseFloat(ret);\n                }\n                return ret;\n            },\n\n\n            dSetter: function(value, key, element) {\n                if (value && value.join) { // join path\n                    value = value.join(' ');\n                }\n                if (/(NaN| {2}|^$)/.test(value)) {\n                    value = 'M 0 0';\n                }\n                element.setAttribute(key, value);\n\n                this[key] = value;\n            },\n\n            dashstyleSetter: function(value) {\n                var i,\n                    strokeWidth = this['stroke-width'];\n\n                // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new strokeWidth \n                // function, we should be able to use that instead.\n                if (strokeWidth === 'inherit') {\n                    strokeWidth = 1;\n                }\n                value = value && value.toLowerCase();\n                if (value) {\n                    value = value\n                        .replace('shortdashdotdot', '3,1,1,1,1,1,')\n                        .replace('shortdashdot', '3,1,1,1')\n                        .replace('shortdot', '1,1,')\n                        .replace('shortdash', '3,1,')\n                        .replace('longdash', '8,3,')\n                        .replace(/dot/g, '1,3,')\n                        .replace('dash', '4,3,')\n                        .replace(/,$/, '')\n                        .split(','); // ending comma\n\n                    i = value.length;\n                    while (i--) {\n                        value[i] = pInt(value[i]) * strokeWidth;\n                    }\n                    value = value.join(',')\n                        .replace(/NaN/g, 'none'); // #3226\n                    this.element.setAttribute('stroke-dasharray', value);\n                }\n            },\n\n            alignSetter: function(value) {\n                var convert = {\n                    left: 'start',\n                    center: 'middle',\n                    right: 'end'\n                };\n                this.element.setAttribute('text-anchor', convert[value]);\n            },\n            opacitySetter: function(value, key, element) {\n                this[key] = value;\n                element.setAttribute(key, value);\n            },\n            titleSetter: function(value) {\n                var titleNode = this.element.getElementsByTagName('title')[0];\n                if (!titleNode) {\n                    titleNode = doc.createElementNS(this.SVG_NS, 'title');\n                    this.element.appendChild(titleNode);\n                }\n\n                // Remove text content if it exists\n                if (titleNode.firstChild) {\n                    titleNode.removeChild(titleNode.firstChild);\n                }\n\n                titleNode.appendChild(\n                    doc.createTextNode(\n                        (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895\n                    )\n                );\n            },\n            textSetter: function(value) {\n                if (value !== this.textStr) {\n                    // Delete bBox memo when the text changes\n                    delete this.bBox;\n\n                    this.textStr = value;\n                    if (this.added) {\n                        this.renderer.buildText(this);\n                    }\n                }\n            },\n            fillSetter: function(value, key, element) {\n                if (typeof value === 'string') {\n                    element.setAttribute(key, value);\n                } else if (value) {\n                    this.colorGradient(value, key, element);\n                }\n            },\n            visibilitySetter: function(value, key, element) {\n                // IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881, #3909)\n                if (value === 'inherit') {\n                    element.removeAttribute(key);\n                } else {\n                    element.setAttribute(key, value);\n                }\n            },\n            zIndexSetter: function(value, key) {\n                var renderer = this.renderer,\n                    parentGroup = this.parentGroup,\n                    parentWrapper = parentGroup || renderer,\n                    parentNode = parentWrapper.element || renderer.box,\n                    childNodes,\n                    otherElement,\n                    otherZIndex,\n                    element = this.element,\n                    inserted,\n                    run = this.added,\n                    i;\n\n                if (defined(value)) {\n                    element.zIndex = value; // So we can read it for other elements in the group\n                    value = +value;\n                    if (this[key] === value) { // Only update when needed (#3865)\n                        run = false;\n                    }\n                    this[key] = value;\n                }\n\n                // Insert according to this and other elements' zIndex. Before .add() is called,\n                // nothing is done. Then on add, or by later calls to zIndexSetter, the node\n                // is placed on the right place in the DOM.\n                if (run) {\n                    value = this.zIndex;\n\n                    if (value && parentGroup) {\n                        parentGroup.handleZ = true;\n                    }\n\n                    childNodes = parentNode.childNodes;\n                    for (i = 0; i < childNodes.length && !inserted; i++) {\n                        otherElement = childNodes[i];\n                        otherZIndex = otherElement.zIndex;\n                        if (otherElement !== element && (\n                                // Insert before the first element with a higher zIndex\n                                pInt(otherZIndex) > value ||\n                                // If no zIndex given, insert before the first element with a zIndex\n                                (!defined(value) && defined(otherZIndex)) ||\n                                // Negative zIndex versus no zIndex:\n                                // On all levels except the highest. If the parent is <svg>,\n                                // then we don't want to put items before <desc> or <defs>\n                                (value < 0 && !defined(otherZIndex) && parentNode !== renderer.box)\n\n                            )) {\n                            parentNode.insertBefore(element, otherElement);\n                            inserted = true;\n                        }\n                    }\n                    if (!inserted) {\n                        parentNode.appendChild(element);\n                    }\n                }\n                return inserted;\n            },\n            _defaultSetter: function(value, key, element) {\n                element.setAttribute(key, value);\n            }\n        });\n\n        // Some shared setters and getters\n        SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\n        SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter =\n            SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter =\n            SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function(value, key) {\n                this[key] = value;\n                this.doTransform = true;\n            };\n\n\n        // WebKit and Batik have problems with a stroke-width of zero, so in this case we remove the \n        // stroke attribute altogether. #1270, #1369, #3065, #3072.\n        SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter = function(value, key, element) {\n            this[key] = value;\n            // Only apply the stroke attribute if the stroke width is defined and larger than 0\n            if (this.stroke && this['stroke-width']) {\n                SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element); // use prototype as instance may be overridden\n                element.setAttribute('stroke-width', this['stroke-width']);\n                this.hasStroke = true;\n            } else if (key === 'stroke-width' && value === 0 && this.hasStroke) {\n                element.removeAttribute('stroke');\n                this.hasStroke = false;\n            }\n        };\n\n\n        /**\n         * Allows direct access to the Highcharts rendering layer in order to draw\n         * primitive shapes like circles, rectangles, paths or text directly on a chart,\n         * or independent from any chart. The SVGRenderer represents a wrapper object\n         * for SVGin modern browsers and through the VMLRenderer, for VML in IE < 8.\n         *\n         * An existing chart's renderer can be accessed through {@link Chart#renderer}.\n         * The renderer can also be used completely decoupled from a chart.\n         *\n         * @param {HTMLDOMElement} container - Where to put the SVG in the web page.\n         * @param {number} width - The width of the SVG.\n         * @param {number} height - The height of the SVG.\n         * @param {boolean} [forExport=false] - Whether the rendered content is intended\n         *   for export.\n         * @param {boolean} [allowHTML=true] - Whether the renderer is allowed to\n         *   include HTML text, which will be projected on top of the SVG.\n         *\n         * @example\n         * // Use directly without a chart object.\n         * var renderer = new Highcharts.Renderer(parentNode, 600, 400);\n         *\n         * @sample highcharts/members/renderer-on-chart - Annotating a chart programmatically.\n         * @sample highcharts/members/renderer-basic - Independedt SVG drawing.\n         *\n         * @class Highcharts.SVGRenderer\n         */\n        SVGRenderer = H.SVGRenderer = function() {\n            this.init.apply(this, arguments);\n        };\n        extend(SVGRenderer.prototype, /** @lends Highcharts.SVGRenderer.prototype */ {\n            /**\n             * A pointer to the renderer's associated Element class. The VMLRenderer\n             * will have a pointer to VMLElement here.\n             * @type {Highcharts.SVGElement}\n             */\n            Element: SVGElement,\n            SVG_NS: SVG_NS,\n            /**\n             * Initialize the SVGRenderer. Overridable initiator function that takes\n             * the same parameters as the constructor.\n             */\n            init: function(container, width, height, style, forExport, allowHTML) {\n                var renderer = this,\n                    boxWrapper,\n                    element,\n                    desc;\n\n                boxWrapper = renderer.createElement('svg')\n                    .attr({\n                        'version': '1.1',\n                        'class': 'highcharts-root'\n                    })\n\n                    .css(this.getStyle(style));\n                element = boxWrapper.element;\n                container.appendChild(element);\n\n                // For browsers other than IE, add the namespace attribute (#1978)\n                if (container.innerHTML.indexOf('xmlns') === -1) {\n                    attr(element, 'xmlns', this.SVG_NS);\n                }\n\n                // object properties\n                renderer.isSVG = true;\n\n                /** \n                 * The root `svg` node of the renderer.\n                 * @type {SVGDOMElement}\n                 */\n                this.box = element;\n                /** \n                 * The wrapper for the root `svg` node of the renderer.\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.boxWrapper = boxWrapper;\n                renderer.alignedObjects = [];\n\n                /**\n                 * Page url used for internal references.\n                 * @type {string}\n                 */\n                // #24, #672, #1070\n                this.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?\n                    win.location.href\n                    .replace(/#.*?$/, '') // remove the hash\n                    .replace(/<[^>]*>/g, '') // wing cut HTML\n                    .replace(/([\\('\\)])/g, '\\\\$1') // escape parantheses and quotes\n                    .replace(/ /g, '%20') : // replace spaces (needed for Safari only)\n                    '';\n\n                // Add description\n                desc = this.createElement('desc').add();\n                desc.element.appendChild(doc.createTextNode('Created with Highcharts 5.0.12'));\n\n\n                renderer.defs = this.createElement('defs').add();\n                renderer.allowHTML = allowHTML;\n                renderer.forExport = forExport;\n                renderer.gradients = {}; // Object where gradient SvgElements are stored\n                renderer.cache = {}; // Cache for numerical bounding boxes\n                renderer.cacheKeys = [];\n                renderer.imgCount = 0;\n\n                renderer.setSize(width, height, false);\n\n\n\n                // Issue 110 workaround:\n                // In Firefox, if a div is positioned by percentage, its pixel position may land\n                // between pixels. The container itself doesn't display this, but an SVG element\n                // inside this container will be drawn at subpixel precision. In order to draw\n                // sharp lines, this must be compensated for. This doesn't seem to work inside\n                // iframes though (like in jsFiddle).\n                var subPixelFix, rect;\n                if (isFirefox && container.getBoundingClientRect) {\n                    subPixelFix = function() {\n                        css(container, {\n                            left: 0,\n                            top: 0\n                        });\n                        rect = container.getBoundingClientRect();\n                        css(container, {\n                            left: (Math.ceil(rect.left) - rect.left) + 'px',\n                            top: (Math.ceil(rect.top) - rect.top) + 'px'\n                        });\n                    };\n\n                    // run the fix now\n                    subPixelFix();\n\n                    // run it on resize\n                    renderer.unSubPixelFix = addEvent(win, 'resize', subPixelFix);\n                }\n            },\n\n\n\n            /**\n             * Get the global style setting for the renderer.\n             * @private\n             * @param  {CSSObject} style - Style settings.\n             * @return {CSSObject} The style settings mixed with defaults.\n             */\n            getStyle: function(style) {\n                this.style = extend({\n\n                    fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif', // default font\n                    fontSize: '12px'\n\n                }, style);\n                return this.style;\n            },\n            /**\n             * Apply the global style on the renderer, mixed with the default styles.\n             * @param {CSSObject} style - CSS to apply.\n             */\n            setStyle: function(style) {\n                this.boxWrapper.css(this.getStyle(style));\n            },\n\n\n            /**\n             * Detect whether the renderer is hidden. This happens when one of the\n             * parent elements has display: none. Used internally to detect when we need\n             * to render preliminarily in another div to get the text bounding boxes \n             * right.\n             *\n             * @returns {boolean} True if it is hidden.\n             */\n            isHidden: function() { // #608\n                return !this.boxWrapper.getBBox().width;\n            },\n\n            /**\n             * Destroys the renderer and its allocated members.\n             */\n            destroy: function() {\n                var renderer = this,\n                    rendererDefs = renderer.defs;\n                renderer.box = null;\n                renderer.boxWrapper = renderer.boxWrapper.destroy();\n\n                // Call destroy on all gradient elements\n                destroyObjectProperties(renderer.gradients || {});\n                renderer.gradients = null;\n\n                // Defs are null in VMLRenderer\n                // Otherwise, destroy them here.\n                if (rendererDefs) {\n                    renderer.defs = rendererDefs.destroy();\n                }\n\n                // Remove sub pixel fix handler (#982)\n                if (renderer.unSubPixelFix) {\n                    renderer.unSubPixelFix();\n                }\n\n                renderer.alignedObjects = null;\n\n                return null;\n            },\n\n            /**\n             * Create a wrapper for an SVG element. Serves as a factory for \n             * {@link SVGElement}, but this function is itself mostly called from \n             * primitive factories like {@link SVGRenderer#path}, {@link\n             * SVGRenderer#rect} or {@link SVGRenderer#text}.\n             * \n             * @param {string} nodeName - The node name, for example `rect`, `g` etc.\n             * @returns {Highcharts.SVGElement} The generated SVGElement.\n             */\n            createElement: function(nodeName) {\n                var wrapper = new this.Element();\n                wrapper.init(this, nodeName);\n                return wrapper;\n            },\n\n            /**\n             * Dummy function for plugins, called every time the renderer is updated.\n             * Prior to Highcharts 5, this was used for the canvg renderer.\n             * @function\n             */\n            draw: noop,\n\n            /**\n             * Get converted radial gradient attributes according to the radial\n             * reference. Used internally from the {@link SVGElement#colorGradient}\n             * function.\n             *\n             * @private\n             */\n            getRadialAttr: function(radialReference, gradAttr) {\n                return {\n                    cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],\n                    cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],\n                    r: gradAttr.r * radialReference[2]\n                };\n            },\n\n            getSpanWidth: function(wrapper, tspan) {\n                var renderer = this,\n                    bBox = wrapper.getBBox(true),\n                    actualWidth = bBox.width;\n\n                // Old IE cannot measure the actualWidth for SVG elements (#2314)\n                if (!svg && renderer.forExport) {\n                    actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);\n                }\n                return actualWidth;\n            },\n\n            applyEllipsis: function(wrapper, tspan, text, width) {\n                var renderer = this,\n                    actualWidth = renderer.getSpanWidth(wrapper, tspan),\n                    wasTooLong = actualWidth > width,\n                    str = text,\n                    currentIndex,\n                    minIndex = 0,\n                    maxIndex = text.length,\n                    updateTSpan = function(s) {\n                        tspan.removeChild(tspan.firstChild);\n                        if (s) {\n                            tspan.appendChild(doc.createTextNode(s));\n                        }\n                    };\n                if (wasTooLong) {\n                    while (minIndex <= maxIndex) {\n                        currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n                        str = text.substring(0, currentIndex) + '\\u2026';\n                        updateTSpan(str);\n                        actualWidth = renderer.getSpanWidth(wrapper, tspan);\n                        if (minIndex === maxIndex) {\n                            // Complete\n                            minIndex = maxIndex + 1;\n                        } else if (actualWidth > width) {\n                            // Too large. Set max index to current.\n                            maxIndex = currentIndex - 1;\n                        } else {\n                            // Within width. Set min index to current.\n                            minIndex = currentIndex;\n                        }\n                    }\n                    // If max index was 0 it means just ellipsis was also to large.\n                    if (maxIndex === 0) {\n                        // Remove ellipses.\n                        updateTSpan('');\n                    }\n                }\n                return wasTooLong;\n            },\n\n            /**\n             * Parse a simple HTML string into SVG tspans. Called internally when text\n             *   is set on an SVGElement. The function supports a subset of HTML tags,\n             *   CSS text features like `width`, `text-overflow`, `white-space`, and\n             *   also attributes like `href` and `style`.\n             * @private\n             * @param {Highcharts.SVGElement} wrapper The parent SVGElement.\n             */\n            buildText: function(wrapper) {\n                var textNode = wrapper.element,\n                    renderer = this,\n                    forExport = renderer.forExport,\n                    textStr = pick(wrapper.textStr, '').toString(),\n                    hasMarkup = textStr.indexOf('<') !== -1,\n                    lines,\n                    childNodes = textNode.childNodes,\n                    clsRegex,\n                    styleRegex,\n                    hrefRegex,\n                    wasTooLong,\n                    parentX = attr(textNode, 'x'),\n                    textStyles = wrapper.styles,\n                    width = wrapper.textWidth,\n                    textLineHeight = textStyles && textStyles.lineHeight,\n                    textOutline = textStyles && textStyles.textOutline,\n                    ellipsis = textStyles && textStyles.textOverflow === 'ellipsis',\n                    noWrap = textStyles && textStyles.whiteSpace === 'nowrap',\n                    fontSize = textStyles && textStyles.fontSize,\n                    textCache,\n                    isSubsequentLine,\n                    i = childNodes.length,\n                    tempParent = width && !wrapper.added && this.box,\n                    getLineHeight = function(tspan) {\n                        var fontSizeStyle;\n\n                        fontSizeStyle = /(px|em)$/.test(tspan && tspan.style.fontSize) ?\n                            tspan.style.fontSize :\n                            (fontSize || renderer.style.fontSize || 12);\n\n\n                        return textLineHeight ?\n                            pInt(textLineHeight) :\n                            renderer.fontMetrics(\n                                fontSizeStyle,\n                                // Get the computed size from parent if not explicit\n                                tspan.getAttribute('style') ? tspan : textNode\n                            ).h;\n                    },\n                    unescapeAngleBrackets = function(inputStr) {\n                        return inputStr.replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n                    };\n\n                // The buildText code is quite heavy, so if we're not changing something\n                // that affects the text, skip it (#6113).\n                textCache = [\n                    textStr,\n                    ellipsis,\n                    noWrap,\n                    textLineHeight,\n                    textOutline,\n                    fontSize,\n                    width\n                ].join(',');\n                if (textCache === wrapper.textCache) {\n                    return;\n                }\n                wrapper.textCache = textCache;\n\n                /// remove old text\n                while (i--) {\n                    textNode.removeChild(childNodes[i]);\n                }\n\n                // Skip tspans, add text directly to text node. The forceTSpan is a hook\n                // used in text outline hack.\n                if (!hasMarkup && !textOutline && !ellipsis && !width && textStr.indexOf(' ') === -1) {\n                    textNode.appendChild(doc.createTextNode(unescapeAngleBrackets(textStr)));\n\n                    // Complex strings, add more logic\n                } else {\n\n                    clsRegex = /<.*class=\"([^\"]+)\".*>/;\n                    styleRegex = /<.*style=\"([^\"]+)\".*>/;\n                    hrefRegex = /<.*href=\"([^\"]+)\".*>/;\n\n                    if (tempParent) {\n                        tempParent.appendChild(textNode); // attach it to the DOM to read offset width\n                    }\n\n                    if (hasMarkup) {\n                        lines = textStr\n\n                            .replace(/<(b|strong)>/g, '<span style=\"font-weight:bold\">')\n                            .replace(/<(i|em)>/g, '<span style=\"font-style:italic\">')\n\n                            .replace(/<a/g, '<span')\n                            .replace(/<\\/(b|strong|i|em|a)>/g, '</span>')\n                            .split(/<br.*?>/g);\n\n                    } else {\n                        lines = [textStr];\n                    }\n\n\n                    // Trim empty lines (#5261)\n                    lines = grep(lines, function(line) {\n                        return line !== '';\n                    });\n\n\n                    // build the lines\n                    each(lines, function buildTextLines(line, lineNo) {\n                        var spans,\n                            spanNo = 0;\n                        line = line\n                            .replace(/^\\s+|\\s+$/g, '') // Trim to prevent useless/costly process on the spaces (#5258)\n                            .replace(/<span/g, '|||<span')\n                            .replace(/<\\/span>/g, '</span>|||');\n                        spans = line.split('|||');\n\n                        each(spans, function buildTextSpans(span) {\n                            if (span !== '' || spans.length === 1) {\n                                var attributes = {},\n                                    tspan = doc.createElementNS(renderer.SVG_NS, 'tspan'),\n                                    spanCls,\n                                    spanStyle; // #390\n                                if (clsRegex.test(span)) {\n                                    spanCls = span.match(clsRegex)[1];\n                                    attr(tspan, 'class', spanCls);\n                                }\n                                if (styleRegex.test(span)) {\n                                    spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');\n                                    attr(tspan, 'style', spanStyle);\n                                }\n                                if (hrefRegex.test(span) && !forExport) { // Not for export - #1529\n                                    attr(tspan, 'onclick', 'location.href=\\\"' + span.match(hrefRegex)[1] + '\\\"');\n                                    css(tspan, {\n                                        cursor: 'pointer'\n                                    });\n                                }\n\n                                span = unescapeAngleBrackets(span.replace(/<(.|\\n)*?>/g, '') || ' ');\n\n                                // Nested tags aren't supported, and cause crash in Safari (#1596)\n                                if (span !== ' ') {\n\n                                    // add the text node\n                                    tspan.appendChild(doc.createTextNode(span));\n\n                                    if (!spanNo) { // first span in a line, align it to the left\n                                        if (lineNo && parentX !== null) {\n                                            attributes.x = parentX;\n                                        }\n                                    } else {\n                                        attributes.dx = 0; // #16\n                                    }\n\n                                    // add attributes\n                                    attr(tspan, attributes);\n\n                                    // Append it\n                                    textNode.appendChild(tspan);\n\n                                    // first span on subsequent line, add the line height\n                                    if (!spanNo && isSubsequentLine) {\n\n                                        // allow getting the right offset height in exporting in IE\n                                        if (!svg && forExport) {\n                                            css(tspan, {\n                                                display: 'block'\n                                            });\n                                        }\n\n                                        // Set the line height based on the font size of either\n                                        // the text element or the tspan element\n                                        attr(\n                                            tspan,\n                                            'dy',\n                                            getLineHeight(tspan)\n                                        );\n                                    }\n\n                                    /*if (width) {\n                                    \trenderer.breakText(wrapper, width);\n                                    }*/\n\n                                    // Check width and apply soft breaks or ellipsis\n                                    if (width) {\n                                        var words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n                                            hasWhiteSpace = spans.length > 1 || lineNo || (words.length > 1 && !noWrap),\n                                            tooLong,\n                                            rest = [],\n                                            actualWidth,\n                                            dy = getLineHeight(tspan),\n                                            rotation = wrapper.rotation;\n\n                                        if (ellipsis) {\n                                            wasTooLong = renderer.applyEllipsis(wrapper, tspan, span, width);\n                                        }\n\n                                        while (!ellipsis && hasWhiteSpace && (words.length || rest.length)) {\n                                            wrapper.rotation = 0; // discard rotation when computing box\n                                            actualWidth = renderer.getSpanWidth(wrapper, tspan);\n                                            tooLong = actualWidth > width;\n\n                                            // For ellipsis, do a binary search for the correct string length\n                                            if (wasTooLong === undefined) {\n                                                wasTooLong = tooLong; // First time\n                                            }\n\n                                            // Looping down, this is the first word sequence that is not too long,\n                                            // so we can move on to build the next line.\n                                            if (!tooLong || words.length === 1) {\n                                                words = rest;\n                                                rest = [];\n\n                                                if (words.length && !noWrap) {\n                                                    tspan = doc.createElementNS(SVG_NS, 'tspan');\n                                                    attr(tspan, {\n                                                        dy: dy,\n                                                        x: parentX\n                                                    });\n                                                    if (spanStyle) { // #390\n                                                        attr(tspan, 'style', spanStyle);\n                                                    }\n                                                    textNode.appendChild(tspan);\n                                                }\n                                                if (actualWidth > width) { // a single word is pressing it out\n                                                    width = actualWidth;\n                                                }\n                                            } else { // append to existing line tspan\n                                                tspan.removeChild(tspan.firstChild);\n                                                rest.unshift(words.pop());\n                                            }\n                                            if (words.length) {\n                                                tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));\n                                            }\n                                        }\n                                        wrapper.rotation = rotation;\n                                    }\n\n                                    spanNo++;\n                                }\n                            }\n                        });\n                        // To avoid beginning lines that doesn't add to the textNode (#6144)\n                        isSubsequentLine = isSubsequentLine || textNode.childNodes.length;\n                    });\n\n                    if (wasTooLong) {\n                        wrapper.attr('title', wrapper.textStr);\n                    }\n                    if (tempParent) {\n                        tempParent.removeChild(textNode); // attach it to the DOM to read offset width\n                    }\n\n                    // Apply the text outline\n                    if (textOutline && wrapper.applyTextOutline) {\n                        wrapper.applyTextOutline(textOutline);\n                    }\n                }\n            },\n\n\n\n            /*\n            breakText: function (wrapper, width) {\n            \tvar bBox = wrapper.getBBox(),\n            \t\tnode = wrapper.element,\n            \t\ttextLength = node.textContent.length,\n            \t\tpos = Math.round(width * textLength / bBox.width), // try this position first, based on average character width\n            \t\tincrement = 0,\n            \t\tfinalPos;\n\n            \tif (bBox.width > width) {\n            \t\twhile (finalPos === undefined) {\n            \t\t\ttextLength = node.getSubStringLength(0, pos);\n\n            \t\t\tif (textLength <= width) {\n            \t\t\t\tif (increment === -1) {\n            \t\t\t\t\tfinalPos = pos;\n            \t\t\t\t} else {\n            \t\t\t\t\tincrement = 1;\n            \t\t\t\t}\n            \t\t\t} else {\n            \t\t\t\tif (increment === 1) {\n            \t\t\t\t\tfinalPos = pos - 1;\n            \t\t\t\t} else {\n            \t\t\t\t\tincrement = -1;\n            \t\t\t\t}\n            \t\t\t}\n            \t\t\tpos += increment;\n            \t\t}\n            \t}\n            \tconsole.log('width', width, 'stringWidth', node.getSubStringLength(0, finalPos))\n            },\n            */\n\n            /**\n             * Returns white for dark colors and black for bright colors.\n             *\n             * @param {ColorString} rgba - The color to get the contrast for.\n             * @returns {string} The contrast color, either `#000000` or `#FFFFFF`.\n             */\n            getContrast: function(rgba) {\n                rgba = color(rgba).rgba;\n\n                // The threshold may be discussed. Here's a proposal for adding\n                // different weight to the color channels (#6216)\n                /*\n        rgba[0] *= 1; // red\n        rgba[1] *= 1.2; // green\n        rgba[2] *= 0.7; // blue\n        */\n\n                return rgba[0] + rgba[1] + rgba[2] > 2 * 255 ? '#000000' : '#FFFFFF';\n            },\n\n            /**\n             * Create a button with preset states.\n             * @param {string} text - The text or HTML to draw.\n             * @param {number} x - The x position of the button's left side.\n             * @param {number} y - The y position of the button's top side.\n             * @param {Function} callback - The function to execute on button click or \n             *    touch.\n             * @param {SVGAttributes} [normalState] - SVG attributes for the normal\n             *    state.\n             * @param {SVGAttributes} [hoverState] - SVG attributes for the hover state.\n             * @param {SVGAttributes} [pressedState] - SVG attributes for the pressed\n             *    state.\n             * @param {SVGAttributes} [disabledState] - SVG attributes for the disabled\n             *    state.\n             * @param {Symbol} [shape=rect] - The shape type.\n             * @returns {SVGRenderer} The button element.\n             */\n            button: function(text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {\n                var label = this.label(text, x, y, shape, null, null, null, null, 'button'),\n                    curState = 0;\n\n                // Default, non-stylable attributes\n                label.attr(merge({\n                    'padding': 8,\n                    'r': 2\n                }, normalState));\n\n\n                // Presentational\n                var normalStyle,\n                    hoverStyle,\n                    pressedStyle,\n                    disabledStyle;\n\n                // Normal state - prepare the attributes\n                normalState = merge({\n                    fill: '#f7f7f7',\n                    stroke: '#cccccc',\n                    'stroke-width': 1,\n                    style: {\n                        color: '#333333',\n                        cursor: 'pointer',\n                        fontWeight: 'normal'\n                    }\n                }, normalState);\n                normalStyle = normalState.style;\n                delete normalState.style;\n\n                // Hover state\n                hoverState = merge(normalState, {\n                    fill: '#e6e6e6'\n                }, hoverState);\n                hoverStyle = hoverState.style;\n                delete hoverState.style;\n\n                // Pressed state\n                pressedState = merge(normalState, {\n                    fill: '#e6ebf5',\n                    style: {\n                        color: '#000000',\n                        fontWeight: 'bold'\n                    }\n                }, pressedState);\n                pressedStyle = pressedState.style;\n                delete pressedState.style;\n\n                // Disabled state\n                disabledState = merge(normalState, {\n                    style: {\n                        color: '#cccccc'\n                    }\n                }, disabledState);\n                disabledStyle = disabledState.style;\n                delete disabledState.style;\n\n\n                // Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).\n                addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function() {\n                    if (curState !== 3) {\n                        label.setState(1);\n                    }\n                });\n                addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function() {\n                    if (curState !== 3) {\n                        label.setState(curState);\n                    }\n                });\n\n                label.setState = function(state) {\n                    // Hover state is temporary, don't record it\n                    if (state !== 1) {\n                        label.state = curState = state;\n                    }\n                    // Update visuals\n                    label.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n                        .addClass('highcharts-button-' + ['normal', 'hover', 'pressed', 'disabled'][state || 0]);\n\n\n                    label.attr([normalState, hoverState, pressedState, disabledState][state || 0])\n                        .css([normalStyle, hoverStyle, pressedStyle, disabledStyle][state || 0]);\n\n                };\n\n\n\n                // Presentational attributes\n                label\n                    .attr(normalState)\n                    .css(extend({\n                        cursor: 'default'\n                    }, normalStyle));\n\n\n                return label\n                    .on('click', function(e) {\n                        if (curState !== 3) {\n                            callback.call(label, e);\n                        }\n                    });\n            },\n\n            /**\n             * Make a straight line crisper by not spilling out to neighbour pixels.\n             * \n             * @param {Array} points - The original points on the format `['M', 0, 0,\n             *    'L', 100, 0]`.\n             * @param {number} width - The width of the line.\n             * @returns {Array} The original points array, but modified to render\n             * crisply.\n             */\n            crispLine: function(points, width) {\n                // normalize to a crisp line\n                if (points[1] === points[4]) {\n                    // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n                    points[1] = points[4] = Math.round(points[1]) - (width % 2 / 2);\n                }\n                if (points[2] === points[5]) {\n                    points[2] = points[5] = Math.round(points[2]) + (width % 2 / 2);\n                }\n                return points;\n            },\n\n\n            /**\n             * Draw a path, wraps the SVG `path` element.\n             * \n             * @param {Array} [path] An SVG path definition in array form.\n             * \n             * @example\n             * var path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n             *     .attr({ stroke: '#ff00ff' })\n             *     .add();\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-path-on-chart/\n             *         Draw a path in a chart\n             * @sample highcharts/members/renderer-path/\n             *         Draw a path independent from a chart\n             *\n             */\n            /**\n             * Draw a path, wraps the SVG `path` element.\n             * \n             * @param {SVGAttributes} [attribs] The initial attributes.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            path: function(path) {\n                var attribs = {\n\n                    fill: 'none'\n\n                };\n                if (isArray(path)) {\n                    attribs.d = path;\n                } else if (isObject(path)) { // attributes\n                    extend(attribs, path);\n                }\n                return this.createElement('path').attr(attribs);\n            },\n\n            /**\n             * Draw a circle, wraps the SVG `circle` element.\n             * \n             * @param {number} [x] The center x position.\n             * @param {number} [y] The center y position.\n             * @param {number} [r] The radius.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-circle/ Drawing a circle\n             */\n            /**\n             * Draw a circle, wraps the SVG `circle` element.\n             * \n             * @param {SVGAttributes} [attribs] The initial attributes.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            circle: function(x, y, r) {\n                var attribs = isObject(x) ? x : {\n                        x: x,\n                        y: y,\n                        r: r\n                    },\n                    wrapper = this.createElement('circle');\n\n                // Setting x or y translates to cx and cy\n                wrapper.xSetter = wrapper.ySetter = function(value, key, element) {\n                    element.setAttribute('c' + key, value);\n                };\n\n                return wrapper.attr(attribs);\n            },\n\n            /**\n             * Draw and return an arc.\n             * @param {number} [x=0] Center X position.\n             * @param {number} [y=0] Center Y position.\n             * @param {number} [r=0] The outer radius of the arc.\n             * @param {number} [innerR=0] Inner radius like used in donut charts.\n             * @param {number} [start=0] The starting angle of the arc in radians, where\n             *    0 is to the right and `-Math.PI/2` is up.\n             * @param {number} [end=0] The ending angle of the arc in radians, where 0\n             *    is to the right and `-Math.PI/2` is up.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-arc/\n             *         Drawing an arc\n             */\n            /**\n             * Draw and return an arc. Overloaded function that takes arguments object.\n             * @param {SVGAttributes} attribs Initial SVG attributes.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            arc: function(x, y, r, innerR, start, end) {\n                var arc,\n                    options;\n\n                if (isObject(x)) {\n                    options = x;\n                    y = options.y;\n                    r = options.r;\n                    innerR = options.innerR;\n                    start = options.start;\n                    end = options.end;\n                    x = options.x;\n                } else {\n                    options = {\n                        innerR: innerR,\n                        start: start,\n                        end: end\n                    };\n                }\n\n                // Arcs are defined as symbols for the ability to set\n                // attributes in attr and animate\n                arc = this.symbol('arc', x, y, r, r, options);\n                arc.r = r; // #959\n                return arc;\n            },\n\n            /**\n             * Draw and return a rectangle.\n             * @param {number} [x] Left position.\n             * @param {number} [y] Top position.\n             * @param {number} [width] Width of the rectangle.\n             * @param {number} [height] Height of the rectangle.\n             * @param {number} [r] Border corner radius.\n             * @param {number} [strokeWidth] A stroke width can be supplied to allow\n             *    crisp drawing.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            /**\n             * Draw and return a rectangle.\n             * @param  {SVGAttributes} [attributes]\n             *         General SVG attributes for the rectangle.\n             * @return {Highcharts.SVGElement}\n             *         The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-rect-on-chart/\n             *         Draw a rectangle in a chart\n             * @sample highcharts/members/renderer-rect/\n             *         Draw a rectangle independent from a chart\n             */\n            rect: function(x, y, width, height, r, strokeWidth) {\n\n                r = isObject(x) ? x.r : r;\n\n                var wrapper = this.createElement('rect'),\n                    attribs = isObject(x) ? x : x === undefined ? {} : {\n                        x: x,\n                        y: y,\n                        width: Math.max(width, 0),\n                        height: Math.max(height, 0)\n                    };\n\n\n                if (strokeWidth !== undefined) {\n                    attribs.strokeWidth = strokeWidth;\n                    attribs = wrapper.crisp(attribs);\n                }\n                attribs.fill = 'none';\n\n\n                if (r) {\n                    attribs.r = r;\n                }\n\n                wrapper.rSetter = function(value, key, element) {\n                    attr(element, {\n                        rx: value,\n                        ry: value\n                    });\n                };\n\n                return wrapper.attr(attribs);\n            },\n\n            /**\n             * Resize the {@link SVGRenderer#box} and re-align all aligned child\n             * elements.\n             * @param {number} width The new pixel width.\n             * @param {number} height The new pixel height.\n             * @param {boolean} animate Whether to animate.\n             */\n            setSize: function(width, height, animate) {\n                var renderer = this,\n                    alignedObjects = renderer.alignedObjects,\n                    i = alignedObjects.length;\n\n                renderer.width = width;\n                renderer.height = height;\n\n                renderer.boxWrapper.animate({\n                    width: width,\n                    height: height\n                }, {\n                    step: function() {\n                        this.attr({\n                            viewBox: '0 0 ' + this.attr('width') + ' ' + this.attr('height')\n                        });\n                    },\n                    duration: pick(animate, true) ? undefined : 0\n                });\n\n                while (i--) {\n                    alignedObjects[i].align();\n                }\n            },\n\n            /**\n             * Create and return an svg group element. Child {@link Highcharts.SVGElement}\n             * objects are added to the group by using the group as the first parameter\n             * in {@link Highcharts.SVGElement#add|add()}.\n             * \n             * @param {string} [name] The group will be given a class name of\n             * `highcharts-{name}`. This can be used for styling and scripting.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-g/\n             *         Show and hide grouped objects\n             */\n            g: function(name) {\n                var elem = this.createElement('g');\n                return name ? elem.attr({\n                    'class': 'highcharts-' + name\n                }) : elem;\n            },\n\n            /**\n             * Display an image.\n             * @param {string} src The image source.\n             * @param {number} [x] The X position.\n             * @param {number} [y] The Y position.\n             * @param {number} [width] The image width. If omitted, it defaults to the \n             *    image file width.\n             * @param {number} [height] The image height. If omitted it defaults to the\n             *    image file height.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-image-on-chart/\n             *         Add an image in a chart\n             * @sample highcharts/members/renderer-image/\n             *         Add an image independent of a chart\n             */\n            image: function(src, x, y, width, height) {\n                var attribs = {\n                        preserveAspectRatio: 'none'\n                    },\n                    elemWrapper;\n\n                // optional properties\n                if (arguments.length > 1) {\n                    extend(attribs, {\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                }\n\n                elemWrapper = this.createElement('image').attr(attribs);\n\n                // set the href in the xlink namespace\n                if (elemWrapper.element.setAttributeNS) {\n                    elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',\n                        'href', src);\n                } else {\n                    // could be exporting in IE\n                    // using href throws \"not supported\" in ie7 and under, requries regex shim to fix later\n                    elemWrapper.element.setAttribute('hc-svg-href', src);\n                }\n                return elemWrapper;\n            },\n\n            /**\n             * Draw a symbol out of pre-defined shape paths from {@SVGRenderer#symbols}.\n             * It is used in Highcharts for point makers, which cake a `symbol` option,\n             * and label and button backgrounds like in the tooltip and stock flags.\n             *\n             * @param {Symbol} symbol - The symbol name.\n             * @param {number} x - The X coordinate for the top left position.\n             * @param {number} y - The Y coordinate for the top left position.\n             * @param {number} width - The pixel width.\n             * @param {number} height - The pixel height.\n             * @param {Object} [options] - Additional options, depending on the actual\n             *    symbol drawn. \n             * @param {number} [options.anchorX] - The anchor X position for the\n             *    `callout` symbol. This is where the chevron points to.\n             * @param {number} [options.anchorY] - The anchor Y position for the\n             *    `callout` symbol. This is where the chevron points to.\n             * @param {number} [options.end] - The end angle of an `arc` symbol.\n             * @param {boolean} [options.open] - Whether to draw `arc` symbol open or\n             *    closed.\n             * @param {number} [options.r] - The radius of an `arc` symbol, or the\n             *    border radius for the `callout` symbol.\n             * @param {number} [options.start] - The start angle of an `arc` symbol.\n             */\n            symbol: function(symbol, x, y, width, height, options) {\n\n                var ren = this,\n                    obj,\n                    imageRegex = /^url\\((.*?)\\)$/,\n                    isImage = imageRegex.test(symbol),\n                    sym = !isImage && (this.symbols[symbol] ? symbol : 'circle'),\n\n\n                    // get the symbol definition function\n                    symbolFn = sym && this.symbols[sym],\n\n                    // check if there's a path defined for this symbol\n                    path = defined(x) && symbolFn && symbolFn.call(\n                        this.symbols,\n                        Math.round(x),\n                        Math.round(y),\n                        width,\n                        height,\n                        options\n                    ),\n                    imageSrc,\n                    centerImage;\n\n                if (symbolFn) {\n                    obj = this.path(path);\n\n\n                    obj.attr('fill', 'none');\n\n\n                    // expando properties for use in animate and attr\n                    extend(obj, {\n                        symbolName: sym,\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                    if (options) {\n                        extend(obj, options);\n                    }\n\n\n                    // Image symbols\n                } else if (isImage) {\n\n\n                    imageSrc = symbol.match(imageRegex)[1];\n\n                    // Create the image synchronously, add attribs async\n                    obj = this.image(imageSrc);\n\n                    // The image width is not always the same as the symbol width. The\n                    // image may be centered within the symbol, as is the case when\n                    // image shapes are used as label backgrounds, for example in flags.\n                    obj.imgwidth = pick(\n                        symbolSizes[imageSrc] && symbolSizes[imageSrc].width,\n                        options && options.width\n                    );\n                    obj.imgheight = pick(\n                        symbolSizes[imageSrc] && symbolSizes[imageSrc].height,\n                        options && options.height\n                    );\n                    /**\n                     * Set the size and position\n                     */\n                    centerImage = function() {\n                        obj.attr({\n                            width: obj.width,\n                            height: obj.height\n                        });\n                    };\n\n                    /**\n                     * Width and height setters that take both the image's physical size\n                     * and the label size into consideration, and translates the image\n                     * to center within the label.\n                     */\n                    each(['width', 'height'], function(key) {\n                        obj[key + 'Setter'] = function(value, key) {\n                            var attribs = {},\n                                imgSize = this['img' + key],\n                                trans = key === 'width' ? 'translateX' : 'translateY';\n                            this[key] = value;\n                            if (defined(imgSize)) {\n                                if (this.element) {\n                                    this.element.setAttribute(key, imgSize);\n                                }\n                                if (!this.alignByTranslate) {\n                                    attribs[trans] = ((this[key] || 0) - imgSize) / 2;\n                                    this.attr(attribs);\n                                }\n                            }\n                        };\n                    });\n\n\n                    if (defined(x)) {\n                        obj.attr({\n                            x: x,\n                            y: y\n                        });\n                    }\n                    obj.isImg = true;\n\n                    if (defined(obj.imgwidth) && defined(obj.imgheight)) {\n                        centerImage();\n                    } else {\n                        // Initialize image to be 0 size so export will still function if there's no cached sizes.\n                        obj.attr({\n                            width: 0,\n                            height: 0\n                        });\n\n                        // Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,\n                        // the created element must be assigned to a variable in order to load (#292).\n                        createElement('img', {\n                            onload: function() {\n\n                                var chart = charts[ren.chartIndex];\n\n                                // Special case for SVGs on IE11, the width is not accessible until the image is\n                                // part of the DOM (#2854).\n                                if (this.width === 0) {\n                                    css(this, {\n                                        position: 'absolute',\n                                        top: '-999em'\n                                    });\n                                    doc.body.appendChild(this);\n                                }\n\n                                // Center the image\n                                symbolSizes[imageSrc] = { // Cache for next\t\n                                    width: this.width,\n                                    height: this.height\n                                };\n                                obj.imgwidth = this.width;\n                                obj.imgheight = this.height;\n\n                                if (obj.element) {\n                                    centerImage();\n                                }\n\n                                // Clean up after #2854 workaround.\n                                if (this.parentNode) {\n                                    this.parentNode.removeChild(this);\n                                }\n\n                                // Fire the load event when all external images are loaded\n                                ren.imgCount--;\n                                if (!ren.imgCount && chart && chart.onload) {\n                                    chart.onload();\n                                }\n                            },\n                            src: imageSrc\n                        });\n                        this.imgCount++;\n                    }\n                }\n\n                return obj;\n            },\n\n            /**\n             * @typedef {string} Symbol\n             * \n             * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`,\n             * `triangle`, `triangle-down`. Symbols are used internally for point\n             * markers, button and label borders and backgrounds, or custom shapes.\n             * Extendable by adding to {@link SVGRenderer#symbols}.\n             */\n            /**\n             * An extendable collection of functions for defining symbol paths.\n             */\n            symbols: {\n                'circle': function(x, y, w, h) {\n                    // Return a full arc\n                    return this.arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n                        start: 0,\n                        end: Math.PI * 2,\n                        open: false\n                    });\n                },\n\n                'square': function(x, y, w, h) {\n                    return [\n                        'M', x, y,\n                        'L', x + w, y,\n                        x + w, y + h,\n                        x, y + h,\n                        'Z'\n                    ];\n                },\n\n                'triangle': function(x, y, w, h) {\n                    return [\n                        'M', x + w / 2, y,\n                        'L', x + w, y + h,\n                        x, y + h,\n                        'Z'\n                    ];\n                },\n\n                'triangle-down': function(x, y, w, h) {\n                    return [\n                        'M', x, y,\n                        'L', x + w, y,\n                        x + w / 2, y + h,\n                        'Z'\n                    ];\n                },\n                'diamond': function(x, y, w, h) {\n                    return [\n                        'M', x + w / 2, y,\n                        'L', x + w, y + h / 2,\n                        x + w / 2, y + h,\n                        x, y + h / 2,\n                        'Z'\n                    ];\n                },\n                'arc': function(x, y, w, h, options) {\n                    var start = options.start,\n                        rx = options.r || w,\n                        ry = options.r || h || w,\n                        end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)\n                        innerRadius = options.innerR,\n                        open = options.open,\n                        cosStart = Math.cos(start),\n                        sinStart = Math.sin(start),\n                        cosEnd = Math.cos(end),\n                        sinEnd = Math.sin(end),\n                        longArc = options.end - start < Math.PI ? 0 : 1,\n                        arc;\n\n                    arc = [\n                        'M',\n                        x + rx * cosStart,\n                        y + ry * sinStart,\n                        'A', // arcTo\n                        rx, // x radius\n                        ry, // y radius\n                        0, // slanting\n                        longArc, // long or short arc\n                        1, // clockwise\n                        x + rx * cosEnd,\n                        y + ry * sinEnd\n                    ];\n\n                    if (defined(innerRadius)) {\n                        arc.push(\n                            open ? 'M' : 'L',\n                            x + innerRadius * cosEnd,\n                            y + innerRadius * sinEnd,\n                            'A', // arcTo\n                            innerRadius, // x radius\n                            innerRadius, // y radius\n                            0, // slanting\n                            longArc, // long or short arc\n                            0, // clockwise\n                            x + innerRadius * cosStart,\n                            y + innerRadius * sinStart\n                        );\n                    }\n\n                    arc.push(open ? '' : 'Z'); // close\n                    return arc;\n                },\n\n                /**\n                 * Callout shape used for default tooltips, also used for rounded rectangles in VML\n                 */\n                callout: function(x, y, w, h, options) {\n                    var arrowLength = 6,\n                        halfDistance = 6,\n                        r = Math.min((options && options.r) || 0, w, h),\n                        safeDistance = r + halfDistance,\n                        anchorX = options && options.anchorX,\n                        anchorY = options && options.anchorY,\n                        path;\n\n                    path = [\n                        'M', x + r, y,\n                        'L', x + w - r, y, // top side\n                        'C', x + w, y, x + w, y, x + w, y + r, // top-right corner\n                        'L', x + w, y + h - r, // right side\n                        'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner\n                        'L', x + r, y + h, // bottom side\n                        'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner\n                        'L', x, y + r, // left side\n                        'C', x, y, x, y, x + r, y // top-left corner\n                    ];\n\n                    // Anchor on right side\n                    if (anchorX && anchorX > w) {\n\n                        // Chevron\n                        if (anchorY > y + safeDistance && anchorY < y + h - safeDistance) {\n                            path.splice(13, 3,\n                                'L', x + w, anchorY - halfDistance,\n                                x + w + arrowLength, anchorY,\n                                x + w, anchorY + halfDistance,\n                                x + w, y + h - r\n                            );\n\n                            // Simple connector\n                        } else {\n                            path.splice(13, 3,\n                                'L', x + w, h / 2,\n                                anchorX, anchorY,\n                                x + w, h / 2,\n                                x + w, y + h - r\n                            );\n                        }\n\n                        // Anchor on left side\n                    } else if (anchorX && anchorX < 0) {\n\n                        // Chevron\n                        if (anchorY > y + safeDistance && anchorY < y + h - safeDistance) {\n                            path.splice(33, 3,\n                                'L', x, anchorY + halfDistance,\n                                x - arrowLength, anchorY,\n                                x, anchorY - halfDistance,\n                                x, y + r\n                            );\n\n                            // Simple connector\n                        } else {\n                            path.splice(33, 3,\n                                'L', x, h / 2,\n                                anchorX, anchorY,\n                                x, h / 2,\n                                x, y + r\n                            );\n                        }\n\n                    } else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom\n                        path.splice(23, 3,\n                            'L', anchorX + halfDistance, y + h,\n                            anchorX, y + h + arrowLength,\n                            anchorX - halfDistance, y + h,\n                            x + r, y + h\n                        );\n                    } else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top\n                        path.splice(3, 3,\n                            'L', anchorX - halfDistance, y,\n                            anchorX, y - arrowLength,\n                            anchorX + halfDistance, y,\n                            w - r, y\n                        );\n                    }\n\n                    return path;\n                }\n            },\n\n            /**\n             * @typedef {Highcharts.SVGElement} ClipRect - A clipping rectangle that can be applied\n             * to one or more {@link SVGElement} instances. It is instanciated with the\n             * {@link SVGRenderer#clipRect} function and applied with the {@link \n             * SVGElement#clip} function.\n             *\n             * @example\n             * var circle = renderer.circle(100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .add();\n             * var clipRect = renderer.clipRect(100, 100, 100, 100);\n             *\n             * // Leave only the lower right quarter visible\n             * circle.clip(clipRect);\n             */\n            /**\n             * Define a clipping rectangle\n             * @param {String} id\n             * @param {number} x\n             * @param {number} y\n             * @param {number} width\n             * @param {number} height\n             * @returns {ClipRect} A clipping rectangle.\n             */\n            clipRect: function(x, y, width, height) {\n                var wrapper,\n                    id = H.uniqueKey(),\n\n                    clipPath = this.createElement('clipPath').attr({\n                        id: id\n                    }).add(this.defs);\n\n                wrapper = this.rect(x, y, width, height, 0).add(clipPath);\n                wrapper.id = id;\n                wrapper.clipPath = clipPath;\n                wrapper.count = 0;\n\n                return wrapper;\n            },\n\n\n\n\n\n            /**\n             * Draw text. The text can contain a subset of HTML, like spans and anchors\n             * and some basic text styling of these. For more advanced features like\n             * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n             * To update the text after render, run `text.attr({ text: 'New text' })`.\n             * @param  {String} str\n             *         The text of (subset) HTML to draw.\n             * @param  {number} x\n             *         The x position of the text's lower left corner.\n             * @param  {number} y\n             *         The y position of the text's lower left corner.\n             * @param  {Boolean} [useHTML=false]\n             *         Use HTML to render the text.\n             *\n             * @return {Highcharts.SVGElement} The text object.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Annotate the chart freely\n             * @sample highcharts/members/renderer-on-chart/\n             *         Annotate with a border and in response to the data\n             * @sample highcharts/members/renderer-text/\n             *         Formatted text\n             */\n            text: function(str, x, y, useHTML) {\n\n                // declare variables\n                var renderer = this,\n                    fakeSVG = !svg && renderer.forExport,\n                    wrapper,\n                    attribs = {};\n\n                if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n                    return renderer.html(str, x, y);\n                }\n\n                attribs.x = Math.round(x || 0); // X is always needed for line-wrap logic\n                if (y) {\n                    attribs.y = Math.round(y);\n                }\n                if (str || str === 0) {\n                    attribs.text = str;\n                }\n\n                wrapper = renderer.createElement('text')\n                    .attr(attribs);\n\n                // Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)\n                if (fakeSVG) {\n                    wrapper.css({\n                        position: 'absolute'\n                    });\n                }\n\n                if (!useHTML) {\n                    wrapper.xSetter = function(value, key, element) {\n                        var tspans = element.getElementsByTagName('tspan'),\n                            tspan,\n                            parentVal = element.getAttribute(key),\n                            i;\n                        for (i = 0; i < tspans.length; i++) {\n                            tspan = tspans[i];\n                            // If the x values are equal, the tspan represents a linebreak\n                            if (tspan.getAttribute(key) === parentVal) {\n                                tspan.setAttribute(key, value);\n                            }\n                        }\n                        element.setAttribute(key, value);\n                    };\n                }\n\n                return wrapper;\n            },\n\n            /**\n             * Utility to return the baseline offset and total line height from the font\n             * size.\n             *\n             * @param {?string} fontSize The current font size to inspect. If not given,\n             *   the font size will be found from the DOM element.\n             * @param {SVGElement|SVGDOMElement} [elem] The element to inspect for a\n             *   current font size.\n             * @returns {Object} An object containing `h`: the line height, `b`: the\n             * baseline relative to the top of the box, and `f`: the font size.\n             */\n            fontMetrics: function(fontSize, elem) {\n                var lineHeight,\n                    baseline;\n\n\n                fontSize = fontSize ||\n                    // When the elem is a DOM element (#5932)\n                    (elem && elem.style && elem.style.fontSize) ||\n                    // Fall back on the renderer style default\n                    (this.style && this.style.fontSize);\n\n\n\n                // Handle different units\n                if (/px/.test(fontSize)) {\n                    fontSize = pInt(fontSize);\n                } else if (/em/.test(fontSize)) {\n                    // The em unit depends on parent items\n                    fontSize = parseFloat(fontSize) *\n                        (elem ? this.fontMetrics(null, elem.parentNode).f : 16);\n                } else {\n                    fontSize = 12;\n                }\n\n                // Empirical values found by comparing font size and bounding box\n                // height. Applies to the default font family.\n                // http://jsfiddle.net/highcharts/7xvn7/\n                lineHeight = fontSize < 24 ? fontSize + 3 : Math.round(fontSize * 1.2);\n                baseline = Math.round(lineHeight * 0.8);\n\n                return {\n                    h: lineHeight,\n                    b: baseline,\n                    f: fontSize\n                };\n            },\n\n            /**\n             * Correct X and Y positioning of a label for rotation (#1764)\n             */\n            rotCorr: function(baseline, rotation, alterY) {\n                var y = baseline;\n                if (rotation && alterY) {\n                    y = Math.max(y * Math.cos(rotation * deg2rad), 4);\n                }\n                return {\n                    x: (-baseline / 3) * Math.sin(rotation * deg2rad),\n                    y: y\n                };\n            },\n\n            /**\n             * Draw a label, which is an extended text element with support for border\n             * and background. Highcharts creates a `g` element with a text and a `path`\n             * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n             * background are set through `stroke`, `stroke-width` and `fill` attributes\n             * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n             * text after render, run `label.attr({ text: 'New text' })`.\n             * \n             * @param  {string} str\n             *         The initial text string or (subset) HTML to render.\n             * @param  {number} x\n             *         The x position of the label's left side.\n             * @param  {number} y\n             *         The y position of the label's top side or baseline, depending on\n             *         the `baseline` parameter.\n             * @param  {String} shape\n             *         The shape of the label's border/background, if any. Defaults to\n             *         `rect`. Other possible values are `callout` or other shapes\n             *         defined in {@link Highcharts.SVGRenderer#symbols}.\n             * @param  {number} anchorX\n             *         In case the `shape` has a pointer, like a flag, this is the\n             *         coordinates it should be pinned to.\n             * @param  {number} anchorY\n             *         In case the `shape` has a pointer, like a flag, this is the\n             *         coordinates it should be pinned to.\n             * @param  {Boolean} baseline\n             *         Whether to position the label relative to the text baseline,\n             *\t       like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n             *\t       upper border of the rectangle.\n             * @param  {String} className\n             *         Class name for the group.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated label.\n             *\n             * @sample highcharts/members/renderer-label-on-chart/\n             *         A label on the chart\n             */\n            label: function(str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n\n                var renderer = this,\n                    wrapper = renderer.g(className !== 'button' && 'label'),\n                    text = wrapper.text = renderer.text('', 0, 0, useHTML)\n                    .attr({\n                        zIndex: 1\n                    }),\n                    box,\n                    bBox,\n                    alignFactor = 0,\n                    padding = 3,\n                    paddingLeft = 0,\n                    width,\n                    height,\n                    wrapperX,\n                    wrapperY,\n                    textAlign,\n                    deferredAttr = {},\n                    strokeWidth,\n                    baselineOffset,\n                    hasBGImage = /^url\\((.*?)\\)$/.test(shape),\n                    needsBox = hasBGImage,\n                    getCrispAdjust,\n                    updateBoxSize,\n                    updateTextPadding,\n                    boxAttr;\n\n                if (className) {\n                    wrapper.addClass('highcharts-' + className);\n                }\n\n\n                needsBox = hasBGImage;\n                getCrispAdjust = function() {\n                    return (strokeWidth || 0) % 2 / 2;\n                };\n\n\n\n                /**\n                 * This function runs after the label is added to the DOM (when the bounding box is\n                 * available), and after the text of the label is updated to detect the new bounding\n                 * box and reflect it in the border box.\n                 */\n                updateBoxSize = function() {\n                    var style = text.element.style,\n                        crispAdjust,\n                        attribs = {};\n\n                    bBox = (width === undefined || height === undefined || textAlign) && defined(text.textStr) &&\n                        text.getBBox(); //#3295 && 3514 box failure when string equals 0\n                    wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;\n                    wrapper.height = (height || bBox.height || 0) + 2 * padding;\n\n                    // Update the label-scoped y offset\n                    baselineOffset = padding + renderer.fontMetrics(style && style.fontSize, text).b;\n\n\n                    if (needsBox) {\n\n                        // Create the border box if it is not already present\n                        if (!box) {\n                            wrapper.box = box = renderer.symbols[shape] || hasBGImage ? // Symbol definition exists (#5324)\n                                renderer.symbol(shape) :\n                                renderer.rect();\n\n                            box.addClass(\n                                (className === 'button' ? '' : 'highcharts-label-box') + // Don't use label className for buttons\n                                (className ? ' highcharts-' + className + '-box' : '')\n                            );\n\n                            box.add(wrapper);\n\n                            crispAdjust = getCrispAdjust();\n                            attribs.x = crispAdjust;\n                            attribs.y = (baseline ? -baselineOffset : 0) + crispAdjust;\n                        }\n\n                        // Apply the box attributes\n                        attribs.width = Math.round(wrapper.width);\n                        attribs.height = Math.round(wrapper.height);\n\n                        box.attr(extend(attribs, deferredAttr));\n                        deferredAttr = {};\n                    }\n                };\n\n                /**\n                 * This function runs after setting text or padding, but only if padding is changed\n                 */\n                updateTextPadding = function() {\n                    var textX = paddingLeft + padding,\n                        textY;\n\n                    // determin y based on the baseline\n                    textY = baseline ? 0 : baselineOffset;\n\n                    // compensate for alignment\n                    if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {\n                        textX += {\n                            center: 0.5,\n                            right: 1\n                        }[textAlign] * (width - bBox.width);\n                    }\n\n                    // update if anything changed\n                    if (textX !== text.x || textY !== text.y) {\n                        text.attr('x', textX);\n                        if (textY !== undefined) {\n                            text.attr('y', textY);\n                        }\n                    }\n\n                    // record current values\n                    text.x = textX;\n                    text.y = textY;\n                };\n\n                /**\n                 * Set a box attribute, or defer it if the box is not yet created\n                 * @param {Object} key\n                 * @param {Object} value\n                 */\n                boxAttr = function(key, value) {\n                    if (box) {\n                        box.attr(key, value);\n                    } else {\n                        deferredAttr[key] = value;\n                    }\n                };\n\n                /**\n                 * After the text element is added, get the desired size of the border box\n                 * and add it before the text in the DOM.\n                 */\n                wrapper.onAdd = function() {\n                    text.add(wrapper);\n                    wrapper.attr({\n                        text: (str || str === 0) ? str : '', // alignment is available now // #3295: 0 not rendered if given as a value\n                        x: x,\n                        y: y\n                    });\n\n                    if (box && defined(anchorX)) {\n                        wrapper.attr({\n                            anchorX: anchorX,\n                            anchorY: anchorY\n                        });\n                    }\n                };\n\n                /*\n                 * Add specific attribute setters.\n                 */\n\n                // only change local variables\n                wrapper.widthSetter = function(value) {\n                    width = H.isNumber(value) ? value : null; // width:auto => null\n                };\n                wrapper.heightSetter = function(value) {\n                    height = value;\n                };\n                wrapper['text-alignSetter'] = function(value) {\n                    textAlign = value;\n                };\n                wrapper.paddingSetter = function(value) {\n                    if (defined(value) && value !== padding) {\n                        padding = wrapper.padding = value;\n                        updateTextPadding();\n                    }\n                };\n                wrapper.paddingLeftSetter = function(value) {\n                    if (defined(value) && value !== paddingLeft) {\n                        paddingLeft = value;\n                        updateTextPadding();\n                    }\n                };\n\n\n                // change local variable and prevent setting attribute on the group\n                wrapper.alignSetter = function(value) {\n                    value = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[value];\n                    if (value !== alignFactor) {\n                        alignFactor = value;\n                        if (bBox) { // Bounding box exists, means we're dynamically changing\n                            wrapper.attr({\n                                x: wrapperX\n                            }); // #5134\n                        }\n                    }\n                };\n\n                // apply these to the box and the text alike\n                wrapper.textSetter = function(value) {\n                    if (value !== undefined) {\n                        text.textSetter(value);\n                    }\n                    updateBoxSize();\n                    updateTextPadding();\n                };\n\n                // apply these to the box but not to the text\n                wrapper['stroke-widthSetter'] = function(value, key) {\n                    if (value) {\n                        needsBox = true;\n                    }\n                    strokeWidth = this['stroke-width'] = value;\n                    boxAttr(key, value);\n                };\n\n                wrapper.strokeSetter = wrapper.fillSetter = wrapper.rSetter = function(value, key) {\n                    if (key === 'fill' && value) {\n                        needsBox = true;\n                    }\n                    boxAttr(key, value);\n                };\n\n                wrapper.anchorXSetter = function(value, key) {\n                    anchorX = wrapper.anchorX = value;\n                    boxAttr(key, Math.round(value) - getCrispAdjust() - wrapperX);\n                };\n                wrapper.anchorYSetter = function(value, key) {\n                    anchorY = wrapper.anchorY = value;\n                    boxAttr(key, value - wrapperY);\n                };\n\n                // rename attributes\n                wrapper.xSetter = function(value) {\n                    wrapper.x = value; // for animation getter\n                    if (alignFactor) {\n                        value -= alignFactor * ((width || bBox.width) + 2 * padding);\n                    }\n                    wrapperX = Math.round(value);\n                    wrapper.attr('translateX', wrapperX);\n                };\n                wrapper.ySetter = function(value) {\n                    wrapperY = wrapper.y = Math.round(value);\n                    wrapper.attr('translateY', wrapperY);\n                };\n\n                // Redirect certain methods to either the box or the text\n                var baseCss = wrapper.css;\n                return extend(wrapper, {\n                    /**\n                     * Pick up some properties and apply them to the text instead of the\n                     * wrapper.\n                     * @ignore\n                     */\n                    css: function(styles) {\n                        if (styles) {\n                            var textStyles = {};\n                            styles = merge(styles); // create a copy to avoid altering the original object (#537)\n                            each(wrapper.textProps, function(prop) {\n                                if (styles[prop] !== undefined) {\n                                    textStyles[prop] = styles[prop];\n                                    delete styles[prop];\n                                }\n                            });\n                            text.css(textStyles);\n                        }\n                        return baseCss.call(wrapper, styles);\n                    },\n                    /**\n                     * Return the bounding box of the box, not the group.\n                     * @ignore\n                     */\n                    getBBox: function() {\n                        return {\n                            width: bBox.width + 2 * padding,\n                            height: bBox.height + 2 * padding,\n                            x: bBox.x - padding,\n                            y: bBox.y - padding\n                        };\n                    },\n\n                    /**\n                     * Apply the shadow to the box.\n                     * @ignore\n                     */\n                    shadow: function(b) {\n                        if (b) {\n                            updateBoxSize();\n                            if (box) {\n                                box.shadow(b);\n                            }\n                        }\n                        return wrapper;\n                    },\n\n                    /**\n                     * Destroy and release memory.\n                     * @ignore\n                     */\n                    destroy: function() {\n\n                        // Added by button implementation\n                        removeEvent(wrapper.element, 'mouseenter');\n                        removeEvent(wrapper.element, 'mouseleave');\n\n                        if (text) {\n                            text = text.destroy();\n                        }\n                        if (box) {\n                            box = box.destroy();\n                        }\n                        // Call base implementation to destroy the rest\n                        SVGElement.prototype.destroy.call(wrapper);\n\n                        // Release local pointers (#1298)\n                        wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;\n                    }\n                });\n            }\n        }); // end SVGRenderer\n\n\n        // general renderer\n        H.Renderer = SVGRenderer;\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var attr = H.attr,\n            createElement = H.createElement,\n            css = H.css,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isWebKit = H.isWebKit,\n            pInt = H.pInt,\n            SVGElement = H.SVGElement,\n            SVGRenderer = H.SVGRenderer,\n            win = H.win,\n            wrap = H.wrap;\n\n        // Extend SvgElement for useHTML option\n        extend(SVGElement.prototype, /** @lends SVGElement.prototype */ {\n            /**\n             * Apply CSS to HTML elements. This is used in text within SVG rendering and\n             * by the VML renderer\n             */\n            htmlCss: function(styles) {\n                var wrapper = this,\n                    element = wrapper.element,\n                    textWidth = styles && element.tagName === 'SPAN' && styles.width;\n\n                if (textWidth) {\n                    delete styles.width;\n                    wrapper.textWidth = textWidth;\n                    wrapper.updateTransform();\n                }\n                if (styles && styles.textOverflow === 'ellipsis') {\n                    styles.whiteSpace = 'nowrap';\n                    styles.overflow = 'hidden';\n                }\n                wrapper.styles = extend(wrapper.styles, styles);\n                css(wrapper.element, styles);\n\n                return wrapper;\n            },\n\n            /**\n             * VML and useHTML method for calculating the bounding box based on offsets\n             * @param {Boolean} refresh Whether to force a fresh value from the DOM or to\n             * use the cached value\n             *\n             * @return {Object} A hash containing values for x, y, width and height\n             */\n\n            htmlGetBBox: function() {\n                var wrapper = this,\n                    element = wrapper.element;\n\n                // faking getBBox in exported SVG in legacy IE\n                // faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)\n                if (element.nodeName === 'text') {\n                    element.style.position = 'absolute';\n                }\n\n                return {\n                    x: element.offsetLeft,\n                    y: element.offsetTop,\n                    width: element.offsetWidth,\n                    height: element.offsetHeight\n                };\n            },\n\n            /**\n             * VML override private method to update elements based on internal\n             * properties based on SVG transform\n             */\n            htmlUpdateTransform: function() {\n                // aligning non added elements is expensive\n                if (!this.added) {\n                    this.alignOnAdd = true;\n                    return;\n                }\n\n                var wrapper = this,\n                    renderer = wrapper.renderer,\n                    elem = wrapper.element,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    x = wrapper.x || 0,\n                    y = wrapper.y || 0,\n                    align = wrapper.textAlign || 'left',\n                    alignCorrection = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[align],\n                    styles = wrapper.styles;\n\n                // apply translate\n                css(elem, {\n                    marginLeft: translateX,\n                    marginTop: translateY\n                });\n\n\n                if (wrapper.shadows) { // used in labels/tooltip\n                    each(wrapper.shadows, function(shadow) {\n                        css(shadow, {\n                            marginLeft: translateX + 1,\n                            marginTop: translateY + 1\n                        });\n                    });\n                }\n\n\n                // apply inversion\n                if (wrapper.inverted) { // wrapper is a group\n                    each(elem.childNodes, function(child) {\n                        renderer.invertChild(child, elem);\n                    });\n                }\n\n                if (elem.tagName === 'SPAN') {\n\n                    var rotation = wrapper.rotation,\n                        baseline,\n                        textWidth = pInt(wrapper.textWidth),\n                        whiteSpace = styles && styles.whiteSpace,\n                        currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth, wrapper.textAlign].join(',');\n\n                    if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed\n\n\n                        baseline = renderer.fontMetrics(elem.style.fontSize).b;\n\n                        // Renderer specific handling of span rotation\n                        if (defined(rotation)) {\n                            wrapper.setSpanRotation(rotation, alignCorrection, baseline);\n                        }\n\n                        // Reset multiline/ellipsis in order to read width (#4928, #5417)\n                        css(elem, {\n                            width: '',\n                            whiteSpace: whiteSpace || 'nowrap'\n                        });\n\n                        // Update textWidth\n                        if (elem.offsetWidth > textWidth && /[ \\-]/.test(elem.textContent || elem.innerText)) { // #983, #1254\n                            css(elem, {\n                                width: textWidth + 'px',\n                                display: 'block',\n                                whiteSpace: whiteSpace || 'normal' // #3331\n                            });\n                        }\n\n\n                        wrapper.getSpanCorrection(elem.offsetWidth, baseline, alignCorrection, rotation, align);\n                    }\n\n                    // apply position with correction\n                    css(elem, {\n                        left: (x + (wrapper.xCorr || 0)) + 'px',\n                        top: (y + (wrapper.yCorr || 0)) + 'px'\n                    });\n\n                    // force reflow in webkit to apply the left and top on useHTML element (#1249)\n                    if (isWebKit) {\n                        baseline = elem.offsetHeight; // assigned to baseline for lint purpose\n                    }\n\n                    // record current text transform\n                    wrapper.cTT = currentTextTransform;\n                }\n            },\n\n            /**\n             * Set the rotation of an individual HTML span\n             */\n            setSpanRotation: function(rotation, alignCorrection, baseline) {\n                var rotationStyle = {},\n                    cssTransformKey = isMS ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : win.opera ? '-o-transform' : '';\n\n                rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';\n                rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';\n                css(this.element, rotationStyle);\n            },\n\n            /**\n             * Get the correction in X and Y positioning as the element is rotated.\n             */\n            getSpanCorrection: function(width, baseline, alignCorrection) {\n                this.xCorr = -width * alignCorrection;\n                this.yCorr = -baseline;\n            }\n        });\n\n        // Extend SvgRenderer for useHTML option.\n        extend(SVGRenderer.prototype, /** @lends SVGRenderer.prototype */ {\n            /**\n             * Create HTML text node. This is used by the VML renderer as well as the SVG\n             * renderer through the useHTML option.\n             *\n             * @param {String} str\n             * @param {Number} x\n             * @param {Number} y\n             */\n            html: function(str, x, y) {\n                var wrapper = this.createElement('span'),\n                    element = wrapper.element,\n                    renderer = wrapper.renderer,\n                    isSVG = renderer.isSVG,\n                    addSetters = function(element, style) {\n                        // These properties are set as attributes on the SVG group, and as\n                        // identical CSS properties on the div. (#3542)\n                        each(['opacity', 'visibility'], function(prop) {\n                            wrap(element, prop + 'Setter', function(proceed, value, key, elem) {\n                                proceed.call(this, value, key, elem);\n                                style[key] = value;\n                            });\n                        });\n                    };\n\n                // Text setter\n                wrapper.textSetter = function(value) {\n                    if (value !== element.innerHTML) {\n                        delete this.bBox;\n                    }\n                    element.innerHTML = this.textStr = value;\n                    wrapper.htmlUpdateTransform();\n                };\n\n                // Add setters for the element itself (#4938)\n                if (isSVG) { // #4938, only for HTML within SVG\n                    addSetters(wrapper, wrapper.element.style);\n                }\n\n                // Various setters which rely on update transform\n                wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function(value, key) {\n                    if (key === 'align') {\n                        key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.\n                    }\n                    wrapper[key] = value;\n                    wrapper.htmlUpdateTransform();\n                };\n\n                // Set the default attributes\n                wrapper\n                    .attr({\n                        text: str,\n                        x: Math.round(x),\n                        y: Math.round(y)\n                    })\n                    .css({\n\n                        fontFamily: this.style.fontFamily,\n                        fontSize: this.style.fontSize,\n\n                        position: 'absolute'\n                    });\n\n                // Keep the whiteSpace style outside the wrapper.styles collection\n                element.style.whiteSpace = 'nowrap';\n\n                // Use the HTML specific .css method\n                wrapper.css = wrapper.htmlCss;\n\n                // This is specific for HTML within SVG\n                if (isSVG) {\n                    wrapper.add = function(svgGroupWrapper) {\n\n                        var htmlGroup,\n                            container = renderer.box.parentNode,\n                            parentGroup,\n                            parents = [];\n\n                        this.parentGroup = svgGroupWrapper;\n\n                        // Create a mock group to hold the HTML elements\n                        if (svgGroupWrapper) {\n                            htmlGroup = svgGroupWrapper.div;\n                            if (!htmlGroup) {\n\n                                // Read the parent chain into an array and read from top down\n                                parentGroup = svgGroupWrapper;\n                                while (parentGroup) {\n\n                                    parents.push(parentGroup);\n\n                                    // Move up to the next parent group\n                                    parentGroup = parentGroup.parentGroup;\n                                }\n\n                                // Ensure dynamically updating position when any parent is translated\n                                each(parents.reverse(), function(parentGroup) {\n                                    var htmlGroupStyle,\n                                        cls = attr(parentGroup.element, 'class');\n\n                                    if (cls) {\n                                        cls = {\n                                            className: cls\n                                        };\n                                    } // else null\n\n                                    // Create a HTML div and append it to the parent div to emulate\n                                    // the SVG group structure\n                                    htmlGroup = parentGroup.div = parentGroup.div || createElement('div', cls, {\n                                        position: 'absolute',\n                                        left: (parentGroup.translateX || 0) + 'px',\n                                        top: (parentGroup.translateY || 0) + 'px',\n                                        display: parentGroup.display,\n                                        opacity: parentGroup.opacity, // #5075\n                                        pointerEvents: parentGroup.styles && parentGroup.styles.pointerEvents // #5595\n                                    }, htmlGroup || container); // the top group is appended to container\n\n                                    // Shortcut\n                                    htmlGroupStyle = htmlGroup.style;\n\n                                    // Set listeners to update the HTML div's position whenever the SVG group\n                                    // position is changed\n                                    extend(parentGroup, {\n                                        on: function() {\n                                            wrapper.on.apply({\n                                                element: parents[0].div\n                                            }, arguments);\n                                            return parentGroup;\n                                        },\n                                        translateXSetter: function(value, key) {\n                                            htmlGroupStyle.left = value + 'px';\n                                            parentGroup[key] = value;\n                                            parentGroup.doTransform = true;\n                                        },\n                                        translateYSetter: function(value, key) {\n                                            htmlGroupStyle.top = value + 'px';\n                                            parentGroup[key] = value;\n                                            parentGroup.doTransform = true;\n                                        }\n                                    });\n                                    addSetters(parentGroup, htmlGroupStyle);\n                                });\n\n                            }\n                        } else {\n                            htmlGroup = container;\n                        }\n\n                        htmlGroup.appendChild(element);\n\n                        // Shared with VML:\n                        wrapper.added = true;\n                        if (wrapper.alignOnAdd) {\n                            wrapper.htmlUpdateTransform();\n                        }\n\n                        return wrapper;\n                    };\n                }\n                return wrapper;\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var VMLRenderer,\n            VMLRendererExtension,\n            VMLElement,\n\n            createElement = H.createElement,\n            css = H.css,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            discardElement = H.discardElement,\n            doc = H.doc,\n            each = H.each,\n            erase = H.erase,\n            extend = H.extend,\n            extendClass = H.extendClass,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            svg = H.svg,\n            SVGElement = H.SVGElement,\n            SVGRenderer = H.SVGRenderer,\n            win = H.win;\n\n        /* ****************************************************************************\n         *                                                                            *\n         * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE                              *\n         *                                                                            *\n         * For applications and websites that don't need IE support, like platform    *\n         * targeted mobile apps and web apps, this code can be removed.               *\n         *                                                                            *\n         *****************************************************************************/\n\n        /**\n         * @constructor\n         */\n        if (!svg) {\n\n            /**\n             * The VML element wrapper.\n             */\n            VMLElement = {\n\n                docMode8: doc && doc.documentMode === 8,\n\n                /**\n                 * Initialize a new VML element wrapper. It builds the markup as a string\n                 * to minimize DOM traffic.\n                 * @param {Object} renderer\n                 * @param {Object} nodeName\n                 */\n                init: function(renderer, nodeName) {\n                    var wrapper = this,\n                        markup = ['<', nodeName, ' filled=\"f\" stroked=\"f\"'],\n                        style = ['position: ', 'absolute', ';'],\n                        isDiv = nodeName === 'div';\n\n                    // divs and shapes need size\n                    if (nodeName === 'shape' || isDiv) {\n                        style.push('left:0;top:0;width:1px;height:1px;');\n                    }\n                    style.push('visibility: ', isDiv ? 'hidden' : 'visible');\n\n                    markup.push(' style=\"', style.join(''), '\"/>');\n\n                    // create element with default attributes and style\n                    if (nodeName) {\n                        markup = isDiv || nodeName === 'span' || nodeName === 'img' ?\n                            markup.join('') :\n                            renderer.prepVML(markup);\n                        wrapper.element = createElement(markup);\n                    }\n\n                    wrapper.renderer = renderer;\n                },\n\n                /**\n                 * Add the node to the given parent\n                 * @param {Object} parent\n                 */\n                add: function(parent) {\n                    var wrapper = this,\n                        renderer = wrapper.renderer,\n                        element = wrapper.element,\n                        box = renderer.box,\n                        inverted = parent && parent.inverted,\n\n                        // get the parent node\n                        parentNode = parent ?\n                        parent.element || parent :\n                        box;\n\n                    if (parent) {\n                        this.parentGroup = parent;\n                    }\n\n                    // if the parent group is inverted, apply inversion on all children\n                    if (inverted) { // only on groups\n                        renderer.invertChild(element, parentNode);\n                    }\n\n                    // append it\n                    parentNode.appendChild(element);\n\n                    // align text after adding to be able to read offset\n                    wrapper.added = true;\n                    if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {\n                        wrapper.updateTransform();\n                    }\n\n                    // fire an event for internal hooks\n                    if (wrapper.onAdd) {\n                        wrapper.onAdd();\n                    }\n\n                    // IE8 Standards can't set the class name before the element is appended\n                    if (this.className) {\n                        this.attr('class', this.className);\n                    }\n\n                    return wrapper;\n                },\n\n                /**\n                 * VML always uses htmlUpdateTransform\n                 */\n                updateTransform: SVGElement.prototype.htmlUpdateTransform,\n\n                /**\n                 * Set the rotation of a span with oldIE's filter\n                 */\n                setSpanRotation: function() {\n                    // Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented\n                    // but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+\n                    // has support for CSS3 transform. The getBBox method also needs to be updated\n                    // to compensate for the rotation, like it currently does for SVG.\n                    // Test case: http://jsfiddle.net/highcharts/Ybt44/\n\n                    var rotation = this.rotation,\n                        costheta = Math.cos(rotation * deg2rad),\n                        sintheta = Math.sin(rotation * deg2rad);\n\n                    css(this.element, {\n                        filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,\n                            ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,\n                            ', sizingMethod=\\'auto expand\\')'\n                        ].join('') : 'none'\n                    });\n                },\n\n                /**\n                 * Get the positioning correction for the span after rotating.\n                 */\n                getSpanCorrection: function(width, baseline, alignCorrection, rotation, align) {\n\n                    var costheta = rotation ? Math.cos(rotation * deg2rad) : 1,\n                        sintheta = rotation ? Math.sin(rotation * deg2rad) : 0,\n                        height = pick(this.elemHeight, this.element.offsetHeight),\n                        quad,\n                        nonLeft = align && align !== 'left';\n\n                    // correct x and y\n                    this.xCorr = costheta < 0 && -width;\n                    this.yCorr = sintheta < 0 && -height;\n\n                    // correct for baseline and corners spilling out after rotation\n                    quad = costheta * sintheta < 0;\n                    this.xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);\n                    this.yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);\n                    // correct for the length/height of the text\n                    if (nonLeft) {\n                        this.xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);\n                        if (rotation) {\n                            this.yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);\n                        }\n                        css(this.element, {\n                            textAlign: align\n                        });\n                    }\n                },\n\n                /**\n                 * Converts a subset of an SVG path definition to its VML counterpart. Takes an array\n                 * as the parameter and returns a string.\n                 */\n                pathToVML: function(value) {\n                    // convert paths\n                    var i = value.length,\n                        path = [];\n\n                    while (i--) {\n\n                        // Multiply by 10 to allow subpixel precision.\n                        // Substracting half a pixel seems to make the coordinates\n                        // align with SVG, but this hasn't been tested thoroughly\n                        if (isNumber(value[i])) {\n                            path[i] = Math.round(value[i] * 10) - 5;\n                        } else if (value[i] === 'Z') { // close the path\n                            path[i] = 'x';\n                        } else {\n                            path[i] = value[i];\n\n                            // When the start X and end X coordinates of an arc are too close,\n                            // they are rounded to the same value above. In this case, substract or\n                            // add 1 from the end X and Y positions. #186, #760, #1371, #1410.\n                            if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {\n                                // Start and end X\n                                if (path[i + 5] === path[i + 7]) {\n                                    path[i + 7] += value[i + 7] > value[i + 5] ? 1 : -1;\n                                }\n                                // Start and end Y\n                                if (path[i + 6] === path[i + 8]) {\n                                    path[i + 8] += value[i + 8] > value[i + 6] ? 1 : -1;\n                                }\n                            }\n                        }\n                    }\n\n\n                    // Loop up again to handle path shortcuts (#2132)\n                    /*while (i++ < path.length) {\n                    \tif (path[i] === 'H') { // horizontal line to\n                    \t\tpath[i] = 'L';\n                    \t\tpath.splice(i + 2, 0, path[i - 1]);\n                    \t} else if (path[i] === 'V') { // vertical line to\n                    \t\tpath[i] = 'L';\n                    \t\tpath.splice(i + 1, 0, path[i - 2]);\n                    \t}\n                    }*/\n                    return path.join(' ') || 'x';\n                },\n\n                /**\n                 * Set the element's clipping to a predefined rectangle\n                 *\n                 * @param {String} id The id of the clip rectangle\n                 */\n                clip: function(clipRect) {\n                    var wrapper = this,\n                        clipMembers,\n                        cssRet;\n\n                    if (clipRect) {\n                        clipMembers = clipRect.members;\n                        erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)\n                        clipMembers.push(wrapper);\n                        wrapper.destroyClip = function() {\n                            erase(clipMembers, wrapper);\n                        };\n                        cssRet = clipRect.getCSS(wrapper);\n\n                    } else {\n                        if (wrapper.destroyClip) {\n                            wrapper.destroyClip();\n                        }\n                        cssRet = {\n                            clip: wrapper.docMode8 ? 'inherit' : 'rect(auto)'\n                        }; // #1214\n                    }\n\n                    return wrapper.css(cssRet);\n\n                },\n\n                /**\n                 * Set styles for the element\n                 * @param {Object} styles\n                 */\n                css: SVGElement.prototype.htmlCss,\n\n                /**\n                 * Removes a child either by removeChild or move to garbageBin.\n                 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\n                 */\n                safeRemoveChild: function(element) {\n                    // discardElement will detach the node from its parent before attaching it\n                    // to the garbage bin. Therefore it is important that the node is attached and have parent.\n                    if (element.parentNode) {\n                        discardElement(element);\n                    }\n                },\n\n                /**\n                 * Extend element.destroy by removing it from the clip members array\n                 */\n                destroy: function() {\n                    if (this.destroyClip) {\n                        this.destroyClip();\n                    }\n\n                    return SVGElement.prototype.destroy.apply(this);\n                },\n\n                /**\n                 * Add an event listener. VML override for normalizing event parameters.\n                 * @param {String} eventType\n                 * @param {Function} handler\n                 */\n                on: function(eventType, handler) {\n                    // simplest possible event model for internal use\n                    this.element['on' + eventType] = function() {\n                        var evt = win.event;\n                        evt.target = evt.srcElement;\n                        handler(evt);\n                    };\n                    return this;\n                },\n\n                /**\n                 * In stacked columns, cut off the shadows so that they don't overlap\n                 */\n                cutOffPath: function(path, length) {\n\n                    var len;\n\n                    path = path.split(/[ ,]/); // The extra comma tricks the trailing comma remover in \"gulp scripts\" task\n                    len = path.length;\n\n                    if (len === 9 || len === 11) {\n                        path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;\n                    }\n                    return path.join(' ');\n                },\n\n                /**\n                 * Apply a drop shadow by copying elements and giving them different strokes\n                 * @param {Boolean|Object} shadowOptions\n                 */\n                shadow: function(shadowOptions, group, cutOff) {\n                    var shadows = [],\n                        i,\n                        element = this.element,\n                        renderer = this.renderer,\n                        shadow,\n                        elemStyle = element.style,\n                        markup,\n                        path = element.path,\n                        strokeWidth,\n                        modifiedPath,\n                        shadowWidth,\n                        shadowElementOpacity;\n\n                    // some times empty paths are not strings\n                    if (path && typeof path.value !== 'string') {\n                        path = 'x';\n                    }\n                    modifiedPath = path;\n\n                    if (shadowOptions) {\n                        shadowWidth = pick(shadowOptions.width, 3);\n                        shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n                        for (i = 1; i <= 3; i++) {\n\n                            strokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n\n                            // Cut off shadows for stacked column items\n                            if (cutOff) {\n                                modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);\n                            }\n\n                            markup = ['<shape isShadow=\"true\" strokeweight=\"', strokeWidth,\n                                '\" filled=\"false\" path=\"', modifiedPath,\n                                '\" coordsize=\"10 10\" style=\"', element.style.cssText, '\" />'\n                            ];\n\n                            shadow = createElement(renderer.prepVML(markup),\n                                null, {\n                                    left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),\n                                    top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)\n                                }\n                            );\n                            if (cutOff) {\n                                shadow.cutOff = strokeWidth + 1;\n                            }\n\n                            // apply the opacity\n                            markup = [\n                                '<stroke color=\"',\n                                shadowOptions.color || '#000000',\n                                '\" opacity=\"', shadowElementOpacity * i, '\"/>'\n                            ];\n                            createElement(renderer.prepVML(markup), null, null, shadow);\n\n\n                            // insert it\n                            if (group) {\n                                group.element.appendChild(shadow);\n                            } else {\n                                element.parentNode.insertBefore(shadow, element);\n                            }\n\n                            // record it\n                            shadows.push(shadow);\n\n                        }\n\n                        this.shadows = shadows;\n                    }\n                    return this;\n                },\n                updateShadows: noop, // Used in SVG only\n\n                setAttr: function(key, value) {\n                    if (this.docMode8) { // IE8 setAttribute bug\n                        this.element[key] = value;\n                    } else {\n                        this.element.setAttribute(key, value);\n                    }\n                },\n                classSetter: function(value) {\n                    // IE8 Standards mode has problems retrieving the className unless set like this.\n                    // IE8 Standards can't set the class name before the element is appended.\n                    (this.added ? this.element : this).className = value;\n                },\n                dashstyleSetter: function(value, key, element) {\n                    var strokeElem = element.getElementsByTagName('stroke')[0] ||\n                        createElement(this.renderer.prepVML(['<stroke/>']), null, null, element);\n                    strokeElem[key] = value || 'solid';\n                    this[key] = value;\n                    /* because changing stroke-width will change the dash length\n\t\t\t\tand cause an epileptic effect */\n                },\n                dSetter: function(value, key, element) {\n                    var i,\n                        shadows = this.shadows;\n                    value = value || [];\n                    this.d = value.join && value.join(' '); // used in getter for animation\n\n                    element.path = value = this.pathToVML(value);\n\n                    // update shadows\n                    if (shadows) {\n                        i = shadows.length;\n                        while (i--) {\n                            shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;\n                        }\n                    }\n                    this.setAttr(key, value);\n                },\n                fillSetter: function(value, key, element) {\n                    var nodeName = element.nodeName;\n                    if (nodeName === 'SPAN') { // text color\n                        element.style.color = value;\n                    } else if (nodeName !== 'IMG') { // #1336\n                        element.filled = value !== 'none';\n                        this.setAttr('fillcolor', this.renderer.color(value, element, key, this));\n                    }\n                },\n                'fill-opacitySetter': function(value, key, element) {\n                    createElement(\n                        this.renderer.prepVML(['<', key.split('-')[0], ' opacity=\"', value, '\"/>']),\n                        null,\n                        null,\n                        element\n                    );\n                },\n                opacitySetter: noop, // Don't bother - animation is too slow and filters introduce artifacts\n                rotationSetter: function(value, key, element) {\n                    var style = element.style;\n                    this[key] = style[key] = value; // style is for #1873\n\n                    // Correction for the 1x1 size of the shape container. Used in gauge needles.\n                    style.left = -Math.round(Math.sin(value * deg2rad) + 1) + 'px';\n                    style.top = Math.round(Math.cos(value * deg2rad)) + 'px';\n                },\n                strokeSetter: function(value, key, element) {\n                    this.setAttr('strokecolor', this.renderer.color(value, element, key, this));\n                },\n                'stroke-widthSetter': function(value, key, element) {\n                    element.stroked = !!value; // VML \"stroked\" attribute\n                    this[key] = value; // used in getter, issue #113\n                    if (isNumber(value)) {\n                        value += 'px';\n                    }\n                    this.setAttr('strokeweight', value);\n                },\n                titleSetter: function(value, key) {\n                    this.setAttr(key, value);\n                },\n                visibilitySetter: function(value, key, element) {\n\n                    // Handle inherited visibility\n                    if (value === 'inherit') {\n                        value = 'visible';\n                    }\n\n                    // Let the shadow follow the main element\n                    if (this.shadows) {\n                        each(this.shadows, function(shadow) {\n                            shadow.style[key] = value;\n                        });\n                    }\n\n                    // Instead of toggling the visibility CSS property, move the div out of the viewport.\n                    // This works around #61 and #586\n                    if (element.nodeName === 'DIV') {\n                        value = value === 'hidden' ? '-999em' : 0;\n\n                        // In order to redraw, IE7 needs the div to be visible when tucked away\n                        // outside the viewport. So the visibility is actually opposite of\n                        // the expected value. This applies to the tooltip only.\n                        if (!this.docMode8) {\n                            element.style[key] = value ? 'visible' : 'hidden';\n                        }\n                        key = 'top';\n                    }\n                    element.style[key] = value;\n                },\n                xSetter: function(value, key, element) {\n                    this[key] = value; // used in getter\n\n                    if (key === 'x') {\n                        key = 'left';\n                    } else if (key === 'y') {\n                        key = 'top';\n                    }\n                    /* else {\n                    \t\t\t\tvalue = Math.max(0, value); // don't set width or height below zero (#311)\n                    \t\t\t}*/\n\n                    // clipping rectangle special\n                    if (this.updateClipping) {\n                        this[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'\n                        this.updateClipping();\n                    } else {\n                        // normal\n                        element.style[key] = value;\n                    }\n                },\n                zIndexSetter: function(value, key, element) {\n                    element.style[key] = value;\n                }\n            };\n            VMLElement['stroke-opacitySetter'] = VMLElement['fill-opacitySetter'];\n            H.VMLElement = VMLElement = extendClass(SVGElement, VMLElement);\n\n            // Some shared setters\n            VMLElement.prototype.ySetter =\n                VMLElement.prototype.widthSetter =\n                VMLElement.prototype.heightSetter =\n                VMLElement.prototype.xSetter;\n\n\n            /**\n             * The VML renderer\n             */\n            VMLRendererExtension = { // inherit SVGRenderer\n\n                Element: VMLElement,\n                isIE8: win.navigator.userAgent.indexOf('MSIE 8.0') > -1,\n\n\n                /**\n                 * Initialize the VMLRenderer\n                 * @param {Object} container\n                 * @param {Number} width\n                 * @param {Number} height\n                 */\n                init: function(container, width, height) {\n                    var renderer = this,\n                        boxWrapper,\n                        box,\n                        css;\n\n                    renderer.alignedObjects = [];\n\n                    boxWrapper = renderer.createElement('div')\n                        .css({\n                            position: 'relative'\n                        });\n                    box = boxWrapper.element;\n                    container.appendChild(boxWrapper.element);\n\n\n                    // generate the containing box\n                    renderer.isVML = true;\n                    renderer.box = box;\n                    renderer.boxWrapper = boxWrapper;\n                    renderer.gradients = {};\n                    renderer.cache = {}; // Cache for numerical bounding boxes\n                    renderer.cacheKeys = [];\n                    renderer.imgCount = 0;\n\n\n                    renderer.setSize(width, height, false);\n\n                    // The only way to make IE6 and IE7 print is to use a global namespace. However,\n                    // with IE8 the only way to make the dynamic shapes visible in screen and print mode\n                    // seems to be to add the xmlns attribute and the behaviour style inline.\n                    if (!doc.namespaces.hcv) {\n\n                        doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');\n\n                        // Setup default CSS (#2153, #2368, #2384)\n                        css = 'hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke' +\n                            '{ behavior:url(#default#VML); display: inline-block; } ';\n                        try {\n                            doc.createStyleSheet().cssText = css;\n                        } catch (e) {\n                            doc.styleSheets[0].cssText += css;\n                        }\n\n                    }\n                },\n\n\n                /**\n                 * Detect whether the renderer is hidden. This happens when one of the parent elements\n                 * has display: none\n                 */\n                isHidden: function() {\n                    return !this.box.offsetWidth;\n                },\n\n                /**\n                 * Define a clipping rectangle. In VML it is accomplished by storing the values\n                 * for setting the CSS style to all associated members.\n                 *\n                 * @param {Number} x\n                 * @param {Number} y\n                 * @param {Number} width\n                 * @param {Number} height\n                 */\n                clipRect: function(x, y, width, height) {\n\n                    // create a dummy element\n                    var clipRect = this.createElement(),\n                        isObj = isObject(x);\n\n                    // mimic a rectangle with its style object for automatic updating in attr\n                    return extend(clipRect, {\n                        members: [],\n                        count: 0,\n                        left: (isObj ? x.x : x) + 1,\n                        top: (isObj ? x.y : y) + 1,\n                        width: (isObj ? x.width : width) - 1,\n                        height: (isObj ? x.height : height) - 1,\n                        getCSS: function(wrapper) {\n                            var element = wrapper.element,\n                                nodeName = element.nodeName,\n                                isShape = nodeName === 'shape',\n                                inverted = wrapper.inverted,\n                                rect = this,\n                                top = rect.top - (isShape ? element.offsetTop : 0),\n                                left = rect.left,\n                                right = left + rect.width,\n                                bottom = top + rect.height,\n                                ret = {\n                                    clip: 'rect(' +\n                                        Math.round(inverted ? left : top) + 'px,' +\n                                        Math.round(inverted ? bottom : right) + 'px,' +\n                                        Math.round(inverted ? right : bottom) + 'px,' +\n                                        Math.round(inverted ? top : left) + 'px)'\n                                };\n\n                            // issue 74 workaround\n                            if (!inverted && wrapper.docMode8 && nodeName === 'DIV') {\n                                extend(ret, {\n                                    width: right + 'px',\n                                    height: bottom + 'px'\n                                });\n                            }\n                            return ret;\n                        },\n\n                        // used in attr and animation to update the clipping of all members\n                        updateClipping: function() {\n                            each(clipRect.members, function(member) {\n                                // Member.element is falsy on deleted series, like in\n                                // stock/members/series-remove demo. Should be removed\n                                // from members, but this will do.\n                                if (member.element) {\n                                    member.css(clipRect.getCSS(member));\n                                }\n                            });\n                        }\n                    });\n\n                },\n\n\n                /**\n                 * Take a color and return it if it's a string, make it a gradient if it's a\n                 * gradient configuration object, and apply opacity.\n                 *\n                 * @param {Object} color The color or config object\n                 */\n                color: function(color, elem, prop, wrapper) {\n                    var renderer = this,\n                        colorObject,\n                        regexRgba = /^rgba/,\n                        markup,\n                        fillType,\n                        ret = 'none';\n\n                    // Check for linear or radial gradient\n                    if (color && color.linearGradient) {\n                        fillType = 'gradient';\n                    } else if (color && color.radialGradient) {\n                        fillType = 'pattern';\n                    }\n\n\n                    if (fillType) {\n\n                        var stopColor,\n                            stopOpacity,\n                            gradient = color.linearGradient || color.radialGradient,\n                            x1,\n                            y1,\n                            x2,\n                            y2,\n                            opacity1,\n                            opacity2,\n                            color1,\n                            color2,\n                            fillAttr = '',\n                            stops = color.stops,\n                            firstStop,\n                            lastStop,\n                            colors = [],\n                            addFillNode = function() {\n                                // Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2\n                                // are reversed.\n                                markup = ['<fill colors=\"' + colors.join(',') +\n                                    '\" opacity=\"', opacity2, '\" o:opacity2=\"',\n                                    opacity1, '\" type=\"', fillType, '\" ', fillAttr,\n                                    'focus=\"100%\" method=\"any\" />'\n                                ];\n                                createElement(renderer.prepVML(markup), null, null, elem);\n                            };\n\n                        // Extend from 0 to 1\n                        firstStop = stops[0];\n                        lastStop = stops[stops.length - 1];\n                        if (firstStop[0] > 0) {\n                            stops.unshift([\n                                0,\n                                firstStop[1]\n                            ]);\n                        }\n                        if (lastStop[0] < 1) {\n                            stops.push([\n                                1,\n                                lastStop[1]\n                            ]);\n                        }\n\n                        // Compute the stops\n                        each(stops, function(stop, i) {\n                            if (regexRgba.test(stop[1])) {\n                                colorObject = H.color(stop[1]);\n                                stopColor = colorObject.get('rgb');\n                                stopOpacity = colorObject.get('a');\n                            } else {\n                                stopColor = stop[1];\n                                stopOpacity = 1;\n                            }\n\n                            // Build the color attribute\n                            colors.push((stop[0] * 100) + '% ' + stopColor);\n\n                            // Only start and end opacities are allowed, so we use the first and the last\n                            if (!i) {\n                                opacity1 = stopOpacity;\n                                color2 = stopColor;\n                            } else {\n                                opacity2 = stopOpacity;\n                                color1 = stopColor;\n                            }\n                        });\n\n                        // Apply the gradient to fills only.\n                        if (prop === 'fill') {\n\n                            // Handle linear gradient angle\n                            if (fillType === 'gradient') {\n                                x1 = gradient.x1 || gradient[0] || 0;\n                                y1 = gradient.y1 || gradient[1] || 0;\n                                x2 = gradient.x2 || gradient[2] || 0;\n                                y2 = gradient.y2 || gradient[3] || 0;\n                                fillAttr = 'angle=\"' + (90 - Math.atan(\n                                    (y2 - y1) / // y vector\n                                    (x2 - x1) // x vector\n                                ) * 180 / Math.PI) + '\"';\n\n                                addFillNode();\n\n                                // Radial (circular) gradient\n                            } else {\n\n                                var r = gradient.r,\n                                    sizex = r * 2,\n                                    sizey = r * 2,\n                                    cx = gradient.cx,\n                                    cy = gradient.cy,\n                                    radialReference = elem.radialReference,\n                                    bBox,\n                                    applyRadialGradient = function() {\n                                        if (radialReference) {\n                                            bBox = wrapper.getBBox();\n                                            cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;\n                                            cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;\n                                            sizex *= radialReference[2] / bBox.width;\n                                            sizey *= radialReference[2] / bBox.height;\n                                        }\n                                        fillAttr = 'src=\"' + H.getOptions().global.VMLRadialGradientURL + '\" ' +\n                                            'size=\"' + sizex + ',' + sizey + '\" ' +\n                                            'origin=\"0.5,0.5\" ' +\n                                            'position=\"' + cx + ',' + cy + '\" ' +\n                                            'color2=\"' + color2 + '\" ';\n\n                                        addFillNode();\n                                    };\n\n                                // Apply radial gradient\n                                if (wrapper.added) {\n                                    applyRadialGradient();\n                                } else {\n                                    // We need to know the bounding box to get the size and position right\n                                    wrapper.onAdd = applyRadialGradient;\n                                }\n\n                                // The fill element's color attribute is broken in IE8 standards mode, so we\n                                // need to set the parent shape's fillcolor attribute instead.\n                                ret = color1;\n                            }\n\n                            // Gradients are not supported for VML stroke, return the first color. #722.\n                        } else {\n                            ret = stopColor;\n                        }\n\n                        // If the color is an rgba color, split it and add a fill node\n                        // to hold the opacity component\n                    } else if (regexRgba.test(color) && elem.tagName !== 'IMG') {\n\n                        colorObject = H.color(color);\n\n                        wrapper[prop + '-opacitySetter'](colorObject.get('a'), prop, elem);\n\n                        ret = colorObject.get('rgb');\n\n\n                    } else {\n                        var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node\n                        if (propNodes.length) {\n                            propNodes[0].opacity = 1;\n                            propNodes[0].type = 'solid';\n                        }\n                        ret = color;\n                    }\n\n                    return ret;\n                },\n\n                /**\n                 * Take a VML string and prepare it for either IE8 or IE6/IE7.\n                 * @param {Array} markup A string array of the VML markup to prepare\n                 */\n                prepVML: function(markup) {\n                    var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',\n                        isIE8 = this.isIE8;\n\n                    markup = markup.join('');\n\n                    if (isIE8) { // add xmlns and style inline\n                        markup = markup.replace('/>', ' xmlns=\"urn:schemas-microsoft-com:vml\" />');\n                        if (markup.indexOf('style=\"') === -1) {\n                            markup = markup.replace('/>', ' style=\"' + vmlStyle + '\" />');\n                        } else {\n                            markup = markup.replace('style=\"', 'style=\"' + vmlStyle);\n                        }\n\n                    } else { // add namespace\n                        markup = markup.replace('<', '<hcv:');\n                    }\n\n                    return markup;\n                },\n\n                /**\n                 * Create rotated and aligned text\n                 * @param {String} str\n                 * @param {Number} x\n                 * @param {Number} y\n                 */\n                text: SVGRenderer.prototype.html,\n\n                /**\n                 * Create and return a path element\n                 * @param {Array} path\n                 */\n                path: function(path) {\n                    var attr = {\n                        // subpixel precision down to 0.1 (width and height = 1px)\n                        coordsize: '10 10'\n                    };\n                    if (isArray(path)) {\n                        attr.d = path;\n                    } else if (isObject(path)) { // attributes\n                        extend(attr, path);\n                    }\n                    // create the shape\n                    return this.createElement('shape').attr(attr);\n                },\n\n                /**\n                 * Create and return a circle element. In VML circles are implemented as\n                 * shapes, which is faster than v:oval\n                 * @param {Number} x\n                 * @param {Number} y\n                 * @param {Number} r\n                 */\n                circle: function(x, y, r) {\n                    var circle = this.symbol('circle');\n                    if (isObject(x)) {\n                        r = x.r;\n                        y = x.y;\n                        x = x.x;\n                    }\n                    circle.isCircle = true; // Causes x and y to mean center (#1682)\n                    circle.r = r;\n                    return circle.attr({\n                        x: x,\n                        y: y\n                    });\n                },\n\n                /**\n                 * Create a group using an outer div and an inner v:group to allow rotating\n                 * and flipping. A simple v:group would have problems with positioning\n                 * child HTML elements and CSS clip.\n                 *\n                 * @param {String} name The name of the group\n                 */\n                g: function(name) {\n                    var wrapper,\n                        attribs;\n\n                    // set the class name\n                    if (name) {\n                        attribs = {\n                            'className': 'highcharts-' + name,\n                            'class': 'highcharts-' + name\n                        };\n                    }\n\n                    // the div to hold HTML and clipping\n                    wrapper = this.createElement('div').attr(attribs);\n\n                    return wrapper;\n                },\n\n                /**\n                 * VML override to create a regular HTML image\n                 * @param {String} src\n                 * @param {Number} x\n                 * @param {Number} y\n                 * @param {Number} width\n                 * @param {Number} height\n                 */\n                image: function(src, x, y, width, height) {\n                    var obj = this.createElement('img')\n                        .attr({\n                            src: src\n                        });\n\n                    if (arguments.length > 1) {\n                        obj.attr({\n                            x: x,\n                            y: y,\n                            width: width,\n                            height: height\n                        });\n                    }\n                    return obj;\n                },\n\n                /**\n                 * For rectangles, VML uses a shape for rect to overcome bugs and rotation problems\n                 */\n                createElement: function(nodeName) {\n                    return nodeName === 'rect' ?\n                        this.symbol(nodeName) :\n                        SVGRenderer.prototype.createElement.call(this, nodeName);\n                },\n\n                /**\n                 * In the VML renderer, each child of an inverted div (group) is inverted\n                 * @param {Object} element\n                 * @param {Object} parentNode\n                 */\n                invertChild: function(element, parentNode) {\n                    var ren = this,\n                        parentStyle = parentNode.style,\n                        imgStyle = element.tagName === 'IMG' && element.style; // #1111\n\n                    css(element, {\n                        flip: 'x',\n                        left: pInt(parentStyle.width) - (imgStyle ? pInt(imgStyle.top) : 1),\n                        top: pInt(parentStyle.height) - (imgStyle ? pInt(imgStyle.left) : 1),\n                        rotation: -90\n                    });\n\n                    // Recursively invert child elements, needed for nested composite\n                    // shapes like box plots and error bars. #1680, #1806.\n                    each(element.childNodes, function(child) {\n                        ren.invertChild(child, element);\n                    });\n                },\n\n                /**\n                 * Symbol definitions that override the parent SVG renderer's symbols\n                 *\n                 */\n                symbols: {\n                    // VML specific arc function\n                    arc: function(x, y, w, h, options) {\n                        var start = options.start,\n                            end = options.end,\n                            radius = options.r || w || h,\n                            innerRadius = options.innerR,\n                            cosStart = Math.cos(start),\n                            sinStart = Math.sin(start),\n                            cosEnd = Math.cos(end),\n                            sinEnd = Math.sin(end),\n                            ret;\n\n                        if (end - start === 0) { // no angle, don't show it.\n                            return ['x'];\n                        }\n\n                        ret = [\n                            'wa', // clockwise arc to\n                            x - radius, // left\n                            y - radius, // top\n                            x + radius, // right\n                            y + radius, // bottom\n                            x + radius * cosStart, // start x\n                            y + radius * sinStart, // start y\n                            x + radius * cosEnd, // end x\n                            y + radius * sinEnd // end y\n                        ];\n\n                        if (options.open && !innerRadius) {\n                            ret.push(\n                                'e',\n                                'M',\n                                x, // - innerRadius,\n                                y // - innerRadius\n                            );\n                        }\n\n                        ret.push(\n                            'at', // anti clockwise arc to\n                            x - innerRadius, // left\n                            y - innerRadius, // top\n                            x + innerRadius, // right\n                            y + innerRadius, // bottom\n                            x + innerRadius * cosEnd, // start x\n                            y + innerRadius * sinEnd, // start y\n                            x + innerRadius * cosStart, // end x\n                            y + innerRadius * sinStart, // end y\n                            'x', // finish path\n                            'e' // close\n                        );\n\n                        ret.isArc = true;\n                        return ret;\n\n                    },\n                    // Add circle symbol path. This performs significantly faster than v:oval.\n                    circle: function(x, y, w, h, wrapper) {\n\n                        if (wrapper && defined(wrapper.r)) {\n                            w = h = 2 * wrapper.r;\n                        }\n\n                        // Center correction, #1682\n                        if (wrapper && wrapper.isCircle) {\n                            x -= w / 2;\n                            y -= h / 2;\n                        }\n\n                        // Return the path\n                        return [\n                            'wa', // clockwisearcto\n                            x, // left\n                            y, // top\n                            x + w, // right\n                            y + h, // bottom\n                            x + w, // start x\n                            y + h / 2, // start y\n                            x + w, // end x\n                            y + h / 2, // end y\n                            //'x', // finish path\n                            'e' // close\n                        ];\n                    },\n                    /**\n                     * Add rectangle symbol path which eases rotation and omits arcsize problems\n                     * compared to the built-in VML roundrect shape. When borders are not rounded,\n                     * use the simpler square path, else use the callout path without the arrow.\n                     */\n                    rect: function(x, y, w, h, options) {\n                        return SVGRenderer.prototype.symbols[!defined(options) || !options.r ? 'square' : 'callout'].call(0, x, y, w, h, options);\n                    }\n                }\n            };\n            H.VMLRenderer = VMLRenderer = function() {\n                this.init.apply(this, arguments);\n            };\n            VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);\n\n            // general renderer\n            H.Renderer = VMLRenderer;\n        }\n\n        // This method is used with exporting in old IE, when emulating SVG (see #2314)\n        SVGRenderer.prototype.measureSpanWidth = function(text, styles) {\n            var measuringSpan = doc.createElement('span'),\n                offsetWidth,\n                textNode = doc.createTextNode(text);\n\n            measuringSpan.appendChild(textNode);\n            css(measuringSpan, styles);\n            this.box.appendChild(measuringSpan);\n            offsetWidth = measuringSpan.offsetWidth;\n            discardElement(measuringSpan); // #2463\n            return offsetWidth;\n        };\n\n\n        /* ****************************************************************************\n         *                                                                            *\n         * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE                                *\n         *                                                                            *\n         *****************************************************************************/\n\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var color = H.color,\n            each = H.each,\n            getTZOffset = H.getTZOffset,\n            isTouchDevice = H.isTouchDevice,\n            merge = H.merge,\n            pick = H.pick,\n            svg = H.svg,\n            win = H.win;\n\n        /* ****************************************************************************\n         * Handle the options                                                         *\n         *****************************************************************************/\n        H.defaultOptions = {\n\n            colors: '#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1'.split(' '),\n\n            symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n            lang: {\n                loading: 'Loading...',\n                months: [\n                    'January', 'February', 'March', 'April', 'May', 'June', 'July',\n                    'August', 'September', 'October', 'November', 'December'\n                ],\n                shortMonths: [\n                    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\n                    'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n                ],\n                weekdays: [\n                    'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n                    'Thursday', 'Friday', 'Saturday'\n                ],\n                // invalidDate: '',\n                decimalPoint: '.',\n                numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels\n                resetZoom: 'Reset zoom',\n                resetZoomTitle: 'Reset zoom level 1:1',\n                thousandsSep: ' '\n            },\n            global: {\n                useUTC: true,\n                //timezoneOffset: 0,\n\n                VMLRadialGradientURL: 'http://code.highcharts.com/5.0.12/gfx/vml-radial-gradient.png'\n\n            },\n            chart: {\n                //animation: true,\n                //alignTicks: false,\n                //reflow: true,\n                //className: null,\n                //events: { load, selection },\n                //margin: [null],\n                //marginTop: null,\n                //marginRight: null,\n                //marginBottom: null,\n                //marginLeft: null,\n                borderRadius: 0,\n\n                defaultSeriesType: 'line',\n                ignoreHiddenSeries: true,\n                //inverted: false,\n                spacing: [10, 10, 15, 10],\n                //spacingTop: 10,\n                //spacingRight: 10,\n                //spacingBottom: 15,\n                //spacingLeft: 10,\n                //zoomType: ''\n                resetZoomButton: {\n                    theme: {\n                        zIndex: 20\n                    },\n                    position: {\n                        align: 'right',\n                        x: -10,\n                        //verticalAlign: 'top',\n                        y: 10\n                    }\n                    // relativeTo: 'plot'\n                },\n                width: null,\n                height: null,\n\n\n                borderColor: '#335cad',\n                //borderWidth: 0,\n                //style: {\n                //\tfontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Verdana, Arial, Helvetica, sans-serif', // default font\n                //\tfontSize: '12px'\n                //},\n                backgroundColor: '#ffffff',\n                //plotBackgroundColor: null,\n                plotBorderColor: '#cccccc'\n                //plotBorderWidth: 0,\n                //plotShadow: false\n\n            },\n            title: {\n                text: 'Chart title',\n                align: 'center',\n                // floating: false,\n                margin: 15,\n                // x: 0,\n                // verticalAlign: 'top',\n                // y: null,\n                // style: {}, // defined inline\n                widthAdjust: -44\n\n            },\n            subtitle: {\n                text: '',\n                align: 'center',\n                // floating: false\n                // x: 0,\n                // verticalAlign: 'top',\n                // y: null,\n                // style: {}, // defined inline\n                widthAdjust: -44\n            },\n\n            plotOptions: {},\n            labels: {\n                //items: [],\n                style: {\n                    //font: defaultFont,\n                    position: 'absolute',\n                    color: '#333333'\n                }\n            },\n            legend: {\n                enabled: true,\n                align: 'center',\n                //floating: false,\n                layout: 'horizontal',\n                labelFormatter: function() {\n                    return this.name;\n                },\n                //borderWidth: 0,\n                borderColor: '#999999',\n                borderRadius: 0,\n                navigation: {\n\n                    activeColor: '#003399',\n                    inactiveColor: '#cccccc'\n\n                    // animation: true,\n                    // arrowSize: 12\n                    // style: {} // text styles\n                },\n                // margin: 20,\n                // reversed: false,\n                // backgroundColor: null,\n                /*style: {\n                \tpadding: '5px'\n                },*/\n\n                itemStyle: {\n                    color: '#333333',\n                    fontSize: '12px',\n                    fontWeight: 'bold',\n                    textOverflow: 'ellipsis'\n                },\n                itemHoverStyle: {\n                    //cursor: 'pointer', removed as of #601\n                    color: '#000000'\n                },\n                itemHiddenStyle: {\n                    color: '#cccccc'\n                },\n                shadow: false,\n\n                itemCheckboxStyle: {\n                    position: 'absolute',\n                    width: '13px', // for IE precision\n                    height: '13px'\n                },\n                // itemWidth: undefined,\n                squareSymbol: true,\n                // symbolRadius: 0,\n                // symbolWidth: 16,\n                symbolPadding: 5,\n                verticalAlign: 'bottom',\n                // width: undefined,\n                x: 0,\n                y: 0,\n                title: {\n                    //text: null,\n\n                    style: {\n                        fontWeight: 'bold'\n                    }\n\n                }\n            },\n\n            loading: {\n                // hideDuration: 100,\n                // showDuration: 0,\n\n                labelStyle: {\n                    fontWeight: 'bold',\n                    position: 'relative',\n                    top: '45%'\n                },\n                style: {\n                    position: 'absolute',\n                    backgroundColor: '#ffffff',\n                    opacity: 0.5,\n                    textAlign: 'center'\n                }\n\n            },\n\n            tooltip: {\n                enabled: true,\n                animation: svg,\n                //crosshairs: null,\n                borderRadius: 3,\n                dateTimeLabelFormats: {\n                    millisecond: '%A, %b %e, %H:%M:%S.%L',\n                    second: '%A, %b %e, %H:%M:%S',\n                    minute: '%A, %b %e, %H:%M',\n                    hour: '%A, %b %e, %H:%M',\n                    day: '%A, %b %e, %Y',\n                    week: 'Week from %A, %b %e, %Y',\n                    month: '%B %Y',\n                    year: '%Y'\n                },\n                footerFormat: '',\n                //formatter: defaultFormatter,\n                /* todo: em font-size when finished comparing against HC4\n                headerFormat: '<span style=\"font-size: 0.85em\">{point.key}</span><br/>',\n                */\n                padding: 8,\n\n                //shape: 'callout',\n                //shared: false,\n                snap: isTouchDevice ? 25 : 10,\n\n                backgroundColor: color('#f7f7f7').setOpacity(0.85).get(),\n                borderWidth: 1,\n                headerFormat: '<span style=\"font-size: 10px\">{point.key}</span><br/>',\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.y}</b><br/>',\n                shadow: true,\n                style: {\n                    color: '#333333',\n                    cursor: 'default',\n                    fontSize: '12px',\n                    pointerEvents: 'none', // #1686 http://caniuse.com/#feat=pointer-events\n                    whiteSpace: 'nowrap'\n                }\n\n                //xDateFormat: '%A, %b %e, %Y',\n                //valueDecimals: null,\n                //valuePrefix: '',\n                //valueSuffix: ''\n            },\n\n            credits: {\n                enabled: true,\n                href: 'http://www.highcharts.com',\n                position: {\n                    align: 'right',\n                    x: -10,\n                    verticalAlign: 'bottom',\n                    y: -5\n                },\n\n                style: {\n                    cursor: 'pointer',\n                    color: '#999999',\n                    fontSize: '9px'\n                },\n\n                text: 'Highcharts.com'\n            }\n        };\n\n\n\n        /**\n         * Sets the getTimezoneOffset function. If the timezone option is set, a default\n         * getTimezoneOffset function with that timezone is returned. If not, the\n         * specified getTimezoneOffset function is returned. If neither are specified,\n         * undefined is returned.\n         * @return {function} a getTimezoneOffset function or undefined\n         */\n        function getTimezoneOffsetOption() {\n            var globalOptions = H.defaultOptions.global,\n                moment = win.moment;\n\n            if (globalOptions.timezone) {\n                if (!moment) {\n                    // getTimezoneOffset-function stays undefined because it depends on\n                    // Moment.js\n                    H.error(25);\n\n                } else {\n                    return function(timestamp) {\n                        return -moment.tz(\n                            timestamp,\n                            globalOptions.timezone\n                        ).utcOffset();\n                    };\n                }\n            }\n\n            // If not timezone is set, look for the getTimezoneOffset callback\n            return globalOptions.useUTC && globalOptions.getTimezoneOffset;\n        }\n\n        /**\n         * Set the time methods globally based on the useUTC option. Time method can be\n         *   either local time or UTC (default). It is called internally on initiating\n         *   Highcharts and after running `Highcharts.setOptions`.\n         *\n         * @private\n         */\n        function setTimeMethods() {\n            var globalOptions = H.defaultOptions.global,\n                Date,\n                useUTC = globalOptions.useUTC,\n                GET = useUTC ? 'getUTC' : 'get',\n                SET = useUTC ? 'setUTC' : 'set';\n\n            H.Date = Date = globalOptions.Date || win.Date; // Allow using a different Date class\n            Date.hcTimezoneOffset = useUTC && globalOptions.timezoneOffset;\n            Date.hcGetTimezoneOffset = getTimezoneOffsetOption();\n            Date.hcMakeTime = function(year, month, date, hours, minutes, seconds) {\n                var d;\n                if (useUTC) {\n                    d = Date.UTC.apply(0, arguments);\n                    d += getTZOffset(d);\n                } else {\n                    d = new Date(\n                        year,\n                        month,\n                        pick(date, 1),\n                        pick(hours, 0),\n                        pick(minutes, 0),\n                        pick(seconds, 0)\n                    ).getTime();\n                }\n                return d;\n            };\n            each(['Minutes', 'Hours', 'Day', 'Date', 'Month', 'FullYear'], function(s) {\n                Date['hcGet' + s] = GET + s;\n            });\n            each(['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear'], function(s) {\n                Date['hcSet' + s] = SET + s;\n            });\n        }\n\n        /**\n         * Merge the default options with custom options and return the new options\n         * structure. Commonly used for defining reusable templates.\n         *\n         * @function #setOptions\n         * @memberOf  Highcharts\n         * @sample highcharts/global/useutc-false Setting a global option\n         * @sample highcharts/members/setoptions Applying a global theme\n         * @param {Object} options The new custom chart options.\n         * @returns {Object} Updated options.\n         */\n        H.setOptions = function(options) {\n\n            // Copy in the default options\n            H.defaultOptions = merge(true, H.defaultOptions, options);\n\n            // Apply UTC\n            setTimeMethods();\n\n            return H.defaultOptions;\n        };\n\n        /**\n         * Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules\n         * wasn't enough because the setOptions method created a new object.\n         */\n        H.getOptions = function() {\n            return H.defaultOptions;\n        };\n\n\n        // Series defaults\n        H.defaultPlotOptions = H.defaultOptions.plotOptions;\n\n        // set the default time methods\n        setTimeMethods();\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var correctFloat = H.correctFloat,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            deg2rad = H.deg2rad;\n\n        /**\n         * The Tick class\n         */\n        H.Tick = function(axis, pos, type, noLabel) {\n            this.axis = axis;\n            this.pos = pos;\n            this.type = type || '';\n            this.isNew = true;\n            this.isNewLabel = true;\n\n            if (!type && !noLabel) {\n                this.addLabel();\n            }\n        };\n\n        H.Tick.prototype = {\n            /**\n             * Write the tick label\n             */\n            addLabel: function() {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    chart = axis.chart,\n                    categories = axis.categories,\n                    names = axis.names,\n                    pos = tick.pos,\n                    labelOptions = options.labels,\n                    str,\n                    tickPositions = axis.tickPositions,\n                    isFirst = pos === tickPositions[0],\n                    isLast = pos === tickPositions[tickPositions.length - 1],\n                    value = categories ?\n                    pick(categories[pos], names[pos], pos) :\n                    pos,\n                    label = tick.label,\n                    tickPositionInfo = tickPositions.info,\n                    dateTimeLabelFormat;\n\n                // Set the datetime label format. If a higher rank is set for this position, use that. If not,\n                // use the general format.\n                if (axis.isDatetimeAxis && tickPositionInfo) {\n                    dateTimeLabelFormat =\n                        options.dateTimeLabelFormats[\n                            tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName\n                        ];\n                }\n                // set properties for access in render method\n                tick.isFirst = isFirst;\n                tick.isLast = isLast;\n\n                // get the string\n                str = axis.labelFormatter.call({\n                    axis: axis,\n                    chart: chart,\n                    isFirst: isFirst,\n                    isLast: isLast,\n                    dateTimeLabelFormat: dateTimeLabelFormat,\n                    value: axis.isLog ? correctFloat(axis.lin2log(value)) : value\n                });\n\n                // prepare CSS\n                //css = width && { width: Math.max(1, Math.round(width - 2 * (labelOptions.padding || 10))) + 'px' };\n\n                // first call\n                if (!defined(label)) {\n\n                    tick.label = label =\n                        defined(str) && labelOptions.enabled ?\n                        chart.renderer.text(\n                            str,\n                            0,\n                            0,\n                            labelOptions.useHTML\n                        )\n\n                        // without position absolute, IE export sometimes is wrong\n                        .css(merge(labelOptions.style))\n\n                        .add(axis.labelGroup) :\n                        null;\n                    tick.labelLength = label && label.getBBox().width; // Un-rotated length\n                    tick.rotation = 0; // Base value to detect change for new calls to getBBox\n\n                    // update\n                } else if (label) {\n                    label.attr({\n                        text: str\n                    });\n                }\n            },\n\n            /**\n             * Get the offset height or width of the label\n             */\n            getLabelSize: function() {\n                return this.label ?\n                    this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n                    0;\n            },\n\n            /**\n             * Handle the label overflow by adjusting the labels to the left and right edge, or\n             * hide them if they collide into the neighbour label.\n             */\n            handleOverflow: function(xy) {\n                var axis = this.axis,\n                    pxPos = xy.x,\n                    chartWidth = axis.chart.chartWidth,\n                    spacing = axis.chart.spacing,\n                    leftBound = pick(axis.labelLeft, Math.min(axis.pos, spacing[3])),\n                    rightBound = pick(axis.labelRight, Math.max(axis.pos + axis.len, chartWidth - spacing[1])),\n                    label = this.label,\n                    rotation = this.rotation,\n                    factor = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[axis.labelAlign],\n                    labelWidth = label.getBBox().width,\n                    slotWidth = axis.getSlotWidth(),\n                    modifiedSlotWidth = slotWidth,\n                    xCorrection = factor,\n                    goRight = 1,\n                    leftPos,\n                    rightPos,\n                    textWidth,\n                    css = {};\n\n                // Check if the label overshoots the chart spacing box. If it does, move it.\n                // If it now overshoots the slotWidth, add ellipsis.\n                if (!rotation) {\n                    leftPos = pxPos - factor * labelWidth;\n                    rightPos = pxPos + (1 - factor) * labelWidth;\n\n                    if (leftPos < leftBound) {\n                        modifiedSlotWidth = xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n                    } else if (rightPos > rightBound) {\n                        modifiedSlotWidth = rightBound - xy.x + modifiedSlotWidth * factor;\n                        goRight = -1;\n                    }\n\n                    modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n                    if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n                        xy.x += goRight * (slotWidth - modifiedSlotWidth - xCorrection *\n                            (slotWidth - Math.min(labelWidth, modifiedSlotWidth)));\n                    }\n                    // If the label width exceeds the available space, set a text width to be\n                    // picked up below. Also, if a width has been set before, we need to set a new\n                    // one because the reported labelWidth will be limited by the box (#3938).\n                    if (labelWidth > modifiedSlotWidth || (axis.autoRotation && (label.styles || {}).width)) {\n                        textWidth = modifiedSlotWidth;\n                    }\n\n                    // Add ellipsis to prevent rotated labels to be clipped against the edge of the chart\n                } else if (rotation < 0 && pxPos - factor * labelWidth < leftBound) {\n                    textWidth = Math.round(pxPos / Math.cos(rotation * deg2rad) - leftBound);\n                } else if (rotation > 0 && pxPos + factor * labelWidth > rightBound) {\n                    textWidth = Math.round((chartWidth - pxPos) / Math.cos(rotation * deg2rad));\n                }\n\n                if (textWidth) {\n                    css.width = textWidth;\n                    if (!(axis.options.labels.style || {}).textOverflow) {\n                        css.textOverflow = 'ellipsis';\n                    }\n                    label.css(css);\n                }\n            },\n\n            /**\n             * Get the x and y position for ticks and labels\n             */\n            getPosition: function(horiz, pos, tickmarkOffset, old) {\n                var axis = this.axis,\n                    chart = axis.chart,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight;\n\n                return {\n                    x: horiz ?\n                        axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB : axis.left + axis.offset +\n                        (axis.opposite ?\n                            ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left :\n                            0\n                        ),\n\n                    y: horiz ?\n                        cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) : cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB\n                };\n\n            },\n\n            /**\n             * Get the x, y position of the tick label\n             */\n            getLabelPosition: function(x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n                var axis = this.axis,\n                    transA = axis.transA,\n                    reversed = axis.reversed,\n                    staggerLines = axis.staggerLines,\n                    rotCorr = axis.tickRotCorr || {\n                        x: 0,\n                        y: 0\n                    },\n                    yOffset = labelOptions.y,\n                    line;\n\n                if (!defined(yOffset)) {\n                    if (axis.side === 0) {\n                        yOffset = label.rotation ? -8 : -label.getBBox().height;\n                    } else if (axis.side === 2) {\n                        yOffset = rotCorr.y + 8;\n                    } else {\n                        // #3140, #3140\n                        yOffset = Math.cos(label.rotation * deg2rad) * (rotCorr.y - label.getBBox(false, 0).height / 2);\n                    }\n                }\n\n                x = x + labelOptions.x + rotCorr.x - (tickmarkOffset && horiz ?\n                    tickmarkOffset * transA * (reversed ? -1 : 1) : 0);\n                y = y + yOffset - (tickmarkOffset && !horiz ?\n                    tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n\n                // Correct for staggered labels\n                if (staggerLines) {\n                    line = (index / (step || 1) % staggerLines);\n                    if (axis.opposite) {\n                        line = staggerLines - line - 1;\n                    }\n                    y += line * (axis.labelOffset / staggerLines);\n                }\n\n                return {\n                    x: x,\n                    y: Math.round(y)\n                };\n            },\n\n            /**\n             * Extendible method to return the path of the marker\n             */\n            getMarkPath: function(x, y, tickLength, tickWidth, horiz, renderer) {\n                return renderer.crispLine([\n                    'M',\n                    x,\n                    y,\n                    'L',\n                    x + (horiz ? 0 : -tickLength),\n                    y + (horiz ? tickLength : 0)\n                ], tickWidth);\n            },\n\n            /**\n             * Renders the gridLine.\n             * @param  {Boolean} old         Whether or not the tick is old\n             * @param  {number} opacity      The opacity of the grid line\n             * @param  {number} reverseCrisp Modifier for avoiding overlapping 1 or -1\n             * @return {undefined}\n             */\n            renderGridLine: function(old, opacity, reverseCrisp) {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    gridLine = tick.gridLine,\n                    gridLinePath,\n                    attribs = {},\n                    pos = tick.pos,\n                    type = tick.type,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    renderer = axis.chart.renderer;\n\n\n                var gridPrefix = type ? type + 'Grid' : 'grid',\n                    gridLineWidth = options[gridPrefix + 'LineWidth'],\n                    gridLineColor = options[gridPrefix + 'LineColor'],\n                    dashStyle = options[gridPrefix + 'LineDashStyle'];\n\n\n                if (!gridLine) {\n\n                    attribs.stroke = gridLineColor;\n                    attribs['stroke-width'] = gridLineWidth;\n                    if (dashStyle) {\n                        attribs.dashstyle = dashStyle;\n                    }\n\n                    if (!type) {\n                        attribs.zIndex = 1;\n                    }\n                    if (old) {\n                        attribs.opacity = 0;\n                    }\n                    tick.gridLine = gridLine = renderer.path()\n                        .attr(attribs)\n                        .addClass(\n                            'highcharts-' + (type ? type + '-' : '') + 'grid-line'\n                        )\n                        .add(axis.gridGroup);\n                }\n\n                // If the parameter 'old' is set, the current call will be followed\n                // by another call, therefore do not do any animations this time\n                if (!old && gridLine) {\n                    gridLinePath = axis.getPlotLinePath(\n                        pos + tickmarkOffset,\n                        gridLine.strokeWidth() * reverseCrisp,\n                        old, true\n                    );\n                    if (gridLinePath) {\n                        gridLine[tick.isNew ? 'attr' : 'animate']({\n                            d: gridLinePath,\n                            opacity: opacity\n                        });\n                    }\n                }\n            },\n\n            /**\n             * Renders the tick mark.\n             * @param  {Object} xy           The position vector of the mark\n             * @param  {number} xy.x         The x position of the mark\n             * @param  {number} xy.y         The y position of the mark\n             * @param  {number} opacity      The opacity of the mark\n             * @param  {number} reverseCrisp Modifier for avoiding overlapping 1 or -1\n             * @return {undefined}\n             */\n            renderMark: function(xy, opacity, reverseCrisp) {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    renderer = axis.chart.renderer,\n                    type = tick.type,\n                    tickPrefix = type ? type + 'Tick' : 'tick',\n                    tickSize = axis.tickSize(tickPrefix),\n                    mark = tick.mark,\n                    isNewMark = !mark,\n                    x = xy.x,\n                    y = xy.y;\n\n\n                var tickWidth = pick(\n                        options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0\n                    ), // X axis defaults to 1\n                    tickColor = options[tickPrefix + 'Color'];\n\n\n                if (tickSize) {\n\n                    // negate the length\n                    if (axis.opposite) {\n                        tickSize[0] = -tickSize[0];\n                    }\n\n                    // First time, create it\n                    if (isNewMark) {\n                        tick.mark = mark = renderer.path()\n                            .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n                            .add(axis.axisGroup);\n\n\n                        mark.attr({\n                            stroke: tickColor,\n                            'stroke-width': tickWidth\n                        });\n\n                    }\n                    mark[isNewMark ? 'attr' : 'animate']({\n                        d: tick.getMarkPath(\n                            x,\n                            y,\n                            tickSize[0],\n                            mark.strokeWidth() * reverseCrisp,\n                            axis.horiz,\n                            renderer),\n                        opacity: opacity\n                    });\n\n                }\n            },\n\n            /**\n             * Renders the tick label.\n             * Note: The label should already be created in init(), so it should only\n             * have to be moved into place.\n             * @param  {Object} xy      The position vector of the label\n             * @param  {number} xy.x    The x position of the label\n             * @param  {number} xy.y    The y position of the label\n             * @param  {Boolean} old    Whether or not the tick is old\n             * @param  {number} opacity The opacity of the label\n             * @param  {number} index   The index of the tick\n             * @return {undefined}\n             */\n            renderLabel: function(xy, old, opacity, index) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    options = axis.options,\n                    label = tick.label,\n                    labelOptions = options.labels,\n                    step = labelOptions.step,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    show = true,\n                    x = xy.x,\n                    y = xy.y;\n                if (label && isNumber(x)) {\n                    label.xy = xy = tick.getLabelPosition(\n                        x,\n                        y,\n                        label,\n                        horiz,\n                        labelOptions,\n                        tickmarkOffset,\n                        index,\n                        step\n                    );\n\n                    // Apply show first and show last. If the tick is both first and\n                    // last, it is a single centered tick, in which case we show the\n                    // label anyway (#2100).\n                    if (\n                        (\n                            tick.isFirst &&\n                            !tick.isLast &&\n                            !pick(options.showFirstLabel, 1)\n                        ) ||\n                        (\n                            tick.isLast &&\n                            !tick.isFirst &&\n                            !pick(options.showLastLabel, 1)\n                        )\n                    ) {\n                        show = false;\n\n                        // Handle label overflow and show or hide accordingly\n                    } else if (horiz && !axis.isRadial && !labelOptions.step &&\n                        !labelOptions.rotation && !old && opacity !== 0) {\n                        tick.handleOverflow(xy);\n                    }\n\n                    // apply step\n                    if (step && index % step) {\n                        // show those indices dividable by step\n                        show = false;\n                    }\n\n                    // Set the new position, and show or hide\n                    if (show && isNumber(xy.y)) {\n                        xy.opacity = opacity;\n                        label[tick.isNewLabel ? 'attr' : 'animate'](xy);\n                        tick.isNewLabel = false;\n                    } else {\n                        label.attr('y', -9999); // #1338\n                        tick.isNewLabel = true;\n                    }\n                    tick.isNew = false;\n                }\n            },\n\n            /**\n             * Put everything in place\n             *\n             * @param index {Number}\n             * @param old {Boolean} Use old coordinates to prepare an animation into new\n             *                      position\n             */\n            render: function(index, old, opacity) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    pos = tick.pos,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    xy = tick.getPosition(horiz, pos, tickmarkOffset, old),\n                    x = xy.x,\n                    y = xy.y,\n                    reverseCrisp = ((horiz && x === axis.pos + axis.len) ||\n                        (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687\n\n                opacity = pick(opacity, 1);\n                this.isActive = true;\n\n                // Create the grid line\n                this.renderGridLine(old, opacity, reverseCrisp);\n\n                // create the tick mark\n                this.renderMark(xy, opacity, reverseCrisp);\n\n                // the label is created on init - now move it into place\n                this.renderLabel(xy, old, opacity, index);\n            },\n\n            /**\n             * Destructor for the tick prototype\n             */\n            destroy: function() {\n                destroyObjectProperties(this, this.axis);\n            }\n        };\n\n    }(Highcharts));\n    var Axis = (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var addEvent = H.addEvent,\n            animObject = H.animObject,\n            arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            color = H.color,\n            correctFloat = H.correctFloat,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            destroyObjectProperties = H.destroyObjectProperties,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            format = H.format,\n            getMagnitude = H.getMagnitude,\n            grep = H.grep,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            merge = H.merge,\n            normalizeTickInterval = H.normalizeTickInterval,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            syncTimeout = H.syncTimeout,\n            Tick = H.Tick;\n\n        /**\n         * Create a new axis object. Called internally when instanciating a new chart or\n         * adding axes by {@link Highcharts.Chart#addAxis}.\n         *\n         * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n         * series cartesian chart, there is one X axis and one Y axis.\n         * \n         * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n         * an array of Axis objects. If there is only one axis, it can be referenced\n         * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n         * pattern goes for Y axes.\n         * \n         * If you need to get the axes from a series object, use the `series.xAxis` and\n         * `series.yAxis` properties. These are not arrays, as one series can only be\n         * associated to one X and one Y axis.\n         * \n         * A third way to reference the axis programmatically is by `id`. Add an `id` in\n         * the axis configuration options, and get the axis by\n         * {@link Highcharts.Chart#get}.\n         * \n         * Configuration options for the axes are given in options.xAxis and\n         * options.yAxis.\n         * \n         * @class Highcharts.Axis\n         * @memberOf Highcharts\n         * @param {Highcharts.Chart} chart - The Chart instance to apply the axis on.\n         * @param {Object} options - Axis options\n         */\n        var Axis = function() {\n            this.init.apply(this, arguments);\n        };\n\n        H.extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n            /**\n             * Default options for the X axis - the Y axis has extended defaults.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultOptions: {\n                // allowDecimals: null,\n                // alternateGridColor: null,\n                // categories: [],\n                dateTimeLabelFormats: {\n                    millisecond: '%H:%M:%S.%L',\n                    second: '%H:%M:%S',\n                    minute: '%H:%M',\n                    hour: '%H:%M',\n                    day: '%e. %b',\n                    week: '%e. %b',\n                    month: '%b \\'%y',\n                    year: '%Y'\n                },\n                endOnTick: false,\n                // reversed: false,\n\n                labels: {\n                    enabled: true,\n                    // rotation: 0,\n                    // align: 'center',\n                    // step: null,\n\n                    style: {\n                        color: '#666666',\n                        cursor: 'default',\n                        fontSize: '11px'\n                    },\n\n                    x: 0\n                    //y: undefined\n                    /*formatter: function () {\n                    \treturn this.value;\n                    },*/\n                },\n                //linkedTo: null,\n                //max: undefined,\n                //min: undefined,\n                minPadding: 0.01,\n                maxPadding: 0.01,\n                //minRange: null,\n                //minorTickInterval: null,\n                minorTickLength: 2,\n                minorTickPosition: 'outside', // inside or outside\n                //opposite: false,\n                //offset: 0,\n                //plotBands: [{\n                //\tevents: {},\n                //\tzIndex: 1,\n                //\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\n                //}],\n                //plotLines: [{\n                //\tevents: {}\n                //  dashStyle: {}\n                //\tzIndex:\n                //\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\n                //}],\n                //reversed: false,\n                // showFirstLabel: true,\n                // showLastLabel: true,\n                startOfWeek: 1,\n                startOnTick: false,\n                //tickInterval: null,\n                tickLength: 10,\n                tickmarkPlacement: 'between', // on or between\n                tickPixelInterval: 100,\n                tickPosition: 'outside',\n                title: {\n                    //text: null,\n                    align: 'middle', // low, middle or high\n                    //margin: 0 for horizontal, 10 for vertical axes,\n                    // reserveSpace: true,\n                    //rotation: 0,\n                    //side: 'outside',\n\n                    style: {\n                        color: '#666666'\n                    }\n\n                    //x: 0,\n                    //y: 0\n                },\n                type: 'linear', // linear, logarithmic or datetime\n                //visible: true\n\n                minorGridLineColor: '#f2f2f2',\n                // minorGridLineDashStyle: null,\n                minorGridLineWidth: 1,\n                minorTickColor: '#999999',\n                //minorTickWidth: 0,\n                lineColor: '#ccd6eb',\n                lineWidth: 1,\n                gridLineColor: '#e6e6e6',\n                // gridLineDashStyle: 'solid',\n                // gridLineWidth: 0,\n                tickColor: '#ccd6eb'\n                // tickWidth: 1\n\n            },\n\n            /**\n             * This options set extends the defaultOptions for Y axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultYAxisOptions: {\n                endOnTick: true,\n                tickPixelInterval: 72,\n                showLastLabel: true,\n                labels: {\n                    x: -8\n                },\n                maxPadding: 0.05,\n                minPadding: 0.05,\n                startOnTick: true,\n                title: {\n                    rotation: 270,\n                    text: 'Values'\n                },\n                stackLabels: {\n                    enabled: false,\n                    //align: dynamic,\n                    //y: dynamic,\n                    //x: dynamic,\n                    //verticalAlign: dynamic,\n                    //textAlign: dynamic,\n                    //rotation: 0,\n                    formatter: function() {\n                        return H.numberFormat(this.total, -1);\n                    },\n\n                    style: {\n                        fontSize: '11px',\n                        fontWeight: 'bold',\n                        color: '#000000',\n                        textOutline: '1px contrast'\n                    }\n\n                },\n\n                gridLineWidth: 1,\n                lineWidth: 0\n                // tickWidth: 0\n\n            },\n\n            /**\n             * These options extend the defaultOptions for left axes.\n             * \n             * @private\n             * @type {Object}\n             */\n            defaultLeftAxisOptions: {\n                labels: {\n                    x: -15\n                },\n                title: {\n                    rotation: 270\n                }\n            },\n\n            /**\n             * These options extend the defaultOptions for right axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultRightAxisOptions: {\n                labels: {\n                    x: 15\n                },\n                title: {\n                    rotation: 90\n                }\n            },\n\n            /**\n             * These options extend the defaultOptions for bottom axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultBottomAxisOptions: {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined,\n                    // staggerLines: null\n                },\n                title: {\n                    rotation: 0\n                }\n            },\n            /**\n             * These options extend the defaultOptions for top axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultTopAxisOptions: {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined\n                    // staggerLines: null\n                },\n                title: {\n                    rotation: 0\n                }\n            },\n\n            /**\n             * Initialize the axis\n             */\n            init: function(chart, userOptions) {\n\n\n                var isXAxis = userOptions.isX,\n                    axis = this;\n\n                axis.chart = chart;\n\n                // Flag, is the axis horizontal\n                axis.horiz = chart.inverted && !axis.isZAxis ? !isXAxis : isXAxis;\n\n                // Flag, isXAxis\n                axis.isXAxis = isXAxis;\n                axis.coll = axis.coll || (isXAxis ? 'xAxis' : 'yAxis');\n\n                axis.opposite = userOptions.opposite; // needed in setOptions\n                axis.side = userOptions.side || (axis.horiz ?\n                    (axis.opposite ? 0 : 2) : // top : bottom\n                    (axis.opposite ? 1 : 3)); // right : left\n\n                axis.setOptions(userOptions);\n\n\n                var options = this.options,\n                    type = options.type,\n                    isDatetimeAxis = type === 'datetime';\n\n                axis.labelFormatter = options.labels.formatter ||\n                    axis.defaultLabelFormatter; // can be overwritten by dynamic format\n\n\n                // Flag, stagger lines or not\n                axis.userOptions = userOptions;\n\n                //axis.axisTitleMargin = undefined,// = options.title.margin,\n                axis.minPixelPadding = 0;\n\n                axis.reversed = options.reversed;\n                axis.visible = options.visible !== false;\n                axis.zoomEnabled = options.zoomEnabled !== false;\n\n                // Initial categories\n                axis.hasNames = type === 'category' || options.categories === true;\n                axis.categories = options.categories || axis.hasNames;\n                axis.names = axis.names || []; // Preserve on update (#3830)\n\n                // Elements\n                //axis.axisGroup = undefined;\n                //axis.gridGroup = undefined;\n                //axis.axisTitle = undefined;\n                //axis.axisLine = undefined;\n\n                // Placeholder for plotlines and plotbands groups\n                axis.plotLinesAndBandsGroups = {};\n\n                // Shorthand types\n                axis.isLog = type === 'logarithmic';\n                axis.isDatetimeAxis = isDatetimeAxis;\n                axis.positiveValuesOnly = axis.isLog && !axis.allowNegativeLog;\n\n                // Flag, if axis is linked to another axis\n                axis.isLinked = defined(options.linkedTo);\n                // Linked axis.\n                //axis.linkedParent = undefined;\n\n                // Major ticks\n                axis.ticks = {};\n                axis.labelEdge = [];\n                // Minor ticks\n                axis.minorTicks = {};\n\n                // List of plotLines/Bands\n                axis.plotLinesAndBands = [];\n\n                // Alternate bands\n                axis.alternateBands = {};\n\n                // Axis metrics\n                //axis.left = undefined;\n                //axis.top = undefined;\n                //axis.width = undefined;\n                //axis.height = undefined;\n                //axis.bottom = undefined;\n                //axis.right = undefined;\n                //axis.transA = undefined;\n                //axis.transB = undefined;\n                //axis.oldTransA = undefined;\n                axis.len = 0;\n                //axis.oldMin = undefined;\n                //axis.oldMax = undefined;\n                //axis.oldUserMin = undefined;\n                //axis.oldUserMax = undefined;\n                //axis.oldAxisLength = undefined;\n                axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n                axis.range = options.range;\n                axis.offset = options.offset || 0;\n\n\n                // Dictionary for stacks\n                axis.stacks = {};\n                axis.oldStacks = {};\n                axis.stacksTouched = 0;\n\n                // Min and max in the data\n                //axis.dataMin = undefined,\n                //axis.dataMax = undefined,\n\n                // The axis range\n                axis.max = null;\n                axis.min = null;\n\n                // User set min and max\n                //axis.userMin = undefined,\n                //axis.userMax = undefined,\n\n                // Crosshair options\n                axis.crosshair = pick(\n                    options.crosshair,\n                    splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1],\n                    false\n                );\n\n                var events = axis.options.events;\n\n                // Register. Don't add it again on Axis.update().\n                if (inArray(axis, chart.axes) === -1) { // \n                    if (isXAxis) { // #2713\n                        chart.axes.splice(chart.xAxis.length, 0, axis);\n                    } else {\n                        chart.axes.push(axis);\n                    }\n\n                    chart[axis.coll].push(axis);\n                }\n\n                axis.series = axis.series || []; // populated by Series\n\n                // inverted charts have reversed xAxes as default\n                if (chart.inverted && !axis.isZAxis && isXAxis && axis.reversed === undefined) {\n                    axis.reversed = true;\n                }\n\n                // register event listeners\n                objectEach(events, function(event, eventType) {\n                    addEvent(axis, eventType, event);\n                });\n\n                // extend logarithmic axis\n                axis.lin2log = options.linearToLogConverter || axis.lin2log;\n                if (axis.isLog) {\n                    axis.val2lin = axis.log2lin;\n                    axis.lin2val = axis.lin2log;\n                }\n            },\n\n            /**\n             * Merge and set options\n             */\n            setOptions: function(userOptions) {\n                this.options = merge(\n                    this.defaultOptions,\n                    this.coll === 'yAxis' && this.defaultYAxisOptions, [\n                        this.defaultTopAxisOptions,\n                        this.defaultRightAxisOptions,\n                        this.defaultBottomAxisOptions,\n                        this.defaultLeftAxisOptions\n                    ][this.side],\n                    merge(\n                        defaultOptions[this.coll], // if set in setOptions (#1053)\n                        userOptions\n                    )\n                );\n            },\n\n            /**\n             * The default label formatter. The context is a special config object for\n             * the label. In apps, use the {@link\n             * https://api.highcharts.com/highcharts/xAxis.labels.formatter|\n             * labels.formatter} instead except when a modification is needed.\n             *\n             * @private\n             */\n            defaultLabelFormatter: function() {\n                var axis = this.axis,\n                    value = this.value,\n                    categories = axis.categories,\n                    dateTimeLabelFormat = this.dateTimeLabelFormat,\n                    lang = defaultOptions.lang,\n                    numericSymbols = lang.numericSymbols,\n                    numSymMagnitude = lang.numericSymbolMagnitude || 1000,\n                    i = numericSymbols && numericSymbols.length,\n                    multi,\n                    ret,\n                    formatOption = axis.options.labels.format,\n\n                    // make sure the same symbol is added for all labels on a linear\n                    // axis\n                    numericSymbolDetector = axis.isLog ?\n                    Math.abs(value) :\n                    axis.tickInterval;\n\n                if (formatOption) {\n                    ret = format(formatOption, this);\n\n                } else if (categories) {\n                    ret = value;\n\n                } else if (dateTimeLabelFormat) { // datetime axis\n                    ret = H.dateFormat(dateTimeLabelFormat, value);\n\n                } else if (i && numericSymbolDetector >= 1000) {\n                    // Decide whether we should add a numeric symbol like k (thousands)\n                    // or M (millions). If we are to enable this in tooltip or other\n                    // places as well, we can move this logic to the numberFormatter and\n                    // enable it by a parameter.\n                    while (i-- && ret === undefined) {\n                        multi = Math.pow(numSymMagnitude, i + 1);\n                        if (\n                            numericSymbolDetector >= multi &&\n                            (value * 10) % multi === 0 &&\n                            numericSymbols[i] !== null &&\n                            value !== 0\n                        ) { // #5480\n                            ret = H.numberFormat(value / multi, -1) + numericSymbols[i];\n                        }\n                    }\n                }\n\n                if (ret === undefined) {\n                    if (Math.abs(value) >= 10000) { // add thousands separators\n                        ret = H.numberFormat(value, -1);\n                    } else { // small numbers\n                        ret = H.numberFormat(value, -1, undefined, ''); // #2466\n                    }\n                }\n\n                return ret;\n            },\n\n            /**\n             * Get the minimum and maximum for the series of each axis\n             */\n            getSeriesExtremes: function() {\n                var axis = this,\n                    chart = axis.chart;\n                axis.hasVisibleSeries = false;\n\n                // Reset properties in case we're redrawing (#3353)\n                axis.dataMin = axis.dataMax = axis.threshold = null;\n                axis.softThreshold = !axis.isXAxis;\n\n                if (axis.buildStacks) {\n                    axis.buildStacks();\n                }\n\n                // loop through this axis' series\n                each(axis.series, function(series) {\n\n                    if (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n                        var seriesOptions = series.options,\n                            xData,\n                            threshold = seriesOptions.threshold,\n                            seriesDataMin,\n                            seriesDataMax;\n\n                        axis.hasVisibleSeries = true;\n\n                        // Validate threshold in logarithmic axes\n                        if (axis.positiveValuesOnly && threshold <= 0) {\n                            threshold = null;\n                        }\n\n                        // Get dataMin and dataMax for X axes\n                        if (axis.isXAxis) {\n                            xData = series.xData;\n                            if (xData.length) {\n                                // If xData contains values which is not numbers, then\n                                // filter them out. To prevent performance hit, we only\n                                // do this after we have already found seriesDataMin\n                                // because in most cases all data is valid. #5234.\n                                seriesDataMin = arrayMin(xData);\n                                if (!isNumber(seriesDataMin) &&\n                                    !(seriesDataMin instanceof Date) // #5010\n                                ) {\n                                    xData = grep(xData, function(x) {\n                                        return isNumber(x);\n                                    });\n                                    seriesDataMin = arrayMin(xData); // Do it again with valid data\n                                }\n\n                                axis.dataMin = Math.min(\n                                    pick(axis.dataMin, xData[0]),\n                                    seriesDataMin\n                                );\n                                axis.dataMax = Math.max(\n                                    pick(axis.dataMax, xData[0]),\n                                    arrayMax(xData)\n                                );\n\n                            }\n\n                            // Get dataMin and dataMax for Y axes, as well as handle\n                            // stacking and processed data\n                        } else {\n\n                            // Get this particular series extremes\n                            series.getExtremes();\n                            seriesDataMax = series.dataMax;\n                            seriesDataMin = series.dataMin;\n\n                            // Get the dataMin and dataMax so far. If percentage is\n                            // used, the min and max are always 0 and 100. If\n                            // seriesDataMin and seriesDataMax is null, then series\n                            // doesn't have active y data, we continue with nulls\n                            if (defined(seriesDataMin) && defined(seriesDataMax)) {\n                                axis.dataMin = Math.min(\n                                    pick(axis.dataMin, seriesDataMin),\n                                    seriesDataMin\n                                );\n                                axis.dataMax = Math.max(\n                                    pick(axis.dataMax, seriesDataMax),\n                                    seriesDataMax\n                                );\n                            }\n\n                            // Adjust to threshold\n                            if (defined(threshold)) {\n                                axis.threshold = threshold;\n                            }\n                            // If any series has a hard threshold, it takes precedence\n                            if (!seriesOptions.softThreshold ||\n                                axis.positiveValuesOnly\n                            ) {\n                                axis.softThreshold = false;\n                            }\n                        }\n                    }\n                });\n            },\n\n            /**\n             * Translate from axis value to pixel position on the chart, or back\n             *\n             */\n            translate: function(val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n                var axis = this.linkedParent || this, // #1417\n                    sign = 1,\n                    cvsOffset = 0,\n                    localA = old ? axis.oldTransA : axis.transA,\n                    localMin = old ? axis.oldMin : axis.min,\n                    returnValue,\n                    minPixelPadding = axis.minPixelPadding,\n                    doPostTranslate = (axis.isOrdinal || axis.isBroken || (axis.isLog && handleLog)) && axis.lin2val;\n\n                if (!localA) {\n                    localA = axis.transA;\n                }\n\n                // In vertical axes, the canvas coordinates start from 0 at the top like in\n                // SVG.\n                if (cvsCoord) {\n                    sign *= -1; // canvas coordinates inverts the value\n                    cvsOffset = axis.len;\n                }\n\n                // Handle reversed axis\n                if (axis.reversed) {\n                    sign *= -1;\n                    cvsOffset -= sign * (axis.sector || axis.len);\n                }\n\n                // From pixels to value\n                if (backwards) { // reverse translation\n\n                    val = val * sign + cvsOffset;\n                    val -= minPixelPadding;\n                    returnValue = val / localA + localMin; // from chart pixel to value\n                    if (doPostTranslate) { // log and ordinal axes\n                        returnValue = axis.lin2val(returnValue);\n                    }\n\n                    // From value to pixels\n                } else {\n                    if (doPostTranslate) { // log and ordinal axes\n                        val = axis.val2lin(val);\n                    }\n                    returnValue = sign * (val - localMin) * localA + cvsOffset +\n                        (sign * minPixelPadding) +\n                        (isNumber(pointPlacement) ? localA * pointPlacement : 0);\n                }\n\n                return returnValue;\n            },\n\n            /**\n             * Translate a value in terms of axis units into pixels within the chart.\n             * \n             * @param  {Number} value\n             *         A value in terms of axis units.\n             * @param  {Boolean} paneCoordinates\n             *         Whether to return the pixel coordinate relative to the chart or\n             *         just the axis/pane itself.\n             * @return {Number} Pixel position of the value on the chart or axis.\n             */\n            toPixels: function(value, paneCoordinates) {\n                return this.translate(value, false, !this.horiz, null, true) +\n                    (paneCoordinates ? 0 : this.pos);\n            },\n\n            /**\n             * Translate a pixel position along the axis to a value in terms of axis\n             * units.\n             * @param  {Number} pixel\n             *         The pixel value coordinate.\n             * @param  {Boolean} paneCoordiantes\n             *         Whether the input pixel is relative to the chart or just the\n             *         axis/pane itself.\n             * @return {Number} The axis value.\n             */\n            toValue: function(pixel, paneCoordinates) {\n                return this.translate(\n                    pixel - (paneCoordinates ? 0 : this.pos),\n                    true, !this.horiz,\n                    null,\n                    true\n                );\n            },\n\n            /**\n             * Create the path for a plot line that goes from the given value on\n             * this axis, across the plot to the opposite side\n             * @param {Number} value\n             * @param {Number} lineWidth Used for calculation crisp line\n             * @param {Number] old Use old coordinates (for resizing and rescaling)\n             */\n            getPlotLinePath: function(value, lineWidth, old, force, translatedValue) {\n                var axis = this,\n                    chart = axis.chart,\n                    axisLeft = axis.left,\n                    axisTop = axis.top,\n                    x1,\n                    y1,\n                    x2,\n                    y2,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n                    cWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n                    skip,\n                    transB = axis.transB,\n                    /**\n                     * Check if x is between a and b. If not, either move to a/b or skip,\n                     * depending on the force parameter.\n                     */\n                    between = function(x, a, b) {\n                        if (x < a || x > b) {\n                            if (force) {\n                                x = Math.min(Math.max(a, x), b);\n                            } else {\n                                skip = true;\n                            }\n                        }\n                        return x;\n                    };\n\n                translatedValue = pick(translatedValue, axis.translate(value, null, null, old));\n                x1 = x2 = Math.round(translatedValue + transB);\n                y1 = y2 = Math.round(cHeight - translatedValue - transB);\n                if (!isNumber(translatedValue)) { // no min or max\n                    skip = true;\n\n                } else if (axis.horiz) {\n                    y1 = axisTop;\n                    y2 = cHeight - axis.bottom;\n                    x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n                } else {\n                    x1 = axisLeft;\n                    x2 = cWidth - axis.right;\n                    y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n                }\n                return skip && !force ?\n                    null :\n                    chart.renderer.crispLine(['M', x1, y1, 'L', x2, y2], lineWidth || 1);\n            },\n\n            /**\n             * Internal function to et the tick positions of a linear axis to round\n             * values like whole tens or every five.\n             *\n             * @param  {Number} tickInterval\n             *         The normalized tick interval\n             * @param  {Number} min\n             *         Axis minimum.\n             * @param  {Number} max\n             *         Axis maximum.\n             *\n             * @return {Array.<Number>}\n             *         An array of numbers where ticks should be placed.\n             */\n            getLinearTickPositions: function(tickInterval, min, max) {\n                var pos,\n                    lastPos,\n                    roundedMin = correctFloat(Math.floor(min / tickInterval) * tickInterval),\n                    roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval),\n                    tickPositions = [];\n\n                // For single points, add a tick regardless of the relative position\n                // (#2662, #6274)\n                if (this.single) {\n                    return [min];\n                }\n\n                // Populate the intermediate values\n                pos = roundedMin;\n                while (pos <= roundedMax) {\n\n                    // Place the tick on the rounded value\n                    tickPositions.push(pos);\n\n                    // Always add the raw tickInterval, not the corrected one.\n                    pos = correctFloat(pos + tickInterval);\n\n                    // If the interval is not big enough in the current min - max range to actually increase\n                    // the loop variable, we need to break out to prevent endless loop. Issue #619\n                    if (pos === lastPos) {\n                        break;\n                    }\n\n                    // Record the last value\n                    lastPos = pos;\n                }\n                return tickPositions;\n            },\n\n            /**\n             * Return the minor tick positions. For logarithmic axes, reuse the same logic\n             * as for major ticks.\n             */\n            getMinorTickPositions: function() {\n                var axis = this,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    minorTickInterval = axis.minorTickInterval,\n                    minorTickPositions = [],\n                    pos,\n                    pointRangePadding = axis.pointRangePadding || 0,\n                    min = axis.min - pointRangePadding, // #1498\n                    max = axis.max + pointRangePadding, // #1498\n                    range = max - min;\n\n                // If minor ticks get too dense, they are hard to read, and may cause long running script. So we don't draw them.\n                if (range && range / minorTickInterval < axis.len / 3) { // #3875\n\n                    if (axis.isLog) {\n                        // For each interval in the major ticks, compute the minor ticks\n                        // separately.\n                        each(this.paddedTicks, function(pos, i, paddedTicks) {\n                            if (i) {\n                                minorTickPositions.push.apply(\n                                    minorTickPositions,\n                                    axis.getLogTickPositions(\n                                        minorTickInterval,\n                                        paddedTicks[i - 1],\n                                        paddedTicks[i],\n                                        true\n                                    )\n                                );\n                            }\n                        });\n\n                    } else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314\n                        minorTickPositions = minorTickPositions.concat(\n                            axis.getTimeTicks(\n                                axis.normalizeTimeTickInterval(minorTickInterval),\n                                min,\n                                max,\n                                options.startOfWeek\n                            )\n                        );\n                    } else {\n                        for (\n                            pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval\n                        ) {\n                            // Very, very, tight grid lines (#5771)\n                            if (pos === minorTickPositions[0]) {\n                                break;\n                            }\n                            minorTickPositions.push(pos);\n                        }\n                    }\n                }\n\n                if (minorTickPositions.length !== 0) {\n                    axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n                }\n                return minorTickPositions;\n            },\n\n            /**\n             * Adjust the min and max for the minimum range. Keep in mind that the series data is\n             * not yet processed, so we don't have information on data cropping and grouping, or\n             * updated axis.pointRange or series.pointRange. The data can't be processed until\n             * we have finally established min and max.\n             *\n             * @private\n             */\n            adjustForMinRange: function() {\n                var axis = this,\n                    options = axis.options,\n                    min = axis.min,\n                    max = axis.max,\n                    zoomOffset,\n                    spaceAvailable,\n                    closestDataRange,\n                    i,\n                    distance,\n                    xData,\n                    loopLength,\n                    minArgs,\n                    maxArgs,\n                    minRange;\n\n                // Set the automatic minimum range based on the closest point distance\n                if (axis.isXAxis && axis.minRange === undefined && !axis.isLog) {\n\n                    if (defined(options.min) || defined(options.max)) {\n                        axis.minRange = null; // don't do this again\n\n                    } else {\n\n                        // Find the closest distance between raw data points, as opposed to\n                        // closestPointRange that applies to processed points (cropped and grouped)\n                        each(axis.series, function(series) {\n                            xData = series.xData;\n                            loopLength = series.xIncrement ? 1 : xData.length - 1;\n                            for (i = loopLength; i > 0; i--) {\n                                distance = xData[i] - xData[i - 1];\n                                if (closestDataRange === undefined || distance < closestDataRange) {\n                                    closestDataRange = distance;\n                                }\n                            }\n                        });\n                        axis.minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n                    }\n                }\n\n                // if minRange is exceeded, adjust\n                if (max - min < axis.minRange) {\n\n                    spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange;\n                    minRange = axis.minRange;\n                    zoomOffset = (minRange - max + min) / 2;\n\n                    // if min and max options have been set, don't go beyond it\n                    minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];\n                    if (spaceAvailable) { // if space is available, stay within the data range\n                        minArgs[2] = axis.isLog ? axis.log2lin(axis.dataMin) : axis.dataMin;\n                    }\n                    min = arrayMax(minArgs);\n\n                    maxArgs = [min + minRange, pick(options.max, min + minRange)];\n                    if (spaceAvailable) { // if space is availabe, stay within the data range\n                        maxArgs[2] = axis.isLog ? axis.log2lin(axis.dataMax) : axis.dataMax;\n                    }\n\n                    max = arrayMin(maxArgs);\n\n                    // now if the max is adjusted, adjust the min back\n                    if (max - min < minRange) {\n                        minArgs[0] = max - minRange;\n                        minArgs[1] = pick(options.min, max - minRange);\n                        min = arrayMax(minArgs);\n                    }\n                }\n\n                // Record modified extremes\n                axis.min = min;\n                axis.max = max;\n            },\n\n            /**\n             * Find the closestPointRange across all series.\n             *\n             * @private\n             */\n            getClosest: function() {\n                var ret;\n\n                if (this.categories) {\n                    ret = 1;\n                } else {\n                    each(this.series, function(series) {\n                        var seriesClosest = series.closestPointRange,\n                            visible = series.visible ||\n                            !series.chart.options.chart.ignoreHiddenSeries;\n\n                        if (!series.noSharedTooltip &&\n                            defined(seriesClosest) &&\n                            visible\n                        ) {\n                            ret = defined(ret) ?\n                                Math.min(ret, seriesClosest) :\n                                seriesClosest;\n                        }\n                    });\n                }\n                return ret;\n            },\n\n            /**\n             * When a point name is given and no x, search for the name in the existing categories,\n             * or if categories aren't provided, search names or create a new category (#2522).\n             */\n            nameToX: function(point) {\n                var explicitCategories = isArray(this.categories),\n                    names = explicitCategories ? this.categories : this.names,\n                    nameX = point.options.x,\n                    x;\n\n                point.series.requireSorting = false;\n\n                if (!defined(nameX)) {\n                    nameX = this.options.uniqueNames === false ?\n                        point.series.autoIncrement() :\n                        inArray(point.name, names);\n                }\n                if (nameX === -1) { // The name is not found in currenct categories\n                    if (!explicitCategories) {\n                        x = names.length;\n                    }\n                } else {\n                    x = nameX;\n                }\n\n                // Write the last point's name to the names array\n                if (x !== undefined) {\n                    this.names[x] = point.name;\n                }\n\n                return x;\n            },\n\n            /**\n             * When changes have been done to series data, update the axis.names.\n             */\n            updateNames: function() {\n                var axis = this;\n\n                if (this.names.length > 0) {\n                    this.names.length = 0;\n                    this.minRange = this.userMinRange; // Reset\n                    each(this.series || [], function(series) {\n\n                        // Reset incrementer (#5928)\n                        series.xIncrement = null;\n\n                        // When adding a series, points are not yet generated\n                        if (!series.points || series.isDirtyData) {\n                            series.processData();\n                            series.generatePoints();\n                        }\n\n                        each(series.points, function(point, i) {\n                            var x;\n                            if (point.options) {\n                                x = axis.nameToX(point);\n                                if (x !== undefined && x !== point.x) {\n                                    point.x = x;\n                                    series.xData[i] = x;\n                                }\n                            }\n                        });\n                    });\n                }\n            },\n\n            /**\n             * Update translation information\n             */\n            setAxisTranslation: function(saveOld) {\n                var axis = this,\n                    range = axis.max - axis.min,\n                    pointRange = axis.axisPointRange || 0,\n                    closestPointRange,\n                    minPointOffset = 0,\n                    pointRangePadding = 0,\n                    linkedParent = axis.linkedParent,\n                    ordinalCorrection,\n                    hasCategories = !!axis.categories,\n                    transA = axis.transA,\n                    isXAxis = axis.isXAxis;\n\n                // Adjust translation for padding. Y axis with categories need to go through the same (#1784).\n                if (isXAxis || hasCategories || pointRange) {\n\n                    // Get the closest points\n                    closestPointRange = axis.getClosest();\n\n                    if (linkedParent) {\n                        minPointOffset = linkedParent.minPointOffset;\n                        pointRangePadding = linkedParent.pointRangePadding;\n                    } else {\n                        each(axis.series, function(series) {\n                            var seriesPointRange = hasCategories ?\n                                1 :\n                                (isXAxis ?\n                                    pick(series.options.pointRange, closestPointRange, 0) :\n                                    (axis.axisPointRange || 0)), // #2806\n                                pointPlacement = series.options.pointPlacement;\n\n                            pointRange = Math.max(pointRange, seriesPointRange);\n\n                            if (!axis.single) {\n                                // minPointOffset is the value padding to the left of the axis in order to make\n                                // room for points with a pointRange, typically columns. When the pointPlacement option\n                                // is 'between' or 'on', this padding does not apply.\n                                minPointOffset = Math.max(\n                                    minPointOffset,\n                                    isString(pointPlacement) ? 0 : seriesPointRange / 2\n                                );\n\n                                // Determine the total padding needed to the length of the axis to make room for the\n                                // pointRange. If the series' pointPlacement is 'on', no padding is added.\n                                pointRangePadding = Math.max(\n                                    pointRangePadding,\n                                    pointPlacement === 'on' ? 0 : seriesPointRange\n                                );\n                            }\n                        });\n                    }\n\n                    // Record minPointOffset and pointRangePadding\n                    ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853\n                    axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;\n                    axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;\n\n                    // pointRange means the width reserved for each point, like in a column chart\n                    axis.pointRange = Math.min(pointRange, range);\n\n                    // closestPointRange means the closest distance between points. In columns\n                    // it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange\n                    // is some other value\n                    if (isXAxis) {\n                        axis.closestPointRange = closestPointRange;\n                    }\n                }\n\n                // Secondary values\n                if (saveOld) {\n                    axis.oldTransA = transA;\n                }\n                axis.translationSlope = axis.transA = transA =\n                    axis.options.staticScale ||\n                    axis.len / ((range + pointRangePadding) || 1);\n                axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend\n                axis.minPixelPadding = transA * minPointOffset;\n            },\n\n            minFromRange: function() {\n                return this.max - this.range;\n            },\n\n            /**\n             * Set the tick positions to round values and optionally extend the extremes\n             * to the nearest tick\n             */\n            setTickInterval: function(secondPass) {\n                var axis = this,\n                    chart = axis.chart,\n                    options = axis.options,\n                    isLog = axis.isLog,\n                    log2lin = axis.log2lin,\n                    isDatetimeAxis = axis.isDatetimeAxis,\n                    isXAxis = axis.isXAxis,\n                    isLinked = axis.isLinked,\n                    maxPadding = options.maxPadding,\n                    minPadding = options.minPadding,\n                    length,\n                    linkedParentExtremes,\n                    tickIntervalOption = options.tickInterval,\n                    minTickInterval,\n                    tickPixelIntervalOption = options.tickPixelInterval,\n                    categories = axis.categories,\n                    threshold = axis.threshold,\n                    softThreshold = axis.softThreshold,\n                    thresholdMin,\n                    thresholdMax,\n                    hardMin,\n                    hardMax;\n\n                if (!isDatetimeAxis && !categories && !isLinked) {\n                    this.getTickAmount();\n                }\n\n                // Min or max set either by zooming/setExtremes or initial options\n                hardMin = pick(axis.userMin, options.min);\n                hardMax = pick(axis.userMax, options.max);\n\n                // Linked axis gets the extremes from the parent axis\n                if (isLinked) {\n                    axis.linkedParent = chart[axis.coll][options.linkedTo];\n                    linkedParentExtremes = axis.linkedParent.getExtremes();\n                    axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n                    axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n                    if (options.type !== axis.linkedParent.options.type) {\n                        H.error(11, 1); // Can't link axes of different type\n                    }\n\n                    // Initial min and max from the extreme data values\n                } else {\n\n                    // Adjust to hard threshold\n                    if (!softThreshold && defined(threshold)) {\n                        if (axis.dataMin >= threshold) {\n                            thresholdMin = threshold;\n                            minPadding = 0;\n                        } else if (axis.dataMax <= threshold) {\n                            thresholdMax = threshold;\n                            maxPadding = 0;\n                        }\n                    }\n\n                    axis.min = pick(hardMin, thresholdMin, axis.dataMin);\n                    axis.max = pick(hardMax, thresholdMax, axis.dataMax);\n\n                }\n\n                if (isLog) {\n                    if (\n                        axis.positiveValuesOnly &&\n                        !secondPass &&\n                        Math.min(axis.min, pick(axis.dataMin, axis.min)) <= 0\n                    ) { // #978\n                        H.error(10, 1); // Can't plot negative values on log axis\n                    }\n                    // The correctFloat cures #934, float errors on full tens. But it\n                    // was too aggressive for #4360 because of conversion back to lin,\n                    // therefore use precision 15.\n                    axis.min = correctFloat(log2lin(axis.min), 15);\n                    axis.max = correctFloat(log2lin(axis.max), 15);\n                }\n\n                // handle zoomed range\n                if (axis.range && defined(axis.max)) {\n                    axis.userMin = axis.min = hardMin = Math.max(axis.min, axis.minFromRange()); // #618\n                    axis.userMax = hardMax = axis.max;\n\n                    axis.range = null; // don't use it when running setExtremes\n                }\n\n                // Hook for Highstock Scroller. Consider combining with beforePadding.\n                fireEvent(axis, 'foundExtremes');\n\n                // Hook for adjusting this.min and this.max. Used by bubble series.\n                if (axis.beforePadding) {\n                    axis.beforePadding();\n                }\n\n                // adjust min and max for the minimum range\n                axis.adjustForMinRange();\n\n                // Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding\n                // into account, we do this after computing tick interval (#1337).\n                if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {\n                    length = axis.max - axis.min;\n                    if (length) {\n                        if (!defined(hardMin) && minPadding) {\n                            axis.min -= length * minPadding;\n                        }\n                        if (!defined(hardMax) && maxPadding) {\n                            axis.max += length * maxPadding;\n                        }\n                    }\n                }\n\n                // Handle options for floor, ceiling, softMin and softMax (#6359)\n                if (isNumber(options.softMin)) {\n                    axis.min = Math.min(axis.min, options.softMin);\n                }\n                if (isNumber(options.softMax)) {\n                    axis.max = Math.max(axis.max, options.softMax);\n                }\n                if (isNumber(options.floor)) {\n                    axis.min = Math.max(axis.min, options.floor);\n                }\n                if (isNumber(options.ceiling)) {\n                    axis.max = Math.min(axis.max, options.ceiling);\n                }\n\n\n                // When the threshold is soft, adjust the extreme value only if\n                // the data extreme and the padded extreme land on either side of the threshold. For example,\n                // a series of [0, 1, 2, 3] would make the yAxis add a tick for -1 because of the\n                // default minPadding and startOnTick options. This is prevented by the softThreshold\n                // option.\n                if (softThreshold && defined(axis.dataMin)) {\n                    threshold = threshold || 0;\n                    if (!defined(hardMin) && axis.min < threshold && axis.dataMin >= threshold) {\n                        axis.min = threshold;\n                    } else if (!defined(hardMax) && axis.max > threshold && axis.dataMax <= threshold) {\n                        axis.max = threshold;\n                    }\n                }\n\n\n                // get tickInterval\n                if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {\n                    axis.tickInterval = 1;\n                } else if (isLinked && !tickIntervalOption &&\n                    tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {\n                    axis.tickInterval = tickIntervalOption = axis.linkedParent.tickInterval;\n                } else {\n                    axis.tickInterval = pick(\n                        tickIntervalOption,\n                        this.tickAmount ? ((axis.max - axis.min) / Math.max(this.tickAmount - 1, 1)) : undefined,\n                        categories ? // for categoried axis, 1 is default, for linear axis use tickPix\n                        1 :\n                        // don't let it be more than the data range\n                        (axis.max - axis.min) * tickPixelIntervalOption / Math.max(axis.len, tickPixelIntervalOption)\n                    );\n                }\n\n                // Now we're finished detecting min and max, crop and group series data. This\n                // is in turn needed in order to find tick positions in ordinal axes.\n                if (isXAxis && !secondPass) {\n                    each(axis.series, function(series) {\n                        series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n                    });\n                }\n\n                // set the translation factor used in translate function\n                axis.setAxisTranslation(true);\n\n                // hook for ordinal axes and radial axes\n                if (axis.beforeSetTickPositions) {\n                    axis.beforeSetTickPositions();\n                }\n\n                // hook for extensions, used in Highstock ordinal axes\n                if (axis.postProcessTickInterval) {\n                    axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);\n                }\n\n                // In column-like charts, don't cramp in more ticks than there are points (#1943, #4184)\n                if (axis.pointRange && !tickIntervalOption) {\n                    axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n                }\n\n                // Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.\n                minTickInterval = pick(options.minTickInterval, axis.isDatetimeAxis && axis.closestPointRange);\n                if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n                    axis.tickInterval = minTickInterval;\n                }\n\n                // for linear axes, get magnitude and normalize the interval\n                if (!isDatetimeAxis && !isLog && !tickIntervalOption) {\n                    axis.tickInterval = normalizeTickInterval(\n                        axis.tickInterval,\n                        null,\n                        getMagnitude(axis.tickInterval),\n                        // If the tick interval is between 0.5 and 5 and the axis max is in the order of\n                        // thousands, chances are we are dealing with years. Don't allow decimals. #3363.\n                        pick(options.allowDecimals, !(axis.tickInterval > 0.5 && axis.tickInterval < 5 && axis.max > 1000 && axis.max < 9999)), !!this.tickAmount\n                    );\n                }\n\n                // Prevent ticks from getting so close that we can't draw the labels\n                if (!this.tickAmount) {\n                    axis.tickInterval = axis.unsquish();\n                }\n\n                this.setTickPositions();\n            },\n\n            /**\n             * Now we have computed the normalized tickInterval, get the tick positions\n             */\n            setTickPositions: function() {\n\n                var options = this.options,\n                    tickPositions,\n                    tickPositionsOption = options.tickPositions,\n                    tickPositioner = options.tickPositioner,\n                    startOnTick = options.startOnTick,\n                    endOnTick = options.endOnTick;\n\n                // Set the tickmarkOffset\n                this.tickmarkOffset = (this.categories && options.tickmarkPlacement === 'between' &&\n                    this.tickInterval === 1) ? 0.5 : 0; // #3202\n\n\n                // get minorTickInterval\n                this.minorTickInterval = options.minorTickInterval === 'auto' && this.tickInterval ?\n                    this.tickInterval / 5 : options.minorTickInterval;\n\n                // When there is only one point, or all points have the same value on\n                // this axis, then min and max are equal and tickPositions.length is 0\n                // or 1. In this case, add some padding in order to center the point,\n                // but leave it with one tick. #1337.\n                this.single =\n                    this.min === this.max &&\n                    defined(this.min) &&\n                    !this.tickAmount &&\n                    (\n                        // Data is on integer (#6563)\n                        parseInt(this.min, 10) === this.min ||\n\n                        // Between integers and decimals are not allowed (#6274)\n                        options.allowDecimals !== false\n                    );\n\n                // Find the tick positions\n                this.tickPositions = tickPositions = tickPositionsOption && tickPositionsOption.slice(); // Work on a copy (#1565)\n                if (!tickPositions) {\n\n                    if (this.isDatetimeAxis) {\n                        tickPositions = this.getTimeTicks(\n                            this.normalizeTimeTickInterval(\n                                this.tickInterval,\n                                options.units\n                            ),\n                            this.min,\n                            this.max,\n                            options.startOfWeek,\n                            this.ordinalPositions,\n                            this.closestPointRange,\n                            true\n                        );\n                    } else if (this.isLog) {\n                        tickPositions = this.getLogTickPositions(\n                            this.tickInterval,\n                            this.min,\n                            this.max\n                        );\n                    } else {\n                        tickPositions = this.getLinearTickPositions(\n                            this.tickInterval,\n                            this.min,\n                            this.max\n                        );\n                    }\n\n                    // Too dense ticks, keep only the first and last (#4477)\n                    if (tickPositions.length > this.len) {\n                        tickPositions = [tickPositions[0], tickPositions.pop()];\n                    }\n\n                    this.tickPositions = tickPositions;\n\n                    // Run the tick positioner callback, that allows modifying auto tick positions.\n                    if (tickPositioner) {\n                        tickPositioner = tickPositioner.apply(this, [this.min, this.max]);\n                        if (tickPositioner) {\n                            this.tickPositions = tickPositions = tickPositioner;\n                        }\n                    }\n\n                }\n\n                // Reset min/max or remove extremes based on start/end on tick\n                this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n                this.trimTicks(tickPositions, startOnTick, endOnTick);\n                if (!this.isLinked) {\n\n                    // Substract half a unit (#2619, #2846, #2515, #3390)\n                    if (this.single) {\n                        this.min -= 0.5;\n                        this.max += 0.5;\n                    }\n                    if (!tickPositionsOption && !tickPositioner) {\n                        this.adjustTickAmount();\n                    }\n                }\n            },\n\n            /**\n             * Handle startOnTick and endOnTick by either adapting to padding min/max or rounded min/max\n             */\n            trimTicks: function(tickPositions, startOnTick, endOnTick) {\n                var roundedMin = tickPositions[0],\n                    roundedMax = tickPositions[tickPositions.length - 1],\n                    minPointOffset = this.minPointOffset || 0;\n\n                if (!this.isLinked) {\n                    if (startOnTick && roundedMin !== -Infinity) { // #6502\n                        this.min = roundedMin;\n                    } else {\n                        while (this.min - minPointOffset > tickPositions[0]) {\n                            tickPositions.shift();\n                        }\n                    }\n\n                    if (endOnTick) {\n                        this.max = roundedMax;\n                    } else {\n                        while (this.max + minPointOffset < tickPositions[tickPositions.length - 1]) {\n                            tickPositions.pop();\n                        }\n                    }\n\n                    // If no tick are left, set one tick in the middle (#3195)\n                    if (tickPositions.length === 0 && defined(roundedMin)) {\n                        tickPositions.push((roundedMax + roundedMin) / 2);\n                    }\n                }\n            },\n\n            /**\n             * Check if there are multiple axes in the same pane.\n             *\n             * @private\n             * @return {Boolean}\n             *         True if there are other axes.\n             */\n            alignToOthers: function() {\n                var others = {}, // Whether there is another axis to pair with this one\n                    hasOther,\n                    options = this.options;\n\n                if (\n                    // Only if alignTicks is true\n                    this.chart.options.chart.alignTicks !== false &&\n                    options.alignTicks !== false &&\n\n                    // Don't try to align ticks on a log axis, they are not evenly\n                    // spaced (#6021)\n                    !this.isLog\n                ) {\n                    each(this.chart[this.coll], function(axis) {\n                        var otherOptions = axis.options,\n                            horiz = axis.horiz,\n                            key = [\n                                horiz ? otherOptions.left : otherOptions.top,\n                                otherOptions.width,\n                                otherOptions.height,\n                                otherOptions.pane\n                            ].join(',');\n\n\n                        if (axis.series.length) { // #4442\n                            if (others[key]) {\n                                hasOther = true; // #4201\n                            } else {\n                                others[key] = 1;\n                            }\n                        }\n                    });\n                }\n                return hasOther;\n            },\n\n            /**\n             * Set the max ticks of either the x and y axis collection\n             */\n            getTickAmount: function() {\n                var options = this.options,\n                    tickAmount = options.tickAmount,\n                    tickPixelInterval = options.tickPixelInterval;\n\n                if (!defined(options.tickInterval) && this.len < tickPixelInterval && !this.isRadial &&\n                    !this.isLog && options.startOnTick && options.endOnTick) {\n                    tickAmount = 2;\n                }\n\n                if (!tickAmount && this.alignToOthers()) {\n                    // Add 1 because 4 tick intervals require 5 ticks (including first and last)\n                    tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n                }\n\n                // For tick amounts of 2 and 3, compute five ticks and remove the intermediate ones. This\n                // prevents the axis from adding ticks that are too far away from the data extremes.\n                if (tickAmount < 4) {\n                    this.finalTickAmt = tickAmount;\n                    tickAmount = 5;\n                }\n\n                this.tickAmount = tickAmount;\n            },\n\n            /**\n             * When using multiple axes, adjust the number of ticks to match the highest\n             * number of ticks in that group.\n             *\n             * @private\n             */\n            adjustTickAmount: function() {\n                var tickInterval = this.tickInterval,\n                    tickPositions = this.tickPositions,\n                    tickAmount = this.tickAmount,\n                    finalTickAmt = this.finalTickAmt,\n                    currentTickAmount = tickPositions && tickPositions.length,\n                    i,\n                    len;\n\n                if (currentTickAmount < tickAmount) {\n                    while (tickPositions.length < tickAmount) {\n                        tickPositions.push(correctFloat(\n                            tickPositions[tickPositions.length - 1] + tickInterval\n                        ));\n                    }\n                    this.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n                    this.max = tickPositions[tickPositions.length - 1];\n\n                    // We have too many ticks, run second pass to try to reduce ticks\n                } else if (currentTickAmount > tickAmount) {\n                    this.tickInterval *= 2;\n                    this.setTickPositions();\n                }\n\n                // The finalTickAmt property is set in getTickAmount\n                if (defined(finalTickAmt)) {\n                    i = len = tickPositions.length;\n                    while (i--) {\n                        if (\n                            (finalTickAmt === 3 && i % 2 === 1) || // Remove every other tick\n                            (finalTickAmt <= 2 && i > 0 && i < len - 1) // Remove all but first and last\n                        ) {\n                            tickPositions.splice(i, 1);\n                        }\n                    }\n                    this.finalTickAmt = undefined;\n                }\n            },\n\n            /**\n             * Set the scale based on data min and max, user set min and max or options\n             *\n             */\n            setScale: function() {\n                var axis = this,\n                    isDirtyData,\n                    isDirtyAxisLength;\n\n                axis.oldMin = axis.min;\n                axis.oldMax = axis.max;\n                axis.oldAxisLength = axis.len;\n\n                // set the new axisLength\n                axis.setAxisSize();\n                //axisLength = horiz ? axisWidth : axisHeight;\n                isDirtyAxisLength = axis.len !== axis.oldAxisLength;\n\n                // is there new data?\n                each(axis.series, function(series) {\n                    if (series.isDirtyData || series.isDirty ||\n                        series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well\n                        isDirtyData = true;\n                    }\n                });\n\n                // do we really need to go through all this?\n                if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||\n                    axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax || axis.alignToOthers()) {\n\n                    if (axis.resetStacks) {\n                        axis.resetStacks();\n                    }\n\n                    axis.forceRedraw = false;\n\n                    // get data extremes if needed\n                    axis.getSeriesExtremes();\n\n                    // get fixed positions based on tickInterval\n                    axis.setTickInterval();\n\n                    // record old values to decide whether a rescale is necessary later on (#540)\n                    axis.oldUserMin = axis.userMin;\n                    axis.oldUserMax = axis.userMax;\n\n                    // Mark as dirty if it is not already set to dirty and extremes have changed. #595.\n                    if (!axis.isDirty) {\n                        axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;\n                    }\n                } else if (axis.cleanStacks) {\n                    axis.cleanStacks();\n                }\n            },\n\n            /**\n             * Set the minimum and maximum of the axes after render time. If the\n             * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n             * values are rounded off to the nearest tick. To prevent this, these\n             * options can be set to false before calling setExtremes. Also, setExtremes\n             * will not allow a range lower than the `minRange` option, which by default\n             * is the range of five points.\n             * \n             * @param  {Number} [newMin]\n             *         The new minimum value.\n             * @param  {Number} [newMax]\n             *         The new maximum value.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart or wait for an explicit call to \n             *         {@link Highcharts.Chart#redraw}\n             * @param  {AnimationOptions} [animation=true]\n             *         Enable or modify animations.\n             * @param  {Object} [eventArguments]\n             *         Arguments to be accessed in event handler.\n             *\n             * @sample highcharts/members/axis-setextremes/\n             *         Set extremes from a button\n             * @sample highcharts/members/axis-setextremes-datetime/\n             *         Set extremes on a datetime axis\n             * @sample highcharts/members/axis-setextremes-off-ticks/\n             *         Set extremes off ticks\n             * @sample stock/members/axis-setextremes/\n             *         Set extremes in Highstock\n             * @sample maps/members/axis-setextremes/\n             *         Set extremes in Highmaps\n             */\n            setExtremes: function(newMin, newMax, redraw, animation, eventArguments) {\n                var axis = this,\n                    chart = axis.chart;\n\n                redraw = pick(redraw, true); // defaults to true\n\n                each(axis.series, function(serie) {\n                    delete serie.kdTree;\n                });\n\n                // Extend the arguments with min and max\n                eventArguments = extend(eventArguments, {\n                    min: newMin,\n                    max: newMax\n                });\n\n                // Fire the event\n                fireEvent(axis, 'setExtremes', eventArguments, function() { // the default event handler\n\n                    axis.userMin = newMin;\n                    axis.userMax = newMax;\n                    axis.eventArgs = eventArguments;\n\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                });\n            },\n\n            /**\n             * Overridable method for zooming chart. Pulled out in a separate method to allow overriding\n             * in stock charts.\n             */\n            zoom: function(newMin, newMax) {\n                var dataMin = this.dataMin,\n                    dataMax = this.dataMax,\n                    options = this.options,\n                    min = Math.min(dataMin, pick(options.min, dataMin)),\n                    max = Math.max(dataMax, pick(options.max, dataMax));\n\n                if (newMin !== this.min || newMax !== this.max) { // #5790\n\n                    // Prevent pinch zooming out of range. Check for defined is for #1946. #1734.\n                    if (!this.allowZoomOutside) {\n                        // #6014, sometimes newMax will be smaller than min (or newMin will be larger than max).\n                        if (defined(dataMin)) {\n                            if (newMin < min) {\n                                newMin = min;\n                            }\n                            if (newMin > max) {\n                                newMin = max;\n                            }\n                        }\n                        if (defined(dataMax)) {\n                            if (newMax < min) {\n                                newMax = min;\n                            }\n                            if (newMax > max) {\n                                newMax = max;\n                            }\n                        }\n                    }\n\n                    // In full view, displaying the reset zoom button is not required\n                    this.displayBtn = newMin !== undefined || newMax !== undefined;\n\n                    // Do it\n                    this.setExtremes(\n                        newMin,\n                        newMax,\n                        false,\n                        undefined, {\n                            trigger: 'zoom'\n                        }\n                    );\n                }\n\n                return true;\n            },\n\n            /**\n             * Update the axis metrics\n             */\n            setAxisSize: function() {\n                var chart = this.chart,\n                    options = this.options,\n                    offsets = options.offsets || [0, 0, 0, 0], // top / right / bottom / left\n                    horiz = this.horiz,\n                    width = pick(options.width, chart.plotWidth - offsets[3] + offsets[1]),\n                    height = pick(options.height, chart.plotHeight - offsets[0] + offsets[2]),\n                    top = pick(options.top, chart.plotTop + offsets[0]),\n                    left = pick(options.left, chart.plotLeft + offsets[3]),\n                    percentRegex = /%$/;\n\n                // Check for percentage based input values. Rounding fixes problems with\n                // column overflow and plot line filtering (#4898, #4899)\n                if (percentRegex.test(height)) {\n                    height = Math.round(parseFloat(height) / 100 * chart.plotHeight);\n                }\n                if (percentRegex.test(top)) {\n                    top = Math.round(parseFloat(top) / 100 * chart.plotHeight + chart.plotTop);\n                }\n\n                // Expose basic values to use in Series object and navigator\n                this.left = left;\n                this.top = top;\n                this.width = width;\n                this.height = height;\n                this.bottom = chart.chartHeight - height - top;\n                this.right = chart.chartWidth - width - left;\n\n                // Direction agnostic properties\n                this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n                this.pos = horiz ? left : top; // distance from SVG origin\n            },\n\n            /**\n             * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n             * function. \n             * @typedef {Object} Extremes\n             * @property {Number} dataMax\n             *         The maximum value of the axis' associated series.\n             * @property {Number} dataMin\n             *         The minimum value of the axis' associated series.\n             * @property {Number} max\n             *         The maximum axis value, either automatic or set manually. If the\n             *         `max` option is not set, `maxPadding` is 0 and `endOnTick` is\n             *         false, this value will be the same as `dataMax`.\n             * @property {Number} min\n             *         The minimum axis value, either automatic or set manually. If the\n             *         `min` option is not set, `minPadding` is 0 and `startOnTick` is\n             *         false, this value will be the same as `dataMin`.\n             */\n            /**\n             * Get the current extremes for the axis.\n             *\n             * @returns {Extremes}\n             * An object containing extremes information.\n             * \n             * @sample  members/axis-getextremes/\n             *          Report extremes by click on a button\n             * @sample  maps/members/axis-getextremes/\n             *          Get extremes in Highmaps\n             */\n            getExtremes: function() {\n                var axis = this,\n                    isLog = axis.isLog,\n                    lin2log = axis.lin2log;\n\n                return {\n                    min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,\n                    max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,\n                    dataMin: axis.dataMin,\n                    dataMax: axis.dataMax,\n                    userMin: axis.userMin,\n                    userMax: axis.userMax\n                };\n            },\n\n            /**\n             * Get the zero plane either based on zero or on the min or max value.\n             * Used in bar and area plots\n             */\n            getThreshold: function(threshold) {\n                var axis = this,\n                    isLog = axis.isLog,\n                    lin2log = axis.lin2log,\n                    realMin = isLog ? lin2log(axis.min) : axis.min,\n                    realMax = isLog ? lin2log(axis.max) : axis.max;\n\n                if (threshold === null) {\n                    threshold = realMin;\n                } else if (realMin > threshold) {\n                    threshold = realMin;\n                } else if (realMax < threshold) {\n                    threshold = realMax;\n                }\n\n                return axis.translate(threshold, 0, 1, 0, 1);\n            },\n\n            /**\n             * Compute auto alignment for the axis label based on which side the axis is\n             * on and the given rotation for the label.\n             *\n             * @param  {Number} rotation\n             *         The rotation in degrees as set by either the `rotation` or \n             *         `autoRotation` options.\n             * @private\n             */\n            autoLabelAlign: function(rotation) {\n                var ret,\n                    angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;\n\n                if (angle > 15 && angle < 165) {\n                    ret = 'right';\n                } else if (angle > 195 && angle < 345) {\n                    ret = 'left';\n                } else {\n                    ret = 'center';\n                }\n                return ret;\n            },\n\n            /**\n             * Get the tick length and width for the axis.\n             * @param   {String} prefix 'tick' or 'minorTick'\n             * @returns {Array}        An array of tickLength and tickWidth\n             */\n            tickSize: function(prefix) {\n                var options = this.options,\n                    tickLength = options[prefix + 'Length'],\n                    tickWidth = pick(options[prefix + 'Width'], prefix === 'tick' && this.isXAxis ? 1 : 0); // X axis defaults to 1\n\n                if (tickWidth && tickLength) {\n                    // Negate the length\n                    if (options[prefix + 'Position'] === 'inside') {\n                        tickLength = -tickLength;\n                    }\n                    return [tickLength, tickWidth];\n                }\n\n            },\n\n            /**\n             * Return the size of the labels\n             */\n            labelMetrics: function() {\n                var index = this.tickPositions && this.tickPositions[0] || 0;\n                return this.chart.renderer.fontMetrics(\n                    this.options.labels.style && this.options.labels.style.fontSize,\n                    this.ticks[index] && this.ticks[index].label\n                );\n            },\n\n            /**\n             * Prevent the ticks from getting so close we can't draw the labels. On a horizontal\n             * axis, this is handled by rotating the labels, removing ticks and adding ellipsis.\n             * On a vertical axis remove ticks and add ellipsis.\n             */\n            unsquish: function() {\n                var labelOptions = this.options.labels,\n                    horiz = this.horiz,\n                    tickInterval = this.tickInterval,\n                    newTickInterval = tickInterval,\n                    slotSize = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / tickInterval),\n                    rotation,\n                    rotationOption = labelOptions.rotation,\n                    labelMetrics = this.labelMetrics(),\n                    step,\n                    bestScore = Number.MAX_VALUE,\n                    autoRotation,\n                    // Return the multiple of tickInterval that is needed to avoid collision\n                    getStep = function(spaceNeeded) {\n                        var step = spaceNeeded / (slotSize || 1);\n                        step = step > 1 ? Math.ceil(step) : 1;\n                        return step * tickInterval;\n                    };\n\n                if (horiz) {\n                    autoRotation = !labelOptions.staggerLines && !labelOptions.step && ( // #3971\n                        defined(rotationOption) ? [rotationOption] :\n                        slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation\n                    );\n\n                    if (autoRotation) {\n\n                        // Loop over the given autoRotation options, and determine which gives the best score. The\n                        // best score is that with the lowest number of steps and a rotation closest to horizontal.\n                        each(autoRotation, function(rot) {\n                            var score;\n\n                            if (rot === rotationOption || (rot && rot >= -90 && rot <= 90)) { // #3891\n\n                                step = getStep(Math.abs(labelMetrics.h / Math.sin(deg2rad * rot)));\n\n                                score = step + Math.abs(rot / 360);\n\n                                if (score < bestScore) {\n                                    bestScore = score;\n                                    rotation = rot;\n                                    newTickInterval = step;\n                                }\n                            }\n                        });\n                    }\n\n                } else if (!labelOptions.step) { // #4411\n                    newTickInterval = getStep(labelMetrics.h);\n                }\n\n                this.autoRotation = autoRotation;\n                this.labelRotation = pick(rotation, rotationOption);\n\n                return newTickInterval;\n            },\n\n            /**\n             * Get the general slot width for this axis. This may change between the pre-render (from Axis.getOffset) \n             * and the final tick rendering and placement (#5086).\n             */\n            getSlotWidth: function() {\n                var chart = this.chart,\n                    horiz = this.horiz,\n                    labelOptions = this.options.labels,\n                    slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),\n                    marginLeft = chart.margin[3];\n\n                return (\n                    horiz &&\n                    (labelOptions.step || 0) < 2 &&\n                    !labelOptions.rotation && // #4415\n                    ((this.staggerLines || 1) * this.len) / slotCount\n                ) || (!horiz && (\n                    (marginLeft && (marginLeft - chart.spacing[3])) ||\n                    chart.chartWidth * 0.33\n                )); // #1580, #1931\n\n            },\n\n            /**\n             * Render the axis labels and determine whether ellipsis or rotation need to be applied\n             */\n            renderUnsquish: function() {\n                var chart = this.chart,\n                    renderer = chart.renderer,\n                    tickPositions = this.tickPositions,\n                    ticks = this.ticks,\n                    labelOptions = this.options.labels,\n                    horiz = this.horiz,\n                    slotWidth = this.getSlotWidth(),\n                    innerWidth = Math.max(1, Math.round(slotWidth - 2 * (labelOptions.padding || 5))),\n                    attr = {},\n                    labelMetrics = this.labelMetrics(),\n                    textOverflowOption = labelOptions.style && labelOptions.style.textOverflow,\n                    css,\n                    maxLabelLength = 0,\n                    label,\n                    i,\n                    pos;\n\n                // Set rotation option unless it is \"auto\", like in gauges\n                if (!isString(labelOptions.rotation)) {\n                    attr.rotation = labelOptions.rotation || 0; // #4443\n                }\n\n                // Get the longest label length\n                each(tickPositions, function(tick) {\n                    tick = ticks[tick];\n                    if (tick && tick.labelLength > maxLabelLength) {\n                        maxLabelLength = tick.labelLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n\n\n                // Handle auto rotation on horizontal axis\n                if (this.autoRotation) {\n\n                    // Apply rotation only if the label is too wide for the slot, and\n                    // the label is wider than its height.\n                    if (maxLabelLength > innerWidth && maxLabelLength > labelMetrics.h) {\n                        attr.rotation = this.labelRotation;\n                    } else {\n                        this.labelRotation = 0;\n                    }\n\n                    // Handle word-wrap or ellipsis on vertical axis\n                } else if (slotWidth) {\n                    // For word-wrap or ellipsis\n                    css = {\n                        width: innerWidth + 'px'\n                    };\n\n                    if (!textOverflowOption) {\n                        css.textOverflow = 'clip';\n\n                        // On vertical axis, only allow word wrap if there is room for more lines.\n                        i = tickPositions.length;\n                        while (!horiz && i--) {\n                            pos = tickPositions[i];\n                            label = ticks[pos].label;\n                            if (label) {\n                                // Reset ellipsis in order to get the correct bounding box (#4070)\n                                if (label.styles && label.styles.textOverflow === 'ellipsis') {\n                                    label.css({\n                                        textOverflow: 'clip'\n                                    });\n\n                                    // Set the correct width in order to read the bounding box height (#4678, #5034)\n                                } else if (ticks[pos].labelLength > slotWidth) {\n                                    label.css({\n                                        width: slotWidth + 'px'\n                                    });\n                                }\n\n                                if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {\n                                    label.specCss = {\n                                        textOverflow: 'ellipsis'\n                                    };\n                                }\n                            }\n                        }\n                    }\n                }\n\n\n                // Add ellipsis if the label length is significantly longer than ideal\n                if (attr.rotation) {\n                    css = {\n                        width: (maxLabelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + 'px'\n                    };\n                    if (!textOverflowOption) {\n                        css.textOverflow = 'ellipsis';\n                    }\n                }\n\n                // Set the explicit or automatic label alignment\n                this.labelAlign = labelOptions.align || this.autoLabelAlign(this.labelRotation);\n                if (this.labelAlign) {\n                    attr.align = this.labelAlign;\n                }\n\n                // Apply general and specific CSS\n                each(tickPositions, function(pos) {\n                    var tick = ticks[pos],\n                        label = tick && tick.label;\n                    if (label) {\n                        label.attr(attr); // This needs to go before the CSS in old IE (#4502)\n                        if (css) {\n                            label.css(merge(css, label.specCss));\n                        }\n                        delete label.specCss;\n                        tick.rotation = attr.rotation;\n                    }\n                });\n\n                // Note: Why is this not part of getLabelPosition?\n                this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n            },\n\n            /**\n             * Return true if the axis has associated data\n             */\n            hasData: function() {\n                return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);\n            },\n\n            /**\n             * Adds the title defined in axis.options.title.\n             * @param {Boolean} display - whether or not to display the title\n             */\n            addTitle: function(display) {\n                var axis = this,\n                    renderer = axis.chart.renderer,\n                    horiz = axis.horiz,\n                    opposite = axis.opposite,\n                    options = axis.options,\n                    axisTitleOptions = options.title,\n                    textAlign;\n\n                if (!axis.axisTitle) {\n                    textAlign = axisTitleOptions.textAlign;\n                    if (!textAlign) {\n                        textAlign = (horiz ? {\n                            low: 'left',\n                            middle: 'center',\n                            high: 'right'\n                        } : {\n                            low: opposite ? 'right' : 'left',\n                            middle: 'center',\n                            high: opposite ? 'left' : 'right'\n                        })[axisTitleOptions.align];\n                    }\n                    axis.axisTitle = renderer.text(\n                            axisTitleOptions.text,\n                            0,\n                            0,\n                            axisTitleOptions.useHTML\n                        )\n                        .attr({\n                            zIndex: 7,\n                            rotation: axisTitleOptions.rotation || 0,\n                            align: textAlign\n                        })\n                        .addClass('highcharts-axis-title')\n\n                        .css(axisTitleOptions.style)\n\n                        .add(axis.axisGroup);\n                    axis.axisTitle.isNew = true;\n                }\n\n                // hide or show the title depending on whether showEmpty is set\n                axis.axisTitle[display ? 'show' : 'hide'](true);\n            },\n\n            /**\n             * Generates a tick for initial positioning.\n             *\n             * @private\n             * @param  {number} pos\n             *         The tick position in axis values.\n             * @param  {number} i\n             *         The index of the tick in {@link Axis.tickPositions}.\n             */\n            generateTick: function(pos) {\n                var ticks = this.ticks;\n\n                if (!ticks[pos]) {\n                    ticks[pos] = new Tick(this, pos);\n                } else {\n                    ticks[pos].addLabel(); // update labels depending on tick interval\n                }\n            },\n\n            /**\n             * Render the tick labels to a preliminary position to get their sizes\n             */\n            getOffset: function() {\n                var axis = this,\n                    chart = axis.chart,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    ticks = axis.ticks,\n                    horiz = axis.horiz,\n                    side = axis.side,\n                    invertedSide = chart.inverted && !axis.isZAxis ? [1, 0, 3, 2][side] : side,\n                    hasData,\n                    showAxis,\n                    titleOffset = 0,\n                    titleOffsetOption,\n                    titleMargin = 0,\n                    axisTitleOptions = options.title,\n                    labelOptions = options.labels,\n                    labelOffset = 0, // reset\n                    labelOffsetPadded,\n                    axisOffset = chart.axisOffset,\n                    clipOffset = chart.clipOffset,\n                    clip,\n                    directionFactor = [-1, 1, 1, -1][side],\n                    className = options.className,\n                    axisParent = axis.axisParent, // Used in color axis\n                    lineHeightCorrection,\n                    tickSize = this.tickSize('tick');\n\n                // For reuse in Axis.render\n                hasData = axis.hasData();\n                axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n                // Set/reset staggerLines\n                axis.staggerLines = axis.horiz && labelOptions.staggerLines;\n\n                // Create the axisGroup and gridGroup elements on first iteration\n                if (!axis.axisGroup) {\n                    axis.gridGroup = renderer.g('grid')\n                        .attr({\n                            zIndex: options.gridZIndex || 1\n                        })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + '-grid ' + (className || ''))\n                        .add(axisParent);\n                    axis.axisGroup = renderer.g('axis')\n                        .attr({\n                            zIndex: options.zIndex || 2\n                        })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + ' ' + (className || ''))\n                        .add(axisParent);\n                    axis.labelGroup = renderer.g('axis-labels')\n                        .attr({\n                            zIndex: labelOptions.zIndex || 7\n                        })\n                        .addClass('highcharts-' + axis.coll.toLowerCase() + '-labels ' + (className || ''))\n                        .add(axisParent);\n                }\n\n                if (hasData || axis.isLinked) {\n\n                    // Generate ticks\n                    each(tickPositions, function(pos, i) {\n                        // i is not used here, but may be used in overrides\n                        axis.generateTick(pos, i);\n                    });\n\n                    axis.renderUnsquish();\n\n\n                    // Left side must be align: right and right side must have align: left for labels\n                    if (labelOptions.reserveSpace !== false && (side === 0 || side === 2 || {\n                            1: 'left',\n                            3: 'right'\n                        }[side] === axis.labelAlign || axis.labelAlign === 'center')) {\n                        each(tickPositions, function(pos) {\n\n                            // get the highest offset\n                            labelOffset = Math.max(\n                                ticks[pos].getLabelSize(),\n                                labelOffset\n                            );\n                        });\n                    }\n\n                    if (axis.staggerLines) {\n                        labelOffset *= axis.staggerLines;\n                        axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n                    }\n\n\n                } else { // doesn't have data\n                    objectEach(ticks, function(tick, n) {\n                        tick.destroy();\n                        delete ticks[n];\n                    });\n                }\n\n                if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {\n                    axis.addTitle(showAxis);\n\n                    if (showAxis && axisTitleOptions.reserveSpace !== false) {\n                        axis.titleOffset = titleOffset =\n                            axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n                        titleOffsetOption = axisTitleOptions.offset;\n                        titleMargin = defined(titleOffsetOption) ? 0 : pick(axisTitleOptions.margin, horiz ? 5 : 10);\n                    }\n                }\n\n                // Render the axis line\n                axis.renderLine();\n\n                // handle automatic or user set offset\n                axis.offset = directionFactor * pick(options.offset, axisOffset[side]);\n\n                axis.tickRotCorr = axis.tickRotCorr || {\n                    x: 0,\n                    y: 0\n                }; // polar\n                if (side === 0) {\n                    lineHeightCorrection = -axis.labelMetrics().h;\n                } else if (side === 2) {\n                    lineHeightCorrection = axis.tickRotCorr.y;\n                } else {\n                    lineHeightCorrection = 0;\n                }\n\n                // Find the padded label offset\n                labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n                if (labelOffset) {\n                    labelOffsetPadded -= lineHeightCorrection;\n                    labelOffsetPadded += directionFactor * (horiz ? pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) : labelOptions.x);\n                }\n                axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n\n                axisOffset[side] = Math.max(\n                    axisOffset[side],\n                    axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,\n                    labelOffsetPadded, // #3027\n                    hasData && tickPositions.length && tickSize ?\n                    tickSize[0] + directionFactor * axis.offset :\n                    0 // #4866\n                );\n\n                // Decide the clipping needed to keep the graph inside the plot area and\n                // axis lines\n                clip = Math.floor(axis.axisLine.strokeWidth() / 2) * 2; // #4308, #4371\n                if (options.offset > 0) {\n                    clip -= options.offset * 2;\n                }\n                clipOffset[invertedSide] = Math.max(\n                    clipOffset[invertedSide] || clip,\n                    clip\n                );\n            },\n\n            /**\n             * Internal function to get the path for the axis line. Extended for polar\n             * charts.\n             *\n             * @param  {Number} lineWidth\n             *         The line width in pixels.\n             * @return {Array}\n             *         The SVG path definition in array form.\n             */\n            getLinePath: function(lineWidth) {\n                var chart = this.chart,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    horiz = this.horiz,\n                    lineLeft = this.left + (opposite ? this.width : 0) + offset,\n                    lineTop = chart.chartHeight - this.bottom -\n                    (opposite ? this.height : 0) + offset;\n\n                if (opposite) {\n                    lineWidth *= -1; // crispify the other way - #1480, #1687\n                }\n\n                return chart.renderer\n                    .crispLine([\n                        'M',\n                        horiz ?\n                        this.left :\n                        lineLeft,\n                        horiz ?\n                        lineTop :\n                        this.top,\n                        'L',\n                        horiz ?\n                        chart.chartWidth - this.right :\n                        lineLeft,\n                        horiz ?\n                        lineTop :\n                        chart.chartHeight - this.bottom\n                    ], lineWidth);\n            },\n\n            /**\n             * Render the axis line\n             */\n            renderLine: function() {\n                if (!this.axisLine) {\n                    this.axisLine = this.chart.renderer.path()\n                        .addClass('highcharts-axis-line')\n                        .add(this.axisGroup);\n\n\n                    this.axisLine.attr({\n                        stroke: this.options.lineColor,\n                        'stroke-width': this.options.lineWidth,\n                        zIndex: 7\n                    });\n\n                }\n            },\n\n            /**\n             * Position the title\n             */\n            getTitlePosition: function() {\n                // compute anchor points for each of the title align options\n                var horiz = this.horiz,\n                    axisLeft = this.left,\n                    axisTop = this.top,\n                    axisLength = this.len,\n                    axisTitleOptions = this.options.title,\n                    margin = horiz ? axisLeft : axisTop,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    xOption = axisTitleOptions.x || 0,\n                    yOption = axisTitleOptions.y || 0,\n                    fontSize = this.chart.renderer.fontMetrics(axisTitleOptions.style && axisTitleOptions.style.fontSize, this.axisTitle).f,\n\n                    // the position in the length direction of the axis\n                    alongAxis = {\n                        low: margin + (horiz ? 0 : axisLength),\n                        middle: margin + axisLength / 2,\n                        high: margin + (horiz ? axisLength : 0)\n                    }[axisTitleOptions.align],\n\n                    // the position in the perpendicular direction of the axis\n                    offAxis = (horiz ? axisTop + this.height : axisLeft) +\n                    (horiz ? 1 : -1) * // horizontal axis reverses the margin\n                    (opposite ? -1 : 1) * // so does opposite axes\n                    this.axisTitleMargin +\n                    (this.side === 2 ? fontSize : 0);\n\n                return {\n                    x: horiz ?\n                        alongAxis + xOption : offAxis + (opposite ? this.width : 0) + offset + xOption,\n                    y: horiz ?\n                        offAxis + yOption - (opposite ? this.height : 0) + offset : alongAxis + yOption\n                };\n            },\n\n            /**\n             * Render a minor tick into the given position. If a minor tick already \n             * exists in this position, move it.\n             * @param  {number} pos - The position in axis values.\n             */\n            renderMinorTick: function(pos) {\n                var slideInTicks = this.chart.hasRendered && isNumber(this.oldMin),\n                    minorTicks = this.minorTicks;\n\n                if (!minorTicks[pos]) {\n                    minorTicks[pos] = new Tick(this, pos, 'minor');\n                }\n\n                // Render new ticks in old position\n                if (slideInTicks && minorTicks[pos].isNew) {\n                    minorTicks[pos].render(null, true);\n                }\n\n                minorTicks[pos].render(null, false, 1);\n            },\n\n            /**\n             * Render a major tick into the given position. If a tick already exists\n             * in this position, move it.\n             * @param  {number} pos - The position in axis values\n             * @param  {number} i - The tick index\n             */\n            renderTick: function(pos, i) {\n                var isLinked = this.isLinked,\n                    ticks = this.ticks,\n                    slideInTicks = this.chart.hasRendered && isNumber(this.oldMin);\n\n                // Linked axes need an extra check to find out if\n                if (!isLinked || (pos >= this.min && pos <= this.max)) {\n\n                    if (!ticks[pos]) {\n                        ticks[pos] = new Tick(this, pos);\n                    }\n\n                    // render new ticks in old position\n                    if (slideInTicks && ticks[pos].isNew) {\n                        ticks[pos].render(i, true, 0.1);\n                    }\n\n                    ticks[pos].render(i);\n                }\n            },\n\n            /**\n             * Render the axis\n             */\n            render: function() {\n                var axis = this,\n                    chart = axis.chart,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    isLog = axis.isLog,\n                    lin2log = axis.lin2log,\n                    isLinked = axis.isLinked,\n                    tickPositions = axis.tickPositions,\n                    axisTitle = axis.axisTitle,\n                    ticks = axis.ticks,\n                    minorTicks = axis.minorTicks,\n                    alternateBands = axis.alternateBands,\n                    stackLabelOptions = options.stackLabels,\n                    alternateGridColor = options.alternateGridColor,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    axisLine = axis.axisLine,\n                    showAxis = axis.showAxis,\n                    animation = animObject(renderer.globalAnimation),\n                    from,\n                    to;\n\n                // Reset\n                axis.labelEdge.length = 0;\n                //axis.justifyToPlot = overflow === 'justify';\n                axis.overlap = false;\n\n                // Mark all elements inActive before we go over and mark the active ones\n                each([ticks, minorTicks, alternateBands], function(coll) {\n                    objectEach(coll, function(tick) {\n                        tick.isActive = false;\n                    });\n                });\n\n                // If the series has data draw the ticks. Else only the line and title\n                if (axis.hasData() || isLinked) {\n\n                    // minor ticks\n                    if (axis.minorTickInterval && !axis.categories) {\n                        each(axis.getMinorTickPositions(), function(pos) {\n                            axis.renderMinorTick(pos);\n                        });\n                    }\n\n                    // Major ticks. Pull out the first item and render it last so that\n                    // we can get the position of the neighbour label. #808.\n                    if (tickPositions.length) { // #1300\n                        each(tickPositions, function(pos, i) {\n                            axis.renderTick(pos, i);\n                        });\n                        // In a categorized axis, the tick marks are displayed between labels. So\n                        // we need to add a tick mark and grid line at the left edge of the X axis.\n                        if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n                            if (!ticks[-1]) {\n                                ticks[-1] = new Tick(axis, -1, null, true);\n                            }\n                            ticks[-1].render(-1);\n                        }\n\n                    }\n\n                    // alternate grid color\n                    if (alternateGridColor) {\n                        each(tickPositions, function(pos, i) {\n                            to = tickPositions[i + 1] !== undefined ? tickPositions[i + 1] + tickmarkOffset : axis.max - tickmarkOffset;\n                            if (i % 2 === 0 && pos < axis.max && to <= axis.max + (chart.polar ? -tickmarkOffset : tickmarkOffset)) { // #2248, #4660\n                                if (!alternateBands[pos]) {\n                                    alternateBands[pos] = new H.PlotLineOrBand(axis);\n                                }\n                                from = pos + tickmarkOffset; // #949\n                                alternateBands[pos].options = {\n                                    from: isLog ? lin2log(from) : from,\n                                    to: isLog ? lin2log(to) : to,\n                                    color: alternateGridColor\n                                };\n                                alternateBands[pos].render();\n                                alternateBands[pos].isActive = true;\n                            }\n                        });\n                    }\n\n                    // custom plot lines and bands\n                    if (!axis._addedPlotLB) { // only first time\n                        each((options.plotLines || []).concat(options.plotBands || []), function(plotLineOptions) {\n                            axis.addPlotBandOrLine(plotLineOptions);\n                        });\n                        axis._addedPlotLB = true;\n                    }\n\n                } // end if hasData\n\n                // Remove inactive ticks\n                each([ticks, minorTicks, alternateBands], function(coll) {\n                    var i,\n                        forDestruction = [],\n                        delay = animation.duration,\n                        destroyInactiveItems = function() {\n                            i = forDestruction.length;\n                            while (i--) {\n                                // When resizing rapidly, the same items may be destroyed in different timeouts,\n                                // or the may be reactivated\n                                if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {\n                                    coll[forDestruction[i]].destroy();\n                                    delete coll[forDestruction[i]];\n                                }\n                            }\n\n                        };\n\n                    objectEach(coll, function(tick, pos) {\n                        if (!tick.isActive) {\n                            // Render to zero opacity\n                            tick.render(pos, false, 0);\n                            tick.isActive = false;\n                            forDestruction.push(pos);\n                        }\n                    });\n\n                    // When the objects are finished fading out, destroy them\n                    syncTimeout(\n                        destroyInactiveItems,\n                        coll === alternateBands || !chart.hasRendered || !delay ? 0 : delay\n                    );\n                });\n\n                // Set the axis line path\n                if (axisLine) {\n                    axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n                        d: this.getLinePath(axisLine.strokeWidth())\n                    });\n                    axisLine.isPlaced = true;\n\n                    // Show or hide the line depending on options.showEmpty\n                    axisLine[showAxis ? 'show' : 'hide'](true);\n                }\n\n                if (axisTitle && showAxis) {\n                    var titleXy = axis.getTitlePosition();\n                    if (isNumber(titleXy.y)) {\n                        axisTitle[axisTitle.isNew ? 'attr' : 'animate'](titleXy);\n                        axisTitle.isNew = false;\n                    } else {\n                        axisTitle.attr('y', -9999);\n                        axisTitle.isNew = true;\n                    }\n                }\n\n                // Stacked totals:\n                if (stackLabelOptions && stackLabelOptions.enabled) {\n                    axis.renderStackTotals();\n                }\n                // End stacked totals\n\n                axis.isDirty = false;\n            },\n\n            /**\n             * Redraw the axis to reflect changes in the data or axis extremes\n             */\n            redraw: function() {\n\n                if (this.visible) {\n                    // render the axis\n                    this.render();\n\n                    // move plot lines and bands\n                    each(this.plotLinesAndBands, function(plotLine) {\n                        plotLine.render();\n                    });\n                }\n\n                // mark associated series as dirty and ready for redraw\n                each(this.series, function(series) {\n                    series.isDirty = true;\n                });\n\n            },\n\n            // Properties to survive after destroy, needed for Axis.update (#4317,\n            // #5773, #5881).\n            keepProps: ['extKey', 'hcEvents', 'names', 'series', 'userMax', 'userMin'],\n\n            /**\n             * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n             * to fully remove the axis.\n             *\n             * @private\n             * @param  {Boolean} keepEvents\n             *         Whether to preserve events, used internally in Axis.update.\n             */\n            destroy: function(keepEvents) {\n                var axis = this,\n                    stacks = axis.stacks,\n                    plotLinesAndBands = axis.plotLinesAndBands,\n                    plotGroup,\n                    i;\n\n                // Remove the events\n                if (!keepEvents) {\n                    removeEvent(axis);\n                }\n\n                // Destroy each stack total\n                objectEach(stacks, function(stack, stackKey) {\n                    destroyObjectProperties(stack);\n\n                    stacks[stackKey] = null;\n                });\n\n                // Destroy collections\n                each([axis.ticks, axis.minorTicks, axis.alternateBands], function(coll) {\n                    destroyObjectProperties(coll);\n                });\n                if (plotLinesAndBands) {\n                    i = plotLinesAndBands.length;\n                    while (i--) { // #1975\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n\n                // Destroy local variables\n                each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'gridGroup', 'labelGroup', 'cross'], function(prop) {\n                    if (axis[prop]) {\n                        axis[prop] = axis[prop].destroy();\n                    }\n                });\n\n                // Destroy each generated group for plotlines and plotbands\n                for (plotGroup in axis.plotLinesAndBandsGroups) {\n                    axis.plotLinesAndBandsGroups[plotGroup] = axis.plotLinesAndBandsGroups[plotGroup].destroy();\n                }\n\n                // Delete all properties and fall back to the prototype.\n                objectEach(axis, function(val, key) {\n                    if (inArray(key, axis.keepProps) === -1) {\n                        delete axis[key];\n                    }\n                });\n            },\n\n            /**\n             * Internal function to draw a crosshair.\n             *\n             * @param  {PointerEvent} [e]\n             *         The event arguments from the modified pointer event, extended \n             *         with `chartX` and `chartY`\n             * @param  {Point} [point]\n             *         The Point object if the crosshair snaps to points.\n             */\n            drawCrosshair: function(e, point) {\n\n                var path,\n                    options = this.crosshair,\n                    snap = pick(options.snap, true),\n                    pos,\n                    categorized,\n                    graphic = this.cross;\n\n                // Use last available event when updating non-snapped crosshairs without\n                // mouse interaction (#5287)\n                if (!e) {\n                    e = this.cross && this.cross.e;\n                }\n\n                if (\n                    // Disabled in options\n                    !this.crosshair ||\n                    // Snap\n                    ((defined(point) || !snap) === false)\n                ) {\n                    this.hideCrosshair();\n                } else {\n\n                    // Get the path\n                    if (!snap) {\n                        pos = e && (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);\n                    } else if (defined(point)) {\n                        pos = this.isXAxis ? point.plotX : this.len - point.plotY; // #3834\n                    }\n\n                    if (defined(pos)) {\n                        path = this.getPlotLinePath(\n                            // First argument, value, only used on radial\n                            point && (this.isXAxis ? point.x : pick(point.stackY, point.y)),\n                            null,\n                            null,\n                            null,\n                            pos // Translated position\n                        ) || null; // #3189\n                    }\n\n                    if (!defined(path)) {\n                        this.hideCrosshair();\n                        return;\n                    }\n\n                    categorized = this.categories && !this.isRadial;\n\n                    // Draw the cross\n                    if (!graphic) {\n                        this.cross = graphic = this.chart.renderer\n                            .path()\n                            .addClass('highcharts-crosshair highcharts-crosshair-' +\n                                (categorized ? 'category ' : 'thin ') + options.className)\n                            .attr({\n                                zIndex: pick(options.zIndex, 2)\n                            })\n                            .add();\n\n\n                        // Presentational attributes\n                        graphic.attr({\n                            'stroke': options.color || (categorized ? color('#ccd6eb').setOpacity(0.25).get() : '#cccccc'),\n                            'stroke-width': pick(options.width, 1)\n                        });\n                        if (options.dashStyle) {\n                            graphic.attr({\n                                dashstyle: options.dashStyle\n                            });\n                        }\n\n\n                    }\n\n                    graphic.show().attr({\n                        d: path\n                    });\n\n                    if (categorized && !options.width) {\n                        graphic.attr({\n                            'stroke-width': this.transA\n                        });\n                    }\n                    this.cross.e = e;\n                }\n            },\n\n            /**\n             *\tHide the crosshair.\n             */\n            hideCrosshair: function() {\n                if (this.cross) {\n                    this.cross.hide();\n                }\n            }\n        }); // end Axis\n\n        H.Axis = Axis;\n        return Axis;\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            Date = H.Date,\n            dateFormat = H.dateFormat,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            getMagnitude = H.getMagnitude,\n            getTZOffset = H.getTZOffset,\n            normalizeTickInterval = H.normalizeTickInterval,\n            pick = H.pick,\n            timeUnits = H.timeUnits;\n        /**\n         * Set the tick positions to a time unit that makes sense, for example\n         * on the first of each month or on every Monday. Return an array\n         * with the time positions. Used in datetime axes as well as for grouping\n         * data on a datetime axis.\n         *\n         * @param {Object} normalizedInterval The interval in axis values (ms) and the count\n         * @param {Number} min The minimum in axis values\n         * @param {Number} max The maximum in axis values\n         * @param {Number} startOfWeek\n         */\n        Axis.prototype.getTimeTicks = function(normalizedInterval, min, max, startOfWeek) {\n            var tickPositions = [],\n                i,\n                higherRanks = {},\n                useUTC = defaultOptions.global.useUTC,\n                minYear, // used in months and years as a basis for Date.UTC()\n                // When crossing DST, use the max. Resolves #6278.\n                minDate = new Date(min - Math.max(getTZOffset(min), getTZOffset(max))),\n                makeTime = Date.hcMakeTime,\n                interval = normalizedInterval.unitRange,\n                count = normalizedInterval.count,\n                variableDayLength;\n\n            if (defined(min)) { // #1300\n                minDate[Date.hcSetMilliseconds](interval >= timeUnits.second ? 0 : // #3935\n                    count * Math.floor(minDate.getMilliseconds() / count)); // #3652, #3654\n\n                if (interval >= timeUnits.second) { // second\n                    minDate[Date.hcSetSeconds](interval >= timeUnits.minute ? 0 : // #3935\n                        count * Math.floor(minDate.getSeconds() / count));\n                }\n\n                if (interval >= timeUnits.minute) { // minute\n                    minDate[Date.hcSetMinutes](interval >= timeUnits.hour ? 0 :\n                        count * Math.floor(minDate[Date.hcGetMinutes]() / count));\n                }\n\n                if (interval >= timeUnits.hour) { // hour\n                    minDate[Date.hcSetHours](interval >= timeUnits.day ? 0 :\n                        count * Math.floor(minDate[Date.hcGetHours]() / count));\n                }\n\n                if (interval >= timeUnits.day) { // day\n                    minDate[Date.hcSetDate](interval >= timeUnits.month ? 1 :\n                        count * Math.floor(minDate[Date.hcGetDate]() / count));\n                }\n\n                if (interval >= timeUnits.month) { // month\n                    minDate[Date.hcSetMonth](interval >= timeUnits.year ? 0 :\n                        count * Math.floor(minDate[Date.hcGetMonth]() / count));\n                    minYear = minDate[Date.hcGetFullYear]();\n                }\n\n                if (interval >= timeUnits.year) { // year\n                    minYear -= minYear % count;\n                    minDate[Date.hcSetFullYear](minYear);\n                }\n\n                // week is a special case that runs outside the hierarchy\n                if (interval === timeUnits.week) {\n                    // get start of current week, independent of count\n                    minDate[Date.hcSetDate](minDate[Date.hcGetDate]() - minDate[Date.hcGetDay]() +\n                        pick(startOfWeek, 1));\n                }\n\n\n                // Get basics for variable time spans\n                minYear = minDate[Date.hcGetFullYear]();\n                var minMonth = minDate[Date.hcGetMonth](),\n                    minDateDate = minDate[Date.hcGetDate](),\n                    minHours = minDate[Date.hcGetHours]();\n\n\n                // Handle local timezone offset\n                if (Date.hcTimezoneOffset || Date.hcGetTimezoneOffset) {\n\n                    // Detect whether we need to take the DST crossover into\n                    // consideration. If we're crossing over DST, the day length may be\n                    // 23h or 25h and we need to compute the exact clock time for each\n                    // tick instead of just adding hours. This comes at a cost, so first\n                    // we found out if it is needed. #4951.\n                    variableDayLength =\n                        (!useUTC || !!Date.hcGetTimezoneOffset) &&\n                        (\n                            // Long range, assume we're crossing over.\n                            max - min > 4 * timeUnits.month ||\n                            // Short range, check if min and max are in different time \n                            // zones.\n                            getTZOffset(min) !== getTZOffset(max)\n                        );\n\n                    // Adjust minDate to the offset date\n                    minDate = minDate.getTime();\n                    minDate = new Date(minDate + getTZOffset(minDate));\n                }\n\n\n                // Iterate and add tick positions at appropriate values\n                var time = minDate.getTime();\n                i = 1;\n                while (time < max) {\n                    tickPositions.push(time);\n\n                    // if the interval is years, use Date.UTC to increase years\n                    if (interval === timeUnits.year) {\n                        time = makeTime(minYear + i * count, 0);\n\n                        // if the interval is months, use Date.UTC to increase months\n                    } else if (interval === timeUnits.month) {\n                        time = makeTime(minYear, minMonth + i * count);\n\n                        // if we're using global time, the interval is not fixed as it jumps\n                        // one hour at the DST crossover\n                    } else if (variableDayLength && (interval === timeUnits.day || interval === timeUnits.week)) {\n                        time = makeTime(minYear, minMonth, minDateDate +\n                            i * count * (interval === timeUnits.day ? 1 : 7));\n\n                    } else if (variableDayLength && interval === timeUnits.hour) {\n                        time = makeTime(minYear, minMonth, minDateDate, minHours + i * count);\n\n                        // else, the interval is fixed and we use simple addition\n                    } else {\n                        time += interval * count;\n                    }\n\n                    i++;\n                }\n\n                // push the last time\n                tickPositions.push(time);\n\n\n                // Handle higher ranks. Mark new days if the time is on midnight\n                // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold to \n                // prevent looping over dense data grouping (#6156).\n                if (interval <= timeUnits.hour && tickPositions.length < 10000) {\n                    each(tickPositions, function(time) {\n                        if (\n                            // Speed optimization, no need to run dateFormat unless\n                            // we're on a full or half hour\n                            time % 1800000 === 0 &&\n                            // Check for local or global midnight\n                            dateFormat('%H%M%S%L', time) === '000000000'\n                        ) {\n                            higherRanks[time] = 'day';\n                        }\n                    });\n                }\n            }\n\n\n            // record information on the chosen unit - for dynamic label formatter\n            tickPositions.info = extend(normalizedInterval, {\n                higherRanks: higherRanks,\n                totalRange: interval * count\n            });\n\n            return tickPositions;\n        };\n\n        /**\n         * Get a normalized tick interval for dates. Returns a configuration object with\n         * unit range (interval), count and name. Used to prepare data for getTimeTicks.\n         * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs\n         * of segments in stock charts, the normalizing logic was extracted in order to\n         * prevent it for running over again for each segment having the same interval.\n         * #662, #697.\n         */\n        Axis.prototype.normalizeTimeTickInterval = function(tickInterval, unitsOption) {\n            var units = unitsOption || [\n                    [\n                        'millisecond', // unit name\n                        [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                    ],\n                    [\n                        'second', [1, 2, 5, 10, 15, 30]\n                    ],\n                    [\n                        'minute', [1, 2, 5, 10, 15, 30]\n                    ],\n                    [\n                        'hour', [1, 2, 3, 4, 6, 8, 12]\n                    ],\n                    [\n                        'day', [1, 2]\n                    ],\n                    [\n                        'week', [1, 2]\n                    ],\n                    [\n                        'month', [1, 2, 3, 4, 6]\n                    ],\n                    [\n                        'year',\n                        null\n                    ]\n                ],\n                unit = units[units.length - 1], // default unit is years\n                interval = timeUnits[unit[0]],\n                multiples = unit[1],\n                count,\n                i;\n\n            // loop through the units to find the one that best fits the tickInterval\n            for (i = 0; i < units.length; i++) {\n                unit = units[i];\n                interval = timeUnits[unit[0]];\n                multiples = unit[1];\n\n\n                if (units[i + 1]) {\n                    // lessThan is in the middle between the highest multiple and the next unit.\n                    var lessThan = (interval * multiples[multiples.length - 1] +\n                        timeUnits[units[i + 1][0]]) / 2;\n\n                    // break and keep the current unit\n                    if (tickInterval <= lessThan) {\n                        break;\n                    }\n                }\n            }\n\n            // prevent 2.5 years intervals, though 25, 250 etc. are allowed\n            if (interval === timeUnits.year && tickInterval < 5 * interval) {\n                multiples = [1, 2, 5];\n            }\n\n            // get the count\n            count = normalizeTickInterval(\n                tickInterval / interval,\n                multiples,\n                unit[0] === 'year' ? Math.max(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360\n            );\n\n            return {\n                unitRange: interval,\n                count: count,\n                unitName: unit[0]\n            };\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            getMagnitude = H.getMagnitude,\n            map = H.map,\n            normalizeTickInterval = H.normalizeTickInterval,\n            pick = H.pick;\n        /**\n         * Methods defined on the Axis prototype\n         */\n\n        /**\n         * Set the tick positions of a logarithmic axis\n         */\n        Axis.prototype.getLogTickPositions = function(interval, min, max, minor) {\n            var axis = this,\n                options = axis.options,\n                axisLength = axis.len,\n                lin2log = axis.lin2log,\n                log2lin = axis.log2lin,\n                // Since we use this method for both major and minor ticks,\n                // use a local variable and return the result\n                positions = [];\n\n            // Reset\n            if (!minor) {\n                axis._minorAutoInterval = null;\n            }\n\n            // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n            if (interval >= 0.5) {\n                interval = Math.round(interval);\n                positions = axis.getLinearTickPositions(interval, min, max);\n\n                // Second case: We need intermediary ticks. For example\n                // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n            } else if (interval >= 0.08) {\n                var roundedMin = Math.floor(min),\n                    intermediate,\n                    i,\n                    j,\n                    len,\n                    pos,\n                    lastPos,\n                    break2;\n\n                if (interval > 0.3) {\n                    intermediate = [1, 2, 4];\n                } else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc\n                    intermediate = [1, 2, 4, 6, 8];\n                } else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n                    intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n                }\n\n                for (i = roundedMin; i < max + 1 && !break2; i++) {\n                    len = intermediate.length;\n                    for (j = 0; j < len && !break2; j++) {\n                        pos = log2lin(lin2log(i) * intermediate[j]);\n                        if (pos > min && (!minor || lastPos <= max) && lastPos !== undefined) { // #1670, lastPos is #3113\n                            positions.push(lastPos);\n                        }\n\n                        if (lastPos > max) {\n                            break2 = true;\n                        }\n                        lastPos = pos;\n                    }\n                }\n\n                // Third case: We are so deep in between whole logarithmic values that\n                // we might as well handle the tick positions like a linear axis. For\n                // example 1.01, 1.02, 1.03, 1.04.\n            } else {\n                var realMin = lin2log(min),\n                    realMax = lin2log(max),\n                    tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],\n                    filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,\n                    tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n                    totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;\n\n                interval = pick(\n                    filteredTickIntervalOption,\n                    axis._minorAutoInterval,\n                    (realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)\n                );\n\n                interval = normalizeTickInterval(\n                    interval,\n                    null,\n                    getMagnitude(interval)\n                );\n\n                positions = map(axis.getLinearTickPositions(\n                    interval,\n                    realMin,\n                    realMax\n                ), log2lin);\n\n                if (!minor) {\n                    axis._minorAutoInterval = interval / 5;\n                }\n            }\n\n            // Set the axis-level tickInterval variable\n            if (!minor) {\n                axis.tickInterval = interval;\n            }\n            return positions;\n        };\n\n        Axis.prototype.log2lin = function(num) {\n            return Math.log(num) / Math.LN10;\n        };\n\n        Axis.prototype.lin2log = function(num) {\n            return Math.pow(10, num);\n        };\n\n    }(Highcharts));\n    (function(H, Axis) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            each = H.each,\n            erase = H.erase,\n            merge = H.merge,\n            pick = H.pick;\n        /*\n         * The object wrapper for plot lines and plot bands\n         * @param {Object} options\n         */\n        H.PlotLineOrBand = function(axis, options) {\n            this.axis = axis;\n\n            if (options) {\n                this.options = options;\n                this.id = options.id;\n            }\n        };\n\n        H.PlotLineOrBand.prototype = {\n\n            /**\n             * Render the plot line or plot band. If it is already existing,\n             * move it.\n             */\n            render: function() {\n                var plotLine = this,\n                    axis = plotLine.axis,\n                    horiz = axis.horiz,\n                    options = plotLine.options,\n                    optionsLabel = options.label,\n                    label = plotLine.label,\n                    to = options.to,\n                    from = options.from,\n                    value = options.value,\n                    isBand = defined(from) && defined(to),\n                    isLine = defined(value),\n                    svgElem = plotLine.svgElem,\n                    isNew = !svgElem,\n                    path = [],\n                    color = options.color,\n                    zIndex = pick(options.zIndex, 0),\n                    events = options.events,\n                    attribs = {\n                        'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') + (options.className || '')\n                    },\n                    groupAttribs = {},\n                    renderer = axis.chart.renderer,\n                    groupName = isBand ? 'bands' : 'lines',\n                    group,\n                    log2lin = axis.log2lin;\n\n                // logarithmic conversion\n                if (axis.isLog) {\n                    from = log2lin(from);\n                    to = log2lin(to);\n                    value = log2lin(value);\n                }\n\n\n                // Set the presentational attributes\n                if (isLine) {\n                    attribs = {\n                        stroke: color,\n                        'stroke-width': options.width\n                    };\n                    if (options.dashStyle) {\n                        attribs.dashstyle = options.dashStyle;\n                    }\n\n                } else if (isBand) { // plot band\n                    if (color) {\n                        attribs.fill = color;\n                    }\n                    if (options.borderWidth) {\n                        attribs.stroke = options.borderColor;\n                        attribs['stroke-width'] = options.borderWidth;\n                    }\n                }\n\n\n                // Grouping and zIndex\n                groupAttribs.zIndex = zIndex;\n                groupName += '-' + zIndex;\n\n                group = axis.plotLinesAndBandsGroups[groupName];\n                if (!group) {\n                    axis.plotLinesAndBandsGroups[groupName] = group = renderer.g('plot-' + groupName)\n                        .attr(groupAttribs).add();\n                }\n\n                // Create the path\n                if (isNew) {\n                    plotLine.svgElem = svgElem =\n                        renderer\n                        .path()\n                        .attr(attribs).add(group);\n                }\n\n\n                // Set the path or return\n                if (isLine) {\n                    path = axis.getPlotLinePath(value, svgElem.strokeWidth());\n                } else if (isBand) { // plot band\n                    path = axis.getPlotBandPath(from, to, options);\n                } else {\n                    return;\n                }\n\n\n                // common for lines and bands\n                if (isNew && path && path.length) {\n                    svgElem.attr({\n                        d: path\n                    });\n\n                    // events\n                    if (events) {\n                        H.objectEach(events, function(event, eventType) {\n                            svgElem.on(eventType, function(e) {\n                                events[eventType].apply(plotLine, [e]);\n                            });\n                        });\n                    }\n                } else if (svgElem) {\n                    if (path) {\n                        svgElem.show();\n                        svgElem.animate({\n                            d: path\n                        });\n                    } else {\n                        svgElem.hide();\n                        if (label) {\n                            plotLine.label = label = label.destroy();\n                        }\n                    }\n                }\n\n                // the plot band/line label\n                if (optionsLabel && defined(optionsLabel.text) && path && path.length &&\n                    axis.width > 0 && axis.height > 0 && !path.flat) {\n                    // apply defaults\n                    optionsLabel = merge({\n                        align: horiz && isBand && 'center',\n                        x: horiz ? !isBand && 4 : 10,\n                        verticalAlign: !horiz && isBand && 'middle',\n                        y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n                        rotation: horiz && !isBand && 90\n                    }, optionsLabel);\n\n                    this.renderLabel(optionsLabel, path, isBand, zIndex);\n\n                } else if (label) { // move out of sight\n                    label.hide();\n                }\n\n                // chainable\n                return plotLine;\n            },\n\n            /**\n             * Render and align label for plot line or band.\n             */\n            renderLabel: function(optionsLabel, path, isBand, zIndex) {\n                var plotLine = this,\n                    label = plotLine.label,\n                    renderer = plotLine.axis.chart.renderer,\n                    attribs,\n                    xs,\n                    ys,\n                    x,\n                    y;\n\n                // add the SVG element\n                if (!label) {\n                    attribs = {\n                        align: optionsLabel.textAlign || optionsLabel.align,\n                        rotation: optionsLabel.rotation,\n                        'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') + '-label ' + (optionsLabel.className || '')\n                    };\n\n                    attribs.zIndex = zIndex;\n\n                    plotLine.label = label = renderer.text(\n                            optionsLabel.text,\n                            0,\n                            0,\n                            optionsLabel.useHTML\n                        )\n                        .attr(attribs)\n                        .add();\n\n\n                    label.css(optionsLabel.style);\n\n                }\n\n                // get the bounding box and align the label\n                // #3000 changed to better handle choice between plotband or plotline\n                xs = [path[1], path[4], (isBand ? path[6] : path[1])];\n                ys = [path[2], path[5], (isBand ? path[7] : path[2])];\n                x = arrayMin(xs);\n                y = arrayMin(ys);\n\n                label.align(optionsLabel, false, {\n                    x: x,\n                    y: y,\n                    width: arrayMax(xs) - x,\n                    height: arrayMax(ys) - y\n                });\n                label.show();\n            },\n\n            /**\n             * Remove the plot line or band\n             */\n            destroy: function() {\n                // remove it from the lookup\n                erase(this.axis.plotLinesAndBands, this);\n\n                delete this.axis;\n                destroyObjectProperties(this);\n            }\n        };\n\n        /**\n         * Object with members for extending the Axis prototype\n         * @todo Extend directly instead of adding object to Highcharts first\n         */\n\n        H.extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n            /**\n             * Create the path for a plot band\n             */\n            getPlotBandPath: function(from, to) {\n                var toPath = this.getPlotLinePath(to, null, null, true),\n                    path = this.getPlotLinePath(from, null, null, true),\n                    // #4964 check if chart is inverted or plotband is on yAxis \n                    horiz = this.horiz,\n                    plus = 1,\n                    outside =\n                    (from < this.min && to < this.min) ||\n                    (from > this.max && to > this.max);\n\n                if (path && toPath) {\n\n                    // Flat paths don't need labels (#3836)\n                    if (outside) {\n                        path.flat = path.toString() === toPath.toString();\n                        plus = 0;\n                    }\n\n                    // Add 1 pixel, when coordinates are the same\n                    path.push(\n                        horiz && toPath[4] === path[4] ? toPath[4] + plus : toPath[4], !horiz && toPath[5] === path[5] ? toPath[5] + plus : toPath[5],\n                        horiz && toPath[1] === path[1] ? toPath[1] + plus : toPath[1], !horiz && toPath[2] === path[2] ? toPath[2] + plus : toPath[2]\n                    );\n                } else { // outside the axis area\n                    path = null;\n                }\n\n                return path;\n            },\n\n            /**\n             * Add a plot band after render time.\n             *\n             * @param  {AxisPlotBandsOptions} options\n             *         A configuration object for the plot band, as defined in {@link\n             *         https://api.highcharts.com/highcharts/xAxis.plotBands|\n             *         xAxis.plotBands}.\n             * @return {Object}\n             *         The added plot band.\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             */\n            addPlotBand: function(options) {\n                return this.addPlotBandOrLine(options, 'plotBands');\n            },\n\n            /**\n             * Add a plot line after render time.\n             * \n             * @param  {AxisPlotLinesOptions} options\n             *         A configuration object for the plot line, as defined in {@link\n             *         https://api.highcharts.com/highcharts/xAxis.plotLines|\n             *         xAxis.plotLines}.\n             * @return {Object}\n             *         The added plot line.\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             */\n            addPlotLine: function(options) {\n                return this.addPlotBandOrLine(options, 'plotLines');\n            },\n\n            /**\n             * Add a plot band or plot line after render time. Called from addPlotBand\n             * and addPlotLine internally.\n             *\n             * @private\n             * @param  options {AxisPlotLinesOptions|AxisPlotBandsOptions}\n             *         The plotBand or plotLine configuration object.\n             */\n            addPlotBandOrLine: function(options, coll) {\n                var obj = new H.PlotLineOrBand(this, options).render(),\n                    userOptions = this.userOptions;\n\n                if (obj) { // #2189\n                    // Add it to the user options for exporting and Axis.update\n                    if (coll) {\n                        userOptions[coll] = userOptions[coll] || [];\n                        userOptions[coll].push(options);\n                    }\n                    this.plotLinesAndBands.push(obj);\n                }\n\n                return obj;\n            },\n\n            /**\n             * Remove a plot band or plot line from the chart by id. Called internally\n             * from `removePlotBand` and `removePlotLine`.\n             *\n             * @private\n             * @param {String} id\n             */\n            removePlotBandOrLine: function(id) {\n                var plotLinesAndBands = this.plotLinesAndBands,\n                    options = this.options,\n                    userOptions = this.userOptions,\n                    i = plotLinesAndBands.length;\n                while (i--) {\n                    if (plotLinesAndBands[i].id === id) {\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n                each([\n                    options.plotLines || [],\n                    userOptions.plotLines || [],\n                    options.plotBands || [],\n                    userOptions.plotBands || []\n                ], function(arr) {\n                    i = arr.length;\n                    while (i--) {\n                        if (arr[i].id === id) {\n                            erase(arr, arr[i]);\n                        }\n                    }\n                });\n            },\n\n            /**\n             * Remove a plot band by its id.\n             * \n             * @param  {String} id\n             *         The plot band's `id` as given in the original configuration\n             *         object or in the `addPlotBand` option.\n             * @sample highcharts/members/axis-removeplotband/\n             *         Remove plot band by id\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             */\n            removePlotBand: function(id) {\n                this.removePlotBandOrLine(id);\n            },\n\n            /**\n             * Remove a plot line by its id.\n             * @param  {String} id\n             *         The plot line's `id` as given in the original configuration\n             *         object or in the `addPlotLine` option.\n             * @sample highcharts/xaxis/plotlines-id/\n             *         Remove plot line by id\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             */\n            removePlotLine: function(id) {\n                this.removePlotBandOrLine(id);\n            }\n        });\n\n    }(Highcharts, Axis));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var dateFormat = H.dateFormat,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            isNumber = H.isNumber,\n            map = H.map,\n            merge = H.merge,\n            pick = H.pick,\n            splat = H.splat,\n            syncTimeout = H.syncTimeout,\n            timeUnits = H.timeUnits;\n        /**\n         * The tooltip object\n         * @param {Object} chart The chart instance\n         * @param {Object} options Tooltip options\n         */\n        H.Tooltip = function() {\n            this.init.apply(this, arguments);\n        };\n\n        H.Tooltip.prototype = {\n\n            init: function(chart, options) {\n\n                // Save the chart and options\n                this.chart = chart;\n                this.options = options;\n\n                // Keep track of the current series\n                //this.currentSeries = undefined;\n\n                // List of crosshairs\n                this.crosshairs = [];\n\n                // Current values of x and y when animating\n                this.now = {\n                    x: 0,\n                    y: 0\n                };\n\n                // The tooltip is initially hidden\n                this.isHidden = true;\n\n\n\n                // Public property for getting the shared state.\n                this.split = options.split && !chart.inverted;\n                this.shared = options.shared || this.split;\n\n            },\n\n            /**\n             * Destroy the single tooltips in a split tooltip.\n             * If the tooltip is active then it is not destroyed, unless forced to.\n             * @param  {boolean} force Force destroy all tooltips.\n             * @return {undefined}\n             */\n            cleanSplit: function(force) {\n                each(this.chart.series, function(series) {\n                    var tt = series && series.tt;\n                    if (tt) {\n                        if (!tt.isActive || force) {\n                            series.tt = tt.destroy();\n                        } else {\n                            tt.isActive = false;\n                        }\n                    }\n                });\n            },\n\n\n\n\n            /**\n             * Create the Tooltip label element if it doesn't exist, then return the\n             * label.\n             */\n            getLabel: function() {\n\n                var renderer = this.chart.renderer,\n                    options = this.options;\n\n                if (!this.label) {\n                    // Create the label\n                    if (this.split) {\n                        this.label = renderer.g('tooltip');\n                    } else {\n                        this.label = renderer.label(\n                                '',\n                                0,\n                                0,\n                                options.shape || 'callout',\n                                null,\n                                null,\n                                options.useHTML,\n                                null,\n                                'tooltip'\n                            )\n                            .attr({\n                                padding: options.padding,\n                                r: options.borderRadius\n                            });\n\n\n                        this.label\n                            .attr({\n                                'fill': options.backgroundColor,\n                                'stroke-width': options.borderWidth\n                            })\n                            // #2301, #2657\n                            .css(options.style)\n                            .shadow(options.shadow);\n\n                    }\n\n\n\n                    this.label\n                        .attr({\n                            zIndex: 8\n                        })\n                        .add();\n                }\n                return this.label;\n            },\n\n            update: function(options) {\n                this.destroy();\n                // Update user options (#6218)\n                merge(true, this.chart.options.tooltip.userOptions, options);\n                this.init(this.chart, merge(true, this.options, options));\n            },\n\n            /**\n             * Destroy the tooltip and its elements.\n             */\n            destroy: function() {\n                // Destroy and clear local variables\n                if (this.label) {\n                    this.label = this.label.destroy();\n                }\n                if (this.split && this.tt) {\n                    this.cleanSplit(this.chart, true);\n                    this.tt = this.tt.destroy();\n                }\n                clearTimeout(this.hideTimer);\n                clearTimeout(this.tooltipTimeout);\n            },\n\n            /**\n             * Provide a soft movement for the tooltip\n             *\n             * @param {Number} x\n             * @param {Number} y\n             * @private\n             */\n            move: function(x, y, anchorX, anchorY) {\n                var tooltip = this,\n                    now = tooltip.now,\n                    animate = tooltip.options.animation !== false && !tooltip.isHidden &&\n                    // When we get close to the target position, abort animation and land on the right place (#3056)\n                    (Math.abs(x - now.x) > 1 || Math.abs(y - now.y) > 1),\n                    skipAnchor = tooltip.followPointer || tooltip.len > 1;\n\n                // Get intermediate values for animation\n                extend(now, {\n                    x: animate ? (2 * now.x + x) / 3 : x,\n                    y: animate ? (now.y + y) / 2 : y,\n                    anchorX: skipAnchor ? undefined : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n                    anchorY: skipAnchor ? undefined : animate ? (now.anchorY + anchorY) / 2 : anchorY\n                });\n\n                // Move to the intermediate value\n                tooltip.getLabel().attr(now);\n\n\n                // Run on next tick of the mouse tracker\n                if (animate) {\n\n                    // Never allow two timeouts\n                    clearTimeout(this.tooltipTimeout);\n\n                    // Set the fixed interval ticking for the smooth tooltip\n                    this.tooltipTimeout = setTimeout(function() {\n                        // The interval function may still be running during destroy,\n                        // so check that the chart is really there before calling.\n                        if (tooltip) {\n                            tooltip.move(x, y, anchorX, anchorY);\n                        }\n                    }, 32);\n\n                }\n            },\n\n            /**\n             * Hide the tooltip\n             */\n            hide: function(delay) {\n                var tooltip = this;\n                clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)\n                delay = pick(delay, this.options.hideDelay, 500);\n                if (!this.isHidden) {\n                    this.hideTimer = syncTimeout(function() {\n                        tooltip.getLabel()[delay ? 'fadeOut' : 'hide']();\n                        tooltip.isHidden = true;\n                    }, delay);\n                }\n            },\n\n            /**\n             * Extendable method to get the anchor position of the tooltip\n             * from a point or set of points\n             */\n            getAnchor: function(points, mouseEvent) {\n                var ret,\n                    chart = this.chart,\n                    inverted = chart.inverted,\n                    plotTop = chart.plotTop,\n                    plotLeft = chart.plotLeft,\n                    plotX = 0,\n                    plotY = 0,\n                    yAxis,\n                    xAxis;\n\n                points = splat(points);\n\n                // Pie uses a special tooltipPos\n                ret = points[0].tooltipPos;\n\n                // When tooltip follows mouse, relate the position to the mouse\n                if (this.followPointer && mouseEvent) {\n                    if (mouseEvent.chartX === undefined) {\n                        mouseEvent = chart.pointer.normalize(mouseEvent);\n                    }\n                    ret = [\n                        mouseEvent.chartX - chart.plotLeft,\n                        mouseEvent.chartY - plotTop\n                    ];\n                }\n                // When shared, use the average position\n                if (!ret) {\n                    each(points, function(point) {\n                        yAxis = point.series.yAxis;\n                        xAxis = point.series.xAxis;\n                        plotX += point.plotX + (!inverted && xAxis ? xAxis.left - plotLeft : 0);\n                        plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +\n                            (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n                    });\n\n                    plotX /= points.length;\n                    plotY /= points.length;\n\n                    ret = [\n                        inverted ? chart.plotWidth - plotY : plotX,\n                        this.shared && !inverted && points.length > 1 && mouseEvent ?\n                        mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)\n                        inverted ? chart.plotHeight - plotX : plotY\n                    ];\n                }\n\n                return map(ret, Math.round);\n            },\n\n            /**\n             * Place the tooltip in a chart without spilling over\n             * and not covering the point it self.\n             */\n            getPosition: function(boxWidth, boxHeight, point) {\n\n                var chart = this.chart,\n                    distance = this.distance,\n                    ret = {},\n                    h = point.h || 0, // #4117\n                    swapped,\n                    first = ['y', chart.chartHeight, boxHeight,\n                        point.plotY + chart.plotTop, chart.plotTop,\n                        chart.plotTop + chart.plotHeight\n                    ],\n                    second = ['x', chart.chartWidth, boxWidth,\n                        point.plotX + chart.plotLeft, chart.plotLeft,\n                        chart.plotLeft + chart.plotWidth\n                    ],\n                    // The far side is right or bottom\n                    preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984\n                    /**\n                     * Handle the preferred dimension. When the preferred dimension is tooltip\n                     * on top or bottom of the point, it will look for space there.\n                     */\n                    firstDimension = function(dim, outerSize, innerSize, point, min, max) {\n                        var roomLeft = innerSize < point - distance,\n                            roomRight = point + distance + innerSize < outerSize,\n                            alignedLeft = point - distance - innerSize,\n                            alignedRight = point + distance;\n\n                        if (preferFarSide && roomRight) {\n                            ret[dim] = alignedRight;\n                        } else if (!preferFarSide && roomLeft) {\n                            ret[dim] = alignedLeft;\n                        } else if (roomLeft) {\n                            ret[dim] = Math.min(max - innerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n                        } else if (roomRight) {\n                            ret[dim] = Math.max(\n                                min,\n                                alignedRight + h + innerSize > outerSize ?\n                                alignedRight :\n                                alignedRight + h\n                            );\n                        } else {\n                            return false;\n                        }\n                    },\n                    /**\n                     * Handle the secondary dimension. If the preferred dimension is tooltip\n                     * on top or bottom of the point, the second dimension is to align the tooltip\n                     * above the point, trying to align center but allowing left or right\n                     * align within the chart box.\n                     */\n                    secondDimension = function(dim, outerSize, innerSize, point) {\n                        var retVal;\n\n                        // Too close to the edge, return false and swap dimensions\n                        if (point < distance || point > outerSize - distance) {\n                            retVal = false;\n                            // Align left/top\n                        } else if (point < innerSize / 2) {\n                            ret[dim] = 1;\n                            // Align right/bottom\n                        } else if (point > outerSize - innerSize / 2) {\n                            ret[dim] = outerSize - innerSize - 2;\n                            // Align center\n                        } else {\n                            ret[dim] = point - innerSize / 2;\n                        }\n                        return retVal;\n                    },\n                    /**\n                     * Swap the dimensions\n                     */\n                    swap = function(count) {\n                        var temp = first;\n                        first = second;\n                        second = temp;\n                        swapped = count;\n                    },\n                    run = function() {\n                        if (firstDimension.apply(0, first) !== false) {\n                            if (secondDimension.apply(0, second) === false && !swapped) {\n                                swap(true);\n                                run();\n                            }\n                        } else if (!swapped) {\n                            swap(true);\n                            run();\n                        } else {\n                            ret.x = ret.y = 0;\n                        }\n                    };\n\n                // Under these conditions, prefer the tooltip on the side of the point\n                if (chart.inverted || this.len > 1) {\n                    swap();\n                }\n                run();\n\n                return ret;\n\n            },\n\n            /**\n             * In case no user defined formatter is given, this will be used. Note that the context\n             * here is an object holding point, series, x, y etc.\n             *\n             * @returns {String|Array<String>}\n             */\n            defaultFormatter: function(tooltip) {\n                var items = this.points || splat(this),\n                    s;\n\n                // Build the header\n                s = [tooltip.tooltipFooterHeaderFormatter(items[0])];\n\n                // build the values\n                s = s.concat(tooltip.bodyFormatter(items));\n\n                // footer\n                s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));\n\n                return s;\n            },\n\n            /**\n             * Refresh the tooltip's text and position.\n             * @param {Object|Array} pointOrPoints Rither a point or an array of points\n             */\n            refresh: function(pointOrPoints, mouseEvent) {\n                var tooltip = this,\n                    label,\n                    options = tooltip.options,\n                    x,\n                    y,\n                    point = pointOrPoints,\n                    anchor,\n                    textConfig = {},\n                    text,\n                    pointConfig = [],\n                    formatter = options.formatter || tooltip.defaultFormatter,\n                    shared = tooltip.shared,\n                    currentSeries;\n\n                clearTimeout(this.hideTimer);\n\n                // get the reference point coordinates (pie charts use tooltipPos)\n                tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;\n                anchor = tooltip.getAnchor(point, mouseEvent);\n                x = anchor[0];\n                y = anchor[1];\n\n                // shared tooltip, array is sent over\n                if (shared && !(point.series && point.series.noSharedTooltip)) {\n                    each(point, function(item) {\n                        item.setState('hover');\n\n                        pointConfig.push(item.getLabelConfig());\n                    });\n\n                    textConfig = {\n                        x: point[0].category,\n                        y: point[0].y\n                    };\n                    textConfig.points = pointConfig;\n                    point = point[0];\n\n                    // single point tooltip\n                } else {\n                    textConfig = point.getLabelConfig();\n                }\n                this.len = pointConfig.length; // #6128\n                text = formatter.call(textConfig, tooltip);\n\n                // register the current series\n                currentSeries = point.series;\n                this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n\n                // update the inner HTML\n                if (text === false) {\n                    this.hide();\n                } else {\n\n                    label = tooltip.getLabel();\n\n                    // show it\n                    if (tooltip.isHidden) {\n                        label.attr({\n                            opacity: 1\n                        }).show();\n                    }\n\n                    // update text\n                    if (tooltip.split) {\n                        this.renderSplit(text, pointOrPoints);\n                    } else {\n\n                        // Prevent the tooltip from flowing over the chart box (#6659)\n\n                        if (!options.style.width) {\n\n                            label.css({\n                                width: this.chart.spacingBox.width\n                            });\n\n                        }\n\n\n                        label.attr({\n                            text: text && text.join ? text.join('') : text\n                        });\n\n                        // Set the stroke color of the box to reflect the point\n                        label.removeClass(/highcharts-color-[\\d]+/g)\n                            .addClass('highcharts-color-' + pick(point.colorIndex, currentSeries.colorIndex));\n\n\n                        label.attr({\n                            stroke: options.borderColor || point.color || currentSeries.color || '#666666'\n                        });\n\n\n                        tooltip.updatePosition({\n                            plotX: x,\n                            plotY: y,\n                            negative: point.negative,\n                            ttBelow: point.ttBelow,\n                            h: anchor[2] || 0\n                        });\n                    }\n\n                    this.isHidden = false;\n                }\n            },\n\n            /**\n             * Render the split tooltip. Loops over each point's text and adds\n             * a label next to the point, then uses the distribute function to \n             * find best non-overlapping positions.\n             */\n            renderSplit: function(labels, points) {\n                var tooltip = this,\n                    boxes = [],\n                    chart = this.chart,\n                    ren = chart.renderer,\n                    rightAligned = true,\n                    options = this.options,\n                    headerHeight,\n                    tooltipLabel = this.getLabel();\n\n                // Create the individual labels for header and points, ignore footer\n                each(labels.slice(0, points.length + 1), function(str, i) {\n                    var point = points[i - 1] ||\n                        // Item 0 is the header. Instead of this, we could also use the crosshair label\n                        {\n                            isHeader: true,\n                            plotX: points[0].plotX\n                        },\n                        owner = point.series || tooltip,\n                        tt = owner.tt,\n                        series = point.series || {},\n                        colorClass = 'highcharts-color-' + pick(point.colorIndex, series.colorIndex, 'none'),\n                        target,\n                        x,\n                        bBox,\n                        boxWidth;\n\n                    // Store the tooltip referance on the series\n                    if (!tt) {\n                        owner.tt = tt = ren.label(null, null, null, 'callout')\n                            .addClass('highcharts-tooltip-box ' + colorClass)\n                            .attr({\n                                'padding': options.padding,\n                                'r': options.borderRadius,\n\n                                'fill': options.backgroundColor,\n                                'stroke': point.color || series.color || '#333333',\n                                'stroke-width': options.borderWidth\n\n                            })\n                            .add(tooltipLabel);\n                    }\n\n                    tt.isActive = true;\n                    tt.attr({\n                        text: str\n                    });\n\n                    tt.css(options.style);\n\n\n                    // Get X position now, so we can move all to the other side in case of overflow\n                    bBox = tt.getBBox();\n                    boxWidth = bBox.width + tt.strokeWidth();\n                    if (point.isHeader) {\n                        headerHeight = bBox.height;\n                        x = Math.max(\n                            0, // No left overflow\n                            Math.min(\n                                point.plotX + chart.plotLeft - boxWidth / 2,\n                                chart.chartWidth - boxWidth // No right overflow (#5794)\n                            )\n                        );\n                    } else {\n                        x = point.plotX + chart.plotLeft - pick(options.distance, 16) -\n                            boxWidth;\n                    }\n\n\n                    // If overflow left, we don't use this x in the next loop\n                    if (x < 0) {\n                        rightAligned = false;\n                    }\n\n                    // Prepare for distribution\n                    target = (point.series && point.series.yAxis && point.series.yAxis.pos) + (point.plotY || 0);\n                    target -= chart.plotTop;\n                    boxes.push({\n                        target: point.isHeader ? chart.plotHeight + headerHeight : target,\n                        rank: point.isHeader ? 1 : 0,\n                        size: owner.tt.getBBox().height + 1,\n                        point: point,\n                        x: x,\n                        tt: tt\n                    });\n                });\n\n                // Clean previous run (for missing points)\n                this.cleanSplit();\n\n                // Distribute and put in place\n                H.distribute(boxes, chart.plotHeight + headerHeight);\n                each(boxes, function(box) {\n                    var point = box.point,\n                        series = point.series;\n\n                    // Put the label in place\n                    box.tt.attr({\n                        visibility: box.pos === undefined ? 'hidden' : 'inherit',\n                        x: (rightAligned || point.isHeader ?\n                            box.x :\n                            point.plotX + chart.plotLeft + pick(options.distance, 16)),\n                        y: box.pos + chart.plotTop,\n                        anchorX: point.isHeader ?\n                            point.plotX + chart.plotLeft : point.plotX + series.xAxis.pos,\n                        anchorY: point.isHeader ?\n                            box.pos + chart.plotTop - 15 : point.plotY + series.yAxis.pos\n                    });\n                });\n            },\n\n            /**\n             * Find the new position and perform the move\n             */\n            updatePosition: function(point) {\n                var chart = this.chart,\n                    label = this.getLabel(),\n                    pos = (this.options.positioner || this.getPosition).call(\n                        this,\n                        label.width,\n                        label.height,\n                        point\n                    );\n\n                // do the move\n                this.move(\n                    Math.round(pos.x),\n                    Math.round(pos.y || 0), // can be undefined (#3977) \n                    point.plotX + chart.plotLeft,\n                    point.plotY + chart.plotTop\n                );\n            },\n\n            /**\n             * Get the optimal date format for a point, based on a range.\n             * @param  {number} range - The time range\n             * @param  {number|Date} date - The date of the point in question\n             * @param  {number} startOfWeek - An integer representing the first day of\n             * the week, where 0 is Sunday\n             * @param  {Object} dateTimeLabelFormats - A map of time units to formats\n             * @return {string} - the optimal date format for a point\n             */\n            getDateFormat: function(range, date, startOfWeek, dateTimeLabelFormats) {\n                var dateStr = dateFormat('%m-%d %H:%M:%S.%L', date),\n                    format,\n                    n,\n                    blank = '01-01 00:00:00.000',\n                    strpos = {\n                        millisecond: 15,\n                        second: 12,\n                        minute: 9,\n                        hour: 6,\n                        day: 3\n                    },\n                    lastN = 'millisecond'; // for sub-millisecond data, #4223\n                for (n in timeUnits) {\n\n                    // If the range is exactly one week and we're looking at a Sunday/Monday, go for the week format\n                    if (range === timeUnits.week && +dateFormat('%w', date) === startOfWeek &&\n                        dateStr.substr(6) === blank.substr(6)) {\n                        n = 'week';\n                        break;\n                    }\n\n                    // The first format that is too great for the range\n                    if (timeUnits[n] > range) {\n                        n = lastN;\n                        break;\n                    }\n\n                    // If the point is placed every day at 23:59, we need to show\n                    // the minutes as well. #2637.\n                    if (strpos[n] && dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n                        break;\n                    }\n\n                    // Weeks are outside the hierarchy, only apply them on Mondays/Sundays like in the first condition\n                    if (n !== 'week') {\n                        lastN = n;\n                    }\n                }\n\n                if (n) {\n                    format = dateTimeLabelFormats[n];\n                }\n\n                return format;\n            },\n\n            /**\n             * Get the best X date format based on the closest point range on the axis.\n             */\n            getXDateFormat: function(point, options, xAxis) {\n                var xDateFormat,\n                    dateTimeLabelFormats = options.dateTimeLabelFormats,\n                    closestPointRange = xAxis && xAxis.closestPointRange;\n\n                if (closestPointRange) {\n                    xDateFormat = this.getDateFormat(\n                        closestPointRange,\n                        point.x,\n                        xAxis.options.startOfWeek,\n                        dateTimeLabelFormats\n                    );\n                } else {\n                    xDateFormat = dateTimeLabelFormats.day;\n                }\n\n                return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581\n            },\n\n            /**\n             * Format the footer/header of the tooltip\n             * #3397: abstraction to enable formatting of footer and header\n             */\n            tooltipFooterHeaderFormatter: function(labelConfig, isFooter) {\n                var footOrHead = isFooter ? 'footer' : 'header',\n                    series = labelConfig.series,\n                    tooltipOptions = series.tooltipOptions,\n                    xDateFormat = tooltipOptions.xDateFormat,\n                    xAxis = series.xAxis,\n                    isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(labelConfig.key),\n                    formatString = tooltipOptions[footOrHead + 'Format'];\n\n                // Guess the best date format based on the closest point distance (#568, #3418)\n                if (isDateTime && !xDateFormat) {\n                    xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n                }\n\n                // Insert the footer date format if any\n                if (isDateTime && xDateFormat) {\n                    formatString = formatString.replace('{point.key}', '{point.key:' + xDateFormat + '}');\n                }\n\n                return format(formatString, {\n                    point: labelConfig,\n                    series: series\n                });\n            },\n\n            /**\n             * Build the body (lines) of the tooltip by iterating over the items and returning one entry for each item,\n             * abstracting this functionality allows to easily overwrite and extend it.\n             */\n            bodyFormatter: function(items) {\n                return map(items, function(item) {\n                    var tooltipOptions = item.series.tooltipOptions;\n                    return (tooltipOptions.pointFormatter || item.point.tooltipFormatter)\n                        .call(item.point, tooltipOptions.pointFormat);\n                });\n            }\n\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            attr = H.attr,\n            charts = H.charts,\n            color = H.color,\n            css = H.css,\n            defined = H.defined,\n            doc = H.doc,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            offset = H.offset,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            Tooltip = H.Tooltip,\n            win = H.win;\n\n        /**\n         * The mouse tracker object. All methods starting with \"on\" are primary DOM\n         * event handlers. Subsequent methods should be named differently from what they\n         * are doing.\n         *\n         * @constructor Pointer\n         * @param {Object} chart The Chart instance\n         * @param {Object} options The root options object\n         */\n        H.Pointer = function(chart, options) {\n            this.init(chart, options);\n        };\n\n        H.Pointer.prototype = {\n            /**\n             * Initialize Pointer\n             */\n            init: function(chart, options) {\n\n                // Store references\n                this.options = options;\n                this.chart = chart;\n\n                // Do we need to handle click on a touch device?\n                this.runChartClick = options.chart.events && !!options.chart.events.click;\n\n                this.pinchDown = [];\n                this.lastValidTouch = {};\n\n                if (Tooltip && options.tooltip.enabled) {\n                    chart.tooltip = new Tooltip(chart, options.tooltip);\n                    this.followTouchMove = pick(options.tooltip.followTouchMove, true);\n                }\n\n                this.setDOMEvents();\n            },\n\n            /**\n             * Resolve the zoomType option, this is reset on all touch start and mouse\n             * down events.\n             */\n            zoomOption: function(e) {\n                var chart = this.chart,\n                    options = chart.options.chart,\n                    zoomType = options.zoomType || '',\n                    inverted = chart.inverted,\n                    zoomX,\n                    zoomY;\n\n                // Look for the pinchType option\n                if (/touch/.test(e.type)) {\n                    zoomType = pick(options.pinchType, zoomType);\n                }\n\n                this.zoomX = zoomX = /x/.test(zoomType);\n                this.zoomY = zoomY = /y/.test(zoomType);\n                this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n                this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n                this.hasZoom = zoomX || zoomY;\n            },\n\n            /**\n             * @typedef  {Object} PointerEvent\n             *           A native browser mouse or touch event, extended with position\n             *           information relative to the {@link Chart.container}.\n             * @property {Number} chartX\n             *           The X coordinate of the pointer interaction relative to the\n             *           chart.\n             * @property {Number} chartY\n             *           The Y coordinate of the pointer interaction relative to the \n             *           chart.\n             * \n             */\n            /**\n             * Add crossbrowser support for chartX and chartY.\n             * \n             * @param  {Object} e\n             *         The event object in standard browsers.\n             *\n             * @return {PointerEvent}\n             *         A browser event with extended properties `chartX` and `chartY`\n             */\n            normalize: function(e, chartPosition) {\n                var chartX,\n                    chartY,\n                    ePos;\n\n                // IE normalizing\n                e = e || win.event;\n                if (!e.target) {\n                    e.target = e.srcElement;\n                }\n\n                // iOS (#2757)\n                ePos = e.touches ? (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;\n\n                // Get mouse position\n                if (!chartPosition) {\n                    this.chartPosition = chartPosition = offset(this.chart.container);\n                }\n\n                // chartX and chartY\n                if (ePos.pageX === undefined) { // IE < 9. #886.\n                    chartX = Math.max(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is \n                    // for IE10 quirks mode within framesets\n                    chartY = e.y;\n                } else {\n                    chartX = ePos.pageX - chartPosition.left;\n                    chartY = ePos.pageY - chartPosition.top;\n                }\n\n                return extend(e, {\n                    chartX: Math.round(chartX),\n                    chartY: Math.round(chartY)\n                });\n            },\n\n            /**\n             * Get the click position in terms of axis values.\n             *\n             * @param {Object} e A pointer event\n             */\n            getCoordinates: function(e) {\n                var coordinates = {\n                    xAxis: [],\n                    yAxis: []\n                };\n\n                each(this.chart.axes, function(axis) {\n                    coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n                        axis: axis,\n                        value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n                    });\n                });\n                return coordinates;\n            },\n            /**\n             * Collects the points closest to a mouseEvent\n             * @param  {Array} series Array of series to gather points from\n             * @param  {Boolean} shared True if shared tooltip, otherwise false\n             * @param  {Object} e Mouse event which possess a position to compare against\n             * @return {Array} KDPoints sorted by distance\n             */\n            getKDPoints: function(series, shared, e) {\n                var kdpoints = [],\n                    noSharedTooltip,\n                    directTouch,\n                    kdpointT,\n                    i;\n\n                // Find nearest points on all series\n                each(series, function(s) {\n                    // Skip hidden series\n                    noSharedTooltip = s.noSharedTooltip && shared;\n                    directTouch = !shared && s.directTouch;\n                    if (s.visible && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821\n                        // #3828\n                        kdpointT = s.searchPoint(\n                            e, !noSharedTooltip && s.options.findNearestPointBy.indexOf('y') < 0\n                        );\n                        if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)\n                            kdpoints.push(kdpointT);\n                        }\n                    }\n                });\n\n                // Sort kdpoints by distance to mouse pointer\n                kdpoints.sort(function(p1, p2) {\n                    var isCloserX = p1.distX - p2.distX,\n                        isCloser = p1.dist - p2.dist,\n                        isAbove =\n                        (p2.series.group && p2.series.group.zIndex) -\n                        (p1.series.group && p1.series.group.zIndex),\n                        result;\n\n                    // We have two points which are not in the same place on xAxis and shared tooltip:\n                    if (isCloserX !== 0 && shared) { // #5721\n                        result = isCloserX;\n                        // Points are not exactly in the same place on x/yAxis:\n                    } else if (isCloser !== 0) {\n                        result = isCloser;\n                        // The same xAxis and yAxis position, sort by z-index:\n                    } else if (isAbove !== 0) {\n                        result = isAbove;\n                        // The same zIndex, sort by array index:\n                    } else {\n                        result = p1.series.index > p2.series.index ? -1 : 1;\n                    }\n                    return result;\n                });\n\n                // Remove points with different x-positions, required for shared tooltip and crosshairs (#4645):\n                if (shared && kdpoints[0] && !kdpoints[0].series.noSharedTooltip) {\n                    i = kdpoints.length;\n                    while (i--) {\n                        if (kdpoints[i].x !== kdpoints[0].x || kdpoints[i].series.noSharedTooltip) {\n                            kdpoints.splice(i, 1);\n                        }\n                    }\n                }\n                return kdpoints;\n            },\n            getPointFromEvent: function(e) {\n                var target = e.target,\n                    point;\n\n                while (target && !point) {\n                    point = target.point;\n                    target = target.parentNode;\n                }\n                return point;\n            },\n\n            getChartCoordinatesFromPoint: function(point, inverted) {\n                var series = point.series,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n\n                if (xAxis && yAxis) {\n                    return inverted ? {\n                        chartX: xAxis.len + xAxis.pos - point.clientX,\n                        chartY: yAxis.len + yAxis.pos - point.plotY\n                    } : {\n                        chartX: point.clientX + xAxis.pos,\n                        chartY: point.plotY + yAxis.pos\n                    };\n                }\n            },\n\n            /**\n             * Calculates what is the current hovered point/points and series.\n             *\n             * @private\n             *\n             * @param  {undefined|Point} existingHoverPoint\n             *         The point currrently beeing hovered.\n             * @param  {undefined|Series} existingHoverSeries\n             *         The series currently beeing hovered.\n             * @param  {Array<.Series>} series\n             *         All the series in the chart.\n             * @param  {boolean} isDirectTouch\n             *         Is the pointer directly hovering the point.\n             * @param  {boolean} shared\n             *         Whether it is a shared tooltip or not.\n             * @param  {object} coordinates\n             *         Chart coordinates of the pointer.\n             * @param  {number} coordinates.chartX\n             * @param  {number} coordinates.chartY\n             * \n             * @return {object}\n             *         Object containing resulting hover data.\n             */\n            getHoverData: function(\n                existingHoverPoint,\n                existingHoverSeries,\n                series,\n                isDirectTouch,\n                shared,\n                coordinates\n            ) {\n                var hoverPoint = existingHoverPoint,\n                    hoverSeries = existingHoverSeries,\n                    searchSeries = shared ? series : [hoverSeries],\n                    useExisting = !!(isDirectTouch && existingHoverPoint),\n                    notSticky = hoverSeries && !hoverSeries.stickyTracking,\n                    isHoverPoint = function(point, i) {\n                        return i === 0;\n                    },\n                    hoverPoints;\n\n                // If there is a hoverPoint and its series requires direct touch (like\n                // columns, #3899), or we're on a noSharedTooltip series among shared\n                // tooltip series (#4546), use the existing hoverPoint.\n                if (useExisting) {\n                    isHoverPoint = function(p) {\n                        return p === existingHoverPoint;\n                    };\n                } else if (notSticky) {\n                    isHoverPoint = function(p) {\n                        return p.series === hoverSeries;\n                    };\n                } else {\n                    // Avoid series with stickyTracking false\n                    searchSeries = H.grep(series, function(s) {\n                        return s.stickyTracking;\n                    });\n                }\n                hoverPoints = (useExisting && !shared) ?\n                    // Non-shared tooltips with directTouch don't use the k-d-tree\n                    [existingHoverPoint] :\n                    this.getKDPoints(searchSeries, shared, coordinates);\n                hoverPoint = H.find(hoverPoints, isHoverPoint);\n                hoverSeries = hoverPoint && hoverPoint.series;\n\n                // In this case we could only look for the hoverPoint in series with\n                // stickyTracking, but we should still include all series in the shared\n                // tooltip.\n                if (!useExisting && !notSticky && shared) {\n                    hoverPoints = this.getKDPoints(series, shared, coordinates);\n                }\n                // Keep the order of series in tooltip\n                // Must be done after assigning of hoverPoint\n                hoverPoints.sort(function(p1, p2) {\n                    return p1.series.index - p2.series.index;\n                });\n\n                return {\n                    hoverPoint: hoverPoint,\n                    hoverSeries: hoverSeries,\n                    hoverPoints: hoverPoints\n                };\n            },\n            /**\n             * With line type charts with a single tracker, get the point closest to the mouse.\n             * Run Point.onMouseOver and display tooltip for the point or points.\n             */\n            runPointActions: function(e, p) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    series = chart.series,\n                    tooltip = chart.tooltip,\n                    shared = tooltip ? tooltip.shared : false,\n                    hoverPoint = p || chart.hoverPoint,\n                    hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries,\n                    // onMouseOver or already hovering a series with directTouch\n                    isDirectTouch = !!p || (\n                        (hoverSeries && hoverSeries.directTouch) &&\n                        pointer.isDirectTouch\n                    ),\n                    hoverData = this.getHoverData(\n                        hoverPoint,\n                        hoverSeries,\n                        series,\n                        isDirectTouch,\n                        shared,\n                        e\n                    ),\n                    useSharedTooltip,\n                    followPointer,\n                    anchor,\n                    points;\n                // Update variables from hoverData.\n                hoverPoint = hoverData.hoverPoint;\n                hoverSeries = hoverData.hoverSeries;\n                followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;\n                useSharedTooltip = (\n                    shared &&\n                    hoverPoint &&\n                    !hoverPoint.series.noSharedTooltip\n                );\n                points = (useSharedTooltip ?\n                    hoverData.hoverPoints :\n                    (hoverPoint ? [hoverPoint] : [])\n                );\n                // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n                // #3926, #4200\n                if (\n                    hoverPoint &&\n                    // !(hoverSeries && hoverSeries.directTouch) &&\n                    (hoverPoint !== chart.hoverPoint || (tooltip && tooltip.isHidden))\n                ) {\n                    each(chart.hoverPoints || [], function(p) {\n                        if (H.inArray(p, points) === -1) {\n                            p.setState();\n                        }\n                    });\n                    // Do mouseover on all points (#3919, #3985, #4410, #5622)\n                    each(points || [], function(p) {\n                        p.setState('hover');\n                    });\n                    // set normal state to previous series\n                    if (chart.hoverSeries !== hoverSeries) {\n                        hoverSeries.onMouseOver();\n                    }\n\n                    // If tracking is on series in stead of on each point, \n                    // fire mouseOver on hover point. // #4448\n                    if (chart.hoverPoint) {\n                        chart.hoverPoint.firePointEvent('mouseOut');\n                    }\n                    hoverPoint.firePointEvent('mouseOver');\n                    chart.hoverPoints = points;\n                    chart.hoverPoint = hoverPoint;\n                    // Draw tooltip if necessary\n                    if (tooltip) {\n                        tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n                    }\n                    // Update positions (regardless of kdpoint or hoverPoint)\n                } else if (followPointer && tooltip && !tooltip.isHidden) {\n                    anchor = tooltip.getAnchor([{}], e);\n                    tooltip.updatePosition({\n                        plotX: anchor[0],\n                        plotY: anchor[1]\n                    });\n                }\n\n                // Start the event listener to pick up the tooltip and crosshairs\n                if (!pointer.unDocMouseMove) {\n                    pointer.unDocMouseMove = addEvent(doc, 'mousemove', function(e) {\n                        var chart = charts[H.hoverChartIndex];\n                        if (chart) {\n                            chart.pointer.onDocumentMouseMove(e);\n                        }\n                    });\n                }\n\n                // Issues related to crosshair #4927, #5269 #5066, #5658\n                each(chart.axes, function drawAxisCrosshair(axis) {\n                    var snap = pick(axis.crosshair.snap, true);\n                    if (!snap) {\n                        axis.drawCrosshair(e);\n\n                        // Axis has snapping crosshairs, and one of the hover points belongs\n                        // to axis\n                    } else if (H.find(points, function(p) {\n                            return p.series[axis.coll] === axis;\n                        })) {\n                        axis.drawCrosshair(e, hoverPoint);\n                        // Axis has snapping crosshairs, but no hover point belongs to axis\n                    } else {\n                        axis.hideCrosshair();\n                    }\n                });\n            },\n\n            /**\n             * Reset the tracking by hiding the tooltip, the hover series state and the\n             * hover point\n             *\n             * @param allowMove {Boolean}\n             *        Instead of destroying the tooltip altogether, allow moving it if\n             *        possible\n             */\n            reset: function(allowMove, delay) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    hoverSeries = chart.hoverSeries,\n                    hoverPoint = chart.hoverPoint,\n                    hoverPoints = chart.hoverPoints,\n                    tooltip = chart.tooltip,\n                    tooltipPoints = tooltip && tooltip.shared ? hoverPoints : hoverPoint;\n\n                // Check if the points have moved outside the plot area (#1003, #4736, #5101)\n                if (allowMove && tooltipPoints) {\n                    each(splat(tooltipPoints), function(point) {\n                        if (point.series.isCartesian && point.plotX === undefined) {\n                            allowMove = false;\n                        }\n                    });\n                }\n\n                // Just move the tooltip, #349\n                if (allowMove) {\n                    if (tooltip && tooltipPoints) {\n                        tooltip.refresh(tooltipPoints);\n                        if (hoverPoint) { // #2500\n                            hoverPoint.setState(hoverPoint.state, true);\n                            each(chart.axes, function(axis) {\n                                if (axis.crosshair) {\n                                    axis.drawCrosshair(null, hoverPoint);\n                                }\n                            });\n                        }\n                    }\n\n                    // Full reset\n                } else {\n\n                    if (hoverPoint) {\n                        hoverPoint.onMouseOut();\n                    }\n\n                    if (hoverPoints) {\n                        each(hoverPoints, function(point) {\n                            point.setState();\n                        });\n                    }\n\n                    if (hoverSeries) {\n                        hoverSeries.onMouseOut();\n                    }\n\n                    if (tooltip) {\n                        tooltip.hide(delay);\n                    }\n\n                    if (pointer.unDocMouseMove) {\n                        pointer.unDocMouseMove = pointer.unDocMouseMove();\n                    }\n\n                    // Remove crosshairs\n                    each(chart.axes, function(axis) {\n                        axis.hideCrosshair();\n                    });\n\n                    pointer.hoverX = chart.hoverPoints = chart.hoverPoint = null;\n                }\n            },\n\n            /**\n             * Scale series groups to a certain scale and translation\n             */\n            scaleGroups: function(attribs, clip) {\n\n                var chart = this.chart,\n                    seriesAttribs;\n\n                // Scale each series\n                each(chart.series, function(series) {\n                    seriesAttribs = attribs || series.getPlotBox(); // #1701\n                    if (series.xAxis && series.xAxis.zoomEnabled && series.group) {\n                        series.group.attr(seriesAttribs);\n                        if (series.markerGroup) {\n                            series.markerGroup.attr(seriesAttribs);\n                            series.markerGroup.clip(clip ? chart.clipRect : null);\n                        }\n                        if (series.dataLabelsGroup) {\n                            series.dataLabelsGroup.attr(seriesAttribs);\n                        }\n                    }\n                });\n\n                // Clip\n                chart.clipRect.attr(clip || chart.clipBox);\n            },\n\n            /**\n             * Start a drag operation\n             */\n            dragStart: function(e) {\n                var chart = this.chart;\n\n                // Record the start position\n                chart.mouseIsDown = e.type;\n                chart.cancelClick = false;\n                chart.mouseDownX = this.mouseDownX = e.chartX;\n                chart.mouseDownY = this.mouseDownY = e.chartY;\n            },\n\n            /**\n             * Perform a drag operation in response to a mousemove event while the mouse is down\n             */\n            drag: function(e) {\n\n                var chart = this.chart,\n                    chartOptions = chart.options.chart,\n                    chartX = e.chartX,\n                    chartY = e.chartY,\n                    zoomHor = this.zoomHor,\n                    zoomVert = this.zoomVert,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    clickedInside,\n                    size,\n                    selectionMarker = this.selectionMarker,\n                    mouseDownX = this.mouseDownX,\n                    mouseDownY = this.mouseDownY,\n                    panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];\n\n                // If the device supports both touch and mouse (like IE11), and we are touch-dragging\n                // inside the plot area, don't handle the mouse event. #4339.\n                if (selectionMarker && selectionMarker.touch) {\n                    return;\n                }\n\n                // If the mouse is outside the plot area, adjust to cooordinates\n                // inside to prevent the selection marker from going outside\n                if (chartX < plotLeft) {\n                    chartX = plotLeft;\n                } else if (chartX > plotLeft + plotWidth) {\n                    chartX = plotLeft + plotWidth;\n                }\n\n                if (chartY < plotTop) {\n                    chartY = plotTop;\n                } else if (chartY > plotTop + plotHeight) {\n                    chartY = plotTop + plotHeight;\n                }\n\n                // determine if the mouse has moved more than 10px\n                this.hasDragged = Math.sqrt(\n                    Math.pow(mouseDownX - chartX, 2) +\n                    Math.pow(mouseDownY - chartY, 2)\n                );\n\n                if (this.hasDragged > 10) {\n                    clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n\n                    // make a selection\n                    if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {\n                        if (!selectionMarker) {\n                            this.selectionMarker = selectionMarker = chart.renderer.rect(\n                                    plotLeft,\n                                    plotTop,\n                                    zoomHor ? 1 : plotWidth,\n                                    zoomVert ? 1 : plotHeight,\n                                    0\n                                )\n                                .attr({\n\n                                    fill: chartOptions.selectionMarkerFill || color('#335cad').setOpacity(0.25).get(),\n\n                                    'class': 'highcharts-selection-marker',\n                                    'zIndex': 7\n                                })\n                                .add();\n                        }\n                    }\n\n                    // adjust the width of the selection marker\n                    if (selectionMarker && zoomHor) {\n                        size = chartX - mouseDownX;\n                        selectionMarker.attr({\n                            width: Math.abs(size),\n                            x: (size > 0 ? 0 : size) + mouseDownX\n                        });\n                    }\n                    // adjust the height of the selection marker\n                    if (selectionMarker && zoomVert) {\n                        size = chartY - mouseDownY;\n                        selectionMarker.attr({\n                            height: Math.abs(size),\n                            y: (size > 0 ? 0 : size) + mouseDownY\n                        });\n                    }\n\n                    // panning\n                    if (clickedInside && !selectionMarker && chartOptions.panning) {\n                        chart.pan(e, chartOptions.panning);\n                    }\n                }\n            },\n\n            /**\n             * On mouse up or touch end across the entire document, drop the selection.\n             */\n            drop: function(e) {\n                var pointer = this,\n                    chart = this.chart,\n                    hasPinched = this.hasPinched;\n\n                if (this.selectionMarker) {\n                    var selectionData = {\n                            originalEvent: e, // #4890\n                            xAxis: [],\n                            yAxis: []\n                        },\n                        selectionBox = this.selectionMarker,\n                        selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,\n                        selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,\n                        selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,\n                        selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,\n                        runZoom;\n\n                    // a selection has been made\n                    if (this.hasDragged || hasPinched) {\n\n                        // record each axis' min and max\n                        each(chart.axes, function(axis) {\n                            if (axis.zoomEnabled && defined(axis.min) && (hasPinched || pointer[{\n                                    xAxis: 'zoomX',\n                                    yAxis: 'zoomY'\n                                }[axis.coll]])) { // #859, #3569\n                                var horiz = axis.horiz,\n                                    minPixelPadding = e.type === 'touchend' ? axis.minPixelPadding : 0, // #1207, #3075\n                                    selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) + minPixelPadding),\n                                    selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight) - minPixelPadding);\n\n                                selectionData[axis.coll].push({\n                                    axis: axis,\n                                    min: Math.min(selectionMin, selectionMax), // for reversed axes\n                                    max: Math.max(selectionMin, selectionMax)\n                                });\n                                runZoom = true;\n                            }\n                        });\n                        if (runZoom) {\n                            fireEvent(chart, 'selection', selectionData, function(args) {\n                                chart.zoom(extend(args, hasPinched ? {\n                                    animation: false\n                                } : null));\n                            });\n                        }\n\n                    }\n                    this.selectionMarker = this.selectionMarker.destroy();\n\n                    // Reset scaling preview\n                    if (hasPinched) {\n                        this.scaleGroups();\n                    }\n                }\n\n                // Reset all\n                if (chart) { // it may be destroyed on mouse up - #877\n                    css(chart.container, {\n                        cursor: chart._cursor\n                    });\n                    chart.cancelClick = this.hasDragged > 10; // #370\n                    chart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n                    this.pinchDown = [];\n                }\n            },\n\n            onContainerMouseDown: function(e) {\n\n                e = this.normalize(e);\n\n                this.zoomOption(e);\n\n                // issue #295, dragging not always working in Firefox\n                if (e.preventDefault) {\n                    e.preventDefault();\n                }\n\n                this.dragStart(e);\n            },\n\n\n\n            onDocumentMouseUp: function(e) {\n                if (charts[H.hoverChartIndex]) {\n                    charts[H.hoverChartIndex].pointer.drop(e);\n                }\n            },\n\n            /**\n             * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.\n             * Issue #149 workaround. The mouseleave event does not always fire.\n             */\n            onDocumentMouseMove: function(e) {\n                var chart = this.chart,\n                    chartPosition = this.chartPosition;\n\n                e = this.normalize(e, chartPosition);\n\n                // If we're outside, hide the tooltip\n                if (chartPosition && !this.inClass(e.target, 'highcharts-tracker') &&\n                    !chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n                    this.reset();\n                }\n            },\n\n            /**\n             * When mouse leaves the container, hide the tooltip.\n             */\n            onContainerMouseLeave: function(e) {\n                var chart = charts[H.hoverChartIndex];\n                if (chart && (e.relatedTarget || e.toElement)) { // #4886, MS Touch end fires mouseleave but with no related target\n                    chart.pointer.reset();\n                    chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix\n                }\n            },\n\n            // The mousemove, touchmove and touchstart event handler\n            onContainerMouseMove: function(e) {\n\n                var chart = this.chart;\n\n                if (!defined(H.hoverChartIndex) || !charts[H.hoverChartIndex] || !charts[H.hoverChartIndex].mouseIsDown) {\n                    H.hoverChartIndex = chart.index;\n                }\n\n                e = this.normalize(e);\n                e.returnValue = false; // #2251, #3224\n\n                if (chart.mouseIsDown === 'mousedown') {\n                    this.drag(e);\n                }\n\n                // Show the tooltip and run mouse over events (#977)\n                if ((this.inClass(e.target, 'highcharts-tracker') ||\n                        chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {\n                    this.runPointActions(e);\n                }\n            },\n\n            /**\n             * Utility to detect whether an element has, or has a parent with, a specific\n             * class name. Used on detection of tracker objects and on deciding whether\n             * hovering the tooltip should cause the active series to mouse out.\n             */\n            inClass: function(element, className) {\n                var elemClassName;\n                while (element) {\n                    elemClassName = attr(element, 'class');\n                    if (elemClassName) {\n                        if (elemClassName.indexOf(className) !== -1) {\n                            return true;\n                        }\n                        if (elemClassName.indexOf('highcharts-container') !== -1) {\n                            return false;\n                        }\n                    }\n                    element = element.parentNode;\n                }\n            },\n\n            onTrackerMouseOut: function(e) {\n                var series = this.chart.hoverSeries,\n                    relatedTarget = e.relatedTarget || e.toElement;\n                this.isDirectTouch = false;\n                if (series && relatedTarget && !series.stickyTracking &&\n                    !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n                    (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465\n                        !this.inClass(relatedTarget, 'highcharts-tracker') // #5553\n                    )\n                ) {\n                    series.onMouseOut();\n                }\n            },\n\n            onContainerClick: function(e) {\n                var chart = this.chart,\n                    hoverPoint = chart.hoverPoint,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop;\n\n                e = this.normalize(e);\n\n                if (!chart.cancelClick) {\n\n                    // On tracker click, fire the series and point events. #783, #1583\n                    if (hoverPoint && this.inClass(e.target, 'highcharts-tracker')) {\n\n                        // the series click event\n                        fireEvent(hoverPoint.series, 'click', extend(e, {\n                            point: hoverPoint\n                        }));\n\n                        // the point click event\n                        if (chart.hoverPoint) { // it may be destroyed (#1844)\n                            hoverPoint.firePointEvent('click', e);\n                        }\n\n                        // When clicking outside a tracker, fire a chart event\n                    } else {\n                        extend(e, this.getCoordinates(e));\n\n                        // fire a click event in the chart\n                        if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {\n                            fireEvent(chart, 'click', e);\n                        }\n                    }\n\n\n                }\n            },\n\n            /**\n             * Set the JS DOM events on the container and document. This method should contain\n             * a one-to-one assignment between methods and their handlers. Any advanced logic should\n             * be moved to the handler reflecting the event's name.\n             */\n            setDOMEvents: function() {\n\n                var pointer = this,\n                    container = pointer.chart.container;\n\n                container.onmousedown = function(e) {\n                    pointer.onContainerMouseDown(e);\n                };\n                container.onmousemove = function(e) {\n                    pointer.onContainerMouseMove(e);\n                };\n                container.onclick = function(e) {\n                    pointer.onContainerClick(e);\n                };\n                addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);\n                if (H.chartCount === 1) {\n                    addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n                }\n                if (H.hasTouch) {\n                    container.ontouchstart = function(e) {\n                        pointer.onContainerTouchStart(e);\n                    };\n                    container.ontouchmove = function(e) {\n                        pointer.onContainerTouchMove(e);\n                    };\n                    if (H.chartCount === 1) {\n                        addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n                    }\n                }\n\n            },\n\n            /**\n             * Destroys the Pointer object and disconnects DOM events.\n             */\n            destroy: function() {\n                var pointer = this;\n\n                if (pointer.unDocMouseMove) {\n                    pointer.unDocMouseMove();\n                }\n\n                removeEvent(\n                    pointer.chart.container,\n                    'mouseleave',\n                    pointer.onContainerMouseLeave\n                );\n                if (!H.chartCount) {\n                    removeEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n                    removeEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n                }\n\n                // memory and CPU leak\n                clearInterval(pointer.tooltipTimeout);\n\n                H.objectEach(pointer, function(val, prop) {\n                    pointer[prop] = null;\n                });\n            }\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var charts = H.charts,\n            each = H.each,\n            extend = H.extend,\n            map = H.map,\n            noop = H.noop,\n            pick = H.pick,\n            Pointer = H.Pointer;\n\n        /* Support for touch devices */\n        extend(Pointer.prototype, /** @lends Pointer.prototype */ {\n\n            /**\n             * Run translation operations\n             */\n            pinchTranslate: function(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n                if (this.zoomHor) {\n                    this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n                if (this.zoomVert) {\n                    this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n            },\n\n            /**\n             * Run translation operations for each direction (horizontal and vertical) independently\n             */\n            pinchTranslateDirection: function(horiz, pinchDown, touches, transform,\n                selectionMarker, clip, lastValidTouch, forcedScale) {\n                var chart = this.chart,\n                    xy = horiz ? 'x' : 'y',\n                    XY = horiz ? 'X' : 'Y',\n                    sChartXY = 'chart' + XY,\n                    wh = horiz ? 'width' : 'height',\n                    plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],\n                    selectionWH,\n                    selectionXY,\n                    clipXY,\n                    scale = forcedScale || 1,\n                    inverted = chart.inverted,\n                    bounds = chart.bounds[horiz ? 'h' : 'v'],\n                    singleTouch = pinchDown.length === 1,\n                    touch0Start = pinchDown[0][sChartXY],\n                    touch0Now = touches[0][sChartXY],\n                    touch1Start = !singleTouch && pinchDown[1][sChartXY],\n                    touch1Now = !singleTouch && touches[1][sChartXY],\n                    outOfBounds,\n                    transformScale,\n                    scaleKey,\n                    setScale = function() {\n                        // Don't zoom if fingers are too close on this axis\n                        if (!singleTouch && Math.abs(touch0Start - touch1Start) > 20) {\n                            scale = forcedScale || Math.abs(touch0Now - touch1Now) / Math.abs(touch0Start - touch1Start);\n                        }\n\n                        clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n                        selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n                    };\n\n                // Set the scale, first pass\n                setScale();\n\n                selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not\n\n                // Out of bounds\n                if (selectionXY < bounds.min) {\n                    selectionXY = bounds.min;\n                    outOfBounds = true;\n                } else if (selectionXY + selectionWH > bounds.max) {\n                    selectionXY = bounds.max - selectionWH;\n                    outOfBounds = true;\n                }\n\n                // Is the chart dragged off its bounds, determined by dataMin and dataMax?\n                if (outOfBounds) {\n\n                    // Modify the touchNow position in order to create an elastic drag movement. This indicates\n                    // to the user that the chart is responsive but can't be dragged further.\n                    touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n                    if (!singleTouch) {\n                        touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n                    }\n\n                    // Set the scale, second pass to adapt to the modified touchNow positions\n                    setScale();\n\n                } else {\n                    lastValidTouch[xy] = [touch0Now, touch1Now];\n                }\n\n                // Set geometry for clipping, selection and transformation\n                if (!inverted) {\n                    clip[xy] = clipXY - plotLeftTop;\n                    clip[wh] = selectionWH;\n                }\n                scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n                transformScale = inverted ? 1 / scale : scale;\n\n                selectionMarker[wh] = selectionWH;\n                selectionMarker[xy] = selectionXY;\n                transform[scaleKey] = scale;\n                transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));\n            },\n\n            /**\n             * Handle touch events with two touches\n             */\n            pinch: function(e) {\n\n                var self = this,\n                    chart = self.chart,\n                    pinchDown = self.pinchDown,\n                    touches = e.touches,\n                    touchesLength = touches.length,\n                    lastValidTouch = self.lastValidTouch,\n                    hasZoom = self.hasZoom,\n                    selectionMarker = self.selectionMarker,\n                    transform = {},\n                    fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, 'highcharts-tracker') &&\n                        chart.runTrackerClick) || self.runChartClick),\n                    clip = {};\n\n                // Don't initiate panning until the user has pinched. This prevents us from\n                // blocking page scrolling as users scroll down a long page (#4210).\n                if (touchesLength > 1) {\n                    self.initiated = true;\n                }\n\n                // On touch devices, only proceed to trigger click if a handler is defined\n                if (hasZoom && self.initiated && !fireClickEvent) {\n                    e.preventDefault();\n                }\n\n                // Normalize each touch\n                map(touches, function(e) {\n                    return self.normalize(e);\n                });\n\n                // Register the touch start position\n                if (e.type === 'touchstart') {\n                    each(touches, function(e, i) {\n                        pinchDown[i] = {\n                            chartX: e.chartX,\n                            chartY: e.chartY\n                        };\n                    });\n                    lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];\n                    lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];\n\n                    // Identify the data bounds in pixels\n                    each(chart.axes, function(axis) {\n                        if (axis.zoomEnabled) {\n                            var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n                                minPixelPadding = axis.minPixelPadding,\n                                min = axis.toPixels(pick(axis.options.min, axis.dataMin)),\n                                max = axis.toPixels(pick(axis.options.max, axis.dataMax)),\n                                absMin = Math.min(min, max),\n                                absMax = Math.max(min, max);\n\n                            // Store the bounds for use in the touchmove handler\n                            bounds.min = Math.min(axis.pos, absMin - minPixelPadding);\n                            bounds.max = Math.max(axis.pos + axis.len, absMax + minPixelPadding);\n                        }\n                    });\n                    self.res = true; // reset on next move\n\n                    // Optionally move the tooltip on touchmove\n                } else if (self.followTouchMove && touchesLength === 1) {\n                    this.runPointActions(self.normalize(e));\n\n                    // Event type is touchmove, handle panning and pinching\n                } else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first\n\n\n                    // Set the marker\n                    if (!selectionMarker) {\n                        self.selectionMarker = selectionMarker = extend({\n                            destroy: noop,\n                            touch: true\n                        }, chart.plotBox);\n                    }\n\n                    self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n\n                    self.hasPinched = hasZoom;\n\n                    // Scale and translate the groups to provide visual feedback during pinching\n                    self.scaleGroups(transform, clip);\n\n                    if (self.res) {\n                        self.res = false;\n                        this.reset(false, 0);\n                    }\n                }\n            },\n\n            /**\n             * General touch handler shared by touchstart and touchmove.\n             */\n            touch: function(e, start) {\n                var chart = this.chart,\n                    hasMoved,\n                    pinchDown,\n                    isInside;\n\n                if (chart.index !== H.hoverChartIndex) {\n                    this.onContainerMouseLeave({\n                        relatedTarget: true\n                    });\n                }\n                H.hoverChartIndex = chart.index;\n\n                if (e.touches.length === 1) {\n\n                    e = this.normalize(e);\n\n                    isInside = chart.isInsidePlot(\n                        e.chartX - chart.plotLeft,\n                        e.chartY - chart.plotTop\n                    );\n                    if (isInside && !chart.openMenu) {\n\n                        // Run mouse events and display tooltip etc\n                        if (start) {\n                            this.runPointActions(e);\n                        }\n\n                        // Android fires touchmove events after the touchstart even if the\n                        // finger hasn't moved, or moved only a pixel or two. In iOS however,\n                        // the touchmove doesn't fire unless the finger moves more than ~4px.\n                        // So we emulate this behaviour in Android by checking how much it\n                        // moved, and cancelling on small distances. #3450.\n                        if (e.type === 'touchmove') {\n                            pinchDown = this.pinchDown;\n                            hasMoved = pinchDown[0] ? Math.sqrt( // #5266\n                                Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n                                Math.pow(pinchDown[0].chartY - e.chartY, 2)\n                            ) >= 4 : false;\n                        }\n\n                        if (pick(hasMoved, true)) {\n                            this.pinch(e);\n                        }\n\n                    } else if (start) {\n                        // Hide the tooltip on touching outside the plot area (#1203)\n                        this.reset();\n                    }\n\n                } else if (e.touches.length === 2) {\n                    this.pinch(e);\n                }\n            },\n\n            onContainerTouchStart: function(e) {\n                this.zoomOption(e);\n                this.touch(e, true);\n            },\n\n            onContainerTouchMove: function(e) {\n                this.touch(e);\n            },\n\n            onDocumentTouchEnd: function(e) {\n                if (charts[H.hoverChartIndex]) {\n                    charts[H.hoverChartIndex].pointer.drop(e);\n                }\n            }\n\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            charts = H.charts,\n            css = H.css,\n            doc = H.doc,\n            extend = H.extend,\n            hasTouch = H.hasTouch,\n            noop = H.noop,\n            Pointer = H.Pointer,\n            removeEvent = H.removeEvent,\n            win = H.win,\n            wrap = H.wrap;\n\n        if (!hasTouch && (win.PointerEvent || win.MSPointerEvent)) {\n\n            // The touches object keeps track of the points being touched at all times\n            var touches = {},\n                hasPointerEvent = !!win.PointerEvent,\n                getWebkitTouches = function() {\n                    var fake = [];\n                    fake.item = function(i) {\n                        return this[i];\n                    };\n                    H.objectEach(touches, function(touch) {\n                        fake.push({\n                            pageX: touch.pageX,\n                            pageY: touch.pageY,\n                            target: touch.target\n                        });\n                    });\n                    return fake;\n                },\n                translateMSPointer = function(e, method, wktype, func) {\n                    var p;\n                    if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[H.hoverChartIndex]) {\n                        func(e);\n                        p = charts[H.hoverChartIndex].pointer;\n                        p[method]({\n                            type: wktype,\n                            target: e.currentTarget,\n                            preventDefault: noop,\n                            touches: getWebkitTouches()\n                        });\n                    }\n                };\n\n            /**\n             * Extend the Pointer prototype with methods for each event handler and more\n             */\n            extend(Pointer.prototype, /** @lends Pointer.prototype */ {\n                onContainerPointerDown: function(e) {\n                    translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function(e) {\n                        touches[e.pointerId] = {\n                            pageX: e.pageX,\n                            pageY: e.pageY,\n                            target: e.currentTarget\n                        };\n                    });\n                },\n                onContainerPointerMove: function(e) {\n                    translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function(e) {\n                        touches[e.pointerId] = {\n                            pageX: e.pageX,\n                            pageY: e.pageY\n                        };\n                        if (!touches[e.pointerId].target) {\n                            touches[e.pointerId].target = e.currentTarget;\n                        }\n                    });\n                },\n                onDocumentPointerUp: function(e) {\n                    translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function(e) {\n                        delete touches[e.pointerId];\n                    });\n                },\n\n                /**\n                 * Add or remove the MS Pointer specific events\n                 */\n                batchMSEvents: function(fn) {\n                    fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);\n                    fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);\n                    fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);\n                }\n            });\n\n            // Disable default IE actions for pinch and such on chart element\n            wrap(Pointer.prototype, 'init', function(proceed, chart, options) {\n                proceed.call(this, chart, options);\n                if (this.hasZoom) { // #4014\n                    css(chart.container, {\n                        '-ms-touch-action': 'none',\n                        'touch-action': 'none'\n                    });\n                }\n            });\n\n            // Add IE specific touch events to chart\n            wrap(Pointer.prototype, 'setDOMEvents', function(proceed) {\n                proceed.apply(this);\n                if (this.hasZoom || this.followTouchMove) {\n                    this.batchMSEvents(addEvent);\n                }\n            });\n            // Destroy MS events also\n            wrap(Pointer.prototype, 'destroy', function(proceed) {\n                this.batchMSEvents(removeEvent);\n                proceed.call(this);\n            });\n        }\n\n    }(Highcharts));\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var H = Highcharts,\n\n            addEvent = H.addEvent,\n            css = H.css,\n            discardElement = H.discardElement,\n            defined = H.defined,\n            each = H.each,\n            isFirefox = H.isFirefox,\n            marginNames = H.marginNames,\n            merge = H.merge,\n            pick = H.pick,\n            setAnimation = H.setAnimation,\n            stableSort = H.stableSort,\n            win = H.win,\n            wrap = H.wrap;\n\n        /**\n         * The overview of the chart's series. The legend object is instanciated\n         * internally in the chart constructor, and available from `chart.legend`. Each\n         * chart has only one legend.\n         * \n         * @class\n         */\n        Highcharts.Legend = function(chart, options) {\n            this.init(chart, options);\n        };\n\n        Highcharts.Legend.prototype = {\n\n            /**\n             * Initialize the legend\n             */\n            init: function(chart, options) {\n\n                this.chart = chart;\n\n                this.setOptions(options);\n\n                if (options.enabled) {\n\n                    // Render it\n                    this.render();\n\n                    // move checkboxes\n                    addEvent(this.chart, 'endResize', function() {\n                        this.legend.positionCheckboxes();\n                    });\n                }\n            },\n\n            setOptions: function(options) {\n\n                var padding = pick(options.padding, 8);\n\n                this.options = options;\n\n\n                this.itemStyle = options.itemStyle;\n                this.itemHiddenStyle = merge(this.itemStyle, options.itemHiddenStyle);\n\n                this.itemMarginTop = options.itemMarginTop || 0;\n                this.padding = padding;\n                this.initialItemY = padding - 5; // 5 is pixels above the text\n                this.maxItemWidth = 0;\n                this.itemHeight = 0;\n                this.symbolWidth = pick(options.symbolWidth, 16);\n                this.pages = [];\n\n            },\n\n            /**\n             * Update the legend with new options. Equivalent to running `chart.update`\n             * with a legend configuration option.\n             * @param  {LegendOptions} options\n             *         Legend options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart.\n             *\n             * @sample highcharts/legend/legend-update/\n             *         Legend update\n             */\n            update: function(options, redraw) {\n                var chart = this.chart;\n\n                this.setOptions(merge(true, this.options, options));\n                this.destroy();\n                chart.isDirtyLegend = chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Set the colors for the legend item\n             * @param {Object} item A Series or Point instance\n             * @param {Object} visible Dimmed or colored\n             */\n            colorizeItem: function(item, visible) {\n                item.legendGroup[visible ? 'removeClass' : 'addClass'](\n                    'highcharts-legend-item-hidden'\n                );\n\n\n                var legend = this,\n                    options = legend.options,\n                    legendItem = item.legendItem,\n                    legendLine = item.legendLine,\n                    legendSymbol = item.legendSymbol,\n                    hiddenColor = legend.itemHiddenStyle.color,\n                    textColor = visible ? options.itemStyle.color : hiddenColor,\n                    symbolColor = visible ? (item.color || hiddenColor) : hiddenColor,\n                    markerOptions = item.options && item.options.marker,\n                    symbolAttr = {\n                        fill: symbolColor\n                    };\n\n                if (legendItem) {\n                    legendItem.css({\n                        fill: textColor,\n                        color: textColor // #1553, oldIE\n                    });\n                }\n                if (legendLine) {\n                    legendLine.attr({\n                        stroke: symbolColor\n                    });\n                }\n\n                if (legendSymbol) {\n\n                    // Apply marker options\n                    if (markerOptions && legendSymbol.isMarker) { // #585\n                        //symbolAttr.stroke = symbolColor;\n                        symbolAttr = item.pointAttribs();\n                        if (!visible) {\n                            H.objectEach(symbolAttr, function(val, key) {\n                                symbolAttr[key] = hiddenColor;\n                            });\n                        }\n                    }\n\n                    legendSymbol.attr(symbolAttr);\n                }\n\n            },\n\n            /**\n             * Position the legend item\n             * @param {Object} item A Series or Point instance\n             */\n            positionItem: function(item) {\n                var legend = this,\n                    options = legend.options,\n                    symbolPadding = options.symbolPadding,\n                    ltr = !options.rtl,\n                    legendItemPos = item._legendItemPos,\n                    itemX = legendItemPos[0],\n                    itemY = legendItemPos[1],\n                    checkbox = item.checkbox,\n                    legendGroup = item.legendGroup;\n\n                if (legendGroup && legendGroup.element) {\n                    legendGroup.translate(\n                        ltr ?\n                        itemX :\n                        legend.legendWidth - itemX - 2 * symbolPadding - 4,\n                        itemY\n                    );\n                }\n\n                if (checkbox) {\n                    checkbox.x = itemX;\n                    checkbox.y = itemY;\n                }\n            },\n\n            /**\n             * Destroy a single legend item\n             * @param {Object} item The series or point\n             */\n            destroyItem: function(item) {\n                var checkbox = item.checkbox;\n\n                // destroy SVG elements\n                each(\n                    ['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'],\n                    function(key) {\n                        if (item[key]) {\n                            item[key] = item[key].destroy();\n                        }\n                    }\n                );\n\n                if (checkbox) {\n                    discardElement(item.checkbox);\n                }\n            },\n\n            /**\n             * Destroys the legend.\n             */\n            destroy: function() {\n                function destroyItems(key) {\n                    if (this[key]) {\n                        this[key] = this[key].destroy();\n                    }\n                }\n\n                // Destroy items\n                each(this.getAllItems(), function(item) {\n                    each(['legendItem', 'legendGroup'], destroyItems, item);\n                });\n\n                // Destroy legend elements\n                each([\n                    'clipRect',\n                    'up',\n                    'down',\n                    'pager',\n                    'nav',\n                    'box',\n                    'title',\n                    'group'\n                ], destroyItems, this);\n                this.display = null; // Reset in .render on update.\n            },\n\n            /**\n             * Position the checkboxes after the width is determined\n             */\n            positionCheckboxes: function(scrollOffset) {\n                var alignAttr = this.group && this.group.alignAttr,\n                    translateY,\n                    clipHeight = this.clipHeight || this.legendHeight,\n                    titleHeight = this.titleHeight;\n\n                if (alignAttr) {\n                    translateY = alignAttr.translateY;\n                    each(this.allItems, function(item) {\n                        var checkbox = item.checkbox,\n                            top;\n\n                        if (checkbox) {\n                            top = translateY + titleHeight + checkbox.y +\n                                (scrollOffset || 0) + 3;\n                            css(checkbox, {\n                                left: (alignAttr.translateX + item.checkboxOffset +\n                                    checkbox.x - 20) + 'px',\n                                top: top + 'px',\n                                display: top > translateY - 6 && top < translateY +\n                                    clipHeight - 6 ? '' : 'none'\n                            });\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Render the legend title on top of the legend\n             */\n            renderTitle: function() {\n                var options = this.options,\n                    padding = this.padding,\n                    titleOptions = options.title,\n                    titleHeight = 0,\n                    bBox;\n\n                if (titleOptions.text) {\n                    if (!this.title) {\n                        this.title = this.chart.renderer.label(\n                                titleOptions.text,\n                                padding - 3,\n                                padding - 4,\n                                null,\n                                null,\n                                null,\n                                options.useHTML,\n                                null,\n                                'legend-title'\n                            )\n                            .attr({\n                                zIndex: 1\n                            })\n\n                            .css(titleOptions.style)\n\n                            .add(this.group);\n                    }\n                    bBox = this.title.getBBox();\n                    titleHeight = bBox.height;\n                    this.offsetWidth = bBox.width; // #1717\n                    this.contentGroup.attr({\n                        translateY: titleHeight\n                    });\n                }\n                this.titleHeight = titleHeight;\n            },\n\n            /**\n             * Set the legend item text\n             */\n            setText: function(item) {\n                var options = this.options;\n                item.legendItem.attr({\n                    text: options.labelFormat ?\n                        H.format(options.labelFormat, item) : options.labelFormatter.call(item)\n                });\n            },\n\n            /**\n             * Render a single specific legend item\n             * @param {Object} item A series or point\n             */\n            renderItem: function(item) {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    options = legend.options,\n                    horizontal = options.layout === 'horizontal',\n                    symbolWidth = legend.symbolWidth,\n                    symbolPadding = options.symbolPadding,\n\n                    itemStyle = legend.itemStyle,\n                    itemHiddenStyle = legend.itemHiddenStyle,\n\n                    padding = legend.padding,\n                    itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n                    ltr = !options.rtl,\n                    itemHeight,\n                    widthOption = options.width,\n                    itemMarginBottom = options.itemMarginBottom || 0,\n                    itemMarginTop = legend.itemMarginTop,\n                    bBox,\n                    itemWidth,\n                    li = item.legendItem,\n                    isSeries = !item.series,\n                    series = !isSeries && item.series.drawLegendSymbol ?\n                    item.series :\n                    item,\n                    seriesOptions = series.options,\n                    showCheckbox = legend.createCheckboxForItem &&\n                    seriesOptions &&\n                    seriesOptions.showCheckbox,\n                    // full width minus text width\n                    itemExtraWidth = symbolWidth + symbolPadding + itemDistance +\n                    (showCheckbox ? 20 : 0),\n                    useHTML = options.useHTML,\n                    fontSize = 12,\n                    itemClassName = item.options.className;\n\n                if (!li) { // generate it once, later move it\n\n                    // Generate the group box, a group to hold the symbol and text. Text\n                    // is to be appended in Legend class.\n                    item.legendGroup = renderer.g('legend-item')\n                        .addClass(\n                            'highcharts-' + series.type + '-series ' +\n                            'highcharts-color-' + item.colorIndex +\n                            (itemClassName ? ' ' + itemClassName : '') +\n                            (isSeries ? ' highcharts-series-' + item.index : '')\n                        )\n                        .attr({\n                            zIndex: 1\n                        })\n                        .add(legend.scrollGroup);\n\n                    // Generate the list item text and add it to the group\n                    item.legendItem = li = renderer.text(\n                            '',\n                            ltr ? symbolWidth + symbolPadding : -symbolPadding,\n                            legend.baseline || 0,\n                            useHTML\n                        )\n\n                        // merge to prevent modifying original (#1021)\n                        .css(merge(item.visible ? itemStyle : itemHiddenStyle))\n\n                        .attr({\n                            align: ltr ? 'left' : 'right',\n                            zIndex: 2\n                        })\n                        .add(item.legendGroup);\n\n                    // Get the baseline for the first item - the font size is equal for\n                    // all\n                    if (!legend.baseline) {\n\n                        fontSize = itemStyle.fontSize;\n\n                        legend.fontMetrics = renderer.fontMetrics(\n                            fontSize,\n                            li\n                        );\n                        legend.baseline = legend.fontMetrics.f + 3 + itemMarginTop;\n                        li.attr('y', legend.baseline);\n                    }\n\n                    // Draw the legend symbol inside the group box\n                    legend.symbolHeight = options.symbolHeight || legend.fontMetrics.f;\n                    series.drawLegendSymbol(legend, item);\n\n                    if (legend.setItemEvents) {\n                        legend.setItemEvents(item, li, useHTML);\n                    }\n\n                    // add the HTML checkbox on top\n                    if (showCheckbox) {\n                        legend.createCheckboxForItem(item);\n                    }\n                }\n\n                // Colorize the items\n                legend.colorizeItem(item, item.visible);\n\n                // Take care of max width and text overflow (#6659)\n\n                if (!itemStyle.width) {\n\n                    li.css({\n                        width: (options.itemWidth || chart.spacingBox.width) -\n                            itemExtraWidth\n                    });\n\n                }\n\n\n                // Always update the text\n                legend.setText(item);\n\n                // calculate the positions for the next line\n                bBox = li.getBBox();\n\n                itemWidth = item.checkboxOffset =\n                    options.itemWidth ||\n                    item.legendItemWidth ||\n                    bBox.width + itemExtraWidth;\n                legend.itemHeight = itemHeight = Math.round(\n                    item.legendItemHeight || bBox.height || legend.symbolHeight\n                );\n\n                // If the item exceeds the width, start a new line\n                if (\n                    horizontal &&\n                    legend.itemX - padding + itemWidth > (\n                        widthOption || (\n                            chart.spacingBox.width - 2 * padding - options.x\n                        )\n                    )\n                ) {\n                    legend.itemX = padding;\n                    legend.itemY += itemMarginTop + legend.lastLineHeight +\n                        itemMarginBottom;\n                    legend.lastLineHeight = 0; // reset for next line (#915, #3976)\n                }\n\n                // If the item exceeds the height, start a new column\n                /*if (!horizontal && legend.itemY + options.y +\n                \t\titemHeight > chart.chartHeight - spacingTop - spacingBottom) {\n                \tlegend.itemY = legend.initialItemY;\n                \tlegend.itemX += legend.maxItemWidth;\n                \tlegend.maxItemWidth = 0;\n                }*/\n\n                // Set the edge positions\n                legend.maxItemWidth = Math.max(legend.maxItemWidth, itemWidth);\n                legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;\n                legend.lastLineHeight = Math.max( // #915\n                    itemHeight,\n                    legend.lastLineHeight\n                );\n\n                // cache the position of the newly generated or reordered items\n                item._legendItemPos = [legend.itemX, legend.itemY];\n\n                // advance\n                if (horizontal) {\n                    legend.itemX += itemWidth;\n\n                } else {\n                    legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;\n                    legend.lastLineHeight = itemHeight;\n                }\n\n                // the width of the widest item\n                legend.offsetWidth = widthOption || Math.max(\n                    (horizontal ? legend.itemX - padding - itemDistance : itemWidth) +\n                    padding,\n                    legend.offsetWidth\n                );\n            },\n\n            /**\n             * Get all items, which is one item per series for normal series and one\n             * item per point for pie series.\n             */\n            getAllItems: function() {\n                var allItems = [];\n                each(this.chart.series, function(series) {\n                    var seriesOptions = series && series.options;\n\n                    // Handle showInLegend. If the series is linked to another series,\n                    // defaults to false.\n                    if (series && pick(\n                            seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? undefined : false, true\n                        )) {\n\n                        // Use points or series for the legend item depending on\n                        // legendType\n                        allItems = allItems.concat(\n                            series.legendItems ||\n                            (\n                                seriesOptions.legendType === 'point' ?\n                                series.data :\n                                series\n                            )\n                        );\n                    }\n                });\n                return allItems;\n            },\n\n            /**\n             * Adjust the chart margins by reserving space for the legend on only one\n             * side of the chart. If the position is set to a corner, top or bottom is\n             * reserved for horizontal legends and left or right for vertical ones.\n             */\n            adjustMargins: function(margin, spacing) {\n                var chart = this.chart,\n                    options = this.options,\n                    // Use the first letter of each alignment option in order to detect\n                    // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n                    alignment = options.align.charAt(0) +\n                    options.verticalAlign.charAt(0) +\n                    options.layout.charAt(0);\n\n                if (!options.floating) {\n\n                    each([\n                        /(lth|ct|rth)/,\n                        /(rtv|rm|rbv)/,\n                        /(rbh|cb|lbh)/,\n                        /(lbv|lm|ltv)/\n                    ], function(alignments, side) {\n                        if (alignments.test(alignment) && !defined(margin[side])) {\n                            // Now we have detected on which side of the chart we should\n                            // reserve space for the legend\n                            chart[marginNames[side]] = Math.max(\n                                chart[marginNames[side]],\n                                (\n                                    chart.legend[\n                                        (side + 1) % 2 ? 'legendHeight' : 'legendWidth'\n                                    ] + [1, -1, -1, 1][side] * options[\n                                        (side % 2) ? 'x' : 'y'\n                                    ] +\n                                    pick(options.margin, 12) +\n                                    spacing[side]\n                                )\n                            );\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Render the legend. This method can be called both before and after\n             * chart.render. If called after, it will only rearrange items instead\n             * of creating new ones.\n             */\n            render: function() {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    legendGroup = legend.group,\n                    allItems,\n                    display,\n                    legendWidth,\n                    legendHeight,\n                    box = legend.box,\n                    options = legend.options,\n                    padding = legend.padding;\n\n                legend.itemX = padding;\n                legend.itemY = legend.initialItemY;\n                legend.offsetWidth = 0;\n                legend.lastItemY = 0;\n\n                if (!legendGroup) {\n                    legend.group = legendGroup = renderer.g('legend')\n                        .attr({\n                            zIndex: 7\n                        })\n                        .add();\n                    legend.contentGroup = renderer.g()\n                        .attr({\n                            zIndex: 1\n                        }) // above background\n                        .add(legendGroup);\n                    legend.scrollGroup = renderer.g()\n                        .add(legend.contentGroup);\n                }\n\n                legend.renderTitle();\n\n                // add each series or point\n                allItems = legend.getAllItems();\n\n                // sort by legendIndex\n                stableSort(allItems, function(a, b) {\n                    return ((a.options && a.options.legendIndex) || 0) -\n                        ((b.options && b.options.legendIndex) || 0);\n                });\n\n                // reversed legend\n                if (options.reversed) {\n                    allItems.reverse();\n                }\n\n                legend.allItems = allItems;\n                legend.display = display = !!allItems.length;\n\n                // render the items\n                legend.lastLineHeight = 0;\n                each(allItems, function(item) {\n                    legend.renderItem(item);\n                });\n\n                // Get the box\n                legendWidth = (options.width || legend.offsetWidth) + padding;\n                legendHeight = legend.lastItemY + legend.lastLineHeight +\n                    legend.titleHeight;\n                legendHeight = legend.handleOverflow(legendHeight);\n                legendHeight += padding;\n\n                // Draw the border and/or background\n                if (!box) {\n                    legend.box = box = renderer.rect()\n                        .addClass('highcharts-legend-box')\n                        .attr({\n                            r: options.borderRadius\n                        })\n                        .add(legendGroup);\n                    box.isNew = true;\n                }\n\n\n                // Presentational\n                box\n                    .attr({\n                        stroke: options.borderColor,\n                        'stroke-width': options.borderWidth || 0,\n                        fill: options.backgroundColor || 'none'\n                    })\n                    .shadow(options.shadow);\n\n\n                if (legendWidth > 0 && legendHeight > 0) {\n                    box[box.isNew ? 'attr' : 'animate'](\n                        box.crisp({\n                            x: 0,\n                            y: 0,\n                            width: legendWidth,\n                            height: legendHeight\n                        }, box.strokeWidth())\n                    );\n                    box.isNew = false;\n                }\n\n                // hide the border if no items\n                box[display ? 'show' : 'hide']();\n\n\n\n                legend.legendWidth = legendWidth;\n                legend.legendHeight = legendHeight;\n\n                // Now that the legend width and height are established, put the items\n                // in the final position\n                each(allItems, function(item) {\n                    legend.positionItem(item);\n                });\n\n                // 1.x compatibility: positioning based on style\n                /*var props = ['left', 'right', 'top', 'bottom'],\n                \tprop,\n                \ti = 4;\n                while (i--) {\n                \tprop = props[i];\n                \tif (options.style[prop] && options.style[prop] !== 'auto') {\n                \t\toptions[i < 2 ? 'align' : 'verticalAlign'] = prop;\n                \t\toptions[i < 2 ? 'x' : 'y'] = \n                \t\t\tpInt(options.style[prop]) * (i % 2 ? -1 : 1);\n                \t}\n                }*/\n\n                if (display) {\n                    legendGroup.align(merge(options, {\n                        width: legendWidth,\n                        height: legendHeight\n                    }), true, 'spacingBox');\n                }\n\n                if (!chart.isResizing) {\n                    this.positionCheckboxes();\n                }\n            },\n\n            /**\n             * Set up the overflow handling by adding navigation with up and down arrows\n             * below the legend.\n             */\n            handleOverflow: function(legendHeight) {\n                var legend = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    options = this.options,\n                    optionsY = options.y,\n                    alignTop = options.verticalAlign === 'top',\n                    padding = this.padding,\n                    spaceHeight = chart.spacingBox.height +\n                    (alignTop ? -optionsY : optionsY) - padding,\n                    maxHeight = options.maxHeight,\n                    clipHeight,\n                    clipRect = this.clipRect,\n                    navOptions = options.navigation,\n                    animation = pick(navOptions.animation, true),\n                    arrowSize = navOptions.arrowSize || 12,\n                    nav = this.nav,\n                    pages = this.pages,\n                    lastY,\n                    allItems = this.allItems,\n                    clipToHeight = function(height) {\n                        if (typeof height === 'number') {\n                            clipRect.attr({\n                                height: height\n                            });\n                        } else if (clipRect) { // Reset (#5912)\n                            legend.clipRect = clipRect.destroy();\n                            legend.contentGroup.clip();\n                        }\n\n                        // useHTML\n                        if (legend.contentGroup.div) {\n                            legend.contentGroup.div.style.clip = height ?\n                                'rect(' + padding + 'px,9999px,' +\n                                (padding + height) + 'px,0)' :\n                                'auto';\n                        }\n                    };\n\n\n                // Adjust the height\n                if (\n                    options.layout === 'horizontal' &&\n                    options.verticalAlign !== 'middle' &&\n                    !options.floating\n                ) {\n                    spaceHeight /= 2;\n                }\n                if (maxHeight) {\n                    spaceHeight = Math.min(spaceHeight, maxHeight);\n                }\n\n                // Reset the legend height and adjust the clipping rectangle\n                pages.length = 0;\n                if (legendHeight > spaceHeight && navOptions.enabled !== false) {\n\n                    this.clipHeight = clipHeight =\n                        Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n                    this.currentPage = pick(this.currentPage, 1);\n                    this.fullHeight = legendHeight;\n\n                    // Fill pages with Y positions so that the top of each a legend item\n                    // defines the scroll top for each page (#2098)\n                    each(allItems, function(item, i) {\n                        var y = item._legendItemPos[1],\n                            h = Math.round(item.legendItem.getBBox().height),\n                            len = pages.length;\n\n                        if (!len || (y - pages[len - 1] > clipHeight &&\n                                (lastY || y) !== pages[len - 1])) {\n                            pages.push(lastY || y);\n                            len++;\n                        }\n\n                        if (i === allItems.length - 1 &&\n                            y + h - pages[len - 1] > clipHeight) {\n                            pages.push(y);\n                        }\n                        if (y !== lastY) {\n                            lastY = y;\n                        }\n                    });\n\n                    // Only apply clipping if needed. Clipping causes blurred legend in\n                    // PDF export (#1787)\n                    if (!clipRect) {\n                        clipRect = legend.clipRect =\n                            renderer.clipRect(0, padding, 9999, 0);\n                        legend.contentGroup.clip(clipRect);\n                    }\n\n                    clipToHeight(clipHeight);\n\n                    // Add navigation elements\n                    if (!nav) {\n                        this.nav = nav = renderer.g()\n                            .attr({\n                                zIndex: 1\n                            })\n                            .add(this.group);\n\n                        this.up = renderer\n                            .symbol(\n                                'triangle',\n                                0,\n                                0,\n                                arrowSize,\n                                arrowSize\n                            )\n                            .on('click', function() {\n                                legend.scroll(-1, animation);\n                            })\n                            .add(nav);\n\n                        this.pager = renderer.text('', 15, 10)\n                            .addClass('highcharts-legend-navigation')\n\n                            .css(navOptions.style)\n\n                            .add(nav);\n\n                        this.down = renderer\n                            .symbol(\n                                'triangle-down',\n                                0,\n                                0,\n                                arrowSize,\n                                arrowSize\n                            )\n                            .on('click', function() {\n                                legend.scroll(1, animation);\n                            })\n                            .add(nav);\n                    }\n\n                    // Set initial position\n                    legend.scroll(0);\n\n                    legendHeight = spaceHeight;\n\n                    // Reset\n                } else if (nav) {\n                    clipToHeight();\n                    this.nav = nav.destroy(); // #6322\n                    this.scrollGroup.attr({\n                        translateY: 1\n                    });\n                    this.clipHeight = 0; // #1379\n                }\n\n                return legendHeight;\n            },\n\n            /**\n             * Scroll the legend by a number of pages\n             * @param {Object} scrollBy\n             * @param {Object} animation\n             */\n            scroll: function(scrollBy, animation) {\n                var pages = this.pages,\n                    pageCount = pages.length,\n                    currentPage = this.currentPage + scrollBy,\n                    clipHeight = this.clipHeight,\n                    navOptions = this.options.navigation,\n                    pager = this.pager,\n                    padding = this.padding,\n                    scrollOffset;\n\n                // When resizing while looking at the last page\n                if (currentPage > pageCount) {\n                    currentPage = pageCount;\n                }\n\n                if (currentPage > 0) {\n\n                    if (animation !== undefined) {\n                        setAnimation(animation, this.chart);\n                    }\n\n                    this.nav.attr({\n                        translateX: padding,\n                        translateY: clipHeight + this.padding + 7 + this.titleHeight,\n                        visibility: 'visible'\n                    });\n                    this.up.attr({\n                        'class': currentPage === 1 ?\n                            'highcharts-legend-nav-inactive' : 'highcharts-legend-nav-active'\n                    });\n                    pager.attr({\n                        text: currentPage + '/' + pageCount\n                    });\n                    this.down.attr({\n                        'x': 18 + this.pager.getBBox().width, // adjust to text width\n                        'class': currentPage === pageCount ?\n                            'highcharts-legend-nav-inactive' : 'highcharts-legend-nav-active'\n                    });\n\n\n                    this.up\n                        .attr({\n                            fill: currentPage === 1 ?\n                                navOptions.inactiveColor : navOptions.activeColor\n                        })\n                        .css({\n                            cursor: currentPage === 1 ? 'default' : 'pointer'\n                        });\n                    this.down\n                        .attr({\n                            fill: currentPage === pageCount ?\n                                navOptions.inactiveColor : navOptions.activeColor\n                        })\n                        .css({\n                            cursor: currentPage === pageCount ? 'default' : 'pointer'\n                        });\n\n\n                    scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n\n                    this.scrollGroup.animate({\n                        translateY: scrollOffset\n                    });\n\n                    this.currentPage = currentPage;\n                    this.positionCheckboxes(scrollOffset);\n                }\n\n            }\n\n        };\n\n        /*\n         * LegendSymbolMixin\n         */\n\n        H.LegendSymbolMixin = {\n\n            /**\n             * Get the series' symbol in the legend\n             *\n             * @param {Object} legend The legend object\n             * @param {Object} item The series (this) or point\n             */\n            drawRectangle: function(legend, item) {\n                var options = legend.options,\n                    symbolHeight = legend.symbolHeight,\n                    square = options.squareSymbol,\n                    symbolWidth = square ? symbolHeight : legend.symbolWidth;\n\n                item.legendSymbol = this.chart.renderer.rect(\n                        square ? (legend.symbolWidth - symbolHeight) / 2 : 0,\n                        legend.baseline - symbolHeight + 1, // #3988\n                        symbolWidth,\n                        symbolHeight,\n                        pick(legend.options.symbolRadius, symbolHeight / 2)\n                    )\n                    .addClass('highcharts-point')\n                    .attr({\n                        zIndex: 3\n                    }).add(item.legendGroup);\n\n            },\n\n            /**\n             * Get the series' symbol in the legend. This method should be overridable\n             * to create custom symbols through\n             * Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n             *\n             * @param {Object} legend The legend object\n             */\n            drawLineMarker: function(legend) {\n\n                var options = this.options,\n                    markerOptions = options.marker,\n                    radius,\n                    legendSymbol,\n                    symbolWidth = legend.symbolWidth,\n                    symbolHeight = legend.symbolHeight,\n                    generalRadius = symbolHeight / 2,\n                    renderer = this.chart.renderer,\n                    legendItemGroup = this.legendGroup,\n                    verticalCenter = legend.baseline -\n                    Math.round(legend.fontMetrics.b * 0.3),\n                    attr = {};\n\n                // Draw the line\n\n                attr = {\n                    'stroke-width': options.lineWidth || 0\n                };\n                if (options.dashStyle) {\n                    attr.dashstyle = options.dashStyle;\n                }\n\n\n                this.legendLine = renderer.path([\n                        'M',\n                        0,\n                        verticalCenter,\n                        'L',\n                        symbolWidth,\n                        verticalCenter\n                    ])\n                    .addClass('highcharts-graph')\n                    .attr(attr)\n                    .add(legendItemGroup);\n\n                // Draw the marker\n                if (markerOptions && markerOptions.enabled !== false) {\n\n                    // Do not allow the marker to be larger than the symbolHeight\n                    radius = Math.min(\n                        pick(markerOptions.radius, generalRadius),\n                        generalRadius\n                    );\n\n                    // Restrict symbol markers size\n                    if (this.symbol.indexOf('url') === 0) {\n                        markerOptions = merge(markerOptions, {\n                            width: symbolHeight,\n                            height: symbolHeight\n                        });\n                        radius = 0;\n                    }\n\n                    this.legendSymbol = legendSymbol = renderer.symbol(\n                            this.symbol,\n                            (symbolWidth / 2) - radius,\n                            verticalCenter - radius,\n                            2 * radius,\n                            2 * radius,\n                            markerOptions\n                        )\n                        .addClass('highcharts-point')\n                        .add(legendItemGroup);\n                    legendSymbol.isMarker = true;\n                }\n            }\n        };\n\n        // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,\n        // and for #2580, a similar drawing flaw in Firefox 26.\n        // Explore if there's a general cause for this. The problem may be related\n        // to nested group elements, as the legend item texts are within 4 group\n        // elements.\n        if (/Trident\\/7\\.0/.test(win.navigator.userAgent) || isFirefox) {\n            wrap(Highcharts.Legend.prototype, 'positionItem', function(proceed, item) {\n                var legend = this,\n                    // If chart destroyed in sync, this is undefined (#2030)\n                    runPositionItem = function() {\n                        if (item._legendItemPos) {\n                            proceed.call(legend, item);\n                        }\n                    };\n\n                // Do it now, for export and to get checkbox placement\n                runPositionItem();\n\n                // Do it after to work around the core issue\n                setTimeout(runPositionItem);\n            });\n        }\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            animate = H.animate,\n            animObject = H.animObject,\n            attr = H.attr,\n            doc = H.doc,\n            Axis = H.Axis, // @todo add as requirement\n            createElement = H.createElement,\n            defaultOptions = H.defaultOptions,\n            discardElement = H.discardElement,\n            charts = H.charts,\n            css = H.css,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            find = H.find,\n            fireEvent = H.fireEvent,\n            getStyle = H.getStyle,\n            grep = H.grep,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            isString = H.isString,\n            Legend = H.Legend, // @todo add as requirement\n            marginNames = H.marginNames,\n            merge = H.merge,\n            objectEach = H.objectEach,\n            Pointer = H.Pointer, // @todo add as requirement\n            pick = H.pick,\n            pInt = H.pInt,\n            removeEvent = H.removeEvent,\n            seriesTypes = H.seriesTypes,\n            splat = H.splat,\n            svg = H.svg,\n            syncTimeout = H.syncTimeout,\n            win = H.win,\n            Renderer = H.Renderer;\n        /**\n         * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n         * @class Highcharts.Chart\n         * @param  {String|HTMLDOMElement} renderTo\n         *         The DOM element to render to, or its id.\n         * @param  {Options} options\n         *         The chart options structure.\n         * @param  {Function} [callback]\n         *         Function to run when the chart has loaded and and all external images\n         *         are loaded. Defining a {@link\n         *         https://api.highcharts.com/highcharts/chart.events.load|chart.event.load}\n         *         handler is equivalent.\n         *\n         * @example\n         * var chart = new Highcharts.Chart('container', {\n         * \t   title: {\n         * \t   \t   text: 'My chart'\n         * \t   },\n         * \t   series: [{\n         * \t       data: [1, 3, 2, 4]\n         * \t   }]\n         * })\n         */\n        var Chart = H.Chart = function() {\n            this.getArgs.apply(this, arguments);\n        };\n\n        /**\n         * Factory function for basic charts. \n         *\n         * @function #chart\n         * @memberOf Highcharts\n         * @param  {String|HTMLDOMElement} renderTo - The DOM element to render to, or\n         * its id.\n         * @param  {Options} options - The chart options structure.\n         * @param  {Function} [callback] - Function to run when the chart has loaded and\n         * and all external images are loaded. Defining a {@link\n         * https://api.highcharts.com/highcharts/chart.events.load|chart.event.load}\n         * handler is equivalent.\n         * @return {Highcharts.Chart} - Returns the Chart object.\n         *\n         * @example\n         * // Render a chart in to div#container\n         * var chart = Highcharts.chart('container', {\n         *     title: {\n         *         text: 'My chart'\n         *     },\n         *     series: [{\n         *         data: [1, 3, 2, 4]\n         *     }]\n         * });\n         */\n        H.chart = function(a, b, c) {\n            return new Chart(a, b, c);\n        };\n\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n            /**\n             * Hook for modules\n             */\n            callbacks: [],\n\n            /**\n             * Handle the arguments passed to the constructor\n             * @returns {Array} Arguments without renderTo\n             */\n            getArgs: function() {\n                var args = [].slice.call(arguments);\n\n                // Remove the optional first argument, renderTo, and\n                // set it on this.\n                if (isString(args[0]) || args[0].nodeName) {\n                    this.renderTo = args.shift();\n                }\n                this.init(args[0], args[1]);\n            },\n\n            /**\n             * Initialize the chart\n             */\n            init: function(userOptions, callback) {\n\n                // Handle regular options\n                var options,\n                    type,\n                    seriesOptions = userOptions.series, // skip merging data points to increase performance\n                    userPlotOptions = userOptions.plotOptions || {};\n\n                userOptions.series = null;\n                options = merge(defaultOptions, userOptions); // do the merge\n\n                // Override (by copy of user options) or clear tooltip options\n                // in chart.options.plotOptions (#6218)\n                for (type in options.plotOptions) {\n                    options.plotOptions[type].tooltip = (\n                        userPlotOptions[type] &&\n                        merge(userPlotOptions[type].tooltip) // override by copy\n                    ) || undefined; // or clear\n                }\n                // User options have higher priority than default options (#6218).\n                // In case of exporting: path is changed\n                options.tooltip.userOptions = (userOptions.chart &&\n                        userOptions.chart.forExport && userOptions.tooltip.userOptions) ||\n                    userOptions.tooltip;\n\n                options.series = userOptions.series = seriesOptions; // set back the series data\n                this.userOptions = userOptions;\n\n                var optionsChart = options.chart;\n\n                var chartEvents = optionsChart.events;\n\n                this.margin = [];\n                this.spacing = [];\n\n                //this.runChartClick = chartEvents && !!chartEvents.click;\n                this.bounds = {\n                    h: {},\n                    v: {}\n                }; // Pixel data bounds for touch zoom\n\n                this.callback = callback;\n                this.isResizing = 0;\n\n                /**\n                 * The options structure for the chart. It contains members for the sub\n                 * elements like series, legend, tooltip etc.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name options\n                 * @type {Options}\n                 */\n                this.options = options;\n                /**\n                 * All the axes in the chart.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name axes\n                 * @see  Highcharts.Chart.xAxis\n                 * @see  Highcharts.Chart.yAxis\n                 * @type {Array.<Highcharts.Axis>}\n                 */\n                this.axes = [];\n\n                /**\n                 * All the current series in the chart.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name series\n                 * @type {Array.<Highcharts.Series>}\n                 */\n                this.series = [];\n\n                /**\n                 * The chart title. The title has an `update` method that allows\n                 * modifying the options directly or indirectly via `chart.update`.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name title\n                 * @type Object\n                 *\n                 * @sample highcharts/members/title-update/\n                 *         Updating titles\n                 */\n\n                /**\n                 * The chart subtitle. The subtitle has an `update` method that allows\n                 * modifying the options directly or indirectly via `chart.update`.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name subtitle\n                 * @type Object\n                 */\n\n\n\n                this.hasCartesianSeries = optionsChart.showAxes;\n                //this.axisOffset = undefined;\n                //this.inverted = undefined;\n                //this.loadingShown = undefined;\n                //this.container = undefined;\n                //this.chartWidth = undefined;\n                //this.chartHeight = undefined;\n                //this.marginRight = undefined;\n                //this.marginBottom = undefined;\n                //this.containerWidth = undefined;\n                //this.containerHeight = undefined;\n                //this.oldChartWidth = undefined;\n                //this.oldChartHeight = undefined;\n\n                //this.renderTo = undefined;\n\n                //this.spacingBox = undefined\n\n                //this.legend = undefined;\n\n                // Elements\n                //this.chartBackground = undefined;\n                //this.plotBackground = undefined;\n                //this.plotBGImage = undefined;\n                //this.plotBorder = undefined;\n                //this.loadingDiv = undefined;\n                //this.loadingSpan = undefined;\n\n                var chart = this;\n\n                // Add the chart to the global lookup\n                chart.index = charts.length;\n\n                charts.push(chart);\n                H.chartCount++;\n\n                // Chart event handlers\n                if (chartEvents) {\n                    objectEach(chartEvents, function(event, eventType) {\n                        addEvent(chart, eventType, event);\n                    });\n                }\n\n                /**\n                 * A collection of the X axes in the chart.\n                 * @type {Array.<Highcharts.Axis>}\n                 * @name xAxis\n                 * @memberOf Highcharts.Chart\n                 */\n                chart.xAxis = [];\n                /**\n                 * A collection of the Y axes in the chart.\n                 * @type {Array.<Highcharts.Axis>}\n                 * @name yAxis\n                 * @memberOf Highcharts.Chart\n                 */\n                chart.yAxis = [];\n\n                chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n\n                chart.firstRender();\n            },\n\n            /**\n             * Initialize an individual series, called internally before render time\n             */\n            initSeries: function(options) {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    type = options.type || optionsChart.type || optionsChart.defaultSeriesType,\n                    series,\n                    Constr = seriesTypes[type];\n\n                // No such series type\n                if (!Constr) {\n                    H.error(17, true);\n                }\n\n                series = new Constr();\n                series.init(this, options);\n                return series;\n            },\n\n            /**\n             * Order all series above a given index. When series are added and ordered\n             * by configuration, only the last series is handled (#248, #1123, #2456,\n             * #6112). This function is called on series initialization and destroy.\n             *\n             * @param {number} fromIndex - If this is given, only the series above this\n             *\t index are handled.\n             */\n            orderSeries: function(fromIndex) {\n                var series = this.series,\n                    i = fromIndex || 0;\n                for (; i < series.length; i++) {\n                    if (series[i]) {\n                        series[i].index = i;\n                        series[i].name = series[i].name ||\n                            'Series ' + (series[i].index + 1);\n                    }\n                }\n            },\n\n            /**\n             * Check whether a given point is within the plot area\n             *\n             * @param {Number} plotX Pixel x relative to the plot area\n             * @param {Number} plotY Pixel y relative to the plot area\n             * @param {Boolean} inverted Whether the chart is inverted\n             */\n            isInsidePlot: function(plotX, plotY, inverted) {\n                var x = inverted ? plotY : plotX,\n                    y = inverted ? plotX : plotY;\n\n                return x >= 0 &&\n                    x <= this.plotWidth &&\n                    y >= 0 &&\n                    y <= this.plotHeight;\n            },\n\n            /**\n             * Redraw the chart after changes have been done to the data, axis extremes\n             * chart size or chart elements. All methods for updating axes, series or\n             * points have a parameter for redrawing the chart. This is `true` by\n             * default. But in many cases you want to do more than one operation on the\n             * chart before redrawing, for example add a number of points. In those\n             * cases it is a waste of resources to redraw the chart for each new point\n             * added. So you add the points and call `chart.redraw()` after.\n             *\n             * @param  {AnimationOptions} animation\n             *         If or how to apply animation to the redraw.\n             */\n            redraw: function(animation) {\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    pointer = chart.pointer,\n                    legend = chart.legend,\n                    redrawLegend = chart.isDirtyLegend,\n                    hasStackedSeries,\n                    hasDirtyStacks,\n                    hasCartesianSeries = chart.hasCartesianSeries,\n                    isDirtyBox = chart.isDirtyBox,\n                    i,\n                    serie,\n                    renderer = chart.renderer,\n                    isHiddenChart = renderer.isHidden(),\n                    afterRedraw = [];\n\n                // Handle responsive rules, not only on resize (#6130)\n                if (chart.setResponsive) {\n                    chart.setResponsive(false);\n                }\n\n                H.setAnimation(animation, chart);\n\n                if (isHiddenChart) {\n                    chart.temporaryDisplay();\n                }\n\n                // Adjust title layout (reflow multiline text)\n                chart.layOutTitles();\n\n                // link stacked series\n                i = series.length;\n                while (i--) {\n                    serie = series[i];\n\n                    if (serie.options.stacking) {\n                        hasStackedSeries = true;\n\n                        if (serie.isDirty) {\n                            hasDirtyStacks = true;\n                            break;\n                        }\n                    }\n                }\n                if (hasDirtyStacks) { // mark others as dirty\n                    i = series.length;\n                    while (i--) {\n                        serie = series[i];\n                        if (serie.options.stacking) {\n                            serie.isDirty = true;\n                        }\n                    }\n                }\n\n                // Handle updated data in the series\n                each(series, function(serie) {\n                    if (serie.isDirty) {\n                        if (serie.options.legendType === 'point') {\n                            if (serie.updateTotals) {\n                                serie.updateTotals();\n                            }\n                            redrawLegend = true;\n                        }\n                    }\n                    if (serie.isDirtyData) {\n                        fireEvent(serie, 'updatedData');\n                    }\n                });\n\n                // handle added or removed series\n                if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed\n                    // draw legend graphics\n                    legend.render();\n\n                    chart.isDirtyLegend = false;\n                }\n\n                // reset stacks\n                if (hasStackedSeries) {\n                    chart.getStacks();\n                }\n\n\n                if (hasCartesianSeries) {\n                    // set axes scales\n                    each(axes, function(axis) {\n                        axis.updateNames();\n                        axis.setScale();\n                    });\n                }\n\n                chart.getMargins(); // #3098\n\n                if (hasCartesianSeries) {\n                    // If one axis is dirty, all axes must be redrawn (#792, #2169)\n                    each(axes, function(axis) {\n                        if (axis.isDirty) {\n                            isDirtyBox = true;\n                        }\n                    });\n\n                    // redraw axes\n                    each(axes, function(axis) {\n\n                        // Fire 'afterSetExtremes' only if extremes are set\n                        var key = axis.min + ',' + axis.max;\n                        if (axis.extKey !== key) { // #821, #4452\n                            axis.extKey = key;\n                            afterRedraw.push(function() { // prevent a recursive call to chart.redraw() (#1119)\n                                fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n                                delete axis.eventArgs;\n                            });\n                        }\n                        if (isDirtyBox || hasStackedSeries) {\n                            axis.redraw();\n                        }\n                    });\n                }\n\n                // the plot areas size has changed\n                if (isDirtyBox) {\n                    chart.drawChartBox();\n                }\n\n                // Fire an event before redrawing series, used by the boost module to\n                // clear previous series renderings.\n                fireEvent(chart, 'predraw');\n\n                // redraw affected series\n                each(series, function(serie) {\n                    if ((isDirtyBox || serie.isDirty) && serie.visible) {\n                        serie.redraw();\n                    }\n                    // Set it here, otherwise we will have unlimited 'updatedData' calls\n                    // for a hidden series after setData(). Fixes #6012\n                    serie.isDirtyData = false;\n                });\n\n                // move tooltip or reset\n                if (pointer) {\n                    pointer.reset(true);\n                }\n\n                // redraw if canvas\n                renderer.draw();\n\n                // Fire the events\n                fireEvent(chart, 'redraw');\n                fireEvent(chart, 'render');\n\n                if (isHiddenChart) {\n                    chart.temporaryDisplay(true);\n                }\n\n                // Fire callbacks that are put on hold until after the redraw\n                each(afterRedraw, function(callback) {\n                    callback.call();\n                });\n            },\n\n            /**\n             * Get an axis, series or point object by `id` as given in the configuration\n             * options. Returns `undefined` if no item is found.\n             * @param id {String} The id as given in the configuration options.\n             * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n             *         The retrieved item.\n             * @sample highcharts/plotoptions/series-id/\n             *         Get series by id\n             */\n            get: function(id) {\n\n                var ret,\n                    series = this.series,\n                    i;\n\n                function itemById(item) {\n                    return item.id === id || (item.options && item.options.id === id);\n                }\n\n                ret =\n                    // Search axes\n                    find(this.axes, itemById) ||\n\n                    // Search series\n                    find(this.series, itemById);\n\n                // Search points\n                for (i = 0; !ret && i < series.length; i++) {\n                    ret = find(series[i].points || [], itemById);\n                }\n\n                return ret;\n            },\n\n            /**\n             * Create the Axis instances based on the config options\n             */\n            getAxes: function() {\n                var chart = this,\n                    options = this.options,\n                    xAxisOptions = options.xAxis = splat(options.xAxis || {}),\n                    yAxisOptions = options.yAxis = splat(options.yAxis || {}),\n                    optionsArray;\n\n                // make sure the options are arrays and add some members\n                each(xAxisOptions, function(axis, i) {\n                    axis.index = i;\n                    axis.isX = true;\n                });\n\n                each(yAxisOptions, function(axis, i) {\n                    axis.index = i;\n                });\n\n                // concatenate all axis options into one array\n                optionsArray = xAxisOptions.concat(yAxisOptions);\n\n                each(optionsArray, function(axisOptions) {\n                    new Axis(chart, axisOptions); // eslint-disable-line no-new\n                });\n            },\n\n\n            /**\n             * Returns an array of all currently selected points in the chart. Points\n             * can be selected by clicking or programmatically by the {@link\n             * Highcharts.Point#select} function.\n             *\n             * @return {Array.<Highcharts.Point>}\n             *         The currently selected points.\n             *\n             * @sample highcharts/plotoptions/series-allowpointselect-line/\n             *         Get selected points\n             */\n            getSelectedPoints: function() {\n                var points = [];\n                each(this.series, function(serie) {\n                    // series.data - for points outside of viewed range (#6445)\n                    points = points.concat(grep(serie.data || [], function(point) {\n                        return point.selected;\n                    }));\n                });\n                return points;\n            },\n\n            /**\n             * Returns an array of all currently selected series in the chart. Series\n             * can be selected either programmatically by the {@link\n             * Highcharts.Series#select} function or by checking the checkbox next to\n             * the legend item if {@link\n             * https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox|\n             * series.showCheckBox} is true.\n             * \n             * @return {Array.<Highcharts.Series>}\n             *         The currently selected series.\n             *\n             * @sample highcharts/members/chart-getselectedseries/\n             *         Get selected series\n             */\n            getSelectedSeries: function() {\n                return grep(this.series, function(serie) {\n                    return serie.selected;\n                });\n            },\n\n            /**\n             * Set a new title or subtitle for the chart.\n             *\n             * @param  titleOptions {TitleOptions}\n             *         New title options.\n             * @param  subtitleOptions {SubtitleOptions}\n             *         New subtitle options.\n             * @param  redraw {Boolean}\n             *         Whether to redraw the chart or wait for a later call to \n             *         `chart.redraw()`.\n             *\n             * @sample highcharts/members/chart-settitle/ Set title text and styles\n             *\n             */\n            setTitle: function(titleOptions, subtitleOptions, redraw) {\n                var chart = this,\n                    options = chart.options,\n                    chartTitleOptions,\n                    chartSubtitleOptions;\n\n                chartTitleOptions = options.title = merge(\n\n                    // Default styles\n                    {\n                        style: {\n                            color: '#333333',\n                            fontSize: options.isStock ? '16px' : '18px' // #2944\n                        }\n                    },\n\n                    options.title,\n                    titleOptions\n                );\n                chartSubtitleOptions = options.subtitle = merge(\n\n                    // Default styles\n                    {\n                        style: {\n                            color: '#666666'\n                        }\n                    },\n\n                    options.subtitle,\n                    subtitleOptions\n                );\n\n                // add title and subtitle\n                each([\n                    ['title', titleOptions, chartTitleOptions],\n                    ['subtitle', subtitleOptions, chartSubtitleOptions]\n                ], function(arr, i) {\n                    var name = arr[0],\n                        title = chart[name],\n                        titleOptions = arr[1],\n                        chartTitleOptions = arr[2];\n\n                    if (title && titleOptions) {\n                        chart[name] = title = title.destroy(); // remove old\n                    }\n\n                    if (chartTitleOptions && chartTitleOptions.text && !title) {\n                        chart[name] = chart.renderer.text(\n                                chartTitleOptions.text,\n                                0,\n                                0,\n                                chartTitleOptions.useHTML\n                            )\n                            .attr({\n                                align: chartTitleOptions.align,\n                                'class': 'highcharts-' + name,\n                                zIndex: chartTitleOptions.zIndex || 4\n                            })\n                            .add();\n\n                        // Update methods, shortcut to Chart.setTitle\n                        chart[name].update = function(o) {\n                            chart.setTitle(!i && o, i && o);\n                        };\n\n\n                        // Presentational\n                        chart[name].css(chartTitleOptions.style);\n\n\n                    }\n                });\n                chart.layOutTitles(redraw);\n            },\n\n            /**\n             * Lay out the chart titles and cache the full offset height for use\n             * in getMargins\n             */\n            layOutTitles: function(redraw) {\n                var titleOffset = 0,\n                    requiresDirtyBox,\n                    renderer = this.renderer,\n                    spacingBox = this.spacingBox;\n\n                // Lay out the title and the subtitle respectively\n                each(['title', 'subtitle'], function(key) {\n                    var title = this[key],\n                        titleOptions = this.options[key],\n                        offset = key === 'title' ? -3 :\n                        // Floating subtitle (#6574)\n                        titleOptions.verticalAlign ? 0 : titleOffset + 2,\n                        titleSize;\n\n                    if (title) {\n\n                        titleSize = titleOptions.style.fontSize;\n\n                        titleSize = renderer.fontMetrics(titleSize, title).b;\n\n                        title\n                            .css({\n                                width: (titleOptions.width ||\n                                    spacingBox.width + titleOptions.widthAdjust) + 'px'\n                            })\n                            .align(extend({\n                                y: offset + titleSize\n                            }, titleOptions), false, 'spacingBox');\n\n                        if (!titleOptions.floating && !titleOptions.verticalAlign) {\n                            titleOffset = Math.ceil(\n                                titleOffset +\n                                // Skip the cache for HTML (#3481)\n                                title.getBBox(titleOptions.useHTML).height\n                            );\n                        }\n                    }\n                }, this);\n\n                requiresDirtyBox = this.titleOffset !== titleOffset;\n                this.titleOffset = titleOffset; // used in getMargins\n\n                if (!this.isDirtyBox && requiresDirtyBox) {\n                    this.isDirtyBox = requiresDirtyBox;\n                    // Redraw if necessary (#2719, #2744)\n                    if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {\n                        this.redraw();\n                    }\n                }\n            },\n\n            /**\n             * Get chart width and height according to options and container size\n             */\n            getChartSize: function() {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    widthOption = optionsChart.width,\n                    heightOption = optionsChart.height,\n                    renderTo = chart.renderTo;\n\n                // Get inner width and height\n                if (!defined(widthOption)) {\n                    chart.containerWidth = getStyle(renderTo, 'width');\n                }\n                if (!defined(heightOption)) {\n                    chart.containerHeight = getStyle(renderTo, 'height');\n                }\n\n                chart.chartWidth = Math.max( // #1393\n                    0,\n                    widthOption || chart.containerWidth || 600 // #1460\n                );\n                chart.chartHeight = Math.max(\n                    0,\n                    H.relativeLength(\n                        heightOption,\n                        chart.chartWidth\n                    ) || chart.containerHeight || 400\n                );\n            },\n\n            /**\n             * If the renderTo element has no offsetWidth, most likely one or more of\n             * its parents are hidden. Loop up the DOM tree to temporarily display the\n             * parents, then save the original display properties, and when the true\n             * size is retrieved, reset them. Used on first render and on redraws.\n             *\n             * @param {Boolean} revert - Revert to the saved original styles.\n             */\n            temporaryDisplay: function(revert) {\n                var node = this.renderTo,\n                    tempStyle;\n                if (!revert) {\n                    while (node && node.style) {\n                        if (getStyle(node, 'display', false) === 'none') {\n                            node.hcOrigStyle = {\n                                display: node.style.display,\n                                height: node.style.height,\n                                overflow: node.style.overflow\n                            };\n                            tempStyle = {\n                                display: 'block',\n                                overflow: 'hidden'\n                            };\n                            if (node !== this.renderTo) {\n                                tempStyle.height = 0;\n                            }\n\n                            H.css(node, tempStyle);\n                            if (node.style.setProperty) { // #2631\n                                node.style.setProperty('display', 'block', 'important');\n                            }\n                        }\n                        node = node.parentNode;\n                    }\n                } else {\n                    while (node && node.style) {\n                        if (node.hcOrigStyle) {\n                            H.css(node, node.hcOrigStyle);\n                            delete node.hcOrigStyle;\n                        }\n                        node = node.parentNode;\n                    }\n                }\n            },\n\n            /**\n             * Setter for the chart class name\n             */\n            setClassName: function(className) {\n                this.container.className = 'highcharts-container ' + (className || '');\n            },\n\n            /**\n             * Get the containing element, determine the size and create the inner\n             * container div to hold the chart\n             */\n            getContainer: function() {\n                var chart = this,\n                    container,\n                    options = chart.options,\n                    optionsChart = options.chart,\n                    chartWidth,\n                    chartHeight,\n                    renderTo = chart.renderTo,\n                    indexAttrName = 'data-highcharts-chart',\n                    oldChartIndex,\n                    Ren,\n                    containerId = H.uniqueKey(),\n                    containerStyle,\n                    key;\n\n                if (!renderTo) {\n                    chart.renderTo = renderTo = optionsChart.renderTo;\n                }\n\n                if (isString(renderTo)) {\n                    chart.renderTo = renderTo = doc.getElementById(renderTo);\n                }\n\n                // Display an error if the renderTo is wrong\n                if (!renderTo) {\n                    H.error(13, true);\n                }\n\n                // If the container already holds a chart, destroy it. The check for\n                // hasRendered is there because web pages that are saved to disk from\n                // the browser, will preserve the data-highcharts-chart attribute and\n                // the SVG contents, but not an interactive chart. So in this case,\n                // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n                oldChartIndex = pInt(attr(renderTo, indexAttrName));\n                if (\n                    isNumber(oldChartIndex) &&\n                    charts[oldChartIndex] &&\n                    charts[oldChartIndex].hasRendered\n                ) {\n                    charts[oldChartIndex].destroy();\n                }\n\n                // Make a reference to the chart from the div\n                attr(renderTo, indexAttrName, chart.index);\n\n                // remove previous chart\n                renderTo.innerHTML = '';\n\n                // If the container doesn't have an offsetWidth, it has or is a child of\n                // a node that has display:none. We need to temporarily move it out to a\n                // visible state to determine the size, else the legend and tooltips\n                // won't render properly. The skipClone option is used in sparklines as\n                // a micro optimization, saving about 1-2 ms each chart.\n                if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n                    chart.temporaryDisplay();\n                }\n\n                // get the width and height\n                chart.getChartSize();\n                chartWidth = chart.chartWidth;\n                chartHeight = chart.chartHeight;\n\n                // Create the inner container\n\n                containerStyle = extend({\n                    position: 'relative',\n                    overflow: 'hidden', // needed for context menu (avoid scrollbars)\n                    // and content overflow in IE\n                    width: chartWidth + 'px',\n                    height: chartHeight + 'px',\n                    textAlign: 'left',\n                    lineHeight: 'normal', // #427\n                    zIndex: 0, // #1072\n                    '-webkit-tap-highlight-color': 'rgba(0,0,0,0)'\n                }, optionsChart.style);\n\n\n                /**\n                 * The containing HTML element of the chart. The container is\n                 * dynamically inserted into the element given as the `renderTo`\n                 * parameterin the {@link Highcharts#chart} constructor.\n                 *\n                 * @memberOf Highcharts.Chart\n                 * @type {HTMLDOMElement}\n                 */\n                container = createElement(\n                    'div', {\n                        id: containerId\n                    },\n                    containerStyle,\n                    renderTo\n                );\n                chart.container = container;\n\n                // cache the cursor (#1650)\n                chart._cursor = container.style.cursor;\n\n                // Initialize the renderer\n                Ren = H[optionsChart.renderer] || Renderer;\n                chart.renderer = new Ren(\n                    container,\n                    chartWidth,\n                    chartHeight,\n                    null,\n                    optionsChart.forExport,\n                    options.exporting && options.exporting.allowHTML\n                );\n\n\n                chart.setClassName(optionsChart.className);\n\n                chart.renderer.setStyle(optionsChart.style);\n\n\n                // Add a reference to the charts index\n                chart.renderer.chartIndex = chart.index;\n            },\n\n            /**\n             * Calculate margins by rendering axis labels in a preliminary position.\n             * Title, subtitle and legend have already been rendered at this stage, but\n             * will be moved into their final positions\n             */\n            getMargins: function(skipAxes) {\n                var chart = this,\n                    spacing = chart.spacing,\n                    margin = chart.margin,\n                    titleOffset = chart.titleOffset;\n\n                chart.resetMargins();\n\n                // Adjust for title and subtitle\n                if (titleOffset && !defined(margin[0])) {\n                    chart.plotTop = Math.max(\n                        chart.plotTop,\n                        titleOffset + chart.options.title.margin + spacing[0]\n                    );\n                }\n\n                // Adjust for legend\n                if (chart.legend.display) {\n                    chart.legend.adjustMargins(margin, spacing);\n                }\n\n                // adjust for scroller\n                if (chart.extraMargin) {\n                    chart[chart.extraMargin.type] =\n                        (chart[chart.extraMargin.type] || 0) + chart.extraMargin.value;\n                }\n                if (chart.extraTopMargin) {\n                    chart.plotTop += chart.extraTopMargin;\n                }\n                if (!skipAxes) {\n                    this.getAxisMargins();\n                }\n            },\n\n            getAxisMargins: function() {\n\n                var chart = this,\n                    // [top, right, bottom, left]\n                    axisOffset = chart.axisOffset = [0, 0, 0, 0],\n                    margin = chart.margin;\n\n                // pre-render axes to get labels offset width\n                if (chart.hasCartesianSeries) {\n                    each(chart.axes, function(axis) {\n                        if (axis.visible) {\n                            axis.getOffset();\n                        }\n                    });\n                }\n\n                // Add the axis offsets\n                each(marginNames, function(m, side) {\n                    if (!defined(margin[side])) {\n                        chart[m] += axisOffset[side];\n                    }\n                });\n\n                chart.setChartSize();\n\n            },\n\n            /**\n             * Reflows the chart to its container. By default, the chart reflows\n             * automatically to its container following a `window.resize` event, as per\n             * the {@link https://api.highcharts/highcharts/chart.reflow|chart.reflow}\n             * option. However, there are no reliable events for div resize, so if the\n             * container is resized without a window resize event, this must be called\n             * explicitly.\n             *\n             * @param  {Object} e\n             *         Event arguments. Used primarily when the function is called\n             *         internally as a response to window resize.\n             *\n             * @sample highcharts/members/chart-reflow/\n             *         Resize div and reflow\n             * @sample highcharts/chart/events-container/\n             *         Pop up and reflow\n             */\n            reflow: function(e) {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    renderTo = chart.renderTo,\n                    hasUserWidth = defined(optionsChart.width),\n                    width = optionsChart.width || getStyle(renderTo, 'width'),\n                    height = optionsChart.height || getStyle(renderTo, 'height'),\n                    target = e ? e.target : win;\n\n                // Width and height checks for display:none. Target is doc in IE8 and\n                // Opera, win in Firefox, Chrome and IE9.\n                if (!hasUserWidth &&\n                    !chart.isPrinting &&\n                    width &&\n                    height &&\n                    (target === win || target === doc)\n                ) {\n                    if (\n                        width !== chart.containerWidth ||\n                        height !== chart.containerHeight\n                    ) {\n                        clearTimeout(chart.reflowTimeout);\n                        // When called from window.resize, e is set, else it's called\n                        // directly (#2224)\n                        chart.reflowTimeout = syncTimeout(function() {\n                            // Set size, it may have been destroyed in the meantime\n                            // (#1257)\n                            if (chart.container) {\n                                chart.setSize(undefined, undefined, false);\n                            }\n                        }, e ? 100 : 0);\n                    }\n                    chart.containerWidth = width;\n                    chart.containerHeight = height;\n                }\n            },\n\n            /**\n             * Add the event handlers necessary for auto resizing\n             */\n            initReflow: function() {\n                var chart = this,\n                    unbind;\n\n                unbind = addEvent(win, 'resize', function(e) {\n                    chart.reflow(e);\n                });\n                addEvent(chart, 'destroy', unbind);\n\n                // The following will add listeners to re-fit the chart before and after\n                // printing (#2284). However it only works in WebKit. Should have worked\n                // in Firefox, but not supported in IE.\n                /*\n                if (win.matchMedia) {\n                \twin.matchMedia('print').addListener(function reflow() {\n                \t\tchart.reflow();\n                \t});\n                }\n                */\n            },\n\n            /**\n             * Resize the chart to a given width and height. In order to set the width\n             * only, the height argument may be skipped. To set the height only, pass\n             * `undefined for the width.\n             * @param  {Number|undefined|null} [width]\n             *         The new pixel width of the chart. Since v4.2.6, the argument can\n             *         be `undefined` in order to preserve the current value (when\n             *         setting height only), or `null` to adapt to the width of the\n             *         containing element.\n             * @param  {Number|undefined|null} [height]\n             *         The new pixel height of the chart. Since v4.2.6, the argument can\n             *         be `undefined` in order to preserve the current value, or `null`\n             *         in order to adapt to the height of the containing element.\n             * @param  {AnimationOptions} [animation=true]\n             *         Whether and how to apply animation.\n             *\n             * @sample highcharts/members/chart-setsize-button/\n             *         Test resizing from buttons\n             * @sample highcharts/members/chart-setsize-jquery-resizable/\n             *         Add a jQuery UI resizable\n             * @sample stock/members/chart-setsize/\n             *         Highstock with UI resizable\n             */\n            setSize: function(width, height, animation) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    globalAnimation;\n\n                // Handle the isResizing counter\n                chart.isResizing += 1;\n\n                // set the animation for the current process\n                H.setAnimation(animation, chart);\n\n                chart.oldChartHeight = chart.chartHeight;\n                chart.oldChartWidth = chart.chartWidth;\n                if (width !== undefined) {\n                    chart.options.chart.width = width;\n                }\n                if (height !== undefined) {\n                    chart.options.chart.height = height;\n                }\n                chart.getChartSize();\n\n                // Resize the container with the global animation applied if enabled\n                // (#2503)\n\n                globalAnimation = renderer.globalAnimation;\n                (globalAnimation ? animate : css)(chart.container, {\n                    width: chart.chartWidth + 'px',\n                    height: chart.chartHeight + 'px'\n                }, globalAnimation);\n\n\n                chart.setChartSize(true);\n                renderer.setSize(chart.chartWidth, chart.chartHeight, animation);\n\n                // handle axes\n                each(chart.axes, function(axis) {\n                    axis.isDirty = true;\n                    axis.setScale();\n                });\n\n                chart.isDirtyLegend = true; // force legend redraw\n                chart.isDirtyBox = true; // force redraw of plot and chart border\n\n                chart.layOutTitles(); // #2857\n                chart.getMargins();\n\n                chart.redraw(animation);\n\n\n                chart.oldChartHeight = null;\n                fireEvent(chart, 'resize');\n\n                // Fire endResize and set isResizing back. If animation is disabled,\n                // fire without delay\n                syncTimeout(function() {\n                    if (chart) {\n                        fireEvent(chart, 'endResize', null, function() {\n                            chart.isResizing -= 1;\n                        });\n                    }\n                }, animObject(globalAnimation).duration);\n            },\n\n            /**\n             * Set the public chart properties. This is done before and after the\n             * pre-render to determine margin sizes\n             */\n            setChartSize: function(skipAxes) {\n                var chart = this,\n                    inverted = chart.inverted,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    optionsChart = chart.options.chart,\n                    spacing = chart.spacing,\n                    clipOffset = chart.clipOffset,\n                    clipX,\n                    clipY,\n                    plotLeft,\n                    plotTop,\n                    plotWidth,\n                    plotHeight,\n                    plotBorderWidth;\n\n                function clipOffsetSide(side) {\n                    var offset = clipOffset[side] || 0;\n                    return Math.max(plotBorderWidth || offset, offset) / 2;\n                }\n\n                chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n                chart.plotTop = plotTop = Math.round(chart.plotTop);\n                chart.plotWidth = plotWidth = Math.max(\n                    0,\n                    Math.round(chartWidth - plotLeft - chart.marginRight)\n                );\n                chart.plotHeight = plotHeight = Math.max(\n                    0,\n                    Math.round(chartHeight - plotTop - chart.marginBottom)\n                );\n\n                chart.plotSizeX = inverted ? plotHeight : plotWidth;\n                chart.plotSizeY = inverted ? plotWidth : plotHeight;\n\n                chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n\n                // Set boxes used for alignment\n                chart.spacingBox = renderer.spacingBox = {\n                    x: spacing[3],\n                    y: spacing[0],\n                    width: chartWidth - spacing[3] - spacing[1],\n                    height: chartHeight - spacing[0] - spacing[2]\n                };\n                chart.plotBox = renderer.plotBox = {\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                };\n\n                plotBorderWidth = 2 * Math.floor(chart.plotBorderWidth / 2);\n                clipX = Math.ceil(clipOffsetSide(3));\n                clipY = Math.ceil(clipOffsetSide(0));\n                chart.clipBox = {\n                    x: clipX,\n                    y: clipY,\n                    width: Math.floor(\n                        chart.plotSizeX -\n                        clipOffsetSide(1) -\n                        clipX\n                    ),\n                    height: Math.max(\n                        0,\n                        Math.floor(\n                            chart.plotSizeY -\n                            clipOffsetSide(2) -\n                            clipY\n                        )\n                    )\n                };\n\n                if (!skipAxes) {\n                    each(chart.axes, function(axis) {\n                        axis.setAxisSize();\n                        axis.setAxisTranslation();\n                    });\n                }\n            },\n\n            /**\n             * Initial margins before auto size margins are applied\n             */\n            resetMargins: function() {\n                var chart = this,\n                    chartOptions = chart.options.chart;\n\n                // Create margin and spacing array\n                each(['margin', 'spacing'], function splashArrays(target) {\n                    var value = chartOptions[target],\n                        values = isObject(value) ? value : [value, value, value, value];\n\n                    each(['Top', 'Right', 'Bottom', 'Left'], function(sideName, side) {\n                        chart[target][side] = pick(\n                            chartOptions[target + sideName],\n                            values[side]\n                        );\n                    });\n                });\n\n                // Set margin names like chart.plotTop, chart.plotLeft,\n                // chart.marginRight, chart.marginBottom.\n                each(marginNames, function(m, side) {\n                    chart[m] = pick(chart.margin[side], chart.spacing[side]);\n                });\n                chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n                chart.clipOffset = [];\n            },\n\n            /**\n             * Draw the borders and backgrounds for chart and plot area\n             */\n            drawChartBox: function() {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    chartBackground = chart.chartBackground,\n                    plotBackground = chart.plotBackground,\n                    plotBorder = chart.plotBorder,\n                    chartBorderWidth,\n\n                    plotBGImage = chart.plotBGImage,\n                    chartBackgroundColor = optionsChart.backgroundColor,\n                    plotBackgroundColor = optionsChart.plotBackgroundColor,\n                    plotBackgroundImage = optionsChart.plotBackgroundImage,\n\n                    mgn,\n                    bgAttr,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    plotBox = chart.plotBox,\n                    clipRect = chart.clipRect,\n                    clipBox = chart.clipBox,\n                    verb = 'animate';\n\n                // Chart area\n                if (!chartBackground) {\n                    chart.chartBackground = chartBackground = renderer.rect()\n                        .addClass('highcharts-background')\n                        .add();\n                    verb = 'attr';\n                }\n\n\n                // Presentational\n                chartBorderWidth = optionsChart.borderWidth || 0;\n                mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n\n                bgAttr = {\n                    fill: chartBackgroundColor || 'none'\n                };\n\n                if (chartBorderWidth || chartBackground['stroke-width']) { // #980\n                    bgAttr.stroke = optionsChart.borderColor;\n                    bgAttr['stroke-width'] = chartBorderWidth;\n                }\n                chartBackground\n                    .attr(bgAttr)\n                    .shadow(optionsChart.shadow);\n\n                chartBackground[verb]({\n                    x: mgn / 2,\n                    y: mgn / 2,\n                    width: chartWidth - mgn - chartBorderWidth % 2,\n                    height: chartHeight - mgn - chartBorderWidth % 2,\n                    r: optionsChart.borderRadius\n                });\n\n                // Plot background\n                verb = 'animate';\n                if (!plotBackground) {\n                    verb = 'attr';\n                    chart.plotBackground = plotBackground = renderer.rect()\n                        .addClass('highcharts-plot-background')\n                        .add();\n                }\n                plotBackground[verb](plotBox);\n\n\n                // Presentational attributes for the background\n                plotBackground\n                    .attr({\n                        fill: plotBackgroundColor || 'none'\n                    })\n                    .shadow(optionsChart.plotShadow);\n\n                // Create the background image\n                if (plotBackgroundImage) {\n                    if (!plotBGImage) {\n                        chart.plotBGImage = renderer.image(\n                            plotBackgroundImage,\n                            plotLeft,\n                            plotTop,\n                            plotWidth,\n                            plotHeight\n                        ).add();\n                    } else {\n                        plotBGImage.animate(plotBox);\n                    }\n                }\n\n\n                // Plot clip\n                if (!clipRect) {\n                    chart.clipRect = renderer.clipRect(clipBox);\n                } else {\n                    clipRect.animate({\n                        width: clipBox.width,\n                        height: clipBox.height\n                    });\n                }\n\n                // Plot area border\n                verb = 'animate';\n                if (!plotBorder) {\n                    verb = 'attr';\n                    chart.plotBorder = plotBorder = renderer.rect()\n                        .addClass('highcharts-plot-border')\n                        .attr({\n                            zIndex: 1 // Above the grid\n                        })\n                        .add();\n                }\n\n\n                // Presentational\n                plotBorder.attr({\n                    stroke: optionsChart.plotBorderColor,\n                    'stroke-width': optionsChart.plotBorderWidth || 0,\n                    fill: 'none'\n                });\n\n\n                plotBorder[verb](plotBorder.crisp({\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                }, -plotBorder.strokeWidth())); //#3282 plotBorder should be negative;\n\n                // reset\n                chart.isDirtyBox = false;\n            },\n\n            /**\n             * Detect whether a certain chart property is needed based on inspecting its\n             * options and series. This mainly applies to the chart.inverted property,\n             * and in extensions to the chart.angular and chart.polar properties.\n             */\n            propFromSeries: function() {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    klass,\n                    seriesOptions = chart.options.series,\n                    i,\n                    value;\n\n\n                each(['inverted', 'angular', 'polar'], function(key) {\n\n                    // The default series type's class\n                    klass = seriesTypes[optionsChart.type ||\n                        optionsChart.defaultSeriesType];\n\n                    // Get the value from available chart-wide properties\n                    value =\n                        optionsChart[key] || // It is set in the options\n                        (klass && klass.prototype[key]); // The default series class\n                    // requires it\n\n                    // 4. Check if any the chart's series require it\n                    i = seriesOptions && seriesOptions.length;\n                    while (!value && i--) {\n                        klass = seriesTypes[seriesOptions[i].type];\n                        if (klass && klass.prototype[key]) {\n                            value = true;\n                        }\n                    }\n\n                    // Set the chart property\n                    chart[key] = value;\n                });\n\n            },\n\n            /**\n             * Link two or more series together. This is done initially from\n             * Chart.render, and after Chart.addSeries and Series.remove.\n             */\n            linkSeries: function() {\n                var chart = this,\n                    chartSeries = chart.series;\n\n                // Reset links\n                each(chartSeries, function(series) {\n                    series.linkedSeries.length = 0;\n                });\n\n                // Apply new links\n                each(chartSeries, function(series) {\n                    var linkedTo = series.options.linkedTo;\n                    if (isString(linkedTo)) {\n                        if (linkedTo === ':previous') {\n                            linkedTo = chart.series[series.index - 1];\n                        } else {\n                            linkedTo = chart.get(linkedTo);\n                        }\n                        // #3341 avoid mutual linking\n                        if (linkedTo && linkedTo.linkedParent !== series) {\n                            linkedTo.linkedSeries.push(series);\n                            series.linkedParent = linkedTo;\n                            series.visible = pick(\n                                series.options.visible,\n                                linkedTo.options.visible,\n                                series.visible\n                            ); // #3879\n                        }\n                    }\n                });\n            },\n\n            /**\n             * Render series for the chart\n             */\n            renderSeries: function() {\n                each(this.series, function(serie) {\n                    serie.translate();\n                    serie.render();\n                });\n            },\n\n            /**\n             * Render labels for the chart\n             */\n            renderLabels: function() {\n                var chart = this,\n                    labels = chart.options.labels;\n                if (labels.items) {\n                    each(labels.items, function(label) {\n                        var style = extend(labels.style, label.style),\n                            x = pInt(style.left) + chart.plotLeft,\n                            y = pInt(style.top) + chart.plotTop + 12;\n\n                        // delete to prevent rewriting in IE\n                        delete style.left;\n                        delete style.top;\n\n                        chart.renderer.text(\n                                label.html,\n                                x,\n                                y\n                            )\n                            .attr({\n                                zIndex: 2\n                            })\n                            .css(style)\n                            .add();\n\n                    });\n                }\n            },\n\n            /**\n             * Render all graphics for the chart\n             */\n            render: function() {\n                var chart = this,\n                    axes = chart.axes,\n                    renderer = chart.renderer,\n                    options = chart.options,\n                    tempWidth,\n                    tempHeight,\n                    redoHorizontal,\n                    redoVertical;\n\n                // Title\n                chart.setTitle();\n\n\n                // Legend\n                chart.legend = new Legend(chart, options.legend);\n\n                // Get stacks\n                if (chart.getStacks) {\n                    chart.getStacks();\n                }\n\n                // Get chart margins\n                chart.getMargins(true);\n                chart.setChartSize();\n\n                // Record preliminary dimensions for later comparison\n                tempWidth = chart.plotWidth;\n                tempHeight = chart.plotHeight = chart.plotHeight - 21; // 21 is the most common correction for X axis labels\n\n                // Get margins by pre-rendering axes\n                each(axes, function(axis) {\n                    axis.setScale();\n                });\n                chart.getAxisMargins();\n\n                // If the plot area size has changed significantly, calculate tick positions again\n                redoHorizontal = tempWidth / chart.plotWidth > 1.1;\n                redoVertical = tempHeight / chart.plotHeight > 1.05; // Height is more sensitive\n\n                if (redoHorizontal || redoVertical) {\n\n                    each(axes, function(axis) {\n                        if ((axis.horiz && redoHorizontal) || (!axis.horiz && redoVertical)) {\n                            axis.setTickInterval(true); // update to reflect the new margins\n                        }\n                    });\n                    chart.getMargins(); // second pass to check for new labels\n                }\n\n                // Draw the borders and backgrounds\n                chart.drawChartBox();\n\n\n                // Axes\n                if (chart.hasCartesianSeries) {\n                    each(axes, function(axis) {\n                        if (axis.visible) {\n                            axis.render();\n                        }\n                    });\n                }\n\n                // The series\n                if (!chart.seriesGroup) {\n                    chart.seriesGroup = renderer.g('series-group')\n                        .attr({\n                            zIndex: 3\n                        })\n                        .add();\n                }\n                chart.renderSeries();\n\n                // Labels\n                chart.renderLabels();\n\n                // Credits\n                chart.addCredits();\n\n                // Handle responsiveness\n                if (chart.setResponsive) {\n                    chart.setResponsive();\n                }\n\n                // Set flag\n                chart.hasRendered = true;\n\n            },\n\n            /**\n             * Set a new credits label for the chart.\n             *\n             * @param  {CreditOptions} options\n             *         A configuration object for the new credits.\n             * @sample highcharts/credits/credits-update/ Add and update credits\n             */\n            addCredits: function(credits) {\n                var chart = this;\n\n                credits = merge(true, this.options.credits, credits);\n                if (credits.enabled && !this.credits) {\n\n                    /**\n                     * The chart's credits label. The label has an `update` method that\n                     * allows setting new options as per the {@link\n                     * https://api.highcharts.com/highcharts/credits|\n                     * credits options set}.\n                     *\n                     * @memberof Highcharts.Chart\n                     * @name credits\n                     * @type {Highcharts.SVGElement}\n                     */\n                    this.credits = this.renderer.text(\n                            credits.text + (this.mapCredits || ''),\n                            0,\n                            0\n                        )\n                        .addClass('highcharts-credits')\n                        .on('click', function() {\n                            if (credits.href) {\n                                win.location.href = credits.href;\n                            }\n                        })\n                        .attr({\n                            align: credits.position.align,\n                            zIndex: 8\n                        })\n\n                        .css(credits.style)\n\n                        .add()\n                        .align(credits.position);\n\n                    // Dynamically update\n                    this.credits.update = function(options) {\n                        chart.credits = chart.credits.destroy();\n                        chart.addCredits(options);\n                    };\n                }\n            },\n\n            /**\n             * Remove the chart and purge memory. This method is called internally\n             * before adding a second chart into the same container, as well as on\n             * window unload to prevent leaks.\n             *\n             * @sample highcharts/members/chart-destroy/\n             *         Destroy the chart from a button\n             * @sample stock/members/chart-destroy/\n             *         Destroy with Highstock\n             */\n            destroy: function() {\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    container = chart.container,\n                    i,\n                    parentNode = container && container.parentNode;\n\n                // fire the chart.destoy event\n                fireEvent(chart, 'destroy');\n\n                // Delete the chart from charts lookup array\n                if (chart.renderer.forExport) {\n                    H.erase(charts, chart); // #6569\n                } else {\n                    charts[chart.index] = undefined;\n                }\n                H.chartCount--;\n                chart.renderTo.removeAttribute('data-highcharts-chart');\n\n                // remove events\n                removeEvent(chart);\n\n                // ==== Destroy collections:\n                // Destroy axes\n                i = axes.length;\n                while (i--) {\n                    axes[i] = axes[i].destroy();\n                }\n\n                // Destroy scroller & scroller series before destroying base series\n                if (this.scroller && this.scroller.destroy) {\n                    this.scroller.destroy();\n                }\n\n                // Destroy each series\n                i = series.length;\n                while (i--) {\n                    series[i] = series[i].destroy();\n                }\n\n                // ==== Destroy chart properties:\n                each([\n                    'title', 'subtitle', 'chartBackground', 'plotBackground',\n                    'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n                    'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n                    'renderer'\n                ], function(name) {\n                    var prop = chart[name];\n\n                    if (prop && prop.destroy) {\n                        chart[name] = prop.destroy();\n                    }\n                });\n\n                // remove container and all SVG\n                if (container) { // can break in IE when destroyed before finished loading\n                    container.innerHTML = '';\n                    removeEvent(container);\n                    if (parentNode) {\n                        discardElement(container);\n                    }\n\n                }\n\n                // clean it all up\n                objectEach(chart, function(val, key) {\n                    delete chart[key];\n                });\n\n            },\n\n\n            /**\n             * VML namespaces can't be added until after complete. Listening\n             * for Perini's doScroll hack is not enough.\n             */\n            isReadyToRender: function() {\n                var chart = this;\n\n                // Note: win == win.top is required\n                if ((!svg && (win == win.top && doc.readyState !== 'complete'))) { // eslint-disable-line eqeqeq\n                    doc.attachEvent('onreadystatechange', function() {\n                        doc.detachEvent('onreadystatechange', chart.firstRender);\n                        if (doc.readyState === 'complete') {\n                            chart.firstRender();\n                        }\n                    });\n                    return false;\n                }\n                return true;\n            },\n\n            /**\n             * Prepare for first rendering after all data are loaded\n             */\n            firstRender: function() {\n                var chart = this,\n                    options = chart.options;\n\n                // Check whether the chart is ready to render\n                if (!chart.isReadyToRender()) {\n                    return;\n                }\n\n                // Create the container\n                chart.getContainer();\n\n                // Run an early event after the container and renderer are established\n                fireEvent(chart, 'init');\n\n\n                chart.resetMargins();\n                chart.setChartSize();\n\n                // Set the common chart properties (mainly invert) from the given series\n                chart.propFromSeries();\n\n                // get axes\n                chart.getAxes();\n\n                // Initialize the series\n                each(options.series || [], function(serieOptions) {\n                    chart.initSeries(serieOptions);\n                });\n\n                chart.linkSeries();\n\n                // Run an event after axes and series are initialized, but before render. At this stage,\n                // the series data is indexed and cached in the xData and yData arrays, so we can access\n                // those before rendering. Used in Highstock.\n                fireEvent(chart, 'beforeRender');\n\n                // depends on inverted and on margins being set\n                if (Pointer) {\n                    chart.pointer = new Pointer(chart, options);\n                }\n\n                chart.render();\n\n                // Fire the load event if there are no external images\n                if (!chart.renderer.imgCount && chart.onload) {\n                    chart.onload();\n                }\n\n                // If the chart was rendered outside the top container, put it back in (#3679)\n                chart.temporaryDisplay(true);\n\n            },\n\n            /** \n             * On chart load\n             */\n            onload: function() {\n\n                // Run callbacks\n                each([this.callback].concat(this.callbacks), function(fn) {\n                    if (fn && this.index !== undefined) { // Chart destroyed in its own callback (#3600)\n                        fn.apply(this, [this]);\n                    }\n                }, this);\n\n                fireEvent(this, 'load');\n                fireEvent(this, 'render');\n\n\n                // Set up auto resize, check for not destroyed (#6068)\n                if (defined(this.index) && this.options.chart.reflow !== false) {\n                    this.initReflow();\n                }\n\n                // Don't run again\n                this.onload = null;\n            }\n\n        }); // end Chart\n\n    }(Highcharts));\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Point,\n            H = Highcharts,\n\n            each = H.each,\n            extend = H.extend,\n            erase = H.erase,\n            fireEvent = H.fireEvent,\n            format = H.format,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            pick = H.pick,\n            removeEvent = H.removeEvent;\n\n        /**\n         * The Point object. The point objects are generated from the `series.data` \n         * configuration objects or raw numbers. They can be accessed from the\n         * `Series.points` array. Other ways to instaniate points are through {@link\n         * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n         *\n         * @class\n         */\n\n        Highcharts.Point = Point = function() {};\n        Highcharts.Point.prototype = {\n\n            /**\n             * Initialize the point. Called internally based on the series.data option.\n             * @param {Object} series The series object containing this point.\n             * @param {Object} options The data in either number, array or object\n             *        format.\n             * @param {Number} x Optionally, the X value of the.\n             * @returns {Object} The Point instance.\n             */\n            init: function(series, options, x) {\n\n                var point = this,\n                    colors,\n                    colorCount = series.chart.options.chart.colorCount,\n                    colorIndex;\n\n                /**\n                 * The series object associated with the point.\n                 *\n                 * @name series\n                 * @memberof Highcharts.Point\n                 * @type Highcharts.Series\n                 */\n                point.series = series;\n\n\n                /**\n                 * The point's current color.\n                 * @name color\n                 * @memberof Highcharts.Point\n                 * @type {Color}\n                 */\n                point.color = series.color; // #3445\n\n                point.applyOptions(options, x);\n\n                if (series.options.colorByPoint) {\n\n                    colors = series.options.colors || series.chart.options.colors;\n                    point.color = point.color || colors[series.colorCounter];\n                    colorCount = colors.length;\n\n                    colorIndex = series.colorCounter;\n                    series.colorCounter++;\n                    // loop back to zero\n                    if (series.colorCounter === colorCount) {\n                        series.colorCounter = 0;\n                    }\n                } else {\n                    colorIndex = series.colorIndex;\n                }\n                point.colorIndex = pick(point.colorIndex, colorIndex);\n\n                series.chart.pointCount++;\n                return point;\n            },\n            /**\n             * Apply the options containing the x and y data and possible some extra\n             * properties. Called on point init or from point.update.\n             *\n             * @param {Object} options The point options as defined in series.data.\n             * @param {Number} x Optionally, the X value.\n             * @returns {Object} The Point instance.\n             */\n            applyOptions: function(options, x) {\n                var point = this,\n                    series = point.series,\n                    pointValKey = series.options.pointValKey || series.pointValKey;\n\n                options = Point.prototype.optionsToObject.call(this, options);\n\n                // copy options directly to point\n                extend(point, options);\n                point.options = point.options ? extend(point.options, options) : options;\n\n                // Since options are copied into the Point instance, some accidental options must be shielded (#5681)\n                if (options.group) {\n                    delete point.group;\n                }\n\n                // For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.\n                if (pointValKey) {\n                    point.y = point[pointValKey];\n                }\n                point.isNull = pick(\n                    point.isValid && !point.isValid(),\n                    point.x === null || !isNumber(point.y, true)\n                ); // #3571, check for NaN\n\n                // The point is initially selected by options (#5777)\n                if (point.selected) {\n                    point.state = 'select';\n                }\n\n                // If no x is set by now, get auto incremented value. All points must have an\n                // x value, however the y value can be null to create a gap in the series\n                if ('name' in point && x === undefined && series.xAxis && series.xAxis.hasNames) {\n                    point.x = series.xAxis.nameToX(point);\n                }\n                if (point.x === undefined && series) {\n                    if (x === undefined) {\n                        point.x = series.autoIncrement(point);\n                    } else {\n                        point.x = x;\n                    }\n                }\n\n                return point;\n            },\n\n            /**\n             * Transform number or array configs into objects\n             */\n            optionsToObject: function(options) {\n                var ret = {},\n                    series = this.series,\n                    keys = series.options.keys,\n                    pointArrayMap = keys || series.pointArrayMap || ['y'],\n                    valueCount = pointArrayMap.length,\n                    firstItemType,\n                    i = 0,\n                    j = 0;\n\n                if (isNumber(options) || options === null) {\n                    ret[pointArrayMap[0]] = options;\n\n                } else if (isArray(options)) {\n                    // with leading x value\n                    if (!keys && options.length > valueCount) {\n                        firstItemType = typeof options[0];\n                        if (firstItemType === 'string') {\n                            ret.name = options[0];\n                        } else if (firstItemType === 'number') {\n                            ret.x = options[0];\n                        }\n                        i++;\n                    }\n                    while (j < valueCount) {\n                        if (!keys || options[i] !== undefined) { // Skip undefined positions for keys\n                            ret[pointArrayMap[j]] = options[i];\n                        }\n                        i++;\n                        j++;\n                    }\n                } else if (typeof options === 'object') {\n                    ret = options;\n\n                    // This is the fastest way to detect if there are individual point dataLabels that need\n                    // to be considered in drawDataLabels. These can only occur in object configs.\n                    if (options.dataLabels) {\n                        series._hasPointLabels = true;\n                    }\n\n                    // Same approach as above for markers\n                    if (options.marker) {\n                        series._hasPointMarkers = true;\n                    }\n                }\n                return ret;\n            },\n\n            /**\n             * Get the CSS class names for individual points\n             * @returns {String} The class name\n             */\n            getClassName: function() {\n                return 'highcharts-point' +\n                    (this.selected ? ' highcharts-point-select' : '') +\n                    (this.negative ? ' highcharts-negative' : '') +\n                    (this.isNull ? ' highcharts-null-point' : '') +\n                    (this.colorIndex !== undefined ? ' highcharts-color-' +\n                        this.colorIndex : '') +\n                    (this.options.className ? ' ' + this.options.className : '') +\n                    (this.zone && this.zone.className ? ' ' +\n                        this.zone.className.replace('highcharts-negative', '') : '');\n            },\n\n            /**\n             * Return the zone that the point belongs to\n             */\n            getZone: function() {\n                var series = this.series,\n                    zones = series.zones,\n                    zoneAxis = series.zoneAxis || 'y',\n                    i = 0,\n                    zone;\n\n                zone = zones[i];\n                while (this[zoneAxis] >= zone.value) {\n                    zone = zones[++i];\n                }\n\n                if (zone && zone.color && !this.options.color) {\n                    this.color = zone.color;\n                }\n\n                return zone;\n            },\n\n            /**\n             * Destroy a point to clear memory. Its reference still stays in series.data.\n             */\n            destroy: function() {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    hoverPoints = chart.hoverPoints,\n                    prop;\n\n                chart.pointCount--;\n\n                if (hoverPoints) {\n                    point.setState();\n                    erase(hoverPoints, point);\n                    if (!hoverPoints.length) {\n                        chart.hoverPoints = null;\n                    }\n\n                }\n                if (point === chart.hoverPoint) {\n                    point.onMouseOut();\n                }\n\n                // remove all events\n                if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive\n                    removeEvent(point);\n                    point.destroyElements();\n                }\n\n                if (point.legendItem) { // pies have legend items\n                    chart.legend.destroyItem(point);\n                }\n\n                for (prop in point) {\n                    point[prop] = null;\n                }\n\n\n            },\n\n            /**\n             * Destroy SVG elements associated with the point\n             */\n            destroyElements: function() {\n                var point = this,\n                    props = ['graphic', 'dataLabel', 'dataLabelUpper', 'connector', 'shadowGroup'],\n                    prop,\n                    i = 6;\n                while (i--) {\n                    prop = props[i];\n                    if (point[prop]) {\n                        point[prop] = point[prop].destroy();\n                    }\n                }\n            },\n\n            /**\n             * Return the configuration hash needed for the data label and tooltip formatters\n             */\n            getLabelConfig: function() {\n                return {\n                    x: this.category,\n                    y: this.y,\n                    color: this.color,\n                    colorIndex: this.colorIndex,\n                    key: this.name || this.category,\n                    series: this.series,\n                    point: this,\n                    percentage: this.percentage,\n                    total: this.total || this.stackTotal\n                };\n            },\n\n            /**\n             * Extendable method for formatting each point's tooltip line\n             *\n             * @return {String} A string to be concatenated in to the common tooltip text\n             */\n            tooltipFormatter: function(pointFormat) {\n\n                // Insert options for valueDecimals, valuePrefix, and valueSuffix\n                var series = this.series,\n                    seriesTooltipOptions = series.tooltipOptions,\n                    valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),\n                    valuePrefix = seriesTooltipOptions.valuePrefix || '',\n                    valueSuffix = seriesTooltipOptions.valueSuffix || '';\n\n                // Loop over the point array map and replace unformatted values with sprintf formatting markup\n                each(series.pointArrayMap || ['y'], function(key) {\n                    key = '{point.' + key; // without the closing bracket\n                    if (valuePrefix || valueSuffix) {\n                        pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);\n                    }\n                    pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');\n                });\n\n                return format(pointFormat, {\n                    point: this,\n                    series: this.series\n                });\n            },\n\n            /**\n             * Fire an event on the Point object.\n             * @param {String} eventType\n             * @param {Object} eventArgs Additional event arguments\n             * @param {Function} defaultFunction Default event handler\n             */\n            firePointEvent: function(eventType, eventArgs, defaultFunction) {\n                var point = this,\n                    series = this.series,\n                    seriesOptions = series.options;\n\n                // load event handlers on demand to save time on mouseover/out\n                if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {\n                    this.importEvents();\n                }\n\n                // add default handler if in selection mode\n                if (eventType === 'click' && seriesOptions.allowPointSelect) {\n                    defaultFunction = function(event) {\n                        // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera\n                        if (point.select) { // Could be destroyed by prior event handlers (#2911)\n                            point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n                        }\n                    };\n                }\n\n                fireEvent(this, eventType, eventArgs, defaultFunction);\n            },\n\n            /**\n             * For certain series types, like pie charts, where individual points can\n             * be shown or hidden. \n             *\n             * @name visible\n             * @memberOf Highcharts.Point\n             * @type {Boolean}\n             */\n            visible: true\n        };\n\n        /**\n         * For categorized axes this property holds the category name for the \n         * point. For other axes it holds the X value.\n         *\n         * @name category\n         * @memberOf Highcharts.Point\n         * @type {String|Number}\n         */\n\n        /**\n         * The percentage for points in a stacked series or pies.\n         *\n         * @name percentage\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n        /**\n         * The total of values in either a stack for stacked series, or a pie in a pie\n         * series.\n         *\n         * @name total\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n        /**\n         * The x value of the point.\n         *\n         * @name x\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n        /**\n         * The y value of the point.\n         *\n         * @name y\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            animObject = H.animObject,\n            arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            correctFloat = H.correctFloat,\n            Date = H.Date,\n            defaultOptions = H.defaultOptions,\n            defaultPlotOptions = H.defaultPlotOptions,\n            defined = H.defined,\n            each = H.each,\n            erase = H.erase,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            grep = H.grep,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            LegendSymbolMixin = H.LegendSymbolMixin, // @todo add as a requirement\n            merge = H.merge,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            Point = H.Point, // @todo  add as a requirement\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            SVGElement = H.SVGElement,\n            syncTimeout = H.syncTimeout,\n            win = H.win;\n\n        /**\n         * This is the base series prototype that all other series types inherit from.\n         * A new series is initiated either through the {@link https://api.highcharts.com/highcharts/series|\n         * series} option structure, or after the chart is initiated, through {@link\n         * Highcharts.Chart#addSeries}.\n         *\n         * The object can be accessed in a number of ways. All series and point event\n         * handlers give a reference to the `series` object. The chart object has a\n         * {@link Highcharts.Chart.series|series} property that is a collection of all\n         * the chart's series. The point objects and axis objects also have the same\n         * reference.\n         * \n         * Another way to reference the series programmatically is by `id`. Add an id\n         * in the series configuration options, and get the series object by {@link\n         * Highcharts.Chart#get}.\n         *\n         * Configuration options for the series are given in three levels. Options for\n         * all series in a chart are given in the {@link https://api.highcharts.com/highcharts/plotOptions.series|\n         * plotOptions.series} object. Then options for all series of a specific type\n         * are given in the plotOptions of that type, for example `plotOptions.line`.\n         * Next, options for one single series are given in the series array, or as\n         * arguements to `chart.addSeries`. \n         * \n         * The data in the series is stored in various arrays.\n         *\n         * - First, `series.options.data` contains all the original config options for\n         * each point whether added by options or methods like `series.addPoint`.\n         * - Next, `series.data` contains those values converted to points, but in case\n         * the series data length exceeds the `cropThreshold`, or if the data is grouped,\n         * `series.data` doesn't contain all the points. It only contains the points that\n         * have been created on demand.\n         * - Then there's `series.points` that contains all currently visible point\n         * objects. In case of cropping, the cropped-away points are not part of this\n         * array. The `series.points` array starts at `series.cropStart` compared to\n         * `series.data` and `series.options.data`. If however the series data is grouped,\n         * these can't be correlated one to one.\n         * - `series.xData` and `series.processedXData` contain clean x values, equivalent\n         * to `series.data` and `series.points`.\n         * - `series.yData` and `series.processedYData` contain clean y values, equivalent\n         * to `series.data` and `series.points`.\n         *\n         * @class Highcharts.Series\n         * @param  {Highcharts.Chart} chart\n         *         The chart instance.\n         * @param  {Object} options\n         *         The series options.\n         */\n        H.Series = H.seriesType('line', null, { // base series options\n\n            //cursor: 'default',\n            //dashStyle: null,\n            //linecap: 'round',\n            lineWidth: 2,\n            //shadow: false,\n\n            allowPointSelect: false,\n            showCheckbox: false,\n            animation: {\n                duration: 1000\n            },\n            //clip: true,\n            //connectNulls: false,\n            //enableMouseTracking: true,\n            events: {},\n            //legendIndex: 0,\n            // stacking: null,\n            marker: {\n\n                lineWidth: 0,\n                lineColor: '#ffffff',\n                //fillColor: null,\n\n                //enabled: true,\n                //symbol: null,\n                radius: 4,\n                states: { // states for a single point\n                    hover: {\n                        animation: {\n                            duration: 50\n                        },\n                        enabled: true,\n                        radiusPlus: 2,\n\n                        lineWidthPlus: 1\n\n                    },\n\n                    select: {\n                        fillColor: '#cccccc',\n                        lineColor: '#000000',\n                        lineWidth: 2\n                    }\n\n                }\n            },\n            point: {\n                events: {}\n            },\n            dataLabels: {\n                align: 'center',\n                // defer: true,\n                // enabled: false,\n                formatter: function() {\n                    return this.y === null ? '' : H.numberFormat(this.y, -1);\n                },\n\n                style: {\n                    fontSize: '11px',\n                    fontWeight: 'bold',\n                    color: 'contrast',\n                    textOutline: '1px contrast'\n                },\n                // backgroundColor: undefined,\n                // borderColor: undefined,\n                // borderWidth: undefined,\n                // shadow: false\n\n                verticalAlign: 'bottom', // above singular point\n                x: 0,\n                y: 0,\n                // borderRadius: undefined,\n                padding: 5\n            },\n            // draw points outside the plot area when the number of points is less than\n            // this\n            cropThreshold: 300,\n            pointRange: 0,\n            //pointStart: 0,\n            //pointInterval: 1,\n            //showInLegend: null, // auto = false for linked series\n            softThreshold: true,\n            states: { // states for the entire series\n                hover: {\n                    //enabled: false,\n                    animation: {\n                        duration: 50\n                    },\n                    lineWidthPlus: 1,\n                    marker: {\n                        // lineWidth: base + 1,\n                        // radius: base + 1\n                    },\n                    halo: {\n                        size: 10,\n\n                        opacity: 0.25\n\n                    }\n                },\n                select: {\n                    marker: {}\n                }\n            },\n            stickyTracking: true,\n            //tooltip: {\n            //pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span>' +\n            // '{series.name}: <b>{point.y}</b>'\n            //valueDecimals: null,\n            //xDateFormat: '%A, %b %e, %Y',\n            //valuePrefix: '',\n            //ySuffix: ''\n            //}\n            turboThreshold: 1000,\n            // zIndex: null\n            findNearestPointBy: 'x'\n\n        }, /** @lends Highcharts.Series.prototype */ {\n            isCartesian: true,\n            pointClass: Point,\n            sorted: true, // requires the data to be sorted\n            requireSorting: true,\n            directTouch: false,\n            axisTypes: ['xAxis', 'yAxis'],\n            colorCounter: 0,\n            // each point's x and y values are stored in this.xData and this.yData\n            parallelArrays: ['x', 'y'],\n            coll: 'series',\n            init: function(chart, options) {\n                var series = this,\n                    events,\n                    chartSeries = chart.series,\n                    lastSeries;\n\n                /**\n                 * Read only. The chart that the series belongs to.\n                 *\n                 * @name chart\n                 * @memberOf Series\n                 * @type {Chart}\n                 */\n                series.chart = chart;\n\n                /**\n                 * Read only. The series' type, like \"line\", \"area\", \"column\" etc. The\n                 * type in the series options anc can be altered using {@link\n                 * Series#update}.\n                 *\n                 * @name type\n                 * @memberOf Series\n                 * @type String\n                 */\n\n                /**\n                 * Read only. The series' current options. To update, use {@link\n                 * Series#update}.\n                 *\n                 * @name options\n                 * @memberOf Series\n                 * @type SeriesOptions\n                 */\n                series.options = options = series.setOptions(options);\n                series.linkedSeries = [];\n\n                // bind the axes\n                series.bindAxes();\n\n                // set some variables\n                extend(series, {\n                    /**\n                     * The series name as given in the options. Defaults to\n                     * \"Series {n}\".\n                     *\n                     * @name name\n                     * @memberOf Series\n                     * @type {String}\n                     */\n                    name: options.name,\n                    state: '',\n                    /**\n                     * Read only. The series' visibility state as set by {@link\n                     * Series#show}, {@link Series#hide}, or in the initial\n                     * configuration.\n                     *\n                     * @name visible\n                     * @memberOf Series\n                     * @type {Boolean}\n                     */\n                    visible: options.visible !== false, // true by default\n                    /**\n                     * Read only. The series' selected state as set by {@link\n                     * Highcharts.Series#select}.\n                     * \n                     * @name selected\n                     * @memberOf Series\n                     * @type {Boolean}\n                     */\n                    selected: options.selected === true // false by default\n                });\n\n                // register event listeners\n                events = options.events;\n\n                objectEach(events, function(event, eventType) {\n                    addEvent(series, eventType, event);\n                });\n                if (\n                    (events && events.click) ||\n                    (\n                        options.point &&\n                        options.point.events &&\n                        options.point.events.click\n                    ) ||\n                    options.allowPointSelect\n                ) {\n                    chart.runTrackerClick = true;\n                }\n\n                series.getColor();\n                series.getSymbol();\n\n                // Set the data\n                each(series.parallelArrays, function(key) {\n                    series[key + 'Data'] = [];\n                });\n                series.setData(options.data, false);\n\n                // Mark cartesian\n                if (series.isCartesian) {\n                    chart.hasCartesianSeries = true;\n                }\n\n                // Get the index and register the series in the chart. The index is one\n                // more than the current latest series index (#5960).\n                if (chartSeries.length) {\n                    lastSeries = chartSeries[chartSeries.length - 1];\n                }\n                series._i = pick(lastSeries && lastSeries._i, -1) + 1;\n\n                // Insert the series and re-order all series above the insertion point.\n                chart.orderSeries(this.insert(chartSeries));\n            },\n\n            /**\n             * Insert the series in a collection with other series, either the chart\n             * series or yAxis series, in the correct order according to the index \n             * option.\n             * @param  {Array} collection A collection of series.\n             * @returns {Number} The index of the series in the collection.\n             */\n            insert: function(collection) {\n                var indexOption = this.options.index,\n                    i;\n\n                // Insert by index option\n                if (isNumber(indexOption)) {\n                    i = collection.length;\n                    while (i--) {\n                        // Loop down until the interted element has higher index\n                        if (indexOption >=\n                            pick(collection[i].options.index, collection[i]._i)) {\n                            collection.splice(i + 1, 0, this);\n                            break;\n                        }\n                    }\n                    if (i === -1) {\n                        collection.unshift(this);\n                    }\n                    i = i + 1;\n\n                    // Or just push it to the end\n                } else {\n                    collection.push(this);\n                }\n                return pick(i, collection.length - 1);\n            },\n\n            /**\n             * Set the xAxis and yAxis properties of cartesian series, and register the\n             * series in the `axis.series` array.\n             *\n             * @function #bindAxes\n             * @memberOf Series\n             * @returns {void}\n             */\n            bindAxes: function() {\n                var series = this,\n                    seriesOptions = series.options,\n                    chart = series.chart,\n                    axisOptions;\n\n                // repeat for xAxis and yAxis\n                each(series.axisTypes || [], function(AXIS) {\n\n                    // loop through the chart's axis objects\n                    each(chart[AXIS], function(axis) {\n                        axisOptions = axis.options;\n\n                        // apply if the series xAxis or yAxis option mathches the number\n                        // of the axis, or if undefined, use the first axis\n                        if (\n                            seriesOptions[AXIS] === axisOptions.index ||\n                            (\n                                seriesOptions[AXIS] !== undefined &&\n                                seriesOptions[AXIS] === axisOptions.id\n                            ) ||\n                            (\n                                seriesOptions[AXIS] === undefined &&\n                                axisOptions.index === 0\n                            )\n                        ) {\n\n                            // register this series in the axis.series lookup\n                            series.insert(axis.series);\n\n                            // set this series.xAxis or series.yAxis reference\n                            /**\n                             * Read only. The unique xAxis object associated with the\n                             * series.\n                             *\n                             * @name xAxis\n                             * @memberOf Series\n                             * @type Axis\n                             */\n                            /**\n                             * Read only. The unique yAxis object associated with the\n                             * series.\n                             *\n                             * @name yAxis\n                             * @memberOf Series\n                             * @type Axis\n                             */\n                            series[AXIS] = axis;\n\n                            // mark dirty for redraw\n                            axis.isDirty = true;\n                        }\n                    });\n\n                    // The series needs an X and an Y axis\n                    if (!series[AXIS] && series.optionalAxis !== AXIS) {\n                        H.error(18, true);\n                    }\n\n                });\n            },\n\n            /**\n             * For simple series types like line and column, the data values are held in\n             * arrays like xData and yData for quick lookup to find extremes and more.\n             * For multidimensional series like bubble and map, this can be extended\n             * with arrays like zData and valueData by adding to the\n             * series.parallelArrays array.\n             */\n            updateParallelArrays: function(point, i) {\n                var series = point.series,\n                    args = arguments,\n                    fn = isNumber(i) ?\n                    // Insert the value in the given position\n                    function(key) {\n                        var val = key === 'y' && series.toYData ?\n                            series.toYData(point) :\n                            point[key];\n                        series[key + 'Data'][i] = val;\n                    } :\n                    // Apply the method specified in i with the following arguments\n                    // as arguments\n                    function(key) {\n                        Array.prototype[i].apply(\n                            series[key + 'Data'],\n                            Array.prototype.slice.call(args, 2)\n                        );\n                    };\n\n                each(series.parallelArrays, fn);\n            },\n\n            /**\n             * Return an auto incremented x value based on the pointStart and\n             * pointInterval options. This is only used if an x value is not given for\n             * the point that calls autoIncrement.\n             */\n            autoIncrement: function() {\n\n                var options = this.options,\n                    xIncrement = this.xIncrement,\n                    date,\n                    pointInterval,\n                    pointIntervalUnit = options.pointIntervalUnit;\n\n                xIncrement = pick(xIncrement, options.pointStart, 0);\n\n                this.pointInterval = pointInterval = pick(\n                    this.pointInterval,\n                    options.pointInterval,\n                    1\n                );\n\n                // Added code for pointInterval strings\n                if (pointIntervalUnit) {\n                    date = new Date(xIncrement);\n\n                    if (pointIntervalUnit === 'day') {\n                        date = +date[Date.hcSetDate](\n                            date[Date.hcGetDate]() + pointInterval\n                        );\n                    } else if (pointIntervalUnit === 'month') {\n                        date = +date[Date.hcSetMonth](\n                            date[Date.hcGetMonth]() + pointInterval\n                        );\n                    } else if (pointIntervalUnit === 'year') {\n                        date = +date[Date.hcSetFullYear](\n                            date[Date.hcGetFullYear]() + pointInterval\n                        );\n                    }\n                    pointInterval = date - xIncrement;\n\n                }\n\n                this.xIncrement = xIncrement + pointInterval;\n                return xIncrement;\n            },\n\n            /**\n             * Set the series options by merging from the options tree\n             * @param {Object} itemOptions\n             */\n            setOptions: function(itemOptions) {\n                var chart = this.chart,\n                    chartOptions = chart.options,\n                    plotOptions = chartOptions.plotOptions,\n                    userOptions = chart.userOptions || {},\n                    userPlotOptions = userOptions.plotOptions || {},\n                    typeOptions = plotOptions[this.type],\n                    options,\n                    zones;\n\n                this.userOptions = itemOptions;\n\n                // General series options take precedence over type options because\n                // otherwise, default type options like column.animation would be\n                // overwritten by the general option. But issues have been raised here\n                // (#3881), and the solution may be to distinguish between default\n                // option and userOptions like in the tooltip below.\n                options = merge(\n                    typeOptions,\n                    plotOptions.series,\n                    itemOptions\n                );\n\n                // The tooltip options are merged between global and series specific\n                // options. Importance order asscendingly:\n                // globals: (1)tooltip, (2)plotOptions.series, (3)plotOptions[this.type]\n                // init userOptions with possible later updates: 4-6 like 1-3 and\n                // (7)this series options\n                this.tooltipOptions = merge(\n                    defaultOptions.tooltip, // 1\n                    defaultOptions.plotOptions.series &&\n                    defaultOptions.plotOptions.series.tooltip, // 2\n                    defaultOptions.plotOptions[this.type].tooltip, // 3\n                    chartOptions.tooltip.userOptions, // 4\n                    plotOptions.series && plotOptions.series.tooltip, // 5\n                    plotOptions[this.type].tooltip, // 6\n                    itemOptions.tooltip // 7\n                );\n\n                // When shared tooltip, stickyTracking is true by default,\n                // unless user says otherwise.\n                this.stickyTracking = pick(\n                    itemOptions.stickyTracking,\n                    userPlotOptions[this.type] &&\n                    userPlotOptions[this.type].stickyTracking,\n                    userPlotOptions.series && userPlotOptions.series.stickyTracking,\n                    (\n                        this.tooltipOptions.shared && !this.noSharedTooltip ?\n                        true :\n                        options.stickyTracking\n                    )\n                );\n\n                // Delete marker object if not allowed (#1125)\n                if (typeOptions.marker === null) {\n                    delete options.marker;\n                }\n\n                // Handle color zones\n                this.zoneAxis = options.zoneAxis;\n                zones = this.zones = (options.zones || []).slice();\n                if (\n                    (options.negativeColor || options.negativeFillColor) &&\n                    !options.zones\n                ) {\n                    zones.push({\n                        value: options[this.zoneAxis + 'Threshold'] ||\n                            options.threshold ||\n                            0,\n                        className: 'highcharts-negative',\n\n                        color: options.negativeColor,\n                        fillColor: options.negativeFillColor\n\n                    });\n                }\n                if (zones.length) { // Push one extra zone for the rest\n                    if (defined(zones[zones.length - 1].value)) {\n                        zones.push({\n\n                            color: this.color,\n                            fillColor: this.fillColor\n\n                        });\n                    }\n                }\n                return options;\n            },\n\n            getCyclic: function(prop, value, defaults) {\n                var i,\n                    chart = this.chart,\n                    userOptions = this.userOptions,\n                    indexName = prop + 'Index',\n                    counterName = prop + 'Counter',\n                    len = defaults ? defaults.length : pick(\n                        chart.options.chart[prop + 'Count'],\n                        chart[prop + 'Count']\n                    ),\n                    setting;\n\n                if (!value) {\n                    // Pick up either the colorIndex option, or the _colorIndex after\n                    // Series.update()\n                    setting = pick(\n                        userOptions[indexName],\n                        userOptions['_' + indexName]\n                    );\n                    if (defined(setting)) { // after Series.update()\n                        i = setting;\n                    } else {\n                        // #6138\n                        if (!chart.series.length) {\n                            chart[counterName] = 0;\n                        }\n                        userOptions['_' + indexName] = i = chart[counterName] % len;\n                        chart[counterName] += 1;\n                    }\n                    if (defaults) {\n                        value = defaults[i];\n                    }\n                }\n                // Set the colorIndex\n                if (i !== undefined) {\n                    this[indexName] = i;\n                }\n                this[prop] = value;\n            },\n\n            /**\n             * Get the series' color\n             */\n\n            getColor: function() {\n                if (this.options.colorByPoint) {\n                    // #4359, selected slice got series.color even when colorByPoint was\n                    // set.\n                    this.options.color = null;\n                } else {\n                    this.getCyclic(\n                        'color',\n                        this.options.color || defaultPlotOptions[this.type].color,\n                        this.chart.options.colors\n                    );\n                }\n            },\n\n            /**\n             * Get the series' symbol\n             */\n            getSymbol: function() {\n                var seriesMarkerOption = this.options.marker;\n\n                this.getCyclic(\n                    'symbol',\n                    seriesMarkerOption.symbol,\n                    this.chart.options.symbols\n                );\n            },\n\n            drawLegendSymbol: LegendSymbolMixin.drawLineMarker,\n\n            /**\n             * Apply a new set of data to the series and optionally redraw it. The new\n             * data array is passed by reference (except in case of `updatePoints`), and\n             * may later be mutated when updating the chart data.\n             * \n             * Note the difference in behaviour when setting the same amount of points,\n             * or a different amount of points, as handled by the `updatePoints`\n             * parameter. \n             * \n             * @param  {SeriesDataOptions} data\n             *         Takes an array of data in the same format as described under\n             *         `series<type>data` for the given series type.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the series is altered. If doing\n             *         more operations on the chart, it is a good idea to set redraw to\n             *         false and call {@link Chart#redraw} after.\n             * @param  {AnimationOptions} [animation]\n             *         When the updated data is the same length as the existing data,\n             *         points will be updated by default, and animation visualizes how\n             *         the points are changed. Set false to disable animation, or a\n             *         configuration object to set duration or easing.\n             * @param  {Boolean} [updatePoints=true]\n             *         When the updated data is the same length as the existing data,\n             *         points will be updated instead of replaced. This allows updating\n             *         with animation and performs better. In this case, the original\n             *         array is not passed by reference. Set false to prevent.\n             *\n             * @sample highcharts/members/series-setdata/\n             *         Set new data from a button\n             * @sample highcharts/members/series-setdata-pie/\n             *         Set data in a pie\n             * @sample stock/members/series-setdata/\n             *         Set new data in Highstock\n             * @sample maps/members/series-setdata/\n             *         Set new data in Highmaps\n             */\n            setData: function(data, redraw, animation, updatePoints) {\n                var series = this,\n                    oldData = series.points,\n                    oldDataLength = (oldData && oldData.length) || 0,\n                    dataLength,\n                    options = series.options,\n                    chart = series.chart,\n                    firstPoint = null,\n                    xAxis = series.xAxis,\n                    i,\n                    turboThreshold = options.turboThreshold,\n                    pt,\n                    xData = this.xData,\n                    yData = this.yData,\n                    pointArrayMap = series.pointArrayMap,\n                    valueCount = pointArrayMap && pointArrayMap.length;\n\n                data = data || [];\n                dataLength = data.length;\n                redraw = pick(redraw, true);\n\n                // If the point count is the same as is was, just run Point.update which\n                // is cheaper, allows animation, and keeps references to points.\n                if (\n                    updatePoints !== false &&\n                    dataLength &&\n                    oldDataLength === dataLength &&\n                    !series.cropped &&\n                    !series.hasGroupedData &&\n                    series.visible\n                ) {\n                    each(data, function(point, i) {\n                        // .update doesn't exist on a linked, hidden series (#3709)\n                        if (oldData[i].update && point !== options.data[i]) {\n                            oldData[i].update(point, false, null, false);\n                        }\n                    });\n\n                } else {\n\n                    // Reset properties\n                    series.xIncrement = null;\n\n                    series.colorCounter = 0; // for series with colorByPoint (#1547)\n\n                    // Update parallel arrays\n                    each(this.parallelArrays, function(key) {\n                        series[key + 'Data'].length = 0;\n                    });\n\n                    // In turbo mode, only one- or twodimensional arrays of numbers are\n                    // allowed. The first value is tested, and we assume that all the\n                    // rest are defined the same way. Although the 'for' loops are\n                    // similar, they are repeated inside each if-else conditional for\n                    // max performance.\n                    if (turboThreshold && dataLength > turboThreshold) {\n\n                        // find the first non-null point\n                        i = 0;\n                        while (firstPoint === null && i < dataLength) {\n                            firstPoint = data[i];\n                            i++;\n                        }\n\n\n                        if (isNumber(firstPoint)) { // assume all points are numbers\n                            for (i = 0; i < dataLength; i++) {\n                                xData[i] = this.autoIncrement();\n                                yData[i] = data[i];\n                            }\n\n                            // Assume all points are arrays when first point is\n                        } else if (isArray(firstPoint)) {\n                            if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[0];\n                                    yData[i] = pt.slice(1, valueCount + 1);\n                                }\n                            } else { // [x, y]\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[0];\n                                    yData[i] = pt[1];\n                                }\n                            }\n                        } else {\n                            // Highcharts expects configs to be numbers or arrays in\n                            // turbo mode\n                            H.error(12);\n                        }\n                    } else {\n                        for (i = 0; i < dataLength; i++) {\n                            if (data[i] !== undefined) { // stray commas in oldIE\n                                pt = {\n                                    series: series\n                                };\n                                series.pointClass.prototype.applyOptions.apply(\n                                    pt, [data[i]]\n                                );\n                                series.updateParallelArrays(pt, i);\n                            }\n                        }\n                    }\n\n                    // Forgetting to cast strings to numbers is a common caveat when\n                    // handling CSV or JSON\n                    if (isString(yData[0])) {\n                        H.error(14, true);\n                    }\n\n                    /**\n                     * Read only. An array containing the series' data point objects. To\n                     * modify the data, use {@link Highcharts.Series#setData} or {@link\n                     * Highcharts.Point#update}.\n                     *\n                     * @name data\n                     * @memberOf Highcharts.Series\n                     * @type {Array.<Highcharts.Point>}\n                     */\n                    series.data = [];\n                    series.options.data = series.userOptions.data = data;\n\n                    // destroy old points\n                    i = oldDataLength;\n                    while (i--) {\n                        if (oldData[i] && oldData[i].destroy) {\n                            oldData[i].destroy();\n                        }\n                    }\n\n                    // reset minRange (#878)\n                    if (xAxis) {\n                        xAxis.minRange = xAxis.userMinRange;\n                    }\n\n                    // redraw\n                    series.isDirty = chart.isDirtyBox = true;\n                    series.isDirtyData = !!oldData;\n                    animation = false;\n                }\n\n                // Typically for pie series, points need to be processed and generated\n                // prior to rendering the legend\n                if (options.legendType === 'point') {\n                    this.processData();\n                    this.generatePoints();\n                }\n\n                if (redraw) {\n                    chart.redraw(animation);\n                }\n            },\n\n            /**\n             * Process the data by cropping away unused data points if the series is\n             * longer than the crop threshold. This saves computing time for large\n             * series.\n             */\n            processData: function(force) {\n                var series = this,\n                    processedXData = series.xData, // copied during slice operation\n                    processedYData = series.yData,\n                    dataLength = processedXData.length,\n                    croppedData,\n                    cropStart = 0,\n                    cropped,\n                    distance,\n                    closestPointRange,\n                    xAxis = series.xAxis,\n                    i, // loop variable\n                    options = series.options,\n                    cropThreshold = options.cropThreshold,\n                    getExtremesFromAll =\n                    series.getExtremesFromAll ||\n                    options.getExtremesFromAll, // #4599\n                    isCartesian = series.isCartesian,\n                    xExtremes,\n                    val2lin = xAxis && xAxis.val2lin,\n                    isLog = xAxis && xAxis.isLog,\n                    min,\n                    max;\n\n                // If the series data or axes haven't changed, don't go through this.\n                // Return false to pass the message on to override methods like in data\n                // grouping.\n                if (\n                    isCartesian &&\n                    !series.isDirty &&\n                    !xAxis.isDirty &&\n                    !series.yAxis.isDirty &&\n                    !force\n                ) {\n                    return false;\n                }\n\n                if (xAxis) {\n                    xExtremes = xAxis.getExtremes(); // corrected for log axis (#3053)\n                    min = xExtremes.min;\n                    max = xExtremes.max;\n                }\n\n                // optionally filter out points outside the plot area\n                if (\n                    isCartesian &&\n                    series.sorted &&\n                    !getExtremesFromAll &&\n                    (!cropThreshold || dataLength > cropThreshold || series.forceCrop)\n                ) {\n\n                    // it's outside current extremes\n                    if (\n                        processedXData[dataLength - 1] < min ||\n                        processedXData[0] > max\n                    ) {\n                        processedXData = [];\n                        processedYData = [];\n\n                        // only crop if it's actually spilling out\n                    } else if (\n                        processedXData[0] < min ||\n                        processedXData[dataLength - 1] > max\n                    ) {\n                        croppedData = this.cropData(\n                            series.xData,\n                            series.yData,\n                            min,\n                            max\n                        );\n                        processedXData = croppedData.xData;\n                        processedYData = croppedData.yData;\n                        cropStart = croppedData.start;\n                        cropped = true;\n                    }\n                }\n\n\n                // Find the closest distance between processed points\n                i = processedXData.length || 1;\n                while (--i) {\n                    distance = isLog ?\n                        val2lin(processedXData[i]) - val2lin(processedXData[i - 1]) :\n                        processedXData[i] - processedXData[i - 1];\n\n                    if (\n                        distance > 0 &&\n                        (\n                            closestPointRange === undefined ||\n                            distance < closestPointRange\n                        )\n                    ) {\n                        closestPointRange = distance;\n\n                        // Unsorted data is not supported by the line tooltip, as well as\n                        // data grouping and navigation in Stock charts (#725) and width\n                        // calculation of columns (#1900)\n                    } else if (distance < 0 && series.requireSorting) {\n                        H.error(15);\n                    }\n                }\n\n                // Record the properties\n                series.cropped = cropped; // undefined or true\n                series.cropStart = cropStart;\n                series.processedXData = processedXData;\n                series.processedYData = processedYData;\n\n                series.closestPointRange = closestPointRange;\n\n            },\n\n            /**\n             * Iterate over xData and crop values between min and max. Returns object\n             * containing crop start/end cropped xData with corresponding part of yData,\n             * dataMin and dataMax within the cropped range\n             */\n            cropData: function(xData, yData, min, max) {\n                var dataLength = xData.length,\n                    cropStart = 0,\n                    cropEnd = dataLength,\n                    // line-type series need one point outside\n                    cropShoulder = pick(this.cropShoulder, 1),\n                    i,\n                    j;\n\n                // iterate up to find slice start\n                for (i = 0; i < dataLength; i++) {\n                    if (xData[i] >= min) {\n                        cropStart = Math.max(0, i - cropShoulder);\n                        break;\n                    }\n                }\n\n                // proceed to find slice end\n                for (j = i; j < dataLength; j++) {\n                    if (xData[j] > max) {\n                        cropEnd = j + cropShoulder;\n                        break;\n                    }\n                }\n\n                return {\n                    xData: xData.slice(cropStart, cropEnd),\n                    yData: yData.slice(cropStart, cropEnd),\n                    start: cropStart,\n                    end: cropEnd\n                };\n            },\n\n\n            /**\n             * Generate the data point after the data has been processed by cropping\n             * away unused points and optionally grouped in Highcharts Stock.\n             */\n            generatePoints: function() {\n                var series = this,\n                    options = series.options,\n                    dataOptions = options.data,\n                    data = series.data,\n                    dataLength,\n                    processedXData = series.processedXData,\n                    processedYData = series.processedYData,\n                    PointClass = series.pointClass,\n                    processedDataLength = processedXData.length,\n                    cropStart = series.cropStart || 0,\n                    cursor,\n                    hasGroupedData = series.hasGroupedData,\n                    keys = options.keys,\n                    point,\n                    points = [],\n                    i;\n\n                if (!data && !hasGroupedData) {\n                    var arr = [];\n                    arr.length = dataOptions.length;\n                    data = series.data = arr;\n                }\n\n                if (keys && hasGroupedData) {\n                    // grouped data has already applied keys (#6590)\n                    series.options.keys = false;\n                }\n\n                for (i = 0; i < processedDataLength; i++) {\n                    cursor = cropStart + i;\n                    if (!hasGroupedData) {\n                        point = data[cursor];\n                        if (!point && dataOptions[cursor] !== undefined) { // #970\n                            data[cursor] = point = (new PointClass()).init(\n                                series,\n                                dataOptions[cursor],\n                                processedXData[i]\n                            );\n                        }\n                    } else {\n                        // splat the y data in case of ohlc data array\n                        point = (new PointClass()).init(\n                            series, [processedXData[i]].concat(splat(processedYData[i]))\n                        );\n\n                        /**\n                         * Highstock only. If a point object is created by data\n                         * grouping, it doesn't reflect actual points in the raw data.\n                         * In this case, the `dataGroup` property holds information\n                         * that points back to the raw data.\n                         *\n                         * - `dataGroup.start` is the index of the first raw data point\n                         * in the group.\n                         * - `dataGroup.length` is the amount of points in the group.\n                         *\n                         * @name dataGroup\n                         * @memberOf Point\n                         * @type {Object}\n                         * \n                         */\n                        point.dataGroup = series.groupMap[i];\n                    }\n                    if (point) { // #6279\n                        point.index = cursor; // For faster access in Point.update\n                        points[i] = point;\n                    }\n                }\n\n                // restore keys options (#6590)\n                series.options.keys = keys;\n\n                // Hide cropped-away points - this only runs when the number of points\n                // is above cropThreshold, or when swithching view from non-grouped\n                // data to grouped data (#637)\n                if (\n                    data &&\n                    (\n                        processedDataLength !== (dataLength = data.length) ||\n                        hasGroupedData\n                    )\n                ) {\n                    for (i = 0; i < dataLength; i++) {\n                        // when has grouped data, clear all points\n                        if (i === cropStart && !hasGroupedData) {\n                            i += processedDataLength;\n                        }\n                        if (data[i]) {\n                            data[i].destroyElements();\n                            data[i].plotX = undefined; // #1003\n                        }\n                    }\n                }\n\n                series.data = data;\n                series.points = points;\n            },\n\n            /**\n             * Calculate Y extremes for visible data\n             */\n            getExtremes: function(yData) {\n                var xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    xData = this.processedXData,\n                    yDataLength,\n                    activeYData = [],\n                    activeCounter = 0,\n                    // #2117, need to compensate for log X axis\n                    xExtremes = xAxis.getExtremes(),\n                    xMin = xExtremes.min,\n                    xMax = xExtremes.max,\n                    validValue,\n                    withinRange,\n                    x,\n                    y,\n                    i,\n                    j;\n\n                yData = yData || this.stackedYData || this.processedYData || [];\n                yDataLength = yData.length;\n\n                for (i = 0; i < yDataLength; i++) {\n\n                    x = xData[i];\n                    y = yData[i];\n\n                    // For points within the visible range, including the first point\n                    // outside the visible range, consider y extremes\n                    validValue =\n                        (isNumber(y, true) || isArray(y)) &&\n                        (!yAxis.positiveValuesOnly || (y.length || y > 0));\n                    withinRange =\n                        this.getExtremesFromAll ||\n                        this.options.getExtremesFromAll ||\n                        this.cropped ||\n                        ((xData[i] || x) >= xMin && (xData[i] || x) <= xMax);\n\n                    if (validValue && withinRange) {\n\n                        j = y.length;\n                        if (j) { // array, like ohlc or range data\n                            while (j--) {\n                                if (y[j] !== null) {\n                                    activeYData[activeCounter++] = y[j];\n                                }\n                            }\n                        } else {\n                            activeYData[activeCounter++] = y;\n                        }\n                    }\n                }\n\n                this.dataMin = arrayMin(activeYData);\n                this.dataMax = arrayMax(activeYData);\n            },\n\n            /**\n             * Translate data points from raw data values to chart specific positioning\n             * data needed later in drawPoints, drawGraph and drawTracker.\n             *\n             * @function #translate\n             * @memberOf Series\n             * @returns {void}\n             */\n            translate: function() {\n                if (!this.processedXData) { // hidden series\n                    this.processData();\n                }\n                this.generatePoints();\n                var series = this,\n                    options = series.options,\n                    stacking = options.stacking,\n                    xAxis = series.xAxis,\n                    categories = xAxis.categories,\n                    yAxis = series.yAxis,\n                    points = series.points,\n                    dataLength = points.length,\n                    hasModifyValue = !!series.modifyValue,\n                    i,\n                    pointPlacement = options.pointPlacement,\n                    dynamicallyPlaced =\n                    pointPlacement === 'between' ||\n                    isNumber(pointPlacement),\n                    threshold = options.threshold,\n                    stackThreshold = options.startFromThreshold ? threshold : 0,\n                    plotX,\n                    plotY,\n                    lastPlotX,\n                    stackIndicator,\n                    closestPointRangePx = Number.MAX_VALUE;\n\n                // Point placement is relative to each series pointRange (#5889)\n                if (pointPlacement === 'between') {\n                    pointPlacement = 0.5;\n                }\n                if (isNumber(pointPlacement)) {\n                    pointPlacement *= pick(options.pointRange || xAxis.pointRange);\n                }\n\n                // Translate each point\n                for (i = 0; i < dataLength; i++) {\n                    var point = points[i],\n                        xValue = point.x,\n                        yValue = point.y,\n                        yBottom = point.low,\n                        stack = stacking && yAxis.stacks[(\n                            series.negStacks &&\n                            yValue < (stackThreshold ? 0 : threshold) ? '-' : ''\n                        ) + series.stackKey],\n                        pointStack,\n                        stackValues;\n\n                    // Discard disallowed y values for log axes (#3434)\n                    if (yAxis.positiveValuesOnly && yValue !== null && yValue <= 0) {\n                        point.isNull = true;\n                    }\n\n                    // Get the plotX translation\n                    point.plotX = plotX = correctFloat( // #5236\n                        Math.min(Math.max(-1e5, xAxis.translate(\n                            xValue,\n                            0,\n                            0,\n                            0,\n                            1,\n                            pointPlacement,\n                            this.type === 'flags'\n                        )), 1e5) // #3923\n                    );\n\n                    // Calculate the bottom y value for stacked series\n                    if (\n                        stacking &&\n                        series.visible &&\n                        !point.isNull &&\n                        stack &&\n                        stack[xValue]\n                    ) {\n                        stackIndicator = series.getStackIndicator(\n                            stackIndicator,\n                            xValue,\n                            series.index\n                        );\n                        pointStack = stack[xValue];\n                        stackValues = pointStack.points[stackIndicator.key];\n                        yBottom = stackValues[0];\n                        yValue = stackValues[1];\n\n                        if (\n                            yBottom === stackThreshold &&\n                            stackIndicator.key === stack[xValue].base\n                        ) {\n                            yBottom = pick(threshold, yAxis.min);\n                        }\n                        if (yAxis.positiveValuesOnly && yBottom <= 0) { // #1200, #1232\n                            yBottom = null;\n                        }\n\n                        point.total = point.stackTotal = pointStack.total;\n                        point.percentage =\n                            pointStack.total &&\n                            (point.y / pointStack.total * 100);\n                        point.stackY = yValue;\n\n                        // Place the stack label\n                        pointStack.setOffset(\n                            series.pointXOffset || 0,\n                            series.barW || 0\n                        );\n\n                    }\n\n                    // Set translated yBottom or remove it\n                    point.yBottom = defined(yBottom) ?\n                        yAxis.translate(yBottom, 0, 1, 0, 1) :\n                        null;\n\n                    // general hook, used for Highstock compare mode\n                    if (hasModifyValue) {\n                        yValue = series.modifyValue(yValue, point);\n                    }\n\n                    // Set the the plotY value, reset it for redraws\n                    point.plotY = plotY =\n                        (typeof yValue === 'number' && yValue !== Infinity) ?\n                        Math.min(Math.max(-1e5,\n                            yAxis.translate(yValue, 0, 1, 0, 1)), 1e5) : // #3201\n                        undefined;\n\n                    point.isInside =\n                        plotY !== undefined &&\n                        plotY >= 0 &&\n                        plotY <= yAxis.len && // #3519\n                        plotX >= 0 &&\n                        plotX <= xAxis.len;\n\n\n                    // Set client related positions for mouse tracking\n                    point.clientX = dynamicallyPlaced ?\n                        correctFloat(\n                            xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement)\n                        ) :\n                        plotX; // #1514, #5383, #5518\n\n                    point.negative = point.y < (threshold || 0);\n\n                    // some API data\n                    point.category = categories && categories[point.x] !== undefined ?\n                        categories[point.x] : point.x;\n\n                    // Determine auto enabling of markers (#3635, #5099)\n                    if (!point.isNull) {\n                        if (lastPlotX !== undefined) {\n                            closestPointRangePx = Math.min(\n                                closestPointRangePx,\n                                Math.abs(plotX - lastPlotX)\n                            );\n                        }\n                        lastPlotX = plotX;\n                    }\n\n                    // Find point zone\n                    point.zone = this.zones.length && point.getZone();\n                }\n                series.closestPointRangePx = closestPointRangePx;\n            },\n\n            /**\n             * Return the series points with null points filtered out\n             */\n            getValidPoints: function(points, insideOnly) {\n                var chart = this.chart;\n                // #3916, #5029, #5085\n                return grep(points || this.points || [], function isValidPoint(point) {\n                    if (insideOnly && !chart.isInsidePlot(\n                            point.plotX,\n                            point.plotY,\n                            chart.inverted\n                        )) {\n                        return false;\n                    }\n                    return !point.isNull;\n                });\n            },\n\n            /**\n             * Set the clipping for the series. For animated series it is called twice,\n             * first to initiate animating the clip then the second time without the\n             * animation to set the final clip.\n             */\n            setClip: function(animation) {\n                var chart = this.chart,\n                    options = this.options,\n                    renderer = chart.renderer,\n                    inverted = chart.inverted,\n                    seriesClipBox = this.clipBox,\n                    clipBox = seriesClipBox || chart.clipBox,\n                    sharedClipKey =\n                    this.sharedClipKey || [\n                        '_sharedClip',\n                        animation && animation.duration,\n                        animation && animation.easing,\n                        clipBox.height,\n                        options.xAxis,\n                        options.yAxis\n                    ].join(','), // #4526\n                    clipRect = chart[sharedClipKey],\n                    markerClipRect = chart[sharedClipKey + 'm'];\n\n                // If a clipping rectangle with the same properties is currently present\n                // in the chart, use that.\n                if (!clipRect) {\n\n                    // When animation is set, prepare the initial positions\n                    if (animation) {\n                        clipBox.width = 0;\n\n                        chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(-99, // include the width of the first marker\n                            inverted ? -chart.plotLeft : -chart.plotTop,\n                            99,\n                            inverted ? chart.chartWidth : chart.chartHeight\n                        );\n                    }\n                    chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n                    // Create hashmap for series indexes\n                    clipRect.count = {\n                        length: 0\n                    };\n\n                }\n                if (animation) {\n                    if (!clipRect.count[this.index]) {\n                        clipRect.count[this.index] = true;\n                        clipRect.count.length += 1;\n                    }\n                }\n\n                if (options.clip !== false) {\n                    this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);\n                    this.markerGroup.clip(markerClipRect);\n                    this.sharedClipKey = sharedClipKey;\n                }\n\n                // Remove the shared clipping rectangle when all series are shown\n                if (!animation) {\n                    if (clipRect.count[this.index]) {\n                        delete clipRect.count[this.index];\n                        clipRect.count.length -= 1;\n                    }\n\n                    if (clipRect.count.length === 0 && sharedClipKey && chart[sharedClipKey]) {\n                        if (!seriesClipBox) {\n                            chart[sharedClipKey] = chart[sharedClipKey].destroy();\n                        }\n                        if (chart[sharedClipKey + 'm']) {\n                            chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();\n                        }\n                    }\n                }\n            },\n\n            /**\n             * Animate in the series\n             */\n            animate: function(init) {\n                var series = this,\n                    chart = series.chart,\n                    clipRect,\n                    animation = animObject(series.options.animation),\n                    sharedClipKey;\n\n                // Initialize the animation. Set up the clipping rectangle.\n                if (init) {\n\n                    series.setClip(animation);\n\n                    // Run the animation\n                } else {\n                    sharedClipKey = this.sharedClipKey;\n                    clipRect = chart[sharedClipKey];\n                    if (clipRect) {\n                        clipRect.animate({\n                            width: chart.plotSizeX\n                        }, animation);\n                    }\n                    if (chart[sharedClipKey + 'm']) {\n                        chart[sharedClipKey + 'm'].animate({\n                            width: chart.plotSizeX + 99\n                        }, animation);\n                    }\n\n                    // Delete this function to allow it only once\n                    series.animate = null;\n\n                }\n            },\n\n            /**\n             * This runs after animation to land on the final plot clipping\n             */\n            afterAnimate: function() {\n                this.setClip();\n                fireEvent(this, 'afterAnimate');\n            },\n\n            /**\n             * Draw the markers.\n             *\n             * @function #drawPoints\n             * @memberOf Series\n             * @returns {void}\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart,\n                    plotY,\n                    i,\n                    point,\n                    symbol,\n                    graphic,\n                    options = series.options,\n                    seriesMarkerOptions = options.marker,\n                    pointMarkerOptions,\n                    hasPointMarker,\n                    enabled,\n                    isInside,\n                    markerGroup = series[series.specialGroup] || series.markerGroup,\n                    xAxis = series.xAxis,\n                    markerAttribs,\n                    globallyEnabled = pick(\n                        seriesMarkerOptions.enabled,\n                        xAxis.isRadial ? true : null,\n                        // Use larger or equal as radius is null in bubbles (#6321)\n                        series.closestPointRangePx >= 2 * seriesMarkerOptions.radius\n                    );\n\n                if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {\n\n                    for (i = 0; i < points.length; i++) {\n                        point = points[i];\n                        plotY = point.plotY;\n                        graphic = point.graphic;\n                        pointMarkerOptions = point.marker || {};\n                        hasPointMarker = !!point.marker;\n                        enabled = (globallyEnabled && pointMarkerOptions.enabled === undefined) || pointMarkerOptions.enabled;\n                        isInside = point.isInside;\n\n                        // only draw the point if y is defined\n                        if (enabled && isNumber(plotY) && point.y !== null) {\n\n                            // Shortcuts\n                            symbol = pick(pointMarkerOptions.symbol, series.symbol);\n                            point.hasImage = symbol.indexOf('url') === 0;\n\n                            markerAttribs = series.markerAttribs(\n                                point,\n                                point.selected && 'select'\n                            );\n\n                            if (graphic) { // update\n                                graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled\n                                    .animate(markerAttribs);\n                            } else if (isInside && (markerAttribs.width > 0 || point.hasImage)) {\n                                point.graphic = graphic = chart.renderer.symbol(\n                                        symbol,\n                                        markerAttribs.x,\n                                        markerAttribs.y,\n                                        markerAttribs.width,\n                                        markerAttribs.height,\n                                        hasPointMarker ? pointMarkerOptions : seriesMarkerOptions\n                                    )\n                                    .add(markerGroup);\n                            }\n\n\n                            // Presentational attributes\n                            if (graphic) {\n                                graphic.attr(series.pointAttribs(point, point.selected && 'select'));\n                            }\n\n\n                            if (graphic) {\n                                graphic.addClass(point.getClassName(), true);\n                            }\n\n                        } else if (graphic) {\n                            point.graphic = graphic.destroy(); // #1269\n                        }\n                    }\n                }\n\n            },\n\n            /**\n             * Get non-presentational attributes for the point.\n             */\n            markerAttribs: function(point, state) {\n                var seriesMarkerOptions = this.options.marker,\n                    seriesStateOptions,\n                    pointMarkerOptions = point.marker || {},\n                    pointStateOptions,\n                    radius = pick(\n                        pointMarkerOptions.radius,\n                        seriesMarkerOptions.radius\n                    ),\n                    attribs;\n\n                // Handle hover and select states\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = pointMarkerOptions.states &&\n                        pointMarkerOptions.states[state];\n\n                    radius = pick(\n                        pointStateOptions && pointStateOptions.radius,\n                        seriesStateOptions && seriesStateOptions.radius,\n                        radius + (seriesStateOptions && seriesStateOptions.radiusPlus || 0)\n                    );\n                }\n\n                if (point.hasImage) {\n                    radius = 0; // and subsequently width and height is not set\n                }\n\n                attribs = {\n                    x: Math.floor(point.plotX) - radius, // Math.floor for #1843\n                    y: point.plotY - radius\n                };\n\n                if (radius) {\n                    attribs.width = attribs.height = 2 * radius;\n                }\n\n                return attribs;\n\n            },\n\n\n            /**\n             * Get presentational attributes for marker-based series (line, spline, scatter, bubble, mappoint...)\n             */\n            pointAttribs: function(point, state) {\n                var seriesMarkerOptions = this.options.marker,\n                    seriesStateOptions,\n                    pointOptions = point && point.options,\n                    pointMarkerOptions = (pointOptions && pointOptions.marker) || {},\n                    pointStateOptions,\n                    color = this.color,\n                    pointColorOption = pointOptions && pointOptions.color,\n                    pointColor = point && point.color,\n                    strokeWidth = pick(\n                        pointMarkerOptions.lineWidth,\n                        seriesMarkerOptions.lineWidth\n                    ),\n                    zoneColor = point && point.zone && point.zone.color,\n                    fill,\n                    stroke;\n\n                color = pointColorOption || zoneColor || pointColor || color;\n                fill = pointMarkerOptions.fillColor || seriesMarkerOptions.fillColor || color;\n                stroke = pointMarkerOptions.lineColor || seriesMarkerOptions.lineColor || color;\n\n                // Handle hover and select states\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = (pointMarkerOptions.states && pointMarkerOptions.states[state]) || {};\n                    strokeWidth = pick(\n                        pointStateOptions.lineWidth,\n                        seriesStateOptions.lineWidth,\n                        strokeWidth + pick(\n                            pointStateOptions.lineWidthPlus,\n                            seriesStateOptions.lineWidthPlus,\n                            0\n                        )\n                    );\n                    fill = pointStateOptions.fillColor || seriesStateOptions.fillColor || fill;\n                    stroke = pointStateOptions.lineColor || seriesStateOptions.lineColor || stroke;\n                }\n\n                return {\n                    'stroke': stroke,\n                    'stroke-width': strokeWidth,\n                    'fill': fill\n                };\n            },\n\n            /**\n             * Clear DOM objects and free up memory\n             */\n            destroy: function() {\n                var series = this,\n                    chart = series.chart,\n                    issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent),\n                    destroy,\n                    i,\n                    data = series.data || [],\n                    point,\n                    axis;\n\n                // add event hook\n                fireEvent(series, 'destroy');\n\n                // remove all events\n                removeEvent(series);\n\n                // erase from axes\n                each(series.axisTypes || [], function(AXIS) {\n                    axis = series[AXIS];\n                    if (axis && axis.series) {\n                        erase(axis.series, series);\n                        axis.isDirty = axis.forceRedraw = true;\n                    }\n                });\n\n                // remove legend items\n                if (series.legendItem) {\n                    series.chart.legend.destroyItem(series);\n                }\n\n                // destroy all points with their elements\n                i = data.length;\n                while (i--) {\n                    point = data[i];\n                    if (point && point.destroy) {\n                        point.destroy();\n                    }\n                }\n                series.points = null;\n\n                // Clear the animation timeout if we are destroying the series during initial animation\n                clearTimeout(series.animationTimeout);\n\n                // Destroy all SVGElements associated to the series\n                objectEach(series, function(val, prop) {\n                    if (val instanceof SVGElement && !val.survive) { // Survive provides a hook for not destroying\n\n                        // issue 134 workaround\n                        destroy = issue134 && prop === 'group' ?\n                            'hide' :\n                            'destroy';\n\n                        val[destroy]();\n                    }\n                });\n\n                // remove from hoverSeries\n                if (chart.hoverSeries === series) {\n                    chart.hoverSeries = null;\n                }\n                erase(chart.series, series);\n                chart.orderSeries();\n\n                // clear all members\n                objectEach(series, function(val, prop) {\n                    delete series[prop];\n                });\n            },\n\n            /**\n             * Get the graph path\n             */\n            getGraphPath: function(points, nullsAsZeroes, connectCliffs) {\n                var series = this,\n                    options = series.options,\n                    step = options.step,\n                    reversed,\n                    graphPath = [],\n                    xMap = [],\n                    gap;\n\n                points = points || series.points;\n\n                // Bottom of a stack is reversed\n                reversed = points.reversed;\n                if (reversed) {\n                    points.reverse();\n                }\n                // Reverse the steps (#5004)\n                step = {\n                    right: 1,\n                    center: 2\n                }[step] || (step && 3);\n                if (step && reversed) {\n                    step = 4 - step;\n                }\n\n                // Remove invalid points, especially in spline (#5015)\n                if (options.connectNulls && !nullsAsZeroes && !connectCliffs) {\n                    points = this.getValidPoints(points);\n                }\n\n                // Build the line\n                each(points, function(point, i) {\n\n                    var plotX = point.plotX,\n                        plotY = point.plotY,\n                        lastPoint = points[i - 1],\n                        pathToPoint; // the path to this point from the previous\n\n                    if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) && !connectCliffs) {\n                        gap = true; // ... and continue\n                    }\n\n                    // Line series, nullsAsZeroes is not handled\n                    if (point.isNull && !defined(nullsAsZeroes) && i > 0) {\n                        gap = !options.connectNulls;\n\n                        // Area series, nullsAsZeroes is set\n                    } else if (point.isNull && !nullsAsZeroes) {\n                        gap = true;\n\n                    } else {\n\n                        if (i === 0 || gap) {\n                            pathToPoint = ['M', point.plotX, point.plotY];\n\n                        } else if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object\n\n                            pathToPoint = series.getPointSpline(points, point, i);\n\n                        } else if (step) {\n\n                            if (step === 1) { // right\n                                pathToPoint = [\n                                    'L',\n                                    lastPoint.plotX,\n                                    plotY\n                                ];\n\n                            } else if (step === 2) { // center\n                                pathToPoint = [\n                                    'L',\n                                    (lastPoint.plotX + plotX) / 2,\n                                    lastPoint.plotY,\n                                    'L',\n                                    (lastPoint.plotX + plotX) / 2,\n                                    plotY\n                                ];\n\n                            } else {\n                                pathToPoint = [\n                                    'L',\n                                    plotX,\n                                    lastPoint.plotY\n                                ];\n                            }\n                            pathToPoint.push('L', plotX, plotY);\n\n                        } else {\n                            // normal line to next point\n                            pathToPoint = [\n                                'L',\n                                plotX,\n                                plotY\n                            ];\n                        }\n\n                        // Prepare for animation. When step is enabled, there are two path nodes for each x value.\n                        xMap.push(point.x);\n                        if (step) {\n                            xMap.push(point.x);\n                        }\n\n                        graphPath.push.apply(graphPath, pathToPoint);\n                        gap = false;\n                    }\n                });\n\n                graphPath.xMap = xMap;\n                series.graphPath = graphPath;\n\n                return graphPath;\n\n            },\n\n            /**\n             * Draw the actual graph\n             */\n            drawGraph: function() {\n                var series = this,\n                    options = this.options,\n                    graphPath = (this.gappedPath || this.getGraphPath).call(this),\n                    props = [\n                        [\n                            'graph',\n                            'highcharts-graph',\n\n                            options.lineColor || this.color,\n                            options.dashStyle\n\n                        ]\n                    ];\n\n                // Add the zone properties if any\n                each(this.zones, function(zone, i) {\n                    props.push([\n                        'zone-graph-' + i,\n                        'highcharts-graph highcharts-zone-graph-' + i + ' ' + (zone.className || ''),\n\n                        zone.color || series.color,\n                        zone.dashStyle || options.dashStyle\n\n                    ]);\n                });\n\n                // Draw the graph\n                each(props, function(prop, i) {\n                    var graphKey = prop[0],\n                        graph = series[graphKey],\n                        attribs;\n\n                    if (graph) {\n                        graph.endX = graphPath.xMap;\n                        graph.animate({\n                            d: graphPath\n                        });\n\n                    } else if (graphPath.length) { // #1487\n\n                        series[graphKey] = series.chart.renderer.path(graphPath)\n                            .addClass(prop[1])\n                            .attr({\n                                zIndex: 1\n                            }) // #1069\n                            .add(series.group);\n\n\n                        attribs = {\n                            'stroke': prop[2],\n                            'stroke-width': options.lineWidth,\n                            'fill': (series.fillGraph && series.color) || 'none' // Polygon series use filled graph\n                        };\n\n                        if (prop[3]) {\n                            attribs.dashstyle = prop[3];\n                        } else if (options.linecap !== 'square') {\n                            attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';\n                        }\n\n                        graph = series[graphKey]\n                            .attr(attribs)\n                            .shadow((i < 2) && options.shadow); // add shadow to normal series (0) or to first zone (1) #3932\n\n                    }\n\n                    // Helpers for animation\n                    if (graph) {\n                        graph.startX = graphPath.xMap;\n                        //graph.shiftUnit = options.step ? 2 : 1;\n                        graph.isArea = graphPath.isArea; // For arearange animation\n                    }\n                });\n            },\n\n            /**\n             * Clip the graphs into the positive and negative coloured graphs\n             */\n            applyZones: function() {\n                var series = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    zones = this.zones,\n                    translatedFrom,\n                    translatedTo,\n                    clips = this.clips || [],\n                    clipAttr,\n                    graph = this.graph,\n                    area = this.area,\n                    chartSizeMax = Math.max(chart.chartWidth, chart.chartHeight),\n                    axis = this[(this.zoneAxis || 'y') + 'Axis'],\n                    extremes,\n                    reversed,\n                    inverted = chart.inverted,\n                    horiz,\n                    pxRange,\n                    pxPosMin,\n                    pxPosMax,\n                    ignoreZones = false;\n\n                if (zones.length && (graph || area) && axis && axis.min !== undefined) {\n                    reversed = axis.reversed;\n                    horiz = axis.horiz;\n                    // The use of the Color Threshold assumes there are no gaps\n                    // so it is safe to hide the original graph and area\n                    if (graph) {\n                        graph.hide();\n                    }\n                    if (area) {\n                        area.hide();\n                    }\n\n                    // Create the clips\n                    extremes = axis.getExtremes();\n                    each(zones, function(threshold, i) {\n\n                        translatedFrom = reversed ?\n                            (horiz ? chart.plotWidth : 0) :\n                            (horiz ? 0 : axis.toPixels(extremes.min));\n                        translatedFrom = Math.min(Math.max(pick(translatedTo, translatedFrom), 0), chartSizeMax);\n                        translatedTo = Math.min(Math.max(Math.round(axis.toPixels(pick(threshold.value, extremes.max), true)), 0), chartSizeMax);\n\n                        if (ignoreZones) {\n                            translatedFrom = translatedTo = axis.toPixels(extremes.max);\n                        }\n\n                        pxRange = Math.abs(translatedFrom - translatedTo);\n                        pxPosMin = Math.min(translatedFrom, translatedTo);\n                        pxPosMax = Math.max(translatedFrom, translatedTo);\n                        if (axis.isXAxis) {\n                            clipAttr = {\n                                x: inverted ? pxPosMax : pxPosMin,\n                                y: 0,\n                                width: pxRange,\n                                height: chartSizeMax\n                            };\n                            if (!horiz) {\n                                clipAttr.x = chart.plotHeight - clipAttr.x;\n                            }\n                        } else {\n                            clipAttr = {\n                                x: 0,\n                                y: inverted ? pxPosMax : pxPosMin,\n                                width: chartSizeMax,\n                                height: pxRange\n                            };\n                            if (horiz) {\n                                clipAttr.y = chart.plotWidth - clipAttr.y;\n                            }\n                        }\n\n\n                        /// VML SUPPPORT\n                        if (inverted && renderer.isVML) {\n                            if (axis.isXAxis) {\n                                clipAttr = {\n                                    x: 0,\n                                    y: reversed ? pxPosMin : pxPosMax,\n                                    height: clipAttr.width,\n                                    width: chart.chartWidth\n                                };\n                            } else {\n                                clipAttr = {\n                                    x: clipAttr.y - chart.plotLeft - chart.spacingBox.x,\n                                    y: 0,\n                                    width: clipAttr.height,\n                                    height: chart.chartHeight\n                                };\n                            }\n                        }\n                        /// END OF VML SUPPORT\n\n\n                        if (clips[i]) {\n                            clips[i].animate(clipAttr);\n                        } else {\n                            clips[i] = renderer.clipRect(clipAttr);\n\n                            if (graph) {\n                                series['zone-graph-' + i].clip(clips[i]);\n                            }\n\n                            if (area) {\n                                series['zone-area-' + i].clip(clips[i]);\n                            }\n                        }\n                        // if this zone extends out of the axis, ignore the others\n                        ignoreZones = threshold.value > extremes.max;\n                    });\n                    this.clips = clips;\n                }\n            },\n\n            /**\n             * Initialize and perform group inversion on series.group and series.markerGroup\n             */\n            invertGroups: function(inverted) {\n                var series = this,\n                    chart = series.chart,\n                    remover;\n\n                function setInvert() {\n                    each(['group', 'markerGroup'], function(groupName) {\n                        if (series[groupName]) {\n\n                            // VML/HTML needs explicit attributes for flipping\n                            if (chart.renderer.isVML) {\n                                series[groupName].attr({\n                                    width: series.yAxis.len,\n                                    height: series.xAxis.len\n                                });\n                            }\n\n                            series[groupName].width = series.yAxis.len;\n                            series[groupName].height = series.xAxis.len;\n                            series[groupName].invert(inverted);\n                        }\n                    });\n                }\n\n                // Pie, go away (#1736)\n                if (!series.xAxis) {\n                    return;\n                }\n\n                // A fixed size is needed for inversion to work\n                remover = addEvent(chart, 'resize', setInvert);\n                addEvent(series, 'destroy', remover);\n\n                // Do it now\n                setInvert(inverted); // do it now\n\n                // On subsequent render and redraw, just do setInvert without setting up events again\n                series.invertGroups = setInvert;\n            },\n\n            /**\n             * General abstraction for creating plot groups like series.group,\n             * series.dataLabelsGroup and series.markerGroup. On subsequent calls, the\n             * group will only be adjusted to the updated plot size.\n             */\n            plotGroup: function(prop, name, visibility, zIndex, parent) {\n                var group = this[prop],\n                    isNew = !group;\n\n                // Generate it on first call\n                if (isNew) {\n                    this[prop] = group = this.chart.renderer.g()\n                        .attr({\n                            zIndex: zIndex || 0.1 // IE8 and pointer logic use this\n                        })\n                        .add(parent);\n\n                }\n\n                // Add the class names, and replace existing ones as response to\n                // Series.update (#6660)\n                group.addClass(\n                    (\n                        'highcharts-' + name +\n                        ' highcharts-series-' + this.index +\n                        ' highcharts-' + this.type + '-series ' +\n                        'highcharts-color-' + this.colorIndex + ' ' +\n                        (this.options.className || '')\n                    ),\n                    true\n                );\n\n                // Place it on first and subsequent (redraw) calls\n                group.attr({\n                    visibility: visibility\n                })[isNew ? 'attr' : 'animate'](\n                    this.getPlotBox()\n                );\n                return group;\n            },\n\n            /**\n             * Get the translation and scale for the plot area of this series\n             */\n            getPlotBox: function() {\n                var chart = this.chart,\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis;\n\n                // Swap axes for inverted (#2339)\n                if (chart.inverted) {\n                    xAxis = yAxis;\n                    yAxis = this.xAxis;\n                }\n                return {\n                    translateX: xAxis ? xAxis.left : chart.plotLeft,\n                    translateY: yAxis ? yAxis.top : chart.plotTop,\n                    scaleX: 1, // #1623\n                    scaleY: 1\n                };\n            },\n\n            /**\n             * Render the graph and markers\n             */\n            render: function() {\n                var series = this,\n                    chart = series.chart,\n                    group,\n                    options = series.options,\n                    // Animation doesn't work in IE8 quirks when the group div is\n                    // hidden, and looks bad in other oldIE\n                    animDuration = (!!series.animate &&\n                        chart.renderer.isSVG &&\n                        animObject(options.animation).duration\n                    ),\n                    visibility = series.visible ? 'inherit' : 'hidden', // #2597\n                    zIndex = options.zIndex,\n                    hasRendered = series.hasRendered,\n                    chartSeriesGroup = chart.seriesGroup,\n                    inverted = chart.inverted;\n\n                // the group\n                group = series.plotGroup(\n                    'group',\n                    'series',\n                    visibility,\n                    zIndex,\n                    chartSeriesGroup\n                );\n\n                series.markerGroup = series.plotGroup(\n                    'markerGroup',\n                    'markers',\n                    visibility,\n                    zIndex,\n                    chartSeriesGroup\n                );\n\n                // initiate the animation\n                if (animDuration) {\n                    series.animate(true);\n                }\n\n                // SVGRenderer needs to know this before drawing elements (#1089, #1795)\n                group.inverted = series.isCartesian ? inverted : false;\n\n                // draw the graph if any\n                if (series.drawGraph) {\n                    series.drawGraph();\n                    series.applyZones();\n                }\n\n                /*\t\teach(series.points, function (point) {\n                \t\t\tif (point.redraw) {\n                \t\t\t\tpoint.redraw();\n                \t\t\t}\n                \t\t});*/\n\n                // draw the data labels (inn pies they go before the points)\n                if (series.drawDataLabels) {\n                    series.drawDataLabels();\n                }\n\n                // draw the points\n                if (series.visible) {\n                    series.drawPoints();\n                }\n\n\n                // draw the mouse tracking area\n                if (\n                    series.drawTracker &&\n                    series.options.enableMouseTracking !== false\n                ) {\n                    series.drawTracker();\n                }\n\n                // Handle inverted series and tracker groups\n                series.invertGroups(inverted);\n\n                // Initial clipping, must be defined after inverting groups for VML.\n                // Applies to columns etc. (#3839).\n                if (options.clip !== false && !series.sharedClipKey && !hasRendered) {\n                    group.clip(chart.clipRect);\n                }\n\n                // Run the animation\n                if (animDuration) {\n                    series.animate();\n                }\n\n                // Call the afterAnimate function on animation complete (but don't\n                // overwrite the animation.complete option which should be available to\n                // the user).\n                if (!hasRendered) {\n                    series.animationTimeout = syncTimeout(function() {\n                        series.afterAnimate();\n                    }, animDuration);\n                }\n\n                series.isDirty = false; // means data is in accordance with what you see\n                // (See #322) series.isDirty = series.isDirtyData = false; // means\n                // data is in accordance with what you see\n                series.hasRendered = true;\n            },\n\n            /**\n             * Redraw the series after an update in the axes.\n             */\n            redraw: function() {\n                var series = this,\n                    chart = series.chart,\n                    // cache it here as it is set to false in render, but used after\n                    wasDirty = series.isDirty || series.isDirtyData,\n                    group = series.group,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n\n                // reposition on resize\n                if (group) {\n                    if (chart.inverted) {\n                        group.attr({\n                            width: chart.plotWidth,\n                            height: chart.plotHeight\n                        });\n                    }\n\n                    group.animate({\n                        translateX: pick(xAxis && xAxis.left, chart.plotLeft),\n                        translateY: pick(yAxis && yAxis.top, chart.plotTop)\n                    });\n                }\n\n                series.translate();\n                series.render();\n                if (wasDirty) { // #3868, #3945\n                    delete this.kdTree;\n                }\n            },\n\n            /**\n             * KD Tree && PointSearching Implementation\n             */\n\n            kdAxisArray: ['clientX', 'plotY'],\n\n            searchPoint: function(e, compareX) {\n                var series = this,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    inverted = series.chart.inverted;\n\n                return this.searchKDTree({\n                    clientX: inverted ?\n                        xAxis.len - e.chartY + xAxis.pos : e.chartX - xAxis.pos,\n                    plotY: inverted ?\n                        yAxis.len - e.chartX + yAxis.pos : e.chartY - yAxis.pos\n                }, compareX);\n            },\n\n            /**\n             * Build the k-d-tree that is used by mouse and touch interaction to get the\n             * closest point. Line-like series typically have a one-dimensional tree \n             * where points are searched along the X axis, while scatter-like series\n             * typically search in two dimensions, X and Y.\n             */\n            buildKDTree: function() {\n\n                // Prevent multiple k-d-trees from being built simultaneously (#6235)\n                this.buildingKdTree = true;\n\n                var series = this,\n                    dimensions = series.options.findNearestPointBy.indexOf('y') > -1 ?\n                    2 : 1;\n\n                // Internal function\n                function _kdtree(points, depth, dimensions) {\n                    var axis,\n                        median,\n                        length = points && points.length;\n\n                    if (length) {\n\n                        // alternate between the axis\n                        axis = series.kdAxisArray[depth % dimensions];\n\n                        // sort point array\n                        points.sort(function(a, b) {\n                            return a[axis] - b[axis];\n                        });\n\n                        median = Math.floor(length / 2);\n\n                        // build and return nod\n                        return {\n                            point: points[median],\n                            left: _kdtree(\n                                points.slice(0, median), depth + 1, dimensions\n                            ),\n                            right: _kdtree(\n                                points.slice(median + 1), depth + 1, dimensions\n                            )\n                        };\n\n                    }\n                }\n\n                // Start the recursive build process with a clone of the points array\n                // and null points filtered out (#3873)\n                function startRecursive() {\n                    series.kdTree = _kdtree(\n                        series.getValidPoints(\n                            null,\n                            // For line-type series restrict to plot area, but\n                            // column-type series not (#3916, #4511)\n                            !series.directTouch\n                        ),\n                        dimensions,\n                        dimensions\n                    );\n                    series.buildingKdTree = false;\n                }\n                delete series.kdTree;\n\n                // For testing tooltips, don't build async\n                syncTimeout(startRecursive, series.options.kdNow ? 0 : 1);\n            },\n\n            searchKDTree: function(point, compareX) {\n                var series = this,\n                    kdX = this.kdAxisArray[0],\n                    kdY = this.kdAxisArray[1],\n                    kdComparer = compareX ? 'distX' : 'dist',\n                    kdDimensions = series.options.findNearestPointBy.indexOf('y') > -1 ?\n                    2 : 1;\n\n                // Set the one and two dimensional distance on the point object\n                function setDistance(p1, p2) {\n                    var x = (defined(p1[kdX]) && defined(p2[kdX])) ?\n                        Math.pow(p1[kdX] - p2[kdX], 2) :\n                        null,\n                        y = (defined(p1[kdY]) && defined(p2[kdY])) ?\n                        Math.pow(p1[kdY] - p2[kdY], 2) :\n                        null,\n                        r = (x || 0) + (y || 0);\n\n                    p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;\n                    p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;\n                }\n\n                function _search(search, tree, depth, dimensions) {\n                    var point = tree.point,\n                        axis = series.kdAxisArray[depth % dimensions],\n                        tdist,\n                        sideA,\n                        sideB,\n                        ret = point,\n                        nPoint1,\n                        nPoint2;\n\n                    setDistance(search, point);\n\n                    // Pick side based on distance to splitting point\n                    tdist = search[axis] - point[axis];\n                    sideA = tdist < 0 ? 'left' : 'right';\n                    sideB = tdist < 0 ? 'right' : 'left';\n\n                    // End of tree\n                    if (tree[sideA]) {\n                        nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);\n\n                        ret = (nPoint1[kdComparer] < ret[kdComparer] ? nPoint1 : point);\n                    }\n                    if (tree[sideB]) {\n                        // compare distance to current best to splitting point to decide\n                        // wether to check side B or not\n                        if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n                            nPoint2 = _search(\n                                search,\n                                tree[sideB],\n                                depth + 1,\n                                dimensions\n                            );\n                            ret = nPoint2[kdComparer] < ret[kdComparer] ?\n                                nPoint2 :\n                                ret;\n                        }\n                    }\n\n                    return ret;\n                }\n\n                if (!this.kdTree && !this.buildingKdTree) {\n                    this.buildKDTree();\n                }\n\n                if (this.kdTree) {\n                    return _search(point, this.kdTree, kdDimensions, kdDimensions);\n                }\n            }\n\n        }); // end Series prototype\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            Chart = H.Chart,\n            correctFloat = H.correctFloat,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            each = H.each,\n            format = H.format,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            Series = H.Series;\n\n        /**\n         * The class for stacks. Each stack, on a specific X value and either negative\n         * or positive, has its own stack item.\n         *\n         * @class\n         */\n        function StackItem(axis, options, isNegative, x, stackOption) {\n\n            var inverted = axis.chart.inverted;\n\n            this.axis = axis;\n\n            // Tells if the stack is negative\n            this.isNegative = isNegative;\n\n            // Save the options to be able to style the label\n            this.options = options;\n\n            // Save the x value to be able to position the label later\n            this.x = x;\n\n            // Initialize total value\n            this.total = null;\n\n            // This will keep each points' extremes stored by series.index and point \n            // index\n            this.points = {};\n\n            // Save the stack option on the series configuration object, and whether to \n            // treat it as percent\n            this.stack = stackOption;\n            this.leftCliff = 0;\n            this.rightCliff = 0;\n\n            // The align options and text align varies on whether the stack is negative \n            // and if the chart is inverted or not.\n            // First test the user supplied value, then use the dynamic.\n            this.alignOptions = {\n                align: options.align ||\n                    (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n                verticalAlign: options.verticalAlign ||\n                    (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n                y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),\n                x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)\n            };\n\n            this.textAlign = options.textAlign ||\n                (inverted ? (isNegative ? 'right' : 'left') : 'center');\n        }\n\n        StackItem.prototype = {\n            destroy: function() {\n                destroyObjectProperties(this, this.axis);\n            },\n\n            /**\n             * Renders the stack total label and adds it to the stack label group.\n             */\n            render: function(group) {\n                var options = this.options,\n                    formatOption = options.format,\n                    str = formatOption ?\n                    format(formatOption, this) :\n                    options.formatter.call(this); // format the text in the label\n\n                // Change the text to reflect the new total and set visibility to hidden\n                // in case the serie is hidden\n                if (this.label) {\n                    this.label.attr({\n                        text: str,\n                        visibility: 'hidden'\n                    });\n                    // Create new label\n                } else {\n                    this.label =\n                        this.axis.chart.renderer.text(str, null, null, options.useHTML)\n                        .css(options.style)\n                        .attr({\n                            align: this.textAlign,\n                            rotation: options.rotation,\n                            visibility: 'hidden' // hidden until setOffset is called\n                        })\n                        .add(group); // add to the labels-group\n                }\n            },\n\n            /**\n             * Sets the offset that the stack has from the x value and repositions the\n             * label.\n             */\n            setOffset: function(xOffset, xWidth) {\n                var stackItem = this,\n                    axis = stackItem.axis,\n                    chart = axis.chart,\n                    inverted = chart.inverted,\n                    reversed = axis.reversed,\n                    neg = (this.isNegative && !reversed) ||\n                    (!this.isNegative && reversed), // #4056\n                    // stack value translated mapped to chart coordinates\n                    y = axis.translate(\n                        axis.usePercentage ? 100 : this.total,\n                        0,\n                        0,\n                        0,\n                        1\n                    ),\n                    yZero = axis.translate(0), // stack origin\n                    h = Math.abs(y - yZero), // stack height\n                    x = chart.xAxis[0].translate(this.x) + xOffset, // stack x position\n                    plotHeight = chart.plotHeight,\n                    stackBox = { // this is the box for the complete stack\n                        x: inverted ? (neg ? y : y - h) : x,\n                        y: inverted ?\n                            plotHeight - x - xWidth : (neg ? (plotHeight - y - h) :\n                                plotHeight - y),\n                        width: inverted ? h : xWidth,\n                        height: inverted ? xWidth : h\n                    },\n                    label = this.label,\n                    alignAttr;\n\n                if (label) {\n                    // Align the label to the box\n                    label.align(this.alignOptions, null, stackBox);\n\n                    // Set visibility (#678)\n                    alignAttr = label.alignAttr;\n                    label[\n                        this.options.crop === false || chart.isInsidePlot(\n                            alignAttr.x,\n                            alignAttr.y\n                        ) ? 'show' : 'hide'](true);\n                }\n            }\n        };\n\n        /**\n         * Generate stacks for each series and calculate stacks total values\n         */\n        Chart.prototype.getStacks = function() {\n            var chart = this;\n\n            // reset stacks for each yAxis\n            each(chart.yAxis, function(axis) {\n                if (axis.stacks && axis.hasVisibleSeries) {\n                    axis.oldStacks = axis.stacks;\n                }\n            });\n\n            each(chart.series, function(series) {\n                if (series.options.stacking && (series.visible === true ||\n                        chart.options.chart.ignoreHiddenSeries === false)) {\n                    series.stackKey = series.type + pick(series.options.stack, '');\n                }\n            });\n        };\n\n\n        // Stacking methods defined on the Axis prototype\n\n        /**\n         * Build the stacks from top down\n         */\n        Axis.prototype.buildStacks = function() {\n            var axisSeries = this.series,\n                series,\n                reversedStacks = pick(this.options.reversedStacks, true),\n                len = axisSeries.length,\n                i;\n            if (!this.isXAxis) {\n                this.usePercentage = false;\n                i = len;\n                while (i--) {\n                    axisSeries[reversedStacks ? i : len - i - 1].setStackedPoints();\n                }\n\n                i = len;\n                while (i--) {\n                    series = axisSeries[reversedStacks ? i : len - i - 1];\n                    if (series.setStackCliffs) {\n                        series.setStackCliffs();\n                    }\n                }\n                // Loop up again to compute percent stack\n                if (this.usePercentage) {\n                    for (i = 0; i < len; i++) {\n                        axisSeries[i].setPercentStacks();\n                    }\n                }\n            }\n        };\n\n        Axis.prototype.renderStackTotals = function() {\n            var axis = this,\n                chart = axis.chart,\n                renderer = chart.renderer,\n                stacks = axis.stacks,\n                stackTotalGroup = axis.stackTotalGroup;\n\n            // Create a separate group for the stack total labels\n            if (!stackTotalGroup) {\n                axis.stackTotalGroup = stackTotalGroup =\n                    renderer.g('stack-labels')\n                    .attr({\n                        visibility: 'visible',\n                        zIndex: 6\n                    })\n                    .add();\n            }\n\n            // plotLeft/Top will change when y axis gets wider so we need to translate\n            // the stackTotalGroup at every render call. See bug #506 and #516\n            stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n\n            // Render each stack total\n            objectEach(stacks, function(type) {\n                objectEach(type, function(stack) {\n                    stack.render(stackTotalGroup);\n                });\n            });\n        };\n\n        /**\n         * Set all the stacks to initial states and destroy unused ones.\n         */\n        Axis.prototype.resetStacks = function() {\n            var axis = this,\n                stacks = axis.stacks;\n            if (!axis.isXAxis) {\n                objectEach(stacks, function(type) {\n                    objectEach(type, function(stack, key) {\n                        // Clean up memory after point deletion (#1044, #4320)\n                        if (stack.touched < axis.stacksTouched) {\n                            stack.destroy();\n                            delete type[key];\n\n                            // Reset stacks\n                        } else {\n                            stack.total = null;\n                            stack.cum = null;\n                        }\n                    });\n                });\n            }\n        };\n\n        Axis.prototype.cleanStacks = function() {\n            var stacks;\n\n            if (!this.isXAxis) {\n                if (this.oldStacks) {\n                    stacks = this.stacks = this.oldStacks;\n                }\n\n                // reset stacks\n                objectEach(stacks, function(type) {\n                    objectEach(type, function(stack) {\n                        stack.cum = stack.total;\n                    });\n                });\n            }\n        };\n\n\n        // Stacking methods defnied for Series prototype\n\n        /**\n         * Adds series' points value to corresponding stack\n         */\n        Series.prototype.setStackedPoints = function() {\n            if (!this.options.stacking || (this.visible !== true &&\n                    this.chart.options.chart.ignoreHiddenSeries !== false)) {\n                return;\n            }\n\n            var series = this,\n                xData = series.processedXData,\n                yData = series.processedYData,\n                stackedYData = [],\n                yDataLength = yData.length,\n                seriesOptions = series.options,\n                threshold = seriesOptions.threshold,\n                stackThreshold = seriesOptions.startFromThreshold ? threshold : 0,\n                stackOption = seriesOptions.stack,\n                stacking = seriesOptions.stacking,\n                stackKey = series.stackKey,\n                negKey = '-' + stackKey,\n                negStacks = series.negStacks,\n                yAxis = series.yAxis,\n                stacks = yAxis.stacks,\n                oldStacks = yAxis.oldStacks,\n                stackIndicator,\n                isNegative,\n                stack,\n                other,\n                key,\n                pointKey,\n                i,\n                x,\n                y;\n\n\n            yAxis.stacksTouched += 1;\n\n            // loop over the non-null y values and read them into a local array\n            for (i = 0; i < yDataLength; i++) {\n                x = xData[i];\n                y = yData[i];\n                stackIndicator = series.getStackIndicator(\n                    stackIndicator,\n                    x,\n                    series.index\n                );\n                pointKey = stackIndicator.key;\n                // Read stacked values into a stack based on the x value,\n                // the sign of y and the stack key. Stacking is also handled for null\n                // values (#739)\n                isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n                key = isNegative ? negKey : stackKey;\n\n                // Create empty object for this stack if it doesn't exist yet\n                if (!stacks[key]) {\n                    stacks[key] = {};\n                }\n\n                // Initialize StackItem for this x\n                if (!stacks[key][x]) {\n                    if (oldStacks[key] && oldStacks[key][x]) {\n                        stacks[key][x] = oldStacks[key][x];\n                        stacks[key][x].total = null;\n                    } else {\n                        stacks[key][x] = new StackItem(\n                            yAxis,\n                            yAxis.options.stackLabels,\n                            isNegative,\n                            x,\n                            stackOption\n                        );\n                    }\n                }\n\n                // If the StackItem doesn't exist, create it first\n                stack = stacks[key][x];\n                if (y !== null) {\n                    stack.points[pointKey] = stack.points[series.index] = [pick(stack.cum, stackThreshold)];\n\n                    // Record the base of the stack\n                    if (!defined(stack.cum)) {\n                        stack.base = pointKey;\n                    }\n                    stack.touched = yAxis.stacksTouched;\n\n\n                    // In area charts, if there are multiple points on the same X value,\n                    // let the area fill the full span of those points\n                    if (stackIndicator.index > 0 && series.singleStacks === false) {\n                        stack.points[pointKey][0] =\n                            stack.points[series.index + ',' + x + ',0'][0];\n                    }\n                }\n\n                // Add value to the stack total\n                if (stacking === 'percent') {\n\n                    // Percent stacked column, totals are the same for the positive and\n                    // negative stacks\n                    other = isNegative ? stackKey : negKey;\n                    if (negStacks && stacks[other] && stacks[other][x]) {\n                        other = stacks[other][x];\n                        stack.total = other.total =\n                            Math.max(other.total, stack.total) + Math.abs(y) || 0;\n\n                        // Percent stacked areas\n                    } else {\n                        stack.total = correctFloat(stack.total + (Math.abs(y) || 0));\n                    }\n                } else {\n                    stack.total = correctFloat(stack.total + (y || 0));\n                }\n\n                stack.cum = pick(stack.cum, stackThreshold) + (y || 0);\n\n                if (y !== null) {\n                    stack.points[pointKey].push(stack.cum);\n                    stackedYData[i] = stack.cum;\n                }\n\n            }\n\n            if (stacking === 'percent') {\n                yAxis.usePercentage = true;\n            }\n\n            this.stackedYData = stackedYData; // To be used in getExtremes\n\n            // Reset old stacks\n            yAxis.oldStacks = {};\n        };\n\n        /**\n         * Iterate over all stacks and compute the absolute values to percent\n         */\n        Series.prototype.setPercentStacks = function() {\n            var series = this,\n                stackKey = series.stackKey,\n                stacks = series.yAxis.stacks,\n                processedXData = series.processedXData,\n                stackIndicator;\n\n            each([stackKey, '-' + stackKey], function(key) {\n                var i = processedXData.length,\n                    x,\n                    stack,\n                    pointExtremes,\n                    totalFactor;\n\n                while (i--) {\n                    x = processedXData[i];\n                    stackIndicator = series.getStackIndicator(\n                        stackIndicator,\n                        x,\n                        series.index,\n                        key\n                    );\n                    stack = stacks[key] && stacks[key][x];\n                    pointExtremes = stack && stack.points[stackIndicator.key];\n                    if (pointExtremes) {\n                        totalFactor = stack.total ? 100 / stack.total : 0;\n                        // Y bottom value\n                        pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor);\n                        // Y value\n                        pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor);\n                        series.stackedYData[i] = pointExtremes[1];\n                    }\n                }\n            });\n        };\n\n        /**\n         * Get stack indicator, according to it's x-value, to determine points with the\n         * same x-value\n         */\n        Series.prototype.getStackIndicator = function(stackIndicator, x, index, key) {\n            // Update stack indicator, when:\n            // first point in a stack || x changed || stack type (negative vs positive)\n            // changed:\n            if (!defined(stackIndicator) || stackIndicator.x !== x ||\n                (key && stackIndicator.key !== key)) {\n                stackIndicator = {\n                    x: x,\n                    index: 0,\n                    key: key\n                };\n            } else {\n                stackIndicator.index++;\n            }\n\n            stackIndicator.key = [index, x, stackIndicator.index].join(',');\n\n            return stackIndicator;\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            animate = H.animate,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            createElement = H.createElement,\n            css = H.css,\n            defined = H.defined,\n            each = H.each,\n            erase = H.erase,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            inArray = H.inArray,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            isArray = H.isArray,\n            merge = H.merge,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            setAnimation = H.setAnimation,\n            splat = H.splat;\n\n        // Extend the Chart prototype for dynamic methods\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n            /**\n             * Add a series to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initiated, add the series as a configuration\n             * option instead. With multiple axes, the `offset` is dynamically adjusted.\n             *\n             * @param  {SeriesOptions} options\n             *         The config options for the series.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after adding.\n             * @param  {AnimationOptions} animation\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @return {Highcharts.Series}\n             *         The newly created series object.\n             *\n             * @sample highcharts/members/chart-addseries/\n             *         Add a series from a button\n             * @sample stock/members/chart-addseries/\n             *         Add a series in Highstock\n             */\n            addSeries: function(options, redraw, animation) {\n                var series,\n                    chart = this;\n\n                if (options) {\n                    redraw = pick(redraw, true); // defaults to true\n\n                    fireEvent(chart, 'addSeries', {\n                        options: options\n                    }, function() {\n                        series = chart.initSeries(options);\n\n                        chart.isDirtyLegend = true; // the series array is out of sync with the display\n                        chart.linkSeries();\n                        if (redraw) {\n                            chart.redraw(animation);\n                        }\n                    });\n                }\n\n                return series;\n            },\n\n            /**\n             * Add an axis to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initiated, add the axis as a configuration\n             * option instead.\n             * @param  {AxisOptions} options\n             *         The axis options.\n             * @param  {Boolean} [isX=false]\n             *         Whether it is an X axis or a value axis.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after adding.\n             * @param  {AnimationOptions} [animation=true]\n             *         Whether and how to apply animation in the redraw.\n             *\n             * @sample highcharts/members/chart-addaxis/ Add and remove axes\n             */\n            addAxis: function(options, isX, redraw, animation) {\n                var key = isX ? 'xAxis' : 'yAxis',\n                    chartOptions = this.options,\n                    userOptions = merge(options, {\n                        index: this[key].length,\n                        isX: isX\n                    });\n\n                new Axis(this, userOptions); // eslint-disable-line no-new\n\n                // Push the new axis options to the chart options\n                chartOptions[key] = splat(chartOptions[key] || {});\n                chartOptions[key].push(userOptions);\n\n                if (pick(redraw, true)) {\n                    this.redraw(animation);\n                }\n            },\n\n            /**\n             * Dim the chart and show a loading text or symbol. Options for the loading\n             * screen are defined in {@link\n             * https://api.highcharts.com/highcharts/loading|the loading options}.\n             * \n             * @param  {String} str\n             *         An optional text to show in the loading label instead of the\n             *         default one. The default text is set in {@link\n             *         http://api.highcharts.com/highcharts/lang.loading|lang.loading}.\n             *\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample highcharts/members/chart-showloading/\n             *         Apply different text labels\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             */\n            showLoading: function(str) {\n                var chart = this,\n                    options = chart.options,\n                    loadingDiv = chart.loadingDiv,\n                    loadingOptions = options.loading,\n                    setLoadingSize = function() {\n                        if (loadingDiv) {\n                            css(loadingDiv, {\n                                left: chart.plotLeft + 'px',\n                                top: chart.plotTop + 'px',\n                                width: chart.plotWidth + 'px',\n                                height: chart.plotHeight + 'px'\n                            });\n                        }\n                    };\n\n                // create the layer at the first call\n                if (!loadingDiv) {\n                    chart.loadingDiv = loadingDiv = createElement('div', {\n                        className: 'highcharts-loading highcharts-loading-hidden'\n                    }, null, chart.container);\n\n                    chart.loadingSpan = createElement(\n                        'span', {\n                            className: 'highcharts-loading-inner'\n                        },\n                        null,\n                        loadingDiv\n                    );\n                    addEvent(chart, 'redraw', setLoadingSize); // #1080\n                }\n\n                loadingDiv.className = 'highcharts-loading';\n\n                // Update text\n                chart.loadingSpan.innerHTML = str || options.lang.loading;\n\n\n                // Update visuals\n                css(loadingDiv, extend(loadingOptions.style, {\n                    zIndex: 10\n                }));\n                css(chart.loadingSpan, loadingOptions.labelStyle);\n\n                // Show it\n                if (!chart.loadingShown) {\n                    css(loadingDiv, {\n                        opacity: 0,\n                        display: ''\n                    });\n                    animate(loadingDiv, {\n                        opacity: loadingOptions.style.opacity || 0.5\n                    }, {\n                        duration: loadingOptions.showDuration || 0\n                    });\n                }\n\n\n                chart.loadingShown = true;\n                setLoadingSize();\n            },\n\n            /**\n             * Hide the loading layer.\n             *\n             * @see    Highcharts.Chart#showLoading\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             */\n            hideLoading: function() {\n                var options = this.options,\n                    loadingDiv = this.loadingDiv;\n\n                if (loadingDiv) {\n                    loadingDiv.className = 'highcharts-loading highcharts-loading-hidden';\n\n                    animate(loadingDiv, {\n                        opacity: 0\n                    }, {\n                        duration: options.loading.hideDuration || 100,\n                        complete: function() {\n                            css(loadingDiv, {\n                                display: 'none'\n                            });\n                        }\n                    });\n\n                }\n                this.loadingShown = false;\n            },\n\n            /** \n             * These properties cause isDirtyBox to be set to true when updating. Can be extended from plugins.\n             */\n            propsRequireDirtyBox: ['backgroundColor', 'borderColor', 'borderWidth', 'margin', 'marginTop', 'marginRight',\n                'marginBottom', 'marginLeft', 'spacing', 'spacingTop', 'spacingRight', 'spacingBottom', 'spacingLeft',\n                'borderRadius', 'plotBackgroundColor', 'plotBackgroundImage', 'plotBorderColor', 'plotBorderWidth',\n                'plotShadow', 'shadow'\n            ],\n\n            /** \n             * These properties cause all series to be updated when updating. Can be\n             * extended from plugins.\n             */\n            propsRequireUpdateSeries: ['chart.inverted', 'chart.polar',\n                'chart.ignoreHiddenSeries', 'chart.type', 'colors', 'plotOptions',\n                'tooltip'\n            ],\n\n            /**\n             * A generic function to update any element of the chart. Elements can be\n             * enabled and disabled, moved, re-styled, re-formatted etc.\n             *\n             * A special case is configuration objects that take arrays, for example\n             * {@link https://api.highcharts.com/highcharts/xAxis|xAxis}, \n             * {@link https://api.highcharts.com/highcharts/yAxis|yAxis} or \n             * {@link https://api.highcharts.com/highcharts/series|series}. For these\n             * collections, an `id` option is used to map the new option set to an\n             * existing object. If an existing object of the same id is not found, the\n             * corresponding item is updated. So for example, running `chart.update`\n             * with a series item without an id, will cause the existing chart's series\n             * with the same index in the series array to be updated.\n             *\n             * See also the {@link https://api.highcharts.com/highcharts/responsive|\n             * responsive option set}. Switching between `responsive.rules` basically\n             * runs `chart.update` under the hood.\n             *\n             * @param  {Options} options\n             *         A configuration object for the new chart options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart.\n             *\n             * @sample highcharts/members/chart-update/\n             *         Update chart geometry \n             */\n            update: function(options, redraw) {\n                var chart = this,\n                    adders = {\n                        credits: 'addCredits',\n                        title: 'setTitle',\n                        subtitle: 'setSubtitle'\n                    },\n                    optionsChart = options.chart,\n                    updateAllAxes,\n                    updateAllSeries,\n                    newWidth,\n                    newHeight;\n\n                // If the top-level chart option is present, some special updates are required\t\t\n                if (optionsChart) {\n                    merge(true, chart.options.chart, optionsChart);\n\n                    // Setter function\n                    if ('className' in optionsChart) {\n                        chart.setClassName(optionsChart.className);\n                    }\n\n                    if ('inverted' in optionsChart || 'polar' in optionsChart) {\n                        // Parse options.chart.inverted and options.chart.polar together\n                        // with the available series.\n                        chart.propFromSeries();\n                        updateAllAxes = true;\n                    }\n\n                    if ('alignTicks' in optionsChart) { // #6452\n                        updateAllAxes = true;\n                    }\n\n                    objectEach(optionsChart, function(val, key) {\n                        if (inArray('chart.' + key, chart.propsRequireUpdateSeries) !== -1) {\n                            updateAllSeries = true;\n                        }\n                        // Only dirty box\n                        if (inArray(key, chart.propsRequireDirtyBox) !== -1) {\n                            chart.isDirtyBox = true;\n                        }\n                    });\n\n\n                    if ('style' in optionsChart) {\n                        chart.renderer.setStyle(optionsChart.style);\n                    }\n\n                }\n\n                // Moved up, because tooltip needs updated plotOptions (#6218)\n\n                if (options.colors) {\n                    this.options.colors = options.colors;\n                }\n\n\n                if (options.plotOptions) {\n                    merge(true, this.options.plotOptions, options.plotOptions);\n                }\n\n                // Some option stuctures correspond one-to-one to chart objects that\n                // have update methods, for example\n                // options.credits => chart.credits\n                // options.legend => chart.legend\n                // options.title => chart.title\n                // options.tooltip => chart.tooltip\n                // options.subtitle => chart.subtitle\n                // options.mapNavigation => chart.mapNavigation\n                // options.navigator => chart.navigator\n                // options.scrollbar => chart.scrollbar\n                objectEach(options, function(val, key) {\n                    if (chart[key] && typeof chart[key].update === 'function') {\n                        chart[key].update(val, false);\n\n                        // If a one-to-one object does not exist, look for an adder function\n                    } else if (typeof chart[adders[key]] === 'function') {\n                        chart[adders[key]](val);\n                    }\n\n                    if (\n                        key !== 'chart' &&\n                        inArray(key, chart.propsRequireUpdateSeries) !== -1\n                    ) {\n                        updateAllSeries = true;\n                    }\n                });\n\n                // Setters for collections. For axes and series, each item is referred\n                // by an id. If the id is not found, it defaults to the corresponding\n                // item in the collection, so setting one series without an id, will\n                // update the first series in the chart. Setting two series without\n                // an id will update the first and the second respectively (#6019)\n                // chart.update and responsive.\n                each([\n                    'xAxis',\n                    'yAxis',\n                    'zAxis',\n                    'series',\n                    'colorAxis',\n                    'pane'\n                ], function(coll) {\n                    if (options[coll]) {\n                        each(splat(options[coll]), function(newOptions, i) {\n                            var item = (\n                                defined(newOptions.id) &&\n                                chart.get(newOptions.id)\n                            ) || chart[coll][i];\n                            if (item && item.coll === coll) {\n                                item.update(newOptions, false);\n                            }\n                        });\n                    }\n                });\n\n                if (updateAllAxes) {\n                    each(chart.axes, function(axis) {\n                        axis.update({}, false);\n                    });\n                }\n\n                // Certain options require the whole series structure to be thrown away\n                // and rebuilt\n                if (updateAllSeries) {\n                    each(chart.series, function(series) {\n                        series.update({}, false);\n                    });\n                }\n\n                // For loading, just update the options, do not redraw\n                if (options.loading) {\n                    merge(true, chart.options.loading, options.loading);\n                }\n\n                // Update size. Redraw is forced.\n                newWidth = optionsChart && optionsChart.width;\n                newHeight = optionsChart && optionsChart.height;\n                if ((isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n                    (isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n                    chart.setSize(newWidth, newHeight);\n                } else if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Setter function to allow use from chart.update\n             */\n            setSubtitle: function(options) {\n                this.setTitle(undefined, options);\n            }\n\n\n        });\n\n        // extend the Point prototype for dynamic methods\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Update point with new options (typically x/y data) and optionally redraw\n             * the series.\n             *\n             * @param  {Object} options\n             *         The point options. Point options are handled as described under\n             *         the `series<type>.data` item for each series type. For example\n             *         for a line series, if options is a single number, the point will\n             *         be given that number as the main y value. If it is an array, it\n             *         will be interpreted as x and y values respectively. If it is an\n             *         object, advanced options are applied. \n             * @param  {Boolean} [redraw=true]\n             *          Whether to redraw the chart after the point is updated. If doing\n             *          more operations on the chart, it is best practice to set\n             *          `redraw` to false and call `chart.redraw()` after.\n             * @param  {AnimationOptions} [animation=true]\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @sample highcharts/members/point-update-column/\n             *         Update column value\n             * @sample highcharts/members/point-update-pie/\n             *         Update pie slice\n             * @sample maps/members/point-update/\n             *         Update map area value in Highmaps\n             */\n            update: function(options, redraw, animation, runEvent) {\n                var point = this,\n                    series = point.series,\n                    graphic = point.graphic,\n                    i,\n                    chart = series.chart,\n                    seriesOptions = series.options;\n\n                redraw = pick(redraw, true);\n\n                function update() {\n\n                    point.applyOptions(options);\n\n                    // Update visuals\n                    if (point.y === null && graphic) { // #4146\n                        point.graphic = graphic.destroy();\n                    }\n                    if (isObject(options, true)) {\n                        // Destroy so we can get new elements\n                        if (graphic && graphic.element) {\n                            if (options && options.marker && options.marker.symbol) {\n                                point.graphic = graphic.destroy();\n                            }\n                        }\n                        if (options && options.dataLabels && point.dataLabel) { // #2468\n                            point.dataLabel = point.dataLabel.destroy();\n                        }\n                    }\n\n                    // record changes in the parallel arrays\n                    i = point.index;\n                    series.updateParallelArrays(point, i);\n\n                    // Record the options to options.data. If the old or the new config\n                    // is an object, use point options, otherwise use raw options\n                    // (#4701, #4916).\n                    seriesOptions.data[i] = (\n                            isObject(seriesOptions.data[i], true) ||\n                            isObject(options, true)\n                        ) ?\n                        point.options :\n                        options;\n\n                    // redraw\n                    series.isDirty = series.isDirtyData = true;\n                    if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n                        chart.isDirtyBox = true;\n                    }\n\n                    if (seriesOptions.legendType === 'point') { // #1831, #1885\n                        chart.isDirtyLegend = true;\n                    }\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                }\n\n                // Fire the event with a default handler of doing the update\n                if (runEvent === false) { // When called from setData\n                    update();\n                } else {\n                    point.firePointEvent('update', {\n                        options: options\n                    }, update);\n                }\n            },\n\n            /**\n             * Remove a point and optionally redraw the series and if necessary the axes\n             * @param  {Boolean} redraw\n             *         Whether to redraw the chart or wait for an explicit call. When\n             *         doing more operations on the chart, for example running\n             *         `point.remove()` in a loop, it is best practice to set `redraw`\n             *         to false and call `chart.redraw()` after.         \n             * @param  {AnimationOptions} [animation=false]\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @sample highcharts/plotoptions/series-point-events-remove/\n             *         Remove point and confirm\n             * @sample highcharts/members/point-remove/\n             *         Remove pie slice\n             * @sample maps/members/point-remove/\n             *         Remove selected points in Highmaps\n             */\n            remove: function(redraw, animation) {\n                this.series.removePoint(inArray(this, this.series.data), redraw, animation);\n            }\n        });\n\n        // Extend the series prototype for dynamic methods\n        extend(Series.prototype, /** @lends Series.prototype */ {\n            /**\n             * Add a point to the series after render time. The point can be added at\n             * the end, or by giving it an X value, to the start or in the middle of the\n             * series.\n             * \n             * @param  {Number|Array|Object} options\n             *         The point options. If options is a single number, a point with\n             *         that y value is appended to the series.If it is an array, it will\n             *         be interpreted as x and y values respectively. If it is an\n             *         object, advanced options as outlined under `series.data` are\n             *         applied.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the point is added. When adding\n             *         more than one point, it is highly recommended that the redraw\n             *         option be set to false, and instead {@link Chart#redraw}\n             *         is explicitly called after the adding of points is finished.\n             *         Otherwise, the chart will redraw after adding each point.\n             * @param  {Boolean} [shift=false]\n             *         If true, a point is shifted off the start of the series as one is\n             *         appended to the end.\n             * @param  {AnimationOptions} [animation]\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @sample highcharts/members/series-addpoint-append/\n             *         Append point\n             * @sample highcharts/members/series-addpoint-append-and-shift/\n             *         Append and shift\n             * @sample highcharts/members/series-addpoint-x-and-y/\n             *         Both X and Y values given\n             * @sample highcharts/members/series-addpoint-pie/\n             *         Append pie slice\n             * @sample stock/members/series-addpoint/\n             *         Append 100 points in Highstock\n             * @sample stock/members/series-addpoint-shift/\n             *         Append and shift in Highstock\n             * @sample maps/members/series-addpoint/\n             *         Add a point in Highmaps\n             */\n            addPoint: function(options, redraw, shift, animation) {\n                var series = this,\n                    seriesOptions = series.options,\n                    data = series.data,\n                    chart = series.chart,\n                    xAxis = series.xAxis,\n                    names = xAxis && xAxis.hasNames && xAxis.names,\n                    dataOptions = seriesOptions.data,\n                    point,\n                    isInTheMiddle,\n                    xData = series.xData,\n                    i,\n                    x;\n\n                // Optional redraw, defaults to true\n                redraw = pick(redraw, true);\n\n                // Get options and push the point to xData, yData and series.options. In series.generatePoints\n                // the Point instance will be created on demand and pushed to the series.data array.\n                point = {\n                    series: series\n                };\n                series.pointClass.prototype.applyOptions.apply(point, [options]);\n                x = point.x;\n\n                // Get the insertion point\n                i = xData.length;\n                if (series.requireSorting && x < xData[i - 1]) {\n                    isInTheMiddle = true;\n                    while (i && xData[i - 1] > x) {\n                        i--;\n                    }\n                }\n\n                series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item\n                series.updateParallelArrays(point, i); // update it\n\n                if (names && point.name) {\n                    names[x] = point.name;\n                }\n                dataOptions.splice(i, 0, options);\n\n                if (isInTheMiddle) {\n                    series.data.splice(i, 0, null);\n                    series.processData();\n                }\n\n                // Generate points to be added to the legend (#1329)\n                if (seriesOptions.legendType === 'point') {\n                    series.generatePoints();\n                }\n\n                // Shift the first point off the parallel arrays\n                if (shift) {\n                    if (data[0] && data[0].remove) {\n                        data[0].remove(false);\n                    } else {\n                        data.shift();\n                        series.updateParallelArrays(point, 'shift');\n\n                        dataOptions.shift();\n                    }\n                }\n\n                // redraw\n                series.isDirty = true;\n                series.isDirtyData = true;\n\n                if (redraw) {\n                    chart.redraw(animation); // Animation is set anyway on redraw, #5665\n                }\n            },\n\n            /**\n             * Remove a point from the series. Unlike the {@link Highcharts.Point#remove}\n             * method, this can also be done on a point that is not instanciated because\n             * it is outside the view or subject to Highstock data grouping.\n             *\n             * @param  {Number} i\n             *         The index of the point in the {@link Highcharts.Series.data|data}\n             *         array.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the point is added. When \n             *         removing more than one point, it is highly recommended that the\n             *         `redraw` option be set to `false`, and instead {@link\n             *         Highcharts.Chart#redraw} is explicitly called after the adding of\n             *         points is finished.\n             * @param  {AnimationOptions} [animation]\n             *         Whether and optionally how the series should be animated.\n             *\n             * @sample highcharts/members/series-removepoint/\n             *         Remove cropped point\n             */\n            removePoint: function(i, redraw, animation) {\n\n                var series = this,\n                    data = series.data,\n                    point = data[i],\n                    points = series.points,\n                    chart = series.chart,\n                    remove = function() {\n\n                        if (points && points.length === data.length) { // #4935\n                            points.splice(i, 1);\n                        }\n                        data.splice(i, 1);\n                        series.options.data.splice(i, 1);\n                        series.updateParallelArrays(point || {\n                            series: series\n                        }, 'splice', i, 1);\n\n                        if (point) {\n                            point.destroy();\n                        }\n\n                        // redraw\n                        series.isDirty = true;\n                        series.isDirtyData = true;\n                        if (redraw) {\n                            chart.redraw();\n                        }\n                    };\n\n                setAnimation(animation, chart);\n                redraw = pick(redraw, true);\n\n                // Fire the event with a default handler of removing the point\n                if (point) {\n                    point.firePointEvent('remove', null, remove);\n                } else {\n                    remove();\n                }\n            },\n\n            /**\n             * Remove a series and optionally redraw the chart.\n             *\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart or wait for an explicit call to\n             *         {@link Highcharts.Chart#redraw}.\n             * @param  {AnimationOptions} [animation]\n             *         Whether to apply animation, and optionally animation\n             *         configuration\n             * @param  {Boolean} [withEvent=true]\n             *         Used internally, whether to fire the series `remove` event.\n             *\n             * @sample highcharts/members/series-remove/\n             *         Remove first series from a button\n             */\n            remove: function(redraw, animation, withEvent) {\n                var series = this,\n                    chart = series.chart;\n\n                function remove() {\n\n                    // Destroy elements\n                    series.destroy();\n\n                    // Redraw\n                    chart.isDirtyLegend = chart.isDirtyBox = true;\n                    chart.linkSeries();\n\n                    if (pick(redraw, true)) {\n                        chart.redraw(animation);\n                    }\n                }\n\n                // Fire the event with a default handler of removing the point\n                if (withEvent !== false) {\n                    fireEvent(series, 'remove', null, remove);\n                } else {\n                    remove();\n                }\n            },\n\n            /**\n             * Update the series with a new set of options. For a clean and precise\n             * handling of new options, all methods and elements from the series are\n             * removed, and it is initiated from scratch. Therefore, this method is more\n             * performance expensive than some other utility methods like {@link\n             * Series#setData} or {@link Series#setVisible}.\n             *\n             * @param  {SeriesOptions} options\n             *         New options that will be merged with the series' existing\n             *         options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the series is altered. If doing\n             *         more operations on the chart, it is a good idea to set redraw to\n             *         false and call {@link Chart#redraw} after.\n             *\n             * @sample highcharts/members/series-update/\n             *         Updating series options\n             * @sample maps/members/series-update/\n             *         Update series options in Highmaps\n             */\n            update: function(newOptions, redraw) {\n                var series = this,\n                    chart = series.chart,\n                    // must use user options when changing type because series.options\n                    // is merged in with type specific plotOptions\n                    oldOptions = series.userOptions,\n                    oldType = series.oldType || series.type,\n                    newType = newOptions.type || oldOptions.type || chart.options.chart.type,\n                    proto = seriesTypes[oldType].prototype,\n                    preserve = ['group', 'markerGroup', 'dataLabelsGroup'],\n                    n;\n\n                // Running Series.update to update the data only is an intuitive usage,\n                // so we want to make sure that when used like this, we run the\n                // cheaper setData function and allow animation instead of completely\n                // recreating the series instance.\n                if (Object.keys && Object.keys(newOptions).toString() === 'data') {\n                    return this.setData(newOptions.data, redraw);\n                }\n\n                // If we're changing type or zIndex, create new groups (#3380, #3404)\n                if ((newType && newType !== oldType) || newOptions.zIndex !== undefined) {\n                    preserve.length = 0;\n                }\n\n                // Make sure groups are not destroyed (#3094)\n                each(preserve, function(prop) {\n                    preserve[prop] = series[prop];\n                    delete series[prop];\n                });\n\n                // Do the merge, with some forced options\n                newOptions = merge(oldOptions, {\n                    animation: false,\n                    index: series.index,\n                    pointStart: series.xData[0] // when updating after addPoint\n                }, {\n                    data: series.options.data\n                }, newOptions);\n\n                // Destroy the series and delete all properties. Reinsert all methods\n                // and properties from the new type prototype (#2270, #3719)\n                series.remove(false, null, false);\n                for (n in proto) {\n                    series[n] = undefined;\n                }\n                extend(series, seriesTypes[newType || oldType].prototype);\n\n                // Re-register groups (#3094)\n                each(preserve, function(prop) {\n                    series[prop] = preserve[prop];\n                });\n\n                series.init(chart, newOptions);\n                series.oldType = oldType;\n                chart.linkSeries(); // Links are lost in series.remove (#3028)\n                if (pick(redraw, true)) {\n                    chart.redraw(false);\n                }\n            }\n        });\n\n        // Extend the Axis.prototype for dynamic methods\n        extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n            /**\n             * Update an axis object with a new set of options. The options are merged\n             * with the existing options, so only new or altered options need to be\n             * specified.\n             *\n             * @param  {Object} options\n             *         The new options that will be merged in with existing options on\n             *         the axis.\n             * @sample highcharts/members/axis-update/ Axis update demo\n             */\n            update: function(options, redraw) {\n                var chart = this.chart;\n\n                options = chart.options[this.coll][this.options.index] =\n                    merge(this.userOptions, options);\n\n                this.destroy(true);\n\n                this.init(chart, extend(options, {\n                    events: undefined\n                }));\n\n                chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Remove the axis from the chart.\n             *\n             * @param {Boolean} [redraw=true] Whether to redraw the chart following the\n             * remove.\n             *\n             * @sample highcharts/members/chart-addaxis/ Add and remove axes\n             */\n            remove: function(redraw) {\n                var chart = this.chart,\n                    key = this.coll, // xAxis or yAxis\n                    axisSeries = this.series,\n                    i = axisSeries.length;\n\n                // Remove associated series (#2687)\n                while (i--) {\n                    if (axisSeries[i]) {\n                        axisSeries[i].remove(false);\n                    }\n                }\n\n                // Remove the axis\n                erase(chart.axes, this);\n                erase(chart[key], this);\n\n                if (isArray(chart.options[key])) {\n                    chart.options[key].splice(this.options.index, 1);\n                } else { // color axis, #6488\n                    delete chart.options[key];\n                }\n\n                each(chart[key], function(axis, i) { // Re-index, #1706\n                    axis.options.index = i;\n                });\n                this.destroy();\n                chart.isDirtyBox = true;\n\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Update the axis title by options after render time.\n             *\n             * @param  {TitleOptions} titleOptions\n             *         The additional title options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after setting the title.\n             * @sample highcharts/members/axis-settitle/ Set a new Y axis title\n             */\n            setTitle: function(titleOptions, redraw) {\n                this.update({\n                    title: titleOptions\n                }, redraw);\n            },\n\n            /**\n             * Set new axis categories and optionally redraw.\n             * @param {Array.<String>} categories - The new categories.\n             * @param {Boolean} [redraw=true] - Whether to redraw the chart.\n             * @sample highcharts/members/axis-setcategories/ Set categories by click on\n             * a button\n             */\n            setCategories: function(categories, redraw) {\n                this.update({\n                    categories: categories\n                }, redraw);\n            }\n\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var color = H.color,\n            each = H.each,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            map = H.map,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType;\n\n        /**\n         * Area series type.\n         * @constructor seriesTypes.area\n         * @extends {Series}\n         */\n        seriesType('area', 'line', {\n            softThreshold: false,\n            threshold: 0\n            // trackByArea: false,\n            // lineColor: null, // overrides color, but lets fillColor be unaltered\n            // fillOpacity: 0.75,\n            // fillColor: null\n        }, /** @lends seriesTypes.area.prototype */ {\n            singleStacks: false,\n            /** \n             * Return an array of stacked points, where null and missing points are replaced by \n             * dummy points in order for gaps to be drawn correctly in stacks.\n             */\n            getStackPoints: function() {\n                var series = this,\n                    segment = [],\n                    keys = [],\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    stack = yAxis.stacks[this.stackKey],\n                    pointMap = {},\n                    points = this.points,\n                    seriesIndex = series.index,\n                    yAxisSeries = yAxis.series,\n                    seriesLength = yAxisSeries.length,\n                    visibleSeries,\n                    upOrDown = pick(yAxis.options.reversedStacks, true) ? 1 : -1,\n                    i;\n\n                if (this.options.stacking) {\n                    // Create a map where we can quickly look up the points by their X value.\n                    for (i = 0; i < points.length; i++) {\n                        pointMap[points[i].x] = points[i];\n                    }\n\n                    // Sort the keys (#1651)\n                    H.objectEach(stack, function(stackX, x) {\n                        if (stackX.total !== null) { // nulled after switching between grouping and not (#1651, #2336)\n                            keys.push(x);\n                        }\n                    });\n                    keys.sort(function(a, b) {\n                        return a - b;\n                    });\n\n                    visibleSeries = map(yAxisSeries, function() {\n                        return this.visible;\n                    });\n\n                    each(keys, function(x, idx) {\n                        var y = 0,\n                            stackPoint,\n                            stackedValues;\n\n                        if (pointMap[x] && !pointMap[x].isNull) {\n                            segment.push(pointMap[x]);\n\n                            // Find left and right cliff. -1 goes left, 1 goes right.\n                            each([-1, 1], function(direction) {\n                                var nullName = direction === 1 ? 'rightNull' : 'leftNull',\n                                    cliffName = direction === 1 ? 'rightCliff' : 'leftCliff',\n                                    cliff = 0,\n                                    otherStack = stack[keys[idx + direction]];\n\n                                // If there is a stack next to this one, to the left or to the right...\n                                if (otherStack) {\n                                    i = seriesIndex;\n                                    while (i >= 0 && i < seriesLength) { // Can go either up or down, depending on reversedStacks\n                                        stackPoint = otherStack.points[i];\n                                        if (!stackPoint) {\n                                            // If the next point in this series is missing, mark the point\n                                            // with point.leftNull or point.rightNull = true.\n                                            if (i === seriesIndex) {\n                                                pointMap[x][nullName] = true;\n\n                                                // If there are missing points in the next stack in any of the \n                                                // series below this one, we need to substract the missing values\n                                                // and add a hiatus to the left or right.\n                                            } else if (visibleSeries[i]) {\n                                                stackedValues = stack[x].points[i];\n                                                if (stackedValues) {\n                                                    cliff -= stackedValues[1] - stackedValues[0];\n                                                }\n                                            }\n                                        }\n                                        // When reversedStacks is true, loop up, else loop down\n                                        i += upOrDown;\n                                    }\n                                }\n                                pointMap[x][cliffName] = cliff;\n                            });\n\n\n                            // There is no point for this X value in this series, so we \n                            // insert a dummy point in order for the areas to be drawn\n                            // correctly.\n                        } else {\n\n                            // Loop down the stack to find the series below this one that has\n                            // a value (#1991)\n                            i = seriesIndex;\n                            while (i >= 0 && i < seriesLength) {\n                                stackPoint = stack[x].points[i];\n                                if (stackPoint) {\n                                    y = stackPoint[1];\n                                    break;\n                                }\n                                // When reversedStacks is true, loop up, else loop down\n                                i += upOrDown;\n                            }\n                            y = yAxis.translate(y, 0, 1, 0, 1); // #6272\n                            segment.push({\n                                isNull: true,\n                                plotX: xAxis.translate(x, 0, 0, 0, 1), // #6272\n                                x: x,\n                                plotY: y,\n                                yBottom: y\n                            });\n                        }\n                    });\n\n                }\n\n                return segment;\n            },\n\n            getGraphPath: function(points) {\n                var getGraphPath = Series.prototype.getGraphPath,\n                    graphPath,\n                    options = this.options,\n                    stacking = options.stacking,\n                    yAxis = this.yAxis,\n                    topPath,\n                    //topPoints = [],\n                    bottomPath,\n                    bottomPoints = [],\n                    graphPoints = [],\n                    seriesIndex = this.index,\n                    i,\n                    areaPath,\n                    plotX,\n                    stacks = yAxis.stacks[this.stackKey],\n                    threshold = options.threshold,\n                    translatedThreshold = yAxis.getThreshold(options.threshold),\n                    isNull,\n                    yBottom,\n                    connectNulls = options.connectNulls || stacking === 'percent',\n                    /**\n                     * To display null points in underlying stacked series, this series graph must be \n                     * broken, and the area also fall down to fill the gap left by the null point. #2069\n                     */\n                    addDummyPoints = function(i, otherI, side) {\n                        var point = points[i],\n                            stackedValues = stacking && stacks[point.x].points[seriesIndex],\n                            nullVal = point[side + 'Null'] || 0,\n                            cliffVal = point[side + 'Cliff'] || 0,\n                            top,\n                            bottom,\n                            isNull = true;\n\n                        if (cliffVal || nullVal) {\n\n                            top = (nullVal ? stackedValues[0] : stackedValues[1]) + cliffVal;\n                            bottom = stackedValues[0] + cliffVal;\n                            isNull = !!nullVal;\n\n                        } else if (!stacking && points[otherI] && points[otherI].isNull) {\n                            top = bottom = threshold;\n                        }\n\n                        // Add to the top and bottom line of the area\n                        if (top !== undefined) {\n                            graphPoints.push({\n                                plotX: plotX,\n                                plotY: top === null ? translatedThreshold : yAxis.getThreshold(top),\n                                isNull: isNull,\n                                isCliff: true\n                            });\n                            bottomPoints.push({\n                                plotX: plotX,\n                                plotY: bottom === null ? translatedThreshold : yAxis.getThreshold(bottom),\n                                doCurve: false // #1041, gaps in areaspline areas\n                            });\n                        }\n                    };\n\n                // Find what points to use\n                points = points || this.points;\n\n                // Fill in missing points\n                if (stacking) {\n                    points = this.getStackPoints();\n                }\n\n                for (i = 0; i < points.length; i++) {\n                    isNull = points[i].isNull;\n                    plotX = pick(points[i].rectPlotX, points[i].plotX);\n                    yBottom = pick(points[i].yBottom, translatedThreshold);\n\n                    if (!isNull || connectNulls) {\n\n                        if (!connectNulls) {\n                            addDummyPoints(i, i - 1, 'left');\n                        }\n\n                        if (!(isNull && !stacking && connectNulls)) { // Skip null point when stacking is false and connectNulls true\n                            graphPoints.push(points[i]);\n                            bottomPoints.push({\n                                x: i,\n                                plotX: plotX,\n                                plotY: yBottom\n                            });\n                        }\n\n                        if (!connectNulls) {\n                            addDummyPoints(i, i + 1, 'right');\n                        }\n                    }\n                }\n\n                topPath = getGraphPath.call(this, graphPoints, true, true);\n\n                bottomPoints.reversed = true;\n                bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n                if (bottomPath.length) {\n                    bottomPath[0] = 'L';\n                }\n\n                areaPath = topPath.concat(bottomPath);\n                graphPath = getGraphPath.call(this, graphPoints, false, connectNulls); // TODO: don't set leftCliff and rightCliff when connectNulls?\n\n                areaPath.xMap = topPath.xMap;\n                this.areaPath = areaPath;\n\n                return graphPath;\n            },\n\n            /**\n             * Draw the graph and the underlying area. This method calls the Series base\n             * function and adds the area. The areaPath is calculated in the getSegmentPath\n             * method called from Series.prototype.drawGraph.\n             */\n            drawGraph: function() {\n\n                // Define or reset areaPath\n                this.areaPath = [];\n\n                // Call the base method\n                Series.prototype.drawGraph.apply(this);\n\n                // Define local variables\n                var series = this,\n                    areaPath = this.areaPath,\n                    options = this.options,\n                    zones = this.zones,\n                    props = [\n                        [\n                            'area',\n                            'highcharts-area',\n\n                            this.color,\n                            options.fillColor\n\n                        ]\n                    ]; // area name, main color, fill color\n\n                each(zones, function(zone, i) {\n                    props.push([\n                        'zone-area-' + i,\n                        'highcharts-area highcharts-zone-area-' + i + ' ' + zone.className,\n\n                        zone.color || series.color,\n                        zone.fillColor || options.fillColor\n\n                    ]);\n                });\n\n                each(props, function(prop) {\n                    var areaKey = prop[0],\n                        area = series[areaKey];\n\n                    // Create or update the area\n                    if (area) { // update\n                        area.endX = areaPath.xMap;\n                        area.animate({\n                            d: areaPath\n                        });\n\n                    } else { // create\n                        area = series[areaKey] = series.chart.renderer.path(areaPath)\n                            .addClass(prop[1])\n                            .attr({\n\n                                fill: pick(\n                                    prop[3],\n                                    color(prop[2]).setOpacity(pick(options.fillOpacity, 0.75)).get()\n                                ),\n\n                                zIndex: 0 // #1069\n                            }).add(series.group);\n                        area.isArea = true;\n                    }\n                    area.startX = areaPath.xMap;\n                    area.shiftUnit = options.step ? 2 : 1;\n                });\n            },\n\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var pick = H.pick,\n            seriesType = H.seriesType;\n\n        /**\n         * Spline series type.\n         * @constructor seriesTypes.spline\n         * @extends {Series}\n         */\n        seriesType('spline', 'line', {}, /** @lends seriesTypes.spline.prototype */ {\n            /**\n             * Get the spline segment from a given point's previous neighbour to the given point\n             */\n            getPointSpline: function(points, point, i) {\n                var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc\n                    denom = smoothing + 1,\n                    plotX = point.plotX,\n                    plotY = point.plotY,\n                    lastPoint = points[i - 1],\n                    nextPoint = points[i + 1],\n                    leftContX,\n                    leftContY,\n                    rightContX,\n                    rightContY,\n                    ret;\n\n                function doCurve(otherPoint) {\n                    return otherPoint &&\n                        !otherPoint.isNull &&\n                        otherPoint.doCurve !== false &&\n                        !point.isCliff; // #6387, area splines next to null\n                }\n\n                // Find control points\n                if (doCurve(lastPoint) && doCurve(nextPoint)) {\n                    var lastX = lastPoint.plotX,\n                        lastY = lastPoint.plotY,\n                        nextX = nextPoint.plotX,\n                        nextY = nextPoint.plotY,\n                        correction = 0;\n\n                    leftContX = (smoothing * plotX + lastX) / denom;\n                    leftContY = (smoothing * plotY + lastY) / denom;\n                    rightContX = (smoothing * plotX + nextX) / denom;\n                    rightContY = (smoothing * plotY + nextY) / denom;\n\n                    // Have the two control points make a straight line through main point\n                    if (rightContX !== leftContX) { // #5016, division by zero\n                        correction = ((rightContY - leftContY) * (rightContX - plotX)) /\n                            (rightContX - leftContX) + plotY - rightContY;\n                    }\n\n                    leftContY += correction;\n                    rightContY += correction;\n\n                    // to prevent false extremes, check that control points are between\n                    // neighbouring points' y values\n                    if (leftContY > lastY && leftContY > plotY) {\n                        leftContY = Math.max(lastY, plotY);\n                        rightContY = 2 * plotY - leftContY; // mirror of left control point\n                    } else if (leftContY < lastY && leftContY < plotY) {\n                        leftContY = Math.min(lastY, plotY);\n                        rightContY = 2 * plotY - leftContY;\n                    }\n                    if (rightContY > nextY && rightContY > plotY) {\n                        rightContY = Math.max(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    } else if (rightContY < nextY && rightContY < plotY) {\n                        rightContY = Math.min(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    }\n\n                    // record for drawing in next point\n                    point.rightContX = rightContX;\n                    point.rightContY = rightContY;\n\n\n                }\n\n                // Visualize control points for debugging\n                /*\n                if (leftContX) {\n                \tthis.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)\n                \t\t.attr({\n                \t\t\tstroke: 'red',\n                \t\t\t'stroke-width': 2,\n                \t\t\tfill: 'none',\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                \tthis.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,\n                \t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                \t\t.attr({\n                \t\t\tstroke: 'red',\n                \t\t\t'stroke-width': 2,\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                }\n                if (rightContX) {\n                \tthis.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)\n                \t\t.attr({\n                \t\t\tstroke: 'green',\n                \t\t\t'stroke-width': 2,\n                \t\t\tfill: 'none',\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                \tthis.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,\n                \t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                \t\t.attr({\n                \t\t\tstroke: 'green',\n                \t\t\t'stroke-width': 2,\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                }\n                // */\n                ret = [\n                    'C',\n                    pick(lastPoint.rightContX, lastPoint.plotX),\n                    pick(lastPoint.rightContY, lastPoint.plotY),\n                    pick(leftContX, plotX),\n                    pick(leftContY, plotY),\n                    plotX,\n                    plotY\n                ];\n                lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\n                return ret;\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var areaProto = H.seriesTypes.area.prototype,\n            defaultPlotOptions = H.defaultPlotOptions,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            seriesType = H.seriesType;\n        /**\n         * AreaSplineSeries object\n         */\n        seriesType('areaspline', 'spline', defaultPlotOptions.area, {\n            getStackPoints: areaProto.getStackPoints,\n            getGraphPath: areaProto.getGraphPath,\n            setStackCliffs: areaProto.setStackCliffs,\n            drawGraph: areaProto.drawGraph,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var animObject = H.animObject,\n            color = H.color,\n            each = H.each,\n            extend = H.extend,\n            isNumber = H.isNumber,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            svg = H.svg;\n        /**\n         * The column series type.\n         *\n         * @constructor seriesTypes.column\n         * @augments Series\n         */\n        seriesType('column', 'line', {\n            borderRadius: 0,\n            //colorByPoint: undefined,\n            crisp: true,\n            groupPadding: 0.2,\n            //grouping: true,\n            marker: null, // point options are specified in the base options\n            pointPadding: 0.1,\n            //pointWidth: null,\n            minPointLength: 0,\n            cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes\n            pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories\n            states: {\n                hover: {\n                    halo: false,\n\n                    brightness: 0.1,\n                    shadow: false\n\n                },\n\n                select: {\n                    color: '#cccccc',\n                    borderColor: '#000000',\n                    shadow: false\n                }\n\n            },\n            dataLabels: {\n                align: null, // auto\n                verticalAlign: null, // auto\n                y: null\n            },\n            softThreshold: false,\n            startFromThreshold: true, // false doesn't work well: http://jsfiddle.net/highcharts/hz8fopan/14/\n            stickyTracking: false,\n            tooltip: {\n                distance: 6\n            },\n            threshold: 0,\n\n            borderColor: '#ffffff'\n            // borderWidth: 1\n\n\n        }, /** @lends seriesTypes.column.prototype */ {\n            cropShoulder: 0,\n            directTouch: true, // When tooltip is not shared, this series (and derivatives) requires direct touch/hover. KD-tree does not apply.\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            negStacks: true, // use separate negative stacks, unlike area stacks where a negative\n            // point is substracted from previous (#1910)\n\n            /**\n             * Initialize the series. Extends the basic Series.init method by\n             * marking other series of the same type as dirty.\n             *\n             * @function #init\n             * @memberOf seriesTypes.column\n             * @returns {void}\n             */\n            init: function() {\n                Series.prototype.init.apply(this, arguments);\n\n                var series = this,\n                    chart = series.chart;\n\n                // if the series is added dynamically, force redraw of other\n                // series affected by a new column\n                if (chart.hasRendered) {\n                    each(chart.series, function(otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,\n             * pointWidth etc.\n             */\n            getColumnMetrics: function() {\n\n                var series = this,\n                    options = series.options,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    reversedXAxis = xAxis.reversed,\n                    stackKey,\n                    stackGroups = {},\n                    columnCount = 0;\n\n                // Get the total number of column type series.\n                // This is called on every series. Consider moving this logic to a\n                // chart.orderStacks() function and call it on init, addSeries and removeSeries\n                if (options.grouping === false) {\n                    columnCount = 1;\n                } else {\n                    each(series.chart.series, function(otherSeries) {\n                        var otherOptions = otherSeries.options,\n                            otherYAxis = otherSeries.yAxis,\n                            columnIndex;\n                        if (\n                            otherSeries.type === series.type &&\n                            (\n                                otherSeries.visible ||\n                                !series.chart.options.chart.ignoreHiddenSeries\n                            ) &&\n                            yAxis.len === otherYAxis.len &&\n                            yAxis.pos === otherYAxis.pos\n                        ) { // #642, #2086\n                            if (otherOptions.stacking) {\n                                stackKey = otherSeries.stackKey;\n                                if (stackGroups[stackKey] === undefined) {\n                                    stackGroups[stackKey] = columnCount++;\n                                }\n                                columnIndex = stackGroups[stackKey];\n                            } else if (otherOptions.grouping !== false) { // #1162\n                                columnIndex = columnCount++;\n                            }\n                            otherSeries.columnIndex = columnIndex;\n                        }\n                    });\n                }\n\n                var categoryWidth = Math.min(\n                        Math.abs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610\n                        xAxis.len // #1535\n                    ),\n                    groupPadding = categoryWidth * options.groupPadding,\n                    groupWidth = categoryWidth - 2 * groupPadding,\n                    pointOffsetWidth = groupWidth / (columnCount || 1),\n                    pointWidth = Math.min(\n                        options.maxPointWidth || xAxis.len,\n                        pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))\n                    ),\n                    pointPadding = (pointOffsetWidth - pointWidth) / 2,\n                    colIndex = (series.columnIndex || 0) + (reversedXAxis ? 1 : 0), // #1251, #3737\n                    pointXOffset = pointPadding + (groupPadding + colIndex *\n                        pointOffsetWidth - (categoryWidth / 2)) *\n                    (reversedXAxis ? -1 : 1);\n\n                // Save it for reading in linked series (Error bars particularly)\n                series.columnMetrics = {\n                    width: pointWidth,\n                    offset: pointXOffset\n                };\n                return series.columnMetrics;\n\n            },\n\n            /**\n             * Make the columns crisp. The edges are rounded to the nearest full pixel.\n             */\n            crispCol: function(x, y, w, h) {\n                var chart = this.chart,\n                    borderWidth = this.borderWidth,\n                    xCrisp = -(borderWidth % 2 ? 0.5 : 0),\n                    yCrisp = borderWidth % 2 ? 0.5 : 1,\n                    right,\n                    bottom,\n                    fromTop;\n\n                if (chart.inverted && chart.renderer.isVML) {\n                    yCrisp += 1;\n                }\n\n                // Horizontal. We need to first compute the exact right edge, then round it\n                // and compute the width from there.\n                if (this.options.crisp) {\n                    right = Math.round(x + w) + xCrisp;\n                    x = Math.round(x) + xCrisp;\n                    w = right - x;\n                }\n\n                // Vertical\n                bottom = Math.round(y + h) + yCrisp;\n                fromTop = Math.abs(y) <= 0.5 && bottom > 0.5; // #4504, #4656\n                y = Math.round(y) + yCrisp;\n                h = bottom - y;\n\n                // Top edges are exceptions\n                if (fromTop && h) { // #5146\n                    y -= 1;\n                    h += 1;\n                }\n\n                return {\n                    x: x,\n                    y: y,\n                    width: w,\n                    height: h\n                };\n            },\n\n            /**\n             * Translate each point to the plot area coordinate system and find shape positions\n             */\n            translate: function() {\n                var series = this,\n                    chart = series.chart,\n                    options = series.options,\n                    dense = series.dense = series.closestPointRange * series.xAxis.transA < 2,\n                    borderWidth = series.borderWidth = pick(\n                        options.borderWidth,\n                        dense ? 0 : 1 // #3635\n                    ),\n                    yAxis = series.yAxis,\n                    threshold = options.threshold,\n                    translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),\n                    minPointLength = pick(options.minPointLength, 5),\n                    metrics = series.getColumnMetrics(),\n                    pointWidth = metrics.width,\n                    seriesBarW = series.barW = Math.max(pointWidth, 1 + 2 * borderWidth), // postprocessed for border width\n                    pointXOffset = series.pointXOffset = metrics.offset;\n\n                if (chart.inverted) {\n                    translatedThreshold -= 0.5; // #3355\n                }\n\n                // When the pointPadding is 0, we want the columns to be packed tightly, so we allow individual\n                // columns to have individual sizes. When pointPadding is greater, we strive for equal-width\n                // columns (#2694).\n                if (options.pointPadding) {\n                    seriesBarW = Math.ceil(seriesBarW);\n                }\n\n                Series.prototype.translate.apply(series);\n\n                // Record the new values\n                each(series.points, function(point) {\n                    var yBottom = pick(point.yBottom, translatedThreshold),\n                        safeDistance = 999 + Math.abs(yBottom),\n                        plotY = Math.min(Math.max(-safeDistance, point.plotY), yAxis.len + safeDistance), // Don't draw too far outside plot area (#1303, #2241, #4264)\n                        barX = point.plotX + pointXOffset,\n                        barW = seriesBarW,\n                        barY = Math.min(plotY, yBottom),\n                        up,\n                        barH = Math.max(plotY, yBottom) - barY;\n\n                    // Handle options.minPointLength\n                    if (Math.abs(barH) < minPointLength) {\n                        if (minPointLength) {\n                            barH = minPointLength;\n                            up = (!yAxis.reversed && !point.negative) || (yAxis.reversed && point.negative);\n                            barY = Math.abs(barY - translatedThreshold) > minPointLength ? // stacked\n                                yBottom - minPointLength : // keep position\n                                translatedThreshold - (up ? minPointLength : 0); // #1485, #4051\n                        }\n                    }\n\n                    // Cache for access in polar\n                    point.barX = barX;\n                    point.pointWidth = pointWidth;\n\n                    // Fix the tooltip on center of grouped columns (#1216, #424, #3648)\n                    point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - barX - barW / 2, barH] : [barX + barW / 2, plotY + yAxis.pos - chart.plotTop, barH];\n\n                    // Register shape type and arguments to be used in drawPoints\n                    point.shapeType = 'rect';\n                    point.shapeArgs = series.crispCol.apply(\n                        series,\n                        point.isNull ?\n                        // #3169, drilldown from null must have a position to work from\n                        // #6585, dataLabel should be placed on xAxis, not floating in the middle of the chart\n                        [barX, translatedThreshold, barW, 0] : [barX, barY, barW, barH]\n                    );\n                });\n\n            },\n\n            getSymbol: noop,\n\n            /**\n             * Use a solid rectangle like the area series types\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n\n            /**\n             * Columns have no graph\n             */\n            drawGraph: function() {\n                this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n            },\n\n\n            /**\n             * Get presentational attributes\n             */\n            pointAttribs: function(point, state) {\n                var options = this.options,\n                    stateOptions,\n                    ret,\n                    p2o = this.pointAttrToOptions || {},\n                    strokeOption = p2o.stroke || 'borderColor',\n                    strokeWidthOption = p2o['stroke-width'] || 'borderWidth',\n                    fill = (point && point.color) || this.color,\n                    stroke = point[strokeOption] || options[strokeOption] ||\n                    this.color || fill, // set to fill when borderColor null\n                    strokeWidth = point[strokeWidthOption] ||\n                    options[strokeWidthOption] || this[strokeWidthOption] || 0,\n                    dashstyle = options.dashStyle,\n                    zone,\n                    brightness;\n\n                // Handle zone colors\n                if (point && this.zones.length) {\n                    zone = point.getZone();\n                    fill = point.options.color || (zone && zone.color) || this.color; // When zones are present, don't use point.color (#4267). Changed order (#6527)\n                }\n\n                // Select or hover states\n                if (state) {\n                    stateOptions = merge(\n                        options.states[state],\n                        point.options.states && point.options.states[state] || {} // #6401\n                    );\n                    brightness = stateOptions.brightness;\n                    fill = stateOptions.color ||\n                        (brightness !== undefined && color(fill).brighten(stateOptions.brightness).get()) ||\n                        fill;\n                    stroke = stateOptions[strokeOption] || stroke;\n                    strokeWidth = stateOptions[strokeWidthOption] || strokeWidth;\n                    dashstyle = stateOptions.dashStyle || dashstyle;\n                }\n\n                ret = {\n                    'fill': fill,\n                    'stroke': stroke,\n                    'stroke-width': strokeWidth\n                };\n                if (options.borderRadius) {\n                    ret.r = options.borderRadius;\n                }\n\n                if (dashstyle) {\n                    ret.dashstyle = dashstyle;\n                }\n\n                return ret;\n            },\n\n\n            /**\n             * Draw the columns. For bars, the series.group is rotated, so the same coordinates\n             * apply for columns and bars. This method is inherited by scatter series.\n             *\n             */\n            drawPoints: function() {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    shapeArgs;\n\n                // draw the columns\n                each(series.points, function(point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic;\n\n                    if (isNumber(plotY) && point.y !== null) {\n                        shapeArgs = point.shapeArgs;\n\n                        if (graphic) { // update\n                            graphic[chart.pointCount < animationLimit ? 'animate' : 'attr'](\n                                merge(shapeArgs)\n                            );\n\n                        } else {\n                            point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n                                .add(point.group || series.group);\n                        }\n\n\n                        // Presentational\n                        graphic\n                            .attr(series.pointAttribs(point, point.selected && 'select'))\n                            .shadow(options.shadow, null, options.stacking && !options.borderRadius);\n\n\n                        graphic.addClass(point.getClassName(), true);\n\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            },\n\n            /**\n             * Animate the column heights one by one from zero\n             * @param {Boolean} init Whether to initialize the animation or run it\n             */\n            animate: function(init) {\n                var series = this,\n                    yAxis = this.yAxis,\n                    options = series.options,\n                    inverted = this.chart.inverted,\n                    attr = {},\n                    translatedThreshold;\n\n                if (svg) { // VML is too slow anyway\n                    if (init) {\n                        attr.scaleY = 0.001;\n                        translatedThreshold = Math.min(yAxis.pos + yAxis.len, Math.max(yAxis.pos, yAxis.toPixels(options.threshold)));\n                        if (inverted) {\n                            attr.translateX = translatedThreshold - yAxis.len;\n                        } else {\n                            attr.translateY = translatedThreshold;\n                        }\n                        series.group.attr(attr);\n\n                    } else { // run the animation\n\n                        attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;\n                        series.group.animate(attr, extend(animObject(series.options.animation), {\n                            // Do the scale synchronously to ensure smooth updating (#5030)\n                            step: function(val, fx) {\n                                series.group.attr({\n                                    scaleY: Math.max(0.001, fx.pos) // #5250\n                                });\n                            }\n                        }));\n\n                        // delete this function to allow it only once\n                        series.animate = null;\n                    }\n                }\n            },\n\n            /**\n             * Remove this series from the chart\n             */\n            remove: function() {\n                var series = this,\n                    chart = series.chart;\n\n                // column and bar series affects other series of the same type\n                // as they are either stacked or grouped\n                if (chart.hasRendered) {\n                    each(chart.series, function(otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n\n                Series.prototype.remove.apply(series, arguments);\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesType = H.seriesType;\n\n        /**\n         * The Bar series class\n         */\n        seriesType('bar', 'column', null, {\n            inverted: true\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Series = H.Series,\n            seriesType = H.seriesType;\n        /**\n         * The scatter series type\n         */\n        seriesType('scatter', 'line', {\n            lineWidth: 0,\n            findNearestPointBy: 'xy',\n            marker: {\n                enabled: true // Overrides auto-enabling in line series (#3647)\n            },\n            tooltip: {\n\n                headerFormat: '<span style=\"color:{point.color}\">\\u25CF</span> ' +\n                    '<span style=\"font-size: 0.85em\"> {series.name}</span><br/>',\n\n                pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'\n            }\n\n            // Prototype members\n        }, {\n            sorted: false,\n            requireSorting: false,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n            takeOrdinalPosition: false, // #2342\n            drawGraph: function() {\n                if (this.options.lineWidth) {\n                    Series.prototype.drawGraph.call(this);\n                }\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var pick = H.pick,\n            relativeLength = H.relativeLength;\n\n        H.CenteredSeriesMixin = {\n            /**\n             * Get the center of the pie based on the size and center options relative to the\n             * plot area. Borrowed by the polar and gauge series types.\n             */\n            getCenter: function() {\n\n                var options = this.options,\n                    chart = this.chart,\n                    slicingRoom = 2 * (options.slicedOffset || 0),\n                    handleSlicingRoom,\n                    plotWidth = chart.plotWidth - 2 * slicingRoom,\n                    plotHeight = chart.plotHeight - 2 * slicingRoom,\n                    centerOption = options.center,\n                    positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],\n                    smallestSize = Math.min(plotWidth, plotHeight),\n                    i,\n                    value;\n\n                for (i = 0; i < 4; ++i) {\n                    value = positions[i];\n                    handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n\n                    // i == 0: centerX, relative to width\n                    // i == 1: centerY, relative to height\n                    // i == 2: size, relative to smallestSize\n                    // i == 3: innerSize, relative to size\n                    positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) +\n                        (handleSlicingRoom ? slicingRoom : 0);\n\n                }\n                // innerSize cannot be larger than size (#3632)\n                if (positions[3] > positions[2]) {\n                    positions[3] = positions[2];\n                }\n                return positions;\n            }\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            CenteredSeriesMixin = H.CenteredSeriesMixin,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            inArray = H.inArray,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            noop = H.noop,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes,\n            setAnimation = H.setAnimation;\n\n        /**\n         * The pie series type.\n         *\n         * @constructor seriesTypes.pie\n         * @augments Series\n         */\n        seriesType('pie', 'line', {\n            center: [null, null],\n            clip: false,\n            colorByPoint: true, // always true for pies\n            dataLabels: {\n                // align: null,\n                // connectorWidth: 1,\n                // connectorColor: point.color,\n                // connectorPadding: 5,\n                distance: 30,\n                enabled: true,\n                formatter: function() { // #2945\n                    return this.point.isNull ? undefined : this.point.name;\n                },\n                // softConnector: true,\n                x: 0\n                // y: 0\n            },\n            ignoreHiddenPoint: true,\n            //innerSize: 0,\n            legendType: 'point',\n            marker: null, // point options are specified in the base options\n            size: null,\n            showInLegend: false,\n            slicedOffset: 10,\n            stickyTracking: false,\n            tooltip: {\n                followPointer: true\n            },\n\n            borderColor: '#ffffff',\n            borderWidth: 1,\n            states: {\n                hover: {\n                    brightness: 0.1,\n                    shadow: false\n                }\n            }\n\n\n        }, /** @lends seriesTypes.pie.prototype */ {\n            isCartesian: false,\n            requireSorting: false,\n            directTouch: true,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            axisTypes: [],\n            pointAttribs: seriesTypes.column.prototype.pointAttribs,\n            /**\n             * Animate the pies in\n             */\n            animate: function(init) {\n                var series = this,\n                    points = series.points,\n                    startAngleRad = series.startAngleRad;\n\n                if (!init) {\n                    each(points, function(point) {\n                        var graphic = point.graphic,\n                            args = point.shapeArgs;\n\n                        if (graphic) {\n                            // start values\n                            graphic.attr({\n                                r: point.startR || (series.center[3] / 2), // animate from inner radius (#779)\n                                start: startAngleRad,\n                                end: startAngleRad\n                            });\n\n                            // animate\n                            graphic.animate({\n                                r: args.r,\n                                start: args.start,\n                                end: args.end\n                            }, series.options.animation);\n                        }\n                    });\n\n                    // delete this function to allow it only once\n                    series.animate = null;\n                }\n            },\n\n            /**\n             * Recompute total chart sum and update percentages of points.\n             */\n            updateTotals: function() {\n                var i,\n                    total = 0,\n                    points = this.points,\n                    len = points.length,\n                    point,\n                    ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n\n                // Get the total sum\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    total += (ignoreHiddenPoint && !point.visible) ?\n                        0 :\n                        point.isNull ? 0 : point.y;\n                }\n                this.total = total;\n\n                // Set each point's properties\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    point.percentage = (total > 0 && (point.visible || !ignoreHiddenPoint)) ? point.y / total * 100 : 0;\n                    point.total = total;\n                }\n            },\n\n            /**\n             * Extend the generatePoints method by adding total and percentage properties to each point\n             */\n            generatePoints: function() {\n                Series.prototype.generatePoints.call(this);\n                this.updateTotals();\n            },\n\n            /**\n             * Do translation for pie slices\n             */\n            translate: function(positions) {\n                this.generatePoints();\n\n                var series = this,\n                    cumulative = 0,\n                    precision = 1000, // issue #172\n                    options = series.options,\n                    slicedOffset = options.slicedOffset,\n                    connectorOffset = slicedOffset + (options.borderWidth || 0),\n                    finalConnectorOffset,\n                    start,\n                    end,\n                    angle,\n                    startAngle = options.startAngle || 0,\n                    startAngleRad = series.startAngleRad = Math.PI / 180 * (startAngle - 90),\n                    endAngleRad = series.endAngleRad = Math.PI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),\n                    circ = endAngleRad - startAngleRad, //2 * Math.PI,\n                    points = series.points,\n                    radiusX, // the x component of the radius vector for a given point\n                    radiusY,\n                    labelDistance = options.dataLabels.distance,\n                    ignoreHiddenPoint = options.ignoreHiddenPoint,\n                    i,\n                    len = points.length,\n                    point;\n\n                // Get positions - either an integer or a percentage string must be given.\n                // If positions are passed as a parameter, we're in a recursive loop for adjusting\n                // space for data labels.\n                if (!positions) {\n                    series.center = positions = series.getCenter();\n                }\n\n                // Utility for getting the x value from a given y, used for anticollision\n                // logic in data labels.\n                // Added point for using specific points' label distance.\n                series.getX = function(y, left, point) {\n                    angle = Math.asin(Math.min((y - positions[1]) / (positions[2] / 2 + point.labelDistance), 1));\n                    return positions[0] +\n                        (left ? -1 : 1) *\n                        (Math.cos(angle) * (positions[2] / 2 + point.labelDistance));\n                };\n\n                // Calculate the geometry for each point\n                for (i = 0; i < len; i++) {\n\n                    point = points[i];\n\n                    // Used for distance calculation for specific point.\n                    point.labelDistance = pick(\n                        point.options.dataLabels && point.options.dataLabels.distance,\n                        labelDistance\n                    );\n\n                    // Saved for later dataLabels distance calculation.\n                    series.maxLabelDistance = Math.max(series.maxLabelDistance || 0, point.labelDistance);\n\n                    // set start and end angle\n                    start = startAngleRad + (cumulative * circ);\n                    if (!ignoreHiddenPoint || point.visible) {\n                        cumulative += point.percentage / 100;\n                    }\n                    end = startAngleRad + (cumulative * circ);\n\n                    // set the shape\n                    point.shapeType = 'arc';\n                    point.shapeArgs = {\n                        x: positions[0],\n                        y: positions[1],\n                        r: positions[2] / 2,\n                        innerR: positions[3] / 2,\n                        start: Math.round(start * precision) / precision,\n                        end: Math.round(end * precision) / precision\n                    };\n\n                    // The angle must stay within -90 and 270 (#2645)\n                    angle = (end + start) / 2;\n                    if (angle > 1.5 * Math.PI) {\n                        angle -= 2 * Math.PI;\n                    } else if (angle < -Math.PI / 2) {\n                        angle += 2 * Math.PI;\n                    }\n\n                    // Center for the sliced out slice\n                    point.slicedTranslation = {\n                        translateX: Math.round(Math.cos(angle) * slicedOffset),\n                        translateY: Math.round(Math.sin(angle) * slicedOffset)\n                    };\n\n                    // set the anchor point for tooltips\n                    radiusX = Math.cos(angle) * positions[2] / 2;\n                    radiusY = Math.sin(angle) * positions[2] / 2;\n                    point.tooltipPos = [\n                        positions[0] + radiusX * 0.7,\n                        positions[1] + radiusY * 0.7\n                    ];\n\n                    point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ? 1 : 0;\n                    point.angle = angle;\n\n                    // Set the anchor point for data labels. Use point.labelDistance \n                    // instead of labelDistance // #1174\n                    // finalConnectorOffset - not override connectorOffset value.\n                    finalConnectorOffset = Math.min(connectorOffset, point.labelDistance / 5); // #1678\n                    point.labelPos = [\n                        positions[0] + radiusX + Math.cos(angle) * point.labelDistance, // first break of connector\n                        positions[1] + radiusY + Math.sin(angle) * point.labelDistance, // a/a\n                        positions[0] + radiusX + Math.cos(angle) * finalConnectorOffset, // second break, right outside pie\n                        positions[1] + radiusY + Math.sin(angle) * finalConnectorOffset, // a/a\n                        positions[0] + radiusX, // landing point for connector\n                        positions[1] + radiusY, // a/a\n                        point.labelDistance < 0 ? // alignment\n                        'center' :\n                        point.half ? 'right' : 'left', // alignment\n                        angle // center angle\n                    ];\n\n                }\n            },\n\n            drawGraph: null,\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    groupTranslation,\n                    //center,\n                    graphic,\n                    //group,\n                    pointAttr,\n                    shapeArgs;\n\n\n                var shadow = series.options.shadow;\n                if (shadow && !series.shadowGroup) {\n                    series.shadowGroup = renderer.g('shadow')\n                        .add(series.group);\n                }\n\n\n                // draw the slices\n                each(series.points, function(point) {\n                    if (!point.isNull) {\n                        graphic = point.graphic;\n                        shapeArgs = point.shapeArgs;\n\n\n                        // If the point is sliced, use special translation, else use\n                        // plot area traslation\n                        groupTranslation = point.getTranslate();\n\n\n                        // Put the shadow behind all points\n                        var shadowGroup = point.shadowGroup;\n                        if (shadow && !shadowGroup) {\n                            shadowGroup = point.shadowGroup = renderer.g('shadow')\n                                .add(series.shadowGroup);\n                        }\n\n                        if (shadowGroup) {\n                            shadowGroup.attr(groupTranslation);\n                        }\n                        pointAttr = series.pointAttribs(point, point.selected && 'select');\n\n\n                        // Draw the slice\n                        if (graphic) {\n                            graphic\n                                .setRadialReference(series.center)\n\n                                .attr(pointAttr)\n\n                                .animate(extend(shapeArgs, groupTranslation));\n                        } else {\n\n                            point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n                                .setRadialReference(series.center)\n                                .attr(groupTranslation)\n                                .add(series.group);\n\n                            if (!point.visible) {\n                                graphic.attr({\n                                    visibility: 'hidden'\n                                });\n                            }\n\n\n                            graphic\n                                .attr(pointAttr)\n                                .attr({\n                                    'stroke-linejoin': 'round'\n                                })\n                                .shadow(shadow, shadowGroup);\n\n                        }\n\n                        graphic.addClass(point.getClassName());\n\n                    }\n                });\n\n            },\n\n\n            searchPoint: noop,\n\n            /**\n             * Utility for sorting data labels\n             */\n            sortByAngle: function(points, sign) {\n                points.sort(function(a, b) {\n                    return a.angle !== undefined && (b.angle - a.angle) * sign;\n                });\n            },\n\n            /**\n             * Use a simple symbol from LegendSymbolMixin\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n            /**\n             * Use the getCenter method from drawLegendSymbol\n             */\n            getCenter: CenteredSeriesMixin.getCenter,\n\n            /**\n             * Pies don't have point marker symbols\n             */\n            getSymbol: noop\n\n\n            /**\n             * @constructor seriesTypes.pie.prototype.pointClass\n             * @extends {Point}\n             */\n        }, /** @lends seriesTypes.pie.prototype.pointClass.prototype */ {\n            /**\n             * Initiate the pie slice\n             */\n            init: function() {\n\n                Point.prototype.init.apply(this, arguments);\n\n                var point = this,\n                    toggleSlice;\n\n                point.name = pick(point.name, 'Slice');\n\n                // add event listener for select\n                toggleSlice = function(e) {\n                    point.slice(e.type === 'select');\n                };\n                addEvent(point, 'select', toggleSlice);\n                addEvent(point, 'unselect', toggleSlice);\n\n                return point;\n            },\n\n            /**\n             * Negative points are not valid (#1530, #3623, #5322)\n             */\n            isValid: function() {\n                return H.isNumber(this.y, true) && this.y >= 0;\n            },\n\n            /**\n             * Toggle the visibility of the pie slice\n             * @param {Boolean} vis Whether to show the slice or not. If undefined, the\n             *    visibility is toggled\n             */\n            setVisible: function(vis, redraw) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    ignoreHiddenPoint = series.options.ignoreHiddenPoint;\n\n                redraw = pick(redraw, ignoreHiddenPoint);\n\n                if (vis !== point.visible) {\n\n                    // If called without an argument, toggle visibility\n                    point.visible = point.options.visible = vis = vis === undefined ? !point.visible : vis;\n                    series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n                    // Show and hide associated elements. This is performed regardless of redraw or not,\n                    // because chart.redraw only handles full series.\n                    each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function(key) {\n                        if (point[key]) {\n                            point[key][vis ? 'show' : 'hide'](true);\n                        }\n                    });\n\n                    if (point.legendItem) {\n                        chart.legend.colorizeItem(point, vis);\n                    }\n\n                    // #4170, hide halo after hiding point\n                    if (!vis && point.state === 'hover') {\n                        point.setState('');\n                    }\n\n                    // Handle ignore hidden slices\n                    if (ignoreHiddenPoint) {\n                        series.isDirty = true;\n                    }\n\n                    if (redraw) {\n                        chart.redraw();\n                    }\n                }\n            },\n\n            /**\n             * Set or toggle whether the slice is cut out from the pie\n             * @param {Boolean} sliced When undefined, the slice state is toggled\n             * @param {Boolean} redraw Whether to redraw the chart. True by default.\n             */\n            slice: function(sliced, redraw, animation) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n\n                setAnimation(animation, chart);\n\n                // redraw is true by default\n                redraw = pick(redraw, true);\n\n                // if called without an argument, toggle\n                point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;\n                series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n                point.graphic.animate(this.getTranslate());\n\n\n                if (point.shadowGroup) {\n                    point.shadowGroup.animate(this.getTranslate());\n                }\n\n            },\n\n            getTranslate: function() {\n                return this.sliced ? this.slicedTranslation : {\n                    translateX: 0,\n                    translateY: 0\n                };\n            },\n\n            haloPath: function(size) {\n                var shapeArgs = this.shapeArgs;\n\n                return this.sliced || !this.visible ? [] :\n                    this.series.chart.renderer.symbols.arc(\n                        shapeArgs.x,\n                        shapeArgs.y,\n                        shapeArgs.r + size,\n                        shapeArgs.r + size, {\n                            innerR: this.shapeArgs.r,\n                            start: shapeArgs.start,\n                            end: shapeArgs.end\n                        }\n                    );\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            arrayMax = H.arrayMax,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            map = H.map,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            relativeLength = H.relativeLength,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            stableSort = H.stableSort;\n\n\n        /**\n         * Generatl distribution algorithm for distributing labels of differing size along a\n         * confined length in two dimensions. The algorithm takes an array of objects containing\n         * a size, a target and a rank. It will place the labels as close as possible to their \n         * targets, skipping the lowest ranked labels if necessary.\n         */\n        H.distribute = function(boxes, len) {\n\n            var i,\n                overlapping = true,\n                origBoxes = boxes, // Original array will be altered with added .pos\n                restBoxes = [], // The outranked overshoot\n                box,\n                target,\n                total = 0;\n\n            function sortByTarget(a, b) {\n                return a.target - b.target;\n            }\n\n            // If the total size exceeds the len, remove those boxes with the lowest rank\n            i = boxes.length;\n            while (i--) {\n                total += boxes[i].size;\n            }\n\n            // Sort by rank, then slice away overshoot\n            if (total > len) {\n                stableSort(boxes, function(a, b) {\n                    return (b.rank || 0) - (a.rank || 0);\n                });\n                i = 0;\n                total = 0;\n                while (total <= len) {\n                    total += boxes[i].size;\n                    i++;\n                }\n                restBoxes = boxes.splice(i - 1, boxes.length);\n            }\n\n            // Order by target\n            stableSort(boxes, sortByTarget);\n\n\n            // So far we have been mutating the original array. Now\n            // create a copy with target arrays\n            boxes = map(boxes, function(box) {\n                return {\n                    size: box.size,\n                    targets: [box.target]\n                };\n            });\n\n            while (overlapping) {\n                // Initial positions: target centered in box\n                i = boxes.length;\n                while (i--) {\n                    box = boxes[i];\n                    // Composite box, average of targets\n                    target = (Math.min.apply(0, box.targets) + Math.max.apply(0, box.targets)) / 2;\n                    box.pos = Math.min(Math.max(0, target - box.size / 2), len - box.size);\n                }\n\n                // Detect overlap and join boxes\n                i = boxes.length;\n                overlapping = false;\n                while (i--) {\n                    if (i > 0 && boxes[i - 1].pos + boxes[i - 1].size > boxes[i].pos) { // Overlap\n                        boxes[i - 1].size += boxes[i].size; // Add this size to the previous box\n                        boxes[i - 1].targets = boxes[i - 1].targets.concat(boxes[i].targets);\n\n                        // Overlapping right, push left\n                        if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n                            boxes[i - 1].pos = len - boxes[i - 1].size;\n                        }\n                        boxes.splice(i, 1); // Remove this item\n                        overlapping = true;\n                    }\n                }\n            }\n\n            // Now the composite boxes are placed, we need to put the original boxes within them\n            i = 0;\n            each(boxes, function(box) {\n                var posInCompositeBox = 0;\n                each(box.targets, function() {\n                    origBoxes[i].pos = box.pos + posInCompositeBox;\n                    posInCompositeBox += origBoxes[i].size;\n                    i++;\n                });\n            });\n\n            // Add the rest (hidden) boxes and sort by target\n            origBoxes.push.apply(origBoxes, restBoxes);\n            stableSort(origBoxes, sortByTarget);\n        };\n\n\n        /**\n         * Draw the data labels\n         */\n        Series.prototype.drawDataLabels = function() {\n            var series = this,\n                seriesOptions = series.options,\n                options = seriesOptions.dataLabels,\n                points = series.points,\n                pointOptions,\n                generalOptions,\n                hasRendered = series.hasRendered || 0,\n                str,\n                dataLabelsGroup,\n                defer = pick(options.defer, !!seriesOptions.animation),\n                renderer = series.chart.renderer;\n\n            if (options.enabled || series._hasPointLabels) {\n\n                // Process default alignment of data labels for columns\n                if (series.dlProcessOptions) {\n                    series.dlProcessOptions(options);\n                }\n\n                // Create a separate group for the data labels to avoid rotation\n                dataLabelsGroup = series.plotGroup(\n                    'dataLabelsGroup',\n                    'data-labels',\n                    defer && !hasRendered ? 'hidden' : 'visible', // #5133\n                    options.zIndex || 6\n                );\n\n                if (defer) {\n                    dataLabelsGroup.attr({\n                        opacity: +hasRendered\n                    }); // #3300\n                    if (!hasRendered) {\n                        addEvent(series, 'afterAnimate', function() {\n                            if (series.visible) { // #2597, #3023, #3024\n                                dataLabelsGroup.show(true);\n                            }\n                            dataLabelsGroup[seriesOptions.animation ? 'animate' : 'attr']({\n                                opacity: 1\n                            }, {\n                                duration: 200\n                            });\n                        });\n                    }\n                }\n\n                // Make the labels for each point\n                generalOptions = options;\n                each(points, function(point) {\n                    var enabled,\n                        dataLabel = point.dataLabel,\n                        labelConfig,\n                        attr,\n                        rotation,\n                        connector = point.connector,\n                        isNew = !dataLabel,\n                        style;\n                    // Determine if each data label is enabled\n                    // @note dataLabelAttribs (like pointAttribs) would eradicate\n                    // the need for dlOptions, and simplify the section below.\n                    pointOptions = point.dlOptions || (point.options && point.options.dataLabels); // dlOptions is used in treemaps\n                    enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled) && point.y !== null; // #2282, #4641\n                    if (enabled) {\n                        // Create individual options structure that can be extended without\n                        // affecting others\n                        options = merge(generalOptions, pointOptions);\n                        labelConfig = point.getLabelConfig();\n                        str = options.format ?\n                            format(options.format, labelConfig) :\n                            options.formatter.call(labelConfig, options);\n                        style = options.style;\n                        rotation = options.rotation;\n\n                        // Determine the color\n                        style.color = pick(options.color, style.color, series.color, '#000000');\n                        // Get automated contrast color\n                        if (style.color === 'contrast') {\n                            point.contrastColor = renderer.getContrast(point.color || series.color);\n                            style.color = options.inside || pick(point.labelDistance, options.distance) < 0 ||\n                                !!seriesOptions.stacking ? point.contrastColor : '#000000';\n                        }\n                        if (seriesOptions.cursor) {\n                            style.cursor = seriesOptions.cursor;\n                        }\n\n\n                        attr = {\n                            //align: align,\n\n                            fill: options.backgroundColor,\n                            stroke: options.borderColor,\n                            'stroke-width': options.borderWidth,\n\n                            r: options.borderRadius || 0,\n                            rotation: rotation,\n                            padding: options.padding,\n                            zIndex: 1\n                        };\n\n                        // Remove unused attributes (#947)\n                        H.objectEach(attr, function(val, name) {\n                            if (val === undefined) {\n                                delete attr[name];\n                            }\n                        });\n                    }\n                    // If the point is outside the plot area, destroy it. #678, #820\n                    if (dataLabel && (!enabled || !defined(str))) {\n                        point.dataLabel = dataLabel = dataLabel.destroy();\n                        if (connector) {\n                            point.connector = connector.destroy();\n                        }\n                        // Individual labels are disabled if the are explicitly disabled\n                        // in the point options, or if they fall outside the plot area.\n                    } else if (enabled && defined(str)) {\n                        // create new label\n                        if (!dataLabel) {\n                            dataLabel = point.dataLabel = renderer[rotation ? 'text' : 'label']( // labels don't support rotation\n                                str,\n                                0, -9999,\n                                options.shape,\n                                null,\n                                null,\n                                options.useHTML,\n                                null,\n                                'data-label'\n                            );\n                            dataLabel.addClass(\n                                'highcharts-data-label-color-' + point.colorIndex +\n                                ' ' + (options.className || '') +\n                                (options.useHTML ? 'highcharts-tracker' : '') // #3398\n                            );\n                        } else {\n                            attr.text = str;\n                        }\n                        dataLabel.attr(attr);\n\n                        // Styles must be applied before add in order to read text bounding box\n                        dataLabel.css(style).shadow(options.shadow);\n\n\n                        if (!dataLabel.added) {\n                            dataLabel.add(dataLabelsGroup);\n                        }\n                        // Now the data label is created and placed at 0,0, so we need to align it\n                        series.alignDataLabel(point, dataLabel, options, null, isNew);\n                    }\n                });\n            }\n        };\n\n        /**\n         * Align each individual data label\n         */\n        Series.prototype.alignDataLabel = function(point, dataLabel, options, alignTo, isNew) {\n            var chart = this.chart,\n                inverted = chart.inverted,\n                plotX = pick(point.plotX, -9999),\n                plotY = pick(point.plotY, -9999),\n                bBox = dataLabel.getBBox(),\n                fontSize,\n                baseline,\n                rotation = options.rotation,\n                normRotation,\n                negRotation,\n                align = options.align,\n                rotCorr, // rotation correction\n                // Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)\n                visible =\n                this.visible &&\n                (\n                    point.series.forceDL ||\n                    chart.isInsidePlot(plotX, Math.round(plotY), inverted) ||\n                    (\n                        alignTo && chart.isInsidePlot(\n                            plotX,\n                            inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1,\n                            inverted\n                        )\n                    )\n                ),\n                alignAttr, // the final position;\n                justify = pick(options.overflow, 'justify') === 'justify';\n\n            if (visible) {\n\n\n                fontSize = options.style.fontSize;\n\n\n                baseline = chart.renderer.fontMetrics(fontSize, dataLabel).b;\n\n                // The alignment box is a singular point\n                alignTo = extend({\n                    x: inverted ? chart.plotWidth - plotY : plotX,\n                    y: Math.round(inverted ? chart.plotHeight - plotX : plotY),\n                    width: 0,\n                    height: 0\n                }, alignTo);\n\n                // Add the text size for alignment calculation\n                extend(options, {\n                    width: bBox.width,\n                    height: bBox.height\n                });\n\n                // Allow a hook for changing alignment in the last moment, then do the alignment\n                if (rotation) {\n                    justify = false; // Not supported for rotated text\n                    rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723\n                    alignAttr = {\n                        x: alignTo.x + options.x + alignTo.width / 2 + rotCorr.x,\n                        y: alignTo.y + options.y + {\n                            top: 0,\n                            middle: 0.5,\n                            bottom: 1\n                        }[options.verticalAlign] * alignTo.height\n                    };\n                    dataLabel[isNew ? 'attr' : 'animate'](alignAttr)\n                        .attr({ // #3003\n                            align: align\n                        });\n\n                    // Compensate for the rotated label sticking out on the sides\n                    normRotation = (rotation + 720) % 360;\n                    negRotation = normRotation > 180 && normRotation < 360;\n\n                    if (align === 'left') {\n                        alignAttr.y -= negRotation ? bBox.height : 0;\n                    } else if (align === 'center') {\n                        alignAttr.x -= bBox.width / 2;\n                        alignAttr.y -= bBox.height / 2;\n                    } else if (align === 'right') {\n                        alignAttr.x -= bBox.width;\n                        alignAttr.y -= negRotation ? 0 : bBox.height;\n                    }\n\n\n                } else {\n                    dataLabel.align(options, null, alignTo);\n                    alignAttr = dataLabel.alignAttr;\n                }\n\n                // Handle justify or crop\n                if (justify) {\n                    point.isLabelJustified = this.justifyDataLabel(\n                        dataLabel,\n                        options,\n                        alignAttr,\n                        bBox,\n                        alignTo,\n                        isNew\n                    );\n\n                    // Now check that the data label is within the plot area\n                } else if (pick(options.crop, true)) {\n                    visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n                }\n\n                // When we're using a shape, make it possible with a connector or an arrow pointing to thie point\n                if (options.shape && !rotation) {\n                    dataLabel[isNew ? 'attr' : 'animate']({\n                        anchorX: inverted ? chart.plotWidth - point.plotY : point.plotX,\n                        anchorY: inverted ? chart.plotHeight - point.plotX : point.plotY\n                    });\n                }\n            }\n\n            // Show or hide based on the final aligned position\n            if (!visible) {\n                dataLabel.attr({\n                    y: -9999\n                });\n                dataLabel.placed = false; // don't animate back in\n            }\n\n        };\n\n        /**\n         * If data labels fall partly outside the plot area, align them back in, in a way that\n         * doesn't hide the point.\n         */\n        Series.prototype.justifyDataLabel = function(dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n            var chart = this.chart,\n                align = options.align,\n                verticalAlign = options.verticalAlign,\n                off,\n                justified,\n                padding = dataLabel.box ? 0 : (dataLabel.padding || 0);\n\n            // Off left\n            off = alignAttr.x + padding;\n            if (off < 0) {\n                if (align === 'right') {\n                    options.align = 'left';\n                } else {\n                    options.x = -off;\n                }\n                justified = true;\n            }\n\n            // Off right\n            off = alignAttr.x + bBox.width - padding;\n            if (off > chart.plotWidth) {\n                if (align === 'left') {\n                    options.align = 'right';\n                } else {\n                    options.x = chart.plotWidth - off;\n                }\n                justified = true;\n            }\n\n            // Off top\n            off = alignAttr.y + padding;\n            if (off < 0) {\n                if (verticalAlign === 'bottom') {\n                    options.verticalAlign = 'top';\n                } else {\n                    options.y = -off;\n                }\n                justified = true;\n            }\n\n            // Off bottom\n            off = alignAttr.y + bBox.height - padding;\n            if (off > chart.plotHeight) {\n                if (verticalAlign === 'top') {\n                    options.verticalAlign = 'bottom';\n                } else {\n                    options.y = chart.plotHeight - off;\n                }\n                justified = true;\n            }\n\n            if (justified) {\n                dataLabel.placed = !isNew;\n                dataLabel.align(options, null, alignTo);\n            }\n\n            return justified;\n        };\n\n        /**\n         * Override the base drawDataLabels method by pie specific functionality\n         */\n        if (seriesTypes.pie) {\n            seriesTypes.pie.prototype.drawDataLabels = function() {\n                var series = this,\n                    data = series.data,\n                    point,\n                    chart = series.chart,\n                    options = series.options.dataLabels,\n                    connectorPadding = pick(options.connectorPadding, 10),\n                    connectorWidth = pick(options.connectorWidth, 1),\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    connector,\n                    seriesCenter = series.center,\n                    radius = seriesCenter[2] / 2,\n                    centerY = seriesCenter[1],\n                    dataLabel,\n                    dataLabelWidth,\n                    labelPos,\n                    labelHeight,\n                    halves = [ // divide the points into right and left halves for anti collision\n                        [], // right\n                        [] // left\n                    ],\n                    x,\n                    y,\n                    visibility,\n                    j,\n                    overflow = [0, 0, 0, 0]; // top, right, bottom, left\n\n                // get out if not enabled\n                if (!series.visible || (!options.enabled && !series._hasPointLabels)) {\n                    return;\n                }\n\n                // Reset all labels that have been shortened\n                each(data, function(point) {\n                    if (point.dataLabel && point.visible && point.dataLabel.shortened) {\n                        point.dataLabel\n                            .attr({\n                                width: 'auto'\n                            }).css({\n                                width: 'auto',\n                                textOverflow: 'clip'\n                            });\n                        point.dataLabel.shortened = false;\n                    }\n                });\n\n\n                // run parent method\n                Series.prototype.drawDataLabels.apply(series);\n\n                each(data, function(point) {\n                    if (point.dataLabel && point.visible) { // #407, #2510\n\n                        // Arrange points for detection collision\n                        halves[point.half].push(point);\n\n                        // Reset positions (#4905)\n                        point.dataLabel._pos = null;\n                    }\n                });\n\n                /* Loop over the points in each half, starting from the top and bottom\n                 * of the pie to detect overlapping labels.\n                 */\n                each(halves, function(points, i) {\n\n                    var top,\n                        bottom,\n                        length = points.length,\n                        positions = [],\n                        naturalY,\n                        sideOverflow,\n                        positionsIndex, // Point index in positions array.\n                        size;\n\n                    if (!length) {\n                        return;\n                    }\n\n                    // Sort by angle\n                    series.sortByAngle(points, i - 0.5);\n                    // Only do anti-collision when we have dataLabels outside the pie \n                    // and have connectors. (#856)\n                    if (series.maxLabelDistance > 0) {\n                        top = Math.max(\n                            0,\n                            centerY - radius - series.maxLabelDistance\n                        );\n                        bottom = Math.min(\n                            centerY + radius + series.maxLabelDistance,\n                            chart.plotHeight\n                        );\n                        each(points, function(point) {\n                            // check if specific points' label is outside the pie\n                            if (point.labelDistance > 0 && point.dataLabel) {\n                                // point.top depends on point.labelDistance value\n                                // Used for calculation of y value in getX method \n                                point.top = Math.max(\n                                    0,\n                                    centerY - radius - point.labelDistance\n                                );\n                                point.bottom = Math.min(\n                                    centerY + radius + point.labelDistance,\n                                    chart.plotHeight\n                                );\n                                size = point.dataLabel.getBBox().height || 21;\n\n                                // point.positionsIndex is needed for getting index of \n                                // parameter related to specific point inside positions \n                                // array - not every point is in positions array.\n                                point.positionsIndex = positions.push({\n                                    target: point.labelPos[1] - point.top + size / 2,\n                                    size: size,\n                                    rank: point.y\n                                }) - 1;\n                            }\n                        });\n                        H.distribute(positions, bottom + size - top);\n                    }\n\n                    // Now the used slots are sorted, fill them up sequentially\n                    for (j = 0; j < length; j++) {\n\n                        point = points[j];\n                        positionsIndex = point.positionsIndex;\n                        labelPos = point.labelPos;\n                        dataLabel = point.dataLabel;\n                        visibility = point.visible === false ? 'hidden' : 'inherit';\n                        naturalY = labelPos[1];\n\n                        if (positions && defined(positions[positionsIndex])) {\n                            if (positions[positionsIndex].pos === undefined) {\n                                visibility = 'hidden';\n                            } else {\n                                labelHeight = positions[positionsIndex].size;\n                                y = point.top + positions[positionsIndex].pos;\n                            }\n\n                        } else {\n                            y = naturalY;\n                        }\n\n                        // It is needed to delete point.positionIndex for \n                        // dynamically added points etc.\n\n                        delete point.positionIndex;\n\n                        // get the x - use the natural x position for labels near the \n                        // top and bottom, to prevent the top and botton slice connectors \n                        // from touching each other on either side\n                        if (options.justify) {\n                            x = seriesCenter[0] + (i ? -1 : 1) * (radius + point.labelDistance);\n                        } else {\n                            x = series.getX(y < point.top + 2 || y > point.bottom - 2 ? naturalY : y, i, point);\n                        }\n\n\n                        // Record the placement and visibility\n                        dataLabel._attr = {\n                            visibility: visibility,\n                            align: labelPos[6]\n                        };\n                        dataLabel._pos = {\n                            x: x + options.x +\n                                ({\n                                    left: connectorPadding,\n                                    right: -connectorPadding\n                                }[labelPos[6]] || 0),\n                            y: y + options.y - 10 // 10 is for the baseline (label vs text)\n                        };\n                        labelPos.x = x;\n                        labelPos.y = y;\n\n\n                        // Detect overflowing data labels\n                        dataLabelWidth = dataLabel.getBBox().width;\n\n                        sideOverflow = null;\n                        // Overflow left\n                        if (x - dataLabelWidth < connectorPadding) {\n                            sideOverflow = Math.round(\n                                dataLabelWidth - x + connectorPadding\n                            );\n                            overflow[3] = Math.max(sideOverflow, overflow[3]);\n\n                            // Overflow right\n                        } else if (x + dataLabelWidth > plotWidth - connectorPadding) {\n                            sideOverflow = Math.round(\n                                x + dataLabelWidth - plotWidth + connectorPadding\n                            );\n                            overflow[1] = Math.max(sideOverflow, overflow[1]);\n                        }\n\n                        // Overflow top\n                        if (y - labelHeight / 2 < 0) {\n                            overflow[0] = Math.max(\n                                Math.round(-y + labelHeight / 2),\n                                overflow[0]\n                            );\n\n                            // Overflow left\n                        } else if (y + labelHeight / 2 > plotHeight) {\n                            overflow[2] = Math.max(\n                                Math.round(y + labelHeight / 2 - plotHeight),\n                                overflow[2]\n                            );\n                        }\n                        dataLabel.sideOverflow = sideOverflow;\n                    } // for each point\n                }); // for each half\n\n                // Do not apply the final placement and draw the connectors until we have verified\n                // that labels are not spilling over.\n                if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {\n\n                    // Place the labels in the final position\n                    this.placeDataLabels();\n\n                    // Draw the connectors\n                    if (connectorWidth) {\n                        each(this.points, function(point) {\n                            var isNew;\n\n                            connector = point.connector;\n                            dataLabel = point.dataLabel;\n\n                            if (\n                                dataLabel &&\n                                dataLabel._pos &&\n                                point.visible &&\n                                point.labelDistance > 0\n                            ) {\n                                visibility = dataLabel._attr.visibility;\n\n                                isNew = !connector;\n\n                                if (isNew) {\n                                    point.connector = connector = chart.renderer.path()\n                                        .addClass('highcharts-data-label-connector highcharts-color-' + point.colorIndex)\n                                        .add(series.dataLabelsGroup);\n\n\n                                    connector.attr({\n                                        'stroke-width': connectorWidth,\n                                        'stroke': options.connectorColor || point.color || '#666666'\n                                    });\n\n                                }\n                                connector[isNew ? 'attr' : 'animate']({\n                                    d: series.connectorPath(point.labelPos)\n                                });\n                                connector.attr('visibility', visibility);\n\n                            } else if (connector) {\n                                point.connector = connector.destroy();\n                            }\n                        });\n                    }\n                }\n            };\n\n            /**\n             * Extendable method for getting the path of the connector between the data label\n             * and the pie slice.\n             */\n            seriesTypes.pie.prototype.connectorPath = function(labelPos) {\n                var x = labelPos.x,\n                    y = labelPos.y;\n                return pick(this.options.dataLabels.softConnector, true) ? [\n                    'M',\n                    x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n                    'C',\n                    x, y, // first break, next to the label\n                    2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ] : [\n                    'M',\n                    x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n                    'L',\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ];\n            };\n\n            /**\n             * Perform the final placement of the data labels after we have verified that they\n             * fall within the plot area.\n             */\n            seriesTypes.pie.prototype.placeDataLabels = function() {\n                each(this.points, function(point) {\n                    var dataLabel = point.dataLabel,\n                        _pos;\n                    if (dataLabel && point.visible) {\n                        _pos = dataLabel._pos;\n                        if (_pos) {\n\n                            // Shorten data labels with ellipsis if they still overflow\n                            // after the pie has reached minSize (#223).\n                            if (dataLabel.sideOverflow) {\n                                dataLabel._attr.width =\n                                    dataLabel.getBBox().width - dataLabel.sideOverflow;\n                                dataLabel.css({\n                                    width: dataLabel._attr.width + 'px',\n                                    textOverflow: 'ellipsis'\n                                });\n                                dataLabel.shortened = true;\n                            }\n\n                            dataLabel.attr(dataLabel._attr);\n                            dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n                            dataLabel.moved = true;\n                        } else if (dataLabel) {\n                            dataLabel.attr({\n                                y: -9999\n                            });\n                        }\n                    }\n                }, this);\n            };\n\n            seriesTypes.pie.prototype.alignDataLabel = noop;\n\n            /**\n             * Verify whether the data labels are allowed to draw, or we should run more translation and data\n             * label positioning to keep them inside the plot area. Returns true when data labels are ready\n             * to draw.\n             */\n            seriesTypes.pie.prototype.verifyDataLabelOverflow = function(overflow) {\n\n                var center = this.center,\n                    options = this.options,\n                    centerOption = options.center,\n                    minSize = options.minSize || 80,\n                    newSize = minSize,\n                    // If a size is set, return true and don't try to shrink the pie\n                    // to fit the labels.\n                    ret = options.size !== null;\n\n                if (!ret) {\n                    // Handle horizontal size and center\n                    if (centerOption[0] !== null) { // Fixed center\n                        newSize = Math.max(center[2] -\n                            Math.max(overflow[1], overflow[3]), minSize);\n\n                    } else { // Auto center\n                        newSize = Math.max(\n                            // horizontal overflow\n                            center[2] - overflow[1] - overflow[3],\n                            minSize\n                        );\n                        // horizontal center\n                        center[0] += (overflow[3] - overflow[1]) / 2;\n                    }\n\n                    // Handle vertical size and center\n                    if (centerOption[1] !== null) { // Fixed center\n                        newSize = Math.max(Math.min(newSize, center[2] -\n                            Math.max(overflow[0], overflow[2])), minSize);\n\n                    } else { // Auto center\n                        newSize = Math.max(\n                            Math.min(\n                                newSize,\n                                // vertical overflow\n                                center[2] - overflow[0] - overflow[2]\n                            ),\n                            minSize\n                        );\n                        // vertical center\n                        center[1] += (overflow[0] - overflow[2]) / 2;\n                    }\n\n                    // If the size must be decreased, we need to run translate and\n                    // drawDataLabels again\n                    if (newSize < center[2]) {\n                        center[2] = newSize;\n                        center[3] = Math.min( // #3632\n                            relativeLength(options.innerSize || 0, newSize),\n                            newSize\n                        );\n                        this.translate(center);\n\n                        if (this.drawDataLabels) {\n                            this.drawDataLabels();\n                        }\n                        // Else, return true to indicate that the pie and its labels is\n                        // within the plot area\n                    } else {\n                        ret = true;\n                    }\n                }\n                return ret;\n            };\n        }\n\n        if (seriesTypes.column) {\n\n            /**\n             * Override the basic data label alignment by adjusting for the position of the column\n             */\n            seriesTypes.column.prototype.alignDataLabel = function(point, dataLabel, options, alignTo, isNew) {\n                var inverted = this.chart.inverted,\n                    series = point.series,\n                    dlBox = point.dlBox || point.shapeArgs, // data label box for alignment\n                    below = pick(point.below, point.plotY > pick(this.translatedThreshold, series.yAxis.len)), // point.below is used in range series\n                    inside = pick(options.inside, !!this.options.stacking), // draw it inside the box?\n                    overshoot;\n\n                // Align to the column itself, or the top of it\n                if (dlBox) { // Area range uses this method but not alignTo\n                    alignTo = merge(dlBox);\n\n                    if (alignTo.y < 0) {\n                        alignTo.height += alignTo.y;\n                        alignTo.y = 0;\n                    }\n                    overshoot = alignTo.y + alignTo.height - series.yAxis.len;\n                    if (overshoot > 0) {\n                        alignTo.height -= overshoot;\n                    }\n\n                    if (inverted) {\n                        alignTo = {\n                            x: series.yAxis.len - alignTo.y - alignTo.height,\n                            y: series.xAxis.len - alignTo.x - alignTo.width,\n                            width: alignTo.height,\n                            height: alignTo.width\n                        };\n                    }\n\n                    // Compute the alignment box\n                    if (!inside) {\n                        if (inverted) {\n                            alignTo.x += below ? 0 : alignTo.width;\n                            alignTo.width = 0;\n                        } else {\n                            alignTo.y += below ? alignTo.height : 0;\n                            alignTo.height = 0;\n                        }\n                    }\n                }\n\n\n                // When alignment is undefined (typically columns and bars), display the individual\n                // point below or above the point depending on the threshold\n                options.align = pick(\n                    options.align, !inverted || inside ? 'center' : below ? 'right' : 'left'\n                );\n                options.verticalAlign = pick(\n                    options.verticalAlign,\n                    inverted || inside ? 'middle' : below ? 'top' : 'bottom'\n                );\n\n                // Call the parent method\n                Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n\n                // If label was justified and we have contrast, set it:\n                if (point.isLabelJustified && point.contrastColor) {\n                    point.dataLabel.css({\n                        color: point.contrastColor\n                    });\n                }\n            };\n        }\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         * Highcharts module to hide overlapping data labels. This module is included in\n         * Highcharts.\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            pick = H.pick,\n            addEvent = H.addEvent;\n\n        // Collect potensial overlapping data labels. Stack labels probably don't need\n        // to be considered because they are usually accompanied by data labels that lie\n        // inside the columns.\n        Chart.prototype.callbacks.push(function(chart) {\n            function collectAndHide() {\n                var labels = [];\n\n                each(chart.series || [], function(series) {\n                    var dlOptions = series.options.dataLabels,\n                        // Range series have two collections\n                        collections = series.dataLabelCollections || ['dataLabel'];\n\n                    if (\n                        (dlOptions.enabled || series._hasPointLabels) &&\n                        !dlOptions.allowOverlap &&\n                        series.visible\n                    ) { // #3866\n                        each(collections, function(coll) {\n                            each(series.points, function(point) {\n                                if (point[coll]) {\n                                    point[coll].labelrank = pick(\n                                        point.labelrank,\n                                        point.shapeArgs && point.shapeArgs.height\n                                    ); // #4118\n                                    labels.push(point[coll]);\n                                }\n                            });\n                        });\n                    }\n                });\n                chart.hideOverlappingLabels(labels);\n            }\n\n            // Do it now ...\n            collectAndHide();\n\n            // ... and after each chart redraw\n            addEvent(chart, 'redraw', collectAndHide);\n\n        });\n\n        /**\n         * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n         * provide a smooth visual imression.\n         */\n        Chart.prototype.hideOverlappingLabels = function(labels) {\n\n            var len = labels.length,\n                label,\n                i,\n                j,\n                label1,\n                label2,\n                isIntersecting,\n                pos1,\n                pos2,\n                parent1,\n                parent2,\n                padding,\n                intersectRect = function(x1, y1, w1, h1, x2, y2, w2, h2) {\n                    return !(\n                        x2 > x1 + w1 ||\n                        x2 + w2 < x1 ||\n                        y2 > y1 + h1 ||\n                        y2 + h2 < y1\n                    );\n                };\n\n            // Mark with initial opacity\n            for (i = 0; i < len; i++) {\n                label = labels[i];\n                if (label) {\n                    label.oldOpacity = label.opacity;\n                    label.newOpacity = 1;\n                }\n            }\n\n            // Prevent a situation in a gradually rising slope, that each label will\n            // hide the previous one because the previous one always has lower rank.\n            labels.sort(function(a, b) {\n                return (b.labelrank || 0) - (a.labelrank || 0);\n            });\n\n            // Detect overlapping labels\n            for (i = 0; i < len; i++) {\n                label1 = labels[i];\n\n                for (j = i + 1; j < len; ++j) {\n                    label2 = labels[j];\n                    if (\n                        label1 && label2 &&\n                        label1 !== label2 && // #6465, polar chart with connectEnds\n                        label1.placed && label2.placed &&\n                        label1.newOpacity !== 0 && label2.newOpacity !== 0\n                    ) {\n                        pos1 = label1.alignAttr;\n                        pos2 = label2.alignAttr;\n                        // Different panes have different positions\n                        parent1 = label1.parentGroup;\n                        parent2 = label2.parentGroup;\n                        // Substract the padding if no background or border (#4333)\n                        padding = 2 * (label1.box ? 0 : label1.padding);\n                        isIntersecting = intersectRect(\n                            pos1.x + parent1.translateX,\n                            pos1.y + parent1.translateY,\n                            label1.width - padding,\n                            label1.height - padding,\n                            pos2.x + parent2.translateX,\n                            pos2.y + parent2.translateY,\n                            label2.width - padding,\n                            label2.height - padding\n                        );\n\n                        if (isIntersecting) {\n                            (label1.labelrank < label2.labelrank ? label1 : label2)\n                            .newOpacity = 0;\n                        }\n                    }\n                }\n            }\n\n            // Hide or show\n            each(labels, function(label) {\n                var complete,\n                    newOpacity;\n\n                if (label) {\n                    newOpacity = label.newOpacity;\n\n                    if (label.oldOpacity !== newOpacity && label.placed) {\n\n                        // Make sure the label is completely hidden to avoid catching\n                        // clicks (#4362)\n                        if (newOpacity) {\n                            label.show(true);\n                        } else {\n                            complete = function() {\n                                label.hide();\n                            };\n                        }\n\n                        // Animate or set the opacity\t\t\t\t\t\n                        label.alignAttr.opacity = newOpacity;\n                        label[label.isOld ? 'animate' : 'attr'](\n                            label.alignAttr,\n                            null,\n                            complete\n                        );\n\n                    }\n                    label.isOld = true;\n                }\n            });\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Chart = H.Chart,\n            createElement = H.createElement,\n            css = H.css,\n            defaultOptions = H.defaultOptions,\n            defaultPlotOptions = H.defaultPlotOptions,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            hasTouch = H.hasTouch,\n            inArray = H.inArray,\n            isObject = H.isObject,\n            Legend = H.Legend,\n            merge = H.merge,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            svg = H.svg,\n            TrackerMixin;\n\n        /**\n         * TrackerMixin for points and graphs.\n         *\n         * @mixin\n         */\n        TrackerMixin = H.TrackerMixin = {\n\n            /**\n             * Draw the tracker for a point.\n             */\n            drawTrackerPoint: function() {\n                var series = this,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    onMouseOver = function(e) {\n                        var point = pointer.getPointFromEvent(e);\n                        // undefined on graph in scatterchart\n                        if (point !== undefined) {\n                            pointer.isDirectTouch = true;\n                            point.onMouseOver(e);\n                        }\n                    };\n\n                // Add reference to the point\n                each(series.points, function(point) {\n                    if (point.graphic) {\n                        point.graphic.element.point = point;\n                    }\n                    if (point.dataLabel) {\n                        if (point.dataLabel.div) {\n                            point.dataLabel.div.point = point;\n                        } else {\n                            point.dataLabel.element.point = point;\n                        }\n                    }\n                });\n\n                // Add the event listeners, we need to do this only once\n                if (!series._hasTracking) {\n                    each(series.trackerGroups, function(key) {\n                        if (series[key]) { // we don't always have dataLabelsGroup\n                            series[key]\n                                .addClass('highcharts-tracker')\n                                .on('mouseover', onMouseOver)\n                                .on('mouseout', function(e) {\n                                    pointer.onTrackerMouseOut(e);\n                                });\n                            if (hasTouch) {\n                                series[key].on('touchstart', onMouseOver);\n                            }\n\n\n                            if (series.options.cursor) {\n                                series[key]\n                                    .css(css)\n                                    .css({\n                                        cursor: series.options.cursor\n                                    });\n                            }\n\n                        }\n                    });\n                    series._hasTracking = true;\n                }\n            },\n\n            /**\n             * Draw the tracker object that sits above all data labels and markers to\n             * track mouse events on the graph or points. For the line type charts\n             * the tracker uses the same graphPath, but with a greater stroke width\n             * for better control.\n             */\n            drawTrackerGraph: function() {\n                var series = this,\n                    options = series.options,\n                    trackByArea = options.trackByArea,\n                    trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),\n                    trackerPathLength = trackerPath.length,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    renderer = chart.renderer,\n                    snap = chart.options.tooltip.snap,\n                    tracker = series.tracker,\n                    i,\n                    onMouseOver = function() {\n                        if (chart.hoverSeries !== series) {\n                            series.onMouseOver();\n                        }\n                    },\n                    /*\n                     * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable\n                     * IE6: 0.002\n                     * IE7: 0.002\n                     * IE8: 0.002\n                     * IE9: 0.00000000001 (unlimited)\n                     * IE10: 0.0001 (exporting only)\n                     * FF: 0.00000000001 (unlimited)\n                     * Chrome: 0.000001\n                     * Safari: 0.000001\n                     * Opera: 0.00000000001 (unlimited)\n                     */\n                    TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n\n                // Extend end points. A better way would be to use round linecaps,\n                // but those are not clickable in VML.\n                if (trackerPathLength && !trackByArea) {\n                    i = trackerPathLength + 1;\n                    while (i--) {\n                        if (trackerPath[i] === 'M') { // extend left side\n                            trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], 'L');\n                        }\n                        if ((i && trackerPath[i] === 'M') || i === trackerPathLength) { // extend right side\n                            trackerPath.splice(i, 0, 'L', trackerPath[i - 2] + snap, trackerPath[i - 1]);\n                        }\n                    }\n                }\n\n                // handle single points\n                /*for (i = 0; i < singlePoints.length; i++) {\n                \tsinglePoint = singlePoints[i];\n                \ttrackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,\n                \tL, singlePoint.plotX + snap, singlePoint.plotY);\n                }*/\n\n                // draw the tracker\n                if (tracker) {\n                    tracker.attr({\n                        d: trackerPath\n                    });\n                } else if (series.graph) { // create\n\n                    series.tracker = renderer.path(trackerPath)\n                        .attr({\n                            'stroke-linejoin': 'round', // #1225\n                            visibility: series.visible ? 'visible' : 'hidden',\n                            stroke: TRACKER_FILL,\n                            fill: trackByArea ? TRACKER_FILL : 'none',\n                            'stroke-width': series.graph.strokeWidth() + (trackByArea ? 0 : 2 * snap),\n                            zIndex: 2\n                        })\n                        .add(series.group);\n\n                    // The tracker is added to the series group, which is clipped, but is covered\n                    // by the marker group. So the marker group also needs to capture events.\n                    each([series.tracker, series.markerGroup], function(tracker) {\n                        tracker.addClass('highcharts-tracker')\n                            .on('mouseover', onMouseOver)\n                            .on('mouseout', function(e) {\n                                pointer.onTrackerMouseOut(e);\n                            });\n\n\n                        if (options.cursor) {\n                            tracker.css({\n                                cursor: options.cursor\n                            });\n                        }\n\n\n                        if (hasTouch) {\n                            tracker.on('touchstart', onMouseOver);\n                        }\n                    });\n                }\n            }\n        };\n        /* End TrackerMixin */\n\n\n        /**\n         * Add tracking event listener to the series group, so the point graphics\n         * themselves act as trackers\n         */\n\n        if (seriesTypes.column) {\n            seriesTypes.column.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n\n        if (seriesTypes.pie) {\n            seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n\n        if (seriesTypes.scatter) {\n            seriesTypes.scatter.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n\n        /*\n         * Extend Legend for item events\n         */\n        extend(Legend.prototype, {\n\n            setItemEvents: function(item, legendItem, useHTML) {\n                var legend = this,\n                    boxWrapper = legend.chart.renderer.boxWrapper,\n                    activeClass = 'highcharts-legend-' + (item.series ? 'point' : 'series') + '-active';\n\n                // Set the events on the item group, or in case of useHTML, the item itself (#1249)\n                (useHTML ? legendItem : item.legendGroup).on('mouseover', function() {\n                        item.setState('hover');\n\n                        // A CSS class to dim or hide other than the hovered series\n                        boxWrapper.addClass(activeClass);\n\n\n                        legendItem.css(legend.options.itemHoverStyle);\n\n                    })\n                    .on('mouseout', function() {\n\n                        legendItem.css(merge(item.visible ? legend.itemStyle : legend.itemHiddenStyle));\n\n\n                        // A CSS class to dim or hide other than the hovered series\n                        boxWrapper.removeClass(activeClass);\n\n                        item.setState();\n                    })\n                    .on('click', function(event) {\n                        var strLegendItemClick = 'legendItemClick',\n                            fnLegendItemClick = function() {\n                                if (item.setVisible) {\n                                    item.setVisible();\n                                }\n                            };\n\n                        // Pass over the click/touch event. #4.\n                        event = {\n                            browserEvent: event\n                        };\n\n                        // click the name or symbol\n                        if (item.firePointEvent) { // point\n                            item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n                        } else {\n                            fireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n                        }\n                    });\n            },\n\n            createCheckboxForItem: function(item) {\n                var legend = this;\n\n                item.checkbox = createElement('input', {\n                    type: 'checkbox',\n                    checked: item.selected,\n                    defaultChecked: item.selected // required by IE7\n                }, legend.options.itemCheckboxStyle, legend.chart.container);\n\n                addEvent(item.checkbox, 'click', function(event) {\n                    var target = event.target;\n                    fireEvent(\n                        item.series || item,\n                        'checkboxClick', { // #3712\n                            checked: target.checked,\n                            item: item\n                        },\n                        function() {\n                            item.select();\n                        }\n                    );\n                });\n            }\n        });\n\n\n\n        // Add pointer cursor to legend itemstyle in defaultOptions\n        defaultOptions.legend.itemStyle.cursor = 'pointer';\n\n\n\n        /*\n         * Extend the Chart object with interaction\n         */\n\n        extend(Chart.prototype, /** @lends Chart.prototype */ {\n            /**\n             * Display the zoom button\n             */\n            showResetZoom: function() {\n                var chart = this,\n                    lang = defaultOptions.lang,\n                    btnOptions = chart.options.chart.resetZoomButton,\n                    theme = btnOptions.theme,\n                    states = theme.states,\n                    alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';\n\n                function zoomOut() {\n                    chart.zoomOut();\n                }\n\n                this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)\n                    .attr({\n                        align: btnOptions.position.align,\n                        title: lang.resetZoomTitle\n                    })\n                    .addClass('highcharts-reset-zoom')\n                    .add()\n                    .align(btnOptions.position, false, alignTo);\n\n            },\n\n            /**\n             * Zoom out to 1:1\n             */\n            zoomOut: function() {\n                var chart = this;\n                fireEvent(chart, 'selection', {\n                    resetSelection: true\n                }, function() {\n                    chart.zoom();\n                });\n            },\n\n            /**\n             * Zoom into a given portion of the chart given by axis coordinates\n             * @param {Object} event\n             */\n            zoom: function(event) {\n                var chart = this,\n                    hasZoomed,\n                    pointer = chart.pointer,\n                    displayButton = false,\n                    resetZoomButton;\n\n                // If zoom is called with no arguments, reset the axes\n                if (!event || event.resetSelection) {\n                    each(chart.axes, function(axis) {\n                        hasZoomed = axis.zoom();\n                    });\n                } else { // else, zoom in on all axes\n                    each(event.xAxis.concat(event.yAxis), function(axisData) {\n                        var axis = axisData.axis,\n                            isXAxis = axis.isXAxis;\n\n                        // don't zoom more than minRange\n                        if (pointer[isXAxis ? 'zoomX' : 'zoomY']) {\n                            hasZoomed = axis.zoom(axisData.min, axisData.max);\n                            if (axis.displayBtn) {\n                                displayButton = true;\n                            }\n                        }\n                    });\n                }\n\n                // Show or hide the Reset zoom button\n                resetZoomButton = chart.resetZoomButton;\n                if (displayButton && !resetZoomButton) {\n                    chart.showResetZoom();\n                } else if (!displayButton && isObject(resetZoomButton)) {\n                    chart.resetZoomButton = resetZoomButton.destroy();\n                }\n\n\n                // Redraw\n                if (hasZoomed) {\n                    chart.redraw(\n                        pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation\n                    );\n                }\n            },\n\n            /**\n             * Pan the chart by dragging the mouse across the pane. This function is called\n             * on mouse move, and the distance to pan is computed from chartX compared to\n             * the first chartX position in the dragging operation.\n             */\n            pan: function(e, panning) {\n\n                var chart = this,\n                    hoverPoints = chart.hoverPoints,\n                    doRedraw;\n\n                // remove active points for shared tooltip\n                if (hoverPoints) {\n                    each(hoverPoints, function(point) {\n                        point.setState();\n                    });\n                }\n\n                each(panning === 'xy' ? [1, 0] : [1], function(isX) { // xy is used in maps\n                    var axis = chart[isX ? 'xAxis' : 'yAxis'][0],\n                        horiz = axis.horiz,\n                        mousePos = e[horiz ? 'chartX' : 'chartY'],\n                        mouseDown = horiz ? 'mouseDownX' : 'mouseDownY',\n                        startPos = chart[mouseDown],\n                        halfPointRange = (axis.pointRange || 0) / 2,\n                        extremes = axis.getExtremes(),\n                        panMin = axis.toValue(startPos - mousePos, true) +\n                        halfPointRange,\n                        panMax = axis.toValue(startPos + axis.len - mousePos, true) -\n                        halfPointRange,\n                        flipped = panMax < panMin,\n                        newMin = flipped ? panMax : panMin,\n                        newMax = flipped ? panMin : panMax,\n                        paddedMin = Math.min(\n                            extremes.dataMin,\n                            axis.toValue(\n                                axis.toPixels(extremes.min) - axis.minPixelPadding\n                            )\n                        ),\n                        paddedMax = Math.max(\n                            extremes.dataMax,\n                            axis.toValue(\n                                axis.toPixels(extremes.max) + axis.minPixelPadding\n                            )\n                        ),\n                        spill;\n\n                    // If the new range spills over, either to the min or max, adjust\n                    // the new range.\n                    spill = paddedMin - newMin;\n                    if (spill > 0) {\n                        newMax += spill;\n                        newMin = paddedMin;\n                    }\n                    spill = newMax - paddedMax;\n                    if (spill > 0) {\n                        newMax = paddedMax;\n                        newMin -= spill;\n                    }\n\n                    // Set new extremes if they are actually new\n                    if (axis.series.length && newMin !== extremes.min && newMax !== extremes.max) {\n                        axis.setExtremes(\n                            newMin,\n                            newMax,\n                            false,\n                            false, {\n                                trigger: 'pan'\n                            }\n                        );\n                        doRedraw = true;\n                    }\n\n                    chart[mouseDown] = mousePos; // set new reference for next run\n                });\n\n                if (doRedraw) {\n                    chart.redraw(false);\n                }\n                css(chart.container, {\n                    cursor: 'move'\n                });\n            }\n        });\n\n        /*\n         * Extend the Point object with interaction\n         */\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Toggle the selection status of a point.\n             * @param  {Boolean} [selected]\n             *         When `true`, the point is selected. When `false`, the point is\n             *         unselected. When `null` or `undefined`, the selection state is\n             *         toggled.\n             * @param  {Boolean} [accumulate=false]\n             *         When `true`, the selection is added to other selected points.\n             *         When `false`, other selected points are deselected. Internally in\n             *         Highcharts, when {@link http://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect|allowPointSelect}\n             *         is `true`, selected points are accumulated on Control, Shift or\n             *         Cmd clicking the point.\n             *\n             * @see    Highcharts.Chart#getSelectedPoints\n             *\n             * @sample highcharts/members/point-select/\n             *         Select a point from a button\n             * @sample highcharts/chart/events-selection-points/\n             *         Select a range of points through a drag selection\n             * @sample maps/series/data-id/\n             *         Select a point in Highmaps\n             */\n            select: function(selected, accumulate) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n\n                selected = pick(selected, !point.selected);\n\n                // fire the event with the default handler\n                point.firePointEvent(selected ? 'select' : 'unselect', {\n                    accumulate: accumulate\n                }, function() {\n\n                    /**\n                     * Whether the point is selected or not. \n                     * @see Highcharts.Point#select\n                     * @memberof Highcharts.Point\n                     * @name selected\n                     * @type {Boolean}\n                     */\n                    point.selected = point.options.selected = selected;\n                    series.options.data[inArray(point, series.data)] = point.options;\n\n                    point.setState(selected && 'select');\n\n                    // unselect all other points unless Ctrl or Cmd + click\n                    if (!accumulate) {\n                        each(chart.getSelectedPoints(), function(loopPoint) {\n                            if (loopPoint.selected && loopPoint !== point) {\n                                loopPoint.selected = loopPoint.options.selected = false;\n                                series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;\n                                loopPoint.setState('');\n                                loopPoint.firePointEvent('unselect');\n                            }\n                        });\n                    }\n                });\n            },\n\n            /**\n             * Runs on mouse over the point\n             * \n             * @param {Object} e The event arguments\n             */\n            onMouseOver: function(e) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    pointer = chart.pointer;\n                e = e ?\n                    pointer.normalize(e) :\n                    // In cases where onMouseOver is called directly without an event\n                    pointer.getChartCoordinatesFromPoint(point, chart.inverted);\n                pointer.runPointActions(e, point);\n            },\n\n            /**\n             * Runs on mouse out from the point\n             */\n            onMouseOut: function() {\n                var point = this,\n                    chart = point.series.chart;\n                point.firePointEvent('mouseOut');\n                each(chart.hoverPoints || [], function(p) {\n                    p.setState();\n                });\n                chart.hoverPoints = chart.hoverPoint = null;\n            },\n\n            /**\n             * Import events from the series' and point's options. Only do it on\n             * demand, to save processing time on hovering.\n             */\n            importEvents: function() {\n                if (!this.hasImportedEvents) {\n                    var point = this,\n                        options = merge(point.series.options.point, point.options),\n                        events = options.events;\n\n                    point.events = events;\n\n                    H.objectEach(events, function(event, eventType) {\n                        addEvent(point, eventType, event);\n                    });\n                    this.hasImportedEvents = true;\n\n                }\n            },\n\n            /**\n             * Set the point's state\n             * @param {String} state\n             */\n            setState: function(state, move) {\n                var point = this,\n                    plotX = Math.floor(point.plotX), // #4586\n                    plotY = point.plotY,\n                    series = point.series,\n                    stateOptions = series.options.states[state] || {},\n                    markerOptions = defaultPlotOptions[series.type].marker &&\n                    series.options.marker,\n                    normalDisabled = markerOptions && markerOptions.enabled === false,\n                    markerStateOptions = (markerOptions && markerOptions.states &&\n                        markerOptions.states[state]) || {},\n                    stateDisabled = markerStateOptions.enabled === false,\n                    stateMarkerGraphic = series.stateMarkerGraphic,\n                    pointMarker = point.marker || {},\n                    chart = series.chart,\n                    halo = series.halo,\n                    haloOptions,\n                    markerAttribs,\n                    hasMarkers = markerOptions && series.markerAttribs,\n                    newSymbol;\n\n                state = state || ''; // empty string\n\n                if (\n                    // already has this state\n                    (state === point.state && !move) ||\n                    // selected points don't respond to hover\n                    (point.selected && state !== 'select') ||\n                    // series' state options is disabled\n                    (stateOptions.enabled === false) ||\n                    // general point marker's state options is disabled\n                    (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||\n                    // individual point marker's state options is disabled\n                    (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610\n\n                ) {\n                    return;\n                }\n\n                if (hasMarkers) {\n                    markerAttribs = series.markerAttribs(point, state);\n                }\n\n                // Apply hover styles to the existing point\n                if (point.graphic) {\n\n                    if (point.state) {\n                        point.graphic.removeClass('highcharts-point-' + point.state);\n                    }\n                    if (state) {\n                        point.graphic.addClass('highcharts-point-' + state);\n                    }\n\n                    /*attribs = radius ? { // new symbol attributes (#507, #612)\n                    \tx: plotX - radius,\n                    \ty: plotY - radius,\n                    \twidth: 2 * radius,\n                    \theight: 2 * radius\n                    } : {};*/\n\n\n                    //attribs = merge(series.pointAttribs(point, state), attribs);\n                    point.graphic.attr(series.pointAttribs(point, state));\n\n\n                    if (markerAttribs) {\n                        point.graphic.animate(\n                            markerAttribs,\n                            pick(\n                                chart.options.chart.animation, // Turn off globally\n                                markerStateOptions.animation,\n                                markerOptions.animation\n                            )\n                        );\n                    }\n\n                    // Zooming in from a range with no markers to a range with markers\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic.hide();\n                    }\n                } else {\n                    // if a graphic is not applied to each point in the normal state, create a shared\n                    // graphic for the hover state\n                    if (state && markerStateOptions) {\n                        newSymbol = pointMarker.symbol || series.symbol;\n\n                        // If the point has another symbol than the previous one, throw away the\n                        // state marker graphic and force a new one (#1459)\n                        if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {\n                            stateMarkerGraphic = stateMarkerGraphic.destroy();\n                        }\n\n                        // Add a new state marker graphic\n                        if (!stateMarkerGraphic) {\n                            if (newSymbol) {\n                                series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(\n                                        newSymbol,\n                                        markerAttribs.x,\n                                        markerAttribs.y,\n                                        markerAttribs.width,\n                                        markerAttribs.height\n                                    )\n                                    .add(series.markerGroup);\n                                stateMarkerGraphic.currentSymbol = newSymbol;\n                            }\n\n                            // Move the existing graphic\n                        } else {\n                            stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054\n                                x: markerAttribs.x,\n                                y: markerAttribs.y\n                            });\n                        }\n\n                        if (stateMarkerGraphic) {\n                            stateMarkerGraphic.attr(series.pointAttribs(point, state));\n                        }\n\n                    }\n\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450\n                        stateMarkerGraphic.element.point = point; // #4310\n                    }\n                }\n\n                // Show me your halo\n                haloOptions = stateOptions.halo;\n                if (haloOptions && haloOptions.size) {\n                    if (!halo) {\n                        series.halo = halo = chart.renderer.path()\n                            // #5818, #5903, #6705\n                            .add((point.graphic || stateMarkerGraphic).parentGroup);\n                    }\n                    halo[move ? 'animate' : 'attr']({\n                        d: point.haloPath(haloOptions.size)\n                    });\n                    halo.attr({\n                        'class': 'highcharts-halo highcharts-color-' +\n                            pick(point.colorIndex, series.colorIndex)\n                    });\n                    halo.point = point; // #6055\n\n\n                    halo.attr(extend({\n                        'fill': point.color || series.color,\n                        'fill-opacity': haloOptions.opacity,\n                        'zIndex': -1 // #4929, IE8 added halo above everything\n                    }, haloOptions.attributes));\n\n\n                } else if (halo && halo.point && halo.point.haloPath) {\n                    // Animate back to 0 on the current halo point (#6055)\n                    halo.animate({\n                        d: halo.point.haloPath(0)\n                    });\n                }\n\n                point.state = state;\n            },\n\n            /**\n             * Get the circular path definition for the halo\n             * @param  {Number} size The radius of the circular halo.\n             * @returns {Array} The path definition\n             */\n            haloPath: function(size) {\n                var series = this.series,\n                    chart = series.chart;\n\n                return chart.renderer.symbols.circle(\n                    Math.floor(this.plotX) - size,\n                    this.plotY - size,\n                    size * 2,\n                    size * 2\n                );\n            }\n        });\n\n        /*\n         * Extend the Series object with interaction\n         */\n\n        extend(Series.prototype, /** @lends Highcharts.Series.prototype */ {\n            /**\n             * Series mouse over handler\n             */\n            onMouseOver: function() {\n                var series = this,\n                    chart = series.chart,\n                    hoverSeries = chart.hoverSeries;\n\n                // set normal state to previous series\n                if (hoverSeries && hoverSeries !== series) {\n                    hoverSeries.onMouseOut();\n                }\n\n                // trigger the event, but to save processing time,\n                // only if defined\n                if (series.options.events.mouseOver) {\n                    fireEvent(series, 'mouseOver');\n                }\n\n                // hover this\n                series.setState('hover');\n                chart.hoverSeries = series;\n            },\n\n            /**\n             * Series mouse out handler\n             */\n            onMouseOut: function() {\n                // trigger the event only if listeners exist\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    tooltip = chart.tooltip,\n                    hoverPoint = chart.hoverPoint;\n\n                chart.hoverSeries = null; // #182, set to null before the mouseOut event fires\n\n                // trigger mouse out on the point, which must be in this series\n                if (hoverPoint) {\n                    hoverPoint.onMouseOut();\n                }\n\n                // fire the mouse out event\n                if (series && options.events.mouseOut) {\n                    fireEvent(series, 'mouseOut');\n                }\n\n\n                // hide the tooltip\n                if (tooltip && !series.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {\n                    tooltip.hide();\n                }\n\n                // set normal state\n                series.setState();\n            },\n\n            /**\n             * Set the state of the graph\n             */\n            setState: function(state) {\n                var series = this,\n                    options = series.options,\n                    graph = series.graph,\n                    stateOptions = options.states,\n                    lineWidth = options.lineWidth,\n                    attribs,\n                    i = 0;\n\n                state = state || '';\n\n                if (series.state !== state) {\n\n                    // Toggle class names\n                    each([\n                        series.group,\n                        series.markerGroup,\n                        series.dataLabelsGroup\n                    ], function(group) {\n                        if (group) {\n                            // Old state\n                            if (series.state) {\n                                group.removeClass('highcharts-series-' + series.state);\n                            }\n                            // New state\n                            if (state) {\n                                group.addClass('highcharts-series-' + state);\n                            }\n                        }\n                    });\n\n                    series.state = state;\n\n\n\n                    if (stateOptions[state] && stateOptions[state].enabled === false) {\n                        return;\n                    }\n\n                    if (state) {\n                        lineWidth = stateOptions[state].lineWidth || lineWidth + (stateOptions[state].lineWidthPlus || 0); // #4035\n                    }\n\n                    if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML\n                        attribs = {\n                            'stroke-width': lineWidth\n                        };\n\n                        // Animate the graph stroke-width. By default a quick animation\n                        // to hover, slower to un-hover.\n                        graph.animate(\n                            attribs,\n                            pick(\n                                series.chart.options.chart.animation,\n                                stateOptions[state] && stateOptions[state].animation\n                            )\n                        );\n                        while (series['zone-graph-' + i]) {\n                            series['zone-graph-' + i].attr(attribs);\n                            i = i + 1;\n                        }\n                    }\n\n                }\n            },\n\n            /**\n             * Show or hide the series.\n             *\n             * @param  {Boolean} [visible]\n             *         True to show the series, false to hide. If undefined, the\n             *         visibility is toggled.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the series is altered. If doing\n             *         more operations on the chart, it is a good idea to set redraw to\n             *         false and call {@link Chart#redraw|chart.redraw()} after.\n             */\n            setVisible: function(vis, redraw) {\n                var series = this,\n                    chart = series.chart,\n                    legendItem = series.legendItem,\n                    showOrHide,\n                    ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n                    oldVisibility = series.visible;\n\n                // if called without an argument, toggle visibility\n                series.visible = vis = series.options.visible = series.userOptions.visible = vis === undefined ? !oldVisibility : vis; // #5618\n                showOrHide = vis ? 'show' : 'hide';\n\n                // show or hide elements\n                each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker', 'tt'], function(key) {\n                    if (series[key]) {\n                        series[key][showOrHide]();\n                    }\n                });\n\n\n                // hide tooltip (#1361)\n                if (chart.hoverSeries === series || (chart.hoverPoint && chart.hoverPoint.series) === series) {\n                    series.onMouseOut();\n                }\n\n\n                if (legendItem) {\n                    chart.legend.colorizeItem(series, vis);\n                }\n\n\n                // rescale or adapt to resized chart\n                series.isDirty = true;\n                // in a stack, all other series are affected\n                if (series.options.stacking) {\n                    each(chart.series, function(otherSeries) {\n                        if (otherSeries.options.stacking && otherSeries.visible) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n\n                // show or hide linked series\n                each(series.linkedSeries, function(otherSeries) {\n                    otherSeries.setVisible(vis, false);\n                });\n\n                if (ignoreHiddenSeries) {\n                    chart.isDirtyBox = true;\n                }\n                if (redraw !== false) {\n                    chart.redraw();\n                }\n\n                fireEvent(series, showOrHide);\n            },\n\n            /**\n             * Show the series if hidden.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             */\n            show: function() {\n                this.setVisible(true);\n            },\n\n            /**\n             * Hide the series if visible. If the {@link\n             * https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries|\n             * chart.ignoreHiddenSeries} option is true, the chart is redrawn without\n             * this series.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             */\n            hide: function() {\n                this.setVisible(false);\n            },\n\n\n            /**\n             * Select or unselect the series. This means its {@link\n             * Highcharts.Series.selected|selected} property is set, the checkbox in the\n             * legend is toggled and when selected, the series is returned by the\n             * {@link Highcharts.Chart#getSelectedSeries} function.\n             *\n             * @param  {Boolean} [selected]\n             *         True to select the series, false to unselect. If\tundefined, the\n             *         selection state is toggled.\n             *\n             * @sample highcharts/members/series-select/\n             *         Select a series from a button\n             */\n            select: function(selected) {\n                var series = this;\n\n                series.selected = selected = (selected === undefined) ?\n                    !series.selected :\n                    selected;\n\n                if (series.checkbox) {\n                    series.checkbox.checked = selected;\n                }\n\n                fireEvent(series, selected ? 'select' : 'unselect');\n            },\n\n            drawTracker: TrackerMixin.drawTrackerGraph\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            isObject = H.isObject,\n            pick = H.pick,\n            splat = H.splat;\n\n        /**\n         * Update the chart based on the current chart/document size and options for\n         * responsiveness.\n         */\n        Chart.prototype.setResponsive = function(redraw) {\n            var options = this.options.responsive,\n                ruleIds = [],\n                currentResponsive = this.currentResponsive,\n                currentRuleIds;\n\n            if (options && options.rules) {\n                each(options.rules, function(rule) {\n                    if (rule._id === undefined) {\n                        rule._id = H.uniqueKey();\n                    }\n\n                    this.matchResponsiveRule(rule, ruleIds, redraw);\n                }, this);\n            }\n\n            // Merge matching rules\n            var mergedOptions = H.merge.apply(0, H.map(ruleIds, function(ruleId) {\n                return H.find(options.rules, function(rule) {\n                    return rule._id === ruleId;\n                }).chartOptions;\n            }));\n\n            // Stringified key for the rules that currently apply.\n            ruleIds = ruleIds.toString() || undefined;\n            currentRuleIds = currentResponsive && currentResponsive.ruleIds;\n\n\n            // Changes in what rules apply\n            if (ruleIds !== currentRuleIds) {\n\n                // Undo previous rules. Before we apply a new set of rules, we need to\n                // roll back completely to base options (#6291).\n                if (currentResponsive) {\n                    this.update(currentResponsive.undoOptions, redraw);\n                }\n\n                if (ruleIds) {\n                    // Get undo-options for matching rules\n                    this.currentResponsive = {\n                        ruleIds: ruleIds,\n                        mergedOptions: mergedOptions,\n                        undoOptions: this.currentOptions(mergedOptions)\n                    };\n\n                    this.update(mergedOptions, redraw);\n\n                } else {\n                    this.currentResponsive = undefined;\n                }\n            }\n        };\n\n        /**\n         * Handle a single responsiveness rule\n         */\n        Chart.prototype.matchResponsiveRule = function(rule, matches) {\n            var condition = rule.condition,\n                fn = condition.callback || function() {\n                    return this.chartWidth <= pick(condition.maxWidth, Number.MAX_VALUE) &&\n                        this.chartHeight <= pick(condition.maxHeight, Number.MAX_VALUE) &&\n                        this.chartWidth >= pick(condition.minWidth, 0) &&\n                        this.chartHeight >= pick(condition.minHeight, 0);\n                };\n\n            if (fn.call(this)) {\n                matches.push(rule._id);\n            }\n\n        };\n\n        /**\n         * Get the current values for a given set of options. Used before we update\n         * the chart with a new responsiveness rule.\n         * TODO: Restore axis options (by id?)\n         */\n        Chart.prototype.currentOptions = function(options) {\n\n            var ret = {};\n\n            /**\n             * Recurse over a set of options and its current values,\n             * and store the current values in the ret object.\n             */\n            function getCurrent(options, curr, ret, depth) {\n                var i;\n                H.objectEach(options, function(val, key) {\n                    if (!depth && inArray(key, ['series', 'xAxis', 'yAxis']) > -1) {\n                        options[key] = splat(options[key]);\n\n                        ret[key] = [];\n\n                        // Iterate over collections like series, xAxis or yAxis and map\n                        // the items by index.\n                        for (i = 0; i < options[key].length; i++) {\n                            if (curr[key][i]) { // Item exists in current data (#6347)\n                                ret[key][i] = {};\n                                getCurrent(\n                                    val[i],\n                                    curr[key][i],\n                                    ret[key][i],\n                                    depth + 1\n                                );\n                            }\n                        }\n                    } else if (isObject(val)) {\n                        ret[key] = isArray(val) ? [] : {};\n                        getCurrent(val, curr[key] || {}, ret[key], depth + 1);\n                    } else {\n                        ret[key] = curr[key] || null;\n                    }\n                });\n            }\n\n            getCurrent(options, this.options, ret, 0);\n            return ret;\n        };\n\n    }(Highcharts));\n    return Highcharts\n}));\n"
  },
  {
    "path": "assets/highcharts/js/highcharts-3d.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n 3D features for Highcharts JS\n\n @license: www.highcharts.com/license\n*/\n(function(z){\"object\"===typeof module&&module.exports?module.exports=z:z(Highcharts)})(function(z){(function(d){var r=d.deg2rad,v=d.pick;d.perspective=function(w,x,t){var l=x.options.chart.options3d,h=t?x.inverted:!1,f=x.plotWidth/2,m=x.plotHeight/2,u=l.depth/2,c=v(l.depth,1)*v(l.viewDistance,0),a=x.scale3d||1,b=r*l.beta*(h?-1:1),l=r*l.alpha*(h?-1:1),e=Math.cos(l),g=Math.cos(-b),k=Math.sin(l),A=Math.sin(-b);t||(f+=x.plotLeft,m+=x.plotTop);return d.map(w,function(b){var d,q;q=(h?b.y:b.x)-f;var p=(h?\nb.x:b.y)-m,G=(b.z||0)-u;d=g*q-A*G;b=-k*A*q+e*p-g*k*G;q=e*A*q+k*p+e*g*G;p=0<c&&c<Number.POSITIVE_INFINITY?c/(q+u+c):1;d=d*p*a+f;b=b*p*a+m;return{x:h?b:d,y:h?d:b,z:q*a+u}})};d.pointCameraDistance=function(d,r){var t=r.options.chart.options3d,l=r.plotWidth/2;r=r.plotHeight/2;t=v(t.depth,1)*v(t.viewDistance,0)+t.depth;return Math.sqrt(Math.pow(l-d.plotX,2)+Math.pow(r-d.plotY,2)+Math.pow(t-d.plotZ,2))};d.shapeArea=function(d){var r=0,t,l;for(t=0;t<d.length;t++)l=(t+1)%d.length,r+=d[t].x*d[l].y-d[l].x*\nd[t].y;return r/2};d.shapeArea3d=function(r,v,t){return d.shapeArea(d.perspective(r,v,t))}})(z);(function(d){function r(a,e,b,d,c,k,g,m){var B=[],p=k-c;return k>c&&k-c>Math.PI/2+.0001?(B=B.concat(r(a,e,b,d,c,c+Math.PI/2,g,m)),B=B.concat(r(a,e,b,d,c+Math.PI/2,k,g,m))):k<c&&c-k>Math.PI/2+.0001?(B=B.concat(r(a,e,b,d,c,c-Math.PI/2,g,m)),B=B.concat(r(a,e,b,d,c-Math.PI/2,k,g,m))):[\"C\",a+b*Math.cos(c)-b*q*p*Math.sin(c)+g,e+d*Math.sin(c)+d*q*p*Math.cos(c)+m,a+b*Math.cos(k)+b*q*p*Math.sin(k)+g,e+d*Math.sin(k)-\nd*q*p*Math.cos(k)+m,a+b*Math.cos(k)+g,e+d*Math.sin(k)+m]}var v=Math.cos,w=Math.PI,x=Math.sin,t=d.animObject,l=d.charts,h=d.color,f=d.defined,m=d.deg2rad,u=d.each,c=d.extend,a=d.inArray,b=d.map,e=d.merge,g=d.perspective,k=d.pick,A=d.SVGElement,y=d.SVGRenderer,n=d.wrap,q=4*(Math.sqrt(2)-1)/3/(w/2);n(y.prototype,\"init\",function(a){a.apply(this,[].slice.call(arguments,1));u([{name:\"darker\",slope:.6},{name:\"brighter\",slope:1.4}],function(a){this.definition({tagName:\"filter\",id:\"highcharts-\"+a.name,children:[{tagName:\"feComponentTransfer\",\nchildren:[{tagName:\"feFuncR\",type:\"linear\",slope:a.slope},{tagName:\"feFuncG\",type:\"linear\",slope:a.slope},{tagName:\"feFuncB\",type:\"linear\",slope:a.slope}]}]})},this)});y.prototype.toLinePath=function(a,b){var e=[];u(a,function(a){e.push(\"L\",a.x,a.y)});a.length&&(e[0]=\"M\",b&&e.push(\"Z\"));return e};y.prototype.toLineSegments=function(a){var e=[],b=!0;u(a,function(a){e.push(b?\"M\":\"L\",a.x,a.y);b=!b});return e};y.prototype.face3d=function(a){var e=this,b=this.createElement(\"path\");b.vertexes=[];b.insidePlotArea=\n!1;b.enabled=!0;n(b,\"attr\",function(a,b){if(\"object\"===typeof b&&(f(b.enabled)||f(b.vertexes)||f(b.insidePlotArea))){this.enabled=k(b.enabled,this.enabled);this.vertexes=k(b.vertexes,this.vertexes);this.insidePlotArea=k(b.insidePlotArea,this.insidePlotArea);delete b.enabled;delete b.vertexes;delete b.insidePlotArea;var c=g(this.vertexes,l[e.chartIndex],this.insidePlotArea),B=e.toLinePath(c,!0),c=d.shapeArea(c),c=this.enabled&&0<c?\"visible\":\"hidden\";b.d=B;b.visibility=c}return a.apply(this,[].slice.call(arguments,\n1))});n(b,\"animate\",function(b,a){if(\"object\"===typeof a&&(f(a.enabled)||f(a.vertexes)||f(a.insidePlotArea))){this.enabled=k(a.enabled,this.enabled);this.vertexes=k(a.vertexes,this.vertexes);this.insidePlotArea=k(a.insidePlotArea,this.insidePlotArea);delete a.enabled;delete a.vertexes;delete a.insidePlotArea;var c=g(this.vertexes,l[e.chartIndex],this.insidePlotArea),B=e.toLinePath(c,!0),c=d.shapeArea(c),c=this.enabled&&0<c?\"visible\":\"hidden\";a.d=B;this.attr(\"visibility\",c)}return b.apply(this,[].slice.call(arguments,\n1))});return b.attr(a)};y.prototype.polyhedron=function(a){var b=this,e=this.g(),c=e.destroy;e.faces=[];e.destroy=function(){for(var a=0;a<e.faces.length;a++)e.faces[a].destroy();return c.call(this)};n(e,\"attr\",function(a,c,d,k,g){if(\"object\"===typeof c&&f(c.faces)){for(;e.faces.length>c.faces.length;)e.faces.pop().destroy();for(;e.faces.length<c.faces.length;)e.faces.push(b.face3d().add(e));for(var B=0;B<c.faces.length;B++)e.faces[B].attr(c.faces[B],null,k,g);delete c.faces}return a.apply(this,[].slice.call(arguments,\n1))});n(e,\"animate\",function(a,c,d,k){if(c&&c.faces){for(;e.faces.length>c.faces.length;)e.faces.pop().destroy();for(;e.faces.length<c.faces.length;)e.faces.push(b.face3d().add(e));for(var g=0;g<c.faces.length;g++)e.faces[g].animate(c.faces[g],d,k);delete c.faces}return a.apply(this,[].slice.call(arguments,1))});return e.attr(a)};y.prototype.cuboid=function(a){var e=this.g(),b=e.destroy;a=this.cuboidPath(a);e.front=this.path(a[0]).attr({\"class\":\"highcharts-3d-front\"}).add(e);e.top=this.path(a[1]).attr({\"class\":\"highcharts-3d-top\"}).add(e);\ne.side=this.path(a[2]).attr({\"class\":\"highcharts-3d-side\"}).add(e);e.fillSetter=function(a){this.front.attr({fill:a});this.top.attr({fill:h(a).brighten(.1).get()});this.side.attr({fill:h(a).brighten(-.1).get()});this.color=a;return this};e.opacitySetter=function(a){this.front.attr({opacity:a});this.top.attr({opacity:a});this.side.attr({opacity:a});return this};e.attr=function(a,e){if(\"string\"===typeof a&&\"undefined\"!==typeof e){var b=a;a={};a[b]=e}if(a.shapeArgs||f(a.x))a=this.renderer.cuboidPath(a.shapeArgs||\na),this.front.attr({d:a[0]}),this.top.attr({d:a[1]}),this.side.attr({d:a[2]});else return d.SVGElement.prototype.attr.call(this,a);return this};e.animate=function(a,e,b){f(a.x)&&f(a.y)?(a=this.renderer.cuboidPath(a),this.front.animate({d:a[0]},e,b),this.top.animate({d:a[1]},e,b),this.side.animate({d:a[2]},e,b),this.attr({zIndex:-a[3]})):a.opacity?(this.front.animate(a,e,b),this.top.animate(a,e,b),this.side.animate(a,e,b)):A.prototype.animate.call(this,a,e,b);return this};e.destroy=function(){this.front.destroy();\nthis.top.destroy();this.side.destroy();return b.call(this)};e.attr({zIndex:-a[3]});return e};d.SVGRenderer.prototype.cuboidPath=function(a){function e(a){return r[a]}var c=a.x,k=a.y,m=a.z,u=a.height,p=a.width,A=a.depth,q=l[this.chartIndex],n,y,f=q.options.chart.options3d.alpha,h=0,r=[{x:c,y:k,z:m},{x:c+p,y:k,z:m},{x:c+p,y:k+u,z:m},{x:c,y:k+u,z:m},{x:c,y:k+u,z:m+A},{x:c+p,y:k+u,z:m+A},{x:c+p,y:k,z:m+A},{x:c,y:k,z:m+A}],r=g(r,q,a.insidePlotArea);y=function(a,c){var k=[[],-1];a=b(a,e);c=b(c,e);0>d.shapeArea(a)?\nk=[a,0]:0>d.shapeArea(c)&&(k=[c,1]);return k};n=y([3,2,1,0],[7,6,5,4]);a=n[0];p=n[1];n=y([1,6,7,0],[4,5,2,3]);u=n[0];A=n[1];n=y([1,2,5,6],[0,7,4,3]);y=n[0];n=n[1];1===n?h+=1E4*(1E3-c):n||(h+=1E4*c);h+=10*(!A||0<=f&&180>=f||360>f&&357.5<f?q.plotHeight-k:10+k);1===p?h+=100*m:p||(h+=100*(1E3-m));h=-Math.round(h);return[this.toLinePath(a,!0),this.toLinePath(u,!0),this.toLinePath(y,!0),h]};d.SVGRenderer.prototype.arc3d=function(b){function d(b){var c=!1,g={};b=e(b);for(var k in b)-1!==a(k,q)&&(g[k]=b[k],\ndelete b[k],c=!0);return c?g:!1}var g=this.g(),p=g.renderer,q=\"x y r innerR start end\".split(\" \");b=e(b);b.alpha*=m;b.beta*=m;g.top=p.path();g.side1=p.path();g.side2=p.path();g.inn=p.path();g.out=p.path();g.onAdd=function(){var a=g.parentGroup,e=g.attr(\"class\");g.top.add(g);u([\"out\",\"inn\",\"side1\",\"side2\"],function(b){g[b].addClass(e+\" highcharts-3d-side\").add(a)})};g.setPaths=function(a){var e=g.renderer.arc3dPath(a),b=100*e.zTop;g.attribs=a;g.top.attr({d:e.top,zIndex:e.zTop});g.inn.attr({d:e.inn,\nzIndex:e.zInn});g.out.attr({d:e.out,zIndex:e.zOut});g.side1.attr({d:e.side1,zIndex:e.zSide1});g.side2.attr({d:e.side2,zIndex:e.zSide2});g.zIndex=b;g.attr({zIndex:b});a.center&&(g.top.setRadialReference(a.center),delete a.center)};g.setPaths(b);g.fillSetter=function(a){var e=h(a).brighten(-.1).get();this.fill=a;this.side1.attr({fill:e});this.side2.attr({fill:e});this.inn.attr({fill:e});this.out.attr({fill:e});this.top.attr({fill:a});return this};u([\"opacity\",\"translateX\",\"translateY\",\"visibility\"],\nfunction(a){g[a+\"Setter\"]=function(a,e){g[e]=a;u([\"out\",\"inn\",\"side1\",\"side2\",\"top\"],function(b){g[b].attr(e,a)})}});n(g,\"attr\",function(a,e){var b;\"object\"===typeof e&&(b=d(e))&&(c(g.attribs,b),g.setPaths(g.attribs));return a.apply(this,[].slice.call(arguments,1))});n(g,\"animate\",function(a,b,c,g){var m,u=this.attribs,p;delete b.center;delete b.z;delete b.depth;delete b.alpha;delete b.beta;p=t(k(c,this.renderer.globalAnimation));p.duration&&(m=d(b),b.dummy=1,m&&(p.step=function(a,b){function c(a){return u[a]+\n(k(m[a],u[a])-u[a])*b.pos}\"dummy\"===b.prop&&b.elem.setPaths(e(u,{x:c(\"x\"),y:c(\"y\"),r:c(\"r\"),innerR:c(\"innerR\"),start:c(\"start\"),end:c(\"end\")}))}),c=p);return a.call(this,b,c,g)});g.destroy=function(){this.top.destroy();this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();A.prototype.destroy.call(this)};g.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};g.show=function(){this.top.show();this.out.show();this.inn.show();this.side1.show();\nthis.side2.show()};return g};y.prototype.arc3dPath=function(a){function e(a){a%=2*Math.PI;a>Math.PI&&(a=2*Math.PI-a);return a}var b=a.x,c=a.y,g=a.start,k=a.end-.00001,d=a.r,m=a.innerR,u=a.depth,n=a.alpha,p=a.beta,A=Math.cos(g),q=Math.sin(g);a=Math.cos(k);var y=Math.sin(k),f=d*Math.cos(p),d=d*Math.cos(n),h=m*Math.cos(p),l=m*Math.cos(n),m=u*Math.sin(p),t=u*Math.sin(n),u=[\"M\",b+f*A,c+d*q],u=u.concat(r(b,c,f,d,g,k,0,0)),u=u.concat([\"L\",b+h*a,c+l*y]),u=u.concat(r(b,c,h,l,k,g,0,0)),u=u.concat([\"Z\"]),z=\n0<p?Math.PI/2:0,p=0<n?0:Math.PI/2,z=g>-z?g:k>-z?-z:g,C=k<w-p?k:g<w-p?w-p:k,D=2*w-p,n=[\"M\",b+f*v(z),c+d*x(z)],n=n.concat(r(b,c,f,d,z,C,0,0));k>D&&g<D?(n=n.concat([\"L\",b+f*v(C)+m,c+d*x(C)+t]),n=n.concat(r(b,c,f,d,C,D,m,t)),n=n.concat([\"L\",b+f*v(D),c+d*x(D)]),n=n.concat(r(b,c,f,d,D,k,0,0)),n=n.concat([\"L\",b+f*v(k)+m,c+d*x(k)+t]),n=n.concat(r(b,c,f,d,k,D,m,t)),n=n.concat([\"L\",b+f*v(D),c+d*x(D)]),n=n.concat(r(b,c,f,d,D,C,0,0))):k>w-p&&g<w-p&&(n=n.concat([\"L\",b+f*Math.cos(C)+m,c+d*Math.sin(C)+t]),n=n.concat(r(b,\nc,f,d,C,k,m,t)),n=n.concat([\"L\",b+f*Math.cos(k),c+d*Math.sin(k)]),n=n.concat(r(b,c,f,d,k,C,0,0)));n=n.concat([\"L\",b+f*Math.cos(C)+m,c+d*Math.sin(C)+t]);n=n.concat(r(b,c,f,d,C,z,m,t));n=n.concat([\"Z\"]);p=[\"M\",b+h*A,c+l*q];p=p.concat(r(b,c,h,l,g,k,0,0));p=p.concat([\"L\",b+h*Math.cos(k)+m,c+l*Math.sin(k)+t]);p=p.concat(r(b,c,h,l,k,g,m,t));p=p.concat([\"Z\"]);A=[\"M\",b+f*A,c+d*q,\"L\",b+f*A+m,c+d*q+t,\"L\",b+h*A+m,c+l*q+t,\"L\",b+h*A,c+l*q,\"Z\"];b=[\"M\",b+f*a,c+d*y,\"L\",b+f*a+m,c+d*y+t,\"L\",b+h*a+m,c+l*y+t,\"L\",b+h*\na,c+l*y,\"Z\"];y=Math.atan2(t,-m);c=Math.abs(k+y);a=Math.abs(g+y);g=Math.abs((g+k)/2+y);c=e(c);a=e(a);g=e(g);g*=1E5;k=1E5*a;c*=1E5;return{top:u,zTop:1E5*Math.PI+1,out:n,zOut:Math.max(g,k,c),inn:p,zInn:Math.max(g,k,c),side1:A,zSide1:.99*c,side2:b,zSide2:.99*k}}})(z);(function(d){function r(d,u){var c=d.plotLeft,a=d.plotWidth+c,b=d.plotTop,e=d.plotHeight+b,g=c+d.plotWidth/2,k=b+d.plotHeight/2,m=Number.MAX_VALUE,f=-Number.MAX_VALUE,n=Number.MAX_VALUE,q=-Number.MAX_VALUE,p,h=1;p=[{x:c,y:b,z:0},{x:c,y:b,\nz:u}];w([0,1],function(b){p.push({x:a,y:p[b].y,z:p[b].z})});w([0,1,2,3],function(a){p.push({x:p[a].x,y:e,z:p[a].z})});p=t(p,d,!1);w(p,function(a){m=Math.min(m,a.x);f=Math.max(f,a.x);n=Math.min(n,a.y);q=Math.max(q,a.y)});c>m&&(h=Math.min(h,1-Math.abs((c+g)/(m+g))%1));a<f&&(h=Math.min(h,(a-g)/(f-g)));b>n&&(h=0>n?Math.min(h,(b+k)/(-n+b+k)):Math.min(h,1-(b+k)/(n+k)%1));e<q&&(h=Math.min(h,Math.abs((e-k)/(q-k))));return h}var v=d.Chart,w=d.each,x=d.merge,t=d.perspective,l=d.pick,h=d.wrap;v.prototype.is3d=\nfunction(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};v.prototype.propsRequireDirtyBox.push(\"chart.options3d\");v.prototype.propsRequireUpdateSeries.push(\"chart.options3d\");d.wrap(d.Chart.prototype,\"isInsidePlot\",function(d){return this.is3d()||d.apply(this,[].slice.call(arguments,1))});var f=d.getOptions();x(!0,f,{chart:{options3d:{enabled:!1,alpha:0,beta:0,depth:100,fitToPlot:!0,viewDistance:25,axisLabelPosition:\"default\",frame:{visible:\"default\",size:1,bottom:{},\ntop:{},left:{},right:{},back:{},front:{}}}}});h(v.prototype,\"getContainer\",function(d){d.apply(this,[].slice.call(arguments,1));this.renderer.definition({tagName:\"style\",textContent:\".highcharts-3d-top{filter: url(#highcharts-brighter)}\\n.highcharts-3d-side{filter: url(#highcharts-darker)}\\n\"})});h(v.prototype,\"setClassName\",function(d){d.apply(this,[].slice.call(arguments,1));this.is3d()&&(this.container.className+=\" highcharts-3d-chart\")});d.wrap(d.Chart.prototype,\"setChartSize\",function(d){var m=\nthis.options.chart.options3d;d.apply(this,[].slice.call(arguments,1));if(this.is3d()){var c=this.inverted,a=this.clipBox,b=this.margin;a[c?\"y\":\"x\"]=-(b[3]||0);a[c?\"x\":\"y\"]=-(b[0]||0);a[c?\"height\":\"width\"]=this.chartWidth+(b[3]||0)+(b[1]||0);a[c?\"width\":\"height\"]=this.chartHeight+(b[0]||0)+(b[2]||0);this.scale3d=1;!0===m.fitToPlot&&(this.scale3d=r(this,m.depth))}});h(v.prototype,\"redraw\",function(d){this.is3d()&&(this.isDirtyBox=!0,this.frame3d=this.get3dFrame());d.apply(this,[].slice.call(arguments,\n1))});h(v.prototype,\"render\",function(d){this.is3d()&&(this.frame3d=this.get3dFrame());d.apply(this,[].slice.call(arguments,1))});h(v.prototype,\"renderSeries\",function(d){var m=this.series.length;if(this.is3d())for(;m--;)d=this.series[m],d.translate(),d.render();else d.call(this)});h(v.prototype,\"drawChartBox\",function(m){if(this.is3d()){var u=this.renderer,c=this.options.chart.options3d,a=this.get3dFrame(),b=this.plotLeft,e=this.plotLeft+this.plotWidth,g=this.plotTop,k=this.plotTop+this.plotHeight,\nc=c.depth,f=b-(a.left.visible?a.left.size:0),h=e+(a.right.visible?a.right.size:0),n=g-(a.top.visible?a.top.size:0),q=k+(a.bottom.visible?a.bottom.size:0),p=0-(a.front.visible?a.front.size:0),l=c+(a.back.visible?a.back.size:0),t=this.hasRendered?\"animate\":\"attr\";this.frame3d=a;this.frameShapes||(this.frameShapes={bottom:u.polyhedron().add(),top:u.polyhedron().add(),left:u.polyhedron().add(),right:u.polyhedron().add(),back:u.polyhedron().add(),front:u.polyhedron().add()});this.frameShapes.bottom[t]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-bottom\",\nzIndex:a.bottom.frontFacing?-1E3:1E3,faces:[{fill:d.color(a.bottom.color).brighten(.1).get(),vertexes:[{x:f,y:q,z:p},{x:h,y:q,z:p},{x:h,y:q,z:l},{x:f,y:q,z:l}],enabled:a.bottom.visible},{fill:d.color(a.bottom.color).brighten(.1).get(),vertexes:[{x:b,y:k,z:c},{x:e,y:k,z:c},{x:e,y:k,z:0},{x:b,y:k,z:0}],enabled:a.bottom.visible},{fill:d.color(a.bottom.color).brighten(-.1).get(),vertexes:[{x:f,y:q,z:p},{x:f,y:q,z:l},{x:b,y:k,z:c},{x:b,y:k,z:0}],enabled:a.bottom.visible&&!a.left.visible},{fill:d.color(a.bottom.color).brighten(-.1).get(),\nvertexes:[{x:h,y:q,z:l},{x:h,y:q,z:p},{x:e,y:k,z:0},{x:e,y:k,z:c}],enabled:a.bottom.visible&&!a.right.visible},{fill:d.color(a.bottom.color).get(),vertexes:[{x:h,y:q,z:p},{x:f,y:q,z:p},{x:b,y:k,z:0},{x:e,y:k,z:0}],enabled:a.bottom.visible&&!a.front.visible},{fill:d.color(a.bottom.color).get(),vertexes:[{x:f,y:q,z:l},{x:h,y:q,z:l},{x:e,y:k,z:c},{x:b,y:k,z:c}],enabled:a.bottom.visible&&!a.back.visible}]});this.frameShapes.top[t]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-top\",zIndex:a.top.frontFacing?\n-1E3:1E3,faces:[{fill:d.color(a.top.color).brighten(.1).get(),vertexes:[{x:f,y:n,z:l},{x:h,y:n,z:l},{x:h,y:n,z:p},{x:f,y:n,z:p}],enabled:a.top.visible},{fill:d.color(a.top.color).brighten(.1).get(),vertexes:[{x:b,y:g,z:0},{x:e,y:g,z:0},{x:e,y:g,z:c},{x:b,y:g,z:c}],enabled:a.top.visible},{fill:d.color(a.top.color).brighten(-.1).get(),vertexes:[{x:f,y:n,z:l},{x:f,y:n,z:p},{x:b,y:g,z:0},{x:b,y:g,z:c}],enabled:a.top.visible&&!a.left.visible},{fill:d.color(a.top.color).brighten(-.1).get(),vertexes:[{x:h,\ny:n,z:p},{x:h,y:n,z:l},{x:e,y:g,z:c},{x:e,y:g,z:0}],enabled:a.top.visible&&!a.right.visible},{fill:d.color(a.top.color).get(),vertexes:[{x:f,y:n,z:p},{x:h,y:n,z:p},{x:e,y:g,z:0},{x:b,y:g,z:0}],enabled:a.top.visible&&!a.front.visible},{fill:d.color(a.top.color).get(),vertexes:[{x:h,y:n,z:l},{x:f,y:n,z:l},{x:b,y:g,z:c},{x:e,y:g,z:c}],enabled:a.top.visible&&!a.back.visible}]});this.frameShapes.left[t]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-left\",zIndex:a.left.frontFacing?-1E3:1E3,faces:[{fill:d.color(a.left.color).brighten(.1).get(),\nvertexes:[{x:f,y:q,z:p},{x:b,y:k,z:0},{x:b,y:k,z:c},{x:f,y:q,z:l}],enabled:a.left.visible&&!a.bottom.visible},{fill:d.color(a.left.color).brighten(.1).get(),vertexes:[{x:f,y:n,z:l},{x:b,y:g,z:c},{x:b,y:g,z:0},{x:f,y:n,z:p}],enabled:a.left.visible&&!a.top.visible},{fill:d.color(a.left.color).brighten(-.1).get(),vertexes:[{x:f,y:q,z:l},{x:f,y:n,z:l},{x:f,y:n,z:p},{x:f,y:q,z:p}],enabled:a.left.visible},{fill:d.color(a.left.color).brighten(-.1).get(),vertexes:[{x:b,y:g,z:c},{x:b,y:k,z:c},{x:b,y:k,z:0},\n{x:b,y:g,z:0}],enabled:a.left.visible},{fill:d.color(a.left.color).get(),vertexes:[{x:f,y:q,z:p},{x:f,y:n,z:p},{x:b,y:g,z:0},{x:b,y:k,z:0}],enabled:a.left.visible&&!a.front.visible},{fill:d.color(a.left.color).get(),vertexes:[{x:f,y:n,z:l},{x:f,y:q,z:l},{x:b,y:k,z:c},{x:b,y:g,z:c}],enabled:a.left.visible&&!a.back.visible}]});this.frameShapes.right[t]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-right\",zIndex:a.right.frontFacing?-1E3:1E3,faces:[{fill:d.color(a.right.color).brighten(.1).get(),\nvertexes:[{x:h,y:q,z:l},{x:e,y:k,z:c},{x:e,y:k,z:0},{x:h,y:q,z:p}],enabled:a.right.visible&&!a.bottom.visible},{fill:d.color(a.right.color).brighten(.1).get(),vertexes:[{x:h,y:n,z:p},{x:e,y:g,z:0},{x:e,y:g,z:c},{x:h,y:n,z:l}],enabled:a.right.visible&&!a.top.visible},{fill:d.color(a.right.color).brighten(-.1).get(),vertexes:[{x:e,y:g,z:0},{x:e,y:k,z:0},{x:e,y:k,z:c},{x:e,y:g,z:c}],enabled:a.right.visible},{fill:d.color(a.right.color).brighten(-.1).get(),vertexes:[{x:h,y:q,z:p},{x:h,y:n,z:p},{x:h,y:n,\nz:l},{x:h,y:q,z:l}],enabled:a.right.visible},{fill:d.color(a.right.color).get(),vertexes:[{x:h,y:n,z:p},{x:h,y:q,z:p},{x:e,y:k,z:0},{x:e,y:g,z:0}],enabled:a.right.visible&&!a.front.visible},{fill:d.color(a.right.color).get(),vertexes:[{x:h,y:q,z:l},{x:h,y:n,z:l},{x:e,y:g,z:c},{x:e,y:k,z:c}],enabled:a.right.visible&&!a.back.visible}]});this.frameShapes.back[t]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-back\",zIndex:a.back.frontFacing?-1E3:1E3,faces:[{fill:d.color(a.back.color).brighten(.1).get(),\nvertexes:[{x:h,y:q,z:l},{x:f,y:q,z:l},{x:b,y:k,z:c},{x:e,y:k,z:c}],enabled:a.back.visible&&!a.bottom.visible},{fill:d.color(a.back.color).brighten(.1).get(),vertexes:[{x:f,y:n,z:l},{x:h,y:n,z:l},{x:e,y:g,z:c},{x:b,y:g,z:c}],enabled:a.back.visible&&!a.top.visible},{fill:d.color(a.back.color).brighten(-.1).get(),vertexes:[{x:f,y:q,z:l},{x:f,y:n,z:l},{x:b,y:g,z:c},{x:b,y:k,z:c}],enabled:a.back.visible&&!a.left.visible},{fill:d.color(a.back.color).brighten(-.1).get(),vertexes:[{x:h,y:n,z:l},{x:h,y:q,\nz:l},{x:e,y:k,z:c},{x:e,y:g,z:c}],enabled:a.back.visible&&!a.right.visible},{fill:d.color(a.back.color).get(),vertexes:[{x:b,y:g,z:c},{x:e,y:g,z:c},{x:e,y:k,z:c},{x:b,y:k,z:c}],enabled:a.back.visible},{fill:d.color(a.back.color).get(),vertexes:[{x:f,y:q,z:l},{x:h,y:q,z:l},{x:h,y:n,z:l},{x:f,y:n,z:l}],enabled:a.back.visible}]});this.frameShapes.front[t]({\"class\":\"highcharts-3d-frame highcharts-3d-frame-front\",zIndex:a.front.frontFacing?-1E3:1E3,faces:[{fill:d.color(a.front.color).brighten(.1).get(),\nvertexes:[{x:f,y:q,z:p},{x:h,y:q,z:p},{x:e,y:k,z:0},{x:b,y:k,z:0}],enabled:a.front.visible&&!a.bottom.visible},{fill:d.color(a.front.color).brighten(.1).get(),vertexes:[{x:h,y:n,z:p},{x:f,y:n,z:p},{x:b,y:g,z:0},{x:e,y:g,z:0}],enabled:a.front.visible&&!a.top.visible},{fill:d.color(a.front.color).brighten(-.1).get(),vertexes:[{x:f,y:n,z:p},{x:f,y:q,z:p},{x:b,y:k,z:0},{x:b,y:g,z:0}],enabled:a.front.visible&&!a.left.visible},{fill:d.color(a.front.color).brighten(-.1).get(),vertexes:[{x:h,y:q,z:p},{x:h,\ny:n,z:p},{x:e,y:g,z:0},{x:e,y:k,z:0}],enabled:a.front.visible&&!a.right.visible},{fill:d.color(a.front.color).get(),vertexes:[{x:e,y:g,z:0},{x:b,y:g,z:0},{x:b,y:k,z:0},{x:e,y:k,z:0}],enabled:a.front.visible},{fill:d.color(a.front.color).get(),vertexes:[{x:h,y:q,z:p},{x:f,y:q,z:p},{x:f,y:n,z:p},{x:h,y:n,z:p}],enabled:a.front.visible}]})}return m.apply(this,[].slice.call(arguments,1))});v.prototype.retrieveStacks=function(d){var m=this.series,c={},a,b=1;w(this.series,function(e){a=l(e.options.stack,\nd?0:m.length-1-e.index);c[a]?c[a].series.push(e):(c[a]={series:[e],position:b},b++)});c.totalStacks=b+1;return c};v.prototype.get3dFrame=function(){var m=this,f=m.options.chart.options3d,c=f.frame,a=m.plotLeft,b=m.plotLeft+m.plotWidth,e=m.plotTop,g=m.plotTop+m.plotHeight,k=f.depth,h=d.shapeArea3d([{x:a,y:g,z:k},{x:b,y:g,z:k},{x:b,y:g,z:0},{x:a,y:g,z:0}],m),r=d.shapeArea3d([{x:a,y:e,z:0},{x:b,y:e,z:0},{x:b,y:e,z:k},{x:a,y:e,z:k}],m),n=d.shapeArea3d([{x:a,y:e,z:0},{x:a,y:e,z:k},{x:a,y:g,z:k},{x:a,y:g,\nz:0}],m),q=d.shapeArea3d([{x:b,y:e,z:k},{x:b,y:e,z:0},{x:b,y:g,z:0},{x:b,y:g,z:k}],m),p=d.shapeArea3d([{x:a,y:g,z:0},{x:b,y:g,z:0},{x:b,y:e,z:0},{x:a,y:e,z:0}],m),v=d.shapeArea3d([{x:a,y:e,z:k},{x:b,y:e,z:k},{x:b,y:g,z:k},{x:a,y:g,z:k}],m),x=!1,z=!1,F=!1,H=!1;w([].concat(m.xAxis,m.yAxis,m.zAxis),function(a){a&&(a.horiz?a.opposite?z=!0:x=!0:a.opposite?H=!0:F=!0)});var E=function(a,b,e){for(var c=[\"size\",\"color\",\"visible\"],d={},g=0;g<c.length;g++)for(var k=c[g],f=0;f<a.length;f++)if(\"object\"===typeof a[f]){var m=\na[f][k];if(void 0!==m&&null!==m){d[k]=m;break}}a=e;!0===d.visible||!1===d.visible?a=d.visible:\"auto\"===d.visible&&(a=0<=b);return{size:l(d.size,1),color:l(d.color,\"none\"),frontFacing:0<b,visible:a}},c={bottom:E([c.bottom,c.top,c],h,x),top:E([c.top,c.bottom,c],r,z),left:E([c.left,c.right,c.side,c],n,F),right:E([c.right,c.left,c.side,c],q,H),back:E([c.back,c.front,c],v,!0),front:E([c.front,c.back,c],p,!1)};\"auto\"===f.axisLabelPosition?(q=function(a,b){return a.visible!==b.visible||a.visible&&b.visible&&\na.frontFacing!==b.frontFacing},f=[],q(c.left,c.front)&&f.push({y:(e+g)/2,x:a,z:0}),q(c.left,c.back)&&f.push({y:(e+g)/2,x:a,z:k}),q(c.right,c.front)&&f.push({y:(e+g)/2,x:b,z:0}),q(c.right,c.back)&&f.push({y:(e+g)/2,x:b,z:k}),h=[],q(c.bottom,c.front)&&h.push({x:(a+b)/2,y:g,z:0}),q(c.bottom,c.back)&&h.push({x:(a+b)/2,y:g,z:k}),r=[],q(c.top,c.front)&&r.push({x:(a+b)/2,y:e,z:0}),q(c.top,c.back)&&r.push({x:(a+b)/2,y:e,z:k}),n=[],q(c.bottom,c.left)&&n.push({z:(0+k)/2,y:g,x:a}),q(c.bottom,c.right)&&n.push({z:(0+\nk)/2,y:g,x:b}),g=[],q(c.top,c.left)&&g.push({z:(0+k)/2,y:e,x:a}),q(c.top,c.right)&&g.push({z:(0+k)/2,y:e,x:b}),a=function(a,b,e){if(0===a.length)return null;if(1===a.length)return a[0];for(var c=0,d=t(a,m,!1),g=1;g<d.length;g++)e*d[g][b]>e*d[c][b]?c=g:e*d[g][b]===e*d[c][b]&&d[g].z<d[c].z&&(c=g);return a[c]},c.axes={y:{left:a(f,\"x\",-1),right:a(f,\"x\",1)},x:{top:a(r,\"y\",-1),bottom:a(h,\"y\",1)},z:{top:a(g,\"y\",-1),bottom:a(n,\"y\",1)}}):c.axes={y:{left:{x:a,z:0},right:{x:b,z:0}},x:{top:{y:e,z:0},bottom:{y:g,\nz:0}},z:{top:{x:F?b:a,y:e},bottom:{x:F?b:a,y:g}}};return c}})(z);(function(d){function r(a,e){if(a.chart.is3d()&&\"colorAxis\"!==a.coll){var b=a.chart,c=b.frame3d,d=b.plotLeft,m=b.plotWidth+d,h=b.plotTop,b=b.plotHeight+h,l=0,p=0;e=a.swapZ({x:e.x,y:e.y,z:0});if(a.isZAxis)if(a.opposite){if(null===c.axes.z.top)return{};p=e.y-h;e.x=c.axes.z.top.x;e.y=c.axes.z.top.y}else{if(null===c.axes.z.bottom)return{};p=e.y-b;e.x=c.axes.z.bottom.x;e.y=c.axes.z.bottom.y}else if(a.horiz)if(a.opposite){if(null===c.axes.x.top)return{};\np=e.y-h;e.y=c.axes.x.top.y;e.z=c.axes.x.top.z}else{if(null===c.axes.x.bottom)return{};p=e.y-b;e.y=c.axes.x.bottom.y;e.z=c.axes.x.bottom.z}else if(a.opposite){if(null===c.axes.y.right)return{};l=e.x-m;e.x=c.axes.y.right.x;e.z=c.axes.y.right.z}else{if(null===c.axes.y.left)return{};l=e.x-d;e.x=c.axes.y.left.x;e.z=c.axes.y.left.z}e=f([e],a.chart)[0];e.x+=l;e.y+=p}return e}var v,w=d.Axis,x=d.Chart,t=d.each,l=d.extend,h=d.merge,f=d.perspective,m=d.pick,u=d.splat,c=d.Tick,a=d.wrap;a(w.prototype,\"setOptions\",\nfunction(a,e){a.call(this,e);this.chart.is3d()&&\"colorAxis\"!==this.coll&&(a=this.options,a.tickWidth=m(a.tickWidth,0),a.gridLineWidth=m(a.gridLineWidth,1))});a(w.prototype,\"getPlotLinePath\",function(a){var b=a.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d()||\"colorAxis\"===this.coll||null===b)return b;var c=this.chart,d=c.options.chart.options3d,d=this.isZAxis?c.plotWidth:d.depth,c=c.frame3d,b=[this.swapZ({x:b[1],y:b[2],z:0}),this.swapZ({x:b[1],y:b[2],z:d}),this.swapZ({x:b[4],y:b[5],z:0}),\nthis.swapZ({x:b[4],y:b[5],z:d})],d=[];this.horiz?(this.isZAxis?(c.left.visible&&d.push(b[0],b[2]),c.right.visible&&d.push(b[1],b[3])):(c.front.visible&&d.push(b[0],b[2]),c.back.visible&&d.push(b[1],b[3])),c.top.visible&&d.push(b[0],b[1]),c.bottom.visible&&d.push(b[2],b[3])):(c.front.visible&&d.push(b[0],b[2]),c.back.visible&&d.push(b[1],b[3]),c.left.visible&&d.push(b[0],b[1]),c.right.visible&&d.push(b[2],b[3]));d=f(d,this.chart,!1);return this.chart.renderer.toLineSegments(d)});a(w.prototype,\"getLinePath\",\nfunction(a){return this.chart.is3d()?[]:a.apply(this,[].slice.call(arguments,1))});a(w.prototype,\"getPlotBandPath\",function(a){if(!this.chart.is3d()||\"colorAxis\"===this.coll)return a.apply(this,[].slice.call(arguments,1));var b=arguments,c=b[2],d=[],b=this.getPlotLinePath(b[1]),c=this.getPlotLinePath(c);if(b&&c)for(var f=0;f<b.length;f+=6)d.push(\"M\",b[f+1],b[f+2],\"L\",b[f+4],b[f+5],\"L\",c[f+4],c[f+5],\"L\",c[f+1],c[f+2],\"Z\");return d});a(c.prototype,\"getMarkPath\",function(a){var b=a.apply(this,[].slice.call(arguments,\n1)),b=[r(this.axis,{x:b[1],y:b[2],z:0}),r(this.axis,{x:b[4],y:b[5],z:0})];return this.axis.chart.renderer.toLineSegments(b)});a(c.prototype,\"getLabelPosition\",function(a){var b=a.apply(this,[].slice.call(arguments,1));return r(this.axis,b)});d.wrap(w.prototype,\"getTitlePosition\",function(a){var b=a.apply(this,[].slice.call(arguments,1));return r(this,b)});a(w.prototype,\"drawCrosshair\",function(a){var b=arguments;this.chart.is3d()&&b[2]&&(b[2]={plotX:b[2].plotXold||b[2].plotX,plotY:b[2].plotYold||\nb[2].plotY});a.apply(this,[].slice.call(b,1))});a(w.prototype,\"destroy\",function(a){t([\"backFrame\",\"bottomFrame\",\"sideFrame\"],function(a){this[a]&&(this[a]=this[a].destroy())},this);a.apply(this,[].slice.call(arguments,1))});w.prototype.swapZ=function(a,c){return this.isZAxis?(c=c?0:this.chart.plotLeft,{x:c+a.z,y:a.y,z:a.x-c}):a};v=d.ZAxis=function(){this.init.apply(this,arguments)};l(v.prototype,w.prototype);l(v.prototype,{isZAxis:!0,setOptions:function(a){a=h({offset:0,lineWidth:0},a);w.prototype.setOptions.call(this,\na);this.coll=\"zAxis\"},setAxisSize:function(){w.prototype.setAxisSize.call(this);this.width=this.len=this.chart.options.chart.options3d.depth;this.right=this.chart.chartWidth-this.width-this.left},getSeriesExtremes:function(){var a=this,c=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.ignoreMinPadding=a.ignoreMaxPadding=null;a.buildStacks&&a.buildStacks();t(a.series,function(b){if(b.visible||!c.options.chart.ignoreHiddenSeries)a.hasVisibleSeries=!0,b=b.zData,b.length&&(a.dataMin=Math.min(m(a.dataMin,\nb[0]),Math.min.apply(null,b)),a.dataMax=Math.max(m(a.dataMax,b[0]),Math.max.apply(null,b)))})}});a(x.prototype,\"getAxes\",function(a){var b=this,c=this.options,c=c.zAxis=u(c.zAxis||{});a.call(this);b.is3d()&&(this.zAxis=[],t(c,function(a,c){a.index=c;a.isX=!0;(new v(b,a)).setScale()}))})})(z);(function(d){var r=d.each,v=d.perspective,w=d.pick,x=d.Series,t=d.seriesTypes,l=d.inArray,h=d.svg;d=d.wrap;d(t.column.prototype,\"translate\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var f=\nthis,h=f.chart,c=f.options,a=c.depth||25,b=f.borderWidth%2?.5:0;if(h.inverted&&!f.yAxis.reversed||!h.inverted&&f.yAxis.reversed)b*=-1;var e=(c.stacking?c.stack||0:f.index)*(a+(c.groupZPadding||1));!1!==c.grouping&&(e=0);e+=c.groupZPadding||1;r(f.data,function(c){if(null!==c.y){var d=c.shapeArgs,g=c.tooltipPos,m;r([[\"x\",\"width\"],[\"y\",\"height\"]],function(a){m=d[a[0]]-b;if(0>m+d[a[1]]||m>f[a[0]+\"Axis\"].len)for(var c in d)d[c]=0;0>m&&(d[a[1]]+=d[a[0]],d[a[0]]=0);m+d[a[1]]>f[a[0]+\"Axis\"].len&&(d[a[1]]=\nf[a[0]+\"Axis\"].len-d[a[0]])});c.shapeType=\"cuboid\";d.z=e;d.depth=a;d.insidePlotArea=!0;g=v([{x:g[0],y:g[1],z:e}],h,!0)[0];c.tooltipPos=[g.x,g.y]}});f.z=e}});d(t.column.prototype,\"animate\",function(d){if(this.chart.is3d()){var f=arguments[1],l=this.yAxis,c=this,a=this.yAxis.reversed;h&&(f?r(c.data,function(b){null!==b.y&&(b.height=b.shapeArgs.height,b.shapey=b.shapeArgs.y,b.shapeArgs.height=1,a||(b.shapeArgs.y=b.stackY?b.plotY+l.translate(b.stackY):b.plotY+(b.negative?-b.height:b.height)))}):(r(c.data,\nfunction(a){null!==a.y&&(a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&&a.graphic.animate(a.shapeArgs,c.options.animation))}),this.drawDataLabels(),c.animate=null))}else d.apply(this,[].slice.call(arguments,1))});d(t.column.prototype,\"plotGroup\",function(d,h,l,c,a,b){this.chart.is3d()&&b&&!this[h]&&(this[h]=b,b.attr(this.getPlotBox()),this[h].survive=!0);return d.apply(this,Array.prototype.slice.call(arguments,1))});d(t.column.prototype,\"setVisible\",function(d,h){var f=this,c;f.chart.is3d()&&\nr(f.data,function(a){c=(a.visible=a.options.visible=h=void 0===h?!a.visible:h)?\"visible\":\"hidden\";f.options.data[l(a,f.data)]=a.options;a.graphic&&a.graphic.attr({visibility:c})});d.apply(this,Array.prototype.slice.call(arguments,1))});d(t.column.prototype,\"init\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var f=this.options,h=f.grouping,c=f.stacking,a=w(this.yAxis.options.reversedStacks,!0),b=0;if(void 0===h||h){h=this.chart.retrieveStacks(c);b=f.stack||0;for(c=0;c<\nh[b].series.length&&h[b].series[c]!==this;c++);b=10*(h.totalStacks-h[b].position)+(a?c:-c);this.xAxis.reversed||(b=10*h.totalStacks-b)}f.zIndex=b}});d(x.prototype,\"alignDataLabel\",function(d){if(this.chart.is3d()&&(\"column\"===this.type||\"columnrange\"===this.type)){var f=arguments[4],h={x:f.x,y:f.y,z:this.z},h=v([h],this.chart,!0)[0];f.x=h.x;f.y=h.y}d.apply(this,[].slice.call(arguments,1))})})(z);(function(d){var r=d.deg2rad,v=d.each,w=d.seriesTypes,x=d.svg;d=d.wrap;d(w.pie.prototype,\"translate\",function(d){d.apply(this,\n[].slice.call(arguments,1));if(this.chart.is3d()){var l=this,h=l.options,f=h.depth||0,m=l.chart.options.chart.options3d,u=m.alpha,c=m.beta,a=h.stacking?(h.stack||0)*f:l._i*f,a=a+f/2;!1!==h.grouping&&(a=0);v(l.data,function(b){var d=b.shapeArgs;b.shapeType=\"arc3d\";d.z=a;d.depth=.75*f;d.alpha=u;d.beta=c;d.center=l.center;d=(d.end+d.start)/2;b.slicedTranslation={translateX:Math.round(Math.cos(d)*h.slicedOffset*Math.cos(u*r)),translateY:Math.round(Math.sin(d)*h.slicedOffset*Math.cos(u*r))}})}});d(w.pie.prototype.pointClass.prototype,\n\"haloPath\",function(d){var l=arguments;return this.series.chart.is3d()?[]:d.call(this,l[1])});d(w.pie.prototype,\"drawPoints\",function(d){d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&v(this.points,function(d){var h=d.graphic;if(h)h[d.y&&d.visible?\"show\":\"hide\"]()})});d(w.pie.prototype,\"drawDataLabels\",function(d){if(this.chart.is3d()){var l=this.chart.options.chart.options3d;v(this.data,function(d){var f=d.shapeArgs,h=f.r,u=(f.start+f.end)/2,c=d.labelPos,a=-h*(1-Math.cos((f.alpha||l.alpha)*\nr))*Math.sin(u),b=h*(Math.cos((f.beta||l.beta)*r)-1)*Math.cos(u);v([0,2,4],function(d){c[d]+=b;c[d+1]+=a})})}d.apply(this,[].slice.call(arguments,1))});d(w.pie.prototype,\"addPoint\",function(d){d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});d(w.pie.prototype,\"animate\",function(d){if(this.chart.is3d()){var l=arguments[1],h=this.options.animation,f=this.center,m=this.group,u=this.markerGroup;x&&(!0===h&&(h={}),l?(m.oldtranslateX=m.translateX,m.oldtranslateY=\nm.translateY,l={translateX:f[0],translateY:f[1],scaleX:.001,scaleY:.001},m.attr(l),u&&(u.attrSetters=m.attrSetters,u.attr(l))):(l={translateX:m.oldtranslateX,translateY:m.oldtranslateY,scaleX:1,scaleY:1},m.animate(l,h),u&&u.animate(l,h),this.animate=null))}else d.apply(this,[].slice.call(arguments,1))})})(z);(function(d){var r=d.perspective,v=d.pick,w=d.Point,x=d.seriesTypes,t=d.wrap;t(x.scatter.prototype,\"translate\",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var h=\nthis.chart,f=v(this.zAxis,h.options.zAxis[0]),m=[],l,c,a;for(a=0;a<this.data.length;a++)l=this.data[a],c=f.isLog&&f.val2lin?f.val2lin(l.z):l.z,l.plotZ=f.translate(c),l.isInside=l.isInside?c>=f.min&&c<=f.max:!1,m.push({x:l.plotX,y:l.plotY,z:l.plotZ});h=r(m,h,!0);for(a=0;a<this.data.length;a++)l=this.data[a],f=h[a],l.plotXold=l.plotX,l.plotYold=l.plotY,l.plotZold=l.plotZ,l.plotX=f.x,l.plotY=f.y,l.plotZ=f.z}});t(x.scatter.prototype,\"init\",function(d,h,f){h.is3d()&&(this.axisTypes=[\"xAxis\",\"yAxis\",\"zAxis\"],\nthis.pointArrayMap=[\"x\",\"y\",\"z\"],this.parallelArrays=[\"x\",\"y\",\"z\"],this.directTouch=!0);d=d.apply(this,[h,f]);this.chart.is3d()&&(this.tooltipOptions.pointFormat=this.userOptions.tooltip?this.userOptions.tooltip.pointFormat||\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3ez: \\x3cb\\x3e{point.z}\\x3c/b\\x3e\\x3cbr/\\x3e\":\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3ez: \\x3cb\\x3e{point.z}\\x3c/b\\x3e\\x3cbr/\\x3e\");return d});t(x.scatter.prototype,\n\"pointAttribs\",function(l,h){var f=l.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&h&&(f.zIndex=d.pointCameraDistance(h,this.chart));return f});t(w.prototype,\"applyOptions\",function(d){var h=d.apply(this,[].slice.call(arguments,1));this.series.chart.is3d()&&void 0===h.z&&(h.z=0);return h})})(z)});\n"
  },
  {
    "path": "assets/highcharts/js/highcharts-3d.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * 3D features for Highcharts JS\n *\n * @license: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         *\tMathematical Functionility\n         */\n        var deg2rad = H.deg2rad,\n            pick = H.pick;\n        /**\n         * Apply 3-D rotation\n         * Euler Angles (XYZ): cosA = cos(Alfa|Roll), cosB = cos(Beta|Pitch), cosG = cos(Gamma|Yaw) \n         * \n         * Composite rotation:\n         * |          cosB * cosG             |           cosB * sinG            |    -sinB    |\n         * | sinA * sinB * cosG - cosA * sinG | sinA * sinB * sinG + cosA * cosG | sinA * cosB |\n         * | cosA * sinB * cosG + sinA * sinG | cosA * sinB * sinG - sinA * cosG | cosA * cosB |\n         * \n         * Now, Gamma/Yaw is not used (angle=0), so we assume cosG = 1 and sinG = 0, so we get:\n         * |     cosB    |   0    |   - sinB    |\n         * | sinA * sinB |  cosA  | sinA * cosB |\n         * | cosA * sinB | - sinA | cosA * cosB |\n         * \n         * But in browsers, y is reversed, so we get sinA => -sinA. The general result is:\n         * |      cosB     |   0    |    - sinB     |     | x |     | px |\n         * | - sinA * sinB |  cosA  | - sinA * cosB |  x  | y |  =  | py | \n         * |  cosA * sinB  |  sinA  |  cosA * cosB  |     | z |     | pz |\n         */\n        function rotate3D(x, y, z, angles) {\n            return {\n                x: angles.cosB * x - angles.sinB * z,\n                y: -angles.sinA * angles.sinB * x + angles.cosA * y - angles.cosB * angles.sinA * z,\n                z: angles.cosA * angles.sinB * x + angles.sinA * y + angles.cosA * angles.cosB * z\n            };\n        }\n\n        function perspective3D(coordinate, origin, distance) {\n            var projection = ((distance > 0) && (distance < Number.POSITIVE_INFINITY)) ? distance / (coordinate.z + origin.z + distance) : 1;\n            return {\n                x: coordinate.x * projection,\n                y: coordinate.y * projection\n            };\n        }\n\n        /**\n         * Transforms a given array of points according to the angles in chart.options.\n         * Parameters:\n         *\t\t- points: the array of points\n         *\t\t- chart: the chart\n         *\t\t- insidePlotArea: wether to verifiy the points are inside the plotArea\n         * Returns:\n         *\t\t- an array of transformed points\n         */\n        H.perspective = function(points, chart, insidePlotArea) {\n            var options3d = chart.options.chart.options3d,\n                inverted = insidePlotArea ? chart.inverted : false,\n                origin = {\n                    x: chart.plotWidth / 2,\n                    y: chart.plotHeight / 2,\n                    z: options3d.depth / 2,\n                    vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)\n                },\n                scale = chart.scale3d || 1,\n                beta = deg2rad * options3d.beta * (inverted ? -1 : 1),\n                alpha = deg2rad * options3d.alpha * (inverted ? -1 : 1),\n                angles = {\n                    cosA: Math.cos(alpha),\n                    cosB: Math.cos(-beta),\n                    sinA: Math.sin(alpha),\n                    sinB: Math.sin(-beta)\n                };\n\n            if (!insidePlotArea) {\n                origin.x += chart.plotLeft;\n                origin.y += chart.plotTop;\n            }\n\n            // Transform each point\n            return H.map(points, function(point) {\n                var rotated = rotate3D(\n                        (inverted ? point.y : point.x) - origin.x,\n                        (inverted ? point.x : point.y) - origin.y,\n                        (point.z || 0) - origin.z,\n                        angles\n                    ),\n                    coordinate = perspective3D(rotated, origin, origin.vd); // Apply perspective\n\n                // Apply translation\n                coordinate.x = coordinate.x * scale + origin.x;\n                coordinate.y = coordinate.y * scale + origin.y;\n                coordinate.z = rotated.z * scale + origin.z;\n\n                return {\n                    x: (inverted ? coordinate.y : coordinate.x),\n                    y: (inverted ? coordinate.x : coordinate.y),\n                    z: coordinate.z\n                };\n            });\n        };\n\n        /**\n         * Calculate a distance from camera to points - made for calculating zIndex of scatter points.\n         * Parameters:\n         *\t\t- coordinates: The coordinates of the specific point\n         *\t\t- chart: the chart\n         * Returns:\n         *\t\t- a distance from camera to point\n         */\n        H.pointCameraDistance = function(coordinates, chart) {\n            var options3d = chart.options.chart.options3d,\n                cameraPosition = {\n                    x: chart.plotWidth / 2,\n                    y: chart.plotHeight / 2,\n                    z: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) + options3d.depth\n                },\n                distance = Math.sqrt(Math.pow(cameraPosition.x - coordinates.plotX, 2) + Math.pow(cameraPosition.y - coordinates.plotY, 2) + Math.pow(cameraPosition.z - coordinates.plotZ, 2));\n            return distance;\n        };\n\n        /**\n         * Calculate area of a 2D polygon using Shoelace algorithm\n         * http://en.wikipedia.org/wiki/Shoelace_formula\n         */\n        H.shapeArea = function(vertexes) {\n            var area = 0,\n                i,\n                j;\n            for (i = 0; i < vertexes.length; i++) {\n                j = (i + 1) % vertexes.length;\n                area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y;\n            }\n            return area / 2;\n        };\n\n        /**\n         * Calculate area of a 3D polygon after perspective projection\n         */\n        H.shapeArea3d = function(vertexes, chart, insidePlotArea) {\n            return H.shapeArea(H.perspective(vertexes, chart, insidePlotArea));\n        };\n\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var cos = Math.cos,\n            PI = Math.PI,\n            sin = Math.sin;\n\n\n        var animObject = H.animObject,\n            charts = H.charts,\n            color = H.color,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            each = H.each,\n            extend = H.extend,\n            inArray = H.inArray,\n            map = H.map,\n            merge = H.merge,\n            perspective = H.perspective,\n            pick = H.pick,\n            SVGElement = H.SVGElement,\n            SVGRenderer = H.SVGRenderer,\n            wrap = H.wrap;\n        /*** \n        \tEXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES\n        \t***/\n        ////// HELPER METHODS //////\n\n        var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2);\n\n        /** Method to construct a curved path\n         * Can 'wrap' around more then 180 degrees\n         */\n        function curveTo(cx, cy, rx, ry, start, end, dx, dy) {\n            var result = [],\n                arcAngle = end - start;\n            if ((end > start) && (end - start > Math.PI / 2 + 0.0001)) {\n                result = result.concat(curveTo(cx, cy, rx, ry, start, start + (Math.PI / 2), dx, dy));\n                result = result.concat(curveTo(cx, cy, rx, ry, start + (Math.PI / 2), end, dx, dy));\n                return result;\n            }\n            if ((end < start) && (start - end > Math.PI / 2 + 0.0001)) {\n                result = result.concat(curveTo(cx, cy, rx, ry, start, start - (Math.PI / 2), dx, dy));\n                result = result.concat(curveTo(cx, cy, rx, ry, start - (Math.PI / 2), end, dx, dy));\n                return result;\n            }\n            return [\n                'C',\n                cx + (rx * Math.cos(start)) - ((rx * dFactor * arcAngle) * Math.sin(start)) + dx,\n                cy + (ry * Math.sin(start)) + ((ry * dFactor * arcAngle) * Math.cos(start)) + dy,\n                cx + (rx * Math.cos(end)) + ((rx * dFactor * arcAngle) * Math.sin(end)) + dx,\n                cy + (ry * Math.sin(end)) - ((ry * dFactor * arcAngle) * Math.cos(end)) + dy,\n\n                cx + (rx * Math.cos(end)) + dx,\n                cy + (ry * Math.sin(end)) + dy\n            ];\n        }\n\n\n        /**\n         * Override the SVGRenderer initiator to add definitions used by brighter and\n         * darker faces of the cuboids.\n         */\n        wrap(SVGRenderer.prototype, 'init', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            each([{\n                name: 'darker',\n                slope: 0.6\n            }, {\n                name: 'brighter',\n                slope: 1.4\n            }], function(cfg) {\n                this.definition({\n                    tagName: 'filter',\n                    id: 'highcharts-' + cfg.name,\n                    children: [{\n                        tagName: 'feComponentTransfer',\n                        children: [{\n                            tagName: 'feFuncR',\n                            type: 'linear',\n                            slope: cfg.slope\n                        }, {\n                            tagName: 'feFuncG',\n                            type: 'linear',\n                            slope: cfg.slope\n                        }, {\n                            tagName: 'feFuncB',\n                            type: 'linear',\n                            slope: cfg.slope\n                        }]\n                    }]\n                });\n            }, this);\n        });\n\n\n        SVGRenderer.prototype.toLinePath = function(points, closed) {\n            var result = [];\n\n            // Put \"L x y\" for each point\n            each(points, function(point) {\n                result.push('L', point.x, point.y);\n            });\n\n            if (points.length) {\n                // Set the first element to M\n                result[0] = 'M';\n\n                // If it is a closed line, add Z\n                if (closed) {\n                    result.push('Z');\n                }\n            }\n\n            return result;\n        };\n\n        SVGRenderer.prototype.toLineSegments = function(points) {\n            var result = [];\n\n            var m = true;\n            each(points, function(point) {\n                result.push(m ? 'M' : 'L', point.x, point.y);\n                m = !m;\n            });\n\n            return result;\n        };\n\n        /**\n         * A 3-D Face is defined by it's 3D vertexes, and is only\n         * visible if it's vertexes are counter-clockwise (Back-face culling).\n         * It is used as a polyhedron Element\n         */\n        SVGRenderer.prototype.face3d = function(args) {\n            var renderer = this,\n                ret = this.createElement('path');\n            ret.vertexes = [];\n            ret.insidePlotArea = false;\n            ret.enabled = true;\n\n            wrap(ret, 'attr', function(proceed, hash) {\n                if (typeof hash === 'object' &&\n                    (defined(hash.enabled) || defined(hash.vertexes) || defined(hash.insidePlotArea))) {\n                    this.enabled = pick(hash.enabled, this.enabled);\n                    this.vertexes = pick(hash.vertexes, this.vertexes);\n                    this.insidePlotArea = pick(hash.insidePlotArea, this.insidePlotArea);\n                    delete hash.enabled;\n                    delete hash.vertexes;\n                    delete hash.insidePlotArea;\n\n                    var chart = charts[renderer.chartIndex],\n                        vertexes2d = perspective(this.vertexes, chart, this.insidePlotArea),\n                        path = renderer.toLinePath(vertexes2d, true),\n                        area = H.shapeArea(vertexes2d),\n                        visibility = (this.enabled && area > 0) ? 'visible' : 'hidden';\n\n                    hash.d = path;\n                    hash.visibility = visibility;\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            wrap(ret, 'animate', function(proceed, params) {\n                if (typeof params === 'object' &&\n                    (defined(params.enabled) || defined(params.vertexes) || defined(params.insidePlotArea))) {\n                    this.enabled = pick(params.enabled, this.enabled);\n                    this.vertexes = pick(params.vertexes, this.vertexes);\n                    this.insidePlotArea = pick(params.insidePlotArea, this.insidePlotArea);\n                    delete params.enabled;\n                    delete params.vertexes;\n                    delete params.insidePlotArea;\n\n                    var chart = charts[renderer.chartIndex],\n                        vertexes2d = perspective(this.vertexes, chart, this.insidePlotArea),\n                        path = renderer.toLinePath(vertexes2d, true),\n                        area = H.shapeArea(vertexes2d),\n                        visibility = (this.enabled && area > 0) ? 'visible' : 'hidden';\n\n                    params.d = path;\n                    this.attr('visibility', visibility);\n                }\n\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            return ret.attr(args);\n        };\n\n        /**\n         * A Polyhedron is a handy way of defining a group of 3-D faces.\n         * It's only attribute is `faces`, an array of attributes of each one of it's Face3D instances.\n         */\n        SVGRenderer.prototype.polyhedron = function(args) {\n            var renderer = this,\n                result = this.g(),\n                destroy = result.destroy;\n\n\n\n            result.faces = [];\n\n\n            // destroy all children\n            result.destroy = function() {\n                for (var i = 0; i < result.faces.length; i++) {\n                    result.faces[i].destroy();\n                }\n                return destroy.call(this);\n            };\n\n            wrap(result, 'attr', function(proceed, hash, val, complete, continueAnimation) {\n                if (typeof hash === 'object' && defined(hash.faces)) {\n                    while (result.faces.length > hash.faces.length) {\n                        result.faces.pop().destroy();\n                    }\n                    while (result.faces.length < hash.faces.length) {\n                        result.faces.push(renderer.face3d().add(result));\n                    }\n                    for (var i = 0; i < hash.faces.length; i++) {\n                        result.faces[i].attr(hash.faces[i], null, complete, continueAnimation);\n                    }\n                    delete hash.faces;\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            wrap(result, 'animate', function(proceed, params, duration, complete) {\n                if (params && params.faces) {\n                    while (result.faces.length > params.faces.length) {\n                        result.faces.pop().destroy();\n                    }\n                    while (result.faces.length < params.faces.length) {\n                        result.faces.push(renderer.face3d().add(result));\n                    }\n                    for (var i = 0; i < params.faces.length; i++) {\n                        result.faces[i].animate(params.faces[i], duration, complete);\n                    }\n                    delete params.faces;\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            return result.attr(args);\n        };\n\n        ////// CUBOIDS //////\n        SVGRenderer.prototype.cuboid = function(shapeArgs) {\n\n            var result = this.g(),\n                destroy = result.destroy,\n                paths = this.cuboidPath(shapeArgs);\n\n\n\n            // create the 3 sides\n            result.front = this.path(paths[0]).attr({\n                'class': 'highcharts-3d-front'\n            }).add(result); // Front, top and side are never overlapping in our case so it is redundant to set zIndex of every element.\n            result.top = this.path(paths[1]).attr({\n                'class': 'highcharts-3d-top'\n            }).add(result);\n            result.side = this.path(paths[2]).attr({\n                'class': 'highcharts-3d-side'\n            }).add(result);\n\n            // apply the fill everywhere, the top a bit brighter, the side a bit darker\n            result.fillSetter = function(fill) {\n                this.front.attr({\n                    fill: fill\n                });\n                this.top.attr({\n                    fill: color(fill).brighten(0.1).get()\n                });\n                this.side.attr({\n                    fill: color(fill).brighten(-0.1).get()\n                });\n\n                this.color = fill;\n                return this;\n            };\n\n            // apply opacaity everywhere\n            result.opacitySetter = function(opacity) {\n                this.front.attr({\n                    opacity: opacity\n                });\n                this.top.attr({\n                    opacity: opacity\n                });\n                this.side.attr({\n                    opacity: opacity\n                });\n                return this;\n            };\n\n            result.attr = function(args, val) {\n\n                // Resolve setting attributes by string name\n                if (typeof args === 'string' && typeof val !== 'undefined') {\n                    var key = args;\n                    args = {};\n                    args[key] = val;\n                }\n\n                if (args.shapeArgs || defined(args.x)) {\n                    var shapeArgs = args.shapeArgs || args;\n                    var paths = this.renderer.cuboidPath(shapeArgs);\n                    this.front.attr({\n                        d: paths[0]\n                    });\n                    this.top.attr({\n                        d: paths[1]\n                    });\n                    this.side.attr({\n                        d: paths[2]\n                    });\n                } else {\n                    return H.SVGElement.prototype.attr.call(this, args); // getter returns value\n                }\n\n                return this;\n            };\n\n            result.animate = function(args, duration, complete) {\n                if (defined(args.x) && defined(args.y)) {\n                    var paths = this.renderer.cuboidPath(args);\n                    this.front.animate({\n                        d: paths[0]\n                    }, duration, complete);\n                    this.top.animate({\n                        d: paths[1]\n                    }, duration, complete);\n                    this.side.animate({\n                        d: paths[2]\n                    }, duration, complete);\n                    this.attr({\n                        zIndex: -paths[3] // #4774\n                    });\n                } else if (args.opacity) {\n                    this.front.animate(args, duration, complete);\n                    this.top.animate(args, duration, complete);\n                    this.side.animate(args, duration, complete);\n                } else {\n                    SVGElement.prototype.animate.call(this, args, duration, complete);\n                }\n                return this;\n            };\n\n            // destroy all children\n            result.destroy = function() {\n                this.front.destroy();\n                this.top.destroy();\n                this.side.destroy();\n\n                return destroy.call(this);\n            };\n\n            // Apply the Z index to the cuboid group\n            result.attr({\n                zIndex: -paths[3]\n            });\n\n            return result;\n        };\n\n        /**\n         *\tGenerates a cuboid\n         */\n        H.SVGRenderer.prototype.cuboidPath = function(shapeArgs) {\n            var x = shapeArgs.x,\n                y = shapeArgs.y,\n                z = shapeArgs.z,\n                h = shapeArgs.height,\n                w = shapeArgs.width,\n                d = shapeArgs.depth,\n                chart = charts[this.chartIndex],\n                front,\n                back,\n                top,\n                bottom,\n                left,\n                right,\n                shape,\n                path1,\n                path2,\n                path3,\n                isFront,\n                isTop,\n                isRight,\n                options3d = chart.options.chart.options3d,\n                alpha = options3d.alpha,\n                // Priority for x axis is the biggest, \n                // because of x direction has biggest influence on zIndex\n                incrementX = 10000,\n                // y axis has the smallest priority in case of our charts \n                // (needs to be set because of stacking)\n                incrementY = 10,\n                incrementZ = 100,\n                zIndex = 0;\n\n            // The 8 corners of the cube\n            var pArr = [{\n                x: x,\n                y: y,\n                z: z\n            }, {\n                x: x + w,\n                y: y,\n                z: z\n            }, {\n                x: x + w,\n                y: y + h,\n                z: z\n            }, {\n                x: x,\n                y: y + h,\n                z: z\n            }, {\n                x: x,\n                y: y + h,\n                z: z + d\n            }, {\n                x: x + w,\n                y: y + h,\n                z: z + d\n            }, {\n                x: x + w,\n                y: y,\n                z: z + d\n            }, {\n                x: x,\n                y: y,\n                z: z + d\n            }];\n\n            // apply perspective\n            pArr = perspective(pArr, chart, shapeArgs.insidePlotArea);\n\n            // helper method to decide which side is visible\n            function mapPath(i) {\n                return pArr[i];\n            }\n\n            /*\n             * First value - path with specific side\n             * Second  value - added information about side for later calculations. \n             * Possible second values are 0 for path1, 1 for path2 and -1 for no path choosed.\n             */\n            var pickShape = function(path1, path2) {\n                var ret = [\n                    [], -1\n                ];\n                path1 = map(path1, mapPath);\n                path2 = map(path2, mapPath);\n                if (H.shapeArea(path1) < 0) {\n                    ret = [path1, 0];\n                } else if (H.shapeArea(path2) < 0) {\n                    ret = [path2, 1];\n                }\n                return ret;\n            };\n\n            // front or back\n            front = [3, 2, 1, 0];\n            back = [7, 6, 5, 4];\n            shape = pickShape(front, back);\n            path1 = shape[0];\n            isFront = shape[1];\n\n\n            // top or bottom\n            top = [1, 6, 7, 0];\n            bottom = [4, 5, 2, 3];\n            shape = pickShape(top, bottom);\n            path2 = shape[0];\n            isTop = shape[1];\n\n            // side\n            right = [1, 2, 5, 6];\n            left = [0, 7, 4, 3];\n            shape = pickShape(right, left);\n            path3 = shape[0];\n            isRight = shape[1];\n\n            /*\n             * New block used for calculating zIndex. It is basing on X, Y and Z position of specific columns.\n             * All zIndexes (for X, Y and Z values) are added to the final zIndex, where every value has different priority.\n             * The biggest priority is in X and Z directions, the lowest index is for stacked columns (Y direction and the same X and Z positions).\n             * Big differents between priorities is made because we need to ensure that even for big changes in Y and Z parameters\n             * all columns will be drawn correctly.\n             */\n\n            if (isRight === 1) {\n                zIndex += incrementX * (1000 - x);\n            } else if (!isRight) {\n                zIndex += incrementX * x;\n            }\n\n            zIndex += incrementY * (!isTop ||\n                (alpha >= 0 && alpha <= 180 || alpha < 360 && alpha > 357.5) ? // Numbers checked empirically\n                chart.plotHeight - y : 10 + y\n            );\n\n            if (isFront === 1) {\n                zIndex += incrementZ * (z);\n            } else if (!isFront) {\n                zIndex += incrementZ * (1000 - z);\n            }\n\n            zIndex = -Math.round(zIndex);\n\n            return [\n                this.toLinePath(path1, true),\n                this.toLinePath(path2, true),\n                this.toLinePath(path3, true),\n                zIndex\n            ]; // #4774\n        };\n\n        ////// SECTORS //////\n        H.SVGRenderer.prototype.arc3d = function(attribs) {\n\n            var wrapper = this.g(),\n                renderer = wrapper.renderer,\n                customAttribs = ['x', 'y', 'r', 'innerR', 'start', 'end'];\n\n            /**\n             * Get custom attributes. Don't mutate the original object and return an object with only custom attr.\n             */\n            function suckOutCustom(params) {\n                var hasCA = false,\n                    ca = {};\n\n                params = merge(params); // Don't mutate the original object\n\n                for (var key in params) {\n                    if (inArray(key, customAttribs) !== -1) {\n                        ca[key] = params[key];\n                        delete params[key];\n                        hasCA = true;\n                    }\n                }\n                return hasCA ? ca : false;\n            }\n\n            attribs = merge(attribs);\n\n            attribs.alpha *= deg2rad;\n            attribs.beta *= deg2rad;\n\n            // Create the different sub sections of the shape\n            wrapper.top = renderer.path();\n            wrapper.side1 = renderer.path();\n            wrapper.side2 = renderer.path();\n            wrapper.inn = renderer.path();\n            wrapper.out = renderer.path();\n\n            /**\n             * Add all faces\n             */\n            wrapper.onAdd = function() {\n                var parent = wrapper.parentGroup,\n                    className = wrapper.attr('class');\n                wrapper.top.add(wrapper);\n\n                // These faces are added outside the wrapper group because the z index\n                // relates to neighbour elements as well\n                each(['out', 'inn', 'side1', 'side2'], function(face) {\n                    wrapper[face]\n                        .addClass(className + ' highcharts-3d-side')\n                        .add(parent);\n                });\n            };\n\n            /**\n             * Compute the transformed paths and set them to the composite shapes\n             */\n            wrapper.setPaths = function(attribs) {\n\n                var paths = wrapper.renderer.arc3dPath(attribs),\n                    zIndex = paths.zTop * 100;\n\n                wrapper.attribs = attribs;\n\n                wrapper.top.attr({\n                    d: paths.top,\n                    zIndex: paths.zTop\n                });\n                wrapper.inn.attr({\n                    d: paths.inn,\n                    zIndex: paths.zInn\n                });\n                wrapper.out.attr({\n                    d: paths.out,\n                    zIndex: paths.zOut\n                });\n                wrapper.side1.attr({\n                    d: paths.side1,\n                    zIndex: paths.zSide1\n                });\n                wrapper.side2.attr({\n                    d: paths.side2,\n                    zIndex: paths.zSide2\n                });\n\n\n                // show all children\n                wrapper.zIndex = zIndex;\n                wrapper.attr({\n                    zIndex: zIndex\n                });\n\n                // Set the radial gradient center the first time\n                if (attribs.center) {\n                    wrapper.top.setRadialReference(attribs.center);\n                    delete attribs.center;\n                }\n            };\n            wrapper.setPaths(attribs);\n\n            // Apply the fill to the top and a darker shade to the sides\n            wrapper.fillSetter = function(value) {\n                var darker = color(value).brighten(-0.1).get();\n\n                this.fill = value;\n\n                this.side1.attr({\n                    fill: darker\n                });\n                this.side2.attr({\n                    fill: darker\n                });\n                this.inn.attr({\n                    fill: darker\n                });\n                this.out.attr({\n                    fill: darker\n                });\n                this.top.attr({\n                    fill: value\n                });\n                return this;\n            };\n\n            // Apply the same value to all. These properties cascade down to the children\n            // when set to the composite arc3d.\n            each(['opacity', 'translateX', 'translateY', 'visibility'], function(setter) {\n                wrapper[setter + 'Setter'] = function(value, key) {\n                    wrapper[key] = value;\n                    each(['out', 'inn', 'side1', 'side2', 'top'], function(el) {\n                        wrapper[el].attr(key, value);\n                    });\n                };\n            });\n\n            /**\n             * Override attr to remove shape attributes and use those to set child paths\n             */\n            wrap(wrapper, 'attr', function(proceed, params) {\n                var ca;\n                if (typeof params === 'object') {\n                    ca = suckOutCustom(params);\n                    if (ca) {\n                        extend(wrapper.attribs, ca);\n                        wrapper.setPaths(wrapper.attribs);\n                    }\n                }\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            });\n\n            /**\n             * Override the animate function by sucking out custom parameters related to the shapes directly,\n             * and update the shapes from the animation step.\n             */\n            wrap(wrapper, 'animate', function(proceed, params, animation, complete) {\n                var ca,\n                    from = this.attribs,\n                    to,\n                    anim;\n\n                // Attribute-line properties connected to 3D. These shouldn't have been in the \n                // attribs collection in the first place.\n                delete params.center;\n                delete params.z;\n                delete params.depth;\n                delete params.alpha;\n                delete params.beta;\n\n                anim = animObject(pick(animation, this.renderer.globalAnimation));\n\n                if (anim.duration) {\n                    ca = suckOutCustom(params);\n                    params.dummy = 1; // Params need to have a property in order for the step to run (#5765)\n\n                    if (ca) {\n                        to = ca;\n                        anim.step = function(a, fx) {\n                            function interpolate(key) {\n                                return from[key] + (pick(to[key], from[key]) - from[key]) * fx.pos;\n                            }\n\n                            if (fx.prop === 'dummy') {\n                                fx.elem.setPaths(merge(from, {\n                                    x: interpolate('x'),\n                                    y: interpolate('y'),\n                                    r: interpolate('r'),\n                                    innerR: interpolate('innerR'),\n                                    start: interpolate('start'),\n                                    end: interpolate('end')\n                                }));\n                            }\n                        };\n                    }\n                    animation = anim; // Only when duration (#5572)\n                }\n                return proceed.call(this, params, animation, complete);\n            });\n\n            // destroy all children\n            wrapper.destroy = function() {\n                this.top.destroy();\n                this.out.destroy();\n                this.inn.destroy();\n                this.side1.destroy();\n                this.side2.destroy();\n\n                SVGElement.prototype.destroy.call(this);\n            };\n            // hide all children\n            wrapper.hide = function() {\n                this.top.hide();\n                this.out.hide();\n                this.inn.hide();\n                this.side1.hide();\n                this.side2.hide();\n            };\n            wrapper.show = function() {\n                this.top.show();\n                this.out.show();\n                this.inn.show();\n                this.side1.show();\n                this.side2.show();\n            };\n            return wrapper;\n        };\n\n        /**\n         * Generate the paths required to draw a 3D arc\n         */\n        SVGRenderer.prototype.arc3dPath = function(shapeArgs) {\n            var cx = shapeArgs.x, // x coordinate of the center\n                cy = shapeArgs.y, // y coordinate of the center\n                start = shapeArgs.start, // start angle\n                end = shapeArgs.end - 0.00001, // end angle\n                r = shapeArgs.r, // radius\n                ir = shapeArgs.innerR, // inner radius\n                d = shapeArgs.depth, // depth\n                alpha = shapeArgs.alpha, // alpha rotation of the chart\n                beta = shapeArgs.beta; // beta rotation of the chart\n\n            // Derived Variables\n            var cs = Math.cos(start), // cosinus of the start angle\n                ss = Math.sin(start), // sinus of the start angle\n                ce = Math.cos(end), // cosinus of the end angle\n                se = Math.sin(end), // sinus of the end angle\n                rx = r * Math.cos(beta), // x-radius \n                ry = r * Math.cos(alpha), // y-radius\n                irx = ir * Math.cos(beta), // x-radius (inner)\n                iry = ir * Math.cos(alpha), // y-radius (inner)\n                dx = d * Math.sin(beta), // distance between top and bottom in x\n                dy = d * Math.sin(alpha); // distance between top and bottom in y\n\n            // TOP\n            var top = ['M', cx + (rx * cs), cy + (ry * ss)];\n            top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0));\n            top = top.concat([\n                'L', cx + (irx * ce), cy + (iry * se)\n            ]);\n            top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0));\n            top = top.concat(['Z']);\n            // OUTSIDE\n            var b = (beta > 0 ? Math.PI / 2 : 0),\n                a = (alpha > 0 ? 0 : Math.PI / 2);\n\n            var start2 = start > -b ? start : (end > -b ? -b : start),\n                end2 = end < PI - a ? end : (start < PI - a ? PI - a : end),\n                midEnd = 2 * PI - a;\n\n            // When slice goes over bottom middle, need to add both, left and right outer side.\n            // Additionally, when we cross right hand edge, create sharp edge. Outer shape/wall:\n            //\n            //            -------\n            //          /    ^    \\\n            //    4)   /   /   \\   \\  1)\n            //        /   /     \\   \\\n            //       /   /       \\   \\\n            // (c)=> ====         ==== <=(d) \n            //       \\   \\       /   /\n            //        \\   \\<=(a)/   /\n            //         \\   \\   /   / <=(b)\n            //    3)    \\    v    /  2)\n            //            -------\n            //\n            // (a) - inner side\n            // (b) - outer side\n            // (c) - left edge (sharp)\n            // (d) - right edge (sharp)\n            // 1..n - rendering order for startAngle = 0, when set to e.g 90, order changes clockwise (1->2, 2->3, n->1) and counterclockwise for negative startAngle\n\n            var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))];\n            out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0));\n\n            if (end > midEnd && start < midEnd) { // When shape is wide, it can cross both, (c) and (d) edges, when using startAngle\n                // Go to outer side\n                out = out.concat([\n                    'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy\n                ]);\n                // Curve to the right edge of the slice (d)\n                out = out.concat(curveTo(cx, cy, rx, ry, end2, midEnd, dx, dy));\n                // Go to the inner side\n                out = out.concat([\n                    'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd))\n                ]);\n                // Curve to the true end of the slice\n                out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end, 0, 0));\n                // Go to the outer side\n                out = out.concat([\n                    'L', cx + (rx * cos(end)) + dx, cy + (ry * sin(end)) + dy\n                ]);\n                // Go back to middle (d)\n                out = out.concat(curveTo(cx, cy, rx, ry, end, midEnd, dx, dy));\n                out = out.concat([\n                    'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd))\n                ]);\n                // Go back to the left edge\n                out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end2, 0, 0));\n            } else if (end > PI - a && start < PI - a) { // But shape can cross also only (c) edge:\n                // Go to outer side\n                out = out.concat([\n                    'L', cx + (rx * Math.cos(end2)) + dx, cy + (ry * Math.sin(end2)) + dy\n                ]);\n                // Curve to the true end of the slice\n                out = out.concat(curveTo(cx, cy, rx, ry, end2, end, dx, dy));\n                // Go to the inner side\n                out = out.concat([\n                    'L', cx + (rx * Math.cos(end)), cy + (ry * Math.sin(end))\n                ]);\n                // Go back to the artifical end2\n                out = out.concat(curveTo(cx, cy, rx, ry, end, end2, 0, 0));\n            }\n\n            out = out.concat([\n                'L', cx + (rx * Math.cos(end2)) + dx, cy + (ry * Math.sin(end2)) + dy\n            ]);\n            out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy));\n            out = out.concat(['Z']);\n\n            // INSIDE\n            var inn = ['M', cx + (irx * cs), cy + (iry * ss)];\n            inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0));\n            inn = inn.concat([\n                'L', cx + (irx * Math.cos(end)) + dx, cy + (iry * Math.sin(end)) + dy\n            ]);\n            inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy));\n            inn = inn.concat(['Z']);\n\n            // SIDES\n            var side1 = [\n                'M', cx + (rx * cs), cy + (ry * ss),\n                'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy,\n                'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy,\n                'L', cx + (irx * cs), cy + (iry * ss),\n                'Z'\n            ];\n            var side2 = [\n                'M', cx + (rx * ce), cy + (ry * se),\n                'L', cx + (rx * ce) + dx, cy + (ry * se) + dy,\n                'L', cx + (irx * ce) + dx, cy + (iry * se) + dy,\n                'L', cx + (irx * ce), cy + (iry * se),\n                'Z'\n            ];\n\n            // correction for changed position of vanishing point caused by alpha and beta rotations\n            var angleCorr = Math.atan2(dy, -dx),\n                angleEnd = Math.abs(end + angleCorr),\n                angleStart = Math.abs(start + angleCorr),\n                angleMid = Math.abs((start + end) / 2 + angleCorr);\n\n            // set to 0-PI range\n            function toZeroPIRange(angle) {\n                angle = angle % (2 * Math.PI);\n                if (angle > Math.PI) {\n                    angle = 2 * Math.PI - angle;\n                }\n                return angle;\n            }\n            angleEnd = toZeroPIRange(angleEnd);\n            angleStart = toZeroPIRange(angleStart);\n            angleMid = toZeroPIRange(angleMid);\n\n            // *1e5 is to compensate pInt in zIndexSetter\n            var incPrecision = 1e5,\n                a1 = angleMid * incPrecision,\n                a2 = angleStart * incPrecision,\n                a3 = angleEnd * incPrecision;\n\n            return {\n                top: top,\n                zTop: Math.PI * incPrecision + 1, // max angle is PI, so this is allways higher\n                out: out,\n                zOut: Math.max(a1, a2, a3),\n                inn: inn,\n                zInn: Math.max(a1, a2, a3),\n                side1: side1,\n                zSide1: a3 * 0.99, // to keep below zOut and zInn in case of same values\n                side2: side2,\n                zSide2: a2 * 0.99\n            };\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            merge = H.merge,\n            perspective = H.perspective,\n            pick = H.pick,\n            wrap = H.wrap;\n\n        /*** \n        \tEXTENSION FOR 3D CHARTS\n        ***/\n        // Shorthand to check the is3d flag\n        Chart.prototype.is3d = function() {\n            return this.options.chart.options3d && this.options.chart.options3d.enabled; // #4280\n        };\n\n        Chart.prototype.propsRequireDirtyBox.push('chart.options3d');\n        Chart.prototype.propsRequireUpdateSeries.push('chart.options3d');\n\n        /**\n         * Calculate scale of the 3D view. That is required to\n         * fit chart's 3D projection into the actual plotting area. Reported as #4933.\n         * @notice This function should ideally take the plot values instead of a chart object, \n         *         but since the chart object is needed for perspective it is not practical. \n         *         Possible to make both getScale and perspective more logical and also immutable.\n         * @param  {Object} chart Chart object\n         * @param  {Number} chart.plotLeft\n         * @param  {Number} chart.plotWidth\n         * @param  {Number} chart.plotTop\n         * @param  {Number} chart.plotHeight\n         * @param  {Number} depth The depth of the chart\n         * @return {Number} The scale to fit the 3D chart into the plotting area.\n         */\n        function getScale(chart, depth) {\n            var plotLeft = chart.plotLeft,\n                plotRight = chart.plotWidth + plotLeft,\n                plotTop = chart.plotTop,\n                plotBottom = chart.plotHeight + plotTop,\n                originX = plotLeft + chart.plotWidth / 2,\n                originY = plotTop + chart.plotHeight / 2,\n                bbox3d = {\n                    minX: Number.MAX_VALUE,\n                    maxX: -Number.MAX_VALUE,\n                    minY: Number.MAX_VALUE,\n                    maxY: -Number.MAX_VALUE\n                },\n                corners,\n                scale = 1;\n\n            // Top left corners:\n            corners = [{\n                x: plotLeft,\n                y: plotTop,\n                z: 0\n            }, {\n                x: plotLeft,\n                y: plotTop,\n                z: depth\n            }];\n\n            // Top right corners:\n            each([0, 1], function(i) {\n                corners.push({\n                    x: plotRight,\n                    y: corners[i].y,\n                    z: corners[i].z\n                });\n            });\n\n            // All bottom corners:\n            each([0, 1, 2, 3], function(i) {\n                corners.push({\n                    x: corners[i].x,\n                    y: plotBottom,\n                    z: corners[i].z\n                });\n            });\n\n            // Calculate 3D corners:\n            corners = perspective(corners, chart, false);\n\n            // Get bounding box of 3D element:\n            each(corners, function(corner) {\n                bbox3d.minX = Math.min(bbox3d.minX, corner.x);\n                bbox3d.maxX = Math.max(bbox3d.maxX, corner.x);\n                bbox3d.minY = Math.min(bbox3d.minY, corner.y);\n                bbox3d.maxY = Math.max(bbox3d.maxY, corner.y);\n            });\n\n            // Left edge:\n            if (plotLeft > bbox3d.minX) {\n                scale = Math.min(scale, 1 - Math.abs((plotLeft + originX) / (bbox3d.minX + originX)) % 1);\n            }\n\n            // Right edge:\n            if (plotRight < bbox3d.maxX) {\n                scale = Math.min(scale, (plotRight - originX) / (bbox3d.maxX - originX));\n            }\n\n            // Top edge:\n            if (plotTop > bbox3d.minY) {\n                if (bbox3d.minY < 0) {\n                    scale = Math.min(scale, (plotTop + originY) / (-bbox3d.minY + plotTop + originY));\n                } else {\n                    scale = Math.min(scale, 1 - (plotTop + originY) / (bbox3d.minY + originY) % 1);\n                }\n            }\n\n            // Bottom edge:\n            if (plotBottom < bbox3d.maxY) {\n                scale = Math.min(scale, Math.abs((plotBottom - originY) / (bbox3d.maxY - originY)));\n            }\n\n            return scale;\n        }\n\n\n\n        H.wrap(H.Chart.prototype, 'isInsidePlot', function(proceed) {\n            return this.is3d() || proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        var defaultOptions = H.getOptions();\n        merge(true, defaultOptions, {\n            chart: {\n                options3d: {\n                    enabled: false,\n                    alpha: 0,\n                    beta: 0,\n                    depth: 100,\n                    fitToPlot: true,\n                    viewDistance: 25,\n                    axisLabelPosition: 'default',\n                    frame: {\n                        visible: 'default',\n                        size: 1,\n                        bottom: {},\n                        top: {},\n                        left: {},\n                        right: {},\n                        back: {},\n                        front: {}\n                    }\n                }\n            }\n        });\n\n\n        /**\n         * Override the getContainer by adding the required CSS classes for column \n         * sides (#6018)\n         */\n        wrap(Chart.prototype, 'getContainer', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            this.renderer.definition({\n                tagName: 'style',\n                textContent: '.highcharts-3d-top{' +\n                    'filter: url(#highcharts-brighter)' +\n                    '}\\n' +\n                    '.highcharts-3d-side{' +\n                    'filter: url(#highcharts-darker)' +\n                    '}\\n'\n            });\n        });\n\n\n        wrap(Chart.prototype, 'setClassName', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.is3d()) {\n                this.container.className += ' highcharts-3d-chart';\n            }\n        });\n\n        H.wrap(H.Chart.prototype, 'setChartSize', function(proceed) {\n            var chart = this,\n                options3d = chart.options.chart.options3d;\n\n            proceed.apply(chart, [].slice.call(arguments, 1));\n\n            if (chart.is3d()) {\n                var inverted = chart.inverted,\n                    clipBox = chart.clipBox,\n                    margin = chart.margin,\n                    x = inverted ? 'y' : 'x',\n                    y = inverted ? 'x' : 'y',\n                    w = inverted ? 'height' : 'width',\n                    h = inverted ? 'width' : 'height';\n\n                clipBox[x] = -(margin[3] || 0);\n                clipBox[y] = -(margin[0] || 0);\n                clipBox[w] = chart.chartWidth + (margin[3] || 0) + (margin[1] || 0);\n                clipBox[h] = chart.chartHeight + (margin[0] || 0) + (margin[2] || 0);\n\n                // Set scale, used later in perspective method():\n                chart.scale3d = 1; // @notice getScale uses perspective, so scale3d has to be reset.\n                if (options3d.fitToPlot === true) {\n                    chart.scale3d = getScale(chart, options3d.depth);\n                }\n            }\n        });\n\n        wrap(Chart.prototype, 'redraw', function(proceed) {\n            if (this.is3d()) {\n                // Set to force a redraw of all elements\n                this.isDirtyBox = true;\n                this.frame3d = this.get3dFrame();\n            }\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        wrap(Chart.prototype, 'render', function(proceed) {\n            if (this.is3d()) {\n                this.frame3d = this.get3dFrame();\n            }\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        // Draw the series in the reverse order (#3803, #3917)\n        wrap(Chart.prototype, 'renderSeries', function(proceed) {\n            var series,\n                i = this.series.length;\n\n            if (this.is3d()) {\n                while (i--) {\n                    series = this.series[i];\n                    series.translate();\n                    series.render();\n                }\n            } else {\n                proceed.call(this);\n            }\n        });\n\n        wrap(Chart.prototype, 'drawChartBox', function(proceed) {\n            if (this.is3d()) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    options3d = this.options.chart.options3d,\n                    frame = chart.get3dFrame(),\n                    xm = this.plotLeft,\n                    xp = this.plotLeft + this.plotWidth,\n                    ym = this.plotTop,\n                    yp = this.plotTop + this.plotHeight,\n                    zm = 0,\n                    zp = options3d.depth,\n                    xmm = xm - (frame.left.visible ? frame.left.size : 0),\n                    xpp = xp + (frame.right.visible ? frame.right.size : 0),\n                    ymm = ym - (frame.top.visible ? frame.top.size : 0),\n                    ypp = yp + (frame.bottom.visible ? frame.bottom.size : 0),\n                    zmm = zm - (frame.front.visible ? frame.front.size : 0),\n                    zpp = zp + (frame.back.visible ? frame.back.size : 0),\n                    verb = chart.hasRendered ? 'animate' : 'attr';\n\n                this.frame3d = frame;\n\n                if (!this.frameShapes) {\n                    this.frameShapes = {\n                        bottom: renderer.polyhedron().add(),\n                        top: renderer.polyhedron().add(),\n                        left: renderer.polyhedron().add(),\n                        right: renderer.polyhedron().add(),\n                        back: renderer.polyhedron().add(),\n                        front: renderer.polyhedron().add()\n                    };\n                }\n\n                this.frameShapes.bottom[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-bottom',\n                    zIndex: frame.bottom.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.bottom.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }],\n                            enabled: frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.bottom.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.bottom.visible\n                        },\n                        { //left\n                            fill: H.color(frame.bottom.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.bottom.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.bottom.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.bottom.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.bottom.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.bottom.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.bottom.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.bottom.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.top[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-top',\n                    zIndex: frame.top.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.top.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }],\n                            enabled: frame.top.visible\n                        },\n                        { //top\n                            fill: H.color(frame.top.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.top.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.top.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.top.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.top.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.top.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.top.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.top.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.top.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.left[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-left',\n                    zIndex: frame.left.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.left.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }],\n                            enabled: frame.left.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.left.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }],\n                            enabled: frame.left.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.left.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }],\n                            enabled: frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.left.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.left.visible\n                        },\n                        { //front\n                            fill: H.color(frame.left.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.left.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.left.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.left.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.right[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-right',\n                    zIndex: frame.right.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.right.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }],\n                            enabled: frame.right.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.right.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }],\n                            enabled: frame.right.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.right.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.right.visible\n                        },\n                        { //right\n                            fill: H.color(frame.right.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }],\n                            enabled: frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.right.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.right.visible && !frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.right.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.right.visible && !frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.back[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-back',\n                    zIndex: frame.back.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.back.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.back.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.back.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.back.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.back.color).get(),\n                            vertexes: [{\n                                x: xm,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zp\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zp\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zp\n                            }],\n                            enabled: frame.back.visible\n                        },\n                        { //back\n                            fill: H.color(frame.back.color).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zpp\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zpp\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zpp\n                            }],\n                            enabled: frame.back.visible\n                        }\n                    ]\n                });\n                this.frameShapes.front[verb]({\n                    'class': 'highcharts-3d-frame highcharts-3d-frame-front',\n                    zIndex: frame.front.frontFacing ? -1000 : 1000,\n                    faces: [{ //bottom\n                            fill: H.color(frame.front.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.bottom.visible\n                        },\n                        { //top\n                            fill: H.color(frame.front.color).brighten(0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.top.visible\n                        },\n                        { //left\n                            fill: H.color(frame.front.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.left.visible\n                        },\n                        { //right\n                            fill: H.color(frame.front.color).brighten(-0.1).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible && !frame.right.visible\n                        },\n                        { //front\n                            fill: H.color(frame.front.color).get(),\n                            vertexes: [{\n                                x: xp,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: ym,\n                                z: zm\n                            }, {\n                                x: xm,\n                                y: yp,\n                                z: zm\n                            }, {\n                                x: xp,\n                                y: yp,\n                                z: zm\n                            }],\n                            enabled: frame.front.visible\n                        },\n                        { //back\n                            fill: H.color(frame.front.color).get(),\n                            vertexes: [{\n                                x: xpp,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ypp,\n                                z: zmm\n                            }, {\n                                x: xmm,\n                                y: ymm,\n                                z: zmm\n                            }, {\n                                x: xpp,\n                                y: ymm,\n                                z: zmm\n                            }],\n                            enabled: frame.front.visible\n                        }\n                    ]\n                });\n            }\n\n            return proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        Chart.prototype.retrieveStacks = function(stacking) {\n            var series = this.series,\n                stacks = {},\n                stackNumber,\n                i = 1;\n\n            each(this.series, function(s) {\n                stackNumber = pick(s.options.stack, (stacking ? 0 : series.length - 1 - s.index)); // #3841, #4532\n                if (!stacks[stackNumber]) {\n                    stacks[stackNumber] = {\n                        series: [s],\n                        position: i\n                    };\n                    i++;\n                } else {\n                    stacks[stackNumber].series.push(s);\n                }\n            });\n\n            stacks.totalStacks = i + 1;\n            return stacks;\n        };\n\n        Chart.prototype.get3dFrame = function() {\n            var chart = this,\n                options3d = chart.options.chart.options3d,\n                frameOptions = options3d.frame,\n                xm = chart.plotLeft,\n                xp = chart.plotLeft + chart.plotWidth,\n                ym = chart.plotTop,\n                yp = chart.plotTop + chart.plotHeight,\n                zm = 0,\n                zp = options3d.depth,\n                bottomOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zm\n                }], chart),\n                topOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: ym,\n                    z: zp\n                }], chart),\n                leftOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xm,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zm\n                }], chart),\n                rightOrientation = H.shapeArea3d([{\n                    x: xp,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zp\n                }], chart),\n                frontOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zm\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zm\n                }, {\n                    x: xm,\n                    y: ym,\n                    z: zm\n                }], chart),\n                backOrientation = H.shapeArea3d([{\n                    x: xm,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: ym,\n                    z: zp\n                }, {\n                    x: xp,\n                    y: yp,\n                    z: zp\n                }, {\n                    x: xm,\n                    y: yp,\n                    z: zp\n                }], chart),\n                defaultShowBottom = false,\n                defaultShowTop = false,\n                defaultShowLeft = false,\n                defaultShowRight = false,\n                defaultShowFront = false,\n                defaultShowBack = true;\n\n            // The 'default' criteria to visible faces of the frame is looking up every\n            // axis to decide whenever the left/right//top/bottom sides of the frame\n            // will be shown\n            each([].concat(chart.xAxis, chart.yAxis, chart.zAxis), function(axis) {\n                if (axis) {\n                    if (axis.horiz) {\n                        if (axis.opposite) {\n                            defaultShowTop = true;\n                        } else {\n                            defaultShowBottom = true;\n                        }\n                    } else {\n                        if (axis.opposite) {\n                            defaultShowRight = true;\n                        } else {\n                            defaultShowLeft = true;\n                        }\n                    }\n                }\n            });\n\n            var getFaceOptions = function(sources, faceOrientation, defaultVisible) {\n                var faceAttrs = ['size', 'color', 'visible'];\n                var options = {};\n                for (var i = 0; i < faceAttrs.length; i++) {\n                    var attr = faceAttrs[i];\n                    for (var j = 0; j < sources.length; j++) {\n                        if (typeof sources[j] === 'object') {\n                            var val = sources[j][attr];\n                            if (val !== undefined && val !== null) {\n                                options[attr] = val;\n                                break;\n                            }\n                        }\n                    }\n                }\n                var isVisible = defaultVisible;\n                if (options.visible === true || options.visible === false) {\n                    isVisible = options.visible;\n                } else if (options.visible === 'auto') {\n                    isVisible = faceOrientation >= 0;\n                }\n\n                return {\n                    size: pick(options.size, 1),\n                    color: pick(options.color, 'none'),\n                    frontFacing: faceOrientation > 0,\n                    visible: isVisible\n                };\n            };\n\n            // docs @TODO: Add all frame options (left, right, top, bottom, front, back) to\n            // apioptions JSDoc once the new system is up.\n            var ret = {\n                // FIXME: Previously, left/right, top/bottom and front/back pairs shared\n                // size and color.\n                // For compatibility and consistency sake, when one face have\n                // size/color/visibility set, the opposite face will default to the same\n                // values. Also, left/right used to be called 'side', so that's also\n                // added as a fallback\n                bottom: getFaceOptions(\n                    [frameOptions.bottom, frameOptions.top, frameOptions],\n                    bottomOrientation,\n                    defaultShowBottom\n                ),\n                top: getFaceOptions(\n                    [frameOptions.top, frameOptions.bottom, frameOptions],\n                    topOrientation,\n                    defaultShowTop\n                ),\n                left: getFaceOptions(\n                    [\n                        frameOptions.left,\n                        frameOptions.right,\n                        frameOptions.side,\n                        frameOptions\n                    ],\n                    leftOrientation,\n                    defaultShowLeft\n                ),\n                right: getFaceOptions(\n                    [\n                        frameOptions.right,\n                        frameOptions.left,\n                        frameOptions.side,\n                        frameOptions\n                    ],\n                    rightOrientation,\n                    defaultShowRight\n                ),\n                back: getFaceOptions(\n                    [frameOptions.back, frameOptions.front, frameOptions],\n                    backOrientation,\n                    defaultShowBack\n                ),\n                front: getFaceOptions(\n                    [frameOptions.front, frameOptions.back, frameOptions],\n                    frontOrientation,\n                    defaultShowFront\n                )\n            };\n\n\n            // Decide the bast place to put axis title/labels based on the visible faces.\n            // Ideally, The labels can only be on the edge between a visible face and an invisble one.\n            // Also, the Y label should be one the left-most edge (right-most if opposite),\n            if (options3d.axisLabelPosition === 'auto') {\n                var isValidEdge = function(face1, face2) {\n                    return (face1.visible !== face2.visible) ||\n                        (face1.visible && face2.visible && (face1.frontFacing !== face2.frontFacing));\n                };\n\n                var yEdges = [];\n                if (isValidEdge(ret.left, ret.front)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xm,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.left, ret.back)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xm,\n                        z: zp\n                    });\n                }\n                if (isValidEdge(ret.right, ret.front)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xp,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.right, ret.back)) {\n                    yEdges.push({\n                        y: (ym + yp) / 2,\n                        x: xp,\n                        z: zp\n                    });\n                }\n\n                var xBottomEdges = [];\n                if (isValidEdge(ret.bottom, ret.front)) {\n                    xBottomEdges.push({\n                        x: (xm + xp) / 2,\n                        y: yp,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.bottom, ret.back)) {\n                    xBottomEdges.push({\n                        x: (xm + xp) / 2,\n                        y: yp,\n                        z: zp\n                    });\n                }\n\n                var xTopEdges = [];\n                if (isValidEdge(ret.top, ret.front)) {\n                    xTopEdges.push({\n                        x: (xm + xp) / 2,\n                        y: ym,\n                        z: zm\n                    });\n                }\n                if (isValidEdge(ret.top, ret.back)) {\n                    xTopEdges.push({\n                        x: (xm + xp) / 2,\n                        y: ym,\n                        z: zp\n                    });\n                }\n\n                var zBottomEdges = [];\n                if (isValidEdge(ret.bottom, ret.left)) {\n                    zBottomEdges.push({\n                        z: (zm + zp) / 2,\n                        y: yp,\n                        x: xm\n                    });\n                }\n                if (isValidEdge(ret.bottom, ret.right)) {\n                    zBottomEdges.push({\n                        z: (zm + zp) / 2,\n                        y: yp,\n                        x: xp\n                    });\n                }\n\n                var zTopEdges = [];\n                if (isValidEdge(ret.top, ret.left)) {\n                    zTopEdges.push({\n                        z: (zm + zp) / 2,\n                        y: ym,\n                        x: xm\n                    });\n                }\n                if (isValidEdge(ret.top, ret.right)) {\n                    zTopEdges.push({\n                        z: (zm + zp) / 2,\n                        y: ym,\n                        x: xp\n                    });\n                }\n\n                var pickEdge = function(edges, axis, mult) {\n                    if (edges.length === 0) {\n                        return null;\n                    } else if (edges.length === 1) {\n                        return edges[0];\n                    }\n                    var best = 0,\n                        projections = perspective(edges, chart, false);\n                    for (var i = 1; i < projections.length; i++) {\n                        if (mult * projections[i][axis] > mult * projections[best][axis]) {\n                            best = i;\n                        } else if ((mult * projections[i][axis] === mult * projections[best][axis]) && (projections[i].z < projections[best].z)) {\n                            best = i;\n                        }\n                    }\n                    return edges[best];\n                };\n                ret.axes = {\n                    y: {\n                        'left': pickEdge(yEdges, 'x', -1),\n                        'right': pickEdge(yEdges, 'x', +1)\n                    },\n                    x: {\n                        'top': pickEdge(xTopEdges, 'y', -1),\n                        'bottom': pickEdge(xBottomEdges, 'y', +1)\n                    },\n                    z: {\n                        'top': pickEdge(zTopEdges, 'y', -1),\n                        'bottom': pickEdge(zBottomEdges, 'y', +1)\n                    }\n                };\n            } else {\n                ret.axes = {\n                    y: {\n                        'left': {\n                            x: xm,\n                            z: zm\n                        },\n                        'right': {\n                            x: xp,\n                            z: zm\n                        }\n                    },\n                    x: {\n                        'top': {\n                            y: ym,\n                            z: zm\n                        },\n                        'bottom': {\n                            y: yp,\n                            z: zm\n                        }\n                    },\n                    z: {\n                        'top': {\n                            x: defaultShowLeft ? xp : xm,\n                            y: ym\n                        },\n                        'bottom': {\n                            x: defaultShowLeft ? xp : xm,\n                            y: yp\n                        }\n                    }\n                };\n            }\n\n            return ret;\n        };\n\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var ZAxis,\n\n            Axis = H.Axis,\n            Chart = H.Chart,\n            each = H.each,\n            extend = H.extend,\n            merge = H.merge,\n            perspective = H.perspective,\n            pick = H.pick,\n            splat = H.splat,\n            Tick = H.Tick,\n            wrap = H.wrap;\n        /***\n        \tEXTENSION TO THE AXIS\n        ***/\n        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {\n            var options;\n            proceed.call(this, userOptions);\n            if (this.chart.is3d() && this.coll !== 'colorAxis') {\n                options = this.options;\n                options.tickWidth = pick(options.tickWidth, 0);\n                options.gridLineWidth = pick(options.gridLineWidth, 1);\n            }\n        });\n\n        wrap(Axis.prototype, 'getPlotLinePath', function(proceed) {\n            var path = proceed.apply(this, [].slice.call(arguments, 1));\n\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d() || this.coll === 'colorAxis') {\n                return path;\n            }\n\n            if (path === null) {\n                return path;\n            }\n\n            var chart = this.chart,\n                options3d = chart.options.chart.options3d,\n                d = this.isZAxis ? chart.plotWidth : options3d.depth,\n                frame = chart.frame3d;\n\n            var pArr = [\n                this.swapZ({\n                    x: path[1],\n                    y: path[2],\n                    z: 0\n                }),\n                this.swapZ({\n                    x: path[1],\n                    y: path[2],\n                    z: d\n                }),\n                this.swapZ({\n                    x: path[4],\n                    y: path[5],\n                    z: 0\n                }),\n                this.swapZ({\n                    x: path[4],\n                    y: path[5],\n                    z: d\n                })\n            ];\n\n            var pathSegments = [];\n            if (!this.horiz) { // Y-Axis\n                if (frame.front.visible) {\n                    pathSegments.push(pArr[0], pArr[2]);\n                }\n                if (frame.back.visible) {\n                    pathSegments.push(pArr[1], pArr[3]);\n                }\n                if (frame.left.visible) {\n                    pathSegments.push(pArr[0], pArr[1]);\n                }\n                if (frame.right.visible) {\n                    pathSegments.push(pArr[2], pArr[3]);\n                }\n            } else if (this.isZAxis) { // Z-Axis\n                if (frame.left.visible) {\n                    pathSegments.push(pArr[0], pArr[2]);\n                }\n                if (frame.right.visible) {\n                    pathSegments.push(pArr[1], pArr[3]);\n                }\n                if (frame.top.visible) {\n                    pathSegments.push(pArr[0], pArr[1]);\n                }\n                if (frame.bottom.visible) {\n                    pathSegments.push(pArr[2], pArr[3]);\n                }\n            } else { // X-Axis\n                if (frame.front.visible) {\n                    pathSegments.push(pArr[0], pArr[2]);\n                }\n                if (frame.back.visible) {\n                    pathSegments.push(pArr[1], pArr[3]);\n                }\n                if (frame.top.visible) {\n                    pathSegments.push(pArr[0], pArr[1]);\n                }\n                if (frame.bottom.visible) {\n                    pathSegments.push(pArr[2], pArr[3]);\n                }\n            }\n\n            pathSegments = perspective(pathSegments, this.chart, false);\n\n            return this.chart.renderer.toLineSegments(pathSegments);\n        });\n\n        // Do not draw axislines in 3D\n        wrap(Axis.prototype, 'getLinePath', function(proceed) {\n            return this.chart.is3d() ? [] : proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        wrap(Axis.prototype, 'getPlotBandPath', function(proceed) {\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d() || this.coll === 'colorAxis') {\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            }\n\n            var args = arguments,\n                from = args[1],\n                to = args[2],\n                path = [],\n                fromPath = this.getPlotLinePath(from),\n                toPath = this.getPlotLinePath(to);\n\n            if (fromPath && toPath) {\n                for (var i = 0; i < fromPath.length; i += 6) {\n                    path.push(\n                        'M', fromPath[i + 1], fromPath[i + 2],\n                        'L', fromPath[i + 4], fromPath[i + 5],\n                        'L', toPath[i + 4], toPath[i + 5],\n                        'L', toPath[i + 1], toPath[i + 2],\n                        'Z');\n                }\n            }\n\n            return path;\n        });\n\n\n        function fix3dPosition(axis, pos) {\n            if (axis.chart.is3d() && axis.coll !== 'colorAxis') {\n                var chart = axis.chart,\n                    frame = chart.frame3d,\n                    plotLeft = chart.plotLeft,\n                    plotRight = chart.plotWidth + plotLeft,\n                    plotTop = chart.plotTop,\n                    plotBottom = chart.plotHeight + plotTop,\n                    dx = 0,\n                    dy = 0;\n\n                pos = axis.swapZ({\n                    x: pos.x,\n                    y: pos.y,\n                    z: 0\n                });\n\n\n                if (axis.isZAxis) { // Z Axis\n                    if (axis.opposite) {\n                        if (frame.axes.z.top === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotTop;\n                        pos.x = frame.axes.z.top.x;\n                        pos.y = frame.axes.z.top.y;\n                    } else {\n                        if (frame.axes.z.bottom === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotBottom;\n                        pos.x = frame.axes.z.bottom.x;\n                        pos.y = frame.axes.z.bottom.y;\n                    }\n                } else if (axis.horiz) { // X Axis\n                    if (axis.opposite) {\n                        if (frame.axes.x.top === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotTop;\n                        pos.y = frame.axes.x.top.y;\n                        pos.z = frame.axes.x.top.z;\n                    } else {\n                        if (frame.axes.x.bottom === null) {\n                            return {};\n                        }\n                        dy = pos.y - plotBottom;\n                        pos.y = frame.axes.x.bottom.y;\n                        pos.z = frame.axes.x.bottom.z;\n                    }\n                } else { //Y Axis\n                    if (axis.opposite) {\n                        if (frame.axes.y.right === null) {\n                            return {};\n                        }\n                        dx = pos.x - plotRight;\n                        pos.x = frame.axes.y.right.x;\n                        pos.z = frame.axes.y.right.z;\n                    } else {\n                        if (frame.axes.y.left === null) {\n                            return {};\n                        }\n                        dx = pos.x - plotLeft;\n                        pos.x = frame.axes.y.left.x;\n                        pos.z = frame.axes.y.left.z;\n                    }\n                }\n                pos = perspective([pos], axis.chart)[0];\n                pos.x += dx;\n                pos.y += dy;\n            }\n            return pos;\n        }\n\n        /***\n        \tEXTENSION TO THE TICKS\n        ***/\n\n        wrap(Tick.prototype, 'getMarkPath', function(proceed) {\n            var path = proceed.apply(this, [].slice.call(arguments, 1));\n\n            var pArr = [\n                fix3dPosition(this.axis, {\n                    x: path[1],\n                    y: path[2],\n                    z: 0\n                }),\n                fix3dPosition(this.axis, {\n                    x: path[4],\n                    y: path[5],\n                    z: 0\n                })\n            ];\n\n            return this.axis.chart.renderer.toLineSegments(pArr);\n        });\n\n        wrap(Tick.prototype, 'getLabelPosition', function(proceed) {\n            var pos = proceed.apply(this, [].slice.call(arguments, 1));\n            return fix3dPosition(this.axis, pos);\n        });\n\n        H.wrap(Axis.prototype, 'getTitlePosition', function(proceed) {\n            var pos = proceed.apply(this, [].slice.call(arguments, 1));\n            return fix3dPosition(this, pos);\n        });\n\n        wrap(Axis.prototype, 'drawCrosshair', function(proceed) {\n            var args = arguments;\n            if (this.chart.is3d()) {\n                if (args[2]) {\n                    args[2] = {\n                        plotX: args[2].plotXold || args[2].plotX,\n                        plotY: args[2].plotYold || args[2].plotY\n                    };\n                }\n            }\n            proceed.apply(this, [].slice.call(args, 1));\n        });\n\n        wrap(Axis.prototype, 'destroy', function(proceed) {\n            each(['backFrame', 'bottomFrame', 'sideFrame'], function(prop) {\n                if (this[prop]) {\n                    this[prop] = this[prop].destroy();\n                }\n            }, this);\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        /***\n            Z-AXIS\n        ***/\n\n        Axis.prototype.swapZ = function(p, insidePlotArea) {\n            if (this.isZAxis) {\n                var plotLeft = insidePlotArea ? 0 : this.chart.plotLeft;\n                return {\n                    x: plotLeft + p.z,\n                    y: p.y,\n                    z: p.x - plotLeft\n                };\n            }\n            return p;\n        };\n\n        ZAxis = H.ZAxis = function() {\n            this.init.apply(this, arguments);\n        };\n        extend(ZAxis.prototype, Axis.prototype);\n        extend(ZAxis.prototype, {\n            isZAxis: true,\n            setOptions: function(userOptions) {\n                userOptions = merge({\n                    offset: 0,\n                    lineWidth: 0\n                }, userOptions);\n                Axis.prototype.setOptions.call(this, userOptions);\n                this.coll = 'zAxis';\n            },\n            setAxisSize: function() {\n                Axis.prototype.setAxisSize.call(this);\n                this.width = this.len = this.chart.options.chart.options3d.depth;\n                this.right = this.chart.chartWidth - this.width - this.left;\n            },\n            getSeriesExtremes: function() {\n                var axis = this,\n                    chart = axis.chart;\n\n                axis.hasVisibleSeries = false;\n\n                // Reset properties in case we're redrawing (#3353)\n                axis.dataMin = axis.dataMax = axis.ignoreMinPadding = axis.ignoreMaxPadding = null;\n\n                if (axis.buildStacks) {\n                    axis.buildStacks();\n                }\n\n                // loop through this axis' series\n                each(axis.series, function(series) {\n\n                    if (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n                        var seriesOptions = series.options,\n                            zData,\n                            threshold = seriesOptions.threshold;\n\n                        axis.hasVisibleSeries = true;\n\n                        // Validate threshold in logarithmic axes\n                        if (axis.positiveValuesOnly && threshold <= 0) {\n                            threshold = null;\n                        }\n\n                        zData = series.zData;\n                        if (zData.length) {\n                            axis.dataMin = Math.min(pick(axis.dataMin, zData[0]), Math.min.apply(null, zData));\n                            axis.dataMax = Math.max(pick(axis.dataMax, zData[0]), Math.max.apply(null, zData));\n                        }\n                    }\n                });\n            }\n        });\n\n\n        /**\n         * Extend the chart getAxes method to also get the color axis\n         */\n        wrap(Chart.prototype, 'getAxes', function(proceed) {\n            var chart = this,\n                options = this.options,\n                zAxisOptions = options.zAxis = splat(options.zAxis || {});\n\n            proceed.call(this);\n\n            if (!chart.is3d()) {\n                return;\n            }\n            this.zAxis = [];\n            each(zAxisOptions, function(axisOptions, i) {\n                axisOptions.index = i;\n                axisOptions.isX = true; //Z-Axis is shown horizontally, so it's kind of a X-Axis\n                var zAxis = new ZAxis(chart, axisOptions);\n                zAxis.setScale();\n            });\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            perspective = H.perspective,\n            pick = H.pick,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            inArray = H.inArray,\n            svg = H.svg,\n            wrap = H.wrap;\n\n        /***\n        \tEXTENSION FOR 3D COLUMNS\n        ***/\n        wrap(seriesTypes.column.prototype, 'translate', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d()) {\n                return;\n            }\n\n            var series = this,\n                chart = series.chart,\n                seriesOptions = series.options,\n                depth = seriesOptions.depth || 25,\n                borderCrisp = series.borderWidth % 2 ? 0.5 : 0;\n\n            if (\n                (chart.inverted && !series.yAxis.reversed) ||\n                (!chart.inverted && series.yAxis.reversed)\n            ) {\n                borderCrisp *= -1;\n            }\n\n            var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series.index; // #4743\n            var z = stack * (depth + (seriesOptions.groupZPadding || 1));\n\n            if (seriesOptions.grouping !== false) {\n                z = 0;\n            }\n\n            z += (seriesOptions.groupZPadding || 1);\n            each(series.data, function(point) {\n                if (point.y !== null) {\n                    var shapeArgs = point.shapeArgs,\n                        tooltipPos = point.tooltipPos,\n                        // Array for final shapeArgs calculation.\n                        // We are checking two dimensions (x and y).\n                        dimensions = [\n                            ['x', 'width'],\n                            ['y', 'height']\n                        ],\n                        borderlessBase; // crisped rects can have +/- 0.5 pixels offset\n\n                    // #3131 We need to check if column shape arguments are inside plotArea.\n                    each(dimensions, function(d) {\n                        borderlessBase = shapeArgs[d[0]] - borderCrisp;\n                        if (\n                            borderlessBase + shapeArgs[d[1]] < 0 || // End column position is smaller than axis start.\n                            borderlessBase > series[d[0] + 'Axis'].len // Start column position is bigger than axis end.\n                        ) {\n                            for (var key in shapeArgs) { // Set args to 0 if column is outside the chart.\n                                shapeArgs[key] = 0;\n                            }\n                        }\n                        if (borderlessBase < 0) {\n                            shapeArgs[d[1]] += shapeArgs[d[0]];\n                            shapeArgs[d[0]] = 0;\n                        }\n                        if (borderlessBase + shapeArgs[d[1]] > series[d[0] + 'Axis'].len) {\n                            shapeArgs[d[1]] = series[d[0] + 'Axis'].len - shapeArgs[d[0]];\n                        }\n                    });\n\n                    point.shapeType = 'cuboid';\n                    shapeArgs.z = z;\n                    shapeArgs.depth = depth;\n                    shapeArgs.insidePlotArea = true;\n\n                    // Translate the tooltip position in 3d space\n                    tooltipPos = perspective([{\n                        x: tooltipPos[0],\n                        y: tooltipPos[1],\n                        z: z\n                    }], chart, true)[0];\n                    point.tooltipPos = [tooltipPos.x, tooltipPos.y];\n                }\n            });\n            // store for later use #4067\n            series.z = z;\n        });\n\n        wrap(seriesTypes.column.prototype, 'animate', function(proceed) {\n            if (!this.chart.is3d()) {\n                proceed.apply(this, [].slice.call(arguments, 1));\n            } else {\n                var args = arguments,\n                    init = args[1],\n                    yAxis = this.yAxis,\n                    series = this,\n                    reversed = this.yAxis.reversed;\n\n                if (svg) { // VML is too slow anyway\n                    if (init) {\n                        each(series.data, function(point) {\n                            if (point.y !== null) {\n                                point.height = point.shapeArgs.height;\n                                point.shapey = point.shapeArgs.y; //#2968\n                                point.shapeArgs.height = 1;\n                                if (!reversed) {\n                                    if (point.stackY) {\n                                        point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY);\n                                    } else {\n                                        point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height);\n                                    }\n                                }\n                            }\n                        });\n\n                    } else { // run the animation\t\t\t\t\n                        each(series.data, function(point) {\n                            if (point.y !== null) {\n                                point.shapeArgs.height = point.height;\n                                point.shapeArgs.y = point.shapey; //#2968\n                                // null value do not have a graphic\n                                if (point.graphic) {\n                                    point.graphic.animate(point.shapeArgs, series.options.animation);\n                                }\n                            }\n                        });\n\n                        // redraw datalabels to the correct position\n                        this.drawDataLabels();\n\n                        // delete this function to allow it only once\n                        series.animate = null;\n                    }\n                }\n            }\n        });\n\n        /*\n         * In case of 3d columns there is no sense to add this columns\n         * to a specific series group - if series is added to a group\n         * all columns will have the same zIndex in comparison with different series\n         */\n\n        wrap(seriesTypes.column.prototype, 'plotGroup', function(proceed, prop, name, visibility, zIndex, parent) {\n            if (this.chart.is3d() && parent && !this[prop]) {\n                this[prop] = parent;\n                parent.attr(this.getPlotBox());\n                this[prop].survive = true;\n            }\n            return proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        /*\n         * When series is not added to group it is needed to change \n         * setVisible method to allow correct Legend funcionality\n         * This wrap is basing on pie chart series\n         */\n        wrap(seriesTypes.column.prototype, 'setVisible', function(proceed, vis) {\n            var series = this,\n                pointVis;\n            if (series.chart.is3d()) {\n                each(series.data, function(point) {\n                    point.visible = point.options.visible = vis = vis === undefined ? !point.visible : vis;\n                    pointVis = vis ? 'visible' : 'hidden';\n                    series.options.data[inArray(point, series.data)] = point.options;\n                    if (point.graphic) {\n                        point.graphic.attr({\n                            visibility: pointVis\n                        });\n                    }\n                });\n            }\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        wrap(seriesTypes.column.prototype, 'init', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.chart.is3d()) {\n                var seriesOptions = this.options,\n                    grouping = seriesOptions.grouping,\n                    stacking = seriesOptions.stacking,\n                    reversedStacks = pick(this.yAxis.options.reversedStacks, true),\n                    z = 0;\n\n                if (!(grouping !== undefined && !grouping)) {\n                    var stacks = this.chart.retrieveStacks(stacking),\n                        stack = seriesOptions.stack || 0,\n                        i; // position within the stack\n                    for (i = 0; i < stacks[stack].series.length; i++) {\n                        if (stacks[stack].series[i] === this) {\n                            break;\n                        }\n                    }\n                    z = (10 * (stacks.totalStacks - stacks[stack].position)) + (reversedStacks ? i : -i); // #4369\n\n                    // In case when axis is reversed, columns are also reversed inside the group (#3737)\n                    if (!this.xAxis.reversed) {\n                        z = (stacks.totalStacks * 10) - z;\n                    }\n                }\n\n                seriesOptions.zIndex = z;\n            }\n        });\n\n\n\n        wrap(Series.prototype, 'alignDataLabel', function(proceed) {\n\n            // Only do this for 3D columns and columnranges\n            if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) {\n                var series = this,\n                    chart = series.chart;\n\n                var args = arguments,\n                    alignTo = args[4];\n\n                var pos = ({\n                    x: alignTo.x,\n                    y: alignTo.y,\n                    z: series.z\n                });\n                pos = perspective([pos], chart, true)[0];\n                alignTo.x = pos.x;\n                alignTo.y = pos.y;\n            }\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        /***\n        \tEXTENSION FOR 3D CYLINDRICAL COLUMNS\n        \tNot supported\n        ***/\n        /*\n        var defaultOptions = H.getOptions();\n        defaultOptions.plotOptions.cylinder = H.merge(defaultOptions.plotOptions.column);\n        var CylinderSeries = H.extendClass(seriesTypes.column, {\n        \ttype: 'cylinder'\n        });\n        seriesTypes.cylinder = CylinderSeries;\n\n        wrap(seriesTypes.cylinder.prototype, 'translate', function (proceed) {\n        \tproceed.apply(this, [].slice.call(arguments, 1));\n\n        \t// Do not do this if the chart is not 3D\n        \tif (!this.chart.is3d()) {\n        \t\treturn;\n        \t}\n\n        \tvar series = this,\n        \t\tchart = series.chart,\n        \t\toptions = chart.options,\n        \t\tcylOptions = options.plotOptions.cylinder,\n        \t\toptions3d = options.chart.options3d,\n        \t\tdepth = cylOptions.depth || 0,\n        \t\talpha = chart.alpha3d;\n\n        \tvar z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth;\n        \tz += depth / 2;\n\n        \tif (cylOptions.grouping !== false) { z = 0; }\n\n        \teach(series.data, function (point) {\n        \t\tvar shapeArgs = point.shapeArgs,\n        \t\t\tdeg2rad = H.deg2rad;\n        \t\tpoint.shapeType = 'arc3d';\n        \t\tshapeArgs.x += depth / 2;\n        \t\tshapeArgs.z = z;\n        \t\tshapeArgs.start = 0;\n        \t\tshapeArgs.end = 2 * PI;\n        \t\tshapeArgs.r = depth * 0.95;\n        \t\tshapeArgs.innerR = 0;\n        \t\tshapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z;\n        \t\tshapeArgs.alpha = 90 - alpha;\n        \t\tshapeArgs.beta = 0;\n        \t});\n        });\n        */\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var deg2rad = H.deg2rad,\n            each = H.each,\n            pick = H.pick,\n            seriesTypes = H.seriesTypes,\n            svg = H.svg,\n            wrap = H.wrap;\n\n        /*** \n        \tEXTENSION FOR 3D PIES\n        ***/\n\n        wrap(seriesTypes.pie.prototype, 'translate', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            // Do not do this if the chart is not 3D\n            if (!this.chart.is3d()) {\n                return;\n            }\n\n            var series = this,\n                seriesOptions = series.options,\n                depth = seriesOptions.depth || 0,\n                options3d = series.chart.options.chart.options3d,\n                alpha = options3d.alpha,\n                beta = options3d.beta,\n                z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth;\n\n            z += depth / 2;\n\n            if (seriesOptions.grouping !== false) {\n                z = 0;\n            }\n\n            each(series.data, function(point) {\n\n                var shapeArgs = point.shapeArgs,\n                    angle;\n\n                point.shapeType = 'arc3d';\n\n                shapeArgs.z = z;\n                shapeArgs.depth = depth * 0.75;\n                shapeArgs.alpha = alpha;\n                shapeArgs.beta = beta;\n                shapeArgs.center = series.center;\n\n                angle = (shapeArgs.end + shapeArgs.start) / 2;\n\n                point.slicedTranslation = {\n                    translateX: Math.round(Math.cos(angle) * seriesOptions.slicedOffset * Math.cos(alpha * deg2rad)),\n                    translateY: Math.round(Math.sin(angle) * seriesOptions.slicedOffset * Math.cos(alpha * deg2rad))\n                };\n            });\n        });\n\n        wrap(seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function(proceed) {\n            var args = arguments;\n            return this.series.chart.is3d() ? [] : proceed.call(this, args[1]);\n        });\n\n\n\n        wrap(seriesTypes.pie.prototype, 'drawPoints', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.chart.is3d()) {\n                each(this.points, function(point) {\n                    var graphic = point.graphic;\n\n                    // #4584 Check if has graphic - null points don't have it\n                    if (graphic) {\n                        // Hide null or 0 points (#3006, 3650)\n                        graphic[point.y && point.visible ? 'show' : 'hide']();\n                    }\n                });\n            }\n        });\n\n        wrap(seriesTypes.pie.prototype, 'drawDataLabels', function(proceed) {\n            if (this.chart.is3d()) {\n                var series = this,\n                    chart = series.chart,\n                    options3d = chart.options.chart.options3d;\n                each(series.data, function(point) {\n                    var shapeArgs = point.shapeArgs,\n                        r = shapeArgs.r,\n                        a1 = (shapeArgs.alpha || options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values\n                        b1 = (shapeArgs.beta || options3d.beta) * deg2rad,\n                        a2 = (shapeArgs.start + shapeArgs.end) / 2,\n                        labelPos = point.labelPos,\n                        labelIndexes = [0, 2, 4], // [x1, y1, x2, y2, x3, y3]\n                        yOffset = (-r * (1 - Math.cos(a1)) * Math.sin(a2)), // + (sin(a2) > 0 ? sin(a1) * d : 0)\n                        xOffset = r * (Math.cos(b1) - 1) * Math.cos(a2);\n\n                    // Apply perspective on label positions\n                    each(labelIndexes, function(index) {\n                        labelPos[index] += xOffset;\n                        labelPos[index + 1] += yOffset;\n                    });\n                });\n            }\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n        });\n\n        wrap(seriesTypes.pie.prototype, 'addPoint', function(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n            if (this.chart.is3d()) {\n                // destroy (and rebuild) everything!!!\n                this.update(this.userOptions, true); // #3845 pass the old options\n            }\n        });\n\n        wrap(seriesTypes.pie.prototype, 'animate', function(proceed) {\n            if (!this.chart.is3d()) {\n                proceed.apply(this, [].slice.call(arguments, 1));\n            } else {\n                var args = arguments,\n                    init = args[1],\n                    animation = this.options.animation,\n                    attribs,\n                    center = this.center,\n                    group = this.group,\n                    markerGroup = this.markerGroup;\n\n                if (svg) { // VML is too slow anyway\n\n                    if (animation === true) {\n                        animation = {};\n                    }\n                    // Initialize the animation\n                    if (init) {\n\n                        // Scale down the group and place it in the center\n                        group.oldtranslateX = group.translateX;\n                        group.oldtranslateY = group.translateY;\n                        attribs = {\n                            translateX: center[0],\n                            translateY: center[1],\n                            scaleX: 0.001, // #1499\n                            scaleY: 0.001\n                        };\n\n                        group.attr(attribs);\n                        if (markerGroup) {\n                            markerGroup.attrSetters = group.attrSetters;\n                            markerGroup.attr(attribs);\n                        }\n\n                        // Run the animation\n                    } else {\n                        attribs = {\n                            translateX: group.oldtranslateX,\n                            translateY: group.oldtranslateY,\n                            scaleX: 1,\n                            scaleY: 1\n                        };\n                        group.animate(attribs, animation);\n\n                        if (markerGroup) {\n                            markerGroup.animate(attribs, animation);\n                        }\n\n                        // Delete this function to allow it only once\n                        this.animate = null;\n                    }\n\n                }\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var perspective = H.perspective,\n            pick = H.pick,\n            Point = H.Point,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap;\n\n        /*** \n        \tEXTENSION FOR 3D SCATTER CHART\n        ***/\n\n        wrap(seriesTypes.scatter.prototype, 'translate', function(proceed) {\n            //function translate3d(proceed) {\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (!this.chart.is3d()) {\n                return;\n            }\n\n            var series = this,\n                chart = series.chart,\n                zAxis = pick(series.zAxis, chart.options.zAxis[0]),\n                rawPoints = [],\n                rawPoint,\n                projectedPoints,\n                projectedPoint,\n                zValue,\n                i;\n\n            for (i = 0; i < series.data.length; i++) {\n                rawPoint = series.data[i];\n                zValue = zAxis.isLog && zAxis.val2lin ? zAxis.val2lin(rawPoint.z) : rawPoint.z; // #4562\n                rawPoint.plotZ = zAxis.translate(zValue);\n\n                rawPoint.isInside = rawPoint.isInside ? (zValue >= zAxis.min && zValue <= zAxis.max) : false;\n\n                rawPoints.push({\n                    x: rawPoint.plotX,\n                    y: rawPoint.plotY,\n                    z: rawPoint.plotZ\n                });\n            }\n\n            projectedPoints = perspective(rawPoints, chart, true);\n\n            for (i = 0; i < series.data.length; i++) {\n                rawPoint = series.data[i];\n                projectedPoint = projectedPoints[i];\n\n                rawPoint.plotXold = rawPoint.plotX;\n                rawPoint.plotYold = rawPoint.plotY;\n                rawPoint.plotZold = rawPoint.plotZ;\n\n                rawPoint.plotX = projectedPoint.x;\n                rawPoint.plotY = projectedPoint.y;\n                rawPoint.plotZ = projectedPoint.z;\n\n            }\n\n        });\n\n\n        wrap(seriesTypes.scatter.prototype, 'init', function(proceed, chart, options) {\n            if (chart.is3d()) {\n                // add a third coordinate\n                this.axisTypes = ['xAxis', 'yAxis', 'zAxis'];\n                this.pointArrayMap = ['x', 'y', 'z'];\n                this.parallelArrays = ['x', 'y', 'z'];\n\n                // Require direct touch rather than using the k-d-tree, because the k-d-tree currently doesn't\n                // take the xyz coordinate system into account (#4552)\n                this.directTouch = true;\n            }\n\n            var result = proceed.apply(this, [chart, options]);\n\n            if (this.chart.is3d()) {\n                // Set a new default tooltip formatter\n                var default3dScatterTooltip = 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>';\n                if (this.userOptions.tooltip) {\n                    this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip;\n                } else {\n                    this.tooltipOptions.pointFormat = default3dScatterTooltip;\n                }\n            }\n            return result;\n        });\n\n        /**\n         * Updating zIndex for every point - based on the distance from point to camera\n         */\n        wrap(seriesTypes.scatter.prototype, 'pointAttribs', function(proceed, point) {\n            var pointOptions = proceed.apply(this, [].slice.call(arguments, 1));\n            if (this.chart.is3d() && point) {\n                pointOptions.zIndex = H.pointCameraDistance(point, this.chart);\n            }\n            return pointOptions;\n        });\n\n\n        wrap(Point.prototype, 'applyOptions', function(proceed) {\n            var point = proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.series.chart.is3d() && point.z === undefined) {\n                point.z = 0;\n            }\n            return point;\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/highcharts-more.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2016 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(v){\"object\"===typeof module&&module.exports?module.exports=v:v(Highcharts)})(function(v){(function(a){function n(a,c){this.init(a,c)}var r=a.CenteredSeriesMixin,u=a.each,h=a.extend,f=a.merge,k=a.splat;h(n.prototype,{coll:\"pane\",init:function(a,c){this.chart=c;this.background=[];c.pane.push(this);this.setOptions(a)},setOptions:function(a){this.options=f(this.defaultOptions,this.chart.angular?{background:{}}:void 0,a)},render:function(){var a=this.options,c=this.options.background,e=this.chart.renderer;\nthis.group||(this.group=e.g(\"pane-group\").attr({zIndex:a.zIndex||0}).add());this.updateCenter();if(c)for(c=k(c),a=Math.max(c.length,this.background.length||0),e=0;e<a;e++)c[e]&&this.axis?this.renderBackground(f(this.defaultBackgroundOptions,c[e]),e):this.background[e]&&(this.background[e]=this.background[e].destroy(),this.background.splice(e,1))},renderBackground:function(a,c){var e=\"animate\";this.background[c]||(this.background[c]=this.chart.renderer.path().add(this.group),e=\"attr\");this.background[c][e]({d:this.axis.getPlotBandPath(a.from,\na.to,a)}).attr({\"class\":\"highcharts-pane \"+(a.className||\"\")})},defaultOptions:{center:[\"50%\",\"50%\"],size:\"85%\",startAngle:0},defaultBackgroundOptions:{shape:\"circle\",from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:\"105%\"},updateCenter:function(a){this.center=(a||this.axis||{}).center=r.getCenter.call(this)},update:function(a,c){f(!0,this.options,a);this.setOptions(this.options);this.render();u(this.chart.axes,function(e){e.pane===this&&(e.pane=null,e.update({},c))},this)}});\na.Pane=n})(v);(function(a){var n=a.each,r=a.extend,u=a.map,h=a.merge,f=a.noop,k=a.pick,p=a.pInt,c=a.wrap,e,g,l=a.Axis.prototype;a=a.Tick.prototype;e={getOffset:f,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:f,setCategories:f,setTitle:f};g={defaultRadialGaugeOptions:{labels:{align:\"center\",x:0,y:null},minorGridLineWidth:0,minorTickInterval:\"auto\",minorTickLength:10,minorTickPosition:\"inside\",minorTickWidth:1,tickLength:10,tickPosition:\"inside\",tickWidth:2,title:{rotation:0},\nzIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:\"circle\",labels:{align:\"right\",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(b){b=this.options=h(this.defaultOptions,this.defaultRadialOptions,b);b.plotBands||(b.plotBands=[])},getOffset:function(){l.getOffset.call(this);this.chart.axisOffset[this.side]=0},getLinePath:function(b,\nd){b=this.center;var c=this.chart,e=k(d,b[2]/2-this.offset);this.isCircular||void 0!==d?d=this.chart.renderer.symbols.arc(this.left+b[0],this.top+b[1],e,e,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(d=this.postTranslate(this.angleRad,e),d=[\"M\",b[0]+c.plotLeft,b[1]+c.plotTop,\"L\",d.x,d.y]);return d},setAxisTranslation:function(){l.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/\n2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===k(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){l.setAxisSize.call(this);this.isRadial&&(this.pane.updateCenter(this),this.isCircular&&(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=\nthis.height=this.center[2]*k(this.sector,1)/2)},getPosition:function(b,d){return this.postTranslate(this.isCircular?this.translate(b):this.angleRad,k(this.isCircular?d:this.translate(b),this.center[2]/2)-this.offset)},postTranslate:function(b,d){var c=this.chart,e=this.center;b=this.startAngleRad+b;return{x:c.plotLeft+e[0]+Math.cos(b)*d,y:c.plotTop+e[1]+Math.sin(b)*d}},getPlotBandPath:function(b,d,c){var e=this.center,q=this.startAngleRad,a=e[2]/2,g=[k(c.outerRadius,\"100%\"),c.innerRadius,k(c.thickness,\n10)],l=Math.min(this.offset,0),f=/%$/,y,h=this.isCircular;\"polygon\"===this.options.gridLineInterpolation?e=this.getPlotLinePath(b).concat(this.getPlotLinePath(d,!0)):(b=Math.max(b,this.min),d=Math.min(d,this.max),h||(g[0]=this.translate(b),g[1]=this.translate(d)),g=u(g,function(b){f.test(b)&&(b=p(b,10)*a/100);return b}),\"circle\"!==c.shape&&h?(b=q+this.translate(b),d=q+this.translate(d)):(b=-Math.PI/2,d=1.5*Math.PI,y=!0),g[0]-=l,g[2]-=l,e=this.chart.renderer.symbols.arc(this.left+e[0],this.top+e[1],\ng[0],g[0],{start:Math.min(b,d),end:Math.max(b,d),innerR:k(g[1],g[0]-g[2]),open:y}));return e},getPlotLinePath:function(b,c){var e=this,d=e.center,g=e.chart,a=e.getPosition(b),l,p,f;e.isCircular?f=[\"M\",d[0]+g.plotLeft,d[1]+g.plotTop,\"L\",a.x,a.y]:\"circle\"===e.options.gridLineInterpolation?(b=e.translate(b))&&(f=e.getLinePath(0,b)):(n(g.xAxis,function(b){b.pane===e.pane&&(l=b)}),f=[],b=e.translate(b),d=l.tickPositions,l.autoConnect&&(d=d.concat([d[0]])),c&&(d=[].concat(d).reverse()),n(d,function(e,d){p=\nl.getPosition(e,b);f.push(d?\"L\":\"M\",p.x,p.y)}));return f},getTitlePosition:function(){var b=this.center,e=this.chart,c=this.options.title;return{x:e.plotLeft+b[0]+(c.x||0),y:e.plotTop+b[1]-{high:.5,middle:.25,low:0}[c.align]*b[2]+(c.y||0)}}};c(l,\"init\",function(b,c,a){var d=c.angular,q=c.polar,l=a.isX,f=d&&l,p,F=c.options,y=this.pane=c.pane[a.pane||0],n=y.options;if(d){if(r(this,f?e:g),p=!l)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else q&&(r(this,g),this.defaultRadialOptions=(p=l)?\nthis.defaultRadialXOptions:h(this.defaultYAxisOptions,this.defaultRadialYOptions));d||q?(this.isRadial=!0,c.inverted=!1,F.chart.zoomType=null):this.isRadial=!1;p&&(y.axis=this);b.call(this,c,a);f||!d&&!q||(b=this.options,this.angleRad=(b.angle||0)*Math.PI/180,this.startAngleRad=(n.startAngle-90)*Math.PI/180,this.endAngleRad=(k(n.endAngle,n.startAngle+360)-90)*Math.PI/180,this.offset=b.offset||0,this.isCircular=p)});c(l,\"autoLabelAlign\",function(b){if(!this.isRadial)return b.apply(this,[].slice.call(arguments,\n1))});c(a,\"getPosition\",function(b,c,e,g,a){var d=this.axis;return d.getPosition?d.getPosition(e):b.call(this,c,e,g,a)});c(a,\"getLabelPosition\",function(b,c,e,g,a,l,p,f,h){var d=this.axis,q=l.y,m=20,t=l.align,x=(d.translate(this.pos)+d.startAngleRad+Math.PI/2)/Math.PI*180%360;d.isRadial?(b=d.getPosition(this.pos,d.center[2]/2+k(l.distance,-25)),\"auto\"===l.rotation?g.attr({rotation:x}):null===q&&(q=d.chart.renderer.fontMetrics(g.styles.fontSize).b-g.getBBox().height/2),null===t&&(d.isCircular?(this.label.getBBox().width>\nd.len*d.tickInterval/(d.max-d.min)&&(m=0),t=x>m&&x<180-m?\"left\":x>180+m&&x<360-m?\"right\":\"center\"):t=\"center\",g.attr({align:t})),b.x+=l.x,b.y+=q):b=b.call(this,c,e,g,a,l,p,f,h);return b});c(a,\"getMarkPath\",function(b,c,e,g,a,l,p){var d=this.axis;d.isRadial?(b=d.getPosition(this.pos,d.center[2]/2+g),c=[\"M\",c,e,\"L\",b.x,b.y]):c=b.call(this,c,e,g,a,l,p);return c})})(v);(function(a){var n=a.each,r=a.noop,u=a.pick,h=a.Series,f=a.seriesType,k=a.seriesTypes;f(\"arearange\",\"area\",{marker:null,threshold:null,\ntooltip:{pointFormat:'\\x3cspan class\\x3d\"highcharts-color-{series.colorIndex}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.low}\\x3c/b\\x3e - \\x3cb\\x3e{point.high}\\x3c/b\\x3e\\x3cbr/\\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:[\"low\",\"high\"],dataLabelCollections:[\"dataLabel\",\"dataLabelUpper\"],toYData:function(a){return[a.low,a.high]},pointValKey:\"low\",deferTranslatePolar:!0,highToXY:function(a){var c=\nthis.chart,e=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=e.x-c.plotLeft;a.plotHigh=e.y-c.plotTop},translate:function(){var a=this,c=a.yAxis,e=!!a.modifyValue;k.area.prototype.translate.apply(a);n(a.points,function(g){var l=g.low,b=g.high,d=g.plotY;null===b||null===l?g.isNull=!0:(g.plotLow=d,g.plotHigh=c.translate(e?a.modifyValue(b,g):b,0,1,0,1),e&&(g.yBottom=g.plotHigh))});this.chart.polar&&n(this.points,function(c){a.highToXY(c)})},getGraphPath:function(a){var c=[],\ne=[],g,l=k.area.prototype.getGraphPath,b,d,q;q=this.options;var t=this.chart.polar&&!1!==q.connectEnds,m=q.connectNulls,f=q.step;a=a||this.points;for(g=a.length;g--;)b=a[g],b.isNull||t||m||a[g+1]&&!a[g+1].isNull||e.push({plotX:b.plotX,plotY:b.plotY,doCurve:!1}),d={polarPlotY:b.polarPlotY,rectPlotX:b.rectPlotX,yBottom:b.yBottom,plotX:u(b.plotHighX,b.plotX),plotY:b.plotHigh,isNull:b.isNull},e.push(d),c.push(d),b.isNull||t||m||a[g-1]&&!a[g-1].isNull||e.push({plotX:b.plotX,plotY:b.plotY,doCurve:!1});\na=l.call(this,a);f&&(!0===f&&(f=\"left\"),q.step={left:\"right\",center:\"center\",right:\"left\"}[f]);c=l.call(this,c);e=l.call(this,e);q.step=f;q=[].concat(a,c);this.chart.polar||\"M\"!==e[0]||(e[0]=\"L\");this.graphPath=q;this.areaPath=this.areaPath.concat(a,e);q.isArea=!0;q.xMap=a.xMap;this.areaPath.xMap=a.xMap;return q},drawDataLabels:function(){var a=this.data,c=a.length,e,g=[],l=h.prototype,b=this.options.dataLabels,d=b.align,q=b.verticalAlign,t=b.inside,m,f,w=this.chart.inverted;if(b.enabled||this._hasPointLabels){for(e=\nc;e--;)if(m=a[e])f=t?m.plotHigh<m.plotLow:m.plotHigh>m.plotLow,m.y=m.high,m._plotY=m.plotY,m.plotY=m.plotHigh,g[e]=m.dataLabel,m.dataLabel=m.dataLabelUpper,m.below=f,w?d||(b.align=f?\"right\":\"left\"):q||(b.verticalAlign=f?\"top\":\"bottom\"),b.x=b.xHigh,b.y=b.yHigh;l.drawDataLabels&&l.drawDataLabels.apply(this,arguments);for(e=c;e--;)if(m=a[e])f=t?m.plotHigh<m.plotLow:m.plotHigh>m.plotLow,m.dataLabelUpper=m.dataLabel,m.dataLabel=g[e],m.y=m.low,m.plotY=m._plotY,m.below=!f,w?d||(b.align=f?\"left\":\"right\"):\nq||(b.verticalAlign=f?\"bottom\":\"top\"),b.x=b.xLow,b.y=b.yLow;l.drawDataLabels&&l.drawDataLabels.apply(this,arguments)}b.align=d;b.verticalAlign=q},alignDataLabel:function(){k.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:r,getSymbol:r,drawPoints:r})})(v);(function(a){var n=a.seriesType;n(\"areasplinerange\",\"arearange\",null,{getPointSpline:a.seriesTypes.spline.prototype.getPointSpline})})(v);(function(a){var n=a.defaultPlotOptions,r=a.each,u=a.merge,h=a.noop,f=a.pick,k=a.seriesType,\np=a.seriesTypes.column.prototype;k(\"columnrange\",\"arearange\",u(n.column,n.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var c=this,e=c.yAxis,a=c.xAxis,l=a.startAngleRad,b,d=c.chart,q=c.xAxis.isRadial,t;p.translate.apply(c);r(c.points,function(g){var m=g.shapeArgs,w=c.options.minPointLength,h,k;g.plotHigh=t=e.translate(g.high,0,1,0,1);g.plotLow=g.plotY;k=t;h=f(g.rectPlotY,g.plotY)-t;Math.abs(h)<w?(w-=h,h+=w,k-=w/2):0>h&&(h*=-1,k-=h);q?(b=g.barX+l,g.shapeType=\"path\",g.shapeArgs={d:c.polarArc(k+\nh,k,b,b+g.pointWidth)}):(m.height=h,m.y=k,g.tooltipPos=d.inverted?[e.len+e.pos-d.plotLeft-k-h/2,a.len+a.pos-d.plotTop-m.x-m.width/2,h]:[a.left-d.plotLeft+m.x+m.width/2,e.pos-d.plotTop+k+h/2,h])})},directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],drawGraph:h,crispCol:p.crispCol,drawPoints:p.drawPoints,drawTracker:p.drawTracker,getColumnMetrics:p.getColumnMetrics,animate:function(){return p.animate.apply(this,arguments)},polarArc:function(){return p.polarArc.apply(this,arguments)},pointAttribs:p.pointAttribs})})(v);\n(function(a){var n=a.each,r=a.isNumber,u=a.merge,h=a.pick,f=a.pInt,k=a.Series,p=a.seriesType,c=a.TrackerMixin;p(\"gauge\",\"line\",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:\"top\",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:\"\"},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:a.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],translate:function(){var c=this.yAxis,a=this.options,l=c.center;this.generatePoints();n(this.points,\nfunction(b){var d=u(a.dial,b.dial),e=f(h(d.radius,80))*l[2]/200,g=f(h(d.baseLength,70))*e/100,m=f(h(d.rearLength,10))*e/100,k=d.baseWidth||3,w=d.topWidth||1,p=a.overshoot,n=c.startAngleRad+c.translate(b.y,null,null,null,!0);r(p)?(p=p/180*Math.PI,n=Math.max(c.startAngleRad-p,Math.min(c.endAngleRad+p,n))):!1===a.wrap&&(n=Math.max(c.startAngleRad,Math.min(c.endAngleRad,n)));n=180*n/Math.PI;b.shapeType=\"path\";b.shapeArgs={d:d.path||[\"M\",-m,-k/2,\"L\",g,-k/2,e,-w/2,e,w/2,g,k/2,-m,k/2,\"z\"],translateX:l[0],\ntranslateY:l[1],rotation:n};b.plotX=l[0];b.plotY=l[1]})},drawPoints:function(){var c=this,a=c.yAxis.center,l=c.pivot,b=c.options,d=b.pivot,q=c.chart.renderer;n(c.points,function(d){var e=d.graphic,a=d.shapeArgs,g=a.d;u(b.dial,d.dial);e?(e.animate(a),a.d=g):d.graphic=q[d.shapeType](a).attr({rotation:a.rotation,zIndex:1}).addClass(\"highcharts-dial\").add(c.group)});l?l.animate({translateX:a[0],translateY:a[1]}):c.pivot=q.circle(0,0,h(d.radius,5)).attr({zIndex:2}).addClass(\"highcharts-pivot\").translate(a[0],\na[1]).add(c.group)},animate:function(c){var e=this;c||(n(e.points,function(c){var b=c.graphic;b&&(b.attr({rotation:180*e.yAxis.startAngleRad/Math.PI}),b.animate({rotation:c.shapeArgs.rotation},e.options.animation))}),e.animate=null)},render:function(){this.group=this.plotGroup(\"group\",\"series\",this.visible?\"visible\":\"hidden\",this.options.zIndex,this.chart.seriesGroup);k.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(c,a){k.prototype.setData.call(this,c,!1);this.processData();\nthis.generatePoints();h(a,!0)&&this.chart.redraw()},drawTracker:c&&c.drawTrackerPoint},{setState:function(c){this.state=c}})})(v);(function(a){var n=a.each,r=a.noop,u=a.seriesType,h=a.seriesTypes;u(\"boxplot\",\"column\",{threshold:null,tooltip:{pointFormat:'\\x3cspan class\\x3d\"highcharts-color-{point.colorIndex}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cb\\x3e {series.name}\\x3c/b\\x3e\\x3cbr/\\x3eMaximum: {point.high}\\x3cbr/\\x3eUpper quartile: {point.q3}\\x3cbr/\\x3eMedian: {point.median}\\x3cbr/\\x3eLower quartile: {point.q1}\\x3cbr/\\x3eMinimum: {point.low}\\x3cbr/\\x3e'},\nwhiskerLength:\"50%\"},{pointArrayMap:[\"low\",\"q1\",\"median\",\"q3\",\"high\"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:\"high\",drawDataLabels:r,translate:function(){var a=this.yAxis,k=this.pointArrayMap;h.column.prototype.translate.apply(this);n(this.points,function(f){n(k,function(c){null!==f[c]&&(f[c+\"Plot\"]=a.translate(f[c],0,1,0,1))})})},drawPoints:function(){var a=this,h=a.chart.renderer,p,c,e,g,l,b,d=0,q,t,m,x,w=!1!==a.doQuartiles,r,u=a.options.whiskerLength;n(a.points,\nfunction(f){var k=f.graphic,n=k?\"animate\":\"attr\",E=f.shapeArgs;void 0!==f.plotY&&(q=E.width,t=Math.floor(E.x),m=t+q,x=Math.round(q/2),p=Math.floor(w?f.q1Plot:f.lowPlot),c=Math.floor(w?f.q3Plot:f.lowPlot),e=Math.floor(f.highPlot),g=Math.floor(f.lowPlot),k||(f.graphic=k=h.g(\"point\").add(a.group),f.stem=h.path().addClass(\"highcharts-boxplot-stem\").add(k),u&&(f.whiskers=h.path().addClass(\"highcharts-boxplot-whisker\").add(k)),w&&(f.box=h.path(void 0).addClass(\"highcharts-boxplot-box\").add(k)),f.medianShape=\nh.path(void 0).addClass(\"highcharts-boxplot-median\").add(k)),b=f.stem.strokeWidth()%2/2,d=t+x+b,f.stem[n]({d:[\"M\",d,c,\"L\",d,e,\"M\",d,p,\"L\",d,g]}),w&&(b=f.box.strokeWidth()%2/2,p=Math.floor(p)+b,c=Math.floor(c)+b,t+=b,m+=b,f.box[n]({d:[\"M\",t,c,\"L\",t,p,\"L\",m,p,\"L\",m,c,\"L\",t,c,\"z\"]})),u&&(b=f.whiskers.strokeWidth()%2/2,e+=b,g+=b,r=/%$/.test(u)?x*parseFloat(u)/100:u/2,f.whiskers[n]({d:[\"M\",d-r,e,\"L\",d+r,e,\"M\",d-r,g,\"L\",d+r,g]})),l=Math.round(f.medianPlot),b=f.medianShape.strokeWidth()%2/2,l+=b,f.medianShape[n]({d:[\"M\",\nt,l,\"L\",m,l]}))})},setStackedPoints:r})})(v);(function(a){var n=a.each,r=a.noop,u=a.seriesType,h=a.seriesTypes;u(\"errorbar\",\"boxplot\",{grouping:!1,linkedTo:\":previous\",tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.low}\\x3c/b\\x3e - \\x3cb\\x3e{point.high}\\x3c/b\\x3e\\x3cbr/\\x3e'},whiskerWidth:null},{type:\"errorbar\",pointArrayMap:[\"low\",\"high\"],toYData:function(a){return[a.low,a.high]},pointValKey:\"high\",doQuartiles:!1,drawDataLabels:h.arearange?\nfunction(){var a=this.pointValKey;h.arearange.prototype.drawDataLabels.call(this);n(this.data,function(f){f.y=f[a]})}:r,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||h.column.prototype.getColumnMetrics.call(this)}})})(v);(function(a){var n=a.correctFloat,r=a.isNumber,u=a.pick,h=a.Point,f=a.Series,k=a.seriesType,p=a.seriesTypes;k(\"waterfall\",\"column\",{dataLabels:{inside:!0}},{pointValKey:\"y\",translate:function(){var c=this.options,a=this.yAxis,g,l,b,d,f,t,m,\nh,w,k,r=u(c.minPointLength,5),v=r/2,A=c.threshold,B=c.stacking,z;p.column.prototype.translate.apply(this);h=w=A;l=this.points;g=0;for(c=l.length;g<c;g++)b=l[g],m=this.processedYData[g],d=b.shapeArgs,f=B&&a.stacks[(this.negStacks&&m<A?\"-\":\"\")+this.stackKey],z=this.getStackIndicator(z,b.x,this.index),k=f?f[b.x].points[z.key]:[0,m],b.isSum?b.y=n(m):b.isIntermediateSum&&(b.y=n(m-w)),t=Math.max(h,h+b.y)+k[0],d.y=a.translate(t,0,1,0,1),b.isSum?(d.y=a.translate(k[1],0,1,0,1),d.height=Math.min(a.translate(k[0],\n0,1,0,1),a.len)-d.y):b.isIntermediateSum?(d.y=a.translate(k[1],0,1,0,1),d.height=Math.min(a.translate(w,0,1,0,1),a.len)-d.y,w=k[1]):(d.height=0<m?a.translate(h,0,1,0,1)-d.y:a.translate(h,0,1,0,1)-a.translate(h-m,0,1,0,1),h+=f&&f[b.x]?f[b.x].total:m),0>d.height&&(d.y+=d.height,d.height*=-1),b.plotY=d.y=Math.round(d.y)-this.borderWidth%2/2,d.height=Math.max(Math.round(d.height),.001),b.yBottom=d.y+d.height,d.height<=r&&!b.isNull?(d.height=r,d.y-=v,b.plotY=d.y,b.minPointLengthOffset=0>b.y?-v:v):b.minPointLengthOffset=\n0,d=b.plotY+(b.negative?d.height:0),this.chart.inverted?b.tooltipPos[0]=a.len-d:b.tooltipPos[1]=d},processData:function(c){var a=this.yData,g=this.options.data,l,b=a.length,d,q,t,m,h,k;q=d=t=m=this.options.threshold||0;for(k=0;k<b;k++)h=a[k],l=g&&g[k]?g[k]:{},\"sum\"===h||l.isSum?a[k]=n(q):\"intermediateSum\"===h||l.isIntermediateSum?a[k]=n(d):(q+=h,d+=h),t=Math.min(q,t),m=Math.max(q,m);f.prototype.processData.call(this,c);this.options.stacking||(this.dataMin=t,this.dataMax=m)},toYData:function(c){return c.isSum?\n0===c.x?null:\"sum\":c.isIntermediateSum?0===c.x?null:\"intermediateSum\":c.y},getGraphPath:function(){return[\"M\",0,0]},getCrispPath:function(){var c=this.data,a=c.length,g=this.graph.strokeWidth()+this.borderWidth,g=Math.round(g)%2/2,f=this.yAxis.reversed,b=[],d,q,h;for(h=1;h<a;h++){q=c[h].shapeArgs;d=c[h-1].shapeArgs;q=[\"M\",d.x+d.width,d.y+c[h-1].minPointLengthOffset+g,\"L\",q.x,d.y+c[h-1].minPointLengthOffset+g];if(0>c[h-1].y&&!f||0<c[h-1].y&&f)q[2]+=d.height,q[5]+=d.height;b=b.concat(q)}return b},drawGraph:function(){f.prototype.drawGraph.call(this);\nthis.graph.attr({d:this.getCrispPath()})},setStackedPoints:function(){var c=this.options,a,g;f.prototype.setStackedPoints.apply(this,arguments);a=this.stackedYData?this.stackedYData.length:0;for(g=1;g<a;g++)c.data[g].isSum||c.data[g].isIntermediateSum||(this.stackedYData[g]+=this.stackedYData[g-1])},getExtremes:function(){if(this.options.stacking)return f.prototype.getExtremes.apply(this,arguments)}},{getClassName:function(){var c=h.prototype.getClassName.call(this);this.isSum?c+=\" highcharts-sum\":\nthis.isIntermediateSum&&(c+=\" highcharts-intermediate-sum\");return c},isValid:function(){return r(this.y,!0)||this.isSum||this.isIntermediateSum}})})(v);(function(a){var n=a.Series,r=a.seriesType,u=a.seriesTypes;r(\"polygon\",\"scatter\",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:\"\"},trackByArea:!0},{type:\"polygon\",getGraphPath:function(){for(var a=n.prototype.getGraphPath.call(this),f=a.length+1;f--;)(f===a.length||\"M\"===a[f])&&0<f&&a.splice(f,\n0,\"z\");return this.areaPath=a},drawGraph:function(){u.area.prototype.drawGraph.call(this)},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawTracker:n.prototype.drawTracker,setStackedPoints:a.noop})})(v);(function(a){var n=a.arrayMax,r=a.arrayMin,u=a.Axis,h=a.each,f=a.isNumber,k=a.noop,p=a.pick,c=a.pInt,e=a.Point,g=a.seriesType,l=a.seriesTypes;g(\"bubble\",\"scatter\",{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:\"middle\"},marker:{radius:null,states:{hover:{radiusPlus:0}},\nsymbol:\"circle\"},minSize:8,maxSize:\"20%\",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:\"({point.x}, {point.y}), Size: {point.z}\"},turboThreshold:0,zThreshold:0,zoneAxis:\"z\"},{pointArrayMap:[\"y\",\"z\"],parallelArrays:[\"x\",\"y\",\"z\"],trackerGroups:[\"group\",\"dataLabelsGroup\"],specialGroup:\"group\",bubblePadding:!0,zoneAxis:\"z\",directTouch:!0,getRadii:function(b,a,c,e){var d,g,f,l=this.zData,q=[],h=this.options,k=\"width\"!==h.sizeBy,t=h.zThreshold,n=a-b;g=0;for(d=l.length;g<d;g++)f=l[g],\nh.sizeByAbsoluteValue&&null!==f&&(f=Math.abs(f-t),a=Math.max(a-t,Math.abs(b-t)),b=0),null===f?f=null:f<b?f=c/2-1:(f=0<n?(f-b)/n:.5,k&&0<=f&&(f=Math.sqrt(f)),f=Math.ceil(c+f*(e-c))/2),q.push(f);this.radii=q},animate:function(b){var a=this.options.animation;b||(h(this.points,function(b){var c=b.graphic,d;c&&c.width&&(d={x:c.x,y:c.y,width:c.width,height:c.height},c.attr({x:b.plotX,y:b.plotY,width:1,height:1}),c.animate(d,a))}),this.animate=null)},translate:function(){var b,c=this.data,e,g,h=this.radii;\nl.scatter.prototype.translate.call(this);for(b=c.length;b--;)e=c[b],g=h?h[b]:0,f(g)&&g>=this.minPxSize/2?(e.marker=a.extend(e.marker,{radius:g,width:2*g,height:2*g}),e.dlBox={x:e.plotX-g,y:e.plotY-g,width:2*g,height:2*g}):e.shapeArgs=e.plotY=e.dlBox=void 0},alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:k,applyZones:k},{haloPath:function(c){return e.prototype.haloPath.call(this,0===c?0:(this.marker?this.marker.radius||0:0)+c)},ttBelow:!1});u.prototype.beforePadding=function(){var b=\nthis,a=this.len,e=this.chart,g=0,l=a,k=this.isXAxis,w=k?\"xData\":\"yData\",u=this.min,v={},y=Math.min(e.plotWidth,e.plotHeight),A=Number.MAX_VALUE,B=-Number.MAX_VALUE,z=this.max-u,C=a/z,D=[];h(this.series,function(a){var d=a.options;!a.bubblePadding||!a.visible&&e.options.chart.ignoreHiddenSeries||(b.allowZoomOutside=!0,D.push(a),k&&(h([\"minSize\",\"maxSize\"],function(a){var b=d[a],e=/%$/.test(b),b=c(b);v[a]=e?y*b/100:b}),a.minPxSize=v.minSize,a.maxPxSize=Math.max(v.maxSize,v.minSize),a=a.zData,a.length&&\n(A=p(d.zMin,Math.min(A,Math.max(r(a),!1===d.displayNegative?d.zThreshold:-Number.MAX_VALUE))),B=p(d.zMax,Math.max(B,n(a))))))});h(D,function(a){var c=a[w],d=c.length,e;k&&a.getRadii(A,B,a.minPxSize,a.maxPxSize);if(0<z)for(;d--;)f(c[d])&&b.dataMin<=c[d]&&c[d]<=b.dataMax&&(e=a.radii[d],g=Math.min((c[d]-u)*C-e,g),l=Math.max((c[d]-u)*C+e,l))});D.length&&0<z&&!this.isLog&&(l-=a,C*=(a+g-l)/a,h([[\"min\",\"userMin\",g],[\"max\",\"userMax\",l]],function(a){void 0===p(b.options[a[0]],b[a[1]])&&(b[a[0]]+=a[2]/C)}))}})(v);\n(function(a){function n(a,e){var c=this.chart,f=this.options.animation,b=this.group,d=this.markerGroup,h=this.xAxis.center,k=c.plotLeft,m=c.plotTop;c.polar?c.renderer.isSVG&&(!0===f&&(f={}),e?(a={translateX:h[0]+k,translateY:h[1]+m,scaleX:.001,scaleY:.001},b.attr(a),d&&d.attr(a)):(a={translateX:k,translateY:m,scaleX:1,scaleY:1},b.animate(a,f),d&&d.animate(a,f),this.animate=null)):a.call(this,e)}var r=a.each,u=a.pick,h=a.seriesTypes,f=a.wrap,k=a.Series.prototype,p=a.Pointer.prototype;k.searchPointByAngle=\nfunction(a){var c=this.chart,g=this.xAxis.pane.center;return this.searchKDTree({clientX:180+-180/Math.PI*Math.atan2(a.chartX-g[0]-c.plotLeft,a.chartY-g[1]-c.plotTop)})};k.getConnectors=function(a,e,g,f){var b,c,l,h,k,n,p,r;c=f?1:0;b=0<=e&&e<=a.length-1?e:0>e?a.length-1+e:0;e=0>b-1?a.length-(1+c):b-1;c=b+1>a.length-1?c:b+1;l=a[e];c=a[c];h=l.plotX;l=l.plotY;k=c.plotX;n=c.plotY;c=a[b].plotX;b=a[b].plotY;h=(1.5*c+h)/2.5;l=(1.5*b+l)/2.5;k=(1.5*c+k)/2.5;p=(1.5*b+n)/2.5;n=Math.sqrt(Math.pow(h-c,2)+Math.pow(l-\nb,2));r=Math.sqrt(Math.pow(k-c,2)+Math.pow(p-b,2));h=Math.atan2(l-b,h-c);p=Math.PI/2+(h+Math.atan2(p-b,k-c))/2;Math.abs(h-p)>Math.PI/2&&(p-=Math.PI);h=c+Math.cos(p)*n;l=b+Math.sin(p)*n;k=c+Math.cos(Math.PI+p)*r;p=b+Math.sin(Math.PI+p)*r;c={rightContX:k,rightContY:p,leftContX:h,leftContY:l,plotX:c,plotY:b};g&&(c.prevPointCont=this.getConnectors(a,e,!1,f));return c};f(k,\"buildKDTree\",function(a){this.chart.polar&&(this.kdByAngle?this.searchPoint=this.searchPointByAngle:this.options.findNearestPointBy=\n\"xy\");a.apply(this)});k.toXY=function(a){var c,g=this.chart,f=a.plotX;c=a.plotY;a.rectPlotX=f;a.rectPlotY=c;c=this.xAxis.postTranslate(a.plotX,this.yAxis.len-c);a.plotX=a.polarPlotX=c.x-g.plotLeft;a.plotY=a.polarPlotY=c.y-g.plotTop;this.kdByAngle?(g=(f/Math.PI*180+this.xAxis.pane.options.startAngle)%360,0>g&&(g+=360),a.clientX=g):a.clientX=a.plotX};h.spline&&(f(h.spline.prototype,\"getPointSpline\",function(a,e,g,f){this.chart.polar?f?(a=this.getConnectors(e,f,!0,this.connectEnds),a=[\"C\",a.prevPointCont.rightContX,\na.prevPointCont.rightContY,a.leftContX,a.leftContY,a.plotX,a.plotY]):a=[\"M\",g.plotX,g.plotY]:a=a.call(this,e,g,f);return a}),h.areasplinerange&&(h.areasplinerange.prototype.getPointSpline=h.spline.prototype.getPointSpline));f(k,\"translate\",function(a){var c=this.chart;a.call(this);if(c.polar&&(this.kdByAngle=c.tooltip&&c.tooltip.shared,!this.preventPostTranslate))for(a=this.points,c=a.length;c--;)this.toXY(a[c])});f(k,\"getGraphPath\",function(a,e){var c=this,f,b,d;if(this.chart.polar){e=e||this.points;\nfor(f=0;f<e.length;f++)if(!e[f].isNull){b=f;break}!1!==this.options.connectEnds&&void 0!==b&&(this.connectEnds=!0,e.splice(e.length,0,e[b]),d=!0);r(e,function(a){void 0===a.polarPlotY&&c.toXY(a)})}f=a.apply(this,[].slice.call(arguments,1));d&&e.pop();return f});f(k,\"animate\",n);h.column&&(h=h.column.prototype,h.polarArc=function(a,e,g,f){var b=this.xAxis.center,c=this.yAxis.len;return this.chart.renderer.symbols.arc(b[0],b[1],c-e,null,{start:g,end:f,innerR:c-u(a,c)})},f(h,\"animate\",n),f(h,\"translate\",\nfunction(a){var c=this.xAxis,f=c.startAngleRad,h,b,d;this.preventPostTranslate=!0;a.call(this);if(c.isRadial)for(h=this.points,d=h.length;d--;)b=h[d],a=b.barX+f,b.shapeType=\"path\",b.shapeArgs={d:this.polarArc(b.yBottom,b.plotY,a,a+b.pointWidth)},this.toXY(b),b.tooltipPos=[b.plotX,b.plotY],b.ttBelow=b.plotY>c.center[1]}),f(h,\"alignDataLabel\",function(a,e,f,h,b,d){this.chart.polar?(a=e.rectPlotX/Math.PI*180,null===h.align&&(h.align=20<a&&160>a?\"left\":200<a&&340>a?\"right\":\"center\"),null===h.verticalAlign&&\n(h.verticalAlign=45>a||315<a?\"bottom\":135<a&&225>a?\"top\":\"middle\"),k.alignDataLabel.call(this,e,f,h,b,d)):a.call(this,e,f,h,b,d)}));f(p,\"getCoordinates\",function(a,e){var c=this.chart,f={xAxis:[],yAxis:[]};c.polar?r(c.axes,function(a){var b=a.isXAxis,g=a.center,h=e.chartX-g[0]-c.plotLeft,g=e.chartY-g[1]-c.plotTop;f[b?\"xAxis\":\"yAxis\"].push({axis:a,value:a.translate(b?Math.PI-Math.atan2(h,g):Math.sqrt(Math.pow(h,2)+Math.pow(g,2)),!0)})}):f=a.call(this,e);return f});f(a.Chart.prototype,\"getAxes\",function(c){this.pane||\n(this.pane=[]);r(a.splat(this.options.pane),function(c){new a.Pane(c,this)},this);c.call(this)});f(a.Chart.prototype,\"drawChartBox\",function(a){a.call(this);r(this.pane,function(a){a.render()})});f(a.Chart.prototype,\"get\",function(c,e){return a.find(this.pane,function(a){return a.options.id===e})||c.call(this,e)})})(v)});\n"
  },
  {
    "path": "assets/highcharts/js/highcharts-more.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var CenteredSeriesMixin = H.CenteredSeriesMixin,\n            each = H.each,\n            extend = H.extend,\n            merge = H.merge,\n            splat = H.splat;\n        /**\n         * The Pane object allows options that are common to a set of X and Y axes.\n         *\n         * In the future, this can be extended to basic Highcharts and Highstock.\n         *\n         */\n        function Pane(options, chart) {\n            this.init(options, chart);\n        }\n\n        // Extend the Pane prototype\n        extend(Pane.prototype, {\n\n            coll: 'pane', // Member of chart.pane\n\n            /**\n             * Initiate the Pane object\n             */\n            init: function(options, chart) {\n                this.chart = chart;\n                this.background = [];\n\n                chart.pane.push(this);\n\n                this.setOptions(options);\n            },\n\n            setOptions: function(options) {\n\n                // Set options. Angular charts have a default background (#3318)\n                this.options = options = merge(\n                    this.defaultOptions,\n                    this.chart.angular ? {\n                        background: {}\n                    } : undefined,\n                    options\n                );\n            },\n\n            /**\n             * Render the pane with its backgrounds.\n             */\n            render: function() {\n\n                var options = this.options,\n                    backgroundOption = this.options.background,\n                    renderer = this.chart.renderer,\n                    len,\n                    i;\n\n                if (!this.group) {\n                    this.group = renderer.g('pane-group')\n                        .attr({\n                            zIndex: options.zIndex || 0\n                        })\n                        .add();\n                }\n\n                this.updateCenter();\n\n                // Render the backgrounds\n                if (backgroundOption) {\n                    backgroundOption = splat(backgroundOption);\n\n                    len = Math.max(\n                        backgroundOption.length,\n                        this.background.length || 0\n                    );\n\n                    for (i = 0; i < len; i++) {\n                        if (backgroundOption[i] && this.axis) { // #6641 - if axis exists, chart is circular and apply background\n                            this.renderBackground(\n                                merge(\n                                    this.defaultBackgroundOptions,\n                                    backgroundOption[i]\n                                ),\n                                i\n                            );\n                        } else if (this.background[i]) {\n                            this.background[i] = this.background[i].destroy();\n                            this.background.splice(i, 1);\n                        }\n                    }\n                }\n            },\n\n            /**\n             * Render an individual pane background.\n             * @param  {Object} backgroundOptions Background options\n             * @param  {number} i The index of the background in this.backgrounds\n             */\n            renderBackground: function(backgroundOptions, i) {\n                var method = 'animate';\n\n                if (!this.background[i]) {\n                    this.background[i] = this.chart.renderer.path()\n                        .add(this.group);\n                    method = 'attr';\n                }\n\n                this.background[i][method]({\n                    'd': this.axis.getPlotBandPath(\n                        backgroundOptions.from,\n                        backgroundOptions.to,\n                        backgroundOptions\n                    )\n                }).attr({\n\n                    'class': 'highcharts-pane ' + (backgroundOptions.className || '')\n                });\n\n            },\n\n            /**\n             * The default options object\n             */\n            defaultOptions: {\n                // background: {conditional},\n                center: ['50%', '50%'],\n                size: '85%',\n                startAngle: 0\n                //endAngle: startAngle + 360\n            },\n\n            /**\n             * The default background options\n             */\n            defaultBackgroundOptions: {\n                //className: 'highcharts-pane',\n                shape: 'circle',\n\n                from: -Number.MAX_VALUE, // corrected to axis min\n                innerRadius: 0,\n                to: Number.MAX_VALUE, // corrected to axis max\n                outerRadius: '105%'\n            },\n\n            /**\n             * Gets the center for the pane and its axis.\n             */\n            updateCenter: function(axis) {\n                this.center = (axis || this.axis || {}).center =\n                    CenteredSeriesMixin.getCenter.call(this);\n            },\n\n            /**\n             * Destroy the pane item\n             * /\n            destroy: function () {\n            \tH.erase(this.chart.pane, this);\n            \teach(this.background, function (background) {\n            \t\tbackground.destroy();\n            \t});\n            \tthis.background.length = 0;\n            \tthis.group = this.group.destroy();\n            },\n            */\n\n            /**\n             * Update the pane item with new options\n             * @param  {Object} options New pane options\n             */\n            update: function(options, redraw) {\n\n                merge(true, this.options, options);\n                this.setOptions(this.options);\n                this.render();\n                each(this.chart.axes, function(axis) {\n                    if (axis.pane === this) {\n                        axis.pane = null;\n                        axis.update({}, redraw);\n                    }\n                }, this);\n            }\n\n        });\n\n        H.Pane = Pane;\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            each = H.each,\n            extend = H.extend,\n            map = H.map,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            Tick = H.Tick,\n            wrap = H.wrap,\n\n\n            hiddenAxisMixin, // @todo Extract this to a new file\n            radialAxisMixin, // @todo Extract this to a new file\n            axisProto = Axis.prototype,\n            tickProto = Tick.prototype;\n\n        /**\n         * Augmented methods for the x axis in order to hide it completely, used for the X axis in gauges\n         */\n        hiddenAxisMixin = {\n            getOffset: noop,\n            redraw: function() {\n                this.isDirty = false; // prevent setting Y axis dirty\n            },\n            render: function() {\n                this.isDirty = false; // prevent setting Y axis dirty\n            },\n            setScale: noop,\n            setCategories: noop,\n            setTitle: noop\n        };\n\n        /**\n         * Augmented methods for the value axis\n         */\n        radialAxisMixin = {\n\n            /**\n             * The default options extend defaultYAxisOptions\n             */\n            defaultRadialGaugeOptions: {\n                labels: {\n                    align: 'center',\n                    x: 0,\n                    y: null // auto\n                },\n                minorGridLineWidth: 0,\n                minorTickInterval: 'auto',\n                minorTickLength: 10,\n                minorTickPosition: 'inside',\n                minorTickWidth: 1,\n                tickLength: 10,\n                tickPosition: 'inside',\n                tickWidth: 2,\n                title: {\n                    rotation: 0\n                },\n                zIndex: 2 // behind dials, points in the series group\n            },\n\n            // Circular axis around the perimeter of a polar chart\n            defaultRadialXOptions: {\n                gridLineWidth: 1, // spokes\n                labels: {\n                    align: null, // auto\n                    distance: 15,\n                    x: 0,\n                    y: null // auto\n                },\n                maxPadding: 0,\n                minPadding: 0,\n                showLastLabel: false,\n                tickLength: 0\n            },\n\n            // Radial axis, like a spoke in a polar chart\n            defaultRadialYOptions: {\n                gridLineInterpolation: 'circle',\n                labels: {\n                    align: 'right',\n                    x: -3,\n                    y: -2\n                },\n                showLastLabel: false,\n                title: {\n                    x: 4,\n                    text: null,\n                    rotation: 90\n                }\n            },\n\n            /**\n             * Merge and set options\n             */\n            setOptions: function(userOptions) {\n\n                var options = this.options = merge(\n                    this.defaultOptions,\n                    this.defaultRadialOptions,\n                    userOptions\n                );\n\n                // Make sure the plotBands array is instanciated for each Axis (#2649)\n                if (!options.plotBands) {\n                    options.plotBands = [];\n                }\n\n            },\n\n            /**\n             * Wrap the getOffset method to return zero offset for title or labels in a radial\n             * axis\n             */\n            getOffset: function() {\n                // Call the Axis prototype method (the method we're in now is on the instance)\n                axisProto.getOffset.call(this);\n\n                // Title or label offsets are not counted\n                this.chart.axisOffset[this.side] = 0;\n\n            },\n\n\n            /**\n             * Get the path for the axis line. This method is also referenced in the getPlotLinePath\n             * method.\n             */\n            getLinePath: function(lineWidth, radius) {\n                var center = this.center,\n                    end,\n                    chart = this.chart,\n                    r = pick(radius, center[2] / 2 - this.offset),\n                    path;\n\n                if (this.isCircular || radius !== undefined) {\n                    path = this.chart.renderer.symbols.arc(\n                        this.left + center[0],\n                        this.top + center[1],\n                        r,\n                        r, {\n                            start: this.startAngleRad,\n                            end: this.endAngleRad,\n                            open: true,\n                            innerR: 0\n                        }\n                    );\n                } else {\n                    end = this.postTranslate(this.angleRad, r);\n                    path = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];\n                }\n                return path;\n            },\n\n            /**\n             * Override setAxisTranslation by setting the translation to the difference\n             * in rotation. This allows the translate method to return angle for\n             * any given value.\n             */\n            setAxisTranslation: function() {\n\n                // Call uber method\n                axisProto.setAxisTranslation.call(this);\n\n                // Set transA and minPixelPadding\n                if (this.center) { // it's not defined the first time\n                    if (this.isCircular) {\n\n                        this.transA = (this.endAngleRad - this.startAngleRad) /\n                            ((this.max - this.min) || 1);\n\n\n                    } else {\n                        this.transA = (this.center[2] / 2) / ((this.max - this.min) || 1);\n                    }\n\n                    if (this.isXAxis) {\n                        this.minPixelPadding = this.transA * this.minPointOffset;\n                    } else {\n                        // This is a workaround for regression #2593, but categories still don't position correctly.\n                        this.minPixelPadding = 0;\n                    }\n                }\n            },\n\n            /**\n             * In case of auto connect, add one closestPointRange to the max value right before\n             * tickPositions are computed, so that ticks will extend passed the real max.\n             */\n            beforeSetTickPositions: function() {\n                // If autoConnect is true, polygonal grid lines are connected, and one closestPointRange\n                // is added to the X axis to prevent the last point from overlapping the first.\n                this.autoConnect = this.isCircular && pick(this.userMax, this.options.max) === undefined &&\n                    this.endAngleRad - this.startAngleRad === 2 * Math.PI;\n\n                if (this.autoConnect) {\n                    this.max += (this.categories && 1) || this.pointRange || this.closestPointRange || 0; // #1197, #2260\n                }\n            },\n\n            /**\n             * Override the setAxisSize method to use the arc's circumference as length. This\n             * allows tickPixelInterval to apply to pixel lengths along the perimeter\n             */\n            setAxisSize: function() {\n\n                axisProto.setAxisSize.call(this);\n\n                if (this.isRadial) {\n\n                    // Set the center array\n                    this.pane.updateCenter(this);\n\n                    // The sector is used in Axis.translate to compute the translation of reversed axis points (#2570)\n                    if (this.isCircular) {\n                        this.sector = this.endAngleRad - this.startAngleRad;\n                    }\n\n                    // Axis len is used to lay out the ticks\n                    this.len = this.width = this.height = this.center[2] * pick(this.sector, 1) / 2;\n\n\n                }\n            },\n\n            /**\n             * Returns the x, y coordinate of a point given by a value and a pixel distance\n             * from center\n             */\n            getPosition: function(value, length) {\n                return this.postTranslate(\n                    this.isCircular ? this.translate(value) : this.angleRad, // #2848\n                    pick(this.isCircular ? length : this.translate(value), this.center[2] / 2) - this.offset\n                );\n            },\n\n            /**\n             * Translate from intermediate plotX (angle), plotY (axis.len - radius) to final chart coordinates.\n             */\n            postTranslate: function(angle, radius) {\n\n                var chart = this.chart,\n                    center = this.center;\n\n                angle = this.startAngleRad + angle;\n\n                return {\n                    x: chart.plotLeft + center[0] + Math.cos(angle) * radius,\n                    y: chart.plotTop + center[1] + Math.sin(angle) * radius\n                };\n\n            },\n\n            /**\n             * Find the path for plot bands along the radial axis\n             */\n            getPlotBandPath: function(from, to, options) {\n                var center = this.center,\n                    startAngleRad = this.startAngleRad,\n                    fullRadius = center[2] / 2,\n                    radii = [\n                        pick(options.outerRadius, '100%'),\n                        options.innerRadius,\n                        pick(options.thickness, 10)\n                    ],\n                    offset = Math.min(this.offset, 0),\n                    percentRegex = /%$/,\n                    start,\n                    end,\n                    open,\n                    isCircular = this.isCircular, // X axis in a polar chart\n                    ret;\n\n                // Polygonal plot bands\n                if (this.options.gridLineInterpolation === 'polygon') {\n                    ret = this.getPlotLinePath(from).concat(this.getPlotLinePath(to, true));\n\n                    // Circular grid bands\n                } else {\n\n                    // Keep within bounds\n                    from = Math.max(from, this.min);\n                    to = Math.min(to, this.max);\n\n                    // Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from\n                    if (!isCircular) {\n                        radii[0] = this.translate(from);\n                        radii[1] = this.translate(to);\n                    }\n\n                    // Convert percentages to pixel values\n                    radii = map(radii, function(radius) {\n                        if (percentRegex.test(radius)) {\n                            radius = (pInt(radius, 10) * fullRadius) / 100;\n                        }\n                        return radius;\n                    });\n\n                    // Handle full circle\n                    if (options.shape === 'circle' || !isCircular) {\n                        start = -Math.PI / 2;\n                        end = Math.PI * 1.5;\n                        open = true;\n                    } else {\n                        start = startAngleRad + this.translate(from);\n                        end = startAngleRad + this.translate(to);\n                    }\n\n                    radii[0] -= offset; // #5283\n                    radii[2] -= offset; // #5283\n\n                    ret = this.chart.renderer.symbols.arc(\n                        this.left + center[0],\n                        this.top + center[1],\n                        radii[0],\n                        radii[0], {\n                            start: Math.min(start, end), // Math is for reversed yAxis (#3606)\n                            end: Math.max(start, end),\n                            innerR: pick(radii[1], radii[0] - radii[2]),\n                            open: open\n                        }\n                    );\n                }\n\n                return ret;\n            },\n\n            /**\n             * Find the path for plot lines perpendicular to the radial axis.\n             */\n            getPlotLinePath: function(value, reverse) {\n                var axis = this,\n                    center = axis.center,\n                    chart = axis.chart,\n                    end = axis.getPosition(value),\n                    xAxis,\n                    xy,\n                    tickPositions,\n                    ret;\n\n                // Spokes\n                if (axis.isCircular) {\n                    ret = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];\n\n                    // Concentric circles\n                } else if (axis.options.gridLineInterpolation === 'circle') {\n                    value = axis.translate(value);\n                    if (value) { // a value of 0 is in the center\n                        ret = axis.getLinePath(0, value);\n                    }\n                    // Concentric polygons\n                } else {\n                    // Find the X axis in the same pane\n                    each(chart.xAxis, function(a) {\n                        if (a.pane === axis.pane) {\n                            xAxis = a;\n                        }\n                    });\n                    ret = [];\n                    value = axis.translate(value);\n                    tickPositions = xAxis.tickPositions;\n                    if (xAxis.autoConnect) {\n                        tickPositions = tickPositions.concat([tickPositions[0]]);\n                    }\n                    // Reverse the positions for concatenation of polygonal plot bands\n                    if (reverse) {\n                        tickPositions = [].concat(tickPositions).reverse();\n                    }\n\n                    each(tickPositions, function(pos, i) {\n                        xy = xAxis.getPosition(pos, value);\n                        ret.push(i ? 'L' : 'M', xy.x, xy.y);\n                    });\n\n                }\n                return ret;\n            },\n\n            /**\n             * Find the position for the axis title, by default inside the gauge\n             */\n            getTitlePosition: function() {\n                var center = this.center,\n                    chart = this.chart,\n                    titleOptions = this.options.title;\n\n                return {\n                    x: chart.plotLeft + center[0] + (titleOptions.x || 0),\n                    y: chart.plotTop + center[1] - ({\n                            high: 0.5,\n                            middle: 0.25,\n                            low: 0\n                        }[titleOptions.align] *\n                        center[2]) + (titleOptions.y || 0)\n                };\n            }\n\n        };\n\n        /**\n         * Override axisProto.init to mix in special axis instance functions and function overrides\n         */\n        wrap(axisProto, 'init', function(proceed, chart, userOptions) {\n            var angular = chart.angular,\n                polar = chart.polar,\n                isX = userOptions.isX,\n                isHidden = angular && isX,\n                isCircular,\n                options,\n                chartOptions = chart.options,\n                paneIndex = userOptions.pane || 0,\n                pane = this.pane = chart.pane[paneIndex],\n                paneOptions = pane.options;\n\n            // Before prototype.init\n            if (angular) {\n                extend(this, isHidden ? hiddenAxisMixin : radialAxisMixin);\n                isCircular = !isX;\n                if (isCircular) {\n                    this.defaultRadialOptions = this.defaultRadialGaugeOptions;\n                }\n\n            } else if (polar) {\n                extend(this, radialAxisMixin);\n                isCircular = isX;\n                this.defaultRadialOptions = isX ? this.defaultRadialXOptions : merge(this.defaultYAxisOptions, this.defaultRadialYOptions);\n\n            }\n\n            // Disable certain features on angular and polar axes\n            if (angular || polar) {\n                this.isRadial = true;\n                chart.inverted = false;\n                chartOptions.chart.zoomType = null;\n            } else {\n                this.isRadial = false;\n            }\n\n            // A pointer back to this axis to borrow geometry\n            if (isCircular) {\n                pane.axis = this;\n            }\n\n            // Run prototype.init\n            proceed.call(this, chart, userOptions);\n\n            if (!isHidden && (angular || polar)) {\n                options = this.options;\n\n                // Start and end angle options are\n                // given in degrees relative to top, while internal computations are\n                // in radians relative to right (like SVG).\n                this.angleRad = (options.angle || 0) * Math.PI / 180; // Y axis in polar charts\n                this.startAngleRad = (paneOptions.startAngle - 90) * Math.PI / 180; // Gauges\n                this.endAngleRad = (pick(paneOptions.endAngle, paneOptions.startAngle + 360) - 90) * Math.PI / 180; // Gauges\n                this.offset = options.offset || 0;\n\n                this.isCircular = isCircular;\n\n            }\n\n        });\n\n        /**\n         * Wrap auto label align to avoid setting axis-wide rotation on radial axes (#4920)\n         * @param   {Function} proceed\n         * @returns {String} Alignment\n         */\n        wrap(axisProto, 'autoLabelAlign', function(proceed) {\n            if (!this.isRadial) {\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            } // else return undefined\n        });\n\n        /**\n         * Add special cases within the Tick class' methods for radial axes.\n         */\n        wrap(tickProto, 'getPosition', function(proceed, horiz, pos, tickmarkOffset, old) {\n            var axis = this.axis;\n\n            return axis.getPosition ?\n                axis.getPosition(pos) :\n                proceed.call(this, horiz, pos, tickmarkOffset, old);\n        });\n\n        /**\n         * Wrap the getLabelPosition function to find the center position of the label\n         * based on the distance option\n         */\n        wrap(tickProto, 'getLabelPosition', function(proceed, x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n            var axis = this.axis,\n                optionsY = labelOptions.y,\n                ret,\n                centerSlot = 20, // 20 degrees to each side at the top and bottom\n                align = labelOptions.align,\n                angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;\n\n            if (axis.isRadial) { // Both X and Y axes in a polar chart\n                ret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));\n\n                // Automatically rotated\n                if (labelOptions.rotation === 'auto') {\n                    label.attr({\n                        rotation: angle\n                    });\n\n                    // Vertically centered\n                } else if (optionsY === null) {\n                    optionsY = axis.chart.renderer.fontMetrics(label.styles.fontSize).b - label.getBBox().height / 2;\n                }\n\n                // Automatic alignment\n                if (align === null) {\n                    if (axis.isCircular) { // Y axis\n                        if (this.label.getBBox().width > axis.len * axis.tickInterval / (axis.max - axis.min)) { // #3506\n                            centerSlot = 0;\n                        }\n                        if (angle > centerSlot && angle < 180 - centerSlot) {\n                            align = 'left'; // right hemisphere\n                        } else if (angle > 180 + centerSlot && angle < 360 - centerSlot) {\n                            align = 'right'; // left hemisphere\n                        } else {\n                            align = 'center'; // top or bottom\n                        }\n                    } else {\n                        align = 'center';\n                    }\n                    label.attr({\n                        align: align\n                    });\n                }\n\n                ret.x += labelOptions.x;\n                ret.y += optionsY;\n\n            } else {\n                ret = proceed.call(this, x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n            }\n            return ret;\n        });\n\n        /**\n         * Wrap the getMarkPath function to return the path of the radial marker\n         */\n        wrap(tickProto, 'getMarkPath', function(proceed, x, y, tickLength, tickWidth, horiz, renderer) {\n            var axis = this.axis,\n                endPoint,\n                ret;\n\n            if (axis.isRadial) {\n                endPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);\n                ret = [\n                    'M',\n                    x,\n                    y,\n                    'L',\n                    endPoint.x,\n                    endPoint.y\n                ];\n            } else {\n                ret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);\n            }\n            return ret;\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            noop = H.noop,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n        /* \n         * The arearangeseries series type\n         */\n        seriesType('arearange', 'area', {\n\n            marker: null,\n            threshold: null,\n            tooltip: {\n\n                pointFormat: '<span class=\"highcharts-color-{series.colorIndex}\">\\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'\n\n            },\n            trackByArea: true,\n            dataLabels: {\n                align: null,\n                verticalAlign: null,\n                xLow: 0,\n                xHigh: 0,\n                yLow: 0,\n                yHigh: 0\n            },\n            states: {\n                hover: {\n                    halo: false\n                }\n            }\n\n            // Prototype members\n        }, {\n            pointArrayMap: ['low', 'high'],\n            dataLabelCollections: ['dataLabel', 'dataLabelUpper'],\n            toYData: function(point) {\n                return [point.low, point.high];\n            },\n            pointValKey: 'low',\n            deferTranslatePolar: true,\n\n            /**\n             * Translate a point's plotHigh from the internal angle and radius measures to\n             * true plotHigh coordinates. This is an addition of the toXY method found in\n             * Polar.js, because it runs too early for arearanges to be considered (#3419).\n             */\n            highToXY: function(point) {\n                // Find the polar plotX and plotY\n                var chart = this.chart,\n                    xy = this.xAxis.postTranslate(point.rectPlotX, this.yAxis.len - point.plotHigh);\n                point.plotHighX = xy.x - chart.plotLeft;\n                point.plotHigh = xy.y - chart.plotTop;\n            },\n\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    hasModifyValue = !!series.modifyValue;\n\n                seriesTypes.area.prototype.translate.apply(series);\n\n                // Set plotLow and plotHigh\n                each(series.points, function(point) {\n\n                    var low = point.low,\n                        high = point.high,\n                        plotY = point.plotY;\n\n                    if (high === null || low === null) {\n                        point.isNull = true;\n                    } else {\n                        point.plotLow = plotY;\n                        point.plotHigh = yAxis.translate(\n                            hasModifyValue ? series.modifyValue(high, point) : high,\n                            0,\n                            1,\n                            0,\n                            1\n                        );\n                        if (hasModifyValue) {\n                            point.yBottom = point.plotHigh;\n                        }\n                    }\n                });\n\n                // Postprocess plotHigh\n                if (this.chart.polar) {\n                    each(this.points, function(point) {\n                        series.highToXY(point);\n                    });\n                }\n            },\n\n            /**\n             * Extend the line series' getSegmentPath method by applying the segment\n             * path to both lower and higher values of the range\n             */\n            getGraphPath: function(points) {\n\n                var highPoints = [],\n                    highAreaPoints = [],\n                    i,\n                    getGraphPath = seriesTypes.area.prototype.getGraphPath,\n                    point,\n                    pointShim,\n                    linePath,\n                    lowerPath,\n                    options = this.options,\n                    connectEnds = this.chart.polar && options.connectEnds !== false,\n                    connectNulls = options.connectNulls,\n                    step = options.step,\n                    higherPath,\n                    higherAreaPath;\n\n                points = points || this.points;\n                i = points.length;\n\n                // Create the top line and the top part of the area fill. The area fill compensates for \n                // null points by drawing down to the lower graph, moving across the null gap and \n                // starting again at the lower graph.\n                i = points.length;\n                while (i--) {\n                    point = points[i];\n\n                    if (!point.isNull &&\n                        !connectEnds &&\n                        !connectNulls &&\n                        (!points[i + 1] || points[i + 1].isNull)\n                    ) {\n                        highAreaPoints.push({\n                            plotX: point.plotX,\n                            plotY: point.plotY,\n                            doCurve: false // #5186, gaps in areasplinerange fill\n                        });\n                    }\n\n                    pointShim = {\n                        polarPlotY: point.polarPlotY,\n                        rectPlotX: point.rectPlotX,\n                        yBottom: point.yBottom,\n                        plotX: pick(point.plotHighX, point.plotX), // plotHighX is for polar charts\n                        plotY: point.plotHigh,\n                        isNull: point.isNull\n                    };\n\n                    highAreaPoints.push(pointShim);\n\n                    highPoints.push(pointShim);\n\n                    if (!point.isNull &&\n                        !connectEnds &&\n                        !connectNulls &&\n                        (!points[i - 1] || points[i - 1].isNull)\n                    ) {\n                        highAreaPoints.push({\n                            plotX: point.plotX,\n                            plotY: point.plotY,\n                            doCurve: false // #5186, gaps in areasplinerange fill\n                        });\n                    }\n                }\n\n                // Get the paths\n                lowerPath = getGraphPath.call(this, points);\n                if (step) {\n                    if (step === true) {\n                        step = 'left';\n                    }\n                    options.step = {\n                        left: 'right',\n                        center: 'center',\n                        right: 'left'\n                    }[step]; // swap for reading in getGraphPath\n                }\n                higherPath = getGraphPath.call(this, highPoints);\n                higherAreaPath = getGraphPath.call(this, highAreaPoints);\n                options.step = step;\n\n                // Create a line on both top and bottom of the range\n                linePath = [].concat(lowerPath, higherPath);\n\n                // For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'\n                if (!this.chart.polar && higherAreaPath[0] === 'M') {\n                    higherAreaPath[0] = 'L'; // this probably doesn't work for spline\t\t\t\n                }\n\n                this.graphPath = linePath;\n                this.areaPath = this.areaPath.concat(lowerPath, higherAreaPath);\n\n                // Prepare for sideways animation\n                linePath.isArea = true;\n                linePath.xMap = lowerPath.xMap;\n                this.areaPath.xMap = lowerPath.xMap;\n\n                return linePath;\n            },\n\n            /**\n             * Extend the basic drawDataLabels method by running it for both lower and higher\n             * values.\n             */\n            drawDataLabels: function() {\n\n                var data = this.data,\n                    length = data.length,\n                    i,\n                    originalDataLabels = [],\n                    seriesProto = Series.prototype,\n                    dataLabelOptions = this.options.dataLabels,\n                    align = dataLabelOptions.align,\n                    verticalAlign = dataLabelOptions.verticalAlign,\n                    inside = dataLabelOptions.inside,\n                    point,\n                    up,\n                    inverted = this.chart.inverted;\n\n                if (dataLabelOptions.enabled || this._hasPointLabels) {\n\n                    // Step 1: set preliminary values for plotY and dataLabel and draw the upper labels\n                    i = length;\n                    while (i--) {\n                        point = data[i];\n                        if (point) {\n                            up = inside ? point.plotHigh < point.plotLow : point.plotHigh > point.plotLow;\n\n                            // Set preliminary values\n                            point.y = point.high;\n                            point._plotY = point.plotY;\n                            point.plotY = point.plotHigh;\n\n                            // Store original data labels and set preliminary label objects to be picked up\n                            // in the uber method\n                            originalDataLabels[i] = point.dataLabel;\n                            point.dataLabel = point.dataLabelUpper;\n\n                            // Set the default offset\n                            point.below = up;\n                            if (inverted) {\n                                if (!align) {\n                                    dataLabelOptions.align = up ? 'right' : 'left';\n                                }\n                            } else {\n                                if (!verticalAlign) {\n                                    dataLabelOptions.verticalAlign = up ? 'top' : 'bottom';\n                                }\n                            }\n\n                            dataLabelOptions.x = dataLabelOptions.xHigh;\n                            dataLabelOptions.y = dataLabelOptions.yHigh;\n                        }\n                    }\n\n                    if (seriesProto.drawDataLabels) {\n                        seriesProto.drawDataLabels.apply(this, arguments); // #1209\n                    }\n\n                    // Step 2: reorganize and handle data labels for the lower values\n                    i = length;\n                    while (i--) {\n                        point = data[i];\n                        if (point) {\n                            up = inside ? point.plotHigh < point.plotLow : point.plotHigh > point.plotLow;\n\n                            // Move the generated labels from step 1, and reassign the original data labels\n                            point.dataLabelUpper = point.dataLabel;\n                            point.dataLabel = originalDataLabels[i];\n\n                            // Reset values\n                            point.y = point.low;\n                            point.plotY = point._plotY;\n\n                            // Set the default offset\n                            point.below = !up;\n                            if (inverted) {\n                                if (!align) {\n                                    dataLabelOptions.align = up ? 'left' : 'right';\n                                }\n                            } else {\n                                if (!verticalAlign) {\n                                    dataLabelOptions.verticalAlign = up ? 'bottom' : 'top';\n                                }\n\n                            }\n\n                            dataLabelOptions.x = dataLabelOptions.xLow;\n                            dataLabelOptions.y = dataLabelOptions.yLow;\n                        }\n                    }\n                    if (seriesProto.drawDataLabels) {\n                        seriesProto.drawDataLabels.apply(this, arguments);\n                    }\n                }\n\n                dataLabelOptions.align = align;\n                dataLabelOptions.verticalAlign = verticalAlign;\n            },\n\n            alignDataLabel: function() {\n                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);\n            },\n\n            setStackedPoints: noop,\n\n            getSymbol: noop,\n\n            drawPoints: noop\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The areasplinerange series type\n         */\n        seriesType('areasplinerange', 'arearange', null, {\n            getPointSpline: seriesTypes.spline.prototype.getPointSpline\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var defaultPlotOptions = H.defaultPlotOptions,\n            each = H.each,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        var colProto = seriesTypes.column.prototype;\n\n        /**\n         * The ColumnRangeSeries class\n         */\n        seriesType('columnrange', 'arearange', merge(defaultPlotOptions.column, defaultPlotOptions.arearange, {\n            lineWidth: 1,\n            pointRange: null\n\n            // Prototype members\n        }), {\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    xAxis = series.xAxis,\n                    startAngleRad = xAxis.startAngleRad,\n                    start,\n                    chart = series.chart,\n                    isRadial = series.xAxis.isRadial,\n                    plotHigh;\n\n                colProto.translate.apply(series);\n\n                // Set plotLow and plotHigh\n                each(series.points, function(point) {\n                    var shapeArgs = point.shapeArgs,\n                        minPointLength = series.options.minPointLength,\n                        heightDifference,\n                        height,\n                        y;\n\n                    point.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);\n                    point.plotLow = point.plotY;\n\n                    // adjust shape\n                    y = plotHigh;\n                    height = pick(point.rectPlotY, point.plotY) - plotHigh;\n\n                    // Adjust for minPointLength\n                    if (Math.abs(height) < minPointLength) {\n                        heightDifference = (minPointLength - height);\n                        height += heightDifference;\n                        y -= heightDifference / 2;\n\n                        // Adjust for negative ranges or reversed Y axis (#1457)\n                    } else if (height < 0) {\n                        height *= -1;\n                        y -= height;\n                    }\n\n                    if (isRadial) {\n\n                        start = point.barX + startAngleRad;\n                        point.shapeType = 'path';\n                        point.shapeArgs = {\n                            d: series.polarArc(y + height, y, start, start + point.pointWidth)\n                        };\n                    } else {\n                        shapeArgs.height = height;\n                        shapeArgs.y = y;\n\n                        point.tooltipPos = chart.inverted ? [\n                            yAxis.len + yAxis.pos - chart.plotLeft - y - height / 2,\n                            xAxis.len + xAxis.pos - chart.plotTop - shapeArgs.x -\n                            shapeArgs.width / 2,\n                            height\n                        ] : [\n                            xAxis.left - chart.plotLeft + shapeArgs.x +\n                            shapeArgs.width / 2,\n                            yAxis.pos - chart.plotTop + y + height / 2,\n                            height\n                        ]; // don't inherit from column tooltip position - #3372\n                    }\n                });\n            },\n            directTouch: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            drawGraph: noop,\n            crispCol: colProto.crispCol,\n            drawPoints: colProto.drawPoints,\n            drawTracker: colProto.drawTracker,\n            getColumnMetrics: colProto.getColumnMetrics,\n            animate: function() {\n                return colProto.animate.apply(this, arguments);\n            },\n            polarArc: function() {\n                return colProto.polarArc.apply(this, arguments);\n            },\n            pointAttribs: colProto.pointAttribs\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            TrackerMixin = H.TrackerMixin;\n        /* \n         * The GaugeSeries class\n         */\n        seriesType('gauge', 'line', {\n            dataLabels: {\n                enabled: true,\n                defer: false,\n                y: 15,\n                borderRadius: 3,\n                crop: false,\n                verticalAlign: 'top',\n                zIndex: 2\n\n            },\n            dial: {\n                // radius: '80%',\n                // baseWidth: 3,\n                // topWidth: 1,\n                // baseLength: '70%' // of radius\n                // rearLength: '10%'\n\n\n            },\n            pivot: {\n                //radius: 5\n\n            },\n            tooltip: {\n                headerFormat: ''\n            },\n            showInLegend: false\n\n            // Prototype members\n        }, {\n            // chart.angular will be set to true when a gauge series is present, and this will\n            // be used on the axes\n            angular: true,\n            directTouch: true, // #5063\n            drawGraph: noop,\n            fixedBox: true,\n            forceDL: true,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n\n            /**\n             * Calculate paths etc\n             */\n            translate: function() {\n\n                var series = this,\n                    yAxis = series.yAxis,\n                    options = series.options,\n                    center = yAxis.center;\n\n                series.generatePoints();\n\n                each(series.points, function(point) {\n\n                    var dialOptions = merge(options.dial, point.dial),\n                        radius = (pInt(pick(dialOptions.radius, 80)) * center[2]) / 200,\n                        baseLength = (pInt(pick(dialOptions.baseLength, 70)) * radius) / 100,\n                        rearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,\n                        baseWidth = dialOptions.baseWidth || 3,\n                        topWidth = dialOptions.topWidth || 1,\n                        overshoot = options.overshoot,\n                        rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);\n\n                    // Handle the wrap and overshoot options\n                    if (isNumber(overshoot)) {\n                        overshoot = overshoot / 180 * Math.PI;\n                        rotation = Math.max(yAxis.startAngleRad - overshoot, Math.min(yAxis.endAngleRad + overshoot, rotation));\n\n                    } else if (options.wrap === false) {\n                        rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));\n                    }\n\n                    rotation = rotation * 180 / Math.PI;\n\n                    point.shapeType = 'path';\n                    point.shapeArgs = {\n                        d: dialOptions.path || [\n                            'M', -rearLength, -baseWidth / 2,\n                            'L',\n                            baseLength, -baseWidth / 2,\n                            radius, -topWidth / 2,\n                            radius, topWidth / 2,\n                            baseLength, baseWidth / 2, -rearLength, baseWidth / 2,\n                            'z'\n                        ],\n                        translateX: center[0],\n                        translateY: center[1],\n                        rotation: rotation\n                    };\n\n                    // Positions for data label\n                    point.plotX = center[0];\n                    point.plotY = center[1];\n                });\n            },\n\n            /**\n             * Draw the points where each point is one needle\n             */\n            drawPoints: function() {\n\n                var series = this,\n                    center = series.yAxis.center,\n                    pivot = series.pivot,\n                    options = series.options,\n                    pivotOptions = options.pivot,\n                    renderer = series.chart.renderer;\n\n                each(series.points, function(point) {\n\n                    var graphic = point.graphic,\n                        shapeArgs = point.shapeArgs,\n                        d = shapeArgs.d,\n                        dialOptions = merge(options.dial, point.dial); // #1233\n\n                    if (graphic) {\n                        graphic.animate(shapeArgs);\n                        shapeArgs.d = d; // animate alters it\n                    } else {\n                        point.graphic = renderer[point.shapeType](shapeArgs)\n                            .attr({\n                                rotation: shapeArgs.rotation, // required by VML when animation is false\n                                zIndex: 1\n                            })\n                            .addClass('highcharts-dial')\n                            .add(series.group);\n\n\n                    }\n                });\n\n                // Add or move the pivot\n                if (pivot) {\n                    pivot.animate({ // #1235\n                        translateX: center[0],\n                        translateY: center[1]\n                    });\n                } else {\n                    series.pivot = renderer.circle(0, 0, pick(pivotOptions.radius, 5))\n                        .attr({\n                            zIndex: 2\n                        })\n                        .addClass('highcharts-pivot')\n                        .translate(center[0], center[1])\n                        .add(series.group);\n\n\n                }\n            },\n\n            /**\n             * Animate the arrow up from startAngle\n             */\n            animate: function(init) {\n                var series = this;\n\n                if (!init) {\n                    each(series.points, function(point) {\n                        var graphic = point.graphic;\n\n                        if (graphic) {\n                            // start value\n                            graphic.attr({\n                                rotation: series.yAxis.startAngleRad * 180 / Math.PI\n                            });\n\n                            // animate\n                            graphic.animate({\n                                rotation: point.shapeArgs.rotation\n                            }, series.options.animation);\n                        }\n                    });\n\n                    // delete this function to allow it only once\n                    series.animate = null;\n                }\n            },\n\n            render: function() {\n                this.group = this.plotGroup(\n                    'group',\n                    'series',\n                    this.visible ? 'visible' : 'hidden',\n                    this.options.zIndex,\n                    this.chart.seriesGroup\n                );\n                Series.prototype.render.call(this);\n                this.group.clip(this.chart.clipRect);\n            },\n\n            /**\n             * Extend the basic setData method by running processData and generatePoints immediately,\n             * in order to access the points from the legend.\n             */\n            setData: function(data, redraw) {\n                Series.prototype.setData.call(this, data, false);\n                this.processData();\n                this.generatePoints();\n                if (pick(redraw, true)) {\n                    this.chart.redraw();\n                }\n            },\n\n            /**\n             * If the tracking module is loaded, add the point tracker\n             */\n            drawTracker: TrackerMixin && TrackerMixin.drawTrackerPoint\n\n            // Point members\n        }, {\n            /**\n             * Don't do any hover colors or anything\n             */\n            setState: function(state) {\n                this.state = state;\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            noop = H.noop,\n            pick = H.pick,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The boxplot series type.\n         *\n         * @constructor seriesTypes.boxplot\n         * @augments seriesTypes.column\n         */\n        seriesType('boxplot', 'column', {\n            threshold: null,\n            tooltip: {\n\n                pointFormat: '<span class=\"highcharts-color-{point.colorIndex}\">\\u25CF</span> <b> {series.name}</b><br/>' +\n                    'Maximum: {point.high}<br/>' +\n                    'Upper quartile: {point.q3}<br/>' +\n                    'Median: {point.median}<br/>' +\n                    'Lower quartile: {point.q1}<br/>' +\n                    'Minimum: {point.low}<br/>'\n\n            },\n            whiskerLength: '50%'\n\n\n        }, /** @lends seriesTypes.boxplot */ {\n            pointArrayMap: ['low', 'q1', 'median', 'q3', 'high'], // array point configs are mapped to this\n            toYData: function(point) { // return a plain array for speedy calculation\n                return [point.low, point.q1, point.median, point.q3, point.high];\n            },\n            pointValKey: 'high', // defines the top of the tracker\n\n\n\n            /**\n             * Disable data labels for box plot\n             */\n            drawDataLabels: noop,\n\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    pointArrayMap = series.pointArrayMap;\n\n                seriesTypes.column.prototype.translate.apply(series);\n\n                // do the translation on each point dimension\n                each(series.points, function(point) {\n                    each(pointArrayMap, function(key) {\n                        if (point[key] !== null) {\n                            point[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);\n                        }\n                    });\n                });\n            },\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this, //state = series.state,\n                    points = series.points,\n                    options = series.options,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    q1Plot,\n                    q3Plot,\n                    highPlot,\n                    lowPlot,\n                    medianPlot,\n                    medianPath,\n                    crispCorr,\n                    crispX = 0,\n                    boxPath,\n                    width,\n                    left,\n                    right,\n                    halfWidth,\n                    doQuartiles = series.doQuartiles !== false, // error bar inherits this series type but doesn't do quartiles\n                    pointWiskerLength,\n                    whiskerLength = series.options.whiskerLength;\n\n\n                each(points, function(point) {\n\n                    var graphic = point.graphic,\n                        verb = graphic ? 'animate' : 'attr',\n                        shapeArgs = point.shapeArgs; // the box\n\n\n\n                    if (point.plotY !== undefined) {\n\n                        // crisp vector coordinates\n                        width = shapeArgs.width;\n                        left = Math.floor(shapeArgs.x);\n                        right = left + width;\n                        halfWidth = Math.round(width / 2);\n                        q1Plot = Math.floor(doQuartiles ? point.q1Plot : point.lowPlot);\n                        q3Plot = Math.floor(doQuartiles ? point.q3Plot : point.lowPlot);\n                        highPlot = Math.floor(point.highPlot);\n                        lowPlot = Math.floor(point.lowPlot);\n\n                        if (!graphic) {\n                            point.graphic = graphic = renderer.g('point')\n                                .add(series.group);\n\n                            point.stem = renderer.path()\n                                .addClass('highcharts-boxplot-stem')\n                                .add(graphic);\n\n                            if (whiskerLength) {\n                                point.whiskers = renderer.path()\n                                    .addClass('highcharts-boxplot-whisker')\n                                    .add(graphic);\n                            }\n                            if (doQuartiles) {\n                                point.box = renderer.path(boxPath)\n                                    .addClass('highcharts-boxplot-box')\n                                    .add(graphic);\n                            }\n                            point.medianShape = renderer.path(medianPath)\n                                .addClass('highcharts-boxplot-median')\n                                .add(graphic);\n                        }\n\n\n\n\n\n\n\n\n                        // The stem\n                        crispCorr = (point.stem.strokeWidth() % 2) / 2;\n                        crispX = left + halfWidth + crispCorr;\n                        point.stem[verb]({\n                            d: [\n                                // stem up\n                                'M',\n                                crispX, q3Plot,\n                                'L',\n                                crispX, highPlot,\n\n                                // stem down\n                                'M',\n                                crispX, q1Plot,\n                                'L',\n                                crispX, lowPlot\n                            ]\n                        });\n\n                        // The box\n                        if (doQuartiles) {\n                            crispCorr = (point.box.strokeWidth() % 2) / 2;\n                            q1Plot = Math.floor(q1Plot) + crispCorr;\n                            q3Plot = Math.floor(q3Plot) + crispCorr;\n                            left += crispCorr;\n                            right += crispCorr;\n                            point.box[verb]({\n                                d: [\n                                    'M',\n                                    left, q3Plot,\n                                    'L',\n                                    left, q1Plot,\n                                    'L',\n                                    right, q1Plot,\n                                    'L',\n                                    right, q3Plot,\n                                    'L',\n                                    left, q3Plot,\n                                    'z'\n                                ]\n                            });\n                        }\n\n                        // The whiskers\n                        if (whiskerLength) {\n                            crispCorr = (point.whiskers.strokeWidth() % 2) / 2;\n                            highPlot = highPlot + crispCorr;\n                            lowPlot = lowPlot + crispCorr;\n                            pointWiskerLength = (/%$/).test(whiskerLength) ? halfWidth * parseFloat(whiskerLength) / 100 : whiskerLength / 2;\n                            point.whiskers[verb]({\n                                d: [\n                                    // High whisker\n                                    'M',\n                                    crispX - pointWiskerLength,\n                                    highPlot,\n                                    'L',\n                                    crispX + pointWiskerLength,\n                                    highPlot,\n\n                                    // Low whisker\n                                    'M',\n                                    crispX - pointWiskerLength,\n                                    lowPlot,\n                                    'L',\n                                    crispX + pointWiskerLength,\n                                    lowPlot\n                                ]\n                            });\n                        }\n\n                        // The median\n                        medianPlot = Math.round(point.medianPlot);\n                        crispCorr = (point.medianShape.strokeWidth() % 2) / 2;\n                        medianPlot = medianPlot + crispCorr;\n\n                        point.medianShape[verb]({\n                            d: [\n                                'M',\n                                left,\n                                medianPlot,\n                                'L',\n                                right,\n                                medianPlot\n                            ]\n                        });\n                    }\n                });\n\n            },\n            setStackedPoints: noop // #3890\n\n\n        });\n\n        /* ****************************************************************************\n         * End Box plot series code\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            noop = H.noop,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n\n        /* ****************************************************************************\n         * Start error bar series code                                                *\n         *****************************************************************************/\n        seriesType('errorbar', 'boxplot', {\n\n            grouping: false,\n            linkedTo: ':previous',\n            tooltip: {\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'\n            },\n            whiskerWidth: null\n\n            // Prototype members\n        }, {\n            type: 'errorbar',\n            pointArrayMap: ['low', 'high'], // array point configs are mapped to this\n            toYData: function(point) { // return a plain array for speedy calculation\n                return [point.low, point.high];\n            },\n            pointValKey: 'high', // defines the top of the tracker\n            doQuartiles: false,\n            drawDataLabels: seriesTypes.arearange ? function() {\n                var valKey = this.pointValKey;\n                seriesTypes.arearange.prototype.drawDataLabels.call(this);\n                // Arearange drawDataLabels does not reset point.y to high, but to low after drawing. #4133 \n                each(this.data, function(point) {\n                    point.y = point[valKey];\n                });\n            } : noop,\n\n            /**\n             * Get the width and X offset, either on top of the linked series column\n             * or standalone\n             */\n            getColumnMetrics: function() {\n                return (this.linkedParent && this.linkedParent.columnMetrics) ||\n                    seriesTypes.column.prototype.getColumnMetrics.call(this);\n            }\n        });\n\n        /* ****************************************************************************\n         * End error bar series code                                                  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var correctFloat = H.correctFloat,\n            isNumber = H.isNumber,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /* ****************************************************************************\n         * Start Waterfall series code                                                *\n         *****************************************************************************/\n        seriesType('waterfall', 'column', {\n            dataLabels: {\n                inside: true\n            },\n\n\n            // Prototype members\n        }, {\n            pointValKey: 'y',\n\n            /**\n             * Translate data points from raw values\n             */\n            translate: function() {\n                var series = this,\n                    options = series.options,\n                    yAxis = series.yAxis,\n                    len,\n                    i,\n                    points,\n                    point,\n                    shapeArgs,\n                    stack,\n                    y,\n                    yValue,\n                    previousY,\n                    previousIntermediate,\n                    range,\n                    minPointLength = pick(options.minPointLength, 5),\n                    halfMinPointLength = minPointLength / 2,\n                    threshold = options.threshold,\n                    stacking = options.stacking,\n                    stackIndicator,\n                    tooltipY;\n\n                // run column series translate\n                seriesTypes.column.prototype.translate.apply(series);\n\n                previousY = previousIntermediate = threshold;\n                points = series.points;\n\n                for (i = 0, len = points.length; i < len; i++) {\n                    // cache current point object\n                    point = points[i];\n                    yValue = series.processedYData[i];\n                    shapeArgs = point.shapeArgs;\n\n                    // get current stack\n                    stack = stacking && yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey];\n                    stackIndicator = series.getStackIndicator(\n                        stackIndicator,\n                        point.x,\n                        series.index\n                    );\n                    range = stack ?\n                        stack[point.x].points[stackIndicator.key] : [0, yValue];\n\n                    // override point value for sums\n                    // #3710 Update point does not propagate to sum\n                    if (point.isSum) {\n                        point.y = correctFloat(yValue);\n                    } else if (point.isIntermediateSum) {\n                        point.y = correctFloat(yValue - previousIntermediate); // #3840\n                    }\n                    // up points\n                    y = Math.max(previousY, previousY + point.y) + range[0];\n                    shapeArgs.y = yAxis.translate(y, 0, 1, 0, 1);\n\n                    // sum points\n                    if (point.isSum) {\n                        shapeArgs.y = yAxis.translate(range[1], 0, 1, 0, 1);\n                        shapeArgs.height = Math.min(yAxis.translate(range[0], 0, 1, 0, 1), yAxis.len) -\n                            shapeArgs.y; // #4256\n\n                    } else if (point.isIntermediateSum) {\n                        shapeArgs.y = yAxis.translate(range[1], 0, 1, 0, 1);\n                        shapeArgs.height = Math.min(yAxis.translate(previousIntermediate, 0, 1, 0, 1), yAxis.len) -\n                            shapeArgs.y;\n                        previousIntermediate = range[1];\n\n                        // If it's not the sum point, update previous stack end position and get\n                        // shape height (#3886)\n                    } else {\n                        shapeArgs.height = yValue > 0 ?\n                            yAxis.translate(previousY, 0, 1, 0, 1) - shapeArgs.y :\n                            yAxis.translate(previousY, 0, 1, 0, 1) - yAxis.translate(previousY - yValue, 0, 1, 0, 1);\n\n                        previousY += stack && stack[point.x] ? stack[point.x].total : yValue;\n                    }\n\n                    // #3952 Negative sum or intermediate sum not rendered correctly\n                    if (shapeArgs.height < 0) {\n                        shapeArgs.y += shapeArgs.height;\n                        shapeArgs.height *= -1;\n                    }\n\n                    point.plotY = shapeArgs.y = Math.round(shapeArgs.y) - (series.borderWidth % 2) / 2;\n                    shapeArgs.height = Math.max(Math.round(shapeArgs.height), 0.001); // #3151\n                    point.yBottom = shapeArgs.y + shapeArgs.height;\n\n                    if (shapeArgs.height <= minPointLength && !point.isNull) {\n                        shapeArgs.height = minPointLength;\n                        shapeArgs.y -= halfMinPointLength;\n                        point.plotY = shapeArgs.y;\n                        if (point.y < 0) {\n                            point.minPointLengthOffset = -halfMinPointLength;\n                        } else {\n                            point.minPointLengthOffset = halfMinPointLength;\n                        }\n                    } else {\n                        point.minPointLengthOffset = 0;\n                    }\n\n                    // Correct tooltip placement (#3014)\n                    tooltipY = point.plotY + (point.negative ? shapeArgs.height : 0);\n\n                    if (series.chart.inverted) {\n                        point.tooltipPos[0] = yAxis.len - tooltipY;\n                    } else {\n                        point.tooltipPos[1] = tooltipY;\n                    }\n                }\n            },\n\n            /**\n             * Call default processData then override yData to reflect waterfall's extremes on yAxis\n             */\n            processData: function(force) {\n                var series = this,\n                    options = series.options,\n                    yData = series.yData,\n                    points = series.options.data, // #3710 Update point does not propagate to sum\n                    point,\n                    dataLength = yData.length,\n                    threshold = options.threshold || 0,\n                    subSum,\n                    sum,\n                    dataMin,\n                    dataMax,\n                    y,\n                    i;\n\n                sum = subSum = dataMin = dataMax = threshold;\n\n                for (i = 0; i < dataLength; i++) {\n                    y = yData[i];\n                    point = points && points[i] ? points[i] : {};\n\n                    if (y === 'sum' || point.isSum) {\n                        yData[i] = correctFloat(sum);\n                    } else if (y === 'intermediateSum' || point.isIntermediateSum) {\n                        yData[i] = correctFloat(subSum);\n                    } else {\n                        sum += y;\n                        subSum += y;\n                    }\n                    dataMin = Math.min(sum, dataMin);\n                    dataMax = Math.max(sum, dataMax);\n                }\n\n                Series.prototype.processData.call(this, force);\n\n                // Record extremes only if stacking was not set:\n                if (!series.options.stacking) {\n                    series.dataMin = dataMin;\n                    series.dataMax = dataMax;\n                }\n            },\n\n            /**\n             * Return y value or string if point is sum\n             */\n            toYData: function(pt) {\n                if (pt.isSum) {\n                    return (pt.x === 0 ? null : 'sum'); //#3245 Error when first element is Sum or Intermediate Sum\n                }\n                if (pt.isIntermediateSum) {\n                    return (pt.x === 0 ? null : 'intermediateSum'); //#3245\n                }\n                return pt.y;\n            },\n\n\n\n            /**\n             * Return an empty path initially, because we need to know the stroke-width in order \n             * to set the final path.\n             */\n            getGraphPath: function() {\n                return ['M', 0, 0];\n            },\n\n            /**\n             * Draw columns' connector lines\n             */\n            getCrispPath: function() {\n\n                var data = this.data,\n                    length = data.length,\n                    lineWidth = this.graph.strokeWidth() + this.borderWidth,\n                    normalizer = Math.round(lineWidth) % 2 / 2,\n                    reversedYAxis = this.yAxis.reversed,\n                    path = [],\n                    prevArgs,\n                    pointArgs,\n                    i,\n                    d;\n\n                for (i = 1; i < length; i++) {\n                    pointArgs = data[i].shapeArgs;\n                    prevArgs = data[i - 1].shapeArgs;\n\n                    d = [\n                        'M',\n                        prevArgs.x + prevArgs.width,\n                        prevArgs.y + data[i - 1].minPointLengthOffset + normalizer,\n                        'L',\n                        pointArgs.x,\n                        prevArgs.y + data[i - 1].minPointLengthOffset + normalizer\n                    ];\n\n                    if (\n                        (data[i - 1].y < 0 && !reversedYAxis) ||\n                        (data[i - 1].y > 0 && reversedYAxis)\n                    ) {\n                        d[2] += prevArgs.height;\n                        d[5] += prevArgs.height;\n                    }\n\n                    path = path.concat(d);\n                }\n\n                return path;\n            },\n\n            /**\n             * The graph is initally drawn with an empty definition, then updated with\n             * crisp rendering.\n             */\n            drawGraph: function() {\n                Series.prototype.drawGraph.call(this);\n                this.graph.attr({\n                    d: this.getCrispPath()\n                });\n            },\n\n            /**\n             * Waterfall has stacking along the x-values too.\n             */\n            setStackedPoints: function() {\n                var series = this,\n                    options = series.options,\n                    stackedYLength,\n                    i;\n\n                Series.prototype.setStackedPoints.apply(series, arguments);\n\n                stackedYLength = series.stackedYData ? series.stackedYData.length : 0;\n\n                // Start from the second point:\n                for (i = 1; i < stackedYLength; i++) {\n                    if (!options.data[i].isSum &&\n                        !options.data[i].isIntermediateSum\n                    ) {\n                        // Sum previous stacked data as waterfall can grow up/down:\n                        series.stackedYData[i] += series.stackedYData[i - 1];\n                    }\n                }\n            },\n\n            /**\n             * Extremes for a non-stacked series are recorded in processData.\n             * In case of stacking, use Series.stackedYData to calculate extremes.\n             */\n            getExtremes: function() {\n                if (this.options.stacking) {\n                    return Series.prototype.getExtremes.apply(this, arguments);\n                }\n            }\n\n\n            // Point members\n        }, {\n            getClassName: function() {\n                var className = Point.prototype.getClassName.call(this);\n\n                if (this.isSum) {\n                    className += ' highcharts-sum';\n                } else if (this.isIntermediateSum) {\n                    className += ' highcharts-intermediate-sum';\n                }\n                return className;\n            },\n            /**\n             * Pass the null test in ColumnSeries.translate.\n             */\n            isValid: function() {\n                return isNumber(this.y, true) || this.isSum || this.isIntermediateSum;\n            }\n\n        });\n\n        /* ****************************************************************************\n         * End Waterfall series code                                                  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var LegendSymbolMixin = H.LegendSymbolMixin,\n            noop = H.noop,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n        /**\n         * The polygon series prototype\n         */\n        seriesType('polygon', 'scatter', {\n            marker: {\n                enabled: false,\n                states: {\n                    hover: {\n                        enabled: false\n                    }\n                }\n            },\n            stickyTracking: false,\n            tooltip: {\n                followPointer: true,\n                pointFormat: ''\n            },\n            trackByArea: true\n\n            // Prototype members\n        }, {\n            type: 'polygon',\n            getGraphPath: function() {\n\n                var graphPath = Series.prototype.getGraphPath.call(this),\n                    i = graphPath.length + 1;\n\n                // Close all segments\n                while (i--) {\n                    if ((i === graphPath.length || graphPath[i] === 'M') && i > 0) {\n                        graphPath.splice(i, 0, 'z');\n                    }\n                }\n                this.areaPath = graphPath;\n                return graphPath;\n            },\n            drawGraph: function() {\n\n                seriesTypes.area.prototype.drawGraph.call(this);\n            },\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            drawTracker: Series.prototype.drawTracker,\n            setStackedPoints: noop // No stacking points on polygons (#5310)\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            Axis = H.Axis,\n            color = H.color,\n            each = H.each,\n            isNumber = H.isNumber,\n            noop = H.noop,\n            pick = H.pick,\n            pInt = H.pInt,\n            Point = H.Point,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /* ****************************************************************************\n         * Start Bubble series code\t\t\t\t\t\t\t\t\t\t\t          *\n         *****************************************************************************/\n\n        seriesType('bubble', 'scatter', {\n            dataLabels: {\n                formatter: function() { // #2945\n                    return this.point.z;\n                },\n                inside: true,\n                verticalAlign: 'middle'\n            },\n            // displayNegative: true,\n            marker: {\n\n                // Avoid offset in Point.setState\n                radius: null,\n                states: {\n                    hover: {\n                        radiusPlus: 0\n                    }\n                },\n                symbol: 'circle'\n            },\n            minSize: 8,\n            maxSize: '20%',\n            // negativeColor: null,\n            // sizeBy: 'area'\n            softThreshold: false,\n            states: {\n                hover: {\n                    halo: {\n                        size: 5\n                    }\n                }\n            },\n            tooltip: {\n                pointFormat: '({point.x}, {point.y}), Size: {point.z}'\n            },\n            turboThreshold: 0,\n            zThreshold: 0,\n            zoneAxis: 'z'\n\n            // Prototype members\n        }, {\n            pointArrayMap: ['y', 'z'],\n            parallelArrays: ['x', 'y', 'z'],\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            specialGroup: 'group', // To allow clipping (#6296)\n            bubblePadding: true,\n            zoneAxis: 'z',\n            directTouch: true,\n\n\n\n            /**\n             * Get the radius for each point based on the minSize, maxSize and each point's Z value. This\n             * must be done prior to Series.translate because the axis needs to add padding in\n             * accordance with the point sizes.\n             */\n            getRadii: function(zMin, zMax, minSize, maxSize) {\n                var len,\n                    i,\n                    pos,\n                    zData = this.zData,\n                    radii = [],\n                    options = this.options,\n                    sizeByArea = options.sizeBy !== 'width',\n                    zThreshold = options.zThreshold,\n                    zRange = zMax - zMin,\n                    value,\n                    radius;\n\n                // Set the shape type and arguments to be picked up in drawPoints\n                for (i = 0, len = zData.length; i < len; i++) {\n\n                    value = zData[i];\n\n                    // When sizing by threshold, the absolute value of z determines the size\n                    // of the bubble.\n                    if (options.sizeByAbsoluteValue && value !== null) {\n                        value = Math.abs(value - zThreshold);\n                        zMax = Math.max(zMax - zThreshold, Math.abs(zMin - zThreshold));\n                        zMin = 0;\n                    }\n\n                    if (value === null) {\n                        radius = null;\n                        // Issue #4419 - if value is less than zMin, push a radius that's always smaller than the minimum size\n                    } else if (value < zMin) {\n                        radius = minSize / 2 - 1;\n                    } else {\n                        // Relative size, a number between 0 and 1\n                        pos = zRange > 0 ? (value - zMin) / zRange : 0.5;\n\n                        if (sizeByArea && pos >= 0) {\n                            pos = Math.sqrt(pos);\n                        }\n                        radius = Math.ceil(minSize + pos * (maxSize - minSize)) / 2;\n                    }\n                    radii.push(radius);\n                }\n                this.radii = radii;\n            },\n\n            /**\n             * Perform animation on the bubbles\n             */\n            animate: function(init) {\n                var animation = this.options.animation;\n\n                if (!init) { // run the animation\n                    each(this.points, function(point) {\n                        var graphic = point.graphic,\n                            animationTarget;\n\n                        if (graphic && graphic.width) { // URL symbols don't have width\n                            animationTarget = {\n                                x: graphic.x,\n                                y: graphic.y,\n                                width: graphic.width,\n                                height: graphic.height\n                            };\n\n                            // Start values\n                            graphic.attr({\n                                x: point.plotX,\n                                y: point.plotY,\n                                width: 1,\n                                height: 1\n                            });\n\n                            // Run animation\n                            graphic.animate(animationTarget, animation);\n                        }\n                    });\n\n                    // delete this function to allow it only once\n                    this.animate = null;\n                }\n            },\n\n            /**\n             * Extend the base translate method to handle bubble size\n             */\n            translate: function() {\n\n                var i,\n                    data = this.data,\n                    point,\n                    radius,\n                    radii = this.radii;\n\n                // Run the parent method\n                seriesTypes.scatter.prototype.translate.call(this);\n\n                // Set the shape type and arguments to be picked up in drawPoints\n                i = data.length;\n\n                while (i--) {\n                    point = data[i];\n                    radius = radii ? radii[i] : 0; // #1737\n\n                    if (isNumber(radius) && radius >= this.minPxSize / 2) {\n                        // Shape arguments\n                        point.marker = H.extend(point.marker, {\n                            radius: radius,\n                            width: 2 * radius,\n                            height: 2 * radius\n                        });\n\n                        // Alignment box for the data label\n                        point.dlBox = {\n                            x: point.plotX - radius,\n                            y: point.plotY - radius,\n                            width: 2 * radius,\n                            height: 2 * radius\n                        };\n                    } else { // below zThreshold\n                        point.shapeArgs = point.plotY = point.dlBox = undefined; // #1691\n                    }\n                }\n            },\n\n            alignDataLabel: seriesTypes.column.prototype.alignDataLabel,\n            buildKDTree: noop,\n            applyZones: noop\n\n            // Point class\n        }, {\n            haloPath: function(size) {\n                return Point.prototype.haloPath.call(\n                    this,\n                    size === 0 ? 0 : (this.marker ? this.marker.radius || 0 : 0) + size // #6067\n                );\n            },\n            ttBelow: false\n        });\n\n        /**\n         * Add logic to pad each axis with the amount of pixels\n         * necessary to avoid the bubbles to overflow.\n         */\n        Axis.prototype.beforePadding = function() {\n            var axis = this,\n                axisLength = this.len,\n                chart = this.chart,\n                pxMin = 0,\n                pxMax = axisLength,\n                isXAxis = this.isXAxis,\n                dataKey = isXAxis ? 'xData' : 'yData',\n                min = this.min,\n                extremes = {},\n                smallestSize = Math.min(chart.plotWidth, chart.plotHeight),\n                zMin = Number.MAX_VALUE,\n                zMax = -Number.MAX_VALUE,\n                range = this.max - min,\n                transA = axisLength / range,\n                activeSeries = [];\n\n            // Handle padding on the second pass, or on redraw\n            each(this.series, function(series) {\n\n                var seriesOptions = series.options,\n                    zData;\n\n                if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {\n\n                    // Correction for #1673\n                    axis.allowZoomOutside = true;\n\n                    // Cache it\n                    activeSeries.push(series);\n\n                    if (isXAxis) { // because X axis is evaluated first\n\n                        // For each series, translate the size extremes to pixel values\n                        each(['minSize', 'maxSize'], function(prop) {\n                            var length = seriesOptions[prop],\n                                isPercent = /%$/.test(length);\n\n                            length = pInt(length);\n                            extremes[prop] = isPercent ?\n                                smallestSize * length / 100 :\n                                length;\n\n                        });\n                        series.minPxSize = extremes.minSize;\n                        // Prioritize min size if conflict to make sure bubbles are\n                        // always visible. #5873\n                        series.maxPxSize = Math.max(extremes.maxSize, extremes.minSize);\n\n                        // Find the min and max Z\n                        zData = series.zData;\n                        if (zData.length) { // #1735\n                            zMin = pick(seriesOptions.zMin, Math.min(\n                                zMin,\n                                Math.max(\n                                    arrayMin(zData),\n                                    seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE\n                                )\n                            ));\n                            zMax = pick(seriesOptions.zMax, Math.max(zMax, arrayMax(zData)));\n                        }\n                    }\n                }\n            });\n\n            each(activeSeries, function(series) {\n\n                var data = series[dataKey],\n                    i = data.length,\n                    radius;\n\n                if (isXAxis) {\n                    series.getRadii(zMin, zMax, series.minPxSize, series.maxPxSize);\n                }\n\n                if (range > 0) {\n                    while (i--) {\n                        if (isNumber(data[i]) && axis.dataMin <= data[i] && data[i] <= axis.dataMax) {\n                            radius = series.radii[i];\n                            pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);\n                            pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);\n                        }\n                    }\n                }\n            });\n\n            if (activeSeries.length && range > 0 && !this.isLog) {\n                pxMax -= axisLength;\n                transA *= (axisLength + pxMin - pxMax) / axisLength;\n                each([\n                    ['min', 'userMin', pxMin],\n                    ['max', 'userMax', pxMax]\n                ], function(keys) {\n                    if (pick(axis.options[keys[0]], axis[keys[1]]) === undefined) {\n                        axis[keys[0]] += keys[2] / transA;\n                    }\n                });\n            }\n        };\n\n        /* ****************************************************************************\n         * End Bubble series code                                                     *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /**\n         * Extensions for polar charts. Additionally, much of the geometry required for polar charts is\n         * gathered in RadialAxes.js.\n         *\n         */\n\n        var each = H.each,\n            pick = H.pick,\n            Pointer = H.Pointer,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n\n            seriesProto = Series.prototype,\n            pointerProto = Pointer.prototype,\n            colProto;\n\n        /**\n         * Search a k-d tree by the point angle, used for shared tooltips in polar charts\n         */\n        seriesProto.searchPointByAngle = function(e) {\n            var series = this,\n                chart = series.chart,\n                xAxis = series.xAxis,\n                center = xAxis.pane.center,\n                plotX = e.chartX - center[0] - chart.plotLeft,\n                plotY = e.chartY - center[1] - chart.plotTop;\n\n            return this.searchKDTree({\n                clientX: 180 + (Math.atan2(plotX, plotY) * (-180 / Math.PI))\n            });\n\n        };\n\n        /**\n         * #6212 Calculate connectors for spline series in polar chart. \n         * @param {Boolean} calculateNeighbours - Check if connectors should be calculated for neighbour points as well\n         * allows short recurence\n         */\n        seriesProto.getConnectors = function(segment, index, calculateNeighbours, connectEnds) {\n\n            var i,\n                prevPointInd,\n                nextPointInd,\n                previousPoint,\n                nextPoint,\n                previousX,\n                previousY,\n                nextX,\n                nextY,\n                plotX,\n                plotY,\n                ret,\n                smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc;\n                denom = smoothing + 1,\n                leftContX,\n                leftContY,\n                rightContX,\n                rightContY,\n                dLControlPoint, //distance left control point\n                dRControlPoint,\n                leftContAngle,\n                rightContAngle,\n                jointAngle,\n                addedNumber = connectEnds ? 1 : 0;\n\n            /** calculate final index of points depending on the initial index value.\n             * Because of calculating neighbours, index may be outisde segment array.\n             */\n            if (index >= 0 && index <= segment.length - 1) {\n                i = index;\n            } else if (index < 0) {\n                i = segment.length - 1 + index;\n            } else {\n                i = 0;\n            }\n\n            prevPointInd = (i - 1 < 0) ? segment.length - (1 + addedNumber) : i - 1;\n            nextPointInd = (i + 1 > segment.length - 1) ? addedNumber : i + 1;\n            previousPoint = segment[prevPointInd];\n            nextPoint = segment[nextPointInd];\n            previousX = previousPoint.plotX;\n            previousY = previousPoint.plotY;\n            nextX = nextPoint.plotX;\n            nextY = nextPoint.plotY;\n            plotX = segment[i].plotX; // actual point\n            plotY = segment[i].plotY;\n            leftContX = (smoothing * plotX + previousX) / denom;\n            leftContY = (smoothing * plotY + previousY) / denom;\n            rightContX = (smoothing * plotX + nextX) / denom;\n            rightContY = (smoothing * plotY + nextY) / denom;\n            dLControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2));\n            dRControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2));\n            leftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX);\n            rightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);\n            jointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);\n            // Ensure the right direction, jointAngle should be in the same quadrant as leftContAngle\n            if (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {\n                jointAngle -= Math.PI;\n            }\n            // Find the corrected control points for a spline straight through the point\n            leftContX = plotX + Math.cos(jointAngle) * dLControlPoint;\n            leftContY = plotY + Math.sin(jointAngle) * dLControlPoint;\n            rightContX = plotX + Math.cos(Math.PI + jointAngle) * dRControlPoint;\n            rightContY = plotY + Math.sin(Math.PI + jointAngle) * dRControlPoint;\n\n            // push current point's connectors into returned object\n\n            ret = {\n                rightContX: rightContX,\n                rightContY: rightContY,\n                leftContX: leftContX,\n                leftContY: leftContY,\n                plotX: plotX,\n                plotY: plotY\n            };\n\n            // calculate connectors for previous and next point and push them inside returned object \n            if (calculateNeighbours) {\n                ret.prevPointCont = this.getConnectors(segment, prevPointInd, false, connectEnds);\n            }\n            return ret;\n        };\n\n        /**\n         * Wrap the buildKDTree function so that it searches by angle (clientX) in case of shared tooltip,\n         * and by two dimensional distance in case of non-shared.\n         */\n        wrap(seriesProto, 'buildKDTree', function(proceed) {\n            if (this.chart.polar) {\n                if (this.kdByAngle) {\n                    this.searchPoint = this.searchPointByAngle;\n                } else {\n                    this.options.findNearestPointBy = 'xy';\n                }\n            }\n            proceed.apply(this);\n        });\n\n        /**\n         * Translate a point's plotX and plotY from the internal angle and radius measures to\n         * true plotX, plotY coordinates\n         */\n        seriesProto.toXY = function(point) {\n            var xy,\n                chart = this.chart,\n                plotX = point.plotX,\n                plotY = point.plotY,\n                clientX;\n\n            // Save rectangular plotX, plotY for later computation\n            point.rectPlotX = plotX;\n            point.rectPlotY = plotY;\n\n            // Find the polar plotX and plotY\n            xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);\n            point.plotX = point.polarPlotX = xy.x - chart.plotLeft;\n            point.plotY = point.polarPlotY = xy.y - chart.plotTop;\n\n            // If shared tooltip, record the angle in degrees in order to align X points. Otherwise,\n            // use a standard k-d tree to get the nearest point in two dimensions.\n            if (this.kdByAngle) {\n                clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;\n                if (clientX < 0) { // #2665\n                    clientX += 360;\n                }\n                point.clientX = clientX;\n            } else {\n                point.clientX = point.plotX;\n            }\n        };\n\n        if (seriesTypes.spline) {\n            /**\n             * Overridden method for calculating a spline from one point to the next\n             */\n            wrap(seriesTypes.spline.prototype, 'getPointSpline', function(proceed, segment, point, i) {\n                var ret,\n                    connectors;\n\n                if (this.chart.polar) {\n                    // moveTo or lineTo\n                    if (!i) {\n                        ret = ['M', point.plotX, point.plotY];\n                    } else { // curve from last point to this\n                        connectors = this.getConnectors(segment, i, true, this.connectEnds);\n                        ret = [\n                            'C',\n                            connectors.prevPointCont.rightContX,\n                            connectors.prevPointCont.rightContY,\n                            connectors.leftContX,\n                            connectors.leftContY,\n                            connectors.plotX,\n                            connectors.plotY\n                        ];\n                    }\n                } else {\n                    ret = proceed.call(this, segment, point, i);\n                }\n                return ret;\n            });\n\n            // #6430 Areasplinerange series use unwrapped getPointSpline method, so we need to set this method again.\n            if (seriesTypes.areasplinerange) {\n                seriesTypes.areasplinerange.prototype.getPointSpline = seriesTypes.spline.prototype.getPointSpline;\n            }\n        }\n\n        /**\n         * Extend translate. The plotX and plotY values are computed as if the polar chart were a\n         * cartesian plane, where plotX denotes the angle in radians and (yAxis.len - plotY) is the pixel distance from\n         * center.\n         */\n        wrap(seriesProto, 'translate', function(proceed) {\n            var chart = this.chart,\n                points,\n                i;\n\n            // Run uber method\n            proceed.call(this);\n\n            // Postprocess plot coordinates\n            if (chart.polar) {\n                this.kdByAngle = chart.tooltip && chart.tooltip.shared;\n\n                if (!this.preventPostTranslate) {\n                    points = this.points;\n                    i = points.length;\n\n                    while (i--) {\n                        // Translate plotX, plotY from angle and radius to true plot coordinates\n                        this.toXY(points[i]);\n                    }\n                }\n            }\n        });\n\n        /**\n         * Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in\n         * line-like series.\n         */\n        wrap(seriesProto, 'getGraphPath', function(proceed, points) {\n            var series = this,\n                i,\n                firstValid,\n                popLastPoint;\n\n            // Connect the path\n            if (this.chart.polar) {\n                points = points || this.points;\n\n                // Append first valid point in order to connect the ends\n                for (i = 0; i < points.length; i++) {\n                    if (!points[i].isNull) {\n                        firstValid = i;\n                        break;\n                    }\n                }\n                if (this.options.connectEnds !== false && firstValid !== undefined) {\n                    this.connectEnds = true; // re-used in splines\n                    points.splice(points.length, 0, points[firstValid]);\n                    popLastPoint = true;\n                }\n\n                // For area charts, pseudo points are added to the graph, now we need to translate these\n                each(points, function(point) {\n                    if (point.polarPlotY === undefined) {\n                        series.toXY(point);\n                    }\n                });\n            }\n\n            // Run uber method\n            var ret = proceed.apply(this, [].slice.call(arguments, 1));\n\n            /** #6212 points.splice method is adding points to an array. In case of areaspline getGraphPath method is used two times\n             * and in both times points are added to an array. That is why points.pop is used, to get unmodified points.\n             */\n            if (popLastPoint) {\n                points.pop();\n            }\n            return ret;\n        });\n\n\n        function polarAnimate(proceed, init) {\n            var chart = this.chart,\n                animation = this.options.animation,\n                group = this.group,\n                markerGroup = this.markerGroup,\n                center = this.xAxis.center,\n                plotLeft = chart.plotLeft,\n                plotTop = chart.plotTop,\n                attribs;\n\n            // Specific animation for polar charts\n            if (chart.polar) {\n\n                // Enable animation on polar charts only in SVG. In VML, the scaling is different, plus animation\n                // would be so slow it would't matter.\n                if (chart.renderer.isSVG) {\n\n                    if (animation === true) {\n                        animation = {};\n                    }\n\n                    // Initialize the animation\n                    if (init) {\n\n                        // Scale down the group and place it in the center\n                        attribs = {\n                            translateX: center[0] + plotLeft,\n                            translateY: center[1] + plotTop,\n                            scaleX: 0.001, // #1499\n                            scaleY: 0.001\n                        };\n\n                        group.attr(attribs);\n                        if (markerGroup) {\n                            //markerGroup.attrSetters = group.attrSetters;\n                            markerGroup.attr(attribs);\n                        }\n\n                        // Run the animation\n                    } else {\n                        attribs = {\n                            translateX: plotLeft,\n                            translateY: plotTop,\n                            scaleX: 1,\n                            scaleY: 1\n                        };\n                        group.animate(attribs, animation);\n                        if (markerGroup) {\n                            markerGroup.animate(attribs, animation);\n                        }\n\n                        // Delete this function to allow it only once\n                        this.animate = null;\n                    }\n                }\n\n                // For non-polar charts, revert to the basic animation\n            } else {\n                proceed.call(this, init);\n            }\n        }\n\n        // Define the animate method for regular series\n        wrap(seriesProto, 'animate', polarAnimate);\n\n\n        if (seriesTypes.column) {\n\n            colProto = seriesTypes.column.prototype;\n\n            colProto.polarArc = function(low, high, start, end) {\n                var center = this.xAxis.center,\n                    len = this.yAxis.len;\n\n                return this.chart.renderer.symbols.arc(\n                    center[0],\n                    center[1],\n                    len - high,\n                    null, {\n                        start: start,\n                        end: end,\n                        innerR: len - pick(low, len)\n                    }\n                );\n            };\n\n            /**\n             * Define the animate method for columnseries\n             */\n            wrap(colProto, 'animate', polarAnimate);\n\n\n            /**\n             * Extend the column prototype's translate method\n             */\n            wrap(colProto, 'translate', function(proceed) {\n\n                var xAxis = this.xAxis,\n                    startAngleRad = xAxis.startAngleRad,\n                    start,\n                    points,\n                    point,\n                    i;\n\n                this.preventPostTranslate = true;\n\n                // Run uber method\n                proceed.call(this);\n\n                // Postprocess plot coordinates\n                if (xAxis.isRadial) {\n                    points = this.points;\n                    i = points.length;\n                    while (i--) {\n                        point = points[i];\n                        start = point.barX + startAngleRad;\n                        point.shapeType = 'path';\n                        point.shapeArgs = {\n                            d: this.polarArc(point.yBottom, point.plotY, start, start + point.pointWidth)\n                        };\n                        // Provide correct plotX, plotY for tooltip\n                        this.toXY(point);\n                        point.tooltipPos = [point.plotX, point.plotY];\n                        point.ttBelow = point.plotY > xAxis.center[1];\n                    }\n                }\n            });\n\n\n            /**\n             * Align column data labels outside the columns. #1199.\n             */\n            wrap(colProto, 'alignDataLabel', function(proceed, point, dataLabel, options, alignTo, isNew) {\n\n                if (this.chart.polar) {\n                    var angle = point.rectPlotX / Math.PI * 180,\n                        align,\n                        verticalAlign;\n\n                    // Align nicely outside the perimeter of the columns\n                    if (options.align === null) {\n                        if (angle > 20 && angle < 160) {\n                            align = 'left'; // right hemisphere\n                        } else if (angle > 200 && angle < 340) {\n                            align = 'right'; // left hemisphere\n                        } else {\n                            align = 'center'; // top or bottom\n                        }\n                        options.align = align;\n                    }\n                    if (options.verticalAlign === null) {\n                        if (angle < 45 || angle > 315) {\n                            verticalAlign = 'bottom'; // top part\n                        } else if (angle > 135 && angle < 225) {\n                            verticalAlign = 'top'; // bottom part\n                        } else {\n                            verticalAlign = 'middle'; // left or right\n                        }\n                        options.verticalAlign = verticalAlign;\n                    }\n\n                    seriesProto.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n                } else {\n                    proceed.call(this, point, dataLabel, options, alignTo, isNew);\n                }\n\n            });\n        }\n\n        /**\n         * Extend getCoordinates to prepare for polar axis values\n         */\n        wrap(pointerProto, 'getCoordinates', function(proceed, e) {\n            var chart = this.chart,\n                ret = {\n                    xAxis: [],\n                    yAxis: []\n                };\n\n            if (chart.polar) {\n\n                each(chart.axes, function(axis) {\n                    var isXAxis = axis.isXAxis,\n                        center = axis.center,\n                        x = e.chartX - center[0] - chart.plotLeft,\n                        y = e.chartY - center[1] - chart.plotTop;\n\n                    ret[isXAxis ? 'xAxis' : 'yAxis'].push({\n                        axis: axis,\n                        value: axis.translate(\n                            isXAxis ?\n                            Math.PI - Math.atan2(x, y) : // angle\n                            Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), // distance from center\n                            true\n                        )\n                    });\n                });\n\n            } else {\n                ret = proceed.call(this, e);\n            }\n\n            return ret;\n        });\n\n        wrap(H.Chart.prototype, 'getAxes', function(proceed) {\n\n            if (!this.pane) {\n                this.pane = [];\n            }\n            each(H.splat(this.options.pane), function(paneOptions) {\n                new H.Pane( // eslint-disable-line no-new\n                    paneOptions,\n                    this\n                );\n            }, this);\n\n            proceed.call(this);\n        });\n\n        wrap(H.Chart.prototype, 'drawChartBox', function(proceed) {\n            proceed.call(this);\n\n            each(this.pane, function(pane) {\n                pane.render();\n            });\n        });\n\n        /**\n         * Extend chart.get to also search in panes. Used internally in responsiveness\n         * and chart.update.\n         */\n        wrap(H.Chart.prototype, 'get', function(proceed, id) {\n            return H.find(this.pane, function(pane) {\n                return pane.options.id === id;\n            }) || proceed.call(this, id);\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/highcharts.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2016 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(I,T){\"object\"===typeof module&&module.exports?module.exports=I.document?T(I):T:I.Highcharts=T(I)})(\"undefined\"!==typeof window?window:this,function(I){I=function(){var a=window,x=a.document,C=a.navigator&&a.navigator.userAgent||\"\",E=x&&x.createElementNS&&!!x.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").createSVGRect,D=/(edge|msie|trident)/i.test(C)&&!window.opera,m=!E,g=/Firefox/.test(C),d=g&&4>parseInt(C.split(\"Firefox/\")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:\"Highcharts\",\nversion:\"5.0.12\",deg2rad:2*Math.PI/360,doc:x,hasBidiBug:d,hasTouch:x&&void 0!==x.documentElement.ontouchstart,isMS:D,isWebKit:/AppleWebKit/.test(C),isFirefox:g,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(C),SVG_NS:\"http://www.w3.org/2000/svg\",chartCount:0,seriesTypes:{},symbolSizes:{},svg:E,vml:m,win:a,marginNames:[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"],noop:function(){},charts:[]}}();(function(a){var x=[],C=a.charts,E=a.doc,D=a.win;a.error=function(m,g){m=a.isNumber(m)?\"Highcharts error #\"+\nm+\": www.highcharts.com/errors/\"+m:m;if(g)throw Error(m);D.console&&console.log(m)};a.Fx=function(a,g,d){this.options=g;this.elem=a;this.prop=d};a.Fx.prototype={dSetter:function(){var a=this.paths[0],g=this.paths[1],d=[],r=this.now,l=a.length,n;if(1===r)d=this.toD;else if(l===g.length&&1>r)for(;l--;)n=parseFloat(a[l]),d[l]=isNaN(n)?a[l]:r*parseFloat(g[l]-n)+n;else d=g;this.elem.attr(\"d\",d,null,!0)},update:function(){var a=this.elem,g=this.prop,d=this.now,r=this.options.step;if(this[g+\"Setter\"])this[g+\n\"Setter\"]();else a.attr?a.element&&a.attr(g,d,null,!0):a.style[g]=d+this.unit;r&&r.call(a,d,this)},run:function(a,g,d){var m=this,l=function(a){return l.stopped?!1:m.step(a)},n;this.startTime=+new Date;this.start=a;this.end=g;this.unit=d;this.now=this.start;this.pos=0;l.elem=this.elem;l.prop=this.prop;l()&&1===x.push(l)&&(l.timerId=setInterval(function(){for(n=0;n<x.length;n++)x[n]()||x.splice(n--,1);x.length||clearInterval(l.timerId)},13))},step:function(m){var g=+new Date,d,r=this.options,l=this.elem,\nn=r.complete,k=r.duration,c=r.curAnim;l.attr&&!l.element?m=!1:m||g>=k+this.startTime?(this.now=this.end,this.pos=1,this.update(),d=c[this.prop]=!0,a.objectEach(c,function(a){!0!==a&&(d=!1)}),d&&n&&n.call(l),m=!1):(this.pos=r.easing((g-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),m=!0);return m},initPath:function(m,g,d){function r(a){var e,b;for(u=a.length;u--;)e=\"M\"===a[u]||\"L\"===a[u],b=/[a-zA-Z]/.test(a[u+3]),e&&b&&a.splice(u+1,0,a[u+1],a[u+2],a[u+1],a[u+2])}\nfunction l(a,f){for(;a.length<e;){a[0]=f[e-a.length];var c=a.slice(0,b);[].splice.apply(a,[0,0].concat(c));F&&(c=a.slice(a.length-b),[].splice.apply(a,[a.length,0].concat(c)),u--)}a[0]=\"M\"}function n(a,c){for(var k=(e-a.length)/b;0<k&&k--;)p=a.slice().splice(a.length/L-b,b*L),p[0]=c[e-b-k*b],f&&(p[b-6]=p[b-2],p[b-5]=p[b-1]),[].splice.apply(a,[a.length/L,0].concat(p)),F&&k--}g=g||\"\";var k,c=m.startX,v=m.endX,f=-1<g.indexOf(\"C\"),b=f?7:3,e,p,u;g=g.split(\" \");d=d.slice();var F=m.isArea,L=F?2:1,B;f&&(r(g),\nr(d));if(c&&v){for(u=0;u<c.length;u++)if(c[u]===v[0]){k=u;break}else if(c[0]===v[v.length-c.length+u]){k=u;B=!0;break}void 0===k&&(g=[])}g.length&&a.isNumber(k)&&(e=d.length+k*L*b,B?(l(g,d),n(d,g)):(l(d,g),n(g,d)));return[g,d]}};a.Fx.prototype.fillSetter=a.Fx.prototype.strokeSetter=function(){this.elem.attr(this.prop,a.color(this.start).tweenTo(a.color(this.end),this.pos),null,!0)};a.extend=function(a,g){var d;a||(a={});for(d in g)a[d]=g[d];return a};a.merge=function(){var m,g=arguments,d,r={},l=\nfunction(d,k){\"object\"!==typeof d&&(d={});a.objectEach(k,function(c,g){!a.isObject(c,!0)||a.isClass(c)||a.isDOMElement(c)?d[g]=k[g]:d[g]=l(d[g]||{},c)});return d};!0===g[0]&&(r=g[1],g=Array.prototype.slice.call(g,2));d=g.length;for(m=0;m<d;m++)r=l(r,g[m]);return r};a.pInt=function(a,g){return parseInt(a,g||10)};a.isString=function(a){return\"string\"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return\"[object Array]\"===a||\"[object Array Iterator]\"===a};a.isObject=function(m,\ng){return!!m&&\"object\"===typeof m&&(!g||!a.isArray(m))};a.isDOMElement=function(m){return a.isObject(m)&&\"number\"===typeof m.nodeType};a.isClass=function(m){var g=m&&m.constructor;return!(!a.isObject(m,!0)||a.isDOMElement(m)||!g||!g.name||\"Object\"===g.name)};a.isNumber=function(a){return\"number\"===typeof a&&!isNaN(a)};a.erase=function(a,g){for(var d=a.length;d--;)if(a[d]===g){a.splice(d,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(m,g,d){var r;a.isString(g)?a.defined(d)?\nm.setAttribute(g,d):m&&m.getAttribute&&(r=m.getAttribute(g)):a.defined(g)&&a.isObject(g)&&a.objectEach(g,function(a,d){m.setAttribute(d,a)});return r};a.splat=function(m){return a.isArray(m)?m:[m]};a.syncTimeout=function(a,g,d){if(g)return setTimeout(a,g,d);a.call(0,d)};a.pick=function(){var a=arguments,g,d,r=a.length;for(g=0;g<r;g++)if(d=a[g],void 0!==d&&null!==d)return d};a.css=function(m,g){a.isMS&&!a.svg&&g&&void 0!==g.opacity&&(g.filter=\"alpha(opacity\\x3d\"+100*g.opacity+\")\");a.extend(m.style,\ng)};a.createElement=function(m,g,d,r,l){m=E.createElement(m);var n=a.css;g&&a.extend(m,g);l&&n(m,{padding:0,border:\"none\",margin:0});d&&n(m,d);r&&r.appendChild(m);return m};a.extendClass=function(m,g){var d=function(){};d.prototype=new m;a.extend(d.prototype,g);return d};a.pad=function(a,g,d){return Array((g||2)+1-String(a).length).join(d||0)+a};a.relativeLength=function(a,g){return/%$/.test(a)?g*parseFloat(a)/100:parseFloat(a)};a.wrap=function(a,g,d){var m=a[g];a[g]=function(){var a=Array.prototype.slice.call(arguments),\ng=arguments,k=this;k.proceed=function(){m.apply(k,arguments.length?arguments:g)};a.unshift(m);a=d.apply(this,a);k.proceed=null;return a}};a.getTZOffset=function(m){var g=a.Date;return 6E4*(g.hcGetTimezoneOffset&&g.hcGetTimezoneOffset(m)||g.hcTimezoneOffset||0)};a.dateFormat=function(m,g,d){if(!a.defined(g)||isNaN(g))return a.defaultOptions.lang.invalidDate||\"\";m=a.pick(m,\"%Y-%m-%d %H:%M:%S\");var r=a.Date,l=new r(g-a.getTZOffset(g)),n=l[r.hcGetHours](),k=l[r.hcGetDay](),c=l[r.hcGetDate](),v=l[r.hcGetMonth](),\nf=l[r.hcGetFullYear](),b=a.defaultOptions.lang,e=b.weekdays,p=b.shortWeekdays,u=a.pad,r=a.extend({a:p?p[k]:e[k].substr(0,3),A:e[k],d:u(c),e:u(c,2,\" \"),w:k,b:b.shortMonths[v],B:b.months[v],m:u(v+1),y:f.toString().substr(2,2),Y:f,H:u(n),k:n,I:u(n%12||12),l:n%12||12,M:u(l[r.hcGetMinutes]()),p:12>n?\"AM\":\"PM\",P:12>n?\"am\":\"pm\",S:u(l.getSeconds()),L:u(Math.round(g%1E3),3)},a.dateFormats);a.objectEach(r,function(a,e){for(;-1!==m.indexOf(\"%\"+e);)m=m.replace(\"%\"+e,\"function\"===typeof a?a(g):a)});return d?m.substr(0,\n1).toUpperCase()+m.substr(1):m};a.formatSingle=function(m,g){var d=/\\.([0-9])/,r=a.defaultOptions.lang;/f$/.test(m)?(d=(d=m.match(d))?d[1]:-1,null!==g&&(g=a.numberFormat(g,d,r.decimalPoint,-1<m.indexOf(\",\")?r.thousandsSep:\"\"))):g=a.dateFormat(m,g);return g};a.format=function(m,g){for(var d=\"{\",r=!1,l,n,k,c,v=[],f;m;){d=m.indexOf(d);if(-1===d)break;l=m.slice(0,d);if(r){l=l.split(\":\");n=l.shift().split(\".\");c=n.length;f=g;for(k=0;k<c;k++)f=f[n[k]];l.length&&(f=a.formatSingle(l.join(\":\"),f));v.push(f)}else v.push(l);\nm=m.slice(d+1);d=(r=!r)?\"}\":\"{\"}v.push(m);return v.join(\"\")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(m,g,d,r,l){var n,k=m;d=a.pick(d,1);n=m/d;g||(g=l?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===r&&(1===d?g=a.grep(g,function(a){return 0===a%1}):.1>=d&&(g=[1/d])));for(r=0;r<g.length&&!(k=g[r],l&&k*d>=m||!l&&n<=(g[r]+(g[r+1]||g[r]))/2);r++);return k=a.correctFloat(k*d,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=\nfunction(a,g){var d=a.length,m,l;for(l=0;l<d;l++)a[l].safeI=l;a.sort(function(a,d){m=g(a,d);return 0===m?a.safeI-d.safeI:m});for(l=0;l<d;l++)delete a[l].safeI};a.arrayMin=function(a){for(var g=a.length,d=a[0];g--;)a[g]<d&&(d=a[g]);return d};a.arrayMax=function(a){for(var g=a.length,d=a[0];g--;)a[g]>d&&(d=a[g]);return d};a.destroyObjectProperties=function(m,g){a.objectEach(m,function(a,r){a&&a!==g&&a.destroy&&a.destroy();delete m[r]})};a.discardElement=function(m){var g=a.garbageBin;g||(g=a.createElement(\"div\"));\nm&&g.appendChild(m);g.innerHTML=\"\"};a.correctFloat=function(a,g){return parseFloat(a.toPrecision(g||14))};a.setAnimation=function(m,g){g.renderer.globalAnimation=a.pick(m,g.options.chart.animation,!0)};a.animObject=function(m){return a.isObject(m)?a.merge(m):{duration:m?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(m,g,d,r){m=+m||0;g=+g;var l=a.defaultOptions.lang,n=(m.toString().split(\".\")[1]||\"\").length,\nk,c;-1===g?g=Math.min(n,20):a.isNumber(g)||(g=2);c=(Math.abs(m)+Math.pow(10,-Math.max(g,n)-1)).toFixed(g);n=String(a.pInt(c));k=3<n.length?n.length%3:0;d=a.pick(d,l.decimalPoint);r=a.pick(r,l.thousandsSep);m=(0>m?\"-\":\"\")+(k?n.substr(0,k)+r:\"\");m+=n.substr(k).replace(/(\\d{3})(?=\\d)/g,\"$1\"+r);g&&(m+=d+c.slice(-g));return m};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(m,g,d){if(\"width\"===g)return Math.min(m.offsetWidth,m.scrollWidth)-a.getStyle(m,\"padding-left\")-\na.getStyle(m,\"padding-right\");if(\"height\"===g)return Math.min(m.offsetHeight,m.scrollHeight)-a.getStyle(m,\"padding-top\")-a.getStyle(m,\"padding-bottom\");if(m=D.getComputedStyle(m,void 0))m=m.getPropertyValue(g),a.pick(d,!0)&&(m=a.pInt(m));return m};a.inArray=function(a,g){return g.indexOf?g.indexOf(a):[].indexOf.call(g,a)};a.grep=function(a,g){return[].filter.call(a,g)};a.find=function(a,g){return[].find.call(a,g)};a.map=function(a,g){for(var d=[],r=0,l=a.length;r<l;r++)d[r]=g.call(a[r],a[r],r,a);\nreturn d};a.offset=function(a){var g=E.documentElement;a=a.getBoundingClientRect();return{top:a.top+(D.pageYOffset||g.scrollTop)-(g.clientTop||0),left:a.left+(D.pageXOffset||g.scrollLeft)-(g.clientLeft||0)}};a.stop=function(a,g){for(var d=x.length;d--;)x[d].elem!==a||g&&g!==x[d].prop||(x[d].stopped=!0)};a.each=function(a,g,d){return Array.prototype.forEach.call(a,g,d)};a.objectEach=function(a,g,d){for(var r in a)a.hasOwnProperty(r)&&g.call(d,a[r],r,a)};a.addEvent=function(m,g,d){function r(a){a.target=\na.srcElement||D;d.call(m,a)}var l=m.hcEvents=m.hcEvents||{};m.addEventListener?m.addEventListener(g,d,!1):m.attachEvent&&(m.hcEventsIE||(m.hcEventsIE={}),m.hcEventsIE[d.toString()]=r,m.attachEvent(\"on\"+g,r));l[g]||(l[g]=[]);l[g].push(d);return function(){a.removeEvent(m,g,d)}};a.removeEvent=function(m,g,d){function r(a,f){m.removeEventListener?m.removeEventListener(a,f,!1):m.attachEvent&&(f=m.hcEventsIE[f.toString()],m.detachEvent(\"on\"+a,f))}function l(){var c,f;m.nodeName&&(g?(c={},c[g]=!0):c=k,\na.objectEach(c,function(a,e){if(k[e])for(f=k[e].length;f--;)r(e,k[e][f])}))}var n,k=m.hcEvents,c;k&&(g?(n=k[g]||[],d?(c=a.inArray(d,n),-1<c&&(n.splice(c,1),k[g]=n),r(g,d)):(l(),k[g]=[])):(l(),m.hcEvents={}))};a.fireEvent=function(m,g,d,r){var l;l=m.hcEvents;var n,k;d=d||{};if(E.createEvent&&(m.dispatchEvent||m.fireEvent))l=E.createEvent(\"Events\"),l.initEvent(g,!0,!0),a.extend(l,d),m.dispatchEvent?m.dispatchEvent(l):m.fireEvent(g,l);else if(l)for(l=l[g]||[],n=l.length,d.target||a.extend(d,{preventDefault:function(){d.defaultPrevented=\n!0},target:m,type:g}),g=0;g<n;g++)(k=l[g])&&!1===k.call(m,d)&&d.preventDefault();r&&!d.defaultPrevented&&r(d)};a.animate=function(m,g,d){var r,l=\"\",n,k,c;a.isObject(d)||(c=arguments,d={duration:c[2],easing:c[3],complete:c[4]});a.isNumber(d.duration)||(d.duration=400);d.easing=\"function\"===typeof d.easing?d.easing:Math[d.easing]||Math.easeInOutSine;d.curAnim=a.merge(g);a.objectEach(g,function(c,f){a.stop(m,f);k=new a.Fx(m,d,f);n=null;\"d\"===f?(k.paths=k.initPath(m,m.d,g.d),k.toD=g.d,r=0,n=1):m.attr?\nr=m.attr(f):(r=parseFloat(a.getStyle(m,f))||0,\"opacity\"!==f&&(l=\"px\"));n||(n=c);n&&n.match&&n.match(\"px\")&&(n=n.replace(/px/g,\"\"));k.run(r,n,l)})};a.seriesType=function(m,g,d,r,l){var n=a.getOptions(),k=a.seriesTypes;if(k[m])return a.error(27);n.plotOptions[m]=a.merge(n.plotOptions[g],d);k[m]=a.extendClass(k[g]||function(){},r);k[m].prototype.type=m;l&&(k[m].prototype.pointClass=a.extendClass(a.Point,l));return k[m]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),g=0;return function(){return\"highcharts-\"+\na+\"-\"+g++}}();D.jQuery&&(D.jQuery.fn.highcharts=function(){var m=[].slice.call(arguments);if(this[0])return m[0]?(new (a[a.isString(m[0])?m.shift():\"Chart\"])(this[0],m[0],m[1]),this):C[a.attr(this[0],\"data-highcharts-chart\")]});E&&!E.defaultView&&(a.getStyle=function(m,g){var d={width:\"clientWidth\",height:\"clientHeight\"}[g];if(m.style[g])return a.pInt(m.style[g]);\"opacity\"===g&&(g=\"filter\");if(d)return m.style.zoom=1,Math.max(m[d]-2*a.getStyle(m,\"padding\"),0);m=m.currentStyle[g.replace(/\\-(\\w)/g,\nfunction(a,d){return d.toUpperCase()})];\"filter\"===g&&(m=m.replace(/alpha\\(opacity=([0-9]+)\\)/,function(a,d){return d/100}));return\"\"===m?1:a.pInt(m)});Array.prototype.forEach||(a.each=function(a,g,d){for(var r=0,l=a.length;r<l;r++)if(!1===g.call(d,a[r],r,a))return r});Array.prototype.indexOf||(a.inArray=function(a,g){var d,r=0;if(g)for(d=g.length;r<d;r++)if(g[r]===a)return r;return-1});Array.prototype.filter||(a.grep=function(a,g){for(var d=[],r=0,l=a.length;r<l;r++)g(a[r],r)&&d.push(a[r]);return d});\nArray.prototype.find||(a.find=function(a,g){var d,r=a.length;for(d=0;d<r;d++)if(g(a[d],d))return a[d]})})(I);(function(a){var x=a.each,C=a.isNumber,E=a.map,D=a.merge,m=a.pInt;a.Color=function(g){if(!(this instanceof a.Color))return new a.Color(g);this.init(g)};a.Color.prototype={parsers:[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(a){return[m(a[1]),m(a[2]),m(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\nparse:function(a){return[m(a[1]),m(a[2]),m(a[3]),1]}}],names:{none:\"rgba(255,255,255,0)\",white:\"#ffffff\",black:\"#000000\"},init:function(g){var d,r,l,n;if((this.input=g=this.names[g&&g.toLowerCase?g.toLowerCase():\"\"]||g)&&g.stops)this.stops=E(g.stops,function(d){return new a.Color(d[1])});else if(g&&\"#\"===g[0]&&(d=g.length,g=parseInt(g.substr(1),16),7===d?r=[(g&16711680)>>16,(g&65280)>>8,g&255,1]:4===d&&(r=[(g&3840)>>4|(g&3840)>>8,(g&240)>>4|g&240,(g&15)<<4|g&15,1])),!r)for(l=this.parsers.length;l--&&\n!r;)n=this.parsers[l],(d=n.regex.exec(g))&&(r=n.parse(d));this.rgba=r||[]},get:function(a){var d=this.input,g=this.rgba,l;this.stops?(l=D(d),l.stops=[].concat(l.stops),x(this.stops,function(d,k){l.stops[k]=[l.stops[k][0],d.get(a)]})):l=g&&C(g[0])?\"rgb\"===a||!a&&1===g[3]?\"rgb(\"+g[0]+\",\"+g[1]+\",\"+g[2]+\")\":\"a\"===a?g[3]:\"rgba(\"+g.join(\",\")+\")\":d;return l},brighten:function(a){var d,g=this.rgba;if(this.stops)x(this.stops,function(d){d.brighten(a)});else if(C(a)&&0!==a)for(d=0;3>d;d++)g[d]+=m(255*a),0>\ng[d]&&(g[d]=0),255<g[d]&&(g[d]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this},tweenTo:function(a,d){var g,l;a.rgba.length?(g=this.rgba,a=a.rgba,l=1!==a[3]||1!==g[3],a=(l?\"rgba(\":\"rgb(\")+Math.round(a[0]+(g[0]-a[0])*(1-d))+\",\"+Math.round(a[1]+(g[1]-a[1])*(1-d))+\",\"+Math.round(a[2]+(g[2]-a[2])*(1-d))+(l?\",\"+(a[3]+(g[3]-a[3])*(1-d)):\"\")+\")\"):a=a.input||\"none\";return a}};a.color=function(g){return new a.Color(g)}})(I);(function(a){var x,C,E=a.addEvent,D=a.animate,m=a.attr,g=a.charts,\nd=a.color,r=a.css,l=a.createElement,n=a.defined,k=a.deg2rad,c=a.destroyObjectProperties,v=a.doc,f=a.each,b=a.extend,e=a.erase,p=a.grep,u=a.hasTouch,F=a.inArray,L=a.isArray,B=a.isFirefox,H=a.isMS,t=a.isObject,G=a.isString,z=a.isWebKit,A=a.merge,w=a.noop,J=a.objectEach,h=a.pick,q=a.pInt,Q=a.removeEvent,K=a.splat,N=a.stop,M=a.svg,P=a.SVG_NS,R=a.symbolSizes,O=a.win;x=a.SVGElement=function(){return this};b(x.prototype,{opacity:1,SVG_NS:P,textProps:\"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline\".split(\" \"),\ninit:function(a,h){this.element=\"span\"===h?l(h):v.createElementNS(this.SVG_NS,h);this.renderer=a},animate:function(y,q,e){q=a.animObject(h(q,this.renderer.globalAnimation,!0));0!==q.duration?(e&&(q.complete=e),D(this,y,q)):(this.attr(y,null,e),q.step&&q.step.call(this));return this},colorGradient:function(y,h,q){var e=this.renderer,b,c,d,p,k,u,g,z,w,S,t=[],K;y.radialGradient?c=\"radialGradient\":y.linearGradient&&(c=\"linearGradient\");c&&(d=y[c],k=e.gradients,g=y.stops,S=q.radialReference,L(d)&&(y[c]=\nd={x1:d[0],y1:d[1],x2:d[2],y2:d[3],gradientUnits:\"userSpaceOnUse\"}),\"radialGradient\"===c&&S&&!n(d.gradientUnits)&&(p=d,d=A(d,e.getRadialAttr(S,p),{gradientUnits:\"userSpaceOnUse\"})),J(d,function(a,y){\"id\"!==y&&t.push(y,a)}),J(g,function(a){t.push(a)}),t=t.join(\",\"),k[t]?S=k[t].attr(\"id\"):(d.id=S=a.uniqueKey(),k[t]=u=e.createElement(c).attr(d).add(e.defs),u.radAttr=p,u.stops=[],f(g,function(y){0===y[1].indexOf(\"rgba\")?(b=a.color(y[1]),z=b.get(\"rgb\"),w=b.get(\"a\")):(z=y[1],w=1);y=e.createElement(\"stop\").attr({offset:y[0],\n\"stop-color\":z,\"stop-opacity\":w}).add(u);u.stops.push(y)})),K=\"url(\"+e.url+\"#\"+S+\")\",q.setAttribute(h,K),q.gradient=t,y.toString=function(){return K})},applyTextOutline:function(y){var h=this.element,q,b,c,d,p;-1!==y.indexOf(\"contrast\")&&(y=y.replace(/contrast/g,this.renderer.getContrast(h.style.fill)));y=y.split(\" \");b=y[y.length-1];if((c=y[0])&&\"none\"!==c&&a.svg){this.fakeTS=!0;y=[].slice.call(h.getElementsByTagName(\"tspan\"));this.ySetter=this.xSetter;c=c.replace(/(^[\\d\\.]+)(.*?)$/g,function(a,\ny,h){return 2*y+h});for(p=y.length;p--;)q=y[p],\"highcharts-text-outline\"===q.getAttribute(\"class\")&&e(y,h.removeChild(q));d=h.firstChild;f(y,function(a,y){0===y&&(a.setAttribute(\"x\",h.getAttribute(\"x\")),y=h.getAttribute(\"y\"),a.setAttribute(\"y\",y||0),null===y&&h.setAttribute(\"y\",0));a=a.cloneNode(1);m(a,{\"class\":\"highcharts-text-outline\",fill:b,stroke:b,\"stroke-width\":c,\"stroke-linejoin\":\"round\"});h.insertBefore(a,d)})}},attr:function(a,h,q,e){var y,b=this.element,f,c=this,d,p;\"string\"===typeof a&&\nvoid 0!==h&&(y=a,a={},a[y]=h);\"string\"===typeof a?c=(this[a+\"Getter\"]||this._defaultGetter).call(this,a,b):(J(a,function(y,h){d=!1;e||N(this,h);this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(h)&&(f||(this.symbolAttr(a),f=!0),d=!0);!this.rotation||\"x\"!==h&&\"y\"!==h||(this.doTransform=!0);d||(p=this[h+\"Setter\"]||this._defaultSetter,p.call(this,y,h,b))},this),this.afterSetters());q&&q();return c},afterSetters:function(){this.doTransform&&(this.updateTransform(),this.doTransform=\n!1)},addClass:function(a,h){var y=this.attr(\"class\")||\"\";-1===y.indexOf(a)&&(h||(a=(y+(y?\" \":\"\")+a).replace(\"  \",\" \")),this.attr(\"class\",a));return this},hasClass:function(a){return-1!==m(this.element,\"class\").indexOf(a)},removeClass:function(a){m(this.element,\"class\",(m(this.element,\"class\")||\"\").replace(a,\"\"));return this},symbolAttr:function(a){var y=this;f(\"x y r start end width height innerR anchorX anchorY\".split(\" \"),function(q){y[q]=h(a[q],y[q])});y.attr({d:y.renderer.symbols[y.symbolName](y.x,\ny.y,y.width,y.height,y)})},clip:function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")},crisp:function(a,h){var y=this,q={},e;h=h||a.strokeWidth||0;e=Math.round(h)%2/2;a.x=Math.floor(a.x||y.x||0)+e;a.y=Math.floor(a.y||y.y||0)+e;a.width=Math.floor((a.width||y.width||0)-2*e);a.height=Math.floor((a.height||y.height||0)-2*e);n(a.strokeWidth)&&(a.strokeWidth=h);J(a,function(a,h){y[h]!==a&&(y[h]=q[h]=a)});return q},css:function(a){var h=this.styles,y={},e=this.element,\nf,c=\"\",d,p=!h,k=[\"textOutline\",\"textOverflow\",\"width\"];a&&a.color&&(a.fill=a.color);h&&J(a,function(a,q){a!==h[q]&&(y[q]=a,p=!0)});p&&(h&&(a=b(h,y)),f=this.textWidth=a&&a.width&&\"auto\"!==a.width&&\"text\"===e.nodeName.toLowerCase()&&q(a.width),this.styles=a,f&&!M&&this.renderer.forExport&&delete a.width,H&&!M?r(this.element,a):(d=function(a,h){return\"-\"+h.toLowerCase()},J(a,function(a,h){-1===F(h,k)&&(c+=h.replace(/([A-Z])/g,d)+\":\"+a+\";\")}),c&&m(e,\"style\",c)),this.added&&(\"text\"===this.element.nodeName&&\nthis.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline)));return this},getStyle:function(a){return O.getComputedStyle(this.element||this,\"\").getPropertyValue(a)},strokeWidth:function(){var a=this.getStyle(\"stroke-width\"),h;a.indexOf(\"px\")===a.length-2?a=q(a):(h=v.createElementNS(P,\"rect\"),m(h,{width:a,\"stroke-width\":0}),this.element.parentNode.appendChild(h),a=h.getBBox().width,h.parentNode.removeChild(h));return a},on:function(a,h){var y=this,q=y.element;u&&\"click\"===\na?(q.ontouchstart=function(a){y.touchEventFired=Date.now();a.preventDefault();h.call(q,a)},q.onclick=function(a){(-1===O.navigator.userAgent.indexOf(\"Android\")||1100<Date.now()-(y.touchEventFired||0))&&h.call(q,a)}):q[\"on\"+a]=h;return this},setRadialReference:function(a){var h=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;h&&h.radAttr&&h.animate(this.renderer.getRadialAttr(a,h.radAttr));return this},translate:function(a,h){return this.attr({translateX:a,translateY:h})},\ninvert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,q=this.translateY||0,e=this.scaleX,b=this.scaleY,f=this.inverted,c=this.rotation,d=this.element;f&&(a+=this.width,q+=this.height);a=[\"translate(\"+a+\",\"+q+\")\"];f?a.push(\"rotate(90) scale(-1,1)\"):c&&a.push(\"rotate(\"+c+\" \"+(d.getAttribute(\"x\")||0)+\" \"+(d.getAttribute(\"y\")||0)+\")\");(n(e)||n(b))&&a.push(\"scale(\"+h(e,1)+\" \"+h(b,1)+\")\");a.length&&d.setAttribute(\"transform\",a.join(\" \"))},\ntoFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,q,b){var y,f,c,d,p={};f=this.renderer;c=f.alignedObjects;var k,u;if(a){if(this.alignOptions=a,this.alignByTranslate=q,!b||G(b))this.alignTo=y=b||\"renderer\",e(c,this),c.push(this),b=null}else a=this.alignOptions,q=this.alignByTranslate,y=this.alignTo;b=h(b,f[y],f);y=a.align;f=a.verticalAlign;c=(b.x||0)+(a.x||0);d=(b.y||0)+(a.y||0);\"right\"===y?k=1:\"center\"===y&&(k=2);k&&(c+=(b.width-(a.width||0))/k);p[q?\n\"translateX\":\"x\"]=Math.round(c);\"bottom\"===f?u=1:\"middle\"===f&&(u=2);u&&(d+=(b.height-(a.height||0))/u);p[q?\"translateY\":\"y\"]=Math.round(d);this[this.placed?\"animate\":\"attr\"](p);this.placed=!0;this.alignAttr=p;return this},getBBox:function(a,q){var y,e=this.renderer,c,d=this.element,p=this.styles,u,g=this.textStr,z,w=e.cache,A=e.cacheKeys,t;q=h(q,this.rotation);c=q*k;u=d&&x.prototype.getStyle.call(d,\"font-size\");void 0!==g&&(t=g.toString(),-1===t.indexOf(\"\\x3c\")&&(t=t.replace(/[0-9]/g,\"0\")),t+=[\"\",\nq||0,u,p&&p.width,p&&p.textOverflow].join());t&&!a&&(y=w[t]);if(!y){if(d.namespaceURI===this.SVG_NS||e.forExport){try{(z=this.fakeTS&&function(a){f(d.querySelectorAll(\".highcharts-text-outline\"),function(h){h.style.display=a})})&&z(\"none\"),y=d.getBBox?b({},d.getBBox()):{width:d.offsetWidth,height:d.offsetHeight},z&&z(\"\")}catch(V){}if(!y||0>y.width)y={width:0,height:0}}else y=this.htmlGetBBox();e.isSVG&&(a=y.width,e=y.height,p&&\"11px\"===p.fontSize&&17===Math.round(e)&&(y.height=e=14),q&&(y.width=Math.abs(e*\nMath.sin(c))+Math.abs(a*Math.cos(c)),y.height=Math.abs(e*Math.cos(c))+Math.abs(a*Math.sin(c))));if(t&&0<y.height){for(;250<A.length;)delete w[A.shift()];w[t]||A.push(t);w[t]=y}}return y},show:function(a){return this.attr({visibility:a?\"inherit\":\"visible\"})},hide:function(){return this.attr({visibility:\"hidden\"})},fadeOut:function(a){var h=this;h.animate({opacity:0},{duration:a||150,complete:function(){h.attr({y:-9999})}})},add:function(a){var h=this.renderer,q=this.element,y;a&&(this.parentGroup=\na);this.parentInverted=a&&a.inverted;void 0!==this.textStr&&h.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)y=this.zIndexSetter();y||(a?a.element:h.box).appendChild(q);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var h=a.parentNode;h&&h.removeChild(a)},destroy:function(){var a=this,h=a.element||{},q=a.renderer.isSVG&&\"SPAN\"===h.nodeName&&a.parentGroup,b=h.ownerSVGElement;h.onclick=h.onmouseout=h.onmouseover=h.onmousemove=h.point=null;N(a);a.clipPath&&b&&(f(b.querySelectorAll(\"[clip-path]\"),\nfunction(h){-1<h.getAttribute(\"clip-path\").indexOf(a.clipPath.element.id+\")\")&&h.removeAttribute(\"clip-path\")}),a.clipPath=a.clipPath.destroy());if(a.stops){for(b=0;b<a.stops.length;b++)a.stops[b]=a.stops[b].destroy();a.stops=null}for(a.safeRemoveChild(h);q&&q.div&&0===q.div.childNodes.length;)h=q.parentGroup,a.safeRemoveChild(q.div),delete q.div,q=h;a.alignTo&&e(a.renderer.alignedObjects,a);J(a,function(h,q){delete a[q]});return null},xGetter:function(a){\"circle\"===this.element.nodeName&&(\"x\"===\na?a=\"cx\":\"y\"===a&&(a=\"cy\"));return this._defaultGetter(a)},_defaultGetter:function(a){a=h(this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,h,q){a&&a.join&&(a=a.join(\" \"));/(NaN| {2}|^$)/.test(a)&&(a=\"M 0 0\");q.setAttribute(h,a);this[h]=a},alignSetter:function(a){this.element.setAttribute(\"text-anchor\",{left:\"start\",center:\"middle\",right:\"end\"}[a])},opacitySetter:function(a,h,q){this[h]=a;q.setAttribute(h,a)},titleSetter:function(a){var q=\nthis.element.getElementsByTagName(\"title\")[0];q||(q=v.createElementNS(this.SVG_NS,\"title\"),this.element.appendChild(q));q.firstChild&&q.removeChild(q.firstChild);q.appendChild(v.createTextNode(String(h(a),\"\").replace(/<[^>]*>/g,\"\")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,h,q){\"string\"===typeof a?q.setAttribute(h,a):a&&this.colorGradient(a,h,q)},visibilitySetter:function(a,h,q){\"inherit\"===a?q.removeAttribute(h):\nq.setAttribute(h,a)},zIndexSetter:function(a,h){var e=this.renderer,b=this.parentGroup,y=(b||e).element||e.box,f,c=this.element,d;f=this.added;var p;n(a)&&(c.zIndex=a,a=+a,this[h]===a&&(f=!1),this[h]=a);if(f){(a=this.zIndex)&&b&&(b.handleZ=!0);h=y.childNodes;for(p=0;p<h.length&&!d;p++)b=h[p],f=b.zIndex,b!==c&&(q(f)>a||!n(a)&&n(f)||0>a&&!n(f)&&y!==e.box)&&(y.insertBefore(c,b),d=!0);d||y.appendChild(c)}return d},_defaultSetter:function(a,h,q){q.setAttribute(h,a)}});x.prototype.yGetter=x.prototype.xGetter;\nx.prototype.translateXSetter=x.prototype.translateYSetter=x.prototype.rotationSetter=x.prototype.verticalAlignSetter=x.prototype.scaleXSetter=x.prototype.scaleYSetter=function(a,h){this[h]=a;this.doTransform=!0};C=a.SVGRenderer=function(){this.init.apply(this,arguments)};b(C.prototype,{Element:x,SVG_NS:P,init:function(a,h,q,e,b,f){var y;e=this.createElement(\"svg\").attr({version:\"1.1\",\"class\":\"highcharts-root\"});y=e.element;a.appendChild(y);-1===a.innerHTML.indexOf(\"xmlns\")&&m(y,\"xmlns\",this.SVG_NS);\nthis.isSVG=!0;this.box=y;this.boxWrapper=e;this.alignedObjects=[];this.url=(B||z)&&v.getElementsByTagName(\"base\").length?O.location.href.replace(/#.*?$/,\"\").replace(/<[^>]*>/g,\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(v.createTextNode(\"Created with Highcharts 5.0.12\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=f;this.forExport=b;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(h,q,!1);\nvar c;B&&a.getBoundingClientRect&&(h=function(){r(a,{left:0,top:0});c=a.getBoundingClientRect();r(a,{left:Math.ceil(c.left)-c.left+\"px\",top:Math.ceil(c.top)-c.top+\"px\"})},h(),this.unSubPixelFix=E(O,\"resize\",h))},definition:function(a){function h(a,e){var b;f(K(a),function(a){var y=q.createElement(a.tagName),f={};J(a,function(a,h){\"tagName\"!==h&&\"children\"!==h&&\"textContent\"!==h&&(f[h]=a)});y.attr(f);y.add(e||q.defs);a.textContent&&y.element.appendChild(v.createTextNode(a.textContent));h(a.children||\n[],y);b=y});return b}var q=this;return h(a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();c(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var h=new this.Element;h.init(this,a);return h},draw:w,getRadialAttr:function(a,h){return{cx:a[0]-a[2]/2+h.cx*a[2],cy:a[1]-a[2]/2+h.cy*a[2],\nr:h.r*a[2]}},getSpanWidth:function(a,h){var q=a.getBBox(!0).width;!M&&this.forExport&&(q=this.measureSpanWidth(h.firstChild.data,a.styles));return q},applyEllipsis:function(a,h,q,e){var b=this.getSpanWidth(a,h),f=b>e,b=q,y,c=0,d=q.length,p=function(a){h.removeChild(h.firstChild);a&&h.appendChild(v.createTextNode(a))};if(f){for(;c<=d;)y=Math.ceil((c+d)/2),b=q.substring(0,y)+\"\\u2026\",p(b),b=this.getSpanWidth(a,h),c===d?c=d+1:b>e?d=y-1:c=y;0===d&&p(\"\")}return f},buildText:function(a){var e=a.element,\nb=this,c=b.forExport,y=h(a.textStr,\"\").toString(),d=-1!==y.indexOf(\"\\x3c\"),k=e.childNodes,u,g,z,w,t=m(e,\"x\"),A=a.styles,n=a.textWidth,K=A&&A.lineHeight,B=A&&A.textOutline,Q=A&&\"ellipsis\"===A.textOverflow,l=A&&\"nowrap\"===A.whiteSpace,H,F=k.length,G=n&&!a.added&&this.box,N=function(a){return K?q(K):b.fontMetrics(void 0,a.getAttribute(\"style\")?a:e).h},A=[y,Q,l,K,B,A&&A.fontSize,n].join();if(A!==a.textCache){for(a.textCache=A;F--;)e.removeChild(k[F]);d||B||Q||n||-1!==y.indexOf(\" \")?(u=/<.*class=\"([^\"]+)\".*>/,\ng=/<.*style=\"([^\"]+)\".*>/,z=/<.*href=\"([^\"]+)\".*>/,G&&G.appendChild(e),y=d?y.replace(/<(b|strong)>/g,'\\x3cspan class\\x3d\"highcharts-strong\"\\x3e').replace(/<(i|em)>/g,'\\x3cspan class\\x3d\"highcharts-emphasized\"\\x3e').replace(/<a/g,\"\\x3cspan\").replace(/<\\/(b|strong|i|em|a)>/g,\"\\x3c/span\\x3e\").split(/<br.*?>/g):[y],y=p(y,function(a){return\"\"!==a}),f(y,function(h,q){var y,d=0;h=h.replace(/^\\s+|\\s+$/g,\"\").replace(/<span/g,\"|||\\x3cspan\").replace(/<\\/span>/g,\"\\x3c/span\\x3e|||\");y=h.split(\"|||\");f(y,function(h){if(\"\"!==\nh||1===y.length){var f={},p=v.createElementNS(b.SVG_NS,\"tspan\"),k,A;u.test(h)&&(k=h.match(u)[1],m(p,\"class\",k));g.test(h)&&(A=h.match(g)[1].replace(/(;| |^)color([ :])/,\"$1fill$2\"),m(p,\"style\",A));z.test(h)&&!c&&(m(p,\"onclick\",'location.href\\x3d\"'+h.match(z)[1]+'\"'),r(p,{cursor:\"pointer\"}));h=(h.replace(/<(.|\\n)*?>/g,\"\")||\" \").replace(/&lt;/g,\"\\x3c\").replace(/&gt;/g,\"\\x3e\");if(\" \"!==h){p.appendChild(v.createTextNode(h));d?f.dx=0:q&&null!==t&&(f.x=t);m(p,f);e.appendChild(p);!d&&H&&(!M&&c&&r(p,{display:\"block\"}),\nm(p,\"dy\",N(p)));if(n){f=h.replace(/([^\\^])-/g,\"$1- \").split(\" \");k=1<y.length||q||1<f.length&&!l;var K=[],B,F=N(p),G=a.rotation;for(Q&&(w=b.applyEllipsis(a,p,h,n));!Q&&k&&(f.length||K.length);)a.rotation=0,B=b.getSpanWidth(a,p),h=B>n,void 0===w&&(w=h),h&&1!==f.length?(p.removeChild(p.firstChild),K.unshift(f.pop())):(f=K,K=[],f.length&&!l&&(p=v.createElementNS(P,\"tspan\"),m(p,{dy:F,x:t}),A&&m(p,\"style\",A),e.appendChild(p)),B>n&&(n=B)),f.length&&p.appendChild(v.createTextNode(f.join(\" \").replace(/- /g,\n\"-\")));a.rotation=G}d++}}});H=H||e.childNodes.length}),w&&a.attr(\"title\",a.textStr),G&&G.removeChild(e),B&&a.applyTextOutline&&a.applyTextOutline(B)):e.appendChild(v.createTextNode(y.replace(/&lt;/g,\"\\x3c\").replace(/&gt;/g,\"\\x3e\")))}},getContrast:function(a){a=d(a).rgba;return 510<a[0]+a[1]+a[2]?\"#000000\":\"#FFFFFF\"},button:function(a,h,q,e,b,f,c,d,p){var y=this.label(a,h,q,p,null,null,null,null,\"button\"),k=0;y.attr(A({padding:8,r:2},b));E(y.element,H?\"mouseover\":\"mouseenter\",function(){3!==k&&y.setState(1)});\nE(y.element,H?\"mouseout\":\"mouseleave\",function(){3!==k&&y.setState(k)});y.setState=function(a){1!==a&&(y.state=k=a);y.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass(\"highcharts-button-\"+[\"normal\",\"hover\",\"pressed\",\"disabled\"][a||0])};return y.on(\"click\",function(a){3!==k&&e.call(y,a)})},crispLine:function(a,h){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-h%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+h%2/2);return a},path:function(a){var h={};L(a)?h.d=a:t(a)&&b(h,a);return this.createElement(\"path\").attr(h)},\ncircle:function(a,h,q){a=t(a)?a:{x:a,y:h,r:q};h=this.createElement(\"circle\");h.xSetter=h.ySetter=function(a,h,q){q.setAttribute(\"c\"+h,a)};return h.attr(a)},arc:function(a,h,q,e,b,f){t(a)?(e=a,h=e.y,q=e.r,a=e.x):e={innerR:e,start:b,end:f};a=this.symbol(\"arc\",a,h,q,q,e);a.r=q;return a},rect:function(a,h,q,e,b,f){b=t(a)?a.r:b;f=this.createElement(\"rect\");a=t(a)?a:void 0===a?{}:{x:a,y:h,width:Math.max(q,0),height:Math.max(e,0)};b&&(a.r=b);f.rSetter=function(a,h,q){m(q,{rx:a,ry:a})};return f.attr(a)},\nsetSize:function(a,q,e){var b=this.alignedObjects,f=b.length;this.width=a;this.height=q;for(this.boxWrapper.animate({width:a,height:q},{step:function(){this.attr({viewBox:\"0 0 \"+this.attr(\"width\")+\" \"+this.attr(\"height\")})},duration:h(e,!0)?void 0:0});f--;)b[f].align()},g:function(a){var h=this.createElement(\"g\");return a?h.attr({\"class\":\"highcharts-\"+a}):h},image:function(a,h,q,e,f){var c={preserveAspectRatio:\"none\"};1<arguments.length&&b(c,{x:h,y:q,width:e,height:f});c=this.createElement(\"image\").attr(c);\nc.element.setAttributeNS?c.element.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",a):c.element.setAttribute(\"hc-svg-href\",a);return c},symbol:function(a,q,e,c,d,p){var y=this,k,u=/^url\\((.*?)\\)$/,A=u.test(a),z=!A&&(this.symbols[a]?a:\"circle\"),w=z&&this.symbols[z],t=n(q)&&w&&w.call(this.symbols,Math.round(q),Math.round(e),c,d,p),K,P;w?(k=this.path(t),b(k,{symbolName:z,x:q,y:e,width:c,height:d}),p&&b(k,p)):A&&(K=a.match(u)[1],k=this.image(K),k.imgwidth=h(R[K]&&R[K].width,p&&p.width),k.imgheight=\nh(R[K]&&R[K].height,p&&p.height),P=function(){k.attr({width:k.width,height:k.height})},f([\"width\",\"height\"],function(a){k[a+\"Setter\"]=function(a,h){var q={},e=this[\"img\"+h],b=\"width\"===h?\"translateX\":\"translateY\";this[h]=a;n(e)&&(this.element&&this.element.setAttribute(h,e),this.alignByTranslate||(q[b]=((this[h]||0)-e)/2,this.attr(q)))}}),n(q)&&k.attr({x:q,y:e}),k.isImg=!0,n(k.imgwidth)&&n(k.imgheight)?P():(k.attr({width:0,height:0}),l(\"img\",{onload:function(){var a=g[y.chartIndex];0===this.width&&\n(r(this,{position:\"absolute\",top:\"-999em\"}),v.body.appendChild(this));R[K]={width:this.width,height:this.height};k.imgwidth=this.width;k.imgheight=this.height;k.element&&P();this.parentNode&&this.parentNode.removeChild(this);y.imgCount--;if(!y.imgCount&&a&&a.onload)a.onload()},src:K}),this.imgCount++));return k},symbols:{circle:function(a,h,q,e){return this.arc(a+q/2,h+e/2,q/2,e/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,h,q,e){return[\"M\",a,h,\"L\",a+q,h,a+q,h+e,a,h+e,\"Z\"]},triangle:function(a,\nh,q,e){return[\"M\",a+q/2,h,\"L\",a+q,h+e,a,h+e,\"Z\"]},\"triangle-down\":function(a,h,q,e){return[\"M\",a,h,\"L\",a+q,h,a+q/2,h+e,\"Z\"]},diamond:function(a,h,q,e){return[\"M\",a+q/2,h,\"L\",a+q,h+e/2,a+q/2,h+e,a,h+e/2,\"Z\"]},arc:function(a,h,q,e,b){var f=b.start,c=b.r||q,d=b.r||e||q,p=b.end-.001;q=b.innerR;e=b.open;var k=Math.cos(f),y=Math.sin(f),u=Math.cos(p),p=Math.sin(p);b=b.end-f<Math.PI?0:1;c=[\"M\",a+c*k,h+d*y,\"A\",c,d,0,b,1,a+c*u,h+d*p];n(q)&&c.push(e?\"M\":\"L\",a+q*u,h+q*p,\"A\",q,q,0,b,0,a+q*k,h+q*y);c.push(e?\"\":\n\"Z\");return c},callout:function(a,h,q,e,b){var f=Math.min(b&&b.r||0,q,e),c=f+6,p=b&&b.anchorX;b=b&&b.anchorY;var d;d=[\"M\",a+f,h,\"L\",a+q-f,h,\"C\",a+q,h,a+q,h,a+q,h+f,\"L\",a+q,h+e-f,\"C\",a+q,h+e,a+q,h+e,a+q-f,h+e,\"L\",a+f,h+e,\"C\",a,h+e,a,h+e,a,h+e-f,\"L\",a,h+f,\"C\",a,h,a,h,a+f,h];p&&p>q?b>h+c&&b<h+e-c?d.splice(13,3,\"L\",a+q,b-6,a+q+6,b,a+q,b+6,a+q,h+e-f):d.splice(13,3,\"L\",a+q,e/2,p,b,a+q,e/2,a+q,h+e-f):p&&0>p?b>h+c&&b<h+e-c?d.splice(33,3,\"L\",a,b+6,a-6,b,a,b-6,a,h+f):d.splice(33,3,\"L\",a,e/2,p,b,a,e/2,a,h+f):\nb&&b>e&&p>a+c&&p<a+q-c?d.splice(23,3,\"L\",p+6,h+e,p,h+e+6,p-6,h+e,a+f,h+e):b&&0>b&&p>a+c&&p<a+q-c&&d.splice(3,3,\"L\",p-6,h,p,h-6,p+6,h,q-f,h);return d}},clipRect:function(h,q,e,b){var f=a.uniqueKey(),c=this.createElement(\"clipPath\").attr({id:f}).add(this.defs);h=this.rect(h,q,e,b,0).add(c);h.id=f;h.clipPath=c;h.count=0;return h},text:function(a,h,q,e){var b=!M&&this.forExport,f={};if(e&&(this.allowHTML||!this.forExport))return this.html(a,h,q);f.x=Math.round(h||0);q&&(f.y=Math.round(q));if(a||0===a)f.text=\na;a=this.createElement(\"text\").attr(f);b&&a.css({position:\"absolute\"});e||(a.xSetter=function(a,h,q){var e=q.getElementsByTagName(\"tspan\"),b,f=q.getAttribute(h),c;for(c=0;c<e.length;c++)b=e[c],b.getAttribute(h)===f&&b.setAttribute(h,a);q.setAttribute(h,a)});return a},fontMetrics:function(a,h){a=h&&x.prototype.getStyle.call(h,\"font-size\");a=/px/.test(a)?q(a):/em/.test(a)?parseFloat(a)*(h?this.fontMetrics(null,h.parentNode).f:16):12;h=24>a?a+3:Math.round(1.2*a);return{h:h,b:Math.round(.8*h),f:a}},rotCorr:function(a,\nh,q){var e=a;h&&q&&(e=Math.max(e*Math.cos(h*k),4));return{x:-a/3*Math.sin(h*k),y:e}},label:function(h,q,e,c,p,d,k,u,g){var z=this,w=z.g(\"button\"!==g&&\"label\"),t=w.text=z.text(\"\",0,0,k).attr({zIndex:1}),y,K,P=0,v=3,B=0,l,F,H,r,m,G={},N,R=/^url\\((.*?)\\)$/.test(c),J=R,L,M,O,S;g&&w.addClass(\"highcharts-\"+g);J=!0;L=function(){return y.strokeWidth()%2/2};M=function(){var a=t.element.style,h={};K=(void 0===l||void 0===F||m)&&n(t.textStr)&&t.getBBox();w.width=(l||K.width||0)+2*v+B;w.height=(F||K.height||\n0)+2*v;N=v+z.fontMetrics(a&&a.fontSize,t).b;J&&(y||(w.box=y=z.symbols[c]||R?z.symbol(c):z.rect(),y.addClass((\"button\"===g?\"\":\"highcharts-label-box\")+(g?\" highcharts-\"+g+\"-box\":\"\")),y.add(w),a=L(),h.x=a,h.y=(u?-N:0)+a),h.width=Math.round(w.width),h.height=Math.round(w.height),y.attr(b(h,G)),G={})};O=function(){var a=B+v,h;h=u?0:N;n(l)&&K&&(\"center\"===m||\"right\"===m)&&(a+={center:.5,right:1}[m]*(l-K.width));if(a!==t.x||h!==t.y)t.attr(\"x\",a),void 0!==h&&t.attr(\"y\",h);t.x=a;t.y=h};S=function(a,h){y?y.attr(a,\nh):G[a]=h};w.onAdd=function(){t.add(w);w.attr({text:h||0===h?h:\"\",x:q,y:e});y&&n(p)&&w.attr({anchorX:p,anchorY:d})};w.widthSetter=function(h){l=a.isNumber(h)?h:null};w.heightSetter=function(a){F=a};w[\"text-alignSetter\"]=function(a){m=a};w.paddingSetter=function(a){n(a)&&a!==v&&(v=w.padding=a,O())};w.paddingLeftSetter=function(a){n(a)&&a!==B&&(B=a,O())};w.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==P&&(P=a,K&&w.attr({x:H}))};w.textSetter=function(a){void 0!==a&&t.textSetter(a);M();\nO()};w[\"stroke-widthSetter\"]=function(a,h){a&&(J=!0);this[\"stroke-width\"]=a;S(h,a)};w.rSetter=function(a,h){S(h,a)};w.anchorXSetter=function(a,h){p=w.anchorX=a;S(h,Math.round(a)-L()-H)};w.anchorYSetter=function(a,h){d=w.anchorY=a;S(h,a-r)};w.xSetter=function(a){w.x=a;P&&(a-=P*((l||K.width)+2*v));H=Math.round(a);w.attr(\"translateX\",H)};w.ySetter=function(a){r=w.y=Math.round(a);w.attr(\"translateY\",r)};var U=w.css;return b(w,{css:function(a){if(a){var h={};a=A(a);f(w.textProps,function(q){void 0!==a[q]&&\n(h[q]=a[q],delete a[q])});t.css(h)}return U.call(w,a)},getBBox:function(){return{width:K.width+2*v,height:K.height+2*v,x:K.x-v,y:K.y-v}},destroy:function(){Q(w.element,\"mouseenter\");Q(w.element,\"mouseleave\");t&&(t=t.destroy());y&&(y=y.destroy());x.prototype.destroy.call(w);w=z=M=O=S=null}})}});a.Renderer=C})(I);(function(a){var x=a.attr,C=a.createElement,E=a.css,D=a.defined,m=a.each,g=a.extend,d=a.isFirefox,r=a.isMS,l=a.isWebKit,n=a.pInt,k=a.SVGRenderer,c=a.win,v=a.wrap;g(a.SVGElement.prototype,{htmlCss:function(a){var b=\nthis.element;if(b=a&&\"SPAN\"===b.tagName&&a.width)delete a.width,this.textWidth=b,this.updateTransform();a&&\"ellipsis\"===a.textOverflow&&(a.whiteSpace=\"nowrap\",a.overflow=\"hidden\");this.styles=g(this.styles,a);E(this.element,a);return this},htmlGetBBox:function(){var a=this.element;\"text\"===a.nodeName&&(a.style.position=\"absolute\");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,e=this.x||\n0,c=this.y||0,d=this.textAlign||\"left\",k={left:0,center:.5,right:1}[d],g=this.styles;E(b,{marginLeft:this.translateX||0,marginTop:this.translateY||0});this.inverted&&m(b.childNodes,function(e){a.invertChild(e,b)});if(\"SPAN\"===b.tagName){var v=this.rotation,H=n(this.textWidth),t=g&&g.whiteSpace,r=[v,d,b.innerHTML,this.textWidth,this.textAlign].join();r!==this.cTT&&(g=a.fontMetrics(b.style.fontSize).b,D(v)&&this.setSpanRotation(v,k,g),E(b,{width:\"\",whiteSpace:t||\"nowrap\"}),b.offsetWidth>H&&/[ \\-]/.test(b.textContent||\nb.innerText)&&E(b,{width:H+\"px\",display:\"block\",whiteSpace:t||\"normal\"}),this.getSpanCorrection(b.offsetWidth,g,k,v,d));E(b,{left:e+(this.xCorr||0)+\"px\",top:c+(this.yCorr||0)+\"px\"});l&&(g=b.offsetHeight);this.cTT=r}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,e){var f={},k=r?\"-ms-transform\":l?\"-webkit-transform\":d?\"MozTransform\":c.opera?\"-o-transform\":\"\";f[k]=f.transform=\"rotate(\"+a+\"deg)\";f[k+(d?\"Origin\":\"-origin\")]=f.transformOrigin=100*b+\"% \"+e+\"px\";E(this.element,f)},getSpanCorrection:function(a,\nb,e){this.xCorr=-a*e;this.yCorr=-b}});g(k.prototype,{html:function(a,b,e){var f=this.createElement(\"span\"),c=f.element,d=f.renderer,k=d.isSVG,n=function(a,e){m([\"opacity\",\"visibility\"],function(b){v(a,b+\"Setter\",function(a,b,f,c){a.call(this,b,f,c);e[f]=b})})};f.textSetter=function(a){a!==c.innerHTML&&delete this.bBox;c.innerHTML=this.textStr=a;f.htmlUpdateTransform()};k&&n(f,f.element.style);f.xSetter=f.ySetter=f.alignSetter=f.rotationSetter=function(a,e){\"align\"===e&&(e=\"textAlign\");f[e]=a;f.htmlUpdateTransform()};\nf.attr({text:a,x:Math.round(b),y:Math.round(e)}).css({position:\"absolute\"});c.style.whiteSpace=\"nowrap\";f.css=f.htmlCss;k&&(f.add=function(a){var e,b=d.box.parentNode,p=[];if(this.parentGroup=a){if(e=a.div,!e){for(;a;)p.push(a),a=a.parentGroup;m(p.reverse(),function(a){var c,d=x(a.element,\"class\");d&&(d={className:d});e=a.div=a.div||C(\"div\",d,{position:\"absolute\",left:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},\ne||b);c=e.style;g(a,{on:function(){f.on.apply({element:p[0].div},arguments);return a},translateXSetter:function(h,q){c.left=h+\"px\";a[q]=h;a.doTransform=!0},translateYSetter:function(h,q){c.top=h+\"px\";a[q]=h;a.doTransform=!0}});n(a,c)})}}else e=b;e.appendChild(c);f.added=!0;f.alignOnAdd&&f.htmlUpdateTransform();return f});return f}})})(I);(function(a){function x(){var g=a.defaultOptions.global,l=d.moment;if(g.timezone){if(l)return function(a){return-l.tz(a,g.timezone).utcOffset()};a.error(25)}return g.useUTC&&\ng.getTimezoneOffset}function C(){var r=a.defaultOptions.global,l,n=r.useUTC,k=n?\"getUTC\":\"get\",c=n?\"setUTC\":\"set\";a.Date=l=r.Date||d.Date;l.hcTimezoneOffset=n&&r.timezoneOffset;l.hcGetTimezoneOffset=x();l.hcMakeTime=function(a,f,b,e,c,d){var p;n?(p=l.UTC.apply(0,arguments),p+=D(p)):p=(new l(a,f,g(b,1),g(e,0),g(c,0),g(d,0))).getTime();return p};E(\"Minutes Hours Day Date Month FullYear\".split(\" \"),function(a){l[\"hcGet\"+a]=k+a});E(\"Milliseconds Seconds Minutes Hours Date Month FullYear\".split(\" \"),function(a){l[\"hcSet\"+\na]=c+a})}var E=a.each,D=a.getTZOffset,m=a.merge,g=a.pick,d=a.win;a.defaultOptions={symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),weekdays:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),decimalPoint:\".\",numericSymbols:\"kMGTPE\".split(\"\"),resetZoom:\"Reset zoom\",\nresetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{useUTC:!0},chart:{borderRadius:0,colorCount:10,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:20},position:{align:\"right\",x:-10,y:10}},width:null,height:null},title:{text:\"Chart title\",align:\"center\",margin:15,widthAdjust:-44},subtitle:{text:\"\",align:\"center\",widthAdjust:-44},plotOptions:{},labels:{style:{position:\"absolute\",color:\"#333333\"}},legend:{enabled:!0,align:\"center\",layout:\"horizontal\",\nlabelFormatter:function(){return this.name},borderColor:\"#999999\",borderRadius:0,navigation:{},itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},squareSymbol:!0,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{}},loading:{},tooltip:{enabled:!0,animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},\nfooterFormat:\"\",padding:8,snap:a.isTouchDevice?25:10,headerFormat:'\\x3cspan class\\x3d\"highcharts-header\"\\x3e{point.key}\\x3c/span\\x3e\\x3cbr/\\x3e',pointFormat:'\\x3cspan class\\x3d\"highcharts-color-{point.colorIndex}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cspan class\\x3d\"highcharts-strong\"\\x3e{point.y}\\x3c/span\\x3e\\x3cbr/\\x3e'},credits:{enabled:!0,href:\"http://www.highcharts.com\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},text:\"Highcharts.com\"}};a.setOptions=function(d){a.defaultOptions=\nm(!0,a.defaultOptions,d);C();return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;C()})(I);(function(a){var x=a.correctFloat,C=a.defined,E=a.destroyObjectProperties,D=a.isNumber,m=a.pick,g=a.deg2rad;a.Tick=function(a,g,l,n){this.axis=a;this.pos=g;this.type=l||\"\";this.isNewLabel=this.isNew=!0;l||n||this.addLabel()};a.Tick.prototype={addLabel:function(){var a=this.axis,g=a.options,l=a.chart,n=a.categories,k=a.names,c=this.pos,v=\ng.labels,f=a.tickPositions,b=c===f[0],e=c===f[f.length-1],k=n?m(n[c],k[c],c):c,n=this.label,f=f.info,p;a.isDatetimeAxis&&f&&(p=g.dateTimeLabelFormats[f.higherRanks[c]||f.unitName]);this.isFirst=b;this.isLast=e;g=a.labelFormatter.call({axis:a,chart:l,isFirst:b,isLast:e,dateTimeLabelFormat:p,value:a.isLog?x(a.lin2log(k)):k});C(n)?n&&n.attr({text:g}):(this.labelLength=(this.label=n=C(g)&&v.enabled?l.renderer.text(g,0,0,v.useHTML).add(a.labelGroup):null)&&n.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?\nthis.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0},handleOverflow:function(a){var d=this.axis,l=a.x,n=d.chart.chartWidth,k=d.chart.spacing,c=m(d.labelLeft,Math.min(d.pos,k[3])),k=m(d.labelRight,Math.max(d.pos+d.len,n-k[1])),v=this.label,f=this.rotation,b={left:0,center:.5,right:1}[d.labelAlign],e=v.getBBox().width,p=d.getSlotWidth(),u=p,F=1,L,B={};if(f)0>f&&l-b*e<c?L=Math.round(l/Math.cos(f*g)-c):0<f&&l+b*e>k&&(L=Math.round((n-l)/Math.cos(f*g)));else if(n=l+(1-b)*e,l-b*e<c?u=a.x+u*(1-b)-c:\nn>k&&(u=k-a.x+u*b,F=-1),u=Math.min(p,u),u<p&&\"center\"===d.labelAlign&&(a.x+=F*(p-u-b*(p-Math.min(e,u)))),e>u||d.autoRotation&&(v.styles||{}).width)L=u;L&&(B.width=L,(d.options.labels.style||{}).textOverflow||(B.textOverflow=\"ellipsis\"),v.css(B))},getPosition:function(a,g,l,n){var d=this.axis,c=d.chart,v=n&&c.oldChartHeight||c.chartHeight;return{x:a?d.translate(g+l,null,null,n)+d.transB:d.left+d.offset+(d.opposite?(n&&c.oldChartWidth||c.chartWidth)-d.right-d.left:0),y:a?v-d.bottom+d.offset-(d.opposite?\nd.height:0):v-d.translate(g+l,null,null,n)-d.transB}},getLabelPosition:function(a,m,l,n,k,c,v,f){var b=this.axis,e=b.transA,d=b.reversed,u=b.staggerLines,F=b.tickRotCorr||{x:0,y:0},r=k.y;C(r)||(r=0===b.side?l.rotation?-8:-l.getBBox().height:2===b.side?F.y+8:Math.cos(l.rotation*g)*(F.y-l.getBBox(!1,0).height/2));a=a+k.x+F.x-(c&&n?c*e*(d?-1:1):0);m=m+r-(c&&!n?c*e*(d?1:-1):0);u&&(l=v/(f||1)%u,b.opposite&&(l=u-l-1),m+=b.labelOffset/u*l);return{x:a,y:Math.round(m)}},getMarkPath:function(a,g,l,n,k,c){return c.crispLine([\"M\",\na,g,\"L\",a+(k?0:-l),g+(k?l:0)],n)},renderGridLine:function(a,g,l){var d=this.axis,k=this.gridLine,c={},v=this.pos,f=this.type,b=d.tickmarkOffset,e=d.chart.renderer;k||(f||(c.zIndex=1),a&&(c.opacity=0),this.gridLine=k=e.path().attr(c).addClass(\"highcharts-\"+(f?f+\"-\":\"\")+\"grid-line\").add(d.gridGroup));if(!a&&k&&(a=d.getPlotLinePath(v+b,k.strokeWidth()*l,a,!0)))k[this.isNew?\"attr\":\"animate\"]({d:a,opacity:g})},renderMark:function(a,g,l){var d=this.axis,k=d.chart.renderer,c=this.type,v=d.tickSize(c?c+\"Tick\":\n\"tick\"),f=this.mark,b=!f,e=a.x;a=a.y;v&&(d.opposite&&(v[0]=-v[0]),b&&(this.mark=f=k.path().addClass(\"highcharts-\"+(c?c+\"-\":\"\")+\"tick\").add(d.axisGroup)),f[b?\"attr\":\"animate\"]({d:this.getMarkPath(e,a,v[0],f.strokeWidth()*l,d.horiz,k),opacity:g}))},renderLabel:function(a,g,l,n){var d=this.axis,c=d.horiz,v=d.options,f=this.label,b=v.labels,e=b.step,p=d.tickmarkOffset,u=!0,F=a.x;a=a.y;f&&D(F)&&(f.xy=a=this.getLabelPosition(F,a,f,c,b,p,n,e),this.isFirst&&!this.isLast&&!m(v.showFirstLabel,1)||this.isLast&&\n!this.isFirst&&!m(v.showLastLabel,1)?u=!1:!c||d.isRadial||b.step||b.rotation||g||0===l||this.handleOverflow(a),e&&n%e&&(u=!1),u&&D(a.y)?(a.opacity=l,f[this.isNewLabel?\"attr\":\"animate\"](a),this.isNewLabel=!1):(f.attr(\"y\",-9999),this.isNewLabel=!0),this.isNew=!1)},render:function(a,g,l){var d=this.axis,k=d.horiz,c=this.getPosition(k,this.pos,d.tickmarkOffset,g),v=c.x,f=c.y,d=k&&v===d.pos+d.len||!k&&f===d.pos?-1:1;l=m(l,1);this.isActive=!0;this.renderGridLine(g,l,d);this.renderMark(c,l,d);this.renderLabel(c,\ng,l,a)},destroy:function(){E(this,this.axis)}}})(I);var T=function(a){var x=a.addEvent,C=a.animObject,E=a.arrayMax,D=a.arrayMin,m=a.correctFloat,g=a.defaultOptions,d=a.defined,r=a.deg2rad,l=a.destroyObjectProperties,n=a.each,k=a.extend,c=a.fireEvent,v=a.format,f=a.getMagnitude,b=a.grep,e=a.inArray,p=a.isArray,u=a.isNumber,F=a.isString,L=a.merge,B=a.normalizeTickInterval,H=a.objectEach,t=a.pick,G=a.removeEvent,z=a.splat,A=a.syncTimeout,w=a.Tick,J=function(){this.init.apply(this,arguments)};a.extend(J.prototype,\n{defaultOptions:{dateTimeLabelFormats:{millisecond:\"%H:%M:%S.%L\",second:\"%H:%M:%S\",minute:\"%H:%M\",hour:\"%H:%M\",day:\"%e. %b\",week:\"%e. %b\",month:\"%b '%y\",year:\"%Y\"},endOnTick:!1,labels:{enabled:!0,x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:\"outside\",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:\"between\",tickPixelInterval:100,tickPosition:\"outside\",title:{align:\"middle\"},type:\"linear\"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,\nlabels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:\"Values\"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)}}},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,q){var h=q.isX,b=this;b.chart=a;\nb.horiz=a.inverted&&!b.isZAxis?!h:h;b.isXAxis=h;b.coll=b.coll||(h?\"xAxis\":\"yAxis\");b.opposite=q.opposite;b.side=q.side||(b.horiz?b.opposite?0:2:b.opposite?1:3);b.setOptions(q);var f=this.options,c=f.type;b.labelFormatter=f.labels.formatter||b.defaultLabelFormatter;b.userOptions=q;b.minPixelPadding=0;b.reversed=f.reversed;b.visible=!1!==f.visible;b.zoomEnabled=!1!==f.zoomEnabled;b.hasNames=\"category\"===c||!0===f.categories;b.categories=f.categories||b.hasNames;b.names=b.names||[];b.plotLinesAndBandsGroups=\n{};b.isLog=\"logarithmic\"===c;b.isDatetimeAxis=\"datetime\"===c;b.positiveValuesOnly=b.isLog&&!b.allowNegativeLog;b.isLinked=d(f.linkedTo);b.ticks={};b.labelEdge=[];b.minorTicks={};b.plotLinesAndBands=[];b.alternateBands={};b.len=0;b.minRange=b.userMinRange=f.minRange||f.maxZoom;b.range=f.range;b.offset=f.offset||0;b.stacks={};b.oldStacks={};b.stacksTouched=0;b.max=null;b.min=null;b.crosshair=t(f.crosshair,z(a.options.tooltip.crosshairs)[h?0:1],!1);q=b.options.events;-1===e(b,a.axes)&&(h?a.axes.splice(a.xAxis.length,\n0,b):a.axes.push(b),a[b.coll].push(b));b.series=b.series||[];a.inverted&&!b.isZAxis&&h&&void 0===b.reversed&&(b.reversed=!0);H(q,function(a,h){x(b,h,a)});b.lin2log=f.linearToLogConverter||b.lin2log;b.isLog&&(b.val2lin=b.log2lin,b.lin2val=b.lin2log)},setOptions:function(a){this.options=L(this.defaultOptions,\"yAxis\"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],L(g[this.coll],a))},\ndefaultLabelFormatter:function(){var h=this.axis,q=this.value,b=h.categories,e=this.dateTimeLabelFormat,f=g.lang,c=f.numericSymbols,f=f.numericSymbolMagnitude||1E3,d=c&&c.length,p,k=h.options.labels.format,h=h.isLog?Math.abs(q):h.tickInterval;if(k)p=v(k,this);else if(b)p=q;else if(e)p=a.dateFormat(e,q);else if(d&&1E3<=h)for(;d--&&void 0===p;)b=Math.pow(f,d+1),h>=b&&0===10*q%b&&null!==c[d]&&0!==q&&(p=a.numberFormat(q/b,-1)+c[d]);void 0===p&&(p=1E4<=Math.abs(q)?a.numberFormat(q,-1):a.numberFormat(q,\n-1,void 0,\"\"));return p},getSeriesExtremes:function(){var a=this,q=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();n(a.series,function(h){if(h.visible||!q.options.chart.ignoreHiddenSeries){var e=h.options,f=e.threshold,c;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis)e=h.xData,e.length&&(h=D(e),u(h)||h instanceof Date||(e=b(e,function(a){return u(a)}),h=D(e)),a.dataMin=Math.min(t(a.dataMin,e[0]),\nh),a.dataMax=Math.max(t(a.dataMax,e[0]),E(e)));else if(h.getExtremes(),c=h.dataMax,h=h.dataMin,d(h)&&d(c)&&(a.dataMin=Math.min(t(a.dataMin,h),h),a.dataMax=Math.max(t(a.dataMax,c),c)),d(f)&&(a.threshold=f),!e.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})},translate:function(a,q,b,e,f,c){var h=this.linkedParent||this,d=1,p=0,k=e?h.oldTransA:h.transA;e=e?h.oldMin:h.min;var g=h.minPixelPadding;f=(h.isOrdinal||h.isBroken||h.isLog&&f)&&h.lin2val;k||(k=h.transA);b&&(d*=-1,p=h.len);h.reversed&&\n(d*=-1,p-=d*(h.sector||h.len));q?(a=(a*d+p-g)/k+e,f&&(a=h.lin2val(a))):(f&&(a=h.val2lin(a)),a=d*(a-e)*k+p+d*g+(u(c)?k*c:0));return a},toPixels:function(a,q){return this.translate(a,!1,!this.horiz,null,!0)+(q?0:this.pos)},toValue:function(a,q){return this.translate(a-(q?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,q,b,e,f){var h=this.chart,c=this.left,d=this.top,p,k,g=b&&h.oldChartHeight||h.chartHeight,w=b&&h.oldChartWidth||h.chartWidth,z;p=this.transB;var A=function(a,h,q){if(a<\nh||a>q)e?a=Math.min(Math.max(h,a),q):z=!0;return a};f=t(f,this.translate(a,null,null,b));a=b=Math.round(f+p);p=k=Math.round(g-f-p);u(f)?this.horiz?(p=d,k=g-this.bottom,a=b=A(a,c,c+this.width)):(a=c,b=w-this.right,p=k=A(p,d,d+this.height)):z=!0;return z&&!e?null:h.renderer.crispLine([\"M\",a,p,\"L\",b,k],q||1)},getLinearTickPositions:function(a,q,b){var h,e=m(Math.floor(q/a)*a);b=m(Math.ceil(b/a)*a);var f=[];if(this.single)return[q];for(q=e;q<=b;){f.push(q);q=m(q+a);if(q===h)break;h=q}return f},getMinorTickPositions:function(){var a=\nthis,q=a.options,b=a.tickPositions,e=a.minorTickInterval,f=[],c=a.pointRangePadding||0,d=a.min-c,c=a.max+c,p=c-d;if(p&&p/e<a.len/3)if(a.isLog)n(this.paddedTicks,function(h,q,b){q&&f.push.apply(f,a.getLogTickPositions(e,b[q-1],b[q],!0))});else if(a.isDatetimeAxis&&\"auto\"===q.minorTickInterval)f=f.concat(a.getTimeTicks(a.normalizeTimeTickInterval(e),d,c,q.startOfWeek));else for(q=d+(b[0]-d)%e;q<=c&&q!==f[0];q+=e)f.push(q);0!==f.length&&a.trimTicks(f);return f},adjustForMinRange:function(){var a=this.options,\nq=this.min,b=this.max,e,f,c,p,k,g,w,u;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(d(a.min)||d(a.max)?this.minRange=null:(n(this.series,function(a){g=a.xData;for(p=w=a.xIncrement?1:g.length-1;0<p;p--)if(k=g[p]-g[p-1],void 0===c||k<c)c=k}),this.minRange=Math.min(5*c,this.dataMax-this.dataMin)));b-q<this.minRange&&(f=this.dataMax-this.dataMin>=this.minRange,u=this.minRange,e=(u-b+q)/2,e=[q-e,t(a.min,q-e)],f&&(e[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),q=E(e),b=[q+u,t(a.max,q+u)],\nf&&(b[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),b=D(b),b-q<u&&(e[0]=b-u,e[1]=t(a.min,b-u),q=E(e)));this.min=q;this.max=b},getClosest:function(){var a;this.categories?a=1:n(this.series,function(h){var q=h.closestPointRange,b=h.visible||!h.chart.options.chart.ignoreHiddenSeries;!h.noSharedTooltip&&d(q)&&b&&(a=d(a)?Math.min(a,q):q)});return a},nameToX:function(a){var h=p(this.categories),b=h?this.categories:this.names,f=a.options.x,c;a.series.requireSorting=!1;d(f)||(f=!1===this.options.uniqueNames?\na.series.autoIncrement():e(a.name,b));-1===f?h||(c=b.length):c=f;void 0!==c&&(this.names[c]=a.name);return c},updateNames:function(){var a=this;0<this.names.length&&(this.names.length=0,this.minRange=this.userMinRange,n(this.series||[],function(h){h.xIncrement=null;if(!h.points||h.isDirtyData)h.processData(),h.generatePoints();n(h.points,function(b,q){var e;b.options&&(e=a.nameToX(b),void 0!==e&&e!==b.x&&(b.x=e,h.xData[q]=e))})}))},setAxisTranslation:function(a){var h=this,b=h.max-h.min,e=h.axisPointRange||\n0,f,c=0,d=0,p=h.linkedParent,k=!!h.categories,g=h.transA,w=h.isXAxis;if(w||k||e)f=h.getClosest(),p?(c=p.minPointOffset,d=p.pointRangePadding):n(h.series,function(a){var b=k?1:w?t(a.options.pointRange,f,0):h.axisPointRange||0;a=a.options.pointPlacement;e=Math.max(e,b);h.single||(c=Math.max(c,F(a)?0:b/2),d=Math.max(d,\"on\"===a?0:b))}),p=h.ordinalSlope&&f?h.ordinalSlope/f:1,h.minPointOffset=c*=p,h.pointRangePadding=d*=p,h.pointRange=Math.min(e,b),w&&(h.closestPointRange=f);a&&(h.oldTransA=g);h.translationSlope=\nh.transA=g=h.options.staticScale||h.len/(b+d||1);h.transB=h.horiz?h.left:h.bottom;h.minPixelPadding=g*c},minFromRange:function(){return this.max-this.range},setTickInterval:function(h){var b=this,e=b.chart,p=b.options,k=b.isLog,g=b.log2lin,w=b.isDatetimeAxis,z=b.isXAxis,A=b.isLinked,y=p.maxPadding,v=p.minPadding,l=p.tickInterval,F=p.tickPixelInterval,H=b.categories,G=b.threshold,r=b.softThreshold,J,L,C,x;w||H||A||this.getTickAmount();C=t(b.userMin,p.min);x=t(b.userMax,p.max);A?(b.linkedParent=e[b.coll][p.linkedTo],\ne=b.linkedParent.getExtremes(),b.min=t(e.min,e.dataMin),b.max=t(e.max,e.dataMax),p.type!==b.linkedParent.options.type&&a.error(11,1)):(!r&&d(G)&&(b.dataMin>=G?(J=G,v=0):b.dataMax<=G&&(L=G,y=0)),b.min=t(C,J,b.dataMin),b.max=t(x,L,b.dataMax));k&&(b.positiveValuesOnly&&!h&&0>=Math.min(b.min,t(b.dataMin,b.min))&&a.error(10,1),b.min=m(g(b.min),15),b.max=m(g(b.max),15));b.range&&d(b.max)&&(b.userMin=b.min=C=Math.max(b.min,b.minFromRange()),b.userMax=x=b.max,b.range=null);c(b,\"foundExtremes\");b.beforePadding&&\nb.beforePadding();b.adjustForMinRange();!(H||b.axisPointRange||b.usePercentage||A)&&d(b.min)&&d(b.max)&&(g=b.max-b.min)&&(!d(C)&&v&&(b.min-=g*v),!d(x)&&y&&(b.max+=g*y));u(p.softMin)&&(b.min=Math.min(b.min,p.softMin));u(p.softMax)&&(b.max=Math.max(b.max,p.softMax));u(p.floor)&&(b.min=Math.max(b.min,p.floor));u(p.ceiling)&&(b.max=Math.min(b.max,p.ceiling));r&&d(b.dataMin)&&(G=G||0,!d(C)&&b.min<G&&b.dataMin>=G?b.min=G:!d(x)&&b.max>G&&b.dataMax<=G&&(b.max=G));b.tickInterval=b.min===b.max||void 0===b.min||\nvoid 0===b.max?1:A&&!l&&F===b.linkedParent.options.tickPixelInterval?l=b.linkedParent.tickInterval:t(l,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,H?1:(b.max-b.min)*F/Math.max(b.len,F));z&&!h&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!l&&(b.tickInterval=Math.max(b.pointRange,\nb.tickInterval));h=t(p.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!l&&b.tickInterval<h&&(b.tickInterval=h);w||k||l||(b.tickInterval=B(b.tickInterval,null,f(b.tickInterval),t(p.allowDecimals,!(.5<b.tickInterval&&5>b.tickInterval&&1E3<b.max&&9999>b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval=b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,e=a.tickPositions,f=a.tickPositioner,c=a.startOnTick,p=a.endOnTick;this.tickmarkOffset=this.categories&&\n\"between\"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval=\"auto\"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.single=this.min===this.max&&d(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==a.allowDecimals);this.tickPositions=b=e&&e.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,\n!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,f&&(f=f.apply(this,[this.min,this.max])))&&(this.tickPositions=b=f);this.paddedTicks=b.slice(0);this.trimTicks(b,c,p);this.isLinked||(this.single&&(this.min-=.5,this.max+=.5),e||f||this.adjustTickAmount())},trimTicks:function(a,b,e){var h=a[0],f=a[a.length-1],c=this.minPointOffset||0;if(!this.isLinked){if(b&&\n-Infinity!==h)this.min=h;else for(;this.min-c>a[0];)a.shift();if(e)this.max=f;else for(;this.max+c<a[a.length-1];)a.pop();0===a.length&&d(h)&&a.push((f+h)/2)}},alignToOthers:function(){var a={},b,e=this.options;!1===this.chart.options.chart.alignTicks||!1===e.alignTicks||this.isLog||n(this.chart[this.coll],function(h){var e=h.options,e=[h.horiz?e.left:e.top,e.width,e.height,e.pane].join();h.series.length&&(a[e]?b=!0:a[e]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,e=\na.tickPixelInterval;!d(a.tickInterval)&&this.len<e&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/e)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,e=this.tickAmount,f=this.finalTickAmt,c=b&&b.length;if(c<e){for(;b.length<e;)b.push(m(b[b.length-1]+a));this.transA*=(c-1)/(e-1);this.max=b[b.length-1]}else c>e&&(this.tickInterval*=2,this.setTickPositions());\nif(d(f)){for(a=e=b.length;a--;)(3===f&&1===a%2||2>=f&&0<a&&a<e-1)&&b.splice(a,1);this.finalTickAmt=void 0}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;n(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=\n!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,b,e,f,d){var h=this,q=h.chart;e=t(e,!0);n(h.series,function(a){delete a.kdTree});d=k(d,{min:a,max:b});c(h,\"setExtremes\",d,function(){h.userMin=a;h.userMax=b;h.eventArgs=d;e&&q.redraw(f)})},zoom:function(a,b){var h=this.dataMin,e=this.dataMax,f=this.options,\nc=Math.min(h,t(f.min,h)),f=Math.max(e,t(f.max,e));if(a!==this.min||b!==this.max)this.allowZoomOutside||(d(h)&&(a<c&&(a=c),a>f&&(a=f)),d(e)&&(b<c&&(b=c),b>f&&(b=f))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:\"zoom\"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,e=b.offsets||[0,0,0,0],f=this.horiz,c=t(b.width,a.plotWidth-e[3]+e[1]),d=t(b.height,a.plotHeight-e[0]+e[2]),p=t(b.top,a.plotTop+e[0]),b=t(b.left,a.plotLeft+e[3]),e=/%$/;e.test(d)&&(d=\nMath.round(parseFloat(d)/100*a.plotHeight));e.test(p)&&(p=Math.round(parseFloat(p)/100*a.plotHeight+a.plotTop));this.left=b;this.top=p;this.width=c;this.height=d;this.bottom=a.chartHeight-d-p;this.right=a.chartWidth-c-b;this.len=Math.max(f?c:d,0);this.pos=f?b:p},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?m(b(this.min)):this.min,max:a?m(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=\nthis.isLog,h=this.lin2log,e=b?h(this.min):this.min,b=b?h(this.max):this.max;null===a?a=e:e>a?a=e:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(t(a,0)-90*this.side+720)%360;return 15<a&&165>a?\"right\":195<a&&345>a?\"left\":\"center\"},tickSize:function(a){var b=this.options,h=b[a+\"Length\"],e=t(b[a+\"Width\"],\"tick\"===a&&this.isXAxis?1:0);if(e&&h)return\"inside\"===b[a+\"Position\"]&&(h=-h),[h,e]},labelMetrics:function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&\nthis.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,e=this.tickInterval,f=e,c=this.len/(((this.categories?1:0)+this.max-this.min)/e),p,k=a.rotation,g=this.labelMetrics(),w,u=Number.MAX_VALUE,z,A=function(a){a/=c||1;a=1<a?Math.ceil(a):1;return a*e};b?(z=!a.staggerLines&&!a.step&&(d(k)?[k]:c<t(a.autoRotationLimit,80)&&a.autoRotation))&&n(z,function(a){var b;if(a===k||a&&-90<=a&&90>=a)w=A(Math.abs(g.h/Math.sin(r*a))),b=w+\nMath.abs(a/360),b<u&&(u=b,p=a,f=w)}):a.step||(f=A(g.h));this.autoRotation=z;this.labelRotation=t(p,k);return f},getSlotWidth:function(){var a=this.chart,b=this.horiz,e=this.options.labels,f=Math.max(this.tickPositions.length-(this.categories?0:1),1),c=a.margin[3];return b&&2>(e.step||0)&&!e.rotation&&(this.staggerLines||1)*this.len/f||!b&&(c&&c-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,e=this.tickPositions,f=this.ticks,c=this.options.labels,d=this.horiz,\np=this.getSlotWidth(),k=Math.max(1,Math.round(p-2*(c.padding||5))),g={},w=this.labelMetrics(),u=c.style&&c.style.textOverflow,z,A=0,t,v;F(c.rotation)||(g.rotation=c.rotation||0);n(e,function(a){(a=f[a])&&a.labelLength>A&&(A=a.labelLength)});this.maxLabelLength=A;if(this.autoRotation)A>k&&A>w.h?g.rotation=this.labelRotation:this.labelRotation=0;else if(p&&(z={width:k+\"px\"},!u))for(z.textOverflow=\"clip\",t=e.length;!d&&t--;)if(v=e[t],k=f[v].label)k.styles&&\"ellipsis\"===k.styles.textOverflow?k.css({textOverflow:\"clip\"}):\nf[v].labelLength>p&&k.css({width:p+\"px\"}),k.getBBox().height>this.len/e.length-(w.h-w.f)&&(k.specCss={textOverflow:\"ellipsis\"});g.rotation&&(z={width:(A>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+\"px\"},u||(z.textOverflow=\"ellipsis\"));if(this.labelAlign=c.align||this.autoLabelAlign(this.labelRotation))g.align=this.labelAlign;n(e,function(a){var b=(a=f[a])&&a.label;b&&(b.attr(g),z&&b.css(L(z,b.specCss)),delete b.specCss,a.rotation=g.rotation)});this.tickRotCorr=b.rotCorr(w.b,this.labelRotation||\n0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||d(this.min)&&d(this.max)&&!!this.tickPositions},addTitle:function(a){var b=this.chart.renderer,h=this.horiz,e=this.opposite,f=this.options.title,c;this.axisTitle||((c=f.textAlign)||(c=(h?{low:\"left\",middle:\"center\",high:\"right\"}:{low:e?\"right\":\"left\",middle:\"center\",high:e?\"left\":\"right\"})[f.align]),this.axisTitle=b.text(f.text,0,0,f.useHTML).attr({zIndex:7,rotation:f.rotation||0,align:c}).addClass(\"highcharts-axis-title\").add(this.axisGroup),\nthis.axisTitle.isNew=!0);this.axisTitle[a?\"show\":\"hide\"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new w(this,a)},getOffset:function(){var a=this,b=a.chart,e=b.renderer,f=a.options,c=a.tickPositions,p=a.ticks,k=a.horiz,g=a.side,w=b.inverted&&!a.isZAxis?[1,0,3,2][g]:g,u,z,A=0,v,l=0,B=f.title,F=f.labels,m=0,G=b.axisOffset,b=b.clipOffset,r=[-1,1,1,-1][g],J=f.className,L=a.axisParent,C=this.tickSize(\"tick\");u=a.hasData();a.showAxis=z=u||t(f.showEmpty,!0);a.staggerLines=\na.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup=e.g(\"grid\").attr({zIndex:f.gridZIndex||1}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\"-grid \"+(J||\"\")).add(L),a.axisGroup=e.g(\"axis\").attr({zIndex:f.zIndex||2}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\" \"+(J||\"\")).add(L),a.labelGroup=e.g(\"axis-labels\").attr({zIndex:F.zIndex||7}).addClass(\"highcharts-\"+a.coll.toLowerCase()+\"-labels \"+(J||\"\")).add(L));u||a.isLinked?(n(c,function(b,e){a.generateTick(b,e)}),a.renderUnsquish(),!1===F.reserveSpace||\n0!==g&&2!==g&&{1:\"left\",3:\"right\"}[g]!==a.labelAlign&&\"center\"!==a.labelAlign||n(c,function(a){m=Math.max(p[a].getLabelSize(),m)}),a.staggerLines&&(m*=a.staggerLines,a.labelOffset=m*(a.opposite?-1:1))):H(p,function(a,b){a.destroy();delete p[b]});B&&B.text&&!1!==B.enabled&&(a.addTitle(z),z&&!1!==B.reserveSpace&&(a.titleOffset=A=a.axisTitle.getBBox()[k?\"height\":\"width\"],v=B.offset,l=d(v)?0:t(B.margin,k?5:10)));a.renderLine();a.offset=r*t(f.offset,G[g]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};e=0===g?\n-a.labelMetrics().h:2===g?a.tickRotCorr.y:0;l=Math.abs(m)+l;m&&(l=l-e+r*(k?t(F.y,a.tickRotCorr.y+8*r):F.x));a.axisTitleMargin=t(v,l);G[g]=Math.max(G[g],a.axisTitleMargin+A+r*a.offset,l,u&&c.length&&C?C[0]+r*a.offset:0);c=2*Math.floor(a.axisLine.strokeWidth()/2);0<f.offset&&(c-=2*f.offset);b[w]=Math.max(b[w]||c,c)},getLinePath:function(a){var b=this.chart,e=this.opposite,h=this.offset,f=this.horiz,c=this.left+(e?this.width:0)+h,h=b.chartHeight-this.bottom-(e?this.height:0)+h;e&&(a*=-1);return b.renderer.crispLine([\"M\",\nf?this.left:c,f?h:this.top,\"L\",f?b.chartWidth-this.right:c,f?h:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass(\"highcharts-axis-line\").add(this.axisGroup))},getTitlePosition:function(){var a=this.horiz,b=this.left,e=this.top,f=this.len,c=this.options.title,p=a?b:e,d=this.opposite,k=this.offset,g=c.x||0,w=c.y||0,u=this.chart.renderer.fontMetrics(c.style&&c.style.fontSize,this.axisTitle).f,f={low:p+(a?0:f),middle:p+f/2,high:p+(a?\nf:0)}[c.align],b=(a?e+this.height:b)+(a?1:-1)*(d?-1:1)*this.axisTitleMargin+(2===this.side?u:0);return{x:a?f+g:b+(d?this.width:0)+k+g,y:a?b+w-(d?this.height:0)+k:f+w}},renderMinorTick:function(a){var b=this.chart.hasRendered&&u(this.oldMin),e=this.minorTicks;e[a]||(e[a]=new w(this,a,\"minor\"));b&&e[a].isNew&&e[a].render(null,!0);e[a].render(null,!1,1)},renderTick:function(a,b){var e=this.isLinked,h=this.ticks,f=this.chart.hasRendered&&u(this.oldMin);if(!e||a>=this.min&&a<=this.max)h[a]||(h[a]=new w(this,\na)),f&&h[a].isNew&&h[a].render(b,!0,.1),h[a].render(b)},render:function(){var b=this,e=b.chart,f=b.options,c=b.isLog,p=b.lin2log,d=b.isLinked,k=b.tickPositions,g=b.axisTitle,z=b.ticks,t=b.minorTicks,v=b.alternateBands,l=f.stackLabels,B=f.alternateGridColor,F=b.tickmarkOffset,m=b.axisLine,G=b.showAxis,r=C(e.renderer.globalAnimation),J,L;b.labelEdge.length=0;b.overlap=!1;n([z,t,v],function(a){H(a,function(a){a.isActive=!1})});if(b.hasData()||d)b.minorTickInterval&&!b.categories&&n(b.getMinorTickPositions(),\nfunction(a){b.renderMinorTick(a)}),k.length&&(n(k,function(a,e){b.renderTick(a,e)}),F&&(0===b.min||b.single)&&(z[-1]||(z[-1]=new w(b,-1,null,!0)),z[-1].render(-1))),B&&n(k,function(h,f){L=void 0!==k[f+1]?k[f+1]+F:b.max-F;0===f%2&&h<b.max&&L<=b.max+(e.polar?-F:F)&&(v[h]||(v[h]=new a.PlotLineOrBand(b)),J=h+F,v[h].options={from:c?p(J):J,to:c?p(L):L,color:B},v[h].render(),v[h].isActive=!0)}),b._addedPlotLB||(n((f.plotLines||[]).concat(f.plotBands||[]),function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=\n!0);n([z,t,v],function(a){var b,h=[],f=r.duration;H(a,function(a,b){a.isActive||(a.render(b,!1,0),a.isActive=!1,h.push(b))});A(function(){for(b=h.length;b--;)a[h[b]]&&!a[h[b]].isActive&&(a[h[b]].destroy(),delete a[h[b]])},a!==v&&e.hasRendered&&f?f:0)});m&&(m[m.isPlaced?\"animate\":\"attr\"]({d:this.getLinePath(m.strokeWidth())}),m.isPlaced=!0,m[G?\"show\":\"hide\"](!0));g&&G&&(f=b.getTitlePosition(),u(f.y)?(g[g.isNew?\"attr\":\"animate\"](f),g.isNew=!1):(g.attr(\"y\",-9999),g.isNew=!0));l&&l.enabled&&b.renderStackTotals();\nb.isDirty=!1},redraw:function(){this.visible&&(this.render(),n(this.plotLinesAndBands,function(a){a.render()}));n(this.series,function(a){a.isDirty=!0})},keepProps:\"extKey hcEvents names series userMax userMin\".split(\" \"),destroy:function(a){var b=this,h=b.stacks,f=b.plotLinesAndBands,c;a||G(b);H(h,function(a,b){l(a);h[b]=null});n([b.ticks,b.minorTicks,b.alternateBands],function(a){l(a)});if(f)for(a=f.length;a--;)f[a].destroy();n(\"stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross\".split(\" \"),\nfunction(a){b[a]&&(b[a]=b[a].destroy())});for(c in b.plotLinesAndBandsGroups)b.plotLinesAndBandsGroups[c]=b.plotLinesAndBandsGroups[c].destroy();H(b,function(a,h){-1===e(h,b.keepProps)&&delete b[h]})},drawCrosshair:function(a,b){var e,h=this.crosshair,f=t(h.snap,!0),c,p=this.cross;a||(a=this.cross&&this.cross.e);this.crosshair&&!1!==(d(b)||!f)?(f?d(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos),d(c)&&(e=this.getPlotLinePath(b&&(this.isXAxis?\nb.x:t(b.stackY,b.y)),null,null,null,c)||null),d(e)?(b=this.categories&&!this.isRadial,p||(this.cross=p=this.chart.renderer.path().addClass(\"highcharts-crosshair highcharts-crosshair-\"+(b?\"category \":\"thin \")+h.className).attr({zIndex:t(h.zIndex,2)}).add()),p.show().attr({d:e}),b&&!h.width&&p.attr({\"stroke-width\":this.transA}),this.cross.e=a):this.hideCrosshair()):this.hideCrosshair()},hideCrosshair:function(){this.cross&&this.cross.hide()}});return a.Axis=J}(I);(function(a){var x=a.Axis,C=a.Date,\nE=a.dateFormat,D=a.defaultOptions,m=a.defined,g=a.each,d=a.extend,r=a.getMagnitude,l=a.getTZOffset,n=a.normalizeTickInterval,k=a.pick,c=a.timeUnits;x.prototype.getTimeTicks=function(a,f,b,e){var p=[],u={},v=D.global.useUTC,n,B=new C(f-Math.max(l(f),l(b))),H=C.hcMakeTime,t=a.unitRange,G=a.count,z;if(m(f)){B[C.hcSetMilliseconds](t>=c.second?0:G*Math.floor(B.getMilliseconds()/G));if(t>=c.second)B[C.hcSetSeconds](t>=c.minute?0:G*Math.floor(B.getSeconds()/G));if(t>=c.minute)B[C.hcSetMinutes](t>=c.hour?\n0:G*Math.floor(B[C.hcGetMinutes]()/G));if(t>=c.hour)B[C.hcSetHours](t>=c.day?0:G*Math.floor(B[C.hcGetHours]()/G));if(t>=c.day)B[C.hcSetDate](t>=c.month?1:G*Math.floor(B[C.hcGetDate]()/G));t>=c.month&&(B[C.hcSetMonth](t>=c.year?0:G*Math.floor(B[C.hcGetMonth]()/G)),n=B[C.hcGetFullYear]());if(t>=c.year)B[C.hcSetFullYear](n-n%G);if(t===c.week)B[C.hcSetDate](B[C.hcGetDate]()-B[C.hcGetDay]()+k(e,1));n=B[C.hcGetFullYear]();e=B[C.hcGetMonth]();var A=B[C.hcGetDate](),w=B[C.hcGetHours]();if(C.hcTimezoneOffset||\nC.hcGetTimezoneOffset)z=(!v||!!C.hcGetTimezoneOffset)&&(b-f>4*c.month||l(f)!==l(b)),B=B.getTime(),B=new C(B+l(B));v=B.getTime();for(f=1;v<b;)p.push(v),v=t===c.year?H(n+f*G,0):t===c.month?H(n,e+f*G):!z||t!==c.day&&t!==c.week?z&&t===c.hour?H(n,e,A,w+f*G):v+t*G:H(n,e,A+f*G*(t===c.day?1:7)),f++;p.push(v);t<=c.hour&&1E4>p.length&&g(p,function(a){0===a%18E5&&\"000000000\"===E(\"%H%M%S%L\",a)&&(u[a]=\"day\")})}p.info=d(a,{higherRanks:u,totalRange:t*G});return p};x.prototype.normalizeTimeTickInterval=function(a,\nf){var b=f||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],[\"year\",null]];f=b[b.length-1];var e=c[f[0]],p=f[1],d;for(d=0;d<b.length&&!(f=b[d],e=c[f[0]],p=f[1],b[d+1]&&a<=(e*p[p.length-1]+c[b[d+1][0]])/2);d++);e===c.year&&a<5*e&&(p=[1,2,5]);a=n(a/e,p,\"year\"===f[0]?Math.max(r(a/e),1):1);return{unitRange:e,count:a,unitName:f[0]}}})(I);(function(a){var x=a.Axis,C=a.getMagnitude,\nE=a.map,D=a.normalizeTickInterval,m=a.pick;x.prototype.getLogTickPositions=function(a,d,r,l){var g=this.options,k=this.len,c=this.lin2log,v=this.log2lin,f=[];l||(this._minorAutoInterval=null);if(.5<=a)a=Math.round(a),f=this.getLinearTickPositions(a,d,r);else if(.08<=a)for(var k=Math.floor(d),b,e,p,u,F,g=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];k<r+1&&!F;k++)for(e=g.length,b=0;b<e&&!F;b++)p=v(c(k)*g[b]),p>d&&(!l||u<=r)&&void 0!==u&&f.push(u),u>r&&(F=!0),u=p;else d=c(d),r=c(r),a=g[l?\"minorTickInterval\":\n\"tickInterval\"],a=m(\"auto\"===a?null:a,this._minorAutoInterval,g.tickPixelInterval/(l?5:1)*(r-d)/((l?k/this.tickPositions.length:k)||1)),a=D(a,null,C(a)),f=E(this.getLinearTickPositions(a,d,r),v),l||(this._minorAutoInterval=a/5);l||(this.tickInterval=a);return f};x.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};x.prototype.lin2log=function(a){return Math.pow(10,a)}})(I);(function(a,x){var C=a.arrayMax,E=a.arrayMin,D=a.defined,m=a.destroyObjectProperties,g=a.each,d=a.erase,r=a.merge,l=\na.pick;a.PlotLineOrBand=function(a,d){this.axis=a;d&&(this.options=d,this.id=d.id)};a.PlotLineOrBand.prototype={render:function(){var d=this,k=d.axis,c=k.horiz,g=d.options,f=g.label,b=d.label,e=g.to,p=g.from,u=g.value,F=D(p)&&D(e),m=D(u),B=d.svgElem,H=!B,t=[],G=l(g.zIndex,0),z=g.events,t={\"class\":\"highcharts-plot-\"+(F?\"band \":\"line \")+(g.className||\"\")},A={},w=k.chart.renderer,J=F?\"bands\":\"lines\",h;h=k.log2lin;k.isLog&&(p=h(p),e=h(e),u=h(u));A.zIndex=G;J+=\"-\"+G;(h=k.plotLinesAndBandsGroups[J])||(k.plotLinesAndBandsGroups[J]=\nh=w.g(\"plot-\"+J).attr(A).add());H&&(d.svgElem=B=w.path().attr(t).add(h));if(m)t=k.getPlotLinePath(u,B.strokeWidth());else if(F)t=k.getPlotBandPath(p,e,g);else return;H&&t&&t.length?(B.attr({d:t}),z&&a.objectEach(z,function(a,b){B.on(b,function(a){z[b].apply(d,[a])})})):B&&(t?(B.show(),B.animate({d:t})):(B.hide(),b&&(d.label=b=b.destroy())));f&&D(f.text)&&t&&t.length&&0<k.width&&0<k.height&&!t.flat?(f=r({align:c&&F&&\"center\",x:c?!F&&4:10,verticalAlign:!c&&F&&\"middle\",y:c?F?16:10:F?6:-4,rotation:c&&\n!F&&90},f),this.renderLabel(f,t,F,G)):b&&b.hide();return d},renderLabel:function(a,d,c,g){var f=this.label,b=this.axis.chart.renderer;f||(f={align:a.textAlign||a.align,rotation:a.rotation,\"class\":\"highcharts-plot-\"+(c?\"band\":\"line\")+\"-label \"+(a.className||\"\")},f.zIndex=g,this.label=f=b.text(a.text,0,0,a.useHTML).attr(f).add());g=[d[1],d[4],c?d[6]:d[1]];d=[d[2],d[5],c?d[7]:d[2]];c=E(g);b=E(d);f.align(a,!1,{x:c,y:b,width:C(g)-c,height:C(d)-b});f.show()},destroy:function(){d(this.axis.plotLinesAndBands,\nthis);delete this.axis;m(this)}};a.extend(x.prototype,{getPlotBandPath:function(a,d){var c=this.getPlotLinePath(d,null,null,!0),g=this.getPlotLinePath(a,null,null,!0),f=this.horiz,b=1;a=a<this.min&&d<this.min||a>this.max&&d>this.max;g&&c?(a&&(g.flat=g.toString()===c.toString(),b=0),g.push(f&&c[4]===g[4]?c[4]+b:c[4],f||c[5]!==g[5]?c[5]:c[5]+b,f&&c[1]===g[1]?c[1]+b:c[1],f||c[2]!==g[2]?c[2]:c[2]+b)):g=null;return g},addPlotBand:function(a){return this.addPlotBandOrLine(a,\"plotBands\")},addPlotLine:function(a){return this.addPlotBandOrLine(a,\n\"plotLines\")},addPlotBandOrLine:function(d,g){var c=(new a.PlotLineOrBand(this,d)).render(),k=this.userOptions;c&&(g&&(k[g]=k[g]||[],k[g].push(d)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var k=this.plotLinesAndBands,c=this.options,l=this.userOptions,f=k.length;f--;)k[f].id===a&&k[f].destroy();g([c.plotLines||[],l.plotLines||[],c.plotBands||[],l.plotBands||[]],function(b){for(f=b.length;f--;)b[f].id===a&&d(b,b[f])})},removePlotBand:function(a){this.removePlotBandOrLine(a)},\nremovePlotLine:function(a){this.removePlotBandOrLine(a)}})})(I,T);(function(a){var x=a.dateFormat,C=a.each,E=a.extend,D=a.format,m=a.isNumber,g=a.map,d=a.merge,r=a.pick,l=a.splat,n=a.syncTimeout,k=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,d){this.chart=a;this.options=d;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=d.split&&!a.inverted;this.shared=d.shared||this.split},cleanSplit:function(a){C(this.chart.series,function(c){var f=\nc&&c.tt;f&&(!f.isActive||a?c.tt=f.destroy():f.isActive=!1)})},applyFilter:function(){var a=this.chart;a.renderer.definition({tagName:\"filter\",id:\"drop-shadow-\"+a.index,opacity:.5,children:[{tagName:\"feGaussianBlur\",in:\"SourceAlpha\",stdDeviation:1},{tagName:\"feOffset\",dx:1,dy:1},{tagName:\"feComponentTransfer\",children:[{tagName:\"feFuncA\",type:\"linear\",slope:.3}]},{tagName:\"feMerge\",children:[{tagName:\"feMergeNode\"},{tagName:\"feMergeNode\",in:\"SourceGraphic\"}]}]});a.renderer.definition({tagName:\"style\",\ntextContent:\".highcharts-tooltip-\"+a.index+\"{filter:url(#drop-shadow-\"+a.index+\")}\"})},getLabel:function(){var a=this.chart.renderer,d=this.options;this.label||(this.label=this.split?a.g(\"tooltip\"):a.label(\"\",0,0,d.shape||\"callout\",null,null,d.useHTML,null,\"tooltip\").attr({padding:d.padding,r:d.borderRadius}),this.applyFilter(),this.label.addClass(\"highcharts-tooltip-\"+this.chart.index),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();d(!0,this.chart.options.tooltip.userOptions,\na);this.init(this.chart,d(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,d,f,b){var e=this,c=e.now,g=!1!==e.options.animation&&!e.isHidden&&(1<Math.abs(a-c.x)||1<Math.abs(d-c.y)),k=e.followPointer||1<e.len;E(c,{x:g?(2*c.x+a)/3:a,y:g?(c.y+d)/2:d,anchorX:k?void 0:g?(2*c.anchorX+f)/3:f,anchorY:k?void 0:g?\n(c.anchorY+b)/2:b});e.getLabel().attr(c);g&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,d,f,b)},32))},hide:function(a){var c=this;clearTimeout(this.hideTimer);a=r(a,this.options.hideDelay,500);this.isHidden||(this.hideTimer=n(function(){c.getLabel()[a?\"fadeOut\":\"hide\"]();c.isHidden=!0},a))},getAnchor:function(a,d){var f,b=this.chart,e=b.inverted,c=b.plotTop,k=b.plotLeft,n=0,m=0,B,v;a=l(a);f=a[0].tooltipPos;this.followPointer&&d&&(void 0===d.chartX&&(d=\nb.pointer.normalize(d)),f=[d.chartX-b.plotLeft,d.chartY-c]);f||(C(a,function(a){B=a.series.yAxis;v=a.series.xAxis;n+=a.plotX+(!e&&v?v.left-k:0);m+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&B?B.top-c:0)}),n/=a.length,m/=a.length,f=[e?b.plotWidth-m:n,this.shared&&!e&&1<a.length&&d?d.chartY-c:e?b.plotHeight-n:m]);return g(f,Math.round)},getPosition:function(a,d,f){var b=this.chart,e=this.distance,c={},g=f.h||0,k,l=[\"y\",b.chartHeight,d,f.plotY+b.plotTop,b.plotTop,b.plotTop+b.plotHeight],B=[\"x\",\nb.chartWidth,a,f.plotX+b.plotLeft,b.plotLeft,b.plotLeft+b.plotWidth],n=!this.followPointer&&r(f.ttBelow,!b.inverted===!!f.negative),t=function(a,b,h,f,d,p){var k=h<f-e,q=f+e+h<b,w=f-e-h;f+=e;if(n&&q)c[a]=f;else if(!n&&k)c[a]=w;else if(k)c[a]=Math.min(p-h,0>w-g?w:w-g);else if(q)c[a]=Math.max(d,f+g+h>b?f:f+g);else return!1},m=function(a,b,h,f){var d;f<e||f>b-e?d=!1:c[a]=f<h/2?1:f>b-h/2?b-h-2:f-h/2;return d},z=function(a){var b=l;l=B;B=b;k=a},A=function(){!1!==t.apply(0,l)?!1!==m.apply(0,B)||k||(z(!0),\nA()):k?c.x=c.y=0:(z(!0),A())};(b.inverted||1<this.len)&&z();A();return c},defaultFormatter:function(a){var c=this.points||l(this),f;f=[a.tooltipFooterHeaderFormatter(c[0])];f=f.concat(a.bodyFormatter(c));f.push(a.tooltipFooterHeaderFormatter(c[0],!0));return f},refresh:function(a,d){var f,b,e=a,c,g={},k=[];f=this.options.formatter||this.defaultFormatter;var g=this.shared,n;clearTimeout(this.hideTimer);this.followPointer=l(e)[0].series.tooltipOptions.followPointer;c=this.getAnchor(e,d);d=c[0];b=c[1];\n!g||e.series&&e.series.noSharedTooltip?g=e.getLabelConfig():(C(e,function(a){a.setState(\"hover\");k.push(a.getLabelConfig())}),g={x:e[0].category,y:e[0].y},g.points=k,e=e[0]);this.len=k.length;g=f.call(g,this);n=e.series;this.distance=r(n.tooltipOptions.distance,16);!1===g?this.hide():(f=this.getLabel(),this.isHidden&&f.attr({opacity:1}).show(),this.split?this.renderSplit(g,a):(f.css({width:this.chart.spacingBox.width}),f.attr({text:g&&g.join?g.join(\"\"):g}),f.removeClass(/highcharts-color-[\\d]+/g).addClass(\"highcharts-color-\"+\nr(e.colorIndex,n.colorIndex)),this.updatePosition({plotX:d,plotY:b,negative:e.negative,ttBelow:e.ttBelow,h:c[2]||0})),this.isHidden=!1)},renderSplit:function(c,d){var f=this,b=[],e=this.chart,p=e.renderer,g=!0,k=this.options,l,n=this.getLabel();C(c.slice(0,d.length+1),function(a,c){c=d[c-1]||{isHeader:!0,plotX:d[0].plotX};var u=c.series||f,z=u.tt,A=\"highcharts-color-\"+r(c.colorIndex,(c.series||{}).colorIndex,\"none\");z||(u.tt=z=p.label(null,null,null,\"callout\").addClass(\"highcharts-tooltip-box \"+A).attr({padding:k.padding,\nr:k.borderRadius}).add(n));z.isActive=!0;z.attr({text:a});a=z.getBBox();A=a.width+z.strokeWidth();c.isHeader?(l=a.height,A=Math.max(0,Math.min(c.plotX+e.plotLeft-A/2,e.chartWidth-A))):A=c.plotX+e.plotLeft-r(k.distance,16)-A;0>A&&(g=!1);a=(c.series&&c.series.yAxis&&c.series.yAxis.pos)+(c.plotY||0);a-=e.plotTop;b.push({target:c.isHeader?e.plotHeight+l:a,rank:c.isHeader?1:0,size:u.tt.getBBox().height+1,point:c,x:A,tt:z})});this.cleanSplit();a.distribute(b,e.plotHeight+l);C(b,function(a){var b=a.point,\nf=b.series;a.tt.attr({visibility:void 0===a.pos?\"hidden\":\"inherit\",x:g||b.isHeader?a.x:b.plotX+e.plotLeft+r(k.distance,16),y:a.pos+e.plotTop,anchorX:b.isHeader?b.plotX+e.plotLeft:b.plotX+f.xAxis.pos,anchorY:b.isHeader?a.pos+e.plotTop-15:b.plotY+f.yAxis.pos})})},updatePosition:function(a){var c=this.chart,f=this.getLabel(),f=(this.options.positioner||this.getPosition).call(this,f.width,f.height,a);this.move(Math.round(f.x),Math.round(f.y||0),a.plotX+c.plotLeft,a.plotY+c.plotTop)},getDateFormat:function(a,\nd,f,b){var e=x(\"%m-%d %H:%M:%S.%L\",d),c,g,l={millisecond:15,second:12,minute:9,hour:6,day:3},n=\"millisecond\";for(g in k){if(a===k.week&&+x(\"%w\",d)===f&&\"00:00:00.000\"===e.substr(6)){g=\"week\";break}if(k[g]>a){g=n;break}if(l[g]&&e.substr(l[g])!==\"01-01 00:00:00.000\".substr(l[g]))break;\"week\"!==g&&(n=g)}g&&(c=b[g]);return c},getXDateFormat:function(a,d,f){d=d.dateTimeLabelFormats;var b=f&&f.closestPointRange;return(b?this.getDateFormat(b,a.x,f.options.startOfWeek,d):d.day)||d.year},tooltipFooterHeaderFormatter:function(a,\nd){var f=d?\"footer\":\"header\";d=a.series;var b=d.tooltipOptions,e=b.xDateFormat,c=d.xAxis,g=c&&\"datetime\"===c.options.type&&m(a.key),f=b[f+\"Format\"];g&&!e&&(e=this.getXDateFormat(a,b,c));g&&e&&(f=f.replace(\"{point.key}\",\"{point.key:\"+e+\"}\"));return D(f,{point:a,series:d})},bodyFormatter:function(a){return g(a,function(a){var f=a.series.tooltipOptions;return(f.pointFormatter||a.point.tooltipFormatter).call(a.point,f.pointFormat)})}}})(I);(function(a){var x=a.addEvent,C=a.attr,E=a.charts,D=a.css,m=a.defined,\ng=a.doc,d=a.each,r=a.extend,l=a.fireEvent,n=a.offset,k=a.pick,c=a.removeEvent,v=a.splat,f=a.Tooltip,b=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};f&&b.tooltip.enabled&&(a.tooltip=new f(a,b.tooltip),this.followTouchMove=k(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,e=b.options.chart,f=\ne.zoomType||\"\",b=b.inverted;/touch/.test(a.type)&&(f=k(e.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,f){var e,c;a=a||b.event;a.target||(a.target=a.srcElement);c=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;f||(this.chartPosition=f=n(this.chart.container));void 0===c.pageX?(e=Math.max(a.x,a.clientX-f.left),f=a.y):(e=c.pageX-f.left,f=c.pageY-f.top);return r(a,{chartX:Math.round(e),\nchartY:Math.round(f)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};d(this.chart.axes,function(e){b[e.isXAxis?\"xAxis\":\"yAxis\"].push({axis:e,value:e.toValue(a[e.horiz?\"chartX\":\"chartY\"])})});return b},getKDPoints:function(a,b,f){var e=[],c,g,p;d(a,function(a){c=a.noSharedTooltip&&b;g=!b&&a.directTouch;a.visible&&!g&&k(a.options.enableMouseTracking,!0)&&(p=a.searchPoint(f,!c&&0>a.options.findNearestPointBy.indexOf(\"y\")))&&p.series&&e.push(p)});e.sort(function(a,e){var f=a.distX-e.distX,c=a.dist-\ne.dist,d=(e.series.group&&e.series.group.zIndex)-(a.series.group&&a.series.group.zIndex);return 0!==f&&b?f:0!==c?c:0!==d?d:a.series.index>e.series.index?-1:1});if(b&&e[0]&&!e[0].series.noSharedTooltip)for(a=e.length;a--;)(e[a].x!==e[0].x||e[a].series.noSharedTooltip)&&e.splice(a,1);return e},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode;return b},getChartCoordinatesFromPoint:function(a,b){var e=a.series,f=e.xAxis,e=e.yAxis;if(f&&e)return b?{chartX:f.len+f.pos-\na.clientX,chartY:e.len+e.pos-a.plotY}:{chartX:a.clientX+f.pos,chartY:a.plotY+e.pos}},getHoverData:function(b,f,c,d,g,k){var e=b,p=f,e=g?c:[p];d=!(!d||!b);f=p&&!p.stickyTracking;var u=function(a,b){return 0===b},z;d?u=function(a){return a===b}:f?u=function(a){return a.series===p}:e=a.grep(c,function(a){return a.stickyTracking});z=d&&!g?[b]:this.getKDPoints(e,g,k);p=(e=a.find(z,u))&&e.series;d||f||!g||(z=this.getKDPoints(c,g,k));z.sort(function(a,b){return a.series.index-b.series.index});return{hoverPoint:e,\nhoverSeries:p,hoverPoints:z}},runPointActions:function(b,f){var e=this.chart,c=e.tooltip,p=c?c.shared:!1,l=f||e.hoverPoint,n=l&&l.series||e.hoverSeries;f=this.getHoverData(l,n,e.series,!!f||n&&n.directTouch&&this.isDirectTouch,p,b);var t,m,l=f.hoverPoint;t=(n=f.hoverSeries)&&n.tooltipOptions.followPointer;m=(p=p&&l&&!l.series.noSharedTooltip)?f.hoverPoints:l?[l]:[];if(l&&(l!==e.hoverPoint||c&&c.isHidden)){d(e.hoverPoints||[],function(b){-1===a.inArray(b,m)&&b.setState()});d(m||[],function(a){a.setState(\"hover\")});\nif(e.hoverSeries!==n)n.onMouseOver();e.hoverPoint&&e.hoverPoint.firePointEvent(\"mouseOut\");l.firePointEvent(\"mouseOver\");e.hoverPoints=m;e.hoverPoint=l;c&&c.refresh(p?m:l,b)}else t&&c&&!c.isHidden&&(n=c.getAnchor([{}],b),c.updatePosition({plotX:n[0],plotY:n[1]}));this.unDocMouseMove||(this.unDocMouseMove=x(g,\"mousemove\",function(b){var e=E[a.hoverChartIndex];if(e)e.pointer.onDocumentMouseMove(b)}));d(e.axes,function(e){k(e.crosshair.snap,!0)?a.find(m,function(a){return a.series[e.coll]===e})?e.drawCrosshair(b,\nl):e.hideCrosshair():e.drawCrosshair(b)})},reset:function(a,b){var e=this.chart,f=e.hoverSeries,c=e.hoverPoint,g=e.hoverPoints,p=e.tooltip,k=p&&p.shared?g:c;a&&k&&d(v(k),function(b){b.series.isCartesian&&void 0===b.plotX&&(a=!1)});if(a)p&&k&&(p.refresh(k),c&&(c.setState(c.state,!0),d(e.axes,function(a){a.crosshair&&a.drawCrosshair(null,c)})));else{if(c)c.onMouseOut();g&&d(g,function(a){a.setState()});if(f)f.onMouseOut();p&&p.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());\nd(e.axes,function(a){a.hideCrosshair()});this.hoverX=e.hoverPoints=e.hoverPoint=null}},scaleGroups:function(a,b){var e=this.chart,f;d(e.series,function(c){f=a||c.getPlotBox();c.xAxis&&c.xAxis.zoomEnabled&&c.group&&(c.group.attr(f),c.markerGroup&&(c.markerGroup.attr(f),c.markerGroup.clip(b?e.clipRect:null)),c.dataLabelsGroup&&c.dataLabelsGroup.attr(f))});e.clipRect.attr(b||e.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;\nb.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,e=b.options.chart,f=a.chartX,c=a.chartY,d=this.zoomHor,g=this.zoomVert,k=b.plotLeft,l=b.plotTop,z=b.plotWidth,A=b.plotHeight,w,n=this.selectionMarker,h=this.mouseDownX,q=this.mouseDownY,m=e.panKey&&a[e.panKey+\"Key\"];n&&n.touch||(f<k?f=k:f>k+z&&(f=k+z),c<l?c=l:c>l+A&&(c=l+A),this.hasDragged=Math.sqrt(Math.pow(h-f,2)+Math.pow(q-c,2)),10<this.hasDragged&&(w=b.isInsidePlot(h-k,q-l),b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&\nw&&!m&&!n&&(this.selectionMarker=n=b.renderer.rect(k,l,d?1:z,g?1:A,0).attr({\"class\":\"highcharts-selection-marker\",zIndex:7}).add()),n&&d&&(f-=h,n.attr({width:Math.abs(f),x:(0<f?0:f)+h})),n&&g&&(f=c-q,n.attr({height:Math.abs(f),y:(0<f?0:f)+q})),w&&!n&&e.panning&&b.pan(a,e.panning)))},drop:function(a){var b=this,e=this.chart,f=this.hasPinched;if(this.selectionMarker){var c={originalEvent:a,xAxis:[],yAxis:[]},g=this.selectionMarker,k=g.attr?g.attr(\"x\"):g.x,n=g.attr?g.attr(\"y\"):g.y,v=g.attr?g.attr(\"width\"):\ng.width,z=g.attr?g.attr(\"height\"):g.height,A;if(this.hasDragged||f)d(e.axes,function(e){if(e.zoomEnabled&&m(e.min)&&(f||b[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[e.coll]])){var d=e.horiz,h=\"touchend\"===a.type?e.minPixelPadding:0,g=e.toValue((d?k:n)+h),d=e.toValue((d?k+v:n+z)-h);c[e.coll].push({axis:e,min:Math.min(g,d),max:Math.max(g,d)});A=!0}}),A&&l(e,\"selection\",c,function(a){e.zoom(r(a,f?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();f&&this.scaleGroups()}e&&(D(e.container,{cursor:e._cursor}),\ne.cancelClick=10<this.hasDragged,e.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);this.zoomOption(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(b){E[a.hoverChartIndex]&&E[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=this.chart,e=this.chartPosition;a=this.normalize(a,e);!e||this.inClass(a.target,\"highcharts-tracker\")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-\nb.plotTop)||this.reset()},onContainerMouseLeave:function(b){var e=E[a.hoverChartIndex];e&&(b.relatedTarget||b.toElement)&&(e.pointer.reset(),e.pointer.chartPosition=null)},onContainerMouseMove:function(b){var e=this.chart;m(a.hoverChartIndex)&&E[a.hoverChartIndex]&&E[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=e.index);b=this.normalize(b);b.returnValue=!1;\"mousedown\"===e.mouseIsDown&&this.drag(b);!this.inClass(b.target,\"highcharts-tracker\")&&!e.isInsidePlot(b.chartX-e.plotLeft,b.chartY-e.plotTop)||\ne.openMenu||this.runPointActions(b)},inClass:function(a,b){for(var e;a;){if(e=C(a,\"class\")){if(-1!==e.indexOf(b))return!0;if(-1!==e.indexOf(\"highcharts-container\"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;this.isDirectTouch=!1;if(!(!b||!a||b.stickyTracking||this.inClass(a,\"highcharts-tooltip\")||this.inClass(a,\"highcharts-series-\"+b.index)&&this.inClass(a,\"highcharts-tracker\")))b.onMouseOut()},onContainerClick:function(a){var b=\nthis.chart,e=b.hoverPoint,f=b.plotLeft,c=b.plotTop;a=this.normalize(a);b.cancelClick||(e&&this.inClass(a.target,\"highcharts-tracker\")?(l(e.series,\"click\",r(a,{point:e})),b.hoverPoint&&e.firePointEvent(\"click\",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-f,a.chartY-c)&&l(b,\"click\",a)))},setDOMEvents:function(){var b=this,f=b.chart.container;f.onmousedown=function(a){b.onContainerMouseDown(a)};f.onmousemove=function(a){b.onContainerMouseMove(a)};f.onclick=function(a){b.onContainerClick(a)};\nx(f,\"mouseleave\",b.onContainerMouseLeave);1===a.chartCount&&x(g,\"mouseup\",b.onDocumentMouseUp);a.hasTouch&&(f.ontouchstart=function(a){b.onContainerTouchStart(a)},f.ontouchmove=function(a){b.onContainerTouchMove(a)},1===a.chartCount&&x(g,\"touchend\",b.onDocumentTouchEnd))},destroy:function(){var b=this;b.unDocMouseMove&&b.unDocMouseMove();c(b.chart.container,\"mouseleave\",b.onContainerMouseLeave);a.chartCount||(c(g,\"mouseup\",b.onDocumentMouseUp),c(g,\"touchend\",b.onDocumentTouchEnd));clearInterval(b.tooltipTimeout);\na.objectEach(b,function(a,e){b[e]=null})}}})(I);(function(a){var x=a.charts,C=a.each,E=a.extend,D=a.map,m=a.noop,g=a.pick;E(a.Pointer.prototype,{pinchTranslate:function(a,g,l,n,k,c){this.zoomHor&&this.pinchTranslateDirection(!0,a,g,l,n,k,c);this.zoomVert&&this.pinchTranslateDirection(!1,a,g,l,n,k,c)},pinchTranslateDirection:function(a,g,l,n,k,c,m,f){var b=this.chart,e=a?\"x\":\"y\",d=a?\"X\":\"Y\",u=\"chart\"+d,v=a?\"width\":\"height\",r=b[\"plot\"+(a?\"Left\":\"Top\")],B,H,t=f||1,G=b.inverted,z=b.bounds[a?\"h\":\"v\"],\nA=1===g.length,w=g[0][u],J=l[0][u],h=!A&&g[1][u],q=!A&&l[1][u],Q;l=function(){!A&&20<Math.abs(w-h)&&(t=f||Math.abs(J-q)/Math.abs(w-h));H=(r-J)/t+w;B=b[\"plot\"+(a?\"Width\":\"Height\")]/t};l();g=H;g<z.min?(g=z.min,Q=!0):g+B>z.max&&(g=z.max-B,Q=!0);Q?(J-=.8*(J-m[e][0]),A||(q-=.8*(q-m[e][1])),l()):m[e]=[J,q];G||(c[e]=H-r,c[v]=B);c=G?1/t:t;k[v]=B;k[e]=g;n[G?a?\"scaleY\":\"scaleX\":\"scale\"+d]=t;n[\"translate\"+d]=c*r+(J-c*w)},pinch:function(a){var d=this,l=d.chart,n=d.pinchDown,k=a.touches,c=k.length,v=d.lastValidTouch,\nf=d.hasZoom,b=d.selectionMarker,e={},p=1===c&&(d.inClass(a.target,\"highcharts-tracker\")&&l.runTrackerClick||d.runChartClick),u={};1<c&&(d.initiated=!0);f&&d.initiated&&!p&&a.preventDefault();D(k,function(a){return d.normalize(a)});\"touchstart\"===a.type?(C(k,function(a,b){n[b]={chartX:a.chartX,chartY:a.chartY}}),v.x=[n[0].chartX,n[1]&&n[1].chartX],v.y=[n[0].chartY,n[1]&&n[1].chartY],C(l.axes,function(a){if(a.zoomEnabled){var b=l.bounds[a.horiz?\"h\":\"v\"],e=a.minPixelPadding,f=a.toPixels(g(a.options.min,\na.dataMin)),c=a.toPixels(g(a.options.max,a.dataMax)),d=Math.max(f,c);b.min=Math.min(a.pos,Math.min(f,c)-e);b.max=Math.max(a.pos+a.len,d+e)}}),d.res=!0):d.followTouchMove&&1===c?this.runPointActions(d.normalize(a)):n.length&&(b||(d.selectionMarker=b=E({destroy:m,touch:!0},l.plotBox)),d.pinchTranslate(n,k,e,b,u,v),d.hasPinched=f,d.scaleGroups(e,u),d.res&&(d.res=!1,this.reset(!1,0)))},touch:function(d,m){var l=this.chart,n,k;if(l.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});\na.hoverChartIndex=l.index;1===d.touches.length?(d=this.normalize(d),(k=l.isInsidePlot(d.chartX-l.plotLeft,d.chartY-l.plotTop))&&!l.openMenu?(m&&this.runPointActions(d),\"touchmove\"===d.type&&(m=this.pinchDown,n=m[0]?4<=Math.sqrt(Math.pow(m[0].chartX-d.chartX,2)+Math.pow(m[0].chartY-d.chartY,2)):!1),g(n,!0)&&this.pinch(d)):m&&this.reset()):2===d.touches.length&&this.pinch(d)},onContainerTouchStart:function(a){this.zoomOption(a);this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(d){x[a.hoverChartIndex]&&\nx[a.hoverChartIndex].pointer.drop(d)}})})(I);(function(a){var x=a.addEvent,C=a.charts,E=a.css,D=a.doc,m=a.extend,g=a.noop,d=a.Pointer,r=a.removeEvent,l=a.win,n=a.wrap;if(!a.hasTouch&&(l.PointerEvent||l.MSPointerEvent)){var k={},c=!!l.PointerEvent,v=function(){var b=[];b.item=function(a){return this[a]};a.objectEach(k,function(a){b.push({pageX:a.pageX,pageY:a.pageY,target:a.target})});return b},f=function(b,f,c,d){\"touch\"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!C[a.hoverChartIndex]||\n(d(b),d=C[a.hoverChartIndex].pointer,d[f]({type:c,target:b.currentTarget,preventDefault:g,touches:v()}))};m(d.prototype,{onContainerPointerDown:function(a){f(a,\"onContainerTouchStart\",\"touchstart\",function(a){k[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){f(a,\"onContainerTouchMove\",\"touchmove\",function(a){k[a.pointerId]={pageX:a.pageX,pageY:a.pageY};k[a.pointerId].target||(k[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){f(a,\n\"onDocumentTouchEnd\",\"touchend\",function(a){delete k[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,c?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);a(this.chart.container,c?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);a(D,c?\"pointerup\":\"MSPointerUp\",this.onDocumentPointerUp)}});n(d.prototype,\"init\",function(a,f,c){a.call(this,f,c);this.hasZoom&&E(f.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})});n(d.prototype,\"setDOMEvents\",function(a){a.apply(this);\n(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(x)});n(d.prototype,\"destroy\",function(a){this.batchMSEvents(r);a.call(this)})}})(I);(function(a){var x=a.addEvent,C=a.css,E=a.discardElement,D=a.defined,m=a.each,g=a.isFirefox,d=a.marginNames,r=a.merge,l=a.pick,n=a.setAnimation,k=a.stableSort,c=a.win,v=a.wrap;a.Legend=function(a,b){this.init(a,b)};a.Legend.prototype={init:function(a,b){this.chart=a;this.setOptions(b);b.enabled&&(this.render(),x(this.chart,\"endResize\",function(){this.legend.positionCheckboxes()}))},\nsetOptions:function(a){var b=l(a.padding,8);this.options=a;this.itemMarginTop=a.itemMarginTop||0;this.padding=b;this.initialItemY=b-5;this.itemHeight=this.maxItemWidth=0;this.symbolWidth=l(a.symbolWidth,16);this.pages=[]},update:function(a,b){var f=this.chart;this.setOptions(r(!0,this.options,a));this.destroy();f.isDirtyLegend=f.isDirtyBox=!0;l(b,!0)&&f.redraw()},colorizeItem:function(a,b){a.legendGroup[b?\"removeClass\":\"addClass\"](\"highcharts-legend-item-hidden\")},positionItem:function(a){var b=this.options,\nf=b.symbolPadding,b=!b.rtl,c=a._legendItemPos,d=c[0],c=c[1],g=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?d:this.legendWidth-d-2*f-4,c);g&&(g.x=d,g.y=c)},destroyItem:function(a){var b=a.checkbox;m([\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}m(this.getAllItems(),function(b){m([\"legendItem\",\"legendGroup\"],a,b)});m(\"clipRect up down pager nav box title group\".split(\" \"),\na,this);this.display=null},positionCheckboxes:function(a){var b=this.group&&this.group.alignAttr,f,c=this.clipHeight||this.legendHeight,d=this.titleHeight;b&&(f=b.translateY,m(this.allItems,function(e){var g=e.checkbox,k;g&&(k=f+d+g.y+(a||0)+3,C(g,{left:b.translateX+e.checkboxOffset+g.x-20+\"px\",top:k+\"px\",display:k>f-6&&k<f+c-6?\"\":\"none\"}))}))},renderTitle:function(){var a=this.options,b=this.padding,e=a.title,c=0;e.text&&(this.title||(this.title=this.chart.renderer.label(e.text,b-3,b-4,null,null,\nnull,a.useHTML,null,\"legend-title\").attr({zIndex:1}).add(this.group)),a=this.title.getBBox(),c=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:c}));this.titleHeight=c},setText:function(f){var b=this.options;f.legendItem.attr({text:b.labelFormat?a.format(b.labelFormat,f):b.labelFormatter.call(f)})},renderItem:function(a){var b=this.chart,e=b.renderer,f=this.options,c=\"horizontal\"===f.layout,d=this.symbolWidth,g=f.symbolPadding,k=this.padding,n=c?l(f.itemDistance,20):0,t=!f.rtl,\nm=f.width,z=f.itemMarginBottom||0,A=this.itemMarginTop,w=a.legendItem,v=!a.series,h=!v&&a.series.drawLegendSymbol?a.series:a,q=h.options,r=this.createCheckboxForItem&&q&&q.showCheckbox,q=d+g+n+(r?20:0),K=f.useHTML,N=a.options.className;w||(a.legendGroup=e.g(\"legend-item\").addClass(\"highcharts-\"+h.type+\"-series highcharts-color-\"+a.colorIndex+(N?\" \"+N:\"\")+(v?\" highcharts-series-\"+a.index:\"\")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=w=e.text(\"\",t?d+g:-g,this.baseline||0,K).attr({align:t?\n\"left\":\"right\",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=e.fontMetrics(12,w),this.baseline=this.fontMetrics.f+3+A,w.attr(\"y\",this.baseline)),this.symbolHeight=f.symbolHeight||this.fontMetrics.f,h.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,w,K),r&&this.createCheckboxForItem(a));this.colorizeItem(a,a.visible);w.css({width:(f.itemWidth||b.spacingBox.width)-q});this.setText(a);e=w.getBBox();d=a.checkboxOffset=f.itemWidth||a.legendItemWidth||e.width+q;this.itemHeight=\ne=Math.round(a.legendItemHeight||e.height||this.symbolHeight);c&&this.itemX-k+d>(m||b.spacingBox.width-2*k-f.x)&&(this.itemX=k,this.itemY+=A+this.lastLineHeight+z,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,d);this.lastItemY=A+this.itemY+z;this.lastLineHeight=Math.max(e,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];c?this.itemX+=d:(this.itemY+=A+e+z,this.lastLineHeight=e);this.offsetWidth=m||Math.max((c?this.itemX-k-n:d)+k,this.offsetWidth)},getAllItems:function(){var a=\n[];m(this.chart.series,function(b){var f=b&&b.options;b&&l(f.showInLegend,D(f.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||(\"point\"===f.legendType?b.data:b)))});return a},adjustMargins:function(a,b){var f=this.chart,c=this.options,g=c.align.charAt(0)+c.verticalAlign.charAt(0)+c.layout.charAt(0);c.floating||m([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(e,k){e.test(g)&&!D(a[k])&&(f[d[k]]=Math.max(f[d[k]],f.legend[(k+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][k]*\nc[k%2?\"x\":\"y\"]+l(c.margin,12)+b[k]))})},render:function(){var a=this,b=a.chart,e=b.renderer,c=a.group,d,g,l,n,v=a.box,t=a.options,G=a.padding;a.itemX=G;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;c||(a.group=c=e.g(\"legend\").attr({zIndex:7}).add(),a.contentGroup=e.g().attr({zIndex:1}).add(c),a.scrollGroup=e.g().add(a.contentGroup));a.renderTitle();d=a.getAllItems();k(d,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});t.reversed&&d.reverse();\na.allItems=d;a.display=g=!!d.length;a.lastLineHeight=0;m(d,function(b){a.renderItem(b)});l=(t.width||a.offsetWidth)+G;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=G;v||(a.box=v=e.rect().addClass(\"highcharts-legend-box\").attr({r:t.borderRadius}).add(c),v.isNew=!0);0<l&&0<n&&(v[v.isNew?\"attr\":\"animate\"](v.crisp({x:0,y:0,width:l,height:n},v.strokeWidth())),v.isNew=!1);v[g?\"show\":\"hide\"]();\"none\"===c.getStyle(\"display\")&&(l=n=0);a.legendWidth=l;a.legendHeight=n;m(d,function(b){a.positionItem(b)});\ng&&c.align(r(t,{width:l,height:n}),!0,\"spacingBox\");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,e=this.chart,c=e.renderer,f=this.options,d=f.y,g=this.padding,e=e.spacingBox.height+(\"top\"===f.verticalAlign?-d:d)-g,d=f.maxHeight,k,n=this.clipRect,t=f.navigation,v=l(t.animation,!0),z=t.arrowSize||12,A=this.nav,w=this.pages,r,h=this.allItems,q=function(a){\"number\"===typeof a?n.attr({height:a}):n&&(b.clipRect=n.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=\na?\"rect(\"+g+\"px,9999px,\"+(g+a)+\"px,0)\":\"auto\")};\"horizontal\"!==f.layout||\"middle\"===f.verticalAlign||f.floating||(e/=2);d&&(e=Math.min(e,d));w.length=0;a>e&&!1!==t.enabled?(this.clipHeight=k=Math.max(e-20-this.titleHeight-g,0),this.currentPage=l(this.currentPage,1),this.fullHeight=a,m(h,function(a,b){var e=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var c=w.length;if(!c||e-w[c-1]>k&&(r||e)!==w[c-1])w.push(r||e),c++;b===h.length-1&&e+a-w[c-1]>k&&w.push(e);e!==r&&(r=e)}),n||(n=b.clipRect=\nc.clipRect(0,g,9999,0),b.contentGroup.clip(n)),q(k),A||(this.nav=A=c.g().attr({zIndex:1}).add(this.group),this.up=c.symbol(\"triangle\",0,0,z,z).on(\"click\",function(){b.scroll(-1,v)}).add(A),this.pager=c.text(\"\",15,10).addClass(\"highcharts-legend-navigation\").add(A),this.down=c.symbol(\"triangle-down\",0,0,z,z).on(\"click\",function(){b.scroll(1,v)}).add(A)),b.scroll(0),a=e):A&&(q(),this.nav=A.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,b){var e=this.pages,\nc=e.length;a=this.currentPage+a;var f=this.clipHeight,d=this.pager,g=this.padding;a>c&&(a=c);0<a&&(void 0!==b&&n(b,this.chart),this.nav.attr({translateX:g,translateY:f+this.padding+7+this.titleHeight,visibility:\"visible\"}),this.up.attr({\"class\":1===a?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"}),d.attr({text:a+\"/\"+c}),this.down.attr({x:18+this.pager.getBBox().width,\"class\":a===c?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"}),b=-e[a-1]+this.initialItemY,this.scrollGroup.animate({translateY:b}),\nthis.currentPage=a,this.positionCheckboxes(b))}};a.LegendSymbolMixin={drawRectangle:function(a,b){var e=a.symbolHeight,c=a.options.squareSymbol;b.legendSymbol=this.chart.renderer.rect(c?(a.symbolWidth-e)/2:0,a.baseline-e+1,c?e:a.symbolWidth,e,l(a.options.symbolRadius,e/2)).addClass(\"highcharts-point\").attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options.marker,e,c=a.symbolWidth,f=a.symbolHeight;e=f/2;var d=this.chart.renderer,g=this.legendGroup;a=a.baseline-Math.round(.3*\na.fontMetrics.b);this.legendLine=d.path([\"M\",0,a,\"L\",c,a]).addClass(\"highcharts-graph\").attr({}).add(g);b&&!1!==b.enabled&&(e=Math.min(l(b.radius,e),e),0===this.symbol.indexOf(\"url\")&&(b=r(b,{width:f,height:f}),e=0),this.legendSymbol=b=d.symbol(this.symbol,c/2-e,a-e,2*e,2*e,b).addClass(\"highcharts-point\").add(g),b.isMarker=!0)}};(/Trident\\/7\\.0/.test(c.navigator.userAgent)||g)&&v(a.Legend.prototype,\"positionItem\",function(a,b){var e=this,c=function(){b._legendItemPos&&a.call(e,b)};c();setTimeout(c)})})(I);\n(function(a){var x=a.addEvent,C=a.animObject,E=a.attr,D=a.doc,m=a.Axis,g=a.createElement,d=a.defaultOptions,r=a.discardElement,l=a.charts,n=a.defined,k=a.each,c=a.extend,v=a.find,f=a.fireEvent,b=a.getStyle,e=a.grep,p=a.isNumber,u=a.isObject,F=a.isString,L=a.Legend,B=a.marginNames,H=a.merge,t=a.objectEach,G=a.Pointer,z=a.pick,A=a.pInt,w=a.removeEvent,J=a.seriesTypes,h=a.splat,q=a.svg,Q=a.syncTimeout,K=a.win,N=a.Renderer,M=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,\ne){return new M(a,b,e)};c(M.prototype,{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(F(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(b,e){var c,f,h=b.series,g=b.plotOptions||{};b.series=null;c=H(d,b);for(f in c.plotOptions)c.plotOptions[f].tooltip=g[f]&&H(g[f].tooltip)||void 0;c.tooltip.userOptions=b.chart&&b.chart.forExport&&b.tooltip.userOptions||b.tooltip;c.series=b.series=h;this.userOptions=b;b=c.chart;f=b.events;this.margin=[];this.spacing=\n[];this.bounds={h:{},v:{}};this.callback=e;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=b.showAxes;var k=this;k.index=l.length;l.push(k);a.chartCount++;f&&t(f,function(a,b){x(k,b,a)});k.xAxis=[];k.yAxis=[];k.pointCount=k.colorCounter=k.symbolCounter=0;k.firstRender()},initSeries:function(b){var c=this.options.chart;(c=J[b.type||c.type||c.defaultSeriesType])||a.error(17,!0);c=new c;c.init(this,b);return c},orderSeries:function(a){var b=this.series;for(a=a||0;a<\nb.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].name||\"Series \"+(b[a].index+1))},isInsidePlot:function(a,b,c){var e=c?b:a;a=c?a:b;return 0<=e&&e<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(b){var e=this.axes,h=this.series,d=this.pointer,g=this.legend,q=this.isDirtyLegend,w,z,p=this.hasCartesianSeries,A=this.isDirtyBox,l,n=this.renderer,m=n.isHidden(),t=[];this.setResponsive&&this.setResponsive(!1);a.setAnimation(b,this);m&&this.temporaryDisplay();this.layOutTitles();for(b=h.length;b--;)if(l=\nh[b],l.options.stacking&&(w=!0,l.isDirty)){z=!0;break}if(z)for(b=h.length;b--;)l=h[b],l.options.stacking&&(l.isDirty=!0);k(h,function(a){a.isDirty&&\"point\"===a.options.legendType&&(a.updateTotals&&a.updateTotals(),q=!0);a.isDirtyData&&f(a,\"updatedData\")});q&&g.options.enabled&&(g.render(),this.isDirtyLegend=!1);w&&this.getStacks();p&&k(e,function(a){a.updateNames();a.setScale()});this.getMargins();p&&(k(e,function(a){a.isDirty&&(A=!0)}),k(e,function(a){var b=a.min+\",\"+a.max;a.extKey!==b&&(a.extKey=\nb,t.push(function(){f(a,\"afterSetExtremes\",c(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(A||w)&&a.redraw()}));A&&this.drawChartBox();f(this,\"predraw\");k(h,function(a){(A||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});d&&d.reset(!0);n.draw();f(this,\"redraw\");f(this,\"render\");m&&this.temporaryDisplay(!0);k(t,function(a){a.call()})},get:function(a){function b(b){return b.id===a||b.options&&b.options.id===a}var c,e=this.series,f;c=v(this.axes,b)||v(this.series,b);for(f=0;!c&&f<e.length;f++)c=\nv(e[f].points||[],b);return c},getAxes:function(){var a=this,b=this.options,c=b.xAxis=h(b.xAxis||{}),b=b.yAxis=h(b.yAxis||{});k(c,function(a,b){a.index=b;a.isX=!0});k(b,function(a,b){a.index=b});c=c.concat(b);k(c,function(b){new m(a,b)})},getSelectedPoints:function(){var a=[];k(this.series,function(b){a=a.concat(e(b.data||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return e(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var e=this,f=e.options,\nh;h=f.title=H(f.title,a);f=f.subtitle=H(f.subtitle,b);k([[\"title\",a,h],[\"subtitle\",b,f]],function(a,b){var c=a[0],f=e[c],h=a[1];a=a[2];f&&h&&(e[c]=f=f.destroy());a&&a.text&&!f&&(e[c]=e.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,\"class\":\"highcharts-\"+c,zIndex:a.zIndex||4}).add(),e[c].update=function(a){e.setTitle(!b&&a,b&&a)})});e.layOutTitles(c)},layOutTitles:function(a){var b=0,e,f=this.renderer,h=this.spacingBox;k([\"title\",\"subtitle\"],function(a){var e=this[a],d=this.options[a];a=\"title\"===\na?-3:d.verticalAlign?0:b+2;var g;e&&(g=f.fontMetrics(g,e).b,e.css({width:(d.width||h.width+d.widthAdjust)+\"px\"}).align(c({y:a+g},d),!1,\"spacingBox\"),d.floating||d.verticalAlign||(b=Math.ceil(b+e.getBBox(d.useHTML).height)))},this);e=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&e&&(this.isDirtyBox=e,this.hasRendered&&z(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var c=this.options.chart,e=c.width,c=c.height,f=this.renderTo;n(e)||(this.containerWidth=b(f,\"width\"));n(c)||\n(this.containerHeight=b(f,\"height\"));this.chartWidth=Math.max(0,e||this.containerWidth||600);this.chartHeight=Math.max(0,a.relativeLength(c,this.chartWidth)||this.containerHeight||400)},temporaryDisplay:function(c){var e=this.renderTo;if(c)for(;e&&e.style;)e.hcOrigStyle&&(a.css(e,e.hcOrigStyle),delete e.hcOrigStyle),e=e.parentNode;else for(;e&&e.style;)\"none\"===b(e,\"display\",!1)&&(e.hcOrigStyle={display:e.style.display,height:e.style.height,overflow:e.style.overflow},c={display:\"block\",overflow:\"hidden\"},\ne!==this.renderTo&&(c.height=0),a.css(e,c),e.style.setProperty&&e.style.setProperty(\"display\",\"block\",\"important\")),e=e.parentNode},setClassName:function(a){this.container.className=\"highcharts-container \"+(a||\"\")},getContainer:function(){var b,e=this.options,c=e.chart,f,h;b=this.renderTo;var d=a.uniqueKey(),k;b||(this.renderTo=b=c.renderTo);F(b)&&(this.renderTo=b=D.getElementById(b));b||a.error(13,!0);f=A(E(b,\"data-highcharts-chart\"));p(f)&&l[f]&&l[f].hasRendered&&l[f].destroy();E(b,\"data-highcharts-chart\",\nthis.index);b.innerHTML=\"\";c.skipClone||b.offsetWidth||this.temporaryDisplay();this.getChartSize();f=this.chartWidth;h=this.chartHeight;this.container=b=g(\"div\",{id:d},void 0,b);this._cursor=b.style.cursor;this.renderer=new (a[c.renderer]||N)(b,f,h,null,c.forExport,e.exporting&&e.exporting.allowHTML);this.setClassName(c.className);for(k in e.defs)this.renderer.definition(e.defs[k]);this.renderer.chartIndex=this.index},getMargins:function(a){var b=this.spacing,e=this.margin,c=this.titleOffset;this.resetMargins();\nc&&!n(e[0])&&(this.plotTop=Math.max(this.plotTop,c+this.options.title.margin+b[0]));this.legend.display&&this.legend.adjustMargins(e,b);this.extraMargin&&(this[this.extraMargin.type]=(this[this.extraMargin.type]||0)+this.extraMargin.value);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],e=a.margin;a.hasCartesianSeries&&k(a.axes,function(a){a.visible&&a.getOffset()});k(B,function(c,f){n(e[f])||(a[c]+=b[f])});\na.setChartSize()},reflow:function(a){var e=this,c=e.options.chart,f=e.renderTo,h=n(c.width),d=c.width||b(f,\"width\"),c=c.height||b(f,\"height\"),f=a?a.target:K;if(!h&&!e.isPrinting&&d&&c&&(f===K||f===D)){if(d!==e.containerWidth||c!==e.containerHeight)clearTimeout(e.reflowTimeout),e.reflowTimeout=Q(function(){e.container&&e.setSize(void 0,void 0,!1)},a?100:0);e.containerWidth=d;e.containerHeight=c}},initReflow:function(){var a=this,b;b=x(K,\"resize\",function(b){a.reflow(b)});x(a,\"destroy\",b)},setSize:function(b,\ne,c){var h=this,d=h.renderer;h.isResizing+=1;a.setAnimation(c,h);h.oldChartHeight=h.chartHeight;h.oldChartWidth=h.chartWidth;void 0!==b&&(h.options.chart.width=b);void 0!==e&&(h.options.chart.height=e);h.getChartSize();h.setChartSize(!0);d.setSize(h.chartWidth,h.chartHeight,c);k(h.axes,function(a){a.isDirty=!0;a.setScale()});h.isDirtyLegend=!0;h.isDirtyBox=!0;h.layOutTitles();h.getMargins();h.redraw(c);h.oldChartHeight=null;f(h,\"resize\");Q(function(){h&&f(h,\"endResize\",null,function(){--h.isResizing})},\nC(void 0).duration)},setChartSize:function(a){function b(a){a=q[a]||0;return Math.max(l||a,a)/2}var e=this.inverted,c=this.renderer,f=this.chartWidth,h=this.chartHeight,d=this.options.chart,g=this.spacing,q=this.clipOffset,w,z,p,A,l;this.plotLeft=w=Math.round(this.plotLeft);this.plotTop=z=Math.round(this.plotTop);this.plotWidth=p=Math.max(0,Math.round(f-w-this.marginRight));this.plotHeight=A=Math.max(0,Math.round(h-z-this.marginBottom));this.plotSizeX=e?A:p;this.plotSizeY=e?p:A;this.plotBorderWidth=\nd.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:f-g[3]-g[1],height:h-g[0]-g[2]};this.plotBox=c.plotBox={x:w,y:z,width:p,height:A};l=2*Math.floor(this.plotBorderWidth/2);e=Math.ceil(b(3));c=Math.ceil(b(0));this.clipBox={x:e,y:c,width:Math.floor(this.plotSizeX-b(1)-e),height:Math.max(0,Math.floor(this.plotSizeY-b(2)-c))};a||k(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this,b=a.options.chart;k([\"margin\",\"spacing\"],function(e){var c=\nb[e],f=u(c)?c:[c,c,c,c];k([\"Top\",\"Right\",\"Bottom\",\"Left\"],function(c,h){a[e][h]=z(b[e+c],f[h])})});k(B,function(b,e){a[b]=z(a.margin[e],a.spacing[e])});a.axisOffset=[0,0,0,0];a.clipOffset=[]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,e=this.chartWidth,c=this.chartHeight,f=this.chartBackground,h=this.plotBackground,d=this.plotBorder,g,k,q=this.plotLeft,w=this.plotTop,z=this.plotWidth,p=this.plotHeight,A=this.plotBox,l=this.clipRect,n=this.clipBox,m=\"animate\";f||(this.chartBackground=\nf=b.rect().addClass(\"highcharts-background\").add(),m=\"attr\");g=k=f.strokeWidth();f[m]({x:k/2,y:k/2,width:e-k-g%2,height:c-k-g%2,r:a.borderRadius});m=\"animate\";h||(m=\"attr\",this.plotBackground=h=b.rect().addClass(\"highcharts-plot-background\").add());h[m](A);l?l.animate({width:n.width,height:n.height}):this.clipRect=b.clipRect(n);m=\"animate\";d||(m=\"attr\",this.plotBorder=d=b.rect().addClass(\"highcharts-plot-border\").attr({zIndex:1}).add());d[m](d.crisp({x:q,y:w,width:z,height:p},-d.strokeWidth()));this.isDirtyBox=\n!1},propFromSeries:function(){var a=this,b=a.options.chart,e,c=a.options.series,f,h;k([\"inverted\",\"angular\",\"polar\"],function(d){e=J[b.type||b.defaultSeriesType];h=b[d]||e&&e.prototype[d];for(f=c&&c.length;!h&&f--;)(e=J[c[f].type])&&e.prototype[d]&&(h=!0);a[d]=h})},linkSeries:function(){var a=this,b=a.series;k(b,function(a){a.linkedSeries.length=0});k(b,function(b){var e=b.options.linkedTo;F(e)&&(e=\":previous\"===e?a.series[b.index-1]:a.get(e))&&e.linkedParent!==b&&(e.linkedSeries.push(b),b.linkedParent=\ne,b.visible=z(b.options.visible,e.options.visible,b.visible))})},renderSeries:function(){k(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&k(b.items,function(e){var f=c(b.style,e.style),h=A(f.left)+a.plotLeft,d=A(f.top)+a.plotTop+12;delete f.left;delete f.top;a.renderer.text(e.html,h,d).attr({zIndex:2}).css(f).add()})},render:function(){var a=this.axes,b=this.renderer,e=this.options,c,f,h;this.setTitle();this.legend=new L(this,e.legend);\nthis.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();e=this.plotWidth;c=this.plotHeight-=21;k(a,function(a){a.setScale()});this.getAxisMargins();f=1.1<e/this.plotWidth;h=1.05<c/this.plotHeight;if(f||h)k(a,function(a){(a.horiz&&f||!a.horiz&&h)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&k(a,function(a){a.visible&&a.render()});this.seriesGroup||(this.seriesGroup=b.g(\"series-group\").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();\nthis.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},addCredits:function(a){var b=this;a=H(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||\"\"),0,0).addClass(\"highcharts-credits\").on(\"click\",function(){a.href&&(K.location.href=a.href)}).attr({align:a.position.align,zIndex:8}).add().align(a.position),this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var b=this,\ne=b.axes,c=b.series,h=b.container,d,g=h&&h.parentNode;f(b,\"destroy\");b.renderer.forExport?a.erase(l,b):l[b.index]=void 0;a.chartCount--;b.renderTo.removeAttribute(\"data-highcharts-chart\");w(b);for(d=e.length;d--;)e[d]=e[d].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(d=c.length;d--;)c[d]=c[d].destroy();k(\"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer\".split(\" \"),\nfunction(a){var e=b[a];e&&e.destroy&&(b[a]=e.destroy())});h&&(h.innerHTML=\"\",w(h),g&&r(h));t(b,function(a,e){delete b[e]})},isReadyToRender:function(){var a=this;return q||K!=K.top||\"complete\"===D.readyState?!0:(D.attachEvent(\"onreadystatechange\",function(){D.detachEvent(\"onreadystatechange\",a.firstRender);\"complete\"===D.readyState&&a.firstRender()}),!1)},firstRender:function(){var a=this,b=a.options;if(a.isReadyToRender()){a.getContainer();f(a,\"init\");a.resetMargins();a.setChartSize();a.propFromSeries();\na.getAxes();k(b.series||[],function(b){a.initSeries(b)});a.linkSeries();f(a,\"beforeRender\");G&&(a.pointer=new G(a,b));a.render();if(!a.renderer.imgCount&&a.onload)a.onload();a.temporaryDisplay(!0)}},onload:function(){k([this.callback].concat(this.callbacks),function(a){a&&void 0!==this.index&&a.apply(this,[this])},this);f(this,\"load\");f(this,\"render\");n(this.index)&&!1!==this.options.chart.reflow&&this.initReflow();this.onload=null}})})(I);(function(a){var x,C=a.each,E=a.extend,D=a.erase,m=a.fireEvent,\ng=a.format,d=a.isArray,r=a.isNumber,l=a.pick,n=a.removeEvent;a.Point=x=function(){};a.Point.prototype={init:function(a,c,d){var f=a.chart.options.chart.colorCount;this.series=a;this.applyOptions(c,d);a.options.colorByPoint?(c=a.colorCounter,a.colorCounter++,a.colorCounter===f&&(a.colorCounter=0)):c=a.colorIndex;this.colorIndex=l(this.colorIndex,c);a.chart.pointCount++;return this},applyOptions:function(a,c){var d=this.series,f=d.options.pointValKey||d.pointValKey;a=x.prototype.optionsToObject.call(this,\na);E(this,a);this.options=this.options?E(this.options,a):a;a.group&&delete this.group;f&&(this.y=this[f]);this.isNull=l(this.isValid&&!this.isValid(),null===this.x||!r(this.y,!0));this.selected&&(this.state=\"select\");\"name\"in this&&void 0===c&&d.xAxis&&d.xAxis.hasNames&&(this.x=d.xAxis.nameToX(this));void 0===this.x&&d&&(this.x=void 0===c?d.autoIncrement(this):c);return this},optionsToObject:function(a){var c={},g=this.series,f=g.options.keys,b=f||g.pointArrayMap||[\"y\"],e=b.length,k=0,l=0;if(r(a)||\nnull===a)c[b[0]]=a;else if(d(a))for(!f&&a.length>e&&(g=typeof a[0],\"string\"===g?c.name=a[0]:\"number\"===g&&(c.x=a[0]),k++);l<e;)f&&void 0===a[k]||(c[b[l]]=a[k]),k++,l++;else\"object\"===typeof a&&(c=a,a.dataLabels&&(g._hasPointLabels=!0),a.marker&&(g._hasPointMarkers=!0));return c},getClassName:function(){return\"highcharts-point\"+(this.selected?\" highcharts-point-select\":\"\")+(this.negative?\" highcharts-negative\":\"\")+(this.isNull?\" highcharts-null-point\":\"\")+(void 0!==this.colorIndex?\" highcharts-color-\"+\nthis.colorIndex:\"\")+(this.options.className?\" \"+this.options.className:\"\")+(this.zone&&this.zone.className?\" \"+this.zone.className.replace(\"highcharts-negative\",\"\"):\"\")},getZone:function(){var a=this.series,c=a.zones,a=a.zoneAxis||\"y\",d=0,f;for(f=c[d];this[a]>=f.value;)f=c[++d];f&&f.color&&!this.options.color&&(this.color=f.color);return f},destroy:function(){var a=this.series.chart,c=a.hoverPoints,d;a.pointCount--;c&&(this.setState(),D(c,this),c.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();\nif(this.graphic||this.dataLabel)n(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(d in this)this[d]=null},destroyElements:function(){for(var a=[\"graphic\",\"dataLabel\",\"dataLabelUpper\",\"connector\",\"shadowGroup\"],c,d=6;d--;)c=a[d],this[c]&&(this[c]=this[c].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||\nthis.stackTotal}},tooltipFormatter:function(a){var c=this.series,d=c.tooltipOptions,f=l(d.valueDecimals,\"\"),b=d.valuePrefix||\"\",e=d.valueSuffix||\"\";C(c.pointArrayMap||[\"y\"],function(c){c=\"{point.\"+c;if(b||e)a=a.replace(c+\"}\",b+c+\"}\"+e);a=a.replace(c+\"}\",c+\":,.\"+f+\"f}\")});return g(a,{point:this,series:this.series})},firePointEvent:function(a,c,d){var f=this,b=this.series.options;(b.point.events[a]||f.options&&f.options.events&&f.options.events[a])&&this.importEvents();\"click\"===a&&b.allowPointSelect&&\n(d=function(a){f.select&&f.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});m(this,a,c,d)},visible:!0}})(I);(function(a){var x=a.addEvent,C=a.animObject,E=a.arrayMax,D=a.arrayMin,m=a.correctFloat,g=a.Date,d=a.defaultOptions,r=a.defined,l=a.each,n=a.erase,k=a.extend,c=a.fireEvent,v=a.grep,f=a.isArray,b=a.isNumber,e=a.isString,p=a.merge,u=a.objectEach,F=a.pick,L=a.removeEvent,B=a.splat,H=a.SVGElement,t=a.syncTimeout,G=a.win;a.Series=a.seriesType(\"line\",null,{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},\nevents:{},marker:{radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2}}},point:{events:{}},dataLabels:{align:\"center\",formatter:function(){return null===this.y?\"\":a.numberFormat(this.y,-1)},verticalAlign:\"bottom\",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:\"x\"},{isCartesian:!0,pointClass:a.Point,sorted:!0,\nrequireSorting:!0,directTouch:!1,axisTypes:[\"xAxis\",\"yAxis\"],colorCounter:0,parallelArrays:[\"x\",\"y\"],coll:\"series\",init:function(a,b){var e=this,c,f=a.series,d;e.chart=a;e.options=b=e.setOptions(b);e.linkedSeries=[];e.bindAxes();k(e,{name:b.name,state:\"\",visible:!1!==b.visible,selected:!0===b.selected});c=b.events;u(c,function(a,b){x(e,b,a)});if(c&&c.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;e.getColor();e.getSymbol();l(e.parallelArrays,function(a){e[a+\n\"Data\"]=[]});e.setData(b.data,!1);e.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(d=f[f.length-1]);e._i=F(d&&d._i,-1)+1;a.orderSeries(this.insert(f))},insert:function(a){var e=this.options.index,c;if(b(e)){for(c=a.length;c--;)if(e>=F(a[c].options.index,a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return F(c,a.length-1)},bindAxes:function(){var b=this,e=b.options,c=b.chart,f;l(b.axisTypes||[],function(h){l(c[h],function(a){f=a.options;if(e[h]===f.index||void 0!==\ne[h]&&e[h]===f.id||void 0===e[h]&&0===f.index)b.insert(a.series),b[h]=a,a.isDirty=!0});b[h]||b.optionalAxis===h||a.error(18,!0)})},updateParallelArrays:function(a,e){var c=a.series,f=arguments,h=b(e)?function(b){var f=\"y\"===b&&c.toYData?c.toYData(a):a[b];c[b+\"Data\"][e]=f}:function(a){Array.prototype[e].apply(c[a+\"Data\"],Array.prototype.slice.call(f,2))};l(c.parallelArrays,h)},autoIncrement:function(){var a=this.options,b=this.xIncrement,e,c=a.pointIntervalUnit,b=F(b,a.pointStart,0);this.pointInterval=\ne=F(this.pointInterval,a.pointInterval,1);c&&(a=new g(b),\"day\"===c?a=+a[g.hcSetDate](a[g.hcGetDate]()+e):\"month\"===c?a=+a[g.hcSetMonth](a[g.hcGetMonth]()+e):\"year\"===c&&(a=+a[g.hcSetFullYear](a[g.hcGetFullYear]()+e)),e=a-b);this.xIncrement=b+e;return b},setOptions:function(a){var b=this.chart,e=b.options,c=e.plotOptions,f=(b.userOptions||{}).plotOptions||{},g=c[this.type];this.userOptions=a;b=p(g,c.series,a);this.tooltipOptions=p(d.tooltip,d.plotOptions.series&&d.plotOptions.series.tooltip,d.plotOptions[this.type].tooltip,\ne.tooltip.userOptions,c.series&&c.series.tooltip,c[this.type].tooltip,a.tooltip);this.stickyTracking=F(a.stickyTracking,f[this.type]&&f[this.type].stickyTracking,f.series&&f.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:b.stickyTracking);null===g.marker&&delete b.marker;this.zoneAxis=b.zoneAxis;a=this.zones=(b.zones||[]).slice();!b.negativeColor&&!b.negativeFillColor||b.zones||a.push({value:b[this.zoneAxis+\"Threshold\"]||b.threshold||0,className:\"highcharts-negative\"});\na.length&&r(a[a.length-1].value)&&a.push({});return b},getCyclic:function(a,b,e){var c,f=this.chart,d=this.userOptions,g=a+\"Index\",k=a+\"Counter\",w=e?e.length:F(f.options.chart[a+\"Count\"],f[a+\"Count\"]);b||(c=F(d[g],d[\"_\"+g]),r(c)||(f.series.length||(f[k]=0),d[\"_\"+g]=c=f[k]%w,f[k]+=1),e&&(b=e[c]));void 0!==c&&(this[g]=c);this[a]=b},getColor:function(){this.getCyclic(\"color\")},getSymbol:function(){this.getCyclic(\"symbol\",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,\nsetData:function(c,d,g,k){var h=this,q=h.points,p=q&&q.length||0,n,w=h.options,A=h.chart,z=null,m=h.xAxis,t=w.turboThreshold,u=this.xData,B=this.yData,v=(n=h.pointArrayMap)&&n.length;c=c||[];n=c.length;d=F(d,!0);if(!1!==k&&n&&p===n&&!h.cropped&&!h.hasGroupedData&&h.visible)l(c,function(a,b){q[b].update&&a!==w.data[b]&&q[b].update(a,!1,null,!1)});else{h.xIncrement=null;h.colorCounter=0;l(this.parallelArrays,function(a){h[a+\"Data\"].length=0});if(t&&n>t){for(g=0;null===z&&g<n;)z=c[g],g++;if(b(z))for(g=\n0;g<n;g++)u[g]=this.autoIncrement(),B[g]=c[g];else if(f(z))if(v)for(g=0;g<n;g++)z=c[g],u[g]=z[0],B[g]=z.slice(1,v+1);else for(g=0;g<n;g++)z=c[g],u[g]=z[0],B[g]=z[1];else a.error(12)}else for(g=0;g<n;g++)void 0!==c[g]&&(z={series:h},h.pointClass.prototype.applyOptions.apply(z,[c[g]]),h.updateParallelArrays(z,g));e(B[0])&&a.error(14,!0);h.data=[];h.options.data=h.userOptions.data=c;for(g=p;g--;)q[g]&&q[g].destroy&&q[g].destroy();m&&(m.minRange=m.userMinRange);h.isDirty=A.isDirtyBox=!0;h.isDirtyData=\n!!q;g=!1}\"point\"===w.legendType&&(this.processData(),this.generatePoints());d&&A.redraw(g)},processData:function(b){var e=this.xData,c=this.yData,f=e.length,d;d=0;var g,k,p=this.xAxis,l,n=this.options;l=n.cropThreshold;var z=this.getExtremesFromAll||n.getExtremesFromAll,m=this.isCartesian,n=p&&p.val2lin,t=p&&p.isLog,u,B;if(m&&!this.isDirty&&!p.isDirty&&!this.yAxis.isDirty&&!b)return!1;p&&(b=p.getExtremes(),u=b.min,B=b.max);if(m&&this.sorted&&!z&&(!l||f>l||this.forceCrop))if(e[f-1]<u||e[0]>B)e=[],\nc=[];else if(e[0]<u||e[f-1]>B)d=this.cropData(this.xData,this.yData,u,B),e=d.xData,c=d.yData,d=d.start,g=!0;for(l=e.length||1;--l;)f=t?n(e[l])-n(e[l-1]):e[l]-e[l-1],0<f&&(void 0===k||f<k)?k=f:0>f&&this.requireSorting&&a.error(15);this.cropped=g;this.cropStart=d;this.processedXData=e;this.processedYData=c;this.closestPointRange=k},cropData:function(a,b,e,c){var f=a.length,d=0,g=f,k=F(this.cropShoulder,1),p;for(p=0;p<f;p++)if(a[p]>=e){d=Math.max(0,p-k);break}for(e=p;e<f;e++)if(a[e]>c){g=e+k;break}return{xData:a.slice(d,\ng),yData:b.slice(d,g),start:d,end:g}},generatePoints:function(){var a=this.options,b=a.data,e=this.data,c,f=this.processedXData,d=this.processedYData,g=this.pointClass,k=f.length,p=this.cropStart||0,l,n=this.hasGroupedData,a=a.keys,m,t=[],u;e||n||(e=[],e.length=b.length,e=this.data=e);a&&n&&(this.options.keys=!1);for(u=0;u<k;u++)l=p+u,n?(m=(new g).init(this,[f[u]].concat(B(d[u]))),m.dataGroup=this.groupMap[u]):(m=e[l])||void 0===b[l]||(e[l]=m=(new g).init(this,b[l],f[u])),m&&(m.index=l,t[u]=m);this.options.keys=\na;if(e&&(k!==(c=e.length)||n))for(u=0;u<c;u++)u!==p||n||(u+=k),e[u]&&(e[u].destroyElements(),e[u].plotX=void 0);this.data=e;this.points=t},getExtremes:function(a){var e=this.yAxis,c=this.processedXData,d,h=[],g=0;d=this.xAxis.getExtremes();var k=d.min,p=d.max,l,n,m,t;a=a||this.stackedYData||this.processedYData||[];d=a.length;for(t=0;t<d;t++)if(n=c[t],m=a[t],l=(b(m,!0)||f(m))&&(!e.positiveValuesOnly||m.length||0<m),n=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(c[t]||n)>=\nk&&(c[t]||n)<=p,l&&n)if(l=m.length)for(;l--;)null!==m[l]&&(h[g++]=m[l]);else h[g++]=m;this.dataMin=D(h);this.dataMax=E(h)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,e=a.stacking,c=this.xAxis,f=c.categories,d=this.yAxis,g=this.points,k=g.length,p=!!this.modifyValue,l=a.pointPlacement,n=\"between\"===l||b(l),t=a.threshold,u=a.startFromThreshold?t:0,B,v,G,H,C=Number.MAX_VALUE;\"between\"===l&&(l=.5);b(l)&&(l*=F(a.pointRange||c.pointRange));for(a=\n0;a<k;a++){var x=g[a],L=x.x,D=x.y;v=x.low;var E=e&&d.stacks[(this.negStacks&&D<(u?0:t)?\"-\":\"\")+this.stackKey],I;d.positiveValuesOnly&&null!==D&&0>=D&&(x.isNull=!0);x.plotX=B=m(Math.min(Math.max(-1E5,c.translate(L,0,0,0,1,l,\"flags\"===this.type)),1E5));e&&this.visible&&!x.isNull&&E&&E[L]&&(H=this.getStackIndicator(H,L,this.index),I=E[L],D=I.points[H.key],v=D[0],D=D[1],v===u&&H.key===E[L].base&&(v=F(t,d.min)),d.positiveValuesOnly&&0>=v&&(v=null),x.total=x.stackTotal=I.total,x.percentage=I.total&&x.y/\nI.total*100,x.stackY=D,I.setOffset(this.pointXOffset||0,this.barW||0));x.yBottom=r(v)?d.translate(v,0,1,0,1):null;p&&(D=this.modifyValue(D,x));x.plotY=v=\"number\"===typeof D&&Infinity!==D?Math.min(Math.max(-1E5,d.translate(D,0,1,0,1)),1E5):void 0;x.isInside=void 0!==v&&0<=v&&v<=d.len&&0<=B&&B<=c.len;x.clientX=n?m(c.translate(L,0,0,0,1,l)):B;x.negative=x.y<(t||0);x.category=f&&void 0!==f[x.x]?f[x.x]:x.x;x.isNull||(void 0!==G&&(C=Math.min(C,Math.abs(B-G))),G=B);x.zone=this.zones.length&&x.getZone()}this.closestPointRangePx=\nC},getValidPoints:function(a,b){var e=this.chart;return v(a||this.points||[],function(a){return b&&!e.isInsidePlot(a.plotX,a.plotY,e.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,e=this.options,c=b.renderer,f=b.inverted,d=this.clipBox,g=d||b.clipBox,k=this.sharedClipKey||[\"_sharedClip\",a&&a.duration,a&&a.easing,g.height,e.xAxis,e.yAxis].join(),p=b[k],l=b[k+\"m\"];p||(a&&(g.width=0,b[k+\"m\"]=l=c.clipRect(-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),b[k]=p=c.clipRect(g),\np.count={length:0});a&&!p.count[this.index]&&(p.count[this.index]=!0,p.count.length+=1);!1!==e.clip&&(this.group.clip(a||d?p:b.clipRect),this.markerGroup.clip(l),this.sharedClipKey=k);a||(p.count[this.index]&&(delete p.count[this.index],--p.count.length),0===p.count.length&&k&&b[k]&&(d||(b[k]=b[k].destroy()),b[k+\"m\"]&&(b[k+\"m\"]=b[k+\"m\"].destroy())))},animate:function(a){var b=this.chart,e=C(this.options.animation),c;a?this.setClip(e):(c=this.sharedClipKey,(a=b[c])&&a.animate({width:b.plotSizeX},e),\nb[c+\"m\"]&&b[c+\"m\"].animate({width:b.plotSizeX+99},e),this.animate=null)},afterAnimate:function(){this.setClip();c(this,\"afterAnimate\")},drawPoints:function(){var a=this.points,e=this.chart,c,f,d,g,k=this.options.marker,p,l,n,m,t=this[this.specialGroup]||this.markerGroup,u=F(k.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>=2*k.radius);if(!1!==k.enabled||this._hasPointMarkers)for(f=0;f<a.length;f++)d=a[f],c=d.plotY,g=d.graphic,p=d.marker||{},l=!!d.marker,n=u&&void 0===p.enabled||p.enabled,\nm=d.isInside,n&&b(c)&&null!==d.y?(c=F(p.symbol,this.symbol),d.hasImage=0===c.indexOf(\"url\"),n=this.markerAttribs(d,d.selected&&\"select\"),g?g[m?\"show\":\"hide\"](!0).animate(n):m&&(0<n.width||d.hasImage)&&(d.graphic=g=e.renderer.symbol(c,n.x,n.y,n.width,n.height,l?p:k).add(t)),g&&g.addClass(d.getClassName(),!0)):g&&(d.graphic=g.destroy())},markerAttribs:function(a,b){var e=this.options.marker,c=a.marker||{},f=F(c.radius,e.radius);b&&(e=e.states[b],b=c.states&&c.states[b],f=F(b&&b.radius,e&&e.radius,f+\n(e&&e.radiusPlus||0)));a.hasImage&&(f=0);a={x:Math.floor(a.plotX)-f,y:a.plotY-f};f&&(a.width=a.height=2*f);return a},destroy:function(){var a=this,b=a.chart,e=/AppleWebKit\\/533/.test(G.navigator.userAgent),f,d,g=a.data||[],k,p;c(a,\"destroy\");L(a);l(a.axisTypes||[],function(b){(p=a[b])&&p.series&&(n(p.series,a),p.isDirty=p.forceRedraw=!0)});a.legendItem&&a.chart.legend.destroyItem(a);for(d=g.length;d--;)(k=g[d])&&k.destroy&&k.destroy();a.points=null;clearTimeout(a.animationTimeout);u(a,function(a,\nb){a instanceof H&&!a.survive&&(f=e&&\"group\"===b?\"hide\":\"destroy\",a[f]())});b.hoverSeries===a&&(b.hoverSeries=null);n(b.series,a);b.orderSeries();u(a,function(b,e){delete a[e]})},getGraphPath:function(a,b,e){var c=this,f=c.options,d=f.step,g,k=[],p=[],n;a=a||c.points;(g=a.reversed)&&a.reverse();(d={right:1,center:2}[d]||d&&3)&&g&&(d=4-d);!f.connectNulls||b||e||(a=this.getValidPoints(a));l(a,function(g,h){var l=g.plotX,q=g.plotY,m=a[h-1];(g.leftCliff||m&&m.rightCliff)&&!e&&(n=!0);g.isNull&&!r(b)&&\n0<h?n=!f.connectNulls:g.isNull&&!b?n=!0:(0===h||n?h=[\"M\",g.plotX,g.plotY]:c.getPointSpline?h=c.getPointSpline(a,g,h):d?(h=1===d?[\"L\",m.plotX,q]:2===d?[\"L\",(m.plotX+l)/2,m.plotY,\"L\",(m.plotX+l)/2,q]:[\"L\",l,m.plotY],h.push(\"L\",l,q)):h=[\"L\",l,q],p.push(g.x),d&&p.push(g.x),k.push.apply(k,h),n=!1)});k.xMap=p;return c.graphPath=k},drawGraph:function(){var a=this,b=(this.gappedPath||this.getGraphPath).call(this),e=[[\"graph\",\"highcharts-graph\"]];l(this.zones,function(a,b){e.push([\"zone-graph-\"+b,\"highcharts-graph highcharts-zone-graph-\"+\nb+\" \"+(a.className||\"\")])});l(e,function(e,c){c=e[0];var f=a[c];f?(f.endX=b.xMap,f.animate({d:b})):b.length&&(a[c]=a.chart.renderer.path(b).addClass(e[1]).attr({zIndex:1}).add(a.group));f&&(f.startX=b.xMap,f.isArea=b.isArea)})},applyZones:function(){var a=this,b=this.chart,e=b.renderer,c=this.zones,f,d,g=this.clips||[],k,p=this.graph,n=this.area,m=Math.max(b.chartWidth,b.chartHeight),t=this[(this.zoneAxis||\"y\")+\"Axis\"],u,B,v=b.inverted,r,G,H,x,C=!1;c.length&&(p||n)&&t&&void 0!==t.min&&(B=t.reversed,\nr=t.horiz,p&&p.hide(),n&&n.hide(),u=t.getExtremes(),l(c,function(c,h){f=B?r?b.plotWidth:0:r?0:t.toPixels(u.min);f=Math.min(Math.max(F(d,f),0),m);d=Math.min(Math.max(Math.round(t.toPixels(F(c.value,u.max),!0)),0),m);C&&(f=d=t.toPixels(u.max));G=Math.abs(f-d);H=Math.min(f,d);x=Math.max(f,d);t.isXAxis?(k={x:v?x:H,y:0,width:G,height:m},r||(k.x=b.plotHeight-k.x)):(k={x:0,y:v?x:H,width:m,height:G},r&&(k.y=b.plotWidth-k.y));g[h]?g[h].animate(k):(g[h]=e.clipRect(k),p&&a[\"zone-graph-\"+h].clip(g[h]),n&&a[\"zone-area-\"+\nh].clip(g[h]));C=c.value>u.max}),this.clips=g)},invertGroups:function(a){function b(){l([\"group\",\"markerGroup\"],function(b){e[b]&&(c.renderer.isVML&&e[b].attr({width:e.yAxis.len,height:e.xAxis.len}),e[b].width=e.yAxis.len,e[b].height=e.xAxis.len,e[b].invert(a))})}var e=this,c=e.chart,f;e.xAxis&&(f=x(c,\"resize\",b),x(e,\"destroy\",f),b(a),e.invertGroups=b)},plotGroup:function(a,b,e,c,f){var d=this[a],g=!d;g&&(this[a]=d=this.chart.renderer.g().attr({zIndex:c||.1}).add(f));d.addClass(\"highcharts-\"+b+\" highcharts-series-\"+\nthis.index+\" highcharts-\"+this.type+\"-series highcharts-color-\"+this.colorIndex+\" \"+(this.options.className||\"\"),!0);d.attr({visibility:e})[g?\"attr\":\"animate\"](this.getPlotBox());return d},getPlotBox:function(){var a=this.chart,b=this.xAxis,e=this.yAxis;a.inverted&&(b=e,e=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:e?e.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,e,c=a.options,f=!!a.animate&&b.renderer.isSVG&&C(c.animation).duration,d=a.visible?\"inherit\":\n\"hidden\",g=c.zIndex,k=a.hasRendered,p=b.seriesGroup,l=b.inverted;e=a.plotGroup(\"group\",\"series\",d,g,p);a.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",d,g,p);f&&a.animate(!0);e.inverted=a.isCartesian?l:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(l);!1===c.clip||a.sharedClipKey||k||e.clip(b.clipRect);f&&a.animate();k||(a.animationTimeout=t(function(){a.afterAnimate()},\nf));a.isDirty=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,e=this.group,c=this.xAxis,f=this.yAxis;e&&(a.inverted&&e.attr({width:a.plotWidth,height:a.plotHeight}),e.animate({translateX:F(c&&c.left,a.plotLeft),translateY:F(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:[\"clientX\",\"plotY\"],searchPoint:function(a,b){var e=this.xAxis,c=this.yAxis,f=this.chart.inverted;return this.searchKDTree({clientX:f?e.len-a.chartY+\ne.pos:a.chartX-e.pos,plotY:f?c.len-a.chartX+c.pos:a.chartY-c.pos},b)},buildKDTree:function(){function a(e,c,f){var d,g;if(g=e&&e.length)return d=b.kdAxisArray[c%f],e.sort(function(a,b){return a[d]-b[d]}),g=Math.floor(g/2),{point:e[g],left:a(e.slice(0,g),c+1,f),right:a(e.slice(g+1),c+1,f)}}this.buildingKdTree=!0;var b=this,e=-1<b.options.findNearestPointBy.indexOf(\"y\")?2:1;delete b.kdTree;t(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),e,e);b.buildingKdTree=!1},b.options.kdNow?0:1)},\nsearchKDTree:function(a,b){function e(a,b,h,k){var p=b.point,l=c.kdAxisArray[h%k],n,m,t=p;m=r(a[f])&&r(p[f])?Math.pow(a[f]-p[f],2):null;n=r(a[d])&&r(p[d])?Math.pow(a[d]-p[d],2):null;n=(m||0)+(n||0);p.dist=r(n)?Math.sqrt(n):Number.MAX_VALUE;p.distX=r(m)?Math.sqrt(m):Number.MAX_VALUE;l=a[l]-p[l];n=0>l?\"left\":\"right\";m=0>l?\"right\":\"left\";b[n]&&(n=e(a,b[n],h+1,k),t=n[g]<t[g]?n:p);b[m]&&Math.sqrt(l*l)<t[g]&&(a=e(a,b[m],h+1,k),t=a[g]<t[g]?a:t);return t}var c=this,f=this.kdAxisArray[0],d=this.kdAxisArray[1],\ng=b?\"distX\":\"dist\";b=-1<c.options.findNearestPointBy.indexOf(\"y\")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree();if(this.kdTree)return e(a,this.kdTree,b,b)}})})(I);(function(a){function x(a,c,d,f,b){var e=a.chart.inverted;this.axis=a;this.isNegative=d;this.options=c;this.x=f;this.total=null;this.points={};this.stack=b;this.rightCliff=this.leftCliff=0;this.alignOptions={align:c.align||(e?d?\"left\":\"right\":\"center\"),verticalAlign:c.verticalAlign||(e?\"middle\":d?\"bottom\":\"top\"),y:n(c.y,e?4:d?\n14:-6),x:n(c.x,e?d?-6:6:0)};this.textAlign=c.textAlign||(e?d?\"right\":\"left\":\"center\")}var C=a.Axis,E=a.Chart,D=a.correctFloat,m=a.defined,g=a.destroyObjectProperties,d=a.each,r=a.format,l=a.objectEach,n=a.pick;a=a.Series;x.prototype={destroy:function(){g(this,this.axis)},render:function(a){var c=this.options,d=c.format,d=d?r(d,this):c.formatter.call(this);this.label?this.label.attr({text:d,visibility:\"hidden\"}):this.label=this.axis.chart.renderer.text(d,null,null,c.useHTML).css(c.style).attr({align:this.textAlign,\nrotation:c.rotation,visibility:\"hidden\"}).add(a)},setOffset:function(a,c){var d=this.axis,f=d.chart,b=f.inverted,e=d.reversed,e=this.isNegative&&!e||!this.isNegative&&e,g=d.translate(d.usePercentage?100:this.total,0,0,0,1),d=d.translate(0),d=Math.abs(g-d);a=f.xAxis[0].translate(this.x)+a;var k=f.plotHeight,b={x:b?e?g:g-d:a,y:b?k-a-c:e?k-g-d:k-g,width:b?d:c,height:b?c:d};if(c=this.label)c.align(this.alignOptions,null,b),b=c.alignAttr,c[!1===this.options.crop||f.isInsidePlot(b.x,b.y)?\"show\":\"hide\"](!0)}};\nE.prototype.getStacks=function(){var a=this;d(a.yAxis,function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});d(a.series,function(c){!c.options.stacking||!0!==c.visible&&!1!==a.options.chart.ignoreHiddenSeries||(c.stackKey=c.type+n(c.options.stack,\"\"))})};C.prototype.buildStacks=function(){var a=this.series,c,d=n(this.options.reversedStacks,!0),f=a.length,b;if(!this.isXAxis){this.usePercentage=!1;for(b=f;b--;)a[d?b:f-b-1].setStackedPoints();for(b=f;b--;)c=a[d?b:f-b-1],c.setStackCliffs&&\nc.setStackCliffs();if(this.usePercentage)for(b=0;b<f;b++)a[b].setPercentStacks()}};C.prototype.renderStackTotals=function(){var a=this.chart,c=a.renderer,d=this.stacks,f=this.stackTotalGroup;f||(this.stackTotalGroup=f=c.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add());f.translate(a.plotLeft,a.plotTop);l(d,function(a){l(a,function(a){a.render(f)})})};C.prototype.resetStacks=function(){var a=this,c=a.stacks;a.isXAxis||l(c,function(c){l(c,function(f,b){f.touched<a.stacksTouched?(f.destroy(),\ndelete c[b]):(f.total=null,f.cum=null)})})};C.prototype.cleanStacks=function(){var a;this.isXAxis||(this.oldStacks&&(a=this.stacks=this.oldStacks),l(a,function(a){l(a,function(a){a.cum=a.total})}))};a.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var a=this.processedXData,c=this.processedYData,d=[],f=c.length,b=this.options,e=b.threshold,g=b.startFromThreshold?e:0,l=b.stack,b=b.stacking,r=this.stackKey,C=\"-\"+\nr,B=this.negStacks,H=this.yAxis,t=H.stacks,G=H.oldStacks,z,A,w,J,h,q,E;H.stacksTouched+=1;for(h=0;h<f;h++)q=a[h],E=c[h],z=this.getStackIndicator(z,q,this.index),J=z.key,w=(A=B&&E<(g?0:e))?C:r,t[w]||(t[w]={}),t[w][q]||(G[w]&&G[w][q]?(t[w][q]=G[w][q],t[w][q].total=null):t[w][q]=new x(H,H.options.stackLabels,A,q,l)),w=t[w][q],null!==E&&(w.points[J]=w.points[this.index]=[n(w.cum,g)],m(w.cum)||(w.base=J),w.touched=H.stacksTouched,0<z.index&&!1===this.singleStacks&&(w.points[J][0]=w.points[this.index+\",\"+\nq+\",0\"][0])),\"percent\"===b?(A=A?r:C,B&&t[A]&&t[A][q]?(A=t[A][q],w.total=A.total=Math.max(A.total,w.total)+Math.abs(E)||0):w.total=D(w.total+(Math.abs(E)||0))):w.total=D(w.total+(E||0)),w.cum=n(w.cum,g)+(E||0),null!==E&&(w.points[J].push(w.cum),d[h]=w.cum);\"percent\"===b&&(H.usePercentage=!0);this.stackedYData=d;H.oldStacks={}}};a.prototype.setPercentStacks=function(){var a=this,c=a.stackKey,g=a.yAxis.stacks,f=a.processedXData,b;d([c,\"-\"+c],function(e){for(var c=f.length,d,k;c--;)if(d=f[c],b=a.getStackIndicator(b,\nd,a.index,e),d=(k=g[e]&&g[e][d])&&k.points[b.key])k=k.total?100/k.total:0,d[0]=D(d[0]*k),d[1]=D(d[1]*k),a.stackedYData[c]=d[1]})};a.prototype.getStackIndicator=function(a,c,d,f){!m(a)||a.x!==c||f&&a.key!==f?a={x:c,index:0,key:f}:a.index++;a.key=[d,c,a.index].join();return a}})(I);(function(a){var x=a.addEvent,C=a.Axis,E=a.createElement,D=a.css,m=a.defined,g=a.each,d=a.erase,r=a.extend,l=a.fireEvent,n=a.inArray,k=a.isNumber,c=a.isObject,v=a.isArray,f=a.merge,b=a.objectEach,e=a.pick,p=a.Point,u=a.Series,\nF=a.seriesTypes,L=a.setAnimation,B=a.splat;r(a.Chart.prototype,{addSeries:function(a,b,c){var d,f=this;a&&(b=e(b,!0),l(f,\"addSeries\",{options:a},function(){d=f.initSeries(a);f.isDirtyLegend=!0;f.linkSeries();b&&f.redraw(c)}));return d},addAxis:function(a,b,c,d){var g=b?\"xAxis\":\"yAxis\",k=this.options;a=f(a,{index:this[g].length,isX:b});new C(this,a);k[g]=B(k[g]||{});k[g].push(a);e(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,e=b.options,c=b.loadingDiv,d=function(){c&&D(c,{left:b.plotLeft+\n\"px\",top:b.plotTop+\"px\",width:b.plotWidth+\"px\",height:b.plotHeight+\"px\"})};c||(b.loadingDiv=c=E(\"div\",{className:\"highcharts-loading highcharts-loading-hidden\"},null,b.container),b.loadingSpan=E(\"span\",{className:\"highcharts-loading-inner\"},null,c),x(b,\"redraw\",d));c.className=\"highcharts-loading\";b.loadingSpan.innerHTML=a||e.lang.loading;b.loadingShown=!0;d()},hideLoading:function(){var a=this.loadingDiv;a&&(a.className=\"highcharts-loading highcharts-loading-hidden\");this.loadingShown=!1},propsRequireDirtyBox:\"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow\".split(\" \"),\npropsRequireUpdateSeries:\"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions tooltip\".split(\" \"),update:function(a,c){var d=this,p={credits:\"addCredits\",title:\"setTitle\",subtitle:\"setSubtitle\"},l=a.chart,t,u;if(l){f(!0,d.options.chart,l);\"className\"in l&&d.setClassName(l.className);if(\"inverted\"in l||\"polar\"in l)d.propFromSeries(),t=!0;\"alignTicks\"in l&&(t=!0);b(l,function(a,b){-1!==n(\"chart.\"+b,d.propsRequireUpdateSeries)&&(u=!0);-1!==n(b,d.propsRequireDirtyBox)&&(d.isDirtyBox=\n!0)})}a.plotOptions&&f(!0,this.options.plotOptions,a.plotOptions);b(a,function(a,b){if(d[b]&&\"function\"===typeof d[b].update)d[b].update(a,!1);else if(\"function\"===typeof d[p[b]])d[p[b]](a);\"chart\"!==b&&-1!==n(b,d.propsRequireUpdateSeries)&&(u=!0)});g(\"xAxis yAxis zAxis series colorAxis pane\".split(\" \"),function(b){a[b]&&g(B(a[b]),function(a,e){(e=m(a.id)&&d.get(a.id)||d[b][e])&&e.coll===b&&e.update(a,!1)})});t&&g(d.axes,function(a){a.update({},!1)});u&&g(d.series,function(a){a.update({},!1)});a.loading&&\nf(!0,d.options.loading,a.loading);t=l&&l.width;l=l&&l.height;k(t)&&t!==d.chartWidth||k(l)&&l!==d.chartHeight?d.setSize(t,l):e(c,!0)&&d.redraw()},setSubtitle:function(a){this.setTitle(void 0,a)}});r(p.prototype,{update:function(a,b,d,f){function g(){k.applyOptions(a);null===k.y&&h&&(k.graphic=h.destroy());c(a,!0)&&(h&&h.element&&a&&a.marker&&a.marker.symbol&&(k.graphic=h.destroy()),a&&a.dataLabels&&k.dataLabel&&(k.dataLabel=k.dataLabel.destroy()));p=k.index;l.updateParallelArrays(k,p);m.data[p]=c(m.data[p],\n!0)||c(a,!0)?k.options:a;l.isDirty=l.isDirtyData=!0;!l.fixedBox&&l.hasCartesianSeries&&(n.isDirtyBox=!0);\"point\"===m.legendType&&(n.isDirtyLegend=!0);b&&n.redraw(d)}var k=this,l=k.series,h=k.graphic,p,n=l.chart,m=l.options;b=e(b,!0);!1===f?g():k.firePointEvent(\"update\",{options:a},g)},remove:function(a,b){this.series.removePoint(n(this,this.series.data),a,b)}});r(u.prototype,{addPoint:function(a,b,c,d){var f=this.options,g=this.data,k=this.chart,h=this.xAxis,h=h&&h.hasNames&&h.names,l=f.data,p,n,\nm=this.xData,t,u;b=e(b,!0);p={series:this};this.pointClass.prototype.applyOptions.apply(p,[a]);u=p.x;t=m.length;if(this.requireSorting&&u<m[t-1])for(n=!0;t&&m[t-1]>u;)t--;this.updateParallelArrays(p,\"splice\",t,0,0);this.updateParallelArrays(p,t);h&&p.name&&(h[u]=p.name);l.splice(t,0,a);n&&(this.data.splice(t,0,null),this.processData());\"point\"===f.legendType&&this.generatePoints();c&&(g[0]&&g[0].remove?g[0].remove(!1):(g.shift(),this.updateParallelArrays(p,\"shift\"),l.shift()));this.isDirtyData=this.isDirty=\n!0;b&&k.redraw(d)},removePoint:function(a,b,c){var d=this,f=d.data,g=f[a],k=d.points,h=d.chart,l=function(){k&&k.length===f.length&&k.splice(a,1);f.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(g||{series:d},\"splice\",a,1);g&&g.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&h.redraw()};L(c,h);b=e(b,!0);g?g.firePointEvent(\"remove\",null,l):l()},remove:function(a,b,c){function d(){f.destroy();g.isDirtyLegend=g.isDirtyBox=!0;g.linkSeries();e(a,!0)&&g.redraw(b)}var f=this,g=f.chart;!1!==c?l(f,\n\"remove\",null,d):d()},update:function(a,b){var c=this,d=c.chart,k=c.userOptions,l=c.oldType||c.type,p=a.type||k.type||d.options.chart.type,h=F[l].prototype,n=[\"group\",\"markerGroup\",\"dataLabelsGroup\"],m;if(Object.keys&&\"data\"===Object.keys(a).toString())return this.setData(a.data,b);if(p&&p!==l||void 0!==a.zIndex)n.length=0;g(n,function(a){n[a]=c[a];delete c[a]});a=f(k,{animation:!1,index:c.index,pointStart:c.xData[0]},{data:c.options.data},a);c.remove(!1,null,!1);for(m in h)c[m]=void 0;r(c,F[p||l].prototype);\ng(n,function(a){c[a]=n[a]});c.init(d,a);c.oldType=l;d.linkSeries();e(b,!0)&&d.redraw(!1)}});r(C.prototype,{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=f(this.userOptions,a);this.destroy(!0);this.init(c,r(a,{events:void 0}));c.isDirtyBox=!0;e(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,f=this.series,k=f.length;k--;)f[k]&&f[k].remove(!1);d(b.axes,this);d(b[c],this);v(b.options[c])?b.options[c].splice(this.options.index,1):delete b.options[c];\ng(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;e(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(I);(function(a){var x=a.each,C=a.map,E=a.pick,D=a.Series,m=a.seriesType;m(\"area\",\"line\",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var g=[],d=[],m=this.xAxis,l=this.yAxis,n=l.stacks[this.stackKey],k={},c=this.points,v=this.index,f=l.series,b=f.length,e,p=E(l.options.reversedStacks,\n!0)?1:-1,u;if(this.options.stacking){for(u=0;u<c.length;u++)k[c[u].x]=c[u];a.objectEach(n,function(a,b){null!==a.total&&d.push(b)});d.sort(function(a,b){return a-b});e=C(f,function(){return this.visible});x(d,function(a,c){var f=0,r,t;if(k[a]&&!k[a].isNull)g.push(k[a]),x([-1,1],function(f){var g=1===f?\"rightNull\":\"leftNull\",l=0,m=n[d[c+f]];if(m)for(u=v;0<=u&&u<b;)r=m.points[u],r||(u===v?k[a][g]=!0:e[u]&&(t=n[a].points[u])&&(l-=t[1]-t[0])),u+=p;k[a][1===f?\"rightCliff\":\"leftCliff\"]=l});else{for(u=v;0<=\nu&&u<b;){if(r=n[a].points[u]){f=r[1];break}u+=p}f=l.translate(f,0,1,0,1);g.push({isNull:!0,plotX:m.translate(a,0,0,0,1),x:a,plotY:f,yBottom:f})}})}return g},getGraphPath:function(a){var d=D.prototype.getGraphPath,g=this.options,l=g.stacking,n=this.yAxis,k,c,m=[],f=[],b=this.index,e,p=n.stacks[this.stackKey],u=g.threshold,F=n.getThreshold(g.threshold),x,g=g.connectNulls||\"percent\"===l,B=function(c,d,g){var k=a[c];c=l&&p[k.x].points[b];var t=k[g+\"Null\"]||0;g=k[g+\"Cliff\"]||0;var B,r,k=!0;g||t?(B=(t?\nc[0]:c[1])+g,r=c[0]+g,k=!!t):!l&&a[d]&&a[d].isNull&&(B=r=u);void 0!==B&&(f.push({plotX:e,plotY:null===B?F:n.getThreshold(B),isNull:k,isCliff:!0}),m.push({plotX:e,plotY:null===r?F:n.getThreshold(r),doCurve:!1}))};a=a||this.points;l&&(a=this.getStackPoints());for(k=0;k<a.length;k++)if(c=a[k].isNull,e=E(a[k].rectPlotX,a[k].plotX),x=E(a[k].yBottom,F),!c||g)g||B(k,k-1,\"left\"),c&&!l&&g||(f.push(a[k]),m.push({x:k,plotX:e,plotY:x})),g||B(k,k+1,\"right\");k=d.call(this,f,!0,!0);m.reversed=!0;c=d.call(this,m,\n!0,!0);c.length&&(c[0]=\"L\");c=k.concat(c);d=d.call(this,f,!1,g);c.xMap=k.xMap;this.areaPath=c;return d},drawGraph:function(){this.areaPath=[];D.prototype.drawGraph.apply(this);var a=this,d=this.areaPath,m=this.options,l=[[\"area\",\"highcharts-area\"]];x(this.zones,function(a,d){l.push([\"zone-area-\"+d,\"highcharts-area highcharts-zone-area-\"+d+\" \"+a.className])});x(l,function(g){var k=g[0],c=a[k];c?(c.endX=d.xMap,c.animate({d:d})):(c=a[k]=a.chart.renderer.path(d).addClass(g[1]).attr({zIndex:0}).add(a.group),\nc.isArea=!0);c.startX=d.xMap;c.shiftUnit=m.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(I);(function(a){var x=a.pick;a=a.seriesType;a(\"spline\",\"line\",{},{getPointSpline:function(a,E,D){var m=E.plotX,g=E.plotY,d=a[D-1];D=a[D+1];var r,l,n,k;if(d&&!d.isNull&&!1!==d.doCurve&&!E.isCliff&&D&&!D.isNull&&!1!==D.doCurve&&!E.isCliff){a=d.plotY;n=D.plotX;D=D.plotY;var c=0;r=(1.5*m+d.plotX)/2.5;l=(1.5*g+a)/2.5;n=(1.5*m+n)/2.5;k=(1.5*g+D)/2.5;n!==r&&(c=(k-l)*(n-m)/(n-r)+g-k);l+=c;k+=c;l>\na&&l>g?(l=Math.max(a,g),k=2*g-l):l<a&&l<g&&(l=Math.min(a,g),k=2*g-l);k>D&&k>g?(k=Math.max(D,g),l=2*g-k):k<D&&k<g&&(k=Math.min(D,g),l=2*g-k);E.rightContX=n;E.rightContY=k}E=[\"C\",x(d.rightContX,d.plotX),x(d.rightContY,d.plotY),x(r,m),x(l,g),m,g];d.rightContX=d.rightContY=null;return E}})})(I);(function(a){var x=a.seriesTypes.area.prototype,C=a.seriesType;C(\"areaspline\",\"spline\",a.defaultPlotOptions.area,{getStackPoints:x.getStackPoints,getGraphPath:x.getGraphPath,setStackCliffs:x.setStackCliffs,drawGraph:x.drawGraph,\ndrawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(I);(function(a){var x=a.animObject,C=a.each,E=a.extend,D=a.isNumber,m=a.merge,g=a.pick,d=a.Series,r=a.seriesType,l=a.svg;r(\"column\",\"line\",{borderRadius:0,crisp:!0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0},{cropShoulder:0,directTouch:!0,\ntrackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){d.prototype.init.apply(this,arguments);var a=this,g=a.chart;g.hasRendered&&C(g.series,function(c){c.type===a.type&&(c.isDirty=!0)})},getColumnMetrics:function(){var a=this,d=a.options,c=a.xAxis,l=a.yAxis,f=c.reversed,b,e={},p=0;!1===d.grouping?p=1:C(a.chart.series,function(c){var d=c.options,f=c.yAxis,g;c.type!==a.type||!c.visible&&a.chart.options.chart.ignoreHiddenSeries||l.len!==f.len||l.pos!==f.pos||(d.stacking?(b=c.stackKey,\nvoid 0===e[b]&&(e[b]=p++),g=e[b]):!1!==d.grouping&&(g=p++),c.columnIndex=g)});var m=Math.min(Math.abs(c.transA)*(c.ordinalSlope||d.pointRange||c.closestPointRange||c.tickInterval||1),c.len),r=m*d.groupPadding,x=(m-2*r)/(p||1),d=Math.min(d.maxPointWidth||c.len,g(d.pointWidth,x*(1-2*d.pointPadding)));a.columnMetrics={width:d,offset:(x-d)/2+(r+((a.columnIndex||0)+(f?1:0))*x-m/2)*(f?-1:1)};return a.columnMetrics},crispCol:function(a,d,c,g){var f=this.chart,b=this.borderWidth,e=-(b%2?.5:0),b=b%2?.5:1;\nf.inverted&&f.renderer.isVML&&(b+=1);this.options.crisp&&(c=Math.round(a+c)+e,a=Math.round(a)+e,c-=a);g=Math.round(d+g)+b;e=.5>=Math.abs(d)&&.5<g;d=Math.round(d)+b;g-=d;e&&g&&(--d,g+=1);return{x:a,y:d,width:c,height:g}},translate:function(){var a=this,k=a.chart,c=a.options,l=a.dense=2>a.closestPointRange*a.xAxis.transA,l=a.borderWidth=g(c.borderWidth,l?0:1),f=a.yAxis,b=a.translatedThreshold=f.getThreshold(c.threshold),e=g(c.minPointLength,5),p=a.getColumnMetrics(),m=p.width,r=a.barW=Math.max(m,1+\n2*l),x=a.pointXOffset=p.offset;k.inverted&&(b-=.5);c.pointPadding&&(r=Math.ceil(r));d.prototype.translate.apply(a);C(a.points,function(c){var d=g(c.yBottom,b),l=999+Math.abs(d),l=Math.min(Math.max(-l,c.plotY),f.len+l),p=c.plotX+x,n=r,u=Math.min(l,d),B,v=Math.max(l,d)-u;Math.abs(v)<e&&e&&(v=e,B=!f.reversed&&!c.negative||f.reversed&&c.negative,u=Math.abs(u-b)>e?d-e:b-(B?e:0));c.barX=p;c.pointWidth=m;c.tooltipPos=k.inverted?[f.len+f.pos-k.plotLeft-l,a.xAxis.len-p-n/2,v]:[p+n/2,l+f.pos-k.plotTop,v];c.shapeType=\n\"rect\";c.shapeArgs=a.crispCol.apply(a,c.isNull?[p,b,n,0]:[p,u,n,v])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?\"addClass\":\"removeClass\"](\"highcharts-dense-data\")},drawPoints:function(){var a=this,d=this.chart,c=d.renderer,g=a.options.animationLimit||250,f;C(a.points,function(b){var e=b.graphic;if(D(b.plotY)&&null!==b.y){f=b.shapeArgs;if(e)e[d.pointCount<g?\"animate\":\"attr\"](m(f));else b.graphic=e=c[b.shapeType](f).add(b.group||\na.group);e.addClass(b.getClassName(),!0)}else e&&(b.graphic=e.destroy())})},animate:function(a){var d=this,c=this.yAxis,g=d.options,f=this.chart.inverted,b={};l&&(a?(b.scaleY=.001,a=Math.min(c.pos+c.len,Math.max(c.pos,c.toPixels(g.threshold))),f?b.translateX=a-c.len:b.translateY=a,d.group.attr(b)):(b[f?\"translateX\":\"translateY\"]=c.pos,d.group.animate(b,E(x(d.options.animation),{step:function(a,b){d.group.attr({scaleY:Math.max(.001,b.pos)})}})),d.animate=null))},remove:function(){var a=this,g=a.chart;\ng.hasRendered&&C(g.series,function(c){c.type===a.type&&(c.isDirty=!0)});d.prototype.remove.apply(a,arguments)}})})(I);(function(a){a=a.seriesType;a(\"bar\",\"column\",null,{inverted:!0})})(I);(function(a){var x=a.Series;a=a.seriesType;a(\"scatter\",\"line\",{lineWidth:0,findNearestPointBy:\"xy\",marker:{enabled:!0},tooltip:{headerFormat:'\\x3cspan class\\x3d\"highcharts-color-{point.colorIndex}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cspan class\\x3d\"highcharts-header\"\\x3e {series.name}\\x3c/span\\x3e\\x3cbr/\\x3e',pointFormat:\"x: \\x3cb\\x3e{point.x}\\x3c/b\\x3e\\x3cbr/\\x3ey: \\x3cb\\x3e{point.y}\\x3c/b\\x3e\\x3cbr/\\x3e\"}},\n{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&x.prototype.drawGraph.call(this)}})})(I);(function(a){var x=a.pick,C=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,D=this.chart,m=2*(a.slicedOffset||0),g=D.plotWidth-2*m,D=D.plotHeight-2*m,d=a.center,d=[x(d[0],\"50%\"),x(d[1],\"50%\"),a.size||\"100%\",a.innerSize||0],r=Math.min(g,D),l,n;for(l=0;4>l;++l)n=\nd[l],a=2>l||2===l&&/%$/.test(n),d[l]=C(n,[g,D,r,d[2]][l])+(a?m:0);d[3]>d[2]&&(d[3]=d[2]);return d}}})(I);(function(a){var x=a.addEvent,C=a.defined,E=a.each,D=a.extend,m=a.inArray,g=a.noop,d=a.pick,r=a.Point,l=a.Series,n=a.seriesType,k=a.setAnimation;n(\"pie\",\"line\",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,\nstickyTracking:!1,tooltip:{followPointer:!0}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var c=this,d=c.points,b=c.startAngleRad;a||(E(d,function(a){var e=a.graphic,d=a.shapeArgs;e&&(e.attr({r:a.startR||c.center[3]/2,start:b,end:b}),e.animate({r:d.r,start:d.start,end:d.end},c.options.animation))}),c.animate=null)},updateTotals:function(){var a,\nd=0,f=this.points,b=f.length,e,g=this.options.ignoreHiddenPoint;for(a=0;a<b;a++)e=f[a],d+=g&&!e.visible?0:e.isNull?0:e.y;this.total=d;for(a=0;a<b;a++)e=f[a],e.percentage=0<d&&(e.visible||!g)?e.y/d*100:0,e.total=d},generatePoints:function(){l.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var c=0,f=this.options,b=f.slicedOffset,e=b+(f.borderWidth||0),g,k,l,m=f.startAngle||0,n=this.startAngleRad=Math.PI/180*(m-90),m=(this.endAngleRad=Math.PI/180*\n(d(f.endAngle,m+360)-90))-n,r=this.points,t,G=f.dataLabels.distance,f=f.ignoreHiddenPoint,z,A=r.length,w;a||(this.center=a=this.getCenter());this.getX=function(b,e,c){l=Math.asin(Math.min((b-a[1])/(a[2]/2+c.labelDistance),1));return a[0]+(e?-1:1)*Math.cos(l)*(a[2]/2+c.labelDistance)};for(z=0;z<A;z++){w=r[z];w.labelDistance=d(w.options.dataLabels&&w.options.dataLabels.distance,G);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,w.labelDistance);g=n+c*m;if(!f||w.visible)c+=w.percentage/100;k=\nn+c*m;w.shapeType=\"arc\";w.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*g)/1E3,end:Math.round(1E3*k)/1E3};l=(k+g)/2;l>1.5*Math.PI?l-=2*Math.PI:l<-Math.PI/2&&(l+=2*Math.PI);w.slicedTranslation={translateX:Math.round(Math.cos(l)*b),translateY:Math.round(Math.sin(l)*b)};k=Math.cos(l)*a[2]/2;t=Math.sin(l)*a[2]/2;w.tooltipPos=[a[0]+.7*k,a[1]+.7*t];w.half=l<-Math.PI/2||l>Math.PI/2?1:0;w.angle=l;g=Math.min(e,w.labelDistance/5);w.labelPos=[a[0]+k+Math.cos(l)*w.labelDistance,a[1]+t+\nMath.sin(l)*w.labelDistance,a[0]+k+Math.cos(l)*g,a[1]+t+Math.sin(l)*g,a[0]+k,a[1]+t,0>w.labelDistance?\"center\":w.half?\"right\":\"left\",l]}},drawGraph:null,drawPoints:function(){var a=this,d=a.chart.renderer,f,b,e;E(a.points,function(c){c.isNull||(b=c.graphic,e=c.shapeArgs,f=c.getTranslate(),b?b.setRadialReference(a.center).animate(D(e,f)):(c.graphic=b=d[c.shapeType](e).setRadialReference(a.center).attr(f).add(a.group),c.visible||b.attr({visibility:\"hidden\"})),b.addClass(c.getClassName()))})},searchPoint:g,\nsortByAngle:function(a,d){a.sort(function(a,b){return void 0!==a.angle&&(b.angle-a.angle)*d})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:g},{init:function(){r.prototype.init.apply(this,arguments);var a=this,g;a.name=d(a.name,\"Slice\");g=function(c){a.slice(\"select\"===c.type)};x(a,\"select\",g);x(a,\"unselect\",g);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,g){var c=this,b=c.series,e=b.chart,k=b.options.ignoreHiddenPoint;\ng=d(g,k);a!==c.visible&&(c.visible=c.options.visible=a=void 0===a?!c.visible:a,b.options.data[m(c,b.data)]=c.options,E([\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"],function(b){if(c[b])c[b][a?\"show\":\"hide\"](!0)}),c.legendItem&&e.legend.colorizeItem(c,a),a||\"hover\"!==c.state||c.setState(\"\"),k&&(b.isDirty=!0),g&&e.redraw())},slice:function(a,g,f){var b=this.series;k(f,b.chart);d(g,!0);this.sliced=this.options.sliced=C(a)?a:!this.sliced;b.options.data[m(this,b.data)]=this.options;this.graphic.animate(this.getTranslate())},\ngetTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var c=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.x,c.y,c.r+a,c.r+a,{innerR:this.shapeArgs.r,start:c.start,end:c.end})}})})(I);(function(a){var x=a.addEvent,C=a.arrayMax,E=a.defined,D=a.each,m=a.extend,g=a.format,d=a.map,r=a.merge,l=a.noop,n=a.pick,k=a.relativeLength,c=a.Series,v=a.seriesTypes,f=a.stableSort;a.distribute=function(a,e){function b(a,\nb){return a.target-b.target}var c,g=!0,k=a,l=[],m;m=0;for(c=a.length;c--;)m+=a[c].size;if(m>e){f(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(m=c=0;m<=e;)m+=a[c].size,c++;l=a.splice(c-1,a.length)}f(a,b);for(a=d(a,function(a){return{size:a.size,targets:[a.target]}});g;){for(c=a.length;c--;)g=a[c],m=(Math.min.apply(0,g.targets)+Math.max.apply(0,g.targets))/2,g.pos=Math.min(Math.max(0,m-g.size/2),e-g.size);c=a.length;for(g=!1;c--;)0<c&&a[c-1].pos+a[c-1].size>a[c].pos&&(a[c-1].size+=a[c].size,\na[c-1].targets=a[c-1].targets.concat(a[c].targets),a[c-1].pos+a[c-1].size>e&&(a[c-1].pos=e-a[c-1].size),a.splice(c,1),g=!0)}c=0;D(a,function(a){var b=0;D(a.targets,function(){k[c].pos=a.pos+b;b+=k[c].size;c++})});k.push.apply(k,l);f(k,b)};c.prototype.drawDataLabels=function(){var b=this,c=b.options,d=c.dataLabels,f=b.points,k,l,m=b.hasRendered||0,v,t,G=n(d.defer,!!c.animation),z=b.chart.renderer;if(d.enabled||b._hasPointLabels)b.dlProcessOptions&&b.dlProcessOptions(d),t=b.plotGroup(\"dataLabelsGroup\",\n\"data-labels\",G&&!m?\"hidden\":\"visible\",d.zIndex||6),G&&(t.attr({opacity:+m}),m||x(b,\"afterAnimate\",function(){b.visible&&t.show(!0);t[c.animation?\"animate\":\"attr\"]({opacity:1},{duration:200})})),l=d,D(f,function(c){var e,f=c.dataLabel,h,m,p=c.connector,u=!f;k=c.dlOptions||c.options&&c.options.dataLabels;if(e=n(k&&k.enabled,l.enabled)&&null!==c.y)d=r(l,k),h=c.getLabelConfig(),v=d.format?g(d.format,h):d.formatter.call(h,d),h=d.rotation,m={r:d.borderRadius||0,rotation:h,padding:d.padding,zIndex:1},a.objectEach(m,\nfunction(a,b){void 0===a&&delete m[b]});!f||e&&E(v)?e&&E(v)&&(f?m.text=v:(f=c.dataLabel=z[h?\"text\":\"label\"](v,0,-9999,d.shape,null,null,d.useHTML,null,\"data-label\"),f.addClass(\"highcharts-data-label-color-\"+c.colorIndex+\" \"+(d.className||\"\")+(d.useHTML?\"highcharts-tracker\":\"\"))),f.attr(m),f.added||f.add(t),b.alignDataLabel(c,f,d,null,u)):(c.dataLabel=f=f.destroy(),p&&(c.connector=p.destroy()))})};c.prototype.alignDataLabel=function(a,c,d,f,g){var b=this.chart,e=b.inverted,k=n(a.plotX,-9999),l=n(a.plotY,\n-9999),p=c.getBBox(),r,u=d.rotation,w=d.align,v=this.visible&&(a.series.forceDL||b.isInsidePlot(k,Math.round(l),e)||f&&b.isInsidePlot(k,e?f.x+1:f.y+f.height-1,e)),h=\"justify\"===n(d.overflow,\"justify\");if(v&&(r=b.renderer.fontMetrics(void 0,c).b,f=m({x:e?b.plotWidth-l:k,y:Math.round(e?b.plotHeight-k:l),width:0,height:0},f),m(d,{width:p.width,height:p.height}),u?(h=!1,k=b.renderer.rotCorr(r,u),k={x:f.x+d.x+f.width/2+k.x,y:f.y+d.y+{top:0,middle:.5,bottom:1}[d.verticalAlign]*f.height},c[g?\"attr\":\"animate\"](k).attr({align:w}),\nl=(u+720)%360,l=180<l&&360>l,\"left\"===w?k.y-=l?p.height:0:\"center\"===w?(k.x-=p.width/2,k.y-=p.height/2):\"right\"===w&&(k.x-=p.width,k.y-=l?0:p.height)):(c.align(d,null,f),k=c.alignAttr),h?a.isLabelJustified=this.justifyDataLabel(c,d,k,p,f,g):n(d.crop,!0)&&(v=b.isInsidePlot(k.x,k.y)&&b.isInsidePlot(k.x+p.width,k.y+p.height)),d.shape&&!u))c[g?\"attr\":\"animate\"]({anchorX:e?b.plotWidth-a.plotY:a.plotX,anchorY:e?b.plotHeight-a.plotX:a.plotY});v||(c.attr({y:-9999}),c.placed=!1)};c.prototype.justifyDataLabel=\nfunction(a,c,d,f,g,k){var b=this.chart,e=c.align,l=c.verticalAlign,m,p,n=a.box?0:a.padding||0;m=d.x+n;0>m&&(\"right\"===e?c.align=\"left\":c.x=-m,p=!0);m=d.x+f.width-n;m>b.plotWidth&&(\"left\"===e?c.align=\"right\":c.x=b.plotWidth-m,p=!0);m=d.y+n;0>m&&(\"bottom\"===l?c.verticalAlign=\"top\":c.y=-m,p=!0);m=d.y+f.height-n;m>b.plotHeight&&(\"top\"===l?c.verticalAlign=\"bottom\":c.y=b.plotHeight-m,p=!0);p&&(a.placed=!k,a.align(c,null,g));return p};v.pie&&(v.pie.prototype.drawDataLabels=function(){var b=this,d=b.data,\nf,g=b.chart,k=b.options.dataLabels,l=n(k.connectorPadding,10),m=n(k.connectorWidth,1),r=g.plotWidth,t=g.plotHeight,v,z=b.center,A=z[2]/2,w=z[1],x,h,q,I,K=[[],[]],N,M,P,R,O=[0,0,0,0];b.visible&&(k.enabled||b._hasPointLabels)&&(D(d,function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:\"auto\"}).css({width:\"auto\",textOverflow:\"clip\"}),a.dataLabel.shortened=!1)}),c.prototype.drawDataLabels.apply(b),D(d,function(a){a.dataLabel&&a.visible&&(K[a.half].push(a),a.dataLabel._pos=\nnull)}),D(K,function(c,d){var e,m,p=c.length,n=[],u;if(p)for(b.sortByAngle(c,d-.5),0<b.maxLabelDistance&&(e=Math.max(0,w-A-b.maxLabelDistance),m=Math.min(w+A+b.maxLabelDistance,g.plotHeight),D(c,function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,w-A-a.labelDistance),a.bottom=Math.min(w+A+a.labelDistance,g.plotHeight),u=a.dataLabel.getBBox().height||21,a.positionsIndex=n.push({target:a.labelPos[1]-a.top+u/2,size:u,rank:a.y})-1)}),a.distribute(n,m+u-e)),R=0;R<p;R++)f=c[R],m=f.positionsIndex,\nq=f.labelPos,x=f.dataLabel,P=!1===f.visible?\"hidden\":\"inherit\",e=q[1],n&&E(n[m])?void 0===n[m].pos?P=\"hidden\":(I=n[m].size,M=f.top+n[m].pos):M=e,delete f.positionIndex,N=k.justify?z[0]+(d?-1:1)*(A+f.labelDistance):b.getX(M<f.top+2||M>f.bottom-2?e:M,d,f),x._attr={visibility:P,align:q[6]},x._pos={x:N+k.x+({left:l,right:-l}[q[6]]||0),y:M+k.y-10},q.x=N,q.y=M,h=x.getBBox().width,e=null,N-h<l?(e=Math.round(h-N+l),O[3]=Math.max(e,O[3])):N+h>r-l&&(e=Math.round(N+h-r+l),O[1]=Math.max(e,O[1])),0>M-I/2?O[0]=\nMath.max(Math.round(-M+I/2),O[0]):M+I/2>t&&(O[2]=Math.max(Math.round(M+I/2-t),O[2])),x.sideOverflow=e}),0===C(O)||this.verifyDataLabelOverflow(O))&&(this.placeDataLabels(),m&&D(this.points,function(a){var c;v=a.connector;if((x=a.dataLabel)&&x._pos&&a.visible&&0<a.labelDistance){P=x._attr.visibility;if(c=!v)a.connector=v=g.renderer.path().addClass(\"highcharts-data-label-connector highcharts-color-\"+a.colorIndex).add(b.dataLabelsGroup);v[c?\"attr\":\"animate\"]({d:b.connectorPath(a.labelPos)});v.attr(\"visibility\",\nP)}else v&&(a.connector=v.destroy())}))},v.pie.prototype.connectorPath=function(a){var b=a.x,c=a.y;return n(this.options.dataLabels.softConnector,!0)?[\"M\",b+(\"left\"===a[6]?5:-5),c,\"C\",b,c,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],\"L\",a[4],a[5]]:[\"M\",b+(\"left\"===a[6]?5:-5),c,\"L\",a[2],a[3],\"L\",a[4],a[5]]},v.pie.prototype.placeDataLabels=function(){D(this.points,function(a){var b=a.dataLabel;b&&a.visible&&((a=b._pos)?(b.sideOverflow&&(b._attr.width=b.getBBox().width-b.sideOverflow,b.css({width:b._attr.width+\n\"px\",textOverflow:\"ellipsis\"}),b.shortened=!0),b.attr(b._attr),b[b.moved?\"animate\":\"attr\"](a),b.moved=!0):b&&b.attr({y:-9999}))},this)},v.pie.prototype.alignDataLabel=l,v.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,f=c.minSize||80,g,l=null!==c.size;l||(null!==d[0]?g=Math.max(b[2]-Math.max(a[1],a[3]),f):(g=Math.max(b[2]-a[1]-a[3],f),b[0]+=(a[3]-a[1])/2),null!==d[1]?g=Math.max(Math.min(g,b[2]-Math.max(a[0],a[2])),f):(g=Math.max(Math.min(g,b[2]-a[0]-\na[2]),f),b[1]+=(a[0]-a[2])/2),g<b[2]?(b[2]=g,b[3]=Math.min(k(c.innerSize||0,g),g),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):l=!0);return l});v.column&&(v.column.prototype.alignDataLabel=function(a,d,f,g,k){var b=this.chart.inverted,e=a.series,l=a.dlBox||a.shapeArgs,m=n(a.below,a.plotY>n(this.translatedThreshold,e.yAxis.len)),p=n(f.inside,!!this.options.stacking);l&&(g=r(l),0>g.y&&(g.height+=g.y,g.y=0),l=g.y+g.height-e.yAxis.len,0<l&&(g.height-=l),b&&(g={x:e.yAxis.len-g.y-g.height,\ny:e.xAxis.len-g.x-g.width,width:g.height,height:g.width}),p||(b?(g.x+=m?0:g.width,g.width=0):(g.y+=m?g.height:0,g.height=0)));f.align=n(f.align,!b||p?\"center\":m?\"right\":\"left\");f.verticalAlign=n(f.verticalAlign,b||p?\"middle\":m?\"top\":\"bottom\");c.prototype.alignDataLabel.call(this,a,d,f,g,k);a.isLabelJustified&&a.contrastColor&&a.dataLabel.css({color:a.contrastColor})})})(I);(function(a){var x=a.Chart,C=a.each,E=a.pick,D=a.addEvent;x.prototype.callbacks.push(function(a){function g(){var d=[];C(a.series||\n[],function(a){var g=a.options.dataLabels,m=a.dataLabelCollections||[\"dataLabel\"];(g.enabled||a._hasPointLabels)&&!g.allowOverlap&&a.visible&&C(m,function(g){C(a.points,function(a){a[g]&&(a[g].labelrank=E(a.labelrank,a.shapeArgs&&a.shapeArgs.height),d.push(a[g]))})})});a.hideOverlappingLabels(d)}g();D(a,\"redraw\",g)});x.prototype.hideOverlappingLabels=function(a){var g=a.length,d,m,l,n,k,c,v,f,b,e=function(a,b,c,d,e,f,g,k){return!(e>a+c||e+g<a||f>b+d||f+k<b)};for(m=0;m<g;m++)if(d=a[m])d.oldOpacity=\nd.opacity,d.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(m=0;m<g;m++)for(l=a[m],d=m+1;d<g;++d)if(n=a[d],l&&n&&l!==n&&l.placed&&n.placed&&0!==l.newOpacity&&0!==n.newOpacity&&(k=l.alignAttr,c=n.alignAttr,v=l.parentGroup,f=n.parentGroup,b=2*(l.box?0:l.padding),k=e(k.x+v.translateX,k.y+v.translateY,l.width-b,l.height-b,c.x+f.translateX,c.y+f.translateY,n.width-b,n.height-b)))(l.labelrank<n.labelrank?l:n).newOpacity=0;C(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==\nc&&a.placed&&(c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?\"animate\":\"attr\"](a.alignAttr,null,b)),a.isOld=!0)})}})(I);(function(a){var x=a.addEvent,C=a.Chart,E=a.createElement,D=a.css,m=a.defaultOptions,g=a.defaultPlotOptions,d=a.each,r=a.extend,l=a.fireEvent,n=a.hasTouch,k=a.inArray,c=a.isObject,v=a.Legend,f=a.merge,b=a.pick,e=a.Point,p=a.Series,u=a.seriesTypes,F=a.svg,I;I=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart.pointer,c=function(a){var c=b.getPointFromEvent(a);\nvoid 0!==c&&(b.isDirectTouch=!0,c.onMouseOver(a))};d(a.points,function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=a)});a._hasTracking||(d(a.trackerGroups,function(d){if(a[d]&&(a[d].addClass(\"highcharts-tracker\").on(\"mouseover\",c).on(\"mouseout\",function(a){b.onTrackerMouseOut(a)}),n))a[d].on(\"touchstart\",c)}),a._hasTracking=!0)},drawTrackerGraph:function(){var a=this,b=a.options.trackByArea,c=[].concat(b?a.areaPath:a.graphPath),\ne=c.length,f=a.chart,g=f.pointer,k=f.renderer,l=f.options.tooltip.snap,h=a.tracker,m,p=function(){if(f.hoverSeries!==a)a.onMouseOver()},r=\"rgba(192,192,192,\"+(F?.0001:.002)+\")\";if(e&&!b)for(m=e+1;m--;)\"M\"===c[m]&&c.splice(m+1,0,c[m+1]-l,c[m+2],\"L\"),(m&&\"M\"===c[m]||m===e)&&c.splice(m,0,\"L\",c[m-2]+l,c[m-1]);h?h.attr({d:c}):a.graph&&(a.tracker=k.path(c).attr({\"stroke-linejoin\":\"round\",visibility:a.visible?\"visible\":\"hidden\",stroke:r,fill:b?r:\"none\",\"stroke-width\":a.graph.strokeWidth()+(b?0:2*l),zIndex:2}).add(a.group),\nd([a.tracker,a.markerGroup],function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",p).on(\"mouseout\",function(a){g.onTrackerMouseOut(a)});if(n)a.on(\"touchstart\",p)}))}};u.column&&(u.column.prototype.drawTracker=I.drawTrackerPoint);u.pie&&(u.pie.prototype.drawTracker=I.drawTrackerPoint);u.scatter&&(u.scatter.prototype.drawTracker=I.drawTrackerPoint);r(v.prototype,{setItemEvents:function(a,b,c){var d=this.chart.renderer.boxWrapper,e=\"highcharts-legend-\"+(a.series?\"point\":\"series\")+\"-active\";(c?\nb:a.legendGroup).on(\"mouseover\",function(){a.setState(\"hover\");d.addClass(e)}).on(\"mouseout\",function(){d.removeClass(e);a.setState()}).on(\"click\",function(b){var c=function(){a.setVisible&&a.setVisible()};b={browserEvent:b};a.firePointEvent?a.firePointEvent(\"legendItemClick\",b,c):l(a,\"legendItemClick\",b,c)})},createCheckboxForItem:function(a){a.checkbox=E(\"input\",{type:\"checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);x(a.checkbox,\"click\",\nfunction(b){l(a.series||a,\"checkboxClick\",{checked:b.target.checked,item:a},function(){a.select()})})}});r(C.prototype,{showResetZoom:function(){var a=this,b=m.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=\"chart\"===c.relativeTo?null:\"plotBox\";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).addClass(\"highcharts-reset-zoom\").add().align(c.position,!1,f)},zoomOut:function(){var a=\nthis;l(a,\"selection\",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var e,f=this.pointer,g=!1,k;!a||a.resetSelection?d(this.axes,function(a){e=a.zoom()}):d(a.xAxis.concat(a.yAxis),function(a){var b=a.axis;f[b.isXAxis?\"zoomX\":\"zoomY\"]&&(e=b.zoom(a.min,a.max),b.displayBtn&&(g=!0))});k=this.resetZoomButton;g&&!k?this.showResetZoom():!g&&c(k)&&(this.resetZoomButton=k.destroy());e&&this.redraw(b(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,b){var c=this,\ne=c.hoverPoints,f;e&&d(e,function(a){a.setState()});d(\"xy\"===b?[1,0]:[1],function(b){b=c[b?\"xAxis\":\"yAxis\"][0];var d=b.horiz,e=a[d?\"chartX\":\"chartY\"],d=d?\"mouseDownX\":\"mouseDownY\",g=c[d],k=(b.pointRange||0)/2,l=b.getExtremes(),m=b.toValue(g-e,!0)+k,k=b.toValue(g+b.len-e,!0)-k,n=k<m,g=n?k:m,m=n?m:k,k=Math.min(l.dataMin,b.toValue(b.toPixels(l.min)-b.minPixelPadding)),n=Math.max(l.dataMax,b.toValue(b.toPixels(l.max)+b.minPixelPadding)),p;p=k-g;0<p&&(m+=p,g=k);p=m-n;0<p&&(m=n,g-=p);b.series.length&&g!==\nl.min&&m!==l.max&&(b.setExtremes(g,m,!1,!1,{trigger:\"pan\"}),f=!0);c[d]=e});f&&c.redraw(!1);D(c.container,{cursor:\"move\"})}});r(e.prototype,{select:function(a,c){var e=this,f=e.series,g=f.chart;a=b(a,!e.selected);e.firePointEvent(a?\"select\":\"unselect\",{accumulate:c},function(){e.selected=e.options.selected=a;f.options.data[k(e,f.data)]=e.options;e.setState(a&&\"select\");c||d(g.getSelectedPoints(),function(a){a.selected&&a!==e&&(a.selected=a.options.selected=!1,f.options.data[k(a,f.data)]=a.options,\na.setState(\"\"),a.firePointEvent(\"unselect\"))})})},onMouseOver:function(a){var b=this.series.chart,c=b.pointer;a=a?c.normalize(a):c.getChartCoordinatesFromPoint(this,b.inverted);c.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent(\"mouseOut\");d(a.hoverPoints||[],function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var b=this,c=f(b.series.options.point,b.options).events;b.events=c;a.objectEach(c,function(a,\nc){x(b,c,a)});this.hasImportedEvents=!0}},setState:function(a,c){var d=Math.floor(this.plotX),e=this.plotY,f=this.series,k=f.options.states[a]||{},l=g[f.type].marker&&f.options.marker,m=l&&!1===l.enabled,h=l&&l.states&&l.states[a]||{},n=!1===h.enabled,p=f.stateMarkerGraphic,r=this.marker||{},u=f.chart,v=f.halo,x,B=l&&f.markerAttribs;a=a||\"\";if(!(a===this.state&&!c||this.selected&&\"select\"!==a||!1===k.enabled||a&&(n||m&&!1===h.enabled)||a&&r.states&&r.states[a]&&!1===r.states[a].enabled)){B&&(x=f.markerAttribs(this,\na));if(this.graphic)this.state&&this.graphic.removeClass(\"highcharts-point-\"+this.state),a&&this.graphic.addClass(\"highcharts-point-\"+a),x&&this.graphic.animate(x,b(u.options.chart.animation,h.animation,l.animation)),p&&p.hide();else{if(a&&h)if(l=r.symbol||f.symbol,p&&p.currentSymbol!==l&&(p=p.destroy()),p)p[c?\"animate\":\"attr\"]({x:x.x,y:x.y});else l&&(f.stateMarkerGraphic=p=u.renderer.symbol(l,x.x,x.y,x.width,x.height).add(f.markerGroup),p.currentSymbol=l);p&&(p[a&&u.isInsidePlot(d,e,u.inverted)?\n\"show\":\"hide\"](),p.element.point=this)}(d=k.halo)&&d.size?(v||(f.halo=v=u.renderer.path().add((this.graphic||p).parentGroup)),v[c?\"animate\":\"attr\"]({d:this.haloPath(d.size)}),v.attr({\"class\":\"highcharts-halo highcharts-color-\"+b(this.colorIndex,f.colorIndex)}),v.point=this):v&&v.point&&v.point.haloPath&&v.animate({d:v.point.haloPath(0)});this.state=a}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});r(p.prototype,{onMouseOver:function(){var a=\nthis.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&l(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&l(this,\"mouseOut\");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var b=this;a=a||\"\";b.state!==a&&(d([b.group,b.markerGroup,b.dataLabelsGroup],function(c){c&&\n(b.state&&c.removeClass(\"highcharts-series-\"+b.state),a&&c.addClass(\"highcharts-series-\"+a))}),b.state=a)},setVisible:function(a,b){var c=this,e=c.chart,f=c.legendItem,g,k=e.options.chart.ignoreHiddenSeries,m=c.visible;g=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!m:a)?\"show\":\"hide\";d([\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\",\"tt\"],function(a){if(c[a])c[a][g]()});if(e.hoverSeries===c||(e.hoverPoint&&e.hoverPoint.series)===c)c.onMouseOut();f&&e.legend.colorizeItem(c,a);\nc.isDirty=!0;c.options.stacking&&d(e.series,function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});d(c.linkedSeries,function(b){b.setVisible(a,!1)});k&&(e.isDirtyBox=!0);!1!==b&&e.redraw();l(c,g)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);l(this,a?\"select\":\"unselect\")},drawTracker:I.drawTrackerGraph})})(I);(function(a){var x=a.Chart,C=a.each,E=a.inArray,D=a.isArray,\nm=a.isObject,g=a.pick,d=a.splat;x.prototype.setResponsive=function(d){var g=this.options.responsive,m=[],k=this.currentResponsive;g&&g.rules&&C(g.rules,function(c){void 0===c._id&&(c._id=a.uniqueKey());this.matchResponsiveRule(c,m,d)},this);var c=a.merge.apply(0,a.map(m,function(c){return a.find(g.rules,function(a){return a._id===c}).chartOptions})),m=m.toString()||void 0;m!==(k&&k.ruleIds)&&(k&&this.update(k.undoOptions,d),m?(this.currentResponsive={ruleIds:m,mergedOptions:c,undoOptions:this.currentOptions(c)},\nthis.update(c,d)):this.currentResponsive=void 0)};x.prototype.matchResponsiveRule=function(a,d){var l=a.condition;(l.callback||function(){return this.chartWidth<=g(l.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=g(l.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=g(l.minWidth,0)&&this.chartHeight>=g(l.minHeight,0)}).call(this)&&d.push(a._id)};x.prototype.currentOptions=function(g){function l(g,c,n,f){var b;a.objectEach(g,function(a,k){if(!f&&-1<E(k,[\"series\",\"xAxis\",\"yAxis\"]))for(g[k]=d(g[k]),n[k]=\n[],b=0;b<g[k].length;b++)c[k][b]&&(n[k][b]={},l(a[b],c[k][b],n[k][b],f+1));else m(a)?(n[k]=D(a)?[]:{},l(a,c[k]||{},n[k],f+1)):n[k]=c[k]||null})}var n={};l(g,this.options,n,0);return n}})(I);return I});\n"
  },
  {
    "path": "assets/highcharts/js/highcharts.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(root, factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = root.document ?\n            factory(root) :\n            factory;\n    } else {\n        root.Highcharts = factory(root);\n    }\n}(typeof window !== 'undefined' ? window : this, function(win) {\n    var Highcharts = (function() {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* global window */\n        var win = window,\n            doc = win.document;\n\n        var SVG_NS = 'http://www.w3.org/2000/svg',\n            userAgent = (win.navigator && win.navigator.userAgent) || '',\n            svg = doc && doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,\n            isMS = /(edge|msie|trident)/i.test(userAgent) && !window.opera,\n            vml = !svg,\n            isFirefox = /Firefox/.test(userAgent),\n            hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4; // issue #38\n\n        var Highcharts = win.Highcharts ? win.Highcharts.error(16, true) : {\n            product: 'Highcharts',\n            version: '5.0.12',\n            deg2rad: Math.PI * 2 / 360,\n            doc: doc,\n            hasBidiBug: hasBidiBug,\n            hasTouch: doc && doc.documentElement.ontouchstart !== undefined,\n            isMS: isMS,\n            isWebKit: /AppleWebKit/.test(userAgent),\n            isFirefox: isFirefox,\n            isTouchDevice: /(Mobile|Android|Windows Phone)/.test(userAgent),\n            SVG_NS: SVG_NS,\n            chartCount: 0,\n            seriesTypes: {},\n            symbolSizes: {},\n            svg: svg,\n            vml: vml,\n            win: win,\n            marginNames: ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],\n            noop: function() {\n                return undefined;\n            },\n            /**\n             * An array containing the current chart objects in the page. A chart's\n             * position in the array is preserved throughout the page's lifetime. When\n             * a chart is destroyed, the array item becomes `undefined`.\n             * @type {Array.<Highcharts.Chart>}\n             * @memberOf Highcharts\n             */\n            charts: []\n        };\n        return Highcharts;\n    }());\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* eslint max-len: [\"warn\", 80, 4] */\n\n        /**\n         * The Highcharts object is the placeholder for all other members, and various\n         * utility functions. The most important member of the namespace would be the\n         * chart constructor.\n         *\n         * @example\n         * var chart = Highcharts.chart('container', { ... });\n         * \n         * @namespace Highcharts\n         */\n\n        var timers = [];\n\n        var charts = H.charts,\n            doc = H.doc,\n            win = H.win;\n\n        /**\n         * Provide error messages for debugging, with links to online explanation. This\n         * function can be overridden to provide custom error handling.\n         *\n         * @function #error\n         * @memberOf Highcharts\n         * @param {Number|String} code - The error code. See [errors.xml]{@link \n         *     https://github.com/highcharts/highcharts/blob/master/errors/errors.xml}\n         *     for available codes. If it is a string, the error message is printed\n         *     directly in the console.\n         * @param {Boolean} [stop=false] - Whether to throw an error or just log a \n         *     warning in the console.\n         *\n         * @sample highcharts/chart/highcharts-error/ Custom error handler\n         */\n        H.error = function(code, stop) {\n            var msg = H.isNumber(code) ?\n                'Highcharts error #' + code + ': www.highcharts.com/errors/' + code :\n                code;\n            if (stop) {\n                throw new Error(msg);\n            }\n            // else ...\n            if (win.console) {\n                console.log(msg); // eslint-disable-line no-console\n            }\n        };\n\n        /**\n         * An animator object used internally. One instance applies to one property\n         * (attribute or style prop) on one element. Animation is always initiated\n         * through {@link SVGElement#animate}.\n         *\n         * @constructor Fx\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement|SVGElement} elem - The element to animate.\n         * @param {AnimationOptions} options - Animation options.\n         * @param {string} prop - The single attribute or CSS property to animate.\n         * @private\n         *\n         * @example\n         * var rect = renderer.rect(0, 0, 10, 10).add();\n         * rect.animate({ width: 100 });\n         */\n        H.Fx = function(elem, options, prop) {\n            this.options = options;\n            this.elem = elem;\n            this.prop = prop;\n        };\n        H.Fx.prototype = {\n\n            /**\n             * Set the current step of a path definition on SVGElement.\n             *\n             * @function #dSetter\n             * @memberOf Highcharts.Fx\n             */\n            dSetter: function() {\n                var start = this.paths[0],\n                    end = this.paths[1],\n                    ret = [],\n                    now = this.now,\n                    i = start.length,\n                    startVal;\n\n                // Land on the final path without adjustment points appended in the ends\n                if (now === 1) {\n                    ret = this.toD;\n\n                } else if (i === end.length && now < 1) {\n                    while (i--) {\n                        startVal = parseFloat(start[i]);\n                        ret[i] =\n                            isNaN(startVal) ? // a letter instruction like M or L\n                            start[i] :\n                            now * (parseFloat(end[i] - startVal)) + startVal;\n\n                    }\n                    // If animation is finished or length not matching, land on right value\n                } else {\n                    ret = end;\n                }\n                this.elem.attr('d', ret, null, true);\n            },\n\n            /**\n             * Update the element with the current animation step.\n             *\n             * @function #update\n             * @memberOf Highcharts.Fx\n             */\n            update: function() {\n                var elem = this.elem,\n                    prop = this.prop, // if destroyed, it is null\n                    now = this.now,\n                    step = this.options.step;\n\n                // Animation setter defined from outside\n                if (this[prop + 'Setter']) {\n                    this[prop + 'Setter']();\n\n                    // Other animations on SVGElement\n                } else if (elem.attr) {\n                    if (elem.element) {\n                        elem.attr(prop, now, null, true);\n                    }\n\n                    // HTML styles, raw HTML content like container size\n                } else {\n                    elem.style[prop] = now + this.unit;\n                }\n\n                if (step) {\n                    step.call(elem, now, this);\n                }\n\n            },\n\n            /**\n             * Run an animation.\n             *\n             * @function #run\n             * @memberOf Highcharts.Fx\n             * @param {Number} from - The current value, value to start from.\n             * @param {Number} to - The end value, value to land on.\n             * @param {String} [unit] - The property unit, for example `px`.\n             * @returns {void}\n             */\n            run: function(from, to, unit) {\n                var self = this,\n                    timer = function(gotoEnd) {\n                        return timer.stopped ? false : self.step(gotoEnd);\n                    },\n                    i;\n\n                this.startTime = +new Date();\n                this.start = from;\n                this.end = to;\n                this.unit = unit;\n                this.now = this.start;\n                this.pos = 0;\n\n                timer.elem = this.elem;\n                timer.prop = this.prop;\n\n                if (timer() && timers.push(timer) === 1) {\n                    timer.timerId = setInterval(function() {\n\n                        for (i = 0; i < timers.length; i++) {\n                            if (!timers[i]()) {\n                                timers.splice(i--, 1);\n                            }\n                        }\n\n                        if (!timers.length) {\n                            clearInterval(timer.timerId);\n                        }\n                    }, 13);\n                }\n            },\n\n            /**\n             * Run a single step in the animation.\n             *\n             * @function #step\n             * @memberOf Highcharts.Fx\n             * @param   {Boolean} [gotoEnd] - Whether to go to the endpoint of the\n             *     animation after abort.\n             * @returns {Boolean} Returns `true` if animation continues.\n             */\n            step: function(gotoEnd) {\n                var t = +new Date(),\n                    ret,\n                    done,\n                    options = this.options,\n                    elem = this.elem,\n                    complete = options.complete,\n                    duration = options.duration,\n                    curAnim = options.curAnim;\n\n                if (elem.attr && !elem.element) { // #2616, element is destroyed\n                    ret = false;\n\n                } else if (gotoEnd || t >= duration + this.startTime) {\n                    this.now = this.end;\n                    this.pos = 1;\n                    this.update();\n\n                    curAnim[this.prop] = true;\n\n                    done = true;\n\n                    H.objectEach(curAnim, function(val) {\n                        if (val !== true) {\n                            done = false;\n                        }\n                    });\n\n                    if (done && complete) {\n                        complete.call(elem);\n                    }\n                    ret = false;\n\n                } else {\n                    this.pos = options.easing((t - this.startTime) / duration);\n                    this.now = this.start + ((this.end - this.start) * this.pos);\n                    this.update();\n                    ret = true;\n                }\n                return ret;\n            },\n\n            /**\n             * Prepare start and end values so that the path can be animated one to one.\n             *\n             * @function #initPath\n             * @memberOf Highcharts.Fx\n             * @param {SVGElement} elem - The SVGElement item.\n             * @param {String} fromD - Starting path definition.\n             * @param {Array} toD - Ending path definition.\n             * @returns {Array} An array containing start and end paths in array form\n             * so that they can be animated in parallel.\n             */\n            initPath: function(elem, fromD, toD) {\n                fromD = fromD || '';\n                var shift,\n                    startX = elem.startX,\n                    endX = elem.endX,\n                    bezier = fromD.indexOf('C') > -1,\n                    numParams = bezier ? 7 : 3,\n                    fullLength,\n                    slice,\n                    i,\n                    start = fromD.split(' '),\n                    end = toD.slice(), // copy\n                    isArea = elem.isArea,\n                    positionFactor = isArea ? 2 : 1,\n                    reverse;\n\n                /**\n                 * In splines make moveTo and lineTo points have six parameters like\n                 * bezier curves, to allow animation one-to-one.\n                 */\n                function sixify(arr) {\n                    var isOperator,\n                        nextIsOperator;\n                    i = arr.length;\n                    while (i--) {\n\n                        // Fill in dummy coordinates only if the next operator comes\n                        // three places behind (#5788)\n                        isOperator = arr[i] === 'M' || arr[i] === 'L';\n                        nextIsOperator = /[a-zA-Z]/.test(arr[i + 3]);\n                        if (isOperator && nextIsOperator) {\n                            arr.splice(\n                                i + 1, 0,\n                                arr[i + 1], arr[i + 2],\n                                arr[i + 1], arr[i + 2]\n                            );\n                        }\n                    }\n                }\n\n                /**\n                 * Insert an array at the given position of another array\n                 */\n                function insertSlice(arr, subArr, index) {\n                    [].splice.apply(\n                        arr, [index, 0].concat(subArr)\n                    );\n                }\n\n                /**\n                 * If shifting points, prepend a dummy point to the end path. \n                 */\n                function prepend(arr, other) {\n                    while (arr.length < fullLength) {\n\n                        // Move to, line to or curve to?\n                        arr[0] = other[fullLength - arr.length];\n\n                        // Prepend a copy of the first point\n                        insertSlice(arr, arr.slice(0, numParams), 0);\n\n                        // For areas, the bottom path goes back again to the left, so we\n                        // need to append a copy of the last point.\n                        if (isArea) {\n                            insertSlice(\n                                arr,\n                                arr.slice(arr.length - numParams), arr.length\n                            );\n                            i--;\n                        }\n                    }\n                    arr[0] = 'M';\n                }\n\n                /**\n                 * Copy and append last point until the length matches the end length\n                 */\n                function append(arr, other) {\n                    var i = (fullLength - arr.length) / numParams;\n                    while (i > 0 && i--) {\n\n                        // Pull out the slice that is going to be appended or inserted.\n                        // In a line graph, the positionFactor is 1, and the last point\n                        // is sliced out. In an area graph, the positionFactor is 2,\n                        // causing the middle two points to be sliced out, since an area\n                        // path starts at left, follows the upper path then turns and\n                        // follows the bottom back. \n                        slice = arr.slice().splice(\n                            (arr.length / positionFactor) - numParams,\n                            numParams * positionFactor\n                        );\n\n                        // Move to, line to or curve to?\n                        slice[0] = other[fullLength - numParams - (i * numParams)];\n\n                        // Disable first control point\n                        if (bezier) {\n                            slice[numParams - 6] = slice[numParams - 2];\n                            slice[numParams - 5] = slice[numParams - 1];\n                        }\n\n                        // Now insert the slice, either in the middle (for areas) or at\n                        // the end (for lines)\n                        insertSlice(arr, slice, arr.length / positionFactor);\n\n                        if (isArea) {\n                            i--;\n                        }\n                    }\n                }\n\n                if (bezier) {\n                    sixify(start);\n                    sixify(end);\n                }\n\n                // For sideways animation, find out how much we need to shift to get the\n                // start path Xs to match the end path Xs.\n                if (startX && endX) {\n                    for (i = 0; i < startX.length; i++) {\n                        // Moving left, new points coming in on right\n                        if (startX[i] === endX[0]) {\n                            shift = i;\n                            break;\n                            // Moving right\n                        } else if (startX[0] ===\n                            endX[endX.length - startX.length + i]) {\n                            shift = i;\n                            reverse = true;\n                            break;\n                        }\n                    }\n                    if (shift === undefined) {\n                        start = [];\n                    }\n                }\n\n                if (start.length && H.isNumber(shift)) {\n\n                    // The common target length for the start and end array, where both \n                    // arrays are padded in opposite ends\n                    fullLength = end.length + shift * positionFactor * numParams;\n\n                    if (!reverse) {\n                        prepend(end, start);\n                        append(start, end);\n                    } else {\n                        prepend(start, end);\n                        append(end, start);\n                    }\n                }\n\n                return [start, end];\n            }\n        }; // End of Fx prototype\n\n        /**\n         * Handle animation of the color attributes directly.\n         */\n        H.Fx.prototype.fillSetter =\n            H.Fx.prototype.strokeSetter = function() {\n                this.elem.attr(\n                    this.prop,\n                    H.color(this.start).tweenTo(H.color(this.end), this.pos),\n                    null,\n                    true\n                );\n            };\n\n\n        /**\n         * Utility function to extend an object with the members of another.\n         *\n         * @function #extend\n         * @memberOf Highcharts\n         * @param {Object} a - The object to be extended.\n         * @param {Object} b - The object to add to the first one.\n         * @returns {Object} Object a, the original object.\n         */\n        H.extend = function(a, b) {\n            var n;\n            if (!a) {\n                a = {};\n            }\n            for (n in b) {\n                a[n] = b[n];\n            }\n            return a;\n        };\n\n        /**\n         * Utility function to deep merge two or more objects and return a third object.\n         * If the first argument is true, the contents of the second object is copied\n         * into the first object. The merge function can also be used with a single \n         * object argument to create a deep copy of an object.\n         *\n         * @function #merge\n         * @memberOf Highcharts\n         * @param {Boolean} [extend] - Whether to extend the left-side object (a) or\n                  return a whole new object.\n         * @param {Object} a - The first object to extend. When only this is given, the\n                  function returns a deep copy.\n         * @param {...Object} [n] - An object to merge into the previous one.\n         * @returns {Object} - The merged object. If the first argument is true, the \n         * return is the same as the second argument.\n         */\n        H.merge = function() {\n            var i,\n                args = arguments,\n                len,\n                ret = {},\n                doCopy = function(copy, original) {\n                    // An object is replacing a primitive\n                    if (typeof copy !== 'object') {\n                        copy = {};\n                    }\n\n                    H.objectEach(original, function(value, key) {\n\n                        // Copy the contents of objects, but not arrays or DOM nodes\n                        if (\n                            H.isObject(value, true) &&\n                            !H.isClass(value) &&\n                            !H.isDOMElement(value)\n                        ) {\n                            copy[key] = doCopy(copy[key] || {}, value);\n\n                            // Primitives and arrays are copied over directly\n                        } else {\n                            copy[key] = original[key];\n                        }\n                    });\n                    return copy;\n                };\n\n            // If first argument is true, copy into the existing object. Used in\n            // setOptions.\n            if (args[0] === true) {\n                ret = args[1];\n                args = Array.prototype.slice.call(args, 2);\n            }\n\n            // For each argument, extend the return\n            len = args.length;\n            for (i = 0; i < len; i++) {\n                ret = doCopy(ret, args[i]);\n            }\n\n            return ret;\n        };\n\n        /**\n         * Shortcut for parseInt\n         * @ignore\n         * @param {Object} s\n         * @param {Number} mag Magnitude\n         */\n        H.pInt = function(s, mag) {\n            return parseInt(s, mag || 10);\n        };\n\n        /**\n         * Utility function to check for string type.\n         *\n         * @function #isString\n         * @memberOf Highcharts\n         * @param {Object} s - The item to check.\n         * @returns {Boolean} - True if the argument is a string.\n         */\n        H.isString = function(s) {\n            return typeof s === 'string';\n        };\n\n        /**\n         * Utility function to check if an item is an array.\n         *\n         * @function #isArray\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @returns {Boolean} - True if the argument is an array.\n         */\n        H.isArray = function(obj) {\n            var str = Object.prototype.toString.call(obj);\n            return str === '[object Array]' || str === '[object Array Iterator]';\n        };\n\n        /**\n         * Utility function to check if an item is of type object.\n         *\n         * @function #isObject\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @param {Boolean} [strict=false] - Also checks that the object is not an\n         *    array.\n         * @returns {Boolean} - True if the argument is an object.\n         */\n        H.isObject = function(obj, strict) {\n            return !!obj && typeof obj === 'object' && (!strict || !H.isArray(obj));\n        };\n\n        /**\n         * Utility function to check if an Object is a HTML Element.\n         *\n         * @function #isDOMElement\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @returns {Boolean} - True if the argument is a HTML Element.\n         */\n        H.isDOMElement = function(obj) {\n            return H.isObject(obj) && typeof obj.nodeType === 'number';\n        };\n\n        /**\n         * Utility function to check if an Object is an class.\n         *\n         * @function #isClass\n         * @memberOf Highcharts\n         * @param {Object} obj - The item to check.\n         * @returns {Boolean} - True if the argument is an class.\n         */\n        H.isClass = function(obj) {\n            var c = obj && obj.constructor;\n            return !!(\n                H.isObject(obj, true) &&\n                !H.isDOMElement(obj) &&\n                (c && c.name && c.name !== 'Object')\n            );\n        };\n\n        /**\n         * Utility function to check if an item is of type number.\n         *\n         * @function #isNumber\n         * @memberOf Highcharts\n         * @param {Object} n - The item to check.\n         * @returns {Boolean} - True if the item is a number and is not NaN.\n         */\n        H.isNumber = function(n) {\n            return typeof n === 'number' && !isNaN(n);\n        };\n\n        /**\n         * Remove the last occurence of an item from an array.\n         *\n         * @function #erase\n         * @memberOf Highcharts\n         * @param {Array} arr - The array.\n         * @param {*} item - The item to remove.\n         */\n        H.erase = function(arr, item) {\n            var i = arr.length;\n            while (i--) {\n                if (arr[i] === item) {\n                    arr.splice(i, 1);\n                    break;\n                }\n            }\n        };\n\n        /**\n         * Check if an object is null or undefined.\n         *\n         * @function #defined\n         * @memberOf Highcharts\n         * @param {Object} obj - The object to check.\n         * @returns {Boolean} - False if the object is null or undefined, otherwise\n         *        true.\n         */\n        H.defined = function(obj) {\n            return obj !== undefined && obj !== null;\n        };\n\n        /**\n         * Set or get an attribute or an object of attributes. To use as a setter, pass\n         * a key and a value, or let the second argument be a collection of keys and\n         * values. To use as a getter, pass only a string as the second argument.\n         *\n         * @function #attr\n         * @memberOf Highcharts\n         * @param {Object} elem - The DOM element to receive the attribute(s).\n         * @param {String|Object} [prop] - The property or an object of key-value pairs.\n         * @param {String} [value] - The value if a single property is set.\n         * @returns {*} When used as a getter, return the value.\n         */\n        H.attr = function(elem, prop, value) {\n            var ret;\n\n            // if the prop is a string\n            if (H.isString(prop)) {\n                // set the value\n                if (H.defined(value)) {\n                    elem.setAttribute(prop, value);\n\n                    // get the value\n                } else if (elem && elem.getAttribute) {\n                    ret = elem.getAttribute(prop);\n                }\n\n                // else if prop is defined, it is a hash of key/value pairs\n            } else if (H.defined(prop) && H.isObject(prop)) {\n                H.objectEach(prop, function(val, key) {\n                    elem.setAttribute(key, val);\n                });\n            }\n            return ret;\n        };\n\n        /**\n         * Check if an element is an array, and if not, make it into an array.\n         *\n         * @function #splat\n         * @memberOf Highcharts\n         * @param obj {*} - The object to splat.\n         * @returns {Array} The produced or original array.\n         */\n        H.splat = function(obj) {\n            return H.isArray(obj) ? obj : [obj];\n        };\n\n        /**\n         * Set a timeout if the delay is given, otherwise perform the function\n         * synchronously.\n         *\n         * @function #syncTimeout\n         * @memberOf Highcharts\n         * @param   {Function} fn - The function callback.\n         * @param   {Number}   delay - Delay in milliseconds.\n         * @param   {Object}   [context] - The context.\n         * @returns {Number} An identifier for the timeout that can later be cleared\n         * with clearTimeout.\n         */\n        H.syncTimeout = function(fn, delay, context) {\n            if (delay) {\n                return setTimeout(fn, delay, context);\n            }\n            fn.call(0, context);\n        };\n\n\n        /**\n         * Return the first value that is not null or undefined.\n         *\n         * @function #pick\n         * @memberOf Highcharts\n         * @param {...*} items - Variable number of arguments to inspect.\n         * @returns {*} The value of the first argument that is not null or undefined.\n         */\n        H.pick = function() {\n            var args = arguments,\n                i,\n                arg,\n                length = args.length;\n            for (i = 0; i < length; i++) {\n                arg = args[i];\n                if (arg !== undefined && arg !== null) {\n                    return arg;\n                }\n            }\n        };\n\n        /**\n         * @typedef {Object} CSSObject - A style object with camel case property names.\n         * The properties can be whatever styles are supported on the given SVG or HTML\n         * element.\n         * @example\n         * {\n         *    fontFamily: 'monospace',\n         *    fontSize: '1.2em'\n         * }\n         */\n        /**\n         * Set CSS on a given element.\n         *\n         * @function #css\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} el - A HTML DOM element.\n         * @param {CSSObject} styles - Style object with camel case property names.\n         * @returns {void}\n         */\n        H.css = function(el, styles) {\n            if (H.isMS && !H.svg) { // #2686\n                if (styles && styles.opacity !== undefined) {\n                    styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';\n                }\n            }\n            H.extend(el.style, styles);\n        };\n\n        /**\n         * A HTML DOM element.\n         * @typedef {Object} HTMLDOMElement\n         */\n\n        /**\n         * Utility function to create an HTML element with attributes and styles.\n         *\n         * @function #createElement\n         * @memberOf Highcharts\n         * @param {String} tag - The HTML tag.\n         * @param {Object} [attribs] - Attributes as an object of key-value pairs.\n         * @param {CSSObject} [styles] - Styles as an object of key-value pairs.\n         * @param {Object} [parent] - The parent HTML object.\n         * @param {Boolean} [nopad=false] - If true, remove all padding, border and\n         *    margin.\n         * @returns {HTMLDOMElement} The created DOM element.\n         */\n        H.createElement = function(tag, attribs, styles, parent, nopad) {\n            var el = doc.createElement(tag),\n                css = H.css;\n            if (attribs) {\n                H.extend(el, attribs);\n            }\n            if (nopad) {\n                css(el, {\n                    padding: 0,\n                    border: 'none',\n                    margin: 0\n                });\n            }\n            if (styles) {\n                css(el, styles);\n            }\n            if (parent) {\n                parent.appendChild(el);\n            }\n            return el;\n        };\n\n        /**\n         * Extend a prototyped class by new members.\n         *\n         * @function #extendClass\n         * @memberOf Highcharts\n         * @param {Object} parent - The parent prototype to inherit.\n         * @param {Object} members - A collection of prototype members to add or\n         *        override compared to the parent prototype.\n         * @returns {Object} A new prototype.\n         */\n        H.extendClass = function(parent, members) {\n            var object = function() {};\n            object.prototype = new parent(); // eslint-disable-line new-cap\n            H.extend(object.prototype, members);\n            return object;\n        };\n\n        /**\n         * Left-pad a string to a given length by adding a character repetetively.\n         *\n         * @function #pad\n         * @memberOf Highcharts\n         * @param {Number} number - The input string or number.\n         * @param {Number} length - The desired string length.\n         * @param {String} [padder=0] - The character to pad with.\n         * @returns {String} The padded string.\n         */\n        H.pad = function(number, length, padder) {\n            return new Array((length || 2) + 1 -\n                String(number).length).join(padder || 0) + number;\n        };\n\n        /**\n         * @typedef {Number|String} RelativeSize - If a number is given, it defines the\n         *    pixel length. If a percentage string is given, like for example `'50%'`,\n         *    the setting defines a length relative to a base size, for example the size\n         *    of a container.\n         */\n        /**\n         * Return a length based on either the integer value, or a percentage of a base.\n         *\n         * @function #relativeLength\n         * @memberOf Highcharts\n         * @param {RelativeSize} value - A percentage string or a number.\n         * @param {Number} base - The full length that represents 100%.\n         * @returns {Number} The computed length.\n         */\n        H.relativeLength = function(value, base) {\n            return (/%$/).test(value) ?\n                base * parseFloat(value) / 100 :\n                parseFloat(value);\n        };\n\n        /**\n         * Wrap a method with extended functionality, preserving the original function.\n         *\n         * @function #wrap\n         * @memberOf Highcharts\n         * @param {Object} obj - The context object that the method belongs to. In real\n         *        cases, this is often a prototype.\n         * @param {String} method - The name of the method to extend.\n         * @param {Function} func - A wrapper function callback. This function is called\n         *        with the same arguments as the original function, except that the\n         *        original function is unshifted and passed as the first argument.\n         * @returns {void}\n         */\n        H.wrap = function(obj, method, func) {\n            var proceed = obj[method];\n            obj[method] = function() {\n                var args = Array.prototype.slice.call(arguments),\n                    outerArgs = arguments,\n                    ctx = this,\n                    ret;\n                ctx.proceed = function() {\n                    proceed.apply(ctx, arguments.length ? arguments : outerArgs);\n                };\n                args.unshift(proceed);\n                ret = func.apply(this, args);\n                ctx.proceed = null;\n                return ret;\n            };\n        };\n\n        /**\n         * Get the time zone offset based on the current timezone information as set in\n         * the global options.\n         *\n         * @function #getTZOffset\n         * @memberOf Highcharts\n         * @param  {Number} timestamp - The JavaScript timestamp to inspect.\n         * @return {Number} - The timezone offset in minutes compared to UTC.\n         */\n        H.getTZOffset = function(timestamp) {\n            var d = H.Date;\n            return ((d.hcGetTimezoneOffset && d.hcGetTimezoneOffset(timestamp)) ||\n                d.hcTimezoneOffset || 0) * 60000;\n        };\n\n        /**\n         * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n         * human readable date string. The format is a subset of the formats for PHP's\n         * [strftime]{@link\n         * http://www.php.net/manual/en/function.strftime.php} function. Additional\n         * formats can be given in the {@link Highcharts.dateFormats} hook.\n         *\n         * @function #dateFormat\n         * @memberOf Highcharts\n         * @param {String} format - The desired format where various time\n         *        representations are prefixed with %.\n         * @param {Number} timestamp - The JavaScript timestamp.\n         * @param {Boolean} [capitalize=false] - Upper case first letter in the return.\n         * @returns {String} The formatted date.\n         */\n        H.dateFormat = function(format, timestamp, capitalize) {\n            if (!H.defined(timestamp) || isNaN(timestamp)) {\n                return H.defaultOptions.lang.invalidDate || '';\n            }\n            format = H.pick(format, '%Y-%m-%d %H:%M:%S');\n\n            var D = H.Date,\n                date = new D(timestamp - H.getTZOffset(timestamp)),\n                // get the basic time values\n                hours = date[D.hcGetHours](),\n                day = date[D.hcGetDay](),\n                dayOfMonth = date[D.hcGetDate](),\n                month = date[D.hcGetMonth](),\n                fullYear = date[D.hcGetFullYear](),\n                lang = H.defaultOptions.lang,\n                langWeekdays = lang.weekdays,\n                shortWeekdays = lang.shortWeekdays,\n                pad = H.pad,\n\n                // List all format keys. Custom formats can be added from the outside. \n                replacements = H.extend({\n\n                        //-- Day\n                        // Short weekday, like 'Mon'\n                        'a': shortWeekdays ?\n                            shortWeekdays[day] : langWeekdays[day].substr(0, 3),\n                        // Long weekday, like 'Monday'\n                        'A': langWeekdays[day],\n                        // Two digit day of the month, 01 to 31\n                        'd': pad(dayOfMonth),\n                        // Day of the month, 1 through 31\n                        'e': pad(dayOfMonth, 2, ' '),\n                        'w': day,\n\n                        // Week (none implemented)\n                        //'W': weekNumber(),\n\n                        //-- Month\n                        // Short month, like 'Jan'\n                        'b': lang.shortMonths[month],\n                        // Long month, like 'January'\n                        'B': lang.months[month],\n                        // Two digit month number, 01 through 12\n                        'm': pad(month + 1),\n\n                        //-- Year\n                        // Two digits year, like 09 for 2009\n                        'y': fullYear.toString().substr(2, 2),\n                        // Four digits year, like 2009\n                        'Y': fullYear,\n\n                        //-- Time\n                        // Two digits hours in 24h format, 00 through 23\n                        'H': pad(hours),\n                        // Hours in 24h format, 0 through 23\n                        'k': hours,\n                        // Two digits hours in 12h format, 00 through 11\n                        'I': pad((hours % 12) || 12),\n                        // Hours in 12h format, 1 through 12\n                        'l': (hours % 12) || 12,\n                        // Two digits minutes, 00 through 59\n                        'M': pad(date[D.hcGetMinutes]()),\n                        // Upper case AM or PM\n                        'p': hours < 12 ? 'AM' : 'PM',\n                        // Lower case AM or PM\n                        'P': hours < 12 ? 'am' : 'pm',\n                        // Two digits seconds, 00 through  59\n                        'S': pad(date.getSeconds()),\n                        // Milliseconds (naming from Ruby)\n                        'L': pad(Math.round(timestamp % 1000), 3)\n                    },\n\n                    /**\n                     * A hook for defining additional date format specifiers. New\n                     * specifiers are defined as key-value pairs by using the specifier\n                     * as key, and a function which takes the timestamp as value. This\n                     * function returns the formatted portion of the date.\n                     *\n                     * @type {Object}\n                     * @name dateFormats\n                     * @memberOf Highcharts\n                     * @sample highcharts/global/dateformats/ Adding support for week\n                     * number\n                     */\n                    H.dateFormats\n                );\n\n\n            // Do the replaces\n            H.objectEach(replacements, function(val, key) {\n                // Regex would do it in one line, but this is faster\n                while (format.indexOf('%' + key) !== -1) {\n                    format = format.replace(\n                        '%' + key,\n                        typeof val === 'function' ? val(timestamp) : val\n                    );\n                }\n\n            });\n\n            // Optionally capitalize the string and return\n            return capitalize ?\n                format.substr(0, 1).toUpperCase() + format.substr(1) :\n                format;\n        };\n\n        /**\n         * Format a single variable. Similar to sprintf, without the % prefix.\n         *\n         * @example\n         * formatSingle('.2f', 5); // => '5.00'.\n         *\n         * @function #formatSingle\n         * @memberOf Highcharts\n         * @param {String} format The format string.\n         * @param {*} val The value.\n         * @returns {String} The formatted representation of the value.\n         */\n        H.formatSingle = function(format, val) {\n            var floatRegex = /f$/,\n                decRegex = /\\.([0-9])/,\n                lang = H.defaultOptions.lang,\n                decimals;\n\n            if (floatRegex.test(format)) { // float\n                decimals = format.match(decRegex);\n                decimals = decimals ? decimals[1] : -1;\n                if (val !== null) {\n                    val = H.numberFormat(\n                        val,\n                        decimals,\n                        lang.decimalPoint,\n                        format.indexOf(',') > -1 ? lang.thousandsSep : ''\n                    );\n                }\n            } else {\n                val = H.dateFormat(format, val);\n            }\n            return val;\n        };\n\n        /**\n         * Format a string according to a subset of the rules of Python's String.format\n         * method.\n         *\n         * @function #format\n         * @memberOf Highcharts\n         * @param {String} str The string to format.\n         * @param {Object} ctx The context, a collection of key-value pairs where each\n         *        key is replaced by its value.\n         * @returns {String} The formatted string.\n         *\n         * @example\n         * var s = Highcharts.format(\n         *     'The {color} fox was {len:.2f} feet long',\n         *     { color: 'red', len: Math.PI }\n         * );\n         * // => The red fox was 3.14 feet long\n         */\n        H.format = function(str, ctx) {\n            var splitter = '{',\n                isInside = false,\n                segment,\n                valueAndFormat,\n                path,\n                i,\n                len,\n                ret = [],\n                val,\n                index;\n\n            while (str) {\n                index = str.indexOf(splitter);\n                if (index === -1) {\n                    break;\n                }\n\n                segment = str.slice(0, index);\n                if (isInside) { // we're on the closing bracket looking back\n\n                    valueAndFormat = segment.split(':');\n                    path = valueAndFormat.shift().split('.'); // get first and leave\n                    len = path.length;\n                    val = ctx;\n\n                    // Assign deeper paths\n                    for (i = 0; i < len; i++) {\n                        val = val[path[i]];\n                    }\n\n                    // Format the replacement\n                    if (valueAndFormat.length) {\n                        val = H.formatSingle(valueAndFormat.join(':'), val);\n                    }\n\n                    // Push the result and advance the cursor\n                    ret.push(val);\n\n                } else {\n                    ret.push(segment);\n\n                }\n                str = str.slice(index + 1); // the rest\n                isInside = !isInside; // toggle\n                splitter = isInside ? '}' : '{'; // now look for next matching bracket\n            }\n            ret.push(str);\n            return ret.join('');\n        };\n\n        /**\n         * Get the magnitude of a number.\n         *\n         * @function #getMagnitude\n         * @memberOf Highcharts\n         * @param {Number} number The number.\n         * @returns {Number} The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2\n         *        etc.\n         */\n        H.getMagnitude = function(num) {\n            return Math.pow(10, Math.floor(Math.log(num) / Math.LN10));\n        };\n\n        /**\n         * Take an interval and normalize it to multiples of round numbers.\n         *\n         * @todo  Move this function to the Axis prototype. It is here only for\n         *        historical reasons.\n         * @function #normalizeTickInterval\n         * @memberOf Highcharts\n         * @param {Number} interval - The raw, un-rounded interval.\n         * @param {Array} [multiples] - Allowed multiples.\n         * @param {Number} [magnitude] - The magnitude of the number.\n         * @param {Boolean} [allowDecimals] - Whether to allow decimals.\n         * @param {Boolean} [hasTickAmount] - If it has tickAmount, avoid landing\n         *        on tick intervals lower than original.\n         * @returns {Number} The normalized interval.\n         */\n        H.normalizeTickInterval = function(interval, multiples, magnitude,\n            allowDecimals, hasTickAmount) {\n            var normalized,\n                i,\n                retInterval = interval;\n\n            // round to a tenfold of 1, 2, 2.5 or 5\n            magnitude = H.pick(magnitude, 1);\n            normalized = interval / magnitude;\n\n            // multiples for a linear scale\n            if (!multiples) {\n                multiples = hasTickAmount ?\n                    // Finer grained ticks when the tick amount is hard set, including\n                    // when alignTicks is true on multiple axes (#4580).\n                    [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n\n                    // Else, let ticks fall on rounder numbers\n                    [1, 2, 2.5, 5, 10];\n\n\n                // the allowDecimals option\n                if (allowDecimals === false) {\n                    if (magnitude === 1) {\n                        multiples = H.grep(multiples, function(num) {\n                            return num % 1 === 0;\n                        });\n                    } else if (magnitude <= 0.1) {\n                        multiples = [1 / magnitude];\n                    }\n                }\n            }\n\n            // normalize the interval to the nearest multiple\n            for (i = 0; i < multiples.length; i++) {\n                retInterval = multiples[i];\n                // only allow tick amounts smaller than natural\n                if ((hasTickAmount && retInterval * magnitude >= interval) ||\n                    (!hasTickAmount && (normalized <= (multiples[i] +\n                        (multiples[i + 1] || multiples[i])) / 2))) {\n                    break;\n                }\n            }\n\n            // Multiply back to the correct magnitude. Correct floats to appropriate \n            // precision (#6085).\n            retInterval = H.correctFloat(\n                retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10)\n            );\n\n            return retInterval;\n        };\n\n\n        /**\n         * Sort an object array and keep the order of equal items. The ECMAScript\n         * standard does not specify the behaviour when items are equal.\n         *\n         * @function #stableSort\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to sort.\n         * @param {Function} sortFunction - The function to sort it with, like with \n         *        regular Array.prototype.sort.\n         * @returns {void}\n         */\n        H.stableSort = function(arr, sortFunction) {\n            var length = arr.length,\n                sortValue,\n                i;\n\n            // Add index to each item\n            for (i = 0; i < length; i++) {\n                arr[i].safeI = i; // stable sort index\n            }\n\n            arr.sort(function(a, b) {\n                sortValue = sortFunction(a, b);\n                return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n            });\n\n            // Remove index from items\n            for (i = 0; i < length; i++) {\n                delete arr[i].safeI; // stable sort index\n            }\n        };\n\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.min` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function #arrayMin\n         * @memberOf  Highcharts\n         * @param {Array} data An array of numbers.\n         * @returns {Number} The lowest number.\n         */\n        H.arrayMin = function(data) {\n            var i = data.length,\n                min = data[0];\n\n            while (i--) {\n                if (data[i] < min) {\n                    min = data[i];\n                }\n            }\n            return min;\n        };\n\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.max` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function #arrayMax\n         * @memberOf  Highcharts\n         * @param {Array} data - An array of numbers.\n         * @returns {Number} The highest number.\n         */\n        H.arrayMax = function(data) {\n            var i = data.length,\n                max = data[0];\n\n            while (i--) {\n                if (data[i] > max) {\n                    max = data[i];\n                }\n            }\n            return max;\n        };\n\n        /**\n         * Utility method that destroys any SVGElement instances that are properties on\n         * the given object. It loops all properties and invokes destroy if there is a\n         * destroy method. The property is then delete.\n         *\n         * @function #destroyObjectProperties\n         * @memberOf Highcharts\n         * @param {Object} obj - The object to destroy properties on.\n         * @param {Object} [except] - Exception, do not destroy this property, only\n         *    delete it.\n         * @returns {void}\n         */\n        H.destroyObjectProperties = function(obj, except) {\n            H.objectEach(obj, function(val, n) {\n                // If the object is non-null and destroy is defined\n                if (val && val !== except && val.destroy) {\n                    // Invoke the destroy\n                    val.destroy();\n                }\n\n                // Delete the property from the object.\n                delete obj[n];\n            });\n        };\n\n\n        /**\n         * Discard a HTML element by moving it to the bin and delete.\n         *\n         * @function #discardElement\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} element - The HTML node to discard.\n         * @returns {void}\n         */\n        H.discardElement = function(element) {\n            var garbageBin = H.garbageBin;\n            // create a garbage bin element, not part of the DOM\n            if (!garbageBin) {\n                garbageBin = H.createElement('div');\n            }\n\n            // move the node and empty bin\n            if (element) {\n                garbageBin.appendChild(element);\n            }\n            garbageBin.innerHTML = '';\n        };\n\n        /**\n         * Fix JS round off float errors.\n         *\n         * @function #correctFloat\n         * @memberOf Highcharts\n         * @param {Number} num - A float number to fix.\n         * @param {Number} [prec=14] - The precision.\n         * @returns {Number} The corrected float number.\n         */\n        H.correctFloat = function(num, prec) {\n            return parseFloat(\n                num.toPrecision(prec || 14)\n            );\n        };\n\n        /**\n         * Set the global animation to either a given value, or fall back to the given\n         * chart's animation option.\n         *\n         * @function #setAnimation\n         * @memberOf Highcharts\n         * @param {Boolean|Animation} animation - The animation object.\n         * @param {Object} chart - The chart instance.\n         * @returns {void}\n         * @todo This function always relates to a chart, and sets a property on the\n         *        renderer, so it should be moved to the SVGRenderer.\n         */\n        H.setAnimation = function(animation, chart) {\n            chart.renderer.globalAnimation = H.pick(\n                animation,\n                chart.options.chart.animation,\n                true\n            );\n        };\n\n        /**\n         * Get the animation in object form, where a disabled animation is always\n         * returned as `{ duration: 0 }`.\n         *\n         * @function #animObject\n         * @memberOf Highcharts\n         * @param {Boolean|AnimationOptions} animation - An animation setting. Can be an\n         *        object with duration, complete and easing properties, or a boolean to\n         *        enable or disable.\n         * @returns {AnimationOptions} An object with at least a duration property.\n         */\n        H.animObject = function(animation) {\n            return H.isObject(animation) ?\n                H.merge(animation) : {\n                    duration: animation ? 500 : 0\n                };\n        };\n\n        /**\n         * The time unit lookup\n         */\n        H.timeUnits = {\n            millisecond: 1,\n            second: 1000,\n            minute: 60000,\n            hour: 3600000,\n            day: 24 * 3600000,\n            week: 7 * 24 * 3600000,\n            month: 28 * 24 * 3600000,\n            year: 364 * 24 * 3600000\n        };\n\n        /**\n         * Format a number and return a string based on input settings.\n         *\n         * @function #numberFormat\n         * @memberOf Highcharts\n         * @param {Number} number - The input number to format.\n         * @param {Number} decimals - The amount of decimals. A value of -1 preserves\n         *        the amount in the input number.\n         * @param {String} [decimalPoint] - The decimal point, defaults to the one given\n         *        in the lang options, or a dot.\n         * @param {String} [thousandsSep] - The thousands separator, defaults to the one\n         *        given in the lang options, or a space character.\n         * @returns {String} The formatted number.\n         *\n         * @sample members/highcharts-numberformat/ Custom number format\n         */\n        H.numberFormat = function(number, decimals, decimalPoint, thousandsSep) {\n            number = +number || 0;\n            decimals = +decimals;\n\n            var lang = H.defaultOptions.lang,\n                origDec = (number.toString().split('.')[1] || '').length,\n                strinteger,\n                thousands,\n                ret,\n                roundedNumber;\n\n            if (decimals === -1) {\n                // Preserve decimals. Not huge numbers (#3793).\n                decimals = Math.min(origDec, 20);\n            } else if (!H.isNumber(decimals)) {\n                decimals = 2;\n            }\n\n            // Add another decimal to avoid rounding errors of float numbers. (#4573)\n            // Then use toFixed to handle rounding.\n            roundedNumber = (\n                Math.abs(number) + Math.pow(10, -Math.max(decimals, origDec) - 1)\n            ).toFixed(decimals);\n\n            // A string containing the positive integer component of the number\n            strinteger = String(H.pInt(roundedNumber));\n\n            // Leftover after grouping into thousands. Can be 0, 1 or 3.\n            thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n\n            // Language\n            decimalPoint = H.pick(decimalPoint, lang.decimalPoint);\n            thousandsSep = H.pick(thousandsSep, lang.thousandsSep);\n\n            // Start building the return\n            ret = number < 0 ? '-' : '';\n\n            // Add the leftover after grouping into thousands. For example, in the\n            // number 42 000 000, this line adds 42.\n            ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n\n            // Add the remaining thousands groups, joined by the thousands separator\n            ret += strinteger\n                .substr(thousands)\n                .replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n\n            // Add the decimal point and the decimal component\n            if (decimals) {\n                // Get the decimal component\n                ret += decimalPoint + roundedNumber.slice(-decimals);\n            }\n\n            return ret;\n        };\n\n        /**\n         * Easing definition\n         * @ignore\n         * @param   {Number} pos Current position, ranging from 0 to 1.\n         */\n        Math.easeInOutSine = function(pos) {\n            return -0.5 * (Math.cos(Math.PI * pos) - 1);\n        };\n\n        /**\n         * Get the computed CSS value for given element and property, only for numerical\n         * properties. For width and height, the dimension of the inner box (excluding\n         * padding) is returned. Used for fitting the chart within the container.\n         *\n         * @function #getStyle\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} el - A HTML element.\n         * @param {String} prop - The property name.\n         * @param {Boolean} [toInt=true] - Parse to integer.\n         * @returns {Number} - The numeric value.\n         */\n        H.getStyle = function(el, prop, toInt) {\n\n            var style;\n\n            // For width and height, return the actual inner pixel size (#4913)\n            if (prop === 'width') {\n                return Math.min(el.offsetWidth, el.scrollWidth) -\n                    H.getStyle(el, 'padding-left') -\n                    H.getStyle(el, 'padding-right');\n            } else if (prop === 'height') {\n                return Math.min(el.offsetHeight, el.scrollHeight) -\n                    H.getStyle(el, 'padding-top') -\n                    H.getStyle(el, 'padding-bottom');\n            }\n\n            // Otherwise, get the computed style\n            style = win.getComputedStyle(el, undefined);\n            if (style) {\n                style = style.getPropertyValue(prop);\n                if (H.pick(toInt, true)) {\n                    style = H.pInt(style);\n                }\n            }\n            return style;\n        };\n\n        /**\n         * Search for an item in an array.\n         *\n         * @function #inArray\n         * @memberOf Highcharts\n         * @param {*} item - The item to search for.\n         * @param {arr} arr - The array or node collection to search in.\n         * @returns {Number} - The index within the array, or -1 if not found.\n         */\n        H.inArray = function(item, arr) {\n            return arr.indexOf ? arr.indexOf(item) : [].indexOf.call(arr, item);\n        };\n\n        /**\n         * Filter an array by a callback.\n         *\n         * @function #grep\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to filter.\n         * @param {Function} callback - The callback function. The function receives the\n         *        item as the first argument. Return `true` if the item is to be\n         *        preserved.\n         * @returns {Array} - A new, filtered array.\n         */\n        H.grep = function(arr, callback) {\n            return [].filter.call(arr, callback);\n        };\n\n        /**\n         * Return the value of the first element in the array that satisfies the \n         * provided testing function.\n         *\n         * @function #find\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to test.\n         * @param {Function} callback - The callback function. The function receives the\n         *        item as the first argument. Return `true` if this item satisfies the\n         *        condition.\n         * @returns {Mixed} - The value of the element.\n         */\n        H.find = function(arr, callback) {\n            return [].find.call(arr, callback);\n        };\n\n        /**\n         * Map an array by a callback.\n         *\n         * @function #map\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to map.\n         * @param {Function} fn - The callback function. Return the new value for the \n         *        new array.\n         * @returns {Array} - A new array item with modified items.\n         */\n        H.map = function(arr, fn) {\n            var results = [],\n                i = 0,\n                len = arr.length;\n\n            for (; i < len; i++) {\n                results[i] = fn.call(arr[i], arr[i], i, arr);\n            }\n\n            return results;\n        };\n\n        /**\n         * Get the element's offset position, corrected for `overflow: auto`.\n         *\n         * @function #offset\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement} el - The HTML element.\n         * @returns {Object} An object containing `left` and `top` properties for the\n         * position in the page.\n         */\n        H.offset = function(el) {\n            var docElem = doc.documentElement,\n                box = el.getBoundingClientRect();\n\n            return {\n                top: box.top + (win.pageYOffset || docElem.scrollTop) -\n                    (docElem.clientTop || 0),\n                left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n                    (docElem.clientLeft || 0)\n            };\n        };\n\n        /**\n         * Stop running animation.\n         *\n         * @todo A possible extension to this would be to stop a single property, when\n         * we want to continue animating others. Then assign the prop to the timer\n         * in the Fx.run method, and check for the prop here. This would be an\n         * improvement in all cases where we stop the animation from .attr. Instead of\n         * stopping everything, we can just stop the actual attributes we're setting.\n         *\n         * @function #stop\n         * @memberOf Highcharts\n         * @param {SVGElement} el - The SVGElement to stop animation on.\n         * @param {string} [prop] - The property to stop animating. If given, the stop\n         *    method will stop a single property from animating, while others continue.\n         * @returns {void}\n         */\n        H.stop = function(el, prop) {\n\n            var i = timers.length;\n\n            // Remove timers related to this element (#4519)\n            while (i--) {\n                if (timers[i].elem === el && (!prop || prop === timers[i].prop)) {\n                    timers[i].stopped = true; // #4667\n                }\n            }\n        };\n\n        /**\n         * Iterate over an array.\n         *\n         * @function #each\n         * @memberOf Highcharts\n         * @param {Array} arr - The array to iterate over.\n         * @param {Function} fn - The iterator callback. It passes three arguments:\n         * * item - The array item.\n         * * index - The item's index in the array.\n         * * arr - The array that each is being applied to.\n         * @param {Object} [ctx] The context.\n         */\n        H.each = function(arr, fn, ctx) { // modern browsers\n            return Array.prototype.forEach.call(arr, fn, ctx);\n        };\n\n        /**\n         * Iterate over object key pairs in an object.\n         *\n         * @function #objectEach\n         * @memberOf Highcharts\n         * @param  {Object}   obj - The object to iterate over.\n         * @param  {Function} fn  - The iterator callback. It passes three arguments:\n         * * value - The property value.\n         * * key - The property key.\n         * * obj - The object that objectEach is being applied to.\n         * @param  {Object}   ctx The context\n         */\n        H.objectEach = function(obj, fn, ctx) {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    fn.call(ctx, obj[key], key, obj);\n                }\n            }\n        };\n\n        /**\n         * Add an event listener.\n         *\n         * @function #addEvent\n         * @memberOf Highcharts\n         * @param {Object} el - The element or object to add a listener to. It can be a\n         *        {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n         * @param {String} type - The event type.\n         * @param {Function} fn - The function callback to execute when the event is \n         *        fired.\n         * @returns {Function} A callback function to remove the added event.\n         */\n        H.addEvent = function(el, type, fn) {\n\n            var events = el.hcEvents = el.hcEvents || {};\n\n            function wrappedFn(e) {\n                e.target = e.srcElement || win; // #2820\n                fn.call(el, e);\n            }\n\n            // Handle DOM events in modern browsers\n            if (el.addEventListener) {\n                el.addEventListener(type, fn, false);\n\n                // Handle old IE implementation\n            } else if (el.attachEvent) {\n\n                if (!el.hcEventsIE) {\n                    el.hcEventsIE = {};\n                }\n\n                // Link wrapped fn with original fn, so we can get this in removeEvent\n                el.hcEventsIE[fn.toString()] = wrappedFn;\n\n                el.attachEvent('on' + type, wrappedFn);\n            }\n\n            if (!events[type]) {\n                events[type] = [];\n            }\n\n            events[type].push(fn);\n\n            // Return a function that can be called to remove this event.\n            return function() {\n                H.removeEvent(el, type, fn);\n            };\n        };\n\n        /**\n         * Remove an event that was added with {@link Highcharts#addEvent}.\n         *\n         * @function #removeEvent\n         * @memberOf Highcharts\n         * @param {Object} el - The element to remove events on.\n         * @param {String} [type] - The type of events to remove. If undefined, all\n         *        events are removed from the element.\n         * @param {Function} [fn] - The specific callback to remove. If undefined, all\n         *        events that match the element and optionally the type are removed.\n         * @returns {void}\n         */\n        H.removeEvent = function(el, type, fn) {\n\n            var events,\n                hcEvents = el.hcEvents,\n                index;\n\n            function removeOneEvent(type, fn) {\n                if (el.removeEventListener) {\n                    el.removeEventListener(type, fn, false);\n                } else if (el.attachEvent) {\n                    fn = el.hcEventsIE[fn.toString()];\n                    el.detachEvent('on' + type, fn);\n                }\n            }\n\n            function removeAllEvents() {\n                var types,\n                    len;\n\n                if (!el.nodeName) {\n                    return; // break on non-DOM events\n                }\n\n                if (type) {\n                    types = {};\n                    types[type] = true;\n                } else {\n                    types = hcEvents;\n                }\n\n                H.objectEach(types, function(val, n) {\n                    if (hcEvents[n]) {\n                        len = hcEvents[n].length;\n                        while (len--) {\n                            removeOneEvent(n, hcEvents[n][len]);\n                        }\n                    }\n                });\n            }\n\n            if (hcEvents) {\n                if (type) {\n                    events = hcEvents[type] || [];\n                    if (fn) {\n                        index = H.inArray(fn, events);\n                        if (index > -1) {\n                            events.splice(index, 1);\n                            hcEvents[type] = events;\n                        }\n                        removeOneEvent(type, fn);\n\n                    } else {\n                        removeAllEvents();\n                        hcEvents[type] = [];\n                    }\n                } else {\n                    removeAllEvents();\n                    el.hcEvents = {};\n                }\n            }\n        };\n\n        /**\n         * Fire an event that was registered with {@link Highcharts#addEvent}.\n         *\n         * @function #fireEvent\n         * @memberOf Highcharts\n         * @param {Object} el - The object to fire the event on. It can be a\n         *        {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n         * @param {String} type - The type of event.\n         * @param {Object} [eventArguments] - Custom event arguments that are passed on\n         *        as an argument to the event handler.\n         * @param {Function} [defaultFunction] - The default function to execute if the \n         *        other listeners haven't returned false.\n         * @returns {void}\n         */\n        H.fireEvent = function(el, type, eventArguments, defaultFunction) {\n            var e,\n                hcEvents = el.hcEvents,\n                events,\n                len,\n                i,\n                fn;\n\n            eventArguments = eventArguments || {};\n\n            if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {\n                e = doc.createEvent('Events');\n                e.initEvent(type, true, true);\n                //e.target = el;\n\n                H.extend(e, eventArguments);\n\n                if (el.dispatchEvent) {\n                    el.dispatchEvent(e);\n                } else {\n                    el.fireEvent(type, e);\n                }\n\n            } else if (hcEvents) {\n\n                events = hcEvents[type] || [];\n                len = events.length;\n\n                if (!eventArguments.target) { // We're running a custom event\n\n                    H.extend(eventArguments, {\n                        // Attach a simple preventDefault function to skip default\n                        // handler if called. The built-in defaultPrevented property is\n                        // not overwritable (#5112)\n                        preventDefault: function() {\n                            eventArguments.defaultPrevented = true;\n                        },\n                        // Setting target to native events fails with clicking the\n                        // zoom-out button in Chrome.\n                        target: el,\n                        // If the type is not set, we're running a custom event (#2297).\n                        // If it is set, we're running a browser event, and setting it\n                        // will cause en error in IE8 (#2465).\t\t\n                        type: type\n                    });\n                }\n\n\n                for (i = 0; i < len; i++) {\n                    fn = events[i];\n\n                    // If the event handler return false, prevent the default handler\n                    // from executing\n                    if (fn && fn.call(el, eventArguments) === false) {\n                        eventArguments.preventDefault();\n                    }\n                }\n            }\n\n            // Run the default if not prevented\n            if (defaultFunction && !eventArguments.defaultPrevented) {\n                defaultFunction(eventArguments);\n            }\n        };\n\n        /**\n         * An animation configuration. Animation configurations can also be defined as\n         * booleans, where `false` turns off animation and `true` defaults to a duration\n         * of 500ms.\n         * @typedef {Object} AnimationOptions\n         * @property {Number} duration - The animation duration in milliseconds.\n         * @property {String} [easing] - The name of an easing function as defined on\n         *     the `Math` object.\n         * @property {Function} [complete] - A callback function to exectute when the\n         *     animation finishes.\n         * @property {Function} [step] - A callback function to execute on each step of\n         *     each attribute or CSS property that's being animated. The first argument\n         *     contains information about the animation and progress.\n         */\n\n\n        /**\n         * The global animate method, which uses Fx to create individual animators.\n         *\n         * @function #animate\n         * @memberOf Highcharts\n         * @param {HTMLDOMElement|SVGElement} el - The element to animate.\n         * @param {Object} params - An object containing key-value pairs of the\n         *        properties to animate. Supports numeric as pixel-based CSS properties\n         *        for HTML objects and attributes for SVGElements.\n         * @param {AnimationOptions} [opt] - Animation options.\n         */\n        H.animate = function(el, params, opt) {\n            var start,\n                unit = '',\n                end,\n                fx,\n                args;\n\n            if (!H.isObject(opt)) { // Number or undefined/null\n                args = arguments;\n                opt = {\n                    duration: args[2],\n                    easing: args[3],\n                    complete: args[4]\n                };\n            }\n            if (!H.isNumber(opt.duration)) {\n                opt.duration = 400;\n            }\n            opt.easing = typeof opt.easing === 'function' ?\n                opt.easing :\n                (Math[opt.easing] || Math.easeInOutSine);\n            opt.curAnim = H.merge(params);\n\n            H.objectEach(params, function(val, prop) {\n                // Stop current running animation of this property\n                H.stop(el, prop);\n\n                fx = new H.Fx(el, opt, prop);\n                end = null;\n\n                if (prop === 'd') {\n                    fx.paths = fx.initPath(\n                        el,\n                        el.d,\n                        params.d\n                    );\n                    fx.toD = params.d;\n                    start = 0;\n                    end = 1;\n                } else if (el.attr) {\n                    start = el.attr(prop);\n                } else {\n                    start = parseFloat(H.getStyle(el, prop)) || 0;\n                    if (prop !== 'opacity') {\n                        unit = 'px';\n                    }\n                }\n\n                if (!end) {\n                    end = val;\n                }\n                if (end && end.match && end.match('px')) {\n                    end = end.replace(/px/g, ''); // #4351\n                }\n                fx.run(start, end, unit);\n            });\n        };\n\n        /**\n         * Factory to create new series prototypes.\n         *\n         * @function #seriesType\n         * @memberOf Highcharts\n         *\n         * @param {String} type - The series type name.\n         * @param {String} parent - The parent series type name. Use `line` to inherit\n         *        from the basic {@link Series} object.\n         * @param {Object} options - The additional default options that is merged with\n         *        the parent's options.\n         * @param {Object} props - The properties (functions and primitives) to set on\n         *        the new prototype.\n         * @param {Object} [pointProps] - Members for a series-specific extension of the\n         *        {@link Point} prototype if needed.\n         * @returns {*} - The newly created prototype as extended from {@link Series}\n         * or its derivatives.\n         */\n        // docs: add to API + extending Highcharts\n        H.seriesType = function(type, parent, options, props, pointProps) {\n            var defaultOptions = H.getOptions(),\n                seriesTypes = H.seriesTypes;\n\n            if (seriesTypes[type]) {\n                return H.error(27); // Series type already defined\n            }\n\n            // Merge the options\n            defaultOptions.plotOptions[type] = H.merge(\n                defaultOptions.plotOptions[parent],\n                options\n            );\n\n            // Create the class\n            seriesTypes[type] = H.extendClass(seriesTypes[parent] ||\n                function() {}, props);\n            seriesTypes[type].prototype.type = type;\n\n            // Create the point class if needed\n            if (pointProps) {\n                seriesTypes[type].prototype.pointClass =\n                    H.extendClass(H.Point, pointProps);\n            }\n\n            return seriesTypes[type];\n        };\n\n        /**\n         * Get a unique key for using in internal element id's and pointers. The key\n         * is composed of a random hash specific to this Highcharts instance, and a \n         * counter.\n         * @function #uniqueKey\n         * @memberOf Highcharts\n         * @return {string} The key.\n         * @example\n         * var id = H.uniqueKey(); // => 'highcharts-x45f6hp-0'\n         */\n        H.uniqueKey = (function() {\n\n            var uniqueKeyHash = Math.random().toString(36).substring(2, 9),\n                idCounter = 0;\n\n            return function() {\n                return 'highcharts-' + uniqueKeyHash + '-' + idCounter++;\n            };\n        }());\n\n        /**\n         * Register Highcharts as a plugin in jQuery\n         */\n        if (win.jQuery) {\n            win.jQuery.fn.highcharts = function() {\n                var args = [].slice.call(arguments);\n\n                if (this[0]) { // this[0] is the renderTo div\n\n                    // Create the chart\n                    if (args[0]) {\n                        new H[ // eslint-disable-line no-new\n                            // Constructor defaults to Chart\n                            H.isString(args[0]) ? args.shift() : 'Chart'\n                        ](this[0], args[0], args[1]);\n                        return this;\n                    }\n\n                    // When called without parameters or with the return argument,\n                    // return an existing chart\n                    return charts[H.attr(this[0], 'data-highcharts-chart')];\n                }\n            };\n        }\n\n\n        /**\n         * Compatibility section to add support for legacy IE. This can be removed if\n         * old IE support is not needed.\n         */\n        if (doc && !doc.defaultView) {\n            H.getStyle = function(el, prop) {\n                var val,\n                    alias = {\n                        width: 'clientWidth',\n                        height: 'clientHeight'\n                    }[prop];\n\n                if (el.style[prop]) {\n                    return H.pInt(el.style[prop]);\n                }\n                if (prop === 'opacity') {\n                    prop = 'filter';\n                }\n\n                // Getting the rendered width and height\n                if (alias) {\n                    el.style.zoom = 1;\n                    return Math.max(el[alias] - 2 * H.getStyle(el, 'padding'), 0);\n                }\n\n                val = el.currentStyle[prop.replace(/\\-(\\w)/g, function(a, b) {\n                    return b.toUpperCase();\n                })];\n                if (prop === 'filter') {\n                    val = val.replace(\n                        /alpha\\(opacity=([0-9]+)\\)/,\n                        function(a, b) {\n                            return b / 100;\n                        }\n                    );\n                }\n\n                return val === '' ? 1 : H.pInt(val);\n            };\n        }\n\n        if (!Array.prototype.forEach) {\n            H.each = function(arr, fn, ctx) { // legacy\n                var i = 0,\n                    len = arr.length;\n                for (; i < len; i++) {\n                    if (fn.call(ctx, arr[i], i, arr) === false) {\n                        return i;\n                    }\n                }\n            };\n        }\n\n        if (!Array.prototype.indexOf) {\n            H.inArray = function(item, arr) {\n                var len,\n                    i = 0;\n\n                if (arr) {\n                    len = arr.length;\n\n                    for (; i < len; i++) {\n                        if (arr[i] === item) {\n                            return i;\n                        }\n                    }\n                }\n\n                return -1;\n            };\n        }\n\n        if (!Array.prototype.filter) {\n            H.grep = function(elements, fn) {\n                var ret = [],\n                    i = 0,\n                    length = elements.length;\n\n                for (; i < length; i++) {\n                    if (fn(elements[i], i)) {\n                        ret.push(elements[i]);\n                    }\n                }\n\n                return ret;\n            };\n        }\n\n        if (!Array.prototype.find) {\n            H.find = function(arr, fn) {\n                var i,\n                    length = arr.length;\n\n                for (i = 0; i < length; i++) {\n                    if (fn(arr[i], i)) {\n                        return arr[i];\n                    }\n                }\n            };\n        }\n\n        //--- End compatibility section ---\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            isNumber = H.isNumber,\n            map = H.map,\n            merge = H.merge,\n            pInt = H.pInt;\n\n        /**\n         * @typedef {string} ColorString\n         * A valid color to be parsed and handled by Highcharts. Highcharts internally \n         * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n         * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n         * browsers and displayed correctly, but Highcharts is not able to process them\n         * and apply concepts like opacity and brightening.\n         */\n        /**\n         * Handle color operations. The object methods are chainable.\n         * @param {String} input The input color in either rbga or hex format\n         */\n        H.Color = function(input) {\n            // Backwards compatibility, allow instanciation without new\n            if (!(this instanceof H.Color)) {\n                return new H.Color(input);\n            }\n            // Initialize\n            this.init(input);\n        };\n        H.Color.prototype = {\n\n            // Collection of parsers. This can be extended from the outside by pushing parsers\n            // to Highcharts.Color.prototype.parsers.\n            parsers: [{\n                // RGBA color\n                regex: /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\n                parse: function(result) {\n                    return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];\n                }\n            }, {\n                // RGB color\n                regex: /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\n                parse: function(result) {\n                    return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n                }\n            }],\n\n            // Collection of named colors. Can be extended from the outside by adding\n            // colors to Highcharts.Color.prototype.names.\n            names: {\n                none: 'rgba(255,255,255,0)',\n                white: '#ffffff',\n                black: '#000000'\n            },\n\n            /**\n             * Parse the input color to rgba array\n             * @param {String} input\n             */\n            init: function(input) {\n                var result,\n                    rgba,\n                    i,\n                    parser,\n                    len;\n\n                this.input = input = this.names[\n                    input && input.toLowerCase ?\n                    input.toLowerCase() :\n                    ''\n                ] || input;\n\n                // Gradients\n                if (input && input.stops) {\n                    this.stops = map(input.stops, function(stop) {\n                        return new H.Color(stop[1]);\n                    });\n\n                    // Solid colors\n                } else {\n\n                    // Check if it's possible to do bitmasking instead of regex\n                    if (input && input[0] === '#') {\n\n                        len = input.length;\n                        input = parseInt(input.substr(1), 16);\n\n                        // Handle long-form, e.g. #AABBCC\n                        if (len === 7) {\n\n                            rgba = [\n                                (input & 0xFF0000) >> 16,\n                                (input & 0xFF00) >> 8,\n                                (input & 0xFF),\n                                1\n                            ];\n\n                            // Handle short-form, e.g. #ABC\n                            // In short form, the value is assumed to be the same \n                            // for both nibbles for each component. e.g. #ABC = #AABBCC\n                        } else if (len === 4) {\n\n                            rgba = [\n                                ((input & 0xF00) >> 4) | (input & 0xF00) >> 8,\n                                ((input & 0xF0) >> 4) | (input & 0xF0),\n                                ((input & 0xF) << 4) | (input & 0xF),\n                                1\n                            ];\n                        }\n                    }\n\n                    // Otherwise, check regex parsers\n                    if (!rgba) {\n                        i = this.parsers.length;\n                        while (i-- && !rgba) {\n                            parser = this.parsers[i];\n                            result = parser.regex.exec(input);\n                            if (result) {\n                                rgba = parser.parse(result);\n                            }\n                        }\n                    }\n                }\n                this.rgba = rgba || [];\n            },\n\n            /**\n             * Return the color a specified format\n             * @param {String} format\n             */\n            get: function(format) {\n                var input = this.input,\n                    rgba = this.rgba,\n                    ret;\n\n                if (this.stops) {\n                    ret = merge(input);\n                    ret.stops = [].concat(ret.stops);\n                    each(this.stops, function(stop, i) {\n                        ret.stops[i] = [ret.stops[i][0], stop.get(format)];\n                    });\n\n                    // it's NaN if gradient colors on a column chart\n                } else if (rgba && isNumber(rgba[0])) {\n                    if (format === 'rgb' || (!format && rgba[3] === 1)) {\n                        ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n                    } else if (format === 'a') {\n                        ret = rgba[3];\n                    } else {\n                        ret = 'rgba(' + rgba.join(',') + ')';\n                    }\n                } else {\n                    ret = input;\n                }\n                return ret;\n            },\n\n            /**\n             * Brighten the color\n             * @param {Number} alpha\n             */\n            brighten: function(alpha) {\n                var i,\n                    rgba = this.rgba;\n\n                if (this.stops) {\n                    each(this.stops, function(stop) {\n                        stop.brighten(alpha);\n                    });\n\n                } else if (isNumber(alpha) && alpha !== 0) {\n                    for (i = 0; i < 3; i++) {\n                        rgba[i] += pInt(alpha * 255);\n\n                        if (rgba[i] < 0) {\n                            rgba[i] = 0;\n                        }\n                        if (rgba[i] > 255) {\n                            rgba[i] = 255;\n                        }\n                    }\n                }\n                return this;\n            },\n\n            /**\n             * Set the color's opacity to a given alpha value\n             * @param {Number} alpha\n             */\n            setOpacity: function(alpha) {\n                this.rgba[3] = alpha;\n                return this;\n            },\n\n            /*\n             * Return an intermediate color between two colors.\n             *\n             * @param  {Highcharts.Color} to\n             *         The color object to tween to.\n             * @param  {Number} pos\n             *         The intermediate position, where 0 is the from color (current\n             *         color item), and 1 is the `to` color.\n             *\n             * @return {String}\n             *         The intermediate color in rgba notation.\n             */\n            tweenTo: function(to, pos) {\n                // Check for has alpha, because rgba colors perform worse due to lack of\n                // support in WebKit.\n                var from = this,\n                    hasAlpha,\n                    ret;\n\n                // Unsupported color, return to-color (#3920)\n                if (!to.rgba.length) {\n                    ret = to.input || 'none';\n\n                    // Interpolate\n                } else {\n                    from = from.rgba;\n                    to = to.rgba;\n                    hasAlpha = (to[3] !== 1 || from[3] !== 1);\n                    ret = (hasAlpha ? 'rgba(' : 'rgb(') +\n                        Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +\n                        Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +\n                        Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +\n                        (hasAlpha ?\n                            (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) :\n                            '') + ')';\n                }\n                return ret;\n            }\n        };\n        H.color = function(input) {\n            return new H.Color(input);\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var SVGElement,\n            SVGRenderer,\n\n            addEvent = H.addEvent,\n            animate = H.animate,\n            attr = H.attr,\n            charts = H.charts,\n            color = H.color,\n            css = H.css,\n            createElement = H.createElement,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            destroyObjectProperties = H.destroyObjectProperties,\n            doc = H.doc,\n            each = H.each,\n            extend = H.extend,\n            erase = H.erase,\n            grep = H.grep,\n            hasTouch = H.hasTouch,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isObject = H.isObject,\n            isString = H.isString,\n            isWebKit = H.isWebKit,\n            merge = H.merge,\n            noop = H.noop,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            pInt = H.pInt,\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            stop = H.stop,\n            svg = H.svg,\n            SVG_NS = H.SVG_NS,\n            symbolSizes = H.symbolSizes,\n            win = H.win;\n\n        /**\n         * @typedef {Object} SVGDOMElement - An SVG DOM element.\n         */\n        /**\n         * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n         * rendering layer of Highcharts. Combined with the {@link\n         * Highcharts.SVGRenderer} object, these prototypes allow freeform annotation\n         * in the charts or even in HTML pages without instanciating a chart. The\n         * SVGElement can also wrap HTML labels, when `text` or `label` elements are\n         * created with the `useHTML` parameter.\n         *\n         * The SVGElement instances are created through factory functions on the \n         * {@link Highcharts.SVGRenderer} object, like\n         * [rect]{@link Highcharts.SVGRenderer#rect}, [path]{@link\n         * Highcharts.SVGRenderer#path}, [text]{@link Highcharts.SVGRenderer#text},\n         * [label]{@link Highcharts.SVGRenderer#label}, [g]{@link\n         * Highcharts.SVGRenderer#g} and more.\n         *\n         * @class Highcharts.SVGElement\n         */\n        SVGElement = H.SVGElement = function() {\n            return this;\n        };\n        extend(SVGElement.prototype, /** @lends Highcharts.SVGElement.prototype */ {\n\n            // Default base for animation\n            opacity: 1,\n            SVG_NS: SVG_NS,\n\n            /**\n             * For labels, these CSS properties are applied to the `text` node directly.\n             * @type {Array.<string>}\n             */\n            textProps: ['direction', 'fontSize', 'fontWeight', 'fontFamily',\n                'fontStyle', 'color', 'lineHeight', 'width', 'textAlign',\n                'textDecoration', 'textOverflow', 'textOutline'\n            ],\n\n            /**\n             * Initialize the SVG renderer. This function only exists to make the\n             * initiation process overridable. It should not be called directly.\n             *\n             * @param  {HighchartsSVGRenderer} renderer\n             *         The SVGRenderer instance to initialize to.\n             * @param  {String} nodeName\n             *         The SVG node name.\n             * @returns {void}\n             */\n            init: function(renderer, nodeName) {\n\n                /** \n                 * The DOM node. Each SVGRenderer instance wraps a main DOM node, but \n                 * may also represent more nodes.\n                 * @type {SVGDOMNode|HTMLDOMNode}\n                 */\n                this.element = nodeName === 'span' ?\n                    createElement(nodeName) :\n                    doc.createElementNS(this.SVG_NS, nodeName);\n\n                /**\n                 * The renderer that the SVGElement belongs to.\n                 * @type {Highcharts.SVGRenderer}\n                 */\n                this.renderer = renderer;\n            },\n\n            /**\n             * Animate to given attributes or CSS properties.\n             * \n             * @param {SVGAttributes} params SVG attributes or CSS to animate.\n             * @param {AnimationOptions} [options] Animation options.\n             * @param {Function} [complete] Function to perform at the end of animation.\n             *\n             * @sample highcharts/members/element-on/\n             *         Setting some attributes by animation\n             * \n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            animate: function(params, options, complete) {\n                var animOptions = H.animObject(\n                    pick(options, this.renderer.globalAnimation, true)\n                );\n                if (animOptions.duration !== 0) {\n                    if (complete) { // allows using a callback with the global animation without overwriting it\n                        animOptions.complete = complete;\n                    }\n                    animate(this, params, animOptions);\n                } else {\n                    this.attr(params, null, complete);\n                    if (animOptions.step) {\n                        animOptions.step.call(this);\n                    }\n                }\n                return this;\n            },\n\n            /**\n             * @typedef {Object} GradientOptions\n             * @property {Object} linearGradient Holds an object that defines the start\n             *    position and the end position relative to the shape.\n             * @property {Number} linearGradient.x1 Start horizontal position of the\n             *    gradient. Ranges 0-1.\n             * @property {Number} linearGradient.x2 End horizontal position of the\n             *    gradient. Ranges 0-1.\n             * @property {Number} linearGradient.y1 Start vertical position of the\n             *    gradient. Ranges 0-1.\n             * @property {Number} linearGradient.y2 End vertical position of the\n             *    gradient. Ranges 0-1.\n             * @property {Object} radialGradient Holds an object that defines the center\n             *    position and the radius.\n             * @property {Number} radialGradient.cx Center horizontal position relative\n             *    to the shape. Ranges 0-1.\n             * @property {Number} radialGradient.cy Center vertical position relative\n             *    to the shape. Ranges 0-1.\n             * @property {Number} radialGradient.r Radius relative to the shape. Ranges\n             *    0-1.\n             * @property {Array.<Array>} stops The first item in each tuple is the\n             *    position in the gradient, where 0 is the start of the gradient and 1\n             *    is the end of the gradient. Multiple stops can be applied. The second\n             *    item is the color for each stop. This color can also be given in the\n             *    rgba format.\n             *\n             * @example\n             * // Linear gradient used as a color option\n             * color: {\n             *     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n             *         stops: [\n             *             [0, '#003399'], // start\n             *             [0.5, '#ffffff'], // middle\n             *             [1, '#3366AA'] // end\n             *         ]\n             *     }\n             * }\n             */\n            /**\n             * Build and apply an SVG gradient out of a common JavaScript configuration\n             * object. This function is called from the attribute setters.\n             *\n             * @private\n             * @param {GradientOptions} color The gradient options structure.\n             * @param {string} prop The property to apply, can either be `fill` or\n             * `stroke`. \n             * @param {SVGDOMElement} elem SVG DOM element to apply the gradient on.\n             */\n            colorGradient: function(color, prop, elem) {\n                var renderer = this.renderer,\n                    colorObject,\n                    gradName,\n                    gradAttr,\n                    radAttr,\n                    gradients,\n                    gradientObject,\n                    stops,\n                    stopColor,\n                    stopOpacity,\n                    radialReference,\n                    id,\n                    key = [],\n                    value;\n\n                // Apply linear or radial gradients\n                if (color.radialGradient) {\n                    gradName = 'radialGradient';\n                } else if (color.linearGradient) {\n                    gradName = 'linearGradient';\n                }\n\n                if (gradName) {\n                    gradAttr = color[gradName];\n                    gradients = renderer.gradients;\n                    stops = color.stops;\n                    radialReference = elem.radialReference;\n\n                    // Keep < 2.2 kompatibility\n                    if (isArray(gradAttr)) {\n                        color[gradName] = gradAttr = {\n                            x1: gradAttr[0],\n                            y1: gradAttr[1],\n                            x2: gradAttr[2],\n                            y2: gradAttr[3],\n                            gradientUnits: 'userSpaceOnUse'\n                        };\n                    }\n\n                    // Correct the radial gradient for the radial reference system\n                    if (\n                        gradName === 'radialGradient' &&\n                        radialReference &&\n                        !defined(gradAttr.gradientUnits)\n                    ) {\n                        radAttr = gradAttr; // Save the radial attributes for updating\n                        gradAttr = merge(\n                            gradAttr,\n                            renderer.getRadialAttr(radialReference, radAttr), {\n                                gradientUnits: 'userSpaceOnUse'\n                            }\n                        );\n                    }\n\n                    // Build the unique key to detect whether we need to create a new element (#1282)\n                    objectEach(gradAttr, function(val, n) {\n                        if (n !== 'id') {\n                            key.push(n, val);\n                        }\n                    });\n                    objectEach(stops, function(val) {\n                        key.push(val);\n                    });\n                    key = key.join(',');\n\n                    // Check if a gradient object with the same config object is created within this renderer\n                    if (gradients[key]) {\n                        id = gradients[key].attr('id');\n\n                    } else {\n\n                        // Set the id and create the element\n                        gradAttr.id = id = H.uniqueKey();\n                        gradients[key] = gradientObject = renderer.createElement(gradName)\n                            .attr(gradAttr)\n                            .add(renderer.defs);\n\n                        gradientObject.radAttr = radAttr;\n\n                        // The gradient needs to keep a list of stops to be able to destroy them\n                        gradientObject.stops = [];\n                        each(stops, function(stop) {\n                            var stopObject;\n                            if (stop[1].indexOf('rgba') === 0) {\n                                colorObject = H.color(stop[1]);\n                                stopColor = colorObject.get('rgb');\n                                stopOpacity = colorObject.get('a');\n                            } else {\n                                stopColor = stop[1];\n                                stopOpacity = 1;\n                            }\n                            stopObject = renderer.createElement('stop').attr({\n                                offset: stop[0],\n                                'stop-color': stopColor,\n                                'stop-opacity': stopOpacity\n                            }).add(gradientObject);\n\n                            // Add the stop element to the gradient\n                            gradientObject.stops.push(stopObject);\n                        });\n                    }\n\n                    // Set the reference to the gradient object\n                    value = 'url(' + renderer.url + '#' + id + ')';\n                    elem.setAttribute(prop, value);\n                    elem.gradient = key;\n\n                    // Allow the color to be concatenated into tooltips formatters etc. (#2995)\n                    color.toString = function() {\n                        return value;\n                    };\n                }\n            },\n\n            /**\n             * Apply a text outline through a custom CSS property, by copying the text\n             * element and apply stroke to the copy. Used internally. Contrast checks\n             * at http://jsfiddle.net/highcharts/43soe9m1/2/ .\n             *\n             * @private\n             * @param {String} textOutline A custom CSS `text-outline` setting, defined\n             *    by `width color`. \n             * @example\n             * // Specific color\n             * text.css({\n             *    textOutline: '1px black'\n             * });\n             * // Automatic contrast\n             * text.css({\n             *    color: '#000000', // black text\n             *    textOutline: '1px contrast' // => white outline\n             * });\n             */\n            applyTextOutline: function(textOutline) {\n                var elem = this.element,\n                    tspans,\n                    tspan,\n                    hasContrast = textOutline.indexOf('contrast') !== -1,\n                    styles = {},\n                    color,\n                    strokeWidth,\n                    firstRealChild,\n                    i;\n\n                // When the text shadow is set to contrast, use dark stroke for light\n                // text and vice versa.\n                if (hasContrast) {\n                    styles.textOutline = textOutline = textOutline.replace(\n                        /contrast/g,\n                        this.renderer.getContrast(elem.style.fill)\n                    );\n                }\n\n                // Extract the stroke width and color\n                textOutline = textOutline.split(' ');\n                color = textOutline[textOutline.length - 1];\n                strokeWidth = textOutline[0];\n\n                if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n\n                    this.fakeTS = true; // Fake text shadow\n\n                    tspans = [].slice.call(elem.getElementsByTagName('tspan'));\n\n                    // In order to get the right y position of the clone,\n                    // copy over the y setter\n                    this.ySetter = this.xSetter;\n\n                    // Since the stroke is applied on center of the actual outline, we\n                    // need to double it to get the correct stroke-width outside the \n                    // glyphs.\n                    strokeWidth = strokeWidth.replace(\n                        /(^[\\d\\.]+)(.*?)$/g,\n                        function(match, digit, unit) {\n                            return (2 * digit) + unit;\n                        }\n                    );\n\n                    // Remove shadows from previous runs. Iterate from the end to\n                    // support removing items inside the cycle (#6472).\n                    i = tspans.length;\n                    while (i--) {\n                        tspan = tspans[i];\n                        if (tspan.getAttribute('class') === 'highcharts-text-outline') {\n                            // Remove then erase\n                            erase(tspans, elem.removeChild(tspan));\n                        }\n                    }\n\n                    // For each of the tspans, create a stroked copy behind it.\n                    firstRealChild = elem.firstChild;\n                    each(tspans, function(tspan, y) {\n                        var clone;\n\n                        // Let the first line start at the correct X position\n                        if (y === 0) {\n                            tspan.setAttribute('x', elem.getAttribute('x'));\n                            y = elem.getAttribute('y');\n                            tspan.setAttribute('y', y || 0);\n                            if (y === null) {\n                                elem.setAttribute('y', 0);\n                            }\n                        }\n\n                        // Create the clone and apply outline properties\n                        clone = tspan.cloneNode(1);\n                        attr(clone, {\n                            'class': 'highcharts-text-outline',\n                            'fill': color,\n                            'stroke': color,\n                            'stroke-width': strokeWidth,\n                            'stroke-linejoin': 'round'\n                        });\n                        elem.insertBefore(clone, firstRealChild);\n                    });\n                }\n            },\n\n            /**\n             *\n             * @typedef {Object} SVGAttributes An object of key-value pairs for SVG\n             *   attributes. Attributes in Highcharts elements for the most parts\n             *   correspond to SVG, but some are specific to Highcharts, like `zIndex`,\n             *   `rotation`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n             *   attributes containing a hyphen are _not_ camel-cased, they should be\n             *   quoted to preserve the hyphen.\n             * @example\n             * {\n             *     'stroke': '#ff0000', // basic\n             *     'stroke-width': 2, // hyphenated\n             *     'rotation': 45 // custom\n             *     'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n             * }\n             */\n            /**\n             * Apply native and custom attributes to the SVG elements.\n             * \n             * In order to set the rotation center for rotation, set x and y to 0 and\n             * use `translateX` and `translateY` attributes to position the element\n             * instead.\n             *\n             * Attributes frequently used in Highcharts are `fill`, `stroke`,\n             * `stroke-width`.\n             *\n             * @param {SVGAttributes|String} hash - The native and custom SVG\n             *    attributes. \n             * @param {string} [val] - If the type of the first argument is `string`, \n             *    the second can be a value, which will serve as a single attribute\n             *    setter. If the first argument is a string and the second is undefined,\n             *    the function serves as a getter and the current value of the property\n             *    is returned.\n             * @param {Function} [complete] - A callback function to execute after setting\n             *    the attributes. This makes the function compliant and interchangeable\n             *    with the {@link SVGElement#animate} function.\n             * @param {boolean} [continueAnimation=true] Used internally when `.attr` is\n             *    called as part of an animation step. Otherwise, calling `.attr` for an\n             *    attribute will stop animation for that attribute.\n             *    \n             * @returns {SVGElement|string|number} If used as a setter, it returns the \n             *    current {@link SVGElement} so the calls can be chained. If used as a \n             *    getter, the current value of the attribute is returned.\n             *\n             * @sample highcharts/members/renderer-rect/\n             *         Setting some attributes\n             * \n             * @example\n             * // Set multiple attributes\n             * element.attr({\n             *     stroke: 'red',\n             *     fill: 'blue',\n             *     x: 10,\n             *     y: 10\n             * });\n             *\n             * // Set a single attribute\n             * element.attr('stroke', 'red');\n             *\n             * // Get an attribute\n             * element.attr('stroke'); // => 'red'\n             * \n             */\n            attr: function(hash, val, complete, continueAnimation) {\n                var key,\n                    element = this.element,\n                    hasSetSymbolSize,\n                    ret = this,\n                    skipAttr,\n                    setter;\n\n                // single key-value pair\n                if (typeof hash === 'string' && val !== undefined) {\n                    key = hash;\n                    hash = {};\n                    hash[key] = val;\n                }\n\n                // used as a getter: first argument is a string, second is undefined\n                if (typeof hash === 'string') {\n                    ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);\n\n                    // setter\n                } else {\n\n                    objectEach(hash, function(val, key) {\n                        skipAttr = false;\n\n                        // Unless .attr is from the animator update, stop current\n                        // running animation of this property\n                        if (!continueAnimation) {\n                            stop(this, key);\n                        }\n\n                        // Special handling of symbol attributes\n                        if (\n                            this.symbolName &&\n                            /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/\n                            .test(key)\n                        ) {\n                            if (!hasSetSymbolSize) {\n                                this.symbolAttr(hash);\n                                hasSetSymbolSize = true;\n                            }\n                            skipAttr = true;\n                        }\n\n                        if (this.rotation && (key === 'x' || key === 'y')) {\n                            this.doTransform = true;\n                        }\n\n                        if (!skipAttr) {\n                            setter = this[key + 'Setter'] || this._defaultSetter;\n                            setter.call(this, val, key, element);\n\n\n                        }\n                    }, this);\n\n                    this.afterSetters();\n                }\n\n                // In accordance with animate, run a complete callback\n                if (complete) {\n                    complete();\n                }\n\n                return ret;\n            },\n\n            /**\n             * This method is executed in the end of {attr}, after setting all attributes in the hash.\n             * In can be used to efficiently consolidate multiple attributes in one SVG property -- e.g.,\n             * translate, rotate and scale are merged in one \"transform\" attribute in the SVG node.\n             */\n            afterSetters: function() {\n                // Update transform. Do this outside the loop to prevent redundant updating for batch setting\n                // of attributes.\n                if (this.doTransform) {\n                    this.updateTransform();\n                    this.doTransform = false;\n                }\n            },\n\n\n\n            /**\n             * Add a class name to an element.\n             *\n             * @param {string} className - The new class name to add.\n             * @param {boolean} [replace=false] - When true, the existing class name(s)\n             *    will be overwritten with the new one. When false, the new one is\n             *    added.\n             * @returns {Highcharts.SVGElement} Return the SVG element for chainability.\n             */\n            addClass: function(className, replace) {\n                var currentClassName = this.attr('class') || '';\n\n                if (currentClassName.indexOf(className) === -1) {\n                    if (!replace) {\n                        className =\n                            (currentClassName + (currentClassName ? ' ' : '') +\n                                className).replace('  ', ' ');\n                    }\n                    this.attr('class', className);\n                }\n                return this;\n            },\n\n            /**\n             * Check if an element has the given class name.\n             * @param  {string}  className - The class name to check for.\n             * @return {Boolean}\n             */\n            hasClass: function(className) {\n                return attr(this.element, 'class').indexOf(className) !== -1;\n            },\n\n            /**\n             * Remove a class name from the element.\n             * @param  {string} className The class name to remove.\n             * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n             */\n            removeClass: function(className) {\n                attr(this.element, 'class', (attr(this.element, 'class') || '').replace(className, ''));\n                return this;\n            },\n\n            /**\n             * If one of the symbol size affecting parameters are changed,\n             * check all the others only once for each call to an element's\n             * .attr() method\n             * @param {Object} hash - The attributes to set.\n             * @private\n             */\n            symbolAttr: function(hash) {\n                var wrapper = this;\n\n                each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function(key) {\n                    wrapper[key] = pick(hash[key], wrapper[key]);\n                });\n\n                wrapper.attr({\n                    d: wrapper.renderer.symbols[wrapper.symbolName](\n                        wrapper.x,\n                        wrapper.y,\n                        wrapper.width,\n                        wrapper.height,\n                        wrapper\n                    )\n                });\n            },\n\n            /**\n             * Apply a clipping rectangle to this element.\n             * \n             * @param {ClipRect} [clipRect] - The clipping rectangle. If skipped, the\n             *    current clip is removed.\n             * @returns {Highcharts.SVGElement} Returns the SVG element to allow chaining.\n             */\n            clip: function(clipRect) {\n                return this.attr(\n                    'clip-path',\n                    clipRect ?\n                    'url(' + this.renderer.url + '#' + clipRect.id + ')' :\n                    'none'\n                );\n            },\n\n            /**\n             * Calculate the coordinates needed for drawing a rectangle crisply and\n             * return the calculated attributes.\n             * \n             * @param {Object} rect - A rectangle.\n             * @param {number} rect.x - The x position.\n             * @param {number} rect.y - The y position.\n             * @param {number} rect.width - The width.\n             * @param {number} rect.height - The height.\n             * @param {number} [strokeWidth] - The stroke width to consider when\n             *    computing crisp positioning. It can also be set directly on the rect\n             *    parameter.\n             *\n             * @returns {{x: Number, y: Number, width: Number, height: Number}} The\n             *    modified rectangle arguments.\n             */\n            crisp: function(rect, strokeWidth) {\n\n                var wrapper = this,\n                    attribs = {},\n                    normalizer;\n\n                strokeWidth = strokeWidth || rect.strokeWidth || 0;\n                normalizer = Math.round(strokeWidth) % 2 / 2; // Math.round because strokeWidth can sometimes have roundoff errors\n\n                // normalize for crisp edges\n                rect.x = Math.floor(rect.x || wrapper.x || 0) + normalizer;\n                rect.y = Math.floor(rect.y || wrapper.y || 0) + normalizer;\n                rect.width = Math.floor((rect.width || wrapper.width || 0) - 2 * normalizer);\n                rect.height = Math.floor((rect.height || wrapper.height || 0) - 2 * normalizer);\n                if (defined(rect.strokeWidth)) {\n                    rect.strokeWidth = strokeWidth;\n                }\n\n                objectEach(rect, function(val, key) {\n                    if (wrapper[key] !== val) { // only set attribute if changed\n                        wrapper[key] = attribs[key] = val;\n                    }\n                });\n\n                return attribs;\n            },\n\n            /**\n             * Set styles for the element. In addition to CSS styles supported by \n             * native SVG and HTML elements, there are also some custom made for \n             * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n             * elements.\n             * @param {CSSObject} styles The new CSS styles.\n             * @returns {Highcharts.SVGElement} Return the SVG element for chaining.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Styled text\n             */\n            css: function(styles) {\n                var oldStyles = this.styles,\n                    newStyles = {},\n                    elem = this.element,\n                    textWidth,\n                    serializedCss = '',\n                    hyphenate,\n                    hasNew = !oldStyles,\n                    // These CSS properties are interpreted internally by the SVG\n                    // renderer, but are not supported by SVG and should not be added to\n                    // the DOM. In styled mode, no CSS should find its way to the DOM\n                    // whatsoever (#6173, #6474).\n                    svgPseudoProps = ['textOutline', 'textOverflow', 'width'];\n\n                // convert legacy\n                if (styles && styles.color) {\n                    styles.fill = styles.color;\n                }\n\n                // Filter out existing styles to increase performance (#2640)\n                if (oldStyles) {\n                    objectEach(styles, function(style, n) {\n                        if (style !== oldStyles[n]) {\n                            newStyles[n] = style;\n                            hasNew = true;\n                        }\n                    });\n                }\n                if (hasNew) {\n\n                    // Merge the new styles with the old ones\n                    if (oldStyles) {\n                        styles = extend(\n                            oldStyles,\n                            newStyles\n                        );\n                    }\n\n                    // Get the text width from style\n                    textWidth = this.textWidth = (\n                        styles &&\n                        styles.width &&\n                        styles.width !== 'auto' &&\n                        elem.nodeName.toLowerCase() === 'text' &&\n                        pInt(styles.width)\n                    );\n\n                    // store object\n                    this.styles = styles;\n\n                    if (textWidth && (!svg && this.renderer.forExport)) {\n                        delete styles.width;\n                    }\n\n                    // serialize and set style attribute\n                    if (isMS && !svg) {\n                        css(this.element, styles);\n                    } else {\n                        hyphenate = function(a, b) {\n                            return '-' + b.toLowerCase();\n                        };\n                        objectEach(styles, function(style, n) {\n                            if (inArray(n, svgPseudoProps) === -1) {\n                                serializedCss +=\n                                    n.replace(/([A-Z])/g, hyphenate) + ':' +\n                                    style + ';';\n                            }\n                        });\n                        if (serializedCss) {\n                            attr(elem, 'style', serializedCss); // #1881\n                        }\n                    }\n\n\n                    if (this.added) {\n\n                        // Rebuild text after added. Cache mechanisms in the buildText\n                        // will prevent building if there are no significant changes.\n                        if (this.element.nodeName === 'text') {\n                            this.renderer.buildText(this);\n                        }\n\n                        // Apply text outline after added\n                        if (styles && styles.textOutline) {\n                            this.applyTextOutline(styles.textOutline);\n                        }\n                    }\n                }\n\n                return this;\n            },\n\n\n            /**\n             * Get the computed style. Only in styled mode.\n             * @param {string} prop - The property name to check for.\n             * @returns {string} The current computed value.\n             * @example\n             * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n             */\n            getStyle: function(prop) {\n                return win.getComputedStyle(this.element || this, '')\n                    .getPropertyValue(prop);\n            },\n\n            /**\n             * Get the computed stroke width in pixel values. This is used extensively\n             * when drawing shapes to ensure the shapes are rendered crsip and\n             * positioned correctly relative to each other. Using `shape-rendering: \n             * crispEdges` leaves us less control over positioning, for example when we\n             * want to stack columns next to each other, or position things \n             * pixel-perfectly within the plot box.\n             *\n             * The common pattern when placing a shape is:\n             * * Create the SVGElement and add it to the DOM.\n             * * Read the computed `elem.strokeWidth()`.\n             * * Place it based on the stroke width.\n             *\n             * @returns {number} The stroke width in pixels. Even if the given stroke\n             * widtch (in CSS or by attributes) is based on `em` or other units, the \n             * pixel size is returned.\n             */\n            strokeWidth: function() {\n                var val = this.getStyle('stroke-width'),\n                    ret,\n                    dummy;\n\n                // Read pixel values directly\n                if (val.indexOf('px') === val.length - 2) {\n                    ret = pInt(val);\n\n                    // Other values like em, pt etc need to be measured\n                } else {\n                    dummy = doc.createElementNS(SVG_NS, 'rect');\n                    attr(dummy, {\n                        'width': val,\n                        'stroke-width': 0\n                    });\n                    this.element.parentNode.appendChild(dummy);\n                    ret = dummy.getBBox().width;\n                    dummy.parentNode.removeChild(dummy);\n                }\n                return ret;\n            },\n\n            /**\n             * Add an event listener. This is a simple setter that replaces all other\n             * events of the same type, opposed to the {@link Highcharts#addEvent}\n             * function.\n             * @param {string} eventType - The event type. If the type is `click`, \n             *    Highcharts will internally translate it to a `touchstart` event on \n             *    touch devices, to prevent the browser from waiting for a click event\n             *    from firing.\n             * @param {Function} handler - The handler callback.\n             * @returns {Highcharts.SVGElement} The SVGElement for chaining.\n             *\n             * @sample highcharts/members/element-on/\n             *         A clickable rectangle\n             */\n            on: function(eventType, handler) {\n                var svgElement = this,\n                    element = svgElement.element;\n\n                // touch\n                if (hasTouch && eventType === 'click') {\n                    element.ontouchstart = function(e) {\n                        svgElement.touchEventFired = Date.now(); // #2269\n                        e.preventDefault();\n                        handler.call(element, e);\n                    };\n                    element.onclick = function(e) {\n                        if (win.navigator.userAgent.indexOf('Android') === -1 ||\n                            Date.now() - (svgElement.touchEventFired || 0) > 1100) {\n                            handler.call(element, e);\n                        }\n                    };\n                } else {\n                    // simplest possible event model for internal use\n                    element['on' + eventType] = handler;\n                }\n                return this;\n            },\n\n            /**\n             * Set the coordinates needed to draw a consistent radial gradient across\n             * a shape regardless of positioning inside the chart. Used on pie slices\n             * to make all the slices have the same radial reference point.\n             *\n             * @param {Array} coordinates The center reference. The format is\n             *    `[centerX, centerY, diameter]` in pixels.\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            setRadialReference: function(coordinates) {\n                var existingGradient = this.renderer.gradients[this.element.gradient];\n\n                this.element.radialReference = coordinates;\n\n                // On redrawing objects with an existing gradient, the gradient needs\n                // to be repositioned (#3801)\n                if (existingGradient && existingGradient.radAttr) {\n                    existingGradient.animate(\n                        this.renderer.getRadialAttr(\n                            coordinates,\n                            existingGradient.radAttr\n                        )\n                    );\n                }\n\n                return this;\n            },\n\n            /**\n             * Move an object and its children by x and y values.\n             * \n             * @param {number} x - The x value.\n             * @param {number} y - The y value.\n             */\n            translate: function(x, y) {\n                return this.attr({\n                    translateX: x,\n                    translateY: y\n                });\n            },\n\n            /**\n             * Invert a group, rotate and flip. This is used internally on inverted \n             * charts, where the points and graphs are drawn as if not inverted, then\n             * the series group elements are inverted.\n             *\n             * @param {boolean} inverted - Whether to invert or not. An inverted shape\n             *    can be un-inverted by setting it to false.\n             * @returns {Highcharts.SVGElement} Return the SVGElement for chaining.\n             */\n            invert: function(inverted) {\n                var wrapper = this;\n                wrapper.inverted = inverted;\n                wrapper.updateTransform();\n                return wrapper;\n            },\n\n            /**\n             * Update the transform attribute based on internal properties. Deals with\n             * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n             * attributes and updates the SVG `transform` attribute.\n             * @private\n             * @returns {void}\n             */\n            updateTransform: function() {\n                var wrapper = this,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    scaleX = wrapper.scaleX,\n                    scaleY = wrapper.scaleY,\n                    inverted = wrapper.inverted,\n                    rotation = wrapper.rotation,\n                    element = wrapper.element,\n                    transform;\n\n                // flipping affects translate as adjustment for flipping around the group's axis\n                if (inverted) {\n                    translateX += wrapper.width;\n                    translateY += wrapper.height;\n                }\n\n                // Apply translate. Nearly all transformed elements have translation, so instead\n                // of checking for translate = 0, do it always (#1767, #1846).\n                transform = ['translate(' + translateX + ',' + translateY + ')'];\n\n                // apply rotation\n                if (inverted) {\n                    transform.push('rotate(90) scale(-1,1)');\n                } else if (rotation) { // text rotation\n                    transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');\n\n                    // Delete bBox memo when the rotation changes\n                    //delete wrapper.bBox;\n                }\n\n                // apply scale\n                if (defined(scaleX) || defined(scaleY)) {\n                    transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n                }\n\n                if (transform.length) {\n                    element.setAttribute('transform', transform.join(' '));\n                }\n            },\n\n            /**\n             * Bring the element to the front. Alternatively, a new zIndex can be set.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             *\n             * @sample highcharts/members/element-tofront/\n             *         Click an element to bring it to front\n             */\n            toFront: function() {\n                var element = this.element;\n                element.parentNode.appendChild(element);\n                return this;\n            },\n\n\n            /**\n             * Align the element relative to the chart or another box.\n             * \n             * @param {Object} [alignOptions] The alignment options. The function can be\n             *   called without this parameter in order to re-align an element after the\n             *   box has been updated.\n             * @param {string} [alignOptions.align=left] Horizontal alignment. Can be\n             *   one of `left`, `center` and `right`.\n             * @param {string} [alignOptions.verticalAlign=top] Vertical alignment. Can\n             *   be one of `top`, `middle` and `bottom`.\n             * @param {number} [alignOptions.x=0] Horizontal pixel offset from\n             *   alignment.\n             * @param {number} [alignOptions.y=0] Vertical pixel offset from alignment.\n             * @param {Boolean} [alignByTranslate=false] Use the `transform` attribute\n             *   with translateX and translateY custom attributes to align this elements\n             *   rather than `x` and `y` attributes.\n             * @param {String|Object} box The box to align to, needs a width and height.\n             *   When the box is a string, it refers to an object in the Renderer. For\n             *   example, when box is `spacingBox`, it refers to `Renderer.spacingBox`\n             *   which holds `width`, `height`, `x` and `y` properties.\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            align: function(alignOptions, alignByTranslate, box) {\n                var align,\n                    vAlign,\n                    x,\n                    y,\n                    attribs = {},\n                    alignTo,\n                    renderer = this.renderer,\n                    alignedObjects = renderer.alignedObjects,\n                    alignFactor,\n                    vAlignFactor;\n\n                // First call on instanciate\n                if (alignOptions) {\n                    this.alignOptions = alignOptions;\n                    this.alignByTranslate = alignByTranslate;\n                    if (!box || isString(box)) { // boxes other than renderer handle this internally\n                        this.alignTo = alignTo = box || 'renderer';\n                        erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize\n                        alignedObjects.push(this);\n                        box = null; // reassign it below\n                    }\n\n                    // When called on resize, no arguments are supplied\n                } else {\n                    alignOptions = this.alignOptions;\n                    alignByTranslate = this.alignByTranslate;\n                    alignTo = this.alignTo;\n                }\n\n                box = pick(box, renderer[alignTo], renderer);\n\n                // Assign variables\n                align = alignOptions.align;\n                vAlign = alignOptions.verticalAlign;\n                x = (box.x || 0) + (alignOptions.x || 0); // default: left align\n                y = (box.y || 0) + (alignOptions.y || 0); // default: top align\n\n                // Align\n                if (align === 'right') {\n                    alignFactor = 1;\n                } else if (align === 'center') {\n                    alignFactor = 2;\n                }\n                if (alignFactor) {\n                    x += (box.width - (alignOptions.width || 0)) / alignFactor;\n                }\n                attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n\n\n                // Vertical align\n                if (vAlign === 'bottom') {\n                    vAlignFactor = 1;\n                } else if (vAlign === 'middle') {\n                    vAlignFactor = 2;\n                }\n                if (vAlignFactor) {\n                    y += (box.height - (alignOptions.height || 0)) / vAlignFactor;\n                }\n                attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n\n                // Animate only if already placed\n                this[this.placed ? 'animate' : 'attr'](attribs);\n                this.placed = true;\n                this.alignAttr = attribs;\n\n                return this;\n            },\n\n            /**\n             * Get the bounding box (width, height, x and y) for the element. Generally\n             * used to get rendered text size. Since this is called a lot in charts,\n             * the results are cached based on text properties, in order to save DOM\n             * traffic. The returned bounding box includes the rotation, so for example\n             * a single text line of rotation 90 will report a greater height, and a\n             * width corresponding to the line-height.\n             *\n             * @param {boolean} [reload] Skip the cache and get the updated DOM bouding\n             *   box.\n             * @param {number} [rot] Override the element's rotation. This is internally\n             *   used on axis labels with a value of 0 to find out what the bounding box\n             *   would be have been if it were not rotated.\n             * @returns {Object} The bounding box with `x`, `y`, `width` and `height`\n             * properties.\n             *\n             * @sample highcharts/members/renderer-on-chart/\n             *         Draw a rectangle based on a text's bounding box\n             */\n            getBBox: function(reload, rot) {\n                var wrapper = this,\n                    bBox, // = wrapper.bBox,\n                    renderer = wrapper.renderer,\n                    width,\n                    height,\n                    rotation,\n                    rad,\n                    element = wrapper.element,\n                    styles = wrapper.styles,\n                    fontSize,\n                    textStr = wrapper.textStr,\n                    toggleTextShadowShim,\n                    cache = renderer.cache,\n                    cacheKeys = renderer.cacheKeys,\n                    cacheKey;\n\n                rotation = pick(rot, wrapper.rotation);\n                rad = rotation * deg2rad;\n\n\n                fontSize = element && SVGElement.prototype.getStyle.call(element, 'font-size');\n\n\n                if (textStr !== undefined) {\n\n                    cacheKey = textStr.toString();\n\n                    // Since numbers are monospaced, and numerical labels appear a lot\n                    // in a chart, we assume that a label of n characters has the same\n                    // bounding box as others of the same length. Unless there is inner\n                    // HTML in the label. In that case, leave the numbers as is (#5899).\n                    if (cacheKey.indexOf('<') === -1) {\n                        cacheKey = cacheKey.replace(/[0-9]/g, '0');\n                    }\n\n                    // Properties that affect bounding box\n                    cacheKey += [\n                            '',\n                            rotation || 0,\n                            fontSize,\n                            styles && styles.width,\n                            styles && styles.textOverflow // #5968\n                        ]\n                        .join(',');\n\n                }\n\n                if (cacheKey && !reload) {\n                    bBox = cache[cacheKey];\n                }\n\n                // No cache found\n                if (!bBox) {\n\n                    // SVG elements\n                    if (element.namespaceURI === wrapper.SVG_NS || renderer.forExport) {\n                        try { // Fails in Firefox if the container has display: none.\n\n                            // When the text shadow shim is used, we need to hide the fake shadows\n                            // to get the correct bounding box (#3872)\n                            toggleTextShadowShim = this.fakeTS && function(display) {\n                                each(element.querySelectorAll('.highcharts-text-outline'), function(tspan) {\n                                    tspan.style.display = display;\n                                });\n                            };\n\n                            // Workaround for #3842, Firefox reporting wrong bounding box for shadows\n                            if (toggleTextShadowShim) {\n                                toggleTextShadowShim('none');\n                            }\n\n                            bBox = element.getBBox ?\n                                // SVG: use extend because IE9 is not allowed to change width and height in case\n                                // of rotation (below)\n                                extend({}, element.getBBox()) : {\n\n                                    // Legacy IE in export mode\n                                    width: element.offsetWidth,\n                                    height: element.offsetHeight\n                                };\n\n                            // #3842\n                            if (toggleTextShadowShim) {\n                                toggleTextShadowShim('');\n                            }\n                        } catch (e) {}\n\n                        // If the bBox is not set, the try-catch block above failed. The other condition\n                        // is for Opera that returns a width of -Infinity on hidden elements.\n                        if (!bBox || bBox.width < 0) {\n                            bBox = {\n                                width: 0,\n                                height: 0\n                            };\n                        }\n\n\n                        // VML Renderer or useHTML within SVG\n                    } else {\n\n                        bBox = wrapper.htmlGetBBox();\n\n                    }\n\n                    // True SVG elements as well as HTML elements in modern browsers using the .useHTML option\n                    // need to compensated for rotation\n                    if (renderer.isSVG) {\n                        width = bBox.width;\n                        height = bBox.height;\n\n                        // Workaround for wrong bounding box in IE, Edge and Chrome on\n                        // Windows. With Highcharts' default font, IE and Edge report\n                        // a box height of 16.899 and Chrome rounds it to 17. If this \n                        // stands uncorrected, it results in more padding added below\n                        // the text than above when adding a label border or background.\n                        // Also vertical positioning is affected.\n                        // http://jsfiddle.net/highcharts/em37nvuj/\n                        // (#1101, #1505, #1669, #2568, #6213).\n                        if (\n                            styles &&\n                            styles.fontSize === '11px' &&\n                            Math.round(height) === 17\n                        ) {\n                            bBox.height = height = 14;\n                        }\n\n                        // Adjust for rotated text\n                        if (rotation) {\n                            bBox.width = Math.abs(height * Math.sin(rad)) + Math.abs(width * Math.cos(rad));\n                            bBox.height = Math.abs(height * Math.cos(rad)) + Math.abs(width * Math.sin(rad));\n                        }\n                    }\n\n                    // Cache it. When loading a chart in a hidden iframe in Firefox and IE/Edge, the\n                    // bounding box height is 0, so don't cache it (#5620).\n                    if (cacheKey && bBox.height > 0) {\n\n                        // Rotate (#4681)\n                        while (cacheKeys.length > 250) {\n                            delete cache[cacheKeys.shift()];\n                        }\n\n                        if (!cache[cacheKey]) {\n                            cacheKeys.push(cacheKey);\n                        }\n                        cache[cacheKey] = bBox;\n                    }\n                }\n                return bBox;\n            },\n\n            /**\n             * Show the element after it has been hidden. \n             *\n             * @param {boolean} [inherit=false] Set the visibility attribute to\n             * `inherit` rather than `visible`. The difference is that an element with\n             * `visibility=\"visible\"` will be visible even if the parent is hidden.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            show: function(inherit) {\n                return this.attr({\n                    visibility: inherit ? 'inherit' : 'visible'\n                });\n            },\n\n            /**\n             * Hide the element, equivalent to setting the `visibility` attribute to\n             * `hidden`.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            hide: function() {\n                return this.attr({\n                    visibility: 'hidden'\n                });\n            },\n\n            /**\n             * Fade out an element by animating its opacity down to 0, and hide it on\n             * complete. Used internally for the tooltip.\n             * \n             * @param {number} [duration=150] The fade duration in milliseconds.\n             */\n            fadeOut: function(duration) {\n                var elemWrapper = this;\n                elemWrapper.animate({\n                    opacity: 0\n                }, {\n                    duration: duration || 150,\n                    complete: function() {\n                        elemWrapper.attr({\n                            y: -9999\n                        }); // #3088, assuming we're only using this for tooltips\n                    }\n                });\n            },\n\n            /**\n             * Add the element to the DOM. All elements must be added this way.\n             * \n             * @param {Highcharts.SVGElement|SVGDOMElement} [parent] The parent item to add it to.\n             *   If undefined, the element is added to the {@link\n             *   Highcharts.SVGRenderer.box}.\n             *\n             * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             *\n             * @sample highcharts/members/renderer-g - Elements added to a group\n             */\n            add: function(parent) {\n\n                var renderer = this.renderer,\n                    element = this.element,\n                    inserted;\n\n                if (parent) {\n                    this.parentGroup = parent;\n                }\n\n                // mark as inverted\n                this.parentInverted = parent && parent.inverted;\n\n                // build formatted text\n                if (this.textStr !== undefined) {\n                    renderer.buildText(this);\n                }\n\n                // Mark as added\n                this.added = true;\n\n                // If we're adding to renderer root, or other elements in the group\n                // have a z index, we need to handle it\n                if (!parent || parent.handleZ || this.zIndex) {\n                    inserted = this.zIndexSetter();\n                }\n\n                // If zIndex is not handled, append at the end\n                if (!inserted) {\n                    (parent ? parent.element : renderer.box).appendChild(element);\n                }\n\n                // fire an event for internal hooks\n                if (this.onAdd) {\n                    this.onAdd();\n                }\n\n                return this;\n            },\n\n            /**\n             * Removes an element from the DOM.\n             *\n             * @private\n             * @param {SVGDOMElement|HTMLDOMElement} element The DOM node to remove.\n             */\n            safeRemoveChild: function(element) {\n                var parentNode = element.parentNode;\n                if (parentNode) {\n                    parentNode.removeChild(element);\n                }\n            },\n\n            /**\n             * Destroy the element and element wrapper and clear up the DOM and event\n             * hooks.\n             *\n             * @returns {void}\n             */\n            destroy: function() {\n                var wrapper = this,\n                    element = wrapper.element || {},\n                    parentToClean =\n                    wrapper.renderer.isSVG &&\n                    element.nodeName === 'SPAN' &&\n                    wrapper.parentGroup,\n                    grandParent,\n                    ownerSVGElement = element.ownerSVGElement,\n                    i;\n\n                // remove events\n                element.onclick = element.onmouseout = element.onmouseover =\n                    element.onmousemove = element.point = null;\n                stop(wrapper); // stop running animations\n\n                if (wrapper.clipPath && ownerSVGElement) {\n                    // Look for existing references to this clipPath and remove them\n                    // before destroying the element (#6196).\n                    each(\n                        ownerSVGElement.querySelectorAll('[clip-path]'),\n                        function(el) {\n                            // Include the closing paranthesis in the test to rule out\n                            // id's from 10 and above (#6550)\n                            if (el.getAttribute('clip-path')\n                                .indexOf(wrapper.clipPath.element.id + ')') > -1) {\n                                el.removeAttribute('clip-path');\n                            }\n                        }\n                    );\n                    wrapper.clipPath = wrapper.clipPath.destroy();\n                }\n\n                // Destroy stops in case this is a gradient object\n                if (wrapper.stops) {\n                    for (i = 0; i < wrapper.stops.length; i++) {\n                        wrapper.stops[i] = wrapper.stops[i].destroy();\n                    }\n                    wrapper.stops = null;\n                }\n\n                // remove element\n                wrapper.safeRemoveChild(element);\n\n\n\n                // In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393, #2697).\n                while (parentToClean && parentToClean.div && parentToClean.div.childNodes.length === 0) {\n                    grandParent = parentToClean.parentGroup;\n                    wrapper.safeRemoveChild(parentToClean.div);\n                    delete parentToClean.div;\n                    parentToClean = grandParent;\n                }\n\n                // remove from alignObjects\n                if (wrapper.alignTo) {\n                    erase(wrapper.renderer.alignedObjects, wrapper);\n                }\n\n                objectEach(wrapper, function(val, key) {\n                    delete wrapper[key];\n                });\n\n                return null;\n            },\n\n\n\n            xGetter: function(key) {\n                if (this.element.nodeName === 'circle') {\n                    if (key === 'x') {\n                        key = 'cx';\n                    } else if (key === 'y') {\n                        key = 'cy';\n                    }\n                }\n                return this._defaultGetter(key);\n            },\n\n            /**\n             * Get the current value of an attribute or pseudo attribute, used mainly\n             * for animation. Called internally from the {@link\n             * Highcharts.SVGRenderer#attr}\n             * function.\n             *\n             * @private\n             */\n            _defaultGetter: function(key) {\n                var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);\n\n                if (/^[\\-0-9\\.]+$/.test(ret)) { // is numerical\n                    ret = parseFloat(ret);\n                }\n                return ret;\n            },\n\n\n            dSetter: function(value, key, element) {\n                if (value && value.join) { // join path\n                    value = value.join(' ');\n                }\n                if (/(NaN| {2}|^$)/.test(value)) {\n                    value = 'M 0 0';\n                }\n                element.setAttribute(key, value);\n\n                this[key] = value;\n            },\n\n            alignSetter: function(value) {\n                var convert = {\n                    left: 'start',\n                    center: 'middle',\n                    right: 'end'\n                };\n                this.element.setAttribute('text-anchor', convert[value]);\n            },\n            opacitySetter: function(value, key, element) {\n                this[key] = value;\n                element.setAttribute(key, value);\n            },\n            titleSetter: function(value) {\n                var titleNode = this.element.getElementsByTagName('title')[0];\n                if (!titleNode) {\n                    titleNode = doc.createElementNS(this.SVG_NS, 'title');\n                    this.element.appendChild(titleNode);\n                }\n\n                // Remove text content if it exists\n                if (titleNode.firstChild) {\n                    titleNode.removeChild(titleNode.firstChild);\n                }\n\n                titleNode.appendChild(\n                    doc.createTextNode(\n                        (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895\n                    )\n                );\n            },\n            textSetter: function(value) {\n                if (value !== this.textStr) {\n                    // Delete bBox memo when the text changes\n                    delete this.bBox;\n\n                    this.textStr = value;\n                    if (this.added) {\n                        this.renderer.buildText(this);\n                    }\n                }\n            },\n            fillSetter: function(value, key, element) {\n                if (typeof value === 'string') {\n                    element.setAttribute(key, value);\n                } else if (value) {\n                    this.colorGradient(value, key, element);\n                }\n            },\n            visibilitySetter: function(value, key, element) {\n                // IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881, #3909)\n                if (value === 'inherit') {\n                    element.removeAttribute(key);\n                } else {\n                    element.setAttribute(key, value);\n                }\n            },\n            zIndexSetter: function(value, key) {\n                var renderer = this.renderer,\n                    parentGroup = this.parentGroup,\n                    parentWrapper = parentGroup || renderer,\n                    parentNode = parentWrapper.element || renderer.box,\n                    childNodes,\n                    otherElement,\n                    otherZIndex,\n                    element = this.element,\n                    inserted,\n                    run = this.added,\n                    i;\n\n                if (defined(value)) {\n                    element.zIndex = value; // So we can read it for other elements in the group\n                    value = +value;\n                    if (this[key] === value) { // Only update when needed (#3865)\n                        run = false;\n                    }\n                    this[key] = value;\n                }\n\n                // Insert according to this and other elements' zIndex. Before .add() is called,\n                // nothing is done. Then on add, or by later calls to zIndexSetter, the node\n                // is placed on the right place in the DOM.\n                if (run) {\n                    value = this.zIndex;\n\n                    if (value && parentGroup) {\n                        parentGroup.handleZ = true;\n                    }\n\n                    childNodes = parentNode.childNodes;\n                    for (i = 0; i < childNodes.length && !inserted; i++) {\n                        otherElement = childNodes[i];\n                        otherZIndex = otherElement.zIndex;\n                        if (otherElement !== element && (\n                                // Insert before the first element with a higher zIndex\n                                pInt(otherZIndex) > value ||\n                                // If no zIndex given, insert before the first element with a zIndex\n                                (!defined(value) && defined(otherZIndex)) ||\n                                // Negative zIndex versus no zIndex:\n                                // On all levels except the highest. If the parent is <svg>,\n                                // then we don't want to put items before <desc> or <defs>\n                                (value < 0 && !defined(otherZIndex) && parentNode !== renderer.box)\n\n                            )) {\n                            parentNode.insertBefore(element, otherElement);\n                            inserted = true;\n                        }\n                    }\n                    if (!inserted) {\n                        parentNode.appendChild(element);\n                    }\n                }\n                return inserted;\n            },\n            _defaultSetter: function(value, key, element) {\n                element.setAttribute(key, value);\n            }\n        });\n\n        // Some shared setters and getters\n        SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\n        SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter =\n            SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter =\n            SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function(value, key) {\n                this[key] = value;\n                this.doTransform = true;\n            };\n\n\n\n        /**\n         * Allows direct access to the Highcharts rendering layer in order to draw\n         * primitive shapes like circles, rectangles, paths or text directly on a chart,\n         * or independent from any chart. The SVGRenderer represents a wrapper object\n         * for SVGin modern browsers and through the VMLRenderer, for VML in IE < 8.\n         *\n         * An existing chart's renderer can be accessed through {@link Chart#renderer}.\n         * The renderer can also be used completely decoupled from a chart.\n         *\n         * @param {HTMLDOMElement} container - Where to put the SVG in the web page.\n         * @param {number} width - The width of the SVG.\n         * @param {number} height - The height of the SVG.\n         * @param {boolean} [forExport=false] - Whether the rendered content is intended\n         *   for export.\n         * @param {boolean} [allowHTML=true] - Whether the renderer is allowed to\n         *   include HTML text, which will be projected on top of the SVG.\n         *\n         * @example\n         * // Use directly without a chart object.\n         * var renderer = new Highcharts.Renderer(parentNode, 600, 400);\n         *\n         * @sample highcharts/members/renderer-on-chart - Annotating a chart programmatically.\n         * @sample highcharts/members/renderer-basic - Independedt SVG drawing.\n         *\n         * @class Highcharts.SVGRenderer\n         */\n        SVGRenderer = H.SVGRenderer = function() {\n            this.init.apply(this, arguments);\n        };\n        extend(SVGRenderer.prototype, /** @lends Highcharts.SVGRenderer.prototype */ {\n            /**\n             * A pointer to the renderer's associated Element class. The VMLRenderer\n             * will have a pointer to VMLElement here.\n             * @type {Highcharts.SVGElement}\n             */\n            Element: SVGElement,\n            SVG_NS: SVG_NS,\n            /**\n             * Initialize the SVGRenderer. Overridable initiator function that takes\n             * the same parameters as the constructor.\n             */\n            init: function(container, width, height, style, forExport, allowHTML) {\n                var renderer = this,\n                    boxWrapper,\n                    element,\n                    desc;\n\n                boxWrapper = renderer.createElement('svg')\n                    .attr({\n                        'version': '1.1',\n                        'class': 'highcharts-root'\n                    });\n                element = boxWrapper.element;\n                container.appendChild(element);\n\n                // For browsers other than IE, add the namespace attribute (#1978)\n                if (container.innerHTML.indexOf('xmlns') === -1) {\n                    attr(element, 'xmlns', this.SVG_NS);\n                }\n\n                // object properties\n                renderer.isSVG = true;\n\n                /** \n                 * The root `svg` node of the renderer.\n                 * @type {SVGDOMElement}\n                 */\n                this.box = element;\n                /** \n                 * The wrapper for the root `svg` node of the renderer.\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.boxWrapper = boxWrapper;\n                renderer.alignedObjects = [];\n\n                /**\n                 * Page url used for internal references.\n                 * @type {string}\n                 */\n                // #24, #672, #1070\n                this.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?\n                    win.location.href\n                    .replace(/#.*?$/, '') // remove the hash\n                    .replace(/<[^>]*>/g, '') // wing cut HTML\n                    .replace(/([\\('\\)])/g, '\\\\$1') // escape parantheses and quotes\n                    .replace(/ /g, '%20') : // replace spaces (needed for Safari only)\n                    '';\n\n                // Add description\n                desc = this.createElement('desc').add();\n                desc.element.appendChild(doc.createTextNode('Created with Highcharts 5.0.12'));\n\n\n                renderer.defs = this.createElement('defs').add();\n                renderer.allowHTML = allowHTML;\n                renderer.forExport = forExport;\n                renderer.gradients = {}; // Object where gradient SvgElements are stored\n                renderer.cache = {}; // Cache for numerical bounding boxes\n                renderer.cacheKeys = [];\n                renderer.imgCount = 0;\n\n                renderer.setSize(width, height, false);\n\n\n\n                // Issue 110 workaround:\n                // In Firefox, if a div is positioned by percentage, its pixel position may land\n                // between pixels. The container itself doesn't display this, but an SVG element\n                // inside this container will be drawn at subpixel precision. In order to draw\n                // sharp lines, this must be compensated for. This doesn't seem to work inside\n                // iframes though (like in jsFiddle).\n                var subPixelFix, rect;\n                if (isFirefox && container.getBoundingClientRect) {\n                    subPixelFix = function() {\n                        css(container, {\n                            left: 0,\n                            top: 0\n                        });\n                        rect = container.getBoundingClientRect();\n                        css(container, {\n                            left: (Math.ceil(rect.left) - rect.left) + 'px',\n                            top: (Math.ceil(rect.top) - rect.top) + 'px'\n                        });\n                    };\n\n                    // run the fix now\n                    subPixelFix();\n\n                    // run it on resize\n                    renderer.unSubPixelFix = addEvent(win, 'resize', subPixelFix);\n                }\n            },\n\n            /**\n             * General method for adding a definition to the SVG `defs` tag. Can be used\n             *   for gradients, fills, filters etc. Styled mode only. A hook for adding\n             *   general definitions to the SVG's defs tag. Definitions can be\n             *   referenced from the CSS by its `id`. Read more in\n             *   [gradients, shadows and patterns]{@link http://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns}.\n             *   {@link http://www.highcharts.com/docs/chart-design-and-style/style-by-css|\n             *   Styled mode} only.\n             *\n             * @param {Object} def - A serialized form of an SVG definition, including\n             *   children\n             *\n             * @return {Highcharts.SVGElement} The inserted node. \n             */\n            definition: function(def) {\n                var ren = this;\n\n                function recurse(config, parent) {\n                    var ret;\n                    each(splat(config), function(item) {\n                        var node = ren.createElement(item.tagName),\n                            attr = {};\n\n                        // Set attributes\n                        objectEach(item, function(val, key) {\n                            if (key !== 'tagName' && key !== 'children' && key !== 'textContent') {\n                                attr[key] = val;\n                            }\n                        });\n                        node.attr(attr);\n\n                        // Add to the tree\n                        node.add(parent || ren.defs);\n\n                        // Add text content\n                        if (item.textContent) {\n                            node.element.appendChild(doc.createTextNode(item.textContent));\n                        }\n\n                        // Recurse\n                        recurse(item.children || [], node);\n\n                        ret = node;\n                    });\n\n                    // Return last node added (on top level it's the only one)\n                    return ret;\n                }\n                return recurse(def);\n            },\n\n\n\n\n            /**\n             * Detect whether the renderer is hidden. This happens when one of the\n             * parent elements has display: none. Used internally to detect when we need\n             * to render preliminarily in another div to get the text bounding boxes \n             * right.\n             *\n             * @returns {boolean} True if it is hidden.\n             */\n            isHidden: function() { // #608\n                return !this.boxWrapper.getBBox().width;\n            },\n\n            /**\n             * Destroys the renderer and its allocated members.\n             */\n            destroy: function() {\n                var renderer = this,\n                    rendererDefs = renderer.defs;\n                renderer.box = null;\n                renderer.boxWrapper = renderer.boxWrapper.destroy();\n\n                // Call destroy on all gradient elements\n                destroyObjectProperties(renderer.gradients || {});\n                renderer.gradients = null;\n\n                // Defs are null in VMLRenderer\n                // Otherwise, destroy them here.\n                if (rendererDefs) {\n                    renderer.defs = rendererDefs.destroy();\n                }\n\n                // Remove sub pixel fix handler (#982)\n                if (renderer.unSubPixelFix) {\n                    renderer.unSubPixelFix();\n                }\n\n                renderer.alignedObjects = null;\n\n                return null;\n            },\n\n            /**\n             * Create a wrapper for an SVG element. Serves as a factory for \n             * {@link SVGElement}, but this function is itself mostly called from \n             * primitive factories like {@link SVGRenderer#path}, {@link\n             * SVGRenderer#rect} or {@link SVGRenderer#text}.\n             * \n             * @param {string} nodeName - The node name, for example `rect`, `g` etc.\n             * @returns {Highcharts.SVGElement} The generated SVGElement.\n             */\n            createElement: function(nodeName) {\n                var wrapper = new this.Element();\n                wrapper.init(this, nodeName);\n                return wrapper;\n            },\n\n            /**\n             * Dummy function for plugins, called every time the renderer is updated.\n             * Prior to Highcharts 5, this was used for the canvg renderer.\n             * @function\n             */\n            draw: noop,\n\n            /**\n             * Get converted radial gradient attributes according to the radial\n             * reference. Used internally from the {@link SVGElement#colorGradient}\n             * function.\n             *\n             * @private\n             */\n            getRadialAttr: function(radialReference, gradAttr) {\n                return {\n                    cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],\n                    cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],\n                    r: gradAttr.r * radialReference[2]\n                };\n            },\n\n            getSpanWidth: function(wrapper, tspan) {\n                var renderer = this,\n                    bBox = wrapper.getBBox(true),\n                    actualWidth = bBox.width;\n\n                // Old IE cannot measure the actualWidth for SVG elements (#2314)\n                if (!svg && renderer.forExport) {\n                    actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);\n                }\n                return actualWidth;\n            },\n\n            applyEllipsis: function(wrapper, tspan, text, width) {\n                var renderer = this,\n                    actualWidth = renderer.getSpanWidth(wrapper, tspan),\n                    wasTooLong = actualWidth > width,\n                    str = text,\n                    currentIndex,\n                    minIndex = 0,\n                    maxIndex = text.length,\n                    updateTSpan = function(s) {\n                        tspan.removeChild(tspan.firstChild);\n                        if (s) {\n                            tspan.appendChild(doc.createTextNode(s));\n                        }\n                    };\n                if (wasTooLong) {\n                    while (minIndex <= maxIndex) {\n                        currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n                        str = text.substring(0, currentIndex) + '\\u2026';\n                        updateTSpan(str);\n                        actualWidth = renderer.getSpanWidth(wrapper, tspan);\n                        if (minIndex === maxIndex) {\n                            // Complete\n                            minIndex = maxIndex + 1;\n                        } else if (actualWidth > width) {\n                            // Too large. Set max index to current.\n                            maxIndex = currentIndex - 1;\n                        } else {\n                            // Within width. Set min index to current.\n                            minIndex = currentIndex;\n                        }\n                    }\n                    // If max index was 0 it means just ellipsis was also to large.\n                    if (maxIndex === 0) {\n                        // Remove ellipses.\n                        updateTSpan('');\n                    }\n                }\n                return wasTooLong;\n            },\n\n            /**\n             * Parse a simple HTML string into SVG tspans. Called internally when text\n             *   is set on an SVGElement. The function supports a subset of HTML tags,\n             *   CSS text features like `width`, `text-overflow`, `white-space`, and\n             *   also attributes like `href` and `style`.\n             * @private\n             * @param {Highcharts.SVGElement} wrapper The parent SVGElement.\n             */\n            buildText: function(wrapper) {\n                var textNode = wrapper.element,\n                    renderer = this,\n                    forExport = renderer.forExport,\n                    textStr = pick(wrapper.textStr, '').toString(),\n                    hasMarkup = textStr.indexOf('<') !== -1,\n                    lines,\n                    childNodes = textNode.childNodes,\n                    clsRegex,\n                    styleRegex,\n                    hrefRegex,\n                    wasTooLong,\n                    parentX = attr(textNode, 'x'),\n                    textStyles = wrapper.styles,\n                    width = wrapper.textWidth,\n                    textLineHeight = textStyles && textStyles.lineHeight,\n                    textOutline = textStyles && textStyles.textOutline,\n                    ellipsis = textStyles && textStyles.textOverflow === 'ellipsis',\n                    noWrap = textStyles && textStyles.whiteSpace === 'nowrap',\n                    fontSize = textStyles && textStyles.fontSize,\n                    textCache,\n                    isSubsequentLine,\n                    i = childNodes.length,\n                    tempParent = width && !wrapper.added && this.box,\n                    getLineHeight = function(tspan) {\n                        var fontSizeStyle;\n\n\n                        return textLineHeight ?\n                            pInt(textLineHeight) :\n                            renderer.fontMetrics(\n                                fontSizeStyle,\n                                // Get the computed size from parent if not explicit\n                                tspan.getAttribute('style') ? tspan : textNode\n                            ).h;\n                    },\n                    unescapeAngleBrackets = function(inputStr) {\n                        return inputStr.replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n                    };\n\n                // The buildText code is quite heavy, so if we're not changing something\n                // that affects the text, skip it (#6113).\n                textCache = [\n                    textStr,\n                    ellipsis,\n                    noWrap,\n                    textLineHeight,\n                    textOutline,\n                    fontSize,\n                    width\n                ].join(',');\n                if (textCache === wrapper.textCache) {\n                    return;\n                }\n                wrapper.textCache = textCache;\n\n                /// remove old text\n                while (i--) {\n                    textNode.removeChild(childNodes[i]);\n                }\n\n                // Skip tspans, add text directly to text node. The forceTSpan is a hook\n                // used in text outline hack.\n                if (!hasMarkup && !textOutline && !ellipsis && !width && textStr.indexOf(' ') === -1) {\n                    textNode.appendChild(doc.createTextNode(unescapeAngleBrackets(textStr)));\n\n                    // Complex strings, add more logic\n                } else {\n\n                    clsRegex = /<.*class=\"([^\"]+)\".*>/;\n                    styleRegex = /<.*style=\"([^\"]+)\".*>/;\n                    hrefRegex = /<.*href=\"([^\"]+)\".*>/;\n\n                    if (tempParent) {\n                        tempParent.appendChild(textNode); // attach it to the DOM to read offset width\n                    }\n\n                    if (hasMarkup) {\n                        lines = textStr\n\n                            .replace(/<(b|strong)>/g, '<span class=\"highcharts-strong\">')\n                            .replace(/<(i|em)>/g, '<span class=\"highcharts-emphasized\">')\n\n                            .replace(/<a/g, '<span')\n                            .replace(/<\\/(b|strong|i|em|a)>/g, '</span>')\n                            .split(/<br.*?>/g);\n\n                    } else {\n                        lines = [textStr];\n                    }\n\n\n                    // Trim empty lines (#5261)\n                    lines = grep(lines, function(line) {\n                        return line !== '';\n                    });\n\n\n                    // build the lines\n                    each(lines, function buildTextLines(line, lineNo) {\n                        var spans,\n                            spanNo = 0;\n                        line = line\n                            .replace(/^\\s+|\\s+$/g, '') // Trim to prevent useless/costly process on the spaces (#5258)\n                            .replace(/<span/g, '|||<span')\n                            .replace(/<\\/span>/g, '</span>|||');\n                        spans = line.split('|||');\n\n                        each(spans, function buildTextSpans(span) {\n                            if (span !== '' || spans.length === 1) {\n                                var attributes = {},\n                                    tspan = doc.createElementNS(renderer.SVG_NS, 'tspan'),\n                                    spanCls,\n                                    spanStyle; // #390\n                                if (clsRegex.test(span)) {\n                                    spanCls = span.match(clsRegex)[1];\n                                    attr(tspan, 'class', spanCls);\n                                }\n                                if (styleRegex.test(span)) {\n                                    spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');\n                                    attr(tspan, 'style', spanStyle);\n                                }\n                                if (hrefRegex.test(span) && !forExport) { // Not for export - #1529\n                                    attr(tspan, 'onclick', 'location.href=\\\"' + span.match(hrefRegex)[1] + '\\\"');\n                                    css(tspan, {\n                                        cursor: 'pointer'\n                                    });\n                                }\n\n                                span = unescapeAngleBrackets(span.replace(/<(.|\\n)*?>/g, '') || ' ');\n\n                                // Nested tags aren't supported, and cause crash in Safari (#1596)\n                                if (span !== ' ') {\n\n                                    // add the text node\n                                    tspan.appendChild(doc.createTextNode(span));\n\n                                    if (!spanNo) { // first span in a line, align it to the left\n                                        if (lineNo && parentX !== null) {\n                                            attributes.x = parentX;\n                                        }\n                                    } else {\n                                        attributes.dx = 0; // #16\n                                    }\n\n                                    // add attributes\n                                    attr(tspan, attributes);\n\n                                    // Append it\n                                    textNode.appendChild(tspan);\n\n                                    // first span on subsequent line, add the line height\n                                    if (!spanNo && isSubsequentLine) {\n\n                                        // allow getting the right offset height in exporting in IE\n                                        if (!svg && forExport) {\n                                            css(tspan, {\n                                                display: 'block'\n                                            });\n                                        }\n\n                                        // Set the line height based on the font size of either\n                                        // the text element or the tspan element\n                                        attr(\n                                            tspan,\n                                            'dy',\n                                            getLineHeight(tspan)\n                                        );\n                                    }\n\n                                    /*if (width) {\n                                    \trenderer.breakText(wrapper, width);\n                                    }*/\n\n                                    // Check width and apply soft breaks or ellipsis\n                                    if (width) {\n                                        var words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n                                            hasWhiteSpace = spans.length > 1 || lineNo || (words.length > 1 && !noWrap),\n                                            tooLong,\n                                            rest = [],\n                                            actualWidth,\n                                            dy = getLineHeight(tspan),\n                                            rotation = wrapper.rotation;\n\n                                        if (ellipsis) {\n                                            wasTooLong = renderer.applyEllipsis(wrapper, tspan, span, width);\n                                        }\n\n                                        while (!ellipsis && hasWhiteSpace && (words.length || rest.length)) {\n                                            wrapper.rotation = 0; // discard rotation when computing box\n                                            actualWidth = renderer.getSpanWidth(wrapper, tspan);\n                                            tooLong = actualWidth > width;\n\n                                            // For ellipsis, do a binary search for the correct string length\n                                            if (wasTooLong === undefined) {\n                                                wasTooLong = tooLong; // First time\n                                            }\n\n                                            // Looping down, this is the first word sequence that is not too long,\n                                            // so we can move on to build the next line.\n                                            if (!tooLong || words.length === 1) {\n                                                words = rest;\n                                                rest = [];\n\n                                                if (words.length && !noWrap) {\n                                                    tspan = doc.createElementNS(SVG_NS, 'tspan');\n                                                    attr(tspan, {\n                                                        dy: dy,\n                                                        x: parentX\n                                                    });\n                                                    if (spanStyle) { // #390\n                                                        attr(tspan, 'style', spanStyle);\n                                                    }\n                                                    textNode.appendChild(tspan);\n                                                }\n                                                if (actualWidth > width) { // a single word is pressing it out\n                                                    width = actualWidth;\n                                                }\n                                            } else { // append to existing line tspan\n                                                tspan.removeChild(tspan.firstChild);\n                                                rest.unshift(words.pop());\n                                            }\n                                            if (words.length) {\n                                                tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));\n                                            }\n                                        }\n                                        wrapper.rotation = rotation;\n                                    }\n\n                                    spanNo++;\n                                }\n                            }\n                        });\n                        // To avoid beginning lines that doesn't add to the textNode (#6144)\n                        isSubsequentLine = isSubsequentLine || textNode.childNodes.length;\n                    });\n\n                    if (wasTooLong) {\n                        wrapper.attr('title', wrapper.textStr);\n                    }\n                    if (tempParent) {\n                        tempParent.removeChild(textNode); // attach it to the DOM to read offset width\n                    }\n\n                    // Apply the text outline\n                    if (textOutline && wrapper.applyTextOutline) {\n                        wrapper.applyTextOutline(textOutline);\n                    }\n                }\n            },\n\n\n\n            /*\n            breakText: function (wrapper, width) {\n            \tvar bBox = wrapper.getBBox(),\n            \t\tnode = wrapper.element,\n            \t\ttextLength = node.textContent.length,\n            \t\tpos = Math.round(width * textLength / bBox.width), // try this position first, based on average character width\n            \t\tincrement = 0,\n            \t\tfinalPos;\n\n            \tif (bBox.width > width) {\n            \t\twhile (finalPos === undefined) {\n            \t\t\ttextLength = node.getSubStringLength(0, pos);\n\n            \t\t\tif (textLength <= width) {\n            \t\t\t\tif (increment === -1) {\n            \t\t\t\t\tfinalPos = pos;\n            \t\t\t\t} else {\n            \t\t\t\t\tincrement = 1;\n            \t\t\t\t}\n            \t\t\t} else {\n            \t\t\t\tif (increment === 1) {\n            \t\t\t\t\tfinalPos = pos - 1;\n            \t\t\t\t} else {\n            \t\t\t\t\tincrement = -1;\n            \t\t\t\t}\n            \t\t\t}\n            \t\t\tpos += increment;\n            \t\t}\n            \t}\n            \tconsole.log('width', width, 'stringWidth', node.getSubStringLength(0, finalPos))\n            },\n            */\n\n            /**\n             * Returns white for dark colors and black for bright colors.\n             *\n             * @param {ColorString} rgba - The color to get the contrast for.\n             * @returns {string} The contrast color, either `#000000` or `#FFFFFF`.\n             */\n            getContrast: function(rgba) {\n                rgba = color(rgba).rgba;\n\n                // The threshold may be discussed. Here's a proposal for adding\n                // different weight to the color channels (#6216)\n                /*\n        rgba[0] *= 1; // red\n        rgba[1] *= 1.2; // green\n        rgba[2] *= 0.7; // blue\n        */\n\n                return rgba[0] + rgba[1] + rgba[2] > 2 * 255 ? '#000000' : '#FFFFFF';\n            },\n\n            /**\n             * Create a button with preset states.\n             * @param {string} text - The text or HTML to draw.\n             * @param {number} x - The x position of the button's left side.\n             * @param {number} y - The y position of the button's top side.\n             * @param {Function} callback - The function to execute on button click or \n             *    touch.\n             * @param {SVGAttributes} [normalState] - SVG attributes for the normal\n             *    state.\n             * @param {SVGAttributes} [hoverState] - SVG attributes for the hover state.\n             * @param {SVGAttributes} [pressedState] - SVG attributes for the pressed\n             *    state.\n             * @param {SVGAttributes} [disabledState] - SVG attributes for the disabled\n             *    state.\n             * @param {Symbol} [shape=rect] - The shape type.\n             * @returns {SVGRenderer} The button element.\n             */\n            button: function(text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {\n                var label = this.label(text, x, y, shape, null, null, null, null, 'button'),\n                    curState = 0;\n\n                // Default, non-stylable attributes\n                label.attr(merge({\n                    'padding': 8,\n                    'r': 2\n                }, normalState));\n\n\n\n                // Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).\n                addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function() {\n                    if (curState !== 3) {\n                        label.setState(1);\n                    }\n                });\n                addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function() {\n                    if (curState !== 3) {\n                        label.setState(curState);\n                    }\n                });\n\n                label.setState = function(state) {\n                    // Hover state is temporary, don't record it\n                    if (state !== 1) {\n                        label.state = curState = state;\n                    }\n                    // Update visuals\n                    label.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n                        .addClass('highcharts-button-' + ['normal', 'hover', 'pressed', 'disabled'][state || 0]);\n\n\n                };\n\n\n\n\n                return label\n                    .on('click', function(e) {\n                        if (curState !== 3) {\n                            callback.call(label, e);\n                        }\n                    });\n            },\n\n            /**\n             * Make a straight line crisper by not spilling out to neighbour pixels.\n             * \n             * @param {Array} points - The original points on the format `['M', 0, 0,\n             *    'L', 100, 0]`.\n             * @param {number} width - The width of the line.\n             * @returns {Array} The original points array, but modified to render\n             * crisply.\n             */\n            crispLine: function(points, width) {\n                // normalize to a crisp line\n                if (points[1] === points[4]) {\n                    // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n                    points[1] = points[4] = Math.round(points[1]) - (width % 2 / 2);\n                }\n                if (points[2] === points[5]) {\n                    points[2] = points[5] = Math.round(points[2]) + (width % 2 / 2);\n                }\n                return points;\n            },\n\n\n            /**\n             * Draw a path, wraps the SVG `path` element.\n             * \n             * @param {Array} [path] An SVG path definition in array form.\n             * \n             * @example\n             * var path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n             *     .attr({ stroke: '#ff00ff' })\n             *     .add();\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-path-on-chart/\n             *         Draw a path in a chart\n             * @sample highcharts/members/renderer-path/\n             *         Draw a path independent from a chart\n             *\n             */\n            /**\n             * Draw a path, wraps the SVG `path` element.\n             * \n             * @param {SVGAttributes} [attribs] The initial attributes.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            path: function(path) {\n                var attribs = {\n\n                };\n                if (isArray(path)) {\n                    attribs.d = path;\n                } else if (isObject(path)) { // attributes\n                    extend(attribs, path);\n                }\n                return this.createElement('path').attr(attribs);\n            },\n\n            /**\n             * Draw a circle, wraps the SVG `circle` element.\n             * \n             * @param {number} [x] The center x position.\n             * @param {number} [y] The center y position.\n             * @param {number} [r] The radius.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-circle/ Drawing a circle\n             */\n            /**\n             * Draw a circle, wraps the SVG `circle` element.\n             * \n             * @param {SVGAttributes} [attribs] The initial attributes.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            circle: function(x, y, r) {\n                var attribs = isObject(x) ? x : {\n                        x: x,\n                        y: y,\n                        r: r\n                    },\n                    wrapper = this.createElement('circle');\n\n                // Setting x or y translates to cx and cy\n                wrapper.xSetter = wrapper.ySetter = function(value, key, element) {\n                    element.setAttribute('c' + key, value);\n                };\n\n                return wrapper.attr(attribs);\n            },\n\n            /**\n             * Draw and return an arc.\n             * @param {number} [x=0] Center X position.\n             * @param {number} [y=0] Center Y position.\n             * @param {number} [r=0] The outer radius of the arc.\n             * @param {number} [innerR=0] Inner radius like used in donut charts.\n             * @param {number} [start=0] The starting angle of the arc in radians, where\n             *    0 is to the right and `-Math.PI/2` is up.\n             * @param {number} [end=0] The ending angle of the arc in radians, where 0\n             *    is to the right and `-Math.PI/2` is up.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-arc/\n             *         Drawing an arc\n             */\n            /**\n             * Draw and return an arc. Overloaded function that takes arguments object.\n             * @param {SVGAttributes} attribs Initial SVG attributes.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            arc: function(x, y, r, innerR, start, end) {\n                var arc,\n                    options;\n\n                if (isObject(x)) {\n                    options = x;\n                    y = options.y;\n                    r = options.r;\n                    innerR = options.innerR;\n                    start = options.start;\n                    end = options.end;\n                    x = options.x;\n                } else {\n                    options = {\n                        innerR: innerR,\n                        start: start,\n                        end: end\n                    };\n                }\n\n                // Arcs are defined as symbols for the ability to set\n                // attributes in attr and animate\n                arc = this.symbol('arc', x, y, r, r, options);\n                arc.r = r; // #959\n                return arc;\n            },\n\n            /**\n             * Draw and return a rectangle.\n             * @param {number} [x] Left position.\n             * @param {number} [y] Top position.\n             * @param {number} [width] Width of the rectangle.\n             * @param {number} [height] Height of the rectangle.\n             * @param {number} [r] Border corner radius.\n             * @param {number} [strokeWidth] A stroke width can be supplied to allow\n             *    crisp drawing.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             */\n            /**\n             * Draw and return a rectangle.\n             * @param  {SVGAttributes} [attributes]\n             *         General SVG attributes for the rectangle.\n             * @return {Highcharts.SVGElement}\n             *         The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-rect-on-chart/\n             *         Draw a rectangle in a chart\n             * @sample highcharts/members/renderer-rect/\n             *         Draw a rectangle independent from a chart\n             */\n            rect: function(x, y, width, height, r, strokeWidth) {\n\n                r = isObject(x) ? x.r : r;\n\n                var wrapper = this.createElement('rect'),\n                    attribs = isObject(x) ? x : x === undefined ? {} : {\n                        x: x,\n                        y: y,\n                        width: Math.max(width, 0),\n                        height: Math.max(height, 0)\n                    };\n\n\n\n                if (r) {\n                    attribs.r = r;\n                }\n\n                wrapper.rSetter = function(value, key, element) {\n                    attr(element, {\n                        rx: value,\n                        ry: value\n                    });\n                };\n\n                return wrapper.attr(attribs);\n            },\n\n            /**\n             * Resize the {@link SVGRenderer#box} and re-align all aligned child\n             * elements.\n             * @param {number} width The new pixel width.\n             * @param {number} height The new pixel height.\n             * @param {boolean} animate Whether to animate.\n             */\n            setSize: function(width, height, animate) {\n                var renderer = this,\n                    alignedObjects = renderer.alignedObjects,\n                    i = alignedObjects.length;\n\n                renderer.width = width;\n                renderer.height = height;\n\n                renderer.boxWrapper.animate({\n                    width: width,\n                    height: height\n                }, {\n                    step: function() {\n                        this.attr({\n                            viewBox: '0 0 ' + this.attr('width') + ' ' + this.attr('height')\n                        });\n                    },\n                    duration: pick(animate, true) ? undefined : 0\n                });\n\n                while (i--) {\n                    alignedObjects[i].align();\n                }\n            },\n\n            /**\n             * Create and return an svg group element. Child {@link Highcharts.SVGElement}\n             * objects are added to the group by using the group as the first parameter\n             * in {@link Highcharts.SVGElement#add|add()}.\n             * \n             * @param {string} [name] The group will be given a class name of\n             * `highcharts-{name}`. This can be used for styling and scripting.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-g/\n             *         Show and hide grouped objects\n             */\n            g: function(name) {\n                var elem = this.createElement('g');\n                return name ? elem.attr({\n                    'class': 'highcharts-' + name\n                }) : elem;\n            },\n\n            /**\n             * Display an image.\n             * @param {string} src The image source.\n             * @param {number} [x] The X position.\n             * @param {number} [y] The Y position.\n             * @param {number} [width] The image width. If omitted, it defaults to the \n             *    image file width.\n             * @param {number} [height] The image height. If omitted it defaults to the\n             *    image file height.\n             * @returns {Highcharts.SVGElement} The generated wrapper element.\n             *\n             * @sample highcharts/members/renderer-image-on-chart/\n             *         Add an image in a chart\n             * @sample highcharts/members/renderer-image/\n             *         Add an image independent of a chart\n             */\n            image: function(src, x, y, width, height) {\n                var attribs = {\n                        preserveAspectRatio: 'none'\n                    },\n                    elemWrapper;\n\n                // optional properties\n                if (arguments.length > 1) {\n                    extend(attribs, {\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                }\n\n                elemWrapper = this.createElement('image').attr(attribs);\n\n                // set the href in the xlink namespace\n                if (elemWrapper.element.setAttributeNS) {\n                    elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',\n                        'href', src);\n                } else {\n                    // could be exporting in IE\n                    // using href throws \"not supported\" in ie7 and under, requries regex shim to fix later\n                    elemWrapper.element.setAttribute('hc-svg-href', src);\n                }\n                return elemWrapper;\n            },\n\n            /**\n             * Draw a symbol out of pre-defined shape paths from {@SVGRenderer#symbols}.\n             * It is used in Highcharts for point makers, which cake a `symbol` option,\n             * and label and button backgrounds like in the tooltip and stock flags.\n             *\n             * @param {Symbol} symbol - The symbol name.\n             * @param {number} x - The X coordinate for the top left position.\n             * @param {number} y - The Y coordinate for the top left position.\n             * @param {number} width - The pixel width.\n             * @param {number} height - The pixel height.\n             * @param {Object} [options] - Additional options, depending on the actual\n             *    symbol drawn. \n             * @param {number} [options.anchorX] - The anchor X position for the\n             *    `callout` symbol. This is where the chevron points to.\n             * @param {number} [options.anchorY] - The anchor Y position for the\n             *    `callout` symbol. This is where the chevron points to.\n             * @param {number} [options.end] - The end angle of an `arc` symbol.\n             * @param {boolean} [options.open] - Whether to draw `arc` symbol open or\n             *    closed.\n             * @param {number} [options.r] - The radius of an `arc` symbol, or the\n             *    border radius for the `callout` symbol.\n             * @param {number} [options.start] - The start angle of an `arc` symbol.\n             */\n            symbol: function(symbol, x, y, width, height, options) {\n\n                var ren = this,\n                    obj,\n                    imageRegex = /^url\\((.*?)\\)$/,\n                    isImage = imageRegex.test(symbol),\n                    sym = !isImage && (this.symbols[symbol] ? symbol : 'circle'),\n\n\n                    // get the symbol definition function\n                    symbolFn = sym && this.symbols[sym],\n\n                    // check if there's a path defined for this symbol\n                    path = defined(x) && symbolFn && symbolFn.call(\n                        this.symbols,\n                        Math.round(x),\n                        Math.round(y),\n                        width,\n                        height,\n                        options\n                    ),\n                    imageSrc,\n                    centerImage;\n\n                if (symbolFn) {\n                    obj = this.path(path);\n\n\n\n                    // expando properties for use in animate and attr\n                    extend(obj, {\n                        symbolName: sym,\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                    if (options) {\n                        extend(obj, options);\n                    }\n\n\n                    // Image symbols\n                } else if (isImage) {\n\n\n                    imageSrc = symbol.match(imageRegex)[1];\n\n                    // Create the image synchronously, add attribs async\n                    obj = this.image(imageSrc);\n\n                    // The image width is not always the same as the symbol width. The\n                    // image may be centered within the symbol, as is the case when\n                    // image shapes are used as label backgrounds, for example in flags.\n                    obj.imgwidth = pick(\n                        symbolSizes[imageSrc] && symbolSizes[imageSrc].width,\n                        options && options.width\n                    );\n                    obj.imgheight = pick(\n                        symbolSizes[imageSrc] && symbolSizes[imageSrc].height,\n                        options && options.height\n                    );\n                    /**\n                     * Set the size and position\n                     */\n                    centerImage = function() {\n                        obj.attr({\n                            width: obj.width,\n                            height: obj.height\n                        });\n                    };\n\n                    /**\n                     * Width and height setters that take both the image's physical size\n                     * and the label size into consideration, and translates the image\n                     * to center within the label.\n                     */\n                    each(['width', 'height'], function(key) {\n                        obj[key + 'Setter'] = function(value, key) {\n                            var attribs = {},\n                                imgSize = this['img' + key],\n                                trans = key === 'width' ? 'translateX' : 'translateY';\n                            this[key] = value;\n                            if (defined(imgSize)) {\n                                if (this.element) {\n                                    this.element.setAttribute(key, imgSize);\n                                }\n                                if (!this.alignByTranslate) {\n                                    attribs[trans] = ((this[key] || 0) - imgSize) / 2;\n                                    this.attr(attribs);\n                                }\n                            }\n                        };\n                    });\n\n\n                    if (defined(x)) {\n                        obj.attr({\n                            x: x,\n                            y: y\n                        });\n                    }\n                    obj.isImg = true;\n\n                    if (defined(obj.imgwidth) && defined(obj.imgheight)) {\n                        centerImage();\n                    } else {\n                        // Initialize image to be 0 size so export will still function if there's no cached sizes.\n                        obj.attr({\n                            width: 0,\n                            height: 0\n                        });\n\n                        // Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,\n                        // the created element must be assigned to a variable in order to load (#292).\n                        createElement('img', {\n                            onload: function() {\n\n                                var chart = charts[ren.chartIndex];\n\n                                // Special case for SVGs on IE11, the width is not accessible until the image is\n                                // part of the DOM (#2854).\n                                if (this.width === 0) {\n                                    css(this, {\n                                        position: 'absolute',\n                                        top: '-999em'\n                                    });\n                                    doc.body.appendChild(this);\n                                }\n\n                                // Center the image\n                                symbolSizes[imageSrc] = { // Cache for next\t\n                                    width: this.width,\n                                    height: this.height\n                                };\n                                obj.imgwidth = this.width;\n                                obj.imgheight = this.height;\n\n                                if (obj.element) {\n                                    centerImage();\n                                }\n\n                                // Clean up after #2854 workaround.\n                                if (this.parentNode) {\n                                    this.parentNode.removeChild(this);\n                                }\n\n                                // Fire the load event when all external images are loaded\n                                ren.imgCount--;\n                                if (!ren.imgCount && chart && chart.onload) {\n                                    chart.onload();\n                                }\n                            },\n                            src: imageSrc\n                        });\n                        this.imgCount++;\n                    }\n                }\n\n                return obj;\n            },\n\n            /**\n             * @typedef {string} Symbol\n             * \n             * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`,\n             * `triangle`, `triangle-down`. Symbols are used internally for point\n             * markers, button and label borders and backgrounds, or custom shapes.\n             * Extendable by adding to {@link SVGRenderer#symbols}.\n             */\n            /**\n             * An extendable collection of functions for defining symbol paths.\n             */\n            symbols: {\n                'circle': function(x, y, w, h) {\n                    // Return a full arc\n                    return this.arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n                        start: 0,\n                        end: Math.PI * 2,\n                        open: false\n                    });\n                },\n\n                'square': function(x, y, w, h) {\n                    return [\n                        'M', x, y,\n                        'L', x + w, y,\n                        x + w, y + h,\n                        x, y + h,\n                        'Z'\n                    ];\n                },\n\n                'triangle': function(x, y, w, h) {\n                    return [\n                        'M', x + w / 2, y,\n                        'L', x + w, y + h,\n                        x, y + h,\n                        'Z'\n                    ];\n                },\n\n                'triangle-down': function(x, y, w, h) {\n                    return [\n                        'M', x, y,\n                        'L', x + w, y,\n                        x + w / 2, y + h,\n                        'Z'\n                    ];\n                },\n                'diamond': function(x, y, w, h) {\n                    return [\n                        'M', x + w / 2, y,\n                        'L', x + w, y + h / 2,\n                        x + w / 2, y + h,\n                        x, y + h / 2,\n                        'Z'\n                    ];\n                },\n                'arc': function(x, y, w, h, options) {\n                    var start = options.start,\n                        rx = options.r || w,\n                        ry = options.r || h || w,\n                        end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)\n                        innerRadius = options.innerR,\n                        open = options.open,\n                        cosStart = Math.cos(start),\n                        sinStart = Math.sin(start),\n                        cosEnd = Math.cos(end),\n                        sinEnd = Math.sin(end),\n                        longArc = options.end - start < Math.PI ? 0 : 1,\n                        arc;\n\n                    arc = [\n                        'M',\n                        x + rx * cosStart,\n                        y + ry * sinStart,\n                        'A', // arcTo\n                        rx, // x radius\n                        ry, // y radius\n                        0, // slanting\n                        longArc, // long or short arc\n                        1, // clockwise\n                        x + rx * cosEnd,\n                        y + ry * sinEnd\n                    ];\n\n                    if (defined(innerRadius)) {\n                        arc.push(\n                            open ? 'M' : 'L',\n                            x + innerRadius * cosEnd,\n                            y + innerRadius * sinEnd,\n                            'A', // arcTo\n                            innerRadius, // x radius\n                            innerRadius, // y radius\n                            0, // slanting\n                            longArc, // long or short arc\n                            0, // clockwise\n                            x + innerRadius * cosStart,\n                            y + innerRadius * sinStart\n                        );\n                    }\n\n                    arc.push(open ? '' : 'Z'); // close\n                    return arc;\n                },\n\n                /**\n                 * Callout shape used for default tooltips, also used for rounded rectangles in VML\n                 */\n                callout: function(x, y, w, h, options) {\n                    var arrowLength = 6,\n                        halfDistance = 6,\n                        r = Math.min((options && options.r) || 0, w, h),\n                        safeDistance = r + halfDistance,\n                        anchorX = options && options.anchorX,\n                        anchorY = options && options.anchorY,\n                        path;\n\n                    path = [\n                        'M', x + r, y,\n                        'L', x + w - r, y, // top side\n                        'C', x + w, y, x + w, y, x + w, y + r, // top-right corner\n                        'L', x + w, y + h - r, // right side\n                        'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner\n                        'L', x + r, y + h, // bottom side\n                        'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner\n                        'L', x, y + r, // left side\n                        'C', x, y, x, y, x + r, y // top-left corner\n                    ];\n\n                    // Anchor on right side\n                    if (anchorX && anchorX > w) {\n\n                        // Chevron\n                        if (anchorY > y + safeDistance && anchorY < y + h - safeDistance) {\n                            path.splice(13, 3,\n                                'L', x + w, anchorY - halfDistance,\n                                x + w + arrowLength, anchorY,\n                                x + w, anchorY + halfDistance,\n                                x + w, y + h - r\n                            );\n\n                            // Simple connector\n                        } else {\n                            path.splice(13, 3,\n                                'L', x + w, h / 2,\n                                anchorX, anchorY,\n                                x + w, h / 2,\n                                x + w, y + h - r\n                            );\n                        }\n\n                        // Anchor on left side\n                    } else if (anchorX && anchorX < 0) {\n\n                        // Chevron\n                        if (anchorY > y + safeDistance && anchorY < y + h - safeDistance) {\n                            path.splice(33, 3,\n                                'L', x, anchorY + halfDistance,\n                                x - arrowLength, anchorY,\n                                x, anchorY - halfDistance,\n                                x, y + r\n                            );\n\n                            // Simple connector\n                        } else {\n                            path.splice(33, 3,\n                                'L', x, h / 2,\n                                anchorX, anchorY,\n                                x, h / 2,\n                                x, y + r\n                            );\n                        }\n\n                    } else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom\n                        path.splice(23, 3,\n                            'L', anchorX + halfDistance, y + h,\n                            anchorX, y + h + arrowLength,\n                            anchorX - halfDistance, y + h,\n                            x + r, y + h\n                        );\n                    } else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top\n                        path.splice(3, 3,\n                            'L', anchorX - halfDistance, y,\n                            anchorX, y - arrowLength,\n                            anchorX + halfDistance, y,\n                            w - r, y\n                        );\n                    }\n\n                    return path;\n                }\n            },\n\n            /**\n             * @typedef {Highcharts.SVGElement} ClipRect - A clipping rectangle that can be applied\n             * to one or more {@link SVGElement} instances. It is instanciated with the\n             * {@link SVGRenderer#clipRect} function and applied with the {@link \n             * SVGElement#clip} function.\n             *\n             * @example\n             * var circle = renderer.circle(100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .add();\n             * var clipRect = renderer.clipRect(100, 100, 100, 100);\n             *\n             * // Leave only the lower right quarter visible\n             * circle.clip(clipRect);\n             */\n            /**\n             * Define a clipping rectangle\n             * @param {String} id\n             * @param {number} x\n             * @param {number} y\n             * @param {number} width\n             * @param {number} height\n             * @returns {ClipRect} A clipping rectangle.\n             */\n            clipRect: function(x, y, width, height) {\n                var wrapper,\n                    id = H.uniqueKey(),\n\n                    clipPath = this.createElement('clipPath').attr({\n                        id: id\n                    }).add(this.defs);\n\n                wrapper = this.rect(x, y, width, height, 0).add(clipPath);\n                wrapper.id = id;\n                wrapper.clipPath = clipPath;\n                wrapper.count = 0;\n\n                return wrapper;\n            },\n\n\n\n\n\n            /**\n             * Draw text. The text can contain a subset of HTML, like spans and anchors\n             * and some basic text styling of these. For more advanced features like\n             * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n             * To update the text after render, run `text.attr({ text: 'New text' })`.\n             * @param  {String} str\n             *         The text of (subset) HTML to draw.\n             * @param  {number} x\n             *         The x position of the text's lower left corner.\n             * @param  {number} y\n             *         The y position of the text's lower left corner.\n             * @param  {Boolean} [useHTML=false]\n             *         Use HTML to render the text.\n             *\n             * @return {Highcharts.SVGElement} The text object.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Annotate the chart freely\n             * @sample highcharts/members/renderer-on-chart/\n             *         Annotate with a border and in response to the data\n             * @sample highcharts/members/renderer-text/\n             *         Formatted text\n             */\n            text: function(str, x, y, useHTML) {\n\n                // declare variables\n                var renderer = this,\n                    fakeSVG = !svg && renderer.forExport,\n                    wrapper,\n                    attribs = {};\n\n                if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n                    return renderer.html(str, x, y);\n                }\n\n                attribs.x = Math.round(x || 0); // X is always needed for line-wrap logic\n                if (y) {\n                    attribs.y = Math.round(y);\n                }\n                if (str || str === 0) {\n                    attribs.text = str;\n                }\n\n                wrapper = renderer.createElement('text')\n                    .attr(attribs);\n\n                // Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)\n                if (fakeSVG) {\n                    wrapper.css({\n                        position: 'absolute'\n                    });\n                }\n\n                if (!useHTML) {\n                    wrapper.xSetter = function(value, key, element) {\n                        var tspans = element.getElementsByTagName('tspan'),\n                            tspan,\n                            parentVal = element.getAttribute(key),\n                            i;\n                        for (i = 0; i < tspans.length; i++) {\n                            tspan = tspans[i];\n                            // If the x values are equal, the tspan represents a linebreak\n                            if (tspan.getAttribute(key) === parentVal) {\n                                tspan.setAttribute(key, value);\n                            }\n                        }\n                        element.setAttribute(key, value);\n                    };\n                }\n\n                return wrapper;\n            },\n\n            /**\n             * Utility to return the baseline offset and total line height from the font\n             * size.\n             *\n             * @param {?string} fontSize The current font size to inspect. If not given,\n             *   the font size will be found from the DOM element.\n             * @param {SVGElement|SVGDOMElement} [elem] The element to inspect for a\n             *   current font size.\n             * @returns {Object} An object containing `h`: the line height, `b`: the\n             * baseline relative to the top of the box, and `f`: the font size.\n             */\n            fontMetrics: function(fontSize, elem) {\n                var lineHeight,\n                    baseline;\n\n\n                fontSize = elem && SVGElement.prototype.getStyle.call(\n                    elem,\n                    'font-size'\n                );\n\n\n                // Handle different units\n                if (/px/.test(fontSize)) {\n                    fontSize = pInt(fontSize);\n                } else if (/em/.test(fontSize)) {\n                    // The em unit depends on parent items\n                    fontSize = parseFloat(fontSize) *\n                        (elem ? this.fontMetrics(null, elem.parentNode).f : 16);\n                } else {\n                    fontSize = 12;\n                }\n\n                // Empirical values found by comparing font size and bounding box\n                // height. Applies to the default font family.\n                // http://jsfiddle.net/highcharts/7xvn7/\n                lineHeight = fontSize < 24 ? fontSize + 3 : Math.round(fontSize * 1.2);\n                baseline = Math.round(lineHeight * 0.8);\n\n                return {\n                    h: lineHeight,\n                    b: baseline,\n                    f: fontSize\n                };\n            },\n\n            /**\n             * Correct X and Y positioning of a label for rotation (#1764)\n             */\n            rotCorr: function(baseline, rotation, alterY) {\n                var y = baseline;\n                if (rotation && alterY) {\n                    y = Math.max(y * Math.cos(rotation * deg2rad), 4);\n                }\n                return {\n                    x: (-baseline / 3) * Math.sin(rotation * deg2rad),\n                    y: y\n                };\n            },\n\n            /**\n             * Draw a label, which is an extended text element with support for border\n             * and background. Highcharts creates a `g` element with a text and a `path`\n             * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n             * background are set through `stroke`, `stroke-width` and `fill` attributes\n             * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n             * text after render, run `label.attr({ text: 'New text' })`.\n             * \n             * @param  {string} str\n             *         The initial text string or (subset) HTML to render.\n             * @param  {number} x\n             *         The x position of the label's left side.\n             * @param  {number} y\n             *         The y position of the label's top side or baseline, depending on\n             *         the `baseline` parameter.\n             * @param  {String} shape\n             *         The shape of the label's border/background, if any. Defaults to\n             *         `rect`. Other possible values are `callout` or other shapes\n             *         defined in {@link Highcharts.SVGRenderer#symbols}.\n             * @param  {number} anchorX\n             *         In case the `shape` has a pointer, like a flag, this is the\n             *         coordinates it should be pinned to.\n             * @param  {number} anchorY\n             *         In case the `shape` has a pointer, like a flag, this is the\n             *         coordinates it should be pinned to.\n             * @param  {Boolean} baseline\n             *         Whether to position the label relative to the text baseline,\n             *\t       like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n             *\t       upper border of the rectangle.\n             * @param  {String} className\n             *         Class name for the group.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated label.\n             *\n             * @sample highcharts/members/renderer-label-on-chart/\n             *         A label on the chart\n             */\n            label: function(str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n\n                var renderer = this,\n                    wrapper = renderer.g(className !== 'button' && 'label'),\n                    text = wrapper.text = renderer.text('', 0, 0, useHTML)\n                    .attr({\n                        zIndex: 1\n                    }),\n                    box,\n                    bBox,\n                    alignFactor = 0,\n                    padding = 3,\n                    paddingLeft = 0,\n                    width,\n                    height,\n                    wrapperX,\n                    wrapperY,\n                    textAlign,\n                    deferredAttr = {},\n                    strokeWidth,\n                    baselineOffset,\n                    hasBGImage = /^url\\((.*?)\\)$/.test(shape),\n                    needsBox = hasBGImage,\n                    getCrispAdjust,\n                    updateBoxSize,\n                    updateTextPadding,\n                    boxAttr;\n\n                if (className) {\n                    wrapper.addClass('highcharts-' + className);\n                }\n\n\n                needsBox = true; // for styling\n                getCrispAdjust = function() {\n                    return box.strokeWidth() % 2 / 2;\n                };\n\n\n                /**\n                 * This function runs after the label is added to the DOM (when the bounding box is\n                 * available), and after the text of the label is updated to detect the new bounding\n                 * box and reflect it in the border box.\n                 */\n                updateBoxSize = function() {\n                    var style = text.element.style,\n                        crispAdjust,\n                        attribs = {};\n\n                    bBox = (width === undefined || height === undefined || textAlign) && defined(text.textStr) &&\n                        text.getBBox(); //#3295 && 3514 box failure when string equals 0\n                    wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;\n                    wrapper.height = (height || bBox.height || 0) + 2 * padding;\n\n                    // Update the label-scoped y offset\n                    baselineOffset = padding + renderer.fontMetrics(style && style.fontSize, text).b;\n\n\n                    if (needsBox) {\n\n                        // Create the border box if it is not already present\n                        if (!box) {\n                            wrapper.box = box = renderer.symbols[shape] || hasBGImage ? // Symbol definition exists (#5324)\n                                renderer.symbol(shape) :\n                                renderer.rect();\n\n                            box.addClass(\n                                (className === 'button' ? '' : 'highcharts-label-box') + // Don't use label className for buttons\n                                (className ? ' highcharts-' + className + '-box' : '')\n                            );\n\n                            box.add(wrapper);\n\n                            crispAdjust = getCrispAdjust();\n                            attribs.x = crispAdjust;\n                            attribs.y = (baseline ? -baselineOffset : 0) + crispAdjust;\n                        }\n\n                        // Apply the box attributes\n                        attribs.width = Math.round(wrapper.width);\n                        attribs.height = Math.round(wrapper.height);\n\n                        box.attr(extend(attribs, deferredAttr));\n                        deferredAttr = {};\n                    }\n                };\n\n                /**\n                 * This function runs after setting text or padding, but only if padding is changed\n                 */\n                updateTextPadding = function() {\n                    var textX = paddingLeft + padding,\n                        textY;\n\n                    // determin y based on the baseline\n                    textY = baseline ? 0 : baselineOffset;\n\n                    // compensate for alignment\n                    if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {\n                        textX += {\n                            center: 0.5,\n                            right: 1\n                        }[textAlign] * (width - bBox.width);\n                    }\n\n                    // update if anything changed\n                    if (textX !== text.x || textY !== text.y) {\n                        text.attr('x', textX);\n                        if (textY !== undefined) {\n                            text.attr('y', textY);\n                        }\n                    }\n\n                    // record current values\n                    text.x = textX;\n                    text.y = textY;\n                };\n\n                /**\n                 * Set a box attribute, or defer it if the box is not yet created\n                 * @param {Object} key\n                 * @param {Object} value\n                 */\n                boxAttr = function(key, value) {\n                    if (box) {\n                        box.attr(key, value);\n                    } else {\n                        deferredAttr[key] = value;\n                    }\n                };\n\n                /**\n                 * After the text element is added, get the desired size of the border box\n                 * and add it before the text in the DOM.\n                 */\n                wrapper.onAdd = function() {\n                    text.add(wrapper);\n                    wrapper.attr({\n                        text: (str || str === 0) ? str : '', // alignment is available now // #3295: 0 not rendered if given as a value\n                        x: x,\n                        y: y\n                    });\n\n                    if (box && defined(anchorX)) {\n                        wrapper.attr({\n                            anchorX: anchorX,\n                            anchorY: anchorY\n                        });\n                    }\n                };\n\n                /*\n                 * Add specific attribute setters.\n                 */\n\n                // only change local variables\n                wrapper.widthSetter = function(value) {\n                    width = H.isNumber(value) ? value : null; // width:auto => null\n                };\n                wrapper.heightSetter = function(value) {\n                    height = value;\n                };\n                wrapper['text-alignSetter'] = function(value) {\n                    textAlign = value;\n                };\n                wrapper.paddingSetter = function(value) {\n                    if (defined(value) && value !== padding) {\n                        padding = wrapper.padding = value;\n                        updateTextPadding();\n                    }\n                };\n                wrapper.paddingLeftSetter = function(value) {\n                    if (defined(value) && value !== paddingLeft) {\n                        paddingLeft = value;\n                        updateTextPadding();\n                    }\n                };\n\n\n                // change local variable and prevent setting attribute on the group\n                wrapper.alignSetter = function(value) {\n                    value = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[value];\n                    if (value !== alignFactor) {\n                        alignFactor = value;\n                        if (bBox) { // Bounding box exists, means we're dynamically changing\n                            wrapper.attr({\n                                x: wrapperX\n                            }); // #5134\n                        }\n                    }\n                };\n\n                // apply these to the box and the text alike\n                wrapper.textSetter = function(value) {\n                    if (value !== undefined) {\n                        text.textSetter(value);\n                    }\n                    updateBoxSize();\n                    updateTextPadding();\n                };\n\n                // apply these to the box but not to the text\n                wrapper['stroke-widthSetter'] = function(value, key) {\n                    if (value) {\n                        needsBox = true;\n                    }\n                    strokeWidth = this['stroke-width'] = value;\n                    boxAttr(key, value);\n                };\n\n                wrapper.rSetter = function(value, key) {\n                    boxAttr(key, value);\n                };\n\n                wrapper.anchorXSetter = function(value, key) {\n                    anchorX = wrapper.anchorX = value;\n                    boxAttr(key, Math.round(value) - getCrispAdjust() - wrapperX);\n                };\n                wrapper.anchorYSetter = function(value, key) {\n                    anchorY = wrapper.anchorY = value;\n                    boxAttr(key, value - wrapperY);\n                };\n\n                // rename attributes\n                wrapper.xSetter = function(value) {\n                    wrapper.x = value; // for animation getter\n                    if (alignFactor) {\n                        value -= alignFactor * ((width || bBox.width) + 2 * padding);\n                    }\n                    wrapperX = Math.round(value);\n                    wrapper.attr('translateX', wrapperX);\n                };\n                wrapper.ySetter = function(value) {\n                    wrapperY = wrapper.y = Math.round(value);\n                    wrapper.attr('translateY', wrapperY);\n                };\n\n                // Redirect certain methods to either the box or the text\n                var baseCss = wrapper.css;\n                return extend(wrapper, {\n                    /**\n                     * Pick up some properties and apply them to the text instead of the\n                     * wrapper.\n                     * @ignore\n                     */\n                    css: function(styles) {\n                        if (styles) {\n                            var textStyles = {};\n                            styles = merge(styles); // create a copy to avoid altering the original object (#537)\n                            each(wrapper.textProps, function(prop) {\n                                if (styles[prop] !== undefined) {\n                                    textStyles[prop] = styles[prop];\n                                    delete styles[prop];\n                                }\n                            });\n                            text.css(textStyles);\n                        }\n                        return baseCss.call(wrapper, styles);\n                    },\n                    /**\n                     * Return the bounding box of the box, not the group.\n                     * @ignore\n                     */\n                    getBBox: function() {\n                        return {\n                            width: bBox.width + 2 * padding,\n                            height: bBox.height + 2 * padding,\n                            x: bBox.x - padding,\n                            y: bBox.y - padding\n                        };\n                    },\n\n                    /**\n                     * Destroy and release memory.\n                     * @ignore\n                     */\n                    destroy: function() {\n\n                        // Added by button implementation\n                        removeEvent(wrapper.element, 'mouseenter');\n                        removeEvent(wrapper.element, 'mouseleave');\n\n                        if (text) {\n                            text = text.destroy();\n                        }\n                        if (box) {\n                            box = box.destroy();\n                        }\n                        // Call base implementation to destroy the rest\n                        SVGElement.prototype.destroy.call(wrapper);\n\n                        // Release local pointers (#1298)\n                        wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;\n                    }\n                });\n            }\n        }); // end SVGRenderer\n\n\n        // general renderer\n        H.Renderer = SVGRenderer;\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var attr = H.attr,\n            createElement = H.createElement,\n            css = H.css,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isWebKit = H.isWebKit,\n            pInt = H.pInt,\n            SVGElement = H.SVGElement,\n            SVGRenderer = H.SVGRenderer,\n            win = H.win,\n            wrap = H.wrap;\n\n        // Extend SvgElement for useHTML option\n        extend(SVGElement.prototype, /** @lends SVGElement.prototype */ {\n            /**\n             * Apply CSS to HTML elements. This is used in text within SVG rendering and\n             * by the VML renderer\n             */\n            htmlCss: function(styles) {\n                var wrapper = this,\n                    element = wrapper.element,\n                    textWidth = styles && element.tagName === 'SPAN' && styles.width;\n\n                if (textWidth) {\n                    delete styles.width;\n                    wrapper.textWidth = textWidth;\n                    wrapper.updateTransform();\n                }\n                if (styles && styles.textOverflow === 'ellipsis') {\n                    styles.whiteSpace = 'nowrap';\n                    styles.overflow = 'hidden';\n                }\n                wrapper.styles = extend(wrapper.styles, styles);\n                css(wrapper.element, styles);\n\n                return wrapper;\n            },\n\n            /**\n             * VML and useHTML method for calculating the bounding box based on offsets\n             * @param {Boolean} refresh Whether to force a fresh value from the DOM or to\n             * use the cached value\n             *\n             * @return {Object} A hash containing values for x, y, width and height\n             */\n\n            htmlGetBBox: function() {\n                var wrapper = this,\n                    element = wrapper.element;\n\n                // faking getBBox in exported SVG in legacy IE\n                // faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)\n                if (element.nodeName === 'text') {\n                    element.style.position = 'absolute';\n                }\n\n                return {\n                    x: element.offsetLeft,\n                    y: element.offsetTop,\n                    width: element.offsetWidth,\n                    height: element.offsetHeight\n                };\n            },\n\n            /**\n             * VML override private method to update elements based on internal\n             * properties based on SVG transform\n             */\n            htmlUpdateTransform: function() {\n                // aligning non added elements is expensive\n                if (!this.added) {\n                    this.alignOnAdd = true;\n                    return;\n                }\n\n                var wrapper = this,\n                    renderer = wrapper.renderer,\n                    elem = wrapper.element,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    x = wrapper.x || 0,\n                    y = wrapper.y || 0,\n                    align = wrapper.textAlign || 'left',\n                    alignCorrection = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[align],\n                    styles = wrapper.styles;\n\n                // apply translate\n                css(elem, {\n                    marginLeft: translateX,\n                    marginTop: translateY\n                });\n\n\n\n                // apply inversion\n                if (wrapper.inverted) { // wrapper is a group\n                    each(elem.childNodes, function(child) {\n                        renderer.invertChild(child, elem);\n                    });\n                }\n\n                if (elem.tagName === 'SPAN') {\n\n                    var rotation = wrapper.rotation,\n                        baseline,\n                        textWidth = pInt(wrapper.textWidth),\n                        whiteSpace = styles && styles.whiteSpace,\n                        currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth, wrapper.textAlign].join(',');\n\n                    if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed\n\n\n                        baseline = renderer.fontMetrics(elem.style.fontSize).b;\n\n                        // Renderer specific handling of span rotation\n                        if (defined(rotation)) {\n                            wrapper.setSpanRotation(rotation, alignCorrection, baseline);\n                        }\n\n                        // Reset multiline/ellipsis in order to read width (#4928, #5417)\n                        css(elem, {\n                            width: '',\n                            whiteSpace: whiteSpace || 'nowrap'\n                        });\n\n                        // Update textWidth\n                        if (elem.offsetWidth > textWidth && /[ \\-]/.test(elem.textContent || elem.innerText)) { // #983, #1254\n                            css(elem, {\n                                width: textWidth + 'px',\n                                display: 'block',\n                                whiteSpace: whiteSpace || 'normal' // #3331\n                            });\n                        }\n\n\n                        wrapper.getSpanCorrection(elem.offsetWidth, baseline, alignCorrection, rotation, align);\n                    }\n\n                    // apply position with correction\n                    css(elem, {\n                        left: (x + (wrapper.xCorr || 0)) + 'px',\n                        top: (y + (wrapper.yCorr || 0)) + 'px'\n                    });\n\n                    // force reflow in webkit to apply the left and top on useHTML element (#1249)\n                    if (isWebKit) {\n                        baseline = elem.offsetHeight; // assigned to baseline for lint purpose\n                    }\n\n                    // record current text transform\n                    wrapper.cTT = currentTextTransform;\n                }\n            },\n\n            /**\n             * Set the rotation of an individual HTML span\n             */\n            setSpanRotation: function(rotation, alignCorrection, baseline) {\n                var rotationStyle = {},\n                    cssTransformKey = isMS ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : win.opera ? '-o-transform' : '';\n\n                rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';\n                rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';\n                css(this.element, rotationStyle);\n            },\n\n            /**\n             * Get the correction in X and Y positioning as the element is rotated.\n             */\n            getSpanCorrection: function(width, baseline, alignCorrection) {\n                this.xCorr = -width * alignCorrection;\n                this.yCorr = -baseline;\n            }\n        });\n\n        // Extend SvgRenderer for useHTML option.\n        extend(SVGRenderer.prototype, /** @lends SVGRenderer.prototype */ {\n            /**\n             * Create HTML text node. This is used by the VML renderer as well as the SVG\n             * renderer through the useHTML option.\n             *\n             * @param {String} str\n             * @param {Number} x\n             * @param {Number} y\n             */\n            html: function(str, x, y) {\n                var wrapper = this.createElement('span'),\n                    element = wrapper.element,\n                    renderer = wrapper.renderer,\n                    isSVG = renderer.isSVG,\n                    addSetters = function(element, style) {\n                        // These properties are set as attributes on the SVG group, and as\n                        // identical CSS properties on the div. (#3542)\n                        each(['opacity', 'visibility'], function(prop) {\n                            wrap(element, prop + 'Setter', function(proceed, value, key, elem) {\n                                proceed.call(this, value, key, elem);\n                                style[key] = value;\n                            });\n                        });\n                    };\n\n                // Text setter\n                wrapper.textSetter = function(value) {\n                    if (value !== element.innerHTML) {\n                        delete this.bBox;\n                    }\n                    element.innerHTML = this.textStr = value;\n                    wrapper.htmlUpdateTransform();\n                };\n\n                // Add setters for the element itself (#4938)\n                if (isSVG) { // #4938, only for HTML within SVG\n                    addSetters(wrapper, wrapper.element.style);\n                }\n\n                // Various setters which rely on update transform\n                wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function(value, key) {\n                    if (key === 'align') {\n                        key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.\n                    }\n                    wrapper[key] = value;\n                    wrapper.htmlUpdateTransform();\n                };\n\n                // Set the default attributes\n                wrapper\n                    .attr({\n                        text: str,\n                        x: Math.round(x),\n                        y: Math.round(y)\n                    })\n                    .css({\n\n                        position: 'absolute'\n                    });\n\n                // Keep the whiteSpace style outside the wrapper.styles collection\n                element.style.whiteSpace = 'nowrap';\n\n                // Use the HTML specific .css method\n                wrapper.css = wrapper.htmlCss;\n\n                // This is specific for HTML within SVG\n                if (isSVG) {\n                    wrapper.add = function(svgGroupWrapper) {\n\n                        var htmlGroup,\n                            container = renderer.box.parentNode,\n                            parentGroup,\n                            parents = [];\n\n                        this.parentGroup = svgGroupWrapper;\n\n                        // Create a mock group to hold the HTML elements\n                        if (svgGroupWrapper) {\n                            htmlGroup = svgGroupWrapper.div;\n                            if (!htmlGroup) {\n\n                                // Read the parent chain into an array and read from top down\n                                parentGroup = svgGroupWrapper;\n                                while (parentGroup) {\n\n                                    parents.push(parentGroup);\n\n                                    // Move up to the next parent group\n                                    parentGroup = parentGroup.parentGroup;\n                                }\n\n                                // Ensure dynamically updating position when any parent is translated\n                                each(parents.reverse(), function(parentGroup) {\n                                    var htmlGroupStyle,\n                                        cls = attr(parentGroup.element, 'class');\n\n                                    if (cls) {\n                                        cls = {\n                                            className: cls\n                                        };\n                                    } // else null\n\n                                    // Create a HTML div and append it to the parent div to emulate\n                                    // the SVG group structure\n                                    htmlGroup = parentGroup.div = parentGroup.div || createElement('div', cls, {\n                                        position: 'absolute',\n                                        left: (parentGroup.translateX || 0) + 'px',\n                                        top: (parentGroup.translateY || 0) + 'px',\n                                        display: parentGroup.display,\n                                        opacity: parentGroup.opacity, // #5075\n                                        pointerEvents: parentGroup.styles && parentGroup.styles.pointerEvents // #5595\n                                    }, htmlGroup || container); // the top group is appended to container\n\n                                    // Shortcut\n                                    htmlGroupStyle = htmlGroup.style;\n\n                                    // Set listeners to update the HTML div's position whenever the SVG group\n                                    // position is changed\n                                    extend(parentGroup, {\n                                        on: function() {\n                                            wrapper.on.apply({\n                                                element: parents[0].div\n                                            }, arguments);\n                                            return parentGroup;\n                                        },\n                                        translateXSetter: function(value, key) {\n                                            htmlGroupStyle.left = value + 'px';\n                                            parentGroup[key] = value;\n                                            parentGroup.doTransform = true;\n                                        },\n                                        translateYSetter: function(value, key) {\n                                            htmlGroupStyle.top = value + 'px';\n                                            parentGroup[key] = value;\n                                            parentGroup.doTransform = true;\n                                        }\n                                    });\n                                    addSetters(parentGroup, htmlGroupStyle);\n                                });\n\n                            }\n                        } else {\n                            htmlGroup = container;\n                        }\n\n                        htmlGroup.appendChild(element);\n\n                        // Shared with VML:\n                        wrapper.added = true;\n                        if (wrapper.alignOnAdd) {\n                            wrapper.htmlUpdateTransform();\n                        }\n\n                        return wrapper;\n                    };\n                }\n                return wrapper;\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var color = H.color,\n            each = H.each,\n            getTZOffset = H.getTZOffset,\n            isTouchDevice = H.isTouchDevice,\n            merge = H.merge,\n            pick = H.pick,\n            svg = H.svg,\n            win = H.win;\n\n        /* ****************************************************************************\n         * Handle the options                                                         *\n         *****************************************************************************/\n        H.defaultOptions = {\n\n            symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n            lang: {\n                loading: 'Loading...',\n                months: [\n                    'January', 'February', 'March', 'April', 'May', 'June', 'July',\n                    'August', 'September', 'October', 'November', 'December'\n                ],\n                shortMonths: [\n                    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\n                    'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n                ],\n                weekdays: [\n                    'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n                    'Thursday', 'Friday', 'Saturday'\n                ],\n                // invalidDate: '',\n                decimalPoint: '.',\n                numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels\n                resetZoom: 'Reset zoom',\n                resetZoomTitle: 'Reset zoom level 1:1',\n                thousandsSep: ' '\n            },\n            global: {\n                useUTC: true,\n                //timezoneOffset: 0\n\n            },\n            chart: {\n                //animation: true,\n                //alignTicks: false,\n                //reflow: true,\n                //className: null,\n                //events: { load, selection },\n                //margin: [null],\n                //marginTop: null,\n                //marginRight: null,\n                //marginBottom: null,\n                //marginLeft: null,\n                borderRadius: 0,\n\n                colorCount: 10,\n\n                defaultSeriesType: 'line',\n                ignoreHiddenSeries: true,\n                //inverted: false,\n                spacing: [10, 10, 15, 10],\n                //spacingTop: 10,\n                //spacingRight: 10,\n                //spacingBottom: 15,\n                //spacingLeft: 10,\n                //zoomType: ''\n                resetZoomButton: {\n                    theme: {\n                        zIndex: 20\n                    },\n                    position: {\n                        align: 'right',\n                        x: -10,\n                        //verticalAlign: 'top',\n                        y: 10\n                    }\n                    // relativeTo: 'plot'\n                },\n                width: null,\n                height: null\n\n\n            },\n            title: {\n                text: 'Chart title',\n                align: 'center',\n                // floating: false,\n                margin: 15,\n                // x: 0,\n                // verticalAlign: 'top',\n                // y: null,\n                // style: {}, // defined inline\n                widthAdjust: -44\n\n            },\n            subtitle: {\n                text: '',\n                align: 'center',\n                // floating: false\n                // x: 0,\n                // verticalAlign: 'top',\n                // y: null,\n                // style: {}, // defined inline\n                widthAdjust: -44\n            },\n\n            plotOptions: {},\n            labels: {\n                //items: [],\n                style: {\n                    //font: defaultFont,\n                    position: 'absolute',\n                    color: '#333333'\n                }\n            },\n            legend: {\n                enabled: true,\n                align: 'center',\n                //floating: false,\n                layout: 'horizontal',\n                labelFormatter: function() {\n                    return this.name;\n                },\n                //borderWidth: 0,\n                borderColor: '#999999',\n                borderRadius: 0,\n                navigation: {\n\n                    // animation: true,\n                    // arrowSize: 12\n                    // style: {} // text styles\n                },\n                // margin: 20,\n                // reversed: false,\n                // backgroundColor: null,\n                /*style: {\n                \tpadding: '5px'\n                },*/\n\n                itemCheckboxStyle: {\n                    position: 'absolute',\n                    width: '13px', // for IE precision\n                    height: '13px'\n                },\n                // itemWidth: undefined,\n                squareSymbol: true,\n                // symbolRadius: 0,\n                // symbolWidth: 16,\n                symbolPadding: 5,\n                verticalAlign: 'bottom',\n                // width: undefined,\n                x: 0,\n                y: 0,\n                title: {\n                    //text: null\n\n                }\n            },\n\n            loading: {\n                // hideDuration: 100,\n                // showDuration: 0\n\n            },\n\n            tooltip: {\n                enabled: true,\n                animation: svg,\n                //crosshairs: null,\n                borderRadius: 3,\n                dateTimeLabelFormats: {\n                    millisecond: '%A, %b %e, %H:%M:%S.%L',\n                    second: '%A, %b %e, %H:%M:%S',\n                    minute: '%A, %b %e, %H:%M',\n                    hour: '%A, %b %e, %H:%M',\n                    day: '%A, %b %e, %Y',\n                    week: 'Week from %A, %b %e, %Y',\n                    month: '%B %Y',\n                    year: '%Y'\n                },\n                footerFormat: '',\n                //formatter: defaultFormatter,\n                /* todo: em font-size when finished comparing against HC4\n                headerFormat: '<span style=\"font-size: 0.85em\">{point.key}</span><br/>',\n                */\n                padding: 8,\n\n                //shape: 'callout',\n                //shared: false,\n                snap: isTouchDevice ? 25 : 10,\n\n                headerFormat: '<span class=\"highcharts-header\">{point.key}</span><br/>',\n                pointFormat: '<span class=\"highcharts-color-{point.colorIndex}\">' +\n                    '\\u25CF</span> {series.name}: <span class=\"highcharts-strong\">' +\n                    '{point.y}</span><br/>',\n\n                //xDateFormat: '%A, %b %e, %Y',\n                //valueDecimals: null,\n                //valuePrefix: '',\n                //valueSuffix: ''\n            },\n\n            credits: {\n                enabled: true,\n                href: 'http://www.highcharts.com',\n                position: {\n                    align: 'right',\n                    x: -10,\n                    verticalAlign: 'bottom',\n                    y: -5\n                },\n\n                text: 'Highcharts.com'\n            }\n        };\n\n\n\n        /**\n         * Sets the getTimezoneOffset function. If the timezone option is set, a default\n         * getTimezoneOffset function with that timezone is returned. If not, the\n         * specified getTimezoneOffset function is returned. If neither are specified,\n         * undefined is returned.\n         * @return {function} a getTimezoneOffset function or undefined\n         */\n        function getTimezoneOffsetOption() {\n            var globalOptions = H.defaultOptions.global,\n                moment = win.moment;\n\n            if (globalOptions.timezone) {\n                if (!moment) {\n                    // getTimezoneOffset-function stays undefined because it depends on\n                    // Moment.js\n                    H.error(25);\n\n                } else {\n                    return function(timestamp) {\n                        return -moment.tz(\n                            timestamp,\n                            globalOptions.timezone\n                        ).utcOffset();\n                    };\n                }\n            }\n\n            // If not timezone is set, look for the getTimezoneOffset callback\n            return globalOptions.useUTC && globalOptions.getTimezoneOffset;\n        }\n\n        /**\n         * Set the time methods globally based on the useUTC option. Time method can be\n         *   either local time or UTC (default). It is called internally on initiating\n         *   Highcharts and after running `Highcharts.setOptions`.\n         *\n         * @private\n         */\n        function setTimeMethods() {\n            var globalOptions = H.defaultOptions.global,\n                Date,\n                useUTC = globalOptions.useUTC,\n                GET = useUTC ? 'getUTC' : 'get',\n                SET = useUTC ? 'setUTC' : 'set';\n\n            H.Date = Date = globalOptions.Date || win.Date; // Allow using a different Date class\n            Date.hcTimezoneOffset = useUTC && globalOptions.timezoneOffset;\n            Date.hcGetTimezoneOffset = getTimezoneOffsetOption();\n            Date.hcMakeTime = function(year, month, date, hours, minutes, seconds) {\n                var d;\n                if (useUTC) {\n                    d = Date.UTC.apply(0, arguments);\n                    d += getTZOffset(d);\n                } else {\n                    d = new Date(\n                        year,\n                        month,\n                        pick(date, 1),\n                        pick(hours, 0),\n                        pick(minutes, 0),\n                        pick(seconds, 0)\n                    ).getTime();\n                }\n                return d;\n            };\n            each(['Minutes', 'Hours', 'Day', 'Date', 'Month', 'FullYear'], function(s) {\n                Date['hcGet' + s] = GET + s;\n            });\n            each(['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear'], function(s) {\n                Date['hcSet' + s] = SET + s;\n            });\n        }\n\n        /**\n         * Merge the default options with custom options and return the new options\n         * structure. Commonly used for defining reusable templates.\n         *\n         * @function #setOptions\n         * @memberOf  Highcharts\n         * @sample highcharts/global/useutc-false Setting a global option\n         * @sample highcharts/members/setoptions Applying a global theme\n         * @param {Object} options The new custom chart options.\n         * @returns {Object} Updated options.\n         */\n        H.setOptions = function(options) {\n\n            // Copy in the default options\n            H.defaultOptions = merge(true, H.defaultOptions, options);\n\n            // Apply UTC\n            setTimeMethods();\n\n            return H.defaultOptions;\n        };\n\n        /**\n         * Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules\n         * wasn't enough because the setOptions method created a new object.\n         */\n        H.getOptions = function() {\n            return H.defaultOptions;\n        };\n\n\n        // Series defaults\n        H.defaultPlotOptions = H.defaultOptions.plotOptions;\n\n        // set the default time methods\n        setTimeMethods();\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var correctFloat = H.correctFloat,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            deg2rad = H.deg2rad;\n\n        /**\n         * The Tick class\n         */\n        H.Tick = function(axis, pos, type, noLabel) {\n            this.axis = axis;\n            this.pos = pos;\n            this.type = type || '';\n            this.isNew = true;\n            this.isNewLabel = true;\n\n            if (!type && !noLabel) {\n                this.addLabel();\n            }\n        };\n\n        H.Tick.prototype = {\n            /**\n             * Write the tick label\n             */\n            addLabel: function() {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    chart = axis.chart,\n                    categories = axis.categories,\n                    names = axis.names,\n                    pos = tick.pos,\n                    labelOptions = options.labels,\n                    str,\n                    tickPositions = axis.tickPositions,\n                    isFirst = pos === tickPositions[0],\n                    isLast = pos === tickPositions[tickPositions.length - 1],\n                    value = categories ?\n                    pick(categories[pos], names[pos], pos) :\n                    pos,\n                    label = tick.label,\n                    tickPositionInfo = tickPositions.info,\n                    dateTimeLabelFormat;\n\n                // Set the datetime label format. If a higher rank is set for this position, use that. If not,\n                // use the general format.\n                if (axis.isDatetimeAxis && tickPositionInfo) {\n                    dateTimeLabelFormat =\n                        options.dateTimeLabelFormats[\n                            tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName\n                        ];\n                }\n                // set properties for access in render method\n                tick.isFirst = isFirst;\n                tick.isLast = isLast;\n\n                // get the string\n                str = axis.labelFormatter.call({\n                    axis: axis,\n                    chart: chart,\n                    isFirst: isFirst,\n                    isLast: isLast,\n                    dateTimeLabelFormat: dateTimeLabelFormat,\n                    value: axis.isLog ? correctFloat(axis.lin2log(value)) : value\n                });\n\n                // prepare CSS\n                //css = width && { width: Math.max(1, Math.round(width - 2 * (labelOptions.padding || 10))) + 'px' };\n\n                // first call\n                if (!defined(label)) {\n\n                    tick.label = label =\n                        defined(str) && labelOptions.enabled ?\n                        chart.renderer.text(\n                            str,\n                            0,\n                            0,\n                            labelOptions.useHTML\n                        )\n\n                        .add(axis.labelGroup) :\n                        null;\n                    tick.labelLength = label && label.getBBox().width; // Un-rotated length\n                    tick.rotation = 0; // Base value to detect change for new calls to getBBox\n\n                    // update\n                } else if (label) {\n                    label.attr({\n                        text: str\n                    });\n                }\n            },\n\n            /**\n             * Get the offset height or width of the label\n             */\n            getLabelSize: function() {\n                return this.label ?\n                    this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n                    0;\n            },\n\n            /**\n             * Handle the label overflow by adjusting the labels to the left and right edge, or\n             * hide them if they collide into the neighbour label.\n             */\n            handleOverflow: function(xy) {\n                var axis = this.axis,\n                    pxPos = xy.x,\n                    chartWidth = axis.chart.chartWidth,\n                    spacing = axis.chart.spacing,\n                    leftBound = pick(axis.labelLeft, Math.min(axis.pos, spacing[3])),\n                    rightBound = pick(axis.labelRight, Math.max(axis.pos + axis.len, chartWidth - spacing[1])),\n                    label = this.label,\n                    rotation = this.rotation,\n                    factor = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[axis.labelAlign],\n                    labelWidth = label.getBBox().width,\n                    slotWidth = axis.getSlotWidth(),\n                    modifiedSlotWidth = slotWidth,\n                    xCorrection = factor,\n                    goRight = 1,\n                    leftPos,\n                    rightPos,\n                    textWidth,\n                    css = {};\n\n                // Check if the label overshoots the chart spacing box. If it does, move it.\n                // If it now overshoots the slotWidth, add ellipsis.\n                if (!rotation) {\n                    leftPos = pxPos - factor * labelWidth;\n                    rightPos = pxPos + (1 - factor) * labelWidth;\n\n                    if (leftPos < leftBound) {\n                        modifiedSlotWidth = xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n                    } else if (rightPos > rightBound) {\n                        modifiedSlotWidth = rightBound - xy.x + modifiedSlotWidth * factor;\n                        goRight = -1;\n                    }\n\n                    modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n                    if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n                        xy.x += goRight * (slotWidth - modifiedSlotWidth - xCorrection *\n                            (slotWidth - Math.min(labelWidth, modifiedSlotWidth)));\n                    }\n                    // If the label width exceeds the available space, set a text width to be\n                    // picked up below. Also, if a width has been set before, we need to set a new\n                    // one because the reported labelWidth will be limited by the box (#3938).\n                    if (labelWidth > modifiedSlotWidth || (axis.autoRotation && (label.styles || {}).width)) {\n                        textWidth = modifiedSlotWidth;\n                    }\n\n                    // Add ellipsis to prevent rotated labels to be clipped against the edge of the chart\n                } else if (rotation < 0 && pxPos - factor * labelWidth < leftBound) {\n                    textWidth = Math.round(pxPos / Math.cos(rotation * deg2rad) - leftBound);\n                } else if (rotation > 0 && pxPos + factor * labelWidth > rightBound) {\n                    textWidth = Math.round((chartWidth - pxPos) / Math.cos(rotation * deg2rad));\n                }\n\n                if (textWidth) {\n                    css.width = textWidth;\n                    if (!(axis.options.labels.style || {}).textOverflow) {\n                        css.textOverflow = 'ellipsis';\n                    }\n                    label.css(css);\n                }\n            },\n\n            /**\n             * Get the x and y position for ticks and labels\n             */\n            getPosition: function(horiz, pos, tickmarkOffset, old) {\n                var axis = this.axis,\n                    chart = axis.chart,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight;\n\n                return {\n                    x: horiz ?\n                        axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB : axis.left + axis.offset +\n                        (axis.opposite ?\n                            ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left :\n                            0\n                        ),\n\n                    y: horiz ?\n                        cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) : cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB\n                };\n\n            },\n\n            /**\n             * Get the x, y position of the tick label\n             */\n            getLabelPosition: function(x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n                var axis = this.axis,\n                    transA = axis.transA,\n                    reversed = axis.reversed,\n                    staggerLines = axis.staggerLines,\n                    rotCorr = axis.tickRotCorr || {\n                        x: 0,\n                        y: 0\n                    },\n                    yOffset = labelOptions.y,\n                    line;\n\n                if (!defined(yOffset)) {\n                    if (axis.side === 0) {\n                        yOffset = label.rotation ? -8 : -label.getBBox().height;\n                    } else if (axis.side === 2) {\n                        yOffset = rotCorr.y + 8;\n                    } else {\n                        // #3140, #3140\n                        yOffset = Math.cos(label.rotation * deg2rad) * (rotCorr.y - label.getBBox(false, 0).height / 2);\n                    }\n                }\n\n                x = x + labelOptions.x + rotCorr.x - (tickmarkOffset && horiz ?\n                    tickmarkOffset * transA * (reversed ? -1 : 1) : 0);\n                y = y + yOffset - (tickmarkOffset && !horiz ?\n                    tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n\n                // Correct for staggered labels\n                if (staggerLines) {\n                    line = (index / (step || 1) % staggerLines);\n                    if (axis.opposite) {\n                        line = staggerLines - line - 1;\n                    }\n                    y += line * (axis.labelOffset / staggerLines);\n                }\n\n                return {\n                    x: x,\n                    y: Math.round(y)\n                };\n            },\n\n            /**\n             * Extendible method to return the path of the marker\n             */\n            getMarkPath: function(x, y, tickLength, tickWidth, horiz, renderer) {\n                return renderer.crispLine([\n                    'M',\n                    x,\n                    y,\n                    'L',\n                    x + (horiz ? 0 : -tickLength),\n                    y + (horiz ? tickLength : 0)\n                ], tickWidth);\n            },\n\n            /**\n             * Renders the gridLine.\n             * @param  {Boolean} old         Whether or not the tick is old\n             * @param  {number} opacity      The opacity of the grid line\n             * @param  {number} reverseCrisp Modifier for avoiding overlapping 1 or -1\n             * @return {undefined}\n             */\n            renderGridLine: function(old, opacity, reverseCrisp) {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    gridLine = tick.gridLine,\n                    gridLinePath,\n                    attribs = {},\n                    pos = tick.pos,\n                    type = tick.type,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    renderer = axis.chart.renderer;\n\n\n\n                if (!gridLine) {\n\n                    if (!type) {\n                        attribs.zIndex = 1;\n                    }\n                    if (old) {\n                        attribs.opacity = 0;\n                    }\n                    tick.gridLine = gridLine = renderer.path()\n                        .attr(attribs)\n                        .addClass(\n                            'highcharts-' + (type ? type + '-' : '') + 'grid-line'\n                        )\n                        .add(axis.gridGroup);\n                }\n\n                // If the parameter 'old' is set, the current call will be followed\n                // by another call, therefore do not do any animations this time\n                if (!old && gridLine) {\n                    gridLinePath = axis.getPlotLinePath(\n                        pos + tickmarkOffset,\n                        gridLine.strokeWidth() * reverseCrisp,\n                        old, true\n                    );\n                    if (gridLinePath) {\n                        gridLine[tick.isNew ? 'attr' : 'animate']({\n                            d: gridLinePath,\n                            opacity: opacity\n                        });\n                    }\n                }\n            },\n\n            /**\n             * Renders the tick mark.\n             * @param  {Object} xy           The position vector of the mark\n             * @param  {number} xy.x         The x position of the mark\n             * @param  {number} xy.y         The y position of the mark\n             * @param  {number} opacity      The opacity of the mark\n             * @param  {number} reverseCrisp Modifier for avoiding overlapping 1 or -1\n             * @return {undefined}\n             */\n            renderMark: function(xy, opacity, reverseCrisp) {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    renderer = axis.chart.renderer,\n                    type = tick.type,\n                    tickPrefix = type ? type + 'Tick' : 'tick',\n                    tickSize = axis.tickSize(tickPrefix),\n                    mark = tick.mark,\n                    isNewMark = !mark,\n                    x = xy.x,\n                    y = xy.y;\n\n\n\n                if (tickSize) {\n\n                    // negate the length\n                    if (axis.opposite) {\n                        tickSize[0] = -tickSize[0];\n                    }\n\n                    // First time, create it\n                    if (isNewMark) {\n                        tick.mark = mark = renderer.path()\n                            .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n                            .add(axis.axisGroup);\n\n\n                    }\n                    mark[isNewMark ? 'attr' : 'animate']({\n                        d: tick.getMarkPath(\n                            x,\n                            y,\n                            tickSize[0],\n                            mark.strokeWidth() * reverseCrisp,\n                            axis.horiz,\n                            renderer),\n                        opacity: opacity\n                    });\n\n                }\n            },\n\n            /**\n             * Renders the tick label.\n             * Note: The label should already be created in init(), so it should only\n             * have to be moved into place.\n             * @param  {Object} xy      The position vector of the label\n             * @param  {number} xy.x    The x position of the label\n             * @param  {number} xy.y    The y position of the label\n             * @param  {Boolean} old    Whether or not the tick is old\n             * @param  {number} opacity The opacity of the label\n             * @param  {number} index   The index of the tick\n             * @return {undefined}\n             */\n            renderLabel: function(xy, old, opacity, index) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    options = axis.options,\n                    label = tick.label,\n                    labelOptions = options.labels,\n                    step = labelOptions.step,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    show = true,\n                    x = xy.x,\n                    y = xy.y;\n                if (label && isNumber(x)) {\n                    label.xy = xy = tick.getLabelPosition(\n                        x,\n                        y,\n                        label,\n                        horiz,\n                        labelOptions,\n                        tickmarkOffset,\n                        index,\n                        step\n                    );\n\n                    // Apply show first and show last. If the tick is both first and\n                    // last, it is a single centered tick, in which case we show the\n                    // label anyway (#2100).\n                    if (\n                        (\n                            tick.isFirst &&\n                            !tick.isLast &&\n                            !pick(options.showFirstLabel, 1)\n                        ) ||\n                        (\n                            tick.isLast &&\n                            !tick.isFirst &&\n                            !pick(options.showLastLabel, 1)\n                        )\n                    ) {\n                        show = false;\n\n                        // Handle label overflow and show or hide accordingly\n                    } else if (horiz && !axis.isRadial && !labelOptions.step &&\n                        !labelOptions.rotation && !old && opacity !== 0) {\n                        tick.handleOverflow(xy);\n                    }\n\n                    // apply step\n                    if (step && index % step) {\n                        // show those indices dividable by step\n                        show = false;\n                    }\n\n                    // Set the new position, and show or hide\n                    if (show && isNumber(xy.y)) {\n                        xy.opacity = opacity;\n                        label[tick.isNewLabel ? 'attr' : 'animate'](xy);\n                        tick.isNewLabel = false;\n                    } else {\n                        label.attr('y', -9999); // #1338\n                        tick.isNewLabel = true;\n                    }\n                    tick.isNew = false;\n                }\n            },\n\n            /**\n             * Put everything in place\n             *\n             * @param index {Number}\n             * @param old {Boolean} Use old coordinates to prepare an animation into new\n             *                      position\n             */\n            render: function(index, old, opacity) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    pos = tick.pos,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    xy = tick.getPosition(horiz, pos, tickmarkOffset, old),\n                    x = xy.x,\n                    y = xy.y,\n                    reverseCrisp = ((horiz && x === axis.pos + axis.len) ||\n                        (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687\n\n                opacity = pick(opacity, 1);\n                this.isActive = true;\n\n                // Create the grid line\n                this.renderGridLine(old, opacity, reverseCrisp);\n\n                // create the tick mark\n                this.renderMark(xy, opacity, reverseCrisp);\n\n                // the label is created on init - now move it into place\n                this.renderLabel(xy, old, opacity, index);\n            },\n\n            /**\n             * Destructor for the tick prototype\n             */\n            destroy: function() {\n                destroyObjectProperties(this, this.axis);\n            }\n        };\n\n    }(Highcharts));\n    var Axis = (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var addEvent = H.addEvent,\n            animObject = H.animObject,\n            arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            color = H.color,\n            correctFloat = H.correctFloat,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            deg2rad = H.deg2rad,\n            destroyObjectProperties = H.destroyObjectProperties,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            format = H.format,\n            getMagnitude = H.getMagnitude,\n            grep = H.grep,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            merge = H.merge,\n            normalizeTickInterval = H.normalizeTickInterval,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            syncTimeout = H.syncTimeout,\n            Tick = H.Tick;\n\n        /**\n         * Create a new axis object. Called internally when instanciating a new chart or\n         * adding axes by {@link Highcharts.Chart#addAxis}.\n         *\n         * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n         * series cartesian chart, there is one X axis and one Y axis.\n         * \n         * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n         * an array of Axis objects. If there is only one axis, it can be referenced\n         * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n         * pattern goes for Y axes.\n         * \n         * If you need to get the axes from a series object, use the `series.xAxis` and\n         * `series.yAxis` properties. These are not arrays, as one series can only be\n         * associated to one X and one Y axis.\n         * \n         * A third way to reference the axis programmatically is by `id`. Add an `id` in\n         * the axis configuration options, and get the axis by\n         * {@link Highcharts.Chart#get}.\n         * \n         * Configuration options for the axes are given in options.xAxis and\n         * options.yAxis.\n         * \n         * @class Highcharts.Axis\n         * @memberOf Highcharts\n         * @param {Highcharts.Chart} chart - The Chart instance to apply the axis on.\n         * @param {Object} options - Axis options\n         */\n        var Axis = function() {\n            this.init.apply(this, arguments);\n        };\n\n        H.extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n            /**\n             * Default options for the X axis - the Y axis has extended defaults.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultOptions: {\n                // allowDecimals: null,\n                // alternateGridColor: null,\n                // categories: [],\n                dateTimeLabelFormats: {\n                    millisecond: '%H:%M:%S.%L',\n                    second: '%H:%M:%S',\n                    minute: '%H:%M',\n                    hour: '%H:%M',\n                    day: '%e. %b',\n                    week: '%e. %b',\n                    month: '%b \\'%y',\n                    year: '%Y'\n                },\n                endOnTick: false,\n                // reversed: false,\n\n                labels: {\n                    enabled: true,\n                    // rotation: 0,\n                    // align: 'center',\n                    // step: null,\n\n                    x: 0\n                    //y: undefined\n                    /*formatter: function () {\n                    \treturn this.value;\n                    },*/\n                },\n                //linkedTo: null,\n                //max: undefined,\n                //min: undefined,\n                minPadding: 0.01,\n                maxPadding: 0.01,\n                //minRange: null,\n                //minorTickInterval: null,\n                minorTickLength: 2,\n                minorTickPosition: 'outside', // inside or outside\n                //opposite: false,\n                //offset: 0,\n                //plotBands: [{\n                //\tevents: {},\n                //\tzIndex: 1,\n                //\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\n                //}],\n                //plotLines: [{\n                //\tevents: {}\n                //  dashStyle: {}\n                //\tzIndex:\n                //\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\n                //}],\n                //reversed: false,\n                // showFirstLabel: true,\n                // showLastLabel: true,\n                startOfWeek: 1,\n                startOnTick: false,\n                //tickInterval: null,\n                tickLength: 10,\n                tickmarkPlacement: 'between', // on or between\n                tickPixelInterval: 100,\n                tickPosition: 'outside',\n                title: {\n                    //text: null,\n                    align: 'middle', // low, middle or high\n                    //margin: 0 for horizontal, 10 for vertical axes,\n                    // reserveSpace: true,\n                    //rotation: 0,\n                    //side: 'outside',\n\n                    //x: 0,\n                    //y: 0\n                },\n                type: 'linear', // linear, logarithmic or datetime\n                //visible: true\n\n            },\n\n            /**\n             * This options set extends the defaultOptions for Y axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultYAxisOptions: {\n                endOnTick: true,\n                tickPixelInterval: 72,\n                showLastLabel: true,\n                labels: {\n                    x: -8\n                },\n                maxPadding: 0.05,\n                minPadding: 0.05,\n                startOnTick: true,\n                title: {\n                    rotation: 270,\n                    text: 'Values'\n                },\n                stackLabels: {\n                    enabled: false,\n                    //align: dynamic,\n                    //y: dynamic,\n                    //x: dynamic,\n                    //verticalAlign: dynamic,\n                    //textAlign: dynamic,\n                    //rotation: 0,\n                    formatter: function() {\n                        return H.numberFormat(this.total, -1);\n                    }\n\n                }\n\n            },\n\n            /**\n             * These options extend the defaultOptions for left axes.\n             * \n             * @private\n             * @type {Object}\n             */\n            defaultLeftAxisOptions: {\n                labels: {\n                    x: -15\n                },\n                title: {\n                    rotation: 270\n                }\n            },\n\n            /**\n             * These options extend the defaultOptions for right axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultRightAxisOptions: {\n                labels: {\n                    x: 15\n                },\n                title: {\n                    rotation: 90\n                }\n            },\n\n            /**\n             * These options extend the defaultOptions for bottom axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultBottomAxisOptions: {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined,\n                    // staggerLines: null\n                },\n                title: {\n                    rotation: 0\n                }\n            },\n            /**\n             * These options extend the defaultOptions for top axes.\n             *\n             * @private\n             * @type {Object}\n             */\n            defaultTopAxisOptions: {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined\n                    // staggerLines: null\n                },\n                title: {\n                    rotation: 0\n                }\n            },\n\n            /**\n             * Initialize the axis\n             */\n            init: function(chart, userOptions) {\n\n\n                var isXAxis = userOptions.isX,\n                    axis = this;\n\n                axis.chart = chart;\n\n                // Flag, is the axis horizontal\n                axis.horiz = chart.inverted && !axis.isZAxis ? !isXAxis : isXAxis;\n\n                // Flag, isXAxis\n                axis.isXAxis = isXAxis;\n                axis.coll = axis.coll || (isXAxis ? 'xAxis' : 'yAxis');\n\n                axis.opposite = userOptions.opposite; // needed in setOptions\n                axis.side = userOptions.side || (axis.horiz ?\n                    (axis.opposite ? 0 : 2) : // top : bottom\n                    (axis.opposite ? 1 : 3)); // right : left\n\n                axis.setOptions(userOptions);\n\n\n                var options = this.options,\n                    type = options.type,\n                    isDatetimeAxis = type === 'datetime';\n\n                axis.labelFormatter = options.labels.formatter ||\n                    axis.defaultLabelFormatter; // can be overwritten by dynamic format\n\n\n                // Flag, stagger lines or not\n                axis.userOptions = userOptions;\n\n                //axis.axisTitleMargin = undefined,// = options.title.margin,\n                axis.minPixelPadding = 0;\n\n                axis.reversed = options.reversed;\n                axis.visible = options.visible !== false;\n                axis.zoomEnabled = options.zoomEnabled !== false;\n\n                // Initial categories\n                axis.hasNames = type === 'category' || options.categories === true;\n                axis.categories = options.categories || axis.hasNames;\n                axis.names = axis.names || []; // Preserve on update (#3830)\n\n                // Elements\n                //axis.axisGroup = undefined;\n                //axis.gridGroup = undefined;\n                //axis.axisTitle = undefined;\n                //axis.axisLine = undefined;\n\n                // Placeholder for plotlines and plotbands groups\n                axis.plotLinesAndBandsGroups = {};\n\n                // Shorthand types\n                axis.isLog = type === 'logarithmic';\n                axis.isDatetimeAxis = isDatetimeAxis;\n                axis.positiveValuesOnly = axis.isLog && !axis.allowNegativeLog;\n\n                // Flag, if axis is linked to another axis\n                axis.isLinked = defined(options.linkedTo);\n                // Linked axis.\n                //axis.linkedParent = undefined;\n\n                // Major ticks\n                axis.ticks = {};\n                axis.labelEdge = [];\n                // Minor ticks\n                axis.minorTicks = {};\n\n                // List of plotLines/Bands\n                axis.plotLinesAndBands = [];\n\n                // Alternate bands\n                axis.alternateBands = {};\n\n                // Axis metrics\n                //axis.left = undefined;\n                //axis.top = undefined;\n                //axis.width = undefined;\n                //axis.height = undefined;\n                //axis.bottom = undefined;\n                //axis.right = undefined;\n                //axis.transA = undefined;\n                //axis.transB = undefined;\n                //axis.oldTransA = undefined;\n                axis.len = 0;\n                //axis.oldMin = undefined;\n                //axis.oldMax = undefined;\n                //axis.oldUserMin = undefined;\n                //axis.oldUserMax = undefined;\n                //axis.oldAxisLength = undefined;\n                axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n                axis.range = options.range;\n                axis.offset = options.offset || 0;\n\n\n                // Dictionary for stacks\n                axis.stacks = {};\n                axis.oldStacks = {};\n                axis.stacksTouched = 0;\n\n                // Min and max in the data\n                //axis.dataMin = undefined,\n                //axis.dataMax = undefined,\n\n                // The axis range\n                axis.max = null;\n                axis.min = null;\n\n                // User set min and max\n                //axis.userMin = undefined,\n                //axis.userMax = undefined,\n\n                // Crosshair options\n                axis.crosshair = pick(\n                    options.crosshair,\n                    splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1],\n                    false\n                );\n\n                var events = axis.options.events;\n\n                // Register. Don't add it again on Axis.update().\n                if (inArray(axis, chart.axes) === -1) { // \n                    if (isXAxis) { // #2713\n                        chart.axes.splice(chart.xAxis.length, 0, axis);\n                    } else {\n                        chart.axes.push(axis);\n                    }\n\n                    chart[axis.coll].push(axis);\n                }\n\n                axis.series = axis.series || []; // populated by Series\n\n                // inverted charts have reversed xAxes as default\n                if (chart.inverted && !axis.isZAxis && isXAxis && axis.reversed === undefined) {\n                    axis.reversed = true;\n                }\n\n                // register event listeners\n                objectEach(events, function(event, eventType) {\n                    addEvent(axis, eventType, event);\n                });\n\n                // extend logarithmic axis\n                axis.lin2log = options.linearToLogConverter || axis.lin2log;\n                if (axis.isLog) {\n                    axis.val2lin = axis.log2lin;\n                    axis.lin2val = axis.lin2log;\n                }\n            },\n\n            /**\n             * Merge and set options\n             */\n            setOptions: function(userOptions) {\n                this.options = merge(\n                    this.defaultOptions,\n                    this.coll === 'yAxis' && this.defaultYAxisOptions, [\n                        this.defaultTopAxisOptions,\n                        this.defaultRightAxisOptions,\n                        this.defaultBottomAxisOptions,\n                        this.defaultLeftAxisOptions\n                    ][this.side],\n                    merge(\n                        defaultOptions[this.coll], // if set in setOptions (#1053)\n                        userOptions\n                    )\n                );\n            },\n\n            /**\n             * The default label formatter. The context is a special config object for\n             * the label. In apps, use the {@link\n             * https://api.highcharts.com/highcharts/xAxis.labels.formatter|\n             * labels.formatter} instead except when a modification is needed.\n             *\n             * @private\n             */\n            defaultLabelFormatter: function() {\n                var axis = this.axis,\n                    value = this.value,\n                    categories = axis.categories,\n                    dateTimeLabelFormat = this.dateTimeLabelFormat,\n                    lang = defaultOptions.lang,\n                    numericSymbols = lang.numericSymbols,\n                    numSymMagnitude = lang.numericSymbolMagnitude || 1000,\n                    i = numericSymbols && numericSymbols.length,\n                    multi,\n                    ret,\n                    formatOption = axis.options.labels.format,\n\n                    // make sure the same symbol is added for all labels on a linear\n                    // axis\n                    numericSymbolDetector = axis.isLog ?\n                    Math.abs(value) :\n                    axis.tickInterval;\n\n                if (formatOption) {\n                    ret = format(formatOption, this);\n\n                } else if (categories) {\n                    ret = value;\n\n                } else if (dateTimeLabelFormat) { // datetime axis\n                    ret = H.dateFormat(dateTimeLabelFormat, value);\n\n                } else if (i && numericSymbolDetector >= 1000) {\n                    // Decide whether we should add a numeric symbol like k (thousands)\n                    // or M (millions). If we are to enable this in tooltip or other\n                    // places as well, we can move this logic to the numberFormatter and\n                    // enable it by a parameter.\n                    while (i-- && ret === undefined) {\n                        multi = Math.pow(numSymMagnitude, i + 1);\n                        if (\n                            numericSymbolDetector >= multi &&\n                            (value * 10) % multi === 0 &&\n                            numericSymbols[i] !== null &&\n                            value !== 0\n                        ) { // #5480\n                            ret = H.numberFormat(value / multi, -1) + numericSymbols[i];\n                        }\n                    }\n                }\n\n                if (ret === undefined) {\n                    if (Math.abs(value) >= 10000) { // add thousands separators\n                        ret = H.numberFormat(value, -1);\n                    } else { // small numbers\n                        ret = H.numberFormat(value, -1, undefined, ''); // #2466\n                    }\n                }\n\n                return ret;\n            },\n\n            /**\n             * Get the minimum and maximum for the series of each axis\n             */\n            getSeriesExtremes: function() {\n                var axis = this,\n                    chart = axis.chart;\n                axis.hasVisibleSeries = false;\n\n                // Reset properties in case we're redrawing (#3353)\n                axis.dataMin = axis.dataMax = axis.threshold = null;\n                axis.softThreshold = !axis.isXAxis;\n\n                if (axis.buildStacks) {\n                    axis.buildStacks();\n                }\n\n                // loop through this axis' series\n                each(axis.series, function(series) {\n\n                    if (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n                        var seriesOptions = series.options,\n                            xData,\n                            threshold = seriesOptions.threshold,\n                            seriesDataMin,\n                            seriesDataMax;\n\n                        axis.hasVisibleSeries = true;\n\n                        // Validate threshold in logarithmic axes\n                        if (axis.positiveValuesOnly && threshold <= 0) {\n                            threshold = null;\n                        }\n\n                        // Get dataMin and dataMax for X axes\n                        if (axis.isXAxis) {\n                            xData = series.xData;\n                            if (xData.length) {\n                                // If xData contains values which is not numbers, then\n                                // filter them out. To prevent performance hit, we only\n                                // do this after we have already found seriesDataMin\n                                // because in most cases all data is valid. #5234.\n                                seriesDataMin = arrayMin(xData);\n                                if (!isNumber(seriesDataMin) &&\n                                    !(seriesDataMin instanceof Date) // #5010\n                                ) {\n                                    xData = grep(xData, function(x) {\n                                        return isNumber(x);\n                                    });\n                                    seriesDataMin = arrayMin(xData); // Do it again with valid data\n                                }\n\n                                axis.dataMin = Math.min(\n                                    pick(axis.dataMin, xData[0]),\n                                    seriesDataMin\n                                );\n                                axis.dataMax = Math.max(\n                                    pick(axis.dataMax, xData[0]),\n                                    arrayMax(xData)\n                                );\n\n                            }\n\n                            // Get dataMin and dataMax for Y axes, as well as handle\n                            // stacking and processed data\n                        } else {\n\n                            // Get this particular series extremes\n                            series.getExtremes();\n                            seriesDataMax = series.dataMax;\n                            seriesDataMin = series.dataMin;\n\n                            // Get the dataMin and dataMax so far. If percentage is\n                            // used, the min and max are always 0 and 100. If\n                            // seriesDataMin and seriesDataMax is null, then series\n                            // doesn't have active y data, we continue with nulls\n                            if (defined(seriesDataMin) && defined(seriesDataMax)) {\n                                axis.dataMin = Math.min(\n                                    pick(axis.dataMin, seriesDataMin),\n                                    seriesDataMin\n                                );\n                                axis.dataMax = Math.max(\n                                    pick(axis.dataMax, seriesDataMax),\n                                    seriesDataMax\n                                );\n                            }\n\n                            // Adjust to threshold\n                            if (defined(threshold)) {\n                                axis.threshold = threshold;\n                            }\n                            // If any series has a hard threshold, it takes precedence\n                            if (!seriesOptions.softThreshold ||\n                                axis.positiveValuesOnly\n                            ) {\n                                axis.softThreshold = false;\n                            }\n                        }\n                    }\n                });\n            },\n\n            /**\n             * Translate from axis value to pixel position on the chart, or back\n             *\n             */\n            translate: function(val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n                var axis = this.linkedParent || this, // #1417\n                    sign = 1,\n                    cvsOffset = 0,\n                    localA = old ? axis.oldTransA : axis.transA,\n                    localMin = old ? axis.oldMin : axis.min,\n                    returnValue,\n                    minPixelPadding = axis.minPixelPadding,\n                    doPostTranslate = (axis.isOrdinal || axis.isBroken || (axis.isLog && handleLog)) && axis.lin2val;\n\n                if (!localA) {\n                    localA = axis.transA;\n                }\n\n                // In vertical axes, the canvas coordinates start from 0 at the top like in\n                // SVG.\n                if (cvsCoord) {\n                    sign *= -1; // canvas coordinates inverts the value\n                    cvsOffset = axis.len;\n                }\n\n                // Handle reversed axis\n                if (axis.reversed) {\n                    sign *= -1;\n                    cvsOffset -= sign * (axis.sector || axis.len);\n                }\n\n                // From pixels to value\n                if (backwards) { // reverse translation\n\n                    val = val * sign + cvsOffset;\n                    val -= minPixelPadding;\n                    returnValue = val / localA + localMin; // from chart pixel to value\n                    if (doPostTranslate) { // log and ordinal axes\n                        returnValue = axis.lin2val(returnValue);\n                    }\n\n                    // From value to pixels\n                } else {\n                    if (doPostTranslate) { // log and ordinal axes\n                        val = axis.val2lin(val);\n                    }\n                    returnValue = sign * (val - localMin) * localA + cvsOffset +\n                        (sign * minPixelPadding) +\n                        (isNumber(pointPlacement) ? localA * pointPlacement : 0);\n                }\n\n                return returnValue;\n            },\n\n            /**\n             * Translate a value in terms of axis units into pixels within the chart.\n             * \n             * @param  {Number} value\n             *         A value in terms of axis units.\n             * @param  {Boolean} paneCoordinates\n             *         Whether to return the pixel coordinate relative to the chart or\n             *         just the axis/pane itself.\n             * @return {Number} Pixel position of the value on the chart or axis.\n             */\n            toPixels: function(value, paneCoordinates) {\n                return this.translate(value, false, !this.horiz, null, true) +\n                    (paneCoordinates ? 0 : this.pos);\n            },\n\n            /**\n             * Translate a pixel position along the axis to a value in terms of axis\n             * units.\n             * @param  {Number} pixel\n             *         The pixel value coordinate.\n             * @param  {Boolean} paneCoordiantes\n             *         Whether the input pixel is relative to the chart or just the\n             *         axis/pane itself.\n             * @return {Number} The axis value.\n             */\n            toValue: function(pixel, paneCoordinates) {\n                return this.translate(\n                    pixel - (paneCoordinates ? 0 : this.pos),\n                    true, !this.horiz,\n                    null,\n                    true\n                );\n            },\n\n            /**\n             * Create the path for a plot line that goes from the given value on\n             * this axis, across the plot to the opposite side\n             * @param {Number} value\n             * @param {Number} lineWidth Used for calculation crisp line\n             * @param {Number] old Use old coordinates (for resizing and rescaling)\n             */\n            getPlotLinePath: function(value, lineWidth, old, force, translatedValue) {\n                var axis = this,\n                    chart = axis.chart,\n                    axisLeft = axis.left,\n                    axisTop = axis.top,\n                    x1,\n                    y1,\n                    x2,\n                    y2,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n                    cWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n                    skip,\n                    transB = axis.transB,\n                    /**\n                     * Check if x is between a and b. If not, either move to a/b or skip,\n                     * depending on the force parameter.\n                     */\n                    between = function(x, a, b) {\n                        if (x < a || x > b) {\n                            if (force) {\n                                x = Math.min(Math.max(a, x), b);\n                            } else {\n                                skip = true;\n                            }\n                        }\n                        return x;\n                    };\n\n                translatedValue = pick(translatedValue, axis.translate(value, null, null, old));\n                x1 = x2 = Math.round(translatedValue + transB);\n                y1 = y2 = Math.round(cHeight - translatedValue - transB);\n                if (!isNumber(translatedValue)) { // no min or max\n                    skip = true;\n\n                } else if (axis.horiz) {\n                    y1 = axisTop;\n                    y2 = cHeight - axis.bottom;\n                    x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n                } else {\n                    x1 = axisLeft;\n                    x2 = cWidth - axis.right;\n                    y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n                }\n                return skip && !force ?\n                    null :\n                    chart.renderer.crispLine(['M', x1, y1, 'L', x2, y2], lineWidth || 1);\n            },\n\n            /**\n             * Internal function to et the tick positions of a linear axis to round\n             * values like whole tens or every five.\n             *\n             * @param  {Number} tickInterval\n             *         The normalized tick interval\n             * @param  {Number} min\n             *         Axis minimum.\n             * @param  {Number} max\n             *         Axis maximum.\n             *\n             * @return {Array.<Number>}\n             *         An array of numbers where ticks should be placed.\n             */\n            getLinearTickPositions: function(tickInterval, min, max) {\n                var pos,\n                    lastPos,\n                    roundedMin = correctFloat(Math.floor(min / tickInterval) * tickInterval),\n                    roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval),\n                    tickPositions = [];\n\n                // For single points, add a tick regardless of the relative position\n                // (#2662, #6274)\n                if (this.single) {\n                    return [min];\n                }\n\n                // Populate the intermediate values\n                pos = roundedMin;\n                while (pos <= roundedMax) {\n\n                    // Place the tick on the rounded value\n                    tickPositions.push(pos);\n\n                    // Always add the raw tickInterval, not the corrected one.\n                    pos = correctFloat(pos + tickInterval);\n\n                    // If the interval is not big enough in the current min - max range to actually increase\n                    // the loop variable, we need to break out to prevent endless loop. Issue #619\n                    if (pos === lastPos) {\n                        break;\n                    }\n\n                    // Record the last value\n                    lastPos = pos;\n                }\n                return tickPositions;\n            },\n\n            /**\n             * Return the minor tick positions. For logarithmic axes, reuse the same logic\n             * as for major ticks.\n             */\n            getMinorTickPositions: function() {\n                var axis = this,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    minorTickInterval = axis.minorTickInterval,\n                    minorTickPositions = [],\n                    pos,\n                    pointRangePadding = axis.pointRangePadding || 0,\n                    min = axis.min - pointRangePadding, // #1498\n                    max = axis.max + pointRangePadding, // #1498\n                    range = max - min;\n\n                // If minor ticks get too dense, they are hard to read, and may cause long running script. So we don't draw them.\n                if (range && range / minorTickInterval < axis.len / 3) { // #3875\n\n                    if (axis.isLog) {\n                        // For each interval in the major ticks, compute the minor ticks\n                        // separately.\n                        each(this.paddedTicks, function(pos, i, paddedTicks) {\n                            if (i) {\n                                minorTickPositions.push.apply(\n                                    minorTickPositions,\n                                    axis.getLogTickPositions(\n                                        minorTickInterval,\n                                        paddedTicks[i - 1],\n                                        paddedTicks[i],\n                                        true\n                                    )\n                                );\n                            }\n                        });\n\n                    } else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314\n                        minorTickPositions = minorTickPositions.concat(\n                            axis.getTimeTicks(\n                                axis.normalizeTimeTickInterval(minorTickInterval),\n                                min,\n                                max,\n                                options.startOfWeek\n                            )\n                        );\n                    } else {\n                        for (\n                            pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval\n                        ) {\n                            // Very, very, tight grid lines (#5771)\n                            if (pos === minorTickPositions[0]) {\n                                break;\n                            }\n                            minorTickPositions.push(pos);\n                        }\n                    }\n                }\n\n                if (minorTickPositions.length !== 0) {\n                    axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n                }\n                return minorTickPositions;\n            },\n\n            /**\n             * Adjust the min and max for the minimum range. Keep in mind that the series data is\n             * not yet processed, so we don't have information on data cropping and grouping, or\n             * updated axis.pointRange or series.pointRange. The data can't be processed until\n             * we have finally established min and max.\n             *\n             * @private\n             */\n            adjustForMinRange: function() {\n                var axis = this,\n                    options = axis.options,\n                    min = axis.min,\n                    max = axis.max,\n                    zoomOffset,\n                    spaceAvailable,\n                    closestDataRange,\n                    i,\n                    distance,\n                    xData,\n                    loopLength,\n                    minArgs,\n                    maxArgs,\n                    minRange;\n\n                // Set the automatic minimum range based on the closest point distance\n                if (axis.isXAxis && axis.minRange === undefined && !axis.isLog) {\n\n                    if (defined(options.min) || defined(options.max)) {\n                        axis.minRange = null; // don't do this again\n\n                    } else {\n\n                        // Find the closest distance between raw data points, as opposed to\n                        // closestPointRange that applies to processed points (cropped and grouped)\n                        each(axis.series, function(series) {\n                            xData = series.xData;\n                            loopLength = series.xIncrement ? 1 : xData.length - 1;\n                            for (i = loopLength; i > 0; i--) {\n                                distance = xData[i] - xData[i - 1];\n                                if (closestDataRange === undefined || distance < closestDataRange) {\n                                    closestDataRange = distance;\n                                }\n                            }\n                        });\n                        axis.minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n                    }\n                }\n\n                // if minRange is exceeded, adjust\n                if (max - min < axis.minRange) {\n\n                    spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange;\n                    minRange = axis.minRange;\n                    zoomOffset = (minRange - max + min) / 2;\n\n                    // if min and max options have been set, don't go beyond it\n                    minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];\n                    if (spaceAvailable) { // if space is available, stay within the data range\n                        minArgs[2] = axis.isLog ? axis.log2lin(axis.dataMin) : axis.dataMin;\n                    }\n                    min = arrayMax(minArgs);\n\n                    maxArgs = [min + minRange, pick(options.max, min + minRange)];\n                    if (spaceAvailable) { // if space is availabe, stay within the data range\n                        maxArgs[2] = axis.isLog ? axis.log2lin(axis.dataMax) : axis.dataMax;\n                    }\n\n                    max = arrayMin(maxArgs);\n\n                    // now if the max is adjusted, adjust the min back\n                    if (max - min < minRange) {\n                        minArgs[0] = max - minRange;\n                        minArgs[1] = pick(options.min, max - minRange);\n                        min = arrayMax(minArgs);\n                    }\n                }\n\n                // Record modified extremes\n                axis.min = min;\n                axis.max = max;\n            },\n\n            /**\n             * Find the closestPointRange across all series.\n             *\n             * @private\n             */\n            getClosest: function() {\n                var ret;\n\n                if (this.categories) {\n                    ret = 1;\n                } else {\n                    each(this.series, function(series) {\n                        var seriesClosest = series.closestPointRange,\n                            visible = series.visible ||\n                            !series.chart.options.chart.ignoreHiddenSeries;\n\n                        if (!series.noSharedTooltip &&\n                            defined(seriesClosest) &&\n                            visible\n                        ) {\n                            ret = defined(ret) ?\n                                Math.min(ret, seriesClosest) :\n                                seriesClosest;\n                        }\n                    });\n                }\n                return ret;\n            },\n\n            /**\n             * When a point name is given and no x, search for the name in the existing categories,\n             * or if categories aren't provided, search names or create a new category (#2522).\n             */\n            nameToX: function(point) {\n                var explicitCategories = isArray(this.categories),\n                    names = explicitCategories ? this.categories : this.names,\n                    nameX = point.options.x,\n                    x;\n\n                point.series.requireSorting = false;\n\n                if (!defined(nameX)) {\n                    nameX = this.options.uniqueNames === false ?\n                        point.series.autoIncrement() :\n                        inArray(point.name, names);\n                }\n                if (nameX === -1) { // The name is not found in currenct categories\n                    if (!explicitCategories) {\n                        x = names.length;\n                    }\n                } else {\n                    x = nameX;\n                }\n\n                // Write the last point's name to the names array\n                if (x !== undefined) {\n                    this.names[x] = point.name;\n                }\n\n                return x;\n            },\n\n            /**\n             * When changes have been done to series data, update the axis.names.\n             */\n            updateNames: function() {\n                var axis = this;\n\n                if (this.names.length > 0) {\n                    this.names.length = 0;\n                    this.minRange = this.userMinRange; // Reset\n                    each(this.series || [], function(series) {\n\n                        // Reset incrementer (#5928)\n                        series.xIncrement = null;\n\n                        // When adding a series, points are not yet generated\n                        if (!series.points || series.isDirtyData) {\n                            series.processData();\n                            series.generatePoints();\n                        }\n\n                        each(series.points, function(point, i) {\n                            var x;\n                            if (point.options) {\n                                x = axis.nameToX(point);\n                                if (x !== undefined && x !== point.x) {\n                                    point.x = x;\n                                    series.xData[i] = x;\n                                }\n                            }\n                        });\n                    });\n                }\n            },\n\n            /**\n             * Update translation information\n             */\n            setAxisTranslation: function(saveOld) {\n                var axis = this,\n                    range = axis.max - axis.min,\n                    pointRange = axis.axisPointRange || 0,\n                    closestPointRange,\n                    minPointOffset = 0,\n                    pointRangePadding = 0,\n                    linkedParent = axis.linkedParent,\n                    ordinalCorrection,\n                    hasCategories = !!axis.categories,\n                    transA = axis.transA,\n                    isXAxis = axis.isXAxis;\n\n                // Adjust translation for padding. Y axis with categories need to go through the same (#1784).\n                if (isXAxis || hasCategories || pointRange) {\n\n                    // Get the closest points\n                    closestPointRange = axis.getClosest();\n\n                    if (linkedParent) {\n                        minPointOffset = linkedParent.minPointOffset;\n                        pointRangePadding = linkedParent.pointRangePadding;\n                    } else {\n                        each(axis.series, function(series) {\n                            var seriesPointRange = hasCategories ?\n                                1 :\n                                (isXAxis ?\n                                    pick(series.options.pointRange, closestPointRange, 0) :\n                                    (axis.axisPointRange || 0)), // #2806\n                                pointPlacement = series.options.pointPlacement;\n\n                            pointRange = Math.max(pointRange, seriesPointRange);\n\n                            if (!axis.single) {\n                                // minPointOffset is the value padding to the left of the axis in order to make\n                                // room for points with a pointRange, typically columns. When the pointPlacement option\n                                // is 'between' or 'on', this padding does not apply.\n                                minPointOffset = Math.max(\n                                    minPointOffset,\n                                    isString(pointPlacement) ? 0 : seriesPointRange / 2\n                                );\n\n                                // Determine the total padding needed to the length of the axis to make room for the\n                                // pointRange. If the series' pointPlacement is 'on', no padding is added.\n                                pointRangePadding = Math.max(\n                                    pointRangePadding,\n                                    pointPlacement === 'on' ? 0 : seriesPointRange\n                                );\n                            }\n                        });\n                    }\n\n                    // Record minPointOffset and pointRangePadding\n                    ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853\n                    axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;\n                    axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;\n\n                    // pointRange means the width reserved for each point, like in a column chart\n                    axis.pointRange = Math.min(pointRange, range);\n\n                    // closestPointRange means the closest distance between points. In columns\n                    // it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange\n                    // is some other value\n                    if (isXAxis) {\n                        axis.closestPointRange = closestPointRange;\n                    }\n                }\n\n                // Secondary values\n                if (saveOld) {\n                    axis.oldTransA = transA;\n                }\n                axis.translationSlope = axis.transA = transA =\n                    axis.options.staticScale ||\n                    axis.len / ((range + pointRangePadding) || 1);\n                axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend\n                axis.minPixelPadding = transA * minPointOffset;\n            },\n\n            minFromRange: function() {\n                return this.max - this.range;\n            },\n\n            /**\n             * Set the tick positions to round values and optionally extend the extremes\n             * to the nearest tick\n             */\n            setTickInterval: function(secondPass) {\n                var axis = this,\n                    chart = axis.chart,\n                    options = axis.options,\n                    isLog = axis.isLog,\n                    log2lin = axis.log2lin,\n                    isDatetimeAxis = axis.isDatetimeAxis,\n                    isXAxis = axis.isXAxis,\n                    isLinked = axis.isLinked,\n                    maxPadding = options.maxPadding,\n                    minPadding = options.minPadding,\n                    length,\n                    linkedParentExtremes,\n                    tickIntervalOption = options.tickInterval,\n                    minTickInterval,\n                    tickPixelIntervalOption = options.tickPixelInterval,\n                    categories = axis.categories,\n                    threshold = axis.threshold,\n                    softThreshold = axis.softThreshold,\n                    thresholdMin,\n                    thresholdMax,\n                    hardMin,\n                    hardMax;\n\n                if (!isDatetimeAxis && !categories && !isLinked) {\n                    this.getTickAmount();\n                }\n\n                // Min or max set either by zooming/setExtremes or initial options\n                hardMin = pick(axis.userMin, options.min);\n                hardMax = pick(axis.userMax, options.max);\n\n                // Linked axis gets the extremes from the parent axis\n                if (isLinked) {\n                    axis.linkedParent = chart[axis.coll][options.linkedTo];\n                    linkedParentExtremes = axis.linkedParent.getExtremes();\n                    axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n                    axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n                    if (options.type !== axis.linkedParent.options.type) {\n                        H.error(11, 1); // Can't link axes of different type\n                    }\n\n                    // Initial min and max from the extreme data values\n                } else {\n\n                    // Adjust to hard threshold\n                    if (!softThreshold && defined(threshold)) {\n                        if (axis.dataMin >= threshold) {\n                            thresholdMin = threshold;\n                            minPadding = 0;\n                        } else if (axis.dataMax <= threshold) {\n                            thresholdMax = threshold;\n                            maxPadding = 0;\n                        }\n                    }\n\n                    axis.min = pick(hardMin, thresholdMin, axis.dataMin);\n                    axis.max = pick(hardMax, thresholdMax, axis.dataMax);\n\n                }\n\n                if (isLog) {\n                    if (\n                        axis.positiveValuesOnly &&\n                        !secondPass &&\n                        Math.min(axis.min, pick(axis.dataMin, axis.min)) <= 0\n                    ) { // #978\n                        H.error(10, 1); // Can't plot negative values on log axis\n                    }\n                    // The correctFloat cures #934, float errors on full tens. But it\n                    // was too aggressive for #4360 because of conversion back to lin,\n                    // therefore use precision 15.\n                    axis.min = correctFloat(log2lin(axis.min), 15);\n                    axis.max = correctFloat(log2lin(axis.max), 15);\n                }\n\n                // handle zoomed range\n                if (axis.range && defined(axis.max)) {\n                    axis.userMin = axis.min = hardMin = Math.max(axis.min, axis.minFromRange()); // #618\n                    axis.userMax = hardMax = axis.max;\n\n                    axis.range = null; // don't use it when running setExtremes\n                }\n\n                // Hook for Highstock Scroller. Consider combining with beforePadding.\n                fireEvent(axis, 'foundExtremes');\n\n                // Hook for adjusting this.min and this.max. Used by bubble series.\n                if (axis.beforePadding) {\n                    axis.beforePadding();\n                }\n\n                // adjust min and max for the minimum range\n                axis.adjustForMinRange();\n\n                // Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding\n                // into account, we do this after computing tick interval (#1337).\n                if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {\n                    length = axis.max - axis.min;\n                    if (length) {\n                        if (!defined(hardMin) && minPadding) {\n                            axis.min -= length * minPadding;\n                        }\n                        if (!defined(hardMax) && maxPadding) {\n                            axis.max += length * maxPadding;\n                        }\n                    }\n                }\n\n                // Handle options for floor, ceiling, softMin and softMax (#6359)\n                if (isNumber(options.softMin)) {\n                    axis.min = Math.min(axis.min, options.softMin);\n                }\n                if (isNumber(options.softMax)) {\n                    axis.max = Math.max(axis.max, options.softMax);\n                }\n                if (isNumber(options.floor)) {\n                    axis.min = Math.max(axis.min, options.floor);\n                }\n                if (isNumber(options.ceiling)) {\n                    axis.max = Math.min(axis.max, options.ceiling);\n                }\n\n\n                // When the threshold is soft, adjust the extreme value only if\n                // the data extreme and the padded extreme land on either side of the threshold. For example,\n                // a series of [0, 1, 2, 3] would make the yAxis add a tick for -1 because of the\n                // default minPadding and startOnTick options. This is prevented by the softThreshold\n                // option.\n                if (softThreshold && defined(axis.dataMin)) {\n                    threshold = threshold || 0;\n                    if (!defined(hardMin) && axis.min < threshold && axis.dataMin >= threshold) {\n                        axis.min = threshold;\n                    } else if (!defined(hardMax) && axis.max > threshold && axis.dataMax <= threshold) {\n                        axis.max = threshold;\n                    }\n                }\n\n\n                // get tickInterval\n                if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {\n                    axis.tickInterval = 1;\n                } else if (isLinked && !tickIntervalOption &&\n                    tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {\n                    axis.tickInterval = tickIntervalOption = axis.linkedParent.tickInterval;\n                } else {\n                    axis.tickInterval = pick(\n                        tickIntervalOption,\n                        this.tickAmount ? ((axis.max - axis.min) / Math.max(this.tickAmount - 1, 1)) : undefined,\n                        categories ? // for categoried axis, 1 is default, for linear axis use tickPix\n                        1 :\n                        // don't let it be more than the data range\n                        (axis.max - axis.min) * tickPixelIntervalOption / Math.max(axis.len, tickPixelIntervalOption)\n                    );\n                }\n\n                // Now we're finished detecting min and max, crop and group series data. This\n                // is in turn needed in order to find tick positions in ordinal axes.\n                if (isXAxis && !secondPass) {\n                    each(axis.series, function(series) {\n                        series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n                    });\n                }\n\n                // set the translation factor used in translate function\n                axis.setAxisTranslation(true);\n\n                // hook for ordinal axes and radial axes\n                if (axis.beforeSetTickPositions) {\n                    axis.beforeSetTickPositions();\n                }\n\n                // hook for extensions, used in Highstock ordinal axes\n                if (axis.postProcessTickInterval) {\n                    axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);\n                }\n\n                // In column-like charts, don't cramp in more ticks than there are points (#1943, #4184)\n                if (axis.pointRange && !tickIntervalOption) {\n                    axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n                }\n\n                // Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.\n                minTickInterval = pick(options.minTickInterval, axis.isDatetimeAxis && axis.closestPointRange);\n                if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n                    axis.tickInterval = minTickInterval;\n                }\n\n                // for linear axes, get magnitude and normalize the interval\n                if (!isDatetimeAxis && !isLog && !tickIntervalOption) {\n                    axis.tickInterval = normalizeTickInterval(\n                        axis.tickInterval,\n                        null,\n                        getMagnitude(axis.tickInterval),\n                        // If the tick interval is between 0.5 and 5 and the axis max is in the order of\n                        // thousands, chances are we are dealing with years. Don't allow decimals. #3363.\n                        pick(options.allowDecimals, !(axis.tickInterval > 0.5 && axis.tickInterval < 5 && axis.max > 1000 && axis.max < 9999)), !!this.tickAmount\n                    );\n                }\n\n                // Prevent ticks from getting so close that we can't draw the labels\n                if (!this.tickAmount) {\n                    axis.tickInterval = axis.unsquish();\n                }\n\n                this.setTickPositions();\n            },\n\n            /**\n             * Now we have computed the normalized tickInterval, get the tick positions\n             */\n            setTickPositions: function() {\n\n                var options = this.options,\n                    tickPositions,\n                    tickPositionsOption = options.tickPositions,\n                    tickPositioner = options.tickPositioner,\n                    startOnTick = options.startOnTick,\n                    endOnTick = options.endOnTick;\n\n                // Set the tickmarkOffset\n                this.tickmarkOffset = (this.categories && options.tickmarkPlacement === 'between' &&\n                    this.tickInterval === 1) ? 0.5 : 0; // #3202\n\n\n                // get minorTickInterval\n                this.minorTickInterval = options.minorTickInterval === 'auto' && this.tickInterval ?\n                    this.tickInterval / 5 : options.minorTickInterval;\n\n                // When there is only one point, or all points have the same value on\n                // this axis, then min and max are equal and tickPositions.length is 0\n                // or 1. In this case, add some padding in order to center the point,\n                // but leave it with one tick. #1337.\n                this.single =\n                    this.min === this.max &&\n                    defined(this.min) &&\n                    !this.tickAmount &&\n                    (\n                        // Data is on integer (#6563)\n                        parseInt(this.min, 10) === this.min ||\n\n                        // Between integers and decimals are not allowed (#6274)\n                        options.allowDecimals !== false\n                    );\n\n                // Find the tick positions\n                this.tickPositions = tickPositions = tickPositionsOption && tickPositionsOption.slice(); // Work on a copy (#1565)\n                if (!tickPositions) {\n\n                    if (this.isDatetimeAxis) {\n                        tickPositions = this.getTimeTicks(\n                            this.normalizeTimeTickInterval(\n                                this.tickInterval,\n                                options.units\n                            ),\n                            this.min,\n                            this.max,\n                            options.startOfWeek,\n                            this.ordinalPositions,\n                            this.closestPointRange,\n                            true\n                        );\n                    } else if (this.isLog) {\n                        tickPositions = this.getLogTickPositions(\n                            this.tickInterval,\n                            this.min,\n                            this.max\n                        );\n                    } else {\n                        tickPositions = this.getLinearTickPositions(\n                            this.tickInterval,\n                            this.min,\n                            this.max\n                        );\n                    }\n\n                    // Too dense ticks, keep only the first and last (#4477)\n                    if (tickPositions.length > this.len) {\n                        tickPositions = [tickPositions[0], tickPositions.pop()];\n                    }\n\n                    this.tickPositions = tickPositions;\n\n                    // Run the tick positioner callback, that allows modifying auto tick positions.\n                    if (tickPositioner) {\n                        tickPositioner = tickPositioner.apply(this, [this.min, this.max]);\n                        if (tickPositioner) {\n                            this.tickPositions = tickPositions = tickPositioner;\n                        }\n                    }\n\n                }\n\n                // Reset min/max or remove extremes based on start/end on tick\n                this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n                this.trimTicks(tickPositions, startOnTick, endOnTick);\n                if (!this.isLinked) {\n\n                    // Substract half a unit (#2619, #2846, #2515, #3390)\n                    if (this.single) {\n                        this.min -= 0.5;\n                        this.max += 0.5;\n                    }\n                    if (!tickPositionsOption && !tickPositioner) {\n                        this.adjustTickAmount();\n                    }\n                }\n            },\n\n            /**\n             * Handle startOnTick and endOnTick by either adapting to padding min/max or rounded min/max\n             */\n            trimTicks: function(tickPositions, startOnTick, endOnTick) {\n                var roundedMin = tickPositions[0],\n                    roundedMax = tickPositions[tickPositions.length - 1],\n                    minPointOffset = this.minPointOffset || 0;\n\n                if (!this.isLinked) {\n                    if (startOnTick && roundedMin !== -Infinity) { // #6502\n                        this.min = roundedMin;\n                    } else {\n                        while (this.min - minPointOffset > tickPositions[0]) {\n                            tickPositions.shift();\n                        }\n                    }\n\n                    if (endOnTick) {\n                        this.max = roundedMax;\n                    } else {\n                        while (this.max + minPointOffset < tickPositions[tickPositions.length - 1]) {\n                            tickPositions.pop();\n                        }\n                    }\n\n                    // If no tick are left, set one tick in the middle (#3195)\n                    if (tickPositions.length === 0 && defined(roundedMin)) {\n                        tickPositions.push((roundedMax + roundedMin) / 2);\n                    }\n                }\n            },\n\n            /**\n             * Check if there are multiple axes in the same pane.\n             *\n             * @private\n             * @return {Boolean}\n             *         True if there are other axes.\n             */\n            alignToOthers: function() {\n                var others = {}, // Whether there is another axis to pair with this one\n                    hasOther,\n                    options = this.options;\n\n                if (\n                    // Only if alignTicks is true\n                    this.chart.options.chart.alignTicks !== false &&\n                    options.alignTicks !== false &&\n\n                    // Don't try to align ticks on a log axis, they are not evenly\n                    // spaced (#6021)\n                    !this.isLog\n                ) {\n                    each(this.chart[this.coll], function(axis) {\n                        var otherOptions = axis.options,\n                            horiz = axis.horiz,\n                            key = [\n                                horiz ? otherOptions.left : otherOptions.top,\n                                otherOptions.width,\n                                otherOptions.height,\n                                otherOptions.pane\n                            ].join(',');\n\n\n                        if (axis.series.length) { // #4442\n                            if (others[key]) {\n                                hasOther = true; // #4201\n                            } else {\n                                others[key] = 1;\n                            }\n                        }\n                    });\n                }\n                return hasOther;\n            },\n\n            /**\n             * Set the max ticks of either the x and y axis collection\n             */\n            getTickAmount: function() {\n                var options = this.options,\n                    tickAmount = options.tickAmount,\n                    tickPixelInterval = options.tickPixelInterval;\n\n                if (!defined(options.tickInterval) && this.len < tickPixelInterval && !this.isRadial &&\n                    !this.isLog && options.startOnTick && options.endOnTick) {\n                    tickAmount = 2;\n                }\n\n                if (!tickAmount && this.alignToOthers()) {\n                    // Add 1 because 4 tick intervals require 5 ticks (including first and last)\n                    tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n                }\n\n                // For tick amounts of 2 and 3, compute five ticks and remove the intermediate ones. This\n                // prevents the axis from adding ticks that are too far away from the data extremes.\n                if (tickAmount < 4) {\n                    this.finalTickAmt = tickAmount;\n                    tickAmount = 5;\n                }\n\n                this.tickAmount = tickAmount;\n            },\n\n            /**\n             * When using multiple axes, adjust the number of ticks to match the highest\n             * number of ticks in that group.\n             *\n             * @private\n             */\n            adjustTickAmount: function() {\n                var tickInterval = this.tickInterval,\n                    tickPositions = this.tickPositions,\n                    tickAmount = this.tickAmount,\n                    finalTickAmt = this.finalTickAmt,\n                    currentTickAmount = tickPositions && tickPositions.length,\n                    i,\n                    len;\n\n                if (currentTickAmount < tickAmount) {\n                    while (tickPositions.length < tickAmount) {\n                        tickPositions.push(correctFloat(\n                            tickPositions[tickPositions.length - 1] + tickInterval\n                        ));\n                    }\n                    this.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n                    this.max = tickPositions[tickPositions.length - 1];\n\n                    // We have too many ticks, run second pass to try to reduce ticks\n                } else if (currentTickAmount > tickAmount) {\n                    this.tickInterval *= 2;\n                    this.setTickPositions();\n                }\n\n                // The finalTickAmt property is set in getTickAmount\n                if (defined(finalTickAmt)) {\n                    i = len = tickPositions.length;\n                    while (i--) {\n                        if (\n                            (finalTickAmt === 3 && i % 2 === 1) || // Remove every other tick\n                            (finalTickAmt <= 2 && i > 0 && i < len - 1) // Remove all but first and last\n                        ) {\n                            tickPositions.splice(i, 1);\n                        }\n                    }\n                    this.finalTickAmt = undefined;\n                }\n            },\n\n            /**\n             * Set the scale based on data min and max, user set min and max or options\n             *\n             */\n            setScale: function() {\n                var axis = this,\n                    isDirtyData,\n                    isDirtyAxisLength;\n\n                axis.oldMin = axis.min;\n                axis.oldMax = axis.max;\n                axis.oldAxisLength = axis.len;\n\n                // set the new axisLength\n                axis.setAxisSize();\n                //axisLength = horiz ? axisWidth : axisHeight;\n                isDirtyAxisLength = axis.len !== axis.oldAxisLength;\n\n                // is there new data?\n                each(axis.series, function(series) {\n                    if (series.isDirtyData || series.isDirty ||\n                        series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well\n                        isDirtyData = true;\n                    }\n                });\n\n                // do we really need to go through all this?\n                if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||\n                    axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax || axis.alignToOthers()) {\n\n                    if (axis.resetStacks) {\n                        axis.resetStacks();\n                    }\n\n                    axis.forceRedraw = false;\n\n                    // get data extremes if needed\n                    axis.getSeriesExtremes();\n\n                    // get fixed positions based on tickInterval\n                    axis.setTickInterval();\n\n                    // record old values to decide whether a rescale is necessary later on (#540)\n                    axis.oldUserMin = axis.userMin;\n                    axis.oldUserMax = axis.userMax;\n\n                    // Mark as dirty if it is not already set to dirty and extremes have changed. #595.\n                    if (!axis.isDirty) {\n                        axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;\n                    }\n                } else if (axis.cleanStacks) {\n                    axis.cleanStacks();\n                }\n            },\n\n            /**\n             * Set the minimum and maximum of the axes after render time. If the\n             * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n             * values are rounded off to the nearest tick. To prevent this, these\n             * options can be set to false before calling setExtremes. Also, setExtremes\n             * will not allow a range lower than the `minRange` option, which by default\n             * is the range of five points.\n             * \n             * @param  {Number} [newMin]\n             *         The new minimum value.\n             * @param  {Number} [newMax]\n             *         The new maximum value.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart or wait for an explicit call to \n             *         {@link Highcharts.Chart#redraw}\n             * @param  {AnimationOptions} [animation=true]\n             *         Enable or modify animations.\n             * @param  {Object} [eventArguments]\n             *         Arguments to be accessed in event handler.\n             *\n             * @sample highcharts/members/axis-setextremes/\n             *         Set extremes from a button\n             * @sample highcharts/members/axis-setextremes-datetime/\n             *         Set extremes on a datetime axis\n             * @sample highcharts/members/axis-setextremes-off-ticks/\n             *         Set extremes off ticks\n             * @sample stock/members/axis-setextremes/\n             *         Set extremes in Highstock\n             * @sample maps/members/axis-setextremes/\n             *         Set extremes in Highmaps\n             */\n            setExtremes: function(newMin, newMax, redraw, animation, eventArguments) {\n                var axis = this,\n                    chart = axis.chart;\n\n                redraw = pick(redraw, true); // defaults to true\n\n                each(axis.series, function(serie) {\n                    delete serie.kdTree;\n                });\n\n                // Extend the arguments with min and max\n                eventArguments = extend(eventArguments, {\n                    min: newMin,\n                    max: newMax\n                });\n\n                // Fire the event\n                fireEvent(axis, 'setExtremes', eventArguments, function() { // the default event handler\n\n                    axis.userMin = newMin;\n                    axis.userMax = newMax;\n                    axis.eventArgs = eventArguments;\n\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                });\n            },\n\n            /**\n             * Overridable method for zooming chart. Pulled out in a separate method to allow overriding\n             * in stock charts.\n             */\n            zoom: function(newMin, newMax) {\n                var dataMin = this.dataMin,\n                    dataMax = this.dataMax,\n                    options = this.options,\n                    min = Math.min(dataMin, pick(options.min, dataMin)),\n                    max = Math.max(dataMax, pick(options.max, dataMax));\n\n                if (newMin !== this.min || newMax !== this.max) { // #5790\n\n                    // Prevent pinch zooming out of range. Check for defined is for #1946. #1734.\n                    if (!this.allowZoomOutside) {\n                        // #6014, sometimes newMax will be smaller than min (or newMin will be larger than max).\n                        if (defined(dataMin)) {\n                            if (newMin < min) {\n                                newMin = min;\n                            }\n                            if (newMin > max) {\n                                newMin = max;\n                            }\n                        }\n                        if (defined(dataMax)) {\n                            if (newMax < min) {\n                                newMax = min;\n                            }\n                            if (newMax > max) {\n                                newMax = max;\n                            }\n                        }\n                    }\n\n                    // In full view, displaying the reset zoom button is not required\n                    this.displayBtn = newMin !== undefined || newMax !== undefined;\n\n                    // Do it\n                    this.setExtremes(\n                        newMin,\n                        newMax,\n                        false,\n                        undefined, {\n                            trigger: 'zoom'\n                        }\n                    );\n                }\n\n                return true;\n            },\n\n            /**\n             * Update the axis metrics\n             */\n            setAxisSize: function() {\n                var chart = this.chart,\n                    options = this.options,\n                    offsets = options.offsets || [0, 0, 0, 0], // top / right / bottom / left\n                    horiz = this.horiz,\n                    width = pick(options.width, chart.plotWidth - offsets[3] + offsets[1]),\n                    height = pick(options.height, chart.plotHeight - offsets[0] + offsets[2]),\n                    top = pick(options.top, chart.plotTop + offsets[0]),\n                    left = pick(options.left, chart.plotLeft + offsets[3]),\n                    percentRegex = /%$/;\n\n                // Check for percentage based input values. Rounding fixes problems with\n                // column overflow and plot line filtering (#4898, #4899)\n                if (percentRegex.test(height)) {\n                    height = Math.round(parseFloat(height) / 100 * chart.plotHeight);\n                }\n                if (percentRegex.test(top)) {\n                    top = Math.round(parseFloat(top) / 100 * chart.plotHeight + chart.plotTop);\n                }\n\n                // Expose basic values to use in Series object and navigator\n                this.left = left;\n                this.top = top;\n                this.width = width;\n                this.height = height;\n                this.bottom = chart.chartHeight - height - top;\n                this.right = chart.chartWidth - width - left;\n\n                // Direction agnostic properties\n                this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n                this.pos = horiz ? left : top; // distance from SVG origin\n            },\n\n            /**\n             * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n             * function. \n             * @typedef {Object} Extremes\n             * @property {Number} dataMax\n             *         The maximum value of the axis' associated series.\n             * @property {Number} dataMin\n             *         The minimum value of the axis' associated series.\n             * @property {Number} max\n             *         The maximum axis value, either automatic or set manually. If the\n             *         `max` option is not set, `maxPadding` is 0 and `endOnTick` is\n             *         false, this value will be the same as `dataMax`.\n             * @property {Number} min\n             *         The minimum axis value, either automatic or set manually. If the\n             *         `min` option is not set, `minPadding` is 0 and `startOnTick` is\n             *         false, this value will be the same as `dataMin`.\n             */\n            /**\n             * Get the current extremes for the axis.\n             *\n             * @returns {Extremes}\n             * An object containing extremes information.\n             * \n             * @sample  members/axis-getextremes/\n             *          Report extremes by click on a button\n             * @sample  maps/members/axis-getextremes/\n             *          Get extremes in Highmaps\n             */\n            getExtremes: function() {\n                var axis = this,\n                    isLog = axis.isLog,\n                    lin2log = axis.lin2log;\n\n                return {\n                    min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,\n                    max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,\n                    dataMin: axis.dataMin,\n                    dataMax: axis.dataMax,\n                    userMin: axis.userMin,\n                    userMax: axis.userMax\n                };\n            },\n\n            /**\n             * Get the zero plane either based on zero or on the min or max value.\n             * Used in bar and area plots\n             */\n            getThreshold: function(threshold) {\n                var axis = this,\n                    isLog = axis.isLog,\n                    lin2log = axis.lin2log,\n                    realMin = isLog ? lin2log(axis.min) : axis.min,\n                    realMax = isLog ? lin2log(axis.max) : axis.max;\n\n                if (threshold === null) {\n                    threshold = realMin;\n                } else if (realMin > threshold) {\n                    threshold = realMin;\n                } else if (realMax < threshold) {\n                    threshold = realMax;\n                }\n\n                return axis.translate(threshold, 0, 1, 0, 1);\n            },\n\n            /**\n             * Compute auto alignment for the axis label based on which side the axis is\n             * on and the given rotation for the label.\n             *\n             * @param  {Number} rotation\n             *         The rotation in degrees as set by either the `rotation` or \n             *         `autoRotation` options.\n             * @private\n             */\n            autoLabelAlign: function(rotation) {\n                var ret,\n                    angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;\n\n                if (angle > 15 && angle < 165) {\n                    ret = 'right';\n                } else if (angle > 195 && angle < 345) {\n                    ret = 'left';\n                } else {\n                    ret = 'center';\n                }\n                return ret;\n            },\n\n            /**\n             * Get the tick length and width for the axis.\n             * @param   {String} prefix 'tick' or 'minorTick'\n             * @returns {Array}        An array of tickLength and tickWidth\n             */\n            tickSize: function(prefix) {\n                var options = this.options,\n                    tickLength = options[prefix + 'Length'],\n                    tickWidth = pick(options[prefix + 'Width'], prefix === 'tick' && this.isXAxis ? 1 : 0); // X axis defaults to 1\n\n                if (tickWidth && tickLength) {\n                    // Negate the length\n                    if (options[prefix + 'Position'] === 'inside') {\n                        tickLength = -tickLength;\n                    }\n                    return [tickLength, tickWidth];\n                }\n\n            },\n\n            /**\n             * Return the size of the labels\n             */\n            labelMetrics: function() {\n                var index = this.tickPositions && this.tickPositions[0] || 0;\n                return this.chart.renderer.fontMetrics(\n                    this.options.labels.style && this.options.labels.style.fontSize,\n                    this.ticks[index] && this.ticks[index].label\n                );\n            },\n\n            /**\n             * Prevent the ticks from getting so close we can't draw the labels. On a horizontal\n             * axis, this is handled by rotating the labels, removing ticks and adding ellipsis.\n             * On a vertical axis remove ticks and add ellipsis.\n             */\n            unsquish: function() {\n                var labelOptions = this.options.labels,\n                    horiz = this.horiz,\n                    tickInterval = this.tickInterval,\n                    newTickInterval = tickInterval,\n                    slotSize = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / tickInterval),\n                    rotation,\n                    rotationOption = labelOptions.rotation,\n                    labelMetrics = this.labelMetrics(),\n                    step,\n                    bestScore = Number.MAX_VALUE,\n                    autoRotation,\n                    // Return the multiple of tickInterval that is needed to avoid collision\n                    getStep = function(spaceNeeded) {\n                        var step = spaceNeeded / (slotSize || 1);\n                        step = step > 1 ? Math.ceil(step) : 1;\n                        return step * tickInterval;\n                    };\n\n                if (horiz) {\n                    autoRotation = !labelOptions.staggerLines && !labelOptions.step && ( // #3971\n                        defined(rotationOption) ? [rotationOption] :\n                        slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation\n                    );\n\n                    if (autoRotation) {\n\n                        // Loop over the given autoRotation options, and determine which gives the best score. The\n                        // best score is that with the lowest number of steps and a rotation closest to horizontal.\n                        each(autoRotation, function(rot) {\n                            var score;\n\n                            if (rot === rotationOption || (rot && rot >= -90 && rot <= 90)) { // #3891\n\n                                step = getStep(Math.abs(labelMetrics.h / Math.sin(deg2rad * rot)));\n\n                                score = step + Math.abs(rot / 360);\n\n                                if (score < bestScore) {\n                                    bestScore = score;\n                                    rotation = rot;\n                                    newTickInterval = step;\n                                }\n                            }\n                        });\n                    }\n\n                } else if (!labelOptions.step) { // #4411\n                    newTickInterval = getStep(labelMetrics.h);\n                }\n\n                this.autoRotation = autoRotation;\n                this.labelRotation = pick(rotation, rotationOption);\n\n                return newTickInterval;\n            },\n\n            /**\n             * Get the general slot width for this axis. This may change between the pre-render (from Axis.getOffset) \n             * and the final tick rendering and placement (#5086).\n             */\n            getSlotWidth: function() {\n                var chart = this.chart,\n                    horiz = this.horiz,\n                    labelOptions = this.options.labels,\n                    slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),\n                    marginLeft = chart.margin[3];\n\n                return (\n                    horiz &&\n                    (labelOptions.step || 0) < 2 &&\n                    !labelOptions.rotation && // #4415\n                    ((this.staggerLines || 1) * this.len) / slotCount\n                ) || (!horiz && (\n                    (marginLeft && (marginLeft - chart.spacing[3])) ||\n                    chart.chartWidth * 0.33\n                )); // #1580, #1931\n\n            },\n\n            /**\n             * Render the axis labels and determine whether ellipsis or rotation need to be applied\n             */\n            renderUnsquish: function() {\n                var chart = this.chart,\n                    renderer = chart.renderer,\n                    tickPositions = this.tickPositions,\n                    ticks = this.ticks,\n                    labelOptions = this.options.labels,\n                    horiz = this.horiz,\n                    slotWidth = this.getSlotWidth(),\n                    innerWidth = Math.max(1, Math.round(slotWidth - 2 * (labelOptions.padding || 5))),\n                    attr = {},\n                    labelMetrics = this.labelMetrics(),\n                    textOverflowOption = labelOptions.style && labelOptions.style.textOverflow,\n                    css,\n                    maxLabelLength = 0,\n                    label,\n                    i,\n                    pos;\n\n                // Set rotation option unless it is \"auto\", like in gauges\n                if (!isString(labelOptions.rotation)) {\n                    attr.rotation = labelOptions.rotation || 0; // #4443\n                }\n\n                // Get the longest label length\n                each(tickPositions, function(tick) {\n                    tick = ticks[tick];\n                    if (tick && tick.labelLength > maxLabelLength) {\n                        maxLabelLength = tick.labelLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n\n\n                // Handle auto rotation on horizontal axis\n                if (this.autoRotation) {\n\n                    // Apply rotation only if the label is too wide for the slot, and\n                    // the label is wider than its height.\n                    if (maxLabelLength > innerWidth && maxLabelLength > labelMetrics.h) {\n                        attr.rotation = this.labelRotation;\n                    } else {\n                        this.labelRotation = 0;\n                    }\n\n                    // Handle word-wrap or ellipsis on vertical axis\n                } else if (slotWidth) {\n                    // For word-wrap or ellipsis\n                    css = {\n                        width: innerWidth + 'px'\n                    };\n\n                    if (!textOverflowOption) {\n                        css.textOverflow = 'clip';\n\n                        // On vertical axis, only allow word wrap if there is room for more lines.\n                        i = tickPositions.length;\n                        while (!horiz && i--) {\n                            pos = tickPositions[i];\n                            label = ticks[pos].label;\n                            if (label) {\n                                // Reset ellipsis in order to get the correct bounding box (#4070)\n                                if (label.styles && label.styles.textOverflow === 'ellipsis') {\n                                    label.css({\n                                        textOverflow: 'clip'\n                                    });\n\n                                    // Set the correct width in order to read the bounding box height (#4678, #5034)\n                                } else if (ticks[pos].labelLength > slotWidth) {\n                                    label.css({\n                                        width: slotWidth + 'px'\n                                    });\n                                }\n\n                                if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {\n                                    label.specCss = {\n                                        textOverflow: 'ellipsis'\n                                    };\n                                }\n                            }\n                        }\n                    }\n                }\n\n\n                // Add ellipsis if the label length is significantly longer than ideal\n                if (attr.rotation) {\n                    css = {\n                        width: (maxLabelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + 'px'\n                    };\n                    if (!textOverflowOption) {\n                        css.textOverflow = 'ellipsis';\n                    }\n                }\n\n                // Set the explicit or automatic label alignment\n                this.labelAlign = labelOptions.align || this.autoLabelAlign(this.labelRotation);\n                if (this.labelAlign) {\n                    attr.align = this.labelAlign;\n                }\n\n                // Apply general and specific CSS\n                each(tickPositions, function(pos) {\n                    var tick = ticks[pos],\n                        label = tick && tick.label;\n                    if (label) {\n                        label.attr(attr); // This needs to go before the CSS in old IE (#4502)\n                        if (css) {\n                            label.css(merge(css, label.specCss));\n                        }\n                        delete label.specCss;\n                        tick.rotation = attr.rotation;\n                    }\n                });\n\n                // Note: Why is this not part of getLabelPosition?\n                this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n            },\n\n            /**\n             * Return true if the axis has associated data\n             */\n            hasData: function() {\n                return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);\n            },\n\n            /**\n             * Adds the title defined in axis.options.title.\n             * @param {Boolean} display - whether or not to display the title\n             */\n            addTitle: function(display) {\n                var axis = this,\n                    renderer = axis.chart.renderer,\n                    horiz = axis.horiz,\n                    opposite = axis.opposite,\n                    options = axis.options,\n                    axisTitleOptions = options.title,\n                    textAlign;\n\n                if (!axis.axisTitle) {\n                    textAlign = axisTitleOptions.textAlign;\n                    if (!textAlign) {\n                        textAlign = (horiz ? {\n                            low: 'left',\n                            middle: 'center',\n                            high: 'right'\n                        } : {\n                            low: opposite ? 'right' : 'left',\n                            middle: 'center',\n                            high: opposite ? 'left' : 'right'\n                        })[axisTitleOptions.align];\n                    }\n                    axis.axisTitle = renderer.text(\n                            axisTitleOptions.text,\n                            0,\n                            0,\n                            axisTitleOptions.useHTML\n                        )\n                        .attr({\n                            zIndex: 7,\n                            rotation: axisTitleOptions.rotation || 0,\n                            align: textAlign\n                        })\n                        .addClass('highcharts-axis-title')\n\n                        .add(axis.axisGroup);\n                    axis.axisTitle.isNew = true;\n                }\n\n                // hide or show the title depending on whether showEmpty is set\n                axis.axisTitle[display ? 'show' : 'hide'](true);\n            },\n\n            /**\n             * Generates a tick for initial positioning.\n             *\n             * @private\n             * @param  {number} pos\n             *         The tick position in axis values.\n             * @param  {number} i\n             *         The index of the tick in {@link Axis.tickPositions}.\n             */\n            generateTick: function(pos) {\n                var ticks = this.ticks;\n\n                if (!ticks[pos]) {\n                    ticks[pos] = new Tick(this, pos);\n                } else {\n                    ticks[pos].addLabel(); // update labels depending on tick interval\n                }\n            },\n\n            /**\n             * Render the tick labels to a preliminary position to get their sizes\n             */\n            getOffset: function() {\n                var axis = this,\n                    chart = axis.chart,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    ticks = axis.ticks,\n                    horiz = axis.horiz,\n                    side = axis.side,\n                    invertedSide = chart.inverted && !axis.isZAxis ? [1, 0, 3, 2][side] : side,\n                    hasData,\n                    showAxis,\n                    titleOffset = 0,\n                    titleOffsetOption,\n                    titleMargin = 0,\n                    axisTitleOptions = options.title,\n                    labelOptions = options.labels,\n                    labelOffset = 0, // reset\n                    labelOffsetPadded,\n                    axisOffset = chart.axisOffset,\n                    clipOffset = chart.clipOffset,\n                    clip,\n                    directionFactor = [-1, 1, 1, -1][side],\n                    className = options.className,\n                    axisParent = axis.axisParent, // Used in color axis\n                    lineHeightCorrection,\n                    tickSize = this.tickSize('tick');\n\n                // For reuse in Axis.render\n                hasData = axis.hasData();\n                axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n                // Set/reset staggerLines\n                axis.staggerLines = axis.horiz && labelOptions.staggerLines;\n\n                // Create the axisGroup and gridGroup elements on first iteration\n                if (!axis.axisGroup) {\n                    axis.gridGroup = renderer.g('grid')\n                        .attr({\n                            zIndex: options.gridZIndex || 1\n                        })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + '-grid ' + (className || ''))\n                        .add(axisParent);\n                    axis.axisGroup = renderer.g('axis')\n                        .attr({\n                            zIndex: options.zIndex || 2\n                        })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + ' ' + (className || ''))\n                        .add(axisParent);\n                    axis.labelGroup = renderer.g('axis-labels')\n                        .attr({\n                            zIndex: labelOptions.zIndex || 7\n                        })\n                        .addClass('highcharts-' + axis.coll.toLowerCase() + '-labels ' + (className || ''))\n                        .add(axisParent);\n                }\n\n                if (hasData || axis.isLinked) {\n\n                    // Generate ticks\n                    each(tickPositions, function(pos, i) {\n                        // i is not used here, but may be used in overrides\n                        axis.generateTick(pos, i);\n                    });\n\n                    axis.renderUnsquish();\n\n\n                    // Left side must be align: right and right side must have align: left for labels\n                    if (labelOptions.reserveSpace !== false && (side === 0 || side === 2 || {\n                            1: 'left',\n                            3: 'right'\n                        }[side] === axis.labelAlign || axis.labelAlign === 'center')) {\n                        each(tickPositions, function(pos) {\n\n                            // get the highest offset\n                            labelOffset = Math.max(\n                                ticks[pos].getLabelSize(),\n                                labelOffset\n                            );\n                        });\n                    }\n\n                    if (axis.staggerLines) {\n                        labelOffset *= axis.staggerLines;\n                        axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n                    }\n\n\n                } else { // doesn't have data\n                    objectEach(ticks, function(tick, n) {\n                        tick.destroy();\n                        delete ticks[n];\n                    });\n                }\n\n                if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {\n                    axis.addTitle(showAxis);\n\n                    if (showAxis && axisTitleOptions.reserveSpace !== false) {\n                        axis.titleOffset = titleOffset =\n                            axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n                        titleOffsetOption = axisTitleOptions.offset;\n                        titleMargin = defined(titleOffsetOption) ? 0 : pick(axisTitleOptions.margin, horiz ? 5 : 10);\n                    }\n                }\n\n                // Render the axis line\n                axis.renderLine();\n\n                // handle automatic or user set offset\n                axis.offset = directionFactor * pick(options.offset, axisOffset[side]);\n\n                axis.tickRotCorr = axis.tickRotCorr || {\n                    x: 0,\n                    y: 0\n                }; // polar\n                if (side === 0) {\n                    lineHeightCorrection = -axis.labelMetrics().h;\n                } else if (side === 2) {\n                    lineHeightCorrection = axis.tickRotCorr.y;\n                } else {\n                    lineHeightCorrection = 0;\n                }\n\n                // Find the padded label offset\n                labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n                if (labelOffset) {\n                    labelOffsetPadded -= lineHeightCorrection;\n                    labelOffsetPadded += directionFactor * (horiz ? pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) : labelOptions.x);\n                }\n                axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n\n                axisOffset[side] = Math.max(\n                    axisOffset[side],\n                    axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,\n                    labelOffsetPadded, // #3027\n                    hasData && tickPositions.length && tickSize ?\n                    tickSize[0] + directionFactor * axis.offset :\n                    0 // #4866\n                );\n\n                // Decide the clipping needed to keep the graph inside the plot area and\n                // axis lines\n                clip = Math.floor(axis.axisLine.strokeWidth() / 2) * 2; // #4308, #4371\n                if (options.offset > 0) {\n                    clip -= options.offset * 2;\n                }\n                clipOffset[invertedSide] = Math.max(\n                    clipOffset[invertedSide] || clip,\n                    clip\n                );\n            },\n\n            /**\n             * Internal function to get the path for the axis line. Extended for polar\n             * charts.\n             *\n             * @param  {Number} lineWidth\n             *         The line width in pixels.\n             * @return {Array}\n             *         The SVG path definition in array form.\n             */\n            getLinePath: function(lineWidth) {\n                var chart = this.chart,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    horiz = this.horiz,\n                    lineLeft = this.left + (opposite ? this.width : 0) + offset,\n                    lineTop = chart.chartHeight - this.bottom -\n                    (opposite ? this.height : 0) + offset;\n\n                if (opposite) {\n                    lineWidth *= -1; // crispify the other way - #1480, #1687\n                }\n\n                return chart.renderer\n                    .crispLine([\n                        'M',\n                        horiz ?\n                        this.left :\n                        lineLeft,\n                        horiz ?\n                        lineTop :\n                        this.top,\n                        'L',\n                        horiz ?\n                        chart.chartWidth - this.right :\n                        lineLeft,\n                        horiz ?\n                        lineTop :\n                        chart.chartHeight - this.bottom\n                    ], lineWidth);\n            },\n\n            /**\n             * Render the axis line\n             */\n            renderLine: function() {\n                if (!this.axisLine) {\n                    this.axisLine = this.chart.renderer.path()\n                        .addClass('highcharts-axis-line')\n                        .add(this.axisGroup);\n\n\n                }\n            },\n\n            /**\n             * Position the title\n             */\n            getTitlePosition: function() {\n                // compute anchor points for each of the title align options\n                var horiz = this.horiz,\n                    axisLeft = this.left,\n                    axisTop = this.top,\n                    axisLength = this.len,\n                    axisTitleOptions = this.options.title,\n                    margin = horiz ? axisLeft : axisTop,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    xOption = axisTitleOptions.x || 0,\n                    yOption = axisTitleOptions.y || 0,\n                    fontSize = this.chart.renderer.fontMetrics(axisTitleOptions.style && axisTitleOptions.style.fontSize, this.axisTitle).f,\n\n                    // the position in the length direction of the axis\n                    alongAxis = {\n                        low: margin + (horiz ? 0 : axisLength),\n                        middle: margin + axisLength / 2,\n                        high: margin + (horiz ? axisLength : 0)\n                    }[axisTitleOptions.align],\n\n                    // the position in the perpendicular direction of the axis\n                    offAxis = (horiz ? axisTop + this.height : axisLeft) +\n                    (horiz ? 1 : -1) * // horizontal axis reverses the margin\n                    (opposite ? -1 : 1) * // so does opposite axes\n                    this.axisTitleMargin +\n                    (this.side === 2 ? fontSize : 0);\n\n                return {\n                    x: horiz ?\n                        alongAxis + xOption : offAxis + (opposite ? this.width : 0) + offset + xOption,\n                    y: horiz ?\n                        offAxis + yOption - (opposite ? this.height : 0) + offset : alongAxis + yOption\n                };\n            },\n\n            /**\n             * Render a minor tick into the given position. If a minor tick already \n             * exists in this position, move it.\n             * @param  {number} pos - The position in axis values.\n             */\n            renderMinorTick: function(pos) {\n                var slideInTicks = this.chart.hasRendered && isNumber(this.oldMin),\n                    minorTicks = this.minorTicks;\n\n                if (!minorTicks[pos]) {\n                    minorTicks[pos] = new Tick(this, pos, 'minor');\n                }\n\n                // Render new ticks in old position\n                if (slideInTicks && minorTicks[pos].isNew) {\n                    minorTicks[pos].render(null, true);\n                }\n\n                minorTicks[pos].render(null, false, 1);\n            },\n\n            /**\n             * Render a major tick into the given position. If a tick already exists\n             * in this position, move it.\n             * @param  {number} pos - The position in axis values\n             * @param  {number} i - The tick index\n             */\n            renderTick: function(pos, i) {\n                var isLinked = this.isLinked,\n                    ticks = this.ticks,\n                    slideInTicks = this.chart.hasRendered && isNumber(this.oldMin);\n\n                // Linked axes need an extra check to find out if\n                if (!isLinked || (pos >= this.min && pos <= this.max)) {\n\n                    if (!ticks[pos]) {\n                        ticks[pos] = new Tick(this, pos);\n                    }\n\n                    // render new ticks in old position\n                    if (slideInTicks && ticks[pos].isNew) {\n                        ticks[pos].render(i, true, 0.1);\n                    }\n\n                    ticks[pos].render(i);\n                }\n            },\n\n            /**\n             * Render the axis\n             */\n            render: function() {\n                var axis = this,\n                    chart = axis.chart,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    isLog = axis.isLog,\n                    lin2log = axis.lin2log,\n                    isLinked = axis.isLinked,\n                    tickPositions = axis.tickPositions,\n                    axisTitle = axis.axisTitle,\n                    ticks = axis.ticks,\n                    minorTicks = axis.minorTicks,\n                    alternateBands = axis.alternateBands,\n                    stackLabelOptions = options.stackLabels,\n                    alternateGridColor = options.alternateGridColor,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    axisLine = axis.axisLine,\n                    showAxis = axis.showAxis,\n                    animation = animObject(renderer.globalAnimation),\n                    from,\n                    to;\n\n                // Reset\n                axis.labelEdge.length = 0;\n                //axis.justifyToPlot = overflow === 'justify';\n                axis.overlap = false;\n\n                // Mark all elements inActive before we go over and mark the active ones\n                each([ticks, minorTicks, alternateBands], function(coll) {\n                    objectEach(coll, function(tick) {\n                        tick.isActive = false;\n                    });\n                });\n\n                // If the series has data draw the ticks. Else only the line and title\n                if (axis.hasData() || isLinked) {\n\n                    // minor ticks\n                    if (axis.minorTickInterval && !axis.categories) {\n                        each(axis.getMinorTickPositions(), function(pos) {\n                            axis.renderMinorTick(pos);\n                        });\n                    }\n\n                    // Major ticks. Pull out the first item and render it last so that\n                    // we can get the position of the neighbour label. #808.\n                    if (tickPositions.length) { // #1300\n                        each(tickPositions, function(pos, i) {\n                            axis.renderTick(pos, i);\n                        });\n                        // In a categorized axis, the tick marks are displayed between labels. So\n                        // we need to add a tick mark and grid line at the left edge of the X axis.\n                        if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n                            if (!ticks[-1]) {\n                                ticks[-1] = new Tick(axis, -1, null, true);\n                            }\n                            ticks[-1].render(-1);\n                        }\n\n                    }\n\n                    // alternate grid color\n                    if (alternateGridColor) {\n                        each(tickPositions, function(pos, i) {\n                            to = tickPositions[i + 1] !== undefined ? tickPositions[i + 1] + tickmarkOffset : axis.max - tickmarkOffset;\n                            if (i % 2 === 0 && pos < axis.max && to <= axis.max + (chart.polar ? -tickmarkOffset : tickmarkOffset)) { // #2248, #4660\n                                if (!alternateBands[pos]) {\n                                    alternateBands[pos] = new H.PlotLineOrBand(axis);\n                                }\n                                from = pos + tickmarkOffset; // #949\n                                alternateBands[pos].options = {\n                                    from: isLog ? lin2log(from) : from,\n                                    to: isLog ? lin2log(to) : to,\n                                    color: alternateGridColor\n                                };\n                                alternateBands[pos].render();\n                                alternateBands[pos].isActive = true;\n                            }\n                        });\n                    }\n\n                    // custom plot lines and bands\n                    if (!axis._addedPlotLB) { // only first time\n                        each((options.plotLines || []).concat(options.plotBands || []), function(plotLineOptions) {\n                            axis.addPlotBandOrLine(plotLineOptions);\n                        });\n                        axis._addedPlotLB = true;\n                    }\n\n                } // end if hasData\n\n                // Remove inactive ticks\n                each([ticks, minorTicks, alternateBands], function(coll) {\n                    var i,\n                        forDestruction = [],\n                        delay = animation.duration,\n                        destroyInactiveItems = function() {\n                            i = forDestruction.length;\n                            while (i--) {\n                                // When resizing rapidly, the same items may be destroyed in different timeouts,\n                                // or the may be reactivated\n                                if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {\n                                    coll[forDestruction[i]].destroy();\n                                    delete coll[forDestruction[i]];\n                                }\n                            }\n\n                        };\n\n                    objectEach(coll, function(tick, pos) {\n                        if (!tick.isActive) {\n                            // Render to zero opacity\n                            tick.render(pos, false, 0);\n                            tick.isActive = false;\n                            forDestruction.push(pos);\n                        }\n                    });\n\n                    // When the objects are finished fading out, destroy them\n                    syncTimeout(\n                        destroyInactiveItems,\n                        coll === alternateBands || !chart.hasRendered || !delay ? 0 : delay\n                    );\n                });\n\n                // Set the axis line path\n                if (axisLine) {\n                    axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n                        d: this.getLinePath(axisLine.strokeWidth())\n                    });\n                    axisLine.isPlaced = true;\n\n                    // Show or hide the line depending on options.showEmpty\n                    axisLine[showAxis ? 'show' : 'hide'](true);\n                }\n\n                if (axisTitle && showAxis) {\n                    var titleXy = axis.getTitlePosition();\n                    if (isNumber(titleXy.y)) {\n                        axisTitle[axisTitle.isNew ? 'attr' : 'animate'](titleXy);\n                        axisTitle.isNew = false;\n                    } else {\n                        axisTitle.attr('y', -9999);\n                        axisTitle.isNew = true;\n                    }\n                }\n\n                // Stacked totals:\n                if (stackLabelOptions && stackLabelOptions.enabled) {\n                    axis.renderStackTotals();\n                }\n                // End stacked totals\n\n                axis.isDirty = false;\n            },\n\n            /**\n             * Redraw the axis to reflect changes in the data or axis extremes\n             */\n            redraw: function() {\n\n                if (this.visible) {\n                    // render the axis\n                    this.render();\n\n                    // move plot lines and bands\n                    each(this.plotLinesAndBands, function(plotLine) {\n                        plotLine.render();\n                    });\n                }\n\n                // mark associated series as dirty and ready for redraw\n                each(this.series, function(series) {\n                    series.isDirty = true;\n                });\n\n            },\n\n            // Properties to survive after destroy, needed for Axis.update (#4317,\n            // #5773, #5881).\n            keepProps: ['extKey', 'hcEvents', 'names', 'series', 'userMax', 'userMin'],\n\n            /**\n             * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n             * to fully remove the axis.\n             *\n             * @private\n             * @param  {Boolean} keepEvents\n             *         Whether to preserve events, used internally in Axis.update.\n             */\n            destroy: function(keepEvents) {\n                var axis = this,\n                    stacks = axis.stacks,\n                    plotLinesAndBands = axis.plotLinesAndBands,\n                    plotGroup,\n                    i;\n\n                // Remove the events\n                if (!keepEvents) {\n                    removeEvent(axis);\n                }\n\n                // Destroy each stack total\n                objectEach(stacks, function(stack, stackKey) {\n                    destroyObjectProperties(stack);\n\n                    stacks[stackKey] = null;\n                });\n\n                // Destroy collections\n                each([axis.ticks, axis.minorTicks, axis.alternateBands], function(coll) {\n                    destroyObjectProperties(coll);\n                });\n                if (plotLinesAndBands) {\n                    i = plotLinesAndBands.length;\n                    while (i--) { // #1975\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n\n                // Destroy local variables\n                each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'gridGroup', 'labelGroup', 'cross'], function(prop) {\n                    if (axis[prop]) {\n                        axis[prop] = axis[prop].destroy();\n                    }\n                });\n\n                // Destroy each generated group for plotlines and plotbands\n                for (plotGroup in axis.plotLinesAndBandsGroups) {\n                    axis.plotLinesAndBandsGroups[plotGroup] = axis.plotLinesAndBandsGroups[plotGroup].destroy();\n                }\n\n                // Delete all properties and fall back to the prototype.\n                objectEach(axis, function(val, key) {\n                    if (inArray(key, axis.keepProps) === -1) {\n                        delete axis[key];\n                    }\n                });\n            },\n\n            /**\n             * Internal function to draw a crosshair.\n             *\n             * @param  {PointerEvent} [e]\n             *         The event arguments from the modified pointer event, extended \n             *         with `chartX` and `chartY`\n             * @param  {Point} [point]\n             *         The Point object if the crosshair snaps to points.\n             */\n            drawCrosshair: function(e, point) {\n\n                var path,\n                    options = this.crosshair,\n                    snap = pick(options.snap, true),\n                    pos,\n                    categorized,\n                    graphic = this.cross;\n\n                // Use last available event when updating non-snapped crosshairs without\n                // mouse interaction (#5287)\n                if (!e) {\n                    e = this.cross && this.cross.e;\n                }\n\n                if (\n                    // Disabled in options\n                    !this.crosshair ||\n                    // Snap\n                    ((defined(point) || !snap) === false)\n                ) {\n                    this.hideCrosshair();\n                } else {\n\n                    // Get the path\n                    if (!snap) {\n                        pos = e && (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);\n                    } else if (defined(point)) {\n                        pos = this.isXAxis ? point.plotX : this.len - point.plotY; // #3834\n                    }\n\n                    if (defined(pos)) {\n                        path = this.getPlotLinePath(\n                            // First argument, value, only used on radial\n                            point && (this.isXAxis ? point.x : pick(point.stackY, point.y)),\n                            null,\n                            null,\n                            null,\n                            pos // Translated position\n                        ) || null; // #3189\n                    }\n\n                    if (!defined(path)) {\n                        this.hideCrosshair();\n                        return;\n                    }\n\n                    categorized = this.categories && !this.isRadial;\n\n                    // Draw the cross\n                    if (!graphic) {\n                        this.cross = graphic = this.chart.renderer\n                            .path()\n                            .addClass('highcharts-crosshair highcharts-crosshair-' +\n                                (categorized ? 'category ' : 'thin ') + options.className)\n                            .attr({\n                                zIndex: pick(options.zIndex, 2)\n                            })\n                            .add();\n\n\n\n                    }\n\n                    graphic.show().attr({\n                        d: path\n                    });\n\n                    if (categorized && !options.width) {\n                        graphic.attr({\n                            'stroke-width': this.transA\n                        });\n                    }\n                    this.cross.e = e;\n                }\n            },\n\n            /**\n             *\tHide the crosshair.\n             */\n            hideCrosshair: function() {\n                if (this.cross) {\n                    this.cross.hide();\n                }\n            }\n        }); // end Axis\n\n        H.Axis = Axis;\n        return Axis;\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            Date = H.Date,\n            dateFormat = H.dateFormat,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            getMagnitude = H.getMagnitude,\n            getTZOffset = H.getTZOffset,\n            normalizeTickInterval = H.normalizeTickInterval,\n            pick = H.pick,\n            timeUnits = H.timeUnits;\n        /**\n         * Set the tick positions to a time unit that makes sense, for example\n         * on the first of each month or on every Monday. Return an array\n         * with the time positions. Used in datetime axes as well as for grouping\n         * data on a datetime axis.\n         *\n         * @param {Object} normalizedInterval The interval in axis values (ms) and the count\n         * @param {Number} min The minimum in axis values\n         * @param {Number} max The maximum in axis values\n         * @param {Number} startOfWeek\n         */\n        Axis.prototype.getTimeTicks = function(normalizedInterval, min, max, startOfWeek) {\n            var tickPositions = [],\n                i,\n                higherRanks = {},\n                useUTC = defaultOptions.global.useUTC,\n                minYear, // used in months and years as a basis for Date.UTC()\n                // When crossing DST, use the max. Resolves #6278.\n                minDate = new Date(min - Math.max(getTZOffset(min), getTZOffset(max))),\n                makeTime = Date.hcMakeTime,\n                interval = normalizedInterval.unitRange,\n                count = normalizedInterval.count,\n                variableDayLength;\n\n            if (defined(min)) { // #1300\n                minDate[Date.hcSetMilliseconds](interval >= timeUnits.second ? 0 : // #3935\n                    count * Math.floor(minDate.getMilliseconds() / count)); // #3652, #3654\n\n                if (interval >= timeUnits.second) { // second\n                    minDate[Date.hcSetSeconds](interval >= timeUnits.minute ? 0 : // #3935\n                        count * Math.floor(minDate.getSeconds() / count));\n                }\n\n                if (interval >= timeUnits.minute) { // minute\n                    minDate[Date.hcSetMinutes](interval >= timeUnits.hour ? 0 :\n                        count * Math.floor(minDate[Date.hcGetMinutes]() / count));\n                }\n\n                if (interval >= timeUnits.hour) { // hour\n                    minDate[Date.hcSetHours](interval >= timeUnits.day ? 0 :\n                        count * Math.floor(minDate[Date.hcGetHours]() / count));\n                }\n\n                if (interval >= timeUnits.day) { // day\n                    minDate[Date.hcSetDate](interval >= timeUnits.month ? 1 :\n                        count * Math.floor(minDate[Date.hcGetDate]() / count));\n                }\n\n                if (interval >= timeUnits.month) { // month\n                    minDate[Date.hcSetMonth](interval >= timeUnits.year ? 0 :\n                        count * Math.floor(minDate[Date.hcGetMonth]() / count));\n                    minYear = minDate[Date.hcGetFullYear]();\n                }\n\n                if (interval >= timeUnits.year) { // year\n                    minYear -= minYear % count;\n                    minDate[Date.hcSetFullYear](minYear);\n                }\n\n                // week is a special case that runs outside the hierarchy\n                if (interval === timeUnits.week) {\n                    // get start of current week, independent of count\n                    minDate[Date.hcSetDate](minDate[Date.hcGetDate]() - minDate[Date.hcGetDay]() +\n                        pick(startOfWeek, 1));\n                }\n\n\n                // Get basics for variable time spans\n                minYear = minDate[Date.hcGetFullYear]();\n                var minMonth = minDate[Date.hcGetMonth](),\n                    minDateDate = minDate[Date.hcGetDate](),\n                    minHours = minDate[Date.hcGetHours]();\n\n\n                // Handle local timezone offset\n                if (Date.hcTimezoneOffset || Date.hcGetTimezoneOffset) {\n\n                    // Detect whether we need to take the DST crossover into\n                    // consideration. If we're crossing over DST, the day length may be\n                    // 23h or 25h and we need to compute the exact clock time for each\n                    // tick instead of just adding hours. This comes at a cost, so first\n                    // we found out if it is needed. #4951.\n                    variableDayLength =\n                        (!useUTC || !!Date.hcGetTimezoneOffset) &&\n                        (\n                            // Long range, assume we're crossing over.\n                            max - min > 4 * timeUnits.month ||\n                            // Short range, check if min and max are in different time \n                            // zones.\n                            getTZOffset(min) !== getTZOffset(max)\n                        );\n\n                    // Adjust minDate to the offset date\n                    minDate = minDate.getTime();\n                    minDate = new Date(minDate + getTZOffset(minDate));\n                }\n\n\n                // Iterate and add tick positions at appropriate values\n                var time = minDate.getTime();\n                i = 1;\n                while (time < max) {\n                    tickPositions.push(time);\n\n                    // if the interval is years, use Date.UTC to increase years\n                    if (interval === timeUnits.year) {\n                        time = makeTime(minYear + i * count, 0);\n\n                        // if the interval is months, use Date.UTC to increase months\n                    } else if (interval === timeUnits.month) {\n                        time = makeTime(minYear, minMonth + i * count);\n\n                        // if we're using global time, the interval is not fixed as it jumps\n                        // one hour at the DST crossover\n                    } else if (variableDayLength && (interval === timeUnits.day || interval === timeUnits.week)) {\n                        time = makeTime(minYear, minMonth, minDateDate +\n                            i * count * (interval === timeUnits.day ? 1 : 7));\n\n                    } else if (variableDayLength && interval === timeUnits.hour) {\n                        time = makeTime(minYear, minMonth, minDateDate, minHours + i * count);\n\n                        // else, the interval is fixed and we use simple addition\n                    } else {\n                        time += interval * count;\n                    }\n\n                    i++;\n                }\n\n                // push the last time\n                tickPositions.push(time);\n\n\n                // Handle higher ranks. Mark new days if the time is on midnight\n                // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold to \n                // prevent looping over dense data grouping (#6156).\n                if (interval <= timeUnits.hour && tickPositions.length < 10000) {\n                    each(tickPositions, function(time) {\n                        if (\n                            // Speed optimization, no need to run dateFormat unless\n                            // we're on a full or half hour\n                            time % 1800000 === 0 &&\n                            // Check for local or global midnight\n                            dateFormat('%H%M%S%L', time) === '000000000'\n                        ) {\n                            higherRanks[time] = 'day';\n                        }\n                    });\n                }\n            }\n\n\n            // record information on the chosen unit - for dynamic label formatter\n            tickPositions.info = extend(normalizedInterval, {\n                higherRanks: higherRanks,\n                totalRange: interval * count\n            });\n\n            return tickPositions;\n        };\n\n        /**\n         * Get a normalized tick interval for dates. Returns a configuration object with\n         * unit range (interval), count and name. Used to prepare data for getTimeTicks.\n         * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs\n         * of segments in stock charts, the normalizing logic was extracted in order to\n         * prevent it for running over again for each segment having the same interval.\n         * #662, #697.\n         */\n        Axis.prototype.normalizeTimeTickInterval = function(tickInterval, unitsOption) {\n            var units = unitsOption || [\n                    [\n                        'millisecond', // unit name\n                        [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                    ],\n                    [\n                        'second', [1, 2, 5, 10, 15, 30]\n                    ],\n                    [\n                        'minute', [1, 2, 5, 10, 15, 30]\n                    ],\n                    [\n                        'hour', [1, 2, 3, 4, 6, 8, 12]\n                    ],\n                    [\n                        'day', [1, 2]\n                    ],\n                    [\n                        'week', [1, 2]\n                    ],\n                    [\n                        'month', [1, 2, 3, 4, 6]\n                    ],\n                    [\n                        'year',\n                        null\n                    ]\n                ],\n                unit = units[units.length - 1], // default unit is years\n                interval = timeUnits[unit[0]],\n                multiples = unit[1],\n                count,\n                i;\n\n            // loop through the units to find the one that best fits the tickInterval\n            for (i = 0; i < units.length; i++) {\n                unit = units[i];\n                interval = timeUnits[unit[0]];\n                multiples = unit[1];\n\n\n                if (units[i + 1]) {\n                    // lessThan is in the middle between the highest multiple and the next unit.\n                    var lessThan = (interval * multiples[multiples.length - 1] +\n                        timeUnits[units[i + 1][0]]) / 2;\n\n                    // break and keep the current unit\n                    if (tickInterval <= lessThan) {\n                        break;\n                    }\n                }\n            }\n\n            // prevent 2.5 years intervals, though 25, 250 etc. are allowed\n            if (interval === timeUnits.year && tickInterval < 5 * interval) {\n                multiples = [1, 2, 5];\n            }\n\n            // get the count\n            count = normalizeTickInterval(\n                tickInterval / interval,\n                multiples,\n                unit[0] === 'year' ? Math.max(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360\n            );\n\n            return {\n                unitRange: interval,\n                count: count,\n                unitName: unit[0]\n            };\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            getMagnitude = H.getMagnitude,\n            map = H.map,\n            normalizeTickInterval = H.normalizeTickInterval,\n            pick = H.pick;\n        /**\n         * Methods defined on the Axis prototype\n         */\n\n        /**\n         * Set the tick positions of a logarithmic axis\n         */\n        Axis.prototype.getLogTickPositions = function(interval, min, max, minor) {\n            var axis = this,\n                options = axis.options,\n                axisLength = axis.len,\n                lin2log = axis.lin2log,\n                log2lin = axis.log2lin,\n                // Since we use this method for both major and minor ticks,\n                // use a local variable and return the result\n                positions = [];\n\n            // Reset\n            if (!minor) {\n                axis._minorAutoInterval = null;\n            }\n\n            // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n            if (interval >= 0.5) {\n                interval = Math.round(interval);\n                positions = axis.getLinearTickPositions(interval, min, max);\n\n                // Second case: We need intermediary ticks. For example\n                // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n            } else if (interval >= 0.08) {\n                var roundedMin = Math.floor(min),\n                    intermediate,\n                    i,\n                    j,\n                    len,\n                    pos,\n                    lastPos,\n                    break2;\n\n                if (interval > 0.3) {\n                    intermediate = [1, 2, 4];\n                } else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc\n                    intermediate = [1, 2, 4, 6, 8];\n                } else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n                    intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n                }\n\n                for (i = roundedMin; i < max + 1 && !break2; i++) {\n                    len = intermediate.length;\n                    for (j = 0; j < len && !break2; j++) {\n                        pos = log2lin(lin2log(i) * intermediate[j]);\n                        if (pos > min && (!minor || lastPos <= max) && lastPos !== undefined) { // #1670, lastPos is #3113\n                            positions.push(lastPos);\n                        }\n\n                        if (lastPos > max) {\n                            break2 = true;\n                        }\n                        lastPos = pos;\n                    }\n                }\n\n                // Third case: We are so deep in between whole logarithmic values that\n                // we might as well handle the tick positions like a linear axis. For\n                // example 1.01, 1.02, 1.03, 1.04.\n            } else {\n                var realMin = lin2log(min),\n                    realMax = lin2log(max),\n                    tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],\n                    filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,\n                    tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n                    totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;\n\n                interval = pick(\n                    filteredTickIntervalOption,\n                    axis._minorAutoInterval,\n                    (realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)\n                );\n\n                interval = normalizeTickInterval(\n                    interval,\n                    null,\n                    getMagnitude(interval)\n                );\n\n                positions = map(axis.getLinearTickPositions(\n                    interval,\n                    realMin,\n                    realMax\n                ), log2lin);\n\n                if (!minor) {\n                    axis._minorAutoInterval = interval / 5;\n                }\n            }\n\n            // Set the axis-level tickInterval variable\n            if (!minor) {\n                axis.tickInterval = interval;\n            }\n            return positions;\n        };\n\n        Axis.prototype.log2lin = function(num) {\n            return Math.log(num) / Math.LN10;\n        };\n\n        Axis.prototype.lin2log = function(num) {\n            return Math.pow(10, num);\n        };\n\n    }(Highcharts));\n    (function(H, Axis) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            each = H.each,\n            erase = H.erase,\n            merge = H.merge,\n            pick = H.pick;\n        /*\n         * The object wrapper for plot lines and plot bands\n         * @param {Object} options\n         */\n        H.PlotLineOrBand = function(axis, options) {\n            this.axis = axis;\n\n            if (options) {\n                this.options = options;\n                this.id = options.id;\n            }\n        };\n\n        H.PlotLineOrBand.prototype = {\n\n            /**\n             * Render the plot line or plot band. If it is already existing,\n             * move it.\n             */\n            render: function() {\n                var plotLine = this,\n                    axis = plotLine.axis,\n                    horiz = axis.horiz,\n                    options = plotLine.options,\n                    optionsLabel = options.label,\n                    label = plotLine.label,\n                    to = options.to,\n                    from = options.from,\n                    value = options.value,\n                    isBand = defined(from) && defined(to),\n                    isLine = defined(value),\n                    svgElem = plotLine.svgElem,\n                    isNew = !svgElem,\n                    path = [],\n                    color = options.color,\n                    zIndex = pick(options.zIndex, 0),\n                    events = options.events,\n                    attribs = {\n                        'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') + (options.className || '')\n                    },\n                    groupAttribs = {},\n                    renderer = axis.chart.renderer,\n                    groupName = isBand ? 'bands' : 'lines',\n                    group,\n                    log2lin = axis.log2lin;\n\n                // logarithmic conversion\n                if (axis.isLog) {\n                    from = log2lin(from);\n                    to = log2lin(to);\n                    value = log2lin(value);\n                }\n\n\n\n                // Grouping and zIndex\n                groupAttribs.zIndex = zIndex;\n                groupName += '-' + zIndex;\n\n                group = axis.plotLinesAndBandsGroups[groupName];\n                if (!group) {\n                    axis.plotLinesAndBandsGroups[groupName] = group = renderer.g('plot-' + groupName)\n                        .attr(groupAttribs).add();\n                }\n\n                // Create the path\n                if (isNew) {\n                    plotLine.svgElem = svgElem =\n                        renderer\n                        .path()\n                        .attr(attribs).add(group);\n                }\n\n\n                // Set the path or return\n                if (isLine) {\n                    path = axis.getPlotLinePath(value, svgElem.strokeWidth());\n                } else if (isBand) { // plot band\n                    path = axis.getPlotBandPath(from, to, options);\n                } else {\n                    return;\n                }\n\n\n                // common for lines and bands\n                if (isNew && path && path.length) {\n                    svgElem.attr({\n                        d: path\n                    });\n\n                    // events\n                    if (events) {\n                        H.objectEach(events, function(event, eventType) {\n                            svgElem.on(eventType, function(e) {\n                                events[eventType].apply(plotLine, [e]);\n                            });\n                        });\n                    }\n                } else if (svgElem) {\n                    if (path) {\n                        svgElem.show();\n                        svgElem.animate({\n                            d: path\n                        });\n                    } else {\n                        svgElem.hide();\n                        if (label) {\n                            plotLine.label = label = label.destroy();\n                        }\n                    }\n                }\n\n                // the plot band/line label\n                if (optionsLabel && defined(optionsLabel.text) && path && path.length &&\n                    axis.width > 0 && axis.height > 0 && !path.flat) {\n                    // apply defaults\n                    optionsLabel = merge({\n                        align: horiz && isBand && 'center',\n                        x: horiz ? !isBand && 4 : 10,\n                        verticalAlign: !horiz && isBand && 'middle',\n                        y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n                        rotation: horiz && !isBand && 90\n                    }, optionsLabel);\n\n                    this.renderLabel(optionsLabel, path, isBand, zIndex);\n\n                } else if (label) { // move out of sight\n                    label.hide();\n                }\n\n                // chainable\n                return plotLine;\n            },\n\n            /**\n             * Render and align label for plot line or band.\n             */\n            renderLabel: function(optionsLabel, path, isBand, zIndex) {\n                var plotLine = this,\n                    label = plotLine.label,\n                    renderer = plotLine.axis.chart.renderer,\n                    attribs,\n                    xs,\n                    ys,\n                    x,\n                    y;\n\n                // add the SVG element\n                if (!label) {\n                    attribs = {\n                        align: optionsLabel.textAlign || optionsLabel.align,\n                        rotation: optionsLabel.rotation,\n                        'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') + '-label ' + (optionsLabel.className || '')\n                    };\n\n                    attribs.zIndex = zIndex;\n\n                    plotLine.label = label = renderer.text(\n                            optionsLabel.text,\n                            0,\n                            0,\n                            optionsLabel.useHTML\n                        )\n                        .attr(attribs)\n                        .add();\n\n\n                }\n\n                // get the bounding box and align the label\n                // #3000 changed to better handle choice between plotband or plotline\n                xs = [path[1], path[4], (isBand ? path[6] : path[1])];\n                ys = [path[2], path[5], (isBand ? path[7] : path[2])];\n                x = arrayMin(xs);\n                y = arrayMin(ys);\n\n                label.align(optionsLabel, false, {\n                    x: x,\n                    y: y,\n                    width: arrayMax(xs) - x,\n                    height: arrayMax(ys) - y\n                });\n                label.show();\n            },\n\n            /**\n             * Remove the plot line or band\n             */\n            destroy: function() {\n                // remove it from the lookup\n                erase(this.axis.plotLinesAndBands, this);\n\n                delete this.axis;\n                destroyObjectProperties(this);\n            }\n        };\n\n        /**\n         * Object with members for extending the Axis prototype\n         * @todo Extend directly instead of adding object to Highcharts first\n         */\n\n        H.extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n            /**\n             * Create the path for a plot band\n             */\n            getPlotBandPath: function(from, to) {\n                var toPath = this.getPlotLinePath(to, null, null, true),\n                    path = this.getPlotLinePath(from, null, null, true),\n                    // #4964 check if chart is inverted or plotband is on yAxis \n                    horiz = this.horiz,\n                    plus = 1,\n                    outside =\n                    (from < this.min && to < this.min) ||\n                    (from > this.max && to > this.max);\n\n                if (path && toPath) {\n\n                    // Flat paths don't need labels (#3836)\n                    if (outside) {\n                        path.flat = path.toString() === toPath.toString();\n                        plus = 0;\n                    }\n\n                    // Add 1 pixel, when coordinates are the same\n                    path.push(\n                        horiz && toPath[4] === path[4] ? toPath[4] + plus : toPath[4], !horiz && toPath[5] === path[5] ? toPath[5] + plus : toPath[5],\n                        horiz && toPath[1] === path[1] ? toPath[1] + plus : toPath[1], !horiz && toPath[2] === path[2] ? toPath[2] + plus : toPath[2]\n                    );\n                } else { // outside the axis area\n                    path = null;\n                }\n\n                return path;\n            },\n\n            /**\n             * Add a plot band after render time.\n             *\n             * @param  {AxisPlotBandsOptions} options\n             *         A configuration object for the plot band, as defined in {@link\n             *         https://api.highcharts.com/highcharts/xAxis.plotBands|\n             *         xAxis.plotBands}.\n             * @return {Object}\n             *         The added plot band.\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             */\n            addPlotBand: function(options) {\n                return this.addPlotBandOrLine(options, 'plotBands');\n            },\n\n            /**\n             * Add a plot line after render time.\n             * \n             * @param  {AxisPlotLinesOptions} options\n             *         A configuration object for the plot line, as defined in {@link\n             *         https://api.highcharts.com/highcharts/xAxis.plotLines|\n             *         xAxis.plotLines}.\n             * @return {Object}\n             *         The added plot line.\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             */\n            addPlotLine: function(options) {\n                return this.addPlotBandOrLine(options, 'plotLines');\n            },\n\n            /**\n             * Add a plot band or plot line after render time. Called from addPlotBand\n             * and addPlotLine internally.\n             *\n             * @private\n             * @param  options {AxisPlotLinesOptions|AxisPlotBandsOptions}\n             *         The plotBand or plotLine configuration object.\n             */\n            addPlotBandOrLine: function(options, coll) {\n                var obj = new H.PlotLineOrBand(this, options).render(),\n                    userOptions = this.userOptions;\n\n                if (obj) { // #2189\n                    // Add it to the user options for exporting and Axis.update\n                    if (coll) {\n                        userOptions[coll] = userOptions[coll] || [];\n                        userOptions[coll].push(options);\n                    }\n                    this.plotLinesAndBands.push(obj);\n                }\n\n                return obj;\n            },\n\n            /**\n             * Remove a plot band or plot line from the chart by id. Called internally\n             * from `removePlotBand` and `removePlotLine`.\n             *\n             * @private\n             * @param {String} id\n             */\n            removePlotBandOrLine: function(id) {\n                var plotLinesAndBands = this.plotLinesAndBands,\n                    options = this.options,\n                    userOptions = this.userOptions,\n                    i = plotLinesAndBands.length;\n                while (i--) {\n                    if (plotLinesAndBands[i].id === id) {\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n                each([\n                    options.plotLines || [],\n                    userOptions.plotLines || [],\n                    options.plotBands || [],\n                    userOptions.plotBands || []\n                ], function(arr) {\n                    i = arr.length;\n                    while (i--) {\n                        if (arr[i].id === id) {\n                            erase(arr, arr[i]);\n                        }\n                    }\n                });\n            },\n\n            /**\n             * Remove a plot band by its id.\n             * \n             * @param  {String} id\n             *         The plot band's `id` as given in the original configuration\n             *         object or in the `addPlotBand` option.\n             * @sample highcharts/members/axis-removeplotband/\n             *         Remove plot band by id\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             */\n            removePlotBand: function(id) {\n                this.removePlotBandOrLine(id);\n            },\n\n            /**\n             * Remove a plot line by its id.\n             * @param  {String} id\n             *         The plot line's `id` as given in the original configuration\n             *         object or in the `addPlotLine` option.\n             * @sample highcharts/xaxis/plotlines-id/\n             *         Remove plot line by id\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             */\n            removePlotLine: function(id) {\n                this.removePlotBandOrLine(id);\n            }\n        });\n\n    }(Highcharts, Axis));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var dateFormat = H.dateFormat,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            isNumber = H.isNumber,\n            map = H.map,\n            merge = H.merge,\n            pick = H.pick,\n            splat = H.splat,\n            syncTimeout = H.syncTimeout,\n            timeUnits = H.timeUnits;\n        /**\n         * The tooltip object\n         * @param {Object} chart The chart instance\n         * @param {Object} options Tooltip options\n         */\n        H.Tooltip = function() {\n            this.init.apply(this, arguments);\n        };\n\n        H.Tooltip.prototype = {\n\n            init: function(chart, options) {\n\n                // Save the chart and options\n                this.chart = chart;\n                this.options = options;\n\n                // Keep track of the current series\n                //this.currentSeries = undefined;\n\n                // List of crosshairs\n                this.crosshairs = [];\n\n                // Current values of x and y when animating\n                this.now = {\n                    x: 0,\n                    y: 0\n                };\n\n                // The tooltip is initially hidden\n                this.isHidden = true;\n\n\n\n                // Public property for getting the shared state.\n                this.split = options.split && !chart.inverted;\n                this.shared = options.shared || this.split;\n\n            },\n\n            /**\n             * Destroy the single tooltips in a split tooltip.\n             * If the tooltip is active then it is not destroyed, unless forced to.\n             * @param  {boolean} force Force destroy all tooltips.\n             * @return {undefined}\n             */\n            cleanSplit: function(force) {\n                each(this.chart.series, function(series) {\n                    var tt = series && series.tt;\n                    if (tt) {\n                        if (!tt.isActive || force) {\n                            series.tt = tt.destroy();\n                        } else {\n                            tt.isActive = false;\n                        }\n                    }\n                });\n            },\n\n\n            /**\n             * In styled mode, apply the default filter for the tooltip drop-shadow. It\n             * needs to have an id specific to the chart, otherwise there will be issues\n             * when one tooltip adopts the filter of a different chart, specifically one\n             * where the container is hidden.\n             */\n            applyFilter: function() {\n\n                var chart = this.chart;\n                chart.renderer.definition({\n                    tagName: 'filter',\n                    id: 'drop-shadow-' + chart.index,\n                    opacity: 0.5,\n                    children: [{\n                        tagName: 'feGaussianBlur',\n                        in: 'SourceAlpha',\n                        stdDeviation: 1\n                    }, {\n                        tagName: 'feOffset',\n                        dx: 1,\n                        dy: 1\n                    }, {\n                        tagName: 'feComponentTransfer',\n                        children: [{\n                            tagName: 'feFuncA',\n                            type: 'linear',\n                            slope: 0.3\n                        }]\n                    }, {\n                        tagName: 'feMerge',\n                        children: [{\n                            tagName: 'feMergeNode'\n                        }, {\n                            tagName: 'feMergeNode',\n                            in: 'SourceGraphic'\n                        }]\n                    }]\n                });\n                chart.renderer.definition({\n                    tagName: 'style',\n                    textContent: '.highcharts-tooltip-' + chart.index + '{' +\n                        'filter:url(#drop-shadow-' + chart.index + ')' +\n                        '}'\n                });\n            },\n\n\n\n            /**\n             * Create the Tooltip label element if it doesn't exist, then return the\n             * label.\n             */\n            getLabel: function() {\n\n                var renderer = this.chart.renderer,\n                    options = this.options;\n\n                if (!this.label) {\n                    // Create the label\n                    if (this.split) {\n                        this.label = renderer.g('tooltip');\n                    } else {\n                        this.label = renderer.label(\n                                '',\n                                0,\n                                0,\n                                options.shape || 'callout',\n                                null,\n                                null,\n                                options.useHTML,\n                                null,\n                                'tooltip'\n                            )\n                            .attr({\n                                padding: options.padding,\n                                r: options.borderRadius\n                            });\n\n\n                    }\n\n\n                    // Apply the drop-shadow filter\n                    this.applyFilter();\n                    this.label.addClass('highcharts-tooltip-' + this.chart.index);\n\n\n                    this.label\n                        .attr({\n                            zIndex: 8\n                        })\n                        .add();\n                }\n                return this.label;\n            },\n\n            update: function(options) {\n                this.destroy();\n                // Update user options (#6218)\n                merge(true, this.chart.options.tooltip.userOptions, options);\n                this.init(this.chart, merge(true, this.options, options));\n            },\n\n            /**\n             * Destroy the tooltip and its elements.\n             */\n            destroy: function() {\n                // Destroy and clear local variables\n                if (this.label) {\n                    this.label = this.label.destroy();\n                }\n                if (this.split && this.tt) {\n                    this.cleanSplit(this.chart, true);\n                    this.tt = this.tt.destroy();\n                }\n                clearTimeout(this.hideTimer);\n                clearTimeout(this.tooltipTimeout);\n            },\n\n            /**\n             * Provide a soft movement for the tooltip\n             *\n             * @param {Number} x\n             * @param {Number} y\n             * @private\n             */\n            move: function(x, y, anchorX, anchorY) {\n                var tooltip = this,\n                    now = tooltip.now,\n                    animate = tooltip.options.animation !== false && !tooltip.isHidden &&\n                    // When we get close to the target position, abort animation and land on the right place (#3056)\n                    (Math.abs(x - now.x) > 1 || Math.abs(y - now.y) > 1),\n                    skipAnchor = tooltip.followPointer || tooltip.len > 1;\n\n                // Get intermediate values for animation\n                extend(now, {\n                    x: animate ? (2 * now.x + x) / 3 : x,\n                    y: animate ? (now.y + y) / 2 : y,\n                    anchorX: skipAnchor ? undefined : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n                    anchorY: skipAnchor ? undefined : animate ? (now.anchorY + anchorY) / 2 : anchorY\n                });\n\n                // Move to the intermediate value\n                tooltip.getLabel().attr(now);\n\n\n                // Run on next tick of the mouse tracker\n                if (animate) {\n\n                    // Never allow two timeouts\n                    clearTimeout(this.tooltipTimeout);\n\n                    // Set the fixed interval ticking for the smooth tooltip\n                    this.tooltipTimeout = setTimeout(function() {\n                        // The interval function may still be running during destroy,\n                        // so check that the chart is really there before calling.\n                        if (tooltip) {\n                            tooltip.move(x, y, anchorX, anchorY);\n                        }\n                    }, 32);\n\n                }\n            },\n\n            /**\n             * Hide the tooltip\n             */\n            hide: function(delay) {\n                var tooltip = this;\n                clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)\n                delay = pick(delay, this.options.hideDelay, 500);\n                if (!this.isHidden) {\n                    this.hideTimer = syncTimeout(function() {\n                        tooltip.getLabel()[delay ? 'fadeOut' : 'hide']();\n                        tooltip.isHidden = true;\n                    }, delay);\n                }\n            },\n\n            /**\n             * Extendable method to get the anchor position of the tooltip\n             * from a point or set of points\n             */\n            getAnchor: function(points, mouseEvent) {\n                var ret,\n                    chart = this.chart,\n                    inverted = chart.inverted,\n                    plotTop = chart.plotTop,\n                    plotLeft = chart.plotLeft,\n                    plotX = 0,\n                    plotY = 0,\n                    yAxis,\n                    xAxis;\n\n                points = splat(points);\n\n                // Pie uses a special tooltipPos\n                ret = points[0].tooltipPos;\n\n                // When tooltip follows mouse, relate the position to the mouse\n                if (this.followPointer && mouseEvent) {\n                    if (mouseEvent.chartX === undefined) {\n                        mouseEvent = chart.pointer.normalize(mouseEvent);\n                    }\n                    ret = [\n                        mouseEvent.chartX - chart.plotLeft,\n                        mouseEvent.chartY - plotTop\n                    ];\n                }\n                // When shared, use the average position\n                if (!ret) {\n                    each(points, function(point) {\n                        yAxis = point.series.yAxis;\n                        xAxis = point.series.xAxis;\n                        plotX += point.plotX + (!inverted && xAxis ? xAxis.left - plotLeft : 0);\n                        plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +\n                            (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n                    });\n\n                    plotX /= points.length;\n                    plotY /= points.length;\n\n                    ret = [\n                        inverted ? chart.plotWidth - plotY : plotX,\n                        this.shared && !inverted && points.length > 1 && mouseEvent ?\n                        mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)\n                        inverted ? chart.plotHeight - plotX : plotY\n                    ];\n                }\n\n                return map(ret, Math.round);\n            },\n\n            /**\n             * Place the tooltip in a chart without spilling over\n             * and not covering the point it self.\n             */\n            getPosition: function(boxWidth, boxHeight, point) {\n\n                var chart = this.chart,\n                    distance = this.distance,\n                    ret = {},\n                    h = point.h || 0, // #4117\n                    swapped,\n                    first = ['y', chart.chartHeight, boxHeight,\n                        point.plotY + chart.plotTop, chart.plotTop,\n                        chart.plotTop + chart.plotHeight\n                    ],\n                    second = ['x', chart.chartWidth, boxWidth,\n                        point.plotX + chart.plotLeft, chart.plotLeft,\n                        chart.plotLeft + chart.plotWidth\n                    ],\n                    // The far side is right or bottom\n                    preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984\n                    /**\n                     * Handle the preferred dimension. When the preferred dimension is tooltip\n                     * on top or bottom of the point, it will look for space there.\n                     */\n                    firstDimension = function(dim, outerSize, innerSize, point, min, max) {\n                        var roomLeft = innerSize < point - distance,\n                            roomRight = point + distance + innerSize < outerSize,\n                            alignedLeft = point - distance - innerSize,\n                            alignedRight = point + distance;\n\n                        if (preferFarSide && roomRight) {\n                            ret[dim] = alignedRight;\n                        } else if (!preferFarSide && roomLeft) {\n                            ret[dim] = alignedLeft;\n                        } else if (roomLeft) {\n                            ret[dim] = Math.min(max - innerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n                        } else if (roomRight) {\n                            ret[dim] = Math.max(\n                                min,\n                                alignedRight + h + innerSize > outerSize ?\n                                alignedRight :\n                                alignedRight + h\n                            );\n                        } else {\n                            return false;\n                        }\n                    },\n                    /**\n                     * Handle the secondary dimension. If the preferred dimension is tooltip\n                     * on top or bottom of the point, the second dimension is to align the tooltip\n                     * above the point, trying to align center but allowing left or right\n                     * align within the chart box.\n                     */\n                    secondDimension = function(dim, outerSize, innerSize, point) {\n                        var retVal;\n\n                        // Too close to the edge, return false and swap dimensions\n                        if (point < distance || point > outerSize - distance) {\n                            retVal = false;\n                            // Align left/top\n                        } else if (point < innerSize / 2) {\n                            ret[dim] = 1;\n                            // Align right/bottom\n                        } else if (point > outerSize - innerSize / 2) {\n                            ret[dim] = outerSize - innerSize - 2;\n                            // Align center\n                        } else {\n                            ret[dim] = point - innerSize / 2;\n                        }\n                        return retVal;\n                    },\n                    /**\n                     * Swap the dimensions\n                     */\n                    swap = function(count) {\n                        var temp = first;\n                        first = second;\n                        second = temp;\n                        swapped = count;\n                    },\n                    run = function() {\n                        if (firstDimension.apply(0, first) !== false) {\n                            if (secondDimension.apply(0, second) === false && !swapped) {\n                                swap(true);\n                                run();\n                            }\n                        } else if (!swapped) {\n                            swap(true);\n                            run();\n                        } else {\n                            ret.x = ret.y = 0;\n                        }\n                    };\n\n                // Under these conditions, prefer the tooltip on the side of the point\n                if (chart.inverted || this.len > 1) {\n                    swap();\n                }\n                run();\n\n                return ret;\n\n            },\n\n            /**\n             * In case no user defined formatter is given, this will be used. Note that the context\n             * here is an object holding point, series, x, y etc.\n             *\n             * @returns {String|Array<String>}\n             */\n            defaultFormatter: function(tooltip) {\n                var items = this.points || splat(this),\n                    s;\n\n                // Build the header\n                s = [tooltip.tooltipFooterHeaderFormatter(items[0])];\n\n                // build the values\n                s = s.concat(tooltip.bodyFormatter(items));\n\n                // footer\n                s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));\n\n                return s;\n            },\n\n            /**\n             * Refresh the tooltip's text and position.\n             * @param {Object|Array} pointOrPoints Rither a point or an array of points\n             */\n            refresh: function(pointOrPoints, mouseEvent) {\n                var tooltip = this,\n                    label,\n                    options = tooltip.options,\n                    x,\n                    y,\n                    point = pointOrPoints,\n                    anchor,\n                    textConfig = {},\n                    text,\n                    pointConfig = [],\n                    formatter = options.formatter || tooltip.defaultFormatter,\n                    shared = tooltip.shared,\n                    currentSeries;\n\n                clearTimeout(this.hideTimer);\n\n                // get the reference point coordinates (pie charts use tooltipPos)\n                tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;\n                anchor = tooltip.getAnchor(point, mouseEvent);\n                x = anchor[0];\n                y = anchor[1];\n\n                // shared tooltip, array is sent over\n                if (shared && !(point.series && point.series.noSharedTooltip)) {\n                    each(point, function(item) {\n                        item.setState('hover');\n\n                        pointConfig.push(item.getLabelConfig());\n                    });\n\n                    textConfig = {\n                        x: point[0].category,\n                        y: point[0].y\n                    };\n                    textConfig.points = pointConfig;\n                    point = point[0];\n\n                    // single point tooltip\n                } else {\n                    textConfig = point.getLabelConfig();\n                }\n                this.len = pointConfig.length; // #6128\n                text = formatter.call(textConfig, tooltip);\n\n                // register the current series\n                currentSeries = point.series;\n                this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n\n                // update the inner HTML\n                if (text === false) {\n                    this.hide();\n                } else {\n\n                    label = tooltip.getLabel();\n\n                    // show it\n                    if (tooltip.isHidden) {\n                        label.attr({\n                            opacity: 1\n                        }).show();\n                    }\n\n                    // update text\n                    if (tooltip.split) {\n                        this.renderSplit(text, pointOrPoints);\n                    } else {\n\n                        // Prevent the tooltip from flowing over the chart box (#6659)\n\n                        label.css({\n                            width: this.chart.spacingBox.width\n                        });\n\n\n                        label.attr({\n                            text: text && text.join ? text.join('') : text\n                        });\n\n                        // Set the stroke color of the box to reflect the point\n                        label.removeClass(/highcharts-color-[\\d]+/g)\n                            .addClass('highcharts-color-' + pick(point.colorIndex, currentSeries.colorIndex));\n\n\n\n                        tooltip.updatePosition({\n                            plotX: x,\n                            plotY: y,\n                            negative: point.negative,\n                            ttBelow: point.ttBelow,\n                            h: anchor[2] || 0\n                        });\n                    }\n\n                    this.isHidden = false;\n                }\n            },\n\n            /**\n             * Render the split tooltip. Loops over each point's text and adds\n             * a label next to the point, then uses the distribute function to \n             * find best non-overlapping positions.\n             */\n            renderSplit: function(labels, points) {\n                var tooltip = this,\n                    boxes = [],\n                    chart = this.chart,\n                    ren = chart.renderer,\n                    rightAligned = true,\n                    options = this.options,\n                    headerHeight,\n                    tooltipLabel = this.getLabel();\n\n                // Create the individual labels for header and points, ignore footer\n                each(labels.slice(0, points.length + 1), function(str, i) {\n                    var point = points[i - 1] ||\n                        // Item 0 is the header. Instead of this, we could also use the crosshair label\n                        {\n                            isHeader: true,\n                            plotX: points[0].plotX\n                        },\n                        owner = point.series || tooltip,\n                        tt = owner.tt,\n                        series = point.series || {},\n                        colorClass = 'highcharts-color-' + pick(point.colorIndex, series.colorIndex, 'none'),\n                        target,\n                        x,\n                        bBox,\n                        boxWidth;\n\n                    // Store the tooltip referance on the series\n                    if (!tt) {\n                        owner.tt = tt = ren.label(null, null, null, 'callout')\n                            .addClass('highcharts-tooltip-box ' + colorClass)\n                            .attr({\n                                'padding': options.padding,\n                                'r': options.borderRadius\n\n                            })\n                            .add(tooltipLabel);\n                    }\n\n                    tt.isActive = true;\n                    tt.attr({\n                        text: str\n                    });\n\n\n                    // Get X position now, so we can move all to the other side in case of overflow\n                    bBox = tt.getBBox();\n                    boxWidth = bBox.width + tt.strokeWidth();\n                    if (point.isHeader) {\n                        headerHeight = bBox.height;\n                        x = Math.max(\n                            0, // No left overflow\n                            Math.min(\n                                point.plotX + chart.plotLeft - boxWidth / 2,\n                                chart.chartWidth - boxWidth // No right overflow (#5794)\n                            )\n                        );\n                    } else {\n                        x = point.plotX + chart.plotLeft - pick(options.distance, 16) -\n                            boxWidth;\n                    }\n\n\n                    // If overflow left, we don't use this x in the next loop\n                    if (x < 0) {\n                        rightAligned = false;\n                    }\n\n                    // Prepare for distribution\n                    target = (point.series && point.series.yAxis && point.series.yAxis.pos) + (point.plotY || 0);\n                    target -= chart.plotTop;\n                    boxes.push({\n                        target: point.isHeader ? chart.plotHeight + headerHeight : target,\n                        rank: point.isHeader ? 1 : 0,\n                        size: owner.tt.getBBox().height + 1,\n                        point: point,\n                        x: x,\n                        tt: tt\n                    });\n                });\n\n                // Clean previous run (for missing points)\n                this.cleanSplit();\n\n                // Distribute and put in place\n                H.distribute(boxes, chart.plotHeight + headerHeight);\n                each(boxes, function(box) {\n                    var point = box.point,\n                        series = point.series;\n\n                    // Put the label in place\n                    box.tt.attr({\n                        visibility: box.pos === undefined ? 'hidden' : 'inherit',\n                        x: (rightAligned || point.isHeader ?\n                            box.x :\n                            point.plotX + chart.plotLeft + pick(options.distance, 16)),\n                        y: box.pos + chart.plotTop,\n                        anchorX: point.isHeader ?\n                            point.plotX + chart.plotLeft : point.plotX + series.xAxis.pos,\n                        anchorY: point.isHeader ?\n                            box.pos + chart.plotTop - 15 : point.plotY + series.yAxis.pos\n                    });\n                });\n            },\n\n            /**\n             * Find the new position and perform the move\n             */\n            updatePosition: function(point) {\n                var chart = this.chart,\n                    label = this.getLabel(),\n                    pos = (this.options.positioner || this.getPosition).call(\n                        this,\n                        label.width,\n                        label.height,\n                        point\n                    );\n\n                // do the move\n                this.move(\n                    Math.round(pos.x),\n                    Math.round(pos.y || 0), // can be undefined (#3977) \n                    point.plotX + chart.plotLeft,\n                    point.plotY + chart.plotTop\n                );\n            },\n\n            /**\n             * Get the optimal date format for a point, based on a range.\n             * @param  {number} range - The time range\n             * @param  {number|Date} date - The date of the point in question\n             * @param  {number} startOfWeek - An integer representing the first day of\n             * the week, where 0 is Sunday\n             * @param  {Object} dateTimeLabelFormats - A map of time units to formats\n             * @return {string} - the optimal date format for a point\n             */\n            getDateFormat: function(range, date, startOfWeek, dateTimeLabelFormats) {\n                var dateStr = dateFormat('%m-%d %H:%M:%S.%L', date),\n                    format,\n                    n,\n                    blank = '01-01 00:00:00.000',\n                    strpos = {\n                        millisecond: 15,\n                        second: 12,\n                        minute: 9,\n                        hour: 6,\n                        day: 3\n                    },\n                    lastN = 'millisecond'; // for sub-millisecond data, #4223\n                for (n in timeUnits) {\n\n                    // If the range is exactly one week and we're looking at a Sunday/Monday, go for the week format\n                    if (range === timeUnits.week && +dateFormat('%w', date) === startOfWeek &&\n                        dateStr.substr(6) === blank.substr(6)) {\n                        n = 'week';\n                        break;\n                    }\n\n                    // The first format that is too great for the range\n                    if (timeUnits[n] > range) {\n                        n = lastN;\n                        break;\n                    }\n\n                    // If the point is placed every day at 23:59, we need to show\n                    // the minutes as well. #2637.\n                    if (strpos[n] && dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n                        break;\n                    }\n\n                    // Weeks are outside the hierarchy, only apply them on Mondays/Sundays like in the first condition\n                    if (n !== 'week') {\n                        lastN = n;\n                    }\n                }\n\n                if (n) {\n                    format = dateTimeLabelFormats[n];\n                }\n\n                return format;\n            },\n\n            /**\n             * Get the best X date format based on the closest point range on the axis.\n             */\n            getXDateFormat: function(point, options, xAxis) {\n                var xDateFormat,\n                    dateTimeLabelFormats = options.dateTimeLabelFormats,\n                    closestPointRange = xAxis && xAxis.closestPointRange;\n\n                if (closestPointRange) {\n                    xDateFormat = this.getDateFormat(\n                        closestPointRange,\n                        point.x,\n                        xAxis.options.startOfWeek,\n                        dateTimeLabelFormats\n                    );\n                } else {\n                    xDateFormat = dateTimeLabelFormats.day;\n                }\n\n                return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581\n            },\n\n            /**\n             * Format the footer/header of the tooltip\n             * #3397: abstraction to enable formatting of footer and header\n             */\n            tooltipFooterHeaderFormatter: function(labelConfig, isFooter) {\n                var footOrHead = isFooter ? 'footer' : 'header',\n                    series = labelConfig.series,\n                    tooltipOptions = series.tooltipOptions,\n                    xDateFormat = tooltipOptions.xDateFormat,\n                    xAxis = series.xAxis,\n                    isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(labelConfig.key),\n                    formatString = tooltipOptions[footOrHead + 'Format'];\n\n                // Guess the best date format based on the closest point distance (#568, #3418)\n                if (isDateTime && !xDateFormat) {\n                    xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n                }\n\n                // Insert the footer date format if any\n                if (isDateTime && xDateFormat) {\n                    formatString = formatString.replace('{point.key}', '{point.key:' + xDateFormat + '}');\n                }\n\n                return format(formatString, {\n                    point: labelConfig,\n                    series: series\n                });\n            },\n\n            /**\n             * Build the body (lines) of the tooltip by iterating over the items and returning one entry for each item,\n             * abstracting this functionality allows to easily overwrite and extend it.\n             */\n            bodyFormatter: function(items) {\n                return map(items, function(item) {\n                    var tooltipOptions = item.series.tooltipOptions;\n                    return (tooltipOptions.pointFormatter || item.point.tooltipFormatter)\n                        .call(item.point, tooltipOptions.pointFormat);\n                });\n            }\n\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            attr = H.attr,\n            charts = H.charts,\n            color = H.color,\n            css = H.css,\n            defined = H.defined,\n            doc = H.doc,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            offset = H.offset,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            Tooltip = H.Tooltip,\n            win = H.win;\n\n        /**\n         * The mouse tracker object. All methods starting with \"on\" are primary DOM\n         * event handlers. Subsequent methods should be named differently from what they\n         * are doing.\n         *\n         * @constructor Pointer\n         * @param {Object} chart The Chart instance\n         * @param {Object} options The root options object\n         */\n        H.Pointer = function(chart, options) {\n            this.init(chart, options);\n        };\n\n        H.Pointer.prototype = {\n            /**\n             * Initialize Pointer\n             */\n            init: function(chart, options) {\n\n                // Store references\n                this.options = options;\n                this.chart = chart;\n\n                // Do we need to handle click on a touch device?\n                this.runChartClick = options.chart.events && !!options.chart.events.click;\n\n                this.pinchDown = [];\n                this.lastValidTouch = {};\n\n                if (Tooltip && options.tooltip.enabled) {\n                    chart.tooltip = new Tooltip(chart, options.tooltip);\n                    this.followTouchMove = pick(options.tooltip.followTouchMove, true);\n                }\n\n                this.setDOMEvents();\n            },\n\n            /**\n             * Resolve the zoomType option, this is reset on all touch start and mouse\n             * down events.\n             */\n            zoomOption: function(e) {\n                var chart = this.chart,\n                    options = chart.options.chart,\n                    zoomType = options.zoomType || '',\n                    inverted = chart.inverted,\n                    zoomX,\n                    zoomY;\n\n                // Look for the pinchType option\n                if (/touch/.test(e.type)) {\n                    zoomType = pick(options.pinchType, zoomType);\n                }\n\n                this.zoomX = zoomX = /x/.test(zoomType);\n                this.zoomY = zoomY = /y/.test(zoomType);\n                this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n                this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n                this.hasZoom = zoomX || zoomY;\n            },\n\n            /**\n             * @typedef  {Object} PointerEvent\n             *           A native browser mouse or touch event, extended with position\n             *           information relative to the {@link Chart.container}.\n             * @property {Number} chartX\n             *           The X coordinate of the pointer interaction relative to the\n             *           chart.\n             * @property {Number} chartY\n             *           The Y coordinate of the pointer interaction relative to the \n             *           chart.\n             * \n             */\n            /**\n             * Add crossbrowser support for chartX and chartY.\n             * \n             * @param  {Object} e\n             *         The event object in standard browsers.\n             *\n             * @return {PointerEvent}\n             *         A browser event with extended properties `chartX` and `chartY`\n             */\n            normalize: function(e, chartPosition) {\n                var chartX,\n                    chartY,\n                    ePos;\n\n                // IE normalizing\n                e = e || win.event;\n                if (!e.target) {\n                    e.target = e.srcElement;\n                }\n\n                // iOS (#2757)\n                ePos = e.touches ? (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;\n\n                // Get mouse position\n                if (!chartPosition) {\n                    this.chartPosition = chartPosition = offset(this.chart.container);\n                }\n\n                // chartX and chartY\n                if (ePos.pageX === undefined) { // IE < 9. #886.\n                    chartX = Math.max(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is \n                    // for IE10 quirks mode within framesets\n                    chartY = e.y;\n                } else {\n                    chartX = ePos.pageX - chartPosition.left;\n                    chartY = ePos.pageY - chartPosition.top;\n                }\n\n                return extend(e, {\n                    chartX: Math.round(chartX),\n                    chartY: Math.round(chartY)\n                });\n            },\n\n            /**\n             * Get the click position in terms of axis values.\n             *\n             * @param {Object} e A pointer event\n             */\n            getCoordinates: function(e) {\n                var coordinates = {\n                    xAxis: [],\n                    yAxis: []\n                };\n\n                each(this.chart.axes, function(axis) {\n                    coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n                        axis: axis,\n                        value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n                    });\n                });\n                return coordinates;\n            },\n            /**\n             * Collects the points closest to a mouseEvent\n             * @param  {Array} series Array of series to gather points from\n             * @param  {Boolean} shared True if shared tooltip, otherwise false\n             * @param  {Object} e Mouse event which possess a position to compare against\n             * @return {Array} KDPoints sorted by distance\n             */\n            getKDPoints: function(series, shared, e) {\n                var kdpoints = [],\n                    noSharedTooltip,\n                    directTouch,\n                    kdpointT,\n                    i;\n\n                // Find nearest points on all series\n                each(series, function(s) {\n                    // Skip hidden series\n                    noSharedTooltip = s.noSharedTooltip && shared;\n                    directTouch = !shared && s.directTouch;\n                    if (s.visible && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821\n                        // #3828\n                        kdpointT = s.searchPoint(\n                            e, !noSharedTooltip && s.options.findNearestPointBy.indexOf('y') < 0\n                        );\n                        if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)\n                            kdpoints.push(kdpointT);\n                        }\n                    }\n                });\n\n                // Sort kdpoints by distance to mouse pointer\n                kdpoints.sort(function(p1, p2) {\n                    var isCloserX = p1.distX - p2.distX,\n                        isCloser = p1.dist - p2.dist,\n                        isAbove =\n                        (p2.series.group && p2.series.group.zIndex) -\n                        (p1.series.group && p1.series.group.zIndex),\n                        result;\n\n                    // We have two points which are not in the same place on xAxis and shared tooltip:\n                    if (isCloserX !== 0 && shared) { // #5721\n                        result = isCloserX;\n                        // Points are not exactly in the same place on x/yAxis:\n                    } else if (isCloser !== 0) {\n                        result = isCloser;\n                        // The same xAxis and yAxis position, sort by z-index:\n                    } else if (isAbove !== 0) {\n                        result = isAbove;\n                        // The same zIndex, sort by array index:\n                    } else {\n                        result = p1.series.index > p2.series.index ? -1 : 1;\n                    }\n                    return result;\n                });\n\n                // Remove points with different x-positions, required for shared tooltip and crosshairs (#4645):\n                if (shared && kdpoints[0] && !kdpoints[0].series.noSharedTooltip) {\n                    i = kdpoints.length;\n                    while (i--) {\n                        if (kdpoints[i].x !== kdpoints[0].x || kdpoints[i].series.noSharedTooltip) {\n                            kdpoints.splice(i, 1);\n                        }\n                    }\n                }\n                return kdpoints;\n            },\n            getPointFromEvent: function(e) {\n                var target = e.target,\n                    point;\n\n                while (target && !point) {\n                    point = target.point;\n                    target = target.parentNode;\n                }\n                return point;\n            },\n\n            getChartCoordinatesFromPoint: function(point, inverted) {\n                var series = point.series,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n\n                if (xAxis && yAxis) {\n                    return inverted ? {\n                        chartX: xAxis.len + xAxis.pos - point.clientX,\n                        chartY: yAxis.len + yAxis.pos - point.plotY\n                    } : {\n                        chartX: point.clientX + xAxis.pos,\n                        chartY: point.plotY + yAxis.pos\n                    };\n                }\n            },\n\n            /**\n             * Calculates what is the current hovered point/points and series.\n             *\n             * @private\n             *\n             * @param  {undefined|Point} existingHoverPoint\n             *         The point currrently beeing hovered.\n             * @param  {undefined|Series} existingHoverSeries\n             *         The series currently beeing hovered.\n             * @param  {Array<.Series>} series\n             *         All the series in the chart.\n             * @param  {boolean} isDirectTouch\n             *         Is the pointer directly hovering the point.\n             * @param  {boolean} shared\n             *         Whether it is a shared tooltip or not.\n             * @param  {object} coordinates\n             *         Chart coordinates of the pointer.\n             * @param  {number} coordinates.chartX\n             * @param  {number} coordinates.chartY\n             * \n             * @return {object}\n             *         Object containing resulting hover data.\n             */\n            getHoverData: function(\n                existingHoverPoint,\n                existingHoverSeries,\n                series,\n                isDirectTouch,\n                shared,\n                coordinates\n            ) {\n                var hoverPoint = existingHoverPoint,\n                    hoverSeries = existingHoverSeries,\n                    searchSeries = shared ? series : [hoverSeries],\n                    useExisting = !!(isDirectTouch && existingHoverPoint),\n                    notSticky = hoverSeries && !hoverSeries.stickyTracking,\n                    isHoverPoint = function(point, i) {\n                        return i === 0;\n                    },\n                    hoverPoints;\n\n                // If there is a hoverPoint and its series requires direct touch (like\n                // columns, #3899), or we're on a noSharedTooltip series among shared\n                // tooltip series (#4546), use the existing hoverPoint.\n                if (useExisting) {\n                    isHoverPoint = function(p) {\n                        return p === existingHoverPoint;\n                    };\n                } else if (notSticky) {\n                    isHoverPoint = function(p) {\n                        return p.series === hoverSeries;\n                    };\n                } else {\n                    // Avoid series with stickyTracking false\n                    searchSeries = H.grep(series, function(s) {\n                        return s.stickyTracking;\n                    });\n                }\n                hoverPoints = (useExisting && !shared) ?\n                    // Non-shared tooltips with directTouch don't use the k-d-tree\n                    [existingHoverPoint] :\n                    this.getKDPoints(searchSeries, shared, coordinates);\n                hoverPoint = H.find(hoverPoints, isHoverPoint);\n                hoverSeries = hoverPoint && hoverPoint.series;\n\n                // In this case we could only look for the hoverPoint in series with\n                // stickyTracking, but we should still include all series in the shared\n                // tooltip.\n                if (!useExisting && !notSticky && shared) {\n                    hoverPoints = this.getKDPoints(series, shared, coordinates);\n                }\n                // Keep the order of series in tooltip\n                // Must be done after assigning of hoverPoint\n                hoverPoints.sort(function(p1, p2) {\n                    return p1.series.index - p2.series.index;\n                });\n\n                return {\n                    hoverPoint: hoverPoint,\n                    hoverSeries: hoverSeries,\n                    hoverPoints: hoverPoints\n                };\n            },\n            /**\n             * With line type charts with a single tracker, get the point closest to the mouse.\n             * Run Point.onMouseOver and display tooltip for the point or points.\n             */\n            runPointActions: function(e, p) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    series = chart.series,\n                    tooltip = chart.tooltip,\n                    shared = tooltip ? tooltip.shared : false,\n                    hoverPoint = p || chart.hoverPoint,\n                    hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries,\n                    // onMouseOver or already hovering a series with directTouch\n                    isDirectTouch = !!p || (\n                        (hoverSeries && hoverSeries.directTouch) &&\n                        pointer.isDirectTouch\n                    ),\n                    hoverData = this.getHoverData(\n                        hoverPoint,\n                        hoverSeries,\n                        series,\n                        isDirectTouch,\n                        shared,\n                        e\n                    ),\n                    useSharedTooltip,\n                    followPointer,\n                    anchor,\n                    points;\n                // Update variables from hoverData.\n                hoverPoint = hoverData.hoverPoint;\n                hoverSeries = hoverData.hoverSeries;\n                followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;\n                useSharedTooltip = (\n                    shared &&\n                    hoverPoint &&\n                    !hoverPoint.series.noSharedTooltip\n                );\n                points = (useSharedTooltip ?\n                    hoverData.hoverPoints :\n                    (hoverPoint ? [hoverPoint] : [])\n                );\n                // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n                // #3926, #4200\n                if (\n                    hoverPoint &&\n                    // !(hoverSeries && hoverSeries.directTouch) &&\n                    (hoverPoint !== chart.hoverPoint || (tooltip && tooltip.isHidden))\n                ) {\n                    each(chart.hoverPoints || [], function(p) {\n                        if (H.inArray(p, points) === -1) {\n                            p.setState();\n                        }\n                    });\n                    // Do mouseover on all points (#3919, #3985, #4410, #5622)\n                    each(points || [], function(p) {\n                        p.setState('hover');\n                    });\n                    // set normal state to previous series\n                    if (chart.hoverSeries !== hoverSeries) {\n                        hoverSeries.onMouseOver();\n                    }\n\n                    // If tracking is on series in stead of on each point, \n                    // fire mouseOver on hover point. // #4448\n                    if (chart.hoverPoint) {\n                        chart.hoverPoint.firePointEvent('mouseOut');\n                    }\n                    hoverPoint.firePointEvent('mouseOver');\n                    chart.hoverPoints = points;\n                    chart.hoverPoint = hoverPoint;\n                    // Draw tooltip if necessary\n                    if (tooltip) {\n                        tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n                    }\n                    // Update positions (regardless of kdpoint or hoverPoint)\n                } else if (followPointer && tooltip && !tooltip.isHidden) {\n                    anchor = tooltip.getAnchor([{}], e);\n                    tooltip.updatePosition({\n                        plotX: anchor[0],\n                        plotY: anchor[1]\n                    });\n                }\n\n                // Start the event listener to pick up the tooltip and crosshairs\n                if (!pointer.unDocMouseMove) {\n                    pointer.unDocMouseMove = addEvent(doc, 'mousemove', function(e) {\n                        var chart = charts[H.hoverChartIndex];\n                        if (chart) {\n                            chart.pointer.onDocumentMouseMove(e);\n                        }\n                    });\n                }\n\n                // Issues related to crosshair #4927, #5269 #5066, #5658\n                each(chart.axes, function drawAxisCrosshair(axis) {\n                    var snap = pick(axis.crosshair.snap, true);\n                    if (!snap) {\n                        axis.drawCrosshair(e);\n\n                        // Axis has snapping crosshairs, and one of the hover points belongs\n                        // to axis\n                    } else if (H.find(points, function(p) {\n                            return p.series[axis.coll] === axis;\n                        })) {\n                        axis.drawCrosshair(e, hoverPoint);\n                        // Axis has snapping crosshairs, but no hover point belongs to axis\n                    } else {\n                        axis.hideCrosshair();\n                    }\n                });\n            },\n\n            /**\n             * Reset the tracking by hiding the tooltip, the hover series state and the\n             * hover point\n             *\n             * @param allowMove {Boolean}\n             *        Instead of destroying the tooltip altogether, allow moving it if\n             *        possible\n             */\n            reset: function(allowMove, delay) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    hoverSeries = chart.hoverSeries,\n                    hoverPoint = chart.hoverPoint,\n                    hoverPoints = chart.hoverPoints,\n                    tooltip = chart.tooltip,\n                    tooltipPoints = tooltip && tooltip.shared ? hoverPoints : hoverPoint;\n\n                // Check if the points have moved outside the plot area (#1003, #4736, #5101)\n                if (allowMove && tooltipPoints) {\n                    each(splat(tooltipPoints), function(point) {\n                        if (point.series.isCartesian && point.plotX === undefined) {\n                            allowMove = false;\n                        }\n                    });\n                }\n\n                // Just move the tooltip, #349\n                if (allowMove) {\n                    if (tooltip && tooltipPoints) {\n                        tooltip.refresh(tooltipPoints);\n                        if (hoverPoint) { // #2500\n                            hoverPoint.setState(hoverPoint.state, true);\n                            each(chart.axes, function(axis) {\n                                if (axis.crosshair) {\n                                    axis.drawCrosshair(null, hoverPoint);\n                                }\n                            });\n                        }\n                    }\n\n                    // Full reset\n                } else {\n\n                    if (hoverPoint) {\n                        hoverPoint.onMouseOut();\n                    }\n\n                    if (hoverPoints) {\n                        each(hoverPoints, function(point) {\n                            point.setState();\n                        });\n                    }\n\n                    if (hoverSeries) {\n                        hoverSeries.onMouseOut();\n                    }\n\n                    if (tooltip) {\n                        tooltip.hide(delay);\n                    }\n\n                    if (pointer.unDocMouseMove) {\n                        pointer.unDocMouseMove = pointer.unDocMouseMove();\n                    }\n\n                    // Remove crosshairs\n                    each(chart.axes, function(axis) {\n                        axis.hideCrosshair();\n                    });\n\n                    pointer.hoverX = chart.hoverPoints = chart.hoverPoint = null;\n                }\n            },\n\n            /**\n             * Scale series groups to a certain scale and translation\n             */\n            scaleGroups: function(attribs, clip) {\n\n                var chart = this.chart,\n                    seriesAttribs;\n\n                // Scale each series\n                each(chart.series, function(series) {\n                    seriesAttribs = attribs || series.getPlotBox(); // #1701\n                    if (series.xAxis && series.xAxis.zoomEnabled && series.group) {\n                        series.group.attr(seriesAttribs);\n                        if (series.markerGroup) {\n                            series.markerGroup.attr(seriesAttribs);\n                            series.markerGroup.clip(clip ? chart.clipRect : null);\n                        }\n                        if (series.dataLabelsGroup) {\n                            series.dataLabelsGroup.attr(seriesAttribs);\n                        }\n                    }\n                });\n\n                // Clip\n                chart.clipRect.attr(clip || chart.clipBox);\n            },\n\n            /**\n             * Start a drag operation\n             */\n            dragStart: function(e) {\n                var chart = this.chart;\n\n                // Record the start position\n                chart.mouseIsDown = e.type;\n                chart.cancelClick = false;\n                chart.mouseDownX = this.mouseDownX = e.chartX;\n                chart.mouseDownY = this.mouseDownY = e.chartY;\n            },\n\n            /**\n             * Perform a drag operation in response to a mousemove event while the mouse is down\n             */\n            drag: function(e) {\n\n                var chart = this.chart,\n                    chartOptions = chart.options.chart,\n                    chartX = e.chartX,\n                    chartY = e.chartY,\n                    zoomHor = this.zoomHor,\n                    zoomVert = this.zoomVert,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    clickedInside,\n                    size,\n                    selectionMarker = this.selectionMarker,\n                    mouseDownX = this.mouseDownX,\n                    mouseDownY = this.mouseDownY,\n                    panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];\n\n                // If the device supports both touch and mouse (like IE11), and we are touch-dragging\n                // inside the plot area, don't handle the mouse event. #4339.\n                if (selectionMarker && selectionMarker.touch) {\n                    return;\n                }\n\n                // If the mouse is outside the plot area, adjust to cooordinates\n                // inside to prevent the selection marker from going outside\n                if (chartX < plotLeft) {\n                    chartX = plotLeft;\n                } else if (chartX > plotLeft + plotWidth) {\n                    chartX = plotLeft + plotWidth;\n                }\n\n                if (chartY < plotTop) {\n                    chartY = plotTop;\n                } else if (chartY > plotTop + plotHeight) {\n                    chartY = plotTop + plotHeight;\n                }\n\n                // determine if the mouse has moved more than 10px\n                this.hasDragged = Math.sqrt(\n                    Math.pow(mouseDownX - chartX, 2) +\n                    Math.pow(mouseDownY - chartY, 2)\n                );\n\n                if (this.hasDragged > 10) {\n                    clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n\n                    // make a selection\n                    if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {\n                        if (!selectionMarker) {\n                            this.selectionMarker = selectionMarker = chart.renderer.rect(\n                                    plotLeft,\n                                    plotTop,\n                                    zoomHor ? 1 : plotWidth,\n                                    zoomVert ? 1 : plotHeight,\n                                    0\n                                )\n                                .attr({\n\n                                    'class': 'highcharts-selection-marker',\n                                    'zIndex': 7\n                                })\n                                .add();\n                        }\n                    }\n\n                    // adjust the width of the selection marker\n                    if (selectionMarker && zoomHor) {\n                        size = chartX - mouseDownX;\n                        selectionMarker.attr({\n                            width: Math.abs(size),\n                            x: (size > 0 ? 0 : size) + mouseDownX\n                        });\n                    }\n                    // adjust the height of the selection marker\n                    if (selectionMarker && zoomVert) {\n                        size = chartY - mouseDownY;\n                        selectionMarker.attr({\n                            height: Math.abs(size),\n                            y: (size > 0 ? 0 : size) + mouseDownY\n                        });\n                    }\n\n                    // panning\n                    if (clickedInside && !selectionMarker && chartOptions.panning) {\n                        chart.pan(e, chartOptions.panning);\n                    }\n                }\n            },\n\n            /**\n             * On mouse up or touch end across the entire document, drop the selection.\n             */\n            drop: function(e) {\n                var pointer = this,\n                    chart = this.chart,\n                    hasPinched = this.hasPinched;\n\n                if (this.selectionMarker) {\n                    var selectionData = {\n                            originalEvent: e, // #4890\n                            xAxis: [],\n                            yAxis: []\n                        },\n                        selectionBox = this.selectionMarker,\n                        selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,\n                        selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,\n                        selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,\n                        selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,\n                        runZoom;\n\n                    // a selection has been made\n                    if (this.hasDragged || hasPinched) {\n\n                        // record each axis' min and max\n                        each(chart.axes, function(axis) {\n                            if (axis.zoomEnabled && defined(axis.min) && (hasPinched || pointer[{\n                                    xAxis: 'zoomX',\n                                    yAxis: 'zoomY'\n                                }[axis.coll]])) { // #859, #3569\n                                var horiz = axis.horiz,\n                                    minPixelPadding = e.type === 'touchend' ? axis.minPixelPadding : 0, // #1207, #3075\n                                    selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) + minPixelPadding),\n                                    selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight) - minPixelPadding);\n\n                                selectionData[axis.coll].push({\n                                    axis: axis,\n                                    min: Math.min(selectionMin, selectionMax), // for reversed axes\n                                    max: Math.max(selectionMin, selectionMax)\n                                });\n                                runZoom = true;\n                            }\n                        });\n                        if (runZoom) {\n                            fireEvent(chart, 'selection', selectionData, function(args) {\n                                chart.zoom(extend(args, hasPinched ? {\n                                    animation: false\n                                } : null));\n                            });\n                        }\n\n                    }\n                    this.selectionMarker = this.selectionMarker.destroy();\n\n                    // Reset scaling preview\n                    if (hasPinched) {\n                        this.scaleGroups();\n                    }\n                }\n\n                // Reset all\n                if (chart) { // it may be destroyed on mouse up - #877\n                    css(chart.container, {\n                        cursor: chart._cursor\n                    });\n                    chart.cancelClick = this.hasDragged > 10; // #370\n                    chart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n                    this.pinchDown = [];\n                }\n            },\n\n            onContainerMouseDown: function(e) {\n\n                e = this.normalize(e);\n\n                this.zoomOption(e);\n\n                // issue #295, dragging not always working in Firefox\n                if (e.preventDefault) {\n                    e.preventDefault();\n                }\n\n                this.dragStart(e);\n            },\n\n\n\n            onDocumentMouseUp: function(e) {\n                if (charts[H.hoverChartIndex]) {\n                    charts[H.hoverChartIndex].pointer.drop(e);\n                }\n            },\n\n            /**\n             * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.\n             * Issue #149 workaround. The mouseleave event does not always fire.\n             */\n            onDocumentMouseMove: function(e) {\n                var chart = this.chart,\n                    chartPosition = this.chartPosition;\n\n                e = this.normalize(e, chartPosition);\n\n                // If we're outside, hide the tooltip\n                if (chartPosition && !this.inClass(e.target, 'highcharts-tracker') &&\n                    !chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n                    this.reset();\n                }\n            },\n\n            /**\n             * When mouse leaves the container, hide the tooltip.\n             */\n            onContainerMouseLeave: function(e) {\n                var chart = charts[H.hoverChartIndex];\n                if (chart && (e.relatedTarget || e.toElement)) { // #4886, MS Touch end fires mouseleave but with no related target\n                    chart.pointer.reset();\n                    chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix\n                }\n            },\n\n            // The mousemove, touchmove and touchstart event handler\n            onContainerMouseMove: function(e) {\n\n                var chart = this.chart;\n\n                if (!defined(H.hoverChartIndex) || !charts[H.hoverChartIndex] || !charts[H.hoverChartIndex].mouseIsDown) {\n                    H.hoverChartIndex = chart.index;\n                }\n\n                e = this.normalize(e);\n                e.returnValue = false; // #2251, #3224\n\n                if (chart.mouseIsDown === 'mousedown') {\n                    this.drag(e);\n                }\n\n                // Show the tooltip and run mouse over events (#977)\n                if ((this.inClass(e.target, 'highcharts-tracker') ||\n                        chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {\n                    this.runPointActions(e);\n                }\n            },\n\n            /**\n             * Utility to detect whether an element has, or has a parent with, a specific\n             * class name. Used on detection of tracker objects and on deciding whether\n             * hovering the tooltip should cause the active series to mouse out.\n             */\n            inClass: function(element, className) {\n                var elemClassName;\n                while (element) {\n                    elemClassName = attr(element, 'class');\n                    if (elemClassName) {\n                        if (elemClassName.indexOf(className) !== -1) {\n                            return true;\n                        }\n                        if (elemClassName.indexOf('highcharts-container') !== -1) {\n                            return false;\n                        }\n                    }\n                    element = element.parentNode;\n                }\n            },\n\n            onTrackerMouseOut: function(e) {\n                var series = this.chart.hoverSeries,\n                    relatedTarget = e.relatedTarget || e.toElement;\n                this.isDirectTouch = false;\n                if (series && relatedTarget && !series.stickyTracking &&\n                    !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n                    (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465\n                        !this.inClass(relatedTarget, 'highcharts-tracker') // #5553\n                    )\n                ) {\n                    series.onMouseOut();\n                }\n            },\n\n            onContainerClick: function(e) {\n                var chart = this.chart,\n                    hoverPoint = chart.hoverPoint,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop;\n\n                e = this.normalize(e);\n\n                if (!chart.cancelClick) {\n\n                    // On tracker click, fire the series and point events. #783, #1583\n                    if (hoverPoint && this.inClass(e.target, 'highcharts-tracker')) {\n\n                        // the series click event\n                        fireEvent(hoverPoint.series, 'click', extend(e, {\n                            point: hoverPoint\n                        }));\n\n                        // the point click event\n                        if (chart.hoverPoint) { // it may be destroyed (#1844)\n                            hoverPoint.firePointEvent('click', e);\n                        }\n\n                        // When clicking outside a tracker, fire a chart event\n                    } else {\n                        extend(e, this.getCoordinates(e));\n\n                        // fire a click event in the chart\n                        if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {\n                            fireEvent(chart, 'click', e);\n                        }\n                    }\n\n\n                }\n            },\n\n            /**\n             * Set the JS DOM events on the container and document. This method should contain\n             * a one-to-one assignment between methods and their handlers. Any advanced logic should\n             * be moved to the handler reflecting the event's name.\n             */\n            setDOMEvents: function() {\n\n                var pointer = this,\n                    container = pointer.chart.container;\n\n                container.onmousedown = function(e) {\n                    pointer.onContainerMouseDown(e);\n                };\n                container.onmousemove = function(e) {\n                    pointer.onContainerMouseMove(e);\n                };\n                container.onclick = function(e) {\n                    pointer.onContainerClick(e);\n                };\n                addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);\n                if (H.chartCount === 1) {\n                    addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n                }\n                if (H.hasTouch) {\n                    container.ontouchstart = function(e) {\n                        pointer.onContainerTouchStart(e);\n                    };\n                    container.ontouchmove = function(e) {\n                        pointer.onContainerTouchMove(e);\n                    };\n                    if (H.chartCount === 1) {\n                        addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n                    }\n                }\n\n            },\n\n            /**\n             * Destroys the Pointer object and disconnects DOM events.\n             */\n            destroy: function() {\n                var pointer = this;\n\n                if (pointer.unDocMouseMove) {\n                    pointer.unDocMouseMove();\n                }\n\n                removeEvent(\n                    pointer.chart.container,\n                    'mouseleave',\n                    pointer.onContainerMouseLeave\n                );\n                if (!H.chartCount) {\n                    removeEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n                    removeEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n                }\n\n                // memory and CPU leak\n                clearInterval(pointer.tooltipTimeout);\n\n                H.objectEach(pointer, function(val, prop) {\n                    pointer[prop] = null;\n                });\n            }\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var charts = H.charts,\n            each = H.each,\n            extend = H.extend,\n            map = H.map,\n            noop = H.noop,\n            pick = H.pick,\n            Pointer = H.Pointer;\n\n        /* Support for touch devices */\n        extend(Pointer.prototype, /** @lends Pointer.prototype */ {\n\n            /**\n             * Run translation operations\n             */\n            pinchTranslate: function(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n                if (this.zoomHor) {\n                    this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n                if (this.zoomVert) {\n                    this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n            },\n\n            /**\n             * Run translation operations for each direction (horizontal and vertical) independently\n             */\n            pinchTranslateDirection: function(horiz, pinchDown, touches, transform,\n                selectionMarker, clip, lastValidTouch, forcedScale) {\n                var chart = this.chart,\n                    xy = horiz ? 'x' : 'y',\n                    XY = horiz ? 'X' : 'Y',\n                    sChartXY = 'chart' + XY,\n                    wh = horiz ? 'width' : 'height',\n                    plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],\n                    selectionWH,\n                    selectionXY,\n                    clipXY,\n                    scale = forcedScale || 1,\n                    inverted = chart.inverted,\n                    bounds = chart.bounds[horiz ? 'h' : 'v'],\n                    singleTouch = pinchDown.length === 1,\n                    touch0Start = pinchDown[0][sChartXY],\n                    touch0Now = touches[0][sChartXY],\n                    touch1Start = !singleTouch && pinchDown[1][sChartXY],\n                    touch1Now = !singleTouch && touches[1][sChartXY],\n                    outOfBounds,\n                    transformScale,\n                    scaleKey,\n                    setScale = function() {\n                        // Don't zoom if fingers are too close on this axis\n                        if (!singleTouch && Math.abs(touch0Start - touch1Start) > 20) {\n                            scale = forcedScale || Math.abs(touch0Now - touch1Now) / Math.abs(touch0Start - touch1Start);\n                        }\n\n                        clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n                        selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n                    };\n\n                // Set the scale, first pass\n                setScale();\n\n                selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not\n\n                // Out of bounds\n                if (selectionXY < bounds.min) {\n                    selectionXY = bounds.min;\n                    outOfBounds = true;\n                } else if (selectionXY + selectionWH > bounds.max) {\n                    selectionXY = bounds.max - selectionWH;\n                    outOfBounds = true;\n                }\n\n                // Is the chart dragged off its bounds, determined by dataMin and dataMax?\n                if (outOfBounds) {\n\n                    // Modify the touchNow position in order to create an elastic drag movement. This indicates\n                    // to the user that the chart is responsive but can't be dragged further.\n                    touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n                    if (!singleTouch) {\n                        touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n                    }\n\n                    // Set the scale, second pass to adapt to the modified touchNow positions\n                    setScale();\n\n                } else {\n                    lastValidTouch[xy] = [touch0Now, touch1Now];\n                }\n\n                // Set geometry for clipping, selection and transformation\n                if (!inverted) {\n                    clip[xy] = clipXY - plotLeftTop;\n                    clip[wh] = selectionWH;\n                }\n                scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n                transformScale = inverted ? 1 / scale : scale;\n\n                selectionMarker[wh] = selectionWH;\n                selectionMarker[xy] = selectionXY;\n                transform[scaleKey] = scale;\n                transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));\n            },\n\n            /**\n             * Handle touch events with two touches\n             */\n            pinch: function(e) {\n\n                var self = this,\n                    chart = self.chart,\n                    pinchDown = self.pinchDown,\n                    touches = e.touches,\n                    touchesLength = touches.length,\n                    lastValidTouch = self.lastValidTouch,\n                    hasZoom = self.hasZoom,\n                    selectionMarker = self.selectionMarker,\n                    transform = {},\n                    fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, 'highcharts-tracker') &&\n                        chart.runTrackerClick) || self.runChartClick),\n                    clip = {};\n\n                // Don't initiate panning until the user has pinched. This prevents us from\n                // blocking page scrolling as users scroll down a long page (#4210).\n                if (touchesLength > 1) {\n                    self.initiated = true;\n                }\n\n                // On touch devices, only proceed to trigger click if a handler is defined\n                if (hasZoom && self.initiated && !fireClickEvent) {\n                    e.preventDefault();\n                }\n\n                // Normalize each touch\n                map(touches, function(e) {\n                    return self.normalize(e);\n                });\n\n                // Register the touch start position\n                if (e.type === 'touchstart') {\n                    each(touches, function(e, i) {\n                        pinchDown[i] = {\n                            chartX: e.chartX,\n                            chartY: e.chartY\n                        };\n                    });\n                    lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];\n                    lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];\n\n                    // Identify the data bounds in pixels\n                    each(chart.axes, function(axis) {\n                        if (axis.zoomEnabled) {\n                            var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n                                minPixelPadding = axis.minPixelPadding,\n                                min = axis.toPixels(pick(axis.options.min, axis.dataMin)),\n                                max = axis.toPixels(pick(axis.options.max, axis.dataMax)),\n                                absMin = Math.min(min, max),\n                                absMax = Math.max(min, max);\n\n                            // Store the bounds for use in the touchmove handler\n                            bounds.min = Math.min(axis.pos, absMin - minPixelPadding);\n                            bounds.max = Math.max(axis.pos + axis.len, absMax + minPixelPadding);\n                        }\n                    });\n                    self.res = true; // reset on next move\n\n                    // Optionally move the tooltip on touchmove\n                } else if (self.followTouchMove && touchesLength === 1) {\n                    this.runPointActions(self.normalize(e));\n\n                    // Event type is touchmove, handle panning and pinching\n                } else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first\n\n\n                    // Set the marker\n                    if (!selectionMarker) {\n                        self.selectionMarker = selectionMarker = extend({\n                            destroy: noop,\n                            touch: true\n                        }, chart.plotBox);\n                    }\n\n                    self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n\n                    self.hasPinched = hasZoom;\n\n                    // Scale and translate the groups to provide visual feedback during pinching\n                    self.scaleGroups(transform, clip);\n\n                    if (self.res) {\n                        self.res = false;\n                        this.reset(false, 0);\n                    }\n                }\n            },\n\n            /**\n             * General touch handler shared by touchstart and touchmove.\n             */\n            touch: function(e, start) {\n                var chart = this.chart,\n                    hasMoved,\n                    pinchDown,\n                    isInside;\n\n                if (chart.index !== H.hoverChartIndex) {\n                    this.onContainerMouseLeave({\n                        relatedTarget: true\n                    });\n                }\n                H.hoverChartIndex = chart.index;\n\n                if (e.touches.length === 1) {\n\n                    e = this.normalize(e);\n\n                    isInside = chart.isInsidePlot(\n                        e.chartX - chart.plotLeft,\n                        e.chartY - chart.plotTop\n                    );\n                    if (isInside && !chart.openMenu) {\n\n                        // Run mouse events and display tooltip etc\n                        if (start) {\n                            this.runPointActions(e);\n                        }\n\n                        // Android fires touchmove events after the touchstart even if the\n                        // finger hasn't moved, or moved only a pixel or two. In iOS however,\n                        // the touchmove doesn't fire unless the finger moves more than ~4px.\n                        // So we emulate this behaviour in Android by checking how much it\n                        // moved, and cancelling on small distances. #3450.\n                        if (e.type === 'touchmove') {\n                            pinchDown = this.pinchDown;\n                            hasMoved = pinchDown[0] ? Math.sqrt( // #5266\n                                Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n                                Math.pow(pinchDown[0].chartY - e.chartY, 2)\n                            ) >= 4 : false;\n                        }\n\n                        if (pick(hasMoved, true)) {\n                            this.pinch(e);\n                        }\n\n                    } else if (start) {\n                        // Hide the tooltip on touching outside the plot area (#1203)\n                        this.reset();\n                    }\n\n                } else if (e.touches.length === 2) {\n                    this.pinch(e);\n                }\n            },\n\n            onContainerTouchStart: function(e) {\n                this.zoomOption(e);\n                this.touch(e, true);\n            },\n\n            onContainerTouchMove: function(e) {\n                this.touch(e);\n            },\n\n            onDocumentTouchEnd: function(e) {\n                if (charts[H.hoverChartIndex]) {\n                    charts[H.hoverChartIndex].pointer.drop(e);\n                }\n            }\n\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            charts = H.charts,\n            css = H.css,\n            doc = H.doc,\n            extend = H.extend,\n            hasTouch = H.hasTouch,\n            noop = H.noop,\n            Pointer = H.Pointer,\n            removeEvent = H.removeEvent,\n            win = H.win,\n            wrap = H.wrap;\n\n        if (!hasTouch && (win.PointerEvent || win.MSPointerEvent)) {\n\n            // The touches object keeps track of the points being touched at all times\n            var touches = {},\n                hasPointerEvent = !!win.PointerEvent,\n                getWebkitTouches = function() {\n                    var fake = [];\n                    fake.item = function(i) {\n                        return this[i];\n                    };\n                    H.objectEach(touches, function(touch) {\n                        fake.push({\n                            pageX: touch.pageX,\n                            pageY: touch.pageY,\n                            target: touch.target\n                        });\n                    });\n                    return fake;\n                },\n                translateMSPointer = function(e, method, wktype, func) {\n                    var p;\n                    if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[H.hoverChartIndex]) {\n                        func(e);\n                        p = charts[H.hoverChartIndex].pointer;\n                        p[method]({\n                            type: wktype,\n                            target: e.currentTarget,\n                            preventDefault: noop,\n                            touches: getWebkitTouches()\n                        });\n                    }\n                };\n\n            /**\n             * Extend the Pointer prototype with methods for each event handler and more\n             */\n            extend(Pointer.prototype, /** @lends Pointer.prototype */ {\n                onContainerPointerDown: function(e) {\n                    translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function(e) {\n                        touches[e.pointerId] = {\n                            pageX: e.pageX,\n                            pageY: e.pageY,\n                            target: e.currentTarget\n                        };\n                    });\n                },\n                onContainerPointerMove: function(e) {\n                    translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function(e) {\n                        touches[e.pointerId] = {\n                            pageX: e.pageX,\n                            pageY: e.pageY\n                        };\n                        if (!touches[e.pointerId].target) {\n                            touches[e.pointerId].target = e.currentTarget;\n                        }\n                    });\n                },\n                onDocumentPointerUp: function(e) {\n                    translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function(e) {\n                        delete touches[e.pointerId];\n                    });\n                },\n\n                /**\n                 * Add or remove the MS Pointer specific events\n                 */\n                batchMSEvents: function(fn) {\n                    fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);\n                    fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);\n                    fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);\n                }\n            });\n\n            // Disable default IE actions for pinch and such on chart element\n            wrap(Pointer.prototype, 'init', function(proceed, chart, options) {\n                proceed.call(this, chart, options);\n                if (this.hasZoom) { // #4014\n                    css(chart.container, {\n                        '-ms-touch-action': 'none',\n                        'touch-action': 'none'\n                    });\n                }\n            });\n\n            // Add IE specific touch events to chart\n            wrap(Pointer.prototype, 'setDOMEvents', function(proceed) {\n                proceed.apply(this);\n                if (this.hasZoom || this.followTouchMove) {\n                    this.batchMSEvents(addEvent);\n                }\n            });\n            // Destroy MS events also\n            wrap(Pointer.prototype, 'destroy', function(proceed) {\n                this.batchMSEvents(removeEvent);\n                proceed.call(this);\n            });\n        }\n\n    }(Highcharts));\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var H = Highcharts,\n\n            addEvent = H.addEvent,\n            css = H.css,\n            discardElement = H.discardElement,\n            defined = H.defined,\n            each = H.each,\n            isFirefox = H.isFirefox,\n            marginNames = H.marginNames,\n            merge = H.merge,\n            pick = H.pick,\n            setAnimation = H.setAnimation,\n            stableSort = H.stableSort,\n            win = H.win,\n            wrap = H.wrap;\n\n        /**\n         * The overview of the chart's series. The legend object is instanciated\n         * internally in the chart constructor, and available from `chart.legend`. Each\n         * chart has only one legend.\n         * \n         * @class\n         */\n        Highcharts.Legend = function(chart, options) {\n            this.init(chart, options);\n        };\n\n        Highcharts.Legend.prototype = {\n\n            /**\n             * Initialize the legend\n             */\n            init: function(chart, options) {\n\n                this.chart = chart;\n\n                this.setOptions(options);\n\n                if (options.enabled) {\n\n                    // Render it\n                    this.render();\n\n                    // move checkboxes\n                    addEvent(this.chart, 'endResize', function() {\n                        this.legend.positionCheckboxes();\n                    });\n                }\n            },\n\n            setOptions: function(options) {\n\n                var padding = pick(options.padding, 8);\n\n                this.options = options;\n\n\n                this.itemMarginTop = options.itemMarginTop || 0;\n                this.padding = padding;\n                this.initialItemY = padding - 5; // 5 is pixels above the text\n                this.maxItemWidth = 0;\n                this.itemHeight = 0;\n                this.symbolWidth = pick(options.symbolWidth, 16);\n                this.pages = [];\n\n            },\n\n            /**\n             * Update the legend with new options. Equivalent to running `chart.update`\n             * with a legend configuration option.\n             * @param  {LegendOptions} options\n             *         Legend options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart.\n             *\n             * @sample highcharts/legend/legend-update/\n             *         Legend update\n             */\n            update: function(options, redraw) {\n                var chart = this.chart;\n\n                this.setOptions(merge(true, this.options, options));\n                this.destroy();\n                chart.isDirtyLegend = chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Set the colors for the legend item\n             * @param {Object} item A Series or Point instance\n             * @param {Object} visible Dimmed or colored\n             */\n            colorizeItem: function(item, visible) {\n                item.legendGroup[visible ? 'removeClass' : 'addClass'](\n                    'highcharts-legend-item-hidden'\n                );\n\n\n            },\n\n            /**\n             * Position the legend item\n             * @param {Object} item A Series or Point instance\n             */\n            positionItem: function(item) {\n                var legend = this,\n                    options = legend.options,\n                    symbolPadding = options.symbolPadding,\n                    ltr = !options.rtl,\n                    legendItemPos = item._legendItemPos,\n                    itemX = legendItemPos[0],\n                    itemY = legendItemPos[1],\n                    checkbox = item.checkbox,\n                    legendGroup = item.legendGroup;\n\n                if (legendGroup && legendGroup.element) {\n                    legendGroup.translate(\n                        ltr ?\n                        itemX :\n                        legend.legendWidth - itemX - 2 * symbolPadding - 4,\n                        itemY\n                    );\n                }\n\n                if (checkbox) {\n                    checkbox.x = itemX;\n                    checkbox.y = itemY;\n                }\n            },\n\n            /**\n             * Destroy a single legend item\n             * @param {Object} item The series or point\n             */\n            destroyItem: function(item) {\n                var checkbox = item.checkbox;\n\n                // destroy SVG elements\n                each(\n                    ['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'],\n                    function(key) {\n                        if (item[key]) {\n                            item[key] = item[key].destroy();\n                        }\n                    }\n                );\n\n                if (checkbox) {\n                    discardElement(item.checkbox);\n                }\n            },\n\n            /**\n             * Destroys the legend.\n             */\n            destroy: function() {\n                function destroyItems(key) {\n                    if (this[key]) {\n                        this[key] = this[key].destroy();\n                    }\n                }\n\n                // Destroy items\n                each(this.getAllItems(), function(item) {\n                    each(['legendItem', 'legendGroup'], destroyItems, item);\n                });\n\n                // Destroy legend elements\n                each([\n                    'clipRect',\n                    'up',\n                    'down',\n                    'pager',\n                    'nav',\n                    'box',\n                    'title',\n                    'group'\n                ], destroyItems, this);\n                this.display = null; // Reset in .render on update.\n            },\n\n            /**\n             * Position the checkboxes after the width is determined\n             */\n            positionCheckboxes: function(scrollOffset) {\n                var alignAttr = this.group && this.group.alignAttr,\n                    translateY,\n                    clipHeight = this.clipHeight || this.legendHeight,\n                    titleHeight = this.titleHeight;\n\n                if (alignAttr) {\n                    translateY = alignAttr.translateY;\n                    each(this.allItems, function(item) {\n                        var checkbox = item.checkbox,\n                            top;\n\n                        if (checkbox) {\n                            top = translateY + titleHeight + checkbox.y +\n                                (scrollOffset || 0) + 3;\n                            css(checkbox, {\n                                left: (alignAttr.translateX + item.checkboxOffset +\n                                    checkbox.x - 20) + 'px',\n                                top: top + 'px',\n                                display: top > translateY - 6 && top < translateY +\n                                    clipHeight - 6 ? '' : 'none'\n                            });\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Render the legend title on top of the legend\n             */\n            renderTitle: function() {\n                var options = this.options,\n                    padding = this.padding,\n                    titleOptions = options.title,\n                    titleHeight = 0,\n                    bBox;\n\n                if (titleOptions.text) {\n                    if (!this.title) {\n                        this.title = this.chart.renderer.label(\n                                titleOptions.text,\n                                padding - 3,\n                                padding - 4,\n                                null,\n                                null,\n                                null,\n                                options.useHTML,\n                                null,\n                                'legend-title'\n                            )\n                            .attr({\n                                zIndex: 1\n                            })\n\n                            .add(this.group);\n                    }\n                    bBox = this.title.getBBox();\n                    titleHeight = bBox.height;\n                    this.offsetWidth = bBox.width; // #1717\n                    this.contentGroup.attr({\n                        translateY: titleHeight\n                    });\n                }\n                this.titleHeight = titleHeight;\n            },\n\n            /**\n             * Set the legend item text\n             */\n            setText: function(item) {\n                var options = this.options;\n                item.legendItem.attr({\n                    text: options.labelFormat ?\n                        H.format(options.labelFormat, item) : options.labelFormatter.call(item)\n                });\n            },\n\n            /**\n             * Render a single specific legend item\n             * @param {Object} item A series or point\n             */\n            renderItem: function(item) {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    options = legend.options,\n                    horizontal = options.layout === 'horizontal',\n                    symbolWidth = legend.symbolWidth,\n                    symbolPadding = options.symbolPadding,\n\n                    padding = legend.padding,\n                    itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n                    ltr = !options.rtl,\n                    itemHeight,\n                    widthOption = options.width,\n                    itemMarginBottom = options.itemMarginBottom || 0,\n                    itemMarginTop = legend.itemMarginTop,\n                    bBox,\n                    itemWidth,\n                    li = item.legendItem,\n                    isSeries = !item.series,\n                    series = !isSeries && item.series.drawLegendSymbol ?\n                    item.series :\n                    item,\n                    seriesOptions = series.options,\n                    showCheckbox = legend.createCheckboxForItem &&\n                    seriesOptions &&\n                    seriesOptions.showCheckbox,\n                    // full width minus text width\n                    itemExtraWidth = symbolWidth + symbolPadding + itemDistance +\n                    (showCheckbox ? 20 : 0),\n                    useHTML = options.useHTML,\n                    fontSize = 12,\n                    itemClassName = item.options.className;\n\n                if (!li) { // generate it once, later move it\n\n                    // Generate the group box, a group to hold the symbol and text. Text\n                    // is to be appended in Legend class.\n                    item.legendGroup = renderer.g('legend-item')\n                        .addClass(\n                            'highcharts-' + series.type + '-series ' +\n                            'highcharts-color-' + item.colorIndex +\n                            (itemClassName ? ' ' + itemClassName : '') +\n                            (isSeries ? ' highcharts-series-' + item.index : '')\n                        )\n                        .attr({\n                            zIndex: 1\n                        })\n                        .add(legend.scrollGroup);\n\n                    // Generate the list item text and add it to the group\n                    item.legendItem = li = renderer.text(\n                            '',\n                            ltr ? symbolWidth + symbolPadding : -symbolPadding,\n                            legend.baseline || 0,\n                            useHTML\n                        )\n\n                        .attr({\n                            align: ltr ? 'left' : 'right',\n                            zIndex: 2\n                        })\n                        .add(item.legendGroup);\n\n                    // Get the baseline for the first item - the font size is equal for\n                    // all\n                    if (!legend.baseline) {\n\n                        legend.fontMetrics = renderer.fontMetrics(\n                            fontSize,\n                            li\n                        );\n                        legend.baseline = legend.fontMetrics.f + 3 + itemMarginTop;\n                        li.attr('y', legend.baseline);\n                    }\n\n                    // Draw the legend symbol inside the group box\n                    legend.symbolHeight = options.symbolHeight || legend.fontMetrics.f;\n                    series.drawLegendSymbol(legend, item);\n\n                    if (legend.setItemEvents) {\n                        legend.setItemEvents(item, li, useHTML);\n                    }\n\n                    // add the HTML checkbox on top\n                    if (showCheckbox) {\n                        legend.createCheckboxForItem(item);\n                    }\n                }\n\n                // Colorize the items\n                legend.colorizeItem(item, item.visible);\n\n                // Take care of max width and text overflow (#6659)\n\n                li.css({\n                    width: (options.itemWidth || chart.spacingBox.width) -\n                        itemExtraWidth\n                });\n\n\n                // Always update the text\n                legend.setText(item);\n\n                // calculate the positions for the next line\n                bBox = li.getBBox();\n\n                itemWidth = item.checkboxOffset =\n                    options.itemWidth ||\n                    item.legendItemWidth ||\n                    bBox.width + itemExtraWidth;\n                legend.itemHeight = itemHeight = Math.round(\n                    item.legendItemHeight || bBox.height || legend.symbolHeight\n                );\n\n                // If the item exceeds the width, start a new line\n                if (\n                    horizontal &&\n                    legend.itemX - padding + itemWidth > (\n                        widthOption || (\n                            chart.spacingBox.width - 2 * padding - options.x\n                        )\n                    )\n                ) {\n                    legend.itemX = padding;\n                    legend.itemY += itemMarginTop + legend.lastLineHeight +\n                        itemMarginBottom;\n                    legend.lastLineHeight = 0; // reset for next line (#915, #3976)\n                }\n\n                // If the item exceeds the height, start a new column\n                /*if (!horizontal && legend.itemY + options.y +\n                \t\titemHeight > chart.chartHeight - spacingTop - spacingBottom) {\n                \tlegend.itemY = legend.initialItemY;\n                \tlegend.itemX += legend.maxItemWidth;\n                \tlegend.maxItemWidth = 0;\n                }*/\n\n                // Set the edge positions\n                legend.maxItemWidth = Math.max(legend.maxItemWidth, itemWidth);\n                legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;\n                legend.lastLineHeight = Math.max( // #915\n                    itemHeight,\n                    legend.lastLineHeight\n                );\n\n                // cache the position of the newly generated or reordered items\n                item._legendItemPos = [legend.itemX, legend.itemY];\n\n                // advance\n                if (horizontal) {\n                    legend.itemX += itemWidth;\n\n                } else {\n                    legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;\n                    legend.lastLineHeight = itemHeight;\n                }\n\n                // the width of the widest item\n                legend.offsetWidth = widthOption || Math.max(\n                    (horizontal ? legend.itemX - padding - itemDistance : itemWidth) +\n                    padding,\n                    legend.offsetWidth\n                );\n            },\n\n            /**\n             * Get all items, which is one item per series for normal series and one\n             * item per point for pie series.\n             */\n            getAllItems: function() {\n                var allItems = [];\n                each(this.chart.series, function(series) {\n                    var seriesOptions = series && series.options;\n\n                    // Handle showInLegend. If the series is linked to another series,\n                    // defaults to false.\n                    if (series && pick(\n                            seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? undefined : false, true\n                        )) {\n\n                        // Use points or series for the legend item depending on\n                        // legendType\n                        allItems = allItems.concat(\n                            series.legendItems ||\n                            (\n                                seriesOptions.legendType === 'point' ?\n                                series.data :\n                                series\n                            )\n                        );\n                    }\n                });\n                return allItems;\n            },\n\n            /**\n             * Adjust the chart margins by reserving space for the legend on only one\n             * side of the chart. If the position is set to a corner, top or bottom is\n             * reserved for horizontal legends and left or right for vertical ones.\n             */\n            adjustMargins: function(margin, spacing) {\n                var chart = this.chart,\n                    options = this.options,\n                    // Use the first letter of each alignment option in order to detect\n                    // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n                    alignment = options.align.charAt(0) +\n                    options.verticalAlign.charAt(0) +\n                    options.layout.charAt(0);\n\n                if (!options.floating) {\n\n                    each([\n                        /(lth|ct|rth)/,\n                        /(rtv|rm|rbv)/,\n                        /(rbh|cb|lbh)/,\n                        /(lbv|lm|ltv)/\n                    ], function(alignments, side) {\n                        if (alignments.test(alignment) && !defined(margin[side])) {\n                            // Now we have detected on which side of the chart we should\n                            // reserve space for the legend\n                            chart[marginNames[side]] = Math.max(\n                                chart[marginNames[side]],\n                                (\n                                    chart.legend[\n                                        (side + 1) % 2 ? 'legendHeight' : 'legendWidth'\n                                    ] + [1, -1, -1, 1][side] * options[\n                                        (side % 2) ? 'x' : 'y'\n                                    ] +\n                                    pick(options.margin, 12) +\n                                    spacing[side]\n                                )\n                            );\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Render the legend. This method can be called both before and after\n             * chart.render. If called after, it will only rearrange items instead\n             * of creating new ones.\n             */\n            render: function() {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    legendGroup = legend.group,\n                    allItems,\n                    display,\n                    legendWidth,\n                    legendHeight,\n                    box = legend.box,\n                    options = legend.options,\n                    padding = legend.padding;\n\n                legend.itemX = padding;\n                legend.itemY = legend.initialItemY;\n                legend.offsetWidth = 0;\n                legend.lastItemY = 0;\n\n                if (!legendGroup) {\n                    legend.group = legendGroup = renderer.g('legend')\n                        .attr({\n                            zIndex: 7\n                        })\n                        .add();\n                    legend.contentGroup = renderer.g()\n                        .attr({\n                            zIndex: 1\n                        }) // above background\n                        .add(legendGroup);\n                    legend.scrollGroup = renderer.g()\n                        .add(legend.contentGroup);\n                }\n\n                legend.renderTitle();\n\n                // add each series or point\n                allItems = legend.getAllItems();\n\n                // sort by legendIndex\n                stableSort(allItems, function(a, b) {\n                    return ((a.options && a.options.legendIndex) || 0) -\n                        ((b.options && b.options.legendIndex) || 0);\n                });\n\n                // reversed legend\n                if (options.reversed) {\n                    allItems.reverse();\n                }\n\n                legend.allItems = allItems;\n                legend.display = display = !!allItems.length;\n\n                // render the items\n                legend.lastLineHeight = 0;\n                each(allItems, function(item) {\n                    legend.renderItem(item);\n                });\n\n                // Get the box\n                legendWidth = (options.width || legend.offsetWidth) + padding;\n                legendHeight = legend.lastItemY + legend.lastLineHeight +\n                    legend.titleHeight;\n                legendHeight = legend.handleOverflow(legendHeight);\n                legendHeight += padding;\n\n                // Draw the border and/or background\n                if (!box) {\n                    legend.box = box = renderer.rect()\n                        .addClass('highcharts-legend-box')\n                        .attr({\n                            r: options.borderRadius\n                        })\n                        .add(legendGroup);\n                    box.isNew = true;\n                }\n\n\n\n                if (legendWidth > 0 && legendHeight > 0) {\n                    box[box.isNew ? 'attr' : 'animate'](\n                        box.crisp({\n                            x: 0,\n                            y: 0,\n                            width: legendWidth,\n                            height: legendHeight\n                        }, box.strokeWidth())\n                    );\n                    box.isNew = false;\n                }\n\n                // hide the border if no items\n                box[display ? 'show' : 'hide']();\n\n\n                // Open for responsiveness\n                if (legendGroup.getStyle('display') === 'none') {\n                    legendWidth = legendHeight = 0;\n                }\n\n\n                legend.legendWidth = legendWidth;\n                legend.legendHeight = legendHeight;\n\n                // Now that the legend width and height are established, put the items\n                // in the final position\n                each(allItems, function(item) {\n                    legend.positionItem(item);\n                });\n\n                // 1.x compatibility: positioning based on style\n                /*var props = ['left', 'right', 'top', 'bottom'],\n                \tprop,\n                \ti = 4;\n                while (i--) {\n                \tprop = props[i];\n                \tif (options.style[prop] && options.style[prop] !== 'auto') {\n                \t\toptions[i < 2 ? 'align' : 'verticalAlign'] = prop;\n                \t\toptions[i < 2 ? 'x' : 'y'] = \n                \t\t\tpInt(options.style[prop]) * (i % 2 ? -1 : 1);\n                \t}\n                }*/\n\n                if (display) {\n                    legendGroup.align(merge(options, {\n                        width: legendWidth,\n                        height: legendHeight\n                    }), true, 'spacingBox');\n                }\n\n                if (!chart.isResizing) {\n                    this.positionCheckboxes();\n                }\n            },\n\n            /**\n             * Set up the overflow handling by adding navigation with up and down arrows\n             * below the legend.\n             */\n            handleOverflow: function(legendHeight) {\n                var legend = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    options = this.options,\n                    optionsY = options.y,\n                    alignTop = options.verticalAlign === 'top',\n                    padding = this.padding,\n                    spaceHeight = chart.spacingBox.height +\n                    (alignTop ? -optionsY : optionsY) - padding,\n                    maxHeight = options.maxHeight,\n                    clipHeight,\n                    clipRect = this.clipRect,\n                    navOptions = options.navigation,\n                    animation = pick(navOptions.animation, true),\n                    arrowSize = navOptions.arrowSize || 12,\n                    nav = this.nav,\n                    pages = this.pages,\n                    lastY,\n                    allItems = this.allItems,\n                    clipToHeight = function(height) {\n                        if (typeof height === 'number') {\n                            clipRect.attr({\n                                height: height\n                            });\n                        } else if (clipRect) { // Reset (#5912)\n                            legend.clipRect = clipRect.destroy();\n                            legend.contentGroup.clip();\n                        }\n\n                        // useHTML\n                        if (legend.contentGroup.div) {\n                            legend.contentGroup.div.style.clip = height ?\n                                'rect(' + padding + 'px,9999px,' +\n                                (padding + height) + 'px,0)' :\n                                'auto';\n                        }\n                    };\n\n\n                // Adjust the height\n                if (\n                    options.layout === 'horizontal' &&\n                    options.verticalAlign !== 'middle' &&\n                    !options.floating\n                ) {\n                    spaceHeight /= 2;\n                }\n                if (maxHeight) {\n                    spaceHeight = Math.min(spaceHeight, maxHeight);\n                }\n\n                // Reset the legend height and adjust the clipping rectangle\n                pages.length = 0;\n                if (legendHeight > spaceHeight && navOptions.enabled !== false) {\n\n                    this.clipHeight = clipHeight =\n                        Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n                    this.currentPage = pick(this.currentPage, 1);\n                    this.fullHeight = legendHeight;\n\n                    // Fill pages with Y positions so that the top of each a legend item\n                    // defines the scroll top for each page (#2098)\n                    each(allItems, function(item, i) {\n                        var y = item._legendItemPos[1],\n                            h = Math.round(item.legendItem.getBBox().height),\n                            len = pages.length;\n\n                        if (!len || (y - pages[len - 1] > clipHeight &&\n                                (lastY || y) !== pages[len - 1])) {\n                            pages.push(lastY || y);\n                            len++;\n                        }\n\n                        if (i === allItems.length - 1 &&\n                            y + h - pages[len - 1] > clipHeight) {\n                            pages.push(y);\n                        }\n                        if (y !== lastY) {\n                            lastY = y;\n                        }\n                    });\n\n                    // Only apply clipping if needed. Clipping causes blurred legend in\n                    // PDF export (#1787)\n                    if (!clipRect) {\n                        clipRect = legend.clipRect =\n                            renderer.clipRect(0, padding, 9999, 0);\n                        legend.contentGroup.clip(clipRect);\n                    }\n\n                    clipToHeight(clipHeight);\n\n                    // Add navigation elements\n                    if (!nav) {\n                        this.nav = nav = renderer.g()\n                            .attr({\n                                zIndex: 1\n                            })\n                            .add(this.group);\n\n                        this.up = renderer\n                            .symbol(\n                                'triangle',\n                                0,\n                                0,\n                                arrowSize,\n                                arrowSize\n                            )\n                            .on('click', function() {\n                                legend.scroll(-1, animation);\n                            })\n                            .add(nav);\n\n                        this.pager = renderer.text('', 15, 10)\n                            .addClass('highcharts-legend-navigation')\n\n                            .add(nav);\n\n                        this.down = renderer\n                            .symbol(\n                                'triangle-down',\n                                0,\n                                0,\n                                arrowSize,\n                                arrowSize\n                            )\n                            .on('click', function() {\n                                legend.scroll(1, animation);\n                            })\n                            .add(nav);\n                    }\n\n                    // Set initial position\n                    legend.scroll(0);\n\n                    legendHeight = spaceHeight;\n\n                    // Reset\n                } else if (nav) {\n                    clipToHeight();\n                    this.nav = nav.destroy(); // #6322\n                    this.scrollGroup.attr({\n                        translateY: 1\n                    });\n                    this.clipHeight = 0; // #1379\n                }\n\n                return legendHeight;\n            },\n\n            /**\n             * Scroll the legend by a number of pages\n             * @param {Object} scrollBy\n             * @param {Object} animation\n             */\n            scroll: function(scrollBy, animation) {\n                var pages = this.pages,\n                    pageCount = pages.length,\n                    currentPage = this.currentPage + scrollBy,\n                    clipHeight = this.clipHeight,\n                    navOptions = this.options.navigation,\n                    pager = this.pager,\n                    padding = this.padding,\n                    scrollOffset;\n\n                // When resizing while looking at the last page\n                if (currentPage > pageCount) {\n                    currentPage = pageCount;\n                }\n\n                if (currentPage > 0) {\n\n                    if (animation !== undefined) {\n                        setAnimation(animation, this.chart);\n                    }\n\n                    this.nav.attr({\n                        translateX: padding,\n                        translateY: clipHeight + this.padding + 7 + this.titleHeight,\n                        visibility: 'visible'\n                    });\n                    this.up.attr({\n                        'class': currentPage === 1 ?\n                            'highcharts-legend-nav-inactive' : 'highcharts-legend-nav-active'\n                    });\n                    pager.attr({\n                        text: currentPage + '/' + pageCount\n                    });\n                    this.down.attr({\n                        'x': 18 + this.pager.getBBox().width, // adjust to text width\n                        'class': currentPage === pageCount ?\n                            'highcharts-legend-nav-inactive' : 'highcharts-legend-nav-active'\n                    });\n\n\n\n                    scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n\n                    this.scrollGroup.animate({\n                        translateY: scrollOffset\n                    });\n\n                    this.currentPage = currentPage;\n                    this.positionCheckboxes(scrollOffset);\n                }\n\n            }\n\n        };\n\n        /*\n         * LegendSymbolMixin\n         */\n\n        H.LegendSymbolMixin = {\n\n            /**\n             * Get the series' symbol in the legend\n             *\n             * @param {Object} legend The legend object\n             * @param {Object} item The series (this) or point\n             */\n            drawRectangle: function(legend, item) {\n                var options = legend.options,\n                    symbolHeight = legend.symbolHeight,\n                    square = options.squareSymbol,\n                    symbolWidth = square ? symbolHeight : legend.symbolWidth;\n\n                item.legendSymbol = this.chart.renderer.rect(\n                        square ? (legend.symbolWidth - symbolHeight) / 2 : 0,\n                        legend.baseline - symbolHeight + 1, // #3988\n                        symbolWidth,\n                        symbolHeight,\n                        pick(legend.options.symbolRadius, symbolHeight / 2)\n                    )\n                    .addClass('highcharts-point')\n                    .attr({\n                        zIndex: 3\n                    }).add(item.legendGroup);\n\n            },\n\n            /**\n             * Get the series' symbol in the legend. This method should be overridable\n             * to create custom symbols through\n             * Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n             *\n             * @param {Object} legend The legend object\n             */\n            drawLineMarker: function(legend) {\n\n                var options = this.options,\n                    markerOptions = options.marker,\n                    radius,\n                    legendSymbol,\n                    symbolWidth = legend.symbolWidth,\n                    symbolHeight = legend.symbolHeight,\n                    generalRadius = symbolHeight / 2,\n                    renderer = this.chart.renderer,\n                    legendItemGroup = this.legendGroup,\n                    verticalCenter = legend.baseline -\n                    Math.round(legend.fontMetrics.b * 0.3),\n                    attr = {};\n\n                // Draw the line\n\n\n                this.legendLine = renderer.path([\n                        'M',\n                        0,\n                        verticalCenter,\n                        'L',\n                        symbolWidth,\n                        verticalCenter\n                    ])\n                    .addClass('highcharts-graph')\n                    .attr(attr)\n                    .add(legendItemGroup);\n\n                // Draw the marker\n                if (markerOptions && markerOptions.enabled !== false) {\n\n                    // Do not allow the marker to be larger than the symbolHeight\n                    radius = Math.min(\n                        pick(markerOptions.radius, generalRadius),\n                        generalRadius\n                    );\n\n                    // Restrict symbol markers size\n                    if (this.symbol.indexOf('url') === 0) {\n                        markerOptions = merge(markerOptions, {\n                            width: symbolHeight,\n                            height: symbolHeight\n                        });\n                        radius = 0;\n                    }\n\n                    this.legendSymbol = legendSymbol = renderer.symbol(\n                            this.symbol,\n                            (symbolWidth / 2) - radius,\n                            verticalCenter - radius,\n                            2 * radius,\n                            2 * radius,\n                            markerOptions\n                        )\n                        .addClass('highcharts-point')\n                        .add(legendItemGroup);\n                    legendSymbol.isMarker = true;\n                }\n            }\n        };\n\n        // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,\n        // and for #2580, a similar drawing flaw in Firefox 26.\n        // Explore if there's a general cause for this. The problem may be related\n        // to nested group elements, as the legend item texts are within 4 group\n        // elements.\n        if (/Trident\\/7\\.0/.test(win.navigator.userAgent) || isFirefox) {\n            wrap(Highcharts.Legend.prototype, 'positionItem', function(proceed, item) {\n                var legend = this,\n                    // If chart destroyed in sync, this is undefined (#2030)\n                    runPositionItem = function() {\n                        if (item._legendItemPos) {\n                            proceed.call(legend, item);\n                        }\n                    };\n\n                // Do it now, for export and to get checkbox placement\n                runPositionItem();\n\n                // Do it after to work around the core issue\n                setTimeout(runPositionItem);\n            });\n        }\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            animate = H.animate,\n            animObject = H.animObject,\n            attr = H.attr,\n            doc = H.doc,\n            Axis = H.Axis, // @todo add as requirement\n            createElement = H.createElement,\n            defaultOptions = H.defaultOptions,\n            discardElement = H.discardElement,\n            charts = H.charts,\n            css = H.css,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            find = H.find,\n            fireEvent = H.fireEvent,\n            getStyle = H.getStyle,\n            grep = H.grep,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            isString = H.isString,\n            Legend = H.Legend, // @todo add as requirement\n            marginNames = H.marginNames,\n            merge = H.merge,\n            objectEach = H.objectEach,\n            Pointer = H.Pointer, // @todo add as requirement\n            pick = H.pick,\n            pInt = H.pInt,\n            removeEvent = H.removeEvent,\n            seriesTypes = H.seriesTypes,\n            splat = H.splat,\n            svg = H.svg,\n            syncTimeout = H.syncTimeout,\n            win = H.win,\n            Renderer = H.Renderer;\n        /**\n         * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n         * @class Highcharts.Chart\n         * @param  {String|HTMLDOMElement} renderTo\n         *         The DOM element to render to, or its id.\n         * @param  {Options} options\n         *         The chart options structure.\n         * @param  {Function} [callback]\n         *         Function to run when the chart has loaded and and all external images\n         *         are loaded. Defining a {@link\n         *         https://api.highcharts.com/highcharts/chart.events.load|chart.event.load}\n         *         handler is equivalent.\n         *\n         * @example\n         * var chart = new Highcharts.Chart('container', {\n         * \t   title: {\n         * \t   \t   text: 'My chart'\n         * \t   },\n         * \t   series: [{\n         * \t       data: [1, 3, 2, 4]\n         * \t   }]\n         * })\n         */\n        var Chart = H.Chart = function() {\n            this.getArgs.apply(this, arguments);\n        };\n\n        /**\n         * Factory function for basic charts. \n         *\n         * @function #chart\n         * @memberOf Highcharts\n         * @param  {String|HTMLDOMElement} renderTo - The DOM element to render to, or\n         * its id.\n         * @param  {Options} options - The chart options structure.\n         * @param  {Function} [callback] - Function to run when the chart has loaded and\n         * and all external images are loaded. Defining a {@link\n         * https://api.highcharts.com/highcharts/chart.events.load|chart.event.load}\n         * handler is equivalent.\n         * @return {Highcharts.Chart} - Returns the Chart object.\n         *\n         * @example\n         * // Render a chart in to div#container\n         * var chart = Highcharts.chart('container', {\n         *     title: {\n         *         text: 'My chart'\n         *     },\n         *     series: [{\n         *         data: [1, 3, 2, 4]\n         *     }]\n         * });\n         */\n        H.chart = function(a, b, c) {\n            return new Chart(a, b, c);\n        };\n\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n            /**\n             * Hook for modules\n             */\n            callbacks: [],\n\n            /**\n             * Handle the arguments passed to the constructor\n             * @returns {Array} Arguments without renderTo\n             */\n            getArgs: function() {\n                var args = [].slice.call(arguments);\n\n                // Remove the optional first argument, renderTo, and\n                // set it on this.\n                if (isString(args[0]) || args[0].nodeName) {\n                    this.renderTo = args.shift();\n                }\n                this.init(args[0], args[1]);\n            },\n\n            /**\n             * Initialize the chart\n             */\n            init: function(userOptions, callback) {\n\n                // Handle regular options\n                var options,\n                    type,\n                    seriesOptions = userOptions.series, // skip merging data points to increase performance\n                    userPlotOptions = userOptions.plotOptions || {};\n\n                userOptions.series = null;\n                options = merge(defaultOptions, userOptions); // do the merge\n\n                // Override (by copy of user options) or clear tooltip options\n                // in chart.options.plotOptions (#6218)\n                for (type in options.plotOptions) {\n                    options.plotOptions[type].tooltip = (\n                        userPlotOptions[type] &&\n                        merge(userPlotOptions[type].tooltip) // override by copy\n                    ) || undefined; // or clear\n                }\n                // User options have higher priority than default options (#6218).\n                // In case of exporting: path is changed\n                options.tooltip.userOptions = (userOptions.chart &&\n                        userOptions.chart.forExport && userOptions.tooltip.userOptions) ||\n                    userOptions.tooltip;\n\n                options.series = userOptions.series = seriesOptions; // set back the series data\n                this.userOptions = userOptions;\n\n                var optionsChart = options.chart;\n\n                var chartEvents = optionsChart.events;\n\n                this.margin = [];\n                this.spacing = [];\n\n                //this.runChartClick = chartEvents && !!chartEvents.click;\n                this.bounds = {\n                    h: {},\n                    v: {}\n                }; // Pixel data bounds for touch zoom\n\n                this.callback = callback;\n                this.isResizing = 0;\n\n                /**\n                 * The options structure for the chart. It contains members for the sub\n                 * elements like series, legend, tooltip etc.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name options\n                 * @type {Options}\n                 */\n                this.options = options;\n                /**\n                 * All the axes in the chart.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name axes\n                 * @see  Highcharts.Chart.xAxis\n                 * @see  Highcharts.Chart.yAxis\n                 * @type {Array.<Highcharts.Axis>}\n                 */\n                this.axes = [];\n\n                /**\n                 * All the current series in the chart.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name series\n                 * @type {Array.<Highcharts.Series>}\n                 */\n                this.series = [];\n\n                /**\n                 * The chart title. The title has an `update` method that allows\n                 * modifying the options directly or indirectly via `chart.update`.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name title\n                 * @type Object\n                 *\n                 * @sample highcharts/members/title-update/\n                 *         Updating titles\n                 */\n\n                /**\n                 * The chart subtitle. The subtitle has an `update` method that allows\n                 * modifying the options directly or indirectly via `chart.update`.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name subtitle\n                 * @type Object\n                 */\n\n\n\n                this.hasCartesianSeries = optionsChart.showAxes;\n                //this.axisOffset = undefined;\n                //this.inverted = undefined;\n                //this.loadingShown = undefined;\n                //this.container = undefined;\n                //this.chartWidth = undefined;\n                //this.chartHeight = undefined;\n                //this.marginRight = undefined;\n                //this.marginBottom = undefined;\n                //this.containerWidth = undefined;\n                //this.containerHeight = undefined;\n                //this.oldChartWidth = undefined;\n                //this.oldChartHeight = undefined;\n\n                //this.renderTo = undefined;\n\n                //this.spacingBox = undefined\n\n                //this.legend = undefined;\n\n                // Elements\n                //this.chartBackground = undefined;\n                //this.plotBackground = undefined;\n                //this.plotBGImage = undefined;\n                //this.plotBorder = undefined;\n                //this.loadingDiv = undefined;\n                //this.loadingSpan = undefined;\n\n                var chart = this;\n\n                // Add the chart to the global lookup\n                chart.index = charts.length;\n\n                charts.push(chart);\n                H.chartCount++;\n\n                // Chart event handlers\n                if (chartEvents) {\n                    objectEach(chartEvents, function(event, eventType) {\n                        addEvent(chart, eventType, event);\n                    });\n                }\n\n                /**\n                 * A collection of the X axes in the chart.\n                 * @type {Array.<Highcharts.Axis>}\n                 * @name xAxis\n                 * @memberOf Highcharts.Chart\n                 */\n                chart.xAxis = [];\n                /**\n                 * A collection of the Y axes in the chart.\n                 * @type {Array.<Highcharts.Axis>}\n                 * @name yAxis\n                 * @memberOf Highcharts.Chart\n                 */\n                chart.yAxis = [];\n\n                chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n\n                chart.firstRender();\n            },\n\n            /**\n             * Initialize an individual series, called internally before render time\n             */\n            initSeries: function(options) {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    type = options.type || optionsChart.type || optionsChart.defaultSeriesType,\n                    series,\n                    Constr = seriesTypes[type];\n\n                // No such series type\n                if (!Constr) {\n                    H.error(17, true);\n                }\n\n                series = new Constr();\n                series.init(this, options);\n                return series;\n            },\n\n            /**\n             * Order all series above a given index. When series are added and ordered\n             * by configuration, only the last series is handled (#248, #1123, #2456,\n             * #6112). This function is called on series initialization and destroy.\n             *\n             * @param {number} fromIndex - If this is given, only the series above this\n             *\t index are handled.\n             */\n            orderSeries: function(fromIndex) {\n                var series = this.series,\n                    i = fromIndex || 0;\n                for (; i < series.length; i++) {\n                    if (series[i]) {\n                        series[i].index = i;\n                        series[i].name = series[i].name ||\n                            'Series ' + (series[i].index + 1);\n                    }\n                }\n            },\n\n            /**\n             * Check whether a given point is within the plot area\n             *\n             * @param {Number} plotX Pixel x relative to the plot area\n             * @param {Number} plotY Pixel y relative to the plot area\n             * @param {Boolean} inverted Whether the chart is inverted\n             */\n            isInsidePlot: function(plotX, plotY, inverted) {\n                var x = inverted ? plotY : plotX,\n                    y = inverted ? plotX : plotY;\n\n                return x >= 0 &&\n                    x <= this.plotWidth &&\n                    y >= 0 &&\n                    y <= this.plotHeight;\n            },\n\n            /**\n             * Redraw the chart after changes have been done to the data, axis extremes\n             * chart size or chart elements. All methods for updating axes, series or\n             * points have a parameter for redrawing the chart. This is `true` by\n             * default. But in many cases you want to do more than one operation on the\n             * chart before redrawing, for example add a number of points. In those\n             * cases it is a waste of resources to redraw the chart for each new point\n             * added. So you add the points and call `chart.redraw()` after.\n             *\n             * @param  {AnimationOptions} animation\n             *         If or how to apply animation to the redraw.\n             */\n            redraw: function(animation) {\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    pointer = chart.pointer,\n                    legend = chart.legend,\n                    redrawLegend = chart.isDirtyLegend,\n                    hasStackedSeries,\n                    hasDirtyStacks,\n                    hasCartesianSeries = chart.hasCartesianSeries,\n                    isDirtyBox = chart.isDirtyBox,\n                    i,\n                    serie,\n                    renderer = chart.renderer,\n                    isHiddenChart = renderer.isHidden(),\n                    afterRedraw = [];\n\n                // Handle responsive rules, not only on resize (#6130)\n                if (chart.setResponsive) {\n                    chart.setResponsive(false);\n                }\n\n                H.setAnimation(animation, chart);\n\n                if (isHiddenChart) {\n                    chart.temporaryDisplay();\n                }\n\n                // Adjust title layout (reflow multiline text)\n                chart.layOutTitles();\n\n                // link stacked series\n                i = series.length;\n                while (i--) {\n                    serie = series[i];\n\n                    if (serie.options.stacking) {\n                        hasStackedSeries = true;\n\n                        if (serie.isDirty) {\n                            hasDirtyStacks = true;\n                            break;\n                        }\n                    }\n                }\n                if (hasDirtyStacks) { // mark others as dirty\n                    i = series.length;\n                    while (i--) {\n                        serie = series[i];\n                        if (serie.options.stacking) {\n                            serie.isDirty = true;\n                        }\n                    }\n                }\n\n                // Handle updated data in the series\n                each(series, function(serie) {\n                    if (serie.isDirty) {\n                        if (serie.options.legendType === 'point') {\n                            if (serie.updateTotals) {\n                                serie.updateTotals();\n                            }\n                            redrawLegend = true;\n                        }\n                    }\n                    if (serie.isDirtyData) {\n                        fireEvent(serie, 'updatedData');\n                    }\n                });\n\n                // handle added or removed series\n                if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed\n                    // draw legend graphics\n                    legend.render();\n\n                    chart.isDirtyLegend = false;\n                }\n\n                // reset stacks\n                if (hasStackedSeries) {\n                    chart.getStacks();\n                }\n\n\n                if (hasCartesianSeries) {\n                    // set axes scales\n                    each(axes, function(axis) {\n                        axis.updateNames();\n                        axis.setScale();\n                    });\n                }\n\n                chart.getMargins(); // #3098\n\n                if (hasCartesianSeries) {\n                    // If one axis is dirty, all axes must be redrawn (#792, #2169)\n                    each(axes, function(axis) {\n                        if (axis.isDirty) {\n                            isDirtyBox = true;\n                        }\n                    });\n\n                    // redraw axes\n                    each(axes, function(axis) {\n\n                        // Fire 'afterSetExtremes' only if extremes are set\n                        var key = axis.min + ',' + axis.max;\n                        if (axis.extKey !== key) { // #821, #4452\n                            axis.extKey = key;\n                            afterRedraw.push(function() { // prevent a recursive call to chart.redraw() (#1119)\n                                fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n                                delete axis.eventArgs;\n                            });\n                        }\n                        if (isDirtyBox || hasStackedSeries) {\n                            axis.redraw();\n                        }\n                    });\n                }\n\n                // the plot areas size has changed\n                if (isDirtyBox) {\n                    chart.drawChartBox();\n                }\n\n                // Fire an event before redrawing series, used by the boost module to\n                // clear previous series renderings.\n                fireEvent(chart, 'predraw');\n\n                // redraw affected series\n                each(series, function(serie) {\n                    if ((isDirtyBox || serie.isDirty) && serie.visible) {\n                        serie.redraw();\n                    }\n                    // Set it here, otherwise we will have unlimited 'updatedData' calls\n                    // for a hidden series after setData(). Fixes #6012\n                    serie.isDirtyData = false;\n                });\n\n                // move tooltip or reset\n                if (pointer) {\n                    pointer.reset(true);\n                }\n\n                // redraw if canvas\n                renderer.draw();\n\n                // Fire the events\n                fireEvent(chart, 'redraw');\n                fireEvent(chart, 'render');\n\n                if (isHiddenChart) {\n                    chart.temporaryDisplay(true);\n                }\n\n                // Fire callbacks that are put on hold until after the redraw\n                each(afterRedraw, function(callback) {\n                    callback.call();\n                });\n            },\n\n            /**\n             * Get an axis, series or point object by `id` as given in the configuration\n             * options. Returns `undefined` if no item is found.\n             * @param id {String} The id as given in the configuration options.\n             * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n             *         The retrieved item.\n             * @sample highcharts/plotoptions/series-id/\n             *         Get series by id\n             */\n            get: function(id) {\n\n                var ret,\n                    series = this.series,\n                    i;\n\n                function itemById(item) {\n                    return item.id === id || (item.options && item.options.id === id);\n                }\n\n                ret =\n                    // Search axes\n                    find(this.axes, itemById) ||\n\n                    // Search series\n                    find(this.series, itemById);\n\n                // Search points\n                for (i = 0; !ret && i < series.length; i++) {\n                    ret = find(series[i].points || [], itemById);\n                }\n\n                return ret;\n            },\n\n            /**\n             * Create the Axis instances based on the config options\n             */\n            getAxes: function() {\n                var chart = this,\n                    options = this.options,\n                    xAxisOptions = options.xAxis = splat(options.xAxis || {}),\n                    yAxisOptions = options.yAxis = splat(options.yAxis || {}),\n                    optionsArray;\n\n                // make sure the options are arrays and add some members\n                each(xAxisOptions, function(axis, i) {\n                    axis.index = i;\n                    axis.isX = true;\n                });\n\n                each(yAxisOptions, function(axis, i) {\n                    axis.index = i;\n                });\n\n                // concatenate all axis options into one array\n                optionsArray = xAxisOptions.concat(yAxisOptions);\n\n                each(optionsArray, function(axisOptions) {\n                    new Axis(chart, axisOptions); // eslint-disable-line no-new\n                });\n            },\n\n\n            /**\n             * Returns an array of all currently selected points in the chart. Points\n             * can be selected by clicking or programmatically by the {@link\n             * Highcharts.Point#select} function.\n             *\n             * @return {Array.<Highcharts.Point>}\n             *         The currently selected points.\n             *\n             * @sample highcharts/plotoptions/series-allowpointselect-line/\n             *         Get selected points\n             */\n            getSelectedPoints: function() {\n                var points = [];\n                each(this.series, function(serie) {\n                    // series.data - for points outside of viewed range (#6445)\n                    points = points.concat(grep(serie.data || [], function(point) {\n                        return point.selected;\n                    }));\n                });\n                return points;\n            },\n\n            /**\n             * Returns an array of all currently selected series in the chart. Series\n             * can be selected either programmatically by the {@link\n             * Highcharts.Series#select} function or by checking the checkbox next to\n             * the legend item if {@link\n             * https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox|\n             * series.showCheckBox} is true.\n             * \n             * @return {Array.<Highcharts.Series>}\n             *         The currently selected series.\n             *\n             * @sample highcharts/members/chart-getselectedseries/\n             *         Get selected series\n             */\n            getSelectedSeries: function() {\n                return grep(this.series, function(serie) {\n                    return serie.selected;\n                });\n            },\n\n            /**\n             * Set a new title or subtitle for the chart.\n             *\n             * @param  titleOptions {TitleOptions}\n             *         New title options.\n             * @param  subtitleOptions {SubtitleOptions}\n             *         New subtitle options.\n             * @param  redraw {Boolean}\n             *         Whether to redraw the chart or wait for a later call to \n             *         `chart.redraw()`.\n             *\n             * @sample highcharts/members/chart-settitle/ Set title text and styles\n             *\n             */\n            setTitle: function(titleOptions, subtitleOptions, redraw) {\n                var chart = this,\n                    options = chart.options,\n                    chartTitleOptions,\n                    chartSubtitleOptions;\n\n                chartTitleOptions = options.title = merge(\n\n                    options.title,\n                    titleOptions\n                );\n                chartSubtitleOptions = options.subtitle = merge(\n\n                    options.subtitle,\n                    subtitleOptions\n                );\n\n                // add title and subtitle\n                each([\n                    ['title', titleOptions, chartTitleOptions],\n                    ['subtitle', subtitleOptions, chartSubtitleOptions]\n                ], function(arr, i) {\n                    var name = arr[0],\n                        title = chart[name],\n                        titleOptions = arr[1],\n                        chartTitleOptions = arr[2];\n\n                    if (title && titleOptions) {\n                        chart[name] = title = title.destroy(); // remove old\n                    }\n\n                    if (chartTitleOptions && chartTitleOptions.text && !title) {\n                        chart[name] = chart.renderer.text(\n                                chartTitleOptions.text,\n                                0,\n                                0,\n                                chartTitleOptions.useHTML\n                            )\n                            .attr({\n                                align: chartTitleOptions.align,\n                                'class': 'highcharts-' + name,\n                                zIndex: chartTitleOptions.zIndex || 4\n                            })\n                            .add();\n\n                        // Update methods, shortcut to Chart.setTitle\n                        chart[name].update = function(o) {\n                            chart.setTitle(!i && o, i && o);\n                        };\n\n\n\n                    }\n                });\n                chart.layOutTitles(redraw);\n            },\n\n            /**\n             * Lay out the chart titles and cache the full offset height for use\n             * in getMargins\n             */\n            layOutTitles: function(redraw) {\n                var titleOffset = 0,\n                    requiresDirtyBox,\n                    renderer = this.renderer,\n                    spacingBox = this.spacingBox;\n\n                // Lay out the title and the subtitle respectively\n                each(['title', 'subtitle'], function(key) {\n                    var title = this[key],\n                        titleOptions = this.options[key],\n                        offset = key === 'title' ? -3 :\n                        // Floating subtitle (#6574)\n                        titleOptions.verticalAlign ? 0 : titleOffset + 2,\n                        titleSize;\n\n                    if (title) {\n\n                        titleSize = renderer.fontMetrics(titleSize, title).b;\n\n                        title\n                            .css({\n                                width: (titleOptions.width ||\n                                    spacingBox.width + titleOptions.widthAdjust) + 'px'\n                            })\n                            .align(extend({\n                                y: offset + titleSize\n                            }, titleOptions), false, 'spacingBox');\n\n                        if (!titleOptions.floating && !titleOptions.verticalAlign) {\n                            titleOffset = Math.ceil(\n                                titleOffset +\n                                // Skip the cache for HTML (#3481)\n                                title.getBBox(titleOptions.useHTML).height\n                            );\n                        }\n                    }\n                }, this);\n\n                requiresDirtyBox = this.titleOffset !== titleOffset;\n                this.titleOffset = titleOffset; // used in getMargins\n\n                if (!this.isDirtyBox && requiresDirtyBox) {\n                    this.isDirtyBox = requiresDirtyBox;\n                    // Redraw if necessary (#2719, #2744)\n                    if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {\n                        this.redraw();\n                    }\n                }\n            },\n\n            /**\n             * Get chart width and height according to options and container size\n             */\n            getChartSize: function() {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    widthOption = optionsChart.width,\n                    heightOption = optionsChart.height,\n                    renderTo = chart.renderTo;\n\n                // Get inner width and height\n                if (!defined(widthOption)) {\n                    chart.containerWidth = getStyle(renderTo, 'width');\n                }\n                if (!defined(heightOption)) {\n                    chart.containerHeight = getStyle(renderTo, 'height');\n                }\n\n                chart.chartWidth = Math.max( // #1393\n                    0,\n                    widthOption || chart.containerWidth || 600 // #1460\n                );\n                chart.chartHeight = Math.max(\n                    0,\n                    H.relativeLength(\n                        heightOption,\n                        chart.chartWidth\n                    ) || chart.containerHeight || 400\n                );\n            },\n\n            /**\n             * If the renderTo element has no offsetWidth, most likely one or more of\n             * its parents are hidden. Loop up the DOM tree to temporarily display the\n             * parents, then save the original display properties, and when the true\n             * size is retrieved, reset them. Used on first render and on redraws.\n             *\n             * @param {Boolean} revert - Revert to the saved original styles.\n             */\n            temporaryDisplay: function(revert) {\n                var node = this.renderTo,\n                    tempStyle;\n                if (!revert) {\n                    while (node && node.style) {\n                        if (getStyle(node, 'display', false) === 'none') {\n                            node.hcOrigStyle = {\n                                display: node.style.display,\n                                height: node.style.height,\n                                overflow: node.style.overflow\n                            };\n                            tempStyle = {\n                                display: 'block',\n                                overflow: 'hidden'\n                            };\n                            if (node !== this.renderTo) {\n                                tempStyle.height = 0;\n                            }\n\n                            H.css(node, tempStyle);\n                            if (node.style.setProperty) { // #2631\n                                node.style.setProperty('display', 'block', 'important');\n                            }\n                        }\n                        node = node.parentNode;\n                    }\n                } else {\n                    while (node && node.style) {\n                        if (node.hcOrigStyle) {\n                            H.css(node, node.hcOrigStyle);\n                            delete node.hcOrigStyle;\n                        }\n                        node = node.parentNode;\n                    }\n                }\n            },\n\n            /**\n             * Setter for the chart class name\n             */\n            setClassName: function(className) {\n                this.container.className = 'highcharts-container ' + (className || '');\n            },\n\n            /**\n             * Get the containing element, determine the size and create the inner\n             * container div to hold the chart\n             */\n            getContainer: function() {\n                var chart = this,\n                    container,\n                    options = chart.options,\n                    optionsChart = options.chart,\n                    chartWidth,\n                    chartHeight,\n                    renderTo = chart.renderTo,\n                    indexAttrName = 'data-highcharts-chart',\n                    oldChartIndex,\n                    Ren,\n                    containerId = H.uniqueKey(),\n                    containerStyle,\n                    key;\n\n                if (!renderTo) {\n                    chart.renderTo = renderTo = optionsChart.renderTo;\n                }\n\n                if (isString(renderTo)) {\n                    chart.renderTo = renderTo = doc.getElementById(renderTo);\n                }\n\n                // Display an error if the renderTo is wrong\n                if (!renderTo) {\n                    H.error(13, true);\n                }\n\n                // If the container already holds a chart, destroy it. The check for\n                // hasRendered is there because web pages that are saved to disk from\n                // the browser, will preserve the data-highcharts-chart attribute and\n                // the SVG contents, but not an interactive chart. So in this case,\n                // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n                oldChartIndex = pInt(attr(renderTo, indexAttrName));\n                if (\n                    isNumber(oldChartIndex) &&\n                    charts[oldChartIndex] &&\n                    charts[oldChartIndex].hasRendered\n                ) {\n                    charts[oldChartIndex].destroy();\n                }\n\n                // Make a reference to the chart from the div\n                attr(renderTo, indexAttrName, chart.index);\n\n                // remove previous chart\n                renderTo.innerHTML = '';\n\n                // If the container doesn't have an offsetWidth, it has or is a child of\n                // a node that has display:none. We need to temporarily move it out to a\n                // visible state to determine the size, else the legend and tooltips\n                // won't render properly. The skipClone option is used in sparklines as\n                // a micro optimization, saving about 1-2 ms each chart.\n                if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n                    chart.temporaryDisplay();\n                }\n\n                // get the width and height\n                chart.getChartSize();\n                chartWidth = chart.chartWidth;\n                chartHeight = chart.chartHeight;\n\n                // Create the inner container\n\n\n                /**\n                 * The containing HTML element of the chart. The container is\n                 * dynamically inserted into the element given as the `renderTo`\n                 * parameterin the {@link Highcharts#chart} constructor.\n                 *\n                 * @memberOf Highcharts.Chart\n                 * @type {HTMLDOMElement}\n                 */\n                container = createElement(\n                    'div', {\n                        id: containerId\n                    },\n                    containerStyle,\n                    renderTo\n                );\n                chart.container = container;\n\n                // cache the cursor (#1650)\n                chart._cursor = container.style.cursor;\n\n                // Initialize the renderer\n                Ren = H[optionsChart.renderer] || Renderer;\n                chart.renderer = new Ren(\n                    container,\n                    chartWidth,\n                    chartHeight,\n                    null,\n                    optionsChart.forExport,\n                    options.exporting && options.exporting.allowHTML\n                );\n\n\n                chart.setClassName(optionsChart.className);\n\n                // Initialize definitions\n                for (key in options.defs) {\n                    this.renderer.definition(options.defs[key]);\n                }\n\n\n                // Add a reference to the charts index\n                chart.renderer.chartIndex = chart.index;\n            },\n\n            /**\n             * Calculate margins by rendering axis labels in a preliminary position.\n             * Title, subtitle and legend have already been rendered at this stage, but\n             * will be moved into their final positions\n             */\n            getMargins: function(skipAxes) {\n                var chart = this,\n                    spacing = chart.spacing,\n                    margin = chart.margin,\n                    titleOffset = chart.titleOffset;\n\n                chart.resetMargins();\n\n                // Adjust for title and subtitle\n                if (titleOffset && !defined(margin[0])) {\n                    chart.plotTop = Math.max(\n                        chart.plotTop,\n                        titleOffset + chart.options.title.margin + spacing[0]\n                    );\n                }\n\n                // Adjust for legend\n                if (chart.legend.display) {\n                    chart.legend.adjustMargins(margin, spacing);\n                }\n\n                // adjust for scroller\n                if (chart.extraMargin) {\n                    chart[chart.extraMargin.type] =\n                        (chart[chart.extraMargin.type] || 0) + chart.extraMargin.value;\n                }\n                if (chart.extraTopMargin) {\n                    chart.plotTop += chart.extraTopMargin;\n                }\n                if (!skipAxes) {\n                    this.getAxisMargins();\n                }\n            },\n\n            getAxisMargins: function() {\n\n                var chart = this,\n                    // [top, right, bottom, left]\n                    axisOffset = chart.axisOffset = [0, 0, 0, 0],\n                    margin = chart.margin;\n\n                // pre-render axes to get labels offset width\n                if (chart.hasCartesianSeries) {\n                    each(chart.axes, function(axis) {\n                        if (axis.visible) {\n                            axis.getOffset();\n                        }\n                    });\n                }\n\n                // Add the axis offsets\n                each(marginNames, function(m, side) {\n                    if (!defined(margin[side])) {\n                        chart[m] += axisOffset[side];\n                    }\n                });\n\n                chart.setChartSize();\n\n            },\n\n            /**\n             * Reflows the chart to its container. By default, the chart reflows\n             * automatically to its container following a `window.resize` event, as per\n             * the {@link https://api.highcharts/highcharts/chart.reflow|chart.reflow}\n             * option. However, there are no reliable events for div resize, so if the\n             * container is resized without a window resize event, this must be called\n             * explicitly.\n             *\n             * @param  {Object} e\n             *         Event arguments. Used primarily when the function is called\n             *         internally as a response to window resize.\n             *\n             * @sample highcharts/members/chart-reflow/\n             *         Resize div and reflow\n             * @sample highcharts/chart/events-container/\n             *         Pop up and reflow\n             */\n            reflow: function(e) {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    renderTo = chart.renderTo,\n                    hasUserWidth = defined(optionsChart.width),\n                    width = optionsChart.width || getStyle(renderTo, 'width'),\n                    height = optionsChart.height || getStyle(renderTo, 'height'),\n                    target = e ? e.target : win;\n\n                // Width and height checks for display:none. Target is doc in IE8 and\n                // Opera, win in Firefox, Chrome and IE9.\n                if (!hasUserWidth &&\n                    !chart.isPrinting &&\n                    width &&\n                    height &&\n                    (target === win || target === doc)\n                ) {\n                    if (\n                        width !== chart.containerWidth ||\n                        height !== chart.containerHeight\n                    ) {\n                        clearTimeout(chart.reflowTimeout);\n                        // When called from window.resize, e is set, else it's called\n                        // directly (#2224)\n                        chart.reflowTimeout = syncTimeout(function() {\n                            // Set size, it may have been destroyed in the meantime\n                            // (#1257)\n                            if (chart.container) {\n                                chart.setSize(undefined, undefined, false);\n                            }\n                        }, e ? 100 : 0);\n                    }\n                    chart.containerWidth = width;\n                    chart.containerHeight = height;\n                }\n            },\n\n            /**\n             * Add the event handlers necessary for auto resizing\n             */\n            initReflow: function() {\n                var chart = this,\n                    unbind;\n\n                unbind = addEvent(win, 'resize', function(e) {\n                    chart.reflow(e);\n                });\n                addEvent(chart, 'destroy', unbind);\n\n                // The following will add listeners to re-fit the chart before and after\n                // printing (#2284). However it only works in WebKit. Should have worked\n                // in Firefox, but not supported in IE.\n                /*\n                if (win.matchMedia) {\n                \twin.matchMedia('print').addListener(function reflow() {\n                \t\tchart.reflow();\n                \t});\n                }\n                */\n            },\n\n            /**\n             * Resize the chart to a given width and height. In order to set the width\n             * only, the height argument may be skipped. To set the height only, pass\n             * `undefined for the width.\n             * @param  {Number|undefined|null} [width]\n             *         The new pixel width of the chart. Since v4.2.6, the argument can\n             *         be `undefined` in order to preserve the current value (when\n             *         setting height only), or `null` to adapt to the width of the\n             *         containing element.\n             * @param  {Number|undefined|null} [height]\n             *         The new pixel height of the chart. Since v4.2.6, the argument can\n             *         be `undefined` in order to preserve the current value, or `null`\n             *         in order to adapt to the height of the containing element.\n             * @param  {AnimationOptions} [animation=true]\n             *         Whether and how to apply animation.\n             *\n             * @sample highcharts/members/chart-setsize-button/\n             *         Test resizing from buttons\n             * @sample highcharts/members/chart-setsize-jquery-resizable/\n             *         Add a jQuery UI resizable\n             * @sample stock/members/chart-setsize/\n             *         Highstock with UI resizable\n             */\n            setSize: function(width, height, animation) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    globalAnimation;\n\n                // Handle the isResizing counter\n                chart.isResizing += 1;\n\n                // set the animation for the current process\n                H.setAnimation(animation, chart);\n\n                chart.oldChartHeight = chart.chartHeight;\n                chart.oldChartWidth = chart.chartWidth;\n                if (width !== undefined) {\n                    chart.options.chart.width = width;\n                }\n                if (height !== undefined) {\n                    chart.options.chart.height = height;\n                }\n                chart.getChartSize();\n\n                // Resize the container with the global animation applied if enabled\n                // (#2503)\n\n\n                chart.setChartSize(true);\n                renderer.setSize(chart.chartWidth, chart.chartHeight, animation);\n\n                // handle axes\n                each(chart.axes, function(axis) {\n                    axis.isDirty = true;\n                    axis.setScale();\n                });\n\n                chart.isDirtyLegend = true; // force legend redraw\n                chart.isDirtyBox = true; // force redraw of plot and chart border\n\n                chart.layOutTitles(); // #2857\n                chart.getMargins();\n\n                chart.redraw(animation);\n\n\n                chart.oldChartHeight = null;\n                fireEvent(chart, 'resize');\n\n                // Fire endResize and set isResizing back. If animation is disabled,\n                // fire without delay\n                syncTimeout(function() {\n                    if (chart) {\n                        fireEvent(chart, 'endResize', null, function() {\n                            chart.isResizing -= 1;\n                        });\n                    }\n                }, animObject(globalAnimation).duration);\n            },\n\n            /**\n             * Set the public chart properties. This is done before and after the\n             * pre-render to determine margin sizes\n             */\n            setChartSize: function(skipAxes) {\n                var chart = this,\n                    inverted = chart.inverted,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    optionsChart = chart.options.chart,\n                    spacing = chart.spacing,\n                    clipOffset = chart.clipOffset,\n                    clipX,\n                    clipY,\n                    plotLeft,\n                    plotTop,\n                    plotWidth,\n                    plotHeight,\n                    plotBorderWidth;\n\n                function clipOffsetSide(side) {\n                    var offset = clipOffset[side] || 0;\n                    return Math.max(plotBorderWidth || offset, offset) / 2;\n                }\n\n                chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n                chart.plotTop = plotTop = Math.round(chart.plotTop);\n                chart.plotWidth = plotWidth = Math.max(\n                    0,\n                    Math.round(chartWidth - plotLeft - chart.marginRight)\n                );\n                chart.plotHeight = plotHeight = Math.max(\n                    0,\n                    Math.round(chartHeight - plotTop - chart.marginBottom)\n                );\n\n                chart.plotSizeX = inverted ? plotHeight : plotWidth;\n                chart.plotSizeY = inverted ? plotWidth : plotHeight;\n\n                chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n\n                // Set boxes used for alignment\n                chart.spacingBox = renderer.spacingBox = {\n                    x: spacing[3],\n                    y: spacing[0],\n                    width: chartWidth - spacing[3] - spacing[1],\n                    height: chartHeight - spacing[0] - spacing[2]\n                };\n                chart.plotBox = renderer.plotBox = {\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                };\n\n                plotBorderWidth = 2 * Math.floor(chart.plotBorderWidth / 2);\n                clipX = Math.ceil(clipOffsetSide(3));\n                clipY = Math.ceil(clipOffsetSide(0));\n                chart.clipBox = {\n                    x: clipX,\n                    y: clipY,\n                    width: Math.floor(\n                        chart.plotSizeX -\n                        clipOffsetSide(1) -\n                        clipX\n                    ),\n                    height: Math.max(\n                        0,\n                        Math.floor(\n                            chart.plotSizeY -\n                            clipOffsetSide(2) -\n                            clipY\n                        )\n                    )\n                };\n\n                if (!skipAxes) {\n                    each(chart.axes, function(axis) {\n                        axis.setAxisSize();\n                        axis.setAxisTranslation();\n                    });\n                }\n            },\n\n            /**\n             * Initial margins before auto size margins are applied\n             */\n            resetMargins: function() {\n                var chart = this,\n                    chartOptions = chart.options.chart;\n\n                // Create margin and spacing array\n                each(['margin', 'spacing'], function splashArrays(target) {\n                    var value = chartOptions[target],\n                        values = isObject(value) ? value : [value, value, value, value];\n\n                    each(['Top', 'Right', 'Bottom', 'Left'], function(sideName, side) {\n                        chart[target][side] = pick(\n                            chartOptions[target + sideName],\n                            values[side]\n                        );\n                    });\n                });\n\n                // Set margin names like chart.plotTop, chart.plotLeft,\n                // chart.marginRight, chart.marginBottom.\n                each(marginNames, function(m, side) {\n                    chart[m] = pick(chart.margin[side], chart.spacing[side]);\n                });\n                chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n                chart.clipOffset = [];\n            },\n\n            /**\n             * Draw the borders and backgrounds for chart and plot area\n             */\n            drawChartBox: function() {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    chartBackground = chart.chartBackground,\n                    plotBackground = chart.plotBackground,\n                    plotBorder = chart.plotBorder,\n                    chartBorderWidth,\n\n                    mgn,\n                    bgAttr,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    plotBox = chart.plotBox,\n                    clipRect = chart.clipRect,\n                    clipBox = chart.clipBox,\n                    verb = 'animate';\n\n                // Chart area\n                if (!chartBackground) {\n                    chart.chartBackground = chartBackground = renderer.rect()\n                        .addClass('highcharts-background')\n                        .add();\n                    verb = 'attr';\n                }\n\n\n                chartBorderWidth = mgn = chartBackground.strokeWidth();\n\n                chartBackground[verb]({\n                    x: mgn / 2,\n                    y: mgn / 2,\n                    width: chartWidth - mgn - chartBorderWidth % 2,\n                    height: chartHeight - mgn - chartBorderWidth % 2,\n                    r: optionsChart.borderRadius\n                });\n\n                // Plot background\n                verb = 'animate';\n                if (!plotBackground) {\n                    verb = 'attr';\n                    chart.plotBackground = plotBackground = renderer.rect()\n                        .addClass('highcharts-plot-background')\n                        .add();\n                }\n                plotBackground[verb](plotBox);\n\n\n\n                // Plot clip\n                if (!clipRect) {\n                    chart.clipRect = renderer.clipRect(clipBox);\n                } else {\n                    clipRect.animate({\n                        width: clipBox.width,\n                        height: clipBox.height\n                    });\n                }\n\n                // Plot area border\n                verb = 'animate';\n                if (!plotBorder) {\n                    verb = 'attr';\n                    chart.plotBorder = plotBorder = renderer.rect()\n                        .addClass('highcharts-plot-border')\n                        .attr({\n                            zIndex: 1 // Above the grid\n                        })\n                        .add();\n                }\n\n\n\n                plotBorder[verb](plotBorder.crisp({\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                }, -plotBorder.strokeWidth())); //#3282 plotBorder should be negative;\n\n                // reset\n                chart.isDirtyBox = false;\n            },\n\n            /**\n             * Detect whether a certain chart property is needed based on inspecting its\n             * options and series. This mainly applies to the chart.inverted property,\n             * and in extensions to the chart.angular and chart.polar properties.\n             */\n            propFromSeries: function() {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    klass,\n                    seriesOptions = chart.options.series,\n                    i,\n                    value;\n\n\n                each(['inverted', 'angular', 'polar'], function(key) {\n\n                    // The default series type's class\n                    klass = seriesTypes[optionsChart.type ||\n                        optionsChart.defaultSeriesType];\n\n                    // Get the value from available chart-wide properties\n                    value =\n                        optionsChart[key] || // It is set in the options\n                        (klass && klass.prototype[key]); // The default series class\n                    // requires it\n\n                    // 4. Check if any the chart's series require it\n                    i = seriesOptions && seriesOptions.length;\n                    while (!value && i--) {\n                        klass = seriesTypes[seriesOptions[i].type];\n                        if (klass && klass.prototype[key]) {\n                            value = true;\n                        }\n                    }\n\n                    // Set the chart property\n                    chart[key] = value;\n                });\n\n            },\n\n            /**\n             * Link two or more series together. This is done initially from\n             * Chart.render, and after Chart.addSeries and Series.remove.\n             */\n            linkSeries: function() {\n                var chart = this,\n                    chartSeries = chart.series;\n\n                // Reset links\n                each(chartSeries, function(series) {\n                    series.linkedSeries.length = 0;\n                });\n\n                // Apply new links\n                each(chartSeries, function(series) {\n                    var linkedTo = series.options.linkedTo;\n                    if (isString(linkedTo)) {\n                        if (linkedTo === ':previous') {\n                            linkedTo = chart.series[series.index - 1];\n                        } else {\n                            linkedTo = chart.get(linkedTo);\n                        }\n                        // #3341 avoid mutual linking\n                        if (linkedTo && linkedTo.linkedParent !== series) {\n                            linkedTo.linkedSeries.push(series);\n                            series.linkedParent = linkedTo;\n                            series.visible = pick(\n                                series.options.visible,\n                                linkedTo.options.visible,\n                                series.visible\n                            ); // #3879\n                        }\n                    }\n                });\n            },\n\n            /**\n             * Render series for the chart\n             */\n            renderSeries: function() {\n                each(this.series, function(serie) {\n                    serie.translate();\n                    serie.render();\n                });\n            },\n\n            /**\n             * Render labels for the chart\n             */\n            renderLabels: function() {\n                var chart = this,\n                    labels = chart.options.labels;\n                if (labels.items) {\n                    each(labels.items, function(label) {\n                        var style = extend(labels.style, label.style),\n                            x = pInt(style.left) + chart.plotLeft,\n                            y = pInt(style.top) + chart.plotTop + 12;\n\n                        // delete to prevent rewriting in IE\n                        delete style.left;\n                        delete style.top;\n\n                        chart.renderer.text(\n                                label.html,\n                                x,\n                                y\n                            )\n                            .attr({\n                                zIndex: 2\n                            })\n                            .css(style)\n                            .add();\n\n                    });\n                }\n            },\n\n            /**\n             * Render all graphics for the chart\n             */\n            render: function() {\n                var chart = this,\n                    axes = chart.axes,\n                    renderer = chart.renderer,\n                    options = chart.options,\n                    tempWidth,\n                    tempHeight,\n                    redoHorizontal,\n                    redoVertical;\n\n                // Title\n                chart.setTitle();\n\n\n                // Legend\n                chart.legend = new Legend(chart, options.legend);\n\n                // Get stacks\n                if (chart.getStacks) {\n                    chart.getStacks();\n                }\n\n                // Get chart margins\n                chart.getMargins(true);\n                chart.setChartSize();\n\n                // Record preliminary dimensions for later comparison\n                tempWidth = chart.plotWidth;\n                tempHeight = chart.plotHeight = chart.plotHeight - 21; // 21 is the most common correction for X axis labels\n\n                // Get margins by pre-rendering axes\n                each(axes, function(axis) {\n                    axis.setScale();\n                });\n                chart.getAxisMargins();\n\n                // If the plot area size has changed significantly, calculate tick positions again\n                redoHorizontal = tempWidth / chart.plotWidth > 1.1;\n                redoVertical = tempHeight / chart.plotHeight > 1.05; // Height is more sensitive\n\n                if (redoHorizontal || redoVertical) {\n\n                    each(axes, function(axis) {\n                        if ((axis.horiz && redoHorizontal) || (!axis.horiz && redoVertical)) {\n                            axis.setTickInterval(true); // update to reflect the new margins\n                        }\n                    });\n                    chart.getMargins(); // second pass to check for new labels\n                }\n\n                // Draw the borders and backgrounds\n                chart.drawChartBox();\n\n\n                // Axes\n                if (chart.hasCartesianSeries) {\n                    each(axes, function(axis) {\n                        if (axis.visible) {\n                            axis.render();\n                        }\n                    });\n                }\n\n                // The series\n                if (!chart.seriesGroup) {\n                    chart.seriesGroup = renderer.g('series-group')\n                        .attr({\n                            zIndex: 3\n                        })\n                        .add();\n                }\n                chart.renderSeries();\n\n                // Labels\n                chart.renderLabels();\n\n                // Credits\n                chart.addCredits();\n\n                // Handle responsiveness\n                if (chart.setResponsive) {\n                    chart.setResponsive();\n                }\n\n                // Set flag\n                chart.hasRendered = true;\n\n            },\n\n            /**\n             * Set a new credits label for the chart.\n             *\n             * @param  {CreditOptions} options\n             *         A configuration object for the new credits.\n             * @sample highcharts/credits/credits-update/ Add and update credits\n             */\n            addCredits: function(credits) {\n                var chart = this;\n\n                credits = merge(true, this.options.credits, credits);\n                if (credits.enabled && !this.credits) {\n\n                    /**\n                     * The chart's credits label. The label has an `update` method that\n                     * allows setting new options as per the {@link\n                     * https://api.highcharts.com/highcharts/credits|\n                     * credits options set}.\n                     *\n                     * @memberof Highcharts.Chart\n                     * @name credits\n                     * @type {Highcharts.SVGElement}\n                     */\n                    this.credits = this.renderer.text(\n                            credits.text + (this.mapCredits || ''),\n                            0,\n                            0\n                        )\n                        .addClass('highcharts-credits')\n                        .on('click', function() {\n                            if (credits.href) {\n                                win.location.href = credits.href;\n                            }\n                        })\n                        .attr({\n                            align: credits.position.align,\n                            zIndex: 8\n                        })\n\n                        .add()\n                        .align(credits.position);\n\n                    // Dynamically update\n                    this.credits.update = function(options) {\n                        chart.credits = chart.credits.destroy();\n                        chart.addCredits(options);\n                    };\n                }\n            },\n\n            /**\n             * Remove the chart and purge memory. This method is called internally\n             * before adding a second chart into the same container, as well as on\n             * window unload to prevent leaks.\n             *\n             * @sample highcharts/members/chart-destroy/\n             *         Destroy the chart from a button\n             * @sample stock/members/chart-destroy/\n             *         Destroy with Highstock\n             */\n            destroy: function() {\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    container = chart.container,\n                    i,\n                    parentNode = container && container.parentNode;\n\n                // fire the chart.destoy event\n                fireEvent(chart, 'destroy');\n\n                // Delete the chart from charts lookup array\n                if (chart.renderer.forExport) {\n                    H.erase(charts, chart); // #6569\n                } else {\n                    charts[chart.index] = undefined;\n                }\n                H.chartCount--;\n                chart.renderTo.removeAttribute('data-highcharts-chart');\n\n                // remove events\n                removeEvent(chart);\n\n                // ==== Destroy collections:\n                // Destroy axes\n                i = axes.length;\n                while (i--) {\n                    axes[i] = axes[i].destroy();\n                }\n\n                // Destroy scroller & scroller series before destroying base series\n                if (this.scroller && this.scroller.destroy) {\n                    this.scroller.destroy();\n                }\n\n                // Destroy each series\n                i = series.length;\n                while (i--) {\n                    series[i] = series[i].destroy();\n                }\n\n                // ==== Destroy chart properties:\n                each([\n                    'title', 'subtitle', 'chartBackground', 'plotBackground',\n                    'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n                    'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n                    'renderer'\n                ], function(name) {\n                    var prop = chart[name];\n\n                    if (prop && prop.destroy) {\n                        chart[name] = prop.destroy();\n                    }\n                });\n\n                // remove container and all SVG\n                if (container) { // can break in IE when destroyed before finished loading\n                    container.innerHTML = '';\n                    removeEvent(container);\n                    if (parentNode) {\n                        discardElement(container);\n                    }\n\n                }\n\n                // clean it all up\n                objectEach(chart, function(val, key) {\n                    delete chart[key];\n                });\n\n            },\n\n\n            /**\n             * VML namespaces can't be added until after complete. Listening\n             * for Perini's doScroll hack is not enough.\n             */\n            isReadyToRender: function() {\n                var chart = this;\n\n                // Note: win == win.top is required\n                if ((!svg && (win == win.top && doc.readyState !== 'complete'))) { // eslint-disable-line eqeqeq\n                    doc.attachEvent('onreadystatechange', function() {\n                        doc.detachEvent('onreadystatechange', chart.firstRender);\n                        if (doc.readyState === 'complete') {\n                            chart.firstRender();\n                        }\n                    });\n                    return false;\n                }\n                return true;\n            },\n\n            /**\n             * Prepare for first rendering after all data are loaded\n             */\n            firstRender: function() {\n                var chart = this,\n                    options = chart.options;\n\n                // Check whether the chart is ready to render\n                if (!chart.isReadyToRender()) {\n                    return;\n                }\n\n                // Create the container\n                chart.getContainer();\n\n                // Run an early event after the container and renderer are established\n                fireEvent(chart, 'init');\n\n\n                chart.resetMargins();\n                chart.setChartSize();\n\n                // Set the common chart properties (mainly invert) from the given series\n                chart.propFromSeries();\n\n                // get axes\n                chart.getAxes();\n\n                // Initialize the series\n                each(options.series || [], function(serieOptions) {\n                    chart.initSeries(serieOptions);\n                });\n\n                chart.linkSeries();\n\n                // Run an event after axes and series are initialized, but before render. At this stage,\n                // the series data is indexed and cached in the xData and yData arrays, so we can access\n                // those before rendering. Used in Highstock.\n                fireEvent(chart, 'beforeRender');\n\n                // depends on inverted and on margins being set\n                if (Pointer) {\n                    chart.pointer = new Pointer(chart, options);\n                }\n\n                chart.render();\n\n                // Fire the load event if there are no external images\n                if (!chart.renderer.imgCount && chart.onload) {\n                    chart.onload();\n                }\n\n                // If the chart was rendered outside the top container, put it back in (#3679)\n                chart.temporaryDisplay(true);\n\n            },\n\n            /** \n             * On chart load\n             */\n            onload: function() {\n\n                // Run callbacks\n                each([this.callback].concat(this.callbacks), function(fn) {\n                    if (fn && this.index !== undefined) { // Chart destroyed in its own callback (#3600)\n                        fn.apply(this, [this]);\n                    }\n                }, this);\n\n                fireEvent(this, 'load');\n                fireEvent(this, 'render');\n\n\n                // Set up auto resize, check for not destroyed (#6068)\n                if (defined(this.index) && this.options.chart.reflow !== false) {\n                    this.initReflow();\n                }\n\n                // Don't run again\n                this.onload = null;\n            }\n\n        }); // end Chart\n\n    }(Highcharts));\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Point,\n            H = Highcharts,\n\n            each = H.each,\n            extend = H.extend,\n            erase = H.erase,\n            fireEvent = H.fireEvent,\n            format = H.format,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            pick = H.pick,\n            removeEvent = H.removeEvent;\n\n        /**\n         * The Point object. The point objects are generated from the `series.data` \n         * configuration objects or raw numbers. They can be accessed from the\n         * `Series.points` array. Other ways to instaniate points are through {@link\n         * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n         *\n         * @class\n         */\n\n        Highcharts.Point = Point = function() {};\n        Highcharts.Point.prototype = {\n\n            /**\n             * Initialize the point. Called internally based on the series.data option.\n             * @param {Object} series The series object containing this point.\n             * @param {Object} options The data in either number, array or object\n             *        format.\n             * @param {Number} x Optionally, the X value of the.\n             * @returns {Object} The Point instance.\n             */\n            init: function(series, options, x) {\n\n                var point = this,\n                    colors,\n                    colorCount = series.chart.options.chart.colorCount,\n                    colorIndex;\n\n                /**\n                 * The series object associated with the point.\n                 *\n                 * @name series\n                 * @memberof Highcharts.Point\n                 * @type Highcharts.Series\n                 */\n                point.series = series;\n\n\n                point.applyOptions(options, x);\n\n                if (series.options.colorByPoint) {\n\n                    colorIndex = series.colorCounter;\n                    series.colorCounter++;\n                    // loop back to zero\n                    if (series.colorCounter === colorCount) {\n                        series.colorCounter = 0;\n                    }\n                } else {\n                    colorIndex = series.colorIndex;\n                }\n                point.colorIndex = pick(point.colorIndex, colorIndex);\n\n                series.chart.pointCount++;\n                return point;\n            },\n            /**\n             * Apply the options containing the x and y data and possible some extra\n             * properties. Called on point init or from point.update.\n             *\n             * @param {Object} options The point options as defined in series.data.\n             * @param {Number} x Optionally, the X value.\n             * @returns {Object} The Point instance.\n             */\n            applyOptions: function(options, x) {\n                var point = this,\n                    series = point.series,\n                    pointValKey = series.options.pointValKey || series.pointValKey;\n\n                options = Point.prototype.optionsToObject.call(this, options);\n\n                // copy options directly to point\n                extend(point, options);\n                point.options = point.options ? extend(point.options, options) : options;\n\n                // Since options are copied into the Point instance, some accidental options must be shielded (#5681)\n                if (options.group) {\n                    delete point.group;\n                }\n\n                // For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.\n                if (pointValKey) {\n                    point.y = point[pointValKey];\n                }\n                point.isNull = pick(\n                    point.isValid && !point.isValid(),\n                    point.x === null || !isNumber(point.y, true)\n                ); // #3571, check for NaN\n\n                // The point is initially selected by options (#5777)\n                if (point.selected) {\n                    point.state = 'select';\n                }\n\n                // If no x is set by now, get auto incremented value. All points must have an\n                // x value, however the y value can be null to create a gap in the series\n                if ('name' in point && x === undefined && series.xAxis && series.xAxis.hasNames) {\n                    point.x = series.xAxis.nameToX(point);\n                }\n                if (point.x === undefined && series) {\n                    if (x === undefined) {\n                        point.x = series.autoIncrement(point);\n                    } else {\n                        point.x = x;\n                    }\n                }\n\n                return point;\n            },\n\n            /**\n             * Transform number or array configs into objects\n             */\n            optionsToObject: function(options) {\n                var ret = {},\n                    series = this.series,\n                    keys = series.options.keys,\n                    pointArrayMap = keys || series.pointArrayMap || ['y'],\n                    valueCount = pointArrayMap.length,\n                    firstItemType,\n                    i = 0,\n                    j = 0;\n\n                if (isNumber(options) || options === null) {\n                    ret[pointArrayMap[0]] = options;\n\n                } else if (isArray(options)) {\n                    // with leading x value\n                    if (!keys && options.length > valueCount) {\n                        firstItemType = typeof options[0];\n                        if (firstItemType === 'string') {\n                            ret.name = options[0];\n                        } else if (firstItemType === 'number') {\n                            ret.x = options[0];\n                        }\n                        i++;\n                    }\n                    while (j < valueCount) {\n                        if (!keys || options[i] !== undefined) { // Skip undefined positions for keys\n                            ret[pointArrayMap[j]] = options[i];\n                        }\n                        i++;\n                        j++;\n                    }\n                } else if (typeof options === 'object') {\n                    ret = options;\n\n                    // This is the fastest way to detect if there are individual point dataLabels that need\n                    // to be considered in drawDataLabels. These can only occur in object configs.\n                    if (options.dataLabels) {\n                        series._hasPointLabels = true;\n                    }\n\n                    // Same approach as above for markers\n                    if (options.marker) {\n                        series._hasPointMarkers = true;\n                    }\n                }\n                return ret;\n            },\n\n            /**\n             * Get the CSS class names for individual points\n             * @returns {String} The class name\n             */\n            getClassName: function() {\n                return 'highcharts-point' +\n                    (this.selected ? ' highcharts-point-select' : '') +\n                    (this.negative ? ' highcharts-negative' : '') +\n                    (this.isNull ? ' highcharts-null-point' : '') +\n                    (this.colorIndex !== undefined ? ' highcharts-color-' +\n                        this.colorIndex : '') +\n                    (this.options.className ? ' ' + this.options.className : '') +\n                    (this.zone && this.zone.className ? ' ' +\n                        this.zone.className.replace('highcharts-negative', '') : '');\n            },\n\n            /**\n             * Return the zone that the point belongs to\n             */\n            getZone: function() {\n                var series = this.series,\n                    zones = series.zones,\n                    zoneAxis = series.zoneAxis || 'y',\n                    i = 0,\n                    zone;\n\n                zone = zones[i];\n                while (this[zoneAxis] >= zone.value) {\n                    zone = zones[++i];\n                }\n\n                if (zone && zone.color && !this.options.color) {\n                    this.color = zone.color;\n                }\n\n                return zone;\n            },\n\n            /**\n             * Destroy a point to clear memory. Its reference still stays in series.data.\n             */\n            destroy: function() {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    hoverPoints = chart.hoverPoints,\n                    prop;\n\n                chart.pointCount--;\n\n                if (hoverPoints) {\n                    point.setState();\n                    erase(hoverPoints, point);\n                    if (!hoverPoints.length) {\n                        chart.hoverPoints = null;\n                    }\n\n                }\n                if (point === chart.hoverPoint) {\n                    point.onMouseOut();\n                }\n\n                // remove all events\n                if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive\n                    removeEvent(point);\n                    point.destroyElements();\n                }\n\n                if (point.legendItem) { // pies have legend items\n                    chart.legend.destroyItem(point);\n                }\n\n                for (prop in point) {\n                    point[prop] = null;\n                }\n\n\n            },\n\n            /**\n             * Destroy SVG elements associated with the point\n             */\n            destroyElements: function() {\n                var point = this,\n                    props = ['graphic', 'dataLabel', 'dataLabelUpper', 'connector', 'shadowGroup'],\n                    prop,\n                    i = 6;\n                while (i--) {\n                    prop = props[i];\n                    if (point[prop]) {\n                        point[prop] = point[prop].destroy();\n                    }\n                }\n            },\n\n            /**\n             * Return the configuration hash needed for the data label and tooltip formatters\n             */\n            getLabelConfig: function() {\n                return {\n                    x: this.category,\n                    y: this.y,\n                    color: this.color,\n                    colorIndex: this.colorIndex,\n                    key: this.name || this.category,\n                    series: this.series,\n                    point: this,\n                    percentage: this.percentage,\n                    total: this.total || this.stackTotal\n                };\n            },\n\n            /**\n             * Extendable method for formatting each point's tooltip line\n             *\n             * @return {String} A string to be concatenated in to the common tooltip text\n             */\n            tooltipFormatter: function(pointFormat) {\n\n                // Insert options for valueDecimals, valuePrefix, and valueSuffix\n                var series = this.series,\n                    seriesTooltipOptions = series.tooltipOptions,\n                    valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),\n                    valuePrefix = seriesTooltipOptions.valuePrefix || '',\n                    valueSuffix = seriesTooltipOptions.valueSuffix || '';\n\n                // Loop over the point array map and replace unformatted values with sprintf formatting markup\n                each(series.pointArrayMap || ['y'], function(key) {\n                    key = '{point.' + key; // without the closing bracket\n                    if (valuePrefix || valueSuffix) {\n                        pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);\n                    }\n                    pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');\n                });\n\n                return format(pointFormat, {\n                    point: this,\n                    series: this.series\n                });\n            },\n\n            /**\n             * Fire an event on the Point object.\n             * @param {String} eventType\n             * @param {Object} eventArgs Additional event arguments\n             * @param {Function} defaultFunction Default event handler\n             */\n            firePointEvent: function(eventType, eventArgs, defaultFunction) {\n                var point = this,\n                    series = this.series,\n                    seriesOptions = series.options;\n\n                // load event handlers on demand to save time on mouseover/out\n                if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {\n                    this.importEvents();\n                }\n\n                // add default handler if in selection mode\n                if (eventType === 'click' && seriesOptions.allowPointSelect) {\n                    defaultFunction = function(event) {\n                        // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera\n                        if (point.select) { // Could be destroyed by prior event handlers (#2911)\n                            point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n                        }\n                    };\n                }\n\n                fireEvent(this, eventType, eventArgs, defaultFunction);\n            },\n\n            /**\n             * For certain series types, like pie charts, where individual points can\n             * be shown or hidden. \n             *\n             * @name visible\n             * @memberOf Highcharts.Point\n             * @type {Boolean}\n             */\n            visible: true\n        };\n\n        /**\n         * For categorized axes this property holds the category name for the \n         * point. For other axes it holds the X value.\n         *\n         * @name category\n         * @memberOf Highcharts.Point\n         * @type {String|Number}\n         */\n\n        /**\n         * The percentage for points in a stacked series or pies.\n         *\n         * @name percentage\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n        /**\n         * The total of values in either a stack for stacked series, or a pie in a pie\n         * series.\n         *\n         * @name total\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n        /**\n         * The x value of the point.\n         *\n         * @name x\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n        /**\n         * The y value of the point.\n         *\n         * @name y\n         * @memberOf Highcharts.Point\n         * @type {Number}\n         */\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            animObject = H.animObject,\n            arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            correctFloat = H.correctFloat,\n            Date = H.Date,\n            defaultOptions = H.defaultOptions,\n            defaultPlotOptions = H.defaultPlotOptions,\n            defined = H.defined,\n            each = H.each,\n            erase = H.erase,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            grep = H.grep,\n            isArray = H.isArray,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            LegendSymbolMixin = H.LegendSymbolMixin, // @todo add as a requirement\n            merge = H.merge,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            Point = H.Point, // @todo  add as a requirement\n            removeEvent = H.removeEvent,\n            splat = H.splat,\n            SVGElement = H.SVGElement,\n            syncTimeout = H.syncTimeout,\n            win = H.win;\n\n        /**\n         * This is the base series prototype that all other series types inherit from.\n         * A new series is initiated either through the {@link https://api.highcharts.com/highcharts/series|\n         * series} option structure, or after the chart is initiated, through {@link\n         * Highcharts.Chart#addSeries}.\n         *\n         * The object can be accessed in a number of ways. All series and point event\n         * handlers give a reference to the `series` object. The chart object has a\n         * {@link Highcharts.Chart.series|series} property that is a collection of all\n         * the chart's series. The point objects and axis objects also have the same\n         * reference.\n         * \n         * Another way to reference the series programmatically is by `id`. Add an id\n         * in the series configuration options, and get the series object by {@link\n         * Highcharts.Chart#get}.\n         *\n         * Configuration options for the series are given in three levels. Options for\n         * all series in a chart are given in the {@link https://api.highcharts.com/highcharts/plotOptions.series|\n         * plotOptions.series} object. Then options for all series of a specific type\n         * are given in the plotOptions of that type, for example `plotOptions.line`.\n         * Next, options for one single series are given in the series array, or as\n         * arguements to `chart.addSeries`. \n         * \n         * The data in the series is stored in various arrays.\n         *\n         * - First, `series.options.data` contains all the original config options for\n         * each point whether added by options or methods like `series.addPoint`.\n         * - Next, `series.data` contains those values converted to points, but in case\n         * the series data length exceeds the `cropThreshold`, or if the data is grouped,\n         * `series.data` doesn't contain all the points. It only contains the points that\n         * have been created on demand.\n         * - Then there's `series.points` that contains all currently visible point\n         * objects. In case of cropping, the cropped-away points are not part of this\n         * array. The `series.points` array starts at `series.cropStart` compared to\n         * `series.data` and `series.options.data`. If however the series data is grouped,\n         * these can't be correlated one to one.\n         * - `series.xData` and `series.processedXData` contain clean x values, equivalent\n         * to `series.data` and `series.points`.\n         * - `series.yData` and `series.processedYData` contain clean y values, equivalent\n         * to `series.data` and `series.points`.\n         *\n         * @class Highcharts.Series\n         * @param  {Highcharts.Chart} chart\n         *         The chart instance.\n         * @param  {Object} options\n         *         The series options.\n         */\n        H.Series = H.seriesType('line', null, { // base series options\n\n            allowPointSelect: false,\n            showCheckbox: false,\n            animation: {\n                duration: 1000\n            },\n            //clip: true,\n            //connectNulls: false,\n            //enableMouseTracking: true,\n            events: {},\n            //legendIndex: 0,\n            // stacking: null,\n            marker: {\n\n                //enabled: true,\n                //symbol: null,\n                radius: 4,\n                states: { // states for a single point\n                    hover: {\n                        animation: {\n                            duration: 50\n                        },\n                        enabled: true,\n                        radiusPlus: 2\n\n                    }\n\n                }\n            },\n            point: {\n                events: {}\n            },\n            dataLabels: {\n                align: 'center',\n                // defer: true,\n                // enabled: false,\n                formatter: function() {\n                    return this.y === null ? '' : H.numberFormat(this.y, -1);\n                },\n\n                verticalAlign: 'bottom', // above singular point\n                x: 0,\n                y: 0,\n                // borderRadius: undefined,\n                padding: 5\n            },\n            // draw points outside the plot area when the number of points is less than\n            // this\n            cropThreshold: 300,\n            pointRange: 0,\n            //pointStart: 0,\n            //pointInterval: 1,\n            //showInLegend: null, // auto = false for linked series\n            softThreshold: true,\n            states: { // states for the entire series\n                hover: {\n                    //enabled: false,\n                    animation: {\n                        duration: 50\n                    },\n                    lineWidthPlus: 1,\n                    marker: {\n                        // lineWidth: base + 1,\n                        // radius: base + 1\n                    },\n                    halo: {\n                        size: 10\n\n                    }\n                },\n                select: {\n                    marker: {}\n                }\n            },\n            stickyTracking: true,\n            //tooltip: {\n            //pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span>' +\n            // '{series.name}: <b>{point.y}</b>'\n            //valueDecimals: null,\n            //xDateFormat: '%A, %b %e, %Y',\n            //valuePrefix: '',\n            //ySuffix: ''\n            //}\n            turboThreshold: 1000,\n            // zIndex: null\n            findNearestPointBy: 'x'\n\n        }, /** @lends Highcharts.Series.prototype */ {\n            isCartesian: true,\n            pointClass: Point,\n            sorted: true, // requires the data to be sorted\n            requireSorting: true,\n            directTouch: false,\n            axisTypes: ['xAxis', 'yAxis'],\n            colorCounter: 0,\n            // each point's x and y values are stored in this.xData and this.yData\n            parallelArrays: ['x', 'y'],\n            coll: 'series',\n            init: function(chart, options) {\n                var series = this,\n                    events,\n                    chartSeries = chart.series,\n                    lastSeries;\n\n                /**\n                 * Read only. The chart that the series belongs to.\n                 *\n                 * @name chart\n                 * @memberOf Series\n                 * @type {Chart}\n                 */\n                series.chart = chart;\n\n                /**\n                 * Read only. The series' type, like \"line\", \"area\", \"column\" etc. The\n                 * type in the series options anc can be altered using {@link\n                 * Series#update}.\n                 *\n                 * @name type\n                 * @memberOf Series\n                 * @type String\n                 */\n\n                /**\n                 * Read only. The series' current options. To update, use {@link\n                 * Series#update}.\n                 *\n                 * @name options\n                 * @memberOf Series\n                 * @type SeriesOptions\n                 */\n                series.options = options = series.setOptions(options);\n                series.linkedSeries = [];\n\n                // bind the axes\n                series.bindAxes();\n\n                // set some variables\n                extend(series, {\n                    /**\n                     * The series name as given in the options. Defaults to\n                     * \"Series {n}\".\n                     *\n                     * @name name\n                     * @memberOf Series\n                     * @type {String}\n                     */\n                    name: options.name,\n                    state: '',\n                    /**\n                     * Read only. The series' visibility state as set by {@link\n                     * Series#show}, {@link Series#hide}, or in the initial\n                     * configuration.\n                     *\n                     * @name visible\n                     * @memberOf Series\n                     * @type {Boolean}\n                     */\n                    visible: options.visible !== false, // true by default\n                    /**\n                     * Read only. The series' selected state as set by {@link\n                     * Highcharts.Series#select}.\n                     * \n                     * @name selected\n                     * @memberOf Series\n                     * @type {Boolean}\n                     */\n                    selected: options.selected === true // false by default\n                });\n\n                // register event listeners\n                events = options.events;\n\n                objectEach(events, function(event, eventType) {\n                    addEvent(series, eventType, event);\n                });\n                if (\n                    (events && events.click) ||\n                    (\n                        options.point &&\n                        options.point.events &&\n                        options.point.events.click\n                    ) ||\n                    options.allowPointSelect\n                ) {\n                    chart.runTrackerClick = true;\n                }\n\n                series.getColor();\n                series.getSymbol();\n\n                // Set the data\n                each(series.parallelArrays, function(key) {\n                    series[key + 'Data'] = [];\n                });\n                series.setData(options.data, false);\n\n                // Mark cartesian\n                if (series.isCartesian) {\n                    chart.hasCartesianSeries = true;\n                }\n\n                // Get the index and register the series in the chart. The index is one\n                // more than the current latest series index (#5960).\n                if (chartSeries.length) {\n                    lastSeries = chartSeries[chartSeries.length - 1];\n                }\n                series._i = pick(lastSeries && lastSeries._i, -1) + 1;\n\n                // Insert the series and re-order all series above the insertion point.\n                chart.orderSeries(this.insert(chartSeries));\n            },\n\n            /**\n             * Insert the series in a collection with other series, either the chart\n             * series or yAxis series, in the correct order according to the index \n             * option.\n             * @param  {Array} collection A collection of series.\n             * @returns {Number} The index of the series in the collection.\n             */\n            insert: function(collection) {\n                var indexOption = this.options.index,\n                    i;\n\n                // Insert by index option\n                if (isNumber(indexOption)) {\n                    i = collection.length;\n                    while (i--) {\n                        // Loop down until the interted element has higher index\n                        if (indexOption >=\n                            pick(collection[i].options.index, collection[i]._i)) {\n                            collection.splice(i + 1, 0, this);\n                            break;\n                        }\n                    }\n                    if (i === -1) {\n                        collection.unshift(this);\n                    }\n                    i = i + 1;\n\n                    // Or just push it to the end\n                } else {\n                    collection.push(this);\n                }\n                return pick(i, collection.length - 1);\n            },\n\n            /**\n             * Set the xAxis and yAxis properties of cartesian series, and register the\n             * series in the `axis.series` array.\n             *\n             * @function #bindAxes\n             * @memberOf Series\n             * @returns {void}\n             */\n            bindAxes: function() {\n                var series = this,\n                    seriesOptions = series.options,\n                    chart = series.chart,\n                    axisOptions;\n\n                // repeat for xAxis and yAxis\n                each(series.axisTypes || [], function(AXIS) {\n\n                    // loop through the chart's axis objects\n                    each(chart[AXIS], function(axis) {\n                        axisOptions = axis.options;\n\n                        // apply if the series xAxis or yAxis option mathches the number\n                        // of the axis, or if undefined, use the first axis\n                        if (\n                            seriesOptions[AXIS] === axisOptions.index ||\n                            (\n                                seriesOptions[AXIS] !== undefined &&\n                                seriesOptions[AXIS] === axisOptions.id\n                            ) ||\n                            (\n                                seriesOptions[AXIS] === undefined &&\n                                axisOptions.index === 0\n                            )\n                        ) {\n\n                            // register this series in the axis.series lookup\n                            series.insert(axis.series);\n\n                            // set this series.xAxis or series.yAxis reference\n                            /**\n                             * Read only. The unique xAxis object associated with the\n                             * series.\n                             *\n                             * @name xAxis\n                             * @memberOf Series\n                             * @type Axis\n                             */\n                            /**\n                             * Read only. The unique yAxis object associated with the\n                             * series.\n                             *\n                             * @name yAxis\n                             * @memberOf Series\n                             * @type Axis\n                             */\n                            series[AXIS] = axis;\n\n                            // mark dirty for redraw\n                            axis.isDirty = true;\n                        }\n                    });\n\n                    // The series needs an X and an Y axis\n                    if (!series[AXIS] && series.optionalAxis !== AXIS) {\n                        H.error(18, true);\n                    }\n\n                });\n            },\n\n            /**\n             * For simple series types like line and column, the data values are held in\n             * arrays like xData and yData for quick lookup to find extremes and more.\n             * For multidimensional series like bubble and map, this can be extended\n             * with arrays like zData and valueData by adding to the\n             * series.parallelArrays array.\n             */\n            updateParallelArrays: function(point, i) {\n                var series = point.series,\n                    args = arguments,\n                    fn = isNumber(i) ?\n                    // Insert the value in the given position\n                    function(key) {\n                        var val = key === 'y' && series.toYData ?\n                            series.toYData(point) :\n                            point[key];\n                        series[key + 'Data'][i] = val;\n                    } :\n                    // Apply the method specified in i with the following arguments\n                    // as arguments\n                    function(key) {\n                        Array.prototype[i].apply(\n                            series[key + 'Data'],\n                            Array.prototype.slice.call(args, 2)\n                        );\n                    };\n\n                each(series.parallelArrays, fn);\n            },\n\n            /**\n             * Return an auto incremented x value based on the pointStart and\n             * pointInterval options. This is only used if an x value is not given for\n             * the point that calls autoIncrement.\n             */\n            autoIncrement: function() {\n\n                var options = this.options,\n                    xIncrement = this.xIncrement,\n                    date,\n                    pointInterval,\n                    pointIntervalUnit = options.pointIntervalUnit;\n\n                xIncrement = pick(xIncrement, options.pointStart, 0);\n\n                this.pointInterval = pointInterval = pick(\n                    this.pointInterval,\n                    options.pointInterval,\n                    1\n                );\n\n                // Added code for pointInterval strings\n                if (pointIntervalUnit) {\n                    date = new Date(xIncrement);\n\n                    if (pointIntervalUnit === 'day') {\n                        date = +date[Date.hcSetDate](\n                            date[Date.hcGetDate]() + pointInterval\n                        );\n                    } else if (pointIntervalUnit === 'month') {\n                        date = +date[Date.hcSetMonth](\n                            date[Date.hcGetMonth]() + pointInterval\n                        );\n                    } else if (pointIntervalUnit === 'year') {\n                        date = +date[Date.hcSetFullYear](\n                            date[Date.hcGetFullYear]() + pointInterval\n                        );\n                    }\n                    pointInterval = date - xIncrement;\n\n                }\n\n                this.xIncrement = xIncrement + pointInterval;\n                return xIncrement;\n            },\n\n            /**\n             * Set the series options by merging from the options tree\n             * @param {Object} itemOptions\n             */\n            setOptions: function(itemOptions) {\n                var chart = this.chart,\n                    chartOptions = chart.options,\n                    plotOptions = chartOptions.plotOptions,\n                    userOptions = chart.userOptions || {},\n                    userPlotOptions = userOptions.plotOptions || {},\n                    typeOptions = plotOptions[this.type],\n                    options,\n                    zones;\n\n                this.userOptions = itemOptions;\n\n                // General series options take precedence over type options because\n                // otherwise, default type options like column.animation would be\n                // overwritten by the general option. But issues have been raised here\n                // (#3881), and the solution may be to distinguish between default\n                // option and userOptions like in the tooltip below.\n                options = merge(\n                    typeOptions,\n                    plotOptions.series,\n                    itemOptions\n                );\n\n                // The tooltip options are merged between global and series specific\n                // options. Importance order asscendingly:\n                // globals: (1)tooltip, (2)plotOptions.series, (3)plotOptions[this.type]\n                // init userOptions with possible later updates: 4-6 like 1-3 and\n                // (7)this series options\n                this.tooltipOptions = merge(\n                    defaultOptions.tooltip, // 1\n                    defaultOptions.plotOptions.series &&\n                    defaultOptions.plotOptions.series.tooltip, // 2\n                    defaultOptions.plotOptions[this.type].tooltip, // 3\n                    chartOptions.tooltip.userOptions, // 4\n                    plotOptions.series && plotOptions.series.tooltip, // 5\n                    plotOptions[this.type].tooltip, // 6\n                    itemOptions.tooltip // 7\n                );\n\n                // When shared tooltip, stickyTracking is true by default,\n                // unless user says otherwise.\n                this.stickyTracking = pick(\n                    itemOptions.stickyTracking,\n                    userPlotOptions[this.type] &&\n                    userPlotOptions[this.type].stickyTracking,\n                    userPlotOptions.series && userPlotOptions.series.stickyTracking,\n                    (\n                        this.tooltipOptions.shared && !this.noSharedTooltip ?\n                        true :\n                        options.stickyTracking\n                    )\n                );\n\n                // Delete marker object if not allowed (#1125)\n                if (typeOptions.marker === null) {\n                    delete options.marker;\n                }\n\n                // Handle color zones\n                this.zoneAxis = options.zoneAxis;\n                zones = this.zones = (options.zones || []).slice();\n                if (\n                    (options.negativeColor || options.negativeFillColor) &&\n                    !options.zones\n                ) {\n                    zones.push({\n                        value: options[this.zoneAxis + 'Threshold'] ||\n                            options.threshold ||\n                            0,\n                        className: 'highcharts-negative'\n\n                    });\n                }\n                if (zones.length) { // Push one extra zone for the rest\n                    if (defined(zones[zones.length - 1].value)) {\n                        zones.push({\n\n                        });\n                    }\n                }\n                return options;\n            },\n\n            getCyclic: function(prop, value, defaults) {\n                var i,\n                    chart = this.chart,\n                    userOptions = this.userOptions,\n                    indexName = prop + 'Index',\n                    counterName = prop + 'Counter',\n                    len = defaults ? defaults.length : pick(\n                        chart.options.chart[prop + 'Count'],\n                        chart[prop + 'Count']\n                    ),\n                    setting;\n\n                if (!value) {\n                    // Pick up either the colorIndex option, or the _colorIndex after\n                    // Series.update()\n                    setting = pick(\n                        userOptions[indexName],\n                        userOptions['_' + indexName]\n                    );\n                    if (defined(setting)) { // after Series.update()\n                        i = setting;\n                    } else {\n                        // #6138\n                        if (!chart.series.length) {\n                            chart[counterName] = 0;\n                        }\n                        userOptions['_' + indexName] = i = chart[counterName] % len;\n                        chart[counterName] += 1;\n                    }\n                    if (defaults) {\n                        value = defaults[i];\n                    }\n                }\n                // Set the colorIndex\n                if (i !== undefined) {\n                    this[indexName] = i;\n                }\n                this[prop] = value;\n            },\n\n            /**\n             * Get the series' color\n             */\n\n            getColor: function() {\n                this.getCyclic('color');\n            },\n\n\n            /**\n             * Get the series' symbol\n             */\n            getSymbol: function() {\n                var seriesMarkerOption = this.options.marker;\n\n                this.getCyclic(\n                    'symbol',\n                    seriesMarkerOption.symbol,\n                    this.chart.options.symbols\n                );\n            },\n\n            drawLegendSymbol: LegendSymbolMixin.drawLineMarker,\n\n            /**\n             * Apply a new set of data to the series and optionally redraw it. The new\n             * data array is passed by reference (except in case of `updatePoints`), and\n             * may later be mutated when updating the chart data.\n             * \n             * Note the difference in behaviour when setting the same amount of points,\n             * or a different amount of points, as handled by the `updatePoints`\n             * parameter. \n             * \n             * @param  {SeriesDataOptions} data\n             *         Takes an array of data in the same format as described under\n             *         `series<type>data` for the given series type.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the series is altered. If doing\n             *         more operations on the chart, it is a good idea to set redraw to\n             *         false and call {@link Chart#redraw} after.\n             * @param  {AnimationOptions} [animation]\n             *         When the updated data is the same length as the existing data,\n             *         points will be updated by default, and animation visualizes how\n             *         the points are changed. Set false to disable animation, or a\n             *         configuration object to set duration or easing.\n             * @param  {Boolean} [updatePoints=true]\n             *         When the updated data is the same length as the existing data,\n             *         points will be updated instead of replaced. This allows updating\n             *         with animation and performs better. In this case, the original\n             *         array is not passed by reference. Set false to prevent.\n             *\n             * @sample highcharts/members/series-setdata/\n             *         Set new data from a button\n             * @sample highcharts/members/series-setdata-pie/\n             *         Set data in a pie\n             * @sample stock/members/series-setdata/\n             *         Set new data in Highstock\n             * @sample maps/members/series-setdata/\n             *         Set new data in Highmaps\n             */\n            setData: function(data, redraw, animation, updatePoints) {\n                var series = this,\n                    oldData = series.points,\n                    oldDataLength = (oldData && oldData.length) || 0,\n                    dataLength,\n                    options = series.options,\n                    chart = series.chart,\n                    firstPoint = null,\n                    xAxis = series.xAxis,\n                    i,\n                    turboThreshold = options.turboThreshold,\n                    pt,\n                    xData = this.xData,\n                    yData = this.yData,\n                    pointArrayMap = series.pointArrayMap,\n                    valueCount = pointArrayMap && pointArrayMap.length;\n\n                data = data || [];\n                dataLength = data.length;\n                redraw = pick(redraw, true);\n\n                // If the point count is the same as is was, just run Point.update which\n                // is cheaper, allows animation, and keeps references to points.\n                if (\n                    updatePoints !== false &&\n                    dataLength &&\n                    oldDataLength === dataLength &&\n                    !series.cropped &&\n                    !series.hasGroupedData &&\n                    series.visible\n                ) {\n                    each(data, function(point, i) {\n                        // .update doesn't exist on a linked, hidden series (#3709)\n                        if (oldData[i].update && point !== options.data[i]) {\n                            oldData[i].update(point, false, null, false);\n                        }\n                    });\n\n                } else {\n\n                    // Reset properties\n                    series.xIncrement = null;\n\n                    series.colorCounter = 0; // for series with colorByPoint (#1547)\n\n                    // Update parallel arrays\n                    each(this.parallelArrays, function(key) {\n                        series[key + 'Data'].length = 0;\n                    });\n\n                    // In turbo mode, only one- or twodimensional arrays of numbers are\n                    // allowed. The first value is tested, and we assume that all the\n                    // rest are defined the same way. Although the 'for' loops are\n                    // similar, they are repeated inside each if-else conditional for\n                    // max performance.\n                    if (turboThreshold && dataLength > turboThreshold) {\n\n                        // find the first non-null point\n                        i = 0;\n                        while (firstPoint === null && i < dataLength) {\n                            firstPoint = data[i];\n                            i++;\n                        }\n\n\n                        if (isNumber(firstPoint)) { // assume all points are numbers\n                            for (i = 0; i < dataLength; i++) {\n                                xData[i] = this.autoIncrement();\n                                yData[i] = data[i];\n                            }\n\n                            // Assume all points are arrays when first point is\n                        } else if (isArray(firstPoint)) {\n                            if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[0];\n                                    yData[i] = pt.slice(1, valueCount + 1);\n                                }\n                            } else { // [x, y]\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[0];\n                                    yData[i] = pt[1];\n                                }\n                            }\n                        } else {\n                            // Highcharts expects configs to be numbers or arrays in\n                            // turbo mode\n                            H.error(12);\n                        }\n                    } else {\n                        for (i = 0; i < dataLength; i++) {\n                            if (data[i] !== undefined) { // stray commas in oldIE\n                                pt = {\n                                    series: series\n                                };\n                                series.pointClass.prototype.applyOptions.apply(\n                                    pt, [data[i]]\n                                );\n                                series.updateParallelArrays(pt, i);\n                            }\n                        }\n                    }\n\n                    // Forgetting to cast strings to numbers is a common caveat when\n                    // handling CSV or JSON\n                    if (isString(yData[0])) {\n                        H.error(14, true);\n                    }\n\n                    /**\n                     * Read only. An array containing the series' data point objects. To\n                     * modify the data, use {@link Highcharts.Series#setData} or {@link\n                     * Highcharts.Point#update}.\n                     *\n                     * @name data\n                     * @memberOf Highcharts.Series\n                     * @type {Array.<Highcharts.Point>}\n                     */\n                    series.data = [];\n                    series.options.data = series.userOptions.data = data;\n\n                    // destroy old points\n                    i = oldDataLength;\n                    while (i--) {\n                        if (oldData[i] && oldData[i].destroy) {\n                            oldData[i].destroy();\n                        }\n                    }\n\n                    // reset minRange (#878)\n                    if (xAxis) {\n                        xAxis.minRange = xAxis.userMinRange;\n                    }\n\n                    // redraw\n                    series.isDirty = chart.isDirtyBox = true;\n                    series.isDirtyData = !!oldData;\n                    animation = false;\n                }\n\n                // Typically for pie series, points need to be processed and generated\n                // prior to rendering the legend\n                if (options.legendType === 'point') {\n                    this.processData();\n                    this.generatePoints();\n                }\n\n                if (redraw) {\n                    chart.redraw(animation);\n                }\n            },\n\n            /**\n             * Process the data by cropping away unused data points if the series is\n             * longer than the crop threshold. This saves computing time for large\n             * series.\n             */\n            processData: function(force) {\n                var series = this,\n                    processedXData = series.xData, // copied during slice operation\n                    processedYData = series.yData,\n                    dataLength = processedXData.length,\n                    croppedData,\n                    cropStart = 0,\n                    cropped,\n                    distance,\n                    closestPointRange,\n                    xAxis = series.xAxis,\n                    i, // loop variable\n                    options = series.options,\n                    cropThreshold = options.cropThreshold,\n                    getExtremesFromAll =\n                    series.getExtremesFromAll ||\n                    options.getExtremesFromAll, // #4599\n                    isCartesian = series.isCartesian,\n                    xExtremes,\n                    val2lin = xAxis && xAxis.val2lin,\n                    isLog = xAxis && xAxis.isLog,\n                    min,\n                    max;\n\n                // If the series data or axes haven't changed, don't go through this.\n                // Return false to pass the message on to override methods like in data\n                // grouping.\n                if (\n                    isCartesian &&\n                    !series.isDirty &&\n                    !xAxis.isDirty &&\n                    !series.yAxis.isDirty &&\n                    !force\n                ) {\n                    return false;\n                }\n\n                if (xAxis) {\n                    xExtremes = xAxis.getExtremes(); // corrected for log axis (#3053)\n                    min = xExtremes.min;\n                    max = xExtremes.max;\n                }\n\n                // optionally filter out points outside the plot area\n                if (\n                    isCartesian &&\n                    series.sorted &&\n                    !getExtremesFromAll &&\n                    (!cropThreshold || dataLength > cropThreshold || series.forceCrop)\n                ) {\n\n                    // it's outside current extremes\n                    if (\n                        processedXData[dataLength - 1] < min ||\n                        processedXData[0] > max\n                    ) {\n                        processedXData = [];\n                        processedYData = [];\n\n                        // only crop if it's actually spilling out\n                    } else if (\n                        processedXData[0] < min ||\n                        processedXData[dataLength - 1] > max\n                    ) {\n                        croppedData = this.cropData(\n                            series.xData,\n                            series.yData,\n                            min,\n                            max\n                        );\n                        processedXData = croppedData.xData;\n                        processedYData = croppedData.yData;\n                        cropStart = croppedData.start;\n                        cropped = true;\n                    }\n                }\n\n\n                // Find the closest distance between processed points\n                i = processedXData.length || 1;\n                while (--i) {\n                    distance = isLog ?\n                        val2lin(processedXData[i]) - val2lin(processedXData[i - 1]) :\n                        processedXData[i] - processedXData[i - 1];\n\n                    if (\n                        distance > 0 &&\n                        (\n                            closestPointRange === undefined ||\n                            distance < closestPointRange\n                        )\n                    ) {\n                        closestPointRange = distance;\n\n                        // Unsorted data is not supported by the line tooltip, as well as\n                        // data grouping and navigation in Stock charts (#725) and width\n                        // calculation of columns (#1900)\n                    } else if (distance < 0 && series.requireSorting) {\n                        H.error(15);\n                    }\n                }\n\n                // Record the properties\n                series.cropped = cropped; // undefined or true\n                series.cropStart = cropStart;\n                series.processedXData = processedXData;\n                series.processedYData = processedYData;\n\n                series.closestPointRange = closestPointRange;\n\n            },\n\n            /**\n             * Iterate over xData and crop values between min and max. Returns object\n             * containing crop start/end cropped xData with corresponding part of yData,\n             * dataMin and dataMax within the cropped range\n             */\n            cropData: function(xData, yData, min, max) {\n                var dataLength = xData.length,\n                    cropStart = 0,\n                    cropEnd = dataLength,\n                    // line-type series need one point outside\n                    cropShoulder = pick(this.cropShoulder, 1),\n                    i,\n                    j;\n\n                // iterate up to find slice start\n                for (i = 0; i < dataLength; i++) {\n                    if (xData[i] >= min) {\n                        cropStart = Math.max(0, i - cropShoulder);\n                        break;\n                    }\n                }\n\n                // proceed to find slice end\n                for (j = i; j < dataLength; j++) {\n                    if (xData[j] > max) {\n                        cropEnd = j + cropShoulder;\n                        break;\n                    }\n                }\n\n                return {\n                    xData: xData.slice(cropStart, cropEnd),\n                    yData: yData.slice(cropStart, cropEnd),\n                    start: cropStart,\n                    end: cropEnd\n                };\n            },\n\n\n            /**\n             * Generate the data point after the data has been processed by cropping\n             * away unused points and optionally grouped in Highcharts Stock.\n             */\n            generatePoints: function() {\n                var series = this,\n                    options = series.options,\n                    dataOptions = options.data,\n                    data = series.data,\n                    dataLength,\n                    processedXData = series.processedXData,\n                    processedYData = series.processedYData,\n                    PointClass = series.pointClass,\n                    processedDataLength = processedXData.length,\n                    cropStart = series.cropStart || 0,\n                    cursor,\n                    hasGroupedData = series.hasGroupedData,\n                    keys = options.keys,\n                    point,\n                    points = [],\n                    i;\n\n                if (!data && !hasGroupedData) {\n                    var arr = [];\n                    arr.length = dataOptions.length;\n                    data = series.data = arr;\n                }\n\n                if (keys && hasGroupedData) {\n                    // grouped data has already applied keys (#6590)\n                    series.options.keys = false;\n                }\n\n                for (i = 0; i < processedDataLength; i++) {\n                    cursor = cropStart + i;\n                    if (!hasGroupedData) {\n                        point = data[cursor];\n                        if (!point && dataOptions[cursor] !== undefined) { // #970\n                            data[cursor] = point = (new PointClass()).init(\n                                series,\n                                dataOptions[cursor],\n                                processedXData[i]\n                            );\n                        }\n                    } else {\n                        // splat the y data in case of ohlc data array\n                        point = (new PointClass()).init(\n                            series, [processedXData[i]].concat(splat(processedYData[i]))\n                        );\n\n                        /**\n                         * Highstock only. If a point object is created by data\n                         * grouping, it doesn't reflect actual points in the raw data.\n                         * In this case, the `dataGroup` property holds information\n                         * that points back to the raw data.\n                         *\n                         * - `dataGroup.start` is the index of the first raw data point\n                         * in the group.\n                         * - `dataGroup.length` is the amount of points in the group.\n                         *\n                         * @name dataGroup\n                         * @memberOf Point\n                         * @type {Object}\n                         * \n                         */\n                        point.dataGroup = series.groupMap[i];\n                    }\n                    if (point) { // #6279\n                        point.index = cursor; // For faster access in Point.update\n                        points[i] = point;\n                    }\n                }\n\n                // restore keys options (#6590)\n                series.options.keys = keys;\n\n                // Hide cropped-away points - this only runs when the number of points\n                // is above cropThreshold, or when swithching view from non-grouped\n                // data to grouped data (#637)\n                if (\n                    data &&\n                    (\n                        processedDataLength !== (dataLength = data.length) ||\n                        hasGroupedData\n                    )\n                ) {\n                    for (i = 0; i < dataLength; i++) {\n                        // when has grouped data, clear all points\n                        if (i === cropStart && !hasGroupedData) {\n                            i += processedDataLength;\n                        }\n                        if (data[i]) {\n                            data[i].destroyElements();\n                            data[i].plotX = undefined; // #1003\n                        }\n                    }\n                }\n\n                series.data = data;\n                series.points = points;\n            },\n\n            /**\n             * Calculate Y extremes for visible data\n             */\n            getExtremes: function(yData) {\n                var xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    xData = this.processedXData,\n                    yDataLength,\n                    activeYData = [],\n                    activeCounter = 0,\n                    // #2117, need to compensate for log X axis\n                    xExtremes = xAxis.getExtremes(),\n                    xMin = xExtremes.min,\n                    xMax = xExtremes.max,\n                    validValue,\n                    withinRange,\n                    x,\n                    y,\n                    i,\n                    j;\n\n                yData = yData || this.stackedYData || this.processedYData || [];\n                yDataLength = yData.length;\n\n                for (i = 0; i < yDataLength; i++) {\n\n                    x = xData[i];\n                    y = yData[i];\n\n                    // For points within the visible range, including the first point\n                    // outside the visible range, consider y extremes\n                    validValue =\n                        (isNumber(y, true) || isArray(y)) &&\n                        (!yAxis.positiveValuesOnly || (y.length || y > 0));\n                    withinRange =\n                        this.getExtremesFromAll ||\n                        this.options.getExtremesFromAll ||\n                        this.cropped ||\n                        ((xData[i] || x) >= xMin && (xData[i] || x) <= xMax);\n\n                    if (validValue && withinRange) {\n\n                        j = y.length;\n                        if (j) { // array, like ohlc or range data\n                            while (j--) {\n                                if (y[j] !== null) {\n                                    activeYData[activeCounter++] = y[j];\n                                }\n                            }\n                        } else {\n                            activeYData[activeCounter++] = y;\n                        }\n                    }\n                }\n\n                this.dataMin = arrayMin(activeYData);\n                this.dataMax = arrayMax(activeYData);\n            },\n\n            /**\n             * Translate data points from raw data values to chart specific positioning\n             * data needed later in drawPoints, drawGraph and drawTracker.\n             *\n             * @function #translate\n             * @memberOf Series\n             * @returns {void}\n             */\n            translate: function() {\n                if (!this.processedXData) { // hidden series\n                    this.processData();\n                }\n                this.generatePoints();\n                var series = this,\n                    options = series.options,\n                    stacking = options.stacking,\n                    xAxis = series.xAxis,\n                    categories = xAxis.categories,\n                    yAxis = series.yAxis,\n                    points = series.points,\n                    dataLength = points.length,\n                    hasModifyValue = !!series.modifyValue,\n                    i,\n                    pointPlacement = options.pointPlacement,\n                    dynamicallyPlaced =\n                    pointPlacement === 'between' ||\n                    isNumber(pointPlacement),\n                    threshold = options.threshold,\n                    stackThreshold = options.startFromThreshold ? threshold : 0,\n                    plotX,\n                    plotY,\n                    lastPlotX,\n                    stackIndicator,\n                    closestPointRangePx = Number.MAX_VALUE;\n\n                // Point placement is relative to each series pointRange (#5889)\n                if (pointPlacement === 'between') {\n                    pointPlacement = 0.5;\n                }\n                if (isNumber(pointPlacement)) {\n                    pointPlacement *= pick(options.pointRange || xAxis.pointRange);\n                }\n\n                // Translate each point\n                for (i = 0; i < dataLength; i++) {\n                    var point = points[i],\n                        xValue = point.x,\n                        yValue = point.y,\n                        yBottom = point.low,\n                        stack = stacking && yAxis.stacks[(\n                            series.negStacks &&\n                            yValue < (stackThreshold ? 0 : threshold) ? '-' : ''\n                        ) + series.stackKey],\n                        pointStack,\n                        stackValues;\n\n                    // Discard disallowed y values for log axes (#3434)\n                    if (yAxis.positiveValuesOnly && yValue !== null && yValue <= 0) {\n                        point.isNull = true;\n                    }\n\n                    // Get the plotX translation\n                    point.plotX = plotX = correctFloat( // #5236\n                        Math.min(Math.max(-1e5, xAxis.translate(\n                            xValue,\n                            0,\n                            0,\n                            0,\n                            1,\n                            pointPlacement,\n                            this.type === 'flags'\n                        )), 1e5) // #3923\n                    );\n\n                    // Calculate the bottom y value for stacked series\n                    if (\n                        stacking &&\n                        series.visible &&\n                        !point.isNull &&\n                        stack &&\n                        stack[xValue]\n                    ) {\n                        stackIndicator = series.getStackIndicator(\n                            stackIndicator,\n                            xValue,\n                            series.index\n                        );\n                        pointStack = stack[xValue];\n                        stackValues = pointStack.points[stackIndicator.key];\n                        yBottom = stackValues[0];\n                        yValue = stackValues[1];\n\n                        if (\n                            yBottom === stackThreshold &&\n                            stackIndicator.key === stack[xValue].base\n                        ) {\n                            yBottom = pick(threshold, yAxis.min);\n                        }\n                        if (yAxis.positiveValuesOnly && yBottom <= 0) { // #1200, #1232\n                            yBottom = null;\n                        }\n\n                        point.total = point.stackTotal = pointStack.total;\n                        point.percentage =\n                            pointStack.total &&\n                            (point.y / pointStack.total * 100);\n                        point.stackY = yValue;\n\n                        // Place the stack label\n                        pointStack.setOffset(\n                            series.pointXOffset || 0,\n                            series.barW || 0\n                        );\n\n                    }\n\n                    // Set translated yBottom or remove it\n                    point.yBottom = defined(yBottom) ?\n                        yAxis.translate(yBottom, 0, 1, 0, 1) :\n                        null;\n\n                    // general hook, used for Highstock compare mode\n                    if (hasModifyValue) {\n                        yValue = series.modifyValue(yValue, point);\n                    }\n\n                    // Set the the plotY value, reset it for redraws\n                    point.plotY = plotY =\n                        (typeof yValue === 'number' && yValue !== Infinity) ?\n                        Math.min(Math.max(-1e5,\n                            yAxis.translate(yValue, 0, 1, 0, 1)), 1e5) : // #3201\n                        undefined;\n\n                    point.isInside =\n                        plotY !== undefined &&\n                        plotY >= 0 &&\n                        plotY <= yAxis.len && // #3519\n                        plotX >= 0 &&\n                        plotX <= xAxis.len;\n\n\n                    // Set client related positions for mouse tracking\n                    point.clientX = dynamicallyPlaced ?\n                        correctFloat(\n                            xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement)\n                        ) :\n                        plotX; // #1514, #5383, #5518\n\n                    point.negative = point.y < (threshold || 0);\n\n                    // some API data\n                    point.category = categories && categories[point.x] !== undefined ?\n                        categories[point.x] : point.x;\n\n                    // Determine auto enabling of markers (#3635, #5099)\n                    if (!point.isNull) {\n                        if (lastPlotX !== undefined) {\n                            closestPointRangePx = Math.min(\n                                closestPointRangePx,\n                                Math.abs(plotX - lastPlotX)\n                            );\n                        }\n                        lastPlotX = plotX;\n                    }\n\n                    // Find point zone\n                    point.zone = this.zones.length && point.getZone();\n                }\n                series.closestPointRangePx = closestPointRangePx;\n            },\n\n            /**\n             * Return the series points with null points filtered out\n             */\n            getValidPoints: function(points, insideOnly) {\n                var chart = this.chart;\n                // #3916, #5029, #5085\n                return grep(points || this.points || [], function isValidPoint(point) {\n                    if (insideOnly && !chart.isInsidePlot(\n                            point.plotX,\n                            point.plotY,\n                            chart.inverted\n                        )) {\n                        return false;\n                    }\n                    return !point.isNull;\n                });\n            },\n\n            /**\n             * Set the clipping for the series. For animated series it is called twice,\n             * first to initiate animating the clip then the second time without the\n             * animation to set the final clip.\n             */\n            setClip: function(animation) {\n                var chart = this.chart,\n                    options = this.options,\n                    renderer = chart.renderer,\n                    inverted = chart.inverted,\n                    seriesClipBox = this.clipBox,\n                    clipBox = seriesClipBox || chart.clipBox,\n                    sharedClipKey =\n                    this.sharedClipKey || [\n                        '_sharedClip',\n                        animation && animation.duration,\n                        animation && animation.easing,\n                        clipBox.height,\n                        options.xAxis,\n                        options.yAxis\n                    ].join(','), // #4526\n                    clipRect = chart[sharedClipKey],\n                    markerClipRect = chart[sharedClipKey + 'm'];\n\n                // If a clipping rectangle with the same properties is currently present\n                // in the chart, use that.\n                if (!clipRect) {\n\n                    // When animation is set, prepare the initial positions\n                    if (animation) {\n                        clipBox.width = 0;\n\n                        chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(-99, // include the width of the first marker\n                            inverted ? -chart.plotLeft : -chart.plotTop,\n                            99,\n                            inverted ? chart.chartWidth : chart.chartHeight\n                        );\n                    }\n                    chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n                    // Create hashmap for series indexes\n                    clipRect.count = {\n                        length: 0\n                    };\n\n                }\n                if (animation) {\n                    if (!clipRect.count[this.index]) {\n                        clipRect.count[this.index] = true;\n                        clipRect.count.length += 1;\n                    }\n                }\n\n                if (options.clip !== false) {\n                    this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);\n                    this.markerGroup.clip(markerClipRect);\n                    this.sharedClipKey = sharedClipKey;\n                }\n\n                // Remove the shared clipping rectangle when all series are shown\n                if (!animation) {\n                    if (clipRect.count[this.index]) {\n                        delete clipRect.count[this.index];\n                        clipRect.count.length -= 1;\n                    }\n\n                    if (clipRect.count.length === 0 && sharedClipKey && chart[sharedClipKey]) {\n                        if (!seriesClipBox) {\n                            chart[sharedClipKey] = chart[sharedClipKey].destroy();\n                        }\n                        if (chart[sharedClipKey + 'm']) {\n                            chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();\n                        }\n                    }\n                }\n            },\n\n            /**\n             * Animate in the series\n             */\n            animate: function(init) {\n                var series = this,\n                    chart = series.chart,\n                    clipRect,\n                    animation = animObject(series.options.animation),\n                    sharedClipKey;\n\n                // Initialize the animation. Set up the clipping rectangle.\n                if (init) {\n\n                    series.setClip(animation);\n\n                    // Run the animation\n                } else {\n                    sharedClipKey = this.sharedClipKey;\n                    clipRect = chart[sharedClipKey];\n                    if (clipRect) {\n                        clipRect.animate({\n                            width: chart.plotSizeX\n                        }, animation);\n                    }\n                    if (chart[sharedClipKey + 'm']) {\n                        chart[sharedClipKey + 'm'].animate({\n                            width: chart.plotSizeX + 99\n                        }, animation);\n                    }\n\n                    // Delete this function to allow it only once\n                    series.animate = null;\n\n                }\n            },\n\n            /**\n             * This runs after animation to land on the final plot clipping\n             */\n            afterAnimate: function() {\n                this.setClip();\n                fireEvent(this, 'afterAnimate');\n            },\n\n            /**\n             * Draw the markers.\n             *\n             * @function #drawPoints\n             * @memberOf Series\n             * @returns {void}\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart,\n                    plotY,\n                    i,\n                    point,\n                    symbol,\n                    graphic,\n                    options = series.options,\n                    seriesMarkerOptions = options.marker,\n                    pointMarkerOptions,\n                    hasPointMarker,\n                    enabled,\n                    isInside,\n                    markerGroup = series[series.specialGroup] || series.markerGroup,\n                    xAxis = series.xAxis,\n                    markerAttribs,\n                    globallyEnabled = pick(\n                        seriesMarkerOptions.enabled,\n                        xAxis.isRadial ? true : null,\n                        // Use larger or equal as radius is null in bubbles (#6321)\n                        series.closestPointRangePx >= 2 * seriesMarkerOptions.radius\n                    );\n\n                if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {\n\n                    for (i = 0; i < points.length; i++) {\n                        point = points[i];\n                        plotY = point.plotY;\n                        graphic = point.graphic;\n                        pointMarkerOptions = point.marker || {};\n                        hasPointMarker = !!point.marker;\n                        enabled = (globallyEnabled && pointMarkerOptions.enabled === undefined) || pointMarkerOptions.enabled;\n                        isInside = point.isInside;\n\n                        // only draw the point if y is defined\n                        if (enabled && isNumber(plotY) && point.y !== null) {\n\n                            // Shortcuts\n                            symbol = pick(pointMarkerOptions.symbol, series.symbol);\n                            point.hasImage = symbol.indexOf('url') === 0;\n\n                            markerAttribs = series.markerAttribs(\n                                point,\n                                point.selected && 'select'\n                            );\n\n                            if (graphic) { // update\n                                graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled\n                                    .animate(markerAttribs);\n                            } else if (isInside && (markerAttribs.width > 0 || point.hasImage)) {\n                                point.graphic = graphic = chart.renderer.symbol(\n                                        symbol,\n                                        markerAttribs.x,\n                                        markerAttribs.y,\n                                        markerAttribs.width,\n                                        markerAttribs.height,\n                                        hasPointMarker ? pointMarkerOptions : seriesMarkerOptions\n                                    )\n                                    .add(markerGroup);\n                            }\n\n\n\n                            if (graphic) {\n                                graphic.addClass(point.getClassName(), true);\n                            }\n\n                        } else if (graphic) {\n                            point.graphic = graphic.destroy(); // #1269\n                        }\n                    }\n                }\n\n            },\n\n            /**\n             * Get non-presentational attributes for the point.\n             */\n            markerAttribs: function(point, state) {\n                var seriesMarkerOptions = this.options.marker,\n                    seriesStateOptions,\n                    pointMarkerOptions = point.marker || {},\n                    pointStateOptions,\n                    radius = pick(\n                        pointMarkerOptions.radius,\n                        seriesMarkerOptions.radius\n                    ),\n                    attribs;\n\n                // Handle hover and select states\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = pointMarkerOptions.states &&\n                        pointMarkerOptions.states[state];\n\n                    radius = pick(\n                        pointStateOptions && pointStateOptions.radius,\n                        seriesStateOptions && seriesStateOptions.radius,\n                        radius + (seriesStateOptions && seriesStateOptions.radiusPlus || 0)\n                    );\n                }\n\n                if (point.hasImage) {\n                    radius = 0; // and subsequently width and height is not set\n                }\n\n                attribs = {\n                    x: Math.floor(point.plotX) - radius, // Math.floor for #1843\n                    y: point.plotY - radius\n                };\n\n                if (radius) {\n                    attribs.width = attribs.height = 2 * radius;\n                }\n\n                return attribs;\n\n            },\n\n\n            /**\n             * Clear DOM objects and free up memory\n             */\n            destroy: function() {\n                var series = this,\n                    chart = series.chart,\n                    issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent),\n                    destroy,\n                    i,\n                    data = series.data || [],\n                    point,\n                    axis;\n\n                // add event hook\n                fireEvent(series, 'destroy');\n\n                // remove all events\n                removeEvent(series);\n\n                // erase from axes\n                each(series.axisTypes || [], function(AXIS) {\n                    axis = series[AXIS];\n                    if (axis && axis.series) {\n                        erase(axis.series, series);\n                        axis.isDirty = axis.forceRedraw = true;\n                    }\n                });\n\n                // remove legend items\n                if (series.legendItem) {\n                    series.chart.legend.destroyItem(series);\n                }\n\n                // destroy all points with their elements\n                i = data.length;\n                while (i--) {\n                    point = data[i];\n                    if (point && point.destroy) {\n                        point.destroy();\n                    }\n                }\n                series.points = null;\n\n                // Clear the animation timeout if we are destroying the series during initial animation\n                clearTimeout(series.animationTimeout);\n\n                // Destroy all SVGElements associated to the series\n                objectEach(series, function(val, prop) {\n                    if (val instanceof SVGElement && !val.survive) { // Survive provides a hook for not destroying\n\n                        // issue 134 workaround\n                        destroy = issue134 && prop === 'group' ?\n                            'hide' :\n                            'destroy';\n\n                        val[destroy]();\n                    }\n                });\n\n                // remove from hoverSeries\n                if (chart.hoverSeries === series) {\n                    chart.hoverSeries = null;\n                }\n                erase(chart.series, series);\n                chart.orderSeries();\n\n                // clear all members\n                objectEach(series, function(val, prop) {\n                    delete series[prop];\n                });\n            },\n\n            /**\n             * Get the graph path\n             */\n            getGraphPath: function(points, nullsAsZeroes, connectCliffs) {\n                var series = this,\n                    options = series.options,\n                    step = options.step,\n                    reversed,\n                    graphPath = [],\n                    xMap = [],\n                    gap;\n\n                points = points || series.points;\n\n                // Bottom of a stack is reversed\n                reversed = points.reversed;\n                if (reversed) {\n                    points.reverse();\n                }\n                // Reverse the steps (#5004)\n                step = {\n                    right: 1,\n                    center: 2\n                }[step] || (step && 3);\n                if (step && reversed) {\n                    step = 4 - step;\n                }\n\n                // Remove invalid points, especially in spline (#5015)\n                if (options.connectNulls && !nullsAsZeroes && !connectCliffs) {\n                    points = this.getValidPoints(points);\n                }\n\n                // Build the line\n                each(points, function(point, i) {\n\n                    var plotX = point.plotX,\n                        plotY = point.plotY,\n                        lastPoint = points[i - 1],\n                        pathToPoint; // the path to this point from the previous\n\n                    if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) && !connectCliffs) {\n                        gap = true; // ... and continue\n                    }\n\n                    // Line series, nullsAsZeroes is not handled\n                    if (point.isNull && !defined(nullsAsZeroes) && i > 0) {\n                        gap = !options.connectNulls;\n\n                        // Area series, nullsAsZeroes is set\n                    } else if (point.isNull && !nullsAsZeroes) {\n                        gap = true;\n\n                    } else {\n\n                        if (i === 0 || gap) {\n                            pathToPoint = ['M', point.plotX, point.plotY];\n\n                        } else if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object\n\n                            pathToPoint = series.getPointSpline(points, point, i);\n\n                        } else if (step) {\n\n                            if (step === 1) { // right\n                                pathToPoint = [\n                                    'L',\n                                    lastPoint.plotX,\n                                    plotY\n                                ];\n\n                            } else if (step === 2) { // center\n                                pathToPoint = [\n                                    'L',\n                                    (lastPoint.plotX + plotX) / 2,\n                                    lastPoint.plotY,\n                                    'L',\n                                    (lastPoint.plotX + plotX) / 2,\n                                    plotY\n                                ];\n\n                            } else {\n                                pathToPoint = [\n                                    'L',\n                                    plotX,\n                                    lastPoint.plotY\n                                ];\n                            }\n                            pathToPoint.push('L', plotX, plotY);\n\n                        } else {\n                            // normal line to next point\n                            pathToPoint = [\n                                'L',\n                                plotX,\n                                plotY\n                            ];\n                        }\n\n                        // Prepare for animation. When step is enabled, there are two path nodes for each x value.\n                        xMap.push(point.x);\n                        if (step) {\n                            xMap.push(point.x);\n                        }\n\n                        graphPath.push.apply(graphPath, pathToPoint);\n                        gap = false;\n                    }\n                });\n\n                graphPath.xMap = xMap;\n                series.graphPath = graphPath;\n\n                return graphPath;\n\n            },\n\n            /**\n             * Draw the actual graph\n             */\n            drawGraph: function() {\n                var series = this,\n                    options = this.options,\n                    graphPath = (this.gappedPath || this.getGraphPath).call(this),\n                    props = [\n                        [\n                            'graph',\n                            'highcharts-graph'\n\n                        ]\n                    ];\n\n                // Add the zone properties if any\n                each(this.zones, function(zone, i) {\n                    props.push([\n                        'zone-graph-' + i,\n                        'highcharts-graph highcharts-zone-graph-' + i + ' ' + (zone.className || '')\n\n                    ]);\n                });\n\n                // Draw the graph\n                each(props, function(prop, i) {\n                    var graphKey = prop[0],\n                        graph = series[graphKey],\n                        attribs;\n\n                    if (graph) {\n                        graph.endX = graphPath.xMap;\n                        graph.animate({\n                            d: graphPath\n                        });\n\n                    } else if (graphPath.length) { // #1487\n\n                        series[graphKey] = series.chart.renderer.path(graphPath)\n                            .addClass(prop[1])\n                            .attr({\n                                zIndex: 1\n                            }) // #1069\n                            .add(series.group);\n\n\n                    }\n\n                    // Helpers for animation\n                    if (graph) {\n                        graph.startX = graphPath.xMap;\n                        //graph.shiftUnit = options.step ? 2 : 1;\n                        graph.isArea = graphPath.isArea; // For arearange animation\n                    }\n                });\n            },\n\n            /**\n             * Clip the graphs into the positive and negative coloured graphs\n             */\n            applyZones: function() {\n                var series = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    zones = this.zones,\n                    translatedFrom,\n                    translatedTo,\n                    clips = this.clips || [],\n                    clipAttr,\n                    graph = this.graph,\n                    area = this.area,\n                    chartSizeMax = Math.max(chart.chartWidth, chart.chartHeight),\n                    axis = this[(this.zoneAxis || 'y') + 'Axis'],\n                    extremes,\n                    reversed,\n                    inverted = chart.inverted,\n                    horiz,\n                    pxRange,\n                    pxPosMin,\n                    pxPosMax,\n                    ignoreZones = false;\n\n                if (zones.length && (graph || area) && axis && axis.min !== undefined) {\n                    reversed = axis.reversed;\n                    horiz = axis.horiz;\n                    // The use of the Color Threshold assumes there are no gaps\n                    // so it is safe to hide the original graph and area\n                    if (graph) {\n                        graph.hide();\n                    }\n                    if (area) {\n                        area.hide();\n                    }\n\n                    // Create the clips\n                    extremes = axis.getExtremes();\n                    each(zones, function(threshold, i) {\n\n                        translatedFrom = reversed ?\n                            (horiz ? chart.plotWidth : 0) :\n                            (horiz ? 0 : axis.toPixels(extremes.min));\n                        translatedFrom = Math.min(Math.max(pick(translatedTo, translatedFrom), 0), chartSizeMax);\n                        translatedTo = Math.min(Math.max(Math.round(axis.toPixels(pick(threshold.value, extremes.max), true)), 0), chartSizeMax);\n\n                        if (ignoreZones) {\n                            translatedFrom = translatedTo = axis.toPixels(extremes.max);\n                        }\n\n                        pxRange = Math.abs(translatedFrom - translatedTo);\n                        pxPosMin = Math.min(translatedFrom, translatedTo);\n                        pxPosMax = Math.max(translatedFrom, translatedTo);\n                        if (axis.isXAxis) {\n                            clipAttr = {\n                                x: inverted ? pxPosMax : pxPosMin,\n                                y: 0,\n                                width: pxRange,\n                                height: chartSizeMax\n                            };\n                            if (!horiz) {\n                                clipAttr.x = chart.plotHeight - clipAttr.x;\n                            }\n                        } else {\n                            clipAttr = {\n                                x: 0,\n                                y: inverted ? pxPosMax : pxPosMin,\n                                width: chartSizeMax,\n                                height: pxRange\n                            };\n                            if (horiz) {\n                                clipAttr.y = chart.plotWidth - clipAttr.y;\n                            }\n                        }\n\n\n\n                        if (clips[i]) {\n                            clips[i].animate(clipAttr);\n                        } else {\n                            clips[i] = renderer.clipRect(clipAttr);\n\n                            if (graph) {\n                                series['zone-graph-' + i].clip(clips[i]);\n                            }\n\n                            if (area) {\n                                series['zone-area-' + i].clip(clips[i]);\n                            }\n                        }\n                        // if this zone extends out of the axis, ignore the others\n                        ignoreZones = threshold.value > extremes.max;\n                    });\n                    this.clips = clips;\n                }\n            },\n\n            /**\n             * Initialize and perform group inversion on series.group and series.markerGroup\n             */\n            invertGroups: function(inverted) {\n                var series = this,\n                    chart = series.chart,\n                    remover;\n\n                function setInvert() {\n                    each(['group', 'markerGroup'], function(groupName) {\n                        if (series[groupName]) {\n\n                            // VML/HTML needs explicit attributes for flipping\n                            if (chart.renderer.isVML) {\n                                series[groupName].attr({\n                                    width: series.yAxis.len,\n                                    height: series.xAxis.len\n                                });\n                            }\n\n                            series[groupName].width = series.yAxis.len;\n                            series[groupName].height = series.xAxis.len;\n                            series[groupName].invert(inverted);\n                        }\n                    });\n                }\n\n                // Pie, go away (#1736)\n                if (!series.xAxis) {\n                    return;\n                }\n\n                // A fixed size is needed for inversion to work\n                remover = addEvent(chart, 'resize', setInvert);\n                addEvent(series, 'destroy', remover);\n\n                // Do it now\n                setInvert(inverted); // do it now\n\n                // On subsequent render and redraw, just do setInvert without setting up events again\n                series.invertGroups = setInvert;\n            },\n\n            /**\n             * General abstraction for creating plot groups like series.group,\n             * series.dataLabelsGroup and series.markerGroup. On subsequent calls, the\n             * group will only be adjusted to the updated plot size.\n             */\n            plotGroup: function(prop, name, visibility, zIndex, parent) {\n                var group = this[prop],\n                    isNew = !group;\n\n                // Generate it on first call\n                if (isNew) {\n                    this[prop] = group = this.chart.renderer.g()\n                        .attr({\n                            zIndex: zIndex || 0.1 // IE8 and pointer logic use this\n                        })\n                        .add(parent);\n\n                }\n\n                // Add the class names, and replace existing ones as response to\n                // Series.update (#6660)\n                group.addClass(\n                    (\n                        'highcharts-' + name +\n                        ' highcharts-series-' + this.index +\n                        ' highcharts-' + this.type + '-series ' +\n                        'highcharts-color-' + this.colorIndex + ' ' +\n                        (this.options.className || '')\n                    ),\n                    true\n                );\n\n                // Place it on first and subsequent (redraw) calls\n                group.attr({\n                    visibility: visibility\n                })[isNew ? 'attr' : 'animate'](\n                    this.getPlotBox()\n                );\n                return group;\n            },\n\n            /**\n             * Get the translation and scale for the plot area of this series\n             */\n            getPlotBox: function() {\n                var chart = this.chart,\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis;\n\n                // Swap axes for inverted (#2339)\n                if (chart.inverted) {\n                    xAxis = yAxis;\n                    yAxis = this.xAxis;\n                }\n                return {\n                    translateX: xAxis ? xAxis.left : chart.plotLeft,\n                    translateY: yAxis ? yAxis.top : chart.plotTop,\n                    scaleX: 1, // #1623\n                    scaleY: 1\n                };\n            },\n\n            /**\n             * Render the graph and markers\n             */\n            render: function() {\n                var series = this,\n                    chart = series.chart,\n                    group,\n                    options = series.options,\n                    // Animation doesn't work in IE8 quirks when the group div is\n                    // hidden, and looks bad in other oldIE\n                    animDuration = (!!series.animate &&\n                        chart.renderer.isSVG &&\n                        animObject(options.animation).duration\n                    ),\n                    visibility = series.visible ? 'inherit' : 'hidden', // #2597\n                    zIndex = options.zIndex,\n                    hasRendered = series.hasRendered,\n                    chartSeriesGroup = chart.seriesGroup,\n                    inverted = chart.inverted;\n\n                // the group\n                group = series.plotGroup(\n                    'group',\n                    'series',\n                    visibility,\n                    zIndex,\n                    chartSeriesGroup\n                );\n\n                series.markerGroup = series.plotGroup(\n                    'markerGroup',\n                    'markers',\n                    visibility,\n                    zIndex,\n                    chartSeriesGroup\n                );\n\n                // initiate the animation\n                if (animDuration) {\n                    series.animate(true);\n                }\n\n                // SVGRenderer needs to know this before drawing elements (#1089, #1795)\n                group.inverted = series.isCartesian ? inverted : false;\n\n                // draw the graph if any\n                if (series.drawGraph) {\n                    series.drawGraph();\n                    series.applyZones();\n                }\n\n                /*\t\teach(series.points, function (point) {\n                \t\t\tif (point.redraw) {\n                \t\t\t\tpoint.redraw();\n                \t\t\t}\n                \t\t});*/\n\n                // draw the data labels (inn pies they go before the points)\n                if (series.drawDataLabels) {\n                    series.drawDataLabels();\n                }\n\n                // draw the points\n                if (series.visible) {\n                    series.drawPoints();\n                }\n\n\n                // draw the mouse tracking area\n                if (\n                    series.drawTracker &&\n                    series.options.enableMouseTracking !== false\n                ) {\n                    series.drawTracker();\n                }\n\n                // Handle inverted series and tracker groups\n                series.invertGroups(inverted);\n\n                // Initial clipping, must be defined after inverting groups for VML.\n                // Applies to columns etc. (#3839).\n                if (options.clip !== false && !series.sharedClipKey && !hasRendered) {\n                    group.clip(chart.clipRect);\n                }\n\n                // Run the animation\n                if (animDuration) {\n                    series.animate();\n                }\n\n                // Call the afterAnimate function on animation complete (but don't\n                // overwrite the animation.complete option which should be available to\n                // the user).\n                if (!hasRendered) {\n                    series.animationTimeout = syncTimeout(function() {\n                        series.afterAnimate();\n                    }, animDuration);\n                }\n\n                series.isDirty = false; // means data is in accordance with what you see\n                // (See #322) series.isDirty = series.isDirtyData = false; // means\n                // data is in accordance with what you see\n                series.hasRendered = true;\n            },\n\n            /**\n             * Redraw the series after an update in the axes.\n             */\n            redraw: function() {\n                var series = this,\n                    chart = series.chart,\n                    // cache it here as it is set to false in render, but used after\n                    wasDirty = series.isDirty || series.isDirtyData,\n                    group = series.group,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n\n                // reposition on resize\n                if (group) {\n                    if (chart.inverted) {\n                        group.attr({\n                            width: chart.plotWidth,\n                            height: chart.plotHeight\n                        });\n                    }\n\n                    group.animate({\n                        translateX: pick(xAxis && xAxis.left, chart.plotLeft),\n                        translateY: pick(yAxis && yAxis.top, chart.plotTop)\n                    });\n                }\n\n                series.translate();\n                series.render();\n                if (wasDirty) { // #3868, #3945\n                    delete this.kdTree;\n                }\n            },\n\n            /**\n             * KD Tree && PointSearching Implementation\n             */\n\n            kdAxisArray: ['clientX', 'plotY'],\n\n            searchPoint: function(e, compareX) {\n                var series = this,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    inverted = series.chart.inverted;\n\n                return this.searchKDTree({\n                    clientX: inverted ?\n                        xAxis.len - e.chartY + xAxis.pos : e.chartX - xAxis.pos,\n                    plotY: inverted ?\n                        yAxis.len - e.chartX + yAxis.pos : e.chartY - yAxis.pos\n                }, compareX);\n            },\n\n            /**\n             * Build the k-d-tree that is used by mouse and touch interaction to get the\n             * closest point. Line-like series typically have a one-dimensional tree \n             * where points are searched along the X axis, while scatter-like series\n             * typically search in two dimensions, X and Y.\n             */\n            buildKDTree: function() {\n\n                // Prevent multiple k-d-trees from being built simultaneously (#6235)\n                this.buildingKdTree = true;\n\n                var series = this,\n                    dimensions = series.options.findNearestPointBy.indexOf('y') > -1 ?\n                    2 : 1;\n\n                // Internal function\n                function _kdtree(points, depth, dimensions) {\n                    var axis,\n                        median,\n                        length = points && points.length;\n\n                    if (length) {\n\n                        // alternate between the axis\n                        axis = series.kdAxisArray[depth % dimensions];\n\n                        // sort point array\n                        points.sort(function(a, b) {\n                            return a[axis] - b[axis];\n                        });\n\n                        median = Math.floor(length / 2);\n\n                        // build and return nod\n                        return {\n                            point: points[median],\n                            left: _kdtree(\n                                points.slice(0, median), depth + 1, dimensions\n                            ),\n                            right: _kdtree(\n                                points.slice(median + 1), depth + 1, dimensions\n                            )\n                        };\n\n                    }\n                }\n\n                // Start the recursive build process with a clone of the points array\n                // and null points filtered out (#3873)\n                function startRecursive() {\n                    series.kdTree = _kdtree(\n                        series.getValidPoints(\n                            null,\n                            // For line-type series restrict to plot area, but\n                            // column-type series not (#3916, #4511)\n                            !series.directTouch\n                        ),\n                        dimensions,\n                        dimensions\n                    );\n                    series.buildingKdTree = false;\n                }\n                delete series.kdTree;\n\n                // For testing tooltips, don't build async\n                syncTimeout(startRecursive, series.options.kdNow ? 0 : 1);\n            },\n\n            searchKDTree: function(point, compareX) {\n                var series = this,\n                    kdX = this.kdAxisArray[0],\n                    kdY = this.kdAxisArray[1],\n                    kdComparer = compareX ? 'distX' : 'dist',\n                    kdDimensions = series.options.findNearestPointBy.indexOf('y') > -1 ?\n                    2 : 1;\n\n                // Set the one and two dimensional distance on the point object\n                function setDistance(p1, p2) {\n                    var x = (defined(p1[kdX]) && defined(p2[kdX])) ?\n                        Math.pow(p1[kdX] - p2[kdX], 2) :\n                        null,\n                        y = (defined(p1[kdY]) && defined(p2[kdY])) ?\n                        Math.pow(p1[kdY] - p2[kdY], 2) :\n                        null,\n                        r = (x || 0) + (y || 0);\n\n                    p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;\n                    p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;\n                }\n\n                function _search(search, tree, depth, dimensions) {\n                    var point = tree.point,\n                        axis = series.kdAxisArray[depth % dimensions],\n                        tdist,\n                        sideA,\n                        sideB,\n                        ret = point,\n                        nPoint1,\n                        nPoint2;\n\n                    setDistance(search, point);\n\n                    // Pick side based on distance to splitting point\n                    tdist = search[axis] - point[axis];\n                    sideA = tdist < 0 ? 'left' : 'right';\n                    sideB = tdist < 0 ? 'right' : 'left';\n\n                    // End of tree\n                    if (tree[sideA]) {\n                        nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);\n\n                        ret = (nPoint1[kdComparer] < ret[kdComparer] ? nPoint1 : point);\n                    }\n                    if (tree[sideB]) {\n                        // compare distance to current best to splitting point to decide\n                        // wether to check side B or not\n                        if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n                            nPoint2 = _search(\n                                search,\n                                tree[sideB],\n                                depth + 1,\n                                dimensions\n                            );\n                            ret = nPoint2[kdComparer] < ret[kdComparer] ?\n                                nPoint2 :\n                                ret;\n                        }\n                    }\n\n                    return ret;\n                }\n\n                if (!this.kdTree && !this.buildingKdTree) {\n                    this.buildKDTree();\n                }\n\n                if (this.kdTree) {\n                    return _search(point, this.kdTree, kdDimensions, kdDimensions);\n                }\n            }\n\n        }); // end Series prototype\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            Chart = H.Chart,\n            correctFloat = H.correctFloat,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            each = H.each,\n            format = H.format,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            Series = H.Series;\n\n        /**\n         * The class for stacks. Each stack, on a specific X value and either negative\n         * or positive, has its own stack item.\n         *\n         * @class\n         */\n        function StackItem(axis, options, isNegative, x, stackOption) {\n\n            var inverted = axis.chart.inverted;\n\n            this.axis = axis;\n\n            // Tells if the stack is negative\n            this.isNegative = isNegative;\n\n            // Save the options to be able to style the label\n            this.options = options;\n\n            // Save the x value to be able to position the label later\n            this.x = x;\n\n            // Initialize total value\n            this.total = null;\n\n            // This will keep each points' extremes stored by series.index and point \n            // index\n            this.points = {};\n\n            // Save the stack option on the series configuration object, and whether to \n            // treat it as percent\n            this.stack = stackOption;\n            this.leftCliff = 0;\n            this.rightCliff = 0;\n\n            // The align options and text align varies on whether the stack is negative \n            // and if the chart is inverted or not.\n            // First test the user supplied value, then use the dynamic.\n            this.alignOptions = {\n                align: options.align ||\n                    (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n                verticalAlign: options.verticalAlign ||\n                    (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n                y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),\n                x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)\n            };\n\n            this.textAlign = options.textAlign ||\n                (inverted ? (isNegative ? 'right' : 'left') : 'center');\n        }\n\n        StackItem.prototype = {\n            destroy: function() {\n                destroyObjectProperties(this, this.axis);\n            },\n\n            /**\n             * Renders the stack total label and adds it to the stack label group.\n             */\n            render: function(group) {\n                var options = this.options,\n                    formatOption = options.format,\n                    str = formatOption ?\n                    format(formatOption, this) :\n                    options.formatter.call(this); // format the text in the label\n\n                // Change the text to reflect the new total and set visibility to hidden\n                // in case the serie is hidden\n                if (this.label) {\n                    this.label.attr({\n                        text: str,\n                        visibility: 'hidden'\n                    });\n                    // Create new label\n                } else {\n                    this.label =\n                        this.axis.chart.renderer.text(str, null, null, options.useHTML)\n                        .css(options.style)\n                        .attr({\n                            align: this.textAlign,\n                            rotation: options.rotation,\n                            visibility: 'hidden' // hidden until setOffset is called\n                        })\n                        .add(group); // add to the labels-group\n                }\n            },\n\n            /**\n             * Sets the offset that the stack has from the x value and repositions the\n             * label.\n             */\n            setOffset: function(xOffset, xWidth) {\n                var stackItem = this,\n                    axis = stackItem.axis,\n                    chart = axis.chart,\n                    inverted = chart.inverted,\n                    reversed = axis.reversed,\n                    neg = (this.isNegative && !reversed) ||\n                    (!this.isNegative && reversed), // #4056\n                    // stack value translated mapped to chart coordinates\n                    y = axis.translate(\n                        axis.usePercentage ? 100 : this.total,\n                        0,\n                        0,\n                        0,\n                        1\n                    ),\n                    yZero = axis.translate(0), // stack origin\n                    h = Math.abs(y - yZero), // stack height\n                    x = chart.xAxis[0].translate(this.x) + xOffset, // stack x position\n                    plotHeight = chart.plotHeight,\n                    stackBox = { // this is the box for the complete stack\n                        x: inverted ? (neg ? y : y - h) : x,\n                        y: inverted ?\n                            plotHeight - x - xWidth : (neg ? (plotHeight - y - h) :\n                                plotHeight - y),\n                        width: inverted ? h : xWidth,\n                        height: inverted ? xWidth : h\n                    },\n                    label = this.label,\n                    alignAttr;\n\n                if (label) {\n                    // Align the label to the box\n                    label.align(this.alignOptions, null, stackBox);\n\n                    // Set visibility (#678)\n                    alignAttr = label.alignAttr;\n                    label[\n                        this.options.crop === false || chart.isInsidePlot(\n                            alignAttr.x,\n                            alignAttr.y\n                        ) ? 'show' : 'hide'](true);\n                }\n            }\n        };\n\n        /**\n         * Generate stacks for each series and calculate stacks total values\n         */\n        Chart.prototype.getStacks = function() {\n            var chart = this;\n\n            // reset stacks for each yAxis\n            each(chart.yAxis, function(axis) {\n                if (axis.stacks && axis.hasVisibleSeries) {\n                    axis.oldStacks = axis.stacks;\n                }\n            });\n\n            each(chart.series, function(series) {\n                if (series.options.stacking && (series.visible === true ||\n                        chart.options.chart.ignoreHiddenSeries === false)) {\n                    series.stackKey = series.type + pick(series.options.stack, '');\n                }\n            });\n        };\n\n\n        // Stacking methods defined on the Axis prototype\n\n        /**\n         * Build the stacks from top down\n         */\n        Axis.prototype.buildStacks = function() {\n            var axisSeries = this.series,\n                series,\n                reversedStacks = pick(this.options.reversedStacks, true),\n                len = axisSeries.length,\n                i;\n            if (!this.isXAxis) {\n                this.usePercentage = false;\n                i = len;\n                while (i--) {\n                    axisSeries[reversedStacks ? i : len - i - 1].setStackedPoints();\n                }\n\n                i = len;\n                while (i--) {\n                    series = axisSeries[reversedStacks ? i : len - i - 1];\n                    if (series.setStackCliffs) {\n                        series.setStackCliffs();\n                    }\n                }\n                // Loop up again to compute percent stack\n                if (this.usePercentage) {\n                    for (i = 0; i < len; i++) {\n                        axisSeries[i].setPercentStacks();\n                    }\n                }\n            }\n        };\n\n        Axis.prototype.renderStackTotals = function() {\n            var axis = this,\n                chart = axis.chart,\n                renderer = chart.renderer,\n                stacks = axis.stacks,\n                stackTotalGroup = axis.stackTotalGroup;\n\n            // Create a separate group for the stack total labels\n            if (!stackTotalGroup) {\n                axis.stackTotalGroup = stackTotalGroup =\n                    renderer.g('stack-labels')\n                    .attr({\n                        visibility: 'visible',\n                        zIndex: 6\n                    })\n                    .add();\n            }\n\n            // plotLeft/Top will change when y axis gets wider so we need to translate\n            // the stackTotalGroup at every render call. See bug #506 and #516\n            stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n\n            // Render each stack total\n            objectEach(stacks, function(type) {\n                objectEach(type, function(stack) {\n                    stack.render(stackTotalGroup);\n                });\n            });\n        };\n\n        /**\n         * Set all the stacks to initial states and destroy unused ones.\n         */\n        Axis.prototype.resetStacks = function() {\n            var axis = this,\n                stacks = axis.stacks;\n            if (!axis.isXAxis) {\n                objectEach(stacks, function(type) {\n                    objectEach(type, function(stack, key) {\n                        // Clean up memory after point deletion (#1044, #4320)\n                        if (stack.touched < axis.stacksTouched) {\n                            stack.destroy();\n                            delete type[key];\n\n                            // Reset stacks\n                        } else {\n                            stack.total = null;\n                            stack.cum = null;\n                        }\n                    });\n                });\n            }\n        };\n\n        Axis.prototype.cleanStacks = function() {\n            var stacks;\n\n            if (!this.isXAxis) {\n                if (this.oldStacks) {\n                    stacks = this.stacks = this.oldStacks;\n                }\n\n                // reset stacks\n                objectEach(stacks, function(type) {\n                    objectEach(type, function(stack) {\n                        stack.cum = stack.total;\n                    });\n                });\n            }\n        };\n\n\n        // Stacking methods defnied for Series prototype\n\n        /**\n         * Adds series' points value to corresponding stack\n         */\n        Series.prototype.setStackedPoints = function() {\n            if (!this.options.stacking || (this.visible !== true &&\n                    this.chart.options.chart.ignoreHiddenSeries !== false)) {\n                return;\n            }\n\n            var series = this,\n                xData = series.processedXData,\n                yData = series.processedYData,\n                stackedYData = [],\n                yDataLength = yData.length,\n                seriesOptions = series.options,\n                threshold = seriesOptions.threshold,\n                stackThreshold = seriesOptions.startFromThreshold ? threshold : 0,\n                stackOption = seriesOptions.stack,\n                stacking = seriesOptions.stacking,\n                stackKey = series.stackKey,\n                negKey = '-' + stackKey,\n                negStacks = series.negStacks,\n                yAxis = series.yAxis,\n                stacks = yAxis.stacks,\n                oldStacks = yAxis.oldStacks,\n                stackIndicator,\n                isNegative,\n                stack,\n                other,\n                key,\n                pointKey,\n                i,\n                x,\n                y;\n\n\n            yAxis.stacksTouched += 1;\n\n            // loop over the non-null y values and read them into a local array\n            for (i = 0; i < yDataLength; i++) {\n                x = xData[i];\n                y = yData[i];\n                stackIndicator = series.getStackIndicator(\n                    stackIndicator,\n                    x,\n                    series.index\n                );\n                pointKey = stackIndicator.key;\n                // Read stacked values into a stack based on the x value,\n                // the sign of y and the stack key. Stacking is also handled for null\n                // values (#739)\n                isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n                key = isNegative ? negKey : stackKey;\n\n                // Create empty object for this stack if it doesn't exist yet\n                if (!stacks[key]) {\n                    stacks[key] = {};\n                }\n\n                // Initialize StackItem for this x\n                if (!stacks[key][x]) {\n                    if (oldStacks[key] && oldStacks[key][x]) {\n                        stacks[key][x] = oldStacks[key][x];\n                        stacks[key][x].total = null;\n                    } else {\n                        stacks[key][x] = new StackItem(\n                            yAxis,\n                            yAxis.options.stackLabels,\n                            isNegative,\n                            x,\n                            stackOption\n                        );\n                    }\n                }\n\n                // If the StackItem doesn't exist, create it first\n                stack = stacks[key][x];\n                if (y !== null) {\n                    stack.points[pointKey] = stack.points[series.index] = [pick(stack.cum, stackThreshold)];\n\n                    // Record the base of the stack\n                    if (!defined(stack.cum)) {\n                        stack.base = pointKey;\n                    }\n                    stack.touched = yAxis.stacksTouched;\n\n\n                    // In area charts, if there are multiple points on the same X value,\n                    // let the area fill the full span of those points\n                    if (stackIndicator.index > 0 && series.singleStacks === false) {\n                        stack.points[pointKey][0] =\n                            stack.points[series.index + ',' + x + ',0'][0];\n                    }\n                }\n\n                // Add value to the stack total\n                if (stacking === 'percent') {\n\n                    // Percent stacked column, totals are the same for the positive and\n                    // negative stacks\n                    other = isNegative ? stackKey : negKey;\n                    if (negStacks && stacks[other] && stacks[other][x]) {\n                        other = stacks[other][x];\n                        stack.total = other.total =\n                            Math.max(other.total, stack.total) + Math.abs(y) || 0;\n\n                        // Percent stacked areas\n                    } else {\n                        stack.total = correctFloat(stack.total + (Math.abs(y) || 0));\n                    }\n                } else {\n                    stack.total = correctFloat(stack.total + (y || 0));\n                }\n\n                stack.cum = pick(stack.cum, stackThreshold) + (y || 0);\n\n                if (y !== null) {\n                    stack.points[pointKey].push(stack.cum);\n                    stackedYData[i] = stack.cum;\n                }\n\n            }\n\n            if (stacking === 'percent') {\n                yAxis.usePercentage = true;\n            }\n\n            this.stackedYData = stackedYData; // To be used in getExtremes\n\n            // Reset old stacks\n            yAxis.oldStacks = {};\n        };\n\n        /**\n         * Iterate over all stacks and compute the absolute values to percent\n         */\n        Series.prototype.setPercentStacks = function() {\n            var series = this,\n                stackKey = series.stackKey,\n                stacks = series.yAxis.stacks,\n                processedXData = series.processedXData,\n                stackIndicator;\n\n            each([stackKey, '-' + stackKey], function(key) {\n                var i = processedXData.length,\n                    x,\n                    stack,\n                    pointExtremes,\n                    totalFactor;\n\n                while (i--) {\n                    x = processedXData[i];\n                    stackIndicator = series.getStackIndicator(\n                        stackIndicator,\n                        x,\n                        series.index,\n                        key\n                    );\n                    stack = stacks[key] && stacks[key][x];\n                    pointExtremes = stack && stack.points[stackIndicator.key];\n                    if (pointExtremes) {\n                        totalFactor = stack.total ? 100 / stack.total : 0;\n                        // Y bottom value\n                        pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor);\n                        // Y value\n                        pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor);\n                        series.stackedYData[i] = pointExtremes[1];\n                    }\n                }\n            });\n        };\n\n        /**\n         * Get stack indicator, according to it's x-value, to determine points with the\n         * same x-value\n         */\n        Series.prototype.getStackIndicator = function(stackIndicator, x, index, key) {\n            // Update stack indicator, when:\n            // first point in a stack || x changed || stack type (negative vs positive)\n            // changed:\n            if (!defined(stackIndicator) || stackIndicator.x !== x ||\n                (key && stackIndicator.key !== key)) {\n                stackIndicator = {\n                    x: x,\n                    index: 0,\n                    key: key\n                };\n            } else {\n                stackIndicator.index++;\n            }\n\n            stackIndicator.key = [index, x, stackIndicator.index].join(',');\n\n            return stackIndicator;\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            animate = H.animate,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            createElement = H.createElement,\n            css = H.css,\n            defined = H.defined,\n            each = H.each,\n            erase = H.erase,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            inArray = H.inArray,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            isArray = H.isArray,\n            merge = H.merge,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            setAnimation = H.setAnimation,\n            splat = H.splat;\n\n        // Extend the Chart prototype for dynamic methods\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n            /**\n             * Add a series to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initiated, add the series as a configuration\n             * option instead. With multiple axes, the `offset` is dynamically adjusted.\n             *\n             * @param  {SeriesOptions} options\n             *         The config options for the series.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after adding.\n             * @param  {AnimationOptions} animation\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @return {Highcharts.Series}\n             *         The newly created series object.\n             *\n             * @sample highcharts/members/chart-addseries/\n             *         Add a series from a button\n             * @sample stock/members/chart-addseries/\n             *         Add a series in Highstock\n             */\n            addSeries: function(options, redraw, animation) {\n                var series,\n                    chart = this;\n\n                if (options) {\n                    redraw = pick(redraw, true); // defaults to true\n\n                    fireEvent(chart, 'addSeries', {\n                        options: options\n                    }, function() {\n                        series = chart.initSeries(options);\n\n                        chart.isDirtyLegend = true; // the series array is out of sync with the display\n                        chart.linkSeries();\n                        if (redraw) {\n                            chart.redraw(animation);\n                        }\n                    });\n                }\n\n                return series;\n            },\n\n            /**\n             * Add an axis to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initiated, add the axis as a configuration\n             * option instead.\n             * @param  {AxisOptions} options\n             *         The axis options.\n             * @param  {Boolean} [isX=false]\n             *         Whether it is an X axis or a value axis.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after adding.\n             * @param  {AnimationOptions} [animation=true]\n             *         Whether and how to apply animation in the redraw.\n             *\n             * @sample highcharts/members/chart-addaxis/ Add and remove axes\n             */\n            addAxis: function(options, isX, redraw, animation) {\n                var key = isX ? 'xAxis' : 'yAxis',\n                    chartOptions = this.options,\n                    userOptions = merge(options, {\n                        index: this[key].length,\n                        isX: isX\n                    });\n\n                new Axis(this, userOptions); // eslint-disable-line no-new\n\n                // Push the new axis options to the chart options\n                chartOptions[key] = splat(chartOptions[key] || {});\n                chartOptions[key].push(userOptions);\n\n                if (pick(redraw, true)) {\n                    this.redraw(animation);\n                }\n            },\n\n            /**\n             * Dim the chart and show a loading text or symbol. Options for the loading\n             * screen are defined in {@link\n             * https://api.highcharts.com/highcharts/loading|the loading options}.\n             * \n             * @param  {String} str\n             *         An optional text to show in the loading label instead of the\n             *         default one. The default text is set in {@link\n             *         http://api.highcharts.com/highcharts/lang.loading|lang.loading}.\n             *\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample highcharts/members/chart-showloading/\n             *         Apply different text labels\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             */\n            showLoading: function(str) {\n                var chart = this,\n                    options = chart.options,\n                    loadingDiv = chart.loadingDiv,\n                    loadingOptions = options.loading,\n                    setLoadingSize = function() {\n                        if (loadingDiv) {\n                            css(loadingDiv, {\n                                left: chart.plotLeft + 'px',\n                                top: chart.plotTop + 'px',\n                                width: chart.plotWidth + 'px',\n                                height: chart.plotHeight + 'px'\n                            });\n                        }\n                    };\n\n                // create the layer at the first call\n                if (!loadingDiv) {\n                    chart.loadingDiv = loadingDiv = createElement('div', {\n                        className: 'highcharts-loading highcharts-loading-hidden'\n                    }, null, chart.container);\n\n                    chart.loadingSpan = createElement(\n                        'span', {\n                            className: 'highcharts-loading-inner'\n                        },\n                        null,\n                        loadingDiv\n                    );\n                    addEvent(chart, 'redraw', setLoadingSize); // #1080\n                }\n\n                loadingDiv.className = 'highcharts-loading';\n\n                // Update text\n                chart.loadingSpan.innerHTML = str || options.lang.loading;\n\n\n\n                chart.loadingShown = true;\n                setLoadingSize();\n            },\n\n            /**\n             * Hide the loading layer.\n             *\n             * @see    Highcharts.Chart#showLoading\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             */\n            hideLoading: function() {\n                var options = this.options,\n                    loadingDiv = this.loadingDiv;\n\n                if (loadingDiv) {\n                    loadingDiv.className = 'highcharts-loading highcharts-loading-hidden';\n\n                }\n                this.loadingShown = false;\n            },\n\n            /** \n             * These properties cause isDirtyBox to be set to true when updating. Can be extended from plugins.\n             */\n            propsRequireDirtyBox: ['backgroundColor', 'borderColor', 'borderWidth', 'margin', 'marginTop', 'marginRight',\n                'marginBottom', 'marginLeft', 'spacing', 'spacingTop', 'spacingRight', 'spacingBottom', 'spacingLeft',\n                'borderRadius', 'plotBackgroundColor', 'plotBackgroundImage', 'plotBorderColor', 'plotBorderWidth',\n                'plotShadow', 'shadow'\n            ],\n\n            /** \n             * These properties cause all series to be updated when updating. Can be\n             * extended from plugins.\n             */\n            propsRequireUpdateSeries: ['chart.inverted', 'chart.polar',\n                'chart.ignoreHiddenSeries', 'chart.type', 'colors', 'plotOptions',\n                'tooltip'\n            ],\n\n            /**\n             * A generic function to update any element of the chart. Elements can be\n             * enabled and disabled, moved, re-styled, re-formatted etc.\n             *\n             * A special case is configuration objects that take arrays, for example\n             * {@link https://api.highcharts.com/highcharts/xAxis|xAxis}, \n             * {@link https://api.highcharts.com/highcharts/yAxis|yAxis} or \n             * {@link https://api.highcharts.com/highcharts/series|series}. For these\n             * collections, an `id` option is used to map the new option set to an\n             * existing object. If an existing object of the same id is not found, the\n             * corresponding item is updated. So for example, running `chart.update`\n             * with a series item without an id, will cause the existing chart's series\n             * with the same index in the series array to be updated.\n             *\n             * See also the {@link https://api.highcharts.com/highcharts/responsive|\n             * responsive option set}. Switching between `responsive.rules` basically\n             * runs `chart.update` under the hood.\n             *\n             * @param  {Options} options\n             *         A configuration object for the new chart options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart.\n             *\n             * @sample highcharts/members/chart-update/\n             *         Update chart geometry \n             */\n            update: function(options, redraw) {\n                var chart = this,\n                    adders = {\n                        credits: 'addCredits',\n                        title: 'setTitle',\n                        subtitle: 'setSubtitle'\n                    },\n                    optionsChart = options.chart,\n                    updateAllAxes,\n                    updateAllSeries,\n                    newWidth,\n                    newHeight;\n\n                // If the top-level chart option is present, some special updates are required\t\t\n                if (optionsChart) {\n                    merge(true, chart.options.chart, optionsChart);\n\n                    // Setter function\n                    if ('className' in optionsChart) {\n                        chart.setClassName(optionsChart.className);\n                    }\n\n                    if ('inverted' in optionsChart || 'polar' in optionsChart) {\n                        // Parse options.chart.inverted and options.chart.polar together\n                        // with the available series.\n                        chart.propFromSeries();\n                        updateAllAxes = true;\n                    }\n\n                    if ('alignTicks' in optionsChart) { // #6452\n                        updateAllAxes = true;\n                    }\n\n                    objectEach(optionsChart, function(val, key) {\n                        if (inArray('chart.' + key, chart.propsRequireUpdateSeries) !== -1) {\n                            updateAllSeries = true;\n                        }\n                        // Only dirty box\n                        if (inArray(key, chart.propsRequireDirtyBox) !== -1) {\n                            chart.isDirtyBox = true;\n                        }\n                    });\n\n\n                }\n\n                // Moved up, because tooltip needs updated plotOptions (#6218)\n\n\n                if (options.plotOptions) {\n                    merge(true, this.options.plotOptions, options.plotOptions);\n                }\n\n                // Some option stuctures correspond one-to-one to chart objects that\n                // have update methods, for example\n                // options.credits => chart.credits\n                // options.legend => chart.legend\n                // options.title => chart.title\n                // options.tooltip => chart.tooltip\n                // options.subtitle => chart.subtitle\n                // options.mapNavigation => chart.mapNavigation\n                // options.navigator => chart.navigator\n                // options.scrollbar => chart.scrollbar\n                objectEach(options, function(val, key) {\n                    if (chart[key] && typeof chart[key].update === 'function') {\n                        chart[key].update(val, false);\n\n                        // If a one-to-one object does not exist, look for an adder function\n                    } else if (typeof chart[adders[key]] === 'function') {\n                        chart[adders[key]](val);\n                    }\n\n                    if (\n                        key !== 'chart' &&\n                        inArray(key, chart.propsRequireUpdateSeries) !== -1\n                    ) {\n                        updateAllSeries = true;\n                    }\n                });\n\n                // Setters for collections. For axes and series, each item is referred\n                // by an id. If the id is not found, it defaults to the corresponding\n                // item in the collection, so setting one series without an id, will\n                // update the first series in the chart. Setting two series without\n                // an id will update the first and the second respectively (#6019)\n                // chart.update and responsive.\n                each([\n                    'xAxis',\n                    'yAxis',\n                    'zAxis',\n                    'series',\n                    'colorAxis',\n                    'pane'\n                ], function(coll) {\n                    if (options[coll]) {\n                        each(splat(options[coll]), function(newOptions, i) {\n                            var item = (\n                                defined(newOptions.id) &&\n                                chart.get(newOptions.id)\n                            ) || chart[coll][i];\n                            if (item && item.coll === coll) {\n                                item.update(newOptions, false);\n                            }\n                        });\n                    }\n                });\n\n                if (updateAllAxes) {\n                    each(chart.axes, function(axis) {\n                        axis.update({}, false);\n                    });\n                }\n\n                // Certain options require the whole series structure to be thrown away\n                // and rebuilt\n                if (updateAllSeries) {\n                    each(chart.series, function(series) {\n                        series.update({}, false);\n                    });\n                }\n\n                // For loading, just update the options, do not redraw\n                if (options.loading) {\n                    merge(true, chart.options.loading, options.loading);\n                }\n\n                // Update size. Redraw is forced.\n                newWidth = optionsChart && optionsChart.width;\n                newHeight = optionsChart && optionsChart.height;\n                if ((isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n                    (isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n                    chart.setSize(newWidth, newHeight);\n                } else if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Setter function to allow use from chart.update\n             */\n            setSubtitle: function(options) {\n                this.setTitle(undefined, options);\n            }\n\n\n        });\n\n        // extend the Point prototype for dynamic methods\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Update point with new options (typically x/y data) and optionally redraw\n             * the series.\n             *\n             * @param  {Object} options\n             *         The point options. Point options are handled as described under\n             *         the `series<type>.data` item for each series type. For example\n             *         for a line series, if options is a single number, the point will\n             *         be given that number as the main y value. If it is an array, it\n             *         will be interpreted as x and y values respectively. If it is an\n             *         object, advanced options are applied. \n             * @param  {Boolean} [redraw=true]\n             *          Whether to redraw the chart after the point is updated. If doing\n             *          more operations on the chart, it is best practice to set\n             *          `redraw` to false and call `chart.redraw()` after.\n             * @param  {AnimationOptions} [animation=true]\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @sample highcharts/members/point-update-column/\n             *         Update column value\n             * @sample highcharts/members/point-update-pie/\n             *         Update pie slice\n             * @sample maps/members/point-update/\n             *         Update map area value in Highmaps\n             */\n            update: function(options, redraw, animation, runEvent) {\n                var point = this,\n                    series = point.series,\n                    graphic = point.graphic,\n                    i,\n                    chart = series.chart,\n                    seriesOptions = series.options;\n\n                redraw = pick(redraw, true);\n\n                function update() {\n\n                    point.applyOptions(options);\n\n                    // Update visuals\n                    if (point.y === null && graphic) { // #4146\n                        point.graphic = graphic.destroy();\n                    }\n                    if (isObject(options, true)) {\n                        // Destroy so we can get new elements\n                        if (graphic && graphic.element) {\n                            if (options && options.marker && options.marker.symbol) {\n                                point.graphic = graphic.destroy();\n                            }\n                        }\n                        if (options && options.dataLabels && point.dataLabel) { // #2468\n                            point.dataLabel = point.dataLabel.destroy();\n                        }\n                    }\n\n                    // record changes in the parallel arrays\n                    i = point.index;\n                    series.updateParallelArrays(point, i);\n\n                    // Record the options to options.data. If the old or the new config\n                    // is an object, use point options, otherwise use raw options\n                    // (#4701, #4916).\n                    seriesOptions.data[i] = (\n                            isObject(seriesOptions.data[i], true) ||\n                            isObject(options, true)\n                        ) ?\n                        point.options :\n                        options;\n\n                    // redraw\n                    series.isDirty = series.isDirtyData = true;\n                    if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n                        chart.isDirtyBox = true;\n                    }\n\n                    if (seriesOptions.legendType === 'point') { // #1831, #1885\n                        chart.isDirtyLegend = true;\n                    }\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                }\n\n                // Fire the event with a default handler of doing the update\n                if (runEvent === false) { // When called from setData\n                    update();\n                } else {\n                    point.firePointEvent('update', {\n                        options: options\n                    }, update);\n                }\n            },\n\n            /**\n             * Remove a point and optionally redraw the series and if necessary the axes\n             * @param  {Boolean} redraw\n             *         Whether to redraw the chart or wait for an explicit call. When\n             *         doing more operations on the chart, for example running\n             *         `point.remove()` in a loop, it is best practice to set `redraw`\n             *         to false and call `chart.redraw()` after.         \n             * @param  {AnimationOptions} [animation=false]\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @sample highcharts/plotoptions/series-point-events-remove/\n             *         Remove point and confirm\n             * @sample highcharts/members/point-remove/\n             *         Remove pie slice\n             * @sample maps/members/point-remove/\n             *         Remove selected points in Highmaps\n             */\n            remove: function(redraw, animation) {\n                this.series.removePoint(inArray(this, this.series.data), redraw, animation);\n            }\n        });\n\n        // Extend the series prototype for dynamic methods\n        extend(Series.prototype, /** @lends Series.prototype */ {\n            /**\n             * Add a point to the series after render time. The point can be added at\n             * the end, or by giving it an X value, to the start or in the middle of the\n             * series.\n             * \n             * @param  {Number|Array|Object} options\n             *         The point options. If options is a single number, a point with\n             *         that y value is appended to the series.If it is an array, it will\n             *         be interpreted as x and y values respectively. If it is an\n             *         object, advanced options as outlined under `series.data` are\n             *         applied.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the point is added. When adding\n             *         more than one point, it is highly recommended that the redraw\n             *         option be set to false, and instead {@link Chart#redraw}\n             *         is explicitly called after the adding of points is finished.\n             *         Otherwise, the chart will redraw after adding each point.\n             * @param  {Boolean} [shift=false]\n             *         If true, a point is shifted off the start of the series as one is\n             *         appended to the end.\n             * @param  {AnimationOptions} [animation]\n             *         Whether to apply animation, and optionally animation\n             *         configuration.\n             *\n             * @sample highcharts/members/series-addpoint-append/\n             *         Append point\n             * @sample highcharts/members/series-addpoint-append-and-shift/\n             *         Append and shift\n             * @sample highcharts/members/series-addpoint-x-and-y/\n             *         Both X and Y values given\n             * @sample highcharts/members/series-addpoint-pie/\n             *         Append pie slice\n             * @sample stock/members/series-addpoint/\n             *         Append 100 points in Highstock\n             * @sample stock/members/series-addpoint-shift/\n             *         Append and shift in Highstock\n             * @sample maps/members/series-addpoint/\n             *         Add a point in Highmaps\n             */\n            addPoint: function(options, redraw, shift, animation) {\n                var series = this,\n                    seriesOptions = series.options,\n                    data = series.data,\n                    chart = series.chart,\n                    xAxis = series.xAxis,\n                    names = xAxis && xAxis.hasNames && xAxis.names,\n                    dataOptions = seriesOptions.data,\n                    point,\n                    isInTheMiddle,\n                    xData = series.xData,\n                    i,\n                    x;\n\n                // Optional redraw, defaults to true\n                redraw = pick(redraw, true);\n\n                // Get options and push the point to xData, yData and series.options. In series.generatePoints\n                // the Point instance will be created on demand and pushed to the series.data array.\n                point = {\n                    series: series\n                };\n                series.pointClass.prototype.applyOptions.apply(point, [options]);\n                x = point.x;\n\n                // Get the insertion point\n                i = xData.length;\n                if (series.requireSorting && x < xData[i - 1]) {\n                    isInTheMiddle = true;\n                    while (i && xData[i - 1] > x) {\n                        i--;\n                    }\n                }\n\n                series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item\n                series.updateParallelArrays(point, i); // update it\n\n                if (names && point.name) {\n                    names[x] = point.name;\n                }\n                dataOptions.splice(i, 0, options);\n\n                if (isInTheMiddle) {\n                    series.data.splice(i, 0, null);\n                    series.processData();\n                }\n\n                // Generate points to be added to the legend (#1329)\n                if (seriesOptions.legendType === 'point') {\n                    series.generatePoints();\n                }\n\n                // Shift the first point off the parallel arrays\n                if (shift) {\n                    if (data[0] && data[0].remove) {\n                        data[0].remove(false);\n                    } else {\n                        data.shift();\n                        series.updateParallelArrays(point, 'shift');\n\n                        dataOptions.shift();\n                    }\n                }\n\n                // redraw\n                series.isDirty = true;\n                series.isDirtyData = true;\n\n                if (redraw) {\n                    chart.redraw(animation); // Animation is set anyway on redraw, #5665\n                }\n            },\n\n            /**\n             * Remove a point from the series. Unlike the {@link Highcharts.Point#remove}\n             * method, this can also be done on a point that is not instanciated because\n             * it is outside the view or subject to Highstock data grouping.\n             *\n             * @param  {Number} i\n             *         The index of the point in the {@link Highcharts.Series.data|data}\n             *         array.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the point is added. When \n             *         removing more than one point, it is highly recommended that the\n             *         `redraw` option be set to `false`, and instead {@link\n             *         Highcharts.Chart#redraw} is explicitly called after the adding of\n             *         points is finished.\n             * @param  {AnimationOptions} [animation]\n             *         Whether and optionally how the series should be animated.\n             *\n             * @sample highcharts/members/series-removepoint/\n             *         Remove cropped point\n             */\n            removePoint: function(i, redraw, animation) {\n\n                var series = this,\n                    data = series.data,\n                    point = data[i],\n                    points = series.points,\n                    chart = series.chart,\n                    remove = function() {\n\n                        if (points && points.length === data.length) { // #4935\n                            points.splice(i, 1);\n                        }\n                        data.splice(i, 1);\n                        series.options.data.splice(i, 1);\n                        series.updateParallelArrays(point || {\n                            series: series\n                        }, 'splice', i, 1);\n\n                        if (point) {\n                            point.destroy();\n                        }\n\n                        // redraw\n                        series.isDirty = true;\n                        series.isDirtyData = true;\n                        if (redraw) {\n                            chart.redraw();\n                        }\n                    };\n\n                setAnimation(animation, chart);\n                redraw = pick(redraw, true);\n\n                // Fire the event with a default handler of removing the point\n                if (point) {\n                    point.firePointEvent('remove', null, remove);\n                } else {\n                    remove();\n                }\n            },\n\n            /**\n             * Remove a series and optionally redraw the chart.\n             *\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart or wait for an explicit call to\n             *         {@link Highcharts.Chart#redraw}.\n             * @param  {AnimationOptions} [animation]\n             *         Whether to apply animation, and optionally animation\n             *         configuration\n             * @param  {Boolean} [withEvent=true]\n             *         Used internally, whether to fire the series `remove` event.\n             *\n             * @sample highcharts/members/series-remove/\n             *         Remove first series from a button\n             */\n            remove: function(redraw, animation, withEvent) {\n                var series = this,\n                    chart = series.chart;\n\n                function remove() {\n\n                    // Destroy elements\n                    series.destroy();\n\n                    // Redraw\n                    chart.isDirtyLegend = chart.isDirtyBox = true;\n                    chart.linkSeries();\n\n                    if (pick(redraw, true)) {\n                        chart.redraw(animation);\n                    }\n                }\n\n                // Fire the event with a default handler of removing the point\n                if (withEvent !== false) {\n                    fireEvent(series, 'remove', null, remove);\n                } else {\n                    remove();\n                }\n            },\n\n            /**\n             * Update the series with a new set of options. For a clean and precise\n             * handling of new options, all methods and elements from the series are\n             * removed, and it is initiated from scratch. Therefore, this method is more\n             * performance expensive than some other utility methods like {@link\n             * Series#setData} or {@link Series#setVisible}.\n             *\n             * @param  {SeriesOptions} options\n             *         New options that will be merged with the series' existing\n             *         options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the series is altered. If doing\n             *         more operations on the chart, it is a good idea to set redraw to\n             *         false and call {@link Chart#redraw} after.\n             *\n             * @sample highcharts/members/series-update/\n             *         Updating series options\n             * @sample maps/members/series-update/\n             *         Update series options in Highmaps\n             */\n            update: function(newOptions, redraw) {\n                var series = this,\n                    chart = series.chart,\n                    // must use user options when changing type because series.options\n                    // is merged in with type specific plotOptions\n                    oldOptions = series.userOptions,\n                    oldType = series.oldType || series.type,\n                    newType = newOptions.type || oldOptions.type || chart.options.chart.type,\n                    proto = seriesTypes[oldType].prototype,\n                    preserve = ['group', 'markerGroup', 'dataLabelsGroup'],\n                    n;\n\n                // Running Series.update to update the data only is an intuitive usage,\n                // so we want to make sure that when used like this, we run the\n                // cheaper setData function and allow animation instead of completely\n                // recreating the series instance.\n                if (Object.keys && Object.keys(newOptions).toString() === 'data') {\n                    return this.setData(newOptions.data, redraw);\n                }\n\n                // If we're changing type or zIndex, create new groups (#3380, #3404)\n                if ((newType && newType !== oldType) || newOptions.zIndex !== undefined) {\n                    preserve.length = 0;\n                }\n\n                // Make sure groups are not destroyed (#3094)\n                each(preserve, function(prop) {\n                    preserve[prop] = series[prop];\n                    delete series[prop];\n                });\n\n                // Do the merge, with some forced options\n                newOptions = merge(oldOptions, {\n                    animation: false,\n                    index: series.index,\n                    pointStart: series.xData[0] // when updating after addPoint\n                }, {\n                    data: series.options.data\n                }, newOptions);\n\n                // Destroy the series and delete all properties. Reinsert all methods\n                // and properties from the new type prototype (#2270, #3719)\n                series.remove(false, null, false);\n                for (n in proto) {\n                    series[n] = undefined;\n                }\n                extend(series, seriesTypes[newType || oldType].prototype);\n\n                // Re-register groups (#3094)\n                each(preserve, function(prop) {\n                    series[prop] = preserve[prop];\n                });\n\n                series.init(chart, newOptions);\n                series.oldType = oldType;\n                chart.linkSeries(); // Links are lost in series.remove (#3028)\n                if (pick(redraw, true)) {\n                    chart.redraw(false);\n                }\n            }\n        });\n\n        // Extend the Axis.prototype for dynamic methods\n        extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n            /**\n             * Update an axis object with a new set of options. The options are merged\n             * with the existing options, so only new or altered options need to be\n             * specified.\n             *\n             * @param  {Object} options\n             *         The new options that will be merged in with existing options on\n             *         the axis.\n             * @sample highcharts/members/axis-update/ Axis update demo\n             */\n            update: function(options, redraw) {\n                var chart = this.chart;\n\n                options = chart.options[this.coll][this.options.index] =\n                    merge(this.userOptions, options);\n\n                this.destroy(true);\n\n                this.init(chart, extend(options, {\n                    events: undefined\n                }));\n\n                chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Remove the axis from the chart.\n             *\n             * @param {Boolean} [redraw=true] Whether to redraw the chart following the\n             * remove.\n             *\n             * @sample highcharts/members/chart-addaxis/ Add and remove axes\n             */\n            remove: function(redraw) {\n                var chart = this.chart,\n                    key = this.coll, // xAxis or yAxis\n                    axisSeries = this.series,\n                    i = axisSeries.length;\n\n                // Remove associated series (#2687)\n                while (i--) {\n                    if (axisSeries[i]) {\n                        axisSeries[i].remove(false);\n                    }\n                }\n\n                // Remove the axis\n                erase(chart.axes, this);\n                erase(chart[key], this);\n\n                if (isArray(chart.options[key])) {\n                    chart.options[key].splice(this.options.index, 1);\n                } else { // color axis, #6488\n                    delete chart.options[key];\n                }\n\n                each(chart[key], function(axis, i) { // Re-index, #1706\n                    axis.options.index = i;\n                });\n                this.destroy();\n                chart.isDirtyBox = true;\n\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n\n            /**\n             * Update the axis title by options after render time.\n             *\n             * @param  {TitleOptions} titleOptions\n             *         The additional title options.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after setting the title.\n             * @sample highcharts/members/axis-settitle/ Set a new Y axis title\n             */\n            setTitle: function(titleOptions, redraw) {\n                this.update({\n                    title: titleOptions\n                }, redraw);\n            },\n\n            /**\n             * Set new axis categories and optionally redraw.\n             * @param {Array.<String>} categories - The new categories.\n             * @param {Boolean} [redraw=true] - Whether to redraw the chart.\n             * @sample highcharts/members/axis-setcategories/ Set categories by click on\n             * a button\n             */\n            setCategories: function(categories, redraw) {\n                this.update({\n                    categories: categories\n                }, redraw);\n            }\n\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var color = H.color,\n            each = H.each,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            map = H.map,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType;\n\n        /**\n         * Area series type.\n         * @constructor seriesTypes.area\n         * @extends {Series}\n         */\n        seriesType('area', 'line', {\n            softThreshold: false,\n            threshold: 0\n            // trackByArea: false,\n            // lineColor: null, // overrides color, but lets fillColor be unaltered\n            // fillOpacity: 0.75,\n            // fillColor: null\n        }, /** @lends seriesTypes.area.prototype */ {\n            singleStacks: false,\n            /** \n             * Return an array of stacked points, where null and missing points are replaced by \n             * dummy points in order for gaps to be drawn correctly in stacks.\n             */\n            getStackPoints: function() {\n                var series = this,\n                    segment = [],\n                    keys = [],\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    stack = yAxis.stacks[this.stackKey],\n                    pointMap = {},\n                    points = this.points,\n                    seriesIndex = series.index,\n                    yAxisSeries = yAxis.series,\n                    seriesLength = yAxisSeries.length,\n                    visibleSeries,\n                    upOrDown = pick(yAxis.options.reversedStacks, true) ? 1 : -1,\n                    i;\n\n                if (this.options.stacking) {\n                    // Create a map where we can quickly look up the points by their X value.\n                    for (i = 0; i < points.length; i++) {\n                        pointMap[points[i].x] = points[i];\n                    }\n\n                    // Sort the keys (#1651)\n                    H.objectEach(stack, function(stackX, x) {\n                        if (stackX.total !== null) { // nulled after switching between grouping and not (#1651, #2336)\n                            keys.push(x);\n                        }\n                    });\n                    keys.sort(function(a, b) {\n                        return a - b;\n                    });\n\n                    visibleSeries = map(yAxisSeries, function() {\n                        return this.visible;\n                    });\n\n                    each(keys, function(x, idx) {\n                        var y = 0,\n                            stackPoint,\n                            stackedValues;\n\n                        if (pointMap[x] && !pointMap[x].isNull) {\n                            segment.push(pointMap[x]);\n\n                            // Find left and right cliff. -1 goes left, 1 goes right.\n                            each([-1, 1], function(direction) {\n                                var nullName = direction === 1 ? 'rightNull' : 'leftNull',\n                                    cliffName = direction === 1 ? 'rightCliff' : 'leftCliff',\n                                    cliff = 0,\n                                    otherStack = stack[keys[idx + direction]];\n\n                                // If there is a stack next to this one, to the left or to the right...\n                                if (otherStack) {\n                                    i = seriesIndex;\n                                    while (i >= 0 && i < seriesLength) { // Can go either up or down, depending on reversedStacks\n                                        stackPoint = otherStack.points[i];\n                                        if (!stackPoint) {\n                                            // If the next point in this series is missing, mark the point\n                                            // with point.leftNull or point.rightNull = true.\n                                            if (i === seriesIndex) {\n                                                pointMap[x][nullName] = true;\n\n                                                // If there are missing points in the next stack in any of the \n                                                // series below this one, we need to substract the missing values\n                                                // and add a hiatus to the left or right.\n                                            } else if (visibleSeries[i]) {\n                                                stackedValues = stack[x].points[i];\n                                                if (stackedValues) {\n                                                    cliff -= stackedValues[1] - stackedValues[0];\n                                                }\n                                            }\n                                        }\n                                        // When reversedStacks is true, loop up, else loop down\n                                        i += upOrDown;\n                                    }\n                                }\n                                pointMap[x][cliffName] = cliff;\n                            });\n\n\n                            // There is no point for this X value in this series, so we \n                            // insert a dummy point in order for the areas to be drawn\n                            // correctly.\n                        } else {\n\n                            // Loop down the stack to find the series below this one that has\n                            // a value (#1991)\n                            i = seriesIndex;\n                            while (i >= 0 && i < seriesLength) {\n                                stackPoint = stack[x].points[i];\n                                if (stackPoint) {\n                                    y = stackPoint[1];\n                                    break;\n                                }\n                                // When reversedStacks is true, loop up, else loop down\n                                i += upOrDown;\n                            }\n                            y = yAxis.translate(y, 0, 1, 0, 1); // #6272\n                            segment.push({\n                                isNull: true,\n                                plotX: xAxis.translate(x, 0, 0, 0, 1), // #6272\n                                x: x,\n                                plotY: y,\n                                yBottom: y\n                            });\n                        }\n                    });\n\n                }\n\n                return segment;\n            },\n\n            getGraphPath: function(points) {\n                var getGraphPath = Series.prototype.getGraphPath,\n                    graphPath,\n                    options = this.options,\n                    stacking = options.stacking,\n                    yAxis = this.yAxis,\n                    topPath,\n                    //topPoints = [],\n                    bottomPath,\n                    bottomPoints = [],\n                    graphPoints = [],\n                    seriesIndex = this.index,\n                    i,\n                    areaPath,\n                    plotX,\n                    stacks = yAxis.stacks[this.stackKey],\n                    threshold = options.threshold,\n                    translatedThreshold = yAxis.getThreshold(options.threshold),\n                    isNull,\n                    yBottom,\n                    connectNulls = options.connectNulls || stacking === 'percent',\n                    /**\n                     * To display null points in underlying stacked series, this series graph must be \n                     * broken, and the area also fall down to fill the gap left by the null point. #2069\n                     */\n                    addDummyPoints = function(i, otherI, side) {\n                        var point = points[i],\n                            stackedValues = stacking && stacks[point.x].points[seriesIndex],\n                            nullVal = point[side + 'Null'] || 0,\n                            cliffVal = point[side + 'Cliff'] || 0,\n                            top,\n                            bottom,\n                            isNull = true;\n\n                        if (cliffVal || nullVal) {\n\n                            top = (nullVal ? stackedValues[0] : stackedValues[1]) + cliffVal;\n                            bottom = stackedValues[0] + cliffVal;\n                            isNull = !!nullVal;\n\n                        } else if (!stacking && points[otherI] && points[otherI].isNull) {\n                            top = bottom = threshold;\n                        }\n\n                        // Add to the top and bottom line of the area\n                        if (top !== undefined) {\n                            graphPoints.push({\n                                plotX: plotX,\n                                plotY: top === null ? translatedThreshold : yAxis.getThreshold(top),\n                                isNull: isNull,\n                                isCliff: true\n                            });\n                            bottomPoints.push({\n                                plotX: plotX,\n                                plotY: bottom === null ? translatedThreshold : yAxis.getThreshold(bottom),\n                                doCurve: false // #1041, gaps in areaspline areas\n                            });\n                        }\n                    };\n\n                // Find what points to use\n                points = points || this.points;\n\n                // Fill in missing points\n                if (stacking) {\n                    points = this.getStackPoints();\n                }\n\n                for (i = 0; i < points.length; i++) {\n                    isNull = points[i].isNull;\n                    plotX = pick(points[i].rectPlotX, points[i].plotX);\n                    yBottom = pick(points[i].yBottom, translatedThreshold);\n\n                    if (!isNull || connectNulls) {\n\n                        if (!connectNulls) {\n                            addDummyPoints(i, i - 1, 'left');\n                        }\n\n                        if (!(isNull && !stacking && connectNulls)) { // Skip null point when stacking is false and connectNulls true\n                            graphPoints.push(points[i]);\n                            bottomPoints.push({\n                                x: i,\n                                plotX: plotX,\n                                plotY: yBottom\n                            });\n                        }\n\n                        if (!connectNulls) {\n                            addDummyPoints(i, i + 1, 'right');\n                        }\n                    }\n                }\n\n                topPath = getGraphPath.call(this, graphPoints, true, true);\n\n                bottomPoints.reversed = true;\n                bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n                if (bottomPath.length) {\n                    bottomPath[0] = 'L';\n                }\n\n                areaPath = topPath.concat(bottomPath);\n                graphPath = getGraphPath.call(this, graphPoints, false, connectNulls); // TODO: don't set leftCliff and rightCliff when connectNulls?\n\n                areaPath.xMap = topPath.xMap;\n                this.areaPath = areaPath;\n\n                return graphPath;\n            },\n\n            /**\n             * Draw the graph and the underlying area. This method calls the Series base\n             * function and adds the area. The areaPath is calculated in the getSegmentPath\n             * method called from Series.prototype.drawGraph.\n             */\n            drawGraph: function() {\n\n                // Define or reset areaPath\n                this.areaPath = [];\n\n                // Call the base method\n                Series.prototype.drawGraph.apply(this);\n\n                // Define local variables\n                var series = this,\n                    areaPath = this.areaPath,\n                    options = this.options,\n                    zones = this.zones,\n                    props = [\n                        [\n                            'area',\n                            'highcharts-area'\n\n                        ]\n                    ]; // area name, main color, fill color\n\n                each(zones, function(zone, i) {\n                    props.push([\n                        'zone-area-' + i,\n                        'highcharts-area highcharts-zone-area-' + i + ' ' + zone.className\n\n                    ]);\n                });\n\n                each(props, function(prop) {\n                    var areaKey = prop[0],\n                        area = series[areaKey];\n\n                    // Create or update the area\n                    if (area) { // update\n                        area.endX = areaPath.xMap;\n                        area.animate({\n                            d: areaPath\n                        });\n\n                    } else { // create\n                        area = series[areaKey] = series.chart.renderer.path(areaPath)\n                            .addClass(prop[1])\n                            .attr({\n\n                                zIndex: 0 // #1069\n                            }).add(series.group);\n                        area.isArea = true;\n                    }\n                    area.startX = areaPath.xMap;\n                    area.shiftUnit = options.step ? 2 : 1;\n                });\n            },\n\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var pick = H.pick,\n            seriesType = H.seriesType;\n\n        /**\n         * Spline series type.\n         * @constructor seriesTypes.spline\n         * @extends {Series}\n         */\n        seriesType('spline', 'line', {}, /** @lends seriesTypes.spline.prototype */ {\n            /**\n             * Get the spline segment from a given point's previous neighbour to the given point\n             */\n            getPointSpline: function(points, point, i) {\n                var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc\n                    denom = smoothing + 1,\n                    plotX = point.plotX,\n                    plotY = point.plotY,\n                    lastPoint = points[i - 1],\n                    nextPoint = points[i + 1],\n                    leftContX,\n                    leftContY,\n                    rightContX,\n                    rightContY,\n                    ret;\n\n                function doCurve(otherPoint) {\n                    return otherPoint &&\n                        !otherPoint.isNull &&\n                        otherPoint.doCurve !== false &&\n                        !point.isCliff; // #6387, area splines next to null\n                }\n\n                // Find control points\n                if (doCurve(lastPoint) && doCurve(nextPoint)) {\n                    var lastX = lastPoint.plotX,\n                        lastY = lastPoint.plotY,\n                        nextX = nextPoint.plotX,\n                        nextY = nextPoint.plotY,\n                        correction = 0;\n\n                    leftContX = (smoothing * plotX + lastX) / denom;\n                    leftContY = (smoothing * plotY + lastY) / denom;\n                    rightContX = (smoothing * plotX + nextX) / denom;\n                    rightContY = (smoothing * plotY + nextY) / denom;\n\n                    // Have the two control points make a straight line through main point\n                    if (rightContX !== leftContX) { // #5016, division by zero\n                        correction = ((rightContY - leftContY) * (rightContX - plotX)) /\n                            (rightContX - leftContX) + plotY - rightContY;\n                    }\n\n                    leftContY += correction;\n                    rightContY += correction;\n\n                    // to prevent false extremes, check that control points are between\n                    // neighbouring points' y values\n                    if (leftContY > lastY && leftContY > plotY) {\n                        leftContY = Math.max(lastY, plotY);\n                        rightContY = 2 * plotY - leftContY; // mirror of left control point\n                    } else if (leftContY < lastY && leftContY < plotY) {\n                        leftContY = Math.min(lastY, plotY);\n                        rightContY = 2 * plotY - leftContY;\n                    }\n                    if (rightContY > nextY && rightContY > plotY) {\n                        rightContY = Math.max(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    } else if (rightContY < nextY && rightContY < plotY) {\n                        rightContY = Math.min(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    }\n\n                    // record for drawing in next point\n                    point.rightContX = rightContX;\n                    point.rightContY = rightContY;\n\n\n                }\n\n                // Visualize control points for debugging\n                /*\n                if (leftContX) {\n                \tthis.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)\n                \t\t.attr({\n                \t\t\tstroke: 'red',\n                \t\t\t'stroke-width': 2,\n                \t\t\tfill: 'none',\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                \tthis.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,\n                \t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                \t\t.attr({\n                \t\t\tstroke: 'red',\n                \t\t\t'stroke-width': 2,\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                }\n                if (rightContX) {\n                \tthis.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)\n                \t\t.attr({\n                \t\t\tstroke: 'green',\n                \t\t\t'stroke-width': 2,\n                \t\t\tfill: 'none',\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                \tthis.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,\n                \t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                \t\t.attr({\n                \t\t\tstroke: 'green',\n                \t\t\t'stroke-width': 2,\n                \t\t\tzIndex: 9\n                \t\t})\n                \t\t.add();\n                }\n                // */\n                ret = [\n                    'C',\n                    pick(lastPoint.rightContX, lastPoint.plotX),\n                    pick(lastPoint.rightContY, lastPoint.plotY),\n                    pick(leftContX, plotX),\n                    pick(leftContY, plotY),\n                    plotX,\n                    plotY\n                ];\n                lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\n                return ret;\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var areaProto = H.seriesTypes.area.prototype,\n            defaultPlotOptions = H.defaultPlotOptions,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            seriesType = H.seriesType;\n        /**\n         * AreaSplineSeries object\n         */\n        seriesType('areaspline', 'spline', defaultPlotOptions.area, {\n            getStackPoints: areaProto.getStackPoints,\n            getGraphPath: areaProto.getGraphPath,\n            setStackCliffs: areaProto.setStackCliffs,\n            drawGraph: areaProto.drawGraph,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var animObject = H.animObject,\n            color = H.color,\n            each = H.each,\n            extend = H.extend,\n            isNumber = H.isNumber,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            svg = H.svg;\n        /**\n         * The column series type.\n         *\n         * @constructor seriesTypes.column\n         * @augments Series\n         */\n        seriesType('column', 'line', {\n            borderRadius: 0,\n            //colorByPoint: undefined,\n            crisp: true,\n            groupPadding: 0.2,\n            //grouping: true,\n            marker: null, // point options are specified in the base options\n            pointPadding: 0.1,\n            //pointWidth: null,\n            minPointLength: 0,\n            cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes\n            pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories\n            states: {\n                hover: {\n                    halo: false\n\n                }\n\n            },\n            dataLabels: {\n                align: null, // auto\n                verticalAlign: null, // auto\n                y: null\n            },\n            softThreshold: false,\n            startFromThreshold: true, // false doesn't work well: http://jsfiddle.net/highcharts/hz8fopan/14/\n            stickyTracking: false,\n            tooltip: {\n                distance: 6\n            },\n            threshold: 0\n\n\n        }, /** @lends seriesTypes.column.prototype */ {\n            cropShoulder: 0,\n            directTouch: true, // When tooltip is not shared, this series (and derivatives) requires direct touch/hover. KD-tree does not apply.\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            negStacks: true, // use separate negative stacks, unlike area stacks where a negative\n            // point is substracted from previous (#1910)\n\n            /**\n             * Initialize the series. Extends the basic Series.init method by\n             * marking other series of the same type as dirty.\n             *\n             * @function #init\n             * @memberOf seriesTypes.column\n             * @returns {void}\n             */\n            init: function() {\n                Series.prototype.init.apply(this, arguments);\n\n                var series = this,\n                    chart = series.chart;\n\n                // if the series is added dynamically, force redraw of other\n                // series affected by a new column\n                if (chart.hasRendered) {\n                    each(chart.series, function(otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,\n             * pointWidth etc.\n             */\n            getColumnMetrics: function() {\n\n                var series = this,\n                    options = series.options,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    reversedXAxis = xAxis.reversed,\n                    stackKey,\n                    stackGroups = {},\n                    columnCount = 0;\n\n                // Get the total number of column type series.\n                // This is called on every series. Consider moving this logic to a\n                // chart.orderStacks() function and call it on init, addSeries and removeSeries\n                if (options.grouping === false) {\n                    columnCount = 1;\n                } else {\n                    each(series.chart.series, function(otherSeries) {\n                        var otherOptions = otherSeries.options,\n                            otherYAxis = otherSeries.yAxis,\n                            columnIndex;\n                        if (\n                            otherSeries.type === series.type &&\n                            (\n                                otherSeries.visible ||\n                                !series.chart.options.chart.ignoreHiddenSeries\n                            ) &&\n                            yAxis.len === otherYAxis.len &&\n                            yAxis.pos === otherYAxis.pos\n                        ) { // #642, #2086\n                            if (otherOptions.stacking) {\n                                stackKey = otherSeries.stackKey;\n                                if (stackGroups[stackKey] === undefined) {\n                                    stackGroups[stackKey] = columnCount++;\n                                }\n                                columnIndex = stackGroups[stackKey];\n                            } else if (otherOptions.grouping !== false) { // #1162\n                                columnIndex = columnCount++;\n                            }\n                            otherSeries.columnIndex = columnIndex;\n                        }\n                    });\n                }\n\n                var categoryWidth = Math.min(\n                        Math.abs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610\n                        xAxis.len // #1535\n                    ),\n                    groupPadding = categoryWidth * options.groupPadding,\n                    groupWidth = categoryWidth - 2 * groupPadding,\n                    pointOffsetWidth = groupWidth / (columnCount || 1),\n                    pointWidth = Math.min(\n                        options.maxPointWidth || xAxis.len,\n                        pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))\n                    ),\n                    pointPadding = (pointOffsetWidth - pointWidth) / 2,\n                    colIndex = (series.columnIndex || 0) + (reversedXAxis ? 1 : 0), // #1251, #3737\n                    pointXOffset = pointPadding + (groupPadding + colIndex *\n                        pointOffsetWidth - (categoryWidth / 2)) *\n                    (reversedXAxis ? -1 : 1);\n\n                // Save it for reading in linked series (Error bars particularly)\n                series.columnMetrics = {\n                    width: pointWidth,\n                    offset: pointXOffset\n                };\n                return series.columnMetrics;\n\n            },\n\n            /**\n             * Make the columns crisp. The edges are rounded to the nearest full pixel.\n             */\n            crispCol: function(x, y, w, h) {\n                var chart = this.chart,\n                    borderWidth = this.borderWidth,\n                    xCrisp = -(borderWidth % 2 ? 0.5 : 0),\n                    yCrisp = borderWidth % 2 ? 0.5 : 1,\n                    right,\n                    bottom,\n                    fromTop;\n\n                if (chart.inverted && chart.renderer.isVML) {\n                    yCrisp += 1;\n                }\n\n                // Horizontal. We need to first compute the exact right edge, then round it\n                // and compute the width from there.\n                if (this.options.crisp) {\n                    right = Math.round(x + w) + xCrisp;\n                    x = Math.round(x) + xCrisp;\n                    w = right - x;\n                }\n\n                // Vertical\n                bottom = Math.round(y + h) + yCrisp;\n                fromTop = Math.abs(y) <= 0.5 && bottom > 0.5; // #4504, #4656\n                y = Math.round(y) + yCrisp;\n                h = bottom - y;\n\n                // Top edges are exceptions\n                if (fromTop && h) { // #5146\n                    y -= 1;\n                    h += 1;\n                }\n\n                return {\n                    x: x,\n                    y: y,\n                    width: w,\n                    height: h\n                };\n            },\n\n            /**\n             * Translate each point to the plot area coordinate system and find shape positions\n             */\n            translate: function() {\n                var series = this,\n                    chart = series.chart,\n                    options = series.options,\n                    dense = series.dense = series.closestPointRange * series.xAxis.transA < 2,\n                    borderWidth = series.borderWidth = pick(\n                        options.borderWidth,\n                        dense ? 0 : 1 // #3635\n                    ),\n                    yAxis = series.yAxis,\n                    threshold = options.threshold,\n                    translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),\n                    minPointLength = pick(options.minPointLength, 5),\n                    metrics = series.getColumnMetrics(),\n                    pointWidth = metrics.width,\n                    seriesBarW = series.barW = Math.max(pointWidth, 1 + 2 * borderWidth), // postprocessed for border width\n                    pointXOffset = series.pointXOffset = metrics.offset;\n\n                if (chart.inverted) {\n                    translatedThreshold -= 0.5; // #3355\n                }\n\n                // When the pointPadding is 0, we want the columns to be packed tightly, so we allow individual\n                // columns to have individual sizes. When pointPadding is greater, we strive for equal-width\n                // columns (#2694).\n                if (options.pointPadding) {\n                    seriesBarW = Math.ceil(seriesBarW);\n                }\n\n                Series.prototype.translate.apply(series);\n\n                // Record the new values\n                each(series.points, function(point) {\n                    var yBottom = pick(point.yBottom, translatedThreshold),\n                        safeDistance = 999 + Math.abs(yBottom),\n                        plotY = Math.min(Math.max(-safeDistance, point.plotY), yAxis.len + safeDistance), // Don't draw too far outside plot area (#1303, #2241, #4264)\n                        barX = point.plotX + pointXOffset,\n                        barW = seriesBarW,\n                        barY = Math.min(plotY, yBottom),\n                        up,\n                        barH = Math.max(plotY, yBottom) - barY;\n\n                    // Handle options.minPointLength\n                    if (Math.abs(barH) < minPointLength) {\n                        if (minPointLength) {\n                            barH = minPointLength;\n                            up = (!yAxis.reversed && !point.negative) || (yAxis.reversed && point.negative);\n                            barY = Math.abs(barY - translatedThreshold) > minPointLength ? // stacked\n                                yBottom - minPointLength : // keep position\n                                translatedThreshold - (up ? minPointLength : 0); // #1485, #4051\n                        }\n                    }\n\n                    // Cache for access in polar\n                    point.barX = barX;\n                    point.pointWidth = pointWidth;\n\n                    // Fix the tooltip on center of grouped columns (#1216, #424, #3648)\n                    point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - barX - barW / 2, barH] : [barX + barW / 2, plotY + yAxis.pos - chart.plotTop, barH];\n\n                    // Register shape type and arguments to be used in drawPoints\n                    point.shapeType = 'rect';\n                    point.shapeArgs = series.crispCol.apply(\n                        series,\n                        point.isNull ?\n                        // #3169, drilldown from null must have a position to work from\n                        // #6585, dataLabel should be placed on xAxis, not floating in the middle of the chart\n                        [barX, translatedThreshold, barW, 0] : [barX, barY, barW, barH]\n                    );\n                });\n\n            },\n\n            getSymbol: noop,\n\n            /**\n             * Use a solid rectangle like the area series types\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n\n            /**\n             * Columns have no graph\n             */\n            drawGraph: function() {\n                this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n            },\n\n\n\n            /**\n             * Draw the columns. For bars, the series.group is rotated, so the same coordinates\n             * apply for columns and bars. This method is inherited by scatter series.\n             *\n             */\n            drawPoints: function() {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    shapeArgs;\n\n                // draw the columns\n                each(series.points, function(point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic;\n\n                    if (isNumber(plotY) && point.y !== null) {\n                        shapeArgs = point.shapeArgs;\n\n                        if (graphic) { // update\n                            graphic[chart.pointCount < animationLimit ? 'animate' : 'attr'](\n                                merge(shapeArgs)\n                            );\n\n                        } else {\n                            point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n                                .add(point.group || series.group);\n                        }\n\n\n\n                        graphic.addClass(point.getClassName(), true);\n\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            },\n\n            /**\n             * Animate the column heights one by one from zero\n             * @param {Boolean} init Whether to initialize the animation or run it\n             */\n            animate: function(init) {\n                var series = this,\n                    yAxis = this.yAxis,\n                    options = series.options,\n                    inverted = this.chart.inverted,\n                    attr = {},\n                    translatedThreshold;\n\n                if (svg) { // VML is too slow anyway\n                    if (init) {\n                        attr.scaleY = 0.001;\n                        translatedThreshold = Math.min(yAxis.pos + yAxis.len, Math.max(yAxis.pos, yAxis.toPixels(options.threshold)));\n                        if (inverted) {\n                            attr.translateX = translatedThreshold - yAxis.len;\n                        } else {\n                            attr.translateY = translatedThreshold;\n                        }\n                        series.group.attr(attr);\n\n                    } else { // run the animation\n\n                        attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;\n                        series.group.animate(attr, extend(animObject(series.options.animation), {\n                            // Do the scale synchronously to ensure smooth updating (#5030)\n                            step: function(val, fx) {\n                                series.group.attr({\n                                    scaleY: Math.max(0.001, fx.pos) // #5250\n                                });\n                            }\n                        }));\n\n                        // delete this function to allow it only once\n                        series.animate = null;\n                    }\n                }\n            },\n\n            /**\n             * Remove this series from the chart\n             */\n            remove: function() {\n                var series = this,\n                    chart = series.chart;\n\n                // column and bar series affects other series of the same type\n                // as they are either stacked or grouped\n                if (chart.hasRendered) {\n                    each(chart.series, function(otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n\n                Series.prototype.remove.apply(series, arguments);\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesType = H.seriesType;\n\n        /**\n         * The Bar series class\n         */\n        seriesType('bar', 'column', null, {\n            inverted: true\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Series = H.Series,\n            seriesType = H.seriesType;\n        /**\n         * The scatter series type\n         */\n        seriesType('scatter', 'line', {\n            lineWidth: 0,\n            findNearestPointBy: 'xy',\n            marker: {\n                enabled: true // Overrides auto-enabling in line series (#3647)\n            },\n            tooltip: {\n\n                headerFormat: '<span class=\"highcharts-color-{point.colorIndex}\">\\u25CF</span> ' +\n                    '<span class=\"highcharts-header\"> {series.name}</span><br/>',\n\n                pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'\n            }\n\n            // Prototype members\n        }, {\n            sorted: false,\n            requireSorting: false,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n            takeOrdinalPosition: false, // #2342\n            drawGraph: function() {\n                if (this.options.lineWidth) {\n                    Series.prototype.drawGraph.call(this);\n                }\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var pick = H.pick,\n            relativeLength = H.relativeLength;\n\n        H.CenteredSeriesMixin = {\n            /**\n             * Get the center of the pie based on the size and center options relative to the\n             * plot area. Borrowed by the polar and gauge series types.\n             */\n            getCenter: function() {\n\n                var options = this.options,\n                    chart = this.chart,\n                    slicingRoom = 2 * (options.slicedOffset || 0),\n                    handleSlicingRoom,\n                    plotWidth = chart.plotWidth - 2 * slicingRoom,\n                    plotHeight = chart.plotHeight - 2 * slicingRoom,\n                    centerOption = options.center,\n                    positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],\n                    smallestSize = Math.min(plotWidth, plotHeight),\n                    i,\n                    value;\n\n                for (i = 0; i < 4; ++i) {\n                    value = positions[i];\n                    handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n\n                    // i == 0: centerX, relative to width\n                    // i == 1: centerY, relative to height\n                    // i == 2: size, relative to smallestSize\n                    // i == 3: innerSize, relative to size\n                    positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) +\n                        (handleSlicingRoom ? slicingRoom : 0);\n\n                }\n                // innerSize cannot be larger than size (#3632)\n                if (positions[3] > positions[2]) {\n                    positions[3] = positions[2];\n                }\n                return positions;\n            }\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            CenteredSeriesMixin = H.CenteredSeriesMixin,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            inArray = H.inArray,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            noop = H.noop,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes,\n            setAnimation = H.setAnimation;\n\n        /**\n         * The pie series type.\n         *\n         * @constructor seriesTypes.pie\n         * @augments Series\n         */\n        seriesType('pie', 'line', {\n            center: [null, null],\n            clip: false,\n            colorByPoint: true, // always true for pies\n            dataLabels: {\n                // align: null,\n                // connectorWidth: 1,\n                // connectorColor: point.color,\n                // connectorPadding: 5,\n                distance: 30,\n                enabled: true,\n                formatter: function() { // #2945\n                    return this.point.isNull ? undefined : this.point.name;\n                },\n                // softConnector: true,\n                x: 0\n                // y: 0\n            },\n            ignoreHiddenPoint: true,\n            //innerSize: 0,\n            legendType: 'point',\n            marker: null, // point options are specified in the base options\n            size: null,\n            showInLegend: false,\n            slicedOffset: 10,\n            stickyTracking: false,\n            tooltip: {\n                followPointer: true\n            }\n\n\n        }, /** @lends seriesTypes.pie.prototype */ {\n            isCartesian: false,\n            requireSorting: false,\n            directTouch: true,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            axisTypes: [],\n            pointAttribs: seriesTypes.column.prototype.pointAttribs,\n            /**\n             * Animate the pies in\n             */\n            animate: function(init) {\n                var series = this,\n                    points = series.points,\n                    startAngleRad = series.startAngleRad;\n\n                if (!init) {\n                    each(points, function(point) {\n                        var graphic = point.graphic,\n                            args = point.shapeArgs;\n\n                        if (graphic) {\n                            // start values\n                            graphic.attr({\n                                r: point.startR || (series.center[3] / 2), // animate from inner radius (#779)\n                                start: startAngleRad,\n                                end: startAngleRad\n                            });\n\n                            // animate\n                            graphic.animate({\n                                r: args.r,\n                                start: args.start,\n                                end: args.end\n                            }, series.options.animation);\n                        }\n                    });\n\n                    // delete this function to allow it only once\n                    series.animate = null;\n                }\n            },\n\n            /**\n             * Recompute total chart sum and update percentages of points.\n             */\n            updateTotals: function() {\n                var i,\n                    total = 0,\n                    points = this.points,\n                    len = points.length,\n                    point,\n                    ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n\n                // Get the total sum\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    total += (ignoreHiddenPoint && !point.visible) ?\n                        0 :\n                        point.isNull ? 0 : point.y;\n                }\n                this.total = total;\n\n                // Set each point's properties\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    point.percentage = (total > 0 && (point.visible || !ignoreHiddenPoint)) ? point.y / total * 100 : 0;\n                    point.total = total;\n                }\n            },\n\n            /**\n             * Extend the generatePoints method by adding total and percentage properties to each point\n             */\n            generatePoints: function() {\n                Series.prototype.generatePoints.call(this);\n                this.updateTotals();\n            },\n\n            /**\n             * Do translation for pie slices\n             */\n            translate: function(positions) {\n                this.generatePoints();\n\n                var series = this,\n                    cumulative = 0,\n                    precision = 1000, // issue #172\n                    options = series.options,\n                    slicedOffset = options.slicedOffset,\n                    connectorOffset = slicedOffset + (options.borderWidth || 0),\n                    finalConnectorOffset,\n                    start,\n                    end,\n                    angle,\n                    startAngle = options.startAngle || 0,\n                    startAngleRad = series.startAngleRad = Math.PI / 180 * (startAngle - 90),\n                    endAngleRad = series.endAngleRad = Math.PI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),\n                    circ = endAngleRad - startAngleRad, //2 * Math.PI,\n                    points = series.points,\n                    radiusX, // the x component of the radius vector for a given point\n                    radiusY,\n                    labelDistance = options.dataLabels.distance,\n                    ignoreHiddenPoint = options.ignoreHiddenPoint,\n                    i,\n                    len = points.length,\n                    point;\n\n                // Get positions - either an integer or a percentage string must be given.\n                // If positions are passed as a parameter, we're in a recursive loop for adjusting\n                // space for data labels.\n                if (!positions) {\n                    series.center = positions = series.getCenter();\n                }\n\n                // Utility for getting the x value from a given y, used for anticollision\n                // logic in data labels.\n                // Added point for using specific points' label distance.\n                series.getX = function(y, left, point) {\n                    angle = Math.asin(Math.min((y - positions[1]) / (positions[2] / 2 + point.labelDistance), 1));\n                    return positions[0] +\n                        (left ? -1 : 1) *\n                        (Math.cos(angle) * (positions[2] / 2 + point.labelDistance));\n                };\n\n                // Calculate the geometry for each point\n                for (i = 0; i < len; i++) {\n\n                    point = points[i];\n\n                    // Used for distance calculation for specific point.\n                    point.labelDistance = pick(\n                        point.options.dataLabels && point.options.dataLabels.distance,\n                        labelDistance\n                    );\n\n                    // Saved for later dataLabels distance calculation.\n                    series.maxLabelDistance = Math.max(series.maxLabelDistance || 0, point.labelDistance);\n\n                    // set start and end angle\n                    start = startAngleRad + (cumulative * circ);\n                    if (!ignoreHiddenPoint || point.visible) {\n                        cumulative += point.percentage / 100;\n                    }\n                    end = startAngleRad + (cumulative * circ);\n\n                    // set the shape\n                    point.shapeType = 'arc';\n                    point.shapeArgs = {\n                        x: positions[0],\n                        y: positions[1],\n                        r: positions[2] / 2,\n                        innerR: positions[3] / 2,\n                        start: Math.round(start * precision) / precision,\n                        end: Math.round(end * precision) / precision\n                    };\n\n                    // The angle must stay within -90 and 270 (#2645)\n                    angle = (end + start) / 2;\n                    if (angle > 1.5 * Math.PI) {\n                        angle -= 2 * Math.PI;\n                    } else if (angle < -Math.PI / 2) {\n                        angle += 2 * Math.PI;\n                    }\n\n                    // Center for the sliced out slice\n                    point.slicedTranslation = {\n                        translateX: Math.round(Math.cos(angle) * slicedOffset),\n                        translateY: Math.round(Math.sin(angle) * slicedOffset)\n                    };\n\n                    // set the anchor point for tooltips\n                    radiusX = Math.cos(angle) * positions[2] / 2;\n                    radiusY = Math.sin(angle) * positions[2] / 2;\n                    point.tooltipPos = [\n                        positions[0] + radiusX * 0.7,\n                        positions[1] + radiusY * 0.7\n                    ];\n\n                    point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ? 1 : 0;\n                    point.angle = angle;\n\n                    // Set the anchor point for data labels. Use point.labelDistance \n                    // instead of labelDistance // #1174\n                    // finalConnectorOffset - not override connectorOffset value.\n                    finalConnectorOffset = Math.min(connectorOffset, point.labelDistance / 5); // #1678\n                    point.labelPos = [\n                        positions[0] + radiusX + Math.cos(angle) * point.labelDistance, // first break of connector\n                        positions[1] + radiusY + Math.sin(angle) * point.labelDistance, // a/a\n                        positions[0] + radiusX + Math.cos(angle) * finalConnectorOffset, // second break, right outside pie\n                        positions[1] + radiusY + Math.sin(angle) * finalConnectorOffset, // a/a\n                        positions[0] + radiusX, // landing point for connector\n                        positions[1] + radiusY, // a/a\n                        point.labelDistance < 0 ? // alignment\n                        'center' :\n                        point.half ? 'right' : 'left', // alignment\n                        angle // center angle\n                    ];\n\n                }\n            },\n\n            drawGraph: null,\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    groupTranslation,\n                    //center,\n                    graphic,\n                    //group,\n                    pointAttr,\n                    shapeArgs;\n\n\n\n                // draw the slices\n                each(series.points, function(point) {\n                    if (!point.isNull) {\n                        graphic = point.graphic;\n                        shapeArgs = point.shapeArgs;\n\n\n                        // If the point is sliced, use special translation, else use\n                        // plot area traslation\n                        groupTranslation = point.getTranslate();\n\n\n\n                        // Draw the slice\n                        if (graphic) {\n                            graphic\n                                .setRadialReference(series.center)\n\n                                .animate(extend(shapeArgs, groupTranslation));\n                        } else {\n\n                            point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n                                .setRadialReference(series.center)\n                                .attr(groupTranslation)\n                                .add(series.group);\n\n                            if (!point.visible) {\n                                graphic.attr({\n                                    visibility: 'hidden'\n                                });\n                            }\n\n\n                        }\n\n                        graphic.addClass(point.getClassName());\n\n                    }\n                });\n\n            },\n\n\n            searchPoint: noop,\n\n            /**\n             * Utility for sorting data labels\n             */\n            sortByAngle: function(points, sign) {\n                points.sort(function(a, b) {\n                    return a.angle !== undefined && (b.angle - a.angle) * sign;\n                });\n            },\n\n            /**\n             * Use a simple symbol from LegendSymbolMixin\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n            /**\n             * Use the getCenter method from drawLegendSymbol\n             */\n            getCenter: CenteredSeriesMixin.getCenter,\n\n            /**\n             * Pies don't have point marker symbols\n             */\n            getSymbol: noop\n\n\n            /**\n             * @constructor seriesTypes.pie.prototype.pointClass\n             * @extends {Point}\n             */\n        }, /** @lends seriesTypes.pie.prototype.pointClass.prototype */ {\n            /**\n             * Initiate the pie slice\n             */\n            init: function() {\n\n                Point.prototype.init.apply(this, arguments);\n\n                var point = this,\n                    toggleSlice;\n\n                point.name = pick(point.name, 'Slice');\n\n                // add event listener for select\n                toggleSlice = function(e) {\n                    point.slice(e.type === 'select');\n                };\n                addEvent(point, 'select', toggleSlice);\n                addEvent(point, 'unselect', toggleSlice);\n\n                return point;\n            },\n\n            /**\n             * Negative points are not valid (#1530, #3623, #5322)\n             */\n            isValid: function() {\n                return H.isNumber(this.y, true) && this.y >= 0;\n            },\n\n            /**\n             * Toggle the visibility of the pie slice\n             * @param {Boolean} vis Whether to show the slice or not. If undefined, the\n             *    visibility is toggled\n             */\n            setVisible: function(vis, redraw) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    ignoreHiddenPoint = series.options.ignoreHiddenPoint;\n\n                redraw = pick(redraw, ignoreHiddenPoint);\n\n                if (vis !== point.visible) {\n\n                    // If called without an argument, toggle visibility\n                    point.visible = point.options.visible = vis = vis === undefined ? !point.visible : vis;\n                    series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n                    // Show and hide associated elements. This is performed regardless of redraw or not,\n                    // because chart.redraw only handles full series.\n                    each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function(key) {\n                        if (point[key]) {\n                            point[key][vis ? 'show' : 'hide'](true);\n                        }\n                    });\n\n                    if (point.legendItem) {\n                        chart.legend.colorizeItem(point, vis);\n                    }\n\n                    // #4170, hide halo after hiding point\n                    if (!vis && point.state === 'hover') {\n                        point.setState('');\n                    }\n\n                    // Handle ignore hidden slices\n                    if (ignoreHiddenPoint) {\n                        series.isDirty = true;\n                    }\n\n                    if (redraw) {\n                        chart.redraw();\n                    }\n                }\n            },\n\n            /**\n             * Set or toggle whether the slice is cut out from the pie\n             * @param {Boolean} sliced When undefined, the slice state is toggled\n             * @param {Boolean} redraw Whether to redraw the chart. True by default.\n             */\n            slice: function(sliced, redraw, animation) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n\n                setAnimation(animation, chart);\n\n                // redraw is true by default\n                redraw = pick(redraw, true);\n\n                // if called without an argument, toggle\n                point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;\n                series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n                point.graphic.animate(this.getTranslate());\n\n\n            },\n\n            getTranslate: function() {\n                return this.sliced ? this.slicedTranslation : {\n                    translateX: 0,\n                    translateY: 0\n                };\n            },\n\n            haloPath: function(size) {\n                var shapeArgs = this.shapeArgs;\n\n                return this.sliced || !this.visible ? [] :\n                    this.series.chart.renderer.symbols.arc(\n                        shapeArgs.x,\n                        shapeArgs.y,\n                        shapeArgs.r + size,\n                        shapeArgs.r + size, {\n                            innerR: this.shapeArgs.r,\n                            start: shapeArgs.start,\n                            end: shapeArgs.end\n                        }\n                    );\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            arrayMax = H.arrayMax,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            map = H.map,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            relativeLength = H.relativeLength,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            stableSort = H.stableSort;\n\n\n        /**\n         * Generatl distribution algorithm for distributing labels of differing size along a\n         * confined length in two dimensions. The algorithm takes an array of objects containing\n         * a size, a target and a rank. It will place the labels as close as possible to their \n         * targets, skipping the lowest ranked labels if necessary.\n         */\n        H.distribute = function(boxes, len) {\n\n            var i,\n                overlapping = true,\n                origBoxes = boxes, // Original array will be altered with added .pos\n                restBoxes = [], // The outranked overshoot\n                box,\n                target,\n                total = 0;\n\n            function sortByTarget(a, b) {\n                return a.target - b.target;\n            }\n\n            // If the total size exceeds the len, remove those boxes with the lowest rank\n            i = boxes.length;\n            while (i--) {\n                total += boxes[i].size;\n            }\n\n            // Sort by rank, then slice away overshoot\n            if (total > len) {\n                stableSort(boxes, function(a, b) {\n                    return (b.rank || 0) - (a.rank || 0);\n                });\n                i = 0;\n                total = 0;\n                while (total <= len) {\n                    total += boxes[i].size;\n                    i++;\n                }\n                restBoxes = boxes.splice(i - 1, boxes.length);\n            }\n\n            // Order by target\n            stableSort(boxes, sortByTarget);\n\n\n            // So far we have been mutating the original array. Now\n            // create a copy with target arrays\n            boxes = map(boxes, function(box) {\n                return {\n                    size: box.size,\n                    targets: [box.target]\n                };\n            });\n\n            while (overlapping) {\n                // Initial positions: target centered in box\n                i = boxes.length;\n                while (i--) {\n                    box = boxes[i];\n                    // Composite box, average of targets\n                    target = (Math.min.apply(0, box.targets) + Math.max.apply(0, box.targets)) / 2;\n                    box.pos = Math.min(Math.max(0, target - box.size / 2), len - box.size);\n                }\n\n                // Detect overlap and join boxes\n                i = boxes.length;\n                overlapping = false;\n                while (i--) {\n                    if (i > 0 && boxes[i - 1].pos + boxes[i - 1].size > boxes[i].pos) { // Overlap\n                        boxes[i - 1].size += boxes[i].size; // Add this size to the previous box\n                        boxes[i - 1].targets = boxes[i - 1].targets.concat(boxes[i].targets);\n\n                        // Overlapping right, push left\n                        if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n                            boxes[i - 1].pos = len - boxes[i - 1].size;\n                        }\n                        boxes.splice(i, 1); // Remove this item\n                        overlapping = true;\n                    }\n                }\n            }\n\n            // Now the composite boxes are placed, we need to put the original boxes within them\n            i = 0;\n            each(boxes, function(box) {\n                var posInCompositeBox = 0;\n                each(box.targets, function() {\n                    origBoxes[i].pos = box.pos + posInCompositeBox;\n                    posInCompositeBox += origBoxes[i].size;\n                    i++;\n                });\n            });\n\n            // Add the rest (hidden) boxes and sort by target\n            origBoxes.push.apply(origBoxes, restBoxes);\n            stableSort(origBoxes, sortByTarget);\n        };\n\n\n        /**\n         * Draw the data labels\n         */\n        Series.prototype.drawDataLabels = function() {\n            var series = this,\n                seriesOptions = series.options,\n                options = seriesOptions.dataLabels,\n                points = series.points,\n                pointOptions,\n                generalOptions,\n                hasRendered = series.hasRendered || 0,\n                str,\n                dataLabelsGroup,\n                defer = pick(options.defer, !!seriesOptions.animation),\n                renderer = series.chart.renderer;\n\n            if (options.enabled || series._hasPointLabels) {\n\n                // Process default alignment of data labels for columns\n                if (series.dlProcessOptions) {\n                    series.dlProcessOptions(options);\n                }\n\n                // Create a separate group for the data labels to avoid rotation\n                dataLabelsGroup = series.plotGroup(\n                    'dataLabelsGroup',\n                    'data-labels',\n                    defer && !hasRendered ? 'hidden' : 'visible', // #5133\n                    options.zIndex || 6\n                );\n\n                if (defer) {\n                    dataLabelsGroup.attr({\n                        opacity: +hasRendered\n                    }); // #3300\n                    if (!hasRendered) {\n                        addEvent(series, 'afterAnimate', function() {\n                            if (series.visible) { // #2597, #3023, #3024\n                                dataLabelsGroup.show(true);\n                            }\n                            dataLabelsGroup[seriesOptions.animation ? 'animate' : 'attr']({\n                                opacity: 1\n                            }, {\n                                duration: 200\n                            });\n                        });\n                    }\n                }\n\n                // Make the labels for each point\n                generalOptions = options;\n                each(points, function(point) {\n                    var enabled,\n                        dataLabel = point.dataLabel,\n                        labelConfig,\n                        attr,\n                        rotation,\n                        connector = point.connector,\n                        isNew = !dataLabel,\n                        style;\n                    // Determine if each data label is enabled\n                    // @note dataLabelAttribs (like pointAttribs) would eradicate\n                    // the need for dlOptions, and simplify the section below.\n                    pointOptions = point.dlOptions || (point.options && point.options.dataLabels); // dlOptions is used in treemaps\n                    enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled) && point.y !== null; // #2282, #4641\n                    if (enabled) {\n                        // Create individual options structure that can be extended without\n                        // affecting others\n                        options = merge(generalOptions, pointOptions);\n                        labelConfig = point.getLabelConfig();\n                        str = options.format ?\n                            format(options.format, labelConfig) :\n                            options.formatter.call(labelConfig, options);\n                        style = options.style;\n                        rotation = options.rotation;\n\n\n                        attr = {\n                            //align: align,\n\n                            r: options.borderRadius || 0,\n                            rotation: rotation,\n                            padding: options.padding,\n                            zIndex: 1\n                        };\n\n                        // Remove unused attributes (#947)\n                        H.objectEach(attr, function(val, name) {\n                            if (val === undefined) {\n                                delete attr[name];\n                            }\n                        });\n                    }\n                    // If the point is outside the plot area, destroy it. #678, #820\n                    if (dataLabel && (!enabled || !defined(str))) {\n                        point.dataLabel = dataLabel = dataLabel.destroy();\n                        if (connector) {\n                            point.connector = connector.destroy();\n                        }\n                        // Individual labels are disabled if the are explicitly disabled\n                        // in the point options, or if they fall outside the plot area.\n                    } else if (enabled && defined(str)) {\n                        // create new label\n                        if (!dataLabel) {\n                            dataLabel = point.dataLabel = renderer[rotation ? 'text' : 'label']( // labels don't support rotation\n                                str,\n                                0, -9999,\n                                options.shape,\n                                null,\n                                null,\n                                options.useHTML,\n                                null,\n                                'data-label'\n                            );\n                            dataLabel.addClass(\n                                'highcharts-data-label-color-' + point.colorIndex +\n                                ' ' + (options.className || '') +\n                                (options.useHTML ? 'highcharts-tracker' : '') // #3398\n                            );\n                        } else {\n                            attr.text = str;\n                        }\n                        dataLabel.attr(attr);\n\n\n                        if (!dataLabel.added) {\n                            dataLabel.add(dataLabelsGroup);\n                        }\n                        // Now the data label is created and placed at 0,0, so we need to align it\n                        series.alignDataLabel(point, dataLabel, options, null, isNew);\n                    }\n                });\n            }\n        };\n\n        /**\n         * Align each individual data label\n         */\n        Series.prototype.alignDataLabel = function(point, dataLabel, options, alignTo, isNew) {\n            var chart = this.chart,\n                inverted = chart.inverted,\n                plotX = pick(point.plotX, -9999),\n                plotY = pick(point.plotY, -9999),\n                bBox = dataLabel.getBBox(),\n                fontSize,\n                baseline,\n                rotation = options.rotation,\n                normRotation,\n                negRotation,\n                align = options.align,\n                rotCorr, // rotation correction\n                // Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)\n                visible =\n                this.visible &&\n                (\n                    point.series.forceDL ||\n                    chart.isInsidePlot(plotX, Math.round(plotY), inverted) ||\n                    (\n                        alignTo && chart.isInsidePlot(\n                            plotX,\n                            inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1,\n                            inverted\n                        )\n                    )\n                ),\n                alignAttr, // the final position;\n                justify = pick(options.overflow, 'justify') === 'justify';\n\n            if (visible) {\n\n\n\n                baseline = chart.renderer.fontMetrics(fontSize, dataLabel).b;\n\n                // The alignment box is a singular point\n                alignTo = extend({\n                    x: inverted ? chart.plotWidth - plotY : plotX,\n                    y: Math.round(inverted ? chart.plotHeight - plotX : plotY),\n                    width: 0,\n                    height: 0\n                }, alignTo);\n\n                // Add the text size for alignment calculation\n                extend(options, {\n                    width: bBox.width,\n                    height: bBox.height\n                });\n\n                // Allow a hook for changing alignment in the last moment, then do the alignment\n                if (rotation) {\n                    justify = false; // Not supported for rotated text\n                    rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723\n                    alignAttr = {\n                        x: alignTo.x + options.x + alignTo.width / 2 + rotCorr.x,\n                        y: alignTo.y + options.y + {\n                            top: 0,\n                            middle: 0.5,\n                            bottom: 1\n                        }[options.verticalAlign] * alignTo.height\n                    };\n                    dataLabel[isNew ? 'attr' : 'animate'](alignAttr)\n                        .attr({ // #3003\n                            align: align\n                        });\n\n                    // Compensate for the rotated label sticking out on the sides\n                    normRotation = (rotation + 720) % 360;\n                    negRotation = normRotation > 180 && normRotation < 360;\n\n                    if (align === 'left') {\n                        alignAttr.y -= negRotation ? bBox.height : 0;\n                    } else if (align === 'center') {\n                        alignAttr.x -= bBox.width / 2;\n                        alignAttr.y -= bBox.height / 2;\n                    } else if (align === 'right') {\n                        alignAttr.x -= bBox.width;\n                        alignAttr.y -= negRotation ? 0 : bBox.height;\n                    }\n\n\n                } else {\n                    dataLabel.align(options, null, alignTo);\n                    alignAttr = dataLabel.alignAttr;\n                }\n\n                // Handle justify or crop\n                if (justify) {\n                    point.isLabelJustified = this.justifyDataLabel(\n                        dataLabel,\n                        options,\n                        alignAttr,\n                        bBox,\n                        alignTo,\n                        isNew\n                    );\n\n                    // Now check that the data label is within the plot area\n                } else if (pick(options.crop, true)) {\n                    visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n                }\n\n                // When we're using a shape, make it possible with a connector or an arrow pointing to thie point\n                if (options.shape && !rotation) {\n                    dataLabel[isNew ? 'attr' : 'animate']({\n                        anchorX: inverted ? chart.plotWidth - point.plotY : point.plotX,\n                        anchorY: inverted ? chart.plotHeight - point.plotX : point.plotY\n                    });\n                }\n            }\n\n            // Show or hide based on the final aligned position\n            if (!visible) {\n                dataLabel.attr({\n                    y: -9999\n                });\n                dataLabel.placed = false; // don't animate back in\n            }\n\n        };\n\n        /**\n         * If data labels fall partly outside the plot area, align them back in, in a way that\n         * doesn't hide the point.\n         */\n        Series.prototype.justifyDataLabel = function(dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n            var chart = this.chart,\n                align = options.align,\n                verticalAlign = options.verticalAlign,\n                off,\n                justified,\n                padding = dataLabel.box ? 0 : (dataLabel.padding || 0);\n\n            // Off left\n            off = alignAttr.x + padding;\n            if (off < 0) {\n                if (align === 'right') {\n                    options.align = 'left';\n                } else {\n                    options.x = -off;\n                }\n                justified = true;\n            }\n\n            // Off right\n            off = alignAttr.x + bBox.width - padding;\n            if (off > chart.plotWidth) {\n                if (align === 'left') {\n                    options.align = 'right';\n                } else {\n                    options.x = chart.plotWidth - off;\n                }\n                justified = true;\n            }\n\n            // Off top\n            off = alignAttr.y + padding;\n            if (off < 0) {\n                if (verticalAlign === 'bottom') {\n                    options.verticalAlign = 'top';\n                } else {\n                    options.y = -off;\n                }\n                justified = true;\n            }\n\n            // Off bottom\n            off = alignAttr.y + bBox.height - padding;\n            if (off > chart.plotHeight) {\n                if (verticalAlign === 'top') {\n                    options.verticalAlign = 'bottom';\n                } else {\n                    options.y = chart.plotHeight - off;\n                }\n                justified = true;\n            }\n\n            if (justified) {\n                dataLabel.placed = !isNew;\n                dataLabel.align(options, null, alignTo);\n            }\n\n            return justified;\n        };\n\n        /**\n         * Override the base drawDataLabels method by pie specific functionality\n         */\n        if (seriesTypes.pie) {\n            seriesTypes.pie.prototype.drawDataLabels = function() {\n                var series = this,\n                    data = series.data,\n                    point,\n                    chart = series.chart,\n                    options = series.options.dataLabels,\n                    connectorPadding = pick(options.connectorPadding, 10),\n                    connectorWidth = pick(options.connectorWidth, 1),\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    connector,\n                    seriesCenter = series.center,\n                    radius = seriesCenter[2] / 2,\n                    centerY = seriesCenter[1],\n                    dataLabel,\n                    dataLabelWidth,\n                    labelPos,\n                    labelHeight,\n                    halves = [ // divide the points into right and left halves for anti collision\n                        [], // right\n                        [] // left\n                    ],\n                    x,\n                    y,\n                    visibility,\n                    j,\n                    overflow = [0, 0, 0, 0]; // top, right, bottom, left\n\n                // get out if not enabled\n                if (!series.visible || (!options.enabled && !series._hasPointLabels)) {\n                    return;\n                }\n\n                // Reset all labels that have been shortened\n                each(data, function(point) {\n                    if (point.dataLabel && point.visible && point.dataLabel.shortened) {\n                        point.dataLabel\n                            .attr({\n                                width: 'auto'\n                            }).css({\n                                width: 'auto',\n                                textOverflow: 'clip'\n                            });\n                        point.dataLabel.shortened = false;\n                    }\n                });\n\n\n                // run parent method\n                Series.prototype.drawDataLabels.apply(series);\n\n                each(data, function(point) {\n                    if (point.dataLabel && point.visible) { // #407, #2510\n\n                        // Arrange points for detection collision\n                        halves[point.half].push(point);\n\n                        // Reset positions (#4905)\n                        point.dataLabel._pos = null;\n                    }\n                });\n\n                /* Loop over the points in each half, starting from the top and bottom\n                 * of the pie to detect overlapping labels.\n                 */\n                each(halves, function(points, i) {\n\n                    var top,\n                        bottom,\n                        length = points.length,\n                        positions = [],\n                        naturalY,\n                        sideOverflow,\n                        positionsIndex, // Point index in positions array.\n                        size;\n\n                    if (!length) {\n                        return;\n                    }\n\n                    // Sort by angle\n                    series.sortByAngle(points, i - 0.5);\n                    // Only do anti-collision when we have dataLabels outside the pie \n                    // and have connectors. (#856)\n                    if (series.maxLabelDistance > 0) {\n                        top = Math.max(\n                            0,\n                            centerY - radius - series.maxLabelDistance\n                        );\n                        bottom = Math.min(\n                            centerY + radius + series.maxLabelDistance,\n                            chart.plotHeight\n                        );\n                        each(points, function(point) {\n                            // check if specific points' label is outside the pie\n                            if (point.labelDistance > 0 && point.dataLabel) {\n                                // point.top depends on point.labelDistance value\n                                // Used for calculation of y value in getX method \n                                point.top = Math.max(\n                                    0,\n                                    centerY - radius - point.labelDistance\n                                );\n                                point.bottom = Math.min(\n                                    centerY + radius + point.labelDistance,\n                                    chart.plotHeight\n                                );\n                                size = point.dataLabel.getBBox().height || 21;\n\n                                // point.positionsIndex is needed for getting index of \n                                // parameter related to specific point inside positions \n                                // array - not every point is in positions array.\n                                point.positionsIndex = positions.push({\n                                    target: point.labelPos[1] - point.top + size / 2,\n                                    size: size,\n                                    rank: point.y\n                                }) - 1;\n                            }\n                        });\n                        H.distribute(positions, bottom + size - top);\n                    }\n\n                    // Now the used slots are sorted, fill them up sequentially\n                    for (j = 0; j < length; j++) {\n\n                        point = points[j];\n                        positionsIndex = point.positionsIndex;\n                        labelPos = point.labelPos;\n                        dataLabel = point.dataLabel;\n                        visibility = point.visible === false ? 'hidden' : 'inherit';\n                        naturalY = labelPos[1];\n\n                        if (positions && defined(positions[positionsIndex])) {\n                            if (positions[positionsIndex].pos === undefined) {\n                                visibility = 'hidden';\n                            } else {\n                                labelHeight = positions[positionsIndex].size;\n                                y = point.top + positions[positionsIndex].pos;\n                            }\n\n                        } else {\n                            y = naturalY;\n                        }\n\n                        // It is needed to delete point.positionIndex for \n                        // dynamically added points etc.\n\n                        delete point.positionIndex;\n\n                        // get the x - use the natural x position for labels near the \n                        // top and bottom, to prevent the top and botton slice connectors \n                        // from touching each other on either side\n                        if (options.justify) {\n                            x = seriesCenter[0] + (i ? -1 : 1) * (radius + point.labelDistance);\n                        } else {\n                            x = series.getX(y < point.top + 2 || y > point.bottom - 2 ? naturalY : y, i, point);\n                        }\n\n\n                        // Record the placement and visibility\n                        dataLabel._attr = {\n                            visibility: visibility,\n                            align: labelPos[6]\n                        };\n                        dataLabel._pos = {\n                            x: x + options.x +\n                                ({\n                                    left: connectorPadding,\n                                    right: -connectorPadding\n                                }[labelPos[6]] || 0),\n                            y: y + options.y - 10 // 10 is for the baseline (label vs text)\n                        };\n                        labelPos.x = x;\n                        labelPos.y = y;\n\n\n                        // Detect overflowing data labels\n                        dataLabelWidth = dataLabel.getBBox().width;\n\n                        sideOverflow = null;\n                        // Overflow left\n                        if (x - dataLabelWidth < connectorPadding) {\n                            sideOverflow = Math.round(\n                                dataLabelWidth - x + connectorPadding\n                            );\n                            overflow[3] = Math.max(sideOverflow, overflow[3]);\n\n                            // Overflow right\n                        } else if (x + dataLabelWidth > plotWidth - connectorPadding) {\n                            sideOverflow = Math.round(\n                                x + dataLabelWidth - plotWidth + connectorPadding\n                            );\n                            overflow[1] = Math.max(sideOverflow, overflow[1]);\n                        }\n\n                        // Overflow top\n                        if (y - labelHeight / 2 < 0) {\n                            overflow[0] = Math.max(\n                                Math.round(-y + labelHeight / 2),\n                                overflow[0]\n                            );\n\n                            // Overflow left\n                        } else if (y + labelHeight / 2 > plotHeight) {\n                            overflow[2] = Math.max(\n                                Math.round(y + labelHeight / 2 - plotHeight),\n                                overflow[2]\n                            );\n                        }\n                        dataLabel.sideOverflow = sideOverflow;\n                    } // for each point\n                }); // for each half\n\n                // Do not apply the final placement and draw the connectors until we have verified\n                // that labels are not spilling over.\n                if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {\n\n                    // Place the labels in the final position\n                    this.placeDataLabels();\n\n                    // Draw the connectors\n                    if (connectorWidth) {\n                        each(this.points, function(point) {\n                            var isNew;\n\n                            connector = point.connector;\n                            dataLabel = point.dataLabel;\n\n                            if (\n                                dataLabel &&\n                                dataLabel._pos &&\n                                point.visible &&\n                                point.labelDistance > 0\n                            ) {\n                                visibility = dataLabel._attr.visibility;\n\n                                isNew = !connector;\n\n                                if (isNew) {\n                                    point.connector = connector = chart.renderer.path()\n                                        .addClass('highcharts-data-label-connector highcharts-color-' + point.colorIndex)\n                                        .add(series.dataLabelsGroup);\n\n\n                                }\n                                connector[isNew ? 'attr' : 'animate']({\n                                    d: series.connectorPath(point.labelPos)\n                                });\n                                connector.attr('visibility', visibility);\n\n                            } else if (connector) {\n                                point.connector = connector.destroy();\n                            }\n                        });\n                    }\n                }\n            };\n\n            /**\n             * Extendable method for getting the path of the connector between the data label\n             * and the pie slice.\n             */\n            seriesTypes.pie.prototype.connectorPath = function(labelPos) {\n                var x = labelPos.x,\n                    y = labelPos.y;\n                return pick(this.options.dataLabels.softConnector, true) ? [\n                    'M',\n                    x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n                    'C',\n                    x, y, // first break, next to the label\n                    2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ] : [\n                    'M',\n                    x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n                    'L',\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ];\n            };\n\n            /**\n             * Perform the final placement of the data labels after we have verified that they\n             * fall within the plot area.\n             */\n            seriesTypes.pie.prototype.placeDataLabels = function() {\n                each(this.points, function(point) {\n                    var dataLabel = point.dataLabel,\n                        _pos;\n                    if (dataLabel && point.visible) {\n                        _pos = dataLabel._pos;\n                        if (_pos) {\n\n                            // Shorten data labels with ellipsis if they still overflow\n                            // after the pie has reached minSize (#223).\n                            if (dataLabel.sideOverflow) {\n                                dataLabel._attr.width =\n                                    dataLabel.getBBox().width - dataLabel.sideOverflow;\n                                dataLabel.css({\n                                    width: dataLabel._attr.width + 'px',\n                                    textOverflow: 'ellipsis'\n                                });\n                                dataLabel.shortened = true;\n                            }\n\n                            dataLabel.attr(dataLabel._attr);\n                            dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n                            dataLabel.moved = true;\n                        } else if (dataLabel) {\n                            dataLabel.attr({\n                                y: -9999\n                            });\n                        }\n                    }\n                }, this);\n            };\n\n            seriesTypes.pie.prototype.alignDataLabel = noop;\n\n            /**\n             * Verify whether the data labels are allowed to draw, or we should run more translation and data\n             * label positioning to keep them inside the plot area. Returns true when data labels are ready\n             * to draw.\n             */\n            seriesTypes.pie.prototype.verifyDataLabelOverflow = function(overflow) {\n\n                var center = this.center,\n                    options = this.options,\n                    centerOption = options.center,\n                    minSize = options.minSize || 80,\n                    newSize = minSize,\n                    // If a size is set, return true and don't try to shrink the pie\n                    // to fit the labels.\n                    ret = options.size !== null;\n\n                if (!ret) {\n                    // Handle horizontal size and center\n                    if (centerOption[0] !== null) { // Fixed center\n                        newSize = Math.max(center[2] -\n                            Math.max(overflow[1], overflow[3]), minSize);\n\n                    } else { // Auto center\n                        newSize = Math.max(\n                            // horizontal overflow\n                            center[2] - overflow[1] - overflow[3],\n                            minSize\n                        );\n                        // horizontal center\n                        center[0] += (overflow[3] - overflow[1]) / 2;\n                    }\n\n                    // Handle vertical size and center\n                    if (centerOption[1] !== null) { // Fixed center\n                        newSize = Math.max(Math.min(newSize, center[2] -\n                            Math.max(overflow[0], overflow[2])), minSize);\n\n                    } else { // Auto center\n                        newSize = Math.max(\n                            Math.min(\n                                newSize,\n                                // vertical overflow\n                                center[2] - overflow[0] - overflow[2]\n                            ),\n                            minSize\n                        );\n                        // vertical center\n                        center[1] += (overflow[0] - overflow[2]) / 2;\n                    }\n\n                    // If the size must be decreased, we need to run translate and\n                    // drawDataLabels again\n                    if (newSize < center[2]) {\n                        center[2] = newSize;\n                        center[3] = Math.min( // #3632\n                            relativeLength(options.innerSize || 0, newSize),\n                            newSize\n                        );\n                        this.translate(center);\n\n                        if (this.drawDataLabels) {\n                            this.drawDataLabels();\n                        }\n                        // Else, return true to indicate that the pie and its labels is\n                        // within the plot area\n                    } else {\n                        ret = true;\n                    }\n                }\n                return ret;\n            };\n        }\n\n        if (seriesTypes.column) {\n\n            /**\n             * Override the basic data label alignment by adjusting for the position of the column\n             */\n            seriesTypes.column.prototype.alignDataLabel = function(point, dataLabel, options, alignTo, isNew) {\n                var inverted = this.chart.inverted,\n                    series = point.series,\n                    dlBox = point.dlBox || point.shapeArgs, // data label box for alignment\n                    below = pick(point.below, point.plotY > pick(this.translatedThreshold, series.yAxis.len)), // point.below is used in range series\n                    inside = pick(options.inside, !!this.options.stacking), // draw it inside the box?\n                    overshoot;\n\n                // Align to the column itself, or the top of it\n                if (dlBox) { // Area range uses this method but not alignTo\n                    alignTo = merge(dlBox);\n\n                    if (alignTo.y < 0) {\n                        alignTo.height += alignTo.y;\n                        alignTo.y = 0;\n                    }\n                    overshoot = alignTo.y + alignTo.height - series.yAxis.len;\n                    if (overshoot > 0) {\n                        alignTo.height -= overshoot;\n                    }\n\n                    if (inverted) {\n                        alignTo = {\n                            x: series.yAxis.len - alignTo.y - alignTo.height,\n                            y: series.xAxis.len - alignTo.x - alignTo.width,\n                            width: alignTo.height,\n                            height: alignTo.width\n                        };\n                    }\n\n                    // Compute the alignment box\n                    if (!inside) {\n                        if (inverted) {\n                            alignTo.x += below ? 0 : alignTo.width;\n                            alignTo.width = 0;\n                        } else {\n                            alignTo.y += below ? alignTo.height : 0;\n                            alignTo.height = 0;\n                        }\n                    }\n                }\n\n\n                // When alignment is undefined (typically columns and bars), display the individual\n                // point below or above the point depending on the threshold\n                options.align = pick(\n                    options.align, !inverted || inside ? 'center' : below ? 'right' : 'left'\n                );\n                options.verticalAlign = pick(\n                    options.verticalAlign,\n                    inverted || inside ? 'middle' : below ? 'top' : 'bottom'\n                );\n\n                // Call the parent method\n                Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n\n                // If label was justified and we have contrast, set it:\n                if (point.isLabelJustified && point.contrastColor) {\n                    point.dataLabel.css({\n                        color: point.contrastColor\n                    });\n                }\n            };\n        }\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         * Highcharts module to hide overlapping data labels. This module is included in\n         * Highcharts.\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            pick = H.pick,\n            addEvent = H.addEvent;\n\n        // Collect potensial overlapping data labels. Stack labels probably don't need\n        // to be considered because they are usually accompanied by data labels that lie\n        // inside the columns.\n        Chart.prototype.callbacks.push(function(chart) {\n            function collectAndHide() {\n                var labels = [];\n\n                each(chart.series || [], function(series) {\n                    var dlOptions = series.options.dataLabels,\n                        // Range series have two collections\n                        collections = series.dataLabelCollections || ['dataLabel'];\n\n                    if (\n                        (dlOptions.enabled || series._hasPointLabels) &&\n                        !dlOptions.allowOverlap &&\n                        series.visible\n                    ) { // #3866\n                        each(collections, function(coll) {\n                            each(series.points, function(point) {\n                                if (point[coll]) {\n                                    point[coll].labelrank = pick(\n                                        point.labelrank,\n                                        point.shapeArgs && point.shapeArgs.height\n                                    ); // #4118\n                                    labels.push(point[coll]);\n                                }\n                            });\n                        });\n                    }\n                });\n                chart.hideOverlappingLabels(labels);\n            }\n\n            // Do it now ...\n            collectAndHide();\n\n            // ... and after each chart redraw\n            addEvent(chart, 'redraw', collectAndHide);\n\n        });\n\n        /**\n         * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n         * provide a smooth visual imression.\n         */\n        Chart.prototype.hideOverlappingLabels = function(labels) {\n\n            var len = labels.length,\n                label,\n                i,\n                j,\n                label1,\n                label2,\n                isIntersecting,\n                pos1,\n                pos2,\n                parent1,\n                parent2,\n                padding,\n                intersectRect = function(x1, y1, w1, h1, x2, y2, w2, h2) {\n                    return !(\n                        x2 > x1 + w1 ||\n                        x2 + w2 < x1 ||\n                        y2 > y1 + h1 ||\n                        y2 + h2 < y1\n                    );\n                };\n\n            // Mark with initial opacity\n            for (i = 0; i < len; i++) {\n                label = labels[i];\n                if (label) {\n                    label.oldOpacity = label.opacity;\n                    label.newOpacity = 1;\n                }\n            }\n\n            // Prevent a situation in a gradually rising slope, that each label will\n            // hide the previous one because the previous one always has lower rank.\n            labels.sort(function(a, b) {\n                return (b.labelrank || 0) - (a.labelrank || 0);\n            });\n\n            // Detect overlapping labels\n            for (i = 0; i < len; i++) {\n                label1 = labels[i];\n\n                for (j = i + 1; j < len; ++j) {\n                    label2 = labels[j];\n                    if (\n                        label1 && label2 &&\n                        label1 !== label2 && // #6465, polar chart with connectEnds\n                        label1.placed && label2.placed &&\n                        label1.newOpacity !== 0 && label2.newOpacity !== 0\n                    ) {\n                        pos1 = label1.alignAttr;\n                        pos2 = label2.alignAttr;\n                        // Different panes have different positions\n                        parent1 = label1.parentGroup;\n                        parent2 = label2.parentGroup;\n                        // Substract the padding if no background or border (#4333)\n                        padding = 2 * (label1.box ? 0 : label1.padding);\n                        isIntersecting = intersectRect(\n                            pos1.x + parent1.translateX,\n                            pos1.y + parent1.translateY,\n                            label1.width - padding,\n                            label1.height - padding,\n                            pos2.x + parent2.translateX,\n                            pos2.y + parent2.translateY,\n                            label2.width - padding,\n                            label2.height - padding\n                        );\n\n                        if (isIntersecting) {\n                            (label1.labelrank < label2.labelrank ? label1 : label2)\n                            .newOpacity = 0;\n                        }\n                    }\n                }\n            }\n\n            // Hide or show\n            each(labels, function(label) {\n                var complete,\n                    newOpacity;\n\n                if (label) {\n                    newOpacity = label.newOpacity;\n\n                    if (label.oldOpacity !== newOpacity && label.placed) {\n\n                        // Make sure the label is completely hidden to avoid catching\n                        // clicks (#4362)\n                        if (newOpacity) {\n                            label.show(true);\n                        } else {\n                            complete = function() {\n                                label.hide();\n                            };\n                        }\n\n                        // Animate or set the opacity\t\t\t\t\t\n                        label.alignAttr.opacity = newOpacity;\n                        label[label.isOld ? 'animate' : 'attr'](\n                            label.alignAttr,\n                            null,\n                            complete\n                        );\n\n                    }\n                    label.isOld = true;\n                }\n            });\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Chart = H.Chart,\n            createElement = H.createElement,\n            css = H.css,\n            defaultOptions = H.defaultOptions,\n            defaultPlotOptions = H.defaultPlotOptions,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            hasTouch = H.hasTouch,\n            inArray = H.inArray,\n            isObject = H.isObject,\n            Legend = H.Legend,\n            merge = H.merge,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            svg = H.svg,\n            TrackerMixin;\n\n        /**\n         * TrackerMixin for points and graphs.\n         *\n         * @mixin\n         */\n        TrackerMixin = H.TrackerMixin = {\n\n            /**\n             * Draw the tracker for a point.\n             */\n            drawTrackerPoint: function() {\n                var series = this,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    onMouseOver = function(e) {\n                        var point = pointer.getPointFromEvent(e);\n                        // undefined on graph in scatterchart\n                        if (point !== undefined) {\n                            pointer.isDirectTouch = true;\n                            point.onMouseOver(e);\n                        }\n                    };\n\n                // Add reference to the point\n                each(series.points, function(point) {\n                    if (point.graphic) {\n                        point.graphic.element.point = point;\n                    }\n                    if (point.dataLabel) {\n                        if (point.dataLabel.div) {\n                            point.dataLabel.div.point = point;\n                        } else {\n                            point.dataLabel.element.point = point;\n                        }\n                    }\n                });\n\n                // Add the event listeners, we need to do this only once\n                if (!series._hasTracking) {\n                    each(series.trackerGroups, function(key) {\n                        if (series[key]) { // we don't always have dataLabelsGroup\n                            series[key]\n                                .addClass('highcharts-tracker')\n                                .on('mouseover', onMouseOver)\n                                .on('mouseout', function(e) {\n                                    pointer.onTrackerMouseOut(e);\n                                });\n                            if (hasTouch) {\n                                series[key].on('touchstart', onMouseOver);\n                            }\n\n\n                        }\n                    });\n                    series._hasTracking = true;\n                }\n            },\n\n            /**\n             * Draw the tracker object that sits above all data labels and markers to\n             * track mouse events on the graph or points. For the line type charts\n             * the tracker uses the same graphPath, but with a greater stroke width\n             * for better control.\n             */\n            drawTrackerGraph: function() {\n                var series = this,\n                    options = series.options,\n                    trackByArea = options.trackByArea,\n                    trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),\n                    trackerPathLength = trackerPath.length,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    renderer = chart.renderer,\n                    snap = chart.options.tooltip.snap,\n                    tracker = series.tracker,\n                    i,\n                    onMouseOver = function() {\n                        if (chart.hoverSeries !== series) {\n                            series.onMouseOver();\n                        }\n                    },\n                    /*\n                     * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable\n                     * IE6: 0.002\n                     * IE7: 0.002\n                     * IE8: 0.002\n                     * IE9: 0.00000000001 (unlimited)\n                     * IE10: 0.0001 (exporting only)\n                     * FF: 0.00000000001 (unlimited)\n                     * Chrome: 0.000001\n                     * Safari: 0.000001\n                     * Opera: 0.00000000001 (unlimited)\n                     */\n                    TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n\n                // Extend end points. A better way would be to use round linecaps,\n                // but those are not clickable in VML.\n                if (trackerPathLength && !trackByArea) {\n                    i = trackerPathLength + 1;\n                    while (i--) {\n                        if (trackerPath[i] === 'M') { // extend left side\n                            trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], 'L');\n                        }\n                        if ((i && trackerPath[i] === 'M') || i === trackerPathLength) { // extend right side\n                            trackerPath.splice(i, 0, 'L', trackerPath[i - 2] + snap, trackerPath[i - 1]);\n                        }\n                    }\n                }\n\n                // handle single points\n                /*for (i = 0; i < singlePoints.length; i++) {\n                \tsinglePoint = singlePoints[i];\n                \ttrackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,\n                \tL, singlePoint.plotX + snap, singlePoint.plotY);\n                }*/\n\n                // draw the tracker\n                if (tracker) {\n                    tracker.attr({\n                        d: trackerPath\n                    });\n                } else if (series.graph) { // create\n\n                    series.tracker = renderer.path(trackerPath)\n                        .attr({\n                            'stroke-linejoin': 'round', // #1225\n                            visibility: series.visible ? 'visible' : 'hidden',\n                            stroke: TRACKER_FILL,\n                            fill: trackByArea ? TRACKER_FILL : 'none',\n                            'stroke-width': series.graph.strokeWidth() + (trackByArea ? 0 : 2 * snap),\n                            zIndex: 2\n                        })\n                        .add(series.group);\n\n                    // The tracker is added to the series group, which is clipped, but is covered\n                    // by the marker group. So the marker group also needs to capture events.\n                    each([series.tracker, series.markerGroup], function(tracker) {\n                        tracker.addClass('highcharts-tracker')\n                            .on('mouseover', onMouseOver)\n                            .on('mouseout', function(e) {\n                                pointer.onTrackerMouseOut(e);\n                            });\n\n\n\n                        if (hasTouch) {\n                            tracker.on('touchstart', onMouseOver);\n                        }\n                    });\n                }\n            }\n        };\n        /* End TrackerMixin */\n\n\n        /**\n         * Add tracking event listener to the series group, so the point graphics\n         * themselves act as trackers\n         */\n\n        if (seriesTypes.column) {\n            seriesTypes.column.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n\n        if (seriesTypes.pie) {\n            seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n\n        if (seriesTypes.scatter) {\n            seriesTypes.scatter.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n\n        /*\n         * Extend Legend for item events\n         */\n        extend(Legend.prototype, {\n\n            setItemEvents: function(item, legendItem, useHTML) {\n                var legend = this,\n                    boxWrapper = legend.chart.renderer.boxWrapper,\n                    activeClass = 'highcharts-legend-' + (item.series ? 'point' : 'series') + '-active';\n\n                // Set the events on the item group, or in case of useHTML, the item itself (#1249)\n                (useHTML ? legendItem : item.legendGroup).on('mouseover', function() {\n                        item.setState('hover');\n\n                        // A CSS class to dim or hide other than the hovered series\n                        boxWrapper.addClass(activeClass);\n\n\n                    })\n                    .on('mouseout', function() {\n\n\n                        // A CSS class to dim or hide other than the hovered series\n                        boxWrapper.removeClass(activeClass);\n\n                        item.setState();\n                    })\n                    .on('click', function(event) {\n                        var strLegendItemClick = 'legendItemClick',\n                            fnLegendItemClick = function() {\n                                if (item.setVisible) {\n                                    item.setVisible();\n                                }\n                            };\n\n                        // Pass over the click/touch event. #4.\n                        event = {\n                            browserEvent: event\n                        };\n\n                        // click the name or symbol\n                        if (item.firePointEvent) { // point\n                            item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n                        } else {\n                            fireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n                        }\n                    });\n            },\n\n            createCheckboxForItem: function(item) {\n                var legend = this;\n\n                item.checkbox = createElement('input', {\n                    type: 'checkbox',\n                    checked: item.selected,\n                    defaultChecked: item.selected // required by IE7\n                }, legend.options.itemCheckboxStyle, legend.chart.container);\n\n                addEvent(item.checkbox, 'click', function(event) {\n                    var target = event.target;\n                    fireEvent(\n                        item.series || item,\n                        'checkboxClick', { // #3712\n                            checked: target.checked,\n                            item: item\n                        },\n                        function() {\n                            item.select();\n                        }\n                    );\n                });\n            }\n        });\n\n\n\n\n\n        /*\n         * Extend the Chart object with interaction\n         */\n\n        extend(Chart.prototype, /** @lends Chart.prototype */ {\n            /**\n             * Display the zoom button\n             */\n            showResetZoom: function() {\n                var chart = this,\n                    lang = defaultOptions.lang,\n                    btnOptions = chart.options.chart.resetZoomButton,\n                    theme = btnOptions.theme,\n                    states = theme.states,\n                    alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';\n\n                function zoomOut() {\n                    chart.zoomOut();\n                }\n\n                this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)\n                    .attr({\n                        align: btnOptions.position.align,\n                        title: lang.resetZoomTitle\n                    })\n                    .addClass('highcharts-reset-zoom')\n                    .add()\n                    .align(btnOptions.position, false, alignTo);\n\n            },\n\n            /**\n             * Zoom out to 1:1\n             */\n            zoomOut: function() {\n                var chart = this;\n                fireEvent(chart, 'selection', {\n                    resetSelection: true\n                }, function() {\n                    chart.zoom();\n                });\n            },\n\n            /**\n             * Zoom into a given portion of the chart given by axis coordinates\n             * @param {Object} event\n             */\n            zoom: function(event) {\n                var chart = this,\n                    hasZoomed,\n                    pointer = chart.pointer,\n                    displayButton = false,\n                    resetZoomButton;\n\n                // If zoom is called with no arguments, reset the axes\n                if (!event || event.resetSelection) {\n                    each(chart.axes, function(axis) {\n                        hasZoomed = axis.zoom();\n                    });\n                } else { // else, zoom in on all axes\n                    each(event.xAxis.concat(event.yAxis), function(axisData) {\n                        var axis = axisData.axis,\n                            isXAxis = axis.isXAxis;\n\n                        // don't zoom more than minRange\n                        if (pointer[isXAxis ? 'zoomX' : 'zoomY']) {\n                            hasZoomed = axis.zoom(axisData.min, axisData.max);\n                            if (axis.displayBtn) {\n                                displayButton = true;\n                            }\n                        }\n                    });\n                }\n\n                // Show or hide the Reset zoom button\n                resetZoomButton = chart.resetZoomButton;\n                if (displayButton && !resetZoomButton) {\n                    chart.showResetZoom();\n                } else if (!displayButton && isObject(resetZoomButton)) {\n                    chart.resetZoomButton = resetZoomButton.destroy();\n                }\n\n\n                // Redraw\n                if (hasZoomed) {\n                    chart.redraw(\n                        pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation\n                    );\n                }\n            },\n\n            /**\n             * Pan the chart by dragging the mouse across the pane. This function is called\n             * on mouse move, and the distance to pan is computed from chartX compared to\n             * the first chartX position in the dragging operation.\n             */\n            pan: function(e, panning) {\n\n                var chart = this,\n                    hoverPoints = chart.hoverPoints,\n                    doRedraw;\n\n                // remove active points for shared tooltip\n                if (hoverPoints) {\n                    each(hoverPoints, function(point) {\n                        point.setState();\n                    });\n                }\n\n                each(panning === 'xy' ? [1, 0] : [1], function(isX) { // xy is used in maps\n                    var axis = chart[isX ? 'xAxis' : 'yAxis'][0],\n                        horiz = axis.horiz,\n                        mousePos = e[horiz ? 'chartX' : 'chartY'],\n                        mouseDown = horiz ? 'mouseDownX' : 'mouseDownY',\n                        startPos = chart[mouseDown],\n                        halfPointRange = (axis.pointRange || 0) / 2,\n                        extremes = axis.getExtremes(),\n                        panMin = axis.toValue(startPos - mousePos, true) +\n                        halfPointRange,\n                        panMax = axis.toValue(startPos + axis.len - mousePos, true) -\n                        halfPointRange,\n                        flipped = panMax < panMin,\n                        newMin = flipped ? panMax : panMin,\n                        newMax = flipped ? panMin : panMax,\n                        paddedMin = Math.min(\n                            extremes.dataMin,\n                            axis.toValue(\n                                axis.toPixels(extremes.min) - axis.minPixelPadding\n                            )\n                        ),\n                        paddedMax = Math.max(\n                            extremes.dataMax,\n                            axis.toValue(\n                                axis.toPixels(extremes.max) + axis.minPixelPadding\n                            )\n                        ),\n                        spill;\n\n                    // If the new range spills over, either to the min or max, adjust\n                    // the new range.\n                    spill = paddedMin - newMin;\n                    if (spill > 0) {\n                        newMax += spill;\n                        newMin = paddedMin;\n                    }\n                    spill = newMax - paddedMax;\n                    if (spill > 0) {\n                        newMax = paddedMax;\n                        newMin -= spill;\n                    }\n\n                    // Set new extremes if they are actually new\n                    if (axis.series.length && newMin !== extremes.min && newMax !== extremes.max) {\n                        axis.setExtremes(\n                            newMin,\n                            newMax,\n                            false,\n                            false, {\n                                trigger: 'pan'\n                            }\n                        );\n                        doRedraw = true;\n                    }\n\n                    chart[mouseDown] = mousePos; // set new reference for next run\n                });\n\n                if (doRedraw) {\n                    chart.redraw(false);\n                }\n                css(chart.container, {\n                    cursor: 'move'\n                });\n            }\n        });\n\n        /*\n         * Extend the Point object with interaction\n         */\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Toggle the selection status of a point.\n             * @param  {Boolean} [selected]\n             *         When `true`, the point is selected. When `false`, the point is\n             *         unselected. When `null` or `undefined`, the selection state is\n             *         toggled.\n             * @param  {Boolean} [accumulate=false]\n             *         When `true`, the selection is added to other selected points.\n             *         When `false`, other selected points are deselected. Internally in\n             *         Highcharts, when {@link http://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect|allowPointSelect}\n             *         is `true`, selected points are accumulated on Control, Shift or\n             *         Cmd clicking the point.\n             *\n             * @see    Highcharts.Chart#getSelectedPoints\n             *\n             * @sample highcharts/members/point-select/\n             *         Select a point from a button\n             * @sample highcharts/chart/events-selection-points/\n             *         Select a range of points through a drag selection\n             * @sample maps/series/data-id/\n             *         Select a point in Highmaps\n             */\n            select: function(selected, accumulate) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n\n                selected = pick(selected, !point.selected);\n\n                // fire the event with the default handler\n                point.firePointEvent(selected ? 'select' : 'unselect', {\n                    accumulate: accumulate\n                }, function() {\n\n                    /**\n                     * Whether the point is selected or not. \n                     * @see Highcharts.Point#select\n                     * @memberof Highcharts.Point\n                     * @name selected\n                     * @type {Boolean}\n                     */\n                    point.selected = point.options.selected = selected;\n                    series.options.data[inArray(point, series.data)] = point.options;\n\n                    point.setState(selected && 'select');\n\n                    // unselect all other points unless Ctrl or Cmd + click\n                    if (!accumulate) {\n                        each(chart.getSelectedPoints(), function(loopPoint) {\n                            if (loopPoint.selected && loopPoint !== point) {\n                                loopPoint.selected = loopPoint.options.selected = false;\n                                series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;\n                                loopPoint.setState('');\n                                loopPoint.firePointEvent('unselect');\n                            }\n                        });\n                    }\n                });\n            },\n\n            /**\n             * Runs on mouse over the point\n             * \n             * @param {Object} e The event arguments\n             */\n            onMouseOver: function(e) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    pointer = chart.pointer;\n                e = e ?\n                    pointer.normalize(e) :\n                    // In cases where onMouseOver is called directly without an event\n                    pointer.getChartCoordinatesFromPoint(point, chart.inverted);\n                pointer.runPointActions(e, point);\n            },\n\n            /**\n             * Runs on mouse out from the point\n             */\n            onMouseOut: function() {\n                var point = this,\n                    chart = point.series.chart;\n                point.firePointEvent('mouseOut');\n                each(chart.hoverPoints || [], function(p) {\n                    p.setState();\n                });\n                chart.hoverPoints = chart.hoverPoint = null;\n            },\n\n            /**\n             * Import events from the series' and point's options. Only do it on\n             * demand, to save processing time on hovering.\n             */\n            importEvents: function() {\n                if (!this.hasImportedEvents) {\n                    var point = this,\n                        options = merge(point.series.options.point, point.options),\n                        events = options.events;\n\n                    point.events = events;\n\n                    H.objectEach(events, function(event, eventType) {\n                        addEvent(point, eventType, event);\n                    });\n                    this.hasImportedEvents = true;\n\n                }\n            },\n\n            /**\n             * Set the point's state\n             * @param {String} state\n             */\n            setState: function(state, move) {\n                var point = this,\n                    plotX = Math.floor(point.plotX), // #4586\n                    plotY = point.plotY,\n                    series = point.series,\n                    stateOptions = series.options.states[state] || {},\n                    markerOptions = defaultPlotOptions[series.type].marker &&\n                    series.options.marker,\n                    normalDisabled = markerOptions && markerOptions.enabled === false,\n                    markerStateOptions = (markerOptions && markerOptions.states &&\n                        markerOptions.states[state]) || {},\n                    stateDisabled = markerStateOptions.enabled === false,\n                    stateMarkerGraphic = series.stateMarkerGraphic,\n                    pointMarker = point.marker || {},\n                    chart = series.chart,\n                    halo = series.halo,\n                    haloOptions,\n                    markerAttribs,\n                    hasMarkers = markerOptions && series.markerAttribs,\n                    newSymbol;\n\n                state = state || ''; // empty string\n\n                if (\n                    // already has this state\n                    (state === point.state && !move) ||\n                    // selected points don't respond to hover\n                    (point.selected && state !== 'select') ||\n                    // series' state options is disabled\n                    (stateOptions.enabled === false) ||\n                    // general point marker's state options is disabled\n                    (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||\n                    // individual point marker's state options is disabled\n                    (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610\n\n                ) {\n                    return;\n                }\n\n                if (hasMarkers) {\n                    markerAttribs = series.markerAttribs(point, state);\n                }\n\n                // Apply hover styles to the existing point\n                if (point.graphic) {\n\n                    if (point.state) {\n                        point.graphic.removeClass('highcharts-point-' + point.state);\n                    }\n                    if (state) {\n                        point.graphic.addClass('highcharts-point-' + state);\n                    }\n\n                    /*attribs = radius ? { // new symbol attributes (#507, #612)\n                    \tx: plotX - radius,\n                    \ty: plotY - radius,\n                    \twidth: 2 * radius,\n                    \theight: 2 * radius\n                    } : {};*/\n\n\n\n                    if (markerAttribs) {\n                        point.graphic.animate(\n                            markerAttribs,\n                            pick(\n                                chart.options.chart.animation, // Turn off globally\n                                markerStateOptions.animation,\n                                markerOptions.animation\n                            )\n                        );\n                    }\n\n                    // Zooming in from a range with no markers to a range with markers\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic.hide();\n                    }\n                } else {\n                    // if a graphic is not applied to each point in the normal state, create a shared\n                    // graphic for the hover state\n                    if (state && markerStateOptions) {\n                        newSymbol = pointMarker.symbol || series.symbol;\n\n                        // If the point has another symbol than the previous one, throw away the\n                        // state marker graphic and force a new one (#1459)\n                        if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {\n                            stateMarkerGraphic = stateMarkerGraphic.destroy();\n                        }\n\n                        // Add a new state marker graphic\n                        if (!stateMarkerGraphic) {\n                            if (newSymbol) {\n                                series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(\n                                        newSymbol,\n                                        markerAttribs.x,\n                                        markerAttribs.y,\n                                        markerAttribs.width,\n                                        markerAttribs.height\n                                    )\n                                    .add(series.markerGroup);\n                                stateMarkerGraphic.currentSymbol = newSymbol;\n                            }\n\n                            // Move the existing graphic\n                        } else {\n                            stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054\n                                x: markerAttribs.x,\n                                y: markerAttribs.y\n                            });\n                        }\n\n                    }\n\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450\n                        stateMarkerGraphic.element.point = point; // #4310\n                    }\n                }\n\n                // Show me your halo\n                haloOptions = stateOptions.halo;\n                if (haloOptions && haloOptions.size) {\n                    if (!halo) {\n                        series.halo = halo = chart.renderer.path()\n                            // #5818, #5903, #6705\n                            .add((point.graphic || stateMarkerGraphic).parentGroup);\n                    }\n                    halo[move ? 'animate' : 'attr']({\n                        d: point.haloPath(haloOptions.size)\n                    });\n                    halo.attr({\n                        'class': 'highcharts-halo highcharts-color-' +\n                            pick(point.colorIndex, series.colorIndex)\n                    });\n                    halo.point = point; // #6055\n\n\n\n                } else if (halo && halo.point && halo.point.haloPath) {\n                    // Animate back to 0 on the current halo point (#6055)\n                    halo.animate({\n                        d: halo.point.haloPath(0)\n                    });\n                }\n\n                point.state = state;\n            },\n\n            /**\n             * Get the circular path definition for the halo\n             * @param  {Number} size The radius of the circular halo.\n             * @returns {Array} The path definition\n             */\n            haloPath: function(size) {\n                var series = this.series,\n                    chart = series.chart;\n\n                return chart.renderer.symbols.circle(\n                    Math.floor(this.plotX) - size,\n                    this.plotY - size,\n                    size * 2,\n                    size * 2\n                );\n            }\n        });\n\n        /*\n         * Extend the Series object with interaction\n         */\n\n        extend(Series.prototype, /** @lends Highcharts.Series.prototype */ {\n            /**\n             * Series mouse over handler\n             */\n            onMouseOver: function() {\n                var series = this,\n                    chart = series.chart,\n                    hoverSeries = chart.hoverSeries;\n\n                // set normal state to previous series\n                if (hoverSeries && hoverSeries !== series) {\n                    hoverSeries.onMouseOut();\n                }\n\n                // trigger the event, but to save processing time,\n                // only if defined\n                if (series.options.events.mouseOver) {\n                    fireEvent(series, 'mouseOver');\n                }\n\n                // hover this\n                series.setState('hover');\n                chart.hoverSeries = series;\n            },\n\n            /**\n             * Series mouse out handler\n             */\n            onMouseOut: function() {\n                // trigger the event only if listeners exist\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    tooltip = chart.tooltip,\n                    hoverPoint = chart.hoverPoint;\n\n                chart.hoverSeries = null; // #182, set to null before the mouseOut event fires\n\n                // trigger mouse out on the point, which must be in this series\n                if (hoverPoint) {\n                    hoverPoint.onMouseOut();\n                }\n\n                // fire the mouse out event\n                if (series && options.events.mouseOut) {\n                    fireEvent(series, 'mouseOut');\n                }\n\n\n                // hide the tooltip\n                if (tooltip && !series.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {\n                    tooltip.hide();\n                }\n\n                // set normal state\n                series.setState();\n            },\n\n            /**\n             * Set the state of the graph\n             */\n            setState: function(state) {\n                var series = this,\n                    options = series.options,\n                    graph = series.graph,\n                    stateOptions = options.states,\n                    lineWidth = options.lineWidth,\n                    attribs,\n                    i = 0;\n\n                state = state || '';\n\n                if (series.state !== state) {\n\n                    // Toggle class names\n                    each([\n                        series.group,\n                        series.markerGroup,\n                        series.dataLabelsGroup\n                    ], function(group) {\n                        if (group) {\n                            // Old state\n                            if (series.state) {\n                                group.removeClass('highcharts-series-' + series.state);\n                            }\n                            // New state\n                            if (state) {\n                                group.addClass('highcharts-series-' + state);\n                            }\n                        }\n                    });\n\n                    series.state = state;\n\n\n                }\n            },\n\n            /**\n             * Show or hide the series.\n             *\n             * @param  {Boolean} [visible]\n             *         True to show the series, false to hide. If undefined, the\n             *         visibility is toggled.\n             * @param  {Boolean} [redraw=true]\n             *         Whether to redraw the chart after the series is altered. If doing\n             *         more operations on the chart, it is a good idea to set redraw to\n             *         false and call {@link Chart#redraw|chart.redraw()} after.\n             */\n            setVisible: function(vis, redraw) {\n                var series = this,\n                    chart = series.chart,\n                    legendItem = series.legendItem,\n                    showOrHide,\n                    ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n                    oldVisibility = series.visible;\n\n                // if called without an argument, toggle visibility\n                series.visible = vis = series.options.visible = series.userOptions.visible = vis === undefined ? !oldVisibility : vis; // #5618\n                showOrHide = vis ? 'show' : 'hide';\n\n                // show or hide elements\n                each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker', 'tt'], function(key) {\n                    if (series[key]) {\n                        series[key][showOrHide]();\n                    }\n                });\n\n\n                // hide tooltip (#1361)\n                if (chart.hoverSeries === series || (chart.hoverPoint && chart.hoverPoint.series) === series) {\n                    series.onMouseOut();\n                }\n\n\n                if (legendItem) {\n                    chart.legend.colorizeItem(series, vis);\n                }\n\n\n                // rescale or adapt to resized chart\n                series.isDirty = true;\n                // in a stack, all other series are affected\n                if (series.options.stacking) {\n                    each(chart.series, function(otherSeries) {\n                        if (otherSeries.options.stacking && otherSeries.visible) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n\n                // show or hide linked series\n                each(series.linkedSeries, function(otherSeries) {\n                    otherSeries.setVisible(vis, false);\n                });\n\n                if (ignoreHiddenSeries) {\n                    chart.isDirtyBox = true;\n                }\n                if (redraw !== false) {\n                    chart.redraw();\n                }\n\n                fireEvent(series, showOrHide);\n            },\n\n            /**\n             * Show the series if hidden.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             */\n            show: function() {\n                this.setVisible(true);\n            },\n\n            /**\n             * Hide the series if visible. If the {@link\n             * https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries|\n             * chart.ignoreHiddenSeries} option is true, the chart is redrawn without\n             * this series.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             */\n            hide: function() {\n                this.setVisible(false);\n            },\n\n\n            /**\n             * Select or unselect the series. This means its {@link\n             * Highcharts.Series.selected|selected} property is set, the checkbox in the\n             * legend is toggled and when selected, the series is returned by the\n             * {@link Highcharts.Chart#getSelectedSeries} function.\n             *\n             * @param  {Boolean} [selected]\n             *         True to select the series, false to unselect. If\tundefined, the\n             *         selection state is toggled.\n             *\n             * @sample highcharts/members/series-select/\n             *         Select a series from a button\n             */\n            select: function(selected) {\n                var series = this;\n\n                series.selected = selected = (selected === undefined) ?\n                    !series.selected :\n                    selected;\n\n                if (series.checkbox) {\n                    series.checkbox.checked = selected;\n                }\n\n                fireEvent(series, selected ? 'select' : 'unselect');\n            },\n\n            drawTracker: TrackerMixin.drawTrackerGraph\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            isObject = H.isObject,\n            pick = H.pick,\n            splat = H.splat;\n\n        /**\n         * Update the chart based on the current chart/document size and options for\n         * responsiveness.\n         */\n        Chart.prototype.setResponsive = function(redraw) {\n            var options = this.options.responsive,\n                ruleIds = [],\n                currentResponsive = this.currentResponsive,\n                currentRuleIds;\n\n            if (options && options.rules) {\n                each(options.rules, function(rule) {\n                    if (rule._id === undefined) {\n                        rule._id = H.uniqueKey();\n                    }\n\n                    this.matchResponsiveRule(rule, ruleIds, redraw);\n                }, this);\n            }\n\n            // Merge matching rules\n            var mergedOptions = H.merge.apply(0, H.map(ruleIds, function(ruleId) {\n                return H.find(options.rules, function(rule) {\n                    return rule._id === ruleId;\n                }).chartOptions;\n            }));\n\n            // Stringified key for the rules that currently apply.\n            ruleIds = ruleIds.toString() || undefined;\n            currentRuleIds = currentResponsive && currentResponsive.ruleIds;\n\n\n            // Changes in what rules apply\n            if (ruleIds !== currentRuleIds) {\n\n                // Undo previous rules. Before we apply a new set of rules, we need to\n                // roll back completely to base options (#6291).\n                if (currentResponsive) {\n                    this.update(currentResponsive.undoOptions, redraw);\n                }\n\n                if (ruleIds) {\n                    // Get undo-options for matching rules\n                    this.currentResponsive = {\n                        ruleIds: ruleIds,\n                        mergedOptions: mergedOptions,\n                        undoOptions: this.currentOptions(mergedOptions)\n                    };\n\n                    this.update(mergedOptions, redraw);\n\n                } else {\n                    this.currentResponsive = undefined;\n                }\n            }\n        };\n\n        /**\n         * Handle a single responsiveness rule\n         */\n        Chart.prototype.matchResponsiveRule = function(rule, matches) {\n            var condition = rule.condition,\n                fn = condition.callback || function() {\n                    return this.chartWidth <= pick(condition.maxWidth, Number.MAX_VALUE) &&\n                        this.chartHeight <= pick(condition.maxHeight, Number.MAX_VALUE) &&\n                        this.chartWidth >= pick(condition.minWidth, 0) &&\n                        this.chartHeight >= pick(condition.minHeight, 0);\n                };\n\n            if (fn.call(this)) {\n                matches.push(rule._id);\n            }\n\n        };\n\n        /**\n         * Get the current values for a given set of options. Used before we update\n         * the chart with a new responsiveness rule.\n         * TODO: Restore axis options (by id?)\n         */\n        Chart.prototype.currentOptions = function(options) {\n\n            var ret = {};\n\n            /**\n             * Recurse over a set of options and its current values,\n             * and store the current values in the ret object.\n             */\n            function getCurrent(options, curr, ret, depth) {\n                var i;\n                H.objectEach(options, function(val, key) {\n                    if (!depth && inArray(key, ['series', 'xAxis', 'yAxis']) > -1) {\n                        options[key] = splat(options[key]);\n\n                        ret[key] = [];\n\n                        // Iterate over collections like series, xAxis or yAxis and map\n                        // the items by index.\n                        for (i = 0; i < options[key].length; i++) {\n                            if (curr[key][i]) { // Item exists in current data (#6347)\n                                ret[key][i] = {};\n                                getCurrent(\n                                    val[i],\n                                    curr[key][i],\n                                    ret[key][i],\n                                    depth + 1\n                                );\n                            }\n                        }\n                    } else if (isObject(val)) {\n                        ret[key] = isArray(val) ? [] : {};\n                        getCurrent(val, curr[key] || {}, ret[key], depth + 1);\n                    } else {\n                        ret[key] = curr[key] || null;\n                    }\n                });\n            }\n\n            getCurrent(options, this.options, ret, 0);\n            return ret;\n        };\n\n    }(Highcharts));\n    return Highcharts\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/accessibility.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Accessibility module\n\n (c) 2010-2017 Highsoft AS\n Author: Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(q){\"object\"===typeof module&&module.exports?module.exports=q:q(Highcharts)})(function(q){(function(e){function q(a){return a.replace(/&/g,\"\\x26amp;\").replace(/</g,\"\\x26lt;\").replace(/>/g,\"\\x26gt;\").replace(/\"/g,\"\\x26quot;\").replace(/'/g,\"\\x26#x27;\").replace(/\\//g,\"\\x26#x2F;\")}function z(a){for(var c=a.childNodes.length;c--;)a.appendChild(a.childNodes[c])}function k(a){var c;a&&a.onclick&&l.createEvent&&(c=l.createEvent(\"Events\"),c.initEvent(\"click\",!0,!1),a.onclick(c))}var y=e.win,l=y.document,\ng=e.each,A=e.erase,u=e.addEvent,B=e.removeEvent,x=e.fireEvent,C=e.dateFormat,w=e.merge,r={\"default\":[\"series\",\"data point\",\"data points\"],line:[\"line\",\"data point\",\"data points\"],spline:[\"line\",\"data point\",\"data points\"],area:[\"line\",\"data point\",\"data points\"],areaspline:[\"line\",\"data point\",\"data points\"],pie:[\"pie\",\"slice\",\"slices\"],column:[\"column series\",\"column\",\"columns\"],bar:[\"bar series\",\"bar\",\"bars\"],scatter:[\"scatter series\",\"data point\",\"data points\"],boxplot:[\"boxplot series\",\"box\",\n\"boxes\"],arearange:[\"arearange series\",\"data point\",\"data points\"],areasplinerange:[\"areasplinerange series\",\"data point\",\"data points\"],bubble:[\"bubble series\",\"bubble\",\"bubbles\"],columnrange:[\"columnrange series\",\"column\",\"columns\"],errorbar:[\"errorbar series\",\"errorbar\",\"errorbars\"],funnel:[\"funnel\",\"data point\",\"data points\"],pyramid:[\"pyramid\",\"data point\",\"data points\"],waterfall:[\"waterfall series\",\"column\",\"columns\"],map:[\"map\",\"area\",\"areas\"],mapline:[\"line\",\"data point\",\"data points\"],mappoint:[\"point series\",\n\"data point\",\"data points\"],mapbubble:[\"bubble series\",\"bubble\",\"bubbles\"]},D={boxplot:\" Box plot charts are typically used to display groups of statistical data. Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile and maximum. \",arearange:\" Arearange charts are line charts displaying a range between a lower and higher value for each point. \",areasplinerange:\" These charts are line charts displaying a range between a lower and higher value for each point. \",\nbubble:\" Bubble charts are scatter charts where each data point also has a size value. \",columnrange:\" Columnrange charts are column charts displaying a range between a lower and higher value for each point. \",errorbar:\" Errorbar series are used to display the variability of the data. \",funnel:\" Funnel charts are used to display reduction of data in stages. \",pyramid:\" Pyramid charts consist of a single pyramid with item heights corresponding to each point value. \",waterfall:\" A waterfall chart is a column chart where each column contributes towards a total end value. \"};\ne.Series.prototype.commonKeys=\"name id category x value y\".split(\" \");e.Series.prototype.specialKeys=\"z open high q3 median q1 low close\".split(\" \");e.seriesTypes.pie&&(e.seriesTypes.pie.prototype.specialKeys=[]);e.setOptions({accessibility:{enabled:!0,pointDescriptionThreshold:30,keyboardNavigation:{enabled:!0}}});e.wrap(e.Series.prototype,\"render\",function(a){a.apply(this,Array.prototype.slice.call(arguments,1));this.chart.options.accessibility.enabled&&this.setA11yDescription()});e.Series.prototype.setA11yDescription=\nfunction(){var a=this.chart.options.accessibility,c=this.points&&this.points.length&&this.points[0].graphic&&this.points[0].graphic.element,d=c&&c.parentNode||this.graph&&this.graph.element||this.group&&this.group.element;d&&(d.lastChild===c&&z(d),this.points&&(this.points.length<a.pointDescriptionThreshold||!1===a.pointDescriptionThreshold)&&g(this.points,function(b){b.graphic&&(b.graphic.element.setAttribute(\"role\",\"img\"),b.graphic.element.setAttribute(\"tabindex\",\"-1\"),b.graphic.element.setAttribute(\"aria-label\",\nb.series.options.pointDescriptionFormatter&&b.series.options.pointDescriptionFormatter(b)||a.pointDescriptionFormatter&&a.pointDescriptionFormatter(b)||b.buildPointInfoString()))}),1<this.chart.series.length||a.describeSingleSeries)&&(d.setAttribute(\"role\",this.options.exposeElementToA11y?\"img\":\"region\"),d.setAttribute(\"tabindex\",\"-1\"),d.setAttribute(\"aria-label\",a.seriesDescriptionFormatter&&a.seriesDescriptionFormatter(this)||this.buildSeriesInfoString()))};e.Series.prototype.buildSeriesInfoString=\nfunction(){var a=r[this.type]||r[\"default\"],c=this.description||this.options.description;return(this.name?this.name+\", \":\"\")+(1===this.chart.types.length?a[0]:\"series\")+\" \"+(this.index+1)+\" of \"+this.chart.series.length+(1===this.chart.types.length?\" with \":\". \"+a[0]+\" with \")+(this.points.length+\" \"+(1===this.points.length?a[1]:a[2]))+(c?\". \"+c:\"\")+(1<this.chart.yAxis.length&&this.yAxis?\". Y axis, \"+this.yAxis.getDescription():\"\")+(1<this.chart.xAxis.length&&this.xAxis?\". X axis, \"+this.xAxis.getDescription():\n\"\")};e.Point.prototype.buildPointInfoString=function(){var a=this,c=a.series,d=c.chart.options.accessibility,b=\"\",f=c.xAxis&&c.xAxis.isDatetimeAxis,d=f&&C(d.pointDateFormatter&&d.pointDateFormatter(a)||d.pointDateFormat||e.Tooltip.prototype.getXDateFormat(a,c.chart.options.tooltip,c.xAxis),a.x);e.find(c.specialKeys,function(b){return void 0!==a[b]})?(f&&(b=d),g(c.commonKeys.concat(c.specialKeys),function(c){void 0===a[c]||f&&\"x\"===c||(b+=(b?\". \":\"\")+c+\", \"+a[c])})):b=(this.name||d||this.category||\nthis.id||\"x, \"+this.x)+\", \"+(void 0!==this.value?this.value:this.y);return this.index+1+\". \"+b+\".\"+(this.description?\" \"+this.description:\"\")};e.Axis.prototype.getDescription=function(){return this.userOptions&&this.userOptions.description||this.axisTitle&&this.axisTitle.textStr||this.options.id||this.categories&&\"categories\"||\"values\"};e.Axis.prototype.panStep=function(a,c){var d=c||3;c=this.getExtremes();var b=(c.max-c.min)/d*a,d=c.max+b,b=c.min+b,f=d-b;0>a&&b<c.dataMin?(b=c.dataMin,d=b+f):0<a&&\nd>c.dataMax&&(d=c.dataMax,b=d-f);this.setExtremes(b,d)};e.wrap(e.Series.prototype,\"init\",function(a){a.apply(this,Array.prototype.slice.call(arguments,1));var c=this.chart;c.options.accessibility.enabled&&(c.types=c.types||[],0>c.types.indexOf(this.type)&&c.types.push(this.type),u(this,\"remove\",function(){var a=this,b=!1;g(c.series,function(f){f!==a&&0>c.types.indexOf(a.type)&&(b=!0)});b||A(c.types,a.type)}))});e.Chart.prototype.getTypeDescription=function(){var a=this.types&&this.types[0],c=this.series[0]&&\nthis.series[0].mapTitle;if(a){if(\"map\"===a)return c?\"Map of \"+c:\"Map of unspecified region.\";if(1<this.types.length)return\"Combination chart.\";if(-1<[\"spline\",\"area\",\"areaspline\"].indexOf(a))return\"Line chart.\"}else return\"Empty chart.\";return a+\" chart.\"+(D[a]||\"\")};e.Chart.prototype.getAxesDescription=function(){var a=this.xAxis.length,c=this.yAxis.length,d={},b;if(a)if(d.xAxis=\"The chart has \"+a+(1<a?\" X axes\":\" X axis\")+\" displaying \",2>a)d.xAxis+=this.xAxis[0].getDescription()+\".\";else{for(b=\n0;b<a-1;++b)d.xAxis+=(b?\", \":\"\")+this.xAxis[b].getDescription();d.xAxis+=\" and \"+this.xAxis[b].getDescription()+\".\"}if(c)if(d.yAxis=\"The chart has \"+c+(1<c?\" Y axes\":\" Y axis\")+\" displaying \",2>c)d.yAxis+=this.yAxis[0].getDescription()+\".\";else{for(b=0;b<c-1;++b)d.yAxis+=(b?\", \":\"\")+this.yAxis[b].getDescription();d.yAxis+=\" and \"+this.yAxis[b].getDescription()+\".\"}return d};e.Chart.prototype.addAccessibleContextMenuAttribs=function(){var a=this.exportDivElements;a&&(g(a,function(a){\"DIV\"!==a.tagName||\na.children&&a.children.length||(a.setAttribute(\"role\",\"menuitem\"),a.setAttribute(\"tabindex\",-1))}),a[0].parentNode.setAttribute(\"role\",\"menu\"),a[0].parentNode.setAttribute(\"aria-label\",\"Chart export\"))};e.Point.prototype.highlight=function(){var a=this.series.chart;this.graphic&&this.graphic.element.focus&&this.graphic.element.focus();this.isNull?a.tooltip&&a.tooltip.hide(0):(this.onMouseOver(),a.tooltip&&a.tooltip.refresh(a.tooltip.shared?[this]:this));a.highlightedPoint=this;return this};e.Chart.prototype.highlightAdjacentPoint=\nfunction(a){var c=this.series,d=this.highlightedPoint,b=d&&d.index||0,f=d&&d.series.points,E=d&&d.series.connectEnds&&b>f.length-3?2:1;if(!c[0]||!c[0].points)return!1;if(!d)return c[0].points[0].highlight();if(f[b]!==d)for(var e=0;e<f.length;++e)if(f[e]===d){b=e;break}c=c[d.series.index+(a?1:-1)];b=f[b+(a?E:-1)]||c&&c.points[a?0:c.points.length-(c.connectEnds?2:1)];return void 0===b?!1:b.isNull&&this.options.accessibility.keyboardNavigation.skipNullPoints||b.series.options.skipKeyboardNavigation?\n(this.highlightedPoint=b,this.highlightAdjacentPoint(a)):b.highlight()};e.Chart.prototype.showExportMenu=function(){this.exportSVGElements&&this.exportSVGElements[0]&&(this.exportSVGElements[0].element.onclick(),this.highlightExportItem(0))};e.Chart.prototype.highlightExportItem=function(a){var c=this.exportDivElements&&this.exportDivElements[a],d=this.exportDivElements&&this.exportDivElements[this.highlightedExportItem];if(c&&\"DIV\"===c.tagName&&(!c.children||!c.children.length)){c.focus&&c.focus();\nif(d&&d.onmouseout)d.onmouseout();if(c.onmouseover)c.onmouseover();this.highlightedExportItem=a;return!0}};e.Chart.prototype.highlightRangeSelectorButton=function(a){var c=this.rangeSelector.buttons;c[this.highlightedRangeSelectorItemIx]&&c[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState||0);this.highlightedRangeSelectorItemIx=a;return c[a]?(c[a].element.focus&&c[a].element.focus(),this.oldRangeSelectorItemState=c[a].state,c[a].setState(2),!0):!1};e.Chart.prototype.highlightLegendItem=\nfunction(a){var c=this.legend.allItems;c[this.highlightedLegendItemIx]&&x(c[this.highlightedLegendItemIx].legendGroup.element,\"mouseout\");this.highlightedLegendItemIx=a;return c[a]?(c[a].legendGroup.element.focus&&c[a].legendGroup.element.focus(),x(c[a].legendGroup.element,\"mouseover\"),!0):!1};e.Chart.prototype.hideExportMenu=function(){var a=this.exportDivElements;if(a){g(a,function(a){x(a,\"mouseleave\")});if(a[this.highlightedExportItem]&&a[this.highlightedExportItem].onmouseout)a[this.highlightedExportItem].onmouseout();\nthis.highlightedExportItem=0;this.renderTo.focus()}};e.Chart.prototype.addKeyboardNavEvents=function(){function a(b){this.keyCodeMap=b.keyCodeMap;this.move=b.move;this.validate=b.validate;this.init=b.init;this.transformTabs=!1!==b.transformTabs}function c(c,d){return new a(w({keyCodeMap:c,move:function(a){b.keyboardNavigationModuleIndex+=a;var c=b.keyboardNavigationModules[b.keyboardNavigationModuleIndex];if(c){if(c.validate&&!c.validate())return this.move(a);if(c.init)return c.init(a),!0}b.keyboardNavigationModuleIndex=\n0;b.slipNextTab=!0;return!1}},d))}function d(a){a=a||y.event;var c=b.keyboardNavigationModules[b.keyboardNavigationModuleIndex];9===(a.which||a.keyCode)&&b.slipNextTab?b.slipNextTab=!1:(b.slipNextTab=!1,c&&c.run(a)&&a.preventDefault())}var b=this;a.prototype={run:function(b){var a=this,c=b.which||b.keyCode,f=!1,c=this.transformTabs&&9===c?b.shiftKey?37:39:c;g(this.keyCodeMap,function(d){-1<d[0].indexOf(c)&&(f=!1===d[1].call(a,c,b)?!1:!0)});return f}};b.keyboardNavigationModules=[c([[[37,39],function(a){if(!b.highlightAdjacentPoint(39===\na))return this.move(39===a?1:-1)}],[[38,40],function(a){var c;if(b.highlightedPoint)if((c=b.series[b.highlightedPoint.series.index+(38===a?-1:1)])&&c.points[0])c.points[0].highlight();else return this.move(40===a?1:-1)}],[[13,32],function(){b.highlightedPoint&&b.highlightedPoint.firePointEvent(\"click\")}]],{init:function(a){var c=b.series&&b.series[b.series.length-1],c=c&&c.points&&c.points[c.points.length-1];0>a&&c&&c.highlight()}}),c([[[37,38],function(){for(var a=b.highlightedExportItem||0,c=!0,\nd=b.series;a--;)if(b.highlightExportItem(a)){c=!1;break}if(c)return b.hideExportMenu(),d&&d.length&&(a=d[d.length-1],a.points.length&&a.points[a.points.length-1].highlight()),this.move(-1)}],[[39,40],function(){for(var a=!0,c=(b.highlightedExportItem||0)+1;c<b.exportDivElements.length;++c)if(b.highlightExportItem(c)){a=!1;break}if(a)return b.hideExportMenu(),this.move(1)}],[[13,32],function(){k(b.exportDivElements[b.highlightedExportItem])}]],{validate:function(){return b.exportChart&&!(b.options.exporting&&\n!1===b.options.exporting.enabled)},init:function(a){b.highlightedPoint=null;b.showExportMenu();if(0>a&&b.exportDivElements)for(a=b.exportDivElements.length;-1<a&&!b.highlightExportItem(a);--a);}}),c([[[38,40,37,39],function(a){b[38===a||40===a?\"yAxis\":\"xAxis\"][0].panStep(39>a?-1:1)}],[[9],function(a,c){b.mapNavButtons[b.focusedMapNavButtonIx].setState(0);if(c.shiftKey&&!b.focusedMapNavButtonIx||!c.shiftKey&&b.focusedMapNavButtonIx)return b.mapZoom(),this.move(c.shiftKey?-1:1);b.focusedMapNavButtonIx+=\nc.shiftKey?-1:1;a=b.mapNavButtons[b.focusedMapNavButtonIx];a.element.focus&&a.element.focus();a.setState(2)}],[[13,32],function(){k(b.mapNavButtons[b.focusedMapNavButtonIx].element)}]],{validate:function(){return b.mapZoom&&b.mapNavButtons&&2===b.mapNavButtons.length},transformTabs:!1,init:function(a){var c=b.mapNavButtons[0],d=b.mapNavButtons[1],c=0<a?c:d;g(b.mapNavButtons,function(a,b){a.element.setAttribute(\"tabindex\",-1);a.element.setAttribute(\"role\",\"button\");a.element.setAttribute(\"aria-label\",\n\"Zoom \"+(b?\"out\":\"\")+\"chart\")});c.element.focus&&c.element.focus();c.setState(2);b.focusedMapNavButtonIx=0<a?0:1}}),c([[[37,39,38,40],function(a){a=37===a||38===a?-1:1;if(!b.highlightRangeSelectorButton(b.highlightedRangeSelectorItemIx+a))return this.move(a)}],[[13,32],function(){3!==b.oldRangeSelectorItemState&&k(b.rangeSelector.buttons[b.highlightedRangeSelectorItemIx].element)}]],{validate:function(){return b.rangeSelector&&b.rangeSelector.buttons&&b.rangeSelector.buttons.length},init:function(a){g(b.rangeSelector.buttons,\nfunction(a){a.element.setAttribute(\"tabindex\",\"-1\");a.element.setAttribute(\"role\",\"button\");a.element.setAttribute(\"aria-label\",\"Select range \"+(a.text&&a.text.textStr))});b.highlightRangeSelectorButton(0<a?0:b.rangeSelector.buttons.length-1)}}),c([[[9,38,40],function(a,c){a=9===a&&c.shiftKey||38===a?-1:1;c=b.highlightedInputRangeIx+=a;if(1<c||0>c)return this.move(a);b.rangeSelector[c?\"maxInput\":\"minInput\"].focus()}]],{validate:function(){return b.rangeSelector&&b.rangeSelector.inputGroup&&\"hidden\"!==\nb.rangeSelector.inputGroup.element.getAttribute(\"visibility\")&&!1!==b.options.rangeSelector.inputEnabled&&b.rangeSelector.minInput&&b.rangeSelector.maxInput},transformTabs:!1,init:function(a){b.highlightedInputRangeIx=0<a?0:1;b.rangeSelector[b.highlightedInputRangeIx?\"maxInput\":\"minInput\"].focus()}}),c([[[37,39,38,40],function(a){a=37===a||38===a?-1:1;if(!b.highlightLegendItem(b.highlightedLegendItemIx+a))return this.move(a)}],[[13,32],function(){k(b.legend.allItems[b.highlightedLegendItemIx].legendItem.element.parentNode)}]],\n{validate:function(){return b.legend&&b.legend.allItems&&!(b.colorAxis&&b.colorAxis.length)},init:function(a){g(b.legend.allItems,function(a){a.legendGroup.element.setAttribute(\"tabindex\",\"-1\");a.legendGroup.element.setAttribute(\"role\",\"button\");a.legendGroup.element.setAttribute(\"aria-label\",\"Toggle visibility of series \"+a.name)});b.highlightLegendItem(0<a?0:b.legend.allItems.length-1)}})];b.keyboardNavigationModuleIndex=0;b.container.hasAttribute&&!b.container.hasAttribute(\"tabIndex\")&&b.container.setAttribute(\"tabindex\",\n\"0\");u(b.renderTo,\"keydown\",d);u(b,\"destroy\",function(){B(b.renderTo,\"keydown\",d)})};e.Chart.prototype.addScreenReaderRegion=function(a,c){var d=this,b=d.series,e=d.options,g=e.accessibility,m=d.screenReaderRegion=l.createElement(\"div\"),k=l.createElement(\"h4\"),n=l.createElement(\"a\"),v=l.createElement(\"h4\"),t={position:\"absolute\",left:\"-9999px\",top:\"auto\",width:\"1px\",height:\"1px\",overflow:\"hidden\"},h=d.types||[],h=(1===h.length&&\"pie\"===h[0]||\"map\"===h[0])&&{}||d.getAxesDescription(),p=b[0]&&r[b[0].type]||\nr[\"default\"];m.setAttribute(\"id\",a);m.setAttribute(\"role\",\"region\");m.setAttribute(\"aria-label\",\"Chart screen reader information.\");m.innerHTML=g.screenReaderSectionFormatter&&g.screenReaderSectionFormatter(d)||\"\\x3cdiv\\x3eUse regions/landmarks to skip ahead to chart\"+(1<b.length?\" and navigate between data series\":\"\")+\".\\x3c/div\\x3e\\x3ch3\\x3e\"+(e.title.text?q(e.title.text):\"Chart\")+(e.subtitle&&e.subtitle.text?\". \"+q(e.subtitle.text):\"\")+\"\\x3c/h3\\x3e\\x3ch4\\x3eLong description.\\x3c/h4\\x3e\\x3cdiv\\x3e\"+\n(e.chart.description||\"No description available.\")+\"\\x3c/div\\x3e\\x3ch4\\x3eStructure.\\x3c/h4\\x3e\\x3cdiv\\x3eChart type: \"+(e.chart.typeDescription||d.getTypeDescription())+\"\\x3c/div\\x3e\"+(1===b.length?\"\\x3cdiv\\x3e\"+p[0]+\" with \"+b[0].points.length+\" \"+(1===b[0].points.length?p[1]:p[2])+\".\\x3c/div\\x3e\":\"\")+(h.xAxis?\"\\x3cdiv\\x3e\"+h.xAxis+\"\\x3c/div\\x3e\":\"\")+(h.yAxis?\"\\x3cdiv\\x3e\"+h.yAxis+\"\\x3c/div\\x3e\":\"\");d.getCSV&&(n.innerHTML=\"View as data table.\",n.href=\"#\"+c,n.setAttribute(\"tabindex\",\"-1\"),n.onclick=\ng.onTableAnchorClick||function(){d.viewData();l.getElementById(c).focus()},k.appendChild(n),m.appendChild(k));v.innerHTML=\"Chart graphic.\";d.renderTo.insertBefore(v,d.renderTo.firstChild);d.renderTo.insertBefore(m,d.renderTo.firstChild);w(!0,v.style,t);w(!0,m.style,t)};e.Chart.prototype.callbacks.push(function(a){var c=a.options,d=c.accessibility;if(d.enabled){var b=l.createElementNS(\"http://www.w3.org/2000/svg\",\"title\"),f=l.createElementNS(\"http://www.w3.org/2000/svg\",\"g\"),k=a.container.getElementsByTagName(\"desc\")[0],\nm=a.container.getElementsByTagName(\"text\"),r=\"highcharts-title-\"+a.index,n=\"highcharts-data-table-\"+a.index,v=\"highcharts-information-region-\"+a.index,t=c.title.text||\"Chart\",h=c.exporting&&c.exporting.csv&&c.exporting.csv.columnHeaderFormatter,p=[];b.textContent=q(t);b.id=r;k.parentNode.insertBefore(b,k);a.renderTo.setAttribute(\"role\",\"region\");a.renderTo.setAttribute(\"aria-label\",\"Interactive chart. \"+t+\". Use up and down arrows to navigate with most screen readers.\");if(a.exportSVGElements&&a.exportSVGElements[0]&&\na.exportSVGElements[0].element){var u=a.exportSVGElements[0].element.onclick,b=a.exportSVGElements[0].element.parentNode;a.exportSVGElements[0].element.onclick=function(){u.apply(this,Array.prototype.slice.call(arguments));a.addAccessibleContextMenuAttribs();a.highlightExportItem(0)};a.exportSVGElements[0].element.setAttribute(\"role\",\"button\");a.exportSVGElements[0].element.setAttribute(\"aria-label\",\"View export menu\");f.appendChild(a.exportSVGElements[0].element);f.setAttribute(\"role\",\"region\");\nf.setAttribute(\"aria-label\",\"Chart export menu\");b.appendChild(f)}a.rangeSelector&&g([\"minInput\",\"maxInput\"],function(b,c){a.rangeSelector[b]&&(a.rangeSelector[b].setAttribute(\"tabindex\",\"-1\"),a.rangeSelector[b].setAttribute(\"role\",\"textbox\"),a.rangeSelector[b].setAttribute(\"aria-label\",\"Select \"+(c?\"end\":\"start\")+\" date.\"))});g(m,function(a){a.setAttribute(\"aria-hidden\",\"true\")});a.addScreenReaderRegion(v,n);d.keyboardNavigation.enabled&&a.addKeyboardNavEvents();w(!0,c.exporting,{csv:{columnHeaderFormatter:function(a,\nb,c){if(!a)return\"Category\";if(a instanceof e.Axis)return a.options.title&&a.options.title.text||(a.isDatetimeAxis?\"DateTime\":\"Category\");var d=p[p.length-1];1<c&&(d&&d.text)!==a.name&&p.push({text:a.name,span:c});return h?h.call(this,a,b,c):1<c?b:a.name}}});e.wrap(a,\"getTable\",function(a){return a.apply(this,Array.prototype.slice.call(arguments,1)).replace(\"\\x3ctable\\x3e\",'\\x3ctable id\\x3d\"'+n+'\" summary\\x3d\"Table representation of chart\"\\x3e\\x3ccaption\\x3e'+t+\"\\x3c/caption\\x3e\")});e.wrap(a,\"viewData\",\nfunction(a){if(!this.dataTableDiv){a.apply(this,Array.prototype.slice.call(arguments,1));var b=l.getElementById(n),c=b.getElementsByTagName(\"thead\")[0],d=b.getElementsByTagName(\"tbody\")[0],e=c.firstChild.children,f=\"\\x3ctr\\x3e\\x3ctd\\x3e\\x3c/td\\x3e\",h,k;b.setAttribute(\"tabindex\",\"-1\");g(d.children,function(a){h=a.firstChild;k=l.createElement(\"th\");k.setAttribute(\"scope\",\"row\");k.innerHTML=h.innerHTML;h.parentNode.replaceChild(k,h)});g(e,function(a){\"TH\"===a.tagName&&a.setAttribute(\"scope\",\"col\")});\np.length&&(g(p,function(a){f+='\\x3cth scope\\x3d\"col\" colspan\\x3d\"'+a.span+'\"\\x3e'+a.text+\"\\x3c/th\\x3e\"}),c.insertAdjacentHTML(\"afterbegin\",f))}})}})})(q)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/accessibility.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Accessibility module\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Accessibility module\n         *\n         * (c) 2010-2017 Highsoft AS\n         * Author: Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var win = H.win,\n            doc = win.document,\n            each = H.each,\n            erase = H.erase,\n            addEvent = H.addEvent,\n            removeEvent = H.removeEvent,\n            fireEvent = H.fireEvent,\n            dateFormat = H.dateFormat,\n            merge = H.merge,\n            // Human readable description of series and each point in singular and plural\n            typeToSeriesMap = {\n                'default': ['series', 'data point', 'data points'],\n                'line': ['line', 'data point', 'data points'],\n                'spline': ['line', 'data point', 'data points'],\n                'area': ['line', 'data point', 'data points'],\n                'areaspline': ['line', 'data point', 'data points'],\n                'pie': ['pie', 'slice', 'slices'],\n                'column': ['column series', 'column', 'columns'],\n                'bar': ['bar series', 'bar', 'bars'],\n                'scatter': ['scatter series', 'data point', 'data points'],\n                'boxplot': ['boxplot series', 'box', 'boxes'],\n                'arearange': ['arearange series', 'data point', 'data points'],\n                'areasplinerange': ['areasplinerange series', 'data point', 'data points'],\n                'bubble': ['bubble series', 'bubble', 'bubbles'],\n                'columnrange': ['columnrange series', 'column', 'columns'],\n                'errorbar': ['errorbar series', 'errorbar', 'errorbars'],\n                'funnel': ['funnel', 'data point', 'data points'],\n                'pyramid': ['pyramid', 'data point', 'data points'],\n                'waterfall': ['waterfall series', 'column', 'columns'],\n                'map': ['map', 'area', 'areas'],\n                'mapline': ['line', 'data point', 'data points'],\n                'mappoint': ['point series', 'data point', 'data points'],\n                'mapbubble': ['bubble series', 'bubble', 'bubbles']\n            },\n            // Descriptions for exotic chart types\n            typeDescriptionMap = {\n                boxplot: ' Box plot charts are typically used to display groups of statistical data. ' +\n                    'Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile and maximum. ',\n                arearange: ' Arearange charts are line charts displaying a range between a lower and higher value for each point. ',\n                areasplinerange: ' These charts are line charts displaying a range between a lower and higher value for each point. ',\n                bubble: ' Bubble charts are scatter charts where each data point also has a size value. ',\n                columnrange: ' Columnrange charts are column charts displaying a range between a lower and higher value for each point. ',\n                errorbar: ' Errorbar series are used to display the variability of the data. ',\n                funnel: ' Funnel charts are used to display reduction of data in stages. ',\n                pyramid: ' Pyramid charts consist of a single pyramid with item heights corresponding to each point value. ',\n                waterfall: ' A waterfall chart is a column chart where each column contributes towards a total end value. '\n            };\n\n        // If a point has one of the special keys defined, we expose all keys to the\n        // screen reader.\n        H.Series.prototype.commonKeys = ['name', 'id', 'category', 'x', 'value', 'y'];\n        H.Series.prototype.specialKeys = [\n            'z', 'open', 'high', 'q3', 'median', 'q1', 'low', 'close'\n        ];\n\n        // A pie is always simple. Don't quote me on that.\n        if (H.seriesTypes.pie) {\n            H.seriesTypes.pie.prototype.specialKeys = [];\n        }\n\n\n        // Default a11y options\n        H.setOptions({\n            accessibility: {\n                enabled: true,\n                pointDescriptionThreshold: 30, // set to false to disable\n                keyboardNavigation: {\n                    enabled: true\n                    //\tskipNullPoints: false\n                }\n                // describeSingleSeries: false\n            }\n        });\n\n        /**\n         * HTML encode some characters vulnerable for XSS.\n         * @param  {string} html The input string\n         * @return {string} The excaped string\n         */\n        function htmlencode(html) {\n            return html\n                .replace(/&/g, '&amp;')\n                .replace(/</g, '&lt;')\n                .replace(/>/g, '&gt;')\n                .replace(/\"/g, '&quot;')\n                .replace(/'/g, '&#x27;')\n                .replace(/\\//g, '&#x2F;');\n        }\n\n        // Utility function. Reverses child nodes of a DOM element\n        function reverseChildNodes(node) {\n            var i = node.childNodes.length;\n            while (i--) {\n                node.appendChild(node.childNodes[i]);\n            }\n        }\n\n        // Utility function to attempt to fake a click event on an element\n        function fakeClickEvent(element) {\n            var fakeEvent;\n            if (element && element.onclick && doc.createEvent) {\n                fakeEvent = doc.createEvent('Events');\n                fakeEvent.initEvent('click', true, false);\n                element.onclick(fakeEvent);\n            }\n        }\n\n        // Whenever drawing series, put info on DOM elements\n        H.wrap(H.Series.prototype, 'render', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            if (this.chart.options.accessibility.enabled) {\n                this.setA11yDescription();\n            }\n        });\n\n        // Put accessible info on series and points of a series\n        H.Series.prototype.setA11yDescription = function() {\n            var a11yOptions = this.chart.options.accessibility,\n                firstPointEl = this.points && this.points.length && this.points[0].graphic && this.points[0].graphic.element,\n                seriesEl = firstPointEl && firstPointEl.parentNode || this.graph && this.graph.element || this.group && this.group.element; // Could be tracker series depending on series type\n\n            if (seriesEl) {\n                // For some series types the order of elements do not match the order of points in series\n                // In that case we have to reverse them in order for AT to read them out in an understandable order\n                if (seriesEl.lastChild === firstPointEl) {\n                    reverseChildNodes(seriesEl);\n                }\n                // Make individual point elements accessible if possible. Note: If markers are disabled there might not be any elements there to make accessible.\n                if (this.points && (this.points.length < a11yOptions.pointDescriptionThreshold || a11yOptions.pointDescriptionThreshold === false)) {\n                    each(this.points, function(point) {\n                        if (point.graphic) {\n                            point.graphic.element.setAttribute('role', 'img');\n                            point.graphic.element.setAttribute('tabindex', '-1');\n                            point.graphic.element.setAttribute('aria-label',\n                                point.series.options.pointDescriptionFormatter &&\n                                point.series.options.pointDescriptionFormatter(point) ||\n                                a11yOptions.pointDescriptionFormatter &&\n                                a11yOptions.pointDescriptionFormatter(point) ||\n                                point.buildPointInfoString());\n                        }\n                    });\n                }\n                // Make series element accessible\n                if (this.chart.series.length > 1 || a11yOptions.describeSingleSeries) {\n                    seriesEl.setAttribute(\n                        'role',\n                        this.options.exposeElementToA11y ? 'img' : 'region'\n                    );\n                    seriesEl.setAttribute('tabindex', '-1');\n                    seriesEl.setAttribute('aria-label', a11yOptions.seriesDescriptionFormatter && a11yOptions.seriesDescriptionFormatter(this) ||\n                        this.buildSeriesInfoString());\n                }\n            }\n        };\n\n        // Return string with information about series\n        H.Series.prototype.buildSeriesInfoString = function() {\n            var typeInfo = typeToSeriesMap[this.type] || typeToSeriesMap['default'], // eslint-disable-line dot-notation\n                description = this.description || this.options.description;\n            return (this.name ? this.name + ', ' : '') +\n                (this.chart.types.length === 1 ? typeInfo[0] : 'series') + ' ' + (this.index + 1) + ' of ' + (this.chart.series.length) +\n                (this.chart.types.length === 1 ? ' with ' : '. ' + typeInfo[0] + ' with ') +\n                (this.points.length + ' ' + (this.points.length === 1 ? typeInfo[1] : typeInfo[2])) +\n                (description ? '. ' + description : '') +\n                (this.chart.yAxis.length > 1 && this.yAxis ? '. Y axis, ' + this.yAxis.getDescription() : '') +\n                (this.chart.xAxis.length > 1 && this.xAxis ? '. X axis, ' + this.xAxis.getDescription() : '');\n        };\n\n        // Return string with information about point\n        H.Point.prototype.buildPointInfoString = function() {\n            var point = this,\n                series = point.series,\n                a11yOptions = series.chart.options.accessibility,\n                infoString = '',\n                dateTimePoint = series.xAxis && series.xAxis.isDatetimeAxis,\n                timeDesc = dateTimePoint && dateFormat(a11yOptions.pointDateFormatter && a11yOptions.pointDateFormatter(point) || a11yOptions.pointDateFormat ||\n                    H.Tooltip.prototype.getXDateFormat(point, series.chart.options.tooltip, series.xAxis), point.x),\n                hasSpecialKey = H.find(series.specialKeys, function(key) {\n                    return point[key] !== undefined;\n                });\n\n            // If the point has one of the less common properties defined, display all that are defined\n            if (hasSpecialKey) {\n                if (dateTimePoint) {\n                    infoString = timeDesc;\n                }\n                each(series.commonKeys.concat(series.specialKeys), function(key) {\n                    if (point[key] !== undefined && !(dateTimePoint && key === 'x')) {\n                        infoString += (infoString ? '. ' : '') + key + ', ' + point[key];\n                    }\n                });\n            } else {\n                // Pick and choose properties for a succint label\n                infoString = (this.name || timeDesc || this.category || this.id || 'x, ' + this.x) + ', ' +\n                    (this.value !== undefined ? this.value : this.y);\n            }\n\n            return (this.index + 1) + '. ' + infoString + '.' + (this.description ? ' ' + this.description : '');\n        };\n\n        // Get descriptive label for axis\n        H.Axis.prototype.getDescription = function() {\n            return this.userOptions && this.userOptions.description || this.axisTitle && this.axisTitle.textStr ||\n                this.options.id || this.categories && 'categories' || 'values';\n        };\n\n        // Pan along axis in a direction (1 or -1), optionally with a defined granularity (number of steps it takes to walk across current view)\n        H.Axis.prototype.panStep = function(direction, granularity) {\n            var gran = granularity || 3,\n                extremes = this.getExtremes(),\n                step = (extremes.max - extremes.min) / gran * direction,\n                newMax = extremes.max + step,\n                newMin = extremes.min + step,\n                size = newMax - newMin;\n            if (direction < 0 && newMin < extremes.dataMin) {\n                newMin = extremes.dataMin;\n                newMax = newMin + size;\n            } else if (direction > 0 && newMax > extremes.dataMax) {\n                newMax = extremes.dataMax;\n                newMin = newMax - size;\n            }\n            this.setExtremes(newMin, newMax);\n        };\n\n        // Whenever adding or removing series, keep track of types present in chart\n        H.wrap(H.Series.prototype, 'init', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            var chart = this.chart;\n            if (chart.options.accessibility.enabled) {\n                chart.types = chart.types || [];\n\n                // Add type to list if does not exist\n                if (chart.types.indexOf(this.type) < 0) {\n                    chart.types.push(this.type);\n                }\n\n                addEvent(this, 'remove', function() {\n                    var removedSeries = this,\n                        hasType = false;\n\n                    // Check if any of the other series have the same type as this one. Otherwise remove it from the list.\n                    each(chart.series, function(s) {\n                        if (s !== removedSeries && chart.types.indexOf(removedSeries.type) < 0) {\n                            hasType = true;\n                        }\n                    });\n                    if (!hasType) {\n                        erase(chart.types, removedSeries.type);\n                    }\n                });\n            }\n        });\n\n        // Return simplified description of chart type. Some types will not be familiar to most screen reader users, but we try.\n        H.Chart.prototype.getTypeDescription = function() {\n            var firstType = this.types && this.types[0],\n                mapTitle = this.series[0] && this.series[0].mapTitle;\n            if (!firstType) {\n                return 'Empty chart.';\n            } else if (firstType === 'map') {\n                return mapTitle ? 'Map of ' + mapTitle : 'Map of unspecified region.';\n            } else if (this.types.length > 1) {\n                return 'Combination chart.';\n            } else if (['spline', 'area', 'areaspline'].indexOf(firstType) > -1) {\n                return 'Line chart.';\n            }\n            return firstType + ' chart.' + (typeDescriptionMap[firstType] || '');\n        };\n\n        // Return object with text description of each of the chart's axes\n        H.Chart.prototype.getAxesDescription = function() {\n            var numXAxes = this.xAxis.length,\n                numYAxes = this.yAxis.length,\n                desc = {},\n                i;\n\n            if (numXAxes) {\n                desc.xAxis = 'The chart has ' + numXAxes + (numXAxes > 1 ? ' X axes' : ' X axis') + ' displaying ';\n                if (numXAxes < 2) {\n                    desc.xAxis += this.xAxis[0].getDescription() + '.';\n                } else {\n                    for (i = 0; i < numXAxes - 1; ++i) {\n                        desc.xAxis += (i ? ', ' : '') + this.xAxis[i].getDescription();\n                    }\n                    desc.xAxis += ' and ' + this.xAxis[i].getDescription() + '.';\n                }\n            }\n\n            if (numYAxes) {\n                desc.yAxis = 'The chart has ' + numYAxes + (numYAxes > 1 ? ' Y axes' : ' Y axis') + ' displaying ';\n                if (numYAxes < 2) {\n                    desc.yAxis += this.yAxis[0].getDescription() + '.';\n                } else {\n                    for (i = 0; i < numYAxes - 1; ++i) {\n                        desc.yAxis += (i ? ', ' : '') + this.yAxis[i].getDescription();\n                    }\n                    desc.yAxis += ' and ' + this.yAxis[i].getDescription() + '.';\n                }\n            }\n\n            return desc;\n        };\n\n        // Set a11y attribs on exporting menu\n        H.Chart.prototype.addAccessibleContextMenuAttribs = function() {\n            var exportList = this.exportDivElements;\n            if (exportList) {\n                // Set tabindex on the menu items to allow focusing by script\n                // Set role to give screen readers a chance to pick up the contents\n                each(exportList, function(item) {\n                    if (item.tagName === 'DIV' &&\n                        !(item.children && item.children.length)) {\n                        item.setAttribute('role', 'menuitem');\n                        item.setAttribute('tabindex', -1);\n                    }\n                });\n                // Set accessibility properties on parent div\n                exportList[0].parentNode.setAttribute('role', 'menu');\n                exportList[0].parentNode.setAttribute('aria-label', 'Chart export');\n            }\n        };\n\n        // Highlight a point (show tooltip and display hover state). Returns the highlighted point.\n        H.Point.prototype.highlight = function() {\n            var chart = this.series.chart;\n            if (this.graphic && this.graphic.element.focus) {\n                this.graphic.element.focus();\n            }\n            if (!this.isNull) {\n                this.onMouseOver(); // Show the hover marker\n                // Show the tooltip\n                if (chart.tooltip) {\n                    chart.tooltip.refresh(chart.tooltip.shared ? [this] : this);\n                }\n            } else {\n                if (chart.tooltip) {\n                    chart.tooltip.hide(0);\n                }\n                // Don't call blur on the element, as it messes up the chart div's focus\n            }\n            chart.highlightedPoint = this;\n            return this;\n        };\n\n        // Function to highlight next/previous point in chart\n        // Returns highlighted point on success, false on failure (no adjacent point to highlight in chosen direction)\n        H.Chart.prototype.highlightAdjacentPoint = function(next) {\n            var series = this.series,\n                curPoint = this.highlightedPoint,\n                curPointIndex = curPoint && curPoint.index || 0,\n                curPoints = curPoint && curPoint.series.points,\n                newSeries,\n                newPoint,\n                // Handle connecting ends - where the points array has an extra last\n                // point that is a reference to the first one. We skip this.\n                forwardSkipAmount = curPoint && curPoint.series.connectEnds &&\n                curPointIndex > curPoints.length - 3 ? 2 : 1;\n\n            // If no points, return false\n            if (!series[0] || !series[0].points) {\n                return false;\n            }\n\n            // Use first point if none already highlighted\n            if (!curPoint) {\n                return series[0].points[0].highlight();\n            }\n\n            // Find index of current point in series.points array. Necessary for dataGrouping (and maybe zoom?)\n            if (curPoints[curPointIndex] !== curPoint) {\n                for (var i = 0; i < curPoints.length; ++i) {\n                    if (curPoints[i] === curPoint) {\n                        curPointIndex = i;\n                        break;\n                    }\n                }\n            }\n\n            // Grab next/prev point & series\n            newSeries = series[curPoint.series.index + (next ? 1 : -1)];\n            newPoint = curPoints[curPointIndex + (next ? forwardSkipAmount : -1)] ||\n                // Done with this series, try next one\n                newSeries &&\n                newSeries.points[next ? 0 : newSeries.points.length - (\n                    newSeries.connectEnds ? 2 : 1\n                )];\n\n            // If there is no adjacent point, we return false\n            if (newPoint === undefined) {\n                return false;\n            }\n\n            // Recursively skip null points or points in series that should be skipped\n            if (\n                newPoint.isNull &&\n                this.options.accessibility.keyboardNavigation.skipNullPoints ||\n                newPoint.series.options.skipKeyboardNavigation\n            ) {\n                this.highlightedPoint = newPoint;\n                return this.highlightAdjacentPoint(next);\n            }\n\n            // There is an adjacent point, highlight it\n            return newPoint.highlight();\n        };\n\n        // Show the export menu and focus the first item (if exists)\n        H.Chart.prototype.showExportMenu = function() {\n            if (this.exportSVGElements && this.exportSVGElements[0]) {\n                this.exportSVGElements[0].element.onclick();\n                this.highlightExportItem(0);\n            }\n        };\n\n        // Highlight export menu item by index\n        H.Chart.prototype.highlightExportItem = function(ix) {\n            var listItem = this.exportDivElements && this.exportDivElements[ix],\n                curHighlighted = this.exportDivElements && this.exportDivElements[this.highlightedExportItem];\n\n            if (listItem && listItem.tagName === 'DIV' && !(listItem.children && listItem.children.length)) {\n                if (listItem.focus) {\n                    listItem.focus();\n                }\n                if (curHighlighted && curHighlighted.onmouseout) {\n                    curHighlighted.onmouseout();\n                }\n                if (listItem.onmouseover) {\n                    listItem.onmouseover();\n                }\n                this.highlightedExportItem = ix;\n                return true;\n            }\n        };\n\n        // Highlight range selector button by index\n        H.Chart.prototype.highlightRangeSelectorButton = function(ix) {\n            var buttons = this.rangeSelector.buttons;\n            // Deselect old\n            if (buttons[this.highlightedRangeSelectorItemIx]) {\n                buttons[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState || 0);\n            }\n            // Select new\n            this.highlightedRangeSelectorItemIx = ix;\n            if (buttons[ix]) {\n                if (buttons[ix].element.focus) {\n                    buttons[ix].element.focus();\n                }\n                this.oldRangeSelectorItemState = buttons[ix].state;\n                buttons[ix].setState(2);\n                return true;\n            }\n            return false;\n        };\n\n        // Highlight legend item by index\n        H.Chart.prototype.highlightLegendItem = function(ix) {\n            var items = this.legend.allItems;\n            if (items[this.highlightedLegendItemIx]) {\n                fireEvent(items[this.highlightedLegendItemIx].legendGroup.element, 'mouseout');\n            }\n            this.highlightedLegendItemIx = ix;\n            if (items[ix]) {\n                if (items[ix].legendGroup.element.focus) {\n                    items[ix].legendGroup.element.focus();\n                }\n                fireEvent(items[ix].legendGroup.element, 'mouseover');\n                return true;\n            }\n            return false;\n        };\n\n        // Hide export menu\n        H.Chart.prototype.hideExportMenu = function() {\n            var exportList = this.exportDivElements;\n            if (exportList) {\n                each(exportList, function(el) {\n                    fireEvent(el, 'mouseleave');\n                });\n                if (exportList[this.highlightedExportItem] && exportList[this.highlightedExportItem].onmouseout) {\n                    exportList[this.highlightedExportItem].onmouseout();\n                }\n                this.highlightedExportItem = 0;\n                this.renderTo.focus();\n            }\n        };\n\n        // Add keyboard navigation handling to chart\n        H.Chart.prototype.addKeyboardNavEvents = function() {\n            var chart = this;\n\n            // Abstraction layer for keyboard navigation. Keep a map of keyCodes to handler functions, and a next/prev move handler for tab order.\n            // The module's keyCode handlers determine when to move to another module.\n            // Validate holds a function to determine if there are prerequisites for this module to run that are not met.\n            // Init holds a function to run once before any keyCodes are interpreted.\n            // transformTabs determines whether to transform tabs to left/right events or not. Defaults to true.\n            function KeyboardNavigationModule(options) {\n                this.keyCodeMap = options.keyCodeMap;\n                this.move = options.move;\n                this.validate = options.validate;\n                this.init = options.init;\n                this.transformTabs = options.transformTabs !== false;\n            }\n            KeyboardNavigationModule.prototype = {\n                // Find handler function(s) for key code in the keyCodeMap and run it.\n                run: function(e) {\n                    var navModule = this,\n                        keyCode = e.which || e.keyCode,\n                        handled = false;\n                    keyCode = this.transformTabs && keyCode === 9 ? (e.shiftKey ? 37 : 39) : keyCode; // Transform tabs\n                    each(this.keyCodeMap, function(codeSet) {\n                        if (codeSet[0].indexOf(keyCode) > -1) {\n                            handled = codeSet[1].call(navModule, keyCode, e) === false ? false : true; // If explicitly returning false, we haven't handled it\n                        }\n                    });\n                    return handled;\n                }\n            };\n            // Maintain abstraction between KeyboardNavigationModule and Highcharts\n            // The chart object keeps track of a list of KeyboardNavigationModules that we move through\n            function navModuleFactory(keyMap, options) {\n                return new KeyboardNavigationModule(merge({\n                    keyCodeMap: keyMap,\n                    // Move to next/prev valid module, or undefined if none, and init it.\n                    // Returns true on success and false if there is no valid module to move to.\n                    move: function(direction) {\n                        chart.keyboardNavigationModuleIndex += direction;\n                        var newModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];\n                        if (newModule) {\n                            if (newModule.validate && !newModule.validate()) {\n                                return this.move(direction); // Invalid module\n                            }\n                            if (newModule.init) {\n                                newModule.init(direction); // Valid module, init it\n                                return true;\n                            }\n                        }\n                        // No module\n                        chart.keyboardNavigationModuleIndex = 0; // Reset counter\n                        chart.slipNextTab = true; // Allow next tab to slip, as we will have focus on chart now\n                        return false;\n                    }\n                }, options));\n            }\n\n            // Route keydown events\n            function keydownHandler(ev) {\n                var e = ev || win.event,\n                    keyCode = e.which || e.keyCode,\n                    curNavModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];\n\n                // Handle tabbing\n                if (keyCode === 9) {\n                    // If we reached end of chart, we need to let this tab slip through to allow users to tab further\n                    if (chart.slipNextTab) {\n                        chart.slipNextTab = false;\n                        return;\n                    }\n                }\n                // If key was not tab, don't slip the next tab\n                chart.slipNextTab = false;\n\n                // If there is a navigation module for the current index, run it. Otherwise, we are outside of the chart in some direction.\n                if (curNavModule) {\n                    if (curNavModule.run(e)) {\n                        e.preventDefault(); // If successfully handled, stop the event here.\n                    }\n                }\n            }\n\n            // List of the different keyboard handling modes we use depending on where we are in the chart.\n            // Each mode has a set of handling functions mapped to key codes.\n            // Each mode determines when to move to the next/prev mode.\n            chart.keyboardNavigationModules = [\n                // Points\n                navModuleFactory([\n                    // Left/Right\n                    [\n                        [37, 39],\n                        function(keyCode) {\n                            if (!chart.highlightAdjacentPoint(keyCode === 39)) { // Try to highlight adjacent point\n                                return this.move(keyCode === 39 ? 1 : -1); // Failed. Move to next/prev module\n                            }\n                        }\n                    ],\n                    // Up/Down\n                    [\n                        [38, 40],\n                        function(keyCode) {\n                            var newSeries;\n                            if (chart.highlightedPoint) {\n                                newSeries = chart.series[chart.highlightedPoint.series.index + (keyCode === 38 ? -1 : 1)]; // Find prev/next series\n                                if (newSeries && newSeries.points[0]) { // If series exists and has data, go for it\n                                    newSeries.points[0].highlight();\n                                } else {\n                                    return this.move(keyCode === 40 ? 1 : -1); // Otherwise, attempt to move to next/prev module\n                                }\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            if (chart.highlightedPoint) {\n                                chart.highlightedPoint.firePointEvent('click');\n                            }\n                        }\n                    ]\n                ], {\n                    // If coming back to points from other module, highlight last point\n                    init: function(direction) {\n                        var lastSeries = chart.series && chart.series[chart.series.length - 1],\n                            lastPoint = lastSeries && lastSeries.points && lastSeries.points[lastSeries.points.length - 1];\n                        if (direction < 0 && lastPoint) {\n                            lastPoint.highlight();\n                        }\n                    }\n                }),\n\n                // Exporting\n                navModuleFactory([\n                    // Left/Up\n                    [\n                        [37, 38],\n                        function() {\n                            var i = chart.highlightedExportItem || 0,\n                                reachedEnd = true,\n                                series = chart.series,\n                                newSeries;\n                            // Try to highlight prev item in list. Highlighting e.g. separators will fail.\n                            while (i--) {\n                                if (chart.highlightExportItem(i)) {\n                                    reachedEnd = false;\n                                    break;\n                                }\n                            }\n                            if (reachedEnd) {\n                                chart.hideExportMenu();\n                                // Wrap to last point\n                                if (series && series.length) {\n                                    newSeries = series[series.length - 1];\n                                    if (newSeries.points.length) {\n                                        newSeries.points[newSeries.points.length - 1].highlight();\n                                    }\n                                }\n                                // Try to move to prev module (should be points, since we wrapped to last point)\n                                return this.move(-1);\n                            }\n                        }\n                    ],\n                    // Right/Down\n                    [\n                        [39, 40],\n                        function() {\n                            var highlightedExportItem = chart.highlightedExportItem || 0,\n                                reachedEnd = true;\n                            // Try to highlight next item in list. Highlighting e.g. separators will fail.\n                            for (var i = highlightedExportItem + 1; i < chart.exportDivElements.length; ++i) {\n                                if (chart.highlightExportItem(i)) {\n                                    reachedEnd = false;\n                                    break;\n                                }\n                            }\n                            if (reachedEnd) {\n                                chart.hideExportMenu();\n                                return this.move(1); // Next module\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            fakeClickEvent(chart.exportDivElements[chart.highlightedExportItem]);\n                        }\n                    ]\n                ], {\n                    // Only run exporting navigation if exporting support exists and is enabled on chart\n                    validate: function() {\n                        return chart.exportChart && !(chart.options.exporting && chart.options.exporting.enabled === false);\n                    },\n                    // Show export menu\n                    init: function(direction) {\n                        chart.highlightedPoint = null;\n                        chart.showExportMenu();\n                        // If coming back to export menu from other module, try to highlight last item in menu\n                        if (direction < 0 && chart.exportDivElements) {\n                            for (var i = chart.exportDivElements.length; i > -1; --i) {\n                                if (chart.highlightExportItem(i)) {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                }),\n\n                // Map zoom\n                navModuleFactory([\n                    // Up/down/left/right\n                    [\n                        [38, 40, 37, 39],\n                        function(keyCode) {\n                            chart[keyCode === 38 || keyCode === 40 ? 'yAxis' : 'xAxis'][0].panStep(keyCode < 39 ? -1 : 1);\n                        }\n                    ],\n\n                    // Tabs\n                    [\n                        [9],\n                        function(keyCode, e) {\n                            var button;\n                            chart.mapNavButtons[chart.focusedMapNavButtonIx].setState(0); // Deselect old\n                            if (e.shiftKey && !chart.focusedMapNavButtonIx || !e.shiftKey && chart.focusedMapNavButtonIx) { // trying to go somewhere we can't?\n                                chart.mapZoom(); // Reset zoom\n                                return this.move(e.shiftKey ? -1 : 1); // Nowhere to go, go to prev/next module\n                            }\n                            chart.focusedMapNavButtonIx += e.shiftKey ? -1 : 1;\n                            button = chart.mapNavButtons[chart.focusedMapNavButtonIx];\n                            if (button.element.focus) {\n                                button.element.focus();\n                            }\n                            button.setState(2);\n                        }\n                    ],\n\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            fakeClickEvent(chart.mapNavButtons[chart.focusedMapNavButtonIx].element);\n                        }\n                    ]\n                ], {\n                    // Only run this module if we have map zoom on the chart\n                    validate: function() {\n                        return chart.mapZoom && chart.mapNavButtons && chart.mapNavButtons.length === 2;\n                    },\n\n                    // Handle tabs separately\n                    transformTabs: false,\n\n                    // Make zoom buttons do their magic\n                    init: function(direction) {\n                        var zoomIn = chart.mapNavButtons[0],\n                            zoomOut = chart.mapNavButtons[1],\n                            initialButton = direction > 0 ? zoomIn : zoomOut;\n\n                        each(chart.mapNavButtons, function(button, i) {\n                            button.element.setAttribute('tabindex', -1);\n                            button.element.setAttribute('role', 'button');\n                            button.element.setAttribute('aria-label', 'Zoom ' + (i ? 'out' : '') + 'chart');\n                        });\n\n                        if (initialButton.element.focus) {\n                            initialButton.element.focus();\n                        }\n                        initialButton.setState(2);\n                        chart.focusedMapNavButtonIx = direction > 0 ? 0 : 1;\n                    }\n                }),\n\n                // Highstock range selector (minus input boxes)\n                navModuleFactory([\n                    // Left/Right/Up/Down\n                    [\n                        [37, 39, 38, 40],\n                        function(keyCode) {\n                            var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;\n                            // Try to highlight next/prev button\n                            if (!chart.highlightRangeSelectorButton(chart.highlightedRangeSelectorItemIx + direction)) {\n                                return this.move(direction);\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            if (chart.oldRangeSelectorItemState !== 3) { // Don't allow click if button used to be disabled\n                                fakeClickEvent(chart.rangeSelector.buttons[chart.highlightedRangeSelectorItemIx].element);\n                            }\n                        }\n                    ]\n                ], {\n                    // Only run this module if we have range selector\n                    validate: function() {\n                        return chart.rangeSelector && chart.rangeSelector.buttons && chart.rangeSelector.buttons.length;\n                    },\n\n                    // Make elements focusable and accessible\n                    init: function(direction) {\n                        each(chart.rangeSelector.buttons, function(button) {\n                            button.element.setAttribute('tabindex', '-1');\n                            button.element.setAttribute('role', 'button');\n                            button.element.setAttribute('aria-label', 'Select range ' + (button.text && button.text.textStr));\n                        });\n                        // Focus first/last button\n                        chart.highlightRangeSelectorButton(direction > 0 ? 0 : chart.rangeSelector.buttons.length - 1);\n                    }\n                }),\n\n                // Highstock range selector, input boxes\n                navModuleFactory([\n                    // Tab/Up/Down\n                    [\n                        [9, 38, 40],\n                        function(keyCode, e) {\n                            var direction = (keyCode === 9 && e.shiftKey || keyCode === 38) ? -1 : 1,\n                                newIx = chart.highlightedInputRangeIx = chart.highlightedInputRangeIx + direction;\n                            // Try to highlight next/prev item in list.\n                            if (newIx > 1 || newIx < 0) { // Out of range\n                                return this.move(direction);\n                            }\n                            chart.rangeSelector[newIx ? 'maxInput' : 'minInput'].focus(); // Input boxes are HTML, and should have focus support in all browsers\n                        }\n                    ]\n                ], {\n                    // Only run if we have range selector with input boxes\n                    validate: function() {\n                        var inputVisible = chart.rangeSelector && chart.rangeSelector.inputGroup && chart.rangeSelector.inputGroup.element.getAttribute('visibility') !== 'hidden';\n                        return inputVisible && chart.options.rangeSelector.inputEnabled !== false && chart.rangeSelector.minInput && chart.rangeSelector.maxInput;\n                    },\n\n                    // Handle tabs different from left/right (because we don't want to catch left/right in a text area)\n                    transformTabs: false,\n\n                    // Highlight first/last input box\n                    init: function(direction) {\n                        chart.highlightedInputRangeIx = direction > 0 ? 0 : 1;\n                        chart.rangeSelector[chart.highlightedInputRangeIx ? 'maxInput' : 'minInput'].focus();\n                    }\n                }),\n\n                // Legend navigation\n                navModuleFactory([\n                    // Left/Right/Up/Down\n                    [\n                        [37, 39, 38, 40],\n                        function(keyCode) {\n                            var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;\n                            // Try to highlight next/prev legend item\n                            if (!chart.highlightLegendItem(chart.highlightedLegendItemIx + direction)) {\n                                return this.move(direction);\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            fakeClickEvent(chart.legend.allItems[chart.highlightedLegendItemIx].legendItem.element.parentNode);\n                        }\n                    ]\n                ], {\n                    // Only run this module if we have at least one legend - wait for it - item.\n                    // Don't run if the legend is populated by a colorAxis.\n                    validate: function() {\n                        return chart.legend && chart.legend.allItems &&\n                            !(chart.colorAxis && chart.colorAxis.length);\n                    },\n\n                    // Make elements focusable and accessible\n                    init: function(direction) {\n                        each(chart.legend.allItems, function(item) {\n                            item.legendGroup.element.setAttribute('tabindex', '-1');\n                            item.legendGroup.element.setAttribute('role', 'button');\n                            item.legendGroup.element.setAttribute('aria-label', 'Toggle visibility of series ' + item.name);\n                        });\n                        // Focus first/last item\n                        chart.highlightLegendItem(direction > 0 ? 0 : chart.legend.allItems.length - 1);\n                    }\n                })\n            ];\n\n            // Init nav module index. We start at the first module, and as the user navigates through the chart the index will increase to use different handler modules.\n            chart.keyboardNavigationModuleIndex = 0;\n\n            // Make chart reachable by tab\n            if (\n                chart.container.hasAttribute &&\n                !chart.container.hasAttribute('tabIndex')\n            ) {\n                chart.container.setAttribute('tabindex', '0');\n            }\n\n            // Handle keyboard events\n            addEvent(chart.renderTo, 'keydown', keydownHandler);\n            addEvent(chart, 'destroy', function() {\n                removeEvent(chart.renderTo, 'keydown', keydownHandler);\n            });\n        };\n\n        // Add screen reader region to chart.\n        // tableId is the HTML id of the table to focus when clicking the table anchor in the screen reader region.\n        H.Chart.prototype.addScreenReaderRegion = function(id, tableId) {\n            var chart = this,\n                series = chart.series,\n                options = chart.options,\n                a11yOptions = options.accessibility,\n                hiddenSection = chart.screenReaderRegion = doc.createElement('div'),\n                tableShortcut = doc.createElement('h4'),\n                tableShortcutAnchor = doc.createElement('a'),\n                chartHeading = doc.createElement('h4'),\n                hiddenStyle = { // CSS style to hide element from visual users while still exposing it to screen readers\n                    position: 'absolute',\n                    left: '-9999px',\n                    top: 'auto',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                },\n                chartTypes = chart.types || [],\n                // Build axis info - but not for pies and maps. Consider not adding for certain other types as well (funnel, pyramid?)\n                axesDesc = (chartTypes.length === 1 && chartTypes[0] === 'pie' || chartTypes[0] === 'map') && {} || chart.getAxesDescription(),\n                chartTypeInfo = series[0] && typeToSeriesMap[series[0].type] || typeToSeriesMap['default']; // eslint-disable-line dot-notation\n\n            hiddenSection.setAttribute('id', id);\n            hiddenSection.setAttribute('role', 'region');\n            hiddenSection.setAttribute('aria-label', 'Chart screen reader information.');\n\n            hiddenSection.innerHTML = a11yOptions.screenReaderSectionFormatter && a11yOptions.screenReaderSectionFormatter(chart) ||\n                '<div>Use regions/landmarks to skip ahead to chart' +\n                (series.length > 1 ? ' and navigate between data series' : '') +\n                '.</div><h3>' + (options.title.text ? htmlencode(options.title.text) : 'Chart') +\n                (options.subtitle && options.subtitle.text ? '. ' + htmlencode(options.subtitle.text) : '') +\n                '</h3><h4>Long description.</h4><div>' + (options.chart.description || 'No description available.') +\n                '</div><h4>Structure.</h4><div>Chart type: ' + (options.chart.typeDescription || chart.getTypeDescription()) + '</div>' +\n                (series.length === 1 ? '<div>' + chartTypeInfo[0] + ' with ' + series[0].points.length + ' ' +\n                    (series[0].points.length === 1 ? chartTypeInfo[1] : chartTypeInfo[2]) + '.</div>' : '') +\n                (axesDesc.xAxis ? ('<div>' + axesDesc.xAxis + '</div>') : '') +\n                (axesDesc.yAxis ? ('<div>' + axesDesc.yAxis + '</div>') : '');\n\n            // Add shortcut to data table if export-data is loaded\n            if (chart.getCSV) {\n                tableShortcutAnchor.innerHTML = 'View as data table.';\n                tableShortcutAnchor.href = '#' + tableId;\n                tableShortcutAnchor.setAttribute('tabindex', '-1'); // Make this unreachable by user tabbing\n                tableShortcutAnchor.onclick = a11yOptions.onTableAnchorClick || function() {\n                    chart.viewData();\n                    doc.getElementById(tableId).focus();\n                };\n                tableShortcut.appendChild(tableShortcutAnchor);\n                hiddenSection.appendChild(tableShortcut);\n            }\n\n            // Note: JAWS seems to refuse to read aria-label on the container, so add an\n            // h4 element as title for the chart.\n            chartHeading.innerHTML = 'Chart graphic.';\n            chart.renderTo.insertBefore(chartHeading, chart.renderTo.firstChild);\n            chart.renderTo.insertBefore(hiddenSection, chart.renderTo.firstChild);\n\n            // Hide the section and the chart heading\n            merge(true, chartHeading.style, hiddenStyle);\n            merge(true, hiddenSection.style, hiddenStyle);\n        };\n\n\n        // Make chart container accessible, and wrap table functionality\n        H.Chart.prototype.callbacks.push(function(chart) {\n            var options = chart.options,\n                a11yOptions = options.accessibility;\n\n            if (!a11yOptions.enabled) {\n                return;\n            }\n\n            var titleElement = doc.createElementNS('http://www.w3.org/2000/svg', 'title'),\n                exportGroupElement = doc.createElementNS('http://www.w3.org/2000/svg', 'g'),\n                descElement = chart.container.getElementsByTagName('desc')[0],\n                textElements = chart.container.getElementsByTagName('text'),\n                titleId = 'highcharts-title-' + chart.index,\n                tableId = 'highcharts-data-table-' + chart.index,\n                hiddenSectionId = 'highcharts-information-region-' + chart.index,\n                chartTitle = options.title.text || 'Chart',\n                oldColumnHeaderFormatter = options.exporting && options.exporting.csv && options.exporting.csv.columnHeaderFormatter,\n                topLevelColumns = [];\n\n            // Add SVG title/desc tags\n            titleElement.textContent = htmlencode(chartTitle);\n            titleElement.id = titleId;\n            descElement.parentNode.insertBefore(titleElement, descElement);\n            chart.renderTo.setAttribute('role', 'region');\n            //chart.container.setAttribute('aria-details', hiddenSectionId); // JAWS currently doesn't handle this too well\n            chart.renderTo.setAttribute('aria-label', 'Interactive chart. ' + chartTitle +\n                '. Use up and down arrows to navigate with most screen readers.');\n\n            // Set screen reader properties on export menu\n            if (chart.exportSVGElements && chart.exportSVGElements[0] && chart.exportSVGElements[0].element) {\n                var oldExportCallback = chart.exportSVGElements[0].element.onclick,\n                    parent = chart.exportSVGElements[0].element.parentNode;\n                chart.exportSVGElements[0].element.onclick = function() {\n                    oldExportCallback.apply(this, Array.prototype.slice.call(arguments));\n                    chart.addAccessibleContextMenuAttribs();\n                    chart.highlightExportItem(0);\n                };\n                chart.exportSVGElements[0].element.setAttribute('role', 'button');\n                chart.exportSVGElements[0].element.setAttribute('aria-label', 'View export menu');\n                exportGroupElement.appendChild(chart.exportSVGElements[0].element);\n                exportGroupElement.setAttribute('role', 'region');\n                exportGroupElement.setAttribute('aria-label', 'Chart export menu');\n                parent.appendChild(exportGroupElement);\n            }\n\n            // Set screen reader properties on input boxes for range selector. We need to do this regardless of whether or not these are visible, as they are \n            // by default part of the page's tabindex unless we set them to -1.\n            if (chart.rangeSelector) {\n                each(['minInput', 'maxInput'], function(key, i) {\n                    if (chart.rangeSelector[key]) {\n                        chart.rangeSelector[key].setAttribute('tabindex', '-1');\n                        chart.rangeSelector[key].setAttribute('role', 'textbox');\n                        chart.rangeSelector[key].setAttribute('aria-label', 'Select ' + (i ? 'end' : 'start') + ' date.');\n                    }\n                });\n            }\n\n            // Hide text elements from screen readers\n            each(textElements, function(el) {\n                el.setAttribute('aria-hidden', 'true');\n            });\n\n            // Add top-secret screen reader region\n            chart.addScreenReaderRegion(hiddenSectionId, tableId);\n\n            // Enable keyboard navigation\n            if (a11yOptions.keyboardNavigation.enabled) {\n                chart.addKeyboardNavEvents();\n            }\n\n            /* Wrap table functionality from export-data */\n\n            // Keep track of columns\n            merge(true, options.exporting, {\n                csv: {\n                    columnHeaderFormatter: function(item, key, keyLength) {\n                        if (!item) {\n                            return 'Category';\n                        }\n                        if (item instanceof H.Axis) {\n                            return (item.options.title && item.options.title.text) ||\n                                (item.isDatetimeAxis ? 'DateTime' : 'Category');\n                        }\n                        var prevCol = topLevelColumns[topLevelColumns.length - 1];\n                        if (keyLength > 1) {\n                            // We need multiple levels of column headers\n                            // Populate a list of column headers to add in addition to the ones added by export-data\n                            if ((prevCol && prevCol.text) !== item.name) {\n                                topLevelColumns.push({\n                                    text: item.name,\n                                    span: keyLength\n                                });\n                            }\n                        }\n                        if (oldColumnHeaderFormatter) {\n                            return oldColumnHeaderFormatter.call(this, item, key, keyLength);\n                        }\n                        return keyLength > 1 ? key : item.name;\n                    }\n                }\n            });\n\n            // Add ID and title/caption to table HTML\n            H.wrap(chart, 'getTable', function(proceed) {\n                return proceed.apply(this, Array.prototype.slice.call(arguments, 1))\n                    .replace('<table>', '<table id=\"' + tableId + '\" summary=\"Table representation of chart\"><caption>' + chartTitle + '</caption>');\n            });\n\n            // Add accessibility attributes and top level columns\n            H.wrap(chart, 'viewData', function(proceed) {\n                if (!this.dataTableDiv) {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n                    var table = doc.getElementById(tableId),\n                        head = table.getElementsByTagName('thead')[0],\n                        body = table.getElementsByTagName('tbody')[0],\n                        firstRow = head.firstChild.children,\n                        columnHeaderRow = '<tr><td></td>',\n                        cell,\n                        newCell;\n\n                    // Make table focusable by script\n                    table.setAttribute('tabindex', '-1');\n\n                    // Create row headers\n                    each(body.children, function(el) {\n                        cell = el.firstChild;\n                        newCell = doc.createElement('th');\n                        newCell.setAttribute('scope', 'row');\n                        newCell.innerHTML = cell.innerHTML;\n                        cell.parentNode.replaceChild(newCell, cell);\n                    });\n\n                    // Set scope for column headers\n                    each(firstRow, function(el) {\n                        if (el.tagName === 'TH') {\n                            el.setAttribute('scope', 'col');\n                        }\n                    });\n\n                    // Add top level columns\n                    if (topLevelColumns.length) {\n                        each(topLevelColumns, function(col) {\n                            columnHeaderRow += '<th scope=\"col\" colspan=\"' + col.span + '\">' + col.text + '</th>';\n                        });\n                        head.insertAdjacentHTML('afterbegin', columnHeaderRow);\n                    }\n                }\n            });\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/annotations.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(e){function n(a,c,b,f,e){for(var d=a.length,g=0;g<d;)k(a[g])&&k(a[g+1])?(a[g]=c.toPixels(a[g])-f,a[g+1]=b.toPixels(a[g+1])-e,g+=2):g+=1;return a}var p=e.defined,k=e.isNumber,t=e.inArray,A=e.isArray,B=e.merge,C=e.Chart,u=e.extend,D=e.each,q,E;E=[\"path\",\"rect\",\"circle\"];q={top:0,left:0,center:.5,middle:.5,bottom:1,right:1};var F=function(){this.init.apply(this,arguments)};F.prototype={init:function(a,\nc){var b=c.shape&&c.shape.type;this.chart=a;var f;f={xAxis:0,yAxis:0,title:{style:{},text:\"\",x:0,y:0},shape:{params:{stroke:\"#000000\",fill:\"transparent\",strokeWidth:2}}};a={circle:{params:{x:0,y:0}}};a[b]&&(f.shape=B(f.shape,a[b]));this.options=B({},f,c)},render:function(a){var c=this.chart,b=this.chart.renderer,f=this.group,e=this.title,d=this.shape,g=this.options,k=g.title,m=g.shape;f||(f=this.group=b.g());!d&&m&&-1!==t(m.type,E)&&(d=this.shape=b[g.shape.type](m.params),d.add(f));!e&&k&&(e=this.title=\nb.label(k),e.add(f));f.add(c.annotations.group);this.linkObjects();!1!==a&&this.redraw()},redraw:function(){var a=this.options,c=this.chart,b=this.group,f=this.title,z=this.shape,d=this.linkedObject,g=c.xAxis[a.xAxis],v=c.yAxis[a.yAxis],c=a.width,m=a.height,w=q[a.anchorY],x=q[a.anchorX],h,y,l,r;d&&(y=d instanceof e.Point?\"point\":d instanceof e.Series?\"series\":null,\"point\"===y?(a.xValue=d.x,a.yValue=d.y,l=d.series):\"series\"===y&&(l=d),b.visibility!==l.group.visibility&&b.attr({visibility:l.group.visibility}));\nd=p(a.xValue)?g.toPixels(a.xValue+g.minPointOffset)-g.minPixelPadding:a.x;l=p(a.yValue)?v.toPixels(a.yValue):a.y;k(d)&&k(l)&&(f&&(f.attr(a.title),f.css(a.title.style)),z&&(h=u({},a.shape.params),\"values\"===a.units&&(e.objectEach(h,function(a,b){-1<t(b,[\"width\",\"x\"])?h[b]=g.translate(h[b]):-1<t(b,[\"height\",\"y\"])&&(h[b]=v.translate(h[b]))}),h.width&&(h.width-=g.toPixels(0)-g.left),h.x&&(h.x+=g.minPixelPadding),\"path\"===a.shape.type&&n(h.d,g,v,d,l)),\"circle\"===a.shape.type&&(h.x+=h.r,h.y+=h.r),z.attr(h)),\nb.bBox=null,k(c)||(r=b.getBBox(),c=r.width),k(m)||(r||(r=b.getBBox()),m=r.height),k(x)||(x=q.center),k(w)||(w=q.center),d-=c*x,l-=m*w,p(b.translateX)&&p(b.translateY)?b.animate({translateX:d,translateY:l}):b.translate(d,l))},destroy:function(){var a=this,c=this.chart.annotations.allItems,b=c.indexOf(a);-1<b&&c.splice(b,1);D([\"title\",\"shape\",\"group\"],function(b){a[b]&&(a[b].destroy(),a[b]=null)});a.group=a.title=a.shape=a.chart=a.options=null},update:function(a,c){u(this.options,a);this.linkObjects();\nthis.render(c)},linkObjects:function(){var a=this.chart,c=this.linkedObject,b=c&&(c.id||c.options.id),f=this.options.linkedTo;p(f)?p(c)&&f===b||(this.linkedObject=a.get(f)):this.linkedObject=null}};u(C.prototype,{annotations:{add:function(a,c){var b=this.allItems,f=this.chart,e,d;A(a)||(a=[a]);for(d=a.length;d--;)e=new F(f,a[d]),b.push(e),e.render(c)},redraw:function(){D(this.allItems,function(a){a.redraw()})}}});C.prototype.callbacks.push(function(a){var c=a.options.annotations,b;b=a.renderer.g(\"annotations\");\nb.attr({zIndex:7});b.add();a.annotations.allItems=[];a.annotations.chart=a;a.annotations.group=b;A(c)&&0<c.length&&a.annotations.add(a.options.annotations);e.addEvent(a,\"redraw\",function(){a.annotations.redraw()})})})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/annotations.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var defined = H.defined,\n            isNumber = H.isNumber,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            merge = H.merge,\n            Chart = H.Chart,\n            extend = H.extend,\n            each = H.each;\n\n        var ALIGN_FACTOR,\n            ALLOWED_SHAPES;\n\n        ALLOWED_SHAPES = ['path', 'rect', 'circle'];\n\n        ALIGN_FACTOR = {\n            top: 0,\n            left: 0,\n            center: 0.5,\n            middle: 0.5,\n            bottom: 1,\n            right: 1\n        };\n\n        function defaultOptions(shapeType) {\n            var shapeOptions,\n                options;\n\n            options = {\n                xAxis: 0,\n                yAxis: 0,\n                title: {\n                    style: {},\n                    text: '',\n                    x: 0,\n                    y: 0\n                },\n                shape: {\n                    params: {\n                        stroke: '#000000',\n                        fill: 'transparent',\n                        strokeWidth: 2\n                    }\n                }\n            };\n\n            shapeOptions = {\n                circle: {\n                    params: {\n                        x: 0,\n                        y: 0\n                    }\n                }\n            };\n\n            if (shapeOptions[shapeType]) {\n                options.shape = merge(options.shape, shapeOptions[shapeType]);\n            }\n\n            return options;\n        }\n\n        function translatePath(d, xAxis, yAxis, xOffset, yOffset) {\n            var len = d.length,\n                i = 0;\n\n            while (i < len) {\n                if (isNumber(d[i]) && isNumber(d[i + 1])) {\n                    d[i] = xAxis.toPixels(d[i]) - xOffset;\n                    d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;\n                    i += 2;\n                } else {\n                    i += 1;\n                }\n            }\n\n            return d;\n        }\n\n\n        // Define annotation prototype\n        var Annotation = function() {\n            this.init.apply(this, arguments);\n        };\n        Annotation.prototype = {\n            /* \n             * Initialize the annotation\n             */\n            init: function(chart, options) {\n                var shapeType = options.shape && options.shape.type;\n\n                this.chart = chart;\n                this.options = merge({}, defaultOptions(shapeType), options);\n            },\n\n            /*\n             * Render the annotation\n             */\n            render: function(redraw) {\n                var annotation = this,\n                    chart = this.chart,\n                    renderer = annotation.chart.renderer,\n                    group = annotation.group,\n                    title = annotation.title,\n                    shape = annotation.shape,\n                    options = annotation.options,\n                    titleOptions = options.title,\n                    shapeOptions = options.shape;\n\n                if (!group) {\n                    group = annotation.group = renderer.g();\n                }\n\n\n                if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {\n                    shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);\n                    shape.add(group);\n                }\n\n                if (!title && titleOptions) {\n                    title = annotation.title = renderer.label(titleOptions);\n                    title.add(group);\n                }\n\n                group.add(chart.annotations.group);\n\n                // link annotations to point or series\n                annotation.linkObjects();\n\n                if (redraw !== false) {\n                    annotation.redraw();\n                }\n            },\n\n            /*\n             * Redraw the annotation title or shape after options update\n             */\n            redraw: function() {\n                var options = this.options,\n                    chart = this.chart,\n                    group = this.group,\n                    title = this.title,\n                    shape = this.shape,\n                    linkedTo = this.linkedObject,\n                    xAxis = chart.xAxis[options.xAxis],\n                    yAxis = chart.yAxis[options.yAxis],\n                    width = options.width,\n                    height = options.height,\n                    anchorY = ALIGN_FACTOR[options.anchorY],\n                    anchorX = ALIGN_FACTOR[options.anchorX],\n                    shapeParams,\n                    linkType,\n                    series,\n                    bbox,\n                    x,\n                    y;\n\n                if (linkedTo) {\n                    linkType = (linkedTo instanceof H.Point) ? 'point' :\n                        (linkedTo instanceof H.Series) ? 'series' : null;\n\n                    if (linkType === 'point') {\n                        options.xValue = linkedTo.x;\n                        options.yValue = linkedTo.y;\n                        series = linkedTo.series;\n                    } else if (linkType === 'series') {\n                        series = linkedTo;\n                    }\n\n                    if (group.visibility !== series.group.visibility) {\n                        group.attr({\n                            visibility: series.group.visibility\n                        });\n                    }\n                }\n\n\n                // Based on given options find annotation pixel position\n                x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);\n                y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;\n\n                if (!isNumber(x) || !isNumber(y)) {\n                    return;\n                }\n\n\n                if (title) {\n                    title.attr(options.title);\n                    title.css(options.title.style);\n                }\n\n                if (shape) {\n                    shapeParams = extend({}, options.shape.params);\n\n                    if (options.units === 'values') {\n                        H.objectEach(shapeParams, function(val, param) {\n                            if (inArray(param, ['width', 'x']) > -1) {\n                                shapeParams[param] = xAxis.translate(shapeParams[param]);\n                            } else if (inArray(param, ['height', 'y']) > -1) {\n                                shapeParams[param] = yAxis.translate(shapeParams[param]);\n                            }\n                        });\n\n                        if (shapeParams.width) {\n                            shapeParams.width -= xAxis.toPixels(0) - xAxis.left;\n                        }\n\n                        if (shapeParams.x) {\n                            shapeParams.x += xAxis.minPixelPadding;\n                        }\n\n                        if (options.shape.type === 'path') {\n                            translatePath(shapeParams.d, xAxis, yAxis, x, y);\n                        }\n                    }\n\n                    // move the center of the circle to shape x/y\n                    if (options.shape.type === 'circle') {\n                        shapeParams.x += shapeParams.r;\n                        shapeParams.y += shapeParams.r;\n                    }\n\n                    shape.attr(shapeParams);\n                }\n\n                group.bBox = null;\n\n                // If annotation width or height is not defined in options use bounding box size\n                if (!isNumber(width)) {\n                    bbox = group.getBBox();\n                    width = bbox.width;\n                }\n\n                if (!isNumber(height)) {\n                    // get bbox only if it wasn't set before\n                    if (!bbox) {\n                        bbox = group.getBBox();\n                    }\n\n                    height = bbox.height;\n                }\n\n                // Calculate anchor point\n                if (!isNumber(anchorX)) {\n                    anchorX = ALIGN_FACTOR.center;\n                }\n\n                if (!isNumber(anchorY)) {\n                    anchorY = ALIGN_FACTOR.center;\n                }\n\n                // Translate group according to its dimension and anchor point\n                x = x - width * anchorX;\n                y = y - height * anchorY;\n\n                if (defined(group.translateX) && defined(group.translateY)) {\n                    group.animate({\n                        translateX: x,\n                        translateY: y\n                    });\n                } else {\n                    group.translate(x, y);\n                }\n            },\n\n            /*\n             * Destroy the annotation\n             */\n            destroy: function() {\n                var annotation = this,\n                    chart = this.chart,\n                    allItems = chart.annotations.allItems,\n                    index = allItems.indexOf(annotation);\n\n                if (index > -1) {\n                    allItems.splice(index, 1);\n                }\n\n                each(['title', 'shape', 'group'], function(element) {\n                    if (annotation[element]) {\n                        annotation[element].destroy();\n                        annotation[element] = null;\n                    }\n                });\n\n                annotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;\n            },\n\n            /*\n             * Update the annotation with a given options\n             */\n            update: function(options, redraw) {\n                extend(this.options, options);\n\n                // update link to point or series\n                this.linkObjects();\n\n                this.render(redraw);\n            },\n\n            linkObjects: function() {\n                var annotation = this,\n                    chart = annotation.chart,\n                    linkedTo = annotation.linkedObject,\n                    linkedId = linkedTo && (linkedTo.id || linkedTo.options.id),\n                    options = annotation.options,\n                    id = options.linkedTo;\n\n                if (!defined(id)) {\n                    annotation.linkedObject = null;\n                } else if (!defined(linkedTo) || id !== linkedId) {\n                    annotation.linkedObject = chart.get(id);\n                }\n            }\n        };\n\n\n        // Add annotations methods to chart prototype\n        extend(Chart.prototype, {\n            annotations: {\n                /*\n                 * Unified method for adding annotations to the chart\n                 */\n                add: function(options, redraw) {\n                    var annotations = this.allItems,\n                        chart = this.chart,\n                        item,\n                        len;\n\n                    if (!isArray(options)) {\n                        options = [options];\n                    }\n\n                    len = options.length;\n\n                    while (len--) {\n                        item = new Annotation(chart, options[len]);\n                        annotations.push(item);\n                        item.render(redraw);\n                    }\n                },\n\n                /**\n                 * Redraw all annotations, method used in chart events\n                 */\n                redraw: function() {\n                    each(this.allItems, function(annotation) {\n                        annotation.redraw();\n                    });\n                }\n            }\n        });\n\n\n        // Initialize on chart load\n        Chart.prototype.callbacks.push(function(chart) {\n            var options = chart.options.annotations,\n                group;\n\n            group = chart.renderer.g('annotations');\n            group.attr({\n                zIndex: 7\n            });\n            group.add();\n\n            // initialize empty array for annotations\n            chart.annotations.allItems = [];\n\n            // link chart object to annotations\n            chart.annotations.chart = chart;\n\n            // link annotations group element to the chart\n            chart.annotations.group = group;\n\n            if (isArray(options) && options.length > 0) {\n                chart.annotations.add(chart.options.annotations);\n            }\n\n            // update annotations after chart redraw\n            H.addEvent(chart, 'redraw', function() {\n                chart.annotations.redraw();\n            });\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/boost-canvas.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Boost module\n\n (c) 2010-2017 Highsoft AS\n Author: Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(d){function p(a,b,c,g,e){e=e||0;g=g||5E4;for(var d=e+g,f=!0;f&&e<d&&e<a.length;)f=b(a[e],e),e+=1;f&&(e<a.length?setTimeout(function(){p(a,b,c,g,e)}):c&&c())}function x(a){return a.series.length>=((a.options.boost?a.options.boost.seriesThreshold:0)||a.options.chart.seriesBoostThreshold||10)}var A=d.win.document,Z=function(){},aa=d.Color,m=d.Series,k=d.seriesTypes,w=d.each,B=d.extend,y=d.addEvent,\nba=d.fireEvent,r=d.isNumber,ca=d.merge,da=d.pick,n=d.wrap,L;d.initCanvasBoost=function(){d.seriesTypes.heatmap&&d.wrap(d.seriesTypes.heatmap.prototype,\"drawPoints\",function(){var a=this.getContext();a?(w(this.points,function(b){var c=b.plotY;void 0===c||isNaN(c)||null===b.y||(c=b.shapeArgs,b=b.series.colorAttribs(b),a.fillStyle=b.fill,a.fillRect(c.x,c.y,c.width,c.height))}),this.canvasToSVG()):this.chart.showLoading(\"Your browser doesn't support HTML5 canvas, \\x3cbr\\x3eplease use a modern browser\")});\nd.extend(m.prototype,{directTouch:!1,pointRange:0,allowDG:!1,hasExtremes:function(a){var b=this.options,c=this.xAxis&&this.xAxis.options,g=this.yAxis&&this.yAxis.options;return b.data.length>(b.boostThreshold||Number.MAX_VALUE)&&r(g.min)&&r(g.max)&&(!a||r(c.min)&&r(c.max))},destroyGraphics:function(){var a=this,b=this.points,c,g;if(b)for(g=0;g<b.length;g+=1)(c=b[g])&&c.graphic&&(c.graphic=c.graphic.destroy());w([\"graph\",\"area\",\"tracker\"],function(c){a[c]&&(a[c]=a[c].destroy())})},getContext:function(){var a=\nthis.chart,b=a.chartWidth,c=a.chartHeight,g=this.group,e=this,d,f=function(a,c,b,e,g,d,f){a.call(this,b,c,e,g,d,f)};x(a)&&(e=a,g=a.seriesGroup);d=e.ctx;e.canvas||(e.canvas=A.createElement(\"canvas\"),e.image=a.renderer.image(\"\",0,0,b,c).add(g),e.ctx=d=e.canvas.getContext(\"2d\"),a.inverted&&w([\"moveTo\",\"lineTo\",\"rect\",\"arc\"],function(a){n(d,a,f)}),e.boostClipRect=a.renderer.clipRect(a.plotLeft,a.plotTop,a.plotWidth,a.chartHeight),e.image.clip(e.boostClipRect));e.canvas.width!==b&&(e.canvas.width=b);e.canvas.height!==\nc&&(e.canvas.height=c);e.image.attr({x:0,y:0,width:b,height:c,style:\"pointer-events: none\"});e.boostClipRect.attr({x:0,y:0,width:a.plotWidth,height:a.chartHeight});return d},canvasToSVG:function(){x(this.chart)?this.image&&this.image.attr({href:\"\"}):this.image.attr({href:this.canvas.toDataURL(\"image/png\")})},cvsLineTo:function(a,b,c){a.lineTo(b,c)},renderCanvas:function(){var a=this,b=a.options,c=a.chart,g=this.xAxis,e=this.yAxis,k=(c.options.boost||{}).timeRendering||!1,f,t=0,m=a.processedXData,\nw=a.processedYData,n=b.data,l=g.getExtremes(),C=l.min,D=l.max,l=e.getExtremes(),x=l.min,y=l.max,M={},E,A=!!a.sampling,N,F=b.marker&&b.marker.radius,O=this.cvsDrawPoint,G=b.lineWidth?this.cvsLineTo:!1,P=F&&1>=F?this.cvsMarkerSquare:this.cvsMarkerCircle,ea=this.cvsStrokeBatch||1E3,fa=!1!==b.enableMouseTracking,Q,l=b.threshold,u=e.getThreshold(l),R=r(l),S=u,ga=this.fill,T=a.pointArrayMap&&\"low,high\"===a.pointArrayMap.join(\",\"),U=!!b.stacking,ha=a.cropStart||0,l=c.options.loading,ia=a.requireSorting,\nV,ja=b.connectNulls,W=!m,H,I,v,z,J,q=U?a.data:m||n,ka=a.fillOpacity?(new aa(a.color)).setOpacity(da(b.fillOpacity,.75)).get():a.color,X=function(){ga?(f.fillStyle=ka,f.fill()):(f.strokeStyle=a.color,f.lineWidth=b.lineWidth,f.stroke())},Y=function(b,e,g,d){0===t&&(f.beginPath(),G&&(f.lineJoin=\"round\"));c.scroller&&\"highcharts-navigator-series\"===a.options.className?(e+=c.scroller.top,g&&(g+=c.scroller.top)):e+=c.plotTop;b+=c.plotLeft;V?f.moveTo(b,e):O?O(f,b,e,g,Q):G?G(f,b,e):P&&P.call(a,f,b,e,F,d);\nt+=1;t===ea&&(X(),t=0);Q={clientX:b,plotY:e,yBottom:g}},K=function(a,b,d){J=a+\",\"+b;fa&&!M[J]&&(M[J]=!0,c.inverted&&(a=g.len-a,b=e.len-b),N.push({clientX:a,plotX:a,plotY:b,i:ha+d}))};(this.points||this.graph)&&this.destroyGraphics();a.plotGroup(\"group\",\"series\",a.visible?\"visible\":\"hidden\",b.zIndex,c.seriesGroup);a.markerGroup=a.group;N=this.points=[];f=this.getContext();a.buildKDTree=Z;99999<n.length&&(c.options.loading=ca(l,{labelStyle:{backgroundColor:d.color(\"#ffffff\").setOpacity(.75).get(),padding:\"1em\",\nborderRadius:\"0.5em\"},style:{backgroundColor:\"none\",opacity:1}}),clearTimeout(L),c.showLoading(\"Drawing...\"),c.options.loading=l);k&&console.time(\"canvas rendering\");p(q,function(b,d){var f,h,k,l=!1,p=!1,m=!1,n=!1,r=\"undefined\"===typeof c.index,t=!0;if(!r){W?(f=b[0],h=b[1],q[d+1]&&(m=q[d+1][0]),q[d-1]&&(n=q[d-1][0])):(f=b,h=w[d],q[d+1]&&(m=q[d+1]),q[d-1]&&(n=q[d-1]));m&&m>=C&&m<=D&&(l=!0);n&&n>=C&&n<=D&&(p=!0);T?(W&&(h=b.slice(1,3)),k=h[0],h=h[1]):U&&(f=b.x,h=b.stackY,k=h-b.y);b=null===h;ia||(t=h>=\nx&&h<=y);if(!b&&(f>=C&&f<=D&&t||l||p))if(f=Math.round(g.toPixels(f,!0)),A){if(void 0===v||f===E){T||(k=h);if(void 0===z||h>I)I=h,z=d;if(void 0===v||k<H)H=k,v=d}f!==E&&(void 0!==v&&(h=e.toPixels(I,!0),u=e.toPixels(H,!0),Y(f,R?Math.min(h,S):h,R?Math.max(u,S):u,d),K(f,h,z),u!==h&&K(f,u,v)),v=z=void 0,E=f)}else h=Math.round(e.toPixels(h,!0)),Y(f,h,u,d),K(f,h,d);V=b&&!ja;0===d%5E4&&a.canvasToSVG()}return!r},function(){var b=c.loadingDiv,e=c.loadingShown;X();a.canvasToSVG();k&&console.timeEnd(\"canvas rendering\");\nba(a,\"renderedCanvas\");e&&(B(b.style,{transition:\"opacity 250ms\",opacity:0}),c.loadingShown=!1,L=setTimeout(function(){b.parentNode&&b.parentNode.removeChild(b);c.loadingDiv=c.loadingSpan=null},250));a.directTouch=!1;a.options.stickyTracking=!0;delete a.buildKDTree;a.buildKDTree()},c.renderer.forExport?Number.MAX_VALUE:void 0)}});n(m.prototype,\"setData\",function(a){this.hasExtremes&&this.hasExtremes(!0)&&\"heatmap\"!==this.type||a.apply(this,Array.prototype.slice.call(arguments,1))});n(m.prototype,\n\"processData\",function(a){this.hasExtremes&&this.hasExtremes(!0)&&\"heatmap\"!==this.type||a.apply(this,Array.prototype.slice.call(arguments,1))});k.scatter.prototype.cvsMarkerCircle=function(a,b,c,d){a.moveTo(b,c);a.arc(b,c,d,0,2*Math.PI,!1)};k.scatter.prototype.cvsMarkerSquare=function(a,b,c,d){a.rect(b-d,c-d,2*d,2*d)};k.scatter.prototype.fill=!0;k.bubble&&(k.bubble.prototype.cvsMarkerCircle=function(a,b,c,d,e){a.moveTo(b,c);a.arc(b,c,this.radii&&this.radii[e],0,2*Math.PI,!1)},k.bubble.prototype.cvsStrokeBatch=\n1);B(k.area.prototype,{cvsDrawPoint:function(a,b,c,d,e){e&&b!==e.clientX&&(a.moveTo(e.clientX,e.yBottom),a.lineTo(e.clientX,e.plotY),a.lineTo(b,c),a.lineTo(b,d))},fill:!0,fillOpacity:!0,sampling:!0});B(k.column.prototype,{cvsDrawPoint:function(a,b,c,d){a.rect(b-1,c,1,d-c)},fill:!0,sampling:!0});d.Chart.prototype.callbacks.push(function(a){y(a,\"predraw\",function(){a.image&&a.image.attr({href:\"\"});a.canvas&&a.canvas.getContext(\"2d\").clearRect(0,0,a.canvas.width,a.canvas.height)});y(a,\"render\",function(){a.image&&\na.canvas&&a.image.attr({href:a.canvas.toDataURL(\"image/png\")})})})}})(p)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/boost-canvas.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Boost module\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * License: www.highcharts.com/license\n         * Author: Torstein Honsi, Christer Vasseng\n         * \n         * This is an experimental Highcharts module that draws long data series on a canvas\n         * in order to increase performance of the initial load time and tooltip responsiveness.\n         *\n         * Compatible with HTML5 canvas compatible browsers (not IE < 9).\n         *\n         *\n         * \n         * Development plan\n         * - Column range.\n         * - Heatmap. Modify the heatmap-canvas demo so that it uses this module.\n         * - Treemap.\n         * - Check how it works with Highstock and data grouping. Currently it only works when navigator.adaptToUpdatedData\n         *   is false. It is also recommended to set scrollbar.liveRedraw to false.\n         * - Check inverted charts.\n         * - Check reversed axes.\n         * - Chart callback should be async after last series is drawn. (But not necessarily, we don't do\n        \t that with initial series animation).\n         * - Cache full-size image so we don't have to redraw on hide/show and zoom up. But k-d-tree still\n         *   needs to be built.\n         * - Test IE9 and IE10.\n         * - Stacking is not perhaps not correct since it doesn't use the translation given in \n         *   the translate method. If this gets to complicated, a possible way out would be to \n         *   have a simplified renderCanvas method that simply draws the areaPath on a canvas.\n         *\n         * If this module is taken in as part of the core\n         * - All the loading logic should be merged with core. Update styles in the core.\n         * - Most of the method wraps should probably be added directly in parent methods.\n         *\n         * Notes for boost mode\n         * - Area lines are not drawn\n         * - Point markers are not drawn on line-type series\n         * - Lines are not drawn on scatter charts\n         * - Zones and negativeColor don't work\n         * - Initial point colors aren't rendered\n         * - Columns are always one pixel wide. Don't set the threshold too low.\n         *\n         * Optimizing tips for users\n         * - For scatter plots, use a marker.radius of 1 or less. It results in a rectangle being drawn, which is \n         *   considerably faster than a circle.\n         * - Set extremes (min, max) explicitly on the axes in order for Highcharts to avoid computing extremes.\n         * - Set enableMouseTracking to false on the series to improve total rendering time.\n         * - The default threshold is set based on one series. If you have multiple, dense series, the combined\n         *   number of points drawn gets higher, and you may want to set the threshold lower in order to \n         *   use optimizations.\n         */\n\n\n        var win = H.win,\n            doc = win.document,\n            noop = function() {},\n            Color = H.Color,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            each = H.each,\n            extend = H.extend,\n            addEvent = H.addEvent,\n            fireEvent = H.fireEvent,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            wrap = H.wrap,\n            CHUNK_SIZE = 50000,\n            destroyLoadingDiv;\n\n        function eachAsync(arr, fn, finalFunc, chunkSize, i) {\n            i = i || 0;\n            chunkSize = chunkSize || CHUNK_SIZE;\n\n            var threshold = i + chunkSize,\n                proceed = true;\n\n            while (proceed && i < threshold && i < arr.length) {\n                proceed = fn(arr[i], i);\n                i = i + 1;\n            }\n            if (proceed) {\n                if (i < arr.length) {\n                    setTimeout(function() {\n                        eachAsync(arr, fn, finalFunc, chunkSize, i);\n                    });\n                } else if (finalFunc) {\n                    finalFunc();\n                }\n            }\n        }\n\n        /*\n         * Returns true if the chart is in series boost mode\n         * @param chart {Highchart.Chart} - the chart to check\n         * @returns {Boolean} - true if the chart is in series boost mode\n         */\n        function isChartSeriesBoosting(chart) {\n            var threshold = (chart.options.boost ? chart.options.boost.seriesThreshold : 0) ||\n                chart.options.chart.seriesBoostThreshold ||\n                10;\n\n            return chart.series.length >= threshold;\n        }\n\n        H.initCanvasBoost = function() {\n\n            if (H.seriesTypes.heatmap) {\n                H.wrap(H.seriesTypes.heatmap.prototype, 'drawPoints', function() {\n                    var ctx = this.getContext();\n                    if (ctx) {\n\n                        // draw the columns\n                        each(this.points, function(point) {\n                            var plotY = point.plotY,\n                                shapeArgs,\n                                pointAttr;\n\n                            if (plotY !== undefined && !isNaN(plotY) && point.y !== null) {\n                                shapeArgs = point.shapeArgs;\n\n\n                                pointAttr = point.series.colorAttribs(point);\n\n\n                                ctx.fillStyle = pointAttr.fill;\n                                ctx.fillRect(shapeArgs.x, shapeArgs.y, shapeArgs.width, shapeArgs.height);\n                            }\n                        });\n\n                        this.canvasToSVG();\n\n                    } else {\n                        this.chart.showLoading('Your browser doesn\\'t support HTML5 canvas, <br>please use a modern browser');\n\n                        // Uncomment this to provide low-level (slow) support in oldIE. It will cause script errors on\n                        // charts with more than a few thousand points.\n                        // arguments[0].call(this);\n                    }\n                });\n            }\n\n\n            /**\n             * Override a bunch of methods the same way. If the number of points is below the threshold,\n             * run the original method. If not, check for a canvas version or do nothing.\n             */\n            // each(['translate', 'generatePoints', 'drawTracker', 'drawPoints', 'render'], function (method) {\n            // \tfunction branch(proceed) {\n            // \t\tvar letItPass = this.options.stacking && (method === 'translate' || method === 'generatePoints');\n            // \t\tif (((this.processedXData || this.options.data).length < (this.options.boostThreshold || Number.MAX_VALUE) ||\n            // \t\t\t\tletItPass) || !isChartSeriesBoosting(this.chart)) {\n\n            // \t\t\t// Clear image\n            // \t\t\tif (method === 'render' && this.image) {\n            // \t\t\t\tthis.image.attr({ href: '' });\n            // \t\t\t\tthis.animate = null; // We're zooming in, don't run animation\n            // \t\t\t}\n\n            // \t\t\tproceed.call(this);\n\n            // \t\t// If a canvas version of the method exists, like renderCanvas(), run\n            // \t\t} else if (this[method + 'Canvas']) {\n\n            // \t\t\tthis[method + 'Canvas']();\n            // \t\t}\n            // \t}\n            // \twrap(Series.prototype, method, branch);\n\n            // \t// A special case for some types - its translate method is already wrapped\n            // \tif (method === 'translate') {\n            // \t\teach(['arearange', 'bubble', 'column'], function (type) {\n            // \t\t\tif (seriesTypes[type]) {\n            // \t\t\t\twrap(seriesTypes[type].prototype, method, branch);\n            // \t\t\t}\n            // \t\t});\n            // \t}\n            // });\n\n            H.extend(Series.prototype, {\n                directTouch: false,\n                pointRange: 0,\n                allowDG: false, // No data grouping, let boost handle large data \n                hasExtremes: function(checkX) {\n                    var options = this.options,\n                        data = options.data,\n                        xAxis = this.xAxis && this.xAxis.options,\n                        yAxis = this.yAxis && this.yAxis.options;\n                    return data.length > (options.boostThreshold || Number.MAX_VALUE) && isNumber(yAxis.min) && isNumber(yAxis.max) &&\n                        (!checkX || (isNumber(xAxis.min) && isNumber(xAxis.max)));\n                },\n\n                /**\n                 * If implemented in the core, parts of this can probably be shared with other similar\n                 * methods in Highcharts.\n                 */\n                destroyGraphics: function() {\n                    var series = this,\n                        points = this.points,\n                        point,\n                        i;\n\n                    if (points) {\n                        for (i = 0; i < points.length; i = i + 1) {\n                            point = points[i];\n                            if (point && point.graphic) {\n                                point.graphic = point.graphic.destroy();\n                            }\n                        }\n                    }\n\n                    each(['graph', 'area', 'tracker'], function(prop) {\n                        if (series[prop]) {\n                            series[prop] = series[prop].destroy();\n                        }\n                    });\n                },\n\n                /**\n                 * Create a hidden canvas to draw the graph on. The contents is later copied over \n                 * to an SVG image element.\n                 */\n                getContext: function() {\n                    var chart = this.chart,\n                        width = chart.chartWidth,\n                        height = chart.chartHeight,\n                        targetGroup = this.group,\n                        target = this,\n                        ctx,\n                        swapXY = function(proceed, x, y, a, b, c, d) {\n                            proceed.call(this, y, x, a, b, c, d);\n                        };\n\n                    if (isChartSeriesBoosting(chart)) {\n                        target = chart;\n                        targetGroup = chart.seriesGroup;\n                    }\n\n                    ctx = target.ctx;\n\n                    if (!target.canvas) {\n                        target.canvas = doc.createElement('canvas');\n\n                        target.image = chart.renderer.image(\n                            '',\n                            0,\n                            0,\n                            width,\n                            height\n                        ).add(targetGroup);\n\n                        target.ctx = ctx = target.canvas.getContext('2d');\n\n                        if (chart.inverted) {\n                            each(['moveTo', 'lineTo', 'rect', 'arc'], function(fn) {\n                                wrap(ctx, fn, swapXY);\n                            });\n                        }\n\n                        target.boostClipRect = chart.renderer.clipRect(\n                            chart.plotLeft,\n                            chart.plotTop,\n                            chart.plotWidth,\n                            chart.chartHeight\n                        );\n\n                        target.image.clip(target.boostClipRect);\n\n                    } else if (!(target instanceof H.Chart)) {\n                        //ctx.clearRect(0, 0, width, height);\n                    }\n\n                    if (target.canvas.width !== width) {\n                        target.canvas.width = width;\n                    }\n\n                    if (target.canvas.height !== height) {\n                        target.canvas.height = height;\n                    }\n\n                    target.image.attr({\n                        x: 0,\n                        y: 0,\n                        width: width,\n                        height: height,\n                        style: 'pointer-events: none'\n                    });\n\n                    target.boostClipRect.attr({\n                        x: 0,\n                        y: 0,\n                        width: chart.plotWidth,\n                        height: chart.chartHeight\n                    });\n\n                    return ctx;\n                },\n\n                /** \n                 * Draw the canvas image inside an SVG image\n                 */\n                canvasToSVG: function() {\n                    if (!isChartSeriesBoosting(this.chart)) {\n                        this.image.attr({\n                            href: this.canvas.toDataURL('image/png')\n                        });\n                    } else if (this.image) {\n                        this.image.attr({\n                            href: ''\n                        });\n                    }\n                },\n\n                cvsLineTo: function(ctx, clientX, plotY) {\n                    ctx.lineTo(clientX, plotY);\n                },\n\n                renderCanvas: function() {\n                    var series = this,\n                        options = series.options,\n                        chart = series.chart,\n                        xAxis = this.xAxis,\n                        yAxis = this.yAxis,\n                        activeBoostSettings = chart.options.boost || {},\n                        boostSettings = {\n                            timeRendering: activeBoostSettings.timeRendering || false,\n                            timeSeriesProcessing: activeBoostSettings.timeSeriesProcessing || false,\n                            timeSetup: activeBoostSettings.timeSetup || false\n                        },\n                        ctx,\n                        c = 0,\n                        xData = series.processedXData,\n                        yData = series.processedYData,\n                        rawData = options.data,\n                        xExtremes = xAxis.getExtremes(),\n                        xMin = xExtremes.min,\n                        xMax = xExtremes.max,\n                        yExtremes = yAxis.getExtremes(),\n                        yMin = yExtremes.min,\n                        yMax = yExtremes.max,\n                        pointTaken = {},\n                        lastClientX,\n                        sampling = !!series.sampling,\n                        points,\n                        r = options.marker && options.marker.radius,\n                        cvsDrawPoint = this.cvsDrawPoint,\n                        cvsLineTo = options.lineWidth ? this.cvsLineTo : false,\n                        cvsMarker = r && r <= 1 ?\n                        this.cvsMarkerSquare :\n                        this.cvsMarkerCircle,\n                        strokeBatch = this.cvsStrokeBatch || 1000,\n                        enableMouseTracking = options.enableMouseTracking !== false,\n                        lastPoint,\n                        threshold = options.threshold,\n                        yBottom = yAxis.getThreshold(threshold),\n                        hasThreshold = isNumber(threshold),\n                        translatedThreshold = yBottom,\n                        doFill = this.fill,\n                        isRange = series.pointArrayMap && series.pointArrayMap.join(',') === 'low,high',\n                        isStacked = !!options.stacking,\n                        cropStart = series.cropStart || 0,\n                        loadingOptions = chart.options.loading,\n                        requireSorting = series.requireSorting,\n                        wasNull,\n                        connectNulls = options.connectNulls,\n                        useRaw = !xData,\n                        minVal,\n                        maxVal,\n                        minI,\n                        maxI,\n                        kdIndex,\n                        sdata = isStacked ? series.data : (xData || rawData),\n                        fillColor = series.fillOpacity ?\n                        new Color(series.color).setOpacity(pick(options.fillOpacity, 0.75)).get() :\n                        series.color,\n\n                        stroke = function() {\n                            if (doFill) {\n                                ctx.fillStyle = fillColor;\n                                ctx.fill();\n                            } else {\n                                ctx.strokeStyle = series.color;\n                                ctx.lineWidth = options.lineWidth;\n                                ctx.stroke();\n                            }\n                        },\n\n                        drawPoint = function(clientX, plotY, yBottom, i) {\n                            if (c === 0) {\n                                ctx.beginPath();\n\n                                if (cvsLineTo) {\n                                    ctx.lineJoin = 'round';\n                                }\n                            }\n\n                            if (chart.scroller && series.options.className === 'highcharts-navigator-series') {\n                                plotY += chart.scroller.top;\n                                if (yBottom) {\n                                    yBottom += chart.scroller.top;\n                                }\n                            } else {\n                                plotY += chart.plotTop;\n                            }\n\n                            clientX += chart.plotLeft;\n\n                            if (wasNull) {\n                                ctx.moveTo(clientX, plotY);\n                            } else {\n                                if (cvsDrawPoint) {\n                                    cvsDrawPoint(ctx, clientX, plotY, yBottom, lastPoint);\n                                } else if (cvsLineTo) {\n                                    cvsLineTo(ctx, clientX, plotY);\n                                } else if (cvsMarker) {\n                                    cvsMarker.call(series, ctx, clientX, plotY, r, i);\n                                }\n                            }\n\n                            // We need to stroke the line for every 1000 pixels. It will crash the browser\n                            // memory use if we stroke too infrequently.\n                            c = c + 1;\n                            if (c === strokeBatch) {\n                                stroke();\n                                c = 0;\n                            }\n\n                            // Area charts need to keep track of the last point\n                            lastPoint = {\n                                clientX: clientX,\n                                plotY: plotY,\n                                yBottom: yBottom\n                            };\n                        },\n\n                        addKDPoint = function(clientX, plotY, i) {\n                            // Avoid more string concatination than required\n                            kdIndex = clientX + ',' + plotY;\n\n                            // The k-d tree requires series points. Reduce the amount of points, since the time to build the \n                            // tree increases exponentially.\n                            if (enableMouseTracking && !pointTaken[kdIndex]) {\n                                pointTaken[kdIndex] = true;\n\n                                if (chart.inverted) {\n                                    clientX = xAxis.len - clientX;\n                                    plotY = yAxis.len - plotY;\n                                }\n\n                                points.push({\n                                    clientX: clientX,\n                                    plotX: clientX,\n                                    plotY: plotY,\n                                    i: cropStart + i\n                                });\n                            }\n                        };\n\n                    // If we are zooming out from SVG mode, destroy the graphics\n                    if (this.points || this.graph) {\n                        this.destroyGraphics();\n                    }\n\n                    // The group\n                    series.plotGroup(\n                        'group',\n                        'series',\n                        series.visible ? 'visible' : 'hidden',\n                        options.zIndex,\n                        chart.seriesGroup\n                    );\n\n                    series.markerGroup = series.group;\n                    // addEvent(series, 'destroy', function () {\n                    // \tseries.markerGroup = null;\n                    // });\n\n                    points = this.points = [];\n                    ctx = this.getContext();\n                    series.buildKDTree = noop; // Do not start building while drawing \n\n                    // Display a loading indicator\n                    if (rawData.length > 99999) {\n                        chart.options.loading = merge(loadingOptions, {\n                            labelStyle: {\n                                backgroundColor: H.color('#ffffff').setOpacity(0.75).get(),\n                                padding: '1em',\n                                borderRadius: '0.5em'\n                            },\n                            style: {\n                                backgroundColor: 'none',\n                                opacity: 1\n                            }\n                        });\n                        clearTimeout(destroyLoadingDiv);\n                        chart.showLoading('Drawing...');\n                        chart.options.loading = loadingOptions; // reset\n                    }\n\n                    if (boostSettings.timeRendering) {\n                        console.time('canvas rendering'); // eslint-disable-line no-console\n                    }\n\n                    // Loop over the points\n                    eachAsync(sdata, function(d, i) {\n                        var x,\n                            y,\n                            clientX,\n                            plotY,\n                            isNull,\n                            low,\n                            isNextInside = false,\n                            isPrevInside = false,\n                            nx = false,\n                            px = false,\n                            chartDestroyed = typeof chart.index === 'undefined',\n                            isYInside = true;\n\n                        if (!chartDestroyed) {\n                            if (useRaw) {\n                                x = d[0];\n                                y = d[1];\n\n                                if (sdata[i + 1]) {\n                                    nx = sdata[i + 1][0];\n                                }\n\n                                if (sdata[i - 1]) {\n                                    px = sdata[i - 1][0];\n                                }\n                            } else {\n                                x = d;\n                                y = yData[i];\n\n                                if (sdata[i + 1]) {\n                                    nx = sdata[i + 1];\n                                }\n\n                                if (sdata[i - 1]) {\n                                    px = sdata[i - 1];\n                                }\n                            }\n\n                            if (nx && nx >= xMin && nx <= xMax) {\n                                isNextInside = true;\n                            }\n\n                            if (px && px >= xMin && px <= xMax) {\n                                isPrevInside = true;\n                            }\n\n                            // Resolve low and high for range series\n                            if (isRange) {\n                                if (useRaw) {\n                                    y = d.slice(1, 3);\n                                }\n                                low = y[0];\n                                y = y[1];\n                            } else if (isStacked) {\n                                x = d.x;\n                                y = d.stackY;\n                                low = y - d.y;\n                            }\n\n                            isNull = y === null;\n\n                            // Optimize for scatter zooming\n                            if (!requireSorting) {\n                                isYInside = y >= yMin && y <= yMax;\n                            }\n\n                            if (!isNull &&\n                                (\n                                    (x >= xMin && x <= xMax && isYInside) ||\n                                    (isNextInside || isPrevInside)\n                                )) {\n\n\n                                clientX = Math.round(xAxis.toPixels(x, true));\n\n                                if (sampling) {\n                                    if (minI === undefined || clientX === lastClientX) {\n                                        if (!isRange) {\n                                            low = y;\n                                        }\n                                        if (maxI === undefined || y > maxVal) {\n                                            maxVal = y;\n                                            maxI = i;\n                                        }\n                                        if (minI === undefined || low < minVal) {\n                                            minVal = low;\n                                            minI = i;\n                                        }\n\n                                    }\n                                    if (clientX !== lastClientX) { // Add points and reset\n                                        if (minI !== undefined) { // then maxI is also a number\n                                            plotY = yAxis.toPixels(maxVal, true);\n                                            yBottom = yAxis.toPixels(minVal, true);\n                                            drawPoint(\n                                                clientX,\n                                                hasThreshold ? Math.min(plotY, translatedThreshold) : plotY,\n                                                hasThreshold ? Math.max(yBottom, translatedThreshold) : yBottom,\n                                                i\n                                            );\n                                            addKDPoint(clientX, plotY, maxI);\n                                            if (yBottom !== plotY) {\n                                                addKDPoint(clientX, yBottom, minI);\n                                            }\n                                        }\n\n                                        minI = maxI = undefined;\n                                        lastClientX = clientX;\n                                    }\n                                } else {\n                                    plotY = Math.round(yAxis.toPixels(y, true));\n                                    drawPoint(clientX, plotY, yBottom, i);\n                                    addKDPoint(clientX, plotY, i);\n                                }\n                            }\n                            wasNull = isNull && !connectNulls;\n\n                            if (i % CHUNK_SIZE === 0) {\n                                series.canvasToSVG();\n                            }\n                        }\n\n                        return !chartDestroyed;\n                    }, function() {\n                        var loadingDiv = chart.loadingDiv,\n                            loadingShown = chart.loadingShown;\n                        stroke();\n                        series.canvasToSVG();\n\n                        if (boostSettings.timeRendering) {\n                            console.timeEnd('canvas rendering'); // eslint-disable-line no-console\n                        }\n\n                        fireEvent(series, 'renderedCanvas');\n\n                        // Do not use chart.hideLoading, as it runs JS animation and will be blocked by buildKDTree.\n                        // CSS animation looks good, but then it must be deleted in timeout. If we add the module to core,\n                        // change hideLoading so we can skip this block.\n                        if (loadingShown) {\n                            extend(loadingDiv.style, {\n                                transition: 'opacity 250ms',\n                                opacity: 0\n                            });\n                            chart.loadingShown = false;\n                            destroyLoadingDiv = setTimeout(function() {\n                                if (loadingDiv.parentNode) { // In exporting it is falsy\n                                    loadingDiv.parentNode.removeChild(loadingDiv);\n                                }\n                                chart.loadingDiv = chart.loadingSpan = null;\n                            }, 250);\n                        }\n\n                        // Pass tests in Pointer. \n                        // Replace this with a single property, and replace when zooming in\n                        // below boostThreshold.\n                        series.directTouch = false;\n                        series.options.stickyTracking = true;\n\n                        delete series.buildKDTree; // Go back to prototype, ready to build\n                        series.buildKDTree();\n\n                        // Don't do async on export, the exportChart, getSVGForExport and getSVG methods are not chained for it.\n                    }, chart.renderer.forExport ? Number.MAX_VALUE : undefined);\n                }\n            });\n\n            wrap(Series.prototype, 'setData', function(proceed) {\n                if (!this.hasExtremes || !this.hasExtremes(true) || this.type === 'heatmap') {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n            });\n\n            wrap(Series.prototype, 'processData', function(proceed) {\n                if (!this.hasExtremes || !this.hasExtremes(true) || this.type === 'heatmap') {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n            });\n\n            seriesTypes.scatter.prototype.cvsMarkerCircle = function(ctx, clientX, plotY, r) {\n                ctx.moveTo(clientX, plotY);\n                ctx.arc(clientX, plotY, r, 0, 2 * Math.PI, false);\n            };\n\n            // Rect is twice as fast as arc, should be used for small markers\n            seriesTypes.scatter.prototype.cvsMarkerSquare = function(ctx, clientX, plotY, r) {\n                ctx.rect(clientX - r, plotY - r, r * 2, r * 2);\n            };\n            seriesTypes.scatter.prototype.fill = true;\n\n            if (seriesTypes.bubble) {\n                seriesTypes.bubble.prototype.cvsMarkerCircle = function(ctx, clientX, plotY, r, i) {\n                    ctx.moveTo(clientX, plotY);\n                    ctx.arc(clientX, plotY, this.radii && this.radii[i], 0, 2 * Math.PI, false);\n                };\n                seriesTypes.bubble.prototype.cvsStrokeBatch = 1;\n            }\n\n            extend(seriesTypes.area.prototype, {\n                cvsDrawPoint: function(ctx, clientX, plotY, yBottom, lastPoint) {\n                    if (lastPoint && clientX !== lastPoint.clientX) {\n                        ctx.moveTo(lastPoint.clientX, lastPoint.yBottom);\n                        ctx.lineTo(lastPoint.clientX, lastPoint.plotY);\n                        ctx.lineTo(clientX, plotY);\n                        ctx.lineTo(clientX, yBottom);\n                    }\n                },\n                fill: true,\n                fillOpacity: true,\n                sampling: true\n            });\n\n            extend(seriesTypes.column.prototype, {\n                cvsDrawPoint: function(ctx, clientX, plotY, yBottom) {\n                    ctx.rect(clientX - 1, plotY, 1, yBottom - plotY);\n                },\n                fill: true,\n                sampling: true\n            });\n\n            H.Chart.prototype.callbacks.push(function(chart) {\n                function canvasToSVG() {\n                    if (chart.image && chart.canvas) {\n                        chart.image.attr({\n                            href: chart.canvas.toDataURL('image/png')\n                        });\n                    }\n                }\n\n                function clear() {\n                    if (chart.image) {\n                        chart.image.attr({\n                            href: ''\n                        });\n                    }\n\n                    if (chart.canvas) {\n                        chart.canvas.getContext('2d').clearRect(\n                            0,\n                            0,\n                            chart.canvas.width,\n                            chart.canvas.height\n                        );\n                    }\n                }\n\n                addEvent(chart, 'predraw', clear);\n                addEvent(chart, 'render', canvasToSVG);\n            });\n        };\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/boost.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Boost module\n\n (c) 2010-2017 Highsoft AS\n Author: Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(x){\"object\"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(h){function x(){var a=Array.prototype.slice.call(arguments),c=-Number.MAX_VALUE;C(a,function(a){if(\"undefined\"!==typeof a&&\"undefined\"!==typeof a.length&&0<a.length)return c=a.length,!0});return c}function z(a){var c=0,d;if(1<a.series.length)for(var f=0;f<a.series.length;f++)d=a.series[f],x(d.processedXData,d.options.data,d.points)>=(d.options.boostThreshold||Number.MAX_VALUE)&&c++;return 5<\nc||a.series.length>=G(a.options.boost&&a.options.boost.seriesThreshold,50)}function A(a){return z(a.chart)||x(a.processedXData,a.options.data,a.points)>=(a.options.boostThreshold||Number.MAX_VALUE)}function fa(a){function c(b,c){c=a.createShader(\"vertex\"===c?a.VERTEX_SHADER:a.FRAGMENT_SHADER);a.shaderSource(c,b);a.compileShader(c);return a.getShaderParameter(c,a.COMPILE_STATUS)?c:!1}function d(){function d(b){return a.getUniformLocation(l,b)}var f=c(\"#version 100\\nprecision highp float;\\nattribute vec4 aVertexPosition;\\nattribute vec4 aColor;\\nvarying highp vec2 position;\\nvarying highp vec4 vColor;\\nuniform mat4 uPMatrix;\\nuniform float pSize;\\nuniform float translatedThreshold;\\nuniform bool hasThreshold;\\nuniform bool skipTranslation;\\nuniform float xAxisTrans;\\nuniform float xAxisMin;\\nuniform float xAxisMinPad;\\nuniform float xAxisPointRange;\\nuniform float xAxisLen;\\nuniform bool  xAxisPostTranslate;\\nuniform float xAxisOrdinalSlope;\\nuniform float xAxisOrdinalOffset;\\nuniform float xAxisPos;\\nuniform bool  xAxisCVSCoord;\\nuniform float yAxisTrans;\\nuniform float yAxisMin;\\nuniform float yAxisMinPad;\\nuniform float yAxisPointRange;\\nuniform float yAxisLen;\\nuniform bool  yAxisPostTranslate;\\nuniform float yAxisOrdinalSlope;\\nuniform float yAxisOrdinalOffset;\\nuniform float yAxisPos;\\nuniform bool  yAxisCVSCoord;\\nuniform bool  isBubble;\\nuniform bool  bubbleSizeByArea;\\nuniform float bubbleZMin;\\nuniform float bubbleZMax;\\nuniform float bubbleZThreshold;\\nuniform float bubbleMinSize;\\nuniform float bubbleMaxSize;\\nuniform bool  bubbleSizeAbs;\\nuniform bool  isInverted;\\nfloat bubbleRadius(){\\nfloat value \\x3d aVertexPosition.w;\\nfloat zMax \\x3d bubbleZMax;\\nfloat zMin \\x3d bubbleZMin;\\nfloat radius \\x3d 0.0;\\nfloat pos \\x3d 0.0;\\nfloat zRange \\x3d zMax - zMin;\\nif (bubbleSizeAbs){\\nvalue \\x3d value - bubbleZThreshold;\\nzMax \\x3d max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);\\nzMin \\x3d 0.0;\\n}\\nif (value \\x3c zMin){\\nradius \\x3d bubbleZMin / 2.0 - 1.0;\\n} else {\\npos \\x3d zRange \\x3e 0.0 ? (value - zMin) / zRange : 0.5;\\nif (bubbleSizeByArea \\x26\\x26 pos \\x3e 0.0){\\npos \\x3d sqrt(pos);\\n}\\nradius \\x3d ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;\\n}\\nreturn radius * 2.0;\\n}\\nfloat translate(float val,\\nfloat pointPlacement,\\nfloat localA,\\nfloat localMin,\\nfloat minPixelPadding,\\nfloat pointRange,\\nfloat len,\\nbool  cvsCoord\\n){\\nfloat sign \\x3d 1.0;\\nfloat cvsOffset \\x3d 0.0;\\nif (cvsCoord) {\\nsign *\\x3d -1.0;\\ncvsOffset \\x3d len;\\n}\\nreturn sign * (val - localMin) * localA + cvsOffset + \\n(sign * minPixelPadding);\\n}\\nfloat xToPixels(float value){\\nif (skipTranslation){\\nreturn value;// + xAxisPos;\\n}\\nreturn translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord);// + xAxisPos;\\n}\\nfloat yToPixels(float value, float checkTreshold){\\nfloat v;\\nif (skipTranslation){\\nv \\x3d value;// + yAxisPos;\\n} else {\\nv \\x3d translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord);// + yAxisPos;\\n}\\nif (checkTreshold \\x3e 0.0 \\x26\\x26 hasThreshold) {\\nv \\x3d min(v, translatedThreshold);\\n}\\nreturn v;\\n}\\nvoid main(void) {\\nif (isBubble){\\ngl_PointSize \\x3d bubbleRadius();\\n} else {\\ngl_PointSize \\x3d pSize;\\n}\\nvColor \\x3d aColor;\\nif (isInverted) {\\ngl_Position \\x3d uPMatrix * vec4(xToPixels(aVertexPosition.y) + yAxisPos, yToPixels(aVertexPosition.x, aVertexPosition.z) + xAxisPos, 0.0, 1.0);\\n} else {\\ngl_Position \\x3d uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);\\n}\\n}\",\n\"vertex\"),e=c(\"precision highp float;\\nuniform vec4 fillColor;\\nvarying highp vec2 position;\\nvarying highp vec4 vColor;\\nuniform sampler2D uSampler;\\nuniform bool isCircle;\\nuniform bool hasColor;\\nvoid main(void) {\\nvec4 col \\x3d fillColor;\\nif (hasColor) {\\ncol \\x3d vColor;\\n}\\nif (isCircle) {\\ngl_FragColor \\x3d col * texture2D(uSampler, gl_PointCoord.st);\\n} else {\\ngl_FragColor \\x3d col;\\n}\\n}\",\"fragment\");if(!f||!e)return l=!1;l=a.createProgram();a.attachShader(l,f);a.attachShader(l,e);a.linkProgram(l);\na.useProgram(l);a.bindAttribLocation(l,0,\"aVertexPosition\");h=d(\"uPMatrix\");n=d(\"pSize\");J=d(\"fillColor\");H=d(\"isBubble\");k=d(\"bubbleSizeAbs\");t=d(\"bubbleSizeByArea\");B=d(\"uSampler\");b=d(\"skipTranslation\");q=d(\"isCircle\");g=d(\"isInverted\");return!0}function f(b,c){b=e[b]=e[b]||a.getUniformLocation(l,b);a.uniform1f(b,c)}var e={},l,h,n,J,H,k,t,b,q,g,B;a&&d();return{psUniform:function(){return n},pUniform:function(){return h},fillColorUniform:function(){return J},setBubbleUniforms:function(b,c,d){var e=\nb.options,l=Number.MAX_VALUE,h=-Number.MAX_VALUE;\"bubble\"===b.type&&(l=G(e.zMin,Math.min(l,Math.max(c,!1===e.displayNegative?e.zThreshold:-Number.MAX_VALUE))),h=G(e.zMax,Math.max(h,d)),a.uniform1i(H,1),a.uniform1i(q,1),a.uniform1i(t,\"width\"!==b.options.sizeBy),a.uniform1i(k,b.options.sizeByAbsoluteValue),f(\"bubbleZMin\",l),f(\"bubbleZMax\",h),f(\"bubbleZThreshold\",b.options.zThreshold),f(\"bubbleMinSize\",b.minPxSize),f(\"bubbleMaxSize\",b.maxPxSize))},bind:function(){a.useProgram(l)},program:function(){return l},\ncreate:d,setUniform:f,setPMatrix:function(b){a.uniformMatrix4fv(h,!1,b)},setColor:function(b){a.uniform4f(J,b[0]/255,b[1]/255,b[2]/255,b[3])},setPointSize:function(b){a.uniform1f(n,b)},setSkipTranslation:function(c){a.uniform1i(b,!0===c?1:0)},setTexture:function(){a.uniform1i(B,0)},setDrawAsCircle:function(b){a.uniform1i(q,b?1:0)},reset:function(){a.uniform1i(H,0);a.uniform1i(q,0)},setInverted:function(b){a.uniform1i(g,b)},destroy:function(){a&&l&&a.deleteProgram(l)}}}function X(a,c,d){var f=!1,e=\n!1,l=d||2,h=!1,n=0,g;return{destroy:function(){f&&a.deleteBuffer(f)},bind:function(){if(!f)return!1;a.vertexAttribPointer(e,l,a.FLOAT,!1,0,0)},data:g,build:function(d,k,t){g=d||[];if(!(g&&0!==g.length||h))return f=!1;l=t||l;f&&a.deleteBuffer(f);f=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,f);a.bufferData(a.ARRAY_BUFFER,h||new Float32Array(g),a.STATIC_DRAW);e=a.getAttribLocation(c.program(),k);a.enableVertexAttribArray(e);return!0},render:function(c,d,e){var b=h?h.length:g.length;if(!f||!b)return!1;\nif(!c||c>b||0>c)c=0;if(!d||d>b)d=b;a.drawArrays(a[(e||\"points\").toUpperCase()],c/l,(d-c)/l);return!0},allocate:function(a){n=-1;h=new Float32Array(4*a)},push:function(a,c,d,b){h&&(h[++n]=a,h[++n]=c,h[++n]=d,h[++n]=b)}}}function ga(a){function c(a){var b,c;return A(a)?(b=!!a.options.stacking,c=a.xData||a.options.xData||a.processedXData,b=(b?a.data:c||a.options.data).length,\"treemap\"===a.type?b*=12:\"heatmap\"===a.type?b*=6:N[a.type]&&(b*=2),b):0}function d(){b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)}\nfunction f(a,b){function c(a){a&&(b.colorData.push(a[0]),b.colorData.push(a[1]),b.colorData.push(a[2]),b.colorData.push(a[3]))}function d(a,b,d,e,f){c(f);r.usePreallocated?t.push(a,b,d?1:0,e||1):(B.push(a),B.push(b),B.push(d?1:0),B.push(e||1))}function e(a,b,e,f,v){c(v);d(a+e,b);c(v);d(a,b);c(v);d(a,b+f);c(v);d(a,b+f);c(v);d(a+e,b+f);c(v);d(a+e,b)}function f(a){r.useGPUTranslations||(b.skipTranslation=!0,a.x=A.toPixels(a.x,!0),a.y=F.toPixels(a.y,!0));d(a.x,a.y,0,2)}var v=a.pointArrayMap&&\"low,high\"===\na.pointArrayMap.join(\",\"),k=a.chart,m=a.options,l=!!m.stacking,g=m.data,n=a.xAxis.getExtremes(),q=n.min,u=n.max,n=a.yAxis.getExtremes(),w=n.min,z=n.max,n=a.xData||m.xData||a.processedXData,x=a.yData||m.yData||a.processedYData,p=a.zData||m.zData||a.processedZData,F=a.yAxis,A=a.xAxis,E=!n||0===n.length,y=a.points||!1,J=!1,H,K,L,I=l?a.data:n||g,D={x:Number.MIN_VALUE,y:0},R={x:Number.MIN_VALUE,y:0};m.boostData&&0<m.boostData.length||(a.closestPointRangePx=Number.MAX_VALUE,y&&0<y.length?(b.skipTranslation=\n!0,b.drawMode=\"triangles\",y[0].node&&y[0].node.levelDynamic&&y.sort(function(a,b){if(a.node){if(a.node.levelDynamic>b.node.levelDynamic)return 1;if(a.node.levelDynamic<b.node.levelDynamic)return-1}return 0}),C(y,function(b){var c=b.plotY,d;void 0===c||isNaN(c)||null===b.y||(c=b.shapeArgs,d=b.series.colorAttribs(b),b=d[\"stroke-width\"]||0,K=h.color(d.fill).rgba,K[0]/=255,K[1]/=255,K[2]/=255,\"treemap\"===a.type&&(b=b||1,L=h.color(d.stroke).rgba,L[0]/=255,L[1]/=255,L[2]/=255,e(c.x,c.y,c.width,c.height,\nL),b/=2),e(c.x+b,c.y+b,c.width-2*b,c.height-2*b,K))})):(C(I,function(c,e){var f,m,h,n=!1,P=!1,g=!1,Y=!1,ha=N[a.type],t=!1,y=!0;if(\"undefined\"===typeof k.index)return!1;E?(f=c[0],m=c[1],I[e+1]&&(P=I[e+1][0]),I[e-1]&&(n=I[e-1][0]),3<=c.length&&(h=c[2],c[2]>b.zMax&&(b.zMax=c[2]),c[2]<b.zMin&&(b.zMin=c[2]))):(f=c,m=x[e],I[e+1]&&(P=I[e+1]),I[e-1]&&(n=I[e-1]),p&&p.length&&(h=p[e],p[e]>b.zMax&&(b.zMax=p[e]),p[e]<b.zMin&&(b.zMin=p[e])));P&&P>=q&&P<=u&&(g=!0);n&&n>=q&&n<=u&&(Y=!0);v?(E&&(m=c.slice(1,3)),m=\nm[1]):l&&(f=c.x,m=c.stackY);a.requireSorting||(y=m>=w&&m<=z);f>u&&R.x<u&&(R.x=f,R.y=m);f<q&&D.x<q&&(D.x=f,D.y=m);if(0===m||m&&y)if(f>=q&&f<=u&&(t=!0),t||g||Y)r.useGPUTranslations||(b.skipTranslation=!0,f=A.toPixels(f,!0),m=F.toPixels(m,!0)),ha&&(H=0,0>m&&(H=m,m=0),r.useGPUTranslations||(H=F.toPixels(H,!0)),d(f,H,0,0,!1)),b.hasMarkers&&!1!==J&&(a.closestPointRangePx=Math.min(a.closestPointRangePx,Math.abs(f-J))),d(f,m,0,\"bubble\"===a.type?h||1:2,!1),J=f}),J||(f(D),f(R))))}function e(){u=[];y.data=B=\n[];p=[]}function l(a){k&&(k.setUniform(\"xAxisTrans\",a.transA),k.setUniform(\"xAxisMin\",a.min),k.setUniform(\"xAxisMinPad\",a.minPixelPadding),k.setUniform(\"xAxisPointRange\",a.pointRange),k.setUniform(\"xAxisLen\",a.len),k.setUniform(\"xAxisPos\",a.pos),k.setUniform(\"xAxisCVSCoord\",!a.horiz))}function g(a){k&&(k.setUniform(\"yAxisTrans\",a.transA),k.setUniform(\"yAxisMin\",a.min),k.setUniform(\"yAxisMinPad\",a.minPixelPadding),k.setUniform(\"yAxisPointRange\",a.pointRange),k.setUniform(\"yAxisLen\",a.len),k.setUniform(\"yAxisPos\",\na.pos),k.setUniform(\"yAxisCVSCoord\",!a.horiz))}function n(a,b){k.setUniform(\"hasThreshold\",a);k.setUniform(\"translatedThreshold\",b)}function w(c){if(c)q=c.chartWidth||800,F=c.chartHeight||400;else return!1;if(!b||!q||!F)return!1;r.timeRendering&&console.time(\"gl rendering\");k.bind();b.viewport(0,0,q,F);k.setPMatrix([2/q,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1]);1<r.lineWidth&&!h.isMS&&b.lineWidth(r.lineWidth);t.build(y.data,\"aVertexPosition\",4);t.bind();x&&(b.bindTexture(b.TEXTURE_2D,D),k.setTexture(D));\nk.setInverted(c.options.chart?c.options.chart.inverted:!1);C(u,function(a,c){var d=a.series.options,e=d.threshold,f=Q(e),e=a.series.yAxis.getThreshold(e),m=G(d.marker?d.marker.enabled:null,a.series.xAxis.isRadial?!0:null,a.series.closestPointRangePx>2*((d.marker?d.marker.radius:10)||10)),v=a.series.fillOpacity?(new Z(a.series.color)).setOpacity(G(d.fillOpacity,.85)).get():a.series.color;t.bind();d.colorByPoint&&(v=a.series.chart.options.colors[c]);v=h.color(v).rgba;r.useAlpha||(v[3]=1);\"add\"===d.boostBlending?\n(b.blendFunc(b.SRC_ALPHA,b.ONE),b.blendEquation(b.FUNC_ADD)):\"mult\"===d.boostBlending?b.blendFunc(b.DST_COLOR,b.ZERO):\"darken\"===d.boostBlending?(b.blendFunc(b.ONE,b.ONE),b.blendEquation(b.FUNC_MIN)):b.blendFuncSeparate(b.SRC_ALPHA,b.ONE_MINUS_SRC_ALPHA,b.ONE,b.ONE_MINUS_SRC_ALPHA);k.reset();0<a.colorData.length&&(k.setUniform(\"hasColor\",1),c=X(b,k),c.build(a.colorData,\"aColor\",4),c.bind());k.setColor(v);l(a.series.xAxis);g(a.series.yAxis);n(f,e);\"points\"===a.drawMode&&(d.marker&&d.marker.radius?\nk.setPointSize(2*d.marker.radius):k.setPointSize(1));k.setSkipTranslation(a.skipTranslation);\"bubble\"===a.series.type&&k.setBubbleUniforms(a.series,a.zMin,a.zMax);k.setDrawAsCircle(ia[a.series.type]&&x||!1);t.render(a.from,a.to,a.drawMode);a.hasMarkers&&m&&(d.marker&&d.marker.radius?k.setPointSize(2*d.marker.radius):k.setPointSize(10),k.setDrawAsCircle(!0),t.render(a.from,a.to,\"POINTS\"))});t.destroy();r.timeRendering&&console.timeEnd(\"gl rendering\");e();a&&a()}function z(a){d();if(a.renderer.forExport)return w(a);\nE?w(a):setTimeout(function(){z(a)},1)}var k=!1,t=!1,b=!1,q=0,F=0,B=!1,p=!1,x=!1,y={},E=!1,u=[],M=U.createElement(\"canvas\"),O=M.getContext(\"2d\"),D,N={column:!0,area:!0},ia={scatter:!0,bubble:!0},r={pointSize:1,lineWidth:3,fillColor:\"#AA00AA\",useAlpha:!0,usePreallocated:!1,useGPUTranslations:!1,timeRendering:!1,timeSeriesProcessing:!1,timeSetup:!1};return y={allocateBufferForSingleSeries:function(a){var b=0;r.usePreallocated&&(A(a)&&(b=c(a)),t.allocate(b))},pushSeries:function(a){0<u.length&&(u[u.length-\n1].to=B.length,u[u.length-1].hasMarkers&&(u[u.length-1].markerTo=p.length));r.timeSeriesProcessing&&console.time(\"building \"+a.type+\" series\");u.push({from:B.length,markerFrom:p.length,colorData:[],series:a,zMin:Number.MAX_VALUE,zMax:-Number.MAX_VALUE,hasMarkers:a.options.marker?!1!==a.options.marker.enabled:!1,showMarksers:!0,drawMode:{area:\"lines\",arearange:\"lines\",areaspline:\"line_strip\",column:\"lines\",line:\"line_strip\",scatter:\"points\",heatmap:\"triangles\",treemap:\"triangles\",bubble:\"points\"}[a.type]||\n\"line_strip\"});f(a,u[u.length-1]);r.timeSeriesProcessing&&console.timeEnd(\"building \"+a.type+\" series\")},setSize:function(a,b){if(q!==a||b!==b)q=a,F=b,k.bind(),k.setPMatrix([2/q,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1])},inited:function(){return E},setThreshold:n,init:function(a,c){var d=0,f=[\"webgl\",\"experimental-webgl\",\"moz-webgl\",\"webkit-3d\"];E=!1;if(!a)return!1;for(r.timeSetup&&console.time(\"gl setup\");d<f.length&&!(b=a.getContext(f[d]));d++);if(b)c||e();else return!1;b.enable(b.BLEND);b.blendFunc(b.SRC_ALPHA,\nb.ONE_MINUS_SRC_ALPHA);b.disable(b.DEPTH_TEST);b.depthMask(b.FALSE);k=fa(b);t=X(b,k);x=!1;D=b.createTexture();M.width=512;M.height=512;O.fillStyle=\"#FFF\";O.beginPath();O.arc(256,256,256,0,2*Math.PI);O.fill();try{b.bindTexture(b.TEXTURE_2D,D),b.texImage2D(b.TEXTURE_2D,0,b.RGBA,b.RGBA,b.UNSIGNED_BYTE,M),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.LINEAR),b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_MIN_FILTER,b.LINEAR_MIPMAP_LINEAR),b.generateMipmap(b.TEXTURE_2D),b.bindTexture(b.TEXTURE_2D,null),x=!0}catch(oa){}E=!0;r.timeSetup&&console.timeEnd(\"gl setup\");return!0},render:z,settings:r,valid:function(){return!1!==b},clear:d,flush:e,setXAxis:l,setYAxis:g,data:B,gl:function(){return b},allocateBuffer:function(a){var b=0;r.usePreallocated&&(C(a.series,function(a){A(a)&&(b+=c(a))}),t.allocate(b))},destroy:function(){t.destroy();k.destroy()},setOptions:function(a){ja(!0,r,a)}}}function aa(a,\nc){var d=a.chartWidth,f=a.chartHeight,e=a,l=a.seriesGroup||c.group,g=function(a,d,e,f,h,b,l){a.call(c,e,d,f,h,b,l)},e=z(a)?a:c;e.image||(e.canvas=U.createElement(\"canvas\"),e.image=a.renderer.image(\"\",0,0,d,f).add(l),e.boostClipRect=a.renderer.clipRect(a.plotLeft,a.plotTop,a.plotWidth,a.chartHeight),e.image.clip(e.boostClipRect),e.inverted&&C([\"moveTo\",\"lineTo\",\"rect\",\"arc\"],function(a){w(!1,a,g)}),e instanceof h.Chart&&(e.markerGroup=e.renderer.g().add(l),e.markerGroup.translate(c.xAxis.pos,c.yAxis.pos)));\ne.canvas.width=d;e.canvas.height=f;e.image.attr({x:0,y:0,width:d,height:f,style:\"pointer-events: none\"});e.boostClipRect.attr({x:a.plotLeft,y:a.plotTop,width:a.plotWidth,height:a.chartHeight});e.ogl||(e.ogl=ga(function(){e.image.attr({href:e.canvas.toDataURL(\"image/png\")})}),e.ogl.init(e.canvas),e.ogl.setOptions(a.options.boost||{}),e instanceof h.Chart&&e.ogl.allocateBuffer(a));e.ogl.setSize(d,f);return e.ogl}function ba(a,c,d){a&&c.image&&c.canvas&&!z(d||c.chart)&&a.render(d||c.chart)}function ca(a,\nc){a&&c.image&&c.canvas&&!z(c.chart)&&a.allocateBufferForSingleSeries(c)}function S(a,c,d,f,e,h){e=e||0;f=f||5E4;for(var l=e+f,g=!0;g&&e<l&&e<a.length;)g=c(a[e],e),++e;g&&(e<a.length?h?S(a,c,d,f,e,h):T.requestAnimationFrame?T.requestAnimationFrame(function(){S(a,c,d,f,e)}):setTimeout(function(){S(a,c,d,f,e)}):d&&d())}function ka(a){if(!A(this))return a.call(this);if(a=aa(this.chart,this))ca(a,this),a.pushSeries(this);ba(a,this)}var T=h.win,U=T.document,la=function(){},Z=h.Color,p=h.Series,g=h.seriesTypes,\nC=h.each,da=h.extend,ea=h.addEvent,ma=h.fireEvent,na=h.grep,Q=h.isNumber,ja=h.merge,G=h.pick,w=h.wrap,V=h.getOptions().plotOptions,W;Z.prototype.names={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\",\ncrimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dodgerblue:\"#1e90ff\",feldspar:\"#d19275\",firebrick:\"#b22222\",\nfloralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#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\",lightgrey:\"#d3d3d3\",lightgreen:\"#90ee90\",\nlightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",lightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslateblue:\"#8470ff\",lightslategray:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370d8\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",\nmintcream:\"#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:\"#d87093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",\nsandybrown:\"#f4a460\",seagreen:\"#2e8b57\",seashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",violetred:\"#d02090\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};p.prototype.getPoint=function(a){var c=a,d=this.xData||this.options.xData||this.processedXData||\n!1;!a||a instanceof this.pointClass||(c=(new this.pointClass).init(this,this.options.data[a.i],d?d[a.i]:void 0),c.category=c.x,c.dist=a.dist,c.distX=a.distX,c.plotX=a.plotX,c.plotY=a.plotY,c.index=a.i);return c};w(p.prototype,\"searchPoint\",function(a){return this.getPoint(a.apply(this,[].slice.call(arguments,1)))});w(p.prototype,\"destroy\",function(a){var c=this,d=c.chart;d.markerGroup===c.markerGroup&&(c.markerGroup=null);d.hoverPoints&&(d.hoverPoints=na(d.hoverPoints,function(a){return a.series===\nc}));d.hoverPoint&&d.hoverPoint.series===c&&(d.hoverPoint=null);a.call(this)});w(p.prototype,\"getExtremes\",function(a){if(!A(this)||!this.hasExtremes||!this.hasExtremes())return a.apply(this,Array.prototype.slice.call(arguments,1))});C(\"area arearange column line scatter heatmap bubble treemap heatmap\".split(\" \"),function(a){V[a]&&(V[a].boostThreshold=5E3,V[a].boostData=[])});C([\"translate\",\"generatePoints\",\"drawTracker\",\"drawPoints\",\"render\"],function(a){function c(c){var d=this.options.stacking&&\n(\"translate\"===a||\"generatePoints\"===a);if(!A(this)||d||\"heatmap\"===this.type||\"treemap\"===this.type)\"render\"===a&&this.image&&!z(this.chart)&&(this.image.attr({href:\"\"}),this.animate=null),c.call(this);else if(this[a+\"Canvas\"])this[a+\"Canvas\"]()}w(p.prototype,a,c);\"translate\"===a&&(g.column&&w(g.column.prototype,a,c),g.arearange&&w(g.arearange.prototype,a,c),g.treemap&&w(g.treemap.prototype,a,c))});(function(){var a=0,c,d=[\"webgl\",\"experimental-webgl\",\"moz-webgl\",\"webkit-3d\"],f=!1;if(\"undefined\"!==\ntypeof T.WebGLRenderingContext)for(c=U.createElement(\"canvas\");a<d.length;a++)try{if(f=c.getContext(d[a]),\"undefined\"!==typeof f&&null!==f)return!0}catch(e){}return!1})()?(w(p.prototype,\"processData\",function(a){A(this)&&\"heatmap\"!==this.type&&\"treemap\"!==this.type||a.apply(this,Array.prototype.slice.call(arguments,1));this.hasExtremes&&this.hasExtremes(!0)||a.apply(this,Array.prototype.slice.call(arguments,1))}),h.extend(p.prototype,{pointRange:0,directTouch:!1,allowDG:!1,hasExtremes:function(a){var c=\nthis.options,d=this.xAxis&&this.xAxis.options,f=this.yAxis&&this.yAxis.options;return c.data.length>(c.boostThreshold||Number.MAX_VALUE)&&Q(f.min)&&Q(f.max)&&(!a||Q(d.min)&&Q(d.max))},destroyGraphics:function(){var a=this,c=this.points,d,f;if(c)for(f=0;f<c.length;f+=1)(d=c[f])&&d.graphic&&(d.graphic=d.graphic.destroy());C([\"graph\",\"area\",\"tracker\"],function(c){a[c]&&(a[c]=a[c].destroy())})},renderCanvas:function(){var a=this,c=a.options||{},d=!1,f=a.chart,e=this.xAxis,h=this.yAxis,g=c.xData||a.processedXData,\nn=c.yData||a.processedYData,p=c.data,d=e.getExtremes(),w=d.min,k=d.max,d=h.getExtremes(),t=d.min,b=d.max,q={},x,B=!!a.sampling,A,C=!1!==c.enableMouseTracking,y=h.getThreshold(c.threshold),E=a.pointArrayMap&&\"low,high\"===a.pointArrayMap.join(\",\"),u=!!c.stacking,M=a.cropStart||0,O=a.requireSorting,D=!g,N,G,r,v,m=function(a,b,c){W=a+\",\"+b;C&&!q[W]&&(q[W]=!0,f.inverted&&(a=e.len-a,b=h.len-b),A.push({clientX:a,plotX:a,plotY:b,i:M+c}))},d=aa(f,a);this.visible?((this.points||this.graph)&&this.destroyGraphics(),\nz(f)?this.markerGroup=f.markerGroup:this.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",!0,1,f.seriesGroup),A=this.points=[],a.buildKDTree=la,d&&(ca(d,this),d.pushSeries(a),ba(d,this,f)),S(u?a.data:g||p,function(a,c){var d,g,l,p=\"undefined\"===typeof f.index,q=!0;if(!p&&(D?(d=a[0],g=a[1]):(d=a,g=n[c]),E?(D&&(g=a.slice(1,3)),l=g[0],g=g[1]):u&&(d=a.x,g=a.stackY,l=g-a.y),O||(q=g>=t&&g<=b),null!==g&&d>=w&&d<=k&&q))if(a=Math.ceil(e.toPixels(d,!0)),B){if(void 0===r||a===x){E||(l=g);if(void 0===v||g>G)G=\ng,v=c;if(void 0===r||l<N)N=l,r=c}a!==x&&(void 0!==r&&(g=h.toPixels(G,!0),y=h.toPixels(N,!0),m(a,g,v),y!==g&&m(a,y,r)),r=v=void 0,x=a)}else g=Math.ceil(h.toPixels(g,!0)),m(a,g,c);return!p},function(){ma(a,\"renderedCanvas\");a.directTouch=!1;a.options.stickyTracking=!0;delete a.buildKDTree;a.buildKDTree()},f.renderer.forExport?Number.MAX_VALUE:void 0)):!z(f)&&d&&(d.clear(),this.image.attr({href:\"\"}))}}),C([\"heatmap\",\"treemap\"],function(a){g[a]&&(w(g[a].prototype,\"drawPoints\",ka),g[a].prototype.directTouch=\n!1)}),g.bubble&&(delete g.bubble.prototype.buildKDTree,g.bubble.prototype.directTouch=!1,w(g.bubble.prototype,\"markerAttribs\",function(a){return A(this)?!1:a.apply(this,[].slice.call(arguments,1))})),g.scatter.prototype.fill=!0,da(g.area.prototype,{fill:!0,fillOpacity:!0,sampling:!0}),da(g.column.prototype,{fill:!0,sampling:!0}),w(p.prototype,\"setVisible\",function(a,c){a.call(this,c,!1);!1===this.visible&&this.ogl&&this.canvas&&this.image?(this.ogl.clear(),this.image.attr({href:\"\"})):this.chart.redraw()}),\nh.Chart.prototype.callbacks.push(function(a){ea(a,\"predraw\",function(){!z(a)&&a.didBoost&&(a.didBoost=!1,a.image&&a.image.attr({href:\"\"}));a.canvas&&a.ogl&&z(a)&&(a.didBoost=!0,a.ogl.allocateBuffer(a));a.markerGroup&&a.xAxis&&0<a.xAxis.length&&a.yAxis&&0<a.yAxis.length&&a.markerGroup.translate(a.xAxis[0].pos,a.yAxis[0].pos)});ea(a,\"render\",function(){a.ogl&&z(a)&&a.ogl.render(a)})})):\"undefined\"!==typeof h.initCanvasBoost?h.initCanvasBoost():h.error(26)})(x)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/boost.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Boost module\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * License: www.highcharts.com/license\n         * Author: Christer Vasseng, Torstein Honsi\n         * \n         * This is an experimental Highcharts module that draws long data series on a canvas\n         * in order to increase performance of the initial load time and tooltip responsiveness.\n         *\n         * Compatible with WebGL compatible browsers (not IE < 11).\n         *\n         * Development plan\n         * - Column range.\n         * - Check how it works with Highstock and data grouping. Currently it only works when navigator.adaptToUpdatedData\n         *   is false. It is also recommended to set scrollbar.liveRedraw to false.\n         * - Check inverted charts.\n         * - Chart callback should be async after last series is drawn. (But not necessarily, we don't do\n        \t that with initial series animation).\n         *\n         * If this module is taken in as part of the core\n         * - All the loading logic should be merged with core. Update styles in the core.\n         * - Most of the method wraps should probably be added directly in parent methods.\n         *\n         * Notes for boost mode\n         * - Area lines are not drawn\n         * - Lines are not drawn on scatter charts\n         * - Zones and negativeColor don't work\n         * - Columns are always one pixel wide. Don't set the threshold too low.\n         * - Disable animations\n         * - Marker shapes are not supported: markers will always be circles\n         *\n         * Optimizing tips for users\n         * - Set extremes (min, max) explicitly on the axes in order for Highcharts to avoid computing extremes.\n         * - Set enableMouseTracking to false on the series to improve total rendering time.\n         * - The default threshold is set based on one series. If you have multiple, dense series, the combined\n         *   number of points drawn gets higher, and you may want to set the threshold lower in order to \n         *   use optimizations.\n         * - If drawing large scatter charts, it's beneficial to set the marker radius to a value\n         *   less than 1. This is to add additional spacing to make the chart more readable.\n         * - If the value increments on both the X and Y axis aren't small, consider setting\n         *\t useGPUTranslations to true on the boost settings object. If you do this and\n         *\t the increments are small (e.g. datetime axis with small time increments)\n         *\t it may cause rendering issues due to floating point rounding errors,\n         *\t so your millage may vary.\n         *\n         * Settings\n         *\tThere are two ways of setting the boost threshold:\n         *\t- Per. series: boost based on number of points in individual series\n         *\t- Per. chart: boost based on the number of series \n         *\n         *  To set the series boost threshold, set seriesBoostThreshold on the chart object.\n         *  To set the series-specific threshold, set boostThreshold on the series object.\n         * \n         *  In addition, the following can be set in the boost object:\n         *  {\n         *  \t//Wether or not to use alpha blending\n         *  \tuseAlpha: boolean - default: true\n         *  \t//Set to true to perform translations on the GPU.\n         *  \t//Much faster, but may cause rendering issues\n         *  \t//when using values far from 0 due to floating point\n         *  \t//rounding issues\n         *  \tuseGPUTranslations: boolean - default: false\n         *  \t//Use pre-allocated buffers, much faster,\n         *  \t//but may cause rendering issues with some data sets\n         *  \tusePreallocated: boolean - default: false\n         *  \t//Output rendering time in console\n         *  \ttimeRendering: boolean - default: false\n         *  \t//Output processing time in console\n         *  \ttimeSeriesProcessing: boolean - default: false\n         *  \t//Output setup time in console\n         *  \ttimeSetup: boolean - default: false\n         *  }\n         */\n\n        /**\n         * Set the series threshold for when the boost should kick in globally.\n         *\n         * Setting to e.g. 20 will cause the whole chart to enter boost mode\n         * if there are 20 or more series active. When the chart is in boost mode,\n         * every series in it will be rendered to a common canvas. This offers \n         * a significant speed improvment in charts with a very high\n         * amount of series.\n         *  \n         * Note: only available when including the boost module.\n         *\n         * @default  null\n         * @apioption boost.seriesThreshold\n         */\n\n        /**\n         * Set the point threshold for when a series should enter boost mode.\n         *\n         * Setting it to e.g. 2000 will cause the series to enter boost mode\n         * when there are 2000 or more points in the series.\n         *\n         * Note: only available when including the boost module.\n         *\n         * @default  5000\n         * @apioption series.boostThreshold\n         */\n\n        /* global Float32Array */\n\n\n        var win = H.win,\n            doc = win.document,\n            noop = function() {},\n            Color = H.Color,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            each = H.each,\n            extend = H.extend,\n            addEvent = H.addEvent,\n            fireEvent = H.fireEvent,\n            grep = H.grep,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            wrap = H.wrap,\n            plotOptions = H.getOptions().plotOptions,\n            CHUNK_SIZE = 50000,\n            index;\n\n        // Register color names since GL can't render those directly.\n        Color.prototype.names = {\n            aliceblue: '#f0f8ff',\n            antiquewhite: '#faebd7',\n            aqua: '#00ffff',\n            aquamarine: '#7fffd4',\n            azure: '#f0ffff',\n            beige: '#f5f5dc',\n            bisque: '#ffe4c4',\n            black: '#000000',\n            blanchedalmond: '#ffebcd',\n            blue: '#0000ff',\n            blueviolet: '#8a2be2',\n            brown: '#a52a2a',\n            burlywood: '#deb887',\n            cadetblue: '#5f9ea0',\n            chartreuse: '#7fff00',\n            chocolate: '#d2691e',\n            coral: '#ff7f50',\n            cornflowerblue: '#6495ed',\n            cornsilk: '#fff8dc',\n            crimson: '#dc143c',\n            cyan: '#00ffff',\n            darkblue: '#00008b',\n            darkcyan: '#008b8b',\n            darkgoldenrod: '#b8860b',\n            darkgray: '#a9a9a9',\n            darkgreen: '#006400',\n            darkkhaki: '#bdb76b',\n            darkmagenta: '#8b008b',\n            darkolivegreen: '#556b2f',\n            darkorange: '#ff8c00',\n            darkorchid: '#9932cc',\n            darkred: '#8b0000',\n            darksalmon: '#e9967a',\n            darkseagreen: '#8fbc8f',\n            darkslateblue: '#483d8b',\n            darkslategray: '#2f4f4f',\n            darkturquoise: '#00ced1',\n            darkviolet: '#9400d3',\n            deeppink: '#ff1493',\n            deepskyblue: '#00bfff',\n            dimgray: '#696969',\n            dodgerblue: '#1e90ff',\n            feldspar: '#d19275',\n            firebrick: '#b22222',\n            floralwhite: '#fffaf0',\n            forestgreen: '#228b22',\n            fuchsia: '#ff00ff',\n            gainsboro: '#dcdcdc',\n            ghostwhite: '#f8f8ff',\n            gold: '#ffd700',\n            goldenrod: '#daa520',\n            gray: '#808080',\n            green: '#008000',\n            greenyellow: '#adff2f',\n            honeydew: '#f0fff0',\n            hotpink: '#ff69b4',\n            indianred: '#cd5c5c',\n            indigo: '#4b0082',\n            ivory: '#fffff0',\n            khaki: '#f0e68c',\n            lavender: '#e6e6fa',\n            lavenderblush: '#fff0f5',\n            lawngreen: '#7cfc00',\n            lemonchiffon: '#fffacd',\n            lightblue: '#add8e6',\n            lightcoral: '#f08080',\n            lightcyan: '#e0ffff',\n            lightgoldenrodyellow: '#fafad2',\n            lightgrey: '#d3d3d3',\n            lightgreen: '#90ee90',\n            lightpink: '#ffb6c1',\n            lightsalmon: '#ffa07a',\n            lightseagreen: '#20b2aa',\n            lightskyblue: '#87cefa',\n            lightslateblue: '#8470ff',\n            lightslategray: '#778899',\n            lightsteelblue: '#b0c4de',\n            lightyellow: '#ffffe0',\n            lime: '#00ff00',\n            limegreen: '#32cd32',\n            linen: '#faf0e6',\n            magenta: '#ff00ff',\n            maroon: '#800000',\n            mediumaquamarine: '#66cdaa',\n            mediumblue: '#0000cd',\n            mediumorchid: '#ba55d3',\n            mediumpurple: '#9370d8',\n            mediumseagreen: '#3cb371',\n            mediumslateblue: '#7b68ee',\n            mediumspringgreen: '#00fa9a',\n            mediumturquoise: '#48d1cc',\n            mediumvioletred: '#c71585',\n            midnightblue: '#191970',\n            mintcream: '#f5fffa',\n            mistyrose: '#ffe4e1',\n            moccasin: '#ffe4b5',\n            navajowhite: '#ffdead',\n            navy: '#000080',\n            oldlace: '#fdf5e6',\n            olive: '#808000',\n            olivedrab: '#6b8e23',\n            orange: '#ffa500',\n            orangered: '#ff4500',\n            orchid: '#da70d6',\n            palegoldenrod: '#eee8aa',\n            palegreen: '#98fb98',\n            paleturquoise: '#afeeee',\n            palevioletred: '#d87093',\n            papayawhip: '#ffefd5',\n            peachpuff: '#ffdab9',\n            peru: '#cd853f',\n            pink: '#ffc0cb',\n            plum: '#dda0dd',\n            powderblue: '#b0e0e6',\n            purple: '#800080',\n            red: '#ff0000',\n            rosybrown: '#bc8f8f',\n            royalblue: '#4169e1',\n            saddlebrown: '#8b4513',\n            salmon: '#fa8072',\n            sandybrown: '#f4a460',\n            seagreen: '#2e8b57',\n            seashell: '#fff5ee',\n            sienna: '#a0522d',\n            silver: '#c0c0c0',\n            skyblue: '#87ceeb',\n            slateblue: '#6a5acd',\n            slategray: '#708090',\n            snow: '#fffafa',\n            springgreen: '#00ff7f',\n            steelblue: '#4682b4',\n            tan: '#d2b48c',\n            teal: '#008080',\n            thistle: '#d8bfd8',\n            tomato: '#ff6347',\n            turquoise: '#40e0d0',\n            violet: '#ee82ee',\n            violetred: '#d02090',\n            wheat: '#f5deb3',\n            white: '#ffffff',\n            whitesmoke: '#f5f5f5',\n            yellow: '#ffff00',\n            yellowgreen: '#9acd32'\n        };\n\n        /**\n         * Tolerant max() funciton\n         * @return {number} max value\n         */\n        function patientMax() {\n            var args = Array.prototype.slice.call(arguments),\n                r = -Number.MAX_VALUE;\n\n            each(args, function(t) {\n                if (typeof t !== 'undefined' && typeof t.length !== 'undefined') {\n                    //r = r < t.length ? t.length : r;\n                    if (t.length > 0) {\n                        r = t.length;\n                        return true;\n                    }\n                }\n            });\n\n            return r;\n        }\n\n        /*\n         * Returns true if we should force chart series boosting\n         */\n        function shouldForceChartSeriesBoosting(chart) {\n            // If there are more than five series currently boosting,\n            // we should boost the whole chart to avoid running out of webgl contexts.\n            var sboostCount = 0,\n                series;\n\n            if (chart.series.length > 1) {\n                for (var i = 0; i < chart.series.length; i++) {\n                    series = chart.series[i];\n                    if (patientMax(\n                            series.processedXData,\n                            series.options.data,\n                            series.points\n                        ) >= (series.options.boostThreshold || Number.MAX_VALUE)) {\n                        sboostCount++;\n                    }\n                }\n            }\n\n            return sboostCount > 5;\n        }\n\n        /*\n         * Returns true if the chart is in series boost mode\n         * @param chart {Highchart.Chart} - the chart to check\n         * @returns {Boolean} - true if the chart is in series boost mode\n         */\n        function isChartSeriesBoosting(chart) {\n            return shouldForceChartSeriesBoosting(chart) || chart.series.length >= pick(\n                chart.options.boost && chart.options.boost.seriesThreshold,\n                50\n            );\n        }\n\n        /*\n         * Returns true if the series is in boost mode\n         * @param series {Highchart.Series} - the series to check\n         * @returns {boolean} - true if the series is in boost mode\n         */\n        function isSeriesBoosting(series) {\n            return isChartSeriesBoosting(series.chart) ||\n                patientMax(\n                    series.processedXData,\n                    series.options.data,\n                    series.points\n                ) >= (series.options.boostThreshold || Number.MAX_VALUE);\n        }\n\n        ////////////////////////////////////////////////////////////////////////////////\n        // START OF WEBGL ABSTRACTIONS\n\n        /* \n         * A static shader mimicing axis translation functions found in parts/Axis\n         * @param gl {WebGLContext} - the context in which the shader is active\n         */\n        function GLShader(gl) {\n            var vertShade = [\n                    /* eslint-disable */\n                    '#version 100',\n                    'precision highp float;',\n\n                    'attribute vec4 aVertexPosition;',\n                    'attribute vec4 aColor;',\n\n                    'varying highp vec2 position;',\n                    'varying highp vec4 vColor;',\n\n                    'uniform mat4 uPMatrix;',\n                    'uniform float pSize;',\n\n                    'uniform float translatedThreshold;',\n                    'uniform bool hasThreshold;',\n\n                    'uniform bool skipTranslation;',\n\n                    'uniform float xAxisTrans;',\n                    'uniform float xAxisMin;',\n                    'uniform float xAxisMinPad;',\n                    'uniform float xAxisPointRange;',\n                    'uniform float xAxisLen;',\n                    'uniform bool  xAxisPostTranslate;',\n                    'uniform float xAxisOrdinalSlope;',\n                    'uniform float xAxisOrdinalOffset;',\n                    'uniform float xAxisPos;',\n                    'uniform bool  xAxisCVSCoord;',\n\n                    'uniform float yAxisTrans;',\n                    'uniform float yAxisMin;',\n                    'uniform float yAxisMinPad;',\n                    'uniform float yAxisPointRange;',\n                    'uniform float yAxisLen;',\n                    'uniform bool  yAxisPostTranslate;',\n                    'uniform float yAxisOrdinalSlope;',\n                    'uniform float yAxisOrdinalOffset;',\n                    'uniform float yAxisPos;',\n                    'uniform bool  yAxisCVSCoord;',\n\n                    'uniform bool  isBubble;',\n                    'uniform bool  bubbleSizeByArea;',\n                    'uniform float bubbleZMin;',\n                    'uniform float bubbleZMax;',\n                    'uniform float bubbleZThreshold;',\n                    'uniform float bubbleMinSize;',\n                    'uniform float bubbleMaxSize;',\n                    'uniform bool  bubbleSizeAbs;',\n                    'uniform bool  isInverted;',\n\n                    'float bubbleRadius(){',\n                    'float value = aVertexPosition.w;',\n                    'float zMax = bubbleZMax;',\n                    'float zMin = bubbleZMin;',\n                    'float radius = 0.0;',\n                    'float pos = 0.0;',\n                    'float zRange = zMax - zMin;',\n\n                    'if (bubbleSizeAbs){',\n                    'value = value - bubbleZThreshold;',\n                    'zMax = max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);',\n                    'zMin = 0.0;',\n                    '}',\n\n                    'if (value < zMin){',\n                    'radius = bubbleZMin / 2.0 - 1.0;',\n                    '} else {',\n                    'pos = zRange > 0.0 ? (value - zMin) / zRange : 0.5;',\n                    'if (bubbleSizeByArea && pos > 0.0){',\n                    'pos = sqrt(pos);',\n                    '}',\n                    'radius = ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;',\n                    '}',\n\n                    'return radius * 2.0;',\n                    '}',\n\n                    'float translate(float val,',\n                    'float pointPlacement,',\n                    'float localA,',\n                    'float localMin,',\n                    'float minPixelPadding,',\n                    'float pointRange,',\n                    'float len,',\n                    'bool  cvsCoord',\n                    '){',\n\n                    'float sign = 1.0;',\n                    'float cvsOffset = 0.0;',\n\n                    'if (cvsCoord) {',\n                    'sign *= -1.0;',\n                    'cvsOffset = len;',\n                    '}',\n\n                    'return sign * (val - localMin) * localA + cvsOffset + ',\n                    '(sign * minPixelPadding);', //' + localA * pointPlacement * pointRange;',\n                    '}',\n\n                    'float xToPixels(float value){',\n                    'if (skipTranslation){',\n                    'return value;// + xAxisPos;',\n                    '}',\n\n                    'return translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord);// + xAxisPos;',\n                    '}',\n\n                    'float yToPixels(float value, float checkTreshold){',\n                    'float v;',\n                    'if (skipTranslation){',\n                    'v = value;// + yAxisPos;',\n                    '} else {',\n                    'v = translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord);// + yAxisPos;',\n                    '}',\n                    'if (checkTreshold > 0.0 && hasThreshold) {',\n                    'v = min(v, translatedThreshold);',\n                    '}',\n                    'return v;',\n                    '}',\n\n                    'void main(void) {',\n                    'if (isBubble){',\n                    'gl_PointSize = bubbleRadius();',\n                    '} else {',\n                    'gl_PointSize = pSize;',\n                    '}',\n                    //'gl_PointSize = 10.0;',\n                    'vColor = aColor;',\n\n                    'if (isInverted) {',\n                    'gl_Position = uPMatrix * vec4(xToPixels(aVertexPosition.y) + yAxisPos, yToPixels(aVertexPosition.x, aVertexPosition.z) + xAxisPos, 0.0, 1.0);',\n                    '} else {',\n                    'gl_Position = uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);',\n                    '}',\n                    //'gl_Position = uPMatrix * vec4(aVertexPosition.x, aVertexPosition.y, 0.0, 1.0);',\n                    '}'\n                    /* eslint-enable */\n                ].join('\\n'),\n                //Fragment shader source\n                fragShade = [\n                    /* eslint-disable */\n                    'precision highp float;',\n                    'uniform vec4 fillColor;',\n                    'varying highp vec2 position;',\n                    'varying highp vec4 vColor;',\n                    'uniform sampler2D uSampler;',\n                    'uniform bool isCircle;',\n                    'uniform bool hasColor;',\n\n                    // 'vec4 toColor(float value, vec2 point) {',\n                    // \t'return vec4(0.0, 0.0, 0.0, 0.0);',\n                    // '}',\n\n                    'void main(void) {',\n                    'vec4 col = fillColor;',\n\n                    'if (hasColor) {',\n                    'col = vColor;',\n                    '}',\n\n                    'if (isCircle) {',\n                    'gl_FragColor = col * texture2D(uSampler, gl_PointCoord.st);',\n                    '} else {',\n                    'gl_FragColor = col;',\n                    '}',\n                    '}'\n                    /* eslint-enable */\n                ].join('\\n'),\n                uLocations = {},\n                //The shader program\n                shaderProgram,\n                //Uniform handle to the perspective matrix\n                pUniform,\n                //Uniform for point size\n                psUniform,\n                //Uniform for fill color\n                fillColorUniform,\n                //Uniform for isBubble\n                isBubbleUniform,\n                //Uniform for bubble abs sizing\n                bubbleSizeAbsUniform,\n                bubbleSizeAreaUniform,\n                //Skip translation uniform\n                skipTranslationUniform,\n                //Set to 1 if circle\n                isCircleUniform,\n                //Uniform for invertion\n                isInverted,\n                //Texture uniform\n                uSamplerUniform;\n\n            /* String to shader program\n             * @param {string} str - the program source\n             * @param {string} type - the program type: either `vertex` or `fragment`\n             * @returns {bool|shader}\n             */\n            function stringToProgram(str, type) {\n                var t = type === 'vertex' ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER,\n                    shader = gl.createShader(t);\n\n                gl.shaderSource(shader, str);\n                gl.compileShader(shader);\n\n                if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n                    //console.error('shader error:', gl.getShaderInfoLog(shader));\n                    return false;\n                }\n                return shader;\n            }\n\n            /*\n             * Create the shader.\n             * Loads the shader program statically defined above\n             */\n            function createShader() {\n                var v = stringToProgram(vertShade, 'vertex'),\n                    f = stringToProgram(fragShade, 'fragment');\n\n                if (!v || !f) {\n                    shaderProgram = false;\n                    //console.error('error creating shader program');\n                    return false;\n                }\n\n                function uloc(n) {\n                    return gl.getUniformLocation(shaderProgram, n);\n                }\n\n                shaderProgram = gl.createProgram();\n\n                gl.attachShader(shaderProgram, v);\n                gl.attachShader(shaderProgram, f);\n                gl.linkProgram(shaderProgram);\n\n                gl.useProgram(shaderProgram);\n\n                gl.bindAttribLocation(shaderProgram, 0, 'aVertexPosition');\n\n                pUniform = uloc('uPMatrix');\n                psUniform = uloc('pSize');\n                fillColorUniform = uloc('fillColor');\n                isBubbleUniform = uloc('isBubble');\n                bubbleSizeAbsUniform = uloc('bubbleSizeAbs');\n                bubbleSizeAreaUniform = uloc('bubbleSizeByArea');\n                uSamplerUniform = uloc('uSampler');\n                skipTranslationUniform = uloc('skipTranslation');\n                isCircleUniform = uloc('isCircle');\n                isInverted = uloc('isInverted');\n\n                return true;\n            }\n\n            /*\n             * Destroy the shader\n             */\n            function destroy() {\n                if (gl && shaderProgram) {\n                    gl.deleteProgram(shaderProgram);\n                }\n            }\n\n            /*\n             * Bind the shader.\n             * This makes the shader the active one until another one is bound,\n             * or until 0 is bound.\n             */\n            function bind() {\n                gl.useProgram(shaderProgram);\n            }\n\n            /*\n             * Set a uniform value.\n             * This uses a hash map to cache uniform locations.\n             * @param name {string} - the name of the uniform to set\n             * @param val {float} - the value to set\n             */\n            function setUniform(name, val) {\n                var u = uLocations[name] = uLocations[name] ||\n                    gl.getUniformLocation(shaderProgram, name);\n                gl.uniform1f(u, val);\n            }\n\n            /*\n             * Set the active texture\n             * @param texture - the texture\n             */\n            function setTexture() {\n                gl.uniform1i(uSamplerUniform, 0);\n            }\n\n            /*\n             * Set if inversion state\n             * @flag is the state\n             */\n            function setInverted(flag) {\n                gl.uniform1i(isInverted, flag);\n            }\n\n            ////////////////////////////////////////////////////////////////////////////\n\n            /* \n             * Enable/disable circle drawing\n             */\n            function setDrawAsCircle(flag) {\n                gl.uniform1i(isCircleUniform, flag ? 1 : 0);\n            }\n\n            /*\n             * Flush\n             */\n            function reset() {\n                gl.uniform1i(isBubbleUniform, 0);\n                gl.uniform1i(isCircleUniform, 0);\n            }\n\n            /* \n             * Set bubble uniforms\n             * @param series {Highcharts.Series} - the series to use\n             */\n            function setBubbleUniforms(series, zCalcMin, zCalcMax) {\n                var seriesOptions = series.options,\n                    zMin = Number.MAX_VALUE,\n                    zMax = -Number.MAX_VALUE;\n\n                if (series.type === 'bubble') {\n                    zMin = pick(seriesOptions.zMin, Math.min(\n                        zMin,\n                        Math.max(\n                            zCalcMin,\n                            seriesOptions.displayNegative === false ?\n                            seriesOptions.zThreshold : -Number.MAX_VALUE\n                        )\n                    ));\n\n                    zMax = pick(seriesOptions.zMax, Math.max(zMax, zCalcMax));\n\n                    gl.uniform1i(isBubbleUniform, 1);\n                    gl.uniform1i(isCircleUniform, 1);\n                    gl.uniform1i(bubbleSizeAreaUniform, series.options.sizeBy !== 'width');\n                    gl.uniform1i(bubbleSizeAbsUniform, series.options.sizeByAbsoluteValue);\n\n                    setUniform('bubbleZMin', zMin);\n                    setUniform('bubbleZMax', zMax);\n                    setUniform('bubbleZThreshold', series.options.zThreshold);\n                    setUniform('bubbleMinSize', series.minPxSize);\n                    setUniform('bubbleMaxSize', series.maxPxSize);\n                }\n            }\n\n            /*\n             * Set the Color uniform.\n             * @param color {Array<float>} - an array with RGBA values\n             */\n            function setColor(color) {\n                gl.uniform4f(\n                    fillColorUniform,\n                    color[0] / 255.0,\n                    color[1] / 255.0,\n                    color[2] / 255.0,\n                    color[3]\n                );\n            }\n\n            /*\n             * Set skip translation\n             */\n            function setSkipTranslation(flag) {\n                gl.uniform1i(skipTranslationUniform, flag === true ? 1 : 0);\n            }\n\n            /*\n             * Set the perspective matrix\n             * @param m {Matrix4x4} - the matrix \n             */\n            function setPMatrix(m) {\n                gl.uniformMatrix4fv(pUniform, false, m);\n            }\n\n            /*\n             * Set the point size.\n             * @param p {float} - point size\n             */\n            function setPointSize(p) {\n                gl.uniform1f(psUniform, p);\n            }\n\n            /*\n             * Get the shader program handle\n             * @returns {GLInt} - the handle for the program\n             */\n            function getProgram() {\n                return shaderProgram;\n            }\n\n            if (gl) {\n                createShader();\n            }\n\n            return {\n                psUniform: function() {\n                    return psUniform;\n                },\n                pUniform: function() {\n                    return pUniform;\n                },\n                fillColorUniform: function() {\n                    return fillColorUniform;\n                },\n                setBubbleUniforms: setBubbleUniforms,\n                bind: bind,\n                program: getProgram,\n                create: createShader,\n                setUniform: setUniform,\n                setPMatrix: setPMatrix,\n                setColor: setColor,\n                setPointSize: setPointSize,\n                setSkipTranslation: setSkipTranslation,\n                setTexture: setTexture,\n                setDrawAsCircle: setDrawAsCircle,\n                reset: reset,\n                setInverted: setInverted,\n                destroy: destroy\n            };\n        }\n\n        /* \n         * Vertex Buffer abstraction \n         * A vertex buffer is a set of vertices which are passed to the GPU\n         * in a single call.\n         * @param gl {WebGLContext} - the context in which to create the buffer\n         * @param shader {GLShader} - the shader to use\n         */\n        function GLVertexBuffer(gl, shader, dataComponents /*, type */ ) {\n            var buffer = false,\n                vertAttribute = false,\n                components = dataComponents || 2,\n                preAllocated = false,\n                iterator = 0,\n                data;\n\n            // type = type || 'float';\n\n            function destroy() {\n                if (buffer) {\n                    gl.deleteBuffer(buffer);\n                }\n            }\n\n            /* \n             * Build the buffer \n             * @param dataIn {Array<float>} - a 0 padded array of indices\n             * @param attrib {String} - the name of the Attribute to bind the buffer to\n             * @param dataComponents {Integer} - the number of components per. indice\n             */\n            function build(dataIn, attrib, dataComponents) {\n\n                data = dataIn || [];\n\n                if ((!data || data.length === 0) && !preAllocated) {\n                    //console.error('trying to render empty vbuffer');\n                    buffer = false;\n                    return false;\n                }\n\n                components = dataComponents || components;\n\n                if (buffer) {\n                    gl.deleteBuffer(buffer);\n                }\n\n                buffer = gl.createBuffer();\n                gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n                gl.bufferData(\n                    gl.ARRAY_BUFFER,\n                    preAllocated || new Float32Array(data),\n                    gl.STATIC_DRAW\n                );\n\n                // gl.bindAttribLocation(shader.program(), 0, 'aVertexPosition');\n                vertAttribute = gl.getAttribLocation(shader.program(), attrib);\n                gl.enableVertexAttribArray(vertAttribute);\n\n                return true;\n            }\n\n            /* \n             * Bind the buffer\n             */\n            function bind() {\n                if (!buffer) {\n                    return false;\n                }\n\n                // gl.bindAttribLocation(shader.program(), 0, 'aVertexPosition');\n                //gl.enableVertexAttribArray(vertAttribute);\n                //gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n                gl.vertexAttribPointer(vertAttribute, components, gl.FLOAT, false, 0, 0);\n                //gl.enableVertexAttribArray(vertAttribute);\n            }\n\n            /* \n             * Render the buffer \n             * @param from {Integer} - the start indice\n             * @param to {Integer} - the end indice\n             * @param drawMode {String} - the draw mode\n             */\n            function render(from, to, drawMode) {\n                var length = preAllocated ? preAllocated.length : data.length;\n\n                if (!buffer) {\n                    return false;\n                }\n\n                if (!length) {\n                    return false;\n                }\n\n                if (!from || from > length || from < 0) {\n                    from = 0;\n                }\n\n                if (!to || to > length) {\n                    to = length;\n                }\n\n                drawMode = drawMode || 'points';\n\n                gl.drawArrays(\n                    gl[drawMode.toUpperCase()],\n                    from / components,\n                    (to - from) / components\n                );\n\n                return true;\n            }\n\n            function push(x, y, a, b) {\n                if (preAllocated) { // && iterator <= preAllocated.length - 4) {\t\t\t\n                    preAllocated[++iterator] = x;\n                    preAllocated[++iterator] = y;\n                    preAllocated[++iterator] = a;\n                    preAllocated[++iterator] = b;\n                }\n            }\n\n            /*\n             * Note about pre-allocated buffers:\n             * \t- This is slower for charts with many series\n             */\n            function allocate(size) {\n                size *= 4;\n                iterator = -1;\n\n                //if (!preAllocated || (preAllocated && preAllocated.length !== size)) {\t\t\t\n                preAllocated = new Float32Array(size);\n                //}\n            }\n\n            ////////////////////////////////////////////////////////////////////////////\n            return {\n                destroy: destroy,\n                bind: bind,\n                data: data,\n                build: build,\n                render: render,\n                allocate: allocate,\n                push: push\n            };\n        }\n\n        /* Main renderer. Used to render series.\n         *\tNotes to self:\n         *\t\t- May be able to build a point map by rendering to a separate canvas\n         *\t\t  and encoding values in the color data.\n         *\t\t- Need to figure out a way to transform the data quicker\n         */\n        function GLRenderer(postRenderCallback) {\n            var // Shader\n                shader = false,\n                // Vertex buffers - keyed on shader attribute name\n                vbuffer = false,\n                // Opengl context\n                gl = false,\n                // Width of our viewport in pixels\n                width = 0,\n                // Height of our viewport in pixels\n                height = 0,\n                // The data to render - array of coordinates\n                data = false,\n                // The marker data\n                markerData = false,\n                // Is the texture ready?\n                textureIsReady = false,\n                // Exports\n                exports = {},\n                // Is it inited?\n                isInited = false,\n                // The series stack\n                series = [],\n                // Texture for circles\n                circleTexture = doc.createElement('canvas'),\n                // Context for circle texture\n                circleCtx = circleTexture.getContext('2d'),\n                // Handle for the circle texture\n                circleTextureHandle,\n                // Things to draw as \"rectangles\" (i.e lines)\n                asBar = {\n                    'column': true,\n                    'area': true\n                },\n                asCircle = {\n                    'scatter': true,\n                    'bubble': true\n                },\n                //Render settings\n                settings = {\n                    pointSize: 1,\n                    lineWidth: 3,\n                    fillColor: '#AA00AA',\n                    useAlpha: true,\n                    usePreallocated: false,\n                    useGPUTranslations: false,\n                    timeRendering: false,\n                    timeSeriesProcessing: false,\n                    timeSetup: false\n                };\n\n            ////////////////////////////////////////////////////////////////////////////\n\n            function setOptions(options) {\n                merge(true, settings, options);\n            }\n\n            function seriesPointCount(series) {\n                var isStacked,\n                    xData,\n                    s;\n\n                if (isSeriesBoosting(series)) {\n                    isStacked = !!series.options.stacking;\n                    xData = series.xData || series.options.xData || series.processedXData;\n                    s = (isStacked ? series.data : (xData || series.options.data)).length;\n\n                    if (series.type === 'treemap') {\n                        s *= 12;\n                    } else if (series.type === 'heatmap') {\n                        s *= 6;\n                    } else if (asBar[series.type]) {\n                        s *= 2;\n                    }\n\n                    return s;\n                }\n\n                return 0;\n            }\n\n            /* Allocate a float buffer to fit all series */\n            function allocateBuffer(chart) {\n                var s = 0;\n\n                if (!settings.usePreallocated) {\n                    return;\n                }\n\n                each(chart.series, function(series) {\n                    if (isSeriesBoosting(series)) {\n                        s += seriesPointCount(series);\n                    }\n                });\n\n                vbuffer.allocate(s);\n            }\n\n            function allocateBufferForSingleSeries(series) {\n                var s = 0;\n\n                if (!settings.usePreallocated) {\n                    return;\n                }\n\n                if (isSeriesBoosting(series)) {\n                    s = seriesPointCount(series);\n                }\n\n                vbuffer.allocate(s);\n            }\n\n            /*  \n             * Returns an orthographic perspective matrix\n             * @param {number} width - the width of the viewport in pixels\n             * @param {number} height - the height of the viewport in pixels\n             */\n            function orthoMatrix(width, height) {\n                var near = 0,\n                    far = 1;\n\n                return [\n                    2 / width, 0, 0, 0,\n                    0, -(2 / height), 0, 0,\n                    0, 0, -2 / (far - near), 0, -1, 1, -(far + near) / (far - near), 1\n                ];\n            }\n\n            /*\n             * Clear the depth and color buffer\n             */\n            function clear() {\n                gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n            }\n\n            /*\n             * Get the WebGL context\n             * @returns {WebGLContext} - the context\n             */\n            function getGL() {\n                return gl;\n            }\n\n            /*\n             * Push data for a single series\n             * This calculates additional vertices and transforms the data to be \n             * aligned correctly in memory\n             */\n            function pushSeriesData(series, inst) {\n                var isRange = series.pointArrayMap &&\n                    series.pointArrayMap.join(',') === 'low,high',\n                    chart = series.chart,\n                    options = series.options,\n                    isStacked = !!options.stacking,\n                    rawData = options.data,\n                    xExtremes = series.xAxis.getExtremes(),\n                    xMin = xExtremes.min,\n                    xMax = xExtremes.max,\n                    yExtremes = series.yAxis.getExtremes(),\n                    yMin = yExtremes.min,\n                    yMax = yExtremes.max,\n                    xData = series.xData || options.xData || series.processedXData,\n                    yData = series.yData || options.yData || series.processedYData,\n                    zData = series.zData || options.zData || series.processedZData,\n                    yAxis = series.yAxis,\n                    xAxis = series.xAxis,\n                    useRaw = !xData || xData.length === 0,\n                    // threshold = options.threshold,\n                    // yBottom = chart.yAxis[0].getThreshold(threshold),\n                    // hasThreshold = isNumber(threshold),\n                    // colorByPoint = series.options.colorByPoint,\n                    // This is required for color by point, so make sure this is \n                    // uncommented if enabling that\n                    // colorIndex = 0,\n                    // Required for color axis support\n                    // caxis,\t\t\t\n                    // connectNulls = options.connectNulls,\t\t\t\n                    // For some reason eslint doesn't pick up that this is actually used\n                    maxVal, //eslint-disable-line no-unused-vars\n                    points = series.points || false,\n                    lastX = false,\n                    minVal,\n                    color,\n                    scolor,\n                    sdata = isStacked ? series.data : (xData || rawData),\n                    closestLeft = {\n                        x: Number.MIN_VALUE,\n                        y: 0\n                    },\n                    closestRight = {\n                        x: Number.MIN_VALUE,\n                        y: 0\n                    };\n\n                if (options.boostData && options.boostData.length > 0) {\n                    return;\n                }\n\n                series.closestPointRangePx = Number.MAX_VALUE;\n\n                // Push color to color buffer - need to do this per. vertex\n                function pushColor(color) {\n                    if (color) {\n                        inst.colorData.push(color[0]);\n                        inst.colorData.push(color[1]);\n                        inst.colorData.push(color[2]);\n                        inst.colorData.push(color[3]);\n                    }\n                }\n\n                //Push a vertice to the data buffer\n                function vertice(x, y, checkTreshold, pointSize, color) {\n                    pushColor(color);\n                    if (settings.usePreallocated) {\n                        vbuffer.push(x, y, checkTreshold ? 1 : 0, pointSize || 1);\n                    } else {\n                        data.push(x);\n                        data.push(y);\n                        data.push(checkTreshold ? 1 : 0);\n                        data.push(pointSize || 1);\n                    }\n                }\n\n                // Push a rectangle to the data buffer\n                function pushRect(x, y, w, h, color) {\n                    pushColor(color);\n                    vertice(x + w, y);\n                    pushColor(color);\n                    vertice(x, y);\n                    pushColor(color);\n                    vertice(x, y + h);\n\n                    pushColor(color);\n                    vertice(x, y + h);\n                    pushColor(color);\n                    vertice(x + w, y + h);\n                    pushColor(color);\n                    vertice(x + w, y);\n                }\n\n                // Special case for point shapes\n                if (points && points.length > 0) {\n\n                    // If we're doing points, we assume that the points are already\n                    // translated, so we skip the shader translation.\n                    inst.skipTranslation = true;\n                    // Force triangle draw mode\n                    inst.drawMode = 'triangles';\n\n                    // We don't have a z component in the shader, so we need to sort.\n                    if (points[0].node && points[0].node.levelDynamic) {\n                        points.sort(function(a, b) {\n                            if (a.node) {\n                                if (a.node.levelDynamic > b.node.levelDynamic) {\n                                    return 1;\n                                } else if (a.node.levelDynamic < b.node.levelDynamic) {\n                                    return -1;\n                                }\n                            }\n                            return 0;\n                        });\n                    }\n\n                    each(points, function(point) {\n                        var plotY = point.plotY,\n                            shapeArgs,\n                            swidth,\n                            pointAttr;\n\n                        if (plotY !== undefined && !isNaN(plotY) && point.y !== null) {\n                            shapeArgs = point.shapeArgs;\n\n\n                            pointAttr = point.series.colorAttribs(point);\n\n                            swidth = pointAttr['stroke-width'] || 0;\n\n                            // Handle point colors\n                            color = H.color(pointAttr.fill).rgba;\n                            color[0] /= 255.0;\n                            color[1] /= 255.0;\n                            color[2] /= 255.0;\n\n                            // So there are two ways of doing this. Either we can\n                            // create a rectangle of two triangles, or we can do a \n                            // point and use point size. Latter is faster, but \n                            // only supports squares. So we're doing triangles.\n                            // We could also use one color per. vertice to get \n                            // better color interpolation.\n\n                            // If there's stroking, we do an additional rect\n                            //if (pointAttr.stroke !== 'none' && swidth && swidth > 0) {\n                            if (series.type === 'treemap') {\n                                swidth = swidth || 1;\n                                scolor = H.color(pointAttr.stroke).rgba;\n\n                                scolor[0] /= 255.0;\n                                scolor[1] /= 255.0;\n                                scolor[2] /= 255.0;\n\n                                pushRect(\n                                    shapeArgs.x,\n                                    shapeArgs.y,\n                                    shapeArgs.width,\n                                    shapeArgs.height,\n                                    scolor\n                                );\n\n                                swidth /= 2;\n                            }\n                            // } else {\n                            // \tswidth = 0;\n                            // }\n\n                            pushRect(\n                                shapeArgs.x + swidth,\n                                shapeArgs.y + swidth,\n                                shapeArgs.width - (swidth * 2),\n                                shapeArgs.height - (swidth * 2),\n                                color\n                            );\n                        }\n                    });\n\n                    return;\n                }\n\n                // Extract color axis\n                // each(chart.axes || [], function (a) {\n                // \tif (H.ColorAxis && a instanceof H.ColorAxis) {\n                // \t\tcaxis = a;\n                // \t}\n                // });\t\n\n                each(sdata, function(d, i) {\n                    var x,\n                        y,\n                        z,\n                        px = false,\n                        nx = false,\n                        // This is in fact used.\n                        low, //eslint-disable-line no-unused-vars\n                        chartDestroyed = typeof chart.index === 'undefined',\n                        nextInside = false,\n                        prevInside = false,\n                        pcolor = false,\n                        drawAsBar = asBar[series.type],\n                        isXInside = false,\n                        isYInside = true;\n\n                    if (chartDestroyed) {\n                        return false;\n                    }\n\n                    // Uncomment this to enable color by point.\n                    // This currently left disabled as the charts look really ugly\n                    // when enabled and there's a lot of points.\n                    // Leaving in for the future (tm).\n                    // if (colorByPoint) {\n                    // \tcolorIndex = ++colorIndex % series.chart.options.colors.length;\n                    // \tpcolor = toRGBAFast(series.chart.options.colors[colorIndex]);\n                    // \tpcolor[0] /= 255.0;\n                    // \tpcolor[1] /= 255.0;\n                    // \tpcolor[2] /= 255.0;\n                    // }\n\n                    if (useRaw) {\n                        x = d[0];\n                        y = d[1];\n\n                        if (sdata[i + 1]) {\n                            nx = sdata[i + 1][0];\n                        }\n\n                        if (sdata[i - 1]) {\n                            px = sdata[i - 1][0];\n                        }\n\n                        if (d.length >= 3) {\n                            z = d[2];\n\n                            if (d[2] > inst.zMax) {\n                                inst.zMax = d[2];\n                            }\n\n                            if (d[2] < inst.zMin) {\n                                inst.zMin = d[2];\n                            }\n                        }\n\n                    } else {\n                        x = d;\n                        y = yData[i];\n\n                        if (sdata[i + 1]) {\n                            nx = sdata[i + 1];\n                        }\n\n                        if (sdata[i - 1]) {\n                            px = sdata[i - 1];\n                        }\n\n                        if (zData && zData.length) {\n                            z = zData[i];\n\n                            if (zData[i] > inst.zMax) {\n                                inst.zMax = zData[i];\n                            }\n\n                            if (zData[i] < inst.zMin) {\n                                inst.zMin = zData[i];\n                            }\n                        }\n                    }\n\n                    if (nx && nx >= xMin && nx <= xMax) {\n                        nextInside = true;\n                    }\n\n                    if (px && px >= xMin && px <= xMax) {\n                        prevInside = true;\n                    }\n\n                    if (isRange) {\n                        if (useRaw) {\n                            y = d.slice(1, 3);\n                        }\n\n                        low = y[0];\n                        y = y[1];\n\n                    } else if (isStacked) {\n                        x = d.x;\n                        y = d.stackY;\n                        low = y - d.y;\n                    }\n\n                    if (!series.requireSorting) {\n                        isYInside = y >= yMin && y <= yMax;\n                    }\n\n                    if (x > xMax && closestRight.x < xMax) {\n                        closestRight.x = x;\n                        closestRight.y = y;\n                    }\n\n                    if (x < xMin && closestLeft.x < xMin) {\n                        closestLeft.x = x;\n                        closestLeft.y = y;\n                    }\n\n                    if (y !== 0 && (!y || !isYInside)) {\n                        return;\n                    }\n\n                    if (x >= xMin && x <= xMax) {\n                        isXInside = true;\n                    }\n\n                    if (!isXInside && !nextInside && !prevInside) {\n                        return;\n                    }\n\n                    // Skip translations - temporary floating point fix\n                    if (!settings.useGPUTranslations) {\n                        inst.skipTranslation = true;\n                        x = xAxis.toPixels(x, true);\n                        y = yAxis.toPixels(y, true);\n                    }\n\n                    if (drawAsBar) {\n\n                        maxVal = y;\n                        minVal = 0;\n\n                        if (y < 0) {\n                            minVal = y;\n                            y = 0;\n                        }\n\n                        if (!settings.useGPUTranslations) {\n                            minVal = yAxis.toPixels(minVal, true);\n                        }\n\n                        // Need to add an extra point here\n                        vertice(x, minVal, 0, 0, pcolor);\n                    }\n\n                    // No markers on out of bounds things.\n                    // Out of bound things are shown if and only if the next\n                    // or previous point is inside the rect.\n                    if (inst.hasMarkers) { // && isXInside) {\n                        // x = H.correctFloat(\n                        // \tMath.min(Math.max(-1e5, xAxis.translate(\n                        // \t\tx,\n                        // \t\t0,\n                        // \t\t0,\n                        // \t\t0,\n                        // \t\t1,\n                        // \t\t0.5,\n                        // \t\tfalse\n                        // \t)), 1e5)\n                        // );\n\n                        if (lastX !== false) {\n                            series.closestPointRangePx = Math.min(\n                                series.closestPointRangePx,\n                                Math.abs(x - lastX)\n                            );\n                        }\n                    }\n\n                    vertice(\n                        x,\n                        y,\n                        0,\n                        series.type === 'bubble' ? (z || 1) : 2,\n                        pcolor\n                    );\n\n                    // Uncomment this to support color axis.\n                    // if (caxis) {\t\t\t\t\n                    // \tcolor = H.color(caxis.toColor(y)).rgba;\n\n                    // \tinst.colorData.push(color[0] / 255.0);\n                    // \tinst.colorData.push(color[1] / 255.0);\n                    // \tinst.colorData.push(color[2] / 255.0);\n                    // \tinst.colorData.push(color[3]);\n                    // }\n\n                    lastX = x;\n\n                    //return true;\n                });\n\n                function pushSupplementPoint(point) {\n                    if (!settings.useGPUTranslations) {\n                        inst.skipTranslation = true;\n                        point.x = xAxis.toPixels(point.x, true);\n                        point.y = yAxis.toPixels(point.y, true);\n                    }\n\n                    // We should only do this for lines, and we should ignore markers\n                    // since there's no point here that would have a marker.\n\n                    vertice(\n                        point.x,\n                        point.y,\n                        0,\n                        2\n                    );\n                }\n\n                if (!lastX) {\n                    // There are no points within the selected range\n                    pushSupplementPoint(closestLeft);\n                    pushSupplementPoint(closestRight);\n                }\n            }\n\n            /*\n             * Push a series to the renderer\n             * If we render the series immediatly, we don't have to loop later\n             * @param s {Highchart.Series} - the series to push\n             */\n            function pushSeries(s) {\n                if (series.length > 0) {\n                    series[series.length - 1].to = data.length;\n                    if (series[series.length - 1].hasMarkers) {\n                        series[series.length - 1].markerTo = markerData.length;\n                    }\n                }\n\n                if (settings.timeSeriesProcessing) {\n                    console.time('building ' + s.type + ' series'); //eslint-disable-line no-console\t\t \t\n                }\n\n                series.push({\n                    from: data.length,\n                    markerFrom: markerData.length,\n                    // Push RGBA values to this array to use per. point coloring.\n                    // It should be 0-padded, so each component should be pushed in\n                    // succession.\n                    colorData: [],\n                    series: s,\n                    zMin: Number.MAX_VALUE,\n                    zMax: -Number.MAX_VALUE,\n                    hasMarkers: s.options.marker ? s.options.marker.enabled !== false : false,\n                    showMarksers: true,\n                    drawMode: ({\n                        'area': 'lines',\n                        'arearange': 'lines',\n                        'areaspline': 'line_strip',\n                        'column': 'lines',\n                        'line': 'line_strip',\n                        'scatter': 'points',\n                        'heatmap': 'triangles',\n                        'treemap': 'triangles',\n                        'bubble': 'points'\n                    })[s.type] || 'line_strip'\n                });\n\n                // Add the series data to our buffer(s)\n                pushSeriesData(s, series[series.length - 1]);\n\n                if (settings.timeSeriesProcessing) {\n                    console.timeEnd('building ' + s.type + ' series'); //eslint-disable-line no-console\t\t\n                }\n            }\n\n            /*\n             * Flush the renderer.\n             * This removes pushed series and vertices.\n             * Should be called after clearing and before rendering\n             */\n            function flush() {\n                series = [];\n                exports.data = data = [];\n                markerData = [];\n            }\n\n            /*\n             * Pass x-axis to shader\n             * @param axis {Highcharts.Axis} - the x-axis\n             */\n            function setXAxis(axis) {\n                if (!shader) {\n                    return;\n                }\n\n                shader.setUniform('xAxisTrans', axis.transA);\n                shader.setUniform('xAxisMin', axis.min);\n                shader.setUniform('xAxisMinPad', axis.minPixelPadding);\n                shader.setUniform('xAxisPointRange', axis.pointRange);\n                shader.setUniform('xAxisLen', axis.len);\n                shader.setUniform('xAxisPos', axis.pos);\n                shader.setUniform('xAxisCVSCoord', !axis.horiz);\n            }\n\n            /*\n             * Pass y-axis to shader\n             * @param axis {Highcharts.Axis} - the y-axis\n             */\n            function setYAxis(axis) {\n                if (!shader) {\n                    return;\n                }\n\n                shader.setUniform('yAxisTrans', axis.transA);\n                shader.setUniform('yAxisMin', axis.min);\n                shader.setUniform('yAxisMinPad', axis.minPixelPadding);\n                shader.setUniform('yAxisPointRange', axis.pointRange);\n                shader.setUniform('yAxisLen', axis.len);\n                shader.setUniform('yAxisPos', axis.pos);\n                shader.setUniform('yAxisCVSCoord', !axis.horiz);\n            }\n\n            /* \n             * Set the translation threshold\n             * @param has {boolean} - has threshold flag\n             * @param translation {Float} - the threshold\n             */\n            function setThreshold(has, translation) {\n                shader.setUniform('hasThreshold', has);\n                shader.setUniform('translatedThreshold', translation);\n            }\n\n            /* \n             * Render the data \n             * This renders all pushed series.\n             */\n            function render(chart) {\n\n                if (chart) {\n                    if (!chart.chartHeight || !chart.chartWidth) {\n                        //chart.setChartSize();\n                    }\n\n                    width = chart.chartWidth || 800;\n                    height = chart.chartHeight || 400;\n                } else {\n                    return false;\n                }\n\n                if (!gl || !width || !height) {\n                    return false;\n                }\n\n                if (settings.timeRendering) {\n                    console.time('gl rendering'); //eslint-disable-line no-console\n                }\n\n                shader.bind();\n\n                gl.viewport(0, 0, width, height);\n                shader.setPMatrix(orthoMatrix(width, height));\n\n                if (settings.lineWidth > 1 && !H.isMS) {\n                    gl.lineWidth(settings.lineWidth);\n                }\n\n                vbuffer.build(exports.data, 'aVertexPosition', 4);\n                vbuffer.bind();\n\n                if (textureIsReady) {\n                    gl.bindTexture(gl.TEXTURE_2D, circleTextureHandle);\n                    shader.setTexture(circleTextureHandle);\n                }\n\n                shader.setInverted(chart.options.chart ? chart.options.chart.inverted : false);\n\n                // Render the series\n                each(series, function(s, si) {\n                    var options = s.series.options,\n                        threshold = options.threshold,\n                        hasThreshold = isNumber(threshold),\n                        yBottom = s.series.yAxis.getThreshold(threshold),\n                        translatedThreshold = yBottom,\n                        cbuffer,\n                        showMarkers = pick(\n                            options.marker ? options.marker.enabled : null,\n                            s.series.xAxis.isRadial ? true : null,\n                            s.series.closestPointRangePx >\n                            2 * ((\n                                options.marker ?\n                                options.marker.radius :\n                                10\n                            ) || 10)\n                        ),\n                        fillColor = s.series.fillOpacity ?\n                        new Color(s.series.color).setOpacity(\n                            pick(options.fillOpacity, 0.85)\n                        ).get() :\n                        s.series.color,\n                        color;\n\n                    vbuffer.bind();\n\n                    if (options.colorByPoint) {\n                        fillColor = s.series.chart.options.colors[si];\n                    }\n\n                    color = H.color(fillColor).rgba;\n\n                    if (!settings.useAlpha) {\n                        color[3] = 1.0;\n                    }\n\n                    //Blending\n                    if (options.boostBlending === 'add') {\n                        gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n                        gl.blendEquation(gl.FUNC_ADD);\n\n                    } else if (options.boostBlending === 'mult') {\n                        gl.blendFunc(gl.DST_COLOR, gl.ZERO);\n\n                    } else if (options.boostBlending === 'darken') {\n                        gl.blendFunc(gl.ONE, gl.ONE);\n                        gl.blendEquation(gl.FUNC_MIN);\n\n                    } else {\n                        //gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);//, gl.ONE, gl.ZERO);\n                        //gl.blendEquation(gl.FUNC_ADD);\n                        gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n                    }\n\n                    shader.reset();\n\n                    // If there are entries in the colorData buffer, build and bind it.\n                    if (s.colorData.length > 0) {\n                        shader.setUniform('hasColor', 1.0);\n                        cbuffer = GLVertexBuffer(gl, shader); //eslint-disable-line new-cap\n                        cbuffer.build(s.colorData, 'aColor', 4);\n                        cbuffer.bind();\n                    }\n\n                    // Set series specific uniforms\n                    shader.setColor(color);\n                    setXAxis(s.series.xAxis);\n                    setYAxis(s.series.yAxis);\n                    setThreshold(hasThreshold, translatedThreshold);\n\n                    if (s.drawMode === 'points') {\n                        if (options.marker && options.marker.radius) {\n                            shader.setPointSize(options.marker.radius * 2.0);\n                        } else {\n                            shader.setPointSize(1);\n                        }\n                    }\n\n                    // If set to true, the toPixels translations in the shader\n                    // is skipped, i.e it's assumed that the value is a pixel coord.\n                    shader.setSkipTranslation(s.skipTranslation);\n\n                    if (s.series.type === 'bubble') {\n                        shader.setBubbleUniforms(s.series, s.zMin, s.zMax);\n                    }\n\n                    shader.setDrawAsCircle((asCircle[s.series.type] && textureIsReady) || false);\n\n                    // Do the actual rendering\n                    vbuffer.render(s.from, s.to, s.drawMode);\n\n                    if (s.hasMarkers && showMarkers) {\n                        if (options.marker && options.marker.radius) {\n                            shader.setPointSize(options.marker.radius * 2.0);\n                        } else {\n                            shader.setPointSize(10);\n                        }\n                        shader.setDrawAsCircle(true);\n                        vbuffer.render(s.from, s.to, 'POINTS');\n                    }\n                });\n\n                vbuffer.destroy();\n\n                if (settings.timeRendering) {\n                    console.timeEnd('gl rendering'); //eslint-disable-line no-console\n                }\n\n                flush();\n\n                if (postRenderCallback) {\n                    postRenderCallback();\n                }\n            }\n\n            /* \n             * Render the data when ready\n             */\n            function renderWhenReady(chart) {\n                clear();\n\n                if (chart.renderer.forExport) {\n                    return render(chart);\n                }\n\n                if (isInited) {\n                    render(chart);\n                } else {\n                    setTimeout(function() {\n                        renderWhenReady(chart);\n                    }, 1);\n                }\n            }\n\n            /* \n             * Set the viewport size in pixels\n             * Creates an orthographic perspective matrix and applies it.\n             * @param w {Integer} - the width of the viewport\n             * @param h {Integer} - the height of the viewport\n             */\n            function setSize(w, h) {\n                // Skip if there's no change\n                if (width === w && h === h) {\n                    return;\n                }\n\n                width = w;\n                height = h;\n\n                shader.bind();\n                shader.setPMatrix(orthoMatrix(width, height));\n            }\n\n            /* \n             * Init OpenGL \n             * @param canvas {HTMLCanvas} - the canvas to render to\n             */\n            function init(canvas, noFlush) {\n                var i = 0,\n                    contexts = [\n                        'webgl',\n                        'experimental-webgl',\n                        'moz-webgl',\n                        'webkit-3d'\n                    ];\n\n                isInited = false;\n\n                if (!canvas) {\n                    return false;\n                }\n\n                if (settings.timeSetup) {\n                    console.time('gl setup'); //eslint-disable-line no-console\t\n                }\n\n                for (; i < contexts.length; i++) {\n                    gl = canvas.getContext(contexts[i]);\n                    if (gl) {\n                        break;\n                    }\n                }\n\n                if (gl) {\n                    if (!noFlush) {\n                        flush();\n                    }\n                } else {\n                    return false;\n                }\n\n                gl.enable(gl.BLEND);\n                // gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n                gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n                gl.disable(gl.DEPTH_TEST);\n                gl.depthMask(gl.FALSE);\n\n                shader = GLShader(gl); //eslint-disable-line new-cap\t\n                vbuffer = GLVertexBuffer(gl, shader); //eslint-disable-line new-cap\n\n                textureIsReady = false;\n\n                // Set up the circle texture used for bubbles\n                circleTextureHandle = gl.createTexture();\n\n                // Draw the circle\n                circleTexture.width = 512;\n                circleTexture.height = 512;\n\n                circleCtx.fillStyle = '#FFF';\n                circleCtx.beginPath();\n                circleCtx.arc(256, 256, 256, 0, 2 * Math.PI);\n                circleCtx.fill();\n\n                try {\n\n                    gl.bindTexture(gl.TEXTURE_2D, circleTextureHandle);\n\n                    gl.texImage2D(\n                        gl.TEXTURE_2D,\n                        0,\n                        gl.RGBA,\n                        gl.RGBA,\n                        gl.UNSIGNED_BYTE,\n                        circleTexture\n                    );\n\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n\n                    gl.generateMipmap(gl.TEXTURE_2D);\n\n                    gl.bindTexture(gl.TEXTURE_2D, null);\n\n                    textureIsReady = true;\n                } catch (e) {}\n\n                isInited = true;\n\n                if (settings.timeSetup) {\n                    console.timeEnd('gl setup'); //eslint-disable-line no-console\n                }\n\n                return true;\n            }\n\n            /* \n             * Check if we have a valid OGL context \n             * @returns {Boolean} - true if the context is valid\n             */\n            function valid() {\n                return gl !== false;\n            }\n\n            /*\n             * Check if the renderer has been initialized\n             * @returns {Boolean} - true if it has, false if not\n             */\n            function inited() {\n                return isInited;\n            }\n\n            function destroy() {\n                vbuffer.destroy();\n                shader.destroy();\n                if (gl) {\n                    //gl.deleteTexture(circleTextureHandle);\n                }\n            }\n\n            ////////////////////////////////////////////////////////////////////////////\n            exports = {\n                allocateBufferForSingleSeries: allocateBufferForSingleSeries,\n                pushSeries: pushSeries,\n                setSize: setSize,\n                inited: inited,\n                setThreshold: setThreshold,\n                init: init,\n                render: renderWhenReady,\n                settings: settings,\n                valid: valid,\n                clear: clear,\n                flush: flush,\n                setXAxis: setXAxis,\n                setYAxis: setYAxis,\n                data: data,\n                gl: getGL,\n                allocateBuffer: allocateBuffer,\n                destroy: destroy,\n                setOptions: setOptions\n            };\n\n            return exports;\n        }\n\n        // END OF WEBGL ABSTRACTIONS\n        ////////////////////////////////////////////////////////////////////////////////\n\n        /* \n         * Create a canvas + context and attach it to the target\n         * @param target {Highcharts.Chart|Highcharts.Series} - the canvas target\n         * @param chart {Highcharts.Chart} - the chart\n         */\n        function createAndAttachRenderer(chart, series) {\n            var width = chart.chartWidth,\n                height = chart.chartHeight,\n                target = chart,\n                targetGroup = chart.seriesGroup || series.group,\n                swapXY = function(proceed, x, y, a, b, c, d) {\n                    proceed.call(series, y, x, a, b, c, d);\n                };\n\n            if (isChartSeriesBoosting(chart)) {\n                target = chart;\n            } else {\n                target = series;\n            }\n\n            if (target.ogl) {\n                //target.ogl.destroy();\n            }\n\n            if (!target.image) {\n                target.canvas = doc.createElement('canvas');\n\n                target.image = chart.renderer.image(\n                    '',\n                    0,\n                    0,\n                    width,\n                    height\n                ).add(targetGroup);\n\n                target.boostClipRect = chart.renderer.clipRect(\n                    chart.plotLeft,\n                    chart.plotTop,\n                    chart.plotWidth,\n                    chart.chartHeight\n                );\n\n                target.image.clip(target.boostClipRect);\n\n                if (target.inverted) {\n                    each(['moveTo', 'lineTo', 'rect', 'arc'], function(fn) {\n                        wrap(false, fn, swapXY);\n                    });\n                }\n\n                if (target instanceof H.Chart) {\n                    target.markerGroup = target.renderer.g().add(targetGroup);\n\n                    target.markerGroup.translate(series.xAxis.pos, series.yAxis.pos);\n                }\n            }\n\n            target.canvas.width = width;\n            target.canvas.height = height;\n\n            target.image.attr({\n                x: 0,\n                y: 0,\n                width: width,\n                height: height,\n                style: 'pointer-events: none'\n            });\n\n            target.boostClipRect.attr({\n                x: chart.plotLeft,\n                y: chart.plotTop,\n                width: chart.plotWidth,\n                height: chart.chartHeight\n            });\n\n            if (!target.ogl) {\n\n\n                target.ogl = GLRenderer(function() { // eslint-disable-line new-cap\n                    target.image.attr({\n                        href: target.canvas.toDataURL('image/png')\n                    });\n                }); //eslint-disable-line new-cap\n\n                target.ogl.init(target.canvas);\n                // target.ogl.clear();\n                target.ogl.setOptions(chart.options.boost || {});\n\n                if (target instanceof H.Chart) {\n                    target.ogl.allocateBuffer(chart);\n                }\n            }\n\n            target.ogl.setSize(width, height);\n\n            return target.ogl;\n        }\n\n        /*\n         * Performs the actual render if the renderer is \n         * attached to the series.\n         * @param renderer {OGLRenderer} - the renderer\n         * @param series {Highcharts.Series} - the series\n         */\n        function renderIfNotSeriesBoosting(renderer, series, chart) {\n            if (renderer &&\n                series.image &&\n                series.canvas &&\n                !isChartSeriesBoosting(chart || series.chart)\n            ) {\n                renderer.render(chart || series.chart);\n            }\n        }\n\n        function allocateIfNotSeriesBoosting(renderer, series) {\n            if (renderer &&\n                series.image &&\n                series.canvas &&\n                !isChartSeriesBoosting(series.chart)\n            ) {\n                renderer.allocateBufferForSingleSeries(series);\n            }\n        }\n\n        /*\n         * An \"async\" foreach loop.\n         * Uses a setTimeout to keep the loop from blocking the UI thread\n         * @param arr {Array} - the array to loop through\n         * @param fn {Function} - the callback to call for each item\n         * @param finalFunc {Function} - the callback to call when done\n         * @param chunkSize {Number} - the number of iterations per. timeout\n         * @param i {Number} - the current index\n         * @param noTimeout {Boolean} - set to true to skip timeouts \n         */\n        function eachAsync(arr, fn, finalFunc, chunkSize, i, noTimeout) {\n            i = i || 0;\n            chunkSize = chunkSize || CHUNK_SIZE;\n\n            var threshold = i + chunkSize,\n                proceed = true;\n\n            while (proceed && i < threshold && i < arr.length) {\n                proceed = fn(arr[i], i);\n                ++i;\n            }\n            if (proceed) {\n                if (i < arr.length) {\n\n                    if (noTimeout) {\n                        eachAsync(arr, fn, finalFunc, chunkSize, i, noTimeout);\n                    } else if (win.requestAnimationFrame) {\n                        //If available, do requestAnimationFrame - shaves off a few ms \n                        win.requestAnimationFrame(function() {\n                            eachAsync(arr, fn, finalFunc, chunkSize, i);\n                        });\n                    } else {\n                        setTimeout(function() {\n                            eachAsync(arr, fn, finalFunc, chunkSize, i);\n                        });\n                    }\n\n                } else if (finalFunc) {\n                    finalFunc();\n                }\n            }\n        }\n\n        ////////////////////////////////////////////////////////////////////////////////\n        // Following is the parts of the boost that's common between OGL/Legacy\n\n        /**\n         * Return a full Point object based on the index. \n         * The boost module uses stripped point objects for performance reasons.\n         * @param   {Number} boostPoint A stripped-down point object\n         * @returns {Object} A Point object as per http://api.highcharts.com/highcharts#Point\n         */\n        Series.prototype.getPoint = function(boostPoint) {\n            var point = boostPoint,\n                xData = this.xData || this.options.xData || this.processedXData || false;\n\n            if (boostPoint && !(boostPoint instanceof this.pointClass)) {\n                point = (new this.pointClass()).init( // eslint-disable-line new-cap\n                    this,\n                    this.options.data[boostPoint.i],\n                    xData ? xData[boostPoint.i] : undefined\n                );\n\n                point.category = point.x;\n\n                point.dist = boostPoint.dist;\n                point.distX = boostPoint.distX;\n                point.plotX = boostPoint.plotX;\n                point.plotY = boostPoint.plotY;\n                point.index = boostPoint.i;\n            }\n\n            return point;\n        };\n\n        /**\n         * Return a point instance from the k-d-tree\n         */\n        wrap(Series.prototype, 'searchPoint', function(proceed) {\n            return this.getPoint(\n                proceed.apply(this, [].slice.call(arguments, 1))\n            );\n        });\n\n        /**\n         * Extend series.destroy to also remove the fake k-d-tree points (#5137). \n         * Normally this is handled by Series.destroy that calls Point.destroy, \n         * but the fake search points are not registered like that.\n         */\n        wrap(Series.prototype, 'destroy', function(proceed) {\n            var series = this,\n                chart = series.chart;\n\n            if (chart.markerGroup === series.markerGroup) {\n                series.markerGroup = null;\n            }\n\n            if (chart.hoverPoints) {\n                chart.hoverPoints = grep(chart.hoverPoints, function(point) {\n                    return point.series === series;\n                });\n            }\n\n            if (chart.hoverPoint && chart.hoverPoint.series === series) {\n                chart.hoverPoint = null;\n            }\n\n            proceed.call(this);\n        });\n\n        /**\n         * Do not compute extremes when min and max are set.\n         * If we use this in the core, we can add the hook \n         * to hasExtremes to the methods directly.\n         */\n        wrap(Series.prototype, 'getExtremes', function(proceed) {\n            if (!isSeriesBoosting(this) || (!this.hasExtremes || !this.hasExtremes())) {\n                return proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        // Set default options\n        each([\n                'area',\n                'arearange',\n                'column',\n                'line',\n                'scatter',\n                'heatmap',\n                'bubble',\n                'treemap',\n                'heatmap'\n            ],\n            function(type) {\n                if (plotOptions[type]) {\n                    plotOptions[type].boostThreshold = 5000;\n                    plotOptions[type].boostData = [];\n                }\n            }\n        );\n\n        /**\n         * Override a bunch of methods the same way. If the number of points is \n         * below the threshold, run the original method. If not, check for a \n         * canvas version or do nothing.\n         *\n         * Note that we're not overriding any of these for heatmaps.\n         */\n        each([\n            'translate',\n            'generatePoints',\n            'drawTracker',\n            'drawPoints',\n            'render'\n        ], function(method) {\n            function branch(proceed) {\n                var letItPass = this.options.stacking &&\n                    (method === 'translate' || method === 'generatePoints');\n\n                if (!isSeriesBoosting(this) ||\n                    letItPass ||\n                    this.type === 'heatmap' ||\n                    this.type === 'treemap'\n                ) {\n\n                    // Clear image\n                    if (method === 'render' && this.image && !isChartSeriesBoosting(this.chart)) {\n                        this.image.attr({\n                            href: ''\n                        });\n                        this.animate = null; // We're zooming in, don't run animation\n                    }\n\n                    proceed.call(this);\n\n                    // If a canvas version of the method exists, like renderCanvas(), run\n                } else if (this[method + 'Canvas']) {\n                    this[method + 'Canvas']();\n                }\n            }\n\n            wrap(Series.prototype, method, branch);\n\n            // A special case for some types - their translate method is already wrapped\n            if (method === 'translate') {\n                if (seriesTypes.column) {\n                    wrap(seriesTypes.column.prototype, method, branch);\n                }\n\n                if (seriesTypes.arearange) {\n                    wrap(seriesTypes.arearange.prototype, method, branch);\n                }\n\n                if (seriesTypes.treemap) {\n                    wrap(seriesTypes.treemap.prototype, method, branch);\n                }\n            }\n        });\n\n        /*\n         * Returns true if the current browser supports webgl\n         */\n        function hasWebGLSupport() {\n            var i = 0,\n                canvas,\n                contexts = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'],\n                context = false;\n\n            if (typeof win.WebGLRenderingContext !== 'undefined') {\n                canvas = doc.createElement('canvas');\n\n                for (; i < contexts.length; i++) {\n                    try {\n                        context = canvas.getContext(contexts[i]);\n                        if (typeof context !== 'undefined' && context !== null) {\n                            return true;\n                        }\n                    } catch (e) {\n\n                    }\n                }\n            }\n\n            return false;\n        }\n\n        /* Used for treemap|heatmap.drawPoints */\n        function pointDrawHandler(proceed) {\n            if (!isSeriesBoosting(this)) {\n                return proceed.call(this);\n            }\n\n            //Make sure we have a valid OGL context\n            var renderer = createAndAttachRenderer(this.chart, this);\n\n            if (renderer) {\n                allocateIfNotSeriesBoosting(renderer, this);\n                renderer.pushSeries(this);\n            }\n\n            renderIfNotSeriesBoosting(renderer, this);\n        }\n\n\n\n        ////////////////////////////////////////////////////////////////////////////////\n        // We're wrapped in a closure, so just return if there's no webgl support\n\n        if (!hasWebGLSupport()) {\n            if (typeof H.initCanvasBoost !== 'undefined') {\n                // Fallback to canvas boost\t\t\n                H.initCanvasBoost();\n            } else {\n                H.error(26);\n            }\n        } else {\n\n            ////////////////////////////////////////////////////////////////////////////\n            // GL-SPECIFIC WRAPPINGS FOLLOWS\n\n            /** If the series is a heatmap or treemap, or if the series is not boosting\n             *  do the default behaviour. Otherwise, process if the series has no \n             *  extremes.\n             */\n            wrap(Series.prototype, 'processData', function(proceed) {\n                // If this is a heatmap, do default behaviour\n                if (!isSeriesBoosting(this) ||\n                    this.type === 'heatmap' ||\n                    this.type === 'treemap') {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n\n                if (!this.hasExtremes || !this.hasExtremes(true)) {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n            });\n\n            H.extend(Series.prototype, {\n                pointRange: 0,\n                directTouch: false,\n                allowDG: false, // No data grouping, let boost handle large data \n                hasExtremes: function(checkX) {\n                    var options = this.options,\n                        data = options.data,\n                        xAxis = this.xAxis && this.xAxis.options,\n                        yAxis = this.yAxis && this.yAxis.options;\n\n                    return data.length > (options.boostThreshold || Number.MAX_VALUE) &&\n                        isNumber(yAxis.min) && isNumber(yAxis.max) &&\n                        (!checkX || (isNumber(xAxis.min) && isNumber(xAxis.max)));\n                },\n\n                /**\n                 * If implemented in the core, parts of this can probably be \n                 * shared with other similar methods in Highcharts.\n                 */\n                destroyGraphics: function() {\n                    var series = this,\n                        points = this.points,\n                        point,\n                        i;\n\n                    if (points) {\n                        for (i = 0; i < points.length; i = i + 1) {\n                            point = points[i];\n                            if (point && point.graphic) {\n                                point.graphic = point.graphic.destroy();\n                            }\n                        }\n                    }\n\n                    each(['graph', 'area', 'tracker'], function(prop) {\n                        if (series[prop]) {\n                            series[prop] = series[prop].destroy();\n                        }\n                    });\n                },\n\n                renderCanvas: function() {\n                    var series = this,\n                        options = series.options || {},\n                        renderer = false,\n                        chart = series.chart,\n                        xAxis = this.xAxis,\n                        yAxis = this.yAxis,\n                        //ctx,\n                        //c = 0,\n                        xData = options.xData || series.processedXData,\n                        yData = options.yData || series.processedYData,\n\n                        rawData = options.data,\n                        xExtremes = xAxis.getExtremes(),\n                        xMin = xExtremes.min,\n                        xMax = xExtremes.max,\n                        yExtremes = yAxis.getExtremes(),\n                        yMin = yExtremes.min,\n                        yMax = yExtremes.max,\n                        pointTaken = {},\n                        lastClientX,\n                        sampling = !!series.sampling,\n                        points,\n                        enableMouseTracking = options.enableMouseTracking !== false,\n                        threshold = options.threshold,\n                        yBottom = yAxis.getThreshold(threshold),\n                        isRange = series.pointArrayMap &&\n                        series.pointArrayMap.join(',') === 'low,high',\n                        isStacked = !!options.stacking,\n                        cropStart = series.cropStart || 0,\n                        requireSorting = series.requireSorting,\n                        useRaw = !xData,\n                        minVal,\n                        maxVal,\n                        minI,\n                        maxI,\n\n                        addKDPoint = function(clientX, plotY, i) {\n                            //Shaves off about 60ms compared to repeated concatination\n                            index = clientX + ',' + plotY;\n\n                            // The k-d tree requires series points. \n                            // Reduce the amount of points, since the time to build the \n                            // tree increases exponentially.\n                            if (enableMouseTracking && !pointTaken[index]) {\n                                pointTaken[index] = true;\n\n                                if (chart.inverted) {\n                                    clientX = xAxis.len - clientX;\n                                    plotY = yAxis.len - plotY;\n                                }\n\n                                points.push({\n                                    clientX: clientX,\n                                    plotX: clientX,\n                                    plotY: plotY,\n                                    i: cropStart + i\n                                });\n                            }\n                        };\n\n                    // Get or create the renderer\n                    renderer = createAndAttachRenderer(chart, series);\n\n                    if (!this.visible) {\n                        if (!isChartSeriesBoosting(chart) && renderer) {\n                            renderer.clear();\n                            this.image.attr({\n                                href: ''\n                            });\n                        }\n                        return;\n                    }\n\n                    // If we are zooming out from SVG mode, destroy the graphics\n                    if (this.points || this.graph) {\n                        this.destroyGraphics();\n                    }\n\n                    // If we're rendering per. series we should create the marker groups\n                    // as usual.\n                    if (!isChartSeriesBoosting(chart)) {\n                        this.markerGroup = series.plotGroup(\n                            'markerGroup',\n                            'markers',\n                            true,\n                            1,\n                            chart.seriesGroup\n                        );\n                    } else {\n                        //Use a single group for the markers\n                        this.markerGroup = chart.markerGroup;\n                    }\n\n                    points = this.points = [];\n\n                    // Do not start building while drawing \n                    series.buildKDTree = noop;\n\n                    if (renderer) {\n                        allocateIfNotSeriesBoosting(renderer, this);\n                        renderer.pushSeries(series);\n                        // Perform the actual renderer if we're on series level\n                        renderIfNotSeriesBoosting(renderer, this, chart);\n                        //console.log(series, chart);\n                    }\n\n                    /* This builds the KD-tree */\n                    function processPoint(d, i) {\n                        var x,\n                            y,\n                            clientX,\n                            plotY,\n                            isNull,\n                            low,\n                            chartDestroyed = typeof chart.index === 'undefined',\n                            isYInside = true;\n\n                        if (!chartDestroyed) {\n                            if (useRaw) {\n                                x = d[0];\n                                y = d[1];\n                            } else {\n                                x = d;\n                                y = yData[i];\n                            }\n\n                            // Resolve low and high for range series\n                            if (isRange) {\n                                if (useRaw) {\n                                    y = d.slice(1, 3);\n                                }\n                                low = y[0];\n                                y = y[1];\n                            } else if (isStacked) {\n                                x = d.x;\n                                y = d.stackY;\n                                low = y - d.y;\n                            }\n\n                            isNull = y === null;\n\n                            // Optimize for scatter zooming\n                            if (!requireSorting) {\n                                isYInside = y >= yMin && y <= yMax;\n                            }\n\n                            if (!isNull && x >= xMin && x <= xMax && isYInside) {\n\n                                // We use ceil to allow the KD tree to work with sub\n                                // pixels, which can be used in boost to space pixels\n                                clientX = Math.ceil(xAxis.toPixels(x, true));\n\n                                if (sampling) {\n                                    if (minI === undefined || clientX === lastClientX) {\n                                        if (!isRange) {\n                                            low = y;\n                                        }\n                                        if (maxI === undefined || y > maxVal) {\n                                            maxVal = y;\n                                            maxI = i;\n                                        }\n                                        if (minI === undefined || low < minVal) {\n                                            minVal = low;\n                                            minI = i;\n                                        }\n\n                                    }\n                                    if (clientX !== lastClientX) { // Add points and reset\n                                        if (minI !== undefined) { // then maxI is also a number\n                                            plotY = yAxis.toPixels(maxVal, true);\n                                            yBottom = yAxis.toPixels(minVal, true);\n\n                                            addKDPoint(clientX, plotY, maxI);\n                                            if (yBottom !== plotY) {\n                                                addKDPoint(clientX, yBottom, minI);\n                                            }\n                                        }\n\n                                        minI = maxI = undefined;\n                                        lastClientX = clientX;\n                                    }\n                                } else {\n                                    plotY = Math.ceil(yAxis.toPixels(y, true));\n                                    addKDPoint(clientX, plotY, i);\n                                }\n                            }\n                        }\n\n                        return !chartDestroyed;\n                    }\n\n                    function doneProcessing() {\n                        fireEvent(series, 'renderedCanvas');\n                        // Pass tests in Pointer. \n                        // Replace this with a single property, and replace when zooming\n                        // in below boostThreshold.\n                        series.directTouch = false;\n                        series.options.stickyTracking = true;\n\n                        // Go back to prototype, ready to build\n                        delete series.buildKDTree;\n                        series.buildKDTree();\n                    }\n\n                    // Loop over the points to build the k-d tree\n                    eachAsync(\n                        isStacked ? series.data : (xData || rawData),\n                        processPoint,\n                        doneProcessing,\n                        chart.renderer.forExport ? Number.MAX_VALUE : undefined\n                    );\n                }\n            });\n\n            /*\n             * We need to handle heatmaps separatly, since we can't perform the\n             * size/color calculations in the shader easily.\n             *\n             * This likely needs future optimization.\n             *\n             */\n            each(['heatmap', 'treemap'],\n                function(t) {\n                    if (seriesTypes[t]) {\n                        wrap(seriesTypes[t].prototype, 'drawPoints', pointDrawHandler);\n                        seriesTypes[t].prototype.directTouch = false; // Use k-d-tree\n                    }\n                }\n            );\n\n            if (seriesTypes.bubble) {\n                // By default, the bubble series does not use the KD-tree, so force it\n                // to.\n                delete seriesTypes.bubble.prototype.buildKDTree;\n                seriesTypes.bubble.prototype.directTouch = false;\n\n                // Needed for markers to work correctly\n                wrap(\n                    seriesTypes.bubble.prototype,\n                    'markerAttribs',\n                    function(proceed) {\n                        if (isSeriesBoosting(this)) {\n                            return false;\n                        }\n                        return proceed.apply(this, [].slice.call(arguments, 1));\n                    }\n                );\n            }\n\n            seriesTypes.scatter.prototype.fill = true;\n\n            extend(seriesTypes.area.prototype, {\n                fill: true,\n                fillOpacity: true,\n                sampling: true\n            });\n\n            extend(seriesTypes.column.prototype, {\n                fill: true,\n                sampling: true\n            });\n\n            wrap(Series.prototype, 'setVisible', function(proceed, vis) {\n                proceed.call(this, vis, false);\n                if (this.visible === false && this.ogl && this.canvas && this.image) {\n                    this.ogl.clear();\n                    this.image.attr({\n                        href: ''\n                    });\n                } else {\n                    this.chart.redraw();\n                }\n            });\n\n            /**\n             * Take care of the canvas blitting\n             */\n            H.Chart.prototype.callbacks.push(function(chart) {\n\n                /* Convert chart-level canvas to image */\n                function canvasToSVG() {\n                    if (chart.ogl && isChartSeriesBoosting(chart)) {\n                        chart.ogl.render(chart);\n                    }\n                }\n\n                /* Clear chart-level canvas */\n                function preRender() {\n\n                    if (!isChartSeriesBoosting(chart) && chart.didBoost) {\n                        chart.didBoost = false;\n                        // Clear the canvas\n                        if (chart.image) {\n                            chart.image.attr({\n                                href: ''\n                            });\n                        }\n                    }\n\n                    if (chart.canvas && chart.ogl && isChartSeriesBoosting(chart)) {\n                        chart.didBoost = true;\n\n                        // Allocate\n                        chart.ogl.allocateBuffer(chart);\n                    }\n\n                    //see #6518 + #6739\n                    if (chart.markerGroup && chart.xAxis && chart.xAxis.length > 0 && chart.yAxis && chart.yAxis.length > 0) {\n                        chart.markerGroup.translate(\n                            chart.xAxis[0].pos,\n                            chart.yAxis[0].pos\n                        );\n                    }\n\n                }\n\n                addEvent(chart, 'predraw', preRender);\n                addEvent(chart, 'render', canvasToSVG);\n            });\n        } // if hasCanvasSupport\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/broken-axis.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(h){\"object\"===typeof module&&module.exports?module.exports=h:h(Highcharts)})(function(h){(function(f){function h(){return Array.prototype.slice.call(arguments,1)}function u(b){b.apply(this);this.drawBreaks(this.xAxis,[\"x\"]);this.drawBreaks(this.yAxis,r(this.pointArrayMap,[\"y\"]))}var r=f.pick,g=f.wrap,q=f.each,y=f.extend,z=f.isArray,v=f.fireEvent,t=f.Axis,A=f.Series;y(t.prototype,{isInBreak:function(b,e){var c=b.repeat||Infinity,a=b.from,d=b.to-b.from;e=e>=a?(e-a)%c:c-(a-e)%c;return b.inclusive?\ne<=d:e<d&&0!==e},isInAnyBreak:function(b,e){var c=this.options.breaks,a=c&&c.length,d,n,w;if(a){for(;a--;)this.isInBreak(c[a],b)&&(d=!0,n||(n=r(c[a].showPoints,this.isXAxis?!1:!0)));w=d&&e?d&&!n:d}return w}});g(t.prototype,\"setTickPositions\",function(b){b.apply(this,Array.prototype.slice.call(arguments,1));if(this.options.breaks){var e=this.tickPositions,c=this.tickPositions.info,a=[],d;for(d=0;d<e.length;d++)this.isInAnyBreak(e[d])||a.push(e[d]);this.tickPositions=a;this.tickPositions.info=c}});\ng(t.prototype,\"init\",function(b,e,c){var a=this;c.breaks&&c.breaks.length&&(c.ordinal=!1);b.call(this,e,c);b=this.options.breaks;a.isBroken=z(b)&&!!b.length;a.isBroken&&(a.val2lin=function(d){var n=d,b,c;for(c=0;c<a.breakArray.length;c++)if(b=a.breakArray[c],b.to<=d)n-=b.len;else if(b.from>=d)break;else if(a.isInBreak(b,d)){n-=d-b.from;break}return n},a.lin2val=function(d){var b,c;for(c=0;c<a.breakArray.length&&!(b=a.breakArray[c],b.from>=d);c++)b.to<d?d+=b.len:a.isInBreak(b,d)&&(d+=b.len);return d},\na.setExtremes=function(a,b,c,e,f){for(;this.isInAnyBreak(a);)a-=this.closestPointRange;for(;this.isInAnyBreak(b);)b-=this.closestPointRange;t.prototype.setExtremes.call(this,a,b,c,e,f)},a.setAxisTranslation=function(b){t.prototype.setAxisTranslation.call(this,b);b=a.options.breaks;var c=[],d=[],e=0,f,l,m=a.userMin||a.min,p=a.userMax||a.max,h=r(a.pointRangePadding,0),k,g;q(b,function(b){l=b.repeat||Infinity;a.isInBreak(b,m)&&(m+=b.to%l-m%l);a.isInBreak(b,p)&&(p-=p%l-b.from%l)});q(b,function(a){k=a.from;\nfor(l=a.repeat||Infinity;k-l>m;)k-=l;for(;k<m;)k+=l;for(g=k;g<p;g+=l)c.push({value:g,move:\"in\"}),c.push({value:g+(a.to-a.from),move:\"out\",size:a.breakSize})});c.sort(function(a,b){return a.value===b.value?(\"in\"===a.move?0:1)-(\"in\"===b.move?0:1):a.value-b.value});f=0;k=m;q(c,function(a){f+=\"in\"===a.move?1:-1;1===f&&\"in\"===a.move&&(k=a.value);0===f&&(d.push({from:k,to:a.value,len:a.value-k-(a.size||0)}),e+=a.value-k-(a.size||0))});a.breakArray=d;a.unitLength=p-m-e+h;v(a,\"afterBreaks\");a.options.staticScale?\na.transA=a.options.staticScale:a.unitLength&&(a.transA*=(p-a.min+h)/a.unitLength);h&&(a.minPixelPadding=a.transA*a.minPointOffset);a.min=m;a.max=p})});g(A.prototype,\"generatePoints\",function(b){b.apply(this,h(arguments));var e=this.xAxis,c=this.yAxis,a=this.points,d,f=a.length,g=this.options.connectNulls,x;if(e&&c&&(e.options.breaks||c.options.breaks))for(;f--;)d=a[f],x=null===d.y&&!1===g,x||!e.isInAnyBreak(d.x,!0)&&!c.isInAnyBreak(d.y,!0)||(a.splice(f,1),this.data[f]&&this.data[f].destroyElements())});\nf.Series.prototype.drawBreaks=function(b,e){var c=this,a=c.points,d,f,g,h;b&&q(e,function(e){d=b.breakArray||[];f=b.isXAxis?b.min:r(c.options.threshold,b.min);q(a,function(a){h=r(a[\"stack\"+e.toUpperCase()],a[e]);q(d,function(c){g=!1;if(f<c.from&&h>c.to||f>c.from&&h<c.from)g=\"pointBreak\";else if(f<c.from&&h>c.from&&h<c.to||f>c.from&&h>c.to&&h<c.from)g=\"pointInBreak\";g&&v(b,g,{point:a,brk:c})})})})};f.Series.prototype.gappedPath=function(){var b=this.options.gapSize,e=this.points.slice(),c=e.length-\n1;if(b&&0<c)for(;c--;)e[c+1].x-e[c].x>this.closestPointRange*b&&e.splice(c+1,0,{isNull:!0});return this.getGraphPath(e)};g(f.seriesTypes.column.prototype,\"drawPoints\",u);g(f.Series.prototype,\"drawPoints\",u)})(h)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/broken-axis.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var pick = H.pick,\n            wrap = H.wrap,\n            each = H.each,\n            extend = H.extend,\n            isArray = H.isArray,\n            fireEvent = H.fireEvent,\n            Axis = H.Axis,\n            Series = H.Series;\n\n        function stripArguments() {\n            return Array.prototype.slice.call(arguments, 1);\n        }\n\n        extend(Axis.prototype, {\n            isInBreak: function(brk, val) {\n                var ret,\n                    repeat = brk.repeat || Infinity,\n                    from = brk.from,\n                    length = brk.to - brk.from,\n                    test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));\n\n                if (!brk.inclusive) {\n                    ret = test < length && test !== 0;\n                } else {\n                    ret = test <= length;\n                }\n                return ret;\n            },\n\n            isInAnyBreak: function(val, testKeep) {\n\n                var breaks = this.options.breaks,\n                    i = breaks && breaks.length,\n                    inbrk,\n                    keep,\n                    ret;\n\n\n                if (i) {\n\n                    while (i--) {\n                        if (this.isInBreak(breaks[i], val)) {\n                            inbrk = true;\n                            if (!keep) {\n                                keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);\n                            }\n                        }\n                    }\n\n                    if (inbrk && testKeep) {\n                        ret = inbrk && !keep;\n                    } else {\n                        ret = inbrk;\n                    }\n                }\n                return ret;\n            }\n        });\n\n        wrap(Axis.prototype, 'setTickPositions', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n            if (this.options.breaks) {\n                var axis = this,\n                    tickPositions = this.tickPositions,\n                    info = this.tickPositions.info,\n                    newPositions = [],\n                    i;\n\n                for (i = 0; i < tickPositions.length; i++) {\n                    if (!axis.isInAnyBreak(tickPositions[i])) {\n                        newPositions.push(tickPositions[i]);\n                    }\n                }\n\n                this.tickPositions = newPositions;\n                this.tickPositions.info = info;\n            }\n        });\n\n        wrap(Axis.prototype, 'init', function(proceed, chart, userOptions) {\n            var axis = this,\n                breaks;\n            // Force Axis to be not-ordinal when breaks are defined\n            if (userOptions.breaks && userOptions.breaks.length) {\n                userOptions.ordinal = false;\n            }\n            proceed.call(this, chart, userOptions);\n            breaks = this.options.breaks;\n            axis.isBroken = (isArray(breaks) && !!breaks.length);\n            if (axis.isBroken) {\n                axis.val2lin = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.to <= val) {\n                            nval -= brk.len;\n                        } else if (brk.from >= val) {\n                            break;\n                        } else if (axis.isInBreak(brk, val)) {\n                            nval -= (val - brk.from);\n                            break;\n                        }\n                    }\n\n                    return nval;\n                };\n\n                axis.lin2val = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.from >= nval) {\n                            break;\n                        } else if (brk.to < nval) {\n                            nval += brk.len;\n                        } else if (axis.isInBreak(brk, nval)) {\n                            nval += brk.len;\n                        }\n                    }\n                    return nval;\n                };\n\n                axis.setExtremes = function(newMin, newMax, redraw, animation, eventArguments) {\n                    // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )\n                    while (this.isInAnyBreak(newMin)) {\n                        newMin -= this.closestPointRange;\n                    }\n                    while (this.isInAnyBreak(newMax)) {\n                        newMax -= this.closestPointRange;\n                    }\n                    Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);\n                };\n\n                axis.setAxisTranslation = function(saveOld) {\n                    Axis.prototype.setAxisTranslation.call(this, saveOld);\n\n                    var breaks = axis.options.breaks,\n                        breakArrayT = [], // Temporary one\n                        breakArray = [],\n                        length = 0,\n                        inBrk,\n                        repeat,\n                        min = axis.userMin || axis.min,\n                        max = axis.userMax || axis.max,\n                        pointRangePadding = pick(axis.pointRangePadding, 0),\n                        start,\n                        i;\n\n                    // Min & max check (#4247)\n                    each(breaks, function(brk) {\n                        repeat = brk.repeat || Infinity;\n                        if (axis.isInBreak(brk, min)) {\n                            min += (brk.to % repeat) - (min % repeat);\n                        }\n                        if (axis.isInBreak(brk, max)) {\n                            max -= (max % repeat) - (brk.from % repeat);\n                        }\n                    });\n\n                    // Construct an array holding all breaks in the axis\n                    each(breaks, function(brk) {\n                        start = brk.from;\n                        repeat = brk.repeat || Infinity;\n\n                        while (start - repeat > min) {\n                            start -= repeat;\n                        }\n                        while (start < min) {\n                            start += repeat;\n                        }\n\n                        for (i = start; i < max; i += repeat) {\n                            breakArrayT.push({\n                                value: i,\n                                move: 'in'\n                            });\n                            breakArrayT.push({\n                                value: i + (brk.to - brk.from),\n                                move: 'out',\n                                size: brk.breakSize\n                            });\n                        }\n                    });\n\n                    breakArrayT.sort(function(a, b) {\n                        var ret;\n                        if (a.value === b.value) {\n                            ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);\n                        } else {\n                            ret = a.value - b.value;\n                        }\n                        return ret;\n                    });\n\n                    // Simplify the breaks\n                    inBrk = 0;\n                    start = min;\n\n                    each(breakArrayT, function(brk) {\n                        inBrk += (brk.move === 'in' ? 1 : -1);\n\n                        if (inBrk === 1 && brk.move === 'in') {\n                            start = brk.value;\n                        }\n                        if (inBrk === 0) {\n                            breakArray.push({\n                                from: start,\n                                to: brk.value,\n                                len: brk.value - start - (brk.size || 0)\n                            });\n                            length += brk.value - start - (brk.size || 0);\n                        }\n                    });\n\n                    axis.breakArray = breakArray;\n\n                    // Used with staticScale, and below, the actual axis length when\n                    // breaks are substracted.\n                    axis.unitLength = max - min - length + pointRangePadding;\n\n                    fireEvent(axis, 'afterBreaks');\n\n                    if (axis.options.staticScale) {\n                        axis.transA = axis.options.staticScale;\n                    } else if (axis.unitLength) {\n                        axis.transA *= (max - axis.min + pointRangePadding) /\n                            axis.unitLength;\n                    }\n\n                    if (pointRangePadding) {\n                        axis.minPixelPadding = axis.transA * axis.minPointOffset;\n                    }\n\n                    axis.min = min;\n                    axis.max = max;\n                };\n            }\n        });\n\n        wrap(Series.prototype, 'generatePoints', function(proceed) {\n\n            proceed.apply(this, stripArguments(arguments));\n\n            var series = this,\n                xAxis = series.xAxis,\n                yAxis = series.yAxis,\n                points = series.points,\n                point,\n                i = points.length,\n                connectNulls = series.options.connectNulls,\n                nullGap;\n\n\n            if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {\n                while (i--) {\n                    point = points[i];\n\n                    nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)\n                    if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {\n                        points.splice(i, 1);\n                        if (this.data[i]) {\n                            this.data[i].destroyElements(); // removes the graphics for this point if they exist\n                        }\n                    }\n                }\n            }\n\n        });\n\n        function drawPointsWrapped(proceed) {\n            proceed.apply(this);\n            this.drawBreaks(this.xAxis, ['x']);\n            this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));\n        }\n\n        H.Series.prototype.drawBreaks = function(axis, keys) {\n            var series = this,\n                points = series.points,\n                breaks,\n                threshold,\n                eventName,\n                y;\n\n            if (!axis) {\n                return; // #5950\n            }\n\n            each(keys, function(key) {\n                breaks = axis.breakArray || [];\n                threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);\n                each(points, function(point) {\n                    y = pick(point['stack' + key.toUpperCase()], point[key]);\n                    each(breaks, function(brk) {\n                        eventName = false;\n\n                        if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {\n                            eventName = 'pointBreak';\n                        } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break\n                            eventName = 'pointInBreak';\n                        }\n                        if (eventName) {\n                            fireEvent(axis, eventName, {\n                                point: point,\n                                brk: brk\n                            });\n                        }\n                    });\n                });\n            });\n        };\n\n\n        /**\n         * Extend getGraphPath by identifying gaps in the data so that we can draw a gap\n         * in the line or area. This was moved from ordinal axis module to broken axis\n         * module as of #5045.\n         */\n        H.Series.prototype.gappedPath = function() {\n            var gapSize = this.options.gapSize,\n                points = this.points.slice(),\n                i = points.length - 1;\n\n            if (gapSize && i > 0) { // #5008\n\n                // extension for ordinal breaks\n                while (i--) {\n                    if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {\n                        points.splice( // insert after this one\n                            i + 1,\n                            0, {\n                                isNull: true\n                            }\n                        );\n                    }\n                }\n            }\n\n            // Call base method\n            return this.getGraphPath(points);\n        };\n\n        wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);\n        wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/data.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Data module\n\n (c) 2012-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(g){var p=g.win.document,m=g.each,z=g.objectEach,A=g.pick,w=g.inArray,x=g.isNumber,B=g.splat,n,u=function(b,a){this.init(b,a)};g.extend(u.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.firstRowAsNames=A(b.firstRowAsNames,!0);this.decimalRegex=b.decimalPoint&&new RegExp(\"^(-?[0-9]+)\"+b.decimalPoint+\"([0-9]+)$\");this.rawColumns=\n[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=this.options,d=[],f=function(b){return(g.seriesTypes[b||\"line\"].prototype.pointArrayMap||[0]).length},e=b&&b.chart&&b.chart.type,c=[],k=[],t=0,h;m(b&&b.series||[],function(b){c.push(f(b.type||e))});m(a&&a.seriesMapping||[],function(b){d.push(b.x||0)});0===d.length&&d.push(0);m(a&&a.seriesMapping||[],function(a){var d=new n,C=c[t]||f(e),\nq=g.seriesTypes[((b&&b.series||[])[t]||{}).type||e||\"line\"].prototype.pointArrayMap||[\"y\"];d.addColumnReader(a.x,\"x\");z(a,function(b,a){\"x\"!==a&&d.addColumnReader(b,a)});for(h=0;h<C;h++)d.hasReader(q[h])||d.addColumnReader(void 0,q[h]);k.push(d);t++});a=g.seriesTypes[e||\"line\"].prototype.pointArrayMap;void 0===a&&(a=[\"y\"]);this.valueCount={global:f(e),xColumns:d,individual:c,seriesBuilders:k,globalPointArrayMap:a}},dataFound:function(){this.options.switchRowsAndColumns&&(this.columns=this.rowsToColumns(this.columns));\nthis.getColumnDistribution();this.parseTypes();!1!==this.parsed()&&this.complete()},parseCSV:function(){var b=this,a=this.options,d=a.csv,f=this.columns,e=a.startRow||0,c=a.endRow||Number.MAX_VALUE,k=a.startColumn||0,t=a.endColumn||Number.MAX_VALUE,h,g,y=0;d&&(g=d.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\").split(a.lineDelimiter||\"\\n\"),h=a.itemDelimiter||(-1!==d.indexOf(\"\\t\")?\"\\t\":\",\"),m(g,function(a,d){var g=b.trim(a),q=0===g.indexOf(\"#\");d>=e&&d<=c&&!q&&\"\"!==g&&(a=a.split(h),m(a,function(b,a){a>=\nk&&a<=t&&(f[a-k]||(f[a-k]=[]),f[a-k][y]=b)}),y+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,d=this.columns,f=b.startRow||0,e=b.endRow||Number.MAX_VALUE,c=b.startColumn||0,k=b.endColumn||Number.MAX_VALUE;a&&(\"string\"===typeof a&&(a=p.getElementById(a)),m(a.getElementsByTagName(\"tr\"),function(b,a){a>=f&&a<=e&&m(b.children,function(b,e){(\"TD\"===b.tagName||\"TH\"===b.tagName)&&e>=c&&e<=k&&(d[e-c]||(d[e-c]=[]),d[e-c][a-f]=b.innerHTML)})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=\nthis,a=this.options,d=a.googleSpreadsheetKey,f=this.columns,e=a.startRow||0,c=a.endRow||Number.MAX_VALUE,k=a.startColumn||0,g=a.endColumn||Number.MAX_VALUE,h,q;d&&jQuery.ajax({dataType:\"json\",url:\"https://spreadsheets.google.com/feeds/cells/\"+d+\"/\"+(a.googleSpreadsheetWorksheet||\"od6\")+\"/public/values?alt\\x3djson-in-script\\x26callback\\x3d?\",error:a.error,success:function(a){a=a.feed.entry;var d,t=a.length,r=0,n=0,l;for(l=0;l<t;l++)d=a[l],r=Math.max(r,d.gs$cell.col),n=Math.max(n,d.gs$cell.row);for(l=\n0;l<r;l++)l>=k&&l<=g&&(f[l-k]=[],f[l-k].length=Math.min(n,c-e));for(l=0;l<t;l++)d=a[l],h=d.gs$cell.row-1,q=d.gs$cell.col-1,q>=k&&q<=g&&h>=e&&h<=c&&(f[q-k][h-e]=d.content.$t);m(f,function(a){for(l=0;l<a.length;l++)void 0===a[l]&&(a[l]=null)});b.dataFound()}})},trim:function(b,a){\"string\"===typeof b&&(b=b.replace(/^\\s+|\\s+$/g,\"\"),a&&/^[0-9\\s]+$/.test(b)&&(b=b.replace(/\\s/g,\"\")),this.decimalRegex&&(b=b.replace(this.decimalRegex,\"$1.$2\")));return b},parseTypes:function(){for(var b=this.columns,a=b.length;a--;)this.parseColumn(b[a],\na)},parseColumn:function(b,a){var d=this.rawColumns,f=this.columns,e=b.length,c,k,g,h,n=this.firstRowAsNames,m=-1!==w(a,this.valueCount.xColumns),p=[],v=this.chartOptions,r,u=(this.options.columnTypes||[])[a],v=m&&(v&&v.xAxis&&\"category\"===B(v.xAxis)[0].type||\"string\"===u);for(d[a]||(d[a]=[]);e--;)c=p[e]||b[e],g=this.trim(c),h=this.trim(c,!0),k=parseFloat(h),void 0===d[a][e]&&(d[a][e]=g),v||0===e&&n?b[e]=g:+h===k?(b[e]=k,31536E6<k&&\"float\"!==u?b.isDatetime=!0:b.isNumeric=!0,void 0!==b[e+1]&&(r=k>\nb[e+1])):(k=this.parseDate(c),m&&x(k)&&\"float\"!==u?(p[e]=c,b[e]=k,b.isDatetime=!0,void 0!==b[e+1]&&(c=k>b[e+1],c!==r&&void 0!==r&&(this.alternativeFormat?(this.dateFormat=this.alternativeFormat,e=b.length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):b.unsorted=!0),r=c)):(b[e]=\"\"===g?null:g,0!==e&&(b.isDatetime||b.isNumeric)&&(b.mixed=!0)));m&&b.mixed&&(f[a]=d[a]);if(m&&r&&this.options.sort)for(a=0;a<f.length;a++)f[a].reverse(),n&&f[a].unshift(f[a].pop())},dateFormats:{\"YYYY-mm-dd\":{regex:/^([0-9]{4})[\\-\\/\\.]([0-9]{2})[\\-\\/\\.]([0-9]{2})$/,\nparser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}},\"dd/mm/YYYY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[2]-1,+b[1])},alternative:\"mm/dd/YYYY\"},\"mm/dd/YYYY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[1]-1,+b[2])}},\"dd/mm/YY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[2]-1,+b[1])},alternative:\"mm/dd/YY\"},\n\"mm/dd/YY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[1]-1,+b[2])}}},parseDate:function(b){var a=this.options.parseDate,d,f,e=this.options.dateFormat||this.dateFormat,c;if(a)d=a(b);else if(\"string\"===typeof b){if(e)a=this.dateFormats[e],(c=b.match(a.regex))&&(d=a.parser(c));else for(f in this.dateFormats)if(a=this.dateFormats[f],c=b.match(a.regex)){this.dateFormat=f;this.alternativeFormat=a.alternative;d=a.parser(c);break}c||(c=Date.parse(b),\n\"object\"===typeof c&&null!==c&&c.getTime?d=c.getTime()-6E4*c.getTimezoneOffset():x(c)&&(d=c-6E4*(new Date(c)).getTimezoneOffset()))}return d},rowsToColumns:function(b){var a,d,f,e,c;if(b)for(c=[],d=b.length,a=0;a<d;a++)for(e=b[a].length,f=0;f<e;f++)c[f]||(c[f]=[]),c[f][a]=b[a][f];return c},parsed:function(){if(this.options.parsed)return this.options.parsed.call(this,this.columns)},getFreeIndexes:function(b,a){var d,f=[],e=[],c;for(d=0;d<b;d+=1)f.push(!0);for(b=0;b<a.length;b+=1)for(c=a[b].getReferencedColumnIndexes(),\nd=0;d<c.length;d+=1)f[c[d]]=!1;for(d=0;d<f.length;d+=1)f[d]&&e.push(d);return e},complete:function(){var b=this.columns,a,d=this.options,f,e,c,k,g=[],h;if(d.complete||d.afterComplete){for(c=0;c<b.length;c++)this.firstRowAsNames&&(b[c].name=b[c].shift());f=[];e=this.getFreeIndexes(b.length,this.valueCount.seriesBuilders);for(c=0;c<this.valueCount.seriesBuilders.length;c++)h=this.valueCount.seriesBuilders[c],h.populateColumns(e)&&g.push(h);for(;0<e.length;){h=new n;h.addColumnReader(0,\"x\");c=w(0,e);\n-1!==c&&e.splice(c,1);for(c=0;c<this.valueCount.global;c++)h.addColumnReader(void 0,this.valueCount.globalPointArrayMap[c]);h.populateColumns(e)&&g.push(h)}0<g.length&&0<g[0].readers.length&&(h=b[g[0].readers[0].columnIndex],void 0!==h&&(h.isDatetime?a=\"datetime\":h.isNumeric||(a=\"category\")));if(\"category\"===a)for(c=0;c<g.length;c++)for(h=g[c],e=0;e<h.readers.length;e++)\"x\"===h.readers[e].configName&&(h.readers[e].configName=\"name\");for(c=0;c<g.length;c++){h=g[c];e=[];for(k=0;k<b[0].length;k++)e[k]=\nh.read(b,k);f[c]={data:e};h.name&&(f[c].name=h.name);\"category\"===a&&(f[c].turboThreshold=0)}b={series:f};a&&(b.xAxis={type:a},\"category\"===a&&(b.xAxis.uniqueNames=!1));d.complete&&d.complete(b);d.afterComplete&&d.afterComplete(b)}}});g.Data=u;g.data=function(b,a){return new u(b,a)};g.wrap(g.Chart.prototype,\"init\",function(b,a,d){var f=this;a&&a.data?g.data(g.extend(a.data,{afterComplete:function(e){var c,k;if(a.hasOwnProperty(\"series\"))if(\"object\"===typeof a.series)for(c=Math.max(a.series.length,\ne.series.length);c--;)k=a.series[c]||{},a.series[c]=g.merge(k,e.series[c]);else delete a.series;a=g.merge(e,a);b.call(f,a,d)}}),a):b.call(f,a,d)});n=function(){this.readers=[];this.pointIsArray=!0};n.prototype.populateColumns=function(b){var a=!0;m(this.readers,function(a){void 0===a.columnIndex&&(a.columnIndex=b.shift())});m(this.readers,function(b){void 0===b.columnIndex&&(a=!1)});return a};n.prototype.read=function(b,a){var d=this.pointIsArray,f=d?[]:{},e;m(this.readers,function(c){var e=b[c.columnIndex][a];\nd?f.push(e):f[c.configName]=e});void 0===this.name&&2<=this.readers.length&&(e=this.getReferencedColumnIndexes(),2<=e.length&&(e.shift(),e.sort(),this.name=b[e.shift()].name));return f};n.prototype.addColumnReader=function(b,a){this.readers.push({columnIndex:b,configName:a});\"x\"!==a&&\"y\"!==a&&void 0!==a&&(this.pointIsArray=!1)};n.prototype.getReferencedColumnIndexes=function(){var b,a=[],d;for(b=0;b<this.readers.length;b+=1)d=this.readers[b],void 0!==d.columnIndex&&a.push(d.columnIndex);return a};\nn.prototype.hasReader=function(b){var a,d;for(a=0;a<this.readers.length;a+=1)if(d=this.readers[a],d.configName===b)return!0}})(p)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/data.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Data module\n *\n * (c) 2012-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Data module\n         *\n         * (c) 2012-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /* global jQuery */\n\n        // Utilities\n        var win = Highcharts.win,\n            doc = win.document,\n            each = Highcharts.each,\n            objectEach = Highcharts.objectEach,\n            pick = Highcharts.pick,\n            inArray = Highcharts.inArray,\n            isNumber = Highcharts.isNumber,\n            splat = Highcharts.splat,\n            SeriesBuilder;\n\n\n        // The Data constructor\n        var Data = function(dataOptions, chartOptions) {\n            this.init(dataOptions, chartOptions);\n        };\n\n        // Set the prototype properties\n        Highcharts.extend(Data.prototype, {\n\n            /**\n             * Initialize the Data object with the given options\n             */\n            init: function(options, chartOptions) {\n                this.options = options;\n                this.chartOptions = chartOptions;\n                this.columns = options.columns || this.rowsToColumns(options.rows) || [];\n                this.firstRowAsNames = pick(options.firstRowAsNames, true);\n                this.decimalRegex = options.decimalPoint && new RegExp('^(-?[0-9]+)' + options.decimalPoint + '([0-9]+)$');\n\n                // This is a two-dimensional array holding the raw, trimmed string values\n                // with the same organisation as the columns array. It makes it possible\n                // for example to revert from interpreted timestamps to string-based\n                // categories.\n                this.rawColumns = [];\n\n                // No need to parse or interpret anything\n                if (this.columns.length) {\n                    this.dataFound();\n\n                    // Parse and interpret\n                } else {\n\n                    // Parse a CSV string if options.csv is given\n                    this.parseCSV();\n\n                    // Parse a HTML table if options.table is given\n                    this.parseTable();\n\n                    // Parse a Google Spreadsheet \n                    this.parseGoogleSpreadsheet();\n                }\n\n            },\n\n            /**\n             * Get the column distribution. For example, a line series takes a single column for \n             * Y values. A range series takes two columns for low and high values respectively,\n             * and an OHLC series takes four columns.\n             */\n            getColumnDistribution: function() {\n                var chartOptions = this.chartOptions,\n                    options = this.options,\n                    xColumns = [],\n                    getValueCount = function(type) {\n                        return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;\n                    },\n                    getPointArrayMap = function(type) {\n                        return Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap;\n                    },\n                    globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,\n                    individualCounts = [],\n                    seriesBuilders = [],\n                    seriesIndex = 0,\n                    i;\n\n                each((chartOptions && chartOptions.series) || [], function(series) {\n                    individualCounts.push(getValueCount(series.type || globalType));\n                });\n\n                // Collect the x-column indexes from seriesMapping\n                each((options && options.seriesMapping) || [], function(mapping) {\n                    xColumns.push(mapping.x || 0);\n                });\n\n                // If there are no defined series with x-columns, use the first column as x column\n                if (xColumns.length === 0) {\n                    xColumns.push(0);\n                }\n\n                // Loop all seriesMappings and constructs SeriesBuilders from\n                // the mapping options.\n                each((options && options.seriesMapping) || [], function(mapping) {\n                    var builder = new SeriesBuilder(),\n                        numberOfValueColumnsNeeded = individualCounts[seriesIndex] || getValueCount(globalType),\n                        seriesArr = (chartOptions && chartOptions.series) || [],\n                        series = seriesArr[seriesIndex] || {},\n                        pointArrayMap = getPointArrayMap(series.type || globalType) || ['y'];\n\n                    // Add an x reader from the x property or from an undefined column\n                    // if the property is not set. It will then be auto populated later.\n                    builder.addColumnReader(mapping.x, 'x');\n\n                    // Add all column mappings\n                    objectEach(mapping, function(val, name) {\n                        if (name !== 'x') {\n                            builder.addColumnReader(val, name);\n                        }\n                    });\n\n                    // Add missing columns\n                    for (i = 0; i < numberOfValueColumnsNeeded; i++) {\n                        if (!builder.hasReader(pointArrayMap[i])) {\n                            //builder.addNextColumnReader(pointArrayMap[i]);\n                            // Create and add a column reader for the next free column index\n                            builder.addColumnReader(undefined, pointArrayMap[i]);\n                        }\n                    }\n\n                    seriesBuilders.push(builder);\n                    seriesIndex++;\n                });\n\n                var globalPointArrayMap = getPointArrayMap(globalType);\n                if (globalPointArrayMap === undefined) {\n                    globalPointArrayMap = ['y'];\n                }\n\n                this.valueCount = {\n                    global: getValueCount(globalType),\n                    xColumns: xColumns,\n                    individual: individualCounts,\n                    seriesBuilders: seriesBuilders,\n                    globalPointArrayMap: globalPointArrayMap\n                };\n            },\n\n            /**\n             * When the data is parsed into columns, either by CSV, table, GS or direct input,\n             * continue with other operations.\n             */\n            dataFound: function() {\n\n                if (this.options.switchRowsAndColumns) {\n                    this.columns = this.rowsToColumns(this.columns);\n                }\n\n                // Interpret the info about series and columns\n                this.getColumnDistribution();\n\n                // Interpret the values into right types\n                this.parseTypes();\n\n                // Handle columns if a handleColumns callback is given\n                if (this.parsed() !== false) {\n\n                    // Complete if a complete callback is given\n                    this.complete();\n                }\n\n            },\n\n            /**\n             * Parse a CSV input string\n             */\n            parseCSV: function() {\n                var self = this,\n                    options = this.options,\n                    csv = options.csv,\n                    columns = this.columns,\n                    startRow = options.startRow || 0,\n                    endRow = options.endRow || Number.MAX_VALUE,\n                    startColumn = options.startColumn || 0,\n                    endColumn = options.endColumn || Number.MAX_VALUE,\n                    itemDelimiter,\n                    lines,\n                    activeRowNo = 0;\n\n                if (csv) {\n\n                    lines = csv\n                        .replace(/\\r\\n/g, '\\n') // Unix\n                        .replace(/\\r/g, '\\n') // Mac\n                        .split(options.lineDelimiter || '\\n');\n\n                    itemDelimiter = options.itemDelimiter || (csv.indexOf('\\t') !== -1 ? '\\t' : ',');\n\n                    each(lines, function(line, rowNo) {\n                        var trimmed = self.trim(line),\n                            isComment = trimmed.indexOf('#') === 0,\n                            isBlank = trimmed === '',\n                            items;\n\n                        if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {\n                            items = line.split(itemDelimiter);\n                            each(items, function(item, colNo) {\n                                if (colNo >= startColumn && colNo <= endColumn) {\n                                    if (!columns[colNo - startColumn]) {\n                                        columns[colNo - startColumn] = [];\n                                    }\n\n                                    columns[colNo - startColumn][activeRowNo] = item;\n                                }\n                            });\n                            activeRowNo += 1;\n                        }\n                    });\n\n                    this.dataFound();\n                }\n            },\n\n            /**\n             * Parse a HTML table\n             */\n            parseTable: function() {\n                var options = this.options,\n                    table = options.table,\n                    columns = this.columns,\n                    startRow = options.startRow || 0,\n                    endRow = options.endRow || Number.MAX_VALUE,\n                    startColumn = options.startColumn || 0,\n                    endColumn = options.endColumn || Number.MAX_VALUE;\n\n                if (table) {\n\n                    if (typeof table === 'string') {\n                        table = doc.getElementById(table);\n                    }\n\n                    each(table.getElementsByTagName('tr'), function(tr, rowNo) {\n                        if (rowNo >= startRow && rowNo <= endRow) {\n                            each(tr.children, function(item, colNo) {\n                                if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {\n                                    if (!columns[colNo - startColumn]) {\n                                        columns[colNo - startColumn] = [];\n                                    }\n\n                                    columns[colNo - startColumn][rowNo - startRow] = item.innerHTML;\n                                }\n                            });\n                        }\n                    });\n\n                    this.dataFound(); // continue\n                }\n            },\n\n            /**\n             */\n            parseGoogleSpreadsheet: function() {\n                var self = this,\n                    options = this.options,\n                    googleSpreadsheetKey = options.googleSpreadsheetKey,\n                    columns = this.columns,\n                    startRow = options.startRow || 0,\n                    endRow = options.endRow || Number.MAX_VALUE,\n                    startColumn = options.startColumn || 0,\n                    endColumn = options.endColumn || Number.MAX_VALUE,\n                    gr, // google row\n                    gc; // google column\n\n                if (googleSpreadsheetKey) {\n                    jQuery.ajax({\n                        dataType: 'json',\n                        url: 'https://spreadsheets.google.com/feeds/cells/' +\n                            googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +\n                            '/public/values?alt=json-in-script&callback=?',\n                        error: options.error,\n                        success: function(json) {\n                            // Prepare the data from the spreadsheat\n                            var cells = json.feed.entry,\n                                cell,\n                                cellCount = cells.length,\n                                colCount = 0,\n                                rowCount = 0,\n                                i;\n\n                            // First, find the total number of columns and rows that \n                            // are actually filled with data\n                            for (i = 0; i < cellCount; i++) {\n                                cell = cells[i];\n                                colCount = Math.max(colCount, cell.gs$cell.col);\n                                rowCount = Math.max(rowCount, cell.gs$cell.row);\n                            }\n\n                            // Set up arrays containing the column data\n                            for (i = 0; i < colCount; i++) {\n                                if (i >= startColumn && i <= endColumn) {\n                                    // Create new columns with the length of either end-start or rowCount\n                                    columns[i - startColumn] = [];\n\n                                    // Setting the length to avoid jslint warning\n                                    columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);\n                                }\n                            }\n\n                            // Loop over the cells and assign the value to the right\n                            // place in the column arrays\n                            for (i = 0; i < cellCount; i++) {\n                                cell = cells[i];\n                                gr = cell.gs$cell.row - 1; // rows start at 1\n                                gc = cell.gs$cell.col - 1; // columns start at 1\n\n                                // If both row and col falls inside start and end\n                                // set the transposed cell value in the newly created columns\n                                if (gc >= startColumn && gc <= endColumn &&\n                                    gr >= startRow && gr <= endRow) {\n                                    columns[gc - startColumn][gr - startRow] = cell.content.$t;\n                                }\n                            }\n\n                            // Insert null for empty spreadsheet cells (#5298)\n                            each(columns, function(column) {\n                                for (i = 0; i < column.length; i++) {\n                                    if (column[i] === undefined) {\n                                        column[i] = null;\n                                    }\n                                }\n                            });\n\n                            self.dataFound();\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Trim a string from whitespace\n             */\n            trim: function(str, inside) {\n                if (typeof str === 'string') {\n                    str = str.replace(/^\\s+|\\s+$/g, '');\n\n                    // Clear white space insdie the string, like thousands separators\n                    if (inside && /^[0-9\\s]+$/.test(str)) {\n                        str = str.replace(/\\s/g, '');\n                    }\n\n                    if (this.decimalRegex) {\n                        str = str.replace(this.decimalRegex, '$1.$2');\n                    }\n                }\n                return str;\n            },\n\n            /**\n             * Parse numeric cells in to number types and date types in to true dates.\n             */\n            parseTypes: function() {\n                var columns = this.columns,\n                    col = columns.length;\n\n                while (col--) {\n                    this.parseColumn(columns[col], col);\n                }\n\n            },\n\n            /**\n             * Parse a single column. Set properties like .isDatetime and .isNumeric.\n             */\n            parseColumn: function(column, col) {\n                var rawColumns = this.rawColumns,\n                    columns = this.columns,\n                    row = column.length,\n                    val,\n                    floatVal,\n                    trimVal,\n                    trimInsideVal,\n                    firstRowAsNames = this.firstRowAsNames,\n                    isXColumn = inArray(col, this.valueCount.xColumns) !== -1,\n                    dateVal,\n                    backup = [],\n                    diff,\n                    chartOptions = this.chartOptions,\n                    descending,\n                    columnTypes = this.options.columnTypes || [],\n                    columnType = columnTypes[col],\n                    forceCategory = isXColumn && ((chartOptions && chartOptions.xAxis && splat(chartOptions.xAxis)[0].type === 'category') || columnType === 'string');\n\n                if (!rawColumns[col]) {\n                    rawColumns[col] = [];\n                }\n                while (row--) {\n                    val = backup[row] || column[row];\n\n                    trimVal = this.trim(val);\n                    trimInsideVal = this.trim(val, true);\n                    floatVal = parseFloat(trimInsideVal);\n\n                    // Set it the first time\n                    if (rawColumns[col][row] === undefined) {\n                        rawColumns[col][row] = trimVal;\n                    }\n\n                    // Disable number or date parsing by setting the X axis type to category\n                    if (forceCategory || (row === 0 && firstRowAsNames)) {\n                        column[row] = trimVal;\n\n                    } else if (+trimInsideVal === floatVal) { // is numeric\n\n                        column[row] = floatVal;\n\n                        // If the number is greater than milliseconds in a year, assume datetime\n                        if (floatVal > 365 * 24 * 3600 * 1000 && columnType !== 'float') {\n                            column.isDatetime = true;\n                        } else {\n                            column.isNumeric = true;\n                        }\n\n                        if (column[row + 1] !== undefined) {\n                            descending = floatVal > column[row + 1];\n                        }\n\n                        // String, continue to determine if it is a date string or really a string\n                    } else {\n                        dateVal = this.parseDate(val);\n                        // Only allow parsing of dates if this column is an x-column\n                        if (isXColumn && isNumber(dateVal) && columnType !== 'float') { // is date\n                            backup[row] = val;\n                            column[row] = dateVal;\n                            column.isDatetime = true;\n\n                            // Check if the dates are uniformly descending or ascending. If they \n                            // are not, chances are that they are a different time format, so check\n                            // for alternative.\n                            if (column[row + 1] !== undefined) {\n                                diff = dateVal > column[row + 1];\n                                if (diff !== descending && descending !== undefined) {\n                                    if (this.alternativeFormat) {\n                                        this.dateFormat = this.alternativeFormat;\n                                        row = column.length;\n                                        this.alternativeFormat = this.dateFormats[this.dateFormat].alternative;\n                                    } else {\n                                        column.unsorted = true;\n                                    }\n                                }\n                                descending = diff;\n                            }\n\n                        } else { // string\n                            column[row] = trimVal === '' ? null : trimVal;\n                            if (row !== 0 && (column.isDatetime || column.isNumeric)) {\n                                column.mixed = true;\n                            }\n                        }\n                    }\n                }\n\n                // If strings are intermixed with numbers or dates in a parsed column, it is an indication\n                // that parsing went wrong or the data was not intended to display as numbers or dates and \n                // parsing is too aggressive. Fall back to categories. Demonstrated in the \n                // highcharts/demo/column-drilldown sample.\n                if (isXColumn && column.mixed) {\n                    columns[col] = rawColumns[col];\n                }\n\n                // If the 0 column is date or number and descending, reverse all columns. \n                if (isXColumn && descending && this.options.sort) {\n                    for (col = 0; col < columns.length; col++) {\n                        columns[col].reverse();\n                        if (firstRowAsNames) {\n                            columns[col].unshift(columns[col].pop());\n                        }\n                    }\n                }\n            },\n\n            /**\n             * A collection of available date formats, extendable from the outside to support\n             * custom date formats.\n             */\n            dateFormats: {\n                'YYYY-mm-dd': {\n                    regex: /^([0-9]{4})[\\-\\/\\.]([0-9]{2})[\\-\\/\\.]([0-9]{2})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[1], match[2] - 1, +match[3]);\n                    }\n                },\n                'dd/mm/YYYY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3], match[2] - 1, +match[1]);\n                    },\n                    alternative: 'mm/dd/YYYY' // different format with the same regex\n                },\n                'mm/dd/YYYY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3], match[1] - 1, +match[2]);\n                    }\n                },\n                'dd/mm/YY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3] + 2000, match[2] - 1, +match[1]);\n                    },\n                    alternative: 'mm/dd/YY' // different format with the same regex\n                },\n                'mm/dd/YY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3] + 2000, match[1] - 1, +match[2]);\n                    }\n                }\n            },\n\n            /**\n             * Parse a date and return it as a number. Overridable through options.parseDate.\n             */\n            parseDate: function(val) {\n                var parseDate = this.options.parseDate,\n                    ret,\n                    key,\n                    format,\n                    dateFormat = this.options.dateFormat || this.dateFormat,\n                    match;\n\n                if (parseDate) {\n                    ret = parseDate(val);\n\n                } else if (typeof val === 'string') {\n                    // Auto-detect the date format the first time\n                    if (!dateFormat) {\n                        for (key in this.dateFormats) {\n                            format = this.dateFormats[key];\n                            match = val.match(format.regex);\n                            if (match) {\n                                this.dateFormat = dateFormat = key;\n                                this.alternativeFormat = format.alternative;\n                                ret = format.parser(match);\n                                break;\n                            }\n                        }\n                        // Next time, use the one previously found\n                    } else {\n                        format = this.dateFormats[dateFormat];\n                        match = val.match(format.regex);\n                        if (match) {\n                            ret = format.parser(match);\n                        }\n                    }\n                    // Fall back to Date.parse\t\t\n                    if (!match) {\n                        match = Date.parse(val);\n                        // External tools like Date.js and MooTools extend Date object and\n                        // returns a date.\n                        if (typeof match === 'object' && match !== null && match.getTime) {\n                            ret = match.getTime() - match.getTimezoneOffset() * 60000;\n\n                            // Timestamp\n                        } else if (isNumber(match)) {\n                            ret = match - (new Date(match)).getTimezoneOffset() * 60000;\n                        }\n                    }\n                }\n                return ret;\n            },\n\n            /**\n             * Reorganize rows into columns\n             */\n            rowsToColumns: function(rows) {\n                var row,\n                    rowsLength,\n                    col,\n                    colsLength,\n                    columns;\n\n                if (rows) {\n                    columns = [];\n                    rowsLength = rows.length;\n                    for (row = 0; row < rowsLength; row++) {\n                        colsLength = rows[row].length;\n                        for (col = 0; col < colsLength; col++) {\n                            if (!columns[col]) {\n                                columns[col] = [];\n                            }\n                            columns[col][row] = rows[row][col];\n                        }\n                    }\n                }\n                return columns;\n            },\n\n            /**\n             * A hook for working directly on the parsed columns\n             */\n            parsed: function() {\n                if (this.options.parsed) {\n                    return this.options.parsed.call(this, this.columns);\n                }\n            },\n\n            getFreeIndexes: function(numberOfColumns, seriesBuilders) {\n                var s,\n                    i,\n                    freeIndexes = [],\n                    freeIndexValues = [],\n                    referencedIndexes;\n\n                // Add all columns as free\n                for (i = 0; i < numberOfColumns; i = i + 1) {\n                    freeIndexes.push(true);\n                }\n\n                // Loop all defined builders and remove their referenced columns\n                for (s = 0; s < seriesBuilders.length; s = s + 1) {\n                    referencedIndexes = seriesBuilders[s].getReferencedColumnIndexes();\n\n                    for (i = 0; i < referencedIndexes.length; i = i + 1) {\n                        freeIndexes[referencedIndexes[i]] = false;\n                    }\n                }\n\n                // Collect the values for the free indexes\n                for (i = 0; i < freeIndexes.length; i = i + 1) {\n                    if (freeIndexes[i]) {\n                        freeIndexValues.push(i);\n                    }\n                }\n\n                return freeIndexValues;\n            },\n\n            /**\n             * If a complete callback function is provided in the options, interpret the \n             * columns into a Highcharts options object.\n             */\n            complete: function() {\n\n                var columns = this.columns,\n                    xColumns = [],\n                    type,\n                    options = this.options,\n                    series,\n                    data,\n                    i,\n                    j,\n                    r,\n                    seriesIndex,\n                    chartOptions,\n                    allSeriesBuilders = [],\n                    builder,\n                    freeIndexes,\n                    typeCol,\n                    index;\n\n                xColumns.length = columns.length;\n                if (options.complete || options.afterComplete) {\n\n                    // Get the names and shift the top row\n                    for (i = 0; i < columns.length; i++) {\n                        if (this.firstRowAsNames) {\n                            columns[i].name = columns[i].shift();\n                        }\n                    }\n\n                    // Use the next columns for series\n                    series = [];\n                    freeIndexes = this.getFreeIndexes(columns.length, this.valueCount.seriesBuilders);\n\n                    // Populate defined series\n                    for (seriesIndex = 0; seriesIndex < this.valueCount.seriesBuilders.length; seriesIndex++) {\n                        builder = this.valueCount.seriesBuilders[seriesIndex];\n\n                        // If the builder can be populated with remaining columns, then add it to allBuilders\n                        if (builder.populateColumns(freeIndexes)) {\n                            allSeriesBuilders.push(builder);\n                        }\n                    }\n\n                    // Populate dynamic series\n                    while (freeIndexes.length > 0) {\n                        builder = new SeriesBuilder();\n                        builder.addColumnReader(0, 'x');\n\n                        // Mark index as used (not free)\n                        index = inArray(0, freeIndexes);\n                        if (index !== -1) {\n                            freeIndexes.splice(index, 1);\n                        }\n\n                        for (i = 0; i < this.valueCount.global; i++) {\n                            // Create and add a column reader for the next free column index\n                            builder.addColumnReader(undefined, this.valueCount.globalPointArrayMap[i]);\n                        }\n\n                        // If the builder can be populated with remaining columns, then add it to allBuilders\n                        if (builder.populateColumns(freeIndexes)) {\n                            allSeriesBuilders.push(builder);\n                        }\n                    }\n\n                    // Get the data-type from the first series x column\n                    if (allSeriesBuilders.length > 0 && allSeriesBuilders[0].readers.length > 0) {\n                        typeCol = columns[allSeriesBuilders[0].readers[0].columnIndex];\n                        if (typeCol !== undefined) {\n                            if (typeCol.isDatetime) {\n                                type = 'datetime';\n                            } else if (!typeCol.isNumeric) {\n                                type = 'category';\n                            }\n                        }\n                    }\n                    // Axis type is category, then the \"x\" column should be called \"name\"\n                    if (type === 'category') {\n                        for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) {\n                            builder = allSeriesBuilders[seriesIndex];\n                            for (r = 0; r < builder.readers.length; r++) {\n                                if (builder.readers[r].configName === 'x') {\n                                    builder.readers[r].configName = 'name';\n                                }\n                            }\n                        }\n                    }\n\n                    // Read data for all builders\n                    for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) {\n                        builder = allSeriesBuilders[seriesIndex];\n\n                        // Iterate down the cells of each column and add data to the series\n                        data = [];\n                        for (j = 0; j < columns[0].length; j++) {\n                            data[j] = builder.read(columns, j);\n                        }\n\n                        // Add the series\n                        series[seriesIndex] = {\n                            data: data\n                        };\n                        if (builder.name) {\n                            series[seriesIndex].name = builder.name;\n                        }\n                        if (type === 'category') {\n                            series[seriesIndex].turboThreshold = 0;\n                        }\n                    }\n\n\n\n                    // Do the callback\n                    chartOptions = {\n                        series: series\n                    };\n                    if (type) {\n                        chartOptions.xAxis = {\n                            type: type\n                        };\n                        if (type === 'category') {\n                            chartOptions.xAxis.uniqueNames = false;\n                        }\n                    }\n\n                    if (options.complete) {\n                        options.complete(chartOptions);\n                    }\n\n                    // The afterComplete hook is used internally to avoid conflict with the externally\n                    // available complete option.\n                    if (options.afterComplete) {\n                        options.afterComplete(chartOptions);\n                    }\n                }\n            }\n        });\n\n        // Register the Data prototype and data function on Highcharts\n        Highcharts.Data = Data;\n        Highcharts.data = function(options, chartOptions) {\n            return new Data(options, chartOptions);\n        };\n\n        // Extend Chart.init so that the Chart constructor accepts a new configuration\n        // option group, data.\n        Highcharts.wrap(Highcharts.Chart.prototype, 'init', function(proceed, userOptions, callback) {\n            var chart = this;\n\n            if (userOptions && userOptions.data) {\n                Highcharts.data(Highcharts.extend(userOptions.data, {\n\n                    afterComplete: function(dataOptions) {\n                        var i, series;\n\n                        // Merge series configs\n                        if (userOptions.hasOwnProperty('series')) {\n                            if (typeof userOptions.series === 'object') {\n                                i = Math.max(userOptions.series.length, dataOptions.series.length);\n                                while (i--) {\n                                    series = userOptions.series[i] || {};\n                                    userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);\n                                }\n                            } else { // Allow merging in dataOptions.series (#2856)\n                                delete userOptions.series;\n                            }\n                        }\n\n                        // Do the merge\n                        userOptions = Highcharts.merge(dataOptions, userOptions);\n\n                        proceed.call(chart, userOptions, callback);\n                    }\n                }), userOptions);\n            } else {\n                proceed.call(chart, userOptions, callback);\n            }\n        });\n\n        /**\n         * Creates a new SeriesBuilder. A SeriesBuilder consists of a number\n         * of ColumnReaders that reads columns and give them a name.\n         * Ex: A series builder can be constructed to read column 3 as 'x' and\n         * column 7 and 8 as 'y1' and 'y2'.\n         * The output would then be points/rows of the form {x: 11, y1: 22, y2: 33}\n         * \n         * The name of the builder is taken from the second column. In the above\n         * example it would be the column with index 7.\n         * @constructor\n         */\n        SeriesBuilder = function() {\n            this.readers = [];\n            this.pointIsArray = true;\n        };\n\n        /**\n         * Populates readers with column indexes. A reader can be added without\n         * a specific index and for those readers the index is taken sequentially\n         * from the free columns (this is handled by the ColumnCursor instance).\n         * @returns {boolean}\n         */\n        SeriesBuilder.prototype.populateColumns = function(freeIndexes) {\n            var builder = this,\n                enoughColumns = true;\n\n            // Loop each reader and give it an index if its missing.\n            // The freeIndexes.shift() will return undefined if there\n            // are no more columns.\n            each(builder.readers, function(reader) {\n                if (reader.columnIndex === undefined) {\n                    reader.columnIndex = freeIndexes.shift();\n                }\n            });\n\n            // Now, all readers should have columns mapped. If not\n            // then return false to signal that this series should\n            // not be added.\n            each(builder.readers, function(reader) {\n                if (reader.columnIndex === undefined) {\n                    enoughColumns = false;\n                }\n            });\n\n            return enoughColumns;\n        };\n\n        /**\n         * Reads a row from the dataset and returns a point or array depending\n         * on the names of the readers.\n         * @param columns\n         * @param rowIndex\n         * @returns {Array | Object}\n         */\n        SeriesBuilder.prototype.read = function(columns, rowIndex) {\n            var builder = this,\n                pointIsArray = builder.pointIsArray,\n                point = pointIsArray ? [] : {},\n                columnIndexes;\n\n            // Loop each reader and ask it to read its value.\n            // Then, build an array or point based on the readers names.\n            each(builder.readers, function(reader) {\n                var value = columns[reader.columnIndex][rowIndex];\n                if (pointIsArray) {\n                    point.push(value);\n                } else {\n                    point[reader.configName] = value;\n                }\n            });\n\n            // The name comes from the first column (excluding the x column)\n            if (this.name === undefined && builder.readers.length >= 2) {\n                columnIndexes = builder.getReferencedColumnIndexes();\n                if (columnIndexes.length >= 2) {\n                    // remove the first one (x col)\n                    columnIndexes.shift();\n\n                    // Sort the remaining\n                    columnIndexes.sort();\n\n                    // Now use the lowest index as name column\n                    this.name = columns[columnIndexes.shift()].name;\n                }\n            }\n\n            return point;\n        };\n\n        /**\n         * Creates and adds ColumnReader from the given columnIndex and configName.\n         * ColumnIndex can be undefined and in that case the reader will be given\n         * an index when columns are populated.\n         * @param columnIndex {Number | undefined}\n         * @param configName\n         */\n        SeriesBuilder.prototype.addColumnReader = function(columnIndex, configName) {\n            this.readers.push({\n                columnIndex: columnIndex,\n                configName: configName\n            });\n\n            if (!(configName === 'x' || configName === 'y' || configName === undefined)) {\n                this.pointIsArray = false;\n            }\n        };\n\n        /**\n         * Returns an array of column indexes that the builder will use when\n         * reading data.\n         * @returns {Array}\n         */\n        SeriesBuilder.prototype.getReferencedColumnIndexes = function() {\n            var i,\n                referencedColumnIndexes = [],\n                columnReader;\n\n            for (i = 0; i < this.readers.length; i = i + 1) {\n                columnReader = this.readers[i];\n                if (columnReader.columnIndex !== undefined) {\n                    referencedColumnIndexes.push(columnReader.columnIndex);\n                }\n            }\n\n            return referencedColumnIndexes;\n        };\n\n        /**\n         * Returns true if the builder has a reader for the given configName.\n         * @param configName\n         * @returns {boolean}\n         */\n        SeriesBuilder.prototype.hasReader = function(configName) {\n            var i, columnReader;\n            for (i = 0; i < this.readers.length; i = i + 1) {\n                columnReader = this.readers[i];\n                if (columnReader.configName === configName) {\n                    return true;\n                }\n            }\n            // Else return undefined\n        };\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/drilldown.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Highcharts Drilldown module\n\n Author: Torstein Honsi\n License: www.highcharts.com/license\n\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(f){var n=f.noop,z=f.color,A=f.defaultOptions,h=f.each,p=f.extend,G=f.format,B=f.objectEach,v=f.pick,u=f.wrap,q=f.Chart,w=f.seriesTypes,C=w.pie,r=w.column,D=f.Tick,x=f.fireEvent,E=f.inArray,F=1;p(A.lang,{drillUpText:\"\\u25c1 Back to {series.name}\"});A.drilldown={animation:{duration:500},drillUpButton:{position:{align:\"right\",x:-10,y:10}}};f.SVGRenderer.prototype.Element.prototype.fadeIn=function(a){this.attr({opacity:.1,\nvisibility:\"inherit\"}).animate({opacity:v(this.newOpacity,1)},a||{duration:250})};q.prototype.addSeriesAsDrilldown=function(a,b){this.addSingleSeriesAsDrilldown(a,b);this.applyDrilldown()};q.prototype.addSingleSeriesAsDrilldown=function(a,b){var d=a.series,c=d.xAxis,e=d.yAxis,g,k=[],l=[],t,m,y;y={colorIndex:v(a.colorIndex,d.colorIndex)};this.drilldownLevels||(this.drilldownLevels=[]);t=d.options._levelNumber||0;(m=this.drilldownLevels[this.drilldownLevels.length-1])&&m.levelNumber!==t&&(m=void 0);\nb=p(p({_ddSeriesId:F++},y),b);g=E(a,d.points);h(d.chart.series,function(a){a.xAxis!==c||a.isDrilling||(a.options._ddSeriesId=a.options._ddSeriesId||F++,a.options._colorIndex=a.userOptions._colorIndex,a.options._levelNumber=a.options._levelNumber||t,m?(k=m.levelSeries,l=m.levelSeriesOptions):(k.push(a),l.push(a.options)))});a=p({levelNumber:t,seriesOptions:d.options,levelSeriesOptions:l,levelSeries:k,shapeArgs:a.shapeArgs,bBox:a.graphic?a.graphic.getBBox():{},color:a.isNull?(new f.Color(z)).setOpacity(0).get():\nz,lowerSeriesOptions:b,pointOptions:d.options.data[g],pointIndex:g,oldExtremes:{xMin:c&&c.userMin,xMax:c&&c.userMax,yMin:e&&e.userMin,yMax:e&&e.userMax}},y);this.drilldownLevels.push(a);c&&c.names&&(c.names.length=0);b=a.lowerSeries=this.addSeries(b,!1);b.options._levelNumber=t+1;c&&(c.oldPos=c.pos,c.userMin=c.userMax=null,e.userMin=e.userMax=null);d.type===b.type&&(b.animate=b.animateDrilldown||n,b.options.animation=!0)};q.prototype.applyDrilldown=function(){var a=this.drilldownLevels,b;a&&0<a.length&&\n(b=a[a.length-1].levelNumber,h(this.drilldownLevels,function(a){a.levelNumber===b&&h(a.levelSeries,function(a){a.options&&a.options._levelNumber===b&&a.remove(!1)})}));this.redraw();this.showDrillUpButton()};q.prototype.getDrilldownBackText=function(){var a=this.drilldownLevels;if(a&&0<a.length)return a=a[a.length-1],a.series=a.seriesOptions,G(this.options.lang.drillUpText,a)};q.prototype.showDrillUpButton=function(){var a=this,b=this.getDrilldownBackText(),d=a.options.drilldown.drillUpButton,c,e;\nthis.drillUpButton?this.drillUpButton.attr({text:b}).align():(e=(c=d.theme)&&c.states,this.drillUpButton=this.renderer.button(b,null,null,function(){a.drillUp()},c,e&&e.hover,e&&e.select).addClass(\"highcharts-drillup-button\").attr({align:d.position.align,zIndex:7}).add().align(d.position,!1,d.relativeTo||\"plotBox\"))};q.prototype.drillUp=function(){for(var a=this,b=a.drilldownLevels,d=b[b.length-1].levelNumber,c=b.length,e=a.series,g,k,l,f,m=function(c){var b;h(e,function(a){a.options._ddSeriesId===\nc._ddSeriesId&&(b=a)});b=b||a.addSeries(c,!1);b.type===l.type&&b.animateDrillupTo&&(b.animate=b.animateDrillupTo);c===k.seriesOptions&&(f=b)};c--;)if(k=b[c],k.levelNumber===d){b.pop();l=k.lowerSeries;if(!l.chart)for(g=e.length;g--;)if(e[g].options.id===k.lowerSeriesOptions.id&&e[g].options._levelNumber===d+1){l=e[g];break}l.xData=[];h(k.levelSeriesOptions,m);x(a,\"drillup\",{seriesOptions:k.seriesOptions});f.type===l.type&&(f.drilldownLevel=k,f.options.animation=a.options.drilldown.animation,l.animateDrillupFrom&&\nl.chart&&l.animateDrillupFrom(k));f.options._levelNumber=d;l.remove(!1);f.xAxis&&(g=k.oldExtremes,f.xAxis.setExtremes(g.xMin,g.xMax,!1),f.yAxis.setExtremes(g.yMin,g.yMax,!1))}x(a,\"drillupall\");this.redraw();0===this.drilldownLevels.length?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align();this.ddDupes.length=[]};r.prototype.supportsDrilldown=!0;r.prototype.animateDrillupTo=function(a){if(!a){var b=this,d=b.drilldownLevel;h(this.points,\nfunction(a){var b=a.dataLabel;a.graphic&&a.graphic.hide();b&&(b.hidden=\"hidden\"===b.attr(\"visibility\"),b.hidden||(b.hide(),a.connector&&a.connector.hide()))});setTimeout(function(){b.points&&h(b.points,function(a,b){b=b===(d&&d.pointIndex)?\"show\":\"fadeIn\";var c=\"show\"===b?!0:void 0,e=a.dataLabel;if(a.graphic)a.graphic[b](c);if(e&&!e.hidden&&(e[b](c),a.connector))a.connector[b](c)})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=n}};r.prototype.animateDrilldown=function(a){var b=\nthis,d=this.chart.drilldownLevels,c,e=this.chart.options.drilldown.animation,g=this.xAxis;a||(h(d,function(a){b.options._ddSeriesId===a.lowerSeriesOptions._ddSeriesId&&(c=a.shapeArgs)}),c.x+=v(g.oldPos,g.pos)-g.pos,h(this.points,function(a){a.graphic&&a.graphic.attr(c).animate(p(a.shapeArgs,{fill:a.color||b.color}),e);a.dataLabel&&a.dataLabel.fadeIn(e)}),this.animate=null)};r.prototype.animateDrillupFrom=function(a){var b=this.chart.options.drilldown.animation,d=this.group,c=d!==this.chart.seriesGroup,\ne=this;h(e.trackerGroups,function(a){if(e[a])e[a].on(\"mouseover\")});c&&delete this.group;h(this.points,function(e){var g=e.graphic,l=a.shapeArgs,h=function(){g.destroy();d&&c&&(d=d.destroy())};g&&(delete e.graphic,b?g.animate(l,f.merge(b,{complete:h})):(g.attr(l),h()))})};C&&p(C.prototype,{supportsDrilldown:!0,animateDrillupTo:r.prototype.animateDrillupTo,animateDrillupFrom:r.prototype.animateDrillupFrom,animateDrilldown:function(a){var b=this.chart.options.drilldown.animation,d=this.chart.drilldownLevels[this.chart.drilldownLevels.length-\n1].shapeArgs,c=d.start,e=(d.end-c)/this.points.length;a||(h(this.points,function(a,k){var g=a.shapeArgs;if(a.graphic)a.graphic.attr(f.merge(d,{start:c+k*e,end:c+(k+1)*e}))[b?\"animate\":\"attr\"](g,b)}),this.animate=null)}});f.Point.prototype.doDrilldown=function(a,b,d){var c=this.series.chart,e=c.options.drilldown,g=(e.series||[]).length,f;c.ddDupes||(c.ddDupes=[]);for(;g--&&!f;)e.series[g].id===this.drilldown&&-1===E(this.drilldown,c.ddDupes)&&(f=e.series[g],c.ddDupes.push(this.drilldown));x(c,\"drilldown\",\n{point:this,seriesOptions:f,category:b,originalEvent:d,points:void 0!==b&&this.series.xAxis.getDDPoints(b).slice(0)},function(b){var c=b.point.series&&b.point.series.chart,d=b.seriesOptions;c&&d&&(a?c.addSingleSeriesAsDrilldown(b.point,d):c.addSeriesAsDrilldown(b.point,d))})};f.Axis.prototype.drilldownCategory=function(a,b){B(this.getDDPoints(a),function(d){d&&d.series&&d.series.visible&&d.doDrilldown&&d.doDrilldown(!0,a,b)});this.chart.applyDrilldown()};f.Axis.prototype.getDDPoints=function(a){var b=\n[];h(this.series,function(d){var c,e=d.xData,f=d.points;for(c=0;c<e.length;c++)if(e[c]===a&&d.options.data[c]&&d.options.data[c].drilldown){b.push(f?f[c]:!0);break}});return b};D.prototype.drillable=function(){var a=this.pos,b=this.label,d=this.axis,c=\"xAxis\"===d.coll&&d.getDDPoints,e=c&&d.getDDPoints(a);c&&(b&&e.length?(b.drillable=!0,b.addClass(\"highcharts-drilldown-axis-label\").on(\"click\",function(b){d.drilldownCategory(a,b)})):b&&b.drillable&&(b.on(\"click\",null),b.removeClass(\"highcharts-drilldown-axis-label\")))};\nu(D.prototype,\"addLabel\",function(a){a.call(this);this.drillable()});u(f.Point.prototype,\"init\",function(a,b,d,c){var e=a.call(this,b,d,c);c=(a=b.xAxis)&&a.ticks[c];e.drilldown&&f.addEvent(e,\"click\",function(a){b.xAxis&&!1===b.chart.options.drilldown.allowPointDrilldown?b.xAxis.drilldownCategory(e.x,a):e.doDrilldown(void 0,void 0,a)});c&&c.drillable();return e});u(f.Series.prototype,\"drawDataLabels\",function(a){var b=this.chart.options.drilldown.activeDataLabelStyle,d=this.chart.renderer;a.call(this);\nh(this.points,function(a){a.drilldown&&a.dataLabel&&(\"contrast\"===b.color&&d.getContrast(a.color||this.color),a.dataLabel.addClass(\"highcharts-drilldown-data-label\"))},this)});var H=function(a){a.call(this);h(this.points,function(a){a.drilldown&&a.graphic&&a.graphic.addClass(\"highcharts-drilldown-point\")})};B(w,function(a){a.prototype.supportsDrilldown&&u(a.prototype,\"drawTracker\",H)})})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/drilldown.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Highcharts Drilldown module\n * \n * Author: Torstein Honsi\n * License: www.highcharts.com/license\n *\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Highcharts Drilldown module\n         * \n         * Author: Torstein Honsi\n         * License: www.highcharts.com/license\n         *\n         */\n\n\n        var noop = H.noop,\n            color = H.color,\n            defaultOptions = H.defaultOptions,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            wrap = H.wrap,\n            Chart = H.Chart,\n            seriesTypes = H.seriesTypes,\n            PieSeries = seriesTypes.pie,\n            ColumnSeries = seriesTypes.column,\n            Tick = H.Tick,\n            fireEvent = H.fireEvent,\n            inArray = H.inArray,\n            ddSeriesId = 1;\n\n        // Add language\n        extend(defaultOptions.lang, {\n            drillUpText: '◁ Back to {series.name}'\n        });\n        defaultOptions.drilldown = {\n\n            animation: {\n                duration: 500\n            },\n            drillUpButton: {\n                position: {\n                    align: 'right',\n                    x: -10,\n                    y: 10\n                }\n                // relativeTo: 'plotBox'\n                // theme\n            }\n        };\n\n        /**\n         * A general fadeIn method\n         */\n        H.SVGRenderer.prototype.Element.prototype.fadeIn = function(animation) {\n            this\n                .attr({\n                    opacity: 0.1,\n                    visibility: 'inherit'\n                })\n                .animate({\n                    opacity: pick(this.newOpacity, 1) // newOpacity used in maps\n                }, animation || {\n                    duration: 250\n                });\n        };\n\n        /**\n         * Add a series to the chart as drilldown from a specific point in the parent\n         * series. This method is used for async drilldown, when clicking a point in a\n         * series should result in loading and displaying a more high-resolution series.\n         * When not async, the setup is simpler using the {@link \n         * https://api.highcharts.com/highcharts/drilldown.series|drilldown.series}\n         * options structure.\n         *\n         * @memberOf Highcharts.Chart\n         * @function #addSeriesAsDrilldown\n         * \n         * @param  {Highcharts.Point} point\n         *         The point from which the drilldown will start.\n         * @param  {SeriesOptions} options\n         *         The series options for the new, detailed series.\n         *\n         * @sample highcharts/drilldown/async/ Async drilldown\n         */\n        Chart.prototype.addSeriesAsDrilldown = function(point, options) {\n            this.addSingleSeriesAsDrilldown(point, options);\n            this.applyDrilldown();\n        };\n        Chart.prototype.addSingleSeriesAsDrilldown = function(point, ddOptions) {\n            var oldSeries = point.series,\n                xAxis = oldSeries.xAxis,\n                yAxis = oldSeries.yAxis,\n                newSeries,\n                pointIndex,\n                levelSeries = [],\n                levelSeriesOptions = [],\n                level,\n                levelNumber,\n                last,\n                colorProp;\n\n\n\n            colorProp = {\n                colorIndex: pick(point.colorIndex, oldSeries.colorIndex)\n            };\n\n\n            if (!this.drilldownLevels) {\n                this.drilldownLevels = [];\n            }\n\n            levelNumber = oldSeries.options._levelNumber || 0;\n\n            // See if we can reuse the registered series from last run\n            last = this.drilldownLevels[this.drilldownLevels.length - 1];\n            if (last && last.levelNumber !== levelNumber) {\n                last = undefined;\n            }\n\n            ddOptions = extend(extend({\n                _ddSeriesId: ddSeriesId++\n            }, colorProp), ddOptions);\n            pointIndex = inArray(point, oldSeries.points);\n\n            // Record options for all current series\n            each(oldSeries.chart.series, function(series) {\n                if (series.xAxis === xAxis && !series.isDrilling) {\n                    series.options._ddSeriesId = series.options._ddSeriesId || ddSeriesId++;\n                    series.options._colorIndex = series.userOptions._colorIndex;\n                    series.options._levelNumber = series.options._levelNumber || levelNumber; // #3182\n\n                    if (last) {\n                        levelSeries = last.levelSeries;\n                        levelSeriesOptions = last.levelSeriesOptions;\n                    } else {\n                        levelSeries.push(series);\n                        levelSeriesOptions.push(series.options);\n                    }\n                }\n            });\n\n            // Add a record of properties for each drilldown level\n            level = extend({\n                levelNumber: levelNumber,\n                seriesOptions: oldSeries.options,\n                levelSeriesOptions: levelSeriesOptions,\n                levelSeries: levelSeries,\n                shapeArgs: point.shapeArgs,\n                bBox: point.graphic ? point.graphic.getBBox() : {}, // no graphic in line series with markers disabled\n                color: point.isNull ? new H.Color(color).setOpacity(0).get() : color,\n                lowerSeriesOptions: ddOptions,\n                pointOptions: oldSeries.options.data[pointIndex],\n                pointIndex: pointIndex,\n                oldExtremes: {\n                    xMin: xAxis && xAxis.userMin,\n                    xMax: xAxis && xAxis.userMax,\n                    yMin: yAxis && yAxis.userMin,\n                    yMax: yAxis && yAxis.userMax\n                }\n            }, colorProp);\n\n            // Push it to the lookup array\n            this.drilldownLevels.push(level);\n\n            // Reset names to prevent extending (#6704)\n            if (xAxis && xAxis.names) {\n                xAxis.names.length = 0;\n            }\n\n            newSeries = level.lowerSeries = this.addSeries(ddOptions, false);\n            newSeries.options._levelNumber = levelNumber + 1;\n            if (xAxis) {\n                xAxis.oldPos = xAxis.pos;\n                xAxis.userMin = xAxis.userMax = null;\n                yAxis.userMin = yAxis.userMax = null;\n            }\n\n            // Run fancy cross-animation on supported and equal types\n            if (oldSeries.type === newSeries.type) {\n                newSeries.animate = newSeries.animateDrilldown || noop;\n                newSeries.options.animation = true;\n            }\n        };\n\n        Chart.prototype.applyDrilldown = function() {\n            var drilldownLevels = this.drilldownLevels,\n                levelToRemove;\n\n            if (drilldownLevels && drilldownLevels.length > 0) { // #3352, async loading\n                levelToRemove = drilldownLevels[drilldownLevels.length - 1].levelNumber;\n                each(this.drilldownLevels, function(level) {\n                    if (level.levelNumber === levelToRemove) {\n                        each(level.levelSeries, function(series) {\n                            if (series.options && series.options._levelNumber === levelToRemove) { // Not removed, not added as part of a multi-series drilldown\n                                series.remove(false);\n                            }\n                        });\n                    }\n                });\n            }\n\n            this.redraw();\n            this.showDrillUpButton();\n        };\n\n        Chart.prototype.getDrilldownBackText = function() {\n            var drilldownLevels = this.drilldownLevels,\n                lastLevel;\n            if (drilldownLevels && drilldownLevels.length > 0) { // #3352, async loading\n                lastLevel = drilldownLevels[drilldownLevels.length - 1];\n                lastLevel.series = lastLevel.seriesOptions;\n                return format(this.options.lang.drillUpText, lastLevel);\n            }\n\n        };\n\n        Chart.prototype.showDrillUpButton = function() {\n            var chart = this,\n                backText = this.getDrilldownBackText(),\n                buttonOptions = chart.options.drilldown.drillUpButton,\n                attr,\n                states;\n\n\n            if (!this.drillUpButton) {\n                attr = buttonOptions.theme;\n                states = attr && attr.states;\n\n                this.drillUpButton = this.renderer.button(\n                        backText,\n                        null,\n                        null,\n                        function() {\n                            chart.drillUp();\n                        },\n                        attr,\n                        states && states.hover,\n                        states && states.select\n                    )\n                    .addClass('highcharts-drillup-button')\n                    .attr({\n                        align: buttonOptions.position.align,\n                        zIndex: 7\n                    })\n                    .add()\n                    .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n            } else {\n                this.drillUpButton.attr({\n                        text: backText\n                    })\n                    .align();\n            }\n        };\n\n        /**\n         * When the chart is drilled down to a child series, calling `chart.drillUp()`\n         * will drill up to the parent series.\n         *\n         * @memberOf Highcharts.Chart\n         * @name #drillUp\n         */\n        Chart.prototype.drillUp = function() {\n            var chart = this,\n                drilldownLevels = chart.drilldownLevels,\n                levelNumber = drilldownLevels[drilldownLevels.length - 1].levelNumber,\n                i = drilldownLevels.length,\n                chartSeries = chart.series,\n                seriesI,\n                level,\n                oldSeries,\n                newSeries,\n                oldExtremes,\n                addSeries = function(seriesOptions) {\n                    var addedSeries;\n                    each(chartSeries, function(series) {\n                        if (series.options._ddSeriesId === seriesOptions._ddSeriesId) {\n                            addedSeries = series;\n                        }\n                    });\n\n                    addedSeries = addedSeries || chart.addSeries(seriesOptions, false);\n                    if (addedSeries.type === oldSeries.type && addedSeries.animateDrillupTo) {\n                        addedSeries.animate = addedSeries.animateDrillupTo;\n                    }\n                    if (seriesOptions === level.seriesOptions) {\n                        newSeries = addedSeries;\n                    }\n                };\n\n            while (i--) {\n\n                level = drilldownLevels[i];\n                if (level.levelNumber === levelNumber) {\n                    drilldownLevels.pop();\n\n                    // Get the lower series by reference or id\n                    oldSeries = level.lowerSeries;\n                    if (!oldSeries.chart) { // #2786\n                        seriesI = chartSeries.length; // #2919\n                        while (seriesI--) {\n                            if (chartSeries[seriesI].options.id === level.lowerSeriesOptions.id &&\n                                chartSeries[seriesI].options._levelNumber === levelNumber + 1) { // #3867\n                                oldSeries = chartSeries[seriesI];\n                                break;\n                            }\n                        }\n                    }\n                    oldSeries.xData = []; // Overcome problems with minRange (#2898)\n\n                    each(level.levelSeriesOptions, addSeries);\n\n                    fireEvent(chart, 'drillup', {\n                        seriesOptions: level.seriesOptions\n                    });\n\n                    if (newSeries.type === oldSeries.type) {\n                        newSeries.drilldownLevel = level;\n                        newSeries.options.animation = chart.options.drilldown.animation;\n\n                        if (oldSeries.animateDrillupFrom && oldSeries.chart) { // #2919\n                            oldSeries.animateDrillupFrom(level);\n                        }\n                    }\n                    newSeries.options._levelNumber = levelNumber;\n\n                    oldSeries.remove(false);\n\n                    // Reset the zoom level of the upper series\n                    if (newSeries.xAxis) {\n                        oldExtremes = level.oldExtremes;\n                        newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);\n                        newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);\n                    }\n                }\n            }\n\n            // Fire a once-off event after all series have been drilled up (#5158)\n            fireEvent(chart, 'drillupall');\n\n            this.redraw();\n\n            if (this.drilldownLevels.length === 0) {\n                this.drillUpButton = this.drillUpButton.destroy();\n            } else {\n                this.drillUpButton.attr({\n                        text: this.getDrilldownBackText()\n                    })\n                    .align();\n            }\n\n            this.ddDupes.length = []; // #3315\n        };\n\n\n        ColumnSeries.prototype.supportsDrilldown = true;\n\n        /**\n         * When drilling up, keep the upper series invisible until the lower series has\n         * moved into place\n         */\n        ColumnSeries.prototype.animateDrillupTo = function(init) {\n            if (!init) {\n                var newSeries = this,\n                    level = newSeries.drilldownLevel;\n\n                // First hide all items before animating in again\n                each(this.points, function(point) {\n                    var dataLabel = point.dataLabel;\n\n                    if (point.graphic) { // #3407\n                        point.graphic.hide();\n                    }\n\n                    if (dataLabel) {\n                        // The data label is initially hidden, make sure it is not faded\n                        // in (#6127)\n                        dataLabel.hidden = dataLabel.attr('visibility') === 'hidden';\n\n                        if (!dataLabel.hidden) {\n                            dataLabel.hide();\n                            if (point.connector) {\n                                point.connector.hide();\n                            }\n                        }\n                    }\n                });\n\n\n                // Do dummy animation on first point to get to complete\n                setTimeout(function() {\n                    if (newSeries.points) { // May be destroyed in the meantime, #3389\n                        each(newSeries.points, function(point, i) {\n                            // Fade in other points\t\t\t  \n                            var verb =\n                                i === (level && level.pointIndex) ? 'show' : 'fadeIn',\n                                inherit = verb === 'show' ? true : undefined,\n                                dataLabel = point.dataLabel;\n\n\n                            if (point.graphic) { // #3407\n                                point.graphic[verb](inherit);\n                            }\n\n                            if (dataLabel && !dataLabel.hidden) { // #6127\n                                dataLabel[verb](inherit);\n                                if (point.connector) {\n                                    point.connector[verb](inherit);\n                                }\n                            }\n                        });\n                    }\n                }, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));\n\n                // Reset\n                this.animate = noop;\n            }\n\n        };\n\n        ColumnSeries.prototype.animateDrilldown = function(init) {\n            var series = this,\n                drilldownLevels = this.chart.drilldownLevels,\n                animateFrom,\n                animationOptions = this.chart.options.drilldown.animation,\n                xAxis = this.xAxis;\n\n            if (!init) {\n                each(drilldownLevels, function(level) {\n                    if (series.options._ddSeriesId === level.lowerSeriesOptions._ddSeriesId) {\n                        animateFrom = level.shapeArgs;\n\n                    }\n                });\n\n                animateFrom.x += (pick(xAxis.oldPos, xAxis.pos) - xAxis.pos);\n\n                each(this.points, function(point) {\n                    var animateTo = point.shapeArgs;\n\n\n\n                    if (point.graphic) {\n                        point.graphic\n                            .attr(animateFrom)\n                            .animate(\n                                extend(point.shapeArgs, {\n                                    fill: point.color || series.color\n                                }),\n                                animationOptions\n                            );\n                    }\n                    if (point.dataLabel) {\n                        point.dataLabel.fadeIn(animationOptions);\n                    }\n                });\n                this.animate = null;\n            }\n\n        };\n\n        /**\n         * When drilling up, pull out the individual point graphics from the lower series\n         * and animate them into the origin point in the upper series.\n         */\n        ColumnSeries.prototype.animateDrillupFrom = function(level) {\n            var animationOptions = this.chart.options.drilldown.animation,\n                group = this.group,\n                // For 3d column series all columns are added to one group \n                // so we should not delete the whole group. #5297\n                removeGroup = group !== this.chart.seriesGroup,\n                series = this;\n\n            // Cancel mouse events on the series group (#2787)\n            each(series.trackerGroups, function(key) {\n                if (series[key]) { // we don't always have dataLabelsGroup\n                    series[key].on('mouseover');\n                }\n            });\n\n            if (removeGroup) {\n                delete this.group;\n            }\n\n            each(this.points, function(point) {\n                var graphic = point.graphic,\n                    animateTo = level.shapeArgs,\n                    complete = function() {\n                        graphic.destroy();\n                        if (group && removeGroup) {\n                            group = group.destroy();\n                        }\n                    };\n\n                if (graphic) {\n\n                    delete point.graphic;\n\n\n\n                    if (animationOptions) {\n                        graphic.animate(\n                            animateTo,\n                            H.merge(animationOptions, {\n                                complete: complete\n                            })\n                        );\n                    } else {\n                        graphic.attr(animateTo);\n                        complete();\n                    }\n                }\n            });\n        };\n\n        if (PieSeries) {\n            extend(PieSeries.prototype, {\n                supportsDrilldown: true,\n                animateDrillupTo: ColumnSeries.prototype.animateDrillupTo,\n                animateDrillupFrom: ColumnSeries.prototype.animateDrillupFrom,\n\n                animateDrilldown: function(init) {\n                    var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],\n                        animationOptions = this.chart.options.drilldown.animation,\n                        animateFrom = level.shapeArgs,\n                        start = animateFrom.start,\n                        angle = animateFrom.end - start,\n                        startAngle = angle / this.points.length;\n\n                    if (!init) {\n                        each(this.points, function(point, i) {\n                            var animateTo = point.shapeArgs;\n\n\n\n                            if (point.graphic) {\n                                point.graphic\n                                    .attr(H.merge(animateFrom, {\n                                        start: start + i * startAngle,\n                                        end: start + (i + 1) * startAngle\n                                    }))[animationOptions ? 'animate' : 'attr'](\n                                        animateTo,\n                                        animationOptions\n                                    );\n                            }\n                        });\n                        this.animate = null;\n                    }\n                }\n            });\n        }\n\n        H.Point.prototype.doDrilldown = function(_holdRedraw, category, originalEvent) {\n            var series = this.series,\n                chart = series.chart,\n                drilldown = chart.options.drilldown,\n                i = (drilldown.series || []).length,\n                seriesOptions;\n\n            if (!chart.ddDupes) {\n                chart.ddDupes = [];\n            }\n\n            while (i-- && !seriesOptions) {\n                if (drilldown.series[i].id === this.drilldown && inArray(this.drilldown, chart.ddDupes) === -1) {\n                    seriesOptions = drilldown.series[i];\n                    chart.ddDupes.push(this.drilldown);\n                }\n            }\n\n            // Fire the event. If seriesOptions is undefined, the implementer can check for \n            // seriesOptions, and call addSeriesAsDrilldown async if necessary.\n            fireEvent(chart, 'drilldown', {\n                point: this,\n                seriesOptions: seriesOptions,\n                category: category,\n                originalEvent: originalEvent,\n                points: category !== undefined && this.series.xAxis.getDDPoints(category).slice(0)\n            }, function(e) {\n                var chart = e.point.series && e.point.series.chart,\n                    seriesOptions = e.seriesOptions;\n                if (chart && seriesOptions) {\n                    if (_holdRedraw) {\n                        chart.addSingleSeriesAsDrilldown(e.point, seriesOptions);\n                    } else {\n                        chart.addSeriesAsDrilldown(e.point, seriesOptions);\n                    }\n                }\n            });\n\n\n        };\n\n        /**\n         * Drill down to a given category. This is the same as clicking on an axis label.\n         */\n        H.Axis.prototype.drilldownCategory = function(x, e) {\n            objectEach(this.getDDPoints(x), function(point) {\n                if (point && point.series && point.series.visible && point.doDrilldown) { // #3197\n                    point.doDrilldown(true, x, e);\n                }\n            });\n            this.chart.applyDrilldown();\n        };\n\n        /**\n         * Return drillable points for this specific X value\n         */\n        H.Axis.prototype.getDDPoints = function(x) {\n            var ret = [];\n            each(this.series, function(series) {\n                var i,\n                    xData = series.xData,\n                    points = series.points;\n\n                for (i = 0; i < xData.length; i++) {\n                    if (xData[i] === x && series.options.data[i] && series.options.data[i].drilldown) {\n                        ret.push(points ? points[i] : true);\n                        break;\n                    }\n                }\n            });\n            return ret;\n        };\n\n\n        /**\n         * Make a tick label drillable, or remove drilling on update\n         */\n        Tick.prototype.drillable = function() {\n            var pos = this.pos,\n                label = this.label,\n                axis = this.axis,\n                isDrillable = axis.coll === 'xAxis' && axis.getDDPoints,\n                ddPointsX = isDrillable && axis.getDDPoints(pos);\n\n            if (isDrillable) {\n                if (label && ddPointsX.length) {\n                    label.drillable = true;\n\n\n\n                    label\n                        .addClass('highcharts-drilldown-axis-label')\n\n                        .on('click', function(e) {\n                            axis.drilldownCategory(pos, e);\n                        });\n\n                } else if (label && label.drillable) {\n\n\n\n                    label.on('click', null); // #3806\t\t\t\n                    label.removeClass('highcharts-drilldown-axis-label');\n                }\n            }\n        };\n\n        /**\n         * Always keep the drillability updated (#3951)\n         */\n        wrap(Tick.prototype, 'addLabel', function(proceed) {\n            proceed.call(this);\n            this.drillable();\n        });\n\n\n        /**\n         * On initialization of each point, identify its label and make it clickable. Also, provide a\n         * list of points associated to that label.\n         */\n        wrap(H.Point.prototype, 'init', function(proceed, series, options, x) {\n            var point = proceed.call(this, series, options, x),\n                xAxis = series.xAxis,\n                tick = xAxis && xAxis.ticks[x];\n\n            if (point.drilldown) {\n\n                // Add the click event to the point \n                H.addEvent(point, 'click', function(e) {\n                    if (series.xAxis && series.chart.options.drilldown.allowPointDrilldown === false) {\n                        series.xAxis.drilldownCategory(point.x, e); // #5822, x changed\n                    } else {\n                        point.doDrilldown(undefined, undefined, e);\n                    }\n                });\n                /*wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work\n                \tif (!this.hasImportedEvents) {\n                \t\tproceed.call(this);\n                \t\tH.addEvent(this, 'click', function () {\n                \t\t\tthis.doDrilldown();\n                \t\t});\n                \t}\n                });*/\n\n            }\n\n            // Add or remove click handler and style on the tick label\n            if (tick) {\n                tick.drillable();\n            }\n\n            return point;\n        });\n\n        wrap(H.Series.prototype, 'drawDataLabels', function(proceed) {\n            var css = this.chart.options.drilldown.activeDataLabelStyle,\n                renderer = this.chart.renderer;\n\n            proceed.call(this);\n\n            each(this.points, function(point) {\n                var pointCSS = {};\n                if (point.drilldown && point.dataLabel) {\n                    if (css.color === 'contrast') {\n                        pointCSS.color = renderer.getContrast(point.color || this.color);\n                    }\n                    point.dataLabel\n                        .addClass('highcharts-drilldown-data-label');\n\n\n                }\n            }, this);\n        });\n\n        // Mark the trackers with a pointer \n        var drawTrackerWrapper = function(proceed) {\n            proceed.call(this);\n            each(this.points, function(point) {\n                if (point.drilldown && point.graphic) {\n                    point.graphic.addClass('highcharts-drilldown-point');\n\n\n                }\n            });\n        };\n\n        objectEach(seriesTypes, function(seriesType) {\n            if (seriesType.prototype.supportsDrilldown) {\n                wrap(seriesType.prototype, 'drawTracker', drawTrackerWrapper);\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/export-data.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Exporting module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(d){var q=d.each,n=d.pick,k=d.win,p=k.document,a=d.seriesTypes,v=void 0!==p.createElement(\"a\").download;d.setOptions({lang:{downloadCSV:\"Download CSV\",downloadXLS:\"Download XLS\",viewData:\"View data table\"}});d.Chart.prototype.getDataRows=function(){var h=(this.options.exporting||{}).csv||{},b,c=this.xAxis,g={},r=[],m=[],f,l,u=h.dateFormat||\"%Y-%m-%d %H:%M:%S\",k=h.columnHeaderFormatter||function(e,\nf,b){return e instanceof d.Axis?e.options.title&&e.options.title.text||(e.isDatetimeAxis?\"DateTime\":\"Category\"):e?e.name+(1<b?\" (\"+f+\")\":\"\"):\"Category\"},t=[];f=0;q(this.series,function(e){var b=e.options.keys||e.pointArrayMap||[\"y\"],h=b.length,r=e.requireSorting,u={},l=d.inArray(e.xAxis,c),a;q(b,function(b){u[b]=e[b+\"Axis\"]&&e[b+\"Axis\"].categories||[]});if(!1!==e.options.includeInCSVExport&&!1!==e.visible){d.find(t,function(b){return b[0]===l})||t.push([l,f]);for(a=0;a<h;)m.push(k(e,b[a],b.length)),\na++;q(e.points,function(d,c){c=r?d.x:c;var m,k;a=0;g[c]||(g[c]=[],g[c].xValues=[]);g[c].x=d.x;g[c].xValues[l]=d.x;e.xAxis&&\"name\"!==e.exportKey||(g[c].name=d.name);for(;a<h;)m=b[a],k=d[m],g[c][f+a]=n(u[m][k],k),a++});f+=a}});for(l in g)g.hasOwnProperty(l)&&r.push(g[l]);var a,p,h=[m];for(f=t.length;f--;)a=t[f][0],p=t[f][1],b=c[a],r.sort(function(b,c){return b.xValues[a]-c.xValues[a]}),l=k(b),h[0].splice(p,0,l),q(r,function(e){var c=e.name;c||(b.isDatetimeAxis?(e.x instanceof Date&&(e.x=e.x.getTime()),\nc=d.dateFormat(u,e.x)):c=b.categories?n(b.names[e.x],b.categories[e.x],e.x):e.x);e.splice(p,0,c)});return h=h.concat(r)};d.Chart.prototype.getCSV=function(d){var b=\"\",c=this.getDataRows(),a=(this.options.exporting||{}).csv||{},h=a.itemDelimiter||\",\",m=a.lineDelimiter||\"\\n\";q(c,function(a,l){for(var f,g=a.length,k=d?(1.1).toLocaleString()[1]:\".\";g--;)f=a[g],\"string\"===typeof f&&(f='\"'+f+'\"'),\"number\"===typeof f&&\",\"===k&&(f=f.toString().replace(\".\",\",\")),a[g]=f;b+=a.join(h);l<c.length-1&&(b+=m)});\nreturn b};d.Chart.prototype.getTable=function(a){var b=\"\\x3ctable\\x3e\\x3cthead\\x3e\",c=this.getDataRows();q(c,function(c,d){var h=d?\"td\":\"th\",f,g,k=a?(1.1).toLocaleString()[1]:\".\";b+=\"\\x3ctr\\x3e\";for(g=0;g<c.length;g+=1)f=c[g],\"number\"===typeof f?(f=f.toString(),\",\"===k&&(f=f.replace(\".\",k)),b+=\"\\x3c\"+h+' class\\x3d\"number\"\\x3e'+f+\"\\x3c/\"+h+\"\\x3e\"):b+=\"\\x3c\"+h+\"\\x3e\"+(void 0===f?\"\":f)+\"\\x3c/\"+h+\"\\x3e\";b+=\"\\x3c/tr\\x3e\";d||(b+=\"\\x3c/thead\\x3e\\x3ctbody\\x3e\")});return b+=\"\\x3c/tbody\\x3e\\x3c/table\\x3e\"};\nd.Chart.prototype.fileDownload=function(a,b,c,g){var h,m=((this.options.exporting||{}).csv||{}).url||\"http://www.highcharts.com/studies/csv-export/download.php\";h=this.options.exporting.filename?this.options.exporting.filename:this.title?this.title.textStr.replace(/ /g,\"-\").toLowerCase():\"chart\";k.Blob&&k.navigator.msSaveOrOpenBlob?(a=new k.Blob([c]),k.navigator.msSaveOrOpenBlob(a,h+\".\"+b)):v?(c=p.createElement(\"a\"),c.href=a,c.target=\"_blank\",c.download=h+\".\"+b,this.container.append(c),c.click(),\nc.remove()):d.post(m,{data:c,type:g,extension:b})};d.Chart.prototype.downloadCSV=function(){var a=this.getCSV(!0);this.fileDownload(\"data:text/csv,\\ufeff\"+encodeURIComponent(a),\"csv\",a,\"text/csv\")};d.Chart.prototype.downloadXLS=function(){var a='\\x3chtml xmlns:o\\x3d\"urn:schemas-microsoft-com:office:office\" xmlns:x\\x3d\"urn:schemas-microsoft-com:office:excel\" xmlns\\x3d\"http://www.w3.org/TR/REC-html40\"\\x3e\\x3chead\\x3e\\x3c!--[if gte mso 9]\\x3e\\x3cxml\\x3e\\x3cx:ExcelWorkbook\\x3e\\x3cx:ExcelWorksheets\\x3e\\x3cx:ExcelWorksheet\\x3e\\x3cx:Name\\x3eArk1\\x3c/x:Name\\x3e\\x3cx:WorksheetOptions\\x3e\\x3cx:DisplayGridlines/\\x3e\\x3c/x:WorksheetOptions\\x3e\\x3c/x:ExcelWorksheet\\x3e\\x3c/x:ExcelWorksheets\\x3e\\x3c/x:ExcelWorkbook\\x3e\\x3c/xml\\x3e\\x3c![endif]--\\x3e\\x3cstyle\\x3etd{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:\"0.00\";}\\x3c/style\\x3e\\x3cmeta name\\x3dProgId content\\x3dExcel.Sheet\\x3e\\x3cmeta charset\\x3dUTF-8\\x3e\\x3c/head\\x3e\\x3cbody\\x3e'+\nthis.getTable(!0)+\"\\x3c/body\\x3e\\x3c/html\\x3e\";this.fileDownload(\"data:application/vnd.ms-excel;base64,\"+k.btoa(unescape(encodeURIComponent(a))),\"xls\",a,\"application/vnd.ms-excel\")};d.Chart.prototype.viewData=function(){this.dataTableDiv||(this.dataTableDiv=p.createElement(\"div\"),this.dataTableDiv.className=\"highcharts-data-table\",this.renderTo.parentNode.insertBefore(this.dataTableDiv,this.renderTo.nextSibling));this.dataTableDiv.innerHTML=this.getTable()};d.getOptions().exporting&&d.getOptions().exporting.buttons.contextButton.menuItems.push({textKey:\"downloadCSV\",\nonclick:function(){this.downloadCSV()}},{textKey:\"downloadXLS\",onclick:function(){this.downloadXLS()}},{textKey:\"viewData\",onclick:function(){this.viewData()}});a.map&&(a.map.prototype.exportKey=\"name\");a.mapbubble&&(a.mapbubble.prototype.exportKey=\"name\");a.treemap&&(a.treemap.prototype.exportKey=\"name\")})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/export-data.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Exporting module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Expoerimental data export module for Highcharts\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        // docs\n        // - After experimental release:\n        // - Move info in repo readme to docs/API.\n        // - Deprecate repo and plugins page\n        // - Update demos (esp accessibility) to use new URL\n        // - Before official release, set up systematic tests for all series types\n\n        /* eslint indent:0 */\n\n        var each = Highcharts.each,\n            pick = Highcharts.pick,\n            win = Highcharts.win,\n            doc = win.document,\n            seriesTypes = Highcharts.seriesTypes,\n            downloadAttrSupported = doc.createElement('a').download !== undefined;\n\n        Highcharts.setOptions({\n            lang: {\n                downloadCSV: 'Download CSV',\n                downloadXLS: 'Download XLS',\n                viewData: 'View data table'\n            }\n        });\n\n        /**\n         * Get the data rows as a two dimensional array\n         */\n        Highcharts.Chart.prototype.getDataRows = function() {\n            var options = (this.options.exporting || {}).csv || {},\n                xAxis,\n                xAxes = this.xAxis,\n                rows = {},\n                rowArr = [],\n                dataRows,\n                names = [],\n                i,\n                x,\n                xTitle,\n                // Options\n                dateFormat = options.dateFormat || '%Y-%m-%d %H:%M:%S',\n                columnHeaderFormatter = options.columnHeaderFormatter || function(item, key, keyLength) {\n                    if (item instanceof Highcharts.Axis) {\n                        return (item.options.title && item.options.title.text) ||\n                            (item.isDatetimeAxis ? 'DateTime' : 'Category');\n                    }\n                    return item ?\n                        item.name + (keyLength > 1 ? ' (' + key + ')' : '') :\n                        'Category';\n                },\n                xAxisIndices = [];\n\n            // Loop the series and index values\n            i = 0;\n            each(this.series, function(series) {\n                var keys = series.options.keys,\n                    pointArrayMap = keys || series.pointArrayMap || ['y'],\n                    valueCount = pointArrayMap.length,\n                    requireSorting = series.requireSorting,\n                    categoryMap = {},\n                    xAxisIndex = Highcharts.inArray(series.xAxis, xAxes),\n                    j;\n\n                // Map the categories for value axes\n                each(pointArrayMap, function(prop) {\n                    categoryMap[prop] = (series[prop + 'Axis'] && series[prop + 'Axis'].categories) || [];\n                });\n\n                if (series.options.includeInCSVExport !== false && series.visible !== false) { // #55\n\n                    // Build a lookup for X axis index and the position of the first\n                    // series that belongs to that X axis. Includes -1 for non-axis\n                    // series types like pies.\n                    if (!Highcharts.find(xAxisIndices, function(index) {\n                            return index[0] === xAxisIndex;\n                        })) {\n                        xAxisIndices.push([xAxisIndex, i]);\n                    }\n\n                    // Add the column headers, usually the same as series names\n                    j = 0;\n                    while (j < valueCount) {\n                        names.push(columnHeaderFormatter(series, pointArrayMap[j], pointArrayMap.length));\n                        j++;\n                    }\n\n                    each(series.points, function(point, pIdx) {\n                        var key = requireSorting ? point.x : pIdx,\n                            prop,\n                            val;\n\n                        j = 0;\n\n                        if (!rows[key]) {\n                            // Generate the row\n                            rows[key] = [];\n                            // Contain the X values from one or more X axes\n                            rows[key].xValues = [];\n                        }\n                        rows[key].x = point.x;\n                        rows[key].xValues[xAxisIndex] = point.x;\n\n                        // Pies, funnels, geo maps etc. use point name in X row\n                        if (!series.xAxis || series.exportKey === 'name') {\n                            rows[key].name = point.name;\n                        }\n\n                        while (j < valueCount) {\n                            prop = pointArrayMap[j]; // y, z etc\n                            val = point[prop];\n                            // Pick a Y axis category if present\n                            rows[key][i + j] = pick(categoryMap[prop][val], val);\n                            j++;\n                        }\n\n                    });\n                    i = i + j;\n                }\n            });\n\n            // Make a sortable array\n            for (x in rows) {\n                if (rows.hasOwnProperty(x)) {\n                    rowArr.push(rows[x]);\n                }\n            }\n\n            var xAxisIndex, column;\n            dataRows = [names];\n\n            i = xAxisIndices.length;\n            while (i--) { // Start from end to splice in\n                xAxisIndex = xAxisIndices[i][0];\n                column = xAxisIndices[i][1];\n                xAxis = xAxes[xAxisIndex];\n\n                // Sort it by X values\n                rowArr.sort(function(a, b) { // eslint-disable-line no-loop-func\n                    return a.xValues[xAxisIndex] - b.xValues[xAxisIndex];\n                });\n\n                // Add header row\n                xTitle = columnHeaderFormatter(xAxis);\n                //dataRows = [[xTitle].concat(names)];\n                dataRows[0].splice(column, 0, xTitle);\n\n                // Add the category column\n                each(rowArr, function(row) { // eslint-disable-line no-loop-func\n                    var category = row.name;\n                    if (!category) {\n                        if (xAxis.isDatetimeAxis) {\n                            if (row.x instanceof Date) {\n                                row.x = row.x.getTime();\n                            }\n                            category = Highcharts.dateFormat(dateFormat, row.x);\n                        } else if (xAxis.categories) {\n                            category = pick(\n                                xAxis.names[row.x],\n                                xAxis.categories[row.x],\n                                row.x\n                            );\n                        } else {\n                            category = row.x;\n                        }\n                    }\n\n                    // Add the X/date/category\n                    row.splice(column, 0, category);\n                });\n            }\n            dataRows = dataRows.concat(rowArr);\n\n            return dataRows;\n        };\n\n        /**\n         * Get a CSV string\n         */\n        Highcharts.Chart.prototype.getCSV = function(useLocalDecimalPoint) {\n            var csv = '',\n                rows = this.getDataRows(),\n                options = (this.options.exporting || {}).csv || {},\n                itemDelimiter = options.itemDelimiter || ',', // use ';' for direct to Excel\n                lineDelimiter = options.lineDelimiter || '\\n'; // '\\n' isn't working with the js csv data extraction\n\n            // Transform the rows to CSV\n            each(rows, function(row, i) {\n                var val = '',\n                    j = row.length,\n                    n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';\n                while (j--) {\n                    val = row[j];\n                    if (typeof val === 'string') {\n                        val = '\"' + val + '\"';\n                    }\n                    if (typeof val === 'number') {\n                        if (n === ',') {\n                            val = val.toString().replace('.', ',');\n                        }\n                    }\n                    row[j] = val;\n                }\n                // Add the values\n                csv += row.join(itemDelimiter);\n\n                // Add the line delimiter\n                if (i < rows.length - 1) {\n                    csv += lineDelimiter;\n                }\n            });\n            return csv;\n        };\n\n        /**\n         * Build a HTML table with the data\n         */\n        Highcharts.Chart.prototype.getTable = function(useLocalDecimalPoint) {\n            var html = '<table><thead>',\n                rows = this.getDataRows();\n\n            // Transform the rows to HTML\n            each(rows, function(row, i) {\n                var tag = i ? 'td' : 'th',\n                    val,\n                    j,\n                    n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';\n\n                html += '<tr>';\n                for (j = 0; j < row.length; j = j + 1) {\n                    val = row[j];\n                    // Add the cell\n                    if (typeof val === 'number') {\n                        val = val.toString();\n                        if (n === ',') {\n                            val = val.replace('.', n);\n                        }\n                        html += '<' + tag + ' class=\"number\">' + val + '</' + tag + '>';\n\n                    } else {\n                        html += '<' + tag + '>' + (val === undefined ? '' : val) + '</' + tag + '>';\n                    }\n                }\n\n                html += '</tr>';\n\n                // After the first row, end head and start body\n                if (!i) {\n                    html += '</thead><tbody>';\n                }\n\n            });\n            html += '</tbody></table>';\n\n            return html;\n        };\n\n        Highcharts.Chart.prototype.fileDownload = function(href, extension, content, MIME) {\n            var a,\n                blobObject,\n                name,\n                options = (this.options.exporting || {}).csv || {},\n                url = options.url || 'http://www.highcharts.com/studies/csv-export/download.php';\n\n            if (this.options.exporting.filename) {\n                name = this.options.exporting.filename;\n            } else if (this.title) {\n                name = this.title.textStr.replace(/ /g, '-').toLowerCase();\n            } else {\n                name = 'chart';\n            }\n\n            // MS specific. Check this first because of bug with Edge (#76)\n            if (win.Blob && win.navigator.msSaveOrOpenBlob) {\n                // Falls to msSaveOrOpenBlob if download attribute is not supported\n                blobObject = new win.Blob([content]);\n                win.navigator.msSaveOrOpenBlob(blobObject, name + '.' + extension);\n\n                // Download attribute supported\n            } else if (downloadAttrSupported) {\n                a = doc.createElement('a');\n                a.href = href;\n                a.target = '_blank';\n                a.download = name + '.' + extension;\n                this.container.append(a); // #111\n                a.click();\n                a.remove();\n\n            } else {\n                // Fall back to server side handling\n                Highcharts.post(url, {\n                    data: content,\n                    type: MIME,\n                    extension: extension\n                });\n            }\n        };\n\n        /**\n         * Call this on click of 'Download CSV' button\n         */\n        Highcharts.Chart.prototype.downloadCSV = function() {\n            var csv = this.getCSV(true);\n            this.fileDownload(\n                'data:text/csv,\\uFEFF' + encodeURIComponent(csv),\n                'csv',\n                csv,\n                'text/csv'\n            );\n        };\n\n        /**\n         * Call this on click of 'Download XLS' button\n         */\n        Highcharts.Chart.prototype.downloadXLS = function() {\n            var uri = 'data:application/vnd.ms-excel;base64,',\n                template = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">' +\n                '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>' +\n                '<x:Name>Ark1</x:Name>' +\n                '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->' +\n                '<style>td{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:\"0.00\";}</style>' +\n                '<meta name=ProgId content=Excel.Sheet>' +\n                '<meta charset=UTF-8>' +\n                '</head><body>' +\n                this.getTable(true) +\n                '</body></html>',\n                base64 = function(s) {\n                    return win.btoa(unescape(encodeURIComponent(s))); // #50\n                };\n            this.fileDownload(\n                uri + base64(template),\n                'xls',\n                template,\n                'application/vnd.ms-excel'\n            );\n        };\n\n        /**\n         * View the data in a table below the chart\n         */\n        Highcharts.Chart.prototype.viewData = function() {\n            if (!this.dataTableDiv) {\n                this.dataTableDiv = doc.createElement('div');\n                this.dataTableDiv.className = 'highcharts-data-table';\n\n                // Insert after the chart container\n                this.renderTo.parentNode.insertBefore(\n                    this.dataTableDiv,\n                    this.renderTo.nextSibling\n                );\n            }\n\n            this.dataTableDiv.innerHTML = this.getTable();\n        };\n\n\n        // Add \"Download CSV\" to the exporting menu. Use download attribute if supported, else\n        // run a simple PHP script that returns a file. The source code for the PHP script can be viewed at\n        // https://raw.github.com/highslide-software/highcharts.com/master/studies/csv-export/csv.php\n        if (Highcharts.getOptions().exporting) {\n            Highcharts.getOptions().exporting.buttons.contextButton.menuItems.push({\n                textKey: 'downloadCSV',\n                onclick: function() {\n                    this.downloadCSV();\n                }\n            }, {\n                textKey: 'downloadXLS',\n                onclick: function() {\n                    this.downloadXLS();\n                }\n            }, {\n                textKey: 'viewData',\n                onclick: function() {\n                    this.viewData();\n                }\n            });\n        }\n\n        // Series specific\n        if (seriesTypes.map) {\n            seriesTypes.map.prototype.exportKey = 'name';\n        }\n        if (seriesTypes.mapbubble) {\n            seriesTypes.mapbubble.prototype.exportKey = 'name';\n        }\n        if (seriesTypes.treemap) {\n            seriesTypes.treemap.prototype.exportKey = 'name';\n        }\n\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/exporting.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Exporting module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(e){var p=e.defaultOptions,t=e.doc,B=e.Chart,u=e.addEvent,K=e.removeEvent,H=e.fireEvent,n=e.createElement,D=e.discardElement,I=e.css,x=e.merge,E=e.pick,k=e.each,F=e.objectEach,y=e.extend,z=e.win,J=z.navigator.userAgent,G=e.SVGRenderer,L=e.Renderer.prototype.symbols,M=/Edge\\/|Trident\\/|MSIE /.test(J),N=/firefox/i.test(J);y(p.lang,{printChart:\"Print chart\",downloadPNG:\"Download PNG image\",downloadJPEG:\"Download JPEG image\",\ndownloadPDF:\"Download PDF document\",downloadSVG:\"Download SVG vector image\",contextButtonTitle:\"Chart context menu\"});p.navigation={buttonOptions:{theme:{},symbolSize:14,symbolX:12.5,symbolY:10.5,align:\"right\",buttonSpacing:3,height:22,verticalAlign:\"top\",width:24}};p.exporting={type:\"image/png\",url:\"https://export.highcharts.com/\",printMaxWidth:780,scale:2,buttons:{contextButton:{className:\"highcharts-contextbutton\",menuClassName:\"highcharts-contextmenu\",symbol:\"menu\",_titleKey:\"contextButtonTitle\",\nmenuItems:[{textKey:\"printChart\",onclick:function(){this.print()}},{separator:!0},{textKey:\"downloadPNG\",onclick:function(){this.exportChart()}},{textKey:\"downloadJPEG\",onclick:function(){this.exportChart({type:\"image/jpeg\"})}},{textKey:\"downloadPDF\",onclick:function(){this.exportChart({type:\"application/pdf\"})}},{textKey:\"downloadSVG\",onclick:function(){this.exportChart({type:\"image/svg+xml\"})}}]}}};e.post=function(a,b,c){var d=n(\"form\",x({method:\"post\",action:a,enctype:\"multipart/form-data\"},c),\n{display:\"none\"},t.body);F(b,function(a,b){n(\"input\",{type:\"hidden\",name:b,value:a},null,d)});d.submit();D(d)};y(B.prototype,{sanitizeSVG:function(a,b){if(b&&b.exporting&&b.exporting.allowHTML){var c=a.match(/<\\/svg>(.*?$)/);c&&c[1]&&(c='\\x3cforeignObject x\\x3d\"0\" y\\x3d\"0\" width\\x3d\"'+b.chart.width+'\" height\\x3d\"'+b.chart.height+'\"\\x3e\\x3cbody xmlns\\x3d\"http://www.w3.org/1999/xhtml\"\\x3e'+c[1]+\"\\x3c/body\\x3e\\x3c/foreignObject\\x3e\",a=a.replace(\"\\x3c/svg\\x3e\",c+\"\\x3c/svg\\x3e\"))}return a=a.replace(/zIndex=\"[^\"]+\"/g,\n\"\").replace(/isShadow=\"[^\"]+\"/g,\"\").replace(/symbolName=\"[^\"]+\"/g,\"\").replace(/jQuery[0-9]+=\"[^\"]+\"/g,\"\").replace(/url\\((\"|&quot;)(\\S+)(\"|&quot;)\\)/g,\"url($2)\").replace(/url\\([^#]+#/g,\"url(#\").replace(/<svg /,'\\x3csvg xmlns:xlink\\x3d\"http://www.w3.org/1999/xlink\" ').replace(/ (NS[0-9]+\\:)?href=/g,\" xlink:href\\x3d\").replace(/\\n/,\" \").replace(/<\\/svg>.*?$/,\"\\x3c/svg\\x3e\").replace(/(fill|stroke)=\"rgba\\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\\.]+)\\)\"/g,'$1\\x3d\"rgb($2)\" $1-opacity\\x3d\"$3\"').replace(/&nbsp;/g,\n\"\\u00a0\").replace(/&shy;/g,\"\\u00ad\")},getChartHTML:function(){this.inlineStyles();return this.container.innerHTML},getSVG:function(a){var b,c,d,v,l,g=x(this.options,a);t.createElementNS||(t.createElementNS=function(a,b){return t.createElement(b)});c=n(\"div\",null,{position:\"absolute\",top:\"-9999em\",width:this.chartWidth+\"px\",height:this.chartHeight+\"px\"},t.body);d=this.renderTo.style.width;l=this.renderTo.style.height;d=g.exporting.sourceWidth||g.chart.width||/px$/.test(d)&&parseInt(d,10)||600;l=g.exporting.sourceHeight||\ng.chart.height||/px$/.test(l)&&parseInt(l,10)||400;y(g.chart,{animation:!1,renderTo:c,forExport:!0,renderer:\"SVGRenderer\",width:d,height:l});g.exporting.enabled=!1;delete g.data;g.series=[];k(this.series,function(a){v=x(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});v.isInternal||g.series.push(v)});k(this.axes,function(a){a.userOptions.internalKey||(a.userOptions.internalKey=e.uniqueKey())});b=new e.Chart(g,this.callback);a&&k([\"xAxis\",\"yAxis\",\"series\"],function(d){var c=\n{};a[d]&&(c[d]=a[d],b.update(c))});k(this.axes,function(a){var d=e.find(b.axes,function(b){return b.options.internalKey===a.userOptions.internalKey}),c=a.getExtremes(),f=c.userMin,c=c.userMax;!d||void 0===f&&void 0===c||d.setExtremes(f,c,!0,!1)});d=b.getChartHTML();d=this.sanitizeSVG(d,g);g=null;b.destroy();D(c);return d},getSVGForExport:function(a,b){var c=this.options.exporting;return this.getSVG(x({chart:{borderRadius:0}},c.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||c.sourceWidth,\nsourceHeight:a&&a.sourceHeight||c.sourceHeight}}))},exportChart:function(a,b){b=this.getSVGForExport(a,b);a=x(this.options.exporting,a);e.post(a.url,{filename:a.filename||\"chart\",type:a.type,width:a.width||0,scale:a.scale,svg:b},a.formAttributes)},print:function(){var a=this,b=a.container,c=[],d=b.parentNode,e=t.body,l=e.childNodes,g=a.options.exporting.printMaxWidth,f,m;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);H(a,\"beforePrint\");if(m=g&&a.chartWidth>g)f=[a.options.chart.width,void 0,\n!1],a.setSize(g,void 0,!1);k(l,function(a,b){1===a.nodeType&&(c[b]=a.style.display,a.style.display=\"none\")});e.appendChild(b);z.focus();z.print();setTimeout(function(){d.appendChild(b);k(l,function(a,b){1===a.nodeType&&(a.style.display=c[b])});a.isPrinting=!1;m&&a.setSize.apply(a,f);H(a,\"afterPrint\")},1E3)}},contextMenu:function(a,b,c,d,e,l,g){var f=this,m=f.chartWidth,q=f.chartHeight,v=\"cache-\"+a,h=f[v],r=Math.max(e,l),C,w;h||(f[v]=h=n(\"div\",{className:a},{position:\"absolute\",zIndex:1E3,padding:r+\n\"px\"},f.container),C=n(\"div\",{className:\"highcharts-menu\"},null,h),w=function(){I(h,{display:\"none\"});g&&g.setState(0);f.openMenu=!1},f.exportEvents.push(u(h,\"mouseleave\",function(){h.hideTimer=setTimeout(w,500)}),u(h,\"mouseenter\",function(){clearTimeout(h.hideTimer)}),u(t,\"mouseup\",function(b){f.pointer.inClass(b.target,a)||w()})),k(b,function(a){if(a){var b;b=a.separator?n(\"hr\",null,null,C):n(\"div\",{className:\"highcharts-menu-item\",onclick:function(b){b&&b.stopPropagation();w();a.onclick&&a.onclick.apply(f,\narguments)},innerHTML:a.text||f.options.lang[a.textKey]},null,C);f.exportDivElements.push(b)}}),f.exportDivElements.push(C,h),f.exportMenuWidth=h.offsetWidth,f.exportMenuHeight=h.offsetHeight);b={display:\"block\"};c+f.exportMenuWidth>m?b.right=m-c-e-r+\"px\":b.left=c-r+\"px\";d+l+f.exportMenuHeight>q&&\"top\"!==g.alignOptions.verticalAlign?b.bottom=q-d-r+\"px\":b.top=d+l-r+\"px\";I(h,b);f.openMenu=!0},addButton:function(a){var b=this,c=b.renderer,d=x(b.options.navigation.buttonOptions,a),e=d.onclick,l=d.menuItems,\ng,f,m=d.symbolSize||12;b.btnCount||(b.btnCount=0);b.exportDivElements||(b.exportDivElements=[],b.exportSVGElements=[]);if(!1!==d.enabled){var q=d.theme,k=q.states,h=k&&k.hover,k=k&&k.select,r;delete q.states;e?r=function(a){a.stopPropagation();e.call(b,a)}:l&&(r=function(){b.contextMenu(f.menuClassName,l,f.translateX,f.translateY,f.width,f.height,f);f.setState(2)});d.text&&d.symbol?q.paddingLeft=E(q.paddingLeft,25):d.text||y(q,{width:d.width,height:d.height,padding:0});f=c.button(d.text,0,0,r,q,h,\nk).addClass(a.className).attr({title:b.options.lang[d._titleKey],zIndex:3});f.menuClassName=a.menuClassName||\"highcharts-menu-\"+b.btnCount++;d.symbol&&(g=c.symbol(d.symbol,d.symbolX-m/2,d.symbolY-m/2,m,m).addClass(\"highcharts-button-symbol\").attr({zIndex:1}).add(f));f.add().align(y(d,{width:f.width,x:E(d.x,b.buttonOffset)}),!0,\"spacingBox\");b.buttonOffset+=(f.width+d.buttonSpacing)*(\"right\"===d.align?-1:1);b.exportSVGElements.push(f,g)}},destroyExport:function(a){var b=a?a.target:this;a=b.exportSVGElements;\nvar c=b.exportDivElements,d=b.exportEvents,e;a&&(k(a,function(a,d){a&&(a.onclick=a.ontouchstart=null,e=\"cache-\"+a.menuClassName,b[e]&&delete b[e],b.exportSVGElements[d]=a.destroy())}),a.length=0);c&&(k(c,function(a,d){clearTimeout(a.hideTimer);K(a,\"mouseleave\");b.exportDivElements[d]=a.onmouseout=a.onmouseover=a.ontouchstart=a.onclick=null;D(a)}),c.length=0);d&&(k(d,function(a){a()}),d.length=0)}});G.prototype.inlineToAttributes=\"fill stroke strokeLinecap strokeLinejoin strokeWidth textAnchor x y\".split(\" \");\nG.prototype.inlineBlacklist=[/-/,/^(clipPath|cssText|d|height|width)$/,/^font$/,/[lL]ogical(Width|Height)$/,/perspective/,/TapHighlightColor/,/^transition/];G.prototype.unstyledElements=[\"clipPath\",\"defs\",\"desc\"];B.prototype.inlineStyles=function(){function a(a){return a.replace(/([A-Z])/g,function(a,b){return\"-\"+b.toLowerCase()})}function b(c){function q(b,e){n=u=!1;if(l){for(A=l.length;A--&&!u;)u=l[A].test(e);n=!u}\"transform\"===e&&\"none\"===b&&(n=!0);for(A=v.length;A--&&!n;)n=v[A].test(e)||\"function\"===\ntypeof b;n||r[e]!==b&&f[c.nodeName][e]!==b&&(-1!==d.indexOf(e)?c.setAttribute(a(e),b):p+=a(e)+\":\"+b+\";\")}var h,r,p=\"\",w,n,u,A;if(1===c.nodeType&&-1===g.indexOf(c.nodeName)){h=z.getComputedStyle(c,null);r=\"svg\"===c.nodeName?{}:z.getComputedStyle(c.parentNode,null);f[c.nodeName]||(m||(m=t.createElementNS(e.SVG_NS,\"svg\"),m.setAttribute(\"version\",\"1.1\"),t.body.appendChild(m)),w=t.createElementNS(c.namespaceURI,c.nodeName),m.appendChild(w),f[c.nodeName]=x(z.getComputedStyle(w,null)),m.removeChild(w));\nif(N||M)for(var y in h)q(h[y],y);else F(h,q);p&&(h=c.getAttribute(\"style\"),c.setAttribute(\"style\",(h?h+\";\":\"\")+p));\"svg\"===c.nodeName&&c.setAttribute(\"stroke-width\",\"1px\");\"text\"!==c.nodeName&&k(c.children||c.childNodes,b)}}var c=this.renderer,d=c.inlineToAttributes,v=c.inlineBlacklist,l=c.inlineWhitelist,g=c.unstyledElements,f={},m;b(this.container.querySelector(\"svg\"));m.parentNode.removeChild(m)};L.menu=function(a,b,c,d){return[\"M\",a,b+2.5,\"L\",a+c,b+2.5,\"M\",a,b+d/2+.5,\"L\",a+c,b+d/2+.5,\"M\",a,b+\nd-1.5,\"L\",a+c,b+d-1.5]};B.prototype.renderExporting=function(){var a=this,b=a.options.exporting,c=b.buttons,d=a.isDirtyExporting||!a.exportSVGElements;a.buttonOffset=0;a.isDirtyExporting&&a.destroyExport();d&&!1!==b.enabled&&(a.exportEvents=[],F(c,function(b){a.addButton(b)}),a.isDirtyExporting=!1);u(a,\"destroy\",a.destroyExport)};B.prototype.callbacks.push(function(a){a.renderExporting();u(a,\"redraw\",a.renderExporting);k([\"exporting\",\"navigation\"],function(b){a[b]={update:function(c,d){a.isDirtyExporting=\n!0;x(!0,a.options[b],c);E(d,!0)&&a.redraw()}}})})})(p)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/exporting.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Exporting module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Exporting module\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /* eslint indent:0 */\n\n        // create shortcuts\n        var defaultOptions = H.defaultOptions,\n            doc = H.doc,\n            Chart = H.Chart,\n            addEvent = H.addEvent,\n            removeEvent = H.removeEvent,\n            fireEvent = H.fireEvent,\n            createElement = H.createElement,\n            discardElement = H.discardElement,\n            css = H.css,\n            merge = H.merge,\n            pick = H.pick,\n            each = H.each,\n            objectEach = H.objectEach,\n            extend = H.extend,\n            isTouchDevice = H.isTouchDevice,\n            win = H.win,\n            userAgent = win.navigator.userAgent,\n            SVGRenderer = H.SVGRenderer,\n            symbols = H.Renderer.prototype.symbols,\n            isMSBrowser = /Edge\\/|Trident\\/|MSIE /.test(userAgent),\n            isFirefoxBrowser = /firefox/i.test(userAgent);\n\n        // Add language\n        extend(defaultOptions.lang, {\n            printChart: 'Print chart',\n            downloadPNG: 'Download PNG image',\n            downloadJPEG: 'Download JPEG image',\n            downloadPDF: 'Download PDF document',\n            downloadSVG: 'Download SVG vector image',\n            contextButtonTitle: 'Chart context menu'\n        });\n\n        // Buttons and menus are collected in a separate config option set called 'navigation'.\n        // This can be extended later to add control buttons like zoom and pan right click menus.\n        defaultOptions.navigation = {\n            buttonOptions: {\n                theme: {},\n                symbolSize: 14,\n                symbolX: 12.5,\n                symbolY: 10.5,\n                align: 'right',\n                buttonSpacing: 3,\n                height: 22,\n                // text: null,\n                verticalAlign: 'top',\n                width: 24\n            }\n        };\n\n\n\n\n        // Add the export related options\n        defaultOptions.exporting = {\n            //enabled: true,\n            //filename: 'chart',\n            type: 'image/png',\n            url: 'https://export.highcharts.com/',\n            //width: undefined,\n            printMaxWidth: 780,\n            scale: 2,\n            buttons: {\n                contextButton: {\n                    className: 'highcharts-contextbutton',\n                    menuClassName: 'highcharts-contextmenu',\n                    //x: -10,\n                    symbol: 'menu',\n                    _titleKey: 'contextButtonTitle',\n                    menuItems: [{\n                        textKey: 'printChart',\n                        onclick: function() {\n                            this.print();\n                        }\n                    }, {\n                        separator: true\n                    }, {\n                        textKey: 'downloadPNG',\n                        onclick: function() {\n                            this.exportChart();\n                        }\n                    }, {\n                        textKey: 'downloadJPEG',\n                        onclick: function() {\n                            this.exportChart({\n                                type: 'image/jpeg'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadPDF',\n                        onclick: function() {\n                            this.exportChart({\n                                type: 'application/pdf'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadSVG',\n                        onclick: function() {\n                            this.exportChart({\n                                type: 'image/svg+xml'\n                            });\n                        }\n                    }]\n                }\n            }\n        };\n\n        // Add the H.post utility\n        H.post = function(url, data, formAttributes) {\n            // create the form\n            var form = createElement('form', merge({\n                method: 'post',\n                action: url,\n                enctype: 'multipart/form-data'\n            }, formAttributes), {\n                display: 'none'\n            }, doc.body);\n\n            // add the data\n            objectEach(data, function(val, name) {\n                createElement('input', {\n                    type: 'hidden',\n                    name: name,\n                    value: val\n                }, null, form);\n            });\n\n            // submit\n            form.submit();\n\n            // clean up\n            discardElement(form);\n        };\n\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n            /**\n             * A collection of fixes on the produced SVG to account for expando properties,\n             * browser bugs, VML problems and other. Returns a cleaned SVG.\n             */\n            sanitizeSVG: function(svg, options) {\n                // Move HTML into a foreignObject\n                if (options && options.exporting && options.exporting.allowHTML) {\n                    var html = svg.match(/<\\/svg>(.*?$)/);\n                    if (html && html[1]) {\n                        html = '<foreignObject x=\"0\" y=\"0\" ' +\n                            'width=\"' + options.chart.width + '\" ' +\n                            'height=\"' + options.chart.height + '\">' +\n                            '<body xmlns=\"http://www.w3.org/1999/xhtml\">' +\n                            html[1] +\n                            '</body>' +\n                            '</foreignObject>';\n                        svg = svg.replace('</svg>', html + '</svg>');\n                    }\n                }\n\n                svg = svg\n                    .replace(/zIndex=\"[^\"]+\"/g, '')\n                    .replace(/isShadow=\"[^\"]+\"/g, '')\n                    .replace(/symbolName=\"[^\"]+\"/g, '')\n                    .replace(/jQuery[0-9]+=\"[^\"]+\"/g, '')\n                    .replace(/url\\((\"|&quot;)(\\S+)(\"|&quot;)\\)/g, 'url($2)')\n                    .replace(/url\\([^#]+#/g, 'url(#')\n                    .replace(/<svg /, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ')\n                    .replace(/ (NS[0-9]+\\:)?href=/g, ' xlink:href=') // #3567\n                    .replace(/\\n/, ' ')\n                    // Any HTML added to the container after the SVG (#894)\n                    .replace(/<\\/svg>.*?$/, '</svg>')\n                    // Batik doesn't support rgba fills and strokes (#3095)\n                    .replace(/(fill|stroke)=\"rgba\\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\\.]+)\\)\"/g, '$1=\"rgb($2)\" $1-opacity=\"$3\"')\n                    /* This fails in IE < 8\n                    .replace(/([0-9]+)\\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight\n                    \treturn s2 +'.'+ s3[0];\n                    })*/\n\n                    // Replace HTML entities, issue #347\n                    .replace(/&nbsp;/g, '\\u00A0') // no-break space\n                    .replace(/&shy;/g, '\\u00AD'); // soft hyphen\n\n\n\n                return svg;\n            },\n\n            /**\n             * Return innerHTML of chart. Used as hook for plugins.\n             */\n            getChartHTML: function() {\n\n                this.inlineStyles();\n\n                return this.container.innerHTML;\n            },\n\n            /**\n             * Return an SVG representation of the chart.\n             *\n             * @param  chartOptions {Options}\n             *         Additional chart options for the generated SVG representation.\n             *         For collections like `xAxis`, `yAxis` or `series`, the additional\n             *         options is either merged in to the orininal item of the same\n             *         `id`, or to the first item if a common id is not found.\n             * @return {String}\n             *         The SVG representation of the rendered chart.\n             * @sample highcharts/members/chart-getsvg/\n             *         View the SVG from a button\n             */\n            getSVG: function(chartOptions) {\n                var chart = this,\n                    chartCopy,\n                    sandbox,\n                    svg,\n                    seriesOptions,\n                    sourceWidth,\n                    sourceHeight,\n                    cssWidth,\n                    cssHeight,\n                    options = merge(chart.options, chartOptions); // copy the options and add extra options\n\n\n                // IE compatibility hack for generating SVG content that it doesn't really understand\n                if (!doc.createElementNS) {\n                    doc.createElementNS = function(ns, tagName) {\n                        return doc.createElement(tagName);\n                    };\n                }\n\n                // create a sandbox where a new chart will be generated\n                sandbox = createElement('div', null, {\n                    position: 'absolute',\n                    top: '-9999em',\n                    width: chart.chartWidth + 'px',\n                    height: chart.chartHeight + 'px'\n                }, doc.body);\n\n                // get the source size\n                cssWidth = chart.renderTo.style.width;\n                cssHeight = chart.renderTo.style.height;\n                sourceWidth = options.exporting.sourceWidth ||\n                    options.chart.width ||\n                    (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||\n                    600;\n                sourceHeight = options.exporting.sourceHeight ||\n                    options.chart.height ||\n                    (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||\n                    400;\n\n                // override some options\n                extend(options.chart, {\n                    animation: false,\n                    renderTo: sandbox,\n                    forExport: true,\n                    renderer: 'SVGRenderer',\n                    width: sourceWidth,\n                    height: sourceHeight\n                });\n                options.exporting.enabled = false; // hide buttons in print\n                delete options.data; // #3004\n\n                // prepare for replicating the chart\n                options.series = [];\n                each(chart.series, function(serie) {\n                    seriesOptions = merge(serie.userOptions, { // #4912\n                        animation: false, // turn off animation\n                        enableMouseTracking: false,\n                        showCheckbox: false,\n                        visible: serie.visible\n                    });\n\n                    if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set\n                        options.series.push(seriesOptions);\n                    }\n                });\n\n                // Assign an internal key to ensure a one-to-one mapping (#5924)\n                each(chart.axes, function(axis) {\n                    if (!axis.userOptions.internalKey) { // #6444\n                        axis.userOptions.internalKey = H.uniqueKey();\n                    }\n                });\n\n                // generate the chart copy\n                chartCopy = new H.Chart(options, chart.callback);\n\n                // Axis options and series options  (#2022, #3900, #5982)\n                if (chartOptions) {\n                    each(['xAxis', 'yAxis', 'series'], function(coll) {\n                        var collOptions = {};\n                        if (chartOptions[coll]) {\n                            collOptions[coll] = chartOptions[coll];\n                            chartCopy.update(collOptions);\n                        }\n                    });\n                }\n\n                // Reflect axis extremes in the export (#5924)\n                each(chart.axes, function(axis) {\n                    var axisCopy = H.find(chartCopy.axes, function(copy) {\n                            return copy.options.internalKey ===\n                                axis.userOptions.internalKey;\n                        }),\n                        extremes = axis.getExtremes(),\n                        userMin = extremes.userMin,\n                        userMax = extremes.userMax;\n\n                    if (axisCopy && (userMin !== undefined || userMax !== undefined)) {\n                        axisCopy.setExtremes(userMin, userMax, true, false);\n                    }\n                });\n\n                // Get the SVG from the container's innerHTML\n                svg = chartCopy.getChartHTML();\n\n                svg = chart.sanitizeSVG(svg, options);\n\n                // free up memory\n                options = null;\n                chartCopy.destroy();\n                discardElement(sandbox);\n\n                return svg;\n            },\n\n            getSVGForExport: function(options, chartOptions) {\n                var chartExportingOptions = this.options.exporting;\n\n                return this.getSVG(merge({\n                        chart: {\n                            borderRadius: 0\n                        }\n                    },\n                    chartExportingOptions.chartOptions,\n                    chartOptions, {\n                        exporting: {\n                            sourceWidth: (options && options.sourceWidth) || chartExportingOptions.sourceWidth,\n                            sourceHeight: (options && options.sourceHeight) || chartExportingOptions.sourceHeight\n                        }\n                    }\n                ));\n            },\n\n            /**\n             * Exporting module required. Submit an SVG version of the chart to a server\n             * along with some parameters for conversion.\n             * @param  {Object} exportingOptions\n             *         Exporting options in addition to those defined in {@link\n             *         https://api.highcharts.com/highcharts/exporting|exporting}.\n             * @param  {String} exportingOptions.filename\n             *         The file name for the export without extension.\n             * @param  {String} exportingOptions.url\n             *         The URL for the server module to do the conversion.\n             * @param  {Number} exportingOptions.width\n             *         The width of the PNG or JPG image generated on the server.\n             * @param  {String} exportingOptions.type\n             *         The MIME type of the converted image.\n             * @param  {Number} exportingOptions.sourceWidth\n             *         The pixel width of the source (in-page) chart.\n             * @param  {Number} exportingOptions.sourceHeight\n             *         The pixel height of the source (in-page) chart.\n             * @param  {Options} chartOptions\n             *         Additional chart options for the exported chart. For example a\n             *         different background color can be added here, or `dataLabels`\n             *         for export only.\n             *\n             * @sample highcharts/members/chart-exportchart/\n             *         Export with no options\n             * @sample highcharts/members/chart-exportchart-filename/\n             *         PDF type and custom filename\n             * @sample highcharts/members/chart-exportchart-custom-background/\n             *         Different chart background in export\n             * @sample stock/members/chart-exportchart/\n             *         Export with Highstock\n             */\n            exportChart: function(exportingOptions, chartOptions) {\n\n                var svg = this.getSVGForExport(exportingOptions, chartOptions);\n\n                // merge the options\n                exportingOptions = merge(this.options.exporting, exportingOptions);\n\n                // do the post\n                H.post(exportingOptions.url, {\n                    filename: exportingOptions.filename || 'chart',\n                    type: exportingOptions.type,\n                    width: exportingOptions.width || 0, // IE8 fails to post undefined correctly, so use 0\n                    scale: exportingOptions.scale,\n                    svg: svg\n                }, exportingOptions.formAttributes);\n\n            },\n\n            /**\n             * Exporting module required. Clears away other elements in the page and\n             * prints the chart as it is displayed. By default, when the exporting\n             * module is enabled, a context button with a drop down menu in the upper\n             * right corner accesses this function.\n             *\n             * @sample highcharts/members/chart-print/\n             *         Print from a HTML button\n             */\n            print: function() {\n\n                var chart = this,\n                    container = chart.container,\n                    origDisplay = [],\n                    origParent = container.parentNode,\n                    body = doc.body,\n                    childNodes = body.childNodes,\n                    printMaxWidth = chart.options.exporting.printMaxWidth,\n                    resetParams,\n                    handleMaxWidth;\n\n                if (chart.isPrinting) { // block the button while in printing mode\n                    return;\n                }\n\n                chart.isPrinting = true;\n                chart.pointer.reset(null, 0);\n\n                fireEvent(chart, 'beforePrint');\n\n                // Handle printMaxWidth\n                handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;\n                if (handleMaxWidth) {\n                    resetParams = [chart.options.chart.width, undefined, false];\n                    chart.setSize(printMaxWidth, undefined, false);\n                }\n\n                // hide all body content\n                each(childNodes, function(node, i) {\n                    if (node.nodeType === 1) {\n                        origDisplay[i] = node.style.display;\n                        node.style.display = 'none';\n                    }\n                });\n\n                // pull out the chart\n                body.appendChild(container);\n\n                // print\n                win.focus(); // #1510\n                win.print();\n\n                // allow the browser to prepare before reverting\n                setTimeout(function() {\n\n                    // put the chart back in\n                    origParent.appendChild(container);\n\n                    // restore all body content\n                    each(childNodes, function(node, i) {\n                        if (node.nodeType === 1) {\n                            node.style.display = origDisplay[i];\n                        }\n                    });\n\n                    chart.isPrinting = false;\n\n                    // Reset printMaxWidth\n                    if (handleMaxWidth) {\n                        chart.setSize.apply(chart, resetParams);\n                    }\n\n                    fireEvent(chart, 'afterPrint');\n\n                }, 1000);\n\n            },\n\n            /**\n             * Display a popup menu for choosing the export type\n             *\n             * @param {String} className An identifier for the menu\n             * @param {Array} items A collection with text and onclicks for the items\n             * @param {Number} x The x position of the opener button\n             * @param {Number} y The y position of the opener button\n             * @param {Number} width The width of the opener button\n             * @param {Number} height The height of the opener button\n             */\n            contextMenu: function(className, items, x, y, width, height, button) {\n                var chart = this,\n                    navOptions = chart.options.navigation,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    cacheName = 'cache-' + className,\n                    menu = chart[cacheName],\n                    menuPadding = Math.max(width, height), // for mouse leave detection\n                    innerMenu,\n                    hide,\n                    menuStyle;\n\n                // create the menu only the first time\n                if (!menu) {\n\n                    // create a HTML element above the SVG\n                    chart[cacheName] = menu = createElement('div', {\n                        className: className\n                    }, {\n                        position: 'absolute',\n                        zIndex: 1000,\n                        padding: menuPadding + 'px'\n                    }, chart.container);\n\n                    innerMenu = createElement('div', {\n                        className: 'highcharts-menu'\n                    }, null, menu);\n\n\n\n                    // hide on mouse out\n                    hide = function() {\n                        css(menu, {\n                            display: 'none'\n                        });\n                        if (button) {\n                            button.setState(0);\n                        }\n                        chart.openMenu = false;\n                    };\n\n                    // Hide the menu some time after mouse leave (#1357)\n                    chart.exportEvents.push(\n                        addEvent(menu, 'mouseleave', function() {\n                            menu.hideTimer = setTimeout(hide, 500);\n                        }),\n                        addEvent(menu, 'mouseenter', function() {\n                            clearTimeout(menu.hideTimer);\n                        }),\n\n                        // Hide it on clicking or touching outside the menu (#2258, #2335,\n                        // #2407)\n                        addEvent(doc, 'mouseup', function(e) {\n                            if (!chart.pointer.inClass(e.target, className)) {\n                                hide();\n                            }\n                        })\n                    );\n\n                    // create the items\n                    each(items, function(item) {\n                        if (item) {\n                            var element;\n\n                            if (item.separator) {\n                                element = createElement('hr', null, null, innerMenu);\n\n                            } else {\n                                element = createElement('div', {\n                                    className: 'highcharts-menu-item',\n                                    onclick: function(e) {\n                                        if (e) { // IE7\n                                            e.stopPropagation();\n                                        }\n                                        hide();\n                                        if (item.onclick) {\n                                            item.onclick.apply(chart, arguments);\n                                        }\n                                    },\n                                    innerHTML: item.text || chart.options.lang[item.textKey]\n                                }, null, innerMenu);\n\n\n                            }\n\n                            // Keep references to menu divs to be able to destroy them\n                            chart.exportDivElements.push(element);\n                        }\n                    });\n\n                    // Keep references to menu and innerMenu div to be able to destroy them\n                    chart.exportDivElements.push(innerMenu, menu);\n\n                    chart.exportMenuWidth = menu.offsetWidth;\n                    chart.exportMenuHeight = menu.offsetHeight;\n                }\n\n                menuStyle = {\n                    display: 'block'\n                };\n\n                // if outside right, right align it\n                if (x + chart.exportMenuWidth > chartWidth) {\n                    menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';\n                } else {\n                    menuStyle.left = (x - menuPadding) + 'px';\n                }\n                // if outside bottom, bottom align it\n                if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {\n                    menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';\n                } else {\n                    menuStyle.top = (y + height - menuPadding) + 'px';\n                }\n\n                css(menu, menuStyle);\n                chart.openMenu = true;\n            },\n\n            /**\n             * Add the export button to the chart\n             */\n            addButton: function(options) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    btnOptions = merge(chart.options.navigation.buttonOptions, options),\n                    onclick = btnOptions.onclick,\n                    menuItems = btnOptions.menuItems,\n                    symbol,\n                    button,\n                    symbolSize = btnOptions.symbolSize || 12;\n                if (!chart.btnCount) {\n                    chart.btnCount = 0;\n                }\n\n                // Keeps references to the button elements\n                if (!chart.exportDivElements) {\n                    chart.exportDivElements = [];\n                    chart.exportSVGElements = [];\n                }\n\n                if (btnOptions.enabled === false) {\n                    return;\n                }\n\n\n                var attr = btnOptions.theme,\n                    states = attr.states,\n                    hover = states && states.hover,\n                    select = states && states.select,\n                    callback;\n\n                delete attr.states;\n\n                if (onclick) {\n                    callback = function(e) {\n                        e.stopPropagation();\n                        onclick.call(chart, e);\n                    };\n\n                } else if (menuItems) {\n                    callback = function() {\n                        chart.contextMenu(\n                            button.menuClassName,\n                            menuItems,\n                            button.translateX,\n                            button.translateY,\n                            button.width,\n                            button.height,\n                            button\n                        );\n                        button.setState(2);\n                    };\n                }\n\n\n                if (btnOptions.text && btnOptions.symbol) {\n                    attr.paddingLeft = pick(attr.paddingLeft, 25);\n\n                } else if (!btnOptions.text) {\n                    extend(attr, {\n                        width: btnOptions.width,\n                        height: btnOptions.height,\n                        padding: 0\n                    });\n                }\n\n                button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)\n                    .addClass(options.className)\n                    .attr({\n\n                        title: chart.options.lang[btnOptions._titleKey],\n                        zIndex: 3 // #4955\n                    });\n                button.menuClassName = options.menuClassName || 'highcharts-menu-' + chart.btnCount++;\n\n                if (btnOptions.symbol) {\n                    symbol = renderer.symbol(\n                            btnOptions.symbol,\n                            btnOptions.symbolX - (symbolSize / 2),\n                            btnOptions.symbolY - (symbolSize / 2),\n                            symbolSize,\n                            symbolSize\n                        )\n                        .addClass('highcharts-button-symbol')\n                        .attr({\n                            zIndex: 1\n                        }).add(button);\n\n\n                }\n\n                button.add()\n                    .align(extend(btnOptions, {\n                        width: button.width,\n                        x: pick(btnOptions.x, chart.buttonOffset) // #1654\n                    }), true, 'spacingBox');\n\n                chart.buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);\n\n                chart.exportSVGElements.push(button, symbol);\n\n            },\n\n            /**\n             * Destroy the buttons.\n             */\n            destroyExport: function(e) {\n                var chart = e ? e.target : this,\n                    exportSVGElements = chart.exportSVGElements,\n                    exportDivElements = chart.exportDivElements,\n                    exportEvents = chart.exportEvents,\n                    cacheName;\n\n                // Destroy the extra buttons added\n                if (exportSVGElements) {\n                    each(exportSVGElements, function(elem, i) {\n\n                        // Destroy and null the svg/vml elements\n                        if (elem) { // #1822\n                            elem.onclick = elem.ontouchstart = null;\n                            cacheName = 'cache-' + elem.menuClassName;\n\n                            if (chart[cacheName]) {\n                                delete chart[cacheName];\n                            }\n\n                            chart.exportSVGElements[i] = elem.destroy();\n                        }\n                    });\n                    exportSVGElements.length = 0;\n                }\n\n                // Destroy the divs for the menu\n                if (exportDivElements) {\n                    each(exportDivElements, function(elem, i) {\n\n                        // Remove the event handler\n                        clearTimeout(elem.hideTimer); // #5427\n                        removeEvent(elem, 'mouseleave');\n\n                        // Remove inline events\n                        chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;\n\n                        // Destroy the div by moving to garbage bin\n                        discardElement(elem);\n                    });\n                    exportDivElements.length = 0;\n                }\n\n                if (exportEvents) {\n                    each(exportEvents, function(unbind) {\n                        unbind();\n                    });\n                    exportEvents.length = 0;\n                }\n            }\n        });\n\n\n        // These ones are translated to attributes rather than styles\n        SVGRenderer.prototype.inlineToAttributes = [\n            'fill',\n            'stroke',\n            'strokeLinecap',\n            'strokeLinejoin',\n            'strokeWidth',\n            'textAnchor',\n            'x',\n            'y'\n        ];\n        // These CSS properties are not inlined. Remember camelCase.\n        SVGRenderer.prototype.inlineBlacklist = [\n            /-/, // In Firefox, both hyphened and camelCased names are listed\n            /^(clipPath|cssText|d|height|width)$/, // Full words\n            /^font$/, // more specific props are set\n            /[lL]ogical(Width|Height)$/,\n            /perspective/,\n            /TapHighlightColor/,\n            /^transition/\n            // /^text (border|color|cursor|height|webkitBorder)/\n        ];\n        SVGRenderer.prototype.unstyledElements = [\n            'clipPath',\n            'defs',\n            'desc'\n        ];\n\n        /**\n         * Analyze inherited styles from stylesheets and add them inline\n         *\n         * @todo: What are the border styles for text about? In general, text has a lot of properties.\n         * @todo: Make it work with IE9 and IE10.\n         */\n        Chart.prototype.inlineStyles = function() {\n            var renderer = this.renderer,\n                inlineToAttributes = renderer.inlineToAttributes,\n                blacklist = renderer.inlineBlacklist,\n                whitelist = renderer.inlineWhitelist, // For IE\n                unstyledElements = renderer.unstyledElements,\n                defaultStyles = {},\n                dummySVG;\n\n            /**\n             * Make hyphenated property names out of camelCase\n             */\n            function hyphenate(prop) {\n                return prop.replace(\n                    /([A-Z])/g,\n                    function(a, b) {\n                        return '-' + b.toLowerCase();\n                    }\n                );\n            }\n\n            /**\n             * Call this on all elements and recurse to children\n             */\n            function recurse(node) {\n                var styles,\n                    parentStyles,\n                    cssText = '',\n                    dummy,\n                    styleAttr,\n                    blacklisted,\n                    whitelisted,\n                    i;\n\n                // Check computed styles and whether they are in the white/blacklist for\n                // styles or atttributes\n                function filterStyles(val, prop) {\n\n                    // Check against whitelist & blacklist\n                    blacklisted = whitelisted = false;\n                    if (whitelist) {\n                        // Styled mode in IE has a whitelist instead.\n                        // Exclude all props not in this list.\n                        i = whitelist.length;\n                        while (i-- && !whitelisted) {\n                            whitelisted = whitelist[i].test(prop);\n                        }\n                        blacklisted = !whitelisted;\n                    }\n\n                    // Explicitly remove empty transforms\n                    if (prop === 'transform' && val === 'none') {\n                        blacklisted = true;\n                    }\n\n                    i = blacklist.length;\n                    while (i-- && !blacklisted) {\n                        blacklisted = blacklist[i].test(prop) || typeof val === 'function';\n                    }\n\n                    if (!blacklisted) {\n                        // If parent node has the same style, it gets inherited, no need to inline it\n                        if (parentStyles[prop] !== val && defaultStyles[node.nodeName][prop] !== val) {\n                            // Attributes\n                            if (inlineToAttributes.indexOf(prop) !== -1) {\n                                node.setAttribute(hyphenate(prop), val);\n                                // Styles\n                            } else {\n                                cssText += hyphenate(prop) + ':' + val + ';';\n                            }\n                        }\n                    }\n                }\n\n                if (node.nodeType === 1 && unstyledElements.indexOf(node.nodeName) === -1) {\n                    styles = win.getComputedStyle(node, null);\n                    parentStyles = node.nodeName === 'svg' ? {} : win.getComputedStyle(node.parentNode, null);\n\n                    // Get default styles from the browser so that we don't have to add these\n                    if (!defaultStyles[node.nodeName]) {\n                        if (!dummySVG) {\n                            dummySVG = doc.createElementNS(H.SVG_NS, 'svg');\n                            dummySVG.setAttribute('version', '1.1');\n                            doc.body.appendChild(dummySVG);\n                        }\n                        dummy = doc.createElementNS(node.namespaceURI, node.nodeName);\n                        dummySVG.appendChild(dummy);\n                        defaultStyles[node.nodeName] = merge(win.getComputedStyle(dummy, null)); // Copy, so we can remove the node\n                        dummySVG.removeChild(dummy);\n                    }\n\n                    // Loop through all styles and add them inline if they are ok\n                    if (isFirefoxBrowser || isMSBrowser) {\n                        // Some browsers put lots of styles on the prototype\n                        for (var p in styles) {\n                            filterStyles(styles[p], p);\n                        }\n                    } else {\n                        objectEach(styles, filterStyles);\n                    }\n\n                    // Apply styles\n                    if (cssText) {\n                        styleAttr = node.getAttribute('style');\n                        node.setAttribute('style', (styleAttr ? styleAttr + ';' : '') + cssText);\n                    }\n\n                    // Set default stroke width (needed at least for IE)\n                    if (node.nodeName === 'svg') {\n                        node.setAttribute('stroke-width', '1px');\n                    }\n\n                    if (node.nodeName === 'text') {\n                        return;\n                    }\n\n                    // Recurse\n                    each(node.children || node.childNodes, recurse);\n                }\n            }\n\n            /**\n             * Remove the dummy objects used to get defaults\n             */\n            function tearDown() {\n                dummySVG.parentNode.removeChild(dummySVG);\n            }\n\n            recurse(this.container.querySelector('svg'));\n            tearDown();\n\n        };\n\n\n\n        symbols.menu = function(x, y, width, height) {\n            var arr = [\n                'M', x, y + 2.5,\n                'L', x + width, y + 2.5,\n                'M', x, y + height / 2 + 0.5,\n                'L', x + width, y + height / 2 + 0.5,\n                'M', x, y + height - 1.5,\n                'L', x + width, y + height - 1.5\n            ];\n            return arr;\n        };\n\n        // Add the buttons on chart load\n        Chart.prototype.renderExporting = function() {\n            var chart = this,\n                exportingOptions = chart.options.exporting,\n                buttons = exportingOptions.buttons,\n                isDirty = chart.isDirtyExporting || !chart.exportSVGElements;\n\n            chart.buttonOffset = 0;\n            if (chart.isDirtyExporting) {\n                chart.destroyExport();\n            }\n\n            if (isDirty && exportingOptions.enabled !== false) {\n                chart.exportEvents = [];\n\n                objectEach(buttons, function(button) {\n                    chart.addButton(button);\n                });\n\n                chart.isDirtyExporting = false;\n            }\n\n            // Destroy the export elements at chart destroy\n            addEvent(chart, 'destroy', chart.destroyExport);\n        };\n\n        Chart.prototype.callbacks.push(function(chart) {\n\n            function update(prop, options, redraw) {\n                chart.isDirtyExporting = true;\n                merge(true, chart.options[prop], options);\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n\n            }\n\n            chart.renderExporting();\n\n            addEvent(chart, 'redraw', chart.renderExporting);\n\n            // Add update methods to handle chart.update and chart.exporting.update\n            // and chart.navigation.update.\n            each(['exporting', 'navigation'], function(prop) {\n                chart[prop] = {\n                    update: function(options, redraw) {\n                        update(prop, options, redraw);\n                    }\n                };\n            });\n\n            // Uncomment this to see a button directly below the chart, for quick\n            // testing of export\n            /*\n            if (!chart.renderer.forExport) {\n            \tvar button;\n\n            \t// View SVG Image\n            \tbutton = doc.createElement('button');\n            \tbutton.innerHTML = 'View SVG Image';\n            \tchart.renderTo.parentNode.appendChild(button);\n            \tbutton.onclick = function () {\n            \t\tvar div = doc.createElement('div');\n            \t\tdiv.innerHTML = chart.getSVGForExport();\n            \t\tchart.renderTo.parentNode.appendChild(div);\n            \t};\n\n            \t// View SVG Source\n            \tbutton = doc.createElement('button');\n            \tbutton.innerHTML = 'View SVG Source';\n            \tchart.renderTo.parentNode.appendChild(button);\n            \tbutton.onclick = function () {\n            \t\tvar pre = doc.createElement('pre');\n            \t\tpre.innerHTML = chart.getSVGForExport()\n            \t\t\t.replace(/</g, '\\n&lt;')\n            \t\t\t.replace(/>/g, '&gt;');\n            \t\tchart.renderTo.parentNode.appendChild(pre);\n            \t};\n            }\n            // */\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/funnel.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Highcharts funnel module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(e){\"object\"===typeof module&&module.exports?module.exports=e:e(Highcharts)})(function(e){(function(g){var e=g.seriesType,C=g.seriesTypes,H=g.noop,D=g.pick,I=g.each;e(\"funnel\",\"pie\",{animation:!1,center:[\"50%\",\"50%\"],width:\"90%\",neckWidth:\"30%\",height:\"100%\",neckHeight:\"25%\",reversed:!1,size:!0},{animate:H,translate:function(){var b=function(a,b){return/%$/.test(a)?b*parseInt(a,10)/100:parseInt(a,10)},E=0,c=this.chart,f=this.options,d=f.reversed,e=f.ignoreHiddenPoint,t=c.plotWidth,c=c.plotHeight,\nq=0,g=f.center,h=b(g[0],t),r=b(g[1],c),C=b(f.width,t),l,v,m=b(f.height,c),w=b(f.neckWidth,t),F=b(f.neckHeight,c),x=r-m/2+m-F,b=this.data,z,A,D=\"left\"===f.dataLabels.position?1:0,B,n,G,u,k,y,p;this.getWidthAt=v=function(a){var b=r-m/2;return a>x||m===F?w:w+(C-w)*(1-(a-b)/(m-F))};this.getX=function(a,b,c){return h+(b?-1:1)*(v(d?2*r-a:a)/2+c.labelDistance)};this.center=[h,r,m];this.centerX=h;I(b,function(a){e&&!1===a.visible||(E+=a.y)});I(b,function(a){p=null;A=E?a.y/E:0;n=r-m/2+q*m;k=n+A*m;l=v(n);B=\nh-l/2;G=B+l;l=v(k);u=h-l/2;y=u+l;n>x?(B=u=h-w/2,G=y=h+w/2):k>x&&(p=k,l=v(x),u=h-l/2,y=u+l,k=x);d&&(n=2*r-n,k=2*r-k,p=p?2*r-p:null);z=[\"M\",B,n,\"L\",G,n,y,k];p&&z.push(y,p,u,p);z.push(u,k,\"Z\");a.shapeType=\"path\";a.shapeArgs={d:z};a.percentage=100*A;a.plotX=h;a.plotY=(n+(p||k))/2;a.tooltipPos=[h,a.plotY];a.slice=H;a.half=D;e&&!1===a.visible||(q+=A)})},sortByAngle:function(b){b.sort(function(b,c){return b.plotY-c.plotY})},drawDataLabels:function(){var b=this.data,e=this.options.dataLabels.distance,c,f,\nd,g=b.length,t,q;for(this.center[2]-=2*e;g--;)d=b[g],f=(c=d.half)?1:-1,q=d.plotY,d.labelDistance=D(d.options.dataLabels&&d.options.dataLabels.distance,e),this.maxLabelDistance=Math.max(d.labelDistance,this.maxLabelDistance||0),t=this.getX(q,c,d),d.labelPos=[0,q,t+(d.labelDistance-5)*f,q,t+d.labelDistance*f,q,c?\"right\":\"left\",0];C.pie.prototype.drawDataLabels.call(this)}});e(\"pyramid\",\"funnel\",{neckWidth:\"0%\",neckHeight:\"0%\",reversed:!0})})(e)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/funnel.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Highcharts funnel module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Highcharts funnel module\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* eslint indent:0 */\n\n        // create shortcuts\n        var seriesType = Highcharts.seriesType,\n            seriesTypes = Highcharts.seriesTypes,\n            noop = Highcharts.noop,\n            pick = Highcharts.pick,\n            each = Highcharts.each;\n\n\n        seriesType('funnel', 'pie', {\n                animation: false,\n                center: ['50%', '50%'],\n                width: '90%',\n                neckWidth: '30%',\n                height: '100%',\n                neckHeight: '25%',\n                reversed: false,\n                size: true, // to avoid adapting to data label size in Pie.drawDataLabels\n\n\n            },\n\n            // Properties\n            {\n                animate: noop,\n\n                /**\n                 * Overrides the pie translate method\n                 */\n                translate: function() {\n\n                    var\n                        // Get positions - either an integer or a percentage string must be given\n                        getLength = function(length, relativeTo) {\n                            return (/%$/).test(length) ?\n                                relativeTo * parseInt(length, 10) / 100 :\n                                parseInt(length, 10);\n                        },\n\n                        sum = 0,\n                        series = this,\n                        chart = series.chart,\n                        options = series.options,\n                        reversed = options.reversed,\n                        ignoreHiddenPoint = options.ignoreHiddenPoint,\n                        plotWidth = chart.plotWidth,\n                        plotHeight = chart.plotHeight,\n                        cumulative = 0, // start at top\n                        center = options.center,\n                        centerX = getLength(center[0], plotWidth),\n                        centerY = getLength(center[1], plotHeight),\n                        width = getLength(options.width, plotWidth),\n                        tempWidth,\n                        getWidthAt,\n                        height = getLength(options.height, plotHeight),\n                        neckWidth = getLength(options.neckWidth, plotWidth),\n                        neckHeight = getLength(options.neckHeight, plotHeight),\n                        neckY = (centerY - height / 2) + height - neckHeight,\n                        data = series.data,\n                        path,\n                        fraction,\n                        half = options.dataLabels.position === 'left' ? 1 : 0,\n\n                        x1,\n                        y1,\n                        x2,\n                        x3,\n                        y3,\n                        x4,\n                        y5;\n\n                    // Return the width at a specific y coordinate\n                    series.getWidthAt = getWidthAt = function(y) {\n                        var top = (centerY - height / 2);\n\n                        return y > neckY || height === neckHeight ?\n                            neckWidth :\n                            neckWidth + (width - neckWidth) * (1 - (y - top) / (height - neckHeight));\n                    };\n                    series.getX = function(y, half, point) {\n                        return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? 2 * centerY - y : y) / 2) + point.labelDistance);\n                    };\n\n                    // Expose\n                    series.center = [centerX, centerY, height];\n                    series.centerX = centerX;\n\n                    /*\n                     * Individual point coordinate naming:\n                     *\n                     * x1,y1 _________________ x2,y1\n                     *  \\                         /\n                     *   \\                       /\n                     *    \\                     /\n                     *     \\                   /\n                     *      \\                 /\n                     *     x3,y3 _________ x4,y3\n                     *\n                     * Additional for the base of the neck:\n                     *\n                     *       |               |\n                     *       |               |\n                     *       |               |\n                     *     x3,y5 _________ x4,y5\n                     */\n\n\n\n\n                    // get the total sum\n                    each(data, function(point) {\n                        if (!ignoreHiddenPoint || point.visible !== false) {\n                            sum += point.y;\n                        }\n                    });\n\n                    each(data, function(point) {\n                        // set start and end positions\n                        y5 = null;\n                        fraction = sum ? point.y / sum : 0;\n                        y1 = centerY - height / 2 + cumulative * height;\n                        y3 = y1 + fraction * height;\n                        //tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));\n                        tempWidth = getWidthAt(y1);\n                        x1 = centerX - tempWidth / 2;\n                        x2 = x1 + tempWidth;\n                        tempWidth = getWidthAt(y3);\n                        x3 = centerX - tempWidth / 2;\n                        x4 = x3 + tempWidth;\n\n                        // the entire point is within the neck\n                        if (y1 > neckY) {\n                            x1 = x3 = centerX - neckWidth / 2;\n                            x2 = x4 = centerX + neckWidth / 2;\n\n                            // the base of the neck\n                        } else if (y3 > neckY) {\n                            y5 = y3;\n\n                            tempWidth = getWidthAt(neckY);\n                            x3 = centerX - tempWidth / 2;\n                            x4 = x3 + tempWidth;\n\n                            y3 = neckY;\n                        }\n\n                        if (reversed) {\n                            y1 = 2 * centerY - y1;\n                            y3 = 2 * centerY - y3;\n                            y5 = (y5 ? 2 * centerY - y5 : null);\n                        }\n                        // save the path\n                        path = [\n                            'M',\n                            x1, y1,\n                            'L',\n                            x2, y1,\n                            x4, y3\n                        ];\n                        if (y5) {\n                            path.push(x4, y5, x3, y5);\n                        }\n                        path.push(x3, y3, 'Z');\n\n                        // prepare for using shared dr\n                        point.shapeType = 'path';\n                        point.shapeArgs = {\n                            d: path\n                        };\n\n\n                        // for tooltips and data labels\n                        point.percentage = fraction * 100;\n                        point.plotX = centerX;\n                        point.plotY = (y1 + (y5 || y3)) / 2;\n\n                        // Placement of tooltips and data labels\n                        point.tooltipPos = [\n                            centerX,\n                            point.plotY\n                        ];\n\n                        // Slice is a noop on funnel points\n                        point.slice = noop;\n\n                        // Mimicking pie data label placement logic\n                        point.half = half;\n\n                        if (!ignoreHiddenPoint || point.visible !== false) {\n                            cumulative += fraction;\n                        }\n                    });\n                },\n\n                /**\n                 * Funnel items don't have angles (#2289)\n                 */\n                sortByAngle: function(points) {\n                    points.sort(function(a, b) {\n                        return a.plotY - b.plotY;\n                    });\n                },\n\n                /**\n                 * Extend the pie data label method\n                 */\n                drawDataLabels: function() {\n                    var series = this,\n                        data = series.data,\n                        labelDistance = series.options.dataLabels.distance,\n                        leftSide,\n                        sign,\n                        point,\n                        i = data.length,\n                        x,\n                        y;\n\n                    // In the original pie label anticollision logic, the slots are distributed\n                    // from one labelDistance above to one labelDistance below the pie. In funnels\n                    // we don't want this.\n                    series.center[2] -= 2 * labelDistance;\n\n                    // Set the label position array for each point.\n                    while (i--) {\n                        point = data[i];\n                        leftSide = point.half;\n                        sign = leftSide ? 1 : -1;\n                        y = point.plotY;\n                        point.labelDistance = pick(\n                            point.options.dataLabels && point.options.dataLabels.distance,\n                            labelDistance\n                        );\n\n                        series.maxLabelDistance = Math.max(point.labelDistance, series.maxLabelDistance || 0);\n                        x = series.getX(y, leftSide, point);\n\n                        // set the anchor point for data labels\n                        point.labelPos = [\n                            0, // first break of connector\n                            y, // a/a\n                            x + (point.labelDistance - 5) * sign, // second break, right outside point shape\n                            y, // a/a\n                            x + point.labelDistance * sign, // landing point for connector\n                            y, // a/a\n                            leftSide ? 'right' : 'left', // alignment\n                            0 // center angle\n                        ];\n                    }\n\n                    seriesTypes.pie.prototype.drawDataLabels.call(this);\n                }\n\n            });\n\n        /** \n         * Pyramid series type.\n         * A pyramid series is a special type of funnel, without neck and reversed by default.\n         */\n        seriesType('pyramid', 'funnel', {\n            neckWidth: '0%',\n            neckHeight: '0%',\n            reversed: true\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/gantt.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Gantt series\n\n (c) 2016 Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(g){var n=g.dateFormat,r=g.each,t=g.isObject,v=g.pick,m=g.wrap,p=g.Axis,w=g.Chart,u=g.Tick;p.prototype.isOuterAxis=function(){var a=this,e=-1,b=!0;r(this.chart.axes,function(d,f){d.side===a.side&&(d===a?e=f:0<=e&&f>e&&(b=!1))});return b};u.prototype.getLabelWidth=function(){return this.label.getBBox().width};p.prototype.getMaxLabelLength=function(a){var e=this.tickPositions,b=this.ticks,d=0;\nif(!this.maxLabelLength||a)r(e,function(a){(a=b[a])&&a.labelLength>d&&(d=a.labelLength)}),this.maxLabelLength=d;return this.maxLabelLength};p.prototype.addTitle=function(){var a=this.chart.renderer,e=this.axisParent,b=this.horiz,d=this.opposite,f=this.options,c=f.title,l;this.showAxis=l=this.hasData()||v(f.showEmpty,!0);f.title=\"\";this.axisTitle||((f=c.textAlign)||(f=(b?{low:\"left\",middle:\"center\",high:\"right\"}:{low:d?\"right\":\"left\",middle:\"center\",high:d?\"left\":\"right\"})[c.align]),this.axisTitle=\na.text(c.text,0,0,c.useHTML).attr({zIndex:7,rotation:c.rotation||0,align:f}).addClass(\"highcharts-axis-title\").add(e),this.axisTitle.isNew=!0);this.axisTitle[l?\"show\":\"hide\"](!0)};g.dateFormats={W:function(a){a=new Date(a);var e=0===a.getUTCDay()?7:a.getUTCDay(),b=a.getTime(),d=new Date(a.getUTCFullYear(),0,1,-6);a.setDate(a.getUTCDate()+4-e);return 1+Math.floor(Math.floor((b-d)/864E5)/7)},E:function(a){return n(\"%a\",a,!0).charAt(0)}};m(u.prototype,\"addLabel\",function(a){var e=this.axis,b=void 0!==\ne.options.categories,d=e.tickPositions,d=this.pos!==d[d.length-1];(!e.options.grid||b||d)&&a.apply(this)});m(u.prototype,\"getLabelPosition\",function(a,e,b,d){var f=a.apply(this,Array.prototype.slice.call(arguments,1)),c=this.axis,l=c.options,h=l.tickInterval||1,q,k;l.grid&&(q=l.labels.style.fontSize,k=c.chart.renderer.fontMetrics(q,d),q=k.b,k=k.h,c.horiz&&void 0===l.categories?(l=c.axisGroup.getBBox().height,h=this.pos+h/2,f.x=c.translate(h)+c.left,h=l/2+k/2-Math.abs(k-q),f.y=0===c.side?b-h:b+h):\n(void 0===l.categories&&(h=this.pos+h/2,f.y=c.translate(h)+c.top+q/2),h=this.getLabelWidth()/2-c.maxLabelLength/2,f.x=3===c.side?f.x+h:f.x-h));return f});m(p.prototype,\"tickSize\",function(a){var e=a.apply(this,Array.prototype.slice.call(arguments,1)),b;this.options.grid&&!this.horiz&&(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),this.maxLabelLength||(this.maxLabelLength=this.getMaxLabelLength()),b=this.maxLabelLength+b,e[0]=b);return e});m(p.prototype,\"getOffset\",function(a){var e=this.chart.axisOffset,\nb=this.side,d,f,c=this.options,l=c.title,h=l&&l.text&&!1!==l.enabled;this.options.grid&&t(this.options.title)?(f=this.tickSize(\"tick\")[0],e[b]&&f&&(d=e[b]+f),h&&this.addTitle(),a.apply(this,Array.prototype.slice.call(arguments,1)),e[b]=v(d,e[b]),c.title=l):a.apply(this,Array.prototype.slice.call(arguments,1))});m(p.prototype,\"renderUnsquish\",function(a){this.options.grid&&(this.labelRotation=0,this.options.labels.rotation=0);a.apply(this)});m(p.prototype,\"setOptions\",function(a,e){e.grid&&this.horiz&&\n(e.startOnTick=!0,e.minPadding=0,e.endOnTick=!0);a.apply(this,Array.prototype.slice.call(arguments,1))});m(p.prototype,\"render\",function(a){var e=this.options,b,d,f,c,l,h,q=this.chart.renderer;if(e.grid){if(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),b=this.maxLabelLength+b,d=e.lineWidth,this.rightWall&&this.rightWall.destroy(),a.apply(this),a=this.axisGroup.getBBox(),this.horiz&&(this.rightWall=q.path([\"M\",a.x+this.width+1,a.y,\"L\",a.x+this.width+1,a.y+a.height]).attr({stroke:e.tickColor||\n\"#ccd6eb\",\"stroke-width\":e.tickWidth||1,zIndex:7,class:\"grid-wall\"}).add(this.axisGroup)),this.isOuterAxis()&&this.axisLine&&(this.horiz&&(b=a.height-1),d)){a=this.getLinePath(d);l=a.indexOf(\"M\")+1;h=a.indexOf(\"L\")+1;f=a.indexOf(\"M\")+2;c=a.indexOf(\"L\")+2;if(0===this.side||3===this.side)b=-b;this.horiz?(a[f]+=b,a[c]+=b):(a[l]+=b,a[h]+=b);this.axisLineExtra?this.axisLineExtra.animate({d:a}):this.axisLineExtra=q.path(a).attr({stroke:e.lineColor,\"stroke-width\":d,zIndex:7}).add(this.axisGroup);this.axisLine[this.showAxis?\n\"show\":\"hide\"](!0)}}else a.apply(this)});m(w.prototype,\"render\",function(a){var e=25/11,b,d;r(this.axes,function(a){var c=a.options;c.grid&&(d=c.labels.style.fontSize,b=a.chart.renderer.fontMetrics(d),\"datetime\"===c.type&&(c.units=[[\"millisecond\",[1]],[\"second\",[1]],[\"minute\",[1]],[\"hour\",[1]],[\"day\",[1]],[\"week\",[1]],[\"month\",[1]],[\"year\",null]]),a.horiz?c.tickLength=c.cellHeight||b.h*e:(c.tickWidth=1,c.lineWidth||(c.lineWidth=1)))});a.apply(this)})})(n);(function(g){var n=g.getOptions().plotOptions,\nr=g.seriesTypes.column,t=g.each,v=g.extendClass,m=g.isNumber,p=g.isObject,w=g.merge,u=g.pick,a=g.seriesTypes,e=g.wrap,b=g.Axis,d=g.Point,f=g.Series;n.xrange=w(n.column,{tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.yCategory}\\x3c/b\\x3e\\x3cbr/\\x3e'}});a.xrange=v(r,{pointClass:v(d,{getLabelConfig:function(){var a=d.prototype.getLabelConfig.call(this);a.x2=this.x2;a.yCategory=this.yCategory=this.series.yAxis.categories&&this.series.yAxis.categories[this.y];\nreturn a}}),type:\"xrange\",forceDL:!0,parallelArrays:[\"x\",\"x2\",\"y\"],requireSorting:!1,animate:a.line.prototype.animate,getColumnMetrics:function(){function a(){t(e.series,function(a){var c=a.xAxis;a.xAxis=a.yAxis;a.yAxis=c})}var b,e=this.chart;a();this.yAxis.closestPointRange=1;b=r.prototype.getColumnMetrics.call(this);a();return b},cropData:function(a,b,e,d){b=f.prototype.cropData.call(this,this.x2Data,b,e,d);b.xData=a.slice(b.start,b.end);return b},translate:function(){r.prototype.translate.apply(this,\narguments);var a=this.xAxis,b=this.columnMetrics,e=this.options.minPointLength||0;t(this.points,function(c){var k=c.plotX,d=u(c.x2,c.x+(c.len||0)),d=a.toPixels(d,!0),f=d-k,h;e&&(h=e-f,0>h&&(h=0),k-=h/2,d+=h/2);k=Math.max(k,-10);d=Math.min(Math.max(d,-10),a.len+10);d<k&&(d=k);c.shapeArgs={x:k,y:c.plotY+b.offset,width:d-k,height:b.width};c.tooltipPos[0]+=f/2;c.tooltipPos[1]-=b.width/2;if(d=c.partialFill)p(d)&&(d=d.amount),m(d)||(d=0),k=c.shapeArgs,c.partShapeArgs={x:k.x,y:k.y+1,width:k.width*d,height:k.height-\n2}})},drawPoints:function(){var a=this,b=this.chart,d=b.renderer,e=b.pointCount<(a.options.animationLimit||250)?\"animate\":\"attr\";t(a.points,function(b){var c=b.graphic,f=b.shapeType,h=b.shapeArgs,g=b.partShapeArgs;if(m(b.plotY)&&null!==b.y)if(c){if(b.graphicOriginal[e](w(h)),g)b.graphicOverlay[e](w(g))}else b.graphic=c=d.g(\"point\").attr({\"class\":b.getClassName()}).add(b.group||a.group),b.graphicOriginal=d[f](h).addClass(\"highcharts-partfill-original\").add(c),g&&(b.graphicOverlay=d[f](g).addClass(\"highcharts-partfill-overlay\").add(c));\nelse c&&(b.graphic=c.destroy())})}});e(b.prototype,\"getSeriesExtremes\",function(a){var b=this.series,c,d;a.call(this);this.isXAxis&&\"xrange\"===b.type&&(c=u(this.dataMax,Number.MIN_VALUE),t(this.series,function(a){t(a.x2Data||[],function(a){a>c&&(c=a,d=!0)})}),d&&(this.dataMax=c))})})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/gantt.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Gantt series\n *\n * (c) 2016 Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2016 Highsoft AS\n         * Authors: Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var dateFormat = H.dateFormat,\n            each = H.each,\n            isObject = H.isObject,\n            pick = H.pick,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            Tick = H.Tick;\n\n\n        // Enum for which side the axis is on.\n        // Maps to axis.side\n        var axisSide = {\n            top: 0,\n            right: 1,\n            bottom: 2,\n            left: 3,\n            0: 'top',\n            1: 'right',\n            2: 'bottom',\n            3: 'left'\n        };\n\n        /**\n         * Checks if an axis is the outer axis in its dimension. Since\n         * axes are placed outwards in order, the axis with the highest\n         * index is the outermost axis.\n         *\n         * Example: If there are multiple x-axes at the top of the chart,\n         * this function returns true if the axis supplied is the last\n         * of the x-axes.\n         *\n         * @return true if the axis is the outermost axis in its dimension;\n         *\t\t false if not\n         */\n        Axis.prototype.isOuterAxis = function() {\n            var axis = this,\n                thisIndex = -1,\n                isOuter = true;\n\n            each(this.chart.axes, function(otherAxis, index) {\n                if (otherAxis.side === axis.side) {\n                    if (otherAxis === axis) {\n                        // Get the index of the axis in question\n                        thisIndex = index;\n\n                        // Check thisIndex >= 0 in case thisIndex has\n                        // not been found yet\n                    } else if (thisIndex >= 0 && index > thisIndex) {\n                        // There was an axis on the same side with a\n                        // higher index. Exit the loop.\n                        isOuter = false;\n                        return;\n                    }\n                }\n            });\n            // There were either no other axes on the same side,\n            // or the other axes were not farther from the chart\n            return isOuter;\n        };\n\n        /**\n         * Shortcut function to Tick.label.getBBox().width.\n         *\n         * @return {number} width - the width of the tick label\n         */\n        Tick.prototype.getLabelWidth = function() {\n            return this.label.getBBox().width;\n        };\n\n        /**\n         * Get the maximum label length.\n         * This function can be used in states where the axis.maxLabelLength has not\n         * been set.\n         *\n         * @param  {boolean} force - Optional parameter to force a new calculation, even\n         *                           if a value has already been set\n         * @return {number} maxLabelLength - the maximum label length of the axis\n         */\n        Axis.prototype.getMaxLabelLength = function(force) {\n            var tickPositions = this.tickPositions,\n                ticks = this.ticks,\n                maxLabelLength = 0;\n\n            if (!this.maxLabelLength || force) {\n                each(tickPositions, function(tick) {\n                    tick = ticks[tick];\n                    if (tick && tick.labelLength > maxLabelLength) {\n                        maxLabelLength = tick.labelLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n            }\n            return this.maxLabelLength;\n        };\n\n        /**\n         * Adds the axis defined in axis.options.title\n         */\n        Axis.prototype.addTitle = function() {\n            var axis = this,\n                renderer = axis.chart.renderer,\n                axisParent = axis.axisParent,\n                horiz = axis.horiz,\n                opposite = axis.opposite,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                hasData,\n                showAxis,\n                textAlign;\n\n            // For reuse in Axis.render\n            hasData = axis.hasData();\n            axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n            // Disregard title generation in original Axis.getOffset()\n            options.title = '';\n\n            if (!axis.axisTitle) {\n                textAlign = axisTitleOptions.textAlign;\n                if (!textAlign) {\n                    textAlign = (horiz ? {\n                        low: 'left',\n                        middle: 'center',\n                        high: 'right'\n                    } : {\n                        low: opposite ? 'right' : 'left',\n                        middle: 'center',\n                        high: opposite ? 'left' : 'right'\n                    })[axisTitleOptions.align];\n                }\n                axis.axisTitle = renderer.text(\n                        axisTitleOptions.text,\n                        0,\n                        0,\n                        axisTitleOptions.useHTML\n                    )\n                    .attr({\n                        zIndex: 7,\n                        rotation: axisTitleOptions.rotation || 0,\n                        align: textAlign\n                    })\n                    .addClass('highcharts-axis-title')\n\n                    // Add to axisParent instead of axisGroup, to ignore the space\n                    // it takes\n                    .add(axisParent);\n                axis.axisTitle.isNew = true;\n            }\n\n\n            // hide or show the title depending on whether showEmpty is set\n            axis.axisTitle[showAxis ? 'show' : 'hide'](true);\n        };\n\n        /**\n         * Add custom date formats\n         */\n        H.dateFormats = {\n            // Week number\n            W: function(timestamp) {\n                var date = new Date(timestamp),\n                    day = date.getUTCDay() === 0 ? 7 : date.getUTCDay(),\n                    time = date.getTime(),\n                    startOfYear = new Date(date.getUTCFullYear(), 0, 1, -6),\n                    dayNumber;\n                date.setDate(date.getUTCDate() + 4 - day);\n                dayNumber = Math.floor((time - startOfYear) / 86400000);\n                return 1 + Math.floor(dayNumber / 7);\n            },\n            // First letter of the day of the week, e.g. 'M' for 'Monday'.\n            E: function(timestamp) {\n                return dateFormat('%a', timestamp, true).charAt(0);\n            }\n        };\n\n        /**\n         * Prevents adding the last tick label if the axis is not a category axis.\n         *\n         * Since numeric labels are normally placed at starts and ends of a range of\n         * value, and this module makes the label point at the value, an \"extra\" label\n         * would appear.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Tick.prototype, 'addLabel', function(proceed) {\n            var axis = this.axis,\n                isCategoryAxis = axis.options.categories !== undefined,\n                tickPositions = axis.tickPositions,\n                lastTick = tickPositions[tickPositions.length - 1],\n                isLastTick = this.pos !== lastTick;\n\n            if (!axis.options.grid || isCategoryAxis || isLastTick) {\n                proceed.apply(this);\n            }\n        });\n\n        /**\n         * Center tick labels vertically and horizontally between ticks\n         *\n         * @param {function} proceed - the original function\n         *\n         * @return {object} object - an object containing x and y positions\n         *\t\t\t\t\t\t for the tick\n         */\n        wrap(Tick.prototype, 'getLabelPosition', function(proceed, x, y, label) {\n            var retVal = proceed.apply(this, Array.prototype.slice.call(arguments, 1)),\n                axis = this.axis,\n                options = axis.options,\n                tickInterval = options.tickInterval || 1,\n                newX,\n                newPos,\n                axisHeight,\n                fontSize,\n                labelMetrics,\n                lblB,\n                lblH,\n                labelCenter;\n\n            // Only center tick labels if axis has option grid: true\n            if (options.grid) {\n                fontSize = options.labels.style.fontSize;\n                labelMetrics = axis.chart.renderer.fontMetrics(fontSize, label);\n                lblB = labelMetrics.b;\n                lblH = labelMetrics.h;\n\n                if (axis.horiz && options.categories === undefined) {\n                    // Center x position\n                    axisHeight = axis.axisGroup.getBBox().height;\n                    newPos = this.pos + tickInterval / 2;\n                    retVal.x = axis.translate(newPos) + axis.left;\n                    labelCenter = (axisHeight / 2) + (lblH / 2) - Math.abs(lblH - lblB);\n\n                    // Center y position\n                    if (axis.side === axisSide.top) {\n                        retVal.y = y - labelCenter;\n                    } else {\n                        retVal.y = y + labelCenter;\n                    }\n                } else {\n                    // Center y position\n                    if (options.categories === undefined) {\n                        newPos = this.pos + (tickInterval / 2);\n                        retVal.y = axis.translate(newPos) + axis.top + (lblB / 2);\n                    }\n\n                    // Center x position\n                    newX = (this.getLabelWidth() / 2) - (axis.maxLabelLength / 2);\n                    if (axis.side === axisSide.left) {\n                        retVal.x += newX;\n                    } else {\n                        retVal.x -= newX;\n                    }\n                }\n            }\n            return retVal;\n        });\n\n\n        /**\n         * Draw vertical ticks extra long to create cell floors and roofs.\n         * Overrides the tickLength for vertical axes.\n         *\n         * @param {function} proceed - the original function\n         * @returns {array} retVal -\n         */\n        wrap(Axis.prototype, 'tickSize', function(proceed) {\n            var axis = this,\n                retVal = proceed.apply(axis, Array.prototype.slice.call(arguments, 1)),\n                labelPadding,\n                distance;\n\n            if (axis.options.grid && !axis.horiz) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                if (!axis.maxLabelLength) {\n                    axis.maxLabelLength = axis.getMaxLabelLength();\n                }\n                distance = axis.maxLabelLength + labelPadding;\n\n                retVal[0] = distance;\n            }\n            return retVal;\n        });\n\n        /**\n         * Disregards space required by axisTitle, by adding axisTitle to axisParent\n         * instead of axisGroup, and disregarding margins and offsets related to\n         * axisTitle.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'getOffset', function(proceed) {\n            var axis = this,\n                axisOffset = axis.chart.axisOffset,\n                side = axis.side,\n                axisHeight,\n                tickSize,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                addTitle = axisTitleOptions &&\n                axisTitleOptions.text &&\n                axisTitleOptions.enabled !== false;\n\n            if (axis.options.grid && isObject(axis.options.title)) {\n\n                tickSize = axis.tickSize('tick')[0];\n                if (axisOffset[side] && tickSize) {\n                    axisHeight = axisOffset[side] + tickSize;\n                }\n\n                if (addTitle) {\n                    // Use the custom addTitle() to add it, while preventing making room\n                    // for it\n                    axis.addTitle();\n                }\n\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n                axisOffset[side] = pick(axisHeight, axisOffset[side]);\n\n\n                // Put axis options back after original Axis.getOffset() has been called\n                options.title = axisTitleOptions;\n\n            } else {\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        /**\n         * Prevents rotation of labels when squished, as rotating them would not\n         * help.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'renderUnsquish', function(proceed) {\n            if (this.options.grid) {\n                this.labelRotation = 0;\n                this.options.labels.rotation = 0;\n            }\n            proceed.apply(this);\n        });\n\n        /**\n         * Places leftmost tick at the start of the axis, to create a left wall.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {\n            var axis = this;\n            if (userOptions.grid && axis.horiz) {\n                userOptions.startOnTick = true;\n                userOptions.minPadding = 0;\n                userOptions.endOnTick = true;\n            }\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        /**\n         * Draw an extra line on the far side of the the axisLine,\n         * creating cell roofs of a grid.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'render', function(proceed) {\n            var axis = this,\n                options = axis.options,\n                labelPadding,\n                distance,\n                lineWidth,\n                linePath,\n                yStartIndex,\n                yEndIndex,\n                xStartIndex,\n                xEndIndex,\n                renderer = axis.chart.renderer,\n                axisGroupBox;\n\n            if (options.grid) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                distance = axis.maxLabelLength + labelPadding;\n                lineWidth = options.lineWidth;\n\n                // Remove right wall before rendering\n                if (axis.rightWall) {\n                    axis.rightWall.destroy();\n                }\n\n                // Call original Axis.render() to obtain axis.axisLine and\n                // axis.axisGroup\n                proceed.apply(axis);\n\n                axisGroupBox = axis.axisGroup.getBBox();\n\n                // Add right wall on horizontal axes\n                if (axis.horiz) {\n                    axis.rightWall = renderer.path([\n                            'M',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y,\n                            'L',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y + axisGroupBox.height\n                        ])\n                        .attr({\n                            stroke: options.tickColor || '#ccd6eb',\n                            'stroke-width': options.tickWidth || 1,\n                            zIndex: 7,\n                            class: 'grid-wall'\n                        })\n                        .add(axis.axisGroup);\n                }\n\n                if (axis.isOuterAxis() && axis.axisLine) {\n                    if (axis.horiz) {\n                        // -1 to avoid adding distance each time the chart updates\n                        distance = axisGroupBox.height - 1;\n                    }\n\n                    if (lineWidth) {\n                        linePath = axis.getLinePath(lineWidth);\n                        xStartIndex = linePath.indexOf('M') + 1;\n                        xEndIndex = linePath.indexOf('L') + 1;\n                        yStartIndex = linePath.indexOf('M') + 2;\n                        yEndIndex = linePath.indexOf('L') + 2;\n\n                        // Negate distance if top or left axis\n                        if (axis.side === axisSide.top || axis.side === axisSide.left) {\n                            distance = -distance;\n                        }\n\n                        // If axis is horizontal, reposition line path vertically\n                        if (axis.horiz) {\n                            linePath[yStartIndex] = linePath[yStartIndex] + distance;\n                            linePath[yEndIndex] = linePath[yEndIndex] + distance;\n                        } else {\n                            // If axis is vertical, reposition line path horizontally\n                            linePath[xStartIndex] = linePath[xStartIndex] + distance;\n                            linePath[xEndIndex] = linePath[xEndIndex] + distance;\n                        }\n\n                        if (!axis.axisLineExtra) {\n                            axis.axisLineExtra = renderer.path(linePath)\n                                .attr({\n                                    stroke: options.lineColor,\n                                    'stroke-width': lineWidth,\n                                    zIndex: 7\n                                })\n                                .add(axis.axisGroup);\n                        } else {\n                            axis.axisLineExtra.animate({\n                                d: linePath\n                            });\n                        }\n\n                        // show or hide the line depending on options.showEmpty\n                        axis.axisLine[axis.showAxis ? 'show' : 'hide'](true);\n                    }\n                }\n            } else {\n                proceed.apply(axis);\n            }\n        });\n\n        /**\n         * Wraps chart rendering with the following customizations:\n         * 1. Prohibit timespans of multitudes of a time unit\n         * 2. Draw cell walls on vertical axes\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Chart.prototype, 'render', function(proceed) {\n            // 25 is optimal height for default fontSize (11px)\n            // 25 / 11 ≈ 2.28\n            var fontSizeToCellHeightRatio = 25 / 11,\n                fontMetrics,\n                fontSize;\n\n            each(this.axes, function(axis) {\n                var options = axis.options;\n                if (options.grid) {\n                    fontSize = options.labels.style.fontSize;\n                    fontMetrics = axis.chart.renderer.fontMetrics(fontSize);\n\n                    // Prohibit timespans of multitudes of a time unit,\n                    // e.g. two days, three weeks, etc.\n                    if (options.type === 'datetime') {\n                        options.units = [\n                            ['millisecond', [1]],\n                            ['second', [1]],\n                            ['minute', [1]],\n                            ['hour', [1]],\n                            ['day', [1]],\n                            ['week', [1]],\n                            ['month', [1]],\n                            ['year', null]\n                        ];\n                    }\n\n                    // Make tick marks taller, creating cell walls of a grid.\n                    // Use cellHeight axis option if set\n                    if (axis.horiz) {\n                        options.tickLength = options.cellHeight ||\n                            fontMetrics.h * fontSizeToCellHeightRatio;\n                    } else {\n                        options.tickWidth = 1;\n                        if (!options.lineWidth) {\n                            options.lineWidth = 1;\n                        }\n                    }\n                }\n            });\n\n            // Call original Chart.render()\n            proceed.apply(this);\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2014-2017 Highsoft AS\n         * Authors: Torstein Honsi, Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var defaultPlotOptions = H.getOptions().plotOptions,\n            color = H.Color,\n            columnType = H.seriesTypes.column,\n            each = H.each,\n            extendClass = H.extendClass,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            pick = H.pick,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Point = H.Point,\n            Series = H.Series,\n            pointFormat = '<span style=\"color:{point.color}\">' +\n            '\\u25CF' +\n            '</span> {series.name}: <b>{point.yCategory}</b><br/>',\n            xrange = 'xrange';\n\n        defaultPlotOptions.xrange = merge(defaultPlotOptions.column, {\n            tooltip: {\n                pointFormat: pointFormat\n            }\n        });\n        seriesTypes.xrange = extendClass(columnType, {\n            pointClass: extendClass(Point, {\n                // Add x2 and yCategory to the available properties for tooltip formats\n                getLabelConfig: function() {\n                    var cfg = Point.prototype.getLabelConfig.call(this);\n\n                    cfg.x2 = this.x2;\n                    cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y];\n                    return cfg;\n                }\n            }),\n            type: xrange,\n            forceDL: true,\n            parallelArrays: ['x', 'x2', 'y'],\n            requireSorting: false,\n            animate: seriesTypes.line.prototype.animate,\n\n            /**\n             * Borrow the column series metrics, but with swapped axes. This gives free access\n             * to features like groupPadding, grouping, pointWidth etc.\n             */\n            getColumnMetrics: function() {\n                var metrics,\n                    chart = this.chart;\n\n                function swapAxes() {\n                    each(chart.series, function(s) {\n                        var xAxis = s.xAxis;\n                        s.xAxis = s.yAxis;\n                        s.yAxis = xAxis;\n                    });\n                }\n\n                swapAxes();\n\n                this.yAxis.closestPointRange = 1;\n                metrics = columnType.prototype.getColumnMetrics.call(this);\n\n                swapAxes();\n\n                return metrics;\n            },\n\n            /**\n             * Override cropData to show a point where x is outside visible range\n             * but x2 is outside.\n             */\n            cropData: function(xData, yData, min, max) {\n\n                // Replace xData with x2Data to find the appropriate cropStart\n                var cropData = Series.prototype.cropData,\n                    crop = cropData.call(this, this.x2Data, yData, min, max);\n\n                // Re-insert the cropped xData\n                crop.xData = xData.slice(crop.start, crop.end);\n\n                return crop;\n            },\n\n            translate: function() {\n                columnType.prototype.translate.apply(this, arguments);\n                var series = this,\n                    xAxis = series.xAxis,\n                    metrics = series.columnMetrics,\n                    minPointLength = series.options.minPointLength || 0;\n\n                each(series.points, function(point) {\n                    var plotX = point.plotX,\n                        posX = pick(point.x2, point.x + (point.len || 0)),\n                        plotX2 = xAxis.toPixels(posX, true),\n                        width = plotX2 - plotX,\n                        widthDifference,\n                        shapeArgs,\n                        partialFill;\n\n                    if (minPointLength) {\n                        widthDifference = minPointLength - width;\n                        if (widthDifference < 0) {\n                            widthDifference = 0;\n                        }\n                        plotX -= widthDifference / 2;\n                        plotX2 += widthDifference / 2;\n                    }\n\n                    plotX = Math.max(plotX, -10);\n                    plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10);\n\n                    if (plotX2 < plotX) { // #6107\n                        plotX2 = plotX;\n                    }\n\n                    point.shapeArgs = {\n                        x: plotX,\n                        y: point.plotY + metrics.offset,\n                        width: plotX2 - plotX,\n                        height: metrics.width\n                    };\n                    point.tooltipPos[0] += width / 2;\n                    point.tooltipPos[1] -= metrics.width / 2;\n\n                    // Add a partShapeArgs to the point, based on the shapeArgs property\n                    partialFill = point.partialFill;\n                    if (partialFill) {\n                        // Get the partial fill amount\n                        if (isObject(partialFill)) {\n                            partialFill = partialFill.amount;\n                        }\n                        // If it was not a number, assume 0\n                        if (!isNumber(partialFill)) {\n                            partialFill = 0;\n                        }\n                        shapeArgs = point.shapeArgs;\n                        point.partShapeArgs = {\n                            x: shapeArgs.x,\n                            y: shapeArgs.y + 1,\n                            width: shapeArgs.width * partialFill,\n                            height: shapeArgs.height - 2\n                        };\n                    }\n                });\n            },\n\n            drawPoints: function() {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    verb = chart.pointCount < animationLimit ? 'animate' : 'attr';\n\n                // draw the columns\n                each(series.points, function(point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic,\n                        type = point.shapeType,\n                        shapeArgs = point.shapeArgs,\n                        partShapeArgs = point.partShapeArgs,\n                        seriesOpts = series.options,\n                        pfOptions = point.partialFill,\n                        fill,\n                        state = point.selected && 'select',\n                        cutOff = options.stacking && !options.borderRadius;\n\n                    if (isNumber(plotY) && point.y !== null) {\n                        if (graphic) { // update\n                            point.graphicOriginal[verb](\n                                merge(shapeArgs)\n                            );\n                            if (partShapeArgs) {\n                                point.graphicOverlay[verb](\n                                    merge(partShapeArgs)\n                                );\n                            }\n\n                        } else {\n                            point.graphic = graphic = renderer.g('point')\n                                .attr({\n                                    'class': point.getClassName()\n                                })\n                                .add(point.group || series.group);\n\n                            point.graphicOriginal = renderer[type](shapeArgs)\n                                .addClass('highcharts-partfill-original')\n                                .add(graphic);\n                            if (partShapeArgs) {\n                                point.graphicOverlay = renderer[type](partShapeArgs)\n                                    .addClass('highcharts-partfill-overlay')\n                                    .add(graphic);\n                            }\n                        }\n\n\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            }\n        });\n\n        /**\n         * Max x2 should be considered in xAxis extremes\n         */\n        wrap(Axis.prototype, 'getSeriesExtremes', function(proceed) {\n            var axis = this,\n                series = axis.series,\n                dataMax,\n                modMax;\n\n            proceed.call(this);\n            if (axis.isXAxis && series.type === xrange) {\n                dataMax = pick(axis.dataMax, Number.MIN_VALUE);\n                each(this.series, function(series) {\n                    each(series.x2Data || [], function(val) {\n                        if (val > dataMax) {\n                            dataMax = val;\n                            modMax = true;\n                        }\n                    });\n                });\n                if (modMax) {\n                    axis.dataMax = dataMax;\n                }\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2016 Highsoft AS\n         * Authors: Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n        // \n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/grid-axis.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n GridAxis\n\n (c) 2016 Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(h){var n=h.dateFormat,p=h.each,t=h.isObject,r=h.pick,l=h.wrap,m=h.Axis,u=h.Chart,q=h.Tick;m.prototype.isOuterAxis=function(){var a=this,c=-1,b=!0;p(this.chart.axes,function(e,f){e.side===a.side&&(e===a?c=f:0<=c&&f>c&&(b=!1))});return b};q.prototype.getLabelWidth=function(){return this.label.getBBox().width};m.prototype.getMaxLabelLength=function(a){var c=this.tickPositions,b=this.ticks,e=0;\nif(!this.maxLabelLength||a)p(c,function(a){(a=b[a])&&a.labelLength>e&&(e=a.labelLength)}),this.maxLabelLength=e;return this.maxLabelLength};m.prototype.addTitle=function(){var a=this.chart.renderer,c=this.axisParent,b=this.horiz,e=this.opposite,f=this.options,d=f.title,g;this.showAxis=g=this.hasData()||r(f.showEmpty,!0);f.title=\"\";this.axisTitle||((f=d.textAlign)||(f=(b?{low:\"left\",middle:\"center\",high:\"right\"}:{low:e?\"right\":\"left\",middle:\"center\",high:e?\"left\":\"right\"})[d.align]),this.axisTitle=\na.text(d.text,0,0,d.useHTML).attr({zIndex:7,rotation:d.rotation||0,align:f}).addClass(\"highcharts-axis-title\").add(c),this.axisTitle.isNew=!0);this.axisTitle[g?\"show\":\"hide\"](!0)};h.dateFormats={W:function(a){a=new Date(a);var c=0===a.getUTCDay()?7:a.getUTCDay(),b=a.getTime(),e=new Date(a.getUTCFullYear(),0,1,-6);a.setDate(a.getUTCDate()+4-c);return 1+Math.floor(Math.floor((b-e)/864E5)/7)},E:function(a){return n(\"%a\",a,!0).charAt(0)}};l(q.prototype,\"addLabel\",function(a){var c=this.axis,b=void 0!==\nc.options.categories,e=c.tickPositions,e=this.pos!==e[e.length-1];(!c.options.grid||b||e)&&a.apply(this)});l(q.prototype,\"getLabelPosition\",function(a,c,b,e){var f=a.apply(this,Array.prototype.slice.call(arguments,1)),d=this.axis,g=d.options,k=g.tickInterval||1,h,l;g.grid&&(h=g.labels.style.fontSize,l=d.chart.renderer.fontMetrics(h,e),h=l.b,l=l.h,d.horiz&&void 0===g.categories?(g=d.axisGroup.getBBox().height,k=this.pos+k/2,f.x=d.translate(k)+d.left,k=g/2+l/2-Math.abs(l-h),f.y=0===d.side?b-k:b+k):\n(void 0===g.categories&&(k=this.pos+k/2,f.y=d.translate(k)+d.top+h/2),k=this.getLabelWidth()/2-d.maxLabelLength/2,f.x=3===d.side?f.x+k:f.x-k));return f});l(m.prototype,\"tickSize\",function(a){var c=a.apply(this,Array.prototype.slice.call(arguments,1)),b;this.options.grid&&!this.horiz&&(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),this.maxLabelLength||(this.maxLabelLength=this.getMaxLabelLength()),b=this.maxLabelLength+b,c[0]=b);return c});l(m.prototype,\"getOffset\",function(a){var c=this.chart.axisOffset,\nb=this.side,e,f,d=this.options,g=d.title,k=g&&g.text&&!1!==g.enabled;this.options.grid&&t(this.options.title)?(f=this.tickSize(\"tick\")[0],c[b]&&f&&(e=c[b]+f),k&&this.addTitle(),a.apply(this,Array.prototype.slice.call(arguments,1)),c[b]=r(e,c[b]),d.title=g):a.apply(this,Array.prototype.slice.call(arguments,1))});l(m.prototype,\"renderUnsquish\",function(a){this.options.grid&&(this.labelRotation=0,this.options.labels.rotation=0);a.apply(this)});l(m.prototype,\"setOptions\",function(a,c){c.grid&&this.horiz&&\n(c.startOnTick=!0,c.minPadding=0,c.endOnTick=!0);a.apply(this,Array.prototype.slice.call(arguments,1))});l(m.prototype,\"render\",function(a){var c=this.options,b,e,f,d,g,k,h=this.chart.renderer;if(c.grid){if(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),b=this.maxLabelLength+b,e=c.lineWidth,this.rightWall&&this.rightWall.destroy(),a.apply(this),a=this.axisGroup.getBBox(),this.horiz&&(this.rightWall=h.path([\"M\",a.x+this.width+1,a.y,\"L\",a.x+this.width+1,a.y+a.height]).attr({stroke:c.tickColor||\n\"#ccd6eb\",\"stroke-width\":c.tickWidth||1,zIndex:7,class:\"grid-wall\"}).add(this.axisGroup)),this.isOuterAxis()&&this.axisLine&&(this.horiz&&(b=a.height-1),e)){a=this.getLinePath(e);g=a.indexOf(\"M\")+1;k=a.indexOf(\"L\")+1;f=a.indexOf(\"M\")+2;d=a.indexOf(\"L\")+2;if(0===this.side||3===this.side)b=-b;this.horiz?(a[f]+=b,a[d]+=b):(a[g]+=b,a[k]+=b);this.axisLineExtra?this.axisLineExtra.animate({d:a}):this.axisLineExtra=h.path(a).attr({stroke:c.lineColor,\"stroke-width\":e,zIndex:7}).add(this.axisGroup);this.axisLine[this.showAxis?\n\"show\":\"hide\"](!0)}}else a.apply(this)});l(u.prototype,\"render\",function(a){var c=25/11,b,e;p(this.axes,function(a){var d=a.options;d.grid&&(e=d.labels.style.fontSize,b=a.chart.renderer.fontMetrics(e),\"datetime\"===d.type&&(d.units=[[\"millisecond\",[1]],[\"second\",[1]],[\"minute\",[1]],[\"hour\",[1]],[\"day\",[1]],[\"week\",[1]],[\"month\",[1]],[\"year\",null]]),a.horiz?d.tickLength=d.cellHeight||b.h*c:(d.tickWidth=1,d.lineWidth||(d.lineWidth=1)))});a.apply(this)})})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/grid-axis.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * GridAxis\n *\n * (c) 2016 Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2016 Highsoft AS\n         * Authors: Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var dateFormat = H.dateFormat,\n            each = H.each,\n            isObject = H.isObject,\n            pick = H.pick,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            Tick = H.Tick;\n\n\n        // Enum for which side the axis is on.\n        // Maps to axis.side\n        var axisSide = {\n            top: 0,\n            right: 1,\n            bottom: 2,\n            left: 3,\n            0: 'top',\n            1: 'right',\n            2: 'bottom',\n            3: 'left'\n        };\n\n        /**\n         * Checks if an axis is the outer axis in its dimension. Since\n         * axes are placed outwards in order, the axis with the highest\n         * index is the outermost axis.\n         *\n         * Example: If there are multiple x-axes at the top of the chart,\n         * this function returns true if the axis supplied is the last\n         * of the x-axes.\n         *\n         * @return true if the axis is the outermost axis in its dimension;\n         *\t\t false if not\n         */\n        Axis.prototype.isOuterAxis = function() {\n            var axis = this,\n                thisIndex = -1,\n                isOuter = true;\n\n            each(this.chart.axes, function(otherAxis, index) {\n                if (otherAxis.side === axis.side) {\n                    if (otherAxis === axis) {\n                        // Get the index of the axis in question\n                        thisIndex = index;\n\n                        // Check thisIndex >= 0 in case thisIndex has\n                        // not been found yet\n                    } else if (thisIndex >= 0 && index > thisIndex) {\n                        // There was an axis on the same side with a\n                        // higher index. Exit the loop.\n                        isOuter = false;\n                        return;\n                    }\n                }\n            });\n            // There were either no other axes on the same side,\n            // or the other axes were not farther from the chart\n            return isOuter;\n        };\n\n        /**\n         * Shortcut function to Tick.label.getBBox().width.\n         *\n         * @return {number} width - the width of the tick label\n         */\n        Tick.prototype.getLabelWidth = function() {\n            return this.label.getBBox().width;\n        };\n\n        /**\n         * Get the maximum label length.\n         * This function can be used in states where the axis.maxLabelLength has not\n         * been set.\n         *\n         * @param  {boolean} force - Optional parameter to force a new calculation, even\n         *                           if a value has already been set\n         * @return {number} maxLabelLength - the maximum label length of the axis\n         */\n        Axis.prototype.getMaxLabelLength = function(force) {\n            var tickPositions = this.tickPositions,\n                ticks = this.ticks,\n                maxLabelLength = 0;\n\n            if (!this.maxLabelLength || force) {\n                each(tickPositions, function(tick) {\n                    tick = ticks[tick];\n                    if (tick && tick.labelLength > maxLabelLength) {\n                        maxLabelLength = tick.labelLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n            }\n            return this.maxLabelLength;\n        };\n\n        /**\n         * Adds the axis defined in axis.options.title\n         */\n        Axis.prototype.addTitle = function() {\n            var axis = this,\n                renderer = axis.chart.renderer,\n                axisParent = axis.axisParent,\n                horiz = axis.horiz,\n                opposite = axis.opposite,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                hasData,\n                showAxis,\n                textAlign;\n\n            // For reuse in Axis.render\n            hasData = axis.hasData();\n            axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n            // Disregard title generation in original Axis.getOffset()\n            options.title = '';\n\n            if (!axis.axisTitle) {\n                textAlign = axisTitleOptions.textAlign;\n                if (!textAlign) {\n                    textAlign = (horiz ? {\n                        low: 'left',\n                        middle: 'center',\n                        high: 'right'\n                    } : {\n                        low: opposite ? 'right' : 'left',\n                        middle: 'center',\n                        high: opposite ? 'left' : 'right'\n                    })[axisTitleOptions.align];\n                }\n                axis.axisTitle = renderer.text(\n                        axisTitleOptions.text,\n                        0,\n                        0,\n                        axisTitleOptions.useHTML\n                    )\n                    .attr({\n                        zIndex: 7,\n                        rotation: axisTitleOptions.rotation || 0,\n                        align: textAlign\n                    })\n                    .addClass('highcharts-axis-title')\n\n                    // Add to axisParent instead of axisGroup, to ignore the space\n                    // it takes\n                    .add(axisParent);\n                axis.axisTitle.isNew = true;\n            }\n\n\n            // hide or show the title depending on whether showEmpty is set\n            axis.axisTitle[showAxis ? 'show' : 'hide'](true);\n        };\n\n        /**\n         * Add custom date formats\n         */\n        H.dateFormats = {\n            // Week number\n            W: function(timestamp) {\n                var date = new Date(timestamp),\n                    day = date.getUTCDay() === 0 ? 7 : date.getUTCDay(),\n                    time = date.getTime(),\n                    startOfYear = new Date(date.getUTCFullYear(), 0, 1, -6),\n                    dayNumber;\n                date.setDate(date.getUTCDate() + 4 - day);\n                dayNumber = Math.floor((time - startOfYear) / 86400000);\n                return 1 + Math.floor(dayNumber / 7);\n            },\n            // First letter of the day of the week, e.g. 'M' for 'Monday'.\n            E: function(timestamp) {\n                return dateFormat('%a', timestamp, true).charAt(0);\n            }\n        };\n\n        /**\n         * Prevents adding the last tick label if the axis is not a category axis.\n         *\n         * Since numeric labels are normally placed at starts and ends of a range of\n         * value, and this module makes the label point at the value, an \"extra\" label\n         * would appear.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Tick.prototype, 'addLabel', function(proceed) {\n            var axis = this.axis,\n                isCategoryAxis = axis.options.categories !== undefined,\n                tickPositions = axis.tickPositions,\n                lastTick = tickPositions[tickPositions.length - 1],\n                isLastTick = this.pos !== lastTick;\n\n            if (!axis.options.grid || isCategoryAxis || isLastTick) {\n                proceed.apply(this);\n            }\n        });\n\n        /**\n         * Center tick labels vertically and horizontally between ticks\n         *\n         * @param {function} proceed - the original function\n         *\n         * @return {object} object - an object containing x and y positions\n         *\t\t\t\t\t\t for the tick\n         */\n        wrap(Tick.prototype, 'getLabelPosition', function(proceed, x, y, label) {\n            var retVal = proceed.apply(this, Array.prototype.slice.call(arguments, 1)),\n                axis = this.axis,\n                options = axis.options,\n                tickInterval = options.tickInterval || 1,\n                newX,\n                newPos,\n                axisHeight,\n                fontSize,\n                labelMetrics,\n                lblB,\n                lblH,\n                labelCenter;\n\n            // Only center tick labels if axis has option grid: true\n            if (options.grid) {\n                fontSize = options.labels.style.fontSize;\n                labelMetrics = axis.chart.renderer.fontMetrics(fontSize, label);\n                lblB = labelMetrics.b;\n                lblH = labelMetrics.h;\n\n                if (axis.horiz && options.categories === undefined) {\n                    // Center x position\n                    axisHeight = axis.axisGroup.getBBox().height;\n                    newPos = this.pos + tickInterval / 2;\n                    retVal.x = axis.translate(newPos) + axis.left;\n                    labelCenter = (axisHeight / 2) + (lblH / 2) - Math.abs(lblH - lblB);\n\n                    // Center y position\n                    if (axis.side === axisSide.top) {\n                        retVal.y = y - labelCenter;\n                    } else {\n                        retVal.y = y + labelCenter;\n                    }\n                } else {\n                    // Center y position\n                    if (options.categories === undefined) {\n                        newPos = this.pos + (tickInterval / 2);\n                        retVal.y = axis.translate(newPos) + axis.top + (lblB / 2);\n                    }\n\n                    // Center x position\n                    newX = (this.getLabelWidth() / 2) - (axis.maxLabelLength / 2);\n                    if (axis.side === axisSide.left) {\n                        retVal.x += newX;\n                    } else {\n                        retVal.x -= newX;\n                    }\n                }\n            }\n            return retVal;\n        });\n\n\n        /**\n         * Draw vertical ticks extra long to create cell floors and roofs.\n         * Overrides the tickLength for vertical axes.\n         *\n         * @param {function} proceed - the original function\n         * @returns {array} retVal -\n         */\n        wrap(Axis.prototype, 'tickSize', function(proceed) {\n            var axis = this,\n                retVal = proceed.apply(axis, Array.prototype.slice.call(arguments, 1)),\n                labelPadding,\n                distance;\n\n            if (axis.options.grid && !axis.horiz) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                if (!axis.maxLabelLength) {\n                    axis.maxLabelLength = axis.getMaxLabelLength();\n                }\n                distance = axis.maxLabelLength + labelPadding;\n\n                retVal[0] = distance;\n            }\n            return retVal;\n        });\n\n        /**\n         * Disregards space required by axisTitle, by adding axisTitle to axisParent\n         * instead of axisGroup, and disregarding margins and offsets related to\n         * axisTitle.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'getOffset', function(proceed) {\n            var axis = this,\n                axisOffset = axis.chart.axisOffset,\n                side = axis.side,\n                axisHeight,\n                tickSize,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                addTitle = axisTitleOptions &&\n                axisTitleOptions.text &&\n                axisTitleOptions.enabled !== false;\n\n            if (axis.options.grid && isObject(axis.options.title)) {\n\n                tickSize = axis.tickSize('tick')[0];\n                if (axisOffset[side] && tickSize) {\n                    axisHeight = axisOffset[side] + tickSize;\n                }\n\n                if (addTitle) {\n                    // Use the custom addTitle() to add it, while preventing making room\n                    // for it\n                    axis.addTitle();\n                }\n\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n                axisOffset[side] = pick(axisHeight, axisOffset[side]);\n\n\n                // Put axis options back after original Axis.getOffset() has been called\n                options.title = axisTitleOptions;\n\n            } else {\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        /**\n         * Prevents rotation of labels when squished, as rotating them would not\n         * help.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'renderUnsquish', function(proceed) {\n            if (this.options.grid) {\n                this.labelRotation = 0;\n                this.options.labels.rotation = 0;\n            }\n            proceed.apply(this);\n        });\n\n        /**\n         * Places leftmost tick at the start of the axis, to create a left wall.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {\n            var axis = this;\n            if (userOptions.grid && axis.horiz) {\n                userOptions.startOnTick = true;\n                userOptions.minPadding = 0;\n                userOptions.endOnTick = true;\n            }\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        /**\n         * Draw an extra line on the far side of the the axisLine,\n         * creating cell roofs of a grid.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'render', function(proceed) {\n            var axis = this,\n                options = axis.options,\n                labelPadding,\n                distance,\n                lineWidth,\n                linePath,\n                yStartIndex,\n                yEndIndex,\n                xStartIndex,\n                xEndIndex,\n                renderer = axis.chart.renderer,\n                axisGroupBox;\n\n            if (options.grid) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                distance = axis.maxLabelLength + labelPadding;\n                lineWidth = options.lineWidth;\n\n                // Remove right wall before rendering\n                if (axis.rightWall) {\n                    axis.rightWall.destroy();\n                }\n\n                // Call original Axis.render() to obtain axis.axisLine and\n                // axis.axisGroup\n                proceed.apply(axis);\n\n                axisGroupBox = axis.axisGroup.getBBox();\n\n                // Add right wall on horizontal axes\n                if (axis.horiz) {\n                    axis.rightWall = renderer.path([\n                            'M',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y,\n                            'L',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y + axisGroupBox.height\n                        ])\n                        .attr({\n                            stroke: options.tickColor || '#ccd6eb',\n                            'stroke-width': options.tickWidth || 1,\n                            zIndex: 7,\n                            class: 'grid-wall'\n                        })\n                        .add(axis.axisGroup);\n                }\n\n                if (axis.isOuterAxis() && axis.axisLine) {\n                    if (axis.horiz) {\n                        // -1 to avoid adding distance each time the chart updates\n                        distance = axisGroupBox.height - 1;\n                    }\n\n                    if (lineWidth) {\n                        linePath = axis.getLinePath(lineWidth);\n                        xStartIndex = linePath.indexOf('M') + 1;\n                        xEndIndex = linePath.indexOf('L') + 1;\n                        yStartIndex = linePath.indexOf('M') + 2;\n                        yEndIndex = linePath.indexOf('L') + 2;\n\n                        // Negate distance if top or left axis\n                        if (axis.side === axisSide.top || axis.side === axisSide.left) {\n                            distance = -distance;\n                        }\n\n                        // If axis is horizontal, reposition line path vertically\n                        if (axis.horiz) {\n                            linePath[yStartIndex] = linePath[yStartIndex] + distance;\n                            linePath[yEndIndex] = linePath[yEndIndex] + distance;\n                        } else {\n                            // If axis is vertical, reposition line path horizontally\n                            linePath[xStartIndex] = linePath[xStartIndex] + distance;\n                            linePath[xEndIndex] = linePath[xEndIndex] + distance;\n                        }\n\n                        if (!axis.axisLineExtra) {\n                            axis.axisLineExtra = renderer.path(linePath)\n                                .attr({\n                                    stroke: options.lineColor,\n                                    'stroke-width': lineWidth,\n                                    zIndex: 7\n                                })\n                                .add(axis.axisGroup);\n                        } else {\n                            axis.axisLineExtra.animate({\n                                d: linePath\n                            });\n                        }\n\n                        // show or hide the line depending on options.showEmpty\n                        axis.axisLine[axis.showAxis ? 'show' : 'hide'](true);\n                    }\n                }\n            } else {\n                proceed.apply(axis);\n            }\n        });\n\n        /**\n         * Wraps chart rendering with the following customizations:\n         * 1. Prohibit timespans of multitudes of a time unit\n         * 2. Draw cell walls on vertical axes\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Chart.prototype, 'render', function(proceed) {\n            // 25 is optimal height for default fontSize (11px)\n            // 25 / 11 ≈ 2.28\n            var fontSizeToCellHeightRatio = 25 / 11,\n                fontMetrics,\n                fontSize;\n\n            each(this.axes, function(axis) {\n                var options = axis.options;\n                if (options.grid) {\n                    fontSize = options.labels.style.fontSize;\n                    fontMetrics = axis.chart.renderer.fontMetrics(fontSize);\n\n                    // Prohibit timespans of multitudes of a time unit,\n                    // e.g. two days, three weeks, etc.\n                    if (options.type === 'datetime') {\n                        options.units = [\n                            ['millisecond', [1]],\n                            ['second', [1]],\n                            ['minute', [1]],\n                            ['hour', [1]],\n                            ['day', [1]],\n                            ['week', [1]],\n                            ['month', [1]],\n                            ['year', null]\n                        ];\n                    }\n\n                    // Make tick marks taller, creating cell walls of a grid.\n                    // Use cellHeight axis option if set\n                    if (axis.horiz) {\n                        options.tickLength = options.cellHeight ||\n                            fontMetrics.h * fontSizeToCellHeightRatio;\n                    } else {\n                        options.tickWidth = 1;\n                        if (!options.lineWidth) {\n                            options.lineWidth = 1;\n                        }\n                    }\n                }\n            });\n\n            // Call original Chart.render()\n            proceed.apply(this);\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/heatmap.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(q){\"object\"===typeof module&&module.exports?module.exports=q:q(Highcharts)})(function(q){(function(b){var l=b.Axis,t=b.Chart,m=b.color,h,e=b.each,v=b.extend,w=b.isNumber,n=b.Legend,g=b.LegendSymbolMixin,x=b.noop,r=b.merge,u=b.pick,p=b.wrap;h=b.ColorAxis=function(){this.init.apply(this,arguments)};v(h.prototype,l.prototype);v(h.prototype,{defaultColorAxisOptions:{lineWidth:0,minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},\nwidth:.01},labels:{overflow:\"justify\",rotation:0},minColor:\"#e6ebf5\",maxColor:\"#003399\",tickLength:5,showInLegend:!0},keepProps:[\"legendGroup\",\"legendItemHeight\",\"legendItemWidth\",\"legendItem\",\"legendSymbol\"].concat(l.prototype.keepProps),init:function(a,c){var d=\"vertical\"!==a.options.legend.layout,k;this.coll=\"colorAxis\";k=r(this.defaultColorAxisOptions,{side:d?2:1,reversed:!d},c,{opposite:!d,showEmpty:!1,title:null});l.prototype.init.call(this,a,k);c.dataClasses&&this.initDataClasses(c);this.initStops();\nthis.horiz=d;this.zoomEnabled=!1;this.defaultLegendLength=200},initDataClasses:function(a){var c,d=0,k=this.chart.options.chart.colorCount,f=this.options,b=a.dataClasses.length;this.dataClasses=c=[];this.legendItems=[];e(a.dataClasses,function(a,e){a=r(a);c.push(a);a.color||(\"category\"===f.dataClassColor?(a.colorIndex=d,d++,d===k&&(d=0)):a.color=m(f.minColor).tweenTo(m(f.maxColor),2>b?.5:e/(b-1)))})},initStops:function(){this.stops=this.options.stops||[[0,this.options.minColor],[1,this.options.maxColor]];\ne(this.stops,function(a){a.color=m(a[1])})},setOptions:function(a){l.prototype.setOptions.call(this,a);this.options.crosshair=this.options.marker},setAxisSize:function(){var a=this.legendSymbol,c=this.chart,d=c.options.legend||{},k,f;a?(this.left=d=a.attr(\"x\"),this.top=k=a.attr(\"y\"),this.width=f=a.attr(\"width\"),this.height=a=a.attr(\"height\"),this.right=c.chartWidth-d-f,this.bottom=c.chartHeight-k-a,this.len=this.horiz?f:a,this.pos=this.horiz?d:k):this.len=(this.horiz?d.symbolWidth:d.symbolHeight)||\nthis.defaultLegendLength},normalizedValue:function(a){this.isLog&&(a=this.val2lin(a));return 1-(this.max-a)/(this.max-this.min||1)},toColor:function(a,c){var d=this.stops,k,f,b=this.dataClasses,e,g;if(b)for(g=b.length;g--;){if(e=b[g],k=e.from,d=e.to,(void 0===k||a>=k)&&(void 0===d||a<=d)){f=e.color;c&&(c.dataClass=g,c.colorIndex=e.colorIndex);break}}else{a=this.normalizedValue(a);for(g=d.length;g--&&!(a>d[g][0]););k=d[g]||d[g+1];d=d[g+1]||k;a=1-(d[0]-a)/(d[0]-k[0]||1);f=k.color.tweenTo(d.color,a)}return f},\ngetOffset:function(){var a=this.legendGroup,c=this.chart.axisOffset[this.side];a&&(this.axisParent=a,l.prototype.getOffset.call(this),this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=c)},setLegendColor:function(){var a,c=this.reversed;a=c?1:0;c=c?0:1;a=this.horiz?[a,0,c,0]:[0,c,0,a];this.legendColor={linearGradient:{x1:a[0],y1:a[1],x2:a[2],y2:a[3]},stops:this.stops}},drawLegendSymbol:function(a,c){var d=a.padding,b=a.options,f=this.horiz,g=u(b.symbolWidth,\nf?this.defaultLegendLength:12),e=u(b.symbolHeight,f?12:this.defaultLegendLength),h=u(b.labelPadding,f?16:30),b=u(b.itemDistance,10);this.setLegendColor();c.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,g,e).attr({zIndex:1}).add(c.legendGroup);this.legendItemWidth=g+d+(f?b:h);this.legendItemHeight=e+d+(f?h:0)},setState:x,visible:!0,setVisible:x,getSeriesExtremes:function(){var a=this.series,c=a.length;this.dataMin=Infinity;for(this.dataMax=-Infinity;c--;)void 0!==a[c].valueMin&&(this.dataMin=\nMath.min(this.dataMin,a[c].valueMin),this.dataMax=Math.max(this.dataMax,a[c].valueMax))},drawCrosshair:function(a,c){var d=c&&c.plotX,b=c&&c.plotY,f,g=this.pos,e=this.len;c&&(f=this.toPixels(c[c.series.colorKey]),f<g?f=g-2:f>g+e&&(f=g+e+2),c.plotX=f,c.plotY=this.len-f,l.prototype.drawCrosshair.call(this,a,c),c.plotX=d,c.plotY=b,this.cross&&this.cross.addClass(\"highcharts-coloraxis-marker\").add(this.legendGroup))},getPlotLinePath:function(a,c,d,b,f){return w(f)?this.horiz?[\"M\",f-4,this.top-6,\"L\",f+\n4,this.top-6,f,this.top,\"Z\"]:[\"M\",this.left,f,\"L\",this.left-6,f+6,this.left-6,f-6,\"Z\"]:l.prototype.getPlotLinePath.call(this,a,c,d,b)},update:function(a,c){var d=this.chart,b=d.legend;e(this.series,function(a){a.isDirtyData=!0});a.dataClasses&&b.allItems&&(e(b.allItems,function(a){a.isDataClass&&a.legendGroup&&a.legendGroup.destroy()}),d.isDirtyLegend=!0);d.options[this.coll]=r(this.userOptions,a);l.prototype.update.call(this,a,c);this.legendItem&&(this.setLegendColor(),b.colorizeItem(this,!0))},\nremove:function(){this.legendItem&&this.chart.legend.destroyItem(this);l.prototype.remove.call(this)},getDataClassLegendSymbols:function(){var a=this,c=this.chart,d=this.legendItems,k=c.options.legend,f=k.valueDecimals,h=k.valueSuffix||\"\",p;d.length||e(this.dataClasses,function(k,l){var n=!0,r=k.from,m=k.to;p=\"\";void 0===r?p=\"\\x3c \":void 0===m&&(p=\"\\x3e \");void 0!==r&&(p+=b.numberFormat(r,f)+h);void 0!==r&&void 0!==m&&(p+=\" - \");void 0!==m&&(p+=b.numberFormat(m,f)+h);d.push(v({chart:c,name:p,options:{},\ndrawLegendSymbol:g.drawRectangle,visible:!0,setState:x,isDataClass:!0,setVisible:function(){n=this.visible=!n;e(a.series,function(a){e(a.points,function(a){a.dataClass===l&&a.setVisible(n)})});c.legend.colorizeItem(this,n)}},k))});return d},name:\"\"});e([\"fill\",\"stroke\"],function(a){b.Fx.prototype[a+\"Setter\"]=function(){this.elem.attr(a,m(this.start).tweenTo(m(this.end),this.pos),null,!0)}});p(t.prototype,\"getAxes\",function(a){var c=this.options.colorAxis;a.call(this);this.colorAxis=[];c&&new h(this,\nc)});p(n.prototype,\"getAllItems\",function(a){var c=[],d=this.chart.colorAxis[0];d&&d.options&&(d.options.showInLegend&&(d.options.dataClasses?c=c.concat(d.getDataClassLegendSymbols()):c.push(d)),e(d.series,function(a){a.options.showInLegend=!1}));return c.concat(a.call(this))});p(n.prototype,\"colorizeItem\",function(a,c,d){a.call(this,c,d);d&&c.legendColor&&c.legendSymbol.attr({fill:c.legendColor})})})(q);(function(b){var l=b.defined,t=b.each,m=b.noop;b.colorPointMixin={isValid:function(){return null!==\nthis.value},setVisible:function(b){var e=this,h=b?\"show\":\"hide\";t([\"graphic\",\"dataLabel\"],function(b){if(e[b])e[b][h]()})},setState:function(h){b.Point.prototype.setState.call(this,h);this.graphic&&this.graphic.attr({zIndex:\"hover\"===h?1:0})}};b.colorSeriesMixin={pointArrayMap:[\"value\"],axisTypes:[\"xAxis\",\"yAxis\",\"colorAxis\"],optionalAxis:\"colorAxis\",trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],getSymbol:m,parallelArrays:[\"x\",\"y\",\"value\"],colorKey:\"value\",translateColors:function(){var b=\nthis,e=this.options.nullColor,l=this.colorAxis,m=this.colorKey;t(this.data,function(h){var g=h[m];if(g=h.options.color||(h.isNull?e:l&&void 0!==g?l.toColor(g,h):h.color||b.color))h.color=g})},colorAttribs:function(b){var e={};l(b.color)&&(e[this.colorProp||\"fill\"]=b.color);return e}}})(q);(function(b){var l=b.colorPointMixin,t=b.each,m=b.merge,h=b.noop,e=b.pick,q=b.Series,w=b.seriesType,n=b.seriesTypes;w(\"heatmap\",\"scatter\",{animation:!1,borderWidth:0,dataLabels:{formatter:function(){return this.point.value},\ninside:!0,verticalAlign:\"middle\",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:\"{point.x}, {point.y}: {point.value}\\x3cbr/\\x3e\"},states:{normal:{animation:!0},hover:{halo:!1,brightness:.2}}},m(b.colorSeriesMixin,{pointArrayMap:[\"y\",\"value\"],hasPointSpecificOptions:!0,supportsDrilldown:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var b;n.scatter.prototype.init.apply(this,arguments);b=this.options;b.pointRange=e(b.pointRange,b.colsize||1);this.yAxis.axisPointRange=\nb.rowsize||1},translate:function(){var b=this.options,e=this.xAxis,h=this.yAxis,l=function(b,a,c){return Math.min(Math.max(a,b),c)};this.generatePoints();t(this.points,function(g){var a=(b.colsize||1)/2,c=(b.rowsize||1)/2,d=l(Math.round(e.len-e.translate(g.x-a,0,1,0,1)),-e.len,2*e.len),a=l(Math.round(e.len-e.translate(g.x+a,0,1,0,1)),-e.len,2*e.len),k=l(Math.round(h.translate(g.y-c,0,1,0,1)),-h.len,2*h.len),c=l(Math.round(h.translate(g.y+c,0,1,0,1)),-h.len,2*h.len);g.plotX=g.clientX=(d+a)/2;g.plotY=\n(k+c)/2;g.shapeType=\"rect\";g.shapeArgs={x:Math.min(d,a),y:Math.min(k,c),width:Math.abs(a-d),height:Math.abs(c-k)}});this.translateColors()},drawPoints:function(){n.column.prototype.drawPoints.call(this);t(this.points,function(b){b.graphic.css(this.colorAttribs(b))},this)},animate:h,getBox:h,drawLegendSymbol:b.LegendSymbolMixin.drawRectangle,alignDataLabel:n.column.prototype.alignDataLabel,getExtremes:function(){q.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=\nthis.dataMax;q.prototype.getExtremes.call(this)}}),l)})(q)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/heatmap.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            Chart = H.Chart,\n            color = H.color,\n            ColorAxis,\n            each = H.each,\n            extend = H.extend,\n            isNumber = H.isNumber,\n            Legend = H.Legend,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            noop = H.noop,\n            merge = H.merge,\n            pick = H.pick,\n            wrap = H.wrap;\n\n        /**\n         * The ColorAxis object for inclusion in gradient legends\n         */\n        ColorAxis = H.ColorAxis = function() {\n            this.init.apply(this, arguments);\n        };\n        extend(ColorAxis.prototype, Axis.prototype);\n        extend(ColorAxis.prototype, {\n            defaultColorAxisOptions: {\n                lineWidth: 0,\n                minPadding: 0,\n                maxPadding: 0,\n                gridLineWidth: 1,\n                tickPixelInterval: 72,\n                startOnTick: true,\n                endOnTick: true,\n                offset: 0,\n                marker: {\n                    animation: {\n                        duration: 50\n                    },\n                    width: 0.01\n\n                },\n                labels: {\n                    overflow: 'justify',\n                    rotation: 0\n                },\n                minColor: '#e6ebf5',\n                maxColor: '#003399',\n                tickLength: 5,\n                showInLegend: true\n            },\n\n            // Properties to preserve after destroy, for Axis.update (#5881, #6025)\n            keepProps: [\n                'legendGroup',\n                'legendItemHeight',\n                'legendItemWidth',\n                'legendItem',\n                'legendSymbol'\n            ].concat(Axis.prototype.keepProps),\n\n            /**\n             * Initialize the color axis\n             */\n            init: function(chart, userOptions) {\n                var horiz = chart.options.legend.layout !== 'vertical',\n                    options;\n\n                this.coll = 'colorAxis';\n\n                // Build the options\n                options = merge(this.defaultColorAxisOptions, {\n                    side: horiz ? 2 : 1,\n                    reversed: !horiz\n                }, userOptions, {\n                    opposite: !horiz,\n                    showEmpty: false,\n                    title: null\n                });\n\n                Axis.prototype.init.call(this, chart, options);\n\n                // Base init() pushes it to the xAxis array, now pop it again\n                //chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop();\n\n                // Prepare data classes\n                if (userOptions.dataClasses) {\n                    this.initDataClasses(userOptions);\n                }\n                this.initStops();\n\n                // Override original axis properties\n                this.horiz = horiz;\n                this.zoomEnabled = false;\n\n                // Add default values\t\t\n                this.defaultLegendLength = 200;\n            },\n\n            initDataClasses: function(userOptions) {\n                var chart = this.chart,\n                    dataClasses,\n                    colorCounter = 0,\n                    colorCount = chart.options.chart.colorCount,\n                    options = this.options,\n                    len = userOptions.dataClasses.length;\n                this.dataClasses = dataClasses = [];\n                this.legendItems = [];\n\n                each(userOptions.dataClasses, function(dataClass, i) {\n                    var colors;\n\n                    dataClass = merge(dataClass);\n                    dataClasses.push(dataClass);\n                    if (!dataClass.color) {\n                        if (options.dataClassColor === 'category') {\n\n                            dataClass.colorIndex = colorCounter;\n\n                            // increase and loop back to zero\n                            colorCounter++;\n                            if (colorCounter === colorCount) {\n                                colorCounter = 0;\n                            }\n                        } else {\n                            dataClass.color = color(options.minColor).tweenTo(\n                                color(options.maxColor),\n                                len < 2 ? 0.5 : i / (len - 1) // #3219\n                            );\n                        }\n                    }\n                });\n            },\n\n            initStops: function() {\n                this.stops = this.options.stops || [\n                    [0, this.options.minColor],\n                    [1, this.options.maxColor]\n                ];\n                each(this.stops, function(stop) {\n                    stop.color = color(stop[1]);\n                });\n            },\n\n            /**\n             * Extend the setOptions method to process extreme colors and color\n             * stops.\n             */\n            setOptions: function(userOptions) {\n                Axis.prototype.setOptions.call(this, userOptions);\n\n                this.options.crosshair = this.options.marker;\n            },\n\n            setAxisSize: function() {\n                var symbol = this.legendSymbol,\n                    chart = this.chart,\n                    legendOptions = chart.options.legend || {},\n                    x,\n                    y,\n                    width,\n                    height;\n\n                if (symbol) {\n                    this.left = x = symbol.attr('x');\n                    this.top = y = symbol.attr('y');\n                    this.width = width = symbol.attr('width');\n                    this.height = height = symbol.attr('height');\n                    this.right = chart.chartWidth - x - width;\n                    this.bottom = chart.chartHeight - y - height;\n\n                    this.len = this.horiz ? width : height;\n                    this.pos = this.horiz ? x : y;\n                } else {\n                    // Fake length for disabled legend to avoid tick issues and such (#5205)\n                    this.len = (this.horiz ? legendOptions.symbolWidth : legendOptions.symbolHeight) || this.defaultLegendLength;\n                }\n            },\n\n            normalizedValue: function(value) {\n                if (this.isLog) {\n                    value = this.val2lin(value);\n                }\n                return 1 - ((this.max - value) / ((this.max - this.min) || 1));\n            },\n\n            /**\n             * Translate from a value to a color\n             */\n            toColor: function(value, point) {\n                var pos,\n                    stops = this.stops,\n                    from,\n                    to,\n                    color,\n                    dataClasses = this.dataClasses,\n                    dataClass,\n                    i;\n\n                if (dataClasses) {\n                    i = dataClasses.length;\n                    while (i--) {\n                        dataClass = dataClasses[i];\n                        from = dataClass.from;\n                        to = dataClass.to;\n                        if ((from === undefined || value >= from) && (to === undefined || value <= to)) {\n                            color = dataClass.color;\n                            if (point) {\n                                point.dataClass = i;\n                                point.colorIndex = dataClass.colorIndex;\n                            }\n                            break;\n                        }\n                    }\n\n                } else {\n\n                    pos = this.normalizedValue(value);\n                    i = stops.length;\n                    while (i--) {\n                        if (pos > stops[i][0]) {\n                            break;\n                        }\n                    }\n                    from = stops[i] || stops[i + 1];\n                    to = stops[i + 1] || from;\n\n                    // The position within the gradient\n                    pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);\n\n                    color = from.color.tweenTo(\n                        to.color,\n                        pos\n                    );\n                }\n                return color;\n            },\n\n            /**\n             * Override the getOffset method to add the whole axis groups inside the legend.\n             */\n            getOffset: function() {\n                var group = this.legendGroup,\n                    sideOffset = this.chart.axisOffset[this.side];\n\n                if (group) {\n\n                    // Hook for the getOffset method to add groups to this parent group\n                    this.axisParent = group;\n\n                    // Call the base\n                    Axis.prototype.getOffset.call(this);\n\n                    // First time only\n                    if (!this.added) {\n\n                        this.added = true;\n\n                        this.labelLeft = 0;\n                        this.labelRight = this.width;\n                    }\n                    // Reset it to avoid color axis reserving space\n                    this.chart.axisOffset[this.side] = sideOffset;\n                }\n            },\n\n            /**\n             * Create the color gradient\n             */\n            setLegendColor: function() {\n                var grad,\n                    horiz = this.horiz,\n                    reversed = this.reversed,\n                    one = reversed ? 1 : 0,\n                    zero = reversed ? 0 : 1;\n\n                grad = horiz ? [one, 0, zero, 0] : [0, zero, 0, one]; // #3190\n                this.legendColor = {\n                    linearGradient: {\n                        x1: grad[0],\n                        y1: grad[1],\n                        x2: grad[2],\n                        y2: grad[3]\n                    },\n                    stops: this.stops\n                };\n            },\n\n            /**\n             * The color axis appears inside the legend and has its own legend symbol\n             */\n            drawLegendSymbol: function(legend, item) {\n                var padding = legend.padding,\n                    legendOptions = legend.options,\n                    horiz = this.horiz,\n                    width = pick(legendOptions.symbolWidth, horiz ? this.defaultLegendLength : 12),\n                    height = pick(legendOptions.symbolHeight, horiz ? 12 : this.defaultLegendLength),\n                    labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30),\n                    itemDistance = pick(legendOptions.itemDistance, 10);\n\n                this.setLegendColor();\n\n                // Create the gradient\n                item.legendSymbol = this.chart.renderer.rect(\n                    0,\n                    legend.baseline - 11,\n                    width,\n                    height\n                ).attr({\n                    zIndex: 1\n                }).add(item.legendGroup);\n\n                // Set how much space this legend item takes up\n                this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding);\n                this.legendItemHeight = height + padding + (horiz ? labelPadding : 0);\n            },\n            /**\n             * Fool the legend\n             */\n            setState: noop,\n            visible: true,\n            setVisible: noop,\n            getSeriesExtremes: function() {\n                var series = this.series,\n                    i = series.length;\n                this.dataMin = Infinity;\n                this.dataMax = -Infinity;\n                while (i--) {\n                    if (series[i].valueMin !== undefined) {\n                        this.dataMin = Math.min(this.dataMin, series[i].valueMin);\n                        this.dataMax = Math.max(this.dataMax, series[i].valueMax);\n                    }\n                }\n            },\n            drawCrosshair: function(e, point) {\n                var plotX = point && point.plotX,\n                    plotY = point && point.plotY,\n                    crossPos,\n                    axisPos = this.pos,\n                    axisLen = this.len;\n\n                if (point) {\n                    crossPos = this.toPixels(point[point.series.colorKey]);\n                    if (crossPos < axisPos) {\n                        crossPos = axisPos - 2;\n                    } else if (crossPos > axisPos + axisLen) {\n                        crossPos = axisPos + axisLen + 2;\n                    }\n\n                    point.plotX = crossPos;\n                    point.plotY = this.len - crossPos;\n                    Axis.prototype.drawCrosshair.call(this, e, point);\n                    point.plotX = plotX;\n                    point.plotY = plotY;\n\n                    if (this.cross) {\n                        this.cross\n                            .addClass('highcharts-coloraxis-marker')\n                            .add(this.legendGroup);\n\n\n\n                    }\n                }\n            },\n            getPlotLinePath: function(a, b, c, d, pos) {\n                return isNumber(pos) ? // crosshairs only // #3969 pos can be 0 !!\n                    (this.horiz ? ['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : ['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z']) :\n                    Axis.prototype.getPlotLinePath.call(this, a, b, c, d);\n            },\n\n            update: function(newOptions, redraw) {\n                var chart = this.chart,\n                    legend = chart.legend;\n\n                each(this.series, function(series) {\n                    series.isDirtyData = true; // Needed for Axis.update when choropleth colors change\n                });\n\n                // When updating data classes, destroy old items and make sure new ones are created (#3207)\n                if (newOptions.dataClasses && legend.allItems) {\n                    each(legend.allItems, function(item) {\n                        if (item.isDataClass && item.legendGroup) {\n                            item.legendGroup.destroy();\n                        }\n                    });\n                    chart.isDirtyLegend = true;\n                }\n\n                // Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is\n                // not an array. (#3207)\n                chart.options[this.coll] = merge(this.userOptions, newOptions);\n\n                Axis.prototype.update.call(this, newOptions, redraw);\n                if (this.legendItem) {\n                    this.setLegendColor();\n                    legend.colorizeItem(this, true);\n                }\n            },\n\n            /**\n             * Extend basic axis remove by also removing the legend item.\n             */\n            remove: function() {\n                if (this.legendItem) {\n                    this.chart.legend.destroyItem(this);\n                }\n                Axis.prototype.remove.call(this);\n            },\n\n            /**\n             * Get the legend item symbols for data classes\n             */\n            getDataClassLegendSymbols: function() {\n                var axis = this,\n                    chart = this.chart,\n                    legendItems = this.legendItems,\n                    legendOptions = chart.options.legend,\n                    valueDecimals = legendOptions.valueDecimals,\n                    valueSuffix = legendOptions.valueSuffix || '',\n                    name;\n\n                if (!legendItems.length) {\n                    each(this.dataClasses, function(dataClass, i) {\n                        var vis = true,\n                            from = dataClass.from,\n                            to = dataClass.to;\n\n                        // Assemble the default name. This can be overridden by legend.options.labelFormatter\n                        name = '';\n                        if (from === undefined) {\n                            name = '< ';\n                        } else if (to === undefined) {\n                            name = '> ';\n                        }\n                        if (from !== undefined) {\n                            name += H.numberFormat(from, valueDecimals) + valueSuffix;\n                        }\n                        if (from !== undefined && to !== undefined) {\n                            name += ' - ';\n                        }\n                        if (to !== undefined) {\n                            name += H.numberFormat(to, valueDecimals) + valueSuffix;\n                        }\n                        // Add a mock object to the legend items\n                        legendItems.push(extend({\n                            chart: chart,\n                            name: name,\n                            options: {},\n                            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n                            visible: true,\n                            setState: noop,\n                            isDataClass: true,\n                            setVisible: function() {\n                                vis = this.visible = !vis;\n                                each(axis.series, function(series) {\n                                    each(series.points, function(point) {\n                                        if (point.dataClass === i) {\n                                            point.setVisible(vis);\n                                        }\n                                    });\n                                });\n\n                                chart.legend.colorizeItem(this, vis);\n                            }\n                        }, dataClass));\n                    });\n                }\n                return legendItems;\n            },\n            name: '' // Prevents 'undefined' in legend in IE8\n        });\n\n        /**\n         * Handle animation of the color attributes directly\n         */\n        each(['fill', 'stroke'], function(prop) {\n            H.Fx.prototype[prop + 'Setter'] = function() {\n                this.elem.attr(\n                    prop,\n                    color(this.start).tweenTo(\n                        color(this.end),\n                        this.pos\n                    ),\n                    null,\n                    true\n                );\n            };\n        });\n\n        /**\n         * Extend the chart getAxes method to also get the color axis\n         */\n        wrap(Chart.prototype, 'getAxes', function(proceed) {\n\n            var options = this.options,\n                colorAxisOptions = options.colorAxis;\n\n            proceed.call(this);\n\n            this.colorAxis = [];\n            if (colorAxisOptions) {\n                new ColorAxis(this, colorAxisOptions); // eslint-disable-line no-new\n            }\n        });\n\n\n        /**\n         * Wrap the legend getAllItems method to add the color axis. This also removes the\n         * axis' own series to prevent them from showing up individually.\n         */\n        wrap(Legend.prototype, 'getAllItems', function(proceed) {\n            var allItems = [],\n                colorAxis = this.chart.colorAxis[0];\n\n            if (colorAxis && colorAxis.options) {\n                if (colorAxis.options.showInLegend) {\n                    // Data classes\n                    if (colorAxis.options.dataClasses) {\n                        allItems = allItems.concat(colorAxis.getDataClassLegendSymbols());\n                        // Gradient legend\n                    } else {\n                        // Add this axis on top\n                        allItems.push(colorAxis);\n                    }\n                }\n\n                // Don't add the color axis' series\n                each(colorAxis.series, function(series) {\n                    series.options.showInLegend = false;\n                });\n            }\n\n            return allItems.concat(proceed.call(this));\n        });\n\n        wrap(Legend.prototype, 'colorizeItem', function(proceed, item, visible) {\n            proceed.call(this, item, visible);\n            if (visible && item.legendColor) {\n                item.legendSymbol.attr({\n                    fill: item.legendColor\n                });\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var defined = H.defined,\n            each = H.each,\n            noop = H.noop,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * Mixin for maps and heatmaps\n         */\n        H.colorPointMixin = {\n            /**\n             * Color points have a value option that determines whether or not it is a null point\n             */\n            isValid: function() {\n                return this.value !== null;\n            },\n\n            /**\n             * Set the visibility of a single point\n             */\n            setVisible: function(vis) {\n                var point = this,\n                    method = vis ? 'show' : 'hide';\n\n                // Show and hide associated elements\n                each(['graphic', 'dataLabel'], function(key) {\n                    if (point[key]) {\n                        point[key][method]();\n                    }\n                });\n            },\n            setState: function(state) {\n                H.Point.prototype.setState.call(this, state);\n                if (this.graphic) {\n                    this.graphic.attr({\n                        zIndex: state === 'hover' ? 1 : 0\n                    });\n                }\n            }\n        };\n\n        H.colorSeriesMixin = {\n            pointArrayMap: ['value'],\n            axisTypes: ['xAxis', 'yAxis', 'colorAxis'],\n            optionalAxis: 'colorAxis',\n            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n            getSymbol: noop,\n            parallelArrays: ['x', 'y', 'value'],\n            colorKey: 'value',\n\n\n\n            /**\n             * In choropleth maps, the color is a result of the value, so this needs translation too\n             */\n            translateColors: function() {\n                var series = this,\n                    nullColor = this.options.nullColor,\n                    colorAxis = this.colorAxis,\n                    colorKey = this.colorKey;\n\n                each(this.data, function(point) {\n                    var value = point[colorKey],\n                        color;\n\n                    color = point.options.color ||\n                        (point.isNull ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color);\n\n                    if (color) {\n                        point.color = color;\n                    }\n                });\n            },\n\n            /**\n             * Get the color attibutes to apply on the graphic\n             */\n            colorAttribs: function(point) {\n                var ret = {};\n                if (defined(point.color)) {\n                    ret[this.colorProp || 'fill'] = point.color;\n                }\n                return ret;\n            }\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var colorPointMixin = H.colorPointMixin,\n            colorSeriesMixin = H.colorSeriesMixin,\n            each = H.each,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        // The Heatmap series type\n        seriesType('heatmap', 'scatter', {\n            animation: false,\n            borderWidth: 0,\n\n            dataLabels: {\n                formatter: function() { // #2945\n                    return this.point.value;\n                },\n                inside: true,\n                verticalAlign: 'middle',\n                crop: false,\n                overflow: false,\n                padding: 0 // #3837\n            },\n            marker: null,\n            pointRange: null, // dynamically set to colsize by default\n            tooltip: {\n                pointFormat: '{point.x}, {point.y}: {point.value}<br/>'\n            },\n            states: {\n                normal: {\n                    animation: true\n                },\n                hover: {\n                    halo: false, // #3406, halo is not required on heatmaps\n                    brightness: 0.2\n                }\n            }\n        }, merge(colorSeriesMixin, {\n            pointArrayMap: ['y', 'value'],\n            hasPointSpecificOptions: true,\n            supportsDrilldown: true,\n            getExtremesFromAll: true,\n            directTouch: true,\n\n            /**\n             * Override the init method to add point ranges on both axes.\n             */\n            init: function() {\n                var options;\n                seriesTypes.scatter.prototype.init.apply(this, arguments);\n\n                options = this.options;\n                options.pointRange = pick(options.pointRange, options.colsize || 1); // #3758, prevent resetting in setData\n                this.yAxis.axisPointRange = options.rowsize || 1; // general point range\n            },\n            translate: function() {\n                var series = this,\n                    options = series.options,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    between = function(x, a, b) {\n                        return Math.min(Math.max(a, x), b);\n                    };\n\n                series.generatePoints();\n\n                each(series.points, function(point) {\n                    var xPad = (options.colsize || 1) / 2,\n                        yPad = (options.rowsize || 1) / 2,\n                        x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),\n                        x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),\n                        y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len),\n                        y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len);\n\n                    // Set plotX and plotY for use in K-D-Tree and more\n                    point.plotX = point.clientX = (x1 + x2) / 2;\n                    point.plotY = (y1 + y2) / 2;\n\n                    point.shapeType = 'rect';\n                    point.shapeArgs = {\n                        x: Math.min(x1, x2),\n                        y: Math.min(y1, y2),\n                        width: Math.abs(x2 - x1),\n                        height: Math.abs(y2 - y1)\n                    };\n                });\n\n                series.translateColors();\n            },\n            drawPoints: function() {\n                seriesTypes.column.prototype.drawPoints.call(this);\n\n                each(this.points, function(point) {\n\n                    // In styled mode, use CSS, otherwise the fill used in the style\n                    // sheet will take precesence over the fill attribute.\n                    point.graphic.css(this.colorAttribs(point));\n\n                }, this);\n            },\n            animate: noop,\n            getBox: noop,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            alignDataLabel: seriesTypes.column.prototype.alignDataLabel,\n            getExtremes: function() {\n                // Get the extremes from the value data\n                Series.prototype.getExtremes.call(this, this.valueData);\n                this.valueMin = this.dataMin;\n                this.valueMax = this.dataMax;\n\n                // Get the extremes from the y data\n                Series.prototype.getExtremes.call(this);\n            }\n\n        }), colorPointMixin);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/no-data-to-display.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Plugin for displaying a message when there is no data visible in chart.\n\n (c) 2010-2017 Highsoft AS\n Author: Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(d){\"object\"===typeof module&&module.exports?module.exports=d:d(Highcharts)})(function(d){(function(c){function d(){this.hasData()?this.hideNoData():this.showNoData()}var f=c.seriesTypes,e=c.Chart.prototype,g=c.getOptions(),h=c.extend,k=c.each;h(g.lang,{noData:\"No data to display\"});g.noData={position:{x:0,y:0,align:\"center\",verticalAlign:\"middle\"}};k(\"bubble gauge heatmap pie treemap waterfall\".split(\" \"),function(a){f[a]&&(f[a].prototype.hasData=function(){return!!this.points.length})});\nc.Series.prototype.hasData=function(){return this.visible&&void 0!==this.dataMax&&void 0!==this.dataMin};e.showNoData=function(a){var b=this.options;a=a||b.lang.noData;b=b.noData;this.noDataLabel||(this.noDataLabel=this.renderer.label(a,0,0,null,null,null,b.useHTML,null,\"no-data\"),this.noDataLabel.add(),this.noDataLabel.align(h(this.noDataLabel.getBBox(),b.position),!1,\"plotBox\"))};e.hideNoData=function(){this.noDataLabel&&(this.noDataLabel=this.noDataLabel.destroy())};e.hasData=function(){for(var a=\nthis.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0;return this.loadingShown};e.callbacks.push(function(a){c.addEvent(a,\"load\",d);c.addEvent(a,\"redraw\",d)})})(d)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/no-data-to-display.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Plugin for displaying a message when there is no data visible in chart.\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Plugin for displaying a message when there is no data visible in chart.\n         *\n         * (c) 2010-2017 Highsoft AS\n         * Author: Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesTypes = H.seriesTypes,\n            chartPrototype = H.Chart.prototype,\n            defaultOptions = H.getOptions(),\n            extend = H.extend,\n            each = H.each;\n\n        // Add language option\n        extend(defaultOptions.lang, {\n            noData: 'No data to display'\n        });\n\n        // Add default display options for message\n        defaultOptions.noData = {\n            position: {\n                x: 0,\n                y: 0,\n                align: 'center',\n                verticalAlign: 'middle'\n            }\n            // useHTML: false\n        };\n\n\n\n\n        // Define hasData function for non-cartesian seris. Returns true if the series\n        // has points at all.\n        each([\n            'bubble',\n            'gauge',\n            'heatmap',\n            'pie',\n            'treemap',\n            'waterfall'\n        ], function(type) {\n            if (seriesTypes[type]) {\n                seriesTypes[type].prototype.hasData = function() {\n                    return !!this.points.length; /* != 0 */\n                };\n            }\n        });\n\n        /**\n         * Define hasData functions for series. These return true if there are data\n         * points on this series within the plot area.\n         */\n        H.Series.prototype.hasData = function() {\n            return this.visible && this.dataMax !== undefined && this.dataMin !== undefined; // #3703\n        };\n\n        /**\n         * Display a no-data message.\n         *\n         * @param {String} str An optional message to show in place of the default one \n         */\n        chartPrototype.showNoData = function(str) {\n            var chart = this,\n                options = chart.options,\n                text = str || options.lang.noData,\n                noDataOptions = options.noData;\n\n            if (!chart.noDataLabel) {\n                chart.noDataLabel = chart.renderer\n                    .label(\n                        text,\n                        0,\n                        0,\n                        null,\n                        null,\n                        null,\n                        noDataOptions.useHTML,\n                        null,\n                        'no-data'\n                    );\n\n\n\n                chart.noDataLabel.add();\n\n                chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');\n            }\n        };\n\n        /**\n         * Hide no-data message\t\n         */\n        chartPrototype.hideNoData = function() {\n            var chart = this;\n            if (chart.noDataLabel) {\n                chart.noDataLabel = chart.noDataLabel.destroy();\n            }\n        };\n\n        /**\n         * Returns true if there are data points within the plot area now\n         */\n        chartPrototype.hasData = function() {\n            var chart = this,\n                series = chart.series,\n                i = series.length;\n\n            while (i--) {\n                if (series[i].hasData() && !series[i].options.isInternal) {\n                    return true;\n                }\n            }\n\n            return chart.loadingShown; // #4588\n        };\n\n        /**\n         * Show no-data message if there is no data in sight. Otherwise, hide it.\n         */\n        function handleNoData() {\n            var chart = this;\n            if (chart.hasData()) {\n                chart.hideNoData();\n            } else {\n                chart.showNoData();\n            }\n        }\n\n        /**\n         * Add event listener to handle automatic display of no-data message\n         */\n        chartPrototype.callbacks.push(function(chart) {\n            H.addEvent(chart, 'load', handleNoData);\n            H.addEvent(chart, 'redraw', handleNoData);\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/offline-exporting.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Client side exporting module\n\n (c) 2015 Torstein Honsi / Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(b){function n(c,b){var d=t.getElementsByTagName(\"head\")[0],a=t.createElement(\"script\");a.type=\"text/javascript\";a.src=c;a.onload=b;a.onerror=function(){console.error(\"Error loading script\",c)};d.appendChild(a)}var C=b.merge,e=b.win,r=e.navigator,t=e.document,z=b.each,w=e.URL||e.webkitURL||e,A=/Edge\\/|Trident\\/|MSIE /.test(r.userAgent),D=/Edge\\/\\d+/.test(r.userAgent),E=A?150:0;b.CanVGRenderer=\n{};b.dataURLtoBlob=function(c){if(e.atob&&e.ArrayBuffer&&e.Uint8Array&&e.Blob&&w.createObjectURL){c=c.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/);for(var b=e.atob(c[3]),d=new e.ArrayBuffer(b.length),d=new e.Uint8Array(d),a=0;a<d.length;++a)d[a]=b.charCodeAt(a);c=new e.Blob([d],{type:c[1]});return w.createObjectURL(c)}};b.downloadURL=function(c,f){var d=t.createElement(\"a\"),a;if(r.msSaveOrOpenBlob)r.msSaveOrOpenBlob(c,f);else{if(2E6<c.length&&(c=b.dataURLtoBlob(c),!c))throw\"Data URL length limit reached\";\nif(void 0!==d.download)d.href=c,d.download=f,t.body.appendChild(d),d.click(),t.body.removeChild(d);else try{if(a=e.open(c,\"chart\"),void 0===a||null===a)throw\"Failed to open window\";}catch(u){e.location.href=c}}};b.svgToDataUrl=function(c){var b=-1<r.userAgent.indexOf(\"WebKit\")&&0>r.userAgent.indexOf(\"Chrome\");try{if(!b&&0>r.userAgent.toLowerCase().indexOf(\"firefox\"))return w.createObjectURL(new e.Blob([c],{type:\"image/svg+xml;charset-utf-16\"}))}catch(d){}return\"data:image/svg+xml;charset\\x3dUTF-8,\"+\nencodeURIComponent(c)};b.imageToDataUrl=function(c,b,d,a,u,l,k,m,p){var g=new e.Image,h,f=function(){setTimeout(function(){var e=t.createElement(\"canvas\"),f=e.getContext&&e.getContext(\"2d\"),x;try{if(f){e.height=g.height*a;e.width=g.width*a;f.drawImage(g,0,0,e.width,e.height);try{x=e.toDataURL(b),u(x,b,d,a)}catch(F){h(c,b,d,a)}}else k(c,b,d,a)}finally{p&&p(c,b,d,a)}},E)},q=function(){m(c,b,d,a);p&&p(c,b,d,a)};h=function(){g=new e.Image;h=l;g.crossOrigin=\"Anonymous\";g.onload=f;g.onerror=q;g.src=c};\ng.onload=f;g.onerror=q;g.src=c};b.downloadSVGLocal=function(c,f,d,a){function u(a,b){b=new e.jsPDF(\"l\",\"pt\",[a.width.baseVal.value+2*b,a.height.baseVal.value+2*b]);e.svg2pdf(a,b,{removeInvalid:!0});return b.output(\"datauristring\")}function l(){y.innerHTML=c;var e=y.getElementsByTagName(\"text\"),g,f=y.getElementsByTagName(\"svg\")[0].style;z(e,function(a){z([\"font-family\",\"font-size\"],function(b){!a.style[b]&&f[b]&&(a.style[b]=f[b])});a.style[\"font-family\"]=a.style[\"font-family\"]&&a.style[\"font-family\"].split(\" \").splice(-1);\ng=a.getElementsByTagName(\"title\");z(g,function(b){a.removeChild(b)})});e=u(y.firstChild,0);try{b.downloadURL(e,v),a&&a()}catch(G){d()}}var k,m,p=!0,g,h=f.libURL||b.getOptions().exporting.libURL,y=t.createElement(\"div\"),q=f.type||\"image/png\",v=(f.filename||\"chart\")+\".\"+(\"image/svg+xml\"===q?\"svg\":q.split(\"/\")[1]),B=f.scale||1,h=\"/\"!==h.slice(-1)?h+\"/\":h;if(\"image/svg+xml\"===q)try{r.msSaveOrOpenBlob?(m=new MSBlobBuilder,m.append(c),k=m.getBlob(\"image/svg+xml\")):k=b.svgToDataUrl(c),b.downloadURL(k,v),\na&&a()}catch(x){d()}else\"application/pdf\"===q?e.jsPDF&&e.svg2pdf?l():(p=!0,n(h+\"jspdf.js\",function(){n(h+\"svg2pdf.js\",function(){l()})})):(k=b.svgToDataUrl(c),g=function(){try{w.revokeObjectURL(k)}catch(x){}},b.imageToDataUrl(k,q,{},B,function(c){try{b.downloadURL(c,v),a&&a()}catch(F){d()}},function(){var f=t.createElement(\"canvas\"),u=f.getContext(\"2d\"),l=c.match(/^<svg[^>]*width\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1]*B,k=c.match(/^<svg[^>]*height\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1]*B,m=function(){u.drawSvg(c,0,0,\nl,k);try{b.downloadURL(r.msSaveOrOpenBlob?f.msToBlob():f.toDataURL(q),v),a&&a()}catch(H){d()}finally{g()}};f.width=l;f.height=k;e.canvg?m():(p=!0,n(h+\"rgbcolor.js\",function(){n(h+\"canvg.js\",function(){m()})}))},d,d,function(){p&&g()}))};b.Chart.prototype.getSVGForLocalExport=function(c,e,d,a){var f=this,l,k=0,m,p,g,h,n,q=function(b,c,d){++k;d.imageElement.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",b);k===l.length&&a(f.sanitizeSVG(m.innerHTML,p))};b.wrap(b.Chart.prototype,\"getChartHTML\",\nfunction(a){var b=a.apply(this,Array.prototype.slice.call(arguments,1));p=this.options;m=this.container.cloneNode(!0);return b});f.getSVGForExport(c,e);l=m.getElementsByTagName(\"image\");try{if(l.length)for(h=0,n=l.length;h<n;++h)g=l[h],b.imageToDataUrl(g.getAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\"),\"image/png\",{imageElement:g},c.scale,q,d,d,d);else a(f.sanitizeSVG(m.innerHTML,p))}catch(v){d()}};b.Chart.prototype.exportChartLocal=function(c,e){var d=this,a=b.merge(d.options.exporting,c),f=\nfunction(){if(!1===a.fallbackToExportServer)if(a.error)a.error(a);else throw\"Fallback to export server disabled\";else d.exportChart(a)};A&&(b.SVGRenderer.prototype.inlineWhitelist=[/^blockSize/,/^border/,/^caretColor/,/^color/,/^columnRule/,/^columnRuleColor/,/^cssFloat/,/^cursor/,/^fill$/,/^fillOpacity/,/^font/,/^inlineSize/,/^length/,/^lineHeight/,/^opacity/,/^outline/,/^parentRule/,/^rx$/,/^ry$/,/^stroke/,/^textAlign/,/^textAnchor/,/^textDecoration/,/^transform/,/^vectorEffect/,/^visibility/,/^x$/,\n/^y$/]);A&&(\"application/pdf\"===a.type||d.container.getElementsByTagName(\"image\").length&&\"image/svg+xml\"!==a.type)||D&&\"image/svg+xml\"!==a.type||\"application/pdf\"===a.type&&d.container.getElementsByTagName(\"image\").length?f():d.getSVGForLocalExport(a,e,f,function(c){-1<c.indexOf(\"\\x3cforeignObject\")&&\"image/svg+xml\"!==a.type?f():b.downloadSVGLocal(c,a,f)})};C(!0,b.getOptions().exporting,{libURL:\"https://code.highcharts.com/5.0.12/lib/\",buttons:{contextButton:{menuItems:[{textKey:\"printChart\",onclick:function(){this.print()}},\n{separator:!0},{textKey:\"downloadPNG\",onclick:function(){this.exportChartLocal()}},{textKey:\"downloadJPEG\",onclick:function(){this.exportChartLocal({type:\"image/jpeg\"})}},{textKey:\"downloadSVG\",onclick:function(){this.exportChartLocal({type:\"image/svg+xml\"})}},{textKey:\"downloadPDF\",onclick:function(){this.exportChartLocal({type:\"application/pdf\"})}}]}}})})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/offline-exporting.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Client side exporting module\n *\n * (c) 2015 Torstein Honsi / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Client side exporting module\n         *\n         * (c) 2015 Torstein Honsi / Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /*global MSBlobBuilder */\n\n        var merge = Highcharts.merge,\n            win = Highcharts.win,\n            nav = win.navigator,\n            doc = win.document,\n            each = Highcharts.each,\n            domurl = win.URL || win.webkitURL || win,\n            isMSBrowser = /Edge\\/|Trident\\/|MSIE /.test(nav.userAgent),\n            isEdgeBrowser = /Edge\\/\\d+/.test(nav.userAgent),\n            loadEventDeferDelay = isMSBrowser ? 150 : 0; // Milliseconds to defer image load event handlers to offset IE bug\n\n        // Dummy object so we can reuse our canvas-tools.js without errors\n        Highcharts.CanVGRenderer = {};\n\n\n        /**\n         * Downloads a script and executes a callback when done.\n         * @param {String} scriptLocation\n         * @param {Function} callback\n         */\n        function getScript(scriptLocation, callback) {\n            var head = doc.getElementsByTagName('head')[0],\n                script = doc.createElement('script');\n\n            script.type = 'text/javascript';\n            script.src = scriptLocation;\n            script.onload = callback;\n            script.onerror = function() {\n                console.error('Error loading script', scriptLocation); // eslint-disable-line no-console\n            };\n\n            head.appendChild(script);\n        }\n\n        // Convert dataURL to Blob if supported, otherwise returns undefined\n        Highcharts.dataURLtoBlob = function(dataURL) {\n            if (\n                win.atob &&\n                win.ArrayBuffer &&\n                win.Uint8Array &&\n                win.Blob &&\n                domurl.createObjectURL\n            ) {\n                // Try to convert data URL to Blob\n                var parts = dataURL.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/),\n                    binStr = win.atob(parts[3]), // Assume base64 encoding\n                    buf = new win.ArrayBuffer(binStr.length),\n                    binary = new win.Uint8Array(buf),\n                    blob;\n\n                for (var i = 0; i < binary.length; ++i) {\n                    binary[i] = binStr.charCodeAt(i);\n                }\n\n                blob = new win.Blob([binary], {\n                    'type': parts[1]\n                });\n                return domurl.createObjectURL(blob);\n            }\n        };\n\n        // Download contents by dataURL/blob\n        Highcharts.downloadURL = function(dataURL, filename) {\n            var a = doc.createElement('a'),\n                windowRef;\n\n            // IE specific blob implementation\n            if (nav.msSaveOrOpenBlob) {\n                nav.msSaveOrOpenBlob(dataURL, filename);\n                return;\n            }\n\n            // Some browsers have limitations for data URL lengths. Try to convert to\n            // Blob or fall back.\n            if (dataURL.length > 2000000) {\n                dataURL = Highcharts.dataURLtoBlob(dataURL);\n                if (!dataURL) {\n                    throw 'Data URL length limit reached';\n                }\n            }\n\n            // Try HTML5 download attr if supported\n            if (a.download !== undefined) {\n                a.href = dataURL;\n                a.download = filename; // HTML5 download attribute\n                doc.body.appendChild(a);\n                a.click();\n                doc.body.removeChild(a);\n            } else {\n                // No download attr, just opening data URI\n                try {\n                    windowRef = win.open(dataURL, 'chart');\n                    if (windowRef === undefined || windowRef === null) {\n                        throw 'Failed to open window';\n                    }\n                } catch (e) {\n                    // window.open failed, trying location.href\n                    win.location.href = dataURL;\n                }\n            }\n        };\n\n        // Get blob URL from SVG code. Falls back to normal data URI.\n        Highcharts.svgToDataUrl = function(svg) {\n            var webKit = nav.userAgent.indexOf('WebKit') > -1 && nav.userAgent.indexOf('Chrome') < 0; // Webkit and not chrome\n            try {\n                // Safari requires data URI since it doesn't allow navigation to blob URLs\n                // Firefox has an issue with Blobs and internal references, leading to gradients not working using Blobs (#4550)\n                if (!webKit && nav.userAgent.toLowerCase().indexOf('firefox') < 0) {\n                    return domurl.createObjectURL(new win.Blob([svg], {\n                        type: 'image/svg+xml;charset-utf-16'\n                    }));\n                }\n            } catch (e) {\n                // Ignore\n            }\n            return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);\n        };\n\n        // Get data:URL from image URL\n        // Pass in callbacks to handle results. finallyCallback is always called at the end of the process. Supplying this callback is optional.\n        // All callbacks receive four arguments: imageURL, imageType, callbackArgs and scale. callbackArgs is used only by callbacks and can contain whatever.\n        Highcharts.imageToDataUrl = function(imageURL, imageType, callbackArgs, scale, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {\n            var img = new win.Image(),\n                taintedHandler,\n                loadHandler = function() {\n                    setTimeout(function() {\n                        var canvas = doc.createElement('canvas'),\n                            ctx = canvas.getContext && canvas.getContext('2d'),\n                            dataURL;\n                        try {\n                            if (!ctx) {\n                                noCanvasSupportCallback(imageURL, imageType, callbackArgs, scale);\n                            } else {\n                                canvas.height = img.height * scale;\n                                canvas.width = img.width * scale;\n                                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n                                // Now we try to get the contents of the canvas.\n                                try {\n                                    dataURL = canvas.toDataURL(imageType);\n                                    successCallback(dataURL, imageType, callbackArgs, scale);\n                                } catch (e) {\n                                    taintedHandler(imageURL, imageType, callbackArgs, scale);\n                                }\n                            }\n                        } finally {\n                            if (finallyCallback) {\n                                finallyCallback(imageURL, imageType, callbackArgs, scale);\n                            }\n                        }\n                    }, loadEventDeferDelay); // IE bug where image is not always ready despite calling load event.\n                },\n                // Image load failed (e.g. invalid URL)\n                errorHandler = function() {\n                    failedLoadCallback(imageURL, imageType, callbackArgs, scale);\n                    if (finallyCallback) {\n                        finallyCallback(imageURL, imageType, callbackArgs, scale);\n                    }\n                };\n\n            // This is called on load if the image drawing to canvas failed with a security error.\n            // We retry the drawing with crossOrigin set to Anonymous.\n            taintedHandler = function() {\n                img = new win.Image();\n                taintedHandler = taintedCallback;\n                img.crossOrigin = 'Anonymous'; // Must be set prior to loading image source\n                img.onload = loadHandler;\n                img.onerror = errorHandler;\n                img.src = imageURL;\n            };\n\n            img.onload = loadHandler;\n            img.onerror = errorHandler;\n            img.src = imageURL;\n        };\n\n        /**\n         * Get data URL to an image of an SVG and call download on it\n         *\n         * options object:\n         *\t\tfilename: Name of resulting downloaded file without extension\n         *\t\ttype: File type of resulting download\n         *\t\tscale: Scaling factor of downloaded image compared to source\n         *      libURL: URL pointing to location of dependency scripts to download on demand\n         */\n        Highcharts.downloadSVGLocal = function(svg, options, failCallback, successCallback) {\n            var svgurl,\n                blob,\n                objectURLRevoke = true,\n                finallyHandler,\n                libURL = options.libURL || Highcharts.getOptions().exporting.libURL,\n                dummySVGContainer = doc.createElement('div'),\n                imageType = options.type || 'image/png',\n                filename = (options.filename || 'chart') + '.' + (imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1]),\n                scale = options.scale || 1;\n\n            libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL; // Allow libURL to end with or without fordward slash\n\n            function svgToPdf(svgElement, margin) {\n                var width = svgElement.width.baseVal.value + 2 * margin,\n                    height = svgElement.height.baseVal.value + 2 * margin,\n                    pdf = new win.jsPDF('l', 'pt', [width, height]); // eslint-disable-line new-cap\n\n                win.svg2pdf(svgElement, pdf, {\n                    removeInvalid: true\n                });\n                return pdf.output('datauristring');\n            }\n\n            function downloadPDF() {\n                dummySVGContainer.innerHTML = svg;\n                var textElements = dummySVGContainer.getElementsByTagName('text'),\n                    titleElements,\n                    svgData,\n                    svgElementStyle = dummySVGContainer.getElementsByTagName('svg')[0].style;\n                // Workaround for the text styling. Making sure it does pick up the root element\n                each(textElements, function(el) {\n                    // Workaround for the text styling. making sure it does pick up the root element\n                    each(['font-family', 'font-size'], function(property) {\n                        if (!el.style[property] && svgElementStyle[property]) {\n                            el.style[property] = svgElementStyle[property];\n                        }\n                    });\n                    el.style['font-family'] = el.style['font-family'] && el.style['font-family'].split(' ').splice(-1);\n                    // Workaround for plotband with width, removing title from text nodes\n                    titleElements = el.getElementsByTagName('title');\n                    each(titleElements, function(titleElement) {\n                        el.removeChild(titleElement);\n                    });\n                });\n                svgData = svgToPdf(dummySVGContainer.firstChild, 0);\n                try {\n                    Highcharts.downloadURL(svgData, filename);\n                    if (successCallback) {\n                        successCallback();\n                    }\n                } catch (e) {\n                    failCallback();\n                }\n            }\n\n            // Initiate download depending on file type\n            if (imageType === 'image/svg+xml') {\n                // SVG download. In this case, we want to use Microsoft specific Blob if available\n                try {\n                    if (nav.msSaveOrOpenBlob) {\n                        blob = new MSBlobBuilder();\n                        blob.append(svg);\n                        svgurl = blob.getBlob('image/svg+xml');\n                    } else {\n                        svgurl = Highcharts.svgToDataUrl(svg);\n                    }\n                    Highcharts.downloadURL(svgurl, filename);\n                    if (successCallback) {\n                        successCallback();\n                    }\n                } catch (e) {\n                    failCallback();\n                }\n            } else if (imageType === 'application/pdf') {\n                if (win.jsPDF && win.svg2pdf) {\n                    downloadPDF();\n                } else {\n                    // Must load pdf libraries first\n                    objectURLRevoke = true; // Don't destroy the object URL yet since we are doing things asynchronously. A cleaner solution would be nice, but this will do for now.\n                    getScript(libURL + 'jspdf.js', function() {\n                        getScript(libURL + 'svg2pdf.js', function() {\n                            downloadPDF();\n                        });\n                    });\n                }\n            } else {\n                // PNG/JPEG download - create bitmap from SVG\n\n                svgurl = Highcharts.svgToDataUrl(svg);\n                finallyHandler = function() {\n                    try {\n                        domurl.revokeObjectURL(svgurl);\n                    } catch (e) {\n                        // Ignore\n                    }\n                };\n                // First, try to get PNG by rendering on canvas\n                Highcharts.imageToDataUrl(svgurl, imageType, { /* args */ }, scale, function(imageURL) {\n                        // Success\n                        try {\n                            Highcharts.downloadURL(imageURL, filename);\n                            if (successCallback) {\n                                successCallback();\n                            }\n                        } catch (e) {\n                            failCallback();\n                        }\n                    }, function() {\n                        // Failed due to tainted canvas\n                        // Create new and untainted canvas\n                        var canvas = doc.createElement('canvas'),\n                            ctx = canvas.getContext('2d'),\n                            imageWidth = svg.match(/^<svg[^>]*width\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1] * scale,\n                            imageHeight = svg.match(/^<svg[^>]*height\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1] * scale,\n                            downloadWithCanVG = function() {\n                                ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight);\n                                try {\n                                    Highcharts.downloadURL(nav.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL(imageType), filename);\n                                    if (successCallback) {\n                                        successCallback();\n                                    }\n                                } catch (e) {\n                                    failCallback();\n                                } finally {\n                                    finallyHandler();\n                                }\n                            };\n\n                        canvas.width = imageWidth;\n                        canvas.height = imageHeight;\n                        if (win.canvg) {\n                            // Use preloaded canvg\n                            downloadWithCanVG();\n                        } else {\n                            // Must load canVG first\n                            objectURLRevoke = true; // Don't destroy the object URL yet since we are doing things asynchronously. A cleaner solution would be nice, but this will do for now.\n                            getScript(libURL + 'rgbcolor.js', function() { // Get RGBColor.js first\n                                getScript(libURL + 'canvg.js', function() {\n                                    downloadWithCanVG();\n                                });\n                            });\n                        }\n                    },\n                    // No canvas support\n                    failCallback,\n                    // Failed to load image\n                    failCallback,\n                    // Finally\n                    function() {\n                        if (objectURLRevoke) {\n                            finallyHandler();\n                        }\n                    });\n            }\n        };\n\n        // Get SVG of chart prepared for client side export. This converts embedded images in the SVG to data URIs.\n        // The options and chartOptions arguments are passed to the getSVGForExport function.\n        Highcharts.Chart.prototype.getSVGForLocalExport = function(options, chartOptions, failCallback, successCallback) {\n            var chart = this,\n                images,\n                imagesEmbedded = 0,\n                chartCopyContainer,\n                chartCopyOptions,\n                el,\n                i,\n                l,\n                // After grabbing the SVG of the chart's copy container we need to do sanitation on the SVG\n                sanitize = function(svg) {\n                    return chart.sanitizeSVG(svg, chartCopyOptions);\n                },\n                // Success handler, we converted image to base64!\n                embeddedSuccess = function(imageURL, imageType, callbackArgs) {\n                    ++imagesEmbedded;\n\n                    // Change image href in chart copy\n                    callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL);\n\n                    // When done with last image we have our SVG\n                    if (imagesEmbedded === images.length) {\n                        successCallback(sanitize(chartCopyContainer.innerHTML));\n                    }\n                };\n\n            // Hook into getSVG to get a copy of the chart copy's container\n            Highcharts.wrap(\n                Highcharts.Chart.prototype,\n                'getChartHTML',\n                function(proceed) {\n                    var ret = proceed.apply(\n                        this,\n                        Array.prototype.slice.call(arguments, 1)\n                    );\n                    chartCopyOptions = this.options;\n                    chartCopyContainer = this.container.cloneNode(true);\n                    return ret;\n                }\n            );\n\n            // Trigger hook to get chart copy\n            chart.getSVGForExport(options, chartOptions);\n            images = chartCopyContainer.getElementsByTagName('image');\n\n            try {\n                // If there are no images to embed, the SVG is okay now.\n                if (!images.length) {\n                    successCallback(sanitize(chartCopyContainer.innerHTML)); // Use SVG of chart copy\n                    return;\n                }\n\n                // Go through the images we want to embed\n                for (i = 0, l = images.length; i < l; ++i) {\n                    el = images[i];\n                    Highcharts.imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), 'image/png', {\n                            imageElement: el\n                        }, options.scale,\n                        embeddedSuccess,\n                        // Tainted canvas\n                        failCallback,\n                        // No canvas support\n                        failCallback,\n                        // Failed to load source\n                        failCallback\n                    );\n                }\n            } catch (e) {\n                failCallback();\n            }\n        };\n\n        /**\n         * Exporting and offline-exporting modules required. Export a chart to an image\n         * locally in the user's browser.\n         *\n         * @param  {Object} exportingOptions\n         *         Exporting options, the same as in {@link\n         *         Highcharts.Chart#exportChart}.\n         * @param  {Options} chartOptions\n         *         Additional chart options for the exported chart. For example a\n         *         different background color can be added here, or `dataLabels`\n         *         for export only.\n         */\n        Highcharts.Chart.prototype.exportChartLocal = function(exportingOptions, chartOptions) {\n            var chart = this,\n                options = Highcharts.merge(chart.options.exporting, exportingOptions),\n                fallbackToExportServer = function() {\n                    if (options.fallbackToExportServer === false) {\n                        if (options.error) {\n                            options.error(options);\n                        } else {\n                            throw 'Fallback to export server disabled';\n                        }\n                    } else {\n                        chart.exportChart(options);\n                    }\n                },\n                svgSuccess = function(svg) {\n                    // If SVG contains foreignObjects all exports except SVG will fail,\n                    // as both CanVG and svg2pdf choke on this. Gracefully fall back.\n                    if (\n                        svg.indexOf('<foreignObject') > -1 &&\n                        options.type !== 'image/svg+xml'\n                    ) {\n                        fallbackToExportServer();\n                    } else {\n                        Highcharts.downloadSVGLocal(svg, options, fallbackToExportServer);\n                    }\n                };\n\n            // If we are on IE and in styled mode, add a whitelist to the renderer\n            // for inline styles that we want to pass through. There are so many\n            // styles by default in IE that we don't want to blacklist them all.\n\n            if (isMSBrowser) {\n                Highcharts.SVGRenderer.prototype.inlineWhitelist = [\n                    /^blockSize/,\n                    /^border/,\n                    /^caretColor/,\n                    /^color/,\n                    /^columnRule/,\n                    /^columnRuleColor/,\n                    /^cssFloat/,\n                    /^cursor/,\n                    /^fill$/,\n                    /^fillOpacity/,\n                    /^font/,\n                    /^inlineSize/,\n                    /^length/,\n                    /^lineHeight/,\n                    /^opacity/,\n                    /^outline/,\n                    /^parentRule/,\n                    /^rx$/,\n                    /^ry$/,\n                    /^stroke/,\n                    /^textAlign/,\n                    /^textAnchor/,\n                    /^textDecoration/,\n                    /^transform/,\n                    /^vectorEffect/,\n                    /^visibility/,\n                    /^x$/,\n                    /^y$/\n                ];\n            }\n\n\n            // Always fall back on:\n            // - MS browsers: Embedded images JPEG/PNG, or any PDF\n            // - Edge: PNG/JPEG all cases\n            // - Embedded images and PDF\n            if (\n                (\n                    isMSBrowser &&\n                    (\n                        options.type === 'application/pdf' ||\n                        chart.container.getElementsByTagName('image').length &&\n                        options.type !== 'image/svg+xml'\n                    )\n                ) || (\n                    isEdgeBrowser && options.type !== 'image/svg+xml'\n                ) || (\n                    options.type === 'application/pdf' &&\n                    chart.container.getElementsByTagName('image').length\n                )\n            ) {\n                fallbackToExportServer();\n                return;\n            }\n\n            chart.getSVGForLocalExport(options, chartOptions, fallbackToExportServer, svgSuccess);\n        };\n\n        // Extend the default options to use the local exporter logic\n        merge(true, Highcharts.getOptions().exporting, {\n            libURL: 'https://code.highcharts.com/5.0.12/lib/',\n            buttons: {\n                contextButton: {\n                    menuItems: [{\n                        textKey: 'printChart',\n                        onclick: function() {\n                            this.print();\n                        }\n                    }, {\n                        separator: true\n                    }, {\n                        textKey: 'downloadPNG',\n                        onclick: function() {\n                            this.exportChartLocal();\n                        }\n                    }, {\n                        textKey: 'downloadJPEG',\n                        onclick: function() {\n                            this.exportChartLocal({\n                                type: 'image/jpeg'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadSVG',\n                        onclick: function() {\n                            this.exportChartLocal({\n                                type: 'image/svg+xml'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadPDF',\n                        onclick: function() {\n                            this.exportChartLocal({\n                                type: 'application/pdf'\n                            });\n                        }\n                    }]\n                }\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/overlapping-datalabels.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(a){\"object\"===typeof module&&module.exports?module.exports=a:a(Highcharts)})(function(a){(function(a){var h=a.Chart,k=a.each,q=a.pick,r=a.addEvent;h.prototype.callbacks.push(function(f){function a(){var a=[];k(f.series||[],function(b){var c=b.options.dataLabels,d=b.dataLabelCollections||[\"dataLabel\"];(c.enabled||b._hasPointLabels)&&!c.allowOverlap&&b.visible&&k(d,function(c){k(b.points,function(b){b[c]&&(b[c].labelrank=q(b.labelrank,b.shapeArgs&&b.shapeArgs.height),a.push(b[c]))})})});f.hideOverlappingLabels(a)}\na();r(f,\"redraw\",a)});h.prototype.hideOverlappingLabels=function(a){var f=a.length,e,b,c,d,l,m,n,p,g,h=function(a,b,c,d,e,f,g,h){return!(e>a+c||e+g<a||f>b+d||f+h<b)};for(b=0;b<f;b++)if(e=a[b])e.oldOpacity=e.opacity,e.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(b=0;b<f;b++)for(c=a[b],e=b+1;e<f;++e)if(d=a[e],c&&d&&c!==d&&c.placed&&d.placed&&0!==c.newOpacity&&0!==d.newOpacity&&(l=c.alignAttr,m=d.alignAttr,n=c.parentGroup,p=d.parentGroup,g=2*(c.box?0:c.padding),l=h(l.x+\nn.translateX,l.y+n.translateY,c.width-g,c.height-g,m.x+p.translateX,m.y+p.translateY,d.width-g,d.height-g)))(c.labelrank<d.labelrank?c:d).newOpacity=0;k(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&a.placed&&(c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?\"animate\":\"attr\"](a.alignAttr,null,b)),a.isOld=!0)})}})(a)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/overlapping-datalabels.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         * Highcharts module to hide overlapping data labels. This module is included in\n         * Highcharts.\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            pick = H.pick,\n            addEvent = H.addEvent;\n\n        // Collect potensial overlapping data labels. Stack labels probably don't need\n        // to be considered because they are usually accompanied by data labels that lie\n        // inside the columns.\n        Chart.prototype.callbacks.push(function(chart) {\n            function collectAndHide() {\n                var labels = [];\n\n                each(chart.series || [], function(series) {\n                    var dlOptions = series.options.dataLabels,\n                        // Range series have two collections\n                        collections = series.dataLabelCollections || ['dataLabel'];\n\n                    if (\n                        (dlOptions.enabled || series._hasPointLabels) &&\n                        !dlOptions.allowOverlap &&\n                        series.visible\n                    ) { // #3866\n                        each(collections, function(coll) {\n                            each(series.points, function(point) {\n                                if (point[coll]) {\n                                    point[coll].labelrank = pick(\n                                        point.labelrank,\n                                        point.shapeArgs && point.shapeArgs.height\n                                    ); // #4118\n                                    labels.push(point[coll]);\n                                }\n                            });\n                        });\n                    }\n                });\n                chart.hideOverlappingLabels(labels);\n            }\n\n            // Do it now ...\n            collectAndHide();\n\n            // ... and after each chart redraw\n            addEvent(chart, 'redraw', collectAndHide);\n\n        });\n\n        /**\n         * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n         * provide a smooth visual imression.\n         */\n        Chart.prototype.hideOverlappingLabels = function(labels) {\n\n            var len = labels.length,\n                label,\n                i,\n                j,\n                label1,\n                label2,\n                isIntersecting,\n                pos1,\n                pos2,\n                parent1,\n                parent2,\n                padding,\n                intersectRect = function(x1, y1, w1, h1, x2, y2, w2, h2) {\n                    return !(\n                        x2 > x1 + w1 ||\n                        x2 + w2 < x1 ||\n                        y2 > y1 + h1 ||\n                        y2 + h2 < y1\n                    );\n                };\n\n            // Mark with initial opacity\n            for (i = 0; i < len; i++) {\n                label = labels[i];\n                if (label) {\n                    label.oldOpacity = label.opacity;\n                    label.newOpacity = 1;\n                }\n            }\n\n            // Prevent a situation in a gradually rising slope, that each label will\n            // hide the previous one because the previous one always has lower rank.\n            labels.sort(function(a, b) {\n                return (b.labelrank || 0) - (a.labelrank || 0);\n            });\n\n            // Detect overlapping labels\n            for (i = 0; i < len; i++) {\n                label1 = labels[i];\n\n                for (j = i + 1; j < len; ++j) {\n                    label2 = labels[j];\n                    if (\n                        label1 && label2 &&\n                        label1 !== label2 && // #6465, polar chart with connectEnds\n                        label1.placed && label2.placed &&\n                        label1.newOpacity !== 0 && label2.newOpacity !== 0\n                    ) {\n                        pos1 = label1.alignAttr;\n                        pos2 = label2.alignAttr;\n                        // Different panes have different positions\n                        parent1 = label1.parentGroup;\n                        parent2 = label2.parentGroup;\n                        // Substract the padding if no background or border (#4333)\n                        padding = 2 * (label1.box ? 0 : label1.padding);\n                        isIntersecting = intersectRect(\n                            pos1.x + parent1.translateX,\n                            pos1.y + parent1.translateY,\n                            label1.width - padding,\n                            label1.height - padding,\n                            pos2.x + parent2.translateX,\n                            pos2.y + parent2.translateY,\n                            label2.width - padding,\n                            label2.height - padding\n                        );\n\n                        if (isIntersecting) {\n                            (label1.labelrank < label2.labelrank ? label1 : label2)\n                            .newOpacity = 0;\n                        }\n                    }\n                }\n            }\n\n            // Hide or show\n            each(labels, function(label) {\n                var complete,\n                    newOpacity;\n\n                if (label) {\n                    newOpacity = label.newOpacity;\n\n                    if (label.oldOpacity !== newOpacity && label.placed) {\n\n                        // Make sure the label is completely hidden to avoid catching\n                        // clicks (#4362)\n                        if (newOpacity) {\n                            label.show(true);\n                        } else {\n                            complete = function() {\n                                label.hide();\n                            };\n                        }\n\n                        // Animate or set the opacity\t\t\t\t\t\n                        label.alignAttr.opacity = newOpacity;\n                        label[label.isOld ? 'animate' : 'attr'](\n                            label.alignAttr,\n                            null,\n                            complete\n                        );\n\n                    }\n                    label.isOld = true;\n                }\n            });\n        };\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/series-label.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(u){\"object\"===typeof module&&module.exports?module.exports=u:u(Highcharts)})(function(u){(function(q){function u(f,b,a,m,c,e){f=(e-b)*(a-f)-(m-b)*(c-f);return 0<f?!0:0>f?!1:!0}function v(f,b,a,m,c,e,d,l){return u(f,b,c,e,d,l)!==u(a,m,c,e,d,l)&&u(f,b,a,m,c,e)!==u(f,b,a,m,d,l)}function z(f,b,a,m,c,e,d,l){return v(f,b,f+a,b,c,e,d,l)||v(f+a,b,f+a,b+m,c,e,d,l)||v(f,b+m,f+a,b+m,c,e,d,l)||v(f,b,f,b+m,c,e,d,l)}function A(f){var b=this,a=Math.max(q.animObject(b.renderer.globalAnimation).duration,\n250),m=!b.hasRendered;f.apply(b,[].slice.call(arguments,1));b.labelSeries=[];clearTimeout(b.seriesLabelTimer);w(b.series,function(c){var e=c.labelBySeries,d=e&&e.closest;c.options.label.enabled&&c.visible&&(c.graph||c.area)&&(b.labelSeries.push(c),m&&(a=Math.max(a,q.animObject(c.options.animation).duration)),d&&(void 0!==d[0].plotX?e.animate({x:d[0].plotX+d[1],y:d[0].plotY+d[2]}):e.attr({opacity:0})))});b.seriesLabelTimer=setTimeout(function(){b.drawSeriesLabels()},a)}var B=q.wrap,w=q.each,D=q.extend,\nx=q.isNumber,C=q.Series,E=q.SVGRenderer,y=q.Chart;q.setOptions({plotOptions:{series:{label:{enabled:!0,connectorAllowed:!0,connectorNeighbourDistance:24,styles:{fontWeight:\"bold\"}}}}});E.prototype.symbols.connector=function(f,b,a,m,c){var e=c&&c.anchorX;c=c&&c.anchorY;var d,l,h=a/2;x(e)&&x(c)&&(d=[\"M\",e,c],l=b-c,0>l&&(l=-m-l),l<a&&(h=e<f+a/2?l:a-l),c>b+m?d.push(\"L\",f+h,b+m):c<b?d.push(\"L\",f+h,b):e<f?d.push(\"L\",f,b+m/2):e>f+a&&d.push(\"L\",f+a,b+m/2));return d||[]};C.prototype.getPointsOnGraph=function(){var f=\nthis.points,b,a,m=[],c,e,d,l;e=this.graph||this.area;d=e.element;var h=(b=this.chart.inverted)?this.yAxis.pos:this.xAxis.pos,n=b?this.xAxis.pos:this.yAxis.pos;if(this.getPointSpline&&d.getPointAtLength){e.toD&&(a=e.attr(\"d\"),e.attr({d:e.toD}));l=d.getTotalLength();for(c=0;c<l;c+=16)b=d.getPointAtLength(c),m.push({chartX:h+b.x,chartY:n+b.y,plotX:b.x,plotY:b.y});a&&e.attr({d:a});b=f[f.length-1];b.chartX=h+b.plotX;b.chartY=n+b.plotY;m.push(b)}else for(l=f.length,c=0;c<l;c+=1){b=f[c];a=f[c-1];b.chartX=\nh+b.plotX;b.chartY=n+b.plotY;if(0<c&&(e=Math.abs(b.chartX-a.chartX),d=Math.abs(b.chartY-a.chartY),e=Math.max(e,d),16<e))for(e=Math.ceil(e/16),d=1;d<e;d+=1)m.push({chartX:a.chartX+d/e*(b.chartX-a.chartX),chartY:a.chartY+d/e*(b.chartY-a.chartY),plotX:a.plotX+d/e*(b.plotX-a.plotX),plotY:a.plotY+d/e*(b.plotY-a.plotY)});x(b.plotY)&&m.push(b)}return m};C.prototype.checkClearPoint=function(f,b,a,m){var c=Number.MAX_VALUE,e=Number.MAX_VALUE,d,l,h=this.options.label.connectorAllowed,n=this.chart,p,g,r,k;for(r=\n0;r<n.boxesToAvoid.length;r+=1){g=n.boxesToAvoid[r];k=f+a.width;p=b;var q=b+a.height;if(!(f>g.right||k<g.left||p>g.bottom||q<g.top))return!1}for(r=0;r<n.series.length;r+=1)if(p=n.series[r],g=p.interpolatedPoints,p.visible&&g){for(k=1;k<g.length;k+=1){if(z(f,b,a.width,a.height,g[k-1].chartX,g[k-1].chartY,g[k].chartX,g[k].chartY))return!1;this===p&&!d&&m&&(d=z(f-16,b-16,a.width+32,a.height+32,g[k-1].chartX,g[k-1].chartY,g[k].chartX,g[k].chartY));this!==p&&(c=Math.min(c,Math.pow(f+a.width/2-g[k].chartX,\n2)+Math.pow(b+a.height/2-g[k].chartY,2),Math.pow(f-g[k].chartX,2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2),Math.pow(f-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2)))}if(h&&this===p&&(m&&!d||c<Math.pow(this.options.label.connectorNeighbourDistance,2))){for(k=1;k<g.length;k+=1)d=Math.min(Math.pow(f+a.width/2-g[k].chartX,2)+Math.pow(b+a.height/2-g[k].chartY,2),Math.pow(f-g[k].chartX,\n2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2),Math.pow(f-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2)),d<e&&(e=d,l=g[k]);d=!0}}return!m||d?{x:f,y:b,weight:c-(l?e:0),connectorPoint:l}:!1};y.prototype.drawSeriesLabels=function(){var f=this,b=this.labelSeries;f.boxesToAvoid=[];w(b,function(a){a.interpolatedPoints=a.getPointsOnGraph();w(a.options.label.boxesToAvoid||[],function(a){f.boxesToAvoid.push(a)})});\nw(f.series,function(a){function b(a,b,c){return a>g&&a<=g+k-c.width&&b>=r&&b<=r+q-c.height}var c,e,d,l=[],h,n,p=f.inverted,g=p?a.yAxis.pos:a.xAxis.pos,r=p?a.xAxis.pos:a.yAxis.pos,k=f.inverted?a.yAxis.len:a.xAxis.len,q=f.inverted?a.xAxis.len:a.yAxis.len,t=a.interpolatedPoints,p=a.labelBySeries;if(a.visible&&t){p||(a.labelBySeries=p=f.renderer.label(a.name,0,-9999,\"connector\").css(D({color:a.color},a.options.label.styles)).attr({padding:0,opacity:0,stroke:a.color,\"stroke-width\":1}).add(a.group).animate({opacity:1},\n{duration:200}));c=p.getBBox();c.width=Math.round(c.width);for(n=t.length-1;0<n;--n)e=t[n].chartX+3,d=t[n].chartY-c.height-3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h),e=t[n].chartX+3,d=t[n].chartY+3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h),e=t[n].chartX-c.width-3,d=t[n].chartY+3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h),e=t[n].chartX-c.width-3,d=t[n].chartY-c.height-3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h);if(!l.length)for(e=g+k-c.width;e>=g;e-=16)for(d=\nr;d<r+q-c.height;d+=16)(h=a.checkClearPoint(e,d,c,!0))&&l.push(h);if(l.length){if(l.sort(function(a,b){return b.weight-a.weight}),h=l[0],f.boxesToAvoid.push({left:h.x,right:h.x+c.width,top:h.y,bottom:h.y+c.height}),Math.round(h.x)!==Math.round(p.x)||Math.round(h.y)!==Math.round(p.y))a.labelBySeries.attr({opacity:0,x:h.x-g,y:h.y-r,anchorX:h.connectorPoint&&h.connectorPoint.plotX,anchorY:h.connectorPoint&&h.connectorPoint.plotY}).animate({opacity:1}),a.options.kdNow=!0,a.buildKDTree(),a=a.searchPoint({chartX:h.x,\nchartY:h.y},!0),p.closest=[a,h.x-g-a.plotX,h.y-r-a.plotY]}else p&&(a.labelBySeries=p.destroy())}})};B(y.prototype,\"render\",A);B(y.prototype,\"redraw\",A)})(u)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/series-label.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         * EXPERIMENTAL Highcharts module to place labels next to a series in a natural position.\n         *\n         * TODO:\n         * - add column support (box collision detection, boxesToAvoid logic)\n         * - other series types, area etc.\n         * - avoid data labels, when data labels above, show series label below.\n         * - add more options (connector, format, formatter)\n         * \n         * http://jsfiddle.net/highcharts/L2u9rpwr/\n         * http://jsfiddle.net/highcharts/y5A37/\n         * http://jsfiddle.net/highcharts/264Nm/\n         * http://jsfiddle.net/highcharts/y5A37/\n         */\n\n\n        var labelDistance = 3,\n            wrap = H.wrap,\n            each = H.each,\n            extend = H.extend,\n            isNumber = H.isNumber,\n            Series = H.Series,\n            SVGRenderer = H.SVGRenderer,\n            Chart = H.Chart;\n\n        H.setOptions({\n            plotOptions: {\n                series: {\n                    label: {\n                        enabled: true,\n                        // Allow labels to be placed distant to the graph if necessary, and\n                        // draw a connector line to the graph\n                        connectorAllowed: true,\n                        connectorNeighbourDistance: 24, // If the label is closer than this to a neighbour graph, draw a connector\n                        styles: {\n                            fontWeight: 'bold'\n                        }\n                        // boxesToAvoid: []\n                    }\n                }\n            }\n        });\n\n        /**\n         * Counter-clockwise, part of the fast line intersection logic\n         */\n        function ccw(x1, y1, x2, y2, x3, y3) {\n            var cw = ((y3 - y1) * (x2 - x1)) - ((y2 - y1) * (x3 - x1));\n            return cw > 0 ? true : cw < 0 ? false : true;\n        }\n\n        /**\n         * Detect if two lines intersect\n         */\n        function intersectLine(x1, y1, x2, y2, x3, y3, x4, y4) {\n            return ccw(x1, y1, x3, y3, x4, y4) !== ccw(x2, y2, x3, y3, x4, y4) &&\n                ccw(x1, y1, x2, y2, x3, y3) !== ccw(x1, y1, x2, y2, x4, y4);\n        }\n\n        /**\n         * Detect if a box intersects with a line\n         */\n        function boxIntersectLine(x, y, w, h, x1, y1, x2, y2) {\n            return (\n                intersectLine(x, y, x + w, y, x1, y1, x2, y2) || // top of label\n                intersectLine(x + w, y, x + w, y + h, x1, y1, x2, y2) || // right of label\n                intersectLine(x, y + h, x + w, y + h, x1, y1, x2, y2) || // bottom of label\n                intersectLine(x, y, x, y + h, x1, y1, x2, y2) // left of label\n            );\n        }\n\n        /**\n         * General symbol definition for labels with connector\n         */\n        SVGRenderer.prototype.symbols.connector = function(x, y, w, h, options) {\n            var anchorX = options && options.anchorX,\n                anchorY = options && options.anchorY,\n                path,\n                yOffset,\n                lateral = w / 2;\n\n            if (isNumber(anchorX) && isNumber(anchorY)) {\n\n                path = ['M', anchorX, anchorY];\n\n                // Prefer 45 deg connectors\n                yOffset = y - anchorY;\n                if (yOffset < 0) {\n                    yOffset = -h - yOffset;\n                }\n                if (yOffset < w) {\n                    lateral = anchorX < x + (w / 2) ? yOffset : w - yOffset;\n                }\n\n                // Anchor below label\n                if (anchorY > y + h) {\n                    path.push('L', x + lateral, y + h);\n\n                    // Anchor above label\n                } else if (anchorY < y) {\n                    path.push('L', x + lateral, y);\n\n                    // Anchor left of label\n                } else if (anchorX < x) {\n                    path.push('L', x, y + h / 2);\n\n                    // Anchor right of label\n                } else if (anchorX > x + w) {\n                    path.push('L', x + w, y + h / 2);\n                }\n            }\n            return path || [];\n        };\n\n        /**\n         * Points to avoid. In addition to actual data points, the label should avoid\n         * interpolated positions.\n         */\n        Series.prototype.getPointsOnGraph = function() {\n            var distance = 16,\n                points = this.points,\n                point,\n                last,\n                interpolated = [],\n                i,\n                deltaX,\n                deltaY,\n                delta,\n                len,\n                n,\n                j,\n                d,\n                graph = this.graph || this.area,\n                node = graph.element,\n                inverted = this.chart.inverted,\n                paneLeft = inverted ? this.yAxis.pos : this.xAxis.pos,\n                paneTop = inverted ? this.xAxis.pos : this.yAxis.pos;\n\n            // For splines, get the point at length (possible caveat: peaks are not correctly detected)\n            if (this.getPointSpline && node.getPointAtLength) {\n                // If it is animating towards a path definition, use that briefly, and reset\n                if (graph.toD) {\n                    d = graph.attr('d');\n                    graph.attr({\n                        d: graph.toD\n                    });\n                }\n                len = node.getTotalLength();\n                for (i = 0; i < len; i += distance) {\n                    point = node.getPointAtLength(i);\n                    interpolated.push({\n                        chartX: paneLeft + point.x,\n                        chartY: paneTop + point.y,\n                        plotX: point.x,\n                        plotY: point.y\n                    });\n                }\n                if (d) {\n                    graph.attr({\n                        d: d\n                    });\n                }\n                // Last point\n                point = points[points.length - 1];\n                point.chartX = paneLeft + point.plotX;\n                point.chartY = paneTop + point.plotY;\n                interpolated.push(point);\n\n                // Interpolate\n            } else {\n                len = points.length;\n                for (i = 0; i < len; i += 1) {\n\n                    point = points[i];\n                    last = points[i - 1];\n\n                    // Absolute coordinates so we can compare different panes\n                    point.chartX = paneLeft + point.plotX;\n                    point.chartY = paneTop + point.plotY;\n\n                    // Add interpolated points\n                    if (i > 0) {\n                        deltaX = Math.abs(point.chartX - last.chartX);\n                        deltaY = Math.abs(point.chartY - last.chartY);\n                        delta = Math.max(deltaX, deltaY);\n                        if (delta > distance) {\n\n                            n = Math.ceil(delta / distance);\n\n                            for (j = 1; j < n; j += 1) {\n                                interpolated.push({\n                                    chartX: last.chartX + (point.chartX - last.chartX) * (j / n),\n                                    chartY: last.chartY + (point.chartY - last.chartY) * (j / n),\n                                    plotX: last.plotX + (point.plotX - last.plotX) * (j / n),\n                                    plotY: last.plotY + (point.plotY - last.plotY) * (j / n)\n                                });\n                            }\n                        }\n                    }\n\n                    // Add the real point in order to find positive and negative peaks\n                    if (isNumber(point.plotY)) {\n                        interpolated.push(point);\n                    }\n                }\n            }\n            return interpolated;\n        };\n\n        /**\n         * Check whether a proposed label position is clear of other elements\n         */\n        Series.prototype.checkClearPoint = function(x, y, bBox, checkDistance) {\n            var distToOthersSquared = Number.MAX_VALUE, // distance to other graphs\n                distToPointSquared = Number.MAX_VALUE,\n                dist,\n                connectorPoint,\n                connectorEnabled = this.options.label.connectorAllowed,\n\n                chart = this.chart,\n                series,\n                points,\n                leastDistance = 16,\n                withinRange,\n                i,\n                j;\n\n            function intersectRect(r1, r2) {\n                return !(r2.left > r1.right ||\n                    r2.right < r1.left ||\n                    r2.top > r1.bottom ||\n                    r2.bottom < r1.top);\n            }\n\n            /**\n             * Get the weight in order to determine the ideal position. Larger distance to\n             * other series gives more weight. Smaller distance to the actual point (connector points only)\n             * gives more weight.\n             */\n            function getWeight(distToOthersSquared, distToPointSquared) {\n                return distToOthersSquared - distToPointSquared;\n            }\n\n            // First check for collision with existing labels\n            for (i = 0; i < chart.boxesToAvoid.length; i += 1) {\n                if (intersectRect(chart.boxesToAvoid[i], {\n                        left: x,\n                        right: x + bBox.width,\n                        top: y,\n                        bottom: y + bBox.height\n                    })) {\n                    return false;\n                }\n            }\n\n            // For each position, check if the lines around the label intersect with any of the \n            // graphs\n            for (i = 0; i < chart.series.length; i += 1) {\n                series = chart.series[i];\n                points = series.interpolatedPoints;\n                if (series.visible && points) {\n                    for (j = 1; j < points.length; j += 1) {\n                        // If any of the box sides intersect with the line, return\n                        if (boxIntersectLine(\n                                x,\n                                y,\n                                bBox.width,\n                                bBox.height,\n                                points[j - 1].chartX,\n                                points[j - 1].chartY,\n                                points[j].chartX,\n                                points[j].chartY\n                            )) {\n                            return false;\n                        }\n\n                        // But if it is too far away (a padded box doesn't intersect), also return\n                        if (this === series && !withinRange && checkDistance) {\n                            withinRange = boxIntersectLine(\n                                x - leastDistance,\n                                y - leastDistance,\n                                bBox.width + 2 * leastDistance,\n                                bBox.height + 2 * leastDistance,\n                                points[j - 1].chartX,\n                                points[j - 1].chartY,\n                                points[j].chartX,\n                                points[j].chartY\n                            );\n                        }\n\n                        // Find the squared distance from the center of the label\n                        if (this !== series) {\n                            distToOthersSquared = Math.min(\n                                distToOthersSquared,\n                                Math.pow(x + bBox.width / 2 - points[j].chartX, 2) + Math.pow(y + bBox.height / 2 - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2)\n                            );\n                        }\n                    }\n\n                    // Do we need a connector? \n                    if (connectorEnabled && this === series && ((checkDistance && !withinRange) ||\n                            distToOthersSquared < Math.pow(this.options.label.connectorNeighbourDistance, 2))) {\n                        for (j = 1; j < points.length; j += 1) {\n                            dist = Math.min(\n                                Math.pow(x + bBox.width / 2 - points[j].chartX, 2) + Math.pow(y + bBox.height / 2 - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2)\n                            );\n                            if (dist < distToPointSquared) {\n                                distToPointSquared = dist;\n                                connectorPoint = points[j];\n                            }\n                        }\n                        withinRange = true;\n                    }\n                }\n            }\n\n            return !checkDistance || withinRange ? {\n                x: x,\n                y: y,\n                weight: getWeight(distToOthersSquared, connectorPoint ? distToPointSquared : 0),\n                connectorPoint: connectorPoint\n            } : false;\n\n        };\n\n        /**\n         * The main initiator method that runs on chart level after initiation and redraw. It runs in \n         * a timeout to prevent locking, and loops over all series, taking all series and labels into\n         * account when placing the labels.\n         */\n        Chart.prototype.drawSeriesLabels = function() {\n            var chart = this,\n                labelSeries = this.labelSeries;\n\n            chart.boxesToAvoid = [];\n\n            // Build the interpolated points\n            each(labelSeries, function(series) {\n                series.interpolatedPoints = series.getPointsOnGraph();\n\n                each(series.options.label.boxesToAvoid || [], function(box) {\n                    chart.boxesToAvoid.push(box);\n                });\n            });\n\n            each(chart.series, function(series) {\n                var bBox,\n                    x,\n                    y,\n                    results = [],\n                    clearPoint,\n                    i,\n                    best,\n                    inverted = chart.inverted,\n                    paneLeft = inverted ? series.yAxis.pos : series.xAxis.pos,\n                    paneTop = inverted ? series.xAxis.pos : series.yAxis.pos,\n                    paneWidth = chart.inverted ? series.yAxis.len : series.xAxis.len,\n                    paneHeight = chart.inverted ? series.xAxis.len : series.yAxis.len,\n                    points = series.interpolatedPoints,\n                    label = series.labelBySeries;\n\n                function insidePane(x, y, bBox) {\n                    return x > paneLeft && x <= paneLeft + paneWidth - bBox.width &&\n                        y >= paneTop && y <= paneTop + paneHeight - bBox.height;\n                }\n\n                if (series.visible && points) {\n                    if (!label) {\n                        series.labelBySeries = label = chart.renderer\n                            .label(series.name, 0, -9999, 'connector')\n                            .css(extend({\n                                color: series.color\n                            }, series.options.label.styles))\n                            .attr({\n                                padding: 0,\n                                opacity: 0,\n                                stroke: series.color,\n                                'stroke-width': 1\n                            })\n                            .add(series.group)\n                            .animate({\n                                opacity: 1\n                            }, {\n                                duration: 200\n                            });\n                    }\n\n                    bBox = label.getBBox();\n                    bBox.width = Math.round(bBox.width);\n\n                    // Ideal positions are centered above or below a point on right side\n                    // of chart\n                    for (i = points.length - 1; i > 0; i -= 1) {\n\n                        // Right - up\n                        x = points[i].chartX + labelDistance;\n                        y = points[i].chartY - bBox.height - labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                        // Right - down\n                        x = points[i].chartX + labelDistance;\n                        y = points[i].chartY + labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                        // Left - down\n                        x = points[i].chartX - bBox.width - labelDistance;\n                        y = points[i].chartY + labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                        // Left - up\n                        x = points[i].chartX - bBox.width - labelDistance;\n                        y = points[i].chartY - bBox.height - labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                    }\n\n                    // Brute force, try all positions on the chart in a 16x16 grid\n                    if (!results.length) {\n                        for (x = paneLeft + paneWidth - bBox.width; x >= paneLeft; x -= 16) {\n                            for (y = paneTop; y < paneTop + paneHeight - bBox.height; y += 16) {\n                                clearPoint = series.checkClearPoint(x, y, bBox, true);\n                                if (clearPoint) {\n                                    results.push(clearPoint);\n                                }\n                            }\n                        }\n                    }\n\n                    if (results.length) {\n\n                        results.sort(function(a, b) {\n                            return b.weight - a.weight;\n                        });\n\n                        best = results[0];\n\n                        chart.boxesToAvoid.push({\n                            left: best.x,\n                            right: best.x + bBox.width,\n                            top: best.y,\n                            bottom: best.y + bBox.height\n                        });\n\n                        // Move it if needed\n                        if (Math.round(best.x) !== Math.round(label.x) ||\n                            Math.round(best.y) !== Math.round(label.y)) {\n                            series.labelBySeries\n                                .attr({\n                                    opacity: 0,\n                                    x: best.x - paneLeft,\n                                    y: best.y - paneTop,\n                                    anchorX: best.connectorPoint && best.connectorPoint.plotX,\n                                    anchorY: best.connectorPoint && best.connectorPoint.plotY\n                                })\n                                .animate({\n                                    opacity: 1\n                                });\n\n                            // Record closest point to stick to for sync redraw\n                            series.options.kdNow = true;\n                            series.buildKDTree();\n                            var closest = series.searchPoint({\n                                chartX: best.x,\n                                chartY: best.y\n                            }, true);\n                            label.closest = [\n                                closest,\n                                best.x - paneLeft - closest.plotX,\n                                best.y - paneTop - closest.plotY\n                            ];\n\n                        }\n\n                    } else if (label) {\n                        series.labelBySeries = label.destroy();\n                    }\n                }\n            });\n        };\n\n        /**\n         * Prepare drawing series labels\n         */\n        function drawLabels(proceed) {\n\n            var chart = this,\n                delay = Math.max(\n                    H.animObject(chart.renderer.globalAnimation).duration,\n                    250\n                ),\n                initial = !chart.hasRendered;\n\n            proceed.apply(chart, [].slice.call(arguments, 1));\n\n            chart.labelSeries = [];\n\n            clearTimeout(chart.seriesLabelTimer);\n\n            // Which series should have labels\n            each(chart.series, function(series) {\n                var options = series.options.label,\n                    label = series.labelBySeries,\n                    closest = label && label.closest;\n\n                if (options.enabled && series.visible && (series.graph || series.area)) {\n                    chart.labelSeries.push(series);\n\n                    // The labels are processing heavy, wait until the animation is done\n                    if (initial) {\n                        delay = Math.max(\n                            delay,\n                            H.animObject(series.options.animation).duration\n                        );\n                    }\n\n                    // Keep the position updated to the axis while redrawing\n                    if (closest) {\n                        if (closest[0].plotX !== undefined) {\n                            label.animate({\n                                x: closest[0].plotX + closest[1],\n                                y: closest[0].plotY + closest[2]\n                            });\n                        } else {\n                            label.attr({\n                                opacity: 0\n                            });\n                        }\n                    }\n                }\n            });\n\n            chart.seriesLabelTimer = setTimeout(function() {\n                chart.drawSeriesLabels();\n            }, delay);\n\n        }\n        wrap(Chart.prototype, 'render', drawLabels);\n        wrap(Chart.prototype, 'redraw', drawLabels);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/solid-gauge.js",
    "content": "/*\n  Highcharts JS v5.0.12 (2017-05-24)\n Solid angular gauge module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(l){\"object\"===typeof module&&module.exports?module.exports=l:l(Highcharts)})(function(l){(function(e){var l=e.pInt,u=e.pick,m=e.each,r=e.isNumber,w=e.wrap,v;w(e.Renderer.prototype.symbols,\"arc\",function(a,f,d,c,e,b){a=a(f,d,c,e,b);b.rounded&&(c=((b.r||c)-b.innerR)/2,b=[\"A\",c,c,0,1,1,a[12],a[13]],a.splice.apply(a,[a.length-1,0].concat([\"A\",c,c,0,1,1,a[1],a[2]])),a.splice.apply(a,[11,3].concat(b)));return a});v={initDataClasses:function(a){var f=this.chart,d,c=0,t=this.options;this.dataClasses=\nd=[];m(a.dataClasses,function(b,h){b=e.merge(b);d.push(b);b.color||(\"category\"===t.dataClassColor?(h=f.options.colors,b.color=h[c++],c===h.length&&(c=0)):b.color=e.color(t.minColor).tweenTo(e.color(t.maxColor),h/(a.dataClasses.length-1)))})},initStops:function(a){this.stops=a.stops||[[0,this.options.minColor],[1,this.options.maxColor]];m(this.stops,function(a){a.color=e.color(a[1])})},toColor:function(a,f){var d=this.stops,c,e,b=this.dataClasses,h,g;if(b)for(g=b.length;g--;){if(h=b[g],c=h.from,d=\nh.to,(void 0===c||a>=c)&&(void 0===d||a<=d)){e=h.color;f&&(f.dataClass=g);break}}else{this.isLog&&(a=this.val2lin(a));a=1-(this.max-a)/(this.max-this.min);for(g=d.length;g--&&!(a>d[g][0]););c=d[g]||d[g+1];d=d[g+1]||c;a=1-(d[0]-a)/(d[0]-c[0]||1);e=c.color.tweenTo(d.color,a)}return e}};e.seriesType(\"solidgauge\",\"gauge\",{colorByPoint:!0},{translate:function(){var a=this.yAxis;e.extend(a,v);!a.dataClasses&&a.options.dataClasses&&a.initDataClasses(a.options);a.initStops(a.options);e.seriesTypes.gauge.prototype.translate.call(this)},\ndrawPoints:function(){var a=this,f=a.yAxis,d=f.center,c=a.options,t=a.chart.renderer,b=c.overshoot,h=r(b)?b/180*Math.PI:0,g;r(c.threshold)&&(g=f.startAngleRad+f.translate(c.threshold,null,null,null,!0));this.thresholdAngleRad=u(g,f.startAngleRad);m(a.points,function(b){var g=b.graphic,k=f.startAngleRad+f.translate(b.y,null,null,null,!0),m=l(u(b.options.radius,c.radius,100))*d[2]/200,n=l(u(b.options.innerRadius,c.innerRadius,60))*d[2]/200,p=f.toColor(b.y,b),q=Math.min(f.startAngleRad,f.endAngleRad),\nr=Math.max(f.startAngleRad,f.endAngleRad);\"none\"===p&&(p=b.color||a.color||\"none\");\"none\"!==p&&(b.color=p);k=Math.max(q-h,Math.min(r+h,k));!1===c.wrap&&(k=Math.max(q,Math.min(r,k)));q=Math.min(k,a.thresholdAngleRad);k=Math.max(k,a.thresholdAngleRad);k-q>2*Math.PI&&(k=q+2*Math.PI);b.shapeArgs=n={x:d[0],y:d[1],r:m,innerR:n,start:q,end:k,rounded:c.rounded};b.startR=m;g?(b=n.d,g.animate(e.extend({fill:p},n)),b&&(n.d=b)):b.graphic=t.arc(n).addClass(b.getClassName(),!0).attr({fill:p,\"sweep-flag\":0}).add(a.group)})},\nanimate:function(a){a||(this.startAngleRad=this.thresholdAngleRad,e.seriesTypes.pie.prototype.animate.call(this,a))}})})(l)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/solid-gauge.src.js",
    "content": "/**\n * @license  Highcharts JS v5.0.12 (2017-05-24)\n * Solid angular gauge module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Solid angular gauge module\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n\n        var pInt = H.pInt,\n            pick = H.pick,\n            each = H.each,\n            isNumber = H.isNumber,\n            wrap = H.wrap,\n            Renderer = H.Renderer,\n            colorAxisMethods;\n\n        /**\n         * Symbol definition of an arc with round edges.\n         * \n         * @param  {Number} x - The X coordinate for the top left position.\n         * @param  {Number} y - The Y coordinate for the top left position.\n         * @param  {Number} w - The pixel width.\n         * @param  {Number} h - The pixel height.\n         * @param  {Object} [options] - Additional options, depending on the actual\n         *    symbol drawn.\n         * @param {boolean} [options.rounded] - Whether to draw rounded edges.\n         * @return {Array} Path of the created arc. \n         */\n        wrap(Renderer.prototype.symbols, 'arc', function(proceed, x, y, w, h, options) {\n            var arc = proceed,\n                path = arc(x, y, w, h, options);\n            if (options.rounded) {\n                var r = options.r || w,\n                    smallR = (r - options.innerR) / 2,\n                    x1 = path[1],\n                    y1 = path[2],\n                    x2 = path[12],\n                    y2 = path[13],\n                    roundStart = ['A', smallR, smallR, 0, 1, 1, x1, y1],\n                    roundEnd = ['A', smallR, smallR, 0, 1, 1, x2, y2];\n                // Insert rounded edge on end, and remove line.\n                path.splice.apply(path, [path.length - 1, 0].concat(roundStart));\n                // Insert rounded edge on end, and remove line.\n                path.splice.apply(path, [11, 3].concat(roundEnd));\n            }\n            return path;\n        });\n\n        // These methods are defined in the ColorAxis object, and copied here.\n        // If we implement an AMD system we should make ColorAxis a dependency.\n        colorAxisMethods = {\n\n\n            initDataClasses: function(userOptions) {\n                var chart = this.chart,\n                    dataClasses,\n                    colorCounter = 0,\n                    options = this.options;\n                this.dataClasses = dataClasses = [];\n\n                each(userOptions.dataClasses, function(dataClass, i) {\n                    var colors;\n\n                    dataClass = H.merge(dataClass);\n                    dataClasses.push(dataClass);\n                    if (!dataClass.color) {\n                        if (options.dataClassColor === 'category') {\n                            colors = chart.options.colors;\n                            dataClass.color = colors[colorCounter++];\n                            // loop back to zero\n                            if (colorCounter === colors.length) {\n                                colorCounter = 0;\n                            }\n                        } else {\n                            dataClass.color = H.color(options.minColor).tweenTo(\n                                H.color(options.maxColor),\n                                i / (userOptions.dataClasses.length - 1)\n                            );\n                        }\n                    }\n                });\n            },\n\n            initStops: function(userOptions) {\n                this.stops = userOptions.stops || [\n                    [0, this.options.minColor],\n                    [1, this.options.maxColor]\n                ];\n                each(this.stops, function(stop) {\n                    stop.color = H.color(stop[1]);\n                });\n            },\n            /** \n             * Translate from a value to a color\n             */\n            toColor: function(value, point) {\n                var pos,\n                    stops = this.stops,\n                    from,\n                    to,\n                    color,\n                    dataClasses = this.dataClasses,\n                    dataClass,\n                    i;\n\n                if (dataClasses) {\n                    i = dataClasses.length;\n                    while (i--) {\n                        dataClass = dataClasses[i];\n                        from = dataClass.from;\n                        to = dataClass.to;\n                        if ((from === undefined || value >= from) && (to === undefined || value <= to)) {\n                            color = dataClass.color;\n                            if (point) {\n                                point.dataClass = i;\n                            }\n                            break;\n                        }\n                    }\n\n                } else {\n\n                    if (this.isLog) {\n                        value = this.val2lin(value);\n                    }\n                    pos = 1 - ((this.max - value) / (this.max - this.min));\n                    i = stops.length;\n                    while (i--) {\n                        if (pos > stops[i][0]) {\n                            break;\n                        }\n                    }\n                    from = stops[i] || stops[i + 1];\n                    to = stops[i + 1] || from;\n\n                    // The position within the gradient\n                    pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);\n\n                    color = from.color.tweenTo(\n                        to.color,\n                        pos\n                    );\n                }\n                return color;\n            }\n        };\n\n        // The solidgauge series type\n        H.seriesType('solidgauge', 'gauge', {\n            colorByPoint: true\n\n        }, {\n\n            /**\n             * Extend the translate function to extend the Y axis with the necessary\n             * decoration (#5895).\n             */\n            translate: function() {\n                var axis = this.yAxis;\n                H.extend(axis, colorAxisMethods);\n\n                // Prepare data classes\n                if (!axis.dataClasses && axis.options.dataClasses) {\n                    axis.initDataClasses(axis.options);\n                }\n                axis.initStops(axis.options);\n\n                // Generate points and inherit data label position\n                H.seriesTypes.gauge.prototype.translate.call(this);\n            },\n\n            /**\n             * Draw the points where each point is one needle\n             */\n            drawPoints: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    center = yAxis.center,\n                    options = series.options,\n                    renderer = series.chart.renderer,\n                    overshoot = options.overshoot,\n                    overshootVal = isNumber(overshoot) ? overshoot / 180 * Math.PI : 0,\n                    thresholdAngleRad;\n\n                // Handle the threshold option\n                if (isNumber(options.threshold)) {\n                    thresholdAngleRad = yAxis.startAngleRad + yAxis.translate(\n                        options.threshold,\n                        null,\n                        null,\n                        null,\n                        true\n                    );\n                }\n                this.thresholdAngleRad = pick(thresholdAngleRad, yAxis.startAngleRad);\n\n\n                each(series.points, function(point) {\n                    var graphic = point.graphic,\n                        rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true),\n                        radius = (pInt(pick(point.options.radius, options.radius, 100)) * center[2]) / 200,\n                        innerRadius = (pInt(pick(point.options.innerRadius, options.innerRadius, 60)) * center[2]) / 200,\n                        shapeArgs,\n                        d,\n                        toColor = yAxis.toColor(point.y, point),\n                        axisMinAngle = Math.min(yAxis.startAngleRad, yAxis.endAngleRad),\n                        axisMaxAngle = Math.max(yAxis.startAngleRad, yAxis.endAngleRad),\n                        minAngle,\n                        maxAngle;\n\n                    if (toColor === 'none') { // #3708\n                        toColor = point.color || series.color || 'none';\n                    }\n                    if (toColor !== 'none') {\n                        point.color = toColor;\n                    }\n\n                    // Handle overshoot and clipping to axis max/min\n                    rotation = Math.max(axisMinAngle - overshootVal, Math.min(axisMaxAngle + overshootVal, rotation));\n\n                    // Handle the wrap option\n                    if (options.wrap === false) {\n                        rotation = Math.max(axisMinAngle, Math.min(axisMaxAngle, rotation));\n                    }\n\n                    minAngle = Math.min(rotation, series.thresholdAngleRad);\n                    maxAngle = Math.max(rotation, series.thresholdAngleRad);\n\n                    if (maxAngle - minAngle > 2 * Math.PI) {\n                        maxAngle = minAngle + 2 * Math.PI;\n                    }\n\n                    point.shapeArgs = shapeArgs = {\n                        x: center[0],\n                        y: center[1],\n                        r: radius,\n                        innerR: innerRadius,\n                        start: minAngle,\n                        end: maxAngle,\n                        rounded: options.rounded\n                    };\n                    point.startR = radius; // For PieSeries.animate\n\n                    if (graphic) {\n                        d = shapeArgs.d;\n                        graphic.animate(H.extend({\n                            fill: toColor\n                        }, shapeArgs));\n                        if (d) {\n                            shapeArgs.d = d; // animate alters it\n                        }\n                    } else {\n                        point.graphic = renderer.arc(shapeArgs)\n                            .addClass(point.getClassName(), true)\n                            .attr({\n                                fill: toColor,\n                                'sweep-flag': 0\n                            })\n                            .add(series.group);\n\n\n                    }\n                });\n            },\n\n            /**\n             * Extend the pie slice animation by animating from start angle and up\n             */\n            animate: function(init) {\n\n                if (!init) {\n                    this.startAngleRad = this.thresholdAngleRad;\n                    H.seriesTypes.pie.prototype.animate.call(this, init);\n                }\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/static-scale.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n StaticScale\n\n (c) 2016 Torstein Honsi, Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(a){\"object\"===typeof module&&module.exports?module.exports=a:a(Highcharts)})(function(a){(function(c){var a=c.Chart,e=c.each,f=c.pick;a.prototype.adjustHeight=function(){e(this.axes,function(b){var a=b.chart,e=!!a.initiatedScale&&a.options.animation,d=b.options.staticScale;c.isNumber(d)&&!b.horiz&&c.defined(b.min)&&(b=f(b.unitLength,b.max+b.tickInterval-b.min)*d,b=Math.max(b,d),d=b-a.plotHeight,1<=Math.abs(d)&&(a.plotHeight=b,a.setSize(null,a.chartHeight+d,e)))});this.initiatedScale=!0};\nc.addEvent(a.prototype,\"render\",a.prototype.adjustHeight)})(a)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/static-scale.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * StaticScale\n *\n * (c) 2016 Torstein Honsi, Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2017 Torstein Honsi, Lars Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var Chart = H.Chart,\n            each = H.each,\n            pick = H.pick;\n\n        Chart.prototype.adjustHeight = function() {\n            each(this.axes, function(axis) {\n                var chart = axis.chart,\n                    animate = !!chart.initiatedScale && chart.options.animation,\n                    staticScale = axis.options.staticScale,\n                    height,\n                    diff;\n                if (\n                    H.isNumber(staticScale) &&\n                    !axis.horiz &&\n                    H.defined(axis.min)\n                ) {\n                    height = pick(\n                        axis.unitLength,\n                        axis.max + axis.tickInterval - axis.min\n                    ) * staticScale;\n\n                    // Minimum height is 1 x staticScale.\n                    height = Math.max(height, staticScale);\n\n                    diff = height - chart.plotHeight;\n\n                    if (Math.abs(diff) >= 1) {\n                        chart.plotHeight = height;\n                        chart.setSize(null, chart.chartHeight + diff, animate);\n                    }\n                }\n\n            });\n            this.initiatedScale = true;\n        };\n        H.addEvent(Chart.prototype, 'render', Chart.prototype.adjustHeight);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/stock.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Highstock as a plugin for Highcharts\n\n (c) 2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(K){\"object\"===typeof module&&module.exports?module.exports=K:K(Highcharts)})(function(K){(function(a){var E=a.addEvent,k=a.Axis,t=a.Chart,z=a.css,F=a.dateFormat,H=a.defined,I=a.each,w=a.extend,h=a.noop,q=a.timeUnits,G=a.wrap;G(a.Series.prototype,\"init\",function(a){var b;a.apply(this,Array.prototype.slice.call(arguments,1));(b=this.xAxis)&&b.options.ordinal&&E(this,\"updatedData\",function(){delete b.ordinalIndex})});G(k.prototype,\"getTimeTicks\",function(a,b,d,u,A,l,h,g){var r=0,e,x,c={},f,\nm,B,n=[],v=-Number.MAX_VALUE,y=this.options.tickPixelInterval;if(!this.options.ordinal&&!this.options.breaks||!l||3>l.length||void 0===d)return a.call(this,b,d,u,A);m=l.length;for(e=0;e<m;e++){B=e&&l[e-1]>u;l[e]<d&&(r=e);if(e===m-1||l[e+1]-l[e]>5*h||B){if(l[e]>v){for(x=a.call(this,b,l[r],l[e],A);x.length&&x[0]<=v;)x.shift();x.length&&(v=x[x.length-1]);n=n.concat(x)}r=e+1}if(B)break}a=x.info;if(g&&a.unitRange<=q.hour){e=n.length-1;for(r=1;r<e;r++)F(\"%d\",n[r])!==F(\"%d\",n[r-1])&&(c[n[r]]=\"day\",f=!0);\nf&&(c[n[0]]=\"day\");a.higherRanks=c}n.info=a;if(g&&H(y)){g=a=n.length;e=[];var D;for(f=[];g--;)r=this.translate(n[g]),D&&(f[g]=D-r),e[g]=D=r;f.sort();f=f[Math.floor(f.length/2)];f<.6*y&&(f=null);g=n[a-1]>u?a-1:a;for(D=void 0;g--;)r=e[g],u=Math.abs(D-r),D&&u<.8*y&&(null===f||u<.8*f)?(c[n[g]]&&!c[n[g+1]]?(u=g+1,D=r):u=g,n.splice(u,1)):D=r}return n});w(k.prototype,{beforeSetTickPositions:function(){var a,b=[],d=!1,u,A=this.getExtremes(),l=A.min,h=A.max,g,r=this.isXAxis&&!!this.options.breaks,A=this.options.ordinal,\nC=this.chart.options.chart.ignoreHiddenSeries;if(A||r){I(this.series,function(g,c){if(!(C&&!1===g.visible||!1===g.takeOrdinalPosition&&!r)&&(b=b.concat(g.processedXData),a=b.length,b.sort(function(f,c){return f-c}),a))for(c=a-1;c--;)b[c]===b[c+1]&&b.splice(c,1)});a=b.length;if(2<a){u=b[1]-b[0];for(g=a-1;g--&&!d;)b[g+1]-b[g]!==u&&(d=!0);!this.options.keepOrdinalPadding&&(b[0]-l>u||h-b[b.length-1]>u)&&(d=!0)}d?(this.ordinalPositions=b,u=this.ordinal2lin(Math.max(l,b[0]),!0),g=Math.max(this.ordinal2lin(Math.min(h,\nb[b.length-1]),!0),1),this.ordinalSlope=h=(h-l)/(g-u),this.ordinalOffset=l-u*h):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=A&&d;this.groupIntervalFactor=null},val2lin:function(a,b){var d=this.ordinalPositions;if(d){var u=d.length,e,l;for(e=u;e--;)if(d[e]===a){l=e;break}for(e=u-1;e--;)if(a>d[e]||0===e){a=(a-d[e])/(d[e+1]-d[e]);l=e+a;break}b=b?l:this.ordinalSlope*(l||0)+this.ordinalOffset}else b=a;return b},lin2val:function(a,b){var d=this.ordinalPositions;if(d){var e=\nthis.ordinalSlope,h=this.ordinalOffset,l=d.length-1,p;if(b)0>a?a=d[0]:a>l?a=d[l]:(l=Math.floor(a),p=a-l);else for(;l--;)if(b=e*l+h,a>=b){e=e*(l+1)+h;p=(a-b)/(e-b);break}return void 0!==p&&void 0!==d[l]?d[l]+(p?p*(d[l+1]-d[l]):0):a}return a},getExtendedPositions:function(){var a=this.chart,b=this.series[0].currentDataGrouping,d=this.ordinalIndex,u=b?b.count+b.unitName:\"raw\",A=this.getExtremes(),l,p;d||(d=this.ordinalIndex={});d[u]||(l={series:[],chart:a,getExtremes:function(){return{min:A.dataMin,\nmax:A.dataMax}},options:{ordinal:!0},val2lin:k.prototype.val2lin,ordinal2lin:k.prototype.ordinal2lin},I(this.series,function(g){p={xAxis:l,xData:g.xData,chart:a,destroyGroupedData:h};p.options={dataGrouping:b?{enabled:!0,forced:!0,approximation:\"open\",units:[[b.unitName,[b.count]]]}:{enabled:!1}};g.processData.apply(p);l.series.push(p)}),this.beforeSetTickPositions.apply(l),d[u]=l.ordinalPositions);return d[u]},getGroupIntervalFactor:function(a,b,d){var e;d=d.processedXData;var h=d.length,l=[];e=\nthis.groupIntervalFactor;if(!e){for(e=0;e<h-1;e++)l[e]=d[e+1]-d[e];l.sort(function(a,g){return a-g});l=l[Math.floor(h/2)];a=Math.max(a,d[0]);b=Math.min(b,d[h-1]);this.groupIntervalFactor=e=h*l/(b-a)}return e},postProcessTickInterval:function(a){var b=this.ordinalSlope;return b?this.options.breaks?this.closestPointRange:a/(b/this.closestPointRange):a}});k.prototype.ordinal2lin=k.prototype.val2lin;G(t.prototype,\"pan\",function(a,b){var d=this.xAxis[0],e=b.chartX,h=!1;if(d.options.ordinal&&d.series.length){var l=\nthis.mouseDownX,p=d.getExtremes(),g=p.dataMax,r=p.min,C=p.max,x=this.hoverPoints,c=d.closestPointRange,l=(l-e)/(d.translationSlope*(d.ordinalSlope||c)),f={ordinalPositions:d.getExtendedPositions()},c=d.lin2val,m=d.val2lin,B;f.ordinalPositions?1<Math.abs(l)&&(x&&I(x,function(n){n.setState()}),0>l?(x=f,B=d.ordinalPositions?d:f):(x=d.ordinalPositions?d:f,B=f),f=B.ordinalPositions,g>f[f.length-1]&&f.push(g),this.fixedRange=C-r,l=d.toFixedRange(null,null,c.apply(x,[m.apply(x,[r,!0])+l,!0]),c.apply(B,[m.apply(B,\n[C,!0])+l,!0])),l.min>=Math.min(p.dataMin,r)&&l.max<=Math.max(g,C)&&d.setExtremes(l.min,l.max,!0,!1,{trigger:\"pan\"}),this.mouseDownX=e,z(this.container,{cursor:\"move\"})):h=!0}else h=!0;h&&a.apply(this,Array.prototype.slice.call(arguments,1))})})(K);(function(a){function E(){return Array.prototype.slice.call(arguments,1)}function k(a){a.apply(this);this.drawBreaks(this.xAxis,[\"x\"]);this.drawBreaks(this.yAxis,t(this.pointArrayMap,[\"y\"]))}var t=a.pick,z=a.wrap,F=a.each,H=a.extend,I=a.isArray,w=a.fireEvent,\nh=a.Axis,q=a.Series;H(h.prototype,{isInBreak:function(a,e){var b=a.repeat||Infinity,d=a.from,h=a.to-a.from;e=e>=d?(e-d)%b:b-(d-e)%b;return a.inclusive?e<=h:e<h&&0!==e},isInAnyBreak:function(a,e){var b=this.options.breaks,d=b&&b.length,h,A,l;if(d){for(;d--;)this.isInBreak(b[d],a)&&(h=!0,A||(A=t(b[d].showPoints,this.isXAxis?!1:!0)));l=h&&e?h&&!A:h}return l}});z(h.prototype,\"setTickPositions\",function(a){a.apply(this,Array.prototype.slice.call(arguments,1));if(this.options.breaks){var e=this.tickPositions,\nb=this.tickPositions.info,d=[],h;for(h=0;h<e.length;h++)this.isInAnyBreak(e[h])||d.push(e[h]);this.tickPositions=d;this.tickPositions.info=b}});z(h.prototype,\"init\",function(a,e,b){var d=this;b.breaks&&b.breaks.length&&(b.ordinal=!1);a.call(this,e,b);a=this.options.breaks;d.isBroken=I(a)&&!!a.length;d.isBroken&&(d.val2lin=function(a){var b=a,e,h;for(h=0;h<d.breakArray.length;h++)if(e=d.breakArray[h],e.to<=a)b-=e.len;else if(e.from>=a)break;else if(d.isInBreak(e,a)){b-=a-e.from;break}return b},d.lin2val=\nfunction(a){var b,e;for(e=0;e<d.breakArray.length&&!(b=d.breakArray[e],b.from>=a);e++)b.to<a?a+=b.len:d.isInBreak(b,a)&&(a+=b.len);return a},d.setExtremes=function(a,b,d,e,g){for(;this.isInAnyBreak(a);)a-=this.closestPointRange;for(;this.isInAnyBreak(b);)b-=this.closestPointRange;h.prototype.setExtremes.call(this,a,b,d,e,g)},d.setAxisTranslation=function(a){h.prototype.setAxisTranslation.call(this,a);a=d.options.breaks;var b=[],e=[],p=0,g,r,C=d.userMin||d.min,x=d.userMax||d.max,c=t(d.pointRangePadding,\n0),f,m;F(a,function(f){r=f.repeat||Infinity;d.isInBreak(f,C)&&(C+=f.to%r-C%r);d.isInBreak(f,x)&&(x-=x%r-f.from%r)});F(a,function(c){f=c.from;for(r=c.repeat||Infinity;f-r>C;)f-=r;for(;f<C;)f+=r;for(m=f;m<x;m+=r)b.push({value:m,move:\"in\"}),b.push({value:m+(c.to-c.from),move:\"out\",size:c.breakSize})});b.sort(function(f,n){return f.value===n.value?(\"in\"===f.move?0:1)-(\"in\"===n.move?0:1):f.value-n.value});g=0;f=C;F(b,function(c){g+=\"in\"===c.move?1:-1;1===g&&\"in\"===c.move&&(f=c.value);0===g&&(e.push({from:f,\nto:c.value,len:c.value-f-(c.size||0)}),p+=c.value-f-(c.size||0))});d.breakArray=e;d.unitLength=x-C-p+c;w(d,\"afterBreaks\");d.options.staticScale?d.transA=d.options.staticScale:d.unitLength&&(d.transA*=(x-d.min+c)/d.unitLength);c&&(d.minPixelPadding=d.transA*d.minPointOffset);d.min=C;d.max=x})});z(q.prototype,\"generatePoints\",function(a){a.apply(this,E(arguments));var e=this.xAxis,b=this.yAxis,d=this.points,h,q=d.length,l=this.options.connectNulls,p;if(e&&b&&(e.options.breaks||b.options.breaks))for(;q--;)h=\nd[q],p=null===h.y&&!1===l,p||!e.isInAnyBreak(h.x,!0)&&!b.isInAnyBreak(h.y,!0)||(d.splice(q,1),this.data[q]&&this.data[q].destroyElements())});a.Series.prototype.drawBreaks=function(a,e){var b=this,d=b.points,h,q,l,p;a&&F(e,function(g){h=a.breakArray||[];q=a.isXAxis?a.min:t(b.options.threshold,a.min);F(d,function(b){p=t(b[\"stack\"+g.toUpperCase()],b[g]);F(h,function(g){l=!1;if(q<g.from&&p>g.to||q>g.from&&p<g.from)l=\"pointBreak\";else if(q<g.from&&p>g.from&&p<g.to||q>g.from&&p>g.to&&p<g.from)l=\"pointInBreak\";\nl&&w(a,l,{point:b,brk:g})})})})};a.Series.prototype.gappedPath=function(){var a=this.options.gapSize,e=this.points.slice(),b=e.length-1;if(a&&0<b)for(;b--;)e[b+1].x-e[b].x>this.closestPointRange*a&&e.splice(b+1,0,{isNull:!0});return this.getGraphPath(e)};z(a.seriesTypes.column.prototype,\"drawPoints\",k);z(a.Series.prototype,\"drawPoints\",k)})(K);(function(a){var E=a.arrayMax,k=a.arrayMin,t=a.Axis,z=a.defaultPlotOptions,F=a.defined,H=a.each,I=a.extend,w=a.format,h=a.isNumber,q=a.merge,G=a.pick,e=a.Point,\nb=a.Tooltip,d=a.wrap,u=a.Series.prototype,A=u.processData,l=u.generatePoints,p=u.destroy,g={approximation:\"average\",groupPixelWidth:2,dateTimeLabelFormats:{millisecond:[\"%A, %b %e, %H:%M:%S.%L\",\"%A, %b %e, %H:%M:%S.%L\",\"-%H:%M:%S.%L\"],second:[\"%A, %b %e, %H:%M:%S\",\"%A, %b %e, %H:%M:%S\",\"-%H:%M:%S\"],minute:[\"%A, %b %e, %H:%M\",\"%A, %b %e, %H:%M\",\"-%H:%M\"],hour:[\"%A, %b %e, %H:%M\",\"%A, %b %e, %H:%M\",\"-%H:%M\"],day:[\"%A, %b %e, %Y\",\"%A, %b %e\",\"-%A, %b %e, %Y\"],week:[\"Week from %A, %b %e, %Y\",\"%A, %b %e\",\n\"-%A, %b %e, %Y\"],month:[\"%B %Y\",\"%B\",\"-%B %Y\"],year:[\"%Y\",\"%Y\",\"-%Y\"]}},r={line:{},spline:{},area:{},areaspline:{},column:{approximation:\"sum\",groupPixelWidth:10},arearange:{approximation:\"range\"},areasplinerange:{approximation:\"range\"},columnrange:{approximation:\"range\",groupPixelWidth:10},candlestick:{approximation:\"ohlc\",groupPixelWidth:10},ohlc:{approximation:\"ohlc\",groupPixelWidth:5}},C=a.defaultDataGroupingUnits=[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",\n[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1]],[\"week\",[1]],[\"month\",[1,3,6]],[\"year\",null]],x={sum:function(c){var f=c.length,a;if(!f&&c.hasNulls)a=null;else if(f)for(a=0;f--;)a+=c[f];return a},average:function(c){var f=c.length;c=x.sum(c);h(c)&&f&&(c/=f);return c},averages:function(){var c=[];H(arguments,function(f){c.push(x.average(f))});return c},open:function(c){return c.length?c[0]:c.hasNulls?null:void 0},high:function(c){return c.length?E(c):c.hasNulls?null:void 0},low:function(c){return c.length?\nk(c):c.hasNulls?null:void 0},close:function(c){return c.length?c[c.length-1]:c.hasNulls?null:void 0},ohlc:function(c,f,a,g){c=x.open(c);f=x.high(f);a=x.low(a);g=x.close(g);if(h(c)||h(f)||h(a)||h(g))return[c,f,a,g]},range:function(c,f){c=x.low(c);f=x.high(f);if(h(c)||h(f))return[c,f];if(null===c&&null===f)return null}};u.groupData=function(c,f,a,b){var n=this.data,v=this.options.data,m=[],d=[],B=[],e=c.length,J,M,l=!!f,C=[];b=\"function\"===typeof b?b:x[b]||r[this.type]&&x[r[this.type].approximation]||\nx[g.approximation];var L=this.pointArrayMap,q=L&&L.length,p=0;M=0;var u,k;q?H(L,function(){C.push([])}):C.push([]);u=q||1;for(k=0;k<=e&&!(c[k]>=a[0]);k++);for(k;k<=e;k++){for(;void 0!==a[p+1]&&c[k]>=a[p+1]||k===e;){J=a[p];this.dataGroupInfo={start:M,length:C[0].length};M=b.apply(this,C);void 0!==M&&(m.push(J),d.push(M),B.push(this.dataGroupInfo));M=k;for(J=0;J<u;J++)C[J].length=0,C[J].hasNulls=!1;p+=1;if(k===e)break}if(k===e)break;if(L){J=this.cropStart+k;var G=n&&n[J]||this.pointClass.prototype.applyOptions.apply({series:this},\n[v[J]]),w;for(J=0;J<q;J++)w=G[L[J]],h(w)?C[J].push(w):null===w&&(C[J].hasNulls=!0)}else J=l?f[k]:null,h(J)?C[0].push(J):null===J&&(C[0].hasNulls=!0)}return[m,d,B]};u.processData=function(){var c=this.chart,f=this.options.dataGrouping,a=!1!==this.allowDG&&f&&G(f.enabled,c.options.isStock),g=this.visible||!c.options.chart.ignoreHiddenSeries,n;this.forceCrop=a;this.groupPixelWidth=null;this.hasProcessed=!0;if(!1!==A.apply(this,arguments)&&a){this.destroyGroupedData();var v=this.processedXData,y=this.processedYData,\nb=c.plotSizeX,c=this.xAxis,d=c.options.ordinal,r=this.groupPixelWidth=c.getGroupPixelWidth&&c.getGroupPixelWidth();if(r){this.isDirty=n=!0;this.points=null;var e=c.getExtremes(),a=e.min,e=e.max,d=d&&c.getGroupIntervalFactor(a,e,this)||1,b=r*(e-a)/b*d,r=c.getTimeTicks(c.normalizeTimeTickInterval(b,f.units||C),Math.min(a,v[0]),Math.max(e,v[v.length-1]),c.options.startOfWeek,v,this.closestPointRange),v=u.groupData.apply(this,[v,y,r,f.approximation]),y=v[0],d=v[1];if(f.smoothed){f=y.length-1;for(y[f]=\nMath.min(y[f],e);f--&&0<f;)y[f]+=b/2;y[0]=Math.max(y[0],a)}this.currentDataGrouping=r.info;this.closestPointRange=r.info.totalRange;this.groupMap=v[2];F(y[0])&&y[0]<c.dataMin&&g&&(c.min===c.dataMin&&(c.min=y[0]),c.dataMin=y[0]);this.processedXData=y;this.processedYData=d}else this.currentDataGrouping=this.groupMap=null;this.hasGroupedData=n}};u.destroyGroupedData=function(){var c=this.groupedData;H(c||[],function(f,a){f&&(c[a]=f.destroy?f.destroy():null)});this.groupedData=null};u.generatePoints=\nfunction(){l.apply(this);this.destroyGroupedData();this.groupedData=this.hasGroupedData?this.points:null};d(e.prototype,\"update\",function(c){this.dataGroup?a.error(24):c.apply(this,[].slice.call(arguments,1))});d(b.prototype,\"tooltipFooterHeaderFormatter\",function(c,f,g){var m=f.series,n=m.tooltipOptions,v=m.options.dataGrouping,y=n.xDateFormat,b,d=m.xAxis,r=a.dateFormat;return d&&\"datetime\"===d.options.type&&v&&h(f.key)?(c=m.currentDataGrouping,v=v.dateTimeLabelFormats,c?(d=v[c.unitName],1===c.count?\ny=d[0]:(y=d[1],b=d[2])):!y&&v&&(y=this.getXDateFormat(f,n,d)),y=r(y,f.key),b&&(y+=r(b,f.key+c.totalRange-1)),w(n[(g?\"footer\":\"header\")+\"Format\"],{point:I(f.point,{key:y}),series:m})):c.call(this,f,g)});u.destroy=function(){for(var c=this.groupedData||[],f=c.length;f--;)c[f]&&c[f].destroy();p.apply(this)};d(u,\"setOptions\",function(c,f){c=c.call(this,f);var a=this.type,b=this.chart.options.plotOptions,n=z[a].dataGrouping;r[a]&&(n||(n=q(g,r[a])),c.dataGrouping=q(n,b.series&&b.series.dataGrouping,b[a].dataGrouping,\nf.dataGrouping));this.chart.options.isStock&&(this.requireSorting=!0);return c});d(t.prototype,\"setScale\",function(c){c.call(this);H(this.series,function(c){c.hasProcessed=!1})});t.prototype.getGroupPixelWidth=function(){var c=this.series,a=c.length,g,b=0,n=!1,v;for(g=a;g--;)(v=c[g].options.dataGrouping)&&(b=Math.max(b,v.groupPixelWidth));for(g=a;g--;)(v=c[g].options.dataGrouping)&&c[g].hasProcessed&&(a=(c[g].processedXData||c[g].data).length,c[g].groupPixelWidth||a>this.chart.plotSizeX/b||a&&v.forced)&&\n(n=!0);return n?b:0};t.prototype.setDataGrouping=function(a,f){var c;f=G(f,!0);a||(a={forced:!1,units:null});if(this instanceof t)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else H(this.chart.options.series,function(c){c.dataGrouping=a},!1);f&&this.chart.redraw()}})(K);(function(a){var E=a.each,k=a.Point,t=a.seriesType,z=a.seriesTypes;t(\"ohlc\",\"column\",{lineWidth:1,tooltip:{pointFormat:'\\x3cspan class\\x3d\"highcharts-color-{point.colorIndex}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cb\\x3e {series.name}\\x3c/b\\x3e\\x3cbr/\\x3eOpen: {point.open}\\x3cbr/\\x3eHigh: {point.high}\\x3cbr/\\x3eLow: {point.low}\\x3cbr/\\x3eClose: {point.close}\\x3cbr/\\x3e'},\nthreshold:null},{directTouch:!1,pointArrayMap:[\"open\",\"high\",\"low\",\"close\"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:\"close\",translate:function(){var a=this,k=a.yAxis,t=!!a.modifyValue,w=[\"plotOpen\",\"plotHigh\",\"plotLow\",\"plotClose\",\"yBottom\"];z.column.prototype.translate.apply(a);E(a.points,function(h){E([h.open,h.high,h.low,h.close,h.low],function(q,G){null!==q&&(t&&(q=a.modifyValue(q)),h[w[G]]=k.toPixels(q,!0))});h.tooltipPos[1]=h.plotHigh+k.pos-a.chart.plotTop})},drawPoints:function(){var a=\nthis,k=a.chart;E(a.points,function(t){var w,h,q,G,e=t.graphic,b,d=!e;void 0!==t.plotY&&(e||(t.graphic=e=k.renderer.path().add(a.group)),h=e.strokeWidth()%2/2,b=Math.round(t.plotX)-h,q=Math.round(t.shapeArgs.width/2),G=[\"M\",b,Math.round(t.yBottom),\"L\",b,Math.round(t.plotHigh)],null!==t.open&&(w=Math.round(t.plotOpen)+h,G.push(\"M\",b,w,\"L\",b-q,w)),null!==t.close&&(w=Math.round(t.plotClose)+h,G.push(\"M\",b,w,\"L\",b+q,w)),e[d?\"attr\":\"animate\"]({d:G}).addClass(t.getClassName(),!0))})},animate:null},{getClassName:function(){return k.prototype.getClassName.call(this)+\n(this.open<this.close?\" highcharts-point-up\":\" highcharts-point-down\")}})})(K);(function(a){var E=a.defaultPlotOptions,k=a.each,t=a.merge;a=a.seriesType;a(\"candlestick\",\"ohlc\",t(E.column,{states:{hover:{lineWidth:2}},tooltip:E.ohlc.tooltip,threshold:null}),{drawPoints:function(){var a=this,t=a.chart;k(a.points,function(k){var z=k.graphic,w,h,q,G,e,b,d,u=!z;void 0!==k.plotY&&(z||(k.graphic=z=t.renderer.path().add(a.group)),e=z.strokeWidth()%2/2,b=Math.round(k.plotX)-e,w=k.plotOpen,h=k.plotClose,q=\nMath.min(w,h),w=Math.max(w,h),d=Math.round(k.shapeArgs.width/2),h=Math.round(q)!==Math.round(k.plotHigh),G=w!==k.yBottom,q=Math.round(q)+e,w=Math.round(w)+e,e=[],e.push(\"M\",b-d,w,\"L\",b-d,q,\"L\",b+d,q,\"L\",b+d,w,\"Z\",\"M\",b,q,\"L\",b,h?Math.round(k.plotHigh):q,\"M\",b,w,\"L\",b,G?Math.round(k.yBottom):w),z[u?\"attr\":\"animate\"]({d:e}).addClass(k.getClassName(),!0))})}})})(K);(function(a){var E=a.addEvent,k=a.each,t=a.noop,z=a.seriesType,F=a.seriesTypes,H=a.TrackerMixin,I=a.SVGRenderer.prototype.symbols,w=a.stableSort;\nz(\"flags\",\"column\",{pointRange:0,shape:\"flag\",stackDistance:12,textAlign:\"center\",tooltip:{pointFormat:\"{point.text}\\x3cbr/\\x3e\"},threshold:null,y:-30},{sorted:!1,noSharedTooltip:!0,allowDG:!1,takeOrdinalPosition:!1,trackerGroups:[\"markerGroup\"],forceCrop:!0,init:a.Series.prototype.init,translate:function(){F.column.prototype.translate.apply(this);var a=this.options,q=this.chart,t=this.points,e=t.length-1,b,d,u=a.onSeries;b=u&&q.get(u);var a=a.onKey||\"y\",u=b&&b.options.step,A=b&&b.points,l=A&&A.length,\np=this.xAxis,g=this.yAxis,r=p.getExtremes(),C=0,x,c,f;if(b&&b.visible&&l)for(C=(b.pointXOffset||0)+(b.barW||0)/2,b=b.currentDataGrouping,c=A[l-1].x+(b?b.totalRange:0),w(t,function(a,c){return a.x-c.x}),a=\"plot\"+a[0].toUpperCase()+a.substr(1);l--&&t[e]&&!(b=t[e],x=A[l],x.x<=b.x&&void 0!==x[a]&&(b.x<=c&&(b.plotY=x[a],x.x<b.x&&!u&&(f=A[l+1])&&void 0!==f[a]&&(b.plotY+=(b.x-x.x)/(f.x-x.x)*(f[a]-x[a]))),e--,l++,0>e)););k(t,function(a,c){var n;void 0===a.plotY&&(a.x>=r.min&&a.x<=r.max?a.plotY=q.chartHeight-\np.bottom-(p.opposite?p.height:0)+p.offset-g.top:a.shapeArgs={});a.plotX+=C;(d=t[c-1])&&d.plotX===a.plotX&&(void 0===d.stackIndex&&(d.stackIndex=0),n=d.stackIndex+1);a.stackIndex=n})},drawPoints:function(){var h=this.points,q=this.chart,k=q.renderer,e,b,d=this.options,t=d.y,w,l,p,g,r,C,x,c=this.yAxis;for(l=h.length;l--;)p=h[l],x=p.plotX>this.xAxis.len,e=p.plotX,g=p.stackIndex,w=p.options.shape||d.shape,b=p.plotY,void 0!==b&&(b=p.plotY+t-(void 0!==g&&g*d.stackDistance)),r=g?void 0:p.plotX,C=g?void 0:\np.plotY,g=p.graphic,void 0!==b&&0<=e&&!x?(g||(g=p.graphic=k.label(\"\",null,null,w,null,null,d.useHTML).attr({align:\"flag\"===w?\"left\":\"center\",width:d.width,height:d.height,\"text-align\":d.textAlign}).addClass(\"highcharts-point\").add(this.markerGroup),p.graphic.div&&(p.graphic.div.point=p)),0<e&&(e-=g.strokeWidth()%2),g.attr({text:p.options.title||d.title||\"A\",x:e,y:b,anchorX:r,anchorY:C}),p.tooltipPos=q.inverted?[c.len+c.pos-q.plotLeft-b,this.xAxis.len-e]:[e,b+c.pos-q.plotTop]):g&&(p.graphic=g.destroy());\nd.useHTML&&a.wrap(this.markerGroup,\"on\",function(c){return a.SVGElement.prototype.on.apply(c.apply(this,[].slice.call(arguments,1)),[].slice.call(arguments,1))})},drawTracker:function(){var a=this.points;H.drawTrackerPoint.apply(this);k(a,function(h){var q=h.graphic;q&&E(q.element,\"mouseover\",function(){0<h.stackIndex&&!h.raised&&(h._y=q.y,q.attr({y:h._y-8}),h.raised=!0);k(a,function(a){a!==h&&a.raised&&a.graphic&&(a.graphic.attr({y:a._y}),a.raised=!1)})})})},animate:t,buildKDTree:t,setClip:t});I.flag=\nfunction(a,q,k,e,b){return[\"M\",b&&b.anchorX||a,b&&b.anchorY||q,\"L\",a,q+e,a,q,a+k,q,a+k,q+e,a,q+e,\"Z\"]};k([\"circle\",\"square\"],function(a){I[a+\"pin\"]=function(h,k,e,b,d){var q=d&&d.anchorX;d=d&&d.anchorY;\"circle\"===a&&b>e&&(h-=Math.round((b-e)/2),e=b);h=I[a](h,k,e,b);q&&d&&h.push(\"M\",q,k>d?k:k+b,\"L\",q,d);return h}})})(K);(function(a){function E(a,b,d){this.init(a,b,d)}var k=a.addEvent,t=a.Axis,z=a.correctFloat,F=a.defaultOptions,H=a.defined,I=a.destroyObjectProperties,w=a.doc,h=a.each,q=a.fireEvent,\nG=a.hasTouch,e=a.isTouchDevice,b=a.merge,d=a.pick,u=a.removeEvent,A=a.wrap,l,p={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3};F.scrollbar=b(!0,p,F.scrollbar);a.swapXY=l=function(a,b){var g=a.length,d;if(b)for(b=0;b<g;b+=3)d=a[b+1],a[b+1]=a[b+2],a[b+2]=d;return a};E.prototype={init:function(a,r,e){this.scrollbarButtons=[];this.renderer=a;this.userOptions=r;this.options=b(p,r);this.chart=e;this.size=d(this.options.size,this.options.height);\nr.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,b=this.options,d=this.size,e;this.group=e=a.g(\"scrollbar\").attr({zIndex:b.zIndex,translateY:-99999}).add();this.track=a.rect().addClass(\"highcharts-scrollbar-track\").attr({x:0,r:b.trackBorderRadius||0,height:d,width:d}).add(e);this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(e);this.scrollbar=a.rect().addClass(\"highcharts-scrollbar-thumb\").attr({height:d,\nwidth:d,r:b.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(l([\"M\",-3,d/4,\"L\",-3,2*d/3,\"M\",0,d/4,\"L\",0,2*d/3,\"M\",3,d/4,\"L\",3,2*d/3],b.vertical)).addClass(\"highcharts-scrollbar-rifles\").add(this.scrollbarGroup);this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a,b,d,e){var c=this.options.vertical,f=0,g=\nthis.rendered?\"animate\":\"attr\";this.x=a;this.y=b+this.trackBorderWidth;this.width=d;this.xOffset=this.height=e;this.yOffset=f;c?(this.width=this.yOffset=d=f=this.size,this.xOffset=b=0,this.barWidth=e-2*d,this.x=a+=this.options.margin):(this.height=this.xOffset=e=b=this.size,this.barWidth=d-2*e,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:d,height:e});this.scrollbarButtons[1][g]({translateX:c?0:d-b,translateY:c?e-f:0})},drawScrollbarButton:function(a){var g=\nthis.renderer,b=this.scrollbarButtons,d=this.options,c=this.size,f;f=g.g().add(this.group);b.push(f);f=g.rect().addClass(\"highcharts-scrollbar-button\").add(f);f.attr(f.crisp({x:-.5,y:-.5,width:c+1,height:c+1,r:d.buttonBorderRadius},f.strokeWidth()));g.path(l([\"M\",c/2+(a?-1:1),c/2-3,\"L\",c/2+(a?-1:1),c/2+3,\"L\",c/2+(a?2:-2),c/2],d.vertical)).addClass(\"highcharts-scrollbar-arrow\").add(b[a])},setRange:function(a,b){var g=this.options,d=g.vertical,c=g.minWidth,f=this.barWidth,m,e,n=this.rendered&&!this.hasDragged?\n\"animate\":\"attr\";H(f)&&(a=Math.max(a,0),m=Math.ceil(f*a),this.calculatedWidth=e=z(f*Math.min(b,1)-m),e<c&&(m=(f-c+e)*a,e=c),c=Math.floor(m+this.xOffset+this.yOffset),f=e/2-.5,this.from=a,this.to=b,d?(this.scrollbarGroup[n]({translateY:c}),this.scrollbar[n]({height:e}),this.scrollbarRifles[n]({translateY:f}),this.scrollbarTop=c,this.scrollbarLeft=0):(this.scrollbarGroup[n]({translateX:c}),this.scrollbar[n]({width:e}),this.scrollbarRifles[n]({translateX:f}),this.scrollbarLeft=c,this.scrollbarTop=0),\n12>=e?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===g.showFull&&(0>=a&&1<=b?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),e=a.options.vertical?\"chartY\":\"chartX\",c=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][e]||(d=a.cursorToScrollbarPosition(d)[e],e=a[e],e=d-e,a.hasDragged=!0,a.updatePosition(c[0]+e,c[1]+e),a.hasDragged&&q(a,\"changed\",{from:a.from,to:a.to,\ntrigger:\"scrollbar\",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&q(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b);b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=z(a.to-a.from)*a.options.step;a.updatePosition(z(a.from-\nd),z(a.to-d));q(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);q(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b),e=a.to-a.from,c=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>c||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+e,a.to+e):a.updatePosition(a.from-e,a.to-e);\nq(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a,b){1<b&&(a=z(1-z(b-a)),b=1);0>a&&(b=z(b-a),a=0);this.from=a;this.to=b},update:function(a){this.destroy();this.init(this.chart.renderer,b(!0,this.options,a),this.chart)},addEvents:function(){var a=\nthis.options.inverted?[1,0]:[0,1],b=this.scrollbarButtons,d=this.scrollbarGroup.element,e=this.mouseDownHandler,c=this.mouseMoveHandler,f=this.mouseUpHandler,a=[[b[a[0]].element,\"click\",this.buttonToMinClick],[b[a[1]].element,\"click\",this.buttonToMaxClick],[this.track.element,\"click\",this.trackClick],[d,\"mousedown\",e],[w,\"mousemove\",c],[w,\"mouseup\",f]];G&&a.push([d,\"touchstart\",e],[w,\"touchmove\",c],[w,\"touchend\",f]);h(a,function(a){k.apply(null,a)});this._events=a},removeEvents:function(){h(this._events,\nfunction(a){u.apply(null,a)});this._events.length=0},destroy:function(){var a=this.chart.scroller;this.removeEvents();h([\"track\",\"scrollbarRifles\",\"scrollbar\",\"scrollbarGroup\",\"group\"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&this===a.scrollbar&&(a.scrollbar=null,I(a.scrollbarButtons))}};A(t.prototype,\"init\",function(a){var b=this;a.apply(b,Array.prototype.slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,\nb.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new E(b.chart.renderer,b.options.scrollbar,b.chart),k(b.scrollbar,\"changed\",function(a){var e=Math.min(d(b.options.min,b.min),b.min,b.dataMin),c=Math.max(d(b.options.max,b.max),b.max,b.dataMax)-e,f;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(f=e+c*this.to,e+=c*this.from):(f=e+c*(1-this.from),e+=c*(1-this.to));b.setExtremes(e,f,!0,!1,a)}))});A(t.prototype,\"render\",function(a){var b=Math.min(d(this.options.min,this.min),this.min,this.dataMin),\ne=Math.max(d(this.options.max,this.max),this.max,this.dataMax),g=this.scrollbar,c=this.titleOffset||0;a.apply(this,Array.prototype.slice.call(arguments,1));if(g){this.horiz?(g.position(this.left,this.top+this.height+2+this.chart.scrollbarsOffsets[1]+(this.opposite?0:c+this.axisTitleMargin+this.offset),this.width,this.height),c=1):(g.position(this.left+this.width+2+this.chart.scrollbarsOffsets[0]+(this.opposite?c+this.axisTitleMargin+this.offset:0),this.top,this.width,this.height),c=0);if(!this.opposite&&\n!this.horiz||this.opposite&&this.horiz)this.chart.scrollbarsOffsets[c]+=this.scrollbar.size+this.scrollbar.options.margin;isNaN(b)||isNaN(e)||!H(this.min)||!H(this.max)?g.setRange(0,0):(c=(this.min-b)/(e-b),b=(this.max-b)/(e-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?g.setRange(c,b):g.setRange(1-b,1-c))}});A(t.prototype,\"getOffset\",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,Array.prototype.slice.call(arguments,1));d&&(this.chart.scrollbarsOffsets=[0,0],this.chart.axisOffset[b]+=\nd.size+d.options.margin)});A(t.prototype,\"destroy\",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy());a.apply(this,Array.prototype.slice.call(arguments,1))});a.Scrollbar=E})(K);(function(a){function E(a){this.init(a)}var k=a.addEvent,t=a.Axis,z=a.Chart,F=a.defaultOptions,H=a.defined,I=a.destroyObjectProperties,w=a.doc,h=a.each,q=a.erase,G=a.error,e=a.extend,b=a.grep,d=a.hasTouch,u=a.isNumber,A=a.isObject,l=a.merge,p=a.pick,g=a.removeEvent,r=a.Scrollbar,C=a.Series,x=a.seriesTypes,\nc=a.wrap,f=a.swapXY,m=[].concat(a.defaultDataGroupingUnits),B=function(a){var n=b(arguments,u);if(n.length)return Math[a].apply(0,n)};m[4]=[\"day\",[1,2,3,4]];m[5]=[\"week\",[1,2,3]];e(F,{navigator:{height:40,margin:25,maskInside:!0,series:{type:void 0===x.areaspline?\"line\":\"areaspline\",compare:null,dataGrouping:{approximation:\"average\",enabled:!0,groupPixelWidth:2,smoothed:!0,units:m},dataLabels:{enabled:!1,zIndex:2},id:\"highcharts-navigator-series\",className:\"highcharts-navigator-series\",lineColor:null,\nmarker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:\"highcharts-navigator-xaxis\",tickLength:0,tickPixelInterval:200,labels:{align:\"left\",x:3,y:-4},crosshair:!1},yAxis:{className:\"highcharts-navigator-yaxis\",startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}});E.prototype={drawHandle:function(a,b,c,f){this.handles[b][f](c?{translateX:Math.round(this.left+this.height/2-8),translateY:Math.round(this.top+\nparseInt(a,10)+.5)}:{translateX:Math.round(this.left+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},getHandlePath:function(a){return f([\"M\",-4.5,.5,\"L\",3.5,.5,\"L\",3.5,15.5,\"L\",-4.5,15.5,\"L\",-4.5,.5,\"M\",-1.5,4,\"L\",-1.5,12,\"M\",.5,4,\"L\",.5,12],a)},drawOutline:function(a,b,c,f){var n=this.navigatorOptions.maskInside,d=this.outline.strokeWidth(),v=d/2,d=d%2/2,e=this.outlineHeight,m=this.scrollbarHeight,y=this.size,D=this.left-m,g=this.top;c?(D-=v,c=g+b+d,b=g+a+d,a=[\"M\",D+e,g-m-d,\"L\",\nD+e,c,\"L\",D,c,\"L\",D,b,\"L\",D+e,b,\"L\",D+e,g+y+m].concat(n?[\"M\",D+e,c-v,\"L\",D+e,b+v]:[])):(a+=D+m-d,b+=D+m-d,g+=v,a=[\"M\",D,g,\"L\",a,g,\"L\",a,g+e,\"L\",b,g+e,\"L\",b,g,\"L\",D+y+2*m,g].concat(n?[\"M\",a-v,g,\"L\",b+v,g]:[]));this.outline[f]({d:a})},drawMasks:function(a,b,c,f){var n=this.left,d=this.top,v=this.height,e,m,y,D;c?(y=[n,n,n],D=[d,d+a,d+b],m=[v,v,v],e=[a,b-a,this.size-b]):(y=[n,n+a,n+b],D=[d,d,d],m=[a,b-a,this.size-b],e=[v,v,v]);h(this.shades,function(a,b){a[f]({x:y[b],y:D[b],width:m[b],height:e[b]})})},\nrenderElements:function(){var a=this,b=a.navigatorOptions.maskInside,c=a.chart,f=c.inverted,d=c.renderer,e;a.navigatorGroup=e=d.g(\"navigator\").attr({zIndex:8,visibility:\"hidden\"}).add();h([!b,b,!b],function(b,n){a.shades[n]=d.rect().addClass(\"highcharts-navigator-mask\"+(1===n?\"-inside\":\"-outside\")).add(e)});a.outline=d.path().addClass(\"highcharts-navigator-outline\").add(e);h([0,1],function(b){a.handles[b]=d.path(a.getHandlePath(f)).attr({zIndex:7-b}).addClass(\"highcharts-navigator-handle highcharts-navigator-handle-\"+\n[\"left\",\"right\"][b]).add(e)})},update:function(a){this.destroy();l(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,f){var n=this.chart,d,e,v=this.scrollbarHeight,m,y=this.xAxis;d=y.fake?n.xAxis[0]:y;var g=this.navigatorEnabled,D,B=this.rendered;e=n.inverted;var h=n.xAxis[0].minRange;if(!this.hasDragged||H(c)){if(!u(a)||!u(b))if(B)c=0,f=y.width;else return;this.left=p(y.left,n.plotLeft+v+(e?n.plotWidth:0));this.size=D=m=p(y.len,(e?n.plotHeight:n.plotWidth)-\n2*v);n=e?v:m+2*v;c=p(c,y.toPixels(a,!0));f=p(f,y.toPixels(b,!0));u(c)&&Infinity!==Math.abs(c)||(c=0,f=n);a=y.toValue(c,!0);b=y.toValue(f,!0);if(Math.abs(b-a)<h)if(this.grabbedLeft)c=y.toPixels(b-h,!0);else if(this.grabbedRight)f=y.toPixels(a+h,!0);else return;this.zoomedMax=Math.min(Math.max(c,f,0),D);this.zoomedMin=Math.min(Math.max(this.fixedWidth?this.zoomedMax-this.fixedWidth:Math.min(c,f),0),D);this.range=this.zoomedMax-this.zoomedMin;D=Math.round(this.zoomedMax);c=Math.round(this.zoomedMin);\ng&&(this.navigatorGroup.attr({visibility:\"visible\"}),B=B&&!this.hasDragged?\"animate\":\"attr\",this.drawMasks(c,D,e,B),this.drawOutline(c,D,e,B),this.drawHandle(c,0,e,B),this.drawHandle(D,1,e,B));this.scrollbar&&(e?(e=this.top-v,d=this.left-v+(g||!d.opposite?0:(d.titleOffset||0)+d.axisTitleMargin),v=m+2*v):(e=this.top+(g?this.height:-v),d=this.left-v),this.scrollbar.position(d,e,n,v),this.scrollbar.setRange(this.zoomedMin/m,this.zoomedMax/m));this.rendered=!0}},addMouseEvents:function(){var a=this,b=\na.chart,c=b.container,f=[],e,m;a.mouseMoveHandler=e=function(b){a.onMouseMove(b)};a.mouseUpHandler=m=function(b){a.onMouseUp(b)};f=a.getPartsEvents(\"mousedown\");f.push(k(c,\"mousemove\",e),k(w,\"mouseup\",m));d&&(f.push(k(c,\"touchmove\",e),k(w,\"touchend\",m)),f.concat(a.getPartsEvents(\"touchstart\")));a.eventsToUnbind=f;a.series&&a.series[0]&&f.push(k(a.series[0].xAxis,\"foundExtremes\",function(){b.navigator.modifyNavigatorAxisExtremes()}))},getPartsEvents:function(a){var b=this,c=[];h([\"shades\",\"handles\"],\nfunction(n){h(b[n],function(f,d){c.push(k(f.element,a,function(a){b[n+\"Mousedown\"](a,d)}))})});return c},shadesMousedown:function(a,b){a=this.chart.pointer.normalize(a);var c=this.chart,f=this.xAxis,n=this.zoomedMin,d=this.left,e=this.size,v=this.range,m=a.chartX,g;c.inverted&&(m=a.chartY,d=this.top);1===b?(this.grabbedCenter=m,this.fixedWidth=v,this.dragOffset=m-n):(a=m-d-v/2,0===b?a=Math.max(0,a):2===b&&a+v>=e&&(a=e-v,g=this.getUnionExtremes().dataMax),a!==n&&(this.fixedWidth=v,b=f.toFixedRange(a,\na+v,null,g),c.xAxis[0].setExtremes(Math.min(b.min,b.max),Math.max(b.min,b.max),!0,null,{trigger:\"navigator\"})))},handlesMousedown:function(a,b){this.chart.pointer.normalize(a);a=this.chart;var c=a.xAxis[0],f=a.inverted&&!c.reversed||!a.inverted&&c.reversed;0===b?(this.grabbedLeft=!0,this.otherHandlePos=this.zoomedMax,this.fixedExtreme=f?c.min:c.max):(this.grabbedRight=!0,this.otherHandlePos=this.zoomedMin,this.fixedExtreme=f?c.max:c.min);a.fixedRange=null},onMouseMove:function(a){var b=this,c=b.chart,\nf=b.left,n=b.navigatorSize,d=b.range,e=b.dragOffset,m=c.inverted;a.touches&&0===a.touches[0].pageX||(a=c.pointer.normalize(a),c=a.chartX,m&&(f=b.top,c=a.chartY),b.grabbedLeft?(b.hasDragged=!0,b.render(0,0,c-f,b.otherHandlePos)):b.grabbedRight?(b.hasDragged=!0,b.render(0,0,b.otherHandlePos,c-f)):b.grabbedCenter&&(b.hasDragged=!0,c<e?c=e:c>n+e-d&&(c=n+e-d),b.render(0,0,c-e,c-e+d)),b.hasDragged&&b.scrollbar&&b.scrollbar.options.liveRedraw&&(a.DOMType=a.type,setTimeout(function(){b.onMouseUp(a)},0)))},\nonMouseUp:function(a){var b=this.chart,c=this.xAxis,f=this.scrollbar,n,d,e=a.DOMEvent||a;(!this.hasDragged||f&&f.hasDragged)&&\"scrollbar\"!==a.trigger||(this.zoomedMin===this.otherHandlePos?n=this.fixedExtreme:this.zoomedMax===this.otherHandlePos&&(d=this.fixedExtreme),this.zoomedMax===this.size&&(d=this.getUnionExtremes().dataMax),c=c.toFixedRange(this.zoomedMin,this.zoomedMax,n,d),H(c.min)&&b.xAxis[0].setExtremes(Math.min(c.min,c.max),Math.max(c.min,c.max),!0,this.hasDragged?!1:null,{trigger:\"navigator\",\ntriggerOp:\"navigator-drag\",DOMEvent:e}));\"mousemove\"!==a.DOMType&&(this.grabbedLeft=this.grabbedRight=this.grabbedCenter=this.fixedWidth=this.fixedExtreme=this.otherHandlePos=this.hasDragged=this.dragOffset=null)},removeEvents:function(){this.eventsToUnbind&&(h(this.eventsToUnbind,function(a){a()}),this.eventsToUnbind=void 0);this.removeBaseSeriesEvents()},removeBaseSeriesEvents:function(){var a=this.baseSeries||[];this.navigatorEnabled&&a[0]&&!1!==this.navigatorOptions.adaptToUpdatedData&&(h(a,function(a){g(a,\n\"updatedData\",this.updatedDataHandler)},this),a[0].xAxis&&g(a[0].xAxis,\"foundExtremes\",this.modifyBaseAxisExtremes))},init:function(a){var b=a.options,f=b.navigator,d=f.enabled,e=b.scrollbar,n=e.enabled,b=d?f.height:0,m=n?e.height:0;this.handles=[];this.shades=[];this.chart=a;this.setBaseSeries();this.height=b;this.scrollbarHeight=m;this.scrollbarEnabled=n;this.navigatorEnabled=d;this.navigatorOptions=f;this.scrollbarOptions=e;this.outlineHeight=b+m;this.opposite=p(f.opposite,!d&&a.inverted);var g=\nthis,e=g.baseSeries,n=a.xAxis.length,h=a.yAxis.length,q=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraMargin={type:g.opposite?\"plotTop\":\"marginBottom\",value:(d||!a.inverted?g.outlineHeight:0)+f.margin};a.inverted&&(a.extraMargin.type=g.opposite?\"marginRight\":\"plotLeft\");a.isDirtyBox=!0;g.navigatorEnabled?(g.xAxis=new t(a,l({breaks:q.options.breaks,ordinal:q.options.ordinal},f.xAxis,{id:\"navigator-x-axis\",yAxis:\"navigator-y-axis\",isX:!0,type:\"datetime\",index:n,offset:0,keepOrdinalPadding:!0,startOnTick:!1,\nendOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1},a.inverted?{offsets:[m,0,-m,0],width:b}:{offsets:[0,-m,0,m],height:b})),g.yAxis=new t(a,l(f.yAxis,{id:\"navigator-y-axis\",alignTicks:!1,offset:0,index:h,zoomEnabled:!1},a.inverted?{width:b}:{height:b})),e||f.series.data?g.addBaseSeries():0===a.series.length&&c(a,\"redraw\",function(b,c){0<a.series.length&&!g.series&&(g.setBaseSeries(),a.redraw=b);b.call(a,c)}),g.renderElements(),g.addMouseEvents()):g.xAxis={translate:function(b,c){var f=a.xAxis[0],\nd=f.getExtremes(),e=f.len-2*m,n=B(\"min\",f.options.min,d.dataMin),f=B(\"max\",f.options.max,d.dataMax)-n;return c?b*f/e+n:e*(b-n)/f},toPixels:function(a){return this.translate(a)},toValue:function(a){return this.translate(a,!0)},toFixedRange:t.prototype.toFixedRange,fake:!0};a.options.scrollbar.enabled&&(a.scrollbar=g.scrollbar=new r(a.renderer,l(a.options.scrollbar,{margin:g.navigatorEnabled?0:10,vertical:a.inverted}),a),k(g.scrollbar,\"changed\",function(b){var c=g.size,f=c*this.to,c=c*this.from;g.hasDragged=\ng.scrollbar.hasDragged;g.render(0,0,c,f);(a.options.scrollbar.liveRedraw||\"mousemove\"!==b.DOMType)&&setTimeout(function(){g.onMouseUp(b)})}));g.addBaseSeriesEvents();g.addChartEvents()},getUnionExtremes:function(a){var b=this.chart.xAxis[0],c=this.xAxis,f=c.options,d=b.options,e;a&&null===b.dataMin||(e={dataMin:p(f&&f.min,B(\"min\",d.min,b.dataMin,c.dataMin,c.min)),dataMax:p(f&&f.max,B(\"max\",d.max,b.dataMax,c.dataMax,c.max))});return e},setBaseSeries:function(a){var b=this.chart,c;a=a||b.options&&b.options.navigator.baseSeries||\n0;this.series&&(this.removeBaseSeriesEvents(),h(this.series,function(a){a.destroy()}));c=this.baseSeries=[];h(b.series||[],function(b,f){(b.options.showInNavigator||(f===a||b.options.id===a)&&!1!==b.options.showInNavigator)&&c.push(b)});this.xAxis&&!this.xAxis.fake&&this.addBaseSeries()},addBaseSeries:function(){var a=this,b=a.chart,c=a.series=[],f=a.baseSeries,d,e,m=a.navigatorOptions.series,g,B={enableMouseTracking:!1,index:null,group:\"nav\",padXAxis:!1,xAxis:\"navigator-x-axis\",yAxis:\"navigator-y-axis\",\nshowInLegend:!1,stacking:!1,isInternal:!0,visible:!0};f?h(f,function(f,n){B.name=\"Navigator \"+(n+1);d=f.options||{};g=d.navigatorOptions||{};e=l(d,B,m,g);n=g.data||m.data;a.hasNavigatorData=a.hasNavigatorData||!!n;e.data=n||d.data&&d.data.slice(0);f.navigatorSeries=b.initSeries(e);c.push(f.navigatorSeries)}):(e=l(m,B),e.data=m.data,a.hasNavigatorData=!!e.data,c.push(b.initSeries(e)));this.addBaseSeriesEvents()},addBaseSeriesEvents:function(){var a=this,b=a.baseSeries||[];b[0]&&b[0].xAxis&&k(b[0].xAxis,\n\"foundExtremes\",this.modifyBaseAxisExtremes);!1!==this.navigatorOptions.adaptToUpdatedData&&h(b,function(b){b.xAxis&&k(b,\"updatedData\",this.updatedDataHandler);k(b,\"remove\",function(){this.navigatorSeries&&(q(a.series,this.navigatorSeries),this.navigatorSeries.remove(!1),delete this.navigatorSeries)})},this)},modifyNavigatorAxisExtremes:function(){var a=this.xAxis,b;a.getExtremes&&(!(b=this.getUnionExtremes(!0))||b.dataMin===a.min&&b.dataMax===a.max||(a.min=b.dataMin,a.max=b.dataMax))},modifyBaseAxisExtremes:function(){var a=\nthis.chart.navigator,b=this.getExtremes(),c=b.dataMin,f=b.dataMax,b=b.max-b.min,d=a.stickToMin,e=a.stickToMax,m,g,B=a.series&&a.series[0],h=!!this.setExtremes;this.eventArgs&&\"rangeSelectorButton\"===this.eventArgs.trigger||(d&&(g=c,m=g+b),e&&(m=f,d||(g=Math.max(m-b,B&&B.xData?B.xData[0]:-Number.MAX_VALUE))),h&&(d||e)&&u(g)&&(this.min=this.userMin=g,this.max=this.userMax=m));a.stickToMin=a.stickToMax=null},updatedDataHandler:function(){var a=this.chart.navigator,b=this.navigatorSeries;a.stickToMin=\nu(this.xAxis.min)&&this.xAxis.min<=this.xData[0];a.stickToMax=Math.round(a.zoomedMax)>=Math.round(a.size);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},addChartEvents:function(){k(this.chart,\"redraw\",function(){var a=this.navigator,b=a&&(a.baseSeries&&a.baseSeries[0]&&a.baseSeries[0].xAxis||a.scrollbar&&this.xAxis[0]);b&&a.render(b.min,b.max)})},destroy:function(){this.removeEvents();this.xAxis&&(q(this.chart.xAxis,this.xAxis),q(this.chart.axes,\nthis.xAxis));this.yAxis&&(q(this.chart.yAxis,this.yAxis),q(this.chart.axes,this.yAxis));h(this.series||[],function(a){a.destroy&&a.destroy()});h(\"series xAxis yAxis shades outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered\".split(\" \"),function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);h([this.handles],function(a){I(a)},this)}};a.Navigator=E;c(t.prototype,\"zoom\",function(a,b,c){var f=this.chart,d=f.options,e=d.chart.zoomType,m=d.navigator,\nd=d.rangeSelector,n;this.isXAxis&&(m&&m.enabled||d&&d.enabled)&&(\"x\"===e?f.resetZoomButton=\"blocked\":\"y\"===e?n=!1:\"xy\"===e&&(f=this.previousZoom,H(b)?this.previousZoom=[this.min,this.max]:f&&(b=f[0],c=f[1],delete this.previousZoom)));return void 0!==n?n:a.call(this,b,c)});c(z.prototype,\"init\",function(a,b,c){k(this,\"beforeRender\",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new E(this)});a.call(this,b,c)});c(z.prototype,\"setChartSize\",function(a){var b=\nthis.legend,c=this.navigator,f,d,e,m;a.apply(this,[].slice.call(arguments,1));c&&(d=b.options,e=c.xAxis,m=c.yAxis,f=c.scrollbarHeight,this.inverted?(c.left=c.opposite?this.chartWidth-f-c.height:this.spacing[3]+f,c.top=this.plotTop+f):(c.left=this.plotLeft+f,c.top=c.navigatorOptions.top||this.chartHeight-c.height-f-this.spacing[2]-(\"bottom\"===d.verticalAlign&&d.enabled&&!d.floating?b.legendHeight+p(d.margin,10):0)),e&&m&&(this.inverted?e.options.left=m.options.left=c.left:e.options.top=m.options.top=\nc.top,e.setAxisSize(),m.setAxisSize()))});c(C.prototype,\"addPoint\",function(a,b,c,f,d){var e=this.options.turboThreshold;e&&this.xData.length>e&&A(b,!0)&&this.chart.navigator&&G(20,!0);a.call(this,b,c,f,d)});c(z.prototype,\"addSeries\",function(a,b,c,f){a=a.call(this,b,!1,f);this.navigator&&this.navigator.setBaseSeries();p(c,!0)&&this.redraw();return a});c(C.prototype,\"update\",function(a,b,c){a.call(this,b,!1);this.chart.navigator&&this.chart.navigator.setBaseSeries();p(c,!0)&&this.chart.redraw()});\nz.prototype.callbacks.push(function(a){var b=a.navigator;b&&(a=a.xAxis[0].getExtremes(),b.render(a.min,a.max))})})(K);(function(a){function E(a){this.init(a)}var k=a.addEvent,t=a.Axis,z=a.Chart,F=a.css,H=a.createElement,I=a.dateFormat,w=a.defaultOptions,h=w.global.useUTC,q=a.defined,G=a.destroyObjectProperties,e=a.discardElement,b=a.each,d=a.extend,u=a.fireEvent,A=a.Date,l=a.isNumber,p=a.merge,g=a.pick,r=a.pInt,C=a.splat,x=a.wrap;d(w,{rangeSelector:{buttonTheme:{\"stroke-width\":0,width:28,height:18,\npadding:2,zIndex:7},height:35,inputPosition:{align:\"right\"}}});w.lang=p(w.lang,{rangeSelectorZoom:\"Zoom\",rangeSelectorFrom:\"From\",rangeSelectorTo:\"To\"});E.prototype={clickButton:function(a,f){var c=this,d=c.chart,e=c.buttonOptions[a],v=d.xAxis[0],y=d.scroller&&d.scroller.getUnionExtremes()||v||{},D=y.dataMin,q=y.dataMax,p,r=v&&Math.round(Math.min(v.max,g(q,v.max))),u=e.type,w,y=e._range,x,L,z,A=e.dataGrouping;if(null!==D&&null!==q){d.fixedRange=y;A&&(this.forcedDataGrouping=!0,t.prototype.setDataGrouping.call(v||\n{chart:this.chart},A,!1));if(\"month\"===u||\"year\"===u)v?(u={range:e,max:r,dataMin:D,dataMax:q},p=v.minFromRange.call(u),l(u.newMax)&&(r=u.newMax)):y=e;else if(y)p=Math.max(r-y,D),r=Math.min(p+y,q);else if(\"ytd\"===u)if(v)void 0===q&&(D=Number.MAX_VALUE,q=Number.MIN_VALUE,b(d.series,function(a){a=a.xData;D=Math.min(a[0],D);q=Math.max(a[a.length-1],q)}),f=!1),r=c.getYTDExtremes(q,D,h),p=x=r.min,r=r.max;else{k(d,\"beforeRender\",function(){c.clickButton(a)});return}else\"all\"===u&&v&&(p=D,r=q);c.setSelected(a);\nv?v.setExtremes(p,r,g(f,1),null,{trigger:\"rangeSelectorButton\",rangeSelectorButton:e}):(w=C(d.options.xAxis)[0],z=w.range,w.range=y,L=w.min,w.min=x,k(d,\"load\",function(){w.range=z;w.min=L}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:\"month\",count:1,text:\"1m\"},{type:\"month\",count:3,text:\"3m\"},{type:\"month\",count:6,text:\"6m\"},{type:\"ytd\",text:\"YTD\"},{type:\"year\",count:1,text:\"1y\"},{type:\"all\",text:\"All\"}],init:function(a){var c=this,d=a.options.rangeSelector,\ne=d.buttons||[].concat(c.defaultButtons),g=d.selected,h=function(){var a=c.minInput,b=c.maxInput;a&&a.blur&&u(a,\"blur\");b&&b.blur&&u(b,\"blur\")};c.chart=a;c.options=d;c.buttons=[];a.extraTopMargin=d.height;c.buttonOptions=e;this.unMouseDown=k(a.container,\"mousedown\",h);this.unResize=k(a,\"resize\",h);b(e,c.computeButtonRange);void 0!==g&&e[g]&&this.clickButton(g,!1);k(a,\"load\",function(){k(a.xAxis[0],\"setExtremes\",function(b){this.max-this.min!==a.fixedRange&&\"rangeSelectorButton\"!==b.trigger&&\"updatedData\"!==\nb.trigger&&c.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,f=a.xAxis[0],d=Math.round(f.max-f.min),e=!f.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||f,g=a.dataMin,v=a.dataMax,a=this.getYTDExtremes(v,g,h),q=a.min,k=a.max,p=this.selected,r=l(p),u=this.options.allButtonsEnabled,t=this.buttons;b(this.buttonOptions,function(a,b){var c=a._range,m=a.type,n=a.count||1;a=t[b];var h=0;b=b===p;var B=c>v-g,l=c<f.minRange,D=!1,y=!1,c=c===d;\n(\"month\"===m||\"year\"===m)&&d>=864E5*{month:28,year:365}[m]*n&&d<=864E5*{month:31,year:366}[m]*n?c=!0:\"ytd\"===m?(c=k-q===d,D=!b):\"all\"===m&&(c=f.max-f.min>=v-g,y=!b&&r&&c);m=!u&&(B||l||y||e);c=b&&c||c&&!r&&!D;m?h=3:c&&(r=!0,h=2);a.state!==h&&a.setState(h)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if(\"month\"===b||\"year\"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,\nb){var c=this.chart.options.rangeSelector,f=this[a+\"Input\"];q(b)&&(f.previousValue=f.HCTime,f.HCTime=b);f.value=I(c.inputEditDateFormat||\"%Y-%m-%d\",f.HCTime);this[a+\"DateBox\"].attr({text:I(c.inputDateFormat||\"%b %e, %Y\",f.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+\"DateBox\"];F(this[a+\"Input\"],{left:b.translateX+c.x+\"px\",top:b.translateY+\"px\",width:c.width-2+\"px\",height:c.height-2+\"px\",border:\"2px solid silver\"})},hideInput:function(a){F(this[a+\"Input\"],{border:0,width:\"1px\",height:\"1px\"});\nthis.setInputValue(a)},drawInput:function(a){function b(){var a=p.value,b=(g.inputDateParser||Date.parse)(a),f=d.xAxis[0],e=d.scroller&&d.scroller.xAxis?d.scroller.xAxis:f,m=e.dataMin,e=e.dataMax;b!==p.previousValue&&(p.previousValue=b,l(b)||(b=a.split(\"-\"),b=Date.UTC(r(b[0]),r(b[1])-1,r(b[2]))),l(b)&&(h||(b+=6E4*(new Date).getTimezoneOffset()),k?b>c.maxInput.HCTime?b=void 0:b<m&&(b=m):b<c.minInput.HCTime?b=void 0:b>e&&(b=e),void 0!==b&&f.setExtremes(k?b:f.min,k?f.max:b,void 0,void 0,{trigger:\"rangeSelectorInput\"})))}\nvar c=this,d=c.chart,e=d.renderer,g=d.options.rangeSelector,q=c.div,k=\"min\"===a,p,u,t=this.inputGroup;this[a+\"Label\"]=u=e.label(w.lang[k?\"rangeSelectorFrom\":\"rangeSelectorTo\"],this.inputGroup.offset).addClass(\"highcharts-range-label\").attr({padding:2}).add(t);t.offset+=u.width+5;this[a+\"DateBox\"]=e=e.label(\"\",t.offset).addClass(\"highcharts-range-input\").attr({padding:2,width:g.inputBoxWidth||90,height:g.inputBoxHeight||17,stroke:g.inputBoxBorderColor||\"#cccccc\",\"stroke-width\":1,\"text-align\":\"center\"}).on(\"click\",\nfunction(){c.showInput(a);c[a+\"Input\"].focus()}).add(t);t.offset+=e.width+(k?10:0);this[a+\"Input\"]=p=H(\"input\",{name:a,className:\"highcharts-range-selector\",type:\"text\"},{top:d.plotTop+\"px\"},q);p.onfocus=function(){c.showInput(a)};p.onblur=function(){c.hideInput(a)};p.onchange=b;p.onkeypress=function(a){13===a.keyCode&&b()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=g((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,\nb,d){var c=new A(a),f=c[A.hcGetFullYear]();d=d?A.UTC(f,0,1):+new A(f,0,1);b=Math.max(b||0,d);c=c.getTime();return{max:Math.min(a||c,c),min:b}},render:function(a,f){var c=this,e=c.chart,n=e.renderer,h=e.container,l=e.options,k=l.exporting&&!1!==l.exporting.enabled&&l.navigation&&l.navigation.buttonOptions,p=l.rangeSelector,r=c.buttons,l=w.lang,t=c.div,t=c.inputGroup,u=p.buttonTheme,x=p.buttonPosition||{},z=p.inputEnabled,A=u&&u.states,C=e.plotLeft,E,G=this.getPosition(),F=c.group,I=c.rendered;!1!==\np.enabled&&(I||(c.group=F=n.g(\"range-selector-buttons\").add(),c.zoomText=n.text(l.rangeSelectorZoom,g(x.x,C),15).css(p.labelStyle).add(F),E=g(x.x,C)+c.zoomText.getBBox().width+5,b(c.buttonOptions,function(a,b){r[b]=n.button(a.text,E,0,function(){c.clickButton(b);c.isActive=!0},u,A&&A.hover,A&&A.select,A&&A.disabled).attr({\"text-align\":\"center\"}).add(F);E+=r[b].width+g(p.buttonSpacing,5)}),!1!==z&&(c.div=t=H(\"div\",null,{position:\"relative\",height:0,zIndex:1}),h.parentNode.insertBefore(t,h),c.inputGroup=\nt=n.g(\"input-group\").add(),t.offset=0,c.drawInput(\"min\"),c.drawInput(\"max\"))),c.updateButtonStates(),F[I?\"animate\":\"attr\"]({translateY:G.buttonTop}),!1!==z&&(t.align(d({y:G.inputTop,width:t.offset,x:k&&G.inputTop<(k.y||0)+k.height-e.spacing[0]?-40:0},p.inputPosition),!0,e.spacingBox),q(z)||(e=F.getBBox(),t[t.alignAttr.translateX<e.x+e.width+10?\"hide\":\"show\"]()),c.setInputValue(\"min\",a),c.setInputValue(\"max\",f)),c.rendered=!0)},update:function(a){var b=this.chart;p(!0,b.options.rangeSelector,a);this.destroy();\nthis.init(b)},destroy:function(){var b=this,f=b.minInput,d=b.maxInput;b.unMouseDown();b.unResize();G(b.buttons);f&&(f.onfocus=f.onblur=f.onchange=null);d&&(d.onfocus=d.onblur=d.onchange=null);a.objectEach(b,function(a,c){a&&\"chart\"!==c&&(a.destroy?a.destroy():a.nodeType&&e(this[c]));a!==E.prototype[c]&&(b[c]=null)},this)}};t.prototype.toFixedRange=function(a,b,d,e){var c=this.chart&&this.chart.fixedRange;a=g(d,this.translate(a,!0,!this.horiz));b=g(e,this.translate(b,!0,!this.horiz));d=c&&(b-a)/c;\n.7<d&&1.3>d&&(e?a=b-c:b=a+c);l(a)||(a=b=void 0);return{min:a,max:b}};t.prototype.minFromRange=function(){var a=this.range,b={month:\"Month\",year:\"FullYear\"}[a.type],d,e=this.max,n,h,p=function(a,c){var d=new Date(a),f=d[\"get\"+b]();d[\"set\"+b](f+c);f===d[\"get\"+b]()&&d.setDate(0);return d.getTime()-a};l(a)?(d=e-a,h=a):(d=e+p(e,-a.count),this.chart&&(this.chart.fixedRange=e-d));n=g(this.dataMin,Number.MIN_VALUE);l(d)||(d=n);d<=n&&(d=n,void 0===h&&(h=p(d,a.count)),this.newMax=Math.min(d+h,this.dataMax));\nl(e)||(d=void 0);return d};x(z.prototype,\"init\",function(a,b,d){k(this,\"init\",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new E(this))});a.call(this,b,d)});z.prototype.callbacks.push(function(a){function b(){c=a.xAxis[0].getExtremes();l(c.min)&&d.render(c.min,c.max)}var c,d=a.rangeSelector,e,g;d&&(g=k(a.xAxis[0],\"afterSetExtremes\",function(a){d.render(a.min,a.max)}),e=k(a,\"redraw\",b),b());k(a,\"destroy\",function(){d&&(e(),g())})});a.RangeSelector=E})(K);(function(a){var E=a.arrayMax,\nk=a.arrayMin,t=a.Axis,z=a.Chart,F=a.defined,H=a.each,I=a.format,w=a.grep,h=a.inArray,q=a.isNumber,G=a.isString,e=a.map,b=a.merge,d=a.pick,u=a.Point,A=a.Series,l=a.splat,p=a.SVGRenderer,g=a.wrap,r=A.prototype,C=r.init,x=r.processData,c=u.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,g,h){var f=G(c)||c.nodeName,m=arguments[f?1:0],p=m.series,k=a.getOptions(),q,r=d(m.navigator&&m.navigator.enabled,k.navigator.enabled,!0),t=r?{startOnTick:!1,endOnTick:!1}:null,B={marker:{enabled:!1,radius:2}},\nu={shadow:!1,borderWidth:0};m.xAxis=e(l(m.xAxis||{}),function(a){return b({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:\"justify\"},showLastLabel:!0},k.xAxis,a,{type:\"datetime\",categories:null},t)});m.yAxis=e(l(m.yAxis||{}),function(a){q=d(a.opposite,!0);return b({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},k.yAxis,a)});m.series=null;m=b({chart:{panning:!0,pinchType:\"x\"},navigator:{enabled:r},scrollbar:{enabled:d(k.scrollbar.enabled,!0)},rangeSelector:{enabled:d(k.rangeSelector.enabled,\n!0)},title:{text:null},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:B,spline:B,area:B,areaspline:B,arearange:B,areasplinerange:B,column:u,columnrange:u,candlestick:u,ohlc:u}},m,{isStock:!0});m.series=p;return f?new z(c,m,h):new z(m,g)};g(t.prototype,\"autoLabelAlign\",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options.isStock&&\"yAxis\"===this.coll&&(c=c.top+\",\"+c.height,!b[c]&&d.enabled)?(15===d.x&&\n(d.x=0),void 0===d.align&&(d.align=\"right\"),b[c]=this,\"right\"):a.call(this,[].slice.call(arguments,1))});g(t.prototype,\"destroy\",function(a){var b=this.chart,c=this.options&&this.options.top+\",\"+this.options.height;c&&b._labelPanes&&b._labelPanes[c]===this&&delete b._labelPanes[c];return a.call(this,Array.prototype.slice.call(arguments,1))});g(t.prototype,\"getPlotLinePath\",function(b,c,g,n,l,p){var f=this,m=this.isLinked&&!this.series?this.linkedParent.series:this.series,k=f.chart,r=k.renderer,t=\nf.left,v=f.top,u,B,y,w,x=[],A=[],z,C;if(\"xAxis\"!==f.coll&&\"yAxis\"!==f.coll)return b.apply(this,[].slice.call(arguments,1));A=function(a){var b=\"xAxis\"===a?\"yAxis\":\"xAxis\";a=f.options[b];return q(a)?[k[b][a]]:G(a)?[k.get(a)]:e(m,function(a){return a[b]})}(f.coll);H(f.isXAxis?k.yAxis:k.xAxis,function(a){if(F(a.options.id)?-1===a.options.id.indexOf(\"navigator\"):1){var b=a.isXAxis?\"yAxis\":\"xAxis\",b=F(a.options[b])?k[b][a.options[b]]:k[b][0];f===b&&A.push(a)}});z=A.length?[]:[f.isXAxis?k.yAxis[0]:k.xAxis[0]];\nH(A,function(b){-1!==h(b,z)||a.find(z,function(a){return a.pos===b.pos&&a.len&&b.len})||z.push(b)});C=d(p,f.translate(c,null,null,n));q(C)&&(f.horiz?H(z,function(a){var b;B=a.pos;w=B+a.len;u=y=Math.round(C+f.transB);if(u<t||u>t+f.width)l?u=y=Math.min(Math.max(t,u),t+f.width):b=!0;b||x.push(\"M\",u,B,\"L\",y,w)}):H(z,function(a){var b;u=a.pos;y=u+a.len;B=w=Math.round(v+f.height-C);if(B<v||B>v+f.height)l?B=w=Math.min(Math.max(v,B),f.top+f.height):b=!0;b||x.push(\"M\",u,B,\"L\",y,w)}));return 0<x.length?r.crispPolyLine(x,\ng||1):null});t.prototype.getPlotBandPath=function(a,b){b=this.getPlotLinePath(b,null,null,!0);a=this.getPlotLinePath(a,null,null,!0);var c=[],d;if(a&&b)if(a.toString()===b.toString())c=a,c.flat=!0;else for(d=0;d<a.length;d+=6)c.push(\"M\",a[d+1],a[d+2],\"L\",a[d+4],a[d+5],b[d+4],b[d+5],b[d+1],b[d+2],\"z\");else c=null;return c};p.prototype.crispPolyLine=function(a,b){var c;for(c=0;c<a.length;c+=6)a[c+1]===a[c+4]&&(a[c+1]=a[c+4]=Math.round(a[c+1])-b%2/2),a[c+2]===a[c+5]&&(a[c+2]=a[c+5]=Math.round(a[c+2])+\nb%2/2);return a};g(t.prototype,\"hideCrosshair\",function(a,b){a.call(this,b);this.crossLabel&&(this.crossLabel=this.crossLabel.hide())});g(t.prototype,\"drawCrosshair\",function(a,b,c){var e,f;a.call(this,b,c);if(F(this.crosshair.label)&&this.crosshair.label.enabled&&this.cross){a=this.chart;var g=this.options.crosshair.label,h=this.horiz;e=this.opposite;f=this.left;var m=this.top,k=this.crossLabel,l,p=g.format,q=\"\",t=\"inside\"===this.options.tickPosition,r=!1!==this.crosshair.snap,u=0;b||(b=this.cross&&\nthis.cross.e);l=h?\"center\":e?\"right\"===this.labelAlign?\"right\":\"left\":\"left\"===this.labelAlign?\"left\":\"center\";k||(k=this.crossLabel=a.renderer.label(null,null,null,g.shape||\"callout\").addClass(\"highcharts-crosshair-label\"+(this.series[0]&&\" highcharts-color-\"+this.series[0].colorIndex)).attr({align:g.align||l,padding:d(g.padding,8),r:d(g.borderRadius,3),zIndex:2}).add(this.labelGroup));h?(l=r?c.plotX+f:b.chartX,m+=e?0:this.height):(l=e?this.width+f:0,m=r?c.plotY+m:b.chartY);p||g.formatter||(this.isDatetimeAxis&&\n(q=\"%b %d, %Y\"),p=\"{value\"+(q?\":\"+q:\"\")+\"}\");b=r?c[this.isXAxis?\"x\":\"y\"]:this.toValue(h?b.chartX:b.chartY);k.attr({text:p?I(p,{value:b}):g.formatter.call(this,b),x:l,y:m,visibility:\"visible\"});b=k.getBBox();if(h){if(t&&!e||!t&&e)m=k.y-b.height}else m=k.y-b.height/2;h?(e=f-b.x,f=f+this.width-b.x):(e=\"left\"===this.labelAlign?f:0,f=\"right\"===this.labelAlign?f+this.width:a.chartWidth);k.translateX<e&&(u=e-k.translateX);k.translateX+b.width>=f&&(u=-(k.translateX+b.width-f));k.attr({x:l+u,y:m,anchorX:h?\nl:this.opposite?0:a.chartWidth,anchorY:h?this.opposite?a.chartHeight:0:m+b.height/2})}});r.init=function(){C.apply(this,arguments);this.setCompare(this.options.compare)};r.setCompare=function(a){this.modifyValue=\"value\"===a||\"percent\"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b=\"value\"===a?b-d:b/d*100-(100===this.options.compareBase?0:100),c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};r.processData=function(){var a,b=\n-1,c,d,e,g;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=h(\"close\",this.pointArrayMap),-1===b&&(b=h(this.pointValKey||\"y\",this.pointArrayMap))),a=0;a<e-1;a++)if(g=d[a]&&-1<b?d[a][b]:d[a],q(g)&&c[a+1]>=this.xAxis.min&&0!==g){this.compareValue=g;break}};g(r,\"getExtremes\",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],\nthis.dataMin=k(b),this.dataMax=E(b))});t.prototype.setCompare=function(a,b){this.isXAxis||(H(this.series,function(b){b.setCompare(a)}),d(b,!0)&&this.chart.redraw())};u.prototype.tooltipFormatter=function(b){b=b.replace(\"{point.change}\",(0<this.change?\"+\":\"\")+a.numberFormat(this.change,d(this.series.tooltipOptions.changeDecimals,2)));return c.apply(this,[b])};g(A.prototype,\"render\",function(a){this.chart.is3d&&this.chart.is3d()||this.chart.polar||!this.xAxis||this.xAxis.isRadial||(!this.clipBox&&this.animate?\n(this.clipBox=b(this.chart.clipBox),this.clipBox.width=this.xAxis.len,this.clipBox.height=this.yAxis.len):this.chart[this.sharedClipKey]?this.chart[this.sharedClipKey].attr({width:this.xAxis.len,height:this.yAxis.len}):this.clipBox&&(this.clipBox.width=this.xAxis.len,this.clipBox.height=this.yAxis.len));a.call(this)});g(z.prototype,\"getSelectedPoints\",function(a){var b=a.call(this);H(this.series,function(a){a.hasGroupedData&&(b=b.concat(w(a.points||[],function(a){return a.selected})))});return b});\ng(z.prototype,\"update\",function(a,c){\"scrollbar\"in c&&this.navigator&&(b(!0,this.options.scrollbar,c.scrollbar),this.navigator.update({},!1),delete c.scrollbar);return a.apply(this,Array.prototype.slice.call(arguments,1))})})(K)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/stock.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Highstock as a plugin for Highcharts\n *\n * (c) 2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            css = H.css,\n            dateFormat = H.dateFormat,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            noop = H.noop,\n            Series = H.Series,\n            timeUnits = H.timeUnits,\n            wrap = H.wrap;\n\n        /* ****************************************************************************\n         * Start ordinal axis logic                                                   *\n         *****************************************************************************/\n\n\n        wrap(Series.prototype, 'init', function(proceed) {\n            var series = this,\n                xAxis;\n\n            // call the original function\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n            xAxis = series.xAxis;\n\n            // Destroy the extended ordinal index on updated data\n            if (xAxis && xAxis.options.ordinal) {\n                addEvent(series, 'updatedData', function() {\n                    delete xAxis.ordinalIndex;\n                });\n            }\n        });\n\n        /**\n         * In an ordinal axis, there might be areas with dense consentrations of points, then large\n         * gaps between some. Creating equally distributed ticks over this entire range\n         * may lead to a huge number of ticks that will later be removed. So instead, break the\n         * positions up in segments, find the tick positions for each segment then concatenize them.\n         * This method is used from both data grouping logic and X axis tick position logic.\n         */\n        wrap(Axis.prototype, 'getTimeTicks', function(proceed, normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {\n\n            var start = 0,\n                end,\n                segmentPositions,\n                higherRanks = {},\n                hasCrossedHigherRank,\n                info,\n                posLength,\n                outsideMax,\n                groupPositions = [],\n                lastGroupPosition = -Number.MAX_VALUE,\n                tickPixelIntervalOption = this.options.tickPixelInterval;\n\n            // The positions are not always defined, for example for ordinal positions when data\n            // has regular interval (#1557, #2090)\n            if ((!this.options.ordinal && !this.options.breaks) || !positions || positions.length < 3 || min === undefined) {\n                return proceed.call(this, normalizedInterval, min, max, startOfWeek);\n            }\n\n            // Analyze the positions array to split it into segments on gaps larger than 5 times\n            // the closest distance. The closest distance is already found at this point, so\n            // we reuse that instead of computing it again.\n            posLength = positions.length;\n\n            for (end = 0; end < posLength; end++) {\n\n                outsideMax = end && positions[end - 1] > max;\n\n                if (positions[end] < min) { // Set the last position before min\n                    start = end;\n                }\n\n                if (end === posLength - 1 || positions[end + 1] - positions[end] > closestDistance * 5 || outsideMax) {\n\n                    // For each segment, calculate the tick positions from the getTimeTicks utility\n                    // function. The interval will be the same regardless of how long the segment is.\n                    if (positions[end] > lastGroupPosition) { // #1475\n\n                        segmentPositions = proceed.call(this, normalizedInterval, positions[start], positions[end], startOfWeek);\n\n                        // Prevent duplicate groups, for example for multiple segments within one larger time frame (#1475)\n                        while (segmentPositions.length && segmentPositions[0] <= lastGroupPosition) {\n                            segmentPositions.shift();\n                        }\n                        if (segmentPositions.length) {\n                            lastGroupPosition = segmentPositions[segmentPositions.length - 1];\n                        }\n\n                        groupPositions = groupPositions.concat(segmentPositions);\n                    }\n                    // Set start of next segment\n                    start = end + 1;\n                }\n\n                if (outsideMax) {\n                    break;\n                }\n            }\n\n            // Get the grouping info from the last of the segments. The info is the same for\n            // all segments.\n            info = segmentPositions.info;\n\n            // Optionally identify ticks with higher rank, for example when the ticks\n            // have crossed midnight.\n            if (findHigherRanks && info.unitRange <= timeUnits.hour) {\n                end = groupPositions.length - 1;\n\n                // Compare points two by two\n                for (start = 1; start < end; start++) {\n                    if (dateFormat('%d', groupPositions[start]) !== dateFormat('%d', groupPositions[start - 1])) {\n                        higherRanks[groupPositions[start]] = 'day';\n                        hasCrossedHigherRank = true;\n                    }\n                }\n\n                // If the complete array has crossed midnight, we want to mark the first\n                // positions also as higher rank\n                if (hasCrossedHigherRank) {\n                    higherRanks[groupPositions[0]] = 'day';\n                }\n                info.higherRanks = higherRanks;\n            }\n\n            // Save the info\n            groupPositions.info = info;\n\n\n\n            // Don't show ticks within a gap in the ordinal axis, where the space between\n            // two points is greater than a portion of the tick pixel interval\n            if (findHigherRanks && defined(tickPixelIntervalOption)) { // check for squashed ticks\n\n                var length = groupPositions.length,\n                    i = length,\n                    itemToRemove,\n                    translated,\n                    translatedArr = [],\n                    lastTranslated,\n                    medianDistance,\n                    distance,\n                    distances = [];\n\n                // Find median pixel distance in order to keep a reasonably even distance between\n                // ticks (#748)\n                while (i--) {\n                    translated = this.translate(groupPositions[i]);\n                    if (lastTranslated) {\n                        distances[i] = lastTranslated - translated;\n                    }\n                    translatedArr[i] = lastTranslated = translated;\n                }\n                distances.sort();\n                medianDistance = distances[Math.floor(distances.length / 2)];\n                if (medianDistance < tickPixelIntervalOption * 0.6) {\n                    medianDistance = null;\n                }\n\n                // Now loop over again and remove ticks where needed\n                i = groupPositions[length - 1] > max ? length - 1 : length; // #817\n                lastTranslated = undefined;\n                while (i--) {\n                    translated = translatedArr[i];\n                    distance = Math.abs(lastTranslated - translated);\n                    // #4175 - when axis is reversed, the distance, is negative but \n                    // tickPixelIntervalOption positive, so we need to compare the same values\n\n                    // Remove ticks that are closer than 0.6 times the pixel interval from the one to the right,\n                    // but not if it is close to the median distance (#748).\n                    if (lastTranslated && distance < tickPixelIntervalOption * 0.8 &&\n                        (medianDistance === null || distance < medianDistance * 0.8)) {\n\n                        // Is this a higher ranked position with a normal position to the right?\n                        if (higherRanks[groupPositions[i]] && !higherRanks[groupPositions[i + 1]]) {\n\n                            // Yes: remove the lower ranked neighbour to the right\n                            itemToRemove = i + 1;\n                            lastTranslated = translated; // #709\n\n                        } else {\n\n                            // No: remove this one\n                            itemToRemove = i;\n                        }\n\n                        groupPositions.splice(itemToRemove, 1);\n\n                    } else {\n                        lastTranslated = translated;\n                    }\n                }\n            }\n            return groupPositions;\n        });\n\n        // Extend the Axis prototype\n        extend(Axis.prototype, /** @lends Axis.prototype */ {\n\n            /**\n             * Calculate the ordinal positions before tick positions are calculated.\n             */\n            beforeSetTickPositions: function() {\n                var axis = this,\n                    len,\n                    ordinalPositions = [],\n                    useOrdinal = false,\n                    dist,\n                    extremes = axis.getExtremes(),\n                    min = extremes.min,\n                    max = extremes.max,\n                    minIndex,\n                    maxIndex,\n                    slope,\n                    hasBreaks = axis.isXAxis && !!axis.options.breaks,\n                    isOrdinal = axis.options.ordinal,\n                    ignoreHiddenSeries = axis.chart.options.chart.ignoreHiddenSeries,\n                    i;\n\n                // apply the ordinal logic\n                if (isOrdinal || hasBreaks) { // #4167 YAxis is never ordinal ?\n\n                    each(axis.series, function(series, i) {\n\n                        if ((!ignoreHiddenSeries || series.visible !== false) && (series.takeOrdinalPosition !== false || hasBreaks)) {\n\n                            // concatenate the processed X data into the existing positions, or the empty array\n                            ordinalPositions = ordinalPositions.concat(series.processedXData);\n                            len = ordinalPositions.length;\n\n                            // remove duplicates (#1588)\n                            ordinalPositions.sort(function(a, b) {\n                                return a - b; // without a custom function it is sorted as strings\n                            });\n\n                            if (len) {\n                                i = len - 1;\n                                while (i--) {\n                                    if (ordinalPositions[i] === ordinalPositions[i + 1]) {\n                                        ordinalPositions.splice(i, 1);\n                                    }\n                                }\n                            }\n                        }\n\n                    });\n\n                    // cache the length\n                    len = ordinalPositions.length;\n\n                    // Check if we really need the overhead of mapping axis data against the ordinal positions.\n                    // If the series consist of evenly spaced data any way, we don't need any ordinal logic.\n                    if (len > 2) { // two points have equal distance by default\n                        dist = ordinalPositions[1] - ordinalPositions[0];\n                        i = len - 1;\n                        while (i-- && !useOrdinal) {\n                            if (ordinalPositions[i + 1] - ordinalPositions[i] !== dist) {\n                                useOrdinal = true;\n                            }\n                        }\n\n                        // When zooming in on a week, prevent axis padding for weekends even though the data within\n                        // the week is evenly spaced.\n                        if (!axis.options.keepOrdinalPadding && (ordinalPositions[0] - min > dist || max - ordinalPositions[ordinalPositions.length - 1] > dist)) {\n                            useOrdinal = true;\n                        }\n                    }\n\n                    // Record the slope and offset to compute the linear values from the array index.\n                    // Since the ordinal positions may exceed the current range, get the start and\n                    // end positions within it (#719, #665b)\n                    if (useOrdinal) {\n\n                        // Register\n                        axis.ordinalPositions = ordinalPositions;\n\n                        // This relies on the ordinalPositions being set. Use Math.max\n                        // and Math.min to prevent padding on either sides of the data.\n                        minIndex = axis.ordinal2lin( // #5979\n                            Math.max(\n                                min,\n                                ordinalPositions[0]\n                            ),\n                            true\n                        );\n                        maxIndex = Math.max(axis.ordinal2lin(\n                            Math.min(\n                                max,\n                                ordinalPositions[ordinalPositions.length - 1]\n                            ),\n                            true\n                        ), 1); // #3339\n\n                        // Set the slope and offset of the values compared to the indices in the ordinal positions\n                        axis.ordinalSlope = slope = (max - min) / (maxIndex - minIndex);\n                        axis.ordinalOffset = min - (minIndex * slope);\n\n                    } else {\n                        axis.ordinalPositions = axis.ordinalSlope = axis.ordinalOffset = undefined;\n                    }\n                }\n                axis.isOrdinal = isOrdinal && useOrdinal; // #3818, #4196, #4926\n                axis.groupIntervalFactor = null; // reset for next run\n            },\n            /**\n             * Translate from a linear axis value to the corresponding ordinal axis position. If there\n             * are no gaps in the ordinal axis this will be the same. The translated value is the value\n             * that the point would have if the axis were linear, using the same min and max.\n             *\n             * @param Number val The axis value\n             * @param Boolean toIndex Whether to return the index in the ordinalPositions or the new value\n             */\n            val2lin: function(val, toIndex) {\n                var axis = this,\n                    ordinalPositions = axis.ordinalPositions,\n                    ret;\n\n                if (!ordinalPositions) {\n                    ret = val;\n\n                } else {\n\n                    var ordinalLength = ordinalPositions.length,\n                        i,\n                        distance,\n                        ordinalIndex;\n\n                    // first look for an exact match in the ordinalpositions array\n                    i = ordinalLength;\n                    while (i--) {\n                        if (ordinalPositions[i] === val) {\n                            ordinalIndex = i;\n                            break;\n                        }\n                    }\n\n                    // if that failed, find the intermediate position between the two nearest values\n                    i = ordinalLength - 1;\n                    while (i--) {\n                        if (val > ordinalPositions[i] || i === 0) { // interpolate\n                            distance = (val - ordinalPositions[i]) / (ordinalPositions[i + 1] - ordinalPositions[i]); // something between 0 and 1\n                            ordinalIndex = i + distance;\n                            break;\n                        }\n                    }\n                    ret = toIndex ?\n                        ordinalIndex :\n                        axis.ordinalSlope * (ordinalIndex || 0) + axis.ordinalOffset;\n                }\n                return ret;\n            },\n            /**\n             * Translate from linear (internal) to axis value\n             *\n             * @param Number val The linear abstracted value\n             * @param Boolean fromIndex Translate from an index in the ordinal positions rather than a value\n             */\n            lin2val: function(val, fromIndex) {\n                var axis = this,\n                    ordinalPositions = axis.ordinalPositions,\n                    ret;\n\n                if (!ordinalPositions) { // the visible range contains only equally spaced values\n                    ret = val;\n\n                } else {\n\n                    var ordinalSlope = axis.ordinalSlope,\n                        ordinalOffset = axis.ordinalOffset,\n                        i = ordinalPositions.length - 1,\n                        linearEquivalentLeft,\n                        linearEquivalentRight,\n                        distance;\n\n\n                    // Handle the case where we translate from the index directly, used only\n                    // when panning an ordinal axis\n                    if (fromIndex) {\n\n                        if (val < 0) { // out of range, in effect panning to the left\n                            val = ordinalPositions[0];\n                        } else if (val > i) { // out of range, panning to the right\n                            val = ordinalPositions[i];\n                        } else { // split it up\n                            i = Math.floor(val);\n                            distance = val - i; // the decimal\n                        }\n\n                        // Loop down along the ordinal positions. When the linear equivalent of i matches\n                        // an ordinal position, interpolate between the left and right values.\n                    } else {\n                        while (i--) {\n                            linearEquivalentLeft = (ordinalSlope * i) + ordinalOffset;\n                            if (val >= linearEquivalentLeft) {\n                                linearEquivalentRight = (ordinalSlope * (i + 1)) + ordinalOffset;\n                                distance = (val - linearEquivalentLeft) / (linearEquivalentRight - linearEquivalentLeft); // something between 0 and 1\n                                break;\n                            }\n                        }\n                    }\n\n                    // If the index is within the range of the ordinal positions, return the associated\n                    // or interpolated value. If not, just return the value\n                    return distance !== undefined && ordinalPositions[i] !== undefined ?\n                        ordinalPositions[i] + (distance ? distance * (ordinalPositions[i + 1] - ordinalPositions[i]) : 0) :\n                        val;\n                }\n                return ret;\n            },\n            /**\n             * Get the ordinal positions for the entire data set. This is necessary in chart panning\n             * because we need to find out what points or data groups are available outside the\n             * visible range. When a panning operation starts, if an index for the given grouping\n             * does not exists, it is created and cached. This index is deleted on updated data, so\n             * it will be regenerated the next time a panning operation starts.\n             */\n            getExtendedPositions: function() {\n                var axis = this,\n                    chart = axis.chart,\n                    grouping = axis.series[0].currentDataGrouping,\n                    ordinalIndex = axis.ordinalIndex,\n                    key = grouping ? grouping.count + grouping.unitName : 'raw',\n                    extremes = axis.getExtremes(),\n                    fakeAxis,\n                    fakeSeries;\n\n                // If this is the first time, or the ordinal index is deleted by updatedData,\n                // create it.\n                if (!ordinalIndex) {\n                    ordinalIndex = axis.ordinalIndex = {};\n                }\n\n\n                if (!ordinalIndex[key]) {\n\n                    // Create a fake axis object where the extended ordinal positions are emulated\n                    fakeAxis = {\n                        series: [],\n                        chart: chart,\n                        getExtremes: function() {\n                            return {\n                                min: extremes.dataMin,\n                                max: extremes.dataMax\n                            };\n                        },\n                        options: {\n                            ordinal: true\n                        },\n                        val2lin: Axis.prototype.val2lin, // #2590\n                        ordinal2lin: Axis.prototype.ordinal2lin // #6276\n                    };\n\n                    // Add the fake series to hold the full data, then apply processData to it\n                    each(axis.series, function(series) {\n                        fakeSeries = {\n                            xAxis: fakeAxis,\n                            xData: series.xData,\n                            chart: chart,\n                            destroyGroupedData: noop\n                        };\n                        fakeSeries.options = {\n                            dataGrouping: grouping ? {\n                                enabled: true,\n                                forced: true,\n                                approximation: 'open', // doesn't matter which, use the fastest\n                                units: [\n                                    [grouping.unitName, [grouping.count]]\n                                ]\n                            } : {\n                                enabled: false\n                            }\n                        };\n                        series.processData.apply(fakeSeries);\n\n                        fakeAxis.series.push(fakeSeries);\n                    });\n\n                    // Run beforeSetTickPositions to compute the ordinalPositions\n                    axis.beforeSetTickPositions.apply(fakeAxis);\n\n                    // Cache it\n                    ordinalIndex[key] = fakeAxis.ordinalPositions;\n                }\n                return ordinalIndex[key];\n            },\n\n            /**\n             * Find the factor to estimate how wide the plot area would have been if ordinal\n             * gaps were included. This value is used to compute an imagined plot width in order\n             * to establish the data grouping interval.\n             *\n             * A real world case is the intraday-candlestick\n             * example. Without this logic, it would show the correct data grouping when viewing\n             * a range within each day, but once moving the range to include the gap between two\n             * days, the interval would include the cut-away night hours and the data grouping\n             * would be wrong. So the below method tries to compensate by identifying the most\n             * common point interval, in this case days.\n             *\n             * An opposite case is presented in issue #718. We have a long array of daily data,\n             * then one point is appended one hour after the last point. We expect the data grouping\n             * not to change.\n             *\n             * In the future, if we find cases where this estimation doesn't work optimally, we\n             * might need to add a second pass to the data grouping logic, where we do another run\n             * with a greater interval if the number of data groups is more than a certain fraction\n             * of the desired group count.\n             */\n            getGroupIntervalFactor: function(xMin, xMax, series) {\n                var i,\n                    processedXData = series.processedXData,\n                    len = processedXData.length,\n                    distances = [],\n                    median,\n                    groupIntervalFactor = this.groupIntervalFactor;\n\n                // Only do this computation for the first series, let the other inherit it (#2416)\n                if (!groupIntervalFactor) {\n\n                    // Register all the distances in an array\n                    for (i = 0; i < len - 1; i++) {\n                        distances[i] = processedXData[i + 1] - processedXData[i];\n                    }\n\n                    // Sort them and find the median\n                    distances.sort(function(a, b) {\n                        return a - b;\n                    });\n                    median = distances[Math.floor(len / 2)];\n\n                    // Compensate for series that don't extend through the entire axis extent. #1675.\n                    xMin = Math.max(xMin, processedXData[0]);\n                    xMax = Math.min(xMax, processedXData[len - 1]);\n\n                    this.groupIntervalFactor = groupIntervalFactor = (len * median) / (xMax - xMin);\n                }\n\n                // Return the factor needed for data grouping\n                return groupIntervalFactor;\n            },\n\n            /**\n             * Make the tick intervals closer because the ordinal gaps make the ticks spread out or cluster\n             */\n            postProcessTickInterval: function(tickInterval) {\n                // Problem: http://jsfiddle.net/highcharts/FQm4E/1/\n                // This is a case where this algorithm doesn't work optimally. In this case, the\n                // tick labels are spread out per week, but all the gaps reside within weeks. So\n                // we have a situation where the labels are courser than the ordinal gaps, and\n                // thus the tick interval should not be altered\n                var ordinalSlope = this.ordinalSlope,\n                    ret;\n\n\n                if (ordinalSlope) {\n                    if (!this.options.breaks) {\n                        ret = tickInterval / (ordinalSlope / this.closestPointRange);\n                    } else {\n                        ret = this.closestPointRange;\n                    }\n                } else {\n                    ret = tickInterval;\n                }\n                return ret;\n            }\n        });\n\n        // Record this to prevent overwriting by broken-axis module (#5979)\n        Axis.prototype.ordinal2lin = Axis.prototype.val2lin;\n\n        // Extending the Chart.pan method for ordinal axes\n        wrap(Chart.prototype, 'pan', function(proceed, e) {\n            var chart = this,\n                xAxis = chart.xAxis[0],\n                chartX = e.chartX,\n                runBase = false;\n\n            if (xAxis.options.ordinal && xAxis.series.length) {\n\n                var mouseDownX = chart.mouseDownX,\n                    extremes = xAxis.getExtremes(),\n                    dataMax = extremes.dataMax,\n                    min = extremes.min,\n                    max = extremes.max,\n                    trimmedRange,\n                    hoverPoints = chart.hoverPoints,\n                    closestPointRange = xAxis.closestPointRange,\n                    pointPixelWidth = xAxis.translationSlope * (xAxis.ordinalSlope || closestPointRange),\n                    movedUnits = (mouseDownX - chartX) / pointPixelWidth, // how many ordinal units did we move?\n                    extendedAxis = {\n                        ordinalPositions: xAxis.getExtendedPositions()\n                    }, // get index of all the chart's points\n                    ordinalPositions,\n                    searchAxisLeft,\n                    lin2val = xAxis.lin2val,\n                    val2lin = xAxis.val2lin,\n                    searchAxisRight;\n\n                if (!extendedAxis.ordinalPositions) { // we have an ordinal axis, but the data is equally spaced\n                    runBase = true;\n\n                } else if (Math.abs(movedUnits) > 1) {\n\n                    // Remove active points for shared tooltip\n                    if (hoverPoints) {\n                        each(hoverPoints, function(point) {\n                            point.setState();\n                        });\n                    }\n\n                    if (movedUnits < 0) {\n                        searchAxisLeft = extendedAxis;\n                        searchAxisRight = xAxis.ordinalPositions ? xAxis : extendedAxis;\n                    } else {\n                        searchAxisLeft = xAxis.ordinalPositions ? xAxis : extendedAxis;\n                        searchAxisRight = extendedAxis;\n                    }\n\n                    // In grouped data series, the last ordinal position represents the grouped data, which is\n                    // to the left of the real data max. If we don't compensate for this, we will be allowed\n                    // to pan grouped data series passed the right of the plot area.\n                    ordinalPositions = searchAxisRight.ordinalPositions;\n                    if (dataMax > ordinalPositions[ordinalPositions.length - 1]) {\n                        ordinalPositions.push(dataMax);\n                    }\n\n                    // Get the new min and max values by getting the ordinal index for the current extreme,\n                    // then add the moved units and translate back to values. This happens on the\n                    // extended ordinal positions if the new position is out of range, else it happens\n                    // on the current x axis which is smaller and faster.\n                    chart.fixedRange = max - min;\n                    trimmedRange = xAxis.toFixedRange(null, null,\n                        lin2val.apply(searchAxisLeft, [\n                            val2lin.apply(searchAxisLeft, [min, true]) + movedUnits, // the new index\n                            true // translate from index\n                        ]),\n                        lin2val.apply(searchAxisRight, [\n                            val2lin.apply(searchAxisRight, [max, true]) + movedUnits, // the new index\n                            true // translate from index\n                        ])\n                    );\n\n                    // Apply it if it is within the available data range\n                    if (trimmedRange.min >= Math.min(extremes.dataMin, min) && trimmedRange.max <= Math.max(dataMax, max)) {\n                        xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, {\n                            trigger: 'pan'\n                        });\n                    }\n\n                    chart.mouseDownX = chartX; // set new reference for next run\n                    css(chart.container, {\n                        cursor: 'move'\n                    });\n                }\n\n            } else {\n                runBase = true;\n            }\n\n            // revert to the linear chart.pan version\n            if (runBase) {\n                // call the original function\n                proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        /* ****************************************************************************\n         * End ordinal axis logic                                                   *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var pick = H.pick,\n            wrap = H.wrap,\n            each = H.each,\n            extend = H.extend,\n            isArray = H.isArray,\n            fireEvent = H.fireEvent,\n            Axis = H.Axis,\n            Series = H.Series;\n\n        function stripArguments() {\n            return Array.prototype.slice.call(arguments, 1);\n        }\n\n        extend(Axis.prototype, {\n            isInBreak: function(brk, val) {\n                var ret,\n                    repeat = brk.repeat || Infinity,\n                    from = brk.from,\n                    length = brk.to - brk.from,\n                    test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));\n\n                if (!brk.inclusive) {\n                    ret = test < length && test !== 0;\n                } else {\n                    ret = test <= length;\n                }\n                return ret;\n            },\n\n            isInAnyBreak: function(val, testKeep) {\n\n                var breaks = this.options.breaks,\n                    i = breaks && breaks.length,\n                    inbrk,\n                    keep,\n                    ret;\n\n\n                if (i) {\n\n                    while (i--) {\n                        if (this.isInBreak(breaks[i], val)) {\n                            inbrk = true;\n                            if (!keep) {\n                                keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);\n                            }\n                        }\n                    }\n\n                    if (inbrk && testKeep) {\n                        ret = inbrk && !keep;\n                    } else {\n                        ret = inbrk;\n                    }\n                }\n                return ret;\n            }\n        });\n\n        wrap(Axis.prototype, 'setTickPositions', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n            if (this.options.breaks) {\n                var axis = this,\n                    tickPositions = this.tickPositions,\n                    info = this.tickPositions.info,\n                    newPositions = [],\n                    i;\n\n                for (i = 0; i < tickPositions.length; i++) {\n                    if (!axis.isInAnyBreak(tickPositions[i])) {\n                        newPositions.push(tickPositions[i]);\n                    }\n                }\n\n                this.tickPositions = newPositions;\n                this.tickPositions.info = info;\n            }\n        });\n\n        wrap(Axis.prototype, 'init', function(proceed, chart, userOptions) {\n            var axis = this,\n                breaks;\n            // Force Axis to be not-ordinal when breaks are defined\n            if (userOptions.breaks && userOptions.breaks.length) {\n                userOptions.ordinal = false;\n            }\n            proceed.call(this, chart, userOptions);\n            breaks = this.options.breaks;\n            axis.isBroken = (isArray(breaks) && !!breaks.length);\n            if (axis.isBroken) {\n                axis.val2lin = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.to <= val) {\n                            nval -= brk.len;\n                        } else if (brk.from >= val) {\n                            break;\n                        } else if (axis.isInBreak(brk, val)) {\n                            nval -= (val - brk.from);\n                            break;\n                        }\n                    }\n\n                    return nval;\n                };\n\n                axis.lin2val = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.from >= nval) {\n                            break;\n                        } else if (brk.to < nval) {\n                            nval += brk.len;\n                        } else if (axis.isInBreak(brk, nval)) {\n                            nval += brk.len;\n                        }\n                    }\n                    return nval;\n                };\n\n                axis.setExtremes = function(newMin, newMax, redraw, animation, eventArguments) {\n                    // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )\n                    while (this.isInAnyBreak(newMin)) {\n                        newMin -= this.closestPointRange;\n                    }\n                    while (this.isInAnyBreak(newMax)) {\n                        newMax -= this.closestPointRange;\n                    }\n                    Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);\n                };\n\n                axis.setAxisTranslation = function(saveOld) {\n                    Axis.prototype.setAxisTranslation.call(this, saveOld);\n\n                    var breaks = axis.options.breaks,\n                        breakArrayT = [], // Temporary one\n                        breakArray = [],\n                        length = 0,\n                        inBrk,\n                        repeat,\n                        min = axis.userMin || axis.min,\n                        max = axis.userMax || axis.max,\n                        pointRangePadding = pick(axis.pointRangePadding, 0),\n                        start,\n                        i;\n\n                    // Min & max check (#4247)\n                    each(breaks, function(brk) {\n                        repeat = brk.repeat || Infinity;\n                        if (axis.isInBreak(brk, min)) {\n                            min += (brk.to % repeat) - (min % repeat);\n                        }\n                        if (axis.isInBreak(brk, max)) {\n                            max -= (max % repeat) - (brk.from % repeat);\n                        }\n                    });\n\n                    // Construct an array holding all breaks in the axis\n                    each(breaks, function(brk) {\n                        start = brk.from;\n                        repeat = brk.repeat || Infinity;\n\n                        while (start - repeat > min) {\n                            start -= repeat;\n                        }\n                        while (start < min) {\n                            start += repeat;\n                        }\n\n                        for (i = start; i < max; i += repeat) {\n                            breakArrayT.push({\n                                value: i,\n                                move: 'in'\n                            });\n                            breakArrayT.push({\n                                value: i + (brk.to - brk.from),\n                                move: 'out',\n                                size: brk.breakSize\n                            });\n                        }\n                    });\n\n                    breakArrayT.sort(function(a, b) {\n                        var ret;\n                        if (a.value === b.value) {\n                            ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);\n                        } else {\n                            ret = a.value - b.value;\n                        }\n                        return ret;\n                    });\n\n                    // Simplify the breaks\n                    inBrk = 0;\n                    start = min;\n\n                    each(breakArrayT, function(brk) {\n                        inBrk += (brk.move === 'in' ? 1 : -1);\n\n                        if (inBrk === 1 && brk.move === 'in') {\n                            start = brk.value;\n                        }\n                        if (inBrk === 0) {\n                            breakArray.push({\n                                from: start,\n                                to: brk.value,\n                                len: brk.value - start - (brk.size || 0)\n                            });\n                            length += brk.value - start - (brk.size || 0);\n                        }\n                    });\n\n                    axis.breakArray = breakArray;\n\n                    // Used with staticScale, and below, the actual axis length when\n                    // breaks are substracted.\n                    axis.unitLength = max - min - length + pointRangePadding;\n\n                    fireEvent(axis, 'afterBreaks');\n\n                    if (axis.options.staticScale) {\n                        axis.transA = axis.options.staticScale;\n                    } else if (axis.unitLength) {\n                        axis.transA *= (max - axis.min + pointRangePadding) /\n                            axis.unitLength;\n                    }\n\n                    if (pointRangePadding) {\n                        axis.minPixelPadding = axis.transA * axis.minPointOffset;\n                    }\n\n                    axis.min = min;\n                    axis.max = max;\n                };\n            }\n        });\n\n        wrap(Series.prototype, 'generatePoints', function(proceed) {\n\n            proceed.apply(this, stripArguments(arguments));\n\n            var series = this,\n                xAxis = series.xAxis,\n                yAxis = series.yAxis,\n                points = series.points,\n                point,\n                i = points.length,\n                connectNulls = series.options.connectNulls,\n                nullGap;\n\n\n            if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {\n                while (i--) {\n                    point = points[i];\n\n                    nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)\n                    if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {\n                        points.splice(i, 1);\n                        if (this.data[i]) {\n                            this.data[i].destroyElements(); // removes the graphics for this point if they exist\n                        }\n                    }\n                }\n            }\n\n        });\n\n        function drawPointsWrapped(proceed) {\n            proceed.apply(this);\n            this.drawBreaks(this.xAxis, ['x']);\n            this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));\n        }\n\n        H.Series.prototype.drawBreaks = function(axis, keys) {\n            var series = this,\n                points = series.points,\n                breaks,\n                threshold,\n                eventName,\n                y;\n\n            if (!axis) {\n                return; // #5950\n            }\n\n            each(keys, function(key) {\n                breaks = axis.breakArray || [];\n                threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);\n                each(points, function(point) {\n                    y = pick(point['stack' + key.toUpperCase()], point[key]);\n                    each(breaks, function(brk) {\n                        eventName = false;\n\n                        if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {\n                            eventName = 'pointBreak';\n                        } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break\n                            eventName = 'pointInBreak';\n                        }\n                        if (eventName) {\n                            fireEvent(axis, eventName, {\n                                point: point,\n                                brk: brk\n                            });\n                        }\n                    });\n                });\n            });\n        };\n\n\n        /**\n         * Extend getGraphPath by identifying gaps in the data so that we can draw a gap\n         * in the line or area. This was moved from ordinal axis module to broken axis\n         * module as of #5045.\n         */\n        H.Series.prototype.gappedPath = function() {\n            var gapSize = this.options.gapSize,\n                points = this.points.slice(),\n                i = points.length - 1;\n\n            if (gapSize && i > 0) { // #5008\n\n                // extension for ordinal breaks\n                while (i--) {\n                    if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {\n                        points.splice( // insert after this one\n                            i + 1,\n                            0, {\n                                isNull: true\n                            }\n                        );\n                    }\n                }\n            }\n\n            // Call base method\n            return this.getGraphPath(points);\n        };\n\n        wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);\n        wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);\n\n    }(Highcharts));\n    (function() {\n\n\n    }());\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            Axis = H.Axis,\n            defaultPlotOptions = H.defaultPlotOptions,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            Tooltip = H.Tooltip,\n            wrap = H.wrap;\n\n        /* ****************************************************************************\n         * Start data grouping module\t\t\t\t\t\t\t\t\t\t\t\t *\n         ******************************************************************************/\n\n        var seriesProto = Series.prototype,\n            baseProcessData = seriesProto.processData,\n            baseGeneratePoints = seriesProto.generatePoints,\n            baseDestroy = seriesProto.destroy,\n\n            commonOptions = {\n                approximation: 'average', // average, open, high, low, close, sum\n                //enabled: null, // (true for stock charts, false for basic),\n                //forced: undefined,\n                groupPixelWidth: 2,\n                // the first one is the point or start value, the second is the start value if we're dealing with range,\n                // the third one is the end value if dealing with a range\n                dateTimeLabelFormats: {\n                    millisecond: ['%A, %b %e, %H:%M:%S.%L', '%A, %b %e, %H:%M:%S.%L', '-%H:%M:%S.%L'],\n                    second: ['%A, %b %e, %H:%M:%S', '%A, %b %e, %H:%M:%S', '-%H:%M:%S'],\n                    minute: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\n                    hour: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\n                    day: ['%A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\n                    week: ['Week from %A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\n                    month: ['%B %Y', '%B', '-%B %Y'],\n                    year: ['%Y', '%Y', '-%Y']\n                }\n                // smoothed = false, // enable this for navigator series only\n            },\n\n            specificOptions = { // extends common options\n                line: {},\n                spline: {},\n                area: {},\n                areaspline: {},\n                column: {\n                    approximation: 'sum',\n                    groupPixelWidth: 10\n                },\n                arearange: {\n                    approximation: 'range'\n                },\n                areasplinerange: {\n                    approximation: 'range'\n                },\n                columnrange: {\n                    approximation: 'range',\n                    groupPixelWidth: 10\n                },\n                candlestick: {\n                    approximation: 'ohlc',\n                    groupPixelWidth: 10\n                },\n                ohlc: {\n                    approximation: 'ohlc',\n                    groupPixelWidth: 5\n                }\n            },\n\n            // units are defined in a separate array to allow complete overriding in case of a user option\n            defaultDataGroupingUnits = H.defaultDataGroupingUnits = [\n                [\n                    'millisecond', // unit name\n                    [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                ],\n                [\n                    'second', [1, 2, 5, 10, 15, 30]\n                ],\n                [\n                    'minute', [1, 2, 5, 10, 15, 30]\n                ],\n                [\n                    'hour', [1, 2, 3, 4, 6, 8, 12]\n                ],\n                [\n                    'day', [1]\n                ],\n                [\n                    'week', [1]\n                ],\n                [\n                    'month', [1, 3, 6]\n                ],\n                [\n                    'year',\n                    null\n                ]\n            ],\n\n\n            /**\n             * Define the available approximation types. The data grouping\n             * approximations takes an array or numbers as the first parameter. In case\n             * of ohlc, four arrays are sent in as four parameters. Each array consists\n             * only of numbers. In case null values belong to the group, the property\n             * .hasNulls will be set to true on the array.\n             */\n            approximations = {\n                sum: function(arr) {\n                    var len = arr.length,\n                        ret;\n\n                    // 1. it consists of nulls exclusively\n                    if (!len && arr.hasNulls) {\n                        ret = null;\n                        // 2. it has a length and real values\n                    } else if (len) {\n                        ret = 0;\n                        while (len--) {\n                            ret += arr[len];\n                        }\n                    }\n                    // 3. it has zero length, so just return undefined\n                    // => doNothing()\n\n                    return ret;\n                },\n                average: function(arr) {\n                    var len = arr.length,\n                        ret = approximations.sum(arr);\n\n                    // If we have a number, return it divided by the length. If not,\n                    // return null or undefined based on what the sum method finds.\n                    if (isNumber(ret) && len) {\n                        ret = ret / len;\n                    }\n\n                    return ret;\n                },\n                // The same as average, but for series with multiple values, like area\n                // ranges.\n                averages: function() { // #5479\n                    var ret = [];\n\n                    each(arguments, function(arr) {\n                        ret.push(approximations.average(arr));\n                    });\n\n                    return ret;\n                },\n                open: function(arr) {\n                    return arr.length ? arr[0] : (arr.hasNulls ? null : undefined);\n                },\n                high: function(arr) {\n                    return arr.length ? arrayMax(arr) : (arr.hasNulls ? null : undefined);\n                },\n                low: function(arr) {\n                    return arr.length ? arrayMin(arr) : (arr.hasNulls ? null : undefined);\n                },\n                close: function(arr) {\n                    return arr.length ? arr[arr.length - 1] : (arr.hasNulls ? null : undefined);\n                },\n                // ohlc and range are special cases where a multidimensional array is input and an array is output\n                ohlc: function(open, high, low, close) {\n                    open = approximations.open(open);\n                    high = approximations.high(high);\n                    low = approximations.low(low);\n                    close = approximations.close(close);\n\n                    if (isNumber(open) || isNumber(high) || isNumber(low) || isNumber(close)) {\n                        return [open, high, low, close];\n                    }\n                    // else, return is undefined\n                },\n                range: function(low, high) {\n                    low = approximations.low(low);\n                    high = approximations.high(high);\n\n                    if (isNumber(low) || isNumber(high)) {\n                        return [low, high];\n                    } else if (low === null && high === null) {\n                        return null;\n                    }\n                    // else, return is undefined\n                }\n            };\n\n\n        /**\n         * Takes parallel arrays of x and y data and groups the data into intervals \n         * defined by groupPositions, a collection of starting x values for each group.\n         */\n        seriesProto.groupData = function(xData, yData, groupPositions, approximation) {\n            var series = this,\n                data = series.data,\n                dataOptions = series.options.data,\n                groupedXData = [],\n                groupedYData = [],\n                groupMap = [],\n                dataLength = xData.length,\n                pointX,\n                pointY,\n                groupedY,\n                // when grouping the fake extended axis for panning,\n                // we don't need to consider y\n                handleYData = !!yData,\n                values = [],\n                approximationFn = typeof approximation === 'function' ?\n                approximation :\n                approximations[approximation] ||\n                // if the approximation is not found use default series type\n                // approximation (#2914)\n                (\n                    specificOptions[series.type] &&\n                    approximations[specificOptions[series.type].approximation]\n                ) || approximations[commonOptions.approximation],\n                pointArrayMap = series.pointArrayMap,\n                pointArrayMapLength = pointArrayMap && pointArrayMap.length,\n                pos = 0,\n                start = 0,\n                valuesLen,\n                i, j;\n\n            // Calculate values array size from pointArrayMap length\n            if (pointArrayMapLength) {\n                each(pointArrayMap, function() {\n                    values.push([]);\n                });\n            } else {\n                values.push([]);\n            }\n            valuesLen = pointArrayMapLength || 1;\n\n            // Start with the first point within the X axis range (#2696)\n            for (i = 0; i <= dataLength; i++) {\n                if (xData[i] >= groupPositions[0]) {\n                    break;\n                }\n            }\n\n            for (i; i <= dataLength; i++) {\n\n                // when a new group is entered, summarize and initiate \n                // the previous group\n                while ((\n                        groupPositions[pos + 1] !== undefined &&\n                        xData[i] >= groupPositions[pos + 1]\n                    ) || i === dataLength) { // get the last group\n\n                    // get group x and y\n                    pointX = groupPositions[pos];\n                    series.dataGroupInfo = {\n                        start: start,\n                        length: values[0].length\n                    };\n                    groupedY = approximationFn.apply(series, values);\n\n                    // push the grouped data\n                    if (groupedY !== undefined) {\n                        groupedXData.push(pointX);\n                        groupedYData.push(groupedY);\n                        groupMap.push(series.dataGroupInfo);\n                    }\n\n                    // reset the aggregate arrays\n                    start = i;\n                    for (j = 0; j < valuesLen; j++) {\n                        values[j].length = 0; // faster than values[j] = []\n                        values[j].hasNulls = false;\n                    }\n\n                    // Advance on the group positions\n                    pos += 1;\n\n                    // don't loop beyond the last group\n                    if (i === dataLength) {\n                        break;\n                    }\n                }\n\n                // break out\n                if (i === dataLength) {\n                    break;\n                }\n\n                // for each raw data point, push it to an array that contains all values\n                // for this specific group\n                if (pointArrayMap) {\n\n                    var index = series.cropStart + i,\n                        point = (data && data[index]) ||\n                        series.pointClass.prototype.applyOptions.apply({\n                            series: series\n                        }, [dataOptions[index]]),\n                        val;\n\n                    for (j = 0; j < pointArrayMapLength; j++) {\n                        val = point[pointArrayMap[j]];\n                        if (isNumber(val)) {\n                            values[j].push(val);\n                        } else if (val === null) {\n                            values[j].hasNulls = true;\n                        }\n                    }\n\n                } else {\n                    pointY = handleYData ? yData[i] : null;\n\n                    if (isNumber(pointY)) {\n                        values[0].push(pointY);\n                    } else if (pointY === null) {\n                        values[0].hasNulls = true;\n                    }\n                }\n            }\n\n            return [groupedXData, groupedYData, groupMap];\n        };\n\n        /**\n         * Extend the basic processData method, that crops the data to the current zoom\n         * range, with data grouping logic.\n         */\n        seriesProto.processData = function() {\n            var series = this,\n                chart = series.chart,\n                options = series.options,\n                dataGroupingOptions = options.dataGrouping,\n                groupingEnabled = series.allowDG !== false && dataGroupingOptions &&\n                pick(dataGroupingOptions.enabled, chart.options.isStock),\n                visible = series.visible || !chart.options.chart.ignoreHiddenSeries,\n                hasGroupedData,\n                skip;\n\n            // run base method\n            series.forceCrop = groupingEnabled; // #334\n            series.groupPixelWidth = null; // #2110\n            series.hasProcessed = true; // #2692\n\n            // skip if processData returns false or if grouping is disabled (in that order)\n            skip = baseProcessData.apply(series, arguments) === false || !groupingEnabled;\n            if (!skip) {\n                series.destroyGroupedData();\n\n                var i,\n                    processedXData = series.processedXData,\n                    processedYData = series.processedYData,\n                    plotSizeX = chart.plotSizeX,\n                    xAxis = series.xAxis,\n                    ordinal = xAxis.options.ordinal,\n                    groupPixelWidth = series.groupPixelWidth = xAxis.getGroupPixelWidth && xAxis.getGroupPixelWidth();\n\n                // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\n                if (groupPixelWidth) {\n                    hasGroupedData = true;\n\n                    series.isDirty = true; // force recreation of point instances in series.translate, #5699\n                    series.points = null; // #6709\n\n                    var extremes = xAxis.getExtremes(),\n                        xMin = extremes.min,\n                        xMax = extremes.max,\n                        groupIntervalFactor = (ordinal && xAxis.getGroupIntervalFactor(xMin, xMax, series)) || 1,\n                        interval = (groupPixelWidth * (xMax - xMin) / plotSizeX) * groupIntervalFactor,\n                        groupPositions = xAxis.getTimeTicks(\n                            xAxis.normalizeTimeTickInterval(interval, dataGroupingOptions.units || defaultDataGroupingUnits),\n                            Math.min(xMin, processedXData[0]), // Processed data may extend beyond axis (#4907)\n                            Math.max(xMax, processedXData[processedXData.length - 1]),\n                            xAxis.options.startOfWeek,\n                            processedXData,\n                            series.closestPointRange\n                        ),\n                        groupedData = seriesProto.groupData.apply(series, [processedXData, processedYData, groupPositions, dataGroupingOptions.approximation]),\n                        groupedXData = groupedData[0],\n                        groupedYData = groupedData[1];\n\n                    // prevent the smoothed data to spill out left and right, and make\n                    // sure data is not shifted to the left\n                    if (dataGroupingOptions.smoothed) {\n                        i = groupedXData.length - 1;\n                        groupedXData[i] = Math.min(groupedXData[i], xMax);\n                        while (i-- && i > 0) {\n                            groupedXData[i] += interval / 2;\n                        }\n                        groupedXData[0] = Math.max(groupedXData[0], xMin);\n                    }\n\n                    // record what data grouping values were used\n                    series.currentDataGrouping = groupPositions.info;\n                    series.closestPointRange = groupPositions.info.totalRange;\n                    series.groupMap = groupedData[2];\n\n                    // Make sure the X axis extends to show the first group (#2533)\n                    // But only for visible series (#5493, #6393)\n                    if (defined(groupedXData[0]) && groupedXData[0] < xAxis.dataMin && visible) {\n                        if (xAxis.min === xAxis.dataMin) {\n                            xAxis.min = groupedXData[0];\n                        }\n                        xAxis.dataMin = groupedXData[0];\n                    }\n\n                    // set series props\n                    series.processedXData = groupedXData;\n                    series.processedYData = groupedYData;\n                } else {\n                    series.currentDataGrouping = series.groupMap = null;\n                }\n                series.hasGroupedData = hasGroupedData;\n            }\n        };\n\n        /**\n         * Destroy the grouped data points. #622, #740\n         */\n        seriesProto.destroyGroupedData = function() {\n\n            var groupedData = this.groupedData;\n\n            // clear previous groups\n            each(groupedData || [], function(point, i) {\n                if (point) {\n                    groupedData[i] = point.destroy ? point.destroy() : null;\n                }\n            });\n            this.groupedData = null;\n        };\n\n        /**\n         * Override the generatePoints method by adding a reference to grouped data\n         */\n        seriesProto.generatePoints = function() {\n\n            baseGeneratePoints.apply(this);\n\n            // record grouped data in order to let it be destroyed the next time processData runs\n            this.destroyGroupedData(); // #622\n            this.groupedData = this.hasGroupedData ? this.points : null;\n        };\n\n        /**\n         * Override point prototype to throw a warning when trying to update grouped points\n         */\n        wrap(Point.prototype, 'update', function(proceed) {\n            if (this.dataGroup) {\n                H.error(24);\n            } else {\n                proceed.apply(this, [].slice.call(arguments, 1));\n            }\n        });\n\n        /**\n         * Extend the original method, make the tooltip's header reflect the grouped range\n         */\n        wrap(Tooltip.prototype, 'tooltipFooterHeaderFormatter', function(proceed, labelConfig, isFooter) {\n            var tooltip = this,\n                series = labelConfig.series,\n                options = series.options,\n                tooltipOptions = series.tooltipOptions,\n                dataGroupingOptions = options.dataGrouping,\n                xDateFormat = tooltipOptions.xDateFormat,\n                xDateFormatEnd,\n                xAxis = series.xAxis,\n                dateFormat = H.dateFormat,\n                currentDataGrouping,\n                dateTimeLabelFormats,\n                labelFormats,\n                formattedKey;\n\n            // apply only to grouped series\n            if (xAxis && xAxis.options.type === 'datetime' && dataGroupingOptions && isNumber(labelConfig.key)) {\n\n                // set variables\n                currentDataGrouping = series.currentDataGrouping;\n                dateTimeLabelFormats = dataGroupingOptions.dateTimeLabelFormats;\n\n                // if we have grouped data, use the grouping information to get the right format\n                if (currentDataGrouping) {\n                    labelFormats = dateTimeLabelFormats[currentDataGrouping.unitName];\n                    if (currentDataGrouping.count === 1) {\n                        xDateFormat = labelFormats[0];\n                    } else {\n                        xDateFormat = labelFormats[1];\n                        xDateFormatEnd = labelFormats[2];\n                    }\n                    // if not grouped, and we don't have set the xDateFormat option, get the best fit,\n                    // so if the least distance between points is one minute, show it, but if the\n                    // least distance is one day, skip hours and minutes etc.\n                } else if (!xDateFormat && dateTimeLabelFormats) {\n                    xDateFormat = tooltip.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n                }\n\n                // now format the key\n                formattedKey = dateFormat(xDateFormat, labelConfig.key);\n                if (xDateFormatEnd) {\n                    formattedKey += dateFormat(xDateFormatEnd, labelConfig.key + currentDataGrouping.totalRange - 1);\n                }\n\n                // return the replaced format\n                return format(tooltipOptions[(isFooter ? 'footer' : 'header') + 'Format'], {\n                    point: extend(labelConfig.point, {\n                        key: formattedKey\n                    }),\n                    series: series\n                });\n\n            }\n\n            // else, fall back to the regular formatter\n            return proceed.call(tooltip, labelConfig, isFooter);\n        });\n\n        /**\n         * Extend the series destroyer\n         */\n        seriesProto.destroy = function() {\n            var series = this,\n                groupedData = series.groupedData || [],\n                i = groupedData.length;\n\n            while (i--) {\n                if (groupedData[i]) {\n                    groupedData[i].destroy();\n                }\n            }\n            baseDestroy.apply(series);\n        };\n\n\n        // Handle default options for data grouping. This must be set at runtime because some series types are\n        // defined after this.\n        wrap(seriesProto, 'setOptions', function(proceed, itemOptions) {\n\n            var options = proceed.call(this, itemOptions),\n                type = this.type,\n                plotOptions = this.chart.options.plotOptions,\n                defaultOptions = defaultPlotOptions[type].dataGrouping;\n\n            if (specificOptions[type]) { // #1284\n                if (!defaultOptions) {\n                    defaultOptions = merge(commonOptions, specificOptions[type]);\n                }\n\n                options.dataGrouping = merge(\n                    defaultOptions,\n                    plotOptions.series && plotOptions.series.dataGrouping, // #1228\n                    plotOptions[type].dataGrouping, // Set by the StockChart constructor\n                    itemOptions.dataGrouping\n                );\n            }\n\n            if (this.chart.options.isStock) {\n                this.requireSorting = true;\n            }\n\n            return options;\n        });\n\n\n        /**\n         * When resetting the scale reset the hasProccessed flag to avoid taking previous data grouping\n         * of neighbour series into accound when determining group pixel width (#2692).\n         */\n        wrap(Axis.prototype, 'setScale', function(proceed) {\n            proceed.call(this);\n            each(this.series, function(series) {\n                series.hasProcessed = false;\n            });\n        });\n\n        /**\n         * Get the data grouping pixel width based on the greatest defined individual width\n         * of the axis' series, and if whether one of the axes need grouping.\n         */\n        Axis.prototype.getGroupPixelWidth = function() {\n\n            var series = this.series,\n                len = series.length,\n                i,\n                groupPixelWidth = 0,\n                doGrouping = false,\n                dataLength,\n                dgOptions;\n\n            // If multiple series are compared on the same x axis, give them the same\n            // group pixel width (#334)\n            i = len;\n            while (i--) {\n                dgOptions = series[i].options.dataGrouping;\n                if (dgOptions) {\n                    groupPixelWidth = Math.max(groupPixelWidth, dgOptions.groupPixelWidth);\n\n                }\n            }\n\n            // If one of the series needs grouping, apply it to all (#1634)\n            i = len;\n            while (i--) {\n                dgOptions = series[i].options.dataGrouping;\n\n                if (dgOptions && series[i].hasProcessed) { // #2692\n\n                    dataLength = (series[i].processedXData || series[i].data).length;\n\n                    // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\n                    if (series[i].groupPixelWidth || dataLength > (this.chart.plotSizeX / groupPixelWidth) || (dataLength && dgOptions.forced)) {\n                        doGrouping = true;\n                    }\n                }\n            }\n\n            return doGrouping ? groupPixelWidth : 0;\n        };\n\n        /**\n         * Highstock only. Force data grouping on all the axis' series.\n         *\n         * @param  {SeriesDatagroupingOptions} [dataGrouping]\n         *         A `dataGrouping` configuration. Use `false` to disable data grouping\n         *         dynamically.\n         * @param  {Boolean} [redraw=true]\n         *         Whether to redraw the chart or wait for a later call to {@link\n         *         Chart#redraw}.\n         *\n         * @function setDataGrouping\n         * @memberOf Axis.prototype\n         */\n        Axis.prototype.setDataGrouping = function(dataGrouping, redraw) {\n            var i;\n\n            redraw = pick(redraw, true);\n\n            if (!dataGrouping) {\n                dataGrouping = {\n                    forced: false,\n                    units: null\n                };\n            }\n\n            // Axis is instantiated, update all series\n            if (this instanceof Axis) {\n                i = this.series.length;\n                while (i--) {\n                    this.series[i].update({\n                        dataGrouping: dataGrouping\n                    }, false);\n                }\n\n                // Axis not yet instanciated, alter series options\n            } else {\n                each(this.chart.options.series, function(seriesOptions) {\n                    seriesOptions.dataGrouping = dataGrouping;\n                }, false);\n            }\n\n            if (redraw) {\n                this.chart.redraw();\n            }\n        };\n\n\n\n        /* ****************************************************************************\n         * End data grouping module\t\t\t\t\t\t\t\t\t\t\t\t   *\n         ******************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            Point = H.Point,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The ohlc series type.\n         *\n         * @constructor seriesTypes.ohlc\n         * @augments seriesTypes.column\n         */\n        seriesType('ohlc', 'column', {\n            lineWidth: 1,\n            tooltip: {\n\n                pointFormat: '<span class=\"highcharts-color-{point.colorIndex}\">\\u25CF</span> <b> {series.name}</b><br/>' +\n                    'Open: {point.open}<br/>' +\n                    'High: {point.high}<br/>' +\n                    'Low: {point.low}<br/>' +\n                    'Close: {point.close}<br/>'\n\n            },\n            threshold: null\n\n\n        }, /** @lends seriesTypes.ohlc */ {\n            directTouch: false,\n            pointArrayMap: ['open', 'high', 'low', 'close'], // array point configs are mapped to this\n            toYData: function(point) { // return a plain array for speedy calculation\n                return [point.open, point.high, point.low, point.close];\n            },\n            pointValKey: 'close',\n\n\n\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    hasModifyValue = !!series.modifyValue,\n                    translated = ['plotOpen', 'plotHigh', 'plotLow', 'plotClose', 'yBottom']; // translate OHLC for\n\n                seriesTypes.column.prototype.translate.apply(series);\n\n                // Do the translation\n                each(series.points, function(point) {\n                    each([point.open, point.high, point.low, point.close, point.low], function(value, i) {\n                        if (value !== null) {\n                            if (hasModifyValue) {\n                                value = series.modifyValue(value);\n                            }\n                            point[translated[i]] = yAxis.toPixels(value, true);\n                        }\n                    });\n\n                    // Align the tooltip to the high value to avoid covering the point\n                    point.tooltipPos[1] =\n                        point.plotHigh + yAxis.pos - series.chart.plotTop;\n                });\n            },\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart;\n\n\n                each(points, function(point) {\n                    var plotOpen,\n                        plotClose,\n                        crispCorr,\n                        halfWidth,\n                        path,\n                        graphic = point.graphic,\n                        crispX,\n                        isNew = !graphic;\n\n                    if (point.plotY !== undefined) {\n\n                        // Create and/or update the graphic\n                        if (!graphic) {\n                            point.graphic = graphic = chart.renderer.path()\n                                .add(series.group);\n                        }\n\n\n\n                        // crisp vector coordinates\n                        crispCorr = (graphic.strokeWidth() % 2) / 2;\n                        crispX = Math.round(point.plotX) - crispCorr; // #2596\n                        halfWidth = Math.round(point.shapeArgs.width / 2);\n\n                        // the vertical stem\n                        path = [\n                            'M',\n                            crispX, Math.round(point.yBottom),\n                            'L',\n                            crispX, Math.round(point.plotHigh)\n                        ];\n\n                        // open\n                        if (point.open !== null) {\n                            plotOpen = Math.round(point.plotOpen) + crispCorr;\n                            path.push(\n                                'M',\n                                crispX,\n                                plotOpen,\n                                'L',\n                                crispX - halfWidth,\n                                plotOpen\n                            );\n                        }\n\n                        // close\n                        if (point.close !== null) {\n                            plotClose = Math.round(point.plotClose) + crispCorr;\n                            path.push(\n                                'M',\n                                crispX,\n                                plotClose,\n                                'L',\n                                crispX + halfWidth,\n                                plotClose\n                            );\n                        }\n\n                        graphic[isNew ? 'attr' : 'animate']({\n                                d: path\n                            })\n                            .addClass(point.getClassName(), true);\n\n                    }\n\n\n                });\n\n            },\n\n            animate: null // Disable animation\n\n            /**\n             * @constructor seriesTypes.ohlc.prototype.pointClass\n             * @extends {Point}\n             */\n        }, /** @lends seriesTypes.ohlc.prototype.pointClass.prototype */ {\n            /**\n             * Extend the parent method by adding up or down to the class name.\n             */\n            getClassName: function() {\n                return Point.prototype.getClassName.call(this) +\n                    (this.open < this.close ? ' highcharts-point-up' : ' highcharts-point-down');\n            }\n        });\n        /* ****************************************************************************\n         * End OHLC series code\t\t\t\t\t\t\t\t\t\t\t\t\t   *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var defaultPlotOptions = H.defaultPlotOptions,\n            each = H.each,\n            merge = H.merge,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The candlestick series type.\n         *\n         * @constructor seriesTypes.candlestick\n         * @augments seriesTypes.ohlc\n         */\n        seriesType('candlestick', 'ohlc', merge(defaultPlotOptions.column, {\n            states: {\n                hover: {\n                    lineWidth: 2\n                }\n            },\n            tooltip: defaultPlotOptions.ohlc.tooltip,\n            threshold: null\n\n\n        }), /** @lends seriesTypes.candlestick */ {\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this, //state = series.state,\n                    points = series.points,\n                    chart = series.chart;\n\n\n                each(points, function(point) {\n\n                    var graphic = point.graphic,\n                        plotOpen,\n                        plotClose,\n                        topBox,\n                        bottomBox,\n                        hasTopWhisker,\n                        hasBottomWhisker,\n                        crispCorr,\n                        crispX,\n                        path,\n                        halfWidth,\n                        isNew = !graphic;\n\n                    if (point.plotY !== undefined) {\n\n                        if (!graphic) {\n                            point.graphic = graphic = chart.renderer.path()\n                                .add(series.group);\n                        }\n\n\n\n                        // Crisp vector coordinates\n                        crispCorr = (graphic.strokeWidth() % 2) / 2;\n                        crispX = Math.round(point.plotX) - crispCorr; // #2596\n                        plotOpen = point.plotOpen;\n                        plotClose = point.plotClose;\n                        topBox = Math.min(plotOpen, plotClose);\n                        bottomBox = Math.max(plotOpen, plotClose);\n                        halfWidth = Math.round(point.shapeArgs.width / 2);\n                        hasTopWhisker = Math.round(topBox) !== Math.round(point.plotHigh);\n                        hasBottomWhisker = bottomBox !== point.yBottom;\n                        topBox = Math.round(topBox) + crispCorr;\n                        bottomBox = Math.round(bottomBox) + crispCorr;\n\n                        // Create the path. Due to a bug in Chrome 49, the path is first instanciated\n                        // with no values, then the values pushed. For unknown reasons, instanciated\n                        // the path array with all the values would lead to a crash when updating\n                        // frequently (#5193).\n                        path = [];\n                        path.push(\n                            'M',\n                            crispX - halfWidth, bottomBox,\n                            'L',\n                            crispX - halfWidth, topBox,\n                            'L',\n                            crispX + halfWidth, topBox,\n                            'L',\n                            crispX + halfWidth, bottomBox,\n                            'Z', // Use a close statement to ensure a nice rectangle #2602\n                            'M',\n                            crispX, topBox,\n                            'L',\n                            crispX, hasTopWhisker ? Math.round(point.plotHigh) : topBox, // #460, #2094\n                            'M',\n                            crispX, bottomBox,\n                            'L',\n                            crispX, hasBottomWhisker ? Math.round(point.yBottom) : bottomBox // #460, #2094\n                        );\n\n                        graphic[isNew ? 'attr' : 'animate']({\n                                d: path\n                            })\n                            .addClass(point.getClassName(), true);\n\n                    }\n                });\n\n            }\n\n\n        });\n\n        /* ****************************************************************************\n         * End Candlestick series code\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            each = H.each,\n            merge = H.merge,\n            noop = H.noop,\n            Renderer = H.Renderer,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes,\n            SVGRenderer = H.SVGRenderer,\n            TrackerMixin = H.TrackerMixin,\n            VMLRenderer = H.VMLRenderer,\n            symbols = SVGRenderer.prototype.symbols,\n            stableSort = H.stableSort;\n\n        /**\n         * The flags series type.\n         *\n         * @constructor seriesTypes.flags\n         * @augments seriesTypes.column\n         */\n        seriesType('flags', 'column', {\n            pointRange: 0, // #673\n            //radius: 2,\n            shape: 'flag',\n            stackDistance: 12,\n            textAlign: 'center',\n            tooltip: {\n                pointFormat: '{point.text}<br/>'\n            },\n            threshold: null,\n            y: -30\n\n\n        }, /** @lends seriesTypes.flags.prototype */ {\n            sorted: false,\n            noSharedTooltip: true,\n            allowDG: false,\n            takeOrdinalPosition: false, // #1074\n            trackerGroups: ['markerGroup'],\n            forceCrop: true,\n            /**\n             * Inherit the initialization from base Series.\n             */\n            init: Series.prototype.init,\n\n\n\n            /**\n             * Extend the translate method by placing the point on the related series\n             */\n            translate: function() {\n\n                seriesTypes.column.prototype.translate.apply(this);\n\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    points = series.points,\n                    cursor = points.length - 1,\n                    point,\n                    lastPoint,\n                    optionsOnSeries = options.onSeries,\n                    onSeries = optionsOnSeries && chart.get(optionsOnSeries),\n                    onKey = options.onKey || 'y',\n                    step = onSeries && onSeries.options.step,\n                    onData = onSeries && onSeries.points,\n                    i = onData && onData.length,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    xAxisExt = xAxis.getExtremes(),\n                    xOffset = 0,\n                    leftPoint,\n                    lastX,\n                    rightPoint,\n                    currentDataGrouping;\n\n                // relate to a master series\n                if (onSeries && onSeries.visible && i) {\n                    xOffset = (onSeries.pointXOffset || 0) + (onSeries.barW || 0) / 2;\n                    currentDataGrouping = onSeries.currentDataGrouping;\n                    lastX = onData[i - 1].x + (currentDataGrouping ? currentDataGrouping.totalRange : 0); // #2374\n\n                    // sort the data points\n                    stableSort(points, function(a, b) {\n                        return (a.x - b.x);\n                    });\n\n                    onKey = 'plot' + onKey[0].toUpperCase() + onKey.substr(1);\n                    while (i-- && points[cursor]) {\n                        point = points[cursor];\n                        leftPoint = onData[i];\n                        if (leftPoint.x <= point.x && leftPoint[onKey] !== undefined) {\n                            if (point.x <= lastX) { // #803\n\n                                point.plotY = leftPoint[onKey];\n\n                                // interpolate between points, #666\n                                if (leftPoint.x < point.x && !step) {\n                                    rightPoint = onData[i + 1];\n                                    if (rightPoint && rightPoint[onKey] !== undefined) {\n                                        point.plotY +=\n                                            ((point.x - leftPoint.x) / (rightPoint.x - leftPoint.x)) * // the distance ratio, between 0 and 1\n                                            (rightPoint[onKey] - leftPoint[onKey]); // the y distance\n                                    }\n                                }\n                            }\n                            cursor--;\n                            i++; // check again for points in the same x position\n                            if (cursor < 0) {\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                // Add plotY position and handle stacking\n                each(points, function(point, i) {\n\n                    var stackIndex;\n\n                    // Undefined plotY means the point is either on axis, outside series\n                    // range or hidden series. If the series is outside the range of the\n                    // x axis it should fall through with an undefined plotY, but then\n                    // we must remove the shapeArgs (#847).\n                    if (point.plotY === undefined) {\n                        if (point.x >= xAxisExt.min && point.x <= xAxisExt.max) {\n                            // we're inside xAxis range\n                            point.plotY = chart.chartHeight - xAxis.bottom -\n                                (xAxis.opposite ? xAxis.height : 0) +\n                                xAxis.offset - yAxis.top; // #3517\n                        } else {\n                            point.shapeArgs = {}; // 847\n                        }\n                    }\n                    point.plotX += xOffset; // #2049\n                    // if multiple flags appear at the same x, order them into a stack\n                    lastPoint = points[i - 1];\n                    if (lastPoint && lastPoint.plotX === point.plotX) {\n                        if (lastPoint.stackIndex === undefined) {\n                            lastPoint.stackIndex = 0;\n                        }\n                        stackIndex = lastPoint.stackIndex + 1;\n                    }\n                    point.stackIndex = stackIndex; // #3639\n                });\n\n\n            },\n\n            /**\n             * Draw the markers\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    plotX,\n                    plotY,\n                    options = series.options,\n                    optionsY = options.y,\n                    shape,\n                    i,\n                    point,\n                    graphic,\n                    stackIndex,\n                    anchorX,\n                    anchorY,\n                    outsideRight,\n                    yAxis = series.yAxis;\n\n                i = points.length;\n                while (i--) {\n                    point = points[i];\n                    outsideRight = point.plotX > series.xAxis.len;\n                    plotX = point.plotX;\n                    stackIndex = point.stackIndex;\n                    shape = point.options.shape || options.shape;\n                    plotY = point.plotY;\n\n                    if (plotY !== undefined) {\n                        plotY = point.plotY + optionsY - (stackIndex !== undefined && stackIndex * options.stackDistance);\n                    }\n                    anchorX = stackIndex ? undefined : point.plotX; // skip connectors for higher level stacked points\n                    anchorY = stackIndex ? undefined : point.plotY;\n\n                    graphic = point.graphic;\n\n                    // Only draw the point if y is defined and the flag is within the visible area\n                    if (plotY !== undefined && plotX >= 0 && !outsideRight) {\n\n                        // Create the flag\n                        if (!graphic) {\n                            graphic = point.graphic = renderer.label(\n                                    '',\n                                    null,\n                                    null,\n                                    shape,\n                                    null,\n                                    null,\n                                    options.useHTML\n                                )\n\n                                .attr({\n                                    align: shape === 'flag' ? 'left' : 'center',\n                                    width: options.width,\n                                    height: options.height,\n                                    'text-align': options.textAlign\n                                })\n                                .addClass('highcharts-point')\n                                .add(series.markerGroup);\n\n                            // Add reference to the point for tracker (#6303)\n                            if (point.graphic.div) {\n                                point.graphic.div.point = point;\n                            }\n\n\n                        }\n\n                        if (plotX > 0) { // #3119\n                            plotX -= graphic.strokeWidth() % 2; // #4285\n                        }\n\n                        // Plant the flag\n                        graphic.attr({\n                            text: point.options.title || options.title || 'A',\n                            x: plotX,\n                            y: plotY,\n                            anchorX: anchorX,\n                            anchorY: anchorY\n                        });\n\n                        // Set the tooltip anchor position\n                        point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - plotX] : [plotX, plotY + yAxis.pos - chart.plotTop]; // #6327\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy();\n                    }\n\n                }\n\n                // Might be a mix of SVG and HTML and we need events for both (#6303)\n                if (options.useHTML) {\n                    H.wrap(series.markerGroup, 'on', function(proceed) {\n                        return H.SVGElement.prototype.on.apply(\n                            proceed.apply(this, [].slice.call(arguments, 1)), // for HTML\n                            [].slice.call(arguments, 1)); // and for SVG\n                    });\n                }\n\n            },\n\n            /**\n             * Extend the column trackers with listeners to expand and contract stacks\n             */\n            drawTracker: function() {\n                var series = this,\n                    points = series.points;\n\n                TrackerMixin.drawTrackerPoint.apply(this);\n\n                // Bring each stacked flag up on mouse over, this allows readability of vertically\n                // stacked elements as well as tight points on the x axis. #1924.\n                each(points, function(point) {\n                    var graphic = point.graphic;\n                    if (graphic) {\n                        addEvent(graphic.element, 'mouseover', function() {\n\n                            // Raise this point\n                            if (point.stackIndex > 0 && !point.raised) {\n                                point._y = graphic.y;\n                                graphic.attr({\n                                    y: point._y - 8\n                                });\n                                point.raised = true;\n                            }\n\n                            // Revert other raised points\n                            each(points, function(otherPoint) {\n                                if (otherPoint !== point && otherPoint.raised && otherPoint.graphic) {\n                                    otherPoint.graphic.attr({\n                                        y: otherPoint._y\n                                    });\n                                    otherPoint.raised = false;\n                                }\n                            });\n                        });\n                    }\n                });\n            },\n\n            animate: noop, // Disable animation\n            buildKDTree: noop,\n            setClip: noop\n\n        });\n\n        // create the flag icon with anchor\n        symbols.flag = function(x, y, w, h, options) {\n            var anchorX = (options && options.anchorX) || x,\n                anchorY = (options && options.anchorY) || y;\n\n            return [\n                'M', anchorX, anchorY,\n                'L', x, y + h,\n                x, y,\n                x + w, y,\n                x + w, y + h,\n                x, y + h,\n                'Z'\n            ];\n        };\n\n        // create the circlepin and squarepin icons with anchor\n        each(['circle', 'square'], function(shape) {\n            symbols[shape + 'pin'] = function(x, y, w, h, options) {\n\n                var anchorX = options && options.anchorX,\n                    anchorY = options && options.anchorY,\n                    path,\n                    labelTopOrBottomY;\n\n                // For single-letter flags, make sure circular flags are not taller than their width\n                if (shape === 'circle' && h > w) {\n                    x -= Math.round((h - w) / 2);\n                    w = h;\n                }\n\n                path = symbols[shape](x, y, w, h);\n\n                if (anchorX && anchorY) {\n                    // if the label is below the anchor, draw the connecting line from the top edge of the label\n                    // otherwise start drawing from the bottom edge\n                    labelTopOrBottomY = (y > anchorY) ? y : y + h;\n                    path.push('M', anchorX, labelTopOrBottomY, 'L', anchorX, anchorY);\n                }\n\n                return path;\n            };\n        });\n\n\n        /* ****************************************************************************\n         * End Flags series code\t\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            correctFloat = H.correctFloat,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            doc = H.doc,\n            each = H.each,\n            fireEvent = H.fireEvent,\n            hasTouch = H.hasTouch,\n            isTouchDevice = H.isTouchDevice,\n            merge = H.merge,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            svg = H.svg,\n            wrap = H.wrap,\n            swapXY;\n\n        var defaultScrollbarOptions = {\n            //enabled: true\n            height: isTouchDevice ? 20 : 14,\n            // trackBorderRadius: 0\n            barBorderRadius: 0,\n            buttonBorderRadius: 0,\n            liveRedraw: svg && !isTouchDevice,\n            margin: 10,\n            minWidth: 6,\n            //showFull: true,\n            //size: null,\n            step: 0.2,\n            zIndex: 3\n\n        };\n\n        defaultOptions.scrollbar = merge(true, defaultScrollbarOptions, defaultOptions.scrollbar);\n\n        /**\n         * When we have vertical scrollbar, rifles and arrow in buttons should be rotated.\n         * The same method is used in Navigator's handles, to rotate them.\n         * @param {Array} path - path to be rotated\n         * @param {Boolean} vertical - if vertical scrollbar, swap x-y values\n         */\n        H.swapXY = swapXY = function(path, vertical) {\n            var i,\n                len = path.length,\n                temp;\n\n            if (vertical) {\n                for (i = 0; i < len; i += 3) {\n                    temp = path[i + 1];\n                    path[i + 1] = path[i + 2];\n                    path[i + 2] = temp;\n                }\n            }\n\n            return path;\n        };\n\n        /**\n         * A reusable scrollbar, internally used in Highstock's navigator and optionally\n         * on individual axes.\n         *\n         * @class\n         * @param {Object} renderer\n         * @param {Object} options\n         * @param {Object} chart\n         */\n        function Scrollbar(renderer, options, chart) { // docs\n            this.init(renderer, options, chart);\n        }\n\n        Scrollbar.prototype = {\n\n            init: function(renderer, options, chart) {\n\n                this.scrollbarButtons = [];\n\n                this.renderer = renderer;\n\n                this.userOptions = options;\n                this.options = merge(defaultScrollbarOptions, options);\n\n                this.chart = chart;\n\n                this.size = pick(this.options.size, this.options.height); // backward compatibility\n\n                // Init\n                if (options.enabled) {\n                    this.render();\n                    this.initEvents();\n                    this.addEvents();\n                }\n            },\n\n            /**\n             * Render scrollbar with all required items.\n             */\n            render: function() {\n                var scroller = this,\n                    renderer = scroller.renderer,\n                    options = scroller.options,\n                    size = scroller.size,\n                    group;\n\n                // Draw the scrollbar group\n                scroller.group = group = renderer.g('scrollbar').attr({\n                    zIndex: options.zIndex,\n                    translateY: -99999\n                }).add();\n\n                // Draw the scrollbar track:\n                scroller.track = renderer.rect()\n                    .addClass('highcharts-scrollbar-track')\n                    .attr({\n                        x: 0,\n                        r: options.trackBorderRadius || 0,\n                        height: size,\n                        width: size\n                    }).add(group);\n\n\n                this.trackBorderWidth = scroller.track.strokeWidth();\n                scroller.track.attr({\n                    y: -this.trackBorderWidth % 2 / 2\n                });\n\n\n                // Draw the scrollbar itself\n                scroller.scrollbarGroup = renderer.g().add(group);\n\n                scroller.scrollbar = renderer.rect()\n                    .addClass('highcharts-scrollbar-thumb')\n                    .attr({\n                        height: size,\n                        width: size,\n                        r: options.barBorderRadius || 0\n                    }).add(scroller.scrollbarGroup);\n\n                scroller.scrollbarRifles = renderer.path(\n                        swapXY([\n                            'M', -3, size / 4,\n                            'L', -3, 2 * size / 3,\n                            'M',\n                            0, size / 4,\n                            'L',\n                            0, 2 * size / 3,\n                            'M',\n                            3, size / 4,\n                            'L',\n                            3, 2 * size / 3\n                        ], options.vertical))\n                    .addClass('highcharts-scrollbar-rifles')\n                    .add(scroller.scrollbarGroup);\n\n\n                scroller.scrollbarStrokeWidth = scroller.scrollbar.strokeWidth();\n                scroller.scrollbarGroup.translate(-scroller.scrollbarStrokeWidth % 2 / 2, -scroller.scrollbarStrokeWidth % 2 / 2);\n\n                // Draw the buttons:\n                scroller.drawScrollbarButton(0);\n                scroller.drawScrollbarButton(1);\n            },\n\n            /**\n             * Position the scrollbar, method called from a parent with defined dimensions\n             * @param {Number} x - x-position on the chart\n             * @param {Number} y - y-position on the chart\n             * @param {Number} width - width of the scrollbar\n             * @param {Number} height - height of the scorllbar\n             */\n            position: function(x, y, width, height) {\n                var scroller = this,\n                    options = scroller.options,\n                    vertical = options.vertical,\n                    xOffset = height,\n                    yOffset = 0,\n                    method = scroller.rendered ? 'animate' : 'attr';\n\n                scroller.x = x;\n                scroller.y = y + this.trackBorderWidth;\n                scroller.width = width; // width with buttons\n                scroller.height = height;\n                scroller.xOffset = xOffset;\n                scroller.yOffset = yOffset;\n\n                // If Scrollbar is a vertical type, swap options:\n                if (vertical) {\n                    scroller.width = scroller.yOffset = width = yOffset = scroller.size;\n                    scroller.xOffset = xOffset = 0;\n                    scroller.barWidth = height - width * 2; // width without buttons\n                    scroller.x = x = x + scroller.options.margin;\n                } else {\n                    scroller.height = scroller.xOffset = height = xOffset = scroller.size;\n                    scroller.barWidth = width - height * 2; // width without buttons\n                    scroller.y = scroller.y + scroller.options.margin;\n                }\n\n                // Set general position for a group:\n                scroller.group[method]({\n                    translateX: x,\n                    translateY: scroller.y\n                });\n\n                // Resize background/track:\n                scroller.track[method]({\n                    width: width,\n                    height: height\n                });\n\n                // Move right/bottom button ot it's place:\n                scroller.scrollbarButtons[1][method]({\n                    translateX: vertical ? 0 : width - xOffset,\n                    translateY: vertical ? height - yOffset : 0\n                });\n            },\n\n            /**\n             * Draw the scrollbar buttons with arrows\n             * @param {Number} index 0 is left, 1 is right\n             */\n            drawScrollbarButton: function(index) {\n                var scroller = this,\n                    renderer = scroller.renderer,\n                    scrollbarButtons = scroller.scrollbarButtons,\n                    options = scroller.options,\n                    size = scroller.size,\n                    group,\n                    tempElem;\n\n                group = renderer.g().add(scroller.group);\n                scrollbarButtons.push(group);\n\n                // Create a rectangle for the scrollbar button\n                tempElem = renderer.rect()\n                    .addClass('highcharts-scrollbar-button')\n                    .add(group);\n\n\n\n                // Place the rectangle based on the rendered stroke width\n                tempElem.attr(tempElem.crisp({\n                    x: -0.5,\n                    y: -0.5,\n                    width: size + 1, // +1 to compensate for crispifying in rect method\n                    height: size + 1,\n                    r: options.buttonBorderRadius\n                }, tempElem.strokeWidth()));\n\n                // Button arrow\n                tempElem = renderer\n                    .path(swapXY([\n                        'M',\n                        size / 2 + (index ? -1 : 1),\n                        size / 2 - 3,\n                        'L',\n                        size / 2 + (index ? -1 : 1),\n                        size / 2 + 3,\n                        'L',\n                        size / 2 + (index ? 2 : -2),\n                        size / 2\n                    ], options.vertical))\n                    .addClass('highcharts-scrollbar-arrow')\n                    .add(scrollbarButtons[index]);\n\n\n            },\n\n            /**\n             * Set scrollbar size, with a given scale.\n             * @param {Number} from - scale (0-1) where bar should start\n             * @param {Number} to - scale (0-1) where bar should end\n             */\n            setRange: function(from, to) {\n                var scroller = this,\n                    options = scroller.options,\n                    vertical = options.vertical,\n                    minWidth = options.minWidth,\n                    fullWidth = scroller.barWidth,\n                    fromPX,\n                    toPX,\n                    newPos,\n                    newSize,\n                    newRiflesPos,\n                    method = this.rendered && !this.hasDragged ? 'animate' : 'attr';\n\n                if (!defined(fullWidth)) {\n                    return;\n                }\n\n                from = Math.max(from, 0);\n                fromPX = Math.ceil(fullWidth * from);\n                toPX = fullWidth * Math.min(to, 1);\n                scroller.calculatedWidth = newSize = correctFloat(toPX - fromPX);\n\n                // We need to recalculate position, if minWidth is used\n                if (newSize < minWidth) {\n                    fromPX = (fullWidth - minWidth + newSize) * from;\n                    newSize = minWidth;\n                }\n                newPos = Math.floor(fromPX + scroller.xOffset + scroller.yOffset);\n                newRiflesPos = newSize / 2 - 0.5; // -0.5 -> rifle line width / 2\n\n                // Store current position:\n                scroller.from = from;\n                scroller.to = to;\n\n                if (!vertical) {\n                    scroller.scrollbarGroup[method]({\n                        translateX: newPos\n                    });\n                    scroller.scrollbar[method]({\n                        width: newSize\n                    });\n                    scroller.scrollbarRifles[method]({\n                        translateX: newRiflesPos\n                    });\n                    scroller.scrollbarLeft = newPos;\n                    scroller.scrollbarTop = 0;\n                } else {\n                    scroller.scrollbarGroup[method]({\n                        translateY: newPos\n                    });\n                    scroller.scrollbar[method]({\n                        height: newSize\n                    });\n                    scroller.scrollbarRifles[method]({\n                        translateY: newRiflesPos\n                    });\n                    scroller.scrollbarTop = newPos;\n                    scroller.scrollbarLeft = 0;\n                }\n\n                if (newSize <= 12) {\n                    scroller.scrollbarRifles.hide();\n                } else {\n                    scroller.scrollbarRifles.show(true);\n                }\n\n                // Show or hide the scrollbar based on the showFull setting\n                if (options.showFull === false) {\n                    if (from <= 0 && to >= 1) {\n                        scroller.group.hide();\n                    } else {\n                        scroller.group.show();\n                    }\n                }\n\n                scroller.rendered = true;\n            },\n\n            /**\n             * Init events methods, so we have an access to the Scrollbar itself\n             */\n            initEvents: function() {\n                var scroller = this;\n                /**\n                 * Event handler for the mouse move event.\n                 */\n                scroller.mouseMoveHandler = function(e) {\n                    var normalizedEvent = scroller.chart.pointer.normalize(e),\n                        options = scroller.options,\n                        direction = options.vertical ? 'chartY' : 'chartX',\n                        initPositions = scroller.initPositions,\n                        scrollPosition,\n                        chartPosition,\n                        change;\n\n                    // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\n                    // down in the center of the scrollbar. This should be ignored.\n                    if (scroller.grabbedCenter && (!e.touches || e.touches[0][direction] !== 0)) { // #4696, scrollbar failed on Android\n                        chartPosition = scroller.cursorToScrollbarPosition(normalizedEvent)[direction];\n                        scrollPosition = scroller[direction];\n\n                        change = chartPosition - scrollPosition;\n\n                        scroller.hasDragged = true;\n                        scroller.updatePosition(initPositions[0] + change, initPositions[1] + change);\n\n                        if (scroller.hasDragged) {\n                            fireEvent(scroller, 'changed', {\n                                from: scroller.from,\n                                to: scroller.to,\n                                trigger: 'scrollbar',\n                                DOMType: e.type,\n                                DOMEvent: e\n                            });\n                        }\n                    }\n                };\n\n                /**\n                 * Event handler for the mouse up event.\n                 */\n                scroller.mouseUpHandler = function(e) {\n                    if (scroller.hasDragged) {\n                        fireEvent(scroller, 'changed', {\n                            from: scroller.from,\n                            to: scroller.to,\n                            trigger: 'scrollbar',\n                            DOMType: e.type,\n                            DOMEvent: e\n                        });\n                    }\n                    scroller.grabbedCenter = scroller.hasDragged = scroller.chartX = scroller.chartY = null;\n                };\n\n                scroller.mouseDownHandler = function(e) {\n                    var normalizedEvent = scroller.chart.pointer.normalize(e),\n                        mousePosition = scroller.cursorToScrollbarPosition(normalizedEvent);\n\n                    scroller.chartX = mousePosition.chartX;\n                    scroller.chartY = mousePosition.chartY;\n                    scroller.initPositions = [scroller.from, scroller.to];\n\n                    scroller.grabbedCenter = true;\n                };\n\n                scroller.buttonToMinClick = function(e) {\n                    var range = correctFloat(scroller.to - scroller.from) * scroller.options.step;\n                    scroller.updatePosition(correctFloat(scroller.from - range), correctFloat(scroller.to - range));\n                    fireEvent(scroller, 'changed', {\n                        from: scroller.from,\n                        to: scroller.to,\n                        trigger: 'scrollbar',\n                        DOMEvent: e\n                    });\n                };\n\n                scroller.buttonToMaxClick = function(e) {\n                    var range = (scroller.to - scroller.from) * scroller.options.step;\n                    scroller.updatePosition(scroller.from + range, scroller.to + range);\n                    fireEvent(scroller, 'changed', {\n                        from: scroller.from,\n                        to: scroller.to,\n                        trigger: 'scrollbar',\n                        DOMEvent: e\n                    });\n                };\n\n                scroller.trackClick = function(e) {\n                    var normalizedEvent = scroller.chart.pointer.normalize(e),\n                        range = scroller.to - scroller.from,\n                        top = scroller.y + scroller.scrollbarTop,\n                        left = scroller.x + scroller.scrollbarLeft;\n\n                    if ((scroller.options.vertical && normalizedEvent.chartY > top) ||\n                        (!scroller.options.vertical && normalizedEvent.chartX > left)) {\n                        // On the top or on the left side of the track:\n                        scroller.updatePosition(scroller.from + range, scroller.to + range);\n                    } else {\n                        // On the bottom or the right side of the track:\n                        scroller.updatePosition(scroller.from - range, scroller.to - range);\n                    }\n\n                    fireEvent(scroller, 'changed', {\n                        from: scroller.from,\n                        to: scroller.to,\n                        trigger: 'scrollbar',\n                        DOMEvent: e\n                    });\n                };\n            },\n\n            /**\n             * Get normalized (0-1) cursor position over the scrollbar\n             * @param {Event} normalizedEvent - normalized event, with chartX and chartY values\n             * @return {Object} Local position {chartX, chartY}\n             */\n            cursorToScrollbarPosition: function(normalizedEvent) {\n                var scroller = this,\n                    options = scroller.options,\n                    minWidthDifference = options.minWidth > scroller.calculatedWidth ? options.minWidth : 0; // minWidth distorts translation\n\n                return {\n                    chartX: (normalizedEvent.chartX - scroller.x - scroller.xOffset) / (scroller.barWidth - minWidthDifference),\n                    chartY: (normalizedEvent.chartY - scroller.y - scroller.yOffset) / (scroller.barWidth - minWidthDifference)\n                };\n            },\n\n            /**\n             * Update position option in the Scrollbar, with normalized 0-1 scale\n             */\n            updatePosition: function(from, to) {\n                if (to > 1) {\n                    from = correctFloat(1 - correctFloat(to - from));\n                    to = 1;\n                }\n\n                if (from < 0) {\n                    to = correctFloat(to - from);\n                    from = 0;\n                }\n\n                this.from = from;\n                this.to = to;\n            },\n\n            /**\n             * Update the scrollbar with new options\n             */\n            update: function(options) {\n                this.destroy();\n                this.init(this.chart.renderer, merge(true, this.options, options), this.chart);\n            },\n\n            /**\n             * Set up the mouse and touch events for the Scrollbar\n             */\n            addEvents: function() {\n                var buttonsOrder = this.options.inverted ? [1, 0] : [0, 1],\n                    buttons = this.scrollbarButtons,\n                    bar = this.scrollbarGroup.element,\n                    track = this.track.element,\n                    mouseDownHandler = this.mouseDownHandler,\n                    mouseMoveHandler = this.mouseMoveHandler,\n                    mouseUpHandler = this.mouseUpHandler,\n                    _events;\n\n                // Mouse events\n                _events = [\n                    [buttons[buttonsOrder[0]].element, 'click', this.buttonToMinClick],\n                    [buttons[buttonsOrder[1]].element, 'click', this.buttonToMaxClick],\n                    [track, 'click', this.trackClick],\n                    [bar, 'mousedown', mouseDownHandler],\n                    [doc, 'mousemove', mouseMoveHandler],\n                    [doc, 'mouseup', mouseUpHandler]\n                ];\n\n                // Touch events\n                if (hasTouch) {\n                    _events.push(\n                        [bar, 'touchstart', mouseDownHandler], [doc, 'touchmove', mouseMoveHandler], [doc, 'touchend', mouseUpHandler]\n                    );\n                }\n\n                // Add them all\n                each(_events, function(args) {\n                    addEvent.apply(null, args);\n                });\n                this._events = _events;\n            },\n\n            /**\n             * Removes the event handlers attached previously with addEvents.\n             */\n            removeEvents: function() {\n                each(this._events, function(args) {\n                    removeEvent.apply(null, args);\n                });\n                this._events.length = 0;\n            },\n\n            /**\n             * Destroys allocated elements.\n             */\n            destroy: function() {\n\n                var scroller = this.chart.scroller;\n\n                // Disconnect events added in addEvents\n                this.removeEvents();\n\n                // Destroy properties\n                each(['track', 'scrollbarRifles', 'scrollbar', 'scrollbarGroup', 'group'], function(prop) {\n                    if (this[prop] && this[prop].destroy) {\n                        this[prop] = this[prop].destroy();\n                    }\n                }, this);\n\n                if (scroller && this === scroller.scrollbar) { // #6421, chart may have more scrollbars\n                    scroller.scrollbar = null;\n\n                    // Destroy elements in collection\n                    destroyObjectProperties(scroller.scrollbarButtons);\n                }\n            }\n        };\n\n        /**\n         * Wrap axis initialization and create scrollbar if enabled:\n         */\n        wrap(Axis.prototype, 'init', function(proceed) {\n            var axis = this;\n            proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n            if (axis.options.scrollbar && axis.options.scrollbar.enabled) {\n                // Predefined options:\n                axis.options.scrollbar.vertical = !axis.horiz;\n                axis.options.startOnTick = axis.options.endOnTick = false;\n\n                axis.scrollbar = new Scrollbar(axis.chart.renderer, axis.options.scrollbar, axis.chart);\n\n                addEvent(axis.scrollbar, 'changed', function(e) {\n                    var unitedMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),\n                        unitedMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),\n                        range = unitedMax - unitedMin,\n                        to,\n                        from;\n\n                    if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {\n                        to = unitedMin + range * this.to;\n                        from = unitedMin + range * this.from;\n                    } else {\n                        // y-values in browser are reversed, but this also applies for reversed horizontal axis:\n                        to = unitedMin + range * (1 - this.from);\n                        from = unitedMin + range * (1 - this.to);\n                    }\n\n                    axis.setExtremes(from, to, true, false, e);\n                });\n            }\n        });\n\n        /**\n         * Wrap rendering axis, and update scrollbar if one is created:\n         */\n        wrap(Axis.prototype, 'render', function(proceed) {\n            var axis = this,\n                scrollMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),\n                scrollMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),\n                scrollbar = axis.scrollbar,\n                titleOffset = axis.titleOffset || 0,\n                offsetsIndex,\n                from,\n                to;\n\n            proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n            if (scrollbar) {\n\n                if (axis.horiz) {\n                    scrollbar.position(\n                        axis.left,\n                        axis.top + axis.height + 2 + axis.chart.scrollbarsOffsets[1] +\n                        (axis.opposite ?\n                            0 :\n                            titleOffset + axis.axisTitleMargin + axis.offset\n                        ),\n                        axis.width,\n                        axis.height\n                    );\n                    offsetsIndex = 1;\n                } else {\n                    scrollbar.position(\n                        axis.left + axis.width + 2 + axis.chart.scrollbarsOffsets[0] +\n                        (axis.opposite ?\n                            titleOffset + axis.axisTitleMargin + axis.offset :\n                            0\n                        ),\n                        axis.top,\n                        axis.width,\n                        axis.height\n                    );\n                    offsetsIndex = 0;\n                }\n\n                if ((!axis.opposite && !axis.horiz) || (axis.opposite && axis.horiz)) {\n                    axis.chart.scrollbarsOffsets[offsetsIndex] +=\n                        axis.scrollbar.size + axis.scrollbar.options.margin;\n                }\n\n                if (isNaN(scrollMin) || isNaN(scrollMax) || !defined(axis.min) || !defined(axis.max)) {\n                    scrollbar.setRange(0, 0); // default action: when there is not extremes on the axis, but scrollbar exists, make it full size\n                } else {\n                    from = (axis.min - scrollMin) / (scrollMax - scrollMin);\n                    to = (axis.max - scrollMin) / (scrollMax - scrollMin);\n\n                    if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {\n                        scrollbar.setRange(from, to);\n                    } else {\n                        scrollbar.setRange(1 - to, 1 - from); // inverse vertical axis\n                    }\n                }\n            }\n        });\n\n        /**\n         * Make space for a scrollbar\n         */\n        wrap(Axis.prototype, 'getOffset', function(proceed) {\n            var axis = this,\n                index = axis.horiz ? 2 : 1,\n                scrollbar = axis.scrollbar;\n\n            proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n            if (scrollbar) {\n                axis.chart.scrollbarsOffsets = [0, 0]; // reset scrollbars offsets\n                axis.chart.axisOffset[index] += scrollbar.size + scrollbar.options.margin;\n            }\n        });\n\n        /**\n         * Destroy scrollbar when connected to the specific axis\n         */\n        wrap(Axis.prototype, 'destroy', function(proceed) {\n            if (this.scrollbar) {\n                this.scrollbar = this.scrollbar.destroy();\n            }\n\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        H.Scrollbar = Scrollbar;\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* ****************************************************************************\n         * Start Navigator code\t\t\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            color = H.color,\n            defaultDataGroupingUnits = H.defaultDataGroupingUnits,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            doc = H.doc,\n            each = H.each,\n            erase = H.erase,\n            error = H.error,\n            extend = H.extend,\n            grep = H.grep,\n            hasTouch = H.hasTouch,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            Scrollbar = H.Scrollbar,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n            swapXY = H.swapXY,\n\n            units = [].concat(defaultDataGroupingUnits), // copy\n            defaultSeriesType,\n\n            // Finding the min or max of a set of variables where we don't know if they are defined,\n            // is a pattern that is repeated several places in Highcharts. Consider making this\n            // a global utility method.\n            numExt = function(extreme) {\n                var numbers = grep(arguments, isNumber);\n                if (numbers.length) {\n                    return Math[extreme].apply(0, numbers);\n                }\n            };\n\n        // add more resolution to units\n        units[4] = ['day', [1, 2, 3, 4]]; // allow more days\n        units[5] = ['week', [1, 2, 3]]; // allow more weeks\n\n        defaultSeriesType = seriesTypes.areaspline === undefined ? 'line' : 'areaspline';\n\n        extend(defaultOptions, {\n            navigator: {\n                //enabled: true,\n                height: 40,\n                margin: 25,\n                maskInside: true,\n\n                series: {\n                    type: defaultSeriesType,\n\n                    compare: null,\n                    dataGrouping: {\n                        approximation: 'average',\n                        enabled: true,\n                        groupPixelWidth: 2,\n                        smoothed: true,\n                        units: units\n                    },\n                    dataLabels: {\n                        enabled: false,\n                        zIndex: 2 // #1839\n                    },\n                    id: 'highcharts-navigator-series',\n                    className: 'highcharts-navigator-series',\n                    lineColor: null, // Allow color setting while disallowing default candlestick setting (#4602)\n                    marker: {\n                        enabled: false\n                    },\n                    pointRange: 0,\n                    shadow: false,\n                    threshold: null\n                },\n                //top: undefined,\n                //opposite: undefined,\n                xAxis: {\n                    className: 'highcharts-navigator-xaxis',\n                    tickLength: 0,\n\n                    tickPixelInterval: 200,\n                    labels: {\n                        align: 'left',\n\n                        x: 3,\n                        y: -4\n                    },\n                    crosshair: false\n                },\n                yAxis: {\n                    className: 'highcharts-navigator-yaxis',\n\n                    startOnTick: false,\n                    endOnTick: false,\n                    minPadding: 0.1,\n                    maxPadding: 0.1,\n                    labels: {\n                        enabled: false\n                    },\n                    crosshair: false,\n                    title: {\n                        text: null\n                    },\n                    tickLength: 0,\n                    tickWidth: 0\n                }\n            }\n        });\n\n        /**\n         * The Navigator class\n         * @param {Object} chart - Chart object\n         * @class\n         */\n        function Navigator(chart) {\n            this.init(chart);\n        }\n\n        Navigator.prototype = {\n            /**\n             * Draw one of the handles on the side of the zoomed range in the navigator\n             * @param {Number} x The x center for the handle\n             * @param {Number} index 0 for left and 1 for right\n             * @param {Boolean} inverted flag for chart.inverted\n             * @param {String} verb use 'animate' or 'attr'\n             */\n            drawHandle: function(x, index, inverted, verb) {\n                var navigator = this;\n\n                // Place it\n                navigator.handles[index][verb](inverted ? {\n                    translateX: Math.round(navigator.left + navigator.height / 2 - 8),\n                    translateY: Math.round(navigator.top + parseInt(x, 10) + 0.5)\n                } : {\n                    translateX: Math.round(navigator.left + parseInt(x, 10)),\n                    translateY: Math.round(navigator.top + navigator.height / 2 - 8)\n                });\n            },\n\n            /**\n             * Draw one of the handles on the side of the zoomed range in the navigator\n             * @param {Boolean} inverted flag for chart.inverted\n             * @returns {Array} Path to be used in a handle\n             */\n            getHandlePath: function(inverted) {\n                return swapXY([\n                    'M', -4.5, 0.5,\n                    'L',\n                    3.5, 0.5,\n                    'L',\n                    3.5, 15.5,\n                    'L', -4.5, 15.5,\n                    'L', -4.5, 0.5,\n                    'M', -1.5, 4,\n                    'L', -1.5, 12,\n                    'M',\n                    0.5, 4,\n                    'L',\n                    0.5, 12\n                ], inverted);\n            },\n            /**\n             * Render outline around the zoomed range\n             * @param {Number} zoomedMin in pixels position where zoomed range starts\n             * @param {Number} zoomedMax in pixels position where zoomed range ends\n             * @param {Boolean} inverted flag if chart is inverted\n             * @param {String} verb use 'animate' or 'attr'\n             */\n            drawOutline: function(zoomedMin, zoomedMax, inverted, verb) {\n                var navigator = this,\n                    maskInside = navigator.navigatorOptions.maskInside,\n                    outlineWidth = navigator.outline.strokeWidth(),\n                    halfOutline = outlineWidth / 2,\n                    outlineCorrection = (outlineWidth % 2) / 2, // #5800\n                    outlineHeight = navigator.outlineHeight,\n                    scrollbarHeight = navigator.scrollbarHeight,\n                    navigatorSize = navigator.size,\n                    left = navigator.left - scrollbarHeight,\n                    navigatorTop = navigator.top,\n                    verticalMin,\n                    path;\n\n                if (inverted) {\n                    left -= halfOutline;\n                    verticalMin = navigatorTop + zoomedMax + outlineCorrection;\n                    zoomedMax = navigatorTop + zoomedMin + outlineCorrection;\n\n                    path = [\n                        'M',\n                        left + outlineHeight,\n                        navigatorTop - scrollbarHeight - outlineCorrection, // top edge\n                        'L',\n                        left + outlineHeight,\n                        verticalMin, // top right of zoomed range\n                        'L',\n                        left,\n                        verticalMin, // top left of z.r.\n                        'L',\n                        left,\n                        zoomedMax, // bottom left of z.r.\n                        'L',\n                        left + outlineHeight,\n                        zoomedMax, // bottom right of z.r.\n                        'L',\n                        left + outlineHeight,\n                        navigatorTop + navigatorSize + scrollbarHeight // bottom edge\n                    ].concat(maskInside ? [\n                        'M',\n                        left + outlineHeight,\n                        verticalMin - halfOutline, // upper left of zoomed range\n                        'L',\n                        left + outlineHeight,\n                        zoomedMax + halfOutline // upper right of z.r.\n                    ] : []);\n                } else {\n                    zoomedMin += left + scrollbarHeight - outlineCorrection;\n                    zoomedMax += left + scrollbarHeight - outlineCorrection;\n                    navigatorTop += halfOutline;\n\n                    path = [\n                        'M',\n                        left,\n                        navigatorTop, // left\n                        'L',\n                        zoomedMin,\n                        navigatorTop, // upper left of zoomed range\n                        'L',\n                        zoomedMin,\n                        navigatorTop + outlineHeight, // lower left of z.r.\n                        'L',\n                        zoomedMax,\n                        navigatorTop + outlineHeight, // lower right of z.r.\n                        'L',\n                        zoomedMax,\n                        navigatorTop, // upper right of z.r.\n                        'L',\n                        left + navigatorSize + scrollbarHeight * 2,\n                        navigatorTop // right\n                    ].concat(maskInside ? [\n                        'M',\n                        zoomedMin - halfOutline,\n                        navigatorTop, // upper left of zoomed range\n                        'L',\n                        zoomedMax + halfOutline,\n                        navigatorTop // upper right of z.r.\n                    ] : []);\n                }\n                navigator.outline[verb]({\n                    d: path\n                });\n            },\n\n            /**\n             * Render outline around the zoomed range\n             * @param {Number} zoomedMin in pixels position where zoomed range starts\n             * @param {Number} zoomedMax in pixels position where zoomed range ends\n             * @param {Boolean} inverted flag if chart is inverted\n             * @param {String} verb use 'animate' or 'attr'\n             */\n            drawMasks: function(zoomedMin, zoomedMax, inverted, verb) {\n                var navigator = this,\n                    left = navigator.left,\n                    top = navigator.top,\n                    navigatorHeight = navigator.height,\n                    height,\n                    width,\n                    x,\n                    y;\n\n                // Determine rectangle position & size \n                // According to (non)inverted position:\n                if (inverted) {\n                    x = [left, left, left];\n                    y = [top, top + zoomedMin, top + zoomedMax];\n                    width = [navigatorHeight, navigatorHeight, navigatorHeight];\n                    height = [\n                        zoomedMin,\n                        zoomedMax - zoomedMin,\n                        navigator.size - zoomedMax\n                    ];\n                } else {\n                    x = [left, left + zoomedMin, left + zoomedMax];\n                    y = [top, top, top];\n                    width = [\n                        zoomedMin,\n                        zoomedMax - zoomedMin,\n                        navigator.size - zoomedMax\n                    ];\n                    height = [navigatorHeight, navigatorHeight, navigatorHeight];\n                }\n                each(navigator.shades, function(shade, i) {\n                    shade[verb]({\n                        x: x[i],\n                        y: y[i],\n                        width: width[i],\n                        height: height[i]\n                    });\n                });\n            },\n\n            /**\n             * Generate DOM elements for a navigator:\n             * - main navigator group\n             * - all shades\n             * - outline\n             * - handles\n             */\n            renderElements: function() {\n                var navigator = this,\n                    navigatorOptions = navigator.navigatorOptions,\n                    maskInside = navigatorOptions.maskInside,\n                    chart = navigator.chart,\n                    inverted = chart.inverted,\n                    renderer = chart.renderer,\n                    navigatorGroup;\n\n                // Create the main navigator group\n                navigator.navigatorGroup = navigatorGroup = renderer.g('navigator')\n                    .attr({\n                        zIndex: 8,\n                        visibility: 'hidden'\n                    })\n                    .add();\n\n\n\n\n                // Create masks, each mask will get events and fill:\n                each([!maskInside, maskInside, !maskInside], function(hasMask, index) {\n                    navigator.shades[index] = renderer.rect()\n                        .addClass('highcharts-navigator-mask' +\n                            (index === 1 ? '-inside' : '-outside'))\n\n                        .add(navigatorGroup);\n                });\n\n                // Create the outline:\n                navigator.outline = renderer.path()\n                    .addClass('highcharts-navigator-outline')\n\n                    .add(navigatorGroup);\n\n                // Create the handlers:\n                each([0, 1], function(index) {\n                    navigator.handles[index] = renderer\n                        .path(navigator.getHandlePath(inverted))\n                        // zIndex = 6 for right handle, 7 for left.\n                        // Can't be 10, because of the tooltip in inverted chart #2908\n                        .attr({\n                            zIndex: 7 - index\n                        })\n                        .addClass(\n                            'highcharts-navigator-handle highcharts-navigator-handle-' + ['left', 'right'][index]\n                        ).add(navigatorGroup);\n\n\n                });\n            },\n\n            /**\n             * Update navigator\n             * @param {Object} options Options to merge in when updating navigator\n             */\n            update: function(options) {\n                this.destroy();\n                var chartOptions = this.chart.options;\n                merge(true, chartOptions.navigator, this.options, options);\n                this.init(this.chart);\n            },\n\n            /**\n             * Render the navigator\n             * @param {Number} min X axis value minimum\n             * @param {Number} max X axis value maximum\n             * @param {Number} pxMin Pixel value minimum\n             * @param {Number} pxMax Pixel value maximum\n             */\n            render: function(min, max, pxMin, pxMax) {\n                var navigator = this,\n                    chart = navigator.chart,\n                    navigatorWidth,\n                    scrollbarLeft,\n                    scrollbarTop,\n                    scrollbarHeight = navigator.scrollbarHeight,\n                    navigatorSize,\n                    xAxis = navigator.xAxis,\n                    scrollbarXAxis = xAxis.fake ? chart.xAxis[0] : xAxis,\n                    navigatorEnabled = navigator.navigatorEnabled,\n                    zoomedMin,\n                    zoomedMax,\n                    rendered = navigator.rendered,\n                    inverted = chart.inverted,\n                    verb,\n                    newMin,\n                    newMax,\n                    minRange = chart.xAxis[0].minRange;\n\n                // Don't redraw while moving the handles (#4703).\n                if (this.hasDragged && !defined(pxMin)) {\n                    return;\n                }\n\n                // Don't render the navigator until we have data (#486, #4202, #5172).\n                if (!isNumber(min) || !isNumber(max)) {\n                    // However, if navigator was already rendered, we may need to resize\n                    // it. For example hidden series, but visible navigator (#6022).\n                    if (rendered) {\n                        pxMin = 0;\n                        pxMax = xAxis.width;\n                    } else {\n                        return;\n                    }\n                }\n\n                navigator.left = pick(\n                    xAxis.left,\n                    // in case of scrollbar only, without navigator\n                    chart.plotLeft + scrollbarHeight + (inverted ? chart.plotWidth : 0)\n                );\n\n                navigator.size = zoomedMax = navigatorSize = pick(\n                    xAxis.len,\n                    (inverted ? chart.plotHeight : chart.plotWidth) - 2 * scrollbarHeight\n                );\n\n                if (inverted) {\n                    navigatorWidth = scrollbarHeight;\n                } else {\n                    navigatorWidth = navigatorSize + 2 * scrollbarHeight;\n                }\n\n                // Get the pixel position of the handles\n                pxMin = pick(pxMin, xAxis.toPixels(min, true));\n                pxMax = pick(pxMax, xAxis.toPixels(max, true));\n\n                if (!isNumber(pxMin) || Math.abs(pxMin) === Infinity) { // Verify (#1851, #2238)\n                    pxMin = 0;\n                    pxMax = navigatorWidth;\n                }\n\n                // Are we below the minRange? (#2618, #6191)\n                newMin = xAxis.toValue(pxMin, true);\n                newMax = xAxis.toValue(pxMax, true);\n                if (Math.abs(newMax - newMin) < minRange) {\n                    if (this.grabbedLeft) {\n                        pxMin = xAxis.toPixels(newMax - minRange, true);\n                    } else if (this.grabbedRight) {\n                        pxMax = xAxis.toPixels(newMin + minRange, true);\n                    } else {\n                        return;\n                    }\n                }\n\n                // Handles are allowed to cross, but never exceed the plot area\n                navigator.zoomedMax = Math.min(Math.max(pxMin, pxMax, 0), zoomedMax);\n                navigator.zoomedMin = Math.min(\n                    Math.max(\n                        navigator.fixedWidth ?\n                        navigator.zoomedMax - navigator.fixedWidth :\n                        Math.min(pxMin, pxMax),\n                        0\n                    ),\n                    zoomedMax\n                );\n\n                navigator.range = navigator.zoomedMax - navigator.zoomedMin;\n\n                zoomedMax = Math.round(navigator.zoomedMax);\n                zoomedMin = Math.round(navigator.zoomedMin);\n\n                if (navigatorEnabled) {\n                    navigator.navigatorGroup.attr({\n                        visibility: 'visible'\n                    });\n                    // Place elements\n                    verb = rendered && !navigator.hasDragged ? 'animate' : 'attr';\n\n                    navigator.drawMasks(zoomedMin, zoomedMax, inverted, verb);\n                    navigator.drawOutline(zoomedMin, zoomedMax, inverted, verb);\n                    navigator.drawHandle(zoomedMin, 0, inverted, verb);\n                    navigator.drawHandle(zoomedMax, 1, inverted, verb);\n                }\n\n                if (navigator.scrollbar) {\n                    if (inverted) {\n                        scrollbarTop = navigator.top - scrollbarHeight;\n                        scrollbarLeft = navigator.left - scrollbarHeight +\n                            (navigatorEnabled || !scrollbarXAxis.opposite ? 0 :\n                                // Multiple axes has offsets:\n                                (scrollbarXAxis.titleOffset || 0) +\n                                // Self margin from the axis.title\n                                scrollbarXAxis.axisTitleMargin\n                            );\n                        scrollbarHeight = navigatorSize + 2 * scrollbarHeight;\n                    } else {\n                        scrollbarTop = navigator.top +\n                            (navigatorEnabled ? navigator.height : -scrollbarHeight);\n                        scrollbarLeft = navigator.left - scrollbarHeight;\n                    }\n                    // Reposition scrollbar\n                    navigator.scrollbar.position(\n                        scrollbarLeft,\n                        scrollbarTop,\n                        navigatorWidth,\n                        scrollbarHeight\n                    );\n                    // Keep scale 0-1\n                    navigator.scrollbar.setRange(\n                        // Use real value, not rounded because range can be very small (#1716)\n                        navigator.zoomedMin / navigatorSize,\n                        navigator.zoomedMax / navigatorSize\n                    );\n                }\n                navigator.rendered = true;\n            },\n\n            /**\n             * Set up the mouse and touch events for the navigator\n             */\n            addMouseEvents: function() {\n                var navigator = this,\n                    chart = navigator.chart,\n                    container = chart.container,\n                    eventsToUnbind = [],\n                    mouseMoveHandler,\n                    mouseUpHandler;\n\n                /**\n                 * Create mouse events' handlers.\n                 * Make them as separate functions to enable wrapping them:\n                 */\n                navigator.mouseMoveHandler = mouseMoveHandler = function(e) {\n                    navigator.onMouseMove(e);\n                };\n                navigator.mouseUpHandler = mouseUpHandler = function(e) {\n                    navigator.onMouseUp(e);\n                };\n\n                // Add shades and handles mousedown events\n                eventsToUnbind = navigator.getPartsEvents('mousedown');\n                // Add mouse move and mouseup events. These are bind to doc/container,\n                // because Navigator.grabbedSomething flags are stored in mousedown events:\n                eventsToUnbind.push(\n                    addEvent(container, 'mousemove', mouseMoveHandler),\n                    addEvent(doc, 'mouseup', mouseUpHandler)\n                );\n\n                // Touch events\n                if (hasTouch) {\n                    eventsToUnbind.push(\n                        addEvent(container, 'touchmove', mouseMoveHandler),\n                        addEvent(doc, 'touchend', mouseUpHandler)\n                    );\n                    eventsToUnbind.concat(navigator.getPartsEvents('touchstart'));\n                }\n\n                navigator.eventsToUnbind = eventsToUnbind;\n\n                // Data events\n                if (navigator.series && navigator.series[0]) {\n                    eventsToUnbind.push(\n                        addEvent(navigator.series[0].xAxis, 'foundExtremes', function() {\n                            chart.navigator.modifyNavigatorAxisExtremes();\n                        })\n                    );\n                }\n            },\n\n            /**\n             * Generate events for handles and masks\n             * @param {String} eventName Event name handler, 'mousedown' or 'touchstart'\n             * @returns {Array} An array of arrays: [DOMElement, eventName, callback].\n             */\n            getPartsEvents: function(eventName) {\n                var navigator = this,\n                    events = [];\n                each(['shades', 'handles'], function(name) {\n                    each(navigator[name], function(navigatorItem, index) {\n                        events.push(\n                            addEvent(\n                                navigatorItem.element,\n                                eventName,\n                                function(e) {\n                                    navigator[name + 'Mousedown'](e, index);\n                                }\n                            )\n                        );\n                    });\n                });\n                return events;\n            },\n\n            /**\n             * Mousedown on a shaded mask, either:\n             * - will be stored for future drag&drop \n             * - will directly shift to a new range\n             *\n             * @param {Object} e Mouse event\n             * @param {Number} index Index of a mask in Navigator.shades array\n             */\n            shadesMousedown: function(e, index) {\n                e = this.chart.pointer.normalize(e);\n\n                var navigator = this,\n                    chart = navigator.chart,\n                    xAxis = navigator.xAxis,\n                    zoomedMin = navigator.zoomedMin,\n                    navigatorPosition = navigator.left,\n                    navigatorSize = navigator.size,\n                    range = navigator.range,\n                    chartX = e.chartX,\n                    fixedMax,\n                    ext,\n                    left;\n\n                // For inverted chart, swap some options:\n                if (chart.inverted) {\n                    chartX = e.chartY;\n                    navigatorPosition = navigator.top;\n                }\n\n                if (index === 1) {\n                    // Store information for drag&drop\n                    navigator.grabbedCenter = chartX;\n                    navigator.fixedWidth = range;\n                    navigator.dragOffset = chartX - zoomedMin;\n                } else {\n                    // Shift the range by clicking on shaded areas\n                    left = chartX - navigatorPosition - range / 2;\n                    if (index === 0) {\n                        left = Math.max(0, left);\n                    } else if (index === 2 && left + range >= navigatorSize) {\n                        left = navigatorSize - range;\n                        fixedMax = navigator.getUnionExtremes().dataMax; // #2293, #3543\n                    }\n                    if (left !== zoomedMin) { // it has actually moved\n                        navigator.fixedWidth = range; // #1370\n\n                        ext = xAxis.toFixedRange(left, left + range, null, fixedMax);\n                        chart.xAxis[0].setExtremes(\n                            Math.min(ext.min, ext.max),\n                            Math.max(ext.min, ext.max),\n                            true,\n                            null, // auto animation\n                            {\n                                trigger: 'navigator'\n                            }\n                        );\n                    }\n                }\n            },\n\n            /**\n             * Mousedown on a handle mask.\n             * Will store necessary information for drag&drop.\n             *\n             * @param {Object} e Mouse event\n             * @param {Number} index Index of a handle in Navigator.handles array\n             */\n            handlesMousedown: function(e, index) {\n                e = this.chart.pointer.normalize(e);\n\n                var navigator = this,\n                    chart = navigator.chart,\n                    baseXAxis = chart.xAxis[0],\n                    // For reversed axes, min and max are chagned,\n                    // so the other extreme should be stored\n                    reverse = (chart.inverted && !baseXAxis.reversed) ||\n                    (!chart.inverted && baseXAxis.reversed);\n\n                if (index === 0) {\n                    // Grab the left handle\n                    navigator.grabbedLeft = true;\n                    navigator.otherHandlePos = navigator.zoomedMax;\n                    navigator.fixedExtreme = reverse ? baseXAxis.min : baseXAxis.max;\n                } else {\n                    // Grab the right handle\n                    navigator.grabbedRight = true;\n                    navigator.otherHandlePos = navigator.zoomedMin;\n                    navigator.fixedExtreme = reverse ? baseXAxis.max : baseXAxis.min;\n                }\n\n                chart.fixedRange = null;\n            },\n            /**\n             * Mouse move event based on x/y mouse position.\n             * @param {Object} e Mouse event\n             */\n            onMouseMove: function(e) {\n                var navigator = this,\n                    chart = navigator.chart,\n                    left = navigator.left,\n                    navigatorSize = navigator.navigatorSize,\n                    range = navigator.range,\n                    dragOffset = navigator.dragOffset,\n                    inverted = chart.inverted,\n                    chartX;\n\n\n                // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\n                // down in the center of the scrollbar. This should be ignored.\n                if (!e.touches || e.touches[0].pageX !== 0) { // #4696, scrollbar failed on Android\n\n                    e = chart.pointer.normalize(e);\n                    chartX = e.chartX;\n\n                    // Swap some options for inverted chart\n                    if (inverted) {\n                        left = navigator.top;\n                        chartX = e.chartY;\n                    }\n\n                    // Drag left handle or top handle\n                    if (navigator.grabbedLeft) {\n                        navigator.hasDragged = true;\n                        navigator.render(\n                            0,\n                            0,\n                            chartX - left,\n                            navigator.otherHandlePos\n                        );\n                        // Drag right handle or bottom handle\n                    } else if (navigator.grabbedRight) {\n                        navigator.hasDragged = true;\n                        navigator.render(\n                            0,\n                            0,\n                            navigator.otherHandlePos,\n                            chartX - left\n                        );\n                        // Drag scrollbar or open area in navigator\n                    } else if (navigator.grabbedCenter) {\n                        navigator.hasDragged = true;\n                        if (chartX < dragOffset) { // outside left\n                            chartX = dragOffset;\n                        } else if (chartX > navigatorSize + dragOffset - range) { // outside right\n                            chartX = navigatorSize + dragOffset - range;\n                        }\n\n                        navigator.render(\n                            0,\n                            0,\n                            chartX - dragOffset,\n                            chartX - dragOffset + range\n                        );\n                    }\n                    if (navigator.hasDragged && navigator.scrollbar && navigator.scrollbar.options.liveRedraw) {\n                        e.DOMType = e.type; // DOMType is for IE8 because it can't read type async\n                        setTimeout(function() {\n                            navigator.onMouseUp(e);\n                        }, 0);\n                    }\n                }\n            },\n\n            /**\n             * Mouse up event based on x/y mouse position.\n             * @param {Object} e Mouse event\n             */\n            onMouseUp: function(e) {\n                var navigator = this,\n                    chart = navigator.chart,\n                    xAxis = navigator.xAxis,\n                    scrollbar = navigator.scrollbar,\n                    fixedMin,\n                    fixedMax,\n                    ext,\n                    DOMEvent = e.DOMEvent || e;\n\n                if (\n                    // MouseUp is called for both, navigator and scrollbar (that order),\n                    // which causes calling afterSetExtremes twice. Prevent first call\n                    // by checking if scrollbar is going to set new extremes (#6334)\n                    (navigator.hasDragged && (!scrollbar || !scrollbar.hasDragged)) ||\n                    e.trigger === 'scrollbar'\n                ) {\n                    // When dragging one handle, make sure the other one doesn't change\n                    if (navigator.zoomedMin === navigator.otherHandlePos) {\n                        fixedMin = navigator.fixedExtreme;\n                    } else if (navigator.zoomedMax === navigator.otherHandlePos) {\n                        fixedMax = navigator.fixedExtreme;\n                    }\n                    // Snap to right edge (#4076)\n                    if (navigator.zoomedMax === navigator.size) {\n                        fixedMax = navigator.getUnionExtremes().dataMax;\n                    }\n                    ext = xAxis.toFixedRange(\n                        navigator.zoomedMin,\n                        navigator.zoomedMax,\n                        fixedMin,\n                        fixedMax\n                    );\n\n                    if (defined(ext.min)) {\n                        chart.xAxis[0].setExtremes(\n                            Math.min(ext.min, ext.max),\n                            Math.max(ext.min, ext.max),\n                            true,\n                            navigator.hasDragged ? false : null, // Run animation when clicking buttons, scrollbar track etc, but not when dragging handles or scrollbar\n                            {\n                                trigger: 'navigator',\n                                triggerOp: 'navigator-drag',\n                                DOMEvent: DOMEvent // #1838\n                            }\n                        );\n                    }\n                }\n\n                if (e.DOMType !== 'mousemove') {\n                    navigator.grabbedLeft = navigator.grabbedRight =\n                        navigator.grabbedCenter = navigator.fixedWidth =\n                        navigator.fixedExtreme = navigator.otherHandlePos =\n                        navigator.hasDragged = navigator.dragOffset = null;\n                }\n            },\n\n            /**\n             * Removes the event handlers attached previously with addEvents.\n             */\n            removeEvents: function() {\n                if (this.eventsToUnbind) {\n                    each(this.eventsToUnbind, function(unbind) {\n                        unbind();\n                    });\n                    this.eventsToUnbind = undefined;\n                }\n                this.removeBaseSeriesEvents();\n            },\n\n            /**\n             * Remove data events.\n             */\n            removeBaseSeriesEvents: function() {\n                var baseSeries = this.baseSeries || [];\n                if (this.navigatorEnabled && baseSeries[0] && this.navigatorOptions.adaptToUpdatedData !== false) {\n                    each(baseSeries, function(series) {\n                        removeEvent(series, 'updatedData', this.updatedDataHandler);\n                    }, this);\n\n                    // We only listen for extremes-events on the first baseSeries\n                    if (baseSeries[0].xAxis) {\n                        removeEvent(baseSeries[0].xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n                    }\n                }\n            },\n\n            /**\n             * Initiate the Navigator object\n             */\n            init: function(chart) {\n                var chartOptions = chart.options,\n                    navigatorOptions = chartOptions.navigator,\n                    navigatorEnabled = navigatorOptions.enabled,\n                    scrollbarOptions = chartOptions.scrollbar,\n                    scrollbarEnabled = scrollbarOptions.enabled,\n                    height = navigatorEnabled ? navigatorOptions.height : 0,\n                    scrollbarHeight = scrollbarEnabled ? scrollbarOptions.height : 0;\n\n                this.handles = [];\n                this.shades = [];\n\n                this.chart = chart;\n                this.setBaseSeries();\n\n                this.height = height;\n                this.scrollbarHeight = scrollbarHeight;\n                this.scrollbarEnabled = scrollbarEnabled;\n                this.navigatorEnabled = navigatorEnabled;\n                this.navigatorOptions = navigatorOptions;\n                this.scrollbarOptions = scrollbarOptions;\n                this.outlineHeight = height + scrollbarHeight;\n\n                this.opposite = pick(navigatorOptions.opposite, !navigatorEnabled && chart.inverted); // #6262\n\n                var navigator = this,\n                    baseSeries = navigator.baseSeries,\n                    xAxisIndex = chart.xAxis.length,\n                    yAxisIndex = chart.yAxis.length,\n                    baseXaxis = baseSeries && baseSeries[0] && baseSeries[0].xAxis || chart.xAxis[0];\n\n                // Make room for the navigator, can be placed around the chart:\n                chart.extraMargin = {\n                    type: navigator.opposite ? 'plotTop' : 'marginBottom',\n                    value: (navigatorEnabled || !chart.inverted ? navigator.outlineHeight : 0) + navigatorOptions.margin\n                };\n                if (chart.inverted) {\n                    chart.extraMargin.type = navigator.opposite ? 'marginRight' : 'plotLeft';\n                }\n                chart.isDirtyBox = true;\n\n                if (navigator.navigatorEnabled) {\n                    // an x axis is required for scrollbar also\n                    navigator.xAxis = new Axis(chart, merge({\n                        // inherit base xAxis' break and ordinal options\n                        breaks: baseXaxis.options.breaks,\n                        ordinal: baseXaxis.options.ordinal\n                    }, navigatorOptions.xAxis, {\n                        id: 'navigator-x-axis',\n                        yAxis: 'navigator-y-axis',\n                        isX: true,\n                        type: 'datetime',\n                        index: xAxisIndex,\n                        offset: 0,\n                        keepOrdinalPadding: true, // #2436\n                        startOnTick: false,\n                        endOnTick: false,\n                        minPadding: 0,\n                        maxPadding: 0,\n                        zoomEnabled: false\n                    }, chart.inverted ? {\n                        offsets: [scrollbarHeight, 0, -scrollbarHeight, 0],\n                        width: height\n                    } : {\n                        offsets: [0, -scrollbarHeight, 0, scrollbarHeight],\n                        height: height\n                    }));\n\n                    navigator.yAxis = new Axis(chart, merge(navigatorOptions.yAxis, {\n                        id: 'navigator-y-axis',\n                        alignTicks: false,\n                        offset: 0,\n                        index: yAxisIndex,\n                        zoomEnabled: false\n                    }, chart.inverted ? {\n                        width: height\n                    } : {\n                        height: height\n                    }));\n\n                    // If we have a base series, initialize the navigator series\n                    if (baseSeries || navigatorOptions.series.data) {\n                        navigator.addBaseSeries();\n\n                        // If not, set up an event to listen for added series\n                    } else if (chart.series.length === 0) {\n\n                        wrap(chart, 'redraw', function(proceed, animation) {\n                            // We've got one, now add it as base and reset chart.redraw\n                            if (chart.series.length > 0 && !navigator.series) {\n                                navigator.setBaseSeries();\n                                chart.redraw = proceed; // reset\n                            }\n                            proceed.call(chart, animation);\n                        });\n                    }\n\n                    // Render items, so we can bind events to them:\n                    navigator.renderElements();\n                    // Add mouse events\n                    navigator.addMouseEvents();\n\n                    // in case of scrollbar only, fake an x axis to get translation\n                } else {\n                    navigator.xAxis = {\n                        translate: function(value, reverse) {\n                            var axis = chart.xAxis[0],\n                                ext = axis.getExtremes(),\n                                scrollTrackWidth = axis.len - 2 * scrollbarHeight,\n                                min = numExt('min', axis.options.min, ext.dataMin),\n                                valueRange = numExt('max', axis.options.max, ext.dataMax) - min;\n\n                            return reverse ?\n                                // from pixel to value\n                                (value * valueRange / scrollTrackWidth) + min :\n                                // from value to pixel\n                                scrollTrackWidth * (value - min) / valueRange;\n                        },\n                        toPixels: function(value) {\n                            return this.translate(value);\n                        },\n                        toValue: function(value) {\n                            return this.translate(value, true);\n                        },\n                        toFixedRange: Axis.prototype.toFixedRange,\n                        fake: true\n                    };\n                }\n\n\n                // Initialize the scrollbar\n                if (chart.options.scrollbar.enabled) {\n                    chart.scrollbar = navigator.scrollbar = new Scrollbar(\n                        chart.renderer,\n                        merge(chart.options.scrollbar, {\n                            margin: navigator.navigatorEnabled ? 0 : 10,\n                            vertical: chart.inverted\n                        }),\n                        chart\n                    );\n                    addEvent(navigator.scrollbar, 'changed', function(e) {\n                        var range = navigator.size,\n                            to = range * this.to,\n                            from = range * this.from;\n\n                        navigator.hasDragged = navigator.scrollbar.hasDragged;\n                        navigator.render(0, 0, from, to);\n\n                        if (chart.options.scrollbar.liveRedraw || e.DOMType !== 'mousemove') {\n                            setTimeout(function() {\n                                navigator.onMouseUp(e);\n                            });\n                        }\n                    });\n                }\n\n                // Add data events\n                navigator.addBaseSeriesEvents();\n                // Add redraw events\n                navigator.addChartEvents();\n            },\n\n            /**\n             * Get the union data extremes of the chart - the outer data extremes of the base\n             * X axis and the navigator axis.\n             * @param {boolean} returnFalseOnNoBaseSeries - as the param says.\n             */\n            getUnionExtremes: function(returnFalseOnNoBaseSeries) {\n                var baseAxis = this.chart.xAxis[0],\n                    navAxis = this.xAxis,\n                    navAxisOptions = navAxis.options,\n                    baseAxisOptions = baseAxis.options,\n                    ret;\n\n                if (!returnFalseOnNoBaseSeries || baseAxis.dataMin !== null) {\n                    ret = {\n                        dataMin: pick( // #4053\n                            navAxisOptions && navAxisOptions.min,\n                            numExt(\n                                'min',\n                                baseAxisOptions.min,\n                                baseAxis.dataMin,\n                                navAxis.dataMin,\n                                navAxis.min\n                            )\n                        ),\n                        dataMax: pick(\n                            navAxisOptions && navAxisOptions.max,\n                            numExt(\n                                'max',\n                                baseAxisOptions.max,\n                                baseAxis.dataMax,\n                                navAxis.dataMax,\n                                navAxis.max\n                            )\n                        )\n                    };\n                }\n                return ret;\n            },\n\n            /**\n             * Set the base series. With a bit of modification we should be able to make\n             * this an API method to be called from the outside\n             * @param {Object} baseSeriesOptions - series options for a navigator\n             */\n            setBaseSeries: function(baseSeriesOptions) {\n                var chart = this.chart,\n                    baseSeries;\n\n                baseSeriesOptions = baseSeriesOptions || chart.options && chart.options.navigator.baseSeries || 0;\n\n                // If we're resetting, remove the existing series\n                if (this.series) {\n                    this.removeBaseSeriesEvents();\n                    each(this.series, function(s) {\n                        s.destroy();\n                    });\n                }\n\n                baseSeries = this.baseSeries = [];\n\n                // Iterate through series and add the ones that should be shown in navigator\n                each(chart.series || [], function(series, i) {\n                    if (series.options.showInNavigator || (i === baseSeriesOptions || series.options.id === baseSeriesOptions) &&\n                        series.options.showInNavigator !== false) {\n                        baseSeries.push(series);\n                    }\n                });\n\n                // When run after render, this.xAxis already exists\n                if (this.xAxis && !this.xAxis.fake) {\n                    this.addBaseSeries();\n                }\n            },\n\n            /*\n             * Add base series to the navigator.\n             */\n            addBaseSeries: function() {\n                var navigator = this,\n                    chart = navigator.chart,\n                    navigatorSeries = navigator.series = [],\n                    baseSeries = navigator.baseSeries,\n                    baseOptions,\n                    mergedNavSeriesOptions,\n                    chartNavigatorOptions = navigator.navigatorOptions.series,\n                    baseNavigatorOptions,\n                    navSeriesMixin = {\n                        enableMouseTracking: false,\n                        index: null, // #6162\n                        group: 'nav', // for columns\n                        padXAxis: false,\n                        xAxis: 'navigator-x-axis',\n                        yAxis: 'navigator-y-axis',\n                        showInLegend: false,\n                        stacking: false, // #4823\n                        isInternal: true,\n                        visible: true\n                    };\n\n                // Go through each base series and merge the options to create new series\n                if (baseSeries) {\n                    each(baseSeries, function(base, i) {\n                        navSeriesMixin.name = 'Navigator ' + (i + 1);\n\n                        baseOptions = base.options || {};\n                        baseNavigatorOptions = baseOptions.navigatorOptions || {};\n                        mergedNavSeriesOptions = merge(baseOptions, navSeriesMixin, chartNavigatorOptions, baseNavigatorOptions);\n\n                        // Merge data separately. Do a slice to avoid mutating the navigator options from base series (#4923).\n                        var navigatorSeriesData = baseNavigatorOptions.data || chartNavigatorOptions.data;\n                        navigator.hasNavigatorData = navigator.hasNavigatorData || !!navigatorSeriesData;\n                        mergedNavSeriesOptions.data = navigatorSeriesData || baseOptions.data && baseOptions.data.slice(0);\n\n                        // Add the series\n                        base.navigatorSeries = chart.initSeries(mergedNavSeriesOptions);\n                        navigatorSeries.push(base.navigatorSeries);\n                    });\n                } else {\n                    // No base series, build from mixin and chart wide options\n                    mergedNavSeriesOptions = merge(chartNavigatorOptions, navSeriesMixin);\n                    mergedNavSeriesOptions.data = chartNavigatorOptions.data;\n                    navigator.hasNavigatorData = !!mergedNavSeriesOptions.data;\n                    navigatorSeries.push(chart.initSeries(mergedNavSeriesOptions));\n                }\n\n                this.addBaseSeriesEvents();\n            },\n\n            /**\n             * Add data events.\n             * For example when main series is updated we need to recalculate extremes\n             */\n            addBaseSeriesEvents: function() {\n                var navigator = this,\n                    baseSeries = navigator.baseSeries || [];\n\n                // Bind modified extremes event to first base's xAxis only. In event of > 1 base-xAxes, the navigator will ignore those.\n                if (baseSeries[0] && baseSeries[0].xAxis) {\n                    addEvent(baseSeries[0].xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n                }\n\n                if (this.navigatorOptions.adaptToUpdatedData !== false) {\n                    // Respond to updated data in the base series.\n                    // Abort if lazy-loading data from the server.\n                    each(baseSeries, function(base) {\n                        if (base.xAxis) {\n                            addEvent(base, 'updatedData', this.updatedDataHandler);\n                        }\n\n                        // Handle series removal\n                        addEvent(base, 'remove', function() {\n                            if (this.navigatorSeries) {\n                                erase(navigator.series, this.navigatorSeries);\n                                this.navigatorSeries.remove(false);\n                                delete this.navigatorSeries;\n                            }\n                        });\n                    }, this);\n                }\n            },\n\n            /**\n             * Set the navigator x axis extremes to reflect the total. The navigator extremes\n             * should always be the extremes of the union of all series in the chart as\n             * well as the navigator series.\n             */\n            modifyNavigatorAxisExtremes: function() {\n                var xAxis = this.xAxis,\n                    unionExtremes;\n\n                if (xAxis.getExtremes) {\n                    unionExtremes = this.getUnionExtremes(true);\n                    if (unionExtremes && (unionExtremes.dataMin !== xAxis.min || unionExtremes.dataMax !== xAxis.max)) {\n                        xAxis.min = unionExtremes.dataMin;\n                        xAxis.max = unionExtremes.dataMax;\n                    }\n                }\n            },\n\n            /**\n             * Hook to modify the base axis extremes with information from the Navigator\n             */\n            modifyBaseAxisExtremes: function() {\n                var baseXAxis = this,\n                    navigator = baseXAxis.chart.navigator,\n                    baseExtremes = baseXAxis.getExtremes(),\n                    baseMin = baseExtremes.min,\n                    baseMax = baseExtremes.max,\n                    baseDataMin = baseExtremes.dataMin,\n                    baseDataMax = baseExtremes.dataMax,\n                    range = baseMax - baseMin,\n                    stickToMin = navigator.stickToMin,\n                    stickToMax = navigator.stickToMax,\n                    newMax,\n                    newMin,\n                    navigatorSeries = navigator.series && navigator.series[0],\n                    hasSetExtremes = !!baseXAxis.setExtremes,\n\n                    // When the extremes have been set by range selector button, don't stick to min or max.\n                    // The range selector buttons will handle the extremes. (#5489)\n                    unmutable = baseXAxis.eventArgs && baseXAxis.eventArgs.trigger === 'rangeSelectorButton';\n\n                if (!unmutable) {\n\n                    // If the zoomed range is already at the min, move it to the right as new data\n                    // comes in\n                    if (stickToMin) {\n                        newMin = baseDataMin;\n                        newMax = newMin + range;\n                    }\n\n                    // If the zoomed range is already at the max, move it to the right as new data\n                    // comes in\n                    if (stickToMax) {\n                        newMax = baseDataMax;\n                        if (!stickToMin) { // if stickToMin is true, the new min value is set above\n                            newMin = Math.max(\n                                newMax - range,\n                                navigatorSeries && navigatorSeries.xData ?\n                                navigatorSeries.xData[0] : -Number.MAX_VALUE\n                            );\n                        }\n                    }\n\n                    // Update the extremes\n                    if (hasSetExtremes && (stickToMin || stickToMax)) {\n                        if (isNumber(newMin)) {\n                            baseXAxis.min = baseXAxis.userMin = newMin;\n                            baseXAxis.max = baseXAxis.userMax = newMax;\n                        }\n                    }\n                }\n\n                // Reset\n                navigator.stickToMin = navigator.stickToMax = null;\n            },\n\n            /**\n             * Handler for updated data on the base series. When data is modified, the navigator series\n             * must reflect it. This is called from the Chart.redraw function before axis and series\n             * extremes are computed.\n             */\n            updatedDataHandler: function() {\n                var navigator = this.chart.navigator,\n                    baseSeries = this,\n                    navigatorSeries = this.navigatorSeries;\n\n                // Detect whether the zoomed area should stick to the minimum or maximum. If the current\n                // axis minimum falls outside the new updated dataset, we must adjust.\n                navigator.stickToMin = isNumber(baseSeries.xAxis.min) && (baseSeries.xAxis.min <= baseSeries.xData[0]);\n                // If the scrollbar is scrolled all the way to the right, keep right as new data \n                // comes in.\n                navigator.stickToMax = Math.round(navigator.zoomedMax) >= Math.round(navigator.size);\n\n                // Set the navigator series data to the new data of the base series\n                if (navigatorSeries && !navigator.hasNavigatorData) {\n                    navigatorSeries.options.pointStart = baseSeries.xData[0];\n                    navigatorSeries.setData(baseSeries.options.data, false, null, false); // #5414\n                }\n            },\n\n            /**\n             * Add chart events, like redrawing navigator, when chart requires that.\n             */\n            addChartEvents: function() {\n                addEvent(this.chart, 'redraw', function() {\n                    // Move the scrollbar after redraw, like after data updata even if axes don't redraw\n                    var navigator = this.navigator,\n                        xAxis = navigator && (\n                            navigator.baseSeries &&\n                            navigator.baseSeries[0] &&\n                            navigator.baseSeries[0].xAxis ||\n                            navigator.scrollbar && this.xAxis[0]\n                        ); // #5709\n\n                    if (xAxis) {\n                        navigator.render(xAxis.min, xAxis.max);\n                    }\n                });\n            },\n\n            /**\n             * Destroys allocated elements.\n             */\n            destroy: function() {\n\n                // Disconnect events added in addEvents\n                this.removeEvents();\n\n                if (this.xAxis) {\n                    erase(this.chart.xAxis, this.xAxis);\n                    erase(this.chart.axes, this.xAxis);\n                }\n                if (this.yAxis) {\n                    erase(this.chart.yAxis, this.yAxis);\n                    erase(this.chart.axes, this.yAxis);\n                }\n                // Destroy series\n                each(this.series || [], function(s) {\n                    if (s.destroy) {\n                        s.destroy();\n                    }\n                });\n\n                // Destroy properties\n                each([\n                    'series', 'xAxis', 'yAxis', 'shades', 'outline', 'scrollbarTrack',\n                    'scrollbarRifles', 'scrollbarGroup', 'scrollbar', 'navigatorGroup',\n                    'rendered'\n                ], function(prop) {\n                    if (this[prop] && this[prop].destroy) {\n                        this[prop].destroy();\n                    }\n                    this[prop] = null;\n                }, this);\n\n                // Destroy elements in collection\n                each([this.handles], function(coll) {\n                    destroyObjectProperties(coll);\n                }, this);\n            }\n        };\n\n        H.Navigator = Navigator;\n\n        /**\n         * For Stock charts, override selection zooming with some special features because\n         * X axis zooming is already allowed by the Navigator and Range selector.\n         */\n        wrap(Axis.prototype, 'zoom', function(proceed, newMin, newMax) {\n            var chart = this.chart,\n                chartOptions = chart.options,\n                zoomType = chartOptions.chart.zoomType,\n                previousZoom,\n                navigator = chartOptions.navigator,\n                rangeSelector = chartOptions.rangeSelector,\n                ret;\n\n            if (this.isXAxis && ((navigator && navigator.enabled) ||\n                    (rangeSelector && rangeSelector.enabled))) {\n\n                // For x only zooming, fool the chart.zoom method not to create the zoom button\n                // because the property already exists\n                if (zoomType === 'x') {\n                    chart.resetZoomButton = 'blocked';\n\n                    // For y only zooming, ignore the X axis completely\n                } else if (zoomType === 'y') {\n                    ret = false;\n\n                    // For xy zooming, record the state of the zoom before zoom selection, then when\n                    // the reset button is pressed, revert to this state\n                } else if (zoomType === 'xy') {\n                    previousZoom = this.previousZoom;\n                    if (defined(newMin)) {\n                        this.previousZoom = [this.min, this.max];\n                    } else if (previousZoom) {\n                        newMin = previousZoom[0];\n                        newMax = previousZoom[1];\n                        delete this.previousZoom;\n                    }\n                }\n\n            }\n            return ret !== undefined ? ret : proceed.call(this, newMin, newMax);\n        });\n\n        // Initialize navigator for stock charts\n        wrap(Chart.prototype, 'init', function(proceed, options, callback) {\n\n            addEvent(this, 'beforeRender', function() {\n                var options = this.options;\n                if (options.navigator.enabled || options.scrollbar.enabled) {\n                    this.scroller = this.navigator = new Navigator(this);\n                }\n            });\n\n            proceed.call(this, options, callback);\n\n        });\n\n        /**\n         * For stock charts, extend the Chart.setChartSize method so that we can set the final top position\n         * of the navigator once the height of the chart, including the legend, is determined. #367.\n         * We can't use Chart.getMargins, because labels offsets are not calculated yet.\n         */\n        wrap(Chart.prototype, 'setChartSize', function(proceed) {\n\n            var legend = this.legend,\n                navigator = this.navigator,\n                scrollbarHeight,\n                legendOptions,\n                xAxis,\n                yAxis;\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (navigator) {\n                legendOptions = legend.options;\n                xAxis = navigator.xAxis;\n                yAxis = navigator.yAxis;\n                scrollbarHeight = navigator.scrollbarHeight;\n\n                // Compute the top position\n                if (this.inverted) {\n                    navigator.left = navigator.opposite ?\n                        this.chartWidth - scrollbarHeight - navigator.height :\n                        this.spacing[3] + scrollbarHeight;\n                    navigator.top = this.plotTop + scrollbarHeight;\n                } else {\n                    navigator.left = this.plotLeft + scrollbarHeight;\n                    navigator.top = navigator.navigatorOptions.top ||\n                        this.chartHeight - navigator.height - scrollbarHeight - this.spacing[2] -\n                        (legendOptions.verticalAlign === 'bottom' && legendOptions.enabled && !legendOptions.floating ?\n                            legend.legendHeight + pick(legendOptions.margin, 10) : 0);\n                }\n\n                if (xAxis && yAxis) { // false if navigator is disabled (#904)\n\n                    if (this.inverted) {\n                        xAxis.options.left = yAxis.options.left = navigator.left;\n                    } else {\n                        xAxis.options.top = yAxis.options.top = navigator.top;\n                    }\n\n                    xAxis.setAxisSize();\n                    yAxis.setAxisSize();\n                }\n            }\n        });\n\n        // Pick up badly formatted point options to addPoint\n        wrap(Series.prototype, 'addPoint', function(proceed, options, redraw, shift, animation) {\n            var turboThreshold = this.options.turboThreshold;\n            if (turboThreshold && this.xData.length > turboThreshold && isObject(options, true) && this.chart.navigator) {\n                error(20, true);\n            }\n            proceed.call(this, options, redraw, shift, animation);\n        });\n\n        // Handle adding new series\n        wrap(Chart.prototype, 'addSeries', function(proceed, options, redraw, animation) {\n            var series = proceed.call(this, options, false, animation);\n            if (this.navigator) {\n                this.navigator.setBaseSeries(); // Recompute which series should be shown in navigator, and add them\n            }\n            if (pick(redraw, true)) {\n                this.redraw();\n            }\n            return series;\n        });\n\n        // Handle updating series\n        wrap(Series.prototype, 'update', function(proceed, newOptions, redraw) {\n            proceed.call(this, newOptions, false);\n            if (this.chart.navigator) {\n                this.chart.navigator.setBaseSeries();\n            }\n            if (pick(redraw, true)) {\n                this.chart.redraw();\n            }\n        });\n\n        Chart.prototype.callbacks.push(function(chart) {\n            var extremes,\n                navigator = chart.navigator;\n\n            // Initiate the navigator\n            if (navigator) {\n                extremes = chart.xAxis[0].getExtremes();\n                navigator.render(extremes.min, extremes.max);\n            }\n        });\n\n        /* ****************************************************************************\n         * End Navigator code\t\t\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            css = H.css,\n            createElement = H.createElement,\n            dateFormat = H.dateFormat,\n            defaultOptions = H.defaultOptions,\n            useUTC = defaultOptions.global.useUTC,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            discardElement = H.discardElement,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            HCDate = H.Date,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            pInt = H.pInt,\n            splat = H.splat,\n            wrap = H.wrap;\n\n        /* ****************************************************************************\n         * Start Range Selector code\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n        extend(defaultOptions, {\n            rangeSelector: {\n                // allButtonsEnabled: false,\n                // enabled: true,\n                // buttons: {Object}\n                // buttonSpacing: 0,\n                buttonTheme: {\n                    'stroke-width': 0,\n                    width: 28,\n                    height: 18,\n                    padding: 2,\n                    zIndex: 7 // #484, #852\n                },\n                height: 35, // reserved space for buttons and input\n                inputPosition: {\n                    align: 'right'\n                },\n                // inputDateFormat: '%b %e, %Y',\n                // inputEditDateFormat: '%Y-%m-%d',\n                // inputEnabled: true,\n                // selected: undefined\n\n            }\n        });\n        defaultOptions.lang = merge(defaultOptions.lang, {\n            rangeSelectorZoom: 'Zoom',\n            rangeSelectorFrom: 'From',\n            rangeSelectorTo: 'To'\n        });\n\n        /**\n         * The range selector.\n         * @class\n         * @param {Object} chart\n         */\n        function RangeSelector(chart) {\n\n            // Run RangeSelector\n            this.init(chart);\n        }\n\n        RangeSelector.prototype = {\n            /**\n             * The method to run when one of the buttons in the range selectors is clicked\n             * @param {Number} i The index of the button\n             * @param {Object} rangeOptions\n             * @param {Boolean} redraw\n             */\n            clickButton: function(i, redraw) {\n                var rangeSelector = this,\n                    chart = rangeSelector.chart,\n                    rangeOptions = rangeSelector.buttonOptions[i],\n                    baseAxis = chart.xAxis[0],\n                    unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis || {},\n                    dataMin = unionExtremes.dataMin,\n                    dataMax = unionExtremes.dataMax,\n                    newMin,\n                    newMax = baseAxis && Math.round(Math.min(baseAxis.max, pick(dataMax, baseAxis.max))), // #1568\n                    type = rangeOptions.type,\n                    baseXAxisOptions,\n                    range = rangeOptions._range,\n                    rangeMin,\n                    minSetting,\n                    rangeSetting,\n                    ctx,\n                    ytdExtremes,\n                    dataGrouping = rangeOptions.dataGrouping;\n\n                if (dataMin === null || dataMax === null) { // chart has no data, base series is removed\n                    return;\n                }\n\n                // Set the fixed range before range is altered\n                chart.fixedRange = range;\n\n                // Apply dataGrouping associated to button\n                if (dataGrouping) {\n                    this.forcedDataGrouping = true;\n                    Axis.prototype.setDataGrouping.call(baseAxis || {\n                        chart: this.chart\n                    }, dataGrouping, false);\n                }\n\n                // Apply range\n                if (type === 'month' || type === 'year') {\n                    if (!baseAxis) {\n                        // This is set to the user options and picked up later when the axis is instantiated\n                        // so that we know the min and max.\n                        range = rangeOptions;\n                    } else {\n                        ctx = {\n                            range: rangeOptions,\n                            max: newMax,\n                            dataMin: dataMin,\n                            dataMax: dataMax\n                        };\n                        newMin = baseAxis.minFromRange.call(ctx);\n                        if (isNumber(ctx.newMax)) {\n                            newMax = ctx.newMax;\n                        }\n                    }\n\n                    // Fixed times like minutes, hours, days\n                } else if (range) {\n                    newMin = Math.max(newMax - range, dataMin);\n                    newMax = Math.min(newMin + range, dataMax);\n\n                } else if (type === 'ytd') {\n\n                    // On user clicks on the buttons, or a delayed action running from the beforeRender\n                    // event (below), the baseAxis is defined.\n                    if (baseAxis) {\n                        // When \"ytd\" is the pre-selected button for the initial view, its calculation\n                        // is delayed and rerun in the beforeRender event (below). When the series\n                        // are initialized, but before the chart is rendered, we have access to the xData\n                        // array (#942).\n                        if (dataMax === undefined) {\n                            dataMin = Number.MAX_VALUE;\n                            dataMax = Number.MIN_VALUE;\n                            each(chart.series, function(series) {\n                                var xData = series.xData; // reassign it to the last item\n                                dataMin = Math.min(xData[0], dataMin);\n                                dataMax = Math.max(xData[xData.length - 1], dataMax);\n                            });\n                            redraw = false;\n                        }\n                        ytdExtremes = rangeSelector.getYTDExtremes(dataMax, dataMin, useUTC);\n                        newMin = rangeMin = ytdExtremes.min;\n                        newMax = ytdExtremes.max;\n\n                        // \"ytd\" is pre-selected. We don't yet have access to processed point and extremes data\n                        // (things like pointStart and pointInterval are missing), so we delay the process (#942)\n                    } else {\n                        addEvent(chart, 'beforeRender', function() {\n                            rangeSelector.clickButton(i);\n                        });\n                        return;\n                    }\n                } else if (type === 'all' && baseAxis) {\n                    newMin = dataMin;\n                    newMax = dataMax;\n                }\n                rangeSelector.setSelected(i);\n\n                // Update the chart\n                if (!baseAxis) {\n                    // Axis not yet instanciated. Temporarily set min and range\n                    // options and remove them on chart load (#4317).\n                    baseXAxisOptions = splat(chart.options.xAxis)[0];\n                    rangeSetting = baseXAxisOptions.range;\n                    baseXAxisOptions.range = range;\n                    minSetting = baseXAxisOptions.min;\n                    baseXAxisOptions.min = rangeMin;\n                    addEvent(chart, 'load', function resetMinAndRange() {\n                        baseXAxisOptions.range = rangeSetting;\n                        baseXAxisOptions.min = minSetting;\n                    });\n                } else {\n                    // Existing axis object. Set extremes after render time.\n                    baseAxis.setExtremes(\n                        newMin,\n                        newMax,\n                        pick(redraw, 1),\n                        null, // auto animation\n                        {\n                            trigger: 'rangeSelectorButton',\n                            rangeSelectorButton: rangeOptions\n                        }\n                    );\n                }\n            },\n\n            /**\n             * Set the selected option. This method only sets the internal flag, it doesn't\n             * update the buttons or the actual zoomed range.\n             */\n            setSelected: function(selected) {\n                this.selected = this.options.selected = selected;\n            },\n\n            /**\n             * The default buttons for pre-selecting time frames\n             */\n            defaultButtons: [{\n                type: 'month',\n                count: 1,\n                text: '1m'\n            }, {\n                type: 'month',\n                count: 3,\n                text: '3m'\n            }, {\n                type: 'month',\n                count: 6,\n                text: '6m'\n            }, {\n                type: 'ytd',\n                text: 'YTD'\n            }, {\n                type: 'year',\n                count: 1,\n                text: '1y'\n            }, {\n                type: 'all',\n                text: 'All'\n            }],\n\n            /**\n             * Initialize the range selector\n             */\n            init: function(chart) {\n                var rangeSelector = this,\n                    options = chart.options.rangeSelector,\n                    buttonOptions = options.buttons || [].concat(rangeSelector.defaultButtons),\n                    selectedOption = options.selected,\n                    blurInputs = function() {\n                        var minInput = rangeSelector.minInput,\n                            maxInput = rangeSelector.maxInput;\n                        if (minInput && minInput.blur) { //#3274 in some case blur is not defined\n                            fireEvent(minInput, 'blur'); //#3274\n                        }\n                        if (maxInput && maxInput.blur) { //#3274 in some case blur is not defined\n                            fireEvent(maxInput, 'blur'); //#3274\n                        }\n                    };\n\n                rangeSelector.chart = chart;\n                rangeSelector.options = options;\n                rangeSelector.buttons = [];\n\n                chart.extraTopMargin = options.height;\n                rangeSelector.buttonOptions = buttonOptions;\n\n                this.unMouseDown = addEvent(chart.container, 'mousedown', blurInputs);\n                this.unResize = addEvent(chart, 'resize', blurInputs);\n\n                // Extend the buttonOptions with actual range\n                each(buttonOptions, rangeSelector.computeButtonRange);\n\n                // zoomed range based on a pre-selected button index\n                if (selectedOption !== undefined && buttonOptions[selectedOption]) {\n                    this.clickButton(selectedOption, false);\n                }\n\n\n                addEvent(chart, 'load', function() {\n                    // If a data grouping is applied to the current button, release it when extremes change\n                    addEvent(chart.xAxis[0], 'setExtremes', function(e) {\n                        if (this.max - this.min !== chart.fixedRange && e.trigger !== 'rangeSelectorButton' &&\n                            e.trigger !== 'updatedData' && rangeSelector.forcedDataGrouping) {\n                            this.setDataGrouping(false, false);\n                        }\n                    });\n                });\n            },\n\n            /**\n             * Dynamically update the range selector buttons after a new range has been set\n             */\n            updateButtonStates: function() {\n                var rangeSelector = this,\n                    chart = this.chart,\n                    baseAxis = chart.xAxis[0],\n                    actualRange = Math.round(baseAxis.max - baseAxis.min),\n                    hasNoData = !baseAxis.hasVisibleSeries,\n                    day = 24 * 36e5, // A single day in milliseconds\n                    unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis,\n                    dataMin = unionExtremes.dataMin,\n                    dataMax = unionExtremes.dataMax,\n                    ytdExtremes = rangeSelector.getYTDExtremes(dataMax, dataMin, useUTC),\n                    ytdMin = ytdExtremes.min,\n                    ytdMax = ytdExtremes.max,\n                    selected = rangeSelector.selected,\n                    selectedExists = isNumber(selected),\n                    allButtonsEnabled = rangeSelector.options.allButtonsEnabled,\n                    buttons = rangeSelector.buttons;\n\n                each(rangeSelector.buttonOptions, function(rangeOptions, i) {\n                    var range = rangeOptions._range,\n                        type = rangeOptions.type,\n                        count = rangeOptions.count || 1,\n                        button = buttons[i],\n                        state = 0,\n                        disable,\n                        select,\n                        isSelected = i === selected,\n                        // Disable buttons where the range exceeds what is allowed in the current view\n                        isTooGreatRange = range > dataMax - dataMin,\n                        // Disable buttons where the range is smaller than the minimum range\n                        isTooSmallRange = range < baseAxis.minRange,\n                        // Do not select the YTD button if not explicitly told so\n                        isYTDButNotSelected = false,\n                        // Disable the All button if we're already showing all\n                        isAllButAlreadyShowingAll = false,\n                        isSameRange = range === actualRange;\n                    // Months and years have a variable range so we check the extremes\n                    if (\n                        (type === 'month' || type === 'year') &&\n                        (actualRange >= {\n                            month: 28,\n                            year: 365\n                        }[type] * day * count) &&\n                        (actualRange <= {\n                            month: 31,\n                            year: 366\n                        }[type] * day * count)\n                    ) {\n                        isSameRange = true;\n                    } else if (type === 'ytd') {\n                        isSameRange = (ytdMax - ytdMin) === actualRange;\n                        isYTDButNotSelected = !isSelected;\n                    } else if (type === 'all') {\n                        isSameRange = baseAxis.max - baseAxis.min >= dataMax - dataMin;\n                        isAllButAlreadyShowingAll = !isSelected && selectedExists && isSameRange;\n                    }\n                    // The new zoom area happens to match the range for a button - mark it selected.\n                    // This happens when scrolling across an ordinal gap. It can be seen in the intraday\n                    // demos when selecting 1h and scroll across the night gap.\n                    disable = (!allButtonsEnabled &&\n                        (\n                            isTooGreatRange ||\n                            isTooSmallRange ||\n                            isAllButAlreadyShowingAll ||\n                            hasNoData\n                        )\n                    );\n                    select = (\n                        (isSelected && isSameRange) ||\n                        (isSameRange && !selectedExists && !isYTDButNotSelected)\n                    );\n\n                    if (disable) {\n                        state = 3;\n                    } else if (select) {\n                        selectedExists = true; // Only one button can be selected\n                        state = 2;\n                    }\n\n                    // If state has changed, update the button\n                    if (button.state !== state) {\n                        button.setState(state);\n                    }\n                });\n            },\n\n            /**\n             * Compute and cache the range for an individual button\n             */\n            computeButtonRange: function(rangeOptions) {\n                var type = rangeOptions.type,\n                    count = rangeOptions.count || 1,\n\n                    // these time intervals have a fixed number of milliseconds, as opposed\n                    // to month, ytd and year\n                    fixedTimes = {\n                        millisecond: 1,\n                        second: 1000,\n                        minute: 60 * 1000,\n                        hour: 3600 * 1000,\n                        day: 24 * 3600 * 1000,\n                        week: 7 * 24 * 3600 * 1000\n                    };\n\n                // Store the range on the button object\n                if (fixedTimes[type]) {\n                    rangeOptions._range = fixedTimes[type] * count;\n                } else if (type === 'month' || type === 'year') {\n                    rangeOptions._range = {\n                        month: 30,\n                        year: 365\n                    }[type] * 24 * 36e5 * count;\n                }\n            },\n\n            /**\n             * Set the internal and displayed value of a HTML input for the dates\n             * @param {String} name\n             * @param {Number} time\n             */\n            setInputValue: function(name, time) {\n                var options = this.chart.options.rangeSelector,\n                    input = this[name + 'Input'];\n\n                if (defined(time)) {\n                    input.previousValue = input.HCTime;\n                    input.HCTime = time;\n                }\n\n                input.value = dateFormat(\n                    options.inputEditDateFormat || '%Y-%m-%d',\n                    input.HCTime\n                );\n                this[name + 'DateBox'].attr({\n                    text: dateFormat(options.inputDateFormat || '%b %e, %Y', input.HCTime)\n                });\n            },\n\n            showInput: function(name) {\n                var inputGroup = this.inputGroup,\n                    dateBox = this[name + 'DateBox'];\n\n                css(this[name + 'Input'], {\n                    left: (inputGroup.translateX + dateBox.x) + 'px',\n                    top: inputGroup.translateY + 'px',\n                    width: (dateBox.width - 2) + 'px',\n                    height: (dateBox.height - 2) + 'px',\n                    border: '2px solid silver'\n                });\n            },\n\n            hideInput: function(name) {\n                css(this[name + 'Input'], {\n                    border: 0,\n                    width: '1px',\n                    height: '1px'\n                });\n                this.setInputValue(name);\n            },\n\n            /**\n             * Draw either the 'from' or the 'to' HTML input box of the range selector\n             * @param {Object} name\n             */\n            drawInput: function(name) {\n                var rangeSelector = this,\n                    chart = rangeSelector.chart,\n                    chartStyle = chart.renderer.style || {},\n                    renderer = chart.renderer,\n                    options = chart.options.rangeSelector,\n                    lang = defaultOptions.lang,\n                    div = rangeSelector.div,\n                    isMin = name === 'min',\n                    input,\n                    label,\n                    dateBox,\n                    inputGroup = this.inputGroup;\n\n                function updateExtremes() {\n                    var inputValue = input.value,\n                        value = (options.inputDateParser || Date.parse)(inputValue),\n                        chartAxis = chart.xAxis[0],\n                        dataAxis = chart.scroller && chart.scroller.xAxis ? chart.scroller.xAxis : chartAxis,\n                        dataMin = dataAxis.dataMin,\n                        dataMax = dataAxis.dataMax;\n                    if (value !== input.previousValue) {\n                        input.previousValue = value;\n                        // If the value isn't parsed directly to a value by the browser's Date.parse method,\n                        // like YYYY-MM-DD in IE, try parsing it a different way\n                        if (!isNumber(value)) {\n                            value = inputValue.split('-');\n                            value = Date.UTC(pInt(value[0]), pInt(value[1]) - 1, pInt(value[2]));\n                        }\n\n                        if (isNumber(value)) {\n\n                            // Correct for timezone offset (#433)\n                            if (!useUTC) {\n                                value = value + new Date().getTimezoneOffset() * 60 * 1000;\n                            }\n\n                            // Validate the extremes. If it goes beyound the data min or max, use the\n                            // actual data extreme (#2438).\n                            if (isMin) {\n                                if (value > rangeSelector.maxInput.HCTime) {\n                                    value = undefined;\n                                } else if (value < dataMin) {\n                                    value = dataMin;\n                                }\n                            } else {\n                                if (value < rangeSelector.minInput.HCTime) {\n                                    value = undefined;\n                                } else if (value > dataMax) {\n                                    value = dataMax;\n                                }\n                            }\n\n                            // Set the extremes\n                            if (value !== undefined) {\n                                chartAxis.setExtremes(\n                                    isMin ? value : chartAxis.min,\n                                    isMin ? chartAxis.max : value,\n                                    undefined,\n                                    undefined, {\n                                        trigger: 'rangeSelectorInput'\n                                    }\n                                );\n                            }\n                        }\n                    }\n                }\n\n                // Create the text label\n                this[name + 'Label'] = label = renderer.label(lang[isMin ? 'rangeSelectorFrom' : 'rangeSelectorTo'], this.inputGroup.offset)\n                    .addClass('highcharts-range-label')\n                    .attr({\n                        padding: 2\n                    })\n                    .add(inputGroup);\n                inputGroup.offset += label.width + 5;\n\n                // Create an SVG label that shows updated date ranges and and records click events that\n                // bring in the HTML input.\n                this[name + 'DateBox'] = dateBox = renderer.label('', inputGroup.offset)\n                    .addClass('highcharts-range-input')\n                    .attr({\n                        padding: 2,\n                        width: options.inputBoxWidth || 90,\n                        height: options.inputBoxHeight || 17,\n                        stroke: options.inputBoxBorderColor || '#cccccc',\n                        'stroke-width': 1,\n                        'text-align': 'center'\n                    })\n                    .on('click', function() {\n                        rangeSelector.showInput(name); // If it is already focused, the onfocus event doesn't fire (#3713)\n                        rangeSelector[name + 'Input'].focus();\n                    })\n                    .add(inputGroup);\n                inputGroup.offset += dateBox.width + (isMin ? 10 : 0);\n\n\n                // Create the HTML input element. This is rendered as 1x1 pixel then set to the right size\n                // when focused.\n                this[name + 'Input'] = input = createElement('input', {\n                    name: name,\n                    className: 'highcharts-range-selector',\n                    type: 'text'\n                }, {\n                    top: chart.plotTop + 'px' // prevent jump on focus in Firefox\n                }, div);\n\n\n\n                // Blow up the input box\n                input.onfocus = function() {\n                    rangeSelector.showInput(name);\n                };\n                // Hide away the input box\n                input.onblur = function() {\n                    rangeSelector.hideInput(name);\n                };\n\n                // handle changes in the input boxes\n                input.onchange = updateExtremes;\n\n                input.onkeypress = function(event) {\n                    // IE does not fire onchange on enter\n                    if (event.keyCode === 13) {\n                        updateExtremes();\n                    }\n                };\n            },\n\n            /**\n             * Get the position of the range selector buttons and inputs. This can be overridden from outside for custom positioning.\n             */\n            getPosition: function() {\n                var chart = this.chart,\n                    options = chart.options.rangeSelector,\n                    buttonTop = pick((options.buttonPosition || {}).y, chart.plotTop - chart.axisOffset[0] - options.height);\n\n                return {\n                    buttonTop: buttonTop,\n                    inputTop: buttonTop - 10\n                };\n            },\n            /**\n             * Get the extremes of YTD. \n             * Will choose dataMax if its value is lower than the current timestamp.\n             * Will choose dataMin if its value is higher than the timestamp for\n             * \tthe start of current year.\n             * @param  {number} dataMax\n             * @param  {number} dataMin\n             * @return {object} Returns min and max for the YTD\n             */\n            getYTDExtremes: function(dataMax, dataMin, useUTC) {\n                var min,\n                    now = new HCDate(dataMax),\n                    year = now[HCDate.hcGetFullYear](),\n                    startOfYear = useUTC ? HCDate.UTC(year, 0, 1) : +new HCDate(year, 0, 1); // eslint-disable-line new-cap\n                min = Math.max(dataMin || 0, startOfYear);\n                now = now.getTime();\n                return {\n                    max: Math.min(dataMax || now, now),\n                    min: min\n                };\n            },\n\n            /**\n             * Render the range selector including the buttons and the inputs. The first time render\n             * is called, the elements are created and positioned. On subsequent calls, they are\n             * moved and updated.\n             * @param {Number} min X axis minimum\n             * @param {Number} max X axis maximum\n             */\n            render: function(min, max) {\n\n                var rangeSelector = this,\n                    chart = rangeSelector.chart,\n                    renderer = chart.renderer,\n                    container = chart.container,\n                    chartOptions = chart.options,\n                    navButtonOptions = chartOptions.exporting && chartOptions.exporting.enabled !== false &&\n                    chartOptions.navigation && chartOptions.navigation.buttonOptions,\n                    options = chartOptions.rangeSelector,\n                    buttons = rangeSelector.buttons,\n                    lang = defaultOptions.lang,\n                    div = rangeSelector.div,\n                    inputGroup = rangeSelector.inputGroup,\n                    buttonTheme = options.buttonTheme,\n                    buttonPosition = options.buttonPosition || {},\n                    inputEnabled = options.inputEnabled,\n                    states = buttonTheme && buttonTheme.states,\n                    plotLeft = chart.plotLeft,\n                    buttonLeft,\n                    pos = this.getPosition(),\n                    buttonGroup = rangeSelector.group,\n                    buttonBBox,\n                    rendered = rangeSelector.rendered;\n\n                if (options.enabled === false) {\n                    return;\n                }\n\n                // create the elements\n                if (!rendered) {\n\n                    rangeSelector.group = buttonGroup = renderer.g('range-selector-buttons').add();\n\n                    rangeSelector.zoomText = renderer.text(lang.rangeSelectorZoom, pick(buttonPosition.x, plotLeft), 15)\n                        .css(options.labelStyle)\n                        .add(buttonGroup);\n\n                    // button starting position\n                    buttonLeft = pick(buttonPosition.x, plotLeft) + rangeSelector.zoomText.getBBox().width + 5;\n\n                    each(rangeSelector.buttonOptions, function(rangeOptions, i) {\n                        buttons[i] = renderer.button(\n                                rangeOptions.text,\n                                buttonLeft,\n                                0,\n                                function() {\n                                    rangeSelector.clickButton(i);\n                                    rangeSelector.isActive = true;\n                                },\n                                buttonTheme,\n                                states && states.hover,\n                                states && states.select,\n                                states && states.disabled\n                            )\n                            .attr({\n                                'text-align': 'center'\n                            })\n                            .add(buttonGroup);\n\n                        // increase button position for the next button\n                        buttonLeft += buttons[i].width + pick(options.buttonSpacing, 5);\n                    });\n\n                    // first create a wrapper outside the container in order to make\n                    // the inputs work and make export correct\n                    if (inputEnabled !== false) {\n                        rangeSelector.div = div = createElement('div', null, {\n                            position: 'relative',\n                            height: 0,\n                            zIndex: 1 // above container\n                        });\n\n                        container.parentNode.insertBefore(div, container);\n\n                        // Create the group to keep the inputs\n                        rangeSelector.inputGroup = inputGroup = renderer.g('input-group')\n                            .add();\n                        inputGroup.offset = 0;\n\n                        rangeSelector.drawInput('min');\n                        rangeSelector.drawInput('max');\n                    }\n                }\n                rangeSelector.updateButtonStates();\n\n                // Set or update the group position\n                buttonGroup[rendered ? 'animate' : 'attr']({\n                    translateY: pos.buttonTop\n                });\n\n                if (inputEnabled !== false) {\n\n                    // Update the alignment to the updated spacing box\n                    inputGroup.align(extend({\n                        y: pos.inputTop,\n                        width: inputGroup.offset,\n                        // Detect collision with the exporting buttons\n                        x: navButtonOptions && (pos.inputTop < (navButtonOptions.y || 0) + navButtonOptions.height - chart.spacing[0]) ?\n                            -40 : 0\n                    }, options.inputPosition), true, chart.spacingBox);\n\n                    // Hide if overlapping - inputEnabled is null or undefined\n                    if (!defined(inputEnabled)) {\n                        buttonBBox = buttonGroup.getBBox();\n                        inputGroup[inputGroup.alignAttr.translateX < buttonBBox.x + buttonBBox.width + 10 ? 'hide' : 'show']();\n                    }\n\n                    // Set or reset the input values\n                    rangeSelector.setInputValue('min', min);\n                    rangeSelector.setInputValue('max', max);\n                }\n\n                rangeSelector.rendered = true;\n            },\n\n            /**\n             * Update the range selector with new options\n             */\n            update: function(options) {\n                var chart = this.chart;\n                merge(true, chart.options.rangeSelector, options);\n                this.destroy();\n                this.init(chart);\n            },\n\n            /**\n             * Destroys allocated elements.\n             */\n            destroy: function() {\n                var rSelector = this,\n                    minInput = rSelector.minInput,\n                    maxInput = rSelector.maxInput;\n\n                rSelector.unMouseDown();\n                rSelector.unResize();\n\n                // Destroy elements in collections\n                destroyObjectProperties(rSelector.buttons);\n\n                // Clear input element events\n                if (minInput) {\n                    minInput.onfocus = minInput.onblur = minInput.onchange = null;\n                }\n                if (maxInput) {\n                    maxInput.onfocus = maxInput.onblur = maxInput.onchange = null;\n                }\n\n                // Destroy HTML and SVG elements\n                H.objectEach(rSelector, function(val, key) {\n                    if (val && key !== 'chart') {\n                        if (val.destroy) { // SVGElement\n                            val.destroy();\n                        } else if (val.nodeType) { // HTML element\n                            discardElement(this[key]);\n                        }\n                    }\n                    if (val !== RangeSelector.prototype[key]) {\n                        rSelector[key] = null;\n                    }\n                }, this);\n            }\n        };\n\n        /**\n         * Add logic to normalize the zoomed range in order to preserve the pressed state of range selector buttons\n         */\n        Axis.prototype.toFixedRange = function(pxMin, pxMax, fixedMin, fixedMax) {\n            var fixedRange = this.chart && this.chart.fixedRange,\n                newMin = pick(fixedMin, this.translate(pxMin, true, !this.horiz)),\n                newMax = pick(fixedMax, this.translate(pxMax, true, !this.horiz)),\n                changeRatio = fixedRange && (newMax - newMin) / fixedRange;\n\n            // If the difference between the fixed range and the actual requested range is\n            // too great, the user is dragging across an ordinal gap, and we need to release\n            // the range selector button.\n            if (changeRatio > 0.7 && changeRatio < 1.3) {\n                if (fixedMax) {\n                    newMin = newMax - fixedRange;\n                } else {\n                    newMax = newMin + fixedRange;\n                }\n            }\n            if (!isNumber(newMin)) { // #1195\n                newMin = newMax = undefined;\n            }\n\n            return {\n                min: newMin,\n                max: newMax\n            };\n        };\n\n        /**\n         * Get the axis min value based on the range option and the current max. For\n         * stock charts this is extended via the {@link RangeSelector} so that if the\n         * selected range is a multiple of months or years, it is compensated for\n         * various month lengths.\n         * \n         * @return {number} The new minimum value.\n         */\n        Axis.prototype.minFromRange = function() {\n            var rangeOptions = this.range,\n                type = rangeOptions.type,\n                timeName = {\n                    month: 'Month',\n                    year: 'FullYear'\n                }[type],\n                min,\n                max = this.max,\n                dataMin,\n                range,\n                // Get the true range from a start date\n                getTrueRange = function(base, count) {\n                    var date = new Date(base),\n                        basePeriod = date['get' + timeName]();\n\n                    date['set' + timeName](basePeriod + count);\n\n                    if (basePeriod === date['get' + timeName]()) {\n                        date.setDate(0); // #6537\n                    }\n\n                    return date.getTime() - base;\n                };\n\n            if (isNumber(rangeOptions)) {\n                min = max - rangeOptions;\n                range = rangeOptions;\n            } else {\n                min = max + getTrueRange(max, -rangeOptions.count);\n\n                // Let the fixedRange reflect initial settings (#5930)\n                if (this.chart) {\n                    this.chart.fixedRange = max - min;\n                }\n            }\n\n            dataMin = pick(this.dataMin, Number.MIN_VALUE);\n            if (!isNumber(min)) {\n                min = dataMin;\n            }\n            if (min <= dataMin) {\n                min = dataMin;\n                if (range === undefined) { // #4501\n                    range = getTrueRange(min, rangeOptions.count);\n                }\n                this.newMax = Math.min(min + range, this.dataMax);\n            }\n            if (!isNumber(max)) {\n                min = undefined;\n            }\n            return min;\n\n        };\n\n        // Initialize scroller for stock charts\n        wrap(Chart.prototype, 'init', function(proceed, options, callback) {\n\n            addEvent(this, 'init', function() {\n                if (this.options.rangeSelector.enabled) {\n                    this.rangeSelector = new RangeSelector(this);\n                }\n            });\n\n            proceed.call(this, options, callback);\n\n        });\n\n        Chart.prototype.callbacks.push(function(chart) {\n            var extremes,\n                rangeSelector = chart.rangeSelector,\n                unbindRender,\n                unbindSetExtremes;\n\n            function renderRangeSelector() {\n                extremes = chart.xAxis[0].getExtremes();\n                if (isNumber(extremes.min)) {\n                    rangeSelector.render(extremes.min, extremes.max);\n                }\n            }\n\n            if (rangeSelector) {\n                // redraw the scroller on setExtremes\n                unbindSetExtremes = addEvent(\n                    chart.xAxis[0],\n                    'afterSetExtremes',\n                    function(e) {\n                        rangeSelector.render(e.min, e.max);\n                    }\n                );\n\n                // redraw the scroller chart resize\n                unbindRender = addEvent(chart, 'redraw', renderRangeSelector);\n\n                // do it now\n                renderRangeSelector();\n            }\n\n            // Remove resize/afterSetExtremes at chart destroy\n            addEvent(chart, 'destroy', function destroyEvents() {\n                if (rangeSelector) {\n                    unbindRender();\n                    unbindSetExtremes();\n                }\n            });\n        });\n\n\n        H.RangeSelector = RangeSelector;\n\n        /* ****************************************************************************\n         * End Range Selector code\t\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            grep = H.grep,\n            inArray = H.inArray,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            map = H.map,\n            merge = H.merge,\n            pick = H.pick,\n            Point = H.Point,\n            Renderer = H.Renderer,\n            Series = H.Series,\n            splat = H.splat,\n            SVGRenderer = H.SVGRenderer,\n            VMLRenderer = H.VMLRenderer,\n            wrap = H.wrap,\n\n\n            seriesProto = Series.prototype,\n            seriesInit = seriesProto.init,\n            seriesProcessData = seriesProto.processData,\n            pointTooltipFormatter = Point.prototype.tooltipFormatter;\n\n        /**\n         * Factory function for creating new stock charts. Creates a new {@link Chart|\n         * Chart} object with different default options than the basic Chart.\n         * \n         * @function #stockChart\n         * @memberOf Highcharts\n         *\n         * @param  {String|HTMLDOMElement} renderTo\n         *         The DOM element to render to, or its id.\n         * @param  {Options} options\n         *         The chart options structure as described in the {@link\n         *         https://api.highcharts.com/highstock|options reference}.\n         * @param  {Function} callback\n         *         A function to execute when the chart object is finished loading and\n         *         rendering. In most cases the chart is built in one thread, but in\n         *         Internet Explorer version 8 or less the chart is sometimes initiated\n         *         before the document is ready, and in these cases the chart object\n         *         will not be finished synchronously. As a consequence, code that\n         *         relies on the newly built Chart object should always run in the\n         *         callback. Defining a {@link https://api.highcharts.com/highstock/chart.events.load|\n         *         chart.event.load} handler is equivalent.\n         *\n         * @return {Chart}\n         *         The chart object.\n         *\n         * @example\n         * var chart = Highcharts.stockChart('container', {\n         *     series: [{\n         *         data: [1, 2, 3, 4, 5, 6, 7, 8, 9],\n         *         pointInterval: 24 * 60 * 60 * 1000\n         *     }]\n         * });\n         */\n        H.StockChart = H.stockChart = function(a, b, c) {\n            var hasRenderToArg = isString(a) || a.nodeName,\n                options = arguments[hasRenderToArg ? 1 : 0],\n                seriesOptions = options.series, // to increase performance, don't merge the data\n                defaultOptions = H.getOptions(),\n                opposite,\n\n                // Always disable startOnTick:true on the main axis when the navigator\n                // is enabled (#1090)\n                navigatorEnabled = pick(\n                    options.navigator && options.navigator.enabled,\n                    defaultOptions.navigator.enabled,\n                    true\n                ),\n                disableStartOnTick = navigatorEnabled ? {\n                    startOnTick: false,\n                    endOnTick: false\n                } : null,\n\n                lineOptions = {\n\n                    marker: {\n                        enabled: false,\n                        radius: 2\n                    }\n                    // gapSize: 0\n                },\n                columnOptions = {\n                    shadow: false,\n                    borderWidth: 0\n                };\n\n            // apply X axis options to both single and multi y axes\n            options.xAxis = map(splat(options.xAxis || {}), function(xAxisOptions) {\n                return merge({ // defaults\n                        minPadding: 0,\n                        maxPadding: 0,\n                        ordinal: true,\n                        title: {\n                            text: null\n                        },\n                        labels: {\n                            overflow: 'justify'\n                        },\n                        showLastLabel: true\n                    },\n                    defaultOptions.xAxis, // #3802\n                    xAxisOptions, // user options\n                    { // forced options\n                        type: 'datetime',\n                        categories: null\n                    },\n                    disableStartOnTick\n                );\n            });\n\n            // apply Y axis options to both single and multi y axes\n            options.yAxis = map(splat(options.yAxis || {}), function(yAxisOptions) {\n                opposite = pick(yAxisOptions.opposite, true);\n                return merge({ // defaults\n                        labels: {\n                            y: -2\n                        },\n                        opposite: opposite,\n                        showLastLabel: false,\n                        title: {\n                            text: null\n                        }\n                    },\n                    defaultOptions.yAxis, // #3802\n                    yAxisOptions // user options\n                );\n            });\n\n            options.series = null;\n\n            options = merge({\n                    chart: {\n                        panning: true,\n                        pinchType: 'x'\n                    },\n                    navigator: {\n                        enabled: navigatorEnabled\n                    },\n                    scrollbar: {\n                        // #4988 - check if setOptions was called\n                        enabled: pick(defaultOptions.scrollbar.enabled, true)\n                    },\n                    rangeSelector: {\n                        // #4988 - check if setOptions was called\n                        enabled: pick(defaultOptions.rangeSelector.enabled, true)\n                    },\n                    title: {\n                        text: null\n                    },\n                    tooltip: {\n                        shared: true,\n                        crosshairs: true\n                    },\n                    legend: {\n                        enabled: false\n                    },\n\n                    plotOptions: {\n                        line: lineOptions,\n                        spline: lineOptions,\n                        area: lineOptions,\n                        areaspline: lineOptions,\n                        arearange: lineOptions,\n                        areasplinerange: lineOptions,\n                        column: columnOptions,\n                        columnrange: columnOptions,\n                        candlestick: columnOptions,\n                        ohlc: columnOptions\n                    }\n\n                },\n\n                options, // user's options\n\n                { // forced options\n                    isStock: true // internal flag\n                }\n            );\n\n            options.series = seriesOptions;\n\n            return hasRenderToArg ?\n                new Chart(a, options, c) :\n                new Chart(options, b);\n        };\n\n        // Override the automatic label alignment so that the first Y axis' labels\n        // are drawn on top of the grid line, and subsequent axes are drawn outside\n        wrap(Axis.prototype, 'autoLabelAlign', function(proceed) {\n            var chart = this.chart,\n                options = this.options,\n                panes = chart._labelPanes = chart._labelPanes || {},\n                key,\n                labelOptions = this.options.labels;\n            if (this.chart.options.isStock && this.coll === 'yAxis') {\n                key = options.top + ',' + options.height;\n                if (!panes[key] && labelOptions.enabled) { // do it only for the first Y axis of each pane\n                    if (labelOptions.x === 15) { // default\n                        labelOptions.x = 0;\n                    }\n                    if (labelOptions.align === undefined) {\n                        labelOptions.align = 'right';\n                    }\n                    panes[key] = this;\n                    return 'right';\n                }\n            }\n            return proceed.call(this, [].slice.call(arguments, 1));\n        });\n\n        // Clear axis from label panes (#6071)\n        wrap(Axis.prototype, 'destroy', function(proceed) {\n            var chart = this.chart,\n                key = this.options && (this.options.top + ',' + this.options.height);\n\n            if (key && chart._labelPanes && chart._labelPanes[key] === this) {\n                delete chart._labelPanes[key];\n            }\n\n            return proceed.call(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        // Override getPlotLinePath to allow for multipane charts\n        wrap(Axis.prototype, 'getPlotLinePath', function(proceed, value, lineWidth, old, force, translatedValue) {\n            var axis = this,\n                series = (this.isLinked && !this.series ? this.linkedParent.series : this.series),\n                chart = axis.chart,\n                renderer = chart.renderer,\n                axisLeft = axis.left,\n                axisTop = axis.top,\n                x1,\n                y1,\n                x2,\n                y2,\n                result = [],\n                axes = [], //#3416 need a default array\n                axes2,\n                uniqueAxes,\n                transVal;\n\n            /**\n             * Return the other axis based on either the axis option or on related series.\n             */\n            function getAxis(coll) {\n                var otherColl = coll === 'xAxis' ? 'yAxis' : 'xAxis',\n                    opt = axis.options[otherColl];\n\n                // Other axis indexed by number\n                if (isNumber(opt)) {\n                    return [chart[otherColl][opt]];\n                }\n\n                // Other axis indexed by id (like navigator)\n                if (isString(opt)) {\n                    return [chart.get(opt)];\n                }\n\n                // Auto detect based on existing series\n                return map(series, function(s) {\n                    return s[otherColl];\n                });\n            }\n\n            // Ignore in case of colorAxis or zAxis. #3360, #3524, #6720\n            if (axis.coll !== 'xAxis' && axis.coll !== 'yAxis') {\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            }\n\n            // Get the related axes based on series\n            axes = getAxis(axis.coll);\n\n            // Get the related axes based options.*Axis setting #2810\n            axes2 = (axis.isXAxis ? chart.yAxis : chart.xAxis);\n            each(axes2, function(A) {\n                if (defined(A.options.id) ? A.options.id.indexOf('navigator') === -1 : true) {\n                    var a = (A.isXAxis ? 'yAxis' : 'xAxis'),\n                        rax = (defined(A.options[a]) ? chart[a][A.options[a]] : chart[a][0]);\n\n                    if (axis === rax) {\n                        axes.push(A);\n                    }\n                }\n            });\n\n\n            // Remove duplicates in the axes array. If there are no axes in the axes array,\n            // we are adding an axis without data, so we need to populate this with grid\n            // lines (#2796).\n            uniqueAxes = axes.length ? [] : [axis.isXAxis ? chart.yAxis[0] : chart.xAxis[0]]; //#3742\n            each(axes, function(axis2) {\n                if (\n                    inArray(axis2, uniqueAxes) === -1 &&\n                    // Do not draw on axis which overlap completely. #5424\n                    !H.find(uniqueAxes, function(unique) {\n                        return unique.pos === axis2.pos && unique.len && axis2.len;\n                    })\n                ) {\n                    uniqueAxes.push(axis2);\n                }\n            });\n\n            transVal = pick(translatedValue, axis.translate(value, null, null, old));\n            if (isNumber(transVal)) {\n                if (axis.horiz) {\n                    each(uniqueAxes, function(axis2) {\n                        var skip;\n\n                        y1 = axis2.pos;\n                        y2 = y1 + axis2.len;\n                        x1 = x2 = Math.round(transVal + axis.transB);\n\n                        if (x1 < axisLeft || x1 > axisLeft + axis.width) { // outside plot area\n                            if (force) {\n                                x1 = x2 = Math.min(Math.max(axisLeft, x1), axisLeft + axis.width);\n                            } else {\n                                skip = true;\n                            }\n                        }\n                        if (!skip) {\n                            result.push('M', x1, y1, 'L', x2, y2);\n                        }\n                    });\n                } else {\n                    each(uniqueAxes, function(axis2) {\n                        var skip;\n\n                        x1 = axis2.pos;\n                        x2 = x1 + axis2.len;\n                        y1 = y2 = Math.round(axisTop + axis.height - transVal);\n\n                        if (y1 < axisTop || y1 > axisTop + axis.height) { // outside plot area\n                            if (force) {\n                                y1 = y2 = Math.min(Math.max(axisTop, y1), axis.top + axis.height);\n                            } else {\n                                skip = true;\n                            }\n                        }\n                        if (!skip) {\n                            result.push('M', x1, y1, 'L', x2, y2);\n                        }\n                    });\n                }\n            }\n            return result.length > 0 ?\n                renderer.crispPolyLine(result, lineWidth || 1) :\n                null; //#3557 getPlotLinePath in regular Highcharts also returns null\n        });\n\n        // Override getPlotBandPath to allow for multipane charts\n        Axis.prototype.getPlotBandPath = function(from, to) {\n            var toPath = this.getPlotLinePath(to, null, null, true),\n                path = this.getPlotLinePath(from, null, null, true),\n                result = [],\n                i;\n\n            if (path && toPath) {\n                if (path.toString() === toPath.toString()) {\n                    // #6166\n                    result = path;\n                    result.flat = true;\n                } else {\n                    // Go over each subpath\n                    for (i = 0; i < path.length; i += 6) {\n                        result.push(\n                            'M', path[i + 1], path[i + 2],\n                            'L', path[i + 4], path[i + 5],\n                            toPath[i + 4], toPath[i + 5],\n                            toPath[i + 1], toPath[i + 2],\n                            'z'\n                        );\n                    }\n                }\n            } else { // outside the axis area\n                result = null;\n            }\n\n            return result;\n        };\n\n        // Function to crisp a line with multiple segments\n        SVGRenderer.prototype.crispPolyLine = function(points, width) {\n            // points format: ['M', 0, 0, 'L', 100, 0]\t\t\n            // normalize to a crisp line\n            var i;\n            for (i = 0; i < points.length; i = i + 6) {\n                if (points[i + 1] === points[i + 4]) {\n                    // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n                    points[i + 1] = points[i + 4] = Math.round(points[i + 1]) - (width % 2 / 2);\n                }\n                if (points[i + 2] === points[i + 5]) {\n                    points[i + 2] = points[i + 5] = Math.round(points[i + 2]) + (width % 2 / 2);\n                }\n            }\n            return points;\n        };\n\n\n        // Wrapper to hide the label\n        wrap(Axis.prototype, 'hideCrosshair', function(proceed, i) {\n\n            proceed.call(this, i);\n\n            if (this.crossLabel) {\n                this.crossLabel = this.crossLabel.hide();\n            }\n        });\n\n        // Wrapper to draw the label\n        wrap(Axis.prototype, 'drawCrosshair', function(proceed, e, point) {\n\n            // Draw the crosshair\n            proceed.call(this, e, point);\n\n            // Check if the label has to be drawn\n            if (!defined(this.crosshair.label) || !this.crosshair.label.enabled || !this.cross) {\n                return;\n            }\n\n            var chart = this.chart,\n                options = this.options.crosshair.label, // the label's options\n                horiz = this.horiz, // axis orientation\n                opposite = this.opposite, // axis position\n                left = this.left, // left position\n                top = this.top, // top position\n                crossLabel = this.crossLabel, // reference to the svgElement\n                posx,\n                posy,\n                crossBox,\n                formatOption = options.format,\n                formatFormat = '',\n                limit,\n                align,\n                tickInside = this.options.tickPosition === 'inside',\n                snap = this.crosshair.snap !== false,\n                value,\n                offset = 0;\n\n            // Use last available event (#5287)\n            if (!e) {\n                e = this.cross && this.cross.e;\n            }\n\n            align = (horiz ? 'center' : opposite ?\n                (this.labelAlign === 'right' ? 'right' : 'left') :\n                (this.labelAlign === 'left' ? 'left' : 'center'));\n\n            // If the label does not exist yet, create it.\n            if (!crossLabel) {\n                crossLabel = this.crossLabel = chart.renderer.label(null, null, null, options.shape || 'callout')\n                    .addClass('highcharts-crosshair-label' +\n                        (this.series[0] && ' highcharts-color-' + this.series[0].colorIndex))\n                    .attr({\n                        align: options.align || align,\n                        padding: pick(options.padding, 8),\n                        r: pick(options.borderRadius, 3),\n                        zIndex: 2\n                    })\n                    .add(this.labelGroup);\n\n\n            }\n\n            if (horiz) {\n                posx = snap ? point.plotX + left : e.chartX;\n                posy = top + (opposite ? 0 : this.height);\n            } else {\n                posx = opposite ? this.width + left : 0;\n                posy = snap ? point.plotY + top : e.chartY;\n            }\n\n            if (!formatOption && !options.formatter) {\n                if (this.isDatetimeAxis) {\n                    formatFormat = '%b %d, %Y';\n                }\n                formatOption = '{value' + (formatFormat ? ':' + formatFormat : '') + '}';\n            }\n\n            // Show the label\n            value = snap ? point[this.isXAxis ? 'x' : 'y'] : this.toValue(horiz ? e.chartX : e.chartY);\n            crossLabel.attr({\n                text: formatOption ? format(formatOption, {\n                    value: value\n                }) : options.formatter.call(this, value),\n                x: posx,\n                y: posy,\n                visibility: 'visible'\n            });\n\n            crossBox = crossLabel.getBBox();\n\n            // now it is placed we can correct its position\n            if (horiz) {\n                if ((tickInside && !opposite) || (!tickInside && opposite)) {\n                    posy = crossLabel.y - crossBox.height;\n                }\n            } else {\n                posy = crossLabel.y - (crossBox.height / 2);\n            }\n\n            // check the edges\n            if (horiz) {\n                limit = {\n                    left: left - crossBox.x,\n                    right: left + this.width - crossBox.x\n                };\n            } else {\n                limit = {\n                    left: this.labelAlign === 'left' ? left : 0,\n                    right: this.labelAlign === 'right' ? left + this.width : chart.chartWidth\n                };\n            }\n\n            // left edge\n            if (crossLabel.translateX < limit.left) {\n                offset = limit.left - crossLabel.translateX;\n            }\n            // right edge\n            if (crossLabel.translateX + crossBox.width >= limit.right) {\n                offset = -(crossLabel.translateX + crossBox.width - limit.right);\n            }\n\n            // show the crosslabel\n            crossLabel.attr({\n                x: posx + offset,\n                y: posy,\n                // First set x and y, then anchorX and anchorY, when box is actually calculated, #5702\n                anchorX: horiz ? posx : (this.opposite ? 0 : chart.chartWidth),\n                anchorY: horiz ? (this.opposite ? chart.chartHeight : 0) : posy + crossBox.height / 2\n            });\n        });\n\n        /* ****************************************************************************\n         * Start value compare logic\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n\n        /**\n         * Extend series.init by adding a method to modify the y value used for plotting\n         * on the y axis. This method is called both from the axis when finding dataMin\n         * and dataMax, and from the series.translate method.\n         */\n        seriesProto.init = function() {\n\n            // Call base method\n            seriesInit.apply(this, arguments);\n\n            // Set comparison mode\n            this.setCompare(this.options.compare);\n        };\n\n        /**\n         * Highstock only. Set the {@link\n         * http://api.highcharts.com/highstock/plotOptions.series.compare|\n         * compare} mode of the series after render time. In most cases it is more\n         * useful running {@link Axis#setCompare} on the X axis to update all its\n         * series.\n         *\n         * @function setCompare\n         * @memberOf Series.prototype\n         *\n         * @param  {String} compare\n         *         Can be one of `null`, `\"percent\"` or `\"value\"`.\n         */\n        seriesProto.setCompare = function(compare) {\n\n            // Set or unset the modifyValue method\n            this.modifyValue = (compare === 'value' || compare === 'percent') ? function(value, point) {\n                var compareValue = this.compareValue;\n\n                if (value !== undefined && compareValue !== undefined) { // #2601, #5814\n\n                    // Get the modified value\n                    if (compare === 'value') {\n                        value -= compareValue;\n\n                        // Compare percent\n                    } else {\n                        value = 100 * (value / compareValue) -\n                            (this.options.compareBase === 100 ? 0 : 100);\n                    }\n\n                    // record for tooltip etc.\n                    if (point) {\n                        point.change = value;\n                    }\n\n                    return value;\n                }\n            } : null;\n\n            // Survive to export, #5485\n            this.userOptions.compare = compare;\n\n            // Mark dirty\n            if (this.chart.hasRendered) {\n                this.isDirty = true;\n            }\n\n        };\n\n        /**\n         * Extend series.processData by finding the first y value in the plot area,\n         * used for comparing the following values\n         */\n        seriesProto.processData = function() {\n            var series = this,\n                i,\n                keyIndex = -1,\n                processedXData,\n                processedYData,\n                length,\n                compareValue;\n\n            // call base method\n            seriesProcessData.apply(this, arguments);\n\n            if (series.xAxis && series.processedYData) { // not pies\n\n                // local variables\n                processedXData = series.processedXData;\n                processedYData = series.processedYData;\n                length = processedYData.length;\n\n                // For series with more than one value (range, OHLC etc), compare against\n                // close or the pointValKey (#4922, #3112)\n                if (series.pointArrayMap) {\n                    // Use close if present (#3112)\n                    keyIndex = inArray('close', series.pointArrayMap);\n                    if (keyIndex === -1) {\n                        keyIndex = inArray(series.pointValKey || 'y', series.pointArrayMap);\n                    }\n                }\n\n                // find the first value for comparison\n                for (i = 0; i < length - 1; i++) {\n                    compareValue = processedYData[i] && keyIndex > -1 ?\n                        processedYData[i][keyIndex] :\n                        processedYData[i];\n                    if (isNumber(compareValue) && processedXData[i + 1] >= series.xAxis.min && compareValue !== 0) {\n                        series.compareValue = compareValue;\n                        break;\n                    }\n                }\n            }\n        };\n\n        /**\n         * Modify series extremes\n         */\n        wrap(seriesProto, 'getExtremes', function(proceed) {\n            var extremes;\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.modifyValue) {\n                extremes = [this.modifyValue(this.dataMin), this.modifyValue(this.dataMax)];\n                this.dataMin = arrayMin(extremes);\n                this.dataMax = arrayMax(extremes);\n            }\n        });\n\n        /**\n         * Highstock only. Set the compare mode on all series belonging to an Y axis\n         * after render time.\n         *\n         * @param  {String} compare\n         *         The compare mode. Can be one of `null`, `\"value\"` or `\"percent\"`.\n         * @param  {Boolean} [redraw=true]\n         *         Whether to redraw the chart or to wait for a later call to {@link\n         *         Chart#redraw},\n         *\n         * @function setCompare\n         * @memberOf Axis.prototype\n         *\n         * @see    {@link https://api.highcharts.com/highstock/series.plotOptions.compare|\n         *         series.plotOptions.compare}\n         *\n         * @sample stock/members/axis-setcompare/\n         *         Set compoare\n         */\n        Axis.prototype.setCompare = function(compare, redraw) {\n            if (!this.isXAxis) {\n                each(this.series, function(series) {\n                    series.setCompare(compare);\n                });\n                if (pick(redraw, true)) {\n                    this.chart.redraw();\n                }\n            }\n        };\n\n        /**\n         * Extend the tooltip formatter by adding support for the point.change variable\n         * as well as the changeDecimals option\n         */\n        Point.prototype.tooltipFormatter = function(pointFormat) {\n            var point = this;\n\n            pointFormat = pointFormat.replace(\n                '{point.change}',\n                (point.change > 0 ? '+' : '') +\n                H.numberFormat(point.change, pick(point.series.tooltipOptions.changeDecimals, 2))\n            );\n\n            return pointTooltipFormatter.apply(this, [pointFormat]);\n        };\n\n        /* ****************************************************************************\n         * End value compare logic\t\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n\n        /**\n         * Extend the Series prototype to create a separate series clip box. This is\n         * related to using multiple panes, and a future pane logic should incorporate\n         * this feature (#2754).\n         */\n        wrap(Series.prototype, 'render', function(proceed) {\n            // Only do this on not 3d (#2939, #5904) nor polar (#6057) charts, and only\n            // if the series type handles clipping in the animate method (#2975).\n            if (!(this.chart.is3d && this.chart.is3d()) &&\n                !this.chart.polar &&\n                this.xAxis &&\n                !this.xAxis.isRadial // Gauge, #6192\n            ) {\n\n                // First render, initial clip box\n                if (!this.clipBox && this.animate) {\n                    this.clipBox = merge(this.chart.clipBox);\n                    this.clipBox.width = this.xAxis.len;\n                    this.clipBox.height = this.yAxis.len;\n\n                    // On redrawing, resizing etc, update the clip rectangle\n                } else if (this.chart[this.sharedClipKey]) {\n                    this.chart[this.sharedClipKey].attr({\n                        width: this.xAxis.len,\n                        height: this.yAxis.len\n                    });\n                    // #3111\n                } else if (this.clipBox) {\n                    this.clipBox.width = this.xAxis.len;\n                    this.clipBox.height = this.yAxis.len;\n                }\n            }\n            proceed.call(this);\n        });\n\n        wrap(Chart.prototype, 'getSelectedPoints', function(proceed) {\n            var points = proceed.call(this);\n\n            each(this.series, function(serie) {\n                // series.points - for grouped points (#6445)\n                if (serie.hasGroupedData) {\n                    points = points.concat(grep(serie.points || [], function(point) {\n                        return point.selected;\n                    }));\n                }\n            });\n            return points;\n        });\n\n        wrap(Chart.prototype, 'update', function(proceed, options) {\n            // Use case: enabling scrollbar from a disabled state.\n            // Scrollbar needs to be initialized from a controller, Navigator in this\n            // case (#6615)\n            if ('scrollbar' in options && this.navigator) {\n                merge(true, this.options.scrollbar, options.scrollbar);\n                this.navigator.update({}, false);\n                delete options.scrollbar;\n            }\n\n            return proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/treemap.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2014 Highsoft AS\n Authors: Jon Arild Nygard / Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(f){var n=f.seriesType,q=f.seriesTypes,E=f.map,v=f.merge,y=f.extend,z=f.noop,m=f.each,x=f.grep,F=f.isNumber,A=f.isString,k=f.pick,u=f.Series,G=f.stableSort,H=function(a,b,c){c=c||this;f.objectEach(a,function(e,d){b.call(c,e,d,a)})},B=function(a,b,c,e){e=e||this;a=a||[];m(a,function(d,g){c=b.call(e,c,d,g,a)});return c},w=function(a,b,c){c=c||this;a=b.call(c,a);!1!==a&&w(a,b,c)};n(\"treemap\",\"scatter\",\n{showInLegend:!1,marker:!1,dataLabels:{enabled:!0,defer:!1,verticalAlign:\"middle\",formatter:function(){return this.point.name||this.point.id},inside:!0},tooltip:{headerFormat:\"\",pointFormat:\"\\x3cb\\x3e{point.name}\\x3c/b\\x3e: {point.value}\\x3c/b\\x3e\\x3cbr/\\x3e\"},ignoreHiddenPoint:!0,layoutAlgorithm:\"sliceAndDice\",layoutStartingDirection:\"vertical\",alternateStartingDirection:!1,levelIsConstant:!0,drillUpButton:{position:{align:\"right\",x:-10,y:10}}},{pointArrayMap:[\"value\"],axisTypes:q.heatmap?[\"xAxis\",\n\"yAxis\",\"colorAxis\"]:[\"xAxis\",\"yAxis\"],optionalAxis:\"colorAxis\",getSymbol:z,parallelArrays:[\"x\",\"y\",\"value\",\"colorValue\"],colorKey:\"colorValue\",translateColors:q.heatmap&&q.heatmap.prototype.translateColors,trackerGroups:[\"group\",\"dataLabelsGroup\"],getListOfParents:function(a,b){a=B(a,function(a,b,d){b=k(b.parent,\"\");void 0===a[b]&&(a[b]=[]);a[b].push(d);return a},{});H(a,function(a,e,d){\"\"!==e&&-1===f.inArray(e,b)&&(m(a,function(a){d[\"\"].push(a)}),delete d[e])});return a},getTree:function(){var a=\nE(this.data,function(a){return a.id}),a=this.getListOfParents(this.data,a);this.nodeMap=[];return this.buildNode(\"\",-1,0,a,null)},init:function(a,b){u.prototype.init.call(this,a,b);this.options.allowDrillToNode&&f.addEvent(this,\"click\",this.onClickDrillToNode)},buildNode:function(a,b,c,e,d){var g=this,h=[],C=g.points[b],D;m(e[a]||[],function(b){D=g.buildNode(g.points[b].id,b,c+1,e,a);h.push(D)});b={id:a,i:b,children:h,level:c,parent:d,visible:!1};g.nodeMap[b.id]=b;C&&(C.node=b);return b},setTreeValues:function(a){var b=\nthis,c=b.options,e=0,d=[],g,h=b.points[a.i];w(b.nodeMap[b.rootNode],function(a){var c=!1,d=a.parent;a.visible=!0;if(d||\"\"===d)c=b.nodeMap[d];return c});w(b.nodeMap[b.rootNode].children,function(a){var b=!1;m(a,function(a){a.visible=!0;a.children.length&&(b=(b||[]).concat(a.children))});return b});m(a.children,function(a){a=b.setTreeValues(a);d.push(a);a.ignore?w(a.children,function(a){var b=!1;m(a,function(a){y(a,{ignore:!0,isLeaf:!1,visible:!1});a.children.length&&(b=(b||[]).concat(a.children))});\nreturn b}):e+=a.val});G(d,function(a,b){return a.sortIndex-b.sortIndex});g=k(h&&h.options.value,e);h&&(h.value=g);y(a,{children:d,childrenTotal:e,ignore:!(k(h&&h.visible,!0)&&0<g),isLeaf:a.visible&&!e,levelDynamic:c.levelIsConstant?a.level:a.level-b.nodeMap[b.rootNode].level,name:k(h&&h.name,\"\"),sortIndex:k(h&&h.sortIndex,-g),val:g});return a},calculateChildrenAreas:function(a,b){var c=this,e=c.options,d=this.levelMap[a.levelDynamic+1],g=k(c[d&&d.layoutAlgorithm]&&d.layoutAlgorithm,e.layoutAlgorithm),\nh=e.alternateStartingDirection,f=[];a=x(a.children,function(a){return!a.ignore});d&&d.layoutStartingDirection&&(b.direction=\"vertical\"===d.layoutStartingDirection?0:1);f=c[g](b,a);m(a,function(a,d){d=f[d];a.values=v(d,{val:a.childrenTotal,direction:h?1-b.direction:b.direction});a.pointValues=v(d,{x:d.x/c.axisRatio,width:d.width/c.axisRatio});a.children.length&&c.calculateChildrenAreas(a,a.values)})},setPointValues:function(){var a=this.xAxis,b=this.yAxis;m(this.points,function(c){var e=c.node,d=e.pointValues,\ng,h;d&&e.visible?(e=Math.round(a.translate(d.x,0,0,0,1))-0,g=Math.round(a.translate(d.x+d.width,0,0,0,1))-0,h=Math.round(b.translate(d.y,0,0,0,1))-0,d=Math.round(b.translate(d.y+d.height,0,0,0,1))-0,c.shapeType=\"rect\",c.shapeArgs={x:Math.min(e,g),y:Math.min(h,d),width:Math.abs(g-e),height:Math.abs(d-h)},c.plotX=c.shapeArgs.x+c.shapeArgs.width/2,c.plotY=c.shapeArgs.y+c.shapeArgs.height/2):(delete c.plotX,delete c.plotY)})},setColorRecursive:function(a,b,c){var e=this,d,g;a&&(d=e.points[a.i],g=e.levelMap[a.levelDynamic],\nb=k(d&&d.options.color,g&&g.color,b,e.color),c=k(d&&d.options.colorIndex,g&&g.colorIndex,c,e.colorIndex),d&&(d.color=b,d.colorIndex=c),a.children.length&&m(a.children,function(a){e.setColorRecursive(a,b,c)}))},algorithmGroup:function(a,b,c,e){this.height=a;this.width=b;this.plot=e;this.startDirection=this.direction=c;this.lH=this.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,b){return Math.max(a/b,b/a)}};this.addElement=function(a){this.lP.total=\nthis.elArr[this.elArr.length-1];this.total+=a;0===this.direction?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};\nthis.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,b,c,e){var d,g,h,f,k=c.lW,p=c.lH,l=c.plot,n,r=0,t=c.elArr.length-1;b?(k=c.nW,p=c.nH):n=c.elArr[c.elArr.length-1];m(c.elArr,function(a){if(b||r<t)0===c.direction?(d=l.x,g=l.y,h=k,f=a/h):(d=l.x,g=l.y,f=p,h=a/f),e.push({x:d,y:g,width:h,height:f}),0===c.direction?l.y+=f:l.x+=h;r+=1});c.reset();0===c.direction?c.width-=k:c.height-=p;l.y=l.parent.y+(l.parent.height-c.height);l.x=l.parent.x+(l.parent.width-\nc.width);a&&(c.direction=1-c.direction);b||c.addElement(n)},algorithmLowAspectRatio:function(a,b,c){var e=[],d=this,g,h={x:b.x,y:b.y,parent:b},f=0,k=c.length-1,p=new this.algorithmGroup(b.height,b.width,b.direction,h);m(c,function(c){g=c.val/b.val*b.height*b.width;p.addElement(g);p.lP.nR>p.lP.lR&&d.algorithmCalcPoints(a,!1,p,e,h);f===k&&d.algorithmCalcPoints(a,!0,p,e,h);f+=1});return e},algorithmFill:function(a,b,c){var e=[],d,g=b.direction,f=b.x,k=b.y,n=b.width,p=b.height,l,q,r,t;m(c,function(c){d=\nc.val/b.val*b.height*b.width;l=f;q=k;0===g?(t=p,r=d/t,n-=r,f+=r):(r=n,t=d/r,p-=t,k+=t);e.push({x:l,y:q,width:r,height:t});a&&(g=1-g)});return e},strip:function(a,b){return this.algorithmLowAspectRatio(!1,a,b)},squarified:function(a,b){return this.algorithmLowAspectRatio(!0,a,b)},sliceAndDice:function(a,b){return this.algorithmFill(!0,a,b)},stripes:function(a,b){return this.algorithmFill(!1,a,b)},translate:function(){var a=this.rootNode=k(this.rootNode,this.options.rootId,\"\"),b,c;u.prototype.translate.call(this);\nthis.levelMap=B(this.options.levels,function(a,b){a[b.level]=b;return a},{});c=this.tree=this.getTree();b=this.nodeMap[a];\"\"===a||b&&b.children.length||(this.drillToNode(\"\",!1),a=this.rootNode,b=this.nodeMap[a]);this.setTreeValues(c);this.axisRatio=this.xAxis.len/this.yAxis.len;this.nodeMap[\"\"].pointValues=a={x:0,y:0,width:100,height:100};this.nodeMap[\"\"].values=a=v(a,{width:a.width*this.axisRatio,direction:\"vertical\"===this.options.layoutStartingDirection?0:1,val:c.val});this.calculateChildrenAreas(c,\na);this.colorAxis?this.translateColors():this.options.colorByPoint||this.setColorRecursive(this.tree);this.options.allowDrillToNode&&(b=b.pointValues,this.xAxis.setExtremes(b.x,b.x+b.width,!1),this.yAxis.setExtremes(b.y,b.y+b.height,!1),this.xAxis.setScale(),this.yAxis.setScale());this.setPointValues()},drawDataLabels:function(){var a=this,b=x(a.points,function(a){return a.node.visible}),c,e;m(b,function(b){e=a.levelMap[b.node.levelDynamic];c={style:{}};b.node.isLeaf||(c.enabled=!1);e&&e.dataLabels&&\n(c=v(c,e.dataLabels),a._hasPointLabels=!0);b.shapeArgs&&(c.style.width=b.shapeArgs.width,b.dataLabel&&b.dataLabel.css({width:b.shapeArgs.width+\"px\"}));b.dlOptions=v(c,b.options.dataLabels)});u.prototype.drawDataLabels.call(this)},alignDataLabel:function(a){q.column.prototype.alignDataLabel.apply(this,arguments);a.dataLabel&&a.dataLabel.attr({zIndex:a.node.zIndex+1})},drawPoints:function(){var a=this,b=x(a.points,function(a){return a.node.visible});m(b,function(b){var c=\"levelGroup-\"+b.node.levelDynamic;\na[c]||(a[c]=a.chart.renderer.g(c).attr({zIndex:1E3-b.node.levelDynamic}).add(a.group));b.group=a[c]});q.column.prototype.drawPoints.call(this);a.options.allowDrillToNode&&m(b,function(b){b.graphic&&(b.drillId=a.options.interactByLeaf?a.drillToByLeaf(b):a.drillToByGroup(b))})},onClickDrillToNode:function(a){var b=(a=a.point)&&a.drillId;A(b)&&(a.setState(\"\"),this.drillToNode(b))},drillToByGroup:function(a){var b=!1;1!==a.node.level-this.nodeMap[this.rootNode].level||a.node.isLeaf||(b=a.id);return b},\ndrillToByLeaf:function(a){var b=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!b;)a=this.nodeMap[a.parent],a.parent===this.rootNode&&(b=a.id);return b},drillUp:function(){var a=this.nodeMap[this.rootNode];a&&A(a.parent)&&this.drillToNode(a.parent)},drillToNode:function(a,b){var c=this.nodeMap[a];this.rootNode=a;\"\"===a?this.drillUpButton=this.drillUpButton.destroy():this.showDrillUpButton(c&&c.name||a);this.isDirty=!0;k(b,!0)&&this.chart.redraw()},showDrillUpButton:function(a){var b=\nthis;a=a||\"\\x3c Back\";var c=b.options.drillUpButton,e,d;c.text&&(a=c.text);this.drillUpButton?this.drillUpButton.attr({text:a}).align():(d=(e=c.theme)&&e.states,this.drillUpButton=this.chart.renderer.button(a,null,null,function(){b.drillUp()},e,d&&d.hover,d&&d.select).attr({align:c.position.align,zIndex:7}).add().align(c.position,!1,c.relativeTo||\"plotBox\"))},buildKDTree:z,drawLegendSymbol:f.LegendSymbolMixin.drawRectangle,getExtremes:function(){u.prototype.getExtremes.call(this,this.colorValueData);\nthis.valueMin=this.dataMin;this.valueMax=this.dataMax;u.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};u.prototype.bindAxes.call(this);f.extend(this.yAxis.options,a);f.extend(this.xAxis.options,a)}},{getClassName:function(){var a=f.Point.prototype.getClassName.call(this),b=this.series,c=b.options;this.node.level<=b.nodeMap[b.rootNode].level?\na+=\" highcharts-above-level\":this.node.isLeaf||k(c.interactByLeaf,!c.allowDrillToNode)?this.node.isLeaf||(a+=\" highcharts-internal-node\"):a+=\" highcharts-internal-node-interactive\";return a},isValid:function(){return F(this.value)},setState:function(a){f.Point.prototype.setState.call(this,a);this.graphic&&this.graphic.attr({zIndex:\"hover\"===a?1:0})},setVisible:q.pie.prototype.pointClass.prototype.setVisible})})(n)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/treemap.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2014 Highsoft AS\n * Authors: Jon Arild Nygard / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2014 Highsoft AS\n         * Authors: Jon Arild Nygard / Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes,\n            map = H.map,\n            merge = H.merge,\n            extend = H.extend,\n            noop = H.noop,\n            each = H.each,\n            grep = H.grep,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            pick = H.pick,\n            Series = H.Series,\n            stableSort = H.stableSort,\n            color = H.Color,\n            eachObject = function(list, func, context) {\n                context = context || this;\n                H.objectEach(list, function(val, key) {\n                    func.call(context, val, key, list);\n                });\n            },\n            reduce = function(arr, func, previous, context) {\n                context = context || this;\n                arr = arr || []; // @note should each be able to handle empty values automatically?\n                each(arr, function(current, i) {\n                    previous = func.call(context, previous, current, i, arr);\n                });\n                return previous;\n            },\n            // @todo find correct name for this function. \n            // @todo Similar to reduce, this function is likely redundant\n            recursive = function(item, func, context) {\n                var next;\n                context = context || this;\n                next = func.call(context, item);\n                if (next !== false) {\n                    recursive(next, func, context);\n                }\n            };\n\n        // The Treemap series type\n        seriesType('treemap', 'scatter', {\n            showInLegend: false,\n            marker: false,\n            dataLabels: {\n                enabled: true,\n                defer: false,\n                verticalAlign: 'middle',\n                formatter: function() { // #2945\n                    return this.point.name || this.point.id;\n                },\n                inside: true\n            },\n            tooltip: {\n                headerFormat: '',\n                pointFormat: '<b>{point.name}</b>: {point.value}</b><br/>'\n            },\n            ignoreHiddenPoint: true,\n            layoutAlgorithm: 'sliceAndDice',\n            layoutStartingDirection: 'vertical',\n            alternateStartingDirection: false,\n            levelIsConstant: true,\n            drillUpButton: {\n                position: {\n                    align: 'right',\n                    x: -10,\n                    y: 10\n                }\n            },\n\n\n            // Prototype members\n        }, {\n            pointArrayMap: ['value'],\n            axisTypes: seriesTypes.heatmap ? ['xAxis', 'yAxis', 'colorAxis'] : ['xAxis', 'yAxis'],\n            optionalAxis: 'colorAxis',\n            getSymbol: noop,\n            parallelArrays: ['x', 'y', 'value', 'colorValue'],\n            colorKey: 'colorValue', // Point color option key\n            translateColors: seriesTypes.heatmap && seriesTypes.heatmap.prototype.translateColors,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            /**\n             * Creates an object map from parent id to childrens index.\n             * @param {Array} data List of points set in options.\n             * @param {string} data[].parent Parent id of point.\n             * @param {Array} ids List of all point ids.\n             * @return {Object} Map from parent id to children index in data.\n             */\n            getListOfParents: function(data, ids) {\n                var listOfParents = reduce(data, function(prev, curr, i) {\n                    var parent = pick(curr.parent, '');\n                    if (prev[parent] === undefined) {\n                        prev[parent] = [];\n                    }\n                    prev[parent].push(i);\n                    return prev;\n                }, {});\n\n                // If parent does not exist, hoist parent to root of tree.\n                eachObject(listOfParents, function(children, parent, list) {\n                    if ((parent !== '') && (H.inArray(parent, ids) === -1)) {\n                        each(children, function(child) {\n                            list[''].push(child);\n                        });\n                        delete list[parent];\n                    }\n                });\n                return listOfParents;\n            },\n            /**\n             * Creates a tree structured object from the series points\n             */\n            getTree: function() {\n                var series = this,\n                    allIds = map(this.data, function(d) {\n                        return d.id;\n                    }),\n                    parentList = series.getListOfParents(this.data, allIds);\n\n                series.nodeMap = [];\n                return series.buildNode('', -1, 0, parentList, null);\n            },\n            init: function(chart, options) {\n                var series = this;\n                Series.prototype.init.call(series, chart, options);\n                if (series.options.allowDrillToNode) {\n                    H.addEvent(series, 'click', series.onClickDrillToNode);\n                }\n            },\n            buildNode: function(id, i, level, list, parent) {\n                var series = this,\n                    children = [],\n                    point = series.points[i],\n                    node,\n                    child;\n\n                // Actions\n                each((list[id] || []), function(i) {\n                    child = series.buildNode(series.points[i].id, i, (level + 1), list, id);\n                    children.push(child);\n                });\n                node = {\n                    id: id,\n                    i: i,\n                    children: children,\n                    level: level,\n                    parent: parent,\n                    visible: false // @todo move this to better location\n                };\n                series.nodeMap[node.id] = node;\n                if (point) {\n                    point.node = node;\n                }\n                return node;\n            },\n            setTreeValues: function(tree) {\n                var series = this,\n                    options = series.options,\n                    childrenTotal = 0,\n                    children = [],\n                    val,\n                    point = series.points[tree.i];\n                // Parents of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode], function(node) {\n                    var next = false,\n                        p = node.parent;\n                    node.visible = true;\n                    if (p || p === '') {\n                        next = series.nodeMap[p];\n                    }\n                    return next;\n                });\n                // Children of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode].children, function(children) {\n                    var next = false;\n                    each(children, function(child) {\n                        child.visible = true;\n                        if (child.children.length) {\n                            next = (next || []).concat(child.children);\n                        }\n                    });\n                    return next;\n                });\n\n                // First give the children some values\n                each(tree.children, function(child) {\n                    child = series.setTreeValues(child);\n                    children.push(child);\n\n                    if (!child.ignore) {\n                        childrenTotal += child.val;\n                    } else {\n                        // @todo Add predicate to avoid looping already ignored children\n                        recursive(child.children, function(children) {\n                            var next = false;\n                            each(children, function(node) {\n                                extend(node, {\n                                    ignore: true,\n                                    isLeaf: false,\n                                    visible: false\n                                });\n                                if (node.children.length) {\n                                    next = (next || []).concat(node.children);\n                                }\n                            });\n                            return next;\n                        });\n                    }\n                });\n                // Sort the children\n                stableSort(children, function(a, b) {\n                    return a.sortIndex - b.sortIndex;\n                });\n                // Set the values\n                val = pick(point && point.options.value, childrenTotal);\n                if (point) {\n                    point.value = val;\n                }\n                extend(tree, {\n                    children: children,\n                    childrenTotal: childrenTotal,\n                    // Ignore this node if point is not visible\n                    ignore: !(pick(point && point.visible, true) && (val > 0)),\n                    isLeaf: tree.visible && !childrenTotal,\n                    levelDynamic: (options.levelIsConstant ? tree.level : (tree.level - series.nodeMap[series.rootNode].level)),\n                    name: pick(point && point.name, ''),\n                    sortIndex: pick(point && point.sortIndex, -val),\n                    val: val\n                });\n                return tree;\n            },\n            /**\n             * Recursive function which calculates the area for all children of a node.\n             * @param {Object} node The node which is parent to the children.\n             * @param {Object} area The rectangular area of the parent.\n             */\n            calculateChildrenAreas: function(parent, area) {\n                var series = this,\n                    options = series.options,\n                    level = this.levelMap[parent.levelDynamic + 1],\n                    algorithm = pick((series[level && level.layoutAlgorithm] && level.layoutAlgorithm), options.layoutAlgorithm),\n                    alternate = options.alternateStartingDirection,\n                    childrenValues = [],\n                    children;\n\n                // Collect all children which should be included\n                children = grep(parent.children, function(n) {\n                    return !n.ignore;\n                });\n\n                if (level && level.layoutStartingDirection) {\n                    area.direction = level.layoutStartingDirection === 'vertical' ? 0 : 1;\n                }\n                childrenValues = series[algorithm](area, children);\n                each(children, function(child, index) {\n                    var values = childrenValues[index];\n                    child.values = merge(values, {\n                        val: child.childrenTotal,\n                        direction: (alternate ? 1 - area.direction : area.direction)\n                    });\n                    child.pointValues = merge(values, {\n                        x: (values.x / series.axisRatio),\n                        width: (values.width / series.axisRatio)\n                    });\n                    // If node has children, then call method recursively\n                    if (child.children.length) {\n                        series.calculateChildrenAreas(child, child.values);\n                    }\n                });\n            },\n            setPointValues: function() {\n                var series = this,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n                each(series.points, function(point) {\n                    var node = point.node,\n                        values = node.pointValues,\n                        x1,\n                        x2,\n                        y1,\n                        y2,\n                        crispCorr = 0;\n\n\n\n                    // Points which is ignored, have no values.\n                    if (values && node.visible) {\n                        x1 = Math.round(xAxis.translate(values.x, 0, 0, 0, 1)) - crispCorr;\n                        x2 = Math.round(xAxis.translate(values.x + values.width, 0, 0, 0, 1)) - crispCorr;\n                        y1 = Math.round(yAxis.translate(values.y, 0, 0, 0, 1)) - crispCorr;\n                        y2 = Math.round(yAxis.translate(values.y + values.height, 0, 0, 0, 1)) - crispCorr;\n                        // Set point values\n                        point.shapeType = 'rect';\n                        point.shapeArgs = {\n                            x: Math.min(x1, x2),\n                            y: Math.min(y1, y2),\n                            width: Math.abs(x2 - x1),\n                            height: Math.abs(y2 - y1)\n                        };\n                        point.plotX = point.shapeArgs.x + (point.shapeArgs.width / 2);\n                        point.plotY = point.shapeArgs.y + (point.shapeArgs.height / 2);\n                    } else {\n                        // Reset visibility\n                        delete point.plotX;\n                        delete point.plotY;\n                    }\n                });\n            },\n            setColorRecursive: function(node, color, colorIndex) {\n                var series = this,\n                    point,\n                    level;\n                if (node) {\n                    point = series.points[node.i];\n                    level = series.levelMap[node.levelDynamic];\n                    // Select either point color, level color or inherited color.\n                    color = pick(\n                        point && point.options.color,\n                        level && level.color,\n                        color,\n                        series.color\n                    );\n                    colorIndex = pick(\n                        point && point.options.colorIndex,\n                        level && level.colorIndex,\n                        colorIndex,\n                        series.colorIndex\n                    );\n\n                    if (point) {\n                        point.color = color;\n                        point.colorIndex = colorIndex;\n                    }\n\n                    // Do it all again with the children\t\n                    if (node.children.length) {\n                        each(node.children, function(child) {\n                            series.setColorRecursive(child, color, colorIndex);\n                        });\n                    }\n                }\n            },\n            algorithmGroup: function(h, w, d, p) {\n                this.height = h;\n                this.width = w;\n                this.plot = p;\n                this.direction = d;\n                this.startDirection = d;\n                this.total = 0;\n                this.nW = 0;\n                this.lW = 0;\n                this.nH = 0;\n                this.lH = 0;\n                this.elArr = [];\n                this.lP = {\n                    total: 0,\n                    lH: 0,\n                    nH: 0,\n                    lW: 0,\n                    nW: 0,\n                    nR: 0,\n                    lR: 0,\n                    aspectRatio: function(w, h) {\n                        return Math.max((w / h), (h / w));\n                    }\n                };\n                this.addElement = function(el) {\n                    this.lP.total = this.elArr[this.elArr.length - 1];\n                    this.total = this.total + el;\n                    if (this.direction === 0) {\n                        // Calculate last point old aspect ratio\n                        this.lW = this.nW;\n                        this.lP.lH = this.lP.total / this.lW;\n                        this.lP.lR = this.lP.aspectRatio(this.lW, this.lP.lH);\n                        // Calculate last point new aspect ratio\n                        this.nW = this.total / this.height;\n                        this.lP.nH = this.lP.total / this.nW;\n                        this.lP.nR = this.lP.aspectRatio(this.nW, this.lP.nH);\n                    } else {\n                        // Calculate last point old aspect ratio\n                        this.lH = this.nH;\n                        this.lP.lW = this.lP.total / this.lH;\n                        this.lP.lR = this.lP.aspectRatio(this.lP.lW, this.lH);\n                        // Calculate last point new aspect ratio\n                        this.nH = this.total / this.width;\n                        this.lP.nW = this.lP.total / this.nH;\n                        this.lP.nR = this.lP.aspectRatio(this.lP.nW, this.nH);\n                    }\n                    this.elArr.push(el);\n                };\n                this.reset = function() {\n                    this.nW = 0;\n                    this.lW = 0;\n                    this.elArr = [];\n                    this.total = 0;\n                };\n            },\n            algorithmCalcPoints: function(directionChange, last, group, childrenArea) {\n                var pX,\n                    pY,\n                    pW,\n                    pH,\n                    gW = group.lW,\n                    gH = group.lH,\n                    plot = group.plot,\n                    keep,\n                    i = 0,\n                    end = group.elArr.length - 1;\n                if (last) {\n                    gW = group.nW;\n                    gH = group.nH;\n                } else {\n                    keep = group.elArr[group.elArr.length - 1];\n                }\n                each(group.elArr, function(p) {\n                    if (last || (i < end)) {\n                        if (group.direction === 0) {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pW = gW;\n                            pH = p / pW;\n                        } else {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pH = gH;\n                            pW = p / pH;\n                        }\n                        childrenArea.push({\n                            x: pX,\n                            y: pY,\n                            width: pW,\n                            height: pH\n                        });\n                        if (group.direction === 0) {\n                            plot.y = plot.y + pH;\n                        } else {\n                            plot.x = plot.x + pW;\n                        }\n                    }\n                    i = i + 1;\n                });\n                // Reset variables\n                group.reset();\n                if (group.direction === 0) {\n                    group.width = group.width - gW;\n                } else {\n                    group.height = group.height - gH;\n                }\n                plot.y = plot.parent.y + (plot.parent.height - group.height);\n                plot.x = plot.parent.x + (plot.parent.width - group.width);\n                if (directionChange) {\n                    group.direction = 1 - group.direction;\n                }\n                // If not last, then add uncalculated element\n                if (!last) {\n                    group.addElement(keep);\n                }\n            },\n            algorithmLowAspectRatio: function(directionChange, parent, children) {\n                var childrenArea = [],\n                    series = this,\n                    pTot,\n                    plot = {\n                        x: parent.x,\n                        y: parent.y,\n                        parent: parent\n                    },\n                    direction = parent.direction,\n                    i = 0,\n                    end = children.length - 1,\n                    group = new this.algorithmGroup(parent.height, parent.width, direction, plot); // eslint-disable-line new-cap\n                // Loop through and calculate all areas\n                each(children, function(child) {\n                    pTot = (parent.width * parent.height) * (child.val / parent.val);\n                    group.addElement(pTot);\n                    if (group.lP.nR > group.lP.lR) {\n                        series.algorithmCalcPoints(directionChange, false, group, childrenArea, plot);\n                    }\n                    // If last child, then calculate all remaining areas\n                    if (i === end) {\n                        series.algorithmCalcPoints(directionChange, true, group, childrenArea, plot);\n                    }\n                    i = i + 1;\n                });\n                return childrenArea;\n            },\n            algorithmFill: function(directionChange, parent, children) {\n                var childrenArea = [],\n                    pTot,\n                    direction = parent.direction,\n                    x = parent.x,\n                    y = parent.y,\n                    width = parent.width,\n                    height = parent.height,\n                    pX,\n                    pY,\n                    pW,\n                    pH;\n                each(children, function(child) {\n                    pTot = (parent.width * parent.height) * (child.val / parent.val);\n                    pX = x;\n                    pY = y;\n                    if (direction === 0) {\n                        pH = height;\n                        pW = pTot / pH;\n                        width = width - pW;\n                        x = x + pW;\n                    } else {\n                        pW = width;\n                        pH = pTot / pW;\n                        height = height - pH;\n                        y = y + pH;\n                    }\n                    childrenArea.push({\n                        x: pX,\n                        y: pY,\n                        width: pW,\n                        height: pH\n                    });\n                    if (directionChange) {\n                        direction = 1 - direction;\n                    }\n                });\n                return childrenArea;\n            },\n            strip: function(parent, children) {\n                return this.algorithmLowAspectRatio(false, parent, children);\n            },\n            squarified: function(parent, children) {\n                return this.algorithmLowAspectRatio(true, parent, children);\n            },\n            sliceAndDice: function(parent, children) {\n                return this.algorithmFill(true, parent, children);\n            },\n            stripes: function(parent, children) {\n                return this.algorithmFill(false, parent, children);\n            },\n            translate: function() {\n                var series = this,\n                    rootId = series.rootNode = pick(series.rootNode, series.options.rootId, ''),\n                    rootNode,\n                    pointValues,\n                    seriesArea,\n                    tree,\n                    val;\n\n                // Call prototype function\n                Series.prototype.translate.call(series);\n                // Create a object map from level to options\n                series.levelMap = reduce(series.options.levels, function(arr, item) {\n                    arr[item.level] = item;\n                    return arr;\n                }, {});\n                tree = series.tree = series.getTree(); // @todo Only if series.isDirtyData is true\n                rootNode = series.nodeMap[rootId];\n                if (\n                    rootId !== '' &&\n                    (!rootNode || !rootNode.children.length)\n                ) {\n                    series.drillToNode('', false);\n                    rootId = series.rootNode;\n                    rootNode = series.nodeMap[rootId];\n                }\n                series.setTreeValues(tree);\n\n                // Calculate plotting values.\n                series.axisRatio = (series.xAxis.len / series.yAxis.len);\n                series.nodeMap[''].pointValues = pointValues = {\n                    x: 0,\n                    y: 0,\n                    width: 100,\n                    height: 100\n                };\n                series.nodeMap[''].values = seriesArea = merge(pointValues, {\n                    width: (pointValues.width * series.axisRatio),\n                    direction: (series.options.layoutStartingDirection === 'vertical' ? 0 : 1),\n                    val: tree.val\n                });\n                series.calculateChildrenAreas(tree, seriesArea);\n\n                // Logic for point colors\n                if (series.colorAxis) {\n                    series.translateColors();\n                } else if (!series.options.colorByPoint) {\n                    series.setColorRecursive(series.tree);\n                }\n\n                // Update axis extremes according to the root node.\n                if (series.options.allowDrillToNode) {\n                    val = rootNode.pointValues;\n                    series.xAxis.setExtremes(val.x, val.x + val.width, false);\n                    series.yAxis.setExtremes(val.y, val.y + val.height, false);\n                    series.xAxis.setScale();\n                    series.yAxis.setScale();\n                }\n\n                // Assign values to points.\n                series.setPointValues();\n            },\n            /**\n             * Extend drawDataLabels with logic to handle custom options related to the treemap series:\n             * - Points which is not a leaf node, has dataLabels disabled by default.\n             * - Options set on series.levels is merged in.\n             * - Width of the dataLabel is set to match the width of the point shape.\n             */\n            drawDataLabels: function() {\n                var series = this,\n                    points = grep(series.points, function(n) {\n                        return n.node.visible;\n                    }),\n                    options,\n                    level;\n                each(points, function(point) {\n                    level = series.levelMap[point.node.levelDynamic];\n                    // Set options to new object to avoid problems with scope\n                    options = {\n                        style: {}\n                    };\n\n                    // If not a leaf, then label should be disabled as default\n                    if (!point.node.isLeaf) {\n                        options.enabled = false;\n                    }\n\n                    // If options for level exists, include them as well\n                    if (level && level.dataLabels) {\n                        options = merge(options, level.dataLabels);\n                        series._hasPointLabels = true;\n                    }\n\n                    // Set dataLabel width to the width of the point shape.\n                    if (point.shapeArgs) {\n                        options.style.width = point.shapeArgs.width;\n                        if (point.dataLabel) {\n                            point.dataLabel.css({\n                                width: point.shapeArgs.width + 'px'\n                            });\n                        }\n                    }\n\n                    // Merge custom options with point options\n                    point.dlOptions = merge(options, point.options.dataLabels);\n                });\n                Series.prototype.drawDataLabels.call(this);\n            },\n\n            /**\n             * Over the alignment method by setting z index\n             */\n            alignDataLabel: function(point) {\n                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);\n                if (point.dataLabel) {\n                    point.dataLabel.attr({\n                        zIndex: point.node.zIndex + 1\n                    });\n                }\n            },\n\n\n\n            /**\n             * Extending ColumnSeries drawPoints\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = grep(series.points, function(n) {\n                        return n.node.visible;\n                    });\n\n                each(points, function(point) {\n                    var groupKey = 'levelGroup-' + point.node.levelDynamic;\n                    if (!series[groupKey]) {\n                        series[groupKey] = series.chart.renderer.g(groupKey)\n                            .attr({\n                                zIndex: 1000 - point.node.levelDynamic // @todo Set the zIndex based upon the number of levels, instead of using 1000\n                            })\n                            .add(series.group);\n                    }\n                    point.group = series[groupKey];\n\n                });\n                // Call standard drawPoints\n                seriesTypes.column.prototype.drawPoints.call(this);\n\n                // If drillToNode is allowed, set a point cursor on clickables & add drillId to point \n                if (series.options.allowDrillToNode) {\n                    each(points, function(point) {\n                        if (point.graphic) {\n                            point.drillId = series.options.interactByLeaf ? series.drillToByLeaf(point) : series.drillToByGroup(point);\n                        }\n                    });\n                }\n            },\n            /**\n             * Add drilling on the suitable points\n             */\n            onClickDrillToNode: function(event) {\n                var series = this,\n                    point = event.point,\n                    drillId = point && point.drillId;\n                // If a drill id is returned, add click event and cursor. \n                if (isString(drillId)) {\n                    point.setState(''); // Remove hover\n                    series.drillToNode(drillId);\n                }\n            },\n            /**\n             * Finds the drill id for a parent node.\n             * Returns false if point should not have a click event\n             * @param {Object} point\n             * @return {string || boolean} Drill to id or false when point should not have a click event\n             */\n            drillToByGroup: function(point) {\n                var series = this,\n                    drillId = false;\n                if ((point.node.level - series.nodeMap[series.rootNode].level) === 1 && !point.node.isLeaf) {\n                    drillId = point.id;\n                }\n                return drillId;\n            },\n            /**\n             * Finds the drill id for a leaf node.\n             * Returns false if point should not have a click event\n             * @param {Object} point\n             * @return {string || boolean} Drill to id or false when point should not have a click event\n             */\n            drillToByLeaf: function(point) {\n                var series = this,\n                    drillId = false,\n                    nodeParent;\n                if ((point.node.parent !== series.rootNode) && (point.node.isLeaf)) {\n                    nodeParent = point.node;\n                    while (!drillId) {\n                        nodeParent = series.nodeMap[nodeParent.parent];\n                        if (nodeParent.parent === series.rootNode) {\n                            drillId = nodeParent.id;\n                        }\n                    }\n                }\n                return drillId;\n            },\n            drillUp: function() {\n                var series = this,\n                    node = series.nodeMap[series.rootNode];\n                if (node && isString(node.parent)) {\n                    series.drillToNode(node.parent);\n                }\n            },\n            drillToNode: function(id, redraw) {\n                var series = this,\n                    nodeMap = series.nodeMap,\n                    node = nodeMap[id];\n                series.rootNode = id;\n                if (id === '') {\n                    series.drillUpButton = series.drillUpButton.destroy();\n                } else {\n                    series.showDrillUpButton((node && node.name || id));\n                }\n                this.isDirty = true; // Force redraw\n                if (pick(redraw, true)) {\n                    this.chart.redraw();\n                }\n            },\n            showDrillUpButton: function(name) {\n                var series = this,\n                    backText = (name || '< Back'),\n                    buttonOptions = series.options.drillUpButton,\n                    attr,\n                    states;\n\n                if (buttonOptions.text) {\n                    backText = buttonOptions.text;\n                }\n                if (!this.drillUpButton) {\n                    attr = buttonOptions.theme;\n                    states = attr && attr.states;\n\n                    this.drillUpButton = this.chart.renderer.button(\n                            backText,\n                            null,\n                            null,\n                            function() {\n                                series.drillUp();\n                            },\n                            attr,\n                            states && states.hover,\n                            states && states.select\n                        )\n                        .attr({\n                            align: buttonOptions.position.align,\n                            zIndex: 7\n                        })\n                        .add()\n                        .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n                } else {\n                    this.drillUpButton.attr({\n                            text: backText\n                        })\n                        .align();\n                }\n            },\n            buildKDTree: noop,\n            drawLegendSymbol: H.LegendSymbolMixin.drawRectangle,\n            getExtremes: function() {\n                // Get the extremes from the value data\n                Series.prototype.getExtremes.call(this, this.colorValueData);\n                this.valueMin = this.dataMin;\n                this.valueMax = this.dataMax;\n\n                // Get the extremes from the y data\n                Series.prototype.getExtremes.call(this);\n            },\n            getExtremesFromAll: true,\n            bindAxes: function() {\n                var treeAxis = {\n                    endOnTick: false,\n                    gridLineWidth: 0,\n                    lineWidth: 0,\n                    min: 0,\n                    dataMin: 0,\n                    minPadding: 0,\n                    max: 100,\n                    dataMax: 100,\n                    maxPadding: 0,\n                    startOnTick: false,\n                    title: null,\n                    tickPositions: []\n                };\n                Series.prototype.bindAxes.call(this);\n                H.extend(this.yAxis.options, treeAxis);\n                H.extend(this.xAxis.options, treeAxis);\n            }\n\n            // Point class\n        }, {\n            getClassName: function() {\n                var className = H.Point.prototype.getClassName.call(this),\n                    series = this.series,\n                    options = series.options;\n\n                // Above the current level\n                if (this.node.level <= series.nodeMap[series.rootNode].level) {\n                    className += ' highcharts-above-level';\n\n                } else if (!this.node.isLeaf && !pick(options.interactByLeaf, !options.allowDrillToNode)) {\n                    className += ' highcharts-internal-node-interactive';\n\n                } else if (!this.node.isLeaf) {\n                    className += ' highcharts-internal-node';\n                }\n                return className;\n            },\n            isValid: function() {\n                return isNumber(this.value);\n            },\n            setState: function(state) {\n                H.Point.prototype.setState.call(this, state);\n\n                // Graphic does not exist when point is not visible.\n                if (this.graphic) {\n                    this.graphic.attr({\n                        zIndex: state === 'hover' ? 1 : 0\n                    });\n                }\n            },\n            setVisible: seriesTypes.pie.prototype.pointClass.prototype.setVisible\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/modules/xrange-series.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n X-range series\n\n (c) 2010-2017 Torstein Honsi, Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(g){\"object\"===typeof module&&module.exports?module.exports=g:g(Highcharts)})(function(g){(function(d){var g=d.getOptions().plotOptions,m=d.seriesTypes.column,k=d.each,p=d.extendClass,q=d.isNumber,v=d.isObject,n=d.merge,r=d.pick,t=d.seriesTypes,w=d.wrap,x=d.Axis,u=d.Point,y=d.Series;g.xrange=n(g.column,{tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.yCategory}\\x3c/b\\x3e\\x3cbr/\\x3e'}});t.xrange=p(m,{pointClass:p(u,{getLabelConfig:function(){var f=\nu.prototype.getLabelConfig.call(this);f.x2=this.x2;f.yCategory=this.yCategory=this.series.yAxis.categories&&this.series.yAxis.categories[this.y];return f}}),type:\"xrange\",forceDL:!0,parallelArrays:[\"x\",\"x2\",\"y\"],requireSorting:!1,animate:t.line.prototype.animate,getColumnMetrics:function(){function f(){k(h.series,function(b){var a=b.xAxis;b.xAxis=b.yAxis;b.yAxis=a})}var e,h=this.chart;f();this.yAxis.closestPointRange=1;e=m.prototype.getColumnMetrics.call(this);f();return e},cropData:function(f,e,\nh,b){e=y.prototype.cropData.call(this,this.x2Data,e,h,b);e.xData=f.slice(e.start,e.end);return e},translate:function(){m.prototype.translate.apply(this,arguments);var f=this.xAxis,e=this.columnMetrics,h=this.options.minPointLength||0;k(this.points,function(b){var a=b.plotX,c=r(b.x2,b.x+(b.len||0)),c=f.toPixels(c,!0),d=c-a,l;h&&(l=h-d,0>l&&(l=0),a-=l/2,c+=l/2);a=Math.max(a,-10);c=Math.min(Math.max(c,-10),f.len+10);c<a&&(c=a);b.shapeArgs={x:a,y:b.plotY+e.offset,width:c-a,height:e.width};b.tooltipPos[0]+=\nd/2;b.tooltipPos[1]-=e.width/2;if(c=b.partialFill)v(c)&&(c=c.amount),q(c)||(c=0),a=b.shapeArgs,b.partShapeArgs={x:a.x,y:a.y+1,width:a.width*c,height:a.height-2}})},drawPoints:function(){var f=this,e=this.chart,d=e.renderer,b=e.pointCount<(f.options.animationLimit||250)?\"animate\":\"attr\";k(f.points,function(a){var c=a.graphic,e=a.shapeType,h=a.shapeArgs,g=a.partShapeArgs;if(q(a.plotY)&&null!==a.y)if(c){if(a.graphicOriginal[b](n(h)),g)a.graphicOverlay[b](n(g))}else a.graphic=c=d.g(\"point\").attr({\"class\":a.getClassName()}).add(a.group||\nf.group),a.graphicOriginal=d[e](h).addClass(\"highcharts-partfill-original\").add(c),g&&(a.graphicOverlay=d[e](g).addClass(\"highcharts-partfill-overlay\").add(c));else c&&(a.graphic=c.destroy())})}});w(x.prototype,\"getSeriesExtremes\",function(d){var e=this.series,f,b;d.call(this);this.isXAxis&&\"xrange\"===e.type&&(f=r(this.dataMax,Number.MIN_VALUE),k(this.series,function(a){k(a.x2Data||[],function(a){a>f&&(f=a,b=!0)})}),b&&(this.dataMax=f))})})(g)});\n"
  },
  {
    "path": "assets/highcharts/js/modules/xrange-series.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * X-range series\n *\n * (c) 2010-2017 Torstein Honsi, Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2014-2017 Highsoft AS\n         * Authors: Torstein Honsi, Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var defaultPlotOptions = H.getOptions().plotOptions,\n            color = H.Color,\n            columnType = H.seriesTypes.column,\n            each = H.each,\n            extendClass = H.extendClass,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            pick = H.pick,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Point = H.Point,\n            Series = H.Series,\n            pointFormat = '<span style=\"color:{point.color}\">' +\n            '\\u25CF' +\n            '</span> {series.name}: <b>{point.yCategory}</b><br/>',\n            xrange = 'xrange';\n\n        defaultPlotOptions.xrange = merge(defaultPlotOptions.column, {\n            tooltip: {\n                pointFormat: pointFormat\n            }\n        });\n        seriesTypes.xrange = extendClass(columnType, {\n            pointClass: extendClass(Point, {\n                // Add x2 and yCategory to the available properties for tooltip formats\n                getLabelConfig: function() {\n                    var cfg = Point.prototype.getLabelConfig.call(this);\n\n                    cfg.x2 = this.x2;\n                    cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y];\n                    return cfg;\n                }\n            }),\n            type: xrange,\n            forceDL: true,\n            parallelArrays: ['x', 'x2', 'y'],\n            requireSorting: false,\n            animate: seriesTypes.line.prototype.animate,\n\n            /**\n             * Borrow the column series metrics, but with swapped axes. This gives free access\n             * to features like groupPadding, grouping, pointWidth etc.\n             */\n            getColumnMetrics: function() {\n                var metrics,\n                    chart = this.chart;\n\n                function swapAxes() {\n                    each(chart.series, function(s) {\n                        var xAxis = s.xAxis;\n                        s.xAxis = s.yAxis;\n                        s.yAxis = xAxis;\n                    });\n                }\n\n                swapAxes();\n\n                this.yAxis.closestPointRange = 1;\n                metrics = columnType.prototype.getColumnMetrics.call(this);\n\n                swapAxes();\n\n                return metrics;\n            },\n\n            /**\n             * Override cropData to show a point where x is outside visible range\n             * but x2 is outside.\n             */\n            cropData: function(xData, yData, min, max) {\n\n                // Replace xData with x2Data to find the appropriate cropStart\n                var cropData = Series.prototype.cropData,\n                    crop = cropData.call(this, this.x2Data, yData, min, max);\n\n                // Re-insert the cropped xData\n                crop.xData = xData.slice(crop.start, crop.end);\n\n                return crop;\n            },\n\n            translate: function() {\n                columnType.prototype.translate.apply(this, arguments);\n                var series = this,\n                    xAxis = series.xAxis,\n                    metrics = series.columnMetrics,\n                    minPointLength = series.options.minPointLength || 0;\n\n                each(series.points, function(point) {\n                    var plotX = point.plotX,\n                        posX = pick(point.x2, point.x + (point.len || 0)),\n                        plotX2 = xAxis.toPixels(posX, true),\n                        width = plotX2 - plotX,\n                        widthDifference,\n                        shapeArgs,\n                        partialFill;\n\n                    if (minPointLength) {\n                        widthDifference = minPointLength - width;\n                        if (widthDifference < 0) {\n                            widthDifference = 0;\n                        }\n                        plotX -= widthDifference / 2;\n                        plotX2 += widthDifference / 2;\n                    }\n\n                    plotX = Math.max(plotX, -10);\n                    plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10);\n\n                    if (plotX2 < plotX) { // #6107\n                        plotX2 = plotX;\n                    }\n\n                    point.shapeArgs = {\n                        x: plotX,\n                        y: point.plotY + metrics.offset,\n                        width: plotX2 - plotX,\n                        height: metrics.width\n                    };\n                    point.tooltipPos[0] += width / 2;\n                    point.tooltipPos[1] -= metrics.width / 2;\n\n                    // Add a partShapeArgs to the point, based on the shapeArgs property\n                    partialFill = point.partialFill;\n                    if (partialFill) {\n                        // Get the partial fill amount\n                        if (isObject(partialFill)) {\n                            partialFill = partialFill.amount;\n                        }\n                        // If it was not a number, assume 0\n                        if (!isNumber(partialFill)) {\n                            partialFill = 0;\n                        }\n                        shapeArgs = point.shapeArgs;\n                        point.partShapeArgs = {\n                            x: shapeArgs.x,\n                            y: shapeArgs.y + 1,\n                            width: shapeArgs.width * partialFill,\n                            height: shapeArgs.height - 2\n                        };\n                    }\n                });\n            },\n\n            drawPoints: function() {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    verb = chart.pointCount < animationLimit ? 'animate' : 'attr';\n\n                // draw the columns\n                each(series.points, function(point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic,\n                        type = point.shapeType,\n                        shapeArgs = point.shapeArgs,\n                        partShapeArgs = point.partShapeArgs,\n                        seriesOpts = series.options,\n                        pfOptions = point.partialFill,\n                        fill,\n                        state = point.selected && 'select',\n                        cutOff = options.stacking && !options.borderRadius;\n\n                    if (isNumber(plotY) && point.y !== null) {\n                        if (graphic) { // update\n                            point.graphicOriginal[verb](\n                                merge(shapeArgs)\n                            );\n                            if (partShapeArgs) {\n                                point.graphicOverlay[verb](\n                                    merge(partShapeArgs)\n                                );\n                            }\n\n                        } else {\n                            point.graphic = graphic = renderer.g('point')\n                                .attr({\n                                    'class': point.getClassName()\n                                })\n                                .add(point.group || series.group);\n\n                            point.graphicOriginal = renderer[type](shapeArgs)\n                                .addClass('highcharts-partfill-original')\n                                .add(graphic);\n                            if (partShapeArgs) {\n                                point.graphicOverlay = renderer[type](partShapeArgs)\n                                    .addClass('highcharts-partfill-overlay')\n                                    .add(graphic);\n                            }\n                        }\n\n\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            }\n        });\n\n        /**\n         * Max x2 should be considered in xAxis extremes\n         */\n        wrap(Axis.prototype, 'getSeriesExtremes', function(proceed) {\n            var axis = this,\n                series = axis.series,\n                dataMax,\n                modMax;\n\n            proceed.call(this);\n            if (axis.isXAxis && series.type === xrange) {\n                dataMax = pick(axis.dataMax, Number.MIN_VALUE);\n                each(this.series, function(series) {\n                    each(series.x2Data || [], function(val) {\n                        if (val > dataMax) {\n                            dataMax = val;\n                            modMax = true;\n                        }\n                    });\n                });\n                if (modMax) {\n                    axis.dataMax = dataMax;\n                }\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/dark-blue.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         *\n         * Dark blue theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n        Highcharts.theme = {\n            colors: ['#DDDF0D', '#55BF3B', '#DF5353', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 1,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgb(48, 48, 96)'],\n                        [1, 'rgb(0, 0, 0)']\n                    ]\n                },\n                borderColor: '#000000',\n                borderWidth: 2,\n                className: 'dark-container',\n                plotBackgroundColor: 'rgba(255, 255, 255, .1)',\n                plotBorderColor: '#CCCCCC',\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#C0C0C0',\n                    font: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#666666',\n                    font: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineColor: '#333333',\n                gridLineWidth: 1,\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                tickColor: '#A0A0A0',\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n                    }\n                }\n            },\n            yAxis: {\n                gridLineColor: '#333333',\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                minorTickInterval: null,\n                tickColor: '#A0A0A0',\n                tickWidth: 1,\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n                    }\n                }\n            },\n            tooltip: {\n                backgroundColor: 'rgba(0, 0, 0, 0.75)',\n                style: {\n                    color: '#F0F0F0'\n                }\n            },\n            toolbar: {\n                itemStyle: {\n                    color: 'silver'\n                }\n            },\n            plotOptions: {\n                line: {\n                    dataLabels: {\n                        color: '#CCC'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                spline: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                scatter: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                candlestick: {\n                    lineColor: 'white'\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: '#A0A0A0'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#444'\n                }\n            },\n            credits: {\n                style: {\n                    color: '#666'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#CCC'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    hoverSymbolStroke: '#FFFFFF',\n                    theme: {\n                        fill: {\n                            linearGradient: {\n                                x1: 0,\n                                y1: 0,\n                                x2: 0,\n                                y2: 1\n                            },\n                            stops: [\n                                [0.4, '#606060'],\n                                [0.6, '#333333']\n                            ]\n                        },\n                        stroke: '#000000'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: {\n                        linearGradient: {\n                            x1: 0,\n                            y1: 0,\n                            x2: 0,\n                            y2: 1\n                        },\n                        stops: [\n                            [0.4, '#888'],\n                            [0.6, '#555']\n                        ]\n                    },\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold'\n                    },\n                    states: {\n                        hover: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.4, '#BBB'],\n                                    [0.6, '#888']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.1, '#000'],\n                                    [0.3, '#333']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'yellow'\n                            }\n                        }\n                    }\n                },\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(16, 16, 16, 0.5)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                barBorderColor: '#CCC',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                buttonBorderColor: '#CCC',\n                rifleColor: '#FFF',\n                trackBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#000'],\n                        [1, '#333']\n                    ]\n                },\n                trackBorderColor: '#666'\n            },\n\n            // special colors for some of the\n            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n            background2: 'rgb(35, 35, 70)',\n            dataLabelsColor: '#444',\n            textColor: '#C0C0C0',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/dark-green.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Dark blue theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#DDDF0D', '#55BF3B', '#DF5353', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: [0, 0, 250, 500],\n                    stops: [\n                        [0, 'rgb(48, 96, 48)'],\n                        [1, 'rgb(0, 0, 0)']\n                    ]\n                },\n                borderColor: '#000000',\n                borderWidth: 2,\n                className: 'dark-container',\n                plotBackgroundColor: 'rgba(255, 255, 255, .1)',\n                plotBorderColor: '#CCCCCC',\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#C0C0C0',\n                    font: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#666666',\n                    font: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineColor: '#333333',\n                gridLineWidth: 1,\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                tickColor: '#A0A0A0',\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n                    }\n                }\n            },\n            yAxis: {\n                gridLineColor: '#333333',\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                minorTickInterval: null,\n                tickColor: '#A0A0A0',\n                tickWidth: 1,\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n                    }\n                }\n            },\n            tooltip: {\n                backgroundColor: 'rgba(0, 0, 0, 0.75)',\n                style: {\n                    color: '#F0F0F0'\n                }\n            },\n            toolbar: {\n                itemStyle: {\n                    color: 'silver'\n                }\n            },\n            plotOptions: {\n                line: {\n                    dataLabels: {\n                        color: '#CCC'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                spline: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                scatter: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                candlestick: {\n                    lineColor: 'white'\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: '#A0A0A0'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#444'\n                }\n            },\n            credits: {\n                style: {\n                    color: '#666'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#CCC'\n                }\n            },\n\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    hoverSymbolStroke: '#FFFFFF',\n                    theme: {\n                        fill: {\n                            linearGradient: {\n                                x1: 0,\n                                y1: 0,\n                                x2: 0,\n                                y2: 1\n                            },\n                            stops: [\n                                [0.4, '#606060'],\n                                [0.6, '#333333']\n                            ]\n                        },\n                        stroke: '#000000'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: {\n                        linearGradient: {\n                            x1: 0,\n                            y1: 0,\n                            x2: 0,\n                            y2: 1\n                        },\n                        stops: [\n                            [0.4, '#888'],\n                            [0.6, '#555']\n                        ]\n                    },\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold'\n                    },\n                    states: {\n                        hover: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.4, '#BBB'],\n                                    [0.6, '#888']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.1, '#000'],\n                                    [0.3, '#333']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'yellow'\n                            }\n                        }\n                    }\n                },\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(16, 16, 16, 0.5)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                barBorderColor: '#CCC',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                buttonBorderColor: '#CCC',\n                rifleColor: '#FFF',\n                trackBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#000'],\n                        [1, '#333']\n                    ]\n                },\n                trackBorderColor: '#666'\n            },\n\n            // special colors for some of the\n            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n            background2: 'rgb(35, 35, 70)',\n            dataLabelsColor: '#444',\n            textColor: '#C0C0C0',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/dark-unica.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Dark theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        /* global document */\n        // Load the fonts\n        Highcharts.createElement('link', {\n            href: 'https://fonts.googleapis.com/css?family=Unica+One',\n            rel: 'stylesheet',\n            type: 'text/css'\n        }, null, document.getElementsByTagName('head')[0]);\n\n        Highcharts.theme = {\n            colors: ['#2b908f', '#90ee7e', '#f45b5b', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 1,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#2a2a2b'],\n                        [1, '#3e3e40']\n                    ]\n                },\n                style: {\n                    fontFamily: '\\'Unica One\\', sans-serif'\n                },\n                plotBorderColor: '#606063'\n            },\n            title: {\n                style: {\n                    color: '#E0E0E3',\n                    textTransform: 'uppercase',\n                    fontSize: '20px'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#E0E0E3',\n                    textTransform: 'uppercase'\n                }\n            },\n            xAxis: {\n                gridLineColor: '#707073',\n                labels: {\n                    style: {\n                        color: '#E0E0E3'\n                    }\n                },\n                lineColor: '#707073',\n                minorGridLineColor: '#505053',\n                tickColor: '#707073',\n                title: {\n                    style: {\n                        color: '#A0A0A3'\n\n                    }\n                }\n            },\n            yAxis: {\n                gridLineColor: '#707073',\n                labels: {\n                    style: {\n                        color: '#E0E0E3'\n                    }\n                },\n                lineColor: '#707073',\n                minorGridLineColor: '#505053',\n                tickColor: '#707073',\n                tickWidth: 1,\n                title: {\n                    style: {\n                        color: '#A0A0A3'\n                    }\n                }\n            },\n            tooltip: {\n                backgroundColor: 'rgba(0, 0, 0, 0.85)',\n                style: {\n                    color: '#F0F0F0'\n                }\n            },\n            plotOptions: {\n                series: {\n                    dataLabels: {\n                        color: '#B0B0B3'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                boxplot: {\n                    fillColor: '#505053'\n                },\n                candlestick: {\n                    lineColor: 'white'\n                },\n                errorbar: {\n                    color: 'white'\n                }\n            },\n            legend: {\n                itemStyle: {\n                    color: '#E0E0E3'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#606063'\n                }\n            },\n            credits: {\n                style: {\n                    color: '#666'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#707073'\n                }\n            },\n\n            drilldown: {\n                activeAxisLabelStyle: {\n                    color: '#F0F0F3'\n                },\n                activeDataLabelStyle: {\n                    color: '#F0F0F3'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    theme: {\n                        fill: '#505053'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: '#505053',\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC'\n                    },\n                    states: {\n                        hover: {\n                            fill: '#707073',\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: '#000003',\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        }\n                    }\n                },\n                inputBoxBorderColor: '#505053',\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(255,255,255,0.1)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                },\n                xAxis: {\n                    gridLineColor: '#505053'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: '#808083',\n                barBorderColor: '#808083',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: '#606063',\n                buttonBorderColor: '#606063',\n                rifleColor: '#FFF',\n                trackBackgroundColor: '#404043',\n                trackBorderColor: '#404043'\n            },\n\n            // special colors for some of the\n            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n            background2: '#505053',\n            dataLabelsColor: '#B0B0B3',\n            textColor: '#C0C0C0',\n            contrastTextColor: '#F0F0F3',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/gray.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Gray theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#DDDF0D', '#7798BF', '#55BF3B', '#DF5353', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgb(96, 96, 96)'],\n                        [1, 'rgb(16, 16, 16)']\n                    ]\n                },\n                borderWidth: 0,\n                borderRadius: 0,\n                plotBackgroundColor: null,\n                plotShadow: false,\n                plotBorderWidth: 0\n            },\n            title: {\n                style: {\n                    color: '#FFF',\n                    font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#DDD',\n                    font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 0,\n                lineColor: '#999',\n                tickColor: '#999',\n                labels: {\n                    style: {\n                        color: '#999',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#AAA',\n                        font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            yAxis: {\n                alternateGridColor: null,\n                minorTickInterval: null,\n                gridLineColor: 'rgba(255, 255, 255, .1)',\n                minorGridLineColor: 'rgba(255,255,255,0.07)',\n                lineWidth: 0,\n                tickWidth: 0,\n                labels: {\n                    style: {\n                        color: '#999',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#AAA',\n                        font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            legend: {\n                itemStyle: {\n                    color: '#CCC'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#333'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#CCC'\n                }\n            },\n            tooltip: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgba(96, 96, 96, .8)'],\n                        [1, 'rgba(16, 16, 16, .8)']\n                    ]\n                },\n                borderWidth: 0,\n                style: {\n                    color: '#FFF'\n                }\n            },\n\n\n            plotOptions: {\n                series: {\n                    nullColor: '#444444'\n                },\n                line: {\n                    dataLabels: {\n                        color: '#CCC'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                spline: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                scatter: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                candlestick: {\n                    lineColor: 'white'\n                }\n            },\n\n            toolbar: {\n                itemStyle: {\n                    color: '#CCC'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    hoverSymbolStroke: '#FFFFFF',\n                    theme: {\n                        fill: {\n                            linearGradient: {\n                                x1: 0,\n                                y1: 0,\n                                x2: 0,\n                                y2: 1\n                            },\n                            stops: [\n                                [0.4, '#606060'],\n                                [0.6, '#333333']\n                            ]\n                        },\n                        stroke: '#000000'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: {\n                        linearGradient: {\n                            x1: 0,\n                            y1: 0,\n                            x2: 0,\n                            y2: 1\n                        },\n                        stops: [\n                            [0.4, '#888'],\n                            [0.6, '#555']\n                        ]\n                    },\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold'\n                    },\n                    states: {\n                        hover: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.4, '#BBB'],\n                                    [0.6, '#888']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.1, '#000'],\n                                    [0.3, '#333']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'yellow'\n                            }\n                        }\n                    }\n                },\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(16, 16, 16, 0.5)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                barBorderColor: '#CCC',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                buttonBorderColor: '#CCC',\n                rifleColor: '#FFF',\n                trackBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#000'],\n                        [1, '#333']\n                    ]\n                },\n                trackBorderColor: '#666'\n            },\n\n            // special colors for some of the demo examples\n            legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',\n            background2: 'rgb(70, 70, 70)',\n            dataLabelsColor: '#444',\n            textColor: '#E0E0E0',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/grid-light.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Grid-light theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        /* global document */\n        // Load the fonts\n        Highcharts.createElement('link', {\n            href: 'https://fonts.googleapis.com/css?family=Dosis:400,600',\n            rel: 'stylesheet',\n            type: 'text/css'\n        }, null, document.getElementsByTagName('head')[0]);\n\n        Highcharts.theme = {\n            colors: ['#7cb5ec', '#f7a35c', '#90ee7e', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: null,\n                style: {\n                    fontFamily: 'Dosis, sans-serif'\n                }\n            },\n            title: {\n                style: {\n                    fontSize: '16px',\n                    fontWeight: 'bold',\n                    textTransform: 'uppercase'\n                }\n            },\n            tooltip: {\n                borderWidth: 0,\n                backgroundColor: 'rgba(219,219,216,0.8)',\n                shadow: false\n            },\n            legend: {\n                itemStyle: {\n                    fontWeight: 'bold',\n                    fontSize: '13px'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 1,\n                labels: {\n                    style: {\n                        fontSize: '12px'\n                    }\n                }\n            },\n            yAxis: {\n                minorTickInterval: 'auto',\n                title: {\n                    style: {\n                        textTransform: 'uppercase'\n                    }\n                },\n                labels: {\n                    style: {\n                        fontSize: '12px'\n                    }\n                }\n            },\n            plotOptions: {\n                candlestick: {\n                    lineColor: '#404048'\n                }\n            },\n\n\n            // General\n            background2: '#F0F0EA'\n\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/grid.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Grid theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 1,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgb(255, 255, 255)'],\n                        [1, 'rgb(240, 240, 255)']\n                    ]\n                },\n                borderWidth: 2,\n                plotBackgroundColor: 'rgba(255, 255, 255, .9)',\n                plotShadow: true,\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#000',\n                    font: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#666666',\n                    font: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 1,\n                lineColor: '#000',\n                tickColor: '#000',\n                labels: {\n                    style: {\n                        color: '#000',\n                        font: '11px Trebuchet MS, Verdana, sans-serif'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#333',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n                    }\n                }\n            },\n            yAxis: {\n                minorTickInterval: 'auto',\n                lineColor: '#000',\n                lineWidth: 1,\n                tickWidth: 1,\n                tickColor: '#000',\n                labels: {\n                    style: {\n                        color: '#000',\n                        font: '11px Trebuchet MS, Verdana, sans-serif'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#333',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n                    }\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: 'black'\n\n                },\n                itemHoverStyle: {\n                    color: '#039'\n                },\n                itemHiddenStyle: {\n                    color: 'gray'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#99b'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    theme: {\n                        stroke: '#CCCCCC'\n                    }\n                }\n            }\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/sand-signika.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Sand-Signika theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        /* global document */\n        // Load the fonts\n        Highcharts.createElement('link', {\n            href: 'https://fonts.googleapis.com/css?family=Signika:400,700',\n            rel: 'stylesheet',\n            type: 'text/css'\n        }, null, document.getElementsByTagName('head')[0]);\n\n        // Add the background image to the container\n        Highcharts.wrap(Highcharts.Chart.prototype, 'getContainer', function(proceed) {\n            proceed.call(this);\n            this.container.style.background = 'url(http://www.highcharts.com/samples/graphics/sand.png)';\n        });\n\n\n        Highcharts.theme = {\n            colors: ['#f45b5b', '#8085e9', '#8d4654', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: null,\n                style: {\n                    fontFamily: 'Signika, serif'\n                }\n            },\n            title: {\n                style: {\n                    color: 'black',\n                    fontSize: '16px',\n                    fontWeight: 'bold'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: 'black'\n                }\n            },\n            tooltip: {\n                borderWidth: 0\n            },\n            legend: {\n                itemStyle: {\n                    fontWeight: 'bold',\n                    fontSize: '13px'\n                }\n            },\n            xAxis: {\n                labels: {\n                    style: {\n                        color: '#6e6e70'\n                    }\n                }\n            },\n            yAxis: {\n                labels: {\n                    style: {\n                        color: '#6e6e70'\n                    }\n                }\n            },\n            plotOptions: {\n                series: {\n                    shadow: true\n                },\n                candlestick: {\n                    lineColor: '#404048'\n                },\n                map: {\n                    shadow: false\n                }\n            },\n\n            // Highstock specific\n            navigator: {\n                xAxis: {\n                    gridLineColor: '#D0D0D8'\n                }\n            },\n            rangeSelector: {\n                buttonTheme: {\n                    fill: 'white',\n                    stroke: '#C0C0C8',\n                    'stroke-width': 1,\n                    states: {\n                        select: {\n                            fill: '#D0D0D8'\n                        }\n                    }\n                }\n            },\n            scrollbar: {\n                trackBorderColor: '#C0C0C8'\n            },\n\n            // General\n            background2: '#E0E0E8'\n\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/js/themes/skies.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Skies theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#514F78', '#42A07B', '#9B5E4A', '#72727F', '#1F949A', '#82914E', '#86777F', '#42A07B'],\n            chart: {\n                className: 'skies',\n                borderWidth: 0,\n                plotShadow: true,\n                plotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',\n                plotBackgroundColor: {\n                    linearGradient: [0, 0, 250, 500],\n                    stops: [\n                        [0, 'rgba(255, 255, 255, 1)'],\n                        [1, 'rgba(255, 255, 255, 0)']\n                    ]\n                },\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#3E576F',\n                    font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#6D869F',\n                    font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 0,\n                lineColor: '#C0D0E0',\n                tickColor: '#C0D0E0',\n                labels: {\n                    style: {\n                        color: '#666',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#666',\n                        font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            yAxis: {\n                alternateGridColor: 'rgba(255, 255, 255, .5)',\n                lineColor: '#C0D0E0',\n                tickColor: '#C0D0E0',\n                tickWidth: 1,\n                labels: {\n                    style: {\n                        color: '#666',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#666',\n                        font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: '#3E576F'\n                },\n                itemHoverStyle: {\n                    color: 'black'\n                },\n                itemHiddenStyle: {\n                    color: 'silver'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#3E576F'\n                }\n            }\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/lib/canvg.js",
    "content": "/*\n\n canvg.js - Javascript SVG parser and renderer on Canvas\n MIT Licensed\n Gabe Lerner (gabelerner@gmail.com)\n http://code.google.com/p/canvg/\n\n Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\n*/\n(function(x,y){\"undefined\"!==typeof define&&define.amd?define(\"canvgModule\",[\"rgbcolor\",\"stackblur\"],y):\"undefined\"!==typeof module&&module.exports&&(module.exports=y(require(\"rgbcolor\"),require(\"stackblur\")));x.canvg=y(x.RGBColor,x.stackBlur)})(\"undefined\"!==typeof window?window:this,function(x,y){function A(h){var a=[0,0,0],l=function(c,b){var e=h.match(c);null!=e&&(a[b]+=e.length,h=h.replace(c,\" \"))};h=h.replace(/:not\\(([^\\)]*)\\)/g,\"     $1 \");h=h.replace(/{[^]*/gm,\" \");l(B,1);l(C,0);l(D,1);l(E,\n2);l(F,1);l(G,1);h=h.replace(/[\\*\\s\\+>~]/g,\" \");h=h.replace(/[#\\.]/g,\" \");l(H,2);return a.join(\"\")}function I(h){var a={opts:h,FRAMERATE:30,MAX_VIRTUAL_PIXELS:3E4,log:function(a){}};1==a.opts.log&&\"undefined\"!=typeof console&&(a.log=function(a){console.log(a)});a.init=function(c){var b=0;a.UniqueId=function(){b++;return\"canvg\"+b};a.Definitions={};a.Styles={};a.StylesSpecificity={};a.Animations=[];a.Images=[];a.ctx=c;a.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=\n[]};this.SetCurrent=function(a,b){this.viewPorts.push({width:a,height:b})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};this.ComputeSize=function(a){return null!=a&&\"number\"==typeof a?a:\"x\"==a?this.width():\"y\"==a?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};a.init();a.ImagesLoaded=\nfunction(){for(var c=0;c<a.Images.length;c++)if(!a.Images[c].loaded)return!1;return!0};a.trim=function(a){return a.replace(/^\\s+|\\s+$/g,\"\")};a.compressSpaces=function(a){return a.replace(/[\\s\\r\\t\\n]+/gm,\" \")};a.ajax=function(a){var b;b=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject(\"Microsoft.XMLHTTP\");b.open(\"GET\",a,!1);b.send(null);return b.responseText};a.parseXml=function(a){if(\"undefined\"!=typeof Windows&&\"undefined\"!=typeof Windows.Data&&\"undefined\"!=typeof Windows.Data.Xml){var b=\nnew Windows.Data.Xml.Dom.XmlDocument,e=new Windows.Data.Xml.Dom.XmlLoadSettings;e.prohibitDtd=!1;b.loadXml(a,e);return b}if(window.DOMParser)return(new DOMParser).parseFromString(a,\"text/xml\");a=a.replace(/<!DOCTYPE svg[^>]*>/,\"\");b=new ActiveXObject(\"Microsoft.XMLDOM\");b.async=\"false\";b.loadXML(a);return b};a.Property=function(a,b){this.name=a;this.value=b};a.Property.prototype.getValue=function(){return this.value};a.Property.prototype.hasValue=function(){return null!=this.value&&\"\"!==this.value};\na.Property.prototype.numValue=function(){if(!this.hasValue())return 0;var a=parseFloat(this.value);(this.value+\"\").match(/%$/)&&(a/=100);return a};a.Property.prototype.valueOrDefault=function(a){return this.hasValue()?this.value:a};a.Property.prototype.numValueOrDefault=function(a){return this.hasValue()?this.numValue():a};a.Property.prototype.addOpacity=function(c){var b=this.value;if(null!=c.value&&\"\"!=c.value&&\"string\"==typeof this.value){var e=new x(this.value);e.ok&&(b=\"rgba(\"+e.r+\", \"+e.g+\", \"+\ne.b+\", \"+c.numValue()+\")\")}return new a.Property(this.name,b)};a.Property.prototype.getDefinition=function(){var c=this.value.match(/#([^\\)'\"]+)/);c&&(c=c[1]);c||(c=this.value);return a.Definitions[c]};a.Property.prototype.isUrlDefinition=function(){return 0==this.value.indexOf(\"url(\")};a.Property.prototype.getFillStyleDefinition=function(c,b){var e=this.getDefinition();if(null!=e&&e.createGradient)return e.createGradient(a.ctx,c,b);if(null!=e&&e.createPattern){if(e.getHrefAttribute().hasValue()){var d=\ne.attribute(\"patternTransform\"),e=e.getHrefAttribute().getDefinition();d.hasValue()&&(e.attribute(\"patternTransform\",!0).value=d.value)}return e.createPattern(a.ctx,c)}return null};a.Property.prototype.getDPI=function(a){return 96};a.Property.prototype.getEM=function(c){var b=12,e=new a.Property(\"fontSize\",a.Font.Parse(a.ctx.font).fontSize);e.hasValue()&&(b=e.toPixels(c));return b};a.Property.prototype.getUnits=function(){return(this.value+\"\").replace(/[0-9\\.\\-]/g,\"\")};a.Property.prototype.toPixels=\nfunction(c,b){if(!this.hasValue())return 0;var e=this.value+\"\";if(e.match(/em$/))return this.numValue()*this.getEM(c);if(e.match(/ex$/))return this.numValue()*this.getEM(c)/2;if(e.match(/px$/))return this.numValue();if(e.match(/pt$/))return this.numValue()*this.getDPI(c)*(1/72);if(e.match(/pc$/))return 15*this.numValue();if(e.match(/cm$/))return this.numValue()*this.getDPI(c)/2.54;if(e.match(/mm$/))return this.numValue()*this.getDPI(c)/25.4;if(e.match(/in$/))return this.numValue()*this.getDPI(c);\nif(e.match(/%$/))return this.numValue()*a.ViewPort.ComputeSize(c);e=this.numValue();return b&&1>e?e*a.ViewPort.ComputeSize(c):e};a.Property.prototype.toMilliseconds=function(){if(!this.hasValue())return 0;var a=this.value+\"\";if(a.match(/s$/))return 1E3*this.numValue();a.match(/ms$/);return this.numValue()};a.Property.prototype.toRadians=function(){if(!this.hasValue())return 0;var a=this.value+\"\";return a.match(/deg$/)?this.numValue()*(Math.PI/180):a.match(/grad$/)?this.numValue()*(Math.PI/200):a.match(/rad$/)?\nthis.numValue():this.numValue()*(Math.PI/180)};var l={baseline:\"alphabetic\",\"before-edge\":\"top\",\"text-before-edge\":\"top\",middle:\"middle\",central:\"middle\",\"after-edge\":\"bottom\",\"text-after-edge\":\"bottom\",ideographic:\"ideographic\",alphabetic:\"alphabetic\",hanging:\"hanging\",mathematical:\"alphabetic\"};a.Property.prototype.toTextBaseline=function(){return this.hasValue()?l[this.value]:null};a.Font=new function(){this.Styles=\"normal|italic|oblique|inherit\";this.Variants=\"normal|small-caps|inherit\";this.Weights=\n\"normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit\";this.CreateFont=function(b,e,d,c,f,g){g=null!=g?this.Parse(g):this.CreateFont(\"\",\"\",\"\",\"\",\"\",a.ctx.font);return{fontFamily:f||g.fontFamily,fontSize:c||g.fontSize,fontStyle:b||g.fontStyle,fontWeight:d||g.fontWeight,fontVariant:e||g.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(\" \")}}};var c=this;this.Parse=function(b){var e={};b=a.trim(a.compressSpaces(b||\n\"\")).split(\" \");for(var d=!1,k=!1,f=!1,g=!1,m=\"\",n=0;n<b.length;n++)k||-1==c.Styles.indexOf(b[n])?g||-1==c.Variants.indexOf(b[n])?f||-1==c.Weights.indexOf(b[n])?d?\"inherit\"!=b[n]&&(m+=b[n]):(\"inherit\"!=b[n]&&(e.fontSize=b[n].split(\"/\")[0]),k=g=f=d=!0):(\"inherit\"!=b[n]&&(e.fontWeight=b[n]),k=g=f=!0):(\"inherit\"!=b[n]&&(e.fontVariant=b[n]),k=g=!0):(\"inherit\"!=b[n]&&(e.fontStyle=b[n]),k=!0);\"\"!=m&&(e.fontFamily=m);return e}};a.ToNumberArray=function(c){c=a.trim(a.compressSpaces((c||\"\").replace(/,/g,\" \"))).split(\" \");\nfor(var b=0;b<c.length;b++)c[b]=parseFloat(c[b]);return c};a.Point=function(a,b){this.x=a;this.y=b};a.Point.prototype.angleTo=function(a){return Math.atan2(a.y-this.y,a.x-this.x)};a.Point.prototype.applyTransform=function(a){var b=this.x*a[1]+this.y*a[3]+a[5];this.x=this.x*a[0]+this.y*a[2]+a[4];this.y=b};a.CreatePoint=function(c){c=a.ToNumberArray(c);return new a.Point(c[0],c[1])};a.CreatePath=function(c){c=a.ToNumberArray(c);for(var b=[],e=0;e<c.length;e+=2)b.push(new a.Point(c[e],c[e+1]));return b};\na.BoundingBox=function(a,b,e,d){this.y2=this.x2=this.y1=this.x1=Number.NaN;this.x=function(){return this.x1};this.y=function(){return this.y1};this.width=function(){return this.x2-this.x1};this.height=function(){return this.y2-this.y1};this.addPoint=function(a,b){if(null!=a){if(isNaN(this.x1)||isNaN(this.x2))this.x2=this.x1=a;a<this.x1&&(this.x1=a);a>this.x2&&(this.x2=a)}if(null!=b){if(isNaN(this.y1)||isNaN(this.y2))this.y2=this.y1=b;b<this.y1&&(this.y1=b);b>this.y2&&(this.y2=b)}};this.addX=function(a){this.addPoint(a,\nnull)};this.addY=function(a){this.addPoint(null,a)};this.addBoundingBox=function(a){this.addPoint(a.x1,a.y1);this.addPoint(a.x2,a.y2)};this.addQuadraticCurve=function(a,b,e,d,c,r){e=a+2/3*(e-a);d=b+2/3*(d-b);this.addBezierCurve(a,b,e,e+1/3*(c-a),d,d+1/3*(r-b),c,r)};this.addBezierCurve=function(a,b,e,d,c,r,u,p){var t=[a,b],h=[e,d],q=[c,r],l=[u,p];this.addPoint(t[0],t[1]);this.addPoint(l[0],l[1]);for(i=0;1>=i;i++)a=function(a){return Math.pow(1-a,3)*t[i]+3*Math.pow(1-a,2)*a*h[i]+3*(1-a)*Math.pow(a,\n2)*q[i]+Math.pow(a,3)*l[i]},b=6*t[i]-12*h[i]+6*q[i],e=-3*t[i]+9*h[i]-9*q[i]+3*l[i],d=3*h[i]-3*t[i],0==e?0!=b&&(b=-d/b,0<b&&1>b&&(0==i&&this.addX(a(b)),1==i&&this.addY(a(b)))):(d=Math.pow(b,2)-4*d*e,0>d||(c=(-b+Math.sqrt(d))/(2*e),0<c&&1>c&&(0==i&&this.addX(a(c)),1==i&&this.addY(a(c))),b=(-b-Math.sqrt(d))/(2*e),0<b&&1>b&&(0==i&&this.addX(a(b)),1==i&&this.addY(a(b)))))};this.isPointInBox=function(a,b){return this.x1<=a&&a<=this.x2&&this.y1<=b&&b<=this.y2};this.addPoint(a,b);this.addPoint(e,d)};a.Transform=\nfunction(c){var b=this;this.Type={};this.Type.translate=function(b){this.p=a.CreatePoint(b);this.apply=function(a){a.translate(this.p.x||0,this.p.y||0)};this.unapply=function(a){a.translate(-1*this.p.x||0,-1*this.p.y||0)};this.applyToPoint=function(a){a.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0])}};this.Type.rotate=function(b){b=a.ToNumberArray(b);this.angle=new a.Property(\"angle\",b[0]);this.cx=b[1]||0;this.cy=b[2]||0;this.apply=function(a){a.translate(this.cx,this.cy);a.rotate(this.angle.toRadians());\na.translate(-this.cx,-this.cy)};this.unapply=function(a){a.translate(this.cx,this.cy);a.rotate(-1*this.angle.toRadians());a.translate(-this.cx,-this.cy)};this.applyToPoint=function(a){var b=this.angle.toRadians();a.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0]);a.applyTransform([Math.cos(b),Math.sin(b),-Math.sin(b),Math.cos(b),0,0]);a.applyTransform([1,0,0,1,-this.p.x||0,-this.p.y||0])}};this.Type.scale=function(b){this.p=a.CreatePoint(b);this.apply=function(a){a.scale(this.p.x||1,this.p.y||this.p.x||\n1)};this.unapply=function(a){a.scale(1/this.p.x||1,1/this.p.y||this.p.x||1)};this.applyToPoint=function(a){a.applyTransform([this.p.x||0,0,0,this.p.y||0,0,0])}};this.Type.matrix=function(b){this.m=a.ToNumberArray(b);this.apply=function(a){a.transform(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5])};this.unapply=function(a){var b=this.m[0],e=this.m[2],d=this.m[4],c=this.m[1],f=this.m[3],k=this.m[5],h=1/(b*(1*f-0*k)-e*(1*c-0*k)+d*(0*c-0*f));a.transform(h*(1*f-0*k),h*(0*k-1*c),h*(0*d-1*\ne),h*(1*b-0*d),h*(e*k-d*f),h*(d*c-b*k))};this.applyToPoint=function(a){a.applyTransform(this.m)}};this.Type.SkewBase=function(e){this.base=b.Type.matrix;this.base(e);this.angle=new a.Property(\"angle\",e)};this.Type.SkewBase.prototype=new this.Type.matrix;this.Type.skewX=function(a){this.base=b.Type.SkewBase;this.base(a);this.m=[1,0,Math.tan(this.angle.toRadians()),1,0,0]};this.Type.skewX.prototype=new this.Type.SkewBase;this.Type.skewY=function(a){this.base=b.Type.SkewBase;this.base(a);this.m=[1,Math.tan(this.angle.toRadians()),\n0,1,0,0]};this.Type.skewY.prototype=new this.Type.SkewBase;this.transforms=[];this.apply=function(a){for(var b=0;b<this.transforms.length;b++)this.transforms[b].apply(a)};this.unapply=function(a){for(var b=this.transforms.length-1;0<=b;b--)this.transforms[b].unapply(a)};this.applyToPoint=function(a){for(var b=0;b<this.transforms.length;b++)this.transforms[b].applyToPoint(a)};c=a.trim(a.compressSpaces(c)).replace(/\\)([a-zA-Z])/g,\") $1\").replace(/\\)(\\s?,\\s?)/g,\") \").split(/\\s(?=[a-z])/);for(var e=0;e<\nc.length;e++){var d=a.trim(c[e].split(\"(\")[0]),k=c[e].split(\"(\")[1].replace(\")\",\"\"),k=new this.Type[d](k);k.type=d;this.transforms.push(k)}};a.AspectRatio=function(c,b,e,d,k,f,g,m,n,r){b=a.compressSpaces(b);b=b.replace(/^defer\\s/,\"\");var h=b.split(\" \")[0]||\"xMidYMid\";b=b.split(\" \")[1]||\"meet\";var p=e/d,t=k/f,l=Math.min(p,t),q=Math.max(p,t);\"meet\"==b&&(d*=l,f*=l);\"slice\"==b&&(d*=q,f*=q);n=new a.Property(\"refX\",n);r=new a.Property(\"refY\",r);n.hasValue()&&r.hasValue()?c.translate(-l*n.toPixels(\"x\"),\n-l*r.toPixels(\"y\")):(h.match(/^xMid/)&&(\"meet\"==b&&l==t||\"slice\"==b&&q==t)&&c.translate(e/2-d/2,0),h.match(/YMid$/)&&(\"meet\"==b&&l==p||\"slice\"==b&&q==p)&&c.translate(0,k/2-f/2),h.match(/^xMax/)&&(\"meet\"==b&&l==t||\"slice\"==b&&q==t)&&c.translate(e-d,0),h.match(/YMax$/)&&(\"meet\"==b&&l==p||\"slice\"==b&&q==p)&&c.translate(0,k-f));\"none\"==h?c.scale(p,t):\"meet\"==b?c.scale(l,l):\"slice\"==b&&c.scale(q,q);c.translate(null==g?0:-g,null==m?0:-m)};a.Element={};a.EmptyProperty=new a.Property(\"EMPTY\",\"\");a.Element.ElementBase=\nfunction(c){this.attributes={};this.styles={};this.stylesSpecificity={};this.children=[];this.attribute=function(b,e){var d=this.attributes[b];if(null!=d)return d;1==e&&(d=new a.Property(b,\"\"),this.attributes[b]=d);return d||a.EmptyProperty};this.getHrefAttribute=function(){for(var b in this.attributes)if(\"href\"==b||b.match(/:href$/))return this.attributes[b];return a.EmptyProperty};this.style=function(b,e,d){var c=this.styles[b];if(null!=c)return c;var k=this.attribute(b);if(null!=k&&k.hasValue())return this.styles[b]=\nk;if(1!=d&&(d=this.parent,null!=d&&(d=d.style(b),null!=d&&d.hasValue())))return d;1==e&&(c=new a.Property(b,\"\"),this.styles[b]=c);return c||a.EmptyProperty};this.render=function(a){if(\"none\"!=this.style(\"display\").value&&\"hidden\"!=this.style(\"visibility\").value){a.save();if(this.style(\"mask\").hasValue()){var b=this.style(\"mask\").getDefinition();null!=b&&b.apply(a,this)}else this.style(\"filter\").hasValue()?(b=this.style(\"filter\").getDefinition(),null!=b&&b.apply(a,this)):(this.setContext(a),this.renderChildren(a),\nthis.clearContext(a));a.restore()}};this.setContext=function(a){};this.clearContext=function(a){};this.renderChildren=function(a){for(var b=0;b<this.children.length;b++)this.children[b].render(a)};this.addChild=function(b,e){var d=b;e&&(d=a.CreateElement(b));d.parent=this;\"title\"!=d.type&&this.children.push(d)};this.addStylesFromStyleDefinition=function(){for(var b in a.Styles)if(\"@\"!=b[0]&&w(c,b)){var e=a.Styles[b],d=a.StylesSpecificity[b];if(null!=e)for(var k in e){var r=this.stylesSpecificity[k];\n\"undefined\"==typeof r&&(r=\"000\");d>r&&(this.styles[k]=e[k],this.stylesSpecificity[k]=d)}}};if(null!=c&&1==c.nodeType){for(var b=0;b<c.attributes.length;b++){var e=c.attributes[b];this.attributes[e.nodeName]=new a.Property(e.nodeName,e.value)}this.addStylesFromStyleDefinition();if(this.attribute(\"style\").hasValue())for(e=this.attribute(\"style\").value.split(\";\"),b=0;b<e.length;b++)if(\"\"!=a.trim(e[b])){var d=e[b].split(\":\"),k=a.trim(d[0]),d=a.trim(d[1]);this.styles[k]=new a.Property(k,d)}this.attribute(\"id\").hasValue()&&\nnull==a.Definitions[this.attribute(\"id\").value]&&(a.Definitions[this.attribute(\"id\").value]=this);for(b=0;b<c.childNodes.length;b++)e=c.childNodes[b],1==e.nodeType&&this.addChild(e,!0),!this.captureTextNodes||3!=e.nodeType&&4!=e.nodeType||\"\"!=a.compressSpaces(e.value||e.text||e.textContent||\"\")&&this.addChild(new a.Element.tspan(e),!1)}};a.Element.RenderedElementBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.setContext=function(b){if(this.style(\"fill\").isUrlDefinition()){var e=\nthis.style(\"fill\").getFillStyleDefinition(this,this.style(\"fill-opacity\"));null!=e&&(b.fillStyle=e)}else this.style(\"fill\").hasValue()&&(e=this.style(\"fill\"),\"currentColor\"==e.value&&(e.value=this.style(\"color\").value),\"inherit\"!=e.value&&(b.fillStyle=\"none\"==e.value?\"rgba(0,0,0,0)\":e.value));this.style(\"fill-opacity\").hasValue()&&(e=new a.Property(\"fill\",b.fillStyle),e=e.addOpacity(this.style(\"fill-opacity\")),b.fillStyle=e.value);this.style(\"stroke\").isUrlDefinition()?(e=this.style(\"stroke\").getFillStyleDefinition(this,\nthis.style(\"stroke-opacity\")),null!=e&&(b.strokeStyle=e)):this.style(\"stroke\").hasValue()&&(e=this.style(\"stroke\"),\"currentColor\"==e.value&&(e.value=this.style(\"color\").value),\"inherit\"!=e.value&&(b.strokeStyle=\"none\"==e.value?\"rgba(0,0,0,0)\":e.value));this.style(\"stroke-opacity\").hasValue()&&(e=new a.Property(\"stroke\",b.strokeStyle),e=e.addOpacity(this.style(\"stroke-opacity\")),b.strokeStyle=e.value);this.style(\"stroke-width\").hasValue()&&(e=this.style(\"stroke-width\").toPixels(),b.lineWidth=0==e?\n.001:e);this.style(\"stroke-linecap\").hasValue()&&(b.lineCap=this.style(\"stroke-linecap\").value);this.style(\"stroke-linejoin\").hasValue()&&(b.lineJoin=this.style(\"stroke-linejoin\").value);this.style(\"stroke-miterlimit\").hasValue()&&(b.miterLimit=this.style(\"stroke-miterlimit\").value);this.style(\"stroke-dasharray\").hasValue()&&\"none\"!=this.style(\"stroke-dasharray\").value&&(e=a.ToNumberArray(this.style(\"stroke-dasharray\").value),\"undefined\"!=typeof b.setLineDash?b.setLineDash(e):\"undefined\"!=typeof b.webkitLineDash?\nb.webkitLineDash=e:\"undefined\"==typeof b.mozDash||1==e.length&&0==e[0]||(b.mozDash=e),e=this.style(\"stroke-dashoffset\").numValueOrDefault(1),\"undefined\"!=typeof b.lineDashOffset?b.lineDashOffset=e:\"undefined\"!=typeof b.webkitLineDashOffset?b.webkitLineDashOffset=e:\"undefined\"!=typeof b.mozDashOffset&&(b.mozDashOffset=e));\"undefined\"!=typeof b.font&&(b.font=a.Font.CreateFont(this.style(\"font-style\").value,this.style(\"font-variant\").value,this.style(\"font-weight\").value,this.style(\"font-size\").hasValue()?\nthis.style(\"font-size\").toPixels()+\"px\":\"\",this.style(\"font-family\").value).toString());this.style(\"transform\",!1,!0).hasValue()&&(new a.Transform(this.style(\"transform\",!1,!0).value)).apply(b);this.style(\"clip-path\",!1,!0).hasValue()&&(e=this.style(\"clip-path\",!1,!0).getDefinition(),null!=e&&e.apply(b));this.style(\"opacity\").hasValue()&&(b.globalAlpha=this.style(\"opacity\").numValue())}};a.Element.RenderedElementBase.prototype=new a.Element.ElementBase;a.Element.PathElementBase=function(c){this.base=\na.Element.RenderedElementBase;this.base(c);this.path=function(b){null!=b&&b.beginPath();return new a.BoundingBox};this.renderChildren=function(b){this.path(b);a.Mouse.checkPath(this,b);\"\"!=b.fillStyle&&(\"inherit\"!=this.style(\"fill-rule\").valueOrDefault(\"inherit\")?b.fill(this.style(\"fill-rule\").value):b.fill());\"\"!=b.strokeStyle&&b.stroke();var e=this.getMarkers();if(null!=e){if(this.style(\"marker-start\").isUrlDefinition()){var d=this.style(\"marker-start\").getDefinition();d.render(b,e[0][0],e[0][1])}if(this.style(\"marker-mid\").isUrlDefinition())for(var d=\nthis.style(\"marker-mid\").getDefinition(),c=1;c<e.length-1;c++)d.render(b,e[c][0],e[c][1]);this.style(\"marker-end\").isUrlDefinition()&&(d=this.style(\"marker-end\").getDefinition(),d.render(b,e[e.length-1][0],e[e.length-1][1]))}};this.getBoundingBox=function(){return this.path()};this.getMarkers=function(){return null}};a.Element.PathElementBase.prototype=new a.Element.RenderedElementBase;a.Element.svg=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseClearContext=this.clearContext;\nthis.clearContext=function(b){this.baseClearContext(b);a.ViewPort.RemoveCurrent()};this.baseSetContext=this.setContext;this.setContext=function(b){b.strokeStyle=\"rgba(0,0,0,0)\";b.lineCap=\"butt\";b.lineJoin=\"miter\";b.miterLimit=4;\"undefined\"!=typeof b.font&&\"undefined\"!=typeof window.getComputedStyle&&(b.font=window.getComputedStyle(b.canvas).getPropertyValue(\"font\"));this.baseSetContext(b);this.attribute(\"x\").hasValue()||(this.attribute(\"x\",!0).value=0);this.attribute(\"y\").hasValue()||(this.attribute(\"y\",\n!0).value=0);b.translate(this.attribute(\"x\").toPixels(\"x\"),this.attribute(\"y\").toPixels(\"y\"));var e=a.ViewPort.width(),d=a.ViewPort.height();this.attribute(\"width\").hasValue()||(this.attribute(\"width\",!0).value=\"100%\");this.attribute(\"height\").hasValue()||(this.attribute(\"height\",!0).value=\"100%\");if(\"undefined\"==typeof this.root){var e=this.attribute(\"width\").toPixels(\"x\"),d=this.attribute(\"height\").toPixels(\"y\"),c=0,f=0;this.attribute(\"refX\").hasValue()&&this.attribute(\"refY\").hasValue()&&(c=-this.attribute(\"refX\").toPixels(\"x\"),\nf=-this.attribute(\"refY\").toPixels(\"y\"));\"visible\"!=this.attribute(\"overflow\").valueOrDefault(\"hidden\")&&(b.beginPath(),b.moveTo(c,f),b.lineTo(e,f),b.lineTo(e,d),b.lineTo(c,d),b.closePath(),b.clip())}a.ViewPort.SetCurrent(e,d);if(this.attribute(\"viewBox\").hasValue()){var c=a.ToNumberArray(this.attribute(\"viewBox\").value),f=c[0],g=c[1],e=c[2],d=c[3];a.AspectRatio(b,this.attribute(\"preserveAspectRatio\").value,a.ViewPort.width(),e,a.ViewPort.height(),d,f,g,this.attribute(\"refX\").value,this.attribute(\"refY\").value);\na.ViewPort.RemoveCurrent();a.ViewPort.SetCurrent(c[2],c[3])}}};a.Element.svg.prototype=new a.Element.RenderedElementBase;a.Element.rect=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(b){var e=this.attribute(\"x\").toPixels(\"x\"),d=this.attribute(\"y\").toPixels(\"y\"),c=this.attribute(\"width\").toPixels(\"x\"),f=this.attribute(\"height\").toPixels(\"y\"),g=this.attribute(\"rx\").toPixels(\"x\"),m=this.attribute(\"ry\").toPixels(\"y\");this.attribute(\"rx\").hasValue()&&!this.attribute(\"ry\").hasValue()&&\n(m=g);this.attribute(\"ry\").hasValue()&&!this.attribute(\"rx\").hasValue()&&(g=m);g=Math.min(g,c/2);m=Math.min(m,f/2);null!=b&&(b.beginPath(),b.moveTo(e+g,d),b.lineTo(e+c-g,d),b.quadraticCurveTo(e+c,d,e+c,d+m),b.lineTo(e+c,d+f-m),b.quadraticCurveTo(e+c,d+f,e+c-g,d+f),b.lineTo(e+g,d+f),b.quadraticCurveTo(e,d+f,e,d+f-m),b.lineTo(e,d+m),b.quadraticCurveTo(e,d,e+g,d),b.closePath());return new a.BoundingBox(e,d,e+c,d+f)}};a.Element.rect.prototype=new a.Element.PathElementBase;a.Element.circle=function(c){this.base=\na.Element.PathElementBase;this.base(c);this.path=function(b){var e=this.attribute(\"cx\").toPixels(\"x\"),d=this.attribute(\"cy\").toPixels(\"y\"),c=this.attribute(\"r\").toPixels();null!=b&&(b.beginPath(),b.arc(e,d,c,0,2*Math.PI,!0),b.closePath());return new a.BoundingBox(e-c,d-c,e+c,d+c)}};a.Element.circle.prototype=new a.Element.PathElementBase;a.Element.ellipse=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(b){var e=(Math.sqrt(2)-1)/3*4,d=this.attribute(\"rx\").toPixels(\"x\"),\nc=this.attribute(\"ry\").toPixels(\"y\"),f=this.attribute(\"cx\").toPixels(\"x\"),g=this.attribute(\"cy\").toPixels(\"y\");null!=b&&(b.beginPath(),b.moveTo(f,g-c),b.bezierCurveTo(f+e*d,g-c,f+d,g-e*c,f+d,g),b.bezierCurveTo(f+d,g+e*c,f+e*d,g+c,f,g+c),b.bezierCurveTo(f-e*d,g+c,f-d,g+e*c,f-d,g),b.bezierCurveTo(f-d,g-e*c,f-e*d,g-c,f,g-c),b.closePath());return new a.BoundingBox(f-d,g-c,f+d,g+c)}};a.Element.ellipse.prototype=new a.Element.PathElementBase;a.Element.line=function(c){this.base=a.Element.PathElementBase;\nthis.base(c);this.getPoints=function(){return[new a.Point(this.attribute(\"x1\").toPixels(\"x\"),this.attribute(\"y1\").toPixels(\"y\")),new a.Point(this.attribute(\"x2\").toPixels(\"x\"),this.attribute(\"y2\").toPixels(\"y\"))]};this.path=function(b){var e=this.getPoints();null!=b&&(b.beginPath(),b.moveTo(e[0].x,e[0].y),b.lineTo(e[1].x,e[1].y));return new a.BoundingBox(e[0].x,e[0].y,e[1].x,e[1].y)};this.getMarkers=function(){var a=this.getPoints(),e=a[0].angleTo(a[1]);return[[a[0],e],[a[1],e]]}};a.Element.line.prototype=\nnew a.Element.PathElementBase;a.Element.polyline=function(c){this.base=a.Element.PathElementBase;this.base(c);this.points=a.CreatePath(this.attribute(\"points\").value);this.path=function(b){var e=new a.BoundingBox(this.points[0].x,this.points[0].y);null!=b&&(b.beginPath(),b.moveTo(this.points[0].x,this.points[0].y));for(var d=1;d<this.points.length;d++)e.addPoint(this.points[d].x,this.points[d].y),null!=b&&b.lineTo(this.points[d].x,this.points[d].y);return e};this.getMarkers=function(){for(var a=[],\ne=0;e<this.points.length-1;e++)a.push([this.points[e],this.points[e].angleTo(this.points[e+1])]);a.push([this.points[this.points.length-1],a[a.length-1][1]]);return a}};a.Element.polyline.prototype=new a.Element.PathElementBase;a.Element.polygon=function(c){this.base=a.Element.polyline;this.base(c);this.basePath=this.path;this.path=function(a){var e=this.basePath(a);null!=a&&(a.lineTo(this.points[0].x,this.points[0].y),a.closePath());return e}};a.Element.polygon.prototype=new a.Element.polyline;a.Element.path=\nfunction(c){this.base=a.Element.PathElementBase;this.base(c);c=this.attribute(\"d\").value;c=c.replace(/,/gm,\" \");for(var b=0;2>b;b++)c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,\"$1 $2\");c=c.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,\"$1 $2\");c=c.replace(/([0-9])([+\\-])/gm,\"$1 $2\");for(b=0;2>b;b++)c=c.replace(/(\\.[0-9]*)(\\.)/gm,\"$1 $2\");c=c.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,\"$1 $3 $4 \");c=a.compressSpaces(c);c=a.trim(c);this.PathParser=new function(b){this.tokens=b.split(\" \");\nthis.reset=function(){this.i=-1;this.previousCommand=this.command=\"\";this.start=new a.Point(0,0);this.control=new a.Point(0,0);this.current=new a.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){return this.isEnd()?!0:null!=this.tokens[this.i+1].match(/^[A-Za-z]$/)};this.isRelativeCommand=function(){switch(this.command){case \"m\":case \"l\":case \"h\":case \"v\":case \"c\":case \"s\":case \"q\":case \"t\":case \"a\":case \"z\":return!0}return!1};\nthis.getToken=function(){this.i++;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){var b=new a.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(b)};this.getAsControlPoint=function(){var a=this.getPoint();return this.control=a};this.getAsCurrentPoint=function(){var a=this.getPoint();return this.current=a};this.getReflectedControlPoint=\nfunction(){return\"c\"!=this.previousCommand.toLowerCase()&&\"s\"!=this.previousCommand.toLowerCase()&&\"q\"!=this.previousCommand.toLowerCase()&&\"t\"!=this.previousCommand.toLowerCase()?this.current:new a.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)};this.makeAbsolute=function(a){this.isRelativeCommand()&&(a.x+=this.current.x,a.y+=this.current.y);return a};this.addMarker=function(a,b,e){null!=e&&0<this.angles.length&&null==this.angles[this.angles.length-1]&&(this.angles[this.angles.length-\n1]=this.points[this.points.length-1].angleTo(e));this.addMarkerAngle(a,null==b?null:b.angleTo(a))};this.addMarkerAngle=function(a,b){this.points.push(a);this.angles.push(b)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var a=0;a<this.angles.length;a++)if(null==this.angles[a])for(var b=a+1;b<this.angles.length;b++)if(null!=this.angles[b]){this.angles[a]=this.angles[b];break}return this.angles}}(c);this.path=function(b){var d=this.PathParser;d.reset();var c=\nnew a.BoundingBox;for(null!=b&&b.beginPath();!d.isEnd();)switch(d.nextCommand(),d.command){case \"M\":case \"m\":var f=d.getAsCurrentPoint();d.addMarker(f);c.addPoint(f.x,f.y);null!=b&&b.moveTo(f.x,f.y);for(d.start=d.current;!d.isCommandOrEnd();)f=d.getAsCurrentPoint(),d.addMarker(f,d.start),c.addPoint(f.x,f.y),null!=b&&b.lineTo(f.x,f.y);break;case \"L\":case \"l\":for(;!d.isCommandOrEnd();){var g=d.current,f=d.getAsCurrentPoint();d.addMarker(f,g);c.addPoint(f.x,f.y);null!=b&&b.lineTo(f.x,f.y)}break;case \"H\":case \"h\":for(;!d.isCommandOrEnd();)f=\nnew a.Point((d.isRelativeCommand()?d.current.x:0)+d.getScalar(),d.current.y),d.addMarker(f,d.current),d.current=f,c.addPoint(d.current.x,d.current.y),null!=b&&b.lineTo(d.current.x,d.current.y);break;case \"V\":case \"v\":for(;!d.isCommandOrEnd();)f=new a.Point(d.current.x,(d.isRelativeCommand()?d.current.y:0)+d.getScalar()),d.addMarker(f,d.current),d.current=f,c.addPoint(d.current.x,d.current.y),null!=b&&b.lineTo(d.current.x,d.current.y);break;case \"C\":case \"c\":for(;!d.isCommandOrEnd();){var m=d.current,\ng=d.getPoint(),n=d.getAsControlPoint(),f=d.getAsCurrentPoint();d.addMarker(f,n,g);c.addBezierCurve(m.x,m.y,g.x,g.y,n.x,n.y,f.x,f.y);null!=b&&b.bezierCurveTo(g.x,g.y,n.x,n.y,f.x,f.y)}break;case \"S\":case \"s\":for(;!d.isCommandOrEnd();)m=d.current,g=d.getReflectedControlPoint(),n=d.getAsControlPoint(),f=d.getAsCurrentPoint(),d.addMarker(f,n,g),c.addBezierCurve(m.x,m.y,g.x,g.y,n.x,n.y,f.x,f.y),null!=b&&b.bezierCurveTo(g.x,g.y,n.x,n.y,f.x,f.y);break;case \"Q\":case \"q\":for(;!d.isCommandOrEnd();)m=d.current,\nn=d.getAsControlPoint(),f=d.getAsCurrentPoint(),d.addMarker(f,n,n),c.addQuadraticCurve(m.x,m.y,n.x,n.y,f.x,f.y),null!=b&&b.quadraticCurveTo(n.x,n.y,f.x,f.y);break;case \"T\":case \"t\":for(;!d.isCommandOrEnd();)m=d.current,n=d.getReflectedControlPoint(),d.control=n,f=d.getAsCurrentPoint(),d.addMarker(f,n,n),c.addQuadraticCurve(m.x,m.y,n.x,n.y,f.x,f.y),null!=b&&b.quadraticCurveTo(n.x,n.y,f.x,f.y);break;case \"A\":case \"a\":for(;!d.isCommandOrEnd();){var m=d.current,r=d.getScalar(),h=d.getScalar(),g=d.getScalar()*\n(Math.PI/180),p=d.getScalar(),n=d.getScalar(),f=d.getAsCurrentPoint(),l=new a.Point(Math.cos(g)*(m.x-f.x)/2+Math.sin(g)*(m.y-f.y)/2,-Math.sin(g)*(m.x-f.x)/2+Math.cos(g)*(m.y-f.y)/2),v=Math.pow(l.x,2)/Math.pow(r,2)+Math.pow(l.y,2)/Math.pow(h,2);1<v&&(r*=Math.sqrt(v),h*=Math.sqrt(v));p=(p==n?-1:1)*Math.sqrt((Math.pow(r,2)*Math.pow(h,2)-Math.pow(r,2)*Math.pow(l.y,2)-Math.pow(h,2)*Math.pow(l.x,2))/(Math.pow(r,2)*Math.pow(l.y,2)+Math.pow(h,2)*Math.pow(l.x,2)));isNaN(p)&&(p=0);var q=new a.Point(p*r*l.y/\nh,p*-h*l.x/r),m=new a.Point((m.x+f.x)/2+Math.cos(g)*q.x-Math.sin(g)*q.y,(m.y+f.y)/2+Math.sin(g)*q.x+Math.cos(g)*q.y),w=function(a,b){return(a[0]*b[0]+a[1]*b[1])/(Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2))*Math.sqrt(Math.pow(b[0],2)+Math.pow(b[1],2)))},x=function(a,b){return(a[0]*b[1]<a[1]*b[0]?-1:1)*Math.acos(w(a,b))},p=x([1,0],[(l.x-q.x)/r,(l.y-q.y)/h]),v=[(l.x-q.x)/r,(l.y-q.y)/h],q=[(-l.x-q.x)/r,(-l.y-q.y)/h],l=x(v,q);-1>=w(v,q)&&(l=Math.PI);1<=w(v,q)&&(l=0);v=1-n?1:-1;q=p+l/2*v;x=new a.Point(m.x+\nr*Math.cos(q),m.y+h*Math.sin(q));d.addMarkerAngle(x,q-v*Math.PI/2);d.addMarkerAngle(f,q-v*Math.PI);c.addPoint(f.x,f.y);null!=b&&(w=r>h?r:h,f=r>h?1:r/h,r=r>h?h/r:1,b.translate(m.x,m.y),b.rotate(g),b.scale(f,r),b.arc(0,0,w,p,p+l,1-n),b.scale(1/f,1/r),b.rotate(-g),b.translate(-m.x,-m.y))}break;case \"Z\":case \"z\":null!=b&&b.closePath(),d.current=d.start}return c};this.getMarkers=function(){for(var a=this.PathParser.getMarkerPoints(),b=this.PathParser.getMarkerAngles(),c=[],f=0;f<a.length;f++)c.push([a[f],\nb[f]]);return c}};a.Element.path.prototype=new a.Element.PathElementBase;a.Element.pattern=function(c){this.base=a.Element.ElementBase;this.base(c);this.createPattern=function(b,e){var d=this.attribute(\"width\").toPixels(\"x\",!0),c=this.attribute(\"height\").toPixels(\"y\",!0),f=new a.Element.svg;f.attributes.viewBox=new a.Property(\"viewBox\",this.attribute(\"viewBox\").value);f.attributes.width=new a.Property(\"width\",d+\"px\");f.attributes.height=new a.Property(\"height\",c+\"px\");f.attributes.transform=new a.Property(\"transform\",\nthis.attribute(\"patternTransform\").value);f.children=this.children;var g=document.createElement(\"canvas\");g.width=d;g.height=c;d=g.getContext(\"2d\");this.attribute(\"x\").hasValue()&&this.attribute(\"y\").hasValue()&&d.translate(this.attribute(\"x\").toPixels(\"x\",!0),this.attribute(\"y\").toPixels(\"y\",!0));for(c=-1;1>=c;c++)for(var m=-1;1>=m;m++)d.save(),f.attributes.x=new a.Property(\"x\",c*g.width),f.attributes.y=new a.Property(\"y\",m*g.height),f.render(d),d.restore();return b.createPattern(g,\"repeat\")}};a.Element.pattern.prototype=\nnew a.Element.ElementBase;a.Element.marker=function(c){this.base=a.Element.ElementBase;this.base(c);this.baseRender=this.render;this.render=function(b,e,d){b.translate(e.x,e.y);\"auto\"==this.attribute(\"orient\").valueOrDefault(\"auto\")&&b.rotate(d);\"strokeWidth\"==this.attribute(\"markerUnits\").valueOrDefault(\"strokeWidth\")&&b.scale(b.lineWidth,b.lineWidth);b.save();var c=new a.Element.svg;c.attributes.viewBox=new a.Property(\"viewBox\",this.attribute(\"viewBox\").value);c.attributes.refX=new a.Property(\"refX\",\nthis.attribute(\"refX\").value);c.attributes.refY=new a.Property(\"refY\",this.attribute(\"refY\").value);c.attributes.width=new a.Property(\"width\",this.attribute(\"markerWidth\").value);c.attributes.height=new a.Property(\"height\",this.attribute(\"markerHeight\").value);c.attributes.fill=new a.Property(\"fill\",this.attribute(\"fill\").valueOrDefault(\"black\"));c.attributes.stroke=new a.Property(\"stroke\",this.attribute(\"stroke\").valueOrDefault(\"none\"));c.children=this.children;c.render(b);b.restore();\"strokeWidth\"==\nthis.attribute(\"markerUnits\").valueOrDefault(\"strokeWidth\")&&b.scale(1/b.lineWidth,1/b.lineWidth);\"auto\"==this.attribute(\"orient\").valueOrDefault(\"auto\")&&b.rotate(-d);b.translate(-e.x,-e.y)}};a.Element.marker.prototype=new a.Element.ElementBase;a.Element.defs=function(c){this.base=a.Element.ElementBase;this.base(c);this.render=function(a){}};a.Element.defs.prototype=new a.Element.ElementBase;a.Element.GradientBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.stops=[];for(c=0;c<this.children.length;c++){var b=\nthis.children[c];\"stop\"==b.type&&this.stops.push(b)}this.getGradient=function(){};this.gradientUnits=function(){return this.attribute(\"gradientUnits\").valueOrDefault(\"objectBoundingBox\")};this.attributesToInherit=[\"gradientUnits\"];this.inheritStopContainer=function(a){for(var b=0;b<this.attributesToInherit.length;b++){var c=this.attributesToInherit[b];!this.attribute(c).hasValue()&&a.attribute(c).hasValue()&&(this.attribute(c,!0).value=a.attribute(c).value)}};this.createGradient=function(b,d,c){var f=\nthis;this.getHrefAttribute().hasValue()&&(f=this.getHrefAttribute().getDefinition(),this.inheritStopContainer(f));var g=function(b){return c.hasValue()?(new a.Property(\"color\",b)).addOpacity(c).value:b};b=this.getGradient(b,d);if(null==b)return g(f.stops[f.stops.length-1].color);for(d=0;d<f.stops.length;d++)b.addColorStop(f.stops[d].offset,g(f.stops[d].color));return this.attribute(\"gradientTransform\").hasValue()?(f=a.ViewPort.viewPorts[0],g=new a.Element.rect,g.attributes.x=new a.Property(\"x\",-a.MAX_VIRTUAL_PIXELS/\n3),g.attributes.y=new a.Property(\"y\",-a.MAX_VIRTUAL_PIXELS/3),g.attributes.width=new a.Property(\"width\",a.MAX_VIRTUAL_PIXELS),g.attributes.height=new a.Property(\"height\",a.MAX_VIRTUAL_PIXELS),d=new a.Element.g,d.attributes.transform=new a.Property(\"transform\",this.attribute(\"gradientTransform\").value),d.children=[g],g=new a.Element.svg,g.attributes.x=new a.Property(\"x\",0),g.attributes.y=new a.Property(\"y\",0),g.attributes.width=new a.Property(\"width\",f.width),g.attributes.height=new a.Property(\"height\",\nf.height),g.children=[d],d=document.createElement(\"canvas\"),d.width=f.width,d.height=f.height,f=d.getContext(\"2d\"),f.fillStyle=b,g.render(f),f.createPattern(d,\"no-repeat\")):b}};a.Element.GradientBase.prototype=new a.Element.ElementBase;a.Element.linearGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.attributesToInherit.push(\"x1\");this.attributesToInherit.push(\"y1\");this.attributesToInherit.push(\"x2\");this.attributesToInherit.push(\"y2\");this.getGradient=function(a,e){var c=\"objectBoundingBox\"==\nthis.gradientUnits()?e.getBoundingBox():null;this.attribute(\"x1\").hasValue()||this.attribute(\"y1\").hasValue()||this.attribute(\"x2\").hasValue()||this.attribute(\"y2\").hasValue()||(this.attribute(\"x1\",!0).value=0,this.attribute(\"y1\",!0).value=0,this.attribute(\"x2\",!0).value=1,this.attribute(\"y2\",!0).value=0);var k=\"objectBoundingBox\"==this.gradientUnits()?c.x()+c.width()*this.attribute(\"x1\").numValue():this.attribute(\"x1\").toPixels(\"x\"),f=\"objectBoundingBox\"==this.gradientUnits()?c.y()+c.height()*this.attribute(\"y1\").numValue():\nthis.attribute(\"y1\").toPixels(\"y\"),g=\"objectBoundingBox\"==this.gradientUnits()?c.x()+c.width()*this.attribute(\"x2\").numValue():this.attribute(\"x2\").toPixels(\"x\"),c=\"objectBoundingBox\"==this.gradientUnits()?c.y()+c.height()*this.attribute(\"y2\").numValue():this.attribute(\"y2\").toPixels(\"y\");return k==g&&f==c?null:a.createLinearGradient(k,f,g,c)}};a.Element.linearGradient.prototype=new a.Element.GradientBase;a.Element.radialGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.attributesToInherit.push(\"cx\");\nthis.attributesToInherit.push(\"cy\");this.attributesToInherit.push(\"r\");this.attributesToInherit.push(\"fx\");this.attributesToInherit.push(\"fy\");this.getGradient=function(a,c){var d=c.getBoundingBox();this.attribute(\"cx\").hasValue()||(this.attribute(\"cx\",!0).value=\"50%\");this.attribute(\"cy\").hasValue()||(this.attribute(\"cy\",!0).value=\"50%\");this.attribute(\"r\").hasValue()||(this.attribute(\"r\",!0).value=\"50%\");var k=\"objectBoundingBox\"==this.gradientUnits()?d.x()+d.width()*this.attribute(\"cx\").numValue():\nthis.attribute(\"cx\").toPixels(\"x\"),f=\"objectBoundingBox\"==this.gradientUnits()?d.y()+d.height()*this.attribute(\"cy\").numValue():this.attribute(\"cy\").toPixels(\"y\"),g=k,m=f;this.attribute(\"fx\").hasValue()&&(g=\"objectBoundingBox\"==this.gradientUnits()?d.x()+d.width()*this.attribute(\"fx\").numValue():this.attribute(\"fx\").toPixels(\"x\"));this.attribute(\"fy\").hasValue()&&(m=\"objectBoundingBox\"==this.gradientUnits()?d.y()+d.height()*this.attribute(\"fy\").numValue():this.attribute(\"fy\").toPixels(\"y\"));d=\"objectBoundingBox\"==\nthis.gradientUnits()?(d.width()+d.height())/2*this.attribute(\"r\").numValue():this.attribute(\"r\").toPixels();return a.createRadialGradient(g,m,0,k,f,d)}};a.Element.radialGradient.prototype=new a.Element.GradientBase;a.Element.stop=function(c){this.base=a.Element.ElementBase;this.base(c);this.offset=this.attribute(\"offset\").numValue();0>this.offset&&(this.offset=0);1<this.offset&&(this.offset=1);c=this.style(\"stop-color\",!0);\"\"===c.value&&(c.value=\"#000\");this.style(\"stop-opacity\").hasValue()&&(c=c.addOpacity(this.style(\"stop-opacity\")));\nthis.color=c.value};a.Element.stop.prototype=new a.Element.ElementBase;a.Element.AnimateBase=function(c){this.base=a.Element.ElementBase;this.base(c);a.Animations.push(this);this.duration=0;this.begin=this.attribute(\"begin\").toMilliseconds();this.maxDuration=this.begin+this.attribute(\"dur\").toMilliseconds();this.getProperty=function(){var a=this.attribute(\"attributeType\").value,c=this.attribute(\"attributeName\").value;return\"CSS\"==a?this.parent.style(c,!0):this.parent.attribute(c,!0)};this.initialValue=\nnull;this.initialUnits=\"\";this.removed=!1;this.calcValue=function(){return\"\"};this.update=function(a){null==this.initialValue&&(this.initialValue=this.getProperty().value,this.initialUnits=this.getProperty().getUnits());if(this.duration>this.maxDuration){if(\"indefinite\"==this.attribute(\"repeatCount\").value||\"indefinite\"==this.attribute(\"repeatDur\").value)this.duration=0;else if(\"freeze\"==this.attribute(\"fill\").valueOrDefault(\"remove\")&&!this.frozen)this.frozen=!0,this.parent.animationFrozen=!0,this.parent.animationFrozenValue=\nthis.getProperty().value;else if(\"remove\"==this.attribute(\"fill\").valueOrDefault(\"remove\")&&!this.removed)return this.removed=!0,this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue,!0;return!1}this.duration+=a;a=!1;this.begin<this.duration&&(a=this.calcValue(),this.attribute(\"type\").hasValue()&&(a=this.attribute(\"type\").value+\"(\"+a+\")\"),this.getProperty().value=a,a=!0);return a};this.from=this.attribute(\"from\");this.to=this.attribute(\"to\");this.values=\nthis.attribute(\"values\");this.values.hasValue()&&(this.values.value=this.values.value.split(\";\"));this.progress=function(){var b={progress:(this.duration-this.begin)/(this.maxDuration-this.begin)};if(this.values.hasValue()){var c=b.progress*(this.values.value.length-1),d=Math.floor(c),k=Math.ceil(c);b.from=new a.Property(\"from\",parseFloat(this.values.value[d]));b.to=new a.Property(\"to\",parseFloat(this.values.value[k]));b.progress=(c-d)/(k-d)}else b.from=this.from,b.to=this.to;return b}};a.Element.AnimateBase.prototype=\nnew a.Element.ElementBase;a.Element.animate=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=this.progress();return a.from.numValue()+(a.to.numValue()-a.from.numValue())*a.progress+this.initialUnits}};a.Element.animate.prototype=new a.Element.AnimateBase;a.Element.animateColor=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=this.progress(),c=new x(a.from.value),d=new x(a.to.value);if(c.ok&&d.ok){var k=c.g+(d.g-c.g)*a.progress,\nf=c.b+(d.b-c.b)*a.progress;return\"rgb(\"+parseInt(c.r+(d.r-c.r)*a.progress,10)+\",\"+parseInt(k,10)+\",\"+parseInt(f,10)+\")\"}return this.attribute(\"from\").value}};a.Element.animateColor.prototype=new a.Element.AnimateBase;a.Element.animateTransform=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){for(var b=this.progress(),c=a.ToNumberArray(b.from.value),d=a.ToNumberArray(b.to.value),k=\"\",f=0;f<c.length;f++)k+=c[f]+(d[f]-c[f])*b.progress+\" \";return k}};a.Element.animateTransform.prototype=\nnew a.Element.animate;a.Element.font=function(c){this.base=a.Element.ElementBase;this.base(c);this.horizAdvX=this.attribute(\"horiz-adv-x\").numValue();this.isArabic=this.isRTL=!1;this.missingGlyph=this.fontFace=null;this.glyphs=[];for(c=0;c<this.children.length;c++){var b=this.children[c];\"font-face\"==b.type?(this.fontFace=b,b.style(\"font-family\").hasValue()&&(a.Definitions[b.style(\"font-family\").value]=this)):\"missing-glyph\"==b.type?this.missingGlyph=b:\"glyph\"==b.type&&(\"\"!=b.arabicForm?(this.isArabic=\nthis.isRTL=!0,\"undefined\"==typeof this.glyphs[b.unicode]&&(this.glyphs[b.unicode]=[]),this.glyphs[b.unicode][b.arabicForm]=b):this.glyphs[b.unicode]=b)}};a.Element.font.prototype=new a.Element.ElementBase;a.Element.fontface=function(c){this.base=a.Element.ElementBase;this.base(c);this.ascent=this.attribute(\"ascent\").value;this.descent=this.attribute(\"descent\").value;this.unitsPerEm=this.attribute(\"units-per-em\").numValue()};a.Element.fontface.prototype=new a.Element.ElementBase;a.Element.missingglyph=\nfunction(c){this.base=a.Element.path;this.base(c);this.horizAdvX=0};a.Element.missingglyph.prototype=new a.Element.path;a.Element.glyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=this.attribute(\"horiz-adv-x\").numValue();this.unicode=this.attribute(\"unicode\").value;this.arabicForm=this.attribute(\"arabic-form\").value};a.Element.glyph.prototype=new a.Element.path;a.Element.text=function(c){this.captureTextNodes=!0;this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=\nthis.setContext;this.setContext=function(a){this.baseSetContext(a);var c=this.style(\"dominant-baseline\").toTextBaseline();null==c&&(c=this.style(\"alignment-baseline\").toTextBaseline());null!=c&&(a.textBaseline=c)};this.getBoundingBox=function(){var b=this.attribute(\"x\").toPixels(\"x\"),c=this.attribute(\"y\").toPixels(\"y\"),d=this.parent.style(\"font-size\").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize);return new a.BoundingBox(b,c-d,b+Math.floor(2*d/3)*this.children[0].getText().length,c)};this.renderChildren=\nfunction(a){this.x=this.attribute(\"x\").toPixels(\"x\");this.y=this.attribute(\"y\").toPixels(\"y\");this.attribute(\"dx\").hasValue()&&(this.x+=this.attribute(\"dx\").toPixels(\"x\"));this.attribute(\"dy\").hasValue()&&(this.y+=this.attribute(\"dy\").toPixels(\"y\"));this.x+=this.getAnchorDelta(a,this,0);for(var c=0;c<this.children.length;c++)this.renderChild(a,this,c)};this.getAnchorDelta=function(a,c,d){var k=this.style(\"text-anchor\").valueOrDefault(\"start\");if(\"start\"!=k){for(var f=0,g=d;g<c.children.length;g++){var m=\nc.children[g];if(g>d&&m.attribute(\"x\").hasValue())break;f+=m.measureTextRecursive(a)}return-1*(\"end\"==k?f:f/2)}return 0};this.renderChild=function(a,c,d){var k=c.children[d];k.attribute(\"x\").hasValue()?(k.x=k.attribute(\"x\").toPixels(\"x\")+c.getAnchorDelta(a,c,d),k.attribute(\"dx\").hasValue()&&(k.x+=k.attribute(\"dx\").toPixels(\"x\"))):(k.attribute(\"dx\").hasValue()&&(c.x+=k.attribute(\"dx\").toPixels(\"x\")),k.x=c.x);c.x=k.x+k.measureText(a);k.attribute(\"y\").hasValue()?(k.y=k.attribute(\"y\").toPixels(\"y\"),k.attribute(\"dy\").hasValue()&&\n(k.y+=k.attribute(\"dy\").toPixels(\"y\"))):(k.attribute(\"dy\").hasValue()&&(c.y+=k.attribute(\"dy\").toPixels(\"y\")),k.y=c.y);c.y=k.y;k.render(a);for(d=0;d<k.children.length;d++)c.renderChild(a,k,d)}};a.Element.text.prototype=new a.Element.RenderedElementBase;a.Element.TextElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getGlyph=function(a,c,d){var k=c[d],f=null;if(a.isArabic){var g=\"isolated\";(0==d||\" \"==c[d-1])&&d<c.length-2&&\" \"!=c[d+1]&&(g=\"terminal\");0<d&&\" \"!=c[d-\n1]&&d<c.length-2&&\" \"!=c[d+1]&&(g=\"medial\");0<d&&\" \"!=c[d-1]&&(d==c.length-1||\" \"==c[d+1])&&(g=\"initial\");\"undefined\"!=typeof a.glyphs[k]&&(f=a.glyphs[k][g],null==f&&\"glyph\"==a.glyphs[k].type&&(f=a.glyphs[k]))}else f=a.glyphs[k];null==f&&(f=a.missingGlyph);return f};this.renderChildren=function(b){var c=this.parent.style(\"font-family\").getDefinition();if(null!=c){var d=this.parent.style(\"font-size\").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),k=this.parent.style(\"font-style\").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle),\nf=this.getText();c.isRTL&&(f=f.split(\"\").reverse().join(\"\"));for(var g=a.ToNumberArray(this.parent.attribute(\"dx\").value),m=0;m<f.length;m++){var n=this.getGlyph(c,f,m),h=d/c.fontFace.unitsPerEm;b.translate(this.x,this.y);b.scale(h,-h);var l=b.lineWidth;b.lineWidth=b.lineWidth*c.fontFace.unitsPerEm/d;\"italic\"==k&&b.transform(1,0,.4,1,0,0);n.render(b);\"italic\"==k&&b.transform(1,0,-.4,1,0,0);b.lineWidth=l;b.scale(1/h,-1/h);b.translate(-this.x,-this.y);this.x+=d*(n.horizAdvX||c.horizAdvX)/c.fontFace.unitsPerEm;\n\"undefined\"==typeof g[m]||isNaN(g[m])||(this.x+=g[m])}}else\"\"!=b.fillStyle&&b.fillText(a.compressSpaces(this.getText()),this.x,this.y),\"\"!=b.strokeStyle&&b.strokeText(a.compressSpaces(this.getText()),this.x,this.y)};this.getText=function(){};this.measureTextRecursive=function(a){for(var c=this.measureText(a),d=0;d<this.children.length;d++)c+=this.children[d].measureTextRecursive(a);return c};this.measureText=function(b){var c=this.parent.style(\"font-family\").getDefinition();if(null!=c){b=this.parent.style(\"font-size\").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize);\nvar d=0,k=this.getText();c.isRTL&&(k=k.split(\"\").reverse().join(\"\"));for(var f=a.ToNumberArray(this.parent.attribute(\"dx\").value),g=0;g<k.length;g++){var m=this.getGlyph(c,k,g),d=d+(m.horizAdvX||c.horizAdvX)*b/c.fontFace.unitsPerEm;\"undefined\"==typeof f[g]||isNaN(f[g])||(d+=f[g])}return d}c=a.compressSpaces(this.getText());if(!b.measureText)return 10*c.length;b.save();this.setContext(b);c=b.measureText(c).width;b.restore();return c}};a.Element.TextElementBase.prototype=new a.Element.RenderedElementBase;\na.Element.tspan=function(c){this.captureTextNodes=!0;this.base=a.Element.TextElementBase;this.base(c);this.text=a.compressSpaces(c.value||c.text||c.textContent||\"\");this.getText=function(){return 0<this.children.length?\"\":this.text}};a.Element.tspan.prototype=new a.Element.TextElementBase;a.Element.tref=function(c){this.base=a.Element.TextElementBase;this.base(c);this.getText=function(){var a=this.getHrefAttribute().getDefinition();if(null!=a)return a.children[0].getText()}};a.Element.tref.prototype=\nnew a.Element.TextElementBase;a.Element.a=function(c){this.base=a.Element.TextElementBase;this.base(c);this.hasText=0<c.childNodes.length;for(var b=0;b<c.childNodes.length;b++)3!=c.childNodes[b].nodeType&&(this.hasText=!1);this.text=this.hasText?c.childNodes[0].value:\"\";this.getText=function(){return this.text};this.baseRenderChildren=this.renderChildren;this.renderChildren=function(b){if(this.hasText){this.baseRenderChildren(b);var c=new a.Property(\"fontSize\",a.Font.Parse(a.ctx.font).fontSize);a.Mouse.checkBoundingBox(this,\nnew a.BoundingBox(this.x,this.y-c.toPixels(\"y\"),this.x+this.measureText(b),this.y))}else 0<this.children.length&&(c=new a.Element.g,c.children=this.children,c.parent=this,c.render(b))};this.onclick=function(){window.open(this.getHrefAttribute().value)};this.onmousemove=function(){a.ctx.canvas.style.cursor=\"pointer\"}};a.Element.a.prototype=new a.Element.TextElementBase;a.Element.image=function(c){this.base=a.Element.RenderedElementBase;this.base(c);var b=this.getHrefAttribute().value;if(\"\"!=b){var e=\nb.match(/\\.svg$/);a.Images.push(this);this.loaded=!1;if(e)this.img=a.ajax(b),this.loaded=!0;else{this.img=document.createElement(\"img\");1==a.opts.useCORS&&(this.img.crossOrigin=\"Anonymous\");var d=this;this.img.onload=function(){d.loaded=!0};this.img.onerror=function(){a.log('ERROR: image \"'+b+'\" not found');d.loaded=!0};this.img.src=b}this.renderChildren=function(b){var c=this.attribute(\"x\").toPixels(\"x\"),d=this.attribute(\"y\").toPixels(\"y\"),m=this.attribute(\"width\").toPixels(\"x\"),n=this.attribute(\"height\").toPixels(\"y\");\n0!=m&&0!=n&&(b.save(),e?b.drawSvg(this.img,c,d,m,n):(b.translate(c,d),a.AspectRatio(b,this.attribute(\"preserveAspectRatio\").value,m,this.img.width,n,this.img.height,0,0),b.drawImage(this.img,0,0)),b.restore())};this.getBoundingBox=function(){var b=this.attribute(\"x\").toPixels(\"x\"),c=this.attribute(\"y\").toPixels(\"y\"),d=this.attribute(\"width\").toPixels(\"x\"),e=this.attribute(\"height\").toPixels(\"y\");return new a.BoundingBox(b,c,b+d,c+e)}}};a.Element.image.prototype=new a.Element.RenderedElementBase;a.Element.g=\nfunction(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getBoundingBox=function(){for(var b=new a.BoundingBox,c=0;c<this.children.length;c++)b.addBoundingBox(this.children[c].getBoundingBox());return b}};a.Element.g.prototype=new a.Element.RenderedElementBase;a.Element.symbol=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.render=function(a){}};a.Element.symbol.prototype=new a.Element.RenderedElementBase;a.Element.style=function(c){this.base=a.Element.ElementBase;\nthis.base(c);for(var b=\"\",e=0;e<c.childNodes.length;e++)b+=c.childNodes[e].data;b=b.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm,\"\");b=a.compressSpaces(b);c=b.split(\"}\");for(e=0;e<c.length;e++)if(\"\"!=a.trim(c[e]))for(var d=c[e].split(\"{\"),b=d[0].split(\",\"),d=d[1].split(\";\"),k=0;k<b.length;k++){var f=a.trim(b[k]);if(\"\"!=f){for(var g=a.Styles[f]||{},m=0;m<d.length;m++){var n=d[m].indexOf(\":\"),h=d[m].substr(0,n),n=d[m].substr(n+1,d[m].length-n);null!=h&&null!=n&&(g[a.trim(h)]=\nnew a.Property(a.trim(h),a.trim(n)))}a.Styles[f]=g;a.StylesSpecificity[f]=A(f);if(\"@font-face\"==f)for(f=g[\"font-family\"].value.replace(/\"/g,\"\"),g=g.src.value.split(\",\"),m=0;m<g.length;m++)if(0<g[m].indexOf('format(\"svg\")'))for(h=g[m].indexOf(\"url\"),n=g[m].indexOf(\")\",h),h=g[m].substr(h+5,n-h-6),h=a.parseXml(a.ajax(h)).getElementsByTagName(\"font\"),n=0;n<h.length;n++){var l=a.CreateElement(h[n]);a.Definitions[f]=l}}}};a.Element.style.prototype=new a.Element.ElementBase;a.Element.use=function(c){this.base=\na.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(a){this.baseSetContext(a);this.attribute(\"x\").hasValue()&&a.translate(this.attribute(\"x\").toPixels(\"x\"),0);this.attribute(\"y\").hasValue()&&a.translate(0,this.attribute(\"y\").toPixels(\"y\"))};var b=this.getHrefAttribute().getDefinition();this.path=function(a){null!=b&&b.path(a)};this.getBoundingBox=function(){if(null!=b)return b.getBoundingBox()};this.renderChildren=function(c){if(null!=b){var d=b;\n\"symbol\"==b.type&&(d=new a.Element.svg,d.type=\"svg\",d.attributes.viewBox=new a.Property(\"viewBox\",b.attribute(\"viewBox\").value),d.attributes.preserveAspectRatio=new a.Property(\"preserveAspectRatio\",b.attribute(\"preserveAspectRatio\").value),d.attributes.overflow=new a.Property(\"overflow\",b.attribute(\"overflow\").value),d.children=b.children);\"svg\"==d.type&&(this.attribute(\"width\").hasValue()&&(d.attributes.width=new a.Property(\"width\",this.attribute(\"width\").value)),this.attribute(\"height\").hasValue()&&\n(d.attributes.height=new a.Property(\"height\",this.attribute(\"height\").value)));var k=d.parent;d.parent=null;d.render(c);d.parent=k}}};a.Element.use.prototype=new a.Element.RenderedElementBase;a.Element.mask=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(b,c){var d=this.attribute(\"x\").toPixels(\"x\"),k=this.attribute(\"y\").toPixels(\"y\"),f=this.attribute(\"width\").toPixels(\"x\"),g=this.attribute(\"height\").toPixels(\"y\");if(0==f&&0==g){g=new a.BoundingBox;for(d=0;d<this.children.length;d++)g.addBoundingBox(this.children[d].getBoundingBox());\nd=Math.floor(g.x1);k=Math.floor(g.y1);f=Math.floor(g.width());g=Math.floor(g.height())}var m=c.attribute(\"mask\").value;c.attribute(\"mask\").value=\"\";var n=document.createElement(\"canvas\");n.width=d+f;n.height=k+g;var h=n.getContext(\"2d\");this.renderChildren(h);var l=document.createElement(\"canvas\");l.width=d+f;l.height=k+g;var p=l.getContext(\"2d\");c.render(p);p.globalCompositeOperation=\"destination-in\";p.fillStyle=h.createPattern(n,\"no-repeat\");p.fillRect(0,0,d+f,k+g);b.fillStyle=p.createPattern(l,\n\"no-repeat\");b.fillRect(0,0,d+f,k+g);c.attribute(\"mask\").value=m};this.render=function(a){}};a.Element.mask.prototype=new a.Element.ElementBase;a.Element.clipPath=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(b){var c=CanvasRenderingContext2D.prototype.beginPath;CanvasRenderingContext2D.prototype.beginPath=function(){};var d=CanvasRenderingContext2D.prototype.closePath;CanvasRenderingContext2D.prototype.closePath=function(){};c.call(b);for(var k=0;k<this.children.length;k++){var f=\nthis.children[k];if(\"undefined\"!=typeof f.path){var g=null;f.style(\"transform\",!1,!0).hasValue()&&(g=new a.Transform(f.style(\"transform\",!1,!0).value),g.apply(b));f.path(b);CanvasRenderingContext2D.prototype.closePath=d;g&&g.unapply(b)}}d.call(b);b.clip();CanvasRenderingContext2D.prototype.beginPath=c;CanvasRenderingContext2D.prototype.closePath=d};this.render=function(a){}};a.Element.clipPath.prototype=new a.Element.ElementBase;a.Element.filter=function(c){this.base=a.Element.ElementBase;this.base(c);\nthis.apply=function(a,c){var d=c.getBoundingBox(),k=Math.floor(d.x1),f=Math.floor(d.y1),g=Math.floor(d.width()),d=Math.floor(d.height()),m=c.style(\"filter\").value;c.style(\"filter\").value=\"\";for(var h=0,l=0,u=0;u<this.children.length;u++)var p=this.children[u].extraFilterDistance||0,h=Math.max(h,p),l=Math.max(l,p);p=document.createElement(\"canvas\");p.width=g+2*h;p.height=d+2*l;var t=p.getContext(\"2d\");t.translate(-k+h,-f+l);c.render(t);for(u=0;u<this.children.length;u++)\"function\"===typeof this.children[u].apply&&\nthis.children[u].apply(t,0,0,g+2*h,d+2*l);a.drawImage(p,0,0,g+2*h,d+2*l,k-h,f-l,g+2*h,d+2*l);c.style(\"filter\",!0).value=m};this.render=function(a){}};a.Element.filter.prototype=new a.Element.ElementBase;a.Element.feMorphology=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,c,d,k,f){}};a.Element.feMorphology.prototype=new a.Element.ElementBase;a.Element.feComposite=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,c,d,k,f){}};a.Element.feComposite.prototype=\nnew a.Element.ElementBase;a.Element.feColorMatrix=function(c){function b(a,b){var c=e[a];return c*(0>c?b-255:b)}this.base=a.Element.ElementBase;this.base(c);var e=a.ToNumberArray(this.attribute(\"values\").value);switch(this.attribute(\"type\").valueOrDefault(\"matrix\")){case \"saturate\":c=e[0];e=[.213+.787*c,.715-.715*c,.072-.072*c,0,0,.213-.213*c,.715+.285*c,.072-.072*c,0,0,.213-.213*c,.715-.715*c,.072+.928*c,0,0,0,0,0,1,0,0,0,0,0,1];break;case \"hueRotate\":var d=e[0]*Math.PI/180;c=function(a,b,c){return a+\nMath.cos(d)*b+Math.sin(d)*c};e=[c(.213,.787,-.213),c(.715,-.715,-.715),c(.072,-.072,.928),0,0,c(.213,-.213,.143),c(.715,.285,.14),c(.072,-.072,-.283),0,0,c(.213,-.213,-.787),c(.715,-.715,.715),c(.072,.928,.072),0,0,0,0,0,1,0,0,0,0,0,1];break;case \"luminanceToAlpha\":e=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.2125,.7154,.0721,0,0,0,0,0,0,1]}this.apply=function(a,c,d,e,h){var l=a.getImageData(0,0,e,h);for(d=0;d<h;d++)for(c=0;c<e;c++){var u=l.data[d*e*4+4*c+0],p=l.data[d*e*4+4*c+1],t=l.data[d*e*4+4*c+2],v=l.data[d*\ne*4+4*c+3],q=b(0,u)+b(1,p)+b(2,t)+b(3,v)+b(4,1);l.data[d*e*4+4*c+0]=q;q=b(5,u)+b(6,p)+b(7,t)+b(8,v)+b(9,1);l.data[d*e*4+4*c+1]=q;q=b(10,u)+b(11,p)+b(12,t)+b(13,v)+b(14,1);l.data[d*e*4+4*c+2]=q;u=b(15,u)+b(16,p)+b(17,t)+b(18,v)+b(19,1);l.data[d*e*4+4*c+3]=u}a.clearRect(0,0,e,h);a.putImageData(l,0,0)}};a.Element.feColorMatrix.prototype=new a.Element.ElementBase;a.Element.feGaussianBlur=function(c){this.base=a.Element.ElementBase;this.base(c);this.extraFilterDistance=this.blurRadius=Math.floor(this.attribute(\"stdDeviation\").numValue());\nthis.apply=function(b,c,d,k,f){\"undefined\"==typeof y.canvasRGBA?a.log(\"ERROR: StackBlur.js must be included for blur to work\"):(b.canvas.id=a.UniqueId(),b.canvas.style.display=\"none\",document.body.appendChild(b.canvas),y.canvasRGBA(b.canvas.id,c,d,k,f,this.blurRadius),document.body.removeChild(b.canvas))}};a.Element.feGaussianBlur.prototype=new a.Element.ElementBase;a.Element.title=function(a){};a.Element.title.prototype=new a.Element.ElementBase;a.Element.desc=function(a){};a.Element.desc.prototype=\nnew a.Element.ElementBase;a.Element.MISSING=function(c){a.log(\"ERROR: Element '\"+c.nodeName+\"' not yet implemented.\")};a.Element.MISSING.prototype=new a.Element.ElementBase;a.CreateElement=function(c){var b=c.nodeName.replace(/^[^:]+:/,\"\"),b=b.replace(/\\-/g,\"\"),b=\"undefined\"!=typeof a.Element[b]?new a.Element[b](c):new a.Element.MISSING(c);b.type=c.nodeName;return b};a.load=function(c,b){a.loadXml(c,a.ajax(b))};a.loadXml=function(c,b){a.loadXmlDoc(c,a.parseXml(b))};a.loadXmlDoc=function(c,b){a.init(c);\nvar e=function(a){for(var b=c.canvas;b;)a.x-=b.offsetLeft,a.y-=b.offsetTop,b=b.offsetParent;window.scrollX&&(a.x+=window.scrollX);window.scrollY&&(a.y+=window.scrollY);return a};1!=a.opts.ignoreMouse&&(c.canvas.onclick=function(b){b=e(new a.Point(null!=b?b.clientX:event.clientX,null!=b?b.clientY:event.clientY));a.Mouse.onclick(b.x,b.y)},c.canvas.onmousemove=function(b){b=e(new a.Point(null!=b?b.clientX:event.clientX,null!=b?b.clientY:event.clientY));a.Mouse.onmousemove(b.x,b.y)});var d=a.CreateElement(b.documentElement);\nd.root=!0;d.addStylesFromStyleDefinition();var k=!0,f=function(){a.ViewPort.Clear();c.canvas.parentNode&&a.ViewPort.SetCurrent(c.canvas.parentNode.clientWidth,c.canvas.parentNode.clientHeight);1!=a.opts.ignoreDimensions&&(d.style(\"width\").hasValue()&&(c.canvas.width=d.style(\"width\").toPixels(\"x\"),c.canvas.style.width=c.canvas.width+\"px\"),d.style(\"height\").hasValue()&&(c.canvas.height=d.style(\"height\").toPixels(\"y\"),c.canvas.style.height=c.canvas.height+\"px\"));var e=c.canvas.clientWidth||c.canvas.width,\nf=c.canvas.clientHeight||c.canvas.height;1==a.opts.ignoreDimensions&&d.style(\"width\").hasValue()&&d.style(\"height\").hasValue()&&(e=d.style(\"width\").toPixels(\"x\"),f=d.style(\"height\").toPixels(\"y\"));a.ViewPort.SetCurrent(e,f);null!=a.opts.offsetX&&(d.attribute(\"x\",!0).value=a.opts.offsetX);null!=a.opts.offsetY&&(d.attribute(\"y\",!0).value=a.opts.offsetY);if(null!=a.opts.scaleWidth||null!=a.opts.scaleHeight){var g=null,h=null,l=a.ToNumberArray(d.attribute(\"viewBox\").value);null!=a.opts.scaleWidth&&(d.attribute(\"width\").hasValue()?\ng=d.attribute(\"width\").toPixels(\"x\")/a.opts.scaleWidth:isNaN(l[2])||(g=l[2]/a.opts.scaleWidth));null!=a.opts.scaleHeight&&(d.attribute(\"height\").hasValue()?h=d.attribute(\"height\").toPixels(\"y\")/a.opts.scaleHeight:isNaN(l[3])||(h=l[3]/a.opts.scaleHeight));null==g&&(g=h);null==h&&(h=g);d.attribute(\"width\",!0).value=a.opts.scaleWidth;d.attribute(\"height\",!0).value=a.opts.scaleHeight;d.style(\"transform\",!0,!0).value+=\" scale(\"+1/g+\",\"+1/h+\")\"}1!=a.opts.ignoreClear&&c.clearRect(0,0,e,f);d.render(c);k&&\n(k=!1,\"function\"==typeof a.opts.renderCallback&&a.opts.renderCallback(b))},g=!0;a.ImagesLoaded()&&(g=!1,f());a.intervalID=setInterval(function(){var b=!1;g&&a.ImagesLoaded()&&(g=!1,b=!0);1!=a.opts.ignoreMouse&&(b|=a.Mouse.hasEvents());if(1!=a.opts.ignoreAnimation)for(var c=0;c<a.Animations.length;c++)b|=a.Animations[c].update(1E3/a.FRAMERATE);\"function\"==typeof a.opts.forceRedraw&&1==a.opts.forceRedraw()&&(b=!0);b&&(f(),a.Mouse.runEvents())},1E3/a.FRAMERATE)};a.stop=function(){a.intervalID&&clearInterval(a.intervalID)};\na.Mouse=new function(){this.events=[];this.hasEvents=function(){return 0!=this.events.length};this.onclick=function(a,b){this.events.push({type:\"onclick\",x:a,y:b,run:function(a){if(a.onclick)a.onclick()}})};this.onmousemove=function(a,b){this.events.push({type:\"onmousemove\",x:a,y:b,run:function(a){if(a.onmousemove)a.onmousemove()}})};this.eventElements=[];this.checkPath=function(a,b){for(var e=0;e<this.events.length;e++){var d=this.events[e];b.isPointInPath&&b.isPointInPath(d.x,d.y)&&(this.eventElements[e]=\na)}};this.checkBoundingBox=function(a,b){for(var e=0;e<this.events.length;e++){var d=this.events[e];b.isPointInBox(d.x,d.y)&&(this.eventElements[e]=a)}};this.runEvents=function(){a.ctx.canvas.style.cursor=\"\";for(var c=0;c<this.events.length;c++)for(var b=this.events[c],e=this.eventElements[c];e;)b.run(e),e=e.parent;this.events=[];this.eventElements=[]}};return a}var z=function(h,a,l){if(null==h&&null==a&&null==l)for(a=document.querySelectorAll(\"svg\"),h=0;h<a.length;h++){l=a[h];var c=document.createElement(\"canvas\");\nc.width=l.clientWidth;c.height=l.clientHeight;l.parentNode.insertBefore(c,l);l.parentNode.removeChild(l);var b=document.createElement(\"div\");b.appendChild(l);z(c,b.innerHTML)}else{\"string\"==typeof h&&(h=document.getElementById(h));null!=h.svg&&h.svg.stop();l=I(l||{});if(1!=h.childNodes.length||\"OBJECT\"!=h.childNodes[0].nodeName)h.svg=l;h=h.getContext(\"2d\");\"undefined\"!=typeof a.documentElement?l.loadXmlDoc(h,a):\"<\"==a.substr(0,1)?l.loadXml(h,a):l.load(h,a)}},w;if(\"undefined\"!=typeof Element.prototype.matches)w=\nfunction(h,a){return h.matches(a)};else if(\"undefined\"!=typeof Element.prototype.webkitMatchesSelector)w=function(h,a){return h.webkitMatchesSelector(a)};else if(\"undefined\"!=typeof Element.prototype.mozMatchesSelector)w=function(h,a){return h.mozMatchesSelector(a)};else if(\"undefined\"!=typeof Element.prototype.msMatchesSelector)w=function(h,a){return h.msMatchesSelector(a)};else if(\"undefined\"!=typeof Element.prototype.oMatchesSelector)w=function(h,a){return h.oMatchesSelector(a)};else{if(\"function\"===\ntypeof jQuery||\"function\"===typeof Zepto)w=function(h,a){return $(h).is(a)};\"undefined\"===typeof w&&(w=Sizzle.matchesSelector)}var B=/(\\[[^\\]]+\\])/g,C=/(#[^\\s\\+>~\\.\\[:]+)/g,D=/(\\.[^\\s\\+>~\\.\\[:]+)/g,E=/(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi,F=/(:[\\w-]+\\([^\\)]*\\))/gi,G=/(:[^\\s\\+>~\\.\\[:]+)/g,H=/([^\\s\\+>~\\.\\[:]+)/g;\"undefined\"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.drawSvg=function(h,a,l,c,b){z(this.canvas,h,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,\nignoreClear:!0,offsetX:a,offsetY:l,scaleWidth:c,scaleHeight:b})});return z});\n"
  },
  {
    "path": "assets/highcharts/lib/canvg.src.js",
    "content": "/** @preserve\n * canvg.js - Javascript SVG parser and renderer on Canvas\n * MIT Licensed\n * Gabe Lerner (gabelerner@gmail.com)\n * http://code.google.com/p/canvg/\n *\n * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\n */\n (function ( global, factory ) {\n\n\t'use strict';\n\n\t// export as AMD...\n\tif ( typeof define !== 'undefined' && define.amd ) {\n\t\tdefine('canvgModule', [ 'rgbcolor', 'stackblur' ], factory );\n\t}\n\n\t// ...or as browserify\n\telse if ( typeof module !== 'undefined' && module.exports ) {\n\t\tmodule.exports = factory( require( 'rgbcolor' ), require( 'stackblur' ) );\n\t}\n\n\tglobal.canvg = factory( global.RGBColor, global.stackBlur );\n\n}( typeof window !== 'undefined' ? window : this, function ( RGBColor, stackBlur ) {\n \n\t// canvg(target, s)\n\t// empty parameters: replace all 'svg' elements on page with 'canvas' elements\n\t// target: canvas element or the id of a canvas element\n\t// s: svg string, url to svg file, or xml document\n\t// opts: optional hash of options\n\t//\t\t ignoreMouse: true => ignore mouse events\n\t//\t\t ignoreAnimation: true => ignore animations\n\t//\t\t ignoreDimensions: true => does not try to resize canvas\n\t//\t\t ignoreClear: true => does not clear canvas\n\t//\t\t offsetX: int => draws at a x offset\n\t//\t\t offsetY: int => draws at a y offset\n\t//\t\t scaleWidth: int => scales horizontally to width\n\t//\t\t scaleHeight: int => scales vertically to height\n\t//\t\t renderCallback: function => will call the function after the first render is completed\n\t//\t\t forceRedraw: function => will call the function on every frame, if it returns true, will redraw\n\tvar canvg = function (target, s, opts) {\n\t\t// no parameters\n\t\tif (target == null && s == null && opts == null) {\n\t\t\tvar svgTags = document.querySelectorAll('svg');\n\t\t\tfor (var i=0; i<svgTags.length; i++) {\n\t\t\t\tvar svgTag = svgTags[i];\n\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\tc.width = svgTag.clientWidth;\n\t\t\t\tc.height = svgTag.clientHeight;\n\t\t\t\tsvgTag.parentNode.insertBefore(c, svgTag);\n\t\t\t\tsvgTag.parentNode.removeChild(svgTag);\n\t\t\t\tvar div = document.createElement('div');\n\t\t\t\tdiv.appendChild(svgTag);\n\t\t\t\tcanvg(c, div.innerHTML);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof target == 'string') {\n\t\t\ttarget = document.getElementById(target);\n\t\t}\n\n\t\t// store class on canvas\n\t\tif (target.svg != null) target.svg.stop();\n\t\tvar svg = build(opts || {});\n\t\t// on i.e. 8 for flash canvas, we can't assign the property so check for it\n\t\tif (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == 'OBJECT')) target.svg = svg;\n\n\t\tvar ctx = target.getContext('2d');\n\t\tif (typeof(s.documentElement) != 'undefined') {\n\t\t\t// load from xml doc\n\t\t\tsvg.loadXmlDoc(ctx, s);\n\t\t}\n\t\telse if (s.substr(0,1) == '<') {\n\t\t\t// load from xml string\n\t\t\tsvg.loadXml(ctx, s);\n\t\t}\n\t\telse {\n\t\t\t// load from url\n\t\t\tsvg.load(ctx, s);\n\t\t}\n\t}\n\n\t// see https://developer.mozilla.org/en-US/docs/Web/API/Element.matches\n\tvar matchesSelector;\n\tif (typeof(Element.prototype.matches) != 'undefined') {\n\t\tmatchesSelector = function(node, selector) {\n\t\t\treturn node.matches(selector);\n\t\t};\n\t} else if (typeof(Element.prototype.webkitMatchesSelector) != 'undefined') {\n\t\tmatchesSelector = function(node, selector) {\n\t\t\treturn node.webkitMatchesSelector(selector);\n\t\t};\n\t} else if (typeof(Element.prototype.mozMatchesSelector) != 'undefined') {\n\t\tmatchesSelector = function(node, selector) {\n\t\t\treturn node.mozMatchesSelector(selector);\n\t\t};\n\t} else if (typeof(Element.prototype.msMatchesSelector) != 'undefined') {\n\t\tmatchesSelector = function(node, selector) {\n\t\t\treturn node.msMatchesSelector(selector);\n\t\t};\n\t} else if (typeof(Element.prototype.oMatchesSelector) != 'undefined') {\n\t\tmatchesSelector = function(node, selector) {\n\t\t\treturn node.oMatchesSelector(selector);\n\t\t};\n\t} else {\n\t\t// requires Sizzle: https://github.com/jquery/sizzle/wiki/Sizzle-Documentation\n\t\t// or jQuery: http://jquery.com/download/\n\t\t// or Zepto: http://zeptojs.com/#\n\t\t// without it, this is a ReferenceError\n\n\t\tif (typeof jQuery === 'function' || typeof Zepto === 'function') {\n\t\t\tmatchesSelector = function (node, selector) {\n\t\t\t\treturn $(node).is(selector);\n\t\t\t};\n\t\t}\n\n\t\tif (typeof matchesSelector === 'undefined') {\n\t\t\tmatchesSelector = Sizzle.matchesSelector;\n\t\t}\n\t}\n\n\t// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\n\tvar attributeRegex = /(\\[[^\\]]+\\])/g;\n\tvar idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\n\tvar classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\n\tvar pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\n\tvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\n\tvar pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\n\tvar elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\n\tfunction getSelectorSpecificity(selector) {\n\t\tvar typeCount = [0, 0, 0];\n\t\tvar findMatch = function(regex, type) {\n\t\t\tvar matches = selector.match(regex);\n\t\t\tif (matches == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttypeCount[type] += matches.length;\n\t\t\tselector = selector.replace(regex, ' ');\n\t\t};\n\n\t\tselector = selector.replace(/:not\\(([^\\)]*)\\)/g, '     $1 ');\n\t\tselector = selector.replace(/{[^]*/gm, ' ');\n\t\tfindMatch(attributeRegex, 1);\n\t\tfindMatch(idRegex, 0);\n\t\tfindMatch(classRegex, 1);\n\t\tfindMatch(pseudoElementRegex, 2);\n\t\tfindMatch(pseudoClassWithBracketsRegex, 1);\n\t\tfindMatch(pseudoClassRegex, 1);\n\t\tselector = selector.replace(/[\\*\\s\\+>~]/g, ' ');\n\t\tselector = selector.replace(/[#\\.]/g, ' ');\n\t\tfindMatch(elementRegex, 2);\n\t\treturn typeCount.join('');\n\t}\n\n\tfunction build(opts) {\n\t\tvar svg = { opts: opts };\n\n\t\tsvg.FRAMERATE = 30;\n\t\tsvg.MAX_VIRTUAL_PIXELS = 30000;\n\n\t\tsvg.log = function(msg) {};\n\t\tif (svg.opts['log'] == true && typeof(console) != 'undefined') {\n\t\t\tsvg.log = function(msg) { console.log(msg); };\n\t\t};\n\n\t\t// globals\n\t\tsvg.init = function(ctx) {\n\t\t\tvar uniqueId = 0;\n\t\t\tsvg.UniqueId = function () { uniqueId++; return 'canvg' + uniqueId;\t};\n\t\t\tsvg.Definitions = {};\n\t\t\tsvg.Styles = {};\n\t\t\tsvg.StylesSpecificity = {};\n\t\t\tsvg.Animations = [];\n\t\t\tsvg.Images = [];\n\t\t\tsvg.ctx = ctx;\n\t\t\tsvg.ViewPort = new (function () {\n\t\t\t\tthis.viewPorts = [];\n\t\t\t\tthis.Clear = function() { this.viewPorts = []; }\n\t\t\t\tthis.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }\n\t\t\t\tthis.RemoveCurrent = function() { this.viewPorts.pop(); }\n\t\t\t\tthis.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }\n\t\t\t\tthis.width = function() { return this.Current().width; }\n\t\t\t\tthis.height = function() { return this.Current().height; }\n\t\t\t\tthis.ComputeSize = function(d) {\n\t\t\t\t\tif (d != null && typeof(d) == 'number') return d;\n\t\t\t\t\tif (d == 'x') return this.width();\n\t\t\t\t\tif (d == 'y') return this.height();\n\t\t\t\t\treturn Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tsvg.init();\n\n\t\t// images loaded\n\t\tsvg.ImagesLoaded = function() {\n\t\t\tfor (var i=0; i<svg.Images.length; i++) {\n\t\t\t\tif (!svg.Images[i].loaded) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// trim\n\t\tsvg.trim = function(s) { return s.replace(/^\\s+|\\s+$/g, ''); }\n\n\t\t// compress spaces\n\t\tsvg.compressSpaces = function(s) { return s.replace(/[\\s\\r\\t\\n]+/gm,' '); }\n\n\t\t// ajax\n\t\tsvg.ajax = function(url) {\n\t\t\tvar AJAX;\n\t\t\tif(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}\n\t\t\telse{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}\n\t\t\tif(AJAX){\n\t\t\t   AJAX.open('GET',url,false);\n\t\t\t   AJAX.send(null);\n\t\t\t   return AJAX.responseText;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t// parse xml\n\t\tsvg.parseXml = function(xml) {\n\t\t\tif (typeof(Windows) != 'undefined' && typeof(Windows.Data) != 'undefined' && typeof(Windows.Data.Xml) != 'undefined') {\n\t\t\t\tvar xmlDoc = new Windows.Data.Xml.Dom.XmlDocument();\n\t\t\t\tvar settings = new Windows.Data.Xml.Dom.XmlLoadSettings();\n\t\t\t\tsettings.prohibitDtd = false;\n\t\t\t\txmlDoc.loadXml(xml, settings);\n\t\t\t\treturn xmlDoc;\n\t\t\t}\n\t\t\telse if (window.DOMParser)\n\t\t\t{\n\t\t\t\tvar parser = new DOMParser();\n\t\t\t\treturn parser.parseFromString(xml, 'text/xml');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\txml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');\n\t\t\t\tvar xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\n\t\t\t\txmlDoc.async = 'false';\n\t\t\t\txmlDoc.loadXML(xml);\n\t\t\t\treturn xmlDoc;\n\t\t\t}\n\t\t}\n\n\t\tsvg.Property = function(name, value) {\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t}\n\t\t\tsvg.Property.prototype.getValue = function() {\n\t\t\t\treturn this.value;\n\t\t\t}\n\n\t\t\tsvg.Property.prototype.hasValue = function() {\n\t\t\t\treturn (this.value != null && this.value !== '');\n\t\t\t}\n\n\t\t\t// return the numerical value of the property\n\t\t\tsvg.Property.prototype.numValue = function() {\n\t\t\t\tif (!this.hasValue()) return 0;\n\n\t\t\t\tvar n = parseFloat(this.value);\n\t\t\t\tif ((this.value + '').match(/%$/)) {\n\t\t\t\t\tn = n / 100.0;\n\t\t\t\t}\n\t\t\t\treturn n;\n\t\t\t}\n\n\t\t\tsvg.Property.prototype.valueOrDefault = function(def) {\n\t\t\t\tif (this.hasValue()) return this.value;\n\t\t\t\treturn def;\n\t\t\t}\n\n\t\t\tsvg.Property.prototype.numValueOrDefault = function(def) {\n\t\t\t\tif (this.hasValue()) return this.numValue();\n\t\t\t\treturn def;\n\t\t\t}\n\n\t\t\t// color extensions\n\t\t\t\t// augment the current color value with the opacity\n\t\t\t\tsvg.Property.prototype.addOpacity = function(opacityProp) {\n\t\t\t\t\tvar newValue = this.value;\n\t\t\t\t\tif (opacityProp.value != null && opacityProp.value != '' && typeof(this.value)=='string') { // can only add opacity to colors, not patterns\n\t\t\t\t\t\tvar color = new RGBColor(this.value);\n\t\t\t\t\t\tif (color.ok) {\n\t\t\t\t\t\t\tnewValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn new svg.Property(this.name, newValue);\n\t\t\t\t}\n\n\t\t\t// definition extensions\n\t\t\t\t// get the definition from the definitions table\n\t\t\t\tsvg.Property.prototype.getDefinition = function() {\n\t\t\t\t\tvar name = this.value.match(/#([^\\)'\"]+)/);\n\t\t\t\t\tif (name) { name = name[1]; }\n\t\t\t\t\tif (!name) { name = this.value; }\n\t\t\t\t\treturn svg.Definitions[name];\n\t\t\t\t}\n\n\t\t\t\tsvg.Property.prototype.isUrlDefinition = function() {\n\t\t\t\t\treturn this.value.indexOf('url(') == 0\n\t\t\t\t}\n\n\t\t\t\tsvg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) {\n\t\t\t\t\tvar def = this.getDefinition();\n\n\t\t\t\t\t// gradient\n\t\t\t\t\tif (def != null && def.createGradient) {\n\t\t\t\t\t\treturn def.createGradient(svg.ctx, e, opacityProp);\n\t\t\t\t\t}\n\n\t\t\t\t\t// pattern\n\t\t\t\t\tif (def != null && def.createPattern) {\n\t\t\t\t\t\tif (def.getHrefAttribute().hasValue()) {\n\t\t\t\t\t\t\tvar pt = def.attribute('patternTransform');\n\t\t\t\t\t\t\tdef = def.getHrefAttribute().getDefinition();\n\t\t\t\t\t\t\tif (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; }\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn def.createPattern(svg.ctx, e);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t// length extensions\n\t\t\t\tsvg.Property.prototype.getDPI = function(viewPort) {\n\t\t\t\t\treturn 96.0; // TODO: compute?\n\t\t\t\t}\n\n\t\t\t\tsvg.Property.prototype.getEM = function(viewPort) {\n\t\t\t\t\tvar em = 12;\n\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tif (fontSize.hasValue()) em = fontSize.toPixels(viewPort);\n\n\t\t\t\t\treturn em;\n\t\t\t\t}\n\n\t\t\t\tsvg.Property.prototype.getUnits = function() {\n\t\t\t\t\tvar s = this.value+'';\n\t\t\t\t\treturn s.replace(/[0-9\\.\\-]/g,'');\n\t\t\t\t}\n\n\t\t\t\t// get the length as pixels\n\t\t\t\tsvg.Property.prototype.toPixels = function(viewPort, processPercent) {\n\t\t\t\t\tif (!this.hasValue()) return 0;\n\t\t\t\t\tvar s = this.value+'';\n\t\t\t\t\tif (s.match(/em$/)) return this.numValue() * this.getEM(viewPort);\n\t\t\t\t\tif (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2.0;\n\t\t\t\t\tif (s.match(/px$/)) return this.numValue();\n\t\t\t\t\tif (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0);\n\t\t\t\t\tif (s.match(/pc$/)) return this.numValue() * 15;\n\t\t\t\t\tif (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54;\n\t\t\t\t\tif (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4;\n\t\t\t\t\tif (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort);\n\t\t\t\t\tif (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);\n\t\t\t\t\tvar n = this.numValue();\n\t\t\t\t\tif (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort);\n\t\t\t\t\treturn n;\n\t\t\t\t}\n\n\t\t\t// time extensions\n\t\t\t\t// get the time as milliseconds\n\t\t\t\tsvg.Property.prototype.toMilliseconds = function() {\n\t\t\t\t\tif (!this.hasValue()) return 0;\n\t\t\t\t\tvar s = this.value+'';\n\t\t\t\t\tif (s.match(/s$/)) return this.numValue() * 1000;\n\t\t\t\t\tif (s.match(/ms$/)) return this.numValue();\n\t\t\t\t\treturn this.numValue();\n\t\t\t\t}\n\n\t\t\t// angle extensions\n\t\t\t\t// get the angle as radians\n\t\t\t\tsvg.Property.prototype.toRadians = function() {\n\t\t\t\t\tif (!this.hasValue()) return 0;\n\t\t\t\t\tvar s = this.value+'';\n\t\t\t\t\tif (s.match(/deg$/)) return this.numValue() * (Math.PI / 180.0);\n\t\t\t\t\tif (s.match(/grad$/)) return this.numValue() * (Math.PI / 200.0);\n\t\t\t\t\tif (s.match(/rad$/)) return this.numValue();\n\t\t\t\t\treturn this.numValue() * (Math.PI / 180.0);\n\t\t\t\t}\n\n\t\t\t// text extensions\n\t\t\t\t// get the text baseline\n\t\t\t\tvar textBaselineMapping = {\n\t\t\t\t\t'baseline': 'alphabetic',\n\t\t\t\t\t'before-edge': 'top',\n\t\t\t\t\t'text-before-edge': 'top',\n\t\t\t\t\t'middle': 'middle',\n\t\t\t\t\t'central': 'middle',\n\t\t\t\t\t'after-edge': 'bottom',\n\t\t\t\t\t'text-after-edge': 'bottom',\n\t\t\t\t\t'ideographic': 'ideographic',\n\t\t\t\t\t'alphabetic': 'alphabetic',\n\t\t\t\t\t'hanging': 'hanging',\n\t\t\t\t\t'mathematical': 'alphabetic'\n\t\t\t\t};\n\t\t\t\tsvg.Property.prototype.toTextBaseline = function () {\n\t\t\t\t\tif (!this.hasValue()) return null;\n\t\t\t\t\treturn textBaselineMapping[this.value];\n\t\t\t\t}\n\n\t\t// fonts\n\t\tsvg.Font = new (function() {\n\t\t\tthis.Styles = 'normal|italic|oblique|inherit';\n\t\t\tthis.Variants = 'normal|small-caps|inherit';\n\t\t\tthis.Weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\n\n\t\t\tthis.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\n\t\t\t\tvar f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);\n\t\t\t\treturn {\n\t\t\t\t\tfontFamily: fontFamily || f.fontFamily,\n\t\t\t\t\tfontSize: fontSize || f.fontSize,\n\t\t\t\t\tfontStyle: fontStyle || f.fontStyle,\n\t\t\t\t\tfontWeight: fontWeight || f.fontWeight,\n\t\t\t\t\tfontVariant: fontVariant || f.fontVariant,\n\t\t\t\t\ttoString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar that = this;\n\t\t\tthis.Parse = function(s) {\n\t\t\t\tvar f = {};\n\t\t\t\tvar d = svg.trim(svg.compressSpaces(s || '')).split(' ');\n\t\t\t\tvar set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }\n\t\t\t\tvar ff = '';\n\t\t\t\tfor (var i=0; i<d.length; i++) {\n\t\t\t\t\tif (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }\n\t\t\t\t\telse if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;\t}\n\t\t\t\t\telse if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {\tif (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }\n\t\t\t\t\telse if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }\n\t\t\t\t\telse { if (d[i] != 'inherit') ff += d[i]; }\n\t\t\t\t} if (ff != '') f.fontFamily = ff;\n\t\t\t\treturn f;\n\t\t\t}\n\t\t});\n\n\t\t// points and paths\n\t\tsvg.ToNumberArray = function(s) {\n\t\t\tvar a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');\n\t\t\tfor (var i=0; i<a.length; i++) {\n\t\t\t\ta[i] = parseFloat(a[i]);\n\t\t\t}\n\t\t\treturn a;\n\t\t}\n\t\tsvg.Point = function(x, y) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t}\n\t\t\tsvg.Point.prototype.angleTo = function(p) {\n\t\t\t\treturn Math.atan2(p.y - this.y, p.x - this.x);\n\t\t\t}\n\n\t\t\tsvg.Point.prototype.applyTransform = function(v) {\n\t\t\t\tvar xp = this.x * v[0] + this.y * v[2] + v[4];\n\t\t\t\tvar yp = this.x * v[1] + this.y * v[3] + v[5];\n\t\t\t\tthis.x = xp;\n\t\t\t\tthis.y = yp;\n\t\t\t}\n\n\t\tsvg.CreatePoint = function(s) {\n\t\t\tvar a = svg.ToNumberArray(s);\n\t\t\treturn new svg.Point(a[0], a[1]);\n\t\t}\n\t\tsvg.CreatePath = function(s) {\n\t\t\tvar a = svg.ToNumberArray(s);\n\t\t\tvar path = [];\n\t\t\tfor (var i=0; i<a.length; i+=2) {\n\t\t\t\tpath.push(new svg.Point(a[i], a[i+1]));\n\t\t\t}\n\t\t\treturn path;\n\t\t}\n\n\t\t// bounding box\n\t\tsvg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want\n\t\t\tthis.x1 = Number.NaN;\n\t\t\tthis.y1 = Number.NaN;\n\t\t\tthis.x2 = Number.NaN;\n\t\t\tthis.y2 = Number.NaN;\n\n\t\t\tthis.x = function() { return this.x1; }\n\t\t\tthis.y = function() { return this.y1; }\n\t\t\tthis.width = function() { return this.x2 - this.x1; }\n\t\t\tthis.height = function() { return this.y2 - this.y1; }\n\n\t\t\tthis.addPoint = function(x, y) {\n\t\t\t\tif (x != null) {\n\t\t\t\t\tif (isNaN(this.x1) || isNaN(this.x2)) {\n\t\t\t\t\t\tthis.x1 = x;\n\t\t\t\t\t\tthis.x2 = x;\n\t\t\t\t\t}\n\t\t\t\t\tif (x < this.x1) this.x1 = x;\n\t\t\t\t\tif (x > this.x2) this.x2 = x;\n\t\t\t\t}\n\n\t\t\t\tif (y != null) {\n\t\t\t\t\tif (isNaN(this.y1) || isNaN(this.y2)) {\n\t\t\t\t\t\tthis.y1 = y;\n\t\t\t\t\t\tthis.y2 = y;\n\t\t\t\t\t}\n\t\t\t\t\tif (y < this.y1) this.y1 = y;\n\t\t\t\t\tif (y > this.y2) this.y2 = y;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.addX = function(x) { this.addPoint(x, null); }\n\t\t\tthis.addY = function(y) { this.addPoint(null, y); }\n\n\t\t\tthis.addBoundingBox = function(bb) {\n\t\t\t\tthis.addPoint(bb.x1, bb.y1);\n\t\t\t\tthis.addPoint(bb.x2, bb.y2);\n\t\t\t}\n\n\t\t\tthis.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {\n\t\t\t\tvar cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\t\t\t\tvar cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\t\t\t\tvar cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\t\t\t\tvar cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\t\t\t\tthis.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,\tcp2y, p2x, p2y);\n\t\t\t}\n\n\t\t\tthis.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n\t\t\t\t// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n\t\t\t\tvar p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];\n\t\t\t\tthis.addPoint(p0[0], p0[1]);\n\t\t\t\tthis.addPoint(p3[0], p3[1]);\n\n\t\t\t\tfor (i=0; i<=1; i++) {\n\t\t\t\t\tvar f = function(t) {\n\t\t\t\t\t\treturn Math.pow(1-t, 3) * p0[i]\n\t\t\t\t\t\t+ 3 * Math.pow(1-t, 2) * t * p1[i]\n\t\t\t\t\t\t+ 3 * (1-t) * Math.pow(t, 2) * p2[i]\n\t\t\t\t\t\t+ Math.pow(t, 3) * p3[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tvar b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n\t\t\t\t\tvar a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n\t\t\t\t\tvar c = 3 * p1[i] - 3 * p0[i];\n\n\t\t\t\t\tif (a == 0) {\n\t\t\t\t\t\tif (b == 0) continue;\n\t\t\t\t\t\tvar t = -c / b;\n\t\t\t\t\t\tif (0 < t && t < 1) {\n\t\t\t\t\t\t\tif (i == 0) this.addX(f(t));\n\t\t\t\t\t\t\tif (i == 1) this.addY(f(t));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar b2ac = Math.pow(b, 2) - 4 * c * a;\n\t\t\t\t\tif (b2ac < 0) continue;\n\t\t\t\t\tvar t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n\t\t\t\t\tif (0 < t1 && t1 < 1) {\n\t\t\t\t\t\tif (i == 0) this.addX(f(t1));\n\t\t\t\t\t\tif (i == 1) this.addY(f(t1));\n\t\t\t\t\t}\n\t\t\t\t\tvar t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n\t\t\t\t\tif (0 < t2 && t2 < 1) {\n\t\t\t\t\t\tif (i == 0) this.addX(f(t2));\n\t\t\t\t\t\tif (i == 1) this.addY(f(t2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.isPointInBox = function(x, y) {\n\t\t\t\treturn (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);\n\t\t\t}\n\n\t\t\tthis.addPoint(x1, y1);\n\t\t\tthis.addPoint(x2, y2);\n\t\t}\n\n\t\t// transforms\n\t\tsvg.Transform = function(v) {\n\t\t\tvar that = this;\n\t\t\tthis.Type = {}\n\n\t\t\t// translate\n\t\t\tthis.Type.translate = function(s) {\n\t\t\t\tthis.p = svg.CreatePoint(s);\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.translate(this.p.x || 0.0, this.p.y || 0.0);\n\t\t\t\t}\n\t\t\t\tthis.unapply = function(ctx) {\n\t\t\t\t\tctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// rotate\n\t\t\tthis.Type.rotate = function(s) {\n\t\t\t\tvar a = svg.ToNumberArray(s);\n\t\t\t\tthis.angle = new svg.Property('angle', a[0]);\n\t\t\t\tthis.cx = a[1] || 0;\n\t\t\t\tthis.cy = a[2] || 0;\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.translate(this.cx, this.cy);\n\t\t\t\t\tctx.rotate(this.angle.toRadians());\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\n\t\t\t\t}\n\t\t\t\tthis.unapply = function(ctx) {\n\t\t\t\t\tctx.translate(this.cx, this.cy);\n\t\t\t\t\tctx.rotate(-1.0 * this.angle.toRadians());\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tvar a = this.angle.toRadians();\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\n\t\t\t\t\tp.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.Type.scale = function(s) {\n\t\t\t\tthis.p = svg.CreatePoint(s);\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);\n\t\t\t\t}\n\t\t\t\tthis.unapply = function(ctx) {\n\t\t\t\t\tctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tp.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.Type.matrix = function(s) {\n\t\t\t\tthis.m = svg.ToNumberArray(s);\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);\n\t\t\t\t}\n\t\t\t\tthis.unapply = function(ctx) {\n\t\t\t\t\tvar a = this.m[0];\n\t\t\t\t\tvar b = this.m[2];\n\t\t\t\t\tvar c = this.m[4];\n\t\t\t\t\tvar d = this.m[1];\n\t\t\t\t\tvar e = this.m[3];\n\t\t\t\t\tvar f = this.m[5];\n\t\t\t\t\tvar g = 0.0;\n\t\t\t\t\tvar h = 0.0;\n\t\t\t\t\tvar i = 1.0;\n\t\t\t\t\tvar det = 1 / (a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g));\n\t\t\t\t\tctx.transform(\n\t\t\t\t\t\tdet*(e*i-f*h),\n\t\t\t\t\t\tdet*(f*g-d*i),\n\t\t\t\t\t\tdet*(c*h-b*i),\n\t\t\t\t\t\tdet*(a*i-c*g),\n\t\t\t\t\t\tdet*(b*f-c*e),\n\t\t\t\t\t\tdet*(c*d-a*f)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tp.applyTransform(this.m);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.Type.SkewBase = function(s) {\n\t\t\t\tthis.base = that.Type.matrix;\n\t\t\t\tthis.base(s);\n\t\t\t\tthis.angle = new svg.Property('angle', s);\n\t\t\t}\n\t\t\tthis.Type.SkewBase.prototype = new this.Type.matrix;\n\n\t\t\tthis.Type.skewX = function(s) {\n\t\t\t\tthis.base = that.Type.SkewBase;\n\t\t\t\tthis.base(s);\n\t\t\t\tthis.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0];\n\t\t\t}\n\t\t\tthis.Type.skewX.prototype = new this.Type.SkewBase;\n\n\t\t\tthis.Type.skewY = function(s) {\n\t\t\t\tthis.base = that.Type.SkewBase;\n\t\t\t\tthis.base(s);\n\t\t\t\tthis.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0];\n\t\t\t}\n\t\t\tthis.Type.skewY.prototype = new this.Type.SkewBase;\n\n\t\t\tthis.transforms = [];\n\n\t\t\tthis.apply = function(ctx) {\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\n\t\t\t\t\tthis.transforms[i].apply(ctx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.unapply = function(ctx) {\n\t\t\t\tfor (var i=this.transforms.length-1; i>=0; i--) {\n\t\t\t\t\tthis.transforms[i].unapply(ctx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\n\t\t\t\t\tthis.transforms[i].applyToPoint(p);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar data = svg.trim(svg.compressSpaces(v)).replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g,') ').split(/\\s(?=[a-z])/);\n\t\t\tfor (var i=0; i<data.length; i++) {\n\t\t\t\tvar type = svg.trim(data[i].split('(')[0]);\n\t\t\t\tvar s = data[i].split('(')[1].replace(')','');\n\t\t\t\tvar transform = new this.Type[type](s);\n\t\t\t\ttransform.type = type;\n\t\t\t\tthis.transforms.push(transform);\n\t\t\t}\n\t\t}\n\n\t\t// aspect ratio\n\t\tsvg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {\n\t\t\t// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n\t\t\taspectRatio = svg.compressSpaces(aspectRatio);\n\t\t\taspectRatio = aspectRatio.replace(/^defer\\s/,''); // ignore defer\n\t\t\tvar align = aspectRatio.split(' ')[0] || 'xMidYMid';\n\t\t\tvar meetOrSlice = aspectRatio.split(' ')[1] || 'meet';\n\n\t\t\t// calculate scale\n\t\t\tvar scaleX = width / desiredWidth;\n\t\t\tvar scaleY = height / desiredHeight;\n\t\t\tvar scaleMin = Math.min(scaleX, scaleY);\n\t\t\tvar scaleMax = Math.max(scaleX, scaleY);\n\t\t\tif (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }\n\t\t\tif (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }\n\n\t\t\trefX = new svg.Property('refX', refX);\n\t\t\trefY = new svg.Property('refY', refY);\n\t\t\tif (refX.hasValue() && refY.hasValue()) {\n\t\t\t\tctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y'));\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// align\n\t\t\t\tif (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0);\n\t\t\t\tif (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0);\n\t\t\t\tif (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0);\n\t\t\t\tif (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight);\n\t\t\t}\n\n\t\t\t// scale\n\t\t\tif (align == 'none') ctx.scale(scaleX, scaleY);\n\t\t\telse if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin);\n\t\t\telse if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax);\n\n\t\t\t// translate\n\t\t\tctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);\n\t\t}\n\n\t\t// elements\n\t\tsvg.Element = {}\n\n\t\tsvg.EmptyProperty = new svg.Property('EMPTY', '');\n\n\t\tsvg.Element.ElementBase = function(node) {\n\t\t\tthis.attributes = {};\n\t\t\tthis.styles = {};\n\t\t\tthis.stylesSpecificity = {};\n\t\t\tthis.children = [];\n\n\t\t\t// get or create attribute\n\t\t\tthis.attribute = function(name, createIfNotExists) {\n\t\t\t\tvar a = this.attributes[name];\n\t\t\t\tif (a != null) return a;\n\n\t\t\t\tif (createIfNotExists == true) { a = new svg.Property(name, ''); this.attributes[name] = a; }\n\t\t\t\treturn a || svg.EmptyProperty;\n\t\t\t}\n\n\t\t\tthis.getHrefAttribute = function() {\n\t\t\t\tfor (var a in this.attributes) {\n\t\t\t\t\tif (a == 'href' || a.match(/:href$/)) {\n\t\t\t\t\t\treturn this.attributes[a];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn svg.EmptyProperty;\n\t\t\t}\n\n\t\t\t// get or create style, crawls up node tree\n\t\t\tthis.style = function(name, createIfNotExists, skipAncestors) {\n\t\t\t\tvar s = this.styles[name];\n\t\t\t\tif (s != null) return s;\n\n\t\t\t\tvar a = this.attribute(name);\n\t\t\t\tif (a != null && a.hasValue()) {\n\t\t\t\t\tthis.styles[name] = a; // move up to me to cache\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\n\t\t\t\tif (skipAncestors != true) {\n\t\t\t\t\tvar p = this.parent;\n\t\t\t\t\tif (p != null) {\n\t\t\t\t\t\tvar ps = p.style(name);\n\t\t\t\t\t\tif (ps != null && ps.hasValue()) {\n\t\t\t\t\t\t\treturn ps;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (createIfNotExists == true) { s = new svg.Property(name, ''); this.styles[name] = s; }\n\t\t\t\treturn s || svg.EmptyProperty;\n\t\t\t}\n\n\t\t\t// base render\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// don't render display=none\n\t\t\t\tif (this.style('display').value == 'none') return;\n\n\t\t\t\t// don't render visibility=hidden\n\t\t\t\tif (this.style('visibility').value == 'hidden') return;\n\n\t\t\t\tctx.save();\n\t\t\t\tif (this.style('mask').hasValue()) { // mask\n\t\t\t\t\tvar mask = this.style('mask').getDefinition();\n\t\t\t\t\tif (mask != null) mask.apply(ctx, this);\n\t\t\t\t}\n\t\t\t\telse if (this.style('filter').hasValue()) { // filter\n\t\t\t\t\tvar filter = this.style('filter').getDefinition();\n\t\t\t\t\tif (filter != null) filter.apply(ctx, this);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setContext(ctx);\n\t\t\t\t\tthis.renderChildren(ctx);\n\t\t\t\t\tthis.clearContext(ctx);\n\t\t\t\t}\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\t// base set context\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t}\n\n\t\t\t// base clear context\n\t\t\tthis.clearContext = function(ctx) {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t}\n\n\t\t\t// base render children\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tthis.children[i].render(ctx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.addChild = function(childNode, create) {\n\t\t\t\tvar child = childNode;\n\t\t\t\tif (create) child = svg.CreateElement(childNode);\n\t\t\t\tchild.parent = this;\n\t\t\t\tif (child.type != 'title') { this.children.push(child);\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.addStylesFromStyleDefinition = function () {\n\t\t\t\t// add styles\n\t\t\t\tfor (var selector in svg.Styles) {\n\t\t\t\t\tif (selector[0] != '@' && matchesSelector(node, selector)) {\n\t\t\t\t\t\tvar styles = svg.Styles[selector];\n\t\t\t\t\t\tvar specificity = svg.StylesSpecificity[selector];\n\t\t\t\t\t\tif (styles != null) {\n\t\t\t\t\t\t\tfor (var name in styles) {\n\t\t\t\t\t\t\t\tvar existingSpecificity = this.stylesSpecificity[name];\n\t\t\t\t\t\t\t\tif (typeof(existingSpecificity) == 'undefined') {\n\t\t\t\t\t\t\t\t\texistingSpecificity = '000';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (specificity > existingSpecificity) {\n\t\t\t\t\t\t\t\t\tthis.styles[name] = styles[name];\n\t\t\t\t\t\t\t\t\tthis.stylesSpecificity[name] = specificity;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (node != null && node.nodeType == 1) { //ELEMENT_NODE\n\t\t\t\t// add attributes\n\t\t\t\tfor (var i=0; i<node.attributes.length; i++) {\n\t\t\t\t\tvar attribute = node.attributes[i];\n\t\t\t\t\tthis.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.value);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.addStylesFromStyleDefinition();\n\n\t\t\t\t// add inline styles\n\t\t\t\tif (this.attribute('style').hasValue()) {\n\t\t\t\t\tvar styles = this.attribute('style').value.split(';');\n\t\t\t\t\tfor (var i=0; i<styles.length; i++) {\n\t\t\t\t\t\tif (svg.trim(styles[i]) != '') {\n\t\t\t\t\t\t\tvar style = styles[i].split(':');\n\t\t\t\t\t\t\tvar name = svg.trim(style[0]);\n\t\t\t\t\t\t\tvar value = svg.trim(style[1]);\n\t\t\t\t\t\t\tthis.styles[name] = new svg.Property(name, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add id\n\t\t\t\tif (this.attribute('id').hasValue()) {\n\t\t\t\t\tif (svg.Definitions[this.attribute('id').value] == null) {\n\t\t\t\t\t\tsvg.Definitions[this.attribute('id').value] = this;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add children\n\t\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\n\t\t\t\t\tvar childNode = node.childNodes[i];\n\t\t\t\t\tif (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE\n\t\t\t\t\tif (this.captureTextNodes && (childNode.nodeType == 3 || childNode.nodeType == 4)) {\n\t\t\t\t\t\tvar text = childNode.value || childNode.text || childNode.textContent || '';\n\t\t\t\t\t\tif (svg.compressSpaces(text) != '') {\n\t\t\t\t\t\t\tthis.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsvg.Element.RenderedElementBase = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\t// fill\n\t\t\t\tif (this.style('fill').isUrlDefinition()) {\n\t\t\t\t\tvar fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity'));\n\t\t\t\t\tif (fs != null) ctx.fillStyle = fs;\n\t\t\t\t}\n\t\t\t\telse if (this.style('fill').hasValue()) {\n\t\t\t\t\tvar fillStyle = this.style('fill');\n\t\t\t\t\tif (fillStyle.value == 'currentColor') fillStyle.value = this.style('color').value;\n\t\t\t\t\tif (fillStyle.value != 'inherit') ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);\n\t\t\t\t}\n\t\t\t\tif (this.style('fill-opacity').hasValue()) {\n\t\t\t\t\tvar fillStyle = new svg.Property('fill', ctx.fillStyle);\n\t\t\t\t\tfillStyle = fillStyle.addOpacity(this.style('fill-opacity'));\n\t\t\t\t\tctx.fillStyle = fillStyle.value;\n\t\t\t\t}\n\n\t\t\t\t// stroke\n\t\t\t\tif (this.style('stroke').isUrlDefinition()) {\n\t\t\t\t\tvar fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity'));\n\t\t\t\t\tif (fs != null) ctx.strokeStyle = fs;\n\t\t\t\t}\n\t\t\t\telse if (this.style('stroke').hasValue()) {\n\t\t\t\t\tvar strokeStyle = this.style('stroke');\n\t\t\t\t\tif (strokeStyle.value == 'currentColor') strokeStyle.value = this.style('color').value;\n\t\t\t\t\tif (strokeStyle.value != 'inherit') ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);\n\t\t\t\t}\n\t\t\t\tif (this.style('stroke-opacity').hasValue()) {\n\t\t\t\t\tvar strokeStyle = new svg.Property('stroke', ctx.strokeStyle);\n\t\t\t\t\tstrokeStyle = strokeStyle.addOpacity(this.style('stroke-opacity'));\n\t\t\t\t\tctx.strokeStyle = strokeStyle.value;\n\t\t\t\t}\n\t\t\t\tif (this.style('stroke-width').hasValue()) {\n\t\t\t\t\tvar newLineWidth = this.style('stroke-width').toPixels();\n\t\t\t\t\tctx.lineWidth = newLineWidth == 0 ? 0.001 : newLineWidth; // browsers don't respect 0\n\t\t\t    }\n\t\t\t\tif (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;\n\t\t\t\tif (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;\n\t\t\t\tif (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;\n\t\t\t\tif (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value != 'none') {\n\t\t\t\t\tvar gaps = svg.ToNumberArray(this.style('stroke-dasharray').value);\n\t\t\t\t\tif (typeof(ctx.setLineDash) != 'undefined') { ctx.setLineDash(gaps); }\n\t\t\t\t\telse if (typeof(ctx.webkitLineDash) != 'undefined') { ctx.webkitLineDash = gaps; }\n\t\t\t\t\telse if (typeof(ctx.mozDash) != 'undefined' && !(gaps.length==1 && gaps[0]==0)) { ctx.mozDash = gaps; }\n\n\t\t\t\t\tvar offset = this.style('stroke-dashoffset').numValueOrDefault(1);\n\t\t\t\t\tif (typeof(ctx.lineDashOffset) != 'undefined') { ctx.lineDashOffset = offset; }\n\t\t\t\t\telse if (typeof(ctx.webkitLineDashOffset) != 'undefined') { ctx.webkitLineDashOffset = offset; }\n\t\t\t\t\telse if (typeof(ctx.mozDashOffset) != 'undefined') { ctx.mozDashOffset = offset; }\n\t\t\t\t}\n\n\t\t\t\t// font\n\t\t\t\tif (typeof(ctx.font) != 'undefined') {\n\t\t\t\t\tctx.font = svg.Font.CreateFont(\n\t\t\t\t\t\tthis.style('font-style').value,\n\t\t\t\t\t\tthis.style('font-variant').value,\n\t\t\t\t\t\tthis.style('font-weight').value,\n\t\t\t\t\t\tthis.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '',\n\t\t\t\t\t\tthis.style('font-family').value).toString();\n\t\t\t\t}\n\n\t\t\t\t// transform\n\t\t\t\tif (this.style('transform', false, true).hasValue()) {\n\t\t\t\t\tvar transform = new svg.Transform(this.style('transform', false, true).value);\n\t\t\t\t\ttransform.apply(ctx);\n\t\t\t\t}\n\n\t\t\t\t// clip\n\t\t\t\tif (this.style('clip-path', false, true).hasValue()) {\n\t\t\t\t\tvar clip = this.style('clip-path', false, true).getDefinition();\n\t\t\t\t\tif (clip != null) clip.apply(ctx);\n\t\t\t\t}\n\n\t\t\t\t// opacity\n\t\t\t\tif (this.style('opacity').hasValue()) {\n\t\t\t\t\tctx.globalAlpha = this.style('opacity').numValue();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;\n\n\t\tsvg.Element.PathElementBase = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tif (ctx != null) ctx.beginPath();\n\t\t\t\treturn new svg.BoundingBox();\n\t\t\t}\n\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tthis.path(ctx);\n\t\t\t\tsvg.Mouse.checkPath(this, ctx);\n\t\t\t\tif (ctx.fillStyle != '') {\n\t\t\t\t\tif (this.style('fill-rule').valueOrDefault('inherit') != 'inherit') { ctx.fill(this.style('fill-rule').value); }\n\t\t\t\t\telse { ctx.fill(); }\n\t\t\t\t}\n\t\t\t\tif (ctx.strokeStyle != '') ctx.stroke();\n\n\t\t\t\tvar markers = this.getMarkers();\n\t\t\t\tif (markers != null) {\n\t\t\t\t\tif (this.style('marker-start').isUrlDefinition()) {\n\t\t\t\t\t\tvar marker = this.style('marker-start').getDefinition();\n\t\t\t\t\t\tmarker.render(ctx, markers[0][0], markers[0][1]);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.style('marker-mid').isUrlDefinition()) {\n\t\t\t\t\t\tvar marker = this.style('marker-mid').getDefinition();\n\t\t\t\t\t\tfor (var i=1;i<markers.length-1;i++) {\n\t\t\t\t\t\t\tmarker.render(ctx, markers[i][0], markers[i][1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.style('marker-end').isUrlDefinition()) {\n\t\t\t\t\t\tvar marker = this.style('marker-end').getDefinition();\n\t\t\t\t\t\tmarker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.getBoundingBox = function() {\n\t\t\t\treturn this.path();\n\t\t\t}\n\n\t\t\tthis.getMarkers = function() {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// svg element\n\t\tsvg.Element.svg = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.baseClearContext = this.clearContext;\n\t\t\tthis.clearContext = function(ctx) {\n\t\t\t\tthis.baseClearContext(ctx);\n\t\t\t\tsvg.ViewPort.RemoveCurrent();\n\t\t\t}\n\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\t// initial values and defaults\n\t\t\t\tctx.strokeStyle = 'rgba(0,0,0,0)';\n\t\t\t\tctx.lineCap = 'butt';\n\t\t\t\tctx.lineJoin = 'miter';\n\t\t\t\tctx.miterLimit = 4;\n\t\t\t\tif (typeof(ctx.font) != 'undefined' && typeof(window.getComputedStyle) != 'undefined') {\n\t\t\t\t\tctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font');\n\t\t\t\t}\n\n\t\t\t\tthis.baseSetContext(ctx);\n\n\t\t\t\t// create new view port\n\t\t\t\tif (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0;\n\t\t\t\tif (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0;\n\t\t\t\tctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y'));\n\n\t\t\t\tvar width = svg.ViewPort.width();\n\t\t\t\tvar height = svg.ViewPort.height();\n\n\t\t\t\tif (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%';\n\t\t\t\tif (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%';\n\t\t\t\tif (typeof(this.root) == 'undefined') {\n\t\t\t\t\twidth = this.attribute('width').toPixels('x');\n\t\t\t\t\theight = this.attribute('height').toPixels('y');\n\n\t\t\t\t\tvar x = 0;\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\tif (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {\n\t\t\t\t\t\tx = -this.attribute('refX').toPixels('x');\n\t\t\t\t\t\ty = -this.attribute('refY').toPixels('y');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.attribute('overflow').valueOrDefault('hidden') != 'visible') {\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.moveTo(x, y);\n\t\t\t\t\t\tctx.lineTo(width, y);\n\t\t\t\t\t\tctx.lineTo(width, height);\n\t\t\t\t\t\tctx.lineTo(x, height);\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.clip();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsvg.ViewPort.SetCurrent(width, height);\n\n\t\t\t\t// viewbox\n\t\t\t\tif (this.attribute('viewBox').hasValue()) {\n\t\t\t\t\tvar viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\n\t\t\t\t\tvar minX = viewBox[0];\n\t\t\t\t\tvar minY = viewBox[1];\n\t\t\t\t\twidth = viewBox[2];\n\t\t\t\t\theight = viewBox[3];\n\n\t\t\t\t\tsvg.AspectRatio(ctx,\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.width(),\n\t\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.height(),\n\t\t\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\t\t\tminX,\n\t\t\t\t\t\t\t\t\tminY,\n\t\t\t\t\t\t\t\t\tthis.attribute('refX').value,\n\t\t\t\t\t\t\t\t\tthis.attribute('refY').value);\n\n\t\t\t\t\tsvg.ViewPort.RemoveCurrent();\n\t\t\t\t\tsvg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.svg.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// rect element\n\t\tsvg.Element.rect = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\n\t\t\t\tif (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;\n\t\t\t\tif (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;\n\t\t\t\trx = Math.min(rx, width / 2.0);\n\t\t\t\try = Math.min(ry, height / 2.0);\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(x + rx, y);\n\t\t\t\t\tctx.lineTo(x + width - rx, y);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry)\n\t\t\t\t\tctx.lineTo(x + width, y + height - ry);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)\n\t\t\t\t\tctx.lineTo(x + rx, y + height);\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry)\n\t\t\t\t\tctx.lineTo(x, y + ry);\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + rx, y)\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.rect.prototype = new svg.Element.PathElementBase;\n\n\t\t// circle element\n\t\tsvg.Element.circle = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\n\t\t\t\tvar r = this.attribute('r').toPixels();\n\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.arc(cx, cy, r, 0, Math.PI * 2, true);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\n\t\t\t\treturn new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.circle.prototype = new svg.Element.PathElementBase;\n\n\t\t// ellipse element\n\t\tsvg.Element.ellipse = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\n\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(cx, cy - ry);\n\t\t\t\t\tctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);\n\t\t\t\t\tctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\n\t\t\t\t\tctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\n\t\t\t\t\tctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\n\t\t\t\treturn new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.ellipse.prototype = new svg.Element.PathElementBase;\n\n\t\t// line element\n\t\tsvg.Element.line = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.getPoints = function() {\n\t\t\t\treturn [\n\t\t\t\t\tnew svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')),\n\t\t\t\t\tnew svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))];\n\t\t\t}\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar points = this.getPoints();\n\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\n\t\t\t\t\tctx.lineTo(points[1].x, points[1].y);\n\t\t\t\t}\n\n\t\t\t\treturn new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);\n\t\t\t}\n\n\t\t\tthis.getMarkers = function() {\n\t\t\t\tvar points = this.getPoints();\n\t\t\t\tvar a = points[0].angleTo(points[1]);\n\t\t\t\treturn [[points[0], a], [points[1], a]];\n\t\t\t}\n\t\t}\n\t\tsvg.Element.line.prototype = new svg.Element.PathElementBase;\n\n\t\t// polyline element\n\t\tsvg.Element.polyline = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.points = svg.CreatePath(this.attribute('points').value);\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(this.points[0].x, this.points[0].y);\n\t\t\t\t}\n\t\t\t\tfor (var i=1; i<this.points.length; i++) {\n\t\t\t\t\tbb.addPoint(this.points[i].x, this.points[i].y);\n\t\t\t\t\tif (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);\n\t\t\t\t}\n\t\t\t\treturn bb;\n\t\t\t}\n\n\t\t\tthis.getMarkers = function() {\n\t\t\t\tvar markers = [];\n\t\t\t\tfor (var i=0; i<this.points.length - 1; i++) {\n\t\t\t\t\tmarkers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);\n\t\t\t\t}\n\t\t\t\tmarkers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);\n\t\t\t\treturn markers;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.polyline.prototype = new svg.Element.PathElementBase;\n\n\t\t// polygon element\n\t\tsvg.Element.polygon = function(node) {\n\t\t\tthis.base = svg.Element.polyline;\n\t\t\tthis.base(node);\n\n\t\t\tthis.basePath = this.path;\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar bb = this.basePath(ctx);\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.lineTo(this.points[0].x, this.points[0].y);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\t\t\t\treturn bb;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.polygon.prototype = new svg.Element.polyline;\n\n\t\t// path element\n\t\tsvg.Element.path = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tvar d = this.attribute('d').value;\n\t\t\t// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF\n\t\t\td = d.replace(/,/gm,' '); // get rid of all commas\n\t\t\t// As the end of a match can also be the start of the next match, we need to run this replace twice.\n\t\t\tfor(var i=0; i<2; i++)\n\t\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,'$1 $2'); // suffix commands with spaces\n\t\t\td = d.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // prefix commands with spaces\n\t\t\td = d.replace(/([0-9])([+\\-])/gm,'$1 $2'); // separate digits on +- signs\n\t\t\t// Again, we need to run this twice to find all occurances\n\t\t\tfor(var i=0; i<2; i++)\n\t\t\t\td = d.replace(/(\\.[0-9]*)(\\.)/gm,'$1 $2'); // separate digits when they start with a comma\n\t\t\td = d.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax\n\t\t\td = svg.compressSpaces(d); // compress multiple spaces\n\t\t\td = svg.trim(d);\n\t\t\tthis.PathParser = new (function(d) {\n\t\t\t\tthis.tokens = d.split(' ');\n\n\t\t\t\tthis.reset = function() {\n\t\t\t\t\tthis.i = -1;\n\t\t\t\t\tthis.command = '';\n\t\t\t\t\tthis.previousCommand = '';\n\t\t\t\t\tthis.start = new svg.Point(0, 0);\n\t\t\t\t\tthis.control = new svg.Point(0, 0);\n\t\t\t\t\tthis.current = new svg.Point(0, 0);\n\t\t\t\t\tthis.points = [];\n\t\t\t\t\tthis.angles = [];\n\t\t\t\t}\n\n\t\t\t\tthis.isEnd = function() {\n\t\t\t\t\treturn this.i >= this.tokens.length - 1;\n\t\t\t\t}\n\n\t\t\t\tthis.isCommandOrEnd = function() {\n\t\t\t\t\tif (this.isEnd()) return true;\n\t\t\t\t\treturn this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;\n\t\t\t\t}\n\n\t\t\t\tthis.isRelativeCommand = function() {\n\t\t\t\t\tswitch(this.command)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tcase 'z':\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.getToken = function() {\n\t\t\t\t\tthis.i++;\n\t\t\t\t\treturn this.tokens[this.i];\n\t\t\t\t}\n\n\t\t\t\tthis.getScalar = function() {\n\t\t\t\t\treturn parseFloat(this.getToken());\n\t\t\t\t}\n\n\t\t\t\tthis.nextCommand = function() {\n\t\t\t\t\tthis.previousCommand = this.command;\n\t\t\t\t\tthis.command = this.getToken();\n\t\t\t\t}\n\n\t\t\t\tthis.getPoint = function() {\n\t\t\t\t\tvar p = new svg.Point(this.getScalar(), this.getScalar());\n\t\t\t\t\treturn this.makeAbsolute(p);\n\t\t\t\t}\n\n\t\t\t\tthis.getAsControlPoint = function() {\n\t\t\t\t\tvar p = this.getPoint();\n\t\t\t\t\tthis.control = p;\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\n\t\t\t\tthis.getAsCurrentPoint = function() {\n\t\t\t\t\tvar p = this.getPoint();\n\t\t\t\t\tthis.current = p;\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\n\t\t\t\tthis.getReflectedControlPoint = function() {\n\t\t\t\t\tif (this.previousCommand.toLowerCase() != 'c' &&\n\t\t\t\t\t    this.previousCommand.toLowerCase() != 's' &&\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 'q' &&\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 't' ){\n\t\t\t\t\t\treturn this.current;\n\t\t\t\t\t}\n\n\t\t\t\t\t// reflect point\n\t\t\t\t\tvar p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\n\t\t\t\tthis.makeAbsolute = function(p) {\n\t\t\t\t\tif (this.isRelativeCommand()) {\n\t\t\t\t\t\tp.x += this.current.x;\n\t\t\t\t\t\tp.y += this.current.y;\n\t\t\t\t\t}\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\n\t\t\t\tthis.addMarker = function(p, from, priorTo) {\n\t\t\t\t\t// if the last angle isn't filled in because we didn't have this point yet ...\n\t\t\t\t\tif (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {\n\t\t\t\t\t\tthis.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);\n\t\t\t\t\t}\n\t\t\t\t\tthis.addMarkerAngle(p, from == null ? null : from.angleTo(p));\n\t\t\t\t}\n\n\t\t\t\tthis.addMarkerAngle = function(p, a) {\n\t\t\t\t\tthis.points.push(p);\n\t\t\t\t\tthis.angles.push(a);\n\t\t\t\t}\n\n\t\t\t\tthis.getMarkerPoints = function() { return this.points; }\n\t\t\t\tthis.getMarkerAngles = function() {\n\t\t\t\t\tfor (var i=0; i<this.angles.length; i++) {\n\t\t\t\t\t\tif (this.angles[i] == null) {\n\t\t\t\t\t\t\tfor (var j=i+1; j<this.angles.length; j++) {\n\t\t\t\t\t\t\t\tif (this.angles[j] != null) {\n\t\t\t\t\t\t\t\t\tthis.angles[i] = this.angles[j];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.angles;\n\t\t\t\t}\n\t\t\t})(d);\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar pp = this.PathParser;\n\t\t\t\tpp.reset();\n\n\t\t\t\tvar bb = new svg.BoundingBox();\n\t\t\t\tif (ctx != null) ctx.beginPath();\n\t\t\t\twhile (!pp.isEnd()) {\n\t\t\t\t\tpp.nextCommand();\n\t\t\t\t\tswitch (pp.command) {\n\t\t\t\t\tcase 'M':\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\n\t\t\t\t\t\tpp.addMarker(p);\n\t\t\t\t\t\tbb.addPoint(p.x, p.y);\n\t\t\t\t\t\tif (ctx != null) ctx.moveTo(p.x, p.y);\n\t\t\t\t\t\tpp.start = pp.current;\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(p, pp.start);\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'L':\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar c = pp.current;\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(p, c);\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'H':\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\n\t\t\t\t\t\t\tpp.current = newP;\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'V':\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\n\t\t\t\t\t\t\tpp.current = newP;\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'C':\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar p1 = pp.getPoint();\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'S':\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar p1 = pp.getReflectedControlPoint();\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'T':\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar cntrl = pp.getReflectedControlPoint();\n\t\t\t\t\t\t\tpp.control = cntrl;\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'A':\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t    var curr = pp.current;\n\t\t\t\t\t\t\tvar rx = pp.getScalar();\n\t\t\t\t\t\t\tvar ry = pp.getScalar();\n\t\t\t\t\t\t\tvar xAxisRotation = pp.getScalar() * (Math.PI / 180.0);\n\t\t\t\t\t\t\tvar largeArcFlag = pp.getScalar();\n\t\t\t\t\t\t\tvar sweepFlag = pp.getScalar();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\n\t\t\t\t\t\t\t// Conversion from endpoint to center parameterization\n\t\t\t\t\t\t\t// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n\t\t\t\t\t\t\t// x1', y1'\n\t\t\t\t\t\t\tvar currp = new svg.Point(\n\t\t\t\t\t\t\t\tMath.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,\n\t\t\t\t\t\t\t\t-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// adjust radii\n\t\t\t\t\t\t\tvar l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);\n\t\t\t\t\t\t\tif (l > 1) {\n\t\t\t\t\t\t\t\trx *= Math.sqrt(l);\n\t\t\t\t\t\t\t\try *= Math.sqrt(l);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// cx', cy'\n\t\t\t\t\t\t\tvar s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(\n\t\t\t\t\t\t\t\t((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /\n\t\t\t\t\t\t\t\t(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (isNaN(s)) s = 0;\n\t\t\t\t\t\t\tvar cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\n\t\t\t\t\t\t\t// cx, cy\n\t\t\t\t\t\t\tvar centp = new svg.Point(\n\t\t\t\t\t\t\t\t(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,\n\t\t\t\t\t\t\t\t(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// vector magnitude\n\t\t\t\t\t\t\tvar m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }\n\t\t\t\t\t\t\t// ratio between two vectors\n\t\t\t\t\t\t\tvar r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }\n\t\t\t\t\t\t\t// angle between two vectors\n\t\t\t\t\t\t\tvar a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }\n\t\t\t\t\t\t\t// initial angle\n\t\t\t\t\t\t\tvar a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);\n\t\t\t\t\t\t\t// angle delta\n\t\t\t\t\t\t\tvar u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];\n\t\t\t\t\t\t\tvar v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];\n\t\t\t\t\t\t\tvar ad = a(u, v);\n\t\t\t\t\t\t\tif (r(u,v) <= -1) ad = Math.PI;\n\t\t\t\t\t\t\tif (r(u,v) >= 1) ad = 0;\n\n\t\t\t\t\t\t\t// for markers\n\t\t\t\t\t\t\tvar dir = 1 - sweepFlag ? 1.0 : -1.0;\n\t\t\t\t\t\t\tvar ah = a1 + dir * (ad / 2.0);\n\t\t\t\t\t\t\tvar halfWay = new svg.Point(\n\t\t\t\t\t\t\t\tcentp.x + rx * Math.cos(ah),\n\t\t\t\t\t\t\t\tcentp.y + ry * Math.sin(ah)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\n\t\t\t\t\t\t\tpp.addMarkerAngle(cp, ah - dir * Math.PI);\n\n\t\t\t\t\t\t\tbb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better\n\t\t\t\t\t\t\tif (ctx != null) {\n\t\t\t\t\t\t\t\tvar r = rx > ry ? rx : ry;\n\t\t\t\t\t\t\t\tvar sx = rx > ry ? 1 : rx / ry;\n\t\t\t\t\t\t\t\tvar sy = rx > ry ? ry / rx : 1;\n\n\t\t\t\t\t\t\t\tctx.translate(centp.x, centp.y);\n\t\t\t\t\t\t\t\tctx.rotate(xAxisRotation);\n\t\t\t\t\t\t\t\tctx.scale(sx, sy);\n\t\t\t\t\t\t\t\tctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);\n\t\t\t\t\t\t\t\tctx.scale(1/sx, 1/sy);\n\t\t\t\t\t\t\t\tctx.rotate(-xAxisRotation);\n\t\t\t\t\t\t\t\tctx.translate(-centp.x, -centp.y);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tif (ctx != null) ctx.closePath();\n\t\t\t\t\t\tpp.current = pp.start;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn bb;\n\t\t\t}\n\n\t\t\tthis.getMarkers = function() {\n\t\t\t\tvar points = this.PathParser.getMarkerPoints();\n\t\t\t\tvar angles = this.PathParser.getMarkerAngles();\n\n\t\t\t\tvar markers = [];\n\t\t\t\tfor (var i=0; i<points.length; i++) {\n\t\t\t\t\tmarkers.push([points[i], angles[i]]);\n\t\t\t\t}\n\t\t\t\treturn markers;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.path.prototype = new svg.Element.PathElementBase;\n\n\t\t// pattern element\n\t\tsvg.Element.pattern = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.createPattern = function(ctx, element) {\n\t\t\t\tvar width = this.attribute('width').toPixels('x', true);\n\t\t\t\tvar height = this.attribute('height').toPixels('y', true);\n\n\t\t\t\t// render me using a temporary svg element\n\t\t\t\tvar tempSvg = new svg.Element.svg();\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', width + 'px');\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', height + 'px');\n\t\t\t\ttempSvg.attributes['transform'] = new svg.Property('transform', this.attribute('patternTransform').value);\n\t\t\t\ttempSvg.children = this.children;\n\n\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\tc.width = width;\n\t\t\t\tc.height = height;\n\t\t\t\tvar cctx = c.getContext('2d');\n\t\t\t\tif (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {\n\t\t\t\t\tcctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true));\n\t\t\t\t}\n\t\t\t\t// render 3x3 grid so when we transform there's no white space on edges\n\t\t\t\tfor (var x=-1; x<=1; x++) {\n\t\t\t\t\tfor (var y=-1; y<=1; y++) {\n\t\t\t\t\t\tcctx.save();\n\t\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', x * c.width);\n\t\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', y * c.height);\n\t\t\t\t\t\ttempSvg.render(cctx);\n\t\t\t\t\t\tcctx.restore();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar pattern = ctx.createPattern(c, 'repeat');\n\t\t\t\treturn pattern;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.pattern.prototype = new svg.Element.ElementBase;\n\n\t\t// marker element\n\t\tsvg.Element.marker = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.baseRender = this.render;\n\t\t\tthis.render = function(ctx, point, angle) {\n\t\t\t\tctx.translate(point.x, point.y);\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);\n\t\t\t\tctx.save();\n\n\t\t\t\t// render me using a temporary svg element\n\t\t\t\tvar tempSvg = new svg.Element.svg();\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\n\t\t\t\ttempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);\n\t\t\t\ttempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);\n\t\t\t\ttempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));\n\t\t\t\ttempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));\n\t\t\t\ttempSvg.children = this.children;\n\t\t\t\ttempSvg.render(ctx);\n\n\t\t\t\tctx.restore();\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);\n\t\t\t\tctx.translate(-point.x, -point.y);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.marker.prototype = new svg.Element.ElementBase;\n\n\t\t// definitions element\n\t\tsvg.Element.defs = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NOOP\n\t\t\t}\n\t\t}\n\t\tsvg.Element.defs.prototype = new svg.Element.ElementBase;\n\n\t\t// base for gradients\n\t\tsvg.Element.GradientBase = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.stops = [];\n\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\tvar child = this.children[i];\n\t\t\t\tif (child.type == 'stop') this.stops.push(child);\n\t\t\t}\n\n\t\t\tthis.getGradient = function() {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t}\n\t\t\t\n\t\t\tthis.gradientUnits = function () {\n\t\t\t\treturn this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');\n\t\t\t}\n\t\t\t\n\t\t\tthis.attributesToInherit = ['gradientUnits'];\n\t\t\t\n\t\t\tthis.inheritStopContainer = function (stopsContainer) {\n\t\t\t\tfor (var i=0; i<this.attributesToInherit.length; i++) {\n\t\t\t\t\tvar attributeToInherit = this.attributesToInherit[i];\n\t\t\t\t\tif (!this.attribute(attributeToInherit).hasValue() && stopsContainer.attribute(attributeToInherit).hasValue()) {\n\t\t\t\t\t\tthis.attribute(attributeToInherit, true).value = stopsContainer.attribute(attributeToInherit).value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.createGradient = function(ctx, element, parentOpacityProp) {\n\t\t\t\tvar stopsContainer = this;\n\t\t\t\tif (this.getHrefAttribute().hasValue()) {\n\t\t\t\t\tstopsContainer = this.getHrefAttribute().getDefinition();\n\t\t\t\t\tthis.inheritStopContainer(stopsContainer);\n\t\t\t\t}\n\n\t\t\t\tvar addParentOpacity = function (color) {\n\t\t\t\t\tif (parentOpacityProp.hasValue()) {\n\t\t\t\t\t\tvar p = new svg.Property('color', color);\n\t\t\t\t\t\treturn p.addOpacity(parentOpacityProp).value;\n\t\t\t\t\t}\n\t\t\t\t\treturn color;\n\t\t\t\t};\n\n\t\t\t\tvar g = this.getGradient(ctx, element);\n\t\t\t\tif (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);\n\t\t\t\tfor (var i=0; i<stopsContainer.stops.length; i++) {\n\t\t\t\t\tg.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color));\n\t\t\t\t}\n\n\t\t\t\tif (this.attribute('gradientTransform').hasValue()) {\n\t\t\t\t\t// render as transformed pattern on temporary canvas\n\t\t\t\t\tvar rootView = svg.ViewPort.viewPorts[0];\n\n\t\t\t\t\tvar rect = new svg.Element.rect();\n\t\t\t\t\trect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);\n\t\t\t\t\trect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);\n\t\t\t\t\trect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);\n\t\t\t\t\trect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);\n\n\t\t\t\t\tvar group = new svg.Element.g();\n\t\t\t\t\tgroup.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);\n\t\t\t\t\tgroup.children = [ rect ];\n\n\t\t\t\t\tvar tempSvg = new svg.Element.svg();\n\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', 0);\n\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', 0);\n\t\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', rootView.width);\n\t\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', rootView.height);\n\t\t\t\t\ttempSvg.children = [ group ];\n\n\t\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\t\tc.width = rootView.width;\n\t\t\t\t\tc.height = rootView.height;\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\n\t\t\t\t\ttempCtx.fillStyle = g;\n\t\t\t\t\ttempSvg.render(tempCtx);\n\t\t\t\t\treturn tempCtx.createPattern(c, 'no-repeat');\n\t\t\t\t}\n\n\t\t\t\treturn g;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.GradientBase.prototype = new svg.Element.ElementBase;\n\n\t\t// linear gradient element\n\t\tsvg.Element.linearGradient = function(node) {\n\t\t\tthis.base = svg.Element.GradientBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.attributesToInherit.push('x1');\n\t\t\tthis.attributesToInherit.push('y1');\n\t\t\tthis.attributesToInherit.push('x2');\n\t\t\tthis.attributesToInherit.push('y2');\n\n\t\t\tthis.getGradient = function(ctx, element) {\n\t\t\t\tvar bb = this.gradientUnits() == 'objectBoundingBox' ? element.getBoundingBox() : null;\n\n\t\t\t\tif (!this.attribute('x1').hasValue()\n\t\t\t\t && !this.attribute('y1').hasValue()\n\t\t\t\t && !this.attribute('x2').hasValue()\n\t\t\t\t && !this.attribute('y2').hasValue()) {\n\t\t\t\t\tthis.attribute('x1', true).value = 0;\n\t\t\t\t\tthis.attribute('y1', true).value = 0;\n\t\t\t\t\tthis.attribute('x2', true).value = 1;\n\t\t\t\t\tthis.attribute('y2', true).value = 0;\n\t\t\t\t }\n\n\t\t\t\tvar x1 = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x1').numValue()\n\t\t\t\t\t: this.attribute('x1').toPixels('x'));\n\t\t\t\tvar y1 = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y1').numValue()\n\t\t\t\t\t: this.attribute('y1').toPixels('y'));\n\t\t\t\tvar x2 = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x2').numValue()\n\t\t\t\t\t: this.attribute('x2').toPixels('x'));\n\t\t\t\tvar y2 = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y2').numValue()\n\t\t\t\t\t: this.attribute('y2').toPixels('y'));\n\n\t\t\t\tif (x1 == x2 && y1 == y2) return null;\n\t\t\t\treturn ctx.createLinearGradient(x1, y1, x2, y2);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.linearGradient.prototype = new svg.Element.GradientBase;\n\n\t\t// radial gradient element\n\t\tsvg.Element.radialGradient = function(node) {\n\t\t\tthis.base = svg.Element.GradientBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.attributesToInherit.push('cx');\n\t\t\tthis.attributesToInherit.push('cy');\n\t\t\tthis.attributesToInherit.push('r');\n\t\t\tthis.attributesToInherit.push('fx');\n\t\t\tthis.attributesToInherit.push('fy');\n\n\t\t\tthis.getGradient = function(ctx, element) {\n\t\t\t\tvar bb = element.getBoundingBox();\n\n\t\t\t\tif (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%';\n\t\t\t\tif (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%';\n\t\t\t\tif (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%';\n\n\t\t\t\tvar cx = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('cx').numValue()\n\t\t\t\t\t: this.attribute('cx').toPixels('x'));\n\t\t\t\tvar cy = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('cy').numValue()\n\t\t\t\t\t: this.attribute('cy').toPixels('y'));\n\n\t\t\t\tvar fx = cx;\n\t\t\t\tvar fy = cy;\n\t\t\t\tif (this.attribute('fx').hasValue()) {\n\t\t\t\t\tfx = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('fx').numValue()\n\t\t\t\t\t: this.attribute('fx').toPixels('x'));\n\t\t\t\t}\n\t\t\t\tif (this.attribute('fy').hasValue()) {\n\t\t\t\t\tfy = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('fy').numValue()\n\t\t\t\t\t: this.attribute('fy').toPixels('y'));\n\t\t\t\t}\n\n\t\t\t\tvar r = (this.gradientUnits() == 'objectBoundingBox'\n\t\t\t\t\t? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()\n\t\t\t\t\t: this.attribute('r').toPixels());\n\n\t\t\t\treturn ctx.createRadialGradient(fx, fy, 0, cx, cy, r);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.radialGradient.prototype = new svg.Element.GradientBase;\n\n\t\t// gradient stop element\n\t\tsvg.Element.stop = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.offset = this.attribute('offset').numValue();\n\t\t\tif (this.offset < 0) this.offset = 0;\n\t\t\tif (this.offset > 1) this.offset = 1;\n\n\t\t\tvar stopColor = this.style('stop-color', true);\n\t\t\tif (stopColor.value === '') stopColor.value = '#000';\n\t\t\tif (this.style('stop-opacity').hasValue()) stopColor = stopColor.addOpacity(this.style('stop-opacity'));\n\t\t\tthis.color = stopColor.value;\n\t\t}\n\t\tsvg.Element.stop.prototype = new svg.Element.ElementBase;\n\n\t\t// animation base element\n\t\tsvg.Element.AnimateBase = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tsvg.Animations.push(this);\n\n\t\t\tthis.duration = 0.0;\n\t\t\tthis.begin = this.attribute('begin').toMilliseconds();\n\t\t\tthis.maxDuration = this.begin + this.attribute('dur').toMilliseconds();\n\n\t\t\tthis.getProperty = function() {\n\t\t\t\tvar attributeType = this.attribute('attributeType').value;\n\t\t\t\tvar attributeName = this.attribute('attributeName').value;\n\n\t\t\t\tif (attributeType == 'CSS') {\n\t\t\t\t\treturn this.parent.style(attributeName, true);\n\t\t\t\t}\n\t\t\t\treturn this.parent.attribute(attributeName, true);\n\t\t\t};\n\n\t\t\tthis.initialValue = null;\n\t\t\tthis.initialUnits = '';\n\t\t\tthis.removed = false;\n\n\t\t\tthis.calcValue = function() {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tthis.update = function(delta) {\n\t\t\t\t// set initial value\n\t\t\t\tif (this.initialValue == null) {\n\t\t\t\t\tthis.initialValue = this.getProperty().value;\n\t\t\t\t\tthis.initialUnits = this.getProperty().getUnits();\n\t\t\t\t}\n\n\t\t\t\t// if we're past the end time\n\t\t\t\tif (this.duration > this.maxDuration) {\n\t\t\t\t\t// loop for indefinitely repeating animations\n\t\t\t\t\tif (this.attribute('repeatCount').value == 'indefinite'\n\t\t\t\t\t || this.attribute('repeatDur').value == 'indefinite') {\n\t\t\t\t\t\tthis.duration = 0.0\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'freeze' && !this.frozen) {\n\t\t\t\t\t\tthis.frozen = true;\n\t\t\t\t\t\tthis.parent.animationFrozen = true;\n\t\t\t\t\t\tthis.parent.animationFrozenValue = this.getProperty().value;\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {\n\t\t\t\t\t\tthis.removed = true;\n\t\t\t\t\t\tthis.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.duration = this.duration + delta;\n\n\t\t\t\t// if we're past the begin time\n\t\t\t\tvar updated = false;\n\t\t\t\tif (this.begin < this.duration) {\n\t\t\t\t\tvar newValue = this.calcValue(); // tween\n\n\t\t\t\t\tif (this.attribute('type').hasValue()) {\n\t\t\t\t\t\t// for transform, etc.\n\t\t\t\t\t\tvar type = this.attribute('type').value;\n\t\t\t\t\t\tnewValue = type + '(' + newValue + ')';\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.getProperty().value = newValue;\n\t\t\t\t\tupdated = true;\n\t\t\t\t}\n\n\t\t\t\treturn updated;\n\t\t\t}\n\n\t\t\tthis.from = this.attribute('from');\n\t\t\tthis.to = this.attribute('to');\n\t\t\tthis.values = this.attribute('values');\n\t\t\tif (this.values.hasValue()) this.values.value = this.values.value.split(';');\n\n\t\t\t// fraction of duration we've covered\n\t\t\tthis.progress = function() {\n\t\t\t\tvar ret = { progress: (this.duration - this.begin) / (this.maxDuration - this.begin) };\n\t\t\t\tif (this.values.hasValue()) {\n\t\t\t\t\tvar p = ret.progress * (this.values.value.length - 1);\n\t\t\t\t\tvar lb = Math.floor(p), ub = Math.ceil(p);\n\t\t\t\t\tret.from = new svg.Property('from', parseFloat(this.values.value[lb]));\n\t\t\t\t\tret.to = new svg.Property('to', parseFloat(this.values.value[ub]));\n\t\t\t\t\tret.progress = (p - lb) / (ub - lb);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tret.from = this.from;\n\t\t\t\t\tret.to = this.to;\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.AnimateBase.prototype = new svg.Element.ElementBase;\n\n\t\t// animate element\n\t\tsvg.Element.animate = function(node) {\n\t\t\tthis.base = svg.Element.AnimateBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.calcValue = function() {\n\t\t\t\tvar p = this.progress();\n\n\t\t\t\t// tween value linearly\n\t\t\t\tvar newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress;\n\t\t\t\treturn newValue + this.initialUnits;\n\t\t\t};\n\t\t}\n\t\tsvg.Element.animate.prototype = new svg.Element.AnimateBase;\n\n\t\t// animate color element\n\t\tsvg.Element.animateColor = function(node) {\n\t\t\tthis.base = svg.Element.AnimateBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.calcValue = function() {\n\t\t\t\tvar p = this.progress();\n\t\t\t\tvar from = new RGBColor(p.from.value);\n\t\t\t\tvar to = new RGBColor(p.to.value);\n\n\t\t\t\tif (from.ok && to.ok) {\n\t\t\t\t\t// tween color linearly\n\t\t\t\t\tvar r = from.r + (to.r - from.r) * p.progress;\n\t\t\t\t\tvar g = from.g + (to.g - from.g) * p.progress;\n\t\t\t\t\tvar b = from.b + (to.b - from.b) * p.progress;\n\t\t\t\t\treturn 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';\n\t\t\t\t}\n\t\t\t\treturn this.attribute('from').value;\n\t\t\t};\n\t\t}\n\t\tsvg.Element.animateColor.prototype = new svg.Element.AnimateBase;\n\n\t\t// animate transform element\n\t\tsvg.Element.animateTransform = function(node) {\n\t\t\tthis.base = svg.Element.AnimateBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.calcValue = function() {\n\t\t\t\tvar p = this.progress();\n\n\t\t\t\t// tween value linearly\n\t\t\t\tvar from = svg.ToNumberArray(p.from.value);\n\t\t\t\tvar to = svg.ToNumberArray(p.to.value);\n\t\t\t\tvar newValue = '';\n\t\t\t\tfor (var i=0; i<from.length; i++) {\n\t\t\t\t\tnewValue += from[i] + (to[i] - from[i]) * p.progress + ' ';\n\t\t\t\t}\n\t\t\t\treturn newValue;\n\t\t\t};\n\t\t}\n\t\tsvg.Element.animateTransform.prototype = new svg.Element.animate;\n\n\t\t// font element\n\t\tsvg.Element.font = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\n\n\t\t\tthis.isRTL = false;\n\t\t\tthis.isArabic = false;\n\t\t\tthis.fontFace = null;\n\t\t\tthis.missingGlyph = null;\n\t\t\tthis.glyphs = [];\n\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\tvar child = this.children[i];\n\t\t\t\tif (child.type == 'font-face') {\n\t\t\t\t\tthis.fontFace = child;\n\t\t\t\t\tif (child.style('font-family').hasValue()) {\n\t\t\t\t\t\tsvg.Definitions[child.style('font-family').value] = this;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (child.type == 'missing-glyph') this.missingGlyph = child;\n\t\t\t\telse if (child.type == 'glyph') {\n\t\t\t\t\tif (child.arabicForm != '') {\n\t\t\t\t\t\tthis.isRTL = true;\n\t\t\t\t\t\tthis.isArabic = true;\n\t\t\t\t\t\tif (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];\n\t\t\t\t\t\tthis.glyphs[child.unicode][child.arabicForm] = child;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.glyphs[child.unicode] = child;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.font.prototype = new svg.Element.ElementBase;\n\n\t\t// font-face element\n\t\tsvg.Element.fontface = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.ascent = this.attribute('ascent').value;\n\t\t\tthis.descent = this.attribute('descent').value;\n\t\t\tthis.unitsPerEm = this.attribute('units-per-em').numValue();\n\t\t}\n\t\tsvg.Element.fontface.prototype = new svg.Element.ElementBase;\n\n\t\t// missing-glyph element\n\t\tsvg.Element.missingglyph = function(node) {\n\t\t\tthis.base = svg.Element.path;\n\t\t\tthis.base(node);\n\n\t\t\tthis.horizAdvX = 0;\n\t\t}\n\t\tsvg.Element.missingglyph.prototype = new svg.Element.path;\n\n\t\t// glyph element\n\t\tsvg.Element.glyph = function(node) {\n\t\t\tthis.base = svg.Element.path;\n\t\t\tthis.base(node);\n\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\n\t\t\tthis.unicode = this.attribute('unicode').value;\n\t\t\tthis.arabicForm = this.attribute('arabic-form').value;\n\t\t}\n\t\tsvg.Element.glyph.prototype = new svg.Element.path;\n\n\t\t// text element\n\t\tsvg.Element.text = function(node) {\n\t\t\tthis.captureTextNodes = true;\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\tthis.baseSetContext(ctx);\n\n\t\t\t\tvar textBaseline = this.style('dominant-baseline').toTextBaseline();\n\t\t\t\tif (textBaseline == null) textBaseline = this.style('alignment-baseline').toTextBaseline();\n\t\t\t\tif (textBaseline != null) ctx.textBaseline = textBaseline;\n\t\t\t}\n\n\t\t\tthis.getBoundingBox = function () {\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\n\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\treturn new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y);\n\t\t\t}\n\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tthis.x = this.attribute('x').toPixels('x');\n\t\t\t\tthis.y = this.attribute('y').toPixels('y');\n\t\t\t\tif (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x');\n\t\t\t\tif (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y');\n\t\t\t\tthis.x += this.getAnchorDelta(ctx, this, 0);\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tthis.renderChild(ctx, this, i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.getAnchorDelta = function (ctx, parent, startI) {\n\t\t\t\tvar textAnchor = this.style('text-anchor').valueOrDefault('start');\n\t\t\t\tif (textAnchor != 'start') {\n\t\t\t\t\tvar width = 0;\n\t\t\t\t\tfor (var i=startI; i<parent.children.length; i++) {\n\t\t\t\t\t\tvar child = parent.children[i];\n\t\t\t\t\t\tif (i > startI && child.attribute('x').hasValue()) break; // new group\n\t\t\t\t\t\twidth += child.measureTextRecursive(ctx);\n\t\t\t\t\t}\n\t\t\t\t\treturn -1 * (textAnchor == 'end' ? width : width / 2.0);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tthis.renderChild = function(ctx, parent, i) {\n\t\t\t\tvar child = parent.children[i];\n\t\t\t\tif (child.attribute('x').hasValue()) {\n\t\t\t\t\tchild.x = child.attribute('x').toPixels('x') + parent.getAnchorDelta(ctx, parent, i);\n\t\t\t\t\tif (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (child.attribute('dx').hasValue()) parent.x += child.attribute('dx').toPixels('x');\n\t\t\t\t\tchild.x = parent.x;\n\t\t\t\t}\n\t\t\t\tparent.x = child.x + child.measureText(ctx);\n\n\t\t\t\tif (child.attribute('y').hasValue()) {\n\t\t\t\t\tchild.y = child.attribute('y').toPixels('y');\n\t\t\t\t\tif (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (child.attribute('dy').hasValue()) parent.y += child.attribute('dy').toPixels('y');\n\t\t\t\t\tchild.y = parent.y;\n\t\t\t\t}\n\t\t\t\tparent.y = child.y;\n\n\t\t\t\tchild.render(ctx);\n\n\t\t\t\tfor (var i=0; i<child.children.length; i++) {\n\t\t\t\t\tparent.renderChild(ctx, child, i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.text.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// text base\n\t\tsvg.Element.TextElementBase = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.getGlyph = function(font, text, i) {\n\t\t\t\tvar c = text[i];\n\t\t\t\tvar glyph = null;\n\t\t\t\tif (font.isArabic) {\n\t\t\t\t\tvar arabicForm = 'isolated';\n\t\t\t\t\tif ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal';\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';\n\t\t\t\t\tif (typeof(font.glyphs[c]) != 'undefined') {\n\t\t\t\t\t\tglyph = font.glyphs[c][arabicForm];\n\t\t\t\t\t\tif (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tglyph = font.glyphs[c];\n\t\t\t\t}\n\t\t\t\tif (glyph == null) glyph = font.missingGlyph;\n\t\t\t\treturn glyph;\n\t\t\t}\n\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\n\t\t\t\tif (customFont != null) {\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tvar fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);\n\t\t\t\t\tvar text = this.getText();\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\n\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\n\t\t\t\t\t\tvar scale = fontSize / customFont.fontFace.unitsPerEm;\n\t\t\t\t\t\tctx.translate(this.x, this.y);\n\t\t\t\t\t\tctx.scale(scale, -scale);\n\t\t\t\t\t\tvar lw = ctx.lineWidth;\n\t\t\t\t\t\tctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);\n\t\t\t\t\t\tglyph.render(ctx);\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);\n\t\t\t\t\t\tctx.lineWidth = lw;\n\t\t\t\t\t\tctx.scale(1/scale, -1/scale);\n\t\t\t\t\t\tctx.translate(-this.x, -this.y);\n\n\t\t\t\t\t\tthis.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;\n\t\t\t\t\t\tif (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {\n\t\t\t\t\t\t\tthis.x += dx[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\n\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\n\t\t\t}\n\n\t\t\tthis.getText = function() {\n\t\t\t\t// OVERRIDE ME\n\t\t\t}\n\n\t\t\tthis.measureTextRecursive = function(ctx) {\n\t\t\t\tvar width = this.measureText(ctx);\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\twidth += this.children[i].measureTextRecursive(ctx);\n\t\t\t\t}\n\t\t\t\treturn width;\n\t\t\t}\n\n\t\t\tthis.measureText = function(ctx) {\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\n\t\t\t\tif (customFont != null) {\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tvar measure = 0;\n\t\t\t\t\tvar text = this.getText();\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\n\t\t\t\t\t\tmeasure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\n\t\t\t\t\t\tif (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {\n\t\t\t\t\t\t\tmeasure += dx[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn measure;\n\t\t\t\t}\n\n\t\t\t\tvar textToMeasure = svg.compressSpaces(this.getText());\n\t\t\t\tif (!ctx.measureText) return textToMeasure.length * 10;\n\n\t\t\t\tctx.save();\n\t\t\t\tthis.setContext(ctx);\n\t\t\t\tvar width = ctx.measureText(textToMeasure).width;\n\t\t\t\tctx.restore();\n\t\t\t\treturn width;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// tspan\n\t\tsvg.Element.tspan = function(node) {\n\t\t\tthis.captureTextNodes = true;\n\t\t\tthis.base = svg.Element.TextElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.text = svg.compressSpaces(node.value || node.text || node.textContent || '');\n\t\t\tthis.getText = function() {\n\t\t\t\t// if this node has children, then they own the text\n\t\t\t\tif (this.children.length > 0) { return ''; }\n\t\t\t\treturn this.text;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.tspan.prototype = new svg.Element.TextElementBase;\n\n\t\t// tref\n\t\tsvg.Element.tref = function(node) {\n\t\t\tthis.base = svg.Element.TextElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.getText = function() {\n\t\t\t\tvar element = this.getHrefAttribute().getDefinition();\n\t\t\t\tif (element != null) return element.children[0].getText();\n\t\t\t}\n\t\t}\n\t\tsvg.Element.tref.prototype = new svg.Element.TextElementBase;\n\n\t\t// a element\n\t\tsvg.Element.a = function(node) {\n\t\t\tthis.base = svg.Element.TextElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.hasText = node.childNodes.length > 0;\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\n\t\t\t\tif (node.childNodes[i].nodeType != 3) this.hasText = false;\n\t\t\t}\n\n\t\t\t// this might contain text\n\t\t\tthis.text = this.hasText ? node.childNodes[0].value : '';\n\t\t\tthis.getText = function() {\n\t\t\t\treturn this.text;\n\t\t\t}\n\n\t\t\tthis.baseRenderChildren = this.renderChildren;\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tif (this.hasText) {\n\t\t\t\t\t// render as text element\n\t\t\t\t\tthis.baseRenderChildren(ctx);\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tsvg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y));\n\t\t\t\t}\n\t\t\t\telse if (this.children.length > 0) {\n\t\t\t\t\t// render as temporary group\n\t\t\t\t\tvar g = new svg.Element.g();\n\t\t\t\t\tg.children = this.children;\n\t\t\t\t\tg.parent = this;\n\t\t\t\t\tg.render(ctx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.onclick = function() {\n\t\t\t\twindow.open(this.getHrefAttribute().value);\n\t\t\t}\n\n\t\t\tthis.onmousemove = function() {\n\t\t\t\tsvg.ctx.canvas.style.cursor = 'pointer';\n\t\t\t}\n\t\t}\n\t\tsvg.Element.a.prototype = new svg.Element.TextElementBase;\n\n\t\t// image element\n\t\tsvg.Element.image = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tvar href = this.getHrefAttribute().value;\n\t\t\tif (href == '') { return; }\n\t\t\tvar isSvg = href.match(/\\.svg$/)\n\n\t\t\tsvg.Images.push(this);\n\t\t\tthis.loaded = false;\n\t\t\tif (!isSvg) {\n\t\t\t\tthis.img = document.createElement('img');\n\t\t\t\tif (svg.opts['useCORS'] == true) { this.img.crossOrigin = 'Anonymous'; }\n\t\t\t\tvar self = this;\n\t\t\t\tthis.img.onload = function() { self.loaded = true; }\n\t\t\t\tthis.img.onerror = function() { svg.log('ERROR: image \"' + href + '\" not found'); self.loaded = true; }\n\t\t\t\tthis.img.src = href;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.img = svg.ajax(href);\n\t\t\t\tthis.loaded = true;\n\t\t\t}\n\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\n\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\n\t\t\t\tif (width == 0 || height == 0) return;\n\n\t\t\t\tctx.save();\n\t\t\t\tif (isSvg) {\n\t\t\t\t\tctx.drawSvg(this.img, x, y, width, height);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tctx.translate(x, y);\n\t\t\t\t\tsvg.AspectRatio(ctx,\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\n\t\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t\t\tthis.img.width,\n\t\t\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\t\t\tthis.img.height,\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t0);\n\t\t\t\t\tctx.drawImage(this.img, 0, 0);\n\t\t\t\t}\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tthis.getBoundingBox = function() {\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.image.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// group element\n\t\tsvg.Element.g = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.getBoundingBox = function() {\n\t\t\t\tvar bb = new svg.BoundingBox();\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\n\t\t\t\t}\n\t\t\t\treturn bb;\n\t\t\t};\n\t\t}\n\t\tsvg.Element.g.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// symbol element\n\t\tsvg.Element.symbol = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t};\n\t\t}\n\t\tsvg.Element.symbol.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// style element\n\t\tsvg.Element.style = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\t// text, or spaces then CDATA\n\t\t\tvar css = ''\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\n\t\t\t  css += node.childNodes[i].data;\n\t\t\t}\n\t\t\tcss = css.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, ''); // remove comments\n\t\t\tcss = svg.compressSpaces(css); // replace whitespace\n\t\t\tvar cssDefs = css.split('}');\n\t\t\tfor (var i=0; i<cssDefs.length; i++) {\n\t\t\t\tif (svg.trim(cssDefs[i]) != '') {\n\t\t\t\t\tvar cssDef = cssDefs[i].split('{');\n\t\t\t\t\tvar cssClasses = cssDef[0].split(',');\n\t\t\t\t\tvar cssProps = cssDef[1].split(';');\n\t\t\t\t\tfor (var j=0; j<cssClasses.length; j++) {\n\t\t\t\t\t\tvar cssClass = svg.trim(cssClasses[j]);\n\t\t\t\t\t\tif (cssClass != '') {\n\t\t\t\t\t\t\tvar props = svg.Styles[cssClass] || {};\n\t\t\t\t\t\t\tfor (var k=0; k<cssProps.length; k++) {\n\t\t\t\t\t\t\t\tvar prop = cssProps[k].indexOf(':');\n\t\t\t\t\t\t\t\tvar name = cssProps[k].substr(0, prop);\n\t\t\t\t\t\t\t\tvar value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);\n\t\t\t\t\t\t\t\tif (name != null && value != null) {\n\t\t\t\t\t\t\t\t\tprops[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsvg.Styles[cssClass] = props;\n\t\t\t\t\t\t\tsvg.StylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\n\t\t\t\t\t\t\tif (cssClass == '@font-face') {\n\t\t\t\t\t\t\t\tvar fontFamily = props['font-family'].value.replace(/\"/g,'');\n\t\t\t\t\t\t\t\tvar srcs = props['src'].value.split(',');\n\t\t\t\t\t\t\t\tfor (var s=0; s<srcs.length; s++) {\n\t\t\t\t\t\t\t\t\tif (srcs[s].indexOf('format(\"svg\")') > 0) {\n\t\t\t\t\t\t\t\t\t\tvar urlStart = srcs[s].indexOf('url');\n\t\t\t\t\t\t\t\t\t\tvar urlEnd = srcs[s].indexOf(')', urlStart);\n\t\t\t\t\t\t\t\t\t\tvar url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);\n\t\t\t\t\t\t\t\t\t\tvar doc = svg.parseXml(svg.ajax(url));\n\t\t\t\t\t\t\t\t\t\tvar fonts = doc.getElementsByTagName('font');\n\t\t\t\t\t\t\t\t\t\tfor (var f=0; f<fonts.length; f++) {\n\t\t\t\t\t\t\t\t\t\t\tvar font = svg.CreateElement(fonts[f]);\n\t\t\t\t\t\t\t\t\t\t\tsvg.Definitions[fontFamily] = font;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.style.prototype = new svg.Element.ElementBase;\n\n\t\t// use element\n\t\tsvg.Element.use = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\tthis.baseSetContext(ctx);\n\t\t\t\tif (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0);\n\t\t\t\tif (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y'));\n\t\t\t}\n\n\t\t\tvar element = this.getHrefAttribute().getDefinition();\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tif (element != null) element.path(ctx);\n\t\t\t}\n\n\t\t\tthis.getBoundingBox = function() {\n\t\t\t\tif (element != null) return element.getBoundingBox();\n\t\t\t}\n\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tif (element != null) {\n\t\t\t\t\tvar tempSvg = element;\n\t\t\t\t\tif (element.type == 'symbol') {\n\t\t\t\t\t\t// render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\n\t\t\t\t\t\ttempSvg = new svg.Element.svg();\n\t\t\t\t\t\ttempSvg.type = 'svg';\n\t\t\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', element.attribute('viewBox').value);\n\t\t\t\t\t\ttempSvg.attributes['preserveAspectRatio'] = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value);\n\t\t\t\t\t\ttempSvg.attributes['overflow'] = new svg.Property('overflow', element.attribute('overflow').value);\n\t\t\t\t\t\ttempSvg.children = element.children;\n\t\t\t\t\t}\n\t\t\t\t\tif (tempSvg.type == 'svg') {\n\t\t\t\t\t\t// if symbol or svg, inherit width/height from me\n\t\t\t\t\t\tif (this.attribute('width').hasValue()) tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);\n\t\t\t\t\t\tif (this.attribute('height').hasValue()) tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);\n\t\t\t\t\t}\n\t\t\t\t\tvar oldParent = tempSvg.parent;\n\t\t\t\t\ttempSvg.parent = null;\n\t\t\t\t\ttempSvg.render(ctx);\n\t\t\t\t\ttempSvg.parent = oldParent;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.use.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// mask element\n\t\tsvg.Element.mask = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.apply = function(ctx, element) {\n\t\t\t\t// render as temp svg\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\n\n\t\t\t\tif (width == 0 && height == 0) {\n\t\t\t\t\tvar bb = new svg.BoundingBox();\n\t\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\n\t\t\t\t\t}\n\t\t\t\t\tvar x = Math.floor(bb.x1);\n\t\t\t\t\tvar y = Math.floor(bb.y1);\n\t\t\t\t\tvar width = Math.floor(bb.width());\n\t\t\t\t\tvar\theight = Math.floor(bb.height());\n\t\t\t\t}\n\n\t\t\t\t// temporarily remove mask to avoid recursion\n\t\t\t\tvar mask = element.attribute('mask').value;\n\t\t\t\telement.attribute('mask').value = '';\n\n\t\t\t\t\tvar cMask = document.createElement('canvas');\n\t\t\t\t\tcMask.width = x + width;\n\t\t\t\t\tcMask.height = y + height;\n\t\t\t\t\tvar maskCtx = cMask.getContext('2d');\n\t\t\t\t\tthis.renderChildren(maskCtx);\n\n\t\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\t\tc.width = x + width;\n\t\t\t\t\tc.height = y + height;\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\n\t\t\t\t\telement.render(tempCtx);\n\t\t\t\t\ttempCtx.globalCompositeOperation = 'destination-in';\n\t\t\t\t\ttempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\n\t\t\t\t\ttempCtx.fillRect(0, 0, x + width, y + height);\n\n\t\t\t\t\tctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\n\t\t\t\t\tctx.fillRect(0, 0, x + width, y + height);\n\n\t\t\t\t// reassign mask\n\t\t\t\telement.attribute('mask').value = mask;\n\t\t\t}\n\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t}\n\t\t}\n\t\tsvg.Element.mask.prototype = new svg.Element.ElementBase;\n\n\t\t// clip element\n\t\tsvg.Element.clipPath = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.apply = function(ctx) {\n\t\t\t\tvar oldBeginPath = CanvasRenderingContext2D.prototype.beginPath;\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = function () { };\n\n\t\t\t\tvar oldClosePath = CanvasRenderingContext2D.prototype.closePath;\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = function () { };\n\n\t\t\t\toldBeginPath.call(ctx);\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tvar child = this.children[i];\n\t\t\t\t\tif (typeof(child.path) != 'undefined') {\n\t\t\t\t\t\tvar transform = null;\n\t\t\t\t\t\tif (child.style('transform', false, true).hasValue()) {\n\t\t\t\t\t\t\ttransform = new svg.Transform(child.style('transform', false, true).value);\n\t\t\t\t\t\t\ttransform.apply(ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchild.path(ctx);\n\t\t\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\n\t\t\t\t\t\tif (transform) { transform.unapply(ctx); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toldClosePath.call(ctx);\n\t\t\t\tctx.clip();\n\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = oldBeginPath;\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\n\t\t\t}\n\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t}\n\t\t}\n\t\tsvg.Element.clipPath.prototype = new svg.Element.ElementBase;\n\n\t\t// filters\n\t\tsvg.Element.filter = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.apply = function(ctx, element) {\n\t\t\t\t// render as temp svg\n\t\t\t\tvar bb = element.getBoundingBox();\n\t\t\t\tvar x = Math.floor(bb.x1);\n\t\t\t\tvar y = Math.floor(bb.y1);\n\t\t\t\tvar width = Math.floor(bb.width());\n\t\t\t\tvar\theight = Math.floor(bb.height());\n\n\t\t\t\t// temporarily remove filter to avoid recursion\n\t\t\t\tvar filter = element.style('filter').value;\n\t\t\t\telement.style('filter').value = '';\n\n\t\t\t\tvar px = 0, py = 0;\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tvar efd = this.children[i].extraFilterDistance || 0;\n\t\t\t\t\tpx = Math.max(px, efd);\n\t\t\t\t\tpy = Math.max(py, efd);\n\t\t\t\t}\n\n\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\tc.width = width + 2*px;\n\t\t\t\tc.height = height + 2*py;\n\t\t\t\tvar tempCtx = c.getContext('2d');\n\t\t\t\ttempCtx.translate(-x + px, -y + py);\n\t\t\t\telement.render(tempCtx);\n\n\t\t\t\t// apply filters\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tif (typeof(this.children[i].apply) === 'function') {\n\t\t\t\t\t\tthis.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// render on me\n\t\t\t\tctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);\n\n\t\t\t\t// reassign filter\n\t\t\t\telement.style('filter', true).value = filter;\n\t\t\t}\n\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t}\n\t\t}\n\t\tsvg.Element.filter.prototype = new svg.Element.ElementBase;\n\n\t\tsvg.Element.feMorphology = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\n\t\t\t\t// TODO: implement\n\t\t\t}\n\t\t}\n\t\tsvg.Element.feMorphology.prototype = new svg.Element.ElementBase;\n\n\t\tsvg.Element.feComposite = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\n\t\t\t\t// TODO: implement\n\t\t\t}\n\t\t}\n\t\tsvg.Element.feComposite.prototype = new svg.Element.ElementBase;\n\n\t\tsvg.Element.feColorMatrix = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tvar matrix = svg.ToNumberArray(this.attribute('values').value);\n\t\t\tswitch (this.attribute('type').valueOrDefault('matrix')) { // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\n\t\t\t\tcase 'saturate':\n\t\t\t\t\tvar s = matrix[0];\n\t\t\t\t\tmatrix = [0.213+0.787*s,0.715-0.715*s,0.072-0.072*s,0,0,\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715+0.285*s,0.072-0.072*s,0,0,\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715-0.715*s,0.072+0.928*s,0,0,\n\t\t\t\t\t\t\t  0,0,0,1,0,\n\t\t\t\t\t\t\t  0,0,0,0,1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'hueRotate':\n\t\t\t\t\tvar a = matrix[0] * Math.PI / 180.0;\n\t\t\t\t\tvar c = function (m1,m2,m3) { return m1 + Math.cos(a)*m2 + Math.sin(a)*m3; };\n\t\t\t\t\tmatrix = [c(0.213,0.787,-0.213),c(0.715,-0.715,-0.715),c(0.072,-0.072,0.928),0,0,\n\t\t\t\t\t\t\t  c(0.213,-0.213,0.143),c(0.715,0.285,0.140),c(0.072,-0.072,-0.283),0,0,\n\t\t\t\t\t\t\t  c(0.213,-0.213,-0.787),c(0.715,-0.715,0.715),c(0.072,0.928,0.072),0,0,\n\t\t\t\t\t\t\t  0,0,0,1,0,\n\t\t\t\t\t\t\t  0,0,0,0,1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'luminanceToAlpha':\n\t\t\t\t\tmatrix = [0,0,0,0,0,\n\t\t\t\t\t\t\t  0,0,0,0,0,\n\t\t\t\t\t\t\t  0,0,0,0,0,\n\t\t\t\t\t\t\t  0.2125,0.7154,0.0721,0,0,\n\t\t\t\t\t\t\t  0,0,0,0,1];\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tfunction imGet(img, x, y, width, height, rgba) {\n\t\t\t\treturn img[y*width*4 + x*4 + rgba];\n\t\t\t}\n\n\t\t\tfunction imSet(img, x, y, width, height, rgba, val) {\n\t\t\t\timg[y*width*4 + x*4 + rgba] = val;\n\t\t\t}\n\n\t\t\tfunction m(i, v) {\n\t\t\t\tvar mi = matrix[i];\n\t\t\t\treturn mi * (mi < 0 ? v - 255 : v);\n\t\t\t}\n\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\n\t\t\t\t// assuming x==0 && y==0 for now\n\t\t\t\tvar srcData = ctx.getImageData(0, 0, width, height);\n\t\t\t\tfor (var y = 0; y < height; y++) {\n\t\t\t\t\tfor (var x = 0; x < width; x++) {\n\t\t\t\t\t\tvar r = imGet(srcData.data, x, y, width, height, 0);\n\t\t\t\t\t\tvar g = imGet(srcData.data, x, y, width, height, 1);\n\t\t\t\t\t\tvar b = imGet(srcData.data, x, y, width, height, 2);\n\t\t\t\t\t\tvar a = imGet(srcData.data, x, y, width, height, 3);\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 0, m(0,r)+m(1,g)+m(2,b)+m(3,a)+m(4,1));\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 1, m(5,r)+m(6,g)+m(7,b)+m(8,a)+m(9,1));\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 2, m(10,r)+m(11,g)+m(12,b)+m(13,a)+m(14,1));\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 3, m(15,r)+m(16,g)+m(17,b)+m(18,a)+m(19,1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tctx.clearRect(0, 0, width, height);\n\t\t\t\tctx.putImageData(srcData, 0, 0);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.feColorMatrix.prototype = new svg.Element.ElementBase;\n\n\t\tsvg.Element.feGaussianBlur = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.blurRadius = Math.floor(this.attribute('stdDeviation').numValue());\n\t\t\tthis.extraFilterDistance = this.blurRadius;\n\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\n\t\t\t\tif (typeof(stackBlur.canvasRGBA) == 'undefined') {\n\t\t\t\t\tsvg.log('ERROR: StackBlur.js must be included for blur to work');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// StackBlur requires canvas be on document\n\t\t\t\tctx.canvas.id = svg.UniqueId();\n\t\t\t\tctx.canvas.style.display = 'none';\n\t\t\t\tdocument.body.appendChild(ctx.canvas);\n\t\t\t\tstackBlur.canvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius);\n\t\t\t\tdocument.body.removeChild(ctx.canvas);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase;\n\n\t\t// title element, do nothing\n\t\tsvg.Element.title = function(node) {\n\t\t}\n\t\tsvg.Element.title.prototype = new svg.Element.ElementBase;\n\n\t\t// desc element, do nothing\n\t\tsvg.Element.desc = function(node) {\n\t\t}\n\t\tsvg.Element.desc.prototype = new svg.Element.ElementBase;\n\n\t\tsvg.Element.MISSING = function(node) {\n\t\t\tsvg.log('ERROR: Element \\'' + node.nodeName + '\\' not yet implemented.');\n\t\t}\n\t\tsvg.Element.MISSING.prototype = new svg.Element.ElementBase;\n\n\t\t// element factory\n\t\tsvg.CreateElement = function(node) {\n\t\t\tvar className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace\n\t\t\tclassName = className.replace(/\\-/g,''); // remove dashes\n\t\t\tvar e = null;\n\t\t\tif (typeof(svg.Element[className]) != 'undefined') {\n\t\t\t\te = new svg.Element[className](node);\n\t\t\t}\n\t\t\telse {\n\t\t\t\te = new svg.Element.MISSING(node);\n\t\t\t}\n\n\t\t\te.type = node.nodeName;\n\t\t\treturn e;\n\t\t}\n\n\t\t// load from url\n\t\tsvg.load = function(ctx, url) {\n\t\t\tsvg.loadXml(ctx, svg.ajax(url));\n\t\t}\n\n\t\t// load from xml\n\t\tsvg.loadXml = function(ctx, xml) {\n\t\t\tsvg.loadXmlDoc(ctx, svg.parseXml(xml));\n\t\t}\n\n\t\tsvg.loadXmlDoc = function(ctx, dom) {\n\t\t\tsvg.init(ctx);\n\n\t\t\tvar mapXY = function(p) {\n\t\t\t\tvar e = ctx.canvas;\n\t\t\t\twhile (e) {\n\t\t\t\t\tp.x -= e.offsetLeft;\n\t\t\t\t\tp.y -= e.offsetTop;\n\t\t\t\t\te = e.offsetParent;\n\t\t\t\t}\n\t\t\t\tif (window.scrollX) p.x += window.scrollX;\n\t\t\t\tif (window.scrollY) p.y += window.scrollY;\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\t// bind mouse\n\t\t\tif (svg.opts['ignoreMouse'] != true) {\n\t\t\t\tctx.canvas.onclick = function(e) {\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\n\t\t\t\t\tsvg.Mouse.onclick(p.x, p.y);\n\t\t\t\t};\n\t\t\t\tctx.canvas.onmousemove = function(e) {\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\n\t\t\t\t\tsvg.Mouse.onmousemove(p.x, p.y);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar e = svg.CreateElement(dom.documentElement);\n\t\t\te.root = true;\n\t\t\te.addStylesFromStyleDefinition();\n\n\t\t\t// render loop\n\t\t\tvar isFirstRender = true;\n\t\t\tvar draw = function() {\n\t\t\t\tsvg.ViewPort.Clear();\n\t\t\t\tif (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);\n\n\t\t\t\tif (svg.opts['ignoreDimensions'] != true) {\n\t\t\t\t\t// set canvas size\n\t\t\t\t\tif (e.style('width').hasValue()) {\n\t\t\t\t\t\tctx.canvas.width = e.style('width').toPixels('x');\n\t\t\t\t\t\tctx.canvas.style.width = ctx.canvas.width + 'px';\n\t\t\t\t\t}\n\t\t\t\t\tif (e.style('height').hasValue()) {\n\t\t\t\t\t\tctx.canvas.height = e.style('height').toPixels('y');\n\t\t\t\t\t\tctx.canvas.style.height = ctx.canvas.height + 'px';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar cWidth = ctx.canvas.clientWidth || ctx.canvas.width;\n\t\t\t\tvar cHeight = ctx.canvas.clientHeight || ctx.canvas.height;\n\t\t\t\tif (svg.opts['ignoreDimensions'] == true && e.style('width').hasValue() && e.style('height').hasValue()) {\n\t\t\t\t\tcWidth = e.style('width').toPixels('x');\n\t\t\t\t\tcHeight = e.style('height').toPixels('y');\n\t\t\t\t}\n\t\t\t\tsvg.ViewPort.SetCurrent(cWidth, cHeight);\n\n\t\t\t\tif (svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];\n\t\t\t\tif (svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];\n\t\t\t\tif (svg.opts['scaleWidth'] != null || svg.opts['scaleHeight'] != null) {\n\t\t\t\t\tvar xRatio = null, yRatio = null, viewBox = svg.ToNumberArray(e.attribute('viewBox').value);\n\n\t\t\t\t\tif (svg.opts['scaleWidth'] != null) {\n\t\t\t\t\t\tif (e.attribute('width').hasValue()) xRatio = e.attribute('width').toPixels('x') / svg.opts['scaleWidth'];\n\t\t\t\t\t\telse if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts['scaleWidth'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (svg.opts['scaleHeight'] != null) {\n\t\t\t\t\t\tif (e.attribute('height').hasValue()) yRatio = e.attribute('height').toPixels('y') / svg.opts['scaleHeight'];\n\t\t\t\t\t\telse if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts['scaleHeight'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (xRatio == null) { xRatio = yRatio; }\n\t\t\t\t\tif (yRatio == null) { yRatio = xRatio; }\n\n\t\t\t\t\te.attribute('width', true).value = svg.opts['scaleWidth'];\n\t\t\t\t\te.attribute('height', true).value = svg.opts['scaleHeight'];\n\t\t\t\t\te.style('transform', true, true).value += ' scale('+(1.0/xRatio)+','+(1.0/yRatio)+')';\n\t\t\t\t}\n\n\t\t\t\t// clear and render\n\t\t\t\tif (svg.opts['ignoreClear'] != true) {\n\t\t\t\t\tctx.clearRect(0, 0, cWidth, cHeight);\n\t\t\t\t}\n\t\t\t\te.render(ctx);\n\t\t\t\tif (isFirstRender) {\n\t\t\t\t\tisFirstRender = false;\n\t\t\t\t\tif (typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback'](dom);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar waitingForImages = true;\n\t\t\tif (svg.ImagesLoaded()) {\n\t\t\t\twaitingForImages = false;\n\t\t\t\tdraw();\n\t\t\t}\n\t\t\tsvg.intervalID = setInterval(function() {\n\t\t\t\tvar needUpdate = false;\n\n\t\t\t\tif (waitingForImages && svg.ImagesLoaded()) {\n\t\t\t\t\twaitingForImages = false;\n\t\t\t\t\tneedUpdate = true;\n\t\t\t\t}\n\n\t\t\t\t// need update from mouse events?\n\t\t\t\tif (svg.opts['ignoreMouse'] != true) {\n\t\t\t\t\tneedUpdate = needUpdate | svg.Mouse.hasEvents();\n\t\t\t\t}\n\n\t\t\t\t// need update from animations?\n\t\t\t\tif (svg.opts['ignoreAnimation'] != true) {\n\t\t\t\t\tfor (var i=0; i<svg.Animations.length; i++) {\n\t\t\t\t\t\tneedUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// need update from redraw?\n\t\t\t\tif (typeof(svg.opts['forceRedraw']) == 'function') {\n\t\t\t\t\tif (svg.opts['forceRedraw']() == true) needUpdate = true;\n\t\t\t\t}\n\n\t\t\t\t// render if needed\n\t\t\t\tif (needUpdate) {\n\t\t\t\t\tdraw();\n\t\t\t\t\tsvg.Mouse.runEvents(); // run and clear our events\n\t\t\t\t}\n\t\t\t}, 1000 / svg.FRAMERATE);\n\t\t}\n\n\t\tsvg.stop = function() {\n\t\t\tif (svg.intervalID) {\n\t\t\t\tclearInterval(svg.intervalID);\n\t\t\t}\n\t\t}\n\n\t\tsvg.Mouse = new (function() {\n\t\t\tthis.events = [];\n\t\t\tthis.hasEvents = function() { return this.events.length != 0; }\n\n\t\t\tthis.onclick = function(x, y) {\n\t\t\t\tthis.events.push({ type: 'onclick', x: x, y: y,\n\t\t\t\t\trun: function(e) { if (e.onclick) e.onclick(); }\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.onmousemove = function(x, y) {\n\t\t\t\tthis.events.push({ type: 'onmousemove', x: x, y: y,\n\t\t\t\t\trun: function(e) { if (e.onmousemove) e.onmousemove(); }\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.eventElements = [];\n\n\t\t\tthis.checkPath = function(element, ctx) {\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\n\t\t\t\t\tvar e = this.events[i];\n\t\t\t\t\tif (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.checkBoundingBox = function(element, bb) {\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\n\t\t\t\t\tvar e = this.events[i];\n\t\t\t\t\tif (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.runEvents = function() {\n\t\t\t\tsvg.ctx.canvas.style.cursor = '';\n\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\n\t\t\t\t\tvar e = this.events[i];\n\t\t\t\t\tvar element = this.eventElements[i];\n\t\t\t\t\twhile (element) {\n\t\t\t\t\t\te.run(element);\n\t\t\t\t\t\telement = element.parent;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// done running, clear\n\t\t\t\tthis.events = [];\n\t\t\t\tthis.eventElements = [];\n\t\t\t}\n\t\t});\n\n\t\treturn svg;\n\t};\n\n\tif (typeof(CanvasRenderingContext2D) != 'undefined') {\n\t\tCanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {\n\t\t\tcanvg(this.canvas, s, {\n\t\t\t\tignoreMouse: true,\n\t\t\t\tignoreAnimation: true,\n\t\t\t\tignoreDimensions: true,\n\t\t\t\tignoreClear: true,\n\t\t\t\toffsetX: dx,\n\t\t\t\toffsetY: dy,\n\t\t\t\tscaleWidth: dw,\n\t\t\t\tscaleHeight: dh\n\t\t\t});\n\t\t}\n\t}\n\n\treturn canvg;\n\n}));\n"
  },
  {
    "path": "assets/highcharts/lib/jspdf.js",
    "content": "/*\n\n jsPDF - PDF Document creation from JavaScript\n Version ${versionID}\n                           CommitID ${commitID}\n\n Copyright (c) 2010-2014 James Hall <james@parall.ax>, https://github.com/MrRio/jsPDF\n               2010 Aaron Spike, https://github.com/acspike\n               2012 Willow Systems Corporation, willow-systems.com\n               2012 Pablo Hess, https://github.com/pablohess\n               2012 Florian Jenett, https://github.com/fjenett\n               2013 Warren Weckesser, https://github.com/warrenweckesser\n               2013 Youssef Beddad, https://github.com/lifof\n               2013 Lee Driscoll, https://github.com/lsdriscoll\n               2013 Stefan Slonevskiy, https://github.com/stefslon\n               2013 Jeremy Morel, https://github.com/jmorel\n               2013 Christoph Hartmann, https://github.com/chris-rock\n               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria\n               2014 James Makes, https://github.com/dollaruw\n               2014 Diego Casorran, https://github.com/diegocr\n               2014 Steven Spungin, https://github.com/Flamenco\n               2014 Kenneth Glassey, https://github.com/Gavvers\n\n Permission is hereby granted, free of charge, to any person obtaining\n a copy of this software and associated documentation files (the\n \"Software\"), to deal in the Software without restriction, including\n without limitation the rights to use, copy, modify, merge, publish,\n distribute, sublicense, and/or sell copies of the Software, and to\n permit persons to whom the Software is furnished to do so, subject to\n the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n Contributor(s):\n    siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango,\n    kim3er, mfo, alnorth, Flamenco\n*/\nvar jsPDF=function(t){function Pa(q){var A={};this.subscribe=function(F,q,w){if(\"function\"!==typeof q)return!1;A.hasOwnProperty(F)||(A[F]={});var t=Math.random().toString(35);A[F][t]=[q,!!w];return t};this.unsubscribe=function(q){for(var t in A)if(A[t][q])return delete A[t][q],!0;return!1};this.publish=function(F){if(A.hasOwnProperty(F)){var Z=Array.prototype.slice.call(arguments,1),w=[],S;for(S in A[F]){var aa=A[F][S];try{aa[0].apply(q,Z)}catch(ca){t.console&&console.error(\"jsPDF PubSub Error\",ca.message,\nca)}aa[1]&&w.push(S)}w.length&&w.forEach(this.unsubscribe)}}}function q(V,A,F,Z){var w={};\"object\"===typeof V&&(w=V,V=w.orientation,A=w.unit||A,F=w.format||F,Z=w.compress||w.compressPdf||Z);A=A||\"mm\";F=F||\"a4\";V=(\"\"+(V||\"P\")).toLowerCase();(\"\"+F).toLowerCase();var S=!!Z&&\"function\"===typeof Uint8Array,aa=w.textColor||\"0 g\",ca=w.drawColor||\"0 G\",L=w.fontSize||16,oa=w.lineHeight||1.15,Qa=w.lineWidth||.200025,C=2,da=!1,N=[],r={},G={},D,Fa=[],u={},pa={},H={},qa={},Ga=null,E,z=0,I,m=[],J=[],B=[],ra=[],\nW=[],sa=0,ta=0,P=0,M={},ea={},fa=[],ga,ha,ia,X,Q,ua,O,ja,T={title:\"\",subject:\"\",author:\"\",keywords:\"\",creator:\"\"},f={},v=new Pa(f),h=function(a){return a.toFixed(2)},k=function(a){return a.toFixed(3)},U=function(a){return(\"0\"+parseInt(a)).slice(-2)},va=function(a){a=\"00\"+a;return a.substr(a.length-2)},c=function(a){da?m[I].push(a):(P+=a.length+1,ra.push(a))},K=function(){C++;N[C]=P;c(C+\" 0 obj\");return C},ba=function(a){c(\"stream\");c(a);c(\"endstream\")},Ha=function(){c(\"/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]\");\nc(\"/Font <<\");for(var a in r)r.hasOwnProperty(a)&&c(\"/\"+a+\" \"+r[a].objectNumber+\" 0 R\");c(\">>\");c(\"/Shading <<\");for(var b in u)u.hasOwnProperty(b)&&u[b]instanceof f.ShadingPattern&&0<=u[b].objectNumber&&c(\"/\"+b+\" \"+u[b].objectNumber+\" 0 R\");v.publish(\"putShadingPatternDict\");c(\">>\");c(\"/Pattern <<\");for(var g in u)u.hasOwnProperty(g)&&u[g]instanceof f.TilingPattern&&0<=u[g].objectNumber&&c(\"/\"+g+\" \"+u[g].objectNumber+\" 0 R\");v.publish(\"putTilingPatternDict\");c(\">>\");c(\"/ExtGState <<\");for(var d in H)H.hasOwnProperty(d)&&\n0<=H[d].objectNumber&&c(\"/\"+d+\" \"+H[d].objectNumber+\" 0 R\");v.publish(\"putGStateDict\");c(\">>\");c(\"/XObject <<\");for(var e in M)M.hasOwnProperty(e)&&0<=M[e].objectNumber&&c(\"/\"+e+\" \"+M[e].objectNumber+\" 0 R\");v.publish(\"putXobjectDict\");c(\">>\")},Ia=function(a,b,g,c){var e=\"F\"+(Object.keys(r).length+1).toString(10);a=r[e]={id:e,PostScriptName:a,fontName:b,fontStyle:g,encoding:c,metadata:{}};G.hasOwnProperty(b)||(G[b]={});G[b][g]=e;v.publish(\"addFont\",a);return e},wa=function(a,b){return new R(a.a*b.a+\na.b*b.c,a.a*b.b+a.b*b.d,a.c*b.a+a.d*b.c,a.c*b.b+a.d*b.d,a.e*b.a+a.f*b.c+b.e,a.e*b.b+a.f*b.d+b.f)},R=function(a,b,g,c,e,l){this.a=a;this.b=b;this.c=g;this.d=c;this.e=e;this.f=l};R.prototype={toString:function(){return[k(this.a),k(this.b),k(this.c),k(this.d),k(this.e),k(this.f)].join(\" \")}};var ka=new R(1,0,0,1,0,0),la=function(){this.page=z;this.currentPage=I;this.pages=m.slice(0);this.pagedim=B.slice(0);this.pagesContext=J.slice(0);this.x=ga;this.y=ha;this.matrix=ia;this.width=X;this.height=Q;this.id=\n\"\";this.objectNumber=-1};la.prototype={restore:function(){z=this.page;I=this.currentPage;J=this.pagesContext;B=this.pagedim;m=this.pages;ga=this.x;ha=this.y;ia=this.matrix;X=this.width;Q=this.height}};var xa=function(a,b){if(!pa[a]){var g=(b instanceof f.ShadingPattern?\"Sh\":\"P\")+(Object.keys(u).length+1).toString(10);b.id=g;pa[a]=g;u[g]=b;v.publish(\"addPattern\",b)}},Ja=function(a,b){if(!a||!qa[a]){var g=!1,c;for(c in H)if(H.hasOwnProperty(c)&&H[c].equals(b)){g=!0;break}g?b=H[c]:(g=\"GS\"+(Object.keys(H).length+\n1).toString(10),H[g]=b,b.id=g);a&&(qa[a]=b.id);v.publish(\"addGState\",b);return b}},ya=function(a,b){var g,c,e,l,f,h;b=b||{};g=b.sourceEncoding||\"Unicode\";e=b.outputEncoding;if((b.autoencode||e)&&r[D].metadata&&r[D].metadata[g]&&r[D].metadata[g].encoding&&(g=r[D].metadata[g].encoding,!e&&r[D].encoding&&(e=r[D].encoding),!e&&g.codePages&&(e=g.codePages[0]),\"string\"===typeof e&&(e=g[e]),e)){f=!1;l=[];g=0;for(c=a.length;g<c;g++)(h=e[a.charCodeAt(g)])?l.push(String.fromCharCode(h)):l.push(a[g]),l[g].charCodeAt(0)>>\n8&&(f=!0);a=l.join(\"\")}for(g=a.length;void 0===f&&0!==g;)a.charCodeAt(g-1)>>8&&(f=!0),g--;if(f){l=b.noBOM?[]:[254,255];g=0;for(c=a.length;g<c;g++){h=a.charCodeAt(g);f=h>>8;if(f>>8)throw Error(\"Character at position \"+g+\" of string '\"+a+\"' exceeds 16bits. Cannot be encoded into UCS-2 BE\");l.push(f);l.push(h-(f<<8))}a=String.fromCharCode.apply(void 0,l)}return a.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\(/g,\"\\\\(\").replace(/\\)/g,\"\\\\)\")},Aa=function(a,b){\"string\"===typeof b&&b.toLowerCase();if(\"string\"===typeof a){var c=\na.toLowerCase();za.hasOwnProperty(c)&&(a=za[c][0]/E,b=za[c][1]/E)}Array.isArray(a)&&(b=a[1],a=a[0]);da=!0;m[++z]=[];B[z]={width:Number(a)||X,height:Number(b)||Q};J[z]={};Ka(z)},La=function(){Aa.apply(this,arguments);c(h(Qa)+\" w\");c(ca);0!==sa&&c(sa+\" J\");0!==ta&&c(ta+\" j\");v.publish(\"addPage\",{pageNumber:z})},Ra=function(a){0<a&&a<=z&&(m.splice(a,1),B.splice(a,1),z--,I>z&&(I=z),this.setPage(I))},Ka=function(a){0<a&&a<=z&&(I=a,X=B[a].width,Q=B[a].height)},Ba=function(a,b){var c;a=void 0!==a?a:r[D].fontName;\nb=void 0!==b?b:r[D].fontStyle;void 0!==a&&(a=a.toLowerCase());switch(a){case \"sans-serif\":case \"verdana\":case \"arial\":case \"helvetica\":a=\"helvetica\";break;case \"fixed\":case \"monospace\":case \"terminal\":case \"courier\":a=\"courier\";break;default:a=\"times\"}try{c=G[a][b]}catch(d){}c||(c=G.times[b],null==c&&(c=G.times.normal));return c},Da=function(){da=!1;C=2;ra=[];N=[];W=[];c(\"%PDF-1.3\");var a,b,g,d,e;e=t.adler32cs||q.adler32cs;S&&\"undefined\"===typeof e&&(S=!1);for(a=1;a<=z;a++){K();g=(X=B[a].width)*E;\nb=(Q=B[a].height)*E;c(\"<</Type /Page\");c(\"/Parent 1 0 R\");c(\"/Resources 2 0 R\");c(\"/MediaBox [0 0 \"+h(g)+\" \"+h(b)+\"]\");v.publish(\"putPage\",{pageNumber:a,page:m[a]});c(\"/Contents \"+(C+1)+\" 0 R\");c(\">>\");c(\"endobj\");b=m[a].join(\"\\n\");b=(new R(E,0,0,-E,0,Q)).toString()+\" cm\\n\"+b;K();if(S){g=[];for(d=b.length;d--;)g[d]=b.charCodeAt(d);d=e.from(b);b=new Deflater(6);b.append(new Uint8Array(g));b=b.flush();g=new Uint8Array(b.length+6);g.set(new Uint8Array([120,156]));g.set(b,2);g.set(new Uint8Array([d&255,\nd>>8&255,d>>16&255,d>>24&255]),b.length+2);b=String.fromCharCode.apply(null,g);c(\"<</Length \"+b.length+\" /Filter [/FlateDecode]>>\")}else c(\"<</Length \"+b.length+\">>\");ba(b);c(\"endobj\")}N[1]=P;c(\"1 0 obj\");c(\"<</Type /Pages\");a=\"/Kids [\";for(d=0;d<z;d++)a+=3+2*d+\" 0 R \";c(a+\"]\");c(\"/Count \"+z);c(\">>\");c(\"endobj\");v.publish(\"postPutPages\");v.publish(\"putAdditionalObjects\");for(a=0;a<W.length;a++)e=W[a],N[e.objId]=P,c(e.objId+\" 0 obj\"),c(e.content),c(\"endobj\");C+=W.length;v.publish(\"postPutAdditionalObjects\");\nfor(var l in r)r.hasOwnProperty(l)&&(a=r[l],a.objectNumber=K(),c(\"<</BaseFont/\"+a.PostScriptName+\"/Type/Font\"),\"string\"===typeof a.encoding&&c(\"/Encoding/\"+a.encoding),c(\"/Subtype/Type1>>\"),c(\"endobj\"));for(var y in H)if(H.hasOwnProperty(y)){l=H[y];l.objectNumber=K();c(\"<<\");a=void 0;for(a in l)switch(a){case \"opacity\":c(\"/ca \"+h(l[a]))}c(\">>\");c(\"endobj\")}for(var p in M)M.hasOwnProperty(p)&&(y=M[p],y.objectNumber=K(),c(\"<<\"),c(\"/Type /XObject\"),c(\"/Subtype /Form\"),c(\"/BBox [\"+[h(y.x),h(y.y),h(y.x+\ny.width),h(y.y+y.height)].join(\" \")+\"]\"),c(\"/Matrix [\"+y.matrix.toString()+\"]\"),y=y.pages[1].join(\"\\n\"),c(\"/Length \"+y.length),c(\">>\"),ba(y),c(\"endobj\"));for(var n in u)if(u.hasOwnProperty(n))if(u[n]instanceof f.ShadingPattern){p=u[n];y=K();l=p.colors;a=[];for(d=0;1>d;d+=.05)a.push(d);a.push(1);0!=l[0].offset&&l.unshift({offset:0,color:l[0].color});1!=l[l.length-1].offset&&l.push({offset:1,color:l[l.length-1].color});e=\"\";for(b=g=0;b<a.length;b++){for(d=a[b];d>l[g+1].offset;)g++;var Y=l[g].offset;\nd=(d-Y)/(l[g+1].offset-Y);var Y=l[g].color,Ca=l[g+1].color;e+=va(Math.round((1-d)*Y[0]+d*Ca[0]).toString(16))+va(Math.round((1-d)*Y[1]+d*Ca[1]).toString(16))+va(Math.round((1-d)*Y[2]+d*Ca[2]).toString(16))}l=e.trim();c(\"<< /FunctionType 0\");c(\"/Domain [0.0 1.0]\");c(\"/Size [21]\");c(\"/BitsPerSample 8\");c(\"/Range [0.0 1.0 0.0 1.0 0.0 1.0]\");c(\"/Decode [0.0 1.0 0.0 1.0 0.0 1.0]\");c(\"/Length \"+l.length);c(\"/Filter /ASCIIHexDecode\");c(\">>\");ba(l);c(\"endobj\");p.objectNumber=K();c(\"<< /ShadingType \"+p.type);\nc(\"/ColorSpace /DeviceRGB\");l=\"/Coords [\"+k(parseFloat(p.coords[0]))+\" \"+k(parseFloat(p.coords[1]))+\" \";l=2===p.type?l+(k(parseFloat(p.coords[2]))+\" \"+k(parseFloat(p.coords[3]))):l+(k(parseFloat(p.coords[2]))+\" \"+k(parseFloat(p.coords[3]))+\" \"+k(parseFloat(p.coords[4]))+\" \"+k(parseFloat(p.coords[5])));c(l+\"]\");p.matrix&&c(\"/Matrix [\"+p.matrix.toString()+\"]\");c(\"/Function \"+y+\" 0 R\");c(\"/Extend [true true]\");c(\">>\");c(\"endobj\")}else u[n]instanceof f.TilingPattern&&(p=u[n],y=K(),c(\"<<\"),Ha(),c(\">>\"),\nc(\"endobj\"),p.objectNumber=K(),c(\"<< /Type /Pattern\"),c(\"/PatternType 1\"),c(\"/PaintType 1\"),c(\"/TilingType 1\"),c(\"/BBox [\"+p.boundingBox.map(k).join(\" \")+\"]\"),c(\"/XStep \"+k(p.xStep)),c(\"/YStep \"+k(p.yStep)),c(\"/Length \"+p.stream.length),c(\"/Resources \"+y+\" 0 R\"),p.matrix&&c(\"/Matrix [\"+p.matrix.toString()+\"]\"),c(\">>\"),ba(p.stream),c(\"endobj\"));v.publish(\"putResources\");N[2]=P;c(\"2 0 obj\");c(\"<<\");Ha();c(\">>\");c(\"endobj\");v.publish(\"postPutResources\");K();c(\"<<\");c(\"/Producer (jsPDF \"+q.version+\")\");\nfor(var x in T)T.hasOwnProperty(x)&&T[x]&&c(\"/\"+x.substr(0,1).toUpperCase()+x.substr(1)+\" (\"+ya(T[x])+\")\");n=new Date;x=n.getTimezoneOffset();p=Math.abs(x%60);x=[0>x?\"+\":\"-\",U(Math.floor(Math.abs(x/60))),\"'\",U(p),\"'\"].join(\"\");c([\"/CreationDate (D:\",n.getFullYear(),U(n.getMonth()+1),U(n.getDate()),U(n.getHours()),U(n.getMinutes()),U(n.getSeconds()),x,\")\"].join(\"\"));c(\">>\");c(\"endobj\");K();c(\"<<\");c(\"/Type /Catalog\");c(\"/Pages 1 0 R\");O||(O=\"fullwidth\");switch(O){case \"fullwidth\":c(\"/OpenAction [3 0 R /FitH null]\");\nbreak;case \"fullheight\":c(\"/OpenAction [3 0 R /FitV null]\");break;case \"fullpage\":c(\"/OpenAction [3 0 R /Fit]\");break;case \"original\":c(\"/OpenAction [3 0 R /XYZ null null 1]\");break;default:n=\"\"+O,\"%\"===n.substr(n.length-1)&&(O=parseInt(O)/100),\"number\"===typeof O&&c(\"/OpenAction [3 0 R /XYZ null null \"+h(O)+\"]\")}ja||(ja=\"continuous\");switch(ja){case \"continuous\":c(\"/PageLayout /OneColumn\");break;case \"single\":c(\"/PageLayout /SinglePage\");break;case \"two\":case \"twoleft\":c(\"/PageLayout /TwoColumnLeft\");\nbreak;case \"tworight\":c(\"/PageLayout /TwoColumnRight\")}ua&&c(\"/PageMode /\"+ua);v.publish(\"putCatalog\");c(\">>\");c(\"endobj\");n=P;c(\"xref\");c(\"0 \"+(C+1));c(\"0000000000 65535 f \");for(x=1;x<=C;x++)\"function\"===typeof N[x]?c((\"0000000000\"+N[x]()).slice(-10)+\" 00000 n \"):c((\"0000000000\"+N[x]).slice(-10)+\" 00000 n \");c(\"trailer\");c(\"<<\");c(\"/Size \"+(C+1));c(\"/Root \"+C+\" 0 R\");c(\"/Info \"+(C-1)+\" 0 R\");c(\">>\");c(\"startxref\");c(n);c(\"%%EOF\");da=!0;return ra.join(\"\\n\")},Ma=function(a){var b=\"n\";if(\"D\"===a)b=\n\"S\";else if(\"F\"===a)b=\"f\";else if(\"FD\"===a||\"DF\"===a)b=\"B\";else if(\"f\"===a||\"f*\"===a||\"B\"===a||\"B*\"===a)b=a;return b},ma=function(a,b,g){a=Ma(a);if(b){g||(g=ka);var d=pa[b],e=u[d];if(e instanceof f.ShadingPattern)c(\"q\"),c(\"W \"+a),e.gState&&f.setGState(e.gState),c(g.toString()+\" cm\"),c(\"/\"+d+\" sh\"),c(\"Q\");else if(e instanceof f.TilingPattern){var l=new R(1,0,0,-1,0,Q);g.matrix&&(l=wa(g.matrix||ka,l),d=e.createClone(b,g.boundingBox,g.xStep,g.yStep,l).id);c(\"q\");c(\"/Pattern cs\");c(\"/\"+d+\" scn\");e.gState&&\nf.setGState(e.gState);c(a);c(\"Q\")}}else c(a)},Na=function(){for(var a=Da(),b=a.length,c=new ArrayBuffer(b),d=new Uint8Array(c);b--;)d[b]=a.charCodeAt(b);return c},Ea=function(){return new Blob([Na()],{type:\"application/pdf\"})},Oa=function(a){a.foo=function(){try{return a.apply(this,arguments)}catch(c){var b=c.stack||\"\";~b.indexOf(\" at \")&&(b=b.split(\" at \")[1]);b=\"Error in function \"+b.split(\"\\n\")[0].split(\"<\")[0]+\": \"+c.message;if(t.console)t.console.error(b,c),t.alert&&alert(b);else throw Error(b);\n}};a.foo.bar=a;return a.foo}(function(a,b){var c=\"dataur\"===(\"\"+a).substr(0,6)?\"data:application/pdf;base64,\"+btoa(Da()):0;switch(a){case void 0:return Da();case \"save\":if(navigator.getUserMedia&&(void 0===t.URL||void 0===t.URL.createObjectURL))return f.output(\"dataurlnewwindow\");saveAs(Ea(),b);\"function\"===typeof saveAs.unload&&t.setTimeout&&setTimeout(saveAs.unload,911);break;case \"arraybuffer\":return Na();case \"blob\":return Ea();case \"bloburi\":case \"bloburl\":return t.URL&&t.URL.createObjectURL(Ea())||\nvoid 0;case \"datauristring\":case \"dataurlstring\":return c;case \"dataurlnewwindow\":if((a=t.open(c))||\"undefined\"===typeof safari)return a;case \"datauri\":case \"dataurl\":return t.document.location.href=c;default:throw Error('Output type \"'+a+'\" is not supported.');}});switch(A){case \"pt\":E=1;break;case \"mm\":E=72/25.4000508;break;case \"cm\":E=72/2.54000508;break;case \"in\":E=72;break;case \"px\":E=96/72;break;case \"pc\":E=12;break;case \"em\":E=12;break;case \"ex\":E=6;break;default:throw\"Invalid unit: \"+A;}f.internal=\n{pdfEscape:ya,getStyle:Ma,getFont:function(){return r[Ba.apply(f,arguments)]},getFontSize:function(){return L},getLineHeight:function(){return L*oa},write:function(a){c(1===arguments.length?a:Array.prototype.join.call(arguments,\" \"))},getCoordinateString:function(a){return h(a)},getVerticalCoordinateString:function(a){return h(a)},collections:{},newObject:K,newAdditionalObject:function(){var a=2*m.length+1,a=a+W.length,a={objId:a,content:\"\"};W.push(a);return a},newObjectDeferred:function(){C++;N[C]=\nfunction(){return P};return C},newObjectDeferredBegin:function(a){N[a]=P},putStream:ba,events:v,scaleFactor:E,pageSize:{get width(){return X},get height(){return Q}},output:function(a,b){return Oa(a,b)},getNumberOfPages:function(){return m.length-1},pages:m,out:c,f2:h,getPageInfo:function(a){return{objId:2*(a-1)+3,pageNumber:a,pageContext:J[a]}},getCurrentPageInfo:function(){return{objId:2*(I-1)+3,pageNumber:I,pageContext:J[I]}},getPDFVersion:function(){return\"1.3\"}};f.GState=function(a){for(var b in a)a.hasOwnProperty(b)&&\n0<=\"opacity\".indexOf(b)&&(this[b]=a[b]);this.id=\"\";this.objectNumber=-1;this.equals=function(a){if(!a||typeof a!==typeof this)return!1;var b=0,c;for(c in this)if(!(0<=\"id,objectNumber,equals\".indexOf(c))){if(this.hasOwnProperty(c)&&!a.hasOwnProperty(c)||this[c]!==a[c])return!1;b++}for(c in a)a.hasOwnProperty(c)&&0>\"id,objectNumber,equals\".indexOf(c)&&b--;return 0===b}};f.addGState=function(a,b){Ja(a,b);return this};f.addPage=function(){La.apply(this,arguments);return this};f.setPage=function(){Ka.apply(this,\narguments);return this};f.insertPage=function(a){this.addPage();this.movePage(I,a);return this};f.movePage=function(a,b){var c,d,e;if(a>b){e=m[a];d=B[a];for(c=J[a];a>b;a--)m[a]=m[a-1],B[a]=B[a-1],J[a]=J[a-1];m[b]=e;B[b]=d;J[b]=c;this.setPage(b)}else if(a<b){e=m[a];d=B[a];for(c=J[a];a<b;a++)m[a]=m[a+1],B[a]=B[a+1],J[a]=J[a+1];m[b]=e;B[b]=d;J[b]=c;this.setPage(b)}return this};f.deletePage=function(){Ra.apply(this,arguments);return this};f.setDisplayMode=function(a,b,c){O=a;ja=b;ua=c;return this};f.saveGraphicsState=\nfunction(){c(\"q\");Fa.push({key:D,size:L});return this};f.restoreGraphicsState=function(){c(\"Q\");var a=Fa.pop();D=a.key;L=a.size;return this};f.setCurrentTransformationMatrix=function(a){c(a.toString()+\" cm\");return this};f.beginFormObject=function(a,b,c,d,e){fa.push(new la);z=I=0;m=[];ga=a;ha=b;ia=e;Aa(c,d);return this};f.endFormObject=function(a){if(!ea[a]){var b=new la,c=\"Xo\"+(Object.keys(M).length+1).toString(10);b.id=c;ea[a]=c;M[c]=b;v.publish(\"addFormObject\",b);fa.pop().restore()}return this};\nf.doFormObject=function(a,b){a=M[ea[a]];c(\"q\");c(b.toString()+\" cm\");c(\"/\"+a.id+\" Do\");c(\"Q\");return this};f.getFormObject=function(a){a=M[ea[a]];return{x:a.x,y:a.y,width:a.width,height:a.height,matrix:a.matrix}};f.Matrix=R;f.matrixMult=wa;f.unitMatrix=ka;f.ShadingPattern=function(a,b,c,d,e){this.type=\"axial\"===a?2:3;this.coords=b;this.colors=c;this.gState=d;this.matrix=e;this.id=\"\";this.objectNumber=-1};f.TilingPattern=function(a,b,c,d,e){this.boundingBox=a;this.xStep=b;this.yStep=c;this.stream=\n\"\";this.cloneIndex=0;this.gState=d;this.matrix=e;this.id=\"\";this.objectNumber=-1};f.TilingPattern.prototype={createClone:function(a,b,c,d,e){b=new f.TilingPattern(b||this.boundingBox,c||this.xStep,d||this.yStep,this.gState,e||this.matrix);b.stream=this.stream;a=a+\"$$\"+this.cloneIndex++ +\"$$\";xa(a,b);return b}};f.addShadingPattern=function(a,b){xa(a,b);return this};f.beginTilingPattern=function(a){var b=a.boundingBox[0],c=a.boundingBox[1],d=a.boundingBox[2]-a.boundingBox[0],e=a.boundingBox[3]-a.boundingBox[1];\na=a.matrix;fa.push(new la);z=I=0;m=[];ga=b;ha=c;ia=a;Aa(d,e)};f.endTilingPattern=function(a,b){b.stream=m[I].join(\"\\n\");xa(a,b);v.publish(\"endTilingPattern\",b);fa.pop().restore()};f.text=function(a,b,g,d,e,l){function f(a){a=a.split(\"\\t\").join(Array(w.TabLen||9).join(\" \"));return ya(a,d)}if(\"number\"===typeof a){var p=g;g=b;b=a;a=p}\"string\"===typeof a&&(a=a.match(/[\\n\\r]/)?a.split(/\\r\\n|\\r|\\n/g):[a]);\"string\"===typeof e&&(l=e,e=null);\"string\"===typeof d&&(l=d,d=null);\"number\"===typeof d&&(e=d,d=null);\ne&&\"number\"===typeof e?(e*=Math.PI/180,p=Math.cos(e),e=Math.sin(e),e=new R(p,e,-e,p,0,0)):e||(e=ka);d=d||{};\"noBOM\"in d||(d.noBOM=!0);\"autoencode\"in d||(d.autoencode=!0);var p=\"\",n=this.internal.getCurrentPageInfo().pageContext;!0===d.stroke?!0!==n.lastTextWasStroke&&(p=\"1 Tr\\n\",n.lastTextWasStroke=!0):(n.lastTextWasStroke&&(p=\"0 Tr\\n\"),n.lastTextWasStroke=!1);\"undefined\"===typeof this._runningPageHeight&&(this._runningPageHeight=0);if(\"string\"===typeof a)a=f(a);else if(\"[object Array]\"===Object.prototype.toString.call(a)){for(var k=\na.concat(),n=[],q=k.length;q--;)n.push(f(k.shift()));if(l){var x,m,v=L*oa,t=a.map(function(a){return this.getStringUnitWidth(a)*L},this);m=Math.max.apply(Math,t);if(\"center\"===l)k=b-m/2,b-=t[0]/2;else if(\"right\"===l)k=b-m,b-=t[0];else throw Error('Unrecognized alignment option, use \"center\" or \"right\".');x=b;a=n[0]+\") Tj\\n\";i=1;for(q=n.length;i<q;i++){var u=m-t[i];\"center\"===l&&(u/=2);a+=k-x+u+\" -\"+v+\" Td (\"+n[i];x=k+u;i<q-1&&(a+=\") Tj\\n\")}}else a=n.join(\") Tj\\nT* (\")}else throw Error('Type of text must be string or Array. \"'+\na+'\" is not recognized.');g=h(g);b=new R(1,0,0,-1,b,g);e=wa(b,e);c(\"BT\\n\"+L*oa+\" TL\\n\"+p+(e.toString()+\" Tm\")+\"\\n(\"+a+\") Tj\\nET\");return this};f.lstext=function(a,b,c,d){for(var e=0,l=a.length;e<l;e++,b+=d)this.text(a[e],b,c)};f.line=function(a,b,c,d){return this.lines([[c-a,d-b]],a,b,[1,1],\"D\")};f.clip=function(){c(\"W\");c(\"S\")};f.lines=function(a,b,g,d,e,l,f,h){var n,q,m,t,u,v,w,r;\"number\"===typeof a&&(n=g,g=b,b=a,a=n);d=d||[1,1];c(k(b)+\" \"+k(g)+\" m \");n=d[0];d=d[1];q=a.length;r=g;for(g=0;g<q;g++)m=\na[g],2===m.length?(b=m[0]*n+b,r=m[1]*d+r,c(k(b)+\" \"+k(r)+\" l\")):(t=m[0]*n+b,u=m[1]*d+r,v=m[2]*n+b,w=m[3]*d+r,b=m[4]*n+b,r=m[5]*d+r,c(k(t)+\" \"+k(u)+\" \"+k(v)+\" \"+k(w)+\" \"+k(b)+\" \"+k(r)+\" c\"));l&&c(\"h\");ma(e,f,h);return this};f.path=function(a,b,g,d){for(var e=0;e<a.length;e++){var f=a[e],h=f.c;switch(f.op){case \"m\":c(k(h[0])+\" \"+k(h[1])+\" m\");break;case \"l\":c(k(h[0])+\" \"+k(h[1])+\" l\");break;case \"c\":c([k(h[0]),k(h[1]),k(h[2]),k(h[3]),k(h[4]),k(h[5]),\"c\"].join(\" \"));break;case \"h\":c(\"h\")}}ma(b,g,d);\nreturn this};f.rect=function(a,b,g,d,e,f,k){c([h(a),h(b),h(g),h(-d),\"re\"].join(\" \"));ma(e,f,k);return this};f.triangle=function(a,b,c,d,e,f,h,k,n){this.lines([[c-a,d-b],[e-c,f-d],[a-e,b-f]],a,b,[1,1],h,!0,k,n);return this};f.roundedRect=function(a,b,c,d,e,f,h,k,n){var m=4/3*(Math.SQRT2-1);e=Math.min(e,.5*c);f=Math.min(f,.5*d);this.lines([[c-2*e,0],[e*m,0,e,f-f*m,e,f],[0,d-2*f],[0,f*m,-(e*m),f,-e,f],[-c+2*e,0],[-(e*m),0,-e,-(f*m),-e,-f],[0,-d+2*f],[0,-(f*m),e*m,-f,e,-f]],a+e,b,[1,1],h,!0,k,n);return this};\nf.ellipse=function(a,b,g,d,e,f,k){var m=4/3*(Math.SQRT2-1)*g,n=4/3*(Math.SQRT2-1)*d;c([h(a+g),h(b),\"m\",h(a+g),h(b-n),h(a+m),h(b-d),h(a),h(b-d),\"c\"].join(\" \"));c([h(a-m),h(b-d),h(a-g),h(b-n),h(a-g),h(b),\"c\"].join(\" \"));c([h(a-g),h(b+n),h(a-m),h(b+d),h(a),h(b+d),\"c\"].join(\" \"));c([h(a+m),h(b+d),h(a+g),h(b+n),h(a+g),h(b),\"c\"].join(\" \"));ma(e,f,k);return this};f.circle=function(a,b,c,d,e,f){return this.ellipse(a,b,c,c,d,e,f)};f.setProperties=function(a){for(var b in T)T.hasOwnProperty(b)&&a[b]&&(T[b]=\na[b]);return this};f.setFontSize=function(a){L=a;c(\"/\"+D+\" \"+L+\" Tf\");return this};f.getFontSize=function(){return L};f.setFont=function(a,b){D=Ba(a,b);c(\"/\"+D+\" \"+L+\" Tf\");return this};f.setFontStyle=f.setFontType=function(a){D=Ba(void 0,a);return this};f.getFontList=function(){var a={},b,c,d;for(b in G)if(G.hasOwnProperty(b))for(c in a[b]=d=[],G[b])G[b].hasOwnProperty(c)&&d.push(c);return a};f.addFont=function(a,b,c){Ia(a,b,c,\"StandardEncoding\")};f.setLineWidth=function(a){c(a.toFixed(2)+\" w\");\nreturn this};f.setDrawColor=function(a,b,g,d){a=void 0===b||void 0===d&&a===b===g?\"string\"===typeof a?a+\" G\":h(a/255)+\" G\":void 0===d?\"string\"===typeof a?[a,b,g,\"RG\"].join(\" \"):[h(a/255),h(b/255),h(g/255),\"RG\"].join(\" \"):\"string\"===typeof a?[a,b,g,d,\"K\"].join(\" \"):[h(a),h(b),h(g),h(d),\"K\"].join(\" \");c(a);return this};f.setFillColor=function(a,b,g,d){void 0===b||void 0===d&&a===b===g?a=\"string\"===typeof a?a+\" g\":h(a/255)+\" g\":void 0===d||\"object\"===typeof d?(a=\"string\"===typeof a?[a,b,g,\"rg\"].join(\" \"):\n[h(a/255),h(b/255),h(g/255),\"rg\"].join(\" \"),d&&0===d.a&&(a=\"255 255 255 rg\")):a=\"string\"===typeof a?[a,b,g,d,\"k\"].join(\" \"):[h(a),h(b),h(g),h(d),\"k\"].join(\" \");c(a);return this};f.setTextColor=function(a,b,g){\"string\"===typeof a&&/^#[0-9A-Fa-f]{6}$/.test(a)&&(g=parseInt(a.substr(1),16),a=g>>16&255,b=g>>8&255,g&=255);aa=0===a&&0===b&&0===g||\"undefined\"===typeof b?k(a/255)+\" g\":[k(a/255),k(b/255),k(g/255),\"rg\"].join(\" \");c(aa);return this};f.setGState=function(a){a=\"string\"===typeof a?H[qa[a]]:Ja(null,\na);a.equals(Ga)||(c(\"/\"+a.id+\" gs\"),Ga=a)};f.CapJoinStyles={0:0,butt:0,but:0,miter:0,1:1,round:1,rounded:1,circle:1,2:2,projecting:2,project:2,square:2,bevel:2};f.setLineCap=function(a){var b=this.CapJoinStyles[a];if(void 0===b)throw Error(\"Line cap style of '\"+a+\"' is not recognized. See or extend .CapJoinStyles property for valid styles\");sa=b;c(b+\" J\");return this};f.setLineJoin=function(a){var b=this.CapJoinStyles[a];if(void 0===b)throw Error(\"Line join style of '\"+a+\"' is not recognized. See or extend .CapJoinStyles property for valid styles\");\nta=b;c(b+\" j\");return this};f.setLineMiterLimit=function(a){c(h(a)+\" M\");return this};f.setLineDashPattern=function(a,b){c([\"[\"+(void 0!==a[0]?a[0]:\"\"),(void 0!==a[1]?a[1]:\"\")+\"]\",b,\"d\"].join(\" \"));return this};f.output=Oa;f.save=function(a){f.output(\"save\",a)};for(var na in q.API)q.API.hasOwnProperty(na)&&(\"events\"===na&&q.API.events.length?function(a,b){var c,d,e;for(e=b.length-1;-1!==e;e--)c=b[e][0],d=b[e][1],a.subscribe.apply(a,[c].concat(\"function\"===typeof d?[d]:d))}(v,q.API.events):f[na]=q.API[na]);\n(function(){for(var a=[[\"Helvetica\",\"helvetica\",\"normal\"],[\"Helvetica-Bold\",\"helvetica\",\"bold\"],[\"Helvetica-Oblique\",\"helvetica\",\"italic\"],[\"Helvetica-BoldOblique\",\"helvetica\",\"bolditalic\"],[\"Courier\",\"courier\",\"normal\"],[\"Courier-Bold\",\"courier\",\"bold\"],[\"Courier-Oblique\",\"courier\",\"italic\"],[\"Courier-BoldOblique\",\"courier\",\"bolditalic\"],[\"Times-Roman\",\"times\",\"normal\"],[\"Times-Bold\",\"times\",\"bold\"],[\"Times-Italic\",\"times\",\"italic\"],[\"Times-BoldItalic\",\"times\",\"bolditalic\"],[\"ZapfDingbats\",\"zapfdingbats\"]],\nb=0,c=a.length;b<c;b++){var d=Ia(a[b][0],a[b][1],a[b][2],\"StandardEncoding\"),e=a[b][0].split(\"-\"),f=e[0],e=e[1]||\"\";G.hasOwnProperty(f)||(G[f]={});G[f][e]=d}v.publish(\"addFonts\",{fonts:r,dictionary:G})})();D=\"F1\";La(F,V);v.publish(\"initialized\");return f}var za={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89],a5:[419.53,595.28],a6:[297.64,419.53],a7:[209.76,297.64],a8:[147.4,209.76],a9:[104.88,147.4],a10:[73.7,104.88],b0:[2834.65,4008.19],b1:[2004.09,\n2834.65],b2:[1417.32,2004.09],b3:[1000.63,1417.32],b4:[708.66,1000.63],b5:[498.9,708.66],b6:[354.33,498.9],b7:[249.45,354.33],b8:[175.75,249.45],b9:[124.72,175.75],b10:[87.87,124.72],c0:[2599.37,3676.54],c1:[1836.85,2599.37],c2:[1298.27,1836.85],c3:[918.43,1298.27],c4:[649.13,918.43],c5:[459.21,649.13],c6:[323.15,459.21],c7:[229.61,323.15],c8:[161.57,229.61],c9:[113.39,161.57],c10:[79.37,113.39],dl:[311.81,623.62],letter:[612,792],\"government-letter\":[576,756],legal:[612,1008],\"junior-legal\":[576,\n360],ledger:[1224,792],tabloid:[792,1224],\"credit-card\":[153,243]};q.API={events:[]};q.version=\"1.0.0-trunk\";\"function\"===typeof define&&define.amd?define(\"jsPDF\",function(){return q}):\"undefined\"!==typeof module&&module.exports?module.exports=q:t.jsPDF=q;return q}(\"undefined\"!==typeof self&&self||\"undefined\"!==typeof window&&window||this);\n"
  },
  {
    "path": "assets/highcharts/lib/jspdf.src.js",
    "content": "/** @preserve\n * jsPDF - PDF Document creation from JavaScript\n * Version ${versionID}\n *                           CommitID ${commitID}\n *\n * Copyright (c) 2010-2014 James Hall <james@parall.ax>, https://github.com/MrRio/jsPDF\n *               2010 Aaron Spike, https://github.com/acspike\n *               2012 Willow Systems Corporation, willow-systems.com\n *               2012 Pablo Hess, https://github.com/pablohess\n *               2012 Florian Jenett, https://github.com/fjenett\n *               2013 Warren Weckesser, https://github.com/warrenweckesser\n *               2013 Youssef Beddad, https://github.com/lifof\n *               2013 Lee Driscoll, https://github.com/lsdriscoll\n *               2013 Stefan Slonevskiy, https://github.com/stefslon\n *               2013 Jeremy Morel, https://github.com/jmorel\n *               2013 Christoph Hartmann, https://github.com/chris-rock\n *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria\n *               2014 James Makes, https://github.com/dollaruw\n *               2014 Diego Casorran, https://github.com/diegocr\n *               2014 Steven Spungin, https://github.com/Flamenco\n *               2014 Kenneth Glassey, https://github.com/Gavvers\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * Contributor(s):\n *    siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango,\n *    kim3er, mfo, alnorth, Flamenco\n */\n\n/**\n * Creates new jsPDF document object instance.\n *\n * @class\n * @param orientation One of \"portrait\" or \"landscape\" (or shortcuts \"p\" (Default), \"l\")\n * @param unit        Measurement unit to be used when coordinates are specified.\n *                    One of \"pt\" (points), \"mm\" (Default), \"cm\", \"in\"\n * @param format      One of 'pageFormats' as shown below, default: a4\n * @returns {jsPDF}\n * @name jsPDF\n */\nvar jsPDF = (function(global) {\n\t'use strict';\n\tvar pdfVersion = '1.3',\n\t\tpageFormats = { // Size in pt of various paper formats\n\t\t\t'a0'  : [2383.94, 3370.39], 'a1'  : [1683.78, 2383.94],\n\t\t\t'a2'  : [1190.55, 1683.78], 'a3'  : [ 841.89, 1190.55],\n\t\t\t'a4'  : [ 595.28,  841.89], 'a5'  : [ 419.53,  595.28],\n\t\t\t'a6'  : [ 297.64,  419.53], 'a7'  : [ 209.76,  297.64],\n\t\t\t'a8'  : [ 147.40,  209.76], 'a9'  : [ 104.88,  147.40],\n\t\t\t'a10' : [  73.70,  104.88], 'b0'  : [2834.65, 4008.19],\n\t\t\t'b1'  : [2004.09, 2834.65], 'b2'  : [1417.32, 2004.09],\n\t\t\t'b3'  : [1000.63, 1417.32], 'b4'  : [ 708.66, 1000.63],\n\t\t\t'b5'  : [ 498.90,  708.66], 'b6'  : [ 354.33,  498.90],\n\t\t\t'b7'  : [ 249.45,  354.33], 'b8'  : [ 175.75,  249.45],\n\t\t\t'b9'  : [ 124.72,  175.75], 'b10' : [  87.87,  124.72],\n\t\t\t'c0'  : [2599.37, 3676.54], 'c1'  : [1836.85, 2599.37],\n\t\t\t'c2'  : [1298.27, 1836.85], 'c3'  : [ 918.43, 1298.27],\n\t\t\t'c4'  : [ 649.13,  918.43], 'c5'  : [ 459.21,  649.13],\n\t\t\t'c6'  : [ 323.15,  459.21], 'c7'  : [ 229.61,  323.15],\n\t\t\t'c8'  : [ 161.57,  229.61], 'c9'  : [ 113.39,  161.57],\n\t\t\t'c10' : [  79.37,  113.39], 'dl'  : [ 311.81,  623.62],\n\t\t\t'letter'            : [612,   792],\n\t\t\t'government-letter' : [576,   756],\n\t\t\t'legal'             : [612,  1008],\n\t\t\t'junior-legal'      : [576,   360],\n\t\t\t'ledger'            : [1224,  792],\n\t\t\t'tabloid'           : [792,  1224],\n\t\t\t'credit-card'       : [153,   243]\n\t\t};\n\n\t/**\n\t * jsPDF's Internal PubSub Implementation.\n\t * See mrrio.github.io/jsPDF/doc/symbols/PubSub.html\n\t * Backward compatible rewritten on 2014 by\n\t * Diego Casorran, https://github.com/diegocr\n\t *\n\t * @class\n\t * @name PubSub\n\t */\n\tfunction PubSub(context) {\n\t\tvar topics = {};\n\n\t\tthis.subscribe = function(topic, callback, once) {\n\t\t\tif(typeof callback !== 'function') {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif(!topics.hasOwnProperty(topic)) {\n\t\t\t\ttopics[topic] = {};\n\t\t\t}\n\n\t\t\tvar id = Math.random().toString(35);\n\t\t\ttopics[topic][id] = [callback,!!once];\n\n\t\t\treturn id;\n\t\t};\n\n\t\tthis.unsubscribe = function(token) {\n\t\t\tfor(var topic in topics) {\n\t\t\t\tif(topics[topic][token]) {\n\t\t\t\t\tdelete topics[topic][token];\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t\tthis.publish = function(topic) {\n\t\t\tif(topics.hasOwnProperty(topic)) {\n\t\t\t\tvar args = Array.prototype.slice.call(arguments, 1), idr = [];\n\n\t\t\t\tfor(var id in topics[topic]) {\n\t\t\t\t\tvar sub = topics[topic][id];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsub[0].apply(context, args);\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t\tif(global.console) {\n\t\t\t\t\t\t\tconsole.error('jsPDF PubSub Error', ex.message, ex);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(sub[1]) idr.push(id);\n\t\t\t\t}\n\t\t\t\tif(idr.length) idr.forEach(this.unsubscribe);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * @constructor\n\t * @private\n\t */\n\tfunction jsPDF(orientation, unit, format, compressPdf) {\n\t\tvar options = {};\n\n\t\tif (typeof orientation === 'object') {\n\t\t\toptions = orientation;\n\n\t\t\torientation = options.orientation;\n\t\t\tunit = options.unit || unit;\n\t\t\tformat = options.format || format;\n\t\t\tcompressPdf = options.compress || options.compressPdf || compressPdf;\n\t\t}\n\n\t\t// Default options\n\t\tunit        = unit || 'mm';\n\t\tformat      = format || 'a4';\n\t\torientation = ('' + (orientation || 'P')).toLowerCase();\n\n\t\tvar format_as_string = ('' + format).toLowerCase(),\n\t\t\tcompress = !!compressPdf && typeof Uint8Array === 'function',\n\t\t\ttextColor            = options.textColor  || '0 g',\n\t\t\tdrawColor            = options.drawColor  || '0 G',\n\t\t\tactiveFontSize       = options.fontSize   || 16,\n\t\t\tlineHeightProportion = options.lineHeight || 1.15,\n\t\t\tlineWidth            = options.lineWidth  || 0.200025, // 2mm\n\t\t\tobjectNumber =  2,  // 'n' Current object number\n\t\t\toutToPages   = !1,  // switches where out() prints. outToPages true = push to pages obj. outToPages false = doc builder content\n\t\t\toffsets      = [],  // List of offsets. Activated and reset by buildDocument(). Pupulated by various calls buildDocument makes.\n\t\t\tfonts        = {},  // collection of font objects, where key is fontKey - a dynamically created label for a given font.\n\t\t\tfontmap      = {},  // mapping structure fontName > fontStyle > font key - performance layer. See addFont()\n\t\t\tactiveFontKey,      // will be string representing the KEY of the font as combination of fontName + fontStyle\n\n      fontStateStack = [], //\n\n      patterns = {}, // collection of pattern objects\n      patternMap = {}, // see fonts\n\n      gStates = {}, // collection of graphic state objects\n      gStatesMap = {}, // see fonts\n      activeGState = null,\n\n\t\t\tk,                  // Scale factor\n\t\t\ttmp,\n\t\t\tpage = 0,\n\t\t\tcurrentPage,\n\t\t\tpages = [],\n\t\t\tpagesContext = [], // same index as pages and pagedim\n\t\t\tpagedim = [],\n\t\t\tcontent = [],\n\t\t\tadditionalObjects = [],\n\t\t\tlineCapID = 0,\n\t\t\tlineJoinID = 0,\n\t\t\tcontent_length = 0,\n\n      renderTargets = {},\n      renderTargetMap = {},\n      renderTargetStack = [],\n\n      pageX, pageY, pageMatrix, // only used for FormObjects\n      pageWidth,\n\t\t\tpageHeight,\n\t\t\tpageMode,\n\t\t\tzoomMode,\n\t\t\tlayoutMode,\n\t\t\tdocumentProperties = {\n\t\t\t\t'title'    : '',\n\t\t\t\t'subject'  : '',\n\t\t\t\t'author'   : '',\n\t\t\t\t'keywords' : '',\n\t\t\t\t'creator'  : ''\n\t\t\t},\n\t\t\tAPI = {},\n\t\t\tevents = new PubSub(API),\n\n\t\t/////////////////////\n\t\t// Private functions\n\t\t/////////////////////\n\t\tf2 = function(number) {\n\t\t\treturn number.toFixed(2); // Ie, %.2f\n\t\t},\n\t\tf3 = function(number) {\n\t\t\treturn number.toFixed(3); // Ie, %.3f\n\t\t},\n\t\tpadd2 = function(number) {\n\t\t\treturn ('0' + parseInt(number)).slice(-2);\n\t\t},\n    padd2Hex = function (hexString) {\n      var s = \"00\" + hexString;\n      return s.substr(s.length - 2);\n    },\n\t\tout = function(string) {\n\t\t\tif (outToPages) {\n\t\t\t\t/* set by beginPage */\n\t\t\t\tpages[currentPage].push(string);\n\t\t\t} else {\n\t\t\t\t// +1 for '\\n' that will be used to join 'content'\n\t\t\t\tcontent_length += string.length + 1;\n\t\t\t\tcontent.push(string);\n\t\t\t}\n\t\t},\n\t\tnewObject = function() {\n\t\t\t// Begin a new object\n\t\t\tobjectNumber++;\n\t\t\toffsets[objectNumber] = content_length;\n\t\t\tout(objectNumber + ' 0 obj');\n\t\t\treturn objectNumber;\n\t\t},\n\t\t// Does not output the object until after the pages have been output.\n\t\t// Returns an object containing the objectId and content.\n\t\t// All pages have been added so the object ID can be estimated to start right after.\n\t\t// This does not modify the current objectNumber;  It must be updated after the newObjects are output.\n\t\tnewAdditionalObject = function() {\n\t\t\tvar objId = pages.length * 2 + 1;\n\t\t\tobjId += additionalObjects.length;\n\t\t\tvar obj = {objId:objId, content:''};\n\t\t\tadditionalObjects.push(obj);\n\t\t\treturn obj;\n\t\t},\n\t\t// Does not output the object.  The caller must call newObjectDeferredBegin(oid) before outputing any data\n\t\tnewObjectDeferred = function() {\n\t\t\tobjectNumber++;\n\t\t\toffsets[objectNumber] = function(){\n\t\t\t\treturn content_length;\n\t\t\t};\n\t\t\treturn objectNumber;\n\t\t},\n\t\tnewObjectDeferredBegin = function(oid) {\n\t\t\toffsets[oid] = content_length;\n\t\t},\n\t\tputStream = function(str) {\n\t\t\tout('stream');\n\t\t\tout(str);\n\t\t\tout('endstream');\n\t\t},\n\t\tputPages = function() {\n\t\t\tvar n,p,arr,i,deflater,adler32,adler32cs,wPt,hPt;\n\n\t\t\tadler32cs = global.adler32cs || jsPDF.adler32cs;\n\t\t\tif (compress && typeof adler32cs === 'undefined') {\n\t\t\t\tcompress = false;\n\t\t\t}\n\n\t\t\t// outToPages = false as set in endDocument(). out() writes to content.\n\n\t\t\tfor (n = 1; n <= page; n++) {\n\t\t\t\tnewObject();\n\t\t\t\twPt = (pageWidth = pagedim[n].width) * k;\n\t\t\t\thPt = (pageHeight = pagedim[n].height) * k;\n\t\t\t\tout('<</Type /Page');\n\t\t\t\tout('/Parent 1 0 R');\n\t\t\t\tout('/Resources 2 0 R');\n\t\t\t\tout('/MediaBox [0 0 ' + f2(wPt) + ' ' + f2(hPt) + ']');\n\t\t\t\t// Added for annotation plugin\n\t\t\t\tevents.publish('putPage', {pageNumber: n, page: pages[n]});\n\t\t\t\tout('/Contents ' + (objectNumber + 1) + ' 0 R');\n\t\t\t\tout('>>');\n\t\t\t\tout('endobj');\n\n\t\t\t\t// Page content\n\t\t\t\tp = pages[n].join('\\n');\n\n        // prepend global change of basis matrix\n        // (Now, instead of converting every coordinate to the pdf coordinate system, we apply a matrix\n        // that does this job for us (however, texts, images and similar objects must be drawn bottom up))\n        p = new Matrix(k, 0, 0, -k, 0, pageHeight).toString() + \" cm\\n\" + p;\n\n\t\t\t\tnewObject();\n\t\t\t\tif (compress) {\n\t\t\t\t\tarr = [];\n\t\t\t\t\ti = p.length;\n\t\t\t\t\twhile(i--) {\n\t\t\t\t\t\tarr[i] = p.charCodeAt(i);\n\t\t\t\t\t}\n\t\t\t\t\tadler32 = adler32cs.from(p);\n\t\t\t\t\tdeflater = new Deflater(6);\n\t\t\t\t\tdeflater.append(new Uint8Array(arr));\n\t\t\t\t\tp = deflater.flush();\n\t\t\t\t\tarr = new Uint8Array(p.length + 6);\n\t\t\t\t\tarr.set(new Uint8Array([120, 156]));\n\t\t\t\t\tarr.set(p, 2);\n\t\t\t\t\tarr.set(new Uint8Array([adler32 & 0xFF, (adler32 >> 8) & 0xFF, (adler32 >> 16) & 0xFF, (adler32 >> 24) & 0xFF]), p.length+2);\n\t\t\t\t\tp = String.fromCharCode.apply(null, arr);\n\t\t\t\t\tout('<</Length ' + p.length + ' /Filter [/FlateDecode]>>');\n\t\t\t\t} else {\n\t\t\t\t\tout('<</Length ' + p.length + '>>');\n\t\t\t\t}\n\t\t\t\tputStream(p);\n\t\t\t\tout('endobj');\n\t\t\t}\n\t\t\toffsets[1] = content_length;\n\t\t\tout('1 0 obj');\n\t\t\tout('<</Type /Pages');\n\t\t\tvar kids = '/Kids [';\n\t\t\tfor (i = 0; i < page; i++) {\n\t\t\t\tkids += (3 + 2 * i) + ' 0 R ';\n\t\t\t}\n\t\t\tout(kids + ']');\n\t\t\tout('/Count ' + page);\n\t\t\tout('>>');\n\t\t\tout('endobj');\n\t\t\tevents.publish('postPutPages');\n\t\t},\n\t\tputFont = function(font) {\n\t\t\tfont.objectNumber = newObject();\n\t\t\tout('<</BaseFont/' + font.PostScriptName + '/Type/Font');\n\t\t\tif (typeof font.encoding === 'string') {\n\t\t\t\tout('/Encoding/' + font.encoding);\n\t\t\t}\n\t\t\tout('/Subtype/Type1>>');\n\t\t\tout('endobj');\n\t\t},\n\t\tputFonts = function() {\n\t\t\tfor (var fontKey in fonts) {\n\t\t\t\tif (fonts.hasOwnProperty(fontKey)) {\n\t\t\t\t\tputFont(fonts[fontKey]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n    putXObject = function (xObject) {\n      xObject.objectNumber = newObject();\n      out(\"<<\");\n      out(\"/Type /XObject\");\n      out(\"/Subtype /Form\");\n      out(\"/BBox [\" + [\n            f2(xObject.x),\n            f2(xObject.y),\n            f2(xObject.x + xObject.width),\n            f2(xObject.y + xObject.height)\n          ].join(\" \") + \"]\");\n      out(\"/Matrix [\" + xObject.matrix.toString() + \"]\");\n      // TODO: /Resources\n\n      var p = xObject.pages[1].join(\"\\n\");\n      out(\"/Length \" + p.length);\n\n      out(\">>\");\n      putStream(p);\n      out(\"endobj\");\n    },\n    putXObjects = function () {\n      for (var xObjectKey in renderTargets) {\n        if (renderTargets.hasOwnProperty(xObjectKey)) {\n          putXObject(renderTargets[xObjectKey]);\n        }\n      }\n    },\n\n    interpolateAndEncodeRGBStream = function (colors, numberSamples) {\n      var tValues = [];\n      var t;\n      var dT = 1.0 / (numberSamples - 1);\n      for (t = 0.0; t < 1.0; t += dT) {\n        tValues.push(t);\n      }\n      tValues.push(1.0);\n\n      // add first and last control point if not present\n      if (colors[0].offset != 0.0) {\n        var c0 = {\n          offset: 0.0,\n          color: colors[0].color\n        };\n        colors.unshift(c0)\n      }\n      if (colors[colors.length - 1].offset != 1.0) {\n        var c1 = {\n          offset: 1.0,\n          color: colors[colors.length - 1].color\n        };\n        colors.push(c1);\n      }\n\n      var out = \"\";\n      var index = 0;\n\n      for (var i = 0; i < tValues.length; i++) {\n        t = tValues[i];\n\n        while (t > colors[index + 1].offset)\n          index++;\n\n        var a = colors[index].offset;\n        var b = colors[index + 1].offset;\n        var d = (t - a) / (b - a);\n\n        var aColor = colors[index].color;\n        var bColor = colors[index + 1].color;\n\n        out += padd2Hex((Math.round((1 - d) * aColor[0] + d * bColor[0])).toString(16))\n            + padd2Hex((Math.round((1 - d) * aColor[1] + d * bColor[1])).toString(16))\n            + padd2Hex((Math.round((1 - d) * aColor[2] + d * bColor[2])).toString(16));\n      }\n      return out.trim();\n    },\n    putShadingPattern = function (pattern, numberSamples) {\n      /*\n       Axial patterns shade between the two points specified in coords, radial patterns between the inner\n       and outer circle.\n\n       The user can specify an array (colors) that maps t-Values in [0, 1] to RGB colors. These are now\n       interpolated to equidistant samples and written to pdf as a sample (type 0) function.\n       */\n\n      // The number of color samples that should be used to describe the shading.\n      // The higher, the more accurate the gradient will be.\n      numberSamples || (numberSamples = 21);\n\n      var funcObjectNumber = newObject();\n      var stream = interpolateAndEncodeRGBStream(pattern.colors, numberSamples);\n      out(\"<< /FunctionType 0\");\n      out(\"/Domain [0.0 1.0]\");\n      out(\"/Size [\" + numberSamples + \"]\");\n      out(\"/BitsPerSample 8\");\n      out(\"/Range [0.0 1.0 0.0 1.0 0.0 1.0]\");\n      out(\"/Decode [0.0 1.0 0.0 1.0 0.0 1.0]\");\n      out(\"/Length \" + stream.length);\n      // The stream is Hex encoded\n      out(\"/Filter /ASCIIHexDecode\");\n      out(\">>\");\n      putStream(stream);\n      out(\"endobj\");\n\n      pattern.objectNumber = newObject();\n      out(\"<< /ShadingType \" + pattern.type);\n      out(\"/ColorSpace /DeviceRGB\");\n\n      var coords = \"/Coords [\"\n          + f3(parseFloat(pattern.coords[0])) + \" \"// x1\n          + f3(parseFloat(pattern.coords[1])) + \" \"; // y1\n      if (pattern.type === 2) {\n        // axial\n        coords += f3(parseFloat(pattern.coords[2])) + \" \" // x2\n            + f3(parseFloat(pattern.coords[3])); // y2\n      } else {\n        // radial\n        coords += f3(parseFloat(pattern.coords[2])) + \" \"// r1\n            + f3(parseFloat(pattern.coords[3])) + \" \" // x2\n            + f3(parseFloat(pattern.coords[4])) + \" \" // y2\n            + f3(parseFloat(pattern.coords[5])); // r2\n      }\n      coords += \"]\";\n      out(coords);\n\n      if (pattern.matrix) {\n        out(\"/Matrix [\" + pattern.matrix.toString() + \"]\");\n      }\n\n      out(\"/Function \" + funcObjectNumber + \" 0 R\");\n      out(\"/Extend [true true]\");\n      out(\">>\");\n      out(\"endobj\");\n    },\n    putTilingPattern = function (pattern) {\n      var resourcesObjectNumber = newObject();\n      out(\"<<\");\n      putResourceDictionary();\n      out(\">>\");\n      out(\"endobj\");\n\n      pattern.objectNumber = newObject();\n      out(\"<< /Type /Pattern\");\n      out(\"/PatternType 1\"); // tiling pattern\n      out(\"/PaintType 1\"); // colored tiling pattern\n      out(\"/TilingType 1\"); // constant spacing\n      out(\"/BBox [\" + pattern.boundingBox.map(f3).join(\" \") + \"]\");\n      out(\"/XStep \" + f3(pattern.xStep));\n      out(\"/YStep \" + f3(pattern.yStep));\n      out(\"/Length \" + pattern.stream.length);\n      out(\"/Resources \" + resourcesObjectNumber + \" 0 R\"); // TODO: resources\n      pattern.matrix && out(\"/Matrix [\" + pattern.matrix.toString() + \"]\");\n\n      out(\">>\");\n\n      putStream(pattern.stream);\n\n      out(\"endobj\");\n    },\n    putPatterns = function () {\n      var patternKey;\n      for (patternKey in patterns) {\n        if (patterns.hasOwnProperty(patternKey)) {\n          if (patterns[patternKey] instanceof API.ShadingPattern) {\n            putShadingPattern(patterns[patternKey]);\n          } else if (patterns[patternKey] instanceof API.TilingPattern) {\n            putTilingPattern(patterns[patternKey]);\n          }\n        }\n      }\n    },\n\n    putGState = function (gState) {\n      gState.objectNumber = newObject();\n      out(\"<<\");\n      for (var p in gState) {\n        switch (p) {\n          case \"opacity\":\n            out(\"/ca \" + f2(gState[p]));\n            break;\n        }\n      }\n      out(\">>\");\n      out(\"endobj\");\n    },\n    putGStates = function () {\n      var gStateKey;\n      for (gStateKey in gStates) {\n        if (gStates.hasOwnProperty(gStateKey)) {\n          putGState(gStates[gStateKey]);\n        }\n      }\n    },\n\n    putXobjectDict = function () {\n      for (var xObjectKey in renderTargets) {\n        if (renderTargets.hasOwnProperty(xObjectKey) && renderTargets[xObjectKey].objectNumber >= 0) {\n          out(\"/\" + xObjectKey + \" \" + renderTargets[xObjectKey].objectNumber + \" 0 R\");\n        }\n      }\n\n      events.publish('putXobjectDict');\n    },\n\n    putShadingPatternDict = function () {\n      for (var patternKey in patterns) {\n        if (patterns.hasOwnProperty(patternKey) && patterns[patternKey] instanceof API.ShadingPattern && patterns[patternKey].objectNumber >= 0) {\n          out(\"/\" + patternKey + \" \" + patterns[patternKey].objectNumber + \" 0 R\");\n        }\n      }\n\n      events.publish(\"putShadingPatternDict\");\n    },\n\n    putTilingPatternDict = function () {\n      for (var patternKey in patterns) {\n        if (patterns.hasOwnProperty(patternKey) && patterns[patternKey] instanceof API.TilingPattern && patterns[patternKey].objectNumber >= 0) {\n          out(\"/\" + patternKey + \" \" + patterns[patternKey].objectNumber + \" 0 R\");\n        }\n      }\n\n      events.publish(\"putTilingPatternDict\");\n    },\n\n    putGStatesDict = function () {\n      var gStateKey;\n      for (gStateKey in gStates) {\n        if (gStates.hasOwnProperty(gStateKey) && gStates[gStateKey].objectNumber >= 0) {\n          out(\"/\" + gStateKey + \" \" + gStates[gStateKey].objectNumber + \" 0 R\");\n        }\n      }\n\n      events.publish(\"putGStateDict\");\n    },\n\t\tputResourceDictionary = function() {\n\t\t\tout('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');\n\t\t\tout('/Font <<');\n\t\t\t// Do this for each font, the '1' bit is the index of the font\n\t\t\tfor (var fontKey in fonts) {\n\t\t\t\tif (fonts.hasOwnProperty(fontKey)) {\n\t\t\t\t\tout('/' + fontKey + ' ' + fonts[fontKey].objectNumber + ' 0 R');\n\t\t\t\t}\n\t\t\t}\n\t\t\tout('>>');\n\n      out(\"/Shading <<\");\n      putShadingPatternDict();\n      out(\">>\");\n\n      out(\"/Pattern <<\");\n      putTilingPatternDict();\n      out(\">>\");\n\n      out(\"/ExtGState <<\");\n      putGStatesDict();\n      out('>>');\n\n\t\t\tout('/XObject <<');\n\t\t\tputXobjectDict();\n\t\t\tout('>>');\n\t\t},\n\t\tputResources = function() {\n\t\t\tputFonts();\n      putGStates();\n      putXObjects();\n      putPatterns();\n\t\t\tevents.publish('putResources');\n\t\t\t// Resource dictionary\n\t\t\toffsets[2] = content_length;\n\t\t\tout('2 0 obj');\n\t\t\tout('<<');\n\t\t\tputResourceDictionary();\n\t\t\tout('>>');\n\t\t\tout('endobj');\n\t\t\tevents.publish('postPutResources');\n\t\t},\n\t\tputAdditionalObjects = function() {\n\t\t\tevents.publish('putAdditionalObjects');\n\t\t\tfor (var i=0; i<additionalObjects.length; i++){\n\t\t\t\tvar obj = additionalObjects[i];\n\t\t\t\toffsets[obj.objId] = content_length;\n\t\t\t\tout( obj.objId + ' 0 obj');\n\t\t\t\tout(obj.content);\n\t\t\t\tout('endobj');\n\t\t\t}\n\t\t\tobjectNumber += additionalObjects.length;\n\t\t\tevents.publish('postPutAdditionalObjects');\n\t\t},\n\t\taddToFontDictionary = function(fontKey, fontName, fontStyle) {\n\t\t\t// this is mapping structure for quick font key lookup.\n\t\t\t// returns the KEY of the font (ex: \"F1\") for a given\n\t\t\t// pair of font name and type (ex: \"Arial\". \"Italic\")\n\t\t\tif (!fontmap.hasOwnProperty(fontName)) {\n\t\t\t\tfontmap[fontName] = {};\n\t\t\t}\n\t\t\tfontmap[fontName][fontStyle] = fontKey;\n\t\t},\n\t\t/**\n\t\t * FontObject describes a particular font as member of an instnace of jsPDF\n\t\t *\n\t\t * It's a collection of properties like 'id' (to be used in PDF stream),\n\t\t * 'fontName' (font's family name), 'fontStyle' (font's style variant label)\n\t\t *\n\t\t * @public\n\t\t * @property id {String} PDF-document-instance-specific label assinged to the font.\n\t\t * @property PostScriptName {String} PDF specification full name for the font\n\t\t * @property encoding {Object} Encoding_name-to-Font_metrics_object mapping.\n\t\t * @name FontObject\n\t\t */\n\t\taddFont = function(PostScriptName, fontName, fontStyle, encoding) {\n\t\t\tvar fontKey = 'F' + (Object.keys(fonts).length + 1).toString(10),\n\t\t\t// This is FontObject\n\t\t\tfont = fonts[fontKey] = {\n\t\t\t\t'id'             : fontKey,\n\t\t\t\t'PostScriptName' : PostScriptName,\n\t\t\t\t'fontName'       : fontName,\n\t\t\t\t'fontStyle'      : fontStyle,\n\t\t\t\t'encoding'       : encoding,\n\t\t\t\t'metadata'       : {}\n\t\t\t};\n\t\t\taddToFontDictionary(fontKey, fontName, fontStyle);\n\t\t\tevents.publish('addFont', font);\n\n\t\t\treturn fontKey;\n\t\t},\n\t\taddFonts = function() {\n\n\t\t\tvar HELVETICA     = \"helvetica\",\n\t\t\t\tTIMES         = \"times\",\n\t\t\t\tCOURIER       = \"courier\",\n\t\t\t\tNORMAL        = \"normal\",\n\t\t\t\tBOLD          = \"bold\",\n\t\t\t\tITALIC        = \"italic\",\n\t\t\t\tBOLD_ITALIC   = \"bolditalic\",\n\t\t\t\tencoding      = 'StandardEncoding',\n\t\t\t\tZAPF          = \"zapfdingbats\",\n\t\t\t\tstandardFonts = [\n\t\t\t\t\t['Helvetica', HELVETICA, NORMAL],\n\t\t\t\t\t['Helvetica-Bold', HELVETICA, BOLD],\n\t\t\t\t\t['Helvetica-Oblique', HELVETICA, ITALIC],\n\t\t\t\t\t['Helvetica-BoldOblique', HELVETICA, BOLD_ITALIC],\n\t\t\t\t\t['Courier', COURIER, NORMAL],\n\t\t\t\t\t['Courier-Bold', COURIER, BOLD],\n\t\t\t\t\t['Courier-Oblique', COURIER, ITALIC],\n\t\t\t\t\t['Courier-BoldOblique', COURIER, BOLD_ITALIC],\n\t\t\t\t\t['Times-Roman', TIMES, NORMAL],\n\t\t\t\t\t['Times-Bold', TIMES, BOLD],\n\t\t\t\t\t['Times-Italic', TIMES, ITALIC],\n\t\t\t\t\t['Times-BoldItalic', TIMES, BOLD_ITALIC],\n\t\t\t\t\t['ZapfDingbats',ZAPF ]\n\t\t\t\t];\n\n\t\t\tfor (var i = 0, l = standardFonts.length; i < l; i++) {\n\t\t\t\tvar fontKey = addFont(\n\t\t\t\t\t\tstandardFonts[i][0],\n\t\t\t\t\t\tstandardFonts[i][1],\n\t\t\t\t\t\tstandardFonts[i][2],\n\t\t\t\t\t\tencoding);\n\n\t\t\t\t// adding aliases for standard fonts, this time matching the capitalization\n\t\t\t\tvar parts = standardFonts[i][0].split('-');\n\t\t\t\taddToFontDictionary(fontKey, parts[0], parts[1] || '');\n\t\t\t}\n\t\t\tevents.publish('addFonts', { fonts : fonts, dictionary : fontmap });\n\t\t},\n    matrixMult = function (m1, m2) {\n      return new Matrix(\n          m1.a * m2.a + m1.b * m2.c,\n          m1.a * m2.b + m1.b * m2.d,\n          m1.c * m2.a + m1.d * m2.c,\n          m1.c * m2.b + m1.d * m2.d,\n          m1.e * m2.a + m1.f * m2.c + m2.e,\n          m1.e * m2.b + m1.f * m2.d + m2.f\n      );\n    },\n    Matrix = function (a, b, c, d, e, f) {\n      this.a = a;\n      this.b = b;\n      this.c = c;\n      this.d = d;\n      this.e = e;\n      this.f = f;\n    };\n\n    Matrix.prototype = {\n      toString: function () {\n        return [\n          f3(this.a),\n          f3(this.b),\n          f3(this.c),\n          f3(this.d),\n          f3(this.e),\n          f3(this.f)\n        ].join(\" \");\n      }\n    };\n\n    var unitMatrix = new Matrix(1, 0, 0, 1, 0, 0),\n\n    // Used (1) to save the current stream state to the XObjects stack and (2) to save completed form\n    // objects in the xObjects map.\n    RenderTarget = function () {\n      this.page = page;\n      this.currentPage = currentPage;\n      this.pages = pages.slice(0);\n      this.pagedim = pagedim.slice(0);\n      this.pagesContext = pagesContext.slice(0);\n      this.x = pageX;\n      this.y = pageY;\n      this.matrix = pageMatrix;\n      this.width = pageWidth;\n      this.height = pageHeight;\n\n      this.id = \"\"; // set by endFormObject()\n      this.objectNumber = -1; // will be set by putXObject()\n    };\n\n    RenderTarget.prototype = {\n      restore: function () {\n        page = this.page;\n        currentPage = this.currentPage;\n        pagesContext = this.pagesContext;\n        pagedim = this.pagedim;\n        pages = this.pages;\n        pageX = this.x;\n        pageY = this.y;\n        pageMatrix = this.matrix;\n        pageWidth = this.width;\n        pageHeight = this.height;\n      }\n    };\n\n    var beginNewRenderTarget = function (x, y, width, height, matrix) {\n      // save current state\n      renderTargetStack.push(new RenderTarget());\n\n      // clear pages\n      page = currentPage = 0;\n      pages = [];\n      pageX = x;\n      pageY = y;\n\n      pageMatrix = matrix;\n\n      beginPage(width, height);\n    },\n\n    endFormObject = function (key) {\n      // only add it if it is not already present (the keys provided by the user must be unique!)\n      if (renderTargetMap[key])\n        return;\n\n      // save the created xObject\n      var newXObject = new RenderTarget();\n\n      var xObjectId = 'Xo' + (Object.keys(renderTargets).length + 1).toString(10);\n      newXObject.id = xObjectId;\n\n      renderTargetMap[key] = xObjectId;\n      renderTargets[xObjectId] = newXObject;\n\n      events.publish('addFormObject', newXObject);\n\n      // restore state from stack\n      renderTargetStack.pop().restore();\n    },\n\n    /**\n     * Adds a new pattern for later use.\n     * @param {String} key The key by it can be referenced later. The keys must be unique!\n     * @param {API.Pattern} pattern The pattern\n     */\n    addPattern = function (key, pattern) {\n      // only add it if it is not already present (the keys provided by the user must be unique!)\n      if (patternMap[key])\n        return;\n\n      var prefix = pattern instanceof API.ShadingPattern ? \"Sh\" : \"P\";\n      var patternKey = prefix + (Object.keys(patterns).length + 1).toString(10);\n      pattern.id = patternKey;\n\n      patternMap[key] = patternKey;\n      patterns[patternKey] = pattern;\n\n      events.publish('addPattern', pattern);\n    },\n\n    /**\n     * Adds a new Graphics State. Duplicates are automatically eliminated.\n     * @param {String} key Might also be null, if no later reference to this gState is needed\n     * @param {Object} gState The gState object\n     */\n    addGState = function (key, gState) {\n      // only add it if it is not already present (the keys provided by the user must be unique!)\n      if (key && gStatesMap[key])\n        return;\n\n      var duplicate = false;\n      for (var s in gStates) {\n        if (gStates.hasOwnProperty(s)) {\n          if (gStates[s].equals(gState)) {\n            duplicate = true;\n            break;\n          }\n        }\n      }\n\n      if (duplicate) {\n        gState = gStates[s];\n      } else {\n        var gStateKey = 'GS' + (Object.keys(gStates).length + 1).toString(10);\n        gStates[gStateKey] = gState;\n        gState.id = gStateKey;\n      }\n\n      // several user keys may point to the same GState object\n      key && (gStatesMap[key] = gState.id);\n\n      events.publish('addGState', gState);\n\n      return gState;\n    },\n\t\tSAFE = function __safeCall(fn) {\n\t\t\tfn.foo = function __safeCallWrapper() {\n\t\t\t\ttry {\n\t\t\t\t\treturn fn.apply(this, arguments);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tvar stack = e.stack || '';\n\t\t\t\t\tif(~stack.indexOf(' at ')) stack = stack.split(\" at \")[1];\n\t\t\t\t\tvar m = \"Error in function \" + stack.split(\"\\n\")[0].split('<')[0] + \": \" + e.message;\n\t\t\t\t\tif(global.console) {\n\t\t\t\t\t\tglobal.console.error(m, e);\n\t\t\t\t\t\tif(global.alert) alert(m);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(m);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tfn.foo.bar = fn;\n\t\t\treturn fn.foo;\n\t\t},\n\t\tto8bitStream = function(text, flags) {\n\t\t/**\n\t\t * PDF 1.3 spec:\n\t\t * \"For text strings encoded in Unicode, the first two bytes must be 254 followed by\n\t\t * 255, representing the Unicode byte order marker, U+FEFF. (This sequence conflicts\n\t\t * with the PDFDocEncoding character sequence thorn ydieresis, which is unlikely\n\t\t * to be a meaningful beginning of a word or phrase.) The remainder of the\n\t\t * string consists of Unicode character codes, according to the UTF-16 encoding\n\t\t * specified in the Unicode standard, version 2.0. Commonly used Unicode values\n\t\t * are represented as 2 bytes per character, with the high-order byte appearing first\n\t\t * in the string.\"\n\t\t *\n\t\t * In other words, if there are chars in a string with char code above 255, we\n\t\t * recode the string to UCS2 BE - string doubles in length and BOM is prepended.\n\t\t *\n\t\t * HOWEVER!\n\t\t * Actual *content* (body) text (as opposed to strings used in document properties etc)\n\t\t * does NOT expect BOM. There, it is treated as a literal GID (Glyph ID)\n\t\t *\n\t\t * Because of Adobe's focus on \"you subset your fonts!\" you are not supposed to have\n\t\t * a font that maps directly Unicode (UCS2 / UTF16BE) code to font GID, but you could\n\t\t * fudge it with \"Identity-H\" encoding and custom CIDtoGID map that mimics Unicode\n\t\t * code page. There, however, all characters in the stream are treated as GIDs,\n\t\t * including BOM, which is the reason we need to skip BOM in content text (i.e. that\n\t\t * that is tied to a font).\n\t\t *\n\t\t * To signal this \"special\" PDFEscape / to8bitStream handling mode,\n\t\t * API.text() function sets (unless you overwrite it with manual values\n\t\t * given to API.text(.., flags) )\n\t\t * flags.autoencode = true\n\t\t * flags.noBOM = true\n\t\t *\n\t\t * ===================================================================================\n\t\t * `flags` properties relied upon:\n\t\t *   .sourceEncoding = string with encoding label.\n\t\t *                     \"Unicode\" by default. = encoding of the incoming text.\n\t\t *                     pass some non-existing encoding name\n\t\t *                     (ex: 'Do not touch my strings! I know what I am doing.')\n\t\t *                     to make encoding code skip the encoding step.\n\t\t *   .outputEncoding = Either valid PDF encoding name\n\t\t *                     (must be supported by jsPDF font metrics, otherwise no encoding)\n\t\t *                     or a JS object, where key = sourceCharCode, value = outputCharCode\n\t\t *                     missing keys will be treated as: sourceCharCode === outputCharCode\n\t\t *   .noBOM\n\t\t *       See comment higher above for explanation for why this is important\n\t\t *   .autoencode\n\t\t *       See comment higher above for explanation for why this is important\n\t\t */\n\n\t\t\tvar i,l,sourceEncoding,encodingBlock,outputEncoding,newtext,isUnicode,ch,bch;\n\n\t\t\tflags = flags || {};\n\t\t\tsourceEncoding = flags.sourceEncoding || 'Unicode';\n\t\t\toutputEncoding = flags.outputEncoding;\n\n\t\t\t// This 'encoding' section relies on font metrics format\n\t\t\t// attached to font objects by, among others,\n\t\t\t// \"Willow Systems' standard_font_metrics plugin\"\n\t\t\t// see jspdf.plugin.standard_font_metrics.js for format\n\t\t\t// of the font.metadata.encoding Object.\n\t\t\t// It should be something like\n\t\t\t//   .encoding = {'codePages':['WinANSI....'], 'WinANSI...':{code:code, ...}}\n\t\t\t//   .widths = {0:width, code:width, ..., 'fof':divisor}\n\t\t\t//   .kerning = {code:{previous_char_code:shift, ..., 'fof':-divisor},...}\n\t\t\tif ((flags.autoencode || outputEncoding) &&\n\t\t\t\tfonts[activeFontKey].metadata &&\n\t\t\t\tfonts[activeFontKey].metadata[sourceEncoding] &&\n\t\t\t\tfonts[activeFontKey].metadata[sourceEncoding].encoding) {\n\t\t\t\tencodingBlock = fonts[activeFontKey].metadata[sourceEncoding].encoding;\n\n\t\t\t\t// each font has default encoding. Some have it clearly defined.\n\t\t\t\tif (!outputEncoding && fonts[activeFontKey].encoding) {\n\t\t\t\t\toutputEncoding = fonts[activeFontKey].encoding;\n\t\t\t\t}\n\n\t\t\t\t// Hmmm, the above did not work? Let's try again, in different place.\n\t\t\t\tif (!outputEncoding && encodingBlock.codePages) {\n\t\t\t\t\toutputEncoding = encodingBlock.codePages[0]; // let's say, first one is the default\n\t\t\t\t}\n\n\t\t\t\tif (typeof outputEncoding === 'string') {\n\t\t\t\t\toutputEncoding = encodingBlock[outputEncoding];\n\t\t\t\t}\n\t\t\t\t// we want output encoding to be a JS Object, where\n\t\t\t\t// key = sourceEncoding's character code and\n\t\t\t\t// value = outputEncoding's character code.\n\t\t\t\tif (outputEncoding) {\n\t\t\t\t\tisUnicode = false;\n\t\t\t\t\tnewtext = [];\n\t\t\t\t\tfor (i = 0, l = text.length; i < l; i++) {\n\t\t\t\t\t\tch = outputEncoding[text.charCodeAt(i)];\n\t\t\t\t\t\tif (ch) {\n\t\t\t\t\t\t\tnewtext.push(\n\t\t\t\t\t\t\t\tString.fromCharCode(ch));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnewtext.push(\n\t\t\t\t\t\t\t\ttext[i]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// since we are looping over chars anyway, might as well\n\t\t\t\t\t\t// check for residual unicodeness\n\t\t\t\t\t\tif (newtext[i].charCodeAt(0) >> 8) {\n\t\t\t\t\t\t\t/* more than 255 */\n\t\t\t\t\t\t\tisUnicode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttext = newtext.join('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = text.length;\n\t\t\t// isUnicode may be set to false above. Hence the triple-equal to undefined\n\t\t\twhile (isUnicode === undefined && i !== 0) {\n\t\t\t\tif (text.charCodeAt(i - 1) >> 8) {\n\t\t\t\t\t/* more than 255 */\n\t\t\t\t\tisUnicode = true;\n\t\t\t\t}\n\t\t\t\ti--;\n\t\t\t}\n\t\t\tif (!isUnicode) {\n\t\t\t\treturn text;\n\t\t\t}\n\n\t\t\tnewtext = flags.noBOM ? [] : [254, 255];\n\t\t\tfor (i = 0, l = text.length; i < l; i++) {\n\t\t\t\tch = text.charCodeAt(i);\n\t\t\t\tbch = ch >> 8; // divide by 256\n\t\t\t\tif (bch >> 8) {\n\t\t\t\t\t/* something left after dividing by 256 second time */\n\t\t\t\t\tthrow new Error(\"Character at position \" + i + \" of string '\"\n\t\t\t\t\t\t+ text + \"' exceeds 16bits. Cannot be encoded into UCS-2 BE\");\n\t\t\t\t}\n\t\t\t\tnewtext.push(bch);\n\t\t\t\tnewtext.push(ch - (bch << 8));\n\t\t\t}\n\t\t\treturn String.fromCharCode.apply(undefined, newtext);\n\t\t},\n\t\tpdfEscape = function(text, flags) {\n\t\t\t/**\n\t\t\t * Replace '/', '(', and ')' with pdf-safe versions\n\t\t\t *\n\t\t\t * Doing to8bitStream does NOT make this PDF display unicode text. For that\n\t\t\t * we also need to reference a unicode font and embed it - royal pain in the rear.\n\t\t\t *\n\t\t\t * There is still a benefit to to8bitStream - PDF simply cannot handle 16bit chars,\n\t\t\t * which JavaScript Strings are happy to provide. So, while we still cannot display\n\t\t\t * 2-byte characters property, at least CONDITIONALLY converting (entire string containing)\n\t\t\t * 16bit chars to (USC-2-BE) 2-bytes per char + BOM streams we ensure that entire PDF\n\t\t\t * is still parseable.\n\t\t\t * This will allow immediate support for unicode in document properties strings.\n\t\t\t */\n\t\t\treturn to8bitStream(text, flags).replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n\t\t},\n\t\tputInfo = function() {\n\t\t\tout('/Producer (jsPDF ' + jsPDF.version + ')');\n\t\t\tfor(var key in documentProperties) {\n\t\t\t\tif(documentProperties.hasOwnProperty(key) && documentProperties[key]) {\n\t\t\t\t\tout('/'+key.substr(0,1).toUpperCase() + key.substr(1)\n\t\t\t\t\t\t+' (' + pdfEscape(documentProperties[key]) + ')');\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar created  = new Date(),\n\t\t\t\ttzoffset = created.getTimezoneOffset(),\n\t\t\t\ttzsign   = tzoffset < 0 ? '+' : '-',\n\t\t\t\ttzhour   = Math.floor(Math.abs(tzoffset / 60)),\n\t\t\t\ttzmin    = Math.abs(tzoffset % 60),\n\t\t\t\ttzstr    = [tzsign, padd2(tzhour), \"'\", padd2(tzmin), \"'\"].join('');\n\t\t\tout(['/CreationDate (D:',\n\t\t\t\t\tcreated.getFullYear(),\n\t\t\t\t\tpadd2(created.getMonth() + 1),\n\t\t\t\t\tpadd2(created.getDate()),\n\t\t\t\t\tpadd2(created.getHours()),\n\t\t\t\t\tpadd2(created.getMinutes()),\n\t\t\t\t\tpadd2(created.getSeconds()), tzstr, ')'].join(''));\n\t\t},\n\t\tputCatalog = function() {\n\t\t\tout('/Type /Catalog');\n\t\t\tout('/Pages 1 0 R');\n\t\t\t// PDF13ref Section 7.2.1\n\t\t\tif (!zoomMode) zoomMode = 'fullwidth';\n\t\t\tswitch(zoomMode) {\n\t\t\t\tcase 'fullwidth'  : out('/OpenAction [3 0 R /FitH null]');       break;\n\t\t\t\tcase 'fullheight' : out('/OpenAction [3 0 R /FitV null]');       break;\n\t\t\t\tcase 'fullpage'   : out('/OpenAction [3 0 R /Fit]');             break;\n\t\t\t\tcase 'original'   : out('/OpenAction [3 0 R /XYZ null null 1]'); break;\n\t\t\t\tdefault:\n\t\t\t\t\tvar pcn = '' + zoomMode;\n\t\t\t\t\tif (pcn.substr(pcn.length-1) === '%')\n\t\t\t\t\t\tzoomMode = parseInt(zoomMode) / 100;\n\t\t\t\t\tif (typeof zoomMode === 'number') {\n\t\t\t\t\t\tout('/OpenAction [3 0 R /XYZ null null '+f2(zoomMode)+']');\n\t\t\t\t\t}\n\t\t\t}\n\t\t\tif (!layoutMode) layoutMode = 'continuous';\n\t\t\tswitch(layoutMode) {\n\t\t\t\tcase 'continuous' : out('/PageLayout /OneColumn');      break;\n\t\t\t\tcase 'single'     : out('/PageLayout /SinglePage');     break;\n\t\t\t\tcase 'two':\n\t\t\t\tcase 'twoleft'    : out('/PageLayout /TwoColumnLeft');  break;\n\t\t\t\tcase 'tworight'   : out('/PageLayout /TwoColumnRight'); break;\n\t\t\t}\n\t\t\tif (pageMode) {\n\t\t\t\t/**\n\t\t\t\t * A name object specifying how the document should be displayed when opened:\n\t\t\t\t * UseNone      : Neither document outline nor thumbnail images visible -- DEFAULT\n\t\t\t\t * UseOutlines  : Document outline visible\n\t\t\t\t * UseThumbs    : Thumbnail images visible\n\t\t\t\t * FullScreen   : Full-screen mode, with no menu bar, window controls, or any other window visible\n\t\t\t\t */\n\t\t\t\tout('/PageMode /' + pageMode);\n\t\t\t}\n\t\t\tevents.publish('putCatalog');\n\t\t},\n\t\tputTrailer = function() {\n\t\t\tout('/Size ' + (objectNumber + 1));\n\t\t\tout('/Root ' + objectNumber + ' 0 R');\n\t\t\tout('/Info ' + (objectNumber - 1) + ' 0 R');\n\t\t},\n\t\tbeginPage = function(width,height) {\n\t\t\t// Dimensions are stored as user units and converted to points on output\n\t\t\tvar orientation = typeof height === 'string' && height.toLowerCase();\n\t\t\tif (typeof width === 'string') {\n\t\t\t\tvar format = width.toLowerCase();\n\t\t\t\tif (pageFormats.hasOwnProperty(format)) {\n\t\t\t\t\twidth  = pageFormats[format][0] / k;\n\t\t\t\t\theight = pageFormats[format][1] / k;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Array.isArray(width)) {\n\t\t\t\theight = width[1];\n\t\t\t\twidth = width[0];\n\t\t\t}\n\t\t\t//if (orientation) {\n\t\t\t//\tswitch(orientation.substr(0,1)) {\n\t\t\t//\t\tcase 'l': if (height > width ) orientation = 's'; break;\n\t\t\t//\t\tcase 'p': if (width > height ) orientation = 's'; break;\n\t\t\t//\t}\n      // TODO: What is the reason for this (for me it only seems to raise bugs)?\n\t\t\t//\tif (orientation === 's') { tmp = width; width = height; height = tmp; }\n\t\t\t//}\n\t\t\toutToPages = true;\n\t\t\tpages[++page] = [];\n\t\t\tpagedim[page] = {\n\t\t\t\twidth  : Number(width)  || pageWidth,\n\t\t\t\theight : Number(height) || pageHeight\n\t\t\t};\n\t\t\tpagesContext[page] = {};\n\t\t\t_setPage(page);\n\t\t},\n\t\t_addPage = function() {\n\t\t\tbeginPage.apply(this, arguments);\n\t\t\t// Set line width\n\t\t\tout(f2(lineWidth) + ' w');\n\t\t\t// Set draw color\n\t\t\tout(drawColor);\n\t\t\t// resurrecting non-default line caps, joins\n\t\t\tif (lineCapID !== 0) {\n\t\t\t\tout(lineCapID + ' J');\n\t\t\t}\n\t\t\tif (lineJoinID !== 0) {\n\t\t\t\tout(lineJoinID + ' j');\n\t\t\t}\n\t\t\tevents.publish('addPage', { pageNumber : page });\n\t\t},\n\t\t_deletePage = function( n ) {\n\t\t\tif (n > 0 && n <= page) {\n\t\t\t\tpages.splice(n, 1);\n\t\t\t\tpagedim.splice(n, 1);\n\t\t\t\tpage--;\n\t\t\t\tif (currentPage > page){\n\t\t\t\t\tcurrentPage = page;\n\t\t\t\t}\n\t\t\t\tthis.setPage(currentPage);\n\t\t\t}\n\t\t},\n\t\t_setPage = function(n) {\n\t\t\tif (n > 0 && n <= page) {\n\t\t\t\tcurrentPage = n;\n\t\t\t\tpageWidth = pagedim[n].width;\n\t\t\t\tpageHeight = pagedim[n].height;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Returns a document-specific font key - a label assigned to a\n\t\t * font name + font type combination at the time the font was added\n\t\t * to the font inventory.\n\t\t *\n\t\t * Font key is used as label for the desired font for a block of text\n\t\t * to be added to the PDF document stream.\n\t\t * @private\n\t\t * @function\n\t\t * @param {String} fontName can be undefined on \"falthy\" to indicate \"use current\"\n\t\t * @param {String} fontStyle can be undefined on \"falthy\" to indicate \"use current\"\n\t\t * @returns {String} Font key.\n\t\t */\n\t\tgetFont = function(fontName, fontStyle) {\n\t\t\tvar key;\n\n\t\t\tfontName  = fontName  !== undefined ? fontName  : fonts[activeFontKey].fontName;\n\t\t\tfontStyle = fontStyle !== undefined ? fontStyle : fonts[activeFontKey].fontStyle;\n\n\t\t\tif (fontName !== undefined){\n\t\t\t\tfontName = fontName.toLowerCase();\n\t\t\t}\n\t\t\tswitch(fontName){\n\t\t\tcase 'sans-serif':\n\t\t\tcase 'verdana':\n\t\t\tcase 'arial':\n\t\t\tcase 'helvetica':\n\t\t\t\tfontName = 'helvetica';\n\t\t\t\tbreak;\n\t\t\tcase 'fixed':\n\t\t\tcase 'monospace':\n\t\t\tcase 'terminal':\n\t\t\tcase 'courier':\n\t\t\t\tfontName = 'courier';\n\t\t\t\tbreak;\n\t\t\tcase 'serif':\n\t\t\tcase 'cursive':\n\t\t\tcase 'fantasy':\n\t\t\t\tdefault:\n\t\t\t\tfontName = 'times';\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t // get a string like 'F3' - the KEY corresponding tot he font + type combination.\n\t\t\t\tkey = fontmap[fontName][fontStyle];\n\t\t\t} catch (e) {}\n\n\t\t\tif (!key) {\n\t\t\t\t//throw new Error(\"Unable to look up font label for font '\" + fontName + \"', '\"\n\t\t\t\t\t//+ fontStyle + \"'. Refer to getFontList() for available fonts.\");\n\t\t\t\tkey = fontmap['times'][fontStyle];\n\t\t\t\tif (key == null){\n\t\t\t\t\tkey = fontmap['times']['normal'];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn key;\n\t\t},\n\t\tbuildDocument = function() {\n\n\t\t\toutToPages = false; // switches out() to content\n\t\t\tobjectNumber = 2;\n\t\t\tcontent = [];\n\t\t\toffsets = [];\n\t\t\tadditionalObjects = [];\n\n\t\t\t// putHeader()\n\t\t\tout('%PDF-' + pdfVersion);\n\n\t\t\tputPages();\n\n\t\t\t// Must happen after putPages\n\t\t\t// Modifies current object Id\n\t\t\tputAdditionalObjects();\n\n\t\t\tputResources();\n\n\t\t\t// Info\n\t\t\tnewObject();\n\t\t\tout('<<');\n\t\t\tputInfo();\n\t\t\tout('>>');\n\t\t\tout('endobj');\n\n\t\t\t// Catalog\n\t\t\tnewObject();\n\t\t\tout('<<');\n\t\t\tputCatalog();\n\t\t\tout('>>');\n\t\t\tout('endobj');\n\n\t\t\t// Cross-ref\n\t\t\tvar o = content_length, i, p = \"0000000000\";\n\t\t\tout('xref');\n\t\t\tout('0 ' + (objectNumber + 1));\n\t\t\tout(p+' 65535 f ');\n\t\t\tfor (i = 1; i <= objectNumber; i++) {\n\t\t\t\tvar offset = offsets[i];\n\t\t\t\tif (typeof offset === 'function'){\n\t\t\t\t\tout((p + offsets[i]()).slice(-10) + ' 00000 n ');\n\t\t\t\t}else{\n\t\t\t\t\tout((p + offsets[i]).slice(-10) + ' 00000 n ');\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Trailer\n\t\t\tout('trailer');\n\t\t\tout('<<');\n\t\t\tputTrailer();\n\t\t\tout('>>');\n\t\t\tout('startxref');\n\t\t\tout(o);\n\t\t\tout('%%EOF');\n\n\t\t\toutToPages = true;\n\n\t\t\treturn content.join('\\n');\n\t\t},\n\n\t\tgetStyle = function(style) {\n\t\t\t// see path-painting operators in PDF spec\n      var op = 'n'; // none\n      if (style === \"D\") {\n        op = 'S'; // stroke\n      } else if (style === 'F') {\n        op = 'f'; // fill\n      } else if (style === 'FD' || style === 'DF') {\n        op = 'B'; // both\n      } else if (style === 'f' || style === 'f*' || style === 'B' || style === 'B*') {\n\t\t\t\t/*\n\t\t\t\tAllow direct use of these PDF path-painting operators:\n\t\t\t\t- f\tfill using nonzero winding number rule\n\t\t\t\t- f*\tfill using even-odd rule\n\t\t\t\t- B\tfill then stroke with fill using non-zero winding number rule\n\t\t\t\t- B*\tfill then stroke with fill using even-odd rule\n\t\t\t\t*/\n\t\t\t\top = style;\n\t\t\t}\n\t\t\treturn op;\n\t\t},\n    // puts the style for the previously drawn path. If a patternKey is provided, the pattern is used to fill\n    // the path. Use patternMatrix to transform the pattern to rhe right location.\n    putStyle = function (style, patternKey, patternData) {\n      style = getStyle(style);\n\n      // stroking / filling / both the path\n      if (!patternKey) {\n        out(style);\n        return;\n      }\n\n      patternData || (patternData = unitMatrix);\n\n      var patternId = patternMap[patternKey];\n      var pattern = patterns[patternId];\n\n      if (pattern instanceof API.ShadingPattern) {\n        out(\"q\");\n        out(\"W \" + style);\n\n        if (pattern.gState) {\n          API.setGState(pattern.gState);\n        }\n\n        out(patternData.toString() + \" cm\");\n        out(\"/\" + patternId + \" sh\");\n        out(\"Q\");\n      } else if (pattern instanceof API.TilingPattern) {\n        // pdf draws patterns starting at the bottom left corner and they are not affected by the global transformation,\n        // so we must flip them\n        var matrix = new Matrix(1, 0, 0, -1, 0, pageHeight);\n\n        if (patternData.matrix) {\n          matrix = matrixMult(patternData.matrix || unitMatrix, matrix);\n\n          // we cannot apply a matrix to the pattern on use so we must abuse the pattern matrix and create new instances\n          // for each use\n          patternId = pattern.createClone(patternKey, patternData.boundingBox, patternData.xStep, patternData.yStep, matrix).id;\n        }\n\n        out(\"q\");\n        out(\"/Pattern cs\");\n        out(\"/\" + patternId + \" scn\");\n\n        if (pattern.gState) {\n          API.setGState(pattern.gState);\n        }\n\n        out(style);\n        out(\"Q\");\n      }\n    },\n\n\t\tgetArrayBuffer = function() {\n\t\t\tvar data = buildDocument(), len = data.length,\n\t\t\t\tab = new ArrayBuffer(len), u8 = new Uint8Array(ab);\n\n\t\t\twhile(len--) u8[len] = data.charCodeAt(len);\n\t\t\treturn ab;\n\t\t},\n\t\tgetBlob = function() {\n\t\t\treturn new Blob([getArrayBuffer()], { type : \"application/pdf\" });\n\t\t},\n\t\t/**\n\t\t * Generates the PDF document.\n\t\t *\n\t\t * If `type` argument is undefined, output is raw body of resulting PDF returned as a string.\n\t\t *\n\t\t * @param {String} type A string identifying one of the possible output types.\n\t\t * @param {Object} options An object providing some additional signalling to PDF generator.\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name output\n\t\t */\n\t\toutput = SAFE(function(type, options) {\n\t\t\tvar datauri = ('' + type).substr(0,6) === 'dataur'\n\t\t\t\t? 'data:application/pdf;base64,'+btoa(buildDocument()):0;\n\n\t\t\tswitch (type) {\n\t\t\t\tcase undefined:\n\t\t\t\t\treturn buildDocument();\n\t\t\t\tcase 'save':\n\t\t\t\t\tif (navigator.getUserMedia) {\n\t\t\t\t\t\tif (global.URL === undefined\n\t\t\t\t\t\t|| global.URL.createObjectURL === undefined) {\n\t\t\t\t\t\t\treturn API.output('dataurlnewwindow');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsaveAs(getBlob(), options);\n\t\t\t\t\tif(typeof saveAs.unload === 'function') {\n\t\t\t\t\t\tif(global.setTimeout) {\n\t\t\t\t\t\t\tsetTimeout(saveAs.unload,911);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\treturn getArrayBuffer();\n\t\t\t\tcase 'blob':\n\t\t\t\t\treturn getBlob();\n\t\t\t\tcase 'bloburi':\n\t\t\t\tcase 'bloburl':\n\t\t\t\t\t// User is responsible of calling revokeObjectURL\n\t\t\t\t\treturn global.URL && global.URL.createObjectURL(getBlob()) || void 0;\n\t\t\t\tcase 'datauristring':\n\t\t\t\tcase 'dataurlstring':\n\t\t\t\t\treturn datauri;\n\t\t\t\tcase 'dataurlnewwindow':\n\t\t\t\t\tvar nW = global.open(datauri);\n\t\t\t\t\tif (nW || typeof safari === \"undefined\") return nW;\n\t\t\t\t\t/* pass through */\n\t\t\t\tcase 'datauri':\n\t\t\t\tcase 'dataurl':\n\t\t\t\t\treturn global.document.location.href = datauri;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error('Output type \"' + type + '\" is not supported.');\n\t\t\t}\n\t\t\t// @TODO: Add different output options\n\t\t});\n\n\t\tswitch (unit) {\n\t\t\tcase 'pt':  k = 1;                break;\n\t\t\tcase 'mm':  k = 72 / 25.4000508;  break;\n\t\t\tcase 'cm':  k = 72 / 2.54000508;  break;\n\t\t\tcase 'in':  k = 72;               break;\n\t\t\tcase 'px':  k = 96 / 72;          break;\n\t\t\tcase 'pc':  k = 12;               break;\n\t\t\tcase 'em':  k = 12;               break;\n\t\t\tcase 'ex':  k = 6;                break;\n\t\t\tdefault:\n\t\t\t\tthrow ('Invalid unit: ' + unit);\n\t\t}\n\n\t\t//---------------------------------------\n\t\t// Public API\n\n\t\t/**\n\t\t * Object exposing internal API to plugins\n\t\t * @public\n\t\t */\n\t\tAPI.internal = {\n\t\t\t'pdfEscape' : pdfEscape,\n\t\t\t'getStyle' : getStyle,\n\t\t\t/**\n\t\t\t * Returns {FontObject} describing a particular font.\n\t\t\t * @public\n\t\t\t * @function\n\t\t\t * @param {String} fontName (Optional) Font's family name\n\t\t\t * @param {String} fontStyle (Optional) Font's style variation name (Example:\"Italic\")\n\t\t\t * @returns {FontObject}\n\t\t\t */\n\t\t\t'getFont' : function() {\n\t\t\t\treturn fonts[getFont.apply(API, arguments)];\n\t\t\t},\n\t\t\t'getFontSize' : function() {\n\t\t\t\treturn activeFontSize;\n\t\t\t},\n\t\t\t'getLineHeight' : function() {\n\t\t\t\treturn activeFontSize * lineHeightProportion;\n\t\t\t},\n\t\t\t'write' : function(string1 /*, string2, string3, etc */) {\n\t\t\t\tout(arguments.length === 1 ? string1 : Array.prototype.join.call(arguments, ' '));\n\t\t\t},\n\t\t\t'getCoordinateString' : function(value) {\n\t\t\t\treturn f2(value);\n\t\t\t},\n\t\t\t'getVerticalCoordinateString' : function(value) {\n\t\t\t\treturn f2(value);\n\t\t\t},\n\t\t\t'collections' : {},\n\t\t\t'newObject' : newObject,\n\t\t\t'newAdditionalObject' : newAdditionalObject,\n\t\t\t'newObjectDeferred' : newObjectDeferred,\n\t\t\t'newObjectDeferredBegin' : newObjectDeferredBegin,\n\t\t\t'putStream' : putStream,\n\t\t\t'events' : events,\n\t\t\t// ratio that you use in multiplication of a given \"size\" number to arrive to 'point'\n\t\t\t// units of measurement.\n\t\t\t// scaleFactor is set at initialization of the document and calculated against the stated\n\t\t\t// default measurement units for the document.\n\t\t\t// If default is \"mm\", k is the number that will turn number in 'mm' into 'points' number.\n\t\t\t// through multiplication.\n\t\t\t'scaleFactor' : k,\n\t\t\t'pageSize' : {\n\t\t\t\tget width() {\n\t\t\t\t\treturn pageWidth\n\t\t\t\t},\n\t\t\t\tget height() {\n\t\t\t\t\treturn pageHeight\n\t\t\t\t}\n\t\t\t},\n\t\t\t'output' : function(type, options) {\n\t\t\t\treturn output(type, options);\n\t\t\t},\n\t\t\t'getNumberOfPages' : function() {\n\t\t\t\treturn pages.length - 1;\n\t\t\t},\n\t\t\t'pages' : pages,\n\t\t\t'out' : out,\n\t\t\t'f2' : f2,\n\t\t\t'getPageInfo' : function(pageNumberOneBased){\n\t\t\t\tvar objId = (pageNumberOneBased - 1) * 2 + 3;\n\t\t\t\treturn {objId:objId, pageNumber:pageNumberOneBased, pageContext:pagesContext[pageNumberOneBased]};\n\t\t\t},\n\t\t\t'getCurrentPageInfo' : function(){\n\t\t\t\tvar objId = (currentPage - 1) * 2 + 3;\n\t\t\t\treturn {objId:objId, pageNumber:currentPage, pageContext:pagesContext[currentPage]};\n\t\t\t},\n\t\t\t'getPDFVersion': function () {\n\t\t\t\treturn pdfVersion;\n\t\t\t}\n\t\t};\n\n    /**\n     * An object representing a pdf graphics state.\n     * @param parameters A parameter object that contains all properties this graphics state wants to set.\n     * Supported are: opacity\n     * @constructor\n     */\n    API.GState = function (parameters) {\n      var supported = \"opacity\";\n      for (var p in parameters) {\n        if (parameters.hasOwnProperty(p) && supported.indexOf(p) >= 0) {\n          this[p] = parameters[p];\n        }\n      }\n      this.id = \"\"; // set by addGState()\n      this.objectNumber = -1; // will be set by putGState()\n\n      this.equals = function (other) {\n        var ignore = \"id,objectNumber,equals\";\n        if (!other || typeof other !== typeof this)\n          return false;\n        var count = 0;\n        for (var p in this) {\n          if (ignore.indexOf(p) >= 0)\n            continue;\n          if (this.hasOwnProperty(p) && !other.hasOwnProperty(p))\n            return false;\n          if (this[p] !== other[p])\n            return false;\n          count++;\n        }\n        for (var p in other) {\n          if (other.hasOwnProperty(p) && ignore.indexOf(p) < 0)\n            count--;\n        }\n        return count === 0;\n      }\n    };\n\n    /**\n     * Adds a new {@link GState} for later use {@see setGState}.\n     * @param {String} key\n     * @param {GState} gState\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name addGState\n     */\n    API.addGState = function (key, gState) {\n      addGState(key, gState);\n      return this;\n    };\n\n\t\t/**\n\t\t * Adds (and transfers the focus to) new page to the PDF document.\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t *\n\t\t * @methodOf jsPDF#\n\t\t * @name addPage\n\t\t */\n\t\tAPI.addPage = function() {\n\t\t\t_addPage.apply(this, arguments);\n\t\t\treturn this;\n\t\t};\n\t\tAPI.setPage = function() {\n\t\t\t_setPage.apply(this, arguments);\n\t\t\treturn this;\n\t\t};\n\t\tAPI.insertPage = function(beforePage) {\n\t\t\tthis.addPage();\n\t\t\tthis.movePage(currentPage, beforePage);\n\t\t\treturn this;\n\t\t};\n\t\tAPI.movePage = function(targetPage, beforePage) {\n\t\t\tvar tmpPagesContext, tmpPagedim, tmpPages, i;\n      if (targetPage > beforePage){\n        tmpPages = pages[targetPage];\n        tmpPagedim = pagedim[targetPage];\n        tmpPagesContext = pagesContext[targetPage];\n\t\t\t\tfor (i = targetPage; i > beforePage; i--){\n\t\t\t\t\tpages[i] = pages[i-1];\n\t\t\t\t\tpagedim[i] = pagedim[i-1];\n\t\t\t\t\tpagesContext[i] = pagesContext[i-1];\n\t\t\t\t}\n\t\t\t\tpages[beforePage] = tmpPages;\n\t\t\t\tpagedim[beforePage] = tmpPagedim;\n\t\t\t\tpagesContext[beforePage] = tmpPagesContext;\n\t\t\t\tthis.setPage(beforePage);\n\t\t\t} else if (targetPage < beforePage){\n\t\t\t\ttmpPages = pages[targetPage];\n\t\t\t\ttmpPagedim = pagedim[targetPage];\n\t\t\t\ttmpPagesContext = pagesContext[targetPage];\n\t\t\t\tfor (i = targetPage; i < beforePage; i++){\n\t\t\t\t\tpages[i] = pages[i+1];\n\t\t\t\t\tpagedim[i] = pagedim[i+1];\n\t\t\t\t\tpagesContext[i] = pagesContext[i+1];\n\t\t\t\t}\n\t\t\t\tpages[beforePage] = tmpPages;\n\t\t\t\tpagedim[beforePage] = tmpPagedim;\n\t\t\t\tpagesContext[beforePage] = tmpPagesContext;\n\t\t\t\tthis.setPage(beforePage);\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\tAPI.deletePage = function() {\n\t\t\t_deletePage.apply( this, arguments );\n\t\t\treturn this;\n\t\t};\n\t\tAPI.setDisplayMode = function(zoom, layout, pmode) {\n\t\t\tzoomMode   = zoom;\n\t\t\tlayoutMode = layout;\n\t\t\tpageMode   = pmode;\n\t\t\treturn this;\n\t\t};\n\n    /**\n     * Saves the current graphics state (\"pushes it on the stack\"). It can be restored by {@link restoreGraphicsState}\n     * later. Here, the general pdf graphics state is meant, also including the current transformation matrix,\n     * fill and stroke colors etc.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name saveGraphicsState\n     */\n    API.saveGraphicsState = function () {\n      out(\"q\");\n      // as we cannot set font key and size independently we must keep track of both\n      fontStateStack.push({\n        key: activeFontKey,\n        size: activeFontSize\n      });\n      return this;\n    };\n\n    /**\n     * Restores a previously saved graphics state saved by {@link saveGraphicsState} (\"pops the stack\").\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name restoreGraphicsState\n     */\n    API.restoreGraphicsState = function () {\n      out(\"Q\");\n\n      // restore previous font state\n      var fontState = fontStateStack.pop();\n      activeFontKey = fontState.key;\n      activeFontSize = fontState.size;\n\n      return this;\n    };\n\n    /**\n     * Appends this matrix to the left of all previously applied matrices.\n     * @param {Matrix} matrix\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name setCurrentTransformationMatrix\n     */\n    API.setCurrentTransformationMatrix = function (matrix) {\n      out(matrix.toString() + \" cm\");\n      return this;\n    };\n\n    /**\n     * Starts a new pdf form object, which means that all conseequent draw calls target a new independent object\n     * until {@link endFormObject} is called. The created object can be referenced and drawn later using\n     * {@link doFormObject}. Nested form objects are possible.\n     * x, y, width, height set the bounding box that is used to clip the content.\n     * @param {number} x\n     * @param {number} y\n     * @param {number} width\n     * @param {number} height\n     * @param {Matrix} matrix The matrix that will be applied to convert the form objects coordinate system to\n     * the parent's.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     */\n    API.beginFormObject = function (x, y, width, height, matrix) {\n      // The user can set the output target to a new form object. Nested form objects are possible.\n      // Currently, they use the resource dictionary of the surrounding stream. This should be changed, as\n      // the PDF-Spec states:\n      // \"In PDF 1.2 and later versions, form XObjects may be independent of the content streams in which\n      // they appear, and this is strongly recommended although not requiredIn PDF 1.2 and later versions,\n      // form XObjects may be independent of the content streams in which they appear, and this is strongly\n      // recommended although not required\"\n      beginNewRenderTarget(x, y, width, height, matrix);\n      return this;\n    };\n\n    /**\n     * Completes and saves the form object.\n     * @param {String} key The key by which this form object can be referenced.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name endFormObject\n     */\n    API.endFormObject = function (key) {\n      endFormObject(key);\n      return this;\n    };\n\n    /**\n     * Draws the specified form object by referencing to the respective pdf XObject created with\n     * {@link API.beginFormObject} and {@link endFormObject}.\n     * The location is determined by matrix.\n     * @param {String} key The key to the form object.\n     * @param {Matrix} matrix The matrix applied before drawing the form object.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name doFormObject\n     */\n    API.doFormObject = function (key, matrix) {\n      var xObject = renderTargets[renderTargetMap[key]];\n      out(\"q\");\n      out(matrix.toString() + \" cm\");\n      out(\"/\" + xObject.id + \" Do\");\n      out(\"Q\");\n      return this;\n    };\n\n    /**\n     * Returns the form object specified by key.\n     * @param key {String}\n     * @returns {{x: number, y: number, width: number, height: number, matrix: Matrix}}\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name getFormObject\n     */\n    API.getFormObject = function (key) {\n      var xObject = renderTargets[renderTargetMap[key]];\n      return {\n        x: xObject.x,\n        y: xObject.y,\n        width: xObject.width,\n        height: xObject.height,\n        matrix: xObject.matrix\n      };\n    };\n\n    /**\n     * A matrix object for 2D homogenous transformations:\n     * | a b 0 |\n     * | c d 0 |\n     * | e f 1 |\n     * pdf multiplies matrices righthand: v' = v x m1 x m2 x ...\n     * @param {number} a\n     * @param {number} b\n     * @param {number} c\n     * @param {number} d\n     * @param {number} e\n     * @param {number} f\n     * @constructor\n     */\n    API.Matrix = Matrix;\n\n    /**\n     * Multiplies two matrices. (see {@link Matrix})\n     * @param {Matrix} m1\n     * @param {Matrix} m2\n     */\n    API.matrixMult = matrixMult;\n\n    /**\n     * The unit matrix (equal to new Matrix(1, 0, 0, 1, 0, 0).\n     * @type {Matrix}\n     */\n    API.unitMatrix = unitMatrix;\n\n    var Pattern = function (gState, matrix) {\n      this.gState = gState;\n      this.matrix = matrix;\n\n      this.id = \"\"; // set by addPattern()\n      this.objectNumber = -1; // will be set by putPattern()\n    };\n\n    /**\n     * A pattern describing a shading pattern.\n     * @param {String} type One of \"axial\" or \"radial\"\n     * @param {Array<Number>} coords Either [x1, y1, x2, y2] for \"axial\" type describing the two interpolation points\n     * or [x1, y1, r, x2, y2, r2] for \"radial\" describing inner and the outer circle.\n     * @param {Array<Object>} colors An array of objects with the fields \"offset\" and \"color\". \"offset\" describes\n     * the offset in parameter space [0, 1]. \"color\" is an array of length 3 describing RGB values in [0, 255].\n     * @param {GState=} gState An additional graphics state that gets applied to the pattern (optional).\n     * @param {Matrix=} matrix A matrix that describes the transformation between the pattern coordinate system\n     * and the use coordinate system (optional).\n     * @constructor\n     * @extends API.Pattern\n     */\n    API.ShadingPattern = function (type, coords, colors, gState, matrix) {\n      // see putPattern() for information how they are realized\n      this.type = type === \"axial\" ? 2 : 3;\n      this.coords = coords;\n      this.colors = colors;\n\n      Pattern.call(this, gState, matrix);\n    };\n\n    /**\n     * A PDF Tiling pattern.\n     * @param {Array.<Number>} boundingBox The bounding box at which one pattern cell gets clipped.\n     * @param {Number} xStep Horizontal spacing between pattern cells.\n     * @param {Number} yStep Vertical spacing between pattern cells.\n     * @param {API.GState=} gState An additional graphics state that gets applied to the pattern (optional).\n     * @param {Matrix=} matrix A matrix that describes the transformation between the pattern coordinate system\n     * and the use coordinate system (optional).\n     * @constructor\n     * @extends API.Pattern\n     */\n    API.TilingPattern = function (boundingBox, xStep, yStep, gState, matrix) {\n      this.boundingBox = boundingBox;\n      this.xStep = xStep;\n      this.yStep = yStep;\n\n      this.stream = \"\"; // set by endTilingPattern();\n\n      this.cloneIndex = 0;\n\n      Pattern.call(this, gState, matrix);\n    };\n\n    API.TilingPattern.prototype = {\n      createClone: function (patternKey, boundingBox, xStep, yStep, matrix) {\n        var clone = new API.TilingPattern(boundingBox || this.boundingBox, xStep  || this.xStep, yStep || this.yStep,\n            this.gState, matrix || this.matrix);\n        clone.stream = this.stream;\n        var key = patternKey + \"$$\" + this.cloneIndex++ + \"$$\";\n        addPattern(key, clone);\n        return clone;\n      }\n    };\n\n    /**\n     * Adds a new {@link API.ShadingPattern} for later use.\n     * @param {String} key\n     * @param {Pattern} pattern\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name addPattern\n     */\n    API.addShadingPattern = function (key, pattern) {\n      addPattern(key, pattern);\n      return this;\n    };\n\n    /**\n     * Begins a new tiling pattern. All subsequent render calls are drawn to this pattern until {@link API.endTilingPattern}\n     * gets called.\n     * @param {API.Pattern} pattern\n     */\n    API.beginTilingPattern = function (pattern) {\n      beginNewRenderTarget(pattern.boundingBox[0], pattern.boundingBox[1],\n          pattern.boundingBox[2] - pattern.boundingBox[0], pattern.boundingBox[3] - pattern.boundingBox[1], pattern.matrix);\n    };\n\n    /**\n     * Ends a tiling pattern and sets the render target to the one active before {@link API.beginTilingPattern} has been called.\n     * @param {string} key A unique key that is used to reference this pattern at later use.\n     * @param {API.Pattern} pattern The pattern to end.\n     */\n    API.endTilingPattern = function (key, pattern) {\n      // retrieve the stream\n      pattern.stream = pages[currentPage].join(\"\\n\");\n\n      addPattern(key, pattern);\n\n      events.publish(\"endTilingPattern\", pattern);\n\n      // restore state from stack\n      renderTargetStack.pop().restore();\n    };\n\n    /**\n     * Adds text to page. Supports adding multiline text when 'text' argument is an Array of Strings.\n     *\n     * @function\n     * @param {String|Array} text String or array of strings to be added to the page. Each line is shifted one line down\n     * per font, spacing settings declared before this call.\n     * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page\n     * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n     * @param {Object} flags Collection of settings signalling how the text must be encoded. Defaults are sane. If you\n     * think you want to pass some flags, you likely can read the source.\n     * @param {number|Matrix} transform If transform is a number the text will be rotated by this value. If it is a Matrix,\n     * this matrix gets directly applied to the text, which allows shearing effects etc.\n     * @param align {string}\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     */\n    API.text = function(text, x, y, flags, transform, align) {\n      /**\n       * Inserts something like this into PDF\n       *   BT\n       *    /F1 16 Tf  % Font name + size\n       *    16 TL % How many units down for next line in multiline text\n       *    0 g % color\n       *    28.35 813.54 Td % position\n       *    (line one) Tj\n       *    T* (line two) Tj\n       *    T* (line three) Tj\n       *   ET\n       */\n      function ESC(s) {\n        s = s.split(\"\\t\").join(Array(options.TabLen||9).join(\" \"));\n        return pdfEscape(s, flags);\n      }\n\n      // Pre-August-2012 the order of arguments was function(x, y, text, flags)\n      // in effort to make all calls have similar signature like\n      //   function(data, coordinates... , miscellaneous)\n      // this method had its args flipped.\n      // code below allows backward compatibility with old arg order.\n      if (typeof text === 'number') {\n        var tmp = y;\n        y = x;\n        x = text;\n        text = tmp;\n      }\n\n      // If there are any newlines in text, we assume\n      // the user wanted to print multiple lines, so break the\n      // text up into an array.  If the text is already an array,\n      // we assume the user knows what they are doing.\n      // Convert text into an array anyway to simplify\n      // later code.\n      if (typeof text === 'string') {\n        if(text.match(/[\\n\\r]/)) {\n          text = text.split( /\\r\\n|\\r|\\n/g);\n        } else {\n          text = [text];\n        }\n      }\n      if (typeof transform === 'string') {\n        align = transform;\n        transform = null;\n      }\n      if (typeof flags === 'string') {\n        align = flags;\n        flags = null;\n      }\n      if (typeof flags === 'number') {\n        transform = flags;\n        flags = null;\n      }\n\n      var todo;\n      if (transform && typeof transform === \"number\") {\n        transform *= (Math.PI / 180);\n        var c = Math.cos(transform),\n            s = Math.sin(transform);\n        transform = new Matrix(c, s , -s, c, 0, 0);\n      } else if (!transform) {\n        transform = unitMatrix;\n      }\n\n      flags = flags || {};\n      if (!('noBOM' in flags))\n        flags.noBOM = true;\n      if (!('autoencode' in flags))\n        flags.autoencode = true;\n\n      var strokeOption = '';\n      var pageContext = this.internal.getCurrentPageInfo().pageContext;\n      if (true === flags.stroke){\n        if (pageContext.lastTextWasStroke !== true){\n          strokeOption = '1 Tr\\n';\n          pageContext.lastTextWasStroke = true;\n        }\n      }\n      else{\n        if (pageContext.lastTextWasStroke){\n          strokeOption = '0 Tr\\n';\n        }\n        pageContext.lastTextWasStroke = false;\n      }\n\n      if (typeof this._runningPageHeight === 'undefined'){\n        this._runningPageHeight = 0;\n      }\n\n      if (typeof text === 'string') {\n        text = ESC(text);\n      } else if (Object.prototype.toString.call(text) === '[object Array]') {\n        // we don't want to destroy  original text array, so cloning it\n        var sa = text.concat(), da = [], len = sa.length;\n        // we do array.join('text that must not be PDFescaped\")\n        // thus, pdfEscape each component separately\n        while (len--) {\n          da.push(ESC(sa.shift()));\n        }\n        var linesLeft = Math.ceil((y - this._runningPageHeight) / (activeFontSize * lineHeightProportion));\n        if (0 <= linesLeft && linesLeft < da.length + 1) {\n          //todo = da.splice(linesLeft-1);\n        }\n\n        if( align ) {\n          var left,\n              prevX,\n              maxLineLength,\n              leading =  activeFontSize * lineHeightProportion,\n              lineWidths = text.map( function( v ) {\n                return this.getStringUnitWidth( v ) * activeFontSize;\n              }, this );\n          maxLineLength = Math.max.apply( Math, lineWidths );\n          // The first line uses the \"main\" Td setting,\n          // and the subsequent lines are offset by the\n          // previous line's x coordinate.\n          if( align === \"center\" ) {\n            // The passed in x coordinate defines\n            // the center point.\n            left = x - maxLineLength / 2;\n            x -= lineWidths[0] / 2;\n          } else if ( align === \"right\" ) {\n            // The passed in x coordinate defines the\n            // rightmost point of the text.\n            left = x - maxLineLength;\n            x -= lineWidths[0];\n          } else {\n            throw new Error('Unrecognized alignment option, use \"center\" or \"right\".');\n          }\n          prevX = x;\n          text = da[0] + \") Tj\\n\";\n          for ( i = 1, len = da.length ; i < len; i++ ) {\n            var delta = maxLineLength - lineWidths[i];\n            if( align === \"center\" ) delta /= 2;\n            // T* = x-offset leading Td ( text )\n            text += ( ( left - prevX ) + delta ) + \" -\" + leading + \" Td (\" + da[i];\n            prevX = left + delta;\n            if( i < len - 1 ) {\n              text += \") Tj\\n\";\n            }\n          }\n        } else {\n          text = da.join(\") Tj\\nT* (\");\n        }\n      } else {\n        throw new Error('Type of text must be string or Array. \"' + text + '\" is not recognized.');\n      }\n      // Using \"'\" (\"go next line and render text\" mark) would save space but would complicate our rendering code, templates\n\n      // BT .. ET does NOT have default settings for Tf. You must state that explicitely every time for BT .. ET\n      // if you want text transformation matrix (+ multiline) to work reliably (which reads sizes of things from font declarations)\n      // Thus, there is NO useful, *reliable* concept of \"default\" font for a page.\n      // The fact that \"default\" (reuse font used before) font worked before in basic cases is an accident\n      // - readers dealing smartly with brokenness of jsPDF's markup.\n\n      var curY;\n\n      if (todo){\n        //this.addPage();\n        //this._runningPageHeight += y -  (activeFontSize * 1.7);\n        //curY = f2(activeFontSize * 1.7);\n      } else {\n        curY = f2(y);\n      }\n      //curY = f2(((y - this._runningPageHeight));\n\n//\t\t\tif (curY < 0){\n//\t\t\t\tconsole.log('auto page break');\n//\t\t\t\tthis.addPage();\n//\t\t\t\tthis._runningPageHeight = y -  (activeFontSize * 1.7);\n//\t\t\t\tcurY = f2(activeFontSize * 1.7);\n//\t\t\t}\n\n      var translate = new Matrix(1, 0, 0, -1, x, curY);\n      transform = matrixMult(translate, transform);\n      var position = transform.toString() + \" Tm\";\n\n      out(\n          'BT\\n' +\n          (activeFontSize * lineHeightProportion) + ' TL\\n' +  // line spacing\n          strokeOption +// stroke option\n          position + '\\n(' +\n          text +\n          ') Tj\\nET');\n\n      if (todo) {\n        //this.text( todo, x, activeFontSize * 1.7);\n        //this.text( todo, x, this._runningPageHeight + (activeFontSize * 1.7));\n        this.text( todo, x, y);// + (activeFontSize * 1.7));\n      }\n\n      return this;\n    };\n\n\n\t\tAPI.lstext = function(text, x, y, spacing) {\n\t\t\tfor (var i = 0, len = text.length ; i < len; i++, x += spacing) this.text(text[i], x, y);\n\t\t};\n\n    /**\n     * Draw a line\n     * @param {number} x1\n     * @param {number} y1\n     * @param {number} x2\n     * @param {number} y2\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name line\n     */\n\t\tAPI.line = function(x1, y1, x2, y2) {\n\t\t\treturn this.lines([[x2 - x1, y2 - y1]], x1, y1, [1, 1], \"D\");\n\t\t};\n\n\t\tAPI.clip = function() {\n\t\t\t// By patrick-roberts, github.com/MrRio/jsPDF/issues/328\n\t\t\t// Call .clip() after calling .rect() with a style argument of null\n\t\t\tout('W'); // clip\n\t\t\tout('S'); // stroke path; necessary for clip to work\n\t\t};\n\n\n    /**\n     * @typedef {Object} PatternData\n     * {Matrix|undefined} matrix\n     * {Number|undefined} xStep\n     * {Number|undefined} yStep\n     * {Array.<Number>|undefined} boundingBox\n     */\n\n    /**\n     * Adds series of curves (straight lines or cubic bezier curves) to canvas, starting at `x`, `y` coordinates.\n     * All data points in `lines` are relative to last line origin.\n     * `x`, `y` become x1,y1 for first line / curve in the set.\n     * For lines you only need to specify [x2, y2] - (ending point) vector against x1, y1 starting point.\n     * For bezier curves you need to specify [x2,y2,x3,y3,x4,y4] - vectors to control points 1, 2, ending point. All vectors are against the start of the curve - x1,y1.\n     *\n     * @example .lines([[2,2],[-2,2],[1,1,2,2,3,3],[2,1]], 212,110, 10) // line, line, bezier curve, line\n     * @param {Array} lines Array of *vector* shifts as pairs (lines) or sextets (cubic bezier curves).\n     * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page\n     * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n     * @param {Number} scale (Defaults to [1.0,1.0]) x,y Scaling factor for all vectors. Elements can be any floating number Sub-one makes drawing smaller. Over-one grows the drawing. Negative flips the direction.\n     * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.\n     * @param {Boolean} closed If true, the path is closed with a straight line from the end of the last curve to the starting point.\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the path.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name lines\n     */\n\t\tAPI.lines = function(lines, x, y, scale, style, closed, patternKey, patternData) {\n\t\t\tvar scalex,scaley,i,l,leg,x2,y2,x3,y3,x4,y4;\n\n\t\t\t// Pre-August-2012 the order of arguments was function(x, y, lines, scale, style)\n\t\t\t// in effort to make all calls have similar signature like\n\t\t\t//   function(content, coordinateX, coordinateY , miscellaneous)\n\t\t\t// this method had its args flipped.\n\t\t\t// code below allows backward compatibility with old arg order.\n\t\t\tif (typeof lines === 'number') {\n        var tmp = y;\n\t\t\t\ty = x;\n\t\t\t\tx = lines;\n\t\t\t\tlines = tmp;\n\t\t\t}\n\n\t\t\tscale = scale || [1, 1];\n\n\t\t\t// starting point\n\t\t\tout(f3(x) + ' ' + f3(y) + ' m ');\n\n\t\t\tscalex = scale[0];\n\t\t\tscaley = scale[1];\n\t\t\tl = lines.length;\n\t\t\t//, x2, y2 // bezier only. In page default measurement \"units\", *after* scaling\n\t\t\t//, x3, y3 // bezier only. In page default measurement \"units\", *after* scaling\n\t\t\t// ending point for all, lines and bezier. . In page default measurement \"units\", *after* scaling\n\t\t\tx4 = x; // last / ending point = starting point for first item.\n\t\t\ty4 = y; // last / ending point = starting point for first item.\n\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\tleg = lines[i];\n\t\t\t\tif (leg.length === 2) {\n\t\t\t\t\t// simple line\n\t\t\t\t\tx4 = leg[0] * scalex + x4; // here last x4 was prior ending point\n\t\t\t\t\ty4 = leg[1] * scaley + y4; // here last y4 was prior ending point\n\t\t\t\t\tout(f3(x4) + ' ' + f3(y4) + ' l');\n\t\t\t\t} else {\n\t\t\t\t\t// bezier curve\n\t\t\t\t\tx2 = leg[0] * scalex + x4; // here last x4 is prior ending point\n\t\t\t\t\ty2 = leg[1] * scaley + y4; // here last y4 is prior ending point\n\t\t\t\t\tx3 = leg[2] * scalex + x4; // here last x4 is prior ending point\n\t\t\t\t\ty3 = leg[3] * scaley + y4; // here last y4 is prior ending point\n\t\t\t\t\tx4 = leg[4] * scalex + x4; // here last x4 was prior ending point\n\t\t\t\t\ty4 = leg[5] * scaley + y4; // here last y4 was prior ending point\n\t\t\t\t\tout(\n\t\t\t\t\t\tf3(x2) + ' ' +\n\t\t\t\t\t\tf3(y2) + ' ' +\n\t\t\t\t\t\tf3(x3) + ' ' +\n\t\t\t\t\t\tf3(y3) + ' ' +\n\t\t\t\t\t\tf3(x4) + ' ' +\n\t\t\t\t\t\tf3(y4) + ' c');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (closed) {\n\t\t\t\tout('h');\n\t\t\t}\n\n      putStyle(style, patternKey, patternData);\n\n\t\t\treturn this;\n\t\t};\n\n    /**\n     * Similar to {@link API.lines} but all coordinates are interpreted as absolute coordinates instead of relative.\n     * @param {Array<Object>} lines An array of {op: operator, c: coordinates} object, where op is one of \"m\" (move to), \"l\" (line to)\n     * \"c\" (cubic bezier curve) and \"h\" (close (sub)path)). c is an array of coordinates. \"m\" and \"l\" expect two, \"c\"\n     * six and \"h\" an empty array (or undefined).\n     * @param {String} style  The style\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the path.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name path\n     */\n    API.path = function (lines, style, patternKey, patternData) {\n\n      for (var i = 0; i < lines.length; i++) {\n        var leg = lines[i];\n        var coords = leg.c;\n        switch (leg.op) {\n          case \"m\":\n            // move\n            out(f3(coords[0]) + ' ' + f3(coords[1]) + ' m');\n            break;\n          case \"l\":\n            // simple line\n            out(f3(coords[0]) + ' ' + f3(coords[1]) + ' l');\n            break;\n          case \"c\":\n            // bezier curve\n            out([\n              f3(coords[0]),\n              f3(coords[1]),\n              f3(coords[2]),\n              f3(coords[3]),\n              f3(coords[4]),\n              f3(coords[5]),\n              \"c\"\n            ].join(\" \"));\n            break;\n          case \"h\":\n            // close path\n            out(\"h\");\n        }\n\n\n      }\n\n      putStyle(style, patternKey, patternData);\n\n      return this;\n    };\n\n\t\t/**\n\t\t * Adds a rectangle to PDF\n\t\t *\n\t\t * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {Number} w Width (in units declared at inception of PDF document)\n\t\t * @param {Number} h Height (in units declared at inception of PDF document)\n\t\t * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the primitive.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name rect\n\t\t */\n\t\tAPI.rect = function(x, y, w, h, style, patternKey, patternData) {\n\t\t\tout([\n\t\t\t\t\tf2(x),\n\t\t\t\t\tf2(y),\n\t\t\t\t\tf2(w),\n\t\t\t\t\tf2(-h),\n\t\t\t\t\t're'\n\t\t\t\t].join(' '));\n\n\t\t\tputStyle(style, patternKey, patternData);\n\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Adds a triangle to PDF\n\t\t *\n\t\t * @param {Number} x1 Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y1 Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {Number} x2 Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y2 Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {Number} x3 Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y3 Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the primitive.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name triangle\n\t\t */\n\t\tAPI.triangle = function(x1, y1, x2, y2, x3, y3, style, patternKey, patternData) {\n\t\t\tthis.lines(\n\t\t\t\t[\n\t\t\t\t\t[x2 - x1, y2 - y1], // vector to point 2\n\t\t\t\t\t[x3 - x2, y3 - y2], // vector to point 3\n\t\t\t\t\t[x1 - x3, y1 - y3]// closing vector back to point 1\n\t\t\t\t],\n\t\t\t\tx1,\n\t\t\t\ty1, // start of path\n\t\t\t\t[1, 1],\n\t\t\t\tstyle,\n\t\t\t\ttrue,\n        patternKey,\n        patternData\n      );\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Adds a rectangle with rounded corners to PDF\n\t\t *\n\t\t * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {Number} w Width (in units declared at inception of PDF document)\n\t\t * @param {Number} h Height (in units declared at inception of PDF document)\n\t\t * @param {Number} rx Radius along x axis (in units declared at inception of PDF document)\n\t\t * @param {Number} ry Radius along y axis (in units declared at inception of PDF document)\n\t\t * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the primitive.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name roundedRect\n\t\t */\n\t\tAPI.roundedRect = function(x, y, w, h, rx, ry, style, patternKey, patternData) {\n\t\t\tvar MyArc = 4 / 3 * (Math.SQRT2 - 1);\n\n      rx = Math.min(rx, w * 0.5);\n      ry = Math.min(ry, h * 0.5);\n\n\t\t\tthis.lines(\n\t\t\t\t[\n\t\t\t\t\t[(w - 2 * rx), 0],\n\t\t\t\t\t[(rx * MyArc), 0, rx, ry - (ry * MyArc), rx, ry],\n\t\t\t\t\t[0, (h - 2 * ry)],\n\t\t\t\t\t[0, (ry * MyArc),  - (rx * MyArc), ry, -rx, ry],\n\t\t\t\t\t[(-w + 2 * rx), 0],\n\t\t\t\t\t[ - (rx * MyArc), 0, -rx,  - (ry * MyArc), -rx, -ry],\n\t\t\t\t\t[0, (-h + 2 * ry)],\n\t\t\t\t\t[0,  - (ry * MyArc), (rx * MyArc), -ry, rx, -ry]\n\t\t\t\t],\n\t\t\t\tx + rx,\n\t\t\t\ty, // start of path\n\t\t\t\t[1, 1],\n\t\t\t\tstyle,\n        true,\n        patternKey,\n        patternData\n      );\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Adds an ellipse to PDF\n\t\t *\n\t\t * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {Number} rx Radius along x axis (in units declared at inception of PDF document)\n\t\t * @param {Number} ry Radius along y axis (in units declared at inception of PDF document)\n\t\t * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the primitive.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name ellipse\n\t\t */\n\t\tAPI.ellipse = function(x, y, rx, ry, style, patternKey, patternData) {\n\t\t\tvar lx = 4 / 3 * (Math.SQRT2 - 1) * rx,\n\t\t\t\tly = 4 / 3 * (Math.SQRT2 - 1) * ry;\n\n\t\t\tout([\n\t\t\t\t\tf2(x + rx),\n\t\t\t\t\tf2(y),\n\t\t\t\t\t'm',\n\t\t\t\t\tf2(x + rx),\n\t\t\t\t\tf2(y - ly),\n\t\t\t\t\tf2(x + lx),\n\t\t\t\t\tf2(y - ry),\n\t\t\t\t\tf2(x),\n\t\t\t\t\tf2(y - ry),\n\t\t\t\t\t'c'\n\t\t\t\t].join(' '));\n\t\t\tout([\n\t\t\t\t\tf2(x - lx),\n\t\t\t\t\tf2(y - ry),\n\t\t\t\t\tf2(x - rx),\n\t\t\t\t\tf2(y - ly),\n\t\t\t\t\tf2(x - rx),\n\t\t\t\t\tf2(y),\n\t\t\t\t\t'c'\n\t\t\t\t].join(' '));\n\t\t\tout([\n\t\t\t\t\tf2(x - rx),\n\t\t\t\t\tf2(y + ly),\n\t\t\t\t\tf2(x - lx),\n\t\t\t\t\tf2(y + ry),\n\t\t\t\t\tf2(x),\n\t\t\t\t\tf2(y + ry),\n\t\t\t\t\t'c'\n\t\t\t\t].join(' '));\n\t\t\tout([\n\t\t\t\t\tf2(x + lx),\n\t\t\t\t\tf2(y + ry),\n\t\t\t\t\tf2(x + rx),\n\t\t\t\t\tf2(y + ly),\n\t\t\t\t\tf2(x + rx),\n\t\t\t\t\tf2(y),\n\t\t\t\t\t'c'\n\t\t\t\t].join(' '));\n\n\t\t\tputStyle(style, patternKey, patternData);\n\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Adds an circle to PDF\n\t\t *\n\t\t * @param {Number} x Coordinate (in units declared at inception of PDF document) against left edge of the page\n\t\t * @param {Number} y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n\t\t * @param {Number} r Radius (in units declared at inception of PDF document)\n\t\t * @param {String} style A string specifying the painting style or null.  Valid styles include: 'S' [default] - stroke, 'F' - fill,  and 'DF' (or 'FD') -  fill then stroke. A null value postpones setting the style so that a shape may be composed using multiple method calls. The last drawing method call used to define the shape should not have a null style argument.\n     * @param {String} patternKey The pattern key for the pattern that should be used to fill the primitive.\n     * @param {Matrix|PatternData} patternData The matrix that transforms the pattern into user space, or an object that\n     * will modify the pattern on use.\n     * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name circle\n\t\t */\n\t\tAPI.circle = function(x, y, r, style, patternKey, patternData) {\n\t\t\treturn this.ellipse(x, y, r, r, style, patternKey, patternData);\n\t\t};\n\n\t\t/**\n\t\t * Adds a properties to the PDF document\n\t\t *\n\t\t * @param {Object} properties A property_name-to-property_value object structure.\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setProperties\n\t\t */\n\t\tAPI.setProperties = function(properties) {\n\t\t\t// copying only those properties we can render.\n\t\t\tfor (var property in documentProperties) {\n\t\t\t\tif (documentProperties.hasOwnProperty(property) && properties[property]) {\n\t\t\t\t\tdocumentProperties[property] = properties[property];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Sets font size for upcoming text elements.\n\t\t *\n\t\t * @param {Number} size Font size in points.\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setFontSize\n\t\t */\n\t\tAPI.setFontSize = function(size) {\n\t\t\tactiveFontSize = size;\n      out(\"/\" + activeFontKey + \" \" + activeFontSize + \" Tf\");\n      return this;\n\t\t};\n\n    API.getFontSize = function () {\n      return activeFontSize;\n    };\n\n\t\t/**\n\t\t * Sets text font face, variant for upcoming text elements.\n\t\t * See output of jsPDF.getFontList() for possible font names, styles.\n\t\t *\n\t\t * @param {String} fontName Font name or family. Example: \"times\"\n\t\t * @param {String} fontStyle Font style or variant. Example: \"italic\"\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setFont\n\t\t */\n\t\tAPI.setFont = function(fontName, fontStyle) {\n\t\t\tactiveFontKey = getFont(fontName, fontStyle);\n\t\t\t// if font is not found, the above line blows up and we never go further\n      out(\"/\" + activeFontKey + \" \" + activeFontSize + \" Tf\");\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Switches font style or variant for upcoming text elements,\n\t\t * while keeping the font face or family same.\n\t\t * See output of jsPDF.getFontList() for possible font names, styles.\n\t\t *\n\t\t * @param {String} style Font style or variant. Example: \"italic\"\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setFontStyle\n\t\t */\n\t\tAPI.setFontStyle = API.setFontType = function(style) {\n\t\t\tactiveFontKey = getFont(undefined, style);\n\t\t\t// if font is not found, the above line blows up and we never go further\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Returns an object - a tree of fontName to fontStyle relationships available to\n\t\t * active PDF document.\n\t\t *\n\t\t * @public\n\t\t * @function\n\t\t * @returns {Object} Like {'times':['normal', 'italic', ... ], 'arial':['normal', 'bold', ... ], ... }\n\t\t * @methodOf jsPDF#\n\t\t * @name getFontList\n\t\t */\n\t\tAPI.getFontList = function() {\n\t\t\t// TODO: iterate over fonts array or return copy of fontmap instead in case more are ever added.\n\t\t\tvar list = {},fontName,fontStyle,tmp;\n\n\t\t\tfor (fontName in fontmap) {\n\t\t\t\tif (fontmap.hasOwnProperty(fontName)) {\n\t\t\t\t\tlist[fontName] = tmp = [];\n\t\t\t\t\tfor (fontStyle in fontmap[fontName]) {\n\t\t\t\t\t\tif (fontmap[fontName].hasOwnProperty(fontStyle)) {\n\t\t\t\t\t\t\ttmp.push(fontStyle);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn list;\n\t\t};\n\n\t\t/**\n\t\t * Add a custom font.\n\t\t *\n\t\t * @param {String} postScriptName name of the Font.  Example: \"Menlo-Regular\"\n\t\t * @param {String} fontName of font-family from @font-face definition.  Example: \"Menlo Regular\"\n\t\t * @param {String} fontStyle style.  Example: \"normal\"\n\t\t * @function\n\t\t * @returns the {fontKey} (same as the internal method)\n\t\t * @methodOf jsPDF#\n\t\t * @name addFont\n\t\t */\n\t\tAPI.addFont = function(postScriptName, fontName, fontStyle) {\n\t\t  addFont(postScriptName, fontName, fontStyle, 'StandardEncoding');\n\t\t};\n\n\t\t/**\n\t\t * Sets line width for upcoming lines.\n\t\t *\n\t\t * @param {Number} width Line width (in units declared at inception of PDF document)\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setLineWidth\n\t\t */\n\t\tAPI.setLineWidth = function(width) {\n\t\t\tout(width.toFixed(2) + ' w');\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Sets the stroke color for upcoming elements.\n\t\t *\n\t\t * Depending on the number of arguments given, Gray, RGB, or CMYK\n\t\t * color space is implied.\n\t\t *\n\t\t * When only ch1 is given, \"Gray\" color space is implied and it\n\t\t * must be a value in the range from 0.00 (solid black) to to 1.00 (white)\n\t\t * if values are communicated as String types, or in range from 0 (black)\n\t\t * to 255 (white) if communicated as Number type.\n\t\t * The RGB-like 0-255 range is provided for backward compatibility.\n\t\t *\n\t\t * When only ch1,ch2,ch3 are given, \"RGB\" color space is implied and each\n\t\t * value must be in the range from 0.00 (minimum intensity) to to 1.00\n\t\t * (max intensity) if values are communicated as String types, or\n\t\t * from 0 (min intensity) to to 255 (max intensity) if values are communicated\n\t\t * as Number types.\n\t\t * The RGB-like 0-255 range is provided for backward compatibility.\n\t\t *\n\t\t * When ch1,ch2,ch3,ch4 are given, \"CMYK\" color space is implied and each\n\t\t * value must be a in the range from 0.00 (0% concentration) to to\n\t\t * 1.00 (100% concentration)\n\t\t *\n\t\t * Because JavaScript treats fixed point numbers badly (rounds to\n\t\t * floating point nearest to binary representation) it is highly advised to\n\t\t * communicate the fractional numbers as String types, not JavaScript Number type.\n\t\t *\n\t\t * @param {Number|String} ch1 Color channel value\n\t\t * @param {Number|String} ch2 Color channel value\n\t\t * @param {Number|String} ch3 Color channel value\n\t\t * @param {Number|String} ch4 Color channel value\n\t\t *\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setDrawColor\n\t\t */\n\t\tAPI.setDrawColor = function(ch1, ch2, ch3, ch4) {\n\t\t\tvar color;\n\t\t\tif (ch2 === undefined || (ch4 === undefined && ch1 === ch2 === ch3)) {\n\t\t\t\t// Gray color space.\n\t\t\t\tif (typeof ch1 === 'string') {\n\t\t\t\t\tcolor = ch1 + ' G';\n\t\t\t\t} else {\n\t\t\t\t\tcolor = f2(ch1 / 255) + ' G';\n\t\t\t\t}\n\t\t\t} else if (ch4 === undefined) {\n\t\t\t\t// RGB\n\t\t\t\tif (typeof ch1 === 'string') {\n\t\t\t\t\tcolor = [ch1, ch2, ch3, 'RG'].join(' ');\n\t\t\t\t} else {\n\t\t\t\t\tcolor = [f2(ch1 / 255), f2(ch2 / 255), f2(ch3 / 255), 'RG'].join(' ');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// CMYK\n\t\t\t\tif (typeof ch1 === 'string') {\n\t\t\t\t\tcolor = [ch1, ch2, ch3, ch4, 'K'].join(' ');\n\t\t\t\t} else {\n\t\t\t\t\tcolor = [f2(ch1), f2(ch2), f2(ch3), f2(ch4), 'K'].join(' ');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tout(color);\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Sets the fill color for upcoming elements.\n\t\t *\n\t\t * Depending on the number of arguments given, Gray, RGB, or CMYK\n\t\t * color space is implied.\n\t\t *\n\t\t * When only ch1 is given, \"Gray\" color space is implied and it\n\t\t * must be a value in the range from 0.00 (solid black) to to 1.00 (white)\n\t\t * if values are communicated as String types, or in range from 0 (black)\n\t\t * to 255 (white) if communicated as Number type.\n\t\t * The RGB-like 0-255 range is provided for backward compatibility.\n\t\t *\n\t\t * When only ch1,ch2,ch3 are given, \"RGB\" color space is implied and each\n\t\t * value must be in the range from 0.00 (minimum intensity) to to 1.00\n\t\t * (max intensity) if values are communicated as String types, or\n\t\t * from 0 (min intensity) to to 255 (max intensity) if values are communicated\n\t\t * as Number types.\n\t\t * The RGB-like 0-255 range is provided for backward compatibility.\n\t\t *\n\t\t * When ch1,ch2,ch3,ch4 are given, \"CMYK\" color space is implied and each\n\t\t * value must be a in the range from 0.00 (0% concentration) to to\n\t\t * 1.00 (100% concentration)\n\t\t *\n\t\t * Because JavaScript treats fixed point numbers badly (rounds to\n\t\t * floating point nearest to binary representation) it is highly advised to\n\t\t * communicate the fractional numbers as String types, not JavaScript Number type.\n\t\t *\n\t\t * @param {Number|String} ch1 Color channel value\n\t\t * @param {Number|String} ch2 Color channel value\n\t\t * @param {Number|String} ch3 Color channel value\n\t\t * @param {Number|String} ch4 Color channel value\n\t\t *\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setFillColor\n\t\t */\n\t\tAPI.setFillColor = function(ch1, ch2, ch3, ch4) {\n\t\t\tvar color;\n\n\t\t\tif (ch2 === undefined || (ch4 === undefined && ch1 === ch2 === ch3)) {\n\t\t\t\t// Gray color space.\n\t\t\t\tif (typeof ch1 === 'string') {\n\t\t\t\t\tcolor = ch1 + ' g';\n\t\t\t\t} else {\n\t\t\t\t\tcolor = f2(ch1 / 255) + ' g';\n\t\t\t\t}\n\t\t\t} else if (ch4 === undefined || typeof ch4 === 'object') {\n\t\t\t\t// RGB\n\t\t\t\tif (typeof ch1 === 'string') {\n\t\t\t\t\tcolor = [ch1, ch2, ch3, 'rg'].join(' ');\n\t\t\t\t} else {\n\t\t\t\t\tcolor = [f2(ch1 / 255), f2(ch2 / 255), f2(ch3 / 255), 'rg'].join(' ');\n\t\t\t\t}\n\t\t\t\tif (ch4 && ch4.a === 0){\n\t\t\t\t\t//TODO Implement transparency.\n\t\t\t\t\t//WORKAROUND use white for now\n\t\t\t\t\tcolor = ['255', '255', '255', 'rg'].join(' ');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// CMYK\n\t\t\t\tif (typeof ch1 === 'string') {\n\t\t\t\t\tcolor = [ch1, ch2, ch3, ch4, 'k'].join(' ');\n\t\t\t\t} else {\n\t\t\t\t\tcolor = [f2(ch1), f2(ch2), f2(ch3), f2(ch4), 'k'].join(' ');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tout(color);\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Sets the text color for upcoming elements.\n\t\t * If only one, first argument is given,\n\t\t * treats the value as gray-scale color value.\n\t\t *\n\t\t * @param {Number} r Red channel color value in range 0-255 or {String} r color value in hexadecimal, example: '#FFFFFF'\n\t\t * @param {Number} g Green channel color value in range 0-255\n\t\t * @param {Number} b Blue channel color value in range 0-255\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setTextColor\n\t\t */\n\t\tAPI.setTextColor = function(r, g, b) {\n\t\t\tif ((typeof r === 'string') && /^#[0-9A-Fa-f]{6}$/.test(r)) {\n\t\t\t\tvar hex = parseInt(r.substr(1), 16);\n\t\t\t\tr = (hex >> 16) & 255;\n\t\t\t\tg = (hex >> 8) & 255;\n\t\t\t\tb = (hex & 255);\n\t\t\t}\n\n\t\t\tif ((r === 0 && g === 0 && b === 0) || (typeof g === 'undefined')) {\n\t\t\t\ttextColor = f3(r / 255) + ' g';\n\t\t\t} else {\n\t\t\t\ttextColor = [f3(r / 255), f3(g / 255), f3(b / 255), 'rg'].join(' ');\n\t\t\t}\n\n      out(textColor);\n\n\t\t\treturn this;\n\t\t};\n\n    /**\n     * Sets a either previously added {@link GState} (via {@link addGState}) or a new {@link GState}.\n     * @param {String|GState} gState If type is string, a previously added GState is used, if type is GState\n     * it will be added before use.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name setGState\n     */\n    API.setGState = function (gState) {\n      if (typeof  gState === \"string\") {\n        gState = gStates[gStatesMap[gState]];\n      } else {\n        gState = addGState(null, gState);\n      }\n\n      if (!gState.equals(activeGState)) {\n        out(\"/\" + gState.id + \" gs\");\n        activeGState = gState;\n      }\n    };\n\n\t\t/**\n\t\t * Is an Object providing a mapping from human-readable to\n\t\t * integer flag values designating the varieties of line cap\n\t\t * and join styles.\n\t\t *\n\t\t * @returns {Object}\n\t\t * @fieldOf jsPDF#\n\t\t * @name CapJoinStyles\n\t\t */\n\t\tAPI.CapJoinStyles = {\n\t\t\t0 : 0,\n\t\t\t'butt' : 0,\n\t\t\t'but' : 0,\n\t\t\t'miter' : 0,\n\t\t\t1 : 1,\n\t\t\t'round' : 1,\n\t\t\t'rounded' : 1,\n\t\t\t'circle' : 1,\n\t\t\t2 : 2,\n\t\t\t'projecting' : 2,\n\t\t\t'project' : 2,\n\t\t\t'square' : 2,\n\t\t\t'bevel' : 2\n\t\t};\n\n\t\t/**\n\t\t * Sets the line cap styles\n\t\t * See {jsPDF.CapJoinStyles} for variants\n\t\t *\n\t\t * @param {String|Number} style A string or number identifying the type of line cap\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setLineCap\n\t\t */\n\t\tAPI.setLineCap = function(style) {\n\t\t\tvar id = this.CapJoinStyles[style];\n\t\t\tif (id === undefined) {\n\t\t\t\tthrow new Error(\"Line cap style of '\" + style + \"' is not recognized. See or extend .CapJoinStyles property for valid styles\");\n\t\t\t}\n\t\t\tlineCapID = id;\n\t\t\tout(id + ' J');\n\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * Sets the line join styles\n\t\t * See {jsPDF.CapJoinStyles} for variants\n\t\t *\n\t\t * @param {String|Number} style A string or number identifying the type of line join\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name setLineJoin\n\t\t */\n\t\tAPI.setLineJoin = function(style) {\n\t\t\tvar id = this.CapJoinStyles[style];\n\t\t\tif (id === undefined) {\n\t\t\t\tthrow new Error(\"Line join style of '\" + style + \"' is not recognized. See or extend .CapJoinStyles property for valid styles\");\n\t\t\t}\n\t\t\tlineJoinID = id;\n\t\t\tout(id + ' j');\n\n\t\t\treturn this;\n\t\t};\n\n    /**\n     * Sets the miter limit.\n     * @param {number} miterLimit\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name setMiterLimit\n     */\n    API.setLineMiterLimit = function (miterLimit) {\n      out(f2(miterLimit) + \" M\");\n\n      return this;\n    };\n\n    /**\n     * Sets the line dash pattern.\n     * @param {Array<number>} array An array containing 0-2 numbers. The first number sets the length of the\n     * dashes, the second number the length of the gaps. If the second number is missing, the gaps are considered\n     * to be as long as the dashes. An empty array means solid, unbroken lines.\n     * @param phase The phase lines start with.\n     * @function\n     * @returns {jsPDF}\n     * @methodOf jsPDF#\n     * @name setLineDashPattern\n     */\n    API.setLineDashPattern = function (array, phase) {\n      out([\n        \"[\" + (array[0] !== undefined ? array[0] : \"\"),\n        (array[1] !== undefined ? array[1] : \"\" ) + \"]\",\n        phase,\n        \"d\"\n      ].join(\" \"));\n\n      return this;\n    };\n\n\t\t// Output is both an internal (for plugins) and external function\n\t\tAPI.output = output;\n\n\t\t/**\n\t\t * Saves as PDF document. An alias of jsPDF.output('save', 'filename.pdf')\n\t\t * @param  {String} filename The filename including extension.\n\t\t *\n\t\t * @function\n\t\t * @returns {jsPDF}\n\t\t * @methodOf jsPDF#\n\t\t * @name save\n\t\t */\n\t\tAPI.save = function(filename) {\n\t\t\tAPI.output('save', filename);\n\t\t};\n\n\t\t// applying plugins (more methods) ON TOP of built-in API.\n\t\t// this is intentional as we allow plugins to override\n\t\t// built-ins\n\t\tfor (var plugin in jsPDF.API) {\n\t\t\tif (jsPDF.API.hasOwnProperty(plugin)) {\n\t\t\t\tif (plugin === 'events' && jsPDF.API.events.length) {\n\t\t\t\t\t(function(events, newEvents) {\n\n\t\t\t\t\t\t// jsPDF.API.events is a JS Array of Arrays\n\t\t\t\t\t\t// where each Array is a pair of event name, handler\n\t\t\t\t\t\t// Events were added by plugins to the jsPDF instantiator.\n\t\t\t\t\t\t// These are always added to the new instance and some ran\n\t\t\t\t\t\t// during instantiation.\n\t\t\t\t\t\tvar eventname,handler_and_args,i;\n\n\t\t\t\t\t\tfor (i = newEvents.length - 1; i !== -1; i--) {\n\t\t\t\t\t\t\t// subscribe takes 3 args: 'topic', function, runonce_flag\n\t\t\t\t\t\t\t// if undefined, runonce is false.\n\t\t\t\t\t\t\t// users can attach callback directly,\n\t\t\t\t\t\t\t// or they can attach an array with [callback, runonce_flag]\n\t\t\t\t\t\t\t// that's what the \"apply\" magic is for below.\n\t\t\t\t\t\t\teventname = newEvents[i][0];\n\t\t\t\t\t\t\thandler_and_args = newEvents[i][1];\n\t\t\t\t\t\t\tevents.subscribe.apply(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t\t[eventname].concat(\n\t\t\t\t\t\t\t\t\ttypeof handler_and_args === 'function' ?\n\t\t\t\t\t\t\t\t\t\t[handler_and_args] : handler_and_args));\n\t\t\t\t\t\t}\n\t\t\t\t\t}(events, jsPDF.API.events));\n\t\t\t\t} else {\n\t\t\t\t\tAPI[plugin] = jsPDF.API[plugin];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//////////////////////////////////////////////////////\n\t\t// continuing initialization of jsPDF Document object\n\t\t//////////////////////////////////////////////////////\n\t\t// Add the first page automatically\n\t\taddFonts();\n\t\tactiveFontKey = 'F1';\n\t\t_addPage(format, orientation);\n\n\t\tevents.publish('initialized');\n\t\treturn API;\n\t}\n\n\t/**\n\t * jsPDF.API is a STATIC property of jsPDF class.\n\t * jsPDF.API is an object you can add methods and properties to.\n\t * The methods / properties you add will show up in new jsPDF objects.\n\t *\n\t * One property is prepopulated. It is the 'events' Object. Plugin authors can add topics,\n\t * callbacks to this object. These will be reassigned to all new instances of jsPDF.\n\t * Examples:\n\t * jsPDF.API.events['initialized'] = function(){ 'this' is API object }\n\t * jsPDF.API.events['addFont'] = function(added_font_object){ 'this' is API object }\n\t *\n\t * @static\n\t * @public\n\t * @memberOf jsPDF\n\t * @name API\n\t *\n\t * @example\n\t * jsPDF.API.mymethod = function(){\n\t *   // 'this' will be ref to internal API object. see jsPDF source\n\t *   // , so you can refer to built-in methods like so:\n\t *   //     this.line(....)\n\t *   //     this.text(....)\n\t * }\n\t * var pdfdoc = new jsPDF()\n\t * pdfdoc.mymethod() // <- !!!!!!\n\t */\n\tjsPDF.API = {events:[]};\n\tjsPDF.version = \"1.0.0-trunk\";\n\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('jsPDF', function() {\n\t\t\treturn jsPDF;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = jsPDF;\n\t} else {\n\t\tglobal.jsPDF = jsPDF;\n\t}\n\treturn jsPDF;\n}(typeof self !== \"undefined\" && self || typeof window !== \"undefined\" && window || this));\n"
  },
  {
    "path": "assets/highcharts/lib/rgbcolor.js",
    "content": "/*\n\n A class to parse color values\n @author Stoyan Stefanov <sstoo@gmail.com>\n @link   http://www.phpied.com/rgb-color-parser-in-javascript/\n @license Use it if you like it\n*/\n(function(f){function g(b){this.ok=!1;\"#\"==b.charAt(0)&&(b=b.substr(1,6));b=b.replace(/ /g,\"\");b=b.toLowerCase();var m={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\",\ndarkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dodgerblue:\"1e90ff\",feldspar:\"d19275\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"ff00ff\",\ngainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"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\",lightgrey:\"d3d3d3\",lightgreen:\"90ee90\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",\nlightslateblue:\"8470ff\",lightslategray:\"778899\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"00ff00\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"ff00ff\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370d8\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",\noldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"d87093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",red:\"ff0000\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",\nslategray:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",violetred:\"d02090\",wheat:\"f5deb3\",white:\"ffffff\",whitesmoke:\"f5f5f5\",yellow:\"ffff00\",yellowgreen:\"9acd32\"},e;for(e in m)b==e&&(b=m[e]);var h=[{re:/^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,example:[\"rgb(123, 234, 45)\",\"rgb(255,234,245)\"],process:function(a){return[parseInt(a[1]),parseInt(a[2]),parseInt(a[3])]}},{re:/^(\\w{2})(\\w{2})(\\w{2})$/,\nexample:[\"#00ff00\",\"336699\"],process:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}},{re:/^(\\w{1})(\\w{1})(\\w{1})$/,example:[\"#fb0\",\"f0f\"],process:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}}];for(e=0;e<h.length;e++){var f=h[e].process,k=h[e].re.exec(b);k&&(channels=f(k),this.r=channels[0],this.g=channels[1],this.b=channels[2],this.ok=!0)}this.r=0>this.r||isNaN(this.r)?0:255<this.r?255:this.r;this.g=0>this.g||isNaN(this.g)?0:\n255<this.g?255:this.g;this.b=0>this.b||isNaN(this.b)?0:255<this.b?255:this.b;this.toRGB=function(){return\"rgb(\"+this.r+\", \"+this.g+\", \"+this.b+\")\"};this.toHex=function(){var a=this.r.toString(16),c=this.g.toString(16),d=this.b.toString(16);1==a.length&&(a=\"0\"+a);1==c.length&&(c=\"0\"+c);1==d.length&&(d=\"0\"+d);return\"#\"+a+c+d};this.getHelpXML=function(){for(var a=[],c=0;c<h.length;c++)for(var d=h[c].example,b=0;b<d.length;b++)a[a.length]=d[b];for(var e in m)a[a.length]=e;d=document.createElement(\"ul\");\nd.setAttribute(\"id\",\"rgbcolor-examples\");for(c=0;c<a.length;c++)try{var f=document.createElement(\"li\"),l=new g(a[c]),n=document.createElement(\"div\");n.style.cssText=\"margin: 3px; border: 1px solid black; background:\"+l.toHex()+\"; color:\"+l.toHex();n.appendChild(document.createTextNode(\"test\"));var k=document.createTextNode(\" \"+a[c]+\" -> \"+l.toRGB()+\" -> \"+l.toHex());f.appendChild(n);f.appendChild(k);d.appendChild(f)}catch(p){}return d}}\"function\"===typeof define&&define.amd?define(function(){return g}):\n\"undefined\"!==typeof module&&module.exports?module.exports=g:f.RGBColor=g;return g})(\"undefined\"!==typeof self&&self||\"undefined\"!==typeof window&&window||this);\n"
  },
  {
    "path": "assets/highcharts/lib/rgbcolor.src.js",
    "content": "/** @preserve\n * A class to parse color values\n * @author Stoyan Stefanov <sstoo@gmail.com>\n * @link   http://www.phpied.com/rgb-color-parser-in-javascript/\n * @license Use it if you like it\n */\n(function (global) {\nfunction RGBColor(color_string)\n{\n  this.ok = false;\n\n  // strip any leading #\n  if (color_string.charAt(0) == '#') { // remove # if any\n    color_string = color_string.substr(1,6);\n  }\n\n  color_string = color_string.replace(/ /g,'');\n  color_string = color_string.toLowerCase();\n\n  // before getting into regexps, try simple matches\n  // and overwrite the input\n  var simple_colors = {\n    aliceblue: 'f0f8ff',\n    antiquewhite: 'faebd7',\n    aqua: '00ffff',\n    aquamarine: '7fffd4',\n    azure: 'f0ffff',\n    beige: 'f5f5dc',\n    bisque: 'ffe4c4',\n    black: '000000',\n    blanchedalmond: 'ffebcd',\n    blue: '0000ff',\n    blueviolet: '8a2be2',\n    brown: 'a52a2a',\n    burlywood: 'deb887',\n    cadetblue: '5f9ea0',\n    chartreuse: '7fff00',\n    chocolate: 'd2691e',\n    coral: 'ff7f50',\n    cornflowerblue: '6495ed',\n    cornsilk: 'fff8dc',\n    crimson: 'dc143c',\n    cyan: '00ffff',\n    darkblue: '00008b',\n    darkcyan: '008b8b',\n    darkgoldenrod: 'b8860b',\n    darkgray: 'a9a9a9',\n    darkgreen: '006400',\n    darkkhaki: 'bdb76b',\n    darkmagenta: '8b008b',\n    darkolivegreen: '556b2f',\n    darkorange: 'ff8c00',\n    darkorchid: '9932cc',\n    darkred: '8b0000',\n    darksalmon: 'e9967a',\n    darkseagreen: '8fbc8f',\n    darkslateblue: '483d8b',\n    darkslategray: '2f4f4f',\n    darkturquoise: '00ced1',\n    darkviolet: '9400d3',\n    deeppink: 'ff1493',\n    deepskyblue: '00bfff',\n    dimgray: '696969',\n    dodgerblue: '1e90ff',\n    feldspar: 'd19275',\n    firebrick: 'b22222',\n    floralwhite: 'fffaf0',\n    forestgreen: '228b22',\n    fuchsia: 'ff00ff',\n    gainsboro: 'dcdcdc',\n    ghostwhite: 'f8f8ff',\n    gold: 'ffd700',\n    goldenrod: 'daa520',\n    gray: '808080',\n    green: '008000',\n    greenyellow: 'adff2f',\n    honeydew: 'f0fff0',\n    hotpink: 'ff69b4',\n    indianred : 'cd5c5c',\n    indigo : '4b0082',\n    ivory: 'fffff0',\n    khaki: 'f0e68c',\n    lavender: 'e6e6fa',\n    lavenderblush: 'fff0f5',\n    lawngreen: '7cfc00',\n    lemonchiffon: 'fffacd',\n    lightblue: 'add8e6',\n    lightcoral: 'f08080',\n    lightcyan: 'e0ffff',\n    lightgoldenrodyellow: 'fafad2',\n    lightgrey: 'd3d3d3',\n    lightgreen: '90ee90',\n    lightpink: 'ffb6c1',\n    lightsalmon: 'ffa07a',\n    lightseagreen: '20b2aa',\n    lightskyblue: '87cefa',\n    lightslateblue: '8470ff',\n    lightslategray: '778899',\n    lightsteelblue: 'b0c4de',\n    lightyellow: 'ffffe0',\n    lime: '00ff00',\n    limegreen: '32cd32',\n    linen: 'faf0e6',\n    magenta: 'ff00ff',\n    maroon: '800000',\n    mediumaquamarine: '66cdaa',\n    mediumblue: '0000cd',\n    mediumorchid: 'ba55d3',\n    mediumpurple: '9370d8',\n    mediumseagreen: '3cb371',\n    mediumslateblue: '7b68ee',\n    mediumspringgreen: '00fa9a',\n    mediumturquoise: '48d1cc',\n    mediumvioletred: 'c71585',\n    midnightblue: '191970',\n    mintcream: 'f5fffa',\n    mistyrose: 'ffe4e1',\n    moccasin: 'ffe4b5',\n    navajowhite: 'ffdead',\n    navy: '000080',\n    oldlace: 'fdf5e6',\n    olive: '808000',\n    olivedrab: '6b8e23',\n    orange: 'ffa500',\n    orangered: 'ff4500',\n    orchid: 'da70d6',\n    palegoldenrod: 'eee8aa',\n    palegreen: '98fb98',\n    paleturquoise: 'afeeee',\n    palevioletred: 'd87093',\n    papayawhip: 'ffefd5',\n    peachpuff: 'ffdab9',\n    peru: 'cd853f',\n    pink: 'ffc0cb',\n    plum: 'dda0dd',\n    powderblue: 'b0e0e6',\n    purple: '800080',\n    red: 'ff0000',\n    rosybrown: 'bc8f8f',\n    royalblue: '4169e1',\n    saddlebrown: '8b4513',\n    salmon: 'fa8072',\n    sandybrown: 'f4a460',\n    seagreen: '2e8b57',\n    seashell: 'fff5ee',\n    sienna: 'a0522d',\n    silver: 'c0c0c0',\n    skyblue: '87ceeb',\n    slateblue: '6a5acd',\n    slategray: '708090',\n    snow: 'fffafa',\n    springgreen: '00ff7f',\n    steelblue: '4682b4',\n    tan: 'd2b48c',\n    teal: '008080',\n    thistle: 'd8bfd8',\n    tomato: 'ff6347',\n    turquoise: '40e0d0',\n    violet: 'ee82ee',\n    violetred: 'd02090',\n    wheat: 'f5deb3',\n    white: 'ffffff',\n    whitesmoke: 'f5f5f5',\n    yellow: 'ffff00',\n    yellowgreen: '9acd32'\n  };\n  for (var key in simple_colors) {\n    if (color_string == key) {\n      color_string = simple_colors[key];\n    }\n  }\n  // emd of simple type-in colors\n\n  // array of color definition objects\n  var color_defs = [\n    {\n      re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n      example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n      process: function (bits){\n        return [\n          parseInt(bits[1]),\n          parseInt(bits[2]),\n          parseInt(bits[3])\n        ];\n      }\n    },\n    {\n      re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n      example: ['#00ff00', '336699'],\n      process: function (bits){\n        return [\n          parseInt(bits[1], 16),\n          parseInt(bits[2], 16),\n          parseInt(bits[3], 16)\n        ];\n      }\n    },\n    {\n      re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n      example: ['#fb0', 'f0f'],\n      process: function (bits){\n        return [\n          parseInt(bits[1] + bits[1], 16),\n          parseInt(bits[2] + bits[2], 16),\n          parseInt(bits[3] + bits[3], 16)\n        ];\n      }\n    }\n  ];\n\n  // search through the definitions to find a match\n  for (var i = 0; i < color_defs.length; i++) {\n    var re = color_defs[i].re;\n    var processor = color_defs[i].process;\n    var bits = re.exec(color_string);\n    if (bits) {\n      channels = processor(bits);\n      this.r = channels[0];\n      this.g = channels[1];\n      this.b = channels[2];\n      this.ok = true;\n    }\n\n  }\n\n  // validate/cleanup values\n  this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n  this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n  this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n\n  // some getters\n  this.toRGB = function () {\n    return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n  }\n  this.toHex = function () {\n    var r = this.r.toString(16);\n    var g = this.g.toString(16);\n    var b = this.b.toString(16);\n    if (r.length == 1) r = '0' + r;\n    if (g.length == 1) g = '0' + g;\n    if (b.length == 1) b = '0' + b;\n    return '#' + r + g + b;\n  }\n\n  // help\n  this.getHelpXML = function () {\n\n    var examples = new Array();\n    // add regexps\n    for (var i = 0; i < color_defs.length; i++) {\n      var example = color_defs[i].example;\n      for (var j = 0; j < example.length; j++) {\n        examples[examples.length] = example[j];\n      }\n    }\n    // add type-in colors\n    for (var sc in simple_colors) {\n      examples[examples.length] = sc;\n    }\n\n    var xml = document.createElement('ul');\n    xml.setAttribute('id', 'rgbcolor-examples');\n    for (var i = 0; i < examples.length; i++) {\n      try {\n        var list_item = document.createElement('li');\n        var list_color = new RGBColor(examples[i]);\n        var example_div = document.createElement('div');\n        example_div.style.cssText =\n            'margin: 3px; '\n            + 'border: 1px solid black; '\n            + 'background:' + list_color.toHex() + '; '\n            + 'color:' + list_color.toHex()\n        ;\n        example_div.appendChild(document.createTextNode('test'));\n        var list_item_value = document.createTextNode(\n            ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()\n        );\n        list_item.appendChild(example_div);\n        list_item.appendChild(list_item_value);\n        xml.appendChild(list_item);\n\n      } catch(e){}\n    }\n    return xml;\n\n  }\n\n}\nif (typeof define === \"function\" && define.amd) {\n  define(function () {\n    return RGBColor;\n  });\n} else if (typeof module !== \"undefined\" && module.exports) {\n  module.exports = RGBColor;\n} else {\n  global.RGBColor = RGBColor;\n}\nreturn RGBColor;\n})(typeof self !== \"undefined\" && self || typeof window !== \"undefined\" && window || this);\n"
  },
  {
    "path": "assets/highcharts/lib/svg2pdf.js",
    "content": "/**\n * Modules in this bundle\n * @license\n *\n * svg2pdf.js:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: yFiles for HTML Support Team <yfileshtml@yworks.com>\n *   homepage: https://github.com/yWorks/svg2pdf.js#readme\n *   version: 1.0.5\n *\n * svgpath:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   maintainers: vitaly <vitaly@rcdesign.ru>\n *   homepage: https://github.com/fontello/svgpath#readme\n *   version: 2.2.1\n *\n * This header is generated by licensify (https://github.com/twada/licensify)\n */\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var e;e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,e.svg2pdf=t()}}(function(){var t;return function t(e,r,a){function i(s,o){if(!r[s]){if(!e[s]){var u=\"function\"==typeof require&&require;if(!o&&u)return u(s,!0);if(n)return n(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var h=r[s]={exports:{}};e[s][0].call(h.exports,function(t){var r=e[s][1][t];return i(r||t)},h,h.exports,t,e,r,a)}return r[s].exports}for(var n=\"function\"==typeof require&&require,s=0;s<a.length;s++)i(a[s]);return i}({1:[function(t,e,r){\"use strict\";e.exports=t(\"./lib/svgpath\")},{\"./lib/svgpath\":6}],2:[function(t,e,r){\"use strict\";function a(t,e,r,a){var i=t*a-e*r<0?-1:1,n=Math.sqrt(t*t+e*e),s=Math.sqrt(t*t+e*e),o=t*r+e*a,u=o/(n*s);return u>1&&(u=1),u<-1&&(u=-1),i*Math.acos(u)}function i(t,e,r,i,n,o,u,c,h,f){var l=f*(t-r)/2+h*(e-i)/2,d=-h*(t-r)/2+f*(e-i)/2,g=u*u,p=c*c,b=l*l,x=d*d,m=g*p-g*x-p*b;m<0&&(m=0),m/=g*x+p*b,m=Math.sqrt(m)*(n===o?-1:1);var v=m*u/c*d,y=m*-c/u*l,A=f*v-h*y+(t+r)/2,w=h*v+f*y+(e+i)/2,k=(l-v)/u,M=(d-y)/c,F=(-l-v)/u,C=(-d-y)/c,S=a(1,0,k,M),I=a(k,M,F,C);return 0===o&&I>0&&(I-=s),1===o&&I<0&&(I+=s),[A,w,S,I]}function n(t,e){var r=4/3*Math.tan(e/4),a=Math.cos(t),i=Math.sin(t),n=Math.cos(t+e),s=Math.sin(t+e);return[a,i,a-i*r,i+a*r,n+s*r,s-n*r,n,s]}var s=2*Math.PI;e.exports=function(t,e,r,a,o,u,c,h,f){var l=Math.sin(f*s/360),d=Math.cos(f*s/360),g=d*(t-r)/2+l*(e-a)/2,p=-l*(t-r)/2+d*(e-a)/2;if(0===g&&0===p)return[];if(0===c||0===h)return[];c=Math.abs(c),h=Math.abs(h);var b=g*g/(c*c)+p*p/(h*h);b>1&&(c*=Math.sqrt(b),h*=Math.sqrt(b));var x=i(t,e,r,a,o,u,c,h,l,d),m=[],v=x[2],y=x[3],A=Math.max(Math.ceil(Math.abs(y)/(s/4)),1);y/=A;for(var w=0;w<A;w++)m.push(n(v,y)),v+=y;return m.map(function(t){for(var e=0;e<t.length;e+=2){var r=t[e+0],a=t[e+1];r*=c,a*=h;var i=d*r-l*a,n=l*r+d*a;t[e+0]=i+x[0],t[e+1]=n+x[1]}return t})}},{}],3:[function(t,e,r){\"use strict\";function a(t,e,r){if(!(this instanceof a))return new a(t,e,r);this.rx=t,this.ry=e,this.ax=r}var i=Math.PI/180;a.prototype.transform=function(t){var e=Math.cos(this.ax*i),r=Math.sin(this.ax*i),a=[this.rx*(t[0]*e+t[2]*r),this.rx*(t[1]*e+t[3]*r),this.ry*(-t[0]*r+t[2]*e),this.ry*(-t[1]*r+t[3]*e)],n=a[0]*a[0]+a[2]*a[2],s=a[1]*a[1]+a[3]*a[3],o=((a[0]-a[3])*(a[0]-a[3])+(a[2]+a[1])*(a[2]+a[1]))*((a[0]+a[3])*(a[0]+a[3])+(a[2]-a[1])*(a[2]-a[1])),u=(n+s)/2;if(o<1e-10*u)return this.rx=this.ry=Math.sqrt(u),this.ax=0,this;var c=a[0]*a[1]+a[2]*a[3];o=Math.sqrt(o);var h=u+o/2,f=u-o/2;return this.ax=Math.abs(c)<1e-10&&Math.abs(h-s)<1e-10?90:180*Math.atan(Math.abs(c)>Math.abs(h-s)?(h-n)/c:c/(h-s))/Math.PI,this.ax>=0?(this.rx=Math.sqrt(h),this.ry=Math.sqrt(f)):(this.ax+=90,this.rx=Math.sqrt(f),this.ry=Math.sqrt(h)),this},a.prototype.isDegenerate=function(){return this.rx<1e-10*this.ry||this.ry<1e-10*this.rx},e.exports=a},{}],4:[function(t,e,r){\"use strict\";function a(t,e){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],t[0]*e[4]+t[2]*e[5]+t[4],t[1]*e[4]+t[3]*e[5]+t[5]]}function i(){if(!(this instanceof i))return new i;this.queue=[],this.cache=null}i.prototype.matrix=function(t){return 1===t[0]&&0===t[1]&&0===t[2]&&1===t[3]&&0===t[4]&&0===t[5]?this:(this.cache=null,this.queue.push(t),this)},i.prototype.translate=function(t,e){return 0===t&&0===e||(this.cache=null,this.queue.push([1,0,0,1,t,e])),this},i.prototype.scale=function(t,e){return 1===t&&1===e||(this.cache=null,this.queue.push([t,0,0,e,0,0])),this},i.prototype.rotate=function(t,e,r){var a,i,n;return 0!==t&&(this.translate(e,r),a=t*Math.PI/180,i=Math.cos(a),n=Math.sin(a),this.queue.push([i,n,-n,i,0,0]),this.cache=null,this.translate(-e,-r)),this},i.prototype.skewX=function(t){return 0!==t&&(this.cache=null,this.queue.push([1,0,Math.tan(t*Math.PI/180),1,0,0])),this},i.prototype.skewY=function(t){return 0!==t&&(this.cache=null,this.queue.push([1,Math.tan(t*Math.PI/180),0,1,0,0])),this},i.prototype.toArray=function(){if(this.cache)return this.cache;if(!this.queue.length)return this.cache=[1,0,0,1,0,0],this.cache;if(this.cache=this.queue[0],1===this.queue.length)return this.cache;for(var t=1;t<this.queue.length;t++)this.cache=a(this.cache,this.queue[t]);return this.cache},i.prototype.calc=function(t,e,r){var a;return this.queue.length?(this.cache||(this.cache=this.toArray()),a=this.cache,[t*a[0]+e*a[2]+(r?0:a[4]),t*a[1]+e*a[3]+(r?0:a[5])]):[t,e]},e.exports=i},{}],5:[function(t,e,r){\"use strict\";function a(t){return 10===t||13===t||8232===t||8233===t||32===t||9===t||11===t||12===t||160===t||t>=5760&&d.indexOf(t)>=0}function i(t){switch(32|t){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:case 114:return!0}return!1}function n(t){return t>=48&&t<=57}function s(t){return t>=48&&t<=57||43===t||45===t||46===t}function o(t){this.index=0,this.path=t,this.max=t.length,this.result=[],this.param=0,this.err=\"\",this.segmentStart=0,this.data=[]}function u(t){for(;t.index<t.max&&a(t.path.charCodeAt(t.index));)t.index++}function c(t){var e,r=t.index,a=r,i=t.max,s=!1,o=!1,u=!1,c=!1;if(a>=i)return void(t.err=\"SvgPath: missed param (at pos \"+a+\")\");if(e=t.path.charCodeAt(a),43!==e&&45!==e||(a++,e=a<i?t.path.charCodeAt(a):0),!n(e)&&46!==e)return void(t.err=\"SvgPath: param should start with 0..9 or `.` (at pos \"+a+\")\");if(46!==e){if(s=48===e,a++,e=a<i?t.path.charCodeAt(a):0,s&&a<i&&e&&n(e))return void(t.err=\"SvgPath: numbers started with `0` such as `09` are ilegal (at pos \"+r+\")\");for(;a<i&&n(t.path.charCodeAt(a));)a++,o=!0;e=a<i?t.path.charCodeAt(a):0}if(46===e){for(c=!0,a++;n(t.path.charCodeAt(a));)a++,u=!0;e=a<i?t.path.charCodeAt(a):0}if(101===e||69===e){if(c&&!o&&!u)return void(t.err=\"SvgPath: invalid float exponent (at pos \"+a+\")\");if(a++,e=a<i?t.path.charCodeAt(a):0,43!==e&&45!==e||a++,!(a<i&&n(t.path.charCodeAt(a))))return void(t.err=\"SvgPath: invalid float exponent (at pos \"+a+\")\");for(;a<i&&n(t.path.charCodeAt(a));)a++}t.index=a,t.param=parseFloat(t.path.slice(r,a))+0}function h(t){var e,r;e=t.path[t.segmentStart],r=e.toLowerCase();var a=t.data;if(\"m\"===r&&a.length>2&&(t.result.push([e,a[0],a[1]]),a=a.slice(2),r=\"l\",e=\"m\"===e?\"l\":\"L\"),\"r\"===r)t.result.push([e].concat(a));else for(;a.length>=l[r]&&(t.result.push([e].concat(a.splice(0,l[r]))),l[r]););}function f(t){var e,r,a,n,o=t.max;if(t.segmentStart=t.index,e=t.path.charCodeAt(t.index),!i(e))return void(t.err=\"SvgPath: bad command \"+t.path[t.index]+\" (at pos \"+t.index+\")\");if(a=l[t.path[t.index].toLowerCase()],t.index++,u(t),t.data=[],!a)return void h(t);for(r=!1;;){for(n=a;n>0;n--){if(c(t),t.err.length)return;t.data.push(t.param),u(t),r=!1,t.index<o&&44===t.path.charCodeAt(t.index)&&(t.index++,u(t),r=!0)}if(!r){if(t.index>=t.max)break;if(!s(t.path.charCodeAt(t.index)))break}}h(t)}var l={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},d=[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279];e.exports=function(t){var e=new o(t),r=e.max;for(u(e);e.index<r&&!e.err.length;)f(e);return e.err.length?e.result=[]:e.result.length&&(\"mM\".indexOf(e.result[0][0])<0?(e.err=\"SvgPath: string should start with `M` or `m`\",e.result=[]):e.result[0][0]=\"M\"),{err:e.err,segments:e.result}}},{}],6:[function(t,e,r){\"use strict\";function a(t){if(!(this instanceof a))return new a(t);var e=i(t);this.segments=e.segments,this.err=e.err,this.__stack=[]}var i=t(\"./path_parse\"),n=t(\"./transform_parse\"),s=t(\"./matrix\"),o=t(\"./a2c\"),u=t(\"./ellipse\");a.prototype.__matrix=function(t){var e,r=this;t.queue.length&&this.iterate(function(a,i,n,s){var o,c,h,f;switch(a[0]){case\"v\":o=t.calc(0,a[1],!0),c=0===o[0]?[\"v\",o[1]]:[\"l\",o[0],o[1]];break;case\"V\":o=t.calc(n,a[1],!1),c=o[0]===t.calc(n,s,!1)[0]?[\"V\",o[1]]:[\"L\",o[0],o[1]];break;case\"h\":o=t.calc(a[1],0,!0),c=0===o[1]?[\"h\",o[0]]:[\"l\",o[0],o[1]];break;case\"H\":o=t.calc(a[1],s,!1),c=o[1]===t.calc(n,s,!1)[1]?[\"H\",o[0]]:[\"L\",o[0],o[1]];break;case\"a\":case\"A\":var l=t.toArray(),d=u(a[1],a[2],a[3]).transform(l);if(l[0]*l[3]-l[1]*l[2]<0&&(a[5]=a[5]?\"0\":\"1\"),o=t.calc(a[6],a[7],\"a\"===a[0]),\"A\"===a[0]&&a[6]===n&&a[7]===s||\"a\"===a[0]&&0===a[6]&&0===a[7]){c=[\"a\"===a[0]?\"l\":\"L\",o[0],o[1]];break}c=d.isDegenerate()?[\"a\"===a[0]?\"l\":\"L\",o[0],o[1]]:[a[0],d.rx,d.ry,d.ax,a[4],a[5],o[0],o[1]];break;case\"m\":f=i>0,o=t.calc(a[1],a[2],f),c=[\"m\",o[0],o[1]];break;default:for(h=a[0],c=[h],f=h.toLowerCase()===h,e=1;e<a.length;e+=2)o=t.calc(a[e],a[e+1],f),c.push(o[0],o[1])}r.segments[i]=c},!0)},a.prototype.__evaluateStack=function(){var t,e;if(this.__stack.length){if(1===this.__stack.length)return this.__matrix(this.__stack[0]),void(this.__stack=[]);for(t=s(),e=this.__stack.length;--e>=0;)t.matrix(this.__stack[e].toArray());this.__matrix(t),this.__stack=[]}},a.prototype.toString=function(){var t,e,r=[];this.__evaluateStack();for(var a=0;a<this.segments.length;a++)e=this.segments[a][0],t=a>0&&\"m\"!==e&&\"M\"!==e&&e===this.segments[a-1][0],r=r.concat(t?this.segments[a].slice(1):this.segments[a]);return r.join(\" \").replace(/ ?([achlmqrstvz]) ?/gi,\"$1\").replace(/ \\-/g,\"-\").replace(/zm/g,\"z m\")},a.prototype.translate=function(t,e){return this.__stack.push(s().translate(t,e||0)),this},a.prototype.scale=function(t,e){return this.__stack.push(s().scale(t,e||0===e?e:t)),this},a.prototype.rotate=function(t,e,r){return this.__stack.push(s().rotate(t,e||0,r||0)),this},a.prototype.skewX=function(t){return this.__stack.push(s().skewX(t)),this},a.prototype.skewY=function(t){return this.__stack.push(s().skewY(t)),this},a.prototype.matrix=function(t){return this.__stack.push(s().matrix(t)),this},a.prototype.transform=function(t){return t.trim()?(this.__stack.push(n(t)),this):this},a.prototype.round=function(t){var e,r=0,a=0,i=0,n=0;return t=t||0,this.__evaluateStack(),this.segments.forEach(function(s){var o=s[0].toLowerCase()===s[0];switch(s[0]){case\"H\":case\"h\":return o&&(s[1]+=i),i=s[1]-s[1].toFixed(t),void(s[1]=+s[1].toFixed(t));case\"V\":case\"v\":return o&&(s[1]+=n),n=s[1]-s[1].toFixed(t),void(s[1]=+s[1].toFixed(t));case\"Z\":case\"z\":return i=r,void(n=a);case\"M\":case\"m\":return o&&(s[1]+=i,s[2]+=n),i=s[1]-s[1].toFixed(t),n=s[2]-s[2].toFixed(t),r=i,a=n,s[1]=+s[1].toFixed(t),void(s[2]=+s[2].toFixed(t));case\"A\":case\"a\":return o&&(s[6]+=i,s[7]+=n),i=s[6]-s[6].toFixed(t),n=s[7]-s[7].toFixed(t),s[1]=+s[1].toFixed(t),s[2]=+s[2].toFixed(t),s[3]=+s[3].toFixed(t+2),s[6]=+s[6].toFixed(t),void(s[7]=+s[7].toFixed(t));default:return e=s.length,o&&(s[e-2]+=i,s[e-1]+=n),i=s[e-2]-s[e-2].toFixed(t),n=s[e-1]-s[e-1].toFixed(t),void s.forEach(function(e,r){r&&(s[r]=+s[r].toFixed(t))})}}),this},a.prototype.iterate=function(t,e){var r,a,i,n=this.segments,s={},o=!1,u=0,c=0,h=0,f=0;if(e||this.__evaluateStack(),n.forEach(function(e,r){var a=t(e,r,u,c);Array.isArray(a)&&(s[r]=a,o=!0);var i=e[0]===e[0].toLowerCase();switch(e[0]){case\"m\":case\"M\":return u=e[1]+(i?u:0),c=e[2]+(i?c:0),h=u,void(f=c);case\"h\":case\"H\":return void(u=e[1]+(i?u:0));case\"v\":case\"V\":return void(c=e[1]+(i?c:0));case\"z\":case\"Z\":return u=h,void(c=f);default:u=e[e.length-2]+(i?u:0),c=e[e.length-1]+(i?c:0)}}),!o)return this;for(i=[],r=0;r<n.length;r++)if(void 0!==s[r])for(a=0;a<s[r].length;a++)i.push(s[r][a]);else i.push(n[r]);return this.segments=i,this},a.prototype.abs=function(){return this.iterate(function(t,e,r,a){var i,n=t[0],s=n.toUpperCase();if(n!==s)switch(t[0]=s,n){case\"v\":return void(t[1]+=a);case\"a\":return t[6]+=r,void(t[7]+=a);default:for(i=1;i<t.length;i++)t[i]+=i%2?r:a}},!0),this},a.prototype.rel=function(){return this.iterate(function(t,e,r,a){var i,n=t[0],s=n.toLowerCase();if(n!==s&&(0!==e||\"M\"!==n))switch(t[0]=s,n){case\"V\":return void(t[1]-=a);case\"A\":return t[6]-=r,void(t[7]-=a);default:for(i=1;i<t.length;i++)t[i]-=i%2?r:a}},!0),this},a.prototype.unarc=function(){return this.iterate(function(t,e,r,a){var i,n,s,u=[],c=t[0];return\"A\"!==c&&\"a\"!==c?null:(\"a\"===c?(n=r+t[6],s=a+t[7]):(n=t[6],s=t[7]),i=o(r,a,n,s,t[4],t[5],t[1],t[2],t[3]),0===i.length?[[\"a\"===t[0]?\"l\":\"L\",t[6],t[7]]]:(i.forEach(function(t){u.push([\"C\",t[2],t[3],t[4],t[5],t[6],t[7]])}),u))}),this},a.prototype.unshort=function(){var t,e,r,a,i,n=this.segments;return this.iterate(function(s,o,u,c){var h,f=s[0],l=f.toUpperCase();o&&(\"T\"===l?(h=\"t\"===f,r=n[o-1],\"Q\"===r[0]?(t=r[1]-u,e=r[2]-c):\"q\"===r[0]?(t=r[1]-r[3],e=r[2]-r[4]):(t=0,e=0),a=-t,i=-e,h||(a+=u,i+=c),n[o]=[h?\"q\":\"Q\",a,i,s[1],s[2]]):\"S\"===l&&(h=\"s\"===f,r=n[o-1],\"C\"===r[0]?(t=r[3]-u,e=r[4]-c):\"c\"===r[0]?(t=r[3]-r[5],e=r[4]-r[6]):(t=0,e=0),a=-t,i=-e,h||(a+=u,i+=c),n[o]=[h?\"c\":\"C\",a,i,s[1],s[2],s[3],s[4]]))}),this},e.exports=a},{\"./a2c\":2,\"./ellipse\":3,\"./matrix\":4,\"./path_parse\":5,\"./transform_parse\":7}],7:[function(t,e,r){\"use strict\";var a=t(\"./matrix\"),i={matrix:!0,scale:!0,rotate:!0,translate:!0,skewX:!0,skewY:!0};e.exports=function(t){var e,r,n=new a;return t.split(/\\s*(matrix|translate|scale|rotate|skewX|skewY)\\s*\\(\\s*(.+?)\\s*\\)[\\s,]*/).forEach(function(t){if(t.length){if(void 0!==i[t])return void(e=t);switch(r=t.split(/[\\s,]+/).map(function(t){return+t||0}),e){case\"matrix\":return void(6===r.length&&n.matrix(r));case\"scale\":return void(1===r.length?n.scale(r[0],r[0]):2===r.length&&n.scale(r[0],r[1]));case\"rotate\":return void(1===r.length?n.rotate(r[0],0,0):3===r.length&&n.rotate(r[0],r[1],r[2]));case\"translate\":return void(1===r.length?n.translate(r[0],0):2===r.length&&n.translate(r[0],r[1]));case\"skewX\":return void(1===r.length&&n.skewX(r[0]));case\"skewY\":return void(1===r.length&&n.skewY(r[0]))}}}),n}},{\"./matrix\":4}],8:[function(e,r,a){/**\n * A class to parse color values\n * @author Stoyan Stefanov <sstoo@gmail.com>\n * @link   http://www.phpied.com/rgb-color-parser-in-javascript/\n * @license Use it if you like it\n */\n!function(e){function a(t){this.ok=!1,\"#\"==t.charAt(0)&&(t=t.substr(1,6)),t=t.replace(/ /g,\"\"),t=t.toLowerCase();var e={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\",darkgreen:\"006400\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dodgerblue:\"1e90ff\",feldspar:\"d19275\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"ff00ff\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"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\",lightgrey:\"d3d3d3\",lightgreen:\"90ee90\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslateblue:\"8470ff\",lightslategray:\"778899\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"00ff00\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"ff00ff\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370d8\",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:\"d87093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",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\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",violetred:\"d02090\",wheat:\"f5deb3\",white:\"ffffff\",whitesmoke:\"f5f5f5\",yellow:\"ffff00\",yellowgreen:\"9acd32\"};for(var r in e)t==r&&(t=e[r]);for(var i=[{re:/^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,example:[\"rgb(123, 234, 45)\",\"rgb(255,234,245)\"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^(\\w{2})(\\w{2})(\\w{2})$/,example:[\"#00ff00\",\"336699\"],process:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\\w{1})(\\w{1})(\\w{1})$/,example:[\"#fb0\",\"f0f\"],process:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}],n=0;n<i.length;n++){var s=i[n].re,o=i[n].process,u=s.exec(t);if(u){var c=o(u);this.r=c[0],this.g=c[1],this.b=c[2],this.ok=!0}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return\"rgb(\"+this.r+\", \"+this.g+\", \"+this.b+\")\"},this.toHex=function(){var t=this.r.toString(16),e=this.g.toString(16),r=this.b.toString(16);return 1==t.length&&(t=\"0\"+t),1==e.length&&(e=\"0\"+e),1==r.length&&(r=\"0\"+r),\"#\"+t+e+r},this.getHelpXML=function(){for(var t=new Array,r=0;r<i.length;r++)for(var n=i[r].example,s=0;s<n.length;s++)t[t.length]=n[s];for(var o in e)t[t.length]=o;var u=document.createElement(\"ul\");u.setAttribute(\"id\",\"rgbcolor-examples\");for(var r=0;r<t.length;r++)try{var c=document.createElement(\"li\"),h=new a(t[r]),f=document.createElement(\"div\");f.style.cssText=\"margin: 3px; border: 1px solid black; background:\"+h.toHex()+\"; color:\"+h.toHex(),f.appendChild(document.createTextNode(\"test\"));var l=document.createTextNode(\" \"+t[r]+\" -> \"+h.toRGB()+\" -> \"+h.toHex());c.appendChild(f),c.appendChild(l),u.appendChild(c)}catch(t){}return u}}\"function\"==typeof t&&t.amd?t(function(){return a}):void 0!==r&&r.exports?r.exports=a:e.RGBColor=a,a}(\"undefined\"!=typeof self&&self||\"undefined\"!=typeof window&&window||this)},{}],9:[function(e,r,a){!function(a){function i(t,e){var r=h(t,\"font-family\");r&&o.setFont(r),e&&e.ok&&o.setTextColor(e.r,e.g,e.b);var a,i=h(t,\"font-weight\");i&&\"bold\"===i&&(a=\"bold\");var n=h(t,\"font-style\");n&&\"italic\"===n&&(a+=\"italic\"),o.setFontType(a);var s=16,u=h(t,\"font-size\");u&&(s=parseFloat(u),o.setFontSize(s))}var n,s,o,u=/url\\(#([^)]+)\\)/,c=function(t){var e=t.getAttribute(\"d\");s&&(e=s(e).unshort().unarc().abs().toString(),t.setAttribute(\"d\",e));var r=t.pathSegList;if(r)return r;r=[];for(var a,i=/([a-df-zA-DF-Z])([^a-df-zA-DF-Z]*)/g;a=i.exec(e);){var n=M(a[2]),o=a[1],u=\"zZ\".indexOf(o)>=0?0:\"hHvV\".indexOf(o)>=0?1:\"mMlLtT\".indexOf(o)>=0?2:\"sSqQ\".indexOf(o)>=0?4:\"aA\".indexOf(o)>=0?7:\"cC\".indexOf(o)>=0?6:-1,c=0;do{var h={pathSegTypeAsLetter:o};switch(o){case\"h\":case\"H\":h.x=n[c];break;case\"v\":case\"V\":h.y=n[c];break;case\"c\":case\"C\":h.x1=n[c+u-6],h.y1=n[c+u-5];case\"s\":case\"S\":h.x2=n[c+u-4],h.y2=n[c+u-3];case\"t\":case\"T\":case\"l\":case\"L\":case\"m\":case\"M\":h.x=n[c+u-2],h.y=n[c+u-1];break;case\"q\":case\"Q\":h.x1=n[c],h.y1=n[c+1],h.x=n[c+2],h.y=n[c+3];break;case\"a\":case\"A\":throw new Error(\"Cannot convert Arcs without SvgPath package\")}r.push(h),c+=u}while(c<n.length)}return r.getItem=function(t){return this[t]},r.numberOfItems=r.length,r},h=function(t,e,r){return r=r||e,t.getAttribute(e)||t.style[r]},f=function(t,e){return e.split(\",\").indexOf(t.tagName.toLowerCase())>=0},l=function(t,e){for(var r=[],a=0;a<t.childNodes.length;a++){var i=t.childNodes[a];\"#\"!==i.nodeName.charAt(0)&&r.push(i)}for(a=0;a<r.length;a++)e(a,r[a])},d=function(t,e){return Math.atan2(e[1]-t[1],e[0]-t[0])},g=function(t,e){var r=e[0]-t[0],a=e[1]-t[1];return[t[0]+2*r,t[1]+2*a]},p=function(t,e){return[2/3*(e[0]-t[0])+t[0],2/3*(e[1]-t[1])+t[1]]},b=function(t,e,r,a,i){var n=r.getItem(t-1);return t>0&&(\"C\"===n.pathSegTypeAsLetter||\"S\"===n.pathSegTypeAsLetter)?g([n.x2,n.y2],e):t>0&&(\"c\"===n.pathSegTypeAsLetter||\"s\"===n.pathSegTypeAsLetter)?g([n.x2+a,n.y2+i],e):[e[0],e[1]]},x=function(t){this.prefix=t,this.id=0,this.nextChild=function(){return new x(\"_\"+this.id+++\"_\"+this.get())},this.get=function(){return this.prefix}},m=function(t,e){for(var r=/_\\d+_/;!e[t]&&r.exec(t);)t=t.replace(r,\"\");return e[t]},v=function(t){return t.replace(/[\\n\\s\\r]+/,\" \").trim()},y=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e},A=function(t){var e,r,a,i,n,s,u,c,h=o.unitMatrix;if(f(t,\"svg,g\"))c=parseFloat(t.getAttribute(\"x\"))||0,u=parseFloat(t.getAttribute(\"y\"))||0,s=t.getAttribute(\"viewBox\"),s?(n=M(s),i=n[2]-n[0],a=n[3]-n[1],r=parseFloat(t.getAttribute(\"width\"))||i,e=parseFloat(t.getAttribute(\"height\"))||a,h=new o.Matrix(r/i,0,0,e/a,c-n[0],u-n[1])):h=new o.Matrix(1,0,0,1,c,u);else if(f(t,\"marker\"))if(c=-parseFloat(t.getAttribute(\"refX\"))||0,u=-parseFloat(t.getAttribute(\"refY\"))||0,s=t.getAttribute(\"viewBox\")){n=M(s),i=n[2]-n[0],a=n[3]-n[1],r=parseFloat(t.getAttribute(\"markerWidth\"))||i,e=parseFloat(t.getAttribute(\"markerHeight\"))||a;var l=new o.Matrix(r/i,0,0,e/a,0,0),d=new o.Matrix(1,0,0,1,c,u);h=o.matrixMult(d,l)}else h=new o.Matrix(1,0,0,1,c,u);var g=t.getAttribute(\"transform\");return g?o.matrixMult(h,k(g)):h},w=function(t){for(var e=M(t),r=[],a=0;a<e.length-1;a+=2){var i=e[a],n=e[a+1];r.push([i,n])}return r},k=function(t){if(!t)return o.unitMatrix;for(var e,r=/^\\s*matrix\\(([^\\)]+)\\)\\s*/,a=/^\\s*translate\\(([^\\)]+)\\)\\s*/,i=/^\\s*rotate\\(([^\\)]+)\\)\\s*/,n=/^\\s*scale\\(([^\\)]+)\\)\\s*/,s=/^\\s*skewX\\(([^\\)]+)\\)\\s*/,u=/^\\s*skewY\\(([^\\)]+)\\)\\s*/,c=o.unitMatrix;t.length>0;){var h=r.exec(t);if(h&&(e=M(h[1]),c=o.matrixMult(new o.Matrix(e[0],e[1],e[2],e[3],e[4],e[5]),c),t=t.substr(h[0].length)),h=i.exec(t)){e=M(h[1]);var f=Math.PI*e[0]/180;if(c=o.matrixMult(new o.Matrix(Math.cos(f),Math.sin(f),-Math.sin(f),Math.cos(f),0,0),c),e[1]&&e[2]){var l=new o.Matrix(1,0,0,1,e[1],e[2]),d=new o.Matrix(1,0,0,1,-e[1],-e[2]);c=o.matrixMult(d,o.matrixMult(c,l))}t=t.substr(h[0].length)}h=a.exec(t),h&&(e=M(h[1]),c=o.matrixMult(new o.Matrix(1,0,0,1,e[0],e[1]||0),c),t=t.substr(h[0].length)),h=n.exec(t),h&&(e=M(h[1]),e[1]||(e[1]=e[0]),c=o.matrixMult(new o.Matrix(e[0],0,0,e[1],0,0),c),t=t.substr(h[0].length)),h=s.exec(t),h&&(e=parseFloat(h[1]),c=o.matrixMult(new o.Matrix(1,0,Math.tan(e),1,0,0),c),t=t.substr(h[0].length)),h=u.exec(t),h&&(e=parseFloat(h[1]),c=o.matrixMult(new o.Matrix(1,Math.tan(e),0,1,0,0),c),t=t.substr(h[0].length))}return c},M=function(t){for(var e,r=[],a=/[+-]?(?:(?:\\d+\\.?\\d*)|(?:\\d*\\.?\\d+))(?:[eE][+-]?\\d+)?/g;e=a.exec(t);)r.push(parseFloat(e[0]));return r},F=function(t){var e=/\\s*rgba\\(((?:[^,\\)]*,){3}[^,\\)]*)\\)\\s*/.exec(t);if(e){var r=M(e[1]),a=new n(\"rgb(\"+r.slice(0,3).join(\",\")+\")\");return a.a=r[3],a}return new n(t)},C=function(t,e){var r=t[0],a=t[1];return[e.a*r+e.c*a+e.e,e.b*r+e.d*a+e.f]},S=function(t){var e,r,a,i,n,s,o,u,d=parseFloat;if(f(t,\"polygon\")){var g=w(t.getAttribute(\"points\"));for(r=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,n=Number.NEGATIVE_INFINITY,e=0;e<g.length;e++){var x=g[e];r=Math.min(r,x[0]),i=Math.max(i,x[0]),a=Math.min(a,x[1]),n=Math.max(n,x[1])}u=[r,a,i-r,n-a]}else if(f(t,\"path\")){var m=c(t);r=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,n=Number.NEGATIVE_INFINITY;var v,y,A,k,F,C,I,_=0,T=0;for(e=0;e<m.numberOfItems;e++){var q=m.getItem(e),L=q.pathSegTypeAsLetter;switch(L){case\"H\":A=q.x,k=T;break;case\"h\":A=q.x+_,k=T;break;case\"V\":A=_,k=q.y;break;case\"v\":A=_,k=q.y+T;break;case\"C\":F=[q.x1,q.y1],C=[q.x2,q.y2],I=[q.x,q.y];break;case\"c\":F=[q.x1+_,q.y1+T],C=[q.x2+_,q.y2+T],I=[q.x+_,q.y+T];break;case\"S\":F=b(e,[_,T],m,v,y),C=[q.x2,q.y2],I=[q.x,q.y];break;case\"s\":F=b(e,[_,T],m,v,y),C=[q.x2+_,q.y2+T],I=[q.x+_,q.y+T];break;case\"Q\":d=[q.x1,q.y1],F=p([_,T],d),C=p([q.x,q.y],d),I=[q.x,q.y];break;case\"q\":d=[q.x1+_,q.y1+T],F=p([_,T],d),C=p([_+q.x,T+q.y],d),I=[q.x+_,q.y+T];break;case\"T\":F=b(e,[_,T],m,v,y),F=p([_,T],d),C=p([q.x,q.y],d),I=[q.x,q.y];break;case\"t\":d=b(e,[_,T],m,v,y),F=p([_,T],d),C=p([_+q.x,T+q.y],d),I=[q.x+_,q.y+T]}\"sScCqQtT\".indexOf(L)>=0&&(v=_,y=T),\"MLCSQT\".indexOf(L)>=0?(_=q.x,T=q.y):\"mlcsqt\".indexOf(L)>=0?(_=q.x+_,T=q.y+T):\"zZ\".indexOf(L)<0&&(_=A,T=k),\"CSQTcsqt\".indexOf(L)>=0?(r=Math.min(r,_,F[0],C[0],I[0]),i=Math.max(i,_,F[0],C[0],I[0]),a=Math.min(a,T,F[1],C[1],I[1]),n=Math.max(n,T,F[1],C[1],I[1])):(r=Math.min(r,_),i=Math.max(i,_),a=Math.min(a,T),n=Math.max(n,T))}u=[r,a,i-r,n-a]}else{if(f(t,\"svg\"))return s=t.getAttribute(\"viewBox\"),s&&(o=M(s)),[d(t.getAttribute(\"x\"))||o&&o[0]||0,d(t.getAttribute(\"y\"))||o&&o[1]||0,d(t.getAttribute(\"width\"))||o&&o[2]||0,d(t.getAttribute(\"height\"))||o&&o[3]||0];if(f(t,\"g\"))u=[0,0,0,0],l(t,function(t,e){var r=S(e);u=[Math.min(u[0],r[0]),Math.min(u[1],r[1]),Math.max(u[0]+u[2],r[0]+r[2])-Math.min(u[0],r[0]),Math.max(u[1]+u[3],r[1]+r[3])-Math.min(u[1],r[1])]});else{if(f(t,\"marker\"))return s=t.getAttribute(\"viewBox\"),s&&(o=M(s)),[o&&o[0]||0,o&&o[1]||0,o&&o[2]||d(t.getAttribute(\"marker-width\"))||0,o&&o[3]||d(t.getAttribute(\"marker-height\"))||0];if(f(t,\"pattern\"))return[d(t.getAttribute(\"x\"))||0,d(t.getAttribute(\"y\"))||0,d(t.getAttribute(\"width\"))||0,d(t.getAttribute(\"height\"))||0];var N=d(t.getAttribute(\"x1\"))||d(t.getAttribute(\"x\"))||d(t.getAttribute(\"cx\")-d(t.getAttribute(\"r\")))||0,O=d(t.getAttribute(\"x2\"))||N+d(t.getAttribute(\"width\"))||d(t.getAttribute(\"cx\"))+d(t.getAttribute(\"r\"))||0,P=d(t.getAttribute(\"y1\"))||d(t.getAttribute(\"y\"))||d(t.getAttribute(\"cy\"))-d(t.getAttribute(\"r\"))||0,E=d(t.getAttribute(\"y2\"))||P+d(t.getAttribute(\"height\"))||d(t.getAttribute(\"cy\"))+d(t.getAttribute(\"r\"))||0;u=[Math.min(N,O),Math.min(P,E),Math.max(N,O)-Math.min(N,O),Math.max(P,E)-Math.min(P,E)]}}if(!f(t,\"marker,svg,g\")){var G=h(t,\"stroke-width\")||1;return h(t,\"stroke-miterlimit\")&&(G*=.5/Math.sin(Math.PI/12)),[u[0]-G,u[1]-G,u[2]+2*G,u[3]+2*G]}return u},I=function(t,e,r,a,i){for(var n=w(t.getAttribute(\"points\")),s=[{op:\"m\",c:C(n[0],e)}],u=1;u<n.length;u++){var c=n[u],h=C(c,e);s.push({op:\"l\",c:h})}s.push({op:\"h\"}),o.path(s,r,a,i)},_=function(t){var e=t.getAttribute(\"xlink:href\")||t.getAttribute(\"href\"),r=new Image;r.src=e;var a=document.createElement(\"canvas\"),i=parseFloat(t.getAttribute(\"width\")),n=parseFloat(t.getAttribute(\"height\")),s=parseFloat(t.getAttribute(\"x\")||0),u=parseFloat(t.getAttribute(\"y\")||0);a.width=i,a.height=n;var c=a.getContext(\"2d\");c.fillStyle=\"#fff\",c.fillRect(0,0,i,n),c.drawImage(r,0,0,i,n);var h=a.toDataURL(\"image/jpeg\");o.addImage(h,\"jpeg\",s,u,i,n)},T=function(t,e,r,a,i,n){var s=c(t),h=t.getAttribute(\"marker-end\"),f=t.getAttribute(\"marker-start\"),l=t.getAttribute(\"marker-mid\"),g=function(t,e){for(var r,a,i,n,u,c,g,x,m,v,y=0,A=0,w=y,k=A,M=[],F=[],S=0,I=function(t,r,a){var i,n=Math.cos(t),s=Math.sin(t);i=new o.Matrix(n,s,-s,n,r[0],r[1]),F.push({type:a,tf:o.matrixMult(i,e)})},_=0;_<s.numberOfItems;_++){var T=s.getItem(_),q=T.pathSegTypeAsLetter;switch(q){case\"M\":w=y,k=A,u=[T.x,T.y],m=\"m\";break;case\"m\":w=y,k=A,u=[T.x+y,T.y+A],m=\"m\";break;case\"L\":u=[T.x,T.y],m=\"l\";break;case\"l\":u=[T.x+y,T.y+A],m=\"l\";break;case\"H\":u=[T.x,A],m=\"l\",i=T.x,n=A;break;case\"h\":u=[T.x+y,A],m=\"l\",i=T.x+y,n=A;break;case\"V\":u=[y,T.y],m=\"l\",i=y,n=T.y;break;case\"v\":u=[y,T.y+A],m=\"l\",i=y,n=T.y+A;break;case\"C\":g=[T.x1,T.y1],x=[T.x2,T.y2],u=[T.x,T.y];break;case\"c\":g=[T.x1+y,T.y1+A],x=[T.x2+y,T.y2+A],u=[T.x+y,T.y+A];break;case\"S\":g=b(_,[y,A],s,r,a),x=[T.x2,T.y2],u=[T.x,T.y];break;case\"s\":g=b(_,[y,A],s,r,a),x=[T.x2+y,T.y2+A],u=[T.x+y,T.y+A];break;case\"Q\":c=[T.x1,T.y1],g=p([y,A],c),x=p([T.x,T.y],c),u=[T.x,T.y];break;case\"q\":c=[T.x1+y,T.y1+A],g=p([y,A],c),x=p([y+T.x,A+T.y],c),u=[T.x+y,T.y+A];break;case\"T\":g=b(_,[y,A],s,r,a),g=p([y,A],c),x=p([T.x,T.y],c),u=[T.x,T.y];break;case\"t\":c=b(_,[y,A],s,r,a),g=p([y,A],c),x=p([y+T.x,A+T.y],c),u=[T.x+y,T.y+A];break;case\"Z\":case\"z\":y=w,A=k,M.push({op:\"h\"})}var L=f&&(1===_||\"mM\".indexOf(q)<0&&\"mM\".indexOf(s.getItem(_-1).pathSegTypeAsLetter)>=0),N=h&&(_===s.numberOfItems-1||\"mM\".indexOf(q)<0&&\"mM\".indexOf(s.getItem(_+1).pathSegTypeAsLetter)>=0),O=l&&_>0&&!(1===_&&\"mM\".indexOf(s.getItem(_-1).pathSegTypeAsLetter)>=0);if(\"sScCqQtT\".indexOf(q)>=0)L&&I(d([y,A],g),[y,A],\"start\"),N&&I(d(x,u),u,\"end\"),O&&(v=d([y,A],g),v=\"mM\".indexOf(s.getItem(_-1).pathSegTypeAsLetter)>=0?v:.5*(S+v),I(v,[y,A],\"mid\")),S=d(x,u),r=y,a=A,g=C(g,e),x=C(x,e),c=C(u,e),M.push({op:\"c\",c:[g[0],g[1],x[0],x[1],c[0],c[1]]});else if(\"lLhHvVmM\".indexOf(q)>=0){if(v=d([y,A],u),L&&I(v,[y,A],\"start\"),N&&I(v,u,\"end\"),O){var P=\"mM\".indexOf(q)>=0?S:\"mM\".indexOf(s.getItem(_-1).pathSegTypeAsLetter)>=0?v:.5*(S+v);I(P,[y,A],\"mid\")}S=v,c=C(u,e),M.push({op:m,c:c})}\"MLCSQT\".indexOf(q)>=0?(y=T.x,A=T.y):\"mlcsqt\".indexOf(q)>=0?(y=T.x+y,A=T.y+A):\"zZ\".indexOf(q)<0&&(y=i,A=n)}return{lines:M,markers:F}}(0,e);if(h||f||l)for(var x=0;x<g.markers.length;x++){var m,v=g.markers[x];switch(v.type){case\"start\":m=r.get()+u.exec(f)[1];break;case\"end\":m=r.get()+u.exec(h)[1];break;case\"mid\":m=r.get()+u.exec(l)[1]}o.doFormObject(m,v.tf)}g.lines.length>0&&o.path(g.lines,a,i,n)},q=function(t,e,r){var a=t.getAttribute(\"href\")||t.getAttribute(\"xlink:href\");if(a){var i=o.getFormObject(r.get()+a.substring(1)),n=t.getAttribute(\"x\")||0,s=t.getAttribute(\"y\")||0,u=t.getAttribute(\"width\")||i.width,c=t.getAttribute(\"height\")||i.height,h=new o.Matrix(u/i.width||0,0,0,c/i.height||0,n,s);h=o.matrixMult(h,e),o.doFormObject(r.get()+a.substring(1),h)}},L=function(t,e){var r=C([parseFloat(t.getAttribute(\"x1\")),parseFloat(t.getAttribute(\"y1\"))],e),a=C([parseFloat(t.getAttribute(\"x2\")),parseFloat(t.getAttribute(\"y2\"))],e);o.line(r[0],r[1],a[0],a[1])},N=function(t,e,r,a){o.roundedRect(parseFloat(t.getAttribute(\"x\"))||0,parseFloat(t.getAttribute(\"y\"))||0,parseFloat(t.getAttribute(\"width\")),parseFloat(t.getAttribute(\"height\")),parseFloat(t.getAttribute(\"rx\"))||0,parseFloat(t.getAttribute(\"ry\"))||0,e,r,a)},O=function(t,e,r,a){o.ellipse(parseFloat(t.getAttribute(\"cx\"))||0,parseFloat(t.getAttribute(\"cy\"))||0,parseFloat(t.getAttribute(\"rx\")),parseFloat(t.getAttribute(\"ry\")),e,r,a)},P=function(t,e,r,a){var i=parseFloat(t.getAttribute(\"r\"))||0;o.ellipse(parseFloat(t.getAttribute(\"cx\"))||0,parseFloat(t.getAttribute(\"cy\"))||0,i,i,e,r,a)},E=function(t,e){switch(h(t,\"text-transform\")){case\"uppercase\":return e.toUpperCase();case\"lowercase\":return e.toLowerCase();default:return e}},G=function(t,e,r,a){o.saveGraphicsState(),i(t,a);var s=function(t,e){var r;return(r=t&&t.toString().match(/^([\\-0-9.]+)em$/))?parseFloat(r[1])*e:(r=t&&t.toString().match(/^([\\-0-9.]+)(px|)$/),r?parseFloat(r[1]):0)},u=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");u.appendChild(t),u.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(u);var c,d,g=t.getBBox(),p=0,b=h(t,\"text-anchor\");b&&(p=function(t,e){var r=0;switch(t){case\"end\":r=e;break;case\"middle\":r=e/2}return r}(b,g.width));var x=o.getFontSize(),m=s(t.getAttribute(\"x\"),x),y=s(t.getAttribute(\"y\"),x),A=o.matrixMult(new o.Matrix(1,0,0,1,m,y),e);c=s(t.getAttribute(\"dx\"),x),d=s(t.getAttribute(\"dy\"),x),0===t.childElementCount?o.text(c-p,d,E(t,v(t.textContent)),void 0,A):l(t,function(e,r){if(r.textContent&&!f(r,\"title,desc,metadata\")){o.saveGraphicsState();var a=h(r,\"fill\");i(r,a&&new n(a));var s=r.getExtentOfChar(0);o.text(s.x-m,s.y+.7*s.height-y,E(t,v(r.textContent)),void 0,A),o.restoreGraphicsState()}}),document.body.removeChild(u),o.restoreGraphicsState()},j=function(t,e,r,a,i){l(t,function(t,n){\"defs\"===n.tagName.toLowerCase()&&(B(n,e,r,a,i),n.parentNode.removeChild(n))})},V=function(t,e,r,a,i){var n=a.nextChild(),s=y(r);j(t,e,s,n,i),Y(t,e,s,n,i)},Y=function(t,e,r,a,i){l(t,function(t,n){B(n,e,r,a,i)})},z=function(t,e,r,a,i){var s,u=[],c=0,f=!1;l(t,function(t,e){if(\"stop\"===e.tagName.toLowerCase()){var r=new n(h(e,\"stop-color\"));u.push({offset:parseFloat(e.getAttribute(\"offset\")),color:[r.r,r.g,r.b]});var a=h(e,\"stop-opacity\");a&&1!=a&&(c+=parseFloat(a),f=!0)}}),f&&(s=new o.GState({opacity:c/r.length}));var d=new o.ShadingPattern(e,r,u,s),g=i.get()+t.getAttribute(\"id\");o.addShadingPattern(g,d),a[g]=t},H=function(t,e,r){var a=r.get()+t.getAttribute(\"id\");e[a]=t;var i=S(t),n=new o.TilingPattern([i[0],i[1],i[0]+i[2],i[1]+i[3]],i[2],i[3],null,A(t));o.beginTilingPattern(n),Y(t,o.unitMatrix,e,r,!1),o.endTilingPattern(a,n)},B=function(t,e,r,a,s){function c(){p=new n(\"rgb(0, 0, 0)\"),g=!0,b=\"F\"}var l,d,g=!1,p=null,b=null,x=null,v=null,y=s&&!f(t,\"lineargradient,radialgradient,pattern\");if(y?(l=A(t),d=S(t),o.beginFormObject(d[0],d[1],d[2],d[3],l),l=o.unitMatrix,s=!1):(l=o.matrixMult(A(t),e),o.saveGraphicsState()),f(t,\"g,path,rect,text,ellipse,line,circle,polygon\")){var w=h(t,\"fill\");if(w){var C=u.exec(w);if(C){x=a.get()+C[1];var E=m(x,r);if(E&&f(E,\"lineargradient,radialgradient\")){var B=l;if(!E.hasAttribute(\"gradientUnits\")||\"objectboundingbox\"===E.getAttribute(\"gradientUnits\").toLowerCase()){d||(d=S(t)),B=new o.Matrix(d[2],0,0,d[3],d[0],d[1]);var U=A(t);B=o.matrixMult(B,U)}var Q=k(E.getAttribute(\"gradientTransform\"));v=o.matrixMult(Q,B)}else if(E&&f(E,\"pattern\")){var D,X,Z,R,$;v={};var W=o.unitMatrix;E.hasAttribute(\"patternUnits\")&&\"objectboundingbox\"!==E.getAttribute(\"patternUnits\").toLowerCase()||(d||(d=S(t)),W=new o.Matrix(1,0,0,1,d[0],d[1]),D=S(E),$=D[0]*d[0],X=D[1]*d[1],Z=D[2]*d[2],R=D[3]*d[3],v.boundingBox=[$,X,$+Z,X+R],v.xStep=Z,v.yStep=R);var J=o.unitMatrix;E.hasAttribute(\"patternContentUnits\")&&\"objectboundingbox\"===E.getAttribute(\"patternContentUnits\").toLowerCase()&&(d||(d=S(t)),J=new o.Matrix(d[2],0,0,d[3],0,0),D=v.boundingBox||S(E),$=D[0]/d[0],X=D[1]/d[1],Z=D[2]/d[2],R=D[3]/d[3],v.boundingBox=[$,X,$+Z,X+R],v.xStep=Z,v.yStep=R),v.matrix=o.matrixMult(o.matrixMult(J,W),l),b=\"F\"}else x=E=null,c()}else p=F(w),p.ok?(g=!0,b=\"F\"):b=null}else c();var K=1,tt=t.getAttribute(\"opacity\")||t.getAttribute(\"fill-opacity\");tt&&(K*=parseFloat(tt)),p&&\"number\"==typeof p.a&&(K*=p.a),o.setGState(new o.GState({opacity:K}))}if(f(t,\"g,path,rect,ellipse,line,circle,polygon\")){g&&o.setFillColor(p.r,p.g,p.b);var et=t.getAttribute(\"stroke\");if(et){var rt;t.hasAttribute(\"stroke-width\")&&(rt=Math.abs(parseFloat(t.getAttribute(\"stroke-width\"))),o.setLineWidth(rt));var at=new n(et);at.ok&&(o.setDrawColor(at.r,at.g,at.b),0!==rt&&(b=(b||\"\")+\"D\")),t.hasAttribute(\"stroke-linecap\")&&o.setLineCap(t.getAttribute(\"stroke-linecap\")),t.hasAttribute(\"stroke-linejoin\")&&o.setLineJoin(t.getAttribute(\"stroke-linejoin\")),t.hasAttribute(\"stroke-dasharray\")&&o.setLineDashPattern(M(t.getAttribute(\"stroke-dasharray\")),parseInt(t.getAttribute(\"stroke-dashoffset\"))||0),t.hasAttribute(\"stroke-miterlimit\")&&o.setLineMiterLimit(parseFloat(t.getAttribute(\"stroke-miterlimit\")))}}switch(i(t,p),t.tagName.toLowerCase()){case\"svg\":V(t,l,r,a,s);break;case\"g\":j(t,l,r,a,s);case\"a\":case\"marker\":Y(t,l,r,a,s);break;case\"defs\":Y(t,l,r,a,!0);break;case\"use\":q(t,l,a);break;case\"line\":L(t,l);break;case\"rect\":o.setCurrentTransformationMatrix(l),N(t,b,x,v);break;case\"ellipse\":o.setCurrentTransformationMatrix(l),O(t,b,x,v);break;case\"circle\":o.setCurrentTransformationMatrix(l),P(t,b,x,v);break;case\"text\":G(t,l,0,p);break;case\"path\":T(t,l,a,b,x,v);break;case\"polygon\":I(t,l,b,x,v);break;case\"image\":o.setCurrentTransformationMatrix(l),_(t);break;case\"lineargradient\":z(t,\"axial\",[t.getAttribute(\"x1\"),t.getAttribute(\"y1\"),t.getAttribute(\"x2\"),t.getAttribute(\"y2\")],r,a);break;case\"radialgradient\":z(t,\"radial\",[t.getAttribute(\"fx\")||t.getAttribute(\"cx\"),t.getAttribute(\"fy\")||t.getAttribute(\"cy\"),0,t.getAttribute(\"cx\")||0,t.getAttribute(\"cy\")||0,t.getAttribute(\"r\")||0],r,a);break;case\"pattern\":H(t,r,a)}y?o.endFormObject(a.get()+t.getAttribute(\"id\")):o.restoreGraphicsState()},U=function(t,e,r){o=e;var a=r.scale||1,i=r.xOffset||0,n=r.yOffset||0;return o.saveGraphicsState(),o.setCurrentTransformationMatrix(new o.Matrix(a,0,0,a,i,n)),B(t.cloneNode(!0),o.unitMatrix,{},new x(\"\"),!1),o.restoreGraphicsState(),o};\"function\"==typeof t&&t.amd?t([\"./rgbcolor\",\"SvgPath\"],function(t,e){return n=t,s=e,U}):void 0!==r&&r.exports?(n=e(\"./rgbcolor.js\"),s=e(\"SvgPath\"),r.exports=U):(s=a.SvgPath,n=a.RGBColor,a.svg2pdf=U,a.svgElementToPdf=U),U}(\"undefined\"!=typeof self&&self||\"undefined\"!=typeof window&&window||this)},{\"./rgbcolor.js\":8,SvgPath:1}]},{},[9])(9)});\n//# sourceMappingURL=svg2pdf.min.js.map\n"
  },
  {
    "path": "assets/highcharts/lib/svg2pdf.src.js",
    "content": "/**\n * Modules in this bundle\n * @license\n *\n * svg2pdf.js:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: yFiles for HTML Support Team <yfileshtml@yworks.com>\n *   homepage: https://github.com/yWorks/svg2pdf.js#readme\n *   version: 1.0.5\n *\n * svgpath:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   maintainers: vitaly <vitaly@rcdesign.ru>\n *   homepage: https://github.com/fontello/svgpath#readme\n *   version: 2.2.1\n *\n * This header is generated by licensify (https://github.com/twada/licensify)\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.svg2pdf = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require('./lib/svgpath');\n\n},{\"./lib/svgpath\":6}],2:[function(require,module,exports){\n// Convert an arc to a sequence of cubic bézier curves\n//\n'use strict';\n\n\nvar TAU = Math.PI * 2;\n\n\n/* eslint-disable space-infix-ops */\n\n// Calculate an angle between two vectors\n//\nfunction vector_angle(ux, uy, vx, vy) {\n  var sign = (ux * vy - uy * vx < 0) ? -1 : 1;\n  var umag = Math.sqrt(ux * ux + uy * uy);\n  var vmag = Math.sqrt(ux * ux + uy * uy);\n  var dot  = ux * vx + uy * vy;\n  var div  = dot / (umag * vmag);\n\n  // rounding errors, e.g. -1.0000000000000002 can screw up this\n  if (div >  1.0) { div =  1.0; }\n  if (div < -1.0) { div = -1.0; }\n\n  return sign * Math.acos(div);\n}\n\n\n// Convert from endpoint to center parameterization,\n// see http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n//\n// Return [cx, cy, theta1, delta_theta]\n//\nfunction get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi) {\n  // Step 1.\n  //\n  // Moving an ellipse so origin will be the middlepoint between our two\n  // points. After that, rotate it to line up ellipse axes with coordinate\n  // axes.\n  //\n  var x1p =  cos_phi*(x1-x2)/2 + sin_phi*(y1-y2)/2;\n  var y1p = -sin_phi*(x1-x2)/2 + cos_phi*(y1-y2)/2;\n\n  var rx_sq  =  rx * rx;\n  var ry_sq  =  ry * ry;\n  var x1p_sq = x1p * x1p;\n  var y1p_sq = y1p * y1p;\n\n  // Step 2.\n  //\n  // Compute coordinates of the centre of this ellipse (cx', cy')\n  // in the new coordinate system.\n  //\n  var radicant = (rx_sq * ry_sq) - (rx_sq * y1p_sq) - (ry_sq * x1p_sq);\n\n  if (radicant < 0) {\n    // due to rounding errors it might be e.g. -1.3877787807814457e-17\n    radicant = 0;\n  }\n\n  radicant /=   (rx_sq * y1p_sq) + (ry_sq * x1p_sq);\n  radicant = Math.sqrt(radicant) * (fa === fs ? -1 : 1);\n\n  var cxp = radicant *  rx/ry * y1p;\n  var cyp = radicant * -ry/rx * x1p;\n\n  // Step 3.\n  //\n  // Transform back to get centre coordinates (cx, cy) in the original\n  // coordinate system.\n  //\n  var cx = cos_phi*cxp - sin_phi*cyp + (x1+x2)/2;\n  var cy = sin_phi*cxp + cos_phi*cyp + (y1+y2)/2;\n\n  // Step 4.\n  //\n  // Compute angles (theta1, delta_theta).\n  //\n  var v1x =  (x1p - cxp) / rx;\n  var v1y =  (y1p - cyp) / ry;\n  var v2x = (-x1p - cxp) / rx;\n  var v2y = (-y1p - cyp) / ry;\n\n  var theta1 = vector_angle(1, 0, v1x, v1y);\n  var delta_theta = vector_angle(v1x, v1y, v2x, v2y);\n\n  if (fs === 0 && delta_theta > 0) {\n    delta_theta -= TAU;\n  }\n  if (fs === 1 && delta_theta < 0) {\n    delta_theta += TAU;\n  }\n\n  return [ cx, cy, theta1, delta_theta ];\n}\n\n//\n// Approximate one unit arc segment with bézier curves,\n// see http://math.stackexchange.com/questions/873224\n//\nfunction approximate_unit_arc(theta1, delta_theta) {\n  var alpha = 4/3 * Math.tan(delta_theta/4);\n\n  var x1 = Math.cos(theta1);\n  var y1 = Math.sin(theta1);\n  var x2 = Math.cos(theta1 + delta_theta);\n  var y2 = Math.sin(theta1 + delta_theta);\n\n  return [ x1, y1, x1 - y1*alpha, y1 + x1*alpha, x2 + y2*alpha, y2 - x2*alpha, x2, y2 ];\n}\n\nmodule.exports = function a2c(x1, y1, x2, y2, fa, fs, rx, ry, phi) {\n  var sin_phi = Math.sin(phi * TAU / 360);\n  var cos_phi = Math.cos(phi * TAU / 360);\n\n  // Make sure radii are valid\n  //\n  var x1p =  cos_phi*(x1-x2)/2 + sin_phi*(y1-y2)/2;\n  var y1p = -sin_phi*(x1-x2)/2 + cos_phi*(y1-y2)/2;\n\n  if (x1p === 0 && y1p === 0) {\n    // we're asked to draw line to itself\n    return [];\n  }\n\n  if (rx === 0 || ry === 0) {\n    // one of the radii is zero\n    return [];\n  }\n\n\n  // Compensate out-of-range radii\n  //\n  rx = Math.abs(rx);\n  ry = Math.abs(ry);\n\n  var lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);\n  if (lambda > 1) {\n    rx *= Math.sqrt(lambda);\n    ry *= Math.sqrt(lambda);\n  }\n\n\n  // Get center parameters (cx, cy, theta1, delta_theta)\n  //\n  var cc = get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi);\n\n  var result = [];\n  var theta1 = cc[2];\n  var delta_theta = cc[3];\n\n  // Split an arc to multiple segments, so each segment\n  // will be less than τ/4 (= 90°)\n  //\n  var segments = Math.max(Math.ceil(Math.abs(delta_theta) / (TAU / 4)), 1);\n  delta_theta /= segments;\n\n  for (var i = 0; i < segments; i++) {\n    result.push(approximate_unit_arc(theta1, delta_theta));\n    theta1 += delta_theta;\n  }\n\n  // We have a bezier approximation of a unit circle,\n  // now need to transform back to the original ellipse\n  //\n  return result.map(function (curve) {\n    for (var i = 0; i < curve.length; i += 2) {\n      var x = curve[i + 0];\n      var y = curve[i + 1];\n\n      // scale\n      x *= rx;\n      y *= ry;\n\n      // rotate\n      var xp = cos_phi*x - sin_phi*y;\n      var yp = sin_phi*x + cos_phi*y;\n\n      // translate\n      curve[i + 0] = xp + cc[0];\n      curve[i + 1] = yp + cc[1];\n    }\n\n    return curve;\n  });\n};\n\n},{}],3:[function(require,module,exports){\n'use strict';\n\n/* eslint-disable space-infix-ops */\n\n// The precision used to consider an ellipse as a circle\n//\nvar epsilon = 0.0000000001;\n\n// To convert degree in radians\n//\nvar torad = Math.PI / 180;\n\n// Class constructor :\n//  an ellipse centred at 0 with radii rx,ry and x - axis - angle ax.\n//\nfunction Ellipse(rx, ry, ax) {\n  if (!(this instanceof Ellipse)) { return new Ellipse(rx, ry, ax); }\n  this.rx = rx;\n  this.ry = ry;\n  this.ax = ax;\n}\n\n// Apply a linear transform m to the ellipse\n// m is an array representing a matrix :\n//    -         -\n//   | m[0] m[2] |\n//   | m[1] m[3] |\n//    -         -\n//\nEllipse.prototype.transform = function (m) {\n  // We consider the current ellipse as image of the unit circle\n  // by first scale(rx,ry) and then rotate(ax) ...\n  // So we apply ma =  m x rotate(ax) x scale(rx,ry) to the unit circle.\n  var c = Math.cos(this.ax * torad), s = Math.sin(this.ax * torad);\n  var ma = [\n    this.rx * (m[0]*c + m[2]*s),\n    this.rx * (m[1]*c + m[3]*s),\n    this.ry * (-m[0]*s + m[2]*c),\n    this.ry * (-m[1]*s + m[3]*c)\n  ];\n\n  // ma * transpose(ma) = [ J L ]\n  //                      [ L K ]\n  // L is calculated later (if the image is not a circle)\n  var J = ma[0]*ma[0] + ma[2]*ma[2],\n      K = ma[1]*ma[1] + ma[3]*ma[3];\n\n  // the discriminant of the characteristic polynomial of ma * transpose(ma)\n  var D = ((ma[0]-ma[3])*(ma[0]-ma[3]) + (ma[2]+ma[1])*(ma[2]+ma[1])) *\n          ((ma[0]+ma[3])*(ma[0]+ma[3]) + (ma[2]-ma[1])*(ma[2]-ma[1]));\n\n  // the \"mean eigenvalue\"\n  var JK = (J + K) / 2;\n\n  // check if the image is (almost) a circle\n  if (D < epsilon * JK) {\n    // if it is\n    this.rx = this.ry = Math.sqrt(JK);\n    this.ax = 0;\n    return this;\n  }\n\n  // if it is not a circle\n  var L = ma[0]*ma[1] + ma[2]*ma[3];\n\n  D = Math.sqrt(D);\n\n  // {l1,l2} = the two eigen values of ma * transpose(ma)\n  var l1 = JK + D/2,\n      l2 = JK - D/2;\n  // the x - axis - rotation angle is the argument of the l1 - eigenvector\n  this.ax = (Math.abs(L) < epsilon && Math.abs(l1 - K) < epsilon) ?\n    90\n  :\n    Math.atan(Math.abs(L) > Math.abs(l1 - K) ?\n      (l1 - J) / L\n    :\n      L / (l1 - K)\n    ) * 180 / Math.PI;\n\n  // if ax > 0 => rx = sqrt(l1), ry = sqrt(l2), else exchange axes and ax += 90\n  if (this.ax >= 0) {\n    // if ax in [0,90]\n    this.rx = Math.sqrt(l1);\n    this.ry = Math.sqrt(l2);\n  } else {\n    // if ax in ]-90,0[ => exchange axes\n    this.ax += 90;\n    this.rx = Math.sqrt(l2);\n    this.ry = Math.sqrt(l1);\n  }\n\n  return this;\n};\n\n// Check if the ellipse is (almost) degenerate, i.e. rx = 0 or ry = 0\n//\nEllipse.prototype.isDegenerate = function () {\n  return (this.rx < epsilon * this.ry || this.ry < epsilon * this.rx);\n};\n\nmodule.exports = Ellipse;\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\n// combine 2 matrixes\n// m1, m2 - [a, b, c, d, e, g]\n//\nfunction combine(m1, m2) {\n  return [\n    m1[0] * m2[0] + m1[2] * m2[1],\n    m1[1] * m2[0] + m1[3] * m2[1],\n    m1[0] * m2[2] + m1[2] * m2[3],\n    m1[1] * m2[2] + m1[3] * m2[3],\n    m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n    m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n  ];\n}\n\n\nfunction Matrix() {\n  if (!(this instanceof Matrix)) { return new Matrix(); }\n  this.queue = [];   // list of matrixes to apply\n  this.cache = null; // combined matrix cache\n}\n\n\nMatrix.prototype.matrix = function (m) {\n  if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0) {\n    return this;\n  }\n  this.cache = null;\n  this.queue.push(m);\n  return this;\n};\n\n\nMatrix.prototype.translate = function (tx, ty) {\n  if (tx !== 0 || ty !== 0) {\n    this.cache = null;\n    this.queue.push([ 1, 0, 0, 1, tx, ty ]);\n  }\n  return this;\n};\n\n\nMatrix.prototype.scale = function (sx, sy) {\n  if (sx !== 1 || sy !== 1) {\n    this.cache = null;\n    this.queue.push([ sx, 0, 0, sy, 0, 0 ]);\n  }\n  return this;\n};\n\n\nMatrix.prototype.rotate = function (angle, rx, ry) {\n  var rad, cos, sin;\n\n  if (angle !== 0) {\n    this.translate(rx, ry);\n\n    rad = angle * Math.PI / 180;\n    cos = Math.cos(rad);\n    sin = Math.sin(rad);\n\n    this.queue.push([ cos, sin, -sin, cos, 0, 0 ]);\n    this.cache = null;\n\n    this.translate(-rx, -ry);\n  }\n  return this;\n};\n\n\nMatrix.prototype.skewX = function (angle) {\n  if (angle !== 0) {\n    this.cache = null;\n    this.queue.push([ 1, 0, Math.tan(angle * Math.PI / 180), 1, 0, 0 ]);\n  }\n  return this;\n};\n\n\nMatrix.prototype.skewY = function (angle) {\n  if (angle !== 0) {\n    this.cache = null;\n    this.queue.push([ 1, Math.tan(angle * Math.PI / 180), 0, 1, 0, 0 ]);\n  }\n  return this;\n};\n\n\n// Flatten queue\n//\nMatrix.prototype.toArray = function () {\n  if (this.cache) {\n    return this.cache;\n  }\n\n  if (!this.queue.length) {\n    this.cache = [ 1, 0, 0, 1, 0, 0 ];\n    return this.cache;\n  }\n\n  this.cache = this.queue[0];\n\n  if (this.queue.length === 1) {\n    return this.cache;\n  }\n\n  for (var i = 1; i < this.queue.length; i++) {\n    this.cache = combine(this.cache, this.queue[i]);\n  }\n\n  return this.cache;\n};\n\n\n// Apply list of matrixes to (x,y) point.\n// If `isRelative` set, `translate` component of matrix will be skipped\n//\nMatrix.prototype.calc = function (x, y, isRelative) {\n  var m;\n\n  // Don't change point on empty transforms queue\n  if (!this.queue.length) { return [ x, y ]; }\n\n  // Calculate final matrix, if not exists\n  //\n  // NB. if you deside to apply transforms to point one-by-one,\n  // they should be taken in reverse order\n\n  if (!this.cache) {\n    this.cache = this.toArray();\n  }\n\n  m = this.cache;\n\n  // Apply matrix to point\n  return [\n    x * m[0] + y * m[2] + (isRelative ? 0 : m[4]),\n    x * m[1] + y * m[3] + (isRelative ? 0 : m[5])\n  ];\n};\n\n\nmodule.exports = Matrix;\n\n},{}],5:[function(require,module,exports){\n'use strict';\n\n\nvar paramCounts = { a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0 };\n\nvar SPECIAL_SPACES = [\n  0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006,\n  0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF\n];\n\nfunction isSpace(ch) {\n  return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029) || // Line terminators\n    // White spaces\n    (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||\n    (ch >= 0x1680 && SPECIAL_SPACES.indexOf(ch) >= 0);\n}\n\nfunction isCommand(code) {\n  /*eslint-disable no-bitwise*/\n  switch (code | 0x20) {\n    case 0x6D/* m */:\n    case 0x7A/* z */:\n    case 0x6C/* l */:\n    case 0x68/* h */:\n    case 0x76/* v */:\n    case 0x63/* c */:\n    case 0x73/* s */:\n    case 0x71/* q */:\n    case 0x74/* t */:\n    case 0x61/* a */:\n    case 0x72/* r */:\n      return true;\n  }\n  return false;\n}\n\nfunction isDigit(code) {\n  return (code >= 48 && code <= 57);   // 0..9\n}\n\nfunction isDigitStart(code) {\n  return (code >= 48 && code <= 57) || /* 0..9 */\n          code === 0x2B || /* + */\n          code === 0x2D || /* - */\n          code === 0x2E;   /* . */\n}\n\n\nfunction State(path) {\n  this.index  = 0;\n  this.path   = path;\n  this.max    = path.length;\n  this.result = [];\n  this.param  = 0.0;\n  this.err    = '';\n  this.segmentStart = 0;\n  this.data   = [];\n}\n\nfunction skipSpaces(state) {\n  while (state.index < state.max && isSpace(state.path.charCodeAt(state.index))) {\n    state.index++;\n  }\n}\n\n\nfunction scanParam(state) {\n  var start = state.index,\n      index = start,\n      max = state.max,\n      zeroFirst = false,\n      hasCeiling = false,\n      hasDecimal = false,\n      hasDot = false,\n      ch;\n\n  if (index >= max) {\n    state.err = 'SvgPath: missed param (at pos ' + index + ')';\n    return;\n  }\n  ch = state.path.charCodeAt(index);\n\n  if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n    index++;\n    ch = (index < max) ? state.path.charCodeAt(index) : 0;\n  }\n\n  // This logic is shamelessly borrowed from Esprima\n  // https://github.com/ariya/esprimas\n  //\n  if (!isDigit(ch) && ch !== 0x2E/* . */) {\n    state.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n    return;\n  }\n\n  if (ch !== 0x2E/* . */) {\n    zeroFirst = (ch === 0x30/* 0 */);\n    index++;\n\n    ch = (index < max) ? state.path.charCodeAt(index) : 0;\n\n    if (zeroFirst && index < max) {\n      // decimal number starts with '0' such as '09' is illegal.\n      if (ch && isDigit(ch)) {\n        state.err = 'SvgPath: numbers started with `0` such as `09` are ilegal (at pos ' + start + ')';\n        return;\n      }\n    }\n\n    while (index < max && isDigit(state.path.charCodeAt(index))) {\n      index++;\n      hasCeiling = true;\n    }\n    ch = (index < max) ? state.path.charCodeAt(index) : 0;\n  }\n\n  if (ch === 0x2E/* . */) {\n    hasDot = true;\n    index++;\n    while (isDigit(state.path.charCodeAt(index))) {\n      index++;\n      hasDecimal = true;\n    }\n    ch = (index < max) ? state.path.charCodeAt(index) : 0;\n  }\n\n  if (ch === 0x65/* e */ || ch === 0x45/* E */) {\n    if (hasDot && !hasCeiling && !hasDecimal) {\n      state.err = 'SvgPath: invalid float exponent (at pos ' + index + ')';\n      return;\n    }\n\n    index++;\n\n    ch = (index < max) ? state.path.charCodeAt(index) : 0;\n    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n      index++;\n    }\n    if (index < max && isDigit(state.path.charCodeAt(index))) {\n      while (index < max && isDigit(state.path.charCodeAt(index))) {\n        index++;\n      }\n    } else {\n      state.err = 'SvgPath: invalid float exponent (at pos ' + index + ')';\n      return;\n    }\n  }\n\n  state.index = index;\n  state.param = parseFloat(state.path.slice(start, index)) + 0.0;\n}\n\n\nfunction finalizeSegment(state) {\n  var cmd, cmdLC;\n\n  // Process duplicated commands (without comand name)\n\n  // This logic is shamelessly borrowed from Raphael\n  // https://github.com/DmitryBaranovskiy/raphael/\n  //\n  cmd   = state.path[state.segmentStart];\n  cmdLC = cmd.toLowerCase();\n\n  var params = state.data;\n\n  if (cmdLC === 'm' && params.length > 2) {\n    state.result.push([ cmd, params[0], params[1] ]);\n    params = params.slice(2);\n    cmdLC = 'l';\n    cmd = (cmd === 'm') ? 'l' : 'L';\n  }\n\n  if (cmdLC === 'r') {\n    state.result.push([ cmd ].concat(params));\n  } else {\n\n    while (params.length >= paramCounts[cmdLC]) {\n      state.result.push([ cmd ].concat(params.splice(0, paramCounts[cmdLC])));\n      if (!paramCounts[cmdLC]) {\n        break;\n      }\n    }\n  }\n}\n\n\nfunction scanSegment(state) {\n  var max = state.max,\n      cmdCode, comma_found, need_params, i;\n\n  state.segmentStart = state.index;\n  cmdCode = state.path.charCodeAt(state.index);\n\n  if (!isCommand(cmdCode)) {\n    state.err = 'SvgPath: bad command ' + state.path[state.index] + ' (at pos ' + state.index + ')';\n    return;\n  }\n\n  need_params = paramCounts[state.path[state.index].toLowerCase()];\n\n  state.index++;\n  skipSpaces(state);\n\n  state.data = [];\n\n  if (!need_params) {\n    // Z\n    finalizeSegment(state);\n    return;\n  }\n\n  comma_found = false;\n\n  for (;;) {\n    for (i = need_params; i > 0; i--) {\n      scanParam(state);\n      if (state.err.length) {\n        return;\n      }\n      state.data.push(state.param);\n\n      skipSpaces(state);\n      comma_found = false;\n\n      if (state.index < max && state.path.charCodeAt(state.index) === 0x2C/* , */) {\n        state.index++;\n        skipSpaces(state);\n        comma_found = true;\n      }\n    }\n\n    // after ',' param is mandatory\n    if (comma_found) {\n      continue;\n    }\n\n    if (state.index >= state.max) {\n      break;\n    }\n\n    // Stop on next segment\n    if (!isDigitStart(state.path.charCodeAt(state.index))) {\n      break;\n    }\n  }\n\n  finalizeSegment(state);\n}\n\n\n/* Returns array of segments:\n *\n * [\n *   [ command, coord1, coord2, ... ]\n * ]\n */\nmodule.exports = function pathParse(svgPath) {\n  var state = new State(svgPath);\n  var max = state.max;\n\n  skipSpaces(state);\n\n  while (state.index < max && !state.err.length) {\n    scanSegment(state);\n  }\n\n  if (state.err.length) {\n    state.result = [];\n\n  } else if (state.result.length) {\n\n    if ('mM'.indexOf(state.result[0][0]) < 0) {\n      state.err = 'SvgPath: string should start with `M` or `m`';\n      state.result = [];\n    } else {\n      state.result[0][0] = 'M';\n    }\n  }\n\n  return {\n    err: state.err,\n    segments: state.result\n  };\n};\n\n},{}],6:[function(require,module,exports){\n// SVG Path transformations library\n//\n// Usage:\n//\n//    SvgPath('...')\n//      .translate(-150, -100)\n//      .scale(0.5)\n//      .translate(-150, -100)\n//      .toFixed(1)\n//      .toString()\n//\n\n'use strict';\n\n\nvar pathParse      = require('./path_parse');\nvar transformParse = require('./transform_parse');\nvar matrix         = require('./matrix');\nvar a2c            = require('./a2c');\nvar ellipse        = require('./ellipse');\n\n\n// Class constructor\n//\nfunction SvgPath(path) {\n  if (!(this instanceof SvgPath)) { return new SvgPath(path); }\n\n  var pstate = pathParse(path);\n\n  // Array of path segments.\n  // Each segment is array [command, param1, param2, ...]\n  this.segments = pstate.segments;\n\n  // Error message on parse error.\n  this.err      = pstate.err;\n\n  // Transforms stack for lazy evaluation\n  this.__stack    = [];\n}\n\n\nSvgPath.prototype.__matrix = function (m) {\n  var self = this, i;\n\n  // Quick leave for empty matrix\n  if (!m.queue.length) { return; }\n\n  this.iterate(function (s, index, x, y) {\n    var p, result, name, isRelative;\n\n    switch (s[0]) {\n\n      // Process 'assymetric' commands separately\n      case 'v':\n        p      = m.calc(0, s[1], true);\n        result = (p[0] === 0) ? [ 'v', p[1] ] : [ 'l', p[0], p[1] ];\n        break;\n\n      case 'V':\n        p      = m.calc(x, s[1], false);\n        result = (p[0] === m.calc(x, y, false)[0]) ? [ 'V', p[1] ] : [ 'L', p[0], p[1] ];\n        break;\n\n      case 'h':\n        p      = m.calc(s[1], 0, true);\n        result = (p[1] === 0) ? [ 'h', p[0] ] : [ 'l', p[0], p[1] ];\n        break;\n\n      case 'H':\n        p      = m.calc(s[1], y, false);\n        result = (p[1] === m.calc(x, y, false)[1]) ? [ 'H', p[0] ] : [ 'L', p[0], p[1] ];\n        break;\n\n      case 'a':\n      case 'A':\n        // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n\n        // Drop segment if arc is empty (end point === start point)\n        /*if ((s[0] === 'A' && s[6] === x && s[7] === y) ||\n            (s[0] === 'a' && s[6] === 0 && s[7] === 0)) {\n          return [];\n        }*/\n\n        // Transform rx, ry and the x-axis-rotation\n        var ma = m.toArray();\n        var e = ellipse(s[1], s[2], s[3]).transform(ma);\n\n        // flip sweep-flag if matrix is not orientation-preserving\n        if (ma[0] * ma[3] - ma[1] * ma[2] < 0) {\n          s[5] = s[5] ? '0' : '1';\n        }\n\n        // Transform end point as usual (without translation for relative notation)\n        p = m.calc(s[6], s[7], s[0] === 'a');\n\n        // Empty arcs can be ignored by renderer, but should not be dropped\n        // to avoid collisions with `S A S` and so on. Replace with empty line.\n        if ((s[0] === 'A' && s[6] === x && s[7] === y) ||\n            (s[0] === 'a' && s[6] === 0 && s[7] === 0)) {\n          result = [ s[0] === 'a' ? 'l' : 'L', p[0], p[1] ];\n          break;\n        }\n\n        // if the resulting ellipse is (almost) a segment ...\n        if (e.isDegenerate()) {\n          // replace the arc by a line\n          result = [ s[0] === 'a' ? 'l' : 'L', p[0], p[1] ];\n        } else {\n          // if it is a real ellipse\n          // s[0], s[4] and s[5] are not modified\n          result = [ s[0], e.rx, e.ry, e.ax, s[4], s[5], p[0], p[1] ];\n        }\n\n        break;\n\n      case 'm':\n        // Edge case. The very first `m` should be processed as absolute, if happens.\n        // Make sense for coord shift transforms.\n        isRelative = index > 0;\n\n        p = m.calc(s[1], s[2], isRelative);\n        result = [ 'm', p[0], p[1] ];\n        break;\n\n      default:\n        name       = s[0];\n        result     = [ name ];\n        isRelative = (name.toLowerCase() === name);\n\n        // Apply transformations to the segment\n        for (i = 1; i < s.length; i += 2) {\n          p = m.calc(s[i], s[i + 1], isRelative);\n          result.push(p[0], p[1]);\n        }\n    }\n\n    self.segments[index] = result;\n  }, true);\n};\n\n\n// Apply stacked commands\n//\nSvgPath.prototype.__evaluateStack = function () {\n  var m, i;\n\n  if (!this.__stack.length) { return; }\n\n  if (this.__stack.length === 1) {\n    this.__matrix(this.__stack[0]);\n    this.__stack = [];\n    return;\n  }\n\n  m = matrix();\n  i = this.__stack.length;\n\n  while (--i >= 0) {\n    m.matrix(this.__stack[i].toArray());\n  }\n\n  this.__matrix(m);\n  this.__stack = [];\n};\n\n\n// Convert processed SVG Path back to string\n//\nSvgPath.prototype.toString = function () {\n  var elements = [], skipCmd, cmd;\n\n  this.__evaluateStack();\n\n  for (var i = 0; i < this.segments.length; i++) {\n    // remove repeating commands names\n    cmd = this.segments[i][0];\n    skipCmd = i > 0 && cmd !== 'm' && cmd !== 'M' && cmd === this.segments[i - 1][0];\n    elements = elements.concat(skipCmd ? this.segments[i].slice(1) : this.segments[i]);\n  }\n\n  return elements.join(' ')\n            // Optimizations: remove spaces around commands & before `-`\n            //\n            // We could also remove leading zeros for `0.5`-like values,\n            // but their count is too small to spend time for.\n            .replace(/ ?([achlmqrstvz]) ?/gi, '$1')\n            .replace(/ \\-/g, '-')\n            // workaround for FontForge SVG importing bug\n            .replace(/zm/g, 'z m');\n};\n\n\n// Translate path to (x [, y])\n//\nSvgPath.prototype.translate = function (x, y) {\n  this.__stack.push(matrix().translate(x, y || 0));\n  return this;\n};\n\n\n// Scale path to (sx [, sy])\n// sy = sx if not defined\n//\nSvgPath.prototype.scale = function (sx, sy) {\n  this.__stack.push(matrix().scale(sx, (!sy && (sy !== 0)) ? sx : sy));\n  return this;\n};\n\n\n// Rotate path around point (sx [, sy])\n// sy = sx if not defined\n//\nSvgPath.prototype.rotate = function (angle, rx, ry) {\n  this.__stack.push(matrix().rotate(angle, rx || 0, ry || 0));\n  return this;\n};\n\n\n// Skew path along the X axis by `degrees` angle\n//\nSvgPath.prototype.skewX = function (degrees) {\n  this.__stack.push(matrix().skewX(degrees));\n  return this;\n};\n\n\n// Skew path along the Y axis by `degrees` angle\n//\nSvgPath.prototype.skewY = function (degrees) {\n  this.__stack.push(matrix().skewY(degrees));\n  return this;\n};\n\n\n// Apply matrix transform (array of 6 elements)\n//\nSvgPath.prototype.matrix = function (m) {\n  this.__stack.push(matrix().matrix(m));\n  return this;\n};\n\n\n// Transform path according to \"transform\" attr of SVG spec\n//\nSvgPath.prototype.transform = function (transformString) {\n  if (!transformString.trim()) {\n    return this;\n  }\n  this.__stack.push(transformParse(transformString));\n  return this;\n};\n\n\n// Round coords with given decimal precition.\n// 0 by default (to integers)\n//\nSvgPath.prototype.round = function (d) {\n  var contourStartDeltaX = 0, contourStartDeltaY = 0, deltaX = 0, deltaY = 0, l;\n\n  d = d || 0;\n\n  this.__evaluateStack();\n\n  this.segments.forEach(function (s) {\n    var isRelative = (s[0].toLowerCase() === s[0]);\n\n    switch (s[0]) {\n      case 'H':\n      case 'h':\n        if (isRelative) { s[1] += deltaX; }\n        deltaX = s[1] - s[1].toFixed(d);\n        s[1] = +s[1].toFixed(d);\n        return;\n\n      case 'V':\n      case 'v':\n        if (isRelative) { s[1] += deltaY; }\n        deltaY = s[1] - s[1].toFixed(d);\n        s[1] = +s[1].toFixed(d);\n        return;\n\n      case 'Z':\n      case 'z':\n        deltaX = contourStartDeltaX;\n        deltaY = contourStartDeltaY;\n        return;\n\n      case 'M':\n      case 'm':\n        if (isRelative) {\n          s[1] += deltaX;\n          s[2] += deltaY;\n        }\n\n        deltaX = s[1] - s[1].toFixed(d);\n        deltaY = s[2] - s[2].toFixed(d);\n\n        contourStartDeltaX = deltaX;\n        contourStartDeltaY = deltaY;\n\n        s[1] = +s[1].toFixed(d);\n        s[2] = +s[2].toFixed(d);\n        return;\n\n      case 'A':\n      case 'a':\n        // [cmd, rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n        if (isRelative) {\n          s[6] += deltaX;\n          s[7] += deltaY;\n        }\n\n        deltaX = s[6] - s[6].toFixed(d);\n        deltaY = s[7] - s[7].toFixed(d);\n\n        s[1] = +s[1].toFixed(d);\n        s[2] = +s[2].toFixed(d);\n        s[3] = +s[3].toFixed(d + 2); // better precision for rotation\n        s[6] = +s[6].toFixed(d);\n        s[7] = +s[7].toFixed(d);\n        return;\n\n      default:\n        // a c l q s t\n        l = s.length;\n\n        if (isRelative) {\n          s[l - 2] += deltaX;\n          s[l - 1] += deltaY;\n        }\n\n        deltaX = s[l - 2] - s[l - 2].toFixed(d);\n        deltaY = s[l - 1] - s[l - 1].toFixed(d);\n\n        s.forEach(function (val, i) {\n          if (!i) { return; }\n          s[i] = +s[i].toFixed(d);\n        });\n        return;\n    }\n  });\n\n  return this;\n};\n\n\n// Apply iterator function to all segments. If function returns result,\n// current segment will be replaced to array of returned segments.\n// If empty array is returned, current regment will be deleted.\n//\nSvgPath.prototype.iterate = function (iterator, keepLazyStack) {\n  var segments = this.segments,\n      replacements = {},\n      needReplace = false,\n      lastX = 0,\n      lastY = 0,\n      countourStartX = 0,\n      countourStartY = 0;\n  var i, j, newSegments;\n\n  if (!keepLazyStack) {\n    this.__evaluateStack();\n  }\n\n  segments.forEach(function (s, index) {\n\n    var res = iterator(s, index, lastX, lastY);\n\n    if (Array.isArray(res)) {\n      replacements[index] = res;\n      needReplace = true;\n    }\n\n    var isRelative = (s[0] === s[0].toLowerCase());\n\n    // calculate absolute X and Y\n    switch (s[0]) {\n      case 'm':\n      case 'M':\n        lastX = s[1] + (isRelative ? lastX : 0);\n        lastY = s[2] + (isRelative ? lastY : 0);\n        countourStartX = lastX;\n        countourStartY = lastY;\n        return;\n\n      case 'h':\n      case 'H':\n        lastX = s[1] + (isRelative ? lastX : 0);\n        return;\n\n      case 'v':\n      case 'V':\n        lastY = s[1] + (isRelative ? lastY : 0);\n        return;\n\n      case 'z':\n      case 'Z':\n        // That make sence for multiple contours\n        lastX = countourStartX;\n        lastY = countourStartY;\n        return;\n\n      default:\n        lastX = s[s.length - 2] + (isRelative ? lastX : 0);\n        lastY = s[s.length - 1] + (isRelative ? lastY : 0);\n    }\n  });\n\n  // Replace segments if iterator return results\n\n  if (!needReplace) { return this; }\n\n  newSegments = [];\n\n  for (i = 0; i < segments.length; i++) {\n    if (typeof replacements[i] !== 'undefined') {\n      for (j = 0; j < replacements[i].length; j++) {\n        newSegments.push(replacements[i][j]);\n      }\n    } else {\n      newSegments.push(segments[i]);\n    }\n  }\n\n  this.segments = newSegments;\n\n  return this;\n};\n\n\n// Converts segments from relative to absolute\n//\nSvgPath.prototype.abs = function () {\n\n  this.iterate(function (s, index, x, y) {\n    var name = s[0],\n        nameUC = name.toUpperCase(),\n        i;\n\n    // Skip absolute commands\n    if (name === nameUC) { return; }\n\n    s[0] = nameUC;\n\n    switch (name) {\n      case 'v':\n        // v has shifted coords parity\n        s[1] += y;\n        return;\n\n      case 'a':\n        // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n        // touch x, y only\n        s[6] += x;\n        s[7] += y;\n        return;\n\n      default:\n        for (i = 1; i < s.length; i++) {\n          s[i] += i % 2 ? x : y; // odd values are X, even - Y\n        }\n    }\n  }, true);\n\n  return this;\n};\n\n\n// Converts segments from absolute to relative\n//\nSvgPath.prototype.rel = function () {\n\n  this.iterate(function (s, index, x, y) {\n    var name = s[0],\n        nameLC = name.toLowerCase(),\n        i;\n\n    // Skip relative commands\n    if (name === nameLC) { return; }\n\n    // Don't touch the first M to avoid potential confusions.\n    if (index === 0 && name === 'M') { return; }\n\n    s[0] = nameLC;\n\n    switch (name) {\n      case 'V':\n        // V has shifted coords parity\n        s[1] -= y;\n        return;\n\n      case 'A':\n        // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n        // touch x, y only\n        s[6] -= x;\n        s[7] -= y;\n        return;\n\n      default:\n        for (i = 1; i < s.length; i++) {\n          s[i] -= i % 2 ? x : y; // odd values are X, even - Y\n        }\n    }\n  }, true);\n\n  return this;\n};\n\n\n// Converts arcs to cubic bézier curves\n//\nSvgPath.prototype.unarc = function () {\n  this.iterate(function (s, index, x, y) {\n    var new_segments, nextX, nextY, result = [], name = s[0];\n\n    // Skip anything except arcs\n    if (name !== 'A' && name !== 'a') { return null; }\n\n    if (name === 'a') {\n      // convert relative arc coordinates to absolute\n      nextX = x + s[6];\n      nextY = y + s[7];\n    } else {\n      nextX = s[6];\n      nextY = s[7];\n    }\n\n    new_segments = a2c(x, y, nextX, nextY, s[4], s[5], s[1], s[2], s[3]);\n\n    // Degenerated arcs can be ignored by renderer, but should not be dropped\n    // to avoid collisions with `S A S` and so on. Replace with empty line.\n    if (new_segments.length === 0) {\n      return [ [ s[0] === 'a' ? 'l' : 'L', s[6], s[7] ] ];\n    }\n\n    new_segments.forEach(function (s) {\n      result.push([ 'C', s[2], s[3], s[4], s[5], s[6], s[7] ]);\n    });\n\n    return result;\n  });\n\n  return this;\n};\n\n\n// Converts smooth curves (with missed control point) to generic curves\n//\nSvgPath.prototype.unshort = function () {\n  var segments = this.segments;\n  var prevControlX, prevControlY, prevSegment;\n  var curControlX, curControlY;\n\n  // TODO: add lazy evaluation flag when relative commands supported\n\n  this.iterate(function (s, idx, x, y) {\n    var name = s[0], nameUC = name.toUpperCase(), isRelative;\n\n    // First command MUST be M|m, it's safe to skip.\n    // Protect from access to [-1] for sure.\n    if (!idx) { return; }\n\n    if (nameUC === 'T') { // quadratic curve\n      isRelative = (name === 't');\n\n      prevSegment = segments[idx - 1];\n\n      if (prevSegment[0] === 'Q') {\n        prevControlX = prevSegment[1] - x;\n        prevControlY = prevSegment[2] - y;\n      } else if (prevSegment[0] === 'q') {\n        prevControlX = prevSegment[1] - prevSegment[3];\n        prevControlY = prevSegment[2] - prevSegment[4];\n      } else {\n        prevControlX = 0;\n        prevControlY = 0;\n      }\n\n      curControlX = -prevControlX;\n      curControlY = -prevControlY;\n\n      if (!isRelative) {\n        curControlX += x;\n        curControlY += y;\n      }\n\n      segments[idx] = [\n        isRelative ? 'q' : 'Q',\n        curControlX, curControlY,\n        s[1], s[2]\n      ];\n\n    } else if (nameUC === 'S') { // cubic curve\n      isRelative = (name === 's');\n\n      prevSegment = segments[idx - 1];\n\n      if (prevSegment[0] === 'C') {\n        prevControlX = prevSegment[3] - x;\n        prevControlY = prevSegment[4] - y;\n      } else if (prevSegment[0] === 'c') {\n        prevControlX = prevSegment[3] - prevSegment[5];\n        prevControlY = prevSegment[4] - prevSegment[6];\n      } else {\n        prevControlX = 0;\n        prevControlY = 0;\n      }\n\n      curControlX = -prevControlX;\n      curControlY = -prevControlY;\n\n      if (!isRelative) {\n        curControlX += x;\n        curControlY += y;\n      }\n\n      segments[idx] = [\n        isRelative ? 'c' : 'C',\n        curControlX, curControlY,\n        s[1], s[2], s[3], s[4]\n      ];\n    }\n  });\n\n  return this;\n};\n\n\nmodule.exports = SvgPath;\n\n},{\"./a2c\":2,\"./ellipse\":3,\"./matrix\":4,\"./path_parse\":5,\"./transform_parse\":7}],7:[function(require,module,exports){\n'use strict';\n\n\nvar Matrix = require('./matrix');\n\nvar operations = {\n  matrix: true,\n  scale: true,\n  rotate: true,\n  translate: true,\n  skewX: true,\n  skewY: true\n};\n\nvar CMD_SPLIT_RE    = /\\s*(matrix|translate|scale|rotate|skewX|skewY)\\s*\\(\\s*(.+?)\\s*\\)[\\s,]*/;\nvar PARAMS_SPLIT_RE = /[\\s,]+/;\n\n\nmodule.exports = function transformParse(transformString) {\n  var matrix = new Matrix();\n  var cmd, params;\n\n  // Split value into ['', 'translate', '10 50', '', 'scale', '2', '', 'rotate',  '-45', '']\n  transformString.split(CMD_SPLIT_RE).forEach(function (item) {\n\n    // Skip empty elements\n    if (!item.length) { return; }\n\n    // remember operation\n    if (typeof operations[item] !== 'undefined') {\n      cmd = item;\n      return;\n    }\n\n    // extract params & att operation to matrix\n    params = item.split(PARAMS_SPLIT_RE).map(function (i) {\n      return +i || 0;\n    });\n\n    // If params count is not correct - ignore command\n    switch (cmd) {\n      case 'matrix':\n        if (params.length === 6) {\n          matrix.matrix(params);\n        }\n        return;\n\n      case 'scale':\n        if (params.length === 1) {\n          matrix.scale(params[0], params[0]);\n        } else if (params.length === 2) {\n          matrix.scale(params[0], params[1]);\n        }\n        return;\n\n      case 'rotate':\n        if (params.length === 1) {\n          matrix.rotate(params[0], 0, 0);\n        } else if (params.length === 3) {\n          matrix.rotate(params[0], params[1], params[2]);\n        }\n        return;\n\n      case 'translate':\n        if (params.length === 1) {\n          matrix.translate(params[0], 0);\n        } else if (params.length === 2) {\n          matrix.translate(params[0], params[1]);\n        }\n        return;\n\n      case 'skewX':\n        if (params.length === 1) {\n          matrix.skewX(params[0]);\n        }\n        return;\n\n      case 'skewY':\n        if (params.length === 1) {\n          matrix.skewY(params[0]);\n        }\n        return;\n    }\n  });\n\n  return matrix;\n};\n\n},{\"./matrix\":4}],8:[function(require,module,exports){\n/**\n * A class to parse color values\n * @author Stoyan Stefanov <sstoo@gmail.com>\n * @link   http://www.phpied.com/rgb-color-parser-in-javascript/\n * @license Use it if you like it\n */\n(function (global) {\nfunction RGBColor(color_string)\n{\n  this.ok = false;\n\n  // strip any leading #\n  if (color_string.charAt(0) == '#') { // remove # if any\n    color_string = color_string.substr(1,6);\n  }\n\n  color_string = color_string.replace(/ /g,'');\n  color_string = color_string.toLowerCase();\n\n  // before getting into regexps, try simple matches\n  // and overwrite the input\n  var simple_colors = {\n    aliceblue: 'f0f8ff',\n    antiquewhite: 'faebd7',\n    aqua: '00ffff',\n    aquamarine: '7fffd4',\n    azure: 'f0ffff',\n    beige: 'f5f5dc',\n    bisque: 'ffe4c4',\n    black: '000000',\n    blanchedalmond: 'ffebcd',\n    blue: '0000ff',\n    blueviolet: '8a2be2',\n    brown: 'a52a2a',\n    burlywood: 'deb887',\n    cadetblue: '5f9ea0',\n    chartreuse: '7fff00',\n    chocolate: 'd2691e',\n    coral: 'ff7f50',\n    cornflowerblue: '6495ed',\n    cornsilk: 'fff8dc',\n    crimson: 'dc143c',\n    cyan: '00ffff',\n    darkblue: '00008b',\n    darkcyan: '008b8b',\n    darkgoldenrod: 'b8860b',\n    darkgray: 'a9a9a9',\n    darkgreen: '006400',\n    darkkhaki: 'bdb76b',\n    darkmagenta: '8b008b',\n    darkolivegreen: '556b2f',\n    darkorange: 'ff8c00',\n    darkorchid: '9932cc',\n    darkred: '8b0000',\n    darksalmon: 'e9967a',\n    darkseagreen: '8fbc8f',\n    darkslateblue: '483d8b',\n    darkslategray: '2f4f4f',\n    darkturquoise: '00ced1',\n    darkviolet: '9400d3',\n    deeppink: 'ff1493',\n    deepskyblue: '00bfff',\n    dimgray: '696969',\n    dodgerblue: '1e90ff',\n    feldspar: 'd19275',\n    firebrick: 'b22222',\n    floralwhite: 'fffaf0',\n    forestgreen: '228b22',\n    fuchsia: 'ff00ff',\n    gainsboro: 'dcdcdc',\n    ghostwhite: 'f8f8ff',\n    gold: 'ffd700',\n    goldenrod: 'daa520',\n    gray: '808080',\n    green: '008000',\n    greenyellow: 'adff2f',\n    honeydew: 'f0fff0',\n    hotpink: 'ff69b4',\n    indianred : 'cd5c5c',\n    indigo : '4b0082',\n    ivory: 'fffff0',\n    khaki: 'f0e68c',\n    lavender: 'e6e6fa',\n    lavenderblush: 'fff0f5',\n    lawngreen: '7cfc00',\n    lemonchiffon: 'fffacd',\n    lightblue: 'add8e6',\n    lightcoral: 'f08080',\n    lightcyan: 'e0ffff',\n    lightgoldenrodyellow: 'fafad2',\n    lightgrey: 'd3d3d3',\n    lightgreen: '90ee90',\n    lightpink: 'ffb6c1',\n    lightsalmon: 'ffa07a',\n    lightseagreen: '20b2aa',\n    lightskyblue: '87cefa',\n    lightslateblue: '8470ff',\n    lightslategray: '778899',\n    lightsteelblue: 'b0c4de',\n    lightyellow: 'ffffe0',\n    lime: '00ff00',\n    limegreen: '32cd32',\n    linen: 'faf0e6',\n    magenta: 'ff00ff',\n    maroon: '800000',\n    mediumaquamarine: '66cdaa',\n    mediumblue: '0000cd',\n    mediumorchid: 'ba55d3',\n    mediumpurple: '9370d8',\n    mediumseagreen: '3cb371',\n    mediumslateblue: '7b68ee',\n    mediumspringgreen: '00fa9a',\n    mediumturquoise: '48d1cc',\n    mediumvioletred: 'c71585',\n    midnightblue: '191970',\n    mintcream: 'f5fffa',\n    mistyrose: 'ffe4e1',\n    moccasin: 'ffe4b5',\n    navajowhite: 'ffdead',\n    navy: '000080',\n    oldlace: 'fdf5e6',\n    olive: '808000',\n    olivedrab: '6b8e23',\n    orange: 'ffa500',\n    orangered: 'ff4500',\n    orchid: 'da70d6',\n    palegoldenrod: 'eee8aa',\n    palegreen: '98fb98',\n    paleturquoise: 'afeeee',\n    palevioletred: 'd87093',\n    papayawhip: 'ffefd5',\n    peachpuff: 'ffdab9',\n    peru: 'cd853f',\n    pink: 'ffc0cb',\n    plum: 'dda0dd',\n    powderblue: 'b0e0e6',\n    purple: '800080',\n    red: 'ff0000',\n    rosybrown: 'bc8f8f',\n    royalblue: '4169e1',\n    saddlebrown: '8b4513',\n    salmon: 'fa8072',\n    sandybrown: 'f4a460',\n    seagreen: '2e8b57',\n    seashell: 'fff5ee',\n    sienna: 'a0522d',\n    silver: 'c0c0c0',\n    skyblue: '87ceeb',\n    slateblue: '6a5acd',\n    slategray: '708090',\n    snow: 'fffafa',\n    springgreen: '00ff7f',\n    steelblue: '4682b4',\n    tan: 'd2b48c',\n    teal: '008080',\n    thistle: 'd8bfd8',\n    tomato: 'ff6347',\n    turquoise: '40e0d0',\n    violet: 'ee82ee',\n    violetred: 'd02090',\n    wheat: 'f5deb3',\n    white: 'ffffff',\n    whitesmoke: 'f5f5f5',\n    yellow: 'ffff00',\n    yellowgreen: '9acd32'\n  };\n  for (var key in simple_colors) {\n    if (color_string == key) {\n      color_string = simple_colors[key];\n    }\n  }\n  // emd of simple type-in colors\n\n  // array of color definition objects\n  var color_defs = [\n    {\n      re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n      example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n      process: function (bits){\n        return [\n          parseInt(bits[1]),\n          parseInt(bits[2]),\n          parseInt(bits[3])\n        ];\n      }\n    },\n    {\n      re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n      example: ['#00ff00', '336699'],\n      process: function (bits){\n        return [\n          parseInt(bits[1], 16),\n          parseInt(bits[2], 16),\n          parseInt(bits[3], 16)\n        ];\n      }\n    },\n    {\n      re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n      example: ['#fb0', 'f0f'],\n      process: function (bits){\n        return [\n          parseInt(bits[1] + bits[1], 16),\n          parseInt(bits[2] + bits[2], 16),\n          parseInt(bits[3] + bits[3], 16)\n        ];\n      }\n    }\n  ];\n\n  // search through the definitions to find a match\n  for (var i = 0; i < color_defs.length; i++) {\n    var re = color_defs[i].re;\n    var processor = color_defs[i].process;\n    var bits = re.exec(color_string);\n    if (bits) {\n      var channels = processor(bits);\n      this.r = channels[0];\n      this.g = channels[1];\n      this.b = channels[2];\n      this.ok = true;\n    }\n\n  }\n\n  // validate/cleanup values\n  this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n  this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n  this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n\n  // some getters\n  this.toRGB = function () {\n    return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n  }\n  this.toHex = function () {\n    var r = this.r.toString(16);\n    var g = this.g.toString(16);\n    var b = this.b.toString(16);\n    if (r.length == 1) r = '0' + r;\n    if (g.length == 1) g = '0' + g;\n    if (b.length == 1) b = '0' + b;\n    return '#' + r + g + b;\n  }\n\n  // help\n  this.getHelpXML = function () {\n\n    var examples = new Array();\n    // add regexps\n    for (var i = 0; i < color_defs.length; i++) {\n      var example = color_defs[i].example;\n      for (var j = 0; j < example.length; j++) {\n        examples[examples.length] = example[j];\n      }\n    }\n    // add type-in colors\n    for (var sc in simple_colors) {\n      examples[examples.length] = sc;\n    }\n\n    var xml = document.createElement('ul');\n    xml.setAttribute('id', 'rgbcolor-examples');\n    for (var i = 0; i < examples.length; i++) {\n      try {\n        var list_item = document.createElement('li');\n        var list_color = new RGBColor(examples[i]);\n        var example_div = document.createElement('div');\n        example_div.style.cssText =\n            'margin: 3px; '\n            + 'border: 1px solid black; '\n            + 'background:' + list_color.toHex() + '; '\n            + 'color:' + list_color.toHex()\n        ;\n        example_div.appendChild(document.createTextNode('test'));\n        var list_item_value = document.createTextNode(\n            ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()\n        );\n        list_item.appendChild(example_div);\n        list_item.appendChild(list_item_value);\n        xml.appendChild(list_item);\n\n      } catch(e){}\n    }\n    return xml;\n\n  }\n\n}\nif (typeof define === \"function\" && define.amd) {\n  define(function () {\n    return RGBColor;\n  });\n} else if (typeof module !== \"undefined\" && module.exports) {\n  module.exports = RGBColor;\n} else {\n  global.RGBColor = RGBColor;\n}\nreturn RGBColor;\n})(typeof self !== \"undefined\" && self || typeof window !== \"undefined\" && window || this);\n\n},{}],9:[function(require,module,exports){\n/*\nThe MIT License (MIT)\n\nCopyright (c) 2015-2016 yWorks GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/**\n * Renders an svg element to a jsPDF document.\n * For accurate results a DOM document is required (mainly used for text size measurement and image format conversion)\n * @param element {HTMLElement} The svg element, which will be cloned, so the original stays unchanged.\n * @param pdf {jsPDF} The jsPDF object.\n * @param options {object} An object that may contain render options. Currently supported are:\n *                         scale: The global factor by which everything is scaled.\n *                         xOffset, yOffset: Offsets that are added to every coordinate AFTER scaling (They are not\n *                            influenced by the scale attribute).\n */\n(function (global) {\n  var RGBColor;\n  var SvgPath;\n\n  var _pdf; // jsPDF pdf-document\n\n  var cToQ = 2 / 3; // ratio to convert quadratic bezier curves to cubic ones\n\n  var iriReference = /url\\(#([^)]+)\\)/;\n\n\n  // pathSegList is marked deprecated in chrome, so parse the d attribute manually if necessary\n  var getPathSegList = function (node) {\n    var d = node.getAttribute(\"d\");\n\n    // Replace arcs before path segment list is handled\n    if (SvgPath) {\n      d = SvgPath(d).unshort().unarc().abs().toString();\n      node.setAttribute('d', d);\n    }\n\n    var pathSegList = node.pathSegList;\n    \n    if (pathSegList) {\n      return pathSegList;\n    }\n\n    pathSegList = [];\n\n    var regex = /([a-df-zA-DF-Z])([^a-df-zA-DF-Z]*)/g,\n        match;\n    while (match = regex.exec(d)) {\n      var coords = parseFloats(match[2]);\n\n      var type = match[1];\n      var length = \"zZ\".indexOf(type) >= 0 ? 0 :\n          \"hHvV\".indexOf(type) >= 0  ? 1 :\n          \"mMlLtT\".indexOf(type) >= 0  ? 2 :\n          \"sSqQ\".indexOf(type) >= 0  ? 4 :\n          \"aA\".indexOf(type) >= 0  ? 7 :\n          \"cC\".indexOf(type) >= 0  ? 6 : -1;\n\n      var i = 0;\n      do {\n        var pathSeg = {pathSegTypeAsLetter: type};\n        switch (type) {\n          case \"h\":\n          case \"H\":\n            pathSeg.x = coords[i];\n            break;\n\n          case \"v\":\n          case \"V\":\n            pathSeg.y = coords[i];\n            break;\n\n          case \"c\":\n          case \"C\":\n            pathSeg.x1 = coords[i + length - 6];\n            pathSeg.y1 = coords[i + length - 5];\n          case \"s\":\n          case \"S\":\n            pathSeg.x2 = coords[i + length - 4];\n            pathSeg.y2 = coords[i + length - 3];\n          case \"t\":\n          case \"T\":\n          case \"l\":\n          case \"L\":\n          case \"m\":\n          case \"M\":\n            pathSeg.x = coords[i + length - 2];\n            pathSeg.y = coords[i + length - 1];\n            break;\n\n          case \"q\":\n          case \"Q\":\n            pathSeg.x1 = coords[i];\n            pathSeg.y1 = coords[i + 1];\n            pathSeg.x = coords[i + 2];\n            pathSeg.y = coords[i + 3];\n            break;\n          case \"a\":\n          case \"A\":\n            throw new Error(\"Cannot convert Arcs without SvgPath package\");\n        }\n\n        pathSegList.push(pathSeg);\n        i += length;\n      } while(i < coords.length);\n    }\n\n    pathSegList.getItem = function (i) {\n      return this[i]\n    };\n    pathSegList.numberOfItems = pathSegList.length;\n\n    return pathSegList;\n  };\n\n  // returns an attribute of a node, either from the node directly or from css\n  var getAttribute = function (node, propertyNode, propertyCss) {\n    propertyCss = propertyCss || propertyNode;\n    return node.getAttribute(propertyNode) || node.style[propertyCss];\n  };\n\n  var nodeIs = function (node, tagsString) {\n    return tagsString.split(\",\").indexOf(node.tagName.toLowerCase()) >= 0;\n  };\n\n  var forEachChild = function (node, fn) {\n    // copy list of children, as the original might be modified\n    var children = [];\n    for (var i = 0; i < node.childNodes.length; i++) {\n      var childNode = node.childNodes[i];\n      if (childNode.nodeName.charAt(0) !== \"#\")\n        children.push(childNode);\n    }\n    for (i = 0; i < children.length; i++) {\n      fn(i, children[i]);\n    }\n  };\n\n  var getAngle = function (from, to) {\n    return Math.atan2(to[1] - from[1], to[0] - from[0]);\n  };\n\n  // mirrors p1 at p2\n  var mirrorPoint = function (p1, p2) {\n    var dx = p2[0] - p1[0];\n    var dy = p2[1] - p1[1];\n\n    return [p1[0] + 2 * dx, p1[1] + 2 * dy];\n  };\n\n  // transforms a cubic bezier control point to a quadratic one: returns from + (2/3) * (to - from)\n  var toCubic = function (from, to) {\n    return [cToQ * (to[0] - from[0]) + from[0], cToQ * (to[1] - from[1]) + from[1]];\n  };\n\n  // extracts a control point from a previous path segment (for t,T,s,S segments)\n  var getControlPointFromPrevious = function (i, from, list, prevX, prevY) {\n    var prev = list.getItem(i - 1);\n    var p2;\n    if (i > 0 && (prev.pathSegTypeAsLetter === \"C\" || prev.pathSegTypeAsLetter === \"S\")) {\n      p2 = mirrorPoint([prev.x2, prev.y2], from);\n    } else if (i > 0 && (prev.pathSegTypeAsLetter === \"c\" || prev.pathSegTypeAsLetter === \"s\")) {\n      p2 = mirrorPoint([prev.x2 + prevX, prev.y2 + prevY], from);\n    } else {\n      p2 = [from[0], from[1]];\n    }\n    return p2;\n  };\n\n  // an id prefix to handle duplicate ids\n  var SvgPrefix = function (prefix) {\n    this.prefix = prefix;\n    this.id = 0;\n    this.nextChild = function () {\n      return new SvgPrefix(\"_\" + this.id++ + \"_\" + this.get());\n    };\n    this.get = function () {\n      return this.prefix;\n    }\n  };\n\n  // returns the node for the specified id or incrementally removes prefixes to search \"higher\" levels\n  var getFromDefs = function (id, defs) {\n    var regExp = /_\\d+_/;\n    while (!defs[id] && regExp.exec(id)) {\n      id = id.replace(regExp, \"\");\n    }\n    return defs[id];\n  };\n\n  // replace any newline characters by space and trim\n  var removeNewlinesAndTrim = function (str) {\n    return str.replace(/[\\n\\s\\r]+/, \" \").trim();\n  };\n\n  // clones the defs object (or basically any object)\n  var cloneDefs = function (defs) {\n    var clone = {};\n    for (var key in defs) {\n      if (defs.hasOwnProperty(key)) {\n        clone[key] = defs[key];\n      }\n    }\n    return clone;\n  };\n\n  // computes the transform directly applied at the node (such as viewbox scaling and the \"transform\" atrribute)\n  // x,y,cx,cy,r,... are omitted\n  var computeNodeTransform = function (node) {\n    var height, width, viewBoxHeight, viewBoxWidth, bounds, viewBox, y, x;\n    var nodeTransform = _pdf.unitMatrix;\n    if (nodeIs(node, \"svg,g\")) {\n      x = parseFloat(node.getAttribute(\"x\")) || 0;\n      y = parseFloat(node.getAttribute(\"y\")) || 0;\n\n      // jquery doesn't like camelCase notation...\n      viewBox = node.getAttribute(\"viewBox\");\n      if (viewBox) {\n        bounds = parseFloats(viewBox);\n        viewBoxWidth = bounds[2] - bounds[0];\n        viewBoxHeight = bounds[3] - bounds[1];\n        width = parseFloat(node.getAttribute(\"width\")) || viewBoxWidth;\n        height = parseFloat(node.getAttribute(\"height\")) || viewBoxHeight;\n        nodeTransform = new _pdf.Matrix(width / viewBoxWidth, 0, 0, height / viewBoxHeight, x - bounds[0], y - bounds[1]);\n      } else {\n        nodeTransform = new _pdf.Matrix(1, 0, 0, 1, x, y);\n      }\n    } else if (nodeIs(node, \"marker\")) {\n      x = -parseFloat(node.getAttribute(\"refX\")) || 0;\n      y = -parseFloat(node.getAttribute(\"refY\")) || 0;\n\n      viewBox = node.getAttribute(\"viewBox\");\n      if (viewBox) {\n        bounds = parseFloats(viewBox);\n        viewBoxWidth = bounds[2] - bounds[0];\n        viewBoxHeight = bounds[3] - bounds[1];\n        width = parseFloat(node.getAttribute(\"markerWidth\")) || viewBoxWidth;\n        height = parseFloat(node.getAttribute(\"markerHeight\")) || viewBoxHeight;\n\n        var s = new _pdf.Matrix(width / viewBoxWidth, 0, 0, height / viewBoxHeight, 0, 0);\n        var t = new _pdf.Matrix(1, 0, 0, 1, x, y);\n        nodeTransform = _pdf.matrixMult(t, s);\n      } else {\n        nodeTransform = new _pdf.Matrix(1, 0, 0, 1, x, y);\n      }\n    }\n\n    var transformString = node.getAttribute(\"transform\");\n    if (!transformString)\n      return nodeTransform;\n    else\n      return _pdf.matrixMult(nodeTransform, parseTransform(transformString));\n  };\n\n  // parses the \"points\" string used by polygons and returns an array of points\n  var parsePointsString = function (string) {\n    var floats = parseFloats(string);\n    var result = [];\n    for (var i = 0; i < floats.length - 1; i += 2) {\n      var x = floats[i];\n      var y = floats[i + 1];\n      result.push([x, y]);\n    }\n    return result;\n  };\n\n  // parses the \"transform\" string\n  var parseTransform = function (transformString) {\n    if (!transformString)\n      return _pdf.unitMatrix;\n\n    var mRegex = /^\\s*matrix\\(([^\\)]+)\\)\\s*/,\n        tRegex = /^\\s*translate\\(([^\\)]+)\\)\\s*/,\n        rRegex = /^\\s*rotate\\(([^\\)]+)\\)\\s*/,\n        sRegex = /^\\s*scale\\(([^\\)]+)\\)\\s*/,\n        sXRegex = /^\\s*skewX\\(([^\\)]+)\\)\\s*/,\n        sYRegex = /^\\s*skewY\\(([^\\)]+)\\)\\s*/;\n\n    var resultMatrix = _pdf.unitMatrix, m;\n\n    while (transformString.length > 0) {\n      var match = mRegex.exec(transformString);\n      if (match) {\n        m = parseFloats(match[1]);\n        resultMatrix = _pdf.matrixMult(new _pdf.Matrix(m[0], m[1], m[2], m[3], m[4], m[5]), resultMatrix);\n        transformString = transformString.substr(match[0].length);\n      }\n      match = rRegex.exec(transformString);\n      if (match) {\n        m = parseFloats(match[1]);\n        var a = Math.PI * m[0] / 180;\n        resultMatrix = _pdf.matrixMult(new _pdf.Matrix(Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0), resultMatrix);\n        if (m[1] && m[2]) {\n          var t1 = new _pdf.Matrix(1, 0, 0, 1, m[1], m[2]);\n          var t2 = new _pdf.Matrix(1, 0, 0, 1, -m[1], -m[2]);\n          resultMatrix = _pdf.matrixMult(t2, _pdf.matrixMult(resultMatrix, t1));\n        }\n        transformString = transformString.substr(match[0].length);\n      }\n      match = tRegex.exec(transformString);\n      if (match) {\n        m = parseFloats(match[1]);\n        resultMatrix = _pdf.matrixMult(new _pdf.Matrix(1, 0, 0, 1, m[0], m[1] || 0), resultMatrix);\n        transformString = transformString.substr(match[0].length);\n      }\n      match = sRegex.exec(transformString);\n      if (match) {\n        m = parseFloats(match[1]);\n        if (!m[1])\n          m[1] = m[0];\n        resultMatrix = _pdf.matrixMult(new _pdf.Matrix(m[0], 0, 0, m[1], 0, 0), resultMatrix);\n        transformString = transformString.substr(match[0].length);\n      }\n      match = sXRegex.exec(transformString);\n      if (match) {\n        m = parseFloat(match[1]);\n        resultMatrix = _pdf.matrixMult(new _pdf.Matrix(1, 0, Math.tan(m), 1, 0, 0), resultMatrix);\n        transformString = transformString.substr(match[0].length);\n      }\n      match = sYRegex.exec(transformString);\n      if (match) {\n        m = parseFloat(match[1]);\n        resultMatrix = _pdf.matrixMult(new _pdf.Matrix(1, Math.tan(m), 0, 1, 0, 0), resultMatrix);\n        transformString = transformString.substr(match[0].length);\n      }\n    }\n    return resultMatrix;\n  };\n\n  // parses a comma, sign and/or whitespace separated string of floats and returns the single floats in an array\n  var parseFloats = function (str) {\n    var floats = [], match,\n        regex = /[+-]?(?:(?:\\d+\\.?\\d*)|(?:\\d*\\.?\\d+))(?:[eE][+-]?\\d+)?/g;\n    while(match = regex.exec(str)) {\n      floats.push(parseFloat(match[0]));\n    }\n    return floats;\n  };\n\n  // extends RGBColor by rgba colors as RGBColor is not capable of it\n  var parseColor = function (colorString) {\n    var match = /\\s*rgba\\(((?:[^,\\)]*,){3}[^,\\)]*)\\)\\s*/.exec(colorString);\n    if (match) {\n      var floats = parseFloats(match[1]);\n      var color = new RGBColor(\"rgb(\" + floats.slice(0,3).join(\",\") + \")\");\n      color.a = floats[3];\n      return color;\n    } else {\n      return new RGBColor(colorString);\n    }\n  };\n\n  // multiplies a vector with a matrix: vec' = vec * matrix\n  var multVecMatrix = function (vec, matrix) {\n    var x = vec[0];\n    var y = vec[1];\n    return [\n      matrix.a * x + matrix.c * y + matrix.e,\n      matrix.b * x + matrix.d * y + matrix.f\n    ];\n  };\n\n  // returns the untransformed bounding box [x, y, width, height] of an svg element (quite expensive for path and polygon objects, as\n  // the whole points/d-string has to be processed)\n  var getUntransformedBBox = function (node) {\n    var i, minX, minY, maxX, maxY, viewBox, vb, boundingBox;\n    var pf = parseFloat;\n\n    if (nodeIs(node, \"polygon\")) {\n      var points = parsePointsString(node.getAttribute(\"points\"));\n      minX = Number.POSITIVE_INFINITY;\n      minY = Number.POSITIVE_INFINITY;\n      maxX = Number.NEGATIVE_INFINITY;\n      maxY = Number.NEGATIVE_INFINITY;\n      for (i = 0; i < points.length; i++) {\n        var point = points[i];\n        minX = Math.min(minX, point[0]);\n        maxX = Math.max(maxX, point[0]);\n        minY = Math.min(minY, point[1]);\n        maxY = Math.max(maxY, point[1]);\n      }\n      boundingBox = [\n        minX,\n        minY,\n        maxX - minX,\n        maxY - minY\n      ];\n    } else if (nodeIs(node, \"path\")) {\n      var list = getPathSegList(node);\n      minX = Number.POSITIVE_INFINITY;\n      minY = Number.POSITIVE_INFINITY;\n      maxX = Number.NEGATIVE_INFINITY;\n      maxY = Number.NEGATIVE_INFINITY;\n      var x = 0, y = 0;\n      var prevX, prevY, newX, newY;\n      var p2, p3, to;\n      for (i = 0; i < list.numberOfItems; i++) {\n        var seg = list.getItem(i);\n        var cmd = seg.pathSegTypeAsLetter;\n        switch (cmd) {\n          case \"H\":\n            newX = seg.x;\n            newY = y;\n            break;\n          case \"h\":\n            newX = seg.x + x;\n            newY = y;\n            break;\n          case \"V\":\n            newX = x;\n            newY = seg.y;\n            break;\n          case \"v\":\n            newX = x;\n            newY = seg.y + y;\n            break;\n          case \"C\":\n            p2 = [seg.x1, seg.y1];\n            p3 = [seg.x2, seg.y2];\n            to = [seg.x, seg.y];\n            break;\n          case \"c\":\n            p2 = [seg.x1 + x, seg.y1 + y];\n            p3 = [seg.x2 + x, seg.y2 + y];\n            to = [seg.x + x, seg.y + y];\n            break;\n          case \"S\":\n            p2 = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p3 = [seg.x2, seg.y2];\n            to = [seg.x, seg.y];\n            break;\n          case \"s\":\n            p2 = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p3 = [seg.x2 + x, seg.y2 + y];\n            to = [seg.x + x, seg.y + y];\n            break;\n          case \"Q\":\n            pf = [seg.x1, seg.y1];\n            p2 = toCubic([x, y], pf);\n            p3 = toCubic([seg.x, seg.y], pf);\n            to = [seg.x, seg.y];\n            break;\n          case \"q\":\n            pf = [seg.x1 + x, seg.y1 + y];\n            p2 = toCubic([x, y], pf);\n            p3 = toCubic([x + seg.x, y + seg.y], pf);\n            to = [seg.x + x, seg.y + y];\n            break;\n          case \"T\":\n            p2 = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p2 = toCubic([x, y], pf);\n            p3 = toCubic([seg.x, seg.y], pf);\n            to = [seg.x, seg.y];\n            break;\n          case \"t\":\n            pf = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p2 = toCubic([x, y], pf);\n            p3 = toCubic([x + seg.x, y + seg.y], pf);\n            to = [seg.x + x, seg.y + y];\n            break;\n          // TODO: A,a\n        }\n        if (\"sScCqQtT\".indexOf(cmd) >= 0) {\n          prevX = x;\n          prevY = y;\n        }\n        if (\"MLCSQT\".indexOf(cmd) >= 0) {\n          x = seg.x;\n          y = seg.y;\n        } else if (\"mlcsqt\".indexOf(cmd) >= 0) {\n          x = seg.x + x;\n          y = seg.y + y;\n        } else if (\"zZ\".indexOf(cmd) < 0) {\n          x = newX;\n          y = newY;\n        }\n        if (\"CSQTcsqt\".indexOf(cmd) >= 0) {\n          minX = Math.min(minX, x, p2[0], p3[0], to[0]);\n          maxX = Math.max(maxX, x, p2[0], p3[0], to[0]);\n          minY = Math.min(minY, y, p2[1], p3[1], to[1]);\n          maxY = Math.max(maxY, y, p2[1], p3[1], to[1]);\n        } else {\n          minX = Math.min(minX, x);\n          maxX = Math.max(maxX, x);\n          minY = Math.min(minY, y);\n          maxY = Math.max(maxY, y);\n        }\n      }\n      boundingBox = [\n        minX,\n        minY,\n        maxX - minX,\n        maxY - minY\n      ];\n    } else if (nodeIs(node, \"svg\")) {\n      viewBox = node.getAttribute(\"viewBox\");\n      if (viewBox) {\n        vb = parseFloats(viewBox);\n      }\n      return [\n        pf(node.getAttribute(\"x\")) || (vb && vb[0]) || 0,\n        pf(node.getAttribute(\"y\")) || (vb && vb[1]) || 0,\n        pf(node.getAttribute(\"width\")) || (vb && vb[2]) || 0,\n        pf(node.getAttribute(\"height\")) || (vb && vb[3]) || 0\n      ];\n    } else if (nodeIs(node, \"g\")) {\n      boundingBox = [0, 0, 0, 0];\n      forEachChild(node, function (i, node) {\n        var nodeBox = getUntransformedBBox(node);\n        boundingBox = [\n            Math.min(boundingBox[0], nodeBox[0]),\n            Math.min(boundingBox[1], nodeBox[1]),\n            Math.max(boundingBox[0] + boundingBox[2], nodeBox[0] + nodeBox[2]) - Math.min(boundingBox[0], nodeBox[0]),\n            Math.max(boundingBox[1] + boundingBox[3], nodeBox[1] + nodeBox[3]) - Math.min(boundingBox[1], nodeBox[1])\n        ];\n      });\n    } else if (nodeIs(node, \"marker\")) {\n      viewBox = node.getAttribute(\"viewBox\");\n      if (viewBox) {\n        vb = parseFloats(viewBox);\n      }\n      return [\n        (vb && vb[0]) || 0,\n        (vb && vb[1]) || 0,\n        (vb && vb[2]) || pf(node.getAttribute(\"marker-width\")) || 0,\n        (vb && vb[3]) || pf(node.getAttribute(\"marker-height\")) || 0\n      ];\n    } else if (nodeIs(node, \"pattern\")) {\n      return [\n          pf(node.getAttribute(\"x\")) || 0,\n          pf(node.getAttribute(\"y\")) || 0,\n          pf(node.getAttribute(\"width\")) || 0,\n          pf(node.getAttribute(\"height\")) || 0\n      ]\n    } else {\n      // TODO: check if there are other possible coordinate attributes\n      var x1 = pf(node.getAttribute(\"x1\")) || pf(node.getAttribute(\"x\")) || pf((node.getAttribute(\"cx\")) - pf(node.getAttribute(\"r\"))) || 0;\n      var x2 = pf(node.getAttribute(\"x2\")) || (x1 + pf(node.getAttribute(\"width\"))) || (pf(node.getAttribute(\"cx\")) + pf(node.getAttribute(\"r\"))) || 0;\n      var y1 = pf(node.getAttribute(\"y1\")) || pf(node.getAttribute(\"y\")) || (pf(node.getAttribute(\"cy\")) - pf(node.getAttribute(\"r\"))) || 0;\n      var y2 = pf(node.getAttribute(\"y2\")) || (y1 + pf(node.getAttribute(\"height\"))) || (pf(node.getAttribute(\"cy\")) + pf(node.getAttribute(\"r\"))) || 0;\n      boundingBox = [\n        Math.min(x1, x2),\n        Math.min(y1, y2),\n        Math.max(x1, x2) - Math.min(x1, x2),\n        Math.max(y1, y2) - Math.min(y1, y2)\n      ];\n    }\n\n    if (!nodeIs(node, \"marker,svg,g\")) {\n      // add line-width\n      var lineWidth = getAttribute(node, \"stroke-width\") || 1;\n      var miterLimit = getAttribute(node, \"stroke-miterlimit\");\n      // miterLength / lineWidth = 1 / sin(phi / 2)\n      miterLimit && (lineWidth *= 0.5 / (Math.sin(Math.PI / 12)));\n      return [\n          boundingBox[0] - lineWidth,\n          boundingBox[1] - lineWidth,\n          boundingBox[2] + 2 * lineWidth,\n          boundingBox[3] + 2 * lineWidth\n      ];\n    }\n\n    return boundingBox;\n  };\n\n  // transforms a bounding box and returns a new rect that contains it\n  var transformBBox = function (box, matrix) {\n    var bl = multVecMatrix([box[0], box[1]], matrix);\n    var br = multVecMatrix([box[0] + box[2], box[1]], matrix);\n    var tl = multVecMatrix([box[0], box[1] + box[3]], matrix);\n    var tr = multVecMatrix([box[0] + box[2], box[1] + box[3]], matrix);\n\n    var bottom = Math.min(bl[1], br[1], tl[1], tr[1]);\n    var left = Math.min(bl[0], br[0], tl[0], tr[0]);\n    var top = Math.max(bl[1], br[1], tl[1], tr[1]);\n    var right = Math.max(bl[0], br[0], tl[0], tr[0]);\n\n    return [\n      left,\n      bottom,\n      right - left,\n      top - bottom\n    ]\n  };\n\n  // draws a polygon\n  var polygon = function (node, tfMatrix, colorMode, gradient, gradientMatrix) {\n    var points = parsePointsString(node.getAttribute(\"points\"));\n    var lines = [{op: \"m\", c: multVecMatrix(points[0], tfMatrix)}];\n    for (var i = 1; i < points.length; i++) {\n      var p = points[i];\n      var to = multVecMatrix(p, tfMatrix);\n      lines.push({op: \"l\", c: to});\n    }\n    lines.push({op: \"h\"});\n    _pdf.path(lines, colorMode, gradient, gradientMatrix);\n  };\n\n  // draws an image (converts it to jpeg first, as jsPDF doesn't support png or other formats)\n  var image = function (node) {\n    // convert image to jpeg\n    var imageUrl = node.getAttribute(\"xlink:href\") || node.getAttribute(\"href\");\n    var image = new Image();\n    image.src = imageUrl;\n\n    var canvas = document.createElement(\"canvas\");\n    var width = parseFloat(node.getAttribute(\"width\")),\n        height = parseFloat(node.getAttribute(\"height\")),\n        x = parseFloat(node.getAttribute(\"x\") || 0),\n        y = parseFloat(node.getAttribute(\"y\") || 0);\n    canvas.width = width;\n    canvas.height = height;\n    var context = canvas.getContext(\"2d\");\n    context.fillStyle = \"#fff\";\n    context.fillRect(0, 0, width, height);\n    context.drawImage(image, 0, 0, width, height);\n    var jpegUrl = canvas.toDataURL(\"image/jpeg\");\n\n    _pdf.addImage(jpegUrl,\n        \"jpeg\",\n        x,\n        y,\n        width,\n        height\n    );\n  };\n\n  // draws a path\n  var path = function (node, tfMatrix, svgIdPrefix, colorMode, gradient, gradientMatrix) {\n    var list = getPathSegList(node);\n    var markerEnd = node.getAttribute(\"marker-end\"),\n        markerStart = node.getAttribute(\"marker-start\"),\n        markerMid = node.getAttribute(\"marker-mid\");\n\n    var getLinesFromPath = function (pathSegList, tfMatrix) {\n      var x = 0, y = 0;\n      var x0 = x, y0 = y;\n      var prevX, prevY, newX, newY;\n      var to, p, p2, p3;\n      var lines = [];\n      var markers = [];\n      var op;\n      var prevAngle = 0, curAngle;\n\n      var addMarker = function (angle, anchor, type) {\n        var cos = Math.cos(angle);\n        var sin = Math.sin(angle);\n        var tf;\n        tf = new _pdf.Matrix(cos, sin, -sin, cos, anchor[0], anchor[1]);\n        markers.push({type: type, tf: _pdf.matrixMult(tf, tfMatrix)});\n      };\n\n      for (var i = 0; i < list.numberOfItems; i++) {\n        var seg = list.getItem(i);\n        var cmd = seg.pathSegTypeAsLetter;\n        switch (cmd) {\n          case \"M\":\n            x0 = x;\n            y0 = y;\n            to = [seg.x, seg.y];\n            op = \"m\";\n            break;\n          case \"m\":\n            x0 = x;\n            y0 = y;\n            to = [seg.x + x, seg.y + y];\n            op = \"m\";\n            break;\n          case \"L\":\n            to = [seg.x, seg.y];\n            op = \"l\";\n            break;\n          case \"l\":\n            to = [seg.x + x, seg.y + y];\n            op = \"l\";\n            break;\n          case \"H\":\n            to = [seg.x, y];\n            op = \"l\";\n            newX = seg.x;\n            newY = y;\n            break;\n          case \"h\":\n            to = [seg.x + x, y];\n            op = \"l\";\n            newX = seg.x + x;\n            newY = y;\n            break;\n          case \"V\":\n            to = [x, seg.y];\n            op = \"l\";\n            newX = x;\n            newY = seg.y;\n            break;\n          case \"v\":\n            to = [x, seg.y + y];\n            op = \"l\";\n            newX = x;\n            newY = seg.y + y;\n            break;\n          case \"C\":\n            p2 = [seg.x1, seg.y1];\n            p3 = [seg.x2, seg.y2];\n            to = [seg.x, seg.y];\n            break;\n          case \"c\":\n            p2 = [seg.x1 + x, seg.y1 + y];\n            p3 = [seg.x2 + x, seg.y2 + y];\n            to = [seg.x + x, seg.y + y];\n            break;\n          case \"S\":\n            p2 = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p3 = [seg.x2, seg.y2];\n            to = [seg.x, seg.y];\n            break;\n          case \"s\":\n            p2 = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p3 = [seg.x2 + x, seg.y2 + y];\n            to = [seg.x + x, seg.y + y];\n            break;\n          case \"Q\":\n            p = [seg.x1, seg.y1];\n            p2 = toCubic([x, y], p);\n            p3 = toCubic([seg.x, seg.y], p);\n            to = [seg.x, seg.y];\n            break;\n          case \"q\":\n            p = [seg.x1 + x, seg.y1 + y];\n            p2 = toCubic([x, y], p);\n            p3 = toCubic([x + seg.x, y + seg.y], p);\n            to = [seg.x + x, seg.y + y];\n            break;\n          case \"T\":\n            p2 = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p2 = toCubic([x, y], p);\n            p3 = toCubic([seg.x, seg.y], p);\n            to = [seg.x, seg.y];\n            break;\n          case \"t\":\n            p = getControlPointFromPrevious(i, [x, y], list, prevX, prevY);\n            p2 = toCubic([x, y], p);\n            p3 = toCubic([x + seg.x, y + seg.y], p);\n            to = [seg.x + x, seg.y + y];\n            break;\n          // TODO: A,a\n          case \"Z\":\n          case \"z\":\n            x = x0;\n            y = y0;\n            lines.push({op: \"h\"});\n            break;\n        }\n\n        var hasStartMarker = markerStart\n            && (i === 1\n            || (\"mM\".indexOf(cmd) < 0 && \"mM\".indexOf(list.getItem(i - 1).pathSegTypeAsLetter) >= 0));\n        var hasEndMarker = markerEnd\n            && (i === list.numberOfItems - 1\n            || (\"mM\".indexOf(cmd) < 0 && \"mM\".indexOf(list.getItem(i + 1).pathSegTypeAsLetter) >= 0));\n        var hasMidMarker = markerMid\n            && i > 0\n            && !(i === 1 && \"mM\".indexOf(list.getItem(i - 1).pathSegTypeAsLetter) >= 0);\n\n        if (\"sScCqQtT\".indexOf(cmd) >= 0) {\n          hasStartMarker && addMarker(getAngle([x, y], p2), [x, y], \"start\");\n          hasEndMarker && addMarker(getAngle(p3, to), to, \"end\");\n          if (hasMidMarker) {\n            curAngle = getAngle([x, y], p2);\n            curAngle = \"mM\".indexOf(list.getItem(i - 1).pathSegTypeAsLetter) >= 0 ?\n                curAngle : .5 * (prevAngle + curAngle);\n            addMarker(curAngle, [x, y], \"mid\");\n          }\n\n          prevAngle = getAngle(p3, to);\n\n          prevX = x;\n          prevY = y;\n          p2 = multVecMatrix(p2, tfMatrix);\n          p3 = multVecMatrix(p3, tfMatrix);\n          p = multVecMatrix(to, tfMatrix);\n          lines.push({\n            op: \"c\", c: [\n              p2[0], p2[1],\n              p3[0], p3[1],\n              p[0], p[1]\n            ]\n          });\n        } else if (\"lLhHvVmM\".indexOf(cmd) >= 0) {\n          curAngle = getAngle([x, y], to);\n          hasStartMarker && addMarker(curAngle, [x, y], \"start\");\n          hasEndMarker && addMarker(curAngle, to, \"end\");\n          if (hasMidMarker) {\n            var angle = \"mM\".indexOf(cmd) >= 0 ?\n                prevAngle : \"mM\".indexOf(list.getItem(i - 1).pathSegTypeAsLetter) >= 0 ?\n                curAngle : .5 * (prevAngle + curAngle);\n            addMarker(angle, [x, y], \"mid\");\n          }\n          prevAngle = curAngle;\n\n          p = multVecMatrix(to, tfMatrix);\n          lines.push({op: op, c: p});\n        }\n\n        if (\"MLCSQT\".indexOf(cmd) >= 0) {\n          x = seg.x;\n          y = seg.y;\n        } else if (\"mlcsqt\".indexOf(cmd) >= 0) {\n          x = seg.x + x;\n          y = seg.y + y;\n        } else if (\"zZ\".indexOf(cmd) < 0) {\n          x = newX;\n          y = newY;\n        }\n      }\n\n      return {lines: lines, markers: markers};\n    };\n    var lines = getLinesFromPath(list, tfMatrix);\n\n    if (markerEnd || markerStart || markerMid) {\n      for (var i = 0; i < lines.markers.length; i++) {\n        var marker = lines.markers[i];\n        var markerElement;\n        switch (marker.type) {\n          case \"start\":\n            markerElement = svgIdPrefix.get() + iriReference.exec(markerStart)[1];\n            break;\n          case \"end\":\n            markerElement = svgIdPrefix.get() + iriReference.exec(markerEnd)[1];\n            break;\n          case \"mid\":\n            markerElement = svgIdPrefix.get() + iriReference.exec(markerMid)[1];\n            break;\n        }\n        _pdf.doFormObject(markerElement, marker.tf);\n      }\n    }\n\n    if (lines.lines.length > 0) {\n      _pdf.path(lines.lines, colorMode, gradient, gradientMatrix);\n    }\n  };\n\n  // draws the element referenced by a use node, makes use of pdf's XObjects/FormObjects so nodes are only written once\n  // to the pdf document. This highly reduces the file size and computation time.\n  var use = function (node, tfMatrix, svgIdPrefix) {\n    var url = (node.getAttribute(\"href\") || node.getAttribute(\"xlink:href\"));\n    // just in case someone has the idea to use empty use-tags, wtf???\n    if (!url)\n      return;\n\n    // get the size of the referenced form object (to apply the correct scaling)\n    var formObject = _pdf.getFormObject(svgIdPrefix.get() + url.substring(1));\n\n    // scale and position it right\n    var x = node.getAttribute(\"x\") || 0;\n    var y = node.getAttribute(\"y\") || 0;\n    var width = node.getAttribute(\"width\") || formObject.width;\n    var height = node.getAttribute(\"height\") || formObject.height;\n    var t = new _pdf.Matrix(width / formObject.width || 0, 0, 0, height / formObject.height || 0, x, y);\n    t = _pdf.matrixMult(t, tfMatrix);\n    _pdf.doFormObject(svgIdPrefix.get() + url.substring(1), t);\n  };\n\n  // draws a line\n  var line = function (node, tfMatrix) {\n    var p1 = multVecMatrix([parseFloat(node.getAttribute('x1')), parseFloat(node.getAttribute('y1'))], tfMatrix);\n    var p2 = multVecMatrix([parseFloat(node.getAttribute('x2')), parseFloat(node.getAttribute('y2'))], tfMatrix);\n    _pdf.line(p1[0], p1[1], p2[0], p2[1]);\n  };\n\n  // draws a rect\n  var rect = function (node, colorMode, gradient, gradientMatrix) {\n    _pdf.roundedRect(\n        parseFloat(node.getAttribute('x')) || 0,\n        parseFloat(node.getAttribute('y')) || 0,\n        parseFloat(node.getAttribute('width')),\n        parseFloat(node.getAttribute('height')),\n        parseFloat(node.getAttribute('rx')) || 0,\n        parseFloat(node.getAttribute('ry')) || 0,\n        colorMode,\n        gradient,\n        gradientMatrix\n    );\n  };\n\n  // draws an ellipse\n  var ellipse = function (node, colorMode, gradient, gradientMatrix) {\n    _pdf.ellipse(\n        parseFloat(node.getAttribute('cx')) || 0,\n        parseFloat(node.getAttribute('cy')) || 0,\n        parseFloat(node.getAttribute('rx')),\n        parseFloat(node.getAttribute('ry')),\n        colorMode,\n        gradient,\n        gradientMatrix\n    );\n  };\n\n  // draws a circle\n  var circle = function (node, colorMode, gradient, gradientMatrix) {\n    var radius = parseFloat(node.getAttribute('r')) || 0;\n    _pdf.ellipse(\n        parseFloat(node.getAttribute('cx')) || 0,\n        parseFloat(node.getAttribute('cy')) || 0,\n        radius,\n        radius,\n        colorMode,\n        gradient,\n        gradientMatrix\n    );\n  };\n\n  // applies text transformations to a text node\n  var transformText = function (node, text) {\n    var textTransform = getAttribute(node, \"text-transform\");\n    switch (textTransform) {\n      case \"uppercase\": return text.toUpperCase();\n      case \"lowercase\": return text.toLowerCase();\n      default: return text;\n      // TODO: capitalize, full-width\n    }\n  };\n\n  // draws a text element and its tspan children\n  var text = function (node, tfMatrix, hasFillColor, fillRGB) {\n    _pdf.saveGraphicsState();\n    setTextProperties(node, fillRGB);\n\n    var getTextOffset = function (textAnchor, width) {\n      var xOffset = 0;\n      switch (textAnchor) {\n        case 'end':\n          xOffset = width;\n          break;\n        case 'middle':\n          xOffset = width / 2;\n          break;\n        case 'start':\n          break;\n      }\n      return xOffset;\n    };\n\n    /**\n     * Convert em, px and bare number attributes to pixel values\n     */\n    var toPixels = function (value, pdfFontSize) {\n      var match;\n\n      // em\n      match = value && value.toString().match(/^([\\-0-9.]+)em$/);\n      if (match) {\n        return parseFloat(match[1]) * pdfFontSize;\n      }\n\n      // pixels\n      match = value && value.toString().match(/^([\\-0-9.]+)(px|)$/);\n      if (match) {\n        return parseFloat(match[1]);\n      }\n      return 0;\n    };\n\n    // creates an svg element and append the text node to properly measure the text size\n    var svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    svg.appendChild(node);\n    svg.setAttribute(\"visibility\", \"hidden\");\n    document.body.appendChild(svg);\n\n    var box = node.getBBox();\n    var x, y, xOffset = 0;\n    var textAnchor = getAttribute(node, \"text-anchor\");\n    if (textAnchor) {\n      xOffset = getTextOffset(textAnchor, box.width);\n    }\n\n    var pdfFontSize = _pdf.getFontSize();\n    var textX = toPixels(node.getAttribute('x'), pdfFontSize);\n    var textY = toPixels(node.getAttribute('y'), pdfFontSize);\n    var m = _pdf.matrixMult(new _pdf.Matrix(1, 0, 0, 1, textX, textY), tfMatrix);\n\n    x = toPixels(node.getAttribute(\"dx\"), pdfFontSize);\n    y = toPixels(node.getAttribute(\"dy\"), pdfFontSize);\n\n    // when there are no tspans draw the text directly\n    if (node.childElementCount === 0) {\n      _pdf.text(\n          (x - xOffset),\n          y,\n          transformText(node, removeNewlinesAndTrim(node.textContent)),\n          void 0,\n          m\n      );\n    } else {\n      // otherwise loop over tspans and position each relative to the previous one\n      forEachChild(node, function (i, tSpan) {\n        if (!tSpan.textContent || nodeIs(tSpan, 'title,desc,metadata')) {\n          return;\n        }\n        _pdf.saveGraphicsState();\n        var tSpanColor = getAttribute(tSpan, \"fill\");\n        setTextProperties(tSpan, tSpanColor && new RGBColor(tSpanColor));\n        var extent = tSpan.getExtentOfChar(0);\n        _pdf.text(\n            extent.x - textX,//x - xOffset,\n            extent.y + extent.height * 0.7 - textY, // 0.7 roughly mimicks the text baseline\n            transformText(node, removeNewlinesAndTrim(tSpan.textContent)),\n            void 0,\n            m\n        );\n\n        _pdf.restoreGraphicsState();\n      });\n\n    }\n\n    document.body.removeChild(svg);\n    _pdf.restoreGraphicsState();\n  };\n\n  // As defs elements are allowed to appear after they are referenced, we search for them first\n  var findAndRenderDefs = function (node, tfMatrix, defs, svgIdPrefix, withinDefs) {\n    forEachChild(node, function (i, child) {\n      if (child.tagName.toLowerCase() === \"defs\") {\n        renderNode(child, tfMatrix, defs, svgIdPrefix, withinDefs);\n        // prevent defs from being evaluated twice // TODO: make this better\n        child.parentNode.removeChild(child);\n      }\n    });\n  };\n\n  // processes a svg node\n  var svg = function (node, tfMatrix, defs, svgIdPrefix, withinDefs) {\n    // create a new prefix and clone the defs, as defs within the svg should not be visible outside\n    var newSvgIdPrefix = svgIdPrefix.nextChild();\n    var newDefs = cloneDefs(defs);\n    findAndRenderDefs(node, tfMatrix, newDefs, newSvgIdPrefix, withinDefs);\n    renderChildren(node, tfMatrix, newDefs, newSvgIdPrefix, withinDefs);\n  };\n\n  // renders all children of a node\n  var renderChildren = function (node, tfMatrix, defs, svgIdPrefix, withinDefs) {\n    forEachChild(node, function (i, node) {\n      renderNode(node, tfMatrix, defs, svgIdPrefix, withinDefs);\n    });\n  };\n\n  // adds a gradient to defs and the pdf document for later use, type is either \"axial\" or \"radial\"\n  // opacity is only supported rudimentary by averaging over all stops\n  // transforms are applied on use\n  var putGradient = function (node, type, coords, defs, svgIdPrefix) {\n    var colors = [];\n    var opacitySum = 0;\n    var hasOpacity = false;\n    var gState;\n    forEachChild(node, function (i, element) {\n      // since opacity gradients are hard to realize, average the opacity over the control points\n      if (element.tagName.toLowerCase() === \"stop\") {\n        var color = new RGBColor(getAttribute(element, \"stop-color\"));\n        colors.push({\n          offset: parseFloat(element.getAttribute(\"offset\")),\n          color: [color.r, color.g, color.b]\n        });\n        var opacity = getAttribute(element, \"stop-opacity\");\n        if (opacity && opacity != 1) {\n          opacitySum += parseFloat(opacity);\n          hasOpacity = true;\n        }\n      }\n    });\n\n    if (hasOpacity) {\n      gState = new _pdf.GState({opacity: opacitySum / coords.length});\n    }\n\n    var pattern = new _pdf.ShadingPattern(type, coords, colors, gState);\n    var id = svgIdPrefix.get() + node.getAttribute(\"id\");\n    _pdf.addShadingPattern(id, pattern);\n    defs[id] = node;\n  };\n\n  var pattern = function (node, defs, svgIdPrefix) {\n    var id = svgIdPrefix.get() + node.getAttribute(\"id\");\n    defs[id] = node;\n\n    // the transformations directly at the node are written to the pattern transformation matrix\n    var bBox = getUntransformedBBox(node);\n    var pattern = new _pdf.TilingPattern([bBox[0], bBox[1], bBox[0] + bBox[2], bBox[1] + bBox[3]], bBox[2], bBox[3],\n        null, computeNodeTransform(node));\n\n    _pdf.beginTilingPattern(pattern);\n    // continue without transformation\n    renderChildren(node, _pdf.unitMatrix, defs, svgIdPrefix, false);\n    _pdf.endTilingPattern(id, pattern);\n  };\n\n  function setTextProperties(node, fillRGB) {\n    var fontFamily = getAttribute(node, \"font-family\");\n    if (fontFamily) {\n      _pdf.setFont(fontFamily);\n    }\n\n    if (fillRGB && fillRGB.ok) {\n      _pdf.setTextColor(fillRGB.r, fillRGB.g, fillRGB.b);\n    }\n\n    var fontType;\n    var fontWeight = getAttribute(node, \"font-weight\");\n    if (fontWeight) {\n      if (fontWeight === \"bold\") {\n        fontType = \"bold\";\n      }\n    }\n\n    var fontStyle = getAttribute(node, \"font-style\");\n    if (fontStyle) {\n      if (fontStyle === \"italic\") {\n        fontType += \"italic\";\n      }\n    }\n    _pdf.setFontType(fontType);\n\n    var pdfFontSize = 16;\n    var fontSize = getAttribute(node, \"font-size\");\n    if (fontSize) {\n      pdfFontSize = parseFloat(fontSize);\n      _pdf.setFontSize(pdfFontSize);\n    }\n  }\n\n\n  /**\n   * Renders a svg node.\n   * @param node The svg element\n   * @param contextTransform The current transformation matrix\n   * @param defs The defs map holding all svg nodes that can be referenced\n   * @param svgIdPrefix The current id prefix\n   * @param withinDefs True iff we are top-level within a defs node, so the target can be switched to an pdf form object\n   */\n  var renderNode = function (node, contextTransform, defs, svgIdPrefix, withinDefs) {\n    var tfMatrix,\n        hasFillColor = false,\n        fillRGB = null,\n        colorMode = null,\n        fillUrl = null,\n        fillData = null,\n        bBox;\n\n    //\n    // Decide about the render target and set the correct transformation\n    //\n\n    // if we are within a defs node, start a new pdf form object and draw this node and all children on that instead\n    // of the top-level page\n    var targetIsFormObject = withinDefs && !nodeIs(node, \"lineargradient,radialgradient,pattern\");\n    if (targetIsFormObject) {\n\n      // the transformations directly at the node are written to the pdf form object transformation matrix\n      tfMatrix = computeNodeTransform(node);\n      bBox = getUntransformedBBox(node);\n\n      _pdf.beginFormObject(bBox[0], bBox[1], bBox[2], bBox[3], tfMatrix);\n\n      // continue without transformation and set withinDefs to false to prevent child nodes from starting new form objects\n      tfMatrix = _pdf.unitMatrix;\n      withinDefs = false;\n\n    } else {\n      tfMatrix = _pdf.matrixMult(computeNodeTransform(node), contextTransform);\n      _pdf.saveGraphicsState();\n    }\n\n    //\n    // extract fill and stroke mode\n    //\n\n    // fill mode\n    if (nodeIs(node, \"g,path,rect,text,ellipse,line,circle,polygon\")) {\n      function setDefaultColor() {\n        fillRGB = new RGBColor(\"rgb(0, 0, 0)\");\n        hasFillColor = true;\n        colorMode = \"F\";\n      }\n\n      var fillColor = getAttribute(node, \"fill\");\n      if (fillColor) {\n        var url = iriReference.exec(fillColor);\n        if (url) {\n          // probably a gradient (or something unsupported)\n          fillUrl = svgIdPrefix.get() + url[1];\n          var fill = getFromDefs(fillUrl, defs);\n          if (fill && nodeIs(fill, \"lineargradient,radialgradient\")) {\n\n            // matrix to convert between gradient space and user space\n            // for \"userSpaceOnUse\" this is the current transformation: tfMatrix\n            // for \"objectBoundingBox\" or default, the gradient gets scaled and transformed to the bounding box\n            var gradientUnitsMatrix = tfMatrix;\n            if (!fill.hasAttribute(\"gradientUnits\")\n                || fill.getAttribute(\"gradientUnits\").toLowerCase() === \"objectboundingbox\") {\n              bBox || (bBox = getUntransformedBBox(node));\n              gradientUnitsMatrix = new _pdf.Matrix(bBox[2], 0, 0, bBox[3], bBox[0], bBox[1]);\n\n              var nodeTransform = computeNodeTransform(node);\n              gradientUnitsMatrix = _pdf.matrixMult(gradientUnitsMatrix, nodeTransform);\n            }\n\n            // matrix that is applied to the gradient before any other transformations\n            var gradientTransform = parseTransform(fill.getAttribute(\"gradientTransform\"));\n\n            fillData = _pdf.matrixMult(gradientTransform, gradientUnitsMatrix);\n          } else if (fill && nodeIs(fill, \"pattern\")) {\n            var fillBBox, y, width, height, x;\n            fillData = {};\n\n            var patternUnitsMatrix = _pdf.unitMatrix;\n            if (!fill.hasAttribute(\"patternUnits\")\n                || fill.getAttribute(\"patternUnits\").toLowerCase() === \"objectboundingbox\") {\n              bBox || (bBox = getUntransformedBBox(node));\n              patternUnitsMatrix = new _pdf.Matrix(1, 0, 0, 1, bBox[0], bBox[1]);\n\n              // TODO: slightly inaccurate (rounding errors? line width bBoxes?)\n              fillBBox = getUntransformedBBox(fill);\n              x = fillBBox[0] * bBox[0];\n              y = fillBBox[1] * bBox[1];\n              width = fillBBox[2] * bBox[2];\n              height = fillBBox[3] * bBox[3];\n              fillData.boundingBox = [x, y, x + width, y + height];\n              fillData.xStep = width;\n              fillData.yStep = height;\n            }\n\n            var patternContentUnitsMatrix = _pdf.unitMatrix;\n            if (fill.hasAttribute(\"patternContentUnits\")\n                && fill.getAttribute(\"patternContentUnits\").toLowerCase() === \"objectboundingbox\") {\n              bBox || (bBox = getUntransformedBBox(node));\n              patternContentUnitsMatrix = new _pdf.Matrix(bBox[2], 0, 0, bBox[3], 0, 0);\n\n              fillBBox = fillData.boundingBox || getUntransformedBBox(fill);\n              x = fillBBox[0] / bBox[0];\n              y = fillBBox[1] / bBox[1];\n              width = fillBBox[2] / bBox[2];\n              height = fillBBox[3] / bBox[3];\n              fillData.boundingBox = [x, y, x + width, y + height];\n              fillData.xStep = width;\n              fillData.yStep = height;\n            }\n\n            fillData.matrix = _pdf.matrixMult(\n                _pdf.matrixMult(patternContentUnitsMatrix, patternUnitsMatrix), tfMatrix);\n\n            colorMode = \"F\";\n          } else {\n            // unsupported fill argument (e.g. patterns) -> fill black\n            fillUrl = fill = null;\n            setDefaultColor();\n          }\n        } else {\n          // plain color\n          fillRGB = parseColor(fillColor);\n          if (fillRGB.ok) {\n            hasFillColor = true;\n            colorMode = 'F';\n          } else {\n            colorMode = null;\n          }\n        }\n      } else {\n        // if no fill attribute is provided the default fill color is black\n        setDefaultColor();\n      }\n\n      // opacity is realized via a pdf graphics state\n      var opacity = 1.0;\n      var nodeOpacity = node.getAttribute(\"opacity\") || node.getAttribute(\"fill-opacity\");\n      if (nodeOpacity) {\n        opacity *= parseFloat(nodeOpacity);\n      }\n      if (fillRGB && typeof fillRGB.a === \"number\") {\n        opacity *= fillRGB.a;\n      }\n      _pdf.setGState(new _pdf.GState({opacity: opacity}));\n    }\n\n    if (nodeIs(node, \"g,path,rect,ellipse,line,circle,polygon\")) {\n      // text has no fill color, so don't apply it until here\n      if (hasFillColor) {\n        _pdf.setFillColor(fillRGB.r, fillRGB.g, fillRGB.b);\n      }\n\n      // stroke mode\n      var strokeColor = node.getAttribute('stroke');\n      if (strokeColor) {\n        var strokeWidth;\n        if (node.hasAttribute(\"stroke-width\")) {\n          strokeWidth = Math.abs(parseFloat(node.getAttribute('stroke-width')));\n          _pdf.setLineWidth(strokeWidth);\n        }\n        var strokeRGB = new RGBColor(strokeColor);\n        if (strokeRGB.ok) {\n          _pdf.setDrawColor(strokeRGB.r, strokeRGB.g, strokeRGB.b);\n          if (strokeWidth !== 0) {\n            // pdf spec states: \"A line width of 0 denotes the thinnest line that can be rendered at device resolution:\n            // 1 device pixel wide\". SVG, however, does not draw zero width lines.\n            colorMode = (colorMode || \"\") + \"D\";\n          }\n        }\n        if (node.hasAttribute(\"stroke-linecap\")) {\n          _pdf.setLineCap(node.getAttribute(\"stroke-linecap\"));\n        }\n        if (node.hasAttribute(\"stroke-linejoin\")) {\n          _pdf.setLineJoin(node.getAttribute(\"stroke-linejoin\"));\n        }\n        if (node.hasAttribute(\"stroke-dasharray\")) {\n          _pdf.setLineDashPattern(\n              parseFloats(node.getAttribute(\"stroke-dasharray\")),\n              parseInt(node.getAttribute(\"stroke-dashoffset\")) || 0\n          );\n        }\n        if (node.hasAttribute(\"stroke-miterlimit\")) {\n          _pdf.setLineMiterLimit(parseFloat(node.getAttribute(\"stroke-miterlimit\")));\n        }\n      }\n    }\n\n    setTextProperties(node, fillRGB);\n\n    // do the actual drawing\n    switch (node.tagName.toLowerCase()) {\n      case 'svg':\n        svg(node, tfMatrix, defs, svgIdPrefix, withinDefs);\n        break;\n      case 'g':\n        findAndRenderDefs(node, tfMatrix, defs, svgIdPrefix, withinDefs);\n      case 'a':\n      case \"marker\":\n        renderChildren(node, tfMatrix, defs, svgIdPrefix, withinDefs);\n        break;\n\n      case 'defs':\n        renderChildren(node, tfMatrix, defs, svgIdPrefix, true);\n        break;\n\n      case 'use':\n        use(node, tfMatrix, svgIdPrefix);\n        break;\n\n      case 'line':\n        line(node, tfMatrix);\n        break;\n\n      case 'rect':\n        _pdf.setCurrentTransformationMatrix(tfMatrix);\n        rect(node, colorMode, fillUrl, fillData);\n        break;\n\n      case 'ellipse':\n        _pdf.setCurrentTransformationMatrix(tfMatrix);\n        ellipse(node, colorMode, fillUrl, fillData);\n        break;\n\n      case 'circle':\n        _pdf.setCurrentTransformationMatrix(tfMatrix);\n        circle(node, colorMode, fillUrl, fillData);\n        break;\n      case 'text':\n        text(node, tfMatrix, hasFillColor, fillRGB);\n        break;\n\n      case 'path':\n        path(node, tfMatrix, svgIdPrefix, colorMode, fillUrl, fillData);\n        break;\n\n      case 'polygon':\n        polygon(node, tfMatrix, colorMode, fillUrl, fillData);\n        break;\n\n      case 'image':\n        _pdf.setCurrentTransformationMatrix(tfMatrix);\n        image(node);\n        break;\n\n      case \"lineargradient\":\n        putGradient(node, \"axial\", [\n          node.getAttribute(\"x1\"),\n          node.getAttribute(\"y1\"),\n          node.getAttribute(\"x2\"),\n          node.getAttribute(\"y2\")\n        ], defs, svgIdPrefix);\n        break;\n\n      case \"radialgradient\":\n        putGradient(node, \"radial\", [\n          node.getAttribute(\"fx\") || node.getAttribute(\"cx\"),\n          node.getAttribute(\"fy\") || node.getAttribute(\"cy\"),\n          0,\n          node.getAttribute(\"cx\") || 0,\n          node.getAttribute(\"cy\") || 0,\n          node.getAttribute(\"r\") || 0\n        ], defs, svgIdPrefix);\n        break;\n\n      case \"pattern\":\n        pattern(node, defs, svgIdPrefix);\n        break;\n    }\n\n    // close either the formObject or the graphics context\n    if (targetIsFormObject) {\n      _pdf.endFormObject(svgIdPrefix.get() + node.getAttribute(\"id\"));\n    } else {\n      _pdf.restoreGraphicsState();\n    }\n  };\n\n  // the actual svgToPdf function (see above)\n  var svg2pdf = function (element, pdf, options) {\n    _pdf = pdf;\n\n    var k = options.scale || 1.0,\n        xOffset = options.xOffset || 0.0,\n        yOffset = options.yOffset || 0.0;\n\n    // set offsets and scale everything by k\n    _pdf.saveGraphicsState();\n    _pdf.setCurrentTransformationMatrix(new _pdf.Matrix(k, 0, 0, k, xOffset, yOffset));\n\n    renderNode(element.cloneNode(true), _pdf.unitMatrix, {}, new SvgPrefix(\"\"), false);\n\n    _pdf.restoreGraphicsState();\n\n    return _pdf;\n  };\n\n  if (typeof define === \"function\" && define.amd) {\n    define([\"./rgbcolor\", \"SvgPath\"], function (rgbcolor, svgpath) {\n      RGBColor = rgbcolor;\n      SvgPath = svgpath;\n      return svg2pdf;\n    });\n  } else if (typeof module !== \"undefined\" && module.exports) {\n    RGBColor = require(\"./rgbcolor.js\");\n    SvgPath = require(\"SvgPath\");\n    module.exports = svg2pdf;\n  } else {\n    SvgPath = global.SvgPath;\n    RGBColor = global.RGBColor;\n    global.svg2pdf = svg2pdf;\n    // for compatibility reasons\n    global.svgElementToPdf = svg2pdf;\n  }\n  return svg2pdf;\n}(typeof self !== \"undefined\" && self || typeof window !== \"undefined\" && window || this));\n\n},{\"./rgbcolor.js\":8,\"SvgPath\":1}]},{},[9])(9)\n});\n//# sourceMappingURL=svg2pdf.js.map\n"
  },
  {
    "path": "assets/highcharts/modules/accessibility.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Accessibility module\n\n (c) 2010-2017 Highsoft AS\n Author: Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(q){\"object\"===typeof module&&module.exports?module.exports=q:q(Highcharts)})(function(q){(function(e){function q(a){return a.replace(/&/g,\"\\x26amp;\").replace(/</g,\"\\x26lt;\").replace(/>/g,\"\\x26gt;\").replace(/\"/g,\"\\x26quot;\").replace(/'/g,\"\\x26#x27;\").replace(/\\//g,\"\\x26#x2F;\")}function z(a){for(var c=a.childNodes.length;c--;)a.appendChild(a.childNodes[c])}function k(a){var c;a&&a.onclick&&l.createEvent&&(c=l.createEvent(\"Events\"),c.initEvent(\"click\",!0,!1),a.onclick(c))}var y=e.win,l=y.document,\ng=e.each,A=e.erase,u=e.addEvent,B=e.removeEvent,x=e.fireEvent,C=e.dateFormat,w=e.merge,r={\"default\":[\"series\",\"data point\",\"data points\"],line:[\"line\",\"data point\",\"data points\"],spline:[\"line\",\"data point\",\"data points\"],area:[\"line\",\"data point\",\"data points\"],areaspline:[\"line\",\"data point\",\"data points\"],pie:[\"pie\",\"slice\",\"slices\"],column:[\"column series\",\"column\",\"columns\"],bar:[\"bar series\",\"bar\",\"bars\"],scatter:[\"scatter series\",\"data point\",\"data points\"],boxplot:[\"boxplot series\",\"box\",\n\"boxes\"],arearange:[\"arearange series\",\"data point\",\"data points\"],areasplinerange:[\"areasplinerange series\",\"data point\",\"data points\"],bubble:[\"bubble series\",\"bubble\",\"bubbles\"],columnrange:[\"columnrange series\",\"column\",\"columns\"],errorbar:[\"errorbar series\",\"errorbar\",\"errorbars\"],funnel:[\"funnel\",\"data point\",\"data points\"],pyramid:[\"pyramid\",\"data point\",\"data points\"],waterfall:[\"waterfall series\",\"column\",\"columns\"],map:[\"map\",\"area\",\"areas\"],mapline:[\"line\",\"data point\",\"data points\"],mappoint:[\"point series\",\n\"data point\",\"data points\"],mapbubble:[\"bubble series\",\"bubble\",\"bubbles\"]},D={boxplot:\" Box plot charts are typically used to display groups of statistical data. Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile and maximum. \",arearange:\" Arearange charts are line charts displaying a range between a lower and higher value for each point. \",areasplinerange:\" These charts are line charts displaying a range between a lower and higher value for each point. \",\nbubble:\" Bubble charts are scatter charts where each data point also has a size value. \",columnrange:\" Columnrange charts are column charts displaying a range between a lower and higher value for each point. \",errorbar:\" Errorbar series are used to display the variability of the data. \",funnel:\" Funnel charts are used to display reduction of data in stages. \",pyramid:\" Pyramid charts consist of a single pyramid with item heights corresponding to each point value. \",waterfall:\" A waterfall chart is a column chart where each column contributes towards a total end value. \"};\ne.Series.prototype.commonKeys=\"name id category x value y\".split(\" \");e.Series.prototype.specialKeys=\"z open high q3 median q1 low close\".split(\" \");e.seriesTypes.pie&&(e.seriesTypes.pie.prototype.specialKeys=[]);e.setOptions({accessibility:{enabled:!0,pointDescriptionThreshold:30,keyboardNavigation:{enabled:!0}}});e.wrap(e.Series.prototype,\"render\",function(a){a.apply(this,Array.prototype.slice.call(arguments,1));this.chart.options.accessibility.enabled&&this.setA11yDescription()});e.Series.prototype.setA11yDescription=\nfunction(){var a=this.chart.options.accessibility,c=this.points&&this.points.length&&this.points[0].graphic&&this.points[0].graphic.element,d=c&&c.parentNode||this.graph&&this.graph.element||this.group&&this.group.element;d&&(d.lastChild===c&&z(d),this.points&&(this.points.length<a.pointDescriptionThreshold||!1===a.pointDescriptionThreshold)&&g(this.points,function(b){b.graphic&&(b.graphic.element.setAttribute(\"role\",\"img\"),b.graphic.element.setAttribute(\"tabindex\",\"-1\"),b.graphic.element.setAttribute(\"aria-label\",\nb.series.options.pointDescriptionFormatter&&b.series.options.pointDescriptionFormatter(b)||a.pointDescriptionFormatter&&a.pointDescriptionFormatter(b)||b.buildPointInfoString()))}),1<this.chart.series.length||a.describeSingleSeries)&&(d.setAttribute(\"role\",this.options.exposeElementToA11y?\"img\":\"region\"),d.setAttribute(\"tabindex\",\"-1\"),d.setAttribute(\"aria-label\",a.seriesDescriptionFormatter&&a.seriesDescriptionFormatter(this)||this.buildSeriesInfoString()))};e.Series.prototype.buildSeriesInfoString=\nfunction(){var a=r[this.type]||r[\"default\"],c=this.description||this.options.description;return(this.name?this.name+\", \":\"\")+(1===this.chart.types.length?a[0]:\"series\")+\" \"+(this.index+1)+\" of \"+this.chart.series.length+(1===this.chart.types.length?\" with \":\". \"+a[0]+\" with \")+(this.points.length+\" \"+(1===this.points.length?a[1]:a[2]))+(c?\". \"+c:\"\")+(1<this.chart.yAxis.length&&this.yAxis?\". Y axis, \"+this.yAxis.getDescription():\"\")+(1<this.chart.xAxis.length&&this.xAxis?\". X axis, \"+this.xAxis.getDescription():\n\"\")};e.Point.prototype.buildPointInfoString=function(){var a=this,c=a.series,d=c.chart.options.accessibility,b=\"\",f=c.xAxis&&c.xAxis.isDatetimeAxis,d=f&&C(d.pointDateFormatter&&d.pointDateFormatter(a)||d.pointDateFormat||e.Tooltip.prototype.getXDateFormat(a,c.chart.options.tooltip,c.xAxis),a.x);e.find(c.specialKeys,function(b){return void 0!==a[b]})?(f&&(b=d),g(c.commonKeys.concat(c.specialKeys),function(c){void 0===a[c]||f&&\"x\"===c||(b+=(b?\". \":\"\")+c+\", \"+a[c])})):b=(this.name||d||this.category||\nthis.id||\"x, \"+this.x)+\", \"+(void 0!==this.value?this.value:this.y);return this.index+1+\". \"+b+\".\"+(this.description?\" \"+this.description:\"\")};e.Axis.prototype.getDescription=function(){return this.userOptions&&this.userOptions.description||this.axisTitle&&this.axisTitle.textStr||this.options.id||this.categories&&\"categories\"||\"values\"};e.Axis.prototype.panStep=function(a,c){var d=c||3;c=this.getExtremes();var b=(c.max-c.min)/d*a,d=c.max+b,b=c.min+b,f=d-b;0>a&&b<c.dataMin?(b=c.dataMin,d=b+f):0<a&&\nd>c.dataMax&&(d=c.dataMax,b=d-f);this.setExtremes(b,d)};e.wrap(e.Series.prototype,\"init\",function(a){a.apply(this,Array.prototype.slice.call(arguments,1));var c=this.chart;c.options.accessibility.enabled&&(c.types=c.types||[],0>c.types.indexOf(this.type)&&c.types.push(this.type),u(this,\"remove\",function(){var a=this,b=!1;g(c.series,function(f){f!==a&&0>c.types.indexOf(a.type)&&(b=!0)});b||A(c.types,a.type)}))});e.Chart.prototype.getTypeDescription=function(){var a=this.types&&this.types[0],c=this.series[0]&&\nthis.series[0].mapTitle;if(a){if(\"map\"===a)return c?\"Map of \"+c:\"Map of unspecified region.\";if(1<this.types.length)return\"Combination chart.\";if(-1<[\"spline\",\"area\",\"areaspline\"].indexOf(a))return\"Line chart.\"}else return\"Empty chart.\";return a+\" chart.\"+(D[a]||\"\")};e.Chart.prototype.getAxesDescription=function(){var a=this.xAxis.length,c=this.yAxis.length,d={},b;if(a)if(d.xAxis=\"The chart has \"+a+(1<a?\" X axes\":\" X axis\")+\" displaying \",2>a)d.xAxis+=this.xAxis[0].getDescription()+\".\";else{for(b=\n0;b<a-1;++b)d.xAxis+=(b?\", \":\"\")+this.xAxis[b].getDescription();d.xAxis+=\" and \"+this.xAxis[b].getDescription()+\".\"}if(c)if(d.yAxis=\"The chart has \"+c+(1<c?\" Y axes\":\" Y axis\")+\" displaying \",2>c)d.yAxis+=this.yAxis[0].getDescription()+\".\";else{for(b=0;b<c-1;++b)d.yAxis+=(b?\", \":\"\")+this.yAxis[b].getDescription();d.yAxis+=\" and \"+this.yAxis[b].getDescription()+\".\"}return d};e.Chart.prototype.addAccessibleContextMenuAttribs=function(){var a=this.exportDivElements;a&&(g(a,function(a){\"DIV\"!==a.tagName||\na.children&&a.children.length||(a.setAttribute(\"role\",\"menuitem\"),a.setAttribute(\"tabindex\",-1))}),a[0].parentNode.setAttribute(\"role\",\"menu\"),a[0].parentNode.setAttribute(\"aria-label\",\"Chart export\"))};e.Point.prototype.highlight=function(){var a=this.series.chart;this.graphic&&this.graphic.element.focus&&this.graphic.element.focus();this.isNull?a.tooltip&&a.tooltip.hide(0):(this.onMouseOver(),a.tooltip&&a.tooltip.refresh(a.tooltip.shared?[this]:this));a.highlightedPoint=this;return this};e.Chart.prototype.highlightAdjacentPoint=\nfunction(a){var c=this.series,d=this.highlightedPoint,b=d&&d.index||0,f=d&&d.series.points,E=d&&d.series.connectEnds&&b>f.length-3?2:1;if(!c[0]||!c[0].points)return!1;if(!d)return c[0].points[0].highlight();if(f[b]!==d)for(var e=0;e<f.length;++e)if(f[e]===d){b=e;break}c=c[d.series.index+(a?1:-1)];b=f[b+(a?E:-1)]||c&&c.points[a?0:c.points.length-(c.connectEnds?2:1)];return void 0===b?!1:b.isNull&&this.options.accessibility.keyboardNavigation.skipNullPoints||b.series.options.skipKeyboardNavigation?\n(this.highlightedPoint=b,this.highlightAdjacentPoint(a)):b.highlight()};e.Chart.prototype.showExportMenu=function(){this.exportSVGElements&&this.exportSVGElements[0]&&(this.exportSVGElements[0].element.onclick(),this.highlightExportItem(0))};e.Chart.prototype.highlightExportItem=function(a){var c=this.exportDivElements&&this.exportDivElements[a],d=this.exportDivElements&&this.exportDivElements[this.highlightedExportItem];if(c&&\"DIV\"===c.tagName&&(!c.children||!c.children.length)){c.focus&&c.focus();\nif(d&&d.onmouseout)d.onmouseout();if(c.onmouseover)c.onmouseover();this.highlightedExportItem=a;return!0}};e.Chart.prototype.highlightRangeSelectorButton=function(a){var c=this.rangeSelector.buttons;c[this.highlightedRangeSelectorItemIx]&&c[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState||0);this.highlightedRangeSelectorItemIx=a;return c[a]?(c[a].element.focus&&c[a].element.focus(),this.oldRangeSelectorItemState=c[a].state,c[a].setState(2),!0):!1};e.Chart.prototype.highlightLegendItem=\nfunction(a){var c=this.legend.allItems;c[this.highlightedLegendItemIx]&&x(c[this.highlightedLegendItemIx].legendGroup.element,\"mouseout\");this.highlightedLegendItemIx=a;return c[a]?(c[a].legendGroup.element.focus&&c[a].legendGroup.element.focus(),x(c[a].legendGroup.element,\"mouseover\"),!0):!1};e.Chart.prototype.hideExportMenu=function(){var a=this.exportDivElements;if(a){g(a,function(a){x(a,\"mouseleave\")});if(a[this.highlightedExportItem]&&a[this.highlightedExportItem].onmouseout)a[this.highlightedExportItem].onmouseout();\nthis.highlightedExportItem=0;this.renderTo.focus()}};e.Chart.prototype.addKeyboardNavEvents=function(){function a(b){this.keyCodeMap=b.keyCodeMap;this.move=b.move;this.validate=b.validate;this.init=b.init;this.transformTabs=!1!==b.transformTabs}function c(c,d){return new a(w({keyCodeMap:c,move:function(a){b.keyboardNavigationModuleIndex+=a;var c=b.keyboardNavigationModules[b.keyboardNavigationModuleIndex];if(c){if(c.validate&&!c.validate())return this.move(a);if(c.init)return c.init(a),!0}b.keyboardNavigationModuleIndex=\n0;b.slipNextTab=!0;return!1}},d))}function d(a){a=a||y.event;var c=b.keyboardNavigationModules[b.keyboardNavigationModuleIndex];9===(a.which||a.keyCode)&&b.slipNextTab?b.slipNextTab=!1:(b.slipNextTab=!1,c&&c.run(a)&&a.preventDefault())}var b=this;a.prototype={run:function(b){var a=this,c=b.which||b.keyCode,f=!1,c=this.transformTabs&&9===c?b.shiftKey?37:39:c;g(this.keyCodeMap,function(d){-1<d[0].indexOf(c)&&(f=!1===d[1].call(a,c,b)?!1:!0)});return f}};b.keyboardNavigationModules=[c([[[37,39],function(a){if(!b.highlightAdjacentPoint(39===\na))return this.move(39===a?1:-1)}],[[38,40],function(a){var c;if(b.highlightedPoint)if((c=b.series[b.highlightedPoint.series.index+(38===a?-1:1)])&&c.points[0])c.points[0].highlight();else return this.move(40===a?1:-1)}],[[13,32],function(){b.highlightedPoint&&b.highlightedPoint.firePointEvent(\"click\")}]],{init:function(a){var c=b.series&&b.series[b.series.length-1],c=c&&c.points&&c.points[c.points.length-1];0>a&&c&&c.highlight()}}),c([[[37,38],function(){for(var a=b.highlightedExportItem||0,c=!0,\nd=b.series;a--;)if(b.highlightExportItem(a)){c=!1;break}if(c)return b.hideExportMenu(),d&&d.length&&(a=d[d.length-1],a.points.length&&a.points[a.points.length-1].highlight()),this.move(-1)}],[[39,40],function(){for(var a=!0,c=(b.highlightedExportItem||0)+1;c<b.exportDivElements.length;++c)if(b.highlightExportItem(c)){a=!1;break}if(a)return b.hideExportMenu(),this.move(1)}],[[13,32],function(){k(b.exportDivElements[b.highlightedExportItem])}]],{validate:function(){return b.exportChart&&!(b.options.exporting&&\n!1===b.options.exporting.enabled)},init:function(a){b.highlightedPoint=null;b.showExportMenu();if(0>a&&b.exportDivElements)for(a=b.exportDivElements.length;-1<a&&!b.highlightExportItem(a);--a);}}),c([[[38,40,37,39],function(a){b[38===a||40===a?\"yAxis\":\"xAxis\"][0].panStep(39>a?-1:1)}],[[9],function(a,c){b.mapNavButtons[b.focusedMapNavButtonIx].setState(0);if(c.shiftKey&&!b.focusedMapNavButtonIx||!c.shiftKey&&b.focusedMapNavButtonIx)return b.mapZoom(),this.move(c.shiftKey?-1:1);b.focusedMapNavButtonIx+=\nc.shiftKey?-1:1;a=b.mapNavButtons[b.focusedMapNavButtonIx];a.element.focus&&a.element.focus();a.setState(2)}],[[13,32],function(){k(b.mapNavButtons[b.focusedMapNavButtonIx].element)}]],{validate:function(){return b.mapZoom&&b.mapNavButtons&&2===b.mapNavButtons.length},transformTabs:!1,init:function(a){var c=b.mapNavButtons[0],d=b.mapNavButtons[1],c=0<a?c:d;g(b.mapNavButtons,function(a,b){a.element.setAttribute(\"tabindex\",-1);a.element.setAttribute(\"role\",\"button\");a.element.setAttribute(\"aria-label\",\n\"Zoom \"+(b?\"out\":\"\")+\"chart\")});c.element.focus&&c.element.focus();c.setState(2);b.focusedMapNavButtonIx=0<a?0:1}}),c([[[37,39,38,40],function(a){a=37===a||38===a?-1:1;if(!b.highlightRangeSelectorButton(b.highlightedRangeSelectorItemIx+a))return this.move(a)}],[[13,32],function(){3!==b.oldRangeSelectorItemState&&k(b.rangeSelector.buttons[b.highlightedRangeSelectorItemIx].element)}]],{validate:function(){return b.rangeSelector&&b.rangeSelector.buttons&&b.rangeSelector.buttons.length},init:function(a){g(b.rangeSelector.buttons,\nfunction(a){a.element.setAttribute(\"tabindex\",\"-1\");a.element.setAttribute(\"role\",\"button\");a.element.setAttribute(\"aria-label\",\"Select range \"+(a.text&&a.text.textStr))});b.highlightRangeSelectorButton(0<a?0:b.rangeSelector.buttons.length-1)}}),c([[[9,38,40],function(a,c){a=9===a&&c.shiftKey||38===a?-1:1;c=b.highlightedInputRangeIx+=a;if(1<c||0>c)return this.move(a);b.rangeSelector[c?\"maxInput\":\"minInput\"].focus()}]],{validate:function(){return b.rangeSelector&&b.rangeSelector.inputGroup&&\"hidden\"!==\nb.rangeSelector.inputGroup.element.getAttribute(\"visibility\")&&!1!==b.options.rangeSelector.inputEnabled&&b.rangeSelector.minInput&&b.rangeSelector.maxInput},transformTabs:!1,init:function(a){b.highlightedInputRangeIx=0<a?0:1;b.rangeSelector[b.highlightedInputRangeIx?\"maxInput\":\"minInput\"].focus()}}),c([[[37,39,38,40],function(a){a=37===a||38===a?-1:1;if(!b.highlightLegendItem(b.highlightedLegendItemIx+a))return this.move(a)}],[[13,32],function(){k(b.legend.allItems[b.highlightedLegendItemIx].legendItem.element.parentNode)}]],\n{validate:function(){return b.legend&&b.legend.allItems&&!(b.colorAxis&&b.colorAxis.length)},init:function(a){g(b.legend.allItems,function(a){a.legendGroup.element.setAttribute(\"tabindex\",\"-1\");a.legendGroup.element.setAttribute(\"role\",\"button\");a.legendGroup.element.setAttribute(\"aria-label\",\"Toggle visibility of series \"+a.name)});b.highlightLegendItem(0<a?0:b.legend.allItems.length-1)}})];b.keyboardNavigationModuleIndex=0;b.container.hasAttribute&&!b.container.hasAttribute(\"tabIndex\")&&b.container.setAttribute(\"tabindex\",\n\"0\");u(b.renderTo,\"keydown\",d);u(b,\"destroy\",function(){B(b.renderTo,\"keydown\",d)})};e.Chart.prototype.addScreenReaderRegion=function(a,c){var d=this,b=d.series,e=d.options,g=e.accessibility,m=d.screenReaderRegion=l.createElement(\"div\"),k=l.createElement(\"h4\"),n=l.createElement(\"a\"),v=l.createElement(\"h4\"),t={position:\"absolute\",left:\"-9999px\",top:\"auto\",width:\"1px\",height:\"1px\",overflow:\"hidden\"},h=d.types||[],h=(1===h.length&&\"pie\"===h[0]||\"map\"===h[0])&&{}||d.getAxesDescription(),p=b[0]&&r[b[0].type]||\nr[\"default\"];m.setAttribute(\"id\",a);m.setAttribute(\"role\",\"region\");m.setAttribute(\"aria-label\",\"Chart screen reader information.\");m.innerHTML=g.screenReaderSectionFormatter&&g.screenReaderSectionFormatter(d)||\"\\x3cdiv\\x3eUse regions/landmarks to skip ahead to chart\"+(1<b.length?\" and navigate between data series\":\"\")+\".\\x3c/div\\x3e\\x3ch3\\x3e\"+(e.title.text?q(e.title.text):\"Chart\")+(e.subtitle&&e.subtitle.text?\". \"+q(e.subtitle.text):\"\")+\"\\x3c/h3\\x3e\\x3ch4\\x3eLong description.\\x3c/h4\\x3e\\x3cdiv\\x3e\"+\n(e.chart.description||\"No description available.\")+\"\\x3c/div\\x3e\\x3ch4\\x3eStructure.\\x3c/h4\\x3e\\x3cdiv\\x3eChart type: \"+(e.chart.typeDescription||d.getTypeDescription())+\"\\x3c/div\\x3e\"+(1===b.length?\"\\x3cdiv\\x3e\"+p[0]+\" with \"+b[0].points.length+\" \"+(1===b[0].points.length?p[1]:p[2])+\".\\x3c/div\\x3e\":\"\")+(h.xAxis?\"\\x3cdiv\\x3e\"+h.xAxis+\"\\x3c/div\\x3e\":\"\")+(h.yAxis?\"\\x3cdiv\\x3e\"+h.yAxis+\"\\x3c/div\\x3e\":\"\");d.getCSV&&(n.innerHTML=\"View as data table.\",n.href=\"#\"+c,n.setAttribute(\"tabindex\",\"-1\"),n.onclick=\ng.onTableAnchorClick||function(){d.viewData();l.getElementById(c).focus()},k.appendChild(n),m.appendChild(k));v.innerHTML=\"Chart graphic.\";d.renderTo.insertBefore(v,d.renderTo.firstChild);d.renderTo.insertBefore(m,d.renderTo.firstChild);w(!0,v.style,t);w(!0,m.style,t)};e.Chart.prototype.callbacks.push(function(a){var c=a.options,d=c.accessibility;if(d.enabled){var b=l.createElementNS(\"http://www.w3.org/2000/svg\",\"title\"),f=l.createElementNS(\"http://www.w3.org/2000/svg\",\"g\"),k=a.container.getElementsByTagName(\"desc\")[0],\nm=a.container.getElementsByTagName(\"text\"),r=\"highcharts-title-\"+a.index,n=\"highcharts-data-table-\"+a.index,v=\"highcharts-information-region-\"+a.index,t=c.title.text||\"Chart\",h=c.exporting&&c.exporting.csv&&c.exporting.csv.columnHeaderFormatter,p=[];b.textContent=q(t);b.id=r;k.parentNode.insertBefore(b,k);a.renderTo.setAttribute(\"role\",\"region\");a.renderTo.setAttribute(\"aria-label\",\"Interactive chart. \"+t+\". Use up and down arrows to navigate with most screen readers.\");if(a.exportSVGElements&&a.exportSVGElements[0]&&\na.exportSVGElements[0].element){var u=a.exportSVGElements[0].element.onclick,b=a.exportSVGElements[0].element.parentNode;a.exportSVGElements[0].element.onclick=function(){u.apply(this,Array.prototype.slice.call(arguments));a.addAccessibleContextMenuAttribs();a.highlightExportItem(0)};a.exportSVGElements[0].element.setAttribute(\"role\",\"button\");a.exportSVGElements[0].element.setAttribute(\"aria-label\",\"View export menu\");f.appendChild(a.exportSVGElements[0].element);f.setAttribute(\"role\",\"region\");\nf.setAttribute(\"aria-label\",\"Chart export menu\");b.appendChild(f)}a.rangeSelector&&g([\"minInput\",\"maxInput\"],function(b,c){a.rangeSelector[b]&&(a.rangeSelector[b].setAttribute(\"tabindex\",\"-1\"),a.rangeSelector[b].setAttribute(\"role\",\"textbox\"),a.rangeSelector[b].setAttribute(\"aria-label\",\"Select \"+(c?\"end\":\"start\")+\" date.\"))});g(m,function(a){a.setAttribute(\"aria-hidden\",\"true\")});a.addScreenReaderRegion(v,n);d.keyboardNavigation.enabled&&a.addKeyboardNavEvents();w(!0,c.exporting,{csv:{columnHeaderFormatter:function(a,\nb,c){if(!a)return\"Category\";if(a instanceof e.Axis)return a.options.title&&a.options.title.text||(a.isDatetimeAxis?\"DateTime\":\"Category\");var d=p[p.length-1];1<c&&(d&&d.text)!==a.name&&p.push({text:a.name,span:c});return h?h.call(this,a,b,c):1<c?b:a.name}}});e.wrap(a,\"getTable\",function(a){return a.apply(this,Array.prototype.slice.call(arguments,1)).replace(\"\\x3ctable\\x3e\",'\\x3ctable id\\x3d\"'+n+'\" summary\\x3d\"Table representation of chart\"\\x3e\\x3ccaption\\x3e'+t+\"\\x3c/caption\\x3e\")});e.wrap(a,\"viewData\",\nfunction(a){if(!this.dataTableDiv){a.apply(this,Array.prototype.slice.call(arguments,1));var b=l.getElementById(n),c=b.getElementsByTagName(\"thead\")[0],d=b.getElementsByTagName(\"tbody\")[0],e=c.firstChild.children,f=\"\\x3ctr\\x3e\\x3ctd\\x3e\\x3c/td\\x3e\",h,k;b.setAttribute(\"tabindex\",\"-1\");g(d.children,function(a){h=a.firstChild;k=l.createElement(\"th\");k.setAttribute(\"scope\",\"row\");k.innerHTML=h.innerHTML;h.parentNode.replaceChild(k,h)});g(e,function(a){\"TH\"===a.tagName&&a.setAttribute(\"scope\",\"col\")});\np.length&&(g(p,function(a){f+='\\x3cth scope\\x3d\"col\" colspan\\x3d\"'+a.span+'\"\\x3e'+a.text+\"\\x3c/th\\x3e\"}),c.insertAdjacentHTML(\"afterbegin\",f))}})}})})(q)});\n"
  },
  {
    "path": "assets/highcharts/modules/accessibility.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Accessibility module\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Accessibility module\n         *\n         * (c) 2010-2017 Highsoft AS\n         * Author: Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var win = H.win,\n            doc = win.document,\n            each = H.each,\n            erase = H.erase,\n            addEvent = H.addEvent,\n            removeEvent = H.removeEvent,\n            fireEvent = H.fireEvent,\n            dateFormat = H.dateFormat,\n            merge = H.merge,\n            // Human readable description of series and each point in singular and plural\n            typeToSeriesMap = {\n                'default': ['series', 'data point', 'data points'],\n                'line': ['line', 'data point', 'data points'],\n                'spline': ['line', 'data point', 'data points'],\n                'area': ['line', 'data point', 'data points'],\n                'areaspline': ['line', 'data point', 'data points'],\n                'pie': ['pie', 'slice', 'slices'],\n                'column': ['column series', 'column', 'columns'],\n                'bar': ['bar series', 'bar', 'bars'],\n                'scatter': ['scatter series', 'data point', 'data points'],\n                'boxplot': ['boxplot series', 'box', 'boxes'],\n                'arearange': ['arearange series', 'data point', 'data points'],\n                'areasplinerange': ['areasplinerange series', 'data point', 'data points'],\n                'bubble': ['bubble series', 'bubble', 'bubbles'],\n                'columnrange': ['columnrange series', 'column', 'columns'],\n                'errorbar': ['errorbar series', 'errorbar', 'errorbars'],\n                'funnel': ['funnel', 'data point', 'data points'],\n                'pyramid': ['pyramid', 'data point', 'data points'],\n                'waterfall': ['waterfall series', 'column', 'columns'],\n                'map': ['map', 'area', 'areas'],\n                'mapline': ['line', 'data point', 'data points'],\n                'mappoint': ['point series', 'data point', 'data points'],\n                'mapbubble': ['bubble series', 'bubble', 'bubbles']\n            },\n            // Descriptions for exotic chart types\n            typeDescriptionMap = {\n                boxplot: ' Box plot charts are typically used to display groups of statistical data. ' +\n                    'Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile and maximum. ',\n                arearange: ' Arearange charts are line charts displaying a range between a lower and higher value for each point. ',\n                areasplinerange: ' These charts are line charts displaying a range between a lower and higher value for each point. ',\n                bubble: ' Bubble charts are scatter charts where each data point also has a size value. ',\n                columnrange: ' Columnrange charts are column charts displaying a range between a lower and higher value for each point. ',\n                errorbar: ' Errorbar series are used to display the variability of the data. ',\n                funnel: ' Funnel charts are used to display reduction of data in stages. ',\n                pyramid: ' Pyramid charts consist of a single pyramid with item heights corresponding to each point value. ',\n                waterfall: ' A waterfall chart is a column chart where each column contributes towards a total end value. '\n            };\n\n        // If a point has one of the special keys defined, we expose all keys to the\n        // screen reader.\n        H.Series.prototype.commonKeys = ['name', 'id', 'category', 'x', 'value', 'y'];\n        H.Series.prototype.specialKeys = [\n            'z', 'open', 'high', 'q3', 'median', 'q1', 'low', 'close'\n        ];\n\n        // A pie is always simple. Don't quote me on that.\n        if (H.seriesTypes.pie) {\n            H.seriesTypes.pie.prototype.specialKeys = [];\n        }\n\n\n        // Default a11y options\n        H.setOptions({\n            accessibility: {\n                enabled: true,\n                pointDescriptionThreshold: 30, // set to false to disable\n                keyboardNavigation: {\n                    enabled: true\n                    //\tskipNullPoints: false\n                }\n                // describeSingleSeries: false\n            }\n        });\n\n        /**\n         * HTML encode some characters vulnerable for XSS.\n         * @param  {string} html The input string\n         * @return {string} The excaped string\n         */\n        function htmlencode(html) {\n            return html\n                .replace(/&/g, '&amp;')\n                .replace(/</g, '&lt;')\n                .replace(/>/g, '&gt;')\n                .replace(/\"/g, '&quot;')\n                .replace(/'/g, '&#x27;')\n                .replace(/\\//g, '&#x2F;');\n        }\n\n        // Utility function. Reverses child nodes of a DOM element\n        function reverseChildNodes(node) {\n            var i = node.childNodes.length;\n            while (i--) {\n                node.appendChild(node.childNodes[i]);\n            }\n        }\n\n        // Utility function to attempt to fake a click event on an element\n        function fakeClickEvent(element) {\n            var fakeEvent;\n            if (element && element.onclick && doc.createEvent) {\n                fakeEvent = doc.createEvent('Events');\n                fakeEvent.initEvent('click', true, false);\n                element.onclick(fakeEvent);\n            }\n        }\n\n        // Whenever drawing series, put info on DOM elements\n        H.wrap(H.Series.prototype, 'render', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            if (this.chart.options.accessibility.enabled) {\n                this.setA11yDescription();\n            }\n        });\n\n        // Put accessible info on series and points of a series\n        H.Series.prototype.setA11yDescription = function() {\n            var a11yOptions = this.chart.options.accessibility,\n                firstPointEl = this.points && this.points.length && this.points[0].graphic && this.points[0].graphic.element,\n                seriesEl = firstPointEl && firstPointEl.parentNode || this.graph && this.graph.element || this.group && this.group.element; // Could be tracker series depending on series type\n\n            if (seriesEl) {\n                // For some series types the order of elements do not match the order of points in series\n                // In that case we have to reverse them in order for AT to read them out in an understandable order\n                if (seriesEl.lastChild === firstPointEl) {\n                    reverseChildNodes(seriesEl);\n                }\n                // Make individual point elements accessible if possible. Note: If markers are disabled there might not be any elements there to make accessible.\n                if (this.points && (this.points.length < a11yOptions.pointDescriptionThreshold || a11yOptions.pointDescriptionThreshold === false)) {\n                    each(this.points, function(point) {\n                        if (point.graphic) {\n                            point.graphic.element.setAttribute('role', 'img');\n                            point.graphic.element.setAttribute('tabindex', '-1');\n                            point.graphic.element.setAttribute('aria-label',\n                                point.series.options.pointDescriptionFormatter &&\n                                point.series.options.pointDescriptionFormatter(point) ||\n                                a11yOptions.pointDescriptionFormatter &&\n                                a11yOptions.pointDescriptionFormatter(point) ||\n                                point.buildPointInfoString());\n                        }\n                    });\n                }\n                // Make series element accessible\n                if (this.chart.series.length > 1 || a11yOptions.describeSingleSeries) {\n                    seriesEl.setAttribute(\n                        'role',\n                        this.options.exposeElementToA11y ? 'img' : 'region'\n                    );\n                    seriesEl.setAttribute('tabindex', '-1');\n                    seriesEl.setAttribute('aria-label', a11yOptions.seriesDescriptionFormatter && a11yOptions.seriesDescriptionFormatter(this) ||\n                        this.buildSeriesInfoString());\n                }\n            }\n        };\n\n        // Return string with information about series\n        H.Series.prototype.buildSeriesInfoString = function() {\n            var typeInfo = typeToSeriesMap[this.type] || typeToSeriesMap['default'], // eslint-disable-line dot-notation\n                description = this.description || this.options.description;\n            return (this.name ? this.name + ', ' : '') +\n                (this.chart.types.length === 1 ? typeInfo[0] : 'series') + ' ' + (this.index + 1) + ' of ' + (this.chart.series.length) +\n                (this.chart.types.length === 1 ? ' with ' : '. ' + typeInfo[0] + ' with ') +\n                (this.points.length + ' ' + (this.points.length === 1 ? typeInfo[1] : typeInfo[2])) +\n                (description ? '. ' + description : '') +\n                (this.chart.yAxis.length > 1 && this.yAxis ? '. Y axis, ' + this.yAxis.getDescription() : '') +\n                (this.chart.xAxis.length > 1 && this.xAxis ? '. X axis, ' + this.xAxis.getDescription() : '');\n        };\n\n        // Return string with information about point\n        H.Point.prototype.buildPointInfoString = function() {\n            var point = this,\n                series = point.series,\n                a11yOptions = series.chart.options.accessibility,\n                infoString = '',\n                dateTimePoint = series.xAxis && series.xAxis.isDatetimeAxis,\n                timeDesc = dateTimePoint && dateFormat(a11yOptions.pointDateFormatter && a11yOptions.pointDateFormatter(point) || a11yOptions.pointDateFormat ||\n                    H.Tooltip.prototype.getXDateFormat(point, series.chart.options.tooltip, series.xAxis), point.x),\n                hasSpecialKey = H.find(series.specialKeys, function(key) {\n                    return point[key] !== undefined;\n                });\n\n            // If the point has one of the less common properties defined, display all that are defined\n            if (hasSpecialKey) {\n                if (dateTimePoint) {\n                    infoString = timeDesc;\n                }\n                each(series.commonKeys.concat(series.specialKeys), function(key) {\n                    if (point[key] !== undefined && !(dateTimePoint && key === 'x')) {\n                        infoString += (infoString ? '. ' : '') + key + ', ' + point[key];\n                    }\n                });\n            } else {\n                // Pick and choose properties for a succint label\n                infoString = (this.name || timeDesc || this.category || this.id || 'x, ' + this.x) + ', ' +\n                    (this.value !== undefined ? this.value : this.y);\n            }\n\n            return (this.index + 1) + '. ' + infoString + '.' + (this.description ? ' ' + this.description : '');\n        };\n\n        // Get descriptive label for axis\n        H.Axis.prototype.getDescription = function() {\n            return this.userOptions && this.userOptions.description || this.axisTitle && this.axisTitle.textStr ||\n                this.options.id || this.categories && 'categories' || 'values';\n        };\n\n        // Pan along axis in a direction (1 or -1), optionally with a defined granularity (number of steps it takes to walk across current view)\n        H.Axis.prototype.panStep = function(direction, granularity) {\n            var gran = granularity || 3,\n                extremes = this.getExtremes(),\n                step = (extremes.max - extremes.min) / gran * direction,\n                newMax = extremes.max + step,\n                newMin = extremes.min + step,\n                size = newMax - newMin;\n            if (direction < 0 && newMin < extremes.dataMin) {\n                newMin = extremes.dataMin;\n                newMax = newMin + size;\n            } else if (direction > 0 && newMax > extremes.dataMax) {\n                newMax = extremes.dataMax;\n                newMin = newMax - size;\n            }\n            this.setExtremes(newMin, newMax);\n        };\n\n        // Whenever adding or removing series, keep track of types present in chart\n        H.wrap(H.Series.prototype, 'init', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            var chart = this.chart;\n            if (chart.options.accessibility.enabled) {\n                chart.types = chart.types || [];\n\n                // Add type to list if does not exist\n                if (chart.types.indexOf(this.type) < 0) {\n                    chart.types.push(this.type);\n                }\n\n                addEvent(this, 'remove', function() {\n                    var removedSeries = this,\n                        hasType = false;\n\n                    // Check if any of the other series have the same type as this one. Otherwise remove it from the list.\n                    each(chart.series, function(s) {\n                        if (s !== removedSeries && chart.types.indexOf(removedSeries.type) < 0) {\n                            hasType = true;\n                        }\n                    });\n                    if (!hasType) {\n                        erase(chart.types, removedSeries.type);\n                    }\n                });\n            }\n        });\n\n        // Return simplified description of chart type. Some types will not be familiar to most screen reader users, but we try.\n        H.Chart.prototype.getTypeDescription = function() {\n            var firstType = this.types && this.types[0],\n                mapTitle = this.series[0] && this.series[0].mapTitle;\n            if (!firstType) {\n                return 'Empty chart.';\n            } else if (firstType === 'map') {\n                return mapTitle ? 'Map of ' + mapTitle : 'Map of unspecified region.';\n            } else if (this.types.length > 1) {\n                return 'Combination chart.';\n            } else if (['spline', 'area', 'areaspline'].indexOf(firstType) > -1) {\n                return 'Line chart.';\n            }\n            return firstType + ' chart.' + (typeDescriptionMap[firstType] || '');\n        };\n\n        // Return object with text description of each of the chart's axes\n        H.Chart.prototype.getAxesDescription = function() {\n            var numXAxes = this.xAxis.length,\n                numYAxes = this.yAxis.length,\n                desc = {},\n                i;\n\n            if (numXAxes) {\n                desc.xAxis = 'The chart has ' + numXAxes + (numXAxes > 1 ? ' X axes' : ' X axis') + ' displaying ';\n                if (numXAxes < 2) {\n                    desc.xAxis += this.xAxis[0].getDescription() + '.';\n                } else {\n                    for (i = 0; i < numXAxes - 1; ++i) {\n                        desc.xAxis += (i ? ', ' : '') + this.xAxis[i].getDescription();\n                    }\n                    desc.xAxis += ' and ' + this.xAxis[i].getDescription() + '.';\n                }\n            }\n\n            if (numYAxes) {\n                desc.yAxis = 'The chart has ' + numYAxes + (numYAxes > 1 ? ' Y axes' : ' Y axis') + ' displaying ';\n                if (numYAxes < 2) {\n                    desc.yAxis += this.yAxis[0].getDescription() + '.';\n                } else {\n                    for (i = 0; i < numYAxes - 1; ++i) {\n                        desc.yAxis += (i ? ', ' : '') + this.yAxis[i].getDescription();\n                    }\n                    desc.yAxis += ' and ' + this.yAxis[i].getDescription() + '.';\n                }\n            }\n\n            return desc;\n        };\n\n        // Set a11y attribs on exporting menu\n        H.Chart.prototype.addAccessibleContextMenuAttribs = function() {\n            var exportList = this.exportDivElements;\n            if (exportList) {\n                // Set tabindex on the menu items to allow focusing by script\n                // Set role to give screen readers a chance to pick up the contents\n                each(exportList, function(item) {\n                    if (item.tagName === 'DIV' &&\n                        !(item.children && item.children.length)) {\n                        item.setAttribute('role', 'menuitem');\n                        item.setAttribute('tabindex', -1);\n                    }\n                });\n                // Set accessibility properties on parent div\n                exportList[0].parentNode.setAttribute('role', 'menu');\n                exportList[0].parentNode.setAttribute('aria-label', 'Chart export');\n            }\n        };\n\n        // Highlight a point (show tooltip and display hover state). Returns the highlighted point.\n        H.Point.prototype.highlight = function() {\n            var chart = this.series.chart;\n            if (this.graphic && this.graphic.element.focus) {\n                this.graphic.element.focus();\n            }\n            if (!this.isNull) {\n                this.onMouseOver(); // Show the hover marker\n                // Show the tooltip\n                if (chart.tooltip) {\n                    chart.tooltip.refresh(chart.tooltip.shared ? [this] : this);\n                }\n            } else {\n                if (chart.tooltip) {\n                    chart.tooltip.hide(0);\n                }\n                // Don't call blur on the element, as it messes up the chart div's focus\n            }\n            chart.highlightedPoint = this;\n            return this;\n        };\n\n        // Function to highlight next/previous point in chart\n        // Returns highlighted point on success, false on failure (no adjacent point to highlight in chosen direction)\n        H.Chart.prototype.highlightAdjacentPoint = function(next) {\n            var series = this.series,\n                curPoint = this.highlightedPoint,\n                curPointIndex = curPoint && curPoint.index || 0,\n                curPoints = curPoint && curPoint.series.points,\n                newSeries,\n                newPoint,\n                // Handle connecting ends - where the points array has an extra last\n                // point that is a reference to the first one. We skip this.\n                forwardSkipAmount = curPoint && curPoint.series.connectEnds &&\n                curPointIndex > curPoints.length - 3 ? 2 : 1;\n\n            // If no points, return false\n            if (!series[0] || !series[0].points) {\n                return false;\n            }\n\n            // Use first point if none already highlighted\n            if (!curPoint) {\n                return series[0].points[0].highlight();\n            }\n\n            // Find index of current point in series.points array. Necessary for dataGrouping (and maybe zoom?)\n            if (curPoints[curPointIndex] !== curPoint) {\n                for (var i = 0; i < curPoints.length; ++i) {\n                    if (curPoints[i] === curPoint) {\n                        curPointIndex = i;\n                        break;\n                    }\n                }\n            }\n\n            // Grab next/prev point & series\n            newSeries = series[curPoint.series.index + (next ? 1 : -1)];\n            newPoint = curPoints[curPointIndex + (next ? forwardSkipAmount : -1)] ||\n                // Done with this series, try next one\n                newSeries &&\n                newSeries.points[next ? 0 : newSeries.points.length - (\n                    newSeries.connectEnds ? 2 : 1\n                )];\n\n            // If there is no adjacent point, we return false\n            if (newPoint === undefined) {\n                return false;\n            }\n\n            // Recursively skip null points or points in series that should be skipped\n            if (\n                newPoint.isNull &&\n                this.options.accessibility.keyboardNavigation.skipNullPoints ||\n                newPoint.series.options.skipKeyboardNavigation\n            ) {\n                this.highlightedPoint = newPoint;\n                return this.highlightAdjacentPoint(next);\n            }\n\n            // There is an adjacent point, highlight it\n            return newPoint.highlight();\n        };\n\n        // Show the export menu and focus the first item (if exists)\n        H.Chart.prototype.showExportMenu = function() {\n            if (this.exportSVGElements && this.exportSVGElements[0]) {\n                this.exportSVGElements[0].element.onclick();\n                this.highlightExportItem(0);\n            }\n        };\n\n        // Highlight export menu item by index\n        H.Chart.prototype.highlightExportItem = function(ix) {\n            var listItem = this.exportDivElements && this.exportDivElements[ix],\n                curHighlighted = this.exportDivElements && this.exportDivElements[this.highlightedExportItem];\n\n            if (listItem && listItem.tagName === 'DIV' && !(listItem.children && listItem.children.length)) {\n                if (listItem.focus) {\n                    listItem.focus();\n                }\n                if (curHighlighted && curHighlighted.onmouseout) {\n                    curHighlighted.onmouseout();\n                }\n                if (listItem.onmouseover) {\n                    listItem.onmouseover();\n                }\n                this.highlightedExportItem = ix;\n                return true;\n            }\n        };\n\n        // Highlight range selector button by index\n        H.Chart.prototype.highlightRangeSelectorButton = function(ix) {\n            var buttons = this.rangeSelector.buttons;\n            // Deselect old\n            if (buttons[this.highlightedRangeSelectorItemIx]) {\n                buttons[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState || 0);\n            }\n            // Select new\n            this.highlightedRangeSelectorItemIx = ix;\n            if (buttons[ix]) {\n                if (buttons[ix].element.focus) {\n                    buttons[ix].element.focus();\n                }\n                this.oldRangeSelectorItemState = buttons[ix].state;\n                buttons[ix].setState(2);\n                return true;\n            }\n            return false;\n        };\n\n        // Highlight legend item by index\n        H.Chart.prototype.highlightLegendItem = function(ix) {\n            var items = this.legend.allItems;\n            if (items[this.highlightedLegendItemIx]) {\n                fireEvent(items[this.highlightedLegendItemIx].legendGroup.element, 'mouseout');\n            }\n            this.highlightedLegendItemIx = ix;\n            if (items[ix]) {\n                if (items[ix].legendGroup.element.focus) {\n                    items[ix].legendGroup.element.focus();\n                }\n                fireEvent(items[ix].legendGroup.element, 'mouseover');\n                return true;\n            }\n            return false;\n        };\n\n        // Hide export menu\n        H.Chart.prototype.hideExportMenu = function() {\n            var exportList = this.exportDivElements;\n            if (exportList) {\n                each(exportList, function(el) {\n                    fireEvent(el, 'mouseleave');\n                });\n                if (exportList[this.highlightedExportItem] && exportList[this.highlightedExportItem].onmouseout) {\n                    exportList[this.highlightedExportItem].onmouseout();\n                }\n                this.highlightedExportItem = 0;\n                this.renderTo.focus();\n            }\n        };\n\n        // Add keyboard navigation handling to chart\n        H.Chart.prototype.addKeyboardNavEvents = function() {\n            var chart = this;\n\n            // Abstraction layer for keyboard navigation. Keep a map of keyCodes to handler functions, and a next/prev move handler for tab order.\n            // The module's keyCode handlers determine when to move to another module.\n            // Validate holds a function to determine if there are prerequisites for this module to run that are not met.\n            // Init holds a function to run once before any keyCodes are interpreted.\n            // transformTabs determines whether to transform tabs to left/right events or not. Defaults to true.\n            function KeyboardNavigationModule(options) {\n                this.keyCodeMap = options.keyCodeMap;\n                this.move = options.move;\n                this.validate = options.validate;\n                this.init = options.init;\n                this.transformTabs = options.transformTabs !== false;\n            }\n            KeyboardNavigationModule.prototype = {\n                // Find handler function(s) for key code in the keyCodeMap and run it.\n                run: function(e) {\n                    var navModule = this,\n                        keyCode = e.which || e.keyCode,\n                        handled = false;\n                    keyCode = this.transformTabs && keyCode === 9 ? (e.shiftKey ? 37 : 39) : keyCode; // Transform tabs\n                    each(this.keyCodeMap, function(codeSet) {\n                        if (codeSet[0].indexOf(keyCode) > -1) {\n                            handled = codeSet[1].call(navModule, keyCode, e) === false ? false : true; // If explicitly returning false, we haven't handled it\n                        }\n                    });\n                    return handled;\n                }\n            };\n            // Maintain abstraction between KeyboardNavigationModule and Highcharts\n            // The chart object keeps track of a list of KeyboardNavigationModules that we move through\n            function navModuleFactory(keyMap, options) {\n                return new KeyboardNavigationModule(merge({\n                    keyCodeMap: keyMap,\n                    // Move to next/prev valid module, or undefined if none, and init it.\n                    // Returns true on success and false if there is no valid module to move to.\n                    move: function(direction) {\n                        chart.keyboardNavigationModuleIndex += direction;\n                        var newModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];\n                        if (newModule) {\n                            if (newModule.validate && !newModule.validate()) {\n                                return this.move(direction); // Invalid module\n                            }\n                            if (newModule.init) {\n                                newModule.init(direction); // Valid module, init it\n                                return true;\n                            }\n                        }\n                        // No module\n                        chart.keyboardNavigationModuleIndex = 0; // Reset counter\n                        chart.slipNextTab = true; // Allow next tab to slip, as we will have focus on chart now\n                        return false;\n                    }\n                }, options));\n            }\n\n            // Route keydown events\n            function keydownHandler(ev) {\n                var e = ev || win.event,\n                    keyCode = e.which || e.keyCode,\n                    curNavModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];\n\n                // Handle tabbing\n                if (keyCode === 9) {\n                    // If we reached end of chart, we need to let this tab slip through to allow users to tab further\n                    if (chart.slipNextTab) {\n                        chart.slipNextTab = false;\n                        return;\n                    }\n                }\n                // If key was not tab, don't slip the next tab\n                chart.slipNextTab = false;\n\n                // If there is a navigation module for the current index, run it. Otherwise, we are outside of the chart in some direction.\n                if (curNavModule) {\n                    if (curNavModule.run(e)) {\n                        e.preventDefault(); // If successfully handled, stop the event here.\n                    }\n                }\n            }\n\n            // List of the different keyboard handling modes we use depending on where we are in the chart.\n            // Each mode has a set of handling functions mapped to key codes.\n            // Each mode determines when to move to the next/prev mode.\n            chart.keyboardNavigationModules = [\n                // Points\n                navModuleFactory([\n                    // Left/Right\n                    [\n                        [37, 39],\n                        function(keyCode) {\n                            if (!chart.highlightAdjacentPoint(keyCode === 39)) { // Try to highlight adjacent point\n                                return this.move(keyCode === 39 ? 1 : -1); // Failed. Move to next/prev module\n                            }\n                        }\n                    ],\n                    // Up/Down\n                    [\n                        [38, 40],\n                        function(keyCode) {\n                            var newSeries;\n                            if (chart.highlightedPoint) {\n                                newSeries = chart.series[chart.highlightedPoint.series.index + (keyCode === 38 ? -1 : 1)]; // Find prev/next series\n                                if (newSeries && newSeries.points[0]) { // If series exists and has data, go for it\n                                    newSeries.points[0].highlight();\n                                } else {\n                                    return this.move(keyCode === 40 ? 1 : -1); // Otherwise, attempt to move to next/prev module\n                                }\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            if (chart.highlightedPoint) {\n                                chart.highlightedPoint.firePointEvent('click');\n                            }\n                        }\n                    ]\n                ], {\n                    // If coming back to points from other module, highlight last point\n                    init: function(direction) {\n                        var lastSeries = chart.series && chart.series[chart.series.length - 1],\n                            lastPoint = lastSeries && lastSeries.points && lastSeries.points[lastSeries.points.length - 1];\n                        if (direction < 0 && lastPoint) {\n                            lastPoint.highlight();\n                        }\n                    }\n                }),\n\n                // Exporting\n                navModuleFactory([\n                    // Left/Up\n                    [\n                        [37, 38],\n                        function() {\n                            var i = chart.highlightedExportItem || 0,\n                                reachedEnd = true,\n                                series = chart.series,\n                                newSeries;\n                            // Try to highlight prev item in list. Highlighting e.g. separators will fail.\n                            while (i--) {\n                                if (chart.highlightExportItem(i)) {\n                                    reachedEnd = false;\n                                    break;\n                                }\n                            }\n                            if (reachedEnd) {\n                                chart.hideExportMenu();\n                                // Wrap to last point\n                                if (series && series.length) {\n                                    newSeries = series[series.length - 1];\n                                    if (newSeries.points.length) {\n                                        newSeries.points[newSeries.points.length - 1].highlight();\n                                    }\n                                }\n                                // Try to move to prev module (should be points, since we wrapped to last point)\n                                return this.move(-1);\n                            }\n                        }\n                    ],\n                    // Right/Down\n                    [\n                        [39, 40],\n                        function() {\n                            var highlightedExportItem = chart.highlightedExportItem || 0,\n                                reachedEnd = true;\n                            // Try to highlight next item in list. Highlighting e.g. separators will fail.\n                            for (var i = highlightedExportItem + 1; i < chart.exportDivElements.length; ++i) {\n                                if (chart.highlightExportItem(i)) {\n                                    reachedEnd = false;\n                                    break;\n                                }\n                            }\n                            if (reachedEnd) {\n                                chart.hideExportMenu();\n                                return this.move(1); // Next module\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            fakeClickEvent(chart.exportDivElements[chart.highlightedExportItem]);\n                        }\n                    ]\n                ], {\n                    // Only run exporting navigation if exporting support exists and is enabled on chart\n                    validate: function() {\n                        return chart.exportChart && !(chart.options.exporting && chart.options.exporting.enabled === false);\n                    },\n                    // Show export menu\n                    init: function(direction) {\n                        chart.highlightedPoint = null;\n                        chart.showExportMenu();\n                        // If coming back to export menu from other module, try to highlight last item in menu\n                        if (direction < 0 && chart.exportDivElements) {\n                            for (var i = chart.exportDivElements.length; i > -1; --i) {\n                                if (chart.highlightExportItem(i)) {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                }),\n\n                // Map zoom\n                navModuleFactory([\n                    // Up/down/left/right\n                    [\n                        [38, 40, 37, 39],\n                        function(keyCode) {\n                            chart[keyCode === 38 || keyCode === 40 ? 'yAxis' : 'xAxis'][0].panStep(keyCode < 39 ? -1 : 1);\n                        }\n                    ],\n\n                    // Tabs\n                    [\n                        [9],\n                        function(keyCode, e) {\n                            var button;\n                            chart.mapNavButtons[chart.focusedMapNavButtonIx].setState(0); // Deselect old\n                            if (e.shiftKey && !chart.focusedMapNavButtonIx || !e.shiftKey && chart.focusedMapNavButtonIx) { // trying to go somewhere we can't?\n                                chart.mapZoom(); // Reset zoom\n                                return this.move(e.shiftKey ? -1 : 1); // Nowhere to go, go to prev/next module\n                            }\n                            chart.focusedMapNavButtonIx += e.shiftKey ? -1 : 1;\n                            button = chart.mapNavButtons[chart.focusedMapNavButtonIx];\n                            if (button.element.focus) {\n                                button.element.focus();\n                            }\n                            button.setState(2);\n                        }\n                    ],\n\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            fakeClickEvent(chart.mapNavButtons[chart.focusedMapNavButtonIx].element);\n                        }\n                    ]\n                ], {\n                    // Only run this module if we have map zoom on the chart\n                    validate: function() {\n                        return chart.mapZoom && chart.mapNavButtons && chart.mapNavButtons.length === 2;\n                    },\n\n                    // Handle tabs separately\n                    transformTabs: false,\n\n                    // Make zoom buttons do their magic\n                    init: function(direction) {\n                        var zoomIn = chart.mapNavButtons[0],\n                            zoomOut = chart.mapNavButtons[1],\n                            initialButton = direction > 0 ? zoomIn : zoomOut;\n\n                        each(chart.mapNavButtons, function(button, i) {\n                            button.element.setAttribute('tabindex', -1);\n                            button.element.setAttribute('role', 'button');\n                            button.element.setAttribute('aria-label', 'Zoom ' + (i ? 'out' : '') + 'chart');\n                        });\n\n                        if (initialButton.element.focus) {\n                            initialButton.element.focus();\n                        }\n                        initialButton.setState(2);\n                        chart.focusedMapNavButtonIx = direction > 0 ? 0 : 1;\n                    }\n                }),\n\n                // Highstock range selector (minus input boxes)\n                navModuleFactory([\n                    // Left/Right/Up/Down\n                    [\n                        [37, 39, 38, 40],\n                        function(keyCode) {\n                            var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;\n                            // Try to highlight next/prev button\n                            if (!chart.highlightRangeSelectorButton(chart.highlightedRangeSelectorItemIx + direction)) {\n                                return this.move(direction);\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            if (chart.oldRangeSelectorItemState !== 3) { // Don't allow click if button used to be disabled\n                                fakeClickEvent(chart.rangeSelector.buttons[chart.highlightedRangeSelectorItemIx].element);\n                            }\n                        }\n                    ]\n                ], {\n                    // Only run this module if we have range selector\n                    validate: function() {\n                        return chart.rangeSelector && chart.rangeSelector.buttons && chart.rangeSelector.buttons.length;\n                    },\n\n                    // Make elements focusable and accessible\n                    init: function(direction) {\n                        each(chart.rangeSelector.buttons, function(button) {\n                            button.element.setAttribute('tabindex', '-1');\n                            button.element.setAttribute('role', 'button');\n                            button.element.setAttribute('aria-label', 'Select range ' + (button.text && button.text.textStr));\n                        });\n                        // Focus first/last button\n                        chart.highlightRangeSelectorButton(direction > 0 ? 0 : chart.rangeSelector.buttons.length - 1);\n                    }\n                }),\n\n                // Highstock range selector, input boxes\n                navModuleFactory([\n                    // Tab/Up/Down\n                    [\n                        [9, 38, 40],\n                        function(keyCode, e) {\n                            var direction = (keyCode === 9 && e.shiftKey || keyCode === 38) ? -1 : 1,\n                                newIx = chart.highlightedInputRangeIx = chart.highlightedInputRangeIx + direction;\n                            // Try to highlight next/prev item in list.\n                            if (newIx > 1 || newIx < 0) { // Out of range\n                                return this.move(direction);\n                            }\n                            chart.rangeSelector[newIx ? 'maxInput' : 'minInput'].focus(); // Input boxes are HTML, and should have focus support in all browsers\n                        }\n                    ]\n                ], {\n                    // Only run if we have range selector with input boxes\n                    validate: function() {\n                        var inputVisible = chart.rangeSelector && chart.rangeSelector.inputGroup && chart.rangeSelector.inputGroup.element.getAttribute('visibility') !== 'hidden';\n                        return inputVisible && chart.options.rangeSelector.inputEnabled !== false && chart.rangeSelector.minInput && chart.rangeSelector.maxInput;\n                    },\n\n                    // Handle tabs different from left/right (because we don't want to catch left/right in a text area)\n                    transformTabs: false,\n\n                    // Highlight first/last input box\n                    init: function(direction) {\n                        chart.highlightedInputRangeIx = direction > 0 ? 0 : 1;\n                        chart.rangeSelector[chart.highlightedInputRangeIx ? 'maxInput' : 'minInput'].focus();\n                    }\n                }),\n\n                // Legend navigation\n                navModuleFactory([\n                    // Left/Right/Up/Down\n                    [\n                        [37, 39, 38, 40],\n                        function(keyCode) {\n                            var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;\n                            // Try to highlight next/prev legend item\n                            if (!chart.highlightLegendItem(chart.highlightedLegendItemIx + direction)) {\n                                return this.move(direction);\n                            }\n                        }\n                    ],\n                    // Enter/Spacebar\n                    [\n                        [13, 32],\n                        function() {\n                            fakeClickEvent(chart.legend.allItems[chart.highlightedLegendItemIx].legendItem.element.parentNode);\n                        }\n                    ]\n                ], {\n                    // Only run this module if we have at least one legend - wait for it - item.\n                    // Don't run if the legend is populated by a colorAxis.\n                    validate: function() {\n                        return chart.legend && chart.legend.allItems &&\n                            !(chart.colorAxis && chart.colorAxis.length);\n                    },\n\n                    // Make elements focusable and accessible\n                    init: function(direction) {\n                        each(chart.legend.allItems, function(item) {\n                            item.legendGroup.element.setAttribute('tabindex', '-1');\n                            item.legendGroup.element.setAttribute('role', 'button');\n                            item.legendGroup.element.setAttribute('aria-label', 'Toggle visibility of series ' + item.name);\n                        });\n                        // Focus first/last item\n                        chart.highlightLegendItem(direction > 0 ? 0 : chart.legend.allItems.length - 1);\n                    }\n                })\n            ];\n\n            // Init nav module index. We start at the first module, and as the user navigates through the chart the index will increase to use different handler modules.\n            chart.keyboardNavigationModuleIndex = 0;\n\n            // Make chart reachable by tab\n            if (\n                chart.container.hasAttribute &&\n                !chart.container.hasAttribute('tabIndex')\n            ) {\n                chart.container.setAttribute('tabindex', '0');\n            }\n\n            // Handle keyboard events\n            addEvent(chart.renderTo, 'keydown', keydownHandler);\n            addEvent(chart, 'destroy', function() {\n                removeEvent(chart.renderTo, 'keydown', keydownHandler);\n            });\n        };\n\n        // Add screen reader region to chart.\n        // tableId is the HTML id of the table to focus when clicking the table anchor in the screen reader region.\n        H.Chart.prototype.addScreenReaderRegion = function(id, tableId) {\n            var chart = this,\n                series = chart.series,\n                options = chart.options,\n                a11yOptions = options.accessibility,\n                hiddenSection = chart.screenReaderRegion = doc.createElement('div'),\n                tableShortcut = doc.createElement('h4'),\n                tableShortcutAnchor = doc.createElement('a'),\n                chartHeading = doc.createElement('h4'),\n                hiddenStyle = { // CSS style to hide element from visual users while still exposing it to screen readers\n                    position: 'absolute',\n                    left: '-9999px',\n                    top: 'auto',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                },\n                chartTypes = chart.types || [],\n                // Build axis info - but not for pies and maps. Consider not adding for certain other types as well (funnel, pyramid?)\n                axesDesc = (chartTypes.length === 1 && chartTypes[0] === 'pie' || chartTypes[0] === 'map') && {} || chart.getAxesDescription(),\n                chartTypeInfo = series[0] && typeToSeriesMap[series[0].type] || typeToSeriesMap['default']; // eslint-disable-line dot-notation\n\n            hiddenSection.setAttribute('id', id);\n            hiddenSection.setAttribute('role', 'region');\n            hiddenSection.setAttribute('aria-label', 'Chart screen reader information.');\n\n            hiddenSection.innerHTML = a11yOptions.screenReaderSectionFormatter && a11yOptions.screenReaderSectionFormatter(chart) ||\n                '<div>Use regions/landmarks to skip ahead to chart' +\n                (series.length > 1 ? ' and navigate between data series' : '') +\n                '.</div><h3>' + (options.title.text ? htmlencode(options.title.text) : 'Chart') +\n                (options.subtitle && options.subtitle.text ? '. ' + htmlencode(options.subtitle.text) : '') +\n                '</h3><h4>Long description.</h4><div>' + (options.chart.description || 'No description available.') +\n                '</div><h4>Structure.</h4><div>Chart type: ' + (options.chart.typeDescription || chart.getTypeDescription()) + '</div>' +\n                (series.length === 1 ? '<div>' + chartTypeInfo[0] + ' with ' + series[0].points.length + ' ' +\n                    (series[0].points.length === 1 ? chartTypeInfo[1] : chartTypeInfo[2]) + '.</div>' : '') +\n                (axesDesc.xAxis ? ('<div>' + axesDesc.xAxis + '</div>') : '') +\n                (axesDesc.yAxis ? ('<div>' + axesDesc.yAxis + '</div>') : '');\n\n            // Add shortcut to data table if export-data is loaded\n            if (chart.getCSV) {\n                tableShortcutAnchor.innerHTML = 'View as data table.';\n                tableShortcutAnchor.href = '#' + tableId;\n                tableShortcutAnchor.setAttribute('tabindex', '-1'); // Make this unreachable by user tabbing\n                tableShortcutAnchor.onclick = a11yOptions.onTableAnchorClick || function() {\n                    chart.viewData();\n                    doc.getElementById(tableId).focus();\n                };\n                tableShortcut.appendChild(tableShortcutAnchor);\n                hiddenSection.appendChild(tableShortcut);\n            }\n\n            // Note: JAWS seems to refuse to read aria-label on the container, so add an\n            // h4 element as title for the chart.\n            chartHeading.innerHTML = 'Chart graphic.';\n            chart.renderTo.insertBefore(chartHeading, chart.renderTo.firstChild);\n            chart.renderTo.insertBefore(hiddenSection, chart.renderTo.firstChild);\n\n            // Hide the section and the chart heading\n            merge(true, chartHeading.style, hiddenStyle);\n            merge(true, hiddenSection.style, hiddenStyle);\n        };\n\n\n        // Make chart container accessible, and wrap table functionality\n        H.Chart.prototype.callbacks.push(function(chart) {\n            var options = chart.options,\n                a11yOptions = options.accessibility;\n\n            if (!a11yOptions.enabled) {\n                return;\n            }\n\n            var titleElement = doc.createElementNS('http://www.w3.org/2000/svg', 'title'),\n                exportGroupElement = doc.createElementNS('http://www.w3.org/2000/svg', 'g'),\n                descElement = chart.container.getElementsByTagName('desc')[0],\n                textElements = chart.container.getElementsByTagName('text'),\n                titleId = 'highcharts-title-' + chart.index,\n                tableId = 'highcharts-data-table-' + chart.index,\n                hiddenSectionId = 'highcharts-information-region-' + chart.index,\n                chartTitle = options.title.text || 'Chart',\n                oldColumnHeaderFormatter = options.exporting && options.exporting.csv && options.exporting.csv.columnHeaderFormatter,\n                topLevelColumns = [];\n\n            // Add SVG title/desc tags\n            titleElement.textContent = htmlencode(chartTitle);\n            titleElement.id = titleId;\n            descElement.parentNode.insertBefore(titleElement, descElement);\n            chart.renderTo.setAttribute('role', 'region');\n            //chart.container.setAttribute('aria-details', hiddenSectionId); // JAWS currently doesn't handle this too well\n            chart.renderTo.setAttribute('aria-label', 'Interactive chart. ' + chartTitle +\n                '. Use up and down arrows to navigate with most screen readers.');\n\n            // Set screen reader properties on export menu\n            if (chart.exportSVGElements && chart.exportSVGElements[0] && chart.exportSVGElements[0].element) {\n                var oldExportCallback = chart.exportSVGElements[0].element.onclick,\n                    parent = chart.exportSVGElements[0].element.parentNode;\n                chart.exportSVGElements[0].element.onclick = function() {\n                    oldExportCallback.apply(this, Array.prototype.slice.call(arguments));\n                    chart.addAccessibleContextMenuAttribs();\n                    chart.highlightExportItem(0);\n                };\n                chart.exportSVGElements[0].element.setAttribute('role', 'button');\n                chart.exportSVGElements[0].element.setAttribute('aria-label', 'View export menu');\n                exportGroupElement.appendChild(chart.exportSVGElements[0].element);\n                exportGroupElement.setAttribute('role', 'region');\n                exportGroupElement.setAttribute('aria-label', 'Chart export menu');\n                parent.appendChild(exportGroupElement);\n            }\n\n            // Set screen reader properties on input boxes for range selector. We need to do this regardless of whether or not these are visible, as they are \n            // by default part of the page's tabindex unless we set them to -1.\n            if (chart.rangeSelector) {\n                each(['minInput', 'maxInput'], function(key, i) {\n                    if (chart.rangeSelector[key]) {\n                        chart.rangeSelector[key].setAttribute('tabindex', '-1');\n                        chart.rangeSelector[key].setAttribute('role', 'textbox');\n                        chart.rangeSelector[key].setAttribute('aria-label', 'Select ' + (i ? 'end' : 'start') + ' date.');\n                    }\n                });\n            }\n\n            // Hide text elements from screen readers\n            each(textElements, function(el) {\n                el.setAttribute('aria-hidden', 'true');\n            });\n\n            // Add top-secret screen reader region\n            chart.addScreenReaderRegion(hiddenSectionId, tableId);\n\n            // Enable keyboard navigation\n            if (a11yOptions.keyboardNavigation.enabled) {\n                chart.addKeyboardNavEvents();\n            }\n\n            /* Wrap table functionality from export-data */\n\n            // Keep track of columns\n            merge(true, options.exporting, {\n                csv: {\n                    columnHeaderFormatter: function(item, key, keyLength) {\n                        if (!item) {\n                            return 'Category';\n                        }\n                        if (item instanceof H.Axis) {\n                            return (item.options.title && item.options.title.text) ||\n                                (item.isDatetimeAxis ? 'DateTime' : 'Category');\n                        }\n                        var prevCol = topLevelColumns[topLevelColumns.length - 1];\n                        if (keyLength > 1) {\n                            // We need multiple levels of column headers\n                            // Populate a list of column headers to add in addition to the ones added by export-data\n                            if ((prevCol && prevCol.text) !== item.name) {\n                                topLevelColumns.push({\n                                    text: item.name,\n                                    span: keyLength\n                                });\n                            }\n                        }\n                        if (oldColumnHeaderFormatter) {\n                            return oldColumnHeaderFormatter.call(this, item, key, keyLength);\n                        }\n                        return keyLength > 1 ? key : item.name;\n                    }\n                }\n            });\n\n            // Add ID and title/caption to table HTML\n            H.wrap(chart, 'getTable', function(proceed) {\n                return proceed.apply(this, Array.prototype.slice.call(arguments, 1))\n                    .replace('<table>', '<table id=\"' + tableId + '\" summary=\"Table representation of chart\"><caption>' + chartTitle + '</caption>');\n            });\n\n            // Add accessibility attributes and top level columns\n            H.wrap(chart, 'viewData', function(proceed) {\n                if (!this.dataTableDiv) {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n                    var table = doc.getElementById(tableId),\n                        head = table.getElementsByTagName('thead')[0],\n                        body = table.getElementsByTagName('tbody')[0],\n                        firstRow = head.firstChild.children,\n                        columnHeaderRow = '<tr><td></td>',\n                        cell,\n                        newCell;\n\n                    // Make table focusable by script\n                    table.setAttribute('tabindex', '-1');\n\n                    // Create row headers\n                    each(body.children, function(el) {\n                        cell = el.firstChild;\n                        newCell = doc.createElement('th');\n                        newCell.setAttribute('scope', 'row');\n                        newCell.innerHTML = cell.innerHTML;\n                        cell.parentNode.replaceChild(newCell, cell);\n                    });\n\n                    // Set scope for column headers\n                    each(firstRow, function(el) {\n                        if (el.tagName === 'TH') {\n                            el.setAttribute('scope', 'col');\n                        }\n                    });\n\n                    // Add top level columns\n                    if (topLevelColumns.length) {\n                        each(topLevelColumns, function(col) {\n                            columnHeaderRow += '<th scope=\"col\" colspan=\"' + col.span + '\">' + col.text + '</th>';\n                        });\n                        head.insertAdjacentHTML('afterbegin', columnHeaderRow);\n                    }\n                }\n            });\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/annotations.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(e){function n(a,c,b,f,e){for(var d=a.length,g=0;g<d;)k(a[g])&&k(a[g+1])?(a[g]=c.toPixels(a[g])-f,a[g+1]=b.toPixels(a[g+1])-e,g+=2):g+=1;return a}var p=e.defined,k=e.isNumber,t=e.inArray,A=e.isArray,B=e.merge,C=e.Chart,u=e.extend,D=e.each,q,E;E=[\"path\",\"rect\",\"circle\"];q={top:0,left:0,center:.5,middle:.5,bottom:1,right:1};var F=function(){this.init.apply(this,arguments)};F.prototype={init:function(a,\nc){var b=c.shape&&c.shape.type;this.chart=a;var f;f={xAxis:0,yAxis:0,title:{style:{},text:\"\",x:0,y:0},shape:{params:{stroke:\"#000000\",fill:\"transparent\",strokeWidth:2}}};a={circle:{params:{x:0,y:0}}};a[b]&&(f.shape=B(f.shape,a[b]));this.options=B({},f,c)},render:function(a){var c=this.chart,b=this.chart.renderer,f=this.group,e=this.title,d=this.shape,g=this.options,k=g.title,m=g.shape;f||(f=this.group=b.g());!d&&m&&-1!==t(m.type,E)&&(d=this.shape=b[g.shape.type](m.params),d.add(f));!e&&k&&(e=this.title=\nb.label(k),e.add(f));f.add(c.annotations.group);this.linkObjects();!1!==a&&this.redraw()},redraw:function(){var a=this.options,c=this.chart,b=this.group,f=this.title,z=this.shape,d=this.linkedObject,g=c.xAxis[a.xAxis],v=c.yAxis[a.yAxis],c=a.width,m=a.height,w=q[a.anchorY],x=q[a.anchorX],h,y,l,r;d&&(y=d instanceof e.Point?\"point\":d instanceof e.Series?\"series\":null,\"point\"===y?(a.xValue=d.x,a.yValue=d.y,l=d.series):\"series\"===y&&(l=d),b.visibility!==l.group.visibility&&b.attr({visibility:l.group.visibility}));\nd=p(a.xValue)?g.toPixels(a.xValue+g.minPointOffset)-g.minPixelPadding:a.x;l=p(a.yValue)?v.toPixels(a.yValue):a.y;k(d)&&k(l)&&(f&&(f.attr(a.title),f.css(a.title.style)),z&&(h=u({},a.shape.params),\"values\"===a.units&&(e.objectEach(h,function(a,b){-1<t(b,[\"width\",\"x\"])?h[b]=g.translate(h[b]):-1<t(b,[\"height\",\"y\"])&&(h[b]=v.translate(h[b]))}),h.width&&(h.width-=g.toPixels(0)-g.left),h.x&&(h.x+=g.minPixelPadding),\"path\"===a.shape.type&&n(h.d,g,v,d,l)),\"circle\"===a.shape.type&&(h.x+=h.r,h.y+=h.r),z.attr(h)),\nb.bBox=null,k(c)||(r=b.getBBox(),c=r.width),k(m)||(r||(r=b.getBBox()),m=r.height),k(x)||(x=q.center),k(w)||(w=q.center),d-=c*x,l-=m*w,p(b.translateX)&&p(b.translateY)?b.animate({translateX:d,translateY:l}):b.translate(d,l))},destroy:function(){var a=this,c=this.chart.annotations.allItems,b=c.indexOf(a);-1<b&&c.splice(b,1);D([\"title\",\"shape\",\"group\"],function(b){a[b]&&(a[b].destroy(),a[b]=null)});a.group=a.title=a.shape=a.chart=a.options=null},update:function(a,c){u(this.options,a);this.linkObjects();\nthis.render(c)},linkObjects:function(){var a=this.chart,c=this.linkedObject,b=c&&(c.id||c.options.id),f=this.options.linkedTo;p(f)?p(c)&&f===b||(this.linkedObject=a.get(f)):this.linkedObject=null}};u(C.prototype,{annotations:{add:function(a,c){var b=this.allItems,f=this.chart,e,d;A(a)||(a=[a]);for(d=a.length;d--;)e=new F(f,a[d]),b.push(e),e.render(c)},redraw:function(){D(this.allItems,function(a){a.redraw()})}}});C.prototype.callbacks.push(function(a){var c=a.options.annotations,b;b=a.renderer.g(\"annotations\");\nb.attr({zIndex:7});b.add();a.annotations.allItems=[];a.annotations.chart=a;a.annotations.group=b;A(c)&&0<c.length&&a.annotations.add(a.options.annotations);e.addEvent(a,\"redraw\",function(){a.annotations.redraw()})})})(n)});\n"
  },
  {
    "path": "assets/highcharts/modules/annotations.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var defined = H.defined,\n            isNumber = H.isNumber,\n            inArray = H.inArray,\n            isArray = H.isArray,\n            merge = H.merge,\n            Chart = H.Chart,\n            extend = H.extend,\n            each = H.each;\n\n        var ALIGN_FACTOR,\n            ALLOWED_SHAPES;\n\n        ALLOWED_SHAPES = ['path', 'rect', 'circle'];\n\n        ALIGN_FACTOR = {\n            top: 0,\n            left: 0,\n            center: 0.5,\n            middle: 0.5,\n            bottom: 1,\n            right: 1\n        };\n\n        function defaultOptions(shapeType) {\n            var shapeOptions,\n                options;\n\n            options = {\n                xAxis: 0,\n                yAxis: 0,\n                title: {\n                    style: {},\n                    text: '',\n                    x: 0,\n                    y: 0\n                },\n                shape: {\n                    params: {\n                        stroke: '#000000',\n                        fill: 'transparent',\n                        strokeWidth: 2\n                    }\n                }\n            };\n\n            shapeOptions = {\n                circle: {\n                    params: {\n                        x: 0,\n                        y: 0\n                    }\n                }\n            };\n\n            if (shapeOptions[shapeType]) {\n                options.shape = merge(options.shape, shapeOptions[shapeType]);\n            }\n\n            return options;\n        }\n\n        function translatePath(d, xAxis, yAxis, xOffset, yOffset) {\n            var len = d.length,\n                i = 0;\n\n            while (i < len) {\n                if (isNumber(d[i]) && isNumber(d[i + 1])) {\n                    d[i] = xAxis.toPixels(d[i]) - xOffset;\n                    d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;\n                    i += 2;\n                } else {\n                    i += 1;\n                }\n            }\n\n            return d;\n        }\n\n\n        // Define annotation prototype\n        var Annotation = function() {\n            this.init.apply(this, arguments);\n        };\n        Annotation.prototype = {\n            /* \n             * Initialize the annotation\n             */\n            init: function(chart, options) {\n                var shapeType = options.shape && options.shape.type;\n\n                this.chart = chart;\n                this.options = merge({}, defaultOptions(shapeType), options);\n            },\n\n            /*\n             * Render the annotation\n             */\n            render: function(redraw) {\n                var annotation = this,\n                    chart = this.chart,\n                    renderer = annotation.chart.renderer,\n                    group = annotation.group,\n                    title = annotation.title,\n                    shape = annotation.shape,\n                    options = annotation.options,\n                    titleOptions = options.title,\n                    shapeOptions = options.shape;\n\n                if (!group) {\n                    group = annotation.group = renderer.g();\n                }\n\n\n                if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {\n                    shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);\n                    shape.add(group);\n                }\n\n                if (!title && titleOptions) {\n                    title = annotation.title = renderer.label(titleOptions);\n                    title.add(group);\n                }\n\n                group.add(chart.annotations.group);\n\n                // link annotations to point or series\n                annotation.linkObjects();\n\n                if (redraw !== false) {\n                    annotation.redraw();\n                }\n            },\n\n            /*\n             * Redraw the annotation title or shape after options update\n             */\n            redraw: function() {\n                var options = this.options,\n                    chart = this.chart,\n                    group = this.group,\n                    title = this.title,\n                    shape = this.shape,\n                    linkedTo = this.linkedObject,\n                    xAxis = chart.xAxis[options.xAxis],\n                    yAxis = chart.yAxis[options.yAxis],\n                    width = options.width,\n                    height = options.height,\n                    anchorY = ALIGN_FACTOR[options.anchorY],\n                    anchorX = ALIGN_FACTOR[options.anchorX],\n                    shapeParams,\n                    linkType,\n                    series,\n                    bbox,\n                    x,\n                    y;\n\n                if (linkedTo) {\n                    linkType = (linkedTo instanceof H.Point) ? 'point' :\n                        (linkedTo instanceof H.Series) ? 'series' : null;\n\n                    if (linkType === 'point') {\n                        options.xValue = linkedTo.x;\n                        options.yValue = linkedTo.y;\n                        series = linkedTo.series;\n                    } else if (linkType === 'series') {\n                        series = linkedTo;\n                    }\n\n                    if (group.visibility !== series.group.visibility) {\n                        group.attr({\n                            visibility: series.group.visibility\n                        });\n                    }\n                }\n\n\n                // Based on given options find annotation pixel position\n                x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);\n                y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;\n\n                if (!isNumber(x) || !isNumber(y)) {\n                    return;\n                }\n\n\n                if (title) {\n                    title.attr(options.title);\n                    title.css(options.title.style);\n                }\n\n                if (shape) {\n                    shapeParams = extend({}, options.shape.params);\n\n                    if (options.units === 'values') {\n                        H.objectEach(shapeParams, function(val, param) {\n                            if (inArray(param, ['width', 'x']) > -1) {\n                                shapeParams[param] = xAxis.translate(shapeParams[param]);\n                            } else if (inArray(param, ['height', 'y']) > -1) {\n                                shapeParams[param] = yAxis.translate(shapeParams[param]);\n                            }\n                        });\n\n                        if (shapeParams.width) {\n                            shapeParams.width -= xAxis.toPixels(0) - xAxis.left;\n                        }\n\n                        if (shapeParams.x) {\n                            shapeParams.x += xAxis.minPixelPadding;\n                        }\n\n                        if (options.shape.type === 'path') {\n                            translatePath(shapeParams.d, xAxis, yAxis, x, y);\n                        }\n                    }\n\n                    // move the center of the circle to shape x/y\n                    if (options.shape.type === 'circle') {\n                        shapeParams.x += shapeParams.r;\n                        shapeParams.y += shapeParams.r;\n                    }\n\n                    shape.attr(shapeParams);\n                }\n\n                group.bBox = null;\n\n                // If annotation width or height is not defined in options use bounding box size\n                if (!isNumber(width)) {\n                    bbox = group.getBBox();\n                    width = bbox.width;\n                }\n\n                if (!isNumber(height)) {\n                    // get bbox only if it wasn't set before\n                    if (!bbox) {\n                        bbox = group.getBBox();\n                    }\n\n                    height = bbox.height;\n                }\n\n                // Calculate anchor point\n                if (!isNumber(anchorX)) {\n                    anchorX = ALIGN_FACTOR.center;\n                }\n\n                if (!isNumber(anchorY)) {\n                    anchorY = ALIGN_FACTOR.center;\n                }\n\n                // Translate group according to its dimension and anchor point\n                x = x - width * anchorX;\n                y = y - height * anchorY;\n\n                if (defined(group.translateX) && defined(group.translateY)) {\n                    group.animate({\n                        translateX: x,\n                        translateY: y\n                    });\n                } else {\n                    group.translate(x, y);\n                }\n            },\n\n            /*\n             * Destroy the annotation\n             */\n            destroy: function() {\n                var annotation = this,\n                    chart = this.chart,\n                    allItems = chart.annotations.allItems,\n                    index = allItems.indexOf(annotation);\n\n                if (index > -1) {\n                    allItems.splice(index, 1);\n                }\n\n                each(['title', 'shape', 'group'], function(element) {\n                    if (annotation[element]) {\n                        annotation[element].destroy();\n                        annotation[element] = null;\n                    }\n                });\n\n                annotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;\n            },\n\n            /*\n             * Update the annotation with a given options\n             */\n            update: function(options, redraw) {\n                extend(this.options, options);\n\n                // update link to point or series\n                this.linkObjects();\n\n                this.render(redraw);\n            },\n\n            linkObjects: function() {\n                var annotation = this,\n                    chart = annotation.chart,\n                    linkedTo = annotation.linkedObject,\n                    linkedId = linkedTo && (linkedTo.id || linkedTo.options.id),\n                    options = annotation.options,\n                    id = options.linkedTo;\n\n                if (!defined(id)) {\n                    annotation.linkedObject = null;\n                } else if (!defined(linkedTo) || id !== linkedId) {\n                    annotation.linkedObject = chart.get(id);\n                }\n            }\n        };\n\n\n        // Add annotations methods to chart prototype\n        extend(Chart.prototype, {\n            annotations: {\n                /*\n                 * Unified method for adding annotations to the chart\n                 */\n                add: function(options, redraw) {\n                    var annotations = this.allItems,\n                        chart = this.chart,\n                        item,\n                        len;\n\n                    if (!isArray(options)) {\n                        options = [options];\n                    }\n\n                    len = options.length;\n\n                    while (len--) {\n                        item = new Annotation(chart, options[len]);\n                        annotations.push(item);\n                        item.render(redraw);\n                    }\n                },\n\n                /**\n                 * Redraw all annotations, method used in chart events\n                 */\n                redraw: function() {\n                    each(this.allItems, function(annotation) {\n                        annotation.redraw();\n                    });\n                }\n            }\n        });\n\n\n        // Initialize on chart load\n        Chart.prototype.callbacks.push(function(chart) {\n            var options = chart.options.annotations,\n                group;\n\n            group = chart.renderer.g('annotations');\n            group.attr({\n                zIndex: 7\n            });\n            group.add();\n\n            // initialize empty array for annotations\n            chart.annotations.allItems = [];\n\n            // link chart object to annotations\n            chart.annotations.chart = chart;\n\n            // link annotations group element to the chart\n            chart.annotations.group = group;\n\n            if (isArray(options) && options.length > 0) {\n                chart.annotations.add(chart.options.annotations);\n            }\n\n            // update annotations after chart redraw\n            H.addEvent(chart, 'redraw', function() {\n                chart.annotations.redraw();\n            });\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/boost-canvas.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Boost module\n\n (c) 2010-2017 Highsoft AS\n Author: Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(d){function p(a,b,c,g,e){e=e||0;g=g||5E4;for(var d=e+g,f=!0;f&&e<d&&e<a.length;)f=b(a[e],e),e+=1;f&&(e<a.length?setTimeout(function(){p(a,b,c,g,e)}):c&&c())}function x(a){return a.series.length>=((a.options.boost?a.options.boost.seriesThreshold:0)||a.options.chart.seriesBoostThreshold||10)}var A=d.win.document,Z=function(){},aa=d.Color,m=d.Series,k=d.seriesTypes,w=d.each,B=d.extend,y=d.addEvent,\nba=d.fireEvent,r=d.isNumber,ca=d.merge,da=d.pick,n=d.wrap,L;d.initCanvasBoost=function(){d.seriesTypes.heatmap&&d.wrap(d.seriesTypes.heatmap.prototype,\"drawPoints\",function(){var a=this.getContext();a?(w(this.points,function(b){var c=b.plotY;void 0===c||isNaN(c)||null===b.y||(c=b.shapeArgs,b=b.series.pointAttribs(b),a.fillStyle=b.fill,a.fillRect(c.x,c.y,c.width,c.height))}),this.canvasToSVG()):this.chart.showLoading(\"Your browser doesn't support HTML5 canvas, \\x3cbr\\x3eplease use a modern browser\")});\nd.extend(m.prototype,{directTouch:!1,pointRange:0,allowDG:!1,hasExtremes:function(a){var b=this.options,c=this.xAxis&&this.xAxis.options,g=this.yAxis&&this.yAxis.options;return b.data.length>(b.boostThreshold||Number.MAX_VALUE)&&r(g.min)&&r(g.max)&&(!a||r(c.min)&&r(c.max))},destroyGraphics:function(){var a=this,b=this.points,c,g;if(b)for(g=0;g<b.length;g+=1)(c=b[g])&&c.graphic&&(c.graphic=c.graphic.destroy());w([\"graph\",\"area\",\"tracker\"],function(c){a[c]&&(a[c]=a[c].destroy())})},getContext:function(){var a=\nthis.chart,b=a.chartWidth,c=a.chartHeight,g=this.group,e=this,d,f=function(a,c,b,e,g,d,f){a.call(this,b,c,e,g,d,f)};x(a)&&(e=a,g=a.seriesGroup);d=e.ctx;e.canvas||(e.canvas=A.createElement(\"canvas\"),e.image=a.renderer.image(\"\",0,0,b,c).add(g),e.ctx=d=e.canvas.getContext(\"2d\"),a.inverted&&w([\"moveTo\",\"lineTo\",\"rect\",\"arc\"],function(a){n(d,a,f)}),e.boostClipRect=a.renderer.clipRect(a.plotLeft,a.plotTop,a.plotWidth,a.chartHeight),e.image.clip(e.boostClipRect));e.canvas.width!==b&&(e.canvas.width=b);e.canvas.height!==\nc&&(e.canvas.height=c);e.image.attr({x:0,y:0,width:b,height:c,style:\"pointer-events: none\"});e.boostClipRect.attr({x:0,y:0,width:a.plotWidth,height:a.chartHeight});return d},canvasToSVG:function(){x(this.chart)?this.image&&this.image.attr({href:\"\"}):this.image.attr({href:this.canvas.toDataURL(\"image/png\")})},cvsLineTo:function(a,b,c){a.lineTo(b,c)},renderCanvas:function(){var a=this,b=a.options,c=a.chart,g=this.xAxis,e=this.yAxis,k=(c.options.boost||{}).timeRendering||!1,f,t=0,m=a.processedXData,\nw=a.processedYData,n=b.data,l=g.getExtremes(),C=l.min,D=l.max,l=e.getExtremes(),x=l.min,y=l.max,M={},E,A=!!a.sampling,N,F=b.marker&&b.marker.radius,O=this.cvsDrawPoint,G=b.lineWidth?this.cvsLineTo:!1,P=F&&1>=F?this.cvsMarkerSquare:this.cvsMarkerCircle,ea=this.cvsStrokeBatch||1E3,fa=!1!==b.enableMouseTracking,Q,l=b.threshold,u=e.getThreshold(l),R=r(l),S=u,ga=this.fill,T=a.pointArrayMap&&\"low,high\"===a.pointArrayMap.join(\",\"),U=!!b.stacking,ha=a.cropStart||0,l=c.options.loading,ia=a.requireSorting,\nV,ja=b.connectNulls,W=!m,H,I,v,z,J,q=U?a.data:m||n,ka=a.fillOpacity?(new aa(a.color)).setOpacity(da(b.fillOpacity,.75)).get():a.color,X=function(){ga?(f.fillStyle=ka,f.fill()):(f.strokeStyle=a.color,f.lineWidth=b.lineWidth,f.stroke())},Y=function(b,e,g,d){0===t&&(f.beginPath(),G&&(f.lineJoin=\"round\"));c.scroller&&\"highcharts-navigator-series\"===a.options.className?(e+=c.scroller.top,g&&(g+=c.scroller.top)):e+=c.plotTop;b+=c.plotLeft;V?f.moveTo(b,e):O?O(f,b,e,g,Q):G?G(f,b,e):P&&P.call(a,f,b,e,F,d);\nt+=1;t===ea&&(X(),t=0);Q={clientX:b,plotY:e,yBottom:g}},K=function(a,b,d){J=a+\",\"+b;fa&&!M[J]&&(M[J]=!0,c.inverted&&(a=g.len-a,b=e.len-b),N.push({clientX:a,plotX:a,plotY:b,i:ha+d}))};(this.points||this.graph)&&this.destroyGraphics();a.plotGroup(\"group\",\"series\",a.visible?\"visible\":\"hidden\",b.zIndex,c.seriesGroup);a.markerGroup=a.group;N=this.points=[];f=this.getContext();a.buildKDTree=Z;99999<n.length&&(c.options.loading=ca(l,{labelStyle:{backgroundColor:d.color(\"#ffffff\").setOpacity(.75).get(),padding:\"1em\",\nborderRadius:\"0.5em\"},style:{backgroundColor:\"none\",opacity:1}}),clearTimeout(L),c.showLoading(\"Drawing...\"),c.options.loading=l);k&&console.time(\"canvas rendering\");p(q,function(b,d){var f,h,k,l=!1,p=!1,m=!1,n=!1,r=\"undefined\"===typeof c.index,t=!0;if(!r){W?(f=b[0],h=b[1],q[d+1]&&(m=q[d+1][0]),q[d-1]&&(n=q[d-1][0])):(f=b,h=w[d],q[d+1]&&(m=q[d+1]),q[d-1]&&(n=q[d-1]));m&&m>=C&&m<=D&&(l=!0);n&&n>=C&&n<=D&&(p=!0);T?(W&&(h=b.slice(1,3)),k=h[0],h=h[1]):U&&(f=b.x,h=b.stackY,k=h-b.y);b=null===h;ia||(t=h>=\nx&&h<=y);if(!b&&(f>=C&&f<=D&&t||l||p))if(f=Math.round(g.toPixels(f,!0)),A){if(void 0===v||f===E){T||(k=h);if(void 0===z||h>I)I=h,z=d;if(void 0===v||k<H)H=k,v=d}f!==E&&(void 0!==v&&(h=e.toPixels(I,!0),u=e.toPixels(H,!0),Y(f,R?Math.min(h,S):h,R?Math.max(u,S):u,d),K(f,h,z),u!==h&&K(f,u,v)),v=z=void 0,E=f)}else h=Math.round(e.toPixels(h,!0)),Y(f,h,u,d),K(f,h,d);V=b&&!ja;0===d%5E4&&a.canvasToSVG()}return!r},function(){var b=c.loadingDiv,e=c.loadingShown;X();a.canvasToSVG();k&&console.timeEnd(\"canvas rendering\");\nba(a,\"renderedCanvas\");e&&(B(b.style,{transition:\"opacity 250ms\",opacity:0}),c.loadingShown=!1,L=setTimeout(function(){b.parentNode&&b.parentNode.removeChild(b);c.loadingDiv=c.loadingSpan=null},250));a.directTouch=!1;a.options.stickyTracking=!0;delete a.buildKDTree;a.buildKDTree()},c.renderer.forExport?Number.MAX_VALUE:void 0)}});n(m.prototype,\"setData\",function(a){this.hasExtremes&&this.hasExtremes(!0)&&\"heatmap\"!==this.type||a.apply(this,Array.prototype.slice.call(arguments,1))});n(m.prototype,\n\"processData\",function(a){this.hasExtremes&&this.hasExtremes(!0)&&\"heatmap\"!==this.type||a.apply(this,Array.prototype.slice.call(arguments,1))});k.scatter.prototype.cvsMarkerCircle=function(a,b,c,d){a.moveTo(b,c);a.arc(b,c,d,0,2*Math.PI,!1)};k.scatter.prototype.cvsMarkerSquare=function(a,b,c,d){a.rect(b-d,c-d,2*d,2*d)};k.scatter.prototype.fill=!0;k.bubble&&(k.bubble.prototype.cvsMarkerCircle=function(a,b,c,d,e){a.moveTo(b,c);a.arc(b,c,this.radii&&this.radii[e],0,2*Math.PI,!1)},k.bubble.prototype.cvsStrokeBatch=\n1);B(k.area.prototype,{cvsDrawPoint:function(a,b,c,d,e){e&&b!==e.clientX&&(a.moveTo(e.clientX,e.yBottom),a.lineTo(e.clientX,e.plotY),a.lineTo(b,c),a.lineTo(b,d))},fill:!0,fillOpacity:!0,sampling:!0});B(k.column.prototype,{cvsDrawPoint:function(a,b,c,d){a.rect(b-1,c,1,d-c)},fill:!0,sampling:!0});d.Chart.prototype.callbacks.push(function(a){y(a,\"predraw\",function(){a.image&&a.image.attr({href:\"\"});a.canvas&&a.canvas.getContext(\"2d\").clearRect(0,0,a.canvas.width,a.canvas.height)});y(a,\"render\",function(){a.image&&\na.canvas&&a.image.attr({href:a.canvas.toDataURL(\"image/png\")})})})}})(p)});\n"
  },
  {
    "path": "assets/highcharts/modules/boost-canvas.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Boost module\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * License: www.highcharts.com/license\n         * Author: Torstein Honsi, Christer Vasseng\n         * \n         * This is an experimental Highcharts module that draws long data series on a canvas\n         * in order to increase performance of the initial load time and tooltip responsiveness.\n         *\n         * Compatible with HTML5 canvas compatible browsers (not IE < 9).\n         *\n         *\n         * \n         * Development plan\n         * - Column range.\n         * - Heatmap. Modify the heatmap-canvas demo so that it uses this module.\n         * - Treemap.\n         * - Check how it works with Highstock and data grouping. Currently it only works when navigator.adaptToUpdatedData\n         *   is false. It is also recommended to set scrollbar.liveRedraw to false.\n         * - Check inverted charts.\n         * - Check reversed axes.\n         * - Chart callback should be async after last series is drawn. (But not necessarily, we don't do\n        \t that with initial series animation).\n         * - Cache full-size image so we don't have to redraw on hide/show and zoom up. But k-d-tree still\n         *   needs to be built.\n         * - Test IE9 and IE10.\n         * - Stacking is not perhaps not correct since it doesn't use the translation given in \n         *   the translate method. If this gets to complicated, a possible way out would be to \n         *   have a simplified renderCanvas method that simply draws the areaPath on a canvas.\n         *\n         * If this module is taken in as part of the core\n         * - All the loading logic should be merged with core. Update styles in the core.\n         * - Most of the method wraps should probably be added directly in parent methods.\n         *\n         * Notes for boost mode\n         * - Area lines are not drawn\n         * - Point markers are not drawn on line-type series\n         * - Lines are not drawn on scatter charts\n         * - Zones and negativeColor don't work\n         * - Initial point colors aren't rendered\n         * - Columns are always one pixel wide. Don't set the threshold too low.\n         *\n         * Optimizing tips for users\n         * - For scatter plots, use a marker.radius of 1 or less. It results in a rectangle being drawn, which is \n         *   considerably faster than a circle.\n         * - Set extremes (min, max) explicitly on the axes in order for Highcharts to avoid computing extremes.\n         * - Set enableMouseTracking to false on the series to improve total rendering time.\n         * - The default threshold is set based on one series. If you have multiple, dense series, the combined\n         *   number of points drawn gets higher, and you may want to set the threshold lower in order to \n         *   use optimizations.\n         */\n\n\n        var win = H.win,\n            doc = win.document,\n            noop = function() {},\n            Color = H.Color,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            each = H.each,\n            extend = H.extend,\n            addEvent = H.addEvent,\n            fireEvent = H.fireEvent,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            wrap = H.wrap,\n            CHUNK_SIZE = 50000,\n            destroyLoadingDiv;\n\n        function eachAsync(arr, fn, finalFunc, chunkSize, i) {\n            i = i || 0;\n            chunkSize = chunkSize || CHUNK_SIZE;\n\n            var threshold = i + chunkSize,\n                proceed = true;\n\n            while (proceed && i < threshold && i < arr.length) {\n                proceed = fn(arr[i], i);\n                i = i + 1;\n            }\n            if (proceed) {\n                if (i < arr.length) {\n                    setTimeout(function() {\n                        eachAsync(arr, fn, finalFunc, chunkSize, i);\n                    });\n                } else if (finalFunc) {\n                    finalFunc();\n                }\n            }\n        }\n\n        /*\n         * Returns true if the chart is in series boost mode\n         * @param chart {Highchart.Chart} - the chart to check\n         * @returns {Boolean} - true if the chart is in series boost mode\n         */\n        function isChartSeriesBoosting(chart) {\n            var threshold = (chart.options.boost ? chart.options.boost.seriesThreshold : 0) ||\n                chart.options.chart.seriesBoostThreshold ||\n                10;\n\n            return chart.series.length >= threshold;\n        }\n\n        H.initCanvasBoost = function() {\n\n            if (H.seriesTypes.heatmap) {\n                H.wrap(H.seriesTypes.heatmap.prototype, 'drawPoints', function() {\n                    var ctx = this.getContext();\n                    if (ctx) {\n\n                        // draw the columns\n                        each(this.points, function(point) {\n                            var plotY = point.plotY,\n                                shapeArgs,\n                                pointAttr;\n\n                            if (plotY !== undefined && !isNaN(plotY) && point.y !== null) {\n                                shapeArgs = point.shapeArgs;\n\n\n                                pointAttr = point.series.pointAttribs(point);\n\n\n                                ctx.fillStyle = pointAttr.fill;\n                                ctx.fillRect(shapeArgs.x, shapeArgs.y, shapeArgs.width, shapeArgs.height);\n                            }\n                        });\n\n                        this.canvasToSVG();\n\n                    } else {\n                        this.chart.showLoading('Your browser doesn\\'t support HTML5 canvas, <br>please use a modern browser');\n\n                        // Uncomment this to provide low-level (slow) support in oldIE. It will cause script errors on\n                        // charts with more than a few thousand points.\n                        // arguments[0].call(this);\n                    }\n                });\n            }\n\n\n            /**\n             * Override a bunch of methods the same way. If the number of points is below the threshold,\n             * run the original method. If not, check for a canvas version or do nothing.\n             */\n            // each(['translate', 'generatePoints', 'drawTracker', 'drawPoints', 'render'], function (method) {\n            // \tfunction branch(proceed) {\n            // \t\tvar letItPass = this.options.stacking && (method === 'translate' || method === 'generatePoints');\n            // \t\tif (((this.processedXData || this.options.data).length < (this.options.boostThreshold || Number.MAX_VALUE) ||\n            // \t\t\t\tletItPass) || !isChartSeriesBoosting(this.chart)) {\n\n            // \t\t\t// Clear image\n            // \t\t\tif (method === 'render' && this.image) {\n            // \t\t\t\tthis.image.attr({ href: '' });\n            // \t\t\t\tthis.animate = null; // We're zooming in, don't run animation\n            // \t\t\t}\n\n            // \t\t\tproceed.call(this);\n\n            // \t\t// If a canvas version of the method exists, like renderCanvas(), run\n            // \t\t} else if (this[method + 'Canvas']) {\n\n            // \t\t\tthis[method + 'Canvas']();\n            // \t\t}\n            // \t}\n            // \twrap(Series.prototype, method, branch);\n\n            // \t// A special case for some types - its translate method is already wrapped\n            // \tif (method === 'translate') {\n            // \t\teach(['arearange', 'bubble', 'column'], function (type) {\n            // \t\t\tif (seriesTypes[type]) {\n            // \t\t\t\twrap(seriesTypes[type].prototype, method, branch);\n            // \t\t\t}\n            // \t\t});\n            // \t}\n            // });\n\n            H.extend(Series.prototype, {\n                directTouch: false,\n                pointRange: 0,\n                allowDG: false, // No data grouping, let boost handle large data \n                hasExtremes: function(checkX) {\n                    var options = this.options,\n                        data = options.data,\n                        xAxis = this.xAxis && this.xAxis.options,\n                        yAxis = this.yAxis && this.yAxis.options;\n                    return data.length > (options.boostThreshold || Number.MAX_VALUE) && isNumber(yAxis.min) && isNumber(yAxis.max) &&\n                        (!checkX || (isNumber(xAxis.min) && isNumber(xAxis.max)));\n                },\n\n                /**\n                 * If implemented in the core, parts of this can probably be shared with other similar\n                 * methods in Highcharts.\n                 */\n                destroyGraphics: function() {\n                    var series = this,\n                        points = this.points,\n                        point,\n                        i;\n\n                    if (points) {\n                        for (i = 0; i < points.length; i = i + 1) {\n                            point = points[i];\n                            if (point && point.graphic) {\n                                point.graphic = point.graphic.destroy();\n                            }\n                        }\n                    }\n\n                    each(['graph', 'area', 'tracker'], function(prop) {\n                        if (series[prop]) {\n                            series[prop] = series[prop].destroy();\n                        }\n                    });\n                },\n\n                /**\n                 * Create a hidden canvas to draw the graph on. The contents is later copied over \n                 * to an SVG image element.\n                 */\n                getContext: function() {\n                    var chart = this.chart,\n                        width = chart.chartWidth,\n                        height = chart.chartHeight,\n                        targetGroup = this.group,\n                        target = this,\n                        ctx,\n                        swapXY = function(proceed, x, y, a, b, c, d) {\n                            proceed.call(this, y, x, a, b, c, d);\n                        };\n\n                    if (isChartSeriesBoosting(chart)) {\n                        target = chart;\n                        targetGroup = chart.seriesGroup;\n                    }\n\n                    ctx = target.ctx;\n\n                    if (!target.canvas) {\n                        target.canvas = doc.createElement('canvas');\n\n                        target.image = chart.renderer.image(\n                            '',\n                            0,\n                            0,\n                            width,\n                            height\n                        ).add(targetGroup);\n\n                        target.ctx = ctx = target.canvas.getContext('2d');\n\n                        if (chart.inverted) {\n                            each(['moveTo', 'lineTo', 'rect', 'arc'], function(fn) {\n                                wrap(ctx, fn, swapXY);\n                            });\n                        }\n\n                        target.boostClipRect = chart.renderer.clipRect(\n                            chart.plotLeft,\n                            chart.plotTop,\n                            chart.plotWidth,\n                            chart.chartHeight\n                        );\n\n                        target.image.clip(target.boostClipRect);\n\n                    } else if (!(target instanceof H.Chart)) {\n                        //ctx.clearRect(0, 0, width, height);\n                    }\n\n                    if (target.canvas.width !== width) {\n                        target.canvas.width = width;\n                    }\n\n                    if (target.canvas.height !== height) {\n                        target.canvas.height = height;\n                    }\n\n                    target.image.attr({\n                        x: 0,\n                        y: 0,\n                        width: width,\n                        height: height,\n                        style: 'pointer-events: none'\n                    });\n\n                    target.boostClipRect.attr({\n                        x: 0,\n                        y: 0,\n                        width: chart.plotWidth,\n                        height: chart.chartHeight\n                    });\n\n                    return ctx;\n                },\n\n                /** \n                 * Draw the canvas image inside an SVG image\n                 */\n                canvasToSVG: function() {\n                    if (!isChartSeriesBoosting(this.chart)) {\n                        this.image.attr({\n                            href: this.canvas.toDataURL('image/png')\n                        });\n                    } else if (this.image) {\n                        this.image.attr({\n                            href: ''\n                        });\n                    }\n                },\n\n                cvsLineTo: function(ctx, clientX, plotY) {\n                    ctx.lineTo(clientX, plotY);\n                },\n\n                renderCanvas: function() {\n                    var series = this,\n                        options = series.options,\n                        chart = series.chart,\n                        xAxis = this.xAxis,\n                        yAxis = this.yAxis,\n                        activeBoostSettings = chart.options.boost || {},\n                        boostSettings = {\n                            timeRendering: activeBoostSettings.timeRendering || false,\n                            timeSeriesProcessing: activeBoostSettings.timeSeriesProcessing || false,\n                            timeSetup: activeBoostSettings.timeSetup || false\n                        },\n                        ctx,\n                        c = 0,\n                        xData = series.processedXData,\n                        yData = series.processedYData,\n                        rawData = options.data,\n                        xExtremes = xAxis.getExtremes(),\n                        xMin = xExtremes.min,\n                        xMax = xExtremes.max,\n                        yExtremes = yAxis.getExtremes(),\n                        yMin = yExtremes.min,\n                        yMax = yExtremes.max,\n                        pointTaken = {},\n                        lastClientX,\n                        sampling = !!series.sampling,\n                        points,\n                        r = options.marker && options.marker.radius,\n                        cvsDrawPoint = this.cvsDrawPoint,\n                        cvsLineTo = options.lineWidth ? this.cvsLineTo : false,\n                        cvsMarker = r && r <= 1 ?\n                        this.cvsMarkerSquare :\n                        this.cvsMarkerCircle,\n                        strokeBatch = this.cvsStrokeBatch || 1000,\n                        enableMouseTracking = options.enableMouseTracking !== false,\n                        lastPoint,\n                        threshold = options.threshold,\n                        yBottom = yAxis.getThreshold(threshold),\n                        hasThreshold = isNumber(threshold),\n                        translatedThreshold = yBottom,\n                        doFill = this.fill,\n                        isRange = series.pointArrayMap && series.pointArrayMap.join(',') === 'low,high',\n                        isStacked = !!options.stacking,\n                        cropStart = series.cropStart || 0,\n                        loadingOptions = chart.options.loading,\n                        requireSorting = series.requireSorting,\n                        wasNull,\n                        connectNulls = options.connectNulls,\n                        useRaw = !xData,\n                        minVal,\n                        maxVal,\n                        minI,\n                        maxI,\n                        kdIndex,\n                        sdata = isStacked ? series.data : (xData || rawData),\n                        fillColor = series.fillOpacity ?\n                        new Color(series.color).setOpacity(pick(options.fillOpacity, 0.75)).get() :\n                        series.color,\n\n                        stroke = function() {\n                            if (doFill) {\n                                ctx.fillStyle = fillColor;\n                                ctx.fill();\n                            } else {\n                                ctx.strokeStyle = series.color;\n                                ctx.lineWidth = options.lineWidth;\n                                ctx.stroke();\n                            }\n                        },\n\n                        drawPoint = function(clientX, plotY, yBottom, i) {\n                            if (c === 0) {\n                                ctx.beginPath();\n\n                                if (cvsLineTo) {\n                                    ctx.lineJoin = 'round';\n                                }\n                            }\n\n                            if (chart.scroller && series.options.className === 'highcharts-navigator-series') {\n                                plotY += chart.scroller.top;\n                                if (yBottom) {\n                                    yBottom += chart.scroller.top;\n                                }\n                            } else {\n                                plotY += chart.plotTop;\n                            }\n\n                            clientX += chart.plotLeft;\n\n                            if (wasNull) {\n                                ctx.moveTo(clientX, plotY);\n                            } else {\n                                if (cvsDrawPoint) {\n                                    cvsDrawPoint(ctx, clientX, plotY, yBottom, lastPoint);\n                                } else if (cvsLineTo) {\n                                    cvsLineTo(ctx, clientX, plotY);\n                                } else if (cvsMarker) {\n                                    cvsMarker.call(series, ctx, clientX, plotY, r, i);\n                                }\n                            }\n\n                            // We need to stroke the line for every 1000 pixels. It will crash the browser\n                            // memory use if we stroke too infrequently.\n                            c = c + 1;\n                            if (c === strokeBatch) {\n                                stroke();\n                                c = 0;\n                            }\n\n                            // Area charts need to keep track of the last point\n                            lastPoint = {\n                                clientX: clientX,\n                                plotY: plotY,\n                                yBottom: yBottom\n                            };\n                        },\n\n                        addKDPoint = function(clientX, plotY, i) {\n                            // Avoid more string concatination than required\n                            kdIndex = clientX + ',' + plotY;\n\n                            // The k-d tree requires series points. Reduce the amount of points, since the time to build the \n                            // tree increases exponentially.\n                            if (enableMouseTracking && !pointTaken[kdIndex]) {\n                                pointTaken[kdIndex] = true;\n\n                                if (chart.inverted) {\n                                    clientX = xAxis.len - clientX;\n                                    plotY = yAxis.len - plotY;\n                                }\n\n                                points.push({\n                                    clientX: clientX,\n                                    plotX: clientX,\n                                    plotY: plotY,\n                                    i: cropStart + i\n                                });\n                            }\n                        };\n\n                    // If we are zooming out from SVG mode, destroy the graphics\n                    if (this.points || this.graph) {\n                        this.destroyGraphics();\n                    }\n\n                    // The group\n                    series.plotGroup(\n                        'group',\n                        'series',\n                        series.visible ? 'visible' : 'hidden',\n                        options.zIndex,\n                        chart.seriesGroup\n                    );\n\n                    series.markerGroup = series.group;\n                    // addEvent(series, 'destroy', function () {\n                    // \tseries.markerGroup = null;\n                    // });\n\n                    points = this.points = [];\n                    ctx = this.getContext();\n                    series.buildKDTree = noop; // Do not start building while drawing \n\n                    // Display a loading indicator\n                    if (rawData.length > 99999) {\n                        chart.options.loading = merge(loadingOptions, {\n                            labelStyle: {\n                                backgroundColor: H.color('#ffffff').setOpacity(0.75).get(),\n                                padding: '1em',\n                                borderRadius: '0.5em'\n                            },\n                            style: {\n                                backgroundColor: 'none',\n                                opacity: 1\n                            }\n                        });\n                        clearTimeout(destroyLoadingDiv);\n                        chart.showLoading('Drawing...');\n                        chart.options.loading = loadingOptions; // reset\n                    }\n\n                    if (boostSettings.timeRendering) {\n                        console.time('canvas rendering'); // eslint-disable-line no-console\n                    }\n\n                    // Loop over the points\n                    eachAsync(sdata, function(d, i) {\n                        var x,\n                            y,\n                            clientX,\n                            plotY,\n                            isNull,\n                            low,\n                            isNextInside = false,\n                            isPrevInside = false,\n                            nx = false,\n                            px = false,\n                            chartDestroyed = typeof chart.index === 'undefined',\n                            isYInside = true;\n\n                        if (!chartDestroyed) {\n                            if (useRaw) {\n                                x = d[0];\n                                y = d[1];\n\n                                if (sdata[i + 1]) {\n                                    nx = sdata[i + 1][0];\n                                }\n\n                                if (sdata[i - 1]) {\n                                    px = sdata[i - 1][0];\n                                }\n                            } else {\n                                x = d;\n                                y = yData[i];\n\n                                if (sdata[i + 1]) {\n                                    nx = sdata[i + 1];\n                                }\n\n                                if (sdata[i - 1]) {\n                                    px = sdata[i - 1];\n                                }\n                            }\n\n                            if (nx && nx >= xMin && nx <= xMax) {\n                                isNextInside = true;\n                            }\n\n                            if (px && px >= xMin && px <= xMax) {\n                                isPrevInside = true;\n                            }\n\n                            // Resolve low and high for range series\n                            if (isRange) {\n                                if (useRaw) {\n                                    y = d.slice(1, 3);\n                                }\n                                low = y[0];\n                                y = y[1];\n                            } else if (isStacked) {\n                                x = d.x;\n                                y = d.stackY;\n                                low = y - d.y;\n                            }\n\n                            isNull = y === null;\n\n                            // Optimize for scatter zooming\n                            if (!requireSorting) {\n                                isYInside = y >= yMin && y <= yMax;\n                            }\n\n                            if (!isNull &&\n                                (\n                                    (x >= xMin && x <= xMax && isYInside) ||\n                                    (isNextInside || isPrevInside)\n                                )) {\n\n\n                                clientX = Math.round(xAxis.toPixels(x, true));\n\n                                if (sampling) {\n                                    if (minI === undefined || clientX === lastClientX) {\n                                        if (!isRange) {\n                                            low = y;\n                                        }\n                                        if (maxI === undefined || y > maxVal) {\n                                            maxVal = y;\n                                            maxI = i;\n                                        }\n                                        if (minI === undefined || low < minVal) {\n                                            minVal = low;\n                                            minI = i;\n                                        }\n\n                                    }\n                                    if (clientX !== lastClientX) { // Add points and reset\n                                        if (minI !== undefined) { // then maxI is also a number\n                                            plotY = yAxis.toPixels(maxVal, true);\n                                            yBottom = yAxis.toPixels(minVal, true);\n                                            drawPoint(\n                                                clientX,\n                                                hasThreshold ? Math.min(plotY, translatedThreshold) : plotY,\n                                                hasThreshold ? Math.max(yBottom, translatedThreshold) : yBottom,\n                                                i\n                                            );\n                                            addKDPoint(clientX, plotY, maxI);\n                                            if (yBottom !== plotY) {\n                                                addKDPoint(clientX, yBottom, minI);\n                                            }\n                                        }\n\n                                        minI = maxI = undefined;\n                                        lastClientX = clientX;\n                                    }\n                                } else {\n                                    plotY = Math.round(yAxis.toPixels(y, true));\n                                    drawPoint(clientX, plotY, yBottom, i);\n                                    addKDPoint(clientX, plotY, i);\n                                }\n                            }\n                            wasNull = isNull && !connectNulls;\n\n                            if (i % CHUNK_SIZE === 0) {\n                                series.canvasToSVG();\n                            }\n                        }\n\n                        return !chartDestroyed;\n                    }, function() {\n                        var loadingDiv = chart.loadingDiv,\n                            loadingShown = chart.loadingShown;\n                        stroke();\n                        series.canvasToSVG();\n\n                        if (boostSettings.timeRendering) {\n                            console.timeEnd('canvas rendering'); // eslint-disable-line no-console\n                        }\n\n                        fireEvent(series, 'renderedCanvas');\n\n                        // Do not use chart.hideLoading, as it runs JS animation and will be blocked by buildKDTree.\n                        // CSS animation looks good, but then it must be deleted in timeout. If we add the module to core,\n                        // change hideLoading so we can skip this block.\n                        if (loadingShown) {\n                            extend(loadingDiv.style, {\n                                transition: 'opacity 250ms',\n                                opacity: 0\n                            });\n                            chart.loadingShown = false;\n                            destroyLoadingDiv = setTimeout(function() {\n                                if (loadingDiv.parentNode) { // In exporting it is falsy\n                                    loadingDiv.parentNode.removeChild(loadingDiv);\n                                }\n                                chart.loadingDiv = chart.loadingSpan = null;\n                            }, 250);\n                        }\n\n                        // Pass tests in Pointer. \n                        // Replace this with a single property, and replace when zooming in\n                        // below boostThreshold.\n                        series.directTouch = false;\n                        series.options.stickyTracking = true;\n\n                        delete series.buildKDTree; // Go back to prototype, ready to build\n                        series.buildKDTree();\n\n                        // Don't do async on export, the exportChart, getSVGForExport and getSVG methods are not chained for it.\n                    }, chart.renderer.forExport ? Number.MAX_VALUE : undefined);\n                }\n            });\n\n            wrap(Series.prototype, 'setData', function(proceed) {\n                if (!this.hasExtremes || !this.hasExtremes(true) || this.type === 'heatmap') {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n            });\n\n            wrap(Series.prototype, 'processData', function(proceed) {\n                if (!this.hasExtremes || !this.hasExtremes(true) || this.type === 'heatmap') {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n            });\n\n            seriesTypes.scatter.prototype.cvsMarkerCircle = function(ctx, clientX, plotY, r) {\n                ctx.moveTo(clientX, plotY);\n                ctx.arc(clientX, plotY, r, 0, 2 * Math.PI, false);\n            };\n\n            // Rect is twice as fast as arc, should be used for small markers\n            seriesTypes.scatter.prototype.cvsMarkerSquare = function(ctx, clientX, plotY, r) {\n                ctx.rect(clientX - r, plotY - r, r * 2, r * 2);\n            };\n            seriesTypes.scatter.prototype.fill = true;\n\n            if (seriesTypes.bubble) {\n                seriesTypes.bubble.prototype.cvsMarkerCircle = function(ctx, clientX, plotY, r, i) {\n                    ctx.moveTo(clientX, plotY);\n                    ctx.arc(clientX, plotY, this.radii && this.radii[i], 0, 2 * Math.PI, false);\n                };\n                seriesTypes.bubble.prototype.cvsStrokeBatch = 1;\n            }\n\n            extend(seriesTypes.area.prototype, {\n                cvsDrawPoint: function(ctx, clientX, plotY, yBottom, lastPoint) {\n                    if (lastPoint && clientX !== lastPoint.clientX) {\n                        ctx.moveTo(lastPoint.clientX, lastPoint.yBottom);\n                        ctx.lineTo(lastPoint.clientX, lastPoint.plotY);\n                        ctx.lineTo(clientX, plotY);\n                        ctx.lineTo(clientX, yBottom);\n                    }\n                },\n                fill: true,\n                fillOpacity: true,\n                sampling: true\n            });\n\n            extend(seriesTypes.column.prototype, {\n                cvsDrawPoint: function(ctx, clientX, plotY, yBottom) {\n                    ctx.rect(clientX - 1, plotY, 1, yBottom - plotY);\n                },\n                fill: true,\n                sampling: true\n            });\n\n            H.Chart.prototype.callbacks.push(function(chart) {\n                function canvasToSVG() {\n                    if (chart.image && chart.canvas) {\n                        chart.image.attr({\n                            href: chart.canvas.toDataURL('image/png')\n                        });\n                    }\n                }\n\n                function clear() {\n                    if (chart.image) {\n                        chart.image.attr({\n                            href: ''\n                        });\n                    }\n\n                    if (chart.canvas) {\n                        chart.canvas.getContext('2d').clearRect(\n                            0,\n                            0,\n                            chart.canvas.width,\n                            chart.canvas.height\n                        );\n                    }\n                }\n\n                addEvent(chart, 'predraw', clear);\n                addEvent(chart, 'render', canvasToSVG);\n            });\n        };\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/boost.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Boost module\n\n (c) 2010-2017 Highsoft AS\n Author: Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(x){\"object\"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(h){function x(){var a=Array.prototype.slice.call(arguments),c=-Number.MAX_VALUE;C(a,function(a){if(\"undefined\"!==typeof a&&\"undefined\"!==typeof a.length&&0<a.length)return c=a.length,!0});return c}function z(a){var c=0,d;if(1<a.series.length)for(var f=0;f<a.series.length;f++)d=a.series[f],x(d.processedXData,d.options.data,d.points)>=(d.options.boostThreshold||Number.MAX_VALUE)&&c++;return 5<\nc||a.series.length>=G(a.options.boost&&a.options.boost.seriesThreshold,50)}function A(a){return z(a.chart)||x(a.processedXData,a.options.data,a.points)>=(a.options.boostThreshold||Number.MAX_VALUE)}function fa(a){function c(b,c){c=a.createShader(\"vertex\"===c?a.VERTEX_SHADER:a.FRAGMENT_SHADER);a.shaderSource(c,b);a.compileShader(c);return a.getShaderParameter(c,a.COMPILE_STATUS)?c:!1}function d(){function d(b){return a.getUniformLocation(l,b)}var f=c(\"#version 100\\nprecision highp float;\\nattribute vec4 aVertexPosition;\\nattribute vec4 aColor;\\nvarying highp vec2 position;\\nvarying highp vec4 vColor;\\nuniform mat4 uPMatrix;\\nuniform float pSize;\\nuniform float translatedThreshold;\\nuniform bool hasThreshold;\\nuniform bool skipTranslation;\\nuniform float xAxisTrans;\\nuniform float xAxisMin;\\nuniform float xAxisMinPad;\\nuniform float xAxisPointRange;\\nuniform float xAxisLen;\\nuniform bool  xAxisPostTranslate;\\nuniform float xAxisOrdinalSlope;\\nuniform float xAxisOrdinalOffset;\\nuniform float xAxisPos;\\nuniform bool  xAxisCVSCoord;\\nuniform float yAxisTrans;\\nuniform float yAxisMin;\\nuniform float yAxisMinPad;\\nuniform float yAxisPointRange;\\nuniform float yAxisLen;\\nuniform bool  yAxisPostTranslate;\\nuniform float yAxisOrdinalSlope;\\nuniform float yAxisOrdinalOffset;\\nuniform float yAxisPos;\\nuniform bool  yAxisCVSCoord;\\nuniform bool  isBubble;\\nuniform bool  bubbleSizeByArea;\\nuniform float bubbleZMin;\\nuniform float bubbleZMax;\\nuniform float bubbleZThreshold;\\nuniform float bubbleMinSize;\\nuniform float bubbleMaxSize;\\nuniform bool  bubbleSizeAbs;\\nuniform bool  isInverted;\\nfloat bubbleRadius(){\\nfloat value \\x3d aVertexPosition.w;\\nfloat zMax \\x3d bubbleZMax;\\nfloat zMin \\x3d bubbleZMin;\\nfloat radius \\x3d 0.0;\\nfloat pos \\x3d 0.0;\\nfloat zRange \\x3d zMax - zMin;\\nif (bubbleSizeAbs){\\nvalue \\x3d value - bubbleZThreshold;\\nzMax \\x3d max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);\\nzMin \\x3d 0.0;\\n}\\nif (value \\x3c zMin){\\nradius \\x3d bubbleZMin / 2.0 - 1.0;\\n} else {\\npos \\x3d zRange \\x3e 0.0 ? (value - zMin) / zRange : 0.5;\\nif (bubbleSizeByArea \\x26\\x26 pos \\x3e 0.0){\\npos \\x3d sqrt(pos);\\n}\\nradius \\x3d ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;\\n}\\nreturn radius * 2.0;\\n}\\nfloat translate(float val,\\nfloat pointPlacement,\\nfloat localA,\\nfloat localMin,\\nfloat minPixelPadding,\\nfloat pointRange,\\nfloat len,\\nbool  cvsCoord\\n){\\nfloat sign \\x3d 1.0;\\nfloat cvsOffset \\x3d 0.0;\\nif (cvsCoord) {\\nsign *\\x3d -1.0;\\ncvsOffset \\x3d len;\\n}\\nreturn sign * (val - localMin) * localA + cvsOffset + \\n(sign * minPixelPadding);\\n}\\nfloat xToPixels(float value){\\nif (skipTranslation){\\nreturn value;// + xAxisPos;\\n}\\nreturn translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord);// + xAxisPos;\\n}\\nfloat yToPixels(float value, float checkTreshold){\\nfloat v;\\nif (skipTranslation){\\nv \\x3d value;// + yAxisPos;\\n} else {\\nv \\x3d translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord);// + yAxisPos;\\n}\\nif (checkTreshold \\x3e 0.0 \\x26\\x26 hasThreshold) {\\nv \\x3d min(v, translatedThreshold);\\n}\\nreturn v;\\n}\\nvoid main(void) {\\nif (isBubble){\\ngl_PointSize \\x3d bubbleRadius();\\n} else {\\ngl_PointSize \\x3d pSize;\\n}\\nvColor \\x3d aColor;\\nif (isInverted) {\\ngl_Position \\x3d uPMatrix * vec4(xToPixels(aVertexPosition.y) + yAxisPos, yToPixels(aVertexPosition.x, aVertexPosition.z) + xAxisPos, 0.0, 1.0);\\n} else {\\ngl_Position \\x3d uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);\\n}\\n}\",\n\"vertex\"),e=c(\"precision highp float;\\nuniform vec4 fillColor;\\nvarying highp vec2 position;\\nvarying highp vec4 vColor;\\nuniform sampler2D uSampler;\\nuniform bool isCircle;\\nuniform bool hasColor;\\nvoid main(void) {\\nvec4 col \\x3d fillColor;\\nif (hasColor) {\\ncol \\x3d vColor;\\n}\\nif (isCircle) {\\ngl_FragColor \\x3d col * texture2D(uSampler, gl_PointCoord.st);\\n} else {\\ngl_FragColor \\x3d col;\\n}\\n}\",\"fragment\");if(!f||!e)return l=!1;l=a.createProgram();a.attachShader(l,f);a.attachShader(l,e);a.linkProgram(l);\na.useProgram(l);a.bindAttribLocation(l,0,\"aVertexPosition\");h=d(\"uPMatrix\");n=d(\"pSize\");J=d(\"fillColor\");H=d(\"isBubble\");k=d(\"bubbleSizeAbs\");t=d(\"bubbleSizeByArea\");B=d(\"uSampler\");b=d(\"skipTranslation\");q=d(\"isCircle\");g=d(\"isInverted\");return!0}function f(b,c){b=e[b]=e[b]||a.getUniformLocation(l,b);a.uniform1f(b,c)}var e={},l,h,n,J,H,k,t,b,q,g,B;a&&d();return{psUniform:function(){return n},pUniform:function(){return h},fillColorUniform:function(){return J},setBubbleUniforms:function(b,c,d){var e=\nb.options,l=Number.MAX_VALUE,h=-Number.MAX_VALUE;\"bubble\"===b.type&&(l=G(e.zMin,Math.min(l,Math.max(c,!1===e.displayNegative?e.zThreshold:-Number.MAX_VALUE))),h=G(e.zMax,Math.max(h,d)),a.uniform1i(H,1),a.uniform1i(q,1),a.uniform1i(t,\"width\"!==b.options.sizeBy),a.uniform1i(k,b.options.sizeByAbsoluteValue),f(\"bubbleZMin\",l),f(\"bubbleZMax\",h),f(\"bubbleZThreshold\",b.options.zThreshold),f(\"bubbleMinSize\",b.minPxSize),f(\"bubbleMaxSize\",b.maxPxSize))},bind:function(){a.useProgram(l)},program:function(){return l},\ncreate:d,setUniform:f,setPMatrix:function(b){a.uniformMatrix4fv(h,!1,b)},setColor:function(b){a.uniform4f(J,b[0]/255,b[1]/255,b[2]/255,b[3])},setPointSize:function(b){a.uniform1f(n,b)},setSkipTranslation:function(c){a.uniform1i(b,!0===c?1:0)},setTexture:function(){a.uniform1i(B,0)},setDrawAsCircle:function(b){a.uniform1i(q,b?1:0)},reset:function(){a.uniform1i(H,0);a.uniform1i(q,0)},setInverted:function(b){a.uniform1i(g,b)},destroy:function(){a&&l&&a.deleteProgram(l)}}}function X(a,c,d){var f=!1,e=\n!1,l=d||2,h=!1,n=0,g;return{destroy:function(){f&&a.deleteBuffer(f)},bind:function(){if(!f)return!1;a.vertexAttribPointer(e,l,a.FLOAT,!1,0,0)},data:g,build:function(d,k,t){g=d||[];if(!(g&&0!==g.length||h))return f=!1;l=t||l;f&&a.deleteBuffer(f);f=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,f);a.bufferData(a.ARRAY_BUFFER,h||new Float32Array(g),a.STATIC_DRAW);e=a.getAttribLocation(c.program(),k);a.enableVertexAttribArray(e);return!0},render:function(c,d,e){var b=h?h.length:g.length;if(!f||!b)return!1;\nif(!c||c>b||0>c)c=0;if(!d||d>b)d=b;a.drawArrays(a[(e||\"points\").toUpperCase()],c/l,(d-c)/l);return!0},allocate:function(a){n=-1;h=new Float32Array(4*a)},push:function(a,c,d,b){h&&(h[++n]=a,h[++n]=c,h[++n]=d,h[++n]=b)}}}function ga(a){function c(a){var b,c;return A(a)?(b=!!a.options.stacking,c=a.xData||a.options.xData||a.processedXData,b=(b?a.data:c||a.options.data).length,\"treemap\"===a.type?b*=12:\"heatmap\"===a.type?b*=6:N[a.type]&&(b*=2),b):0}function d(){b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)}\nfunction f(a,b){function c(a){a&&(b.colorData.push(a[0]),b.colorData.push(a[1]),b.colorData.push(a[2]),b.colorData.push(a[3]))}function d(a,b,d,e,f){c(f);r.usePreallocated?t.push(a,b,d?1:0,e||1):(B.push(a),B.push(b),B.push(d?1:0),B.push(e||1))}function e(a,b,e,f,v){c(v);d(a+e,b);c(v);d(a,b);c(v);d(a,b+f);c(v);d(a,b+f);c(v);d(a+e,b+f);c(v);d(a+e,b)}function f(a){r.useGPUTranslations||(b.skipTranslation=!0,a.x=A.toPixels(a.x,!0),a.y=F.toPixels(a.y,!0));d(a.x,a.y,0,2)}var v=a.pointArrayMap&&\"low,high\"===\na.pointArrayMap.join(\",\"),k=a.chart,m=a.options,l=!!m.stacking,g=m.data,n=a.xAxis.getExtremes(),q=n.min,u=n.max,n=a.yAxis.getExtremes(),w=n.min,z=n.max,n=a.xData||m.xData||a.processedXData,x=a.yData||m.yData||a.processedYData,p=a.zData||m.zData||a.processedZData,F=a.yAxis,A=a.xAxis,E=!n||0===n.length,y=a.points||!1,J=!1,H,K,L,I=l?a.data:n||g,D={x:Number.MIN_VALUE,y:0},R={x:Number.MIN_VALUE,y:0};m.boostData&&0<m.boostData.length||(a.closestPointRangePx=Number.MAX_VALUE,y&&0<y.length?(b.skipTranslation=\n!0,b.drawMode=\"triangles\",y[0].node&&y[0].node.levelDynamic&&y.sort(function(a,b){if(a.node){if(a.node.levelDynamic>b.node.levelDynamic)return 1;if(a.node.levelDynamic<b.node.levelDynamic)return-1}return 0}),C(y,function(b){var c=b.plotY,d;void 0===c||isNaN(c)||null===b.y||(c=b.shapeArgs,d=b.series.pointAttribs(b),b=d[\"stroke-width\"]||0,K=h.color(d.fill).rgba,K[0]/=255,K[1]/=255,K[2]/=255,\"treemap\"===a.type&&(b=b||1,L=h.color(d.stroke).rgba,L[0]/=255,L[1]/=255,L[2]/=255,e(c.x,c.y,c.width,c.height,\nL),b/=2),e(c.x+b,c.y+b,c.width-2*b,c.height-2*b,K))})):(C(I,function(c,e){var f,m,h,n=!1,P=!1,g=!1,Y=!1,ha=N[a.type],t=!1,y=!0;if(\"undefined\"===typeof k.index)return!1;E?(f=c[0],m=c[1],I[e+1]&&(P=I[e+1][0]),I[e-1]&&(n=I[e-1][0]),3<=c.length&&(h=c[2],c[2]>b.zMax&&(b.zMax=c[2]),c[2]<b.zMin&&(b.zMin=c[2]))):(f=c,m=x[e],I[e+1]&&(P=I[e+1]),I[e-1]&&(n=I[e-1]),p&&p.length&&(h=p[e],p[e]>b.zMax&&(b.zMax=p[e]),p[e]<b.zMin&&(b.zMin=p[e])));P&&P>=q&&P<=u&&(g=!0);n&&n>=q&&n<=u&&(Y=!0);v?(E&&(m=c.slice(1,3)),m=\nm[1]):l&&(f=c.x,m=c.stackY);a.requireSorting||(y=m>=w&&m<=z);f>u&&R.x<u&&(R.x=f,R.y=m);f<q&&D.x<q&&(D.x=f,D.y=m);if(0===m||m&&y)if(f>=q&&f<=u&&(t=!0),t||g||Y)r.useGPUTranslations||(b.skipTranslation=!0,f=A.toPixels(f,!0),m=F.toPixels(m,!0)),ha&&(H=0,0>m&&(H=m,m=0),r.useGPUTranslations||(H=F.toPixels(H,!0)),d(f,H,0,0,!1)),b.hasMarkers&&!1!==J&&(a.closestPointRangePx=Math.min(a.closestPointRangePx,Math.abs(f-J))),d(f,m,0,\"bubble\"===a.type?h||1:2,!1),J=f}),J||(f(D),f(R))))}function e(){u=[];y.data=B=\n[];p=[]}function l(a){k&&(k.setUniform(\"xAxisTrans\",a.transA),k.setUniform(\"xAxisMin\",a.min),k.setUniform(\"xAxisMinPad\",a.minPixelPadding),k.setUniform(\"xAxisPointRange\",a.pointRange),k.setUniform(\"xAxisLen\",a.len),k.setUniform(\"xAxisPos\",a.pos),k.setUniform(\"xAxisCVSCoord\",!a.horiz))}function g(a){k&&(k.setUniform(\"yAxisTrans\",a.transA),k.setUniform(\"yAxisMin\",a.min),k.setUniform(\"yAxisMinPad\",a.minPixelPadding),k.setUniform(\"yAxisPointRange\",a.pointRange),k.setUniform(\"yAxisLen\",a.len),k.setUniform(\"yAxisPos\",\na.pos),k.setUniform(\"yAxisCVSCoord\",!a.horiz))}function n(a,b){k.setUniform(\"hasThreshold\",a);k.setUniform(\"translatedThreshold\",b)}function w(c){if(c)q=c.chartWidth||800,F=c.chartHeight||400;else return!1;if(!b||!q||!F)return!1;r.timeRendering&&console.time(\"gl rendering\");k.bind();b.viewport(0,0,q,F);k.setPMatrix([2/q,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1]);1<r.lineWidth&&!h.isMS&&b.lineWidth(r.lineWidth);t.build(y.data,\"aVertexPosition\",4);t.bind();x&&(b.bindTexture(b.TEXTURE_2D,D),k.setTexture(D));\nk.setInverted(c.options.chart?c.options.chart.inverted:!1);C(u,function(a,c){var d=a.series.options,e=d.threshold,f=Q(e),e=a.series.yAxis.getThreshold(e),m=G(d.marker?d.marker.enabled:null,a.series.xAxis.isRadial?!0:null,a.series.closestPointRangePx>2*((d.marker?d.marker.radius:10)||10)),v=a.series.fillOpacity?(new Z(a.series.color)).setOpacity(G(d.fillOpacity,.85)).get():a.series.color;t.bind();d.colorByPoint&&(v=a.series.chart.options.colors[c]);v=h.color(v).rgba;r.useAlpha||(v[3]=1);\"add\"===d.boostBlending?\n(b.blendFunc(b.SRC_ALPHA,b.ONE),b.blendEquation(b.FUNC_ADD)):\"mult\"===d.boostBlending?b.blendFunc(b.DST_COLOR,b.ZERO):\"darken\"===d.boostBlending?(b.blendFunc(b.ONE,b.ONE),b.blendEquation(b.FUNC_MIN)):b.blendFuncSeparate(b.SRC_ALPHA,b.ONE_MINUS_SRC_ALPHA,b.ONE,b.ONE_MINUS_SRC_ALPHA);k.reset();0<a.colorData.length&&(k.setUniform(\"hasColor\",1),c=X(b,k),c.build(a.colorData,\"aColor\",4),c.bind());k.setColor(v);l(a.series.xAxis);g(a.series.yAxis);n(f,e);\"points\"===a.drawMode&&(d.marker&&d.marker.radius?\nk.setPointSize(2*d.marker.radius):k.setPointSize(1));k.setSkipTranslation(a.skipTranslation);\"bubble\"===a.series.type&&k.setBubbleUniforms(a.series,a.zMin,a.zMax);k.setDrawAsCircle(ia[a.series.type]&&x||!1);t.render(a.from,a.to,a.drawMode);a.hasMarkers&&m&&(d.marker&&d.marker.radius?k.setPointSize(2*d.marker.radius):k.setPointSize(10),k.setDrawAsCircle(!0),t.render(a.from,a.to,\"POINTS\"))});t.destroy();r.timeRendering&&console.timeEnd(\"gl rendering\");e();a&&a()}function z(a){d();if(a.renderer.forExport)return w(a);\nE?w(a):setTimeout(function(){z(a)},1)}var k=!1,t=!1,b=!1,q=0,F=0,B=!1,p=!1,x=!1,y={},E=!1,u=[],M=U.createElement(\"canvas\"),O=M.getContext(\"2d\"),D,N={column:!0,area:!0},ia={scatter:!0,bubble:!0},r={pointSize:1,lineWidth:3,fillColor:\"#AA00AA\",useAlpha:!0,usePreallocated:!1,useGPUTranslations:!1,timeRendering:!1,timeSeriesProcessing:!1,timeSetup:!1};return y={allocateBufferForSingleSeries:function(a){var b=0;r.usePreallocated&&(A(a)&&(b=c(a)),t.allocate(b))},pushSeries:function(a){0<u.length&&(u[u.length-\n1].to=B.length,u[u.length-1].hasMarkers&&(u[u.length-1].markerTo=p.length));r.timeSeriesProcessing&&console.time(\"building \"+a.type+\" series\");u.push({from:B.length,markerFrom:p.length,colorData:[],series:a,zMin:Number.MAX_VALUE,zMax:-Number.MAX_VALUE,hasMarkers:a.options.marker?!1!==a.options.marker.enabled:!1,showMarksers:!0,drawMode:{area:\"lines\",arearange:\"lines\",areaspline:\"line_strip\",column:\"lines\",line:\"line_strip\",scatter:\"points\",heatmap:\"triangles\",treemap:\"triangles\",bubble:\"points\"}[a.type]||\n\"line_strip\"});f(a,u[u.length-1]);r.timeSeriesProcessing&&console.timeEnd(\"building \"+a.type+\" series\")},setSize:function(a,b){if(q!==a||b!==b)q=a,F=b,k.bind(),k.setPMatrix([2/q,0,0,0,0,-(2/F),0,0,0,0,-2,0,-1,1,-1,1])},inited:function(){return E},setThreshold:n,init:function(a,c){var d=0,f=[\"webgl\",\"experimental-webgl\",\"moz-webgl\",\"webkit-3d\"];E=!1;if(!a)return!1;for(r.timeSetup&&console.time(\"gl setup\");d<f.length&&!(b=a.getContext(f[d]));d++);if(b)c||e();else return!1;b.enable(b.BLEND);b.blendFunc(b.SRC_ALPHA,\nb.ONE_MINUS_SRC_ALPHA);b.disable(b.DEPTH_TEST);b.depthMask(b.FALSE);k=fa(b);t=X(b,k);x=!1;D=b.createTexture();M.width=512;M.height=512;O.fillStyle=\"#FFF\";O.beginPath();O.arc(256,256,256,0,2*Math.PI);O.fill();try{b.bindTexture(b.TEXTURE_2D,D),b.texImage2D(b.TEXTURE_2D,0,b.RGBA,b.RGBA,b.UNSIGNED_BYTE,M),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.LINEAR),b.texParameteri(b.TEXTURE_2D,\nb.TEXTURE_MIN_FILTER,b.LINEAR_MIPMAP_LINEAR),b.generateMipmap(b.TEXTURE_2D),b.bindTexture(b.TEXTURE_2D,null),x=!0}catch(oa){}E=!0;r.timeSetup&&console.timeEnd(\"gl setup\");return!0},render:z,settings:r,valid:function(){return!1!==b},clear:d,flush:e,setXAxis:l,setYAxis:g,data:B,gl:function(){return b},allocateBuffer:function(a){var b=0;r.usePreallocated&&(C(a.series,function(a){A(a)&&(b+=c(a))}),t.allocate(b))},destroy:function(){t.destroy();k.destroy()},setOptions:function(a){ja(!0,r,a)}}}function aa(a,\nc){var d=a.chartWidth,f=a.chartHeight,e=a,l=a.seriesGroup||c.group,g=function(a,d,e,f,h,b,l){a.call(c,e,d,f,h,b,l)},e=z(a)?a:c;e.image||(e.canvas=U.createElement(\"canvas\"),e.image=a.renderer.image(\"\",0,0,d,f).add(l),e.boostClipRect=a.renderer.clipRect(a.plotLeft,a.plotTop,a.plotWidth,a.chartHeight),e.image.clip(e.boostClipRect),e.inverted&&C([\"moveTo\",\"lineTo\",\"rect\",\"arc\"],function(a){w(!1,a,g)}),e instanceof h.Chart&&(e.markerGroup=e.renderer.g().add(l),e.markerGroup.translate(c.xAxis.pos,c.yAxis.pos)));\ne.canvas.width=d;e.canvas.height=f;e.image.attr({x:0,y:0,width:d,height:f,style:\"pointer-events: none\"});e.boostClipRect.attr({x:a.plotLeft,y:a.plotTop,width:a.plotWidth,height:a.chartHeight});e.ogl||(e.ogl=ga(function(){e.image.attr({href:e.canvas.toDataURL(\"image/png\")})}),e.ogl.init(e.canvas),e.ogl.setOptions(a.options.boost||{}),e instanceof h.Chart&&e.ogl.allocateBuffer(a));e.ogl.setSize(d,f);return e.ogl}function ba(a,c,d){a&&c.image&&c.canvas&&!z(d||c.chart)&&a.render(d||c.chart)}function ca(a,\nc){a&&c.image&&c.canvas&&!z(c.chart)&&a.allocateBufferForSingleSeries(c)}function S(a,c,d,f,e,h){e=e||0;f=f||5E4;for(var l=e+f,g=!0;g&&e<l&&e<a.length;)g=c(a[e],e),++e;g&&(e<a.length?h?S(a,c,d,f,e,h):T.requestAnimationFrame?T.requestAnimationFrame(function(){S(a,c,d,f,e)}):setTimeout(function(){S(a,c,d,f,e)}):d&&d())}function ka(a){if(!A(this))return a.call(this);if(a=aa(this.chart,this))ca(a,this),a.pushSeries(this);ba(a,this)}var T=h.win,U=T.document,la=function(){},Z=h.Color,p=h.Series,g=h.seriesTypes,\nC=h.each,da=h.extend,ea=h.addEvent,ma=h.fireEvent,na=h.grep,Q=h.isNumber,ja=h.merge,G=h.pick,w=h.wrap,V=h.getOptions().plotOptions,W;Z.prototype.names={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\",\ncrimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dodgerblue:\"#1e90ff\",feldspar:\"#d19275\",firebrick:\"#b22222\",\nfloralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#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\",lightgrey:\"#d3d3d3\",lightgreen:\"#90ee90\",\nlightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",lightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslateblue:\"#8470ff\",lightslategray:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370d8\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",\nmintcream:\"#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:\"#d87093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",\nsandybrown:\"#f4a460\",seagreen:\"#2e8b57\",seashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",violetred:\"#d02090\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};p.prototype.getPoint=function(a){var c=a,d=this.xData||this.options.xData||this.processedXData||\n!1;!a||a instanceof this.pointClass||(c=(new this.pointClass).init(this,this.options.data[a.i],d?d[a.i]:void 0),c.category=c.x,c.dist=a.dist,c.distX=a.distX,c.plotX=a.plotX,c.plotY=a.plotY,c.index=a.i);return c};w(p.prototype,\"searchPoint\",function(a){return this.getPoint(a.apply(this,[].slice.call(arguments,1)))});w(p.prototype,\"destroy\",function(a){var c=this,d=c.chart;d.markerGroup===c.markerGroup&&(c.markerGroup=null);d.hoverPoints&&(d.hoverPoints=na(d.hoverPoints,function(a){return a.series===\nc}));d.hoverPoint&&d.hoverPoint.series===c&&(d.hoverPoint=null);a.call(this)});w(p.prototype,\"getExtremes\",function(a){if(!A(this)||!this.hasExtremes||!this.hasExtremes())return a.apply(this,Array.prototype.slice.call(arguments,1))});C(\"area arearange column line scatter heatmap bubble treemap heatmap\".split(\" \"),function(a){V[a]&&(V[a].boostThreshold=5E3,V[a].boostData=[])});C([\"translate\",\"generatePoints\",\"drawTracker\",\"drawPoints\",\"render\"],function(a){function c(c){var d=this.options.stacking&&\n(\"translate\"===a||\"generatePoints\"===a);if(!A(this)||d||\"heatmap\"===this.type||\"treemap\"===this.type)\"render\"===a&&this.image&&!z(this.chart)&&(this.image.attr({href:\"\"}),this.animate=null),c.call(this);else if(this[a+\"Canvas\"])this[a+\"Canvas\"]()}w(p.prototype,a,c);\"translate\"===a&&(g.column&&w(g.column.prototype,a,c),g.arearange&&w(g.arearange.prototype,a,c),g.treemap&&w(g.treemap.prototype,a,c))});(function(){var a=0,c,d=[\"webgl\",\"experimental-webgl\",\"moz-webgl\",\"webkit-3d\"],f=!1;if(\"undefined\"!==\ntypeof T.WebGLRenderingContext)for(c=U.createElement(\"canvas\");a<d.length;a++)try{if(f=c.getContext(d[a]),\"undefined\"!==typeof f&&null!==f)return!0}catch(e){}return!1})()?(w(p.prototype,\"processData\",function(a){A(this)&&\"heatmap\"!==this.type&&\"treemap\"!==this.type||a.apply(this,Array.prototype.slice.call(arguments,1));this.hasExtremes&&this.hasExtremes(!0)||a.apply(this,Array.prototype.slice.call(arguments,1))}),h.extend(p.prototype,{pointRange:0,directTouch:!1,allowDG:!1,hasExtremes:function(a){var c=\nthis.options,d=this.xAxis&&this.xAxis.options,f=this.yAxis&&this.yAxis.options;return c.data.length>(c.boostThreshold||Number.MAX_VALUE)&&Q(f.min)&&Q(f.max)&&(!a||Q(d.min)&&Q(d.max))},destroyGraphics:function(){var a=this,c=this.points,d,f;if(c)for(f=0;f<c.length;f+=1)(d=c[f])&&d.graphic&&(d.graphic=d.graphic.destroy());C([\"graph\",\"area\",\"tracker\"],function(c){a[c]&&(a[c]=a[c].destroy())})},renderCanvas:function(){var a=this,c=a.options||{},d=!1,f=a.chart,e=this.xAxis,h=this.yAxis,g=c.xData||a.processedXData,\nn=c.yData||a.processedYData,p=c.data,d=e.getExtremes(),w=d.min,k=d.max,d=h.getExtremes(),t=d.min,b=d.max,q={},x,B=!!a.sampling,A,C=!1!==c.enableMouseTracking,y=h.getThreshold(c.threshold),E=a.pointArrayMap&&\"low,high\"===a.pointArrayMap.join(\",\"),u=!!c.stacking,M=a.cropStart||0,O=a.requireSorting,D=!g,N,G,r,v,m=function(a,b,c){W=a+\",\"+b;C&&!q[W]&&(q[W]=!0,f.inverted&&(a=e.len-a,b=h.len-b),A.push({clientX:a,plotX:a,plotY:b,i:M+c}))},d=aa(f,a);this.visible?((this.points||this.graph)&&this.destroyGraphics(),\nz(f)?this.markerGroup=f.markerGroup:this.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",!0,1,f.seriesGroup),A=this.points=[],a.buildKDTree=la,d&&(ca(d,this),d.pushSeries(a),ba(d,this,f)),S(u?a.data:g||p,function(a,c){var d,g,l,p=\"undefined\"===typeof f.index,q=!0;if(!p&&(D?(d=a[0],g=a[1]):(d=a,g=n[c]),E?(D&&(g=a.slice(1,3)),l=g[0],g=g[1]):u&&(d=a.x,g=a.stackY,l=g-a.y),O||(q=g>=t&&g<=b),null!==g&&d>=w&&d<=k&&q))if(a=Math.ceil(e.toPixels(d,!0)),B){if(void 0===r||a===x){E||(l=g);if(void 0===v||g>G)G=\ng,v=c;if(void 0===r||l<N)N=l,r=c}a!==x&&(void 0!==r&&(g=h.toPixels(G,!0),y=h.toPixels(N,!0),m(a,g,v),y!==g&&m(a,y,r)),r=v=void 0,x=a)}else g=Math.ceil(h.toPixels(g,!0)),m(a,g,c);return!p},function(){ma(a,\"renderedCanvas\");a.directTouch=!1;a.options.stickyTracking=!0;delete a.buildKDTree;a.buildKDTree()},f.renderer.forExport?Number.MAX_VALUE:void 0)):!z(f)&&d&&(d.clear(),this.image.attr({href:\"\"}))}}),C([\"heatmap\",\"treemap\"],function(a){g[a]&&(w(g[a].prototype,\"drawPoints\",ka),g[a].prototype.directTouch=\n!1)}),g.bubble&&(delete g.bubble.prototype.buildKDTree,g.bubble.prototype.directTouch=!1,w(g.bubble.prototype,\"markerAttribs\",function(a){return A(this)?!1:a.apply(this,[].slice.call(arguments,1))})),g.scatter.prototype.fill=!0,da(g.area.prototype,{fill:!0,fillOpacity:!0,sampling:!0}),da(g.column.prototype,{fill:!0,sampling:!0}),w(p.prototype,\"setVisible\",function(a,c){a.call(this,c,!1);!1===this.visible&&this.ogl&&this.canvas&&this.image?(this.ogl.clear(),this.image.attr({href:\"\"})):this.chart.redraw()}),\nh.Chart.prototype.callbacks.push(function(a){ea(a,\"predraw\",function(){!z(a)&&a.didBoost&&(a.didBoost=!1,a.image&&a.image.attr({href:\"\"}));a.canvas&&a.ogl&&z(a)&&(a.didBoost=!0,a.ogl.allocateBuffer(a));a.markerGroup&&a.xAxis&&0<a.xAxis.length&&a.yAxis&&0<a.yAxis.length&&a.markerGroup.translate(a.xAxis[0].pos,a.yAxis[0].pos)});ea(a,\"render\",function(){a.ogl&&z(a)&&a.ogl.render(a)})})):\"undefined\"!==typeof h.initCanvasBoost?h.initCanvasBoost():h.error(26)})(x)});\n"
  },
  {
    "path": "assets/highcharts/modules/boost.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Boost module\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * License: www.highcharts.com/license\n         * Author: Christer Vasseng, Torstein Honsi\n         * \n         * This is an experimental Highcharts module that draws long data series on a canvas\n         * in order to increase performance of the initial load time and tooltip responsiveness.\n         *\n         * Compatible with WebGL compatible browsers (not IE < 11).\n         *\n         * Development plan\n         * - Column range.\n         * - Check how it works with Highstock and data grouping. Currently it only works when navigator.adaptToUpdatedData\n         *   is false. It is also recommended to set scrollbar.liveRedraw to false.\n         * - Check inverted charts.\n         * - Chart callback should be async after last series is drawn. (But not necessarily, we don't do\n        \t that with initial series animation).\n         *\n         * If this module is taken in as part of the core\n         * - All the loading logic should be merged with core. Update styles in the core.\n         * - Most of the method wraps should probably be added directly in parent methods.\n         *\n         * Notes for boost mode\n         * - Area lines are not drawn\n         * - Lines are not drawn on scatter charts\n         * - Zones and negativeColor don't work\n         * - Columns are always one pixel wide. Don't set the threshold too low.\n         * - Disable animations\n         * - Marker shapes are not supported: markers will always be circles\n         *\n         * Optimizing tips for users\n         * - Set extremes (min, max) explicitly on the axes in order for Highcharts to avoid computing extremes.\n         * - Set enableMouseTracking to false on the series to improve total rendering time.\n         * - The default threshold is set based on one series. If you have multiple, dense series, the combined\n         *   number of points drawn gets higher, and you may want to set the threshold lower in order to \n         *   use optimizations.\n         * - If drawing large scatter charts, it's beneficial to set the marker radius to a value\n         *   less than 1. This is to add additional spacing to make the chart more readable.\n         * - If the value increments on both the X and Y axis aren't small, consider setting\n         *\t useGPUTranslations to true on the boost settings object. If you do this and\n         *\t the increments are small (e.g. datetime axis with small time increments)\n         *\t it may cause rendering issues due to floating point rounding errors,\n         *\t so your millage may vary.\n         *\n         * Settings\n         *\tThere are two ways of setting the boost threshold:\n         *\t- Per. series: boost based on number of points in individual series\n         *\t- Per. chart: boost based on the number of series \n         *\n         *  To set the series boost threshold, set seriesBoostThreshold on the chart object.\n         *  To set the series-specific threshold, set boostThreshold on the series object.\n         * \n         *  In addition, the following can be set in the boost object:\n         *  {\n         *  \t//Wether or not to use alpha blending\n         *  \tuseAlpha: boolean - default: true\n         *  \t//Set to true to perform translations on the GPU.\n         *  \t//Much faster, but may cause rendering issues\n         *  \t//when using values far from 0 due to floating point\n         *  \t//rounding issues\n         *  \tuseGPUTranslations: boolean - default: false\n         *  \t//Use pre-allocated buffers, much faster,\n         *  \t//but may cause rendering issues with some data sets\n         *  \tusePreallocated: boolean - default: false\n         *  \t//Output rendering time in console\n         *  \ttimeRendering: boolean - default: false\n         *  \t//Output processing time in console\n         *  \ttimeSeriesProcessing: boolean - default: false\n         *  \t//Output setup time in console\n         *  \ttimeSetup: boolean - default: false\n         *  }\n         */\n\n        /**\n         * Set the series threshold for when the boost should kick in globally.\n         *\n         * Setting to e.g. 20 will cause the whole chart to enter boost mode\n         * if there are 20 or more series active. When the chart is in boost mode,\n         * every series in it will be rendered to a common canvas. This offers \n         * a significant speed improvment in charts with a very high\n         * amount of series.\n         *  \n         * Note: only available when including the boost module.\n         *\n         * @default  null\n         * @apioption boost.seriesThreshold\n         */\n\n        /**\n         * Set the point threshold for when a series should enter boost mode.\n         *\n         * Setting it to e.g. 2000 will cause the series to enter boost mode\n         * when there are 2000 or more points in the series.\n         *\n         * Note: only available when including the boost module.\n         *\n         * @default  5000\n         * @apioption series.boostThreshold\n         */\n\n        /* global Float32Array */\n\n\n        var win = H.win,\n            doc = win.document,\n            noop = function() {},\n            Color = H.Color,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            each = H.each,\n            extend = H.extend,\n            addEvent = H.addEvent,\n            fireEvent = H.fireEvent,\n            grep = H.grep,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            wrap = H.wrap,\n            plotOptions = H.getOptions().plotOptions,\n            CHUNK_SIZE = 50000,\n            index;\n\n        // Register color names since GL can't render those directly.\n        Color.prototype.names = {\n            aliceblue: '#f0f8ff',\n            antiquewhite: '#faebd7',\n            aqua: '#00ffff',\n            aquamarine: '#7fffd4',\n            azure: '#f0ffff',\n            beige: '#f5f5dc',\n            bisque: '#ffe4c4',\n            black: '#000000',\n            blanchedalmond: '#ffebcd',\n            blue: '#0000ff',\n            blueviolet: '#8a2be2',\n            brown: '#a52a2a',\n            burlywood: '#deb887',\n            cadetblue: '#5f9ea0',\n            chartreuse: '#7fff00',\n            chocolate: '#d2691e',\n            coral: '#ff7f50',\n            cornflowerblue: '#6495ed',\n            cornsilk: '#fff8dc',\n            crimson: '#dc143c',\n            cyan: '#00ffff',\n            darkblue: '#00008b',\n            darkcyan: '#008b8b',\n            darkgoldenrod: '#b8860b',\n            darkgray: '#a9a9a9',\n            darkgreen: '#006400',\n            darkkhaki: '#bdb76b',\n            darkmagenta: '#8b008b',\n            darkolivegreen: '#556b2f',\n            darkorange: '#ff8c00',\n            darkorchid: '#9932cc',\n            darkred: '#8b0000',\n            darksalmon: '#e9967a',\n            darkseagreen: '#8fbc8f',\n            darkslateblue: '#483d8b',\n            darkslategray: '#2f4f4f',\n            darkturquoise: '#00ced1',\n            darkviolet: '#9400d3',\n            deeppink: '#ff1493',\n            deepskyblue: '#00bfff',\n            dimgray: '#696969',\n            dodgerblue: '#1e90ff',\n            feldspar: '#d19275',\n            firebrick: '#b22222',\n            floralwhite: '#fffaf0',\n            forestgreen: '#228b22',\n            fuchsia: '#ff00ff',\n            gainsboro: '#dcdcdc',\n            ghostwhite: '#f8f8ff',\n            gold: '#ffd700',\n            goldenrod: '#daa520',\n            gray: '#808080',\n            green: '#008000',\n            greenyellow: '#adff2f',\n            honeydew: '#f0fff0',\n            hotpink: '#ff69b4',\n            indianred: '#cd5c5c',\n            indigo: '#4b0082',\n            ivory: '#fffff0',\n            khaki: '#f0e68c',\n            lavender: '#e6e6fa',\n            lavenderblush: '#fff0f5',\n            lawngreen: '#7cfc00',\n            lemonchiffon: '#fffacd',\n            lightblue: '#add8e6',\n            lightcoral: '#f08080',\n            lightcyan: '#e0ffff',\n            lightgoldenrodyellow: '#fafad2',\n            lightgrey: '#d3d3d3',\n            lightgreen: '#90ee90',\n            lightpink: '#ffb6c1',\n            lightsalmon: '#ffa07a',\n            lightseagreen: '#20b2aa',\n            lightskyblue: '#87cefa',\n            lightslateblue: '#8470ff',\n            lightslategray: '#778899',\n            lightsteelblue: '#b0c4de',\n            lightyellow: '#ffffe0',\n            lime: '#00ff00',\n            limegreen: '#32cd32',\n            linen: '#faf0e6',\n            magenta: '#ff00ff',\n            maroon: '#800000',\n            mediumaquamarine: '#66cdaa',\n            mediumblue: '#0000cd',\n            mediumorchid: '#ba55d3',\n            mediumpurple: '#9370d8',\n            mediumseagreen: '#3cb371',\n            mediumslateblue: '#7b68ee',\n            mediumspringgreen: '#00fa9a',\n            mediumturquoise: '#48d1cc',\n            mediumvioletred: '#c71585',\n            midnightblue: '#191970',\n            mintcream: '#f5fffa',\n            mistyrose: '#ffe4e1',\n            moccasin: '#ffe4b5',\n            navajowhite: '#ffdead',\n            navy: '#000080',\n            oldlace: '#fdf5e6',\n            olive: '#808000',\n            olivedrab: '#6b8e23',\n            orange: '#ffa500',\n            orangered: '#ff4500',\n            orchid: '#da70d6',\n            palegoldenrod: '#eee8aa',\n            palegreen: '#98fb98',\n            paleturquoise: '#afeeee',\n            palevioletred: '#d87093',\n            papayawhip: '#ffefd5',\n            peachpuff: '#ffdab9',\n            peru: '#cd853f',\n            pink: '#ffc0cb',\n            plum: '#dda0dd',\n            powderblue: '#b0e0e6',\n            purple: '#800080',\n            red: '#ff0000',\n            rosybrown: '#bc8f8f',\n            royalblue: '#4169e1',\n            saddlebrown: '#8b4513',\n            salmon: '#fa8072',\n            sandybrown: '#f4a460',\n            seagreen: '#2e8b57',\n            seashell: '#fff5ee',\n            sienna: '#a0522d',\n            silver: '#c0c0c0',\n            skyblue: '#87ceeb',\n            slateblue: '#6a5acd',\n            slategray: '#708090',\n            snow: '#fffafa',\n            springgreen: '#00ff7f',\n            steelblue: '#4682b4',\n            tan: '#d2b48c',\n            teal: '#008080',\n            thistle: '#d8bfd8',\n            tomato: '#ff6347',\n            turquoise: '#40e0d0',\n            violet: '#ee82ee',\n            violetred: '#d02090',\n            wheat: '#f5deb3',\n            white: '#ffffff',\n            whitesmoke: '#f5f5f5',\n            yellow: '#ffff00',\n            yellowgreen: '#9acd32'\n        };\n\n        /**\n         * Tolerant max() funciton\n         * @return {number} max value\n         */\n        function patientMax() {\n            var args = Array.prototype.slice.call(arguments),\n                r = -Number.MAX_VALUE;\n\n            each(args, function(t) {\n                if (typeof t !== 'undefined' && typeof t.length !== 'undefined') {\n                    //r = r < t.length ? t.length : r;\n                    if (t.length > 0) {\n                        r = t.length;\n                        return true;\n                    }\n                }\n            });\n\n            return r;\n        }\n\n        /*\n         * Returns true if we should force chart series boosting\n         */\n        function shouldForceChartSeriesBoosting(chart) {\n            // If there are more than five series currently boosting,\n            // we should boost the whole chart to avoid running out of webgl contexts.\n            var sboostCount = 0,\n                series;\n\n            if (chart.series.length > 1) {\n                for (var i = 0; i < chart.series.length; i++) {\n                    series = chart.series[i];\n                    if (patientMax(\n                            series.processedXData,\n                            series.options.data,\n                            series.points\n                        ) >= (series.options.boostThreshold || Number.MAX_VALUE)) {\n                        sboostCount++;\n                    }\n                }\n            }\n\n            return sboostCount > 5;\n        }\n\n        /*\n         * Returns true if the chart is in series boost mode\n         * @param chart {Highchart.Chart} - the chart to check\n         * @returns {Boolean} - true if the chart is in series boost mode\n         */\n        function isChartSeriesBoosting(chart) {\n            return shouldForceChartSeriesBoosting(chart) || chart.series.length >= pick(\n                chart.options.boost && chart.options.boost.seriesThreshold,\n                50\n            );\n        }\n\n        /*\n         * Returns true if the series is in boost mode\n         * @param series {Highchart.Series} - the series to check\n         * @returns {boolean} - true if the series is in boost mode\n         */\n        function isSeriesBoosting(series) {\n            return isChartSeriesBoosting(series.chart) ||\n                patientMax(\n                    series.processedXData,\n                    series.options.data,\n                    series.points\n                ) >= (series.options.boostThreshold || Number.MAX_VALUE);\n        }\n\n        ////////////////////////////////////////////////////////////////////////////////\n        // START OF WEBGL ABSTRACTIONS\n\n        /* \n         * A static shader mimicing axis translation functions found in parts/Axis\n         * @param gl {WebGLContext} - the context in which the shader is active\n         */\n        function GLShader(gl) {\n            var vertShade = [\n                    /* eslint-disable */\n                    '#version 100',\n                    'precision highp float;',\n\n                    'attribute vec4 aVertexPosition;',\n                    'attribute vec4 aColor;',\n\n                    'varying highp vec2 position;',\n                    'varying highp vec4 vColor;',\n\n                    'uniform mat4 uPMatrix;',\n                    'uniform float pSize;',\n\n                    'uniform float translatedThreshold;',\n                    'uniform bool hasThreshold;',\n\n                    'uniform bool skipTranslation;',\n\n                    'uniform float xAxisTrans;',\n                    'uniform float xAxisMin;',\n                    'uniform float xAxisMinPad;',\n                    'uniform float xAxisPointRange;',\n                    'uniform float xAxisLen;',\n                    'uniform bool  xAxisPostTranslate;',\n                    'uniform float xAxisOrdinalSlope;',\n                    'uniform float xAxisOrdinalOffset;',\n                    'uniform float xAxisPos;',\n                    'uniform bool  xAxisCVSCoord;',\n\n                    'uniform float yAxisTrans;',\n                    'uniform float yAxisMin;',\n                    'uniform float yAxisMinPad;',\n                    'uniform float yAxisPointRange;',\n                    'uniform float yAxisLen;',\n                    'uniform bool  yAxisPostTranslate;',\n                    'uniform float yAxisOrdinalSlope;',\n                    'uniform float yAxisOrdinalOffset;',\n                    'uniform float yAxisPos;',\n                    'uniform bool  yAxisCVSCoord;',\n\n                    'uniform bool  isBubble;',\n                    'uniform bool  bubbleSizeByArea;',\n                    'uniform float bubbleZMin;',\n                    'uniform float bubbleZMax;',\n                    'uniform float bubbleZThreshold;',\n                    'uniform float bubbleMinSize;',\n                    'uniform float bubbleMaxSize;',\n                    'uniform bool  bubbleSizeAbs;',\n                    'uniform bool  isInverted;',\n\n                    'float bubbleRadius(){',\n                    'float value = aVertexPosition.w;',\n                    'float zMax = bubbleZMax;',\n                    'float zMin = bubbleZMin;',\n                    'float radius = 0.0;',\n                    'float pos = 0.0;',\n                    'float zRange = zMax - zMin;',\n\n                    'if (bubbleSizeAbs){',\n                    'value = value - bubbleZThreshold;',\n                    'zMax = max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);',\n                    'zMin = 0.0;',\n                    '}',\n\n                    'if (value < zMin){',\n                    'radius = bubbleZMin / 2.0 - 1.0;',\n                    '} else {',\n                    'pos = zRange > 0.0 ? (value - zMin) / zRange : 0.5;',\n                    'if (bubbleSizeByArea && pos > 0.0){',\n                    'pos = sqrt(pos);',\n                    '}',\n                    'radius = ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;',\n                    '}',\n\n                    'return radius * 2.0;',\n                    '}',\n\n                    'float translate(float val,',\n                    'float pointPlacement,',\n                    'float localA,',\n                    'float localMin,',\n                    'float minPixelPadding,',\n                    'float pointRange,',\n                    'float len,',\n                    'bool  cvsCoord',\n                    '){',\n\n                    'float sign = 1.0;',\n                    'float cvsOffset = 0.0;',\n\n                    'if (cvsCoord) {',\n                    'sign *= -1.0;',\n                    'cvsOffset = len;',\n                    '}',\n\n                    'return sign * (val - localMin) * localA + cvsOffset + ',\n                    '(sign * minPixelPadding);', //' + localA * pointPlacement * pointRange;',\n                    '}',\n\n                    'float xToPixels(float value){',\n                    'if (skipTranslation){',\n                    'return value;// + xAxisPos;',\n                    '}',\n\n                    'return translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord);// + xAxisPos;',\n                    '}',\n\n                    'float yToPixels(float value, float checkTreshold){',\n                    'float v;',\n                    'if (skipTranslation){',\n                    'v = value;// + yAxisPos;',\n                    '} else {',\n                    'v = translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord);// + yAxisPos;',\n                    '}',\n                    'if (checkTreshold > 0.0 && hasThreshold) {',\n                    'v = min(v, translatedThreshold);',\n                    '}',\n                    'return v;',\n                    '}',\n\n                    'void main(void) {',\n                    'if (isBubble){',\n                    'gl_PointSize = bubbleRadius();',\n                    '} else {',\n                    'gl_PointSize = pSize;',\n                    '}',\n                    //'gl_PointSize = 10.0;',\n                    'vColor = aColor;',\n\n                    'if (isInverted) {',\n                    'gl_Position = uPMatrix * vec4(xToPixels(aVertexPosition.y) + yAxisPos, yToPixels(aVertexPosition.x, aVertexPosition.z) + xAxisPos, 0.0, 1.0);',\n                    '} else {',\n                    'gl_Position = uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);',\n                    '}',\n                    //'gl_Position = uPMatrix * vec4(aVertexPosition.x, aVertexPosition.y, 0.0, 1.0);',\n                    '}'\n                    /* eslint-enable */\n                ].join('\\n'),\n                //Fragment shader source\n                fragShade = [\n                    /* eslint-disable */\n                    'precision highp float;',\n                    'uniform vec4 fillColor;',\n                    'varying highp vec2 position;',\n                    'varying highp vec4 vColor;',\n                    'uniform sampler2D uSampler;',\n                    'uniform bool isCircle;',\n                    'uniform bool hasColor;',\n\n                    // 'vec4 toColor(float value, vec2 point) {',\n                    // \t'return vec4(0.0, 0.0, 0.0, 0.0);',\n                    // '}',\n\n                    'void main(void) {',\n                    'vec4 col = fillColor;',\n\n                    'if (hasColor) {',\n                    'col = vColor;',\n                    '}',\n\n                    'if (isCircle) {',\n                    'gl_FragColor = col * texture2D(uSampler, gl_PointCoord.st);',\n                    '} else {',\n                    'gl_FragColor = col;',\n                    '}',\n                    '}'\n                    /* eslint-enable */\n                ].join('\\n'),\n                uLocations = {},\n                //The shader program\n                shaderProgram,\n                //Uniform handle to the perspective matrix\n                pUniform,\n                //Uniform for point size\n                psUniform,\n                //Uniform for fill color\n                fillColorUniform,\n                //Uniform for isBubble\n                isBubbleUniform,\n                //Uniform for bubble abs sizing\n                bubbleSizeAbsUniform,\n                bubbleSizeAreaUniform,\n                //Skip translation uniform\n                skipTranslationUniform,\n                //Set to 1 if circle\n                isCircleUniform,\n                //Uniform for invertion\n                isInverted,\n                //Texture uniform\n                uSamplerUniform;\n\n            /* String to shader program\n             * @param {string} str - the program source\n             * @param {string} type - the program type: either `vertex` or `fragment`\n             * @returns {bool|shader}\n             */\n            function stringToProgram(str, type) {\n                var t = type === 'vertex' ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER,\n                    shader = gl.createShader(t);\n\n                gl.shaderSource(shader, str);\n                gl.compileShader(shader);\n\n                if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n                    //console.error('shader error:', gl.getShaderInfoLog(shader));\n                    return false;\n                }\n                return shader;\n            }\n\n            /*\n             * Create the shader.\n             * Loads the shader program statically defined above\n             */\n            function createShader() {\n                var v = stringToProgram(vertShade, 'vertex'),\n                    f = stringToProgram(fragShade, 'fragment');\n\n                if (!v || !f) {\n                    shaderProgram = false;\n                    //console.error('error creating shader program');\n                    return false;\n                }\n\n                function uloc(n) {\n                    return gl.getUniformLocation(shaderProgram, n);\n                }\n\n                shaderProgram = gl.createProgram();\n\n                gl.attachShader(shaderProgram, v);\n                gl.attachShader(shaderProgram, f);\n                gl.linkProgram(shaderProgram);\n\n                gl.useProgram(shaderProgram);\n\n                gl.bindAttribLocation(shaderProgram, 0, 'aVertexPosition');\n\n                pUniform = uloc('uPMatrix');\n                psUniform = uloc('pSize');\n                fillColorUniform = uloc('fillColor');\n                isBubbleUniform = uloc('isBubble');\n                bubbleSizeAbsUniform = uloc('bubbleSizeAbs');\n                bubbleSizeAreaUniform = uloc('bubbleSizeByArea');\n                uSamplerUniform = uloc('uSampler');\n                skipTranslationUniform = uloc('skipTranslation');\n                isCircleUniform = uloc('isCircle');\n                isInverted = uloc('isInverted');\n\n                return true;\n            }\n\n            /*\n             * Destroy the shader\n             */\n            function destroy() {\n                if (gl && shaderProgram) {\n                    gl.deleteProgram(shaderProgram);\n                }\n            }\n\n            /*\n             * Bind the shader.\n             * This makes the shader the active one until another one is bound,\n             * or until 0 is bound.\n             */\n            function bind() {\n                gl.useProgram(shaderProgram);\n            }\n\n            /*\n             * Set a uniform value.\n             * This uses a hash map to cache uniform locations.\n             * @param name {string} - the name of the uniform to set\n             * @param val {float} - the value to set\n             */\n            function setUniform(name, val) {\n                var u = uLocations[name] = uLocations[name] ||\n                    gl.getUniformLocation(shaderProgram, name);\n                gl.uniform1f(u, val);\n            }\n\n            /*\n             * Set the active texture\n             * @param texture - the texture\n             */\n            function setTexture() {\n                gl.uniform1i(uSamplerUniform, 0);\n            }\n\n            /*\n             * Set if inversion state\n             * @flag is the state\n             */\n            function setInverted(flag) {\n                gl.uniform1i(isInverted, flag);\n            }\n\n            ////////////////////////////////////////////////////////////////////////////\n\n            /* \n             * Enable/disable circle drawing\n             */\n            function setDrawAsCircle(flag) {\n                gl.uniform1i(isCircleUniform, flag ? 1 : 0);\n            }\n\n            /*\n             * Flush\n             */\n            function reset() {\n                gl.uniform1i(isBubbleUniform, 0);\n                gl.uniform1i(isCircleUniform, 0);\n            }\n\n            /* \n             * Set bubble uniforms\n             * @param series {Highcharts.Series} - the series to use\n             */\n            function setBubbleUniforms(series, zCalcMin, zCalcMax) {\n                var seriesOptions = series.options,\n                    zMin = Number.MAX_VALUE,\n                    zMax = -Number.MAX_VALUE;\n\n                if (series.type === 'bubble') {\n                    zMin = pick(seriesOptions.zMin, Math.min(\n                        zMin,\n                        Math.max(\n                            zCalcMin,\n                            seriesOptions.displayNegative === false ?\n                            seriesOptions.zThreshold : -Number.MAX_VALUE\n                        )\n                    ));\n\n                    zMax = pick(seriesOptions.zMax, Math.max(zMax, zCalcMax));\n\n                    gl.uniform1i(isBubbleUniform, 1);\n                    gl.uniform1i(isCircleUniform, 1);\n                    gl.uniform1i(bubbleSizeAreaUniform, series.options.sizeBy !== 'width');\n                    gl.uniform1i(bubbleSizeAbsUniform, series.options.sizeByAbsoluteValue);\n\n                    setUniform('bubbleZMin', zMin);\n                    setUniform('bubbleZMax', zMax);\n                    setUniform('bubbleZThreshold', series.options.zThreshold);\n                    setUniform('bubbleMinSize', series.minPxSize);\n                    setUniform('bubbleMaxSize', series.maxPxSize);\n                }\n            }\n\n            /*\n             * Set the Color uniform.\n             * @param color {Array<float>} - an array with RGBA values\n             */\n            function setColor(color) {\n                gl.uniform4f(\n                    fillColorUniform,\n                    color[0] / 255.0,\n                    color[1] / 255.0,\n                    color[2] / 255.0,\n                    color[3]\n                );\n            }\n\n            /*\n             * Set skip translation\n             */\n            function setSkipTranslation(flag) {\n                gl.uniform1i(skipTranslationUniform, flag === true ? 1 : 0);\n            }\n\n            /*\n             * Set the perspective matrix\n             * @param m {Matrix4x4} - the matrix \n             */\n            function setPMatrix(m) {\n                gl.uniformMatrix4fv(pUniform, false, m);\n            }\n\n            /*\n             * Set the point size.\n             * @param p {float} - point size\n             */\n            function setPointSize(p) {\n                gl.uniform1f(psUniform, p);\n            }\n\n            /*\n             * Get the shader program handle\n             * @returns {GLInt} - the handle for the program\n             */\n            function getProgram() {\n                return shaderProgram;\n            }\n\n            if (gl) {\n                createShader();\n            }\n\n            return {\n                psUniform: function() {\n                    return psUniform;\n                },\n                pUniform: function() {\n                    return pUniform;\n                },\n                fillColorUniform: function() {\n                    return fillColorUniform;\n                },\n                setBubbleUniforms: setBubbleUniforms,\n                bind: bind,\n                program: getProgram,\n                create: createShader,\n                setUniform: setUniform,\n                setPMatrix: setPMatrix,\n                setColor: setColor,\n                setPointSize: setPointSize,\n                setSkipTranslation: setSkipTranslation,\n                setTexture: setTexture,\n                setDrawAsCircle: setDrawAsCircle,\n                reset: reset,\n                setInverted: setInverted,\n                destroy: destroy\n            };\n        }\n\n        /* \n         * Vertex Buffer abstraction \n         * A vertex buffer is a set of vertices which are passed to the GPU\n         * in a single call.\n         * @param gl {WebGLContext} - the context in which to create the buffer\n         * @param shader {GLShader} - the shader to use\n         */\n        function GLVertexBuffer(gl, shader, dataComponents /*, type */ ) {\n            var buffer = false,\n                vertAttribute = false,\n                components = dataComponents || 2,\n                preAllocated = false,\n                iterator = 0,\n                data;\n\n            // type = type || 'float';\n\n            function destroy() {\n                if (buffer) {\n                    gl.deleteBuffer(buffer);\n                }\n            }\n\n            /* \n             * Build the buffer \n             * @param dataIn {Array<float>} - a 0 padded array of indices\n             * @param attrib {String} - the name of the Attribute to bind the buffer to\n             * @param dataComponents {Integer} - the number of components per. indice\n             */\n            function build(dataIn, attrib, dataComponents) {\n\n                data = dataIn || [];\n\n                if ((!data || data.length === 0) && !preAllocated) {\n                    //console.error('trying to render empty vbuffer');\n                    buffer = false;\n                    return false;\n                }\n\n                components = dataComponents || components;\n\n                if (buffer) {\n                    gl.deleteBuffer(buffer);\n                }\n\n                buffer = gl.createBuffer();\n                gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n                gl.bufferData(\n                    gl.ARRAY_BUFFER,\n                    preAllocated || new Float32Array(data),\n                    gl.STATIC_DRAW\n                );\n\n                // gl.bindAttribLocation(shader.program(), 0, 'aVertexPosition');\n                vertAttribute = gl.getAttribLocation(shader.program(), attrib);\n                gl.enableVertexAttribArray(vertAttribute);\n\n                return true;\n            }\n\n            /* \n             * Bind the buffer\n             */\n            function bind() {\n                if (!buffer) {\n                    return false;\n                }\n\n                // gl.bindAttribLocation(shader.program(), 0, 'aVertexPosition');\n                //gl.enableVertexAttribArray(vertAttribute);\n                //gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n                gl.vertexAttribPointer(vertAttribute, components, gl.FLOAT, false, 0, 0);\n                //gl.enableVertexAttribArray(vertAttribute);\n            }\n\n            /* \n             * Render the buffer \n             * @param from {Integer} - the start indice\n             * @param to {Integer} - the end indice\n             * @param drawMode {String} - the draw mode\n             */\n            function render(from, to, drawMode) {\n                var length = preAllocated ? preAllocated.length : data.length;\n\n                if (!buffer) {\n                    return false;\n                }\n\n                if (!length) {\n                    return false;\n                }\n\n                if (!from || from > length || from < 0) {\n                    from = 0;\n                }\n\n                if (!to || to > length) {\n                    to = length;\n                }\n\n                drawMode = drawMode || 'points';\n\n                gl.drawArrays(\n                    gl[drawMode.toUpperCase()],\n                    from / components,\n                    (to - from) / components\n                );\n\n                return true;\n            }\n\n            function push(x, y, a, b) {\n                if (preAllocated) { // && iterator <= preAllocated.length - 4) {\t\t\t\n                    preAllocated[++iterator] = x;\n                    preAllocated[++iterator] = y;\n                    preAllocated[++iterator] = a;\n                    preAllocated[++iterator] = b;\n                }\n            }\n\n            /*\n             * Note about pre-allocated buffers:\n             * \t- This is slower for charts with many series\n             */\n            function allocate(size) {\n                size *= 4;\n                iterator = -1;\n\n                //if (!preAllocated || (preAllocated && preAllocated.length !== size)) {\t\t\t\n                preAllocated = new Float32Array(size);\n                //}\n            }\n\n            ////////////////////////////////////////////////////////////////////////////\n            return {\n                destroy: destroy,\n                bind: bind,\n                data: data,\n                build: build,\n                render: render,\n                allocate: allocate,\n                push: push\n            };\n        }\n\n        /* Main renderer. Used to render series.\n         *\tNotes to self:\n         *\t\t- May be able to build a point map by rendering to a separate canvas\n         *\t\t  and encoding values in the color data.\n         *\t\t- Need to figure out a way to transform the data quicker\n         */\n        function GLRenderer(postRenderCallback) {\n            var // Shader\n                shader = false,\n                // Vertex buffers - keyed on shader attribute name\n                vbuffer = false,\n                // Opengl context\n                gl = false,\n                // Width of our viewport in pixels\n                width = 0,\n                // Height of our viewport in pixels\n                height = 0,\n                // The data to render - array of coordinates\n                data = false,\n                // The marker data\n                markerData = false,\n                // Is the texture ready?\n                textureIsReady = false,\n                // Exports\n                exports = {},\n                // Is it inited?\n                isInited = false,\n                // The series stack\n                series = [],\n                // Texture for circles\n                circleTexture = doc.createElement('canvas'),\n                // Context for circle texture\n                circleCtx = circleTexture.getContext('2d'),\n                // Handle for the circle texture\n                circleTextureHandle,\n                // Things to draw as \"rectangles\" (i.e lines)\n                asBar = {\n                    'column': true,\n                    'area': true\n                },\n                asCircle = {\n                    'scatter': true,\n                    'bubble': true\n                },\n                //Render settings\n                settings = {\n                    pointSize: 1,\n                    lineWidth: 3,\n                    fillColor: '#AA00AA',\n                    useAlpha: true,\n                    usePreallocated: false,\n                    useGPUTranslations: false,\n                    timeRendering: false,\n                    timeSeriesProcessing: false,\n                    timeSetup: false\n                };\n\n            ////////////////////////////////////////////////////////////////////////////\n\n            function setOptions(options) {\n                merge(true, settings, options);\n            }\n\n            function seriesPointCount(series) {\n                var isStacked,\n                    xData,\n                    s;\n\n                if (isSeriesBoosting(series)) {\n                    isStacked = !!series.options.stacking;\n                    xData = series.xData || series.options.xData || series.processedXData;\n                    s = (isStacked ? series.data : (xData || series.options.data)).length;\n\n                    if (series.type === 'treemap') {\n                        s *= 12;\n                    } else if (series.type === 'heatmap') {\n                        s *= 6;\n                    } else if (asBar[series.type]) {\n                        s *= 2;\n                    }\n\n                    return s;\n                }\n\n                return 0;\n            }\n\n            /* Allocate a float buffer to fit all series */\n            function allocateBuffer(chart) {\n                var s = 0;\n\n                if (!settings.usePreallocated) {\n                    return;\n                }\n\n                each(chart.series, function(series) {\n                    if (isSeriesBoosting(series)) {\n                        s += seriesPointCount(series);\n                    }\n                });\n\n                vbuffer.allocate(s);\n            }\n\n            function allocateBufferForSingleSeries(series) {\n                var s = 0;\n\n                if (!settings.usePreallocated) {\n                    return;\n                }\n\n                if (isSeriesBoosting(series)) {\n                    s = seriesPointCount(series);\n                }\n\n                vbuffer.allocate(s);\n            }\n\n            /*  \n             * Returns an orthographic perspective matrix\n             * @param {number} width - the width of the viewport in pixels\n             * @param {number} height - the height of the viewport in pixels\n             */\n            function orthoMatrix(width, height) {\n                var near = 0,\n                    far = 1;\n\n                return [\n                    2 / width, 0, 0, 0,\n                    0, -(2 / height), 0, 0,\n                    0, 0, -2 / (far - near), 0, -1, 1, -(far + near) / (far - near), 1\n                ];\n            }\n\n            /*\n             * Clear the depth and color buffer\n             */\n            function clear() {\n                gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n            }\n\n            /*\n             * Get the WebGL context\n             * @returns {WebGLContext} - the context\n             */\n            function getGL() {\n                return gl;\n            }\n\n            /*\n             * Push data for a single series\n             * This calculates additional vertices and transforms the data to be \n             * aligned correctly in memory\n             */\n            function pushSeriesData(series, inst) {\n                var isRange = series.pointArrayMap &&\n                    series.pointArrayMap.join(',') === 'low,high',\n                    chart = series.chart,\n                    options = series.options,\n                    isStacked = !!options.stacking,\n                    rawData = options.data,\n                    xExtremes = series.xAxis.getExtremes(),\n                    xMin = xExtremes.min,\n                    xMax = xExtremes.max,\n                    yExtremes = series.yAxis.getExtremes(),\n                    yMin = yExtremes.min,\n                    yMax = yExtremes.max,\n                    xData = series.xData || options.xData || series.processedXData,\n                    yData = series.yData || options.yData || series.processedYData,\n                    zData = series.zData || options.zData || series.processedZData,\n                    yAxis = series.yAxis,\n                    xAxis = series.xAxis,\n                    useRaw = !xData || xData.length === 0,\n                    // threshold = options.threshold,\n                    // yBottom = chart.yAxis[0].getThreshold(threshold),\n                    // hasThreshold = isNumber(threshold),\n                    // colorByPoint = series.options.colorByPoint,\n                    // This is required for color by point, so make sure this is \n                    // uncommented if enabling that\n                    // colorIndex = 0,\n                    // Required for color axis support\n                    // caxis,\t\t\t\n                    // connectNulls = options.connectNulls,\t\t\t\n                    // For some reason eslint doesn't pick up that this is actually used\n                    maxVal, //eslint-disable-line no-unused-vars\n                    points = series.points || false,\n                    lastX = false,\n                    minVal,\n                    color,\n                    scolor,\n                    sdata = isStacked ? series.data : (xData || rawData),\n                    closestLeft = {\n                        x: Number.MIN_VALUE,\n                        y: 0\n                    },\n                    closestRight = {\n                        x: Number.MIN_VALUE,\n                        y: 0\n                    };\n\n                if (options.boostData && options.boostData.length > 0) {\n                    return;\n                }\n\n                series.closestPointRangePx = Number.MAX_VALUE;\n\n                // Push color to color buffer - need to do this per. vertex\n                function pushColor(color) {\n                    if (color) {\n                        inst.colorData.push(color[0]);\n                        inst.colorData.push(color[1]);\n                        inst.colorData.push(color[2]);\n                        inst.colorData.push(color[3]);\n                    }\n                }\n\n                //Push a vertice to the data buffer\n                function vertice(x, y, checkTreshold, pointSize, color) {\n                    pushColor(color);\n                    if (settings.usePreallocated) {\n                        vbuffer.push(x, y, checkTreshold ? 1 : 0, pointSize || 1);\n                    } else {\n                        data.push(x);\n                        data.push(y);\n                        data.push(checkTreshold ? 1 : 0);\n                        data.push(pointSize || 1);\n                    }\n                }\n\n                // Push a rectangle to the data buffer\n                function pushRect(x, y, w, h, color) {\n                    pushColor(color);\n                    vertice(x + w, y);\n                    pushColor(color);\n                    vertice(x, y);\n                    pushColor(color);\n                    vertice(x, y + h);\n\n                    pushColor(color);\n                    vertice(x, y + h);\n                    pushColor(color);\n                    vertice(x + w, y + h);\n                    pushColor(color);\n                    vertice(x + w, y);\n                }\n\n                // Special case for point shapes\n                if (points && points.length > 0) {\n\n                    // If we're doing points, we assume that the points are already\n                    // translated, so we skip the shader translation.\n                    inst.skipTranslation = true;\n                    // Force triangle draw mode\n                    inst.drawMode = 'triangles';\n\n                    // We don't have a z component in the shader, so we need to sort.\n                    if (points[0].node && points[0].node.levelDynamic) {\n                        points.sort(function(a, b) {\n                            if (a.node) {\n                                if (a.node.levelDynamic > b.node.levelDynamic) {\n                                    return 1;\n                                } else if (a.node.levelDynamic < b.node.levelDynamic) {\n                                    return -1;\n                                }\n                            }\n                            return 0;\n                        });\n                    }\n\n                    each(points, function(point) {\n                        var plotY = point.plotY,\n                            shapeArgs,\n                            swidth,\n                            pointAttr;\n\n                        if (plotY !== undefined && !isNaN(plotY) && point.y !== null) {\n                            shapeArgs = point.shapeArgs;\n\n\n                            pointAttr = point.series.pointAttribs(point);\n\n                            swidth = pointAttr['stroke-width'] || 0;\n\n                            // Handle point colors\n                            color = H.color(pointAttr.fill).rgba;\n                            color[0] /= 255.0;\n                            color[1] /= 255.0;\n                            color[2] /= 255.0;\n\n                            // So there are two ways of doing this. Either we can\n                            // create a rectangle of two triangles, or we can do a \n                            // point and use point size. Latter is faster, but \n                            // only supports squares. So we're doing triangles.\n                            // We could also use one color per. vertice to get \n                            // better color interpolation.\n\n                            // If there's stroking, we do an additional rect\n                            //if (pointAttr.stroke !== 'none' && swidth && swidth > 0) {\n                            if (series.type === 'treemap') {\n                                swidth = swidth || 1;\n                                scolor = H.color(pointAttr.stroke).rgba;\n\n                                scolor[0] /= 255.0;\n                                scolor[1] /= 255.0;\n                                scolor[2] /= 255.0;\n\n                                pushRect(\n                                    shapeArgs.x,\n                                    shapeArgs.y,\n                                    shapeArgs.width,\n                                    shapeArgs.height,\n                                    scolor\n                                );\n\n                                swidth /= 2;\n                            }\n                            // } else {\n                            // \tswidth = 0;\n                            // }\n\n                            pushRect(\n                                shapeArgs.x + swidth,\n                                shapeArgs.y + swidth,\n                                shapeArgs.width - (swidth * 2),\n                                shapeArgs.height - (swidth * 2),\n                                color\n                            );\n                        }\n                    });\n\n                    return;\n                }\n\n                // Extract color axis\n                // each(chart.axes || [], function (a) {\n                // \tif (H.ColorAxis && a instanceof H.ColorAxis) {\n                // \t\tcaxis = a;\n                // \t}\n                // });\t\n\n                each(sdata, function(d, i) {\n                    var x,\n                        y,\n                        z,\n                        px = false,\n                        nx = false,\n                        // This is in fact used.\n                        low, //eslint-disable-line no-unused-vars\n                        chartDestroyed = typeof chart.index === 'undefined',\n                        nextInside = false,\n                        prevInside = false,\n                        pcolor = false,\n                        drawAsBar = asBar[series.type],\n                        isXInside = false,\n                        isYInside = true;\n\n                    if (chartDestroyed) {\n                        return false;\n                    }\n\n                    // Uncomment this to enable color by point.\n                    // This currently left disabled as the charts look really ugly\n                    // when enabled and there's a lot of points.\n                    // Leaving in for the future (tm).\n                    // if (colorByPoint) {\n                    // \tcolorIndex = ++colorIndex % series.chart.options.colors.length;\n                    // \tpcolor = toRGBAFast(series.chart.options.colors[colorIndex]);\n                    // \tpcolor[0] /= 255.0;\n                    // \tpcolor[1] /= 255.0;\n                    // \tpcolor[2] /= 255.0;\n                    // }\n\n                    if (useRaw) {\n                        x = d[0];\n                        y = d[1];\n\n                        if (sdata[i + 1]) {\n                            nx = sdata[i + 1][0];\n                        }\n\n                        if (sdata[i - 1]) {\n                            px = sdata[i - 1][0];\n                        }\n\n                        if (d.length >= 3) {\n                            z = d[2];\n\n                            if (d[2] > inst.zMax) {\n                                inst.zMax = d[2];\n                            }\n\n                            if (d[2] < inst.zMin) {\n                                inst.zMin = d[2];\n                            }\n                        }\n\n                    } else {\n                        x = d;\n                        y = yData[i];\n\n                        if (sdata[i + 1]) {\n                            nx = sdata[i + 1];\n                        }\n\n                        if (sdata[i - 1]) {\n                            px = sdata[i - 1];\n                        }\n\n                        if (zData && zData.length) {\n                            z = zData[i];\n\n                            if (zData[i] > inst.zMax) {\n                                inst.zMax = zData[i];\n                            }\n\n                            if (zData[i] < inst.zMin) {\n                                inst.zMin = zData[i];\n                            }\n                        }\n                    }\n\n                    if (nx && nx >= xMin && nx <= xMax) {\n                        nextInside = true;\n                    }\n\n                    if (px && px >= xMin && px <= xMax) {\n                        prevInside = true;\n                    }\n\n                    if (isRange) {\n                        if (useRaw) {\n                            y = d.slice(1, 3);\n                        }\n\n                        low = y[0];\n                        y = y[1];\n\n                    } else if (isStacked) {\n                        x = d.x;\n                        y = d.stackY;\n                        low = y - d.y;\n                    }\n\n                    if (!series.requireSorting) {\n                        isYInside = y >= yMin && y <= yMax;\n                    }\n\n                    if (x > xMax && closestRight.x < xMax) {\n                        closestRight.x = x;\n                        closestRight.y = y;\n                    }\n\n                    if (x < xMin && closestLeft.x < xMin) {\n                        closestLeft.x = x;\n                        closestLeft.y = y;\n                    }\n\n                    if (y !== 0 && (!y || !isYInside)) {\n                        return;\n                    }\n\n                    if (x >= xMin && x <= xMax) {\n                        isXInside = true;\n                    }\n\n                    if (!isXInside && !nextInside && !prevInside) {\n                        return;\n                    }\n\n                    // Skip translations - temporary floating point fix\n                    if (!settings.useGPUTranslations) {\n                        inst.skipTranslation = true;\n                        x = xAxis.toPixels(x, true);\n                        y = yAxis.toPixels(y, true);\n                    }\n\n                    if (drawAsBar) {\n\n                        maxVal = y;\n                        minVal = 0;\n\n                        if (y < 0) {\n                            minVal = y;\n                            y = 0;\n                        }\n\n                        if (!settings.useGPUTranslations) {\n                            minVal = yAxis.toPixels(minVal, true);\n                        }\n\n                        // Need to add an extra point here\n                        vertice(x, minVal, 0, 0, pcolor);\n                    }\n\n                    // No markers on out of bounds things.\n                    // Out of bound things are shown if and only if the next\n                    // or previous point is inside the rect.\n                    if (inst.hasMarkers) { // && isXInside) {\n                        // x = H.correctFloat(\n                        // \tMath.min(Math.max(-1e5, xAxis.translate(\n                        // \t\tx,\n                        // \t\t0,\n                        // \t\t0,\n                        // \t\t0,\n                        // \t\t1,\n                        // \t\t0.5,\n                        // \t\tfalse\n                        // \t)), 1e5)\n                        // );\n\n                        if (lastX !== false) {\n                            series.closestPointRangePx = Math.min(\n                                series.closestPointRangePx,\n                                Math.abs(x - lastX)\n                            );\n                        }\n                    }\n\n                    vertice(\n                        x,\n                        y,\n                        0,\n                        series.type === 'bubble' ? (z || 1) : 2,\n                        pcolor\n                    );\n\n                    // Uncomment this to support color axis.\n                    // if (caxis) {\t\t\t\t\n                    // \tcolor = H.color(caxis.toColor(y)).rgba;\n\n                    // \tinst.colorData.push(color[0] / 255.0);\n                    // \tinst.colorData.push(color[1] / 255.0);\n                    // \tinst.colorData.push(color[2] / 255.0);\n                    // \tinst.colorData.push(color[3]);\n                    // }\n\n                    lastX = x;\n\n                    //return true;\n                });\n\n                function pushSupplementPoint(point) {\n                    if (!settings.useGPUTranslations) {\n                        inst.skipTranslation = true;\n                        point.x = xAxis.toPixels(point.x, true);\n                        point.y = yAxis.toPixels(point.y, true);\n                    }\n\n                    // We should only do this for lines, and we should ignore markers\n                    // since there's no point here that would have a marker.\n\n                    vertice(\n                        point.x,\n                        point.y,\n                        0,\n                        2\n                    );\n                }\n\n                if (!lastX) {\n                    // There are no points within the selected range\n                    pushSupplementPoint(closestLeft);\n                    pushSupplementPoint(closestRight);\n                }\n            }\n\n            /*\n             * Push a series to the renderer\n             * If we render the series immediatly, we don't have to loop later\n             * @param s {Highchart.Series} - the series to push\n             */\n            function pushSeries(s) {\n                if (series.length > 0) {\n                    series[series.length - 1].to = data.length;\n                    if (series[series.length - 1].hasMarkers) {\n                        series[series.length - 1].markerTo = markerData.length;\n                    }\n                }\n\n                if (settings.timeSeriesProcessing) {\n                    console.time('building ' + s.type + ' series'); //eslint-disable-line no-console\t\t \t\n                }\n\n                series.push({\n                    from: data.length,\n                    markerFrom: markerData.length,\n                    // Push RGBA values to this array to use per. point coloring.\n                    // It should be 0-padded, so each component should be pushed in\n                    // succession.\n                    colorData: [],\n                    series: s,\n                    zMin: Number.MAX_VALUE,\n                    zMax: -Number.MAX_VALUE,\n                    hasMarkers: s.options.marker ? s.options.marker.enabled !== false : false,\n                    showMarksers: true,\n                    drawMode: ({\n                        'area': 'lines',\n                        'arearange': 'lines',\n                        'areaspline': 'line_strip',\n                        'column': 'lines',\n                        'line': 'line_strip',\n                        'scatter': 'points',\n                        'heatmap': 'triangles',\n                        'treemap': 'triangles',\n                        'bubble': 'points'\n                    })[s.type] || 'line_strip'\n                });\n\n                // Add the series data to our buffer(s)\n                pushSeriesData(s, series[series.length - 1]);\n\n                if (settings.timeSeriesProcessing) {\n                    console.timeEnd('building ' + s.type + ' series'); //eslint-disable-line no-console\t\t\n                }\n            }\n\n            /*\n             * Flush the renderer.\n             * This removes pushed series and vertices.\n             * Should be called after clearing and before rendering\n             */\n            function flush() {\n                series = [];\n                exports.data = data = [];\n                markerData = [];\n            }\n\n            /*\n             * Pass x-axis to shader\n             * @param axis {Highcharts.Axis} - the x-axis\n             */\n            function setXAxis(axis) {\n                if (!shader) {\n                    return;\n                }\n\n                shader.setUniform('xAxisTrans', axis.transA);\n                shader.setUniform('xAxisMin', axis.min);\n                shader.setUniform('xAxisMinPad', axis.minPixelPadding);\n                shader.setUniform('xAxisPointRange', axis.pointRange);\n                shader.setUniform('xAxisLen', axis.len);\n                shader.setUniform('xAxisPos', axis.pos);\n                shader.setUniform('xAxisCVSCoord', !axis.horiz);\n            }\n\n            /*\n             * Pass y-axis to shader\n             * @param axis {Highcharts.Axis} - the y-axis\n             */\n            function setYAxis(axis) {\n                if (!shader) {\n                    return;\n                }\n\n                shader.setUniform('yAxisTrans', axis.transA);\n                shader.setUniform('yAxisMin', axis.min);\n                shader.setUniform('yAxisMinPad', axis.minPixelPadding);\n                shader.setUniform('yAxisPointRange', axis.pointRange);\n                shader.setUniform('yAxisLen', axis.len);\n                shader.setUniform('yAxisPos', axis.pos);\n                shader.setUniform('yAxisCVSCoord', !axis.horiz);\n            }\n\n            /* \n             * Set the translation threshold\n             * @param has {boolean} - has threshold flag\n             * @param translation {Float} - the threshold\n             */\n            function setThreshold(has, translation) {\n                shader.setUniform('hasThreshold', has);\n                shader.setUniform('translatedThreshold', translation);\n            }\n\n            /* \n             * Render the data \n             * This renders all pushed series.\n             */\n            function render(chart) {\n\n                if (chart) {\n                    if (!chart.chartHeight || !chart.chartWidth) {\n                        //chart.setChartSize();\n                    }\n\n                    width = chart.chartWidth || 800;\n                    height = chart.chartHeight || 400;\n                } else {\n                    return false;\n                }\n\n                if (!gl || !width || !height) {\n                    return false;\n                }\n\n                if (settings.timeRendering) {\n                    console.time('gl rendering'); //eslint-disable-line no-console\n                }\n\n                shader.bind();\n\n                gl.viewport(0, 0, width, height);\n                shader.setPMatrix(orthoMatrix(width, height));\n\n                if (settings.lineWidth > 1 && !H.isMS) {\n                    gl.lineWidth(settings.lineWidth);\n                }\n\n                vbuffer.build(exports.data, 'aVertexPosition', 4);\n                vbuffer.bind();\n\n                if (textureIsReady) {\n                    gl.bindTexture(gl.TEXTURE_2D, circleTextureHandle);\n                    shader.setTexture(circleTextureHandle);\n                }\n\n                shader.setInverted(chart.options.chart ? chart.options.chart.inverted : false);\n\n                // Render the series\n                each(series, function(s, si) {\n                    var options = s.series.options,\n                        threshold = options.threshold,\n                        hasThreshold = isNumber(threshold),\n                        yBottom = s.series.yAxis.getThreshold(threshold),\n                        translatedThreshold = yBottom,\n                        cbuffer,\n                        showMarkers = pick(\n                            options.marker ? options.marker.enabled : null,\n                            s.series.xAxis.isRadial ? true : null,\n                            s.series.closestPointRangePx >\n                            2 * ((\n                                options.marker ?\n                                options.marker.radius :\n                                10\n                            ) || 10)\n                        ),\n                        fillColor = s.series.fillOpacity ?\n                        new Color(s.series.color).setOpacity(\n                            pick(options.fillOpacity, 0.85)\n                        ).get() :\n                        s.series.color,\n                        color;\n\n                    vbuffer.bind();\n\n                    if (options.colorByPoint) {\n                        fillColor = s.series.chart.options.colors[si];\n                    }\n\n                    color = H.color(fillColor).rgba;\n\n                    if (!settings.useAlpha) {\n                        color[3] = 1.0;\n                    }\n\n                    //Blending\n                    if (options.boostBlending === 'add') {\n                        gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n                        gl.blendEquation(gl.FUNC_ADD);\n\n                    } else if (options.boostBlending === 'mult') {\n                        gl.blendFunc(gl.DST_COLOR, gl.ZERO);\n\n                    } else if (options.boostBlending === 'darken') {\n                        gl.blendFunc(gl.ONE, gl.ONE);\n                        gl.blendEquation(gl.FUNC_MIN);\n\n                    } else {\n                        //gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);//, gl.ONE, gl.ZERO);\n                        //gl.blendEquation(gl.FUNC_ADD);\n                        gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n                    }\n\n                    shader.reset();\n\n                    // If there are entries in the colorData buffer, build and bind it.\n                    if (s.colorData.length > 0) {\n                        shader.setUniform('hasColor', 1.0);\n                        cbuffer = GLVertexBuffer(gl, shader); //eslint-disable-line new-cap\n                        cbuffer.build(s.colorData, 'aColor', 4);\n                        cbuffer.bind();\n                    }\n\n                    // Set series specific uniforms\n                    shader.setColor(color);\n                    setXAxis(s.series.xAxis);\n                    setYAxis(s.series.yAxis);\n                    setThreshold(hasThreshold, translatedThreshold);\n\n                    if (s.drawMode === 'points') {\n                        if (options.marker && options.marker.radius) {\n                            shader.setPointSize(options.marker.radius * 2.0);\n                        } else {\n                            shader.setPointSize(1);\n                        }\n                    }\n\n                    // If set to true, the toPixels translations in the shader\n                    // is skipped, i.e it's assumed that the value is a pixel coord.\n                    shader.setSkipTranslation(s.skipTranslation);\n\n                    if (s.series.type === 'bubble') {\n                        shader.setBubbleUniforms(s.series, s.zMin, s.zMax);\n                    }\n\n                    shader.setDrawAsCircle((asCircle[s.series.type] && textureIsReady) || false);\n\n                    // Do the actual rendering\n                    vbuffer.render(s.from, s.to, s.drawMode);\n\n                    if (s.hasMarkers && showMarkers) {\n                        if (options.marker && options.marker.radius) {\n                            shader.setPointSize(options.marker.radius * 2.0);\n                        } else {\n                            shader.setPointSize(10);\n                        }\n                        shader.setDrawAsCircle(true);\n                        vbuffer.render(s.from, s.to, 'POINTS');\n                    }\n                });\n\n                vbuffer.destroy();\n\n                if (settings.timeRendering) {\n                    console.timeEnd('gl rendering'); //eslint-disable-line no-console\n                }\n\n                flush();\n\n                if (postRenderCallback) {\n                    postRenderCallback();\n                }\n            }\n\n            /* \n             * Render the data when ready\n             */\n            function renderWhenReady(chart) {\n                clear();\n\n                if (chart.renderer.forExport) {\n                    return render(chart);\n                }\n\n                if (isInited) {\n                    render(chart);\n                } else {\n                    setTimeout(function() {\n                        renderWhenReady(chart);\n                    }, 1);\n                }\n            }\n\n            /* \n             * Set the viewport size in pixels\n             * Creates an orthographic perspective matrix and applies it.\n             * @param w {Integer} - the width of the viewport\n             * @param h {Integer} - the height of the viewport\n             */\n            function setSize(w, h) {\n                // Skip if there's no change\n                if (width === w && h === h) {\n                    return;\n                }\n\n                width = w;\n                height = h;\n\n                shader.bind();\n                shader.setPMatrix(orthoMatrix(width, height));\n            }\n\n            /* \n             * Init OpenGL \n             * @param canvas {HTMLCanvas} - the canvas to render to\n             */\n            function init(canvas, noFlush) {\n                var i = 0,\n                    contexts = [\n                        'webgl',\n                        'experimental-webgl',\n                        'moz-webgl',\n                        'webkit-3d'\n                    ];\n\n                isInited = false;\n\n                if (!canvas) {\n                    return false;\n                }\n\n                if (settings.timeSetup) {\n                    console.time('gl setup'); //eslint-disable-line no-console\t\n                }\n\n                for (; i < contexts.length; i++) {\n                    gl = canvas.getContext(contexts[i]);\n                    if (gl) {\n                        break;\n                    }\n                }\n\n                if (gl) {\n                    if (!noFlush) {\n                        flush();\n                    }\n                } else {\n                    return false;\n                }\n\n                gl.enable(gl.BLEND);\n                // gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n                gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n                gl.disable(gl.DEPTH_TEST);\n                gl.depthMask(gl.FALSE);\n\n                shader = GLShader(gl); //eslint-disable-line new-cap\t\n                vbuffer = GLVertexBuffer(gl, shader); //eslint-disable-line new-cap\n\n                textureIsReady = false;\n\n                // Set up the circle texture used for bubbles\n                circleTextureHandle = gl.createTexture();\n\n                // Draw the circle\n                circleTexture.width = 512;\n                circleTexture.height = 512;\n\n                circleCtx.fillStyle = '#FFF';\n                circleCtx.beginPath();\n                circleCtx.arc(256, 256, 256, 0, 2 * Math.PI);\n                circleCtx.fill();\n\n                try {\n\n                    gl.bindTexture(gl.TEXTURE_2D, circleTextureHandle);\n\n                    gl.texImage2D(\n                        gl.TEXTURE_2D,\n                        0,\n                        gl.RGBA,\n                        gl.RGBA,\n                        gl.UNSIGNED_BYTE,\n                        circleTexture\n                    );\n\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n\n                    gl.generateMipmap(gl.TEXTURE_2D);\n\n                    gl.bindTexture(gl.TEXTURE_2D, null);\n\n                    textureIsReady = true;\n                } catch (e) {}\n\n                isInited = true;\n\n                if (settings.timeSetup) {\n                    console.timeEnd('gl setup'); //eslint-disable-line no-console\n                }\n\n                return true;\n            }\n\n            /* \n             * Check if we have a valid OGL context \n             * @returns {Boolean} - true if the context is valid\n             */\n            function valid() {\n                return gl !== false;\n            }\n\n            /*\n             * Check if the renderer has been initialized\n             * @returns {Boolean} - true if it has, false if not\n             */\n            function inited() {\n                return isInited;\n            }\n\n            function destroy() {\n                vbuffer.destroy();\n                shader.destroy();\n                if (gl) {\n                    //gl.deleteTexture(circleTextureHandle);\n                }\n            }\n\n            ////////////////////////////////////////////////////////////////////////////\n            exports = {\n                allocateBufferForSingleSeries: allocateBufferForSingleSeries,\n                pushSeries: pushSeries,\n                setSize: setSize,\n                inited: inited,\n                setThreshold: setThreshold,\n                init: init,\n                render: renderWhenReady,\n                settings: settings,\n                valid: valid,\n                clear: clear,\n                flush: flush,\n                setXAxis: setXAxis,\n                setYAxis: setYAxis,\n                data: data,\n                gl: getGL,\n                allocateBuffer: allocateBuffer,\n                destroy: destroy,\n                setOptions: setOptions\n            };\n\n            return exports;\n        }\n\n        // END OF WEBGL ABSTRACTIONS\n        ////////////////////////////////////////////////////////////////////////////////\n\n        /* \n         * Create a canvas + context and attach it to the target\n         * @param target {Highcharts.Chart|Highcharts.Series} - the canvas target\n         * @param chart {Highcharts.Chart} - the chart\n         */\n        function createAndAttachRenderer(chart, series) {\n            var width = chart.chartWidth,\n                height = chart.chartHeight,\n                target = chart,\n                targetGroup = chart.seriesGroup || series.group,\n                swapXY = function(proceed, x, y, a, b, c, d) {\n                    proceed.call(series, y, x, a, b, c, d);\n                };\n\n            if (isChartSeriesBoosting(chart)) {\n                target = chart;\n            } else {\n                target = series;\n            }\n\n            if (target.ogl) {\n                //target.ogl.destroy();\n            }\n\n            if (!target.image) {\n                target.canvas = doc.createElement('canvas');\n\n                target.image = chart.renderer.image(\n                    '',\n                    0,\n                    0,\n                    width,\n                    height\n                ).add(targetGroup);\n\n                target.boostClipRect = chart.renderer.clipRect(\n                    chart.plotLeft,\n                    chart.plotTop,\n                    chart.plotWidth,\n                    chart.chartHeight\n                );\n\n                target.image.clip(target.boostClipRect);\n\n                if (target.inverted) {\n                    each(['moveTo', 'lineTo', 'rect', 'arc'], function(fn) {\n                        wrap(false, fn, swapXY);\n                    });\n                }\n\n                if (target instanceof H.Chart) {\n                    target.markerGroup = target.renderer.g().add(targetGroup);\n\n                    target.markerGroup.translate(series.xAxis.pos, series.yAxis.pos);\n                }\n            }\n\n            target.canvas.width = width;\n            target.canvas.height = height;\n\n            target.image.attr({\n                x: 0,\n                y: 0,\n                width: width,\n                height: height,\n                style: 'pointer-events: none'\n            });\n\n            target.boostClipRect.attr({\n                x: chart.plotLeft,\n                y: chart.plotTop,\n                width: chart.plotWidth,\n                height: chart.chartHeight\n            });\n\n            if (!target.ogl) {\n\n\n                target.ogl = GLRenderer(function() { // eslint-disable-line new-cap\n                    target.image.attr({\n                        href: target.canvas.toDataURL('image/png')\n                    });\n                }); //eslint-disable-line new-cap\n\n                target.ogl.init(target.canvas);\n                // target.ogl.clear();\n                target.ogl.setOptions(chart.options.boost || {});\n\n                if (target instanceof H.Chart) {\n                    target.ogl.allocateBuffer(chart);\n                }\n            }\n\n            target.ogl.setSize(width, height);\n\n            return target.ogl;\n        }\n\n        /*\n         * Performs the actual render if the renderer is \n         * attached to the series.\n         * @param renderer {OGLRenderer} - the renderer\n         * @param series {Highcharts.Series} - the series\n         */\n        function renderIfNotSeriesBoosting(renderer, series, chart) {\n            if (renderer &&\n                series.image &&\n                series.canvas &&\n                !isChartSeriesBoosting(chart || series.chart)\n            ) {\n                renderer.render(chart || series.chart);\n            }\n        }\n\n        function allocateIfNotSeriesBoosting(renderer, series) {\n            if (renderer &&\n                series.image &&\n                series.canvas &&\n                !isChartSeriesBoosting(series.chart)\n            ) {\n                renderer.allocateBufferForSingleSeries(series);\n            }\n        }\n\n        /*\n         * An \"async\" foreach loop.\n         * Uses a setTimeout to keep the loop from blocking the UI thread\n         * @param arr {Array} - the array to loop through\n         * @param fn {Function} - the callback to call for each item\n         * @param finalFunc {Function} - the callback to call when done\n         * @param chunkSize {Number} - the number of iterations per. timeout\n         * @param i {Number} - the current index\n         * @param noTimeout {Boolean} - set to true to skip timeouts \n         */\n        function eachAsync(arr, fn, finalFunc, chunkSize, i, noTimeout) {\n            i = i || 0;\n            chunkSize = chunkSize || CHUNK_SIZE;\n\n            var threshold = i + chunkSize,\n                proceed = true;\n\n            while (proceed && i < threshold && i < arr.length) {\n                proceed = fn(arr[i], i);\n                ++i;\n            }\n            if (proceed) {\n                if (i < arr.length) {\n\n                    if (noTimeout) {\n                        eachAsync(arr, fn, finalFunc, chunkSize, i, noTimeout);\n                    } else if (win.requestAnimationFrame) {\n                        //If available, do requestAnimationFrame - shaves off a few ms \n                        win.requestAnimationFrame(function() {\n                            eachAsync(arr, fn, finalFunc, chunkSize, i);\n                        });\n                    } else {\n                        setTimeout(function() {\n                            eachAsync(arr, fn, finalFunc, chunkSize, i);\n                        });\n                    }\n\n                } else if (finalFunc) {\n                    finalFunc();\n                }\n            }\n        }\n\n        ////////////////////////////////////////////////////////////////////////////////\n        // Following is the parts of the boost that's common between OGL/Legacy\n\n        /**\n         * Return a full Point object based on the index. \n         * The boost module uses stripped point objects for performance reasons.\n         * @param   {Number} boostPoint A stripped-down point object\n         * @returns {Object} A Point object as per http://api.highcharts.com/highcharts#Point\n         */\n        Series.prototype.getPoint = function(boostPoint) {\n            var point = boostPoint,\n                xData = this.xData || this.options.xData || this.processedXData || false;\n\n            if (boostPoint && !(boostPoint instanceof this.pointClass)) {\n                point = (new this.pointClass()).init( // eslint-disable-line new-cap\n                    this,\n                    this.options.data[boostPoint.i],\n                    xData ? xData[boostPoint.i] : undefined\n                );\n\n                point.category = point.x;\n\n                point.dist = boostPoint.dist;\n                point.distX = boostPoint.distX;\n                point.plotX = boostPoint.plotX;\n                point.plotY = boostPoint.plotY;\n                point.index = boostPoint.i;\n            }\n\n            return point;\n        };\n\n        /**\n         * Return a point instance from the k-d-tree\n         */\n        wrap(Series.prototype, 'searchPoint', function(proceed) {\n            return this.getPoint(\n                proceed.apply(this, [].slice.call(arguments, 1))\n            );\n        });\n\n        /**\n         * Extend series.destroy to also remove the fake k-d-tree points (#5137). \n         * Normally this is handled by Series.destroy that calls Point.destroy, \n         * but the fake search points are not registered like that.\n         */\n        wrap(Series.prototype, 'destroy', function(proceed) {\n            var series = this,\n                chart = series.chart;\n\n            if (chart.markerGroup === series.markerGroup) {\n                series.markerGroup = null;\n            }\n\n            if (chart.hoverPoints) {\n                chart.hoverPoints = grep(chart.hoverPoints, function(point) {\n                    return point.series === series;\n                });\n            }\n\n            if (chart.hoverPoint && chart.hoverPoint.series === series) {\n                chart.hoverPoint = null;\n            }\n\n            proceed.call(this);\n        });\n\n        /**\n         * Do not compute extremes when min and max are set.\n         * If we use this in the core, we can add the hook \n         * to hasExtremes to the methods directly.\n         */\n        wrap(Series.prototype, 'getExtremes', function(proceed) {\n            if (!isSeriesBoosting(this) || (!this.hasExtremes || !this.hasExtremes())) {\n                return proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        // Set default options\n        each([\n                'area',\n                'arearange',\n                'column',\n                'line',\n                'scatter',\n                'heatmap',\n                'bubble',\n                'treemap',\n                'heatmap'\n            ],\n            function(type) {\n                if (plotOptions[type]) {\n                    plotOptions[type].boostThreshold = 5000;\n                    plotOptions[type].boostData = [];\n                }\n            }\n        );\n\n        /**\n         * Override a bunch of methods the same way. If the number of points is \n         * below the threshold, run the original method. If not, check for a \n         * canvas version or do nothing.\n         *\n         * Note that we're not overriding any of these for heatmaps.\n         */\n        each([\n            'translate',\n            'generatePoints',\n            'drawTracker',\n            'drawPoints',\n            'render'\n        ], function(method) {\n            function branch(proceed) {\n                var letItPass = this.options.stacking &&\n                    (method === 'translate' || method === 'generatePoints');\n\n                if (!isSeriesBoosting(this) ||\n                    letItPass ||\n                    this.type === 'heatmap' ||\n                    this.type === 'treemap'\n                ) {\n\n                    // Clear image\n                    if (method === 'render' && this.image && !isChartSeriesBoosting(this.chart)) {\n                        this.image.attr({\n                            href: ''\n                        });\n                        this.animate = null; // We're zooming in, don't run animation\n                    }\n\n                    proceed.call(this);\n\n                    // If a canvas version of the method exists, like renderCanvas(), run\n                } else if (this[method + 'Canvas']) {\n                    this[method + 'Canvas']();\n                }\n            }\n\n            wrap(Series.prototype, method, branch);\n\n            // A special case for some types - their translate method is already wrapped\n            if (method === 'translate') {\n                if (seriesTypes.column) {\n                    wrap(seriesTypes.column.prototype, method, branch);\n                }\n\n                if (seriesTypes.arearange) {\n                    wrap(seriesTypes.arearange.prototype, method, branch);\n                }\n\n                if (seriesTypes.treemap) {\n                    wrap(seriesTypes.treemap.prototype, method, branch);\n                }\n            }\n        });\n\n        /*\n         * Returns true if the current browser supports webgl\n         */\n        function hasWebGLSupport() {\n            var i = 0,\n                canvas,\n                contexts = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'],\n                context = false;\n\n            if (typeof win.WebGLRenderingContext !== 'undefined') {\n                canvas = doc.createElement('canvas');\n\n                for (; i < contexts.length; i++) {\n                    try {\n                        context = canvas.getContext(contexts[i]);\n                        if (typeof context !== 'undefined' && context !== null) {\n                            return true;\n                        }\n                    } catch (e) {\n\n                    }\n                }\n            }\n\n            return false;\n        }\n\n        /* Used for treemap|heatmap.drawPoints */\n        function pointDrawHandler(proceed) {\n            if (!isSeriesBoosting(this)) {\n                return proceed.call(this);\n            }\n\n            //Make sure we have a valid OGL context\n            var renderer = createAndAttachRenderer(this.chart, this);\n\n            if (renderer) {\n                allocateIfNotSeriesBoosting(renderer, this);\n                renderer.pushSeries(this);\n            }\n\n            renderIfNotSeriesBoosting(renderer, this);\n        }\n\n\n\n        ////////////////////////////////////////////////////////////////////////////////\n        // We're wrapped in a closure, so just return if there's no webgl support\n\n        if (!hasWebGLSupport()) {\n            if (typeof H.initCanvasBoost !== 'undefined') {\n                // Fallback to canvas boost\t\t\n                H.initCanvasBoost();\n            } else {\n                H.error(26);\n            }\n        } else {\n\n            ////////////////////////////////////////////////////////////////////////////\n            // GL-SPECIFIC WRAPPINGS FOLLOWS\n\n            /** If the series is a heatmap or treemap, or if the series is not boosting\n             *  do the default behaviour. Otherwise, process if the series has no \n             *  extremes.\n             */\n            wrap(Series.prototype, 'processData', function(proceed) {\n                // If this is a heatmap, do default behaviour\n                if (!isSeriesBoosting(this) ||\n                    this.type === 'heatmap' ||\n                    this.type === 'treemap') {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n\n                if (!this.hasExtremes || !this.hasExtremes(true)) {\n                    proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n                }\n            });\n\n            H.extend(Series.prototype, {\n                pointRange: 0,\n                directTouch: false,\n                allowDG: false, // No data grouping, let boost handle large data \n                hasExtremes: function(checkX) {\n                    var options = this.options,\n                        data = options.data,\n                        xAxis = this.xAxis && this.xAxis.options,\n                        yAxis = this.yAxis && this.yAxis.options;\n\n                    return data.length > (options.boostThreshold || Number.MAX_VALUE) &&\n                        isNumber(yAxis.min) && isNumber(yAxis.max) &&\n                        (!checkX || (isNumber(xAxis.min) && isNumber(xAxis.max)));\n                },\n\n                /**\n                 * If implemented in the core, parts of this can probably be \n                 * shared with other similar methods in Highcharts.\n                 */\n                destroyGraphics: function() {\n                    var series = this,\n                        points = this.points,\n                        point,\n                        i;\n\n                    if (points) {\n                        for (i = 0; i < points.length; i = i + 1) {\n                            point = points[i];\n                            if (point && point.graphic) {\n                                point.graphic = point.graphic.destroy();\n                            }\n                        }\n                    }\n\n                    each(['graph', 'area', 'tracker'], function(prop) {\n                        if (series[prop]) {\n                            series[prop] = series[prop].destroy();\n                        }\n                    });\n                },\n\n                renderCanvas: function() {\n                    var series = this,\n                        options = series.options || {},\n                        renderer = false,\n                        chart = series.chart,\n                        xAxis = this.xAxis,\n                        yAxis = this.yAxis,\n                        //ctx,\n                        //c = 0,\n                        xData = options.xData || series.processedXData,\n                        yData = options.yData || series.processedYData,\n\n                        rawData = options.data,\n                        xExtremes = xAxis.getExtremes(),\n                        xMin = xExtremes.min,\n                        xMax = xExtremes.max,\n                        yExtremes = yAxis.getExtremes(),\n                        yMin = yExtremes.min,\n                        yMax = yExtremes.max,\n                        pointTaken = {},\n                        lastClientX,\n                        sampling = !!series.sampling,\n                        points,\n                        enableMouseTracking = options.enableMouseTracking !== false,\n                        threshold = options.threshold,\n                        yBottom = yAxis.getThreshold(threshold),\n                        isRange = series.pointArrayMap &&\n                        series.pointArrayMap.join(',') === 'low,high',\n                        isStacked = !!options.stacking,\n                        cropStart = series.cropStart || 0,\n                        requireSorting = series.requireSorting,\n                        useRaw = !xData,\n                        minVal,\n                        maxVal,\n                        minI,\n                        maxI,\n\n                        addKDPoint = function(clientX, plotY, i) {\n                            //Shaves off about 60ms compared to repeated concatination\n                            index = clientX + ',' + plotY;\n\n                            // The k-d tree requires series points. \n                            // Reduce the amount of points, since the time to build the \n                            // tree increases exponentially.\n                            if (enableMouseTracking && !pointTaken[index]) {\n                                pointTaken[index] = true;\n\n                                if (chart.inverted) {\n                                    clientX = xAxis.len - clientX;\n                                    plotY = yAxis.len - plotY;\n                                }\n\n                                points.push({\n                                    clientX: clientX,\n                                    plotX: clientX,\n                                    plotY: plotY,\n                                    i: cropStart + i\n                                });\n                            }\n                        };\n\n                    // Get or create the renderer\n                    renderer = createAndAttachRenderer(chart, series);\n\n                    if (!this.visible) {\n                        if (!isChartSeriesBoosting(chart) && renderer) {\n                            renderer.clear();\n                            this.image.attr({\n                                href: ''\n                            });\n                        }\n                        return;\n                    }\n\n                    // If we are zooming out from SVG mode, destroy the graphics\n                    if (this.points || this.graph) {\n                        this.destroyGraphics();\n                    }\n\n                    // If we're rendering per. series we should create the marker groups\n                    // as usual.\n                    if (!isChartSeriesBoosting(chart)) {\n                        this.markerGroup = series.plotGroup(\n                            'markerGroup',\n                            'markers',\n                            true,\n                            1,\n                            chart.seriesGroup\n                        );\n                    } else {\n                        //Use a single group for the markers\n                        this.markerGroup = chart.markerGroup;\n                    }\n\n                    points = this.points = [];\n\n                    // Do not start building while drawing \n                    series.buildKDTree = noop;\n\n                    if (renderer) {\n                        allocateIfNotSeriesBoosting(renderer, this);\n                        renderer.pushSeries(series);\n                        // Perform the actual renderer if we're on series level\n                        renderIfNotSeriesBoosting(renderer, this, chart);\n                        //console.log(series, chart);\n                    }\n\n                    /* This builds the KD-tree */\n                    function processPoint(d, i) {\n                        var x,\n                            y,\n                            clientX,\n                            plotY,\n                            isNull,\n                            low,\n                            chartDestroyed = typeof chart.index === 'undefined',\n                            isYInside = true;\n\n                        if (!chartDestroyed) {\n                            if (useRaw) {\n                                x = d[0];\n                                y = d[1];\n                            } else {\n                                x = d;\n                                y = yData[i];\n                            }\n\n                            // Resolve low and high for range series\n                            if (isRange) {\n                                if (useRaw) {\n                                    y = d.slice(1, 3);\n                                }\n                                low = y[0];\n                                y = y[1];\n                            } else if (isStacked) {\n                                x = d.x;\n                                y = d.stackY;\n                                low = y - d.y;\n                            }\n\n                            isNull = y === null;\n\n                            // Optimize for scatter zooming\n                            if (!requireSorting) {\n                                isYInside = y >= yMin && y <= yMax;\n                            }\n\n                            if (!isNull && x >= xMin && x <= xMax && isYInside) {\n\n                                // We use ceil to allow the KD tree to work with sub\n                                // pixels, which can be used in boost to space pixels\n                                clientX = Math.ceil(xAxis.toPixels(x, true));\n\n                                if (sampling) {\n                                    if (minI === undefined || clientX === lastClientX) {\n                                        if (!isRange) {\n                                            low = y;\n                                        }\n                                        if (maxI === undefined || y > maxVal) {\n                                            maxVal = y;\n                                            maxI = i;\n                                        }\n                                        if (minI === undefined || low < minVal) {\n                                            minVal = low;\n                                            minI = i;\n                                        }\n\n                                    }\n                                    if (clientX !== lastClientX) { // Add points and reset\n                                        if (minI !== undefined) { // then maxI is also a number\n                                            plotY = yAxis.toPixels(maxVal, true);\n                                            yBottom = yAxis.toPixels(minVal, true);\n\n                                            addKDPoint(clientX, plotY, maxI);\n                                            if (yBottom !== plotY) {\n                                                addKDPoint(clientX, yBottom, minI);\n                                            }\n                                        }\n\n                                        minI = maxI = undefined;\n                                        lastClientX = clientX;\n                                    }\n                                } else {\n                                    plotY = Math.ceil(yAxis.toPixels(y, true));\n                                    addKDPoint(clientX, plotY, i);\n                                }\n                            }\n                        }\n\n                        return !chartDestroyed;\n                    }\n\n                    function doneProcessing() {\n                        fireEvent(series, 'renderedCanvas');\n                        // Pass tests in Pointer. \n                        // Replace this with a single property, and replace when zooming\n                        // in below boostThreshold.\n                        series.directTouch = false;\n                        series.options.stickyTracking = true;\n\n                        // Go back to prototype, ready to build\n                        delete series.buildKDTree;\n                        series.buildKDTree();\n                    }\n\n                    // Loop over the points to build the k-d tree\n                    eachAsync(\n                        isStacked ? series.data : (xData || rawData),\n                        processPoint,\n                        doneProcessing,\n                        chart.renderer.forExport ? Number.MAX_VALUE : undefined\n                    );\n                }\n            });\n\n            /*\n             * We need to handle heatmaps separatly, since we can't perform the\n             * size/color calculations in the shader easily.\n             *\n             * This likely needs future optimization.\n             *\n             */\n            each(['heatmap', 'treemap'],\n                function(t) {\n                    if (seriesTypes[t]) {\n                        wrap(seriesTypes[t].prototype, 'drawPoints', pointDrawHandler);\n                        seriesTypes[t].prototype.directTouch = false; // Use k-d-tree\n                    }\n                }\n            );\n\n            if (seriesTypes.bubble) {\n                // By default, the bubble series does not use the KD-tree, so force it\n                // to.\n                delete seriesTypes.bubble.prototype.buildKDTree;\n                seriesTypes.bubble.prototype.directTouch = false;\n\n                // Needed for markers to work correctly\n                wrap(\n                    seriesTypes.bubble.prototype,\n                    'markerAttribs',\n                    function(proceed) {\n                        if (isSeriesBoosting(this)) {\n                            return false;\n                        }\n                        return proceed.apply(this, [].slice.call(arguments, 1));\n                    }\n                );\n            }\n\n            seriesTypes.scatter.prototype.fill = true;\n\n            extend(seriesTypes.area.prototype, {\n                fill: true,\n                fillOpacity: true,\n                sampling: true\n            });\n\n            extend(seriesTypes.column.prototype, {\n                fill: true,\n                sampling: true\n            });\n\n            wrap(Series.prototype, 'setVisible', function(proceed, vis) {\n                proceed.call(this, vis, false);\n                if (this.visible === false && this.ogl && this.canvas && this.image) {\n                    this.ogl.clear();\n                    this.image.attr({\n                        href: ''\n                    });\n                } else {\n                    this.chart.redraw();\n                }\n            });\n\n            /**\n             * Take care of the canvas blitting\n             */\n            H.Chart.prototype.callbacks.push(function(chart) {\n\n                /* Convert chart-level canvas to image */\n                function canvasToSVG() {\n                    if (chart.ogl && isChartSeriesBoosting(chart)) {\n                        chart.ogl.render(chart);\n                    }\n                }\n\n                /* Clear chart-level canvas */\n                function preRender() {\n\n                    if (!isChartSeriesBoosting(chart) && chart.didBoost) {\n                        chart.didBoost = false;\n                        // Clear the canvas\n                        if (chart.image) {\n                            chart.image.attr({\n                                href: ''\n                            });\n                        }\n                    }\n\n                    if (chart.canvas && chart.ogl && isChartSeriesBoosting(chart)) {\n                        chart.didBoost = true;\n\n                        // Allocate\n                        chart.ogl.allocateBuffer(chart);\n                    }\n\n                    //see #6518 + #6739\n                    if (chart.markerGroup && chart.xAxis && chart.xAxis.length > 0 && chart.yAxis && chart.yAxis.length > 0) {\n                        chart.markerGroup.translate(\n                            chart.xAxis[0].pos,\n                            chart.yAxis[0].pos\n                        );\n                    }\n\n                }\n\n                addEvent(chart, 'predraw', preRender);\n                addEvent(chart, 'render', canvasToSVG);\n            });\n        } // if hasCanvasSupport\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/broken-axis.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(h){\"object\"===typeof module&&module.exports?module.exports=h:h(Highcharts)})(function(h){(function(f){function h(){return Array.prototype.slice.call(arguments,1)}function u(b){b.apply(this);this.drawBreaks(this.xAxis,[\"x\"]);this.drawBreaks(this.yAxis,r(this.pointArrayMap,[\"y\"]))}var r=f.pick,g=f.wrap,q=f.each,y=f.extend,z=f.isArray,v=f.fireEvent,t=f.Axis,A=f.Series;y(t.prototype,{isInBreak:function(b,e){var c=b.repeat||Infinity,a=b.from,d=b.to-b.from;e=e>=a?(e-a)%c:c-(a-e)%c;return b.inclusive?\ne<=d:e<d&&0!==e},isInAnyBreak:function(b,e){var c=this.options.breaks,a=c&&c.length,d,n,w;if(a){for(;a--;)this.isInBreak(c[a],b)&&(d=!0,n||(n=r(c[a].showPoints,this.isXAxis?!1:!0)));w=d&&e?d&&!n:d}return w}});g(t.prototype,\"setTickPositions\",function(b){b.apply(this,Array.prototype.slice.call(arguments,1));if(this.options.breaks){var e=this.tickPositions,c=this.tickPositions.info,a=[],d;for(d=0;d<e.length;d++)this.isInAnyBreak(e[d])||a.push(e[d]);this.tickPositions=a;this.tickPositions.info=c}});\ng(t.prototype,\"init\",function(b,e,c){var a=this;c.breaks&&c.breaks.length&&(c.ordinal=!1);b.call(this,e,c);b=this.options.breaks;a.isBroken=z(b)&&!!b.length;a.isBroken&&(a.val2lin=function(d){var n=d,b,c;for(c=0;c<a.breakArray.length;c++)if(b=a.breakArray[c],b.to<=d)n-=b.len;else if(b.from>=d)break;else if(a.isInBreak(b,d)){n-=d-b.from;break}return n},a.lin2val=function(d){var b,c;for(c=0;c<a.breakArray.length&&!(b=a.breakArray[c],b.from>=d);c++)b.to<d?d+=b.len:a.isInBreak(b,d)&&(d+=b.len);return d},\na.setExtremes=function(a,b,c,e,f){for(;this.isInAnyBreak(a);)a-=this.closestPointRange;for(;this.isInAnyBreak(b);)b-=this.closestPointRange;t.prototype.setExtremes.call(this,a,b,c,e,f)},a.setAxisTranslation=function(b){t.prototype.setAxisTranslation.call(this,b);b=a.options.breaks;var c=[],d=[],e=0,f,l,m=a.userMin||a.min,p=a.userMax||a.max,h=r(a.pointRangePadding,0),k,g;q(b,function(b){l=b.repeat||Infinity;a.isInBreak(b,m)&&(m+=b.to%l-m%l);a.isInBreak(b,p)&&(p-=p%l-b.from%l)});q(b,function(a){k=a.from;\nfor(l=a.repeat||Infinity;k-l>m;)k-=l;for(;k<m;)k+=l;for(g=k;g<p;g+=l)c.push({value:g,move:\"in\"}),c.push({value:g+(a.to-a.from),move:\"out\",size:a.breakSize})});c.sort(function(a,b){return a.value===b.value?(\"in\"===a.move?0:1)-(\"in\"===b.move?0:1):a.value-b.value});f=0;k=m;q(c,function(a){f+=\"in\"===a.move?1:-1;1===f&&\"in\"===a.move&&(k=a.value);0===f&&(d.push({from:k,to:a.value,len:a.value-k-(a.size||0)}),e+=a.value-k-(a.size||0))});a.breakArray=d;a.unitLength=p-m-e+h;v(a,\"afterBreaks\");a.options.staticScale?\na.transA=a.options.staticScale:a.unitLength&&(a.transA*=(p-a.min+h)/a.unitLength);h&&(a.minPixelPadding=a.transA*a.minPointOffset);a.min=m;a.max=p})});g(A.prototype,\"generatePoints\",function(b){b.apply(this,h(arguments));var e=this.xAxis,c=this.yAxis,a=this.points,d,f=a.length,g=this.options.connectNulls,x;if(e&&c&&(e.options.breaks||c.options.breaks))for(;f--;)d=a[f],x=null===d.y&&!1===g,x||!e.isInAnyBreak(d.x,!0)&&!c.isInAnyBreak(d.y,!0)||(a.splice(f,1),this.data[f]&&this.data[f].destroyElements())});\nf.Series.prototype.drawBreaks=function(b,e){var c=this,a=c.points,d,f,g,h;b&&q(e,function(e){d=b.breakArray||[];f=b.isXAxis?b.min:r(c.options.threshold,b.min);q(a,function(a){h=r(a[\"stack\"+e.toUpperCase()],a[e]);q(d,function(c){g=!1;if(f<c.from&&h>c.to||f>c.from&&h<c.from)g=\"pointBreak\";else if(f<c.from&&h>c.from&&h<c.to||f>c.from&&h>c.to&&h<c.from)g=\"pointInBreak\";g&&v(b,g,{point:a,brk:c})})})})};f.Series.prototype.gappedPath=function(){var b=this.options.gapSize,e=this.points.slice(),c=e.length-\n1;if(b&&0<c)for(;c--;)e[c+1].x-e[c].x>this.closestPointRange*b&&e.splice(c+1,0,{isNull:!0});return this.getGraphPath(e)};g(f.seriesTypes.column.prototype,\"drawPoints\",u);g(f.Series.prototype,\"drawPoints\",u)})(h)});\n"
  },
  {
    "path": "assets/highcharts/modules/broken-axis.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var pick = H.pick,\n            wrap = H.wrap,\n            each = H.each,\n            extend = H.extend,\n            isArray = H.isArray,\n            fireEvent = H.fireEvent,\n            Axis = H.Axis,\n            Series = H.Series;\n\n        function stripArguments() {\n            return Array.prototype.slice.call(arguments, 1);\n        }\n\n        extend(Axis.prototype, {\n            isInBreak: function(brk, val) {\n                var ret,\n                    repeat = brk.repeat || Infinity,\n                    from = brk.from,\n                    length = brk.to - brk.from,\n                    test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));\n\n                if (!brk.inclusive) {\n                    ret = test < length && test !== 0;\n                } else {\n                    ret = test <= length;\n                }\n                return ret;\n            },\n\n            isInAnyBreak: function(val, testKeep) {\n\n                var breaks = this.options.breaks,\n                    i = breaks && breaks.length,\n                    inbrk,\n                    keep,\n                    ret;\n\n\n                if (i) {\n\n                    while (i--) {\n                        if (this.isInBreak(breaks[i], val)) {\n                            inbrk = true;\n                            if (!keep) {\n                                keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);\n                            }\n                        }\n                    }\n\n                    if (inbrk && testKeep) {\n                        ret = inbrk && !keep;\n                    } else {\n                        ret = inbrk;\n                    }\n                }\n                return ret;\n            }\n        });\n\n        wrap(Axis.prototype, 'setTickPositions', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n            if (this.options.breaks) {\n                var axis = this,\n                    tickPositions = this.tickPositions,\n                    info = this.tickPositions.info,\n                    newPositions = [],\n                    i;\n\n                for (i = 0; i < tickPositions.length; i++) {\n                    if (!axis.isInAnyBreak(tickPositions[i])) {\n                        newPositions.push(tickPositions[i]);\n                    }\n                }\n\n                this.tickPositions = newPositions;\n                this.tickPositions.info = info;\n            }\n        });\n\n        wrap(Axis.prototype, 'init', function(proceed, chart, userOptions) {\n            var axis = this,\n                breaks;\n            // Force Axis to be not-ordinal when breaks are defined\n            if (userOptions.breaks && userOptions.breaks.length) {\n                userOptions.ordinal = false;\n            }\n            proceed.call(this, chart, userOptions);\n            breaks = this.options.breaks;\n            axis.isBroken = (isArray(breaks) && !!breaks.length);\n            if (axis.isBroken) {\n                axis.val2lin = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.to <= val) {\n                            nval -= brk.len;\n                        } else if (brk.from >= val) {\n                            break;\n                        } else if (axis.isInBreak(brk, val)) {\n                            nval -= (val - brk.from);\n                            break;\n                        }\n                    }\n\n                    return nval;\n                };\n\n                axis.lin2val = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.from >= nval) {\n                            break;\n                        } else if (brk.to < nval) {\n                            nval += brk.len;\n                        } else if (axis.isInBreak(brk, nval)) {\n                            nval += brk.len;\n                        }\n                    }\n                    return nval;\n                };\n\n                axis.setExtremes = function(newMin, newMax, redraw, animation, eventArguments) {\n                    // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )\n                    while (this.isInAnyBreak(newMin)) {\n                        newMin -= this.closestPointRange;\n                    }\n                    while (this.isInAnyBreak(newMax)) {\n                        newMax -= this.closestPointRange;\n                    }\n                    Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);\n                };\n\n                axis.setAxisTranslation = function(saveOld) {\n                    Axis.prototype.setAxisTranslation.call(this, saveOld);\n\n                    var breaks = axis.options.breaks,\n                        breakArrayT = [], // Temporary one\n                        breakArray = [],\n                        length = 0,\n                        inBrk,\n                        repeat,\n                        min = axis.userMin || axis.min,\n                        max = axis.userMax || axis.max,\n                        pointRangePadding = pick(axis.pointRangePadding, 0),\n                        start,\n                        i;\n\n                    // Min & max check (#4247)\n                    each(breaks, function(brk) {\n                        repeat = brk.repeat || Infinity;\n                        if (axis.isInBreak(brk, min)) {\n                            min += (brk.to % repeat) - (min % repeat);\n                        }\n                        if (axis.isInBreak(brk, max)) {\n                            max -= (max % repeat) - (brk.from % repeat);\n                        }\n                    });\n\n                    // Construct an array holding all breaks in the axis\n                    each(breaks, function(brk) {\n                        start = brk.from;\n                        repeat = brk.repeat || Infinity;\n\n                        while (start - repeat > min) {\n                            start -= repeat;\n                        }\n                        while (start < min) {\n                            start += repeat;\n                        }\n\n                        for (i = start; i < max; i += repeat) {\n                            breakArrayT.push({\n                                value: i,\n                                move: 'in'\n                            });\n                            breakArrayT.push({\n                                value: i + (brk.to - brk.from),\n                                move: 'out',\n                                size: brk.breakSize\n                            });\n                        }\n                    });\n\n                    breakArrayT.sort(function(a, b) {\n                        var ret;\n                        if (a.value === b.value) {\n                            ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);\n                        } else {\n                            ret = a.value - b.value;\n                        }\n                        return ret;\n                    });\n\n                    // Simplify the breaks\n                    inBrk = 0;\n                    start = min;\n\n                    each(breakArrayT, function(brk) {\n                        inBrk += (brk.move === 'in' ? 1 : -1);\n\n                        if (inBrk === 1 && brk.move === 'in') {\n                            start = brk.value;\n                        }\n                        if (inBrk === 0) {\n                            breakArray.push({\n                                from: start,\n                                to: brk.value,\n                                len: brk.value - start - (brk.size || 0)\n                            });\n                            length += brk.value - start - (brk.size || 0);\n                        }\n                    });\n\n                    axis.breakArray = breakArray;\n\n                    // Used with staticScale, and below, the actual axis length when\n                    // breaks are substracted.\n                    axis.unitLength = max - min - length + pointRangePadding;\n\n                    fireEvent(axis, 'afterBreaks');\n\n                    if (axis.options.staticScale) {\n                        axis.transA = axis.options.staticScale;\n                    } else if (axis.unitLength) {\n                        axis.transA *= (max - axis.min + pointRangePadding) /\n                            axis.unitLength;\n                    }\n\n                    if (pointRangePadding) {\n                        axis.minPixelPadding = axis.transA * axis.minPointOffset;\n                    }\n\n                    axis.min = min;\n                    axis.max = max;\n                };\n            }\n        });\n\n        wrap(Series.prototype, 'generatePoints', function(proceed) {\n\n            proceed.apply(this, stripArguments(arguments));\n\n            var series = this,\n                xAxis = series.xAxis,\n                yAxis = series.yAxis,\n                points = series.points,\n                point,\n                i = points.length,\n                connectNulls = series.options.connectNulls,\n                nullGap;\n\n\n            if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {\n                while (i--) {\n                    point = points[i];\n\n                    nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)\n                    if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {\n                        points.splice(i, 1);\n                        if (this.data[i]) {\n                            this.data[i].destroyElements(); // removes the graphics for this point if they exist\n                        }\n                    }\n                }\n            }\n\n        });\n\n        function drawPointsWrapped(proceed) {\n            proceed.apply(this);\n            this.drawBreaks(this.xAxis, ['x']);\n            this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));\n        }\n\n        H.Series.prototype.drawBreaks = function(axis, keys) {\n            var series = this,\n                points = series.points,\n                breaks,\n                threshold,\n                eventName,\n                y;\n\n            if (!axis) {\n                return; // #5950\n            }\n\n            each(keys, function(key) {\n                breaks = axis.breakArray || [];\n                threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);\n                each(points, function(point) {\n                    y = pick(point['stack' + key.toUpperCase()], point[key]);\n                    each(breaks, function(brk) {\n                        eventName = false;\n\n                        if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {\n                            eventName = 'pointBreak';\n                        } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break\n                            eventName = 'pointInBreak';\n                        }\n                        if (eventName) {\n                            fireEvent(axis, eventName, {\n                                point: point,\n                                brk: brk\n                            });\n                        }\n                    });\n                });\n            });\n        };\n\n\n        /**\n         * Extend getGraphPath by identifying gaps in the data so that we can draw a gap\n         * in the line or area. This was moved from ordinal axis module to broken axis\n         * module as of #5045.\n         */\n        H.Series.prototype.gappedPath = function() {\n            var gapSize = this.options.gapSize,\n                points = this.points.slice(),\n                i = points.length - 1;\n\n            if (gapSize && i > 0) { // #5008\n\n                // extension for ordinal breaks\n                while (i--) {\n                    if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {\n                        points.splice( // insert after this one\n                            i + 1,\n                            0, {\n                                isNull: true\n                            }\n                        );\n                    }\n                }\n            }\n\n            // Call base method\n            return this.getGraphPath(points);\n        };\n\n        wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);\n        wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/data.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Data module\n\n (c) 2012-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(g){var p=g.win.document,m=g.each,z=g.objectEach,A=g.pick,w=g.inArray,x=g.isNumber,B=g.splat,n,u=function(b,a){this.init(b,a)};g.extend(u.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.firstRowAsNames=A(b.firstRowAsNames,!0);this.decimalRegex=b.decimalPoint&&new RegExp(\"^(-?[0-9]+)\"+b.decimalPoint+\"([0-9]+)$\");this.rawColumns=\n[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=this.options,d=[],f=function(b){return(g.seriesTypes[b||\"line\"].prototype.pointArrayMap||[0]).length},e=b&&b.chart&&b.chart.type,c=[],k=[],t=0,h;m(b&&b.series||[],function(b){c.push(f(b.type||e))});m(a&&a.seriesMapping||[],function(b){d.push(b.x||0)});0===d.length&&d.push(0);m(a&&a.seriesMapping||[],function(a){var d=new n,C=c[t]||f(e),\nq=g.seriesTypes[((b&&b.series||[])[t]||{}).type||e||\"line\"].prototype.pointArrayMap||[\"y\"];d.addColumnReader(a.x,\"x\");z(a,function(b,a){\"x\"!==a&&d.addColumnReader(b,a)});for(h=0;h<C;h++)d.hasReader(q[h])||d.addColumnReader(void 0,q[h]);k.push(d);t++});a=g.seriesTypes[e||\"line\"].prototype.pointArrayMap;void 0===a&&(a=[\"y\"]);this.valueCount={global:f(e),xColumns:d,individual:c,seriesBuilders:k,globalPointArrayMap:a}},dataFound:function(){this.options.switchRowsAndColumns&&(this.columns=this.rowsToColumns(this.columns));\nthis.getColumnDistribution();this.parseTypes();!1!==this.parsed()&&this.complete()},parseCSV:function(){var b=this,a=this.options,d=a.csv,f=this.columns,e=a.startRow||0,c=a.endRow||Number.MAX_VALUE,k=a.startColumn||0,t=a.endColumn||Number.MAX_VALUE,h,g,y=0;d&&(g=d.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\").split(a.lineDelimiter||\"\\n\"),h=a.itemDelimiter||(-1!==d.indexOf(\"\\t\")?\"\\t\":\",\"),m(g,function(a,d){var g=b.trim(a),q=0===g.indexOf(\"#\");d>=e&&d<=c&&!q&&\"\"!==g&&(a=a.split(h),m(a,function(b,a){a>=\nk&&a<=t&&(f[a-k]||(f[a-k]=[]),f[a-k][y]=b)}),y+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,d=this.columns,f=b.startRow||0,e=b.endRow||Number.MAX_VALUE,c=b.startColumn||0,k=b.endColumn||Number.MAX_VALUE;a&&(\"string\"===typeof a&&(a=p.getElementById(a)),m(a.getElementsByTagName(\"tr\"),function(b,a){a>=f&&a<=e&&m(b.children,function(b,e){(\"TD\"===b.tagName||\"TH\"===b.tagName)&&e>=c&&e<=k&&(d[e-c]||(d[e-c]=[]),d[e-c][a-f]=b.innerHTML)})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=\nthis,a=this.options,d=a.googleSpreadsheetKey,f=this.columns,e=a.startRow||0,c=a.endRow||Number.MAX_VALUE,k=a.startColumn||0,g=a.endColumn||Number.MAX_VALUE,h,q;d&&jQuery.ajax({dataType:\"json\",url:\"https://spreadsheets.google.com/feeds/cells/\"+d+\"/\"+(a.googleSpreadsheetWorksheet||\"od6\")+\"/public/values?alt\\x3djson-in-script\\x26callback\\x3d?\",error:a.error,success:function(a){a=a.feed.entry;var d,t=a.length,r=0,n=0,l;for(l=0;l<t;l++)d=a[l],r=Math.max(r,d.gs$cell.col),n=Math.max(n,d.gs$cell.row);for(l=\n0;l<r;l++)l>=k&&l<=g&&(f[l-k]=[],f[l-k].length=Math.min(n,c-e));for(l=0;l<t;l++)d=a[l],h=d.gs$cell.row-1,q=d.gs$cell.col-1,q>=k&&q<=g&&h>=e&&h<=c&&(f[q-k][h-e]=d.content.$t);m(f,function(a){for(l=0;l<a.length;l++)void 0===a[l]&&(a[l]=null)});b.dataFound()}})},trim:function(b,a){\"string\"===typeof b&&(b=b.replace(/^\\s+|\\s+$/g,\"\"),a&&/^[0-9\\s]+$/.test(b)&&(b=b.replace(/\\s/g,\"\")),this.decimalRegex&&(b=b.replace(this.decimalRegex,\"$1.$2\")));return b},parseTypes:function(){for(var b=this.columns,a=b.length;a--;)this.parseColumn(b[a],\na)},parseColumn:function(b,a){var d=this.rawColumns,f=this.columns,e=b.length,c,k,g,h,n=this.firstRowAsNames,m=-1!==w(a,this.valueCount.xColumns),p=[],v=this.chartOptions,r,u=(this.options.columnTypes||[])[a],v=m&&(v&&v.xAxis&&\"category\"===B(v.xAxis)[0].type||\"string\"===u);for(d[a]||(d[a]=[]);e--;)c=p[e]||b[e],g=this.trim(c),h=this.trim(c,!0),k=parseFloat(h),void 0===d[a][e]&&(d[a][e]=g),v||0===e&&n?b[e]=g:+h===k?(b[e]=k,31536E6<k&&\"float\"!==u?b.isDatetime=!0:b.isNumeric=!0,void 0!==b[e+1]&&(r=k>\nb[e+1])):(k=this.parseDate(c),m&&x(k)&&\"float\"!==u?(p[e]=c,b[e]=k,b.isDatetime=!0,void 0!==b[e+1]&&(c=k>b[e+1],c!==r&&void 0!==r&&(this.alternativeFormat?(this.dateFormat=this.alternativeFormat,e=b.length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):b.unsorted=!0),r=c)):(b[e]=\"\"===g?null:g,0!==e&&(b.isDatetime||b.isNumeric)&&(b.mixed=!0)));m&&b.mixed&&(f[a]=d[a]);if(m&&r&&this.options.sort)for(a=0;a<f.length;a++)f[a].reverse(),n&&f[a].unshift(f[a].pop())},dateFormats:{\"YYYY-mm-dd\":{regex:/^([0-9]{4})[\\-\\/\\.]([0-9]{2})[\\-\\/\\.]([0-9]{2})$/,\nparser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}},\"dd/mm/YYYY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[2]-1,+b[1])},alternative:\"mm/dd/YYYY\"},\"mm/dd/YYYY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[1]-1,+b[2])}},\"dd/mm/YY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[2]-1,+b[1])},alternative:\"mm/dd/YY\"},\n\"mm/dd/YY\":{regex:/^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[1]-1,+b[2])}}},parseDate:function(b){var a=this.options.parseDate,d,f,e=this.options.dateFormat||this.dateFormat,c;if(a)d=a(b);else if(\"string\"===typeof b){if(e)a=this.dateFormats[e],(c=b.match(a.regex))&&(d=a.parser(c));else for(f in this.dateFormats)if(a=this.dateFormats[f],c=b.match(a.regex)){this.dateFormat=f;this.alternativeFormat=a.alternative;d=a.parser(c);break}c||(c=Date.parse(b),\n\"object\"===typeof c&&null!==c&&c.getTime?d=c.getTime()-6E4*c.getTimezoneOffset():x(c)&&(d=c-6E4*(new Date(c)).getTimezoneOffset()))}return d},rowsToColumns:function(b){var a,d,f,e,c;if(b)for(c=[],d=b.length,a=0;a<d;a++)for(e=b[a].length,f=0;f<e;f++)c[f]||(c[f]=[]),c[f][a]=b[a][f];return c},parsed:function(){if(this.options.parsed)return this.options.parsed.call(this,this.columns)},getFreeIndexes:function(b,a){var d,f=[],e=[],c;for(d=0;d<b;d+=1)f.push(!0);for(b=0;b<a.length;b+=1)for(c=a[b].getReferencedColumnIndexes(),\nd=0;d<c.length;d+=1)f[c[d]]=!1;for(d=0;d<f.length;d+=1)f[d]&&e.push(d);return e},complete:function(){var b=this.columns,a,d=this.options,f,e,c,k,g=[],h;if(d.complete||d.afterComplete){for(c=0;c<b.length;c++)this.firstRowAsNames&&(b[c].name=b[c].shift());f=[];e=this.getFreeIndexes(b.length,this.valueCount.seriesBuilders);for(c=0;c<this.valueCount.seriesBuilders.length;c++)h=this.valueCount.seriesBuilders[c],h.populateColumns(e)&&g.push(h);for(;0<e.length;){h=new n;h.addColumnReader(0,\"x\");c=w(0,e);\n-1!==c&&e.splice(c,1);for(c=0;c<this.valueCount.global;c++)h.addColumnReader(void 0,this.valueCount.globalPointArrayMap[c]);h.populateColumns(e)&&g.push(h)}0<g.length&&0<g[0].readers.length&&(h=b[g[0].readers[0].columnIndex],void 0!==h&&(h.isDatetime?a=\"datetime\":h.isNumeric||(a=\"category\")));if(\"category\"===a)for(c=0;c<g.length;c++)for(h=g[c],e=0;e<h.readers.length;e++)\"x\"===h.readers[e].configName&&(h.readers[e].configName=\"name\");for(c=0;c<g.length;c++){h=g[c];e=[];for(k=0;k<b[0].length;k++)e[k]=\nh.read(b,k);f[c]={data:e};h.name&&(f[c].name=h.name);\"category\"===a&&(f[c].turboThreshold=0)}b={series:f};a&&(b.xAxis={type:a},\"category\"===a&&(b.xAxis.uniqueNames=!1));d.complete&&d.complete(b);d.afterComplete&&d.afterComplete(b)}}});g.Data=u;g.data=function(b,a){return new u(b,a)};g.wrap(g.Chart.prototype,\"init\",function(b,a,d){var f=this;a&&a.data?g.data(g.extend(a.data,{afterComplete:function(e){var c,k;if(a.hasOwnProperty(\"series\"))if(\"object\"===typeof a.series)for(c=Math.max(a.series.length,\ne.series.length);c--;)k=a.series[c]||{},a.series[c]=g.merge(k,e.series[c]);else delete a.series;a=g.merge(e,a);b.call(f,a,d)}}),a):b.call(f,a,d)});n=function(){this.readers=[];this.pointIsArray=!0};n.prototype.populateColumns=function(b){var a=!0;m(this.readers,function(a){void 0===a.columnIndex&&(a.columnIndex=b.shift())});m(this.readers,function(b){void 0===b.columnIndex&&(a=!1)});return a};n.prototype.read=function(b,a){var d=this.pointIsArray,f=d?[]:{},e;m(this.readers,function(c){var e=b[c.columnIndex][a];\nd?f.push(e):f[c.configName]=e});void 0===this.name&&2<=this.readers.length&&(e=this.getReferencedColumnIndexes(),2<=e.length&&(e.shift(),e.sort(),this.name=b[e.shift()].name));return f};n.prototype.addColumnReader=function(b,a){this.readers.push({columnIndex:b,configName:a});\"x\"!==a&&\"y\"!==a&&void 0!==a&&(this.pointIsArray=!1)};n.prototype.getReferencedColumnIndexes=function(){var b,a=[],d;for(b=0;b<this.readers.length;b+=1)d=this.readers[b],void 0!==d.columnIndex&&a.push(d.columnIndex);return a};\nn.prototype.hasReader=function(b){var a,d;for(a=0;a<this.readers.length;a+=1)if(d=this.readers[a],d.configName===b)return!0}})(p)});\n"
  },
  {
    "path": "assets/highcharts/modules/data.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Data module\n *\n * (c) 2012-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Data module\n         *\n         * (c) 2012-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /* global jQuery */\n\n        // Utilities\n        var win = Highcharts.win,\n            doc = win.document,\n            each = Highcharts.each,\n            objectEach = Highcharts.objectEach,\n            pick = Highcharts.pick,\n            inArray = Highcharts.inArray,\n            isNumber = Highcharts.isNumber,\n            splat = Highcharts.splat,\n            SeriesBuilder;\n\n\n        // The Data constructor\n        var Data = function(dataOptions, chartOptions) {\n            this.init(dataOptions, chartOptions);\n        };\n\n        // Set the prototype properties\n        Highcharts.extend(Data.prototype, {\n\n            /**\n             * Initialize the Data object with the given options\n             */\n            init: function(options, chartOptions) {\n                this.options = options;\n                this.chartOptions = chartOptions;\n                this.columns = options.columns || this.rowsToColumns(options.rows) || [];\n                this.firstRowAsNames = pick(options.firstRowAsNames, true);\n                this.decimalRegex = options.decimalPoint && new RegExp('^(-?[0-9]+)' + options.decimalPoint + '([0-9]+)$');\n\n                // This is a two-dimensional array holding the raw, trimmed string values\n                // with the same organisation as the columns array. It makes it possible\n                // for example to revert from interpreted timestamps to string-based\n                // categories.\n                this.rawColumns = [];\n\n                // No need to parse or interpret anything\n                if (this.columns.length) {\n                    this.dataFound();\n\n                    // Parse and interpret\n                } else {\n\n                    // Parse a CSV string if options.csv is given\n                    this.parseCSV();\n\n                    // Parse a HTML table if options.table is given\n                    this.parseTable();\n\n                    // Parse a Google Spreadsheet \n                    this.parseGoogleSpreadsheet();\n                }\n\n            },\n\n            /**\n             * Get the column distribution. For example, a line series takes a single column for \n             * Y values. A range series takes two columns for low and high values respectively,\n             * and an OHLC series takes four columns.\n             */\n            getColumnDistribution: function() {\n                var chartOptions = this.chartOptions,\n                    options = this.options,\n                    xColumns = [],\n                    getValueCount = function(type) {\n                        return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;\n                    },\n                    getPointArrayMap = function(type) {\n                        return Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap;\n                    },\n                    globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,\n                    individualCounts = [],\n                    seriesBuilders = [],\n                    seriesIndex = 0,\n                    i;\n\n                each((chartOptions && chartOptions.series) || [], function(series) {\n                    individualCounts.push(getValueCount(series.type || globalType));\n                });\n\n                // Collect the x-column indexes from seriesMapping\n                each((options && options.seriesMapping) || [], function(mapping) {\n                    xColumns.push(mapping.x || 0);\n                });\n\n                // If there are no defined series with x-columns, use the first column as x column\n                if (xColumns.length === 0) {\n                    xColumns.push(0);\n                }\n\n                // Loop all seriesMappings and constructs SeriesBuilders from\n                // the mapping options.\n                each((options && options.seriesMapping) || [], function(mapping) {\n                    var builder = new SeriesBuilder(),\n                        numberOfValueColumnsNeeded = individualCounts[seriesIndex] || getValueCount(globalType),\n                        seriesArr = (chartOptions && chartOptions.series) || [],\n                        series = seriesArr[seriesIndex] || {},\n                        pointArrayMap = getPointArrayMap(series.type || globalType) || ['y'];\n\n                    // Add an x reader from the x property or from an undefined column\n                    // if the property is not set. It will then be auto populated later.\n                    builder.addColumnReader(mapping.x, 'x');\n\n                    // Add all column mappings\n                    objectEach(mapping, function(val, name) {\n                        if (name !== 'x') {\n                            builder.addColumnReader(val, name);\n                        }\n                    });\n\n                    // Add missing columns\n                    for (i = 0; i < numberOfValueColumnsNeeded; i++) {\n                        if (!builder.hasReader(pointArrayMap[i])) {\n                            //builder.addNextColumnReader(pointArrayMap[i]);\n                            // Create and add a column reader for the next free column index\n                            builder.addColumnReader(undefined, pointArrayMap[i]);\n                        }\n                    }\n\n                    seriesBuilders.push(builder);\n                    seriesIndex++;\n                });\n\n                var globalPointArrayMap = getPointArrayMap(globalType);\n                if (globalPointArrayMap === undefined) {\n                    globalPointArrayMap = ['y'];\n                }\n\n                this.valueCount = {\n                    global: getValueCount(globalType),\n                    xColumns: xColumns,\n                    individual: individualCounts,\n                    seriesBuilders: seriesBuilders,\n                    globalPointArrayMap: globalPointArrayMap\n                };\n            },\n\n            /**\n             * When the data is parsed into columns, either by CSV, table, GS or direct input,\n             * continue with other operations.\n             */\n            dataFound: function() {\n\n                if (this.options.switchRowsAndColumns) {\n                    this.columns = this.rowsToColumns(this.columns);\n                }\n\n                // Interpret the info about series and columns\n                this.getColumnDistribution();\n\n                // Interpret the values into right types\n                this.parseTypes();\n\n                // Handle columns if a handleColumns callback is given\n                if (this.parsed() !== false) {\n\n                    // Complete if a complete callback is given\n                    this.complete();\n                }\n\n            },\n\n            /**\n             * Parse a CSV input string\n             */\n            parseCSV: function() {\n                var self = this,\n                    options = this.options,\n                    csv = options.csv,\n                    columns = this.columns,\n                    startRow = options.startRow || 0,\n                    endRow = options.endRow || Number.MAX_VALUE,\n                    startColumn = options.startColumn || 0,\n                    endColumn = options.endColumn || Number.MAX_VALUE,\n                    itemDelimiter,\n                    lines,\n                    activeRowNo = 0;\n\n                if (csv) {\n\n                    lines = csv\n                        .replace(/\\r\\n/g, '\\n') // Unix\n                        .replace(/\\r/g, '\\n') // Mac\n                        .split(options.lineDelimiter || '\\n');\n\n                    itemDelimiter = options.itemDelimiter || (csv.indexOf('\\t') !== -1 ? '\\t' : ',');\n\n                    each(lines, function(line, rowNo) {\n                        var trimmed = self.trim(line),\n                            isComment = trimmed.indexOf('#') === 0,\n                            isBlank = trimmed === '',\n                            items;\n\n                        if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {\n                            items = line.split(itemDelimiter);\n                            each(items, function(item, colNo) {\n                                if (colNo >= startColumn && colNo <= endColumn) {\n                                    if (!columns[colNo - startColumn]) {\n                                        columns[colNo - startColumn] = [];\n                                    }\n\n                                    columns[colNo - startColumn][activeRowNo] = item;\n                                }\n                            });\n                            activeRowNo += 1;\n                        }\n                    });\n\n                    this.dataFound();\n                }\n            },\n\n            /**\n             * Parse a HTML table\n             */\n            parseTable: function() {\n                var options = this.options,\n                    table = options.table,\n                    columns = this.columns,\n                    startRow = options.startRow || 0,\n                    endRow = options.endRow || Number.MAX_VALUE,\n                    startColumn = options.startColumn || 0,\n                    endColumn = options.endColumn || Number.MAX_VALUE;\n\n                if (table) {\n\n                    if (typeof table === 'string') {\n                        table = doc.getElementById(table);\n                    }\n\n                    each(table.getElementsByTagName('tr'), function(tr, rowNo) {\n                        if (rowNo >= startRow && rowNo <= endRow) {\n                            each(tr.children, function(item, colNo) {\n                                if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {\n                                    if (!columns[colNo - startColumn]) {\n                                        columns[colNo - startColumn] = [];\n                                    }\n\n                                    columns[colNo - startColumn][rowNo - startRow] = item.innerHTML;\n                                }\n                            });\n                        }\n                    });\n\n                    this.dataFound(); // continue\n                }\n            },\n\n            /**\n             */\n            parseGoogleSpreadsheet: function() {\n                var self = this,\n                    options = this.options,\n                    googleSpreadsheetKey = options.googleSpreadsheetKey,\n                    columns = this.columns,\n                    startRow = options.startRow || 0,\n                    endRow = options.endRow || Number.MAX_VALUE,\n                    startColumn = options.startColumn || 0,\n                    endColumn = options.endColumn || Number.MAX_VALUE,\n                    gr, // google row\n                    gc; // google column\n\n                if (googleSpreadsheetKey) {\n                    jQuery.ajax({\n                        dataType: 'json',\n                        url: 'https://spreadsheets.google.com/feeds/cells/' +\n                            googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +\n                            '/public/values?alt=json-in-script&callback=?',\n                        error: options.error,\n                        success: function(json) {\n                            // Prepare the data from the spreadsheat\n                            var cells = json.feed.entry,\n                                cell,\n                                cellCount = cells.length,\n                                colCount = 0,\n                                rowCount = 0,\n                                i;\n\n                            // First, find the total number of columns and rows that \n                            // are actually filled with data\n                            for (i = 0; i < cellCount; i++) {\n                                cell = cells[i];\n                                colCount = Math.max(colCount, cell.gs$cell.col);\n                                rowCount = Math.max(rowCount, cell.gs$cell.row);\n                            }\n\n                            // Set up arrays containing the column data\n                            for (i = 0; i < colCount; i++) {\n                                if (i >= startColumn && i <= endColumn) {\n                                    // Create new columns with the length of either end-start or rowCount\n                                    columns[i - startColumn] = [];\n\n                                    // Setting the length to avoid jslint warning\n                                    columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);\n                                }\n                            }\n\n                            // Loop over the cells and assign the value to the right\n                            // place in the column arrays\n                            for (i = 0; i < cellCount; i++) {\n                                cell = cells[i];\n                                gr = cell.gs$cell.row - 1; // rows start at 1\n                                gc = cell.gs$cell.col - 1; // columns start at 1\n\n                                // If both row and col falls inside start and end\n                                // set the transposed cell value in the newly created columns\n                                if (gc >= startColumn && gc <= endColumn &&\n                                    gr >= startRow && gr <= endRow) {\n                                    columns[gc - startColumn][gr - startRow] = cell.content.$t;\n                                }\n                            }\n\n                            // Insert null for empty spreadsheet cells (#5298)\n                            each(columns, function(column) {\n                                for (i = 0; i < column.length; i++) {\n                                    if (column[i] === undefined) {\n                                        column[i] = null;\n                                    }\n                                }\n                            });\n\n                            self.dataFound();\n                        }\n                    });\n                }\n            },\n\n            /**\n             * Trim a string from whitespace\n             */\n            trim: function(str, inside) {\n                if (typeof str === 'string') {\n                    str = str.replace(/^\\s+|\\s+$/g, '');\n\n                    // Clear white space insdie the string, like thousands separators\n                    if (inside && /^[0-9\\s]+$/.test(str)) {\n                        str = str.replace(/\\s/g, '');\n                    }\n\n                    if (this.decimalRegex) {\n                        str = str.replace(this.decimalRegex, '$1.$2');\n                    }\n                }\n                return str;\n            },\n\n            /**\n             * Parse numeric cells in to number types and date types in to true dates.\n             */\n            parseTypes: function() {\n                var columns = this.columns,\n                    col = columns.length;\n\n                while (col--) {\n                    this.parseColumn(columns[col], col);\n                }\n\n            },\n\n            /**\n             * Parse a single column. Set properties like .isDatetime and .isNumeric.\n             */\n            parseColumn: function(column, col) {\n                var rawColumns = this.rawColumns,\n                    columns = this.columns,\n                    row = column.length,\n                    val,\n                    floatVal,\n                    trimVal,\n                    trimInsideVal,\n                    firstRowAsNames = this.firstRowAsNames,\n                    isXColumn = inArray(col, this.valueCount.xColumns) !== -1,\n                    dateVal,\n                    backup = [],\n                    diff,\n                    chartOptions = this.chartOptions,\n                    descending,\n                    columnTypes = this.options.columnTypes || [],\n                    columnType = columnTypes[col],\n                    forceCategory = isXColumn && ((chartOptions && chartOptions.xAxis && splat(chartOptions.xAxis)[0].type === 'category') || columnType === 'string');\n\n                if (!rawColumns[col]) {\n                    rawColumns[col] = [];\n                }\n                while (row--) {\n                    val = backup[row] || column[row];\n\n                    trimVal = this.trim(val);\n                    trimInsideVal = this.trim(val, true);\n                    floatVal = parseFloat(trimInsideVal);\n\n                    // Set it the first time\n                    if (rawColumns[col][row] === undefined) {\n                        rawColumns[col][row] = trimVal;\n                    }\n\n                    // Disable number or date parsing by setting the X axis type to category\n                    if (forceCategory || (row === 0 && firstRowAsNames)) {\n                        column[row] = trimVal;\n\n                    } else if (+trimInsideVal === floatVal) { // is numeric\n\n                        column[row] = floatVal;\n\n                        // If the number is greater than milliseconds in a year, assume datetime\n                        if (floatVal > 365 * 24 * 3600 * 1000 && columnType !== 'float') {\n                            column.isDatetime = true;\n                        } else {\n                            column.isNumeric = true;\n                        }\n\n                        if (column[row + 1] !== undefined) {\n                            descending = floatVal > column[row + 1];\n                        }\n\n                        // String, continue to determine if it is a date string or really a string\n                    } else {\n                        dateVal = this.parseDate(val);\n                        // Only allow parsing of dates if this column is an x-column\n                        if (isXColumn && isNumber(dateVal) && columnType !== 'float') { // is date\n                            backup[row] = val;\n                            column[row] = dateVal;\n                            column.isDatetime = true;\n\n                            // Check if the dates are uniformly descending or ascending. If they \n                            // are not, chances are that they are a different time format, so check\n                            // for alternative.\n                            if (column[row + 1] !== undefined) {\n                                diff = dateVal > column[row + 1];\n                                if (diff !== descending && descending !== undefined) {\n                                    if (this.alternativeFormat) {\n                                        this.dateFormat = this.alternativeFormat;\n                                        row = column.length;\n                                        this.alternativeFormat = this.dateFormats[this.dateFormat].alternative;\n                                    } else {\n                                        column.unsorted = true;\n                                    }\n                                }\n                                descending = diff;\n                            }\n\n                        } else { // string\n                            column[row] = trimVal === '' ? null : trimVal;\n                            if (row !== 0 && (column.isDatetime || column.isNumeric)) {\n                                column.mixed = true;\n                            }\n                        }\n                    }\n                }\n\n                // If strings are intermixed with numbers or dates in a parsed column, it is an indication\n                // that parsing went wrong or the data was not intended to display as numbers or dates and \n                // parsing is too aggressive. Fall back to categories. Demonstrated in the \n                // highcharts/demo/column-drilldown sample.\n                if (isXColumn && column.mixed) {\n                    columns[col] = rawColumns[col];\n                }\n\n                // If the 0 column is date or number and descending, reverse all columns. \n                if (isXColumn && descending && this.options.sort) {\n                    for (col = 0; col < columns.length; col++) {\n                        columns[col].reverse();\n                        if (firstRowAsNames) {\n                            columns[col].unshift(columns[col].pop());\n                        }\n                    }\n                }\n            },\n\n            /**\n             * A collection of available date formats, extendable from the outside to support\n             * custom date formats.\n             */\n            dateFormats: {\n                'YYYY-mm-dd': {\n                    regex: /^([0-9]{4})[\\-\\/\\.]([0-9]{2})[\\-\\/\\.]([0-9]{2})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[1], match[2] - 1, +match[3]);\n                    }\n                },\n                'dd/mm/YYYY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3], match[2] - 1, +match[1]);\n                    },\n                    alternative: 'mm/dd/YYYY' // different format with the same regex\n                },\n                'mm/dd/YYYY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{4})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3], match[1] - 1, +match[2]);\n                    }\n                },\n                'dd/mm/YY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3] + 2000, match[2] - 1, +match[1]);\n                    },\n                    alternative: 'mm/dd/YY' // different format with the same regex\n                },\n                'mm/dd/YY': {\n                    regex: /^([0-9]{1,2})[\\-\\/\\.]([0-9]{1,2})[\\-\\/\\.]([0-9]{2})$/,\n                    parser: function(match) {\n                        return Date.UTC(+match[3] + 2000, match[1] - 1, +match[2]);\n                    }\n                }\n            },\n\n            /**\n             * Parse a date and return it as a number. Overridable through options.parseDate.\n             */\n            parseDate: function(val) {\n                var parseDate = this.options.parseDate,\n                    ret,\n                    key,\n                    format,\n                    dateFormat = this.options.dateFormat || this.dateFormat,\n                    match;\n\n                if (parseDate) {\n                    ret = parseDate(val);\n\n                } else if (typeof val === 'string') {\n                    // Auto-detect the date format the first time\n                    if (!dateFormat) {\n                        for (key in this.dateFormats) {\n                            format = this.dateFormats[key];\n                            match = val.match(format.regex);\n                            if (match) {\n                                this.dateFormat = dateFormat = key;\n                                this.alternativeFormat = format.alternative;\n                                ret = format.parser(match);\n                                break;\n                            }\n                        }\n                        // Next time, use the one previously found\n                    } else {\n                        format = this.dateFormats[dateFormat];\n                        match = val.match(format.regex);\n                        if (match) {\n                            ret = format.parser(match);\n                        }\n                    }\n                    // Fall back to Date.parse\t\t\n                    if (!match) {\n                        match = Date.parse(val);\n                        // External tools like Date.js and MooTools extend Date object and\n                        // returns a date.\n                        if (typeof match === 'object' && match !== null && match.getTime) {\n                            ret = match.getTime() - match.getTimezoneOffset() * 60000;\n\n                            // Timestamp\n                        } else if (isNumber(match)) {\n                            ret = match - (new Date(match)).getTimezoneOffset() * 60000;\n                        }\n                    }\n                }\n                return ret;\n            },\n\n            /**\n             * Reorganize rows into columns\n             */\n            rowsToColumns: function(rows) {\n                var row,\n                    rowsLength,\n                    col,\n                    colsLength,\n                    columns;\n\n                if (rows) {\n                    columns = [];\n                    rowsLength = rows.length;\n                    for (row = 0; row < rowsLength; row++) {\n                        colsLength = rows[row].length;\n                        for (col = 0; col < colsLength; col++) {\n                            if (!columns[col]) {\n                                columns[col] = [];\n                            }\n                            columns[col][row] = rows[row][col];\n                        }\n                    }\n                }\n                return columns;\n            },\n\n            /**\n             * A hook for working directly on the parsed columns\n             */\n            parsed: function() {\n                if (this.options.parsed) {\n                    return this.options.parsed.call(this, this.columns);\n                }\n            },\n\n            getFreeIndexes: function(numberOfColumns, seriesBuilders) {\n                var s,\n                    i,\n                    freeIndexes = [],\n                    freeIndexValues = [],\n                    referencedIndexes;\n\n                // Add all columns as free\n                for (i = 0; i < numberOfColumns; i = i + 1) {\n                    freeIndexes.push(true);\n                }\n\n                // Loop all defined builders and remove their referenced columns\n                for (s = 0; s < seriesBuilders.length; s = s + 1) {\n                    referencedIndexes = seriesBuilders[s].getReferencedColumnIndexes();\n\n                    for (i = 0; i < referencedIndexes.length; i = i + 1) {\n                        freeIndexes[referencedIndexes[i]] = false;\n                    }\n                }\n\n                // Collect the values for the free indexes\n                for (i = 0; i < freeIndexes.length; i = i + 1) {\n                    if (freeIndexes[i]) {\n                        freeIndexValues.push(i);\n                    }\n                }\n\n                return freeIndexValues;\n            },\n\n            /**\n             * If a complete callback function is provided in the options, interpret the \n             * columns into a Highcharts options object.\n             */\n            complete: function() {\n\n                var columns = this.columns,\n                    xColumns = [],\n                    type,\n                    options = this.options,\n                    series,\n                    data,\n                    i,\n                    j,\n                    r,\n                    seriesIndex,\n                    chartOptions,\n                    allSeriesBuilders = [],\n                    builder,\n                    freeIndexes,\n                    typeCol,\n                    index;\n\n                xColumns.length = columns.length;\n                if (options.complete || options.afterComplete) {\n\n                    // Get the names and shift the top row\n                    for (i = 0; i < columns.length; i++) {\n                        if (this.firstRowAsNames) {\n                            columns[i].name = columns[i].shift();\n                        }\n                    }\n\n                    // Use the next columns for series\n                    series = [];\n                    freeIndexes = this.getFreeIndexes(columns.length, this.valueCount.seriesBuilders);\n\n                    // Populate defined series\n                    for (seriesIndex = 0; seriesIndex < this.valueCount.seriesBuilders.length; seriesIndex++) {\n                        builder = this.valueCount.seriesBuilders[seriesIndex];\n\n                        // If the builder can be populated with remaining columns, then add it to allBuilders\n                        if (builder.populateColumns(freeIndexes)) {\n                            allSeriesBuilders.push(builder);\n                        }\n                    }\n\n                    // Populate dynamic series\n                    while (freeIndexes.length > 0) {\n                        builder = new SeriesBuilder();\n                        builder.addColumnReader(0, 'x');\n\n                        // Mark index as used (not free)\n                        index = inArray(0, freeIndexes);\n                        if (index !== -1) {\n                            freeIndexes.splice(index, 1);\n                        }\n\n                        for (i = 0; i < this.valueCount.global; i++) {\n                            // Create and add a column reader for the next free column index\n                            builder.addColumnReader(undefined, this.valueCount.globalPointArrayMap[i]);\n                        }\n\n                        // If the builder can be populated with remaining columns, then add it to allBuilders\n                        if (builder.populateColumns(freeIndexes)) {\n                            allSeriesBuilders.push(builder);\n                        }\n                    }\n\n                    // Get the data-type from the first series x column\n                    if (allSeriesBuilders.length > 0 && allSeriesBuilders[0].readers.length > 0) {\n                        typeCol = columns[allSeriesBuilders[0].readers[0].columnIndex];\n                        if (typeCol !== undefined) {\n                            if (typeCol.isDatetime) {\n                                type = 'datetime';\n                            } else if (!typeCol.isNumeric) {\n                                type = 'category';\n                            }\n                        }\n                    }\n                    // Axis type is category, then the \"x\" column should be called \"name\"\n                    if (type === 'category') {\n                        for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) {\n                            builder = allSeriesBuilders[seriesIndex];\n                            for (r = 0; r < builder.readers.length; r++) {\n                                if (builder.readers[r].configName === 'x') {\n                                    builder.readers[r].configName = 'name';\n                                }\n                            }\n                        }\n                    }\n\n                    // Read data for all builders\n                    for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) {\n                        builder = allSeriesBuilders[seriesIndex];\n\n                        // Iterate down the cells of each column and add data to the series\n                        data = [];\n                        for (j = 0; j < columns[0].length; j++) {\n                            data[j] = builder.read(columns, j);\n                        }\n\n                        // Add the series\n                        series[seriesIndex] = {\n                            data: data\n                        };\n                        if (builder.name) {\n                            series[seriesIndex].name = builder.name;\n                        }\n                        if (type === 'category') {\n                            series[seriesIndex].turboThreshold = 0;\n                        }\n                    }\n\n\n\n                    // Do the callback\n                    chartOptions = {\n                        series: series\n                    };\n                    if (type) {\n                        chartOptions.xAxis = {\n                            type: type\n                        };\n                        if (type === 'category') {\n                            chartOptions.xAxis.uniqueNames = false;\n                        }\n                    }\n\n                    if (options.complete) {\n                        options.complete(chartOptions);\n                    }\n\n                    // The afterComplete hook is used internally to avoid conflict with the externally\n                    // available complete option.\n                    if (options.afterComplete) {\n                        options.afterComplete(chartOptions);\n                    }\n                }\n            }\n        });\n\n        // Register the Data prototype and data function on Highcharts\n        Highcharts.Data = Data;\n        Highcharts.data = function(options, chartOptions) {\n            return new Data(options, chartOptions);\n        };\n\n        // Extend Chart.init so that the Chart constructor accepts a new configuration\n        // option group, data.\n        Highcharts.wrap(Highcharts.Chart.prototype, 'init', function(proceed, userOptions, callback) {\n            var chart = this;\n\n            if (userOptions && userOptions.data) {\n                Highcharts.data(Highcharts.extend(userOptions.data, {\n\n                    afterComplete: function(dataOptions) {\n                        var i, series;\n\n                        // Merge series configs\n                        if (userOptions.hasOwnProperty('series')) {\n                            if (typeof userOptions.series === 'object') {\n                                i = Math.max(userOptions.series.length, dataOptions.series.length);\n                                while (i--) {\n                                    series = userOptions.series[i] || {};\n                                    userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);\n                                }\n                            } else { // Allow merging in dataOptions.series (#2856)\n                                delete userOptions.series;\n                            }\n                        }\n\n                        // Do the merge\n                        userOptions = Highcharts.merge(dataOptions, userOptions);\n\n                        proceed.call(chart, userOptions, callback);\n                    }\n                }), userOptions);\n            } else {\n                proceed.call(chart, userOptions, callback);\n            }\n        });\n\n        /**\n         * Creates a new SeriesBuilder. A SeriesBuilder consists of a number\n         * of ColumnReaders that reads columns and give them a name.\n         * Ex: A series builder can be constructed to read column 3 as 'x' and\n         * column 7 and 8 as 'y1' and 'y2'.\n         * The output would then be points/rows of the form {x: 11, y1: 22, y2: 33}\n         * \n         * The name of the builder is taken from the second column. In the above\n         * example it would be the column with index 7.\n         * @constructor\n         */\n        SeriesBuilder = function() {\n            this.readers = [];\n            this.pointIsArray = true;\n        };\n\n        /**\n         * Populates readers with column indexes. A reader can be added without\n         * a specific index and for those readers the index is taken sequentially\n         * from the free columns (this is handled by the ColumnCursor instance).\n         * @returns {boolean}\n         */\n        SeriesBuilder.prototype.populateColumns = function(freeIndexes) {\n            var builder = this,\n                enoughColumns = true;\n\n            // Loop each reader and give it an index if its missing.\n            // The freeIndexes.shift() will return undefined if there\n            // are no more columns.\n            each(builder.readers, function(reader) {\n                if (reader.columnIndex === undefined) {\n                    reader.columnIndex = freeIndexes.shift();\n                }\n            });\n\n            // Now, all readers should have columns mapped. If not\n            // then return false to signal that this series should\n            // not be added.\n            each(builder.readers, function(reader) {\n                if (reader.columnIndex === undefined) {\n                    enoughColumns = false;\n                }\n            });\n\n            return enoughColumns;\n        };\n\n        /**\n         * Reads a row from the dataset and returns a point or array depending\n         * on the names of the readers.\n         * @param columns\n         * @param rowIndex\n         * @returns {Array | Object}\n         */\n        SeriesBuilder.prototype.read = function(columns, rowIndex) {\n            var builder = this,\n                pointIsArray = builder.pointIsArray,\n                point = pointIsArray ? [] : {},\n                columnIndexes;\n\n            // Loop each reader and ask it to read its value.\n            // Then, build an array or point based on the readers names.\n            each(builder.readers, function(reader) {\n                var value = columns[reader.columnIndex][rowIndex];\n                if (pointIsArray) {\n                    point.push(value);\n                } else {\n                    point[reader.configName] = value;\n                }\n            });\n\n            // The name comes from the first column (excluding the x column)\n            if (this.name === undefined && builder.readers.length >= 2) {\n                columnIndexes = builder.getReferencedColumnIndexes();\n                if (columnIndexes.length >= 2) {\n                    // remove the first one (x col)\n                    columnIndexes.shift();\n\n                    // Sort the remaining\n                    columnIndexes.sort();\n\n                    // Now use the lowest index as name column\n                    this.name = columns[columnIndexes.shift()].name;\n                }\n            }\n\n            return point;\n        };\n\n        /**\n         * Creates and adds ColumnReader from the given columnIndex and configName.\n         * ColumnIndex can be undefined and in that case the reader will be given\n         * an index when columns are populated.\n         * @param columnIndex {Number | undefined}\n         * @param configName\n         */\n        SeriesBuilder.prototype.addColumnReader = function(columnIndex, configName) {\n            this.readers.push({\n                columnIndex: columnIndex,\n                configName: configName\n            });\n\n            if (!(configName === 'x' || configName === 'y' || configName === undefined)) {\n                this.pointIsArray = false;\n            }\n        };\n\n        /**\n         * Returns an array of column indexes that the builder will use when\n         * reading data.\n         * @returns {Array}\n         */\n        SeriesBuilder.prototype.getReferencedColumnIndexes = function() {\n            var i,\n                referencedColumnIndexes = [],\n                columnReader;\n\n            for (i = 0; i < this.readers.length; i = i + 1) {\n                columnReader = this.readers[i];\n                if (columnReader.columnIndex !== undefined) {\n                    referencedColumnIndexes.push(columnReader.columnIndex);\n                }\n            }\n\n            return referencedColumnIndexes;\n        };\n\n        /**\n         * Returns true if the builder has a reader for the given configName.\n         * @param configName\n         * @returns {boolean}\n         */\n        SeriesBuilder.prototype.hasReader = function(configName) {\n            var i, columnReader;\n            for (i = 0; i < this.readers.length; i = i + 1) {\n                columnReader = this.readers[i];\n                if (columnReader.configName === configName) {\n                    return true;\n                }\n            }\n            // Else return undefined\n        };\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/drilldown.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Highcharts Drilldown module\n\n Author: Torstein Honsi\n License: www.highcharts.com/license\n\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(f){var n=f.noop,y=f.color,z=f.defaultOptions,h=f.each,p=f.extend,G=f.format,A=f.objectEach,B=f.pick,u=f.wrap,q=f.Chart,v=f.seriesTypes,C=v.pie,r=v.column,D=f.Tick,w=f.fireEvent,E=f.inArray,F=1;p(z.lang,{drillUpText:\"\\u25c1 Back to {series.name}\"});z.drilldown={activeAxisLabelStyle:{cursor:\"pointer\",color:\"#003399\",fontWeight:\"bold\",textDecoration:\"underline\"},activeDataLabelStyle:{cursor:\"pointer\",\ncolor:\"#003399\",fontWeight:\"bold\",textDecoration:\"underline\"},animation:{duration:500},drillUpButton:{position:{align:\"right\",x:-10,y:10}}};f.SVGRenderer.prototype.Element.prototype.fadeIn=function(b){this.attr({opacity:.1,visibility:\"inherit\"}).animate({opacity:B(this.newOpacity,1)},b||{duration:250})};q.prototype.addSeriesAsDrilldown=function(b,a){this.addSingleSeriesAsDrilldown(b,a);this.applyDrilldown()};q.prototype.addSingleSeriesAsDrilldown=function(b,a){var d=b.series,c=d.xAxis,e=d.yAxis,g,\nl=[],k=[],t,m,x;x={color:b.color||d.color};this.drilldownLevels||(this.drilldownLevels=[]);t=d.options._levelNumber||0;(m=this.drilldownLevels[this.drilldownLevels.length-1])&&m.levelNumber!==t&&(m=void 0);a=p(p({_ddSeriesId:F++},x),a);g=E(b,d.points);h(d.chart.series,function(a){a.xAxis!==c||a.isDrilling||(a.options._ddSeriesId=a.options._ddSeriesId||F++,a.options._colorIndex=a.userOptions._colorIndex,a.options._levelNumber=a.options._levelNumber||t,m?(l=m.levelSeries,k=m.levelSeriesOptions):(l.push(a),\nk.push(a.options)))});b=p({levelNumber:t,seriesOptions:d.options,levelSeriesOptions:k,levelSeries:l,shapeArgs:b.shapeArgs,bBox:b.graphic?b.graphic.getBBox():{},color:b.isNull?(new f.Color(y)).setOpacity(0).get():y,lowerSeriesOptions:a,pointOptions:d.options.data[g],pointIndex:g,oldExtremes:{xMin:c&&c.userMin,xMax:c&&c.userMax,yMin:e&&e.userMin,yMax:e&&e.userMax}},x);this.drilldownLevels.push(b);c&&c.names&&(c.names.length=0);a=b.lowerSeries=this.addSeries(a,!1);a.options._levelNumber=t+1;c&&(c.oldPos=\nc.pos,c.userMin=c.userMax=null,e.userMin=e.userMax=null);d.type===a.type&&(a.animate=a.animateDrilldown||n,a.options.animation=!0)};q.prototype.applyDrilldown=function(){var b=this.drilldownLevels,a;b&&0<b.length&&(a=b[b.length-1].levelNumber,h(this.drilldownLevels,function(b){b.levelNumber===a&&h(b.levelSeries,function(c){c.options&&c.options._levelNumber===a&&c.remove(!1)})}));this.redraw();this.showDrillUpButton()};q.prototype.getDrilldownBackText=function(){var b=this.drilldownLevels;if(b&&0<\nb.length)return b=b[b.length-1],b.series=b.seriesOptions,G(this.options.lang.drillUpText,b)};q.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),d=b.options.drilldown.drillUpButton,c,e;this.drillUpButton?this.drillUpButton.attr({text:a}).align():(e=(c=d.theme)&&c.states,this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()},c,e&&e.hover,e&&e.select).addClass(\"highcharts-drillup-button\").attr({align:d.position.align,zIndex:7}).add().align(d.position,\n!1,d.relativeTo||\"plotBox\"))};q.prototype.drillUp=function(){for(var b=this,a=b.drilldownLevels,d=a[a.length-1].levelNumber,c=a.length,e=b.series,g,l,k,f,m=function(a){var c;h(e,function(b){b.options._ddSeriesId===a._ddSeriesId&&(c=b)});c=c||b.addSeries(a,!1);c.type===k.type&&c.animateDrillupTo&&(c.animate=c.animateDrillupTo);a===l.seriesOptions&&(f=c)};c--;)if(l=a[c],l.levelNumber===d){a.pop();k=l.lowerSeries;if(!k.chart)for(g=e.length;g--;)if(e[g].options.id===l.lowerSeriesOptions.id&&e[g].options._levelNumber===\nd+1){k=e[g];break}k.xData=[];h(l.levelSeriesOptions,m);w(b,\"drillup\",{seriesOptions:l.seriesOptions});f.type===k.type&&(f.drilldownLevel=l,f.options.animation=b.options.drilldown.animation,k.animateDrillupFrom&&k.chart&&k.animateDrillupFrom(l));f.options._levelNumber=d;k.remove(!1);f.xAxis&&(g=l.oldExtremes,f.xAxis.setExtremes(g.xMin,g.xMax,!1),f.yAxis.setExtremes(g.yMin,g.yMax,!1))}w(b,\"drillupall\");this.redraw();0===this.drilldownLevels.length?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align();\nthis.ddDupes.length=[]};r.prototype.supportsDrilldown=!0;r.prototype.animateDrillupTo=function(b){if(!b){var a=this,d=a.drilldownLevel;h(this.points,function(a){var c=a.dataLabel;a.graphic&&a.graphic.hide();c&&(c.hidden=\"hidden\"===c.attr(\"visibility\"),c.hidden||(c.hide(),a.connector&&a.connector.hide()))});setTimeout(function(){a.points&&h(a.points,function(a,b){b=b===(d&&d.pointIndex)?\"show\":\"fadeIn\";var c=\"show\"===b?!0:void 0,e=a.dataLabel;if(a.graphic)a.graphic[b](c);if(e&&!e.hidden&&(e[b](c),\na.connector))a.connector[b](c)})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=n}};r.prototype.animateDrilldown=function(b){var a=this,d=this.chart.drilldownLevels,c,e=this.chart.options.drilldown.animation,g=this.xAxis;b||(h(d,function(b){a.options._ddSeriesId===b.lowerSeriesOptions._ddSeriesId&&(c=b.shapeArgs,c.fill=b.color)}),c.x+=B(g.oldPos,g.pos)-g.pos,h(this.points,function(b){b.shapeArgs.fill=b.color;b.graphic&&b.graphic.attr(c).animate(p(b.shapeArgs,{fill:b.color||\na.color}),e);b.dataLabel&&b.dataLabel.fadeIn(e)}),this.animate=null)};r.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,d=this.group,c=d!==this.chart.seriesGroup,e=this;h(e.trackerGroups,function(a){if(e[a])e[a].on(\"mouseover\")});c&&delete this.group;h(this.points,function(e){var g=e.graphic,k=b.shapeArgs,h=function(){g.destroy();d&&c&&(d=d.destroy())};g&&(delete e.graphic,k.fill=b.color,a?g.animate(k,f.merge(a,{complete:h})):(g.attr(k),h()))})};C&&p(C.prototype,\n{supportsDrilldown:!0,animateDrillupTo:r.prototype.animateDrillupTo,animateDrillupFrom:r.prototype.animateDrillupFrom,animateDrilldown:function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],d=this.chart.options.drilldown.animation,c=a.shapeArgs,e=c.start,g=(c.end-e)/this.points.length;b||(h(this.points,function(b,k){var h=b.shapeArgs;c.fill=a.color;h.fill=b.color;if(b.graphic)b.graphic.attr(f.merge(c,{start:e+k*g,end:e+(k+1)*g}))[d?\"animate\":\"attr\"](h,d)}),this.animate=\nnull)}});f.Point.prototype.doDrilldown=function(b,a,d){var c=this.series.chart,e=c.options.drilldown,g=(e.series||[]).length,f;c.ddDupes||(c.ddDupes=[]);for(;g--&&!f;)e.series[g].id===this.drilldown&&-1===E(this.drilldown,c.ddDupes)&&(f=e.series[g],c.ddDupes.push(this.drilldown));w(c,\"drilldown\",{point:this,seriesOptions:f,category:a,originalEvent:d,points:void 0!==a&&this.series.xAxis.getDDPoints(a).slice(0)},function(a){var c=a.point.series&&a.point.series.chart,d=a.seriesOptions;c&&d&&(b?c.addSingleSeriesAsDrilldown(a.point,\nd):c.addSeriesAsDrilldown(a.point,d))})};f.Axis.prototype.drilldownCategory=function(b,a){A(this.getDDPoints(b),function(d){d&&d.series&&d.series.visible&&d.doDrilldown&&d.doDrilldown(!0,b,a)});this.chart.applyDrilldown()};f.Axis.prototype.getDDPoints=function(b){var a=[];h(this.series,function(d){var c,e=d.xData,f=d.points;for(c=0;c<e.length;c++)if(e[c]===b&&d.options.data[c]&&d.options.data[c].drilldown){a.push(f?f[c]:!0);break}});return a};D.prototype.drillable=function(){var b=this.pos,a=this.label,\nd=this.axis,c=\"xAxis\"===d.coll&&d.getDDPoints,e=c&&d.getDDPoints(b);c&&(a&&e.length?(a.drillable=!0,a.basicStyles||(a.basicStyles=f.merge(a.styles)),a.addClass(\"highcharts-drilldown-axis-label\").css(d.chart.options.drilldown.activeAxisLabelStyle).on(\"click\",function(a){d.drilldownCategory(b,a)})):a&&a.drillable&&(a.styles={},a.css(a.basicStyles),a.on(\"click\",null),a.removeClass(\"highcharts-drilldown-axis-label\")))};u(D.prototype,\"addLabel\",function(b){b.call(this);this.drillable()});u(f.Point.prototype,\n\"init\",function(b,a,d,c){var e=b.call(this,a,d,c);c=(b=a.xAxis)&&b.ticks[c];e.drilldown&&f.addEvent(e,\"click\",function(b){a.xAxis&&!1===a.chart.options.drilldown.allowPointDrilldown?a.xAxis.drilldownCategory(e.x,b):e.doDrilldown(void 0,void 0,b)});c&&c.drillable();return e});u(f.Series.prototype,\"drawDataLabels\",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle,d=this.chart.renderer;b.call(this);h(this.points,function(b){var c={};b.drilldown&&b.dataLabel&&(\"contrast\"===a.color&&\n(c.color=d.getContrast(b.color||this.color)),b.dataLabel.addClass(\"highcharts-drilldown-data-label\"),b.dataLabel.css(a).css(c))},this)});var H=function(b){b.call(this);h(this.points,function(a){a.drilldown&&a.graphic&&(a.graphic.addClass(\"highcharts-drilldown-point\"),a.graphic.css({cursor:\"pointer\"}))})};A(v,function(b){b.prototype.supportsDrilldown&&u(b.prototype,\"drawTracker\",H)})})(n)});\n"
  },
  {
    "path": "assets/highcharts/modules/drilldown.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Highcharts Drilldown module\n * \n * Author: Torstein Honsi\n * License: www.highcharts.com/license\n *\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Highcharts Drilldown module\n         * \n         * Author: Torstein Honsi\n         * License: www.highcharts.com/license\n         *\n         */\n\n\n        var noop = H.noop,\n            color = H.color,\n            defaultOptions = H.defaultOptions,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            objectEach = H.objectEach,\n            pick = H.pick,\n            wrap = H.wrap,\n            Chart = H.Chart,\n            seriesTypes = H.seriesTypes,\n            PieSeries = seriesTypes.pie,\n            ColumnSeries = seriesTypes.column,\n            Tick = H.Tick,\n            fireEvent = H.fireEvent,\n            inArray = H.inArray,\n            ddSeriesId = 1;\n\n        // Add language\n        extend(defaultOptions.lang, {\n            drillUpText: '◁ Back to {series.name}'\n        });\n        defaultOptions.drilldown = {\n\n            activeAxisLabelStyle: {\n                cursor: 'pointer',\n                color: '#003399',\n                fontWeight: 'bold',\n                textDecoration: 'underline'\n            },\n            activeDataLabelStyle: {\n                cursor: 'pointer',\n                color: '#003399',\n                fontWeight: 'bold',\n                textDecoration: 'underline'\n            },\n\n            animation: {\n                duration: 500\n            },\n            drillUpButton: {\n                position: {\n                    align: 'right',\n                    x: -10,\n                    y: 10\n                }\n                // relativeTo: 'plotBox'\n                // theme\n            }\n        };\n\n        /**\n         * A general fadeIn method\n         */\n        H.SVGRenderer.prototype.Element.prototype.fadeIn = function(animation) {\n            this\n                .attr({\n                    opacity: 0.1,\n                    visibility: 'inherit'\n                })\n                .animate({\n                    opacity: pick(this.newOpacity, 1) // newOpacity used in maps\n                }, animation || {\n                    duration: 250\n                });\n        };\n\n        /**\n         * Add a series to the chart as drilldown from a specific point in the parent\n         * series. This method is used for async drilldown, when clicking a point in a\n         * series should result in loading and displaying a more high-resolution series.\n         * When not async, the setup is simpler using the {@link \n         * https://api.highcharts.com/highcharts/drilldown.series|drilldown.series}\n         * options structure.\n         *\n         * @memberOf Highcharts.Chart\n         * @function #addSeriesAsDrilldown\n         * \n         * @param  {Highcharts.Point} point\n         *         The point from which the drilldown will start.\n         * @param  {SeriesOptions} options\n         *         The series options for the new, detailed series.\n         *\n         * @sample highcharts/drilldown/async/ Async drilldown\n         */\n        Chart.prototype.addSeriesAsDrilldown = function(point, options) {\n            this.addSingleSeriesAsDrilldown(point, options);\n            this.applyDrilldown();\n        };\n        Chart.prototype.addSingleSeriesAsDrilldown = function(point, ddOptions) {\n            var oldSeries = point.series,\n                xAxis = oldSeries.xAxis,\n                yAxis = oldSeries.yAxis,\n                newSeries,\n                pointIndex,\n                levelSeries = [],\n                levelSeriesOptions = [],\n                level,\n                levelNumber,\n                last,\n                colorProp;\n\n\n\n            colorProp = {\n                color: point.color || oldSeries.color\n            };\n\n\n            if (!this.drilldownLevels) {\n                this.drilldownLevels = [];\n            }\n\n            levelNumber = oldSeries.options._levelNumber || 0;\n\n            // See if we can reuse the registered series from last run\n            last = this.drilldownLevels[this.drilldownLevels.length - 1];\n            if (last && last.levelNumber !== levelNumber) {\n                last = undefined;\n            }\n\n            ddOptions = extend(extend({\n                _ddSeriesId: ddSeriesId++\n            }, colorProp), ddOptions);\n            pointIndex = inArray(point, oldSeries.points);\n\n            // Record options for all current series\n            each(oldSeries.chart.series, function(series) {\n                if (series.xAxis === xAxis && !series.isDrilling) {\n                    series.options._ddSeriesId = series.options._ddSeriesId || ddSeriesId++;\n                    series.options._colorIndex = series.userOptions._colorIndex;\n                    series.options._levelNumber = series.options._levelNumber || levelNumber; // #3182\n\n                    if (last) {\n                        levelSeries = last.levelSeries;\n                        levelSeriesOptions = last.levelSeriesOptions;\n                    } else {\n                        levelSeries.push(series);\n                        levelSeriesOptions.push(series.options);\n                    }\n                }\n            });\n\n            // Add a record of properties for each drilldown level\n            level = extend({\n                levelNumber: levelNumber,\n                seriesOptions: oldSeries.options,\n                levelSeriesOptions: levelSeriesOptions,\n                levelSeries: levelSeries,\n                shapeArgs: point.shapeArgs,\n                bBox: point.graphic ? point.graphic.getBBox() : {}, // no graphic in line series with markers disabled\n                color: point.isNull ? new H.Color(color).setOpacity(0).get() : color,\n                lowerSeriesOptions: ddOptions,\n                pointOptions: oldSeries.options.data[pointIndex],\n                pointIndex: pointIndex,\n                oldExtremes: {\n                    xMin: xAxis && xAxis.userMin,\n                    xMax: xAxis && xAxis.userMax,\n                    yMin: yAxis && yAxis.userMin,\n                    yMax: yAxis && yAxis.userMax\n                }\n            }, colorProp);\n\n            // Push it to the lookup array\n            this.drilldownLevels.push(level);\n\n            // Reset names to prevent extending (#6704)\n            if (xAxis && xAxis.names) {\n                xAxis.names.length = 0;\n            }\n\n            newSeries = level.lowerSeries = this.addSeries(ddOptions, false);\n            newSeries.options._levelNumber = levelNumber + 1;\n            if (xAxis) {\n                xAxis.oldPos = xAxis.pos;\n                xAxis.userMin = xAxis.userMax = null;\n                yAxis.userMin = yAxis.userMax = null;\n            }\n\n            // Run fancy cross-animation on supported and equal types\n            if (oldSeries.type === newSeries.type) {\n                newSeries.animate = newSeries.animateDrilldown || noop;\n                newSeries.options.animation = true;\n            }\n        };\n\n        Chart.prototype.applyDrilldown = function() {\n            var drilldownLevels = this.drilldownLevels,\n                levelToRemove;\n\n            if (drilldownLevels && drilldownLevels.length > 0) { // #3352, async loading\n                levelToRemove = drilldownLevels[drilldownLevels.length - 1].levelNumber;\n                each(this.drilldownLevels, function(level) {\n                    if (level.levelNumber === levelToRemove) {\n                        each(level.levelSeries, function(series) {\n                            if (series.options && series.options._levelNumber === levelToRemove) { // Not removed, not added as part of a multi-series drilldown\n                                series.remove(false);\n                            }\n                        });\n                    }\n                });\n            }\n\n            this.redraw();\n            this.showDrillUpButton();\n        };\n\n        Chart.prototype.getDrilldownBackText = function() {\n            var drilldownLevels = this.drilldownLevels,\n                lastLevel;\n            if (drilldownLevels && drilldownLevels.length > 0) { // #3352, async loading\n                lastLevel = drilldownLevels[drilldownLevels.length - 1];\n                lastLevel.series = lastLevel.seriesOptions;\n                return format(this.options.lang.drillUpText, lastLevel);\n            }\n\n        };\n\n        Chart.prototype.showDrillUpButton = function() {\n            var chart = this,\n                backText = this.getDrilldownBackText(),\n                buttonOptions = chart.options.drilldown.drillUpButton,\n                attr,\n                states;\n\n\n            if (!this.drillUpButton) {\n                attr = buttonOptions.theme;\n                states = attr && attr.states;\n\n                this.drillUpButton = this.renderer.button(\n                        backText,\n                        null,\n                        null,\n                        function() {\n                            chart.drillUp();\n                        },\n                        attr,\n                        states && states.hover,\n                        states && states.select\n                    )\n                    .addClass('highcharts-drillup-button')\n                    .attr({\n                        align: buttonOptions.position.align,\n                        zIndex: 7\n                    })\n                    .add()\n                    .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n            } else {\n                this.drillUpButton.attr({\n                        text: backText\n                    })\n                    .align();\n            }\n        };\n\n        /**\n         * When the chart is drilled down to a child series, calling `chart.drillUp()`\n         * will drill up to the parent series.\n         *\n         * @memberOf Highcharts.Chart\n         * @name #drillUp\n         */\n        Chart.prototype.drillUp = function() {\n            var chart = this,\n                drilldownLevels = chart.drilldownLevels,\n                levelNumber = drilldownLevels[drilldownLevels.length - 1].levelNumber,\n                i = drilldownLevels.length,\n                chartSeries = chart.series,\n                seriesI,\n                level,\n                oldSeries,\n                newSeries,\n                oldExtremes,\n                addSeries = function(seriesOptions) {\n                    var addedSeries;\n                    each(chartSeries, function(series) {\n                        if (series.options._ddSeriesId === seriesOptions._ddSeriesId) {\n                            addedSeries = series;\n                        }\n                    });\n\n                    addedSeries = addedSeries || chart.addSeries(seriesOptions, false);\n                    if (addedSeries.type === oldSeries.type && addedSeries.animateDrillupTo) {\n                        addedSeries.animate = addedSeries.animateDrillupTo;\n                    }\n                    if (seriesOptions === level.seriesOptions) {\n                        newSeries = addedSeries;\n                    }\n                };\n\n            while (i--) {\n\n                level = drilldownLevels[i];\n                if (level.levelNumber === levelNumber) {\n                    drilldownLevels.pop();\n\n                    // Get the lower series by reference or id\n                    oldSeries = level.lowerSeries;\n                    if (!oldSeries.chart) { // #2786\n                        seriesI = chartSeries.length; // #2919\n                        while (seriesI--) {\n                            if (chartSeries[seriesI].options.id === level.lowerSeriesOptions.id &&\n                                chartSeries[seriesI].options._levelNumber === levelNumber + 1) { // #3867\n                                oldSeries = chartSeries[seriesI];\n                                break;\n                            }\n                        }\n                    }\n                    oldSeries.xData = []; // Overcome problems with minRange (#2898)\n\n                    each(level.levelSeriesOptions, addSeries);\n\n                    fireEvent(chart, 'drillup', {\n                        seriesOptions: level.seriesOptions\n                    });\n\n                    if (newSeries.type === oldSeries.type) {\n                        newSeries.drilldownLevel = level;\n                        newSeries.options.animation = chart.options.drilldown.animation;\n\n                        if (oldSeries.animateDrillupFrom && oldSeries.chart) { // #2919\n                            oldSeries.animateDrillupFrom(level);\n                        }\n                    }\n                    newSeries.options._levelNumber = levelNumber;\n\n                    oldSeries.remove(false);\n\n                    // Reset the zoom level of the upper series\n                    if (newSeries.xAxis) {\n                        oldExtremes = level.oldExtremes;\n                        newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);\n                        newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);\n                    }\n                }\n            }\n\n            // Fire a once-off event after all series have been drilled up (#5158)\n            fireEvent(chart, 'drillupall');\n\n            this.redraw();\n\n            if (this.drilldownLevels.length === 0) {\n                this.drillUpButton = this.drillUpButton.destroy();\n            } else {\n                this.drillUpButton.attr({\n                        text: this.getDrilldownBackText()\n                    })\n                    .align();\n            }\n\n            this.ddDupes.length = []; // #3315\n        };\n\n\n        ColumnSeries.prototype.supportsDrilldown = true;\n\n        /**\n         * When drilling up, keep the upper series invisible until the lower series has\n         * moved into place\n         */\n        ColumnSeries.prototype.animateDrillupTo = function(init) {\n            if (!init) {\n                var newSeries = this,\n                    level = newSeries.drilldownLevel;\n\n                // First hide all items before animating in again\n                each(this.points, function(point) {\n                    var dataLabel = point.dataLabel;\n\n                    if (point.graphic) { // #3407\n                        point.graphic.hide();\n                    }\n\n                    if (dataLabel) {\n                        // The data label is initially hidden, make sure it is not faded\n                        // in (#6127)\n                        dataLabel.hidden = dataLabel.attr('visibility') === 'hidden';\n\n                        if (!dataLabel.hidden) {\n                            dataLabel.hide();\n                            if (point.connector) {\n                                point.connector.hide();\n                            }\n                        }\n                    }\n                });\n\n\n                // Do dummy animation on first point to get to complete\n                setTimeout(function() {\n                    if (newSeries.points) { // May be destroyed in the meantime, #3389\n                        each(newSeries.points, function(point, i) {\n                            // Fade in other points\t\t\t  \n                            var verb =\n                                i === (level && level.pointIndex) ? 'show' : 'fadeIn',\n                                inherit = verb === 'show' ? true : undefined,\n                                dataLabel = point.dataLabel;\n\n\n                            if (point.graphic) { // #3407\n                                point.graphic[verb](inherit);\n                            }\n\n                            if (dataLabel && !dataLabel.hidden) { // #6127\n                                dataLabel[verb](inherit);\n                                if (point.connector) {\n                                    point.connector[verb](inherit);\n                                }\n                            }\n                        });\n                    }\n                }, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));\n\n                // Reset\n                this.animate = noop;\n            }\n\n        };\n\n        ColumnSeries.prototype.animateDrilldown = function(init) {\n            var series = this,\n                drilldownLevels = this.chart.drilldownLevels,\n                animateFrom,\n                animationOptions = this.chart.options.drilldown.animation,\n                xAxis = this.xAxis;\n\n            if (!init) {\n                each(drilldownLevels, function(level) {\n                    if (series.options._ddSeriesId === level.lowerSeriesOptions._ddSeriesId) {\n                        animateFrom = level.shapeArgs;\n\n                        // Add the point colors to animate from\n                        animateFrom.fill = level.color;\n\n                    }\n                });\n\n                animateFrom.x += (pick(xAxis.oldPos, xAxis.pos) - xAxis.pos);\n\n                each(this.points, function(point) {\n                    var animateTo = point.shapeArgs;\n\n\n                    // Add the point colors to animate to\n                    animateTo.fill = point.color;\n\n\n                    if (point.graphic) {\n                        point.graphic\n                            .attr(animateFrom)\n                            .animate(\n                                extend(point.shapeArgs, {\n                                    fill: point.color || series.color\n                                }),\n                                animationOptions\n                            );\n                    }\n                    if (point.dataLabel) {\n                        point.dataLabel.fadeIn(animationOptions);\n                    }\n                });\n                this.animate = null;\n            }\n\n        };\n\n        /**\n         * When drilling up, pull out the individual point graphics from the lower series\n         * and animate them into the origin point in the upper series.\n         */\n        ColumnSeries.prototype.animateDrillupFrom = function(level) {\n            var animationOptions = this.chart.options.drilldown.animation,\n                group = this.group,\n                // For 3d column series all columns are added to one group \n                // so we should not delete the whole group. #5297\n                removeGroup = group !== this.chart.seriesGroup,\n                series = this;\n\n            // Cancel mouse events on the series group (#2787)\n            each(series.trackerGroups, function(key) {\n                if (series[key]) { // we don't always have dataLabelsGroup\n                    series[key].on('mouseover');\n                }\n            });\n\n            if (removeGroup) {\n                delete this.group;\n            }\n\n            each(this.points, function(point) {\n                var graphic = point.graphic,\n                    animateTo = level.shapeArgs,\n                    complete = function() {\n                        graphic.destroy();\n                        if (group && removeGroup) {\n                            group = group.destroy();\n                        }\n                    };\n\n                if (graphic) {\n\n                    delete point.graphic;\n\n\n                    animateTo.fill = level.color;\n\n\n                    if (animationOptions) {\n                        graphic.animate(\n                            animateTo,\n                            H.merge(animationOptions, {\n                                complete: complete\n                            })\n                        );\n                    } else {\n                        graphic.attr(animateTo);\n                        complete();\n                    }\n                }\n            });\n        };\n\n        if (PieSeries) {\n            extend(PieSeries.prototype, {\n                supportsDrilldown: true,\n                animateDrillupTo: ColumnSeries.prototype.animateDrillupTo,\n                animateDrillupFrom: ColumnSeries.prototype.animateDrillupFrom,\n\n                animateDrilldown: function(init) {\n                    var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],\n                        animationOptions = this.chart.options.drilldown.animation,\n                        animateFrom = level.shapeArgs,\n                        start = animateFrom.start,\n                        angle = animateFrom.end - start,\n                        startAngle = angle / this.points.length;\n\n                    if (!init) {\n                        each(this.points, function(point, i) {\n                            var animateTo = point.shapeArgs;\n\n\n                            animateFrom.fill = level.color;\n                            animateTo.fill = point.color;\n\n\n                            if (point.graphic) {\n                                point.graphic\n                                    .attr(H.merge(animateFrom, {\n                                        start: start + i * startAngle,\n                                        end: start + (i + 1) * startAngle\n                                    }))[animationOptions ? 'animate' : 'attr'](\n                                        animateTo,\n                                        animationOptions\n                                    );\n                            }\n                        });\n                        this.animate = null;\n                    }\n                }\n            });\n        }\n\n        H.Point.prototype.doDrilldown = function(_holdRedraw, category, originalEvent) {\n            var series = this.series,\n                chart = series.chart,\n                drilldown = chart.options.drilldown,\n                i = (drilldown.series || []).length,\n                seriesOptions;\n\n            if (!chart.ddDupes) {\n                chart.ddDupes = [];\n            }\n\n            while (i-- && !seriesOptions) {\n                if (drilldown.series[i].id === this.drilldown && inArray(this.drilldown, chart.ddDupes) === -1) {\n                    seriesOptions = drilldown.series[i];\n                    chart.ddDupes.push(this.drilldown);\n                }\n            }\n\n            // Fire the event. If seriesOptions is undefined, the implementer can check for \n            // seriesOptions, and call addSeriesAsDrilldown async if necessary.\n            fireEvent(chart, 'drilldown', {\n                point: this,\n                seriesOptions: seriesOptions,\n                category: category,\n                originalEvent: originalEvent,\n                points: category !== undefined && this.series.xAxis.getDDPoints(category).slice(0)\n            }, function(e) {\n                var chart = e.point.series && e.point.series.chart,\n                    seriesOptions = e.seriesOptions;\n                if (chart && seriesOptions) {\n                    if (_holdRedraw) {\n                        chart.addSingleSeriesAsDrilldown(e.point, seriesOptions);\n                    } else {\n                        chart.addSeriesAsDrilldown(e.point, seriesOptions);\n                    }\n                }\n            });\n\n\n        };\n\n        /**\n         * Drill down to a given category. This is the same as clicking on an axis label.\n         */\n        H.Axis.prototype.drilldownCategory = function(x, e) {\n            objectEach(this.getDDPoints(x), function(point) {\n                if (point && point.series && point.series.visible && point.doDrilldown) { // #3197\n                    point.doDrilldown(true, x, e);\n                }\n            });\n            this.chart.applyDrilldown();\n        };\n\n        /**\n         * Return drillable points for this specific X value\n         */\n        H.Axis.prototype.getDDPoints = function(x) {\n            var ret = [];\n            each(this.series, function(series) {\n                var i,\n                    xData = series.xData,\n                    points = series.points;\n\n                for (i = 0; i < xData.length; i++) {\n                    if (xData[i] === x && series.options.data[i] && series.options.data[i].drilldown) {\n                        ret.push(points ? points[i] : true);\n                        break;\n                    }\n                }\n            });\n            return ret;\n        };\n\n\n        /**\n         * Make a tick label drillable, or remove drilling on update\n         */\n        Tick.prototype.drillable = function() {\n            var pos = this.pos,\n                label = this.label,\n                axis = this.axis,\n                isDrillable = axis.coll === 'xAxis' && axis.getDDPoints,\n                ddPointsX = isDrillable && axis.getDDPoints(pos);\n\n            if (isDrillable) {\n                if (label && ddPointsX.length) {\n                    label.drillable = true;\n\n\n                    if (!label.basicStyles) {\n                        label.basicStyles = H.merge(label.styles);\n                    }\n\n\n                    label\n                        .addClass('highcharts-drilldown-axis-label')\n\n                        .css(axis.chart.options.drilldown.activeAxisLabelStyle)\n\n                        .on('click', function(e) {\n                            axis.drilldownCategory(pos, e);\n                        });\n\n                } else if (label && label.drillable) {\n\n\n                    label.styles = {}; // reset for full overwrite of styles\n                    label.css(label.basicStyles);\n\n\n                    label.on('click', null); // #3806\t\t\t\n                    label.removeClass('highcharts-drilldown-axis-label');\n                }\n            }\n        };\n\n        /**\n         * Always keep the drillability updated (#3951)\n         */\n        wrap(Tick.prototype, 'addLabel', function(proceed) {\n            proceed.call(this);\n            this.drillable();\n        });\n\n\n        /**\n         * On initialization of each point, identify its label and make it clickable. Also, provide a\n         * list of points associated to that label.\n         */\n        wrap(H.Point.prototype, 'init', function(proceed, series, options, x) {\n            var point = proceed.call(this, series, options, x),\n                xAxis = series.xAxis,\n                tick = xAxis && xAxis.ticks[x];\n\n            if (point.drilldown) {\n\n                // Add the click event to the point \n                H.addEvent(point, 'click', function(e) {\n                    if (series.xAxis && series.chart.options.drilldown.allowPointDrilldown === false) {\n                        series.xAxis.drilldownCategory(point.x, e); // #5822, x changed\n                    } else {\n                        point.doDrilldown(undefined, undefined, e);\n                    }\n                });\n                /*wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work\n                \tif (!this.hasImportedEvents) {\n                \t\tproceed.call(this);\n                \t\tH.addEvent(this, 'click', function () {\n                \t\t\tthis.doDrilldown();\n                \t\t});\n                \t}\n                });*/\n\n            }\n\n            // Add or remove click handler and style on the tick label\n            if (tick) {\n                tick.drillable();\n            }\n\n            return point;\n        });\n\n        wrap(H.Series.prototype, 'drawDataLabels', function(proceed) {\n            var css = this.chart.options.drilldown.activeDataLabelStyle,\n                renderer = this.chart.renderer;\n\n            proceed.call(this);\n\n            each(this.points, function(point) {\n                var pointCSS = {};\n                if (point.drilldown && point.dataLabel) {\n                    if (css.color === 'contrast') {\n                        pointCSS.color = renderer.getContrast(point.color || this.color);\n                    }\n                    point.dataLabel\n                        .addClass('highcharts-drilldown-data-label');\n\n\n                    point.dataLabel\n                        .css(css)\n                        .css(pointCSS);\n\n                }\n            }, this);\n        });\n\n        // Mark the trackers with a pointer \n        var drawTrackerWrapper = function(proceed) {\n            proceed.call(this);\n            each(this.points, function(point) {\n                if (point.drilldown && point.graphic) {\n                    point.graphic.addClass('highcharts-drilldown-point');\n\n\n                    point.graphic.css({\n                        cursor: 'pointer'\n                    });\n\n                }\n            });\n        };\n\n        objectEach(seriesTypes, function(seriesType) {\n            if (seriesType.prototype.supportsDrilldown) {\n                wrap(seriesType.prototype, 'drawTracker', drawTrackerWrapper);\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/export-data.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Exporting module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(d){var q=d.each,n=d.pick,k=d.win,p=k.document,a=d.seriesTypes,v=void 0!==p.createElement(\"a\").download;d.setOptions({lang:{downloadCSV:\"Download CSV\",downloadXLS:\"Download XLS\",viewData:\"View data table\"}});d.Chart.prototype.getDataRows=function(){var h=(this.options.exporting||{}).csv||{},b,c=this.xAxis,g={},r=[],m=[],f,l,u=h.dateFormat||\"%Y-%m-%d %H:%M:%S\",k=h.columnHeaderFormatter||function(e,\nf,b){return e instanceof d.Axis?e.options.title&&e.options.title.text||(e.isDatetimeAxis?\"DateTime\":\"Category\"):e?e.name+(1<b?\" (\"+f+\")\":\"\"):\"Category\"},t=[];f=0;q(this.series,function(e){var b=e.options.keys||e.pointArrayMap||[\"y\"],h=b.length,r=e.requireSorting,u={},l=d.inArray(e.xAxis,c),a;q(b,function(b){u[b]=e[b+\"Axis\"]&&e[b+\"Axis\"].categories||[]});if(!1!==e.options.includeInCSVExport&&!1!==e.visible){d.find(t,function(b){return b[0]===l})||t.push([l,f]);for(a=0;a<h;)m.push(k(e,b[a],b.length)),\na++;q(e.points,function(d,c){c=r?d.x:c;var m,k;a=0;g[c]||(g[c]=[],g[c].xValues=[]);g[c].x=d.x;g[c].xValues[l]=d.x;e.xAxis&&\"name\"!==e.exportKey||(g[c].name=d.name);for(;a<h;)m=b[a],k=d[m],g[c][f+a]=n(u[m][k],k),a++});f+=a}});for(l in g)g.hasOwnProperty(l)&&r.push(g[l]);var a,p,h=[m];for(f=t.length;f--;)a=t[f][0],p=t[f][1],b=c[a],r.sort(function(b,c){return b.xValues[a]-c.xValues[a]}),l=k(b),h[0].splice(p,0,l),q(r,function(e){var c=e.name;c||(b.isDatetimeAxis?(e.x instanceof Date&&(e.x=e.x.getTime()),\nc=d.dateFormat(u,e.x)):c=b.categories?n(b.names[e.x],b.categories[e.x],e.x):e.x);e.splice(p,0,c)});return h=h.concat(r)};d.Chart.prototype.getCSV=function(d){var b=\"\",c=this.getDataRows(),a=(this.options.exporting||{}).csv||{},h=a.itemDelimiter||\",\",m=a.lineDelimiter||\"\\n\";q(c,function(a,l){for(var f,g=a.length,k=d?(1.1).toLocaleString()[1]:\".\";g--;)f=a[g],\"string\"===typeof f&&(f='\"'+f+'\"'),\"number\"===typeof f&&\",\"===k&&(f=f.toString().replace(\".\",\",\")),a[g]=f;b+=a.join(h);l<c.length-1&&(b+=m)});\nreturn b};d.Chart.prototype.getTable=function(a){var b=\"\\x3ctable\\x3e\\x3cthead\\x3e\",c=this.getDataRows();q(c,function(c,d){var h=d?\"td\":\"th\",f,g,k=a?(1.1).toLocaleString()[1]:\".\";b+=\"\\x3ctr\\x3e\";for(g=0;g<c.length;g+=1)f=c[g],\"number\"===typeof f?(f=f.toString(),\",\"===k&&(f=f.replace(\".\",k)),b+=\"\\x3c\"+h+' class\\x3d\"number\"\\x3e'+f+\"\\x3c/\"+h+\"\\x3e\"):b+=\"\\x3c\"+h+\"\\x3e\"+(void 0===f?\"\":f)+\"\\x3c/\"+h+\"\\x3e\";b+=\"\\x3c/tr\\x3e\";d||(b+=\"\\x3c/thead\\x3e\\x3ctbody\\x3e\")});return b+=\"\\x3c/tbody\\x3e\\x3c/table\\x3e\"};\nd.Chart.prototype.fileDownload=function(a,b,c,g){var h,m=((this.options.exporting||{}).csv||{}).url||\"http://www.highcharts.com/studies/csv-export/download.php\";h=this.options.exporting.filename?this.options.exporting.filename:this.title?this.title.textStr.replace(/ /g,\"-\").toLowerCase():\"chart\";k.Blob&&k.navigator.msSaveOrOpenBlob?(a=new k.Blob([c]),k.navigator.msSaveOrOpenBlob(a,h+\".\"+b)):v?(c=p.createElement(\"a\"),c.href=a,c.target=\"_blank\",c.download=h+\".\"+b,this.container.append(c),c.click(),\nc.remove()):d.post(m,{data:c,type:g,extension:b})};d.Chart.prototype.downloadCSV=function(){var a=this.getCSV(!0);this.fileDownload(\"data:text/csv,\\ufeff\"+encodeURIComponent(a),\"csv\",a,\"text/csv\")};d.Chart.prototype.downloadXLS=function(){var a='\\x3chtml xmlns:o\\x3d\"urn:schemas-microsoft-com:office:office\" xmlns:x\\x3d\"urn:schemas-microsoft-com:office:excel\" xmlns\\x3d\"http://www.w3.org/TR/REC-html40\"\\x3e\\x3chead\\x3e\\x3c!--[if gte mso 9]\\x3e\\x3cxml\\x3e\\x3cx:ExcelWorkbook\\x3e\\x3cx:ExcelWorksheets\\x3e\\x3cx:ExcelWorksheet\\x3e\\x3cx:Name\\x3eArk1\\x3c/x:Name\\x3e\\x3cx:WorksheetOptions\\x3e\\x3cx:DisplayGridlines/\\x3e\\x3c/x:WorksheetOptions\\x3e\\x3c/x:ExcelWorksheet\\x3e\\x3c/x:ExcelWorksheets\\x3e\\x3c/x:ExcelWorkbook\\x3e\\x3c/xml\\x3e\\x3c![endif]--\\x3e\\x3cstyle\\x3etd{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:\"0.00\";}\\x3c/style\\x3e\\x3cmeta name\\x3dProgId content\\x3dExcel.Sheet\\x3e\\x3cmeta charset\\x3dUTF-8\\x3e\\x3c/head\\x3e\\x3cbody\\x3e'+\nthis.getTable(!0)+\"\\x3c/body\\x3e\\x3c/html\\x3e\";this.fileDownload(\"data:application/vnd.ms-excel;base64,\"+k.btoa(unescape(encodeURIComponent(a))),\"xls\",a,\"application/vnd.ms-excel\")};d.Chart.prototype.viewData=function(){this.dataTableDiv||(this.dataTableDiv=p.createElement(\"div\"),this.dataTableDiv.className=\"highcharts-data-table\",this.renderTo.parentNode.insertBefore(this.dataTableDiv,this.renderTo.nextSibling));this.dataTableDiv.innerHTML=this.getTable()};d.getOptions().exporting&&d.getOptions().exporting.buttons.contextButton.menuItems.push({textKey:\"downloadCSV\",\nonclick:function(){this.downloadCSV()}},{textKey:\"downloadXLS\",onclick:function(){this.downloadXLS()}},{textKey:\"viewData\",onclick:function(){this.viewData()}});a.map&&(a.map.prototype.exportKey=\"name\");a.mapbubble&&(a.mapbubble.prototype.exportKey=\"name\");a.treemap&&(a.treemap.prototype.exportKey=\"name\")})(n)});\n"
  },
  {
    "path": "assets/highcharts/modules/export-data.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Exporting module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Expoerimental data export module for Highcharts\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        // docs\n        // - After experimental release:\n        // - Move info in repo readme to docs/API.\n        // - Deprecate repo and plugins page\n        // - Update demos (esp accessibility) to use new URL\n        // - Before official release, set up systematic tests for all series types\n\n        /* eslint indent:0 */\n\n        var each = Highcharts.each,\n            pick = Highcharts.pick,\n            win = Highcharts.win,\n            doc = win.document,\n            seriesTypes = Highcharts.seriesTypes,\n            downloadAttrSupported = doc.createElement('a').download !== undefined;\n\n        Highcharts.setOptions({\n            lang: {\n                downloadCSV: 'Download CSV',\n                downloadXLS: 'Download XLS',\n                viewData: 'View data table'\n            }\n        });\n\n        /**\n         * Get the data rows as a two dimensional array\n         */\n        Highcharts.Chart.prototype.getDataRows = function() {\n            var options = (this.options.exporting || {}).csv || {},\n                xAxis,\n                xAxes = this.xAxis,\n                rows = {},\n                rowArr = [],\n                dataRows,\n                names = [],\n                i,\n                x,\n                xTitle,\n                // Options\n                dateFormat = options.dateFormat || '%Y-%m-%d %H:%M:%S',\n                columnHeaderFormatter = options.columnHeaderFormatter || function(item, key, keyLength) {\n                    if (item instanceof Highcharts.Axis) {\n                        return (item.options.title && item.options.title.text) ||\n                            (item.isDatetimeAxis ? 'DateTime' : 'Category');\n                    }\n                    return item ?\n                        item.name + (keyLength > 1 ? ' (' + key + ')' : '') :\n                        'Category';\n                },\n                xAxisIndices = [];\n\n            // Loop the series and index values\n            i = 0;\n            each(this.series, function(series) {\n                var keys = series.options.keys,\n                    pointArrayMap = keys || series.pointArrayMap || ['y'],\n                    valueCount = pointArrayMap.length,\n                    requireSorting = series.requireSorting,\n                    categoryMap = {},\n                    xAxisIndex = Highcharts.inArray(series.xAxis, xAxes),\n                    j;\n\n                // Map the categories for value axes\n                each(pointArrayMap, function(prop) {\n                    categoryMap[prop] = (series[prop + 'Axis'] && series[prop + 'Axis'].categories) || [];\n                });\n\n                if (series.options.includeInCSVExport !== false && series.visible !== false) { // #55\n\n                    // Build a lookup for X axis index and the position of the first\n                    // series that belongs to that X axis. Includes -1 for non-axis\n                    // series types like pies.\n                    if (!Highcharts.find(xAxisIndices, function(index) {\n                            return index[0] === xAxisIndex;\n                        })) {\n                        xAxisIndices.push([xAxisIndex, i]);\n                    }\n\n                    // Add the column headers, usually the same as series names\n                    j = 0;\n                    while (j < valueCount) {\n                        names.push(columnHeaderFormatter(series, pointArrayMap[j], pointArrayMap.length));\n                        j++;\n                    }\n\n                    each(series.points, function(point, pIdx) {\n                        var key = requireSorting ? point.x : pIdx,\n                            prop,\n                            val;\n\n                        j = 0;\n\n                        if (!rows[key]) {\n                            // Generate the row\n                            rows[key] = [];\n                            // Contain the X values from one or more X axes\n                            rows[key].xValues = [];\n                        }\n                        rows[key].x = point.x;\n                        rows[key].xValues[xAxisIndex] = point.x;\n\n                        // Pies, funnels, geo maps etc. use point name in X row\n                        if (!series.xAxis || series.exportKey === 'name') {\n                            rows[key].name = point.name;\n                        }\n\n                        while (j < valueCount) {\n                            prop = pointArrayMap[j]; // y, z etc\n                            val = point[prop];\n                            // Pick a Y axis category if present\n                            rows[key][i + j] = pick(categoryMap[prop][val], val);\n                            j++;\n                        }\n\n                    });\n                    i = i + j;\n                }\n            });\n\n            // Make a sortable array\n            for (x in rows) {\n                if (rows.hasOwnProperty(x)) {\n                    rowArr.push(rows[x]);\n                }\n            }\n\n            var xAxisIndex, column;\n            dataRows = [names];\n\n            i = xAxisIndices.length;\n            while (i--) { // Start from end to splice in\n                xAxisIndex = xAxisIndices[i][0];\n                column = xAxisIndices[i][1];\n                xAxis = xAxes[xAxisIndex];\n\n                // Sort it by X values\n                rowArr.sort(function(a, b) { // eslint-disable-line no-loop-func\n                    return a.xValues[xAxisIndex] - b.xValues[xAxisIndex];\n                });\n\n                // Add header row\n                xTitle = columnHeaderFormatter(xAxis);\n                //dataRows = [[xTitle].concat(names)];\n                dataRows[0].splice(column, 0, xTitle);\n\n                // Add the category column\n                each(rowArr, function(row) { // eslint-disable-line no-loop-func\n                    var category = row.name;\n                    if (!category) {\n                        if (xAxis.isDatetimeAxis) {\n                            if (row.x instanceof Date) {\n                                row.x = row.x.getTime();\n                            }\n                            category = Highcharts.dateFormat(dateFormat, row.x);\n                        } else if (xAxis.categories) {\n                            category = pick(\n                                xAxis.names[row.x],\n                                xAxis.categories[row.x],\n                                row.x\n                            );\n                        } else {\n                            category = row.x;\n                        }\n                    }\n\n                    // Add the X/date/category\n                    row.splice(column, 0, category);\n                });\n            }\n            dataRows = dataRows.concat(rowArr);\n\n            return dataRows;\n        };\n\n        /**\n         * Get a CSV string\n         */\n        Highcharts.Chart.prototype.getCSV = function(useLocalDecimalPoint) {\n            var csv = '',\n                rows = this.getDataRows(),\n                options = (this.options.exporting || {}).csv || {},\n                itemDelimiter = options.itemDelimiter || ',', // use ';' for direct to Excel\n                lineDelimiter = options.lineDelimiter || '\\n'; // '\\n' isn't working with the js csv data extraction\n\n            // Transform the rows to CSV\n            each(rows, function(row, i) {\n                var val = '',\n                    j = row.length,\n                    n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';\n                while (j--) {\n                    val = row[j];\n                    if (typeof val === 'string') {\n                        val = '\"' + val + '\"';\n                    }\n                    if (typeof val === 'number') {\n                        if (n === ',') {\n                            val = val.toString().replace('.', ',');\n                        }\n                    }\n                    row[j] = val;\n                }\n                // Add the values\n                csv += row.join(itemDelimiter);\n\n                // Add the line delimiter\n                if (i < rows.length - 1) {\n                    csv += lineDelimiter;\n                }\n            });\n            return csv;\n        };\n\n        /**\n         * Build a HTML table with the data\n         */\n        Highcharts.Chart.prototype.getTable = function(useLocalDecimalPoint) {\n            var html = '<table><thead>',\n                rows = this.getDataRows();\n\n            // Transform the rows to HTML\n            each(rows, function(row, i) {\n                var tag = i ? 'td' : 'th',\n                    val,\n                    j,\n                    n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.';\n\n                html += '<tr>';\n                for (j = 0; j < row.length; j = j + 1) {\n                    val = row[j];\n                    // Add the cell\n                    if (typeof val === 'number') {\n                        val = val.toString();\n                        if (n === ',') {\n                            val = val.replace('.', n);\n                        }\n                        html += '<' + tag + ' class=\"number\">' + val + '</' + tag + '>';\n\n                    } else {\n                        html += '<' + tag + '>' + (val === undefined ? '' : val) + '</' + tag + '>';\n                    }\n                }\n\n                html += '</tr>';\n\n                // After the first row, end head and start body\n                if (!i) {\n                    html += '</thead><tbody>';\n                }\n\n            });\n            html += '</tbody></table>';\n\n            return html;\n        };\n\n        Highcharts.Chart.prototype.fileDownload = function(href, extension, content, MIME) {\n            var a,\n                blobObject,\n                name,\n                options = (this.options.exporting || {}).csv || {},\n                url = options.url || 'http://www.highcharts.com/studies/csv-export/download.php';\n\n            if (this.options.exporting.filename) {\n                name = this.options.exporting.filename;\n            } else if (this.title) {\n                name = this.title.textStr.replace(/ /g, '-').toLowerCase();\n            } else {\n                name = 'chart';\n            }\n\n            // MS specific. Check this first because of bug with Edge (#76)\n            if (win.Blob && win.navigator.msSaveOrOpenBlob) {\n                // Falls to msSaveOrOpenBlob if download attribute is not supported\n                blobObject = new win.Blob([content]);\n                win.navigator.msSaveOrOpenBlob(blobObject, name + '.' + extension);\n\n                // Download attribute supported\n            } else if (downloadAttrSupported) {\n                a = doc.createElement('a');\n                a.href = href;\n                a.target = '_blank';\n                a.download = name + '.' + extension;\n                this.container.append(a); // #111\n                a.click();\n                a.remove();\n\n            } else {\n                // Fall back to server side handling\n                Highcharts.post(url, {\n                    data: content,\n                    type: MIME,\n                    extension: extension\n                });\n            }\n        };\n\n        /**\n         * Call this on click of 'Download CSV' button\n         */\n        Highcharts.Chart.prototype.downloadCSV = function() {\n            var csv = this.getCSV(true);\n            this.fileDownload(\n                'data:text/csv,\\uFEFF' + encodeURIComponent(csv),\n                'csv',\n                csv,\n                'text/csv'\n            );\n        };\n\n        /**\n         * Call this on click of 'Download XLS' button\n         */\n        Highcharts.Chart.prototype.downloadXLS = function() {\n            var uri = 'data:application/vnd.ms-excel;base64,',\n                template = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">' +\n                '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>' +\n                '<x:Name>Ark1</x:Name>' +\n                '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->' +\n                '<style>td{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:\"0.00\";}</style>' +\n                '<meta name=ProgId content=Excel.Sheet>' +\n                '<meta charset=UTF-8>' +\n                '</head><body>' +\n                this.getTable(true) +\n                '</body></html>',\n                base64 = function(s) {\n                    return win.btoa(unescape(encodeURIComponent(s))); // #50\n                };\n            this.fileDownload(\n                uri + base64(template),\n                'xls',\n                template,\n                'application/vnd.ms-excel'\n            );\n        };\n\n        /**\n         * View the data in a table below the chart\n         */\n        Highcharts.Chart.prototype.viewData = function() {\n            if (!this.dataTableDiv) {\n                this.dataTableDiv = doc.createElement('div');\n                this.dataTableDiv.className = 'highcharts-data-table';\n\n                // Insert after the chart container\n                this.renderTo.parentNode.insertBefore(\n                    this.dataTableDiv,\n                    this.renderTo.nextSibling\n                );\n            }\n\n            this.dataTableDiv.innerHTML = this.getTable();\n        };\n\n\n        // Add \"Download CSV\" to the exporting menu. Use download attribute if supported, else\n        // run a simple PHP script that returns a file. The source code for the PHP script can be viewed at\n        // https://raw.github.com/highslide-software/highcharts.com/master/studies/csv-export/csv.php\n        if (Highcharts.getOptions().exporting) {\n            Highcharts.getOptions().exporting.buttons.contextButton.menuItems.push({\n                textKey: 'downloadCSV',\n                onclick: function() {\n                    this.downloadCSV();\n                }\n            }, {\n                textKey: 'downloadXLS',\n                onclick: function() {\n                    this.downloadXLS();\n                }\n            }, {\n                textKey: 'viewData',\n                onclick: function() {\n                    this.viewData();\n                }\n            });\n        }\n\n        // Series specific\n        if (seriesTypes.map) {\n            seriesTypes.map.prototype.exportKey = 'name';\n        }\n        if (seriesTypes.mapbubble) {\n            seriesTypes.mapbubble.prototype.exportKey = 'name';\n        }\n        if (seriesTypes.treemap) {\n            seriesTypes.treemap.prototype.exportKey = 'name';\n        }\n\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/exporting.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Exporting module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(k){\"object\"===typeof module&&module.exports?module.exports=k:k(Highcharts)})(function(k){(function(f){var k=f.defaultOptions,p=f.doc,A=f.Chart,w=f.addEvent,I=f.removeEvent,E=f.fireEvent,t=f.createElement,B=f.discardElement,v=f.css,n=f.merge,C=f.pick,h=f.each,F=f.objectEach,u=f.extend,J=f.isTouchDevice,D=f.win,G=D.navigator.userAgent,K=f.Renderer.prototype.symbols;/Edge\\/|Trident\\/|MSIE /.test(G);/firefox/i.test(G);u(k.lang,{printChart:\"Print chart\",downloadPNG:\"Download PNG image\",downloadJPEG:\"Download JPEG image\",\ndownloadPDF:\"Download PDF document\",downloadSVG:\"Download SVG vector image\",contextButtonTitle:\"Chart context menu\"});k.navigation={buttonOptions:{theme:{},symbolSize:14,symbolX:12.5,symbolY:10.5,align:\"right\",buttonSpacing:3,height:22,verticalAlign:\"top\",width:24}};n(!0,k.navigation,{menuStyle:{border:\"1px solid #999999\",background:\"#ffffff\",padding:\"5px 0\"},menuItemStyle:{padding:\"0.5em 1em\",background:\"none\",color:\"#333333\",fontSize:J?\"14px\":\"11px\",transition:\"background 250ms, color 250ms\"},menuItemHoverStyle:{background:\"#335cad\",\ncolor:\"#ffffff\"},buttonOptions:{symbolFill:\"#666666\",symbolStroke:\"#666666\",symbolStrokeWidth:3,theme:{fill:\"#ffffff\",stroke:\"none\",padding:5}}});k.exporting={type:\"image/png\",url:\"https://export.highcharts.com/\",printMaxWidth:780,scale:2,buttons:{contextButton:{className:\"highcharts-contextbutton\",menuClassName:\"highcharts-contextmenu\",symbol:\"menu\",_titleKey:\"contextButtonTitle\",menuItems:[{textKey:\"printChart\",onclick:function(){this.print()}},{separator:!0},{textKey:\"downloadPNG\",onclick:function(){this.exportChart()}},\n{textKey:\"downloadJPEG\",onclick:function(){this.exportChart({type:\"image/jpeg\"})}},{textKey:\"downloadPDF\",onclick:function(){this.exportChart({type:\"application/pdf\"})}},{textKey:\"downloadSVG\",onclick:function(){this.exportChart({type:\"image/svg+xml\"})}}]}}};f.post=function(a,b,e){var c=t(\"form\",n({method:\"post\",action:a,enctype:\"multipart/form-data\"},e),{display:\"none\"},p.body);F(b,function(a,b){t(\"input\",{type:\"hidden\",name:b,value:a},null,c)});c.submit();B(c)};u(A.prototype,{sanitizeSVG:function(a,\nb){if(b&&b.exporting&&b.exporting.allowHTML){var e=a.match(/<\\/svg>(.*?$)/);e&&e[1]&&(e='\\x3cforeignObject x\\x3d\"0\" y\\x3d\"0\" width\\x3d\"'+b.chart.width+'\" height\\x3d\"'+b.chart.height+'\"\\x3e\\x3cbody xmlns\\x3d\"http://www.w3.org/1999/xhtml\"\\x3e'+e[1]+\"\\x3c/body\\x3e\\x3c/foreignObject\\x3e\",a=a.replace(\"\\x3c/svg\\x3e\",e+\"\\x3c/svg\\x3e\"))}a=a.replace(/zIndex=\"[^\"]+\"/g,\"\").replace(/isShadow=\"[^\"]+\"/g,\"\").replace(/symbolName=\"[^\"]+\"/g,\"\").replace(/jQuery[0-9]+=\"[^\"]+\"/g,\"\").replace(/url\\((\"|&quot;)(\\S+)(\"|&quot;)\\)/g,\n\"url($2)\").replace(/url\\([^#]+#/g,\"url(#\").replace(/<svg /,'\\x3csvg xmlns:xlink\\x3d\"http://www.w3.org/1999/xlink\" ').replace(/ (NS[0-9]+\\:)?href=/g,\" xlink:href\\x3d\").replace(/\\n/,\" \").replace(/<\\/svg>.*?$/,\"\\x3c/svg\\x3e\").replace(/(fill|stroke)=\"rgba\\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\\.]+)\\)\"/g,'$1\\x3d\"rgb($2)\" $1-opacity\\x3d\"$3\"').replace(/&nbsp;/g,\"\\u00a0\").replace(/&shy;/g,\"\\u00ad\");return a=a.replace(/<IMG /g,\"\\x3cimage \").replace(/<(\\/?)TITLE>/g,\"\\x3c$1title\\x3e\").replace(/height=([^\" ]+)/g,\n'height\\x3d\"$1\"').replace(/width=([^\" ]+)/g,'width\\x3d\"$1\"').replace(/hc-svg-href=\"([^\"]+)\">/g,'xlink:href\\x3d\"$1\"/\\x3e').replace(/ id=([^\" >]+)/g,' id\\x3d\"$1\"').replace(/class=([^\" >]+)/g,'class\\x3d\"$1\"').replace(/ transform /g,\" \").replace(/:(path|rect)/g,\"$1\").replace(/style=\"([^\"]+)\"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b,e,c,r,m,g=n(this.options,a);p.createElementNS||(p.createElementNS=function(a,b){return p.createElement(b)});\ne=t(\"div\",null,{position:\"absolute\",top:\"-9999em\",width:this.chartWidth+\"px\",height:this.chartHeight+\"px\"},p.body);c=this.renderTo.style.width;m=this.renderTo.style.height;c=g.exporting.sourceWidth||g.chart.width||/px$/.test(c)&&parseInt(c,10)||600;m=g.exporting.sourceHeight||g.chart.height||/px$/.test(m)&&parseInt(m,10)||400;u(g.chart,{animation:!1,renderTo:e,forExport:!0,renderer:\"SVGRenderer\",width:c,height:m});g.exporting.enabled=!1;delete g.data;g.series=[];h(this.series,function(a){r=n(a.userOptions,\n{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});r.isInternal||g.series.push(r)});h(this.axes,function(a){a.userOptions.internalKey||(a.userOptions.internalKey=f.uniqueKey())});b=new f.Chart(g,this.callback);a&&h([\"xAxis\",\"yAxis\",\"series\"],function(c){var d={};a[c]&&(d[c]=a[c],b.update(d))});h(this.axes,function(a){var c=f.find(b.axes,function(b){return b.options.internalKey===a.userOptions.internalKey}),d=a.getExtremes(),e=d.userMin,d=d.userMax;!c||void 0===e&&void 0===d||\nc.setExtremes(e,d,!0,!1)});c=b.getChartHTML();c=this.sanitizeSVG(c,g);g=null;b.destroy();B(e);return c},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(n({chart:{borderRadius:0}},e.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){b=this.getSVGForExport(a,b);a=n(this.options.exporting,a);f.post(a.url,{filename:a.filename||\"chart\",type:a.type,width:a.width||0,scale:a.scale,\nsvg:b},a.formAttributes)},print:function(){var a=this,b=a.container,e=[],c=b.parentNode,f=p.body,m=f.childNodes,g=a.options.exporting.printMaxWidth,d,H;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);E(a,\"beforePrint\");if(H=g&&a.chartWidth>g)d=[a.options.chart.width,void 0,!1],a.setSize(g,void 0,!1);h(m,function(a,b){1===a.nodeType&&(e[b]=a.style.display,a.style.display=\"none\")});f.appendChild(b);D.focus();D.print();setTimeout(function(){c.appendChild(b);h(m,function(a,b){1===a.nodeType&&\n(a.style.display=e[b])});a.isPrinting=!1;H&&a.setSize.apply(a,d);E(a,\"afterPrint\")},1E3)}},contextMenu:function(a,b,e,c,f,m,g){var d=this,r=d.options.navigation,k=d.chartWidth,q=d.chartHeight,n=\"cache-\"+a,l=d[n],x=Math.max(f,m),y,z;l||(d[n]=l=t(\"div\",{className:a},{position:\"absolute\",zIndex:1E3,padding:x+\"px\"},d.container),y=t(\"div\",{className:\"highcharts-menu\"},null,l),v(y,u({MozBoxShadow:\"3px 3px 10px #888\",WebkitBoxShadow:\"3px 3px 10px #888\",boxShadow:\"3px 3px 10px #888\"},r.menuStyle)),z=function(){v(l,\n{display:\"none\"});g&&g.setState(0);d.openMenu=!1},d.exportEvents.push(w(l,\"mouseleave\",function(){l.hideTimer=setTimeout(z,500)}),w(l,\"mouseenter\",function(){clearTimeout(l.hideTimer)}),w(p,\"mouseup\",function(b){d.pointer.inClass(b.target,a)||z()})),h(b,function(a){if(a){var b;a.separator?b=t(\"hr\",null,null,y):(b=t(\"div\",{className:\"highcharts-menu-item\",onclick:function(b){b&&b.stopPropagation();z();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},null,y),b.onmouseover=\nfunction(){v(this,r.menuItemHoverStyle)},b.onmouseout=function(){v(this,r.menuItemStyle)},v(b,u({cursor:\"pointer\"},r.menuItemStyle)));d.exportDivElements.push(b)}}),d.exportDivElements.push(y,l),d.exportMenuWidth=l.offsetWidth,d.exportMenuHeight=l.offsetHeight);b={display:\"block\"};e+d.exportMenuWidth>k?b.right=k-e-f-x+\"px\":b.left=e-x+\"px\";c+m+d.exportMenuHeight>q&&\"top\"!==g.alignOptions.verticalAlign?b.bottom=q-c-x+\"px\":b.top=c+m-x+\"px\";v(l,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer,\nc=n(b.options.navigation.buttonOptions,a),f=c.onclick,m=c.menuItems,g,d,k=c.symbolSize||12;b.btnCount||(b.btnCount=0);b.exportDivElements||(b.exportDivElements=[],b.exportSVGElements=[]);if(!1!==c.enabled){var h=c.theme,q=h.states,p=q&&q.hover,q=q&&q.select,l;delete h.states;f?l=function(a){a.stopPropagation();f.call(b,a)}:m&&(l=function(){b.contextMenu(d.menuClassName,m,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?h.paddingLeft=C(h.paddingLeft,25):c.text||u(h,{width:c.width,\nheight:c.height,padding:0});d=e.button(c.text,0,0,l,h,p,q).addClass(a.className).attr({\"stroke-linecap\":\"round\",title:b.options.lang[c._titleKey],zIndex:3});d.menuClassName=a.menuClassName||\"highcharts-menu-\"+b.btnCount++;c.symbol&&(g=e.symbol(c.symbol,c.symbolX-k/2,c.symbolY-k/2,k,k).addClass(\"highcharts-button-symbol\").attr({zIndex:1}).add(d),g.attr({stroke:c.symbolStroke,fill:c.symbolFill,\"stroke-width\":c.symbolStrokeWidth||1}));d.add().align(u(c,{width:d.width,x:C(c.x,b.buttonOffset)}),!0,\"spacingBox\");\nb.buttonOffset+=(d.width+c.buttonSpacing)*(\"right\"===c.align?-1:1);b.exportSVGElements.push(d,g)}},destroyExport:function(a){var b=a?a.target:this;a=b.exportSVGElements;var e=b.exportDivElements,c=b.exportEvents,f;a&&(h(a,function(a,c){a&&(a.onclick=a.ontouchstart=null,f=\"cache-\"+a.menuClassName,b[f]&&delete b[f],b.exportSVGElements[c]=a.destroy())}),a.length=0);e&&(h(e,function(a,c){clearTimeout(a.hideTimer);I(a,\"mouseleave\");b.exportDivElements[c]=a.onmouseout=a.onmouseover=a.ontouchstart=a.onclick=\nnull;B(a)}),e.length=0);c&&(h(c,function(a){a()}),c.length=0)}});K.menu=function(a,b,e,c){return[\"M\",a,b+2.5,\"L\",a+e,b+2.5,\"M\",a,b+c/2+.5,\"L\",a+e,b+c/2+.5,\"M\",a,b+c-1.5,\"L\",a+e,b+c-1.5]};A.prototype.renderExporting=function(){var a=this,b=a.options.exporting,e=b.buttons,c=a.isDirtyExporting||!a.exportSVGElements;a.buttonOffset=0;a.isDirtyExporting&&a.destroyExport();c&&!1!==b.enabled&&(a.exportEvents=[],F(e,function(b){a.addButton(b)}),a.isDirtyExporting=!1);w(a,\"destroy\",a.destroyExport)};A.prototype.callbacks.push(function(a){a.renderExporting();\nw(a,\"redraw\",a.renderExporting);h([\"exporting\",\"navigation\"],function(b){a[b]={update:function(e,c){a.isDirtyExporting=!0;n(!0,a.options[b],e);C(c,!0)&&a.redraw()}}})})})(k)});\n"
  },
  {
    "path": "assets/highcharts/modules/exporting.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Exporting module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Exporting module\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /* eslint indent:0 */\n\n        // create shortcuts\n        var defaultOptions = H.defaultOptions,\n            doc = H.doc,\n            Chart = H.Chart,\n            addEvent = H.addEvent,\n            removeEvent = H.removeEvent,\n            fireEvent = H.fireEvent,\n            createElement = H.createElement,\n            discardElement = H.discardElement,\n            css = H.css,\n            merge = H.merge,\n            pick = H.pick,\n            each = H.each,\n            objectEach = H.objectEach,\n            extend = H.extend,\n            isTouchDevice = H.isTouchDevice,\n            win = H.win,\n            userAgent = win.navigator.userAgent,\n            SVGRenderer = H.SVGRenderer,\n            symbols = H.Renderer.prototype.symbols,\n            isMSBrowser = /Edge\\/|Trident\\/|MSIE /.test(userAgent),\n            isFirefoxBrowser = /firefox/i.test(userAgent);\n\n        // Add language\n        extend(defaultOptions.lang, {\n            printChart: 'Print chart',\n            downloadPNG: 'Download PNG image',\n            downloadJPEG: 'Download JPEG image',\n            downloadPDF: 'Download PDF document',\n            downloadSVG: 'Download SVG vector image',\n            contextButtonTitle: 'Chart context menu'\n        });\n\n        // Buttons and menus are collected in a separate config option set called 'navigation'.\n        // This can be extended later to add control buttons like zoom and pan right click menus.\n        defaultOptions.navigation = {\n            buttonOptions: {\n                theme: {},\n                symbolSize: 14,\n                symbolX: 12.5,\n                symbolY: 10.5,\n                align: 'right',\n                buttonSpacing: 3,\n                height: 22,\n                // text: null,\n                verticalAlign: 'top',\n                width: 24\n            }\n        };\n\n\n        // Presentational attributes\n        merge(true, defaultOptions.navigation, {\n            menuStyle: {\n                border: '1px solid #999999',\n                background: '#ffffff',\n                padding: '5px 0'\n            },\n            menuItemStyle: {\n                padding: '0.5em 1em',\n                background: 'none',\n                color: '#333333',\n                fontSize: isTouchDevice ? '14px' : '11px',\n                transition: 'background 250ms, color 250ms'\n            },\n            menuItemHoverStyle: {\n                background: '#335cad',\n                color: '#ffffff'\n            },\n            buttonOptions: {\n                symbolFill: '#666666',\n                symbolStroke: '#666666',\n                symbolStrokeWidth: 3,\n                theme: {\n                    fill: '#ffffff', // capture hover\n                    stroke: 'none',\n                    padding: 5\n                }\n            }\n        });\n\n\n\n        // Add the export related options\n        defaultOptions.exporting = {\n            //enabled: true,\n            //filename: 'chart',\n            type: 'image/png',\n            url: 'https://export.highcharts.com/',\n            //width: undefined,\n            printMaxWidth: 780,\n            scale: 2,\n            buttons: {\n                contextButton: {\n                    className: 'highcharts-contextbutton',\n                    menuClassName: 'highcharts-contextmenu',\n                    //x: -10,\n                    symbol: 'menu',\n                    _titleKey: 'contextButtonTitle',\n                    menuItems: [{\n                        textKey: 'printChart',\n                        onclick: function() {\n                            this.print();\n                        }\n                    }, {\n                        separator: true\n                    }, {\n                        textKey: 'downloadPNG',\n                        onclick: function() {\n                            this.exportChart();\n                        }\n                    }, {\n                        textKey: 'downloadJPEG',\n                        onclick: function() {\n                            this.exportChart({\n                                type: 'image/jpeg'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadPDF',\n                        onclick: function() {\n                            this.exportChart({\n                                type: 'application/pdf'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadSVG',\n                        onclick: function() {\n                            this.exportChart({\n                                type: 'image/svg+xml'\n                            });\n                        }\n                    }]\n                }\n            }\n        };\n\n        // Add the H.post utility\n        H.post = function(url, data, formAttributes) {\n            // create the form\n            var form = createElement('form', merge({\n                method: 'post',\n                action: url,\n                enctype: 'multipart/form-data'\n            }, formAttributes), {\n                display: 'none'\n            }, doc.body);\n\n            // add the data\n            objectEach(data, function(val, name) {\n                createElement('input', {\n                    type: 'hidden',\n                    name: name,\n                    value: val\n                }, null, form);\n            });\n\n            // submit\n            form.submit();\n\n            // clean up\n            discardElement(form);\n        };\n\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n            /**\n             * A collection of fixes on the produced SVG to account for expando properties,\n             * browser bugs, VML problems and other. Returns a cleaned SVG.\n             */\n            sanitizeSVG: function(svg, options) {\n                // Move HTML into a foreignObject\n                if (options && options.exporting && options.exporting.allowHTML) {\n                    var html = svg.match(/<\\/svg>(.*?$)/);\n                    if (html && html[1]) {\n                        html = '<foreignObject x=\"0\" y=\"0\" ' +\n                            'width=\"' + options.chart.width + '\" ' +\n                            'height=\"' + options.chart.height + '\">' +\n                            '<body xmlns=\"http://www.w3.org/1999/xhtml\">' +\n                            html[1] +\n                            '</body>' +\n                            '</foreignObject>';\n                        svg = svg.replace('</svg>', html + '</svg>');\n                    }\n                }\n\n                svg = svg\n                    .replace(/zIndex=\"[^\"]+\"/g, '')\n                    .replace(/isShadow=\"[^\"]+\"/g, '')\n                    .replace(/symbolName=\"[^\"]+\"/g, '')\n                    .replace(/jQuery[0-9]+=\"[^\"]+\"/g, '')\n                    .replace(/url\\((\"|&quot;)(\\S+)(\"|&quot;)\\)/g, 'url($2)')\n                    .replace(/url\\([^#]+#/g, 'url(#')\n                    .replace(/<svg /, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ')\n                    .replace(/ (NS[0-9]+\\:)?href=/g, ' xlink:href=') // #3567\n                    .replace(/\\n/, ' ')\n                    // Any HTML added to the container after the SVG (#894)\n                    .replace(/<\\/svg>.*?$/, '</svg>')\n                    // Batik doesn't support rgba fills and strokes (#3095)\n                    .replace(/(fill|stroke)=\"rgba\\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\\.]+)\\)\"/g, '$1=\"rgb($2)\" $1-opacity=\"$3\"')\n                    /* This fails in IE < 8\n                    .replace(/([0-9]+)\\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight\n                    \treturn s2 +'.'+ s3[0];\n                    })*/\n\n                    // Replace HTML entities, issue #347\n                    .replace(/&nbsp;/g, '\\u00A0') // no-break space\n                    .replace(/&shy;/g, '\\u00AD'); // soft hyphen\n\n\n                // IE specific\n                svg = svg\n                    .replace(/<IMG /g, '<image ')\n                    .replace(/<(\\/?)TITLE>/g, '<$1title>')\n                    .replace(/height=([^\" ]+)/g, 'height=\"$1\"')\n                    .replace(/width=([^\" ]+)/g, 'width=\"$1\"')\n                    .replace(/hc-svg-href=\"([^\"]+)\">/g, 'xlink:href=\"$1\"/>')\n                    .replace(/ id=([^\" >]+)/g, ' id=\"$1\"') // #4003\n                    .replace(/class=([^\" >]+)/g, 'class=\"$1\"')\n                    .replace(/ transform /g, ' ')\n                    .replace(/:(path|rect)/g, '$1')\n                    .replace(/style=\"([^\"]+)\"/g, function(s) {\n                        return s.toLowerCase();\n                    });\n\n\n                return svg;\n            },\n\n            /**\n             * Return innerHTML of chart. Used as hook for plugins.\n             */\n            getChartHTML: function() {\n\n                return this.container.innerHTML;\n            },\n\n            /**\n             * Return an SVG representation of the chart.\n             *\n             * @param  chartOptions {Options}\n             *         Additional chart options for the generated SVG representation.\n             *         For collections like `xAxis`, `yAxis` or `series`, the additional\n             *         options is either merged in to the orininal item of the same\n             *         `id`, or to the first item if a common id is not found.\n             * @return {String}\n             *         The SVG representation of the rendered chart.\n             * @sample highcharts/members/chart-getsvg/\n             *         View the SVG from a button\n             */\n            getSVG: function(chartOptions) {\n                var chart = this,\n                    chartCopy,\n                    sandbox,\n                    svg,\n                    seriesOptions,\n                    sourceWidth,\n                    sourceHeight,\n                    cssWidth,\n                    cssHeight,\n                    options = merge(chart.options, chartOptions); // copy the options and add extra options\n\n\n                // IE compatibility hack for generating SVG content that it doesn't really understand\n                if (!doc.createElementNS) {\n                    doc.createElementNS = function(ns, tagName) {\n                        return doc.createElement(tagName);\n                    };\n                }\n\n                // create a sandbox where a new chart will be generated\n                sandbox = createElement('div', null, {\n                    position: 'absolute',\n                    top: '-9999em',\n                    width: chart.chartWidth + 'px',\n                    height: chart.chartHeight + 'px'\n                }, doc.body);\n\n                // get the source size\n                cssWidth = chart.renderTo.style.width;\n                cssHeight = chart.renderTo.style.height;\n                sourceWidth = options.exporting.sourceWidth ||\n                    options.chart.width ||\n                    (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||\n                    600;\n                sourceHeight = options.exporting.sourceHeight ||\n                    options.chart.height ||\n                    (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||\n                    400;\n\n                // override some options\n                extend(options.chart, {\n                    animation: false,\n                    renderTo: sandbox,\n                    forExport: true,\n                    renderer: 'SVGRenderer',\n                    width: sourceWidth,\n                    height: sourceHeight\n                });\n                options.exporting.enabled = false; // hide buttons in print\n                delete options.data; // #3004\n\n                // prepare for replicating the chart\n                options.series = [];\n                each(chart.series, function(serie) {\n                    seriesOptions = merge(serie.userOptions, { // #4912\n                        animation: false, // turn off animation\n                        enableMouseTracking: false,\n                        showCheckbox: false,\n                        visible: serie.visible\n                    });\n\n                    if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set\n                        options.series.push(seriesOptions);\n                    }\n                });\n\n                // Assign an internal key to ensure a one-to-one mapping (#5924)\n                each(chart.axes, function(axis) {\n                    if (!axis.userOptions.internalKey) { // #6444\n                        axis.userOptions.internalKey = H.uniqueKey();\n                    }\n                });\n\n                // generate the chart copy\n                chartCopy = new H.Chart(options, chart.callback);\n\n                // Axis options and series options  (#2022, #3900, #5982)\n                if (chartOptions) {\n                    each(['xAxis', 'yAxis', 'series'], function(coll) {\n                        var collOptions = {};\n                        if (chartOptions[coll]) {\n                            collOptions[coll] = chartOptions[coll];\n                            chartCopy.update(collOptions);\n                        }\n                    });\n                }\n\n                // Reflect axis extremes in the export (#5924)\n                each(chart.axes, function(axis) {\n                    var axisCopy = H.find(chartCopy.axes, function(copy) {\n                            return copy.options.internalKey ===\n                                axis.userOptions.internalKey;\n                        }),\n                        extremes = axis.getExtremes(),\n                        userMin = extremes.userMin,\n                        userMax = extremes.userMax;\n\n                    if (axisCopy && (userMin !== undefined || userMax !== undefined)) {\n                        axisCopy.setExtremes(userMin, userMax, true, false);\n                    }\n                });\n\n                // Get the SVG from the container's innerHTML\n                svg = chartCopy.getChartHTML();\n\n                svg = chart.sanitizeSVG(svg, options);\n\n                // free up memory\n                options = null;\n                chartCopy.destroy();\n                discardElement(sandbox);\n\n                return svg;\n            },\n\n            getSVGForExport: function(options, chartOptions) {\n                var chartExportingOptions = this.options.exporting;\n\n                return this.getSVG(merge({\n                        chart: {\n                            borderRadius: 0\n                        }\n                    },\n                    chartExportingOptions.chartOptions,\n                    chartOptions, {\n                        exporting: {\n                            sourceWidth: (options && options.sourceWidth) || chartExportingOptions.sourceWidth,\n                            sourceHeight: (options && options.sourceHeight) || chartExportingOptions.sourceHeight\n                        }\n                    }\n                ));\n            },\n\n            /**\n             * Exporting module required. Submit an SVG version of the chart to a server\n             * along with some parameters for conversion.\n             * @param  {Object} exportingOptions\n             *         Exporting options in addition to those defined in {@link\n             *         https://api.highcharts.com/highcharts/exporting|exporting}.\n             * @param  {String} exportingOptions.filename\n             *         The file name for the export without extension.\n             * @param  {String} exportingOptions.url\n             *         The URL for the server module to do the conversion.\n             * @param  {Number} exportingOptions.width\n             *         The width of the PNG or JPG image generated on the server.\n             * @param  {String} exportingOptions.type\n             *         The MIME type of the converted image.\n             * @param  {Number} exportingOptions.sourceWidth\n             *         The pixel width of the source (in-page) chart.\n             * @param  {Number} exportingOptions.sourceHeight\n             *         The pixel height of the source (in-page) chart.\n             * @param  {Options} chartOptions\n             *         Additional chart options for the exported chart. For example a\n             *         different background color can be added here, or `dataLabels`\n             *         for export only.\n             *\n             * @sample highcharts/members/chart-exportchart/\n             *         Export with no options\n             * @sample highcharts/members/chart-exportchart-filename/\n             *         PDF type and custom filename\n             * @sample highcharts/members/chart-exportchart-custom-background/\n             *         Different chart background in export\n             * @sample stock/members/chart-exportchart/\n             *         Export with Highstock\n             */\n            exportChart: function(exportingOptions, chartOptions) {\n\n                var svg = this.getSVGForExport(exportingOptions, chartOptions);\n\n                // merge the options\n                exportingOptions = merge(this.options.exporting, exportingOptions);\n\n                // do the post\n                H.post(exportingOptions.url, {\n                    filename: exportingOptions.filename || 'chart',\n                    type: exportingOptions.type,\n                    width: exportingOptions.width || 0, // IE8 fails to post undefined correctly, so use 0\n                    scale: exportingOptions.scale,\n                    svg: svg\n                }, exportingOptions.formAttributes);\n\n            },\n\n            /**\n             * Exporting module required. Clears away other elements in the page and\n             * prints the chart as it is displayed. By default, when the exporting\n             * module is enabled, a context button with a drop down menu in the upper\n             * right corner accesses this function.\n             *\n             * @sample highcharts/members/chart-print/\n             *         Print from a HTML button\n             */\n            print: function() {\n\n                var chart = this,\n                    container = chart.container,\n                    origDisplay = [],\n                    origParent = container.parentNode,\n                    body = doc.body,\n                    childNodes = body.childNodes,\n                    printMaxWidth = chart.options.exporting.printMaxWidth,\n                    resetParams,\n                    handleMaxWidth;\n\n                if (chart.isPrinting) { // block the button while in printing mode\n                    return;\n                }\n\n                chart.isPrinting = true;\n                chart.pointer.reset(null, 0);\n\n                fireEvent(chart, 'beforePrint');\n\n                // Handle printMaxWidth\n                handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;\n                if (handleMaxWidth) {\n                    resetParams = [chart.options.chart.width, undefined, false];\n                    chart.setSize(printMaxWidth, undefined, false);\n                }\n\n                // hide all body content\n                each(childNodes, function(node, i) {\n                    if (node.nodeType === 1) {\n                        origDisplay[i] = node.style.display;\n                        node.style.display = 'none';\n                    }\n                });\n\n                // pull out the chart\n                body.appendChild(container);\n\n                // print\n                win.focus(); // #1510\n                win.print();\n\n                // allow the browser to prepare before reverting\n                setTimeout(function() {\n\n                    // put the chart back in\n                    origParent.appendChild(container);\n\n                    // restore all body content\n                    each(childNodes, function(node, i) {\n                        if (node.nodeType === 1) {\n                            node.style.display = origDisplay[i];\n                        }\n                    });\n\n                    chart.isPrinting = false;\n\n                    // Reset printMaxWidth\n                    if (handleMaxWidth) {\n                        chart.setSize.apply(chart, resetParams);\n                    }\n\n                    fireEvent(chart, 'afterPrint');\n\n                }, 1000);\n\n            },\n\n            /**\n             * Display a popup menu for choosing the export type\n             *\n             * @param {String} className An identifier for the menu\n             * @param {Array} items A collection with text and onclicks for the items\n             * @param {Number} x The x position of the opener button\n             * @param {Number} y The y position of the opener button\n             * @param {Number} width The width of the opener button\n             * @param {Number} height The height of the opener button\n             */\n            contextMenu: function(className, items, x, y, width, height, button) {\n                var chart = this,\n                    navOptions = chart.options.navigation,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    cacheName = 'cache-' + className,\n                    menu = chart[cacheName],\n                    menuPadding = Math.max(width, height), // for mouse leave detection\n                    innerMenu,\n                    hide,\n                    menuStyle;\n\n                // create the menu only the first time\n                if (!menu) {\n\n                    // create a HTML element above the SVG\n                    chart[cacheName] = menu = createElement('div', {\n                        className: className\n                    }, {\n                        position: 'absolute',\n                        zIndex: 1000,\n                        padding: menuPadding + 'px'\n                    }, chart.container);\n\n                    innerMenu = createElement('div', {\n                        className: 'highcharts-menu'\n                    }, null, menu);\n\n\n                    // Presentational CSS\n                    css(innerMenu, extend({\n                        MozBoxShadow: '3px 3px 10px #888',\n                        WebkitBoxShadow: '3px 3px 10px #888',\n                        boxShadow: '3px 3px 10px #888'\n                    }, navOptions.menuStyle));\n\n\n                    // hide on mouse out\n                    hide = function() {\n                        css(menu, {\n                            display: 'none'\n                        });\n                        if (button) {\n                            button.setState(0);\n                        }\n                        chart.openMenu = false;\n                    };\n\n                    // Hide the menu some time after mouse leave (#1357)\n                    chart.exportEvents.push(\n                        addEvent(menu, 'mouseleave', function() {\n                            menu.hideTimer = setTimeout(hide, 500);\n                        }),\n                        addEvent(menu, 'mouseenter', function() {\n                            clearTimeout(menu.hideTimer);\n                        }),\n\n                        // Hide it on clicking or touching outside the menu (#2258, #2335,\n                        // #2407)\n                        addEvent(doc, 'mouseup', function(e) {\n                            if (!chart.pointer.inClass(e.target, className)) {\n                                hide();\n                            }\n                        })\n                    );\n\n                    // create the items\n                    each(items, function(item) {\n                        if (item) {\n                            var element;\n\n                            if (item.separator) {\n                                element = createElement('hr', null, null, innerMenu);\n\n                            } else {\n                                element = createElement('div', {\n                                    className: 'highcharts-menu-item',\n                                    onclick: function(e) {\n                                        if (e) { // IE7\n                                            e.stopPropagation();\n                                        }\n                                        hide();\n                                        if (item.onclick) {\n                                            item.onclick.apply(chart, arguments);\n                                        }\n                                    },\n                                    innerHTML: item.text || chart.options.lang[item.textKey]\n                                }, null, innerMenu);\n\n\n                                element.onmouseover = function() {\n                                    css(this, navOptions.menuItemHoverStyle);\n                                };\n                                element.onmouseout = function() {\n                                    css(this, navOptions.menuItemStyle);\n                                };\n                                css(element, extend({\n                                    cursor: 'pointer'\n                                }, navOptions.menuItemStyle));\n\n                            }\n\n                            // Keep references to menu divs to be able to destroy them\n                            chart.exportDivElements.push(element);\n                        }\n                    });\n\n                    // Keep references to menu and innerMenu div to be able to destroy them\n                    chart.exportDivElements.push(innerMenu, menu);\n\n                    chart.exportMenuWidth = menu.offsetWidth;\n                    chart.exportMenuHeight = menu.offsetHeight;\n                }\n\n                menuStyle = {\n                    display: 'block'\n                };\n\n                // if outside right, right align it\n                if (x + chart.exportMenuWidth > chartWidth) {\n                    menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';\n                } else {\n                    menuStyle.left = (x - menuPadding) + 'px';\n                }\n                // if outside bottom, bottom align it\n                if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {\n                    menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';\n                } else {\n                    menuStyle.top = (y + height - menuPadding) + 'px';\n                }\n\n                css(menu, menuStyle);\n                chart.openMenu = true;\n            },\n\n            /**\n             * Add the export button to the chart\n             */\n            addButton: function(options) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    btnOptions = merge(chart.options.navigation.buttonOptions, options),\n                    onclick = btnOptions.onclick,\n                    menuItems = btnOptions.menuItems,\n                    symbol,\n                    button,\n                    symbolSize = btnOptions.symbolSize || 12;\n                if (!chart.btnCount) {\n                    chart.btnCount = 0;\n                }\n\n                // Keeps references to the button elements\n                if (!chart.exportDivElements) {\n                    chart.exportDivElements = [];\n                    chart.exportSVGElements = [];\n                }\n\n                if (btnOptions.enabled === false) {\n                    return;\n                }\n\n\n                var attr = btnOptions.theme,\n                    states = attr.states,\n                    hover = states && states.hover,\n                    select = states && states.select,\n                    callback;\n\n                delete attr.states;\n\n                if (onclick) {\n                    callback = function(e) {\n                        e.stopPropagation();\n                        onclick.call(chart, e);\n                    };\n\n                } else if (menuItems) {\n                    callback = function() {\n                        chart.contextMenu(\n                            button.menuClassName,\n                            menuItems,\n                            button.translateX,\n                            button.translateY,\n                            button.width,\n                            button.height,\n                            button\n                        );\n                        button.setState(2);\n                    };\n                }\n\n\n                if (btnOptions.text && btnOptions.symbol) {\n                    attr.paddingLeft = pick(attr.paddingLeft, 25);\n\n                } else if (!btnOptions.text) {\n                    extend(attr, {\n                        width: btnOptions.width,\n                        height: btnOptions.height,\n                        padding: 0\n                    });\n                }\n\n                button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)\n                    .addClass(options.className)\n                    .attr({\n\n                        'stroke-linecap': 'round',\n\n                        title: chart.options.lang[btnOptions._titleKey],\n                        zIndex: 3 // #4955\n                    });\n                button.menuClassName = options.menuClassName || 'highcharts-menu-' + chart.btnCount++;\n\n                if (btnOptions.symbol) {\n                    symbol = renderer.symbol(\n                            btnOptions.symbol,\n                            btnOptions.symbolX - (symbolSize / 2),\n                            btnOptions.symbolY - (symbolSize / 2),\n                            symbolSize,\n                            symbolSize\n                        )\n                        .addClass('highcharts-button-symbol')\n                        .attr({\n                            zIndex: 1\n                        }).add(button);\n\n\n                    symbol.attr({\n                        stroke: btnOptions.symbolStroke,\n                        fill: btnOptions.symbolFill,\n                        'stroke-width': btnOptions.symbolStrokeWidth || 1\n                    });\n\n                }\n\n                button.add()\n                    .align(extend(btnOptions, {\n                        width: button.width,\n                        x: pick(btnOptions.x, chart.buttonOffset) // #1654\n                    }), true, 'spacingBox');\n\n                chart.buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);\n\n                chart.exportSVGElements.push(button, symbol);\n\n            },\n\n            /**\n             * Destroy the buttons.\n             */\n            destroyExport: function(e) {\n                var chart = e ? e.target : this,\n                    exportSVGElements = chart.exportSVGElements,\n                    exportDivElements = chart.exportDivElements,\n                    exportEvents = chart.exportEvents,\n                    cacheName;\n\n                // Destroy the extra buttons added\n                if (exportSVGElements) {\n                    each(exportSVGElements, function(elem, i) {\n\n                        // Destroy and null the svg/vml elements\n                        if (elem) { // #1822\n                            elem.onclick = elem.ontouchstart = null;\n                            cacheName = 'cache-' + elem.menuClassName;\n\n                            if (chart[cacheName]) {\n                                delete chart[cacheName];\n                            }\n\n                            chart.exportSVGElements[i] = elem.destroy();\n                        }\n                    });\n                    exportSVGElements.length = 0;\n                }\n\n                // Destroy the divs for the menu\n                if (exportDivElements) {\n                    each(exportDivElements, function(elem, i) {\n\n                        // Remove the event handler\n                        clearTimeout(elem.hideTimer); // #5427\n                        removeEvent(elem, 'mouseleave');\n\n                        // Remove inline events\n                        chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;\n\n                        // Destroy the div by moving to garbage bin\n                        discardElement(elem);\n                    });\n                    exportDivElements.length = 0;\n                }\n\n                if (exportEvents) {\n                    each(exportEvents, function(unbind) {\n                        unbind();\n                    });\n                    exportEvents.length = 0;\n                }\n            }\n        });\n\n\n\n\n        symbols.menu = function(x, y, width, height) {\n            var arr = [\n                'M', x, y + 2.5,\n                'L', x + width, y + 2.5,\n                'M', x, y + height / 2 + 0.5,\n                'L', x + width, y + height / 2 + 0.5,\n                'M', x, y + height - 1.5,\n                'L', x + width, y + height - 1.5\n            ];\n            return arr;\n        };\n\n        // Add the buttons on chart load\n        Chart.prototype.renderExporting = function() {\n            var chart = this,\n                exportingOptions = chart.options.exporting,\n                buttons = exportingOptions.buttons,\n                isDirty = chart.isDirtyExporting || !chart.exportSVGElements;\n\n            chart.buttonOffset = 0;\n            if (chart.isDirtyExporting) {\n                chart.destroyExport();\n            }\n\n            if (isDirty && exportingOptions.enabled !== false) {\n                chart.exportEvents = [];\n\n                objectEach(buttons, function(button) {\n                    chart.addButton(button);\n                });\n\n                chart.isDirtyExporting = false;\n            }\n\n            // Destroy the export elements at chart destroy\n            addEvent(chart, 'destroy', chart.destroyExport);\n        };\n\n        Chart.prototype.callbacks.push(function(chart) {\n\n            function update(prop, options, redraw) {\n                chart.isDirtyExporting = true;\n                merge(true, chart.options[prop], options);\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n\n            }\n\n            chart.renderExporting();\n\n            addEvent(chart, 'redraw', chart.renderExporting);\n\n            // Add update methods to handle chart.update and chart.exporting.update\n            // and chart.navigation.update.\n            each(['exporting', 'navigation'], function(prop) {\n                chart[prop] = {\n                    update: function(options, redraw) {\n                        update(prop, options, redraw);\n                    }\n                };\n            });\n\n            // Uncomment this to see a button directly below the chart, for quick\n            // testing of export\n            /*\n            if (!chart.renderer.forExport) {\n            \tvar button;\n\n            \t// View SVG Image\n            \tbutton = doc.createElement('button');\n            \tbutton.innerHTML = 'View SVG Image';\n            \tchart.renderTo.parentNode.appendChild(button);\n            \tbutton.onclick = function () {\n            \t\tvar div = doc.createElement('div');\n            \t\tdiv.innerHTML = chart.getSVGForExport();\n            \t\tchart.renderTo.parentNode.appendChild(div);\n            \t};\n\n            \t// View SVG Source\n            \tbutton = doc.createElement('button');\n            \tbutton.innerHTML = 'View SVG Source';\n            \tchart.renderTo.parentNode.appendChild(button);\n            \tbutton.onclick = function () {\n            \t\tvar pre = doc.createElement('pre');\n            \t\tpre.innerHTML = chart.getSVGForExport()\n            \t\t\t.replace(/</g, '\\n&lt;')\n            \t\t\t.replace(/>/g, '&gt;');\n            \t\tchart.renderTo.parentNode.appendChild(pre);\n            \t};\n            }\n            // */\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/funnel.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Highcharts funnel module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(e){\"object\"===typeof module&&module.exports?module.exports=e:e(Highcharts)})(function(e){(function(g){var e=g.seriesType,C=g.seriesTypes,H=g.noop,D=g.pick,I=g.each;e(\"funnel\",\"pie\",{animation:!1,center:[\"50%\",\"50%\"],width:\"90%\",neckWidth:\"30%\",height:\"100%\",neckHeight:\"25%\",reversed:!1,size:!0,dataLabels:{connectorWidth:1},states:{select:{color:\"#cccccc\",borderColor:\"#000000\",shadow:!1}}},{animate:H,translate:function(){var b=function(a,b){return/%$/.test(a)?b*parseInt(a,10)/100:parseInt(a,\n10)},E=0,c=this.chart,f=this.options,d=f.reversed,e=f.ignoreHiddenPoint,t=c.plotWidth,c=c.plotHeight,q=0,g=f.center,h=b(g[0],t),r=b(g[1],c),C=b(f.width,t),l,v,m=b(f.height,c),w=b(f.neckWidth,t),F=b(f.neckHeight,c),x=r-m/2+m-F,b=this.data,z,A,D=\"left\"===f.dataLabels.position?1:0,B,n,G,u,k,y,p;this.getWidthAt=v=function(a){var b=r-m/2;return a>x||m===F?w:w+(C-w)*(1-(a-b)/(m-F))};this.getX=function(a,b,c){return h+(b?-1:1)*(v(d?2*r-a:a)/2+c.labelDistance)};this.center=[h,r,m];this.centerX=h;I(b,function(a){e&&\n!1===a.visible||(E+=a.y)});I(b,function(a){p=null;A=E?a.y/E:0;n=r-m/2+q*m;k=n+A*m;l=v(n);B=h-l/2;G=B+l;l=v(k);u=h-l/2;y=u+l;n>x?(B=u=h-w/2,G=y=h+w/2):k>x&&(p=k,l=v(x),u=h-l/2,y=u+l,k=x);d&&(n=2*r-n,k=2*r-k,p=p?2*r-p:null);z=[\"M\",B,n,\"L\",G,n,y,k];p&&z.push(y,p,u,p);z.push(u,k,\"Z\");a.shapeType=\"path\";a.shapeArgs={d:z};a.percentage=100*A;a.plotX=h;a.plotY=(n+(p||k))/2;a.tooltipPos=[h,a.plotY];a.slice=H;a.half=D;e&&!1===a.visible||(q+=A)})},sortByAngle:function(b){b.sort(function(b,c){return b.plotY-\nc.plotY})},drawDataLabels:function(){var b=this.data,e=this.options.dataLabels.distance,c,f,d,g=b.length,t,q;for(this.center[2]-=2*e;g--;)d=b[g],f=(c=d.half)?1:-1,q=d.plotY,d.labelDistance=D(d.options.dataLabels&&d.options.dataLabels.distance,e),this.maxLabelDistance=Math.max(d.labelDistance,this.maxLabelDistance||0),t=this.getX(q,c,d),d.labelPos=[0,q,t+(d.labelDistance-5)*f,q,t+d.labelDistance*f,q,c?\"right\":\"left\",0];C.pie.prototype.drawDataLabels.call(this)}});e(\"pyramid\",\"funnel\",{neckWidth:\"0%\",\nneckHeight:\"0%\",reversed:!0})})(e)});\n"
  },
  {
    "path": "assets/highcharts/modules/funnel.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Highcharts funnel module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Highcharts funnel module\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* eslint indent:0 */\n\n        // create shortcuts\n        var seriesType = Highcharts.seriesType,\n            seriesTypes = Highcharts.seriesTypes,\n            noop = Highcharts.noop,\n            pick = Highcharts.pick,\n            each = Highcharts.each;\n\n\n        seriesType('funnel', 'pie', {\n                animation: false,\n                center: ['50%', '50%'],\n                width: '90%',\n                neckWidth: '30%',\n                height: '100%',\n                neckHeight: '25%',\n                reversed: false,\n                size: true, // to avoid adapting to data label size in Pie.drawDataLabels\n\n\n                // Presentational\n                dataLabels: {\n                    //position: 'right',\n                    connectorWidth: 1\n                    //connectorColor: null\n                },\n                states: {\n                    select: {\n                        color: '#cccccc',\n                        borderColor: '#000000',\n                        shadow: false\n                    }\n                }\n\n            },\n\n            // Properties\n            {\n                animate: noop,\n\n                /**\n                 * Overrides the pie translate method\n                 */\n                translate: function() {\n\n                    var\n                        // Get positions - either an integer or a percentage string must be given\n                        getLength = function(length, relativeTo) {\n                            return (/%$/).test(length) ?\n                                relativeTo * parseInt(length, 10) / 100 :\n                                parseInt(length, 10);\n                        },\n\n                        sum = 0,\n                        series = this,\n                        chart = series.chart,\n                        options = series.options,\n                        reversed = options.reversed,\n                        ignoreHiddenPoint = options.ignoreHiddenPoint,\n                        plotWidth = chart.plotWidth,\n                        plotHeight = chart.plotHeight,\n                        cumulative = 0, // start at top\n                        center = options.center,\n                        centerX = getLength(center[0], plotWidth),\n                        centerY = getLength(center[1], plotHeight),\n                        width = getLength(options.width, plotWidth),\n                        tempWidth,\n                        getWidthAt,\n                        height = getLength(options.height, plotHeight),\n                        neckWidth = getLength(options.neckWidth, plotWidth),\n                        neckHeight = getLength(options.neckHeight, plotHeight),\n                        neckY = (centerY - height / 2) + height - neckHeight,\n                        data = series.data,\n                        path,\n                        fraction,\n                        half = options.dataLabels.position === 'left' ? 1 : 0,\n\n                        x1,\n                        y1,\n                        x2,\n                        x3,\n                        y3,\n                        x4,\n                        y5;\n\n                    // Return the width at a specific y coordinate\n                    series.getWidthAt = getWidthAt = function(y) {\n                        var top = (centerY - height / 2);\n\n                        return y > neckY || height === neckHeight ?\n                            neckWidth :\n                            neckWidth + (width - neckWidth) * (1 - (y - top) / (height - neckHeight));\n                    };\n                    series.getX = function(y, half, point) {\n                        return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? 2 * centerY - y : y) / 2) + point.labelDistance);\n                    };\n\n                    // Expose\n                    series.center = [centerX, centerY, height];\n                    series.centerX = centerX;\n\n                    /*\n                     * Individual point coordinate naming:\n                     *\n                     * x1,y1 _________________ x2,y1\n                     *  \\                         /\n                     *   \\                       /\n                     *    \\                     /\n                     *     \\                   /\n                     *      \\                 /\n                     *     x3,y3 _________ x4,y3\n                     *\n                     * Additional for the base of the neck:\n                     *\n                     *       |               |\n                     *       |               |\n                     *       |               |\n                     *     x3,y5 _________ x4,y5\n                     */\n\n\n\n\n                    // get the total sum\n                    each(data, function(point) {\n                        if (!ignoreHiddenPoint || point.visible !== false) {\n                            sum += point.y;\n                        }\n                    });\n\n                    each(data, function(point) {\n                        // set start and end positions\n                        y5 = null;\n                        fraction = sum ? point.y / sum : 0;\n                        y1 = centerY - height / 2 + cumulative * height;\n                        y3 = y1 + fraction * height;\n                        //tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));\n                        tempWidth = getWidthAt(y1);\n                        x1 = centerX - tempWidth / 2;\n                        x2 = x1 + tempWidth;\n                        tempWidth = getWidthAt(y3);\n                        x3 = centerX - tempWidth / 2;\n                        x4 = x3 + tempWidth;\n\n                        // the entire point is within the neck\n                        if (y1 > neckY) {\n                            x1 = x3 = centerX - neckWidth / 2;\n                            x2 = x4 = centerX + neckWidth / 2;\n\n                            // the base of the neck\n                        } else if (y3 > neckY) {\n                            y5 = y3;\n\n                            tempWidth = getWidthAt(neckY);\n                            x3 = centerX - tempWidth / 2;\n                            x4 = x3 + tempWidth;\n\n                            y3 = neckY;\n                        }\n\n                        if (reversed) {\n                            y1 = 2 * centerY - y1;\n                            y3 = 2 * centerY - y3;\n                            y5 = (y5 ? 2 * centerY - y5 : null);\n                        }\n                        // save the path\n                        path = [\n                            'M',\n                            x1, y1,\n                            'L',\n                            x2, y1,\n                            x4, y3\n                        ];\n                        if (y5) {\n                            path.push(x4, y5, x3, y5);\n                        }\n                        path.push(x3, y3, 'Z');\n\n                        // prepare for using shared dr\n                        point.shapeType = 'path';\n                        point.shapeArgs = {\n                            d: path\n                        };\n\n\n                        // for tooltips and data labels\n                        point.percentage = fraction * 100;\n                        point.plotX = centerX;\n                        point.plotY = (y1 + (y5 || y3)) / 2;\n\n                        // Placement of tooltips and data labels\n                        point.tooltipPos = [\n                            centerX,\n                            point.plotY\n                        ];\n\n                        // Slice is a noop on funnel points\n                        point.slice = noop;\n\n                        // Mimicking pie data label placement logic\n                        point.half = half;\n\n                        if (!ignoreHiddenPoint || point.visible !== false) {\n                            cumulative += fraction;\n                        }\n                    });\n                },\n\n                /**\n                 * Funnel items don't have angles (#2289)\n                 */\n                sortByAngle: function(points) {\n                    points.sort(function(a, b) {\n                        return a.plotY - b.plotY;\n                    });\n                },\n\n                /**\n                 * Extend the pie data label method\n                 */\n                drawDataLabels: function() {\n                    var series = this,\n                        data = series.data,\n                        labelDistance = series.options.dataLabels.distance,\n                        leftSide,\n                        sign,\n                        point,\n                        i = data.length,\n                        x,\n                        y;\n\n                    // In the original pie label anticollision logic, the slots are distributed\n                    // from one labelDistance above to one labelDistance below the pie. In funnels\n                    // we don't want this.\n                    series.center[2] -= 2 * labelDistance;\n\n                    // Set the label position array for each point.\n                    while (i--) {\n                        point = data[i];\n                        leftSide = point.half;\n                        sign = leftSide ? 1 : -1;\n                        y = point.plotY;\n                        point.labelDistance = pick(\n                            point.options.dataLabels && point.options.dataLabels.distance,\n                            labelDistance\n                        );\n\n                        series.maxLabelDistance = Math.max(point.labelDistance, series.maxLabelDistance || 0);\n                        x = series.getX(y, leftSide, point);\n\n                        // set the anchor point for data labels\n                        point.labelPos = [\n                            0, // first break of connector\n                            y, // a/a\n                            x + (point.labelDistance - 5) * sign, // second break, right outside point shape\n                            y, // a/a\n                            x + point.labelDistance * sign, // landing point for connector\n                            y, // a/a\n                            leftSide ? 'right' : 'left', // alignment\n                            0 // center angle\n                        ];\n                    }\n\n                    seriesTypes.pie.prototype.drawDataLabels.call(this);\n                }\n\n            });\n\n        /** \n         * Pyramid series type.\n         * A pyramid series is a special type of funnel, without neck and reversed by default.\n         */\n        seriesType('pyramid', 'funnel', {\n            neckWidth: '0%',\n            neckHeight: '0%',\n            reversed: true\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/gantt.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Gantt series\n\n (c) 2016 Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(h){var p=h.dateFormat,v=h.each,w=h.isObject,r=h.pick,m=h.wrap,q=h.Axis,x=h.Chart,t=h.Tick;q.prototype.isOuterAxis=function(){var a=this,c=-1,b=!0;v(this.chart.axes,function(d,g){d.side===a.side&&(d===a?c=g:0<=c&&g>c&&(b=!1))});return b};t.prototype.getLabelWidth=function(){return this.label.getBBox().width};q.prototype.getMaxLabelLength=function(a){var c=this.tickPositions,b=this.ticks,d=0;\nif(!this.maxLabelLength||a)v(c,function(a){(a=b[a])&&a.labelLength>d&&(d=a.labelLength)}),this.maxLabelLength=d;return this.maxLabelLength};q.prototype.addTitle=function(){var a=this.chart.renderer,c=this.axisParent,b=this.horiz,d=this.opposite,g=this.options,e=g.title,f;this.showAxis=f=this.hasData()||r(g.showEmpty,!0);g.title=\"\";this.axisTitle||((g=e.textAlign)||(g=(b?{low:\"left\",middle:\"center\",high:\"right\"}:{low:d?\"right\":\"left\",middle:\"center\",high:d?\"left\":\"right\"})[e.align]),this.axisTitle=\na.text(e.text,0,0,e.useHTML).attr({zIndex:7,rotation:e.rotation||0,align:g}).addClass(\"highcharts-axis-title\").css(e.style).add(c),this.axisTitle.isNew=!0);this.axisTitle[f?\"show\":\"hide\"](!0)};h.dateFormats={W:function(a){a=new Date(a);var c=0===a.getUTCDay()?7:a.getUTCDay(),b=a.getTime(),d=new Date(a.getUTCFullYear(),0,1,-6);a.setDate(a.getUTCDate()+4-c);return 1+Math.floor(Math.floor((b-d)/864E5)/7)},E:function(a){return p(\"%a\",a,!0).charAt(0)}};m(t.prototype,\"addLabel\",function(a){var c=this.axis,\nb=void 0!==c.options.categories,d=c.tickPositions,d=this.pos!==d[d.length-1];(!c.options.grid||b||d)&&a.apply(this)});m(t.prototype,\"getLabelPosition\",function(a,c,b,d){var g=a.apply(this,Array.prototype.slice.call(arguments,1)),e=this.axis,f=e.options,k=f.tickInterval||1,n,u;f.grid&&(n=f.labels.style.fontSize,u=e.chart.renderer.fontMetrics(n,d),n=u.b,u=u.h,e.horiz&&void 0===f.categories?(f=e.axisGroup.getBBox().height,k=this.pos+k/2,g.x=e.translate(k)+e.left,k=f/2+u/2-Math.abs(u-n),g.y=0===e.side?\nb-k:b+k):(void 0===f.categories&&(k=this.pos+k/2,g.y=e.translate(k)+e.top+n/2),k=this.getLabelWidth()/2-e.maxLabelLength/2,g.x=3===e.side?g.x+k:g.x-k));return g});m(q.prototype,\"tickSize\",function(a){var c=a.apply(this,Array.prototype.slice.call(arguments,1)),b;this.options.grid&&!this.horiz&&(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),this.maxLabelLength||(this.maxLabelLength=this.getMaxLabelLength()),b=this.maxLabelLength+b,c[0]=b);return c});m(q.prototype,\"getOffset\",function(a){var c=\nthis.chart.axisOffset,b=this.side,d,g,e=this.options,f=e.title,k=f&&f.text&&!1!==f.enabled;this.options.grid&&w(this.options.title)?(g=this.tickSize(\"tick\")[0],c[b]&&g&&(d=c[b]+g),k&&this.addTitle(),a.apply(this,Array.prototype.slice.call(arguments,1)),c[b]=r(d,c[b]),e.title=f):a.apply(this,Array.prototype.slice.call(arguments,1))});m(q.prototype,\"renderUnsquish\",function(a){this.options.grid&&(this.labelRotation=0,this.options.labels.rotation=0);a.apply(this)});m(q.prototype,\"setOptions\",function(a,\nc){c.grid&&this.horiz&&(c.startOnTick=!0,c.minPadding=0,c.endOnTick=!0);a.apply(this,Array.prototype.slice.call(arguments,1))});m(q.prototype,\"render\",function(a){var c=this.options,b,d,g,e,f,k,n=this.chart.renderer;if(c.grid){if(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),b=this.maxLabelLength+b,d=c.lineWidth,this.rightWall&&this.rightWall.destroy(),a.apply(this),a=this.axisGroup.getBBox(),this.horiz&&(this.rightWall=n.path([\"M\",a.x+this.width+1,a.y,\"L\",a.x+this.width+1,a.y+a.height]).attr({stroke:c.tickColor||\n\"#ccd6eb\",\"stroke-width\":c.tickWidth||1,zIndex:7,class:\"grid-wall\"}).add(this.axisGroup)),this.isOuterAxis()&&this.axisLine&&(this.horiz&&(b=a.height-1),d)){a=this.getLinePath(d);f=a.indexOf(\"M\")+1;k=a.indexOf(\"L\")+1;g=a.indexOf(\"M\")+2;e=a.indexOf(\"L\")+2;if(0===this.side||3===this.side)b=-b;this.horiz?(a[g]+=b,a[e]+=b):(a[f]+=b,a[k]+=b);this.axisLineExtra?this.axisLineExtra.animate({d:a}):this.axisLineExtra=n.path(a).attr({stroke:c.lineColor,\"stroke-width\":d,zIndex:7}).add(this.axisGroup);this.axisLine[this.showAxis?\n\"show\":\"hide\"](!0)}}else a.apply(this)});m(x.prototype,\"render\",function(a){var c=25/11,b,d;v(this.axes,function(a){var e=a.options;e.grid&&(d=e.labels.style.fontSize,b=a.chart.renderer.fontMetrics(d),\"datetime\"===e.type&&(e.units=[[\"millisecond\",[1]],[\"second\",[1]],[\"minute\",[1]],[\"hour\",[1]],[\"day\",[1]],[\"week\",[1]],[\"month\",[1]],[\"year\",null]]),a.horiz?e.tickLength=e.cellHeight||b.h*c:(e.tickWidth=1,e.lineWidth||(e.lineWidth=1)))});a.apply(this)})})(p);(function(h){var p=h.getOptions().plotOptions,\nv=h.Color,w=h.seriesTypes.column,r=h.each,m=h.extendClass,q=h.isNumber,x=h.isObject,t=h.merge,a=h.pick,c=h.seriesTypes,b=h.wrap,d=h.Axis,g=h.Point,e=h.Series;p.xrange=t(p.column,{tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.yCategory}\\x3c/b\\x3e\\x3cbr/\\x3e'}});c.xrange=m(w,{pointClass:m(g,{getLabelConfig:function(){var a=g.prototype.getLabelConfig.call(this);a.x2=this.x2;a.yCategory=this.yCategory=this.series.yAxis.categories&&\nthis.series.yAxis.categories[this.y];return a}}),type:\"xrange\",forceDL:!0,parallelArrays:[\"x\",\"x2\",\"y\"],requireSorting:!1,animate:c.line.prototype.animate,getColumnMetrics:function(){function a(){r(c.series,function(a){var b=a.xAxis;a.xAxis=a.yAxis;a.yAxis=b})}var b,c=this.chart;a();this.yAxis.closestPointRange=1;b=w.prototype.getColumnMetrics.call(this);a();return b},cropData:function(a,b,c,d){b=e.prototype.cropData.call(this,this.x2Data,b,c,d);b.xData=a.slice(b.start,b.end);return b},translate:function(){w.prototype.translate.apply(this,\narguments);var b=this.xAxis,c=this.columnMetrics,e=this.options.minPointLength||0;r(this.points,function(d){var f=d.plotX,l=a(d.x2,d.x+(d.len||0)),l=b.toPixels(l,!0),g=l-f,h;e&&(h=e-g,0>h&&(h=0),f-=h/2,l+=h/2);f=Math.max(f,-10);l=Math.min(Math.max(l,-10),b.len+10);l<f&&(l=f);d.shapeArgs={x:f,y:d.plotY+c.offset,width:l-f,height:c.width};d.tooltipPos[0]+=g/2;d.tooltipPos[1]-=c.width/2;if(l=d.partialFill)x(l)&&(l=l.amount),q(l)||(l=0),f=d.shapeArgs,d.partShapeArgs={x:f.x,y:f.y+1,width:f.width*l,height:f.height-\n2}})},drawPoints:function(){var a=this,b=this.chart,d=a.options,c=b.renderer,e=b.pointCount<(d.animationLimit||250)?\"animate\":\"attr\";r(a.points,function(b){var f=b.graphic,g=b.shapeType,h=b.shapeArgs,k=b.partShapeArgs,l=a.options,n=b.partialFill,m=b.selected&&\"select\",p=d.stacking&&!d.borderRadius;if(q(b.plotY)&&null!==b.y){if(f){if(b.graphicOriginal[e](t(h)),k)b.graphicOverlay[e](t(k))}else b.graphic=f=c.g(\"point\").attr({\"class\":b.getClassName()}).add(b.group||a.group),b.graphicOriginal=c[g](h).addClass(\"highcharts-partfill-original\").add(f),\nk&&(b.graphicOverlay=c[g](k).addClass(\"highcharts-partfill-overlay\").add(f));b.graphicOriginal.attr(a.pointAttribs(b,m)).shadow(d.shadow,null,p);k&&(x(n)||(n={}),x(l.partialFill)&&(n=t(n,l.partialFill)),f=n.fill||v(a.color).brighten(-.3).get(\"rgb\"),b.graphicOverlay.attr(a.pointAttribs(b,m)).attr(\"fill\",f).attr(\"stroke-width\",0).shadow(d.shadow,null,p))}else f&&(b.graphic=f.destroy())})}});b(d.prototype,\"getSeriesExtremes\",function(b){var d=this.series,c,e;b.call(this);this.isXAxis&&\"xrange\"===d.type&&\n(c=a(this.dataMax,Number.MIN_VALUE),r(this.series,function(a){r(a.x2Data||[],function(a){a>c&&(c=a,e=!0)})}),e&&(this.dataMax=c))})})(p)});\n"
  },
  {
    "path": "assets/highcharts/modules/gantt.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Gantt series\n *\n * (c) 2016 Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2016 Highsoft AS\n         * Authors: Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var dateFormat = H.dateFormat,\n            each = H.each,\n            isObject = H.isObject,\n            pick = H.pick,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            Tick = H.Tick;\n\n\n        // Enum for which side the axis is on.\n        // Maps to axis.side\n        var axisSide = {\n            top: 0,\n            right: 1,\n            bottom: 2,\n            left: 3,\n            0: 'top',\n            1: 'right',\n            2: 'bottom',\n            3: 'left'\n        };\n\n        /**\n         * Checks if an axis is the outer axis in its dimension. Since\n         * axes are placed outwards in order, the axis with the highest\n         * index is the outermost axis.\n         *\n         * Example: If there are multiple x-axes at the top of the chart,\n         * this function returns true if the axis supplied is the last\n         * of the x-axes.\n         *\n         * @return true if the axis is the outermost axis in its dimension;\n         *\t\t false if not\n         */\n        Axis.prototype.isOuterAxis = function() {\n            var axis = this,\n                thisIndex = -1,\n                isOuter = true;\n\n            each(this.chart.axes, function(otherAxis, index) {\n                if (otherAxis.side === axis.side) {\n                    if (otherAxis === axis) {\n                        // Get the index of the axis in question\n                        thisIndex = index;\n\n                        // Check thisIndex >= 0 in case thisIndex has\n                        // not been found yet\n                    } else if (thisIndex >= 0 && index > thisIndex) {\n                        // There was an axis on the same side with a\n                        // higher index. Exit the loop.\n                        isOuter = false;\n                        return;\n                    }\n                }\n            });\n            // There were either no other axes on the same side,\n            // or the other axes were not farther from the chart\n            return isOuter;\n        };\n\n        /**\n         * Shortcut function to Tick.label.getBBox().width.\n         *\n         * @return {number} width - the width of the tick label\n         */\n        Tick.prototype.getLabelWidth = function() {\n            return this.label.getBBox().width;\n        };\n\n        /**\n         * Get the maximum label length.\n         * This function can be used in states where the axis.maxLabelLength has not\n         * been set.\n         *\n         * @param  {boolean} force - Optional parameter to force a new calculation, even\n         *                           if a value has already been set\n         * @return {number} maxLabelLength - the maximum label length of the axis\n         */\n        Axis.prototype.getMaxLabelLength = function(force) {\n            var tickPositions = this.tickPositions,\n                ticks = this.ticks,\n                maxLabelLength = 0;\n\n            if (!this.maxLabelLength || force) {\n                each(tickPositions, function(tick) {\n                    tick = ticks[tick];\n                    if (tick && tick.labelLength > maxLabelLength) {\n                        maxLabelLength = tick.labelLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n            }\n            return this.maxLabelLength;\n        };\n\n        /**\n         * Adds the axis defined in axis.options.title\n         */\n        Axis.prototype.addTitle = function() {\n            var axis = this,\n                renderer = axis.chart.renderer,\n                axisParent = axis.axisParent,\n                horiz = axis.horiz,\n                opposite = axis.opposite,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                hasData,\n                showAxis,\n                textAlign;\n\n            // For reuse in Axis.render\n            hasData = axis.hasData();\n            axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n            // Disregard title generation in original Axis.getOffset()\n            options.title = '';\n\n            if (!axis.axisTitle) {\n                textAlign = axisTitleOptions.textAlign;\n                if (!textAlign) {\n                    textAlign = (horiz ? {\n                        low: 'left',\n                        middle: 'center',\n                        high: 'right'\n                    } : {\n                        low: opposite ? 'right' : 'left',\n                        middle: 'center',\n                        high: opposite ? 'left' : 'right'\n                    })[axisTitleOptions.align];\n                }\n                axis.axisTitle = renderer.text(\n                        axisTitleOptions.text,\n                        0,\n                        0,\n                        axisTitleOptions.useHTML\n                    )\n                    .attr({\n                        zIndex: 7,\n                        rotation: axisTitleOptions.rotation || 0,\n                        align: textAlign\n                    })\n                    .addClass('highcharts-axis-title')\n\n                    .css(axisTitleOptions.style)\n\n                    // Add to axisParent instead of axisGroup, to ignore the space\n                    // it takes\n                    .add(axisParent);\n                axis.axisTitle.isNew = true;\n            }\n\n\n            // hide or show the title depending on whether showEmpty is set\n            axis.axisTitle[showAxis ? 'show' : 'hide'](true);\n        };\n\n        /**\n         * Add custom date formats\n         */\n        H.dateFormats = {\n            // Week number\n            W: function(timestamp) {\n                var date = new Date(timestamp),\n                    day = date.getUTCDay() === 0 ? 7 : date.getUTCDay(),\n                    time = date.getTime(),\n                    startOfYear = new Date(date.getUTCFullYear(), 0, 1, -6),\n                    dayNumber;\n                date.setDate(date.getUTCDate() + 4 - day);\n                dayNumber = Math.floor((time - startOfYear) / 86400000);\n                return 1 + Math.floor(dayNumber / 7);\n            },\n            // First letter of the day of the week, e.g. 'M' for 'Monday'.\n            E: function(timestamp) {\n                return dateFormat('%a', timestamp, true).charAt(0);\n            }\n        };\n\n        /**\n         * Prevents adding the last tick label if the axis is not a category axis.\n         *\n         * Since numeric labels are normally placed at starts and ends of a range of\n         * value, and this module makes the label point at the value, an \"extra\" label\n         * would appear.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Tick.prototype, 'addLabel', function(proceed) {\n            var axis = this.axis,\n                isCategoryAxis = axis.options.categories !== undefined,\n                tickPositions = axis.tickPositions,\n                lastTick = tickPositions[tickPositions.length - 1],\n                isLastTick = this.pos !== lastTick;\n\n            if (!axis.options.grid || isCategoryAxis || isLastTick) {\n                proceed.apply(this);\n            }\n        });\n\n        /**\n         * Center tick labels vertically and horizontally between ticks\n         *\n         * @param {function} proceed - the original function\n         *\n         * @return {object} object - an object containing x and y positions\n         *\t\t\t\t\t\t for the tick\n         */\n        wrap(Tick.prototype, 'getLabelPosition', function(proceed, x, y, label) {\n            var retVal = proceed.apply(this, Array.prototype.slice.call(arguments, 1)),\n                axis = this.axis,\n                options = axis.options,\n                tickInterval = options.tickInterval || 1,\n                newX,\n                newPos,\n                axisHeight,\n                fontSize,\n                labelMetrics,\n                lblB,\n                lblH,\n                labelCenter;\n\n            // Only center tick labels if axis has option grid: true\n            if (options.grid) {\n                fontSize = options.labels.style.fontSize;\n                labelMetrics = axis.chart.renderer.fontMetrics(fontSize, label);\n                lblB = labelMetrics.b;\n                lblH = labelMetrics.h;\n\n                if (axis.horiz && options.categories === undefined) {\n                    // Center x position\n                    axisHeight = axis.axisGroup.getBBox().height;\n                    newPos = this.pos + tickInterval / 2;\n                    retVal.x = axis.translate(newPos) + axis.left;\n                    labelCenter = (axisHeight / 2) + (lblH / 2) - Math.abs(lblH - lblB);\n\n                    // Center y position\n                    if (axis.side === axisSide.top) {\n                        retVal.y = y - labelCenter;\n                    } else {\n                        retVal.y = y + labelCenter;\n                    }\n                } else {\n                    // Center y position\n                    if (options.categories === undefined) {\n                        newPos = this.pos + (tickInterval / 2);\n                        retVal.y = axis.translate(newPos) + axis.top + (lblB / 2);\n                    }\n\n                    // Center x position\n                    newX = (this.getLabelWidth() / 2) - (axis.maxLabelLength / 2);\n                    if (axis.side === axisSide.left) {\n                        retVal.x += newX;\n                    } else {\n                        retVal.x -= newX;\n                    }\n                }\n            }\n            return retVal;\n        });\n\n\n        /**\n         * Draw vertical ticks extra long to create cell floors and roofs.\n         * Overrides the tickLength for vertical axes.\n         *\n         * @param {function} proceed - the original function\n         * @returns {array} retVal -\n         */\n        wrap(Axis.prototype, 'tickSize', function(proceed) {\n            var axis = this,\n                retVal = proceed.apply(axis, Array.prototype.slice.call(arguments, 1)),\n                labelPadding,\n                distance;\n\n            if (axis.options.grid && !axis.horiz) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                if (!axis.maxLabelLength) {\n                    axis.maxLabelLength = axis.getMaxLabelLength();\n                }\n                distance = axis.maxLabelLength + labelPadding;\n\n                retVal[0] = distance;\n            }\n            return retVal;\n        });\n\n        /**\n         * Disregards space required by axisTitle, by adding axisTitle to axisParent\n         * instead of axisGroup, and disregarding margins and offsets related to\n         * axisTitle.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'getOffset', function(proceed) {\n            var axis = this,\n                axisOffset = axis.chart.axisOffset,\n                side = axis.side,\n                axisHeight,\n                tickSize,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                addTitle = axisTitleOptions &&\n                axisTitleOptions.text &&\n                axisTitleOptions.enabled !== false;\n\n            if (axis.options.grid && isObject(axis.options.title)) {\n\n                tickSize = axis.tickSize('tick')[0];\n                if (axisOffset[side] && tickSize) {\n                    axisHeight = axisOffset[side] + tickSize;\n                }\n\n                if (addTitle) {\n                    // Use the custom addTitle() to add it, while preventing making room\n                    // for it\n                    axis.addTitle();\n                }\n\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n                axisOffset[side] = pick(axisHeight, axisOffset[side]);\n\n\n                // Put axis options back after original Axis.getOffset() has been called\n                options.title = axisTitleOptions;\n\n            } else {\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        /**\n         * Prevents rotation of labels when squished, as rotating them would not\n         * help.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'renderUnsquish', function(proceed) {\n            if (this.options.grid) {\n                this.labelRotation = 0;\n                this.options.labels.rotation = 0;\n            }\n            proceed.apply(this);\n        });\n\n        /**\n         * Places leftmost tick at the start of the axis, to create a left wall.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {\n            var axis = this;\n            if (userOptions.grid && axis.horiz) {\n                userOptions.startOnTick = true;\n                userOptions.minPadding = 0;\n                userOptions.endOnTick = true;\n            }\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        /**\n         * Draw an extra line on the far side of the the axisLine,\n         * creating cell roofs of a grid.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'render', function(proceed) {\n            var axis = this,\n                options = axis.options,\n                labelPadding,\n                distance,\n                lineWidth,\n                linePath,\n                yStartIndex,\n                yEndIndex,\n                xStartIndex,\n                xEndIndex,\n                renderer = axis.chart.renderer,\n                axisGroupBox;\n\n            if (options.grid) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                distance = axis.maxLabelLength + labelPadding;\n                lineWidth = options.lineWidth;\n\n                // Remove right wall before rendering\n                if (axis.rightWall) {\n                    axis.rightWall.destroy();\n                }\n\n                // Call original Axis.render() to obtain axis.axisLine and\n                // axis.axisGroup\n                proceed.apply(axis);\n\n                axisGroupBox = axis.axisGroup.getBBox();\n\n                // Add right wall on horizontal axes\n                if (axis.horiz) {\n                    axis.rightWall = renderer.path([\n                            'M',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y,\n                            'L',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y + axisGroupBox.height\n                        ])\n                        .attr({\n                            stroke: options.tickColor || '#ccd6eb',\n                            'stroke-width': options.tickWidth || 1,\n                            zIndex: 7,\n                            class: 'grid-wall'\n                        })\n                        .add(axis.axisGroup);\n                }\n\n                if (axis.isOuterAxis() && axis.axisLine) {\n                    if (axis.horiz) {\n                        // -1 to avoid adding distance each time the chart updates\n                        distance = axisGroupBox.height - 1;\n                    }\n\n                    if (lineWidth) {\n                        linePath = axis.getLinePath(lineWidth);\n                        xStartIndex = linePath.indexOf('M') + 1;\n                        xEndIndex = linePath.indexOf('L') + 1;\n                        yStartIndex = linePath.indexOf('M') + 2;\n                        yEndIndex = linePath.indexOf('L') + 2;\n\n                        // Negate distance if top or left axis\n                        if (axis.side === axisSide.top || axis.side === axisSide.left) {\n                            distance = -distance;\n                        }\n\n                        // If axis is horizontal, reposition line path vertically\n                        if (axis.horiz) {\n                            linePath[yStartIndex] = linePath[yStartIndex] + distance;\n                            linePath[yEndIndex] = linePath[yEndIndex] + distance;\n                        } else {\n                            // If axis is vertical, reposition line path horizontally\n                            linePath[xStartIndex] = linePath[xStartIndex] + distance;\n                            linePath[xEndIndex] = linePath[xEndIndex] + distance;\n                        }\n\n                        if (!axis.axisLineExtra) {\n                            axis.axisLineExtra = renderer.path(linePath)\n                                .attr({\n                                    stroke: options.lineColor,\n                                    'stroke-width': lineWidth,\n                                    zIndex: 7\n                                })\n                                .add(axis.axisGroup);\n                        } else {\n                            axis.axisLineExtra.animate({\n                                d: linePath\n                            });\n                        }\n\n                        // show or hide the line depending on options.showEmpty\n                        axis.axisLine[axis.showAxis ? 'show' : 'hide'](true);\n                    }\n                }\n            } else {\n                proceed.apply(axis);\n            }\n        });\n\n        /**\n         * Wraps chart rendering with the following customizations:\n         * 1. Prohibit timespans of multitudes of a time unit\n         * 2. Draw cell walls on vertical axes\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Chart.prototype, 'render', function(proceed) {\n            // 25 is optimal height for default fontSize (11px)\n            // 25 / 11 ≈ 2.28\n            var fontSizeToCellHeightRatio = 25 / 11,\n                fontMetrics,\n                fontSize;\n\n            each(this.axes, function(axis) {\n                var options = axis.options;\n                if (options.grid) {\n                    fontSize = options.labels.style.fontSize;\n                    fontMetrics = axis.chart.renderer.fontMetrics(fontSize);\n\n                    // Prohibit timespans of multitudes of a time unit,\n                    // e.g. two days, three weeks, etc.\n                    if (options.type === 'datetime') {\n                        options.units = [\n                            ['millisecond', [1]],\n                            ['second', [1]],\n                            ['minute', [1]],\n                            ['hour', [1]],\n                            ['day', [1]],\n                            ['week', [1]],\n                            ['month', [1]],\n                            ['year', null]\n                        ];\n                    }\n\n                    // Make tick marks taller, creating cell walls of a grid.\n                    // Use cellHeight axis option if set\n                    if (axis.horiz) {\n                        options.tickLength = options.cellHeight ||\n                            fontMetrics.h * fontSizeToCellHeightRatio;\n                    } else {\n                        options.tickWidth = 1;\n                        if (!options.lineWidth) {\n                            options.lineWidth = 1;\n                        }\n                    }\n                }\n            });\n\n            // Call original Chart.render()\n            proceed.apply(this);\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2014-2017 Highsoft AS\n         * Authors: Torstein Honsi, Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var defaultPlotOptions = H.getOptions().plotOptions,\n            color = H.Color,\n            columnType = H.seriesTypes.column,\n            each = H.each,\n            extendClass = H.extendClass,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            pick = H.pick,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Point = H.Point,\n            Series = H.Series,\n            pointFormat = '<span style=\"color:{point.color}\">' +\n            '\\u25CF' +\n            '</span> {series.name}: <b>{point.yCategory}</b><br/>',\n            xrange = 'xrange';\n\n        defaultPlotOptions.xrange = merge(defaultPlotOptions.column, {\n            tooltip: {\n                pointFormat: pointFormat\n            }\n        });\n        seriesTypes.xrange = extendClass(columnType, {\n            pointClass: extendClass(Point, {\n                // Add x2 and yCategory to the available properties for tooltip formats\n                getLabelConfig: function() {\n                    var cfg = Point.prototype.getLabelConfig.call(this);\n\n                    cfg.x2 = this.x2;\n                    cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y];\n                    return cfg;\n                }\n            }),\n            type: xrange,\n            forceDL: true,\n            parallelArrays: ['x', 'x2', 'y'],\n            requireSorting: false,\n            animate: seriesTypes.line.prototype.animate,\n\n            /**\n             * Borrow the column series metrics, but with swapped axes. This gives free access\n             * to features like groupPadding, grouping, pointWidth etc.\n             */\n            getColumnMetrics: function() {\n                var metrics,\n                    chart = this.chart;\n\n                function swapAxes() {\n                    each(chart.series, function(s) {\n                        var xAxis = s.xAxis;\n                        s.xAxis = s.yAxis;\n                        s.yAxis = xAxis;\n                    });\n                }\n\n                swapAxes();\n\n                this.yAxis.closestPointRange = 1;\n                metrics = columnType.prototype.getColumnMetrics.call(this);\n\n                swapAxes();\n\n                return metrics;\n            },\n\n            /**\n             * Override cropData to show a point where x is outside visible range\n             * but x2 is outside.\n             */\n            cropData: function(xData, yData, min, max) {\n\n                // Replace xData with x2Data to find the appropriate cropStart\n                var cropData = Series.prototype.cropData,\n                    crop = cropData.call(this, this.x2Data, yData, min, max);\n\n                // Re-insert the cropped xData\n                crop.xData = xData.slice(crop.start, crop.end);\n\n                return crop;\n            },\n\n            translate: function() {\n                columnType.prototype.translate.apply(this, arguments);\n                var series = this,\n                    xAxis = series.xAxis,\n                    metrics = series.columnMetrics,\n                    minPointLength = series.options.minPointLength || 0;\n\n                each(series.points, function(point) {\n                    var plotX = point.plotX,\n                        posX = pick(point.x2, point.x + (point.len || 0)),\n                        plotX2 = xAxis.toPixels(posX, true),\n                        width = plotX2 - plotX,\n                        widthDifference,\n                        shapeArgs,\n                        partialFill;\n\n                    if (minPointLength) {\n                        widthDifference = minPointLength - width;\n                        if (widthDifference < 0) {\n                            widthDifference = 0;\n                        }\n                        plotX -= widthDifference / 2;\n                        plotX2 += widthDifference / 2;\n                    }\n\n                    plotX = Math.max(plotX, -10);\n                    plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10);\n\n                    if (plotX2 < plotX) { // #6107\n                        plotX2 = plotX;\n                    }\n\n                    point.shapeArgs = {\n                        x: plotX,\n                        y: point.plotY + metrics.offset,\n                        width: plotX2 - plotX,\n                        height: metrics.width\n                    };\n                    point.tooltipPos[0] += width / 2;\n                    point.tooltipPos[1] -= metrics.width / 2;\n\n                    // Add a partShapeArgs to the point, based on the shapeArgs property\n                    partialFill = point.partialFill;\n                    if (partialFill) {\n                        // Get the partial fill amount\n                        if (isObject(partialFill)) {\n                            partialFill = partialFill.amount;\n                        }\n                        // If it was not a number, assume 0\n                        if (!isNumber(partialFill)) {\n                            partialFill = 0;\n                        }\n                        shapeArgs = point.shapeArgs;\n                        point.partShapeArgs = {\n                            x: shapeArgs.x,\n                            y: shapeArgs.y + 1,\n                            width: shapeArgs.width * partialFill,\n                            height: shapeArgs.height - 2\n                        };\n                    }\n                });\n            },\n\n            drawPoints: function() {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    verb = chart.pointCount < animationLimit ? 'animate' : 'attr';\n\n                // draw the columns\n                each(series.points, function(point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic,\n                        type = point.shapeType,\n                        shapeArgs = point.shapeArgs,\n                        partShapeArgs = point.partShapeArgs,\n                        seriesOpts = series.options,\n                        pfOptions = point.partialFill,\n                        fill,\n                        state = point.selected && 'select',\n                        cutOff = options.stacking && !options.borderRadius;\n\n                    if (isNumber(plotY) && point.y !== null) {\n                        if (graphic) { // update\n                            point.graphicOriginal[verb](\n                                merge(shapeArgs)\n                            );\n                            if (partShapeArgs) {\n                                point.graphicOverlay[verb](\n                                    merge(partShapeArgs)\n                                );\n                            }\n\n                        } else {\n                            point.graphic = graphic = renderer.g('point')\n                                .attr({\n                                    'class': point.getClassName()\n                                })\n                                .add(point.group || series.group);\n\n                            point.graphicOriginal = renderer[type](shapeArgs)\n                                .addClass('highcharts-partfill-original')\n                                .add(graphic);\n                            if (partShapeArgs) {\n                                point.graphicOverlay = renderer[type](partShapeArgs)\n                                    .addClass('highcharts-partfill-overlay')\n                                    .add(graphic);\n                            }\n                        }\n\n\n                        // Presentational\n                        point.graphicOriginal\n                            .attr(series.pointAttribs(point, state))\n                            .shadow(options.shadow, null, cutOff);\n                        if (partShapeArgs) {\n                            // Ensure pfOptions is an object\n                            if (!isObject(pfOptions)) {\n                                pfOptions = {};\n                            }\n                            if (isObject(seriesOpts.partialFill)) {\n                                pfOptions = merge(pfOptions, seriesOpts.partialFill);\n                            }\n\n                            fill = pfOptions.fill ||\n                                color(series.color).brighten(-0.3).get('rgb');\n                            point.graphicOverlay\n                                .attr(series.pointAttribs(point, state))\n                                .attr('fill', fill)\n                                .attr('stroke-width', 0)\n                                .shadow(options.shadow, null, cutOff);\n                        }\n\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            }\n        });\n\n        /**\n         * Max x2 should be considered in xAxis extremes\n         */\n        wrap(Axis.prototype, 'getSeriesExtremes', function(proceed) {\n            var axis = this,\n                series = axis.series,\n                dataMax,\n                modMax;\n\n            proceed.call(this);\n            if (axis.isXAxis && series.type === xrange) {\n                dataMax = pick(axis.dataMax, Number.MIN_VALUE);\n                each(this.series, function(series) {\n                    each(series.x2Data || [], function(val) {\n                        if (val > dataMax) {\n                            dataMax = val;\n                            modMax = true;\n                        }\n                    });\n                });\n                if (modMax) {\n                    axis.dataMax = dataMax;\n                }\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2016 Highsoft AS\n         * Authors: Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n        // \n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/grid-axis.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n GridAxis\n\n (c) 2016 Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(h){var n=h.dateFormat,p=h.each,t=h.isObject,r=h.pick,l=h.wrap,m=h.Axis,u=h.Chart,q=h.Tick;m.prototype.isOuterAxis=function(){var a=this,c=-1,b=!0;p(this.chart.axes,function(e,f){e.side===a.side&&(e===a?c=f:0<=c&&f>c&&(b=!1))});return b};q.prototype.getLabelWidth=function(){return this.label.getBBox().width};m.prototype.getMaxLabelLength=function(a){var c=this.tickPositions,b=this.ticks,e=0;\nif(!this.maxLabelLength||a)p(c,function(a){(a=b[a])&&a.labelLength>e&&(e=a.labelLength)}),this.maxLabelLength=e;return this.maxLabelLength};m.prototype.addTitle=function(){var a=this.chart.renderer,c=this.axisParent,b=this.horiz,e=this.opposite,f=this.options,d=f.title,g;this.showAxis=g=this.hasData()||r(f.showEmpty,!0);f.title=\"\";this.axisTitle||((f=d.textAlign)||(f=(b?{low:\"left\",middle:\"center\",high:\"right\"}:{low:e?\"right\":\"left\",middle:\"center\",high:e?\"left\":\"right\"})[d.align]),this.axisTitle=\na.text(d.text,0,0,d.useHTML).attr({zIndex:7,rotation:d.rotation||0,align:f}).addClass(\"highcharts-axis-title\").css(d.style).add(c),this.axisTitle.isNew=!0);this.axisTitle[g?\"show\":\"hide\"](!0)};h.dateFormats={W:function(a){a=new Date(a);var c=0===a.getUTCDay()?7:a.getUTCDay(),b=a.getTime(),e=new Date(a.getUTCFullYear(),0,1,-6);a.setDate(a.getUTCDate()+4-c);return 1+Math.floor(Math.floor((b-e)/864E5)/7)},E:function(a){return n(\"%a\",a,!0).charAt(0)}};l(q.prototype,\"addLabel\",function(a){var c=this.axis,\nb=void 0!==c.options.categories,e=c.tickPositions,e=this.pos!==e[e.length-1];(!c.options.grid||b||e)&&a.apply(this)});l(q.prototype,\"getLabelPosition\",function(a,c,b,e){var f=a.apply(this,Array.prototype.slice.call(arguments,1)),d=this.axis,g=d.options,k=g.tickInterval||1,h,l;g.grid&&(h=g.labels.style.fontSize,l=d.chart.renderer.fontMetrics(h,e),h=l.b,l=l.h,d.horiz&&void 0===g.categories?(g=d.axisGroup.getBBox().height,k=this.pos+k/2,f.x=d.translate(k)+d.left,k=g/2+l/2-Math.abs(l-h),f.y=0===d.side?\nb-k:b+k):(void 0===g.categories&&(k=this.pos+k/2,f.y=d.translate(k)+d.top+h/2),k=this.getLabelWidth()/2-d.maxLabelLength/2,f.x=3===d.side?f.x+k:f.x-k));return f});l(m.prototype,\"tickSize\",function(a){var c=a.apply(this,Array.prototype.slice.call(arguments,1)),b;this.options.grid&&!this.horiz&&(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),this.maxLabelLength||(this.maxLabelLength=this.getMaxLabelLength()),b=this.maxLabelLength+b,c[0]=b);return c});l(m.prototype,\"getOffset\",function(a){var c=\nthis.chart.axisOffset,b=this.side,e,f,d=this.options,g=d.title,k=g&&g.text&&!1!==g.enabled;this.options.grid&&t(this.options.title)?(f=this.tickSize(\"tick\")[0],c[b]&&f&&(e=c[b]+f),k&&this.addTitle(),a.apply(this,Array.prototype.slice.call(arguments,1)),c[b]=r(e,c[b]),d.title=g):a.apply(this,Array.prototype.slice.call(arguments,1))});l(m.prototype,\"renderUnsquish\",function(a){this.options.grid&&(this.labelRotation=0,this.options.labels.rotation=0);a.apply(this)});l(m.prototype,\"setOptions\",function(a,\nc){c.grid&&this.horiz&&(c.startOnTick=!0,c.minPadding=0,c.endOnTick=!0);a.apply(this,Array.prototype.slice.call(arguments,1))});l(m.prototype,\"render\",function(a){var c=this.options,b,e,f,d,g,k,h=this.chart.renderer;if(c.grid){if(b=2*Math.abs(this.defaultLeftAxisOptions.labels.x),b=this.maxLabelLength+b,e=c.lineWidth,this.rightWall&&this.rightWall.destroy(),a.apply(this),a=this.axisGroup.getBBox(),this.horiz&&(this.rightWall=h.path([\"M\",a.x+this.width+1,a.y,\"L\",a.x+this.width+1,a.y+a.height]).attr({stroke:c.tickColor||\n\"#ccd6eb\",\"stroke-width\":c.tickWidth||1,zIndex:7,class:\"grid-wall\"}).add(this.axisGroup)),this.isOuterAxis()&&this.axisLine&&(this.horiz&&(b=a.height-1),e)){a=this.getLinePath(e);g=a.indexOf(\"M\")+1;k=a.indexOf(\"L\")+1;f=a.indexOf(\"M\")+2;d=a.indexOf(\"L\")+2;if(0===this.side||3===this.side)b=-b;this.horiz?(a[f]+=b,a[d]+=b):(a[g]+=b,a[k]+=b);this.axisLineExtra?this.axisLineExtra.animate({d:a}):this.axisLineExtra=h.path(a).attr({stroke:c.lineColor,\"stroke-width\":e,zIndex:7}).add(this.axisGroup);this.axisLine[this.showAxis?\n\"show\":\"hide\"](!0)}}else a.apply(this)});l(u.prototype,\"render\",function(a){var c=25/11,b,e;p(this.axes,function(a){var d=a.options;d.grid&&(e=d.labels.style.fontSize,b=a.chart.renderer.fontMetrics(e),\"datetime\"===d.type&&(d.units=[[\"millisecond\",[1]],[\"second\",[1]],[\"minute\",[1]],[\"hour\",[1]],[\"day\",[1]],[\"week\",[1]],[\"month\",[1]],[\"year\",null]]),a.horiz?d.tickLength=d.cellHeight||b.h*c:(d.tickWidth=1,d.lineWidth||(d.lineWidth=1)))});a.apply(this)})})(n)});\n"
  },
  {
    "path": "assets/highcharts/modules/grid-axis.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * GridAxis\n *\n * (c) 2016 Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2016 Highsoft AS\n         * Authors: Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var dateFormat = H.dateFormat,\n            each = H.each,\n            isObject = H.isObject,\n            pick = H.pick,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            Tick = H.Tick;\n\n\n        // Enum for which side the axis is on.\n        // Maps to axis.side\n        var axisSide = {\n            top: 0,\n            right: 1,\n            bottom: 2,\n            left: 3,\n            0: 'top',\n            1: 'right',\n            2: 'bottom',\n            3: 'left'\n        };\n\n        /**\n         * Checks if an axis is the outer axis in its dimension. Since\n         * axes are placed outwards in order, the axis with the highest\n         * index is the outermost axis.\n         *\n         * Example: If there are multiple x-axes at the top of the chart,\n         * this function returns true if the axis supplied is the last\n         * of the x-axes.\n         *\n         * @return true if the axis is the outermost axis in its dimension;\n         *\t\t false if not\n         */\n        Axis.prototype.isOuterAxis = function() {\n            var axis = this,\n                thisIndex = -1,\n                isOuter = true;\n\n            each(this.chart.axes, function(otherAxis, index) {\n                if (otherAxis.side === axis.side) {\n                    if (otherAxis === axis) {\n                        // Get the index of the axis in question\n                        thisIndex = index;\n\n                        // Check thisIndex >= 0 in case thisIndex has\n                        // not been found yet\n                    } else if (thisIndex >= 0 && index > thisIndex) {\n                        // There was an axis on the same side with a\n                        // higher index. Exit the loop.\n                        isOuter = false;\n                        return;\n                    }\n                }\n            });\n            // There were either no other axes on the same side,\n            // or the other axes were not farther from the chart\n            return isOuter;\n        };\n\n        /**\n         * Shortcut function to Tick.label.getBBox().width.\n         *\n         * @return {number} width - the width of the tick label\n         */\n        Tick.prototype.getLabelWidth = function() {\n            return this.label.getBBox().width;\n        };\n\n        /**\n         * Get the maximum label length.\n         * This function can be used in states where the axis.maxLabelLength has not\n         * been set.\n         *\n         * @param  {boolean} force - Optional parameter to force a new calculation, even\n         *                           if a value has already been set\n         * @return {number} maxLabelLength - the maximum label length of the axis\n         */\n        Axis.prototype.getMaxLabelLength = function(force) {\n            var tickPositions = this.tickPositions,\n                ticks = this.ticks,\n                maxLabelLength = 0;\n\n            if (!this.maxLabelLength || force) {\n                each(tickPositions, function(tick) {\n                    tick = ticks[tick];\n                    if (tick && tick.labelLength > maxLabelLength) {\n                        maxLabelLength = tick.labelLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n            }\n            return this.maxLabelLength;\n        };\n\n        /**\n         * Adds the axis defined in axis.options.title\n         */\n        Axis.prototype.addTitle = function() {\n            var axis = this,\n                renderer = axis.chart.renderer,\n                axisParent = axis.axisParent,\n                horiz = axis.horiz,\n                opposite = axis.opposite,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                hasData,\n                showAxis,\n                textAlign;\n\n            // For reuse in Axis.render\n            hasData = axis.hasData();\n            axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n            // Disregard title generation in original Axis.getOffset()\n            options.title = '';\n\n            if (!axis.axisTitle) {\n                textAlign = axisTitleOptions.textAlign;\n                if (!textAlign) {\n                    textAlign = (horiz ? {\n                        low: 'left',\n                        middle: 'center',\n                        high: 'right'\n                    } : {\n                        low: opposite ? 'right' : 'left',\n                        middle: 'center',\n                        high: opposite ? 'left' : 'right'\n                    })[axisTitleOptions.align];\n                }\n                axis.axisTitle = renderer.text(\n                        axisTitleOptions.text,\n                        0,\n                        0,\n                        axisTitleOptions.useHTML\n                    )\n                    .attr({\n                        zIndex: 7,\n                        rotation: axisTitleOptions.rotation || 0,\n                        align: textAlign\n                    })\n                    .addClass('highcharts-axis-title')\n\n                    .css(axisTitleOptions.style)\n\n                    // Add to axisParent instead of axisGroup, to ignore the space\n                    // it takes\n                    .add(axisParent);\n                axis.axisTitle.isNew = true;\n            }\n\n\n            // hide or show the title depending on whether showEmpty is set\n            axis.axisTitle[showAxis ? 'show' : 'hide'](true);\n        };\n\n        /**\n         * Add custom date formats\n         */\n        H.dateFormats = {\n            // Week number\n            W: function(timestamp) {\n                var date = new Date(timestamp),\n                    day = date.getUTCDay() === 0 ? 7 : date.getUTCDay(),\n                    time = date.getTime(),\n                    startOfYear = new Date(date.getUTCFullYear(), 0, 1, -6),\n                    dayNumber;\n                date.setDate(date.getUTCDate() + 4 - day);\n                dayNumber = Math.floor((time - startOfYear) / 86400000);\n                return 1 + Math.floor(dayNumber / 7);\n            },\n            // First letter of the day of the week, e.g. 'M' for 'Monday'.\n            E: function(timestamp) {\n                return dateFormat('%a', timestamp, true).charAt(0);\n            }\n        };\n\n        /**\n         * Prevents adding the last tick label if the axis is not a category axis.\n         *\n         * Since numeric labels are normally placed at starts and ends of a range of\n         * value, and this module makes the label point at the value, an \"extra\" label\n         * would appear.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Tick.prototype, 'addLabel', function(proceed) {\n            var axis = this.axis,\n                isCategoryAxis = axis.options.categories !== undefined,\n                tickPositions = axis.tickPositions,\n                lastTick = tickPositions[tickPositions.length - 1],\n                isLastTick = this.pos !== lastTick;\n\n            if (!axis.options.grid || isCategoryAxis || isLastTick) {\n                proceed.apply(this);\n            }\n        });\n\n        /**\n         * Center tick labels vertically and horizontally between ticks\n         *\n         * @param {function} proceed - the original function\n         *\n         * @return {object} object - an object containing x and y positions\n         *\t\t\t\t\t\t for the tick\n         */\n        wrap(Tick.prototype, 'getLabelPosition', function(proceed, x, y, label) {\n            var retVal = proceed.apply(this, Array.prototype.slice.call(arguments, 1)),\n                axis = this.axis,\n                options = axis.options,\n                tickInterval = options.tickInterval || 1,\n                newX,\n                newPos,\n                axisHeight,\n                fontSize,\n                labelMetrics,\n                lblB,\n                lblH,\n                labelCenter;\n\n            // Only center tick labels if axis has option grid: true\n            if (options.grid) {\n                fontSize = options.labels.style.fontSize;\n                labelMetrics = axis.chart.renderer.fontMetrics(fontSize, label);\n                lblB = labelMetrics.b;\n                lblH = labelMetrics.h;\n\n                if (axis.horiz && options.categories === undefined) {\n                    // Center x position\n                    axisHeight = axis.axisGroup.getBBox().height;\n                    newPos = this.pos + tickInterval / 2;\n                    retVal.x = axis.translate(newPos) + axis.left;\n                    labelCenter = (axisHeight / 2) + (lblH / 2) - Math.abs(lblH - lblB);\n\n                    // Center y position\n                    if (axis.side === axisSide.top) {\n                        retVal.y = y - labelCenter;\n                    } else {\n                        retVal.y = y + labelCenter;\n                    }\n                } else {\n                    // Center y position\n                    if (options.categories === undefined) {\n                        newPos = this.pos + (tickInterval / 2);\n                        retVal.y = axis.translate(newPos) + axis.top + (lblB / 2);\n                    }\n\n                    // Center x position\n                    newX = (this.getLabelWidth() / 2) - (axis.maxLabelLength / 2);\n                    if (axis.side === axisSide.left) {\n                        retVal.x += newX;\n                    } else {\n                        retVal.x -= newX;\n                    }\n                }\n            }\n            return retVal;\n        });\n\n\n        /**\n         * Draw vertical ticks extra long to create cell floors and roofs.\n         * Overrides the tickLength for vertical axes.\n         *\n         * @param {function} proceed - the original function\n         * @returns {array} retVal -\n         */\n        wrap(Axis.prototype, 'tickSize', function(proceed) {\n            var axis = this,\n                retVal = proceed.apply(axis, Array.prototype.slice.call(arguments, 1)),\n                labelPadding,\n                distance;\n\n            if (axis.options.grid && !axis.horiz) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                if (!axis.maxLabelLength) {\n                    axis.maxLabelLength = axis.getMaxLabelLength();\n                }\n                distance = axis.maxLabelLength + labelPadding;\n\n                retVal[0] = distance;\n            }\n            return retVal;\n        });\n\n        /**\n         * Disregards space required by axisTitle, by adding axisTitle to axisParent\n         * instead of axisGroup, and disregarding margins and offsets related to\n         * axisTitle.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'getOffset', function(proceed) {\n            var axis = this,\n                axisOffset = axis.chart.axisOffset,\n                side = axis.side,\n                axisHeight,\n                tickSize,\n                options = axis.options,\n                axisTitleOptions = options.title,\n                addTitle = axisTitleOptions &&\n                axisTitleOptions.text &&\n                axisTitleOptions.enabled !== false;\n\n            if (axis.options.grid && isObject(axis.options.title)) {\n\n                tickSize = axis.tickSize('tick')[0];\n                if (axisOffset[side] && tickSize) {\n                    axisHeight = axisOffset[side] + tickSize;\n                }\n\n                if (addTitle) {\n                    // Use the custom addTitle() to add it, while preventing making room\n                    // for it\n                    axis.addTitle();\n                }\n\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n                axisOffset[side] = pick(axisHeight, axisOffset[side]);\n\n\n                // Put axis options back after original Axis.getOffset() has been called\n                options.title = axisTitleOptions;\n\n            } else {\n                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        /**\n         * Prevents rotation of labels when squished, as rotating them would not\n         * help.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'renderUnsquish', function(proceed) {\n            if (this.options.grid) {\n                this.labelRotation = 0;\n                this.options.labels.rotation = 0;\n            }\n            proceed.apply(this);\n        });\n\n        /**\n         * Places leftmost tick at the start of the axis, to create a left wall.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {\n            var axis = this;\n            if (userOptions.grid && axis.horiz) {\n                userOptions.startOnTick = true;\n                userOptions.minPadding = 0;\n                userOptions.endOnTick = true;\n            }\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        /**\n         * Draw an extra line on the far side of the the axisLine,\n         * creating cell roofs of a grid.\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Axis.prototype, 'render', function(proceed) {\n            var axis = this,\n                options = axis.options,\n                labelPadding,\n                distance,\n                lineWidth,\n                linePath,\n                yStartIndex,\n                yEndIndex,\n                xStartIndex,\n                xEndIndex,\n                renderer = axis.chart.renderer,\n                axisGroupBox;\n\n            if (options.grid) {\n                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);\n                distance = axis.maxLabelLength + labelPadding;\n                lineWidth = options.lineWidth;\n\n                // Remove right wall before rendering\n                if (axis.rightWall) {\n                    axis.rightWall.destroy();\n                }\n\n                // Call original Axis.render() to obtain axis.axisLine and\n                // axis.axisGroup\n                proceed.apply(axis);\n\n                axisGroupBox = axis.axisGroup.getBBox();\n\n                // Add right wall on horizontal axes\n                if (axis.horiz) {\n                    axis.rightWall = renderer.path([\n                            'M',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y,\n                            'L',\n                            axisGroupBox.x + axis.width + 1, // account for left wall\n                            axisGroupBox.y + axisGroupBox.height\n                        ])\n                        .attr({\n                            stroke: options.tickColor || '#ccd6eb',\n                            'stroke-width': options.tickWidth || 1,\n                            zIndex: 7,\n                            class: 'grid-wall'\n                        })\n                        .add(axis.axisGroup);\n                }\n\n                if (axis.isOuterAxis() && axis.axisLine) {\n                    if (axis.horiz) {\n                        // -1 to avoid adding distance each time the chart updates\n                        distance = axisGroupBox.height - 1;\n                    }\n\n                    if (lineWidth) {\n                        linePath = axis.getLinePath(lineWidth);\n                        xStartIndex = linePath.indexOf('M') + 1;\n                        xEndIndex = linePath.indexOf('L') + 1;\n                        yStartIndex = linePath.indexOf('M') + 2;\n                        yEndIndex = linePath.indexOf('L') + 2;\n\n                        // Negate distance if top or left axis\n                        if (axis.side === axisSide.top || axis.side === axisSide.left) {\n                            distance = -distance;\n                        }\n\n                        // If axis is horizontal, reposition line path vertically\n                        if (axis.horiz) {\n                            linePath[yStartIndex] = linePath[yStartIndex] + distance;\n                            linePath[yEndIndex] = linePath[yEndIndex] + distance;\n                        } else {\n                            // If axis is vertical, reposition line path horizontally\n                            linePath[xStartIndex] = linePath[xStartIndex] + distance;\n                            linePath[xEndIndex] = linePath[xEndIndex] + distance;\n                        }\n\n                        if (!axis.axisLineExtra) {\n                            axis.axisLineExtra = renderer.path(linePath)\n                                .attr({\n                                    stroke: options.lineColor,\n                                    'stroke-width': lineWidth,\n                                    zIndex: 7\n                                })\n                                .add(axis.axisGroup);\n                        } else {\n                            axis.axisLineExtra.animate({\n                                d: linePath\n                            });\n                        }\n\n                        // show or hide the line depending on options.showEmpty\n                        axis.axisLine[axis.showAxis ? 'show' : 'hide'](true);\n                    }\n                }\n            } else {\n                proceed.apply(axis);\n            }\n        });\n\n        /**\n         * Wraps chart rendering with the following customizations:\n         * 1. Prohibit timespans of multitudes of a time unit\n         * 2. Draw cell walls on vertical axes\n         *\n         * @param {function} proceed - the original function\n         */\n        wrap(Chart.prototype, 'render', function(proceed) {\n            // 25 is optimal height for default fontSize (11px)\n            // 25 / 11 ≈ 2.28\n            var fontSizeToCellHeightRatio = 25 / 11,\n                fontMetrics,\n                fontSize;\n\n            each(this.axes, function(axis) {\n                var options = axis.options;\n                if (options.grid) {\n                    fontSize = options.labels.style.fontSize;\n                    fontMetrics = axis.chart.renderer.fontMetrics(fontSize);\n\n                    // Prohibit timespans of multitudes of a time unit,\n                    // e.g. two days, three weeks, etc.\n                    if (options.type === 'datetime') {\n                        options.units = [\n                            ['millisecond', [1]],\n                            ['second', [1]],\n                            ['minute', [1]],\n                            ['hour', [1]],\n                            ['day', [1]],\n                            ['week', [1]],\n                            ['month', [1]],\n                            ['year', null]\n                        ];\n                    }\n\n                    // Make tick marks taller, creating cell walls of a grid.\n                    // Use cellHeight axis option if set\n                    if (axis.horiz) {\n                        options.tickLength = options.cellHeight ||\n                            fontMetrics.h * fontSizeToCellHeightRatio;\n                    } else {\n                        options.tickWidth = 1;\n                        if (!options.lineWidth) {\n                            options.lineWidth = 1;\n                        }\n                    }\n                }\n            });\n\n            // Call original Chart.render()\n            proceed.apply(this);\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/heatmap.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(p){\"object\"===typeof module&&module.exports?module.exports=p:p(Highcharts)})(function(p){(function(b){var h=b.Axis,r=b.Chart,k=b.color,n,d=b.each,w=b.extend,x=b.isNumber,l=b.Legend,g=b.LegendSymbolMixin,q=b.noop,u=b.merge,v=b.pick,t=b.wrap;n=b.ColorAxis=function(){this.init.apply(this,arguments)};w(n.prototype,h.prototype);w(n.prototype,{defaultColorAxisOptions:{lineWidth:0,minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},\nwidth:.01,color:\"#999999\"},labels:{overflow:\"justify\",rotation:0},minColor:\"#e6ebf5\",maxColor:\"#003399\",tickLength:5,showInLegend:!0},keepProps:[\"legendGroup\",\"legendItemHeight\",\"legendItemWidth\",\"legendItem\",\"legendSymbol\"].concat(h.prototype.keepProps),init:function(a,c){var e=\"vertical\"!==a.options.legend.layout,f;this.coll=\"colorAxis\";f=u(this.defaultColorAxisOptions,{side:e?2:1,reversed:!e},c,{opposite:!e,showEmpty:!1,title:null});h.prototype.init.call(this,a,f);c.dataClasses&&this.initDataClasses(c);\nthis.initStops();this.horiz=e;this.zoomEnabled=!1;this.defaultLegendLength=200},initDataClasses:function(a){var c=this.chart,e,f=0,m=c.options.chart.colorCount,b=this.options,y=a.dataClasses.length;this.dataClasses=e=[];this.legendItems=[];d(a.dataClasses,function(a,d){a=u(a);e.push(a);a.color||(\"category\"===b.dataClassColor?(d=c.options.colors,m=d.length,a.color=d[f],a.colorIndex=f,f++,f===m&&(f=0)):a.color=k(b.minColor).tweenTo(k(b.maxColor),2>y?.5:d/(y-1)))})},initStops:function(){this.stops=this.options.stops||\n[[0,this.options.minColor],[1,this.options.maxColor]];d(this.stops,function(a){a.color=k(a[1])})},setOptions:function(a){h.prototype.setOptions.call(this,a);this.options.crosshair=this.options.marker},setAxisSize:function(){var a=this.legendSymbol,c=this.chart,e=c.options.legend||{},f,m;a?(this.left=e=a.attr(\"x\"),this.top=f=a.attr(\"y\"),this.width=m=a.attr(\"width\"),this.height=a=a.attr(\"height\"),this.right=c.chartWidth-e-m,this.bottom=c.chartHeight-f-a,this.len=this.horiz?m:a,this.pos=this.horiz?e:\nf):this.len=(this.horiz?e.symbolWidth:e.symbolHeight)||this.defaultLegendLength},normalizedValue:function(a){this.isLog&&(a=this.val2lin(a));return 1-(this.max-a)/(this.max-this.min||1)},toColor:function(a,c){var e=this.stops,f,m,b=this.dataClasses,d,g;if(b)for(g=b.length;g--;){if(d=b[g],f=d.from,e=d.to,(void 0===f||a>=f)&&(void 0===e||a<=e)){m=d.color;c&&(c.dataClass=g,c.colorIndex=d.colorIndex);break}}else{a=this.normalizedValue(a);for(g=e.length;g--&&!(a>e[g][0]););f=e[g]||e[g+1];e=e[g+1]||f;a=\n1-(e[0]-a)/(e[0]-f[0]||1);m=f.color.tweenTo(e.color,a)}return m},getOffset:function(){var a=this.legendGroup,c=this.chart.axisOffset[this.side];a&&(this.axisParent=a,h.prototype.getOffset.call(this),this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=c)},setLegendColor:function(){var a,c=this.reversed;a=c?1:0;c=c?0:1;a=this.horiz?[a,0,c,0]:[0,c,0,a];this.legendColor={linearGradient:{x1:a[0],y1:a[1],x2:a[2],y2:a[3]},stops:this.stops}},drawLegendSymbol:function(a,\nc){var e=a.padding,f=a.options,b=this.horiz,d=v(f.symbolWidth,b?this.defaultLegendLength:12),g=v(f.symbolHeight,b?12:this.defaultLegendLength),q=v(f.labelPadding,b?16:30),f=v(f.itemDistance,10);this.setLegendColor();c.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,d,g).attr({zIndex:1}).add(c.legendGroup);this.legendItemWidth=d+e+(b?f:q);this.legendItemHeight=g+e+(b?q:0)},setState:q,visible:!0,setVisible:q,getSeriesExtremes:function(){var a=this.series,c=a.length;this.dataMin=Infinity;for(this.dataMax=\n-Infinity;c--;)void 0!==a[c].valueMin&&(this.dataMin=Math.min(this.dataMin,a[c].valueMin),this.dataMax=Math.max(this.dataMax,a[c].valueMax))},drawCrosshair:function(a,c){var e=c&&c.plotX,b=c&&c.plotY,d,g=this.pos,q=this.len;c&&(d=this.toPixels(c[c.series.colorKey]),d<g?d=g-2:d>g+q&&(d=g+q+2),c.plotX=d,c.plotY=this.len-d,h.prototype.drawCrosshair.call(this,a,c),c.plotX=e,c.plotY=b,this.cross&&(this.cross.addClass(\"highcharts-coloraxis-marker\").add(this.legendGroup),this.cross.attr({fill:this.crosshair.color})))},\ngetPlotLinePath:function(a,c,e,b,d){return x(d)?this.horiz?[\"M\",d-4,this.top-6,\"L\",d+4,this.top-6,d,this.top,\"Z\"]:[\"M\",this.left,d,\"L\",this.left-6,d+6,this.left-6,d-6,\"Z\"]:h.prototype.getPlotLinePath.call(this,a,c,e,b)},update:function(a,c){var e=this.chart,b=e.legend;d(this.series,function(a){a.isDirtyData=!0});a.dataClasses&&b.allItems&&(d(b.allItems,function(a){a.isDataClass&&a.legendGroup&&a.legendGroup.destroy()}),e.isDirtyLegend=!0);e.options[this.coll]=u(this.userOptions,a);h.prototype.update.call(this,\na,c);this.legendItem&&(this.setLegendColor(),b.colorizeItem(this,!0))},remove:function(){this.legendItem&&this.chart.legend.destroyItem(this);h.prototype.remove.call(this)},getDataClassLegendSymbols:function(){var a=this,c=this.chart,e=this.legendItems,f=c.options.legend,t=f.valueDecimals,h=f.valueSuffix||\"\",l;e.length||d(this.dataClasses,function(f,u){var m=!0,k=f.from,n=f.to;l=\"\";void 0===k?l=\"\\x3c \":void 0===n&&(l=\"\\x3e \");void 0!==k&&(l+=b.numberFormat(k,t)+h);void 0!==k&&void 0!==n&&(l+=\" - \");\nvoid 0!==n&&(l+=b.numberFormat(n,t)+h);e.push(w({chart:c,name:l,options:{},drawLegendSymbol:g.drawRectangle,visible:!0,setState:q,isDataClass:!0,setVisible:function(){m=this.visible=!m;d(a.series,function(a){d(a.points,function(a){a.dataClass===u&&a.setVisible(m)})});c.legend.colorizeItem(this,m)}},f))});return e},name:\"\"});d([\"fill\",\"stroke\"],function(a){b.Fx.prototype[a+\"Setter\"]=function(){this.elem.attr(a,k(this.start).tweenTo(k(this.end),this.pos),null,!0)}});t(r.prototype,\"getAxes\",function(a){var c=\nthis.options.colorAxis;a.call(this);this.colorAxis=[];c&&new n(this,c)});t(l.prototype,\"getAllItems\",function(a){var c=[],b=this.chart.colorAxis[0];b&&b.options&&(b.options.showInLegend&&(b.options.dataClasses?c=c.concat(b.getDataClassLegendSymbols()):c.push(b)),d(b.series,function(a){a.options.showInLegend=!1}));return c.concat(a.call(this))});t(l.prototype,\"colorizeItem\",function(a,c,b){a.call(this,c,b);b&&c.legendColor&&c.legendSymbol.attr({fill:c.legendColor})})})(p);(function(b){var h=b.defined,\nr=b.each,k=b.noop,n=b.seriesTypes;b.colorPointMixin={isValid:function(){return null!==this.value},setVisible:function(b){var d=this,h=b?\"show\":\"hide\";r([\"graphic\",\"dataLabel\"],function(b){if(d[b])d[b][h]()})},setState:function(d){b.Point.prototype.setState.call(this,d);this.graphic&&this.graphic.attr({zIndex:\"hover\"===d?1:0})}};b.colorSeriesMixin={pointArrayMap:[\"value\"],axisTypes:[\"xAxis\",\"yAxis\",\"colorAxis\"],optionalAxis:\"colorAxis\",trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],getSymbol:k,\nparallelArrays:[\"x\",\"y\",\"value\"],colorKey:\"value\",pointAttribs:n.column.prototype.pointAttribs,translateColors:function(){var b=this,h=this.options.nullColor,k=this.colorAxis,l=this.colorKey;r(this.data,function(d){var g=d[l];if(g=d.options.color||(d.isNull?h:k&&void 0!==g?k.toColor(g,d):d.color||b.color))d.color=g})},colorAttribs:function(b){var d={};h(b.color)&&(d[this.colorProp||\"fill\"]=b.color);return d}}})(p);(function(b){var h=b.colorPointMixin,r=b.each,k=b.merge,n=b.noop,d=b.pick,p=b.Series,\nx=b.seriesType,l=b.seriesTypes;x(\"heatmap\",\"scatter\",{animation:!1,borderWidth:0,nullColor:\"#f7f7f7\",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:\"middle\",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:\"{point.x}, {point.y}: {point.value}\\x3cbr/\\x3e\"},states:{normal:{animation:!0},hover:{halo:!1,brightness:.2}}},k(b.colorSeriesMixin,{pointArrayMap:[\"y\",\"value\"],hasPointSpecificOptions:!0,supportsDrilldown:!0,getExtremesFromAll:!0,\ndirectTouch:!0,init:function(){var b;l.scatter.prototype.init.apply(this,arguments);b=this.options;b.pointRange=d(b.pointRange,b.colsize||1);this.yAxis.axisPointRange=b.rowsize||1},translate:function(){var b=this.options,d=this.xAxis,h=this.yAxis,k=function(b,a,c){return Math.min(Math.max(a,b),c)};this.generatePoints();r(this.points,function(g){var a=(b.colsize||1)/2,c=(b.rowsize||1)/2,e=k(Math.round(d.len-d.translate(g.x-a,0,1,0,1)),-d.len,2*d.len),a=k(Math.round(d.len-d.translate(g.x+a,0,1,0,1)),\n-d.len,2*d.len),f=k(Math.round(h.translate(g.y-c,0,1,0,1)),-h.len,2*h.len),c=k(Math.round(h.translate(g.y+c,0,1,0,1)),-h.len,2*h.len);g.plotX=g.clientX=(e+a)/2;g.plotY=(f+c)/2;g.shapeType=\"rect\";g.shapeArgs={x:Math.min(e,a),y:Math.min(f,c),width:Math.abs(a-e),height:Math.abs(c-f)}});this.translateColors()},drawPoints:function(){l.column.prototype.drawPoints.call(this);r(this.points,function(b){b.graphic.attr(this.colorAttribs(b))},this)},animate:n,getBox:n,drawLegendSymbol:b.LegendSymbolMixin.drawRectangle,\nalignDataLabel:l.column.prototype.alignDataLabel,getExtremes:function(){p.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;p.prototype.getExtremes.call(this)}}),h)})(p)});\n"
  },
  {
    "path": "assets/highcharts/modules/heatmap.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var Axis = H.Axis,\n            Chart = H.Chart,\n            color = H.color,\n            ColorAxis,\n            each = H.each,\n            extend = H.extend,\n            isNumber = H.isNumber,\n            Legend = H.Legend,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            noop = H.noop,\n            merge = H.merge,\n            pick = H.pick,\n            wrap = H.wrap;\n\n        /**\n         * The ColorAxis object for inclusion in gradient legends\n         */\n        ColorAxis = H.ColorAxis = function() {\n            this.init.apply(this, arguments);\n        };\n        extend(ColorAxis.prototype, Axis.prototype);\n        extend(ColorAxis.prototype, {\n            defaultColorAxisOptions: {\n                lineWidth: 0,\n                minPadding: 0,\n                maxPadding: 0,\n                gridLineWidth: 1,\n                tickPixelInterval: 72,\n                startOnTick: true,\n                endOnTick: true,\n                offset: 0,\n                marker: {\n                    animation: {\n                        duration: 50\n                    },\n                    width: 0.01,\n\n                    color: '#999999'\n\n                },\n                labels: {\n                    overflow: 'justify',\n                    rotation: 0\n                },\n                minColor: '#e6ebf5',\n                maxColor: '#003399',\n                tickLength: 5,\n                showInLegend: true\n            },\n\n            // Properties to preserve after destroy, for Axis.update (#5881, #6025)\n            keepProps: [\n                'legendGroup',\n                'legendItemHeight',\n                'legendItemWidth',\n                'legendItem',\n                'legendSymbol'\n            ].concat(Axis.prototype.keepProps),\n\n            /**\n             * Initialize the color axis\n             */\n            init: function(chart, userOptions) {\n                var horiz = chart.options.legend.layout !== 'vertical',\n                    options;\n\n                this.coll = 'colorAxis';\n\n                // Build the options\n                options = merge(this.defaultColorAxisOptions, {\n                    side: horiz ? 2 : 1,\n                    reversed: !horiz\n                }, userOptions, {\n                    opposite: !horiz,\n                    showEmpty: false,\n                    title: null\n                });\n\n                Axis.prototype.init.call(this, chart, options);\n\n                // Base init() pushes it to the xAxis array, now pop it again\n                //chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop();\n\n                // Prepare data classes\n                if (userOptions.dataClasses) {\n                    this.initDataClasses(userOptions);\n                }\n                this.initStops();\n\n                // Override original axis properties\n                this.horiz = horiz;\n                this.zoomEnabled = false;\n\n                // Add default values\t\t\n                this.defaultLegendLength = 200;\n            },\n\n            initDataClasses: function(userOptions) {\n                var chart = this.chart,\n                    dataClasses,\n                    colorCounter = 0,\n                    colorCount = chart.options.chart.colorCount,\n                    options = this.options,\n                    len = userOptions.dataClasses.length;\n                this.dataClasses = dataClasses = [];\n                this.legendItems = [];\n\n                each(userOptions.dataClasses, function(dataClass, i) {\n                    var colors;\n\n                    dataClass = merge(dataClass);\n                    dataClasses.push(dataClass);\n                    if (!dataClass.color) {\n                        if (options.dataClassColor === 'category') {\n\n                            colors = chart.options.colors;\n                            colorCount = colors.length;\n                            dataClass.color = colors[colorCounter];\n\n                            dataClass.colorIndex = colorCounter;\n\n                            // increase and loop back to zero\n                            colorCounter++;\n                            if (colorCounter === colorCount) {\n                                colorCounter = 0;\n                            }\n                        } else {\n                            dataClass.color = color(options.minColor).tweenTo(\n                                color(options.maxColor),\n                                len < 2 ? 0.5 : i / (len - 1) // #3219\n                            );\n                        }\n                    }\n                });\n            },\n\n            initStops: function() {\n                this.stops = this.options.stops || [\n                    [0, this.options.minColor],\n                    [1, this.options.maxColor]\n                ];\n                each(this.stops, function(stop) {\n                    stop.color = color(stop[1]);\n                });\n            },\n\n            /**\n             * Extend the setOptions method to process extreme colors and color\n             * stops.\n             */\n            setOptions: function(userOptions) {\n                Axis.prototype.setOptions.call(this, userOptions);\n\n                this.options.crosshair = this.options.marker;\n            },\n\n            setAxisSize: function() {\n                var symbol = this.legendSymbol,\n                    chart = this.chart,\n                    legendOptions = chart.options.legend || {},\n                    x,\n                    y,\n                    width,\n                    height;\n\n                if (symbol) {\n                    this.left = x = symbol.attr('x');\n                    this.top = y = symbol.attr('y');\n                    this.width = width = symbol.attr('width');\n                    this.height = height = symbol.attr('height');\n                    this.right = chart.chartWidth - x - width;\n                    this.bottom = chart.chartHeight - y - height;\n\n                    this.len = this.horiz ? width : height;\n                    this.pos = this.horiz ? x : y;\n                } else {\n                    // Fake length for disabled legend to avoid tick issues and such (#5205)\n                    this.len = (this.horiz ? legendOptions.symbolWidth : legendOptions.symbolHeight) || this.defaultLegendLength;\n                }\n            },\n\n            normalizedValue: function(value) {\n                if (this.isLog) {\n                    value = this.val2lin(value);\n                }\n                return 1 - ((this.max - value) / ((this.max - this.min) || 1));\n            },\n\n            /**\n             * Translate from a value to a color\n             */\n            toColor: function(value, point) {\n                var pos,\n                    stops = this.stops,\n                    from,\n                    to,\n                    color,\n                    dataClasses = this.dataClasses,\n                    dataClass,\n                    i;\n\n                if (dataClasses) {\n                    i = dataClasses.length;\n                    while (i--) {\n                        dataClass = dataClasses[i];\n                        from = dataClass.from;\n                        to = dataClass.to;\n                        if ((from === undefined || value >= from) && (to === undefined || value <= to)) {\n                            color = dataClass.color;\n                            if (point) {\n                                point.dataClass = i;\n                                point.colorIndex = dataClass.colorIndex;\n                            }\n                            break;\n                        }\n                    }\n\n                } else {\n\n                    pos = this.normalizedValue(value);\n                    i = stops.length;\n                    while (i--) {\n                        if (pos > stops[i][0]) {\n                            break;\n                        }\n                    }\n                    from = stops[i] || stops[i + 1];\n                    to = stops[i + 1] || from;\n\n                    // The position within the gradient\n                    pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);\n\n                    color = from.color.tweenTo(\n                        to.color,\n                        pos\n                    );\n                }\n                return color;\n            },\n\n            /**\n             * Override the getOffset method to add the whole axis groups inside the legend.\n             */\n            getOffset: function() {\n                var group = this.legendGroup,\n                    sideOffset = this.chart.axisOffset[this.side];\n\n                if (group) {\n\n                    // Hook for the getOffset method to add groups to this parent group\n                    this.axisParent = group;\n\n                    // Call the base\n                    Axis.prototype.getOffset.call(this);\n\n                    // First time only\n                    if (!this.added) {\n\n                        this.added = true;\n\n                        this.labelLeft = 0;\n                        this.labelRight = this.width;\n                    }\n                    // Reset it to avoid color axis reserving space\n                    this.chart.axisOffset[this.side] = sideOffset;\n                }\n            },\n\n            /**\n             * Create the color gradient\n             */\n            setLegendColor: function() {\n                var grad,\n                    horiz = this.horiz,\n                    reversed = this.reversed,\n                    one = reversed ? 1 : 0,\n                    zero = reversed ? 0 : 1;\n\n                grad = horiz ? [one, 0, zero, 0] : [0, zero, 0, one]; // #3190\n                this.legendColor = {\n                    linearGradient: {\n                        x1: grad[0],\n                        y1: grad[1],\n                        x2: grad[2],\n                        y2: grad[3]\n                    },\n                    stops: this.stops\n                };\n            },\n\n            /**\n             * The color axis appears inside the legend and has its own legend symbol\n             */\n            drawLegendSymbol: function(legend, item) {\n                var padding = legend.padding,\n                    legendOptions = legend.options,\n                    horiz = this.horiz,\n                    width = pick(legendOptions.symbolWidth, horiz ? this.defaultLegendLength : 12),\n                    height = pick(legendOptions.symbolHeight, horiz ? 12 : this.defaultLegendLength),\n                    labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30),\n                    itemDistance = pick(legendOptions.itemDistance, 10);\n\n                this.setLegendColor();\n\n                // Create the gradient\n                item.legendSymbol = this.chart.renderer.rect(\n                    0,\n                    legend.baseline - 11,\n                    width,\n                    height\n                ).attr({\n                    zIndex: 1\n                }).add(item.legendGroup);\n\n                // Set how much space this legend item takes up\n                this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding);\n                this.legendItemHeight = height + padding + (horiz ? labelPadding : 0);\n            },\n            /**\n             * Fool the legend\n             */\n            setState: noop,\n            visible: true,\n            setVisible: noop,\n            getSeriesExtremes: function() {\n                var series = this.series,\n                    i = series.length;\n                this.dataMin = Infinity;\n                this.dataMax = -Infinity;\n                while (i--) {\n                    if (series[i].valueMin !== undefined) {\n                        this.dataMin = Math.min(this.dataMin, series[i].valueMin);\n                        this.dataMax = Math.max(this.dataMax, series[i].valueMax);\n                    }\n                }\n            },\n            drawCrosshair: function(e, point) {\n                var plotX = point && point.plotX,\n                    plotY = point && point.plotY,\n                    crossPos,\n                    axisPos = this.pos,\n                    axisLen = this.len;\n\n                if (point) {\n                    crossPos = this.toPixels(point[point.series.colorKey]);\n                    if (crossPos < axisPos) {\n                        crossPos = axisPos - 2;\n                    } else if (crossPos > axisPos + axisLen) {\n                        crossPos = axisPos + axisLen + 2;\n                    }\n\n                    point.plotX = crossPos;\n                    point.plotY = this.len - crossPos;\n                    Axis.prototype.drawCrosshair.call(this, e, point);\n                    point.plotX = plotX;\n                    point.plotY = plotY;\n\n                    if (this.cross) {\n                        this.cross\n                            .addClass('highcharts-coloraxis-marker')\n                            .add(this.legendGroup);\n\n\n                        this.cross.attr({\n                            fill: this.crosshair.color\n                        });\n\n\n                    }\n                }\n            },\n            getPlotLinePath: function(a, b, c, d, pos) {\n                return isNumber(pos) ? // crosshairs only // #3969 pos can be 0 !!\n                    (this.horiz ? ['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : ['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z']) :\n                    Axis.prototype.getPlotLinePath.call(this, a, b, c, d);\n            },\n\n            update: function(newOptions, redraw) {\n                var chart = this.chart,\n                    legend = chart.legend;\n\n                each(this.series, function(series) {\n                    series.isDirtyData = true; // Needed for Axis.update when choropleth colors change\n                });\n\n                // When updating data classes, destroy old items and make sure new ones are created (#3207)\n                if (newOptions.dataClasses && legend.allItems) {\n                    each(legend.allItems, function(item) {\n                        if (item.isDataClass && item.legendGroup) {\n                            item.legendGroup.destroy();\n                        }\n                    });\n                    chart.isDirtyLegend = true;\n                }\n\n                // Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is\n                // not an array. (#3207)\n                chart.options[this.coll] = merge(this.userOptions, newOptions);\n\n                Axis.prototype.update.call(this, newOptions, redraw);\n                if (this.legendItem) {\n                    this.setLegendColor();\n                    legend.colorizeItem(this, true);\n                }\n            },\n\n            /**\n             * Extend basic axis remove by also removing the legend item.\n             */\n            remove: function() {\n                if (this.legendItem) {\n                    this.chart.legend.destroyItem(this);\n                }\n                Axis.prototype.remove.call(this);\n            },\n\n            /**\n             * Get the legend item symbols for data classes\n             */\n            getDataClassLegendSymbols: function() {\n                var axis = this,\n                    chart = this.chart,\n                    legendItems = this.legendItems,\n                    legendOptions = chart.options.legend,\n                    valueDecimals = legendOptions.valueDecimals,\n                    valueSuffix = legendOptions.valueSuffix || '',\n                    name;\n\n                if (!legendItems.length) {\n                    each(this.dataClasses, function(dataClass, i) {\n                        var vis = true,\n                            from = dataClass.from,\n                            to = dataClass.to;\n\n                        // Assemble the default name. This can be overridden by legend.options.labelFormatter\n                        name = '';\n                        if (from === undefined) {\n                            name = '< ';\n                        } else if (to === undefined) {\n                            name = '> ';\n                        }\n                        if (from !== undefined) {\n                            name += H.numberFormat(from, valueDecimals) + valueSuffix;\n                        }\n                        if (from !== undefined && to !== undefined) {\n                            name += ' - ';\n                        }\n                        if (to !== undefined) {\n                            name += H.numberFormat(to, valueDecimals) + valueSuffix;\n                        }\n                        // Add a mock object to the legend items\n                        legendItems.push(extend({\n                            chart: chart,\n                            name: name,\n                            options: {},\n                            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n                            visible: true,\n                            setState: noop,\n                            isDataClass: true,\n                            setVisible: function() {\n                                vis = this.visible = !vis;\n                                each(axis.series, function(series) {\n                                    each(series.points, function(point) {\n                                        if (point.dataClass === i) {\n                                            point.setVisible(vis);\n                                        }\n                                    });\n                                });\n\n                                chart.legend.colorizeItem(this, vis);\n                            }\n                        }, dataClass));\n                    });\n                }\n                return legendItems;\n            },\n            name: '' // Prevents 'undefined' in legend in IE8\n        });\n\n        /**\n         * Handle animation of the color attributes directly\n         */\n        each(['fill', 'stroke'], function(prop) {\n            H.Fx.prototype[prop + 'Setter'] = function() {\n                this.elem.attr(\n                    prop,\n                    color(this.start).tweenTo(\n                        color(this.end),\n                        this.pos\n                    ),\n                    null,\n                    true\n                );\n            };\n        });\n\n        /**\n         * Extend the chart getAxes method to also get the color axis\n         */\n        wrap(Chart.prototype, 'getAxes', function(proceed) {\n\n            var options = this.options,\n                colorAxisOptions = options.colorAxis;\n\n            proceed.call(this);\n\n            this.colorAxis = [];\n            if (colorAxisOptions) {\n                new ColorAxis(this, colorAxisOptions); // eslint-disable-line no-new\n            }\n        });\n\n\n        /**\n         * Wrap the legend getAllItems method to add the color axis. This also removes the\n         * axis' own series to prevent them from showing up individually.\n         */\n        wrap(Legend.prototype, 'getAllItems', function(proceed) {\n            var allItems = [],\n                colorAxis = this.chart.colorAxis[0];\n\n            if (colorAxis && colorAxis.options) {\n                if (colorAxis.options.showInLegend) {\n                    // Data classes\n                    if (colorAxis.options.dataClasses) {\n                        allItems = allItems.concat(colorAxis.getDataClassLegendSymbols());\n                        // Gradient legend\n                    } else {\n                        // Add this axis on top\n                        allItems.push(colorAxis);\n                    }\n                }\n\n                // Don't add the color axis' series\n                each(colorAxis.series, function(series) {\n                    series.options.showInLegend = false;\n                });\n            }\n\n            return allItems.concat(proceed.call(this));\n        });\n\n        wrap(Legend.prototype, 'colorizeItem', function(proceed, item, visible) {\n            proceed.call(this, item, visible);\n            if (visible && item.legendColor) {\n                item.legendSymbol.attr({\n                    fill: item.legendColor\n                });\n            }\n        });\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var defined = H.defined,\n            each = H.each,\n            noop = H.noop,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * Mixin for maps and heatmaps\n         */\n        H.colorPointMixin = {\n            /**\n             * Color points have a value option that determines whether or not it is a null point\n             */\n            isValid: function() {\n                return this.value !== null;\n            },\n\n            /**\n             * Set the visibility of a single point\n             */\n            setVisible: function(vis) {\n                var point = this,\n                    method = vis ? 'show' : 'hide';\n\n                // Show and hide associated elements\n                each(['graphic', 'dataLabel'], function(key) {\n                    if (point[key]) {\n                        point[key][method]();\n                    }\n                });\n            },\n            setState: function(state) {\n                H.Point.prototype.setState.call(this, state);\n                if (this.graphic) {\n                    this.graphic.attr({\n                        zIndex: state === 'hover' ? 1 : 0\n                    });\n                }\n            }\n        };\n\n        H.colorSeriesMixin = {\n            pointArrayMap: ['value'],\n            axisTypes: ['xAxis', 'yAxis', 'colorAxis'],\n            optionalAxis: 'colorAxis',\n            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n            getSymbol: noop,\n            parallelArrays: ['x', 'y', 'value'],\n            colorKey: 'value',\n\n\n            pointAttribs: seriesTypes.column.prototype.pointAttribs,\n\n\n            /**\n             * In choropleth maps, the color is a result of the value, so this needs translation too\n             */\n            translateColors: function() {\n                var series = this,\n                    nullColor = this.options.nullColor,\n                    colorAxis = this.colorAxis,\n                    colorKey = this.colorKey;\n\n                each(this.data, function(point) {\n                    var value = point[colorKey],\n                        color;\n\n                    color = point.options.color ||\n                        (point.isNull ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color);\n\n                    if (color) {\n                        point.color = color;\n                    }\n                });\n            },\n\n            /**\n             * Get the color attibutes to apply on the graphic\n             */\n            colorAttribs: function(point) {\n                var ret = {};\n                if (defined(point.color)) {\n                    ret[this.colorProp || 'fill'] = point.color;\n                }\n                return ret;\n            }\n        };\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var colorPointMixin = H.colorPointMixin,\n            colorSeriesMixin = H.colorSeriesMixin,\n            each = H.each,\n            LegendSymbolMixin = H.LegendSymbolMixin,\n            merge = H.merge,\n            noop = H.noop,\n            pick = H.pick,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        // The Heatmap series type\n        seriesType('heatmap', 'scatter', {\n            animation: false,\n            borderWidth: 0,\n\n            nullColor: '#f7f7f7',\n\n            dataLabels: {\n                formatter: function() { // #2945\n                    return this.point.value;\n                },\n                inside: true,\n                verticalAlign: 'middle',\n                crop: false,\n                overflow: false,\n                padding: 0 // #3837\n            },\n            marker: null,\n            pointRange: null, // dynamically set to colsize by default\n            tooltip: {\n                pointFormat: '{point.x}, {point.y}: {point.value}<br/>'\n            },\n            states: {\n                normal: {\n                    animation: true\n                },\n                hover: {\n                    halo: false, // #3406, halo is not required on heatmaps\n                    brightness: 0.2\n                }\n            }\n        }, merge(colorSeriesMixin, {\n            pointArrayMap: ['y', 'value'],\n            hasPointSpecificOptions: true,\n            supportsDrilldown: true,\n            getExtremesFromAll: true,\n            directTouch: true,\n\n            /**\n             * Override the init method to add point ranges on both axes.\n             */\n            init: function() {\n                var options;\n                seriesTypes.scatter.prototype.init.apply(this, arguments);\n\n                options = this.options;\n                options.pointRange = pick(options.pointRange, options.colsize || 1); // #3758, prevent resetting in setData\n                this.yAxis.axisPointRange = options.rowsize || 1; // general point range\n            },\n            translate: function() {\n                var series = this,\n                    options = series.options,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    between = function(x, a, b) {\n                        return Math.min(Math.max(a, x), b);\n                    };\n\n                series.generatePoints();\n\n                each(series.points, function(point) {\n                    var xPad = (options.colsize || 1) / 2,\n                        yPad = (options.rowsize || 1) / 2,\n                        x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),\n                        x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),\n                        y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len),\n                        y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len);\n\n                    // Set plotX and plotY for use in K-D-Tree and more\n                    point.plotX = point.clientX = (x1 + x2) / 2;\n                    point.plotY = (y1 + y2) / 2;\n\n                    point.shapeType = 'rect';\n                    point.shapeArgs = {\n                        x: Math.min(x1, x2),\n                        y: Math.min(y1, y2),\n                        width: Math.abs(x2 - x1),\n                        height: Math.abs(y2 - y1)\n                    };\n                });\n\n                series.translateColors();\n            },\n            drawPoints: function() {\n                seriesTypes.column.prototype.drawPoints.call(this);\n\n                each(this.points, function(point) {\n\n                    point.graphic.attr(this.colorAttribs(point));\n\n                }, this);\n            },\n            animate: noop,\n            getBox: noop,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            alignDataLabel: seriesTypes.column.prototype.alignDataLabel,\n            getExtremes: function() {\n                // Get the extremes from the value data\n                Series.prototype.getExtremes.call(this, this.valueData);\n                this.valueMin = this.dataMin;\n                this.valueMax = this.dataMax;\n\n                // Get the extremes from the y data\n                Series.prototype.getExtremes.call(this);\n            }\n\n        }), colorPointMixin);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/no-data-to-display.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Plugin for displaying a message when there is no data visible in chart.\n\n (c) 2010-2017 Highsoft AS\n Author: Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(d){\"object\"===typeof module&&module.exports?module.exports=d:d(Highcharts)})(function(d){(function(c){function d(){this.hasData()?this.hideNoData():this.showNoData()}var g=c.seriesTypes,e=c.Chart.prototype,f=c.getOptions(),h=c.extend,k=c.each;h(f.lang,{noData:\"No data to display\"});f.noData={position:{x:0,y:0,align:\"center\",verticalAlign:\"middle\"}};f.noData.style={fontWeight:\"bold\",fontSize:\"12px\",color:\"#666666\"};k(\"bubble gauge heatmap pie treemap waterfall\".split(\" \"),function(a){g[a]&&\n(g[a].prototype.hasData=function(){return!!this.points.length})});c.Series.prototype.hasData=function(){return this.visible&&void 0!==this.dataMax&&void 0!==this.dataMin};e.showNoData=function(a){var b=this.options;a=a||b.lang.noData;b=b.noData;this.noDataLabel||(this.noDataLabel=this.renderer.label(a,0,0,null,null,null,b.useHTML,null,\"no-data\"),this.noDataLabel.attr(b.attr).css(b.style),this.noDataLabel.add(),this.noDataLabel.align(h(this.noDataLabel.getBBox(),b.position),!1,\"plotBox\"))};e.hideNoData=\nfunction(){this.noDataLabel&&(this.noDataLabel=this.noDataLabel.destroy())};e.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0;return this.loadingShown};e.callbacks.push(function(a){c.addEvent(a,\"load\",d);c.addEvent(a,\"redraw\",d)})})(d)});\n"
  },
  {
    "path": "assets/highcharts/modules/no-data-to-display.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Plugin for displaying a message when there is no data visible in chart.\n *\n * (c) 2010-2017 Highsoft AS\n * Author: Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Plugin for displaying a message when there is no data visible in chart.\n         *\n         * (c) 2010-2017 Highsoft AS\n         * Author: Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesTypes = H.seriesTypes,\n            chartPrototype = H.Chart.prototype,\n            defaultOptions = H.getOptions(),\n            extend = H.extend,\n            each = H.each;\n\n        // Add language option\n        extend(defaultOptions.lang, {\n            noData: 'No data to display'\n        });\n\n        // Add default display options for message\n        defaultOptions.noData = {\n            position: {\n                x: 0,\n                y: 0,\n                align: 'center',\n                verticalAlign: 'middle'\n            }\n            // useHTML: false\n        };\n\n\n        // Presentational\n        defaultOptions.noData.style = {\n            fontWeight: 'bold',\n            fontSize: '12px',\n            color: '#666666'\n        };\n\n\n\n        // Define hasData function for non-cartesian seris. Returns true if the series\n        // has points at all.\n        each([\n            'bubble',\n            'gauge',\n            'heatmap',\n            'pie',\n            'treemap',\n            'waterfall'\n        ], function(type) {\n            if (seriesTypes[type]) {\n                seriesTypes[type].prototype.hasData = function() {\n                    return !!this.points.length; /* != 0 */\n                };\n            }\n        });\n\n        /**\n         * Define hasData functions for series. These return true if there are data\n         * points on this series within the plot area.\n         */\n        H.Series.prototype.hasData = function() {\n            return this.visible && this.dataMax !== undefined && this.dataMin !== undefined; // #3703\n        };\n\n        /**\n         * Display a no-data message.\n         *\n         * @param {String} str An optional message to show in place of the default one \n         */\n        chartPrototype.showNoData = function(str) {\n            var chart = this,\n                options = chart.options,\n                text = str || options.lang.noData,\n                noDataOptions = options.noData;\n\n            if (!chart.noDataLabel) {\n                chart.noDataLabel = chart.renderer\n                    .label(\n                        text,\n                        0,\n                        0,\n                        null,\n                        null,\n                        null,\n                        noDataOptions.useHTML,\n                        null,\n                        'no-data'\n                    );\n\n\n                chart.noDataLabel\n                    .attr(noDataOptions.attr)\n                    .css(noDataOptions.style);\n\n\n                chart.noDataLabel.add();\n\n                chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');\n            }\n        };\n\n        /**\n         * Hide no-data message\t\n         */\n        chartPrototype.hideNoData = function() {\n            var chart = this;\n            if (chart.noDataLabel) {\n                chart.noDataLabel = chart.noDataLabel.destroy();\n            }\n        };\n\n        /**\n         * Returns true if there are data points within the plot area now\n         */\n        chartPrototype.hasData = function() {\n            var chart = this,\n                series = chart.series,\n                i = series.length;\n\n            while (i--) {\n                if (series[i].hasData() && !series[i].options.isInternal) {\n                    return true;\n                }\n            }\n\n            return chart.loadingShown; // #4588\n        };\n\n        /**\n         * Show no-data message if there is no data in sight. Otherwise, hide it.\n         */\n        function handleNoData() {\n            var chart = this;\n            if (chart.hasData()) {\n                chart.hideNoData();\n            } else {\n                chart.showNoData();\n            }\n        }\n\n        /**\n         * Add event listener to handle automatic display of no-data message\n         */\n        chartPrototype.callbacks.push(function(chart) {\n            H.addEvent(chart, 'load', handleNoData);\n            H.addEvent(chart, 'redraw', handleNoData);\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/offline-exporting.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Client side exporting module\n\n (c) 2015 Torstein Honsi / Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(n){\"object\"===typeof module&&module.exports?module.exports=n:n(Highcharts)})(function(n){(function(c){function n(a,c){var d=t.getElementsByTagName(\"head\")[0],b=t.createElement(\"script\");b.type=\"text/javascript\";b.src=a;b.onload=c;b.onerror=function(){console.error(\"Error loading script\",a)};d.appendChild(b)}var C=c.merge,e=c.win,r=e.navigator,t=e.document,z=c.each,w=e.URL||e.webkitURL||e,B=/Edge\\/|Trident\\/|MSIE /.test(r.userAgent),D=/Edge\\/\\d+/.test(r.userAgent),E=B?150:0;c.CanVGRenderer=\n{};c.dataURLtoBlob=function(a){if(e.atob&&e.ArrayBuffer&&e.Uint8Array&&e.Blob&&w.createObjectURL){a=a.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/);for(var c=e.atob(a[3]),d=new e.ArrayBuffer(c.length),d=new e.Uint8Array(d),b=0;b<d.length;++b)d[b]=c.charCodeAt(b);a=new e.Blob([d],{type:a[1]});return w.createObjectURL(a)}};c.downloadURL=function(a,f){var d=t.createElement(\"a\"),b;if(r.msSaveOrOpenBlob)r.msSaveOrOpenBlob(a,f);else{if(2E6<a.length&&(a=c.dataURLtoBlob(a),!a))throw\"Data URL length limit reached\";\nif(void 0!==d.download)d.href=a,d.download=f,t.body.appendChild(d),d.click(),t.body.removeChild(d);else try{if(b=e.open(a,\"chart\"),void 0===b||null===b)throw\"Failed to open window\";}catch(u){e.location.href=a}}};c.svgToDataUrl=function(a){var c=-1<r.userAgent.indexOf(\"WebKit\")&&0>r.userAgent.indexOf(\"Chrome\");try{if(!c&&0>r.userAgent.toLowerCase().indexOf(\"firefox\"))return w.createObjectURL(new e.Blob([a],{type:\"image/svg+xml;charset-utf-16\"}))}catch(d){}return\"data:image/svg+xml;charset\\x3dUTF-8,\"+\nencodeURIComponent(a)};c.imageToDataUrl=function(a,c,d,b,u,l,k,m,p){var g=new e.Image,h,f=function(){setTimeout(function(){var e=t.createElement(\"canvas\"),f=e.getContext&&e.getContext(\"2d\"),x;try{if(f){e.height=g.height*b;e.width=g.width*b;f.drawImage(g,0,0,e.width,e.height);try{x=e.toDataURL(c),u(x,c,d,b)}catch(F){h(a,c,d,b)}}else k(a,c,d,b)}finally{p&&p(a,c,d,b)}},E)},q=function(){m(a,c,d,b);p&&p(a,c,d,b)};h=function(){g=new e.Image;h=l;g.crossOrigin=\"Anonymous\";g.onload=f;g.onerror=q;g.src=a};\ng.onload=f;g.onerror=q;g.src=a};c.downloadSVGLocal=function(a,f,d,b){function u(b,a){a=new e.jsPDF(\"l\",\"pt\",[b.width.baseVal.value+2*a,b.height.baseVal.value+2*a]);e.svg2pdf(b,a,{removeInvalid:!0});return a.output(\"datauristring\")}function l(){y.innerHTML=a;var e=y.getElementsByTagName(\"text\"),g,f=y.getElementsByTagName(\"svg\")[0].style;z(e,function(b){z([\"font-family\",\"font-size\"],function(a){!b.style[a]&&f[a]&&(b.style[a]=f[a])});b.style[\"font-family\"]=b.style[\"font-family\"]&&b.style[\"font-family\"].split(\" \").splice(-1);\ng=b.getElementsByTagName(\"title\");z(g,function(a){b.removeChild(a)})});e=u(y.firstChild,0);try{c.downloadURL(e,v),b&&b()}catch(G){d()}}var k,m,p=!0,g,h=f.libURL||c.getOptions().exporting.libURL,y=t.createElement(\"div\"),q=f.type||\"image/png\",v=(f.filename||\"chart\")+\".\"+(\"image/svg+xml\"===q?\"svg\":q.split(\"/\")[1]),A=f.scale||1,h=\"/\"!==h.slice(-1)?h+\"/\":h;if(\"image/svg+xml\"===q)try{r.msSaveOrOpenBlob?(m=new MSBlobBuilder,m.append(a),k=m.getBlob(\"image/svg+xml\")):k=c.svgToDataUrl(a),c.downloadURL(k,v),\nb&&b()}catch(x){d()}else\"application/pdf\"===q?e.jsPDF&&e.svg2pdf?l():(p=!0,n(h+\"jspdf.js\",function(){n(h+\"svg2pdf.js\",function(){l()})})):(k=c.svgToDataUrl(a),g=function(){try{w.revokeObjectURL(k)}catch(x){}},c.imageToDataUrl(k,q,{},A,function(a){try{c.downloadURL(a,v),b&&b()}catch(F){d()}},function(){var f=t.createElement(\"canvas\"),u=f.getContext(\"2d\"),l=a.match(/^<svg[^>]*width\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1]*A,k=a.match(/^<svg[^>]*height\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1]*A,m=function(){u.drawSvg(a,0,0,\nl,k);try{c.downloadURL(r.msSaveOrOpenBlob?f.msToBlob():f.toDataURL(q),v),b&&b()}catch(H){d()}finally{g()}};f.width=l;f.height=k;e.canvg?m():(p=!0,n(h+\"rgbcolor.js\",function(){n(h+\"canvg.js\",function(){m()})}))},d,d,function(){p&&g()}))};c.Chart.prototype.getSVGForLocalExport=function(a,e,d,b){var f=this,l,k=0,m,p,g,h,n,q=function(a,c,d){++k;d.imageElement.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",a);k===l.length&&b(f.sanitizeSVG(m.innerHTML,p))};c.wrap(c.Chart.prototype,\"getChartHTML\",\nfunction(b){var a=b.apply(this,Array.prototype.slice.call(arguments,1));p=this.options;m=this.container.cloneNode(!0);return a});f.getSVGForExport(a,e);l=m.getElementsByTagName(\"image\");try{if(l.length)for(h=0,n=l.length;h<n;++h)g=l[h],c.imageToDataUrl(g.getAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\"),\"image/png\",{imageElement:g},a.scale,q,d,d,d);else b(f.sanitizeSVG(m.innerHTML,p))}catch(v){d()}};c.Chart.prototype.exportChartLocal=function(a,e){var d=this,b=c.merge(d.options.exporting,a),f=\nfunction(){if(!1===b.fallbackToExportServer)if(b.error)b.error(b);else throw\"Fallback to export server disabled\";else d.exportChart(b)};B&&(\"application/pdf\"===b.type||d.container.getElementsByTagName(\"image\").length&&\"image/svg+xml\"!==b.type)||D&&\"image/svg+xml\"!==b.type||\"application/pdf\"===b.type&&d.container.getElementsByTagName(\"image\").length?f():d.getSVGForLocalExport(b,e,f,function(a){-1<a.indexOf(\"\\x3cforeignObject\")&&\"image/svg+xml\"!==b.type?f():c.downloadSVGLocal(a,b,f)})};C(!0,c.getOptions().exporting,\n{libURL:\"https://code.highcharts.com/5.0.12/lib/\",buttons:{contextButton:{menuItems:[{textKey:\"printChart\",onclick:function(){this.print()}},{separator:!0},{textKey:\"downloadPNG\",onclick:function(){this.exportChartLocal()}},{textKey:\"downloadJPEG\",onclick:function(){this.exportChartLocal({type:\"image/jpeg\"})}},{textKey:\"downloadSVG\",onclick:function(){this.exportChartLocal({type:\"image/svg+xml\"})}},{textKey:\"downloadPDF\",onclick:function(){this.exportChartLocal({type:\"application/pdf\"})}}]}}})})(n)});\n"
  },
  {
    "path": "assets/highcharts/modules/offline-exporting.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Client side exporting module\n *\n * (c) 2015 Torstein Honsi / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * Client side exporting module\n         *\n         * (c) 2015 Torstein Honsi / Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        /*global MSBlobBuilder */\n\n        var merge = Highcharts.merge,\n            win = Highcharts.win,\n            nav = win.navigator,\n            doc = win.document,\n            each = Highcharts.each,\n            domurl = win.URL || win.webkitURL || win,\n            isMSBrowser = /Edge\\/|Trident\\/|MSIE /.test(nav.userAgent),\n            isEdgeBrowser = /Edge\\/\\d+/.test(nav.userAgent),\n            loadEventDeferDelay = isMSBrowser ? 150 : 0; // Milliseconds to defer image load event handlers to offset IE bug\n\n        // Dummy object so we can reuse our canvas-tools.js without errors\n        Highcharts.CanVGRenderer = {};\n\n\n        /**\n         * Downloads a script and executes a callback when done.\n         * @param {String} scriptLocation\n         * @param {Function} callback\n         */\n        function getScript(scriptLocation, callback) {\n            var head = doc.getElementsByTagName('head')[0],\n                script = doc.createElement('script');\n\n            script.type = 'text/javascript';\n            script.src = scriptLocation;\n            script.onload = callback;\n            script.onerror = function() {\n                console.error('Error loading script', scriptLocation); // eslint-disable-line no-console\n            };\n\n            head.appendChild(script);\n        }\n\n        // Convert dataURL to Blob if supported, otherwise returns undefined\n        Highcharts.dataURLtoBlob = function(dataURL) {\n            if (\n                win.atob &&\n                win.ArrayBuffer &&\n                win.Uint8Array &&\n                win.Blob &&\n                domurl.createObjectURL\n            ) {\n                // Try to convert data URL to Blob\n                var parts = dataURL.match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/),\n                    binStr = win.atob(parts[3]), // Assume base64 encoding\n                    buf = new win.ArrayBuffer(binStr.length),\n                    binary = new win.Uint8Array(buf),\n                    blob;\n\n                for (var i = 0; i < binary.length; ++i) {\n                    binary[i] = binStr.charCodeAt(i);\n                }\n\n                blob = new win.Blob([binary], {\n                    'type': parts[1]\n                });\n                return domurl.createObjectURL(blob);\n            }\n        };\n\n        // Download contents by dataURL/blob\n        Highcharts.downloadURL = function(dataURL, filename) {\n            var a = doc.createElement('a'),\n                windowRef;\n\n            // IE specific blob implementation\n            if (nav.msSaveOrOpenBlob) {\n                nav.msSaveOrOpenBlob(dataURL, filename);\n                return;\n            }\n\n            // Some browsers have limitations for data URL lengths. Try to convert to\n            // Blob or fall back.\n            if (dataURL.length > 2000000) {\n                dataURL = Highcharts.dataURLtoBlob(dataURL);\n                if (!dataURL) {\n                    throw 'Data URL length limit reached';\n                }\n            }\n\n            // Try HTML5 download attr if supported\n            if (a.download !== undefined) {\n                a.href = dataURL;\n                a.download = filename; // HTML5 download attribute\n                doc.body.appendChild(a);\n                a.click();\n                doc.body.removeChild(a);\n            } else {\n                // No download attr, just opening data URI\n                try {\n                    windowRef = win.open(dataURL, 'chart');\n                    if (windowRef === undefined || windowRef === null) {\n                        throw 'Failed to open window';\n                    }\n                } catch (e) {\n                    // window.open failed, trying location.href\n                    win.location.href = dataURL;\n                }\n            }\n        };\n\n        // Get blob URL from SVG code. Falls back to normal data URI.\n        Highcharts.svgToDataUrl = function(svg) {\n            var webKit = nav.userAgent.indexOf('WebKit') > -1 && nav.userAgent.indexOf('Chrome') < 0; // Webkit and not chrome\n            try {\n                // Safari requires data URI since it doesn't allow navigation to blob URLs\n                // Firefox has an issue with Blobs and internal references, leading to gradients not working using Blobs (#4550)\n                if (!webKit && nav.userAgent.toLowerCase().indexOf('firefox') < 0) {\n                    return domurl.createObjectURL(new win.Blob([svg], {\n                        type: 'image/svg+xml;charset-utf-16'\n                    }));\n                }\n            } catch (e) {\n                // Ignore\n            }\n            return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);\n        };\n\n        // Get data:URL from image URL\n        // Pass in callbacks to handle results. finallyCallback is always called at the end of the process. Supplying this callback is optional.\n        // All callbacks receive four arguments: imageURL, imageType, callbackArgs and scale. callbackArgs is used only by callbacks and can contain whatever.\n        Highcharts.imageToDataUrl = function(imageURL, imageType, callbackArgs, scale, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {\n            var img = new win.Image(),\n                taintedHandler,\n                loadHandler = function() {\n                    setTimeout(function() {\n                        var canvas = doc.createElement('canvas'),\n                            ctx = canvas.getContext && canvas.getContext('2d'),\n                            dataURL;\n                        try {\n                            if (!ctx) {\n                                noCanvasSupportCallback(imageURL, imageType, callbackArgs, scale);\n                            } else {\n                                canvas.height = img.height * scale;\n                                canvas.width = img.width * scale;\n                                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n                                // Now we try to get the contents of the canvas.\n                                try {\n                                    dataURL = canvas.toDataURL(imageType);\n                                    successCallback(dataURL, imageType, callbackArgs, scale);\n                                } catch (e) {\n                                    taintedHandler(imageURL, imageType, callbackArgs, scale);\n                                }\n                            }\n                        } finally {\n                            if (finallyCallback) {\n                                finallyCallback(imageURL, imageType, callbackArgs, scale);\n                            }\n                        }\n                    }, loadEventDeferDelay); // IE bug where image is not always ready despite calling load event.\n                },\n                // Image load failed (e.g. invalid URL)\n                errorHandler = function() {\n                    failedLoadCallback(imageURL, imageType, callbackArgs, scale);\n                    if (finallyCallback) {\n                        finallyCallback(imageURL, imageType, callbackArgs, scale);\n                    }\n                };\n\n            // This is called on load if the image drawing to canvas failed with a security error.\n            // We retry the drawing with crossOrigin set to Anonymous.\n            taintedHandler = function() {\n                img = new win.Image();\n                taintedHandler = taintedCallback;\n                img.crossOrigin = 'Anonymous'; // Must be set prior to loading image source\n                img.onload = loadHandler;\n                img.onerror = errorHandler;\n                img.src = imageURL;\n            };\n\n            img.onload = loadHandler;\n            img.onerror = errorHandler;\n            img.src = imageURL;\n        };\n\n        /**\n         * Get data URL to an image of an SVG and call download on it\n         *\n         * options object:\n         *\t\tfilename: Name of resulting downloaded file without extension\n         *\t\ttype: File type of resulting download\n         *\t\tscale: Scaling factor of downloaded image compared to source\n         *      libURL: URL pointing to location of dependency scripts to download on demand\n         */\n        Highcharts.downloadSVGLocal = function(svg, options, failCallback, successCallback) {\n            var svgurl,\n                blob,\n                objectURLRevoke = true,\n                finallyHandler,\n                libURL = options.libURL || Highcharts.getOptions().exporting.libURL,\n                dummySVGContainer = doc.createElement('div'),\n                imageType = options.type || 'image/png',\n                filename = (options.filename || 'chart') + '.' + (imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1]),\n                scale = options.scale || 1;\n\n            libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL; // Allow libURL to end with or without fordward slash\n\n            function svgToPdf(svgElement, margin) {\n                var width = svgElement.width.baseVal.value + 2 * margin,\n                    height = svgElement.height.baseVal.value + 2 * margin,\n                    pdf = new win.jsPDF('l', 'pt', [width, height]); // eslint-disable-line new-cap\n\n                win.svg2pdf(svgElement, pdf, {\n                    removeInvalid: true\n                });\n                return pdf.output('datauristring');\n            }\n\n            function downloadPDF() {\n                dummySVGContainer.innerHTML = svg;\n                var textElements = dummySVGContainer.getElementsByTagName('text'),\n                    titleElements,\n                    svgData,\n                    svgElementStyle = dummySVGContainer.getElementsByTagName('svg')[0].style;\n                // Workaround for the text styling. Making sure it does pick up the root element\n                each(textElements, function(el) {\n                    // Workaround for the text styling. making sure it does pick up the root element\n                    each(['font-family', 'font-size'], function(property) {\n                        if (!el.style[property] && svgElementStyle[property]) {\n                            el.style[property] = svgElementStyle[property];\n                        }\n                    });\n                    el.style['font-family'] = el.style['font-family'] && el.style['font-family'].split(' ').splice(-1);\n                    // Workaround for plotband with width, removing title from text nodes\n                    titleElements = el.getElementsByTagName('title');\n                    each(titleElements, function(titleElement) {\n                        el.removeChild(titleElement);\n                    });\n                });\n                svgData = svgToPdf(dummySVGContainer.firstChild, 0);\n                try {\n                    Highcharts.downloadURL(svgData, filename);\n                    if (successCallback) {\n                        successCallback();\n                    }\n                } catch (e) {\n                    failCallback();\n                }\n            }\n\n            // Initiate download depending on file type\n            if (imageType === 'image/svg+xml') {\n                // SVG download. In this case, we want to use Microsoft specific Blob if available\n                try {\n                    if (nav.msSaveOrOpenBlob) {\n                        blob = new MSBlobBuilder();\n                        blob.append(svg);\n                        svgurl = blob.getBlob('image/svg+xml');\n                    } else {\n                        svgurl = Highcharts.svgToDataUrl(svg);\n                    }\n                    Highcharts.downloadURL(svgurl, filename);\n                    if (successCallback) {\n                        successCallback();\n                    }\n                } catch (e) {\n                    failCallback();\n                }\n            } else if (imageType === 'application/pdf') {\n                if (win.jsPDF && win.svg2pdf) {\n                    downloadPDF();\n                } else {\n                    // Must load pdf libraries first\n                    objectURLRevoke = true; // Don't destroy the object URL yet since we are doing things asynchronously. A cleaner solution would be nice, but this will do for now.\n                    getScript(libURL + 'jspdf.js', function() {\n                        getScript(libURL + 'svg2pdf.js', function() {\n                            downloadPDF();\n                        });\n                    });\n                }\n            } else {\n                // PNG/JPEG download - create bitmap from SVG\n\n                svgurl = Highcharts.svgToDataUrl(svg);\n                finallyHandler = function() {\n                    try {\n                        domurl.revokeObjectURL(svgurl);\n                    } catch (e) {\n                        // Ignore\n                    }\n                };\n                // First, try to get PNG by rendering on canvas\n                Highcharts.imageToDataUrl(svgurl, imageType, { /* args */ }, scale, function(imageURL) {\n                        // Success\n                        try {\n                            Highcharts.downloadURL(imageURL, filename);\n                            if (successCallback) {\n                                successCallback();\n                            }\n                        } catch (e) {\n                            failCallback();\n                        }\n                    }, function() {\n                        // Failed due to tainted canvas\n                        // Create new and untainted canvas\n                        var canvas = doc.createElement('canvas'),\n                            ctx = canvas.getContext('2d'),\n                            imageWidth = svg.match(/^<svg[^>]*width\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1] * scale,\n                            imageHeight = svg.match(/^<svg[^>]*height\\s*=\\s*\\\"?(\\d+)\\\"?[^>]*>/)[1] * scale,\n                            downloadWithCanVG = function() {\n                                ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight);\n                                try {\n                                    Highcharts.downloadURL(nav.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL(imageType), filename);\n                                    if (successCallback) {\n                                        successCallback();\n                                    }\n                                } catch (e) {\n                                    failCallback();\n                                } finally {\n                                    finallyHandler();\n                                }\n                            };\n\n                        canvas.width = imageWidth;\n                        canvas.height = imageHeight;\n                        if (win.canvg) {\n                            // Use preloaded canvg\n                            downloadWithCanVG();\n                        } else {\n                            // Must load canVG first\n                            objectURLRevoke = true; // Don't destroy the object URL yet since we are doing things asynchronously. A cleaner solution would be nice, but this will do for now.\n                            getScript(libURL + 'rgbcolor.js', function() { // Get RGBColor.js first\n                                getScript(libURL + 'canvg.js', function() {\n                                    downloadWithCanVG();\n                                });\n                            });\n                        }\n                    },\n                    // No canvas support\n                    failCallback,\n                    // Failed to load image\n                    failCallback,\n                    // Finally\n                    function() {\n                        if (objectURLRevoke) {\n                            finallyHandler();\n                        }\n                    });\n            }\n        };\n\n        // Get SVG of chart prepared for client side export. This converts embedded images in the SVG to data URIs.\n        // The options and chartOptions arguments are passed to the getSVGForExport function.\n        Highcharts.Chart.prototype.getSVGForLocalExport = function(options, chartOptions, failCallback, successCallback) {\n            var chart = this,\n                images,\n                imagesEmbedded = 0,\n                chartCopyContainer,\n                chartCopyOptions,\n                el,\n                i,\n                l,\n                // After grabbing the SVG of the chart's copy container we need to do sanitation on the SVG\n                sanitize = function(svg) {\n                    return chart.sanitizeSVG(svg, chartCopyOptions);\n                },\n                // Success handler, we converted image to base64!\n                embeddedSuccess = function(imageURL, imageType, callbackArgs) {\n                    ++imagesEmbedded;\n\n                    // Change image href in chart copy\n                    callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL);\n\n                    // When done with last image we have our SVG\n                    if (imagesEmbedded === images.length) {\n                        successCallback(sanitize(chartCopyContainer.innerHTML));\n                    }\n                };\n\n            // Hook into getSVG to get a copy of the chart copy's container\n            Highcharts.wrap(\n                Highcharts.Chart.prototype,\n                'getChartHTML',\n                function(proceed) {\n                    var ret = proceed.apply(\n                        this,\n                        Array.prototype.slice.call(arguments, 1)\n                    );\n                    chartCopyOptions = this.options;\n                    chartCopyContainer = this.container.cloneNode(true);\n                    return ret;\n                }\n            );\n\n            // Trigger hook to get chart copy\n            chart.getSVGForExport(options, chartOptions);\n            images = chartCopyContainer.getElementsByTagName('image');\n\n            try {\n                // If there are no images to embed, the SVG is okay now.\n                if (!images.length) {\n                    successCallback(sanitize(chartCopyContainer.innerHTML)); // Use SVG of chart copy\n                    return;\n                }\n\n                // Go through the images we want to embed\n                for (i = 0, l = images.length; i < l; ++i) {\n                    el = images[i];\n                    Highcharts.imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), 'image/png', {\n                            imageElement: el\n                        }, options.scale,\n                        embeddedSuccess,\n                        // Tainted canvas\n                        failCallback,\n                        // No canvas support\n                        failCallback,\n                        // Failed to load source\n                        failCallback\n                    );\n                }\n            } catch (e) {\n                failCallback();\n            }\n        };\n\n        /**\n         * Exporting and offline-exporting modules required. Export a chart to an image\n         * locally in the user's browser.\n         *\n         * @param  {Object} exportingOptions\n         *         Exporting options, the same as in {@link\n         *         Highcharts.Chart#exportChart}.\n         * @param  {Options} chartOptions\n         *         Additional chart options for the exported chart. For example a\n         *         different background color can be added here, or `dataLabels`\n         *         for export only.\n         */\n        Highcharts.Chart.prototype.exportChartLocal = function(exportingOptions, chartOptions) {\n            var chart = this,\n                options = Highcharts.merge(chart.options.exporting, exportingOptions),\n                fallbackToExportServer = function() {\n                    if (options.fallbackToExportServer === false) {\n                        if (options.error) {\n                            options.error(options);\n                        } else {\n                            throw 'Fallback to export server disabled';\n                        }\n                    } else {\n                        chart.exportChart(options);\n                    }\n                },\n                svgSuccess = function(svg) {\n                    // If SVG contains foreignObjects all exports except SVG will fail,\n                    // as both CanVG and svg2pdf choke on this. Gracefully fall back.\n                    if (\n                        svg.indexOf('<foreignObject') > -1 &&\n                        options.type !== 'image/svg+xml'\n                    ) {\n                        fallbackToExportServer();\n                    } else {\n                        Highcharts.downloadSVGLocal(svg, options, fallbackToExportServer);\n                    }\n                };\n\n            // If we are on IE and in styled mode, add a whitelist to the renderer\n            // for inline styles that we want to pass through. There are so many\n            // styles by default in IE that we don't want to blacklist them all.\n\n\n            // Always fall back on:\n            // - MS browsers: Embedded images JPEG/PNG, or any PDF\n            // - Edge: PNG/JPEG all cases\n            // - Embedded images and PDF\n            if (\n                (\n                    isMSBrowser &&\n                    (\n                        options.type === 'application/pdf' ||\n                        chart.container.getElementsByTagName('image').length &&\n                        options.type !== 'image/svg+xml'\n                    )\n                ) || (\n                    isEdgeBrowser && options.type !== 'image/svg+xml'\n                ) || (\n                    options.type === 'application/pdf' &&\n                    chart.container.getElementsByTagName('image').length\n                )\n            ) {\n                fallbackToExportServer();\n                return;\n            }\n\n            chart.getSVGForLocalExport(options, chartOptions, fallbackToExportServer, svgSuccess);\n        };\n\n        // Extend the default options to use the local exporter logic\n        merge(true, Highcharts.getOptions().exporting, {\n            libURL: 'https://code.highcharts.com/5.0.12/lib/',\n            buttons: {\n                contextButton: {\n                    menuItems: [{\n                        textKey: 'printChart',\n                        onclick: function() {\n                            this.print();\n                        }\n                    }, {\n                        separator: true\n                    }, {\n                        textKey: 'downloadPNG',\n                        onclick: function() {\n                            this.exportChartLocal();\n                        }\n                    }, {\n                        textKey: 'downloadJPEG',\n                        onclick: function() {\n                            this.exportChartLocal({\n                                type: 'image/jpeg'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadSVG',\n                        onclick: function() {\n                            this.exportChartLocal({\n                                type: 'image/svg+xml'\n                            });\n                        }\n                    }, {\n                        textKey: 'downloadPDF',\n                        onclick: function() {\n                            this.exportChartLocal({\n                                type: 'application/pdf'\n                            });\n                        }\n                    }]\n                }\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/overlapping-datalabels.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(a){\"object\"===typeof module&&module.exports?module.exports=a:a(Highcharts)})(function(a){(function(a){var h=a.Chart,k=a.each,q=a.pick,r=a.addEvent;h.prototype.callbacks.push(function(f){function a(){var a=[];k(f.series||[],function(b){var c=b.options.dataLabels,d=b.dataLabelCollections||[\"dataLabel\"];(c.enabled||b._hasPointLabels)&&!c.allowOverlap&&b.visible&&k(d,function(c){k(b.points,function(b){b[c]&&(b[c].labelrank=q(b.labelrank,b.shapeArgs&&b.shapeArgs.height),a.push(b[c]))})})});f.hideOverlappingLabels(a)}\na();r(f,\"redraw\",a)});h.prototype.hideOverlappingLabels=function(a){var f=a.length,e,b,c,d,l,m,n,p,g,h=function(a,b,c,d,e,f,g,h){return!(e>a+c||e+g<a||f>b+d||f+h<b)};for(b=0;b<f;b++)if(e=a[b])e.oldOpacity=e.opacity,e.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(b=0;b<f;b++)for(c=a[b],e=b+1;e<f;++e)if(d=a[e],c&&d&&c!==d&&c.placed&&d.placed&&0!==c.newOpacity&&0!==d.newOpacity&&(l=c.alignAttr,m=d.alignAttr,n=c.parentGroup,p=d.parentGroup,g=2*(c.box?0:c.padding),l=h(l.x+\nn.translateX,l.y+n.translateY,c.width-g,c.height-g,m.x+p.translateX,m.y+p.translateY,d.width-g,d.height-g)))(c.labelrank<d.labelrank?c:d).newOpacity=0;k(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&a.placed&&(c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?\"animate\":\"attr\"](a.alignAttr,null,b)),a.isOld=!0)})}})(a)});\n"
  },
  {
    "path": "assets/highcharts/modules/overlapping-datalabels.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         * Highcharts module to hide overlapping data labels. This module is included in\n         * Highcharts.\n         */\n        var Chart = H.Chart,\n            each = H.each,\n            pick = H.pick,\n            addEvent = H.addEvent;\n\n        // Collect potensial overlapping data labels. Stack labels probably don't need\n        // to be considered because they are usually accompanied by data labels that lie\n        // inside the columns.\n        Chart.prototype.callbacks.push(function(chart) {\n            function collectAndHide() {\n                var labels = [];\n\n                each(chart.series || [], function(series) {\n                    var dlOptions = series.options.dataLabels,\n                        // Range series have two collections\n                        collections = series.dataLabelCollections || ['dataLabel'];\n\n                    if (\n                        (dlOptions.enabled || series._hasPointLabels) &&\n                        !dlOptions.allowOverlap &&\n                        series.visible\n                    ) { // #3866\n                        each(collections, function(coll) {\n                            each(series.points, function(point) {\n                                if (point[coll]) {\n                                    point[coll].labelrank = pick(\n                                        point.labelrank,\n                                        point.shapeArgs && point.shapeArgs.height\n                                    ); // #4118\n                                    labels.push(point[coll]);\n                                }\n                            });\n                        });\n                    }\n                });\n                chart.hideOverlappingLabels(labels);\n            }\n\n            // Do it now ...\n            collectAndHide();\n\n            // ... and after each chart redraw\n            addEvent(chart, 'redraw', collectAndHide);\n\n        });\n\n        /**\n         * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n         * provide a smooth visual imression.\n         */\n        Chart.prototype.hideOverlappingLabels = function(labels) {\n\n            var len = labels.length,\n                label,\n                i,\n                j,\n                label1,\n                label2,\n                isIntersecting,\n                pos1,\n                pos2,\n                parent1,\n                parent2,\n                padding,\n                intersectRect = function(x1, y1, w1, h1, x2, y2, w2, h2) {\n                    return !(\n                        x2 > x1 + w1 ||\n                        x2 + w2 < x1 ||\n                        y2 > y1 + h1 ||\n                        y2 + h2 < y1\n                    );\n                };\n\n            // Mark with initial opacity\n            for (i = 0; i < len; i++) {\n                label = labels[i];\n                if (label) {\n                    label.oldOpacity = label.opacity;\n                    label.newOpacity = 1;\n                }\n            }\n\n            // Prevent a situation in a gradually rising slope, that each label will\n            // hide the previous one because the previous one always has lower rank.\n            labels.sort(function(a, b) {\n                return (b.labelrank || 0) - (a.labelrank || 0);\n            });\n\n            // Detect overlapping labels\n            for (i = 0; i < len; i++) {\n                label1 = labels[i];\n\n                for (j = i + 1; j < len; ++j) {\n                    label2 = labels[j];\n                    if (\n                        label1 && label2 &&\n                        label1 !== label2 && // #6465, polar chart with connectEnds\n                        label1.placed && label2.placed &&\n                        label1.newOpacity !== 0 && label2.newOpacity !== 0\n                    ) {\n                        pos1 = label1.alignAttr;\n                        pos2 = label2.alignAttr;\n                        // Different panes have different positions\n                        parent1 = label1.parentGroup;\n                        parent2 = label2.parentGroup;\n                        // Substract the padding if no background or border (#4333)\n                        padding = 2 * (label1.box ? 0 : label1.padding);\n                        isIntersecting = intersectRect(\n                            pos1.x + parent1.translateX,\n                            pos1.y + parent1.translateY,\n                            label1.width - padding,\n                            label1.height - padding,\n                            pos2.x + parent2.translateX,\n                            pos2.y + parent2.translateY,\n                            label2.width - padding,\n                            label2.height - padding\n                        );\n\n                        if (isIntersecting) {\n                            (label1.labelrank < label2.labelrank ? label1 : label2)\n                            .newOpacity = 0;\n                        }\n                    }\n                }\n            }\n\n            // Hide or show\n            each(labels, function(label) {\n                var complete,\n                    newOpacity;\n\n                if (label) {\n                    newOpacity = label.newOpacity;\n\n                    if (label.oldOpacity !== newOpacity && label.placed) {\n\n                        // Make sure the label is completely hidden to avoid catching\n                        // clicks (#4362)\n                        if (newOpacity) {\n                            label.show(true);\n                        } else {\n                            complete = function() {\n                                label.hide();\n                            };\n                        }\n\n                        // Animate or set the opacity\t\t\t\t\t\n                        label.alignAttr.opacity = newOpacity;\n                        label[label.isOld ? 'animate' : 'attr'](\n                            label.alignAttr,\n                            null,\n                            complete\n                        );\n\n                    }\n                    label.isOld = true;\n                }\n            });\n        };\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/series-label.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2009-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(u){\"object\"===typeof module&&module.exports?module.exports=u:u(Highcharts)})(function(u){(function(q){function u(f,b,a,m,c,e){f=(e-b)*(a-f)-(m-b)*(c-f);return 0<f?!0:0>f?!1:!0}function v(f,b,a,m,c,e,d,l){return u(f,b,c,e,d,l)!==u(a,m,c,e,d,l)&&u(f,b,a,m,c,e)!==u(f,b,a,m,d,l)}function z(f,b,a,m,c,e,d,l){return v(f,b,f+a,b,c,e,d,l)||v(f+a,b,f+a,b+m,c,e,d,l)||v(f,b+m,f+a,b+m,c,e,d,l)||v(f,b,f,b+m,c,e,d,l)}function A(f){var b=this,a=Math.max(q.animObject(b.renderer.globalAnimation).duration,\n250),m=!b.hasRendered;f.apply(b,[].slice.call(arguments,1));b.labelSeries=[];clearTimeout(b.seriesLabelTimer);w(b.series,function(c){var e=c.labelBySeries,d=e&&e.closest;c.options.label.enabled&&c.visible&&(c.graph||c.area)&&(b.labelSeries.push(c),m&&(a=Math.max(a,q.animObject(c.options.animation).duration)),d&&(void 0!==d[0].plotX?e.animate({x:d[0].plotX+d[1],y:d[0].plotY+d[2]}):e.attr({opacity:0})))});b.seriesLabelTimer=setTimeout(function(){b.drawSeriesLabels()},a)}var B=q.wrap,w=q.each,D=q.extend,\nx=q.isNumber,C=q.Series,E=q.SVGRenderer,y=q.Chart;q.setOptions({plotOptions:{series:{label:{enabled:!0,connectorAllowed:!0,connectorNeighbourDistance:24,styles:{fontWeight:\"bold\"}}}}});E.prototype.symbols.connector=function(f,b,a,m,c){var e=c&&c.anchorX;c=c&&c.anchorY;var d,l,h=a/2;x(e)&&x(c)&&(d=[\"M\",e,c],l=b-c,0>l&&(l=-m-l),l<a&&(h=e<f+a/2?l:a-l),c>b+m?d.push(\"L\",f+h,b+m):c<b?d.push(\"L\",f+h,b):e<f?d.push(\"L\",f,b+m/2):e>f+a&&d.push(\"L\",f+a,b+m/2));return d||[]};C.prototype.getPointsOnGraph=function(){var f=\nthis.points,b,a,m=[],c,e,d,l;e=this.graph||this.area;d=e.element;var h=(b=this.chart.inverted)?this.yAxis.pos:this.xAxis.pos,n=b?this.xAxis.pos:this.yAxis.pos;if(this.getPointSpline&&d.getPointAtLength){e.toD&&(a=e.attr(\"d\"),e.attr({d:e.toD}));l=d.getTotalLength();for(c=0;c<l;c+=16)b=d.getPointAtLength(c),m.push({chartX:h+b.x,chartY:n+b.y,plotX:b.x,plotY:b.y});a&&e.attr({d:a});b=f[f.length-1];b.chartX=h+b.plotX;b.chartY=n+b.plotY;m.push(b)}else for(l=f.length,c=0;c<l;c+=1){b=f[c];a=f[c-1];b.chartX=\nh+b.plotX;b.chartY=n+b.plotY;if(0<c&&(e=Math.abs(b.chartX-a.chartX),d=Math.abs(b.chartY-a.chartY),e=Math.max(e,d),16<e))for(e=Math.ceil(e/16),d=1;d<e;d+=1)m.push({chartX:a.chartX+d/e*(b.chartX-a.chartX),chartY:a.chartY+d/e*(b.chartY-a.chartY),plotX:a.plotX+d/e*(b.plotX-a.plotX),plotY:a.plotY+d/e*(b.plotY-a.plotY)});x(b.plotY)&&m.push(b)}return m};C.prototype.checkClearPoint=function(f,b,a,m){var c=Number.MAX_VALUE,e=Number.MAX_VALUE,d,l,h=this.options.label.connectorAllowed,n=this.chart,p,g,r,k;for(r=\n0;r<n.boxesToAvoid.length;r+=1){g=n.boxesToAvoid[r];k=f+a.width;p=b;var q=b+a.height;if(!(f>g.right||k<g.left||p>g.bottom||q<g.top))return!1}for(r=0;r<n.series.length;r+=1)if(p=n.series[r],g=p.interpolatedPoints,p.visible&&g){for(k=1;k<g.length;k+=1){if(z(f,b,a.width,a.height,g[k-1].chartX,g[k-1].chartY,g[k].chartX,g[k].chartY))return!1;this===p&&!d&&m&&(d=z(f-16,b-16,a.width+32,a.height+32,g[k-1].chartX,g[k-1].chartY,g[k].chartX,g[k].chartY));this!==p&&(c=Math.min(c,Math.pow(f+a.width/2-g[k].chartX,\n2)+Math.pow(b+a.height/2-g[k].chartY,2),Math.pow(f-g[k].chartX,2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2),Math.pow(f-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2)))}if(h&&this===p&&(m&&!d||c<Math.pow(this.options.label.connectorNeighbourDistance,2))){for(k=1;k<g.length;k+=1)d=Math.min(Math.pow(f+a.width/2-g[k].chartX,2)+Math.pow(b+a.height/2-g[k].chartY,2),Math.pow(f-g[k].chartX,\n2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b-g[k].chartY,2),Math.pow(f+a.width-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2),Math.pow(f-g[k].chartX,2)+Math.pow(b+a.height-g[k].chartY,2)),d<e&&(e=d,l=g[k]);d=!0}}return!m||d?{x:f,y:b,weight:c-(l?e:0),connectorPoint:l}:!1};y.prototype.drawSeriesLabels=function(){var f=this,b=this.labelSeries;f.boxesToAvoid=[];w(b,function(a){a.interpolatedPoints=a.getPointsOnGraph();w(a.options.label.boxesToAvoid||[],function(a){f.boxesToAvoid.push(a)})});\nw(f.series,function(a){function b(a,b,c){return a>g&&a<=g+k-c.width&&b>=r&&b<=r+q-c.height}var c,e,d,l=[],h,n,p=f.inverted,g=p?a.yAxis.pos:a.xAxis.pos,r=p?a.xAxis.pos:a.yAxis.pos,k=f.inverted?a.yAxis.len:a.xAxis.len,q=f.inverted?a.xAxis.len:a.yAxis.len,t=a.interpolatedPoints,p=a.labelBySeries;if(a.visible&&t){p||(a.labelBySeries=p=f.renderer.label(a.name,0,-9999,\"connector\").css(D({color:a.color},a.options.label.styles)).attr({padding:0,opacity:0,stroke:a.color,\"stroke-width\":1}).add(a.group).animate({opacity:1},\n{duration:200}));c=p.getBBox();c.width=Math.round(c.width);for(n=t.length-1;0<n;--n)e=t[n].chartX+3,d=t[n].chartY-c.height-3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h),e=t[n].chartX+3,d=t[n].chartY+3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h),e=t[n].chartX-c.width-3,d=t[n].chartY+3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h),e=t[n].chartX-c.width-3,d=t[n].chartY-c.height-3,b(e,d,c)&&(h=a.checkClearPoint(e,d,c)),h&&l.push(h);if(!l.length)for(e=g+k-c.width;e>=g;e-=16)for(d=\nr;d<r+q-c.height;d+=16)(h=a.checkClearPoint(e,d,c,!0))&&l.push(h);if(l.length){if(l.sort(function(a,b){return b.weight-a.weight}),h=l[0],f.boxesToAvoid.push({left:h.x,right:h.x+c.width,top:h.y,bottom:h.y+c.height}),Math.round(h.x)!==Math.round(p.x)||Math.round(h.y)!==Math.round(p.y))a.labelBySeries.attr({opacity:0,x:h.x-g,y:h.y-r,anchorX:h.connectorPoint&&h.connectorPoint.plotX,anchorY:h.connectorPoint&&h.connectorPoint.plotY}).animate({opacity:1}),a.options.kdNow=!0,a.buildKDTree(),a=a.searchPoint({chartX:h.x,\nchartY:h.y},!0),p.closest=[a,h.x-g-a.plotX,h.y-r-a.plotY]}else p&&(a.labelBySeries=p.destroy())}})};B(y.prototype,\"render\",A);B(y.prototype,\"redraw\",A)})(u)});\n"
  },
  {
    "path": "assets/highcharts/modules/series-label.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /**\n         * EXPERIMENTAL Highcharts module to place labels next to a series in a natural position.\n         *\n         * TODO:\n         * - add column support (box collision detection, boxesToAvoid logic)\n         * - other series types, area etc.\n         * - avoid data labels, when data labels above, show series label below.\n         * - add more options (connector, format, formatter)\n         * \n         * http://jsfiddle.net/highcharts/L2u9rpwr/\n         * http://jsfiddle.net/highcharts/y5A37/\n         * http://jsfiddle.net/highcharts/264Nm/\n         * http://jsfiddle.net/highcharts/y5A37/\n         */\n\n\n        var labelDistance = 3,\n            wrap = H.wrap,\n            each = H.each,\n            extend = H.extend,\n            isNumber = H.isNumber,\n            Series = H.Series,\n            SVGRenderer = H.SVGRenderer,\n            Chart = H.Chart;\n\n        H.setOptions({\n            plotOptions: {\n                series: {\n                    label: {\n                        enabled: true,\n                        // Allow labels to be placed distant to the graph if necessary, and\n                        // draw a connector line to the graph\n                        connectorAllowed: true,\n                        connectorNeighbourDistance: 24, // If the label is closer than this to a neighbour graph, draw a connector\n                        styles: {\n                            fontWeight: 'bold'\n                        }\n                        // boxesToAvoid: []\n                    }\n                }\n            }\n        });\n\n        /**\n         * Counter-clockwise, part of the fast line intersection logic\n         */\n        function ccw(x1, y1, x2, y2, x3, y3) {\n            var cw = ((y3 - y1) * (x2 - x1)) - ((y2 - y1) * (x3 - x1));\n            return cw > 0 ? true : cw < 0 ? false : true;\n        }\n\n        /**\n         * Detect if two lines intersect\n         */\n        function intersectLine(x1, y1, x2, y2, x3, y3, x4, y4) {\n            return ccw(x1, y1, x3, y3, x4, y4) !== ccw(x2, y2, x3, y3, x4, y4) &&\n                ccw(x1, y1, x2, y2, x3, y3) !== ccw(x1, y1, x2, y2, x4, y4);\n        }\n\n        /**\n         * Detect if a box intersects with a line\n         */\n        function boxIntersectLine(x, y, w, h, x1, y1, x2, y2) {\n            return (\n                intersectLine(x, y, x + w, y, x1, y1, x2, y2) || // top of label\n                intersectLine(x + w, y, x + w, y + h, x1, y1, x2, y2) || // right of label\n                intersectLine(x, y + h, x + w, y + h, x1, y1, x2, y2) || // bottom of label\n                intersectLine(x, y, x, y + h, x1, y1, x2, y2) // left of label\n            );\n        }\n\n        /**\n         * General symbol definition for labels with connector\n         */\n        SVGRenderer.prototype.symbols.connector = function(x, y, w, h, options) {\n            var anchorX = options && options.anchorX,\n                anchorY = options && options.anchorY,\n                path,\n                yOffset,\n                lateral = w / 2;\n\n            if (isNumber(anchorX) && isNumber(anchorY)) {\n\n                path = ['M', anchorX, anchorY];\n\n                // Prefer 45 deg connectors\n                yOffset = y - anchorY;\n                if (yOffset < 0) {\n                    yOffset = -h - yOffset;\n                }\n                if (yOffset < w) {\n                    lateral = anchorX < x + (w / 2) ? yOffset : w - yOffset;\n                }\n\n                // Anchor below label\n                if (anchorY > y + h) {\n                    path.push('L', x + lateral, y + h);\n\n                    // Anchor above label\n                } else if (anchorY < y) {\n                    path.push('L', x + lateral, y);\n\n                    // Anchor left of label\n                } else if (anchorX < x) {\n                    path.push('L', x, y + h / 2);\n\n                    // Anchor right of label\n                } else if (anchorX > x + w) {\n                    path.push('L', x + w, y + h / 2);\n                }\n            }\n            return path || [];\n        };\n\n        /**\n         * Points to avoid. In addition to actual data points, the label should avoid\n         * interpolated positions.\n         */\n        Series.prototype.getPointsOnGraph = function() {\n            var distance = 16,\n                points = this.points,\n                point,\n                last,\n                interpolated = [],\n                i,\n                deltaX,\n                deltaY,\n                delta,\n                len,\n                n,\n                j,\n                d,\n                graph = this.graph || this.area,\n                node = graph.element,\n                inverted = this.chart.inverted,\n                paneLeft = inverted ? this.yAxis.pos : this.xAxis.pos,\n                paneTop = inverted ? this.xAxis.pos : this.yAxis.pos;\n\n            // For splines, get the point at length (possible caveat: peaks are not correctly detected)\n            if (this.getPointSpline && node.getPointAtLength) {\n                // If it is animating towards a path definition, use that briefly, and reset\n                if (graph.toD) {\n                    d = graph.attr('d');\n                    graph.attr({\n                        d: graph.toD\n                    });\n                }\n                len = node.getTotalLength();\n                for (i = 0; i < len; i += distance) {\n                    point = node.getPointAtLength(i);\n                    interpolated.push({\n                        chartX: paneLeft + point.x,\n                        chartY: paneTop + point.y,\n                        plotX: point.x,\n                        plotY: point.y\n                    });\n                }\n                if (d) {\n                    graph.attr({\n                        d: d\n                    });\n                }\n                // Last point\n                point = points[points.length - 1];\n                point.chartX = paneLeft + point.plotX;\n                point.chartY = paneTop + point.plotY;\n                interpolated.push(point);\n\n                // Interpolate\n            } else {\n                len = points.length;\n                for (i = 0; i < len; i += 1) {\n\n                    point = points[i];\n                    last = points[i - 1];\n\n                    // Absolute coordinates so we can compare different panes\n                    point.chartX = paneLeft + point.plotX;\n                    point.chartY = paneTop + point.plotY;\n\n                    // Add interpolated points\n                    if (i > 0) {\n                        deltaX = Math.abs(point.chartX - last.chartX);\n                        deltaY = Math.abs(point.chartY - last.chartY);\n                        delta = Math.max(deltaX, deltaY);\n                        if (delta > distance) {\n\n                            n = Math.ceil(delta / distance);\n\n                            for (j = 1; j < n; j += 1) {\n                                interpolated.push({\n                                    chartX: last.chartX + (point.chartX - last.chartX) * (j / n),\n                                    chartY: last.chartY + (point.chartY - last.chartY) * (j / n),\n                                    plotX: last.plotX + (point.plotX - last.plotX) * (j / n),\n                                    plotY: last.plotY + (point.plotY - last.plotY) * (j / n)\n                                });\n                            }\n                        }\n                    }\n\n                    // Add the real point in order to find positive and negative peaks\n                    if (isNumber(point.plotY)) {\n                        interpolated.push(point);\n                    }\n                }\n            }\n            return interpolated;\n        };\n\n        /**\n         * Check whether a proposed label position is clear of other elements\n         */\n        Series.prototype.checkClearPoint = function(x, y, bBox, checkDistance) {\n            var distToOthersSquared = Number.MAX_VALUE, // distance to other graphs\n                distToPointSquared = Number.MAX_VALUE,\n                dist,\n                connectorPoint,\n                connectorEnabled = this.options.label.connectorAllowed,\n\n                chart = this.chart,\n                series,\n                points,\n                leastDistance = 16,\n                withinRange,\n                i,\n                j;\n\n            function intersectRect(r1, r2) {\n                return !(r2.left > r1.right ||\n                    r2.right < r1.left ||\n                    r2.top > r1.bottom ||\n                    r2.bottom < r1.top);\n            }\n\n            /**\n             * Get the weight in order to determine the ideal position. Larger distance to\n             * other series gives more weight. Smaller distance to the actual point (connector points only)\n             * gives more weight.\n             */\n            function getWeight(distToOthersSquared, distToPointSquared) {\n                return distToOthersSquared - distToPointSquared;\n            }\n\n            // First check for collision with existing labels\n            for (i = 0; i < chart.boxesToAvoid.length; i += 1) {\n                if (intersectRect(chart.boxesToAvoid[i], {\n                        left: x,\n                        right: x + bBox.width,\n                        top: y,\n                        bottom: y + bBox.height\n                    })) {\n                    return false;\n                }\n            }\n\n            // For each position, check if the lines around the label intersect with any of the \n            // graphs\n            for (i = 0; i < chart.series.length; i += 1) {\n                series = chart.series[i];\n                points = series.interpolatedPoints;\n                if (series.visible && points) {\n                    for (j = 1; j < points.length; j += 1) {\n                        // If any of the box sides intersect with the line, return\n                        if (boxIntersectLine(\n                                x,\n                                y,\n                                bBox.width,\n                                bBox.height,\n                                points[j - 1].chartX,\n                                points[j - 1].chartY,\n                                points[j].chartX,\n                                points[j].chartY\n                            )) {\n                            return false;\n                        }\n\n                        // But if it is too far away (a padded box doesn't intersect), also return\n                        if (this === series && !withinRange && checkDistance) {\n                            withinRange = boxIntersectLine(\n                                x - leastDistance,\n                                y - leastDistance,\n                                bBox.width + 2 * leastDistance,\n                                bBox.height + 2 * leastDistance,\n                                points[j - 1].chartX,\n                                points[j - 1].chartY,\n                                points[j].chartX,\n                                points[j].chartY\n                            );\n                        }\n\n                        // Find the squared distance from the center of the label\n                        if (this !== series) {\n                            distToOthersSquared = Math.min(\n                                distToOthersSquared,\n                                Math.pow(x + bBox.width / 2 - points[j].chartX, 2) + Math.pow(y + bBox.height / 2 - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2)\n                            );\n                        }\n                    }\n\n                    // Do we need a connector? \n                    if (connectorEnabled && this === series && ((checkDistance && !withinRange) ||\n                            distToOthersSquared < Math.pow(this.options.label.connectorNeighbourDistance, 2))) {\n                        for (j = 1; j < points.length; j += 1) {\n                            dist = Math.min(\n                                Math.pow(x + bBox.width / 2 - points[j].chartX, 2) + Math.pow(y + bBox.height / 2 - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),\n                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2),\n                                Math.pow(x - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2)\n                            );\n                            if (dist < distToPointSquared) {\n                                distToPointSquared = dist;\n                                connectorPoint = points[j];\n                            }\n                        }\n                        withinRange = true;\n                    }\n                }\n            }\n\n            return !checkDistance || withinRange ? {\n                x: x,\n                y: y,\n                weight: getWeight(distToOthersSquared, connectorPoint ? distToPointSquared : 0),\n                connectorPoint: connectorPoint\n            } : false;\n\n        };\n\n        /**\n         * The main initiator method that runs on chart level after initiation and redraw. It runs in \n         * a timeout to prevent locking, and loops over all series, taking all series and labels into\n         * account when placing the labels.\n         */\n        Chart.prototype.drawSeriesLabels = function() {\n            var chart = this,\n                labelSeries = this.labelSeries;\n\n            chart.boxesToAvoid = [];\n\n            // Build the interpolated points\n            each(labelSeries, function(series) {\n                series.interpolatedPoints = series.getPointsOnGraph();\n\n                each(series.options.label.boxesToAvoid || [], function(box) {\n                    chart.boxesToAvoid.push(box);\n                });\n            });\n\n            each(chart.series, function(series) {\n                var bBox,\n                    x,\n                    y,\n                    results = [],\n                    clearPoint,\n                    i,\n                    best,\n                    inverted = chart.inverted,\n                    paneLeft = inverted ? series.yAxis.pos : series.xAxis.pos,\n                    paneTop = inverted ? series.xAxis.pos : series.yAxis.pos,\n                    paneWidth = chart.inverted ? series.yAxis.len : series.xAxis.len,\n                    paneHeight = chart.inverted ? series.xAxis.len : series.yAxis.len,\n                    points = series.interpolatedPoints,\n                    label = series.labelBySeries;\n\n                function insidePane(x, y, bBox) {\n                    return x > paneLeft && x <= paneLeft + paneWidth - bBox.width &&\n                        y >= paneTop && y <= paneTop + paneHeight - bBox.height;\n                }\n\n                if (series.visible && points) {\n                    if (!label) {\n                        series.labelBySeries = label = chart.renderer\n                            .label(series.name, 0, -9999, 'connector')\n                            .css(extend({\n                                color: series.color\n                            }, series.options.label.styles))\n                            .attr({\n                                padding: 0,\n                                opacity: 0,\n                                stroke: series.color,\n                                'stroke-width': 1\n                            })\n                            .add(series.group)\n                            .animate({\n                                opacity: 1\n                            }, {\n                                duration: 200\n                            });\n                    }\n\n                    bBox = label.getBBox();\n                    bBox.width = Math.round(bBox.width);\n\n                    // Ideal positions are centered above or below a point on right side\n                    // of chart\n                    for (i = points.length - 1; i > 0; i -= 1) {\n\n                        // Right - up\n                        x = points[i].chartX + labelDistance;\n                        y = points[i].chartY - bBox.height - labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                        // Right - down\n                        x = points[i].chartX + labelDistance;\n                        y = points[i].chartY + labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                        // Left - down\n                        x = points[i].chartX - bBox.width - labelDistance;\n                        y = points[i].chartY + labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                        // Left - up\n                        x = points[i].chartX - bBox.width - labelDistance;\n                        y = points[i].chartY - bBox.height - labelDistance;\n                        if (insidePane(x, y, bBox)) {\n                            best = series.checkClearPoint(\n                                x,\n                                y,\n                                bBox\n                            );\n                        }\n                        if (best) {\n                            results.push(best);\n                        }\n\n                    }\n\n                    // Brute force, try all positions on the chart in a 16x16 grid\n                    if (!results.length) {\n                        for (x = paneLeft + paneWidth - bBox.width; x >= paneLeft; x -= 16) {\n                            for (y = paneTop; y < paneTop + paneHeight - bBox.height; y += 16) {\n                                clearPoint = series.checkClearPoint(x, y, bBox, true);\n                                if (clearPoint) {\n                                    results.push(clearPoint);\n                                }\n                            }\n                        }\n                    }\n\n                    if (results.length) {\n\n                        results.sort(function(a, b) {\n                            return b.weight - a.weight;\n                        });\n\n                        best = results[0];\n\n                        chart.boxesToAvoid.push({\n                            left: best.x,\n                            right: best.x + bBox.width,\n                            top: best.y,\n                            bottom: best.y + bBox.height\n                        });\n\n                        // Move it if needed\n                        if (Math.round(best.x) !== Math.round(label.x) ||\n                            Math.round(best.y) !== Math.round(label.y)) {\n                            series.labelBySeries\n                                .attr({\n                                    opacity: 0,\n                                    x: best.x - paneLeft,\n                                    y: best.y - paneTop,\n                                    anchorX: best.connectorPoint && best.connectorPoint.plotX,\n                                    anchorY: best.connectorPoint && best.connectorPoint.plotY\n                                })\n                                .animate({\n                                    opacity: 1\n                                });\n\n                            // Record closest point to stick to for sync redraw\n                            series.options.kdNow = true;\n                            series.buildKDTree();\n                            var closest = series.searchPoint({\n                                chartX: best.x,\n                                chartY: best.y\n                            }, true);\n                            label.closest = [\n                                closest,\n                                best.x - paneLeft - closest.plotX,\n                                best.y - paneTop - closest.plotY\n                            ];\n\n                        }\n\n                    } else if (label) {\n                        series.labelBySeries = label.destroy();\n                    }\n                }\n            });\n        };\n\n        /**\n         * Prepare drawing series labels\n         */\n        function drawLabels(proceed) {\n\n            var chart = this,\n                delay = Math.max(\n                    H.animObject(chart.renderer.globalAnimation).duration,\n                    250\n                ),\n                initial = !chart.hasRendered;\n\n            proceed.apply(chart, [].slice.call(arguments, 1));\n\n            chart.labelSeries = [];\n\n            clearTimeout(chart.seriesLabelTimer);\n\n            // Which series should have labels\n            each(chart.series, function(series) {\n                var options = series.options.label,\n                    label = series.labelBySeries,\n                    closest = label && label.closest;\n\n                if (options.enabled && series.visible && (series.graph || series.area)) {\n                    chart.labelSeries.push(series);\n\n                    // The labels are processing heavy, wait until the animation is done\n                    if (initial) {\n                        delay = Math.max(\n                            delay,\n                            H.animObject(series.options.animation).duration\n                        );\n                    }\n\n                    // Keep the position updated to the axis while redrawing\n                    if (closest) {\n                        if (closest[0].plotX !== undefined) {\n                            label.animate({\n                                x: closest[0].plotX + closest[1],\n                                y: closest[0].plotY + closest[2]\n                            });\n                        } else {\n                            label.attr({\n                                opacity: 0\n                            });\n                        }\n                    }\n                }\n            });\n\n            chart.seriesLabelTimer = setTimeout(function() {\n                chart.drawSeriesLabels();\n            }, delay);\n\n        }\n        wrap(Chart.prototype, 'render', drawLabels);\n        wrap(Chart.prototype, 'redraw', drawLabels);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/solid-gauge.js",
    "content": "/*\n  Highcharts JS v5.0.12 (2017-05-24)\n Solid angular gauge module\n\n (c) 2010-2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(l){\"object\"===typeof module&&module.exports?module.exports=l:l(Highcharts)})(function(l){(function(e){var l=e.pInt,u=e.pick,m=e.each,r=e.isNumber,w=e.wrap,v;w(e.Renderer.prototype.symbols,\"arc\",function(a,f,d,c,e,b){a=a(f,d,c,e,b);b.rounded&&(c=((b.r||c)-b.innerR)/2,b=[\"A\",c,c,0,1,1,a[12],a[13]],a.splice.apply(a,[a.length-1,0].concat([\"A\",c,c,0,1,1,a[1],a[2]])),a.splice.apply(a,[11,3].concat(b)));return a});v={initDataClasses:function(a){var f=this.chart,d,c=0,t=this.options;this.dataClasses=\nd=[];m(a.dataClasses,function(b,h){b=e.merge(b);d.push(b);b.color||(\"category\"===t.dataClassColor?(h=f.options.colors,b.color=h[c++],c===h.length&&(c=0)):b.color=e.color(t.minColor).tweenTo(e.color(t.maxColor),h/(a.dataClasses.length-1)))})},initStops:function(a){this.stops=a.stops||[[0,this.options.minColor],[1,this.options.maxColor]];m(this.stops,function(a){a.color=e.color(a[1])})},toColor:function(a,f){var d=this.stops,c,e,b=this.dataClasses,h,g;if(b)for(g=b.length;g--;){if(h=b[g],c=h.from,d=\nh.to,(void 0===c||a>=c)&&(void 0===d||a<=d)){e=h.color;f&&(f.dataClass=g);break}}else{this.isLog&&(a=this.val2lin(a));a=1-(this.max-a)/(this.max-this.min);for(g=d.length;g--&&!(a>d[g][0]););c=d[g]||d[g+1];d=d[g+1]||c;a=1-(d[0]-a)/(d[0]-c[0]||1);e=c.color.tweenTo(d.color,a)}return e}};e.seriesType(\"solidgauge\",\"gauge\",{colorByPoint:!0},{translate:function(){var a=this.yAxis;e.extend(a,v);!a.dataClasses&&a.options.dataClasses&&a.initDataClasses(a.options);a.initStops(a.options);e.seriesTypes.gauge.prototype.translate.call(this)},\ndrawPoints:function(){var a=this,f=a.yAxis,d=f.center,c=a.options,t=a.chart.renderer,b=c.overshoot,h=r(b)?b/180*Math.PI:0,g;r(c.threshold)&&(g=f.startAngleRad+f.translate(c.threshold,null,null,null,!0));this.thresholdAngleRad=u(g,f.startAngleRad);m(a.points,function(b){var g=b.graphic,k=f.startAngleRad+f.translate(b.y,null,null,null,!0),m=l(u(b.options.radius,c.radius,100))*d[2]/200,n=l(u(b.options.innerRadius,c.innerRadius,60))*d[2]/200,p=f.toColor(b.y,b),q=Math.min(f.startAngleRad,f.endAngleRad),\nr=Math.max(f.startAngleRad,f.endAngleRad);\"none\"===p&&(p=b.color||a.color||\"none\");\"none\"!==p&&(b.color=p);k=Math.max(q-h,Math.min(r+h,k));!1===c.wrap&&(k=Math.max(q,Math.min(r,k)));q=Math.min(k,a.thresholdAngleRad);k=Math.max(k,a.thresholdAngleRad);k-q>2*Math.PI&&(k=q+2*Math.PI);b.shapeArgs=n={x:d[0],y:d[1],r:m,innerR:n,start:q,end:k,rounded:c.rounded};b.startR=m;g?(b=n.d,g.animate(e.extend({fill:p},n)),b&&(n.d=b)):(b.graphic=t.arc(n).addClass(b.getClassName(),!0).attr({fill:p,\"sweep-flag\":0}).add(a.group),\n\"square\"!==c.linecap&&b.graphic.attr({\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"}),b.graphic.attr({stroke:c.borderColor||\"none\",\"stroke-width\":c.borderWidth||0}))})},animate:function(a){a||(this.startAngleRad=this.thresholdAngleRad,e.seriesTypes.pie.prototype.animate.call(this,a))}})})(l)});\n"
  },
  {
    "path": "assets/highcharts/modules/solid-gauge.src.js",
    "content": "/**\n * @license  Highcharts JS v5.0.12 (2017-05-24)\n * Solid angular gauge module\n *\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * Solid angular gauge module\n         *\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n\n        var pInt = H.pInt,\n            pick = H.pick,\n            each = H.each,\n            isNumber = H.isNumber,\n            wrap = H.wrap,\n            Renderer = H.Renderer,\n            colorAxisMethods;\n\n        /**\n         * Symbol definition of an arc with round edges.\n         * \n         * @param  {Number} x - The X coordinate for the top left position.\n         * @param  {Number} y - The Y coordinate for the top left position.\n         * @param  {Number} w - The pixel width.\n         * @param  {Number} h - The pixel height.\n         * @param  {Object} [options] - Additional options, depending on the actual\n         *    symbol drawn.\n         * @param {boolean} [options.rounded] - Whether to draw rounded edges.\n         * @return {Array} Path of the created arc. \n         */\n        wrap(Renderer.prototype.symbols, 'arc', function(proceed, x, y, w, h, options) {\n            var arc = proceed,\n                path = arc(x, y, w, h, options);\n            if (options.rounded) {\n                var r = options.r || w,\n                    smallR = (r - options.innerR) / 2,\n                    x1 = path[1],\n                    y1 = path[2],\n                    x2 = path[12],\n                    y2 = path[13],\n                    roundStart = ['A', smallR, smallR, 0, 1, 1, x1, y1],\n                    roundEnd = ['A', smallR, smallR, 0, 1, 1, x2, y2];\n                // Insert rounded edge on end, and remove line.\n                path.splice.apply(path, [path.length - 1, 0].concat(roundStart));\n                // Insert rounded edge on end, and remove line.\n                path.splice.apply(path, [11, 3].concat(roundEnd));\n            }\n            return path;\n        });\n\n        // These methods are defined in the ColorAxis object, and copied here.\n        // If we implement an AMD system we should make ColorAxis a dependency.\n        colorAxisMethods = {\n\n\n            initDataClasses: function(userOptions) {\n                var chart = this.chart,\n                    dataClasses,\n                    colorCounter = 0,\n                    options = this.options;\n                this.dataClasses = dataClasses = [];\n\n                each(userOptions.dataClasses, function(dataClass, i) {\n                    var colors;\n\n                    dataClass = H.merge(dataClass);\n                    dataClasses.push(dataClass);\n                    if (!dataClass.color) {\n                        if (options.dataClassColor === 'category') {\n                            colors = chart.options.colors;\n                            dataClass.color = colors[colorCounter++];\n                            // loop back to zero\n                            if (colorCounter === colors.length) {\n                                colorCounter = 0;\n                            }\n                        } else {\n                            dataClass.color = H.color(options.minColor).tweenTo(\n                                H.color(options.maxColor),\n                                i / (userOptions.dataClasses.length - 1)\n                            );\n                        }\n                    }\n                });\n            },\n\n            initStops: function(userOptions) {\n                this.stops = userOptions.stops || [\n                    [0, this.options.minColor],\n                    [1, this.options.maxColor]\n                ];\n                each(this.stops, function(stop) {\n                    stop.color = H.color(stop[1]);\n                });\n            },\n            /** \n             * Translate from a value to a color\n             */\n            toColor: function(value, point) {\n                var pos,\n                    stops = this.stops,\n                    from,\n                    to,\n                    color,\n                    dataClasses = this.dataClasses,\n                    dataClass,\n                    i;\n\n                if (dataClasses) {\n                    i = dataClasses.length;\n                    while (i--) {\n                        dataClass = dataClasses[i];\n                        from = dataClass.from;\n                        to = dataClass.to;\n                        if ((from === undefined || value >= from) && (to === undefined || value <= to)) {\n                            color = dataClass.color;\n                            if (point) {\n                                point.dataClass = i;\n                            }\n                            break;\n                        }\n                    }\n\n                } else {\n\n                    if (this.isLog) {\n                        value = this.val2lin(value);\n                    }\n                    pos = 1 - ((this.max - value) / (this.max - this.min));\n                    i = stops.length;\n                    while (i--) {\n                        if (pos > stops[i][0]) {\n                            break;\n                        }\n                    }\n                    from = stops[i] || stops[i + 1];\n                    to = stops[i + 1] || from;\n\n                    // The position within the gradient\n                    pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);\n\n                    color = from.color.tweenTo(\n                        to.color,\n                        pos\n                    );\n                }\n                return color;\n            }\n        };\n\n        // The solidgauge series type\n        H.seriesType('solidgauge', 'gauge', {\n            colorByPoint: true\n\n        }, {\n\n            /**\n             * Extend the translate function to extend the Y axis with the necessary\n             * decoration (#5895).\n             */\n            translate: function() {\n                var axis = this.yAxis;\n                H.extend(axis, colorAxisMethods);\n\n                // Prepare data classes\n                if (!axis.dataClasses && axis.options.dataClasses) {\n                    axis.initDataClasses(axis.options);\n                }\n                axis.initStops(axis.options);\n\n                // Generate points and inherit data label position\n                H.seriesTypes.gauge.prototype.translate.call(this);\n            },\n\n            /**\n             * Draw the points where each point is one needle\n             */\n            drawPoints: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    center = yAxis.center,\n                    options = series.options,\n                    renderer = series.chart.renderer,\n                    overshoot = options.overshoot,\n                    overshootVal = isNumber(overshoot) ? overshoot / 180 * Math.PI : 0,\n                    thresholdAngleRad;\n\n                // Handle the threshold option\n                if (isNumber(options.threshold)) {\n                    thresholdAngleRad = yAxis.startAngleRad + yAxis.translate(\n                        options.threshold,\n                        null,\n                        null,\n                        null,\n                        true\n                    );\n                }\n                this.thresholdAngleRad = pick(thresholdAngleRad, yAxis.startAngleRad);\n\n\n                each(series.points, function(point) {\n                    var graphic = point.graphic,\n                        rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true),\n                        radius = (pInt(pick(point.options.radius, options.radius, 100)) * center[2]) / 200,\n                        innerRadius = (pInt(pick(point.options.innerRadius, options.innerRadius, 60)) * center[2]) / 200,\n                        shapeArgs,\n                        d,\n                        toColor = yAxis.toColor(point.y, point),\n                        axisMinAngle = Math.min(yAxis.startAngleRad, yAxis.endAngleRad),\n                        axisMaxAngle = Math.max(yAxis.startAngleRad, yAxis.endAngleRad),\n                        minAngle,\n                        maxAngle;\n\n                    if (toColor === 'none') { // #3708\n                        toColor = point.color || series.color || 'none';\n                    }\n                    if (toColor !== 'none') {\n                        point.color = toColor;\n                    }\n\n                    // Handle overshoot and clipping to axis max/min\n                    rotation = Math.max(axisMinAngle - overshootVal, Math.min(axisMaxAngle + overshootVal, rotation));\n\n                    // Handle the wrap option\n                    if (options.wrap === false) {\n                        rotation = Math.max(axisMinAngle, Math.min(axisMaxAngle, rotation));\n                    }\n\n                    minAngle = Math.min(rotation, series.thresholdAngleRad);\n                    maxAngle = Math.max(rotation, series.thresholdAngleRad);\n\n                    if (maxAngle - minAngle > 2 * Math.PI) {\n                        maxAngle = minAngle + 2 * Math.PI;\n                    }\n\n                    point.shapeArgs = shapeArgs = {\n                        x: center[0],\n                        y: center[1],\n                        r: radius,\n                        innerR: innerRadius,\n                        start: minAngle,\n                        end: maxAngle,\n                        rounded: options.rounded\n                    };\n                    point.startR = radius; // For PieSeries.animate\n\n                    if (graphic) {\n                        d = shapeArgs.d;\n                        graphic.animate(H.extend({\n                            fill: toColor\n                        }, shapeArgs));\n                        if (d) {\n                            shapeArgs.d = d; // animate alters it\n                        }\n                    } else {\n                        point.graphic = renderer.arc(shapeArgs)\n                            .addClass(point.getClassName(), true)\n                            .attr({\n                                fill: toColor,\n                                'sweep-flag': 0\n                            })\n                            .add(series.group);\n\n\n                        if (options.linecap !== 'square') {\n                            point.graphic.attr({\n                                'stroke-linecap': 'round',\n                                'stroke-linejoin': 'round'\n                            });\n                        }\n                        point.graphic.attr({\n                            stroke: options.borderColor || 'none',\n                            'stroke-width': options.borderWidth || 0\n                        });\n\n                    }\n                });\n            },\n\n            /**\n             * Extend the pie slice animation by animating from start angle and up\n             */\n            animate: function(init) {\n\n                if (!init) {\n                    this.startAngleRad = this.thresholdAngleRad;\n                    H.seriesTypes.pie.prototype.animate.call(this, init);\n                }\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/static-scale.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n StaticScale\n\n (c) 2016 Torstein Honsi, Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(a){\"object\"===typeof module&&module.exports?module.exports=a:a(Highcharts)})(function(a){(function(c){var a=c.Chart,e=c.each,f=c.pick;a.prototype.adjustHeight=function(){e(this.axes,function(b){var a=b.chart,e=!!a.initiatedScale&&a.options.animation,d=b.options.staticScale;c.isNumber(d)&&!b.horiz&&c.defined(b.min)&&(b=f(b.unitLength,b.max+b.tickInterval-b.min)*d,b=Math.max(b,d),d=b-a.plotHeight,1<=Math.abs(d)&&(a.plotHeight=b,a.setSize(null,a.chartHeight+d,e)))});this.initiatedScale=!0};\nc.addEvent(a.prototype,\"render\",a.prototype.adjustHeight)})(a)});\n"
  },
  {
    "path": "assets/highcharts/modules/static-scale.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * StaticScale\n *\n * (c) 2016 Torstein Honsi, Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2017 Torstein Honsi, Lars Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var Chart = H.Chart,\n            each = H.each,\n            pick = H.pick;\n\n        Chart.prototype.adjustHeight = function() {\n            each(this.axes, function(axis) {\n                var chart = axis.chart,\n                    animate = !!chart.initiatedScale && chart.options.animation,\n                    staticScale = axis.options.staticScale,\n                    height,\n                    diff;\n                if (\n                    H.isNumber(staticScale) &&\n                    !axis.horiz &&\n                    H.defined(axis.min)\n                ) {\n                    height = pick(\n                        axis.unitLength,\n                        axis.max + axis.tickInterval - axis.min\n                    ) * staticScale;\n\n                    // Minimum height is 1 x staticScale.\n                    height = Math.max(height, staticScale);\n\n                    diff = height - chart.plotHeight;\n\n                    if (Math.abs(diff) >= 1) {\n                        chart.plotHeight = height;\n                        chart.setSize(null, chart.chartHeight + diff, animate);\n                    }\n                }\n\n            });\n            this.initiatedScale = true;\n        };\n        H.addEvent(Chart.prototype, 'render', Chart.prototype.adjustHeight);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/stock.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n Highstock as a plugin for Highcharts\n\n (c) 2017 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(K){\"object\"===typeof module&&module.exports?module.exports=K:K(Highcharts)})(function(K){(function(a){var G=a.addEvent,p=a.Axis,A=a.Chart,D=a.css,F=a.dateFormat,y=a.defined,I=a.each,C=a.extend,w=a.noop,r=a.timeUnits,J=a.wrap;J(a.Series.prototype,\"init\",function(a){var d;a.apply(this,Array.prototype.slice.call(arguments,1));(d=this.xAxis)&&d.options.ordinal&&G(this,\"updatedData\",function(){delete d.ordinalIndex})});J(p.prototype,\"getTimeTicks\",function(a,e,c,g,k,n,u,f){var h=0,d,q,b={},m,\nE,H,t=[],l=-Number.MAX_VALUE,v=this.options.tickPixelInterval;if(!this.options.ordinal&&!this.options.breaks||!n||3>n.length||void 0===c)return a.call(this,e,c,g,k);E=n.length;for(d=0;d<E;d++){H=d&&n[d-1]>g;n[d]<c&&(h=d);if(d===E-1||n[d+1]-n[d]>5*u||H){if(n[d]>l){for(q=a.call(this,e,n[h],n[d],k);q.length&&q[0]<=l;)q.shift();q.length&&(l=q[q.length-1]);t=t.concat(q)}h=d+1}if(H)break}a=q.info;if(f&&a.unitRange<=r.hour){d=t.length-1;for(h=1;h<d;h++)F(\"%d\",t[h])!==F(\"%d\",t[h-1])&&(b[t[h]]=\"day\",m=!0);\nm&&(b[t[0]]=\"day\");a.higherRanks=b}t.info=a;if(f&&y(v)){f=a=t.length;d=[];var z;for(m=[];f--;)h=this.translate(t[f]),z&&(m[f]=z-h),d[f]=z=h;m.sort();m=m[Math.floor(m.length/2)];m<.6*v&&(m=null);f=t[a-1]>g?a-1:a;for(z=void 0;f--;)h=d[f],g=Math.abs(z-h),z&&g<.8*v&&(null===m||g<.8*m)?(b[t[f]]&&!b[t[f+1]]?(g=f+1,z=h):g=f,t.splice(g,1)):z=h}return t});C(p.prototype,{beforeSetTickPositions:function(){var a,e=[],c=!1,g,k=this.getExtremes(),n=k.min,u=k.max,f,h=this.isXAxis&&!!this.options.breaks,k=this.options.ordinal,\nx=this.chart.options.chart.ignoreHiddenSeries;if(k||h){I(this.series,function(f,b){if(!(x&&!1===f.visible||!1===f.takeOrdinalPosition&&!h)&&(e=e.concat(f.processedXData),a=e.length,e.sort(function(b,f){return b-f}),a))for(b=a-1;b--;)e[b]===e[b+1]&&e.splice(b,1)});a=e.length;if(2<a){g=e[1]-e[0];for(f=a-1;f--&&!c;)e[f+1]-e[f]!==g&&(c=!0);!this.options.keepOrdinalPadding&&(e[0]-n>g||u-e[e.length-1]>g)&&(c=!0)}c?(this.ordinalPositions=e,g=this.ordinal2lin(Math.max(n,e[0]),!0),f=Math.max(this.ordinal2lin(Math.min(u,\ne[e.length-1]),!0),1),this.ordinalSlope=u=(u-n)/(f-g),this.ordinalOffset=n-g*u):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=k&&c;this.groupIntervalFactor=null},val2lin:function(a,e){var c=this.ordinalPositions;if(c){var g=c.length,k,d;for(k=g;k--;)if(c[k]===a){d=k;break}for(k=g-1;k--;)if(a>c[k]||0===k){a=(a-c[k])/(c[k+1]-c[k]);d=k+a;break}e=e?d:this.ordinalSlope*(d||0)+this.ordinalOffset}else e=a;return e},lin2val:function(a,e){var c=this.ordinalPositions;if(c){var g=\nthis.ordinalSlope,k=this.ordinalOffset,d=c.length-1,u;if(e)0>a?a=c[0]:a>d?a=c[d]:(d=Math.floor(a),u=a-d);else for(;d--;)if(e=g*d+k,a>=e){g=g*(d+1)+k;u=(a-e)/(g-e);break}return void 0!==u&&void 0!==c[d]?c[d]+(u?u*(c[d+1]-c[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,e=this.series[0].currentDataGrouping,c=this.ordinalIndex,g=e?e.count+e.unitName:\"raw\",k=this.getExtremes(),n,u;c||(c=this.ordinalIndex={});c[g]||(n={series:[],chart:a,getExtremes:function(){return{min:k.dataMin,\nmax:k.dataMax}},options:{ordinal:!0},val2lin:p.prototype.val2lin,ordinal2lin:p.prototype.ordinal2lin},I(this.series,function(f){u={xAxis:n,xData:f.xData,chart:a,destroyGroupedData:w};u.options={dataGrouping:e?{enabled:!0,forced:!0,approximation:\"open\",units:[[e.unitName,[e.count]]]}:{enabled:!1}};f.processData.apply(u);n.series.push(u)}),this.beforeSetTickPositions.apply(n),c[g]=n.ordinalPositions);return c[g]},getGroupIntervalFactor:function(a,e,c){var g;c=c.processedXData;var k=c.length,d=[];g=\nthis.groupIntervalFactor;if(!g){for(g=0;g<k-1;g++)d[g]=c[g+1]-c[g];d.sort(function(a,f){return a-f});d=d[Math.floor(k/2)];a=Math.max(a,c[0]);e=Math.min(e,c[k-1]);this.groupIntervalFactor=g=k*d/(e-a)}return g},postProcessTickInterval:function(a){var d=this.ordinalSlope;return d?this.options.breaks?this.closestPointRange:a/(d/this.closestPointRange):a}});p.prototype.ordinal2lin=p.prototype.val2lin;J(A.prototype,\"pan\",function(a,e){var c=this.xAxis[0],g=e.chartX,d=!1;if(c.options.ordinal&&c.series.length){var n=\nthis.mouseDownX,u=c.getExtremes(),f=u.dataMax,h=u.min,x=u.max,q=this.hoverPoints,b=c.closestPointRange,n=(n-g)/(c.translationSlope*(c.ordinalSlope||b)),m={ordinalPositions:c.getExtendedPositions()},b=c.lin2val,E=c.val2lin,H;m.ordinalPositions?1<Math.abs(n)&&(q&&I(q,function(b){b.setState()}),0>n?(q=m,H=c.ordinalPositions?c:m):(q=c.ordinalPositions?c:m,H=m),m=H.ordinalPositions,f>m[m.length-1]&&m.push(f),this.fixedRange=x-h,n=c.toFixedRange(null,null,b.apply(q,[E.apply(q,[h,!0])+n,!0]),b.apply(H,[E.apply(H,\n[x,!0])+n,!0])),n.min>=Math.min(u.dataMin,h)&&n.max<=Math.max(f,x)&&c.setExtremes(n.min,n.max,!0,!1,{trigger:\"pan\"}),this.mouseDownX=g,D(this.container,{cursor:\"move\"})):d=!0}else d=!0;d&&a.apply(this,Array.prototype.slice.call(arguments,1))})})(K);(function(a){function G(){return Array.prototype.slice.call(arguments,1)}function p(a){a.apply(this);this.drawBreaks(this.xAxis,[\"x\"]);this.drawBreaks(this.yAxis,A(this.pointArrayMap,[\"y\"]))}var A=a.pick,D=a.wrap,F=a.each,y=a.extend,I=a.isArray,C=a.fireEvent,\nw=a.Axis,r=a.Series;y(w.prototype,{isInBreak:function(a,d){var e=a.repeat||Infinity,c=a.from,g=a.to-a.from;d=d>=c?(d-c)%e:e-(c-d)%e;return a.inclusive?d<=g:d<g&&0!==d},isInAnyBreak:function(a,d){var e=this.options.breaks,c=e&&e.length,g,k,n;if(c){for(;c--;)this.isInBreak(e[c],a)&&(g=!0,k||(k=A(e[c].showPoints,this.isXAxis?!1:!0)));n=g&&d?g&&!k:g}return n}});D(w.prototype,\"setTickPositions\",function(a){a.apply(this,Array.prototype.slice.call(arguments,1));if(this.options.breaks){var d=this.tickPositions,\ne=this.tickPositions.info,c=[],g;for(g=0;g<d.length;g++)this.isInAnyBreak(d[g])||c.push(d[g]);this.tickPositions=c;this.tickPositions.info=e}});D(w.prototype,\"init\",function(a,d,e){var c=this;e.breaks&&e.breaks.length&&(e.ordinal=!1);a.call(this,d,e);a=this.options.breaks;c.isBroken=I(a)&&!!a.length;c.isBroken&&(c.val2lin=function(a){var g=a,d,e;for(e=0;e<c.breakArray.length;e++)if(d=c.breakArray[e],d.to<=a)g-=d.len;else if(d.from>=a)break;else if(c.isInBreak(d,a)){g-=a-d.from;break}return g},c.lin2val=\nfunction(a){var d,g;for(g=0;g<c.breakArray.length&&!(d=c.breakArray[g],d.from>=a);g++)d.to<a?a+=d.len:c.isInBreak(d,a)&&(a+=d.len);return a},c.setExtremes=function(a,c,d,e,f){for(;this.isInAnyBreak(a);)a-=this.closestPointRange;for(;this.isInAnyBreak(c);)c-=this.closestPointRange;w.prototype.setExtremes.call(this,a,c,d,e,f)},c.setAxisTranslation=function(a){w.prototype.setAxisTranslation.call(this,a);a=c.options.breaks;var d=[],e=[],g=0,f,h,x=c.userMin||c.min,q=c.userMax||c.max,b=A(c.pointRangePadding,\n0),m,E;F(a,function(b){h=b.repeat||Infinity;c.isInBreak(b,x)&&(x+=b.to%h-x%h);c.isInBreak(b,q)&&(q-=q%h-b.from%h)});F(a,function(b){m=b.from;for(h=b.repeat||Infinity;m-h>x;)m-=h;for(;m<x;)m+=h;for(E=m;E<q;E+=h)d.push({value:E,move:\"in\"}),d.push({value:E+(b.to-b.from),move:\"out\",size:b.breakSize})});d.sort(function(b,a){return b.value===a.value?(\"in\"===b.move?0:1)-(\"in\"===a.move?0:1):b.value-a.value});f=0;m=x;F(d,function(b){f+=\"in\"===b.move?1:-1;1===f&&\"in\"===b.move&&(m=b.value);0===f&&(e.push({from:m,\nto:b.value,len:b.value-m-(b.size||0)}),g+=b.value-m-(b.size||0))});c.breakArray=e;c.unitLength=q-x-g+b;C(c,\"afterBreaks\");c.options.staticScale?c.transA=c.options.staticScale:c.unitLength&&(c.transA*=(q-c.min+b)/c.unitLength);b&&(c.minPixelPadding=c.transA*c.minPointOffset);c.min=x;c.max=q})});D(r.prototype,\"generatePoints\",function(a){a.apply(this,G(arguments));var d=this.xAxis,e=this.yAxis,c=this.points,g,k=c.length,n=this.options.connectNulls,u;if(d&&e&&(d.options.breaks||e.options.breaks))for(;k--;)g=\nc[k],u=null===g.y&&!1===n,u||!d.isInAnyBreak(g.x,!0)&&!e.isInAnyBreak(g.y,!0)||(c.splice(k,1),this.data[k]&&this.data[k].destroyElements())});a.Series.prototype.drawBreaks=function(a,d){var e=this,c=e.points,g,k,n,u;a&&F(d,function(f){g=a.breakArray||[];k=a.isXAxis?a.min:A(e.options.threshold,a.min);F(c,function(h){u=A(h[\"stack\"+f.toUpperCase()],h[f]);F(g,function(f){n=!1;if(k<f.from&&u>f.to||k>f.from&&u<f.from)n=\"pointBreak\";else if(k<f.from&&u>f.from&&u<f.to||k>f.from&&u>f.to&&u<f.from)n=\"pointInBreak\";\nn&&C(a,n,{point:h,brk:f})})})})};a.Series.prototype.gappedPath=function(){var a=this.options.gapSize,d=this.points.slice(),e=d.length-1;if(a&&0<e)for(;e--;)d[e+1].x-d[e].x>this.closestPointRange*a&&d.splice(e+1,0,{isNull:!0});return this.getGraphPath(d)};D(a.seriesTypes.column.prototype,\"drawPoints\",p);D(a.Series.prototype,\"drawPoints\",p)})(K);(function(a){var G=a.arrayMax,p=a.arrayMin,A=a.Axis,D=a.defaultPlotOptions,F=a.defined,y=a.each,I=a.extend,C=a.format,w=a.isNumber,r=a.merge,J=a.pick,d=a.Point,\ne=a.Tooltip,c=a.wrap,g=a.Series.prototype,k=g.processData,n=g.generatePoints,u=g.destroy,f={approximation:\"average\",groupPixelWidth:2,dateTimeLabelFormats:{millisecond:[\"%A, %b %e, %H:%M:%S.%L\",\"%A, %b %e, %H:%M:%S.%L\",\"-%H:%M:%S.%L\"],second:[\"%A, %b %e, %H:%M:%S\",\"%A, %b %e, %H:%M:%S\",\"-%H:%M:%S\"],minute:[\"%A, %b %e, %H:%M\",\"%A, %b %e, %H:%M\",\"-%H:%M\"],hour:[\"%A, %b %e, %H:%M\",\"%A, %b %e, %H:%M\",\"-%H:%M\"],day:[\"%A, %b %e, %Y\",\"%A, %b %e\",\"-%A, %b %e, %Y\"],week:[\"Week from %A, %b %e, %Y\",\"%A, %b %e\",\n\"-%A, %b %e, %Y\"],month:[\"%B %Y\",\"%B\",\"-%B %Y\"],year:[\"%Y\",\"%Y\",\"-%Y\"]}},h={line:{},spline:{},area:{},areaspline:{},column:{approximation:\"sum\",groupPixelWidth:10},arearange:{approximation:\"range\"},areasplinerange:{approximation:\"range\"},columnrange:{approximation:\"range\",groupPixelWidth:10},candlestick:{approximation:\"ohlc\",groupPixelWidth:10},ohlc:{approximation:\"ohlc\",groupPixelWidth:5}},x=a.defaultDataGroupingUnits=[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",\n[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1]],[\"week\",[1]],[\"month\",[1,3,6]],[\"year\",null]],q={sum:function(b){var a=b.length,f;if(!a&&b.hasNulls)f=null;else if(a)for(f=0;a--;)f+=b[a];return f},average:function(b){var a=b.length;b=q.sum(b);w(b)&&a&&(b/=a);return b},averages:function(){var b=[];y(arguments,function(a){b.push(q.average(a))});return b},open:function(b){return b.length?b[0]:b.hasNulls?null:void 0},high:function(b){return b.length?G(b):b.hasNulls?null:void 0},low:function(b){return b.length?\np(b):b.hasNulls?null:void 0},close:function(b){return b.length?b[b.length-1]:b.hasNulls?null:void 0},ohlc:function(b,a,f,h){b=q.open(b);a=q.high(a);f=q.low(f);h=q.close(h);if(w(b)||w(a)||w(f)||w(h))return[b,a,f,h]},range:function(b,a){b=q.low(b);a=q.high(a);if(w(b)||w(a))return[b,a];if(null===b&&null===a)return null}};g.groupData=function(b,a,c,d){var m=this.data,l=this.options.data,v=[],z=[],E=[],e=b.length,B,g,N=!!a,k=[];d=\"function\"===typeof d?d:q[d]||h[this.type]&&q[h[this.type].approximation]||\nq[f.approximation];var H=this.pointArrayMap,x=H&&H.length,n=0;g=0;var u,r;x?y(H,function(){k.push([])}):k.push([]);u=x||1;for(r=0;r<=e&&!(b[r]>=c[0]);r++);for(r;r<=e;r++){for(;void 0!==c[n+1]&&b[r]>=c[n+1]||r===e;){B=c[n];this.dataGroupInfo={start:g,length:k[0].length};g=d.apply(this,k);void 0!==g&&(v.push(B),z.push(g),E.push(this.dataGroupInfo));g=r;for(B=0;B<u;B++)k[B].length=0,k[B].hasNulls=!1;n+=1;if(r===e)break}if(r===e)break;if(H){B=this.cropStart+r;var C=m&&m[B]||this.pointClass.prototype.applyOptions.apply({series:this},\n[l[B]]),p;for(B=0;B<x;B++)p=C[H[B]],w(p)?k[B].push(p):null===p&&(k[B].hasNulls=!0)}else B=N?a[r]:null,w(B)?k[0].push(B):null===B&&(k[0].hasNulls=!0)}return[v,z,E]};g.processData=function(){var b=this.chart,a=this.options.dataGrouping,f=!1!==this.allowDG&&a&&J(a.enabled,b.options.isStock),h=this.visible||!b.options.chart.ignoreHiddenSeries,c;this.forceCrop=f;this.groupPixelWidth=null;this.hasProcessed=!0;if(!1!==k.apply(this,arguments)&&f){this.destroyGroupedData();var l=this.processedXData,v=this.processedYData,\nz=b.plotSizeX,b=this.xAxis,d=b.options.ordinal,e=this.groupPixelWidth=b.getGroupPixelWidth&&b.getGroupPixelWidth();if(e){this.isDirty=c=!0;this.points=null;var B=b.getExtremes(),f=B.min,B=B.max,d=d&&b.getGroupIntervalFactor(f,B,this)||1,z=e*(B-f)/z*d,e=b.getTimeTicks(b.normalizeTimeTickInterval(z,a.units||x),Math.min(f,l[0]),Math.max(B,l[l.length-1]),b.options.startOfWeek,l,this.closestPointRange),l=g.groupData.apply(this,[l,v,e,a.approximation]),v=l[0],d=l[1];if(a.smoothed){a=v.length-1;for(v[a]=\nMath.min(v[a],B);a--&&0<a;)v[a]+=z/2;v[0]=Math.max(v[0],f)}this.currentDataGrouping=e.info;this.closestPointRange=e.info.totalRange;this.groupMap=l[2];F(v[0])&&v[0]<b.dataMin&&h&&(b.min===b.dataMin&&(b.min=v[0]),b.dataMin=v[0]);this.processedXData=v;this.processedYData=d}else this.currentDataGrouping=this.groupMap=null;this.hasGroupedData=c}};g.destroyGroupedData=function(){var a=this.groupedData;y(a||[],function(b,f){b&&(a[f]=b.destroy?b.destroy():null)});this.groupedData=null};g.generatePoints=\nfunction(){n.apply(this);this.destroyGroupedData();this.groupedData=this.hasGroupedData?this.points:null};c(d.prototype,\"update\",function(b){this.dataGroup?a.error(24):b.apply(this,[].slice.call(arguments,1))});c(e.prototype,\"tooltipFooterHeaderFormatter\",function(b,f,h){var c=f.series,d=c.tooltipOptions,l=c.options.dataGrouping,v=d.xDateFormat,z,m=c.xAxis,e=a.dateFormat;return m&&\"datetime\"===m.options.type&&l&&w(f.key)?(b=c.currentDataGrouping,l=l.dateTimeLabelFormats,b?(m=l[b.unitName],1===b.count?\nv=m[0]:(v=m[1],z=m[2])):!v&&l&&(v=this.getXDateFormat(f,d,m)),v=e(v,f.key),z&&(v+=e(z,f.key+b.totalRange-1)),C(d[(h?\"footer\":\"header\")+\"Format\"],{point:I(f.point,{key:v}),series:c})):b.call(this,f,h)});g.destroy=function(){for(var a=this.groupedData||[],f=a.length;f--;)a[f]&&a[f].destroy();u.apply(this)};c(g,\"setOptions\",function(a,c){a=a.call(this,c);var b=this.type,d=this.chart.options.plotOptions,m=D[b].dataGrouping;h[b]&&(m||(m=r(f,h[b])),a.dataGrouping=r(m,d.series&&d.series.dataGrouping,d[b].dataGrouping,\nc.dataGrouping));this.chart.options.isStock&&(this.requireSorting=!0);return a});c(A.prototype,\"setScale\",function(a){a.call(this);y(this.series,function(a){a.hasProcessed=!1})});A.prototype.getGroupPixelWidth=function(){var a=this.series,f=a.length,h,c=0,d=!1,l;for(h=f;h--;)(l=a[h].options.dataGrouping)&&(c=Math.max(c,l.groupPixelWidth));for(h=f;h--;)(l=a[h].options.dataGrouping)&&a[h].hasProcessed&&(f=(a[h].processedXData||a[h].data).length,a[h].groupPixelWidth||f>this.chart.plotSizeX/c||f&&l.forced)&&\n(d=!0);return d?c:0};A.prototype.setDataGrouping=function(a,f){var b;f=J(f,!0);a||(a={forced:!1,units:null});if(this instanceof A)for(b=this.series.length;b--;)this.series[b].update({dataGrouping:a},!1);else y(this.chart.options.series,function(b){b.dataGrouping=a},!1);f&&this.chart.redraw()}})(K);(function(a){var G=a.each,p=a.Point,A=a.seriesType,D=a.seriesTypes;A(\"ohlc\",\"column\",{lineWidth:1,tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e \\x3cb\\x3e {series.name}\\x3c/b\\x3e\\x3cbr/\\x3eOpen: {point.open}\\x3cbr/\\x3eHigh: {point.high}\\x3cbr/\\x3eLow: {point.low}\\x3cbr/\\x3eClose: {point.close}\\x3cbr/\\x3e'},\nthreshold:null,states:{hover:{lineWidth:3}},stickyTracking:!0},{directTouch:!1,pointArrayMap:[\"open\",\"high\",\"low\",\"close\"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:\"close\",pointAttrToOptions:{stroke:\"color\",\"stroke-width\":\"lineWidth\"},pointAttribs:function(a,p){p=D.column.prototype.pointAttribs.call(this,a,p);var y=this.options;delete p.fill;!a.options.color&&y.upColor&&a.open<a.close&&(p.stroke=y.upColor);return p},translate:function(){var a=this,p=a.yAxis,I=!!a.modifyValue,\nC=[\"plotOpen\",\"plotHigh\",\"plotLow\",\"plotClose\",\"yBottom\"];D.column.prototype.translate.apply(a);G(a.points,function(w){G([w.open,w.high,w.low,w.close,w.low],function(r,y){null!==r&&(I&&(r=a.modifyValue(r)),w[C[y]]=p.toPixels(r,!0))});w.tooltipPos[1]=w.plotHigh+p.pos-a.chart.plotTop})},drawPoints:function(){var a=this,p=a.chart;G(a.points,function(y){var C,w,r,A,d=y.graphic,e,c=!d;void 0!==y.plotY&&(d||(y.graphic=d=p.renderer.path().add(a.group)),d.attr(a.pointAttribs(y,y.selected&&\"select\")),w=d.strokeWidth()%\n2/2,e=Math.round(y.plotX)-w,r=Math.round(y.shapeArgs.width/2),A=[\"M\",e,Math.round(y.yBottom),\"L\",e,Math.round(y.plotHigh)],null!==y.open&&(C=Math.round(y.plotOpen)+w,A.push(\"M\",e,C,\"L\",e-r,C)),null!==y.close&&(C=Math.round(y.plotClose)+w,A.push(\"M\",e,C,\"L\",e+r,C)),d[c?\"attr\":\"animate\"]({d:A}).addClass(y.getClassName(),!0))})},animate:null},{getClassName:function(){return p.prototype.getClassName.call(this)+(this.open<this.close?\" highcharts-point-up\":\" highcharts-point-down\")}})})(K);(function(a){var G=\na.defaultPlotOptions,p=a.each,A=a.merge,D=a.seriesType,F=a.seriesTypes;D(\"candlestick\",\"ohlc\",A(G.column,{states:{hover:{lineWidth:2}},tooltip:G.ohlc.tooltip,threshold:null,lineColor:\"#000000\",lineWidth:1,upColor:\"#ffffff\",stickyTracking:!0}),{pointAttribs:function(a,p){var C=F.column.prototype.pointAttribs.call(this,a,p),w=this.options,r=a.open<a.close,y=w.lineColor||this.color;C[\"stroke-width\"]=w.lineWidth;C.fill=a.options.color||(r?w.upColor||this.color:this.color);C.stroke=a.lineColor||(r?w.upLineColor||\ny:y);p&&(a=w.states[p],C.fill=a.color||C.fill,C.stroke=a.lineColor||C.stroke,C[\"stroke-width\"]=a.lineWidth||C[\"stroke-width\"]);return C},drawPoints:function(){var a=this,A=a.chart;p(a.points,function(p){var w=p.graphic,r,y,d,e,c,g,k,n=!w;void 0!==p.plotY&&(w||(p.graphic=w=A.renderer.path().add(a.group)),w.attr(a.pointAttribs(p,p.selected&&\"select\")).shadow(a.options.shadow),c=w.strokeWidth()%2/2,g=Math.round(p.plotX)-c,r=p.plotOpen,y=p.plotClose,d=Math.min(r,y),r=Math.max(r,y),k=Math.round(p.shapeArgs.width/\n2),y=Math.round(d)!==Math.round(p.plotHigh),e=r!==p.yBottom,d=Math.round(d)+c,r=Math.round(r)+c,c=[],c.push(\"M\",g-k,r,\"L\",g-k,d,\"L\",g+k,d,\"L\",g+k,r,\"Z\",\"M\",g,d,\"L\",g,y?Math.round(p.plotHigh):d,\"M\",g,r,\"L\",g,e?Math.round(p.yBottom):r),w[n?\"attr\":\"animate\"]({d:c}).addClass(p.getClassName(),!0))})}})})(K);(function(a){var G=a.addEvent,p=a.each,A=a.merge,D=a.noop,F=a.Renderer,y=a.seriesType,I=a.seriesTypes,C=a.TrackerMixin,w=a.VMLRenderer,r=a.SVGRenderer.prototype.symbols,J=a.stableSort;y(\"flags\",\"column\",\n{pointRange:0,shape:\"flag\",stackDistance:12,textAlign:\"center\",tooltip:{pointFormat:\"{point.text}\\x3cbr/\\x3e\"},threshold:null,y:-30,fillColor:\"#ffffff\",lineWidth:1,states:{hover:{lineColor:\"#000000\",fillColor:\"#ccd6eb\"}},style:{fontSize:\"11px\",fontWeight:\"bold\"}},{sorted:!1,noSharedTooltip:!0,allowDG:!1,takeOrdinalPosition:!1,trackerGroups:[\"markerGroup\"],forceCrop:!0,init:a.Series.prototype.init,pointAttribs:function(a,e){var c=this.options,d=a&&a.color||this.color,k=c.lineColor,n=a&&a.lineWidth;\na=a&&a.fillColor||c.fillColor;e&&(a=c.states[e].fillColor,k=c.states[e].lineColor,n=c.states[e].lineWidth);return{fill:a||d,stroke:k||d,\"stroke-width\":n||c.lineWidth||0}},translate:function(){I.column.prototype.translate.apply(this);var a=this.options,e=this.chart,c=this.points,g=c.length-1,k,n,r=a.onSeries;k=r&&e.get(r);var a=a.onKey||\"y\",r=k&&k.options.step,f=k&&k.points,h=f&&f.length,x=this.xAxis,q=this.yAxis,b=x.getExtremes(),m=0,E,H,t;if(k&&k.visible&&h)for(m=(k.pointXOffset||0)+(k.barW||0)/\n2,k=k.currentDataGrouping,H=f[h-1].x+(k?k.totalRange:0),J(c,function(a,b){return a.x-b.x}),a=\"plot\"+a[0].toUpperCase()+a.substr(1);h--&&c[g]&&!(k=c[g],E=f[h],E.x<=k.x&&void 0!==E[a]&&(k.x<=H&&(k.plotY=E[a],E.x<k.x&&!r&&(t=f[h+1])&&void 0!==t[a]&&(k.plotY+=(k.x-E.x)/(t.x-E.x)*(t[a]-E[a]))),g--,h++,0>g)););p(c,function(a,f){var l;void 0===a.plotY&&(a.x>=b.min&&a.x<=b.max?a.plotY=e.chartHeight-x.bottom-(x.opposite?x.height:0)+x.offset-q.top:a.shapeArgs={});a.plotX+=m;(n=c[f-1])&&n.plotX===a.plotX&&(void 0===\nn.stackIndex&&(n.stackIndex=0),l=n.stackIndex+1);a.stackIndex=l})},drawPoints:function(){var d=this.points,e=this.chart,c=e.renderer,g,k,n=this.options,p=n.y,f,h,x,q,b,m,E,H=this.yAxis;for(h=d.length;h--;)x=d[h],E=x.plotX>this.xAxis.len,g=x.plotX,q=x.stackIndex,f=x.options.shape||n.shape,k=x.plotY,void 0!==k&&(k=x.plotY+p-(void 0!==q&&q*n.stackDistance)),b=q?void 0:x.plotX,m=q?void 0:x.plotY,q=x.graphic,void 0!==k&&0<=g&&!E?(q||(q=x.graphic=c.label(\"\",null,null,f,null,null,n.useHTML).attr(this.pointAttribs(x)).css(A(n.style,\nx.style)).attr({align:\"flag\"===f?\"left\":\"center\",width:n.width,height:n.height,\"text-align\":n.textAlign}).addClass(\"highcharts-point\").add(this.markerGroup),x.graphic.div&&(x.graphic.div.point=x),q.shadow(n.shadow)),0<g&&(g-=q.strokeWidth()%2),q.attr({text:x.options.title||n.title||\"A\",x:g,y:k,anchorX:b,anchorY:m}),x.tooltipPos=e.inverted?[H.len+H.pos-e.plotLeft-k,this.xAxis.len-g]:[g,k+H.pos-e.plotTop]):q&&(x.graphic=q.destroy());n.useHTML&&a.wrap(this.markerGroup,\"on\",function(b){return a.SVGElement.prototype.on.apply(b.apply(this,\n[].slice.call(arguments,1)),[].slice.call(arguments,1))})},drawTracker:function(){var a=this.points;C.drawTrackerPoint.apply(this);p(a,function(d){var c=d.graphic;c&&G(c.element,\"mouseover\",function(){0<d.stackIndex&&!d.raised&&(d._y=c.y,c.attr({y:d._y-8}),d.raised=!0);p(a,function(a){a!==d&&a.raised&&a.graphic&&(a.graphic.attr({y:a._y}),a.raised=!1)})})})},animate:D,buildKDTree:D,setClip:D});r.flag=function(a,e,c,g,k){return[\"M\",k&&k.anchorX||a,k&&k.anchorY||e,\"L\",a,e+g,a,e,a+c,e,a+c,e+g,a,e+g,\"Z\"]};\np([\"circle\",\"square\"],function(a){r[a+\"pin\"]=function(d,c,g,k,n){var e=n&&n.anchorX;n=n&&n.anchorY;\"circle\"===a&&k>g&&(d-=Math.round((k-g)/2),g=k);d=r[a](d,c,g,k);e&&n&&d.push(\"M\",e,c>n?c:c+k,\"L\",e,n);return d}});F===w&&p([\"flag\",\"circlepin\",\"squarepin\"],function(a){w.prototype.symbols[a]=r[a]})})(K);(function(a){function G(a,h,c){this.init(a,h,c)}var p=a.addEvent,A=a.Axis,D=a.correctFloat,F=a.defaultOptions,y=a.defined,I=a.destroyObjectProperties,C=a.doc,w=a.each,r=a.fireEvent,J=a.hasTouch,d=a.isTouchDevice,\ne=a.merge,c=a.pick,g=a.removeEvent,k=a.wrap,n,u={height:d?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!d,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:\"#cccccc\",barBorderWidth:1,barBorderColor:\"#cccccc\",buttonArrowColor:\"#333333\",buttonBackgroundColor:\"#e6e6e6\",buttonBorderColor:\"#cccccc\",buttonBorderWidth:1,rifleColor:\"#333333\",trackBackgroundColor:\"#f2f2f2\",trackBorderColor:\"#f2f2f2\",trackBorderWidth:1};F.scrollbar=e(!0,u,F.scrollbar);a.swapXY=n=function(a,h){var f=\na.length,c;if(h)for(h=0;h<f;h+=3)c=a[h+1],a[h+1]=a[h+2],a[h+2]=c;return a};G.prototype={init:function(a,h,d){this.scrollbarButtons=[];this.renderer=a;this.userOptions=h;this.options=e(u,h);this.chart=d;this.size=c(this.options.size,this.options.height);h.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,h=this.options,c=this.size,d;this.group=d=a.g(\"scrollbar\").attr({zIndex:h.zIndex,translateY:-99999}).add();this.track=a.rect().addClass(\"highcharts-scrollbar-track\").attr({x:0,\nr:h.trackBorderRadius||0,height:c,width:c}).add(d);this.track.attr({fill:h.trackBackgroundColor,stroke:h.trackBorderColor,\"stroke-width\":h.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(d);this.scrollbar=a.rect().addClass(\"highcharts-scrollbar-thumb\").attr({height:c,width:c,r:h.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(n([\"M\",-3,c/4,\"L\",-3,2*c/3,\"M\",0,c/4,\"L\",0,2*c/3,\"M\",\n3,c/4,\"L\",3,2*c/3],h.vertical)).addClass(\"highcharts-scrollbar-rifles\").add(this.scrollbarGroup);this.scrollbar.attr({fill:h.barBackgroundColor,stroke:h.barBorderColor,\"stroke-width\":h.barBorderWidth});this.scrollbarRifles.attr({stroke:h.rifleColor,\"stroke-width\":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a,c,d,e){var b=\nthis.options.vertical,f=0,h=this.rendered?\"animate\":\"attr\";this.x=a;this.y=c+this.trackBorderWidth;this.width=d;this.xOffset=this.height=e;this.yOffset=f;b?(this.width=this.yOffset=d=f=this.size,this.xOffset=c=0,this.barWidth=e-2*d,this.x=a+=this.options.margin):(this.height=this.xOffset=e=c=this.size,this.barWidth=d-2*e,this.y+=this.options.margin);this.group[h]({translateX:a,translateY:this.y});this.track[h]({width:d,height:e});this.scrollbarButtons[1][h]({translateX:b?0:d-c,translateY:b?e-f:0})},\ndrawScrollbarButton:function(a){var f=this.renderer,c=this.scrollbarButtons,d=this.options,b=this.size,m;m=f.g().add(this.group);c.push(m);m=f.rect().addClass(\"highcharts-scrollbar-button\").add(m);m.attr({stroke:d.buttonBorderColor,\"stroke-width\":d.buttonBorderWidth,fill:d.buttonBackgroundColor});m.attr(m.crisp({x:-.5,y:-.5,width:b+1,height:b+1,r:d.buttonBorderRadius},m.strokeWidth()));m=f.path(n([\"M\",b/2+(a?-1:1),b/2-3,\"L\",b/2+(a?-1:1),b/2+3,\"L\",b/2+(a?2:-2),b/2],d.vertical)).addClass(\"highcharts-scrollbar-arrow\").add(c[a]);\nm.attr({fill:d.buttonArrowColor})},setRange:function(a,c){var f=this.options,h=f.vertical,b=f.minWidth,d=this.barWidth,e,g,t=this.rendered&&!this.hasDragged?\"animate\":\"attr\";y(d)&&(a=Math.max(a,0),e=Math.ceil(d*a),this.calculatedWidth=g=D(d*Math.min(c,1)-e),g<b&&(e=(d-b+g)*a,g=b),b=Math.floor(e+this.xOffset+this.yOffset),d=g/2-.5,this.from=a,this.to=c,h?(this.scrollbarGroup[t]({translateY:b}),this.scrollbar[t]({height:g}),this.scrollbarRifles[t]({translateY:d}),this.scrollbarTop=b,this.scrollbarLeft=\n0):(this.scrollbarGroup[t]({translateX:b}),this.scrollbar[t]({width:g}),this.scrollbarRifles[t]({translateX:d}),this.scrollbarLeft=b,this.scrollbarTop=0),12>=g?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===f.showFull&&(0>=a&&1<=c?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(c){var d=a.chart.pointer.normalize(c),h=a.options.vertical?\"chartY\":\"chartX\",b=a.initPositions;!a.grabbedCenter||c.touches&&0===c.touches[0][h]||\n(d=a.cursorToScrollbarPosition(d)[h],h=a[h],h=d-h,a.hasDragged=!0,a.updatePosition(b[0]+h,b[1]+h),a.hasDragged&&r(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMType:c.type,DOMEvent:c}))};a.mouseUpHandler=function(c){a.hasDragged&&r(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMType:c.type,DOMEvent:c});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(c){c=a.chart.pointer.normalize(c);c=a.cursorToScrollbarPosition(c);a.chartX=c.chartX;a.chartY=c.chartY;\na.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(c){var d=D(a.to-a.from)*a.options.step;a.updatePosition(D(a.from-d),D(a.to-d));r(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:c})};a.buttonToMaxClick=function(c){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);r(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:c})};a.trackClick=function(c){var d=a.chart.pointer.normalize(c),f=a.to-a.from,b=a.y+a.scrollbarTop,h=a.x+a.scrollbarLeft;\na.options.vertical&&d.chartY>b||!a.options.vertical&&d.chartX>h?a.updatePosition(a.from+f,a.to+f):a.updatePosition(a.from-f,a.to-f);r(a,\"changed\",{from:a.from,to:a.to,trigger:\"scrollbar\",DOMEvent:c})}},cursorToScrollbarPosition:function(a){var c=this.options,c=c.minWidth>this.calculatedWidth?c.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-c),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-c)}},updatePosition:function(a,c){1<c&&(a=D(1-D(c-a)),c=1);0>a&&(c=D(c-a),a=0);\nthis.from=a;this.to=c},update:function(a){this.destroy();this.init(this.chart.renderer,e(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],c=this.scrollbarButtons,d=this.scrollbarGroup.element,e=this.mouseDownHandler,b=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[c[a[0]].element,\"click\",this.buttonToMinClick],[c[a[1]].element,\"click\",this.buttonToMaxClick],[this.track.element,\"click\",this.trackClick],[d,\"mousedown\",e],[C,\"mousemove\",b],[C,\"mouseup\",g]];\nJ&&a.push([d,\"touchstart\",e],[C,\"touchmove\",b],[C,\"touchend\",g]);w(a,function(a){p.apply(null,a)});this._events=a},removeEvents:function(){w(this._events,function(a){g.apply(null,a)});this._events.length=0},destroy:function(){var a=this.chart.scroller;this.removeEvents();w([\"track\",\"scrollbarRifles\",\"scrollbar\",\"scrollbarGroup\",\"group\"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&this===a.scrollbar&&(a.scrollbar=null,I(a.scrollbarButtons))}};k(A.prototype,\"init\",function(a){var d=\nthis;a.apply(d,Array.prototype.slice.call(arguments,1));d.options.scrollbar&&d.options.scrollbar.enabled&&(d.options.scrollbar.vertical=!d.horiz,d.options.startOnTick=d.options.endOnTick=!1,d.scrollbar=new G(d.chart.renderer,d.options.scrollbar,d.chart),p(d.scrollbar,\"changed\",function(a){var e=Math.min(c(d.options.min,d.min),d.min,d.dataMin),b=Math.max(c(d.options.max,d.max),d.max,d.dataMax)-e,f;d.horiz&&!d.reversed||!d.horiz&&d.reversed?(f=e+b*this.to,e+=b*this.from):(f=e+b*(1-this.from),e+=b*(1-\nthis.to));d.setExtremes(e,f,!0,!1,a)}))});k(A.prototype,\"render\",function(a){var d=Math.min(c(this.options.min,this.min),this.min,this.dataMin),e=Math.max(c(this.options.max,this.max),this.max,this.dataMax),f=this.scrollbar,b=this.titleOffset||0;a.apply(this,Array.prototype.slice.call(arguments,1));if(f){this.horiz?(f.position(this.left,this.top+this.height+2+this.chart.scrollbarsOffsets[1]+(this.opposite?0:b+this.axisTitleMargin+this.offset),this.width,this.height),b=1):(f.position(this.left+this.width+\n2+this.chart.scrollbarsOffsets[0]+(this.opposite?b+this.axisTitleMargin+this.offset:0),this.top,this.width,this.height),b=0);if(!this.opposite&&!this.horiz||this.opposite&&this.horiz)this.chart.scrollbarsOffsets[b]+=this.scrollbar.size+this.scrollbar.options.margin;isNaN(d)||isNaN(e)||!y(this.min)||!y(this.max)?f.setRange(0,0):(b=(this.min-d)/(e-d),d=(this.max-d)/(e-d),this.horiz&&!this.reversed||!this.horiz&&this.reversed?f.setRange(b,d):f.setRange(1-d,1-b))}});k(A.prototype,\"getOffset\",function(a){var c=\nthis.horiz?2:1,d=this.scrollbar;a.apply(this,Array.prototype.slice.call(arguments,1));d&&(this.chart.scrollbarsOffsets=[0,0],this.chart.axisOffset[c]+=d.size+d.options.margin)});k(A.prototype,\"destroy\",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy());a.apply(this,Array.prototype.slice.call(arguments,1))});a.Scrollbar=G})(K);(function(a){function G(a){this.init(a)}var p=a.addEvent,A=a.Axis,D=a.Chart,F=a.color,y=a.defaultOptions,I=a.defined,C=a.destroyObjectProperties,w=a.doc,r=\na.each,J=a.erase,d=a.error,e=a.extend,c=a.grep,g=a.hasTouch,k=a.isNumber,n=a.isObject,u=a.merge,f=a.pick,h=a.removeEvent,x=a.Scrollbar,q=a.Series,b=a.seriesTypes,m=a.wrap,E=a.swapXY,H=[].concat(a.defaultDataGroupingUnits),t=function(a){var l=c(arguments,k);if(l.length)return Math[a].apply(0,l)};H[4]=[\"day\",[1,2,3,4]];H[5]=[\"week\",[1,2,3]];b=void 0===b.areaspline?\"line\":\"areaspline\";e(y,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:\"#f2f2f2\",borderColor:\"#999999\"},maskFill:F(\"#6685c2\").setOpacity(.3).get(),\noutlineColor:\"#cccccc\",outlineWidth:1,series:{type:b,color:\"#335cad\",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:\"average\",enabled:!0,groupPixelWidth:2,smoothed:!0,units:H},dataLabels:{enabled:!1,zIndex:2},id:\"highcharts-navigator-series\",className:\"highcharts-navigator-series\",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:\"highcharts-navigator-xaxis\",tickLength:0,lineWidth:0,gridLineColor:\"#e6e6e6\",gridLineWidth:1,tickPixelInterval:200,\nlabels:{align:\"left\",style:{color:\"#999999\"},x:3,y:-4},crosshair:!1},yAxis:{className:\"highcharts-navigator-yaxis\",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}});G.prototype={drawHandle:function(a,b,c,d){this.handles[b][d](c?{translateX:Math.round(this.left+this.height/2-8),translateY:Math.round(this.top+parseInt(a,10)+.5)}:{translateX:Math.round(this.left+parseInt(a,10)),translateY:Math.round(this.top+\nthis.height/2-8)})},getHandlePath:function(a){return E([\"M\",-4.5,.5,\"L\",3.5,.5,\"L\",3.5,15.5,\"L\",-4.5,15.5,\"L\",-4.5,.5,\"M\",-1.5,4,\"L\",-1.5,12,\"M\",.5,4,\"L\",.5,12],a)},drawOutline:function(a,b,c,d){var l=this.navigatorOptions.maskInside,v=this.outline.strokeWidth(),z=v/2,v=v%2/2,e=this.outlineHeight,f=this.scrollbarHeight,g=this.size,t=this.left-f,m=this.top;c?(t-=z,c=m+b+v,b=m+a+v,a=[\"M\",t+e,m-f-v,\"L\",t+e,c,\"L\",t,c,\"L\",t,b,\"L\",t+e,b,\"L\",t+e,m+g+f].concat(l?[\"M\",t+e,c-z,\"L\",t+e,b+z]:[])):(a+=t+f-v,b+=\nt+f-v,m+=z,a=[\"M\",t,m,\"L\",a,m,\"L\",a,m+e,\"L\",b,m+e,\"L\",b,m,\"L\",t+g+2*f,m].concat(l?[\"M\",a-z,m,\"L\",b+z,m]:[]));this.outline[d]({d:a})},drawMasks:function(a,b,c,d){var l=this.left,v=this.top,z=this.height,e,f,t,m;c?(t=[l,l,l],m=[v,v+a,v+b],f=[z,z,z],e=[a,b-a,this.size-b]):(t=[l,l+a,l+b],m=[v,v,v],f=[a,b-a,this.size-b],e=[z,z,z]);r(this.shades,function(a,l){a[d]({x:t[l],y:m[l],width:f[l],height:e[l]})})},renderElements:function(){var a=this,b=a.navigatorOptions,c=b.maskInside,d=a.chart,e=d.inverted,f=\nd.renderer,t;a.navigatorGroup=t=f.g(\"navigator\").attr({zIndex:8,visibility:\"hidden\"}).add();var m={cursor:e?\"ns-resize\":\"ew-resize\"};r([!c,c,!c],function(l,c){a.shades[c]=f.rect().addClass(\"highcharts-navigator-mask\"+(1===c?\"-inside\":\"-outside\")).attr({fill:l?b.maskFill:\"rgba(0,0,0,0)\"}).css(1===c&&m).add(t)});a.outline=f.path().addClass(\"highcharts-navigator-outline\").attr({\"stroke-width\":b.outlineWidth,stroke:b.outlineColor}).add(t);r([0,1],function(l){a.handles[l]=f.path(a.getHandlePath(e)).attr({zIndex:7-\nl}).addClass(\"highcharts-navigator-handle highcharts-navigator-handle-\"+[\"left\",\"right\"][l]).add(t);var c=b.handles;a.handles[l].attr({fill:c.backgroundColor,stroke:c.borderColor,\"stroke-width\":1}).css(m)})},update:function(a){this.destroy();u(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var l=this.chart,v,e,z=this.scrollbarHeight,t,m=this.xAxis;v=m.fake?l.xAxis[0]:m;var g=this.navigatorEnabled,h,L=this.rendered;e=l.inverted;var E=l.xAxis[0].minRange;\nif(!this.hasDragged||I(c)){if(!k(a)||!k(b))if(L)c=0,d=m.width;else return;this.left=f(m.left,l.plotLeft+z+(e?l.plotWidth:0));this.size=h=t=f(m.len,(e?l.plotHeight:l.plotWidth)-2*z);l=e?z:t+2*z;c=f(c,m.toPixels(a,!0));d=f(d,m.toPixels(b,!0));k(c)&&Infinity!==Math.abs(c)||(c=0,d=l);a=m.toValue(c,!0);b=m.toValue(d,!0);if(Math.abs(b-a)<E)if(this.grabbedLeft)c=m.toPixels(b-E,!0);else if(this.grabbedRight)d=m.toPixels(a+E,!0);else return;this.zoomedMax=Math.min(Math.max(c,d,0),h);this.zoomedMin=Math.min(Math.max(this.fixedWidth?\nthis.zoomedMax-this.fixedWidth:Math.min(c,d),0),h);this.range=this.zoomedMax-this.zoomedMin;h=Math.round(this.zoomedMax);c=Math.round(this.zoomedMin);g&&(this.navigatorGroup.attr({visibility:\"visible\"}),L=L&&!this.hasDragged?\"animate\":\"attr\",this.drawMasks(c,h,e,L),this.drawOutline(c,h,e,L),this.drawHandle(c,0,e,L),this.drawHandle(h,1,e,L));this.scrollbar&&(e?(e=this.top-z,v=this.left-z+(g||!v.opposite?0:(v.titleOffset||0)+v.axisTitleMargin),z=t+2*z):(e=this.top+(g?this.height:-z),v=this.left-z),\nthis.scrollbar.position(v,e,l,z),this.scrollbar.setRange(this.zoomedMin/t,this.zoomedMax/t));this.rendered=!0}},addMouseEvents:function(){var a=this,b=a.chart,c=b.container,d=[],e,f;a.mouseMoveHandler=e=function(b){a.onMouseMove(b)};a.mouseUpHandler=f=function(b){a.onMouseUp(b)};d=a.getPartsEvents(\"mousedown\");d.push(p(c,\"mousemove\",e),p(w,\"mouseup\",f));g&&(d.push(p(c,\"touchmove\",e),p(w,\"touchend\",f)),d.concat(a.getPartsEvents(\"touchstart\")));a.eventsToUnbind=d;a.series&&a.series[0]&&d.push(p(a.series[0].xAxis,\n\"foundExtremes\",function(){b.navigator.modifyNavigatorAxisExtremes()}))},getPartsEvents:function(a){var b=this,l=[];r([\"shades\",\"handles\"],function(c){r(b[c],function(d,v){l.push(p(d.element,a,function(a){b[c+\"Mousedown\"](a,v)}))})});return l},shadesMousedown:function(a,b){a=this.chart.pointer.normalize(a);var c=this.chart,l=this.xAxis,d=this.zoomedMin,v=this.left,e=this.size,f=this.range,m=a.chartX,t;c.inverted&&(m=a.chartY,v=this.top);1===b?(this.grabbedCenter=m,this.fixedWidth=f,this.dragOffset=\nm-d):(a=m-v-f/2,0===b?a=Math.max(0,a):2===b&&a+f>=e&&(a=e-f,t=this.getUnionExtremes().dataMax),a!==d&&(this.fixedWidth=f,b=l.toFixedRange(a,a+f,null,t),c.xAxis[0].setExtremes(Math.min(b.min,b.max),Math.max(b.min,b.max),!0,null,{trigger:\"navigator\"})))},handlesMousedown:function(a,b){this.chart.pointer.normalize(a);a=this.chart;var c=a.xAxis[0],l=a.inverted&&!c.reversed||!a.inverted&&c.reversed;0===b?(this.grabbedLeft=!0,this.otherHandlePos=this.zoomedMax,this.fixedExtreme=l?c.min:c.max):(this.grabbedRight=\n!0,this.otherHandlePos=this.zoomedMin,this.fixedExtreme=l?c.max:c.min);a.fixedRange=null},onMouseMove:function(a){var b=this,c=b.chart,l=b.left,d=b.navigatorSize,e=b.range,f=b.dragOffset,m=c.inverted;a.touches&&0===a.touches[0].pageX||(a=c.pointer.normalize(a),c=a.chartX,m&&(l=b.top,c=a.chartY),b.grabbedLeft?(b.hasDragged=!0,b.render(0,0,c-l,b.otherHandlePos)):b.grabbedRight?(b.hasDragged=!0,b.render(0,0,b.otherHandlePos,c-l)):b.grabbedCenter&&(b.hasDragged=!0,c<f?c=f:c>d+f-e&&(c=d+f-e),b.render(0,\n0,c-f,c-f+e)),b.hasDragged&&b.scrollbar&&b.scrollbar.options.liveRedraw&&(a.DOMType=a.type,setTimeout(function(){b.onMouseUp(a)},0)))},onMouseUp:function(a){var b=this.chart,c=this.xAxis,l=this.scrollbar,d,e,f=a.DOMEvent||a;(!this.hasDragged||l&&l.hasDragged)&&\"scrollbar\"!==a.trigger||(this.zoomedMin===this.otherHandlePos?d=this.fixedExtreme:this.zoomedMax===this.otherHandlePos&&(e=this.fixedExtreme),this.zoomedMax===this.size&&(e=this.getUnionExtremes().dataMax),c=c.toFixedRange(this.zoomedMin,this.zoomedMax,\nd,e),I(c.min)&&b.xAxis[0].setExtremes(Math.min(c.min,c.max),Math.max(c.min,c.max),!0,this.hasDragged?!1:null,{trigger:\"navigator\",triggerOp:\"navigator-drag\",DOMEvent:f}));\"mousemove\"!==a.DOMType&&(this.grabbedLeft=this.grabbedRight=this.grabbedCenter=this.fixedWidth=this.fixedExtreme=this.otherHandlePos=this.hasDragged=this.dragOffset=null)},removeEvents:function(){this.eventsToUnbind&&(r(this.eventsToUnbind,function(a){a()}),this.eventsToUnbind=void 0);this.removeBaseSeriesEvents()},removeBaseSeriesEvents:function(){var a=\nthis.baseSeries||[];this.navigatorEnabled&&a[0]&&!1!==this.navigatorOptions.adaptToUpdatedData&&(r(a,function(a){h(a,\"updatedData\",this.updatedDataHandler)},this),a[0].xAxis&&h(a[0].xAxis,\"foundExtremes\",this.modifyBaseAxisExtremes))},init:function(a){var b=a.options,c=b.navigator,d=c.enabled,l=b.scrollbar,e=l.enabled,b=d?c.height:0,g=e?l.height:0;this.handles=[];this.shades=[];this.chart=a;this.setBaseSeries();this.height=b;this.scrollbarHeight=g;this.scrollbarEnabled=e;this.navigatorEnabled=d;this.navigatorOptions=\nc;this.scrollbarOptions=l;this.outlineHeight=b+g;this.opposite=f(c.opposite,!d&&a.inverted);var h=this,l=h.baseSeries,e=a.xAxis.length,k=a.yAxis.length,E=l&&l[0]&&l[0].xAxis||a.xAxis[0];a.extraMargin={type:h.opposite?\"plotTop\":\"marginBottom\",value:(d||!a.inverted?h.outlineHeight:0)+c.margin};a.inverted&&(a.extraMargin.type=h.opposite?\"marginRight\":\"plotLeft\");a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=new A(a,u({breaks:E.options.breaks,ordinal:E.options.ordinal},c.xAxis,{id:\"navigator-x-axis\",yAxis:\"navigator-y-axis\",\nisX:!0,type:\"datetime\",index:e,offset:0,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1},a.inverted?{offsets:[g,0,-g,0],width:b}:{offsets:[0,-g,0,g],height:b})),h.yAxis=new A(a,u(c.yAxis,{id:\"navigator-y-axis\",alignTicks:!1,offset:0,index:k,zoomEnabled:!1},a.inverted?{width:b}:{height:b})),l||c.series.data?h.addBaseSeries():0===a.series.length&&m(a,\"redraw\",function(b,c){0<a.series.length&&!h.series&&(h.setBaseSeries(),a.redraw=b);b.call(a,c)}),h.renderElements(),\nh.addMouseEvents()):h.xAxis={translate:function(b,c){var d=a.xAxis[0],l=d.getExtremes(),e=d.len-2*g,v=t(\"min\",d.options.min,l.dataMin),d=t(\"max\",d.options.max,l.dataMax)-v;return c?b*d/e+v:e*(b-v)/d},toPixels:function(a){return this.translate(a)},toValue:function(a){return this.translate(a,!0)},toFixedRange:A.prototype.toFixedRange,fake:!0};a.options.scrollbar.enabled&&(a.scrollbar=h.scrollbar=new x(a.renderer,u(a.options.scrollbar,{margin:h.navigatorEnabled?0:10,vertical:a.inverted}),a),p(h.scrollbar,\n\"changed\",function(b){var c=h.size,d=c*this.to,c=c*this.from;h.hasDragged=h.scrollbar.hasDragged;h.render(0,0,c,d);(a.options.scrollbar.liveRedraw||\"mousemove\"!==b.DOMType)&&setTimeout(function(){h.onMouseUp(b)})}));h.addBaseSeriesEvents();h.addChartEvents()},getUnionExtremes:function(a){var b=this.chart.xAxis[0],c=this.xAxis,d=c.options,l=b.options,e;a&&null===b.dataMin||(e={dataMin:f(d&&d.min,t(\"min\",l.min,b.dataMin,c.dataMin,c.min)),dataMax:f(d&&d.max,t(\"max\",l.max,b.dataMax,c.dataMax,c.max))});\nreturn e},setBaseSeries:function(a){var b=this.chart,c;a=a||b.options&&b.options.navigator.baseSeries||0;this.series&&(this.removeBaseSeriesEvents(),r(this.series,function(a){a.destroy()}));c=this.baseSeries=[];r(b.series||[],function(b,d){(b.options.showInNavigator||(d===a||b.options.id===a)&&!1!==b.options.showInNavigator)&&c.push(b)});this.xAxis&&!this.xAxis.fake&&this.addBaseSeries()},addBaseSeries:function(){var a=this,b=a.chart,c=a.series=[],d=a.baseSeries,e,f,m=a.navigatorOptions.series,t,\ng={enableMouseTracking:!1,index:null,group:\"nav\",padXAxis:!1,xAxis:\"navigator-x-axis\",yAxis:\"navigator-y-axis\",showInLegend:!1,stacking:!1,isInternal:!0,visible:!0};d?r(d,function(d,l){g.name=\"Navigator \"+(l+1);e=d.options||{};t=e.navigatorOptions||{};f=u(e,g,m,t);l=t.data||m.data;a.hasNavigatorData=a.hasNavigatorData||!!l;f.data=l||e.data&&e.data.slice(0);d.navigatorSeries=b.initSeries(f);c.push(d.navigatorSeries)}):(f=u(m,g),f.data=m.data,a.hasNavigatorData=!!f.data,c.push(b.initSeries(f)));this.addBaseSeriesEvents()},\naddBaseSeriesEvents:function(){var a=this,b=a.baseSeries||[];b[0]&&b[0].xAxis&&p(b[0].xAxis,\"foundExtremes\",this.modifyBaseAxisExtremes);!1!==this.navigatorOptions.adaptToUpdatedData&&r(b,function(b){b.xAxis&&p(b,\"updatedData\",this.updatedDataHandler);p(b,\"remove\",function(){this.navigatorSeries&&(J(a.series,this.navigatorSeries),this.navigatorSeries.remove(!1),delete this.navigatorSeries)})},this)},modifyNavigatorAxisExtremes:function(){var a=this.xAxis,b;a.getExtremes&&(!(b=this.getUnionExtremes(!0))||\nb.dataMin===a.min&&b.dataMax===a.max||(a.min=b.dataMin,a.max=b.dataMax))},modifyBaseAxisExtremes:function(){var a=this.chart.navigator,b=this.getExtremes(),c=b.dataMin,d=b.dataMax,b=b.max-b.min,e=a.stickToMin,f=a.stickToMax,m,t,g=a.series&&a.series[0],h=!!this.setExtremes;this.eventArgs&&\"rangeSelectorButton\"===this.eventArgs.trigger||(e&&(t=c,m=t+b),f&&(m=d,e||(t=Math.max(m-b,g&&g.xData?g.xData[0]:-Number.MAX_VALUE))),h&&(e||f)&&k(t)&&(this.min=this.userMin=t,this.max=this.userMax=m));a.stickToMin=\na.stickToMax=null},updatedDataHandler:function(){var a=this.chart.navigator,b=this.navigatorSeries;a.stickToMin=k(this.xAxis.min)&&this.xAxis.min<=this.xData[0];a.stickToMax=Math.round(a.zoomedMax)>=Math.round(a.size);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},addChartEvents:function(){p(this.chart,\"redraw\",function(){var a=this.navigator,b=a&&(a.baseSeries&&a.baseSeries[0]&&a.baseSeries[0].xAxis||a.scrollbar&&this.xAxis[0]);b&&a.render(b.min,\nb.max)})},destroy:function(){this.removeEvents();this.xAxis&&(J(this.chart.xAxis,this.xAxis),J(this.chart.axes,this.xAxis));this.yAxis&&(J(this.chart.yAxis,this.yAxis),J(this.chart.axes,this.yAxis));r(this.series||[],function(a){a.destroy&&a.destroy()});r(\"series xAxis yAxis shades outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered\".split(\" \"),function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);r([this.handles],function(a){C(a)},this)}};\na.Navigator=G;m(A.prototype,\"zoom\",function(a,b,c){var d=this.chart,e=d.options,l=e.chart.zoomType,f=e.navigator,e=e.rangeSelector,m;this.isXAxis&&(f&&f.enabled||e&&e.enabled)&&(\"x\"===l?d.resetZoomButton=\"blocked\":\"y\"===l?m=!1:\"xy\"===l&&(d=this.previousZoom,I(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!==m?m:a.call(this,b,c)});m(D.prototype,\"init\",function(a,b,c){p(this,\"beforeRender\",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=\nthis.navigator=new G(this)});a.call(this,b,c)});m(D.prototype,\"setChartSize\",function(a){var b=this.legend,c=this.navigator,d,e,l,m;a.apply(this,[].slice.call(arguments,1));c&&(e=b.options,l=c.xAxis,m=c.yAxis,d=c.scrollbarHeight,this.inverted?(c.left=c.opposite?this.chartWidth-d-c.height:this.spacing[3]+d,c.top=this.plotTop+d):(c.left=this.plotLeft+d,c.top=c.navigatorOptions.top||this.chartHeight-c.height-d-this.spacing[2]-(\"bottom\"===e.verticalAlign&&e.enabled&&!e.floating?b.legendHeight+f(e.margin,\n10):0)),l&&m&&(this.inverted?l.options.left=m.options.left=c.left:l.options.top=m.options.top=c.top,l.setAxisSize(),m.setAxisSize()))});m(q.prototype,\"addPoint\",function(a,b,c,e,f){var l=this.options.turboThreshold;l&&this.xData.length>l&&n(b,!0)&&this.chart.navigator&&d(20,!0);a.call(this,b,c,e,f)});m(D.prototype,\"addSeries\",function(a,b,c,d){a=a.call(this,b,!1,d);this.navigator&&this.navigator.setBaseSeries();f(c,!0)&&this.redraw();return a});m(q.prototype,\"update\",function(a,b,c){a.call(this,b,\n!1);this.chart.navigator&&this.chart.navigator.setBaseSeries();f(c,!0)&&this.chart.redraw()});D.prototype.callbacks.push(function(a){var b=a.navigator;b&&(a=a.xAxis[0].getExtremes(),b.render(a.min,a.max))})})(K);(function(a){function G(a){this.init(a)}var p=a.addEvent,A=a.Axis,D=a.Chart,F=a.css,y=a.createElement,I=a.dateFormat,C=a.defaultOptions,w=C.global.useUTC,r=a.defined,J=a.destroyObjectProperties,d=a.discardElement,e=a.each,c=a.extend,g=a.fireEvent,k=a.Date,n=a.isNumber,u=a.merge,f=a.pick,h=\na.pInt,x=a.splat,q=a.wrap;c(C,{rangeSelector:{buttonTheme:{\"stroke-width\":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:\"right\"},labelStyle:{color:\"#666666\"}}});C.lang=u(C.lang,{rangeSelectorZoom:\"Zoom\",rangeSelectorFrom:\"From\",rangeSelectorTo:\"To\"});G.prototype={clickButton:function(a,c){var b=this,d=b.chart,m=b.buttonOptions[a],l=d.xAxis[0],g=d.scroller&&d.scroller.getUnionExtremes()||l||{},h=g.dataMin,k=g.dataMax,r,B=l&&Math.round(Math.min(l.max,f(k,l.max))),q=m.type,\nu,g=m._range,y,C,D,M=m.dataGrouping;if(null!==h&&null!==k){d.fixedRange=g;M&&(this.forcedDataGrouping=!0,A.prototype.setDataGrouping.call(l||{chart:this.chart},M,!1));if(\"month\"===q||\"year\"===q)l?(q={range:m,max:B,dataMin:h,dataMax:k},r=l.minFromRange.call(q),n(q.newMax)&&(B=q.newMax)):g=m;else if(g)r=Math.max(B-g,h),B=Math.min(r+g,k);else if(\"ytd\"===q)if(l)void 0===k&&(h=Number.MAX_VALUE,k=Number.MIN_VALUE,e(d.series,function(a){a=a.xData;h=Math.min(a[0],h);k=Math.max(a[a.length-1],k)}),c=!1),B=\nb.getYTDExtremes(k,h,w),r=y=B.min,B=B.max;else{p(d,\"beforeRender\",function(){b.clickButton(a)});return}else\"all\"===q&&l&&(r=h,B=k);b.setSelected(a);l?l.setExtremes(r,B,f(c,1),null,{trigger:\"rangeSelectorButton\",rangeSelectorButton:m}):(u=x(d.options.xAxis)[0],D=u.range,u.range=g,C=u.min,u.min=y,p(d,\"load\",function(){u.range=D;u.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:\"month\",count:1,text:\"1m\"},{type:\"month\",count:3,text:\"3m\"},{type:\"month\",count:6,\ntext:\"6m\"},{type:\"ytd\",text:\"YTD\"},{type:\"year\",count:1,text:\"1y\"},{type:\"all\",text:\"All\"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons||[].concat(b.defaultButtons),f=c.selected,l=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&g(a,\"blur\");c&&c.blur&&g(c,\"blur\")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=p(a.container,\"mousedown\",l);this.unResize=p(a,\"resize\",l);e(d,b.computeButtonRange);void 0!==f&&d[f]&&this.clickButton(f,\n!1);p(a,\"load\",function(){p(a.xAxis[0],\"setExtremes\",function(c){this.max-this.min!==a.fixedRange&&\"rangeSelectorButton\"!==c.trigger&&\"updatedData\"!==c.trigger&&b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,c=a.xAxis[0],d=Math.round(c.max-c.min),f=!c.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||c,g=a.dataMin,l=a.dataMax,a=this.getYTDExtremes(l,g,w),h=a.min,k=a.max,r=this.selected,p=n(r),B=this.options.allButtonsEnabled,q=this.buttons;\ne(this.buttonOptions,function(a,b){var e=a._range,m=a.type,t=a.count||1;a=q[b];var v=0;b=b===r;var E=e>l-g,n=e<c.minRange,z=!1,H=!1,e=e===d;(\"month\"===m||\"year\"===m)&&d>=864E5*{month:28,year:365}[m]*t&&d<=864E5*{month:31,year:366}[m]*t?e=!0:\"ytd\"===m?(e=k-h===d,z=!b):\"all\"===m&&(e=c.max-c.min>=l-g,H=!b&&p&&e);m=!B&&(E||n||H||f);e=b&&e||e&&!p&&!z;m?v=3:e&&(p=!0,v=2);a.state!==v&&a.setState(v)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,\nday:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if(\"month\"===b||\"year\"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,c){var b=this.chart.options.rangeSelector,d=this[a+\"Input\"];r(c)&&(d.previousValue=d.HCTime,d.HCTime=c);d.value=I(b.inputEditDateFormat||\"%Y-%m-%d\",d.HCTime);this[a+\"DateBox\"].attr({text:I(b.inputDateFormat||\"%b %e, %Y\",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+\"DateBox\"];F(this[a+\"Input\"],{left:b.translateX+c.x+\"px\",top:b.translateY+\n\"px\",width:c.width-2+\"px\",height:c.height-2+\"px\",border:\"2px solid silver\"})},hideInput:function(a){F(this[a+\"Input\"],{border:0,width:\"1px\",height:\"1px\"});this.setInputValue(a)},drawInput:function(a){function b(){var a=p.value,b=(g.inputDateParser||Date.parse)(a),c=e.xAxis[0],f=e.scroller&&e.scroller.xAxis?e.scroller.xAxis:c,l=f.dataMin,f=f.dataMax;b!==p.previousValue&&(p.previousValue=b,n(b)||(b=a.split(\"-\"),b=Date.UTC(h(b[0]),h(b[1])-1,h(b[2]))),n(b)&&(w||(b+=6E4*(new Date).getTimezoneOffset()),\nr?b>d.maxInput.HCTime?b=void 0:b<l&&(b=l):b<d.minInput.HCTime?b=void 0:b>f&&(b=f),void 0!==b&&c.setExtremes(r?b:c.min,r?c.max:b,void 0,void 0,{trigger:\"rangeSelectorInput\"})))}var d=this,e=d.chart,f=e.renderer.style||{},l=e.renderer,g=e.options.rangeSelector,k=d.div,r=\"min\"===a,p,B,q=this.inputGroup;this[a+\"Label\"]=B=l.label(C.lang[r?\"rangeSelectorFrom\":\"rangeSelectorTo\"],this.inputGroup.offset).addClass(\"highcharts-range-label\").attr({padding:2}).add(q);q.offset+=B.width+5;this[a+\"DateBox\"]=l=l.label(\"\",\nq.offset).addClass(\"highcharts-range-input\").attr({padding:2,width:g.inputBoxWidth||90,height:g.inputBoxHeight||17,stroke:g.inputBoxBorderColor||\"#cccccc\",\"stroke-width\":1,\"text-align\":\"center\"}).on(\"click\",function(){d.showInput(a);d[a+\"Input\"].focus()}).add(q);q.offset+=l.width+(r?10:0);this[a+\"Input\"]=p=y(\"input\",{name:a,className:\"highcharts-range-selector\",type:\"text\"},{top:e.plotTop+\"px\"},k);B.css(u(f,g.labelStyle));l.css(u({color:\"#333333\"},f,g.inputStyle));F(p,c({position:\"absolute\",border:0,\nwidth:\"1px\",height:\"1px\",padding:0,textAlign:\"center\",fontSize:f.fontSize,fontFamily:f.fontFamily,left:\"-9em\"},g.inputStyle));p.onfocus=function(){d.showInput(a)};p.onblur=function(){d.hideInput(a)};p.onchange=b;p.onkeypress=function(a){13===a.keyCode&&b()}},getPosition:function(){var a=this.chart,c=a.options.rangeSelector,a=f((c.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-c.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,c,d){var b=new k(a),e=b[k.hcGetFullYear]();d=d?k.UTC(e,\n0,1):+new k(e,0,1);c=Math.max(c||0,d);b=b.getTime();return{max:Math.min(a||b,b),min:c}},render:function(a,d){var b=this,g=b.chart,m=g.renderer,l=g.container,h=g.options,k=h.exporting&&!1!==h.exporting.enabled&&h.navigation&&h.navigation.buttonOptions,n=h.rangeSelector,p=b.buttons,h=C.lang,B=b.div,B=b.inputGroup,q=n.buttonTheme,u=n.buttonPosition||{},w=n.inputEnabled,x=q&&q.states,A=g.plotLeft,D,G=this.getPosition(),F=b.group,I=b.rendered;!1!==n.enabled&&(I||(b.group=F=m.g(\"range-selector-buttons\").add(),\nb.zoomText=m.text(h.rangeSelectorZoom,f(u.x,A),15).css(n.labelStyle).add(F),D=f(u.x,A)+b.zoomText.getBBox().width+5,e(b.buttonOptions,function(a,c){p[c]=m.button(a.text,D,0,function(){b.clickButton(c);b.isActive=!0},q,x&&x.hover,x&&x.select,x&&x.disabled).attr({\"text-align\":\"center\"}).add(F);D+=p[c].width+f(n.buttonSpacing,5)}),!1!==w&&(b.div=B=y(\"div\",null,{position:\"relative\",height:0,zIndex:1}),l.parentNode.insertBefore(B,l),b.inputGroup=B=m.g(\"input-group\").add(),B.offset=0,b.drawInput(\"min\"),\nb.drawInput(\"max\"))),b.updateButtonStates(),F[I?\"animate\":\"attr\"]({translateY:G.buttonTop}),!1!==w&&(B.align(c({y:G.inputTop,width:B.offset,x:k&&G.inputTop<(k.y||0)+k.height-g.spacing[0]?-40:0},n.inputPosition),!0,g.spacingBox),r(w)||(g=F.getBBox(),B[B.alignAttr.translateX<g.x+g.width+10?\"hide\":\"show\"]()),b.setInputValue(\"min\",a),b.setInputValue(\"max\",d)),b.rendered=!0)},update:function(a){var b=this.chart;u(!0,b.options.rangeSelector,a);this.destroy();this.init(b)},destroy:function(){var b=this,\nc=b.minInput,e=b.maxInput;b.unMouseDown();b.unResize();J(b.buttons);c&&(c.onfocus=c.onblur=c.onchange=null);e&&(e.onfocus=e.onblur=e.onchange=null);a.objectEach(b,function(a,c){a&&\"chart\"!==c&&(a.destroy?a.destroy():a.nodeType&&d(this[c]));a!==G.prototype[c]&&(b[c]=null)},this)}};A.prototype.toFixedRange=function(a,c,d,e){var b=this.chart&&this.chart.fixedRange;a=f(d,this.translate(a,!0,!this.horiz));c=f(e,this.translate(c,!0,!this.horiz));d=b&&(c-a)/b;.7<d&&1.3>d&&(e?a=c-b:c=a+b);n(a)||(a=c=void 0);\nreturn{min:a,max:c}};A.prototype.minFromRange=function(){var a=this.range,c={month:\"Month\",year:\"FullYear\"}[a.type],d,e=this.max,g,l,h=function(a,b){var d=new Date(a),e=d[\"get\"+c]();d[\"set\"+c](e+b);e===d[\"get\"+c]()&&d.setDate(0);return d.getTime()-a};n(a)?(d=e-a,l=a):(d=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-d));g=f(this.dataMin,Number.MIN_VALUE);n(d)||(d=g);d<=g&&(d=g,void 0===l&&(l=h(d,a.count)),this.newMax=Math.min(d+l,this.dataMax));n(e)||(d=void 0);return d};q(D.prototype,\"init\",\nfunction(a,c,d){p(this,\"init\",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new G(this))});a.call(this,c,d)});D.prototype.callbacks.push(function(a){function c(){b=a.xAxis[0].getExtremes();n(b.min)&&d.render(b.min,b.max)}var b,d=a.rangeSelector,e,f;d&&(f=p(a.xAxis[0],\"afterSetExtremes\",function(a){d.render(a.min,a.max)}),e=p(a,\"redraw\",c),c());p(a,\"destroy\",function(){d&&(e(),f())})});a.RangeSelector=G})(K);(function(a){var G=a.arrayMax,p=a.arrayMin,A=a.Axis,D=a.Chart,F=a.defined,\ny=a.each,I=a.extend,C=a.format,w=a.grep,r=a.inArray,J=a.isNumber,d=a.isString,e=a.map,c=a.merge,g=a.pick,k=a.Point,n=a.Renderer,u=a.Series,f=a.splat,h=a.SVGRenderer,x=a.VMLRenderer,q=a.wrap,b=u.prototype,m=b.init,E=b.processData,H=k.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(b,l,h){var m=d(b)||b.nodeName,k=arguments[m?1:0],t=k.series,v=a.getOptions(),n,p=g(k.navigator&&k.navigator.enabled,v.navigator.enabled,!0),r=p?{startOnTick:!1,endOnTick:!1}:null,q={marker:{enabled:!1,radius:2}},\nu={shadow:!1,borderWidth:0};k.xAxis=e(f(k.xAxis||{}),function(a){return c({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:\"justify\"},showLastLabel:!0},v.xAxis,a,{type:\"datetime\",categories:null},r)});k.yAxis=e(f(k.yAxis||{}),function(a){n=g(a.opposite,!0);return c({labels:{y:-2},opposite:n,showLastLabel:!1,title:{text:null}},v.yAxis,a)});k.series=null;k=c({chart:{panning:!0,pinchType:\"x\"},navigator:{enabled:p},scrollbar:{enabled:g(v.scrollbar.enabled,!0)},rangeSelector:{enabled:g(v.rangeSelector.enabled,\n!0)},title:{text:null},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:q,spline:q,area:q,areaspline:q,arearange:q,areasplinerange:q,column:u,columnrange:u,candlestick:u,ohlc:u}},k,{isStock:!0});k.series=t;return m?new D(b,k,h):new D(k,l)};q(A.prototype,\"autoLabelAlign\",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options.isStock&&\"yAxis\"===this.coll&&(c=c.top+\",\"+c.height,!b[c]&&d.enabled)?(15===d.x&&\n(d.x=0),void 0===d.align&&(d.align=\"right\"),b[c]=this,\"right\"):a.call(this,[].slice.call(arguments,1))});q(A.prototype,\"destroy\",function(a){var b=this.chart,c=this.options&&this.options.top+\",\"+this.options.height;c&&b._labelPanes&&b._labelPanes[c]===this&&delete b._labelPanes[c];return a.call(this,Array.prototype.slice.call(arguments,1))});q(A.prototype,\"getPlotLinePath\",function(b,c,f,h,k,m){var l=this,t=this.isLinked&&!this.series?this.linkedParent.series:this.series,n=l.chart,v=n.renderer,p=\nl.left,q=l.top,z,u,w,x,A=[],C=[],D,E;if(\"xAxis\"!==l.coll&&\"yAxis\"!==l.coll)return b.apply(this,[].slice.call(arguments,1));C=function(a){var b=\"xAxis\"===a?\"yAxis\":\"xAxis\";a=l.options[b];return J(a)?[n[b][a]]:d(a)?[n.get(a)]:e(t,function(a){return a[b]})}(l.coll);y(l.isXAxis?n.yAxis:n.xAxis,function(a){if(F(a.options.id)?-1===a.options.id.indexOf(\"navigator\"):1){var b=a.isXAxis?\"yAxis\":\"xAxis\",b=F(a.options[b])?n[b][a.options[b]]:n[b][0];l===b&&C.push(a)}});D=C.length?[]:[l.isXAxis?n.yAxis[0]:n.xAxis[0]];\ny(C,function(b){-1!==r(b,D)||a.find(D,function(a){return a.pos===b.pos&&a.len&&b.len})||D.push(b)});E=g(m,l.translate(c,null,null,h));J(E)&&(l.horiz?y(D,function(a){var b;u=a.pos;x=u+a.len;z=w=Math.round(E+l.transB);if(z<p||z>p+l.width)k?z=w=Math.min(Math.max(p,z),p+l.width):b=!0;b||A.push(\"M\",z,u,\"L\",w,x)}):y(D,function(a){var b;z=a.pos;w=z+a.len;u=x=Math.round(q+l.height-E);if(u<q||u>q+l.height)k?u=x=Math.min(Math.max(q,u),l.top+l.height):b=!0;b||A.push(\"M\",z,u,\"L\",w,x)}));return 0<A.length?v.crispPolyLine(A,\nf||1):null});A.prototype.getPlotBandPath=function(a,b){b=this.getPlotLinePath(b,null,null,!0);a=this.getPlotLinePath(a,null,null,!0);var c=[],d;if(a&&b)if(a.toString()===b.toString())c=a,c.flat=!0;else for(d=0;d<a.length;d+=6)c.push(\"M\",a[d+1],a[d+2],\"L\",a[d+4],a[d+5],b[d+4],b[d+5],b[d+1],b[d+2],\"z\");else c=null;return c};h.prototype.crispPolyLine=function(a,b){var c;for(c=0;c<a.length;c+=6)a[c+1]===a[c+4]&&(a[c+1]=a[c+4]=Math.round(a[c+1])-b%2/2),a[c+2]===a[c+5]&&(a[c+2]=a[c+5]=Math.round(a[c+2])+\nb%2/2);return a};n===x&&(x.prototype.crispPolyLine=h.prototype.crispPolyLine);q(A.prototype,\"hideCrosshair\",function(a,b){a.call(this,b);this.crossLabel&&(this.crossLabel=this.crossLabel.hide())});q(A.prototype,\"drawCrosshair\",function(a,b,c){var d,e;a.call(this,b,c);if(F(this.crosshair.label)&&this.crosshair.label.enabled&&this.cross){a=this.chart;var f=this.options.crosshair.label,l=this.horiz;d=this.opposite;e=this.left;var h=this.top,k=this.crossLabel,m,n=f.format,p=\"\",t=\"inside\"===this.options.tickPosition,\nq=!1!==this.crosshair.snap,r=0;b||(b=this.cross&&this.cross.e);m=l?\"center\":d?\"right\"===this.labelAlign?\"right\":\"left\":\"left\"===this.labelAlign?\"left\":\"center\";k||(k=this.crossLabel=a.renderer.label(null,null,null,f.shape||\"callout\").addClass(\"highcharts-crosshair-label\"+(this.series[0]&&\" highcharts-color-\"+this.series[0].colorIndex)).attr({align:f.align||m,padding:g(f.padding,8),r:g(f.borderRadius,3),zIndex:2}).add(this.labelGroup),k.attr({fill:f.backgroundColor||this.series[0]&&this.series[0].color||\n\"#666666\",stroke:f.borderColor||\"\",\"stroke-width\":f.borderWidth||0}).css(I({color:\"#ffffff\",fontWeight:\"normal\",fontSize:\"11px\",textAlign:\"center\"},f.style)));l?(m=q?c.plotX+e:b.chartX,h+=d?0:this.height):(m=d?this.width+e:0,h=q?c.plotY+h:b.chartY);n||f.formatter||(this.isDatetimeAxis&&(p=\"%b %d, %Y\"),n=\"{value\"+(p?\":\"+p:\"\")+\"}\");b=q?c[this.isXAxis?\"x\":\"y\"]:this.toValue(l?b.chartX:b.chartY);k.attr({text:n?C(n,{value:b}):f.formatter.call(this,b),x:m,y:h,visibility:\"visible\"});b=k.getBBox();if(l){if(t&&\n!d||!t&&d)h=k.y-b.height}else h=k.y-b.height/2;l?(d=e-b.x,e=e+this.width-b.x):(d=\"left\"===this.labelAlign?e:0,e=\"right\"===this.labelAlign?e+this.width:a.chartWidth);k.translateX<d&&(r=d-k.translateX);k.translateX+b.width>=e&&(r=-(k.translateX+b.width-e));k.attr({x:m+r,y:h,anchorX:l?m:this.opposite?0:a.chartWidth,anchorY:l?this.opposite?a.chartHeight:0:h+b.height/2})}});b.init=function(){m.apply(this,arguments);this.setCompare(this.options.compare)};b.setCompare=function(a){this.modifyValue=\"value\"===\na||\"percent\"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b=\"value\"===a?b-d:b/d*100-(100===this.options.compareBase?0:100),c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};b.processData=function(){var a,b=-1,c,d,e,f;E.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=r(\"close\",this.pointArrayMap),-1===b&&(b=r(this.pointValKey||\"y\",this.pointArrayMap))),\na=0;a<e-1;a++)if(f=d[a]&&-1<b?d[a][b]:d[a],J(f)&&c[a+1]>=this.xAxis.min&&0!==f){this.compareValue=f;break}};q(b,\"getExtremes\",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=p(b),this.dataMax=G(b))});A.prototype.setCompare=function(a,b){this.isXAxis||(y(this.series,function(b){b.setCompare(a)}),g(b,!0)&&this.chart.redraw())};k.prototype.tooltipFormatter=function(b){b=b.replace(\"{point.change}\",\n(0<this.change?\"+\":\"\")+a.numberFormat(this.change,g(this.series.tooltipOptions.changeDecimals,2)));return H.apply(this,[b])};q(u.prototype,\"render\",function(a){this.chart.is3d&&this.chart.is3d()||this.chart.polar||!this.xAxis||this.xAxis.isRadial||(!this.clipBox&&this.animate?(this.clipBox=c(this.chart.clipBox),this.clipBox.width=this.xAxis.len,this.clipBox.height=this.yAxis.len):this.chart[this.sharedClipKey]?this.chart[this.sharedClipKey].attr({width:this.xAxis.len,height:this.yAxis.len}):this.clipBox&&\n(this.clipBox.width=this.xAxis.len,this.clipBox.height=this.yAxis.len));a.call(this)});q(D.prototype,\"getSelectedPoints\",function(a){var b=a.call(this);y(this.series,function(a){a.hasGroupedData&&(b=b.concat(w(a.points||[],function(a){return a.selected})))});return b});q(D.prototype,\"update\",function(a,b){\"scrollbar\"in b&&this.navigator&&(c(!0,this.options.scrollbar,b.scrollbar),this.navigator.update({},!1),delete b.scrollbar);return a.apply(this,Array.prototype.slice.call(arguments,1))})})(K)});\n"
  },
  {
    "path": "assets/highcharts/modules/stock.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * Highstock as a plugin for Highcharts\n *\n * (c) 2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            css = H.css,\n            dateFormat = H.dateFormat,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            noop = H.noop,\n            Series = H.Series,\n            timeUnits = H.timeUnits,\n            wrap = H.wrap;\n\n        /* ****************************************************************************\n         * Start ordinal axis logic                                                   *\n         *****************************************************************************/\n\n\n        wrap(Series.prototype, 'init', function(proceed) {\n            var series = this,\n                xAxis;\n\n            // call the original function\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n            xAxis = series.xAxis;\n\n            // Destroy the extended ordinal index on updated data\n            if (xAxis && xAxis.options.ordinal) {\n                addEvent(series, 'updatedData', function() {\n                    delete xAxis.ordinalIndex;\n                });\n            }\n        });\n\n        /**\n         * In an ordinal axis, there might be areas with dense consentrations of points, then large\n         * gaps between some. Creating equally distributed ticks over this entire range\n         * may lead to a huge number of ticks that will later be removed. So instead, break the\n         * positions up in segments, find the tick positions for each segment then concatenize them.\n         * This method is used from both data grouping logic and X axis tick position logic.\n         */\n        wrap(Axis.prototype, 'getTimeTicks', function(proceed, normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {\n\n            var start = 0,\n                end,\n                segmentPositions,\n                higherRanks = {},\n                hasCrossedHigherRank,\n                info,\n                posLength,\n                outsideMax,\n                groupPositions = [],\n                lastGroupPosition = -Number.MAX_VALUE,\n                tickPixelIntervalOption = this.options.tickPixelInterval;\n\n            // The positions are not always defined, for example for ordinal positions when data\n            // has regular interval (#1557, #2090)\n            if ((!this.options.ordinal && !this.options.breaks) || !positions || positions.length < 3 || min === undefined) {\n                return proceed.call(this, normalizedInterval, min, max, startOfWeek);\n            }\n\n            // Analyze the positions array to split it into segments on gaps larger than 5 times\n            // the closest distance. The closest distance is already found at this point, so\n            // we reuse that instead of computing it again.\n            posLength = positions.length;\n\n            for (end = 0; end < posLength; end++) {\n\n                outsideMax = end && positions[end - 1] > max;\n\n                if (positions[end] < min) { // Set the last position before min\n                    start = end;\n                }\n\n                if (end === posLength - 1 || positions[end + 1] - positions[end] > closestDistance * 5 || outsideMax) {\n\n                    // For each segment, calculate the tick positions from the getTimeTicks utility\n                    // function. The interval will be the same regardless of how long the segment is.\n                    if (positions[end] > lastGroupPosition) { // #1475\n\n                        segmentPositions = proceed.call(this, normalizedInterval, positions[start], positions[end], startOfWeek);\n\n                        // Prevent duplicate groups, for example for multiple segments within one larger time frame (#1475)\n                        while (segmentPositions.length && segmentPositions[0] <= lastGroupPosition) {\n                            segmentPositions.shift();\n                        }\n                        if (segmentPositions.length) {\n                            lastGroupPosition = segmentPositions[segmentPositions.length - 1];\n                        }\n\n                        groupPositions = groupPositions.concat(segmentPositions);\n                    }\n                    // Set start of next segment\n                    start = end + 1;\n                }\n\n                if (outsideMax) {\n                    break;\n                }\n            }\n\n            // Get the grouping info from the last of the segments. The info is the same for\n            // all segments.\n            info = segmentPositions.info;\n\n            // Optionally identify ticks with higher rank, for example when the ticks\n            // have crossed midnight.\n            if (findHigherRanks && info.unitRange <= timeUnits.hour) {\n                end = groupPositions.length - 1;\n\n                // Compare points two by two\n                for (start = 1; start < end; start++) {\n                    if (dateFormat('%d', groupPositions[start]) !== dateFormat('%d', groupPositions[start - 1])) {\n                        higherRanks[groupPositions[start]] = 'day';\n                        hasCrossedHigherRank = true;\n                    }\n                }\n\n                // If the complete array has crossed midnight, we want to mark the first\n                // positions also as higher rank\n                if (hasCrossedHigherRank) {\n                    higherRanks[groupPositions[0]] = 'day';\n                }\n                info.higherRanks = higherRanks;\n            }\n\n            // Save the info\n            groupPositions.info = info;\n\n\n\n            // Don't show ticks within a gap in the ordinal axis, where the space between\n            // two points is greater than a portion of the tick pixel interval\n            if (findHigherRanks && defined(tickPixelIntervalOption)) { // check for squashed ticks\n\n                var length = groupPositions.length,\n                    i = length,\n                    itemToRemove,\n                    translated,\n                    translatedArr = [],\n                    lastTranslated,\n                    medianDistance,\n                    distance,\n                    distances = [];\n\n                // Find median pixel distance in order to keep a reasonably even distance between\n                // ticks (#748)\n                while (i--) {\n                    translated = this.translate(groupPositions[i]);\n                    if (lastTranslated) {\n                        distances[i] = lastTranslated - translated;\n                    }\n                    translatedArr[i] = lastTranslated = translated;\n                }\n                distances.sort();\n                medianDistance = distances[Math.floor(distances.length / 2)];\n                if (medianDistance < tickPixelIntervalOption * 0.6) {\n                    medianDistance = null;\n                }\n\n                // Now loop over again and remove ticks where needed\n                i = groupPositions[length - 1] > max ? length - 1 : length; // #817\n                lastTranslated = undefined;\n                while (i--) {\n                    translated = translatedArr[i];\n                    distance = Math.abs(lastTranslated - translated);\n                    // #4175 - when axis is reversed, the distance, is negative but \n                    // tickPixelIntervalOption positive, so we need to compare the same values\n\n                    // Remove ticks that are closer than 0.6 times the pixel interval from the one to the right,\n                    // but not if it is close to the median distance (#748).\n                    if (lastTranslated && distance < tickPixelIntervalOption * 0.8 &&\n                        (medianDistance === null || distance < medianDistance * 0.8)) {\n\n                        // Is this a higher ranked position with a normal position to the right?\n                        if (higherRanks[groupPositions[i]] && !higherRanks[groupPositions[i + 1]]) {\n\n                            // Yes: remove the lower ranked neighbour to the right\n                            itemToRemove = i + 1;\n                            lastTranslated = translated; // #709\n\n                        } else {\n\n                            // No: remove this one\n                            itemToRemove = i;\n                        }\n\n                        groupPositions.splice(itemToRemove, 1);\n\n                    } else {\n                        lastTranslated = translated;\n                    }\n                }\n            }\n            return groupPositions;\n        });\n\n        // Extend the Axis prototype\n        extend(Axis.prototype, /** @lends Axis.prototype */ {\n\n            /**\n             * Calculate the ordinal positions before tick positions are calculated.\n             */\n            beforeSetTickPositions: function() {\n                var axis = this,\n                    len,\n                    ordinalPositions = [],\n                    useOrdinal = false,\n                    dist,\n                    extremes = axis.getExtremes(),\n                    min = extremes.min,\n                    max = extremes.max,\n                    minIndex,\n                    maxIndex,\n                    slope,\n                    hasBreaks = axis.isXAxis && !!axis.options.breaks,\n                    isOrdinal = axis.options.ordinal,\n                    ignoreHiddenSeries = axis.chart.options.chart.ignoreHiddenSeries,\n                    i;\n\n                // apply the ordinal logic\n                if (isOrdinal || hasBreaks) { // #4167 YAxis is never ordinal ?\n\n                    each(axis.series, function(series, i) {\n\n                        if ((!ignoreHiddenSeries || series.visible !== false) && (series.takeOrdinalPosition !== false || hasBreaks)) {\n\n                            // concatenate the processed X data into the existing positions, or the empty array\n                            ordinalPositions = ordinalPositions.concat(series.processedXData);\n                            len = ordinalPositions.length;\n\n                            // remove duplicates (#1588)\n                            ordinalPositions.sort(function(a, b) {\n                                return a - b; // without a custom function it is sorted as strings\n                            });\n\n                            if (len) {\n                                i = len - 1;\n                                while (i--) {\n                                    if (ordinalPositions[i] === ordinalPositions[i + 1]) {\n                                        ordinalPositions.splice(i, 1);\n                                    }\n                                }\n                            }\n                        }\n\n                    });\n\n                    // cache the length\n                    len = ordinalPositions.length;\n\n                    // Check if we really need the overhead of mapping axis data against the ordinal positions.\n                    // If the series consist of evenly spaced data any way, we don't need any ordinal logic.\n                    if (len > 2) { // two points have equal distance by default\n                        dist = ordinalPositions[1] - ordinalPositions[0];\n                        i = len - 1;\n                        while (i-- && !useOrdinal) {\n                            if (ordinalPositions[i + 1] - ordinalPositions[i] !== dist) {\n                                useOrdinal = true;\n                            }\n                        }\n\n                        // When zooming in on a week, prevent axis padding for weekends even though the data within\n                        // the week is evenly spaced.\n                        if (!axis.options.keepOrdinalPadding && (ordinalPositions[0] - min > dist || max - ordinalPositions[ordinalPositions.length - 1] > dist)) {\n                            useOrdinal = true;\n                        }\n                    }\n\n                    // Record the slope and offset to compute the linear values from the array index.\n                    // Since the ordinal positions may exceed the current range, get the start and\n                    // end positions within it (#719, #665b)\n                    if (useOrdinal) {\n\n                        // Register\n                        axis.ordinalPositions = ordinalPositions;\n\n                        // This relies on the ordinalPositions being set. Use Math.max\n                        // and Math.min to prevent padding on either sides of the data.\n                        minIndex = axis.ordinal2lin( // #5979\n                            Math.max(\n                                min,\n                                ordinalPositions[0]\n                            ),\n                            true\n                        );\n                        maxIndex = Math.max(axis.ordinal2lin(\n                            Math.min(\n                                max,\n                                ordinalPositions[ordinalPositions.length - 1]\n                            ),\n                            true\n                        ), 1); // #3339\n\n                        // Set the slope and offset of the values compared to the indices in the ordinal positions\n                        axis.ordinalSlope = slope = (max - min) / (maxIndex - minIndex);\n                        axis.ordinalOffset = min - (minIndex * slope);\n\n                    } else {\n                        axis.ordinalPositions = axis.ordinalSlope = axis.ordinalOffset = undefined;\n                    }\n                }\n                axis.isOrdinal = isOrdinal && useOrdinal; // #3818, #4196, #4926\n                axis.groupIntervalFactor = null; // reset for next run\n            },\n            /**\n             * Translate from a linear axis value to the corresponding ordinal axis position. If there\n             * are no gaps in the ordinal axis this will be the same. The translated value is the value\n             * that the point would have if the axis were linear, using the same min and max.\n             *\n             * @param Number val The axis value\n             * @param Boolean toIndex Whether to return the index in the ordinalPositions or the new value\n             */\n            val2lin: function(val, toIndex) {\n                var axis = this,\n                    ordinalPositions = axis.ordinalPositions,\n                    ret;\n\n                if (!ordinalPositions) {\n                    ret = val;\n\n                } else {\n\n                    var ordinalLength = ordinalPositions.length,\n                        i,\n                        distance,\n                        ordinalIndex;\n\n                    // first look for an exact match in the ordinalpositions array\n                    i = ordinalLength;\n                    while (i--) {\n                        if (ordinalPositions[i] === val) {\n                            ordinalIndex = i;\n                            break;\n                        }\n                    }\n\n                    // if that failed, find the intermediate position between the two nearest values\n                    i = ordinalLength - 1;\n                    while (i--) {\n                        if (val > ordinalPositions[i] || i === 0) { // interpolate\n                            distance = (val - ordinalPositions[i]) / (ordinalPositions[i + 1] - ordinalPositions[i]); // something between 0 and 1\n                            ordinalIndex = i + distance;\n                            break;\n                        }\n                    }\n                    ret = toIndex ?\n                        ordinalIndex :\n                        axis.ordinalSlope * (ordinalIndex || 0) + axis.ordinalOffset;\n                }\n                return ret;\n            },\n            /**\n             * Translate from linear (internal) to axis value\n             *\n             * @param Number val The linear abstracted value\n             * @param Boolean fromIndex Translate from an index in the ordinal positions rather than a value\n             */\n            lin2val: function(val, fromIndex) {\n                var axis = this,\n                    ordinalPositions = axis.ordinalPositions,\n                    ret;\n\n                if (!ordinalPositions) { // the visible range contains only equally spaced values\n                    ret = val;\n\n                } else {\n\n                    var ordinalSlope = axis.ordinalSlope,\n                        ordinalOffset = axis.ordinalOffset,\n                        i = ordinalPositions.length - 1,\n                        linearEquivalentLeft,\n                        linearEquivalentRight,\n                        distance;\n\n\n                    // Handle the case where we translate from the index directly, used only\n                    // when panning an ordinal axis\n                    if (fromIndex) {\n\n                        if (val < 0) { // out of range, in effect panning to the left\n                            val = ordinalPositions[0];\n                        } else if (val > i) { // out of range, panning to the right\n                            val = ordinalPositions[i];\n                        } else { // split it up\n                            i = Math.floor(val);\n                            distance = val - i; // the decimal\n                        }\n\n                        // Loop down along the ordinal positions. When the linear equivalent of i matches\n                        // an ordinal position, interpolate between the left and right values.\n                    } else {\n                        while (i--) {\n                            linearEquivalentLeft = (ordinalSlope * i) + ordinalOffset;\n                            if (val >= linearEquivalentLeft) {\n                                linearEquivalentRight = (ordinalSlope * (i + 1)) + ordinalOffset;\n                                distance = (val - linearEquivalentLeft) / (linearEquivalentRight - linearEquivalentLeft); // something between 0 and 1\n                                break;\n                            }\n                        }\n                    }\n\n                    // If the index is within the range of the ordinal positions, return the associated\n                    // or interpolated value. If not, just return the value\n                    return distance !== undefined && ordinalPositions[i] !== undefined ?\n                        ordinalPositions[i] + (distance ? distance * (ordinalPositions[i + 1] - ordinalPositions[i]) : 0) :\n                        val;\n                }\n                return ret;\n            },\n            /**\n             * Get the ordinal positions for the entire data set. This is necessary in chart panning\n             * because we need to find out what points or data groups are available outside the\n             * visible range. When a panning operation starts, if an index for the given grouping\n             * does not exists, it is created and cached. This index is deleted on updated data, so\n             * it will be regenerated the next time a panning operation starts.\n             */\n            getExtendedPositions: function() {\n                var axis = this,\n                    chart = axis.chart,\n                    grouping = axis.series[0].currentDataGrouping,\n                    ordinalIndex = axis.ordinalIndex,\n                    key = grouping ? grouping.count + grouping.unitName : 'raw',\n                    extremes = axis.getExtremes(),\n                    fakeAxis,\n                    fakeSeries;\n\n                // If this is the first time, or the ordinal index is deleted by updatedData,\n                // create it.\n                if (!ordinalIndex) {\n                    ordinalIndex = axis.ordinalIndex = {};\n                }\n\n\n                if (!ordinalIndex[key]) {\n\n                    // Create a fake axis object where the extended ordinal positions are emulated\n                    fakeAxis = {\n                        series: [],\n                        chart: chart,\n                        getExtremes: function() {\n                            return {\n                                min: extremes.dataMin,\n                                max: extremes.dataMax\n                            };\n                        },\n                        options: {\n                            ordinal: true\n                        },\n                        val2lin: Axis.prototype.val2lin, // #2590\n                        ordinal2lin: Axis.prototype.ordinal2lin // #6276\n                    };\n\n                    // Add the fake series to hold the full data, then apply processData to it\n                    each(axis.series, function(series) {\n                        fakeSeries = {\n                            xAxis: fakeAxis,\n                            xData: series.xData,\n                            chart: chart,\n                            destroyGroupedData: noop\n                        };\n                        fakeSeries.options = {\n                            dataGrouping: grouping ? {\n                                enabled: true,\n                                forced: true,\n                                approximation: 'open', // doesn't matter which, use the fastest\n                                units: [\n                                    [grouping.unitName, [grouping.count]]\n                                ]\n                            } : {\n                                enabled: false\n                            }\n                        };\n                        series.processData.apply(fakeSeries);\n\n                        fakeAxis.series.push(fakeSeries);\n                    });\n\n                    // Run beforeSetTickPositions to compute the ordinalPositions\n                    axis.beforeSetTickPositions.apply(fakeAxis);\n\n                    // Cache it\n                    ordinalIndex[key] = fakeAxis.ordinalPositions;\n                }\n                return ordinalIndex[key];\n            },\n\n            /**\n             * Find the factor to estimate how wide the plot area would have been if ordinal\n             * gaps were included. This value is used to compute an imagined plot width in order\n             * to establish the data grouping interval.\n             *\n             * A real world case is the intraday-candlestick\n             * example. Without this logic, it would show the correct data grouping when viewing\n             * a range within each day, but once moving the range to include the gap between two\n             * days, the interval would include the cut-away night hours and the data grouping\n             * would be wrong. So the below method tries to compensate by identifying the most\n             * common point interval, in this case days.\n             *\n             * An opposite case is presented in issue #718. We have a long array of daily data,\n             * then one point is appended one hour after the last point. We expect the data grouping\n             * not to change.\n             *\n             * In the future, if we find cases where this estimation doesn't work optimally, we\n             * might need to add a second pass to the data grouping logic, where we do another run\n             * with a greater interval if the number of data groups is more than a certain fraction\n             * of the desired group count.\n             */\n            getGroupIntervalFactor: function(xMin, xMax, series) {\n                var i,\n                    processedXData = series.processedXData,\n                    len = processedXData.length,\n                    distances = [],\n                    median,\n                    groupIntervalFactor = this.groupIntervalFactor;\n\n                // Only do this computation for the first series, let the other inherit it (#2416)\n                if (!groupIntervalFactor) {\n\n                    // Register all the distances in an array\n                    for (i = 0; i < len - 1; i++) {\n                        distances[i] = processedXData[i + 1] - processedXData[i];\n                    }\n\n                    // Sort them and find the median\n                    distances.sort(function(a, b) {\n                        return a - b;\n                    });\n                    median = distances[Math.floor(len / 2)];\n\n                    // Compensate for series that don't extend through the entire axis extent. #1675.\n                    xMin = Math.max(xMin, processedXData[0]);\n                    xMax = Math.min(xMax, processedXData[len - 1]);\n\n                    this.groupIntervalFactor = groupIntervalFactor = (len * median) / (xMax - xMin);\n                }\n\n                // Return the factor needed for data grouping\n                return groupIntervalFactor;\n            },\n\n            /**\n             * Make the tick intervals closer because the ordinal gaps make the ticks spread out or cluster\n             */\n            postProcessTickInterval: function(tickInterval) {\n                // Problem: http://jsfiddle.net/highcharts/FQm4E/1/\n                // This is a case where this algorithm doesn't work optimally. In this case, the\n                // tick labels are spread out per week, but all the gaps reside within weeks. So\n                // we have a situation where the labels are courser than the ordinal gaps, and\n                // thus the tick interval should not be altered\n                var ordinalSlope = this.ordinalSlope,\n                    ret;\n\n\n                if (ordinalSlope) {\n                    if (!this.options.breaks) {\n                        ret = tickInterval / (ordinalSlope / this.closestPointRange);\n                    } else {\n                        ret = this.closestPointRange;\n                    }\n                } else {\n                    ret = tickInterval;\n                }\n                return ret;\n            }\n        });\n\n        // Record this to prevent overwriting by broken-axis module (#5979)\n        Axis.prototype.ordinal2lin = Axis.prototype.val2lin;\n\n        // Extending the Chart.pan method for ordinal axes\n        wrap(Chart.prototype, 'pan', function(proceed, e) {\n            var chart = this,\n                xAxis = chart.xAxis[0],\n                chartX = e.chartX,\n                runBase = false;\n\n            if (xAxis.options.ordinal && xAxis.series.length) {\n\n                var mouseDownX = chart.mouseDownX,\n                    extremes = xAxis.getExtremes(),\n                    dataMax = extremes.dataMax,\n                    min = extremes.min,\n                    max = extremes.max,\n                    trimmedRange,\n                    hoverPoints = chart.hoverPoints,\n                    closestPointRange = xAxis.closestPointRange,\n                    pointPixelWidth = xAxis.translationSlope * (xAxis.ordinalSlope || closestPointRange),\n                    movedUnits = (mouseDownX - chartX) / pointPixelWidth, // how many ordinal units did we move?\n                    extendedAxis = {\n                        ordinalPositions: xAxis.getExtendedPositions()\n                    }, // get index of all the chart's points\n                    ordinalPositions,\n                    searchAxisLeft,\n                    lin2val = xAxis.lin2val,\n                    val2lin = xAxis.val2lin,\n                    searchAxisRight;\n\n                if (!extendedAxis.ordinalPositions) { // we have an ordinal axis, but the data is equally spaced\n                    runBase = true;\n\n                } else if (Math.abs(movedUnits) > 1) {\n\n                    // Remove active points for shared tooltip\n                    if (hoverPoints) {\n                        each(hoverPoints, function(point) {\n                            point.setState();\n                        });\n                    }\n\n                    if (movedUnits < 0) {\n                        searchAxisLeft = extendedAxis;\n                        searchAxisRight = xAxis.ordinalPositions ? xAxis : extendedAxis;\n                    } else {\n                        searchAxisLeft = xAxis.ordinalPositions ? xAxis : extendedAxis;\n                        searchAxisRight = extendedAxis;\n                    }\n\n                    // In grouped data series, the last ordinal position represents the grouped data, which is\n                    // to the left of the real data max. If we don't compensate for this, we will be allowed\n                    // to pan grouped data series passed the right of the plot area.\n                    ordinalPositions = searchAxisRight.ordinalPositions;\n                    if (dataMax > ordinalPositions[ordinalPositions.length - 1]) {\n                        ordinalPositions.push(dataMax);\n                    }\n\n                    // Get the new min and max values by getting the ordinal index for the current extreme,\n                    // then add the moved units and translate back to values. This happens on the\n                    // extended ordinal positions if the new position is out of range, else it happens\n                    // on the current x axis which is smaller and faster.\n                    chart.fixedRange = max - min;\n                    trimmedRange = xAxis.toFixedRange(null, null,\n                        lin2val.apply(searchAxisLeft, [\n                            val2lin.apply(searchAxisLeft, [min, true]) + movedUnits, // the new index\n                            true // translate from index\n                        ]),\n                        lin2val.apply(searchAxisRight, [\n                            val2lin.apply(searchAxisRight, [max, true]) + movedUnits, // the new index\n                            true // translate from index\n                        ])\n                    );\n\n                    // Apply it if it is within the available data range\n                    if (trimmedRange.min >= Math.min(extremes.dataMin, min) && trimmedRange.max <= Math.max(dataMax, max)) {\n                        xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, {\n                            trigger: 'pan'\n                        });\n                    }\n\n                    chart.mouseDownX = chartX; // set new reference for next run\n                    css(chart.container, {\n                        cursor: 'move'\n                    });\n                }\n\n            } else {\n                runBase = true;\n            }\n\n            // revert to the linear chart.pan version\n            if (runBase) {\n                // call the original function\n                proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            }\n        });\n\n        /* ****************************************************************************\n         * End ordinal axis logic                                                   *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2009-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var pick = H.pick,\n            wrap = H.wrap,\n            each = H.each,\n            extend = H.extend,\n            isArray = H.isArray,\n            fireEvent = H.fireEvent,\n            Axis = H.Axis,\n            Series = H.Series;\n\n        function stripArguments() {\n            return Array.prototype.slice.call(arguments, 1);\n        }\n\n        extend(Axis.prototype, {\n            isInBreak: function(brk, val) {\n                var ret,\n                    repeat = brk.repeat || Infinity,\n                    from = brk.from,\n                    length = brk.to - brk.from,\n                    test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));\n\n                if (!brk.inclusive) {\n                    ret = test < length && test !== 0;\n                } else {\n                    ret = test <= length;\n                }\n                return ret;\n            },\n\n            isInAnyBreak: function(val, testKeep) {\n\n                var breaks = this.options.breaks,\n                    i = breaks && breaks.length,\n                    inbrk,\n                    keep,\n                    ret;\n\n\n                if (i) {\n\n                    while (i--) {\n                        if (this.isInBreak(breaks[i], val)) {\n                            inbrk = true;\n                            if (!keep) {\n                                keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);\n                            }\n                        }\n                    }\n\n                    if (inbrk && testKeep) {\n                        ret = inbrk && !keep;\n                    } else {\n                        ret = inbrk;\n                    }\n                }\n                return ret;\n            }\n        });\n\n        wrap(Axis.prototype, 'setTickPositions', function(proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n            if (this.options.breaks) {\n                var axis = this,\n                    tickPositions = this.tickPositions,\n                    info = this.tickPositions.info,\n                    newPositions = [],\n                    i;\n\n                for (i = 0; i < tickPositions.length; i++) {\n                    if (!axis.isInAnyBreak(tickPositions[i])) {\n                        newPositions.push(tickPositions[i]);\n                    }\n                }\n\n                this.tickPositions = newPositions;\n                this.tickPositions.info = info;\n            }\n        });\n\n        wrap(Axis.prototype, 'init', function(proceed, chart, userOptions) {\n            var axis = this,\n                breaks;\n            // Force Axis to be not-ordinal when breaks are defined\n            if (userOptions.breaks && userOptions.breaks.length) {\n                userOptions.ordinal = false;\n            }\n            proceed.call(this, chart, userOptions);\n            breaks = this.options.breaks;\n            axis.isBroken = (isArray(breaks) && !!breaks.length);\n            if (axis.isBroken) {\n                axis.val2lin = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.to <= val) {\n                            nval -= brk.len;\n                        } else if (brk.from >= val) {\n                            break;\n                        } else if (axis.isInBreak(brk, val)) {\n                            nval -= (val - brk.from);\n                            break;\n                        }\n                    }\n\n                    return nval;\n                };\n\n                axis.lin2val = function(val) {\n                    var nval = val,\n                        brk,\n                        i;\n\n                    for (i = 0; i < axis.breakArray.length; i++) {\n                        brk = axis.breakArray[i];\n                        if (brk.from >= nval) {\n                            break;\n                        } else if (brk.to < nval) {\n                            nval += brk.len;\n                        } else if (axis.isInBreak(brk, nval)) {\n                            nval += brk.len;\n                        }\n                    }\n                    return nval;\n                };\n\n                axis.setExtremes = function(newMin, newMax, redraw, animation, eventArguments) {\n                    // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )\n                    while (this.isInAnyBreak(newMin)) {\n                        newMin -= this.closestPointRange;\n                    }\n                    while (this.isInAnyBreak(newMax)) {\n                        newMax -= this.closestPointRange;\n                    }\n                    Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);\n                };\n\n                axis.setAxisTranslation = function(saveOld) {\n                    Axis.prototype.setAxisTranslation.call(this, saveOld);\n\n                    var breaks = axis.options.breaks,\n                        breakArrayT = [], // Temporary one\n                        breakArray = [],\n                        length = 0,\n                        inBrk,\n                        repeat,\n                        min = axis.userMin || axis.min,\n                        max = axis.userMax || axis.max,\n                        pointRangePadding = pick(axis.pointRangePadding, 0),\n                        start,\n                        i;\n\n                    // Min & max check (#4247)\n                    each(breaks, function(brk) {\n                        repeat = brk.repeat || Infinity;\n                        if (axis.isInBreak(brk, min)) {\n                            min += (brk.to % repeat) - (min % repeat);\n                        }\n                        if (axis.isInBreak(brk, max)) {\n                            max -= (max % repeat) - (brk.from % repeat);\n                        }\n                    });\n\n                    // Construct an array holding all breaks in the axis\n                    each(breaks, function(brk) {\n                        start = brk.from;\n                        repeat = brk.repeat || Infinity;\n\n                        while (start - repeat > min) {\n                            start -= repeat;\n                        }\n                        while (start < min) {\n                            start += repeat;\n                        }\n\n                        for (i = start; i < max; i += repeat) {\n                            breakArrayT.push({\n                                value: i,\n                                move: 'in'\n                            });\n                            breakArrayT.push({\n                                value: i + (brk.to - brk.from),\n                                move: 'out',\n                                size: brk.breakSize\n                            });\n                        }\n                    });\n\n                    breakArrayT.sort(function(a, b) {\n                        var ret;\n                        if (a.value === b.value) {\n                            ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);\n                        } else {\n                            ret = a.value - b.value;\n                        }\n                        return ret;\n                    });\n\n                    // Simplify the breaks\n                    inBrk = 0;\n                    start = min;\n\n                    each(breakArrayT, function(brk) {\n                        inBrk += (brk.move === 'in' ? 1 : -1);\n\n                        if (inBrk === 1 && brk.move === 'in') {\n                            start = brk.value;\n                        }\n                        if (inBrk === 0) {\n                            breakArray.push({\n                                from: start,\n                                to: brk.value,\n                                len: brk.value - start - (brk.size || 0)\n                            });\n                            length += brk.value - start - (brk.size || 0);\n                        }\n                    });\n\n                    axis.breakArray = breakArray;\n\n                    // Used with staticScale, and below, the actual axis length when\n                    // breaks are substracted.\n                    axis.unitLength = max - min - length + pointRangePadding;\n\n                    fireEvent(axis, 'afterBreaks');\n\n                    if (axis.options.staticScale) {\n                        axis.transA = axis.options.staticScale;\n                    } else if (axis.unitLength) {\n                        axis.transA *= (max - axis.min + pointRangePadding) /\n                            axis.unitLength;\n                    }\n\n                    if (pointRangePadding) {\n                        axis.minPixelPadding = axis.transA * axis.minPointOffset;\n                    }\n\n                    axis.min = min;\n                    axis.max = max;\n                };\n            }\n        });\n\n        wrap(Series.prototype, 'generatePoints', function(proceed) {\n\n            proceed.apply(this, stripArguments(arguments));\n\n            var series = this,\n                xAxis = series.xAxis,\n                yAxis = series.yAxis,\n                points = series.points,\n                point,\n                i = points.length,\n                connectNulls = series.options.connectNulls,\n                nullGap;\n\n\n            if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {\n                while (i--) {\n                    point = points[i];\n\n                    nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)\n                    if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {\n                        points.splice(i, 1);\n                        if (this.data[i]) {\n                            this.data[i].destroyElements(); // removes the graphics for this point if they exist\n                        }\n                    }\n                }\n            }\n\n        });\n\n        function drawPointsWrapped(proceed) {\n            proceed.apply(this);\n            this.drawBreaks(this.xAxis, ['x']);\n            this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));\n        }\n\n        H.Series.prototype.drawBreaks = function(axis, keys) {\n            var series = this,\n                points = series.points,\n                breaks,\n                threshold,\n                eventName,\n                y;\n\n            if (!axis) {\n                return; // #5950\n            }\n\n            each(keys, function(key) {\n                breaks = axis.breakArray || [];\n                threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);\n                each(points, function(point) {\n                    y = pick(point['stack' + key.toUpperCase()], point[key]);\n                    each(breaks, function(brk) {\n                        eventName = false;\n\n                        if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {\n                            eventName = 'pointBreak';\n                        } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break\n                            eventName = 'pointInBreak';\n                        }\n                        if (eventName) {\n                            fireEvent(axis, eventName, {\n                                point: point,\n                                brk: brk\n                            });\n                        }\n                    });\n                });\n            });\n        };\n\n\n        /**\n         * Extend getGraphPath by identifying gaps in the data so that we can draw a gap\n         * in the line or area. This was moved from ordinal axis module to broken axis\n         * module as of #5045.\n         */\n        H.Series.prototype.gappedPath = function() {\n            var gapSize = this.options.gapSize,\n                points = this.points.slice(),\n                i = points.length - 1;\n\n            if (gapSize && i > 0) { // #5008\n\n                // extension for ordinal breaks\n                while (i--) {\n                    if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {\n                        points.splice( // insert after this one\n                            i + 1,\n                            0, {\n                                isNull: true\n                            }\n                        );\n                    }\n                }\n            }\n\n            // Call base method\n            return this.getGraphPath(points);\n        };\n\n        wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);\n        wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);\n\n    }(Highcharts));\n    (function() {\n\n\n    }());\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            Axis = H.Axis,\n            defaultPlotOptions = H.defaultPlotOptions,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            Point = H.Point,\n            Series = H.Series,\n            Tooltip = H.Tooltip,\n            wrap = H.wrap;\n\n        /* ****************************************************************************\n         * Start data grouping module\t\t\t\t\t\t\t\t\t\t\t\t *\n         ******************************************************************************/\n\n        var seriesProto = Series.prototype,\n            baseProcessData = seriesProto.processData,\n            baseGeneratePoints = seriesProto.generatePoints,\n            baseDestroy = seriesProto.destroy,\n\n            commonOptions = {\n                approximation: 'average', // average, open, high, low, close, sum\n                //enabled: null, // (true for stock charts, false for basic),\n                //forced: undefined,\n                groupPixelWidth: 2,\n                // the first one is the point or start value, the second is the start value if we're dealing with range,\n                // the third one is the end value if dealing with a range\n                dateTimeLabelFormats: {\n                    millisecond: ['%A, %b %e, %H:%M:%S.%L', '%A, %b %e, %H:%M:%S.%L', '-%H:%M:%S.%L'],\n                    second: ['%A, %b %e, %H:%M:%S', '%A, %b %e, %H:%M:%S', '-%H:%M:%S'],\n                    minute: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\n                    hour: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\n                    day: ['%A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\n                    week: ['Week from %A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\n                    month: ['%B %Y', '%B', '-%B %Y'],\n                    year: ['%Y', '%Y', '-%Y']\n                }\n                // smoothed = false, // enable this for navigator series only\n            },\n\n            specificOptions = { // extends common options\n                line: {},\n                spline: {},\n                area: {},\n                areaspline: {},\n                column: {\n                    approximation: 'sum',\n                    groupPixelWidth: 10\n                },\n                arearange: {\n                    approximation: 'range'\n                },\n                areasplinerange: {\n                    approximation: 'range'\n                },\n                columnrange: {\n                    approximation: 'range',\n                    groupPixelWidth: 10\n                },\n                candlestick: {\n                    approximation: 'ohlc',\n                    groupPixelWidth: 10\n                },\n                ohlc: {\n                    approximation: 'ohlc',\n                    groupPixelWidth: 5\n                }\n            },\n\n            // units are defined in a separate array to allow complete overriding in case of a user option\n            defaultDataGroupingUnits = H.defaultDataGroupingUnits = [\n                [\n                    'millisecond', // unit name\n                    [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                ],\n                [\n                    'second', [1, 2, 5, 10, 15, 30]\n                ],\n                [\n                    'minute', [1, 2, 5, 10, 15, 30]\n                ],\n                [\n                    'hour', [1, 2, 3, 4, 6, 8, 12]\n                ],\n                [\n                    'day', [1]\n                ],\n                [\n                    'week', [1]\n                ],\n                [\n                    'month', [1, 3, 6]\n                ],\n                [\n                    'year',\n                    null\n                ]\n            ],\n\n\n            /**\n             * Define the available approximation types. The data grouping\n             * approximations takes an array or numbers as the first parameter. In case\n             * of ohlc, four arrays are sent in as four parameters. Each array consists\n             * only of numbers. In case null values belong to the group, the property\n             * .hasNulls will be set to true on the array.\n             */\n            approximations = {\n                sum: function(arr) {\n                    var len = arr.length,\n                        ret;\n\n                    // 1. it consists of nulls exclusively\n                    if (!len && arr.hasNulls) {\n                        ret = null;\n                        // 2. it has a length and real values\n                    } else if (len) {\n                        ret = 0;\n                        while (len--) {\n                            ret += arr[len];\n                        }\n                    }\n                    // 3. it has zero length, so just return undefined\n                    // => doNothing()\n\n                    return ret;\n                },\n                average: function(arr) {\n                    var len = arr.length,\n                        ret = approximations.sum(arr);\n\n                    // If we have a number, return it divided by the length. If not,\n                    // return null or undefined based on what the sum method finds.\n                    if (isNumber(ret) && len) {\n                        ret = ret / len;\n                    }\n\n                    return ret;\n                },\n                // The same as average, but for series with multiple values, like area\n                // ranges.\n                averages: function() { // #5479\n                    var ret = [];\n\n                    each(arguments, function(arr) {\n                        ret.push(approximations.average(arr));\n                    });\n\n                    return ret;\n                },\n                open: function(arr) {\n                    return arr.length ? arr[0] : (arr.hasNulls ? null : undefined);\n                },\n                high: function(arr) {\n                    return arr.length ? arrayMax(arr) : (arr.hasNulls ? null : undefined);\n                },\n                low: function(arr) {\n                    return arr.length ? arrayMin(arr) : (arr.hasNulls ? null : undefined);\n                },\n                close: function(arr) {\n                    return arr.length ? arr[arr.length - 1] : (arr.hasNulls ? null : undefined);\n                },\n                // ohlc and range are special cases where a multidimensional array is input and an array is output\n                ohlc: function(open, high, low, close) {\n                    open = approximations.open(open);\n                    high = approximations.high(high);\n                    low = approximations.low(low);\n                    close = approximations.close(close);\n\n                    if (isNumber(open) || isNumber(high) || isNumber(low) || isNumber(close)) {\n                        return [open, high, low, close];\n                    }\n                    // else, return is undefined\n                },\n                range: function(low, high) {\n                    low = approximations.low(low);\n                    high = approximations.high(high);\n\n                    if (isNumber(low) || isNumber(high)) {\n                        return [low, high];\n                    } else if (low === null && high === null) {\n                        return null;\n                    }\n                    // else, return is undefined\n                }\n            };\n\n\n        /**\n         * Takes parallel arrays of x and y data and groups the data into intervals \n         * defined by groupPositions, a collection of starting x values for each group.\n         */\n        seriesProto.groupData = function(xData, yData, groupPositions, approximation) {\n            var series = this,\n                data = series.data,\n                dataOptions = series.options.data,\n                groupedXData = [],\n                groupedYData = [],\n                groupMap = [],\n                dataLength = xData.length,\n                pointX,\n                pointY,\n                groupedY,\n                // when grouping the fake extended axis for panning,\n                // we don't need to consider y\n                handleYData = !!yData,\n                values = [],\n                approximationFn = typeof approximation === 'function' ?\n                approximation :\n                approximations[approximation] ||\n                // if the approximation is not found use default series type\n                // approximation (#2914)\n                (\n                    specificOptions[series.type] &&\n                    approximations[specificOptions[series.type].approximation]\n                ) || approximations[commonOptions.approximation],\n                pointArrayMap = series.pointArrayMap,\n                pointArrayMapLength = pointArrayMap && pointArrayMap.length,\n                pos = 0,\n                start = 0,\n                valuesLen,\n                i, j;\n\n            // Calculate values array size from pointArrayMap length\n            if (pointArrayMapLength) {\n                each(pointArrayMap, function() {\n                    values.push([]);\n                });\n            } else {\n                values.push([]);\n            }\n            valuesLen = pointArrayMapLength || 1;\n\n            // Start with the first point within the X axis range (#2696)\n            for (i = 0; i <= dataLength; i++) {\n                if (xData[i] >= groupPositions[0]) {\n                    break;\n                }\n            }\n\n            for (i; i <= dataLength; i++) {\n\n                // when a new group is entered, summarize and initiate \n                // the previous group\n                while ((\n                        groupPositions[pos + 1] !== undefined &&\n                        xData[i] >= groupPositions[pos + 1]\n                    ) || i === dataLength) { // get the last group\n\n                    // get group x and y\n                    pointX = groupPositions[pos];\n                    series.dataGroupInfo = {\n                        start: start,\n                        length: values[0].length\n                    };\n                    groupedY = approximationFn.apply(series, values);\n\n                    // push the grouped data\n                    if (groupedY !== undefined) {\n                        groupedXData.push(pointX);\n                        groupedYData.push(groupedY);\n                        groupMap.push(series.dataGroupInfo);\n                    }\n\n                    // reset the aggregate arrays\n                    start = i;\n                    for (j = 0; j < valuesLen; j++) {\n                        values[j].length = 0; // faster than values[j] = []\n                        values[j].hasNulls = false;\n                    }\n\n                    // Advance on the group positions\n                    pos += 1;\n\n                    // don't loop beyond the last group\n                    if (i === dataLength) {\n                        break;\n                    }\n                }\n\n                // break out\n                if (i === dataLength) {\n                    break;\n                }\n\n                // for each raw data point, push it to an array that contains all values\n                // for this specific group\n                if (pointArrayMap) {\n\n                    var index = series.cropStart + i,\n                        point = (data && data[index]) ||\n                        series.pointClass.prototype.applyOptions.apply({\n                            series: series\n                        }, [dataOptions[index]]),\n                        val;\n\n                    for (j = 0; j < pointArrayMapLength; j++) {\n                        val = point[pointArrayMap[j]];\n                        if (isNumber(val)) {\n                            values[j].push(val);\n                        } else if (val === null) {\n                            values[j].hasNulls = true;\n                        }\n                    }\n\n                } else {\n                    pointY = handleYData ? yData[i] : null;\n\n                    if (isNumber(pointY)) {\n                        values[0].push(pointY);\n                    } else if (pointY === null) {\n                        values[0].hasNulls = true;\n                    }\n                }\n            }\n\n            return [groupedXData, groupedYData, groupMap];\n        };\n\n        /**\n         * Extend the basic processData method, that crops the data to the current zoom\n         * range, with data grouping logic.\n         */\n        seriesProto.processData = function() {\n            var series = this,\n                chart = series.chart,\n                options = series.options,\n                dataGroupingOptions = options.dataGrouping,\n                groupingEnabled = series.allowDG !== false && dataGroupingOptions &&\n                pick(dataGroupingOptions.enabled, chart.options.isStock),\n                visible = series.visible || !chart.options.chart.ignoreHiddenSeries,\n                hasGroupedData,\n                skip;\n\n            // run base method\n            series.forceCrop = groupingEnabled; // #334\n            series.groupPixelWidth = null; // #2110\n            series.hasProcessed = true; // #2692\n\n            // skip if processData returns false or if grouping is disabled (in that order)\n            skip = baseProcessData.apply(series, arguments) === false || !groupingEnabled;\n            if (!skip) {\n                series.destroyGroupedData();\n\n                var i,\n                    processedXData = series.processedXData,\n                    processedYData = series.processedYData,\n                    plotSizeX = chart.plotSizeX,\n                    xAxis = series.xAxis,\n                    ordinal = xAxis.options.ordinal,\n                    groupPixelWidth = series.groupPixelWidth = xAxis.getGroupPixelWidth && xAxis.getGroupPixelWidth();\n\n                // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\n                if (groupPixelWidth) {\n                    hasGroupedData = true;\n\n                    series.isDirty = true; // force recreation of point instances in series.translate, #5699\n                    series.points = null; // #6709\n\n                    var extremes = xAxis.getExtremes(),\n                        xMin = extremes.min,\n                        xMax = extremes.max,\n                        groupIntervalFactor = (ordinal && xAxis.getGroupIntervalFactor(xMin, xMax, series)) || 1,\n                        interval = (groupPixelWidth * (xMax - xMin) / plotSizeX) * groupIntervalFactor,\n                        groupPositions = xAxis.getTimeTicks(\n                            xAxis.normalizeTimeTickInterval(interval, dataGroupingOptions.units || defaultDataGroupingUnits),\n                            Math.min(xMin, processedXData[0]), // Processed data may extend beyond axis (#4907)\n                            Math.max(xMax, processedXData[processedXData.length - 1]),\n                            xAxis.options.startOfWeek,\n                            processedXData,\n                            series.closestPointRange\n                        ),\n                        groupedData = seriesProto.groupData.apply(series, [processedXData, processedYData, groupPositions, dataGroupingOptions.approximation]),\n                        groupedXData = groupedData[0],\n                        groupedYData = groupedData[1];\n\n                    // prevent the smoothed data to spill out left and right, and make\n                    // sure data is not shifted to the left\n                    if (dataGroupingOptions.smoothed) {\n                        i = groupedXData.length - 1;\n                        groupedXData[i] = Math.min(groupedXData[i], xMax);\n                        while (i-- && i > 0) {\n                            groupedXData[i] += interval / 2;\n                        }\n                        groupedXData[0] = Math.max(groupedXData[0], xMin);\n                    }\n\n                    // record what data grouping values were used\n                    series.currentDataGrouping = groupPositions.info;\n                    series.closestPointRange = groupPositions.info.totalRange;\n                    series.groupMap = groupedData[2];\n\n                    // Make sure the X axis extends to show the first group (#2533)\n                    // But only for visible series (#5493, #6393)\n                    if (defined(groupedXData[0]) && groupedXData[0] < xAxis.dataMin && visible) {\n                        if (xAxis.min === xAxis.dataMin) {\n                            xAxis.min = groupedXData[0];\n                        }\n                        xAxis.dataMin = groupedXData[0];\n                    }\n\n                    // set series props\n                    series.processedXData = groupedXData;\n                    series.processedYData = groupedYData;\n                } else {\n                    series.currentDataGrouping = series.groupMap = null;\n                }\n                series.hasGroupedData = hasGroupedData;\n            }\n        };\n\n        /**\n         * Destroy the grouped data points. #622, #740\n         */\n        seriesProto.destroyGroupedData = function() {\n\n            var groupedData = this.groupedData;\n\n            // clear previous groups\n            each(groupedData || [], function(point, i) {\n                if (point) {\n                    groupedData[i] = point.destroy ? point.destroy() : null;\n                }\n            });\n            this.groupedData = null;\n        };\n\n        /**\n         * Override the generatePoints method by adding a reference to grouped data\n         */\n        seriesProto.generatePoints = function() {\n\n            baseGeneratePoints.apply(this);\n\n            // record grouped data in order to let it be destroyed the next time processData runs\n            this.destroyGroupedData(); // #622\n            this.groupedData = this.hasGroupedData ? this.points : null;\n        };\n\n        /**\n         * Override point prototype to throw a warning when trying to update grouped points\n         */\n        wrap(Point.prototype, 'update', function(proceed) {\n            if (this.dataGroup) {\n                H.error(24);\n            } else {\n                proceed.apply(this, [].slice.call(arguments, 1));\n            }\n        });\n\n        /**\n         * Extend the original method, make the tooltip's header reflect the grouped range\n         */\n        wrap(Tooltip.prototype, 'tooltipFooterHeaderFormatter', function(proceed, labelConfig, isFooter) {\n            var tooltip = this,\n                series = labelConfig.series,\n                options = series.options,\n                tooltipOptions = series.tooltipOptions,\n                dataGroupingOptions = options.dataGrouping,\n                xDateFormat = tooltipOptions.xDateFormat,\n                xDateFormatEnd,\n                xAxis = series.xAxis,\n                dateFormat = H.dateFormat,\n                currentDataGrouping,\n                dateTimeLabelFormats,\n                labelFormats,\n                formattedKey;\n\n            // apply only to grouped series\n            if (xAxis && xAxis.options.type === 'datetime' && dataGroupingOptions && isNumber(labelConfig.key)) {\n\n                // set variables\n                currentDataGrouping = series.currentDataGrouping;\n                dateTimeLabelFormats = dataGroupingOptions.dateTimeLabelFormats;\n\n                // if we have grouped data, use the grouping information to get the right format\n                if (currentDataGrouping) {\n                    labelFormats = dateTimeLabelFormats[currentDataGrouping.unitName];\n                    if (currentDataGrouping.count === 1) {\n                        xDateFormat = labelFormats[0];\n                    } else {\n                        xDateFormat = labelFormats[1];\n                        xDateFormatEnd = labelFormats[2];\n                    }\n                    // if not grouped, and we don't have set the xDateFormat option, get the best fit,\n                    // so if the least distance between points is one minute, show it, but if the\n                    // least distance is one day, skip hours and minutes etc.\n                } else if (!xDateFormat && dateTimeLabelFormats) {\n                    xDateFormat = tooltip.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n                }\n\n                // now format the key\n                formattedKey = dateFormat(xDateFormat, labelConfig.key);\n                if (xDateFormatEnd) {\n                    formattedKey += dateFormat(xDateFormatEnd, labelConfig.key + currentDataGrouping.totalRange - 1);\n                }\n\n                // return the replaced format\n                return format(tooltipOptions[(isFooter ? 'footer' : 'header') + 'Format'], {\n                    point: extend(labelConfig.point, {\n                        key: formattedKey\n                    }),\n                    series: series\n                });\n\n            }\n\n            // else, fall back to the regular formatter\n            return proceed.call(tooltip, labelConfig, isFooter);\n        });\n\n        /**\n         * Extend the series destroyer\n         */\n        seriesProto.destroy = function() {\n            var series = this,\n                groupedData = series.groupedData || [],\n                i = groupedData.length;\n\n            while (i--) {\n                if (groupedData[i]) {\n                    groupedData[i].destroy();\n                }\n            }\n            baseDestroy.apply(series);\n        };\n\n\n        // Handle default options for data grouping. This must be set at runtime because some series types are\n        // defined after this.\n        wrap(seriesProto, 'setOptions', function(proceed, itemOptions) {\n\n            var options = proceed.call(this, itemOptions),\n                type = this.type,\n                plotOptions = this.chart.options.plotOptions,\n                defaultOptions = defaultPlotOptions[type].dataGrouping;\n\n            if (specificOptions[type]) { // #1284\n                if (!defaultOptions) {\n                    defaultOptions = merge(commonOptions, specificOptions[type]);\n                }\n\n                options.dataGrouping = merge(\n                    defaultOptions,\n                    plotOptions.series && plotOptions.series.dataGrouping, // #1228\n                    plotOptions[type].dataGrouping, // Set by the StockChart constructor\n                    itemOptions.dataGrouping\n                );\n            }\n\n            if (this.chart.options.isStock) {\n                this.requireSorting = true;\n            }\n\n            return options;\n        });\n\n\n        /**\n         * When resetting the scale reset the hasProccessed flag to avoid taking previous data grouping\n         * of neighbour series into accound when determining group pixel width (#2692).\n         */\n        wrap(Axis.prototype, 'setScale', function(proceed) {\n            proceed.call(this);\n            each(this.series, function(series) {\n                series.hasProcessed = false;\n            });\n        });\n\n        /**\n         * Get the data grouping pixel width based on the greatest defined individual width\n         * of the axis' series, and if whether one of the axes need grouping.\n         */\n        Axis.prototype.getGroupPixelWidth = function() {\n\n            var series = this.series,\n                len = series.length,\n                i,\n                groupPixelWidth = 0,\n                doGrouping = false,\n                dataLength,\n                dgOptions;\n\n            // If multiple series are compared on the same x axis, give them the same\n            // group pixel width (#334)\n            i = len;\n            while (i--) {\n                dgOptions = series[i].options.dataGrouping;\n                if (dgOptions) {\n                    groupPixelWidth = Math.max(groupPixelWidth, dgOptions.groupPixelWidth);\n\n                }\n            }\n\n            // If one of the series needs grouping, apply it to all (#1634)\n            i = len;\n            while (i--) {\n                dgOptions = series[i].options.dataGrouping;\n\n                if (dgOptions && series[i].hasProcessed) { // #2692\n\n                    dataLength = (series[i].processedXData || series[i].data).length;\n\n                    // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\n                    if (series[i].groupPixelWidth || dataLength > (this.chart.plotSizeX / groupPixelWidth) || (dataLength && dgOptions.forced)) {\n                        doGrouping = true;\n                    }\n                }\n            }\n\n            return doGrouping ? groupPixelWidth : 0;\n        };\n\n        /**\n         * Highstock only. Force data grouping on all the axis' series.\n         *\n         * @param  {SeriesDatagroupingOptions} [dataGrouping]\n         *         A `dataGrouping` configuration. Use `false` to disable data grouping\n         *         dynamically.\n         * @param  {Boolean} [redraw=true]\n         *         Whether to redraw the chart or wait for a later call to {@link\n         *         Chart#redraw}.\n         *\n         * @function setDataGrouping\n         * @memberOf Axis.prototype\n         */\n        Axis.prototype.setDataGrouping = function(dataGrouping, redraw) {\n            var i;\n\n            redraw = pick(redraw, true);\n\n            if (!dataGrouping) {\n                dataGrouping = {\n                    forced: false,\n                    units: null\n                };\n            }\n\n            // Axis is instantiated, update all series\n            if (this instanceof Axis) {\n                i = this.series.length;\n                while (i--) {\n                    this.series[i].update({\n                        dataGrouping: dataGrouping\n                    }, false);\n                }\n\n                // Axis not yet instanciated, alter series options\n            } else {\n                each(this.chart.options.series, function(seriesOptions) {\n                    seriesOptions.dataGrouping = dataGrouping;\n                }, false);\n            }\n\n            if (redraw) {\n                this.chart.redraw();\n            }\n        };\n\n\n\n        /* ****************************************************************************\n         * End data grouping module\t\t\t\t\t\t\t\t\t\t\t\t   *\n         ******************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var each = H.each,\n            Point = H.Point,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The ohlc series type.\n         *\n         * @constructor seriesTypes.ohlc\n         * @augments seriesTypes.column\n         */\n        seriesType('ohlc', 'column', {\n            lineWidth: 1,\n            tooltip: {\n\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> <b> {series.name}</b><br/>' +\n                    'Open: {point.open}<br/>' +\n                    'High: {point.high}<br/>' +\n                    'Low: {point.low}<br/>' +\n                    'Close: {point.close}<br/>'\n\n            },\n            threshold: null,\n\n            states: {\n                hover: {\n                    lineWidth: 3\n                }\n            },\n            stickyTracking: true\n            //upColor: undefined\n\n\n        }, /** @lends seriesTypes.ohlc */ {\n            directTouch: false,\n            pointArrayMap: ['open', 'high', 'low', 'close'], // array point configs are mapped to this\n            toYData: function(point) { // return a plain array for speedy calculation\n                return [point.open, point.high, point.low, point.close];\n            },\n            pointValKey: 'close',\n\n\n            pointAttrToOptions: {\n                'stroke': 'color',\n                'stroke-width': 'lineWidth'\n            },\n\n            /**\n             * Postprocess mapping between options and SVG attributes\n             */\n            pointAttribs: function(point, state) {\n                var attribs = seriesTypes.column.prototype.pointAttribs.call(\n                        this,\n                        point,\n                        state\n                    ),\n                    options = this.options;\n\n                delete attribs.fill;\n\n                if (!point.options.color &&\n                    options.upColor &&\n                    point.open < point.close\n                ) {\n                    attribs.stroke = options.upColor;\n                }\n\n                return attribs;\n            },\n\n\n            /**\n             * Translate data points from raw values x and y to plotX and plotY\n             */\n            translate: function() {\n                var series = this,\n                    yAxis = series.yAxis,\n                    hasModifyValue = !!series.modifyValue,\n                    translated = ['plotOpen', 'plotHigh', 'plotLow', 'plotClose', 'yBottom']; // translate OHLC for\n\n                seriesTypes.column.prototype.translate.apply(series);\n\n                // Do the translation\n                each(series.points, function(point) {\n                    each([point.open, point.high, point.low, point.close, point.low], function(value, i) {\n                        if (value !== null) {\n                            if (hasModifyValue) {\n                                value = series.modifyValue(value);\n                            }\n                            point[translated[i]] = yAxis.toPixels(value, true);\n                        }\n                    });\n\n                    // Align the tooltip to the high value to avoid covering the point\n                    point.tooltipPos[1] =\n                        point.plotHigh + yAxis.pos - series.chart.plotTop;\n                });\n            },\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart;\n\n\n                each(points, function(point) {\n                    var plotOpen,\n                        plotClose,\n                        crispCorr,\n                        halfWidth,\n                        path,\n                        graphic = point.graphic,\n                        crispX,\n                        isNew = !graphic;\n\n                    if (point.plotY !== undefined) {\n\n                        // Create and/or update the graphic\n                        if (!graphic) {\n                            point.graphic = graphic = chart.renderer.path()\n                                .add(series.group);\n                        }\n\n\n                        graphic.attr(series.pointAttribs(point, point.selected && 'select')); // #3897\n\n\n                        // crisp vector coordinates\n                        crispCorr = (graphic.strokeWidth() % 2) / 2;\n                        crispX = Math.round(point.plotX) - crispCorr; // #2596\n                        halfWidth = Math.round(point.shapeArgs.width / 2);\n\n                        // the vertical stem\n                        path = [\n                            'M',\n                            crispX, Math.round(point.yBottom),\n                            'L',\n                            crispX, Math.round(point.plotHigh)\n                        ];\n\n                        // open\n                        if (point.open !== null) {\n                            plotOpen = Math.round(point.plotOpen) + crispCorr;\n                            path.push(\n                                'M',\n                                crispX,\n                                plotOpen,\n                                'L',\n                                crispX - halfWidth,\n                                plotOpen\n                            );\n                        }\n\n                        // close\n                        if (point.close !== null) {\n                            plotClose = Math.round(point.plotClose) + crispCorr;\n                            path.push(\n                                'M',\n                                crispX,\n                                plotClose,\n                                'L',\n                                crispX + halfWidth,\n                                plotClose\n                            );\n                        }\n\n                        graphic[isNew ? 'attr' : 'animate']({\n                                d: path\n                            })\n                            .addClass(point.getClassName(), true);\n\n                    }\n\n\n                });\n\n            },\n\n            animate: null // Disable animation\n\n            /**\n             * @constructor seriesTypes.ohlc.prototype.pointClass\n             * @extends {Point}\n             */\n        }, /** @lends seriesTypes.ohlc.prototype.pointClass.prototype */ {\n            /**\n             * Extend the parent method by adding up or down to the class name.\n             */\n            getClassName: function() {\n                return Point.prototype.getClassName.call(this) +\n                    (this.open < this.close ? ' highcharts-point-up' : ' highcharts-point-down');\n            }\n        });\n        /* ****************************************************************************\n         * End OHLC series code\t\t\t\t\t\t\t\t\t\t\t\t\t   *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var defaultPlotOptions = H.defaultPlotOptions,\n            each = H.each,\n            merge = H.merge,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes;\n\n        /**\n         * The candlestick series type.\n         *\n         * @constructor seriesTypes.candlestick\n         * @augments seriesTypes.ohlc\n         */\n        seriesType('candlestick', 'ohlc', merge(defaultPlotOptions.column, {\n            states: {\n                hover: {\n                    lineWidth: 2\n                }\n            },\n            tooltip: defaultPlotOptions.ohlc.tooltip,\n            threshold: null,\n\n            lineColor: '#000000',\n            lineWidth: 1,\n            upColor: '#ffffff',\n            stickyTracking: true\n            // upLineColor: null\n\n\n        }), /** @lends seriesTypes.candlestick */ {\n\n            /**\n             * Postprocess mapping between options and SVG attributes\n             */\n            pointAttribs: function(point, state) {\n                var attribs = seriesTypes.column.prototype.pointAttribs.call(this, point, state),\n                    options = this.options,\n                    isUp = point.open < point.close,\n                    stroke = options.lineColor || this.color,\n                    stateOptions;\n\n                attribs['stroke-width'] = options.lineWidth;\n\n                attribs.fill = point.options.color || (isUp ? (options.upColor || this.color) : this.color);\n                attribs.stroke = point.lineColor || (isUp ? (options.upLineColor || stroke) : stroke);\n\n                // Select or hover states\n                if (state) {\n                    stateOptions = options.states[state];\n                    attribs.fill = stateOptions.color || attribs.fill;\n                    attribs.stroke = stateOptions.lineColor || attribs.stroke;\n                    attribs['stroke-width'] =\n                        stateOptions.lineWidth || attribs['stroke-width'];\n                }\n\n\n                return attribs;\n            },\n\n            /**\n             * Draw the data points\n             */\n            drawPoints: function() {\n                var series = this, //state = series.state,\n                    points = series.points,\n                    chart = series.chart;\n\n\n                each(points, function(point) {\n\n                    var graphic = point.graphic,\n                        plotOpen,\n                        plotClose,\n                        topBox,\n                        bottomBox,\n                        hasTopWhisker,\n                        hasBottomWhisker,\n                        crispCorr,\n                        crispX,\n                        path,\n                        halfWidth,\n                        isNew = !graphic;\n\n                    if (point.plotY !== undefined) {\n\n                        if (!graphic) {\n                            point.graphic = graphic = chart.renderer.path()\n                                .add(series.group);\n                        }\n\n\n                        graphic\n                            .attr(series.pointAttribs(point, point.selected && 'select')) // #3897\n                            .shadow(series.options.shadow);\n\n\n                        // Crisp vector coordinates\n                        crispCorr = (graphic.strokeWidth() % 2) / 2;\n                        crispX = Math.round(point.plotX) - crispCorr; // #2596\n                        plotOpen = point.plotOpen;\n                        plotClose = point.plotClose;\n                        topBox = Math.min(plotOpen, plotClose);\n                        bottomBox = Math.max(plotOpen, plotClose);\n                        halfWidth = Math.round(point.shapeArgs.width / 2);\n                        hasTopWhisker = Math.round(topBox) !== Math.round(point.plotHigh);\n                        hasBottomWhisker = bottomBox !== point.yBottom;\n                        topBox = Math.round(topBox) + crispCorr;\n                        bottomBox = Math.round(bottomBox) + crispCorr;\n\n                        // Create the path. Due to a bug in Chrome 49, the path is first instanciated\n                        // with no values, then the values pushed. For unknown reasons, instanciated\n                        // the path array with all the values would lead to a crash when updating\n                        // frequently (#5193).\n                        path = [];\n                        path.push(\n                            'M',\n                            crispX - halfWidth, bottomBox,\n                            'L',\n                            crispX - halfWidth, topBox,\n                            'L',\n                            crispX + halfWidth, topBox,\n                            'L',\n                            crispX + halfWidth, bottomBox,\n                            'Z', // Use a close statement to ensure a nice rectangle #2602\n                            'M',\n                            crispX, topBox,\n                            'L',\n                            crispX, hasTopWhisker ? Math.round(point.plotHigh) : topBox, // #460, #2094\n                            'M',\n                            crispX, bottomBox,\n                            'L',\n                            crispX, hasBottomWhisker ? Math.round(point.yBottom) : bottomBox // #460, #2094\n                        );\n\n                        graphic[isNew ? 'attr' : 'animate']({\n                                d: path\n                            })\n                            .addClass(point.getClassName(), true);\n\n                    }\n                });\n\n            }\n\n\n        });\n\n        /* ****************************************************************************\n         * End Candlestick series code\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            each = H.each,\n            merge = H.merge,\n            noop = H.noop,\n            Renderer = H.Renderer,\n            Series = H.Series,\n            seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes,\n            SVGRenderer = H.SVGRenderer,\n            TrackerMixin = H.TrackerMixin,\n            VMLRenderer = H.VMLRenderer,\n            symbols = SVGRenderer.prototype.symbols,\n            stableSort = H.stableSort;\n\n        /**\n         * The flags series type.\n         *\n         * @constructor seriesTypes.flags\n         * @augments seriesTypes.column\n         */\n        seriesType('flags', 'column', {\n            pointRange: 0, // #673\n            //radius: 2,\n            shape: 'flag',\n            stackDistance: 12,\n            textAlign: 'center',\n            tooltip: {\n                pointFormat: '{point.text}<br/>'\n            },\n            threshold: null,\n            y: -30,\n\n            fillColor: '#ffffff',\n            // lineColor: color,\n            lineWidth: 1,\n            states: {\n                hover: {\n                    lineColor: '#000000',\n                    fillColor: '#ccd6eb'\n                }\n            },\n            style: {\n                fontSize: '11px',\n                fontWeight: 'bold'\n            }\n\n\n        }, /** @lends seriesTypes.flags.prototype */ {\n            sorted: false,\n            noSharedTooltip: true,\n            allowDG: false,\n            takeOrdinalPosition: false, // #1074\n            trackerGroups: ['markerGroup'],\n            forceCrop: true,\n            /**\n             * Inherit the initialization from base Series.\n             */\n            init: Series.prototype.init,\n\n\n            /**\n             * Get presentational attributes\n             */\n            pointAttribs: function(point, state) {\n                var options = this.options,\n                    color = (point && point.color) || this.color,\n                    lineColor = options.lineColor,\n                    lineWidth = (point && point.lineWidth),\n                    fill = (point && point.fillColor) || options.fillColor;\n\n                if (state) {\n                    fill = options.states[state].fillColor;\n                    lineColor = options.states[state].lineColor;\n                    lineWidth = options.states[state].lineWidth;\n                }\n\n                return {\n                    'fill': fill || color,\n                    'stroke': lineColor || color,\n                    'stroke-width': lineWidth || options.lineWidth || 0\n                };\n            },\n\n\n            /**\n             * Extend the translate method by placing the point on the related series\n             */\n            translate: function() {\n\n                seriesTypes.column.prototype.translate.apply(this);\n\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    points = series.points,\n                    cursor = points.length - 1,\n                    point,\n                    lastPoint,\n                    optionsOnSeries = options.onSeries,\n                    onSeries = optionsOnSeries && chart.get(optionsOnSeries),\n                    onKey = options.onKey || 'y',\n                    step = onSeries && onSeries.options.step,\n                    onData = onSeries && onSeries.points,\n                    i = onData && onData.length,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    xAxisExt = xAxis.getExtremes(),\n                    xOffset = 0,\n                    leftPoint,\n                    lastX,\n                    rightPoint,\n                    currentDataGrouping;\n\n                // relate to a master series\n                if (onSeries && onSeries.visible && i) {\n                    xOffset = (onSeries.pointXOffset || 0) + (onSeries.barW || 0) / 2;\n                    currentDataGrouping = onSeries.currentDataGrouping;\n                    lastX = onData[i - 1].x + (currentDataGrouping ? currentDataGrouping.totalRange : 0); // #2374\n\n                    // sort the data points\n                    stableSort(points, function(a, b) {\n                        return (a.x - b.x);\n                    });\n\n                    onKey = 'plot' + onKey[0].toUpperCase() + onKey.substr(1);\n                    while (i-- && points[cursor]) {\n                        point = points[cursor];\n                        leftPoint = onData[i];\n                        if (leftPoint.x <= point.x && leftPoint[onKey] !== undefined) {\n                            if (point.x <= lastX) { // #803\n\n                                point.plotY = leftPoint[onKey];\n\n                                // interpolate between points, #666\n                                if (leftPoint.x < point.x && !step) {\n                                    rightPoint = onData[i + 1];\n                                    if (rightPoint && rightPoint[onKey] !== undefined) {\n                                        point.plotY +=\n                                            ((point.x - leftPoint.x) / (rightPoint.x - leftPoint.x)) * // the distance ratio, between 0 and 1\n                                            (rightPoint[onKey] - leftPoint[onKey]); // the y distance\n                                    }\n                                }\n                            }\n                            cursor--;\n                            i++; // check again for points in the same x position\n                            if (cursor < 0) {\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                // Add plotY position and handle stacking\n                each(points, function(point, i) {\n\n                    var stackIndex;\n\n                    // Undefined plotY means the point is either on axis, outside series\n                    // range or hidden series. If the series is outside the range of the\n                    // x axis it should fall through with an undefined plotY, but then\n                    // we must remove the shapeArgs (#847).\n                    if (point.plotY === undefined) {\n                        if (point.x >= xAxisExt.min && point.x <= xAxisExt.max) {\n                            // we're inside xAxis range\n                            point.plotY = chart.chartHeight - xAxis.bottom -\n                                (xAxis.opposite ? xAxis.height : 0) +\n                                xAxis.offset - yAxis.top; // #3517\n                        } else {\n                            point.shapeArgs = {}; // 847\n                        }\n                    }\n                    point.plotX += xOffset; // #2049\n                    // if multiple flags appear at the same x, order them into a stack\n                    lastPoint = points[i - 1];\n                    if (lastPoint && lastPoint.plotX === point.plotX) {\n                        if (lastPoint.stackIndex === undefined) {\n                            lastPoint.stackIndex = 0;\n                        }\n                        stackIndex = lastPoint.stackIndex + 1;\n                    }\n                    point.stackIndex = stackIndex; // #3639\n                });\n\n\n            },\n\n            /**\n             * Draw the markers\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    plotX,\n                    plotY,\n                    options = series.options,\n                    optionsY = options.y,\n                    shape,\n                    i,\n                    point,\n                    graphic,\n                    stackIndex,\n                    anchorX,\n                    anchorY,\n                    outsideRight,\n                    yAxis = series.yAxis;\n\n                i = points.length;\n                while (i--) {\n                    point = points[i];\n                    outsideRight = point.plotX > series.xAxis.len;\n                    plotX = point.plotX;\n                    stackIndex = point.stackIndex;\n                    shape = point.options.shape || options.shape;\n                    plotY = point.plotY;\n\n                    if (plotY !== undefined) {\n                        plotY = point.plotY + optionsY - (stackIndex !== undefined && stackIndex * options.stackDistance);\n                    }\n                    anchorX = stackIndex ? undefined : point.plotX; // skip connectors for higher level stacked points\n                    anchorY = stackIndex ? undefined : point.plotY;\n\n                    graphic = point.graphic;\n\n                    // Only draw the point if y is defined and the flag is within the visible area\n                    if (plotY !== undefined && plotX >= 0 && !outsideRight) {\n\n                        // Create the flag\n                        if (!graphic) {\n                            graphic = point.graphic = renderer.label(\n                                    '',\n                                    null,\n                                    null,\n                                    shape,\n                                    null,\n                                    null,\n                                    options.useHTML\n                                )\n\n                                .attr(series.pointAttribs(point))\n                                .css(merge(options.style, point.style))\n\n                                .attr({\n                                    align: shape === 'flag' ? 'left' : 'center',\n                                    width: options.width,\n                                    height: options.height,\n                                    'text-align': options.textAlign\n                                })\n                                .addClass('highcharts-point')\n                                .add(series.markerGroup);\n\n                            // Add reference to the point for tracker (#6303)\n                            if (point.graphic.div) {\n                                point.graphic.div.point = point;\n                            }\n\n\n                            graphic.shadow(options.shadow);\n\n                        }\n\n                        if (plotX > 0) { // #3119\n                            plotX -= graphic.strokeWidth() % 2; // #4285\n                        }\n\n                        // Plant the flag\n                        graphic.attr({\n                            text: point.options.title || options.title || 'A',\n                            x: plotX,\n                            y: plotY,\n                            anchorX: anchorX,\n                            anchorY: anchorY\n                        });\n\n                        // Set the tooltip anchor position\n                        point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - plotX] : [plotX, plotY + yAxis.pos - chart.plotTop]; // #6327\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy();\n                    }\n\n                }\n\n                // Might be a mix of SVG and HTML and we need events for both (#6303)\n                if (options.useHTML) {\n                    H.wrap(series.markerGroup, 'on', function(proceed) {\n                        return H.SVGElement.prototype.on.apply(\n                            proceed.apply(this, [].slice.call(arguments, 1)), // for HTML\n                            [].slice.call(arguments, 1)); // and for SVG\n                    });\n                }\n\n            },\n\n            /**\n             * Extend the column trackers with listeners to expand and contract stacks\n             */\n            drawTracker: function() {\n                var series = this,\n                    points = series.points;\n\n                TrackerMixin.drawTrackerPoint.apply(this);\n\n                // Bring each stacked flag up on mouse over, this allows readability of vertically\n                // stacked elements as well as tight points on the x axis. #1924.\n                each(points, function(point) {\n                    var graphic = point.graphic;\n                    if (graphic) {\n                        addEvent(graphic.element, 'mouseover', function() {\n\n                            // Raise this point\n                            if (point.stackIndex > 0 && !point.raised) {\n                                point._y = graphic.y;\n                                graphic.attr({\n                                    y: point._y - 8\n                                });\n                                point.raised = true;\n                            }\n\n                            // Revert other raised points\n                            each(points, function(otherPoint) {\n                                if (otherPoint !== point && otherPoint.raised && otherPoint.graphic) {\n                                    otherPoint.graphic.attr({\n                                        y: otherPoint._y\n                                    });\n                                    otherPoint.raised = false;\n                                }\n                            });\n                        });\n                    }\n                });\n            },\n\n            animate: noop, // Disable animation\n            buildKDTree: noop,\n            setClip: noop\n\n        });\n\n        // create the flag icon with anchor\n        symbols.flag = function(x, y, w, h, options) {\n            var anchorX = (options && options.anchorX) || x,\n                anchorY = (options && options.anchorY) || y;\n\n            return [\n                'M', anchorX, anchorY,\n                'L', x, y + h,\n                x, y,\n                x + w, y,\n                x + w, y + h,\n                x, y + h,\n                'Z'\n            ];\n        };\n\n        // create the circlepin and squarepin icons with anchor\n        each(['circle', 'square'], function(shape) {\n            symbols[shape + 'pin'] = function(x, y, w, h, options) {\n\n                var anchorX = options && options.anchorX,\n                    anchorY = options && options.anchorY,\n                    path,\n                    labelTopOrBottomY;\n\n                // For single-letter flags, make sure circular flags are not taller than their width\n                if (shape === 'circle' && h > w) {\n                    x -= Math.round((h - w) / 2);\n                    w = h;\n                }\n\n                path = symbols[shape](x, y, w, h);\n\n                if (anchorX && anchorY) {\n                    // if the label is below the anchor, draw the connecting line from the top edge of the label\n                    // otherwise start drawing from the bottom edge\n                    labelTopOrBottomY = (y > anchorY) ? y : y + h;\n                    path.push('M', anchorX, labelTopOrBottomY, 'L', anchorX, anchorY);\n                }\n\n                return path;\n            };\n        });\n\n\n        // The symbol callbacks are generated on the SVGRenderer object in all browsers. Even\n        // VML browsers need this in order to generate shapes in export. Now share\n        // them with the VMLRenderer.\n        if (Renderer === VMLRenderer) {\n            each(['flag', 'circlepin', 'squarepin'], function(shape) {\n                VMLRenderer.prototype.symbols[shape] = symbols[shape];\n            });\n        }\n\n        /* ****************************************************************************\n         * End Flags series code\t\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            correctFloat = H.correctFloat,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            doc = H.doc,\n            each = H.each,\n            fireEvent = H.fireEvent,\n            hasTouch = H.hasTouch,\n            isTouchDevice = H.isTouchDevice,\n            merge = H.merge,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            svg = H.svg,\n            wrap = H.wrap,\n            swapXY;\n\n        var defaultScrollbarOptions = {\n            //enabled: true\n            height: isTouchDevice ? 20 : 14,\n            // trackBorderRadius: 0\n            barBorderRadius: 0,\n            buttonBorderRadius: 0,\n            liveRedraw: svg && !isTouchDevice,\n            margin: 10,\n            minWidth: 6,\n            //showFull: true,\n            //size: null,\n            step: 0.2,\n            zIndex: 3,\n\n            barBackgroundColor: '#cccccc',\n            barBorderWidth: 1,\n            barBorderColor: '#cccccc',\n            buttonArrowColor: '#333333',\n            buttonBackgroundColor: '#e6e6e6',\n            buttonBorderColor: '#cccccc',\n            buttonBorderWidth: 1,\n            rifleColor: '#333333',\n            trackBackgroundColor: '#f2f2f2',\n            trackBorderColor: '#f2f2f2',\n            trackBorderWidth: 1\n\n        };\n\n        defaultOptions.scrollbar = merge(true, defaultScrollbarOptions, defaultOptions.scrollbar);\n\n        /**\n         * When we have vertical scrollbar, rifles and arrow in buttons should be rotated.\n         * The same method is used in Navigator's handles, to rotate them.\n         * @param {Array} path - path to be rotated\n         * @param {Boolean} vertical - if vertical scrollbar, swap x-y values\n         */\n        H.swapXY = swapXY = function(path, vertical) {\n            var i,\n                len = path.length,\n                temp;\n\n            if (vertical) {\n                for (i = 0; i < len; i += 3) {\n                    temp = path[i + 1];\n                    path[i + 1] = path[i + 2];\n                    path[i + 2] = temp;\n                }\n            }\n\n            return path;\n        };\n\n        /**\n         * A reusable scrollbar, internally used in Highstock's navigator and optionally\n         * on individual axes.\n         *\n         * @class\n         * @param {Object} renderer\n         * @param {Object} options\n         * @param {Object} chart\n         */\n        function Scrollbar(renderer, options, chart) { // docs\n            this.init(renderer, options, chart);\n        }\n\n        Scrollbar.prototype = {\n\n            init: function(renderer, options, chart) {\n\n                this.scrollbarButtons = [];\n\n                this.renderer = renderer;\n\n                this.userOptions = options;\n                this.options = merge(defaultScrollbarOptions, options);\n\n                this.chart = chart;\n\n                this.size = pick(this.options.size, this.options.height); // backward compatibility\n\n                // Init\n                if (options.enabled) {\n                    this.render();\n                    this.initEvents();\n                    this.addEvents();\n                }\n            },\n\n            /**\n             * Render scrollbar with all required items.\n             */\n            render: function() {\n                var scroller = this,\n                    renderer = scroller.renderer,\n                    options = scroller.options,\n                    size = scroller.size,\n                    group;\n\n                // Draw the scrollbar group\n                scroller.group = group = renderer.g('scrollbar').attr({\n                    zIndex: options.zIndex,\n                    translateY: -99999\n                }).add();\n\n                // Draw the scrollbar track:\n                scroller.track = renderer.rect()\n                    .addClass('highcharts-scrollbar-track')\n                    .attr({\n                        x: 0,\n                        r: options.trackBorderRadius || 0,\n                        height: size,\n                        width: size\n                    }).add(group);\n\n\n                scroller.track.attr({\n                    fill: options.trackBackgroundColor,\n                    stroke: options.trackBorderColor,\n                    'stroke-width': options.trackBorderWidth\n                });\n\n                this.trackBorderWidth = scroller.track.strokeWidth();\n                scroller.track.attr({\n                    y: -this.trackBorderWidth % 2 / 2\n                });\n\n\n                // Draw the scrollbar itself\n                scroller.scrollbarGroup = renderer.g().add(group);\n\n                scroller.scrollbar = renderer.rect()\n                    .addClass('highcharts-scrollbar-thumb')\n                    .attr({\n                        height: size,\n                        width: size,\n                        r: options.barBorderRadius || 0\n                    }).add(scroller.scrollbarGroup);\n\n                scroller.scrollbarRifles = renderer.path(\n                        swapXY([\n                            'M', -3, size / 4,\n                            'L', -3, 2 * size / 3,\n                            'M',\n                            0, size / 4,\n                            'L',\n                            0, 2 * size / 3,\n                            'M',\n                            3, size / 4,\n                            'L',\n                            3, 2 * size / 3\n                        ], options.vertical))\n                    .addClass('highcharts-scrollbar-rifles')\n                    .add(scroller.scrollbarGroup);\n\n\n                scroller.scrollbar.attr({\n                    fill: options.barBackgroundColor,\n                    stroke: options.barBorderColor,\n                    'stroke-width': options.barBorderWidth\n                });\n                scroller.scrollbarRifles.attr({\n                    stroke: options.rifleColor,\n                    'stroke-width': 1\n                });\n\n                scroller.scrollbarStrokeWidth = scroller.scrollbar.strokeWidth();\n                scroller.scrollbarGroup.translate(-scroller.scrollbarStrokeWidth % 2 / 2, -scroller.scrollbarStrokeWidth % 2 / 2);\n\n                // Draw the buttons:\n                scroller.drawScrollbarButton(0);\n                scroller.drawScrollbarButton(1);\n            },\n\n            /**\n             * Position the scrollbar, method called from a parent with defined dimensions\n             * @param {Number} x - x-position on the chart\n             * @param {Number} y - y-position on the chart\n             * @param {Number} width - width of the scrollbar\n             * @param {Number} height - height of the scorllbar\n             */\n            position: function(x, y, width, height) {\n                var scroller = this,\n                    options = scroller.options,\n                    vertical = options.vertical,\n                    xOffset = height,\n                    yOffset = 0,\n                    method = scroller.rendered ? 'animate' : 'attr';\n\n                scroller.x = x;\n                scroller.y = y + this.trackBorderWidth;\n                scroller.width = width; // width with buttons\n                scroller.height = height;\n                scroller.xOffset = xOffset;\n                scroller.yOffset = yOffset;\n\n                // If Scrollbar is a vertical type, swap options:\n                if (vertical) {\n                    scroller.width = scroller.yOffset = width = yOffset = scroller.size;\n                    scroller.xOffset = xOffset = 0;\n                    scroller.barWidth = height - width * 2; // width without buttons\n                    scroller.x = x = x + scroller.options.margin;\n                } else {\n                    scroller.height = scroller.xOffset = height = xOffset = scroller.size;\n                    scroller.barWidth = width - height * 2; // width without buttons\n                    scroller.y = scroller.y + scroller.options.margin;\n                }\n\n                // Set general position for a group:\n                scroller.group[method]({\n                    translateX: x,\n                    translateY: scroller.y\n                });\n\n                // Resize background/track:\n                scroller.track[method]({\n                    width: width,\n                    height: height\n                });\n\n                // Move right/bottom button ot it's place:\n                scroller.scrollbarButtons[1][method]({\n                    translateX: vertical ? 0 : width - xOffset,\n                    translateY: vertical ? height - yOffset : 0\n                });\n            },\n\n            /**\n             * Draw the scrollbar buttons with arrows\n             * @param {Number} index 0 is left, 1 is right\n             */\n            drawScrollbarButton: function(index) {\n                var scroller = this,\n                    renderer = scroller.renderer,\n                    scrollbarButtons = scroller.scrollbarButtons,\n                    options = scroller.options,\n                    size = scroller.size,\n                    group,\n                    tempElem;\n\n                group = renderer.g().add(scroller.group);\n                scrollbarButtons.push(group);\n\n                // Create a rectangle for the scrollbar button\n                tempElem = renderer.rect()\n                    .addClass('highcharts-scrollbar-button')\n                    .add(group);\n\n\n                // Presentational attributes\n                tempElem.attr({\n                    stroke: options.buttonBorderColor,\n                    'stroke-width': options.buttonBorderWidth,\n                    fill: options.buttonBackgroundColor\n                });\n\n\n                // Place the rectangle based on the rendered stroke width\n                tempElem.attr(tempElem.crisp({\n                    x: -0.5,\n                    y: -0.5,\n                    width: size + 1, // +1 to compensate for crispifying in rect method\n                    height: size + 1,\n                    r: options.buttonBorderRadius\n                }, tempElem.strokeWidth()));\n\n                // Button arrow\n                tempElem = renderer\n                    .path(swapXY([\n                        'M',\n                        size / 2 + (index ? -1 : 1),\n                        size / 2 - 3,\n                        'L',\n                        size / 2 + (index ? -1 : 1),\n                        size / 2 + 3,\n                        'L',\n                        size / 2 + (index ? 2 : -2),\n                        size / 2\n                    ], options.vertical))\n                    .addClass('highcharts-scrollbar-arrow')\n                    .add(scrollbarButtons[index]);\n\n\n                tempElem.attr({\n                    fill: options.buttonArrowColor\n                });\n\n            },\n\n            /**\n             * Set scrollbar size, with a given scale.\n             * @param {Number} from - scale (0-1) where bar should start\n             * @param {Number} to - scale (0-1) where bar should end\n             */\n            setRange: function(from, to) {\n                var scroller = this,\n                    options = scroller.options,\n                    vertical = options.vertical,\n                    minWidth = options.minWidth,\n                    fullWidth = scroller.barWidth,\n                    fromPX,\n                    toPX,\n                    newPos,\n                    newSize,\n                    newRiflesPos,\n                    method = this.rendered && !this.hasDragged ? 'animate' : 'attr';\n\n                if (!defined(fullWidth)) {\n                    return;\n                }\n\n                from = Math.max(from, 0);\n                fromPX = Math.ceil(fullWidth * from);\n                toPX = fullWidth * Math.min(to, 1);\n                scroller.calculatedWidth = newSize = correctFloat(toPX - fromPX);\n\n                // We need to recalculate position, if minWidth is used\n                if (newSize < minWidth) {\n                    fromPX = (fullWidth - minWidth + newSize) * from;\n                    newSize = minWidth;\n                }\n                newPos = Math.floor(fromPX + scroller.xOffset + scroller.yOffset);\n                newRiflesPos = newSize / 2 - 0.5; // -0.5 -> rifle line width / 2\n\n                // Store current position:\n                scroller.from = from;\n                scroller.to = to;\n\n                if (!vertical) {\n                    scroller.scrollbarGroup[method]({\n                        translateX: newPos\n                    });\n                    scroller.scrollbar[method]({\n                        width: newSize\n                    });\n                    scroller.scrollbarRifles[method]({\n                        translateX: newRiflesPos\n                    });\n                    scroller.scrollbarLeft = newPos;\n                    scroller.scrollbarTop = 0;\n                } else {\n                    scroller.scrollbarGroup[method]({\n                        translateY: newPos\n                    });\n                    scroller.scrollbar[method]({\n                        height: newSize\n                    });\n                    scroller.scrollbarRifles[method]({\n                        translateY: newRiflesPos\n                    });\n                    scroller.scrollbarTop = newPos;\n                    scroller.scrollbarLeft = 0;\n                }\n\n                if (newSize <= 12) {\n                    scroller.scrollbarRifles.hide();\n                } else {\n                    scroller.scrollbarRifles.show(true);\n                }\n\n                // Show or hide the scrollbar based on the showFull setting\n                if (options.showFull === false) {\n                    if (from <= 0 && to >= 1) {\n                        scroller.group.hide();\n                    } else {\n                        scroller.group.show();\n                    }\n                }\n\n                scroller.rendered = true;\n            },\n\n            /**\n             * Init events methods, so we have an access to the Scrollbar itself\n             */\n            initEvents: function() {\n                var scroller = this;\n                /**\n                 * Event handler for the mouse move event.\n                 */\n                scroller.mouseMoveHandler = function(e) {\n                    var normalizedEvent = scroller.chart.pointer.normalize(e),\n                        options = scroller.options,\n                        direction = options.vertical ? 'chartY' : 'chartX',\n                        initPositions = scroller.initPositions,\n                        scrollPosition,\n                        chartPosition,\n                        change;\n\n                    // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\n                    // down in the center of the scrollbar. This should be ignored.\n                    if (scroller.grabbedCenter && (!e.touches || e.touches[0][direction] !== 0)) { // #4696, scrollbar failed on Android\n                        chartPosition = scroller.cursorToScrollbarPosition(normalizedEvent)[direction];\n                        scrollPosition = scroller[direction];\n\n                        change = chartPosition - scrollPosition;\n\n                        scroller.hasDragged = true;\n                        scroller.updatePosition(initPositions[0] + change, initPositions[1] + change);\n\n                        if (scroller.hasDragged) {\n                            fireEvent(scroller, 'changed', {\n                                from: scroller.from,\n                                to: scroller.to,\n                                trigger: 'scrollbar',\n                                DOMType: e.type,\n                                DOMEvent: e\n                            });\n                        }\n                    }\n                };\n\n                /**\n                 * Event handler for the mouse up event.\n                 */\n                scroller.mouseUpHandler = function(e) {\n                    if (scroller.hasDragged) {\n                        fireEvent(scroller, 'changed', {\n                            from: scroller.from,\n                            to: scroller.to,\n                            trigger: 'scrollbar',\n                            DOMType: e.type,\n                            DOMEvent: e\n                        });\n                    }\n                    scroller.grabbedCenter = scroller.hasDragged = scroller.chartX = scroller.chartY = null;\n                };\n\n                scroller.mouseDownHandler = function(e) {\n                    var normalizedEvent = scroller.chart.pointer.normalize(e),\n                        mousePosition = scroller.cursorToScrollbarPosition(normalizedEvent);\n\n                    scroller.chartX = mousePosition.chartX;\n                    scroller.chartY = mousePosition.chartY;\n                    scroller.initPositions = [scroller.from, scroller.to];\n\n                    scroller.grabbedCenter = true;\n                };\n\n                scroller.buttonToMinClick = function(e) {\n                    var range = correctFloat(scroller.to - scroller.from) * scroller.options.step;\n                    scroller.updatePosition(correctFloat(scroller.from - range), correctFloat(scroller.to - range));\n                    fireEvent(scroller, 'changed', {\n                        from: scroller.from,\n                        to: scroller.to,\n                        trigger: 'scrollbar',\n                        DOMEvent: e\n                    });\n                };\n\n                scroller.buttonToMaxClick = function(e) {\n                    var range = (scroller.to - scroller.from) * scroller.options.step;\n                    scroller.updatePosition(scroller.from + range, scroller.to + range);\n                    fireEvent(scroller, 'changed', {\n                        from: scroller.from,\n                        to: scroller.to,\n                        trigger: 'scrollbar',\n                        DOMEvent: e\n                    });\n                };\n\n                scroller.trackClick = function(e) {\n                    var normalizedEvent = scroller.chart.pointer.normalize(e),\n                        range = scroller.to - scroller.from,\n                        top = scroller.y + scroller.scrollbarTop,\n                        left = scroller.x + scroller.scrollbarLeft;\n\n                    if ((scroller.options.vertical && normalizedEvent.chartY > top) ||\n                        (!scroller.options.vertical && normalizedEvent.chartX > left)) {\n                        // On the top or on the left side of the track:\n                        scroller.updatePosition(scroller.from + range, scroller.to + range);\n                    } else {\n                        // On the bottom or the right side of the track:\n                        scroller.updatePosition(scroller.from - range, scroller.to - range);\n                    }\n\n                    fireEvent(scroller, 'changed', {\n                        from: scroller.from,\n                        to: scroller.to,\n                        trigger: 'scrollbar',\n                        DOMEvent: e\n                    });\n                };\n            },\n\n            /**\n             * Get normalized (0-1) cursor position over the scrollbar\n             * @param {Event} normalizedEvent - normalized event, with chartX and chartY values\n             * @return {Object} Local position {chartX, chartY}\n             */\n            cursorToScrollbarPosition: function(normalizedEvent) {\n                var scroller = this,\n                    options = scroller.options,\n                    minWidthDifference = options.minWidth > scroller.calculatedWidth ? options.minWidth : 0; // minWidth distorts translation\n\n                return {\n                    chartX: (normalizedEvent.chartX - scroller.x - scroller.xOffset) / (scroller.barWidth - minWidthDifference),\n                    chartY: (normalizedEvent.chartY - scroller.y - scroller.yOffset) / (scroller.barWidth - minWidthDifference)\n                };\n            },\n\n            /**\n             * Update position option in the Scrollbar, with normalized 0-1 scale\n             */\n            updatePosition: function(from, to) {\n                if (to > 1) {\n                    from = correctFloat(1 - correctFloat(to - from));\n                    to = 1;\n                }\n\n                if (from < 0) {\n                    to = correctFloat(to - from);\n                    from = 0;\n                }\n\n                this.from = from;\n                this.to = to;\n            },\n\n            /**\n             * Update the scrollbar with new options\n             */\n            update: function(options) {\n                this.destroy();\n                this.init(this.chart.renderer, merge(true, this.options, options), this.chart);\n            },\n\n            /**\n             * Set up the mouse and touch events for the Scrollbar\n             */\n            addEvents: function() {\n                var buttonsOrder = this.options.inverted ? [1, 0] : [0, 1],\n                    buttons = this.scrollbarButtons,\n                    bar = this.scrollbarGroup.element,\n                    track = this.track.element,\n                    mouseDownHandler = this.mouseDownHandler,\n                    mouseMoveHandler = this.mouseMoveHandler,\n                    mouseUpHandler = this.mouseUpHandler,\n                    _events;\n\n                // Mouse events\n                _events = [\n                    [buttons[buttonsOrder[0]].element, 'click', this.buttonToMinClick],\n                    [buttons[buttonsOrder[1]].element, 'click', this.buttonToMaxClick],\n                    [track, 'click', this.trackClick],\n                    [bar, 'mousedown', mouseDownHandler],\n                    [doc, 'mousemove', mouseMoveHandler],\n                    [doc, 'mouseup', mouseUpHandler]\n                ];\n\n                // Touch events\n                if (hasTouch) {\n                    _events.push(\n                        [bar, 'touchstart', mouseDownHandler], [doc, 'touchmove', mouseMoveHandler], [doc, 'touchend', mouseUpHandler]\n                    );\n                }\n\n                // Add them all\n                each(_events, function(args) {\n                    addEvent.apply(null, args);\n                });\n                this._events = _events;\n            },\n\n            /**\n             * Removes the event handlers attached previously with addEvents.\n             */\n            removeEvents: function() {\n                each(this._events, function(args) {\n                    removeEvent.apply(null, args);\n                });\n                this._events.length = 0;\n            },\n\n            /**\n             * Destroys allocated elements.\n             */\n            destroy: function() {\n\n                var scroller = this.chart.scroller;\n\n                // Disconnect events added in addEvents\n                this.removeEvents();\n\n                // Destroy properties\n                each(['track', 'scrollbarRifles', 'scrollbar', 'scrollbarGroup', 'group'], function(prop) {\n                    if (this[prop] && this[prop].destroy) {\n                        this[prop] = this[prop].destroy();\n                    }\n                }, this);\n\n                if (scroller && this === scroller.scrollbar) { // #6421, chart may have more scrollbars\n                    scroller.scrollbar = null;\n\n                    // Destroy elements in collection\n                    destroyObjectProperties(scroller.scrollbarButtons);\n                }\n            }\n        };\n\n        /**\n         * Wrap axis initialization and create scrollbar if enabled:\n         */\n        wrap(Axis.prototype, 'init', function(proceed) {\n            var axis = this;\n            proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n            if (axis.options.scrollbar && axis.options.scrollbar.enabled) {\n                // Predefined options:\n                axis.options.scrollbar.vertical = !axis.horiz;\n                axis.options.startOnTick = axis.options.endOnTick = false;\n\n                axis.scrollbar = new Scrollbar(axis.chart.renderer, axis.options.scrollbar, axis.chart);\n\n                addEvent(axis.scrollbar, 'changed', function(e) {\n                    var unitedMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),\n                        unitedMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),\n                        range = unitedMax - unitedMin,\n                        to,\n                        from;\n\n                    if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {\n                        to = unitedMin + range * this.to;\n                        from = unitedMin + range * this.from;\n                    } else {\n                        // y-values in browser are reversed, but this also applies for reversed horizontal axis:\n                        to = unitedMin + range * (1 - this.from);\n                        from = unitedMin + range * (1 - this.to);\n                    }\n\n                    axis.setExtremes(from, to, true, false, e);\n                });\n            }\n        });\n\n        /**\n         * Wrap rendering axis, and update scrollbar if one is created:\n         */\n        wrap(Axis.prototype, 'render', function(proceed) {\n            var axis = this,\n                scrollMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),\n                scrollMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),\n                scrollbar = axis.scrollbar,\n                titleOffset = axis.titleOffset || 0,\n                offsetsIndex,\n                from,\n                to;\n\n            proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n            if (scrollbar) {\n\n                if (axis.horiz) {\n                    scrollbar.position(\n                        axis.left,\n                        axis.top + axis.height + 2 + axis.chart.scrollbarsOffsets[1] +\n                        (axis.opposite ?\n                            0 :\n                            titleOffset + axis.axisTitleMargin + axis.offset\n                        ),\n                        axis.width,\n                        axis.height\n                    );\n                    offsetsIndex = 1;\n                } else {\n                    scrollbar.position(\n                        axis.left + axis.width + 2 + axis.chart.scrollbarsOffsets[0] +\n                        (axis.opposite ?\n                            titleOffset + axis.axisTitleMargin + axis.offset :\n                            0\n                        ),\n                        axis.top,\n                        axis.width,\n                        axis.height\n                    );\n                    offsetsIndex = 0;\n                }\n\n                if ((!axis.opposite && !axis.horiz) || (axis.opposite && axis.horiz)) {\n                    axis.chart.scrollbarsOffsets[offsetsIndex] +=\n                        axis.scrollbar.size + axis.scrollbar.options.margin;\n                }\n\n                if (isNaN(scrollMin) || isNaN(scrollMax) || !defined(axis.min) || !defined(axis.max)) {\n                    scrollbar.setRange(0, 0); // default action: when there is not extremes on the axis, but scrollbar exists, make it full size\n                } else {\n                    from = (axis.min - scrollMin) / (scrollMax - scrollMin);\n                    to = (axis.max - scrollMin) / (scrollMax - scrollMin);\n\n                    if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {\n                        scrollbar.setRange(from, to);\n                    } else {\n                        scrollbar.setRange(1 - to, 1 - from); // inverse vertical axis\n                    }\n                }\n            }\n        });\n\n        /**\n         * Make space for a scrollbar\n         */\n        wrap(Axis.prototype, 'getOffset', function(proceed) {\n            var axis = this,\n                index = axis.horiz ? 2 : 1,\n                scrollbar = axis.scrollbar;\n\n            proceed.apply(axis, Array.prototype.slice.call(arguments, 1));\n\n            if (scrollbar) {\n                axis.chart.scrollbarsOffsets = [0, 0]; // reset scrollbars offsets\n                axis.chart.axisOffset[index] += scrollbar.size + scrollbar.options.margin;\n            }\n        });\n\n        /**\n         * Destroy scrollbar when connected to the specific axis\n         */\n        wrap(Axis.prototype, 'destroy', function(proceed) {\n            if (this.scrollbar) {\n                this.scrollbar = this.scrollbar.destroy();\n            }\n\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        H.Scrollbar = Scrollbar;\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        /* ****************************************************************************\n         * Start Navigator code\t\t\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            color = H.color,\n            defaultDataGroupingUnits = H.defaultDataGroupingUnits,\n            defaultOptions = H.defaultOptions,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            doc = H.doc,\n            each = H.each,\n            erase = H.erase,\n            error = H.error,\n            extend = H.extend,\n            grep = H.grep,\n            hasTouch = H.hasTouch,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            pick = H.pick,\n            removeEvent = H.removeEvent,\n            Scrollbar = H.Scrollbar,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n            swapXY = H.swapXY,\n\n            units = [].concat(defaultDataGroupingUnits), // copy\n            defaultSeriesType,\n\n            // Finding the min or max of a set of variables where we don't know if they are defined,\n            // is a pattern that is repeated several places in Highcharts. Consider making this\n            // a global utility method.\n            numExt = function(extreme) {\n                var numbers = grep(arguments, isNumber);\n                if (numbers.length) {\n                    return Math[extreme].apply(0, numbers);\n                }\n            };\n\n        // add more resolution to units\n        units[4] = ['day', [1, 2, 3, 4]]; // allow more days\n        units[5] = ['week', [1, 2, 3]]; // allow more weeks\n\n        defaultSeriesType = seriesTypes.areaspline === undefined ? 'line' : 'areaspline';\n\n        extend(defaultOptions, {\n            navigator: {\n                //enabled: true,\n                height: 40,\n                margin: 25,\n                maskInside: true,\n\n                handles: {\n                    backgroundColor: '#f2f2f2',\n                    borderColor: '#999999'\n                },\n                maskFill: color('#6685c2').setOpacity(0.3).get(),\n                outlineColor: '#cccccc',\n                outlineWidth: 1,\n\n                series: {\n                    type: defaultSeriesType,\n\n                    color: '#335cad',\n                    fillOpacity: 0.05,\n                    lineWidth: 1,\n\n                    compare: null,\n                    dataGrouping: {\n                        approximation: 'average',\n                        enabled: true,\n                        groupPixelWidth: 2,\n                        smoothed: true,\n                        units: units\n                    },\n                    dataLabels: {\n                        enabled: false,\n                        zIndex: 2 // #1839\n                    },\n                    id: 'highcharts-navigator-series',\n                    className: 'highcharts-navigator-series',\n                    lineColor: null, // Allow color setting while disallowing default candlestick setting (#4602)\n                    marker: {\n                        enabled: false\n                    },\n                    pointRange: 0,\n                    shadow: false,\n                    threshold: null\n                },\n                //top: undefined,\n                //opposite: undefined,\n                xAxis: {\n                    className: 'highcharts-navigator-xaxis',\n                    tickLength: 0,\n\n                    lineWidth: 0,\n                    gridLineColor: '#e6e6e6',\n                    gridLineWidth: 1,\n\n                    tickPixelInterval: 200,\n                    labels: {\n                        align: 'left',\n\n                        style: {\n                            color: '#999999'\n                        },\n\n                        x: 3,\n                        y: -4\n                    },\n                    crosshair: false\n                },\n                yAxis: {\n                    className: 'highcharts-navigator-yaxis',\n\n                    gridLineWidth: 0,\n\n                    startOnTick: false,\n                    endOnTick: false,\n                    minPadding: 0.1,\n                    maxPadding: 0.1,\n                    labels: {\n                        enabled: false\n                    },\n                    crosshair: false,\n                    title: {\n                        text: null\n                    },\n                    tickLength: 0,\n                    tickWidth: 0\n                }\n            }\n        });\n\n        /**\n         * The Navigator class\n         * @param {Object} chart - Chart object\n         * @class\n         */\n        function Navigator(chart) {\n            this.init(chart);\n        }\n\n        Navigator.prototype = {\n            /**\n             * Draw one of the handles on the side of the zoomed range in the navigator\n             * @param {Number} x The x center for the handle\n             * @param {Number} index 0 for left and 1 for right\n             * @param {Boolean} inverted flag for chart.inverted\n             * @param {String} verb use 'animate' or 'attr'\n             */\n            drawHandle: function(x, index, inverted, verb) {\n                var navigator = this;\n\n                // Place it\n                navigator.handles[index][verb](inverted ? {\n                    translateX: Math.round(navigator.left + navigator.height / 2 - 8),\n                    translateY: Math.round(navigator.top + parseInt(x, 10) + 0.5)\n                } : {\n                    translateX: Math.round(navigator.left + parseInt(x, 10)),\n                    translateY: Math.round(navigator.top + navigator.height / 2 - 8)\n                });\n            },\n\n            /**\n             * Draw one of the handles on the side of the zoomed range in the navigator\n             * @param {Boolean} inverted flag for chart.inverted\n             * @returns {Array} Path to be used in a handle\n             */\n            getHandlePath: function(inverted) {\n                return swapXY([\n                    'M', -4.5, 0.5,\n                    'L',\n                    3.5, 0.5,\n                    'L',\n                    3.5, 15.5,\n                    'L', -4.5, 15.5,\n                    'L', -4.5, 0.5,\n                    'M', -1.5, 4,\n                    'L', -1.5, 12,\n                    'M',\n                    0.5, 4,\n                    'L',\n                    0.5, 12\n                ], inverted);\n            },\n            /**\n             * Render outline around the zoomed range\n             * @param {Number} zoomedMin in pixels position where zoomed range starts\n             * @param {Number} zoomedMax in pixels position where zoomed range ends\n             * @param {Boolean} inverted flag if chart is inverted\n             * @param {String} verb use 'animate' or 'attr'\n             */\n            drawOutline: function(zoomedMin, zoomedMax, inverted, verb) {\n                var navigator = this,\n                    maskInside = navigator.navigatorOptions.maskInside,\n                    outlineWidth = navigator.outline.strokeWidth(),\n                    halfOutline = outlineWidth / 2,\n                    outlineCorrection = (outlineWidth % 2) / 2, // #5800\n                    outlineHeight = navigator.outlineHeight,\n                    scrollbarHeight = navigator.scrollbarHeight,\n                    navigatorSize = navigator.size,\n                    left = navigator.left - scrollbarHeight,\n                    navigatorTop = navigator.top,\n                    verticalMin,\n                    path;\n\n                if (inverted) {\n                    left -= halfOutline;\n                    verticalMin = navigatorTop + zoomedMax + outlineCorrection;\n                    zoomedMax = navigatorTop + zoomedMin + outlineCorrection;\n\n                    path = [\n                        'M',\n                        left + outlineHeight,\n                        navigatorTop - scrollbarHeight - outlineCorrection, // top edge\n                        'L',\n                        left + outlineHeight,\n                        verticalMin, // top right of zoomed range\n                        'L',\n                        left,\n                        verticalMin, // top left of z.r.\n                        'L',\n                        left,\n                        zoomedMax, // bottom left of z.r.\n                        'L',\n                        left + outlineHeight,\n                        zoomedMax, // bottom right of z.r.\n                        'L',\n                        left + outlineHeight,\n                        navigatorTop + navigatorSize + scrollbarHeight // bottom edge\n                    ].concat(maskInside ? [\n                        'M',\n                        left + outlineHeight,\n                        verticalMin - halfOutline, // upper left of zoomed range\n                        'L',\n                        left + outlineHeight,\n                        zoomedMax + halfOutline // upper right of z.r.\n                    ] : []);\n                } else {\n                    zoomedMin += left + scrollbarHeight - outlineCorrection;\n                    zoomedMax += left + scrollbarHeight - outlineCorrection;\n                    navigatorTop += halfOutline;\n\n                    path = [\n                        'M',\n                        left,\n                        navigatorTop, // left\n                        'L',\n                        zoomedMin,\n                        navigatorTop, // upper left of zoomed range\n                        'L',\n                        zoomedMin,\n                        navigatorTop + outlineHeight, // lower left of z.r.\n                        'L',\n                        zoomedMax,\n                        navigatorTop + outlineHeight, // lower right of z.r.\n                        'L',\n                        zoomedMax,\n                        navigatorTop, // upper right of z.r.\n                        'L',\n                        left + navigatorSize + scrollbarHeight * 2,\n                        navigatorTop // right\n                    ].concat(maskInside ? [\n                        'M',\n                        zoomedMin - halfOutline,\n                        navigatorTop, // upper left of zoomed range\n                        'L',\n                        zoomedMax + halfOutline,\n                        navigatorTop // upper right of z.r.\n                    ] : []);\n                }\n                navigator.outline[verb]({\n                    d: path\n                });\n            },\n\n            /**\n             * Render outline around the zoomed range\n             * @param {Number} zoomedMin in pixels position where zoomed range starts\n             * @param {Number} zoomedMax in pixels position where zoomed range ends\n             * @param {Boolean} inverted flag if chart is inverted\n             * @param {String} verb use 'animate' or 'attr'\n             */\n            drawMasks: function(zoomedMin, zoomedMax, inverted, verb) {\n                var navigator = this,\n                    left = navigator.left,\n                    top = navigator.top,\n                    navigatorHeight = navigator.height,\n                    height,\n                    width,\n                    x,\n                    y;\n\n                // Determine rectangle position & size \n                // According to (non)inverted position:\n                if (inverted) {\n                    x = [left, left, left];\n                    y = [top, top + zoomedMin, top + zoomedMax];\n                    width = [navigatorHeight, navigatorHeight, navigatorHeight];\n                    height = [\n                        zoomedMin,\n                        zoomedMax - zoomedMin,\n                        navigator.size - zoomedMax\n                    ];\n                } else {\n                    x = [left, left + zoomedMin, left + zoomedMax];\n                    y = [top, top, top];\n                    width = [\n                        zoomedMin,\n                        zoomedMax - zoomedMin,\n                        navigator.size - zoomedMax\n                    ];\n                    height = [navigatorHeight, navigatorHeight, navigatorHeight];\n                }\n                each(navigator.shades, function(shade, i) {\n                    shade[verb]({\n                        x: x[i],\n                        y: y[i],\n                        width: width[i],\n                        height: height[i]\n                    });\n                });\n            },\n\n            /**\n             * Generate DOM elements for a navigator:\n             * - main navigator group\n             * - all shades\n             * - outline\n             * - handles\n             */\n            renderElements: function() {\n                var navigator = this,\n                    navigatorOptions = navigator.navigatorOptions,\n                    maskInside = navigatorOptions.maskInside,\n                    chart = navigator.chart,\n                    inverted = chart.inverted,\n                    renderer = chart.renderer,\n                    navigatorGroup;\n\n                // Create the main navigator group\n                navigator.navigatorGroup = navigatorGroup = renderer.g('navigator')\n                    .attr({\n                        zIndex: 8,\n                        visibility: 'hidden'\n                    })\n                    .add();\n\n\n\n                var mouseCursor = {\n                    cursor: inverted ? 'ns-resize' : 'ew-resize'\n                };\n\n\n                // Create masks, each mask will get events and fill:\n                each([!maskInside, maskInside, !maskInside], function(hasMask, index) {\n                    navigator.shades[index] = renderer.rect()\n                        .addClass('highcharts-navigator-mask' +\n                            (index === 1 ? '-inside' : '-outside'))\n\n                        .attr({\n                            fill: hasMask ? navigatorOptions.maskFill : 'rgba(0,0,0,0)'\n                        })\n                        .css(index === 1 && mouseCursor)\n\n                        .add(navigatorGroup);\n                });\n\n                // Create the outline:\n                navigator.outline = renderer.path()\n                    .addClass('highcharts-navigator-outline')\n\n                    .attr({\n                        'stroke-width': navigatorOptions.outlineWidth,\n                        stroke: navigatorOptions.outlineColor\n                    })\n\n                    .add(navigatorGroup);\n\n                // Create the handlers:\n                each([0, 1], function(index) {\n                    navigator.handles[index] = renderer\n                        .path(navigator.getHandlePath(inverted))\n                        // zIndex = 6 for right handle, 7 for left.\n                        // Can't be 10, because of the tooltip in inverted chart #2908\n                        .attr({\n                            zIndex: 7 - index\n                        })\n                        .addClass(\n                            'highcharts-navigator-handle highcharts-navigator-handle-' + ['left', 'right'][index]\n                        ).add(navigatorGroup);\n\n\n                    var handlesOptions = navigatorOptions.handles;\n                    navigator.handles[index]\n                        .attr({\n                            fill: handlesOptions.backgroundColor,\n                            stroke: handlesOptions.borderColor,\n                            'stroke-width': 1\n                        })\n                        .css(mouseCursor);\n\n                });\n            },\n\n            /**\n             * Update navigator\n             * @param {Object} options Options to merge in when updating navigator\n             */\n            update: function(options) {\n                this.destroy();\n                var chartOptions = this.chart.options;\n                merge(true, chartOptions.navigator, this.options, options);\n                this.init(this.chart);\n            },\n\n            /**\n             * Render the navigator\n             * @param {Number} min X axis value minimum\n             * @param {Number} max X axis value maximum\n             * @param {Number} pxMin Pixel value minimum\n             * @param {Number} pxMax Pixel value maximum\n             */\n            render: function(min, max, pxMin, pxMax) {\n                var navigator = this,\n                    chart = navigator.chart,\n                    navigatorWidth,\n                    scrollbarLeft,\n                    scrollbarTop,\n                    scrollbarHeight = navigator.scrollbarHeight,\n                    navigatorSize,\n                    xAxis = navigator.xAxis,\n                    scrollbarXAxis = xAxis.fake ? chart.xAxis[0] : xAxis,\n                    navigatorEnabled = navigator.navigatorEnabled,\n                    zoomedMin,\n                    zoomedMax,\n                    rendered = navigator.rendered,\n                    inverted = chart.inverted,\n                    verb,\n                    newMin,\n                    newMax,\n                    minRange = chart.xAxis[0].minRange;\n\n                // Don't redraw while moving the handles (#4703).\n                if (this.hasDragged && !defined(pxMin)) {\n                    return;\n                }\n\n                // Don't render the navigator until we have data (#486, #4202, #5172).\n                if (!isNumber(min) || !isNumber(max)) {\n                    // However, if navigator was already rendered, we may need to resize\n                    // it. For example hidden series, but visible navigator (#6022).\n                    if (rendered) {\n                        pxMin = 0;\n                        pxMax = xAxis.width;\n                    } else {\n                        return;\n                    }\n                }\n\n                navigator.left = pick(\n                    xAxis.left,\n                    // in case of scrollbar only, without navigator\n                    chart.plotLeft + scrollbarHeight + (inverted ? chart.plotWidth : 0)\n                );\n\n                navigator.size = zoomedMax = navigatorSize = pick(\n                    xAxis.len,\n                    (inverted ? chart.plotHeight : chart.plotWidth) - 2 * scrollbarHeight\n                );\n\n                if (inverted) {\n                    navigatorWidth = scrollbarHeight;\n                } else {\n                    navigatorWidth = navigatorSize + 2 * scrollbarHeight;\n                }\n\n                // Get the pixel position of the handles\n                pxMin = pick(pxMin, xAxis.toPixels(min, true));\n                pxMax = pick(pxMax, xAxis.toPixels(max, true));\n\n                if (!isNumber(pxMin) || Math.abs(pxMin) === Infinity) { // Verify (#1851, #2238)\n                    pxMin = 0;\n                    pxMax = navigatorWidth;\n                }\n\n                // Are we below the minRange? (#2618, #6191)\n                newMin = xAxis.toValue(pxMin, true);\n                newMax = xAxis.toValue(pxMax, true);\n                if (Math.abs(newMax - newMin) < minRange) {\n                    if (this.grabbedLeft) {\n                        pxMin = xAxis.toPixels(newMax - minRange, true);\n                    } else if (this.grabbedRight) {\n                        pxMax = xAxis.toPixels(newMin + minRange, true);\n                    } else {\n                        return;\n                    }\n                }\n\n                // Handles are allowed to cross, but never exceed the plot area\n                navigator.zoomedMax = Math.min(Math.max(pxMin, pxMax, 0), zoomedMax);\n                navigator.zoomedMin = Math.min(\n                    Math.max(\n                        navigator.fixedWidth ?\n                        navigator.zoomedMax - navigator.fixedWidth :\n                        Math.min(pxMin, pxMax),\n                        0\n                    ),\n                    zoomedMax\n                );\n\n                navigator.range = navigator.zoomedMax - navigator.zoomedMin;\n\n                zoomedMax = Math.round(navigator.zoomedMax);\n                zoomedMin = Math.round(navigator.zoomedMin);\n\n                if (navigatorEnabled) {\n                    navigator.navigatorGroup.attr({\n                        visibility: 'visible'\n                    });\n                    // Place elements\n                    verb = rendered && !navigator.hasDragged ? 'animate' : 'attr';\n\n                    navigator.drawMasks(zoomedMin, zoomedMax, inverted, verb);\n                    navigator.drawOutline(zoomedMin, zoomedMax, inverted, verb);\n                    navigator.drawHandle(zoomedMin, 0, inverted, verb);\n                    navigator.drawHandle(zoomedMax, 1, inverted, verb);\n                }\n\n                if (navigator.scrollbar) {\n                    if (inverted) {\n                        scrollbarTop = navigator.top - scrollbarHeight;\n                        scrollbarLeft = navigator.left - scrollbarHeight +\n                            (navigatorEnabled || !scrollbarXAxis.opposite ? 0 :\n                                // Multiple axes has offsets:\n                                (scrollbarXAxis.titleOffset || 0) +\n                                // Self margin from the axis.title\n                                scrollbarXAxis.axisTitleMargin\n                            );\n                        scrollbarHeight = navigatorSize + 2 * scrollbarHeight;\n                    } else {\n                        scrollbarTop = navigator.top +\n                            (navigatorEnabled ? navigator.height : -scrollbarHeight);\n                        scrollbarLeft = navigator.left - scrollbarHeight;\n                    }\n                    // Reposition scrollbar\n                    navigator.scrollbar.position(\n                        scrollbarLeft,\n                        scrollbarTop,\n                        navigatorWidth,\n                        scrollbarHeight\n                    );\n                    // Keep scale 0-1\n                    navigator.scrollbar.setRange(\n                        // Use real value, not rounded because range can be very small (#1716)\n                        navigator.zoomedMin / navigatorSize,\n                        navigator.zoomedMax / navigatorSize\n                    );\n                }\n                navigator.rendered = true;\n            },\n\n            /**\n             * Set up the mouse and touch events for the navigator\n             */\n            addMouseEvents: function() {\n                var navigator = this,\n                    chart = navigator.chart,\n                    container = chart.container,\n                    eventsToUnbind = [],\n                    mouseMoveHandler,\n                    mouseUpHandler;\n\n                /**\n                 * Create mouse events' handlers.\n                 * Make them as separate functions to enable wrapping them:\n                 */\n                navigator.mouseMoveHandler = mouseMoveHandler = function(e) {\n                    navigator.onMouseMove(e);\n                };\n                navigator.mouseUpHandler = mouseUpHandler = function(e) {\n                    navigator.onMouseUp(e);\n                };\n\n                // Add shades and handles mousedown events\n                eventsToUnbind = navigator.getPartsEvents('mousedown');\n                // Add mouse move and mouseup events. These are bind to doc/container,\n                // because Navigator.grabbedSomething flags are stored in mousedown events:\n                eventsToUnbind.push(\n                    addEvent(container, 'mousemove', mouseMoveHandler),\n                    addEvent(doc, 'mouseup', mouseUpHandler)\n                );\n\n                // Touch events\n                if (hasTouch) {\n                    eventsToUnbind.push(\n                        addEvent(container, 'touchmove', mouseMoveHandler),\n                        addEvent(doc, 'touchend', mouseUpHandler)\n                    );\n                    eventsToUnbind.concat(navigator.getPartsEvents('touchstart'));\n                }\n\n                navigator.eventsToUnbind = eventsToUnbind;\n\n                // Data events\n                if (navigator.series && navigator.series[0]) {\n                    eventsToUnbind.push(\n                        addEvent(navigator.series[0].xAxis, 'foundExtremes', function() {\n                            chart.navigator.modifyNavigatorAxisExtremes();\n                        })\n                    );\n                }\n            },\n\n            /**\n             * Generate events for handles and masks\n             * @param {String} eventName Event name handler, 'mousedown' or 'touchstart'\n             * @returns {Array} An array of arrays: [DOMElement, eventName, callback].\n             */\n            getPartsEvents: function(eventName) {\n                var navigator = this,\n                    events = [];\n                each(['shades', 'handles'], function(name) {\n                    each(navigator[name], function(navigatorItem, index) {\n                        events.push(\n                            addEvent(\n                                navigatorItem.element,\n                                eventName,\n                                function(e) {\n                                    navigator[name + 'Mousedown'](e, index);\n                                }\n                            )\n                        );\n                    });\n                });\n                return events;\n            },\n\n            /**\n             * Mousedown on a shaded mask, either:\n             * - will be stored for future drag&drop \n             * - will directly shift to a new range\n             *\n             * @param {Object} e Mouse event\n             * @param {Number} index Index of a mask in Navigator.shades array\n             */\n            shadesMousedown: function(e, index) {\n                e = this.chart.pointer.normalize(e);\n\n                var navigator = this,\n                    chart = navigator.chart,\n                    xAxis = navigator.xAxis,\n                    zoomedMin = navigator.zoomedMin,\n                    navigatorPosition = navigator.left,\n                    navigatorSize = navigator.size,\n                    range = navigator.range,\n                    chartX = e.chartX,\n                    fixedMax,\n                    ext,\n                    left;\n\n                // For inverted chart, swap some options:\n                if (chart.inverted) {\n                    chartX = e.chartY;\n                    navigatorPosition = navigator.top;\n                }\n\n                if (index === 1) {\n                    // Store information for drag&drop\n                    navigator.grabbedCenter = chartX;\n                    navigator.fixedWidth = range;\n                    navigator.dragOffset = chartX - zoomedMin;\n                } else {\n                    // Shift the range by clicking on shaded areas\n                    left = chartX - navigatorPosition - range / 2;\n                    if (index === 0) {\n                        left = Math.max(0, left);\n                    } else if (index === 2 && left + range >= navigatorSize) {\n                        left = navigatorSize - range;\n                        fixedMax = navigator.getUnionExtremes().dataMax; // #2293, #3543\n                    }\n                    if (left !== zoomedMin) { // it has actually moved\n                        navigator.fixedWidth = range; // #1370\n\n                        ext = xAxis.toFixedRange(left, left + range, null, fixedMax);\n                        chart.xAxis[0].setExtremes(\n                            Math.min(ext.min, ext.max),\n                            Math.max(ext.min, ext.max),\n                            true,\n                            null, // auto animation\n                            {\n                                trigger: 'navigator'\n                            }\n                        );\n                    }\n                }\n            },\n\n            /**\n             * Mousedown on a handle mask.\n             * Will store necessary information for drag&drop.\n             *\n             * @param {Object} e Mouse event\n             * @param {Number} index Index of a handle in Navigator.handles array\n             */\n            handlesMousedown: function(e, index) {\n                e = this.chart.pointer.normalize(e);\n\n                var navigator = this,\n                    chart = navigator.chart,\n                    baseXAxis = chart.xAxis[0],\n                    // For reversed axes, min and max are chagned,\n                    // so the other extreme should be stored\n                    reverse = (chart.inverted && !baseXAxis.reversed) ||\n                    (!chart.inverted && baseXAxis.reversed);\n\n                if (index === 0) {\n                    // Grab the left handle\n                    navigator.grabbedLeft = true;\n                    navigator.otherHandlePos = navigator.zoomedMax;\n                    navigator.fixedExtreme = reverse ? baseXAxis.min : baseXAxis.max;\n                } else {\n                    // Grab the right handle\n                    navigator.grabbedRight = true;\n                    navigator.otherHandlePos = navigator.zoomedMin;\n                    navigator.fixedExtreme = reverse ? baseXAxis.max : baseXAxis.min;\n                }\n\n                chart.fixedRange = null;\n            },\n            /**\n             * Mouse move event based on x/y mouse position.\n             * @param {Object} e Mouse event\n             */\n            onMouseMove: function(e) {\n                var navigator = this,\n                    chart = navigator.chart,\n                    left = navigator.left,\n                    navigatorSize = navigator.navigatorSize,\n                    range = navigator.range,\n                    dragOffset = navigator.dragOffset,\n                    inverted = chart.inverted,\n                    chartX;\n\n\n                // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\n                // down in the center of the scrollbar. This should be ignored.\n                if (!e.touches || e.touches[0].pageX !== 0) { // #4696, scrollbar failed on Android\n\n                    e = chart.pointer.normalize(e);\n                    chartX = e.chartX;\n\n                    // Swap some options for inverted chart\n                    if (inverted) {\n                        left = navigator.top;\n                        chartX = e.chartY;\n                    }\n\n                    // Drag left handle or top handle\n                    if (navigator.grabbedLeft) {\n                        navigator.hasDragged = true;\n                        navigator.render(\n                            0,\n                            0,\n                            chartX - left,\n                            navigator.otherHandlePos\n                        );\n                        // Drag right handle or bottom handle\n                    } else if (navigator.grabbedRight) {\n                        navigator.hasDragged = true;\n                        navigator.render(\n                            0,\n                            0,\n                            navigator.otherHandlePos,\n                            chartX - left\n                        );\n                        // Drag scrollbar or open area in navigator\n                    } else if (navigator.grabbedCenter) {\n                        navigator.hasDragged = true;\n                        if (chartX < dragOffset) { // outside left\n                            chartX = dragOffset;\n                        } else if (chartX > navigatorSize + dragOffset - range) { // outside right\n                            chartX = navigatorSize + dragOffset - range;\n                        }\n\n                        navigator.render(\n                            0,\n                            0,\n                            chartX - dragOffset,\n                            chartX - dragOffset + range\n                        );\n                    }\n                    if (navigator.hasDragged && navigator.scrollbar && navigator.scrollbar.options.liveRedraw) {\n                        e.DOMType = e.type; // DOMType is for IE8 because it can't read type async\n                        setTimeout(function() {\n                            navigator.onMouseUp(e);\n                        }, 0);\n                    }\n                }\n            },\n\n            /**\n             * Mouse up event based on x/y mouse position.\n             * @param {Object} e Mouse event\n             */\n            onMouseUp: function(e) {\n                var navigator = this,\n                    chart = navigator.chart,\n                    xAxis = navigator.xAxis,\n                    scrollbar = navigator.scrollbar,\n                    fixedMin,\n                    fixedMax,\n                    ext,\n                    DOMEvent = e.DOMEvent || e;\n\n                if (\n                    // MouseUp is called for both, navigator and scrollbar (that order),\n                    // which causes calling afterSetExtremes twice. Prevent first call\n                    // by checking if scrollbar is going to set new extremes (#6334)\n                    (navigator.hasDragged && (!scrollbar || !scrollbar.hasDragged)) ||\n                    e.trigger === 'scrollbar'\n                ) {\n                    // When dragging one handle, make sure the other one doesn't change\n                    if (navigator.zoomedMin === navigator.otherHandlePos) {\n                        fixedMin = navigator.fixedExtreme;\n                    } else if (navigator.zoomedMax === navigator.otherHandlePos) {\n                        fixedMax = navigator.fixedExtreme;\n                    }\n                    // Snap to right edge (#4076)\n                    if (navigator.zoomedMax === navigator.size) {\n                        fixedMax = navigator.getUnionExtremes().dataMax;\n                    }\n                    ext = xAxis.toFixedRange(\n                        navigator.zoomedMin,\n                        navigator.zoomedMax,\n                        fixedMin,\n                        fixedMax\n                    );\n\n                    if (defined(ext.min)) {\n                        chart.xAxis[0].setExtremes(\n                            Math.min(ext.min, ext.max),\n                            Math.max(ext.min, ext.max),\n                            true,\n                            navigator.hasDragged ? false : null, // Run animation when clicking buttons, scrollbar track etc, but not when dragging handles or scrollbar\n                            {\n                                trigger: 'navigator',\n                                triggerOp: 'navigator-drag',\n                                DOMEvent: DOMEvent // #1838\n                            }\n                        );\n                    }\n                }\n\n                if (e.DOMType !== 'mousemove') {\n                    navigator.grabbedLeft = navigator.grabbedRight =\n                        navigator.grabbedCenter = navigator.fixedWidth =\n                        navigator.fixedExtreme = navigator.otherHandlePos =\n                        navigator.hasDragged = navigator.dragOffset = null;\n                }\n            },\n\n            /**\n             * Removes the event handlers attached previously with addEvents.\n             */\n            removeEvents: function() {\n                if (this.eventsToUnbind) {\n                    each(this.eventsToUnbind, function(unbind) {\n                        unbind();\n                    });\n                    this.eventsToUnbind = undefined;\n                }\n                this.removeBaseSeriesEvents();\n            },\n\n            /**\n             * Remove data events.\n             */\n            removeBaseSeriesEvents: function() {\n                var baseSeries = this.baseSeries || [];\n                if (this.navigatorEnabled && baseSeries[0] && this.navigatorOptions.adaptToUpdatedData !== false) {\n                    each(baseSeries, function(series) {\n                        removeEvent(series, 'updatedData', this.updatedDataHandler);\n                    }, this);\n\n                    // We only listen for extremes-events on the first baseSeries\n                    if (baseSeries[0].xAxis) {\n                        removeEvent(baseSeries[0].xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n                    }\n                }\n            },\n\n            /**\n             * Initiate the Navigator object\n             */\n            init: function(chart) {\n                var chartOptions = chart.options,\n                    navigatorOptions = chartOptions.navigator,\n                    navigatorEnabled = navigatorOptions.enabled,\n                    scrollbarOptions = chartOptions.scrollbar,\n                    scrollbarEnabled = scrollbarOptions.enabled,\n                    height = navigatorEnabled ? navigatorOptions.height : 0,\n                    scrollbarHeight = scrollbarEnabled ? scrollbarOptions.height : 0;\n\n                this.handles = [];\n                this.shades = [];\n\n                this.chart = chart;\n                this.setBaseSeries();\n\n                this.height = height;\n                this.scrollbarHeight = scrollbarHeight;\n                this.scrollbarEnabled = scrollbarEnabled;\n                this.navigatorEnabled = navigatorEnabled;\n                this.navigatorOptions = navigatorOptions;\n                this.scrollbarOptions = scrollbarOptions;\n                this.outlineHeight = height + scrollbarHeight;\n\n                this.opposite = pick(navigatorOptions.opposite, !navigatorEnabled && chart.inverted); // #6262\n\n                var navigator = this,\n                    baseSeries = navigator.baseSeries,\n                    xAxisIndex = chart.xAxis.length,\n                    yAxisIndex = chart.yAxis.length,\n                    baseXaxis = baseSeries && baseSeries[0] && baseSeries[0].xAxis || chart.xAxis[0];\n\n                // Make room for the navigator, can be placed around the chart:\n                chart.extraMargin = {\n                    type: navigator.opposite ? 'plotTop' : 'marginBottom',\n                    value: (navigatorEnabled || !chart.inverted ? navigator.outlineHeight : 0) + navigatorOptions.margin\n                };\n                if (chart.inverted) {\n                    chart.extraMargin.type = navigator.opposite ? 'marginRight' : 'plotLeft';\n                }\n                chart.isDirtyBox = true;\n\n                if (navigator.navigatorEnabled) {\n                    // an x axis is required for scrollbar also\n                    navigator.xAxis = new Axis(chart, merge({\n                        // inherit base xAxis' break and ordinal options\n                        breaks: baseXaxis.options.breaks,\n                        ordinal: baseXaxis.options.ordinal\n                    }, navigatorOptions.xAxis, {\n                        id: 'navigator-x-axis',\n                        yAxis: 'navigator-y-axis',\n                        isX: true,\n                        type: 'datetime',\n                        index: xAxisIndex,\n                        offset: 0,\n                        keepOrdinalPadding: true, // #2436\n                        startOnTick: false,\n                        endOnTick: false,\n                        minPadding: 0,\n                        maxPadding: 0,\n                        zoomEnabled: false\n                    }, chart.inverted ? {\n                        offsets: [scrollbarHeight, 0, -scrollbarHeight, 0],\n                        width: height\n                    } : {\n                        offsets: [0, -scrollbarHeight, 0, scrollbarHeight],\n                        height: height\n                    }));\n\n                    navigator.yAxis = new Axis(chart, merge(navigatorOptions.yAxis, {\n                        id: 'navigator-y-axis',\n                        alignTicks: false,\n                        offset: 0,\n                        index: yAxisIndex,\n                        zoomEnabled: false\n                    }, chart.inverted ? {\n                        width: height\n                    } : {\n                        height: height\n                    }));\n\n                    // If we have a base series, initialize the navigator series\n                    if (baseSeries || navigatorOptions.series.data) {\n                        navigator.addBaseSeries();\n\n                        // If not, set up an event to listen for added series\n                    } else if (chart.series.length === 0) {\n\n                        wrap(chart, 'redraw', function(proceed, animation) {\n                            // We've got one, now add it as base and reset chart.redraw\n                            if (chart.series.length > 0 && !navigator.series) {\n                                navigator.setBaseSeries();\n                                chart.redraw = proceed; // reset\n                            }\n                            proceed.call(chart, animation);\n                        });\n                    }\n\n                    // Render items, so we can bind events to them:\n                    navigator.renderElements();\n                    // Add mouse events\n                    navigator.addMouseEvents();\n\n                    // in case of scrollbar only, fake an x axis to get translation\n                } else {\n                    navigator.xAxis = {\n                        translate: function(value, reverse) {\n                            var axis = chart.xAxis[0],\n                                ext = axis.getExtremes(),\n                                scrollTrackWidth = axis.len - 2 * scrollbarHeight,\n                                min = numExt('min', axis.options.min, ext.dataMin),\n                                valueRange = numExt('max', axis.options.max, ext.dataMax) - min;\n\n                            return reverse ?\n                                // from pixel to value\n                                (value * valueRange / scrollTrackWidth) + min :\n                                // from value to pixel\n                                scrollTrackWidth * (value - min) / valueRange;\n                        },\n                        toPixels: function(value) {\n                            return this.translate(value);\n                        },\n                        toValue: function(value) {\n                            return this.translate(value, true);\n                        },\n                        toFixedRange: Axis.prototype.toFixedRange,\n                        fake: true\n                    };\n                }\n\n\n                // Initialize the scrollbar\n                if (chart.options.scrollbar.enabled) {\n                    chart.scrollbar = navigator.scrollbar = new Scrollbar(\n                        chart.renderer,\n                        merge(chart.options.scrollbar, {\n                            margin: navigator.navigatorEnabled ? 0 : 10,\n                            vertical: chart.inverted\n                        }),\n                        chart\n                    );\n                    addEvent(navigator.scrollbar, 'changed', function(e) {\n                        var range = navigator.size,\n                            to = range * this.to,\n                            from = range * this.from;\n\n                        navigator.hasDragged = navigator.scrollbar.hasDragged;\n                        navigator.render(0, 0, from, to);\n\n                        if (chart.options.scrollbar.liveRedraw || e.DOMType !== 'mousemove') {\n                            setTimeout(function() {\n                                navigator.onMouseUp(e);\n                            });\n                        }\n                    });\n                }\n\n                // Add data events\n                navigator.addBaseSeriesEvents();\n                // Add redraw events\n                navigator.addChartEvents();\n            },\n\n            /**\n             * Get the union data extremes of the chart - the outer data extremes of the base\n             * X axis and the navigator axis.\n             * @param {boolean} returnFalseOnNoBaseSeries - as the param says.\n             */\n            getUnionExtremes: function(returnFalseOnNoBaseSeries) {\n                var baseAxis = this.chart.xAxis[0],\n                    navAxis = this.xAxis,\n                    navAxisOptions = navAxis.options,\n                    baseAxisOptions = baseAxis.options,\n                    ret;\n\n                if (!returnFalseOnNoBaseSeries || baseAxis.dataMin !== null) {\n                    ret = {\n                        dataMin: pick( // #4053\n                            navAxisOptions && navAxisOptions.min,\n                            numExt(\n                                'min',\n                                baseAxisOptions.min,\n                                baseAxis.dataMin,\n                                navAxis.dataMin,\n                                navAxis.min\n                            )\n                        ),\n                        dataMax: pick(\n                            navAxisOptions && navAxisOptions.max,\n                            numExt(\n                                'max',\n                                baseAxisOptions.max,\n                                baseAxis.dataMax,\n                                navAxis.dataMax,\n                                navAxis.max\n                            )\n                        )\n                    };\n                }\n                return ret;\n            },\n\n            /**\n             * Set the base series. With a bit of modification we should be able to make\n             * this an API method to be called from the outside\n             * @param {Object} baseSeriesOptions - series options for a navigator\n             */\n            setBaseSeries: function(baseSeriesOptions) {\n                var chart = this.chart,\n                    baseSeries;\n\n                baseSeriesOptions = baseSeriesOptions || chart.options && chart.options.navigator.baseSeries || 0;\n\n                // If we're resetting, remove the existing series\n                if (this.series) {\n                    this.removeBaseSeriesEvents();\n                    each(this.series, function(s) {\n                        s.destroy();\n                    });\n                }\n\n                baseSeries = this.baseSeries = [];\n\n                // Iterate through series and add the ones that should be shown in navigator\n                each(chart.series || [], function(series, i) {\n                    if (series.options.showInNavigator || (i === baseSeriesOptions || series.options.id === baseSeriesOptions) &&\n                        series.options.showInNavigator !== false) {\n                        baseSeries.push(series);\n                    }\n                });\n\n                // When run after render, this.xAxis already exists\n                if (this.xAxis && !this.xAxis.fake) {\n                    this.addBaseSeries();\n                }\n            },\n\n            /*\n             * Add base series to the navigator.\n             */\n            addBaseSeries: function() {\n                var navigator = this,\n                    chart = navigator.chart,\n                    navigatorSeries = navigator.series = [],\n                    baseSeries = navigator.baseSeries,\n                    baseOptions,\n                    mergedNavSeriesOptions,\n                    chartNavigatorOptions = navigator.navigatorOptions.series,\n                    baseNavigatorOptions,\n                    navSeriesMixin = {\n                        enableMouseTracking: false,\n                        index: null, // #6162\n                        group: 'nav', // for columns\n                        padXAxis: false,\n                        xAxis: 'navigator-x-axis',\n                        yAxis: 'navigator-y-axis',\n                        showInLegend: false,\n                        stacking: false, // #4823\n                        isInternal: true,\n                        visible: true\n                    };\n\n                // Go through each base series and merge the options to create new series\n                if (baseSeries) {\n                    each(baseSeries, function(base, i) {\n                        navSeriesMixin.name = 'Navigator ' + (i + 1);\n\n                        baseOptions = base.options || {};\n                        baseNavigatorOptions = baseOptions.navigatorOptions || {};\n                        mergedNavSeriesOptions = merge(baseOptions, navSeriesMixin, chartNavigatorOptions, baseNavigatorOptions);\n\n                        // Merge data separately. Do a slice to avoid mutating the navigator options from base series (#4923).\n                        var navigatorSeriesData = baseNavigatorOptions.data || chartNavigatorOptions.data;\n                        navigator.hasNavigatorData = navigator.hasNavigatorData || !!navigatorSeriesData;\n                        mergedNavSeriesOptions.data = navigatorSeriesData || baseOptions.data && baseOptions.data.slice(0);\n\n                        // Add the series\n                        base.navigatorSeries = chart.initSeries(mergedNavSeriesOptions);\n                        navigatorSeries.push(base.navigatorSeries);\n                    });\n                } else {\n                    // No base series, build from mixin and chart wide options\n                    mergedNavSeriesOptions = merge(chartNavigatorOptions, navSeriesMixin);\n                    mergedNavSeriesOptions.data = chartNavigatorOptions.data;\n                    navigator.hasNavigatorData = !!mergedNavSeriesOptions.data;\n                    navigatorSeries.push(chart.initSeries(mergedNavSeriesOptions));\n                }\n\n                this.addBaseSeriesEvents();\n            },\n\n            /**\n             * Add data events.\n             * For example when main series is updated we need to recalculate extremes\n             */\n            addBaseSeriesEvents: function() {\n                var navigator = this,\n                    baseSeries = navigator.baseSeries || [];\n\n                // Bind modified extremes event to first base's xAxis only. In event of > 1 base-xAxes, the navigator will ignore those.\n                if (baseSeries[0] && baseSeries[0].xAxis) {\n                    addEvent(baseSeries[0].xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n                }\n\n                if (this.navigatorOptions.adaptToUpdatedData !== false) {\n                    // Respond to updated data in the base series.\n                    // Abort if lazy-loading data from the server.\n                    each(baseSeries, function(base) {\n                        if (base.xAxis) {\n                            addEvent(base, 'updatedData', this.updatedDataHandler);\n                        }\n\n                        // Handle series removal\n                        addEvent(base, 'remove', function() {\n                            if (this.navigatorSeries) {\n                                erase(navigator.series, this.navigatorSeries);\n                                this.navigatorSeries.remove(false);\n                                delete this.navigatorSeries;\n                            }\n                        });\n                    }, this);\n                }\n            },\n\n            /**\n             * Set the navigator x axis extremes to reflect the total. The navigator extremes\n             * should always be the extremes of the union of all series in the chart as\n             * well as the navigator series.\n             */\n            modifyNavigatorAxisExtremes: function() {\n                var xAxis = this.xAxis,\n                    unionExtremes;\n\n                if (xAxis.getExtremes) {\n                    unionExtremes = this.getUnionExtremes(true);\n                    if (unionExtremes && (unionExtremes.dataMin !== xAxis.min || unionExtremes.dataMax !== xAxis.max)) {\n                        xAxis.min = unionExtremes.dataMin;\n                        xAxis.max = unionExtremes.dataMax;\n                    }\n                }\n            },\n\n            /**\n             * Hook to modify the base axis extremes with information from the Navigator\n             */\n            modifyBaseAxisExtremes: function() {\n                var baseXAxis = this,\n                    navigator = baseXAxis.chart.navigator,\n                    baseExtremes = baseXAxis.getExtremes(),\n                    baseMin = baseExtremes.min,\n                    baseMax = baseExtremes.max,\n                    baseDataMin = baseExtremes.dataMin,\n                    baseDataMax = baseExtremes.dataMax,\n                    range = baseMax - baseMin,\n                    stickToMin = navigator.stickToMin,\n                    stickToMax = navigator.stickToMax,\n                    newMax,\n                    newMin,\n                    navigatorSeries = navigator.series && navigator.series[0],\n                    hasSetExtremes = !!baseXAxis.setExtremes,\n\n                    // When the extremes have been set by range selector button, don't stick to min or max.\n                    // The range selector buttons will handle the extremes. (#5489)\n                    unmutable = baseXAxis.eventArgs && baseXAxis.eventArgs.trigger === 'rangeSelectorButton';\n\n                if (!unmutable) {\n\n                    // If the zoomed range is already at the min, move it to the right as new data\n                    // comes in\n                    if (stickToMin) {\n                        newMin = baseDataMin;\n                        newMax = newMin + range;\n                    }\n\n                    // If the zoomed range is already at the max, move it to the right as new data\n                    // comes in\n                    if (stickToMax) {\n                        newMax = baseDataMax;\n                        if (!stickToMin) { // if stickToMin is true, the new min value is set above\n                            newMin = Math.max(\n                                newMax - range,\n                                navigatorSeries && navigatorSeries.xData ?\n                                navigatorSeries.xData[0] : -Number.MAX_VALUE\n                            );\n                        }\n                    }\n\n                    // Update the extremes\n                    if (hasSetExtremes && (stickToMin || stickToMax)) {\n                        if (isNumber(newMin)) {\n                            baseXAxis.min = baseXAxis.userMin = newMin;\n                            baseXAxis.max = baseXAxis.userMax = newMax;\n                        }\n                    }\n                }\n\n                // Reset\n                navigator.stickToMin = navigator.stickToMax = null;\n            },\n\n            /**\n             * Handler for updated data on the base series. When data is modified, the navigator series\n             * must reflect it. This is called from the Chart.redraw function before axis and series\n             * extremes are computed.\n             */\n            updatedDataHandler: function() {\n                var navigator = this.chart.navigator,\n                    baseSeries = this,\n                    navigatorSeries = this.navigatorSeries;\n\n                // Detect whether the zoomed area should stick to the minimum or maximum. If the current\n                // axis minimum falls outside the new updated dataset, we must adjust.\n                navigator.stickToMin = isNumber(baseSeries.xAxis.min) && (baseSeries.xAxis.min <= baseSeries.xData[0]);\n                // If the scrollbar is scrolled all the way to the right, keep right as new data \n                // comes in.\n                navigator.stickToMax = Math.round(navigator.zoomedMax) >= Math.round(navigator.size);\n\n                // Set the navigator series data to the new data of the base series\n                if (navigatorSeries && !navigator.hasNavigatorData) {\n                    navigatorSeries.options.pointStart = baseSeries.xData[0];\n                    navigatorSeries.setData(baseSeries.options.data, false, null, false); // #5414\n                }\n            },\n\n            /**\n             * Add chart events, like redrawing navigator, when chart requires that.\n             */\n            addChartEvents: function() {\n                addEvent(this.chart, 'redraw', function() {\n                    // Move the scrollbar after redraw, like after data updata even if axes don't redraw\n                    var navigator = this.navigator,\n                        xAxis = navigator && (\n                            navigator.baseSeries &&\n                            navigator.baseSeries[0] &&\n                            navigator.baseSeries[0].xAxis ||\n                            navigator.scrollbar && this.xAxis[0]\n                        ); // #5709\n\n                    if (xAxis) {\n                        navigator.render(xAxis.min, xAxis.max);\n                    }\n                });\n            },\n\n            /**\n             * Destroys allocated elements.\n             */\n            destroy: function() {\n\n                // Disconnect events added in addEvents\n                this.removeEvents();\n\n                if (this.xAxis) {\n                    erase(this.chart.xAxis, this.xAxis);\n                    erase(this.chart.axes, this.xAxis);\n                }\n                if (this.yAxis) {\n                    erase(this.chart.yAxis, this.yAxis);\n                    erase(this.chart.axes, this.yAxis);\n                }\n                // Destroy series\n                each(this.series || [], function(s) {\n                    if (s.destroy) {\n                        s.destroy();\n                    }\n                });\n\n                // Destroy properties\n                each([\n                    'series', 'xAxis', 'yAxis', 'shades', 'outline', 'scrollbarTrack',\n                    'scrollbarRifles', 'scrollbarGroup', 'scrollbar', 'navigatorGroup',\n                    'rendered'\n                ], function(prop) {\n                    if (this[prop] && this[prop].destroy) {\n                        this[prop].destroy();\n                    }\n                    this[prop] = null;\n                }, this);\n\n                // Destroy elements in collection\n                each([this.handles], function(coll) {\n                    destroyObjectProperties(coll);\n                }, this);\n            }\n        };\n\n        H.Navigator = Navigator;\n\n        /**\n         * For Stock charts, override selection zooming with some special features because\n         * X axis zooming is already allowed by the Navigator and Range selector.\n         */\n        wrap(Axis.prototype, 'zoom', function(proceed, newMin, newMax) {\n            var chart = this.chart,\n                chartOptions = chart.options,\n                zoomType = chartOptions.chart.zoomType,\n                previousZoom,\n                navigator = chartOptions.navigator,\n                rangeSelector = chartOptions.rangeSelector,\n                ret;\n\n            if (this.isXAxis && ((navigator && navigator.enabled) ||\n                    (rangeSelector && rangeSelector.enabled))) {\n\n                // For x only zooming, fool the chart.zoom method not to create the zoom button\n                // because the property already exists\n                if (zoomType === 'x') {\n                    chart.resetZoomButton = 'blocked';\n\n                    // For y only zooming, ignore the X axis completely\n                } else if (zoomType === 'y') {\n                    ret = false;\n\n                    // For xy zooming, record the state of the zoom before zoom selection, then when\n                    // the reset button is pressed, revert to this state\n                } else if (zoomType === 'xy') {\n                    previousZoom = this.previousZoom;\n                    if (defined(newMin)) {\n                        this.previousZoom = [this.min, this.max];\n                    } else if (previousZoom) {\n                        newMin = previousZoom[0];\n                        newMax = previousZoom[1];\n                        delete this.previousZoom;\n                    }\n                }\n\n            }\n            return ret !== undefined ? ret : proceed.call(this, newMin, newMax);\n        });\n\n        // Initialize navigator for stock charts\n        wrap(Chart.prototype, 'init', function(proceed, options, callback) {\n\n            addEvent(this, 'beforeRender', function() {\n                var options = this.options;\n                if (options.navigator.enabled || options.scrollbar.enabled) {\n                    this.scroller = this.navigator = new Navigator(this);\n                }\n            });\n\n            proceed.call(this, options, callback);\n\n        });\n\n        /**\n         * For stock charts, extend the Chart.setChartSize method so that we can set the final top position\n         * of the navigator once the height of the chart, including the legend, is determined. #367.\n         * We can't use Chart.getMargins, because labels offsets are not calculated yet.\n         */\n        wrap(Chart.prototype, 'setChartSize', function(proceed) {\n\n            var legend = this.legend,\n                navigator = this.navigator,\n                scrollbarHeight,\n                legendOptions,\n                xAxis,\n                yAxis;\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (navigator) {\n                legendOptions = legend.options;\n                xAxis = navigator.xAxis;\n                yAxis = navigator.yAxis;\n                scrollbarHeight = navigator.scrollbarHeight;\n\n                // Compute the top position\n                if (this.inverted) {\n                    navigator.left = navigator.opposite ?\n                        this.chartWidth - scrollbarHeight - navigator.height :\n                        this.spacing[3] + scrollbarHeight;\n                    navigator.top = this.plotTop + scrollbarHeight;\n                } else {\n                    navigator.left = this.plotLeft + scrollbarHeight;\n                    navigator.top = navigator.navigatorOptions.top ||\n                        this.chartHeight - navigator.height - scrollbarHeight - this.spacing[2] -\n                        (legendOptions.verticalAlign === 'bottom' && legendOptions.enabled && !legendOptions.floating ?\n                            legend.legendHeight + pick(legendOptions.margin, 10) : 0);\n                }\n\n                if (xAxis && yAxis) { // false if navigator is disabled (#904)\n\n                    if (this.inverted) {\n                        xAxis.options.left = yAxis.options.left = navigator.left;\n                    } else {\n                        xAxis.options.top = yAxis.options.top = navigator.top;\n                    }\n\n                    xAxis.setAxisSize();\n                    yAxis.setAxisSize();\n                }\n            }\n        });\n\n        // Pick up badly formatted point options to addPoint\n        wrap(Series.prototype, 'addPoint', function(proceed, options, redraw, shift, animation) {\n            var turboThreshold = this.options.turboThreshold;\n            if (turboThreshold && this.xData.length > turboThreshold && isObject(options, true) && this.chart.navigator) {\n                error(20, true);\n            }\n            proceed.call(this, options, redraw, shift, animation);\n        });\n\n        // Handle adding new series\n        wrap(Chart.prototype, 'addSeries', function(proceed, options, redraw, animation) {\n            var series = proceed.call(this, options, false, animation);\n            if (this.navigator) {\n                this.navigator.setBaseSeries(); // Recompute which series should be shown in navigator, and add them\n            }\n            if (pick(redraw, true)) {\n                this.redraw();\n            }\n            return series;\n        });\n\n        // Handle updating series\n        wrap(Series.prototype, 'update', function(proceed, newOptions, redraw) {\n            proceed.call(this, newOptions, false);\n            if (this.chart.navigator) {\n                this.chart.navigator.setBaseSeries();\n            }\n            if (pick(redraw, true)) {\n                this.chart.redraw();\n            }\n        });\n\n        Chart.prototype.callbacks.push(function(chart) {\n            var extremes,\n                navigator = chart.navigator;\n\n            // Initiate the navigator\n            if (navigator) {\n                extremes = chart.xAxis[0].getExtremes();\n                navigator.render(extremes.min, extremes.max);\n            }\n        });\n\n        /* ****************************************************************************\n         * End Navigator code\t\t\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = H.addEvent,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            css = H.css,\n            createElement = H.createElement,\n            dateFormat = H.dateFormat,\n            defaultOptions = H.defaultOptions,\n            useUTC = defaultOptions.global.useUTC,\n            defined = H.defined,\n            destroyObjectProperties = H.destroyObjectProperties,\n            discardElement = H.discardElement,\n            each = H.each,\n            extend = H.extend,\n            fireEvent = H.fireEvent,\n            HCDate = H.Date,\n            isNumber = H.isNumber,\n            merge = H.merge,\n            pick = H.pick,\n            pInt = H.pInt,\n            splat = H.splat,\n            wrap = H.wrap;\n\n        /* ****************************************************************************\n         * Start Range Selector code\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n        extend(defaultOptions, {\n            rangeSelector: {\n                // allButtonsEnabled: false,\n                // enabled: true,\n                // buttons: {Object}\n                // buttonSpacing: 0,\n                buttonTheme: {\n                    'stroke-width': 0,\n                    width: 28,\n                    height: 18,\n                    padding: 2,\n                    zIndex: 7 // #484, #852\n                },\n                height: 35, // reserved space for buttons and input\n                inputPosition: {\n                    align: 'right'\n                },\n                // inputDateFormat: '%b %e, %Y',\n                // inputEditDateFormat: '%Y-%m-%d',\n                // inputEnabled: true,\n                // selected: undefined,\n\n                // inputStyle: {},\n                labelStyle: {\n                    color: '#666666'\n                }\n\n            }\n        });\n        defaultOptions.lang = merge(defaultOptions.lang, {\n            rangeSelectorZoom: 'Zoom',\n            rangeSelectorFrom: 'From',\n            rangeSelectorTo: 'To'\n        });\n\n        /**\n         * The range selector.\n         * @class\n         * @param {Object} chart\n         */\n        function RangeSelector(chart) {\n\n            // Run RangeSelector\n            this.init(chart);\n        }\n\n        RangeSelector.prototype = {\n            /**\n             * The method to run when one of the buttons in the range selectors is clicked\n             * @param {Number} i The index of the button\n             * @param {Object} rangeOptions\n             * @param {Boolean} redraw\n             */\n            clickButton: function(i, redraw) {\n                var rangeSelector = this,\n                    chart = rangeSelector.chart,\n                    rangeOptions = rangeSelector.buttonOptions[i],\n                    baseAxis = chart.xAxis[0],\n                    unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis || {},\n                    dataMin = unionExtremes.dataMin,\n                    dataMax = unionExtremes.dataMax,\n                    newMin,\n                    newMax = baseAxis && Math.round(Math.min(baseAxis.max, pick(dataMax, baseAxis.max))), // #1568\n                    type = rangeOptions.type,\n                    baseXAxisOptions,\n                    range = rangeOptions._range,\n                    rangeMin,\n                    minSetting,\n                    rangeSetting,\n                    ctx,\n                    ytdExtremes,\n                    dataGrouping = rangeOptions.dataGrouping;\n\n                if (dataMin === null || dataMax === null) { // chart has no data, base series is removed\n                    return;\n                }\n\n                // Set the fixed range before range is altered\n                chart.fixedRange = range;\n\n                // Apply dataGrouping associated to button\n                if (dataGrouping) {\n                    this.forcedDataGrouping = true;\n                    Axis.prototype.setDataGrouping.call(baseAxis || {\n                        chart: this.chart\n                    }, dataGrouping, false);\n                }\n\n                // Apply range\n                if (type === 'month' || type === 'year') {\n                    if (!baseAxis) {\n                        // This is set to the user options and picked up later when the axis is instantiated\n                        // so that we know the min and max.\n                        range = rangeOptions;\n                    } else {\n                        ctx = {\n                            range: rangeOptions,\n                            max: newMax,\n                            dataMin: dataMin,\n                            dataMax: dataMax\n                        };\n                        newMin = baseAxis.minFromRange.call(ctx);\n                        if (isNumber(ctx.newMax)) {\n                            newMax = ctx.newMax;\n                        }\n                    }\n\n                    // Fixed times like minutes, hours, days\n                } else if (range) {\n                    newMin = Math.max(newMax - range, dataMin);\n                    newMax = Math.min(newMin + range, dataMax);\n\n                } else if (type === 'ytd') {\n\n                    // On user clicks on the buttons, or a delayed action running from the beforeRender\n                    // event (below), the baseAxis is defined.\n                    if (baseAxis) {\n                        // When \"ytd\" is the pre-selected button for the initial view, its calculation\n                        // is delayed and rerun in the beforeRender event (below). When the series\n                        // are initialized, but before the chart is rendered, we have access to the xData\n                        // array (#942).\n                        if (dataMax === undefined) {\n                            dataMin = Number.MAX_VALUE;\n                            dataMax = Number.MIN_VALUE;\n                            each(chart.series, function(series) {\n                                var xData = series.xData; // reassign it to the last item\n                                dataMin = Math.min(xData[0], dataMin);\n                                dataMax = Math.max(xData[xData.length - 1], dataMax);\n                            });\n                            redraw = false;\n                        }\n                        ytdExtremes = rangeSelector.getYTDExtremes(dataMax, dataMin, useUTC);\n                        newMin = rangeMin = ytdExtremes.min;\n                        newMax = ytdExtremes.max;\n\n                        // \"ytd\" is pre-selected. We don't yet have access to processed point and extremes data\n                        // (things like pointStart and pointInterval are missing), so we delay the process (#942)\n                    } else {\n                        addEvent(chart, 'beforeRender', function() {\n                            rangeSelector.clickButton(i);\n                        });\n                        return;\n                    }\n                } else if (type === 'all' && baseAxis) {\n                    newMin = dataMin;\n                    newMax = dataMax;\n                }\n                rangeSelector.setSelected(i);\n\n                // Update the chart\n                if (!baseAxis) {\n                    // Axis not yet instanciated. Temporarily set min and range\n                    // options and remove them on chart load (#4317).\n                    baseXAxisOptions = splat(chart.options.xAxis)[0];\n                    rangeSetting = baseXAxisOptions.range;\n                    baseXAxisOptions.range = range;\n                    minSetting = baseXAxisOptions.min;\n                    baseXAxisOptions.min = rangeMin;\n                    addEvent(chart, 'load', function resetMinAndRange() {\n                        baseXAxisOptions.range = rangeSetting;\n                        baseXAxisOptions.min = minSetting;\n                    });\n                } else {\n                    // Existing axis object. Set extremes after render time.\n                    baseAxis.setExtremes(\n                        newMin,\n                        newMax,\n                        pick(redraw, 1),\n                        null, // auto animation\n                        {\n                            trigger: 'rangeSelectorButton',\n                            rangeSelectorButton: rangeOptions\n                        }\n                    );\n                }\n            },\n\n            /**\n             * Set the selected option. This method only sets the internal flag, it doesn't\n             * update the buttons or the actual zoomed range.\n             */\n            setSelected: function(selected) {\n                this.selected = this.options.selected = selected;\n            },\n\n            /**\n             * The default buttons for pre-selecting time frames\n             */\n            defaultButtons: [{\n                type: 'month',\n                count: 1,\n                text: '1m'\n            }, {\n                type: 'month',\n                count: 3,\n                text: '3m'\n            }, {\n                type: 'month',\n                count: 6,\n                text: '6m'\n            }, {\n                type: 'ytd',\n                text: 'YTD'\n            }, {\n                type: 'year',\n                count: 1,\n                text: '1y'\n            }, {\n                type: 'all',\n                text: 'All'\n            }],\n\n            /**\n             * Initialize the range selector\n             */\n            init: function(chart) {\n                var rangeSelector = this,\n                    options = chart.options.rangeSelector,\n                    buttonOptions = options.buttons || [].concat(rangeSelector.defaultButtons),\n                    selectedOption = options.selected,\n                    blurInputs = function() {\n                        var minInput = rangeSelector.minInput,\n                            maxInput = rangeSelector.maxInput;\n                        if (minInput && minInput.blur) { //#3274 in some case blur is not defined\n                            fireEvent(minInput, 'blur'); //#3274\n                        }\n                        if (maxInput && maxInput.blur) { //#3274 in some case blur is not defined\n                            fireEvent(maxInput, 'blur'); //#3274\n                        }\n                    };\n\n                rangeSelector.chart = chart;\n                rangeSelector.options = options;\n                rangeSelector.buttons = [];\n\n                chart.extraTopMargin = options.height;\n                rangeSelector.buttonOptions = buttonOptions;\n\n                this.unMouseDown = addEvent(chart.container, 'mousedown', blurInputs);\n                this.unResize = addEvent(chart, 'resize', blurInputs);\n\n                // Extend the buttonOptions with actual range\n                each(buttonOptions, rangeSelector.computeButtonRange);\n\n                // zoomed range based on a pre-selected button index\n                if (selectedOption !== undefined && buttonOptions[selectedOption]) {\n                    this.clickButton(selectedOption, false);\n                }\n\n\n                addEvent(chart, 'load', function() {\n                    // If a data grouping is applied to the current button, release it when extremes change\n                    addEvent(chart.xAxis[0], 'setExtremes', function(e) {\n                        if (this.max - this.min !== chart.fixedRange && e.trigger !== 'rangeSelectorButton' &&\n                            e.trigger !== 'updatedData' && rangeSelector.forcedDataGrouping) {\n                            this.setDataGrouping(false, false);\n                        }\n                    });\n                });\n            },\n\n            /**\n             * Dynamically update the range selector buttons after a new range has been set\n             */\n            updateButtonStates: function() {\n                var rangeSelector = this,\n                    chart = this.chart,\n                    baseAxis = chart.xAxis[0],\n                    actualRange = Math.round(baseAxis.max - baseAxis.min),\n                    hasNoData = !baseAxis.hasVisibleSeries,\n                    day = 24 * 36e5, // A single day in milliseconds\n                    unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis,\n                    dataMin = unionExtremes.dataMin,\n                    dataMax = unionExtremes.dataMax,\n                    ytdExtremes = rangeSelector.getYTDExtremes(dataMax, dataMin, useUTC),\n                    ytdMin = ytdExtremes.min,\n                    ytdMax = ytdExtremes.max,\n                    selected = rangeSelector.selected,\n                    selectedExists = isNumber(selected),\n                    allButtonsEnabled = rangeSelector.options.allButtonsEnabled,\n                    buttons = rangeSelector.buttons;\n\n                each(rangeSelector.buttonOptions, function(rangeOptions, i) {\n                    var range = rangeOptions._range,\n                        type = rangeOptions.type,\n                        count = rangeOptions.count || 1,\n                        button = buttons[i],\n                        state = 0,\n                        disable,\n                        select,\n                        isSelected = i === selected,\n                        // Disable buttons where the range exceeds what is allowed in the current view\n                        isTooGreatRange = range > dataMax - dataMin,\n                        // Disable buttons where the range is smaller than the minimum range\n                        isTooSmallRange = range < baseAxis.minRange,\n                        // Do not select the YTD button if not explicitly told so\n                        isYTDButNotSelected = false,\n                        // Disable the All button if we're already showing all\n                        isAllButAlreadyShowingAll = false,\n                        isSameRange = range === actualRange;\n                    // Months and years have a variable range so we check the extremes\n                    if (\n                        (type === 'month' || type === 'year') &&\n                        (actualRange >= {\n                            month: 28,\n                            year: 365\n                        }[type] * day * count) &&\n                        (actualRange <= {\n                            month: 31,\n                            year: 366\n                        }[type] * day * count)\n                    ) {\n                        isSameRange = true;\n                    } else if (type === 'ytd') {\n                        isSameRange = (ytdMax - ytdMin) === actualRange;\n                        isYTDButNotSelected = !isSelected;\n                    } else if (type === 'all') {\n                        isSameRange = baseAxis.max - baseAxis.min >= dataMax - dataMin;\n                        isAllButAlreadyShowingAll = !isSelected && selectedExists && isSameRange;\n                    }\n                    // The new zoom area happens to match the range for a button - mark it selected.\n                    // This happens when scrolling across an ordinal gap. It can be seen in the intraday\n                    // demos when selecting 1h and scroll across the night gap.\n                    disable = (!allButtonsEnabled &&\n                        (\n                            isTooGreatRange ||\n                            isTooSmallRange ||\n                            isAllButAlreadyShowingAll ||\n                            hasNoData\n                        )\n                    );\n                    select = (\n                        (isSelected && isSameRange) ||\n                        (isSameRange && !selectedExists && !isYTDButNotSelected)\n                    );\n\n                    if (disable) {\n                        state = 3;\n                    } else if (select) {\n                        selectedExists = true; // Only one button can be selected\n                        state = 2;\n                    }\n\n                    // If state has changed, update the button\n                    if (button.state !== state) {\n                        button.setState(state);\n                    }\n                });\n            },\n\n            /**\n             * Compute and cache the range for an individual button\n             */\n            computeButtonRange: function(rangeOptions) {\n                var type = rangeOptions.type,\n                    count = rangeOptions.count || 1,\n\n                    // these time intervals have a fixed number of milliseconds, as opposed\n                    // to month, ytd and year\n                    fixedTimes = {\n                        millisecond: 1,\n                        second: 1000,\n                        minute: 60 * 1000,\n                        hour: 3600 * 1000,\n                        day: 24 * 3600 * 1000,\n                        week: 7 * 24 * 3600 * 1000\n                    };\n\n                // Store the range on the button object\n                if (fixedTimes[type]) {\n                    rangeOptions._range = fixedTimes[type] * count;\n                } else if (type === 'month' || type === 'year') {\n                    rangeOptions._range = {\n                        month: 30,\n                        year: 365\n                    }[type] * 24 * 36e5 * count;\n                }\n            },\n\n            /**\n             * Set the internal and displayed value of a HTML input for the dates\n             * @param {String} name\n             * @param {Number} time\n             */\n            setInputValue: function(name, time) {\n                var options = this.chart.options.rangeSelector,\n                    input = this[name + 'Input'];\n\n                if (defined(time)) {\n                    input.previousValue = input.HCTime;\n                    input.HCTime = time;\n                }\n\n                input.value = dateFormat(\n                    options.inputEditDateFormat || '%Y-%m-%d',\n                    input.HCTime\n                );\n                this[name + 'DateBox'].attr({\n                    text: dateFormat(options.inputDateFormat || '%b %e, %Y', input.HCTime)\n                });\n            },\n\n            showInput: function(name) {\n                var inputGroup = this.inputGroup,\n                    dateBox = this[name + 'DateBox'];\n\n                css(this[name + 'Input'], {\n                    left: (inputGroup.translateX + dateBox.x) + 'px',\n                    top: inputGroup.translateY + 'px',\n                    width: (dateBox.width - 2) + 'px',\n                    height: (dateBox.height - 2) + 'px',\n                    border: '2px solid silver'\n                });\n            },\n\n            hideInput: function(name) {\n                css(this[name + 'Input'], {\n                    border: 0,\n                    width: '1px',\n                    height: '1px'\n                });\n                this.setInputValue(name);\n            },\n\n            /**\n             * Draw either the 'from' or the 'to' HTML input box of the range selector\n             * @param {Object} name\n             */\n            drawInput: function(name) {\n                var rangeSelector = this,\n                    chart = rangeSelector.chart,\n                    chartStyle = chart.renderer.style || {},\n                    renderer = chart.renderer,\n                    options = chart.options.rangeSelector,\n                    lang = defaultOptions.lang,\n                    div = rangeSelector.div,\n                    isMin = name === 'min',\n                    input,\n                    label,\n                    dateBox,\n                    inputGroup = this.inputGroup;\n\n                function updateExtremes() {\n                    var inputValue = input.value,\n                        value = (options.inputDateParser || Date.parse)(inputValue),\n                        chartAxis = chart.xAxis[0],\n                        dataAxis = chart.scroller && chart.scroller.xAxis ? chart.scroller.xAxis : chartAxis,\n                        dataMin = dataAxis.dataMin,\n                        dataMax = dataAxis.dataMax;\n                    if (value !== input.previousValue) {\n                        input.previousValue = value;\n                        // If the value isn't parsed directly to a value by the browser's Date.parse method,\n                        // like YYYY-MM-DD in IE, try parsing it a different way\n                        if (!isNumber(value)) {\n                            value = inputValue.split('-');\n                            value = Date.UTC(pInt(value[0]), pInt(value[1]) - 1, pInt(value[2]));\n                        }\n\n                        if (isNumber(value)) {\n\n                            // Correct for timezone offset (#433)\n                            if (!useUTC) {\n                                value = value + new Date().getTimezoneOffset() * 60 * 1000;\n                            }\n\n                            // Validate the extremes. If it goes beyound the data min or max, use the\n                            // actual data extreme (#2438).\n                            if (isMin) {\n                                if (value > rangeSelector.maxInput.HCTime) {\n                                    value = undefined;\n                                } else if (value < dataMin) {\n                                    value = dataMin;\n                                }\n                            } else {\n                                if (value < rangeSelector.minInput.HCTime) {\n                                    value = undefined;\n                                } else if (value > dataMax) {\n                                    value = dataMax;\n                                }\n                            }\n\n                            // Set the extremes\n                            if (value !== undefined) {\n                                chartAxis.setExtremes(\n                                    isMin ? value : chartAxis.min,\n                                    isMin ? chartAxis.max : value,\n                                    undefined,\n                                    undefined, {\n                                        trigger: 'rangeSelectorInput'\n                                    }\n                                );\n                            }\n                        }\n                    }\n                }\n\n                // Create the text label\n                this[name + 'Label'] = label = renderer.label(lang[isMin ? 'rangeSelectorFrom' : 'rangeSelectorTo'], this.inputGroup.offset)\n                    .addClass('highcharts-range-label')\n                    .attr({\n                        padding: 2\n                    })\n                    .add(inputGroup);\n                inputGroup.offset += label.width + 5;\n\n                // Create an SVG label that shows updated date ranges and and records click events that\n                // bring in the HTML input.\n                this[name + 'DateBox'] = dateBox = renderer.label('', inputGroup.offset)\n                    .addClass('highcharts-range-input')\n                    .attr({\n                        padding: 2,\n                        width: options.inputBoxWidth || 90,\n                        height: options.inputBoxHeight || 17,\n                        stroke: options.inputBoxBorderColor || '#cccccc',\n                        'stroke-width': 1,\n                        'text-align': 'center'\n                    })\n                    .on('click', function() {\n                        rangeSelector.showInput(name); // If it is already focused, the onfocus event doesn't fire (#3713)\n                        rangeSelector[name + 'Input'].focus();\n                    })\n                    .add(inputGroup);\n                inputGroup.offset += dateBox.width + (isMin ? 10 : 0);\n\n\n                // Create the HTML input element. This is rendered as 1x1 pixel then set to the right size\n                // when focused.\n                this[name + 'Input'] = input = createElement('input', {\n                    name: name,\n                    className: 'highcharts-range-selector',\n                    type: 'text'\n                }, {\n                    top: chart.plotTop + 'px' // prevent jump on focus in Firefox\n                }, div);\n\n\n                // Styles\n                label.css(merge(chartStyle, options.labelStyle));\n\n                dateBox.css(merge({\n                    color: '#333333'\n                }, chartStyle, options.inputStyle));\n\n                css(input, extend({\n                    position: 'absolute',\n                    border: 0,\n                    width: '1px', // Chrome needs a pixel to see it\n                    height: '1px',\n                    padding: 0,\n                    textAlign: 'center',\n                    fontSize: chartStyle.fontSize,\n                    fontFamily: chartStyle.fontFamily,\n                    left: '-9em' // #4798\n                }, options.inputStyle));\n\n\n                // Blow up the input box\n                input.onfocus = function() {\n                    rangeSelector.showInput(name);\n                };\n                // Hide away the input box\n                input.onblur = function() {\n                    rangeSelector.hideInput(name);\n                };\n\n                // handle changes in the input boxes\n                input.onchange = updateExtremes;\n\n                input.onkeypress = function(event) {\n                    // IE does not fire onchange on enter\n                    if (event.keyCode === 13) {\n                        updateExtremes();\n                    }\n                };\n            },\n\n            /**\n             * Get the position of the range selector buttons and inputs. This can be overridden from outside for custom positioning.\n             */\n            getPosition: function() {\n                var chart = this.chart,\n                    options = chart.options.rangeSelector,\n                    buttonTop = pick((options.buttonPosition || {}).y, chart.plotTop - chart.axisOffset[0] - options.height);\n\n                return {\n                    buttonTop: buttonTop,\n                    inputTop: buttonTop - 10\n                };\n            },\n            /**\n             * Get the extremes of YTD. \n             * Will choose dataMax if its value is lower than the current timestamp.\n             * Will choose dataMin if its value is higher than the timestamp for\n             * \tthe start of current year.\n             * @param  {number} dataMax\n             * @param  {number} dataMin\n             * @return {object} Returns min and max for the YTD\n             */\n            getYTDExtremes: function(dataMax, dataMin, useUTC) {\n                var min,\n                    now = new HCDate(dataMax),\n                    year = now[HCDate.hcGetFullYear](),\n                    startOfYear = useUTC ? HCDate.UTC(year, 0, 1) : +new HCDate(year, 0, 1); // eslint-disable-line new-cap\n                min = Math.max(dataMin || 0, startOfYear);\n                now = now.getTime();\n                return {\n                    max: Math.min(dataMax || now, now),\n                    min: min\n                };\n            },\n\n            /**\n             * Render the range selector including the buttons and the inputs. The first time render\n             * is called, the elements are created and positioned. On subsequent calls, they are\n             * moved and updated.\n             * @param {Number} min X axis minimum\n             * @param {Number} max X axis maximum\n             */\n            render: function(min, max) {\n\n                var rangeSelector = this,\n                    chart = rangeSelector.chart,\n                    renderer = chart.renderer,\n                    container = chart.container,\n                    chartOptions = chart.options,\n                    navButtonOptions = chartOptions.exporting && chartOptions.exporting.enabled !== false &&\n                    chartOptions.navigation && chartOptions.navigation.buttonOptions,\n                    options = chartOptions.rangeSelector,\n                    buttons = rangeSelector.buttons,\n                    lang = defaultOptions.lang,\n                    div = rangeSelector.div,\n                    inputGroup = rangeSelector.inputGroup,\n                    buttonTheme = options.buttonTheme,\n                    buttonPosition = options.buttonPosition || {},\n                    inputEnabled = options.inputEnabled,\n                    states = buttonTheme && buttonTheme.states,\n                    plotLeft = chart.plotLeft,\n                    buttonLeft,\n                    pos = this.getPosition(),\n                    buttonGroup = rangeSelector.group,\n                    buttonBBox,\n                    rendered = rangeSelector.rendered;\n\n                if (options.enabled === false) {\n                    return;\n                }\n\n                // create the elements\n                if (!rendered) {\n\n                    rangeSelector.group = buttonGroup = renderer.g('range-selector-buttons').add();\n\n                    rangeSelector.zoomText = renderer.text(lang.rangeSelectorZoom, pick(buttonPosition.x, plotLeft), 15)\n                        .css(options.labelStyle)\n                        .add(buttonGroup);\n\n                    // button starting position\n                    buttonLeft = pick(buttonPosition.x, plotLeft) + rangeSelector.zoomText.getBBox().width + 5;\n\n                    each(rangeSelector.buttonOptions, function(rangeOptions, i) {\n                        buttons[i] = renderer.button(\n                                rangeOptions.text,\n                                buttonLeft,\n                                0,\n                                function() {\n                                    rangeSelector.clickButton(i);\n                                    rangeSelector.isActive = true;\n                                },\n                                buttonTheme,\n                                states && states.hover,\n                                states && states.select,\n                                states && states.disabled\n                            )\n                            .attr({\n                                'text-align': 'center'\n                            })\n                            .add(buttonGroup);\n\n                        // increase button position for the next button\n                        buttonLeft += buttons[i].width + pick(options.buttonSpacing, 5);\n                    });\n\n                    // first create a wrapper outside the container in order to make\n                    // the inputs work and make export correct\n                    if (inputEnabled !== false) {\n                        rangeSelector.div = div = createElement('div', null, {\n                            position: 'relative',\n                            height: 0,\n                            zIndex: 1 // above container\n                        });\n\n                        container.parentNode.insertBefore(div, container);\n\n                        // Create the group to keep the inputs\n                        rangeSelector.inputGroup = inputGroup = renderer.g('input-group')\n                            .add();\n                        inputGroup.offset = 0;\n\n                        rangeSelector.drawInput('min');\n                        rangeSelector.drawInput('max');\n                    }\n                }\n                rangeSelector.updateButtonStates();\n\n                // Set or update the group position\n                buttonGroup[rendered ? 'animate' : 'attr']({\n                    translateY: pos.buttonTop\n                });\n\n                if (inputEnabled !== false) {\n\n                    // Update the alignment to the updated spacing box\n                    inputGroup.align(extend({\n                        y: pos.inputTop,\n                        width: inputGroup.offset,\n                        // Detect collision with the exporting buttons\n                        x: navButtonOptions && (pos.inputTop < (navButtonOptions.y || 0) + navButtonOptions.height - chart.spacing[0]) ?\n                            -40 : 0\n                    }, options.inputPosition), true, chart.spacingBox);\n\n                    // Hide if overlapping - inputEnabled is null or undefined\n                    if (!defined(inputEnabled)) {\n                        buttonBBox = buttonGroup.getBBox();\n                        inputGroup[inputGroup.alignAttr.translateX < buttonBBox.x + buttonBBox.width + 10 ? 'hide' : 'show']();\n                    }\n\n                    // Set or reset the input values\n                    rangeSelector.setInputValue('min', min);\n                    rangeSelector.setInputValue('max', max);\n                }\n\n                rangeSelector.rendered = true;\n            },\n\n            /**\n             * Update the range selector with new options\n             */\n            update: function(options) {\n                var chart = this.chart;\n                merge(true, chart.options.rangeSelector, options);\n                this.destroy();\n                this.init(chart);\n            },\n\n            /**\n             * Destroys allocated elements.\n             */\n            destroy: function() {\n                var rSelector = this,\n                    minInput = rSelector.minInput,\n                    maxInput = rSelector.maxInput;\n\n                rSelector.unMouseDown();\n                rSelector.unResize();\n\n                // Destroy elements in collections\n                destroyObjectProperties(rSelector.buttons);\n\n                // Clear input element events\n                if (minInput) {\n                    minInput.onfocus = minInput.onblur = minInput.onchange = null;\n                }\n                if (maxInput) {\n                    maxInput.onfocus = maxInput.onblur = maxInput.onchange = null;\n                }\n\n                // Destroy HTML and SVG elements\n                H.objectEach(rSelector, function(val, key) {\n                    if (val && key !== 'chart') {\n                        if (val.destroy) { // SVGElement\n                            val.destroy();\n                        } else if (val.nodeType) { // HTML element\n                            discardElement(this[key]);\n                        }\n                    }\n                    if (val !== RangeSelector.prototype[key]) {\n                        rSelector[key] = null;\n                    }\n                }, this);\n            }\n        };\n\n        /**\n         * Add logic to normalize the zoomed range in order to preserve the pressed state of range selector buttons\n         */\n        Axis.prototype.toFixedRange = function(pxMin, pxMax, fixedMin, fixedMax) {\n            var fixedRange = this.chart && this.chart.fixedRange,\n                newMin = pick(fixedMin, this.translate(pxMin, true, !this.horiz)),\n                newMax = pick(fixedMax, this.translate(pxMax, true, !this.horiz)),\n                changeRatio = fixedRange && (newMax - newMin) / fixedRange;\n\n            // If the difference between the fixed range and the actual requested range is\n            // too great, the user is dragging across an ordinal gap, and we need to release\n            // the range selector button.\n            if (changeRatio > 0.7 && changeRatio < 1.3) {\n                if (fixedMax) {\n                    newMin = newMax - fixedRange;\n                } else {\n                    newMax = newMin + fixedRange;\n                }\n            }\n            if (!isNumber(newMin)) { // #1195\n                newMin = newMax = undefined;\n            }\n\n            return {\n                min: newMin,\n                max: newMax\n            };\n        };\n\n        /**\n         * Get the axis min value based on the range option and the current max. For\n         * stock charts this is extended via the {@link RangeSelector} so that if the\n         * selected range is a multiple of months or years, it is compensated for\n         * various month lengths.\n         * \n         * @return {number} The new minimum value.\n         */\n        Axis.prototype.minFromRange = function() {\n            var rangeOptions = this.range,\n                type = rangeOptions.type,\n                timeName = {\n                    month: 'Month',\n                    year: 'FullYear'\n                }[type],\n                min,\n                max = this.max,\n                dataMin,\n                range,\n                // Get the true range from a start date\n                getTrueRange = function(base, count) {\n                    var date = new Date(base),\n                        basePeriod = date['get' + timeName]();\n\n                    date['set' + timeName](basePeriod + count);\n\n                    if (basePeriod === date['get' + timeName]()) {\n                        date.setDate(0); // #6537\n                    }\n\n                    return date.getTime() - base;\n                };\n\n            if (isNumber(rangeOptions)) {\n                min = max - rangeOptions;\n                range = rangeOptions;\n            } else {\n                min = max + getTrueRange(max, -rangeOptions.count);\n\n                // Let the fixedRange reflect initial settings (#5930)\n                if (this.chart) {\n                    this.chart.fixedRange = max - min;\n                }\n            }\n\n            dataMin = pick(this.dataMin, Number.MIN_VALUE);\n            if (!isNumber(min)) {\n                min = dataMin;\n            }\n            if (min <= dataMin) {\n                min = dataMin;\n                if (range === undefined) { // #4501\n                    range = getTrueRange(min, rangeOptions.count);\n                }\n                this.newMax = Math.min(min + range, this.dataMax);\n            }\n            if (!isNumber(max)) {\n                min = undefined;\n            }\n            return min;\n\n        };\n\n        // Initialize scroller for stock charts\n        wrap(Chart.prototype, 'init', function(proceed, options, callback) {\n\n            addEvent(this, 'init', function() {\n                if (this.options.rangeSelector.enabled) {\n                    this.rangeSelector = new RangeSelector(this);\n                }\n            });\n\n            proceed.call(this, options, callback);\n\n        });\n\n        Chart.prototype.callbacks.push(function(chart) {\n            var extremes,\n                rangeSelector = chart.rangeSelector,\n                unbindRender,\n                unbindSetExtremes;\n\n            function renderRangeSelector() {\n                extremes = chart.xAxis[0].getExtremes();\n                if (isNumber(extremes.min)) {\n                    rangeSelector.render(extremes.min, extremes.max);\n                }\n            }\n\n            if (rangeSelector) {\n                // redraw the scroller on setExtremes\n                unbindSetExtremes = addEvent(\n                    chart.xAxis[0],\n                    'afterSetExtremes',\n                    function(e) {\n                        rangeSelector.render(e.min, e.max);\n                    }\n                );\n\n                // redraw the scroller chart resize\n                unbindRender = addEvent(chart, 'redraw', renderRangeSelector);\n\n                // do it now\n                renderRangeSelector();\n            }\n\n            // Remove resize/afterSetExtremes at chart destroy\n            addEvent(chart, 'destroy', function destroyEvents() {\n                if (rangeSelector) {\n                    unbindRender();\n                    unbindSetExtremes();\n                }\n            });\n        });\n\n\n        H.RangeSelector = RangeSelector;\n\n        /* ****************************************************************************\n         * End Range Selector code\t\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n    }(Highcharts));\n    (function(H) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         */\n        var arrayMax = H.arrayMax,\n            arrayMin = H.arrayMin,\n            Axis = H.Axis,\n            Chart = H.Chart,\n            defined = H.defined,\n            each = H.each,\n            extend = H.extend,\n            format = H.format,\n            grep = H.grep,\n            inArray = H.inArray,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            map = H.map,\n            merge = H.merge,\n            pick = H.pick,\n            Point = H.Point,\n            Renderer = H.Renderer,\n            Series = H.Series,\n            splat = H.splat,\n            SVGRenderer = H.SVGRenderer,\n            VMLRenderer = H.VMLRenderer,\n            wrap = H.wrap,\n\n\n            seriesProto = Series.prototype,\n            seriesInit = seriesProto.init,\n            seriesProcessData = seriesProto.processData,\n            pointTooltipFormatter = Point.prototype.tooltipFormatter;\n\n        /**\n         * Factory function for creating new stock charts. Creates a new {@link Chart|\n         * Chart} object with different default options than the basic Chart.\n         * \n         * @function #stockChart\n         * @memberOf Highcharts\n         *\n         * @param  {String|HTMLDOMElement} renderTo\n         *         The DOM element to render to, or its id.\n         * @param  {Options} options\n         *         The chart options structure as described in the {@link\n         *         https://api.highcharts.com/highstock|options reference}.\n         * @param  {Function} callback\n         *         A function to execute when the chart object is finished loading and\n         *         rendering. In most cases the chart is built in one thread, but in\n         *         Internet Explorer version 8 or less the chart is sometimes initiated\n         *         before the document is ready, and in these cases the chart object\n         *         will not be finished synchronously. As a consequence, code that\n         *         relies on the newly built Chart object should always run in the\n         *         callback. Defining a {@link https://api.highcharts.com/highstock/chart.events.load|\n         *         chart.event.load} handler is equivalent.\n         *\n         * @return {Chart}\n         *         The chart object.\n         *\n         * @example\n         * var chart = Highcharts.stockChart('container', {\n         *     series: [{\n         *         data: [1, 2, 3, 4, 5, 6, 7, 8, 9],\n         *         pointInterval: 24 * 60 * 60 * 1000\n         *     }]\n         * });\n         */\n        H.StockChart = H.stockChart = function(a, b, c) {\n            var hasRenderToArg = isString(a) || a.nodeName,\n                options = arguments[hasRenderToArg ? 1 : 0],\n                seriesOptions = options.series, // to increase performance, don't merge the data\n                defaultOptions = H.getOptions(),\n                opposite,\n\n                // Always disable startOnTick:true on the main axis when the navigator\n                // is enabled (#1090)\n                navigatorEnabled = pick(\n                    options.navigator && options.navigator.enabled,\n                    defaultOptions.navigator.enabled,\n                    true\n                ),\n                disableStartOnTick = navigatorEnabled ? {\n                    startOnTick: false,\n                    endOnTick: false\n                } : null,\n\n                lineOptions = {\n\n                    marker: {\n                        enabled: false,\n                        radius: 2\n                    }\n                    // gapSize: 0\n                },\n                columnOptions = {\n                    shadow: false,\n                    borderWidth: 0\n                };\n\n            // apply X axis options to both single and multi y axes\n            options.xAxis = map(splat(options.xAxis || {}), function(xAxisOptions) {\n                return merge({ // defaults\n                        minPadding: 0,\n                        maxPadding: 0,\n                        ordinal: true,\n                        title: {\n                            text: null\n                        },\n                        labels: {\n                            overflow: 'justify'\n                        },\n                        showLastLabel: true\n                    },\n                    defaultOptions.xAxis, // #3802\n                    xAxisOptions, // user options\n                    { // forced options\n                        type: 'datetime',\n                        categories: null\n                    },\n                    disableStartOnTick\n                );\n            });\n\n            // apply Y axis options to both single and multi y axes\n            options.yAxis = map(splat(options.yAxis || {}), function(yAxisOptions) {\n                opposite = pick(yAxisOptions.opposite, true);\n                return merge({ // defaults\n                        labels: {\n                            y: -2\n                        },\n                        opposite: opposite,\n                        showLastLabel: false,\n                        title: {\n                            text: null\n                        }\n                    },\n                    defaultOptions.yAxis, // #3802\n                    yAxisOptions // user options\n                );\n            });\n\n            options.series = null;\n\n            options = merge({\n                    chart: {\n                        panning: true,\n                        pinchType: 'x'\n                    },\n                    navigator: {\n                        enabled: navigatorEnabled\n                    },\n                    scrollbar: {\n                        // #4988 - check if setOptions was called\n                        enabled: pick(defaultOptions.scrollbar.enabled, true)\n                    },\n                    rangeSelector: {\n                        // #4988 - check if setOptions was called\n                        enabled: pick(defaultOptions.rangeSelector.enabled, true)\n                    },\n                    title: {\n                        text: null\n                    },\n                    tooltip: {\n                        shared: true,\n                        crosshairs: true\n                    },\n                    legend: {\n                        enabled: false\n                    },\n\n                    plotOptions: {\n                        line: lineOptions,\n                        spline: lineOptions,\n                        area: lineOptions,\n                        areaspline: lineOptions,\n                        arearange: lineOptions,\n                        areasplinerange: lineOptions,\n                        column: columnOptions,\n                        columnrange: columnOptions,\n                        candlestick: columnOptions,\n                        ohlc: columnOptions\n                    }\n\n                },\n\n                options, // user's options\n\n                { // forced options\n                    isStock: true // internal flag\n                }\n            );\n\n            options.series = seriesOptions;\n\n            return hasRenderToArg ?\n                new Chart(a, options, c) :\n                new Chart(options, b);\n        };\n\n        // Override the automatic label alignment so that the first Y axis' labels\n        // are drawn on top of the grid line, and subsequent axes are drawn outside\n        wrap(Axis.prototype, 'autoLabelAlign', function(proceed) {\n            var chart = this.chart,\n                options = this.options,\n                panes = chart._labelPanes = chart._labelPanes || {},\n                key,\n                labelOptions = this.options.labels;\n            if (this.chart.options.isStock && this.coll === 'yAxis') {\n                key = options.top + ',' + options.height;\n                if (!panes[key] && labelOptions.enabled) { // do it only for the first Y axis of each pane\n                    if (labelOptions.x === 15) { // default\n                        labelOptions.x = 0;\n                    }\n                    if (labelOptions.align === undefined) {\n                        labelOptions.align = 'right';\n                    }\n                    panes[key] = this;\n                    return 'right';\n                }\n            }\n            return proceed.call(this, [].slice.call(arguments, 1));\n        });\n\n        // Clear axis from label panes (#6071)\n        wrap(Axis.prototype, 'destroy', function(proceed) {\n            var chart = this.chart,\n                key = this.options && (this.options.top + ',' + this.options.height);\n\n            if (key && chart._labelPanes && chart._labelPanes[key] === this) {\n                delete chart._labelPanes[key];\n            }\n\n            return proceed.call(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n        // Override getPlotLinePath to allow for multipane charts\n        wrap(Axis.prototype, 'getPlotLinePath', function(proceed, value, lineWidth, old, force, translatedValue) {\n            var axis = this,\n                series = (this.isLinked && !this.series ? this.linkedParent.series : this.series),\n                chart = axis.chart,\n                renderer = chart.renderer,\n                axisLeft = axis.left,\n                axisTop = axis.top,\n                x1,\n                y1,\n                x2,\n                y2,\n                result = [],\n                axes = [], //#3416 need a default array\n                axes2,\n                uniqueAxes,\n                transVal;\n\n            /**\n             * Return the other axis based on either the axis option or on related series.\n             */\n            function getAxis(coll) {\n                var otherColl = coll === 'xAxis' ? 'yAxis' : 'xAxis',\n                    opt = axis.options[otherColl];\n\n                // Other axis indexed by number\n                if (isNumber(opt)) {\n                    return [chart[otherColl][opt]];\n                }\n\n                // Other axis indexed by id (like navigator)\n                if (isString(opt)) {\n                    return [chart.get(opt)];\n                }\n\n                // Auto detect based on existing series\n                return map(series, function(s) {\n                    return s[otherColl];\n                });\n            }\n\n            // Ignore in case of colorAxis or zAxis. #3360, #3524, #6720\n            if (axis.coll !== 'xAxis' && axis.coll !== 'yAxis') {\n                return proceed.apply(this, [].slice.call(arguments, 1));\n            }\n\n            // Get the related axes based on series\n            axes = getAxis(axis.coll);\n\n            // Get the related axes based options.*Axis setting #2810\n            axes2 = (axis.isXAxis ? chart.yAxis : chart.xAxis);\n            each(axes2, function(A) {\n                if (defined(A.options.id) ? A.options.id.indexOf('navigator') === -1 : true) {\n                    var a = (A.isXAxis ? 'yAxis' : 'xAxis'),\n                        rax = (defined(A.options[a]) ? chart[a][A.options[a]] : chart[a][0]);\n\n                    if (axis === rax) {\n                        axes.push(A);\n                    }\n                }\n            });\n\n\n            // Remove duplicates in the axes array. If there are no axes in the axes array,\n            // we are adding an axis without data, so we need to populate this with grid\n            // lines (#2796).\n            uniqueAxes = axes.length ? [] : [axis.isXAxis ? chart.yAxis[0] : chart.xAxis[0]]; //#3742\n            each(axes, function(axis2) {\n                if (\n                    inArray(axis2, uniqueAxes) === -1 &&\n                    // Do not draw on axis which overlap completely. #5424\n                    !H.find(uniqueAxes, function(unique) {\n                        return unique.pos === axis2.pos && unique.len && axis2.len;\n                    })\n                ) {\n                    uniqueAxes.push(axis2);\n                }\n            });\n\n            transVal = pick(translatedValue, axis.translate(value, null, null, old));\n            if (isNumber(transVal)) {\n                if (axis.horiz) {\n                    each(uniqueAxes, function(axis2) {\n                        var skip;\n\n                        y1 = axis2.pos;\n                        y2 = y1 + axis2.len;\n                        x1 = x2 = Math.round(transVal + axis.transB);\n\n                        if (x1 < axisLeft || x1 > axisLeft + axis.width) { // outside plot area\n                            if (force) {\n                                x1 = x2 = Math.min(Math.max(axisLeft, x1), axisLeft + axis.width);\n                            } else {\n                                skip = true;\n                            }\n                        }\n                        if (!skip) {\n                            result.push('M', x1, y1, 'L', x2, y2);\n                        }\n                    });\n                } else {\n                    each(uniqueAxes, function(axis2) {\n                        var skip;\n\n                        x1 = axis2.pos;\n                        x2 = x1 + axis2.len;\n                        y1 = y2 = Math.round(axisTop + axis.height - transVal);\n\n                        if (y1 < axisTop || y1 > axisTop + axis.height) { // outside plot area\n                            if (force) {\n                                y1 = y2 = Math.min(Math.max(axisTop, y1), axis.top + axis.height);\n                            } else {\n                                skip = true;\n                            }\n                        }\n                        if (!skip) {\n                            result.push('M', x1, y1, 'L', x2, y2);\n                        }\n                    });\n                }\n            }\n            return result.length > 0 ?\n                renderer.crispPolyLine(result, lineWidth || 1) :\n                null; //#3557 getPlotLinePath in regular Highcharts also returns null\n        });\n\n        // Override getPlotBandPath to allow for multipane charts\n        Axis.prototype.getPlotBandPath = function(from, to) {\n            var toPath = this.getPlotLinePath(to, null, null, true),\n                path = this.getPlotLinePath(from, null, null, true),\n                result = [],\n                i;\n\n            if (path && toPath) {\n                if (path.toString() === toPath.toString()) {\n                    // #6166\n                    result = path;\n                    result.flat = true;\n                } else {\n                    // Go over each subpath\n                    for (i = 0; i < path.length; i += 6) {\n                        result.push(\n                            'M', path[i + 1], path[i + 2],\n                            'L', path[i + 4], path[i + 5],\n                            toPath[i + 4], toPath[i + 5],\n                            toPath[i + 1], toPath[i + 2],\n                            'z'\n                        );\n                    }\n                }\n            } else { // outside the axis area\n                result = null;\n            }\n\n            return result;\n        };\n\n        // Function to crisp a line with multiple segments\n        SVGRenderer.prototype.crispPolyLine = function(points, width) {\n            // points format: ['M', 0, 0, 'L', 100, 0]\t\t\n            // normalize to a crisp line\n            var i;\n            for (i = 0; i < points.length; i = i + 6) {\n                if (points[i + 1] === points[i + 4]) {\n                    // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n                    points[i + 1] = points[i + 4] = Math.round(points[i + 1]) - (width % 2 / 2);\n                }\n                if (points[i + 2] === points[i + 5]) {\n                    points[i + 2] = points[i + 5] = Math.round(points[i + 2]) + (width % 2 / 2);\n                }\n            }\n            return points;\n        };\n\n        if (Renderer === VMLRenderer) {\n            VMLRenderer.prototype.crispPolyLine = SVGRenderer.prototype.crispPolyLine;\n        }\n\n\n        // Wrapper to hide the label\n        wrap(Axis.prototype, 'hideCrosshair', function(proceed, i) {\n\n            proceed.call(this, i);\n\n            if (this.crossLabel) {\n                this.crossLabel = this.crossLabel.hide();\n            }\n        });\n\n        // Wrapper to draw the label\n        wrap(Axis.prototype, 'drawCrosshair', function(proceed, e, point) {\n\n            // Draw the crosshair\n            proceed.call(this, e, point);\n\n            // Check if the label has to be drawn\n            if (!defined(this.crosshair.label) || !this.crosshair.label.enabled || !this.cross) {\n                return;\n            }\n\n            var chart = this.chart,\n                options = this.options.crosshair.label, // the label's options\n                horiz = this.horiz, // axis orientation\n                opposite = this.opposite, // axis position\n                left = this.left, // left position\n                top = this.top, // top position\n                crossLabel = this.crossLabel, // reference to the svgElement\n                posx,\n                posy,\n                crossBox,\n                formatOption = options.format,\n                formatFormat = '',\n                limit,\n                align,\n                tickInside = this.options.tickPosition === 'inside',\n                snap = this.crosshair.snap !== false,\n                value,\n                offset = 0;\n\n            // Use last available event (#5287)\n            if (!e) {\n                e = this.cross && this.cross.e;\n            }\n\n            align = (horiz ? 'center' : opposite ?\n                (this.labelAlign === 'right' ? 'right' : 'left') :\n                (this.labelAlign === 'left' ? 'left' : 'center'));\n\n            // If the label does not exist yet, create it.\n            if (!crossLabel) {\n                crossLabel = this.crossLabel = chart.renderer.label(null, null, null, options.shape || 'callout')\n                    .addClass('highcharts-crosshair-label' +\n                        (this.series[0] && ' highcharts-color-' + this.series[0].colorIndex))\n                    .attr({\n                        align: options.align || align,\n                        padding: pick(options.padding, 8),\n                        r: pick(options.borderRadius, 3),\n                        zIndex: 2\n                    })\n                    .add(this.labelGroup);\n\n\n                // Presentational\n                crossLabel\n                    .attr({\n                        fill: options.backgroundColor ||\n                            (this.series[0] && this.series[0].color) || '#666666',\n                        stroke: options.borderColor || '',\n                        'stroke-width': options.borderWidth || 0\n                    })\n                    .css(extend({\n                        color: '#ffffff',\n                        fontWeight: 'normal',\n                        fontSize: '11px',\n                        textAlign: 'center'\n                    }, options.style));\n\n            }\n\n            if (horiz) {\n                posx = snap ? point.plotX + left : e.chartX;\n                posy = top + (opposite ? 0 : this.height);\n            } else {\n                posx = opposite ? this.width + left : 0;\n                posy = snap ? point.plotY + top : e.chartY;\n            }\n\n            if (!formatOption && !options.formatter) {\n                if (this.isDatetimeAxis) {\n                    formatFormat = '%b %d, %Y';\n                }\n                formatOption = '{value' + (formatFormat ? ':' + formatFormat : '') + '}';\n            }\n\n            // Show the label\n            value = snap ? point[this.isXAxis ? 'x' : 'y'] : this.toValue(horiz ? e.chartX : e.chartY);\n            crossLabel.attr({\n                text: formatOption ? format(formatOption, {\n                    value: value\n                }) : options.formatter.call(this, value),\n                x: posx,\n                y: posy,\n                visibility: 'visible'\n            });\n\n            crossBox = crossLabel.getBBox();\n\n            // now it is placed we can correct its position\n            if (horiz) {\n                if ((tickInside && !opposite) || (!tickInside && opposite)) {\n                    posy = crossLabel.y - crossBox.height;\n                }\n            } else {\n                posy = crossLabel.y - (crossBox.height / 2);\n            }\n\n            // check the edges\n            if (horiz) {\n                limit = {\n                    left: left - crossBox.x,\n                    right: left + this.width - crossBox.x\n                };\n            } else {\n                limit = {\n                    left: this.labelAlign === 'left' ? left : 0,\n                    right: this.labelAlign === 'right' ? left + this.width : chart.chartWidth\n                };\n            }\n\n            // left edge\n            if (crossLabel.translateX < limit.left) {\n                offset = limit.left - crossLabel.translateX;\n            }\n            // right edge\n            if (crossLabel.translateX + crossBox.width >= limit.right) {\n                offset = -(crossLabel.translateX + crossBox.width - limit.right);\n            }\n\n            // show the crosslabel\n            crossLabel.attr({\n                x: posx + offset,\n                y: posy,\n                // First set x and y, then anchorX and anchorY, when box is actually calculated, #5702\n                anchorX: horiz ? posx : (this.opposite ? 0 : chart.chartWidth),\n                anchorY: horiz ? (this.opposite ? chart.chartHeight : 0) : posy + crossBox.height / 2\n            });\n        });\n\n        /* ****************************************************************************\n         * Start value compare logic\t\t\t\t\t\t\t\t\t\t\t\t  *\n         *****************************************************************************/\n\n        /**\n         * Extend series.init by adding a method to modify the y value used for plotting\n         * on the y axis. This method is called both from the axis when finding dataMin\n         * and dataMax, and from the series.translate method.\n         */\n        seriesProto.init = function() {\n\n            // Call base method\n            seriesInit.apply(this, arguments);\n\n            // Set comparison mode\n            this.setCompare(this.options.compare);\n        };\n\n        /**\n         * Highstock only. Set the {@link\n         * http://api.highcharts.com/highstock/plotOptions.series.compare|\n         * compare} mode of the series after render time. In most cases it is more\n         * useful running {@link Axis#setCompare} on the X axis to update all its\n         * series.\n         *\n         * @function setCompare\n         * @memberOf Series.prototype\n         *\n         * @param  {String} compare\n         *         Can be one of `null`, `\"percent\"` or `\"value\"`.\n         */\n        seriesProto.setCompare = function(compare) {\n\n            // Set or unset the modifyValue method\n            this.modifyValue = (compare === 'value' || compare === 'percent') ? function(value, point) {\n                var compareValue = this.compareValue;\n\n                if (value !== undefined && compareValue !== undefined) { // #2601, #5814\n\n                    // Get the modified value\n                    if (compare === 'value') {\n                        value -= compareValue;\n\n                        // Compare percent\n                    } else {\n                        value = 100 * (value / compareValue) -\n                            (this.options.compareBase === 100 ? 0 : 100);\n                    }\n\n                    // record for tooltip etc.\n                    if (point) {\n                        point.change = value;\n                    }\n\n                    return value;\n                }\n            } : null;\n\n            // Survive to export, #5485\n            this.userOptions.compare = compare;\n\n            // Mark dirty\n            if (this.chart.hasRendered) {\n                this.isDirty = true;\n            }\n\n        };\n\n        /**\n         * Extend series.processData by finding the first y value in the plot area,\n         * used for comparing the following values\n         */\n        seriesProto.processData = function() {\n            var series = this,\n                i,\n                keyIndex = -1,\n                processedXData,\n                processedYData,\n                length,\n                compareValue;\n\n            // call base method\n            seriesProcessData.apply(this, arguments);\n\n            if (series.xAxis && series.processedYData) { // not pies\n\n                // local variables\n                processedXData = series.processedXData;\n                processedYData = series.processedYData;\n                length = processedYData.length;\n\n                // For series with more than one value (range, OHLC etc), compare against\n                // close or the pointValKey (#4922, #3112)\n                if (series.pointArrayMap) {\n                    // Use close if present (#3112)\n                    keyIndex = inArray('close', series.pointArrayMap);\n                    if (keyIndex === -1) {\n                        keyIndex = inArray(series.pointValKey || 'y', series.pointArrayMap);\n                    }\n                }\n\n                // find the first value for comparison\n                for (i = 0; i < length - 1; i++) {\n                    compareValue = processedYData[i] && keyIndex > -1 ?\n                        processedYData[i][keyIndex] :\n                        processedYData[i];\n                    if (isNumber(compareValue) && processedXData[i + 1] >= series.xAxis.min && compareValue !== 0) {\n                        series.compareValue = compareValue;\n                        break;\n                    }\n                }\n            }\n        };\n\n        /**\n         * Modify series extremes\n         */\n        wrap(seriesProto, 'getExtremes', function(proceed) {\n            var extremes;\n\n            proceed.apply(this, [].slice.call(arguments, 1));\n\n            if (this.modifyValue) {\n                extremes = [this.modifyValue(this.dataMin), this.modifyValue(this.dataMax)];\n                this.dataMin = arrayMin(extremes);\n                this.dataMax = arrayMax(extremes);\n            }\n        });\n\n        /**\n         * Highstock only. Set the compare mode on all series belonging to an Y axis\n         * after render time.\n         *\n         * @param  {String} compare\n         *         The compare mode. Can be one of `null`, `\"value\"` or `\"percent\"`.\n         * @param  {Boolean} [redraw=true]\n         *         Whether to redraw the chart or to wait for a later call to {@link\n         *         Chart#redraw},\n         *\n         * @function setCompare\n         * @memberOf Axis.prototype\n         *\n         * @see    {@link https://api.highcharts.com/highstock/series.plotOptions.compare|\n         *         series.plotOptions.compare}\n         *\n         * @sample stock/members/axis-setcompare/\n         *         Set compoare\n         */\n        Axis.prototype.setCompare = function(compare, redraw) {\n            if (!this.isXAxis) {\n                each(this.series, function(series) {\n                    series.setCompare(compare);\n                });\n                if (pick(redraw, true)) {\n                    this.chart.redraw();\n                }\n            }\n        };\n\n        /**\n         * Extend the tooltip formatter by adding support for the point.change variable\n         * as well as the changeDecimals option\n         */\n        Point.prototype.tooltipFormatter = function(pointFormat) {\n            var point = this;\n\n            pointFormat = pointFormat.replace(\n                '{point.change}',\n                (point.change > 0 ? '+' : '') +\n                H.numberFormat(point.change, pick(point.series.tooltipOptions.changeDecimals, 2))\n            );\n\n            return pointTooltipFormatter.apply(this, [pointFormat]);\n        };\n\n        /* ****************************************************************************\n         * End value compare logic\t\t\t\t\t\t\t\t\t\t\t\t\t*\n         *****************************************************************************/\n\n\n        /**\n         * Extend the Series prototype to create a separate series clip box. This is\n         * related to using multiple panes, and a future pane logic should incorporate\n         * this feature (#2754).\n         */\n        wrap(Series.prototype, 'render', function(proceed) {\n            // Only do this on not 3d (#2939, #5904) nor polar (#6057) charts, and only\n            // if the series type handles clipping in the animate method (#2975).\n            if (!(this.chart.is3d && this.chart.is3d()) &&\n                !this.chart.polar &&\n                this.xAxis &&\n                !this.xAxis.isRadial // Gauge, #6192\n            ) {\n\n                // First render, initial clip box\n                if (!this.clipBox && this.animate) {\n                    this.clipBox = merge(this.chart.clipBox);\n                    this.clipBox.width = this.xAxis.len;\n                    this.clipBox.height = this.yAxis.len;\n\n                    // On redrawing, resizing etc, update the clip rectangle\n                } else if (this.chart[this.sharedClipKey]) {\n                    this.chart[this.sharedClipKey].attr({\n                        width: this.xAxis.len,\n                        height: this.yAxis.len\n                    });\n                    // #3111\n                } else if (this.clipBox) {\n                    this.clipBox.width = this.xAxis.len;\n                    this.clipBox.height = this.yAxis.len;\n                }\n            }\n            proceed.call(this);\n        });\n\n        wrap(Chart.prototype, 'getSelectedPoints', function(proceed) {\n            var points = proceed.call(this);\n\n            each(this.series, function(serie) {\n                // series.points - for grouped points (#6445)\n                if (serie.hasGroupedData) {\n                    points = points.concat(grep(serie.points || [], function(point) {\n                        return point.selected;\n                    }));\n                }\n            });\n            return points;\n        });\n\n        wrap(Chart.prototype, 'update', function(proceed, options) {\n            // Use case: enabling scrollbar from a disabled state.\n            // Scrollbar needs to be initialized from a controller, Navigator in this\n            // case (#6615)\n            if ('scrollbar' in options && this.navigator) {\n                merge(true, this.options.scrollbar, options.scrollbar);\n                this.navigator.update({}, false);\n                delete options.scrollbar;\n            }\n\n            return proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/treemap.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n\n (c) 2014 Highsoft AS\n Authors: Jon Arild Nygard / Oystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(q){\"object\"===typeof module&&module.exports?module.exports=q:q(Highcharts)})(function(q){(function(g){var q=g.seriesType,l=g.seriesTypes,E=g.map,v=g.merge,y=g.extend,z=g.noop,p=g.each,x=g.grep,F=g.isNumber,A=g.isString,k=g.pick,u=g.Series,G=g.stableSort,B=g.Color,H=function(a,b,c){c=c||this;g.objectEach(a,function(e,d){b.call(c,e,d,a)})},C=function(a,b,c,e){e=e||this;a=a||[];p(a,function(d,f){c=b.call(e,c,d,f,a)});return c},w=function(a,b,c){c=c||this;a=b.call(c,a);!1!==a&&w(a,b,c)};q(\"treemap\",\n\"scatter\",{showInLegend:!1,marker:!1,dataLabels:{enabled:!0,defer:!1,verticalAlign:\"middle\",formatter:function(){return this.point.name||this.point.id},inside:!0},tooltip:{headerFormat:\"\",pointFormat:\"\\x3cb\\x3e{point.name}\\x3c/b\\x3e: {point.value}\\x3c/b\\x3e\\x3cbr/\\x3e\"},ignoreHiddenPoint:!0,layoutAlgorithm:\"sliceAndDice\",layoutStartingDirection:\"vertical\",alternateStartingDirection:!1,levelIsConstant:!0,drillUpButton:{position:{align:\"right\",x:-10,y:10}},borderColor:\"#e6e6e6\",borderWidth:1,opacity:.15,\nstates:{hover:{borderColor:\"#999999\",brightness:l.heatmap?0:.1,opacity:.75,shadow:!1}}},{pointArrayMap:[\"value\"],axisTypes:l.heatmap?[\"xAxis\",\"yAxis\",\"colorAxis\"]:[\"xAxis\",\"yAxis\"],optionalAxis:\"colorAxis\",getSymbol:z,parallelArrays:[\"x\",\"y\",\"value\",\"colorValue\"],colorKey:\"colorValue\",translateColors:l.heatmap&&l.heatmap.prototype.translateColors,trackerGroups:[\"group\",\"dataLabelsGroup\"],getListOfParents:function(a,b){a=C(a,function(a,b,d){b=k(b.parent,\"\");void 0===a[b]&&(a[b]=[]);a[b].push(d);return a},\n{});H(a,function(a,e,d){\"\"!==e&&-1===g.inArray(e,b)&&(p(a,function(a){d[\"\"].push(a)}),delete d[e])});return a},getTree:function(){var a=E(this.data,function(a){return a.id}),a=this.getListOfParents(this.data,a);this.nodeMap=[];return this.buildNode(\"\",-1,0,a,null)},init:function(a,b){u.prototype.init.call(this,a,b);this.options.allowDrillToNode&&g.addEvent(this,\"click\",this.onClickDrillToNode)},buildNode:function(a,b,c,e,d){var f=this,h=[],D=f.points[b],m;p(e[a]||[],function(b){m=f.buildNode(f.points[b].id,\nb,c+1,e,a);h.push(m)});b={id:a,i:b,children:h,level:c,parent:d,visible:!1};f.nodeMap[b.id]=b;D&&(D.node=b);return b},setTreeValues:function(a){var b=this,c=b.options,e=0,d=[],f,h=b.points[a.i];w(b.nodeMap[b.rootNode],function(a){var c=!1,d=a.parent;a.visible=!0;if(d||\"\"===d)c=b.nodeMap[d];return c});w(b.nodeMap[b.rootNode].children,function(a){var b=!1;p(a,function(a){a.visible=!0;a.children.length&&(b=(b||[]).concat(a.children))});return b});p(a.children,function(a){a=b.setTreeValues(a);d.push(a);\na.ignore?w(a.children,function(a){var b=!1;p(a,function(a){y(a,{ignore:!0,isLeaf:!1,visible:!1});a.children.length&&(b=(b||[]).concat(a.children))});return b}):e+=a.val});G(d,function(a,b){return a.sortIndex-b.sortIndex});f=k(h&&h.options.value,e);h&&(h.value=f);y(a,{children:d,childrenTotal:e,ignore:!(k(h&&h.visible,!0)&&0<f),isLeaf:a.visible&&!e,levelDynamic:c.levelIsConstant?a.level:a.level-b.nodeMap[b.rootNode].level,name:k(h&&h.name,\"\"),sortIndex:k(h&&h.sortIndex,-f),val:f});return a},calculateChildrenAreas:function(a,\nb){var c=this,e=c.options,d=this.levelMap[a.levelDynamic+1],f=k(c[d&&d.layoutAlgorithm]&&d.layoutAlgorithm,e.layoutAlgorithm),h=e.alternateStartingDirection,g=[];a=x(a.children,function(a){return!a.ignore});d&&d.layoutStartingDirection&&(b.direction=\"vertical\"===d.layoutStartingDirection?0:1);g=c[f](b,a);p(a,function(a,d){d=g[d];a.values=v(d,{val:a.childrenTotal,direction:h?1-b.direction:b.direction});a.pointValues=v(d,{x:d.x/c.axisRatio,width:d.width/c.axisRatio});a.children.length&&c.calculateChildrenAreas(a,\na.values)})},setPointValues:function(){var a=this,b=a.xAxis,c=a.yAxis;p(a.points,function(e){var d=e.node,f=d.pointValues,h,g,m;m=(a.pointAttribs(e)[\"stroke-width\"]||0)%2/2;f&&d.visible?(d=Math.round(b.translate(f.x,0,0,0,1))-m,h=Math.round(b.translate(f.x+f.width,0,0,0,1))-m,g=Math.round(c.translate(f.y,0,0,0,1))-m,f=Math.round(c.translate(f.y+f.height,0,0,0,1))-m,e.shapeType=\"rect\",e.shapeArgs={x:Math.min(d,h),y:Math.min(g,f),width:Math.abs(h-d),height:Math.abs(f-g)},e.plotX=e.shapeArgs.x+e.shapeArgs.width/\n2,e.plotY=e.shapeArgs.y+e.shapeArgs.height/2):(delete e.plotX,delete e.plotY)})},setColorRecursive:function(a,b,c){var e=this,d,f;a&&(d=e.points[a.i],f=e.levelMap[a.levelDynamic],b=k(d&&d.options.color,f&&f.color,b,e.color),c=k(d&&d.options.colorIndex,f&&f.colorIndex,c,e.colorIndex),d&&(d.color=b,d.colorIndex=c),a.children.length&&p(a.children,function(a){e.setColorRecursive(a,b,c)}))},algorithmGroup:function(a,b,c,e){this.height=a;this.width=b;this.plot=e;this.startDirection=this.direction=c;this.lH=\nthis.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,b){return Math.max(a/b,b/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;0===this.direction?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=\nthis.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,b,c,e){var d,f,h,g,m=c.lW,k=c.lH,n=c.plot,l,r=0,t=c.elArr.length-1;b?(m=c.nW,k=c.nH):l=c.elArr[c.elArr.length-1];p(c.elArr,function(a){if(b||r<t)0===c.direction?(d=n.x,f=n.y,h=m,g=a/h):(d=n.x,f=\nn.y,g=k,h=a/g),e.push({x:d,y:f,width:h,height:g}),0===c.direction?n.y+=g:n.x+=h;r+=1});c.reset();0===c.direction?c.width-=m:c.height-=k;n.y=n.parent.y+(n.parent.height-c.height);n.x=n.parent.x+(n.parent.width-c.width);a&&(c.direction=1-c.direction);b||c.addElement(l)},algorithmLowAspectRatio:function(a,b,c){var e=[],d=this,f,g={x:b.x,y:b.y,parent:b},k=0,m=c.length-1,l=new this.algorithmGroup(b.height,b.width,b.direction,g);p(c,function(c){f=c.val/b.val*b.height*b.width;l.addElement(f);l.lP.nR>l.lP.lR&&\nd.algorithmCalcPoints(a,!1,l,e,g);k===m&&d.algorithmCalcPoints(a,!0,l,e,g);k+=1});return e},algorithmFill:function(a,b,c){var e=[],d,f=b.direction,g=b.x,k=b.y,m=b.width,l=b.height,n,q,r,t;p(c,function(c){d=c.val/b.val*b.height*b.width;n=g;q=k;0===f?(t=l,r=d/t,m-=r,g+=r):(r=m,t=d/r,l-=t,k+=t);e.push({x:n,y:q,width:r,height:t});a&&(f=1-f)});return e},strip:function(a,b){return this.algorithmLowAspectRatio(!1,a,b)},squarified:function(a,b){return this.algorithmLowAspectRatio(!0,a,b)},sliceAndDice:function(a,\nb){return this.algorithmFill(!0,a,b)},stripes:function(a,b){return this.algorithmFill(!1,a,b)},translate:function(){var a=this.rootNode=k(this.rootNode,this.options.rootId,\"\"),b,c;u.prototype.translate.call(this);this.levelMap=C(this.options.levels,function(a,b){a[b.level]=b;return a},{});c=this.tree=this.getTree();b=this.nodeMap[a];\"\"===a||b&&b.children.length||(this.drillToNode(\"\",!1),a=this.rootNode,b=this.nodeMap[a]);this.setTreeValues(c);this.axisRatio=this.xAxis.len/this.yAxis.len;this.nodeMap[\"\"].pointValues=\na={x:0,y:0,width:100,height:100};this.nodeMap[\"\"].values=a=v(a,{width:a.width*this.axisRatio,direction:\"vertical\"===this.options.layoutStartingDirection?0:1,val:c.val});this.calculateChildrenAreas(c,a);this.colorAxis?this.translateColors():this.options.colorByPoint||this.setColorRecursive(this.tree);this.options.allowDrillToNode&&(b=b.pointValues,this.xAxis.setExtremes(b.x,b.x+b.width,!1),this.yAxis.setExtremes(b.y,b.y+b.height,!1),this.xAxis.setScale(),this.yAxis.setScale());this.setPointValues()},\ndrawDataLabels:function(){var a=this,b=x(a.points,function(a){return a.node.visible}),c,e;p(b,function(b){e=a.levelMap[b.node.levelDynamic];c={style:{}};b.node.isLeaf||(c.enabled=!1);e&&e.dataLabels&&(c=v(c,e.dataLabels),a._hasPointLabels=!0);b.shapeArgs&&(c.style.width=b.shapeArgs.width,b.dataLabel&&b.dataLabel.css({width:b.shapeArgs.width+\"px\"}));b.dlOptions=v(c,b.options.dataLabels)});u.prototype.drawDataLabels.call(this)},alignDataLabel:function(a){l.column.prototype.alignDataLabel.apply(this,\narguments);a.dataLabel&&a.dataLabel.attr({zIndex:a.node.zIndex+1})},pointAttribs:function(a,b){var c=this.levelMap[a.node.levelDynamic]||{},e=this.options,d=b&&e.states[b]||{},f=a.getClassName();a={stroke:a.borderColor||c.borderColor||d.borderColor||e.borderColor,\"stroke-width\":k(a.borderWidth,c.borderWidth,d.borderWidth,e.borderWidth),dashstyle:a.borderDashStyle||c.borderDashStyle||d.borderDashStyle||e.borderDashStyle,fill:a.color||this.color};-1!==f.indexOf(\"highcharts-above-level\")?(a.fill=\"none\",\na[\"stroke-width\"]=0):-1!==f.indexOf(\"highcharts-internal-node-interactive\")?(b=k(d.opacity,e.opacity),a.fill=B(a.fill).setOpacity(b).get(),a.cursor=\"pointer\"):-1!==f.indexOf(\"highcharts-internal-node\")?a.fill=\"none\":b&&(a.fill=B(a.fill).brighten(d.brightness).get());return a},drawPoints:function(){var a=this,b=x(a.points,function(a){return a.node.visible});p(b,function(b){var c=\"levelGroup-\"+b.node.levelDynamic;a[c]||(a[c]=a.chart.renderer.g(c).attr({zIndex:1E3-b.node.levelDynamic}).add(a.group));\nb.group=a[c]});l.column.prototype.drawPoints.call(this);a.options.allowDrillToNode&&p(b,function(b){b.graphic&&(b.drillId=a.options.interactByLeaf?a.drillToByLeaf(b):a.drillToByGroup(b))})},onClickDrillToNode:function(a){var b=(a=a.point)&&a.drillId;A(b)&&(a.setState(\"\"),this.drillToNode(b))},drillToByGroup:function(a){var b=!1;1!==a.node.level-this.nodeMap[this.rootNode].level||a.node.isLeaf||(b=a.id);return b},drillToByLeaf:function(a){var b=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=\na.node;!b;)a=this.nodeMap[a.parent],a.parent===this.rootNode&&(b=a.id);return b},drillUp:function(){var a=this.nodeMap[this.rootNode];a&&A(a.parent)&&this.drillToNode(a.parent)},drillToNode:function(a,b){var c=this.nodeMap[a];this.rootNode=a;\"\"===a?this.drillUpButton=this.drillUpButton.destroy():this.showDrillUpButton(c&&c.name||a);this.isDirty=!0;k(b,!0)&&this.chart.redraw()},showDrillUpButton:function(a){var b=this;a=a||\"\\x3c Back\";var c=b.options.drillUpButton,e,d;c.text&&(a=c.text);this.drillUpButton?\nthis.drillUpButton.attr({text:a}).align():(d=(e=c.theme)&&e.states,this.drillUpButton=this.chart.renderer.button(a,null,null,function(){b.drillUp()},e,d&&d.hover,d&&d.select).attr({align:c.position.align,zIndex:7}).add().align(c.position,!1,c.relativeTo||\"plotBox\"))},buildKDTree:z,drawLegendSymbol:g.LegendSymbolMixin.drawRectangle,getExtremes:function(){u.prototype.getExtremes.call(this,this.colorValueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;u.prototype.getExtremes.call(this)},\ngetExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};u.prototype.bindAxes.call(this);g.extend(this.yAxis.options,a);g.extend(this.xAxis.options,a)}},{getClassName:function(){var a=g.Point.prototype.getClassName.call(this),b=this.series,c=b.options;this.node.level<=b.nodeMap[b.rootNode].level?a+=\" highcharts-above-level\":this.node.isLeaf||k(c.interactByLeaf,\n!c.allowDrillToNode)?this.node.isLeaf||(a+=\" highcharts-internal-node\"):a+=\" highcharts-internal-node-interactive\";return a},isValid:function(){return F(this.value)},setState:function(a){g.Point.prototype.setState.call(this,a);this.graphic&&this.graphic.attr({zIndex:\"hover\"===a?1:0})},setVisible:l.pie.prototype.pointClass.prototype.setVisible})})(q)});\n"
  },
  {
    "path": "assets/highcharts/modules/treemap.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2014 Highsoft AS\n * Authors: Jon Arild Nygard / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2014 Highsoft AS\n         * Authors: Jon Arild Nygard / Oystein Moseng\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var seriesType = H.seriesType,\n            seriesTypes = H.seriesTypes,\n            map = H.map,\n            merge = H.merge,\n            extend = H.extend,\n            noop = H.noop,\n            each = H.each,\n            grep = H.grep,\n            isNumber = H.isNumber,\n            isString = H.isString,\n            pick = H.pick,\n            Series = H.Series,\n            stableSort = H.stableSort,\n            color = H.Color,\n            eachObject = function(list, func, context) {\n                context = context || this;\n                H.objectEach(list, function(val, key) {\n                    func.call(context, val, key, list);\n                });\n            },\n            reduce = function(arr, func, previous, context) {\n                context = context || this;\n                arr = arr || []; // @note should each be able to handle empty values automatically?\n                each(arr, function(current, i) {\n                    previous = func.call(context, previous, current, i, arr);\n                });\n                return previous;\n            },\n            // @todo find correct name for this function. \n            // @todo Similar to reduce, this function is likely redundant\n            recursive = function(item, func, context) {\n                var next;\n                context = context || this;\n                next = func.call(context, item);\n                if (next !== false) {\n                    recursive(next, func, context);\n                }\n            };\n\n        // The Treemap series type\n        seriesType('treemap', 'scatter', {\n            showInLegend: false,\n            marker: false,\n            dataLabels: {\n                enabled: true,\n                defer: false,\n                verticalAlign: 'middle',\n                formatter: function() { // #2945\n                    return this.point.name || this.point.id;\n                },\n                inside: true\n            },\n            tooltip: {\n                headerFormat: '',\n                pointFormat: '<b>{point.name}</b>: {point.value}</b><br/>'\n            },\n            ignoreHiddenPoint: true,\n            layoutAlgorithm: 'sliceAndDice',\n            layoutStartingDirection: 'vertical',\n            alternateStartingDirection: false,\n            levelIsConstant: true,\n            drillUpButton: {\n                position: {\n                    align: 'right',\n                    x: -10,\n                    y: 10\n                }\n            },\n\n            // Presentational options\n            borderColor: '#e6e6e6',\n            borderWidth: 1,\n            opacity: 0.15,\n            states: {\n                hover: {\n                    borderColor: '#999999',\n                    brightness: seriesTypes.heatmap ? 0 : 0.1,\n                    opacity: 0.75,\n                    shadow: false\n                }\n            }\n\n\n            // Prototype members\n        }, {\n            pointArrayMap: ['value'],\n            axisTypes: seriesTypes.heatmap ? ['xAxis', 'yAxis', 'colorAxis'] : ['xAxis', 'yAxis'],\n            optionalAxis: 'colorAxis',\n            getSymbol: noop,\n            parallelArrays: ['x', 'y', 'value', 'colorValue'],\n            colorKey: 'colorValue', // Point color option key\n            translateColors: seriesTypes.heatmap && seriesTypes.heatmap.prototype.translateColors,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            /**\n             * Creates an object map from parent id to childrens index.\n             * @param {Array} data List of points set in options.\n             * @param {string} data[].parent Parent id of point.\n             * @param {Array} ids List of all point ids.\n             * @return {Object} Map from parent id to children index in data.\n             */\n            getListOfParents: function(data, ids) {\n                var listOfParents = reduce(data, function(prev, curr, i) {\n                    var parent = pick(curr.parent, '');\n                    if (prev[parent] === undefined) {\n                        prev[parent] = [];\n                    }\n                    prev[parent].push(i);\n                    return prev;\n                }, {});\n\n                // If parent does not exist, hoist parent to root of tree.\n                eachObject(listOfParents, function(children, parent, list) {\n                    if ((parent !== '') && (H.inArray(parent, ids) === -1)) {\n                        each(children, function(child) {\n                            list[''].push(child);\n                        });\n                        delete list[parent];\n                    }\n                });\n                return listOfParents;\n            },\n            /**\n             * Creates a tree structured object from the series points\n             */\n            getTree: function() {\n                var series = this,\n                    allIds = map(this.data, function(d) {\n                        return d.id;\n                    }),\n                    parentList = series.getListOfParents(this.data, allIds);\n\n                series.nodeMap = [];\n                return series.buildNode('', -1, 0, parentList, null);\n            },\n            init: function(chart, options) {\n                var series = this;\n                Series.prototype.init.call(series, chart, options);\n                if (series.options.allowDrillToNode) {\n                    H.addEvent(series, 'click', series.onClickDrillToNode);\n                }\n            },\n            buildNode: function(id, i, level, list, parent) {\n                var series = this,\n                    children = [],\n                    point = series.points[i],\n                    node,\n                    child;\n\n                // Actions\n                each((list[id] || []), function(i) {\n                    child = series.buildNode(series.points[i].id, i, (level + 1), list, id);\n                    children.push(child);\n                });\n                node = {\n                    id: id,\n                    i: i,\n                    children: children,\n                    level: level,\n                    parent: parent,\n                    visible: false // @todo move this to better location\n                };\n                series.nodeMap[node.id] = node;\n                if (point) {\n                    point.node = node;\n                }\n                return node;\n            },\n            setTreeValues: function(tree) {\n                var series = this,\n                    options = series.options,\n                    childrenTotal = 0,\n                    children = [],\n                    val,\n                    point = series.points[tree.i];\n                // Parents of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode], function(node) {\n                    var next = false,\n                        p = node.parent;\n                    node.visible = true;\n                    if (p || p === '') {\n                        next = series.nodeMap[p];\n                    }\n                    return next;\n                });\n                // Children of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode].children, function(children) {\n                    var next = false;\n                    each(children, function(child) {\n                        child.visible = true;\n                        if (child.children.length) {\n                            next = (next || []).concat(child.children);\n                        }\n                    });\n                    return next;\n                });\n\n                // First give the children some values\n                each(tree.children, function(child) {\n                    child = series.setTreeValues(child);\n                    children.push(child);\n\n                    if (!child.ignore) {\n                        childrenTotal += child.val;\n                    } else {\n                        // @todo Add predicate to avoid looping already ignored children\n                        recursive(child.children, function(children) {\n                            var next = false;\n                            each(children, function(node) {\n                                extend(node, {\n                                    ignore: true,\n                                    isLeaf: false,\n                                    visible: false\n                                });\n                                if (node.children.length) {\n                                    next = (next || []).concat(node.children);\n                                }\n                            });\n                            return next;\n                        });\n                    }\n                });\n                // Sort the children\n                stableSort(children, function(a, b) {\n                    return a.sortIndex - b.sortIndex;\n                });\n                // Set the values\n                val = pick(point && point.options.value, childrenTotal);\n                if (point) {\n                    point.value = val;\n                }\n                extend(tree, {\n                    children: children,\n                    childrenTotal: childrenTotal,\n                    // Ignore this node if point is not visible\n                    ignore: !(pick(point && point.visible, true) && (val > 0)),\n                    isLeaf: tree.visible && !childrenTotal,\n                    levelDynamic: (options.levelIsConstant ? tree.level : (tree.level - series.nodeMap[series.rootNode].level)),\n                    name: pick(point && point.name, ''),\n                    sortIndex: pick(point && point.sortIndex, -val),\n                    val: val\n                });\n                return tree;\n            },\n            /**\n             * Recursive function which calculates the area for all children of a node.\n             * @param {Object} node The node which is parent to the children.\n             * @param {Object} area The rectangular area of the parent.\n             */\n            calculateChildrenAreas: function(parent, area) {\n                var series = this,\n                    options = series.options,\n                    level = this.levelMap[parent.levelDynamic + 1],\n                    algorithm = pick((series[level && level.layoutAlgorithm] && level.layoutAlgorithm), options.layoutAlgorithm),\n                    alternate = options.alternateStartingDirection,\n                    childrenValues = [],\n                    children;\n\n                // Collect all children which should be included\n                children = grep(parent.children, function(n) {\n                    return !n.ignore;\n                });\n\n                if (level && level.layoutStartingDirection) {\n                    area.direction = level.layoutStartingDirection === 'vertical' ? 0 : 1;\n                }\n                childrenValues = series[algorithm](area, children);\n                each(children, function(child, index) {\n                    var values = childrenValues[index];\n                    child.values = merge(values, {\n                        val: child.childrenTotal,\n                        direction: (alternate ? 1 - area.direction : area.direction)\n                    });\n                    child.pointValues = merge(values, {\n                        x: (values.x / series.axisRatio),\n                        width: (values.width / series.axisRatio)\n                    });\n                    // If node has children, then call method recursively\n                    if (child.children.length) {\n                        series.calculateChildrenAreas(child, child.values);\n                    }\n                });\n            },\n            setPointValues: function() {\n                var series = this,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n                each(series.points, function(point) {\n                    var node = point.node,\n                        values = node.pointValues,\n                        x1,\n                        x2,\n                        y1,\n                        y2,\n                        crispCorr = 0;\n\n\n                    // Get the crisp correction in classic mode. For this to work in \n                    // styled mode, we would need to first add the shape (without x, y,\n                    // width and height), then read the rendered stroke width using\n                    // point.graphic.strokeWidth(), then modify and apply the shapeArgs.\n                    // This applies also to column series, but the downside is\n                    // performance and code complexity.\n                    crispCorr = (\n                        (series.pointAttribs(point)['stroke-width'] || 0) % 2\n                    ) / 2;\n\n\n                    // Points which is ignored, have no values.\n                    if (values && node.visible) {\n                        x1 = Math.round(xAxis.translate(values.x, 0, 0, 0, 1)) - crispCorr;\n                        x2 = Math.round(xAxis.translate(values.x + values.width, 0, 0, 0, 1)) - crispCorr;\n                        y1 = Math.round(yAxis.translate(values.y, 0, 0, 0, 1)) - crispCorr;\n                        y2 = Math.round(yAxis.translate(values.y + values.height, 0, 0, 0, 1)) - crispCorr;\n                        // Set point values\n                        point.shapeType = 'rect';\n                        point.shapeArgs = {\n                            x: Math.min(x1, x2),\n                            y: Math.min(y1, y2),\n                            width: Math.abs(x2 - x1),\n                            height: Math.abs(y2 - y1)\n                        };\n                        point.plotX = point.shapeArgs.x + (point.shapeArgs.width / 2);\n                        point.plotY = point.shapeArgs.y + (point.shapeArgs.height / 2);\n                    } else {\n                        // Reset visibility\n                        delete point.plotX;\n                        delete point.plotY;\n                    }\n                });\n            },\n            setColorRecursive: function(node, color, colorIndex) {\n                var series = this,\n                    point,\n                    level;\n                if (node) {\n                    point = series.points[node.i];\n                    level = series.levelMap[node.levelDynamic];\n                    // Select either point color, level color or inherited color.\n                    color = pick(\n                        point && point.options.color,\n                        level && level.color,\n                        color,\n                        series.color\n                    );\n                    colorIndex = pick(\n                        point && point.options.colorIndex,\n                        level && level.colorIndex,\n                        colorIndex,\n                        series.colorIndex\n                    );\n\n                    if (point) {\n                        point.color = color;\n                        point.colorIndex = colorIndex;\n                    }\n\n                    // Do it all again with the children\t\n                    if (node.children.length) {\n                        each(node.children, function(child) {\n                            series.setColorRecursive(child, color, colorIndex);\n                        });\n                    }\n                }\n            },\n            algorithmGroup: function(h, w, d, p) {\n                this.height = h;\n                this.width = w;\n                this.plot = p;\n                this.direction = d;\n                this.startDirection = d;\n                this.total = 0;\n                this.nW = 0;\n                this.lW = 0;\n                this.nH = 0;\n                this.lH = 0;\n                this.elArr = [];\n                this.lP = {\n                    total: 0,\n                    lH: 0,\n                    nH: 0,\n                    lW: 0,\n                    nW: 0,\n                    nR: 0,\n                    lR: 0,\n                    aspectRatio: function(w, h) {\n                        return Math.max((w / h), (h / w));\n                    }\n                };\n                this.addElement = function(el) {\n                    this.lP.total = this.elArr[this.elArr.length - 1];\n                    this.total = this.total + el;\n                    if (this.direction === 0) {\n                        // Calculate last point old aspect ratio\n                        this.lW = this.nW;\n                        this.lP.lH = this.lP.total / this.lW;\n                        this.lP.lR = this.lP.aspectRatio(this.lW, this.lP.lH);\n                        // Calculate last point new aspect ratio\n                        this.nW = this.total / this.height;\n                        this.lP.nH = this.lP.total / this.nW;\n                        this.lP.nR = this.lP.aspectRatio(this.nW, this.lP.nH);\n                    } else {\n                        // Calculate last point old aspect ratio\n                        this.lH = this.nH;\n                        this.lP.lW = this.lP.total / this.lH;\n                        this.lP.lR = this.lP.aspectRatio(this.lP.lW, this.lH);\n                        // Calculate last point new aspect ratio\n                        this.nH = this.total / this.width;\n                        this.lP.nW = this.lP.total / this.nH;\n                        this.lP.nR = this.lP.aspectRatio(this.lP.nW, this.nH);\n                    }\n                    this.elArr.push(el);\n                };\n                this.reset = function() {\n                    this.nW = 0;\n                    this.lW = 0;\n                    this.elArr = [];\n                    this.total = 0;\n                };\n            },\n            algorithmCalcPoints: function(directionChange, last, group, childrenArea) {\n                var pX,\n                    pY,\n                    pW,\n                    pH,\n                    gW = group.lW,\n                    gH = group.lH,\n                    plot = group.plot,\n                    keep,\n                    i = 0,\n                    end = group.elArr.length - 1;\n                if (last) {\n                    gW = group.nW;\n                    gH = group.nH;\n                } else {\n                    keep = group.elArr[group.elArr.length - 1];\n                }\n                each(group.elArr, function(p) {\n                    if (last || (i < end)) {\n                        if (group.direction === 0) {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pW = gW;\n                            pH = p / pW;\n                        } else {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pH = gH;\n                            pW = p / pH;\n                        }\n                        childrenArea.push({\n                            x: pX,\n                            y: pY,\n                            width: pW,\n                            height: pH\n                        });\n                        if (group.direction === 0) {\n                            plot.y = plot.y + pH;\n                        } else {\n                            plot.x = plot.x + pW;\n                        }\n                    }\n                    i = i + 1;\n                });\n                // Reset variables\n                group.reset();\n                if (group.direction === 0) {\n                    group.width = group.width - gW;\n                } else {\n                    group.height = group.height - gH;\n                }\n                plot.y = plot.parent.y + (plot.parent.height - group.height);\n                plot.x = plot.parent.x + (plot.parent.width - group.width);\n                if (directionChange) {\n                    group.direction = 1 - group.direction;\n                }\n                // If not last, then add uncalculated element\n                if (!last) {\n                    group.addElement(keep);\n                }\n            },\n            algorithmLowAspectRatio: function(directionChange, parent, children) {\n                var childrenArea = [],\n                    series = this,\n                    pTot,\n                    plot = {\n                        x: parent.x,\n                        y: parent.y,\n                        parent: parent\n                    },\n                    direction = parent.direction,\n                    i = 0,\n                    end = children.length - 1,\n                    group = new this.algorithmGroup(parent.height, parent.width, direction, plot); // eslint-disable-line new-cap\n                // Loop through and calculate all areas\n                each(children, function(child) {\n                    pTot = (parent.width * parent.height) * (child.val / parent.val);\n                    group.addElement(pTot);\n                    if (group.lP.nR > group.lP.lR) {\n                        series.algorithmCalcPoints(directionChange, false, group, childrenArea, plot);\n                    }\n                    // If last child, then calculate all remaining areas\n                    if (i === end) {\n                        series.algorithmCalcPoints(directionChange, true, group, childrenArea, plot);\n                    }\n                    i = i + 1;\n                });\n                return childrenArea;\n            },\n            algorithmFill: function(directionChange, parent, children) {\n                var childrenArea = [],\n                    pTot,\n                    direction = parent.direction,\n                    x = parent.x,\n                    y = parent.y,\n                    width = parent.width,\n                    height = parent.height,\n                    pX,\n                    pY,\n                    pW,\n                    pH;\n                each(children, function(child) {\n                    pTot = (parent.width * parent.height) * (child.val / parent.val);\n                    pX = x;\n                    pY = y;\n                    if (direction === 0) {\n                        pH = height;\n                        pW = pTot / pH;\n                        width = width - pW;\n                        x = x + pW;\n                    } else {\n                        pW = width;\n                        pH = pTot / pW;\n                        height = height - pH;\n                        y = y + pH;\n                    }\n                    childrenArea.push({\n                        x: pX,\n                        y: pY,\n                        width: pW,\n                        height: pH\n                    });\n                    if (directionChange) {\n                        direction = 1 - direction;\n                    }\n                });\n                return childrenArea;\n            },\n            strip: function(parent, children) {\n                return this.algorithmLowAspectRatio(false, parent, children);\n            },\n            squarified: function(parent, children) {\n                return this.algorithmLowAspectRatio(true, parent, children);\n            },\n            sliceAndDice: function(parent, children) {\n                return this.algorithmFill(true, parent, children);\n            },\n            stripes: function(parent, children) {\n                return this.algorithmFill(false, parent, children);\n            },\n            translate: function() {\n                var series = this,\n                    rootId = series.rootNode = pick(series.rootNode, series.options.rootId, ''),\n                    rootNode,\n                    pointValues,\n                    seriesArea,\n                    tree,\n                    val;\n\n                // Call prototype function\n                Series.prototype.translate.call(series);\n                // Create a object map from level to options\n                series.levelMap = reduce(series.options.levels, function(arr, item) {\n                    arr[item.level] = item;\n                    return arr;\n                }, {});\n                tree = series.tree = series.getTree(); // @todo Only if series.isDirtyData is true\n                rootNode = series.nodeMap[rootId];\n                if (\n                    rootId !== '' &&\n                    (!rootNode || !rootNode.children.length)\n                ) {\n                    series.drillToNode('', false);\n                    rootId = series.rootNode;\n                    rootNode = series.nodeMap[rootId];\n                }\n                series.setTreeValues(tree);\n\n                // Calculate plotting values.\n                series.axisRatio = (series.xAxis.len / series.yAxis.len);\n                series.nodeMap[''].pointValues = pointValues = {\n                    x: 0,\n                    y: 0,\n                    width: 100,\n                    height: 100\n                };\n                series.nodeMap[''].values = seriesArea = merge(pointValues, {\n                    width: (pointValues.width * series.axisRatio),\n                    direction: (series.options.layoutStartingDirection === 'vertical' ? 0 : 1),\n                    val: tree.val\n                });\n                series.calculateChildrenAreas(tree, seriesArea);\n\n                // Logic for point colors\n                if (series.colorAxis) {\n                    series.translateColors();\n                } else if (!series.options.colorByPoint) {\n                    series.setColorRecursive(series.tree);\n                }\n\n                // Update axis extremes according to the root node.\n                if (series.options.allowDrillToNode) {\n                    val = rootNode.pointValues;\n                    series.xAxis.setExtremes(val.x, val.x + val.width, false);\n                    series.yAxis.setExtremes(val.y, val.y + val.height, false);\n                    series.xAxis.setScale();\n                    series.yAxis.setScale();\n                }\n\n                // Assign values to points.\n                series.setPointValues();\n            },\n            /**\n             * Extend drawDataLabels with logic to handle custom options related to the treemap series:\n             * - Points which is not a leaf node, has dataLabels disabled by default.\n             * - Options set on series.levels is merged in.\n             * - Width of the dataLabel is set to match the width of the point shape.\n             */\n            drawDataLabels: function() {\n                var series = this,\n                    points = grep(series.points, function(n) {\n                        return n.node.visible;\n                    }),\n                    options,\n                    level;\n                each(points, function(point) {\n                    level = series.levelMap[point.node.levelDynamic];\n                    // Set options to new object to avoid problems with scope\n                    options = {\n                        style: {}\n                    };\n\n                    // If not a leaf, then label should be disabled as default\n                    if (!point.node.isLeaf) {\n                        options.enabled = false;\n                    }\n\n                    // If options for level exists, include them as well\n                    if (level && level.dataLabels) {\n                        options = merge(options, level.dataLabels);\n                        series._hasPointLabels = true;\n                    }\n\n                    // Set dataLabel width to the width of the point shape.\n                    if (point.shapeArgs) {\n                        options.style.width = point.shapeArgs.width;\n                        if (point.dataLabel) {\n                            point.dataLabel.css({\n                                width: point.shapeArgs.width + 'px'\n                            });\n                        }\n                    }\n\n                    // Merge custom options with point options\n                    point.dlOptions = merge(options, point.options.dataLabels);\n                });\n                Series.prototype.drawDataLabels.call(this);\n            },\n\n            /**\n             * Over the alignment method by setting z index\n             */\n            alignDataLabel: function(point) {\n                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);\n                if (point.dataLabel) {\n                    point.dataLabel.attr({\n                        zIndex: point.node.zIndex + 1\n                    });\n                }\n            },\n\n\n            /**\n             * Get presentational attributes\n             */\n            pointAttribs: function(point, state) {\n                var level = this.levelMap[point.node.levelDynamic] || {},\n                    options = this.options,\n                    attr,\n                    stateOptions = (state && options.states[state]) || {},\n                    className = point.getClassName(),\n                    opacity;\n\n                // Set attributes by precedence. Point trumps level trumps series. Stroke width uses pick\n                // because it can be 0.\n                attr = {\n                    'stroke': point.borderColor || level.borderColor || stateOptions.borderColor || options.borderColor,\n                    'stroke-width': pick(point.borderWidth, level.borderWidth, stateOptions.borderWidth, options.borderWidth),\n                    'dashstyle': point.borderDashStyle || level.borderDashStyle || stateOptions.borderDashStyle || options.borderDashStyle,\n                    'fill': point.color || this.color\n                };\n\n                // Hide levels above the current view\n                if (className.indexOf('highcharts-above-level') !== -1) {\n                    attr.fill = 'none';\n                    attr['stroke-width'] = 0;\n\n                    // Nodes with children that accept interaction\n                } else if (className.indexOf('highcharts-internal-node-interactive') !== -1) {\n                    opacity = pick(stateOptions.opacity, options.opacity);\n                    attr.fill = color(attr.fill).setOpacity(opacity).get();\n                    attr.cursor = 'pointer';\n                    // Hide nodes that have children\n                } else if (className.indexOf('highcharts-internal-node') !== -1) {\n                    attr.fill = 'none';\n\n                } else if (state) {\n                    // Brighten and hoist the hover nodes\n                    attr.fill = color(attr.fill).brighten(stateOptions.brightness).get();\n                }\n                return attr;\n            },\n\n\n            /**\n             * Extending ColumnSeries drawPoints\n             */\n            drawPoints: function() {\n                var series = this,\n                    points = grep(series.points, function(n) {\n                        return n.node.visible;\n                    });\n\n                each(points, function(point) {\n                    var groupKey = 'levelGroup-' + point.node.levelDynamic;\n                    if (!series[groupKey]) {\n                        series[groupKey] = series.chart.renderer.g(groupKey)\n                            .attr({\n                                zIndex: 1000 - point.node.levelDynamic // @todo Set the zIndex based upon the number of levels, instead of using 1000\n                            })\n                            .add(series.group);\n                    }\n                    point.group = series[groupKey];\n\n                });\n                // Call standard drawPoints\n                seriesTypes.column.prototype.drawPoints.call(this);\n\n                // If drillToNode is allowed, set a point cursor on clickables & add drillId to point \n                if (series.options.allowDrillToNode) {\n                    each(points, function(point) {\n                        if (point.graphic) {\n                            point.drillId = series.options.interactByLeaf ? series.drillToByLeaf(point) : series.drillToByGroup(point);\n                        }\n                    });\n                }\n            },\n            /**\n             * Add drilling on the suitable points\n             */\n            onClickDrillToNode: function(event) {\n                var series = this,\n                    point = event.point,\n                    drillId = point && point.drillId;\n                // If a drill id is returned, add click event and cursor. \n                if (isString(drillId)) {\n                    point.setState(''); // Remove hover\n                    series.drillToNode(drillId);\n                }\n            },\n            /**\n             * Finds the drill id for a parent node.\n             * Returns false if point should not have a click event\n             * @param {Object} point\n             * @return {string || boolean} Drill to id or false when point should not have a click event\n             */\n            drillToByGroup: function(point) {\n                var series = this,\n                    drillId = false;\n                if ((point.node.level - series.nodeMap[series.rootNode].level) === 1 && !point.node.isLeaf) {\n                    drillId = point.id;\n                }\n                return drillId;\n            },\n            /**\n             * Finds the drill id for a leaf node.\n             * Returns false if point should not have a click event\n             * @param {Object} point\n             * @return {string || boolean} Drill to id or false when point should not have a click event\n             */\n            drillToByLeaf: function(point) {\n                var series = this,\n                    drillId = false,\n                    nodeParent;\n                if ((point.node.parent !== series.rootNode) && (point.node.isLeaf)) {\n                    nodeParent = point.node;\n                    while (!drillId) {\n                        nodeParent = series.nodeMap[nodeParent.parent];\n                        if (nodeParent.parent === series.rootNode) {\n                            drillId = nodeParent.id;\n                        }\n                    }\n                }\n                return drillId;\n            },\n            drillUp: function() {\n                var series = this,\n                    node = series.nodeMap[series.rootNode];\n                if (node && isString(node.parent)) {\n                    series.drillToNode(node.parent);\n                }\n            },\n            drillToNode: function(id, redraw) {\n                var series = this,\n                    nodeMap = series.nodeMap,\n                    node = nodeMap[id];\n                series.rootNode = id;\n                if (id === '') {\n                    series.drillUpButton = series.drillUpButton.destroy();\n                } else {\n                    series.showDrillUpButton((node && node.name || id));\n                }\n                this.isDirty = true; // Force redraw\n                if (pick(redraw, true)) {\n                    this.chart.redraw();\n                }\n            },\n            showDrillUpButton: function(name) {\n                var series = this,\n                    backText = (name || '< Back'),\n                    buttonOptions = series.options.drillUpButton,\n                    attr,\n                    states;\n\n                if (buttonOptions.text) {\n                    backText = buttonOptions.text;\n                }\n                if (!this.drillUpButton) {\n                    attr = buttonOptions.theme;\n                    states = attr && attr.states;\n\n                    this.drillUpButton = this.chart.renderer.button(\n                            backText,\n                            null,\n                            null,\n                            function() {\n                                series.drillUp();\n                            },\n                            attr,\n                            states && states.hover,\n                            states && states.select\n                        )\n                        .attr({\n                            align: buttonOptions.position.align,\n                            zIndex: 7\n                        })\n                        .add()\n                        .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n                } else {\n                    this.drillUpButton.attr({\n                            text: backText\n                        })\n                        .align();\n                }\n            },\n            buildKDTree: noop,\n            drawLegendSymbol: H.LegendSymbolMixin.drawRectangle,\n            getExtremes: function() {\n                // Get the extremes from the value data\n                Series.prototype.getExtremes.call(this, this.colorValueData);\n                this.valueMin = this.dataMin;\n                this.valueMax = this.dataMax;\n\n                // Get the extremes from the y data\n                Series.prototype.getExtremes.call(this);\n            },\n            getExtremesFromAll: true,\n            bindAxes: function() {\n                var treeAxis = {\n                    endOnTick: false,\n                    gridLineWidth: 0,\n                    lineWidth: 0,\n                    min: 0,\n                    dataMin: 0,\n                    minPadding: 0,\n                    max: 100,\n                    dataMax: 100,\n                    maxPadding: 0,\n                    startOnTick: false,\n                    title: null,\n                    tickPositions: []\n                };\n                Series.prototype.bindAxes.call(this);\n                H.extend(this.yAxis.options, treeAxis);\n                H.extend(this.xAxis.options, treeAxis);\n            }\n\n            // Point class\n        }, {\n            getClassName: function() {\n                var className = H.Point.prototype.getClassName.call(this),\n                    series = this.series,\n                    options = series.options;\n\n                // Above the current level\n                if (this.node.level <= series.nodeMap[series.rootNode].level) {\n                    className += ' highcharts-above-level';\n\n                } else if (!this.node.isLeaf && !pick(options.interactByLeaf, !options.allowDrillToNode)) {\n                    className += ' highcharts-internal-node-interactive';\n\n                } else if (!this.node.isLeaf) {\n                    className += ' highcharts-internal-node';\n                }\n                return className;\n            },\n            isValid: function() {\n                return isNumber(this.value);\n            },\n            setState: function(state) {\n                H.Point.prototype.setState.call(this, state);\n\n                // Graphic does not exist when point is not visible.\n                if (this.graphic) {\n                    this.graphic.attr({\n                        zIndex: state === 'hover' ? 1 : 0\n                    });\n                }\n            },\n            setVisible: seriesTypes.pie.prototype.pointClass.prototype.setVisible\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/modules/xrange-series.js",
    "content": "/*\n Highcharts JS v5.0.12 (2017-05-24)\n X-range series\n\n (c) 2010-2017 Torstein Honsi, Lars A. V. Cabrera\n\n --- WORK IN PROGRESS ---\n\n License: www.highcharts.com/license\n*/\n(function(h){\"object\"===typeof module&&module.exports?module.exports=h:h(Highcharts)})(function(h){(function(e){var h=e.getOptions().plotOptions,x=e.Color,l=e.seriesTypes.column,g=e.each,m=e.extendClass,u=e.isNumber,t=e.isObject,r=e.merge,n=e.pick,v=e.seriesTypes,y=e.wrap,z=e.Axis,w=e.Point,A=e.Series;h.xrange=r(h.column,{tooltip:{pointFormat:'\\x3cspan style\\x3d\"color:{point.color}\"\\x3e\\u25cf\\x3c/span\\x3e {series.name}: \\x3cb\\x3e{point.yCategory}\\x3c/b\\x3e\\x3cbr/\\x3e'}});v.xrange=m(l,{pointClass:m(w,\n{getLabelConfig:function(){var d=w.prototype.getLabelConfig.call(this);d.x2=this.x2;d.yCategory=this.yCategory=this.series.yAxis.categories&&this.series.yAxis.categories[this.y];return d}}),type:\"xrange\",forceDL:!0,parallelArrays:[\"x\",\"x2\",\"y\"],requireSorting:!1,animate:v.line.prototype.animate,getColumnMetrics:function(){function d(){g(k.series,function(c){var d=c.xAxis;c.xAxis=c.yAxis;c.yAxis=d})}var b,k=this.chart;d();this.yAxis.closestPointRange=1;b=l.prototype.getColumnMetrics.call(this);d();\nreturn b},cropData:function(d,b,k,c){b=A.prototype.cropData.call(this,this.x2Data,b,k,c);b.xData=d.slice(b.start,b.end);return b},translate:function(){l.prototype.translate.apply(this,arguments);var d=this.xAxis,b=this.columnMetrics,k=this.options.minPointLength||0;g(this.points,function(c){var f=c.plotX,a=n(c.x2,c.x+(c.len||0)),a=d.toPixels(a,!0),e=a-f,p;k&&(p=k-e,0>p&&(p=0),f-=p/2,a+=p/2);f=Math.max(f,-10);a=Math.min(Math.max(a,-10),d.len+10);a<f&&(a=f);c.shapeArgs={x:f,y:c.plotY+b.offset,width:a-\nf,height:b.width};c.tooltipPos[0]+=e/2;c.tooltipPos[1]-=b.width/2;if(a=c.partialFill)t(a)&&(a=a.amount),u(a)||(a=0),f=c.shapeArgs,c.partShapeArgs={x:f.x,y:f.y+1,width:f.width*a,height:f.height-2}})},drawPoints:function(){var d=this,b=this.chart,e=d.options,c=b.renderer,f=b.pointCount<(e.animationLimit||250)?\"animate\":\"attr\";g(d.points,function(a){var b=a.graphic,k=a.shapeType,h=a.shapeArgs,g=a.partShapeArgs,l=d.options,q=a.partialFill,m=a.selected&&\"select\",n=e.stacking&&!e.borderRadius;if(u(a.plotY)&&\nnull!==a.y){if(b){if(a.graphicOriginal[f](r(h)),g)a.graphicOverlay[f](r(g))}else a.graphic=b=c.g(\"point\").attr({\"class\":a.getClassName()}).add(a.group||d.group),a.graphicOriginal=c[k](h).addClass(\"highcharts-partfill-original\").add(b),g&&(a.graphicOverlay=c[k](g).addClass(\"highcharts-partfill-overlay\").add(b));a.graphicOriginal.attr(d.pointAttribs(a,m)).shadow(e.shadow,null,n);g&&(t(q)||(q={}),t(l.partialFill)&&(q=r(q,l.partialFill)),b=q.fill||x(d.color).brighten(-.3).get(\"rgb\"),a.graphicOverlay.attr(d.pointAttribs(a,\nm)).attr(\"fill\",b).attr(\"stroke-width\",0).shadow(e.shadow,null,n))}else b&&(a.graphic=b.destroy())})}});y(z.prototype,\"getSeriesExtremes\",function(e){var b=this.series,d,c;e.call(this);this.isXAxis&&\"xrange\"===b.type&&(d=n(this.dataMax,Number.MIN_VALUE),g(this.series,function(b){g(b.x2Data||[],function(a){a>d&&(d=a,c=!0)})}),c&&(this.dataMax=d))})})(h)});\n"
  },
  {
    "path": "assets/highcharts/modules/xrange-series.src.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n * X-range series\n *\n * (c) 2010-2017 Torstein Honsi, Lars A. V. Cabrera\n *\n * --- WORK IN PROGRESS ---\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(H) {\n        /**\n         * (c) 2014-2017 Highsoft AS\n         * Authors: Torstein Honsi, Lars A. V. Cabrera\n         *\n         * License: www.highcharts.com/license\n         */\n\n        var defaultPlotOptions = H.getOptions().plotOptions,\n            color = H.Color,\n            columnType = H.seriesTypes.column,\n            each = H.each,\n            extendClass = H.extendClass,\n            isNumber = H.isNumber,\n            isObject = H.isObject,\n            merge = H.merge,\n            pick = H.pick,\n            seriesTypes = H.seriesTypes,\n            wrap = H.wrap,\n            Axis = H.Axis,\n            Point = H.Point,\n            Series = H.Series,\n            pointFormat = '<span style=\"color:{point.color}\">' +\n            '\\u25CF' +\n            '</span> {series.name}: <b>{point.yCategory}</b><br/>',\n            xrange = 'xrange';\n\n        defaultPlotOptions.xrange = merge(defaultPlotOptions.column, {\n            tooltip: {\n                pointFormat: pointFormat\n            }\n        });\n        seriesTypes.xrange = extendClass(columnType, {\n            pointClass: extendClass(Point, {\n                // Add x2 and yCategory to the available properties for tooltip formats\n                getLabelConfig: function() {\n                    var cfg = Point.prototype.getLabelConfig.call(this);\n\n                    cfg.x2 = this.x2;\n                    cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y];\n                    return cfg;\n                }\n            }),\n            type: xrange,\n            forceDL: true,\n            parallelArrays: ['x', 'x2', 'y'],\n            requireSorting: false,\n            animate: seriesTypes.line.prototype.animate,\n\n            /**\n             * Borrow the column series metrics, but with swapped axes. This gives free access\n             * to features like groupPadding, grouping, pointWidth etc.\n             */\n            getColumnMetrics: function() {\n                var metrics,\n                    chart = this.chart;\n\n                function swapAxes() {\n                    each(chart.series, function(s) {\n                        var xAxis = s.xAxis;\n                        s.xAxis = s.yAxis;\n                        s.yAxis = xAxis;\n                    });\n                }\n\n                swapAxes();\n\n                this.yAxis.closestPointRange = 1;\n                metrics = columnType.prototype.getColumnMetrics.call(this);\n\n                swapAxes();\n\n                return metrics;\n            },\n\n            /**\n             * Override cropData to show a point where x is outside visible range\n             * but x2 is outside.\n             */\n            cropData: function(xData, yData, min, max) {\n\n                // Replace xData with x2Data to find the appropriate cropStart\n                var cropData = Series.prototype.cropData,\n                    crop = cropData.call(this, this.x2Data, yData, min, max);\n\n                // Re-insert the cropped xData\n                crop.xData = xData.slice(crop.start, crop.end);\n\n                return crop;\n            },\n\n            translate: function() {\n                columnType.prototype.translate.apply(this, arguments);\n                var series = this,\n                    xAxis = series.xAxis,\n                    metrics = series.columnMetrics,\n                    minPointLength = series.options.minPointLength || 0;\n\n                each(series.points, function(point) {\n                    var plotX = point.plotX,\n                        posX = pick(point.x2, point.x + (point.len || 0)),\n                        plotX2 = xAxis.toPixels(posX, true),\n                        width = plotX2 - plotX,\n                        widthDifference,\n                        shapeArgs,\n                        partialFill;\n\n                    if (minPointLength) {\n                        widthDifference = minPointLength - width;\n                        if (widthDifference < 0) {\n                            widthDifference = 0;\n                        }\n                        plotX -= widthDifference / 2;\n                        plotX2 += widthDifference / 2;\n                    }\n\n                    plotX = Math.max(plotX, -10);\n                    plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10);\n\n                    if (plotX2 < plotX) { // #6107\n                        plotX2 = plotX;\n                    }\n\n                    point.shapeArgs = {\n                        x: plotX,\n                        y: point.plotY + metrics.offset,\n                        width: plotX2 - plotX,\n                        height: metrics.width\n                    };\n                    point.tooltipPos[0] += width / 2;\n                    point.tooltipPos[1] -= metrics.width / 2;\n\n                    // Add a partShapeArgs to the point, based on the shapeArgs property\n                    partialFill = point.partialFill;\n                    if (partialFill) {\n                        // Get the partial fill amount\n                        if (isObject(partialFill)) {\n                            partialFill = partialFill.amount;\n                        }\n                        // If it was not a number, assume 0\n                        if (!isNumber(partialFill)) {\n                            partialFill = 0;\n                        }\n                        shapeArgs = point.shapeArgs;\n                        point.partShapeArgs = {\n                            x: shapeArgs.x,\n                            y: shapeArgs.y + 1,\n                            width: shapeArgs.width * partialFill,\n                            height: shapeArgs.height - 2\n                        };\n                    }\n                });\n            },\n\n            drawPoints: function() {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    verb = chart.pointCount < animationLimit ? 'animate' : 'attr';\n\n                // draw the columns\n                each(series.points, function(point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic,\n                        type = point.shapeType,\n                        shapeArgs = point.shapeArgs,\n                        partShapeArgs = point.partShapeArgs,\n                        seriesOpts = series.options,\n                        pfOptions = point.partialFill,\n                        fill,\n                        state = point.selected && 'select',\n                        cutOff = options.stacking && !options.borderRadius;\n\n                    if (isNumber(plotY) && point.y !== null) {\n                        if (graphic) { // update\n                            point.graphicOriginal[verb](\n                                merge(shapeArgs)\n                            );\n                            if (partShapeArgs) {\n                                point.graphicOverlay[verb](\n                                    merge(partShapeArgs)\n                                );\n                            }\n\n                        } else {\n                            point.graphic = graphic = renderer.g('point')\n                                .attr({\n                                    'class': point.getClassName()\n                                })\n                                .add(point.group || series.group);\n\n                            point.graphicOriginal = renderer[type](shapeArgs)\n                                .addClass('highcharts-partfill-original')\n                                .add(graphic);\n                            if (partShapeArgs) {\n                                point.graphicOverlay = renderer[type](partShapeArgs)\n                                    .addClass('highcharts-partfill-overlay')\n                                    .add(graphic);\n                            }\n                        }\n\n\n                        // Presentational\n                        point.graphicOriginal\n                            .attr(series.pointAttribs(point, state))\n                            .shadow(options.shadow, null, cutOff);\n                        if (partShapeArgs) {\n                            // Ensure pfOptions is an object\n                            if (!isObject(pfOptions)) {\n                                pfOptions = {};\n                            }\n                            if (isObject(seriesOpts.partialFill)) {\n                                pfOptions = merge(pfOptions, seriesOpts.partialFill);\n                            }\n\n                            fill = pfOptions.fill ||\n                                color(series.color).brighten(-0.3).get('rgb');\n                            point.graphicOverlay\n                                .attr(series.pointAttribs(point, state))\n                                .attr('fill', fill)\n                                .attr('stroke-width', 0)\n                                .shadow(options.shadow, null, cutOff);\n                        }\n\n\n                    } else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            }\n        });\n\n        /**\n         * Max x2 should be considered in xAxis extremes\n         */\n        wrap(Axis.prototype, 'getSeriesExtremes', function(proceed) {\n            var axis = this,\n                series = axis.series,\n                dataMax,\n                modMax;\n\n            proceed.call(this);\n            if (axis.isXAxis && series.type === xrange) {\n                dataMax = pick(axis.dataMax, Number.MIN_VALUE);\n                each(this.series, function(series) {\n                    each(series.x2Data || [], function(val) {\n                        if (val > dataMax) {\n                            dataMax = val;\n                            modMax = true;\n                        }\n                    });\n                });\n                if (modMax) {\n                    axis.dataMax = dataMax;\n                }\n            }\n        });\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/readme.txt",
    "content": "This directory contains generated source code.\n\nWHAT FILES TO USE\n- The files for classic mode are available in the /code folder. In this mode, \n  styles are set as options in the chart configuration.\n- The JavaScript files for styled mode are available under the /code/js/ folder.\n  In these files, most presentational code is removed, so without styling it\n  will draw an ugly black-and-white chart if anything.\n- The default CSS file for styled mode is available as /code/css/highcharts.css.\n  This CSS is in turn based on a SCSS file, highcharts.scss that can be found\n  in the Highcharts GitHub repo."
  },
  {
    "path": "assets/highcharts/themes/dark-blue.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         *\n         * Dark blue theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n        Highcharts.theme = {\n            colors: ['#DDDF0D', '#55BF3B', '#DF5353', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 1,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgb(48, 48, 96)'],\n                        [1, 'rgb(0, 0, 0)']\n                    ]\n                },\n                borderColor: '#000000',\n                borderWidth: 2,\n                className: 'dark-container',\n                plotBackgroundColor: 'rgba(255, 255, 255, .1)',\n                plotBorderColor: '#CCCCCC',\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#C0C0C0',\n                    font: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#666666',\n                    font: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineColor: '#333333',\n                gridLineWidth: 1,\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                tickColor: '#A0A0A0',\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n                    }\n                }\n            },\n            yAxis: {\n                gridLineColor: '#333333',\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                minorTickInterval: null,\n                tickColor: '#A0A0A0',\n                tickWidth: 1,\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n                    }\n                }\n            },\n            tooltip: {\n                backgroundColor: 'rgba(0, 0, 0, 0.75)',\n                style: {\n                    color: '#F0F0F0'\n                }\n            },\n            toolbar: {\n                itemStyle: {\n                    color: 'silver'\n                }\n            },\n            plotOptions: {\n                line: {\n                    dataLabels: {\n                        color: '#CCC'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                spline: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                scatter: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                candlestick: {\n                    lineColor: 'white'\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: '#A0A0A0'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#444'\n                }\n            },\n            credits: {\n                style: {\n                    color: '#666'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#CCC'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    hoverSymbolStroke: '#FFFFFF',\n                    theme: {\n                        fill: {\n                            linearGradient: {\n                                x1: 0,\n                                y1: 0,\n                                x2: 0,\n                                y2: 1\n                            },\n                            stops: [\n                                [0.4, '#606060'],\n                                [0.6, '#333333']\n                            ]\n                        },\n                        stroke: '#000000'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: {\n                        linearGradient: {\n                            x1: 0,\n                            y1: 0,\n                            x2: 0,\n                            y2: 1\n                        },\n                        stops: [\n                            [0.4, '#888'],\n                            [0.6, '#555']\n                        ]\n                    },\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold'\n                    },\n                    states: {\n                        hover: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.4, '#BBB'],\n                                    [0.6, '#888']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.1, '#000'],\n                                    [0.3, '#333']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'yellow'\n                            }\n                        }\n                    }\n                },\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(16, 16, 16, 0.5)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                barBorderColor: '#CCC',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                buttonBorderColor: '#CCC',\n                rifleColor: '#FFF',\n                trackBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#000'],\n                        [1, '#333']\n                    ]\n                },\n                trackBorderColor: '#666'\n            },\n\n            // special colors for some of the\n            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n            background2: 'rgb(35, 35, 70)',\n            dataLabelsColor: '#444',\n            textColor: '#C0C0C0',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/dark-green.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Dark blue theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#DDDF0D', '#55BF3B', '#DF5353', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: [0, 0, 250, 500],\n                    stops: [\n                        [0, 'rgb(48, 96, 48)'],\n                        [1, 'rgb(0, 0, 0)']\n                    ]\n                },\n                borderColor: '#000000',\n                borderWidth: 2,\n                className: 'dark-container',\n                plotBackgroundColor: 'rgba(255, 255, 255, .1)',\n                plotBorderColor: '#CCCCCC',\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#C0C0C0',\n                    font: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#666666',\n                    font: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineColor: '#333333',\n                gridLineWidth: 1,\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                tickColor: '#A0A0A0',\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n                    }\n                }\n            },\n            yAxis: {\n                gridLineColor: '#333333',\n                labels: {\n                    style: {\n                        color: '#A0A0A0'\n                    }\n                },\n                lineColor: '#A0A0A0',\n                minorTickInterval: null,\n                tickColor: '#A0A0A0',\n                tickWidth: 1,\n                title: {\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n                    }\n                }\n            },\n            tooltip: {\n                backgroundColor: 'rgba(0, 0, 0, 0.75)',\n                style: {\n                    color: '#F0F0F0'\n                }\n            },\n            toolbar: {\n                itemStyle: {\n                    color: 'silver'\n                }\n            },\n            plotOptions: {\n                line: {\n                    dataLabels: {\n                        color: '#CCC'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                spline: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                scatter: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                candlestick: {\n                    lineColor: 'white'\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: '#A0A0A0'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#444'\n                }\n            },\n            credits: {\n                style: {\n                    color: '#666'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#CCC'\n                }\n            },\n\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    hoverSymbolStroke: '#FFFFFF',\n                    theme: {\n                        fill: {\n                            linearGradient: {\n                                x1: 0,\n                                y1: 0,\n                                x2: 0,\n                                y2: 1\n                            },\n                            stops: [\n                                [0.4, '#606060'],\n                                [0.6, '#333333']\n                            ]\n                        },\n                        stroke: '#000000'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: {\n                        linearGradient: {\n                            x1: 0,\n                            y1: 0,\n                            x2: 0,\n                            y2: 1\n                        },\n                        stops: [\n                            [0.4, '#888'],\n                            [0.6, '#555']\n                        ]\n                    },\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold'\n                    },\n                    states: {\n                        hover: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.4, '#BBB'],\n                                    [0.6, '#888']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.1, '#000'],\n                                    [0.3, '#333']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'yellow'\n                            }\n                        }\n                    }\n                },\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(16, 16, 16, 0.5)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                barBorderColor: '#CCC',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                buttonBorderColor: '#CCC',\n                rifleColor: '#FFF',\n                trackBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#000'],\n                        [1, '#333']\n                    ]\n                },\n                trackBorderColor: '#666'\n            },\n\n            // special colors for some of the\n            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n            background2: 'rgb(35, 35, 70)',\n            dataLabelsColor: '#444',\n            textColor: '#C0C0C0',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/dark-unica.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Dark theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        /* global document */\n        // Load the fonts\n        Highcharts.createElement('link', {\n            href: 'https://fonts.googleapis.com/css?family=Unica+One',\n            rel: 'stylesheet',\n            type: 'text/css'\n        }, null, document.getElementsByTagName('head')[0]);\n\n        Highcharts.theme = {\n            colors: ['#2b908f', '#90ee7e', '#f45b5b', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 1,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#2a2a2b'],\n                        [1, '#3e3e40']\n                    ]\n                },\n                style: {\n                    fontFamily: '\\'Unica One\\', sans-serif'\n                },\n                plotBorderColor: '#606063'\n            },\n            title: {\n                style: {\n                    color: '#E0E0E3',\n                    textTransform: 'uppercase',\n                    fontSize: '20px'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#E0E0E3',\n                    textTransform: 'uppercase'\n                }\n            },\n            xAxis: {\n                gridLineColor: '#707073',\n                labels: {\n                    style: {\n                        color: '#E0E0E3'\n                    }\n                },\n                lineColor: '#707073',\n                minorGridLineColor: '#505053',\n                tickColor: '#707073',\n                title: {\n                    style: {\n                        color: '#A0A0A3'\n\n                    }\n                }\n            },\n            yAxis: {\n                gridLineColor: '#707073',\n                labels: {\n                    style: {\n                        color: '#E0E0E3'\n                    }\n                },\n                lineColor: '#707073',\n                minorGridLineColor: '#505053',\n                tickColor: '#707073',\n                tickWidth: 1,\n                title: {\n                    style: {\n                        color: '#A0A0A3'\n                    }\n                }\n            },\n            tooltip: {\n                backgroundColor: 'rgba(0, 0, 0, 0.85)',\n                style: {\n                    color: '#F0F0F0'\n                }\n            },\n            plotOptions: {\n                series: {\n                    dataLabels: {\n                        color: '#B0B0B3'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                boxplot: {\n                    fillColor: '#505053'\n                },\n                candlestick: {\n                    lineColor: 'white'\n                },\n                errorbar: {\n                    color: 'white'\n                }\n            },\n            legend: {\n                itemStyle: {\n                    color: '#E0E0E3'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#606063'\n                }\n            },\n            credits: {\n                style: {\n                    color: '#666'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#707073'\n                }\n            },\n\n            drilldown: {\n                activeAxisLabelStyle: {\n                    color: '#F0F0F3'\n                },\n                activeDataLabelStyle: {\n                    color: '#F0F0F3'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    theme: {\n                        fill: '#505053'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: '#505053',\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC'\n                    },\n                    states: {\n                        hover: {\n                            fill: '#707073',\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: '#000003',\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        }\n                    }\n                },\n                inputBoxBorderColor: '#505053',\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(255,255,255,0.1)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                },\n                xAxis: {\n                    gridLineColor: '#505053'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: '#808083',\n                barBorderColor: '#808083',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: '#606063',\n                buttonBorderColor: '#606063',\n                rifleColor: '#FFF',\n                trackBackgroundColor: '#404043',\n                trackBorderColor: '#404043'\n            },\n\n            // special colors for some of the\n            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n            background2: '#505053',\n            dataLabelsColor: '#B0B0B3',\n            textColor: '#C0C0C0',\n            contrastTextColor: '#F0F0F3',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/gray.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Gray theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#DDDF0D', '#7798BF', '#55BF3B', '#DF5353', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgb(96, 96, 96)'],\n                        [1, 'rgb(16, 16, 16)']\n                    ]\n                },\n                borderWidth: 0,\n                borderRadius: 0,\n                plotBackgroundColor: null,\n                plotShadow: false,\n                plotBorderWidth: 0\n            },\n            title: {\n                style: {\n                    color: '#FFF',\n                    font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#DDD',\n                    font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 0,\n                lineColor: '#999',\n                tickColor: '#999',\n                labels: {\n                    style: {\n                        color: '#999',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#AAA',\n                        font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            yAxis: {\n                alternateGridColor: null,\n                minorTickInterval: null,\n                gridLineColor: 'rgba(255, 255, 255, .1)',\n                minorGridLineColor: 'rgba(255,255,255,0.07)',\n                lineWidth: 0,\n                tickWidth: 0,\n                labels: {\n                    style: {\n                        color: '#999',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#AAA',\n                        font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            legend: {\n                itemStyle: {\n                    color: '#CCC'\n                },\n                itemHoverStyle: {\n                    color: '#FFF'\n                },\n                itemHiddenStyle: {\n                    color: '#333'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#CCC'\n                }\n            },\n            tooltip: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgba(96, 96, 96, .8)'],\n                        [1, 'rgba(16, 16, 16, .8)']\n                    ]\n                },\n                borderWidth: 0,\n                style: {\n                    color: '#FFF'\n                }\n            },\n\n\n            plotOptions: {\n                series: {\n                    nullColor: '#444444'\n                },\n                line: {\n                    dataLabels: {\n                        color: '#CCC'\n                    },\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                spline: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                scatter: {\n                    marker: {\n                        lineColor: '#333'\n                    }\n                },\n                candlestick: {\n                    lineColor: 'white'\n                }\n            },\n\n            toolbar: {\n                itemStyle: {\n                    color: '#CCC'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    symbolStroke: '#DDDDDD',\n                    hoverSymbolStroke: '#FFFFFF',\n                    theme: {\n                        fill: {\n                            linearGradient: {\n                                x1: 0,\n                                y1: 0,\n                                x2: 0,\n                                y2: 1\n                            },\n                            stops: [\n                                [0.4, '#606060'],\n                                [0.6, '#333333']\n                            ]\n                        },\n                        stroke: '#000000'\n                    }\n                }\n            },\n\n            // scroll charts\n            rangeSelector: {\n                buttonTheme: {\n                    fill: {\n                        linearGradient: {\n                            x1: 0,\n                            y1: 0,\n                            x2: 0,\n                            y2: 1\n                        },\n                        stops: [\n                            [0.4, '#888'],\n                            [0.6, '#555']\n                        ]\n                    },\n                    stroke: '#000000',\n                    style: {\n                        color: '#CCC',\n                        fontWeight: 'bold'\n                    },\n                    states: {\n                        hover: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.4, '#BBB'],\n                                    [0.6, '#888']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'white'\n                            }\n                        },\n                        select: {\n                            fill: {\n                                linearGradient: {\n                                    x1: 0,\n                                    y1: 0,\n                                    x2: 0,\n                                    y2: 1\n                                },\n                                stops: [\n                                    [0.1, '#000'],\n                                    [0.3, '#333']\n                                ]\n                            },\n                            stroke: '#000000',\n                            style: {\n                                color: 'yellow'\n                            }\n                        }\n                    }\n                },\n                inputStyle: {\n                    backgroundColor: '#333',\n                    color: 'silver'\n                },\n                labelStyle: {\n                    color: 'silver'\n                }\n            },\n\n            navigator: {\n                handles: {\n                    backgroundColor: '#666',\n                    borderColor: '#AAA'\n                },\n                outlineColor: '#CCC',\n                maskFill: 'rgba(16, 16, 16, 0.5)',\n                series: {\n                    color: '#7798BF',\n                    lineColor: '#A6C7ED'\n                }\n            },\n\n            scrollbar: {\n                barBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                barBorderColor: '#CCC',\n                buttonArrowColor: '#CCC',\n                buttonBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0.4, '#888'],\n                        [0.6, '#555']\n                    ]\n                },\n                buttonBorderColor: '#CCC',\n                rifleColor: '#FFF',\n                trackBackgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 0,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, '#000'],\n                        [1, '#333']\n                    ]\n                },\n                trackBorderColor: '#666'\n            },\n\n            // special colors for some of the demo examples\n            legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',\n            background2: 'rgb(70, 70, 70)',\n            dataLabelsColor: '#444',\n            textColor: '#E0E0E0',\n            maskColor: 'rgba(255,255,255,0.3)'\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/grid-light.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Grid-light theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        /* global document */\n        // Load the fonts\n        Highcharts.createElement('link', {\n            href: 'https://fonts.googleapis.com/css?family=Dosis:400,600',\n            rel: 'stylesheet',\n            type: 'text/css'\n        }, null, document.getElementsByTagName('head')[0]);\n\n        Highcharts.theme = {\n            colors: ['#7cb5ec', '#f7a35c', '#90ee7e', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: null,\n                style: {\n                    fontFamily: 'Dosis, sans-serif'\n                }\n            },\n            title: {\n                style: {\n                    fontSize: '16px',\n                    fontWeight: 'bold',\n                    textTransform: 'uppercase'\n                }\n            },\n            tooltip: {\n                borderWidth: 0,\n                backgroundColor: 'rgba(219,219,216,0.8)',\n                shadow: false\n            },\n            legend: {\n                itemStyle: {\n                    fontWeight: 'bold',\n                    fontSize: '13px'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 1,\n                labels: {\n                    style: {\n                        fontSize: '12px'\n                    }\n                }\n            },\n            yAxis: {\n                minorTickInterval: 'auto',\n                title: {\n                    style: {\n                        textTransform: 'uppercase'\n                    }\n                },\n                labels: {\n                    style: {\n                        fontSize: '12px'\n                    }\n                }\n            },\n            plotOptions: {\n                candlestick: {\n                    lineColor: '#404048'\n                }\n            },\n\n\n            // General\n            background2: '#F0F0EA'\n\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/grid.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Grid theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],\n            chart: {\n                backgroundColor: {\n                    linearGradient: {\n                        x1: 0,\n                        y1: 0,\n                        x2: 1,\n                        y2: 1\n                    },\n                    stops: [\n                        [0, 'rgb(255, 255, 255)'],\n                        [1, 'rgb(240, 240, 255)']\n                    ]\n                },\n                borderWidth: 2,\n                plotBackgroundColor: 'rgba(255, 255, 255, .9)',\n                plotShadow: true,\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#000',\n                    font: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#666666',\n                    font: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 1,\n                lineColor: '#000',\n                tickColor: '#000',\n                labels: {\n                    style: {\n                        color: '#000',\n                        font: '11px Trebuchet MS, Verdana, sans-serif'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#333',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n                    }\n                }\n            },\n            yAxis: {\n                minorTickInterval: 'auto',\n                lineColor: '#000',\n                lineWidth: 1,\n                tickWidth: 1,\n                tickColor: '#000',\n                labels: {\n                    style: {\n                        color: '#000',\n                        font: '11px Trebuchet MS, Verdana, sans-serif'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#333',\n                        fontWeight: 'bold',\n                        fontSize: '12px',\n                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'\n                    }\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: 'black'\n\n                },\n                itemHoverStyle: {\n                    color: '#039'\n                },\n                itemHiddenStyle: {\n                    color: 'gray'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#99b'\n                }\n            },\n\n            navigation: {\n                buttonOptions: {\n                    theme: {\n                        stroke: '#CCCCCC'\n                    }\n                }\n            }\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/sand-signika.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Sand-Signika theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        /* global document */\n        // Load the fonts\n        Highcharts.createElement('link', {\n            href: 'https://fonts.googleapis.com/css?family=Signika:400,700',\n            rel: 'stylesheet',\n            type: 'text/css'\n        }, null, document.getElementsByTagName('head')[0]);\n\n        // Add the background image to the container\n        Highcharts.wrap(Highcharts.Chart.prototype, 'getContainer', function(proceed) {\n            proceed.call(this);\n            this.container.style.background = 'url(http://www.highcharts.com/samples/graphics/sand.png)';\n        });\n\n\n        Highcharts.theme = {\n            colors: ['#f45b5b', '#8085e9', '#8d4654', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',\n                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'\n            ],\n            chart: {\n                backgroundColor: null,\n                style: {\n                    fontFamily: 'Signika, serif'\n                }\n            },\n            title: {\n                style: {\n                    color: 'black',\n                    fontSize: '16px',\n                    fontWeight: 'bold'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: 'black'\n                }\n            },\n            tooltip: {\n                borderWidth: 0\n            },\n            legend: {\n                itemStyle: {\n                    fontWeight: 'bold',\n                    fontSize: '13px'\n                }\n            },\n            xAxis: {\n                labels: {\n                    style: {\n                        color: '#6e6e70'\n                    }\n                }\n            },\n            yAxis: {\n                labels: {\n                    style: {\n                        color: '#6e6e70'\n                    }\n                }\n            },\n            plotOptions: {\n                series: {\n                    shadow: true\n                },\n                candlestick: {\n                    lineColor: '#404048'\n                },\n                map: {\n                    shadow: false\n                }\n            },\n\n            // Highstock specific\n            navigator: {\n                xAxis: {\n                    gridLineColor: '#D0D0D8'\n                }\n            },\n            rangeSelector: {\n                buttonTheme: {\n                    fill: 'white',\n                    stroke: '#C0C0C8',\n                    'stroke-width': 1,\n                    states: {\n                        select: {\n                            fill: '#D0D0D8'\n                        }\n                    }\n                }\n            },\n            scrollbar: {\n                trackBorderColor: '#C0C0C8'\n            },\n\n            // General\n            background2: '#E0E0E8'\n\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/highcharts/themes/skies.js",
    "content": "/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function(factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory;\n    } else {\n        factory(Highcharts);\n    }\n}(function(Highcharts) {\n    (function(Highcharts) {\n        /**\n         * (c) 2010-2017 Torstein Honsi\n         *\n         * License: www.highcharts.com/license\n         * \n         * Skies theme for Highcharts JS\n         * @author Torstein Honsi\n         */\n\n        Highcharts.theme = {\n            colors: ['#514F78', '#42A07B', '#9B5E4A', '#72727F', '#1F949A', '#82914E', '#86777F', '#42A07B'],\n            chart: {\n                className: 'skies',\n                borderWidth: 0,\n                plotShadow: true,\n                plotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',\n                plotBackgroundColor: {\n                    linearGradient: [0, 0, 250, 500],\n                    stops: [\n                        [0, 'rgba(255, 255, 255, 1)'],\n                        [1, 'rgba(255, 255, 255, 0)']\n                    ]\n                },\n                plotBorderWidth: 1\n            },\n            title: {\n                style: {\n                    color: '#3E576F',\n                    font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            subtitle: {\n                style: {\n                    color: '#6D869F',\n                    font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                }\n            },\n            xAxis: {\n                gridLineWidth: 0,\n                lineColor: '#C0D0E0',\n                tickColor: '#C0D0E0',\n                labels: {\n                    style: {\n                        color: '#666',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#666',\n                        font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            yAxis: {\n                alternateGridColor: 'rgba(255, 255, 255, .5)',\n                lineColor: '#C0D0E0',\n                tickColor: '#C0D0E0',\n                tickWidth: 1,\n                labels: {\n                    style: {\n                        color: '#666',\n                        fontWeight: 'bold'\n                    }\n                },\n                title: {\n                    style: {\n                        color: '#666',\n                        font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n                    }\n                }\n            },\n            legend: {\n                itemStyle: {\n                    font: '9pt Trebuchet MS, Verdana, sans-serif',\n                    color: '#3E576F'\n                },\n                itemHoverStyle: {\n                    color: 'black'\n                },\n                itemHiddenStyle: {\n                    color: 'silver'\n                }\n            },\n            labels: {\n                style: {\n                    color: '#3E576F'\n                }\n            }\n        };\n\n        // Apply the theme\n        Highcharts.setOptions(Highcharts.theme);\n\n    }(Highcharts));\n}));\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/AUTHORS.txt",
    "content": "Authors ordered by first contribution\nA list of current team members is available at http://jqueryui.com/about\n\nPaul Bakaus <paul.bakaus@gmail.com>\nRichard Worth <rdworth@gmail.com>\nYehuda Katz <wycats@gmail.com>\nSean Catchpole <sean@sunsean.com>\nJohn Resig <jeresig@gmail.com>\nTane Piper <piper.tane@gmail.com>\nDmitri Gaskin <dmitrig01@gmail.com>\nKlaus Hartl <klaus.hartl@gmail.com>\nStefan Petre <stefan.petre@gmail.com>\nGilles van den Hoven <gilles@webunity.nl>\nMicheil Bryan Smith <micheil@brandedcode.com>\nJörn Zaefferer <joern.zaefferer@gmail.com>\nMarc Grabanski <m@marcgrabanski.com>\nKeith Wood <kbwood@iinet.com.au>\nBrandon Aaron <brandon.aaron@gmail.com>\nScott González <scott.gonzalez@gmail.com>\nEduardo Lundgren <eduardolundgren@gmail.com>\nAaron Eisenberger <aaronchi@gmail.com>\nJoan Piedra <theneojp@gmail.com>\nBruno Basto <b.basto@gmail.com>\nRemy Sharp <remy@leftlogic.com>\nBohdan Ganicky <bohdan.ganicky@gmail.com>\nDavid Bolter <david.bolter@gmail.com>\nChi Cheng <cloudream@gmail.com>\nCa-Phun Ung <pazu2k@gmail.com>\nAriel Flesler <aflesler@gmail.com>\nMaggie Wachs <maggie@filamentgroup.com>\nScott Jehl <scottjehl@gmail.com>\nTodd Parker <todd@filamentgroup.com>\nAndrew Powell <andrew@shellscape.org>\nBrant Burnett <btburnett3@gmail.com>\nDouglas Neiner <doug@dougneiner.com>\nPaul Irish <paul.irish@gmail.com>\nRalph Whitbeck <ralph.whitbeck@gmail.com>\nThibault Duplessis <thibault.duplessis@gmail.com>\nDominique Vincent <dominique.vincent@toitl.com>\nJack Hsu <jack.hsu@gmail.com>\nAdam Sontag <ajpiano@ajpiano.com>\nCarl Fürstenberg <carl@excito.com>\nKevin Dalman <development@allpro.net>\nAlberto Fernández Capel <afcapel@gmail.com>\nJacek Jędrzejewski (http://jacek.jedrzejewski.name)\nTing Kuei <ting@kuei.com>\nSamuel Cormier-Iijima <sam@chide.it>\nJon Palmer <jonspalmer@gmail.com>\nBen Hollis <bhollis@amazon.com>\nJustin MacCarthy <Justin@Rubystars.biz>\nEyal Kobrigo <kobrigo@hotmail.com>\nTiago Freire <tiago.freire@gmail.com>\nDiego Tres <diegotres@gmail.com>\nHolger Rüprich <holger@rueprich.de>\nZiling Zhao <zilingzhao@gmail.com>\nMike Alsup <malsup@gmail.com>\nRobson Braga Araujo <robsonbraga@gmail.com>\nPierre-Henri Ausseil <ph.ausseil@gmail.com>\nChristopher McCulloh <cmcculloh@gmail.com>\nAndrew Newcomb <ext.github@preceptsoftware.co.uk>\nLim Chee Aun <cheeaun@gmail.com>\nJorge Barreiro <yortx.barry@gmail.com>\nDaniel Steigerwald <daniel@steigerwald.cz>\nJohn Firebaugh <john_firebaugh@bigfix.com>\nJohn Enters <github@darkdark.net>\nAndrey Kapitcyn <ru.m157y@gmail.com>\nDmitry Petrov <dpetroff@gmail.com>\nEric Hynds <eric@hynds.net>\nChairat Sunthornwiphat <pipo@sixhead.com>\nJosh Varner <josh.varner@gmail.com>\nStéphane Raimbault <stephane.raimbault@gmail.com>\nJay Merrifield <fracmak@gmail.com>\nJ. Ryan Stinnett <jryans@gmail.com>\nPeter Heiberg <peter@heiberg.se>\nAlex Dovenmuehle <adovenmuehle@gmail.com>\nJamie Gegerson <git@jamiegegerson.com>\nRaymond Schwartz <skeetergraphics@gmail.com>\nPhillip Barnes <philbar@gmail.com>\nKyle Wilkinson <kai@wikyd.org>\nKhaled AlHourani <me@khaledalhourani.com>\nMarian Rudzynski <mr@impaled.org>\nJean-Francois Remy <jeff@melix.org>\nDoug Blood <dougblood@gmail.com>\nFilippo Cavallarin <filippo.cavallarin@codseq.it>\nHeiko Henning <heiko@thehennings.ch>\nAliaksandr Rahalevich <saksmlz@gmail.com>\nMario Visic <mario@mariovisic.com>\nXavi Ramirez <xavi.rmz@gmail.com>\nMax Schnur <max.schnur@gmail.com>\nSaji Nediyanchath <saji89@gmail.com>\nCorey Frang <gnarf37@gmail.com>\nAaron Peterson <aaronp123@yahoo.com>\nIvan Peters <ivan@ivanpeters.com>\nMohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>\nMarcos Sousa <falecomigo@marcossousa.com>\nMichael DellaNoce <mdellanoce@mailtrust.com>\nGeorge Marshall <echosx@gmail.com>\nTobias Brunner <tobias@strongswan.org>\nMartin Solli <msolli@gmail.com>\nDavid Petersen <public@petersendidit.com>\nDan Heberden <danheberden@gmail.com>\nWilliam Kevin Manire <williamkmanire@gmail.com>\nGilmore Davidson <gilmoreorless@gmail.com>\nMichael Wu <michaelmwu@gmail.com>\nAdam Parod <mystic414@gmail.com>\nGuillaume Gautreau <guillaume+github@ghusse.com>\nMarcel Toele <EleotleCram@gmail.com>\nDan Streetman <ddstreet@ieee.org>\nMatt Hoskins <matt@nipltd.com>\nGiovanni Giacobbi <giovanni@giacobbi.net>\nKyle Florence <kyle.florence@gmail.com>\nPavol Hluchý <lopo@losys.sk>\nHans Hillen <hans.hillen@gmail.com>\nMark Johnson <virgofx@live.com>\nTrey Hunner <treyhunner@gmail.com>\nShane Whittet <whittet@gmail.com>\nEdward A Faulkner <ef@alum.mit.edu>\nAdam Baratz <adam@adambaratz.com>\nKato Kazuyoshi <kato.kazuyoshi@gmail.com>\nEike Send <eike.send@gmail.com>\nKris Borchers <kris.borchers@gmail.com>\nEddie Monge <eddie@eddiemonge.com>\nIsrael Tsadok <itsadok@gmail.com>\nCarson McDonald <carson@ioncannon.net>\nJason Davies <jason@jasondavies.com>\nGarrison Locke <gplocke@gmail.com>\nDavid Murdoch <david@davidmurdoch.com>\nBenjamin Scott Boyle <benjamins.boyle@gmail.com>\nJesse Baird <jebaird@gmail.com>\nJonathan Vingiano <jvingiano@gmail.com>\nDylan Just <dev@ephox.com>\nHiroshi Tomita <tomykaira@gmail.com>\nGlenn Goodrich <glenn.goodrich@gmail.com>\nTarafder Ashek-E-Elahi <mail.ashek@gmail.com>\nRyan Neufeld <ryan@neufeldmail.com>\nMarc Neuwirth <marc.neuwirth@gmail.com>\nPhilip Graham <philip.robert.graham@gmail.com>\nBenjamin Sterling <benjamin.sterling@kenzomedia.com>\nWesley Walser <waw325@gmail.com>\nKouhei Sutou <kou@clear-code.com>\nKarl Kirch <karlkrch@gmail.com>\nChris Kelly <ckdake@ckdake.com>\nJason Oster <jay@kodewerx.org>\nFelix Nagel <info@felixnagel.com>\nAlexander Polomoshnov <alex.polomoshnov@gmail.com>\nDavid Leal <dgleal@gmail.com>\nIgor Milla <igor.fsp.milla@gmail.com>\nDave Methvin <dave.methvin@gmail.com>\nFlorian Gutmann <f.gutmann@chronimo.com>\nMarwan Al Jubeh <marwan.aljubeh@gmail.com>\nMilan Broum <midlis@googlemail.com>\nSebastian Sauer <info@dynpages.de>\nGaëtan Muller <m.gaetan89@gmail.com>\nMichel Weimerskirch <michel@weimerskirch.net>\nWilliam Griffiths <william@ycymro.com>\nStojce Slavkovski <stojce@gmail.com>\nDavid Soms <david.soms@gmail.com>\nDavid De Sloovere <david.desloovere@outlook.com>\nMichael P. Jung <michael.jung@terreon.de>\nShannon Pekary <spekary@gmail.com>\nDan Wellman <danwellman@hotmail.com>\nMatthew Edward Hutton <meh@corefiling.co.uk>\nJames Khoury <james@jameskhoury.com>\nRob Loach <robloach@gmail.com>\nAlberto Monteiro <betimbrasil@gmail.com>\nAlex Rhea <alex.rhea@gmail.com>\nKrzysztof Rosiński <rozwell69@gmail.com>\nRyan Olton <oltonr@gmail.com>\nGenie <386@mail.com>\nRick Waldron <waldron.rick@gmail.com>\nIan Simpson <spoonlikesham@gmail.com>\nLev Kitsis <spam4lev@gmail.com>\nTJ VanToll <tj.vantoll@gmail.com>\nJustin Domnitz <jdomnitz@gmail.com>\nDouglas Cerna <douglascerna@yahoo.com>\nBert ter Heide <bertjh@hotmail.com>\nJasvir Nagra <jasvir@gmail.com>\nYuriy Khabarov <13real008@gmail.com>\nHarri Kilpiö <harri.kilpio@gmail.com>\nLado Lomidze <lado.lomidze@gmail.com>\nAmir E. Aharoni <amir.aharoni@mail.huji.ac.il>\nSimon Sattes <simon.sattes@gmail.com>\nJo Liss <joliss42@gmail.com>\nGuntupalli Karunakar <karunakarg@yahoo.com>\nShahyar Ghobadpour <shahyar@gmail.com>\nLukasz Lipinski <uzza17@gmail.com>\nTimo Tijhof <krinklemail@gmail.com>\nJason Moon <jmoon@socialcast.com>\nMartin Frost <martinf55@hotmail.com>\nEneko Illarramendi <eneko@illarra.com>\nEungJun Yi <semtlenori@gmail.com>\nCourtland Allen <courtlandallen@gmail.com>\nViktar Varvanovich <non4eg@gmail.com>\nDanny Trunk <dtrunk90@gmail.com>\nPavel Stetina <pavel.stetina@nangu.tv>\nMichael Stay <metaweta@gmail.com>\nSteven Roussey <sroussey@gmail.com>\nMichael Hollis <hollis21@gmail.com>\nLee Rowlands <lee.rowlands@previousnext.com.au>\nTimmy Willison <timmywillisn@gmail.com>\nKarl Swedberg <kswedberg@gmail.com>\nBaoju Yuan <the_guy_1987@hotmail.com>\nMaciej Mroziński <maciej.k.mrozinski@gmail.com>\nLuis Dalmolin <luis.nh@gmail.com>\nMark Aaron Shirley <maspwr@gmail.com>\nMartin Hoch <martin@fidion.de>\nJiayi Yang <tr870829@gmail.com>\nPhilipp Benjamin Köppchen <xgxtpbk@gws.ms>\nSindre Sorhus <sindresorhus@gmail.com>\nBernhard Sirlinger <bernhard.sirlinger@tele2.de>\nJared A. Scheel <jared@jaredscheel.com>\nRafael Xavier de Souza <rxaviers@gmail.com>\nJohn Chen <zhang.z.chen@intel.com>\nRobert Beuligmann <robertbeuligmann@gmail.com>\nDale Kocian <dale.kocian@gmail.com>\nMike Sherov <mike.sherov@gmail.com>\nAndrew Couch <andy@couchand.com>\nMarc-Andre Lafortune <github@marc-andre.ca>\nNate Eagle <nate.eagle@teamaol.com>\nDavid Souther <davidsouther@gmail.com>\nMathias Stenbom <mathias@stenbom.com>\nSergey Kartashov <ebishkek@yandex.ru>\nAvinash R <nashpapa@gmail.com>\nEthan Romba <ethanromba@gmail.com>\nCory Gackenheimer <cory.gack@gmail.com>\nJuan Pablo Kaniefsky <jpkaniefsky@gmail.com>\nRoman Salnikov <bardt.dz@gmail.com>\nAnika Henke <anika@selfthinker.org>\nSamuel Bovée <samycookie2000@yahoo.fr>\nFabrício Matté <ult_combo@hotmail.com>\nViktor Kojouharov <vkojouharov@gmail.com>\nPawel Maruszczyk (http://hrabstwo.net)\nPavel Selitskas <p.selitskas@gmail.com>\nBjørn Johansen <post@bjornjohansen.no>\nMatthieu Penant <thieum22@hotmail.com>\nDominic Barnes <dominic@dbarnes.info>\nDavid Sullivan <david.sullivan@gmail.com>\nThomas Jaggi <thomas@responsive.ch>\nVahid Sohrabloo <vahid4134@gmail.com>\nTravis Carden <travis.carden@gmail.com>\nBruno M. Custódio <bruno@brunomcustodio.com>\nNathanael Silverman <nathanael.silverman@gmail.com>\nChristian Wenz <christian@wenz.org>\nSteve Urmston <steve@urm.st>\nZaven Muradyan <megalivoithos@gmail.com>\nWoody Gilk <shadowhand@deviantart.com>\nZbigniew Motyka <zbigniew.motyka@gmail.com>\nSuhail Alkowaileet <xsoh.k7@gmail.com>\nToshi MARUYAMA <marutosijp2@yahoo.co.jp>\nDavid Hansen <hansede@gmail.com>\nBrian Grinstead <briangrinstead@gmail.com>\nChristian Klammer <christian314159@gmail.com>\nSteven Luscher <jquerycla@steveluscher.com>\nGan Eng Chin <engchin.gan@gmail.com>\nGabriel Schulhof <gabriel.schulhof@intel.com>\nAlexander Schmitz <arschmitz@gmail.com>\nVilhjálmur Skúlason <vis@dmm.is>\nSiebrand Mazeland <siebrand@kitano.nl>\nMohsen Ekhtiari <mohsenekhtiari@yahoo.com>\nPere Orga <gotrunks@gmail.com>\nJasper de Groot <mail@ugomobi.com>\nStephane Deschamps <stephane.deschamps@gmail.com>\nJyoti Deka <dekajp@gmail.com>\nAndrei Picus <office.nightcrawler@gmail.com>\nOndrej Novy <novy@ondrej.org>\nJacob McCutcheon <jacob.mccutcheon@gmail.com>\nMonika Piotrowicz <monika.piotrowicz@gmail.com>\nImants Horsts <imants.horsts@inbox.lv>\nEric Dahl <eric.c.dahl@gmail.com>\nDave Stein <dave@behance.com>\nDylan Barrell <dylan@barrell.com>\nDaniel DeGroff <djdegroff@gmail.com>\nMichael Wiencek <mwtuea@gmail.com>\nThomas Meyer <meyertee@gmail.com>\nRuslan Yakhyaev <ruslan@ruslan.io>\nBrian J. Dowling <bjd-dev@simplicity.net>\nBen Higgins <ben@extrahop.com>\nYermo Lamers <yml@yml.com>\nPatrick Stapleton <github@gdi2290.com>\nTrisha Crowley <trisha.crowley@gmail.com>\nUsman Akeju <akeju00+github@gmail.com>\nRodrigo Menezes <rod333@gmail.com>\nJacques Perrault <jacques_perrault@us.ibm.com>\nFrederik Elvhage <frederik.elvhage@googlemail.com>\nWill Holley <willholley@gmail.com>\nUri Gilad <antishok@gmail.com>\nRichard Gibson <richard.gibson@gmail.com>\nSimen Bekkhus <sbekkhus91@gmail.com>\nChen Eshchar <eshcharc@gmail.com>\nBruno Pérel <brunoperel@gmail.com>\nMohammed Alshehri <m@dralshehri.com>\nLisa Seacat DeLuca <ldeluca@us.ibm.com>\nAnne-Gaelle Colom <coloma@westminster.ac.uk>\nAdam Foster <slimfoster@gmail.com>\nLuke Page <luke.a.page@gmail.com>\nDaniel Owens <daniel@matchstickmixup.com>\nMichael Orchard <morchard@scottlogic.co.uk>\nMarcus Warren <marcus@envoke.com>\nNils Heuermann <nils@world-of-scripts.de>\nMarco Ziech <marco@ziech.net>\nPatricia Juarez <patrixd@gmail.com>\nBen Mosher <me@benmosher.com>\nAblay Keldibek <atomio.ak@gmail.com>\nThomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>\nJiabao Wu <jiabao.foss@gmail.com>\nEric Lee Carraway <github@ericcarraway.com>\nVictor Homyakov <vkhomyackov@gmail.com>\nMyeongjin Lee <aranet100@gmail.com>\nLiran Sharir <lsharir@gmail.com>\nWeston Ruter <weston@xwp.co>\nMani Mishra <manimishra902@gmail.com>\nHannah Methvin <hannahmethvin@gmail.com>\nLeonardo Balter <leonardo.balter@gmail.com>\nBenjamin Albert <benjamin_a5@yahoo.com>\nMichał Gołębiowski <m.goleb@gmail.com>\nAlyosha Pushak <alyosha.pushak@gmail.com>\nFahad Ahmad <fahadahmad41@hotmail.com>\nMatt Brundage <github@mattbrundage.com>\nFrancesc Baeta <francesc.baeta@gmail.com>\nPiotr Baran <piotros@wp.pl>\nMukul Hase <mukulhase@gmail.com>\nKonstantin Dinev <kdinev@mail.bw.edu>\nRand Scullard <rand@randscullard.com>\nDan Strohl <dan@wjcg.net>\nMaksim Ryzhikov <rv.maksim@gmail.com>\nAmine HADDAD <haddad@allegorie.tv>\nAmanpreet Singh <apsdehal@gmail.com>\nAlexey Balchunas <bleshik@gmail.com>\nPeter Kehl <peter.kehl@gmail.com>\nPeter Dave Hello <hsu@peterdavehello.org>\nJohannes Schäfer <johnschaefer@gmx.de>\nVille Skyttä <ville.skytta@iki.fi>\nRyan Oriecuia <ryan.oriecuia@visioncritical.com>\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/LICENSE.txt",
    "content": "Copyright jQuery Foundation and other contributors, https://jquery.org/\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/jquery/jquery-ui\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code contained within the demos directory.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nAll files located in the node_modules and external directories are\nexternally maintained libraries used by this software which have their\nown licenses; we recommend you read them, as their terms may differ from\nthe terms above.\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/external/jquery/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.12.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-05-20T17:17Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\nvar deletedIds = [];\n\nvar document = window.document;\n\nvar slice = deletedIds.slice;\n\nvar concat = deletedIds.concat;\n\nvar push = deletedIds.push;\n\nvar indexOf = deletedIds.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"1.12.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1, IE<9\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: deletedIds.sort,\n\tsplice: deletedIds.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type( obj ) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\tvar realStringObj = obj && obj.toString();\n\t\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj, \"constructor\" ) &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( !support.ownFirst ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data ); // jscs:ignore requireDotNotation\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1, IE<9\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\twhile ( j < len ) {\n\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\n\t\tif ( len !== len ) {\n\t\t\twhile ( second[ j ] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: function() {\n\t\treturn +( new Date() );\n\t},\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\n// JSHint would error on this code due to the Symbol not being defined in ES5.\n// Defining this global in .jshintrc would create a danger of using the global\n// unguarded in another place, it seems safer to just disable JSHint for these\n// three lines.\n/* jshint ignore: start */\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];\n}\n/* jshint ignore: end */\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.1\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-10-17\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\tnidselect = ridentifier.test( nid ) ? \"#\" + nid : \"[id='\" + nid + \"']\";\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nidselect + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( (parent = document.defaultView) && parent.top !== parent ) {\n\t\t// Support: IE 11\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\treturn m ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( (oldCache = uniqueCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// init accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt( 0 ) === \"<\" &&\n\t\t\t\tselector.charAt( selector.length - 1 ) === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[ 2 ] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof root.ready !== \"undefined\" ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && ( pos ?\n\t\t\t\t\tpos.index( cur ) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[ 0 ], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.uniqueSort( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnotwhite = ( /\\S+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = true;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ) ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis === promise ? newDefer.promise() : this,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add( function() {\n\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 ||\n\t\t\t\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred.\n\t\t\t// If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) )\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n} );\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n} );\n\n/**\n * Clean-up method for dom ready events\n */\nfunction detach() {\n\tif ( document.addEventListener ) {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\t\twindow.removeEventListener( \"load\", completed );\n\n\t} else {\n\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\twindow.detachEvent( \"onload\", completed );\n\t}\n}\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\n\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\tif ( document.addEventListener ||\n\t\twindow.event.type === \"load\" ||\n\t\tdocument.readyState === \"complete\" ) {\n\n\t\tdetach();\n\t\tjQuery.ready();\n\t}\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called\n\t\t// after the browser event has already occurred.\n\t\t// Support: IE6-10\n\t\t// Older IE sometimes signals \"interactive\" too soon\n\t\tif ( document.readyState === \"complete\" ||\n\t\t\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\twindow.setTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed );\n\n\t\t// If IE event model is used\n\t\t} else {\n\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch ( e ) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t( function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll( \"left\" );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn window.setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t} )();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Support: IE<9\n// Iteration over object's inherited properties before its own\nvar i;\nfor ( i in jQuery( support ) ) {\n\tbreak;\n}\nsupport.ownFirst = i === \"0\";\n\n// Note: most support tests are defined in their respective modules.\n// false until the test is run\nsupport.inlineBlockNeedsLayout = false;\n\n// Execute ASAP in case we need to set body.style.zoom\njQuery( function() {\n\n\t// Minified: var a,b,c,d\n\tvar val, div, body, container;\n\n\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\tif ( !body || !body.style ) {\n\n\t\t// Return for frameset docs that don't have a body\n\t\treturn;\n\t}\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\tbody.appendChild( container ).appendChild( div );\n\n\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\n\t\t// Support: IE<8\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\tdiv.style.cssText = \"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\";\n\n\t\tsupport.inlineBlockNeedsLayout = val = div.offsetWidth === 3;\n\t\tif ( val ) {\n\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t// Support: IE<8\n\t\t\tbody.style.zoom = 1;\n\t\t}\n\t}\n\n\tbody.removeChild( container );\n} );\n\n\n( function() {\n\tvar div = document.createElement( \"div\" );\n\n\t// Support: IE<9\n\tsupport.deleteExpando = true;\n\ttry {\n\t\tdelete div.test;\n\t} catch ( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n} )();\nvar acceptData = function( elem ) {\n\tvar noData = jQuery.noData[ ( elem.nodeName + \" \" ).toLowerCase() ],\n\t\tnodeType = +elem.nodeType || 1;\n\n\t// Do not set data on non-element DOM nodes because it will not be cleared (#8335).\n\treturn nodeType !== 1 && nodeType !== 9 ?\n\t\tfalse :\n\n\t\t// Nodes accept data unless otherwise specified; rejection can be conditional\n\t\t!noData || noData !== true && elem.getAttribute( \"classid\" ) === noData;\n};\n\n\n\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[ name ] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\n\tif ( !acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&\n\t\tdata === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split( \" \" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[ i ] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, undefined\n\t} else {\n\t\tcache[ id ] = undefined;\n\t}\n}\n\njQuery.extend( {\n\tcache: {},\n\n\t// The following elements (space-suffixed to avoid Object.prototype collisions)\n\t// throw uncatchable exceptions if you attempt to set expando properties\n\tnoData: {\n\t\t\"applet \": true,\n\t\t\"embed \": true,\n\n\t\t// ...but Flash objects (which have this classid) *can* handle expandos\n\t\t\"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each( function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t} ) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object,\n\t// or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\n\n\n( function() {\n\tvar shrinkWrapBlocksVal;\n\n\tsupport.shrinkWrapBlocks = function() {\n\t\tif ( shrinkWrapBlocksVal != null ) {\n\t\t\treturn shrinkWrapBlocksVal;\n\t\t}\n\n\t\t// Will be changed later if needed.\n\t\tshrinkWrapBlocksVal = false;\n\n\t\t// Minified: var b,c,d\n\t\tvar div, body, container;\n\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\t\tif ( !body || !body.style ) {\n\n\t\t\t// Test fired too early or in an unsupported environment, exit.\n\t\t\treturn;\n\t\t}\n\n\t\t// Setup\n\t\tdiv = document.createElement( \"div\" );\n\t\tcontainer = document.createElement( \"div\" );\n\t\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE6\n\t\t// Check if elements with layout shrink-wrap their children\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border\n\t\t\tdiv.style.cssText =\n\n\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;\" +\n\t\t\t\t\"padding:1px;width:1px;zoom:1\";\n\t\t\tdiv.appendChild( document.createElement( \"div\" ) ).style.width = \"5px\";\n\t\t\tshrinkWrapBlocksVal = div.offsetWidth !== 3;\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\treturn shrinkWrapBlocksVal;\n\t};\n\n} )();\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" ||\n\t\t\t!jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() { return tween.cur(); } :\n\t\t\tfunction() { return jQuery.css( elem, prop, \"\" ); },\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlength = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ],\n\t\t\t\t\tkey,\n\t\t\t\t\traw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlength ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([\\w:-]+)/ );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\nvar rleadingWhitespace = ( /^\\s+/ );\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|\" +\n\t\t\"details|dialog|figcaption|figure|footer|header|hgroup|main|\" +\n\t\t\"mark|meter|nav|output|picture|progress|section|summary|template|time|video\";\n\n\n\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\n\n( function() {\n\tvar div = document.createElement( \"div\" ),\n\t\tfragment = document.createDocumentFragment(),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Setup\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName( \"tbody\" ).length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone =\n\t\tdocument.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tinput.type = \"checkbox\";\n\tinput.checked = true;\n\tfragment.appendChild( input );\n\tsupport.appendChecked = input.checked;\n\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\t// Support: IE6-IE11+\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tfragment.appendChild( div );\n\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput = document.createElement( \"input\" );\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+\n\tsupport.noCloneEvent = !!div.addEventListener;\n\n\t// Support: IE<9\n\t// Since attributes and properties are the same in IE,\n\t// cleanData must set properties to undefined rather than use removeAttribute\n\tdiv[ jQuery.expando ] = 1;\n\tsupport.attributes = !div.getAttribute( jQuery.expando );\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\tarea: [ 1, \"<map>\", \"</map>\" ],\n\n\t// Support: IE8\n\tparam: [ 1, \"<object>\", \"</object>\" ],\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t// unless wrapped in a div with non-breaking characters in front of it.\n\t_default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\" ]\n};\n\n// Support: IE8-IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== \"undefined\" ?\n\t\t\t\tcontext.querySelectorAll( tag || \"*\" ) :\n\t\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context;\n\t\t\t( elem = elems[ i ] ) != null;\n\t\t\ti++\n\t\t) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; ( elem = elems[ i ] ) != null; i++ ) {\n\t\tjQuery._data(\n\t\t\telem,\n\t\t\t\"globalEval\",\n\t\t\t!refElements || jQuery._data( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/,\n\trtbody = /<tbody/i;\n\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar j, elem, contains,\n\t\ttmp, tag, tbody, wrap,\n\t\tl = elems.length,\n\n\t\t// Ensure a safe fragment\n\t\tsafe = createSafeFragment( context ),\n\n\t\tnodes = [],\n\t\ti = 0;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || safe.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\tif ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );\n\t\t\t\t}\n\n\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\tif ( !support.tbody ) {\n\n\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\twrap[ 1 ] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t0;\n\n\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\tif ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), \"tbody\" ) &&\n\t\t\t\t\t\t\t!tbody.childNodes.length ) {\n\n\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t}\n\n\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\ttmp = safe.lastChild;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fix #11356: Clear elements from fragment\n\tif ( tmp ) {\n\t\tsafe.removeChild( tmp );\n\t}\n\n\t// Reset defaultChecked for any radios and checkboxes\n\t// about to be appended to the DOM in IE 6/7 (#8060)\n\tif ( !support.appendChecked ) {\n\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t}\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttmp = null;\n\n\treturn safe;\n}\n\n\n( function() {\n\tvar i, eventName,\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)\n\tfor ( i in { submit: true, change: true, focusin: true } ) {\n\t\teventName = \"on\" + i;\n\n\t\tif ( !( support[ i ] = eventName in window ) ) {\n\n\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\t\t\tdiv.setAttribute( eventName, \"t\" );\n\t\t\tsupport[ i ] = div.attributes[ eventName ].expando === false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n} )();\n\n\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE9\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" &&\n\t\t\t\t\t( !e || jQuery.event.triggered !== e.type ) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak\n\t\t\t// with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tjQuery._data( cur, \"handle\" );\n\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif (\n\t\t\t\t( !special._default ||\n\t\t\t\t special._default.apply( eventPath.pop(), data ) === false\n\t\t\t\t) && acceptData( elem )\n\t\t\t) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Support (at least): Chrome, IE9\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t//\n\t\t// Support: Firefox<=42+\n\t\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\n\t\tif ( delegateCount && cur.nodeType &&\n\t\t\t( event.type !== \"click\" || isNaN( event.button ) || event.button < 1 ) ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \"click\" ) ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matches } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Safari 6-8+\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: ( \"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \" +\n\t\t\"metaKey relatedTarget shiftKey target timeStamp view which\" ).split( \" \" ),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split( \" \" ),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: ( \"button buttons clientX clientY fromElement offsetX offsetY \" +\n\t\t\t\"pageX pageY screenX screenY toElement\" ).split( \" \" ),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX +\n\t\t\t\t\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\n\t\t\t\t\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY +\n\t\t\t\t\t( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -\n\t\t\t\t\t( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ?\n\t\t\t\t\toriginal.toElement :\n\t\t\t\t\tfromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\n\t\t\t\t// Previously, `originalEvent: {}` was set here, so stopPropagation call\n\t\t\t\t// would not be triggered on donor event, since in our own\n\t\t\t\t// jQuery.event.stopPropagation function we had a check for existence of\n\t\t\t\t// originalEvent.stopPropagation method, so, consequently it would be a noop.\n\t\t\t\t//\n\t\t\t\t// Guard for simulated events was moved to jQuery.event.stopPropagation function\n\t\t\t\t// since `originalEvent` should point to the original event for the\n\t\t\t\t// constancy with other events and for more focused logic\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\n\t\t// This \"if\" is needed for plain objects\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event,\n\t\t\t// to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === \"undefined\" ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: IE < 9, Android < 4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( !e || this.isSimulated ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://code.google.com/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\n// IE submit delegation\nif ( !support.submit ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ?\n\n\t\t\t\t\t\t// Support: IE <=8\n\t\t\t\t\t\t// We use jQuery.prop instead of elem.form\n\t\t\t\t\t\t// to allow fixing the IE8 delegated submit issue (gh-2332)\n\t\t\t\t\t\t// by 3rd party polyfills/workarounds.\n\t\t\t\t\t\tjQuery.prop( elem, \"form\" ) :\n\t\t\t\t\t\tundefined;\n\n\t\t\t\tif ( form && !jQuery._data( form, \"submit\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submitBubble = true;\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery._data( form, \"submit\", true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submitBubble ) {\n\t\t\t\tdelete event._submitBubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !support.change ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._justChanged = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._justChanged && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._justChanged = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"change\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery._data( elem, \"change\", true );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger ||\n\t\t\t\t( elem.type !== \"radio\" && elem.type !== \"checkbox\" ) ) {\n\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Support: Firefox\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome, Safari\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tjQuery._data( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tjQuery._removeData( doc, fix );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery._data( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar rinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp( \"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\" ),\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\n\n\t// Support: IE 10-11, Edge 10240+\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement( \"div\" ) );\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName( \"tbody\" )[ 0 ] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement( \"tbody\" ) ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( jQuery.find.attr( elem, \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar first, node, hasScripts,\n\t\tscripts, doc, fragment,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.globalEval(\n\t\t\t\t\t\t\t\t( node.text || node.textContent || node.innerHTML || \"\" )\n\t\t\t\t\t\t\t\t\t.replace( rcleanScript, \"\" )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\tfragment = first = null;\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\telems = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = elems[ i ] ) != null; i++ ) {\n\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( support.html5Clone || jQuery.isXMLDoc( elem ) ||\n\t\t\t!rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( ( !support.noCloneEvent || !support.noCloneChecked ) &&\n\t\t\t\t( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {\n\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[ i ] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems, /* internal */ forceAcceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tattributes = support.attributes,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\tif ( forceAcceptData || acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes\n\t\t\t\t\t\t// IE creates expando attributes along with the property\n\t\t\t\t\t\t// IE does not have a removeAttribute function on Document nodes\n\t\t\t\t\t\tif ( !attributes && typeof elem.removeAttribute !== \"undefined\" ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t\t\t\t// https://code.google.com/p/chromium/issues/detail?id=378607\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdeletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\n\t// Keep domManip exposed until 3.0 (gh-2225)\n\tdomManip: domManip,\n\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append(\n\t\t\t\t\t( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )\n\t\t\t\t);\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[ i ] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\n\n\nvar iframe,\n\telemdisplay = {\n\n\t\t// Support: Firefox\n\t\t// We have to pre-define these values for FF (#10227)\n\t\tHTML: \"block\",\n\t\tBODY: \"block\"\n\t};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\tdisplay = jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" ) )\n\t\t\t\t.appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar documentElement = document.documentElement;\n\n\n\n( function() {\n\tvar pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,\n\t\treliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\tdiv.style.cssText = \"float:left;opacity:.5\";\n\n\t// Support: IE<9\n\t// Make sure that element opacity exists (as opposed to filter)\n\tsupport.opacity = div.style.opacity === \"0.5\";\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!div.style.cssFloat;\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tdiv.innerHTML = \"\";\n\tcontainer.appendChild( div );\n\n\t// Support: Firefox<29, Android 2.3\n\t// Vendor-prefix box-sizing\n\tsupport.boxSizing = div.style.boxSizing === \"\" || div.style.MozBoxSizing === \"\" ||\n\t\tdiv.style.WebkitBoxSizing === \"\";\n\n\tjQuery.extend( support, {\n\t\treliableHiddenOffsets: function() {\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableHiddenOffsetsVal;\n\t\t},\n\n\t\tboxSizingReliable: function() {\n\n\t\t\t// We're checking for pixelPositionVal here instead of boxSizingReliableVal\n\t\t\t// since that compresses better and they're computed together anyway.\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\n\t\tpixelMarginRight: function() {\n\n\t\t\t// Support: Android 4.0-4.3\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\n\t\tpixelPosition: function() {\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelPositionVal;\n\t\t},\n\n\t\treliableMarginRight: function() {\n\n\t\t\t// Support: Android 2.3\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginRightVal;\n\t\t},\n\n\t\treliableMarginLeft: function() {\n\n\t\t\t// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n\n\tfunction computeStyleTests() {\n\t\tvar contents, divStyle,\n\t\t\tdocumentElement = document.documentElement;\n\n\t\t// Setup\n\t\tdocumentElement.appendChild( container );\n\n\t\tdiv.style.cssText =\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\n\t\t// Support: IE<9\n\t\t// Assume reasonable values in the absence of getComputedStyle\n\t\tpixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;\n\t\tpixelMarginRightVal = reliableMarginRightVal = true;\n\n\t\t// Check for getComputedStyle so that this code is not run in IE<9.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tdivStyle = window.getComputedStyle( div );\n\t\t\tpixelPositionVal = ( divStyle || {} ).top !== \"1%\";\n\t\t\treliableMarginLeftVal = ( divStyle || {} ).marginLeft === \"2px\";\n\t\t\tboxSizingReliableVal = ( divStyle || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Support: Android 4.0 - 4.3 only\n\t\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\t\tdiv.style.marginRight = \"50%\";\n\t\t\tpixelMarginRightVal = ( divStyle || { marginRight: \"4px\" } ).marginRight === \"4px\";\n\n\t\t\t// Support: Android 2.3 only\n\t\t\t// Div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container (#3333)\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tcontents = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\tcontents.style.cssText = div.style.cssText =\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\tcontents.style.marginRight = contents.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\treliableMarginRightVal =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );\n\n\t\t\tdiv.removeChild( contents );\n\t\t}\n\n\t\t// Support: IE6-8\n\t\t// First check that getClientRects works as expected\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.style.display = \"none\";\n\t\treliableHiddenOffsetsVal = div.getClientRects().length === 0;\n\t\tif ( reliableHiddenOffsetsVal ) {\n\t\t\tdiv.style.display = \"\";\n\t\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\t\tdiv.childNodes[ 0 ].style.borderCollapse = \"separate\";\n\t\t\tcontents = div.getElementsByTagName( \"td\" );\n\t\t\tcontents[ 0 ].style.cssText = \"margin:0;border:0;padding:0;display:none\";\n\t\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\t\tif ( reliableHiddenOffsetsVal ) {\n\t\t\t\tcontents[ 0 ].style.display = \"\";\n\t\t\t\tcontents[ 1 ].style.display = \"none\";\n\t\t\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\t\t}\n\t\t}\n\n\t\t// Teardown\n\t\tdocumentElement.removeChild( container );\n\t}\n\n} )();\n\n\nvar getStyles, curCSS,\n\trposition = /^(top|right|bottom|left)$/;\n\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar width, minWidth, maxWidth, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\n\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\n\n\t\t// Support: Opera 12.1x only\n\t\t// Fall back to style even without computed\n\t\t// computed is undefined for elems on document fragments\n\t\tif ( ( ret === \"\" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\tif ( computed ) {\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\"\n\t\t\t// instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values,\n\t\t\t// but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec:\n\t\t\t// http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\";\n\t};\n} else if ( documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar left, rs, rsLeft, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\t\tret = computed ? computed[ name ] : undefined;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are\n\t\t// proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it\n\t\t// might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\" || \"auto\";\n\t};\n}\n\n\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/i,\n\n\t// swappable if display is none or starts with table except\n\t// \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values:\n\t// https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] =\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", defaultDisplay( elem.nodeName ) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\tjQuery._data(\n\t\t\t\t\telem,\n\t\t\t\t\t\"olddisplay\",\n\t\t\t\t\thidden ? display : jQuery.css( elem, \"display\" )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = support.boxSizing &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test( val ) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\n\t\t// normalize float css property\n\t\t\"float\": support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set. See: #7116\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight\n\t\t\t// (for every problematic property) identical functions\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\t// Support: IE\n\t\t\t\t// Swallow errors from 'invalid' CSS values (#5509)\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\t\t\t\t\telem.offsetWidth === 0 ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tsupport.boxSizing &&\n\t\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n} );\n\nif ( !support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( ( computed && elem.currentStyle ?\n\t\t\t\telem.currentStyle.filter :\n\t\t\t\telem.style.filter ) || \"\" ) ?\n\t\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist -\n\t\t\t// attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule\n\t\t\t\t// or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn (\n\t\t\t\tparseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\n\t\t\t\t// Support: IE<=11+\n\t\t\t\t// Running getBoundingClientRect on a disconnected node in IE throws an error\n\t\t\t\t// Support: IE8 only\n\t\t\t\t// getClientRects() errors on disconnected elems\n\t\t\t\t( jQuery.contains( elem.ownerDocument, elem ) ?\n\t\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t0\n\t\t\t\t)\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tjQuery._data( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !support.shrinkWrapBlocks() ) {\n\t\t\tanim.always( function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t} );\n\t\t}\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show\n\t\t\t\t// and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done( function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t} );\n\t\t}\n\t\tanim.done( function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t} );\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( ( display === \"none\" ? defaultDisplay( elem.nodeName ) : display ) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnotwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ?\n\t\t\tjQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\twindow.clearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar a,\n\t\tinput = document.createElement( \"input\" ),\n\t\tdiv = document.createElement( \"div\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Support: Windows Web Apps (WWA)\n\t// `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"checkbox\" );\n\tdiv.appendChild( input );\n\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// First batch of tests.\n\ta.style.cssText = \"top:1px\";\n\n\t// Test setAttribute on camelCase class.\n\t// If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute( \"style\" ) );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute( \"href\" ) === \"/a\";\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement( \"form\" ).enctype;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE8 only\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement( \"input\" );\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar rreturn = /\\r/g,\n\trspaces = /[\\x20\\t\\r\\n\\f]+/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif (\n\t\t\t\t\thooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace( rreturn, \"\" ) :\n\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) ).replace( rspaces, \" \" );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ?\n\t\t\t\t\t\t\t\t!option.disabled :\n\t\t\t\t\t\t\t\toption.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\tif ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {\n\n\t\t\t\t\t\t// Support: IE6\n\t\t\t\t\t\t// When new option element is added to select box we need to\n\t\t\t\t\t\t// force reflow of newly added node in order to workaround delay\n\t\t\t\t\t\t// of initialization properties\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toption.selected = optionSet = true;\n\n\t\t\t\t\t\t} catch ( _ ) {\n\n\t\t\t\t\t\t\t// Will be executed only in IE6\n\t\t\t\t\t\t\toption.scrollHeight;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\toption.selected = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\n\t\t\t\treturn options;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = support.getSetAttribute,\n\tgetSetInput = support.input;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE8-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t} else {\n\n\t\t\t// Support: IE<9\n\t\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\t\tvar ret, handle;\n\t\t\tif ( !isXML ) {\n\n\t\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\t\thandle = attrHandle[ name ];\n\t\t\t\tattrHandle[ name ] = ret;\n\t\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t\tattrHandle[ name ] = handle;\n\t\t\t}\n\t\t\treturn ret;\n\t\t};\n\t} else {\n\t\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn elem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n\t}\n} );\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t( ret = elem.ownerDocument.createAttribute( name ) )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\tif ( name === \"value\" || value === elem.getAttribute( name ) ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Some attributes are constructed with empty-string values when not defined\n\tattrHandle.id = attrHandle.name = attrHandle.coords =\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn ( ret = elem.getAttributeNode( name ) ) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n\n\t// Fixing value retrieval on a button requires this module\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( ret && ret.specified ) {\n\t\t\t\treturn ret.value;\n\t\t\t}\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each( [ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\n\nif ( !support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case sensitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each( function() {\n\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch ( e ) {}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\t\trclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t\t0 :\n\t\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !support.hrefNormalized ) {\n\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each( [ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t} );\n}\n\n// Support: Safari, IE9+\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n// IE6/7 call enctype encoding\nif ( !support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\nfunction getClass( elem ) {\n\treturn jQuery.attr( elem, \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnotwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 &&\n\t\t\t\t\t( \" \" + curValue + \" \" ).replace( rclass, \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tjQuery.attr( elem, \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnotwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 &&\n\t\t\t\t\t( \" \" + curValue + \" \" ).replace( rclass, \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tjQuery.attr( elem, \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tjQuery.attr( this, \"class\",\n\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\"\" :\n\t\t\t\t\tjQuery._data( this, \"__className__\" ) || \"\"\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + getClass( elem ) + \" \" ).replace( rclass, \" \" )\n\t\t\t\t\t.indexOf( className ) > -1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( ( \"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\nvar rvalidtokens = /(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;\n\njQuery.parseJSON = function( data ) {\n\n\t// Attempt to parse using the native JSON parser first\n\tif ( window.JSON && window.JSON.parse ) {\n\n\t\t// Support: Android 2.3\n\t\t// Workaround failure to string-cast null input\n\t\treturn window.JSON.parse( data + \"\" );\n\t}\n\n\tvar requireNonComma,\n\t\tdepth = null,\n\t\tstr = jQuery.trim( data + \"\" );\n\n\t// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains\n\t// after removing valid tokens\n\treturn str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {\n\n\t\t// Force termination if we see a misplaced comma\n\t\tif ( requireNonComma && comma ) {\n\t\t\tdepth = 0;\n\t\t}\n\n\t\t// Perform no more replacements after returning to outermost depth\n\t\tif ( depth === 0 ) {\n\t\t\treturn token;\n\t\t}\n\n\t\t// Commas must not follow \"[\", \"{\", or \",\"\n\t\trequireNonComma = open || comma;\n\n\t\t// Determine new depth\n\t\t// array/object open (\"[\" or \"{\"): depth += true - false (increment)\n\t\t// array/object close (\"]\" or \"}\"): depth += false - true (decrement)\n\t\t// other cases (\",\" or primitive): depth += true - true (numeric cast)\n\t\tdepth += !close - !open;\n\n\t\t// Remove this token\n\t\treturn \"\";\n\t} ) ) ?\n\t\t( Function( \"return \" + str ) )() :\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tif ( window.DOMParser ) { // Standard\n\t\t\ttmp = new window.DOMParser();\n\t\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t\t} else { // IE\n\t\t\txml = new window.ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\txml.async = \"false\";\n\t\t\txml.loadXML( data );\n\t\t}\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\n\t// IE leaves an \\r character at EOL\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType.charAt( 0 ) === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) { // jscs:ignore requireDotNotation\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar\n\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" )\n\t\t\t.replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each( function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t} ).end();\n\t}\n} );\n\n\nfunction getDisplay( elem ) {\n\treturn elem.style && elem.style.display || jQuery.css( elem, \"display\" );\n}\n\nfunction filterHidden( elem ) {\n\n\t// Disconnected elements are considered hidden\n\tif ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {\n\t\treturn true;\n\t}\n\twhile ( elem && elem.nodeType === 1 ) {\n\t\tif ( getDisplay( elem ) === \"none\" || elem.type === \"hidden\" ) {\n\t\t\treturn true;\n\t\t}\n\t\telem = elem.parentNode;\n\t}\n\treturn false;\n}\n\njQuery.expr.filters.hidden = function( elem ) {\n\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn support.reliableHiddenOffsets() ?\n\t\t( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&\n\t\t\t!elem.getClientRects().length ) :\n\t\t\tfilterHidden( elem );\n};\n\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t} ) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?\n\n\t// Support: IE6-IE8\n\tfunction() {\n\n\t\t// XHR cannot access local files, always use ActiveX for that case\n\t\tif ( this.isLocal ) {\n\t\t\treturn createActiveXHR();\n\t\t}\n\n\t\t// Support: IE 9-11\n\t\t// IE seems to error on cross-domain PATCH requests when ActiveX XHR\n\t\t// is used. In IE 9+ always use the native XHR.\n\t\t// Note: this condition won't catch Edge as it doesn't define\n\t\t// document.documentMode but it also doesn't support ActiveX so it won't\n\t\t// reach this code.\n\t\tif ( document.documentMode > 8 ) {\n\t\t\treturn createStandardXHR();\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// oldIE XHR does not support non-RFC2616 methods (#13240)\n\t\t// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx\n\t\t// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9\n\t\t// Although this check for six methods instead of eight\n\t\t// since IE also does not support \"trace\" and \"connect\"\n\t\treturn /^(get|post|head|put|delete|options)$/i.test( this.type ) &&\n\t\t\tcreateStandardXHR() || createActiveXHR();\n\t} :\n\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE<10\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t} );\n}\n\n// Determine support properties\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport( function( options ) {\n\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !options.crossDomain || support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\t\t\t\t\tvar i,\n\t\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\txhr.open(\n\t\t\t\t\t\toptions.type,\n\t\t\t\t\t\toptions.url,\n\t\t\t\t\t\toptions.async,\n\t\t\t\t\t\toptions.username,\n\t\t\t\t\t\toptions.password\n\t\t\t\t\t);\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set headers\n\t\t\t\t\tfor ( i in headers ) {\n\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// IE's ActiveXObject throws a 'Type Mismatch' exception when setting\n\t\t\t\t\t\t// request header to a null-value.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// To keep consistent with other XHR implementations, cast the value\n\t\t\t\t\t\t// to string and ignore `undefined`.\n\t\t\t\t\t\tif ( headers[ i ] !== undefined ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] + \"\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( options.hasContent && options.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, statusText, responses;\n\n\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t// Clean up\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = undefined;\n\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\n\t\t\t\t\t\t\t// Abort manually if needed\n\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\tstatus = xhr.status;\n\n\t\t\t\t\t\t\t\t// Support: IE<10\n\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\tif ( !status && options.isLocal && !options.crossDomain ) {\n\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\n\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, xhr.getAllResponseHeaders() );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// `xhr.send` may raise an exception, but it will be\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\tif ( !options.async ) {\n\n\t\t\t\t\t\t// If we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\twindow.setTimeout( callback );\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Register the callback, but delay it in case `xhr.send` throws\n\t\t\t\t\t\t// Add to the list of active xhr callbacks\n\t\t\t\t\t\txhr.onreadystatechange = xhrCallbacks[ id ] = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t} );\n}\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch ( e ) {}\n}\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery( \"head\" )[ 0 ] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = jQuery.trim( url.slice( off, url.length ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\tjQuery.inArray( \"auto\", [ curCSSTop, curCSSLeft ] ) > -1;\n\n\t\t// need to be able to calculate position if either top or left\n\t\t// is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ],\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\t// BlackBerry 5, iOS 3 (original iPhone)\n\t\tif ( typeof elem.getBoundingClientRect !== \"undefined\" ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n\t\t// because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? ( prop in win ) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n} );\n\n// Support: Safari<7-8+, Chrome<37-44+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// getComputedStyle returns percent when specified for top/left/bottom/right\n// rather than make the css module depend on the offset module, we just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\tfunction( defaultExtra, funcName ) {\n\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only,\n\t\t\t\t\t// but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t} );\n} );\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in\n// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\nreturn jQuery;\n}));\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/index.html",
    "content": "<!doctype html>\n<html lang=\"us\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>jQuery UI Example Page</title>\n\t<link href=\"jquery-ui.css\" rel=\"stylesheet\">\n\t<style>\n\tbody{\n\t\tfont-family: \"Trebuchet MS\", sans-serif;\n\t\tmargin: 50px;\n\t}\n\t.demoHeaders {\n\t\tmargin-top: 2em;\n\t}\n\t#dialog-link {\n\t\tpadding: .4em 1em .4em 20px;\n\t\ttext-decoration: none;\n\t\tposition: relative;\n\t}\n\t#dialog-link span.ui-icon {\n\t\tmargin: 0 5px 0 0;\n\t\tposition: absolute;\n\t\tleft: .2em;\n\t\ttop: 50%;\n\t\tmargin-top: -8px;\n\t}\n\t#icons {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\t#icons li {\n\t\tmargin: 2px;\n\t\tposition: relative;\n\t\tpadding: 4px 0;\n\t\tcursor: pointer;\n\t\tfloat: left;\n\t\tlist-style: none;\n\t}\n\t#icons span.ui-icon {\n\t\tfloat: left;\n\t\tmargin: 0 4px;\n\t}\n\t.fakewindowcontain .ui-widget-overlay {\n\t\tposition: absolute;\n\t}\n\tselect {\n\t\twidth: 200px;\n\t}\n\t</style>\n</head>\n<body>\n\n<h1>Welcome to jQuery UI!</h1>\n\n<div class=\"ui-widget\">\n\t<p>This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.</p>\n</div>\n\n<h1>YOUR COMPONENTS:</h1>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<h2 class=\"demoHeaders\">Framework Icons (content color preview)</h2>\n<ul id=\"icons\" class=\"ui-widget ui-helper-clearfix\">\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-n\"><span class=\"ui-icon ui-icon-caret-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-ne\"><span class=\"ui-icon ui-icon-caret-1-ne\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-e\"><span class=\"ui-icon ui-icon-caret-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-se\"><span class=\"ui-icon ui-icon-caret-1-se\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-s\"><span class=\"ui-icon ui-icon-caret-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-sw\"><span class=\"ui-icon ui-icon-caret-1-sw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-w\"><span class=\"ui-icon ui-icon-caret-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-1-nw\"><span class=\"ui-icon ui-icon-caret-1-nw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-2-n-s\"><span class=\"ui-icon ui-icon-caret-2-n-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-caret-2-e-w\"><span class=\"ui-icon ui-icon-caret-2-e-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-n\"><span class=\"ui-icon ui-icon-triangle-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-ne\"><span class=\"ui-icon ui-icon-triangle-1-ne\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-e\"><span class=\"ui-icon ui-icon-triangle-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-se\"><span class=\"ui-icon ui-icon-triangle-1-se\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-s\"><span class=\"ui-icon ui-icon-triangle-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-sw\"><span class=\"ui-icon ui-icon-triangle-1-sw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-w\"><span class=\"ui-icon ui-icon-triangle-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-1-nw\"><span class=\"ui-icon ui-icon-triangle-1-nw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-2-n-s\"><span class=\"ui-icon ui-icon-triangle-2-n-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-triangle-2-e-w\"><span class=\"ui-icon ui-icon-triangle-2-e-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-n\"><span class=\"ui-icon ui-icon-arrow-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-ne\"><span class=\"ui-icon ui-icon-arrow-1-ne\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-e\"><span class=\"ui-icon ui-icon-arrow-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-se\"><span class=\"ui-icon ui-icon-arrow-1-se\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-s\"><span class=\"ui-icon ui-icon-arrow-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-sw\"><span class=\"ui-icon ui-icon-arrow-1-sw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-w\"><span class=\"ui-icon ui-icon-arrow-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-1-nw\"><span class=\"ui-icon ui-icon-arrow-1-nw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-2-n-s\"><span class=\"ui-icon ui-icon-arrow-2-n-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-2-ne-sw\"><span class=\"ui-icon ui-icon-arrow-2-ne-sw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-2-e-w\"><span class=\"ui-icon ui-icon-arrow-2-e-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-2-se-nw\"><span class=\"ui-icon ui-icon-arrow-2-se-nw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowstop-1-n\"><span class=\"ui-icon ui-icon-arrowstop-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowstop-1-e\"><span class=\"ui-icon ui-icon-arrowstop-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowstop-1-s\"><span class=\"ui-icon ui-icon-arrowstop-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowstop-1-w\"><span class=\"ui-icon ui-icon-arrowstop-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-n\"><span class=\"ui-icon ui-icon-arrowthick-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-ne\"><span class=\"ui-icon ui-icon-arrowthick-1-ne\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-e\"><span class=\"ui-icon ui-icon-arrowthick-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-se\"><span class=\"ui-icon ui-icon-arrowthick-1-se\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-s\"><span class=\"ui-icon ui-icon-arrowthick-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-sw\"><span class=\"ui-icon ui-icon-arrowthick-1-sw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-w\"><span class=\"ui-icon ui-icon-arrowthick-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-1-nw\"><span class=\"ui-icon ui-icon-arrowthick-1-nw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-2-n-s\"><span class=\"ui-icon ui-icon-arrowthick-2-n-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-2-ne-sw\"><span class=\"ui-icon ui-icon-arrowthick-2-ne-sw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-2-e-w\"><span class=\"ui-icon ui-icon-arrowthick-2-e-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthick-2-se-nw\"><span class=\"ui-icon ui-icon-arrowthick-2-se-nw\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthickstop-1-n\"><span class=\"ui-icon ui-icon-arrowthickstop-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthickstop-1-e\"><span class=\"ui-icon ui-icon-arrowthickstop-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthickstop-1-s\"><span class=\"ui-icon ui-icon-arrowthickstop-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowthickstop-1-w\"><span class=\"ui-icon ui-icon-arrowthickstop-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturnthick-1-w\"><span class=\"ui-icon ui-icon-arrowreturnthick-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturnthick-1-n\"><span class=\"ui-icon ui-icon-arrowreturnthick-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturnthick-1-e\"><span class=\"ui-icon ui-icon-arrowreturnthick-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturnthick-1-s\"><span class=\"ui-icon ui-icon-arrowreturnthick-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturn-1-w\"><span class=\"ui-icon ui-icon-arrowreturn-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturn-1-n\"><span class=\"ui-icon ui-icon-arrowreturn-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturn-1-e\"><span class=\"ui-icon ui-icon-arrowreturn-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowreturn-1-s\"><span class=\"ui-icon ui-icon-arrowreturn-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowrefresh-1-w\"><span class=\"ui-icon ui-icon-arrowrefresh-1-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowrefresh-1-n\"><span class=\"ui-icon ui-icon-arrowrefresh-1-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowrefresh-1-e\"><span class=\"ui-icon ui-icon-arrowrefresh-1-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrowrefresh-1-s\"><span class=\"ui-icon ui-icon-arrowrefresh-1-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-4\"><span class=\"ui-icon ui-icon-arrow-4\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-arrow-4-diag\"><span class=\"ui-icon ui-icon-arrow-4-diag\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-extlink\"><span class=\"ui-icon ui-icon-extlink\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-newwin\"><span class=\"ui-icon ui-icon-newwin\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-refresh\"><span class=\"ui-icon ui-icon-refresh\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-shuffle\"><span class=\"ui-icon ui-icon-shuffle\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-transfer-e-w\"><span class=\"ui-icon ui-icon-transfer-e-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-transferthick-e-w\"><span class=\"ui-icon ui-icon-transferthick-e-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-folder-collapsed\"><span class=\"ui-icon ui-icon-folder-collapsed\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-folder-open\"><span class=\"ui-icon ui-icon-folder-open\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-document\"><span class=\"ui-icon ui-icon-document\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-document-b\"><span class=\"ui-icon ui-icon-document-b\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-note\"><span class=\"ui-icon ui-icon-note\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-mail-closed\"><span class=\"ui-icon ui-icon-mail-closed\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-mail-open\"><span class=\"ui-icon ui-icon-mail-open\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-suitcase\"><span class=\"ui-icon ui-icon-suitcase\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-comment\"><span class=\"ui-icon ui-icon-comment\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-person\"><span class=\"ui-icon ui-icon-person\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-print\"><span class=\"ui-icon ui-icon-print\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-trash\"><span class=\"ui-icon ui-icon-trash\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-locked\"><span class=\"ui-icon ui-icon-locked\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-unlocked\"><span class=\"ui-icon ui-icon-unlocked\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-bookmark\"><span class=\"ui-icon ui-icon-bookmark\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-tag\"><span class=\"ui-icon ui-icon-tag\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-home\"><span class=\"ui-icon ui-icon-home\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-flag\"><span class=\"ui-icon ui-icon-flag\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-calculator\"><span class=\"ui-icon ui-icon-calculator\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-cart\"><span class=\"ui-icon ui-icon-cart\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-pencil\"><span class=\"ui-icon ui-icon-pencil\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-clock\"><span class=\"ui-icon ui-icon-clock\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-disk\"><span class=\"ui-icon ui-icon-disk\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-calendar\"><span class=\"ui-icon ui-icon-calendar\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-zoomin\"><span class=\"ui-icon ui-icon-zoomin\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-zoomout\"><span class=\"ui-icon ui-icon-zoomout\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-search\"><span class=\"ui-icon ui-icon-search\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-wrench\"><span class=\"ui-icon ui-icon-wrench\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-gear\"><span class=\"ui-icon ui-icon-gear\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-heart\"><span class=\"ui-icon ui-icon-heart\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-star\"><span class=\"ui-icon ui-icon-star\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-link\"><span class=\"ui-icon ui-icon-link\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-cancel\"><span class=\"ui-icon ui-icon-cancel\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-plus\"><span class=\"ui-icon ui-icon-plus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-plusthick\"><span class=\"ui-icon ui-icon-plusthick\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-minus\"><span class=\"ui-icon ui-icon-minus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-minusthick\"><span class=\"ui-icon ui-icon-minusthick\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-close\"><span class=\"ui-icon ui-icon-close\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-closethick\"><span class=\"ui-icon ui-icon-closethick\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-key\"><span class=\"ui-icon ui-icon-key\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-lightbulb\"><span class=\"ui-icon ui-icon-lightbulb\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-scissors\"><span class=\"ui-icon ui-icon-scissors\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-clipboard\"><span class=\"ui-icon ui-icon-clipboard\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-copy\"><span class=\"ui-icon ui-icon-copy\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-contact\"><span class=\"ui-icon ui-icon-contact\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-image\"><span class=\"ui-icon ui-icon-image\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-video\"><span class=\"ui-icon ui-icon-video\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-script\"><span class=\"ui-icon ui-icon-script\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-alert\"><span class=\"ui-icon ui-icon-alert\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-info\"><span class=\"ui-icon ui-icon-info\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-notice\"><span class=\"ui-icon ui-icon-notice\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-help\"><span class=\"ui-icon ui-icon-help\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-check\"><span class=\"ui-icon ui-icon-check\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-bullet\"><span class=\"ui-icon ui-icon-bullet\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-radio-off\"><span class=\"ui-icon ui-icon-radio-off\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-radio-on\"><span class=\"ui-icon ui-icon-radio-on\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-pin-w\"><span class=\"ui-icon ui-icon-pin-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-pin-s\"><span class=\"ui-icon ui-icon-pin-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-play\"><span class=\"ui-icon ui-icon-play\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-pause\"><span class=\"ui-icon ui-icon-pause\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-seek-next\"><span class=\"ui-icon ui-icon-seek-next\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-seek-prev\"><span class=\"ui-icon ui-icon-seek-prev\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-seek-end\"><span class=\"ui-icon ui-icon-seek-end\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-seek-first\"><span class=\"ui-icon ui-icon-seek-first\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-stop\"><span class=\"ui-icon ui-icon-stop\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-eject\"><span class=\"ui-icon ui-icon-eject\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-volume-off\"><span class=\"ui-icon ui-icon-volume-off\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-volume-on\"><span class=\"ui-icon ui-icon-volume-on\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-power\"><span class=\"ui-icon ui-icon-power\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-signal-diag\"><span class=\"ui-icon ui-icon-signal-diag\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-signal\"><span class=\"ui-icon ui-icon-signal\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-battery-0\"><span class=\"ui-icon ui-icon-battery-0\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-battery-1\"><span class=\"ui-icon ui-icon-battery-1\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-battery-2\"><span class=\"ui-icon ui-icon-battery-2\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-battery-3\"><span class=\"ui-icon ui-icon-battery-3\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-plus\"><span class=\"ui-icon ui-icon-circle-plus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-minus\"><span class=\"ui-icon ui-icon-circle-minus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-close\"><span class=\"ui-icon ui-icon-circle-close\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-triangle-e\"><span class=\"ui-icon ui-icon-circle-triangle-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-triangle-s\"><span class=\"ui-icon ui-icon-circle-triangle-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-triangle-w\"><span class=\"ui-icon ui-icon-circle-triangle-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-triangle-n\"><span class=\"ui-icon ui-icon-circle-triangle-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-arrow-e\"><span class=\"ui-icon ui-icon-circle-arrow-e\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-arrow-s\"><span class=\"ui-icon ui-icon-circle-arrow-s\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-arrow-w\"><span class=\"ui-icon ui-icon-circle-arrow-w\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-arrow-n\"><span class=\"ui-icon ui-icon-circle-arrow-n\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-zoomin\"><span class=\"ui-icon ui-icon-circle-zoomin\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-zoomout\"><span class=\"ui-icon ui-icon-circle-zoomout\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circle-check\"><span class=\"ui-icon ui-icon-circle-check\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circlesmall-plus\"><span class=\"ui-icon ui-icon-circlesmall-plus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circlesmall-minus\"><span class=\"ui-icon ui-icon-circlesmall-minus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-circlesmall-close\"><span class=\"ui-icon ui-icon-circlesmall-close\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-squaresmall-plus\"><span class=\"ui-icon ui-icon-squaresmall-plus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-squaresmall-minus\"><span class=\"ui-icon ui-icon-squaresmall-minus\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-squaresmall-close\"><span class=\"ui-icon ui-icon-squaresmall-close\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-grip-dotted-vertical\"><span class=\"ui-icon ui-icon-grip-dotted-vertical\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-grip-dotted-horizontal\"><span class=\"ui-icon ui-icon-grip-dotted-horizontal\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-grip-solid-vertical\"><span class=\"ui-icon ui-icon-grip-solid-vertical\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-grip-solid-horizontal\"><span class=\"ui-icon ui-icon-grip-solid-horizontal\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-gripsmall-diagonal-se\"><span class=\"ui-icon ui-icon-gripsmall-diagonal-se\"></span></li>\n\t<li class=\"ui-state-default ui-corner-all\" title=\".ui-icon-grip-diagonal-se\"><span class=\"ui-icon ui-icon-grip-diagonal-se\"></span></li>\n</ul>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!-- Highlight / Error -->\n<h2 class=\"demoHeaders\">Highlight / Error</h2>\n<div class=\"ui-widget\">\n\t<div class=\"ui-state-highlight ui-corner-all\" style=\"margin-top: 20px; padding: 0 .7em;\">\n\t\t<p><span class=\"ui-icon ui-icon-info\" style=\"float: left; margin-right: .3em;\"></span>\n\t\t<strong>Hey!</strong> Sample ui-state-highlight style.</p>\n\t</div>\n</div>\n<br>\n<div class=\"ui-widget\">\n\t<div class=\"ui-state-error ui-corner-all\" style=\"padding: 0 .7em;\">\n\t\t<p><span class=\"ui-icon ui-icon-alert\" style=\"float: left; margin-right: .3em;\"></span>\n\t\t<strong>Alert:</strong> Sample ui-state-error style.</p>\n\t</div>\n</div>\n\n<script src=\"external/jquery/jquery.js\"></script>\n<script src=\"jquery-ui.js\"></script>\n<script>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Hover states on the static widgets\n$( \"#dialog-link, #icons li\" ).hover(\n\tfunction() {\n\t\t$( this ).addClass( \"ui-state-hover\" );\n\t},\n\tfunction() {\n\t\t$( this ).removeClass( \"ui-state-hover\" );\n\t}\n);\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/jquery-ui.css",
    "content": "/*! jQuery UI - v1.12.1 - 2017-05-02\n* http://jqueryui.com\n* Includes: sortable.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #c5c5c5;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd;\n\tbackground: #ffffff;\n\tcolor: #333333;\n}\n.ui-widget-content a {\n\tcolor: #333333;\n}\n.ui-widget-header {\n\tborder: 1px solid #dddddd;\n\tbackground: #e9e9e9;\n\tcolor: #333333;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #333333;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #c5c5c5;\n\tbackground: #f6f6f6;\n\tfont-weight: normal;\n\tcolor: #454545;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #454545;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #cccccc;\n\tbackground: #ededed;\n\tfont-weight: normal;\n\tcolor: #2b2b2b;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #2b2b2b;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #003eff;\n\tbackground: #007fff;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #003eff;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n\tcolor: #777620;\n}\n.ui-state-checked {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #777620;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #f1a899;\n\tbackground: #fddfdf;\n\tcolor: #5f3f3f;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #5f3f3f;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #5f3f3f;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_555555_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffffff_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_777620_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_cc0000_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_777777_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 3px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 0px 0px 5px #666666;\n\tbox-shadow: 0px 0px 5px #666666;\n}\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/jquery-ui.js",
    "content": "/*! jQuery UI - v1.12.1 - 2017-05-02\n* http://jqueryui.com\n* Includes: widget.js, data.js, scroll-parent.js, widgets/sortable.js, widgets/mouse.js\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.ui = $.ui || {};\n\nvar version = $.ui.version = \"1.12.1\";\n\n\n/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\n\n\nvar widgetUuid = 0;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// Http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( $.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._on( options.element, {\n\t\t\t\"remove\": \"_untrackClassesElement\"\n\t\t} );\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName ).off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nvar widget = $.widget;\n\n\n/*!\n * jQuery UI :data 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: http://api.jqueryui.com/data-selector/\n\n\nvar data = $.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo( function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t} ) :\n\n\t\t// Support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t}\n} );\n\n/*!\n * jQuery UI Scroll Parent 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\n\n\n\nvar scrollParent = $.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n\n\n\n// This file is deprecated\nvar ie = $.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n/*!\n * jQuery UI Mouse 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: http://api.jqueryui.com/mouse/\n\n\n\nvar mouseHandled = false;\n$( document ).on( \"mouseup\", function() {\n\tmouseHandled = false;\n} );\n\nvar widgetsMouse = $.widget( \"ui.mouse\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tcancel: \"input, textarea, button, select, option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.on( \"mousedown.\" + this.widgetName, function( event ) {\n\t\t\t\treturn that._mouseDown( event );\n\t\t\t} )\n\t\t\t.on( \"click.\" + this.widgetName, function( event ) {\n\t\t\t\tif ( true === $.data( event.target, that.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t\t\t$.removeData( event.target, that.widgetName + \".preventClickEvent\" );\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.off( \".\" + this.widgetName );\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\t\t}\n\t},\n\n\t_mouseDown: function( event ) {\n\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// We may have missed mouseup (out of window)\n\t\t( this._mouseStarted && this._mouseUp( event ) );\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = ( event.which === 1 ),\n\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = ( typeof this.options.cancel === \"string\" && event.target.nodeName ?\n\t\t\t\t$( event.target ).closest( this.options.cancel ).length : false );\n\t\tif ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif ( !this.mouseDelayMet ) {\n\t\t\tthis._mouseDelayTimer = setTimeout( function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay );\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted = ( this._mouseStart( event ) !== false );\n\t\t\tif ( !this._mouseStarted ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif ( true === $.data( event.target, this.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t$.removeData( event.target, this.widgetName + \".preventClickEvent\" );\n\t\t}\n\n\t\t// These delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function( event ) {\n\t\t\treturn that._mouseMove( event );\n\t\t};\n\t\tthis._mouseUpDelegate = function( event ) {\n\t\t\treturn that._mouseUp( event );\n\t\t};\n\n\t\tthis.document\n\t\t\t.on( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.on( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function( event ) {\n\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&\n\t\t\t\t\t!event.button ) {\n\t\t\t\treturn this._mouseUp( event );\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\n\t\t\t\t// Support: Safari <=8 - 9\n\t\t\t\t// Safari sets which to 0 if you press any of the following keys\n\t\t\t\t// during a drag (#14461)\n\t\t\t\tif ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||\n\t\t\t\t\t\tevent.originalEvent.metaKey || event.originalEvent.shiftKey ) {\n\t\t\t\t\tthis.ignoreMissingWhich = true;\n\t\t\t\t} else if ( !this.ignoreMissingWhich ) {\n\t\t\t\t\treturn this._mouseUp( event );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseDrag( event );\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t( this._mouseStart( this._mouseDownEvent, event ) !== false );\n\t\t\t( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis.document\n\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif ( event.target === this._mouseDownEvent.target ) {\n\t\t\t\t$.data( event.target, this.widgetName + \".preventClickEvent\", true );\n\t\t\t}\n\n\t\t\tthis._mouseStop( event );\n\t\t}\n\n\t\tif ( this._mouseDelayTimer ) {\n\t\t\tclearTimeout( this._mouseDelayTimer );\n\t\t\tdelete this._mouseDelayTimer;\n\t\t}\n\n\t\tthis.ignoreMissingWhich = false;\n\t\tmouseHandled = false;\n\t\tevent.preventDefault();\n\t},\n\n\t_mouseDistanceMet: function( event ) {\n\t\treturn ( Math.max(\n\t\t\t\tMath.abs( this._mouseDownEvent.pageX - event.pageX ),\n\t\t\t\tMath.abs( this._mouseDownEvent.pageY - event.pageY )\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function( /* event */ ) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function( /* event */ ) {},\n\t_mouseDrag: function( /* event */ ) {},\n\t_mouseStop: function( /* event */ ) {},\n\t_mouseCapture: function( /* event */ ) { return true; }\n} );\n\n\n/*!\n * jQuery UI Sortable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: http://api.jqueryui.com/sortable/\n//>>demos: http://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\n\n\n\nvar widgetsSortable = $.widget( \"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn ( /left|right/ ).test( item.css( \"float\" ) ) ||\n\t\t\t( /inline|table-cell/ ).test( item.css( \"display\" ) );\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis._addClass( \"ui-sortable\" );\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tvar that = this;\n\t\tthis._removeClass( this.element.find( \".ui-sortable-handle\" ), \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\tthat._addClass(\n\t\t\t\tthis.instance.options.handle ?\n\t\t\t\t\tthis.item.find( this.instance.options.handle ) :\n\t\t\t\t\tthis.item,\n\t\t\t\t\"ui-sortable-handle\"\n\t\t\t);\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[ i ].item.removeData( this.widgetName + \"-item\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function( event, overrideHandle ) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif ( this.reverting ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.options.disabled || this.options.type === \"static\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems( event );\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$( event.target ).parents().each( function() {\n\t\t\tif ( $.data( this, that.widgetName + \"-item\" ) === that ) {\n\t\t\t\tcurrentItem = $( this );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\tif ( $.data( event.target, that.widgetName + \"-item\" ) === that ) {\n\t\t\tcurrentItem = $( event.target );\n\t\t}\n\n\t\tif ( !currentItem ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this.options.handle && !overrideHandle ) {\n\t\t\t$( this.options.handle, currentItem ).find( \"*\" ).addBack().each( function() {\n\t\t\t\tif ( this === event.target ) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !validHandle ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function( event, overrideHandle, noActivation ) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to\n\t\t// mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend( this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\n\t\t\t// This is a relative to absolute position minus the actual position calculation -\n\t\t\t// only used for relative positioned helper\n\t\t\trelative: this._getRelativeOffset()\n\t\t} );\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css( \"position\", \"absolute\" );\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition( event );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = {\n\t\t\tprev: this.currentItem.prev()[ 0 ],\n\t\t\tparent: this.currentItem.parent()[ 0 ]\n\t\t};\n\n\t\t// If the helper is not the original, hide the original so it's not playing any role during\n\t\t// the drag, won't cause anything bad this way\n\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif ( o.containment ) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif ( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// Support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet =\n\t\t\t\t$( \"<style>*{ cursor: \" + o.cursor + \" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n\n\n}));"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/jquery-ui.structure.css",
    "content": "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n */\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/jquery-ui.theme.css",
    "content": "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n *\n * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif\n */\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #c5c5c5;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd;\n\tbackground: #ffffff;\n\tcolor: #333333;\n}\n.ui-widget-content a {\n\tcolor: #333333;\n}\n.ui-widget-header {\n\tborder: 1px solid #dddddd;\n\tbackground: #e9e9e9;\n\tcolor: #333333;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #333333;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #c5c5c5;\n\tbackground: #f6f6f6;\n\tfont-weight: normal;\n\tcolor: #454545;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #454545;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #cccccc;\n\tbackground: #ededed;\n\tfont-weight: normal;\n\tcolor: #2b2b2b;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #2b2b2b;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #003eff;\n\tbackground: #007fff;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #003eff;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n\tcolor: #777620;\n}\n.ui-state-checked {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #777620;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #f1a899;\n\tbackground: #fddfdf;\n\tcolor: #5f3f3f;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #5f3f3f;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #5f3f3f;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_555555_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffffff_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_777620_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_cc0000_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_777777_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 3px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 0px 0px 5px #666666;\n\tbox-shadow: 0px 0px 5px #666666;\n}\n"
  },
  {
    "path": "assets/jquery/jquery-ui-1.12.1.custom/package.json",
    "content": "{\n\t\"name\": \"jquery-ui\",\n\t\"title\": \"jQuery UI\",\n\t\"description\": \"A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.\",\n\t\"version\": \"1.12.1\",\n\t\"homepage\": \"http://jqueryui.com\",\n\t\"author\": {\n\t\t\"name\": \"jQuery Foundation and other contributors\",\n\t\t\"url\": \"https://github.com/jquery/jquery-ui/blob/1.12.1/AUTHORS.txt\"\n\t},\n\t\"main\": \"ui/widget.js\",\n\t\"maintainers\": [\n\t\t{\n\t\t\t\"name\": \"Scott González\",\n\t\t\t\"email\": \"scott.gonzalez@gmail.com\",\n\t\t\t\"url\": \"http://scottgonzalez.com\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Jörn Zaefferer\",\n\t\t\t\"email\": \"joern.zaefferer@gmail.com\",\n\t\t\t\"url\": \"http://bassistance.de\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Mike Sherov\",\n\t\t\t\"email\": \"mike.sherov@gmail.com\",\n\t\t\t\"url\": \"http://mike.sherov.com\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"TJ VanToll\",\n\t\t\t\"email\": \"tj.vantoll@gmail.com\",\n\t\t\t\"url\": \"http://tjvantoll.com\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Felix Nagel\",\n\t\t\t\"email\": \"info@felixnagel.com\",\n\t\t\t\"url\": \"http://www.felixnagel.com\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Alex Schmitz\",\n\t\t\t\"email\": \"arschmitz@gmail.com\",\n\t\t\t\"url\": \"https://github.com/arschmitz\"\n\t\t}\n\t],\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git://github.com/jquery/jquery-ui.git\"\n\t},\n\t\"bugs\": \"https://bugs.jqueryui.com/\",\n\t\"license\": \"MIT\",\n\t\"scripts\": {\n\t\t\"test\": \"grunt\"\n\t},\n\t\"dependencies\": {},\n\t\"devDependencies\": {\n\t\t\"commitplease\": \"2.3.0\",\n\t\t\"grunt\": \"0.4.5\",\n\t\t\"grunt-bowercopy\": \"1.2.4\",\n\t\t\"grunt-cli\": \"0.1.13\",\n\t\t\"grunt-compare-size\": \"0.4.0\",\n\t\t\"grunt-contrib-concat\": \"0.5.1\",\n\t\t\"grunt-contrib-csslint\": \"0.5.0\",\n\t\t\"grunt-contrib-jshint\": \"0.12.0\",\n\t\t\"grunt-contrib-qunit\": \"1.0.1\",\n\t\t\"grunt-contrib-requirejs\": \"0.4.4\",\n\t\t\"grunt-contrib-uglify\": \"0.11.1\",\n\t\t\"grunt-git-authors\": \"3.1.0\",\n\t\t\"grunt-html\": \"6.0.0\",\n\t\t\"grunt-jscs\": \"2.1.0\",\n\t\t\"load-grunt-tasks\": \"3.4.0\",\n\t\t\"rimraf\": \"2.5.1\",\n\t\t\"testswarm\": \"1.1.0\"\n\t},\n\t\"keywords\": []\n}\n"
  },
  {
    "path": "assets/plugins/jquery.eqheight.js",
    "content": "// Generated by CoffeeScript 1.7.1\n\n/*\neqHeight.coffee v1.3.5\nhttp://jsliang.github.com/eqHeight.coffee\n\nCopyright (c) 2013-2014, Jui-Shan Liang <jenny@jsliang.com>\nAll rights reserved.\nLicensed under GPL v2.\n */\nvar $;\n\n$ = jQuery;\n\n$.fn.extend({\n  eqHeight: function(column_selector, option) {\n    if (option == null) {\n      option = {\n        equalize_interval: null,\n        break_point: null\n      };\n    }\n    return this.each(function() {\n      var columns, equalizer, infinite_equalizing, start_equalizing, timer, _equalize_marked_columns;\n      timer = null;\n      columns = $(this).find(column_selector);\n      if (columns.length === 0) {\n        columns = $(this).children();\n      }\n      if (columns.length === 0) {\n        return;\n      }\n      _equalize_marked_columns = function() {\n        var marked_columns, max_col_height;\n        marked_columns = $(\".eqHeight_row\");\n        max_col_height = 0;\n        marked_columns.each(function() {\n          return max_col_height = Math.max($(this).outerHeight(), max_col_height);\n        });\n        marked_columns.height(max_col_height);\n        return $(\".eqHeight_row\").removeClass(\"eqHeight_row\");\n      };\n      equalizer = function() {\n        var row_top_value;\n        columns.height(\"auto\");\n        if (typeof option.break_point === \"number\" && $(window).width() <= option.break_point) {\n          return;\n        }\n        row_top_value = columns.first().position().top;\n        columns.each(function() {\n          var current_top;\n          current_top = $(this).position().top;\n          if (current_top !== row_top_value) {\n            _equalize_marked_columns();\n            row_top_value = $(this).position().top;\n          }\n          return $(this).addClass(\"eqHeight_row\");\n        });\n        return _equalize_marked_columns();\n      };\n      start_equalizing = function() {\n        clearTimeout(timer);\n        return timer = setTimeout(equalizer, 100);\n      };\n      infinite_equalizing = function() {\n        equalizer();\n        return timer = setTimeout(infinite_equalizing, option.equalize_interval);\n      };\n      $(window).load(equalizer);\n      if (typeof option.equalize_interval === \"number\") {\n        return infinite_equalizing();\n      } else {\n        return $(window).resize(start_equalizing);\n      }\n    });\n  }\n});\n"
  },
  {
    "path": "assets/public/css/general.css",
    "content": "html, body { height: 100%;}\nbody {font-family: \"Open Sans\",Arial,sans-serif;}\n\n#wrapper {min-height: 100%; position: relative;}\n#content {padding-bottom:250px;}\n\nheader {background: rgba(0, 0, 0, 0) linear-gradient(to bottom, #f6f6f6 0%, #ffffff 100%) repeat scroll 0 0;}\nheader .container {position:relative}\nheader .login {float:right; background-color: #eb8900; padding: 5px 15px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; color: #fff; font-size:14px;}\nheader .support-top {float: left; background-color: #eb8900; padding: 5px 15px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; font-size:14px; color: #fff;}\nheader .support-top a {color: #fff;}\n\n#site-top {margin-top:40px; margin-bottom: 15px;}\n#site-top h1 {font-family: 'Shadows Into Light', cursive; font-size:30px; color:#eb8900; margin: 0;}\n\n.shadows-font {font-family: 'Shadows Into Light', cursive;}\n.forgotten-page {padding-top:50px;}\ndiv#navbar {margin-right:-30px;}\nnav.navbar {margin-bottom: 0;}\nnav.navbar ul.nav li a {font-size:12px; text-transform: uppercase; font-weight: 700; line-height: 20px; color:#eb8900; border-radius: 5px;  margin-bottom: 2px; margin-top: 2px; margin-left: 2px; padding-bottom: 8px; padding-top: 8px;}\nnav.navbar ul.nav li.active a, nav.navbar ul.nav li a:hover, nav.navbar ul.nav li a:active, nav.navbar ul.nav li a:focus, .nav .open a, .nav .open a:focus, .nav .open  a:hover { background-color: #eb8900; color: #fff;}\nnav.navbar ul.nav li.active a, nav.navbar ul.nav li a:hover, nav.navbar ul.nav li a:active, nav.navbar ul.nav li a:focus, .nav .open a, .nav .open a:focus, .nav .open a:hover, .orange-gradient { background: rgb(242,156,35);background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2YyOWMyMyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlYjg5MDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); background: -moz-linear-gradient(top, rgba(242,156,35,1) 0%, rgba(235,137,0,1) 100%);  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(242,156,35,1)), color-stop(100%,rgba(235,137,0,1))); background: -webkit-linear-gradient(top, rgba(242,156,35,1) 0%,rgba(235,137,0,1) 100%);background: -o-linear-gradient(top, rgba(242,156,35,1) 0%,rgba(235,137,0,1) 100%);  background: -ms-linear-gradient(top, rgba(242,156,35,1) 0%,rgba(235,137,0,1) 100%);  background: linear-gradient(to bottom, rgba(242,156,35,1) 0%,rgba(235,137,0,1) 100%);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f29c23', endColorstr='#eb8900',GradientType=0 );}\nnav.navbar ul.nav li.dropdown a:hover, nav.navbar ul.nav li.dropdown a:active, nav.navbar ul.nav li.dropdown a:focus {border-bottom-left-radius: 0; border-bottom-right-radius: 0;}\nnav.navbar ul.nav li.dropdown.open a.dropdown-toggle {color:#fff !important}\nnav.navbar ul.nav ul.dropdown-menu { background-color: #eba800; background-image: linear-gradient(to bottom, #eb8900, #ebd700); background-repeat: repeat-x; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); margin-top:-5px; margin-left: 2px; border:0; box-shadow:none;}\nnav.navbar ul.nav ul.dropdown-menu li a {color: #fff;}\nnav.navbar a.navbar-brand {margin-top:-40px;}\nnav.navbar ul.dropdown-menu li a {border-radius: 0; margin-left:0;}\n\n.membership-pricing-table { margin: 0 auto; margin-top: 30px;  width: 920px;}\n.membership-pricing-table table .icon-no,.membership-pricing-table table .icon-yes {    font-size: 22px;}\n.membership-pricing-table table .icon-no {    color: #a93717;}\n.membership-pricing-table table .icon-yes {    color: #209e61;}\n.membership-pricing-table table .plan-header {    text-align: center;    font-size: 48px;    border: 1px solid #e2e2e2;    padding: 25px 0;}\n.membership-pricing-table table .plan-header-free {    background-color: #eee;    color: #555;}\n.membership-pricing-table table .plan-header-blue {    color: #fff;    background-color: #61a1d1;    border-color: #3989c6;}\n.membership-pricing-table table .plan-header-standard {    color: #fff;    background-color: #ff9317;    border-color: #e37900;}\n.membership-pricing-table table td {    text-align: center;    width: 15%;    padding: 7px 10px;    background-color: #fafafa;    font-size: 14px;    -webkit-box-shadow: 0 1px 0 #fff inset;    box-shadow: 0 1px 0 #fff inset;}\n.membership-pricing-table table,.membership-pricing-table table td {    border: 1px solid #ebebeb;}\n.membership-pricing-table table tr td:first-child {    background-color: transparent;    text-align: right;    width: 24%;}\n.membership-pricing-table table tr td:nth-child(5) {    background-color: #FFF;}\n.membership-pricing-table table tr:first-child td,.membership-pricing-table table tr:nth-child(2) td {    -webkit-box-shadow: none;    box-shadow: none;}\n.membership-pricing-table table tr:first-child th:first-child {    border-top-color: transparent;    border-left-color: transparent;    border-right-color: #e2e2e2;}\n.membership-pricing-table table tr:first-child th .pricing-plan-name {    font-size: 22px;}\n.membership-pricing-table table tr:first-child th .pricing-plan-price {    line-height: 35px;}\n.membership-pricing-table table tr:first-child th .pricing-plan-price sup {    font-size: 45%;}\n.membership-pricing-table table tr:first-child th .pricing-plan-price span {    font-size: 30%;}\n.membership-pricing-table table tr:first-child th .pricing-plan-period {    margin-top: -7px;    font-size: 25%;}\n.membership-pricing-table table .header-plan-inner {    position: relative;}\n.membership-pricing-table table .recommended-plan-ribbon {    box-sizing: content-box;    background-color: #dc3b5d;    color: #FFF;    position: absolute;    padding: 3px 6px;    font-size: 11px!important;    font-weight: 500;    left: -6px;    top: -22px;    z-index: 99;    width: 100%;    -webkit-box-shadow: 0 -1px #c2284c inset;    box-shadow: 0 -1px #c2284c inset;    text-shadow: 0 -1px #c2284c}\n.membership-pricing-table table .recommended-plan-ribbon:before {    border: solid;    border-color: #c2284c transparent;    border-width: 6px 0 0 6px;    bottom: -5px;    content: \"\";    left: 0;    position: absolute;    z-index: 90;}\n.membership-pricing-table table .recommended-plan-ribbon:after {    border: solid;    border-color: #c2284c transparent;    border-width: 6px 6px 0 0;    bottom: -5px;    content: \"\";    right: 0;    position: absolute;    z-index: 90;}\n.membership-pricing-table table .plan-head {    box-sizing: content-box;    background-color: #ff9c00;    border: 1px solid #cf7300;    position: absolute;    top: -33px;    left: -1px;    height: 30px;    width: 100%;    border-bottom: none;}\n\n.uppercase {text-transform: uppercase;}\n\n.alert-errors {background-color: #e11c16;    color: #fff;    font-weight: bold;    left: 50%;    margin-left: -140px;    padding: 40px;    position: absolute;    text-align: center;    top: 10px;    width: 280px;    z-index: 2000;}\n.alert-errors a {position: absolute; top:10px; right:10px; color:#fff;}\n\n#carousel-main .carousel {height: 500px; background-image: url('../imgs/carousel-bg.jpg'); }\n#carousel-main .carousel-inner .item {height: 500px;}\n#carousel-main .carousel-caption {bottom:auto; width: 950px; left:50%; right:0; margin: 0 auto 0 -475px;}\n#carousel-main .carousel-caption h1, #carousel-main .carousel-caption h3, #carousel-example-generic .carousel-caption span {text-transform: uppercase;}\n\n.terms-and-condit {padding: 20px 0;}\n\n#collapseLogin {background-color: #eb8900; border-bottom-left-radius: 5px; padding: 10px; color:#fff; width:253px;   margin: 0 auto;}\n#collapseLogin input {width: 100%;}\n#collapseLogin .my-addr {border:0; color:#333; padding:5px 8px; font-size:12px;}\n#collapseLogin span {font-size:12px; display: inline-block; width: 55px; }\n#collapseLogin .form-group { margin-bottom: 5px;}\n#collapseLogin .form-group:last-child { margin-bottom: 0; }\n#collapseLogin form {margin: 0;}\n#collapseLogin .logme {padding: 2px 5px; }\n#collapseLogin .register {font-size: 12px; color:#fff; display: inline-block; margin-top:10px;}\n\n#carousel-main #slide-1 .carousel-caption span {font-size:22px; border-bottom: 2px solid #fff;}\n#carousel-main #slide-1 .carousel-caption span span {border-bottom: 0;}\n#carousel-main #slide-1 .carousel-caption h1 {font-size:60px; font-weight: 800; width:350px; text-align: center; line-height:50px;}\n#carousel-main #slide-1 .carousel-caption .left-side {padding-top:100px;}\n#carousel-main #slide-1 .carousel-caption .left-side h4 {font-size:45px;} \n#carousel-main #slide-1 .carousel-caption .left-side img.hand-made-arrow {left:310px; position:absolute; top:100px;}\n#carousel-main #slide-1 .carousel-caption .left-side img.hand-made-cicle {left:87px; position:absolute; top:90px;}\n#carousel-main #slide-1 .carousel-caption img.mac {margin-top: 40px; display: none;}\n#carousel-main #slide-1 .carousel-caption a {font-size: 22px;}\n#carousel-main #slide-1 .carousel-caption a.down {color:#fff; text-decoration: underline;}\n\n#carousel-main #slide-2 .carousel-caption .left-side h3.http {font-size: 30px;margin-top: 115px;}\n#carousel-main #slide-2 .carousel-caption .left-side h3.use-it {font-size: 25px;margin-top: 190px;}\n#carousel-main #slide-2 .carousel-caption .left-side img.hand-made-cicle {position: absolute; top:170px; left:115px; width:200px;}\n#carousel-main #slide-2 .carousel-caption img.hand-made-down {left: 90px;; position: absolute; top: 40px; height:110px;}\n#carousel-main #slide-2 .carousel-caption h3.right-h3 {text-transform: none; font-size:50px; margin-top:180px;}\n#carousel-main #slide-2 .carousel-caption h4 {color:#777;}\n#carousel-main #slide-2 .carousel-caption p {margin-top: 40px;}\n#carousel-main #slide-2 .carousel-caption span {background-color:#eb8900; color:#fff;}\n\n#after-carousel {background-color: #292929; padding-top:20px; padding-bottom:20px; color:#fff;}\n#after-carousel p { font-size:22px; font-weight: 300; margin: 0;}\n#after-carousel p em {color:#eb8900; font-size:32px;}\n#after-carousel span {color:#999;}\n#after-carousel .right-side {padding-top:15px;}\n\n.modal-content {border-radius: 0; }\n.form-registration .form-control {border:1px solid #e9e9e9; border-radius: 0; box-shadow: none; height: 40px;}\n.form-registration label {font-size:12px;}\n.form-registration sup {color:red; font-size:14px;}\n\n#carousel-blog #quote-carousel a {color:#777;}\n#carousel-blog #quote-carousel { padding: 0 10px 30px 10px;    margin-top: 30px;}\n#carousel-blog #quote-carousel .carousel-control{    background: none;    color: #222;    font-size: 2.3em;    text-shadow: none;    margin-top: 30px;}\n#carousel-blog #quote-carousel .carousel-control.left {    left: -12px;}\n#carousel-blog #quote-carousel .carousel-control.right {   right: -12px !important;}\n#carousel-blog #quote-carousel .carousel-indicators {    right: 50%;    top: auto;    bottom: 0px;    margin-right: -19px;}\n#carousel-blog #quote-carousel .carousel-indicators li {    background: #c0c0c0;}\n#carousel-blog #quote-carousel .carousel-indicators .active {  background: #333333;}\n#carousel-blog #quote-carousel img{width: 250px;  height: 100px}\n#carousel-blog #quote-carousel .item blockquote { border-left: none;    margin: 0;}\n#carousel-blog #quote-carousel .item blockquote img {  margin-bottom: 10px;}\n\n#carousel-blog .date-body {background-color: #0072bc;padding-bottom: 5px; font-size:12px; width:120px; float:right;}\n#carousel-blog .date-body .date-title{ color: #fff;}\n#carousel-blog .date-body .date-content{ background-color: white;margin-left: 5px;margin-right: 5px;}\n#carousel-blog .date-body .date-content p.dia{ margin: 0; font-size: 45px; font-weight: bold;}\n#carousel-blog .nomargin { margin: 0;}\n\n.btn-orange {background-color: #eba800; background-image: linear-gradient(to bottom, #eb8900, #ebd700); background-repeat: repeat-x; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);}\n\n.intro h2 span {color:#fff; padding-left:8px; padding-right:8px;}\n.intro p {color:#777; line-height: 30px; font-size:20px; text-align:center;}\n\n#subpage {background-color: #292929; padding-top:20px; padding-bottom:20px; color:#fff; font-size:20px;} /*dont change font size, picture PM is with the same*/\n\n#features {color:#777;}\n#features .top-text {margin-bottom: 20px; margin-top: 20px; font-size:26px;}\n#features .row {margin-bottom: 20px;}\n#features .part {padding-top:10px; padding-bottom: 10px;}\n#features .description h3 {margin: 0; font-size:36px;}\n#features .description p {margin: 0; margin-top:20px;}\n\n#become-member img {margin: 0 auto;}\n\n.deliver {width:100px; border-bottom: 2px solid #777; margin: 0 auto; margin-top: 15px; margin-bottom: 15px;}\n\n#blog {margin-bottom: 40px;}\n#blog .article {color:#777; border-bottom: 1px solid #ddd; padding-bottom: 10px;}\n#blog .article h2 a, #postPreview h1 {color:#eb8900;}\n#blog .article span.posted-on, #postPreview span.posted-on {font-size:18px;}\n#blog .right-side {padding-top:20px;}\n#blog #custom-search-input {margin:0; padding: 0; }\n#blog #custom-search-input .search-query { padding-right: 3px; padding-right: 4px \\9;  padding-left: 3px; padding-left: 4px \\9;  margin-bottom: 0;   -webkit-border-radius: 3px; -moz-border-radius: 3px;   border-radius: 3px; }\n#blog #custom-search-input button { border: 0; background: none;  padding: 2px 5px;  margin-top: 2px; position: relative; left: -28px;  margin-bottom: 0; -webkit-border-radius: 3px; -moz-border-radius: 3px;border-radius: 3px;  color:#eb8900;}\n#blog #tags a {margin-bottom: 5px; display:inline-block;}\n#blog nav {text-align: right;}\n\n#registration h1 {text-align: center; margin-bottom: 20px;}\n\n#support {padding-top: 30px;}\n#support .contact-form form {margin-bottom:30px;}\n#support .contact-form .form-group {position: relative;}\n#support .contact-form input, #support .contact-form textarea {padding: 16px 16px 16px 54px; height: auto;} \n#support .contact-form i {position: absolute; top:13px; left:18px; color:#dedbdb;}\n#support .contact-form h2 {font-size:20px; border-bottom: 1px solid #dedbdb; padding-bottom: 15px; margin-bottom: 20px; margin-top:0;}\n#support .contact-form button {font-size: 22px; text-transform: uppercase; background: rgb(51,122,183); background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMzN2FiNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxMTZhYjIiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);background: -moz-linear-gradient(top, rgba(51,122,183,1) 0%, rgba(17,106,178,1) 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(51,122,183,1)), color-stop(100%,rgba(17,106,178,1))); background: -webkit-linear-gradient(top, rgba(51,122,183,1) 0%,rgba(17,106,178,1) 100%);background: -o-linear-gradient(top, rgba(51,122,183,1) 0%,rgba(17,106,178,1) 100%); background: -ms-linear-gradient(top, rgba(51,122,183,1) 0%,rgba(17,106,178,1) 100%); background: linear-gradient(to bottom, rgba(51,122,183,1) 0%,rgba(17,106,178,1) 100%);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#337ab7', endColorstr='#116ab2',GradientType=0 );}\n#support a.mailto {font-size:30px;} \n\n.feature-badges {padding: 10px 0; background-color: #f3f2f2; }\n.icons-features {width: 600px; margin: 0 auto; padding: 0; list-style: none; text-align:center;}\n.icons-features li {float:left;}\n.icons-features li a {width:100px; display: block; font-size:12px; color:#333; }\n.icons-features li a:hover {text-decoration: none;}\n.icons-features li a span { display: block;}\n.icon-feature span {display: block; font-size: 12px; }\n\n#terms, #support {padding-bottom: 40px;}\n\n#faqAccordion .panel-heading {background-color: #fff; border-radius: 0;}\n#faqAccordion .panel-title {cursor: pointer;}\n#faqAccordion .panel-title a:hover {text-decoration: none;}\n\n.footer { bottom: 0;  left: 0;  padding-bottom: 0;  position: absolute; width: 100%;}\n.footer .extra {  border-bottom: 1px solid #000;border-top: 1px solid #585858;}\n.footer .extra-inner { background: #1a1a1a none repeat scroll 0 0; color: #bbb; font-size: 11px;padding: 20px 0;}\n.footer .extra-inner h4 {font-size:16px; margin-bottom: 10px;}\n.footer .extra-inner ul {margin: 0; padding: 0;}\n.footer .extra-inner ul li { list-style: outside none none;  margin-bottom: 0.6em;}\n.footer .extra-inner ul li a {color:#666;}\n.footer .footer-bottom {border-top: 1px solid #292929; margin-top: 0;}\n.footer .footer-bottom .bottom-inner { background: #111 none repeat scroll 0 0; color: #999;font-size: 12px; padding: 15px 0;}\n.footer .payments li img {height: 40px;}\n\n.pagination li a, .pagination li span, .pagination li a:hover, .pagination li span:hover {color:#eb8900;}\n.pagination .active a, .pagination .active a:focus, .pagination .active a:hover, .pagination .active span, .pagination .active span:focus, .pagination .active span:hover {background-color: #eb8900; color:#fff; border:1px solid #ddd;}\n\n.inv-accept {padding-top: 20px;}\n.inv-accept .logo { display: inline-block; margin-bottom: 20px;}\n.inv-accept h1 {margin: 0; margin-bottom: 20px; font-size:28px;}\n.inv-accept hr {margin: 0; margin-bottom: 20px;}\n.inv-accept .view-container {height: 461px; overflow:scroll; background: #ccc; border:4px solid #bdbdbd; margin-bottom: 20px;}\n.inv-accept .action {width:100%; margin-bottom: 20px;}\n.inv-accept .action span {font-size:22px; text-transform: uppercase; display: inline-block; }\n.inv-accept .footer-text {text-align: right;}\n.inv-accept .refuse-reason {margin-bottom: 20px; width: 100%; font-size: 14px; padding: 10px;}\n.inv-accept .status-label {width:100%; margin-bottom: 20px; height: 40px; text-align: center; font-size: 16px; line-height: 40px;}\n\n@media (min-width: 992px) and (max-width: 1199px) { \n    footer {height: 390px;} \n    nav.navbar a.navbar-brand {position: absolute; margin-top:-40px;}\n    .intro p {font-size:18px;  line-height: 25px;}\n    h2 {font-size:28px;}\n    #site-top h1 {font-size:28px;}\n}\n@media (min-width: 768px) and (max-width: 991px)  {\n    nav.navbar ul.nav li a { padding: 5px;}\n    footer {height: 400px;} \n    footer .fast-links { margin-bottom: 80px;}\n    #carousel-main #slide-1 .carousel-caption h1 {font-size:40px; line-height: 40px;}\n    #carousel-main #slide-1 .carousel-caption .left-side h4 {font-size: 30px;}\n}\n\n@media (max-width: 991px) {\n    nav.navbar a.navbar-brand {position: absolute; margin-top:-30px; }\n    nav.navbar a.navbar-brand img {width:200px;}\n    #carousel-main #slide-1 .carousel-caption img.mac {width:250px; margin-top:100px;}\n    #carousel-main .carousel-caption {width:600px; margin-left: -300px;}\n    #carousel-main #slide-1 .carousel-caption h3 {font-size:30px;}\n    #carousel-main #slide-1 .carousel-caption a {font-size:16px;}\n    #carousel-main #slide-1 .carousel-caption .left-side img.hand-made-arrow {width:90px; left:265px; margin-top:20px;}\n    #carousel-main .carousel-inner .item {height: 400px;}\n    #carousel-main .carousel {height: 400px;}\n    #after-carousel p {font-size:18px;}\n    #after-carousel span {font-size:12px;}\n    #carousel-main #slide-2 .carousel-caption .left-side h3.http, #carousel-main #slide-2 .carousel-caption .left-side h3.use-it {font-size: 18px;}\n    #carousel-main #slide-2 .carousel-caption .left-side img.hand-made-cicle {width: 140px; margin-left: -20px;}\n    #carousel-main #slide-2 .carousel-caption p {font-size:12px;}\n    #carousel-main #slide-2 .carousel-caption h3.right-h3 {font-size:25px; margin-top: 130px;}\n    .intro p {font-size:16px;  line-height: 22px;}\n    h2 {font-size:25px;}\n    #site-top h1 {font-size:24px;}\n\n}\n/* Landscape phones and portrait tablets */\n@media screen and (max-width: 767px) {\n    #site-top h1 {font-size:22px; margin-bottom:10px;}\n    #carousel-main #slide-1 .carousel-caption {margin-left: -180px;}\n    #carousel-main .carousel-caption {width:300px; margin-left: -150px;}\n    nav.navbar .navbar-toggle {font-size:30px; margin-top:-10px; padding: 0 20px;}\n    nav.navbar div#navbar {float:none !important; background-color: #f1f1f1;border-top:1px solid #333; padding:0; margin:0; margin-top: 15px; margin-bottom: 15px;}\n    nav.navbar ul.navbar-nav {margin: 0;}\n    #carousel-blog .date-body {float:none !important;}\n    #features .row { border-bottom: 1px solid #777; padding-bottom:20px;}\n    #features .top-text {font-size:18px;}\n    footer {height: 750px;}\n    #content {padding-bottom:400px;}\n    #register .intro {margin-bottom: 0;}\n    footer .contact-us {float:none;}\n    footer .the-social {float:none;}\n    footer .fast-links { margin-bottom: 10px;}\n    footer .apps { margin-top: 25px;}\n    .intro p {font-size:15px;  line-height: 22px;}\n    #carousel-main #slide-1 .carousel-caption h1 {font-size:40px; line-height: 40px;}\n    #carousel-main #slide-1 .carousel-caption .left-side h4 {font-size: 30px;}\n    h2 {font-size:22px;}\n    .icons-features {width: auto;}\n    #support .contact-form input, #support .contact-form textarea {padding: 12px 12px 12px 54px; height: auto;} \n    #registration h1 {font-size:20px;}\n    header .support-top {float: right; }\n    .inv-accept h1 {font-size:18px;} \n\n    /* Dont zoom fileds! */\n    input[type=\"color\"],\n    input[type=\"date\"],\n    input[type=\"datetime\"],\n    input[type=\"datetime-local\"],\n    input[type=\"email\"],\n    input[type=\"month\"],\n    input[type=\"number\"],\n    input[type=\"password\"],\n    input[type=\"search\"],\n    input[type=\"tel\"],\n    input[type=\"text\"],\n    input[type=\"time\"],\n    input[type=\"url\"],\n    input[type=\"week\"],\n    select:focus,\n    textarea {\n        font-size: 16px !important;\n    }\n    /* Dont zoom fileds! */\n}\n/* Portrait phones and smaller */\n@media (max-width: 360px) {\n    #site-top span {font-size:20px;}\n    #carousel-main #slide-1 .carousel-caption h3 {font-size:25px;}\n    #carousel-main #slide-2 .carousel-caption p {font-size:10px;}\n    #carousel-main #slide-2 .carousel-caption .left-side img.hand-made-cicle {margin-left: -40px;}\n    #organize-work .organize span {font-size:14px;}\n    #organize-work .organize {padding: 5px;}\n    nav.navbar a.navbar-brand img {width:200px;}\n    header .support-top, header .login {font-size: 12px;}\n    .alert-errors {width: 100%; left: auto; margin-left: auto; top:0;}\n}"
  },
  {
    "path": "assets/public/css/stabilizator_bg.css",
    "content": "@media (min-width: 992px) and (max-width: 1199px) { \r\n\r\n}\r\n@media (min-width: 768px) and (max-width: 991px)  {\r\n\r\n}\r\n\r\n@media (max-width: 991px) {\r\n\r\n} \r\n@media screen and (max-width: 767px) {\r\n}"
  },
  {
    "path": "assets/public/css/stabilizator_en.css",
    "content": "@media (min-width: 992px) and (max-width: 1199px) { \r\n\r\n}\r\n@media (min-width: 768px) and (max-width: 991px)  {\r\n\r\n}\r\n\r\n@media (max-width: 991px) {\r\n\r\n} \r\n@media screen and (max-width: 767px) {\r\n}"
  },
  {
    "path": "assets/public/css/stabilizator_fr.css",
    "content": "@media (min-width: 992px) and (max-width: 1199px) { \n\n}\n@media (min-width: 768px) and (max-width: 991px)  {\n\n}\n\n@media (max-width: 991px) {\n\n} \n@media screen and (max-width: 767px) {\n}"
  },
  {
    "path": "assets/public/js/general.js",
    "content": "$(document).ready(function () {\n    $('.carousel-caption img').fadeIn(3000);\n    $('.carousel').carousel({\n        pause: 'hover',\n        interval: 5000,\n    });\n    $('.close-alert').click(function () {\n        $('.alert-errors').hide();\n    });\n});\nfunction registerValidate() {\n    $('.form-registration sup').text('');\n    var valid = true;\n    var email = $('#user_email').val();\n    var password = $('#user_password').val();\n    var regex = /^([a-zA-Z0-9_.+-])+\\@(([a-zA-Z0-9-])+\\.)+([a-zA-Z0-9]{2,15})+$/;\n    var result_email = regex.test(email);\n    password = $.trim(password);\n    var pass_lenght = password.length;\n    if (result_email == false) {\n        $('.err-email').text(lang.invalid_email);\n        valid = false;\n    }\n    if (pass_lenght == 0) {\n        $('.err-password').text(lang.invalid_pass);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById(\"registerMe\").submit();\n    }\n}\nfunction invReceiveAction(action) {\n    $('[name=\"action\"]').val(action);\n    document.getElementById('invReceiveAction').submit();\n}"
  },
  {
    "path": "assets/tagsinput/bootstrap-tagsinput.css",
    "content": ".bootstrap-tagsinput {\n  background-color: #fff;\n  border: 1px solid #ccc;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  display: inline-block;\n  padding: 4px 6px;\n  color: #555;\n  vertical-align: middle;\n  border-radius: 4px;\n  max-width: 100%;\n  line-height: 22px;\n  cursor: text;\n}\n.bootstrap-tagsinput input {\n  border: none;\n  box-shadow: none;\n  outline: none;\n  background-color: transparent;\n  padding: 0 6px;\n  margin: 0;\n  width: auto;\n  max-width: inherit;\n}\n.bootstrap-tagsinput.form-control input::-moz-placeholder {\n  color: #777;\n  opacity: 1;\n}\n.bootstrap-tagsinput.form-control input:-ms-input-placeholder {\n  color: #777;\n}\n.bootstrap-tagsinput.form-control input::-webkit-input-placeholder {\n  color: #777;\n}\n.bootstrap-tagsinput input:focus {\n  border: none;\n  box-shadow: none;\n}\n.bootstrap-tagsinput .tag {\n  margin-right: 2px;\n  color: white;\n}\n.bootstrap-tagsinput .tag [data-role=\"remove\"] {\n  margin-left: 8px;\n  cursor: pointer;\n}\n.bootstrap-tagsinput .tag [data-role=\"remove\"]:after {\n  content: \"x\";\n  padding: 0px 2px;\n}\n.bootstrap-tagsinput .tag [data-role=\"remove\"]:hover {\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.bootstrap-tagsinput .tag [data-role=\"remove\"]:hover:active {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n"
  },
  {
    "path": "assets/tagsinput/bootstrap-tagsinput.js",
    "content": "(function ($) {\n  \"use strict\";\n\n  var defaultOptions = {\n    tagClass: function(item) {\n      return 'label label-info';\n    },\n    itemValue: function(item) {\n      return item ? item.toString() : item;\n    },\n    itemText: function(item) {\n      return this.itemValue(item);\n    },\n    itemTitle: function(item) {\n      return null;\n    },\n    freeInput: true,\n    addOnBlur: true,\n    maxTags: undefined,\n    maxChars: undefined,\n    confirmKeys: [13, 44],\n    delimiter: ',',\n    delimiterRegex: null,\n    cancelConfirmKeysOnEmpty: true,\n    onTagExists: function(item, $tag) {\n      $tag.hide().fadeIn();\n    },\n    trimValue: false,\n    allowDuplicates: false\n  };\n\n  /**\n   * Constructor function\n   */\n  function TagsInput(element, options) {\n    this.itemsArray = [];\n\n    this.$element = $(element);\n    this.$element.hide();\n\n    this.isSelect = (element.tagName === 'SELECT');\n    this.multiple = (this.isSelect && element.hasAttribute('multiple'));\n    this.objectItems = options && options.itemValue;\n    this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';\n    this.inputSize = Math.max(1, this.placeholderText.length);\n\n    this.$container = $('<div class=\"bootstrap-tagsinput\"></div>');\n    this.$input = $('<input type=\"text\" placeholder=\"' + this.placeholderText + '\"/>').appendTo(this.$container);\n\n    this.$element.before(this.$container);\n\n    this.build(options);\n  }\n\n  TagsInput.prototype = {\n    constructor: TagsInput,\n\n    /**\n     * Adds the given item as a new tag. Pass true to dontPushVal to prevent\n     * updating the elements val()\n     */\n    add: function(item, dontPushVal, options) {\n      var self = this;\n\n      if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)\n        return;\n\n      // Ignore falsey values, except false\n      if (item !== false && !item)\n        return;\n\n      // Trim value\n      if (typeof item === \"string\" && self.options.trimValue) {\n        item = $.trim(item);\n      }\n\n      // Throw an error when trying to add an object while the itemValue option was not set\n      if (typeof item === \"object\" && !self.objectItems)\n        throw(\"Can't add objects when itemValue option is not set\");\n\n      // Ignore strings only containg whitespace\n      if (item.toString().match(/^\\s*$/))\n        return;\n\n      // If SELECT but not multiple, remove current tag\n      if (self.isSelect && !self.multiple && self.itemsArray.length > 0)\n        self.remove(self.itemsArray[0]);\n\n      if (typeof item === \"string\" && this.$element[0].tagName === 'INPUT') {\n        var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter;\n        var items = item.split(delimiter);\n        if (items.length > 1) {\n          for (var i = 0; i < items.length; i++) {\n            this.add(items[i], true);\n          }\n\n          if (!dontPushVal)\n            self.pushVal();\n          return;\n        }\n      }\n\n      var itemValue = self.options.itemValue(item),\n          itemText = self.options.itemText(item),\n          tagClass = self.options.tagClass(item),\n          itemTitle = self.options.itemTitle(item);\n\n      // Ignore items allready added\n      var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];\n      if (existing && !self.options.allowDuplicates) {\n        // Invoke onTagExists\n        if (self.options.onTagExists) {\n          var $existingTag = $(\".tag\", self.$container).filter(function() { return $(this).data(\"item\") === existing; });\n          self.options.onTagExists(item, $existingTag);\n        }\n        return;\n      }\n\n      // if length greater than limit\n      if (self.items().toString().length + item.length + 1 > self.options.maxInputLength)\n        return;\n\n      // raise beforeItemAdd arg\n      var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false, options: options});\n      self.$element.trigger(beforeItemAddEvent);\n      if (beforeItemAddEvent.cancel)\n        return;\n\n      // register item in internal array and map\n      self.itemsArray.push(item);\n\n      // add a tag element\n\n      var $tag = $('<span class=\"tag ' + htmlEncode(tagClass) + (itemTitle !== null ? ('\" title=\"' + itemTitle) : '') + '\">' + htmlEncode(itemText) + '<span data-role=\"remove\"></span></span>');\n      $tag.data('item', item);\n      self.findInputWrapper().before($tag);\n      $tag.after(' ');\n\n      // add <option /> if item represents a value not present in one of the <select />'s options\n      if (self.isSelect && !$('option[value=\"' + encodeURIComponent(itemValue) + '\"]',self.$element)[0]) {\n        var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');\n        $option.data('item', item);\n        $option.attr('value', itemValue);\n        self.$element.append($option);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Add class when reached maxTags\n      if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)\n        self.$container.addClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemAdded', { item: item, options: options }));\n    },\n\n    /**\n     * Removes the given item. Pass true to dontPushVal to prevent updating the\n     * elements val()\n     */\n    remove: function(item, dontPushVal, options) {\n      var self = this;\n\n      if (self.objectItems) {\n        if (typeof item === \"object\")\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  self.options.itemValue(item); } );\n        else\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  item; } );\n\n        item = item[item.length-1];\n      }\n\n      if (item) {\n        var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false, options: options });\n        self.$element.trigger(beforeItemRemoveEvent);\n        if (beforeItemRemoveEvent.cancel)\n          return;\n\n        $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();\n        $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();\n        if($.inArray(item, self.itemsArray) !== -1)\n          self.itemsArray.splice($.inArray(item, self.itemsArray), 1);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Remove class when reached maxTags\n      if (self.options.maxTags > self.itemsArray.length)\n        self.$container.removeClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemRemoved',  { item: item, options: options }));\n    },\n\n    /**\n     * Removes all items\n     */\n    removeAll: function() {\n      var self = this;\n\n      $('.tag', self.$container).remove();\n      $('option', self.$element).remove();\n\n      while(self.itemsArray.length > 0)\n        self.itemsArray.pop();\n\n      self.pushVal();\n    },\n\n    /**\n     * Refreshes the tags so they match the text/value of their corresponding\n     * item.\n     */\n    refresh: function() {\n      var self = this;\n      $('.tag', self.$container).each(function() {\n        var $tag = $(this),\n            item = $tag.data('item'),\n            itemValue = self.options.itemValue(item),\n            itemText = self.options.itemText(item),\n            tagClass = self.options.tagClass(item);\n\n          // Update tag's class and inner text\n          $tag.attr('class', null);\n          $tag.addClass('tag ' + htmlEncode(tagClass));\n          $tag.contents().filter(function() {\n            return this.nodeType == 3;\n          })[0].nodeValue = htmlEncode(itemText);\n\n          if (self.isSelect) {\n            var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });\n            option.attr('value', itemValue);\n          }\n      });\n    },\n\n    /**\n     * Returns the items added as tags\n     */\n    items: function() {\n      return this.itemsArray;\n    },\n\n    /**\n     * Assembly value by retrieving the value of each item, and set it on the\n     * element.\n     */\n    pushVal: function() {\n      var self = this,\n          val = $.map(self.items(), function(item) {\n            return self.options.itemValue(item).toString();\n          });\n\n      self.$element.val(val, true).trigger('change');\n    },\n\n    /**\n     * Initializes the tags input behaviour on the element\n     */\n    build: function(options) {\n      var self = this;\n\n      self.options = $.extend({}, defaultOptions, options);\n      // When itemValue is set, freeInput should always be false\n      if (self.objectItems)\n        self.options.freeInput = false;\n\n      makeOptionItemFunction(self.options, 'itemValue');\n      makeOptionItemFunction(self.options, 'itemText');\n      makeOptionFunction(self.options, 'tagClass');\n\n      // Typeahead Bootstrap version 2.3.2\n      if (self.options.typeahead) {\n        var typeahead = self.options.typeahead || {};\n\n        makeOptionFunction(typeahead, 'source');\n\n        self.$input.typeahead($.extend({}, typeahead, {\n          source: function (query, process) {\n            function processItems(items) {\n              var texts = [];\n\n              for (var i = 0; i < items.length; i++) {\n                var text = self.options.itemText(items[i]);\n                map[text] = items[i];\n                texts.push(text);\n              }\n              process(texts);\n            }\n\n            this.map = {};\n            var map = this.map,\n                data = typeahead.source(query);\n\n            if ($.isFunction(data.success)) {\n              // support for Angular callbacks\n              data.success(processItems);\n            } else if ($.isFunction(data.then)) {\n              // support for Angular promises\n              data.then(processItems);\n            } else {\n              // support for functions and jquery promises\n              $.when(data)\n               .then(processItems);\n            }\n          },\n          updater: function (text) {\n            self.add(this.map[text]);\n            return this.map[text];\n          },\n          matcher: function (text) {\n            return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);\n          },\n          sorter: function (texts) {\n            return texts.sort();\n          },\n          highlighter: function (text) {\n            var regex = new RegExp( '(' + this.query + ')', 'gi' );\n            return text.replace( regex, \"<strong>$1</strong>\" );\n          }\n        }));\n      }\n\n      // typeahead.js\n      if (self.options.typeaheadjs) {\n          var typeaheadConfig = null;\n          var typeaheadDatasets = {};\n\n          // Determine if main configurations were passed or simply a dataset\n          var typeaheadjs = self.options.typeaheadjs;\n          if ($.isArray(typeaheadjs)) {\n            typeaheadConfig = typeaheadjs[0];\n            typeaheadDatasets = typeaheadjs[1];\n          } else {\n            typeaheadDatasets = typeaheadjs;\n          }\n\n          self.$input.typeahead(typeaheadConfig, typeaheadDatasets).on('typeahead:selected', $.proxy(function (obj, datum) {\n            if (typeaheadDatasets.valueKey)\n              self.add(datum[typeaheadDatasets.valueKey]);\n            else\n              self.add(datum);\n            self.$input.typeahead('val', '');\n          }, self));\n      }\n\n      self.$container.on('click', $.proxy(function(event) {\n        if (! self.$element.attr('disabled')) {\n          self.$input.removeAttr('disabled');\n        }\n        self.$input.focus();\n      }, self));\n\n        if (self.options.addOnBlur && self.options.freeInput) {\n          self.$input.on('focusout', $.proxy(function(event) {\n              // HACK: only process on focusout when no typeahead opened, to\n              //       avoid adding the typeahead text as tag\n              if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {\n                self.add(self.$input.val());\n                self.$input.val('');\n              }\n          }, self));\n        }\n\n\n      self.$container.on('keydown', 'input', $.proxy(function(event) {\n        var $input = $(event.target),\n            $inputWrapper = self.findInputWrapper();\n\n        if (self.$element.attr('disabled')) {\n          self.$input.attr('disabled', 'disabled');\n          return;\n        }\n\n        switch (event.which) {\n          // BACKSPACE\n          case 8:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var prev = $inputWrapper.prev();\n              if (prev.length) {\n                self.remove(prev.data('item'));\n              }\n            }\n            break;\n\n          // DELETE\n          case 46:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var next = $inputWrapper.next();\n              if (next.length) {\n                self.remove(next.data('item'));\n              }\n            }\n            break;\n\n          // LEFT ARROW\n          case 37:\n            // Try to move the input before the previous tag\n            var $prevTag = $inputWrapper.prev();\n            if ($input.val().length === 0 && $prevTag[0]) {\n              $prevTag.before($inputWrapper);\n              $input.focus();\n            }\n            break;\n          // RIGHT ARROW\n          case 39:\n            // Try to move the input after the next tag\n            var $nextTag = $inputWrapper.next();\n            if ($input.val().length === 0 && $nextTag[0]) {\n              $nextTag.after($inputWrapper);\n              $input.focus();\n            }\n            break;\n         default:\n             // ignore\n         }\n\n        // Reset internal input's size\n        var textLength = $input.val().length,\n            wordSpace = Math.ceil(textLength / 5),\n            size = textLength + wordSpace + 1;\n        $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      self.$container.on('keypress', 'input', $.proxy(function(event) {\n         var $input = $(event.target);\n\n         if (self.$element.attr('disabled')) {\n            self.$input.attr('disabled', 'disabled');\n            return;\n         }\n\n         var text = $input.val(),\n         maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;\n         if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {\n            // Only attempt to add a tag if there is data in the field\n            if (text.length !== 0) {\n               self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);\n               $input.val('');\n            }\n\n            // If the field is empty, let the event triggered fire as usual\n            if (self.options.cancelConfirmKeysOnEmpty === false) {\n               event.preventDefault();\n            }\n         }\n\n         // Reset internal input's size\n         var textLength = $input.val().length,\n            wordSpace = Math.ceil(textLength / 5),\n            size = textLength + wordSpace + 1;\n         $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      // Remove icon clicked\n      self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {\n        if (self.$element.attr('disabled')) {\n          return;\n        }\n        self.remove($(event.target).closest('.tag').data('item'));\n      }, self));\n\n      // Only add existing value as tags when using strings as tags\n      if (self.options.itemValue === defaultOptions.itemValue) {\n        if (self.$element[0].tagName === 'INPUT') {\n            self.add(self.$element.val());\n        } else {\n          $('option', self.$element).each(function() {\n            self.add($(this).attr('value'), true);\n          });\n        }\n      }\n    },\n\n    /**\n     * Removes all tagsinput behaviour and unregsiter all event handlers\n     */\n    destroy: function() {\n      var self = this;\n\n      // Unbind events\n      self.$container.off('keypress', 'input');\n      self.$container.off('click', '[role=remove]');\n\n      self.$container.remove();\n      self.$element.removeData('tagsinput');\n      self.$element.show();\n    },\n\n    /**\n     * Sets focus on the tagsinput\n     */\n    focus: function() {\n      this.$input.focus();\n    },\n\n    /**\n     * Returns the internal input element\n     */\n    input: function() {\n      return this.$input;\n    },\n\n    /**\n     * Returns the element which is wrapped around the internal input. This\n     * is normally the $container, but typeahead.js moves the $input element.\n     */\n    findInputWrapper: function() {\n      var elt = this.$input[0],\n          container = this.$container[0];\n      while(elt && elt.parentNode !== container)\n        elt = elt.parentNode;\n\n      return $(elt);\n    }\n  };\n\n  /**\n   * Register JQuery plugin\n   */\n  $.fn.tagsinput = function(arg1, arg2, arg3) {\n    var results = [];\n\n    this.each(function() {\n      var tagsinput = $(this).data('tagsinput');\n      // Initialize a new tags input\n      if (!tagsinput) {\n          tagsinput = new TagsInput(this, arg1);\n          $(this).data('tagsinput', tagsinput);\n          results.push(tagsinput);\n\n          if (this.tagName === 'SELECT') {\n              $('option', $(this)).attr('selected', 'selected');\n          }\n\n          // Init tags from $(this).val()\n          $(this).val($(this).val());\n      } else if (!arg1 && !arg2) {\n          // tagsinput already exists\n          // no function, trying to init\n          results.push(tagsinput);\n      } else if(tagsinput[arg1] !== undefined) {\n          // Invoke function on existing tags input\n            if(tagsinput[arg1].length === 3 && arg3 !== undefined){\n               var retVal = tagsinput[arg1](arg2, null, arg3);\n            }else{\n               var retVal = tagsinput[arg1](arg2);\n            }\n          if (retVal !== undefined)\n              results.push(retVal);\n      }\n    });\n\n    if ( typeof arg1 == 'string') {\n      // Return the results from the invoked function calls\n      return results.length > 1 ? results : results[0];\n    } else {\n      return results;\n    }\n  };\n\n  $.fn.tagsinput.Constructor = TagsInput;\n\n  /**\n   * Most options support both a string or number as well as a function as\n   * option value. This function makes sure that the option with the given\n   * key in the given options is wrapped in a function\n   */\n  function makeOptionItemFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var propertyName = options[key];\n      options[key] = function(item) { return item[propertyName]; };\n    }\n  }\n  function makeOptionFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var value = options[key];\n      options[key] = function() { return value; };\n    }\n  }\n  /**\n   * HtmlEncodes the given value\n   */\n  var htmlEncodeContainer = $('<div />');\n  function htmlEncode(value) {\n    if (value) {\n      return htmlEncodeContainer.text(value).html();\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * Returns the position of the caret in the given input field\n   * http://flightschool.acylt.com/devnotes/caret-position-woes/\n   */\n  function doGetCaretPosition(oField) {\n    var iCaretPos = 0;\n    if (document.selection) {\n      oField.focus ();\n      var oSel = document.selection.createRange();\n      oSel.moveStart ('character', -oField.value.length);\n      iCaretPos = oSel.text.length;\n    } else if (oField.selectionStart || oField.selectionStart == '0') {\n      iCaretPos = oField.selectionStart;\n    }\n    return (iCaretPos);\n  }\n\n  /**\n    * Returns boolean indicates whether user has pressed an expected key combination.\n    * @param object keyPressEvent: JavaScript event object, refer\n    *     http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n    * @param object lookupList: expected key combinations, as in:\n    *     [13, {which: 188, shiftKey: true}]\n    */\n  function keyCombinationInList(keyPressEvent, lookupList) {\n      var found = false;\n      $.each(lookupList, function (index, keyCombination) {\n          if (typeof (keyCombination) === 'number' && keyPressEvent.which === keyCombination) {\n              found = true;\n              return false;\n          }\n\n          if (keyPressEvent.which === keyCombination.which) {\n              var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey,\n                  shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey,\n                  ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey;\n              if (alt && shift && ctrl) {\n                  found = true;\n                  return false;\n              }\n          }\n      });\n\n      return found;\n  }\n\n  /**\n   * Initialize tagsinput behaviour on inputs and selects which have\n   * data-role=tagsinput\n   */\n  $(function() {\n    $(\"input[data-role=tagsinput], select[multiple][data-role=tagsinput]\").tagsinput();\n  });\n})(window.jQuery);\n"
  },
  {
    "path": "assets/users/css/bill-of-lading-templates.css",
    "content": "/*\n * Bill of lading Templates \n */\n\ntr {page-break-inside: avoid !important;}\n \n.default-movement { min-height: 1000px; background-color: #fff; padding:35px; font-size:16px;  font-family: Arial;}\n.default-movement h1 {font-size:22px; margin-bottom: 20px;}\n.default-movement .client-info {width:300px; float:left;}\n.default-movement .client-info h1 {text-align: center; background-color: #f4f4f4; padding-top: 5px; padding-bottom: 5px;  font-weight: bold;} \n.default-movement .document-type h1 {text-align: center; margin:0; text-transform: uppercase;  font-weight: bold;}\n.default-movement .firm-info {width:300px;float:right;}\n.default-movement .firm-info h1 {text-align: center; background-color: #f4f4f4; padding-top: 5px; padding-bottom: 5px; font-weight: bold;} \n.default-movement .info { margin-bottom: 20px;}\n.default-movement .document-info {margin-bottom: 20px;}\n.default-movement .document-info .number {float:left; width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-movement .document-info .date-create {float:right;width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-movement .items {margin-bottom: 20px;}\n.default-movement .amounts {margin-bottom: 20px;}\n.default-movement .amounts .payment-method {float:left; width:300px;}\n.default-movement .amounts .payment-method p {margin: 0; font-weight: bold;}\n.default-movement .amounts .amount {float:right; width:300px;}\n.default-movement .amounts .amount p span { float:right;}\n.default-movement .transmission .betrayed {float:left;}\n.default-movement .transmission .accepted {float:right;}\n.default-movement .transmission span {text-decoration: underline;}"
  },
  {
    "path": "assets/users/css/general.css",
    "content": "html, body {height: 100%; font-family: 'Open Sans', sans-serif;}\n#wrapper {min-height: 100%;   position: relative;}\n/* Header. height should be same like footer */\n#content { padding-bottom: 80px;}\nbody {padding-top: 50px; color:#777; }\nh1, h2, h3, h4 { margin: 0; padding: 0;}\n.navbar-user { background-color: #217e99; height: 53px; margin-bottom: 0; }\n.navbar-user li a {font-size:14px; color:#fff; } \n.navbar-user li a span.label {margin-right: 3px;border-radius: 10px;  font-size: 11px; padding: 5px 7px;}\n.navbar-user ul.dropdown li a {font-size:14px;}\n.navbar-user ul.nav {margin-left: -15px;}\n.navbar-user li a:hover, .navbar-user li a:focus, .navbar-user .open a:hover, .navbar-user .open a:focus { background-color: transparent; border-bottom: 4px solid #6dd0ed;}\n.navbar-user .sprite-caret {margin-left: 5px;}\n.navbar-user .settings .sprite-cog {float: left; margin-right: 6px; margin-top: 2px;}\n.navbar-user .logout {color:#6dd0ed;}\n.navbar-user .dropdown-menu {background-color: #217e99;}\n.navbar-user .dropdown-menu li a:hover, .navbar-user .dropdown-menu li a:focus { border-bottom: 0; color:#6dd0ed;}\n.navbar-user .dropdown-menu .active a, .navbar-user .dropdown-menu active a:focus, .navbar-user .dropdown-menu .active a:hover {background-color: transparent; }\n.navbar-user .dropdown-menu .divider {background-color: #6dd0ed;}\n.navbar-user .manage-firms {text-align: center;}\n.navbar-scroll-border {border-bottom:1px solid #024c64;}\nheader { padding: 35px 0; height: 100px; overflow: hidden;}\nheader .col-firm-info h1 {font-size:26px; color:#191919; line-height: 30px;}\nheader .col-firm-info img {height: 60px; margin-top: -12px; float: left; margin-right: 10px;}\nheader .col-stats {text-align: right;}\nheader .col-stats .stats { color:#191919; margin-right: -10px; margin-top: 5px; }\nheader .col-stats .stats .stat { display: inline-block; margin-right: 10px;}\nheader .col-stats .stats .stat .num {color: #217e99;}\nheader .col-stats .stats .stat .icon {float: left; margin-right: 5px; margin-top: 1px;}\n#main-menu { height: 100vh;}\n.left-col { bottom: 0; display: block; left: 0; overflow: auto; padding: 0; position: absolute; top: 100px; background-color: #217e99;}\n.left-menu {display: block;}\n.left-menu ul {margin: 0; padding: 0; list-style: none; margin-left: -15px;}\n.left-menu ul li {margin-left: 15px;}\n.left-menu ul li a { color:#fff; font-size: 14px; padding: 20px 20px 20px 12px; display: block; border-bottom: 1px solid #0b657f; border-left:4px solid transparent;}\n.left-menu ul li a:hover, .left-menu ul li a:focus, .left-menu ul li.active {border-left:4px solid #6dd0ed; text-decoration: none;}\n.left-menu ul li a .right-arrow { float: right; margin-top: 3px;}\n.left-menu ul li a .left-icon { float: left; width:25px; margin-top: 0; margin-right: 10px;}\n.right-side {padding-top:15px; padding-bottom: 15px; }\n.selected-page { background-color: #005875; margin-left:-15px; margin-right: -15px; margin-top: -15px; margin-bottom: 15px; }\n.selected-page .inner { height: 64px;  padding: 8px 20px;}\n.selected-page .inner h1 {float:left; font-size:20px; padding-top: 10px; color:#fff;}\n.selected-page .inner .breadcrumb {float: right; font-size:12px; background-color: transparent; margin-top: 5px; margin-right: -15px;}\n.selected-page .inner .breadcrumb li a {color:#fff;}\n.selected-page .inner .breadcrumb li.active {color:#6dd0ed;}\n.inner-page-menu {background-color: #207e98; margin: -18px -15px 15px; border-left: 1px solid #0b6580; padding: 14px;}\n.inner-page-menu .left-nav-side {float:left;}\n.inner-page-menu .right-nav-side {float:right}\n.btn-blue {background-color: #015874; color:#fff;}\n.btn-blue:hover, .btn-blue:active, .btn-blue:focus {color:#fff;}\n.alert-errors {background-color: #e11c16;    color: #fff;    font-weight: bold; left: 50%; margin-left: -140px; padding: 40px; position: absolute;    text-align: center; top: 10px; width: 280px; z-index: 2000;}\n.alert-errors a {position: absolute; top:10px; right:10px; color:#fff;}\n.form-verifing {margin-top: 30px; color:#333; background-color: #fff; padding: 15px; -webkit-box-shadow: 0px 0px 15px 0px rgba(0,0,0,0.75);-moz-box-shadow: 0px 0px 15px 0px rgba(0,0,0,0.75);box-shadow: 0px 0px 15px 0px rgba(0,0,0,0.75);}\n.form-verifing h2 {font-size:22px; margin-bottom: 20px;}\n.form-verifing label {font-size:13px;}\n.site-form .field { border:1px solid #e9e9e9; box-shadow: none; border-radius: 0; height: 40px;}\n.site-form .field.area {height: 200px;}\n.panel-content { background-color: #fafafa; border: 1px solid #c9c9c9; border-radius: 3px; margin-bottom: 20px; }\n.panel-content .head { background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , #f8f8f8, #f2f2f2) repeat scroll 0 0;    border-bottom: 1px solid #ccc;    border-top: 1px solid #fff;border-top-left-radius: 3px; border-top-right-radius: 3px; color: #666; font-size: 13px;font-weight: bold; padding: 8px 15px; text-shadow: 0 1px #fff;}.panel-content .body { padding: 13px 15px;}\n.panel-content .footer { background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , #f8f8f8, #f2f2f2) repeat scroll 0 0;    border-bottom: 1px solid #fff;    border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top: 1px solid #ccc; box-shadow: 0 1px 1px #fff inset; color: #555; font-size: 12px; padding: 8px 15px;text-shadow: 0 1px #fff;}\n.list-firms {list-style: none; margin: -15px; padding: 0;}\n.list-firms li {  background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , #fafafa, #f6f6f6) repeat scroll 0 0;border-top: 1px solid #ccc;padding: 10px;}\n.list-firms li span {float:right;}\n.list-firms li a {color:#333; float: right; margin-left: 5px;}\n.list-firms li a i {background: #ccc none repeat scroll 0 0;border-radius: 50px;font-size: 10px; height: 17px;line-height: 17px;text-align: center;width: 17px;}\n.btn-green {background-color: #32cd32; color:#fff}\n.btn-green:hover {background-color: #29b329; color:#fff;}\n.btn-orange {background-color: #eb8900; color:#fff}\n.btn-orange:hover {background-color: #d98004; color:#fff;}\n.special-radio .control {font-size: 14px;position: relative; padding-left: 23px; margin-left: 5px; cursor: pointer; padding-top: 3px;}\n.special-radio .control input {\tposition: absolute;\tz-index: -1;\topacity: 0;}\n.special-radio .control__indicator {\tposition: absolute;top: 2px;left: 0;width: 20px;height: 20px;background: #e6e6e6;}\n.special-radio .control--radio .control__indicator {\tborder-radius: 50%;}\n.special-radio .control:hover input ~ .control__indicator,.special-radio .control input:focus ~ .control__indicator {background: #2aa1c0;}\n.special-radio .control input:checked ~ .control__indicator {\tbackground: #2aa1c0;}\n.special-radio .control:hover input:not([disabled]):checked ~ .control__indicator,.special-radio .control input:checked:focus ~ .control__indicator {background: #0e647d;}\n.special-radio .control input:disabled ~ .control__indicator {\tpointer-events: none;opacity: .6;background: #e6e6e6;}\n.special-radio .control__indicator:after {position: absolute;display: none;content: '';}\n.special-radio .control input:checked ~ .control__indicator:after {display: block;}\n.special-radio .control--checkbox .control__indicator:after {top: 4px;left: 8px;width: 3px;height: 8px;transform: rotate(45deg);border: solid #fff;border-width: 0 2px 2px 0;}\n.special-radio .control--checkbox input:disabled ~ .control__indicator:after {border-color: #7b7b7b;}\n.special-radio .control--radio .control__indicator:after {top: 7px;left: 7px;width: 6px;height: 6px;border-radius: 50%;background: #fff;}\n.special-radio .control--radio input:disabled ~ .control__indicator:after {background: #7b7b7b;}\n.create-document {padding:0 100px; padding-top:20px; color:#414141;}\n.create-document .type {margin-bottom: 30px;} \n.create-document .type .special-radio {display: inline;}\n.create-document .type .special-radio .control {font-weight: normal;}\n.create-document .inner {padding:50px; border: 1px solid #d8d8d8; box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.15); margin-bottom: 15px;}\n.create-document .choose {color:#26b6e8; text-transform: uppercase; font-size: 12px;}\n.create-document .choose:hover {text-decoration: none;}\n.create-document .choose i {  background: #eee none repeat scroll 0 0;  border: 1px solid #ccc; border-radius: 30px; color: #888; display: inline-block; height: 28px; line-height: 25px; margin-right: 3px; text-align: center; width: 28px;}\n.create-document .choose span {font-size:10px;}\n.create-document .client .form-control {display: inline; width:auto;}\n.create-document .client label {display: block;}\n.create-document .client .choose {display: inline-block;}\n.create-document .maturity-date {display:  none;}\n.create-document .table-items {border:1px solid #d8d8d8; margin-bottom: 15px;}\n.create-document .table-items tr td {border-top:0;}\n.create-document .table-items thead tr th {border-bottom:1px solid #d8d8d8;}\n.create-document .add-new-item {background-color: #f8f8f8; display: inline-block;  border-radius: 1000px; padding: 6px 20px 7px;   transition: background-color 0.1s ease-in-out 0s;}\n.create-document .add-new-item:hover {text-decoration: none; background-color: #f3f3f3;}\n.create-document .items-features, .create-document .remarks, .create-document .amounts {margin-bottom: 20px;} \n.create-document .amounts .text-discount, .create-document .amounts .select-discount {width:80px; display: inline-block;} \n.create-document .amounts .amount {text-align: right;}\n.create-document .amounts .vat-field {width:50px; text-align: right; display: inline-block;}\n.create-document .amounts .discount {float: right;}\n.create-document .amounts .total {font-size:25px;}\n.create-document .quantity-field {text-align: right;}\n.create-document .quantity-field, .create-document .quantity-type {width:60px; display: inline-block;}\n.create-document .quantity-type { width:90px;}\n.create-document .price-field {width:150px; display: inline-block; text-align: right;}\n.create-document .table-responsive {overflow-x: auto;}\n.create-document .column-data {margin-bottom: 15px;}\n.create-document .field {height: 35px;}\n.create-document .field.area {height: 100px;}\n.create-document h1 {margin-bottom: 30px;}\n.create-document .invoice-setting {max-width: 400px; float: right;}\n.create-document .amount-row {margin-bottom: 15px;}\n.create-document .discount-txt {padding-top: 12px;}\n.create-document .total-row {border-top: 1px solid #f3f3f3; padding-top: 15px;}\n.create-document .item-total-price {padding-top: 7px;} \n.create-document .actions {display: none;}\n.create-document .field-item-name {width:auto; display: inline-block;}\n.create-document .no-vat-field {display: none;}\n.create-document .no-vat-field .form-control { margin-bottom: 5px;}\n.create-document .select-currency {margin-bottom: 10px}\n.create-document .the-vat {padding-top:10px;}\n.create-document .no-vat {padding-top:20px;}\n.create-document .inv-type-num {font-weight:bold;} \n.create-document .credit-debit-option {display: none;}\n.create-document .choose-translation {display: inline;}\n.create-document .min-w-190 {min-width: 190px;}\n.create-document .min-w-180 {min-width: 180px;}\n.new-doc-page-left .choose-firm-translation { float: right; }\n.show-pay-statuses {cursor: pointer;}\n.status-changer { position: relative;}\n.action-history {background-color: #fff; padding: 10px;}\n.action-history h1 {font-size:24px; border-bottom: 1px solid #ccc; padding-bottom: 20px; margin-bottom: 20px;}\n#payment-statuses {position: absolute; bottom: -30px; left: 0; display: none; background-color: #fff; box-shadow: 1px 1px 1px #ccc; border:1px solid #ccc; padding:5px 15px; z-index: 1100;}\n#payment-statuses a {display: block; color:#000;}\n.client-individial {display: none;}\n.client-vat-registered {display: none;}\n.selected-new-default, .not-selected-new-default {display: none;}\n.btn {border-radius: 0;}\n.view-container {width: 100%; height: 100%;  padding: 40px; position: relative; overflow: scroll; }\n.reports-page .dates {margin-bottom: 20px;}\n.top-search-form {position: relative; border-left: 1px solid #0b657f; border-right: 1px solid #0b657f; margin-top: 0; margin-bottom: 0; margin-left: 10px; height: 50px; width:280px;}\n.top-search-form .fa-spinner { position: absolute; right:5px; top:12px; display: none; color:#fff;}\n.top-search-form .form-group {margin-top: 7px;}\n.top-search-form .form-group .field {background-color: transparent; border:0; border-radius: 0; color:#fff; width:230px; height: 37px; padding-right: 20px;}\n.top-search-form .sprite-search { position: absolute; right:10px; top:15px;}\n#topSearchResults {position: absolute; display: none; color:#fff; padding: 5px 10px; width:250px; margin-top: 10px; background-color: #217e99; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px;}\n#topSearchResults a {color:#fff;} \n.invoice-search-result a {display: block;}\n.client-search-result a {display: block;}\n.item-search-result a {display: block;} \n.no-results-found { margin-bottom: 20px; }\n.table-list tbody tr td {padding:15px 8px;} \n.pagination {margin:0;}\n.lists-search-form {margin-bottom: 20px;background-color: #f2f2f2; border-radius: 10px; padding: 10px;}\n.invoices-list-form {margin-bottom: 20px;}\n.txt_status_paid {color:#23b03a;}\n.txt_status_unpaid {color:#ff0000;}\n.txt_status_partly_paid {color:#a10000;}\n.table-options .option {float:right;}\n.table-options .more-btn {margin-left: 10px; cursor: pointer;}\n#modalSelector .search-field {margin-bottom: 10px;}\n#modalSelector .list-ajax-results  li {cursor: pointer;}\n.settings-page a { display: block; }\n.settings-page a:hover {text-decoration: none;}\n.settings-page .list-group-item {padding: 20px 15px;}\n.settings-page .list-group-item span {float: right; margin-top: 7px;}\n.settings-inner-page .col-settings {margin-bottom: 30px;}\n.settings-inner-page .col-settings h4 { text-align: center;  margin-bottom: 10px;}\n.plans .panel{text-align: center;}\n.plans .panel:hover { box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4), 0 1px 5px rgba(130, 130, 130, 0.35); }\n.plans .panel-body{padding: 0px; text-align: center;}\n.plans .the-price{background-color: rgba(220,220,220,.17); box-shadow: 0 1px 0 #dcdcdc, inset 0 1px 0 #fff;  padding: 20px;margin: 0;}\n.plans .the-price h1{ line-height: 1em; padding: 0; margin: 0;}\n.plans .subscript {font-size: 25px;}\n.plans .cnrflash {background-color: red;color: #fff;font-size: 12px;position: absolute; right: 18px; top: 3px;}\n.plan-container { width: 100%;   border-radius: 5px;  background-color: #fff;  position: relative;  top: 0;  -webkit-transition: all 1s;  transition: all 1s;}\n.plan-container:hover { cursor: pointer;  position: relative;  top: -10px;  -webkit-transition: top 1s;  transition: top 1s;}\n.plan-container .plan-header {  padding: 50px 0;  border-radius: 5px 5px 0 0;  background-color: #54ccb5;  text-align: center;}\n.plan-container .plan-header .icon-box {  margin: 0 auto;}\n.plan-container .plan-header .icon-box .icon {  font-size: 3.125em;  color: #447F71;}\n.plan-container .plan-header h2 { color: #fff;  font-weight: lighter;  margin: 0;  padding-top: 0.625em;}\n.plan-container .plan-header p { margin: 0;  color: #447F71;}\n.plan-container .plan-details { margin: 0 auto;  padding: 60px;  background-color: #f1f1f1;}\n.plan-container .plan-details ul {  padding-left: 0;  list-style: none;}\n.plan-container .plan-details ul li.option-li {  border-top: 3px solid #e8edef;  padding: 20px 0;  font-weight: bold;  color: #5f5f5f;}\n.plan-container .plan-details ul li.option-li:last-child {  border-bottom: 3px solid #e8edef;} \n.plan-container .plan-details p {background-color: #f4f4f4;  margin: 2em 0;  padding: 1.25em;  font-size: 0.75em;  line-height: 1.8;  color: #777777;}\n.plan-container .plan-details .button-confirm {  background-color: #FF8939;  padding: 20px 0;  border-radius: 3px;  color: #fff;  text-align: center;  width: 100%;  border: 0;}\n.plan-container .plan-details .button-confirm:hover {  background-color: #e67b33;}\n.payment-request {margin-bottom: 20px;}\n.payment-request div {margin-bottom: 5px;}\n.payment-details {margin-bottom: 20px;}\n.payment-details h3 {margin-bottom: 10px;}\n.my-active-plans {margin-bottom: 20px;}\n.plan-req-page .credit-cards-box {background-color: #ebe9eb; border-radius: 5px; padding: 10px; margin-bottom: 20px;}\n.plan-req-page .credit-cards-box .icons { margin-bottom: 20px;}\n.plan-req-page .credit-cards-box .cards-icons {height: 30px;}\n.plan-req-page .credit-cards-box .border {width:100%; height: 1px; background-color: #dfdcde; margin-bottom: 20px;}\n.plan-req-page .credit-cards-box .card-fields {border-bottom:1px solid #dfdcde; padding: 20px; margin-bottom: 20px; background-color: #dfdcde;}\n.limit-error, .no-permissions {font-size:22px;}\n.no-permissions {padding: 20px; background-color: #f44336; color: white; margin-bottom: 15px;}\n.pay-type-imgs img {height:40px;}\n\n/* Footer. height should be same like #content */\nfooter { background-color: #285674; color:#6dd0ed; bottom: 0; height: 80px; left: 0; padding: 20px 0; position: absolute; text-align: center; width: 100%;}\nfooter a, footer a:hover, footer a:active, footer a:focus {color:#6dd0ed; text-decoration: underline;}\n/*\n * Spay icons \n */\n.sprite-caret {background-image: url('../imgs/sprite-icons.png'); background-position: -47px -2px;   display: inline-block;  width: 8px;  height: 10px;   }\n.sprite-cog {background-image: url('../imgs/sprite-icons.png'); background-position: -24px -2px;   display: inline-block;  width: 18px;  height: 18px;  }\n.sprite-search {background-image: url('../imgs/sprite-icons.png'); background-position:0 0;   display: inline-block;  width: 21px;  height: 23px;  }\n.sprite-new-inv {background-image: url('../imgs/sprite-icons.png'); background-position:0 -23px;   display: inline-block;  width: 18px;  height: 20px;  }\n.sprite-invoices {background-image: url('../imgs/sprite-icons.png'); background-position:-21px -23px;   display: inline-block;  width: 18px;  height: 20px;  }\n.sprite-clients {background-image: url('../imgs/sprite-icons.png'); background-position:-42px -23px;   display: inline-block;  width: 20px;  height: 20px;  }\n.sprite-items {background-image: url('../imgs/sprite-icons.png'); background-position:-65px -23px;   display: inline-block;  width: 19px;  height: 20px;  }\n.sprite-storage {background-image: url('../imgs/sprite-icons.png'); background-position:-1px -46px;   display: inline-block;  width: 20px;  height: 20px;  }\n.sprite-war-card {background-image: url('../imgs/sprite-icons.png'); background-position:-24px -46px;   display: inline-block;  width: 28px;  height: 20px;  }\n.sprite-protocols {background-image: url('../imgs/sprite-icons.png'); background-position:-59px -46px;   display: inline-block;  width: 20px;  height: 20px;  }\n.sprite-reports {background-image: url('../imgs/sprite-icons.png'); background-position:-84px -46px;   display: inline-block;  width: 16px;  height: 20px;  }\n.sprite-imp-exp {background-image: url('../imgs/sprite-icons.png'); background-position:-87px -22px;   display: inline-block;  width: 23px;  height: 20px;  }\n.sprite-home {background-image: url('../imgs/sprite-icons.png'); background-position:-67px -2px;   display: inline-block;  width: 23px;  height: 20px;  }\n.sprite-arrow-right {background-image: url('../imgs/sprite-icons.png'); background-position:-58px -5px;   display: inline-block;  width: 5px;  height: 9px;  }\n.sprite-more {background-image: url('../imgs/sprite-icons.png'); background-position:-18px -71px;   display: inline-block;  width: 19px;  height: 12px;  }\n.sprite-edit {background-image: url('../imgs/sprite-icons.png'); background-position:0px -66px;   display: inline-block;  width: 15px;  height: 20px;  }\n.sprite-inv-docs {background-image: url('../imgs/sprite-icons.png'); background-position:401px -67px;   display: inline-block;  width: 18px;  height: 20px;  }\n.sprite-companies {background-image: url('../imgs/sprite-icons.png'); background-position:601px -67px;   display: inline-block;  width: 20px;  height: 20px;  }\n/*\n * Spay icons THE END\n */\n\n@media screen and (max-width: 1200px) {\n    .create-document {padding: 20px 50px 0;}\n    .view-container {padding: 0;}\n}\n\n@media (min-width: 767px) and (max-width: 991px) { \n    .top-search-form {width:130px;}\n    .table tbody tr td {padding:10px 8px;} \n}\n\n@media screen and (max-width: 991px) {\n    .create-document {padding: 0;}\n    .row.new-doc-page {margin-bottom: 20px;}\n    .new-doc-page-left .choose-firm-translation { float: none; }\n    .new-doc-page-right .choose-translation { margin-bottom: 20px;} \n}\n\n@media screen and (max-width: 767px) {\n    header {height: auto;}\n    .table tbody tr td {padding:8px 8px;}\n    .left-col {position:relative; top:0; margin-bottom: 20px;} \n    .top-search-form {width:100%; margin-right: auto; margin-left: auto;}\n    .top-search-form .form-group {margin-top: -5px;}\n    .navbar-brand {color:#fff;}\n    .navbar-toggle {border-color: #fff;}\n    .navbar-toggle .icon-bar {background-color: #fff;}\n    #myNavbar {background-color: #217e99;}\n    .navbar-user {height: auto;}\n    .navbar-user li a:hover, .navbar-user li a:focus, .navbar-user .open a:hover, .navbar-user .open a:focus { background-color: transparent; border-bottom: none;}\n    .navbar-user .manage-firms {text-align: left;}\n    #topSearchResults {z-index: 100;}\n    .create-document .invoice-setting {float: none; max-width:none;}\n    .create-document .amount-row {margin-bottom: auto;}\n    .create-document .inner {padding: 20px;} \n    .left-menu {display: none;}\n    .inner-page-menu .left-nav-side {float:none; margin-bottom: 5px;}\n    .inner-page-menu .right-nav-side {float:none;}\n    .create-document .amount-row { margin-bottom: 20px; }\n    .create-document .amounts .amount {text-align: left;}\n    .create-document .amounts .discount {float: none;}\n    .limit-error, .no-permissions {font-size:16px;}\n    /* Dont zoom fileds! */\n    input[type=\"color\"],\n    input[type=\"date\"],\n    input[type=\"datetime\"],\n    input[type=\"datetime-local\"],\n    input[type=\"email\"],\n    input[type=\"month\"],\n    input[type=\"number\"],\n    input[type=\"password\"],\n    input[type=\"search\"],\n    input[type=\"tel\"],\n    input[type=\"text\"],\n    input[type=\"time\"],\n    input[type=\"url\"],\n    input[type=\"week\"],\n    select:focus,\n    textarea {\n        font-size: 16px !important;\n    }\n    /* Dont zoom fileds! */\n}\n\n"
  },
  {
    "path": "assets/users/css/invoices-templates.css",
    "content": "/*\n * Invoice Template\n */\n\n/* Bootstrap 3 main classes */\n.invoice-box * {\n    box-sizing: border-box;\n}\n\n.invoice-box {\n    line-height: 1.42857143;\n    color: #333;\n    margin: 0;\n    padding: 0;\n}\n\n.invoice-box table {\n    border-spacing: 0;\n    border-collapse: collapse;\n    background-color: transparent;\n}\n\n.invoice-box td, .invoice-box th {\n    padding: 0;\n}\n\n.invoice-box p {\n    margin: 0 0 10px;\n}\n\n.invoice-box .table {\n    width: 100%;\n    max-width: 100%;\n    margin-bottom: 20px;\n}\n\n.invoice-box .table-striped > tbody > tr:nth-of-type(2n+1) {\n    background-color: #f9f9f9;\n}\n\n.invoice-box :after,\n.invoice-box :before {\n -webkit-box-sizing:border-box;\n -moz-box-sizing:border-box;\n box-sizing:border-box\n}\n\n.invoice-box .clearfix::after, .invoice-box .clearfix::before, \n.invoice-box .container-fluid::after, .invoice-box .container-fluid::before, \n.invoice-box .container::after, .invoice-box .container::before, \n.invoice-box .dl-horizontal dd::after, .invoice-box .dl-horizontal dd::before,\n.invoice-box .form-horizontal .form-group::after, \n.invoice-box .form-horizontal .form-group::before, \n.invoice-box .modal-footer::after, .invoice-box .modal-footer::before,\n.invoice-box .modal-header::after, .invoice-box .modal-header::before,\n.invoice-box .nav::after, .invoice-box .nav::before, \n.invoice-box .navbar-collapse::after, .invoice-box .navbar-collapse::before,\n.invoice-box .navbar-header::after, .invoice-box .navbar-header::before, \n.invoice-box .navbar::after, .invoice-box .navbar::before,\n.invoice-box .pager::after, .invoice-box .pager::before,\n.invoice-box .panel-body::after, .invoice-box .panel-body::before, \n.invoice-box .row::after, .invoice-box .row::before {\n    display: table;\n    content: \" \";\n}\n\n.invoice-box .clearfix::after, .invoice-box .container-fluid::after, \n.invoice-box .container::after, .invoice-box .dl-horizontal dd::after,\n.invoice-box .form-horizontal .form-group::after, .invoice-box .modal-footer::after,\n.invoice-box .modal-header::after, .invoice-box .nav::after, .invoice-box .navbar-collapse::after, \n.invoice-box .navbar-header::after, .invoice-box .navbar::after, .invoice-box .pager::after, .invoice-box .panel-body::after, .invoice-box .row::after {\n    clear: both;\n}\n\n.invoice-box .table > tbody > tr > td, \n.invoice-box .table > tbody > tr > th,\n.invoice-box .table > tfoot > tr > td, \n.invoice-box .table > tfoot > tr > th, \n.invoice-box .table > thead > tr > td, \n.invoice-box .table > thead > tr > th {\n    padding: 8px;\n    line-height: 1.42857143;\n    vertical-align: top;\n    border-top: 1px solid #ddd;\n}\n\n.invoice-box .table > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid #ddd;\n}\n\n.invoice-box .table > caption + thead > tr:first-child > td, \n.invoice-box .table > caption + thead > tr:first-child > th, \n.invoice-box .table > colgroup + thead > tr:first-child > td, \n.invoice-box .table > colgroup + thead > tr:first-child > th, \n.invoice-box .table > thead:first-child > tr:first-child > td, \n.invoice-box .table > thead:first-child > tr:first-child > th {\n  border-top: 0;\n}\n\n.invoice-box .table > tbody > tr > td, \n.invoice-box .table > tbody > tr > th, \n.invoice-box .table > tfoot > tr > td, \n.invoice-box .table > tfoot > tr > th, \n.invoice-box .table > thead > tr > td, \n.invoice-box .table > thead > tr > th {\n    padding: 8px;\n    line-height: 1.42857143;\n}\n\n.invoice-box th {\n    text-align: left;\n}\n\n.invoice-box .text-right {\n    text-align: right;\n}\n\n.invoice-box .main-inv-container { padding: 20px; }\n \n.invoice-box .col-right {background-color: #ccc;}\n.invoice-box { margin: 0 auto; -webkit-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.70);-moz-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.70);box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.70);}\n.invoice-box tr {page-break-inside: avoid !important;}\n\n.invoice-box .preview-inv-nav {\n    background-color: #ffffff;\n    border: 1px solid #c3c4c7;\n    box-shadow: 0 1px 1px rgba(0,0,0,.04);\n }\n\n /* \n    invoice-creative\n  */\n .invoice-box .invoice-creative { background-color: #fff; padding:35px; font-size:14px; overflow: hidden; }\n .invoice-box .invoice-creative .row-my-firm {color:#6c6c6c; margin-bottom: 30px;}\n .invoice-box .invoice-creative .firm-logo {width:200px;float: left;}\n .invoice-box .invoice-creative .firm-logo img {width: 100%;}\n \n .invoice-box .invoice-creative .my-firm-info {float: right; font-size:16px; max-width: 400px; word-break: break-all; overflow: hidden;}\n .invoice-box .invoice-creative .my-firm-info p {margin-bottom: 4px;}\n .invoice-box .invoice-creative .my-firm-info .firm-name {margin-bottom: 7px;}\n \n .invoice-box .invoice-creative p {margin-bottom: 7px;}\n .invoice-box .invoice-creative .row-my-firm .firm-name {color:#3193c4; font-size:20px;}\n .invoice-box .invoice-creative .invoice-type {font-size:16px; color:#3193c4; display: inline-block; margin-bottom: 5px;}\n .invoice-box .invoice-creative .row-invoice-info .info {color:#2d2d2d; border-top:2px solid #c6c6c6; border-bottom:2px solid #c6c6c6; padding-top: 7px; padding-bottom: 7px;}\n .invoice-box .invoice-creative .head-td {padding-right: 20px;}\n \n .invoice-box .invoice-creative .row-invoice-info table {float: left; width: 210px; margin-right: 40px;}\n .invoice-box .invoice-creative .row-invoice-info .client-info {float: left; max-width:200px; word-break: break-all; overflow: hidden;}\n .invoice-box .invoice-creative .row-invoice-info { margin-bottom: 30px;}\n .invoice-box .invoice-creative .row-invoice-info .origin {float:right; text-transform: uppercase; max-width: 250px; word-break: break-all; text-align: right; font-size: 26px;}\n \n .invoice-box .invoice-creative .items-table  {color:#2c2c2c;}\n .invoice-box .invoice-creative .items-table .item-name {color:#3193c4; word-break: break-word;}\n \n .invoice-box .invoice-creative .invoice-totals {float: right; max-width:300px; text-align: right; font-size:16px; color:#2c2c2c; }\n .invoice-box .invoice-creative .invoice-totals table {width:100%;}\n .invoice-box .invoice-creative .invoice-totals .info {text-align: left;}\n .invoice-box .invoice-creative .invoice-totals table .inv-amounts {text-align: right}\n .invoice-box .invoice-creative .invoice-totals .final-total td {padding-top: 20px; font-size: 18px;}\n .invoice-box .invoice-creative .invoice-totals .final-total .total-price {color:#3193c4;}\n \n .invoice-box .invoice-creative .invoice-payment {float:left; color:#2c2c2c; max-width: 200px; word-break: break-all; overflow: hidden;}\n .invoice-box .invoice-creative .invoice-payments {margin-bottom: 30px; width: 100%;}\n\n .invoice-box .invoice-creative .recipient {margin-bottom: 30px; color:#2c2c2c;  width:100%; }\n .invoice-box .invoice-creative .recipient .rec {width: 50%; float: left;}\n .invoice-box .invoice-creative .recipient .comp { float:right; text-align: right; width: 50%; word-break: break-word; }\n \n .invoice-box .invoice-creative .signature {margin-bottom: 30px; color:#2c2c2c; width:100%; }\n .invoice-box .invoice-creative .signature .sign {width: 50%; float: left; }\n .invoice-box .invoice-creative .signature .cipher { float:right; text-align: right; width: 50%; word-break: break-word; }\n \n .invoice-box .invoice-creative .remarks {color:#2c2c2c; word-break: break-word;}\n\n  /* \n    invoice-apple\n  */\n  .invoice-box .invoice-apple .firm-logo {width:200px;}\n  .invoice-box .invoice-apple .firm-logo img {max-width: 100%;}\n  .invoice-box .invoice-apple { background-color: #fff; padding:35px; font-size:14px; overflow: hidden; }\n  .invoice-box .invoice-apple .invoice-type {display:block; font-size: 32px; margin-bottom: 20px;}\n  .invoice-box .invoice-apple .client-info {float: left; max-width:200px; word-break: break-all; overflow: hidden;}\n  .invoice-box .invoice-apple .client-info p {margin: 0; margin-bottom:5px;}\n  .invoice-box .invoice-apple .my-firm-info {float: right; max-width: 400px; word-break: break-all; overflow: hidden; }\n  .invoice-box .invoice-apple .my-firm-info p {margin: 0; margin-bottom:5px;}\n  .invoice-box .invoice-apple .inv-info {margin-top:10px; margin-bottom: 20px;}\n  .invoice-box .invoice-apple .inv-info table {float:left;}\n  .invoice-box .invoice-apple .inv-info .origin {float:right; font-size: 28px;}\n  .invoice-box .invoice-apple .items-table {width: 100%;}\n  .invoice-box .invoice-apple .items-table thead {border-bottom: 2px solid #333333;}\n  .invoice-box .invoice-apple .items-table thead th { padding-bottom: 5px; }\n  .invoice-box .invoice-apple .items-table tbody td { padding-top: 5px; }\n\n  .invoice-box .invoice-apple .invoice-payments {margin-bottom: 30px; width: 100%; border-top: 1px solid #333; margin-top: 5px;}\n  .invoice-box .invoice-apple .invoice-payment { word-break: break-all; overflow: hidden;}\n\n  .invoice-box .invoice-apple .invoice-totals {float: right; max-width:300px; text-align: right; font-size:16px; color:#2c2c2c; padding-top:20px; }\n  .invoice-box .invoice-apple .invoice-totals table {width:100%;}\n  .invoice-box .invoice-apple .invoice-totals .info {text-align: left;}\n  .invoice-box .invoice-apple .invoice-totals table .inv-amounts {text-align: right}\n  .invoice-box .invoice-apple .invoice-totals .final-total td {padding-top: 20px; font-size: 18px;}\n  .invoice-box .invoice-apple .bottom-part .signature { text-align: right; }\n\n  .invoice-box .invoice-apple .items-table .item-name { word-break: break-word; padding-right: 5px;}\n  .invoice-box .invoice-apple .remarks {word-break: break-word;}\n  .invoice-box .invoice-apple .signature .cipher { word-break: break-word; }\n  .invoice-box .invoice-apple .recipient .comp { word-break: break-word; }\n  .invoice-box .invoice-apple .head-td {padding-right: 20px;}\n  .invoice-box .invoice-apple .to-inv-container { margin-bottom: 15px;}\n\n  /* \n    invoice-classic\n  */\n  .invoice-box .invoice-classic { background-color: #fff; padding:35px; font-size:14px; overflow: hidden; }\n  .invoice-box .invoice-classic .top-part { margin-bottom: 20px; }\n  .invoice-box .invoice-classic .top-part .firm-logo { float:left; width:200px; }\n  .invoice-box .invoice-classic .top-part .firm-logo img {max-width: 100%;}\n  .invoice-box .invoice-classic .top-part .invoice-type { float:right; display:block; font-size: 32px;  }\n\n  .invoice-box .invoice-classic .origin {margin-bottom: 20px; font-size: 22px; font-weight: 100;}\n\n  .invoice-box .invoice-classic .table-companies { margin-bottom: 20px; }\n\n  .invoice-box .invoice-classic .client-info { max-width:200px; word-break: break-all; overflow: hidden;}\n  .invoice-box .invoice-classic .client-info p {margin: 0; margin-bottom:5px;}\n\n  .invoice-box .invoice-classic .my-firm-info { max-width: 400px; word-break: break-all; overflow: hidden; }\n  .invoice-box .invoice-classic .my-firm-info p {margin: 0; margin-bottom:5px;}\n\n  .invoice-box .invoice-classic .items-table {width: 100%; border: 1px solid #cccccc;}\n  .invoice-box .invoice-classic .items-table thead {background-color: #f5f5f5;}\n  .invoice-box .invoice-classic .items-table thead th { padding: 5px; border: 1px solid #cccccc;}\n  .invoice-box .invoice-classic .items-table tbody td { padding: 5px; border: 1px solid #cccccc; }\n\n  .invoice-box .invoice-classic .invoice-payments {margin-bottom: 30px; width: 100%; margin-top: 5px;}\n  .invoice-box .invoice-classic .invoice-payment { word-break: break-all; overflow: hidden;}\n\n  .invoice-box .invoice-classic .invoice-totals {float: right; max-width:300px; text-align: right; font-size:16px; color:#2c2c2c; padding-top:20px; }\n  .invoice-box .invoice-classic .invoice-totals table {width:100%;}\n  .invoice-box .invoice-classic .invoice-totals .info {text-align: left;}\n  .invoice-box .invoice-classic .invoice-totals table .inv-amounts {text-align: right}\n  .invoice-box .invoice-classic .invoice-totals .final-total td {padding-top: 20px; font-size: 18px;}\n  .invoice-box .invoice-classic .signature { text-align: right; }\n\n  .invoice-box .invoice-classic .items-table .item-name { word-break: break-word; padding-right: 5px;}\n  .invoice-box .invoice-classic .remarks {word-break: break-word;}\n  .invoice-box .invoice-classic .signature .cipher { word-break: break-word; }\n  .invoice-box .invoice-classic .recipient .comp { word-break: break-word; }\n  .invoice-box .invoice-classic .head-td {padding-right: 20px;}\n  .invoice-box .invoice-classic .mb-10px {margin-bottom: 10px;}\n  .invoice-box .invoice-classic .vertic-align-top {vertical-align: top;}\n  .invoice-box .invoice-classic .to-inv-container { margin-bottom: 15px;}\n\n  /* \n    invoice-designer\n  */\n  .invoice-box .invoice-designer { background-color: #fff; padding:35px; font-size:14px; overflow: hidden; }\n  .invoice-box .invoice-designer .top-part { margin-bottom: 20px; }\n  .invoice-box .invoice-designer .top-part .firm-logo { float:left; width:200px; }\n  .invoice-box .invoice-designer .top-part .firm-logo img {max-width: 100%;}\n  .invoice-box .invoice-designer .invoice-type { float:right; display:block; font-size: 22px; }\n\n  .invoice-box .invoice-designer .origin { font-size: 22px; font-weight: 100; float:left;}\n\n  .invoice-box .invoice-designer .table-companies { margin-bottom: 20px; }\n\n  .invoice-box .invoice-designer .client-info { max-width:200px; word-break: break-all; overflow: hidden;}\n  .invoice-box .invoice-designer .client-info p {margin: 0; margin-bottom:5px;}\n\n  .invoice-box .invoice-designer .my-firm-info { max-width: 400px; word-break: break-all; overflow: hidden; }\n  .invoice-box .invoice-designer .my-firm-info p {margin: 0; margin-bottom:5px;}\n\n  .invoice-box .invoice-designer .items-table {width: 100%; border: 0}\n  .invoice-box .invoice-designer .items-table thead {background-color: #0574ba; color: #ffffff;}\n  .invoice-box .invoice-designer .items-table thead th { padding: 5px; border: 0; }\n  .invoice-box .invoice-designer .items-table tbody td { padding: 5px; border: 0; }\n\n  .invoice-box .invoice-designer .invoice-payments {margin-bottom: 30px; width: 100%; margin-top: 5px;}\n  .invoice-box .invoice-designer .invoice-payment { word-break: break-all; overflow: hidden;}\n\n  .invoice-box .invoice-designer .invoice-totals {float: right; max-width:300px; text-align: right; font-size:16px; color:#2c2c2c; padding-top:20px; }\n  .invoice-box .invoice-designer .invoice-totals table {width:100%;}\n  .invoice-box .invoice-designer .invoice-totals .info {text-align: left;}\n  .invoice-box .invoice-designer .invoice-totals table .inv-amounts {text-align: right}\n  .invoice-box .invoice-designer .invoice-totals .final-total td {padding-top: 20px; font-size: 18px;}\n  .invoice-box .invoice-designer .signature { text-align: right; }\n\n  .invoice-box .invoice-designer .items-table .item-name { word-break: break-word; padding-right: 5px;}\n  .invoice-box .invoice-designer .remarks {word-break: break-word;}\n  .invoice-box .invoice-designer .signature .cipher { word-break: break-word; }\n  .invoice-box .invoice-designer .recipient .comp { word-break: break-word; }\n  .invoice-box .invoice-designer .head-td {padding-right: 20px;}\n  .invoice-box .invoice-designer .mb-10px {margin-bottom: 10px;}\n  .invoice-box .invoice-designer .vertic-align-top {vertical-align: top;}\n  .invoice-box .invoice-designer .to-inv-container { margin-bottom: 15px;}\n  .invoice-box .invoice-designer .above-inv-info {margin-bottom: 15px;}\n  .invoice-box .invoice-designer .text-right { text-align: right; }\n  .invoice-box .invoice-designer .special-color {color: #0574ba;}"
  },
  {
    "path": "assets/users/css/protocols-templates.css",
    "content": "/*\n * Protocols Templates \n */\n\ntr {page-break-inside: avoid !important;}\n \n.default-protocol { min-height: 1000px; background-color: #fff; padding:35px; font-size:16px;  font-family: Arial;}\n.default-protocol h1 {font-size:22px; margin-bottom: 20px;}\n.default-protocol .client-info {width:300px; float:left;}\n.default-protocol .client-info span {font-weight: bold;}\n.default-protocol .client-info h1 {text-align: center; background-color: #f4f4f4; padding-top: 5px; padding-bottom: 5px;  font-weight: bold;} \n.default-protocol .document-type h1 {text-align: center; margin:0; text-transform: uppercase;  font-weight: bold;}\n.default-protocol .firm-info {width:300px;float:right;}\n.default-protocol .firm-info h1 {text-align: center; background-color: #f4f4f4; padding-top: 5px; padding-bottom: 5px; font-weight: bold;} \n.default-protocol .firm-info span {font-weight: bold;}\n.default-protocol .info { margin-bottom: 20px;}\n.default-protocol .document-info {margin-bottom: 20px;}\n.default-protocol .document-info .number {float:left; width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-protocol .document-info .date-create {float:right;width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-protocol .to-inv {margin-bottom: 20px;}\n.default-protocol .number-inv {float:left; width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-protocol .items {margin-bottom: 20px;}\n.default-protocol .amounts {margin-bottom: 20px;}\n.default-protocol .amounts .payment-method {float:left; width:300px;}\n.default-protocol .amounts .payment-method p {margin: 0; font-weight: bold;}\n.default-protocol .amounts .amount {float:right; width:300px;}\n.default-protocol .amounts .amount p span { float:right;}\n.default-protocol .transmission .received {float:left; width:300px;}\n.default-protocol .transmission .compiled {float:right; width:300px;}\n.default-protocol .transmission span {text-decoration: underline;}\n.default-protocol .provider-transmit {margin-bottom: 20px;}\n.default-protocol .contract {margin-bottom: 100px;}\n.default-protocol .protocol-totals {float: right; width:300px; text-align: right; margin-bottom: 20px;}\n.default-protocol .protocol-totals span {font-weight: bold;}"
  },
  {
    "path": "assets/users/css/warranty-cards-templates.css",
    "content": "/*\n * Warranty Cards Templates \n */\n\ntr {page-break-inside: avoid !important;}\n \n.default-warranty { min-height: 1000px; background-color: #fff; padding:35px; font-size:16px;  font-family: Arial;}\n.default-warranty h1 {font-size:22px; margin-bottom: 20px;}\n.default-warranty .client-info {width:300px; float:left;}\n.default-warranty .client-info h1 {text-align: center; background-color: #f4f4f4; padding-top: 5px; padding-bottom: 5px;  font-weight: bold;} \n.default-warranty .document-type h1 {text-align: center; margin:0; text-transform: uppercase;  font-weight: bold;}\n.default-warranty .firm-info {width:300px;float:right;}\n.default-warranty .firm-info h1 {text-align: center; background-color: #f4f4f4; padding-top: 5px; padding-bottom: 5px; font-weight: bold;} \n.default-warranty .info { margin-bottom: 20px;}\n.default-warranty .document-info {margin-bottom: 20px;}\n.default-warranty .document-info .number {float:left; width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-warranty .document-info .date-create {float:right;width:300px; border:2px solid #f4f4f4; padding: 10px; border-radius: 10px;}\n.default-warranty .items {margin-bottom: 20px;}\n.default-warranty .amounts {margin-bottom: 20px;}\n.default-warranty .amounts .payment-method {float:left; width:300px;}\n.default-warranty .amounts .payment-method p {margin: 0; font-weight: bold;}\n.default-warranty .amounts .amount {float:right; width:300px;}\n.default-warranty .amounts .amount p span { float:right;}\n.default-warranty .transmission .received {float:left;}\n.default-warranty .transmission .compiled {float:right;}\n.default-warranty .transmission span {text-decoration: underline;}\n.default-warranty .conditions {margin-bottom: 20px;}"
  },
  {
    "path": "assets/users/js/general.js",
    "content": "/*\n * okay we lets ready :)\n * @description Users JavaScript\n */\nvar pattern_sums = /^[0-9\\-\\.\\,]+$/;\nvar pattern_email = /\\S+@\\S+\\.\\S+/;\nvar border_color_fields = '#e9e9e9';\nvar border_color_wrong = 'red';\nvar alertBoxHtml = '<div class=\"alert-errors\">%output%<a href=\"javascript:void(0);\" class=\"close-alert\" onclic=\"cs\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></a></div>';\nvar chooseItemIndex;\nvar pixelsPdfDelivery = 1300; // pixels that wkhtmltopdf deliver segments of pdf\n\n$(document).ready(function () {\n    /*\n     * Confirm dialog\n     */\n    $('.confirm').click(function (e) {\n        e.preventDefault();\n        var lHref = $(this).attr('href');\n        var myMessage = $(this).data('my-message');\n        bootbox.confirm({\n            message: myMessage,\n            buttons: {\n                confirm: {\n                    label: 'Yes',\n                    className: 'btn-success'\n                },\n                cancel: {\n                    label: 'No',\n                    className: 'btn-danger'\n                }\n            },\n            callback: function (result) {\n                if (result) {\n                    window.location.href = lHref;\n                }\n            }\n        });\n    });\n    /*\n     * Alerts fade out after 5sec.\n     */\n    if ($('.alert-errors').length) {\n        $('.alert-errors').delay(4000).fadeOut(1500);\n    }\n    /*\n     * DatePicker\n     */\n    $('.datepicker').datepicker({\n        format: 'dd.mm.yyyy'\n    });\n    /*\n     * Sortable items in Create Invoice page\n     */\n    $('.body-items').sortable({\n        handle: '.move-me'\n    });\n    /*\n     * NavBar Border Bottom check\n     */\n    if ($(window).scrollTop() != 0) {\n        $(\".navbar-user\").addClass(\"navbar-scroll-border\");\n    } else {\n        $(\".navbar-user\").removeClass(\"navbar-scroll-border\");\n    }\n});\n/*\n * NavBar Border Bottom check\n */\n$(window).scroll(function () {\n    if ($(this).scrollTop() != 0) {\n        $(\".navbar-user\").addClass(\"navbar-scroll-border\");\n    } else {\n        $(\".navbar-user\").removeClass(\"navbar-scroll-border\");\n    }\n});\n/*\n * Alerts close\n */\n$(document).on(\"click\", \".close-alert\", function () {\n    $('.alert-errors').hide();\n});\n/*\n * Checkbox maturity date in craete invoice page\n */\n$('#maturity-date').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('.maturity-date').show();\n    } else {\n        $('.maturity-date').hide();\n    }\n});\n/*\n * Show Translations\n * When edit invoice we hide translations\n * if user want to show him.. when save the invoice edit\n * we will get choosed translation :)\n */\n$('#show-translations').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('.choose-translation').show();\n    } else {\n        $('.choose-translation').hide();\n    }\n});\n/*\n * Show Translations\n * When edit invoice we hide translations\n * if user want to show him.. when save the invoice edit\n * we will get choosed translation :)\n */\n$('#show-translations-firms').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('.choose-firm-translation').show();\n    } else {\n        $('.choose-firm-translation').hide();\n    }\n});\n/*\n * Change company to individaul and back\n */\n$('#individual-client').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('.client-company').hide();\n        $('.client-individial').show();\n    } else {\n        $('.client-company').show();\n        $('.client-individial').hide();\n        vatRegisteredFieldVisibility();\n    }\n});\n/*\n * Show client vat field for vat registration\n */\n$('#client-vat-registered').change(function () {\n    vatRegisteredFieldVisibility();\n});\n/*\n * Checkbox no vat in craete invoice page\n */\n$('#no-vat').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('.no-vat-container, .the-vat').hide();\n        $('.no-vat-field').show();\n    } else {\n        $('.no-vat-container, .the-vat').show();\n        $('.no-vat-field').hide();\n    }\n});\n/*\n * Add Item in create invoice page\n */\nvar numItemsDefault = 1;\n$('.add-new-item').click(function () {\n    var obj = $('.body-items tr:first').clone(true).insertAfter('tr:last');\n    obj.find('.field').val('').css(\"border-color\", border_color_fields);\n    obj.find('.quantity-field').val('1.00').css(\"border-color\", border_color_fields);\n    obj.find('.price-field').val('0.00').css(\"border-color\", border_color_fields);\n    obj.find('.item-total-price').text('');\n    obj.find('[name=\"item_from_list[]\"]').val('0'); // clear some indicators\n    obj.find('[name=\"is_item_update[]\"]').val('0'); // clear some indicators\n    var selectedOption = $('#selectCurrencyNewInv').find(\":selected\").val();\n    if (!selectedOption) {\n        selectedOption = $('.currency-text').first().text();\n    }\n    obj.find('.item-total-price').append('<span class=\"item-total\">0.00</span> <input type=\"hidden\" class=\"item-total field\" value=\"0.00\" name=\"items_totals[]\"> <span class=\"currency-text\">' + selectedOption + '</span>');\n    $('.body-items .actions').css('display', 'inline-block');\n    numItemsDefault = numItemsDefault + 1;\n    obj.find('.quantity-type select').attr('data-my-id', numItemsDefault);\n    if (createDocument.calculatorStatus == 0) {\n        $('input.item-total, [name=\"invoice_amount\"], [name=\"tax_base\"], [name=\"vat_sum\"], [name=\"final_total\"]').attr('type', 'text');\n\n    }\n});\n/*\n * Remove Item in create invoice page\n */\n$('.delete-item').on(\"click\", function () {\n    $(this).closest('tr').remove();\n    if ($('.body-items tr').length < 2) {\n        $('.body-items .actions').hide();\n    }\n});\n/*\n * Select Currency for new invoice\n * On change we change curreny texts in class currency-text tags\n */\n$('#selectCurrencyNewInv').change(function () {\n    $('.currency-text').text($(this).val());\n    $('.selectpicker').selectpicker('refresh');\n});\n/*\n * Select default currency for company\n */\n$('.selectDefaultCurrency').change(function () {\n    var forId = $(this).data('default-for');\n    var newDefault = $(this).val();\n    $.post(urls.changeDefaultCurrency, {forId: forId, newDefault: newDefault}, function (result) {\n        if (result == '1') {\n            $('.selected-new-default').fadeIn(500).delay(1000).fadeOut(500);\n        } else {\n            $('.not-selected-new-default').fadeIn(500).delay(1000).fadeOut(500);\n        }\n    });\n});\n/*\n * Quantity Type in create invoice page\n * When click create new show dialog box\n * Save new added values\n * Full manage logic is here\n */\nvar myNewQuantityType = false;\nvar whoIAm = 0;\n$('.quantity-type select').change(function () {\n    var selectedValue = $(this).val();\n    whoIAm = $(this).attr('data-my-id');\n    if (selectedValue == 'createNewQuantity') {\n        $('#addQuantityType').modal('show');\n        $('.new-quantity-value').val('');\n        $('.new-quantity-value').css(\"border-color\", border_color_fields);\n        myNewQuantityType = false;\n    }\n    if (selectedValue == '--') {\n        $('[data-my-id=\"' + whoIAm + '\"] option:first').prop(\"selected\", \"selected\");\n    }\n});\n$('.add-my-new-quantity-type').click(function () {\n    var newVal = jQuery.trim($('.new-quantity-value').val());\n    if (newVal != '') {\n        myNewQuantityType = true;\n        $('.quantity-type select').prepend('<option value=\"' + newVal + '\">' + newVal + '</option>');\n        $('[data-my-id=\"' + whoIAm + '\"] option:first').prop(\"selected\", \"selected\");\n        $('#addQuantityType').modal('hide');\n        $.post(urls.addNewQuantityType, {newVal: newVal}, function (result) {});\n    } else {\n        $('.new-quantity-value').css(\"border-color\", border_color_wrong);\n    }\n});\n$('#addQuantityType').on('hidden.bs.modal', function () {\n    if (myNewQuantityType == false) {\n        $('[data-my-id=\"' + whoIAm + '\"] option:first').prop(\"selected\", \"selected\");\n    }\n});\n/*\n * Payment method - add new method\n */\n$('select.payment-method').change(function () {\n    var selectedValue = $(this).val();\n    if (selectedValue == 'createNewMethod') {\n        $('#addPaymentMethod').modal('show');\n        $('.my-new-pay-method').val('');\n        $('.my-new-pay-method').css(\"border-color\", border_color_fields);\n    }\n    if (selectedValue == '--') {\n        $('option', this).first().prop(\"selected\", \"selected\");\n    }\n});\n$('.add-my-new-pay-method').click(function () {\n    var newVal = jQuery.trim($('.my-new-pay-method').val());\n    if (newVal != '') {\n        $('select.payment-method').prepend('<option value=\"' + newVal + '\">' + newVal + '</option>');\n        $('#addPaymentMethod').modal('hide');\n        $.post(urls.addNewPaymentMethod, {newVal: newVal}, function (result) {});\n    } else {\n        $('.my-new-pay-method').css(\"border-color\", border_color_wrong);\n    }\n});\n$('#addPaymentMethod').on('hidden.bs.modal', function () {\n    $('select.payment-method option:first').prop(\"selected\", \"selected\");\n    $('.selectpicker').selectpicker('refresh');\n});\n/*\n * On change some form this html-s :)\n * Call the calculator\n */\n$('.quantity-field, .price-field, .text-discount, .vat-field, #no-vat, #discount-value').change(function () {\n    createInvoiceCalculator();\n});\n/*\n * Invoice type changer\n */\n$('[name=\"inv_type\"]').change(function () {\n    var inv_type = $(this).val();\n    if (inv_type == 'prof') {\n        $('.inv-type-title').text(lang.proforma);\n        $('.inv-type-num').text(lang.proforma);\n        $('.credit-debit-option').hide();\n    }\n    if (inv_type == 'tax_inv') {\n        $('.inv-type-title').text(lang.invoice);\n        $('.inv-type-num').text(lang.invoice);\n        $('.credit-debit-option').hide();\n    }\n    if (inv_type == 'debit') {\n        $('.inv-type-title').text(lang.debit_note);\n        $('.inv-type-num').text(lang.debit_note);\n        $('.credit-debit-option').show();\n    }\n    if (inv_type == 'credit') {\n        $('.inv-type-title').text(lang.credit_note);\n        $('.inv-type-num').text(lang.credit_note);\n        $('.credit-debit-option').show();\n    }\n});\n/*\n * Modal Selector\n */\n$('.choose').click(function () {\n    var modalTitle = $(this).data('choose-title');\n    $('#modalSelector .modal-title').text(modalTitle);\n    var selectorType = $(this).data('selector-type');\n\n    /*\n     * If we click choose in table of items\n     * save this index because we will need after to\n     * add item_from_list[] value to 1\n     */\n    if ($(this).closest('td').parent()[0]) {\n        chooseItemIndex = $(this).closest('td').parent()[0].sectionRowIndex;\n    }\n\n    $.post(urls.modalSelector, {selectType: selectorType},\n            function (htmlList) {\n                $('#modalSelector .modal-body').empty().append(htmlList);\n            });\n    $('#modalSelector').modal('show');\n});\n/*\n * Select vat reason from list\n */\n$('#select-vat-from-list').change(function () {\n    $('[name=\"no_vat_reason\"]').val($(this).val());\n});\n/*\n * Search in modal selector\n */\n$(document).on(\"keyup\", '[name=\"SearchDualList\"]', function (e) {\n    var current_query = $('[name=\"SearchDualList\"]').val();\n    if (current_query !== \"\") {\n        $(\"#modalSelector .list-group li\").hide();\n        $(\"#modalSelector .list-group li\").each(function () {\n            var current_keyword = $(this).text();\n            if (current_keyword.search(current_query) >= 0) {\n                $(this).show();\n            }\n        });\n    } else {\n        $(\".list-group li\").show();\n    }\n});\n/*\n * If we are on invoice preview page\n * Add pages segments\n */\nif ($('.invoice-box').length) {\n    var invoice_box = $('.invoice-box');\n    var num_parts = parseInt(invoice_box.height() / pixelsPdfDelivery);\n    var i = 1;\n    var position = 0;\n    while (i <= num_parts) {\n        var newDelivery = $('.pageDelivery').last().clone().insertAfter('.pageDelivery:last');\n        var position = position + pixelsPdfDelivery;\n        newDelivery.css('top', position).removeClass('hidden').addClass('clone-delivery');\n        i++;\n    }\n}\n/*\n * if check checkbox {check-all-boxes}\n * lets check all boxes with class check-me-now :)\n */\n$(\".check-all-boxes\").change(function () {\n    if (this.checked) {\n        $('.check-me-now').prop(\"checked\", true);\n    } else {\n        $('.check-me-now').prop(\"checked\", false);\n    }\n});\n/*\n * .list-action buttons call action like delete, send\n * for all selected elements in list\n */\n$('.list-action').click(function () {\n    var action = $(this).data('action-type');\n    $('[name=\"action\"]').val(action);\n    var num_checked = $(\".check-me-now:checked\").length;\n    if (num_checked == 0) {\n        showError(lang.noCheckedCheckboxes);\n        return;\n    }\n    if (action == 'delete') {\n        var the_message = lang.confirmDelete;\n    }\n    if (action == 'stat_canceled') {\n        var the_message = lang.confirmCancel;\n    }\n    if (action == 'remove_canceled') {\n        var the_message = lang.confirmRemoveCancel;\n    }\n    bootbox.confirm({\n        message: the_message,\n        buttons: {\n            confirm: {\n                label: 'Yes',\n                className: 'btn-success'\n            },\n            cancel: {\n                label: 'No',\n                className: 'btn-danger'\n            }\n        },\n        callback: function (result) {\n            if (result) {\n                document.getElementById('action-form').submit();\n            }\n        }\n    });\n});\n/*\n * Change invoices payment status\n */\nvar parent_div_statuses;\n$('.show-pay-statuses').click(function () { // show statuses\n    parent_div_statuses = $(this);\n    $('#payment-statuses').show().appendTo($(this).parents('.status-changer'));\n});\n$('.change-pay-status').click(function () { // ajax change status\n    var new_pay_status = $(this).data('new-pay-status');\n    var new_pay_status_text = $(this).text();\n    var to_inv_id = parent_div_statuses.data('inv-id');\n    parent_div_statuses.find('.new_pay_status_text').text(new_pay_status_text);\n    parent_div_statuses.parents('.status-changer').removeClass().addClass('txt_status_' + new_pay_status + ' status-changer');\n    $('#payment-statuses').hide();\n    $.post(urls.changeInvoiceStatus, {invId: to_inv_id, newStatus: new_pay_status}, function (result) {\n        if (result != '1') {\n            showError(lang.errorChangeInvStatusAjax);\n        }\n    });\n});\n/*\n * Top search form\n */\n$('.top-search-form .field').keyup(function () {\n    var search_phrase = jQuery.trim($(this).val());\n    if (search_phrase != '') {\n        $('.top-search-form .fa-spinner').show();\n        $('.top-search-form .spray-search').hide();\n        $.post(urls.topNavSearch, {search: search_phrase}, function (result) {\n            $('#topSearchResults').empty().hide();\n            $('.top-search-form .fa-spinner').hide();\n            $('.top-search-form .spray-search').show();\n            $('#topSearchResults').append(result).show();\n        });\n    } else {\n        $('#topSearchResults').empty().hide();\n    }\n});\n/*\n * when export if check export all\n * disable input fields\n */\n$('[name=\"export_all\"]').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('[name=\"from_date\"]').attr('disabled', true);\n        $('[name=\"to_date\"]').attr('disabled', true);\n    } else {\n        $('[name=\"from_date\"]').attr('disabled', false);\n        $('[name=\"to_date\"]').attr('disabled', false);\n    }\n});\n/*\n * Store movements type\n */\n$('.movement-type').change(function () {\n    var movement_type = $(this).val();\n    if (movement_type == 'in') {\n        $('.label-from-client').removeClass('hidden');\n        $('.label-to-client').addClass('hidden');\n\n        $('.label-from-store').addClass('hidden');\n        $('.label-to-store').removeClass('hidden');\n\n        $('.movement-for-client').show();\n        $('.to-store-movement').addClass('hidden');\n    }\n    if (movement_type == 'out') {\n        $('.label-from-client').addClass('hidden');\n        $('.label-to-client').removeClass('hidden');\n\n        $('.label-from-store').removeClass('hidden');\n        $('.label-to-store').addClass('hidden');\n\n        $('.movement-for-client').show();\n        $('.to-store-movement').addClass('hidden');\n    }\n\n    if (movement_type == 'move') {\n        $('.movement-for-client').hide();\n        $('.label-from-store').removeClass('hidden');\n        $('.label-to-store').addClass('hidden');\n        $('.to-store-movement').removeClass('hidden');\n    }\n\n    if (movement_type == 'revision') {\n        $('.movement-for-client').hide();\n        $('.label-from-store').removeClass('hidden');\n        $('.label-to-store').addClass('hidden');\n        $('.to-store-movement').addClass('hidden');\n    }\n});\n/*\n * Choose saved condition \n * When create warranty\n */\n$('.saved-condition').change(function () {\n    var selected_condition = $(this).val();\n    var description_text = $('[data-saved-condition=\"' + selected_condition + '\"]').text();\n    $('[name=\"conditions\"]').empty().append(description_text);\n});\n/*\n * Choose saved contracts \n * When create protocols\n */\n$('.saved-contract').change(function () {\n    var selected = $(this).val();\n    var description_text = $('[data-saved-contract=\"' + selected + '\"]').text();\n    $('[name=\"contract\"]').empty().append(description_text);\n});\n/*\n * Choose saved contracts \n * When create protocols\n */\n$('.saved-prov-trans').change(function () {\n    var selected = $(this).val();\n    var description_text = $('[data-saved-prov-trans=\"' + selected + '\"]').text();\n    $('[name=\"provider_trasmit\"]').empty().append(description_text);\n});\n/*\n * Firm vat registration field show/hide\n */\n$('[name=\"is_vat_registered\"]').change(function () {\n    if ($(this).is(\":checked\")) {\n        $('.firm-vat-number').removeClass('hidden');\n    } else {\n        $('.firm-vat-number').addClass('hidden');\n    }\n});\n/*\n * Main menu button \n * Show/Hide text for opened and hidden\n */\n$('#btn-show-main-menu').click(function () {\n    $(\"#main-menu\").on(\"hide.bs.collapse\", function () {\n        $('#btn-show-main-menu').text(lang.show_main_menu);\n    });\n    $(\"#main-menu\").on(\"show.bs.collapse\", function () {\n        $('#btn-show-main-menu').text(lang.hide_main_menu);\n    });\n})\n/*\n * Create draft invoice\n */\nfunction createDraft() {\n    $('[name=\"status\"]').val('draft');\n    createNewInvValidate();\n}\n/*\n * Create Invoice form validation\n */\nfunction createNewInvValidate() {\n    var valid = true;\n    var validItems = true;\n\n    $('[name=\"client_name\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"client_address\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"inv_number\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"date_create\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"date_tax_event\"]').css(\"border-color\", border_color_fields);\n    var client_name = $('[name=\"client_name\"]').val();\n    var client_address = $('[name=\"client_address\"]').val();\n    var date_create = $('[name=\"date_create\"]').val();\n    var date_tax_event = $('[name=\"date_tax_event\"]').val();\n    var inv_number = $('[name=\"inv_number\"]').val();\n    if ($('[name=\"inv_type\"]:checked').val() == 'debit' || $('[name=\"inv_type\"]:checked').val() == 'credit') {\n        $('[name=\"to_inv_number\"]').css(\"border-color\", border_color_fields);\n        $('[name=\"to_inv_date\"]').css(\"border-color\", border_color_fields);\n        var to_inv_number = $('[name=\"to_inv_number\"]').val();\n        var to_inv_date = $('[name=\"to_inv_date\"]').val();\n        if ($.trim(to_inv_number).length == 0) {\n            $('[name=\"to_inv_number\"]').css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n        if ($.trim(to_inv_date).length == 0) {\n            $('[name=\"to_inv_date\"]').css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n    }\n    if ($.trim(client_name).length == 0) {\n        $('[name=\"client_name\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if ($.trim(client_address).length == 0) {\n        $('[name=\"client_address\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if ($.trim(date_create).length == 0) {\n        $('[name=\"date_create\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if ($.trim(date_tax_event).length == 0) {\n        $('[name=\"date_tax_event\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if ($.trim(inv_number).length == 0) {\n        $('[name=\"inv_number\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    validItems = validateItems();\n    if (validItems == false) {\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('setInvoiceForm').submit();\n    } else {\n        /*\n         * Return to some default values\n         * who is changed from submit buttons\n         */\n        $('[name=\"status\"]').val('issued');\n        $('html, body').animate({\n            scrollTop: $(\"#setInvoiceForm\").offset().top\n        }, 1000);\n        showError(lang.errorCreateDocument);\n    }\n}\n/*\n * Store movement validator\n */\nfunction validateStoreMovement() {\n    var valid = true;\n    var validItems = true;\n    validItems = validateItems();\n    if (validItems == false) {\n        valid = false;\n    }\n\tvar selectedStore = $('[name=\"selected_store\"]').val(); \n\tif(!selectedStore) {\n\t\tvalid = false;\n\t\t$('.store-selector button.btn-default').css(\"border-color\", \"red\");\n\t}\n    if (valid == true) {\n        document.getElementById('setMovementForm').submit();\n    } else {\n        /*\n         * Return to some default values\n         * who is changed from submit buttons\n         */\n        $('[name=\"status\"]').val('issued');\n        $('html, body').animate({\n            scrollTop: $(\"#setMovementForm\").offset().top\n        }, 1000);\n        showError(lang.errorCreateDocument);\n    }\n}\n/*\n * Create warranty validator\n */\nfunction validateWarranty() {\n    var valid = true;\n    var validItems = true;\n    validItems = validateWarrantyItems();\n    if (validItems == false) {\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('setWarrantyForm').submit();\n    } else {\n        $('html, body').animate({\n            scrollTop: $(\"#setWarrantyForm\").offset().top\n        }, 1000);\n        showError(lang.errorCreateDocument);\n    }\n}\nfunction validateWarrantyItems() {\n    var valid = true;\n    $('.body-items tr').each(function () {\n        $('.field-item-name', this).css(\"border-color\", border_color_fields);\n        $('.field-item-months', this).css(\"border-color\", border_color_fields);\n        var item_name = $('.field-item-name', this).val();\n        var items_months = $('.field-item-months', this).val();\n        if (!pattern_sums.test(items_months) || $.trim(items_months).length == 0 || items_months <= 0) {\n            $('.field-item-months', this).css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n        if ($.trim(item_name).length == 0) {\n            $('.field-item-name', this).css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n    });\n    if (valid == false) {\n        return false;\n    }\n    return true;\n}\n/*\n * Add items validation\n */\nfunction validateItems() {\n    var valid = true;\n    $('.body-items tr').each(function () {\n        $('.quantity-field', this).css(\"border-color\", border_color_fields);\n        $('.field-item-name', this).css(\"border-color\", border_color_fields);\n        var item_quantity = $('.quantity-field', this).val();\n        var item_name = $('.field-item-name', this).val();\n        if (!pattern_sums.test(item_quantity) || $.trim(item_quantity).length == 0 || item_quantity <= 0) {\n            $('.quantity-field', this).css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n        if ($.trim(item_name).length == 0) {\n            $('.field-item-name', this).css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n    });\n    if (valid == false) {\n        return false;\n    }\n    return true;\n}\n/*\n * Show alert box\n */\nfunction showError(text) {\n    $(document.body).append(alertBoxHtml.replace('%output%', text));\n    $('.alert-errors').css('position', 'fixed').delay(4000).fadeOut(1500);\n}\n/*\n * Add new currency validator\n */\nfunction addNewCurrency() {\n    var valid = true;\n    var name = $('#formAddCurrency .c-name').val();\n    var value = $('#formAddCurrency .c-value').val();\n    name = $.trim(name);\n    value = $.trim(value);\n    if (name.length == 0) {\n        $('#formAddCurrency .c-name').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (value.length == 0) {\n        $('#formAddCurrency .c-value').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddCurrency').submit();\n    }\n}\n/*\n * Add new quantity type validator\n */\nfunction addNewQuantityType() {\n    var valid = true;\n    var name = $('[name=\"quantityTypeName\"]').val();\n    name = $.trim(name);\n    if (name.length == 0) {\n        $('[name=\"quantityTypeName\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddQuantityType').submit();\n    }\n}\n/*\n * Add new payment method validator\n */\nfunction addNewPaymentMethod() {\n    var valid = true;\n    var name = $('[name=\"paymentMethodName\"]').val();\n    name = $.trim(name);\n    if (name.length == 0) {\n        $('[name=\"paymentMethodName\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddPaymentMethod').submit();\n    }\n}\n/*\n * Add new no vat reason validator\n */\nfunction addNewNoVatReason() {\n    var valid = true;\n    var name = $('[name=\"noVatReason\"]').val();\n    name = $.trim(name);\n    if (name.length == 0) {\n        $('[name=\"noVatReason\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddNoVatReason').submit();\n    }\n}\n/*\n * Add new store validator\n */\nfunction addNewStore() {\n    var valid = true;\n    var name = $('[name=\"newStore\"]').val();\n    name = $.trim(name);\n    if (name.length == 0) {\n        $('[name=\"newStore\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddStore').submit();\n    }\n}\n/*\n * Create Invoice Calculator\n * Sum Items prices\n * Sum Vat %/Currency\n * Sum Discount\n * We will use math.js library\n * createDocument variable is initialized in calculator used pages\n */\nfunction createInvoiceCalculator() {\n    // if is enabled calculator\n    if (createDocument.calculatorStatus == 1) {\n        // Sum item by item\n        var items_total = 0.00;\n        $('.body-items tr').each(function () {\n            $('.quantity-field', this).css(\"border-color\", border_color_fields);\n            $('.price-field', this).css(\"border-color\", border_color_fields);\n            var item_quantity = $('.quantity-field', this).val();\n            var item_price = $('.price-field', this).val();\n            var is_valid = true;\n            if (!pattern_sums.test(item_quantity)) {\n                $('.quantity-field', this).css(\"border-color\", border_color_wrong);\n                is_valid = false;\n            }\n            if (!pattern_sums.test(item_price)) {\n                $('.price-field', this).css(\"border-color\", border_color_wrong);\n                is_valid = false;\n            }\n            if (is_valid == true) {\n                var item_total = math.multiply(item_quantity, item_price).toFixed(createDocument.rountTo);\n                $('.item-total', this).text(item_total);\n                $('.item-total', this).val(item_total);\n                items_total = math.add(items_total, item_total).toFixed(createDocument.rountTo);\n            }\n        });\n        $('#items-total').text(items_total);\n        $('.items-total').val(items_total);\n        // Tax base after discount\n        var discount_type = $('#discount-value option:selected').val();\n        var discount_value = $('.text-discount').val();\n        if (pattern_sums.test(discount_value)) {\n            $('.text-discount').css(\"border-color\", border_color_fields);\n            if (discount_type == '%') {\n                var tax_base = math.subtract(items_total, math.multiply(items_total, math.divide(discount_value, 100))).toFixed(createDocument.rountTo);\n            } else {\n                var tax_base = math.subtract(items_total, discount_value).toFixed(createDocument.rountTo);\n            }\n            $('#tax-base').text(tax_base);\n            $('.tax-base').val(tax_base);\n        } else {\n            $('.text-discount').css(\"border-color\", border_color_wrong);\n        }\n        // Get vat \n        var final_sum = tax_base;\n        if (!$('#no-vat').is(\":checked\")) {\n            var vat_percent = $('.vat-field').val();\n            if (pattern_sums.test(vat_percent)) {\n                $('.vat-field').css(\"border-color\", border_color_fields);\n                var vat_sum = math.multiply(math.divide(tax_base, 100), vat_percent).toFixed(createDocument.rountTo);\n                $('#vat-sum').text(vat_sum);\n                $('.vat-sum').val(vat_sum);\n                final_sum = math.add(tax_base, vat_sum).toFixed(createDocument.rountTo);\n            } else {\n                $('.vat-field').css(\"border-color\", border_color_wrong);\n            }\n        }\n        // Set final sum\n        $('#final-total').text(final_sum);\n        $('.final-total').val(final_sum);\n    }\n}\n/*\n * Verify that filed for round totals is not empty\n */\nfunction updateRoundTotals() {\n    var pattern = /^[0-9]+$/;\n    var valid = true;\n    var name = $('.optRoundTo').val();\n    name = $.trim(name);\n    if (name.length == 0 || !pattern.test(name)) {\n        $('[name=\"opt_invRoundTo\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formRoundTotals').submit();\n    }\n}\n/*\n * Verifi that translation no have empty fields\n * Submit form and add to db\n */\nfunction saveNewTranslation() {\n    $('.field-new-translate').css(\"border-color\", border_color_fields);\n    var valid = true;\n    $('.field-new-translate').each(function (index) {\n        var translate = $(this).val();\n        translate = $.trim(translate);\n        if (translate.length == 0) {\n            $(this).css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n    });\n    if (valid == true) {\n        document.getElementById('formAddNewTranslate').submit();\n    }\n}\n/*\n * When click client from list\n * parse object and fill fields\n */\nfunction getClient(id) {\n    $('[name=\"client_from_list\"]').val(1);\n    $('[name=\"client_name\"]').val(clients[id].client_name);\n    $('[name=\"client_bulstat\"]').val(clients[id].client_bulstat);\n    if (clients[id].is_to_person == '1') {\n        $('[name=\"is_to_person\"]').prop(\"checked\", true);\n        $('.client-company').hide();\n        $('.client-individial').show();\n    } else {\n        $('[name=\"is_to_person\"]').prop(\"checked\", false);\n        $('.client-company').show();\n        $('.client-individial').hide();\n    }\n    if (clients[id].client_vat_registered == '1') {\n        $('[name=\"client_vat_registered\"]').prop(\"checked\", true);\n        $('.client-vat-registered').show();\n    } else {\n        $('.client-vat-registered').hide();\n    }\n    $('[name=\"client_city\"]').val(clients[id].client_city);\n    $('[name=\"client_country\"]').val(clients[id].client_country);\n    $('[name=\"accountable_person\"]').val(clients[id].accountable_person);\n    $('[name=\"client_address\"]').val(clients[id].client_address);\n    $('[name=\"recipient_name\"]').val(clients[id].recipient_name);\n    $('[name=\"client_ident_num\"]').val(clients[id].client_ident_num);\n    $('[name=\"vat_number\"]').val(clients[id].vat_number);\n    $('#modalSelector').modal('hide');\n}\n/*\n * When click item from list\n * parse object and fill fields\n */\nfunction getItem(id) {\n    $('[name=\"item_from_list[]\"]:eq(' + chooseItemIndex + ')').val(items[id].id);\n    $('[name=\"items_names[]\"]:eq(' + chooseItemIndex + ')').val(items[id].name);\n    $('[name=\"items_prices[]\"]:eq(' + chooseItemIndex + ')').val(items[id].single_price);\n    if ($('[name=\"items_quantity_types[]\"]:eq(' + chooseItemIndex + ') option[value=\"' + items[id].quantity_type + '\"]').length <= 0) {\n        $('[name=\"items_quantity_types[]\"]:eq(' + chooseItemIndex + ')').prepend('<option value=\"' + items[id].quantity_type + '\">' + items[id].quantity_type + '</option>');\n    }\n    $('[name=\"items_quantity_types[]\"]:eq(' + chooseItemIndex + ')').val(items[id].quantity_type);\n    var selectedCurrency = $('#selectCurrencyNewInv').val();\n    // typeof checking is because in some fileds we do not use currency\n    if (typeof selectedCurrency !== \"undefined\" && selectedCurrency != items[id].currency) {\n        showError(lang.currencyItemNotSame + ' - ' + items[id].currency);\n    }\n    $('#modalSelector').modal('hide');\n    createInvoiceCalculator();\n}\n/*\n * Vat field visibility check\n */\nfunction vatRegisteredFieldVisibility() {\n    if ($('#client-vat-registered').is(\":checked\")) {\n        $('.client-vat-registered').show();\n    } else {\n        $('.client-vat-registered').hide();\n    }\n}\n/*\n * When create/update client\n * Validate him\n */\nfunction newClientValidate() {\n    var valid = true;\n    $('[name=\"client_name\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"client_address\"]').css(\"border-color\", border_color_fields);\n    var client_name = $('[name=\"client_name\"]').val();\n    var client_address = $('[name=\"client_address\"]').val();\n    if ($.trim(client_name).length == 0) {\n        $('[name=\"client_name\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if ($.trim(client_address).length == 0) {\n        $('[name=\"client_address\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('setNewClient').submit();\n    } else {\n        $('html, body').animate({\n            scrollTop: $(\"#setNewClient\").offset().top\n        }, 1000);\n        showError(lang.errorCreateClient);\n    }\n}\n/*\n * When create/update item\n * Validate him\n */\nfunction newItemValidate() {\n    var valid = true;\n    $('[name=\"name\"]').css(\"border-color\", border_color_fields);\n    var item_name = $('[name=\"name\"]').val();\n    if ($.trim(item_name).length == 0) {\n        $('[name=\"name\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('setNewItem').submit();\n    } else {\n        showError(lang.errorCreateItem);\n    }\n}\n/*\n * When create/update employee\n * Validate him\n */\nfunction newEmployeeValidate() {\n    var valid = true;\n    $('[name=\"email\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"password\"]').css(\"border-color\", border_color_fields);\n    var emp_email = $('[name=\"email\"]').val();\n    if ($.trim(emp_email).length == 0) {\n        $('[name=\"email\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    } else {\n        if (!pattern_email.test(emp_email)) {\n            $('[name=\"email\"]').css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n    }\n    if (opt.passReq == 1) {\n        var emp_pass = $('[name=\"password\"]').val();\n        if ($.trim(emp_pass).length == 0) {\n            $('[name=\"password\"]').css(\"border-color\", border_color_wrong);\n            valid = false;\n        }\n    }\n    if (valid == true) {\n        document.getElementById('setNewEmployee').submit();\n    } else {\n        showError(lang.errorCreateEmployee);\n    }\n}\n/*\n * Validation add warranty conditions\n */\nfunction addNewWarrantyCondition() {\n    var valid = true;\n    var condition = $('[name=\"condition\"]').val();\n    condition = $.trim(condition);\n    var condition_title = $('[name=\"conditionTitle\"]').val();\n    condition_title = $.trim(condition_title);\n    if (condition_title.length == 0) {\n        $('[name=\"conditionTitle\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (condition.length == 0) {\n        $('[name=\"condition\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddWarrantyCondition').submit();\n    }\n}\n/*\n * Open preview warranty descriptions\n */\nfunction openConditionDescription(id) {\n    var description_text = $('[data-descr-id=\"' + id + '\"]').text();\n    $('#modalDescriptionExplain .modal-body').empty().append(description_text);\n}\n/*\n * Create protocol validator\n */\nfunction createNewProtocolValidate() {\n    var valid = true;\n    var validItems = true;\n    $('[name=\"client_name\"]').css(\"border-color\", border_color_fields);\n\n    var client_name = $('[name=\"client_name\"]').val();\n    if ($.trim(client_name).length == 0) {\n        $('[name=\"client_name\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    validItems = validateItems();\n    if (validItems == false) {\n        valid = false;\n    }\n    if (valid == false) {\n        $('html, body').animate({\n            scrollTop: $(\"#setProtocol\").offset().top\n        }, 1000);\n        showError(lang.errorCreateDocument);\n    }\n    if (valid == true) {\n        document.getElementById('setProtocol').submit();\n    }\n}\n/*\n * Validation add provider transmit\n */\nfunction addNewProviderTransmitText() {\n    var valid = true;\n    var description = $('[name=\"description\"]').val();\n    description = $.trim(description);\n    var title = $('[name=\"title\"]').val();\n    title = $.trim(title);\n    if (title.length == 0) {\n        $('[name=\"title\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (description.length == 0) {\n        $('[name=\"description\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formAddProviderTransmitText').submit();\n    }\n}\n/*\n * Open provider transmit description\n */\nfunction openProviderTransmitDescription(id) {\n    var description_text = $('[data-descr-id=\"' + id + '\"]').text();\n    $('#modalDescriptionExplain .modal-body').empty().append(description_text);\n}\n/*\n * Open contract description\n */\nfunction openContractDescription(id) {\n    var description_text = $('[data-contr-id=\"' + id + '\"]').text();\n    $('#modalDescriptionExplain .modal-body').empty().append(description_text);\n}\n/*\n * Validation contract texts add\n */\nfunction addNewContractText() {\n    var valid = true;\n    var description = $('[name=\"contract\"]').val();\n    description = $.trim(description);\n    var title = $('[name=\"title_contract\"]').val();\n    title = $.trim(title);\n    if (title.length == 0) {\n        $('[name=\"title_contract\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (description.length == 0) {\n        $('[name=\"contract\"]').css(\"border-color\", border_color_wrong);\n        valid = false;\n    }\n    if (valid == true) {\n        document.getElementById('formContractText').submit();\n    }\n}\n/*\n * Remove firm logo when edit firm\n */\nfunction removeFirmLogo() {\n    $('[name=\"old_image\"]').val('');\n    $('.firm-image-container').remove();\n    $('.remove-firm-logo-btn').remove();\n}\n/*\n * Validate and submit form for\n * custom plan request\n */\nfunction makePlanRequest() {\n    var submit = true;\n    $('[name=\"inv_per_month\"]').css(\"border-color\", border_color_fields);\n    $('[name=\"want_companies\"]').css(\"border-color\", border_color_fields);\n    var inv_per_month = parseInt($('[name=\"inv_per_month\"]').val());\n    var want_companies = parseInt($('[name=\"want_companies\"]').val());\n    if (inv_per_month == 0 || isNaN(inv_per_month)) {\n        $('[name=\"inv_per_month\"]').css(\"border-color\", border_color_wrong);\n        submit = false;\n    }\n    if (want_companies == 0 || isNaN(want_companies)) {\n        $('[name=\"want_companies\"]').css(\"border-color\", border_color_wrong);\n        submit = false;\n    }\n    if (submit == true) {\n        document.getElementById(\"formMakePlanReq\").submit();\n    }\n}\n/*\n * Make direct bank payments to paypal\n */\nfunction makeBankPayment() {\n    $.ajax({\n        type: \"POST\",\n        url: \"http://in.dev/bankpayment\",\n        data: {posta:'aa'}\n    }).done(function (data) {\n      \n    }).fail(function (err) {\n       \n    }).always(function () { \n    });\n}\n"
  },
  {
    "path": "database.sql",
    "content": "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\nSET time_zone = \"+00:00\";\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8mb4 */;\n\n\nCREATE TABLE `admin_users` (\n  `id` int(10) UNSIGNED NOT NULL,\n  `name` varchar(80) NOT NULL,\n  `username` varchar(50) NOT NULL,\n  `password` varchar(32) NOT NULL,\n  `email` varchar(100) NOT NULL,\n  `image` varchar(255) DEFAULT NULL,\n  `registered` int(11) NOT NULL,\n  `last_login` int(11) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `admin_users` (`id`, `name`, `username`, `password`, `email`, `image`, `registered`, `last_login`) VALUES\n(1, 'Kiril Kirkov', 'admin', '21232f297a57a5a743894a0e4a801fc3', 'admin@admin.admin', '16427489_1341882885869514_8248047917573720528_n2.jpg', 0, 1516633925);\n\nCREATE TABLE `clients` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `client_name` varchar(255) NOT NULL,\n  `client_bulstat` varchar(50) NOT NULL,\n  `is_to_person` tinyint(1) NOT NULL,\n  `client_vat_registered` tinyint(1) NOT NULL,\n  `vat_number` varchar(50) NOT NULL,\n  `client_ident_num` varchar(50) NOT NULL,\n  `client_address` varchar(500) NOT NULL,\n  `client_city` varchar(80) NOT NULL,\n  `client_country` varchar(80) NOT NULL,\n  `accountable_person` varchar(200) NOT NULL COMMENT 'MOL',\n  `recipient_name` varchar(80) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `currencies` (\n  `id` int(11) NOT NULL,\n  `value` varchar(10) NOT NULL,\n  `name` varchar(50) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `currencies` (`id`, `value`, `name`) VALUES\n(1, 'ALL', 'Albania Lek'),\n(2, 'AFN', 'Afghanistan Afghani'),\n(3, 'ARS', 'Argentina Peso'),\n(4, 'AWG', 'Aruba Guilder'),\n(5, 'AUD', 'Australia Dollar'),\n(6, 'AZN', 'Azerbaijan New Manat'),\n(7, 'BSD', 'Bahamas Dollar'),\n(8, 'BBD', 'Barbados Dollar'),\n(9, 'BDT', 'Bangladeshi taka'),\n(10, 'BYR', 'Belarus Ruble'),\n(11, 'BZD', 'Belize Dollar'),\n(12, 'BMD', 'Bermuda Dollar'),\n(13, 'BOB', 'Bolivia Boliviano'),\n(14, 'BAM', 'Bosnia and Herzegovina Convertible Marka'),\n(15, 'BWP', 'Botswana Pula'),\n(16, 'BGN', 'Bulgaria Lev'),\n(17, 'BRL', 'Brazil Real'),\n(18, 'BND', 'Brunei Darussalam Dollar'),\n(19, 'KHR', 'Cambodia Riel'),\n(20, 'CAD', 'Canada Dollar'),\n(21, 'KYD', 'Cayman Islands Dollar'),\n(22, 'CLP', 'Chile Peso'),\n(23, 'CNY', 'China Yuan Renminbi'),\n(24, 'COP', 'Colombia Peso'),\n(25, 'CRC', 'Costa Rica Colon'),\n(26, 'HRK', 'Croatia Kuna'),\n(27, 'CUP', 'Cuba Peso'),\n(28, 'CZK', 'Czech Republic Koruna'),\n(29, 'DKK', 'Denmark Krone'),\n(30, 'DOP', 'Dominican Republic Peso'),\n(31, 'XCD', 'East Caribbean Dollar'),\n(32, 'EGP', 'Egypt Pound'),\n(33, 'SVC', 'El Salvador Colon'),\n(34, 'EEK', 'Estonia Kroon'),\n(35, 'EUR', 'Euro Member Countries'),\n(36, 'FKP', 'Falkland Islands (Malvinas) Pound'),\n(37, 'FJD', 'Fiji Dollar'),\n(38, 'GHC', 'Ghana Cedis'),\n(39, 'GIP', 'Gibraltar Pound'),\n(40, 'GTQ', 'Guatemala Quetzal'),\n(41, 'GGP', 'Guernsey Pound'),\n(42, 'GYD', 'Guyana Dollar'),\n(43, 'HNL', 'Honduras Lempira'),\n(44, 'HKD', 'Hong Kong Dollar'),\n(45, 'HUF', 'Hungary Forint'),\n(46, 'ISK', 'Iceland Krona'),\n(47, 'INR', 'India Rupee'),\n(48, 'IDR', 'Indonesia Rupiah'),\n(49, 'IRR', 'Iran Rial'),\n(50, 'IMP', 'Isle of Man Pound'),\n(51, 'ILS', 'Israel Shekel'),\n(52, 'JMD', 'Jamaica Dollar'),\n(53, 'JPY', 'Japan Yen'),\n(54, 'JEP', 'Jersey Pound'),\n(55, 'KZT', 'Kazakhstan Tenge'),\n(56, 'KPW', 'Korea (North) Won'),\n(57, 'KRW', 'Korea (South) Won'),\n(58, 'KGS', 'Kyrgyzstan Som'),\n(59, 'LAK', 'Laos Kip'),\n(60, 'LVL', 'Latvia Lat'),\n(61, 'LBP', 'Lebanon Pound'),\n(62, 'LRD', 'Liberia Dollar'),\n(63, 'LTL', 'Lithuania Litas'),\n(64, 'MKD', 'Macedonia Denar'),\n(65, 'MYR', 'Malaysia Ringgit'),\n(66, 'MUR', 'Mauritius Rupee'),\n(67, 'MXN', 'Mexico Peso'),\n(68, 'MNT', 'Mongolia Tughrik'),\n(69, 'MZN', 'Mozambique Metical'),\n(70, 'NAD', 'Namibia Dollar'),\n(71, 'NPR', 'Nepal Rupee'),\n(72, 'ANG', 'Netherlands Antilles Guilder'),\n(73, 'NZD', 'New Zealand Dollar'),\n(74, 'NIO', 'Nicaragua Cordoba'),\n(75, 'NGN', 'Nigeria Naira'),\n(76, 'NOK', 'Norway Krone'),\n(77, 'OMR', 'Oman Rial'),\n(78, 'PKR', 'Pakistan Rupee'),\n(79, 'PAB', 'Panama Balboa'),\n(80, 'PYG', 'Paraguay Guarani'),\n(81, 'PEN', 'Peru Nuevo Sol'),\n(82, 'PHP', 'Philippines Peso'),\n(83, 'PLN', 'Poland Zloty'),\n(84, 'QAR', 'Qatar Riyal'),\n(85, 'RON', 'Romania New Leu'),\n(86, 'RUB', 'Russia Ruble'),\n(87, 'SHP', 'Saint Helena Pound'),\n(88, 'SAR', 'Saudi Arabia Riyal'),\n(89, 'RSD', 'Serbia Dinar'),\n(90, 'SCR', 'Seychelles Rupee'),\n(91, 'SGD', 'Singapore Dollar'),\n(92, 'SBD', 'Solomon Islands Dollar'),\n(93, 'SOS', 'Somalia Shilling'),\n(94, 'ZAR', 'South Africa Rand'),\n(95, 'LKR', 'Sri Lanka Rupee'),\n(96, 'SEK', 'Sweden Krona'),\n(97, 'CHF', 'Switzerland Franc'),\n(98, 'SRD', 'Suriname Dollar'),\n(99, 'SYP', 'Syria Pound'),\n(100, 'TWD', 'Taiwan New Dollar'),\n(101, 'THB', 'Thailand Baht'),\n(102, 'TTD', 'Trinidad and Tobago Dollar'),\n(103, 'TRY', 'Turkey Lira'),\n(104, 'TRL', 'Turkey Lira'),\n(105, 'TVD', 'Tuvalu Dollar'),\n(106, 'UAH', 'Ukraine Hryvna'),\n(107, 'GBP', 'United Kingdom Pound'),\n(108, 'USD', 'United States Dollar'),\n(109, 'UYU', 'Uruguay Peso'),\n(110, 'UZS', 'Uzbekistan Som'),\n(111, 'VEF', 'Venezuela Bolivar'),\n(112, 'VND', 'Viet Nam Dong'),\n(113, 'YER', 'Yemen Rial'),\n(114, 'ZWD', 'Zimbabwe Dollar');\n\nCREATE TABLE `cusom_plan_requests` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `invoices` int(10) UNSIGNED NOT NULL,\n  `companies` int(10) UNSIGNED NOT NULL,\n  `status` tinyint(3) UNSIGNED NOT NULL COMMENT '0new, 1rejected, 2added_to_individual_plans',\n  `time` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `employees` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `email` varchar(250) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `phone` varchar(100) NOT NULL,\n  `schiffer` varchar(100) NOT NULL,\n  `password` varchar(100) NOT NULL,\n  `time_added` int(11) NOT NULL,\n  `firms_access` varchar(200) NOT NULL,\n  `enabled` tinyint(1) NOT NULL DEFAULT '1'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `employees_permissions` (\n  `id` int(11) NOT NULL,\n  `for_employee` int(11) NOT NULL,\n  `perm` varchar(50) NOT NULL,\n  `role` tinyint(1) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `firms_payment_requests` (\n  `id` int(11) NOT NULL,\n  `for_user` int(11) NOT NULL,\n  `req_num` int(11) NOT NULL,\n  `payment_type` varchar(50) NOT NULL,\n  `plan_type` varchar(50) NOT NULL,\n  `plan_period` int(10) UNSIGNED NOT NULL COMMENT 'in months',\n  `date_generated` int(11) NOT NULL,\n  `date_activated` int(10) UNSIGNED NOT NULL,\n  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0new, 1rejected, 2activated'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `firms_plans` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `from_date` int(11) NOT NULL,\n  `to_date` int(11) NOT NULL,\n  `plan_type` varchar(50) NOT NULL,\n  `num_invoices` int(11) NOT NULL,\n  `num_firms` int(11) NOT NULL,\n  `time` int(10) UNSIGNED NOT NULL COMMENT 'time added',\n  `sponsored` tinyint(1) NOT NULL DEFAULT '0'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `firms_translations` (\n  `id` int(11) NOT NULL,\n  `for_firm` int(10) UNSIGNED NOT NULL COMMENT 'firm id',\n  `name` varchar(500) NOT NULL,\n  `address` varchar(1000) NOT NULL,\n  `city` varchar(250) NOT NULL,\n  `mol` varchar(100) NOT NULL,\n  `image` varchar(500) DEFAULT NULL,\n  `trans_name` varchar(100) NOT NULL COMMENT 'for internally usage',\n  `is_default` tinyint(1) NOT NULL DEFAULT '0'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `firms_users` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL COMMENT 'user id',\n  `bulstat` varchar(100) NOT NULL,\n  `is_vat_registered` tinyint(1) NOT NULL DEFAULT '0',\n  `vat_number` varchar(50) NOT NULL,\n  `default_currency` varchar(10) DEFAULT NULL,\n  `show_logo` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Show logo in invoices',\n  `is_default` tinyint(1) NOT NULL DEFAULT '0',\n  `is_deleted` tinyint(1) NOT NULL DEFAULT '0'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `history` (\n  `id` int(10) UNSIGNED NOT NULL,\n  `user_id` int(11) DEFAULT NULL,\n  `activity` varchar(255) NOT NULL,\n  `time` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `individual_plans` (\n  `id` int(11) NOT NULL,\n  `for_user` int(11) NOT NULL,\n  `num_invoices` int(11) NOT NULL,\n  `num_firms` int(11) NOT NULL,\n  `price` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `invoices` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `inv_type` varchar(10) NOT NULL,\n  `status` varchar(10) NOT NULL,\n  `inv_number` varchar(20) NOT NULL,\n  `inv_currency` varchar(50) NOT NULL,\n  `date_create` int(10) UNSIGNED NOT NULL,\n  `date_tax_event` int(10) UNSIGNED NOT NULL,\n  `cash_accounting` tinyint(1) NOT NULL,\n  `have_maturity_date` tinyint(1) NOT NULL,\n  `maturity_date` int(10) UNSIGNED NOT NULL,\n  `remarks` longtext NOT NULL,\n  `payment_method` varchar(200) NOT NULL,\n  `payment_status` varchar(20) NOT NULL,\n  `to_inv_number` varchar(20) NOT NULL,\n  `to_inv_date` int(10) UNSIGNED NOT NULL,\n  `invoice_amount` varchar(50) NOT NULL,\n  `discount` varchar(50) NOT NULL,\n  `discount_type` varchar(50) NOT NULL,\n  `tax_base` varchar(50) NOT NULL,\n  `vat_percent` varchar(50) NOT NULL,\n  `vat_sum` varchar(50) NOT NULL,\n  `no_vat` tinyint(1) NOT NULL,\n  `no_vat_reason` varchar(255) NOT NULL,\n  `final_total` varchar(50) NOT NULL,\n  `composed` varchar(255) NOT NULL,\n  `schiffer` varchar(100) NOT NULL,\n  `created` int(10) UNSIGNED NOT NULL,\n  `date_received` int(10) UNSIGNED NOT NULL,\n  `return_reason` varchar(500) NOT NULL,\n  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',\n  `uniqid` varchar(50) NOT NULL COMMENT 'used for links'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `invoices_clients` (\n  `id` int(11) NOT NULL,\n  `for_invoice` int(10) UNSIGNED NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `client_name` varchar(255) NOT NULL,\n  `client_bulstat` varchar(50) NOT NULL,\n  `is_to_person` tinyint(1) NOT NULL,\n  `client_vat_registered` tinyint(1) NOT NULL,\n  `vat_number` varchar(50) NOT NULL,\n  `client_ident_num` varchar(50) NOT NULL,\n  `client_address` varchar(500) NOT NULL,\n  `client_city` varchar(80) NOT NULL,\n  `client_country` varchar(80) NOT NULL,\n  `accountable_person` varchar(200) NOT NULL,\n  `recipient_name` varchar(80) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `invoices_firms` (\n  `id` int(11) NOT NULL,\n  `for_invoice` int(10) UNSIGNED NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `address` varchar(1000) NOT NULL,\n  `city` varchar(250) NOT NULL,\n  `accountable_person` varchar(100) NOT NULL,\n  `image` varchar(500) NOT NULL,\n  `is_vat_registered` tinyint(1) NOT NULL,\n  `vat_number` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `invoices_items` (\n  `id` int(11) NOT NULL,\n  `for_invoice` int(10) UNSIGNED NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `quantity` varchar(20) NOT NULL,\n  `quantity_type` varchar(50) NOT NULL,\n  `single_price` varchar(20) NOT NULL,\n  `total_price` varchar(20) NOT NULL,\n  `position` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `invoices_languages` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `recipient` varchar(250) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `mol` varchar(100) NOT NULL,\n  `sender` varchar(100) NOT NULL,\n  `original` varchar(100) NOT NULL,\n  `number` varchar(100) NOT NULL,\n  `date_of_issue` varchar(100) NOT NULL,\n  `a_date_of_a_tax_event` varchar(100) NOT NULL,\n  `to_an_invoice` varchar(100) NOT NULL,\n  `invoice` varchar(100) NOT NULL,\n  `debit_note` varchar(100) NOT NULL,\n  `credit_note` varchar(100) NOT NULL,\n  `remarks` varchar(100) NOT NULL,\n  `pro_forma` varchar(100) NOT NULL,\n  `products_name` varchar(100) NOT NULL,\n  `quantity` varchar(100) NOT NULL,\n  `single_price` varchar(100) NOT NULL,\n  `value` varchar(100) NOT NULL,\n  `amount` varchar(100) NOT NULL,\n  `tax_base` varchar(100) NOT NULL,\n  `percentage_vat` varchar(100) NOT NULL,\n  `vat_charget` varchar(100) NOT NULL,\n  `everything` varchar(100) NOT NULL,\n  `reason_for_non_vat` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `signature` varchar(100) NOT NULL,\n  `schiffer` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `payment_type` varchar(100) NOT NULL,\n  `from_date` varchar(100) NOT NULL,\n  `discount` varchar(100) NOT NULL,\n  `receive_inv` varchar(100) NOT NULL,\n  `i_accept` varchar(100) NOT NULL,\n  `i_refuse` varchar(100) NOT NULL,\n  `receive_inv_from` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `invoices_languages` (`id`, `for_user`, `language_name`, `recipient`, `bulstat`, `mol`, `sender`, `original`, `number`, `date_of_issue`, `a_date_of_a_tax_event`, `to_an_invoice`, `invoice`, `debit_note`, `credit_note`, `remarks`, `pro_forma`, `products_name`, `quantity`, `single_price`, `value`, `amount`, `tax_base`, `percentage_vat`, `vat_charget`, `everything`, `reason_for_non_vat`, `compiled`, `signature`, `schiffer`, `page`, `payment_type`, `from_date`, `discount`, `receive_inv`, `i_accept`, `i_refuse`, `receive_inv_from`, `vat_number`) VALUES\n(1, 0, 'English', 'Beneficiary\\n', 'Bulstat:', 'Contact:', 'Sender', 'Original', 'Number', 'Date of issue', 'Date of tax event', 'To an invoice', 'Invoice', 'Debit note', 'Credit note', 'Remakrs', 'Pro-forma', 'Description', 'Quantity', 'Unit Cost', 'Price', 'Subtotal:', 'VAT base:', 'Percentage vat', 'Vat charged', 'Total:', 'Reason for non vat', 'Compiled', 'Signature', 'Schiffer', 'Page', 'Payment type', 'From date', 'Discount:', 'Reveice invoice', 'I accept', 'I refuse', 'Receive invoice from', 'Vat Number:'),\n(2, 0, 'Bulgarian', 'Получател', 'Булстат:', 'Мол:', 'Доставчик', 'Оригинал', 'Номер', 'Дата на издаване', 'Дата на данъчно събитие', 'Към фактура', 'Фактура', 'Дебитно известие', 'Кредитно известие', 'Забележки', 'Проформа', 'Наименование на продукта', 'Количество', 'Ед.цена', 'Стойност', 'Сума по фактура:', 'Данъчна основа:', 'Процент ДДС', 'ДДС', 'Общо:', 'Причина за неначисляване на ДДС', 'Съставил', 'Подпис', 'Шифър', 'Страница', 'Начин на плащане', 'От дата', 'Отстъпка:', 'Получихте фактура', 'Приемам', 'Отказвам', 'Получихте фактура от', 'ДДС Номер:'),\n(3, 0, 'Français', 'Destinataire', 'Bulstat:', 'Destinataire:', 'Fournisseur', 'Original', 'Numéro', 'Date d\\'émission', 'Date de l\\'événement fiscal', 'Pour une facture', 'Facture', 'Notification de la dette', 'Note de crédit', 'Remarques', 'Proform', 'Nom du produit', 'Quantité', 'Prix unique', 'Valeur', 'Montant de la facture:', 'Base d\\'imposition:', 'Pourcentage de TVA', 'TVA', 'Total:', 'Raison de la TVA non facturée', 'Compilé', 'Signature', 'Schiffer', 'Page', 'Méthode de paiement', 'De Date', 'Remise:', 'Vous avez reçu une facture', 'J\\'accepte', 'Je refuse', 'Vous avez reçu une facture de', 'Numéro de TVA:');\n\nCREATE TABLE `invoices_logs` (\n  `id` int(11) NOT NULL,\n  `invoice_id` int(10) UNSIGNED NOT NULL,\n  `action` varchar(50) NOT NULL,\n  `info` varchar(500) NOT NULL,\n  `time` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `invoices_translations` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_invoice` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `recipient` varchar(250) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `mol` varchar(100) NOT NULL,\n  `sender` varchar(100) NOT NULL,\n  `original` varchar(100) NOT NULL,\n  `number` varchar(100) NOT NULL,\n  `date_of_issue` varchar(100) NOT NULL,\n  `a_date_of_a_tax_event` varchar(100) NOT NULL,\n  `to_an_invoice` varchar(100) NOT NULL,\n  `from_date` varchar(100) NOT NULL COMMENT 'to an invoice from date',\n  `invoice` varchar(100) NOT NULL,\n  `debit_note` varchar(100) NOT NULL,\n  `credit_note` varchar(100) NOT NULL,\n  `remarks` varchar(100) NOT NULL,\n  `pro_forma` varchar(100) NOT NULL,\n  `products_name` varchar(100) NOT NULL,\n  `quantity` varchar(100) NOT NULL,\n  `single_price` varchar(100) NOT NULL,\n  `value` varchar(100) NOT NULL,\n  `amount` varchar(100) NOT NULL,\n  `tax_base` varchar(100) NOT NULL,\n  `percentage_vat` varchar(100) NOT NULL,\n  `vat_charget` varchar(100) NOT NULL,\n  `discount` varchar(100) NOT NULL,\n  `everything` varchar(100) NOT NULL,\n  `reason_for_non_vat` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `signature` varchar(100) NOT NULL,\n  `schiffer` varchar(100) NOT NULL,\n  `payment_type` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `receive_inv` varchar(100) NOT NULL,\n  `i_accept` varchar(100) NOT NULL,\n  `i_refuse` varchar(100) NOT NULL,\n  `receive_inv_from` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `items` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `quantity_type` varchar(50) NOT NULL,\n  `single_price` varchar(20) NOT NULL,\n  `currency` varchar(10) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `languages` (\n  `id` int(10) UNSIGNED NOT NULL,\n  `abbr` varchar(5) NOT NULL,\n  `name` varchar(30) NOT NULL,\n  `currency` varchar(10) NOT NULL,\n  `flag` varchar(255) NOT NULL,\n  `currencyKey` varchar(50) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `languages` (`id`, `abbr`, `name`, `currency`, `flag`, `currencyKey`) VALUES\n(2, 'en', 'english', 'EUR', 'en.png', 'EUR'),\n(3, 'bg', 'bulgarian', 'лв', '', 'bgn'),\n(4, 'fr', 'france', 'EUR', '', 'EUR');\n\nCREATE TABLE `movements` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `movement_number` varchar(20) NOT NULL,\n  `movement_type` varchar(15) NOT NULL,\n  `store_id` int(10) UNSIGNED NOT NULL,\n  `movement_currency` varchar(50) NOT NULL,\n  `amount` varchar(50) NOT NULL,\n  `discount` varchar(50) NOT NULL,\n  `discount_type` varchar(50) NOT NULL,\n  `tax_base` varchar(50) NOT NULL,\n  `vat_percent` varchar(50) NOT NULL,\n  `vat_sum` varchar(50) NOT NULL,\n  `no_vat_reason` varchar(255) NOT NULL,\n  `final_total` varchar(50) NOT NULL,\n  `remarks` longtext NOT NULL,\n  `payment_method` varchar(200) NOT NULL,\n  `created` int(10) UNSIGNED NOT NULL COMMENT 'date_create field in view',\n  `cancelled` tinyint(1) NOT NULL DEFAULT '0',\n  `betrayed` varchar(100) NOT NULL,\n  `accepted` varchar(100) NOT NULL,\n  `lot` varchar(20) NOT NULL,\n  `expire_date` int(10) UNSIGNED NOT NULL,\n  `to_invoice` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `movements_clients` (\n  `id` int(11) NOT NULL,\n  `for_movement` int(10) UNSIGNED NOT NULL,\n  `client_name` varchar(255) NOT NULL,\n  `client_bulstat` varchar(50) NOT NULL,\n  `is_to_person` tinyint(1) NOT NULL,\n  `client_vat_registered` tinyint(1) NOT NULL,\n  `vat_number` varchar(50) NOT NULL,\n  `client_ident_num` varchar(50) NOT NULL,\n  `client_address` varchar(500) NOT NULL,\n  `client_city` varchar(80) NOT NULL,\n  `client_country` varchar(80) NOT NULL,\n  `accountable_person` varchar(200) NOT NULL,\n  `recipient_name` varchar(80) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `movements_firms` (\n  `id` int(11) NOT NULL,\n  `for_movement` int(10) UNSIGNED NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `address` varchar(1000) NOT NULL,\n  `city` varchar(250) NOT NULL,\n  `accountable_person` varchar(100) NOT NULL,\n  `image` varchar(500) NOT NULL,\n  `is_vat_registered` tinyint(1) NOT NULL DEFAULT '0',\n  `vat_number` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `movements_from_to_store` (\n  `id` int(11) NOT NULL,\n  `for_movement` int(10) UNSIGNED NOT NULL,\n  `from_store` varchar(250) NOT NULL,\n  `to_store` varchar(255) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `movements_languages` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `bill_of_goods` varchar(100) NOT NULL,\n  `date` varchar(100) NOT NULL,\n  `recipient` varchar(100) NOT NULL,\n  `sender` varchar(100) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `address` varchar(100) NOT NULL,\n  `betrayed` varchar(100) NOT NULL,\n  `accepted` varchar(100) NOT NULL,\n  `amount` varchar(100) NOT NULL,\n  `vat` varchar(100) NOT NULL,\n  `vat_amount` varchar(100) NOT NULL,\n  `no_vat_reason` varchar(100) NOT NULL,\n  `final_amount` varchar(20) NOT NULL,\n  `product_name` varchar(100) NOT NULL,\n  `product_quantity` varchar(10) NOT NULL,\n  `product_quantity_type` varchar(100) NOT NULL,\n  `single_price` varchar(20) NOT NULL,\n  `product_amount` varchar(20) NOT NULL,\n  `payment_method` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `city` varchar(100) NOT NULL,\n  `remarks` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL,\n  `lot` varchar(100) NOT NULL,\n  `expire_date` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `movements_languages` (`id`, `for_user`, `language_name`, `bill_of_goods`, `date`, `recipient`, `sender`, `bulstat`, `address`, `betrayed`, `accepted`, `amount`, `vat`, `vat_amount`, `no_vat_reason`, `final_amount`, `product_name`, `product_quantity`, `product_quantity_type`, `single_price`, `product_amount`, `payment_method`, `page`, `city`, `remarks`, `vat_number`, `lot`, `expire_date`) VALUES\n(1, 0, 'English', 'Store order', 'Date', 'Recipient', 'Sender', 'Bulstat', 'Address', 'Betrayed', 'Accepted', 'Amount', 'Vat', 'Vat amount', 'No vat reason', 'Amount', 'Name', 'Quantity', 'Quantity type', 'Price', 'Amount', 'Payment method', 'Page', 'City', 'Remarks', 'Vat number', 'LOT#', 'Expiry date'),\n(2, 0, 'Bulgarian', 'Стокова разписка', 'Дата', 'Получател', 'Доставчик', 'Булстат', 'Адрес', 'Предал', 'Приел', 'Сума', 'ДДС', 'ДДС сума', 'Основание за неначисляване на ддс', 'Общо', 'Наименование на стока', 'Количество', 'Тип количество', 'Ед.цена', 'Общо', 'Начин на плащане', 'Страница', 'Град', 'Забележки', 'ДДС Номер', 'Партиден номер', 'Срок на годност'),\n(3, 0, 'Français', 'Reçu de marchandise', 'Date', 'Destinataire', 'Fournisseur', 'Bulstat', 'Adresse', 'Il a abandonné', 'Il a accepté', 'Montant', 'TVA', 'Montant de la TVA', 'Raison de la non-facturation de DPS', 'Total', 'Nom du produit', 'Quantité', 'Type de quantité', 'Prix unique', 'Total', 'Méthode de paiement', 'Page', 'Ville', 'Remarques', 'Numéro de TVA', 'Numéro de lot', 'Durée de conservation');\n\nCREATE TABLE `movements_revisions` (\n  `id` int(11) NOT NULL,\n  `for_movement` int(10) UNSIGNED NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `before_revision` varchar(20) NOT NULL,\n  `after_revision` varchar(20) NOT NULL,\n  `difference` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `movements_translations` (\n  `id` int(11) NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `for_movement` int(10) UNSIGNED NOT NULL,\n  `bill_of_goods` varchar(100) NOT NULL,\n  `date` varchar(100) NOT NULL,\n  `recipient` varchar(100) NOT NULL,\n  `sender` varchar(100) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `city` varchar(100) NOT NULL,\n  `address` varchar(100) NOT NULL,\n  `betrayed` varchar(100) NOT NULL,\n  `accepted` varchar(100) NOT NULL,\n  `amount` varchar(100) NOT NULL,\n  `vat` varchar(100) NOT NULL,\n  `vat_amount` varchar(100) NOT NULL,\n  `no_vat_reason` varchar(100) NOT NULL,\n  `final_amount` varchar(20) NOT NULL,\n  `product_name` varchar(100) NOT NULL,\n  `product_quantity` varchar(10) NOT NULL,\n  `product_quantity_type` varchar(100) NOT NULL,\n  `single_price` varchar(20) NOT NULL,\n  `product_amount` varchar(20) NOT NULL,\n  `payment_method` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `remarks` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL,\n  `lot` varchar(100) NOT NULL,\n  `expire_date` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `movement_items` (\n  `id` int(11) NOT NULL,\n  `for_movement` int(10) UNSIGNED NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `quantity` varchar(20) NOT NULL,\n  `quantity_type` varchar(50) NOT NULL,\n  `single_price` varchar(20) NOT NULL,\n  `total_price` varchar(20) NOT NULL,\n  `position` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `payment_methods` (\n  `id` int(11) NOT NULL,\n  `name` varchar(255) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `payment_methods` (`id`, `name`) VALUES\n(1, 'Credit or Debit Card'),\n(2, 'Check'),\n(3, 'PayPal'),\n(4, 'Easypay'),\n(5, 'E-Pay'),\n(6, 'Other');\n\nCREATE TABLE `protocols` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `protocol_number` varchar(20) NOT NULL,\n  `type` varchar(10) NOT NULL,\n  `from_date` int(10) UNSIGNED NOT NULL,\n  `to_invoice` varchar(20) NOT NULL,\n  `remarks` longtext NOT NULL,\n  `created` int(10) UNSIGNED NOT NULL,\n  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',\n  `received` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `provider_transmit` text NOT NULL,\n  `contract` text NOT NULL,\n  `amount` varchar(50) NOT NULL,\n  `vat_percent` varchar(50) NOT NULL,\n  `vat_sum` varchar(50) NOT NULL,\n  `final_total` varchar(50) NOT NULL,\n  `currency` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `protocols_clients` (\n  `id` int(11) NOT NULL,\n  `for_protocol` int(10) UNSIGNED NOT NULL,\n  `client_name` varchar(255) NOT NULL,\n  `client_bulstat` varchar(50) NOT NULL,\n  `is_to_person` tinyint(1) NOT NULL,\n  `client_vat_registered` tinyint(1) NOT NULL,\n  `vat_number` varchar(50) NOT NULL,\n  `client_ident_num` varchar(50) NOT NULL,\n  `client_address` varchar(500) NOT NULL,\n  `client_city` varchar(80) NOT NULL,\n  `client_country` varchar(80) NOT NULL,\n  `accountable_person` varchar(200) NOT NULL,\n  `recipient_name` varchar(80) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `protocols_contracts` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `title` varchar(255) NOT NULL,\n  `contract` longtext NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `protocols_firms` (\n  `id` int(11) NOT NULL,\n  `for_protocol` int(10) UNSIGNED NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `address` varchar(1000) NOT NULL,\n  `city` varchar(250) NOT NULL,\n  `accountable_person` varchar(100) NOT NULL,\n  `image` varchar(500) NOT NULL,\n  `is_vat_registered` tinyint(1) NOT NULL DEFAULT '0',\n  `vat_number` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `protocols_items` (\n  `id` int(11) NOT NULL,\n  `for_protocol` int(10) UNSIGNED NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `quantity` varchar(20) NOT NULL,\n  `quantity_type` varchar(50) NOT NULL,\n  `single_price` varchar(20) NOT NULL,\n  `total_price` varchar(20) NOT NULL,\n  `position` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `protocols_languages` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `transmission_protocol` varchar(100) NOT NULL,\n  `protocol_number` varchar(100) NOT NULL,\n  `from_date` varchar(100) NOT NULL,\n  `recipient` varchar(100) NOT NULL,\n  `supplier` varchar(100) NOT NULL,\n  `product_name` varchar(100) NOT NULL,\n  `product_quantity` varchar(100) NOT NULL,\n  `product_quantity_type` varchar(100) NOT NULL,\n  `product_single_price` varchar(100) NOT NULL,\n  `product_final_price` varchar(100) NOT NULL,\n  `amount` varchar(100) NOT NULL,\n  `vat` varchar(100) NOT NULL,\n  `vat_amount` varchar(100) NOT NULL,\n  `final_amount` varchar(100) NOT NULL,\n  `received` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `signature` varchar(100) NOT NULL,\n  `city` varchar(100) NOT NULL,\n  `address` varchar(100) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `to_invoice` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `protocols_languages` (`id`, `for_user`, `language_name`, `transmission_protocol`, `protocol_number`, `from_date`, `recipient`, `supplier`, `product_name`, `product_quantity`, `product_quantity_type`, `product_single_price`, `product_final_price`, `amount`, `vat`, `vat_amount`, `final_amount`, `received`, `compiled`, `signature`, `city`, `address`, `bulstat`, `to_invoice`, `page`, `vat_number`) VALUES\n(1, 0, 'English', 'Admission - transmission protocol', 'Number', 'From date', 'Recipient', 'Supplier', 'Name', 'Quantity', 'Quantity type', 'Single Price', 'Amount', 'Amount', 'Vat', 'Vat amount', 'Amount', 'Received', 'Compiled', 'Signature', 'City', 'Address', 'Bulstat', 'To invoice', 'Page', 'Vat number'),\n(2, 0, 'Bulgarian', 'Приемно-предавателен протокол', 'Номер', 'От дата', 'Получател', 'Доставчик', 'Име', 'Количество', 'Тип', 'Ец.цена', 'Крайна цена', 'Цена', 'ДДС', 'ДДС Сума', 'Сума крайна', 'Получил', 'Съставил', 'Подпис', 'Град', 'Адрес', 'Булстат', 'Към фактура', 'Страница', 'ДДС Номер'),\n(3, 0, 'Français', 'Protocole d\\'acceptation', 'Numéro', 'De Date', 'Destinataire', 'Fournisseur', 'Nom', 'Quantité', 'Type', 'Prix unique', 'Prix final', 'Prix', 'TVA', 'Montant de la TVA', 'Montant final', 'Reçu', 'Compilé', 'Signature', 'Ville', 'Adresse', 'Bulstat', 'Pour une facture', 'Page', 'Numéro de TVA');\n\nCREATE TABLE `protocols_provider_transmit` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `title` varchar(255) NOT NULL,\n  `description` longtext NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `protocols_translations` (\n  `id` int(11) NOT NULL,\n  `for_protocol` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `transmission_protocol` varchar(100) NOT NULL,\n  `protocol_number` varchar(100) NOT NULL,\n  `from_date` varchar(100) NOT NULL,\n  `recipient` varchar(100) NOT NULL,\n  `supplier` varchar(100) NOT NULL,\n  `product_name` varchar(100) NOT NULL,\n  `product_quantity` varchar(100) NOT NULL,\n  `product_quantity_type` varchar(100) NOT NULL,\n  `product_single_price` varchar(100) NOT NULL,\n  `product_final_price` varchar(100) NOT NULL,\n  `amount` varchar(100) NOT NULL,\n  `vat` varchar(100) NOT NULL,\n  `vat_amount` varchar(100) NOT NULL,\n  `final_amount` varchar(100) NOT NULL,\n  `received` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `signature` varchar(100) NOT NULL,\n  `city` varchar(100) NOT NULL,\n  `address` varchar(100) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `to_invoice` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `quantity_types` (\n  `id` int(11) NOT NULL,\n  `name` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `quantity_types` (`id`, `name`) VALUES\n(1, 'kilogram'),\n(2, 'number'),\n(3, 'days'),\n(4, 'months');\n\nCREATE TABLE `questions` (\n  `id` int(11) NOT NULL,\n  `position` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `questions` (`id`, `position`) VALUES\n(1, 1),\n(2, 2);\n\nCREATE TABLE `questions_translates` (\n  `id` int(11) NOT NULL,\n  `for_id` int(10) UNSIGNED NOT NULL,\n  `abbr` varchar(5) NOT NULL,\n  `question` varchar(500) NOT NULL,\n  `answer` longtext NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `questions_translates` (`id`, `for_id`, `abbr`, `question`, `answer`) VALUES\n(1, 1, 'en', 'How to register?', 'Registration is the easy part. Just click Register Now and fill in the email and password after you fill them correctly will be redirected to your personal account on invoicing.'),\n(2, 2, 'en', 'In which format are invoices', 'Invoices are in PDF format. They can be sent via email as an attachment or link that when opened by the customer invoice is displayed in the browser, so can be downloaded and to accept or refuse that will be reflected in your system.'),\n(3, 1, 'bg', 'Как да се регистрирате?', 'Регистрацията е лесната част. Просто кликнете върху \"Регистриране сега\" и попълнете имейла и паролата, след като ги попълните правилно, ще бъдат пренасочени към личния Ви акаунт при фактуриране.'),\n(4, 1, 'fr', 'Comment s\\'inscrire?', 'L\\'inscription est la partie facile. Il suffit de cliquer sur S\\'inscrire maintenant et de remplir l\\'e-mail et le mot de passe après les avoir correctement remplis seront redirigés vers votre compte personnel lors de la facturation.'),\n(5, 2, 'fr', 'Dans quel format sont les factures', 'Les factures sont en format PDF. Ils peuvent être envoyés par e-mail sous forme de pièce jointe ou de lien qui, une fois ouvert par la facture du client, est affiché dans le navigateur. Vous pouvez donc le télécharger et l\\'accepter ou le refuser dans votre système.'),\n(6, 2, 'bg', 'В какъв формат са фактурите', 'Фактурите са в PDF формат. Те могат да бъдат изпратени по електронна поща като прикачен файл или връзка, която след като бъде отворена от сметката на клиента, се показва в браузъра. Можете да го изтеглите и да го приемете или отхвърлите във вашата система.');\n\nCREATE TABLE `stock_availability` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `for_store` int(10) UNSIGNED NOT NULL,\n  `item_id` int(10) UNSIGNED NOT NULL,\n  `quantity` varchar(50) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `stores` (\n  `id` int(11) NOT NULL,\n  `name` varchar(250) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `created` int(10) UNSIGNED NOT NULL,\n  `is_deleted` tinyint(1) NOT NULL DEFAULT '0'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `users` (\n  `id` int(11) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `phone` varchar(100) NOT NULL,\n  `schiffer` varchar(100) NOT NULL,\n  `email` varchar(250) NOT NULL,\n  `password` varchar(100) NOT NULL,\n  `ip_address` varchar(15) NULL DEFAULT NULL,\n  `time_registered` int(10) UNSIGNED NOT NULL,\n  `enabled` tinyint(1) NOT NULL DEFAULT '1'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `users_currencies` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `value` varchar(10) NOT NULL,\n  `name` varchar(50) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `users_payment_methods` (\n  `id` int(11) NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `users_quantity_types` (\n  `id` int(11) NOT NULL,\n  `name` varchar(50) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `user_no_vat_reasons` (\n  `id` int(11) NOT NULL,\n  `reason` varchar(500) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `value_store` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `_key` varchar(50) NOT NULL,\n  `value` varchar(500) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranties` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `for_company` int(10) UNSIGNED NOT NULL,\n  `warranty_number` varchar(20) NOT NULL,\n  `valid_from` int(10) UNSIGNED NOT NULL,\n  `to_invoice` varchar(20) NOT NULL,\n  `conditions` longtext NOT NULL,\n  `remarks` longtext NOT NULL,\n  `created` int(10) UNSIGNED NOT NULL,\n  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',\n  `received` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranties_clients` (\n  `id` int(11) NOT NULL,\n  `for_warranty` int(10) UNSIGNED NOT NULL,\n  `client_name` varchar(255) NOT NULL,\n  `client_bulstat` varchar(50) NOT NULL,\n  `is_to_person` tinyint(1) NOT NULL,\n  `client_vat_registered` tinyint(1) NOT NULL,\n  `vat_number` varchar(50) NOT NULL,\n  `client_ident_num` varchar(50) NOT NULL,\n  `client_address` varchar(500) NOT NULL,\n  `client_city` varchar(80) NOT NULL,\n  `client_country` varchar(80) NOT NULL,\n  `accountable_person` varchar(200) NOT NULL,\n  `recipient_name` varchar(80) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranties_firms` (\n  `id` int(11) NOT NULL,\n  `for_warranty` int(10) UNSIGNED NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `address` varchar(1000) NOT NULL,\n  `city` varchar(250) NOT NULL,\n  `accountable_person` varchar(100) NOT NULL,\n  `image` varchar(500) NOT NULL,\n  `is_vat_registered` tinyint(1) NOT NULL DEFAULT '0',\n  `vat_number` varchar(20) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranties_items` (\n  `id` int(11) NOT NULL,\n  `for_warranty` int(10) UNSIGNED NOT NULL,\n  `name` varchar(500) NOT NULL,\n  `months` varchar(20) NOT NULL,\n  `valid_to` int(10) UNSIGNED NOT NULL,\n  `serial` varchar(100) NOT NULL,\n  `position` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranties_languages` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `warranty_card` varchar(100) NOT NULL,\n  `date_valid` varchar(100) NOT NULL,\n  `recipient` varchar(100) NOT NULL,\n  `sender` varchar(100) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `address` varchar(100) NOT NULL,\n  `product_name` varchar(100) NOT NULL,\n  `product_months` varchar(100) NOT NULL,\n  `product_valid_to` varchar(100) NOT NULL,\n  `product_serial_num` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `city` varchar(100) NOT NULL,\n  `remarks` varchar(100) NOT NULL,\n  `received` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `signature` varchar(100) NOT NULL,\n  `warranty_conditions` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `warranties_languages` (`id`, `for_user`, `language_name`, `warranty_card`, `date_valid`, `recipient`, `sender`, `bulstat`, `address`, `product_name`, `product_months`, `product_valid_to`, `product_serial_num`, `page`, `city`, `remarks`, `received`, `compiled`, `signature`, `warranty_conditions`, `vat_number`) VALUES\n(1, 0, 'English', 'Warranty Card', 'Valid from:', 'Recipient', 'Sender', 'Bulstat', 'Address', 'Name', 'Months', 'Valid to', 'Serial number', 'Page', 'City', 'Remarks', 'Received', 'Compiled', 'Signature', 'Warranty conditions:', 'Vat number'),\n(2, 0, 'Français', 'Carte de garantie', 'Valide à partir de:', 'Bénéficiaire', 'expéditeur', 'Bulstat', 'Adresse', 'prénom', 'Mois', 'Valable pour', 'Numéro de série', 'Page', 'Ville', 'Remarques', 'Reçu', 'Compilé', 'Signature', 'Conditions de garantie:', 'Numéro de TVA');\n\nCREATE TABLE `warranties_translations` (\n  `id` int(11) NOT NULL,\n  `for_warranty` int(10) UNSIGNED NOT NULL,\n  `language_name` varchar(500) NOT NULL,\n  `warranty_card` varchar(100) NOT NULL,\n  `date_valid` varchar(100) NOT NULL,\n  `recipient` varchar(100) NOT NULL,\n  `sender` varchar(100) NOT NULL,\n  `bulstat` varchar(100) NOT NULL,\n  `address` varchar(100) NOT NULL,\n  `product_name` varchar(100) NOT NULL,\n  `product_months` varchar(100) NOT NULL,\n  `product_valid_to` varchar(100) NOT NULL,\n  `product_serial_num` varchar(100) NOT NULL,\n  `page` varchar(100) NOT NULL,\n  `city` varchar(100) NOT NULL,\n  `remarks` varchar(100) NOT NULL,\n  `received` varchar(100) NOT NULL,\n  `compiled` varchar(100) NOT NULL,\n  `signature` varchar(100) NOT NULL,\n  `warranty_conditions` varchar(100) NOT NULL,\n  `vat_number` varchar(100) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranty_conditions` (\n  `id` int(11) NOT NULL,\n  `for_user` int(10) UNSIGNED NOT NULL,\n  `condition_title` varchar(255) NOT NULL,\n  `condition_description` longtext NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE TABLE `warranty_events` (\n  `id` int(11) NOT NULL,\n  `for_warranty` int(10) UNSIGNED NOT NULL,\n  `type` varchar(20) NOT NULL,\n  `on_date` int(10) UNSIGNED NOT NULL,\n  `item` varchar(100) NOT NULL,\n  `description` text NOT NULL,\n  `created` int(10) UNSIGNED NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n\nALTER TABLE `admin_users`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `clients`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `currencies`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `cusom_plan_requests`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `employees`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `employees_permissions`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `firms_payment_requests`\n  ADD PRIMARY KEY (`id`),\n  ADD UNIQUE KEY `req_num` (`req_num`);\n\nALTER TABLE `firms_plans`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `firms_translations`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `firms_users`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `history`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `individual_plans`\n  ADD PRIMARY KEY (`id`),\n  ADD UNIQUE KEY `user` (`for_user`);\n\nALTER TABLE `invoices`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `invoices_clients`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `invoices_firms`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `invoices_items`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `invoices_languages`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `invoices_logs`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `invoices_translations`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `items`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `languages`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements_clients`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements_firms`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements_from_to_store`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements_languages`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements_revisions`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movements_translations`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `movement_items`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `payment_methods`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_clients`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_contracts`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_firms`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_items`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_languages`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_provider_transmit`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `protocols_translations`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `quantity_types`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `questions`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `questions_translates`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `stock_availability`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `stores`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `users`\n  ADD PRIMARY KEY (`id`),\n  ADD UNIQUE KEY `email_unique` (`email`);\n\nALTER TABLE `users_currencies`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `users_payment_methods`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `users_quantity_types`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `user_no_vat_reasons`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `value_store`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranties`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranties_clients`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranties_firms`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranties_items`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranties_languages`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranties_translations`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranty_conditions`\n  ADD PRIMARY KEY (`id`);\n\nALTER TABLE `warranty_events`\n  ADD PRIMARY KEY (`id`);\n\n\nALTER TABLE `admin_users`\n  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;\nALTER TABLE `clients`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `currencies`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=115;\nALTER TABLE `cusom_plan_requests`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `employees`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `employees_permissions`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `firms_payment_requests`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `firms_plans`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `firms_translations`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `firms_users`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `history`\n  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;\nALTER TABLE `individual_plans`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `invoices`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `invoices_clients`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `invoices_firms`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `invoices_items`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `invoices_languages`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;\nALTER TABLE `invoices_logs`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `invoices_translations`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `items`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `languages`\n  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;\nALTER TABLE `movements`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `movements_clients`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `movements_firms`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `movements_from_to_store`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `movements_languages`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;\nALTER TABLE `movements_revisions`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `movements_translations`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `movement_items`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `payment_methods`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;\nALTER TABLE `protocols`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `protocols_clients`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `protocols_contracts`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `protocols_firms`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `protocols_items`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `protocols_languages`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;\nALTER TABLE `protocols_provider_transmit`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `protocols_translations`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `quantity_types`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;\nALTER TABLE `questions`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;\nALTER TABLE `questions_translates`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;\nALTER TABLE `stock_availability`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `stores`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `users`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;\nALTER TABLE `users_currencies`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `users_payment_methods`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `users_quantity_types`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `user_no_vat_reasons`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `value_store`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranties`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranties_clients`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranties_firms`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranties_items`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranties_languages`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;\nALTER TABLE `warranties_translations`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranty_conditions`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\nALTER TABLE `warranty_events`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"
  },
  {
    "path": "index.php",
    "content": "<?php \n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2014 - 2017, British Columbia Institute of Technology\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)\n * @license\thttp://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\n\n/*\n *---------------------------------------------------------------\n * APPLICATION ENVIRONMENT\n *---------------------------------------------------------------\n *\n * You can load different configurations depending on your\n * current environment. Setting the environment also influences\n * things like logging and error reporting.\n *\n * This can be set to anything, but default usage is:\n *\n *     development\n *     testing\n *     production\n *\n * NOTE: If you change these, also change the error_reporting() code below\n */\n\n define('ENVIRONMENT', 'production');\n\n/*\n *---------------------------------------------------------------\n * ERROR REPORTING\n *---------------------------------------------------------------\n *\n * Different environments will require different levels of error reporting.\n * By default development will show errors but testing and live will hide them.\n */\nswitch (ENVIRONMENT)\n{\n\tcase 'development':\n\t\terror_reporting(-1);\n\t\tini_set('display_errors', 1);\n\tbreak;\n\n\tcase 'testing':\n\tcase 'production':\n\t\tini_set('display_errors', 0);\n\t\tif (version_compare(PHP_VERSION, '5.3', '>='))\n\t\t{\n\t\t\terror_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);\n\t\t}\n\t\telse\n\t\t{\n\t\t\terror_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);\n\t\t}\n\tbreak;\n\n\tdefault:\n\t\theader('HTTP/1.1 503 Service Unavailable.', TRUE, 503);\n\t\techo 'The application environment is not set correctly.';\n\t\texit(1); // EXIT_ERROR\n}\n\n/*\n *---------------------------------------------------------------\n * SYSTEM DIRECTORY NAME\n *---------------------------------------------------------------\n *\n * This variable must contain the name of your \"system\" directory.\n * Set the path if it is not in the same directory as this file.\n */\n\t$system_path = 'system';\n\n/*\n *---------------------------------------------------------------\n * APPLICATION DIRECTORY NAME\n *---------------------------------------------------------------\n *\n * If you want this front controller to use a different \"application\"\n * directory than the default one you can set its name here. The directory\n * can also be renamed or relocated anywhere on your server. If you do,\n * use an absolute (full) server path.\n * For more info please see the user guide:\n *\n * https://codeigniter.com/user_guide/general/managing_apps.html\n *\n * NO TRAILING SLASH!\n */\n\t$application_folder = 'application';\n\n/*\n *---------------------------------------------------------------\n * VIEW DIRECTORY NAME\n *---------------------------------------------------------------\n *\n * If you want to move the view directory out of the application\n * directory, set the path to it here. The directory can be renamed\n * and relocated anywhere on your server. If blank, it will default\n * to the standard location inside your application directory.\n * If you do move this, use an absolute (full) server path.\n *\n * NO TRAILING SLASH!\n */\n\t$view_folder = '';\n\n\n/*\n * --------------------------------------------------------------------\n * DEFAULT CONTROLLER\n * --------------------------------------------------------------------\n *\n * Normally you will set your default controller in the routes.php file.\n * You can, however, force a custom routing by hard-coding a\n * specific controller class/function here. For most applications, you\n * WILL NOT set your routing here, but it's an option for those\n * special instances where you might want to override the standard\n * routing in a specific front controller that shares a common CI installation.\n *\n * IMPORTANT: If you set the routing here, NO OTHER controller will be\n * callable. In essence, this preference limits your application to ONE\n * specific controller. Leave the function name blank if you need\n * to call functions dynamically via the URI.\n *\n * Un-comment the $routing array below to use this feature\n */\n\t// The directory name, relative to the \"controllers\" directory.  Leave blank\n\t// if your controller is not in a sub-directory within the \"controllers\" one\n\t// $routing['directory'] = '';\n\n\t// The controller class file name.  Example:  mycontroller\n\t// $routing['controller'] = '';\n\n\t// The controller function you wish to be called.\n\t// $routing['function']\t= '';\n\n\n/*\n * -------------------------------------------------------------------\n *  CUSTOM CONFIG VALUES\n * -------------------------------------------------------------------\n *\n * The $assign_to_config array below will be passed dynamically to the\n * config class when initialized. This allows you to set custom config\n * items or override any default config values found in the config.php file.\n * This can be handy as it permits you to share one application between\n * multiple front controller files, with each file containing different\n * config values.\n *\n * Un-comment the $assign_to_config array below to use this feature\n */\n\t// $assign_to_config['name_of_config_item'] = 'value of config item';\n\n\n\n// --------------------------------------------------------------------\n// END OF USER CONFIGURABLE SETTINGS.  DO NOT EDIT BELOW THIS LINE\n// --------------------------------------------------------------------\n\n/*\n * ---------------------------------------------------------------\n *  Resolve the system path for increased reliability\n * ---------------------------------------------------------------\n */\n\n\t// Set the current directory correctly for CLI requests\n\tif (defined('STDIN'))\n\t{\n\t\tchdir(dirname(__FILE__));\n\t}\n\n\tif (($_temp = realpath($system_path)) !== FALSE)\n\t{\n\t\t$system_path = $_temp.DIRECTORY_SEPARATOR;\n\t}\n\telse\n\t{\n\t\t// Ensure there's a trailing slash\n\t\t$system_path = strtr(\n\t\t\trtrim($system_path, '/\\\\'),\n\t\t\t'/\\\\',\n\t\t\tDIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR\n\t\t).DIRECTORY_SEPARATOR;\n\t}\n\n\t// Is the system path correct?\n\tif ( ! is_dir($system_path))\n\t{\n\t\theader('HTTP/1.1 503 Service Unavailable.', TRUE, 503);\n\t\techo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME);\n\t\texit(3); // EXIT_CONFIG\n\t}\n\n/*\n * -------------------------------------------------------------------\n *  Now that we know the path, set the main path constants\n * -------------------------------------------------------------------\n */\n\t// The name of THIS file\n\tdefine('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));\n\n\t// Path to the system directory\n\tdefine('BASEPATH', $system_path);\n\n\t// Path to the front controller (this file) directory\n\tdefine('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);\n\n\t// Name of the \"system\" directory\n\tdefine('SYSDIR', basename(BASEPATH));\n\n\t// The path to the \"application\" directory\n\tif (is_dir($application_folder))\n\t{\n\t\tif (($_temp = realpath($application_folder)) !== FALSE)\n\t\t{\n\t\t\t$application_folder = $_temp;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$application_folder = strtr(\n\t\t\t\trtrim($application_folder, '/\\\\'),\n\t\t\t\t'/\\\\',\n\t\t\t\tDIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR\n\t\t\t);\n\t\t}\n\t}\n\telseif (is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR))\n\t{\n\t\t$application_folder = BASEPATH.strtr(\n\t\t\ttrim($application_folder, '/\\\\'),\n\t\t\t'/\\\\',\n\t\t\tDIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR\n\t\t);\n\t}\n\telse\n\t{\n\t\theader('HTTP/1.1 503 Service Unavailable.', TRUE, 503);\n\t\techo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;\n\t\texit(3); // EXIT_CONFIG\n\t}\n\n\tdefine('APPPATH', $application_folder.DIRECTORY_SEPARATOR);\n\n\t// The path to the \"views\" directory\n\tif ( ! isset($view_folder[0]) && is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR))\n\t{\n\t\t$view_folder = APPPATH.'views';\n\t}\n\telseif (is_dir($view_folder))\n\t{\n\t\tif (($_temp = realpath($view_folder)) !== FALSE)\n\t\t{\n\t\t\t$view_folder = $_temp;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$view_folder = strtr(\n\t\t\t\trtrim($view_folder, '/\\\\'),\n\t\t\t\t'/\\\\',\n\t\t\t\tDIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR\n\t\t\t);\n\t\t}\n\t}\n\telseif (is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR))\n\t{\n\t\t$view_folder = APPPATH.strtr(\n\t\t\ttrim($view_folder, '/\\\\'),\n\t\t\t'/\\\\',\n\t\t\tDIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR\n\t\t);\n\t}\n\telse\n\t{\n\t\theader('HTTP/1.1 503 Service Unavailable.', TRUE, 503);\n\t\techo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;\n\t\texit(3); // EXIT_CONFIG\n\t}\n\n\tdefine('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR);\n\n/*\n * --------------------------------------------------------------------\n * LOAD THE BOOTSTRAP FILE\n * --------------------------------------------------------------------\n *\n * And away we go...\n */\nrequire_once BASEPATH.'core/CodeIgniter.php';\n"
  },
  {
    "path": "pdfs.log",
    "content": ""
  },
  {
    "path": "system/.htaccess",
    "content": "<IfModule authz_core_module>\n\tRequire all denied\n</IfModule>\n<IfModule !authz_core_module>\n\tDeny from all\n</IfModule>"
  },
  {
    "path": "system/core/Benchmark.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Benchmark Class\n *\n * This class enables you to mark points and calculate the time difference\n * between them. Memory consumption can also be displayed.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/benchmark.html\n */\nclass CI_Benchmark {\n\n\t/**\n\t * List of all benchmark markers\n\t *\n\t * @var\tarray\n\t */\n\tpublic $marker = array();\n\n\t/**\n\t * Set a benchmark marker\n\t *\n\t * Multiple calls to this function can be made so that several\n\t * execution points can be timed.\n\t *\n\t * @param\tstring\t$name\tMarker name\n\t * @return\tvoid\n\t */\n\tpublic function mark($name)\n\t{\n\t\t$this->marker[$name] = microtime(TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Elapsed time\n\t *\n\t * Calculates the time difference between two marked points.\n\t *\n\t * If the first parameter is empty this function instead returns the\n\t * {elapsed_time} pseudo-variable. This permits the full system\n\t * execution time to be shown in a template. The output class will\n\t * swap the real value for this variable.\n\t *\n\t * @param\tstring\t$point1\t\tA particular marked point\n\t * @param\tstring\t$point2\t\tA particular marked point\n\t * @param\tint\t$decimals\tNumber of decimal places\n\t *\n\t * @return\tstring\tCalculated elapsed time on success,\n\t *\t\t\tan '{elapsed_string}' if $point1 is empty\n\t *\t\t\tor an empty string if $point1 is not found.\n\t */\n\tpublic function elapsed_time($point1 = '', $point2 = '', $decimals = 4)\n\t{\n\t\tif ($point1 === '')\n\t\t{\n\t\t\treturn '{elapsed_time}';\n\t\t}\n\n\t\tif ( ! isset($this->marker[$point1]))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\tif ( ! isset($this->marker[$point2]))\n\t\t{\n\t\t\t$this->marker[$point2] = microtime(TRUE);\n\t\t}\n\n\t\treturn number_format($this->marker[$point2] - $this->marker[$point1], $decimals);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Memory Usage\n\t *\n\t * Simply returns the {memory_usage} marker.\n\t *\n\t * This permits it to be put it anywhere in a template\n\t * without the memory being calculated until the end.\n\t * The output class will swap the real value for this variable.\n\t *\n\t * @return\tstring\t'{memory_usage}'\n\t */\n\tpublic function memory_usage()\n\t{\n\t\treturn '{memory_usage}';\n\t}\n\n}\n"
  },
  {
    "path": "system/core/CodeIgniter.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * System Initialization File\n *\n * Loads the base classes and executes the request.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tCodeIgniter\n * @category\tFront-controller\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/\n */\n\n/**\n * CodeIgniter Version\n *\n * @var\tstring\n *\n */\n\tconst CI_VERSION = '3.1.13';\n\n/*\n * ------------------------------------------------------\n *  Load the framework constants\n * ------------------------------------------------------\n */\n\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))\n\t{\n\t\trequire_once(APPPATH.'config/'.ENVIRONMENT.'/constants.php');\n\t}\n\n\tif (file_exists(APPPATH.'config/constants.php'))\n\t{\n\t\trequire_once(APPPATH.'config/constants.php');\n\t}\n\n/*\n * ------------------------------------------------------\n *  Load the global functions\n * ------------------------------------------------------\n */\n\trequire_once(BASEPATH.'core/Common.php');\n\n\n/*\n * ------------------------------------------------------\n * Security procedures\n * ------------------------------------------------------\n */\n\nif ( ! is_php('5.4'))\n{\n\tini_set('magic_quotes_runtime', 0);\n\n\tif ((bool) ini_get('register_globals'))\n\t{\n\t\t$_protected = array(\n\t\t\t'_SERVER',\n\t\t\t'_GET',\n\t\t\t'_POST',\n\t\t\t'_FILES',\n\t\t\t'_REQUEST',\n\t\t\t'_SESSION',\n\t\t\t'_ENV',\n\t\t\t'_COOKIE',\n\t\t\t'GLOBALS',\n\t\t\t'HTTP_RAW_POST_DATA',\n\t\t\t'system_path',\n\t\t\t'application_folder',\n\t\t\t'view_folder',\n\t\t\t'_protected',\n\t\t\t'_registered'\n\t\t);\n\n\t\t$_registered = ini_get('variables_order');\n\t\tforeach (array('E' => '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal)\n\t\t{\n\t\t\tif (strpos($_registered, $key) === FALSE)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tforeach (array_keys($$superglobal) as $var)\n\t\t\t{\n\t\t\t\tif (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE))\n\t\t\t\t{\n\t\t\t\t\t$GLOBALS[$var] = NULL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/*\n * ------------------------------------------------------\n *  Define a custom error handler so we can log PHP errors\n * ------------------------------------------------------\n */\n\tset_error_handler('_error_handler');\n\tset_exception_handler('_exception_handler');\n\tregister_shutdown_function('_shutdown_handler');\n\n/*\n * ------------------------------------------------------\n *  Set the subclass_prefix\n * ------------------------------------------------------\n *\n * Normally the \"subclass_prefix\" is set in the config file.\n * The subclass prefix allows CI to know if a core class is\n * being extended via a library in the local application\n * \"libraries\" folder. Since CI allows config items to be\n * overridden via data set in the main index.php file,\n * before proceeding we need to know if a subclass_prefix\n * override exists. If so, we will set this value now,\n * before any classes are loaded\n * Note: Since the config file data is cached it doesn't\n * hurt to load it here.\n */\n\tif ( ! empty($assign_to_config['subclass_prefix']))\n\t{\n\t\tget_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));\n\t}\n\n/*\n * ------------------------------------------------------\n *  Should we use a Composer autoloader?\n * ------------------------------------------------------\n */\n\tif ($composer_autoload = config_item('composer_autoload'))\n\t{\n\t\tif ($composer_autoload === TRUE)\n\t\t{\n\t\t\tfile_exists(APPPATH.'vendor/autoload.php')\n\t\t\t\t? require_once(APPPATH.'vendor/autoload.php')\n\t\t\t\t: log_message('error', '$config[\\'composer_autoload\\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.');\n\t\t}\n\t\telseif (file_exists($composer_autoload))\n\t\t{\n\t\t\trequire_once($composer_autoload);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog_message('error', 'Could not find the specified $config[\\'composer_autoload\\'] path: '.$composer_autoload);\n\t\t}\n\t}\n\n/*\n * ------------------------------------------------------\n *  Start the timer... tick tock tick tock...\n * ------------------------------------------------------\n */\n\t$BM =& load_class('Benchmark', 'core');\n\t$BM->mark('total_execution_time_start');\n\t$BM->mark('loading_time:_base_classes_start');\n\n/*\n * ------------------------------------------------------\n *  Instantiate the hooks class\n * ------------------------------------------------------\n */\n\t$EXT =& load_class('Hooks', 'core');\n\n/*\n * ------------------------------------------------------\n *  Is there a \"pre_system\" hook?\n * ------------------------------------------------------\n */\n\t$EXT->call_hook('pre_system');\n\n/*\n * ------------------------------------------------------\n *  Instantiate the config class\n * ------------------------------------------------------\n *\n * Note: It is important that Config is loaded first as\n * most other classes depend on it either directly or by\n * depending on another class that uses it.\n *\n */\n\t$CFG =& load_class('Config', 'core');\n\n\t// Do we have any manually set config items in the index.php file?\n\tif (isset($assign_to_config) && is_array($assign_to_config))\n\t{\n\t\tforeach ($assign_to_config as $key => $value)\n\t\t{\n\t\t\t$CFG->set_item($key, $value);\n\t\t}\n\t}\n\n/*\n * ------------------------------------------------------\n * Important charset-related stuff\n * ------------------------------------------------------\n *\n * Configure mbstring and/or iconv if they are enabled\n * and set MB_ENABLED and ICONV_ENABLED constants, so\n * that we don't repeatedly do extension_loaded() or\n * function_exists() calls.\n *\n * Note: UTF-8 class depends on this. It used to be done\n * in it's constructor, but it's _not_ class-specific.\n *\n */\n\t$charset = strtoupper(config_item('charset'));\n\tini_set('default_charset', $charset);\n\n\tif (extension_loaded('mbstring'))\n\t{\n\t\tdefine('MB_ENABLED', TRUE);\n\t\t// mbstring.internal_encoding is deprecated starting with PHP 5.6\n\t\t// and it's usage triggers E_DEPRECATED messages.\n\t\t@ini_set('mbstring.internal_encoding', $charset);\n\t\t// This is required for mb_convert_encoding() to strip invalid characters.\n\t\t// That's utilized by CI_Utf8, but it's also done for consistency with iconv.\n\t\tmb_substitute_character('none');\n\t}\n\telse\n\t{\n\t\tdefine('MB_ENABLED', FALSE);\n\t}\n\n\t// There's an ICONV_IMPL constant, but the PHP manual says that using\n\t// iconv's predefined constants is \"strongly discouraged\".\n\tif (extension_loaded('iconv'))\n\t{\n\t\tdefine('ICONV_ENABLED', TRUE);\n\t\t// iconv.internal_encoding is deprecated starting with PHP 5.6\n\t\t// and it's usage triggers E_DEPRECATED messages.\n\t\t@ini_set('iconv.internal_encoding', $charset);\n\t}\n\telse\n\t{\n\t\tdefine('ICONV_ENABLED', FALSE);\n\t}\n\n\tif (is_php('5.6'))\n\t{\n\t\tini_set('php.internal_encoding', $charset);\n\t}\n\n/*\n * ------------------------------------------------------\n *  Load compatibility features\n * ------------------------------------------------------\n */\n\n\trequire_once(BASEPATH.'core/compat/mbstring.php');\n\trequire_once(BASEPATH.'core/compat/hash.php');\n\trequire_once(BASEPATH.'core/compat/password.php');\n\trequire_once(BASEPATH.'core/compat/standard.php');\n\n/*\n * ------------------------------------------------------\n *  Instantiate the UTF-8 class\n * ------------------------------------------------------\n */\n\t$UNI =& load_class('Utf8', 'core');\n\n/*\n * ------------------------------------------------------\n *  Instantiate the URI class\n * ------------------------------------------------------\n */\n\t$URI =& load_class('URI', 'core');\n\n/*\n * ------------------------------------------------------\n *  Instantiate the routing class and set the routing\n * ------------------------------------------------------\n */\n\t$RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);\n\n/*\n * ------------------------------------------------------\n *  Instantiate the output class\n * ------------------------------------------------------\n */\n\t$OUT =& load_class('Output', 'core');\n\n/*\n * ------------------------------------------------------\n *\tIs there a valid cache file? If so, we're done...\n * ------------------------------------------------------\n */\n\tif ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE)\n\t{\n\t\texit;\n\t}\n\n/*\n * -----------------------------------------------------\n * Load the security class for xss and csrf support\n * -----------------------------------------------------\n */\n\t$SEC =& load_class('Security', 'core');\n\n/*\n * ------------------------------------------------------\n *  Load the Input class and sanitize globals\n * ------------------------------------------------------\n */\n\t$IN\t=& load_class('Input', 'core');\n\n/*\n * ------------------------------------------------------\n *  Load the Language class\n * ------------------------------------------------------\n */\n\t$LANG =& load_class('Lang', 'core');\n\n/*\n * ------------------------------------------------------\n *  Load the app controller and local controller\n * ------------------------------------------------------\n *\n */\n\t// Load the base controller class\n\trequire_once BASEPATH.'core/Controller.php';\n\n\t/**\n\t * Reference to the CI_Controller method.\n\t *\n\t * Returns current CI instance object\n\t *\n\t * @return CI_Controller\n\t */\n\tfunction &get_instance()\n\t{\n\t\treturn CI_Controller::get_instance();\n\t}\n\n\tif (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))\n\t{\n\t\trequire_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';\n\t}\n\n\t// Set a mark point for benchmarking\n\t$BM->mark('loading_time:_base_classes_end');\n\n/*\n * ------------------------------------------------------\n *  Sanity checks\n * ------------------------------------------------------\n *\n *  The Router class has already validated the request,\n *  leaving us with 3 options here:\n *\n *\t1) an empty class name, if we reached the default\n *\t   controller, but it didn't exist;\n *\t2) a query string which doesn't go through a\n *\t   file_exists() check\n *\t3) a regular request for a non-existing page\n *\n *  We handle all of these as a 404 error.\n *\n *  Furthermore, none of the methods in the app controller\n *  or the loader class can be called via the URI, nor can\n *  controller methods that begin with an underscore.\n */\n\n\t$e404 = FALSE;\n\t$class = ucfirst($RTR->class);\n\t$method = $RTR->method;\n\n\tif (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php'))\n\t{\n\t\t$e404 = TRUE;\n\t}\n\telse\n\t{\n\t\trequire_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php');\n\n\t\tif ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method))\n\t\t{\n\t\t\t$e404 = TRUE;\n\t\t}\n\t\telseif (method_exists($class, '_remap'))\n\t\t{\n\t\t\t$params = array($method, array_slice($URI->rsegments, 2));\n\t\t\t$method = '_remap';\n\t\t}\n\t\telseif ( ! method_exists($class, $method))\n\t\t{\n\t\t\t$e404 = TRUE;\n\t\t}\n\t\t/**\n\t\t * DO NOT CHANGE THIS, NOTHING ELSE WORKS!\n\t\t *\n\t\t * - method_exists() returns true for non-public methods, which passes the previous elseif\n\t\t * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct()\n\t\t * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited\n\t\t * - People will only complain if this doesn't work, even though it is documented that it shouldn't.\n\t\t *\n\t\t * ReflectionMethod::isConstructor() is the ONLY reliable check,\n\t\t * knowing which method will be executed as a constructor.\n\t\t */\n\t\telse\n\t\t{\n\t\t\t$reflection = new ReflectionMethod($class, $method);\n\t\t\tif ( ! $reflection->isPublic() OR $reflection->isConstructor())\n\t\t\t{\n\t\t\t\t$e404 = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ($e404)\n\t{\n\t\tif ( ! empty($RTR->routes['404_override']))\n\t\t{\n\t\t\tif (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2)\n\t\t\t{\n\t\t\t\t$error_method = 'index';\n\t\t\t}\n\n\t\t\t$error_class = ucfirst($error_class);\n\n\t\t\tif ( ! class_exists($error_class, FALSE))\n\t\t\t{\n\t\t\t\tif (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'))\n\t\t\t\t{\n\t\t\t\t\trequire_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php');\n\t\t\t\t\t$e404 = ! class_exists($error_class, FALSE);\n\t\t\t\t}\n\t\t\t\t// Were we in a directory? If so, check for a global override\n\t\t\t\telseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php'))\n\t\t\t\t{\n\t\t\t\t\trequire_once(APPPATH.'controllers/'.$error_class.'.php');\n\t\t\t\t\tif (($e404 = ! class_exists($error_class, FALSE)) === FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$RTR->directory = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$e404 = FALSE;\n\t\t\t}\n\t\t}\n\n\t\t// Did we reset the $e404 flag? If so, set the rsegments, starting from index 1\n\t\tif ( ! $e404)\n\t\t{\n\t\t\t$class = $error_class;\n\t\t\t$method = $error_method;\n\n\t\t\t$URI->rsegments = array(\n\t\t\t\t1 => $class,\n\t\t\t\t2 => $method\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tshow_404($RTR->directory.$class.'/'.$method);\n\t\t}\n\t}\n\n\tif ($method !== '_remap')\n\t{\n\t\t$params = array_slice($URI->rsegments, 2);\n\t}\n\n/*\n * ------------------------------------------------------\n *  Is there a \"pre_controller\" hook?\n * ------------------------------------------------------\n */\n\t$EXT->call_hook('pre_controller');\n\n/*\n * ------------------------------------------------------\n *  Instantiate the requested controller\n * ------------------------------------------------------\n */\n\t// Mark a start point so we can benchmark the controller\n\t$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');\n\n\t$CI = new $class();\n\n/*\n * ------------------------------------------------------\n *  Is there a \"post_controller_constructor\" hook?\n * ------------------------------------------------------\n */\n\t$EXT->call_hook('post_controller_constructor');\n\n/*\n * ------------------------------------------------------\n *  Call the requested method\n * ------------------------------------------------------\n */\n\tcall_user_func_array(array(&$CI, $method), $params);\n\n\t// Mark a benchmark end point\n\t$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');\n\n/*\n * ------------------------------------------------------\n *  Is there a \"post_controller\" hook?\n * ------------------------------------------------------\n */\n\t$EXT->call_hook('post_controller');\n\n/*\n * ------------------------------------------------------\n *  Send the final rendered output to the browser\n * ------------------------------------------------------\n */\n\tif ($EXT->call_hook('display_override') === FALSE)\n\t{\n\t\t$OUT->_display();\n\t}\n\n/*\n * ------------------------------------------------------\n *  Is there a \"post_system\" hook?\n * ------------------------------------------------------\n */\n\t$EXT->call_hook('post_system');\n"
  },
  {
    "path": "system/core/Common.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Common Functions\n *\n * Loads the base classes and executes the request.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tCodeIgniter\n * @category\tCommon Functions\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('is_php'))\n{\n\t/**\n\t * Determines if the current version of PHP is equal to or greater than the supplied value\n\t *\n\t * @param\tstring\n\t * @return\tbool\tTRUE if the current version is $version or higher\n\t */\n\tfunction is_php($version)\n\t{\n\t\tstatic $_is_php;\n\t\t$version = (string) $version;\n\n\t\tif ( ! isset($_is_php[$version]))\n\t\t{\n\t\t\t$_is_php[$version] = version_compare(PHP_VERSION, $version, '>=');\n\t\t}\n\n\t\treturn $_is_php[$version];\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('is_really_writable'))\n{\n\t/**\n\t * Tests for file writability\n\t *\n\t * is_writable() returns TRUE on Windows servers when you really can't write to\n\t * the file, based on the read-only attribute. is_writable() is also unreliable\n\t * on Unix servers if safe_mode is on.\n\t *\n\t * @link\thttps://bugs.php.net/bug.php?id=54709\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tfunction is_really_writable($file)\n\t{\n\t\t// If we're on a Unix server with safe_mode off we call is_writable\n\t\tif (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode')))\n\t\t{\n\t\t\treturn is_writable($file);\n\t\t}\n\n\t\t/* For Windows servers and safe_mode \"on\" installations we'll actually\n\t\t * write a file then read it. Bah...\n\t\t */\n\t\tif (is_dir($file))\n\t\t{\n\t\t\t$file = rtrim($file, '/').'/'.md5(mt_rand());\n\t\t\tif (($fp = @fopen($file, 'ab')) === FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tfclose($fp);\n\t\t\t@chmod($file, 0777);\n\t\t\t@unlink($file);\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tfclose($fp);\n\t\treturn TRUE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('load_class'))\n{\n\t/**\n\t * Class registry\n\t *\n\t * This function acts as a singleton. If the requested class does not\n\t * exist it is instantiated and set to a static variable. If it has\n\t * previously been instantiated the variable is returned.\n\t *\n\t * @param\tstring\tthe class name being requested\n\t * @param\tstring\tthe directory where the class should be found\n\t * @param\tmixed\tan optional argument to pass to the class constructor\n\t * @return\tobject\n\t */\n\tfunction &load_class($class, $directory = 'libraries', $param = NULL)\n\t{\n\t\tstatic $_classes = array();\n\n\t\t// Does the class exist? If so, we're done...\n\t\tif (isset($_classes[$class]))\n\t\t{\n\t\t\treturn $_classes[$class];\n\t\t}\n\n\t\t$name = FALSE;\n\n\t\t// Look for the class first in the local application/libraries folder\n\t\t// then in the native system/libraries folder\n\t\tforeach (array(APPPATH, BASEPATH) as $path)\n\t\t{\n\t\t\tif (file_exists($path.$directory.'/'.$class.'.php'))\n\t\t\t{\n\t\t\t\t$name = 'CI_'.$class;\n\n\t\t\t\tif (class_exists($name, FALSE) === FALSE)\n\t\t\t\t{\n\t\t\t\t\trequire_once($path.$directory.'/'.$class.'.php');\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Is the request a class extension? If so we load it too\n\t\tif (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'))\n\t\t{\n\t\t\t$name = config_item('subclass_prefix').$class;\n\n\t\t\tif (class_exists($name, FALSE) === FALSE)\n\t\t\t{\n\t\t\t\trequire_once(APPPATH.$directory.'/'.$name.'.php');\n\t\t\t}\n\t\t}\n\n\t\t// Did we find the class?\n\t\tif ($name === FALSE)\n\t\t{\n\t\t\t// Note: We use exit() rather than show_error() in order to avoid a\n\t\t\t// self-referencing loop with the Exceptions class\n\t\t\tset_status_header(503);\n\t\t\techo 'Unable to locate the specified class: '.$class.'.php';\n\t\t\texit(5); // EXIT_UNK_CLASS\n\t\t}\n\n\t\t// Keep track of what we just loaded\n\t\tis_loaded($class);\n\n\t\t$_classes[$class] = isset($param)\n\t\t\t? new $name($param)\n\t\t\t: new $name();\n\t\treturn $_classes[$class];\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('is_loaded'))\n{\n\t/**\n\t * Keeps track of which libraries have been loaded. This function is\n\t * called by the load_class() function above\n\t *\n\t * @param\tstring\n\t * @return\tarray\n\t */\n\tfunction &is_loaded($class = '')\n\t{\n\t\tstatic $_is_loaded = array();\n\n\t\tif ($class !== '')\n\t\t{\n\t\t\t$_is_loaded[strtolower($class)] = $class;\n\t\t}\n\n\t\treturn $_is_loaded;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('get_config'))\n{\n\t/**\n\t * Loads the main config.php file\n\t *\n\t * This function lets us grab the config file even if the Config class\n\t * hasn't been instantiated yet\n\t *\n\t * @param\tarray\n\t * @return\tarray\n\t */\n\tfunction &get_config(Array $replace = array())\n\t{\n\t\tstatic $config;\n\n\t\tif (empty($config))\n\t\t{\n\t\t\t$file_path = APPPATH.'config/config.php';\n\t\t\t$found = FALSE;\n\t\t\tif (file_exists($file_path))\n\t\t\t{\n\t\t\t\t$found = TRUE;\n\t\t\t\trequire($file_path);\n\t\t\t}\n\n\t\t\t// Is the config file in the environment folder?\n\t\t\tif (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))\n\t\t\t{\n\t\t\t\trequire($file_path);\n\t\t\t}\n\t\t\telseif ( ! $found)\n\t\t\t{\n\t\t\t\tset_status_header(503);\n\t\t\t\techo 'The configuration file does not exist.';\n\t\t\t\texit(3); // EXIT_CONFIG\n\t\t\t}\n\n\t\t\t// Does the $config array exist in the file?\n\t\t\tif ( ! isset($config) OR ! is_array($config))\n\t\t\t{\n\t\t\t\tset_status_header(503);\n\t\t\t\techo 'Your config file does not appear to be formatted correctly.';\n\t\t\t\texit(3); // EXIT_CONFIG\n\t\t\t}\n\t\t}\n\n\t\t// Are any values being dynamically added or replaced?\n\t\tforeach ($replace as $key => $val)\n\t\t{\n\t\t\t$config[$key] = $val;\n\t\t}\n\n\t\treturn $config;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('config_item'))\n{\n\t/**\n\t * Returns the specified config item\n\t *\n\t * @param\tstring\n\t * @return\tmixed\n\t */\n\tfunction config_item($item)\n\t{\n\t\tstatic $_config;\n\n\t\tif (empty($_config))\n\t\t{\n\t\t\t// references cannot be directly assigned to static variables, so we use an array\n\t\t\t$_config[0] =& get_config();\n\t\t}\n\n\t\treturn isset($_config[0][$item]) ? $_config[0][$item] : NULL;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('get_mimes'))\n{\n\t/**\n\t * Returns the MIME types array from config/mimes.php\n\t *\n\t * @return\tarray\n\t */\n\tfunction &get_mimes()\n\t{\n\t\tstatic $_mimes;\n\n\t\tif (empty($_mimes))\n\t\t{\n\t\t\t$_mimes = file_exists(APPPATH.'config/mimes.php')\n\t\t\t\t? include(APPPATH.'config/mimes.php')\n\t\t\t\t: array();\n\n\t\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))\n\t\t\t{\n\t\t\t\t$_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'));\n\t\t\t}\n\t\t}\n\n\t\treturn $_mimes;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('is_https'))\n{\n\t/**\n\t * Is HTTPS?\n\t *\n\t * Determines if the application is accessed via an encrypted\n\t * (HTTPS) connection.\n\t *\n\t * @return\tbool\n\t */\n\tfunction is_https()\n\t{\n\t\tif ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('is_cli'))\n{\n\n\t/**\n\t * Is CLI?\n\t *\n\t * Test to see if a request was made from the command line.\n\t *\n\t * @return \tbool\n\t */\n\tfunction is_cli()\n\t{\n\t\treturn (PHP_SAPI === 'cli' OR defined('STDIN'));\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('show_error'))\n{\n\t/**\n\t * Error Handler\n\t *\n\t * This function lets us invoke the exception class and\n\t * display errors using the standard error template located\n\t * in application/views/errors/error_general.php\n\t * This function will send the error page directly to the\n\t * browser and exit.\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tfunction show_error($message, $status_code = 500, $heading = 'An Error Was Encountered')\n\t{\n\t\t$status_code = abs($status_code);\n\t\tif ($status_code < 100)\n\t\t{\n\t\t\t$exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN\n\t\t\t$status_code = 500;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$exit_status = 1; // EXIT_ERROR\n\t\t}\n\n\t\t$_error =& load_class('Exceptions', 'core');\n\t\techo $_error->show_error($heading, $message, 'error_general', $status_code);\n\t\texit($exit_status);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('show_404'))\n{\n\t/**\n\t * 404 Page Handler\n\t *\n\t * This function is similar to the show_error() function above\n\t * However, instead of the standard error template it displays\n\t * 404 errors.\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tvoid\n\t */\n\tfunction show_404($page = '', $log_error = TRUE)\n\t{\n\t\t$_error =& load_class('Exceptions', 'core');\n\t\t$_error->show_404($page, $log_error);\n\t\texit(4); // EXIT_UNKNOWN_FILE\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('log_message'))\n{\n\t/**\n\t * Error Logging Interface\n\t *\n\t * We use this as a simple mechanism to access the logging\n\t * class and send messages to be logged.\n\t *\n\t * @param\tstring\tthe error level: 'error', 'debug' or 'info'\n\t * @param\tstring\tthe error message\n\t * @return\tvoid\n\t */\n\tfunction log_message($level, $message)\n\t{\n\t\tstatic $_log;\n\n\t\tif ($_log === NULL)\n\t\t{\n\t\t\t// references cannot be directly assigned to static variables, so we use an array\n\t\t\t$_log[0] =& load_class('Log', 'core');\n\t\t}\n\n\t\t$_log[0]->write_log($level, $message);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_status_header'))\n{\n\t/**\n\t * Set HTTP Status Header\n\t *\n\t * @param\tint\tthe status code\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tfunction set_status_header($code = 200, $text = '')\n\t{\n\t\tif (is_cli())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (empty($code) OR ! is_numeric($code))\n\t\t{\n\t\t\tshow_error('Status codes must be numeric', 500);\n\t\t}\n\n\t\tif (empty($text))\n\t\t{\n\t\t\tis_int($code) OR $code = (int) $code;\n\t\t\t$stati = array(\n\t\t\t\t100\t=> 'Continue',\n\t\t\t\t101\t=> 'Switching Protocols',\n\n\t\t\t\t200\t=> 'OK',\n\t\t\t\t201\t=> 'Created',\n\t\t\t\t202\t=> 'Accepted',\n\t\t\t\t203\t=> 'Non-Authoritative Information',\n\t\t\t\t204\t=> 'No Content',\n\t\t\t\t205\t=> 'Reset Content',\n\t\t\t\t206\t=> 'Partial Content',\n\n\t\t\t\t300\t=> 'Multiple Choices',\n\t\t\t\t301\t=> 'Moved Permanently',\n\t\t\t\t302\t=> 'Found',\n\t\t\t\t303\t=> 'See Other',\n\t\t\t\t304\t=> 'Not Modified',\n\t\t\t\t305\t=> 'Use Proxy',\n\t\t\t\t307\t=> 'Temporary Redirect',\n\n\t\t\t\t400\t=> 'Bad Request',\n\t\t\t\t401\t=> 'Unauthorized',\n\t\t\t\t402\t=> 'Payment Required',\n\t\t\t\t403\t=> 'Forbidden',\n\t\t\t\t404\t=> 'Not Found',\n\t\t\t\t405\t=> 'Method Not Allowed',\n\t\t\t\t406\t=> 'Not Acceptable',\n\t\t\t\t407\t=> 'Proxy Authentication Required',\n\t\t\t\t408\t=> 'Request Timeout',\n\t\t\t\t409\t=> 'Conflict',\n\t\t\t\t410\t=> 'Gone',\n\t\t\t\t411\t=> 'Length Required',\n\t\t\t\t412\t=> 'Precondition Failed',\n\t\t\t\t413\t=> 'Request Entity Too Large',\n\t\t\t\t414\t=> 'Request-URI Too Long',\n\t\t\t\t415\t=> 'Unsupported Media Type',\n\t\t\t\t416\t=> 'Requested Range Not Satisfiable',\n\t\t\t\t417\t=> 'Expectation Failed',\n\t\t\t\t422\t=> 'Unprocessable Entity',\n\t\t\t\t426\t=> 'Upgrade Required',\n\t\t\t\t428\t=> 'Precondition Required',\n\t\t\t\t429\t=> 'Too Many Requests',\n\t\t\t\t431\t=> 'Request Header Fields Too Large',\n\n\t\t\t\t500\t=> 'Internal Server Error',\n\t\t\t\t501\t=> 'Not Implemented',\n\t\t\t\t502\t=> 'Bad Gateway',\n\t\t\t\t503\t=> 'Service Unavailable',\n\t\t\t\t504\t=> 'Gateway Timeout',\n\t\t\t\t505\t=> 'HTTP Version Not Supported',\n\t\t\t\t511\t=> 'Network Authentication Required',\n\t\t\t);\n\n\t\t\tif (isset($stati[$code]))\n\t\t\t{\n\t\t\t\t$text = $stati[$code];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tshow_error('No status text available. Please check your status code number or supply your own message text.', 500);\n\t\t\t}\n\t\t}\n\n\t\tif (strpos(PHP_SAPI, 'cgi') === 0)\n\t\t{\n\t\t\theader('Status: '.$code.' '.$text, TRUE);\n\t\t\treturn;\n\t\t}\n\n\t\t$server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0'), TRUE))\n\t\t\t? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';\n\t\theader($server_protocol.' '.$code.' '.$text, TRUE, $code);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('_error_handler'))\n{\n\t/**\n\t * Error Handler\n\t *\n\t * This is the custom error handler that is declared at the (relative)\n\t * top of CodeIgniter.php. The main reason we use this is to permit\n\t * PHP errors to be logged in our own log files since the user may\n\t * not have access to server logs. Since this function effectively\n\t * intercepts PHP errors, however, we also need to display errors\n\t * based on the current error_reporting level.\n\t * We do that with the use of a PHP error template.\n\t *\n\t * @param\tint\t$severity\n\t * @param\tstring\t$message\n\t * @param\tstring\t$filepath\n\t * @param\tint\t$line\n\t * @return\tvoid\n\t */\n\tfunction _error_handler($severity, $message, $filepath, $line)\n\t{\n\t\t$is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);\n\n\t\t// When an error occurred, set the status header to '500 Internal Server Error'\n\t\t// to indicate to the client something went wrong.\n\t\t// This can't be done within the $_error->show_php_error method because\n\t\t// it is only called when the display_errors flag is set (which isn't usually\n\t\t// the case in a production environment) or when errors are ignored because\n\t\t// they are above the error_reporting threshold.\n\t\tif ($is_error)\n\t\t{\n\t\t\tset_status_header(500);\n\t\t}\n\n\t\t// Should we ignore the error? We'll get the current error_reporting\n\t\t// level and add its bits with the severity bits to find out.\n\t\tif (($severity & error_reporting()) !== $severity)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t$_error =& load_class('Exceptions', 'core');\n\t\t$_error->log_exception($severity, $message, $filepath, $line);\n\n\t\t// Should we display the error?\n\t\tif (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))\n\t\t{\n\t\t\t$_error->show_php_error($severity, $message, $filepath, $line);\n\t\t}\n\n\t\t// If the error is fatal, the execution of the script should be stopped because\n\t\t// errors can't be recovered from. Halting the script conforms with PHP's\n\t\t// default error handling. See http://www.php.net/manual/en/errorfunc.constants.php\n\t\tif ($is_error)\n\t\t{\n\t\t\texit(1); // EXIT_ERROR\n\t\t}\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_exception_handler'))\n{\n\t/**\n\t * Exception Handler\n\t *\n\t * Sends uncaught exceptions to the logger and displays them\n\t * only if display_errors is On so that they don't show up in\n\t * production environments.\n\t *\n\t * @param\tException\t$exception\n\t * @return\tvoid\n\t */\n\tfunction _exception_handler($exception)\n\t{\n\t\t$_error =& load_class('Exceptions', 'core');\n\t\t$_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine());\n\n\t\tis_cli() OR set_status_header(500);\n\t\t// Should we display the error?\n\t\tif (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))\n\t\t{\n\t\t\t$_error->show_exception($exception);\n\t\t}\n\n\t\texit(1); // EXIT_ERROR\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_shutdown_handler'))\n{\n\t/**\n\t * Shutdown Handler\n\t *\n\t * This is the shutdown handler that is declared at the top\n\t * of CodeIgniter.php. The main reason we use this is to simulate\n\t * a complete custom exception handler.\n\t *\n\t * E_STRICT is purposively neglected because such events may have\n\t * been caught. Duplication or none? None is preferred for now.\n\t *\n\t * @link\thttp://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a\n\t * @return\tvoid\n\t */\n\tfunction _shutdown_handler()\n\t{\n\t\t$last_error = error_get_last();\n\t\tif (isset($last_error) &&\n\t\t\t($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING)))\n\t\t{\n\t\t\t_error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']);\n\t\t}\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('remove_invisible_characters'))\n{\n\t/**\n\t * Remove Invisible Characters\n\t *\n\t * This prevents sandwiching null characters\n\t * between ascii characters, like Java\\0script.\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tfunction remove_invisible_characters($str, $url_encoded = TRUE)\n\t{\n\t\t$non_displayables = array();\n\n\t\t// every control character except newline (dec 10),\n\t\t// carriage return (dec 13) and horizontal tab (dec 09)\n\t\tif ($url_encoded)\n\t\t{\n\t\t\t$non_displayables[] = '/%0[0-8bcef]/i';\t// url encoded 00-08, 11, 12, 14, 15\n\t\t\t$non_displayables[] = '/%1[0-9a-f]/i';\t// url encoded 16-31\n\t\t\t$non_displayables[] = '/%7f/i';\t// url encoded 127\n\t\t}\n\n\t\t$non_displayables[] = '/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]+/S';\t// 00-08, 11, 12, 14-31, 127\n\n\t\tdo\n\t\t{\n\t\t\t$str = preg_replace($non_displayables, '', $str, -1, $count);\n\t\t}\n\t\twhile ($count);\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('html_escape'))\n{\n\t/**\n\t * Returns HTML escaped variable.\n\t *\n\t * @param\tmixed\t$var\t\tThe input string or array of strings to be escaped.\n\t * @param\tbool\t$double_encode\t$double_encode set to FALSE prevents escaping twice.\n\t * @return\tmixed\t\t\tThe escaped string or array of strings as a result.\n\t */\n\tfunction html_escape($var, $double_encode = TRUE)\n\t{\n\t\tif (empty($var))\n\t\t{\n\t\t\treturn $var;\n\t\t}\n\n\t\tif (is_array($var))\n\t\t{\n\t\t\tforeach (array_keys($var) as $key)\n\t\t\t{\n\t\t\t\t$var[$key] = html_escape($var[$key], $double_encode);\n\t\t\t}\n\n\t\t\treturn $var;\n\t\t}\n\n\t\treturn htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_stringify_attributes'))\n{\n\t/**\n\t * Stringify attributes for use in HTML tags.\n\t *\n\t * Helper function used to convert a string, array, or object\n\t * of attributes to a string.\n\t *\n\t * @param\tmixed\tstring, array, object\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tfunction _stringify_attributes($attributes, $js = FALSE)\n\t{\n\t\tif (empty($attributes))\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (is_string($attributes))\n\t\t{\n\t\t\treturn ' '.$attributes;\n\t\t}\n\n\t\t$attributes = (array) $attributes;\n\n\t\t$atts = '';\n\t\tforeach ($attributes as $key => $val)\n\t\t{\n\t\t\t$atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'=\"'.$val.'\"';\n\t\t}\n\n\t\treturn rtrim($atts, ',');\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('function_usable'))\n{\n\t/**\n\t * Function usable\n\t *\n\t * Executes a function_exists() check, and if the Suhosin PHP\n\t * extension is loaded - checks whether the function that is\n\t * checked might be disabled in there as well.\n\t *\n\t * This is useful as function_exists() will return FALSE for\n\t * functions disabled via the *disable_functions* php.ini\n\t * setting, but not for *suhosin.executor.func.blacklist* and\n\t * *suhosin.executor.disable_eval*. These settings will just\n\t * terminate script execution if a disabled function is executed.\n\t *\n\t * The above described behavior turned out to be a bug in Suhosin,\n\t * but even though a fix was committed for 0.9.34 on 2012-02-12,\n\t * that version is yet to be released. This function will therefore\n\t * be just temporary, but would probably be kept for a few years.\n\t *\n\t * @link\thttp://www.hardened-php.net/suhosin/\n\t * @param\tstring\t$function_name\tFunction to check for\n\t * @return\tbool\tTRUE if the function exists and is safe to call,\n\t *\t\t\tFALSE otherwise.\n\t */\n\tfunction function_usable($function_name)\n\t{\n\t\tstatic $_suhosin_func_blacklist;\n\n\t\tif (function_exists($function_name))\n\t\t{\n\t\t\tif ( ! isset($_suhosin_func_blacklist))\n\t\t\t{\n\t\t\t\t$_suhosin_func_blacklist = extension_loaded('suhosin')\n\t\t\t\t\t? explode(',', trim(ini_get('suhosin.executor.func.blacklist')))\n\t\t\t\t\t: array();\n\t\t\t}\n\n\t\t\treturn ! in_array($function_name, $_suhosin_func_blacklist, TRUE);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n"
  },
  {
    "path": "system/core/Config.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Config Class\n *\n * This class contains functions that enable config files to be managed\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/config.html\n */\nclass CI_Config {\n\n\t/**\n\t * List of all loaded config values\n\t *\n\t * @var\tarray\n\t */\n\tpublic $config = array();\n\n\t/**\n\t * List of all loaded config files\n\t *\n\t * @var\tarray\n\t */\n\tpublic $is_loaded =\tarray();\n\n\t/**\n\t * List of paths to search when trying to load a config file.\n\t *\n\t * @used-by\tCI_Loader\n\t * @var\t\tarray\n\t */\n\tpublic $_config_paths =\tarray(APPPATH);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Sets the $config data from the primary config.php file as a class variable.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->config =& get_config();\n\n\t\t// Set the base_url automatically if none was provided\n\t\tif (empty($this->config['base_url']))\n\t\t{\n\t\t\tif (isset($_SERVER['SERVER_ADDR']))\n\t\t\t{\n\t\t\t\tif (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t$server_addr = '['.$_SERVER['SERVER_ADDR'].']';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$server_addr = $_SERVER['SERVER_ADDR'];\n\t\t\t\t}\n\n\t\t\t\t$base_url = (is_https() ? 'https' : 'http').'://'.$server_addr\n\t\t\t\t\t.substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME'])));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$base_url = 'http://localhost/';\n\t\t\t}\n\n\t\t\t$this->set_item('base_url', $base_url);\n\t\t}\n\n\t\tlog_message('info', 'Config Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load Config File\n\t *\n\t * @param\tstring\t$file\t\t\tConfiguration file name\n\t * @param\tbool\t$use_sections\t\tWhether configuration values should be loaded into their own section\n\t * @param\tbool\t$fail_gracefully\tWhether to just return FALSE or display an error message\n\t * @return\tbool\tTRUE if the file was loaded correctly or FALSE on failure\n\t */\n\tpublic function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)\n\t{\n\t\t$file = ($file === '') ? 'config' : str_replace('.php', '', $file);\n\t\t$loaded = FALSE;\n\n\t\tforeach ($this->_config_paths as $path)\n\t\t{\n\t\t\tforeach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location)\n\t\t\t{\n\t\t\t\t$file_path = $path.'config/'.$location.'.php';\n\t\t\t\tif (in_array($file_path, $this->is_loaded, TRUE))\n\t\t\t\t{\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\n\t\t\t\tif ( ! file_exists($file_path))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinclude($file_path);\n\n\t\t\t\tif ( ! isset($config) OR ! is_array($config))\n\t\t\t\t{\n\t\t\t\t\tif ($fail_gracefully === TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t}\n\n\t\t\t\t\tshow_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');\n\t\t\t\t}\n\n\t\t\t\tif ($use_sections === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$this->config[$file] = isset($this->config[$file])\n\t\t\t\t\t\t? array_merge($this->config[$file], $config)\n\t\t\t\t\t\t: $config;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->config = array_merge($this->config, $config);\n\t\t\t\t}\n\n\t\t\t\t$this->is_loaded[] = $file_path;\n\t\t\t\t$config = NULL;\n\t\t\t\t$loaded = TRUE;\n\t\t\t\tlog_message('debug', 'Config file loaded: '.$file_path);\n\t\t\t}\n\t\t}\n\n\t\tif ($loaded === TRUE)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif ($fail_gracefully === TRUE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tshow_error('The configuration file '.$file.'.php does not exist.');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch a config file item\n\t *\n\t * @param\tstring\t$item\tConfig item name\n\t * @param\tstring\t$index\tIndex name\n\t * @return\tstring|null\tThe configuration item or NULL if the item doesn't exist\n\t */\n\tpublic function item($item, $index = '')\n\t{\n\t\tif ($index == '')\n\t\t{\n\t\t\treturn isset($this->config[$item]) ? $this->config[$item] : NULL;\n\t\t}\n\n\t\treturn isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch a config file item with slash appended (if not empty)\n\t *\n\t * @param\tstring\t\t$item\tConfig item name\n\t * @return\tstring|null\tThe configuration item or NULL if the item doesn't exist\n\t */\n\tpublic function slash_item($item)\n\t{\n\t\tif ( ! isset($this->config[$item]))\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\t\telseif (trim($this->config[$item]) === '')\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\treturn rtrim($this->config[$item], '/').'/';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Site URL\n\t *\n\t * Returns base_url . index_page [. uri_string]\n\t *\n\t * @uses\tCI_Config::_uri_string()\n\t *\n\t * @param\tstring|string[]\t$uri\tURI string or an array of segments\n\t * @param\tstring\t$protocol\n\t * @return\tstring\n\t */\n\tpublic function site_url($uri = '', $protocol = NULL)\n\t{\n\t\t$base_url = $this->slash_item('base_url');\n\n\t\tif (isset($protocol))\n\t\t{\n\t\t\t// For protocol-relative links\n\t\t\tif ($protocol === '')\n\t\t\t{\n\t\t\t\t$base_url = substr($base_url, strpos($base_url, '//'));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$base_url = $protocol.substr($base_url, strpos($base_url, '://'));\n\t\t\t}\n\t\t}\n\n\t\tif (empty($uri))\n\t\t{\n\t\t\treturn $base_url.$this->item('index_page');\n\t\t}\n\n\t\t$uri = $this->_uri_string($uri);\n\n\t\tif ($this->item('enable_query_strings') === FALSE)\n\t\t{\n\t\t\t$suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : '';\n\n\t\t\tif ($suffix !== '')\n\t\t\t{\n\t\t\t\tif (($offset = strpos($uri, '?')) !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t$uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$uri .= $suffix;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $base_url.$this->slash_item('index_page').$uri;\n\t\t}\n\t\telseif (strpos($uri, '?') === FALSE)\n\t\t{\n\t\t\t$uri = '?'.$uri;\n\t\t}\n\n\t\treturn $base_url.$this->item('index_page').$uri;\n\t}\n\n\t// -------------------------------------------------------------\n\n\t/**\n\t * Base URL\n\t *\n\t * Returns base_url [. uri_string]\n\t *\n\t * @uses\tCI_Config::_uri_string()\n\t *\n\t * @param\tstring|string[]\t$uri\tURI string or an array of segments\n\t * @param\tstring\t$protocol\n\t * @return\tstring\n\t */\n\tpublic function base_url($uri = '', $protocol = NULL)\n\t{\n\t\t$base_url = $this->slash_item('base_url');\n\n\t\tif (isset($protocol))\n\t\t{\n\t\t\t// For protocol-relative links\n\t\t\tif ($protocol === '')\n\t\t\t{\n\t\t\t\t$base_url = substr($base_url, strpos($base_url, '//'));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$base_url = $protocol.substr($base_url, strpos($base_url, '://'));\n\t\t\t}\n\t\t}\n\n\t\treturn $base_url.$this->_uri_string($uri);\n\t}\n\n\t// -------------------------------------------------------------\n\n\t/**\n\t * Build URI string\n\t *\n\t * @used-by\tCI_Config::site_url()\n\t * @used-by\tCI_Config::base_url()\n\t *\n\t * @param\tstring|string[]\t$uri\tURI string or an array of segments\n\t * @return\tstring\n\t */\n\tprotected function _uri_string($uri)\n\t{\n\t\tif ($this->item('enable_query_strings') === FALSE)\n\t\t{\n\t\t\tis_array($uri) && $uri = implode('/', $uri);\n\t\t\treturn ltrim($uri, '/');\n\t\t}\n\t\telseif (is_array($uri))\n\t\t{\n\t\t\treturn http_build_query($uri);\n\t\t}\n\n\t\treturn $uri;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * System URL\n\t *\n\t * @deprecated\t3.0.0\tEncourages insecure practices\n\t * @return\tstring\n\t */\n\tpublic function system_url()\n\t{\n\t\t$x = explode('/', preg_replace('|/*(.+?)/*$|', '\\\\1', BASEPATH));\n\t\treturn $this->slash_item('base_url').end($x).'/';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set a config file item\n\t *\n\t * @param\tstring\t$item\tConfig item key\n\t * @param\tstring\t$value\tConfig item value\n\t * @return\tvoid\n\t */\n\tpublic function set_item($item, $value)\n\t{\n\t\t$this->config[$item] = $value;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Controller.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Application Controller Class\n *\n * This class object is the super class that every library in\n * CodeIgniter will be assigned to.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/general/controllers.html\n */\nclass CI_Controller {\n\n\t/**\n\t * Reference to the CI singleton\n\t *\n\t * @var\tobject\n\t */\n\tprivate static $instance;\n\n\t/**\n\t * CI_Loader\n\t *\n\t * @var\tCI_Loader\n\t */\n\tpublic $load;\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tself::$instance =& $this;\n\n\t\t// Assign all the class objects that were instantiated by the\n\t\t// bootstrap file (CodeIgniter.php) to local class variables\n\t\t// so that CI can run as one big super object.\n\t\tforeach (is_loaded() as $var => $class)\n\t\t{\n\t\t\t$this->$var =& load_class($class);\n\t\t}\n\n\t\t$this->load =& load_class('Loader', 'core');\n\t\t$this->load->initialize();\n\t\tlog_message('info', 'Controller Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the CI singleton\n\t *\n\t * @static\n\t * @return\tobject\n\t */\n\tpublic static function &get_instance()\n\t{\n\t\treturn self::$instance;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Exceptions.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Exceptions Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tExceptions\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/exceptions.html\n */\nclass CI_Exceptions {\n\n\t/**\n\t * Nesting level of the output buffering mechanism\n\t *\n\t * @var\tint\n\t */\n\tpublic $ob_level;\n\n\t/**\n\t * List of available error levels\n\t *\n\t * @var\tarray\n\t */\n\tpublic $levels = array(\n\t\tE_ERROR\t\t\t=>\t'Error',\n\t\tE_WARNING\t\t=>\t'Warning',\n\t\tE_PARSE\t\t\t=>\t'Parsing Error',\n\t\tE_NOTICE\t\t=>\t'Notice',\n\t\tE_CORE_ERROR\t\t=>\t'Core Error',\n\t\tE_CORE_WARNING\t\t=>\t'Core Warning',\n\t\tE_COMPILE_ERROR\t\t=>\t'Compile Error',\n\t\tE_COMPILE_WARNING\t=>\t'Compile Warning',\n\t\tE_USER_ERROR\t\t=>\t'User Error',\n\t\tE_USER_WARNING\t\t=>\t'User Warning',\n\t\tE_USER_NOTICE\t\t=>\t'User Notice',\n\t\tE_STRICT\t\t=>\t'Runtime Notice'\n\t);\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->ob_level = ob_get_level();\n\t\t// Note: Do not log messages from this constructor.\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Exception Logger\n\t *\n\t * Logs PHP generated error messages\n\t *\n\t * @param\tint\t$severity\tLog level\n\t * @param\tstring\t$message\tError message\n\t * @param\tstring\t$filepath\tFile path\n\t * @param\tint\t$line\t\tLine number\n\t * @return\tvoid\n\t */\n\tpublic function log_exception($severity, $message, $filepath, $line)\n\t{\n\t\t$severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;\n\t\tlog_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * 404 Error Handler\n\t *\n\t * @uses\tCI_Exceptions::show_error()\n\t *\n\t * @param\tstring\t$page\t\tPage URI\n\t * @param \tbool\t$log_error\tWhether to log the error\n\t * @return\tvoid\n\t */\n\tpublic function show_404($page = '', $log_error = TRUE)\n\t{\n\t\tif (is_cli())\n\t\t{\n\t\t\t$heading = 'Not Found';\n\t\t\t$message = 'The controller/method pair you requested was not found.';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$heading = '404 Page Not Found';\n\t\t\t$message = 'The page you requested was not found.';\n\t\t}\n\n\t\t// By default we log this, but allow a dev to skip it\n\t\tif ($log_error)\n\t\t{\n\t\t\tlog_message('error', $heading.': '.$page);\n\t\t}\n\n\t\techo $this->show_error($heading, $message, 'error_404', 404);\n\t\texit(4); // EXIT_UNKNOWN_FILE\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * General Error Page\n\t *\n\t * Takes an error message as input (either as a string or an array)\n\t * and displays it using the specified template.\n\t *\n\t * @param\tstring\t\t$heading\tPage heading\n\t * @param\tstring|string[]\t$message\tError message\n\t * @param\tstring\t\t$template\tTemplate name\n\t * @param \tint\t\t$status_code\t(default: 500)\n\t *\n\t * @return\tstring\tError page output\n\t */\n\tpublic function show_error($heading, $message, $template = 'error_general', $status_code = 500)\n\t{\n\t\t$templates_path = config_item('error_views_path');\n\t\tif (empty($templates_path))\n\t\t{\n\t\t\t$templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR;\n\t\t}\n\n\t\tif (is_cli())\n\t\t{\n\t\t\t$message = \"\\t\".(is_array($message) ? implode(\"\\n\\t\", $message) : $message);\n\t\t\t$template = 'cli'.DIRECTORY_SEPARATOR.$template;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tset_status_header($status_code);\n\t\t\t$message = '<p>'.(is_array($message) ? implode('</p><p>', $message) : $message).'</p>';\n\t\t\t$template = 'html'.DIRECTORY_SEPARATOR.$template;\n\t\t}\n\n\t\tif (ob_get_level() > $this->ob_level + 1)\n\t\t{\n\t\t\tob_end_flush();\n\t\t}\n\t\tob_start();\n\t\tinclude($templates_path.$template.'.php');\n\t\t$buffer = ob_get_contents();\n\t\tob_end_clean();\n\t\treturn $buffer;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\tpublic function show_exception($exception)\n\t{\n\t\t$templates_path = config_item('error_views_path');\n\t\tif (empty($templates_path))\n\t\t{\n\t\t\t$templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR;\n\t\t}\n\n\t\t$message = $exception->getMessage();\n\t\tif (empty($message))\n\t\t{\n\t\t\t$message = '(null)';\n\t\t}\n\n\t\tif (is_cli())\n\t\t{\n\t\t\t$templates_path .= 'cli'.DIRECTORY_SEPARATOR;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$templates_path .= 'html'.DIRECTORY_SEPARATOR;\n\t\t}\n\n\t\tif (ob_get_level() > $this->ob_level + 1)\n\t\t{\n\t\t\tob_end_flush();\n\t\t}\n\n\t\tob_start();\n\t\tinclude($templates_path.'error_exception.php');\n\t\t$buffer = ob_get_contents();\n\t\tob_end_clean();\n\t\techo $buffer;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Native PHP error handler\n\t *\n\t * @param\tint\t$severity\tError level\n\t * @param\tstring\t$message\tError message\n\t * @param\tstring\t$filepath\tFile path\n\t * @param\tint\t$line\t\tLine number\n\t * @return\tvoid\n\t */\n\tpublic function show_php_error($severity, $message, $filepath, $line)\n\t{\n\t\t$templates_path = config_item('error_views_path');\n\t\tif (empty($templates_path))\n\t\t{\n\t\t\t$templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR;\n\t\t}\n\n\t\t$severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;\n\n\t\t// For safety reasons we don't show the full file path in non-CLI requests\n\t\tif ( ! is_cli())\n\t\t{\n\t\t\t$filepath = str_replace('\\\\', '/', $filepath);\n\t\t\tif (FALSE !== strpos($filepath, '/'))\n\t\t\t{\n\t\t\t\t$x = explode('/', $filepath);\n\t\t\t\t$filepath = $x[count($x)-2].'/'.end($x);\n\t\t\t}\n\n\t\t\t$template = 'html'.DIRECTORY_SEPARATOR.'error_php';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$template = 'cli'.DIRECTORY_SEPARATOR.'error_php';\n\t\t}\n\n\t\tif (ob_get_level() > $this->ob_level + 1)\n\t\t{\n\t\t\tob_end_flush();\n\t\t}\n\t\tob_start();\n\t\tinclude($templates_path.$template.'.php');\n\t\t$buffer = ob_get_contents();\n\t\tob_end_clean();\n\t\techo $buffer;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Hooks.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Hooks Class\n *\n * Provides a mechanism to extend the base system without hacking.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/general/hooks.html\n */\nclass CI_Hooks {\n\n\t/**\n\t * Determines whether hooks are enabled\n\t *\n\t * @var\tbool\n\t */\n\tpublic $enabled = FALSE;\n\n\t/**\n\t * List of all hooks set in config/hooks.php\n\t *\n\t * @var\tarray\n\t */\n\tpublic $hooks =\tarray();\n\n\t/**\n\t * Array with class objects to use hooks methods\n\t *\n\t * @var array\n\t */\n\tprotected $_objects = array();\n\n\t/**\n\t * In progress flag\n\t *\n\t * Determines whether hook is in progress, used to prevent infinte loops\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_in_progress = FALSE;\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$CFG =& load_class('Config', 'core');\n\t\tlog_message('info', 'Hooks Class Initialized');\n\n\t\t// If hooks are not enabled in the config file\n\t\t// there is nothing else to do\n\t\tif ($CFG->item('enable_hooks') === FALSE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Grab the \"hooks\" definition file.\n\t\tif (file_exists(APPPATH.'config/hooks.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/hooks.php');\n\t\t}\n\n\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');\n\t\t}\n\n\t\t// If there are no hooks, we're done.\n\t\tif ( ! isset($hook) OR ! is_array($hook))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t$this->hooks =& $hook;\n\t\t$this->enabled = TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Call Hook\n\t *\n\t * Calls a particular hook. Called by CodeIgniter.php.\n\t *\n\t * @uses\tCI_Hooks::_run_hook()\n\t *\n\t * @param\tstring\t$which\tHook name\n\t * @return\tbool\tTRUE on success or FALSE on failure\n\t */\n\tpublic function call_hook($which = '')\n\t{\n\t\tif ( ! $this->enabled OR ! isset($this->hooks[$which]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function']))\n\t\t{\n\t\t\tforeach ($this->hooks[$which] as $val)\n\t\t\t{\n\t\t\t\t$this->_run_hook($val);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_run_hook($this->hooks[$which]);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Run Hook\n\t *\n\t * Runs a particular hook\n\t *\n\t * @param\tarray\t$data\tHook details\n\t * @return\tbool\tTRUE on success or FALSE on failure\n\t */\n\tprotected function _run_hook($data)\n\t{\n\t\t// Closures/lambda functions and array($object, 'method') callables\n\t\tif (is_callable($data))\n\t\t{\n\t\t\tis_array($data)\n\t\t\t\t? $data[0]->{$data[1]}()\n\t\t\t\t: $data();\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif ( ! is_array($data))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// -----------------------------------\n\t\t// Safety - Prevents run-away loops\n\t\t// -----------------------------------\n\n\t\t// If the script being called happens to have the same\n\t\t// hook call within it a loop can happen\n\t\tif ($this->_in_progress === TRUE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// -----------------------------------\n\t\t// Set file path\n\t\t// -----------------------------------\n\n\t\tif ( ! isset($data['filepath'], $data['filename']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$filepath = APPPATH.$data['filepath'].'/'.$data['filename'];\n\n\t\tif ( ! file_exists($filepath))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Determine and class and/or function names\n\t\t$class\t\t= empty($data['class']) ? FALSE : $data['class'];\n\t\t$function\t= empty($data['function']) ? FALSE : $data['function'];\n\t\t$params\t\t= isset($data['params']) ? $data['params'] : '';\n\n\t\tif (empty($function))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set the _in_progress flag\n\t\t$this->_in_progress = TRUE;\n\n\t\t// Call the requested class and/or function\n\t\tif ($class !== FALSE)\n\t\t{\n\t\t\t// The object is stored?\n\t\t\tif (isset($this->_objects[$class]))\n\t\t\t{\n\t\t\t\tif (method_exists($this->_objects[$class], $function))\n\t\t\t\t{\n\t\t\t\t\t$this->_objects[$class]->$function($params);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn $this->_in_progress = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tclass_exists($class, FALSE) OR require_once($filepath);\n\n\t\t\t\tif ( ! class_exists($class, FALSE) OR ! method_exists($class, $function))\n\t\t\t\t{\n\t\t\t\t\treturn $this->_in_progress = FALSE;\n\t\t\t\t}\n\n\t\t\t\t// Store the object and execute the method\n\t\t\t\t$this->_objects[$class] = new $class();\n\t\t\t\t$this->_objects[$class]->$function($params);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfunction_exists($function) OR require_once($filepath);\n\n\t\t\tif ( ! function_exists($function))\n\t\t\t{\n\t\t\t\treturn $this->_in_progress = FALSE;\n\t\t\t}\n\n\t\t\t$function($params);\n\t\t}\n\n\t\t$this->_in_progress = FALSE;\n\t\treturn TRUE;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Input.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Input Class\n *\n * Pre-processes global input data for security\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tInput\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/input.html\n */\nclass CI_Input {\n\n\t/**\n\t * IP address of the current user\n\t *\n\t * @var\tstring\n\t */\n\tprotected $ip_address = FALSE;\n\n\t/**\n\t * Allow GET array flag\n\t *\n\t * If set to FALSE, then $_GET will be set to an empty array.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_allow_get_array = TRUE;\n\n\t/**\n\t * Standardize new lines flag\n\t *\n\t * If set to TRUE, then newlines are standardized.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_standardize_newlines;\n\n\t/**\n\t * Enable XSS flag\n\t *\n\t * Determines whether the XSS filter is always active when\n\t * GET, POST or COOKIE data is encountered.\n\t * Set automatically based on config setting.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_enable_xss = FALSE;\n\n\t/**\n\t * Enable CSRF flag\n\t *\n\t * Enables a CSRF cookie token to be set.\n\t * Set automatically based on config setting.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_enable_csrf = FALSE;\n\n\t/**\n\t * List of all HTTP request headers\n\t *\n\t * @var array\n\t */\n\tprotected $headers = array();\n\n\t/**\n\t * Raw input stream data\n\t *\n\t * Holds a cache of php://input contents\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_raw_input_stream;\n\n\t/**\n\t * Parsed input stream data\n\t *\n\t * Parsed from php://input at runtime\n\t *\n\t * @see\tCI_Input::input_stream()\n\t * @var\tarray\n\t */\n\tprotected $_input_stream;\n\n\tprotected $security;\n\tprotected $uni;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Determines whether to globally enable the XSS processing\n\t * and whether to allow the $_GET array.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->_allow_get_array\t\t= (config_item('allow_get_array') !== FALSE);\n\t\t$this->_enable_xss\t\t= (config_item('global_xss_filtering') === TRUE);\n\t\t$this->_enable_csrf\t\t= (config_item('csrf_protection') === TRUE);\n\t\t$this->_standardize_newlines\t= (bool) config_item('standardize_newlines');\n\n\t\t$this->security =& load_class('Security', 'core');\n\n\t\t// Do we need the UTF-8 class?\n\t\tif (UTF8_ENABLED === TRUE)\n\t\t{\n\t\t\t$this->uni =& load_class('Utf8', 'core');\n\t\t}\n\n\t\t// Sanitize global arrays\n\t\t$this->_sanitize_globals();\n\n\t\t// CSRF Protection check\n\t\tif ($this->_enable_csrf === TRUE && ! is_cli())\n\t\t{\n\t\t\t$this->security->csrf_verify();\n\t\t}\n\n\t\tlog_message('info', 'Input Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch from array\n\t *\n\t * Internal method used to retrieve values from global arrays.\n\t *\n\t * @param\tarray\t&$array\t\t$_GET, $_POST, $_COOKIE, $_SERVER, etc.\n\t * @param\tmixed\t$index\t\tIndex for item to be fetched from $array\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tprotected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL)\n\t{\n\t\tis_bool($xss_clean) OR $xss_clean = $this->_enable_xss;\n\n\t\t// If $index is NULL, it means that the whole $array is requested\n\t\tisset($index) OR $index = array_keys($array);\n\n\t\t// allow fetching multiple keys at once\n\t\tif (is_array($index))\n\t\t{\n\t\t\t$output = array();\n\t\t\tforeach ($index as $key)\n\t\t\t{\n\t\t\t\t$output[$key] = $this->_fetch_from_array($array, $key, $xss_clean);\n\t\t\t}\n\n\t\t\treturn $output;\n\t\t}\n\n\t\tif (isset($array[$index]))\n\t\t{\n\t\t\t$value = $array[$index];\n\t\t}\n\t\telseif (($count = preg_match_all('/(?:^[^\\[]+)|\\[[^]]*\\]/', $index, $matches)) > 1) // Does the index contain array notation\n\t\t{\n\t\t\t$value = $array;\n\t\t\tfor ($i = 0; $i < $count; $i++)\n\t\t\t{\n\t\t\t\t$key = trim($matches[0][$i], '[]');\n\t\t\t\tif ($key === '') // Empty notation will return the value as array\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (isset($value[$key]))\n\t\t\t\t{\n\t\t\t\t\t$value = $value[$key];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\treturn ($xss_clean === TRUE)\n\t\t\t? $this->security->xss_clean($value)\n\t\t\t: $value;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from the GET array\n\t *\n\t * @param\tmixed\t$index\t\tIndex for item to be fetched from $_GET\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function get($index = NULL, $xss_clean = NULL)\n\t{\n\t\treturn $this->_fetch_from_array($_GET, $index, $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from the POST array\n\t *\n\t * @param\tmixed\t$index\t\tIndex for item to be fetched from $_POST\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function post($index = NULL, $xss_clean = NULL)\n\t{\n\t\treturn $this->_fetch_from_array($_POST, $index, $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from POST data with fallback to GET\n\t *\n\t * @param\tstring\t$index\t\tIndex for item to be fetched from $_POST or $_GET\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function post_get($index, $xss_clean = NULL)\n\t{\n\t\treturn isset($_POST[$index])\n\t\t\t? $this->post($index, $xss_clean)\n\t\t\t: $this->get($index, $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from GET data with fallback to POST\n\t *\n\t * @param\tstring\t$index\t\tIndex for item to be fetched from $_GET or $_POST\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function get_post($index, $xss_clean = NULL)\n\t{\n\t\treturn isset($_GET[$index])\n\t\t\t? $this->get($index, $xss_clean)\n\t\t\t: $this->post($index, $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from the COOKIE array\n\t *\n\t * @param\tmixed\t$index\t\tIndex for item to be fetched from $_COOKIE\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function cookie($index = NULL, $xss_clean = NULL)\n\t{\n\t\treturn $this->_fetch_from_array($_COOKIE, $index, $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from the SERVER array\n\t *\n\t * @param\tmixed\t$index\t\tIndex for item to be fetched from $_SERVER\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function server($index, $xss_clean = NULL)\n\t{\n\t\treturn $this->_fetch_from_array($_SERVER, $index, $xss_clean);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Fetch an item from the php://input stream\n\t *\n\t * Useful when you need to access PUT, DELETE or PATCH request data.\n\t *\n\t * @param\tstring\t$index\t\tIndex for item to be fetched\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tmixed\n\t */\n\tpublic function input_stream($index = NULL, $xss_clean = NULL)\n\t{\n\t\t// Prior to PHP 5.6, the input stream can only be read once,\n\t\t// so we'll need to check if we have already done that first.\n\t\tif ( ! is_array($this->_input_stream))\n\t\t{\n\t\t\t// $this->raw_input_stream will trigger __get().\n\t\t\tparse_str($this->raw_input_stream, $this->_input_stream);\n\t\t\tis_array($this->_input_stream) OR $this->_input_stream = array();\n\t\t}\n\n\t\treturn $this->_fetch_from_array($this->_input_stream, $index, $xss_clean);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Set cookie\n\t *\n\t * Accepts an arbitrary number of parameters (up to 7) or an associative\n\t * array in the first parameter containing all the values.\n\t *\n\t * @param\tstring|mixed[]\t$name\t\tCookie name or an array containing parameters\n\t * @param\tstring\t\t$value\t\tCookie value\n\t * @param\tint\t\t$expire\t\tCookie expiration time in seconds\n\t * @param\tstring\t\t$domain\t\tCookie domain (e.g.: '.yourdomain.com')\n\t * @param\tstring\t\t$path\t\tCookie path (default: '/')\n\t * @param\tstring\t\t$prefix\t\tCookie name prefix\n\t * @param\tbool\t\t$secure\t\tWhether to only transfer cookies via SSL\n\t * @param\tbool\t\t$httponly\tWhether to only makes the cookie accessible via HTTP (no javascript)\n\t * @param\tstring\t\t$samesite\tSameSite attribute\n\t * @return\tvoid\n\t */\n\tpublic function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL, $samesite = NULL)\n\t{\n\t\tif (is_array($name))\n\t\t{\n\t\t\t// always leave 'name' in last place, as the loop will break otherwise, due to $$item\n\t\t\tforeach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name', 'samesite') as $item)\n\t\t\t{\n\t\t\t\tif (isset($name[$item]))\n\t\t\t\t{\n\t\t\t\t\t$$item = $name[$item];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ($prefix === '' && config_item('cookie_prefix') !== '')\n\t\t{\n\t\t\t$prefix = config_item('cookie_prefix');\n\t\t}\n\n\t\tif ($domain == '' && config_item('cookie_domain') != '')\n\t\t{\n\t\t\t$domain = config_item('cookie_domain');\n\t\t}\n\n\t\tif ($path === '/' && config_item('cookie_path') !== '/')\n\t\t{\n\t\t\t$path = config_item('cookie_path');\n\t\t}\n\n\t\t$secure = ($secure === NULL && config_item('cookie_secure') !== NULL)\n\t\t\t? (bool) config_item('cookie_secure')\n\t\t\t: (bool) $secure;\n\n\t\t$httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL)\n\t\t\t? (bool) config_item('cookie_httponly')\n\t\t\t: (bool) $httponly;\n\n\t\tif ( ! is_numeric($expire))\n\t\t{\n\t\t\t$expire = time() - 86500;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$expire = ($expire > 0) ? time() + $expire : 0;\n\t\t}\n\n\t\tisset($samesite) OR $samesite = config_item('cookie_samesite');\n\t\tif (isset($samesite))\n\t\t{\n\t\t\t$samesite = ucfirst(strtolower($samesite));\n\t\t\tin_array($samesite, array('Lax', 'Strict', 'None'), TRUE) OR $samesite = 'Lax';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$samesite = 'Lax';\n\t\t}\n\n\t\tif ($samesite === 'None' && ! $secure)\n\t\t{\n\t\t\tlog_message('error', $name.' cookie sent with SameSite=None, but without Secure attribute.');\n\t\t}\n\n\t\tif ( ! is_php('7.3'))\n\t\t{\n\t\t\t$maxage = $expire - time();\n\t\t\tif ($maxage < 1)\n\t\t\t{\n\t\t\t\t$maxage = 0;\n\t\t\t}\n\n\t\t\t$cookie_header = 'Set-Cookie: '.$prefix.$name.'='.rawurlencode($value);\n\t\t\t$cookie_header .= ($expire === 0 ? '' : '; Expires='.gmdate('D, d-M-Y H:i:s T', $expire)).'; Max-Age='.$maxage;\n\t\t\t$cookie_header .= '; Path='.$path.($domain !== '' ? '; Domain='.$domain : '');\n\t\t\t$cookie_header .= ($secure ? '; Secure' : '').($httponly ? '; HttpOnly' : '').'; SameSite='.$samesite;\n\t\t\theader($cookie_header);\n\t\t\treturn;\n\t\t}\n\n\t\t$setcookie_options = array(\n\t\t\t'expires' => $expire,\n\t\t\t'path' => $path,\n\t\t\t'domain' => $domain,\n\t\t\t'secure' => $secure,\n\t\t\t'httponly' => $httponly,\n\t\t\t'samesite' => $samesite,\n\t\t);\n\t\tsetcookie($prefix.$name, $value, $setcookie_options);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch the IP Address\n\t *\n\t * Determines and validates the visitor's IP address.\n\t *\n\t * @return\tstring\tIP address\n\t */\n\tpublic function ip_address()\n\t{\n\t\tif ($this->ip_address !== FALSE)\n\t\t{\n\t\t\treturn $this->ip_address;\n\t\t}\n\n\t\t$proxy_ips = config_item('proxy_ips');\n\t\tif ( ! empty($proxy_ips) && ! is_array($proxy_ips))\n\t\t{\n\t\t\t$proxy_ips = explode(',', str_replace(' ', '', $proxy_ips));\n\t\t}\n\n\t\t$this->ip_address = $this->server('REMOTE_ADDR');\n\n\t\tif ($proxy_ips)\n\t\t{\n\t\t\tforeach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header)\n\t\t\t{\n\t\t\t\tif (($spoof = $this->server($header)) !== NULL)\n\t\t\t\t{\n\t\t\t\t\t// Some proxies typically list the whole chain of IP\n\t\t\t\t\t// addresses through which the client has reached us.\n\t\t\t\t\t// e.g. client_ip, proxy_ip1, proxy_ip2, etc.\n\t\t\t\t\tsscanf($spoof, '%[^,]', $spoof);\n\n\t\t\t\t\tif ( ! $this->valid_ip($spoof))\n\t\t\t\t\t{\n\t\t\t\t\t\t$spoof = NULL;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($spoof)\n\t\t\t{\n\t\t\t\tfor ($i = 0, $c = count($proxy_ips); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t// Check if we have an IP address or a subnet\n\t\t\t\t\tif (strpos($proxy_ips[$i], '/') === FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t// An IP address (and not a subnet) is specified.\n\t\t\t\t\t\t// We can compare right away.\n\t\t\t\t\t\tif ($proxy_ips[$i] === $this->ip_address)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->ip_address = $spoof;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// We have a subnet ... now the heavy lifting begins\n\t\t\t\t\tisset($separator) OR $separator = $this->valid_ip($this->ip_address, 'ipv6') ? ':' : '.';\n\n\t\t\t\t\t// If the proxy entry doesn't match the IP protocol - skip it\n\t\t\t\t\tif (strpos($proxy_ips[$i], $separator) === FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Convert the REMOTE_ADDR IP address to binary, if needed\n\t\t\t\t\tif ( ! isset($ip, $sprintf))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ($separator === ':')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Make sure we're have the \"full\" IPv6 format\n\t\t\t\t\t\t\t$ip = explode(':',\n\t\t\t\t\t\t\t\tstr_replace('::',\n\t\t\t\t\t\t\t\t\tstr_repeat(':', 9 - substr_count($this->ip_address, ':')),\n\t\t\t\t\t\t\t\t\t$this->ip_address\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfor ($j = 0; $j < 8; $j++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$ip[$j] = intval($ip[$j], 16);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$sprintf = '%016b%016b%016b%016b%016b%016b%016b%016b';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$ip = explode('.', $this->ip_address);\n\t\t\t\t\t\t\t$sprintf = '%08b%08b%08b%08b';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$ip = vsprintf($sprintf, $ip);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Split the netmask length off the network address\n\t\t\t\t\tsscanf($proxy_ips[$i], '%[^/]/%d', $netaddr, $masklen);\n\n\t\t\t\t\t// Again, an IPv6 address is most likely in a compressed form\n\t\t\t\t\tif ($separator === ':')\n\t\t\t\t\t{\n\t\t\t\t\t\t$netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr));\n\t\t\t\t\t\tfor ($j = 0; $j < 8; $j++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$netaddr[$j] = intval($netaddr[$j], 16);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$netaddr = explode('.', $netaddr);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Convert to binary and finally compare\n\t\t\t\t\tif (strncmp($ip, vsprintf($sprintf, $netaddr), $masklen) === 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->ip_address = $spoof;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $this->valid_ip($this->ip_address))\n\t\t{\n\t\t\treturn $this->ip_address = '0.0.0.0';\n\t\t}\n\n\t\treturn $this->ip_address;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate IP Address\n\t *\n\t * @param\tstring\t$ip\tIP address\n\t * @param\tstring\t$which\tIP protocol: 'ipv4' or 'ipv6'\n\t * @return\tbool\n\t */\n\tpublic function valid_ip($ip, $which = '')\n\t{\n\t\tswitch (strtolower($which))\n\t\t{\n\t\t\tcase 'ipv4':\n\t\t\t\t$which = FILTER_FLAG_IPV4;\n\t\t\t\tbreak;\n\t\t\tcase 'ipv6':\n\t\t\t\t$which = FILTER_FLAG_IPV6;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$which = 0;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn (bool) filter_var($ip, FILTER_VALIDATE_IP, $which);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch User Agent string\n\t *\n\t * @return\tstring|null\tUser Agent string or NULL if it doesn't exist\n\t */\n\tpublic function user_agent($xss_clean = NULL)\n\t{\n\t\treturn $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sanitize Globals\n\t *\n\t * Internal method serving for the following purposes:\n\t *\n\t *\t- Unsets $_GET data, if query strings are not enabled\n\t *\t- Cleans POST, COOKIE and SERVER data\n\t * \t- Standardizes newline characters to PHP_EOL\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _sanitize_globals()\n\t{\n\t\t// Is $_GET data allowed? If not we'll set the $_GET to an empty array\n\t\tif ($this->_allow_get_array === FALSE)\n\t\t{\n\t\t\t$_GET = array();\n\t\t}\n\t\telseif (is_array($_GET))\n\t\t{\n\t\t\tforeach ($_GET as $key => $val)\n\t\t\t{\n\t\t\t\t$_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);\n\t\t\t}\n\t\t}\n\n\t\t// Clean $_POST Data\n\t\tif (is_array($_POST))\n\t\t{\n\t\t\tforeach ($_POST as $key => $val)\n\t\t\t{\n\t\t\t\t$_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);\n\t\t\t}\n\t\t}\n\n\t\t// Clean $_COOKIE Data\n\t\tif (is_array($_COOKIE))\n\t\t{\n\t\t\t// Also get rid of specially treated cookies that might be set by a server\n\t\t\t// or silly application, that are of no use to a CI application anyway\n\t\t\t// but that when present will trip our 'Disallowed Key Characters' alarm\n\t\t\t// http://www.ietf.org/rfc/rfc2109.txt\n\t\t\t// note that the key names below are single quoted strings, and are not PHP variables\n\t\t\tunset(\n\t\t\t\t$_COOKIE['$Version'],\n\t\t\t\t$_COOKIE['$Path'],\n\t\t\t\t$_COOKIE['$Domain']\n\t\t\t);\n\n\t\t\tforeach ($_COOKIE as $key => $val)\n\t\t\t{\n\t\t\t\tif (($cookie_key = $this->_clean_input_keys($key)) !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t$_COOKIE[$cookie_key] = $this->_clean_input_data($val);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tunset($_COOKIE[$key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Sanitize PHP_SELF\n\t\t$_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']);\n\n\t\tlog_message('debug', 'Global POST, GET and COOKIE data sanitized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clean Input Data\n\t *\n\t * Internal method that aids in escaping data and\n\t * standardizing newline characters to PHP_EOL.\n\t *\n\t * @param\tstring|string[]\t$str\tInput string(s)\n\t * @return\tstring\n\t */\n\tprotected function _clean_input_data($str)\n\t{\n\t\tif (is_array($str))\n\t\t{\n\t\t\t$new_array = array();\n\t\t\tforeach (array_keys($str) as $key)\n\t\t\t{\n\t\t\t\t$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]);\n\t\t\t}\n\t\t\treturn $new_array;\n\t\t}\n\n\t\t/* We strip slashes if magic quotes is on to keep things consistent\n\n\t\t   NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and\n\t\t         it will probably not exist in future versions at all.\n\t\t*/\n\t\tif ( ! is_php('5.4') && get_magic_quotes_gpc())\n\t\t{\n\t\t\t$str = stripslashes($str);\n\t\t}\n\n\t\t// Clean UTF-8 if supported\n\t\tif (UTF8_ENABLED === TRUE)\n\t\t{\n\t\t\t$str = $this->uni->clean_string($str);\n\t\t}\n\n\t\t// Remove control characters\n\t\t$str = remove_invisible_characters($str, FALSE);\n\n\t\t// Standardize newlines if needed\n\t\tif ($this->_standardize_newlines === TRUE)\n\t\t{\n\t\t\treturn preg_replace('/(?:\\r\\n|[\\r\\n])/', PHP_EOL, $str);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clean Keys\n\t *\n\t * Internal method that helps to prevent malicious users\n\t * from trying to exploit keys we make sure that keys are\n\t * only named with alpha-numeric text and a few other items.\n\t *\n\t * @param\tstring\t$str\tInput string\n\t * @param\tbool\t$fatal\tWhether to terminate script exection\n\t *\t\t\t\tor to return FALSE if an invalid\n\t *\t\t\t\tkey is encountered\n\t * @return\tstring|bool\n\t */\n\tprotected function _clean_input_keys($str, $fatal = TRUE)\n\t{\n\t\tif ( ! preg_match('/^[a-z0-9:_\\/|-]+$/i', $str))\n\t\t{\n\t\t\tif ($fatal === TRUE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tset_status_header(503);\n\t\t\t\techo 'Disallowed Key Characters.';\n\t\t\t\texit(7); // EXIT_USER_INPUT\n\t\t\t}\n\t\t}\n\n\t\t// Clean UTF-8 if supported\n\t\tif (UTF8_ENABLED === TRUE)\n\t\t{\n\t\t\treturn $this->uni->clean_string($str);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Request Headers\n\t *\n\t * @param\tbool\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tarray\n\t */\n\tpublic function request_headers($xss_clean = FALSE)\n\t{\n\t\t// If header is already defined, return it immediately\n\t\tif ( ! empty($this->headers))\n\t\t{\n\t\t\treturn $this->_fetch_from_array($this->headers, NULL, $xss_clean);\n\t\t}\n\n\t\t// In Apache, you can simply call apache_request_headers()\n\t\tif (function_exists('apache_request_headers'))\n\t\t{\n\t\t\t$this->headers = apache_request_headers();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tisset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE'];\n\n\t\t\tforeach ($_SERVER as $key => $val)\n\t\t\t{\n\t\t\t\tif (sscanf($key, 'HTTP_%s', $header) === 1)\n\t\t\t\t{\n\t\t\t\t\t// take SOME_HEADER and turn it into Some-Header\n\t\t\t\t\t$header = str_replace('_', ' ', strtolower($header));\n\t\t\t\t\t$header = str_replace(' ', '-', ucwords($header));\n\n\t\t\t\t\t$this->headers[$header] = $_SERVER[$key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $this->_fetch_from_array($this->headers, NULL, $xss_clean);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Request Header\n\t *\n\t * Returns the value of a single member of the headers class member\n\t *\n\t * @param\tstring\t\t$index\t\tHeader name\n\t * @param\tbool\t\t$xss_clean\tWhether to apply XSS filtering\n\t * @return\tstring|null\tThe requested header on success or NULL on failure\n\t */\n\tpublic function get_request_header($index, $xss_clean = FALSE)\n\t{\n\t\tstatic $headers;\n\n\t\tif ( ! isset($headers))\n\t\t{\n\t\t\tempty($this->headers) && $this->request_headers();\n\t\t\tforeach ($this->headers as $key => $value)\n\t\t\t{\n\t\t\t\t$headers[strtolower($key)] = $value;\n\t\t\t}\n\t\t}\n\n\t\t$index = strtolower($index);\n\n\t\tif ( ! isset($headers[$index]))\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\treturn ($xss_clean === TRUE)\n\t\t\t? $this->security->xss_clean($headers[$index])\n\t\t\t: $headers[$index];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is AJAX request?\n\t *\n\t * Test to see if a request contains the HTTP_X_REQUESTED_WITH header.\n\t *\n\t * @return \tbool\n\t */\n\tpublic function is_ajax_request()\n\t{\n\t\treturn ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is CLI request?\n\t *\n\t * Test to see if a request was made from the command line.\n\t *\n\t * @deprecated\t3.0.0\tUse is_cli() instead\n\t * @return\tbool\n\t */\n\tpublic function is_cli_request()\n\t{\n\t\treturn is_cli();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Request Method\n\t *\n\t * Return the request method\n\t *\n\t * @param\tbool\t$upper\tWhether to return in upper or lower case\n\t *\t\t\t\t(default: FALSE)\n\t * @return \tstring\n\t */\n\tpublic function method($upper = FALSE)\n\t{\n\t\treturn ($upper)\n\t\t\t? strtoupper($this->server('REQUEST_METHOD'))\n\t\t\t: strtolower($this->server('REQUEST_METHOD'));\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Magic __get()\n\t *\n\t * Allows read access to protected properties\n\t *\n\t * @param\tstring\t$name\n\t * @return\tmixed\n\t */\n\tpublic function __get($name)\n\t{\n\t\tif ($name === 'raw_input_stream')\n\t\t{\n\t\t\tisset($this->_raw_input_stream) OR $this->_raw_input_stream = file_get_contents('php://input');\n\t\t\treturn $this->_raw_input_stream;\n\t\t}\n\t\telseif ($name === 'ip_address')\n\t\t{\n\t\t\treturn $this->ip_address;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Language Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLanguage\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/language.html\n */\nclass CI_Lang {\n\n\t/**\n\t * List of translations\n\t *\n\t * @var\tarray\n\t */\n\tpublic $language =\tarray();\n\n\t/**\n\t * List of loaded language files\n\t *\n\t * @var\tarray\n\t */\n\tpublic $is_loaded =\tarray();\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tlog_message('info', 'Language Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load a language file\n\t *\n\t * @param\tmixed\t$langfile\tLanguage file name\n\t * @param\tstring\t$idiom\t\tLanguage name (english, etc.)\n\t * @param\tbool\t$return\t\tWhether to return the loaded array of translations\n\t * @param \tbool\t$add_suffix\tWhether to add suffix to $langfile\n\t * @param \tstring\t$alt_path\tAlternative path to look for the language file\n\t *\n\t * @return\tvoid|string[]\tArray containing translations, if $return is set to TRUE\n\t */\n\tpublic function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')\n\t{\n\t\tif (is_array($langfile))\n\t\t{\n\t\t\tforeach ($langfile as $value)\n\t\t\t{\n\t\t\t\t$this->load($value, $idiom, $return, $add_suffix, $alt_path);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t$langfile = str_replace('.php', '', $langfile);\n\n\t\tif ($add_suffix === TRUE)\n\t\t{\n\t\t\t$langfile = preg_replace('/_lang$/', '', $langfile).'_lang';\n\t\t}\n\n\t\t$langfile .= '.php';\n\n\t\tif (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom))\n\t\t{\n\t\t\t$config =& get_config();\n\t\t\t$idiom = empty($config['language']) ? 'english' : $config['language'];\n\t\t}\n\n\t\tif ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Load the base file, so any others found can override it\n\t\t$basepath = BASEPATH.'language/'.$idiom.'/'.$langfile;\n\t\tif (($found = file_exists($basepath)) === TRUE)\n\t\t{\n\t\t\tinclude($basepath);\n\t\t}\n\n\t\t// Do we have an alternative path to look in?\n\t\tif ($alt_path !== '')\n\t\t{\n\t\t\t$alt_path .= 'language/'.$idiom.'/'.$langfile;\n\t\t\tif (file_exists($alt_path))\n\t\t\t{\n\t\t\t\tinclude($alt_path);\n\t\t\t\t$found = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach (get_instance()->load->get_package_paths(TRUE) as $package_path)\n\t\t\t{\n\t\t\t\t$package_path .= 'language/'.$idiom.'/'.$langfile;\n\t\t\t\tif ($basepath !== $package_path && file_exists($package_path))\n\t\t\t\t{\n\t\t\t\t\tinclude($package_path);\n\t\t\t\t\t$found = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ($found !== TRUE)\n\t\t{\n\t\t\tshow_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);\n\t\t}\n\n\t\tif ( ! isset($lang) OR ! is_array($lang))\n\t\t{\n\t\t\tlog_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);\n\n\t\t\tif ($return === TRUE)\n\t\t\t{\n\t\t\t\treturn array();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif ($return === TRUE)\n\t\t{\n\t\t\treturn $lang;\n\t\t}\n\n\t\t$this->is_loaded[$langfile] = $idiom;\n\t\t$this->language = array_merge($this->language, $lang);\n\n\t\tlog_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile);\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Language line\n\t *\n\t * Fetches a single line of text from the language array\n\t *\n\t * @param\tstring\t$line\t\tLanguage line key\n\t * @param\tbool\t$log_errors\tWhether to log an error message if the line is not found\n\t * @return\tstring\tTranslation\n\t */\n\tpublic function line($line, $log_errors = TRUE)\n\t{\n\t\t$value = isset($this->language[$line]) ? $this->language[$line] : FALSE;\n\n\t\t// Because killer robots like unicorns!\n\t\tif ($value === FALSE && $log_errors === TRUE)\n\t\t{\n\t\t\tlog_message('error', 'Could not find the language line \"'.$line.'\"');\n\t\t}\n\n\t\treturn $value;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Loader.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Loader Class\n *\n * Loads framework components.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLoader\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/loader.html\n */\nclass CI_Loader {\n\n\t// All these are set automatically. Don't mess with them.\n\t/**\n\t * Nesting level of the output buffering mechanism\n\t *\n\t * @var\tint\n\t */\n\tprotected $_ci_ob_level;\n\n\t/**\n\t * List of paths to load views from\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_view_paths =\tarray(VIEWPATH\t=> TRUE);\n\n\t/**\n\t * List of paths to load libraries from\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_library_paths =\tarray(APPPATH, BASEPATH);\n\n\t/**\n\t * List of paths to load models from\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_model_paths =\tarray(APPPATH);\n\n\t/**\n\t * List of paths to load helpers from\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_helper_paths =\tarray(APPPATH, BASEPATH);\n\n\t/**\n\t * List of cached variables\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_cached_vars =\tarray();\n\n\t/**\n\t * List of loaded classes\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_classes =\tarray();\n\n\t/**\n\t * List of loaded models\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_models =\tarray();\n\n\t/**\n\t * List of loaded helpers\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_helpers =\tarray();\n\n\t/**\n\t * List of class name mappings\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_ci_varmap =\tarray(\n\t\t'unit_test' => 'unit',\n\t\t'user_agent' => 'agent'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Sets component load paths, gets the initial output buffering level.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->_ci_ob_level = ob_get_level();\n\t\t$this->_ci_classes =& is_loaded();\n\n\t\tlog_message('info', 'Loader Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initializer\n\t *\n\t * @todo\tFigure out a way to move this to the constructor\n\t *\t\twithout breaking *package_path*() methods.\n\t * @uses\tCI_Loader::_ci_autoloader()\n\t * @used-by\tCI_Controller::__construct()\n\t * @return\tvoid\n\t */\n\tpublic function initialize()\n\t{\n\t\t$this->_ci_autoloader();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is Loaded\n\t *\n\t * A utility method to test if a class is in the self::$_ci_classes array.\n\t *\n\t * @used-by\tMainly used by Form Helper function _get_validation_object().\n\t *\n\t * @param \tstring\t\t$class\tClass name to check for\n\t * @return \tstring|bool\tClass object name if loaded or FALSE\n\t */\n\tpublic function is_loaded($class)\n\t{\n\t\treturn array_search(ucfirst($class), $this->_ci_classes, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Library Loader\n\t *\n\t * Loads and instantiates libraries.\n\t * Designed to be called from application controllers.\n\t *\n\t * @param\tmixed\t$library\tLibrary name\n\t * @param\tarray\t$params\t\tOptional parameters to pass to the library class constructor\n\t * @param\tstring\t$object_name\tAn optional object name to assign to\n\t * @return\tobject\n\t */\n\tpublic function library($library, $params = NULL, $object_name = NULL)\n\t{\n\t\tif (empty($library))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\t\telseif (is_array($library))\n\t\t{\n\t\t\tforeach ($library as $key => $value)\n\t\t\t{\n\t\t\t\tif (is_int($key))\n\t\t\t\t{\n\t\t\t\t\t$this->library($value, $params);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->library($key, $params, $value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $this;\n\t\t}\n\n\t\tif ($params !== NULL && ! is_array($params))\n\t\t{\n\t\t\t$params = NULL;\n\t\t}\n\n\t\t$this->_ci_load_library($library, $params, $object_name);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Model Loader\n\t *\n\t * Loads and instantiates models.\n\t *\n\t * @param\tmixed\t$model\t\tModel name\n\t * @param\tstring\t$name\t\tAn optional object name to assign to\n\t * @param\tbool\t$db_conn\tAn optional database connection configuration to initialize\n\t * @return\tobject\n\t */\n\tpublic function model($model, $name = '', $db_conn = FALSE)\n\t{\n\t\tif (empty($model))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\t\telseif (is_array($model))\n\t\t{\n\t\t\tforeach ($model as $key => $value)\n\t\t\t{\n\t\t\t\tis_int($key) ? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn);\n\t\t\t}\n\n\t\t\treturn $this;\n\t\t}\n\n\t\t$path = '';\n\n\t\t// Is the model in a sub-folder? If so, parse out the filename and path.\n\t\tif (($last_slash = strrpos($model, '/')) !== FALSE)\n\t\t{\n\t\t\t// The path is in front of the last slash\n\t\t\t$path = substr($model, 0, ++$last_slash);\n\n\t\t\t// And the model name behind it\n\t\t\t$model = substr($model, $last_slash);\n\t\t}\n\n\t\tif (empty($name))\n\t\t{\n\t\t\t$name = $model;\n\t\t}\n\n\t\tif (in_array($name, $this->_ci_models, TRUE))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\n\t\t$CI =& get_instance();\n\t\tif (isset($CI->$name))\n\t\t{\n\t\t\tthrow new RuntimeException('The model name you are loading is the name of a resource that is already being used: '.$name);\n\t\t}\n\n\t\tif ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE))\n\t\t{\n\t\t\tif ($db_conn === TRUE)\n\t\t\t{\n\t\t\t\t$db_conn = '';\n\t\t\t}\n\n\t\t\t$this->database($db_conn, FALSE, TRUE);\n\t\t}\n\n\t\t// Note: All of the code under this condition used to be just:\n\t\t//\n\t\t//       load_class('Model', 'core');\n\t\t//\n\t\t//       However, load_class() instantiates classes\n\t\t//       to cache them for later use and that prevents\n\t\t//       MY_Model from being an abstract class and is\n\t\t//       sub-optimal otherwise anyway.\n\t\tif ( ! class_exists('CI_Model', FALSE))\n\t\t{\n\t\t\t$app_path = APPPATH.'core'.DIRECTORY_SEPARATOR;\n\t\t\tif (file_exists($app_path.'Model.php'))\n\t\t\t{\n\t\t\t\trequire_once($app_path.'Model.php');\n\t\t\t\tif ( ! class_exists('CI_Model', FALSE))\n\t\t\t\t{\n\t\t\t\t\tthrow new RuntimeException($app_path.\"Model.php exists, but doesn't declare class CI_Model\");\n\t\t\t\t}\n\n\t\t\t\tlog_message('info', 'CI_Model class loaded');\n\t\t\t}\n\t\t\telseif ( ! class_exists('CI_Model', FALSE))\n\t\t\t{\n\t\t\t\trequire_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php');\n\t\t\t}\n\n\t\t\t$class = config_item('subclass_prefix').'Model';\n\t\t\tif (file_exists($app_path.$class.'.php'))\n\t\t\t{\n\t\t\t\trequire_once($app_path.$class.'.php');\n\t\t\t\tif ( ! class_exists($class, FALSE))\n\t\t\t\t{\n\t\t\t\t\tthrow new RuntimeException($app_path.$class.\".php exists, but doesn't declare class \".$class);\n\t\t\t\t}\n\n\t\t\t\tlog_message('info', config_item('subclass_prefix').'Model class loaded');\n\t\t\t}\n\t\t}\n\n\t\t$model = ucfirst($model);\n\t\tif ( ! class_exists($model, FALSE))\n\t\t{\n\t\t\tforeach ($this->_ci_model_paths as $mod_path)\n\t\t\t{\n\t\t\t\tif ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trequire_once($mod_path.'models/'.$path.$model.'.php');\n\t\t\t\tif ( ! class_exists($model, FALSE))\n\t\t\t\t{\n\t\t\t\t\tthrow new RuntimeException($mod_path.\"models/\".$path.$model.\".php exists, but doesn't declare class \".$model);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( ! class_exists($model, FALSE))\n\t\t\t{\n\t\t\t\tthrow new RuntimeException('Unable to locate the model you have specified: '.$model);\n\t\t\t}\n\t\t}\n\t\telseif ( ! is_subclass_of($model, 'CI_Model'))\n\t\t{\n\t\t\tthrow new RuntimeException(\"Class \".$model.\" already exists and doesn't extend CI_Model\");\n\t\t}\n\n\t\t$this->_ci_models[] = $name;\n\t\t$model = new $model();\n\t\t$CI->$name = $model;\n\t\tlog_message('info', 'Model \"'.get_class($model).'\" initialized');\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database Loader\n\t *\n\t * @param\tmixed\t$params\t\tDatabase configuration options\n\t * @param\tbool\t$return \tWhether to return the database object\n\t * @param\tbool\t$query_builder\tWhether to enable Query Builder\n\t *\t\t\t\t\t(overrides the configuration setting)\n\t *\n\t * @return\tobject|bool\tDatabase object if $return is set to TRUE,\n\t *\t\t\t\t\tFALSE on failure, CI_Loader instance in any other case\n\t */\n\tpublic function database($params = '', $return = FALSE, $query_builder = NULL)\n\t{\n\t\t// Grab the super object\n\t\t$CI =& get_instance();\n\n\t\t// Do we even need to load the database class?\n\t\tif ($return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\trequire_once(BASEPATH.'database/DB.php');\n\n\t\tif ($return === TRUE)\n\t\t{\n\t\t\treturn DB($params, $query_builder);\n\t\t}\n\n\t\t// Initialize the db variable. Needed to prevent\n\t\t// reference errors with some configurations\n\t\t$CI->db = '';\n\n\t\t// Load the DB class\n\t\t$CI->db =& DB($params, $query_builder);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load the Database Utilities Class\n\t *\n\t * @param\tobject\t$db\tDatabase object\n\t * @param\tbool\t$return\tWhether to return the DB Utilities class object or not\n\t * @return\tobject\n\t */\n\tpublic function dbutil($db = NULL, $return = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\n\t\tif ( ! is_object($db) OR ! ($db instanceof CI_DB))\n\t\t{\n\t\t\tclass_exists('CI_DB', FALSE) OR $this->database();\n\t\t\t$db =& $CI->db;\n\t\t}\n\n\t\trequire_once(BASEPATH.'database/DB_utility.php');\n\t\trequire_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_utility.php');\n\t\t$class = 'CI_DB_'.$db->dbdriver.'_utility';\n\n\t\tif ($return === TRUE)\n\t\t{\n\t\t\treturn new $class($db);\n\t\t}\n\n\t\t$CI->dbutil = new $class($db);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load the Database Forge Class\n\t *\n\t * @param\tobject\t$db\tDatabase object\n\t * @param\tbool\t$return\tWhether to return the DB Forge class object or not\n\t * @return\tobject\n\t */\n\tpublic function dbforge($db = NULL, $return = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\t\tif ( ! is_object($db) OR ! ($db instanceof CI_DB))\n\t\t{\n\t\t\tclass_exists('CI_DB', FALSE) OR $this->database();\n\t\t\t$db =& $CI->db;\n\t\t}\n\n\t\trequire_once(BASEPATH.'database/DB_forge.php');\n\t\trequire_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_forge.php');\n\n\t\tif ( ! empty($db->subdriver))\n\t\t{\n\t\t\t$driver_path = BASEPATH.'database/drivers/'.$db->dbdriver.'/subdrivers/'.$db->dbdriver.'_'.$db->subdriver.'_forge.php';\n\t\t\tif (file_exists($driver_path))\n\t\t\t{\n\t\t\t\trequire_once($driver_path);\n\t\t\t\t$class = 'CI_DB_'.$db->dbdriver.'_'.$db->subdriver.'_forge';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$class = 'CI_DB_'.$db->dbdriver.'_forge';\n\t\t}\n\n\t\tif ($return === TRUE)\n\t\t{\n\t\t\treturn new $class($db);\n\t\t}\n\n\t\t$CI->dbforge = new $class($db);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * View Loader\n\t *\n\t * Loads \"view\" files.\n\t *\n\t * @param\tstring\t$view\tView name\n\t * @param\tarray\t$vars\tAn associative array of data\n\t *\t\t\t\tto be extracted for use in the view\n\t * @param\tbool\t$return\tWhether to return the view output\n\t *\t\t\t\tor leave it to the Output class\n\t * @return\tobject|string\n\t */\n\tpublic function view($view, $vars = array(), $return = FALSE)\n\t{\n\t\treturn $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generic File Loader\n\t *\n\t * @param\tstring\t$path\tFile path\n\t * @param\tbool\t$return\tWhether to return the file output\n\t * @return\tobject|string\n\t */\n\tpublic function file($path, $return = FALSE)\n\t{\n\t\treturn $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Variables\n\t *\n\t * Once variables are set they become available within\n\t * the controller class and its \"view\" files.\n\t *\n\t * @param\tarray|object|string\t$vars\n\t *\t\t\t\t\tAn associative array or object containing values\n\t *\t\t\t\t\tto be set, or a value's name if string\n\t * @param \tstring\t$val\tValue to set, only used if $vars is a string\n\t * @return\tobject\n\t */\n\tpublic function vars($vars, $val = '')\n\t{\n\t\t$vars = is_string($vars)\n\t\t\t? array($vars => $val)\n\t\t\t: $this->_ci_prepare_view_vars($vars);\n\n\t\tforeach ($vars as $key => $val)\n\t\t{\n\t\t\t$this->_ci_cached_vars[$key] = $val;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clear Cached Variables\n\t *\n\t * Clears the cached variables.\n\t *\n\t * @return\tCI_Loader\n\t */\n\tpublic function clear_vars()\n\t{\n\t\t$this->_ci_cached_vars = array();\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Variable\n\t *\n\t * Check if a variable is set and retrieve it.\n\t *\n\t * @param\tstring\t$key\tVariable name\n\t * @return\tmixed\tThe variable or NULL if not found\n\t */\n\tpublic function get_var($key)\n\t{\n\t\treturn isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Variables\n\t *\n\t * Retrieves all loaded variables.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function get_vars()\n\t{\n\t\treturn $this->_ci_cached_vars;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Helper Loader\n\t *\n\t * @param\tstring|string[]\t$helpers\tHelper name(s)\n\t * @return\tobject\n\t */\n\tpublic function helper($helpers = array())\n\t{\n\t\tis_array($helpers) OR $helpers = array($helpers);\n\t\tforeach ($helpers as &$helper)\n\t\t{\n\t\t\t$filename = basename($helper);\n\t\t\t$filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename));\n\t\t\t$filename = strtolower(preg_replace('#(_helper)?(\\.php)?$#i', '', $filename)).'_helper';\n\t\t\t$helper   = $filepath.$filename;\n\n\t\t\tif (isset($this->_ci_helpers[$helper]))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Is this a helper extension request?\n\t\t\t$ext_helper = config_item('subclass_prefix').$filename;\n\t\t\t$ext_loaded = FALSE;\n\t\t\tforeach ($this->_ci_helper_paths as $path)\n\t\t\t{\n\t\t\t\tif (file_exists($path.'helpers/'.$ext_helper.'.php'))\n\t\t\t\t{\n\t\t\t\t\tinclude_once($path.'helpers/'.$ext_helper.'.php');\n\t\t\t\t\t$ext_loaded = TRUE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we have loaded extensions - check if the base one is here\n\t\t\tif ($ext_loaded === TRUE)\n\t\t\t{\n\t\t\t\t$base_helper = BASEPATH.'helpers/'.$helper.'.php';\n\t\t\t\tif ( ! file_exists($base_helper))\n\t\t\t\t{\n\t\t\t\t\tshow_error('Unable to load the requested file: helpers/'.$helper.'.php');\n\t\t\t\t}\n\n\t\t\t\tinclude_once($base_helper);\n\t\t\t\t$this->_ci_helpers[$helper] = TRUE;\n\t\t\t\tlog_message('info', 'Helper loaded: '.$helper);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// No extensions found ... try loading regular helpers and/or overrides\n\t\t\tforeach ($this->_ci_helper_paths as $path)\n\t\t\t{\n\t\t\t\tif (file_exists($path.'helpers/'.$helper.'.php'))\n\t\t\t\t{\n\t\t\t\t\tinclude_once($path.'helpers/'.$helper.'.php');\n\n\t\t\t\t\t$this->_ci_helpers[$helper] = TRUE;\n\t\t\t\t\tlog_message('info', 'Helper loaded: '.$helper);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// unable to load the helper\n\t\t\tif ( ! isset($this->_ci_helpers[$helper]))\n\t\t\t{\n\t\t\t\tshow_error('Unable to load the requested file: helpers/'.$helper.'.php');\n\t\t\t}\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load Helpers\n\t *\n\t * An alias for the helper() method in case the developer has\n\t * written the plural form of it.\n\t *\n\t * @uses\tCI_Loader::helper()\n\t * @param\tstring|string[]\t$helpers\tHelper name(s)\n\t * @return\tobject\n\t */\n\tpublic function helpers($helpers = array())\n\t{\n\t\treturn $this->helper($helpers);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Language Loader\n\t *\n\t * Loads language files.\n\t *\n\t * @param\tstring|string[]\t$files\tList of language file names to load\n\t * @param\tstring\t\tLanguage name\n\t * @return\tobject\n\t */\n\tpublic function language($files, $lang = '')\n\t{\n\t\tget_instance()->lang->load($files, $lang);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Config Loader\n\t *\n\t * Loads a config file (an alias for CI_Config::load()).\n\t *\n\t * @uses\tCI_Config::load()\n\t * @param\tstring\t$file\t\t\tConfiguration file name\n\t * @param\tbool\t$use_sections\t\tWhether configuration values should be loaded into their own section\n\t * @param\tbool\t$fail_gracefully\tWhether to just return FALSE or display an error message\n\t * @return\tbool\tTRUE if the file was loaded correctly or FALSE on failure\n\t */\n\tpublic function config($file, $use_sections = FALSE, $fail_gracefully = FALSE)\n\t{\n\t\treturn get_instance()->config->load($file, $use_sections, $fail_gracefully);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Driver Loader\n\t *\n\t * Loads a driver library.\n\t *\n\t * @param\tstring|string[]\t$library\tDriver name(s)\n\t * @param\tarray\t\t$params\t\tOptional parameters to pass to the driver\n\t * @param\tstring\t\t$object_name\tAn optional object name to assign to\n\t *\n\t * @return\tobject|bool\tObject or FALSE on failure if $library is a string\n\t *\t\t\t\tand $object_name is set. CI_Loader instance otherwise.\n\t */\n\tpublic function driver($library, $params = NULL, $object_name = NULL)\n\t{\n\t\tif (is_array($library))\n\t\t{\n\t\t\tforeach ($library as $key => $value)\n\t\t\t{\n\t\t\t\tif (is_int($key))\n\t\t\t\t{\n\t\t\t\t\t$this->driver($value, $params);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->driver($key, $params, $value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $this;\n\t\t}\n\t\telseif (empty($library))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! class_exists('CI_Driver_Library', FALSE))\n\t\t{\n\t\t\t// We aren't instantiating an object here, just making the base class available\n\t\t\trequire BASEPATH.'libraries/Driver.php';\n\t\t}\n\n\t\t// We can save the loader some time since Drivers will *always* be in a subfolder,\n\t\t// and typically identically named to the library\n\t\tif ( ! strpos($library, '/'))\n\t\t{\n\t\t\t$library = ucfirst($library).'/'.$library;\n\t\t}\n\n\t\treturn $this->library($library, $params, $object_name);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Package Path\n\t *\n\t * Prepends a parent path to the library, model, helper and config\n\t * path arrays.\n\t *\n\t * @see\tCI_Loader::$_ci_library_paths\n\t * @see\tCI_Loader::$_ci_model_paths\n\t * @see CI_Loader::$_ci_helper_paths\n\t * @see CI_Config::$_config_paths\n\t *\n\t * @param\tstring\t$path\t\tPath to add\n\t * @param \tbool\t$view_cascade\t(default: TRUE)\n\t * @return\tobject\n\t */\n\tpublic function add_package_path($path, $view_cascade = TRUE)\n\t{\n\t\t$path = rtrim($path, '/').'/';\n\n\t\tarray_unshift($this->_ci_library_paths, $path);\n\t\tarray_unshift($this->_ci_model_paths, $path);\n\t\tarray_unshift($this->_ci_helper_paths, $path);\n\n\t\t$this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;\n\n\t\t// Add config file path\n\t\t$config =& $this->_ci_get_component('config');\n\t\t$config->_config_paths[] = $path;\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Package Paths\n\t *\n\t * Return a list of all package paths.\n\t *\n\t * @param\tbool\t$include_base\tWhether to include BASEPATH (default: FALSE)\n\t * @return\tarray\n\t */\n\tpublic function get_package_paths($include_base = FALSE)\n\t{\n\t\treturn ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Remove Package Path\n\t *\n\t * Remove a path from the library, model, helper and/or config\n\t * path arrays if it exists. If no path is provided, the most recently\n\t * added path will be removed removed.\n\t *\n\t * @param\tstring\t$path\tPath to remove\n\t * @return\tobject\n\t */\n\tpublic function remove_package_path($path = '')\n\t{\n\t\t$config =& $this->_ci_get_component('config');\n\n\t\tif ($path === '')\n\t\t{\n\t\t\tarray_shift($this->_ci_library_paths);\n\t\t\tarray_shift($this->_ci_model_paths);\n\t\t\tarray_shift($this->_ci_helper_paths);\n\t\t\tarray_shift($this->_ci_view_paths);\n\t\t\tarray_pop($config->_config_paths);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$path = rtrim($path, '/').'/';\n\t\t\tforeach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)\n\t\t\t{\n\t\t\t\tif (($key = array_search($path, $this->{$var})) !== FALSE)\n\t\t\t\t{\n\t\t\t\t\tunset($this->{$var}[$key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isset($this->_ci_view_paths[$path.'views/']))\n\t\t\t{\n\t\t\t\tunset($this->_ci_view_paths[$path.'views/']);\n\t\t\t}\n\n\t\t\tif (($key = array_search($path, $config->_config_paths)) !== FALSE)\n\t\t\t{\n\t\t\t\tunset($config->_config_paths[$key]);\n\t\t\t}\n\t\t}\n\n\t\t// make sure the application default paths are still in the array\n\t\t$this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));\n\t\t$this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));\n\t\t$this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));\n\t\t$this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));\n\t\t$config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal CI Data Loader\n\t *\n\t * Used to load views and files.\n\t *\n\t * Variables are prefixed with _ci_ to avoid symbol collision with\n\t * variables made available to view files.\n\t *\n\t * @used-by\tCI_Loader::view()\n\t * @used-by\tCI_Loader::file()\n\t * @param\tarray\t$_ci_data\tData to load\n\t * @return\tobject\n\t */\n\tprotected function _ci_load($_ci_data)\n\t{\n\t\t// Set the default data variables\n\t\tforeach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)\n\t\t{\n\t\t\t$$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE;\n\t\t}\n\n\t\t$file_exists = FALSE;\n\n\t\t// Set the path to the requested file\n\t\tif (is_string($_ci_path) && $_ci_path !== '')\n\t\t{\n\t\t\t$_ci_x = explode('/', $_ci_path);\n\t\t\t$_ci_file = end($_ci_x);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);\n\t\t\t$_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view;\n\n\t\t\tforeach ($this->_ci_view_paths as $_ci_view_file => $cascade)\n\t\t\t{\n\t\t\t\tif (file_exists($_ci_view_file.$_ci_file))\n\t\t\t\t{\n\t\t\t\t\t$_ci_path = $_ci_view_file.$_ci_file;\n\t\t\t\t\t$file_exists = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( ! $cascade)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $file_exists && ! file_exists($_ci_path))\n\t\t{\n\t\t\tshow_error('Unable to load the requested file: '.$_ci_file);\n\t\t}\n\n\t\t// This allows anything loaded using $this->load (views, files, etc.)\n\t\t// to become accessible from within the Controller and Model functions.\n\t\t$_ci_CI =& get_instance();\n\t\tforeach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)\n\t\t{\n\t\t\tif ( ! isset($this->$_ci_key))\n\t\t\t{\n\t\t\t\t$this->$_ci_key =& $_ci_CI->$_ci_key;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Extract and cache variables\n\t\t *\n\t\t * You can either set variables using the dedicated $this->load->vars()\n\t\t * function or via the second parameter of this function. We'll merge\n\t\t * the two types and cache them so that views that are embedded within\n\t\t * other views can have access to these variables.\n\t\t */\n\t\tempty($_ci_vars) OR $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);\n\t\textract($this->_ci_cached_vars);\n\n\t\t/*\n\t\t * Buffer the output\n\t\t *\n\t\t * We buffer the output for two reasons:\n\t\t * 1. Speed. You get a significant speed boost.\n\t\t * 2. So that the final rendered template can be post-processed by\n\t\t *\tthe output class. Why do we need post processing? For one thing,\n\t\t *\tin order to show the elapsed page load time. Unless we can\n\t\t *\tintercept the content right before it's sent to the browser and\n\t\t *\tthen stop the timer it won't be accurate.\n\t\t */\n\t\tob_start();\n\n\t\t// If the PHP installation does not support short tags we'll\n\t\t// do a little string replacement, changing the short tags\n\t\t// to standard PHP echo statements.\n\t\tif ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE)\n\t\t{\n\t\t\techo eval('?>'.preg_replace('/;*\\s*\\?>/', '; ?>', str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinclude($_ci_path); // include() vs include_once() allows for multiple views with the same name\n\t\t}\n\n\t\tlog_message('info', 'File loaded: '.$_ci_path);\n\n\t\t// Return the file data if requested\n\t\tif ($_ci_return === TRUE)\n\t\t{\n\t\t\t$buffer = ob_get_contents();\n\t\t\t@ob_end_clean();\n\t\t\treturn $buffer;\n\t\t}\n\n\t\t/*\n\t\t * Flush the buffer... or buff the flusher?\n\t\t *\n\t\t * In order to permit views to be nested within\n\t\t * other views, we need to flush the content back out whenever\n\t\t * we are beyond the first level of output buffering so that\n\t\t * it can be seen and included properly by the first included\n\t\t * template and any subsequent ones. Oy!\n\t\t */\n\t\tif (ob_get_level() > $this->_ci_ob_level + 1)\n\t\t{\n\t\t\tob_end_flush();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$_ci_CI->output->append_output(ob_get_contents());\n\t\t\t@ob_end_clean();\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal CI Library Loader\n\t *\n\t * @used-by\tCI_Loader::library()\n\t * @uses\tCI_Loader::_ci_init_library()\n\t *\n\t * @param\tstring\t$class\t\tClass name to load\n\t * @param\tmixed\t$params\t\tOptional parameters to pass to the class constructor\n\t * @param\tstring\t$object_name\tOptional object name to assign to\n\t * @return\tvoid\n\t */\n\tprotected function _ci_load_library($class, $params = NULL, $object_name = NULL)\n\t{\n\t\t// Get the class name, and while we're at it trim any slashes.\n\t\t// The directory path can be included as part of the class name,\n\t\t// but we don't want a leading slash\n\t\t$class = str_replace('.php', '', trim($class, '/'));\n\n\t\t// Was the path included with the class name?\n\t\t// We look for a slash to determine this\n\t\tif (($last_slash = strrpos($class, '/')) !== FALSE)\n\t\t{\n\t\t\t// Extract the path\n\t\t\t$subdir = substr($class, 0, ++$last_slash);\n\n\t\t\t// Get the filename from the path\n\t\t\t$class = substr($class, $last_slash);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$subdir = '';\n\t\t}\n\n\t\t$class = ucfirst($class);\n\n\t\t// Is this a stock library? There are a few special conditions if so ...\n\t\tif (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php'))\n\t\t{\n\t\t\treturn $this->_ci_load_stock_library($class, $subdir, $params, $object_name);\n\t\t}\n\n\t\t// Safety: Was the class already loaded by a previous call?\n\t\tif (class_exists($class, FALSE))\n\t\t{\n\t\t\t$property = $object_name;\n\t\t\tif (empty($property))\n\t\t\t{\n\t\t\t\t$property = strtolower($class);\n\t\t\t\tisset($this->_ci_varmap[$property]) && $property = $this->_ci_varmap[$property];\n\t\t\t}\n\n\t\t\t$CI =& get_instance();\n\t\t\tif (isset($CI->$property))\n\t\t\t{\n\t\t\t\tlog_message('debug', $class.' class already loaded. Second attempt ignored.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn $this->_ci_init_library($class, '', $params, $object_name);\n\t\t}\n\n\t\t// Let's search for the requested library file and load it.\n\t\tforeach ($this->_ci_library_paths as $path)\n\t\t{\n\t\t\t// BASEPATH has already been checked for\n\t\t\tif ($path === BASEPATH)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$filepath = $path.'libraries/'.$subdir.$class.'.php';\n\t\t\t// Does the file exist? No? Bummer...\n\t\t\tif ( ! file_exists($filepath))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tinclude_once($filepath);\n\t\t\treturn $this->_ci_init_library($class, '', $params, $object_name);\n\t\t}\n\n\t\t// One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?\n\t\tif ($subdir === '')\n\t\t{\n\t\t\treturn $this->_ci_load_library($class.'/'.$class, $params, $object_name);\n\t\t}\n\n\t\t// If we got this far we were unable to find the requested class.\n\t\tlog_message('error', 'Unable to load the requested class: '.$class);\n\t\tshow_error('Unable to load the requested class: '.$class);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal CI Stock Library Loader\n\t *\n\t * @used-by\tCI_Loader::_ci_load_library()\n\t * @uses\tCI_Loader::_ci_init_library()\n\t *\n\t * @param\tstring\t$library_name\tLibrary name to load\n\t * @param\tstring\t$file_path\tPath to the library filename, relative to libraries/\n\t * @param\tmixed\t$params\t\tOptional parameters to pass to the class constructor\n\t * @param\tstring\t$object_name\tOptional object name to assign to\n\t * @return\tvoid\n\t */\n\tprotected function _ci_load_stock_library($library_name, $file_path, $params, $object_name)\n\t{\n\t\t$prefix = 'CI_';\n\n\t\tif (class_exists($prefix.$library_name, FALSE))\n\t\t{\n\t\t\tif (class_exists(config_item('subclass_prefix').$library_name, FALSE))\n\t\t\t{\n\t\t\t\t$prefix = config_item('subclass_prefix');\n\t\t\t}\n\n\t\t\t$property = $object_name;\n\t\t\tif (empty($property))\n\t\t\t{\n\t\t\t\t$property = strtolower($library_name);\n\t\t\t\tisset($this->_ci_varmap[$property]) && $property = $this->_ci_varmap[$property];\n\t\t\t}\n\n\t\t\t$CI =& get_instance();\n\t\t\tif ( ! isset($CI->$property))\n\t\t\t{\n\t\t\t\treturn $this->_ci_init_library($library_name, $prefix, $params, $object_name);\n\t\t\t}\n\n\t\t\tlog_message('debug', $library_name.' class already loaded. Second attempt ignored.');\n\t\t\treturn;\n\t\t}\n\n\t\t$paths = $this->_ci_library_paths;\n\t\tarray_pop($paths); // BASEPATH\n\t\tarray_pop($paths); // APPPATH (needs to be the first path checked)\n\t\tarray_unshift($paths, APPPATH);\n\n\t\tforeach ($paths as $path)\n\t\t{\n\t\t\tif (file_exists($path = $path.'libraries/'.$file_path.$library_name.'.php'))\n\t\t\t{\n\t\t\t\t// Override\n\t\t\t\tinclude_once($path);\n\t\t\t\tif (class_exists($prefix.$library_name, FALSE))\n\t\t\t\t{\n\t\t\t\t\treturn $this->_ci_init_library($library_name, $prefix, $params, $object_name);\n\t\t\t\t}\n\n\t\t\t\tlog_message('debug', $path.' exists, but does not declare '.$prefix.$library_name);\n\t\t\t}\n\t\t}\n\n\t\tinclude_once(BASEPATH.'libraries/'.$file_path.$library_name.'.php');\n\n\t\t// Check for extensions\n\t\t$subclass = config_item('subclass_prefix').$library_name;\n\t\tforeach ($paths as $path)\n\t\t{\n\t\t\tif (file_exists($path = $path.'libraries/'.$file_path.$subclass.'.php'))\n\t\t\t{\n\t\t\t\tinclude_once($path);\n\t\t\t\tif (class_exists($subclass, FALSE))\n\t\t\t\t{\n\t\t\t\t\t$prefix = config_item('subclass_prefix');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tlog_message('debug', $path.' exists, but does not declare '.$subclass);\n\t\t\t}\n\t\t}\n\n\t\treturn $this->_ci_init_library($library_name, $prefix, $params, $object_name);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal CI Library Instantiator\n\t *\n\t * @used-by\tCI_Loader::_ci_load_stock_library()\n\t * @used-by\tCI_Loader::_ci_load_library()\n\t *\n\t * @param\tstring\t\t$class\t\tClass name\n\t * @param\tstring\t\t$prefix\t\tClass name prefix\n\t * @param\tarray|null|bool\t$config\t\tOptional configuration to pass to the class constructor:\n\t *\t\t\t\t\t\tFALSE to skip;\n\t *\t\t\t\t\t\tNULL to search in config paths;\n\t *\t\t\t\t\t\tarray containing configuration data\n\t * @param\tstring\t\t$object_name\tOptional object name to assign to\n\t * @return\tvoid\n\t */\n\tprotected function _ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL)\n\t{\n\t\t// Is there an associated config file for this class? Note: these should always be lowercase\n\t\tif ($config === NULL)\n\t\t{\n\t\t\t// Fetch the config paths containing any package paths\n\t\t\t$config_component = $this->_ci_get_component('config');\n\n\t\t\tif (is_array($config_component->_config_paths))\n\t\t\t{\n\t\t\t\t$found = FALSE;\n\t\t\t\tforeach ($config_component->_config_paths as $path)\n\t\t\t\t{\n\t\t\t\t\t// We test for both uppercase and lowercase, for servers that\n\t\t\t\t\t// are case-sensitive with regard to file names. Load global first,\n\t\t\t\t\t// override with environment next\n\t\t\t\t\tif (file_exists($path.'config/'.strtolower($class).'.php'))\n\t\t\t\t\t{\n\t\t\t\t\t\tinclude($path.'config/'.strtolower($class).'.php');\n\t\t\t\t\t\t$found = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php'))\n\t\t\t\t\t{\n\t\t\t\t\t\tinclude($path.'config/'.ucfirst(strtolower($class)).'.php');\n\t\t\t\t\t\t$found = TRUE;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))\n\t\t\t\t\t{\n\t\t\t\t\t\tinclude($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');\n\t\t\t\t\t\t$found = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))\n\t\t\t\t\t{\n\t\t\t\t\t\tinclude($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');\n\t\t\t\t\t\t$found = TRUE;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Break on the first found configuration, thus package\n\t\t\t\t\t// files are not overridden by default paths\n\t\t\t\t\tif ($found === TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$class_name = $prefix.$class;\n\n\t\t// Is the class name valid?\n\t\tif ( ! class_exists($class_name, FALSE))\n\t\t{\n\t\t\tlog_message('error', 'Non-existent class: '.$class_name);\n\t\t\tshow_error('Non-existent class: '.$class_name);\n\t\t}\n\n\t\t// Set the variable name we will assign the class to\n\t\t// Was a custom class name supplied? If so we'll use it\n\t\tif (empty($object_name))\n\t\t{\n\t\t\t$object_name = strtolower($class);\n\t\t\tif (isset($this->_ci_varmap[$object_name]))\n\t\t\t{\n\t\t\t\t$object_name = $this->_ci_varmap[$object_name];\n\t\t\t}\n\t\t}\n\n\t\t// Don't overwrite existing properties\n\t\t$CI =& get_instance();\n\t\tif (isset($CI->$object_name))\n\t\t{\n\t\t\tif ($CI->$object_name instanceof $class_name)\n\t\t\t{\n\t\t\t\tlog_message('debug', $class_name.\" has already been instantiated as '\".$object_name.\"'. Second attempt aborted.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tshow_error(\"Resource '\".$object_name.\"' already exists and is not a \".$class_name.\" instance.\");\n\t\t}\n\n\t\t// Save the class name and object name\n\t\t$this->_ci_classes[$object_name] = $class;\n\n\t\t// Instantiate the class\n\t\t$CI->$object_name = isset($config)\n\t\t\t? new $class_name($config)\n\t\t\t: new $class_name();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CI Autoloader\n\t *\n\t * Loads component listed in the config/autoload.php file.\n\t *\n\t * @used-by\tCI_Loader::initialize()\n\t * @return\tvoid\n\t */\n\tprotected function _ci_autoloader()\n\t{\n\t\tif (file_exists(APPPATH.'config/autoload.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/autoload.php');\n\t\t}\n\n\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');\n\t\t}\n\n\t\tif ( ! isset($autoload))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Autoload packages\n\t\tif (isset($autoload['packages']))\n\t\t{\n\t\t\tforeach ($autoload['packages'] as $package_path)\n\t\t\t{\n\t\t\t\t$this->add_package_path($package_path);\n\t\t\t}\n\t\t}\n\n\t\t// Load any custom config file\n\t\tif (count($autoload['config']) > 0)\n\t\t{\n\t\t\tforeach ($autoload['config'] as $val)\n\t\t\t{\n\t\t\t\t$this->config($val);\n\t\t\t}\n\t\t}\n\n\t\t// Autoload helpers and languages\n\t\tforeach (array('helper', 'language') as $type)\n\t\t{\n\t\t\tif (isset($autoload[$type]) && count($autoload[$type]) > 0)\n\t\t\t{\n\t\t\t\t$this->$type($autoload[$type]);\n\t\t\t}\n\t\t}\n\n\t\t// Autoload drivers\n\t\tif (isset($autoload['drivers']))\n\t\t{\n\t\t\t$this->driver($autoload['drivers']);\n\t\t}\n\n\t\t// Load libraries\n\t\tif (isset($autoload['libraries']) && count($autoload['libraries']) > 0)\n\t\t{\n\t\t\t// Load the database driver.\n\t\t\tif (in_array('database', $autoload['libraries']))\n\t\t\t{\n\t\t\t\t$this->database();\n\t\t\t\t$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));\n\t\t\t}\n\n\t\t\t// Load all other libraries\n\t\t\t$this->library($autoload['libraries']);\n\t\t}\n\n\t\t// Autoload models\n\t\tif (isset($autoload['model']))\n\t\t{\n\t\t\t$this->model($autoload['model']);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prepare variables for _ci_vars, to be later extract()-ed inside views\n\t *\n\t * Converts objects to associative arrays and filters-out internal\n\t * variable names (i.e. keys prefixed with '_ci_').\n\t *\n\t * @param\tmixed\t$vars\n\t * @return\tarray\n\t */\n\tprotected function _ci_prepare_view_vars($vars)\n\t{\n\t\tif ( ! is_array($vars))\n\t\t{\n\t\t\t$vars = is_object($vars)\n\t\t\t\t? get_object_vars($vars)\n\t\t\t\t: array();\n\t\t}\n\n\t\tforeach (array_keys($vars) as $key)\n\t\t{\n\t\t\tif (strncmp($key, '_ci_', 4) === 0)\n\t\t\t{\n\t\t\t\tunset($vars[$key]);\n\t\t\t}\n\t\t}\n\n\t\treturn $vars;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CI Component getter\n\t *\n\t * Get a reference to a specific library or model.\n\t *\n\t * @param \tstring\t$component\tComponent name\n\t * @return\tbool\n\t */\n\tprotected function &_ci_get_component($component)\n\t{\n\t\t$CI =& get_instance();\n\t\treturn $CI->$component;\n\t}\n}\n"
  },
  {
    "path": "system/core/Log.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Logging Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLogging\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/general/errors.html\n */\nclass CI_Log {\n\n\t/**\n\t * Path to save log files\n\t *\n\t * @var string\n\t */\n\tprotected $_log_path;\n\n\t/**\n\t * File permissions\n\t *\n\t * @var\tint\n\t */\n\tprotected $_file_permissions = 0644;\n\n\t/**\n\t * Level of logging\n\t *\n\t * @var int\n\t */\n\tprotected $_threshold = 1;\n\n\t/**\n\t * Array of threshold levels to log\n\t *\n\t * @var array\n\t */\n\tprotected $_threshold_array = array();\n\n\t/**\n\t * Format of timestamp for log files\n\t *\n\t * @var string\n\t */\n\tprotected $_date_fmt = 'Y-m-d H:i:s';\n\n\t/**\n\t * Filename extension\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_file_ext;\n\n\t/**\n\t * Whether or not the logger can write to the log files\n\t *\n\t * @var bool\n\t */\n\tprotected $_enabled = TRUE;\n\n\t/**\n\t * Predefined logging levels\n\t *\n\t * @var array\n\t */\n\tprotected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4);\n\n\t/**\n\t * mbstring.func_overload flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected static $func_overload;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$config =& get_config();\n\n\t\tisset(self::$func_overload) OR self::$func_overload = ( ! is_php('8.0') && extension_loaded('mbstring') && @ini_get('mbstring.func_overload'));\n\n\t\t$this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/';\n\t\t$this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '')\n\t\t\t? ltrim($config['log_file_extension'], '.') : 'php';\n\n\t\tfile_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE);\n\n\t\tif ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))\n\t\t{\n\t\t\t$this->_enabled = FALSE;\n\t\t}\n\n\t\tif (is_numeric($config['log_threshold']))\n\t\t{\n\t\t\t$this->_threshold = (int) $config['log_threshold'];\n\t\t}\n\t\telseif (is_array($config['log_threshold']))\n\t\t{\n\t\t\t$this->_threshold = 0;\n\t\t\t$this->_threshold_array = array_flip($config['log_threshold']);\n\t\t}\n\n\t\tif ( ! empty($config['log_date_format']))\n\t\t{\n\t\t\t$this->_date_fmt = $config['log_date_format'];\n\t\t}\n\n\t\tif ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions']))\n\t\t{\n\t\t\t$this->_file_permissions = $config['log_file_permissions'];\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Write Log File\n\t *\n\t * Generally this function will be called using the global log_message() function\n\t *\n\t * @param\tstring\t$level \tThe error level: 'error', 'debug' or 'info'\n\t * @param\tstring\t$msg \tThe error message\n\t * @return\tbool\n\t */\n\tpublic function write_log($level, $msg)\n\t{\n\t\tif ($this->_enabled === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$level = strtoupper($level);\n\n\t\tif (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))\n\t\t\t&& ! isset($this->_threshold_array[$this->_levels[$level]]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext;\n\t\t$message = '';\n\n\t\tif ( ! file_exists($filepath))\n\t\t{\n\t\t\t$newfile = TRUE;\n\t\t\t// Only add protection to php files\n\t\t\tif ($this->_file_ext === 'php')\n\t\t\t{\n\t\t\t\t$message .= \"<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\\n\\n\";\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $fp = @fopen($filepath, 'ab'))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tflock($fp, LOCK_EX);\n\n\t\t// Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format\n\t\tif (strpos($this->_date_fmt, 'u') !== FALSE)\n\t\t{\n\t\t\t$microtime_full = microtime(TRUE);\n\t\t\t$microtime_short = sprintf(\"%06d\", ($microtime_full - floor($microtime_full)) * 1000000);\n\t\t\t$date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full));\n\t\t\t$date = $date->format($this->_date_fmt);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$date = date($this->_date_fmt);\n\t\t}\n\n\t\t$message .= $this->_format_line($level, $date, $msg);\n\n\t\tfor ($written = 0, $length = self::strlen($message); $written < $length; $written += $result)\n\t\t{\n\t\t\tif (($result = fwrite($fp, self::substr($message, $written))) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tflock($fp, LOCK_UN);\n\t\tfclose($fp);\n\n\t\tif (isset($newfile) && $newfile === TRUE)\n\t\t{\n\t\t\tchmod($filepath, $this->_file_permissions);\n\t\t}\n\n\t\treturn is_int($result);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Format the log line.\n\t *\n\t * This is for extensibility of log formatting\n\t * If you want to change the log format, extend the CI_Log class and override this method\n\t *\n\t * @param\tstring\t$level \tThe error level\n\t * @param\tstring\t$date \tFormatted date string\n\t * @param\tstring\t$message \tThe log message\n\t * @return\tstring\tFormatted log line with a new line character at the end\n\t */\n\tprotected function _format_line($level, $date, $message)\n\t{\n\t\treturn $level.' - '.$date.' --> '.$message.PHP_EOL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn (self::$func_overload)\n\t\t\t? mb_strlen($str, '8bit')\n\t\t\t: strlen($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe substr()\n\t *\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tprotected static function substr($str, $start, $length = NULL)\n\t{\n\t\tif (self::$func_overload)\n\t\t{\n\t\t\t// mb_substr($str, $start, null, '8bit') returns an empty\n\t\t\t// string on PHP 5.3\n\t\t\tisset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);\n\t\t\treturn mb_substr($str, $start, $length, '8bit');\n\t\t}\n\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/core/Model.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Model Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/config.html\n */\nclass CI_Model {\n\n\t/**\n\t * Class constructor\n\t *\n\t * @link\thttps://github.com/bcit-ci/CodeIgniter/issues/5332\n\t * @return\tvoid\n\t */\n\tpublic function __construct() {}\n\n\t/**\n\t * __get magic\n\t *\n\t * Allows models to access CI's loaded classes using the same\n\t * syntax as controllers.\n\t *\n\t * @param\tstring\t$key\n\t */\n\tpublic function __get($key)\n\t{\n\t\t// Debugging note:\n\t\t//\tIf you're here because you're getting an error message\n\t\t//\tsaying 'Undefined Property: system/core/Model.php', it's\n\t\t//\tmost likely a typo in your model code.\n\t\treturn get_instance()->$key;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Output.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Output Class\n *\n * Responsible for sending final output to the browser.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tOutput\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/output.html\n */\nclass CI_Output {\n\n\t/**\n\t * Final output string\n\t *\n\t * @var\tstring\n\t */\n\tpublic $final_output = '';\n\n\t/**\n\t * Cache expiration time\n\t *\n\t * @var\tint\n\t */\n\tpublic $cache_expiration = 0;\n\n\t/**\n\t * List of server headers\n\t *\n\t * @var\tarray\n\t */\n\tpublic $headers = array();\n\n\t/**\n\t * List of mime types\n\t *\n\t * @var\tarray\n\t */\n\tpublic $mimes =\tarray();\n\n\t/**\n\t * Mime-type for the current page\n\t *\n\t * @var\tstring\n\t */\n\tprotected $mime_type = 'text/html';\n\n\t/**\n\t * Enable Profiler flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $enable_profiler = FALSE;\n\n\t/**\n\t * php.ini zlib.output_compression flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_zlib_oc = FALSE;\n\n\t/**\n\t * CI output compression flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_compress_output = FALSE;\n\n\t/**\n\t * List of profiler sections\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_profiler_sections =\tarray();\n\n\t/**\n\t * Parse markers flag\n\t *\n\t * Whether or not to parse variables like {elapsed_time} and {memory_usage}.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $parse_exec_vars = TRUE;\n\n\t/**\n\t * mbstring.func_overload flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected static $func_overload;\n\n\t/**\n\t * Class constructor\n\t *\n\t * Determines whether zLib output compression will be used.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->_zlib_oc = (bool) ini_get('zlib.output_compression');\n\t\t$this->_compress_output = (\n\t\t\t$this->_zlib_oc === FALSE\n\t\t\t&& config_item('compress_output') === TRUE\n\t\t\t&& extension_loaded('zlib')\n\t\t);\n\n\t\tisset(self::$func_overload) OR self::$func_overload = ( ! is_php('8.0') && extension_loaded('mbstring') && @ini_get('mbstring.func_overload'));\n\n\t\t// Get mime types for later\n\t\t$this->mimes =& get_mimes();\n\n\t\tlog_message('info', 'Output Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Output\n\t *\n\t * Returns the current output string.\n\t *\n\t * @return\tstring\n\t */\n\tpublic function get_output()\n\t{\n\t\treturn $this->final_output;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Output\n\t *\n\t * Sets the output string.\n\t *\n\t * @param\tstring\t$output\tOutput data\n\t * @return\tCI_Output\n\t */\n\tpublic function set_output($output)\n\t{\n\t\t$this->final_output = $output;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Append Output\n\t *\n\t * Appends data onto the output string.\n\t *\n\t * @param\tstring\t$output\tData to append\n\t * @return\tCI_Output\n\t */\n\tpublic function append_output($output)\n\t{\n\t\t$this->final_output .= $output;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Header\n\t *\n\t * Lets you set a server header which will be sent with the final output.\n\t *\n\t * Note: If a file is cached, headers will not be sent.\n\t * @todo\tWe need to figure out how to permit headers to be cached.\n\t *\n\t * @param\tstring\t$header\t\tHeader\n\t * @param\tbool\t$replace\tWhether to replace the old header value, if already set\n\t * @return\tCI_Output\n\t */\n\tpublic function set_header($header, $replace = TRUE)\n\t{\n\t\t// If zlib.output_compression is enabled it will compress the output,\n\t\t// but it will not modify the content-length header to compensate for\n\t\t// the reduction, causing the browser to hang waiting for more data.\n\t\t// We'll just skip content-length in those cases.\n\t\tif ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0)\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\n\t\t$this->headers[] = array($header, $replace);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Content-Type Header\n\t *\n\t * @param\tstring\t$mime_type\tExtension of the file we're outputting\n\t * @param\tstring\t$charset\tCharacter set (default: NULL)\n\t * @return\tCI_Output\n\t */\n\tpublic function set_content_type($mime_type, $charset = NULL)\n\t{\n\t\tif (strpos($mime_type, '/') === FALSE)\n\t\t{\n\t\t\t$extension = ltrim($mime_type, '.');\n\n\t\t\t// Is this extension supported?\n\t\t\tif (isset($this->mimes[$extension]))\n\t\t\t{\n\t\t\t\t$mime_type =& $this->mimes[$extension];\n\n\t\t\t\tif (is_array($mime_type))\n\t\t\t\t{\n\t\t\t\t\t$mime_type = current($mime_type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->mime_type = $mime_type;\n\n\t\tif (empty($charset))\n\t\t{\n\t\t\t$charset = config_item('charset');\n\t\t}\n\n\t\t$header = 'Content-Type: '.$mime_type\n\t\t\t.(empty($charset) ? '' : '; charset='.$charset);\n\n\t\t$this->headers[] = array($header, TRUE);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Current Content-Type Header\n\t *\n\t * @return\tstring\t'text/html', if not already set\n\t */\n\tpublic function get_content_type()\n\t{\n\t\tfor ($i = 0, $c = count($this->headers); $i < $c; $i++)\n\t\t{\n\t\t\tif (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1)\n\t\t\t{\n\t\t\t\treturn $content_type;\n\t\t\t}\n\t\t}\n\n\t\treturn 'text/html';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Header\n\t *\n\t * @param\tstring\t$header\n\t * @return\tstring\n\t */\n\tpublic function get_header($header)\n\t{\n\t\t// We only need [x][0] from our multi-dimensional array\n\t\t$header_lines = array_map(function ($headers)\n\t\t{\n\t\t\treturn array_shift($headers);\n\t\t}, $this->headers);\n\n\t\t$headers = array_merge(\n\t\t\t$header_lines,\n\t\t\theaders_list()\n\t\t);\n\n\t\tif (empty($headers) OR empty($header))\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\t// Count backwards, in order to get the last matching header\n\t\tfor ($c = count($headers) - 1; $c > -1; $c--)\n\t\t{\n\t\t\tif (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0)\n\t\t\t{\n\t\t\t\treturn trim(self::substr($headers[$c], $l+1));\n\t\t\t}\n\t\t}\n\n\t\treturn NULL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set HTTP Status Header\n\t *\n\t * As of version 1.7.2, this is an alias for common function\n\t * set_status_header().\n\t *\n\t * @param\tint\t$code\tStatus code (default: 200)\n\t * @param\tstring\t$text\tOptional message\n\t * @return\tCI_Output\n\t */\n\tpublic function set_status_header($code = 200, $text = '')\n\t{\n\t\tset_status_header($code, $text);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Enable/disable Profiler\n\t *\n\t * @param\tbool\t$val\tTRUE to enable or FALSE to disable\n\t * @return\tCI_Output\n\t */\n\tpublic function enable_profiler($val = TRUE)\n\t{\n\t\t$this->enable_profiler = is_bool($val) ? $val : TRUE;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Profiler Sections\n\t *\n\t * Allows override of default/config settings for\n\t * Profiler section display.\n\t *\n\t * @param\tarray\t$sections\tProfiler sections\n\t * @return\tCI_Output\n\t */\n\tpublic function set_profiler_sections($sections)\n\t{\n\t\tif (isset($sections['query_toggle_count']))\n\t\t{\n\t\t\t$this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count'];\n\t\t\tunset($sections['query_toggle_count']);\n\t\t}\n\n\t\tforeach ($sections as $section => $enable)\n\t\t{\n\t\t\t$this->_profiler_sections[$section] = ($enable !== FALSE);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Cache\n\t *\n\t * @param\tint\t$time\tCache expiration time in minutes\n\t * @return\tCI_Output\n\t */\n\tpublic function cache($time)\n\t{\n\t\t$this->cache_expiration = is_numeric($time) ? $time : 0;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Display Output\n\t *\n\t * Processes and sends finalized output data to the browser along\n\t * with any server headers and profile data. It also stops benchmark\n\t * timers so the page rendering speed and memory usage can be shown.\n\t *\n\t * Note: All \"view\" data is automatically put into $this->final_output\n\t *\t by controller class.\n\t *\n\t * @uses\tCI_Output::$final_output\n\t * @param\tstring\t$output\tOutput data override\n\t * @return\tvoid\n\t */\n\tpublic function _display($output = '')\n\t{\n\t\t// Note:  We use load_class() because we can't use $CI =& get_instance()\n\t\t// since this function is sometimes called by the caching mechanism,\n\t\t// which happens before the CI super object is available.\n\t\t$BM =& load_class('Benchmark', 'core');\n\t\t$CFG =& load_class('Config', 'core');\n\n\t\t// Grab the super object if we can.\n\t\tif (class_exists('CI_Controller', FALSE))\n\t\t{\n\t\t\t$CI =& get_instance();\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Set the output data\n\t\tif ($output === '')\n\t\t{\n\t\t\t$output =& $this->final_output;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Do we need to write a cache file? Only if the controller does not have its\n\t\t// own _output() method and we are not dealing with a cache file, which we\n\t\t// can determine by the existence of the $CI object above\n\t\tif ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output'))\n\t\t{\n\t\t\t$this->_write_cache($output);\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Parse out the elapsed time and memory usage,\n\t\t// then swap the pseudo-variables with the data\n\n\t\t$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');\n\n\t\tif ($this->parse_exec_vars === TRUE)\n\t\t{\n\t\t\t$memory\t= round(memory_get_usage() / 1024 / 1024, 2).'MB';\n\t\t\t$output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output);\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Is compression requested?\n\t\tif (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed\n\t\t\t&& $this->_compress_output === TRUE\n\t\t\t&& isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)\n\t\t{\n\t\t\tob_start('ob_gzhandler');\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Are there any server headers to send?\n\t\tif (count($this->headers) > 0)\n\t\t{\n\t\t\tforeach ($this->headers as $header)\n\t\t\t{\n\t\t\t\t@header($header[0], $header[1]);\n\t\t\t}\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Does the $CI object exist?\n\t\t// If not we know we are dealing with a cache file so we'll\n\t\t// simply echo out the data and exit.\n\t\tif ( ! isset($CI))\n\t\t{\n\t\t\tif ($this->_compress_output === TRUE)\n\t\t\t{\n\t\t\t\tif (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)\n\t\t\t\t{\n\t\t\t\t\theader('Content-Encoding: gzip');\n\t\t\t\t\theader('Content-Length: '.self::strlen($output));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// User agent doesn't support gzip compression,\n\t\t\t\t\t// so we'll have to decompress our cache\n\t\t\t\t\t$output = gzinflate(self::substr($output, 10, -8));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\techo $output;\n\t\t\tlog_message('info', 'Final output sent to browser');\n\t\t\tlog_message('debug', 'Total execution time: '.$elapsed);\n\t\t\treturn;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Do we need to generate profile data?\n\t\t// If so, load the Profile class and run it.\n\t\tif ($this->enable_profiler === TRUE)\n\t\t{\n\t\t\t$CI->load->library('profiler');\n\t\t\tif ( ! empty($this->_profiler_sections))\n\t\t\t{\n\t\t\t\t$CI->profiler->set_sections($this->_profiler_sections);\n\t\t\t}\n\n\t\t\t// If the output data contains closing </body> and </html> tags\n\t\t\t// we will remove them and add them back after we insert the profile data\n\t\t\t$output = preg_replace('|</body>.*?</html>|is', '', $output, -1, $count).$CI->profiler->run();\n\t\t\tif ($count > 0)\n\t\t\t{\n\t\t\t\t$output .= '</body></html>';\n\t\t\t}\n\t\t}\n\n\t\t// Does the controller contain a function named _output()?\n\t\t// If so send the output there.  Otherwise, echo it.\n\t\tif (method_exists($CI, '_output'))\n\t\t{\n\t\t\t$CI->_output($output);\n\t\t}\n\t\telse\n\t\t{\n\t\t\techo $output; // Send it to the browser!\n\t\t}\n\n\t\tlog_message('info', 'Final output sent to browser');\n\t\tlog_message('debug', 'Total execution time: '.$elapsed);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Write Cache\n\t *\n\t * @param\tstring\t$output\tOutput data to cache\n\t * @return\tvoid\n\t */\n\tpublic function _write_cache($output)\n\t{\n\t\t$CI =& get_instance();\n\t\t$path = $CI->config->item('cache_path');\n\t\t$cache_path = ($path === '') ? APPPATH.'cache/' : $path;\n\n\t\tif ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))\n\t\t{\n\t\t\tlog_message('error', 'Unable to write cache file: '.$cache_path);\n\t\t\treturn;\n\t\t}\n\n\t\t$uri = $CI->config->item('base_url')\n\t\t\t.$CI->config->item('index_page')\n\t\t\t.$CI->uri->uri_string();\n\n\t\tif (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING']))\n\t\t{\n\t\t\tif (is_array($cache_query_string))\n\t\t\t{\n\t\t\t\t$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$uri .= '?'.$_SERVER['QUERY_STRING'];\n\t\t\t}\n\t\t}\n\n\t\t$cache_path .= md5($uri);\n\n\t\tif ( ! $fp = @fopen($cache_path, 'w+b'))\n\t\t{\n\t\t\tlog_message('error', 'Unable to write cache file: '.$cache_path);\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! flock($fp, LOCK_EX))\n\t\t{\n\t\t\tlog_message('error', 'Unable to secure a file lock for file at: '.$cache_path);\n\t\t\tfclose($fp);\n\t\t\treturn;\n\t\t}\n\n\t\t// If output compression is enabled, compress the cache\n\t\t// itself, so that we don't have to do that each time\n\t\t// we're serving it\n\t\tif ($this->_compress_output === TRUE)\n\t\t{\n\t\t\t$output = gzencode($output);\n\n\t\t\tif ($this->get_header('content-type') === NULL)\n\t\t\t{\n\t\t\t\t$this->set_content_type($this->mime_type);\n\t\t\t}\n\t\t}\n\n\t\t$expire = time() + ($this->cache_expiration * 60);\n\n\t\t// Put together our serialized info.\n\t\t$cache_info = serialize(array(\n\t\t\t'expire'\t=> $expire,\n\t\t\t'headers'\t=> $this->headers\n\t\t));\n\n\t\t$output = $cache_info.'ENDCI--->'.$output;\n\n\t\tfor ($written = 0, $length = self::strlen($output); $written < $length; $written += $result)\n\t\t{\n\t\t\tif (($result = fwrite($fp, self::substr($output, $written))) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tflock($fp, LOCK_UN);\n\t\tfclose($fp);\n\n\t\tif ( ! is_int($result))\n\t\t{\n\t\t\t@unlink($cache_path);\n\t\t\tlog_message('error', 'Unable to write the complete cache content at: '.$cache_path);\n\t\t\treturn;\n\t\t}\n\n\t\tchmod($cache_path, 0640);\n\t\tlog_message('debug', 'Cache file written: '.$cache_path);\n\n\t\t// Send HTTP cache-control headers to browser to match file cache settings.\n\t\t$this->set_cache_header($_SERVER['REQUEST_TIME'], $expire);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update/serve cached output\n\t *\n\t * @uses\tCI_Config\n\t * @uses\tCI_URI\n\t *\n\t * @param\tobject\t&$CFG\tCI_Config class instance\n\t * @param\tobject\t&$URI\tCI_URI class instance\n\t * @return\tbool\tTRUE on success or FALSE on failure\n\t */\n\tpublic function _display_cache(&$CFG, &$URI)\n\t{\n\t\t$cache_path = ($CFG->item('cache_path') === '') ? APPPATH.'cache/' : $CFG->item('cache_path');\n\n\t\t// Build the file path. The file name is an MD5 hash of the full URI\n\t\t$uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string;\n\n\t\tif (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING']))\n\t\t{\n\t\t\tif (is_array($cache_query_string))\n\t\t\t{\n\t\t\t\t$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$uri .= '?'.$_SERVER['QUERY_STRING'];\n\t\t\t}\n\t\t}\n\n\t\t$filepath = $cache_path.md5($uri);\n\n\t\tif ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb'))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tflock($fp, LOCK_SH);\n\n\t\t$cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : '';\n\n\t\tflock($fp, LOCK_UN);\n\t\tfclose($fp);\n\n\t\t// Look for embedded serialized file info.\n\t\tif ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$cache_info = unserialize($match[1]);\n\t\t$expire = $cache_info['expire'];\n\n\t\t$last_modified = filemtime($filepath);\n\n\t\t// Has the file expired?\n\t\tif ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path))\n\t\t{\n\t\t\t// If so we'll delete it.\n\t\t\t@unlink($filepath);\n\t\t\tlog_message('debug', 'Cache file has expired. File deleted.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Send the HTTP cache control headers\n\t\t$this->set_cache_header($last_modified, $expire);\n\n\t\t// Add headers from cache file.\n\t\tforeach ($cache_info['headers'] as $header)\n\t\t{\n\t\t\t$this->set_header($header[0], $header[1]);\n\t\t}\n\n\t\t// Display the cache\n\t\t$this->_display(self::substr($cache, self::strlen($match[0])));\n\t\tlog_message('debug', 'Cache file is current. Sending it to browser.');\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete cache\n\t *\n\t * @param\tstring\t$uri\tURI string\n\t * @return\tbool\n\t */\n\tpublic function delete_cache($uri = '')\n\t{\n\t\t$CI =& get_instance();\n\t\t$cache_path = $CI->config->item('cache_path');\n\t\tif ($cache_path === '')\n\t\t{\n\t\t\t$cache_path = APPPATH.'cache/';\n\t\t}\n\n\t\tif ( ! is_dir($cache_path))\n\t\t{\n\t\t\tlog_message('error', 'Unable to find cache path: '.$cache_path);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (empty($uri))\n\t\t{\n\t\t\t$uri = $CI->uri->uri_string();\n\n\t\t\tif (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING']))\n\t\t\t{\n\t\t\t\tif (is_array($cache_query_string))\n\t\t\t\t{\n\t\t\t\t\t$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$uri .= '?'.$_SERVER['QUERY_STRING'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/'));\n\n\t\tif ( ! @unlink($cache_path))\n\t\t{\n\t\t\tlog_message('error', 'Unable to delete cache file for '.$uri);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Cache Header\n\t *\n\t * Set the HTTP headers to match the server-side file cache settings\n\t * in order to reduce bandwidth.\n\t *\n\t * @param\tint\t$last_modified\tTimestamp of when the page was last modified\n\t * @param\tint\t$expiration\tTimestamp of when should the requested page expire from cache\n\t * @return\tvoid\n\t */\n\tpublic function set_cache_header($last_modified, $expiration)\n\t{\n\t\t$max_age = $expiration - $_SERVER['REQUEST_TIME'];\n\n\t\tif (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))\n\t\t{\n\t\t\t$this->set_status_header(304);\n\t\t\texit;\n\t\t}\n\n\t\theader('Pragma: public');\n\t\theader('Cache-Control: max-age='.$max_age.', public');\n\t\theader('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT');\n\t\theader('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn (self::$func_overload)\n\t\t\t? mb_strlen($str, '8bit')\n\t\t\t: strlen($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe substr()\n\t *\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tprotected static function substr($str, $start, $length = NULL)\n\t{\n\t\tif (self::$func_overload)\n\t\t{\n\t\t\t// mb_substr($str, $start, null, '8bit') returns an empty\n\t\t\t// string on PHP 5.3\n\t\t\tisset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);\n\t\t\treturn mb_substr($str, $start, $length, '8bit');\n\t\t}\n\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/core/Router.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Router Class\n *\n * Parses URIs and determines routing\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/general/routing.html\n */\nclass CI_Router {\n\n\t/**\n\t * CI_Config class object\n\t *\n\t * @var\tobject\n\t */\n\tpublic $config;\n\n\t/**\n\t * List of routes\n\t *\n\t * @var\tarray\n\t */\n\tpublic $routes =\tarray();\n\n\t/**\n\t * Current class name\n\t *\n\t * @var\tstring\n\t */\n\tpublic $class =\t\t'';\n\n\t/**\n\t * Current method name\n\t *\n\t * @var\tstring\n\t */\n\tpublic $method =\t'index';\n\n\t/**\n\t * Sub-directory that contains the requested controller class\n\t *\n\t * @var\tstring\n\t */\n\tpublic $directory;\n\n\t/**\n\t * Default controller (and method if specific)\n\t *\n\t * @var\tstring\n\t */\n\tpublic $default_controller;\n\n\t/**\n\t * Translate URI dashes\n\t *\n\t * Determines whether dashes in controller & method segments\n\t * should be automatically replaced by underscores.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $translate_uri_dashes = FALSE;\n\n\t/**\n\t * Enable query strings flag\n\t *\n\t * Determines whether to use GET parameters or segment URIs\n\t *\n\t * @var\tbool\n\t */\n\tpublic $enable_query_strings = FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Runs the route mapping function.\n\t *\n\t * @param\tarray\t$routing\n\t * @return\tvoid\n\t */\n\tpublic function __construct($routing = NULL)\n\t{\n\t\t$this->config =& load_class('Config', 'core');\n\t\t$this->uri =& load_class('URI', 'core');\n\n\t\t$this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE);\n\n\t\t// If a directory override is configured, it has to be set before any dynamic routing logic\n\t\tis_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']);\n\t\t$this->_set_routing();\n\n\t\t// Set any routing overrides that may exist in the main index file\n\t\tif (is_array($routing))\n\t\t{\n\t\t\tempty($routing['controller']) OR $this->set_class($routing['controller']);\n\t\t\tempty($routing['function'])   OR $this->set_method($routing['function']);\n\t\t}\n\n\t\tlog_message('info', 'Router Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set route mapping\n\t *\n\t * Determines what should be served based on the URI request,\n\t * as well as any \"routes\" that have been set in the routing config file.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _set_routing()\n\t{\n\t\t// Load the routes.php file. It would be great if we could\n\t\t// skip this for enable_query_strings = TRUE, but then\n\t\t// default_controller would be empty ...\n\t\tif (file_exists(APPPATH.'config/routes.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/routes.php');\n\t\t}\n\n\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/routes.php');\n\t\t}\n\n\t\t// Validate & get reserved routes\n\t\tif (isset($route) && is_array($route))\n\t\t{\n\t\t\tisset($route['default_controller']) && $this->default_controller = $route['default_controller'];\n\t\t\tisset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];\n\t\t\tunset($route['default_controller'], $route['translate_uri_dashes']);\n\t\t\t$this->routes = $route;\n\t\t}\n\n\t\t// Are query strings enabled in the config file? Normally CI doesn't utilize query strings\n\t\t// since URI segments are more search-engine friendly, but they can optionally be used.\n\t\t// If this feature is enabled, we will gather the directory/class/method a little differently\n\t\tif ($this->enable_query_strings)\n\t\t{\n\t\t\t// If the directory is set at this time, it means an override exists, so skip the checks\n\t\t\tif ( ! isset($this->directory))\n\t\t\t{\n\t\t\t\t$_d = $this->config->item('directory_trigger');\n\t\t\t\t$_d = isset($_GET[$_d]) ? trim($_GET[$_d], \" \\t\\n\\r\\0\\x0B/\") : '';\n\n\t\t\t\tif ($_d !== '')\n\t\t\t\t{\n\t\t\t\t\t$this->uri->filter_uri($_d);\n\t\t\t\t\t$this->set_directory($_d);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$_c = trim($this->config->item('controller_trigger'));\n\t\t\tif ( ! empty($_GET[$_c]))\n\t\t\t{\n\t\t\t\t$this->uri->filter_uri($_GET[$_c]);\n\t\t\t\t$this->set_class($_GET[$_c]);\n\n\t\t\t\t$_f = trim($this->config->item('function_trigger'));\n\t\t\t\tif ( ! empty($_GET[$_f]))\n\t\t\t\t{\n\t\t\t\t\t$this->uri->filter_uri($_GET[$_f]);\n\t\t\t\t\t$this->set_method($_GET[$_f]);\n\t\t\t\t}\n\n\t\t\t\t$this->uri->rsegments = array(\n\t\t\t\t\t1 => $this->class,\n\t\t\t\t\t2 => $this->method\n\t\t\t\t);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_set_default_controller();\n\t\t\t}\n\n\t\t\t// Routing rules don't apply to query strings and we don't need to detect\n\t\t\t// directories, so we're done here\n\t\t\treturn;\n\t\t}\n\n\t\t// Is there anything to parse?\n\t\tif ($this->uri->uri_string !== '')\n\t\t{\n\t\t\t$this->_parse_routes();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_set_default_controller();\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set request route\n\t *\n\t * Takes an array of URI segments as input and sets the class/method\n\t * to be called.\n\t *\n\t * @used-by\tCI_Router::_parse_routes()\n\t * @param\tarray\t$segments\tURI segments\n\t * @return\tvoid\n\t */\n\tprotected function _set_request($segments = array())\n\t{\n\t\t$segments = $this->_validate_request($segments);\n\t\t// If we don't have any segments left - try the default controller;\n\t\t// WARNING: Directories get shifted out of the segments array!\n\t\tif (empty($segments))\n\t\t{\n\t\t\t$this->_set_default_controller();\n\t\t\treturn;\n\t\t}\n\n\t\tif ($this->translate_uri_dashes === TRUE)\n\t\t{\n\t\t\t$segments[0] = str_replace('-', '_', $segments[0]);\n\t\t\tif (isset($segments[1]))\n\t\t\t{\n\t\t\t\t$segments[1] = str_replace('-', '_', $segments[1]);\n\t\t\t}\n\t\t}\n\n\t\t$this->set_class($segments[0]);\n\t\tif (isset($segments[1]))\n\t\t{\n\t\t\t$this->set_method($segments[1]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$segments[1] = 'index';\n\t\t}\n\n\t\tarray_unshift($segments, NULL);\n\t\tunset($segments[0]);\n\t\t$this->uri->rsegments = $segments;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set default controller\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _set_default_controller()\n\t{\n\t\tif (empty($this->default_controller))\n\t\t{\n\t\t\tshow_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');\n\t\t}\n\n\t\t// Is the method being specified?\n\t\tif (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2)\n\t\t{\n\t\t\t$method = 'index';\n\t\t}\n\n\t\tif ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php'))\n\t\t{\n\t\t\t// This will trigger 404 later\n\t\t\treturn;\n\t\t}\n\n\t\t$this->set_class($class);\n\t\t$this->set_method($method);\n\n\t\t// Assign routed segments, index starting from 1\n\t\t$this->uri->rsegments = array(\n\t\t\t1 => $class,\n\t\t\t2 => $method\n\t\t);\n\n\t\tlog_message('debug', 'No URI present. Default controller set.');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate request\n\t *\n\t * Attempts validate the URI request and determine the controller path.\n\t *\n\t * @used-by\tCI_Router::_set_request()\n\t * @param\tarray\t$segments\tURI segments\n\t * @return\tmixed\tURI segments\n\t */\n\tprotected function _validate_request($segments)\n\t{\n\t\t$c = count($segments);\n\t\t$directory_override = isset($this->directory);\n\n\t\t// Loop through our segments and return as soon as a controller\n\t\t// is found or when such a directory doesn't exist\n\t\twhile ($c-- > 0)\n\t\t{\n\t\t\t$test = $this->directory\n\t\t\t\t.ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]);\n\n\t\t\tif ( ! file_exists(APPPATH.'controllers/'.$test.'.php')\n\t\t\t\t&& $directory_override === FALSE\n\t\t\t\t&& is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])\n\t\t\t)\n\t\t\t{\n\t\t\t\t$this->set_directory(array_shift($segments), TRUE);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn $segments;\n\t\t}\n\n\t\t// This means that all segments were actually directories\n\t\treturn $segments;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse Routes\n\t *\n\t * Matches any routes that may exist in the config/routes.php file\n\t * against the URI to determine if the class/method need to be remapped.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _parse_routes()\n\t{\n\t\t// Turn the segment array into a URI string\n\t\t$uri = implode('/', $this->uri->segments);\n\n\t\t// Get HTTP verb\n\t\t$http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli';\n\n\t\t// Loop through the route array looking for wildcards\n\t\tforeach ($this->routes as $key => $val)\n\t\t{\n\t\t\t// Check if route format is using HTTP verbs\n\t\t\tif (is_array($val))\n\t\t\t{\n\t\t\t\t$val = array_change_key_case($val, CASE_LOWER);\n\t\t\t\tif (isset($val[$http_verb]))\n\t\t\t\t{\n\t\t\t\t\t$val = $val[$http_verb];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Convert wildcards to RegEx\n\t\t\t$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);\n\n\t\t\t// Does the RegEx match?\n\t\t\tif (preg_match('#^'.$key.'$#', $uri, $matches))\n\t\t\t{\n\t\t\t\t// Are we using callbacks to process back-references?\n\t\t\t\tif ( ! is_string($val) && is_callable($val))\n\t\t\t\t{\n\t\t\t\t\t// Remove the original string from the matches array.\n\t\t\t\t\tarray_shift($matches);\n\n\t\t\t\t\t// Execute the callback using the values in matches as its parameters.\n\t\t\t\t\t$val = call_user_func_array($val, $matches);\n\t\t\t\t}\n\t\t\t\t// Are we using the default routing method for back-references?\n\t\t\t\telseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t$val = preg_replace('#^'.$key.'$#', $val, $uri);\n\t\t\t\t}\n\n\t\t\t\t$this->_set_request(explode('/', $val));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If we got this far it means we didn't encounter a\n\t\t// matching route so we'll set the site default route\n\t\t$this->_set_request(array_values($this->uri->segments));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set class name\n\t *\n\t * @param\tstring\t$class\tClass name\n\t * @return\tvoid\n\t */\n\tpublic function set_class($class)\n\t{\n\t\t$this->class = str_replace(array('/', '.'), '', $class);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch the current class\n\t *\n\t * @deprecated\t3.0.0\tRead the 'class' property instead\n\t * @return\tstring\n\t */\n\tpublic function fetch_class()\n\t{\n\t\treturn $this->class;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set method name\n\t *\n\t * @param\tstring\t$method\tMethod name\n\t * @return\tvoid\n\t */\n\tpublic function set_method($method)\n\t{\n\t\t$this->method = $method;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch the current method\n\t *\n\t * @deprecated\t3.0.0\tRead the 'method' property instead\n\t * @return\tstring\n\t */\n\tpublic function fetch_method()\n\t{\n\t\treturn $this->method;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set directory name\n\t *\n\t * @param\tstring\t$dir\tDirectory name\n\t * @param\tbool\t$append\tWhether we're appending rather than setting the full value\n\t * @return\tvoid\n\t */\n\tpublic function set_directory($dir, $append = FALSE)\n\t{\n\t\tif ($append !== TRUE OR empty($this->directory))\n\t\t{\n\t\t\t$this->directory = str_replace('.', '', trim($dir, '/')).'/';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->directory .= str_replace('.', '', trim($dir, '/')).'/';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch directory\n\t *\n\t * Feches the sub-directory (if any) that contains the requested\n\t * controller class.\n\t *\n\t * @deprecated\t3.0.0\tRead the 'directory' property instead\n\t * @return\tstring\n\t */\n\tpublic function fetch_directory()\n\t{\n\t\treturn $this->directory;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Security.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Security Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSecurity\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/security.html\n */\nclass CI_Security {\n\n\t/**\n\t * List of sanitize filename strings\n\t *\n\t * @var\tarray\n\t */\n\tpublic $filename_bad_chars =\tarray(\n\t\t'../', '<!--', '-->', '<', '>',\n\t\t\"'\", '\"', '&', '$', '#',\n\t\t'{', '}', '[', ']', '=',\n\t\t';', '?', '%20', '%22',\n\t\t'%3c',\t\t// <\n\t\t'%253c',\t// <\n\t\t'%3e',\t\t// >\n\t\t'%0e',\t\t// >\n\t\t'%28',\t\t// (\n\t\t'%29',\t\t// )\n\t\t'%2528',\t// (\n\t\t'%26',\t\t// &\n\t\t'%24',\t\t// $\n\t\t'%3f',\t\t// ?\n\t\t'%3b',\t\t// ;\n\t\t'%3d'\t\t// =\n\t);\n\n\t/**\n\t * Character set\n\t *\n\t * Will be overridden by the constructor.\n\t *\n\t * @var\tstring\n\t */\n\tpublic $charset = 'UTF-8';\n\n\t/**\n\t * XSS Hash\n\t *\n\t * Random Hash for protecting URLs.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_xss_hash;\n\n\t/**\n\t * CSRF Hash\n\t *\n\t * Random hash for Cross Site Request Forgery protection cookie\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_csrf_hash;\n\n\t/**\n\t * CSRF Expire time\n\t *\n\t * Expiration time for Cross Site Request Forgery protection cookie.\n\t * Defaults to two hours (in seconds).\n\t *\n\t * @var\tint\n\t */\n\tprotected $_csrf_expire =\t7200;\n\n\t/**\n\t * CSRF Token name\n\t *\n\t * Token name for Cross Site Request Forgery protection cookie.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_csrf_token_name =\t'ci_csrf_token';\n\n\t/**\n\t * CSRF Cookie name\n\t *\n\t * Cookie name for Cross Site Request Forgery protection cookie.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_csrf_cookie_name =\t'ci_csrf_token';\n\n\t/**\n\t * List of never allowed strings\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_never_allowed_str =\tarray(\n\t\t'document.cookie' => '[removed]',\n\t\t'(document).cookie' => '[removed]',\n\t\t'document.write'  => '[removed]',\n\t\t'(document).write'  => '[removed]',\n\t\t'.parentNode'     => '[removed]',\n\t\t'.innerHTML'      => '[removed]',\n\t\t'-moz-binding'    => '[removed]',\n\t\t'<!--'            => '&lt;!--',\n\t\t'-->'             => '--&gt;',\n\t\t'<![CDATA['       => '&lt;![CDATA[',\n\t\t'<comment>'\t  => '&lt;comment&gt;',\n\t\t'<%'              => '&lt;&#37;'\n\t);\n\n\t/**\n\t * List of never allowed regex replacements\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_never_allowed_regex = array(\n\t\t'javascript\\s*:',\n\t\t'(\\(?document\\)?|\\(?window\\)?(\\.document)?)\\.(location|on\\w*)',\n\t\t'expression\\s*(\\(|&\\#40;)', // CSS and IE\n\t\t'vbscript\\s*:', // IE, surprise!\n\t\t'wscript\\s*:', // IE\n\t\t'jscript\\s*:', // IE\n\t\t'vbs\\s*:', // IE\n\t\t'Redirect\\s+30\\d',\n\t\t\"([\\\"'])?data\\s*:[^\\\\1]*?base64[^\\\\1]*?,[^\\\\1]*?\\\\1?\"\n\t);\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t// Is CSRF protection enabled?\n\t\tif (config_item('csrf_protection'))\n\t\t{\n\t\t\t// CSRF config\n\t\t\tforeach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key)\n\t\t\t{\n\t\t\t\tif (NULL !== ($val = config_item($key)))\n\t\t\t\t{\n\t\t\t\t\t$this->{'_'.$key} = $val;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Append application specific cookie prefix\n\t\t\tif ($cookie_prefix = config_item('cookie_prefix'))\n\t\t\t{\n\t\t\t\t$this->_csrf_cookie_name = $cookie_prefix.$this->_csrf_cookie_name;\n\t\t\t}\n\n\t\t\t// Set the CSRF hash\n\t\t\t$this->_csrf_set_hash();\n\t\t}\n\n\t\t$this->charset = strtoupper((string) config_item('charset'));\n\n\t\tlog_message('info', 'Security Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CSRF Verify\n\t *\n\t * @return\tCI_Security\n\t */\n\tpublic function csrf_verify()\n\t{\n\t\t// If it's not a POST request we will set the CSRF cookie\n\t\tif (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST')\n\t\t{\n\t\t\treturn $this->csrf_set_cookie();\n\t\t}\n\n\t\t// Check if URI has been whitelisted from CSRF checks\n\t\tif ($exclude_uris = config_item('csrf_exclude_uris'))\n\t\t{\n\t\t\t$uri = load_class('URI', 'core');\n\t\t\tforeach ($exclude_uris as $excluded)\n\t\t\t{\n\t\t\t\tif (preg_match('#^'.$excluded.'$#i'.(UTF8_ENABLED ? 'u' : ''), $uri->uri_string()))\n\t\t\t\t{\n\t\t\t\t\treturn $this;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate\n\t\t$valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name])\n\t\t\t&& is_string($_POST[$this->_csrf_token_name]) && is_string($_COOKIE[$this->_csrf_cookie_name])\n\t\t\t&& hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]);\n\n\t\t// We kill this since we're done and we don't want to pollute the _POST array\n\t\tunset($_POST[$this->_csrf_token_name]);\n\n\t\t// Regenerate on every submission?\n\t\tif (config_item('csrf_regenerate'))\n\t\t{\n\t\t\t// Nothing should last forever\n\t\t\tunset($_COOKIE[$this->_csrf_cookie_name]);\n\t\t\t$this->_csrf_hash = NULL;\n\t\t}\n\n\t\t$this->_csrf_set_hash();\n\t\t$this->csrf_set_cookie();\n\n\t\tif ($valid !== TRUE)\n\t\t{\n\t\t\t$this->csrf_show_error();\n\t\t}\n\n\t\tlog_message('info', 'CSRF token verified');\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CSRF Set Cookie\n\t *\n\t * @codeCoverageIgnore\n\t * @return\tCI_Security\n\t */\n\tpublic function csrf_set_cookie()\n\t{\n\t\t$expire = time() + $this->_csrf_expire;\n\t\t$secure_cookie = (bool) config_item('cookie_secure');\n\n\t\tif ($secure_cookie && ! is_https())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (is_php('7.3'))\n\t\t{\n\t\t\tsetcookie(\n\t\t\t\t$this->_csrf_cookie_name,\n\t\t\t\t$this->_csrf_hash,\n\t\t\t\tarray(\n\t\t\t\t\t'expires'  => $expire,\n\t\t\t\t\t'path'     => config_item('cookie_path'),\n\t\t\t\t\t'domain'   => config_item('cookie_domain'),\n\t\t\t\t\t'secure'   => $secure_cookie,\n\t\t\t\t\t'httponly' => config_item('cookie_httponly'),\n\t\t\t\t\t'samesite' => 'Strict'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$domain = trim(config_item('cookie_domain'));\n\t\t\theader('Set-Cookie: '.$this->_csrf_cookie_name.'='.$this->_csrf_hash\n\t\t\t\t\t.'; Expires='.gmdate('D, d-M-Y H:i:s T', $expire)\n\t\t\t\t\t.'; Max-Age='.$this->_csrf_expire\n\t\t\t\t\t.'; Path='.rawurlencode(config_item('cookie_path'))\n\t\t\t\t\t.($domain === '' ? '' : '; Domain='.$domain)\n\t\t\t\t\t.($secure_cookie ? '; Secure' : '')\n\t\t\t\t\t.(config_item('cookie_httponly') ? '; HttpOnly' : '')\n\t\t\t\t\t.'; SameSite=Strict'\n\t\t\t);\n\t\t}\n\n\t\tlog_message('info', 'CSRF cookie sent');\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show CSRF Error\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function csrf_show_error()\n\t{\n\t\tshow_error('The action you have requested is not allowed.', 403);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get CSRF Hash\n\t *\n\t * @see\t\tCI_Security::$_csrf_hash\n\t * @return \tstring\tCSRF hash\n\t */\n\tpublic function get_csrf_hash()\n\t{\n\t\treturn $this->_csrf_hash;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get CSRF Token Name\n\t *\n\t * @see\t\tCI_Security::$_csrf_token_name\n\t * @return\tstring\tCSRF token name\n\t */\n\tpublic function get_csrf_token_name()\n\t{\n\t\treturn $this->_csrf_token_name;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * XSS Clean\n\t *\n\t * Sanitizes data so that Cross Site Scripting Hacks can be\n\t * prevented.  This method does a fair amount of work but\n\t * it is extremely thorough, designed to prevent even the\n\t * most obscure XSS attempts.  Nothing is ever 100% foolproof,\n\t * of course, but I haven't been able to get anything passed\n\t * the filter.\n\t *\n\t * Note: Should only be used to deal with data upon submission.\n\t *\t It's not something that should be used for general\n\t *\t runtime processing.\n\t *\n\t * @link\thttp://channel.bitflux.ch/wiki/XSS_Prevention\n\t * \t\tBased in part on some code and ideas from Bitflux.\n\t *\n\t * @link\thttp://ha.ckers.org/xss.html\n\t * \t\tTo help develop this script I used this great list of\n\t *\t\tvulnerabilities along with a few other hacks I've\n\t *\t\tharvested from examining vulnerabilities in other programs.\n\t *\n\t * @param\tstring|string[]\t$str\t\tInput data\n\t * @param \tbool\t\t$is_image\tWhether the input is an image\n\t * @return\tstring\n\t */\n\tpublic function xss_clean($str, $is_image = FALSE)\n\t{\n\t\t// Is the string an array?\n\t\tif (is_array($str))\n\t\t{\n\t\t\tforeach ($str as $key => &$value)\n\t\t\t{\n\t\t\t\t$str[$key] = $this->xss_clean($value);\n\t\t\t}\n\n\t\t\treturn $str;\n\t\t}\n\n\t\t// Remove Invisible Characters\n\t\t$str = remove_invisible_characters($str);\n\n\t\t/*\n\t\t * URL Decode\n\t\t *\n\t\t * Just in case stuff like this is submitted:\n\t\t *\n\t\t * <a href=\"http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D\">Google</a>\n\t\t *\n\t\t * Note: Use rawurldecode() so it does not remove plus signs\n\t\t */\n\t\tif (stripos($str, '%') !== false)\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\t$oldstr = $str;\n\t\t\t\t$str = rawurldecode($str);\n\t\t\t\t$str = preg_replace_callback('#%(?:\\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str);\n\t\t\t}\n\t\t\twhile ($oldstr !== $str);\n\t\t\tunset($oldstr);\n\t\t}\n\n\t\t/*\n\t\t * Convert character entities to ASCII\n\t\t *\n\t\t * This permits our tests below to work reliably.\n\t\t * We only convert entities that are within tags since\n\t\t * these are the ones that will pose security problems.\n\t\t */\n\t\t$str = preg_replace_callback(\"/[^a-z0-9>]+[a-z0-9]+=([\\'\\\"]).*?\\\\1/si\", array($this, '_convert_attribute'), $str);\n\t\t$str = preg_replace_callback('/<\\w+.*/si', array($this, '_decode_entity'), $str);\n\n\t\t// Remove Invisible Characters Again!\n\t\t$str = remove_invisible_characters($str);\n\n\t\t/*\n\t\t * Convert all tabs to spaces\n\t\t *\n\t\t * This prevents strings like this: ja\tvascript\n\t\t * NOTE: we deal with spaces between characters later.\n\t\t * NOTE: preg_replace was found to be amazingly slow here on\n\t\t * large blocks of data, so we use str_replace.\n\t\t */\n\t\t$str = str_replace(\"\\t\", ' ', $str);\n\n\t\t// Capture converted string for later comparison\n\t\t$converted_string = $str;\n\n\t\t// Remove Strings that are never allowed\n\t\t$str = $this->_do_never_allowed($str);\n\n\t\t/*\n\t\t * Makes PHP tags safe\n\t\t *\n\t\t * Note: XML tags are inadvertently replaced too:\n\t\t *\n\t\t * <?xml\n\t\t *\n\t\t * But it doesn't seem to pose a problem.\n\t\t */\n\t\tif ($is_image === TRUE)\n\t\t{\n\t\t\t// Images have a tendency to have the PHP short opening and\n\t\t\t// closing tags every so often so we skip those and only\n\t\t\t// do the long opening tags.\n\t\t\t$str = preg_replace('/<\\?(php)/i', '&lt;?\\\\1', $str);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$str = str_replace(array('<?', '?'.'>'), array('&lt;?', '?&gt;'), $str);\n\t\t}\n\n\t\t/*\n\t\t * Compact any exploded words\n\t\t *\n\t\t * This corrects words like:  j a v a s c r i p t\n\t\t * These words are compacted back to their correct state.\n\t\t */\n\t\t$words = array(\n\t\t\t'javascript', 'expression', 'vbscript', 'jscript', 'wscript',\n\t\t\t'vbs', 'script', 'base64', 'applet', 'alert', 'document',\n\t\t\t'write', 'cookie', 'window', 'confirm', 'prompt', 'eval'\n\t\t);\n\n\t\tforeach ($words as $word)\n\t\t{\n\t\t\t$word = implode('\\s*', str_split($word)).'\\s*';\n\n\t\t\t// We only want to do this when it is followed by a non-word character\n\t\t\t// That way valid stuff like \"dealer to\" does not become \"dealerto\"\n\t\t\t$str = preg_replace_callback('#('.substr($word, 0, -3).')(\\W)#is', array($this, '_compact_exploded_words'), $str);\n\t\t}\n\n\t\t/*\n\t\t * Remove disallowed Javascript in links or img tags\n\t\t * We used to do some version comparisons and use of stripos(),\n\t\t * but it is dog slow compared to these simplified non-capturing\n\t\t * preg_match(), especially if the pattern exists in the string\n\t\t *\n\t\t * Note: It was reported that not only space characters, but all in\n\t\t * the following pattern can be parsed as separators between a tag name\n\t\t * and its attributes: [\\d\\s\"\\'`;,\\/\\=\\(\\x00\\x0B\\x09\\x0C]\n\t\t * ... however, remove_invisible_characters() above already strips the\n\t\t * hex-encoded ones, so we'll skip them below.\n\t\t */\n\t\tdo\n\t\t{\n\t\t\t$original = $str;\n\n\t\t\tif (preg_match('/<a/i', $str))\n\t\t\t{\n\t\t\t\t$str = preg_replace_callback('#<a(?:rea)?[^a-z0-9>]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str);\n\t\t\t}\n\n\t\t\tif (preg_match('/<img/i', $str))\n\t\t\t{\n\t\t\t\t$str = preg_replace_callback('#<img[^a-z0-9]+([^>]*?)(?:\\s?/?>|$)#si', array($this, '_js_img_removal'), $str);\n\t\t\t}\n\n\t\t\tif (preg_match('/script|xss/i', $str))\n\t\t\t{\n\t\t\t\t$str = preg_replace('#</*(?:script|xss).*?>#si', '[removed]', $str);\n\t\t\t}\n\t\t}\n\t\twhile ($original !== $str);\n\t\tunset($original);\n\n\t\t/*\n\t\t * Sanitize naughty HTML elements\n\t\t *\n\t\t * If a tag containing any of the words in the list\n\t\t * below is found, the tag gets converted to entities.\n\t\t *\n\t\t * So this: <blink>\n\t\t * Becomes: &lt;blink&gt;\n\t\t */\n\t\t$pattern = '#'\n\t\t\t.'<((?<slash>/*\\s*)((?<tagName>[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character\n\t\t\t.'[^\\s\\042\\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator\n\t\t\t// optional attributes\n\t\t\t.'(?<attributes>(?:[\\s\\042\\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons\n\t\t\t.'[^\\s\\042\\047>/=]+' // attribute characters\n\t\t\t// optional attribute-value\n\t\t\t\t.'(?:\\s*=' // attribute-value separator\n\t\t\t\t\t.'(?:[^\\s\\042\\047=><`]+|\\s*\\042[^\\042]*\\042|\\s*\\047[^\\047]*\\047|\\s*(?U:[^\\s\\042\\047=><`]*))' // single, double or non-quoted value\n\t\t\t\t.')?' // end optional attribute-value group\n\t\t\t.')*)' // end optional attributes group\n\t\t\t.'[^>]*)(?<closeTag>\\>)?#isS';\n\n\t\t// Note: It would be nice to optimize this for speed, BUT\n\t\t//       only matching the naughty elements here results in\n\t\t//       false positives and in turn - vulnerabilities!\n\t\tdo\n\t\t{\n\t\t\t$old_str = $str;\n\t\t\t$str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str);\n\t\t}\n\t\twhile ($old_str !== $str);\n\t\tunset($old_str);\n\n\t\t/*\n\t\t * Sanitize naughty scripting elements\n\t\t *\n\t\t * Similar to above, only instead of looking for\n\t\t * tags it looks for PHP and JavaScript commands\n\t\t * that are disallowed. Rather than removing the\n\t\t * code, it simply converts the parenthesis to entities\n\t\t * rendering the code un-executable.\n\t\t *\n\t\t * For example:\teval('some code')\n\t\t * Becomes:\teval&#40;'some code'&#41;\n\t\t */\n\t\t$str = preg_replace(\n\t\t\t'#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\\s*)\\((.*?)\\)#si',\n\t\t\t'\\\\1\\\\2&#40;\\\\3&#41;',\n\t\t\t$str\n\t\t);\n\n\t\t// Same thing, but for \"tag functions\" (e.g. eval`some code`)\n\t\t// See https://github.com/bcit-ci/CodeIgniter/issues/5420\n\t\t$str = preg_replace(\n\t\t\t'#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\\s*)`(.*?)`#si',\n\t\t\t'\\\\1\\\\2&#96;\\\\3&#96;',\n\t\t\t$str\n\t\t);\n\n\t\t// Final clean up\n\t\t// This adds a bit of extra precaution in case\n\t\t// something got through the above filters\n\t\t$str = $this->_do_never_allowed($str);\n\n\t\t/*\n\t\t * Images are Handled in a Special Way\n\t\t * - Essentially, we want to know that after all of the character\n\t\t * conversion is done whether any unwanted, likely XSS, code was found.\n\t\t * If not, we return TRUE, as the image is clean.\n\t\t * However, if the string post-conversion does not matched the\n\t\t * string post-removal of XSS, then it fails, as there was unwanted XSS\n\t\t * code found and removed/changed during processing.\n\t\t */\n\t\tif ($is_image === TRUE)\n\t\t{\n\t\t\treturn ($str === $converted_string);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * XSS Hash\n\t *\n\t * Generates the XSS hash if needed and returns it.\n\t *\n\t * @see\t\tCI_Security::$_xss_hash\n\t * @return\tstring\tXSS hash\n\t */\n\tpublic function xss_hash()\n\t{\n\t\tif ($this->_xss_hash === NULL)\n\t\t{\n\t\t\t$rand = $this->get_random_bytes(16);\n\t\t\t$this->_xss_hash = ($rand === FALSE)\n\t\t\t\t? md5(uniqid(mt_rand(), TRUE))\n\t\t\t\t: bin2hex($rand);\n\t\t}\n\n\t\treturn $this->_xss_hash;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get random bytes\n\t *\n\t * @param\tint\t$length\tOutput length\n\t * @return\tstring\n\t */\n\tpublic function get_random_bytes($length)\n\t{\n\t\tif (empty($length) OR ! ctype_digit((string) $length))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (function_exists('random_bytes'))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// The cast is required to avoid TypeError\n\t\t\t\treturn random_bytes((int) $length);\n\t\t\t}\n\t\t\tcatch (Exception $e)\n\t\t\t{\n\t\t\t\t// If random_bytes() can't do the job, we can't either ...\n\t\t\t\t// There's no point in using fallbacks.\n\t\t\t\tlog_message('error', $e->getMessage());\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t// Unfortunately, none of the following PRNGs is guaranteed to exist ...\n\t\tif (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE)\n\t\t{\n\t\t\treturn $output;\n\t\t}\n\n\t\tif (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE)\n\t\t{\n\t\t\t// Try not to waste entropy ...\n\t\t\tis_php('5.4') && stream_set_chunk_size($fp, $length);\n\t\t\t$output = fread($fp, $length);\n\t\t\tfclose($fp);\n\t\t\tif ($output !== FALSE)\n\t\t\t{\n\t\t\t\treturn $output;\n\t\t\t}\n\t\t}\n\n\t\tif (function_exists('openssl_random_pseudo_bytes'))\n\t\t{\n\t\t\treturn openssl_random_pseudo_bytes($length);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * HTML Entities Decode\n\t *\n\t * A replacement for html_entity_decode()\n\t *\n\t * The reason we are not using html_entity_decode() by itself is because\n\t * while it is not technically correct to leave out the semicolon\n\t * at the end of an entity most browsers will still interpret the entity\n\t * correctly. html_entity_decode() does not convert entities without\n\t * semicolons, so we are left with our own little solution here. Bummer.\n\t *\n\t * @link\thttp://php.net/html-entity-decode\n\t *\n\t * @param\tstring\t$str\t\tInput\n\t * @param\tstring\t$charset\tCharacter set\n\t * @return\tstring\n\t */\n\tpublic function entity_decode($str, $charset = NULL)\n\t{\n\t\tif (strpos($str, '&') === FALSE)\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\tstatic $_entities;\n\n\t\tisset($charset) OR $charset = $this->charset;\n\t\t$flag = is_php('5.4')\n\t\t\t? ENT_COMPAT | ENT_HTML5\n\t\t\t: ENT_COMPAT;\n\n\t\tif ( ! isset($_entities))\n\t\t{\n\t\t\t$_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset));\n\n\t\t\t// If we're not on PHP 5.4+, add the possibly dangerous HTML 5\n\t\t\t// entities to the array manually\n\t\t\tif ($flag === ENT_COMPAT)\n\t\t\t{\n\t\t\t\t$_entities[':'] = '&colon;';\n\t\t\t\t$_entities['('] = '&lpar;';\n\t\t\t\t$_entities[')'] = '&rpar;';\n\t\t\t\t$_entities[\"\\n\"] = '&NewLine;';\n\t\t\t\t$_entities[\"\\t\"] = '&Tab;';\n\t\t\t}\n\t\t}\n\n\t\tdo\n\t\t{\n\t\t\t$str_compare = $str;\n\n\t\t\t// Decode standard entities, avoiding false positives\n\t\t\tif (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches))\n\t\t\t{\n\t\t\t\t$replace = array();\n\t\t\t\t$matches = array_unique(array_map('strtolower', $matches[0]));\n\t\t\t\tforeach ($matches as &$match)\n\t\t\t\t{\n\t\t\t\t\tif (($char = array_search($match.';', $_entities, TRUE)) !== FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$replace[$match] = $char;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$str = str_replace(array_keys($replace), array_values($replace), $str);\n\t\t\t}\n\n\t\t\t// Decode numeric & UTF16 two byte entities\n\t\t\t$str = html_entity_decode(\n\t\t\t\tpreg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\\d{2,4}(?![0-9;]))))/iS', '$1;', $str),\n\t\t\t\t$flag,\n\t\t\t\t$charset\n\t\t\t);\n\n\t\t\tif ($flag === ENT_COMPAT)\n\t\t\t{\n\t\t\t\t$str = str_replace(array_values($_entities), array_keys($_entities), $str);\n\t\t\t}\n\t\t}\n\t\twhile ($str_compare !== $str);\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sanitize Filename\n\t *\n\t * @param\tstring\t$str\t\tInput file name\n\t * @param \tbool\t$relative_path\tWhether to preserve paths\n\t * @return\tstring\n\t */\n\tpublic function sanitize_filename($str, $relative_path = FALSE)\n\t{\n\t\t$bad = $this->filename_bad_chars;\n\n\t\tif ( ! $relative_path)\n\t\t{\n\t\t\t$bad[] = './';\n\t\t\t$bad[] = '/';\n\t\t}\n\n\t\t$str = remove_invisible_characters($str, FALSE);\n\n\t\tdo\n\t\t{\n\t\t\t$old = $str;\n\t\t\t$str = str_replace($bad, '', $str);\n\t\t}\n\t\twhile ($old !== $str);\n\n\t\treturn stripslashes($str);\n\t}\n\n\t// ----------------------------------------------------------------\n\n\t/**\n\t * Strip Image Tags\n\t *\n\t * @param\tstring\t$str\n\t * @return\tstring\n\t */\n\tpublic function strip_image_tags($str)\n\t{\n\t\treturn preg_replace(\n\t\t\tarray(\n\t\t\t\t'#<img[\\s/]+.*?src\\s*=\\s*([\"\\'])([^\\\\1]+?)\\\\1.*?\\>#i',\n\t\t\t\t'#<img[\\s/]+.*?src\\s*=\\s*?(([^\\s\"\\'=<>`]+)).*?\\>#i'\n\t\t\t),\n\t\t\t'\\\\2',\n\t\t\t$str\n\t\t);\n\t}\n\n\t// ----------------------------------------------------------------\n\n\t/**\n\t * URL-decode taking spaces into account\n\t *\n\t * @see\t\thttps://github.com/bcit-ci/CodeIgniter/issues/4877\n\t * @param\tarray\t$matches\n\t * @return\tstring\n\t */\n\tprotected function _urldecodespaces($matches)\n\t{\n\t\t$input    = $matches[0];\n\t\t$nospaces = preg_replace('#\\s+#', '', $input);\n\t\treturn ($nospaces === $input)\n\t\t\t? $input\n\t\t\t: rawurldecode($nospaces);\n\t}\n\n\t// ----------------------------------------------------------------\n\n\t/**\n\t * Compact Exploded Words\n\t *\n\t * Callback method for xss_clean() to remove whitespace from\n\t * things like 'j a v a s c r i p t'.\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param\tarray\t$matches\n\t * @return\tstring\n\t */\n\tprotected function _compact_exploded_words($matches)\n\t{\n\t\treturn preg_replace('/\\s+/s', '', $matches[1]).$matches[2];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sanitize Naughty HTML\n\t *\n\t * Callback method for xss_clean() to remove naughty HTML elements.\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param\tarray\t$matches\n\t * @return\tstring\n\t */\n\tprotected function _sanitize_naughty_html($matches)\n\t{\n\t\tstatic $naughty_tags    = array(\n\t\t\t'alert', 'area', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound',\n\t\t\t'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer',\n\t\t\t'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object',\n\t\t\t'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss'\n\t\t);\n\n\t\tstatic $evil_attributes = array(\n\t\t\t'on\\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime'\n\t\t);\n\n\t\t// First, escape unclosed tags\n\t\tif (empty($matches['closeTag']))\n\t\t{\n\t\t\treturn '&lt;'.$matches[1];\n\t\t}\n\t\t// Is the element that we caught naughty? If so, escape it\n\t\telseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE))\n\t\t{\n\t\t\treturn '&lt;'.$matches[1].'&gt;';\n\t\t}\n\t\t// For other tags, see if their attributes are \"evil\" and strip those\n\t\telseif (isset($matches['attributes']))\n\t\t{\n\t\t\t// We'll store the already filtered attributes here\n\t\t\t$attributes = array();\n\n\t\t\t// Attribute-catching pattern\n\t\t\t$attributes_pattern = '#'\n\t\t\t\t.'(?<name>[^\\s\\042\\047>/=]+)' // attribute characters\n\t\t\t\t// optional attribute-value\n\t\t\t\t.'(?:\\s*=(?<value>[^\\s\\042\\047=><`]+|\\s*\\042[^\\042]*\\042|\\s*\\047[^\\047]*\\047|\\s*(?U:[^\\s\\042\\047=><`]*)))' // attribute-value separator\n\t\t\t\t.'#i';\n\n\t\t\t// Blacklist pattern for evil attribute names\n\t\t\t$is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i';\n\n\t\t\t// Each iteration filters a single attribute\n\t\t\tdo\n\t\t\t{\n\t\t\t\t// Strip any non-alpha characters that may precede an attribute.\n\t\t\t\t// Browsers often parse these incorrectly and that has been a\n\t\t\t\t// of numerous XSS issues we've had.\n\t\t\t\t$matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']);\n\n\t\t\t\tif ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE))\n\t\t\t\t{\n\t\t\t\t\t// No (valid) attribute found? Discard everything else inside the tag\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// Is it indeed an \"evil\" attribute?\n\t\t\t\t\tpreg_match($is_evil_pattern, $attribute['name'][0])\n\t\t\t\t\t// Or does it have an equals sign, but no value and not quoted? Strip that too!\n\t\t\t\t\tOR (trim($attribute['value'][0]) === '')\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t$attributes[] = 'xss=removed';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$attributes[] = $attribute[0][0];\n\t\t\t\t}\n\n\t\t\t\t$matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0]));\n\t\t\t}\n\t\t\twhile ($matches['attributes'] !== '');\n\n\t\t\t$attributes = empty($attributes)\n\t\t\t\t? ''\n\t\t\t\t: ' '.implode(' ', $attributes);\n\t\t\treturn '<'.$matches['slash'].$matches['tagName'].$attributes.'>';\n\t\t}\n\n\t\treturn $matches[0];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * JS Link Removal\n\t *\n\t * Callback method for xss_clean() to sanitize links.\n\t *\n\t * This limits the PCRE backtracks, making it more performance friendly\n\t * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in\n\t * PHP 5.2+ on link-heavy strings.\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param\tarray\t$match\n\t * @return\tstring\n\t */\n\tprotected function _js_link_removal($match)\n\t{\n\t\treturn str_replace(\n\t\t\t$match[1],\n\t\t\tpreg_replace(\n\t\t\t\t'#href=.*?(?:(?:alert|prompt|confirm)(?:\\(|&\\#40;|`|&\\#96;)|javascript:|livescript:|mocha:|charset=|window\\.|\\(?document\\)?\\.|\\.cookie|<script|<xss|d\\s*a\\s*t\\s*a\\s*:)#si',\n\t\t\t\t'',\n\t\t\t\t$this->_filter_attributes($match[1])\n\t\t\t),\n\t\t\t$match[0]\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * JS Image Removal\n\t *\n\t * Callback method for xss_clean() to sanitize image tags.\n\t *\n\t * This limits the PCRE backtracks, making it more performance friendly\n\t * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in\n\t * PHP 5.2+ on image tag heavy strings.\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param\tarray\t$match\n\t * @return\tstring\n\t */\n\tprotected function _js_img_removal($match)\n\t{\n\t\treturn str_replace(\n\t\t\t$match[1],\n\t\t\tpreg_replace(\n\t\t\t\t'#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\\(|&\\#40;|`|&\\#96;)|javascript:|livescript:|mocha:|charset=|window\\.|\\(?document\\)?\\.|\\.cookie|<script|<xss|base64\\s*,)#si',\n\t\t\t\t'',\n\t\t\t\t$this->_filter_attributes($match[1])\n\t\t\t),\n\t\t\t$match[0]\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Attribute Conversion\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param\tarray\t$match\n\t * @return\tstring\n\t */\n\tprotected function _convert_attribute($match)\n\t{\n\t\treturn str_replace(array('>', '<', '\\\\'), array('&gt;', '&lt;', '\\\\\\\\'), $match[0]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Filter Attributes\n\t *\n\t * Filters tag attributes for consistency and safety.\n\t *\n\t * @used-by\tCI_Security::_js_img_removal()\n\t * @used-by\tCI_Security::_js_link_removal()\n\t * @param\tstring\t$str\n\t * @return\tstring\n\t */\n\tprotected function _filter_attributes($str)\n\t{\n\t\t$out = '';\n\t\tif (preg_match_all('#\\s*[a-z\\-]+\\s*=\\s*(\\042|\\047)([^\\\\1]*?)\\\\1#is', $str, $matches))\n\t\t{\n\t\t\tforeach ($matches[0] as $match)\n\t\t\t{\n\t\t\t\t$out .= preg_replace('#/\\*.*?\\*/#s', '', $match);\n\t\t\t}\n\t\t}\n\n\t\treturn $out;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * HTML Entity Decode Callback\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param\tarray\t$match\n\t * @return\tstring\n\t */\n\tprotected function _decode_entity($match)\n\t{\n\t\t// Protect GET variables in URLs\n\t\t// 901119URL5918AMP18930PROTECT8198\n\t\t$match = preg_replace('|\\&([a-z\\_0-9\\-]+)\\=([a-z\\_0-9\\-/]+)|i', $this->xss_hash().'\\\\1=\\\\2', $match[0]);\n\n\t\t// Decode, then un-protect URL GET vars\n\t\treturn str_replace(\n\t\t\t$this->xss_hash(),\n\t\t\t'&',\n\t\t\t$this->entity_decode($match, $this->charset)\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Do Never Allowed\n\t *\n\t * @used-by\tCI_Security::xss_clean()\n\t * @param \tstring\n\t * @return \tstring\n\t */\n\tprotected function _do_never_allowed($str)\n\t{\n\t\t$str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str);\n\n\t\tforeach ($this->_never_allowed_regex as $regex)\n\t\t{\n\t\t\t$str = preg_replace('#'.$regex.'#is', '[removed]', $str);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set CSRF Hash and Cookie\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _csrf_set_hash()\n\t{\n\t\tif ($this->_csrf_hash === NULL)\n\t\t{\n\t\t\t// If the cookie exists we will use its value.\n\t\t\t// We don't necessarily want to regenerate it with\n\t\t\t// each page load since a page could contain embedded\n\t\t\t// sub-pages causing this feature to fail\n\t\t\tif (isset($_COOKIE[$this->_csrf_cookie_name]) && is_string($_COOKIE[$this->_csrf_cookie_name])\n\t\t\t\t&& preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1)\n\t\t\t{\n\t\t\t\treturn $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name];\n\t\t\t}\n\n\t\t\t$rand = $this->get_random_bytes(16);\n\t\t\t$this->_csrf_hash = ($rand === FALSE)\n\t\t\t\t? md5(uniqid(mt_rand(), TRUE))\n\t\t\t\t: bin2hex($rand);\n\t\t}\n\n\t\treturn $this->_csrf_hash;\n\t}\n\n}\n"
  },
  {
    "path": "system/core/URI.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * URI Class\n *\n * Parses URIs and determines routing\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tURI\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/uri.html\n */\nclass CI_URI {\n\n\t/**\n\t * List of cached URI segments\n\t *\n\t * @var\tarray\n\t */\n\tpublic $keyval = array();\n\n\t/**\n\t * Current URI string\n\t *\n\t * @var\tstring\n\t */\n\tpublic $uri_string = '';\n\n\t/**\n\t * List of URI segments\n\t *\n\t * Starts at 1 instead of 0.\n\t *\n\t * @var\tarray\n\t */\n\tpublic $segments = array();\n\n\t/**\n\t * List of routed URI segments\n\t *\n\t * Starts at 1 instead of 0.\n\t *\n\t * @var\tarray\n\t */\n\tpublic $rsegments = array();\n\n\t/**\n\t * Permitted URI chars\n\t *\n\t * PCRE character group allowed in URI segments\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_permitted_uri_chars;\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->config =& load_class('Config', 'core');\n\n\t\t// If query strings are enabled, we don't need to parse any segments.\n\t\t// However, they don't make sense under CLI.\n\t\tif (is_cli() OR $this->config->item('enable_query_strings') !== TRUE)\n\t\t{\n\t\t\t$this->_permitted_uri_chars = $this->config->item('permitted_uri_chars');\n\n\t\t\t// If it's a CLI request, ignore the configuration\n\t\t\tif (is_cli())\n\t\t\t{\n\t\t\t\t$uri = $this->_parse_argv();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$protocol = $this->config->item('uri_protocol');\n\t\t\t\tempty($protocol) && $protocol = 'REQUEST_URI';\n\n\t\t\t\tswitch ($protocol)\n\t\t\t\t{\n\t\t\t\t\tcase 'AUTO': // For BC purposes only\n\t\t\t\t\tcase 'REQUEST_URI':\n\t\t\t\t\t\t$uri = $this->_parse_request_uri();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'QUERY_STRING':\n\t\t\t\t\t\t$uri = $this->_parse_query_string();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'PATH_INFO':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$uri = isset($_SERVER[$protocol])\n\t\t\t\t\t\t\t? $_SERVER[$protocol]\n\t\t\t\t\t\t\t: $this->_parse_request_uri();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->_set_uri_string($uri);\n\t\t}\n\n\t\tlog_message('info', 'URI Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set URI String\n\t *\n\t * @param \tstring\t$str\n\t * @return\tvoid\n\t */\n\tprotected function _set_uri_string($str)\n\t{\n\t\t// Filter out control characters and trim slashes\n\t\t$this->uri_string = trim(remove_invisible_characters($str, FALSE), '/');\n\n\t\tif ($this->uri_string !== '')\n\t\t{\n\t\t\t// Remove the URL suffix, if present\n\t\t\tif (($suffix = (string) $this->config->item('url_suffix')) !== '')\n\t\t\t{\n\t\t\t\t$slen = strlen($suffix);\n\n\t\t\t\tif (substr($this->uri_string, -$slen) === $suffix)\n\t\t\t\t{\n\t\t\t\t\t$this->uri_string = substr($this->uri_string, 0, -$slen);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->segments[0] = NULL;\n\t\t\t// Populate the segments array\n\t\t\tforeach (explode('/', trim($this->uri_string, '/')) as $val)\n\t\t\t{\n\t\t\t\t$val = trim($val);\n\t\t\t\t// Filter segments for security\n\t\t\t\t$this->filter_uri($val);\n\n\t\t\t\tif ($val !== '')\n\t\t\t\t{\n\t\t\t\t\t$this->segments[] = $val;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tunset($this->segments[0]);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse REQUEST_URI\n\t *\n\t * Will parse REQUEST_URI and automatically detect the URI from it,\n\t * while fixing the query string if necessary.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _parse_request_uri()\n\t{\n\t\tif ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\t// parse_url() returns false if no host is present, but the path or query string\n\t\t// contains a colon followed by a number\n\t\t$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);\n\t\t$query = isset($uri['query']) ? $uri['query'] : '';\n\t\t$uri = isset($uri['path']) ? $uri['path'] : '';\n\n\t\tif (isset($_SERVER['SCRIPT_NAME'][0]))\n\t\t{\n\t\t\tif (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)\n\t\t\t{\n\t\t\t\t$uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME']));\n\t\t\t}\n\t\t\telseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)\n\t\t\t{\n\t\t\t\t$uri = (string) substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));\n\t\t\t}\n\t\t}\n\n\t\t// This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct\n\t\t// URI is found, and also fixes the QUERY_STRING server var and $_GET array.\n\t\tif (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0)\n\t\t{\n\t\t\t$query = explode('?', $query, 2);\n\t\t\t$uri = $query[0];\n\t\t\t$_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : '';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$_SERVER['QUERY_STRING'] = $query;\n\t\t}\n\n\t\tparse_str($_SERVER['QUERY_STRING'], $_GET);\n\n\t\tif ($uri === '/' OR $uri === '')\n\t\t{\n\t\t\treturn '/';\n\t\t}\n\n\t\t// Do some final cleaning of the URI and return it\n\t\treturn $this->_remove_relative_directory($uri);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse QUERY_STRING\n\t *\n\t * Will parse QUERY_STRING and automatically detect the URI from it.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _parse_query_string()\n\t{\n\t\t$uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');\n\n\t\tif (trim($uri, '/') === '')\n\t\t{\n\t\t\treturn '';\n\t\t}\n\t\telseif (strncmp($uri, '/', 1) === 0)\n\t\t{\n\t\t\t$uri = explode('?', $uri, 2);\n\t\t\t$_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : '';\n\t\t\t$uri = $uri[0];\n\t\t}\n\n\t\tparse_str($_SERVER['QUERY_STRING'], $_GET);\n\n\t\treturn $this->_remove_relative_directory($uri);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse CLI arguments\n\t *\n\t * Take each command line argument and assume it is a URI segment.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _parse_argv()\n\t{\n\t\t$args = array_slice($_SERVER['argv'], 1);\n\t\treturn $args ? implode('/', $args) : '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Remove relative directory (../) and multi slashes (///)\n\t *\n\t * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri()\n\t *\n\t * @param\tstring\t$uri\n\t * @return\tstring\n\t */\n\tprotected function _remove_relative_directory($uri)\n\t{\n\t\t$uris = array();\n\t\t$tok = strtok($uri, '/');\n\t\twhile ($tok !== FALSE)\n\t\t{\n\t\t\tif (( ! empty($tok) OR $tok === '0') && $tok !== '..')\n\t\t\t{\n\t\t\t\t$uris[] = $tok;\n\t\t\t}\n\t\t\t$tok = strtok('/');\n\t\t}\n\n\t\treturn implode('/', $uris);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Filter URI\n\t *\n\t * Filters segments for malicious characters.\n\t *\n\t * @param\tstring\t$str\n\t * @return\tvoid\n\t */\n\tpublic function filter_uri(&$str)\n\t{\n\t\tif ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str))\n\t\t{\n\t\t\tshow_error('The URI you submitted has disallowed characters.', 400);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch URI Segment\n\t *\n\t * @see\t\tCI_URI::$segments\n\t * @param\tint\t\t$n\t\tIndex\n\t * @param\tmixed\t\t$no_result\tWhat to return if the segment index is not found\n\t * @return\tmixed\n\t */\n\tpublic function segment($n, $no_result = NULL)\n\t{\n\t\treturn isset($this->segments[$n]) ? $this->segments[$n] : $no_result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch URI \"routed\" Segment\n\t *\n\t * Returns the re-routed URI segment (assuming routing rules are used)\n\t * based on the index provided. If there is no routing, will return\n\t * the same result as CI_URI::segment().\n\t *\n\t * @see\t\tCI_URI::$rsegments\n\t * @see\t\tCI_URI::segment()\n\t * @param\tint\t\t$n\t\tIndex\n\t * @param\tmixed\t\t$no_result\tWhat to return if the segment index is not found\n\t * @return\tmixed\n\t */\n\tpublic function rsegment($n, $no_result = NULL)\n\t{\n\t\treturn isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * URI to assoc\n\t *\n\t * Generates an associative array of URI data starting at the supplied\n\t * segment index. For example, if this is your URI:\n\t *\n\t *\texample.com/user/search/name/joe/location/UK/gender/male\n\t *\n\t * You can use this method to generate an array with this prototype:\n\t *\n\t *\tarray (\n\t *\t\tname => joe\n\t *\t\tlocation => UK\n\t *\t\tgender => male\n\t *\t )\n\t *\n\t * @param\tint\t$n\t\tIndex (default: 3)\n\t * @param\tarray\t$default\tDefault values\n\t * @return\tarray\n\t */\n\tpublic function uri_to_assoc($n = 3, $default = array())\n\t{\n\t\treturn $this->_uri_to_assoc($n, $default, 'segment');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Routed URI to assoc\n\t *\n\t * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed\n\t * segment array.\n\t *\n\t * @see\t\tCI_URI::uri_to_assoc()\n\t * @param \tint\t$n\t\tIndex (default: 3)\n\t * @param \tarray\t$default\tDefault values\n\t * @return \tarray\n\t */\n\tpublic function ruri_to_assoc($n = 3, $default = array())\n\t{\n\t\treturn $this->_uri_to_assoc($n, $default, 'rsegment');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal URI-to-assoc\n\t *\n\t * Generates a key/value pair from the URI string or re-routed URI string.\n\t *\n\t * @used-by\tCI_URI::uri_to_assoc()\n\t * @used-by\tCI_URI::ruri_to_assoc()\n\t * @param\tint\t$n\t\tIndex (default: 3)\n\t * @param\tarray\t$default\tDefault values\n\t * @param\tstring\t$which\t\tArray name ('segment' or 'rsegment')\n\t * @return\tarray\n\t */\n\tprotected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')\n\t{\n\t\tif ( ! is_numeric($n))\n\t\t{\n\t\t\treturn $default;\n\t\t}\n\n\t\tif (isset($this->keyval[$which], $this->keyval[$which][$n]))\n\t\t{\n\t\t\treturn $this->keyval[$which][$n];\n\t\t}\n\n\t\t$total_segments = \"total_{$which}s\";\n\t\t$segment_array = \"{$which}_array\";\n\n\t\tif ($this->$total_segments() < $n)\n\t\t{\n\t\t\treturn (count($default) === 0)\n\t\t\t\t? array()\n\t\t\t\t: array_fill_keys($default, NULL);\n\t\t}\n\n\t\t$segments = array_slice($this->$segment_array(), ($n - 1));\n\t\t$i = 0;\n\t\t$lastval = '';\n\t\t$retval = array();\n\t\tforeach ($segments as $seg)\n\t\t{\n\t\t\tif ($i % 2)\n\t\t\t{\n\t\t\t\t$retval[$lastval] = $seg;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$retval[$seg] = NULL;\n\t\t\t\t$lastval = $seg;\n\t\t\t}\n\n\t\t\t$i++;\n\t\t}\n\n\t\tif (count($default) > 0)\n\t\t{\n\t\t\tforeach ($default as $val)\n\t\t\t{\n\t\t\t\tif ( ! array_key_exists($val, $retval))\n\t\t\t\t{\n\t\t\t\t\t$retval[$val] = NULL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Cache the array for reuse\n\t\tisset($this->keyval[$which]) OR $this->keyval[$which] = array();\n\t\t$this->keyval[$which][$n] = $retval;\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Assoc to URI\n\t *\n\t * Generates a URI string from an associative array.\n\t *\n\t * @param\tarray\t$array\tInput array of key/value pairs\n\t * @return\tstring\tURI string\n\t */\n\tpublic function assoc_to_uri($array)\n\t{\n\t\t$temp = array();\n\t\tforeach ((array) $array as $key => $val)\n\t\t{\n\t\t\t$temp[] = $key;\n\t\t\t$temp[] = $val;\n\t\t}\n\n\t\treturn implode('/', $temp);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slash segment\n\t *\n\t * Fetches an URI segment with a slash.\n\t *\n\t * @param\tint\t$n\tIndex\n\t * @param\tstring\t$where\tWhere to add the slash ('trailing' or 'leading')\n\t * @return\tstring\n\t */\n\tpublic function slash_segment($n, $where = 'trailing')\n\t{\n\t\treturn $this->_slash_segment($n, $where, 'segment');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slash routed segment\n\t *\n\t * Fetches an URI routed segment with a slash.\n\t *\n\t * @param\tint\t$n\tIndex\n\t * @param\tstring\t$where\tWhere to add the slash ('trailing' or 'leading')\n\t * @return\tstring\n\t */\n\tpublic function slash_rsegment($n, $where = 'trailing')\n\t{\n\t\treturn $this->_slash_segment($n, $where, 'rsegment');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal Slash segment\n\t *\n\t * Fetches an URI Segment and adds a slash to it.\n\t *\n\t * @used-by\tCI_URI::slash_segment()\n\t * @used-by\tCI_URI::slash_rsegment()\n\t *\n\t * @param\tint\t$n\tIndex\n\t * @param\tstring\t$where\tWhere to add the slash ('trailing' or 'leading')\n\t * @param\tstring\t$which\tArray name ('segment' or 'rsegment')\n\t * @return\tstring\n\t */\n\tprotected function _slash_segment($n, $where = 'trailing', $which = 'segment')\n\t{\n\t\t$leading = $trailing = '/';\n\n\t\tif ($where === 'trailing')\n\t\t{\n\t\t\t$leading\t= '';\n\t\t}\n\t\telseif ($where === 'leading')\n\t\t{\n\t\t\t$trailing\t= '';\n\t\t}\n\n\t\treturn $leading.$this->$which($n).$trailing;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Segment Array\n\t *\n\t * @return\tarray\tCI_URI::$segments\n\t */\n\tpublic function segment_array()\n\t{\n\t\treturn $this->segments;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Routed Segment Array\n\t *\n\t * @return\tarray\tCI_URI::$rsegments\n\t */\n\tpublic function rsegment_array()\n\t{\n\t\treturn $this->rsegments;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Total number of segments\n\t *\n\t * @return\tint\n\t */\n\tpublic function total_segments()\n\t{\n\t\treturn count($this->segments);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Total number of routed segments\n\t *\n\t * @return\tint\n\t */\n\tpublic function total_rsegments()\n\t{\n\t\treturn count($this->rsegments);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch URI string\n\t *\n\t * @return\tstring\tCI_URI::$uri_string\n\t */\n\tpublic function uri_string()\n\t{\n\t\treturn $this->uri_string;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Re-routed URI string\n\t *\n\t * @return\tstring\n\t */\n\tpublic function ruri_string()\n\t{\n\t\treturn ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments);\n\t}\n\n}\n"
  },
  {
    "path": "system/core/Utf8.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Utf8 Class\n *\n * Provides support for UTF-8 environments\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tUTF-8\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/utf8.html\n */\nclass CI_Utf8 {\n\n\t/**\n\t * Class constructor\n\t *\n\t * Determines if UTF-8 support is to be enabled.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tif (\n\t\t\tdefined('PREG_BAD_UTF8_ERROR')\t\t\t\t// PCRE must support UTF-8\n\t\t\t&& (ICONV_ENABLED === TRUE OR MB_ENABLED === TRUE)\t// iconv or mbstring must be installed\n\t\t\t&& strtoupper(config_item('charset')) === 'UTF-8'\t// Application charset must be UTF-8\n\t\t\t)\n\t\t{\n\t\t\tdefine('UTF8_ENABLED', TRUE);\n\t\t\tlog_message('debug', 'UTF-8 Support Enabled');\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdefine('UTF8_ENABLED', FALSE);\n\t\t\tlog_message('debug', 'UTF-8 Support Disabled');\n\t\t}\n\n\t\tlog_message('info', 'Utf8 Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clean UTF-8 strings\n\t *\n\t * Ensures strings contain only valid UTF-8 characters.\n\t *\n\t * @param\tstring\t$str\tString to clean\n\t * @return\tstring\n\t */\n\tpublic function clean_string($str)\n\t{\n\t\tif ($this->is_ascii($str) === FALSE)\n\t\t{\n\t\t\tif (MB_ENABLED)\n\t\t\t{\n\t\t\t\t$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');\n\t\t\t}\n\t\t\telseif (ICONV_ENABLED)\n\t\t\t{\n\t\t\t\t$str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);\n\t\t\t}\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Remove ASCII control characters\n\t *\n\t * Removes all ASCII control characters except horizontal tabs,\n\t * line feeds, and carriage returns, as all others can cause\n\t * problems in XML.\n\t *\n\t * @param\tstring\t$str\tString to clean\n\t * @return\tstring\n\t */\n\tpublic function safe_ascii_for_xml($str)\n\t{\n\t\treturn remove_invisible_characters($str, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Convert to UTF-8\n\t *\n\t * Attempts to convert a string to UTF-8.\n\t *\n\t * @param\tstring\t$str\t\tInput string\n\t * @param\tstring\t$encoding\tInput encoding\n\t * @return\tstring\t$str encoded in UTF-8 or FALSE on failure\n\t */\n\tpublic function convert_to_utf8($str, $encoding)\n\t{\n\t\tif (MB_ENABLED)\n\t\t{\n\t\t\treturn mb_convert_encoding($str, 'UTF-8', $encoding);\n\t\t}\n\t\telseif (ICONV_ENABLED)\n\t\t{\n\t\t\treturn @iconv($encoding, 'UTF-8', $str);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is ASCII?\n\t *\n\t * Tests if a string is standard 7-bit ASCII or not.\n\t *\n\t * @param\tstring\t$str\tString to check\n\t * @return\tbool\n\t */\n\tpublic function is_ascii($str)\n\t{\n\t\treturn (preg_match('/[^\\x00-\\x7F]/S', $str) === 0);\n\t}\n\n}\n"
  },
  {
    "path": "system/core/compat/hash.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PHP ext/hash compatibility package\n *\n * @package\t\tCodeIgniter\n * @subpackage\tCodeIgniter\n * @category\tCompatibility\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/\n * @link\t\thttps://secure.php.net/hash\n */\n\n// ------------------------------------------------------------------------\n\nif (is_php('5.6'))\n{\n\treturn;\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('hash_equals'))\n{\n\t/**\n\t * hash_equals()\n\t *\n\t * @link\thttp://php.net/hash_equals\n\t * @param\tstring\t$known_string\n\t * @param\tstring\t$user_string\n\t * @return\tbool\n\t */\n\tfunction hash_equals($known_string, $user_string)\n\t{\n\t\tif ( ! is_string($known_string))\n\t\t{\n\t\t\ttrigger_error('hash_equals(): Expected known_string to be a string, '.strtolower(gettype($known_string)).' given', E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ( ! is_string($user_string))\n\t\t{\n\t\t\ttrigger_error('hash_equals(): Expected user_string to be a string, '.strtolower(gettype($user_string)).' given', E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif (($length = strlen($known_string)) !== strlen($user_string))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$diff = 0;\n\t\tfor ($i = 0; $i < $length; $i++)\n\t\t{\n\t\t\t$diff |= ord($known_string[$i]) ^ ord($user_string[$i]);\n\t\t}\n\n\t\treturn ($diff === 0);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif (is_php('5.5'))\n{\n\treturn;\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('hash_pbkdf2'))\n{\n\t/**\n\t * hash_pbkdf2()\n\t *\n\t * @link\thttp://php.net/hash_pbkdf2\n\t * @param\tstring\t$algo\n\t * @param\tstring\t$password\n\t * @param\tstring\t$salt\n\t * @param\tint\t$iterations\n\t * @param\tint\t$length\n\t * @param\tbool\t$raw_output\n\t * @return\tstring\n\t */\n\tfunction hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE)\n\t{\n\t\tif ( ! in_array(strtolower($algo), hash_algos(), TRUE))\n\t\t{\n\t\t\ttrigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (($type = gettype($iterations)) !== 'integer')\n\t\t{\n\t\t\tif ($type === 'object' && method_exists($iterations, '__toString'))\n\t\t\t{\n\t\t\t\t$iterations = (string) $iterations;\n\t\t\t}\n\n\t\t\tif (is_string($iterations) && is_numeric($iterations))\n\t\t\t{\n\t\t\t\t$iterations = (int) $iterations;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttrigger_error('hash_pbkdf2() expects parameter 4 to be long, '.$type.' given', E_USER_WARNING);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\n\t\tif ($iterations < 1)\n\t\t{\n\t\t\ttrigger_error('hash_pbkdf2(): Iterations must be a positive integer: '.$iterations, E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (($type = gettype($length)) !== 'integer')\n\t\t{\n\t\t\tif ($type === 'object' && method_exists($length, '__toString'))\n\t\t\t{\n\t\t\t\t$length = (string) $length;\n\t\t\t}\n\n\t\t\tif (is_string($length) && is_numeric($length))\n\t\t\t{\n\t\t\t\t$length = (int) $length;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttrigger_error('hash_pbkdf2() expects parameter 5 to be long, '.$type.' given', E_USER_WARNING);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\n\t\tif ($length < 0)\n\t\t{\n\t\t\ttrigger_error('hash_pbkdf2(): Length must be greater than or equal to 0: '.$length, E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$hash_length = defined('MB_OVERLOAD_STRING')\n\t\t\t? mb_strlen(hash($algo, NULL, TRUE), '8bit')\n\t\t\t: strlen(hash($algo, NULL, TRUE));\n\t\tempty($length) && $length = $hash_length;\n\n\t\t// Pre-hash password inputs longer than the algorithm's block size\n\t\t// (i.e. prepare HMAC key) to mitigate potential DoS attacks.\n\t\tstatic $block_sizes;\n\t\tempty($block_sizes) && $block_sizes = array(\n\t\t\t'gost' => 32,\n\t\t\t'haval128,3' => 128,\n\t\t\t'haval160,3' => 128,\n\t\t\t'haval192,3' => 128,\n\t\t\t'haval224,3' => 128,\n\t\t\t'haval256,3' => 128,\n\t\t\t'haval128,4' => 128,\n\t\t\t'haval160,4' => 128,\n\t\t\t'haval192,4' => 128,\n\t\t\t'haval224,4' => 128,\n\t\t\t'haval256,4' => 128,\n\t\t\t'haval128,5' => 128,\n\t\t\t'haval160,5' => 128,\n\t\t\t'haval192,5' => 128,\n\t\t\t'haval224,5' => 128,\n\t\t\t'haval256,5' => 128,\n\t\t\t'md2' => 16,\n\t\t\t'md4' => 64,\n\t\t\t'md5' => 64,\n\t\t\t'ripemd128' => 64,\n\t\t\t'ripemd160' => 64,\n\t\t\t'ripemd256' => 64,\n\t\t\t'ripemd320' => 64,\n\t\t\t'salsa10' => 64,\n\t\t\t'salsa20' => 64,\n\t\t\t'sha1' => 64,\n\t\t\t'sha224' => 64,\n\t\t\t'sha256' => 64,\n\t\t\t'sha384' => 128,\n\t\t\t'sha512' => 128,\n\t\t\t'snefru' => 32,\n\t\t\t'snefru256' => 32,\n\t\t\t'tiger128,3' => 64,\n\t\t\t'tiger160,3' => 64,\n\t\t\t'tiger192,3' => 64,\n\t\t\t'tiger128,4' => 64,\n\t\t\t'tiger160,4' => 64,\n\t\t\t'tiger192,4' => 64,\n\t\t\t'whirlpool' => 64\n\t\t);\n\n\t\tif (isset($block_sizes[$algo], $password[$block_sizes[$algo]]))\n\t\t{\n\t\t\t$password = hash($algo, $password, TRUE);\n\t\t}\n\n\t\t$hash = '';\n\t\t// Note: Blocks are NOT 0-indexed\n\t\tfor ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++)\n\t\t{\n\t\t\t$key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE);\n\t\t\tfor ($i = 1; $i < $iterations; $i++)\n\t\t\t{\n\t\t\t\t$derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE);\n\t\t\t}\n\n\t\t\t$hash .= $derived_key;\n\t\t}\n\n\t\t// This is not RFC-compatible, but we're aiming for natural PHP compatibility\n\t\tif ( ! $raw_output)\n\t\t{\n\t\t\t$hash = bin2hex($hash);\n\t\t}\n\n\t\treturn defined('MB_OVERLOAD_STRING')\n\t\t\t? mb_substr($hash, 0, $length, '8bit')\n\t\t\t: substr($hash, 0, $length);\n\t}\n}\n"
  },
  {
    "path": "system/core/compat/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/core/compat/mbstring.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PHP ext/mbstring compatibility package\n *\n * @package\t\tCodeIgniter\n * @subpackage\tCodeIgniter\n * @category\tCompatibility\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/\n * @link\t\thttps://secure.php.net/mbstring\n */\n\n// ------------------------------------------------------------------------\n\nif (MB_ENABLED === TRUE)\n{\n\treturn;\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('mb_strlen'))\n{\n\t/**\n\t * mb_strlen()\n\t *\n\t * WARNING: This function WILL fall-back to strlen()\n\t * if iconv is not available!\n\t *\n\t * @link\thttp://php.net/mb_strlen\n\t * @param\tstring\t$str\n\t * @param\tstring\t$encoding\n\t * @return\tint\n\t */\n\tfunction mb_strlen($str, $encoding = NULL)\n\t{\n\t\tif (ICONV_ENABLED === TRUE)\n\t\t{\n\t\t\treturn iconv_strlen($str, isset($encoding) ? $encoding : config_item('charset'));\n\t\t}\n\n\t\tlog_message('debug', 'Compatibility (mbstring): iconv_strlen() is not available, falling back to strlen().');\n\t\treturn strlen($str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('mb_strpos'))\n{\n\t/**\n\t * mb_strpos()\n\t *\n\t * WARNING: This function WILL fall-back to strpos()\n\t * if iconv is not available!\n\t *\n\t * @link\thttp://php.net/mb_strpos\n\t * @param\tstring\t$haystack\n\t * @param\tstring\t$needle\n\t * @param\tint\t$offset\n\t * @param\tstring\t$encoding\n\t * @return\tmixed\n\t */\n\tfunction mb_strpos($haystack, $needle, $offset = 0, $encoding = NULL)\n\t{\n\t\tif (ICONV_ENABLED === TRUE)\n\t\t{\n\t\t\treturn iconv_strpos($haystack, $needle, $offset, isset($encoding) ? $encoding : config_item('charset'));\n\t\t}\n\n\t\tlog_message('debug', 'Compatibility (mbstring): iconv_strpos() is not available, falling back to strpos().');\n\t\treturn strpos($haystack, $needle, $offset);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('mb_substr'))\n{\n\t/**\n\t * mb_substr()\n\t *\n\t * WARNING: This function WILL fall-back to substr()\n\t * if iconv is not available.\n\t *\n\t * @link\thttp://php.net/mb_substr\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint \t$length\n\t * @param\tstring\t$encoding\n\t * @return\tstring\n\t */\n\tfunction mb_substr($str, $start, $length = NULL, $encoding = NULL)\n\t{\n\t\tif (ICONV_ENABLED === TRUE)\n\t\t{\n\t\t\tisset($encoding) OR $encoding = config_item('charset');\n\t\t\treturn iconv_substr(\n\t\t\t\t$str,\n\t\t\t\t$start,\n\t\t\t\tisset($length) ? $length : iconv_strlen($str, $encoding), // NULL doesn't work\n\t\t\t\t$encoding\n\t\t\t);\n\t\t}\n\n\t\tlog_message('debug', 'Compatibility (mbstring): iconv_substr() is not available, falling back to substr().');\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/core/compat/password.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PHP ext/standard/password compatibility package\n *\n * @package\t\tCodeIgniter\n * @subpackage\tCodeIgniter\n * @category\tCompatibility\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/\n * @link\t\thttps://secure.php.net/password\n */\n\n// ------------------------------------------------------------------------\n\nif (is_php('5.5') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION'))\n{\n\treturn;\n}\n\n// ------------------------------------------------------------------------\n\ndefined('PASSWORD_BCRYPT') OR define('PASSWORD_BCRYPT', 1);\ndefined('PASSWORD_DEFAULT') OR define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('password_get_info'))\n{\n\t/**\n\t * password_get_info()\n\t *\n\t * @link\thttp://php.net/password_get_info\n\t * @param\tstring\t$hash\n\t * @return\tarray\n\t */\n\tfunction password_get_info($hash)\n\t{\n\t\treturn (strlen($hash) < 60 OR sscanf($hash, '$2y$%d', $hash) !== 1)\n\t\t\t? array('algo' => 0, 'algoName' => 'unknown', 'options' => array())\n\t\t\t: array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash));\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('password_hash'))\n{\n\t/**\n\t * password_hash()\n\t *\n\t * @link\thttp://php.net/password_hash\n\t * @param\tstring\t$password\n\t * @param\tint\t$algo\n\t * @param\tarray\t$options\n\t * @return\tmixed\n\t */\n\tfunction password_hash($password, $algo, array $options = array())\n\t{\n\t\tstatic $func_overload;\n\t\tisset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));\n\n\t\tif ($algo !== 1)\n\t\t{\n\t\t\ttrigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING);\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31))\n\t\t{\n\t\t\ttrigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING);\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22)\n\t\t{\n\t\t\ttrigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING);\n\t\t\treturn NULL;\n\t\t}\n\t\telseif ( ! isset($options['salt']))\n\t\t{\n\t\t\tif (function_exists('random_bytes'))\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t$options['salt'] = random_bytes(16);\n\t\t\t\t}\n\t\t\t\tcatch (Exception $e)\n\t\t\t\t{\n\t\t\t\t\tlog_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage());\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (defined('MCRYPT_DEV_URANDOM'))\n\t\t\t{\n\t\t\t\t$options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);\n\t\t\t}\n\t\t\telseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom')))\n\t\t\t{\n\t\t\t\tif (($fp = fopen($dev, 'rb')) === FALSE)\n\t\t\t\t{\n\t\t\t\t\tlog_message('error', 'compat/password: Unable to open '.$dev.' for reading.');\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\t// Try not to waste entropy ...\n\t\t\t\tis_php('5.4') && stream_set_chunk_size($fp, 16);\n\n\t\t\t\t$options['salt'] = '';\n\t\t\t\tfor ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))\n\t\t\t\t{\n\t\t\t\t\tif (($read = fread($fp, 16 - $read)) === FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tlog_message('error', 'compat/password: Error while reading from '.$dev.'.');\n\t\t\t\t\t\treturn FALSE;\n\t\t\t\t\t}\n\t\t\t\t\t$options['salt'] .= $read;\n\t\t\t\t}\n\n\t\t\t\tfclose($fp);\n\t\t\t}\n\t\t\telseif (function_exists('openssl_random_pseudo_bytes'))\n\t\t\t{\n\t\t\t\t$is_secure = NULL;\n\t\t\t\t$options['salt'] = openssl_random_pseudo_bytes(16, $is_secure);\n\t\t\t\tif ($is_secure !== TRUE)\n\t\t\t\t{\n\t\t\t\t\tlog_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE');\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlog_message('error', 'compat/password: No CSPRNG available.');\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '='));\n\t\t}\n\t\telseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt']))\n\t\t{\n\t\t\t$options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '='));\n\t\t}\n\n\t\tisset($options['cost']) OR $options['cost'] = 10;\n\n\t\treturn (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60)\n\t\t\t? $password\n\t\t\t: FALSE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('password_needs_rehash'))\n{\n\t/**\n\t * password_needs_rehash()\n\t *\n\t * @link\thttp://php.net/password_needs_rehash\n\t * @param\tstring\t$hash\n\t * @param\tint\t$algo\n\t * @param\tarray\t$options\n\t * @return\tbool\n\t */\n\tfunction password_needs_rehash($hash, $algo, array $options = array())\n\t{\n\t\t$info = password_get_info($hash);\n\n\t\tif ($algo !== $info['algo'])\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif ($algo === 1)\n\t\t{\n\t\t\t$options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10;\n\t\t\treturn ($info['options']['cost'] !== $options['cost']);\n\t\t}\n\n\t\t// Odd at first glance, but according to a comment in PHP's own unit tests,\n\t\t// because it is an unknown algorithm - it's valid and therefore doesn't\n\t\t// need rehashing.\n\t\treturn FALSE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('password_verify'))\n{\n\t/**\n\t * password_verify()\n\t *\n\t * @link\thttp://php.net/password_verify\n\t * @param\tstring\t$password\n\t * @param\tstring\t$hash\n\t * @return\tbool\n\t */\n\tfunction password_verify($password, $hash)\n\t{\n\t\tif (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$compare = 0;\n\t\tfor ($i = 0; $i < 60; $i++)\n\t\t{\n\t\t\t$compare |= (ord($password[$i]) ^ ord($hash[$i]));\n\t\t}\n\n\t\treturn ($compare === 0);\n\t}\n}\n"
  },
  {
    "path": "system/core/compat/standard.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PHP ext/standard compatibility package\n *\n * @package\t\tCodeIgniter\n * @subpackage\tCodeIgniter\n * @category\tCompatibility\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/\n */\n\n// ------------------------------------------------------------------------\n\nif (is_php('5.5'))\n{\n\treturn;\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('array_column'))\n{\n\t/**\n\t * array_column()\n\t *\n\t * @link\thttp://php.net/array_column\n\t * @param\tarray\t$array\n\t * @param\tmixed\t$column_key\n\t * @param\tmixed\t$index_key\n\t * @return\tarray\n\t */\n\tfunction array_column(array $array, $column_key, $index_key = NULL)\n\t{\n\t\tif ( ! in_array($type = gettype($column_key), array('integer', 'string', 'NULL'), TRUE))\n\t\t{\n\t\t\tif ($type === 'double')\n\t\t\t{\n\t\t\t\t$column_key = (int) $column_key;\n\t\t\t}\n\t\t\telseif ($type === 'object' && method_exists($column_key, '__toString'))\n\t\t\t{\n\t\t\t\t$column_key = (string) $column_key;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttrigger_error('array_column(): The column key should be either a string or an integer', E_USER_WARNING);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! in_array($type = gettype($index_key), array('integer', 'string', 'NULL'), TRUE))\n\t\t{\n\t\t\tif ($type === 'double')\n\t\t\t{\n\t\t\t\t$index_key = (int) $index_key;\n\t\t\t}\n\t\t\telseif ($type === 'object' && method_exists($index_key, '__toString'))\n\t\t\t{\n\t\t\t\t$index_key = (string) $index_key;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttrigger_error('array_column(): The index key should be either a string or an integer', E_USER_WARNING);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t$result = array();\n\t\tforeach ($array as &$a)\n\t\t{\n\t\t\tif ($column_key === NULL)\n\t\t\t{\n\t\t\t\t$value = $a;\n\t\t\t}\n\t\t\telseif (is_array($a) && array_key_exists($column_key, $a))\n\t\t\t{\n\t\t\t\t$value = $a[$column_key];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ($index_key === NULL OR ! array_key_exists($index_key, $a))\n\t\t\t{\n\t\t\t\t$result[] = $value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$result[$a[$index_key]] = $value;\n\t\t\t}\n\t\t}\n\n\t\treturn $result;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif (is_php('5.4'))\n{\n\treturn;\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('hex2bin'))\n{\n\t/**\n\t * hex2bin()\n\t *\n\t * @link\thttp://php.net/hex2bin\n\t * @param\tstring\t$data\n\t * @return\tstring\n\t */\n\tfunction hex2bin($data)\n\t{\n\t\tif (in_array($type = gettype($data), array('array', 'double', 'object', 'resource'), TRUE))\n\t\t{\n\t\t\tif ($type === 'object' && method_exists($data, '__toString'))\n\t\t\t{\n\t\t\t\t$data = (string) $data;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttrigger_error('hex2bin() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\n\t\tif (strlen($data) % 2 !== 0)\n\t\t{\n\t\t\ttrigger_error('Hexadecimal input string must have an even length', E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ( ! preg_match('/^[0-9a-f]*$/i', $data))\n\t\t{\n\t\t\ttrigger_error('Input string must be hexadecimal string', E_USER_WARNING);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn pack('H*', $data);\n\t}\n}\n"
  },
  {
    "path": "system/core/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/DB.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Initialize the database\n *\n * @category\tDatabase\n * @author\tEllisLab Dev Team\n * @link\thttps://codeigniter.com/userguide3/database/\n *\n * @param \tstring|string[]\t$params\n * @param \tbool\t\t$query_builder_override\n *\t\t\t\tDetermines if query builder should be used or not\n */\nfunction &DB($params = '', $query_builder_override = NULL)\n{\n\t// Load the DB config file if a DSN string wasn't passed\n\tif (is_string($params) && strpos($params, '://') === FALSE)\n\t{\n\t\t// Is the config file in the environment folder?\n\t\tif ( ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/database.php')\n\t\t\t&& ! file_exists($file_path = APPPATH.'config/database.php'))\n\t\t{\n\t\t\tshow_error('The configuration file database.php does not exist.');\n\t\t}\n\n\t\tinclude($file_path);\n\n\t\t// Make packages contain database config files,\n\t\t// given that the controller instance already exists\n\t\tif (class_exists('CI_Controller', FALSE))\n\t\t{\n\t\t\tforeach (get_instance()->load->get_package_paths() as $path)\n\t\t\t{\n\t\t\t\tif ($path !== APPPATH)\n\t\t\t\t{\n\t\t\t\t\tif (file_exists($file_path = $path.'config/'.ENVIRONMENT.'/database.php'))\n\t\t\t\t\t{\n\t\t\t\t\t\tinclude($file_path);\n\t\t\t\t\t}\n\t\t\t\t\telseif (file_exists($file_path = $path.'config/database.php'))\n\t\t\t\t\t{\n\t\t\t\t\t\tinclude($file_path);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset($db) OR count($db) === 0)\n\t\t{\n\t\t\tshow_error('No database connection settings were found in the database config file.');\n\t\t}\n\n\t\tif ($params !== '')\n\t\t{\n\t\t\t$active_group = $params;\n\t\t}\n\n\t\tif ( ! isset($active_group))\n\t\t{\n\t\t\tshow_error('You have not specified a database connection group via $active_group in your config/database.php file.');\n\t\t}\n\t\telseif ( ! isset($db[$active_group]))\n\t\t{\n\t\t\tshow_error('You have specified an invalid database connection group ('.$active_group.') in your config/database.php file.');\n\t\t}\n\n\t\t$params = $db[$active_group];\n\t}\n\telseif (is_string($params))\n\t{\n\t\t/**\n\t\t * Parse the URL from the DSN string\n\t\t * Database settings can be passed as discreet\n\t\t * parameters or as a data source name in the first\n\t\t * parameter. DSNs must have this prototype:\n\t\t * $dsn = 'driver://username:password@hostname/database';\n\t\t */\n\t\tif (($dsn = @parse_url($params)) === FALSE)\n\t\t{\n\t\t\tshow_error('Invalid DB Connection String');\n\t\t}\n\n\t\t$params = array(\n\t\t\t'dbdriver'\t=> $dsn['scheme'],\n\t\t\t'hostname'\t=> isset($dsn['host']) ? rawurldecode($dsn['host']) : '',\n\t\t\t'port'\t\t=> isset($dsn['port']) ? rawurldecode($dsn['port']) : '',\n\t\t\t'username'\t=> isset($dsn['user']) ? rawurldecode($dsn['user']) : '',\n\t\t\t'password'\t=> isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '',\n\t\t\t'database'\t=> isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : ''\n\t\t);\n\n\t\t// Were additional config items set?\n\t\tif (isset($dsn['query']))\n\t\t{\n\t\t\tparse_str($dsn['query'], $extra);\n\n\t\t\tforeach ($extra as $key => $val)\n\t\t\t{\n\t\t\t\tif (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL')))\n\t\t\t\t{\n\t\t\t\t\t$val = var_export($val, TRUE);\n\t\t\t\t}\n\n\t\t\t\t$params[$key] = $val;\n\t\t\t}\n\t\t}\n\t}\n\n\t// No DB specified yet? Beat them senseless...\n\tif (empty($params['dbdriver']))\n\t{\n\t\tshow_error('You have not selected a database type to connect to.');\n\t}\n\n\t// Load the DB classes. Note: Since the query builder class is optional\n\t// we need to dynamically create a class that extends proper parent class\n\t// based on whether we're using the query builder class or not.\n\tif ($query_builder_override !== NULL)\n\t{\n\t\t$query_builder = $query_builder_override;\n\t}\n\t// Backwards compatibility work-around for keeping the\n\t// $active_record config variable working. Should be\n\t// removed in v3.1\n\telseif ( ! isset($query_builder) && isset($active_record))\n\t{\n\t\t$query_builder = $active_record;\n\t}\n\n\trequire_once(BASEPATH.'database/DB_driver.php');\n\n\tif ( ! isset($query_builder) OR $query_builder === TRUE)\n\t{\n\t\trequire_once(BASEPATH.'database/DB_query_builder.php');\n\t\tif ( ! class_exists('CI_DB', FALSE))\n\t\t{\n\t\t\t/**\n\t\t\t * CI_DB\n\t\t\t *\n\t\t\t * Acts as an alias for both CI_DB_driver and CI_DB_query_builder.\n\t\t\t *\n\t\t\t * @see\tCI_DB_query_builder\n\t\t\t * @see\tCI_DB_driver\n\t\t\t */\n\t\t\tclass CI_DB extends CI_DB_query_builder { }\n\t\t}\n\t}\n\telseif ( ! class_exists('CI_DB', FALSE))\n\t{\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tclass CI_DB extends CI_DB_driver { }\n\t}\n\n\t// Load the DB driver\n\t$driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php';\n\n\tfile_exists($driver_file) OR show_error('Invalid DB driver');\n\trequire_once($driver_file);\n\n\t// Instantiate the DB adapter\n\t$driver = 'CI_DB_'.$params['dbdriver'].'_driver';\n\t$DB = new $driver($params);\n\n\t// Check for a subdriver\n\tif ( ! empty($DB->subdriver))\n\t{\n\t\t$driver_file = BASEPATH.'database/drivers/'.$DB->dbdriver.'/subdrivers/'.$DB->dbdriver.'_'.$DB->subdriver.'_driver.php';\n\n\t\tif (file_exists($driver_file))\n\t\t{\n\t\t\trequire_once($driver_file);\n\t\t\t$driver = 'CI_DB_'.$DB->dbdriver.'_'.$DB->subdriver.'_driver';\n\t\t\t$DB = new $driver($params);\n\t\t}\n\t}\n\n\t$DB->initialize();\n\treturn $DB;\n}\n"
  },
  {
    "path": "system/database/DB_cache.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Database Cache Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_Cache {\n\n\t/**\n\t * CI Singleton\n\t *\n\t * @var\tobject\n\t */\n\tpublic $CI;\n\n\t/**\n\t * Database object\n\t *\n\t * Allows passing of DB object so that multiple database connections\n\t * and returned DB objects can be supported.\n\t *\n\t * @var\tobject\n\t */\n\tpublic $db;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tobject\t&$db\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\t// Assign the main CI object to $this->CI and load the file helper since we use it a lot\n\t\t$this->CI =& get_instance();\n\t\t$this->db =& $db;\n\t\t$this->CI->load->helper('file');\n\n\t\t$this->check_path();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Cache Directory Path\n\t *\n\t * @param\tstring\t$path\tPath to the cache directory\n\t * @return\tbool\n\t */\n\tpublic function check_path($path = '')\n\t{\n\t\tif ($path === '')\n\t\t{\n\t\t\tif ($this->db->cachedir === '')\n\t\t\t{\n\t\t\t\treturn $this->db->cache_off();\n\t\t\t}\n\n\t\t\t$path = $this->db->cachedir;\n\t\t}\n\n\t\t// Add a trailing slash to the path if needed\n\t\t$path = realpath($path)\n\t\t\t? rtrim(realpath($path), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR\n\t\t\t: rtrim($path, '/').'/';\n\n\t\tif ( ! is_dir($path))\n\t\t{\n\t\t\tlog_message('debug', 'DB cache path error: '.$path);\n\n\t\t\t// If the path is wrong we'll turn off caching\n\t\t\treturn $this->db->cache_off();\n\t\t}\n\n\t\tif ( ! is_really_writable($path))\n\t\t{\n\t\t\tlog_message('debug', 'DB cache dir not writable: '.$path);\n\n\t\t\t// If the path is not really writable we'll turn off caching\n\t\t\treturn $this->db->cache_off();\n\t\t}\n\n\t\t$this->db->cachedir = $path;\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Retrieve a cached query\n\t *\n\t * The URI being requested will become the name of the cache sub-folder.\n\t * An MD5 hash of the SQL statement will become the cache file name.\n\t *\n\t * @param\tstring\t$sql\n\t * @return\tstring\n\t */\n\tpublic function read($sql)\n\t{\n\t\t$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);\n\t\t$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);\n\t\t$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);\n\n\t\tif ( ! is_file($filepath) OR FALSE === ($cachedata = file_get_contents($filepath)))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn unserialize($cachedata);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Write a query to a cache file\n\t *\n\t * @param\tstring\t$sql\n\t * @param\tobject\t$object\n\t * @return\tbool\n\t */\n\tpublic function write($sql, $object)\n\t{\n\t\t$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);\n\t\t$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);\n\t\t$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';\n\t\t$filename = md5($sql);\n\n\t\tif ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (write_file($dir_path.$filename, serialize($object)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tchmod($dir_path.$filename, 0640);\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete cache files within a particular directory\n\t *\n\t * @param\tstring\t$segment_one\n\t * @param\tstring\t$segment_two\n\t * @return\tvoid\n\t */\n\tpublic function delete($segment_one = '', $segment_two = '')\n\t{\n\t\tif ($segment_one === '')\n\t\t{\n\t\t\t$segment_one  = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);\n\t\t}\n\n\t\tif ($segment_two === '')\n\t\t{\n\t\t\t$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);\n\t\t}\n\n\t\t$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';\n\t\tdelete_files($dir_path, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete all existing cache files\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function delete_all()\n\t{\n\t\tdelete_files($this->db->cachedir, TRUE, TRUE);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/DB_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Database Driver Class\n *\n * This is the platform-independent base DB implementation class.\n * This class will not be called directly. Rather, the adapter\n * class for the specific database will extend and instantiate it.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nabstract class CI_DB_driver {\n\n\t/**\n\t * Data Source Name / Connect string\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dsn;\n\n\t/**\n\t * Username\n\t *\n\t * @var\tstring\n\t */\n\tpublic $username;\n\n\t/**\n\t * Password\n\t *\n\t * @var\tstring\n\t */\n\tpublic $password;\n\n\t/**\n\t * Hostname\n\t *\n\t * @var\tstring\n\t */\n\tpublic $hostname;\n\n\t/**\n\t * Database name\n\t *\n\t * @var\tstring\n\t */\n\tpublic $database;\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver\t\t= 'mysqli';\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @used-by\tCI_DB_pdo_driver\n\t * @var\tstring\n\t */\n\tpublic $subdriver;\n\n\t/**\n\t * Table prefix\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbprefix\t\t= '';\n\n\t/**\n\t * Character set\n\t *\n\t * @var\tstring\n\t */\n\tpublic $char_set\t\t= 'utf8';\n\n\t/**\n\t * Collation\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbcollat\t\t= 'utf8_general_ci';\n\n\t/**\n\t * Encryption flag/data\n\t *\n\t * @var\tmixed\n\t */\n\tpublic $encrypt\t\t\t= FALSE;\n\n\t/**\n\t * Swap Prefix\n\t *\n\t * @var\tstring\n\t */\n\tpublic $swap_pre\t\t= '';\n\n\t/**\n\t * Database port\n\t *\n\t * @var\tint\n\t */\n\tpublic $port\t\t\t= NULL;\n\n\t/**\n\t * Persistent connection flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $pconnect\t\t= FALSE;\n\n\t/**\n\t * Connection ID\n\t *\n\t * @var\tobject|resource\n\t */\n\tpublic $conn_id\t\t\t= FALSE;\n\n\t/**\n\t * Result ID\n\t *\n\t * @var\tobject|resource\n\t */\n\tpublic $result_id\t\t= FALSE;\n\n\t/**\n\t * Debug flag\n\t *\n\t * Whether to display error messages.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $db_debug\t\t= FALSE;\n\n\t/**\n\t * Benchmark time\n\t *\n\t * @var\tint\n\t */\n\tpublic $benchmark\t\t= 0;\n\n\t/**\n\t * Executed queries count\n\t *\n\t * @var\tint\n\t */\n\tpublic $query_count\t\t= 0;\n\n\t/**\n\t * Bind marker\n\t *\n\t * Character used to identify values in a prepared statement.\n\t *\n\t * @var\tstring\n\t */\n\tpublic $bind_marker\t\t= '?';\n\n\t/**\n\t * Save queries flag\n\t *\n\t * Whether to keep an in-memory history of queries for debugging purposes.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $save_queries\t\t= TRUE;\n\n\t/**\n\t * Queries list\n\t *\n\t * @see\tCI_DB_driver::$save_queries\n\t * @var\tstring[]\n\t */\n\tpublic $queries\t\t\t= array();\n\n\t/**\n\t * Query times\n\t *\n\t * A list of times that queries took to execute.\n\t *\n\t * @var\tarray\n\t */\n\tpublic $query_times\t\t= array();\n\n\t/**\n\t * Data cache\n\t *\n\t * An internal generic value cache.\n\t *\n\t * @var\tarray\n\t */\n\tpublic $data_cache\t\t= array();\n\n\t/**\n\t * Transaction enabled flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $trans_enabled\t\t= TRUE;\n\n\t/**\n\t * Strict transaction mode flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $trans_strict\t\t= TRUE;\n\n\t/**\n\t * Transaction depth level\n\t *\n\t * @var\tint\n\t */\n\tprotected $_trans_depth\t\t= 0;\n\n\t/**\n\t * Transaction status flag\n\t *\n\t * Used with transactions to determine if a rollback should occur.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_trans_status\t= TRUE;\n\n\t/**\n\t * Transaction failure flag\n\t *\n\t * Used with transactions to determine if a transaction has failed.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_trans_failure\t= FALSE;\n\n\t/**\n\t * Cache On flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $cache_on\t\t= FALSE;\n\n\t/**\n\t * Cache directory path\n\t *\n\t * @var\tbool\n\t */\n\tpublic $cachedir\t\t= '';\n\n\t/**\n\t * Cache auto-delete flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $cache_autodel\t\t= FALSE;\n\n\t/**\n\t * DB Cache object\n\t *\n\t * @see\tCI_DB_cache\n\t * @var\tobject\n\t */\n\tpublic $CACHE;\n\n\t/**\n\t * Protect identifiers flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_protect_identifiers\t\t= TRUE;\n\n\t/**\n\t * List of reserved identifiers\n\t *\n\t * Identifiers that must NOT be escaped.\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_reserved_identifiers\t= array('*');\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '\"';\n\n\t/**\n\t * ESCAPE statement string\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_like_escape_str = \" ESCAPE '%s' \";\n\n\t/**\n\t * ESCAPE character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_like_escape_chr = '!';\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RAND()', 'RAND(%d)');\n\n\t/**\n\t * COUNT string\n\t *\n\t * @used-by\tCI_DB_driver::count_all()\n\t * @used-by\tCI_DB_query_builder::count_all_results()\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_count_string = 'SELECT COUNT(*) AS ';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tif (is_array($params))\n\t\t{\n\t\t\tforeach ($params as $key => $val)\n\t\t\t{\n\t\t\t\t$this->$key = $val;\n\t\t\t}\n\t\t}\n\n\t\tlog_message('info', 'Database Driver Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize Database Settings\n\t *\n\t * @return\tbool\n\t */\n\tpublic function initialize()\n\t{\n\t\t/* If an established connection is available, then there's\n\t\t * no need to connect and select the database.\n\t\t *\n\t\t * Depending on the database driver, conn_id can be either\n\t\t * boolean TRUE, a resource or an object.\n\t\t */\n\t\tif ($this->conn_id)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// ----------------------------------------------------------------\n\n\t\t// Connect to the database and set the connection ID\n\t\t$this->conn_id = $this->db_connect($this->pconnect);\n\n\t\t// No connection resource? Check if there is a failover else throw an error\n\t\tif ( ! $this->conn_id)\n\t\t{\n\t\t\t// Check if there is a failover set\n\t\t\tif ( ! empty($this->failover) && is_array($this->failover))\n\t\t\t{\n\t\t\t\t// Go over all the failovers\n\t\t\t\tforeach ($this->failover as $failover)\n\t\t\t\t{\n\t\t\t\t\t// Replace the current settings with those of the failover\n\t\t\t\t\tforeach ($failover as $key => $val)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->$key = $val;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Try to connect\n\t\t\t\t\t$this->conn_id = $this->db_connect($this->pconnect);\n\n\t\t\t\t\t// If a connection is made break the foreach loop\n\t\t\t\t\tif ($this->conn_id)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We still don't have a connection?\n\t\t\tif ( ! $this->conn_id)\n\t\t\t{\n\t\t\t\tlog_message('error', 'Unable to connect to the database');\n\n\t\t\t\tif ($this->db_debug)\n\t\t\t\t{\n\t\t\t\t\t$this->display_error('db_unable_to_connect');\n\t\t\t\t}\n\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t// Now we set the character set and that's all\n\t\treturn $this->db_set_charset($this->char_set);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * DB connect\n\t *\n\t * This is just a dummy method that all drivers will override.\n\t *\n\t * @return\tmixed\n\t */\n\tpublic function db_connect()\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Persistent database connection\n\t *\n\t * @return\tmixed\n\t */\n\tpublic function db_pconnect()\n\t{\n\t\treturn $this->db_connect(TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reconnect\n\t *\n\t * Keep / reestablish the db connection if no queries have been\n\t * sent for a length of time exceeding the server's idle timeout.\n\t *\n\t * This is just a dummy method to allow drivers without such\n\t * functionality to not declare it, while others will override it.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function reconnect()\n\t{\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select database\n\t *\n\t * This is just a dummy method to allow drivers without such\n\t * functionality to not declare it, while others will override it.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function db_select()\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Last error\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => NULL, 'message' => NULL);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set client character set\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function db_set_charset($charset)\n\t{\n\t\tif (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset))\n\t\t{\n\t\t\tlog_message('error', 'Unable to set database connection charset: '.$charset);\n\n\t\t\tif ($this->db_debug)\n\t\t\t{\n\t\t\t\t$this->display_error('db_unable_to_set_charset', $charset);\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * The name of the platform in use (mysql, mssql, etc...)\n\t *\n\t * @return\tstring\n\t */\n\tpublic function platform()\n\t{\n\t\treturn $this->dbdriver;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * Returns a string containing the version of the database being used.\n\t * Most drivers will override this method.\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\tif (FALSE === ($sql = $this->_version()))\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;\n\t\t}\n\n\t\t$query = $this->query($sql)->row();\n\t\treturn $this->data_cache['version'] = $query->ver;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Version number query string\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _version()\n\t{\n\t\treturn 'SELECT VERSION() AS ver';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * Accepts an SQL string as input and returns a result object upon\n\t * successful execution of a \"read\" type query. Returns boolean TRUE\n\t * upon successful execution of a \"write\" type query. Returns boolean\n\t * FALSE upon failure, and if the $db_debug variable is set to TRUE\n\t * will raise an error.\n\t *\n\t * @param\tstring\t$sql\n\t * @param\tarray\t$binds = FALSE\t\tAn array of binding data\n\t * @param\tbool\t$return_object = NULL\n\t * @return\tmixed\n\t */\n\tpublic function query($sql, $binds = FALSE, $return_object = NULL)\n\t{\n\t\tif ($sql === '')\n\t\t{\n\t\t\tlog_message('error', 'Invalid query: '.$sql);\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE;\n\t\t}\n\t\telseif ( ! is_bool($return_object))\n\t\t{\n\t\t\t$return_object = ! $this->is_write_type($sql);\n\t\t}\n\n\t\t// Verify table prefix and replace if necessary\n\t\tif ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre)\n\t\t{\n\t\t\t$sql = preg_replace('/(\\W)'.$this->swap_pre.'(\\S+?)/', '\\\\1'.$this->dbprefix.'\\\\2', $sql);\n\t\t}\n\n\t\t// Compile binds if needed\n\t\tif ($binds !== FALSE)\n\t\t{\n\t\t\t$sql = $this->compile_binds($sql, $binds);\n\t\t}\n\n\t\t// Is query caching enabled? If the query is a \"read type\"\n\t\t// we will load the caching class and return the previously\n\t\t// cached query if it exists\n\t\tif ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init())\n\t\t{\n\t\t\t$this->load_rdriver();\n\t\t\tif (FALSE !== ($cache = $this->CACHE->read($sql)))\n\t\t\t{\n\t\t\t\treturn $cache;\n\t\t\t}\n\t\t}\n\n\t\t// Save the query for debugging\n\t\tif ($this->save_queries === TRUE)\n\t\t{\n\t\t\t$this->queries[] = $sql;\n\t\t}\n\n\t\t// Start the Query Timer\n\t\t$time_start = microtime(TRUE);\n\n\t\t// Run the Query\n\t\tif (FALSE === ($this->result_id = $this->simple_query($sql)))\n\t\t{\n\t\t\tif ($this->save_queries === TRUE)\n\t\t\t{\n\t\t\t\t$this->query_times[] = 0;\n\t\t\t}\n\n\t\t\t// This will trigger a rollback if transactions are being used\n\t\t\tif ($this->_trans_depth !== 0)\n\t\t\t{\n\t\t\t\t$this->_trans_status = FALSE;\n\t\t\t}\n\n\t\t\t// Grab the error now, as we might run some additional queries before displaying the error\n\t\t\t$error = $this->error();\n\n\t\t\t// Log errors\n\t\t\tlog_message('error', 'Query error: '.$error['message'].' - Invalid query: '.$sql);\n\n\t\t\tif ($this->db_debug)\n\t\t\t{\n\t\t\t\t// We call this function in order to roll-back queries\n\t\t\t\t// if transactions are enabled. If we don't call this here\n\t\t\t\t// the error message will trigger an exit, causing the\n\t\t\t\t// transactions to remain in limbo.\n\t\t\t\twhile ($this->_trans_depth !== 0)\n\t\t\t\t{\n\t\t\t\t\t$trans_depth = $this->_trans_depth;\n\t\t\t\t\t$this->trans_complete();\n\t\t\t\t\tif ($trans_depth === $this->_trans_depth)\n\t\t\t\t\t{\n\t\t\t\t\t\tlog_message('error', 'Database: Failure during an automated transaction commit/rollback!');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Display errors\n\t\t\t\treturn $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql));\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Stop and aggregate the query time results\n\t\t$time_end = microtime(TRUE);\n\t\t$this->benchmark += $time_end - $time_start;\n\n\t\tif ($this->save_queries === TRUE)\n\t\t{\n\t\t\t$this->query_times[] = $time_end - $time_start;\n\t\t}\n\n\t\t// Increment the query counter\n\t\t$this->query_count++;\n\n\t\t// Will we have a result object instantiated? If not - we'll simply return TRUE\n\t\tif ($return_object !== TRUE)\n\t\t{\n\t\t\t// If caching is enabled we'll auto-cleanup any existing files related to this particular URI\n\t\t\tif ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init())\n\t\t\t{\n\t\t\t\t$this->CACHE->delete();\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Load and instantiate the result driver\n\t\t$driver\t\t= $this->load_rdriver();\n\t\t$RES\t\t= new $driver($this);\n\n\t\t// Is query caching enabled? If so, we'll serialize the\n\t\t// result object and save it to a cache file.\n\t\tif ($this->cache_on === TRUE && $this->_cache_init())\n\t\t{\n\t\t\t// We'll create a new instance of the result object\n\t\t\t// only without the platform specific driver since\n\t\t\t// we can't use it with cached data (the query result\n\t\t\t// resource ID won't be any good once we've cached the\n\t\t\t// result object, so we'll have to compile the data\n\t\t\t// and save it)\n\t\t\t$CR = new CI_DB_result($this);\n\t\t\t$CR->result_object\t= $RES->result_object();\n\t\t\t$CR->result_array\t= $RES->result_array();\n\t\t\t$CR->num_rows\t\t= $RES->num_rows();\n\n\t\t\t// Reset these since cached objects can not utilize resource IDs.\n\t\t\t$CR->conn_id\t\t= NULL;\n\t\t\t$CR->result_id\t\t= NULL;\n\n\t\t\t$this->CACHE->write($sql, $CR);\n\t\t}\n\n\t\treturn $RES;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load the result drivers\n\t *\n\t * @return\tstring\tthe name of the result class\n\t */\n\tpublic function load_rdriver()\n\t{\n\t\t$driver = 'CI_DB_'.$this->dbdriver.'_result';\n\n\t\tif ( ! class_exists($driver, FALSE))\n\t\t{\n\t\t\trequire_once(BASEPATH.'database/DB_result.php');\n\t\t\trequire_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php');\n\t\t}\n\n\t\treturn $driver;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Simple Query\n\t * This is a simplified version of the query() function. Internally\n\t * we only use it when running transaction commands since they do\n\t * not require all the features of the main query() function.\n\t *\n\t * @param\tstring\tthe sql query\n\t * @return\tmixed\n\t */\n\tpublic function simple_query($sql)\n\t{\n\t\tif ( ! $this->conn_id)\n\t\t{\n\t\t\tif ( ! $this->initialize())\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn $this->_execute($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Disable Transactions\n\t * This permits transactions to be disabled at run-time.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function trans_off()\n\t{\n\t\t$this->trans_enabled = FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Enable/disable Transaction Strict Mode\n\t *\n\t * When strict mode is enabled, if you are running multiple groups of\n\t * transactions, if one group fails all subsequent groups will be\n\t * rolled back.\n\t *\n\t * If strict mode is disabled, each group is treated autonomously,\n\t * meaning a failure of one group will not affect any others\n\t *\n\t * @param\tbool\t$mode = TRUE\n\t * @return\tvoid\n\t */\n\tpublic function trans_strict($mode = TRUE)\n\t{\n\t\t$this->trans_strict = is_bool($mode) ? $mode : TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Start Transaction\n\t *\n\t * @param\tbool\t$test_mode = FALSE\n\t * @return\tbool\n\t */\n\tpublic function trans_start($test_mode = FALSE)\n\t{\n\t\tif ( ! $this->trans_enabled)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $this->trans_begin($test_mode);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Complete Transaction\n\t *\n\t * @return\tbool\n\t */\n\tpublic function trans_complete()\n\t{\n\t\tif ( ! $this->trans_enabled)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// The query() function will set this flag to FALSE in the event that a query failed\n\t\tif ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE)\n\t\t{\n\t\t\t$this->trans_rollback();\n\n\t\t\t// If we are NOT running in strict mode, we will reset\n\t\t\t// the _trans_status flag so that subsequent groups of\n\t\t\t// transactions will be permitted.\n\t\t\tif ($this->trans_strict === FALSE)\n\t\t\t{\n\t\t\t\t$this->_trans_status = TRUE;\n\t\t\t}\n\n\t\t\tlog_message('debug', 'DB Transaction Failure');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $this->trans_commit();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Lets you retrieve the transaction flag to determine if it has failed\n\t *\n\t * @return\tbool\n\t */\n\tpublic function trans_status()\n\t{\n\t\treturn $this->_trans_status;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns TRUE if a transaction is currently active\n\t *\n\t * @return\tbool\n\t */\n\tpublic function trans_active()\n\t{\n\t\treturn (bool) $this->_trans_depth;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @param\tbool\t$test_mode\n\t * @return\tbool\n\t */\n\tpublic function trans_begin($test_mode = FALSE)\n\t{\n\t\tif ( ! $this->trans_enabled)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t// When transactions are nested we only begin/commit/rollback the outermost ones\n\t\telseif ($this->_trans_depth > 0)\n\t\t{\n\t\t\t$this->_trans_depth++;\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Reset the transaction failure flag.\n\t\t// If the $test_mode flag is set to TRUE transactions will be rolled back\n\t\t// even if the queries produce a successful result.\n\t\t$this->_trans_failure = ($test_mode === TRUE);\n\n\t\tif ($this->_trans_begin())\n\t\t{\n\t\t\t$this->_trans_status = TRUE;\n\t\t\t$this->_trans_depth++;\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tpublic function trans_commit()\n\t{\n\t\tif ( ! $this->trans_enabled OR $this->_trans_depth === 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t// When transactions are nested we only begin/commit/rollback the outermost ones\n\t\telseif ($this->_trans_depth > 1 OR $this->_trans_commit())\n\t\t{\n\t\t\t$this->_trans_depth--;\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tpublic function trans_rollback()\n\t{\n\t\tif ( ! $this->trans_enabled OR $this->_trans_depth === 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t// When transactions are nested we only begin/commit/rollback the outermost ones\n\t\telseif ($this->_trans_depth > 1 OR $this->_trans_rollback())\n\t\t{\n\t\t\t$this->_trans_depth--;\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile Bindings\n\t *\n\t * @param\tstring\tthe sql statement\n\t * @param\tarray\tan array of bind data\n\t * @return\tstring\n\t */\n\tpublic function compile_binds($sql, $binds)\n\t{\n\t\tif (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)\n\t\t{\n\t\t\treturn $sql;\n\t\t}\n\t\telseif ( ! is_array($binds))\n\t\t{\n\t\t\t$binds = array($binds);\n\t\t\t$bind_count = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Make sure we're using numeric keys\n\t\t\t$binds = array_values($binds);\n\t\t\t$bind_count = count($binds);\n\t\t}\n\n\t\t// We'll need the marker length later\n\t\t$ml = strlen($this->bind_marker);\n\n\t\t// Make sure not to replace a chunk inside a string that happens to match the bind marker\n\t\tif ($c = preg_match_all(\"/'[^']*'|\\\"[^\\\"]*\\\"/i\", $sql, $matches))\n\t\t{\n\t\t\t$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',\n\t\t\t\tstr_replace($matches[0],\n\t\t\t\t\tstr_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]),\n\t\t\t\t\t$sql, $c),\n\t\t\t\t$matches, PREG_OFFSET_CAPTURE);\n\n\t\t\t// Bind values' count must match the count of markers in the query\n\t\t\tif ($bind_count !== $c)\n\t\t\t{\n\t\t\t\treturn $sql;\n\t\t\t}\n\t\t}\n\t\telseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count)\n\t\t{\n\t\t\treturn $sql;\n\t\t}\n\n\t\tdo\n\t\t{\n\t\t\t$c--;\n\t\t\t$escaped_value = $this->escape($binds[$c]);\n\t\t\tif (is_array($escaped_value))\n\t\t\t{\n\t\t\t\t$escaped_value = '('.implode(',', $escaped_value).')';\n\t\t\t}\n\t\t\t$sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml);\n\t\t}\n\t\twhile ($c !== 0);\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determines if a query is a \"write\" type.\n\t *\n\t * @param\tstring\tAn SQL query string\n\t * @return\tbool\n\t */\n\tpublic function is_write_type($sql)\n\t{\n\t\treturn (bool) preg_match('/^\\s*\"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX|MERGE)\\s/i', $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Calculate the aggregate query elapsed time\n\t *\n\t * @param\tint\tThe number of decimal places\n\t * @return\tstring\n\t */\n\tpublic function elapsed_time($decimals = 6)\n\t{\n\t\treturn number_format($this->benchmark, $decimals);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the total number of queries\n\t *\n\t * @return\tint\n\t */\n\tpublic function total_queries()\n\t{\n\t\treturn $this->query_count;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the last query that was executed\n\t *\n\t * @return\tstring\n\t */\n\tpublic function last_query()\n\t{\n\t\treturn end($this->queries);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * \"Smart\" Escape String\n\t *\n\t * Escapes data based on type\n\t * Sets boolean and null types\n\t *\n\t * @param\tstring\n\t * @return\tmixed\n\t */\n\tpublic function escape($str)\n\t{\n\t\tif (is_array($str))\n\t\t{\n\t\t\t$str = array_map(array(&$this, 'escape'), $str);\n\t\t\treturn $str;\n\t\t}\n\t\telseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))\n\t\t{\n\t\t\treturn \"'\".$this->escape_str($str).\"'\";\n\t\t}\n\t\telseif (is_bool($str))\n\t\t{\n\t\t\treturn ($str === FALSE) ? 0 : 1;\n\t\t}\n\t\telseif ($str === NULL)\n\t\t{\n\t\t\treturn 'NULL';\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Escape String\n\t *\n\t * @param\tstring|string[]\t$str\tInput string\n\t * @param\tbool\t$like\tWhether or not the string will be used in a LIKE condition\n\t * @return\tstring\n\t */\n\tpublic function escape_str($str, $like = FALSE)\n\t{\n\t\tif (is_array($str))\n\t\t{\n\t\t\tforeach ($str as $key => $val)\n\t\t\t{\n\t\t\t\t$str[$key] = $this->escape_str($val, $like);\n\t\t\t}\n\n\t\t\treturn $str;\n\t\t}\n\n\t\t$str = $this->_escape_str($str);\n\n\t\t// escape LIKE condition wildcards\n\t\tif ($like === TRUE)\n\t\t{\n\t\t\treturn str_replace(\n\t\t\t\tarray($this->_like_escape_chr, '%', '_'),\n\t\t\t\tarray($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'),\n\t\t\t\t$str\n\t\t\t);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Escape LIKE String\n\t *\n\t * Calls the individual driver for platform\n\t * specific escaping for LIKE conditions\n\t *\n\t * @param\tstring|string[]\n\t * @return\tmixed\n\t */\n\tpublic function escape_like_str($str)\n\t{\n\t\treturn $this->escape_str($str, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn str_replace(\"'\", \"''\", remove_invisible_characters($str, FALSE));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Primary\n\t *\n\t * Retrieves the primary key. It assumes that the row in the first\n\t * position is the primary key\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @return\tstring\n\t */\n\tpublic function primary($table)\n\t{\n\t\t$fields = $this->list_fields($table);\n\t\treturn is_array($fields) ? current($fields) : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * \"Count All\" query\n\t *\n\t * Generates a platform-specific query string that counts all records in\n\t * the specified database\n\t *\n\t * @param\tstring\n\t * @return\tint\n\t */\n\tpublic function count_all($table = '')\n\t{\n\t\tif ($table === '')\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t$query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE));\n\t\tif ($query->num_rows() === 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t$query = $query->row();\n\t\t$this->_reset_select();\n\t\treturn (int) $query->numrows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an array of table names\n\t *\n\t * @param\tstring\t$constrain_by_prefix = FALSE\n\t * @return\tarray\n\t */\n\tpublic function list_tables($constrain_by_prefix = FALSE)\n\t{\n\t\t// Is there a cached result?\n\t\tif (isset($this->data_cache['table_names']))\n\t\t{\n\t\t\treturn $this->data_cache['table_names'];\n\t\t}\n\n\t\tif (FALSE === ($sql = $this->_list_tables($constrain_by_prefix)))\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;\n\t\t}\n\n\t\t$this->data_cache['table_names'] = array();\n\t\t$query = $this->query($sql);\n\n\t\tforeach ($query->result_array() as $row)\n\t\t{\n\t\t\t// Do we know from which column to get the table name?\n\t\t\tif ( ! isset($key))\n\t\t\t{\n\t\t\t\tif (isset($row['table_name']))\n\t\t\t\t{\n\t\t\t\t\t$key = 'table_name';\n\t\t\t\t}\n\t\t\t\telseif (isset($row['TABLE_NAME']))\n\t\t\t\t{\n\t\t\t\t\t$key = 'TABLE_NAME';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* We have no other choice but to just get the first element's key.\n\t\t\t\t\t * Due to array_shift() accepting its argument by reference, if\n\t\t\t\t\t * E_STRICT is on, this would trigger a warning. So we'll have to\n\t\t\t\t\t * assign it first.\n\t\t\t\t\t */\n\t\t\t\t\t$key = array_keys($row);\n\t\t\t\t\t$key = array_shift($key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->data_cache['table_names'][] = $row[$key];\n\t\t}\n\n\t\treturn $this->data_cache['table_names'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determine if a particular table exists\n\t *\n\t * @param\tstring\t$table_name\n\t * @return\tbool\n\t */\n\tpublic function table_exists($table_name)\n\t{\n\t\treturn in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @return\tarray\n\t */\n\tpublic function list_fields($table)\n\t{\n\t\tif (FALSE === ($sql = $this->_list_columns($table)))\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;\n\t\t}\n\n\t\t$query = $this->query($sql);\n\t\t$fields = array();\n\n\t\tforeach ($query->result_array() as $row)\n\t\t{\n\t\t\t// Do we know from where to get the column's name?\n\t\t\tif ( ! isset($key))\n\t\t\t{\n\t\t\t\tif (isset($row['column_name']))\n\t\t\t\t{\n\t\t\t\t\t$key = 'column_name';\n\t\t\t\t}\n\t\t\t\telseif (isset($row['COLUMN_NAME']))\n\t\t\t\t{\n\t\t\t\t\t$key = 'COLUMN_NAME';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// We have no other choice but to just get the first element's key.\n\t\t\t\t\t$key = key($row);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$fields[] = $row[$key];\n\t\t}\n\n\t\treturn $fields;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determine if a particular field exists\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function field_exists($field_name, $table_name)\n\t{\n\t\treturn in_array($field_name, $this->list_fields($table_name));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\tthe table name\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE)));\n\t\treturn ($query) ? $query->field_data() : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Escape the SQL Identifiers\n\t *\n\t * This function escapes column and table names\n\t *\n\t * @param\tmixed\n\t * @return\tmixed\n\t */\n\tpublic function escape_identifiers($item)\n\t{\n\t\tif ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers))\n\t\t{\n\t\t\treturn $item;\n\t\t}\n\t\telseif (is_array($item))\n\t\t{\n\t\t\tforeach ($item as $key => $value)\n\t\t\t{\n\t\t\t\t$item[$key] = $this->escape_identifiers($value);\n\t\t\t}\n\n\t\t\treturn $item;\n\t\t}\n\t\t// Avoid breaking functions and literal values inside queries\n\t\telseif (ctype_digit($item) OR $item[0] === \"'\" OR ($this->_escape_char !== '\"' && $item[0] === '\"') OR strpos($item, '(') !== FALSE)\n\t\t{\n\t\t\treturn $item;\n\t\t}\n\n\t\tstatic $preg_ec = array();\n\n\t\tif (empty($preg_ec))\n\t\t{\n\t\t\tif (is_array($this->_escape_char))\n\t\t\t{\n\t\t\t\t$preg_ec = array(\n\t\t\t\t\tpreg_quote($this->_escape_char[0], '/'),\n\t\t\t\t\tpreg_quote($this->_escape_char[1], '/'),\n\t\t\t\t\t$this->_escape_char[0],\n\t\t\t\t\t$this->_escape_char[1]\n\t\t\t\t);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/');\n\t\t\t\t$preg_ec[2] = $preg_ec[3] = $this->_escape_char;\n\t\t\t}\n\t\t}\n\n\t\tforeach ($this->_reserved_identifiers as $id)\n\t\t{\n\t\t\tif (strpos($item, '.'.$id) !== FALSE)\n\t\t\t{\n\t\t\t\treturn preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\\.]+)'.$preg_ec[1].'?\\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item);\n\t\t\t}\n\t\t}\n\n\t\treturn preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\\.]+)'.$preg_ec[1].'?(\\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate an insert string\n\t *\n\t * @param\tstring\tthe table upon which the query will be performed\n\t * @param\tarray\tan associative array data of key/values\n\t * @return\tstring\n\t */\n\tpublic function insert_string($table, $data)\n\t{\n\t\t$fields = $values = array();\n\n\t\tforeach ($data as $key => $val)\n\t\t{\n\t\t\t$fields[] = $this->escape_identifiers($key);\n\t\t\t$values[] = $this->escape($val);\n\t\t}\n\n\t\treturn $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data\n\t *\n\t * @param\tstring\tthe table name\n\t * @param\tarray\tthe insert keys\n\t * @param\tarray\tthe insert values\n\t * @return\tstring\n\t */\n\tprotected function _insert($table, $keys, $values)\n\t{\n\t\treturn 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate an update string\n\t *\n\t * @param\tstring\tthe table upon which the query will be performed\n\t * @param\tarray\tan associative array data of key/values\n\t * @param\tmixed\tthe \"where\" statement\n\t * @return\tstring\n\t */\n\tpublic function update_string($table, $data, $where)\n\t{\n\t\tif (empty($where))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->where($where);\n\n\t\t$fields = array();\n\t\tforeach ($data as $key => $val)\n\t\t{\n\t\t\t$fields[$this->protect_identifiers($key)] = $this->escape($val);\n\t\t}\n\n\t\t$sql = $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields);\n\t\t$this->_reset_write();\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\tthe table name\n\t * @param\tarray\tthe update data\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\tforeach ($values as $key => $val)\n\t\t{\n\t\t\t$valstr[] = $key.' = '.$val;\n\t\t}\n\n\t\treturn 'UPDATE '.$table.' SET '.implode(', ', $valstr)\n\t\t\t.$this->_compile_wh('qb_where')\n\t\t\t.$this->_compile_order_by()\n\t\t\t.($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Tests whether the string has an SQL operator\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tprotected function _has_operator($str)\n\t{\n\t\treturn (bool) preg_match('/(<|>|!|=|\\sIS NULL|\\sIS NOT NULL|\\sEXISTS|\\sBETWEEN|\\sLIKE|\\sIN\\s*\\(|\\s)/i', trim($str));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the SQL string operator\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _get_operator($str)\n\t{\n\t\tstatic $_operators;\n\n\t\tif (empty($_operators))\n\t\t{\n\t\t\t$_les = ($this->_like_escape_str !== '')\n\t\t\t\t? '\\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/')\n\t\t\t\t: '';\n\t\t\t$_operators = array(\n\t\t\t\t'\\s*(?:<|>|!)?=\\s*',             // =, <=, >=, !=\n\t\t\t\t'\\s*<>?\\s*',                     // <, <>\n\t\t\t\t'\\s*>\\s*',                       // >\n\t\t\t\t'\\s+IS NULL',                    // IS NULL\n\t\t\t\t'\\s+IS NOT NULL',                // IS NOT NULL\n\t\t\t\t'\\s+EXISTS\\s*\\(.*\\)',        // EXISTS(sql)\n\t\t\t\t'\\s+NOT EXISTS\\s*\\(.*\\)',    // NOT EXISTS(sql)\n\t\t\t\t'\\s+BETWEEN\\s+',                 // BETWEEN value AND value\n\t\t\t\t'\\s+NOT BETWEEN\\s+',             // NOT BETWEEN value AND value\n\t\t\t\t'\\s+IN\\s*\\(.*\\)',            // IN(list)\n\t\t\t\t'\\s+NOT IN\\s*\\(.*\\)',        // NOT IN (list)\n\t\t\t\t'\\s+LIKE\\s+\\S.*('.$_les.')?',    // LIKE 'expr'[ ESCAPE '%s']\n\t\t\t\t'\\s+NOT LIKE\\s+\\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s']\n\t\t\t);\n\n\t\t}\n\n\t\treturn preg_match('/'.implode('|', $_operators).'/i', $str, $match)\n\t\t\t? $match[0] : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Enables a native PHP function to be run, using a platform agnostic wrapper.\n\t *\n\t * @param\tstring\t$function\tFunction name\n\t * @return\tmixed\n\t */\n\tpublic function call_function($function)\n\t{\n\t\t$driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_';\n\n\t\tif (FALSE === strpos($driver, $function))\n\t\t{\n\t\t\t$function = $driver.$function;\n\t\t}\n\n\t\tif ( ! function_exists($function))\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;\n\t\t}\n\n\t\treturn (func_num_args() > 1)\n\t\t\t? call_user_func_array($function, array_slice(func_get_args(), 1))\n\t\t\t: call_user_func($function);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Cache Directory Path\n\t *\n\t * @param\tstring\tthe path to the cache directory\n\t * @return\tvoid\n\t */\n\tpublic function cache_set_path($path = '')\n\t{\n\t\t$this->cachedir = $path;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Enable Query Caching\n\t *\n\t * @return\tbool\tcache_on value\n\t */\n\tpublic function cache_on()\n\t{\n\t\treturn $this->cache_on = TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Disable Query Caching\n\t *\n\t * @return\tbool\tcache_on value\n\t */\n\tpublic function cache_off()\n\t{\n\t\treturn $this->cache_on = FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete the cache files associated with a particular URI\n\t *\n\t * @param\tstring\t$segment_one = ''\n\t * @param\tstring\t$segment_two = ''\n\t * @return\tbool\n\t */\n\tpublic function cache_delete($segment_one = '', $segment_two = '')\n\t{\n\t\treturn $this->_cache_init()\n\t\t\t? $this->CACHE->delete($segment_one, $segment_two)\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete All cache files\n\t *\n\t * @return\tbool\n\t */\n\tpublic function cache_delete_all()\n\t{\n\t\treturn $this->_cache_init()\n\t\t\t? $this->CACHE->delete_all()\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize the Cache Class\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _cache_init()\n\t{\n\t\tif ( ! class_exists('CI_DB_Cache', FALSE))\n\t\t{\n\t\t\trequire_once(BASEPATH.'database/DB_cache.php');\n\t\t}\n\t\telseif (is_object($this->CACHE))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t$this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function close()\n\t{\n\t\tif ($this->conn_id)\n\t\t{\n\t\t\t$this->_close();\n\t\t\t$this->conn_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * This method would be overridden by most of the drivers.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\t$this->conn_id = FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Display an error message\n\t *\n\t * @param\tstring\tthe error message\n\t * @param\tstring\tany \"swap\" values\n\t * @param\tbool\twhether to localize the message\n\t * @return\tstring\tsends the application/views/errors/error_db.php template\n\t */\n\tpublic function display_error($error = '', $swap = '', $native = FALSE)\n\t{\n\t\t$LANG =& load_class('Lang', 'core');\n\t\t$LANG->load('db');\n\n\t\t$heading = $LANG->line('db_error_heading');\n\n\t\tif ($native === TRUE)\n\t\t{\n\t\t\t$message = (array) $error;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$message = is_array($error) ? $error : array(str_replace('%s', $swap, $LANG->line($error)));\n\t\t}\n\n\t\t// Find the most likely culprit of the error by going through\n\t\t// the backtrace until the source file is no longer in the\n\t\t// database folder.\n\t\t$trace = debug_backtrace();\n\t\tforeach ($trace as $call)\n\t\t{\n\t\t\tif (isset($call['file'], $call['class']))\n\t\t\t{\n\t\t\t\t// We'll need this on Windows, as APPPATH and BASEPATH will always use forward slashes\n\t\t\t\tif (DIRECTORY_SEPARATOR !== '/')\n\t\t\t\t{\n\t\t\t\t\t$call['file'] = str_replace('\\\\', '/', $call['file']);\n\t\t\t\t}\n\n\t\t\t\tif (strpos($call['file'], BASEPATH.'database') === FALSE && strpos($call['class'], 'Loader') === FALSE)\n\t\t\t\t{\n\t\t\t\t\t// Found it - use a relative path for safety\n\t\t\t\t\t$message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']);\n\t\t\t\t\t$message[] = 'Line Number: '.$call['line'];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$error =& load_class('Exceptions', 'core');\n\t\techo $error->show_error($heading, $message, 'error_db');\n\t\texit(8); // EXIT_DATABASE\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Protect Identifiers\n\t *\n\t * This function is used extensively by the Query Builder class, and by\n\t * a couple functions in this class.\n\t * It takes a column or table name (optionally with an alias) and inserts\n\t * the table prefix onto it. Some logic is necessary in order to deal with\n\t * column names that include the path. Consider a query like this:\n\t *\n\t * SELECT hostname.database.table.column AS c FROM hostname.database.table\n\t *\n\t * Or a query with aliasing:\n\t *\n\t * SELECT m.member_id, m.member_name FROM members AS m\n\t *\n\t * Since the column name can include up to four segments (host, DB, table, column)\n\t * or also have an alias prefix, we need to do a bit of work to figure this out and\n\t * insert the table prefix (if it exists) in the proper position, and escape only\n\t * the correct identifiers.\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @param\tmixed\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)\n\t{\n\t\tif ( ! is_bool($protect_identifiers))\n\t\t{\n\t\t\t$protect_identifiers = $this->_protect_identifiers;\n\t\t}\n\n\t\tif (is_array($item))\n\t\t{\n\t\t\t$escaped_array = array();\n\t\t\tforeach ($item as $k => $v)\n\t\t\t{\n\t\t\t\t$escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists);\n\t\t\t}\n\n\t\t\treturn $escaped_array;\n\t\t}\n\n\t\t// This is basically a bug fix for queries that use MAX, MIN, etc.\n\t\t// If a parenthesis is found we know that we do not need to\n\t\t// escape the data or add a prefix. There's probably a more graceful\n\t\t// way to deal with this, but I'm not thinking of it -- Rick\n\t\t//\n\t\t// Added exception for single quotes as well, we don't want to alter\n\t\t// literal strings. -- Narf\n\t\tif (strcspn($item, \"()'\") !== strlen($item))\n\t\t{\n\t\t\treturn $item;\n\t\t}\n\n\t\t// Convert tabs or multiple spaces into single spaces\n\t\t$item = preg_replace('/\\s+/', ' ', trim($item));\n\n\t\t// If the item has an alias declaration we remove it and set it aside.\n\t\t// Note: strripos() is used in order to support spaces in table names\n\t\tif ($offset = strripos($item, ' AS '))\n\t\t{\n\t\t\t$alias = ($protect_identifiers)\n\t\t\t\t? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4))\n\t\t\t\t: substr($item, $offset);\n\t\t\t$item = substr($item, 0, $offset);\n\t\t}\n\t\telseif ($offset = strrpos($item, ' '))\n\t\t{\n\t\t\t$alias = ($protect_identifiers)\n\t\t\t\t? ' '.$this->escape_identifiers(substr($item, $offset + 1))\n\t\t\t\t: substr($item, $offset);\n\t\t\t$item = substr($item, 0, $offset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$alias = '';\n\t\t}\n\n\t\t// Break the string apart if it contains periods, then insert the table prefix\n\t\t// in the correct location, assuming the period doesn't indicate that we're dealing\n\t\t// with an alias. While we're at it, we will escape the components\n\t\tif (strpos($item, '.') !== FALSE)\n\t\t{\n\t\t\t$parts = explode('.', $item);\n\n\t\t\t// Does the first segment of the exploded item match\n\t\t\t// one of the aliases previously identified? If so,\n\t\t\t// we have nothing more to do other than escape the item\n\t\t\t//\n\t\t\t// NOTE: The ! empty() condition prevents this method\n\t\t\t//       from breaking when QB isn't enabled.\n\t\t\tif ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables))\n\t\t\t{\n\t\t\t\tif ($protect_identifiers === TRUE)\n\t\t\t\t{\n\t\t\t\t\tforeach ($parts as $key => $val)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( ! in_array($val, $this->_reserved_identifiers))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$parts[$key] = $this->escape_identifiers($val);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$item = implode('.', $parts);\n\t\t\t\t}\n\n\t\t\t\treturn $item.$alias;\n\t\t\t}\n\n\t\t\t// Is there a table prefix defined in the config file? If not, no need to do anything\n\t\t\tif ($this->dbprefix !== '')\n\t\t\t{\n\t\t\t\t// We now add the table prefix based on some logic.\n\t\t\t\t// Do we have 4 segments (hostname.database.table.column)?\n\t\t\t\t// If so, we add the table prefix to the column name in the 3rd segment.\n\t\t\t\tif (isset($parts[3]))\n\t\t\t\t{\n\t\t\t\t\t$i = 2;\n\t\t\t\t}\n\t\t\t\t// Do we have 3 segments (database.table.column)?\n\t\t\t\t// If so, we add the table prefix to the column name in 2nd position\n\t\t\t\telseif (isset($parts[2]))\n\t\t\t\t{\n\t\t\t\t\t$i = 1;\n\t\t\t\t}\n\t\t\t\t// Do we have 2 segments (table.column)?\n\t\t\t\t// If so, we add the table prefix to the column name in 1st segment\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$i = 0;\n\t\t\t\t}\n\n\t\t\t\t// This flag is set when the supplied $item does not contain a field name.\n\t\t\t\t// This can happen when this function is being called from a JOIN.\n\t\t\t\tif ($field_exists === FALSE)\n\t\t\t\t{\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\n\t\t\t\t// dbprefix may've already been applied, with or without the identifier escaped\n\t\t\t\t$ec = '(?<ec>'.preg_quote(is_array($this->_escape_char) ? $this->_escape_char[0] : $this->_escape_char).')?';\n\t\t\t\tisset($ec[0]) && $ec .= '?'; // Just in case someone has disabled escaping by forcing an empty escape character\n\n\t\t\t\t// Verify table prefix and replace if necessary\n\t\t\t\tif ($this->swap_pre !== '' && preg_match('#^'.$ec.preg_quote($this->swap_pre).'#', $parts[$i]))\n\t\t\t\t{\n\t\t\t\t\t$parts[$i] = preg_replace('#^'.$ec.preg_quote($this->swap_pre).'(\\S+?)#', '\\\\1'.$this->dbprefix.'\\\\2', $parts[$i]);\n\t\t\t\t}\n\t\t\t\t// We only add the table prefix if it does not already exist\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpreg_match('#^'.$ec.preg_quote($this->dbprefix).'#', $parts[$i]) OR $parts[$i] = $this->dbprefix.$parts[$i];\n\t\t\t\t}\n\n\t\t\t\t// Put the parts back together\n\t\t\t\t$item = implode('.', $parts);\n\t\t\t}\n\n\t\t\tif ($protect_identifiers === TRUE)\n\t\t\t{\n\t\t\t\t$item = $this->escape_identifiers($item);\n\t\t\t}\n\n\t\t\treturn $item.$alias;\n\t\t}\n\n\t\t// Is there a table prefix? If not, no need to insert it\n\t\tif ($this->dbprefix !== '')\n\t\t{\n\t\t\t// Verify table prefix and replace if necessary\n\t\t\tif ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0)\n\t\t\t{\n\t\t\t\t$item = preg_replace('/^'.$this->swap_pre.'(\\S+?)/', $this->dbprefix.'\\\\1', $item);\n\t\t\t}\n\t\t\t// Do we prefix an item with no segments?\n\t\t\telseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0)\n\t\t\t{\n\t\t\t\t$item = $this->dbprefix.$item;\n\t\t\t}\n\t\t}\n\n\t\tif ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers))\n\t\t{\n\t\t\t$item = $this->escape_identifiers($item);\n\t\t}\n\n\t\treturn $item.$alias;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Dummy method that allows Query Builder class to be disabled\n\t * and keep count_all() working.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _reset_select()\n\t{\n\t}\n\n}\n"
  },
  {
    "path": "system/database/DB_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Database Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nabstract class CI_DB_forge {\n\n\t/**\n\t * Database object\n\t *\n\t * @var\tobject\n\t */\n\tprotected $db;\n\n\t/**\n\t * Fields data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $fields\t\t= array();\n\n\t/**\n\t * Keys data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $keys\t\t= array();\n\n\t/**\n\t * Primary Keys data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $primary_keys\t= array();\n\n\t/**\n\t * Database character set\n\t *\n\t * @var\tstring\n\t */\n\tpublic $db_char_set\t= '';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= 'CREATE DATABASE %s';\n\n\t/**\n\t * DROP DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_database\t= 'DROP DATABASE %s';\n\n\t/**\n\t * CREATE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table\t= \"%s %s (%s\\n)\";\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= 'CREATE TABLE IF NOT EXISTS';\n\n\t/**\n\t * CREATE TABLE keys flag\n\t *\n\t * Whether table keys are created from within the\n\t * CREATE TABLE statement.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_create_table_keys\t= FALSE;\n\n\t/**\n\t * DROP TABLE IF EXISTS statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= 'DROP TABLE IF EXISTS';\n\n\t/**\n\t * RENAME TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_rename_table\t= 'ALTER TABLE %s RENAME TO %s;';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= TRUE;\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= '';\n\n\t/**\n\t * DEFAULT value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_default\t\t= ' DEFAULT ';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$db\tDatabase object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\t$this->db =& $db;\n\t\tlog_message('info', 'Database Forge Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create database\n\t *\n\t * @param\tstring\t$db_name\n\t * @return\tbool\n\t */\n\tpublic function create_database($db_name)\n\t{\n\t\tif ($this->_create_database === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\t\telseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat)))\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t}\n\n\t\tif ( ! empty($this->db->data_cache['db_names']))\n\t\t{\n\t\t\t$this->db->data_cache['db_names'][] = $db_name;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop database\n\t *\n\t * @param\tstring\t$db_name\n\t * @return\tbool\n\t */\n\tpublic function drop_database($db_name)\n\t{\n\t\tif ($this->_drop_database === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\t\telseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name))))\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t}\n\n\t\tif ( ! empty($this->db->data_cache['db_names']))\n\t\t{\n\t\t\t$key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE);\n\t\t\tif ($key !== FALSE)\n\t\t\t{\n\t\t\t\tunset($this->db->data_cache['db_names'][$key]);\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Key\n\t *\n\t * @param\tstring\t$key\n\t * @param\tbool\t$primary\n\t * @return\tCI_DB_forge\n\t */\n\tpublic function add_key($key, $primary = FALSE)\n\t{\n\t\t// DO NOT change this! This condition is only applicable\n\t\t// for PRIMARY keys because you can only have one such,\n\t\t// and therefore all fields you add to it will be included\n\t\t// in the same, composite PRIMARY KEY.\n\t\t//\n\t\t// It's not the same for regular indexes.\n\t\tif ($primary === TRUE && is_array($key))\n\t\t{\n\t\t\tforeach ($key as $one)\n\t\t\t{\n\t\t\t\t$this->add_key($one, $primary);\n\t\t\t}\n\n\t\t\treturn $this;\n\t\t}\n\n\t\tif ($primary === TRUE)\n\t\t{\n\t\t\t$this->primary_keys[] = $key;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->keys[] = $key;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Field\n\t *\n\t * @param\tarray\t$field\n\t * @return\tCI_DB_forge\n\t */\n\tpublic function add_field($field)\n\t{\n\t\tif (is_string($field))\n\t\t{\n\t\t\tif ($field === 'id')\n\t\t\t{\n\t\t\t\t$this->add_field(array(\n\t\t\t\t\t'id' => array(\n\t\t\t\t\t\t'type' => 'INT',\n\t\t\t\t\t\t'constraint' => 9,\n\t\t\t\t\t\t'auto_increment' => TRUE\n\t\t\t\t\t)\n\t\t\t\t));\n\t\t\t\t$this->add_key('id', TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (strpos($field, ' ') === FALSE)\n\t\t\t\t{\n\t\t\t\t\tshow_error('Field information is required for that operation.');\n\t\t\t\t}\n\n\t\t\t\t$this->fields[] = $field;\n\t\t\t}\n\t\t}\n\n\t\tif (is_array($field))\n\t\t{\n\t\t\t$this->fields = array_merge($this->fields, $field);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create Table\n\t *\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tbool\t$if_not_exists\tWhether to add IF NOT EXISTS condition\n\t * @param\tarray\t$attributes\tAssociative array of table attributes\n\t * @return\tbool\n\t */\n\tpublic function create_table($table, $if_not_exists = FALSE, array $attributes = array())\n\t{\n\t\tif ($table === '')\n\t\t{\n\t\t\tshow_error('A table name is required for that operation.');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$table = $this->db->dbprefix.$table;\n\t\t}\n\n\t\tif (count($this->fields) === 0)\n\t\t{\n\t\t\tshow_error('Field information is required.');\n\t\t}\n\n\t\t$sql = $this->_create_table($table, $if_not_exists, $attributes);\n\n\t\tif (is_bool($sql))\n\t\t{\n\t\t\t$this->_reset();\n\t\t\tif ($sql === FALSE)\n\t\t\t{\n\t\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t\t}\n\t\t}\n\n\t\tif (($result = $this->db->query($sql)) !== FALSE)\n\t\t{\n\t\t\tif (isset($this->db->data_cache['table_names']))\n\t\t\t{\n\t\t\t\t$this->db->data_cache['table_names'][] = $table;\n\t\t\t}\n\n\t\t\t// Most databases don't support creating indexes from within the CREATE TABLE statement\n\t\t\tif ( ! empty($this->keys))\n\t\t\t{\n\t\t\t\tfor ($i = 0, $sqls = $this->_process_indexes($table), $c = count($sqls); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$this->db->query($sqls[$i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->_reset();\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create Table\n\t *\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tbool\t$if_not_exists\tWhether to add 'IF NOT EXISTS' condition\n\t * @param\tarray\t$attributes\tAssociative array of table attributes\n\t * @return\tmixed\n\t */\n\tprotected function _create_table($table, $if_not_exists, $attributes)\n\t{\n\t\tif ($if_not_exists === TRUE && $this->_create_table_if === FALSE)\n\t\t{\n\t\t\tif ($this->db->table_exists($table))\n\t\t\t{\n\t\t\t\treturn TRUE;\n\t\t\t}\n\n\t\t\t$if_not_exists = FALSE;\n\t\t}\n\n\t\t$sql = ($if_not_exists)\n\t\t\t? sprintf($this->_create_table_if, $this->db->escape_identifiers($table))\n\t\t\t: 'CREATE TABLE';\n\n\t\t$columns = $this->_process_fields(TRUE);\n\t\tfor ($i = 0, $c = count($columns); $i < $c; $i++)\n\t\t{\n\t\t\t$columns[$i] = ($columns[$i]['_literal'] !== FALSE)\n\t\t\t\t\t? \"\\n\\t\".$columns[$i]['_literal']\n\t\t\t\t\t: \"\\n\\t\".$this->_process_column($columns[$i]);\n\t\t}\n\n\t\t$columns = implode(',', $columns)\n\t\t\t\t.$this->_process_primary_keys($table);\n\n\t\t// Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL)\n\t\tif ($this->_create_table_keys === TRUE)\n\t\t{\n\t\t\t$columns .= $this->_process_indexes($table);\n\t\t}\n\n\t\t// _create_table will usually have the following format: \"%s %s (%s\\n)\"\n\t\t$sql = sprintf($this->_create_table.'%s',\n\t\t\t$sql,\n\t\t\t$this->db->escape_identifiers($table),\n\t\t\t$columns,\n\t\t\t$this->_create_table_attr($attributes)\n\t\t);\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CREATE TABLE attributes\n\t *\n\t * @param\tarray\t$attributes\tAssociative array of table attributes\n\t * @return\tstring\n\t */\n\tprotected function _create_table_attr($attributes)\n\t{\n\t\t$sql = '';\n\n\t\tforeach (array_keys($attributes) as $key)\n\t\t{\n\t\t\tif (is_string($key))\n\t\t\t{\n\t\t\t\t$sql .= ' '.strtoupper($key).' '.$attributes[$key];\n\t\t\t}\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop Table\n\t *\n\t * @param\tstring\t$table_name\tTable name\n\t * @param\tbool\t$if_exists\tWhether to add an IF EXISTS condition\n\t * @return\tbool\n\t */\n\tpublic function drop_table($table_name, $if_exists = FALSE)\n\t{\n\t\tif ($table_name === '')\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE;\n\t\t}\n\n\t\tif (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t$query = $this->db->query($query);\n\n\t\t// Update table list cache\n\t\tif ($query && ! empty($this->db->data_cache['table_names']))\n\t\t{\n\t\t\t$key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE);\n\t\t\tif ($key !== FALSE)\n\t\t\t{\n\t\t\t\tunset($this->db->data_cache['table_names'][$key]);\n\t\t\t}\n\t\t}\n\n\t\treturn $query;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop Table\n\t *\n\t * Generates a platform-specific DROP TABLE string\n\t *\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tbool\t$if_exists\tWhether to add an IF EXISTS condition\n\t * @return\tmixed\t(Returns a platform-specific DROP table string, or TRUE to indicate there's nothing to do)\n\t */\n\tprotected function _drop_table($table, $if_exists)\n\t{\n\t\t$sql = 'DROP TABLE';\n\n\t\tif ($if_exists)\n\t\t{\n\t\t\tif ($this->_drop_table_if === FALSE)\n\t\t\t{\n\t\t\t\tif ( ! $this->db->table_exists($table))\n\t\t\t\t{\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$sql = sprintf($this->_drop_table_if, $this->db->escape_identifiers($table));\n\t\t\t}\n\t\t}\n\n\t\treturn $sql.' '.$this->db->escape_identifiers($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rename Table\n\t *\n\t * @param\tstring\t$table_name\tOld table name\n\t * @param\tstring\t$new_table_name\tNew table name\n\t * @return\tbool\n\t */\n\tpublic function rename_table($table_name, $new_table_name)\n\t{\n\t\tif ($table_name === '' OR $new_table_name === '')\n\t\t{\n\t\t\tshow_error('A table name is required for that operation.');\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ($this->_rename_table === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\t$result = $this->db->query(sprintf($this->_rename_table,\n\t\t\t\t\t\t$this->db->escape_identifiers($this->db->dbprefix.$table_name),\n\t\t\t\t\t\t$this->db->escape_identifiers($this->db->dbprefix.$new_table_name))\n\t\t\t\t\t);\n\n\t\tif ($result && ! empty($this->db->data_cache['table_names']))\n\t\t{\n\t\t\t$key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE);\n\t\t\tif ($key !== FALSE)\n\t\t\t{\n\t\t\t\t$this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name;\n\t\t\t}\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Column Add\n\t *\n\t * @todo\tRemove deprecated $_after option in 3.1+\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$field\tColumn definition\n\t * @param\tstring\t$_after\tColumn for AFTER clause (deprecated)\n\t * @return\tbool\n\t */\n\tpublic function add_column($table, $field, $_after = NULL)\n\t{\n\t\t// Work-around for literal column definitions\n\t\tis_array($field) OR $field = array($field);\n\n\t\tforeach (array_keys($field) as $k)\n\t\t{\n\t\t\t// Backwards-compatibility work-around for MySQL/CUBRID AFTER clause (remove in 3.1+)\n\t\t\tif ($_after !== NULL && is_array($field[$k]) && ! isset($field[$k]['after']))\n\t\t\t{\n\t\t\t\t$field[$k]['after'] = $_after;\n\t\t\t}\n\n\t\t\t$this->add_field(array($k => $field[$k]));\n\t\t}\n\n\t\t$sqls = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->_process_fields());\n\t\t$this->_reset();\n\t\tif ($sqls === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\tfor ($i = 0, $c = count($sqls); $i < $c; $i++)\n\t\t{\n\t\t\tif ($this->db->query($sqls[$i]) === FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Column Drop\n\t *\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tstring\t$column_name\tColumn name\n\t * @return\tbool\n\t */\n\tpublic function drop_column($table, $column_name)\n\t{\n\t\t$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);\n\t\tif ($sql === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\treturn $this->db->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Column Modify\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tstring\t$field\tColumn definition\n\t * @return\tbool\n\t */\n\tpublic function modify_column($table, $field)\n\t{\n\t\t// Work-around for literal column definitions\n\t\tis_array($field) OR $field = array($field);\n\n\t\tforeach (array_keys($field) as $k)\n\t\t{\n\t\t\t$this->add_field(array($k => $field[$k]));\n\t\t}\n\n\t\tif (count($this->fields) === 0)\n\t\t{\n\t\t\tshow_error('Field information is required.');\n\t\t}\n\n\t\t$sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields());\n\t\t$this->_reset();\n\t\tif ($sqls === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\tfor ($i = 0, $c = count($sqls); $i < $c; $i++)\n\t\t{\n\t\t\tif ($this->db->query($sqls[$i]) === FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ';\n\n\t\t// DROP has everything it needs now.\n\t\tif ($alter_type === 'DROP')\n\t\t{\n\t\t\treturn $sql.'DROP COLUMN '.$this->db->escape_identifiers($field);\n\t\t}\n\n\t\t$sql .= ($alter_type === 'ADD')\n\t\t\t? 'ADD '\n\t\t\t: $alter_type.' COLUMN ';\n\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\t$sqls[] = $sql\n\t\t\t\t.($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i]));\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process fields\n\t *\n\t * @param\tbool\t$create_table\n\t * @return\tarray\n\t */\n\tprotected function _process_fields($create_table = FALSE)\n\t{\n\t\t$fields = array();\n\n\t\tforeach ($this->fields as $key => $attributes)\n\t\t{\n\t\t\tif (is_int($key) && ! is_array($attributes))\n\t\t\t{\n\t\t\t\t$fields[] = array('_literal' => $attributes);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$attributes = array_change_key_case($attributes, CASE_UPPER);\n\n\t\t\tif ($create_table === TRUE && empty($attributes['TYPE']))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tisset($attributes['TYPE']) && $this->_attr_type($attributes);\n\n\t\t\t$field = array(\n\t\t\t\t'name'\t\t\t=> $key,\n\t\t\t\t'new_name'\t\t=> isset($attributes['NAME']) ? $attributes['NAME'] : NULL,\n\t\t\t\t'type'\t\t\t=> isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL,\n\t\t\t\t'length'\t\t=> '',\n\t\t\t\t'unsigned'\t\t=> '',\n\t\t\t\t'null'\t\t\t=> NULL,\n\t\t\t\t'unique'\t\t=> '',\n\t\t\t\t'default'\t\t=> '',\n\t\t\t\t'auto_increment'\t=> '',\n\t\t\t\t'_literal'\t\t=> FALSE\n\t\t\t);\n\n\t\t\tisset($attributes['TYPE']) && $this->_attr_unsigned($attributes, $field);\n\n\t\t\tif ($create_table === FALSE)\n\t\t\t{\n\t\t\t\tif (isset($attributes['AFTER']))\n\t\t\t\t{\n\t\t\t\t\t$field['after'] = $attributes['AFTER'];\n\t\t\t\t}\n\t\t\t\telseif (isset($attributes['FIRST']))\n\t\t\t\t{\n\t\t\t\t\t$field['first'] = (bool) $attributes['FIRST'];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->_attr_default($attributes, $field);\n\n\t\t\tif (isset($attributes['NULL']))\n\t\t\t{\n\t\t\t\tif ($attributes['NULL'] === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$field['null'] = empty($this->_null) ? '' : ' '.$this->_null;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$field['null'] = ' NOT NULL';\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($create_table === TRUE)\n\t\t\t{\n\t\t\t\t$field['null'] = ' NOT NULL';\n\t\t\t}\n\n\t\t\t$this->_attr_auto_increment($attributes, $field);\n\t\t\t$this->_attr_unique($attributes, $field);\n\n\t\t\tif (isset($attributes['COMMENT']))\n\t\t\t{\n\t\t\t\t$field['comment'] = $this->db->escape($attributes['COMMENT']);\n\t\t\t}\n\n\t\t\tif (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT']))\n\t\t\t{\n\t\t\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t\t\t{\n\t\t\t\t\tcase 'ENUM':\n\t\t\t\t\tcase 'SET':\n\t\t\t\t\t\t$attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']);\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$field['length'] = is_array($attributes['CONSTRAINT'])\n\t\t\t\t\t\t\t? '('.implode(',', $attributes['CONSTRAINT']).')'\n\t\t\t\t\t\t\t: '('.$attributes['CONSTRAINT'].')';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$fields[] = $field;\n\t\t}\n\n\t\treturn $fields;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['default']\n\t\t\t.$field['null']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['unique'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\t// Usually overridden by drivers\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute UNSIGNED\n\t *\n\t * Depending on the _unsigned property value:\n\t *\n\t *\t- TRUE will always set $field['unsigned'] to 'UNSIGNED'\n\t *\t- FALSE will always set $field['unsigned'] to ''\n\t *\t- array(TYPE) will set $field['unsigned'] to 'UNSIGNED',\n\t *\t\tif $attributes['TYPE'] is found in the array\n\t *\t- array(TYPE => UTYPE) will change $field['type'],\n\t *\t\tfrom TYPE to UTYPE in case of a match\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_unsigned(&$attributes, &$field)\n\t{\n\t\tif (empty($attributes['UNSIGNED']) OR $attributes['UNSIGNED'] !== TRUE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Reset the attribute in order to avoid issues if we do type conversion\n\t\t$attributes['UNSIGNED'] = FALSE;\n\n\t\tif (is_array($this->_unsigned))\n\t\t{\n\t\t\tforeach (array_keys($this->_unsigned) as $key)\n\t\t\t{\n\t\t\t\tif (is_int($key) && strcasecmp($attributes['TYPE'], $this->_unsigned[$key]) === 0)\n\t\t\t\t{\n\t\t\t\t\t$field['unsigned'] = ' UNSIGNED';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0)\n\t\t\t\t{\n\t\t\t\t\t$field['type'] = $key;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t$field['unsigned'] = ($this->_unsigned === TRUE) ? ' UNSIGNED' : '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute DEFAULT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_default(&$attributes, &$field)\n\t{\n\t\tif ($this->_default === FALSE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (array_key_exists('DEFAULT', $attributes))\n\t\t{\n\t\t\tif ($attributes['DEFAULT'] === NULL)\n\t\t\t{\n\t\t\t\t$field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null;\n\n\t\t\t\t// Override the NULL attribute if that's our default\n\t\t\t\t$attributes['NULL'] = TRUE;\n\t\t\t\t$field['null'] = empty($this->_null) ? '' : ' '.$this->_null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']);\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute UNIQUE\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_unique(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE)\n\t\t{\n\t\t\t$field['unique'] = ' UNIQUE';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['auto_increment'] = ' AUTO_INCREMENT';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process primary keys\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @return\tstring\n\t */\n\tprotected function _process_primary_keys($table)\n\t{\n\t\t$sql = '';\n\n\t\tfor ($i = 0, $c = count($this->primary_keys); $i < $c; $i++)\n\t\t{\n\t\t\tif ( ! isset($this->fields[$this->primary_keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->primary_keys[$i]);\n\t\t\t}\n\t\t}\n\n\t\tif (count($this->primary_keys) > 0)\n\t\t{\n\t\t\t$sql .= \",\\n\\tCONSTRAINT \".$this->db->escape_identifiers('pk_'.$table)\n\t\t\t\t.' PRIMARY KEY('.implode(', ', $this->db->escape_identifiers($this->primary_keys)).')';\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process indexes\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @return\tstring[] list of SQL statements\n\t */\n\tprotected function _process_indexes($table)\n\t{\n\t\t$sqls = array();\n\n\t\tfor ($i = 0, $c = count($this->keys); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_array($this->keys[$i]))\n\t\t\t{\n\t\t\t\tfor ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)\n\t\t\t\t{\n\t\t\t\t\tif ( ! isset($this->fields[$this->keys[$i][$i2]]))\n\t\t\t\t\t{\n\t\t\t\t\t\tunset($this->keys[$i][$i2]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! isset($this->fields[$this->keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->keys[$i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tis_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);\n\n\t\t\t$sqls[] = 'CREATE INDEX '.$this->db->escape_identifiers($table.'_'.implode('_', $this->keys[$i]))\n\t\t\t\t.' ON '.$this->db->escape_identifiers($table)\n\t\t\t\t.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).');';\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reset\n\t *\n\t * Resets table creation vars\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _reset()\n\t{\n\t\t$this->fields = $this->keys = $this->primary_keys = array();\n\t}\n\n}\n"
  },
  {
    "path": "system/database/DB_query_builder.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Query Builder Class\n *\n * This is the platform-independent base Query Builder implementation class.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\n\nabstract class CI_DB_query_builder extends CI_DB_driver {\n\n\t/**\n\t * Return DELETE SQL flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $return_delete_sql\t\t= FALSE;\n\n\t/**\n\t * Reset DELETE data flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $reset_delete_data\t\t= FALSE;\n\n\t/**\n\t * QB SELECT data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_select\t\t\t= array();\n\n\t/**\n\t * QB DISTINCT flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $qb_distinct\t\t\t= FALSE;\n\n\t/**\n\t * QB FROM data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_from\t\t\t= array();\n\n\t/**\n\t * QB JOIN data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_join\t\t\t= array();\n\n\t/**\n\t * QB WHERE data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_where\t\t\t= array();\n\n\t/**\n\t * QB GROUP BY data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_groupby\t\t\t= array();\n\n\t/**\n\t * QB HAVING data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_having\t\t\t= array();\n\n\t/**\n\t * QB keys\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_keys\t\t\t= array();\n\n\t/**\n\t * QB LIMIT data\n\t *\n\t * @var\tint\n\t */\n\tprotected $qb_limit\t\t\t= FALSE;\n\n\t/**\n\t * QB OFFSET data\n\t *\n\t * @var\tint\n\t */\n\tprotected $qb_offset\t\t\t= FALSE;\n\n\t/**\n\t * QB ORDER BY data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_orderby\t\t\t= array();\n\n\t/**\n\t * QB data sets\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_set\t\t\t= array();\n\n\t/**\n\t * QB data set for update_batch()\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_set_ub\t\t\t= array();\n\n\t/**\n\t * QB aliased tables list\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_aliased_tables\t\t= array();\n\n\t/**\n\t * QB WHERE group started flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $qb_where_group_started\t= FALSE;\n\n\t/**\n\t * QB WHERE group count\n\t *\n\t * @var\tint\n\t */\n\tprotected $qb_where_group_count\t\t= 0;\n\n\t// Query Builder Caching variables\n\n\t/**\n\t * QB Caching flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $qb_caching\t\t\t\t= FALSE;\n\n\t/**\n\t * QB Cache exists list\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_exists\t\t\t= array();\n\n\t/**\n\t * QB Cache SELECT data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_select\t\t\t= array();\n\n\t/**\n\t * QB Cache FROM data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_from\t\t\t= array();\n\n\t/**\n\t * QB Cache JOIN data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_join\t\t\t= array();\n\n\t/**\n\t * QB Cache aliased tables list\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_aliased_tables\t\t\t= array();\n\n\t/**\n\t * QB Cache WHERE data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_where\t\t\t= array();\n\n\t/**\n\t * QB Cache GROUP BY data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_groupby\t\t\t= array();\n\n\t/**\n\t * QB Cache HAVING data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_having\t\t\t= array();\n\n\t/**\n\t * QB Cache ORDER BY data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_orderby\t\t\t= array();\n\n\t/**\n\t * QB Cache data sets\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_set\t\t\t\t= array();\n\n\t/**\n\t * QB No Escape data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_no_escape \t\t\t= array();\n\n\t/**\n\t * QB Cache No Escape data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $qb_cache_no_escape\t\t\t= array();\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select\n\t *\n\t * Generates the SELECT portion of the query\n\t *\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function select($select = '*', $escape = NULL)\n\t{\n\t\tif (is_string($select))\n\t\t{\n\t\t\t$select = explode(',', $select);\n\t\t}\n\n\t\t// If the escape value was not set, we will base it on the global setting\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tforeach ($select as $val)\n\t\t{\n\t\t\t$val = trim($val);\n\n\t\t\tif ($val !== '')\n\t\t\t{\n\t\t\t\t$this->qb_select[] = $val;\n\t\t\t\t$this->qb_no_escape[] = $escape;\n\n\t\t\t\tif ($this->qb_caching === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$this->qb_cache_select[] = $val;\n\t\t\t\t\t$this->qb_cache_exists[] = 'select';\n\t\t\t\t\t$this->qb_cache_no_escape[] = $escape;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select Max\n\t *\n\t * Generates a SELECT MAX(field) portion of a query\n\t *\n\t * @param\tstring\tthe field\n\t * @param\tstring\tan alias\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function select_max($select = '', $alias = '')\n\t{\n\t\treturn $this->_max_min_avg_sum($select, $alias, 'MAX');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select Min\n\t *\n\t * Generates a SELECT MIN(field) portion of a query\n\t *\n\t * @param\tstring\tthe field\n\t * @param\tstring\tan alias\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function select_min($select = '', $alias = '')\n\t{\n\t\treturn $this->_max_min_avg_sum($select, $alias, 'MIN');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select Average\n\t *\n\t * Generates a SELECT AVG(field) portion of a query\n\t *\n\t * @param\tstring\tthe field\n\t * @param\tstring\tan alias\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function select_avg($select = '', $alias = '')\n\t{\n\t\treturn $this->_max_min_avg_sum($select, $alias, 'AVG');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select Sum\n\t *\n\t * Generates a SELECT SUM(field) portion of a query\n\t *\n\t * @param\tstring\tthe field\n\t * @param\tstring\tan alias\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function select_sum($select = '', $alias = '')\n\t{\n\t\treturn $this->_max_min_avg_sum($select, $alias, 'SUM');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * SELECT [MAX|MIN|AVG|SUM]()\n\t *\n\t * @used-by\tselect_max()\n\t * @used-by\tselect_min()\n\t * @used-by\tselect_avg()\n\t * @used-by\tselect_sum()\n\t *\n\t * @param\tstring\t$select\tField name\n\t * @param\tstring\t$alias\n\t * @param\tstring\t$type\n\t * @return\tCI_DB_query_builder\n\t */\n\tprotected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX')\n\t{\n\t\tif ( ! is_string($select) OR $select === '')\n\t\t{\n\t\t\t$this->display_error('db_invalid_query');\n\t\t}\n\n\t\t$type = strtoupper($type);\n\n\t\tif ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM')))\n\t\t{\n\t\t\tshow_error('Invalid function type: '.$type);\n\t\t}\n\n\t\tif ($alias === '')\n\t\t{\n\t\t\t$alias = $this->_create_alias_from_table(trim($select));\n\t\t}\n\n\t\t$sql = $type.'('.$this->protect_identifiers(trim($select)).') AS '.$this->escape_identifiers(trim($alias));\n\n\t\t$this->qb_select[] = $sql;\n\t\t$this->qb_no_escape[] = NULL;\n\n\t\tif ($this->qb_caching === TRUE)\n\t\t{\n\t\t\t$this->qb_cache_select[] = $sql;\n\t\t\t$this->qb_cache_exists[] = 'select';\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determines the alias name based on the table\n\t *\n\t * @param\tstring\t$item\n\t * @return\tstring\n\t */\n\tprotected function _create_alias_from_table($item)\n\t{\n\t\tif (strpos($item, '.') !== FALSE)\n\t\t{\n\t\t\t$item = explode('.', $item);\n\t\t\treturn end($item);\n\t\t}\n\n\t\treturn $item;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * DISTINCT\n\t *\n\t * Sets a flag which tells the query string compiler to add DISTINCT\n\t *\n\t * @param\tbool\t$val\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function distinct($val = TRUE)\n\t{\n\t\t$this->qb_distinct = is_bool($val) ? $val : TRUE;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * From\n\t *\n\t * Generates the FROM portion of the query\n\t *\n\t * @param\tmixed\t$from\tcan be a string or array\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function from($from)\n\t{\n\t\tforeach ((array) $from as $val)\n\t\t{\n\t\t\tif (strpos($val, ',') !== FALSE)\n\t\t\t{\n\t\t\t\tforeach (explode(',', $val) as $v)\n\t\t\t\t{\n\t\t\t\t\t$v = trim($v);\n\t\t\t\t\t$this->_track_aliases($v);\n\n\t\t\t\t\t$this->qb_from[] = $v = $this->protect_identifiers($v, TRUE, NULL, FALSE);\n\n\t\t\t\t\tif ($this->qb_caching === TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->qb_cache_from[] = $v;\n\t\t\t\t\t\t$this->qb_cache_exists[] = 'from';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$val = trim($val);\n\n\t\t\t\t// Extract any aliases that might exist. We use this information\n\t\t\t\t// in the protect_identifiers to know whether to add a table prefix\n\t\t\t\t$this->_track_aliases($val);\n\n\t\t\t\t$this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE);\n\n\t\t\t\tif ($this->qb_caching === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$this->qb_cache_from[] = $val;\n\t\t\t\t\t$this->qb_cache_exists[] = 'from';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * JOIN\n\t *\n\t * Generates the JOIN portion of the query\n\t *\n\t * @param\tstring\n\t * @param\tstring\tthe join condition\n\t * @param\tstring\tthe type of join\n\t * @param\tstring\twhether not to try to escape identifiers\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function join($table, $cond, $type = '', $escape = NULL)\n\t{\n\t\tif ($type !== '')\n\t\t{\n\t\t\t$type = strtoupper(trim($type));\n\n\t\t\tif ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER', 'FULL OUTER', 'FULL'), TRUE))\n\t\t\t{\n\t\t\t\t$type = '';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$type .= ' ';\n\t\t\t}\n\t\t}\n\n\t\t// Extract any aliases that might exist. We use this information\n\t\t// in the protect_identifiers to know whether to add a table prefix\n\t\t$this->_track_aliases($table);\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tif ( ! $this->_has_operator($cond))\n\t\t{\n\t\t\t$cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')';\n\t\t}\n\t\telseif ($escape === FALSE)\n\t\t{\n\t\t\t$cond = ' ON '.$cond;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Split multiple conditions\n\t\t\tif (preg_match_all('/\\sAND\\s|\\sOR\\s/i', $cond, $joints, PREG_OFFSET_CAPTURE))\n\t\t\t{\n\t\t\t\t$conditions = array();\n\t\t\t\t$joints = $joints[0];\n\t\t\t\tarray_unshift($joints, array('', 0));\n\n\t\t\t\tfor ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--)\n\t\t\t\t{\n\t\t\t\t\t$joints[$i][1] += strlen($joints[$i][0]); // offset\n\t\t\t\t\t$conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]);\n\t\t\t\t\t$pos = $joints[$i][1] - strlen($joints[$i][0]);\n\t\t\t\t\t$joints[$i] = $joints[$i][0];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$conditions = array($cond);\n\t\t\t\t$joints = array('');\n\t\t\t}\n\n\t\t\t$cond = ' ON ';\n\t\t\tfor ($i = 0, $c = count($conditions); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$operator = $this->_get_operator($conditions[$i]);\n\t\t\t\t$cond .= $joints[$i];\n\t\t\t\t$cond .= preg_match(\"/(\\(*)?([\\[\\]\\w\\.'-]+)\".preg_quote($operator).\"(.*)/i\", $conditions[$i], $match)\n\t\t\t\t\t? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3])\n\t\t\t\t\t: $conditions[$i];\n\t\t\t}\n\t\t}\n\n\t\t// Do we want to escape the table name?\n\t\tif ($escape === TRUE)\n\t\t{\n\t\t\t$table = $this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t\t}\n\n\t\t// Assemble the JOIN statement\n\t\t$this->qb_join[] = $join = $type.'JOIN '.$table.$cond;\n\n\t\tif ($this->qb_caching === TRUE)\n\t\t{\n\t\t\t$this->qb_cache_join[] = $join;\n\t\t\t$this->qb_cache_exists[] = 'join';\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * WHERE\n\t *\n\t * Generates the WHERE portion of the query.\n\t * Separates multiple calls with 'AND'.\n\t *\n\t * @param\tmixed\n\t * @param\tmixed\n\t * @param\tbool\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function where($key, $value = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_wh('qb_where', $key, $value, 'AND ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * OR WHERE\n\t *\n\t * Generates the WHERE portion of the query.\n\t * Separates multiple calls with 'OR'.\n\t *\n\t * @param\tmixed\n\t * @param\tmixed\n\t * @param\tbool\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_where($key, $value = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_wh('qb_where', $key, $value, 'OR ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * WHERE, HAVING\n\t *\n\t * @used-by\twhere()\n\t * @used-by\tor_where()\n\t * @used-by\thaving()\n\t * @used-by\tor_having()\n\t *\n\t * @param\tstring\t$qb_key\t'qb_where' or 'qb_having'\n\t * @param\tmixed\t$key\n\t * @param\tmixed\t$value\n\t * @param\tstring\t$type\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tprotected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = NULL)\n\t{\n\t\t$qb_cache_key = ($qb_key === 'qb_having') ? 'qb_cache_having' : 'qb_cache_where';\n\n\t\tif ( ! is_array($key))\n\t\t{\n\t\t\t$key = array($key => $value);\n\t\t}\n\n\t\t// If the escape value was not set will base it on the global setting\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tforeach ($key as $k => $v)\n\t\t{\n\t\t\t$prefix = (count($this->$qb_key) === 0 && count($this->$qb_cache_key) === 0)\n\t\t\t\t? $this->_group_get_type('')\n\t\t\t\t: $this->_group_get_type($type);\n\n\t\t\tif ($v !== NULL)\n\t\t\t{\n\t\t\t\tif ($escape === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$v = $this->escape($v);\n\t\t\t\t}\n\n\t\t\t\tif ( ! $this->_has_operator($k))\n\t\t\t\t{\n\t\t\t\t\t$k .= ' = ';\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! $this->_has_operator($k))\n\t\t\t{\n\t\t\t\t// value appears not to have been set, assign the test to IS NULL\n\t\t\t\t$k .= ' IS NULL';\n\t\t\t}\n\t\t\telseif (preg_match('/\\s*(!?=|<>|\\sIS(?:\\s+NOT)?\\s)\\s*$/i', $k, $match, PREG_OFFSET_CAPTURE))\n\t\t\t{\n\t\t\t\t$k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL');\n\t\t\t}\n\n\t\t\t${$qb_key} = array('condition' => $prefix.$k, 'value' => $v, 'escape' => $escape);\n\t\t\t$this->{$qb_key}[] = ${$qb_key};\n\t\t\tif ($this->qb_caching === TRUE)\n\t\t\t{\n\t\t\t\t$this->{$qb_cache_key}[] = ${$qb_key};\n\t\t\t\t$this->qb_cache_exists[] = substr($qb_key, 3);\n\t\t\t}\n\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * WHERE IN\n\t *\n\t * Generates a WHERE field IN('item', 'item') SQL query,\n\t * joined with 'AND' if appropriate.\n\t *\n\t * @param\tstring\t$key\tThe field to search\n\t * @param\tarray\t$values\tThe values searched on\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function where_in($key = NULL, $values = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_where_in($key, $values, FALSE, 'AND ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * OR WHERE IN\n\t *\n\t * Generates a WHERE field IN('item', 'item') SQL query,\n\t * joined with 'OR' if appropriate.\n\t *\n\t * @param\tstring\t$key\tThe field to search\n\t * @param\tarray\t$values\tThe values searched on\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_where_in($key = NULL, $values = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_where_in($key, $values, FALSE, 'OR ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * WHERE NOT IN\n\t *\n\t * Generates a WHERE field NOT IN('item', 'item') SQL query,\n\t * joined with 'AND' if appropriate.\n\t *\n\t * @param\tstring\t$key\tThe field to search\n\t * @param\tarray\t$values\tThe values searched on\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function where_not_in($key = NULL, $values = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_where_in($key, $values, TRUE, 'AND ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * OR WHERE NOT IN\n\t *\n\t * Generates a WHERE field NOT IN('item', 'item') SQL query,\n\t * joined with 'OR' if appropriate.\n\t *\n\t * @param\tstring\t$key\tThe field to search\n\t * @param\tarray\t$values\tThe values searched on\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_where_not_in($key = NULL, $values = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_where_in($key, $values, TRUE, 'OR ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal WHERE IN\n\t *\n\t * @used-by\twhere_in()\n\t * @used-by\tor_where_in()\n\t * @used-by\twhere_not_in()\n\t * @used-by\tor_where_not_in()\n\t *\n\t * @param\tstring\t$key\tThe field to search\n\t * @param\tarray\t$values\tThe values searched on\n\t * @param\tbool\t$not\tIf the statement would be IN or NOT IN\n\t * @param\tstring\t$type\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tprotected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL)\n\t{\n\t\tif ($key === NULL OR $values === NULL)\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\n\t\tif ( ! is_array($values))\n\t\t{\n\t\t\t$values = array($values);\n\t\t}\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\t$not = ($not) ? ' NOT' : '';\n\n\t\tif ($escape === TRUE)\n\t\t{\n\t\t\t$where_in = array();\n\t\t\tforeach ($values as $value)\n\t\t\t{\n\t\t\t\t$where_in[] = $this->escape($value);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$where_in = array_values($values);\n\t\t}\n\n\t\t$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0)\n\t\t\t? $this->_group_get_type('')\n\t\t\t: $this->_group_get_type($type);\n\n\t\t$where_in = array(\n\t\t\t'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')',\n\t\t\t'value' => NULL,\n\t\t\t'escape' => $escape\n\t\t);\n\n\t\t$this->qb_where[] = $where_in;\n\t\tif ($this->qb_caching === TRUE)\n\t\t{\n\t\t\t$this->qb_cache_where[] = $where_in;\n\t\t\t$this->qb_cache_exists[] = 'where';\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIKE\n\t *\n\t * Generates a %LIKE% portion of the query.\n\t * Separates multiple calls with 'AND'.\n\t *\n\t * @param\tmixed\t$field\n\t * @param\tstring\t$match\n\t * @param\tstring\t$side\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function like($field, $match = '', $side = 'both', $escape = NULL)\n\t{\n\t\treturn $this->_like($field, $match, 'AND ', $side, '', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * NOT LIKE\n\t *\n\t * Generates a NOT LIKE portion of the query.\n\t * Separates multiple calls with 'AND'.\n\t *\n\t * @param\tmixed\t$field\n\t * @param\tstring\t$match\n\t * @param\tstring\t$side\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function not_like($field, $match = '', $side = 'both', $escape = NULL)\n\t{\n\t\treturn $this->_like($field, $match, 'AND ', $side, 'NOT', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * OR LIKE\n\t *\n\t * Generates a %LIKE% portion of the query.\n\t * Separates multiple calls with 'OR'.\n\t *\n\t * @param\tmixed\t$field\n\t * @param\tstring\t$match\n\t * @param\tstring\t$side\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_like($field, $match = '', $side = 'both', $escape = NULL)\n\t{\n\t\treturn $this->_like($field, $match, 'OR ', $side, '', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * OR NOT LIKE\n\t *\n\t * Generates a NOT LIKE portion of the query.\n\t * Separates multiple calls with 'OR'.\n\t *\n\t * @param\tmixed\t$field\n\t * @param\tstring\t$match\n\t * @param\tstring\t$side\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_not_like($field, $match = '', $side = 'both', $escape = NULL)\n\t{\n\t\treturn $this->_like($field, $match, 'OR ', $side, 'NOT', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Internal LIKE\n\t *\n\t * @used-by\tlike()\n\t * @used-by\tor_like()\n\t * @used-by\tnot_like()\n\t * @used-by\tor_not_like()\n\t *\n\t * @param\tmixed\t$field\n\t * @param\tstring\t$match\n\t * @param\tstring\t$type\n\t * @param\tstring\t$side\n\t * @param\tstring\t$not\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tprotected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '', $escape = NULL)\n\t{\n\t\tif ( ! is_array($field))\n\t\t{\n\t\t\t$field = array($field => $match);\n\t\t}\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\t\t// lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh)\n\t\t$side = strtolower($side);\n\n\t\tforeach ($field as $k => $v)\n\t\t{\n\t\t\t$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0)\n\t\t\t\t? $this->_group_get_type('') : $this->_group_get_type($type);\n\n\t\t\tif ($escape === TRUE)\n\t\t\t{\n\t\t\t\t$v = $this->escape_like_str($v);\n\t\t\t}\n\n\t\t\tswitch ($side)\n\t\t\t{\n\t\t\t\tcase 'none':\n\t\t\t\t\t$v = \"'{$v}'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'before':\n\t\t\t\t\t$v = \"'%{$v}'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'after':\n\t\t\t\t\t$v = \"'{$v}%'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'both':\n\t\t\t\tdefault:\n\t\t\t\t\t$v = \"'%{$v}%'\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// some platforms require an escape sequence definition for LIKE wildcards\n\t\t\tif ($escape === TRUE && $this->_like_escape_str !== '')\n\t\t\t{\n\t\t\t\t$v .= sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t\t}\n\n\t\t\t$qb_where = array('condition' => \"{$prefix} {$k} {$not} LIKE {$v}\", 'value' => NULL, 'escape' => $escape);\n\t\t\t$this->qb_where[] = $qb_where;\n\t\t\tif ($this->qb_caching === TRUE)\n\t\t\t{\n\t\t\t\t$this->qb_cache_where[] = $qb_where;\n\t\t\t\t$this->qb_cache_exists[] = 'where';\n\t\t\t}\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Starts a query group.\n\t *\n\t * @param\tstring\t$not\t(Internal use only)\n\t * @param\tstring\t$type\t(Internal use only)\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function group_start($not = '', $type = 'AND ')\n\t{\n\t\t$type = $this->_group_get_type($type);\n\n\t\t$this->qb_where_group_started = TRUE;\n\t\t$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type;\n\t\t$where = array(\n\t\t\t'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (',\n\t\t\t'value' => NULL,\n\t\t\t'escape' => FALSE\n\t\t);\n\n\t\t$this->qb_where[] = $where;\n\t\tif ($this->qb_caching)\n\t\t{\n\t\t\t$this->qb_cache_where[] = $where;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Starts a query group, but ORs the group\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_group_start()\n\t{\n\t\treturn $this->group_start('', 'OR ');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Starts a query group, but NOTs the group\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function not_group_start()\n\t{\n\t\treturn $this->group_start('NOT ', 'AND ');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Starts a query group, but OR NOTs the group\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_not_group_start()\n\t{\n\t\treturn $this->group_start('NOT ', 'OR ');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Ends a query group\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function group_end()\n\t{\n\t\t$this->qb_where_group_started = FALSE;\n\t\t$where = array(\n\t\t\t'condition' => str_repeat(' ', $this->qb_where_group_count--).')',\n\t\t\t'value' => NULL,\n\t\t\t'escape' => FALSE\n\t\t);\n\n\t\t$this->qb_where[] = $where;\n\t\tif ($this->qb_caching)\n\t\t{\n\t\t\t$this->qb_cache_where[] = $where;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Group_get_type\n\t *\n\t * @used-by\tgroup_start()\n\t * @used-by\t_like()\n\t * @used-by\t_wh()\n\t * @used-by\t_where_in()\n\t *\n\t * @param\tstring\t$type\n\t * @return\tstring\n\t */\n\tprotected function _group_get_type($type)\n\t{\n\t\tif ($this->qb_where_group_started)\n\t\t{\n\t\t\t$type = '';\n\t\t\t$this->qb_where_group_started = FALSE;\n\t\t}\n\n\t\treturn $type;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * GROUP BY\n\t *\n\t * @param\tmixed\t$by\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function group_by($by, $escape = NULL)\n\t{\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tif (is_string($by))\n\t\t{\n\t\t\t$by = ($escape === TRUE)\n\t\t\t\t? explode(',', $by)\n\t\t\t\t: array($by);\n\t\t}\n\n\t\tforeach ($by as $val)\n\t\t{\n\t\t\t$val = trim($val);\n\n\t\t\tif ($val !== '')\n\t\t\t{\n\t\t\t\t$val = array('field' => $val, 'escape' => $escape);\n\n\t\t\t\t$this->qb_groupby[] = $val;\n\t\t\t\tif ($this->qb_caching === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$this->qb_cache_groupby[] = $val;\n\t\t\t\t\t$this->qb_cache_exists[] = 'groupby';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * HAVING\n\t *\n\t * Separates multiple calls with 'AND'.\n\t *\n\t * @param\tstring\t$key\n\t * @param\tstring\t$value\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function having($key, $value = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_wh('qb_having', $key, $value, 'AND ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * OR HAVING\n\t *\n\t * Separates multiple calls with 'OR'.\n\t *\n\t * @param\tstring\t$key\n\t * @param\tstring\t$value\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function or_having($key, $value = NULL, $escape = NULL)\n\t{\n\t\treturn $this->_wh('qb_having', $key, $value, 'OR ', $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY\n\t *\n\t * @param\tstring\t$orderby\n\t * @param\tstring\t$direction\tASC, DESC or RANDOM\n\t * @param\tbool\t$escape\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function order_by($orderby, $direction = '', $escape = NULL)\n\t{\n\t\t$direction = strtoupper(trim($direction));\n\n\t\tif ($direction === 'RANDOM')\n\t\t{\n\t\t\t$direction = '';\n\n\t\t\t// Do we have a seed value?\n\t\t\t$orderby = ctype_digit((string) $orderby)\n\t\t\t\t? sprintf($this->_random_keyword[1], $orderby)\n\t\t\t\t: $this->_random_keyword[0];\n\t\t}\n\t\telseif (empty($orderby))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\t\telseif ($direction !== '')\n\t\t{\n\t\t\t$direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : '';\n\t\t}\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tif ($escape === FALSE)\n\t\t{\n\t\t\t$qb_orderby[] = array('field' => $orderby, 'direction' => $direction, 'escape' => FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$qb_orderby = array();\n\t\t\tforeach (explode(',', $orderby) as $field)\n\t\t\t{\n\t\t\t\t$qb_orderby[] = ($direction === '' && preg_match('/\\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE))\n\t\t\t\t\t? array('field' => ltrim(substr($field, 0, $match[0][1])), 'direction' => ' '.$match[1][0], 'escape' => TRUE)\n\t\t\t\t\t: array('field' => trim($field), 'direction' => $direction, 'escape' => TRUE);\n\t\t\t}\n\t\t}\n\n\t\t$this->qb_orderby = array_merge($this->qb_orderby, $qb_orderby);\n\t\tif ($this->qb_caching === TRUE)\n\t\t{\n\t\t\t$this->qb_cache_orderby = array_merge($this->qb_cache_orderby, $qb_orderby);\n\t\t\t$this->qb_cache_exists[] = 'orderby';\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * @param\tint\t$value\tLIMIT value\n\t * @param\tint\t$offset\tOFFSET value\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function limit($value, $offset = 0)\n\t{\n\t\tis_null($value) OR $this->qb_limit = (int) $value;\n\t\tempty($offset) OR $this->qb_offset = (int) $offset;\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sets the OFFSET value\n\t *\n\t * @param\tint\t$offset\tOFFSET value\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function offset($offset)\n\t{\n\t\tempty($offset) OR $this->qb_offset = (int) $offset;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT string\n\t *\n\t * Generates a platform-specific LIMIT clause.\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\treturn $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * The \"set\" function.\n\t *\n\t * Allows key/value pairs to be set for inserting or updating\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function set($key, $value = '', $escape = NULL)\n\t{\n\t\t$key = $this->_object_to_array($key);\n\n\t\tif ( ! is_array($key))\n\t\t{\n\t\t\t$key = array($key => $value);\n\t\t}\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tforeach ($key as $k => $v)\n\t\t{\n\t\t\t$this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape)\n\t\t\t\t? $this->escape($v) : $v;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get SELECT query string\n\t *\n\t * Compiles a SELECT query string and returns the sql.\n\t *\n\t * @param\tstring\tthe table name to select from (optional)\n\t * @param\tbool\tTRUE: resets QB values; FALSE: leave QB values alone\n\t * @return\tstring\n\t */\n\tpublic function get_compiled_select($table = '', $reset = TRUE)\n\t{\n\t\tif ($table !== '')\n\t\t{\n\t\t\t$this->_track_aliases($table);\n\t\t\t$this->from($table);\n\t\t}\n\n\t\t$select = $this->_compile_select();\n\n\t\tif ($reset === TRUE)\n\t\t{\n\t\t\t$this->_reset_select();\n\t\t}\n\n\t\treturn $select;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get\n\t *\n\t * Compiles the select statement based on the other functions called\n\t * and runs the query\n\t *\n\t * @param\tstring\tthe table\n\t * @param\tstring\tthe limit clause\n\t * @param\tstring\tthe offset clause\n\t * @return\tCI_DB_result\n\t */\n\tpublic function get($table = '', $limit = NULL, $offset = NULL)\n\t{\n\t\tif ($table !== '')\n\t\t{\n\t\t\t$this->_track_aliases($table);\n\t\t\t$this->from($table);\n\t\t}\n\n\t\tif ( ! empty($limit))\n\t\t{\n\t\t\t$this->limit($limit, $offset);\n\t\t}\n\n\t\t$result = $this->query($this->_compile_select());\n\t\t$this->_reset_select();\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * \"Count All Results\" query\n\t *\n\t * Generates a platform-specific query string that counts all records\n\t * returned by an Query Builder query.\n\t *\n\t * @param\tstring\n\t * @param\tbool\tthe reset clause\n\t * @return\tint\n\t */\n\tpublic function count_all_results($table = '', $reset = TRUE)\n\t{\n\t\tif ($table !== '')\n\t\t{\n\t\t\t$this->_track_aliases($table);\n\t\t\t$this->from($table);\n\t\t}\n\n\t\t// ORDER BY usage is often problematic here (most notably\n\t\t// on Microsoft SQL Server) and ultimately unnecessary\n\t\t// for selecting COUNT(*) ...\n\t\t$qb_orderby       = $this->qb_orderby;\n\t\t$qb_cache_orderby = $this->qb_cache_orderby;\n\t\t$this->qb_orderby = $this->qb_cache_orderby = array();\n\n\t\t$result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby) OR ! empty($this->qb_having) OR $this->qb_limit OR $this->qb_offset)\n\t\t\t? $this->query($this->_count_string.$this->protect_identifiers('numrows').\"\\nFROM (\\n\".$this->_compile_select().\"\\n) CI_count_all_results\")\n\t\t\t: $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows')));\n\n\t\tif ($reset === TRUE)\n\t\t{\n\t\t\t$this->_reset_select();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->qb_orderby       = $qb_orderby;\n\t\t\t$this->qb_cache_orderby = $qb_cache_orderby;\n\t\t}\n\n\t\tif ($result->num_rows() === 0)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t$row = $result->row();\n\t\treturn (int) $row->numrows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * get_where()\n\t *\n\t * Allows the where clause, limit and offset to be added directly\n\t *\n\t * @param\tstring\t$table\n\t * @param\tstring\t$where\n\t * @param\tint\t$limit\n\t * @param\tint\t$offset\n\t * @return\tCI_DB_result\n\t */\n\tpublic function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL)\n\t{\n\t\tif ($table !== '')\n\t\t{\n\t\t\t$this->from($table);\n\t\t}\n\n\t\tif ($where !== NULL)\n\t\t{\n\t\t\t$this->where($where);\n\t\t}\n\n\t\tif ( ! empty($limit))\n\t\t{\n\t\t\t$this->limit($limit, $offset);\n\t\t}\n\n\t\t$result = $this->query($this->_compile_select());\n\t\t$this->_reset_select();\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert_Batch\n\t *\n\t * Compiles batch insert strings and runs the queries\n\t *\n\t * @param\tstring\t$table\tTable to insert into\n\t * @param\tarray\t$set \tAn associative array of insert values\n\t * @param\tbool\t$escape\tWhether to escape values and identifiers\n\t * @return\tint\tNumber of rows inserted or FALSE on failure\n\t */\n\tpublic function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100)\n\t{\n\t\tif ($set === NULL)\n\t\t{\n\t\t\tif (empty($this->qb_set))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (empty($set))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE;\n\t\t\t}\n\n\t\t\t$this->set_insert_batch($set, '', $escape);\n\t\t}\n\n\t\tif (strlen($table) === 0)\n\t\t{\n\t\t\tif ( ! isset($this->qb_from[0]))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t\t}\n\n\t\t\t$table = $this->qb_from[0];\n\t\t}\n\n\t\t// Batch this baby\n\t\t$affected_rows = 0;\n\t\tfor ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size)\n\t\t{\n\t\t\tif ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))))\n\t\t\t{\n\t\t\t\t$affected_rows += $this->affected_rows();\n\t\t\t}\n\t\t}\n\n\t\t$this->_reset_write();\n\t\treturn $affected_rows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\treturn 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * The \"set_insert_batch\" function.  Allows key/value pairs to be set for batch inserts\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function set_insert_batch($key, $value = '', $escape = NULL)\n\t{\n\t\t$key = $this->_object_to_array_batch($key);\n\n\t\tif ( ! is_array($key))\n\t\t{\n\t\t\t$key = array($key => $value);\n\t\t}\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\t$keys = array_keys($this->_object_to_array(reset($key)));\n\t\tsort($keys);\n\n\t\tforeach ($key as $row)\n\t\t{\n\t\t\t$row = $this->_object_to_array($row);\n\t\t\tif (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0)\n\t\t\t{\n\t\t\t\t// batch function above returns an error on an empty array\n\t\t\t\t$this->qb_set[] = array();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tksort($row); // puts $row in the same order as our keys\n\n\t\t\tif ($escape !== FALSE)\n\t\t\t{\n\t\t\t\t$clean = array();\n\t\t\t\tforeach ($row as $value)\n\t\t\t\t{\n\t\t\t\t\t$clean[] = $this->escape($value);\n\t\t\t\t}\n\n\t\t\t\t$row = $clean;\n\t\t\t}\n\n\t\t\t$this->qb_set[] = '('.implode(',', $row).')';\n\t\t}\n\n\t\tforeach ($keys as $k)\n\t\t{\n\t\t\t$this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get INSERT query string\n\t *\n\t * Compiles an insert query and returns the sql\n\t *\n\t * @param\tstring\tthe table to insert into\n\t * @param\tbool\tTRUE: reset QB values; FALSE: leave QB values alone\n\t * @return\tstring\n\t */\n\tpublic function get_compiled_insert($table = '', $reset = TRUE)\n\t{\n\t\tif ($this->_validate_insert($table) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$sql = $this->_insert(\n\t\t\t$this->protect_identifiers(\n\t\t\t\t$this->qb_from[0], TRUE, NULL, FALSE\n\t\t\t),\n\t\t\tarray_keys($this->qb_set),\n\t\t\tarray_values($this->qb_set)\n\t\t);\n\n\t\tif ($reset === TRUE)\n\t\t{\n\t\t\t$this->_reset_write();\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert\n\t *\n\t * Compiles an insert string and runs the query\n\t *\n\t * @param\tstring\tthe table to insert data into\n\t * @param\tarray\tan associative array of insert values\n\t * @param\tbool\t$escape\tWhether to escape values and identifiers\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function insert($table = '', $set = NULL, $escape = NULL)\n\t{\n\t\tif ($set !== NULL)\n\t\t{\n\t\t\t$this->set($set, '', $escape);\n\t\t}\n\n\t\tif ($this->_validate_insert($table) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$sql = $this->_insert(\n\t\t\t$this->protect_identifiers(\n\t\t\t\t$this->qb_from[0], TRUE, $escape, FALSE\n\t\t\t),\n\t\t\tarray_keys($this->qb_set),\n\t\t\tarray_values($this->qb_set)\n\t\t);\n\n\t\t$this->_reset_write();\n\t\treturn $this->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate Insert\n\t *\n\t * This method is used by both insert() and get_compiled_insert() to\n\t * validate that the there data is actually being set and that table\n\t * has been chosen to be inserted into.\n\t *\n\t * @param\tstring\tthe table to insert data into\n\t * @return\tstring\n\t */\n\tprotected function _validate_insert($table = '')\n\t{\n\t\tif (count($this->qb_set) === 0)\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;\n\t\t}\n\n\t\tif ($table !== '')\n\t\t{\n\t\t\t$this->qb_from[0] = $table;\n\t\t}\n\t\telseif ( ! isset($this->qb_from[0]))\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Replace\n\t *\n\t * Compiles an replace into string and runs the query\n\t *\n\t * @param\tstring\tthe table to replace data into\n\t * @param\tarray\tan associative array of insert values\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function replace($table = '', $set = NULL)\n\t{\n\t\tif ($set !== NULL)\n\t\t{\n\t\t\t$this->set($set);\n\t\t}\n\n\t\tif (count($this->qb_set) === 0)\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;\n\t\t}\n\n\t\tif ($table === '')\n\t\t{\n\t\t\tif ( ! isset($this->qb_from[0]))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t\t}\n\n\t\t\t$table = $this->qb_from[0];\n\t\t}\n\n\t\t$sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set));\n\n\t\t$this->_reset_write();\n\t\treturn $this->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Replace statement\n\t *\n\t * Generates a platform-specific replace string from the supplied data\n\t *\n\t * @param\tstring\tthe table name\n\t * @param\tarray\tthe insert keys\n\t * @param\tarray\tthe insert values\n\t * @return\tstring\n\t */\n\tprotected function _replace($table, $keys, $values)\n\t{\n\t\treturn 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FROM tables\n\t *\n\t * Groups tables in FROM clauses if needed, so there is no confusion\n\t * about operator precedence.\n\t *\n\t * Note: This is only used (and overridden) by MySQL and CUBRID.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _from_tables()\n\t{\n\t\treturn implode(', ', $this->qb_from);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get UPDATE query string\n\t *\n\t * Compiles an update query and returns the sql\n\t *\n\t * @param\tstring\tthe table to update\n\t * @param\tbool\tTRUE: reset QB values; FALSE: leave QB values alone\n\t * @return\tstring\n\t */\n\tpublic function get_compiled_update($table = '', $reset = TRUE)\n\t{\n\t\t// Combine any cached components with the current statements\n\t\t$this->_merge_cache();\n\n\t\tif ($this->_validate_update($table) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$sql = $this->_update($this->qb_from[0], $this->qb_set);\n\n\t\tif ($reset === TRUE)\n\t\t{\n\t\t\t$this->_reset_write();\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * UPDATE\n\t *\n\t * Compiles an update string and runs the query.\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$set\tAn associative array of update values\n\t * @param\tmixed\t$where\n\t * @param\tint\t$limit\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function update($table = '', $set = NULL, $where = NULL, $limit = NULL)\n\t{\n\t\t// Combine any cached components with the current statements\n\t\t$this->_merge_cache();\n\n\t\tif ($set !== NULL)\n\t\t{\n\t\t\t$this->set($set);\n\t\t}\n\n\t\tif ($this->_validate_update($table) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($where !== NULL)\n\t\t{\n\t\t\t$this->where($where);\n\t\t}\n\n\t\tif ( ! empty($limit))\n\t\t{\n\t\t\t$this->limit($limit);\n\t\t}\n\n\t\t$sql = $this->_update($this->qb_from[0], $this->qb_set);\n\t\t$this->_reset_write();\n\t\treturn $this->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate Update\n\t *\n\t * This method is used by both update() and get_compiled_update() to\n\t * validate that data is actually being set and that a table has been\n\t * chosen to be update.\n\t *\n\t * @param\tstring\tthe table to update data on\n\t * @return\tbool\n\t */\n\tprotected function _validate_update($table)\n\t{\n\t\tif (count($this->qb_set) === 0)\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;\n\t\t}\n\n\t\tif ($table !== '')\n\t\t{\n\t\t\t$this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE));\n\t\t}\n\t\telseif ( ! isset($this->qb_from[0]))\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update_Batch\n\t *\n\t * Compiles an update string and runs the query\n\t *\n\t * @param\tstring\tthe table to retrieve the results from\n\t * @param\tarray\tan associative array of update values\n\t * @param\tstring\tthe where key\n\t * @return\tint\tnumber of rows affected or FALSE on failure\n\t */\n\tpublic function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100)\n\t{\n\t\t// Combine any cached components with the current statements\n\t\t$this->_merge_cache();\n\n\t\tif ($index === NULL)\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE;\n\t\t}\n\n\t\tif ($set === NULL)\n\t\t{\n\t\t\tif (empty($this->qb_set_ub))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (empty($set))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE;\n\t\t\t}\n\n\t\t\t$this->set_update_batch($set, $index);\n\t\t}\n\n\t\tif (strlen($table) === 0)\n\t\t{\n\t\t\tif ( ! isset($this->qb_from[0]))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t\t}\n\n\t\t\t$table = $this->qb_from[0];\n\t\t}\n\n\t\t// Batch this baby\n\t\t$affected_rows = 0;\n\t\tfor ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size)\n\t\t{\n\t\t\tif ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index)))\n\t\t\t{\n\t\t\t\t$affected_rows += $this->affected_rows();\n\t\t\t}\n\n\t\t\t$this->qb_where = array();\n\t\t}\n\n\t\t$this->_reset_write();\n\t\treturn $affected_rows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update_Batch statement\n\t *\n\t * Generates a platform-specific batch update string from the supplied data\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$values\tUpdate data\n\t * @param\tstring\t$index\tWHERE key\n\t * @return\tstring\n\t */\n\tprotected function _update_batch($table, $values, $index)\n\t{\n\t\t$ids = array();\n\t\tforeach ($values as $key => $val)\n\t\t{\n\t\t\t$ids[] = $val[$index]['value'];\n\n\t\t\tforeach (array_keys($val) as $field)\n\t\t\t{\n\t\t\t\tif ($field !== $index)\n\t\t\t\t{\n\t\t\t\t\t$final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$cases = '';\n\t\tforeach ($final as $k => $v)\n\t\t{\n\t\t\t$cases .= $k.\" = CASE \\n\"\n\t\t\t\t.implode(\"\\n\", $v).\"\\n\"\n\t\t\t\t.'ELSE '.$k.' END, ';\n\t\t}\n\n\t\t$this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE);\n\n\t\treturn 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * The \"set_update_batch\" function.  Allows key/value pairs to be set for batch updating\n\t *\n\t * @param\tarray\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function set_update_batch($key, $index = '', $escape = NULL)\n\t{\n\t\t$key = $this->_object_to_array_batch($key);\n\n\t\tif ( ! is_array($key))\n\t\t{\n\t\t\t// @todo error\n\t\t}\n\n\t\tis_bool($escape) OR $escape = $this->_protect_identifiers;\n\n\t\tforeach ($key as $k => $v)\n\t\t{\n\t\t\t$index_set = FALSE;\n\t\t\t$clean = array();\n\t\t\tforeach ($v as $k2 => $v2)\n\t\t\t{\n\t\t\t\tif ($k2 === $index)\n\t\t\t\t{\n\t\t\t\t\t$index_set = TRUE;\n\t\t\t\t}\n\n\t\t\t\t$clean[$k2] = array(\n\t\t\t\t\t'field'  => $this->protect_identifiers($k2, FALSE, $escape),\n\t\t\t\t\t'value'  => ($escape === FALSE ? $v2 : $this->escape($v2))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ($index_set === FALSE)\n\t\t\t{\n\t\t\t\treturn $this->display_error('db_batch_missing_index');\n\t\t\t}\n\n\t\t\t$this->qb_set_ub[] = $clean;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Empty Table\n\t *\n\t * Compiles a delete string and runs \"DELETE FROM table\"\n\t *\n\t * @param\tstring\tthe table to empty\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function empty_table($table = '')\n\t{\n\t\tif ($table === '')\n\t\t{\n\t\t\tif ( ! isset($this->qb_from[0]))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t\t}\n\n\t\t\t$table = $this->qb_from[0];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$table = $this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t\t}\n\n\t\t$sql = $this->_delete($table);\n\t\t$this->_reset_write();\n\t\treturn $this->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate\n\t *\n\t * Compiles a truncate string and runs the query\n\t * If the database does not support the truncate() command\n\t * This function maps to \"DELETE FROM table\"\n\t *\n\t * @param\tstring\tthe table to truncate\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function truncate($table = '')\n\t{\n\t\tif ($table === '')\n\t\t{\n\t\t\tif ( ! isset($this->qb_from[0]))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t\t}\n\n\t\t\t$table = $this->qb_from[0];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$table = $this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t\t}\n\n\t\t$sql = $this->_truncate($table);\n\t\t$this->_reset_write();\n\t\treturn $this->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the truncate() command,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\tthe table name\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get DELETE query string\n\t *\n\t * Compiles a delete query string and returns the sql\n\t *\n\t * @param\tstring\tthe table to delete from\n\t * @param\tbool\tTRUE: reset QB values; FALSE: leave QB values alone\n\t * @return\tstring\n\t */\n\tpublic function get_compiled_delete($table = '', $reset = TRUE)\n\t{\n\t\t$this->return_delete_sql = TRUE;\n\t\t$sql = $this->delete($table, '', NULL, $reset);\n\t\t$this->return_delete_sql = FALSE;\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete\n\t *\n\t * Compiles a delete string and runs the query\n\t *\n\t * @param\tmixed\tthe table(s) to delete from. String or array\n\t * @param\tmixed\tthe where clause\n\t * @param\tmixed\tthe limit clause\n\t * @param\tbool\n\t * @return\tmixed\n\t */\n\tpublic function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE)\n\t{\n\t\t// Combine any cached components with the current statements\n\t\t$this->_merge_cache();\n\n\t\tif ($table === '')\n\t\t{\n\t\t\tif ( ! isset($this->qb_from[0]))\n\t\t\t{\n\t\t\t\treturn ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;\n\t\t\t}\n\n\t\t\t$table = $this->qb_from[0];\n\t\t}\n\t\telseif (is_array($table))\n\t\t{\n\t\t\tempty($where) && $reset_data = FALSE;\n\n\t\t\tforeach ($table as $single_table)\n\t\t\t{\n\t\t\t\t$this->delete($single_table, $where, $limit, $reset_data);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$table = $this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t\t}\n\n\t\tif ($where !== '')\n\t\t{\n\t\t\t$this->where($where);\n\t\t}\n\n\t\tif ( ! empty($limit))\n\t\t{\n\t\t\t$this->limit($limit);\n\t\t}\n\n\t\tif (count($this->qb_where) === 0)\n\t\t{\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE;\n\t\t}\n\n\t\t$sql = $this->_delete($table);\n\t\tif ($reset_data)\n\t\t{\n\t\t\t$this->_reset_write();\n\t\t}\n\n\t\treturn ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\tthe table name\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\treturn 'DELETE FROM '.$table.$this->_compile_wh('qb_where')\n\t\t\t.($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * DB Prefix\n\t *\n\t * Prepends a database prefix if one exists in configuration\n\t *\n\t * @param\tstring\tthe table\n\t * @return\tstring\n\t */\n\tpublic function dbprefix($table = '')\n\t{\n\t\tif ($table === '')\n\t\t{\n\t\t\t$this->display_error('db_table_name_required');\n\t\t}\n\n\t\treturn $this->dbprefix.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set DB Prefix\n\t *\n\t * Set's the DB Prefix to something new without needing to reconnect\n\t *\n\t * @param\tstring\tthe prefix\n\t * @return\tstring\n\t */\n\tpublic function set_dbprefix($prefix = '')\n\t{\n\t\treturn $this->dbprefix = $prefix;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Track Aliases\n\t *\n\t * Used to track SQL statements written with aliased tables.\n\t *\n\t * @param\tstring\tThe table to inspect\n\t * @return\tstring\n\t */\n\tprotected function _track_aliases($table)\n\t{\n\t\tif (is_array($table))\n\t\t{\n\t\t\tforeach ($table as $t)\n\t\t\t{\n\t\t\t\t$this->_track_aliases($t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Does the string contain a comma?  If so, we need to separate\n\t\t// the string into discreet statements\n\t\tif (strpos($table, ',') !== FALSE)\n\t\t{\n\t\t\treturn $this->_track_aliases(explode(',', $table));\n\t\t}\n\n\t\t// if a table alias is used we can recognize it by a space\n\t\tif (strpos($table, ' ') !== FALSE)\n\t\t{\n\t\t\t// if the alias is written with the AS keyword, remove it\n\t\t\t$table = preg_replace('/\\s+AS\\s+/i', ' ', $table);\n\n\t\t\t// Grab the alias\n\t\t\t$table = trim(strrchr($table, ' '));\n\n\t\t\t// Store the alias, if it doesn't already exist\n\t\t\tif ( ! in_array($table, $this->qb_aliased_tables, TRUE))\n\t\t\t{\n\t\t\t\t$this->qb_aliased_tables[] = $table;\n\t\t\t\tif ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE))\n\t\t\t\t{\n\t\t\t\t\t$this->qb_cache_aliased_tables[] = $table;\n\t\t\t\t\t$this->qb_cache_exists[] = 'aliased_tables';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile the SELECT statement\n\t *\n\t * Generates a query string based on which functions were used.\n\t * Should not be called directly.\n\t *\n\t * @param\tbool\t$select_override\n\t * @return\tstring\n\t */\n\tprotected function _compile_select($select_override = FALSE)\n\t{\n\t\t// Combine any cached components with the current statements\n\t\t$this->_merge_cache();\n\n\t\t// Write the \"select\" portion of the query\n\t\tif ($select_override !== FALSE)\n\t\t{\n\t\t\t$sql = $select_override;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$sql = ( ! $this->qb_distinct) ? 'SELECT ' : 'SELECT DISTINCT ';\n\n\t\t\tif (count($this->qb_select) === 0)\n\t\t\t{\n\t\t\t\t$sql .= '*';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Cycle through the \"select\" portion of the query and prep each column name.\n\t\t\t\t// The reason we protect identifiers here rather than in the select() function\n\t\t\t\t// is because until the user calls the from() function we don't know if there are aliases\n\t\t\t\tforeach ($this->qb_select as $key => $val)\n\t\t\t\t{\n\t\t\t\t\t$no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL;\n\t\t\t\t\t$this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape);\n\t\t\t\t}\n\n\t\t\t\t$sql .= implode(', ', $this->qb_select);\n\t\t\t}\n\t\t}\n\n\t\t// Write the \"FROM\" portion of the query\n\t\tif (count($this->qb_from) > 0)\n\t\t{\n\t\t\t$sql .= \"\\nFROM \".$this->_from_tables();\n\t\t}\n\n\t\t// Write the \"JOIN\" portion of the query\n\t\tif (count($this->qb_join) > 0)\n\t\t{\n\t\t\t$sql .= \"\\n\".implode(\"\\n\", $this->qb_join);\n\t\t}\n\n\t\t$sql .= $this->_compile_wh('qb_where')\n\t\t\t.$this->_compile_group_by()\n\t\t\t.$this->_compile_wh('qb_having')\n\t\t\t.$this->_compile_order_by(); // ORDER BY\n\n\t\t// LIMIT\n\t\tif ($this->qb_limit !== FALSE OR $this->qb_offset)\n\t\t{\n\t\t\treturn $this->_limit($sql.\"\\n\");\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile WHERE, HAVING statements\n\t *\n\t * Escapes identifiers in WHERE and HAVING statements at execution time.\n\t *\n\t * Required so that aliases are tracked properly, regardless of whether\n\t * where(), or_where(), having(), or_having are called prior to from(),\n\t * join() and dbprefix is added only if needed.\n\t *\n\t * @param\tstring\t$qb_key\t'qb_where' or 'qb_having'\n\t * @return\tstring\tSQL statement\n\t */\n\tprotected function _compile_wh($qb_key)\n\t{\n\t\tif (count($this->$qb_key) > 0)\n\t\t{\n\t\t\tfor ($i = 0, $c = count($this->$qb_key); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t// Is this condition already compiled?\n\t\t\t\tif (is_string($this->{$qb_key}[$i]))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telseif ($this->{$qb_key}[$i]['escape'] === FALSE)\n\t\t\t\t{\n\t\t\t\t\t$this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition'].(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : '');\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Split multiple conditions\n\t\t\t\t$conditions = preg_split(\n\t\t\t\t\t'/((?:^|\\s+)AND\\s+|(?:^|\\s+)OR\\s+)/i',\n\t\t\t\t\t$this->{$qb_key}[$i]['condition'],\n\t\t\t\t\t-1,\n\t\t\t\t\tPREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY\n\t\t\t\t);\n\n\t\t\t\tfor ($ci = 0, $cc = count($conditions); $ci < $cc; $ci++)\n\t\t\t\t{\n\t\t\t\t\tif (($op = $this->_get_operator($conditions[$ci])) === FALSE\n\t\t\t\t\t\tOR ! preg_match('/^(\\(?)(.*)('.preg_quote($op, '/').')\\s*(.*(?<!\\)))?(\\)?)$/i', $conditions[$ci], $matches))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// $matches = array(\n\t\t\t\t\t//\t0 => '(test <= foo)',\t/* the whole thing */\n\t\t\t\t\t//\t1 => '(',\t\t/* optional */\n\t\t\t\t\t//\t2 => 'test',\t\t/* the field name */\n\t\t\t\t\t//\t3 => ' <= ',\t\t/* $op */\n\t\t\t\t\t//\t4 => 'foo',\t\t/* optional, if $op is e.g. 'IS NULL' */\n\t\t\t\t\t//\t5 => ')'\t\t/* optional */\n\t\t\t\t\t// );\n\n\t\t\t\t\tif ( ! empty($matches[4]))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->_is_literal($matches[4]) OR $matches[4] = $this->protect_identifiers(trim($matches[4]));\n\t\t\t\t\t\t$matches[4] = ' '.$matches[4];\n\t\t\t\t\t}\n\n\t\t\t\t\t$conditions[$ci] = $matches[1].$this->protect_identifiers(trim($matches[2]))\n\t\t\t\t\t\t.' '.trim($matches[3]).$matches[4].$matches[5];\n\t\t\t\t}\n\n\t\t\t\t$this->{$qb_key}[$i] = implode('', $conditions).(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : '');\n\t\t\t}\n\n\t\t\treturn ($qb_key === 'qb_having' ? \"\\nHAVING \" : \"\\nWHERE \")\n\t\t\t\t.implode(\"\\n\", $this->$qb_key);\n\t\t}\n\n\t\treturn '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile GROUP BY\n\t *\n\t * Escapes identifiers in GROUP BY statements at execution time.\n\t *\n\t * Required so that aliases are tracked properly, regardless of whether\n\t * group_by() is called prior to from(), join() and dbprefix is added\n\t * only if needed.\n\t *\n\t * @return\tstring\tSQL statement\n\t */\n\tprotected function _compile_group_by()\n\t{\n\t\tif (count($this->qb_groupby) > 0)\n\t\t{\n\t\t\tfor ($i = 0, $c = count($this->qb_groupby); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t// Is it already compiled?\n\t\t\t\tif (is_string($this->qb_groupby[$i]))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$this->qb_groupby[$i] = ($this->qb_groupby[$i]['escape'] === FALSE OR $this->_is_literal($this->qb_groupby[$i]['field']))\n\t\t\t\t\t? $this->qb_groupby[$i]['field']\n\t\t\t\t\t: $this->protect_identifiers($this->qb_groupby[$i]['field']);\n\t\t\t}\n\n\t\t\treturn \"\\nGROUP BY \".implode(', ', $this->qb_groupby);\n\t\t}\n\n\t\treturn '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile ORDER BY\n\t *\n\t * Escapes identifiers in ORDER BY statements at execution time.\n\t *\n\t * Required so that aliases are tracked properly, regardless of whether\n\t * order_by() is called prior to from(), join() and dbprefix is added\n\t * only if needed.\n\t *\n\t * @return\tstring\tSQL statement\n\t */\n\tprotected function _compile_order_by()\n\t{\n\t\tif (empty($this->qb_orderby))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\tfor ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_string($this->qb_orderby[$i]))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field']))\n\t\t\t{\n\t\t\t\t$this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']);\n\t\t\t}\n\n\t\t\t$this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction'];\n\t\t}\n\n\t\treturn \"\\nORDER BY \".implode(', ', $this->qb_orderby);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Object to Array\n\t *\n\t * Takes an object as input and converts the class variables to array key/vals\n\t *\n\t * @param\tobject\n\t * @return\tarray\n\t */\n\tprotected function _object_to_array($object)\n\t{\n\t\tif ( ! is_object($object))\n\t\t{\n\t\t\treturn $object;\n\t\t}\n\n\t\t$array = array();\n\t\tforeach (get_object_vars($object) as $key => $val)\n\t\t{\n\t\t\t// There are some built in keys we need to ignore for this conversion\n\t\t\tif ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name')\n\t\t\t{\n\t\t\t\t$array[$key] = $val;\n\t\t\t}\n\t\t}\n\n\t\treturn $array;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Object to Array\n\t *\n\t * Takes an object as input and converts the class variables to array key/vals\n\t *\n\t * @param\tobject\n\t * @return\tarray\n\t */\n\tprotected function _object_to_array_batch($object)\n\t{\n\t\tif ( ! is_object($object))\n\t\t{\n\t\t\treturn $object;\n\t\t}\n\n\t\t$array = array();\n\t\t$out = get_object_vars($object);\n\t\t$fields = array_keys($out);\n\n\t\tforeach ($fields as $val)\n\t\t{\n\t\t\t// There are some built in keys we need to ignore for this conversion\n\t\t\tif ($val !== '_parent_name')\n\t\t\t{\n\t\t\t\t$i = 0;\n\t\t\t\tforeach ($out[$val] as $data)\n\t\t\t\t{\n\t\t\t\t\t$array[$i++][$val] = $data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $array;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Start Cache\n\t *\n\t * Starts QB caching\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function start_cache()\n\t{\n\t\t$this->qb_caching = TRUE;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Stop Cache\n\t *\n\t * Stops QB caching\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function stop_cache()\n\t{\n\t\t$this->qb_caching = FALSE;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Flush Cache\n\t *\n\t * Empties the QB cache\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function flush_cache()\n\t{\n\t\t$this->_reset_run(array(\n\t\t\t'qb_cache_select'\t\t=> array(),\n\t\t\t'qb_cache_from'\t\t\t=> array(),\n\t\t\t'qb_cache_join'\t\t\t=> array(),\n\t\t\t'qb_cache_where'\t\t=> array(),\n\t\t\t'qb_cache_groupby'\t\t=> array(),\n\t\t\t'qb_cache_having'\t\t=> array(),\n\t\t\t'qb_cache_orderby'\t\t=> array(),\n\t\t\t'qb_cache_set'\t\t\t=> array(),\n\t\t\t'qb_cache_exists'\t\t=> array(),\n\t\t\t'qb_cache_no_escape'\t=> array(),\n\t\t\t'qb_cache_aliased_tables'\t=> array()\n\t\t));\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Merge Cache\n\t *\n\t * When called, this function merges any cached QB arrays with\n\t * locally called ones.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _merge_cache()\n\t{\n\t\tif (count($this->qb_cache_exists) === 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\telseif (in_array('select', $this->qb_cache_exists, TRUE))\n\t\t{\n\t\t\t$qb_no_escape = $this->qb_cache_no_escape;\n\t\t}\n\n\t\tforeach (array_unique($this->qb_cache_exists) as $val) // select, from, etc.\n\t\t{\n\t\t\t$qb_variable\t= 'qb_'.$val;\n\t\t\t$qb_cache_var\t= 'qb_cache_'.$val;\n\t\t\t$qb_new \t= $this->$qb_cache_var;\n\n\t\t\tfor ($i = 0, $c = count($this->$qb_variable); $i < $c; $i++)\n\t\t\t{\n\t\t\t\tif ( ! in_array($this->{$qb_variable}[$i], $qb_new, TRUE))\n\t\t\t\t{\n\t\t\t\t\t$qb_new[] = $this->{$qb_variable}[$i];\n\t\t\t\t\tif ($val === 'select')\n\t\t\t\t\t{\n\t\t\t\t\t\t$qb_no_escape[] = $this->qb_no_escape[$i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->$qb_variable = $qb_new;\n\t\t\tif ($val === 'select')\n\t\t\t{\n\t\t\t\t$this->qb_no_escape = $qb_no_escape;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is literal\n\t *\n\t * Determines if a string represents a literal value or a field name\n\t *\n\t * @param\tstring\t$str\n\t * @return\tbool\n\t */\n\tprotected function _is_literal($str)\n\t{\n\t\t$str = trim($str);\n\n\t\tif (empty($str) OR ctype_digit($str) OR (string) (float) $str === $str OR in_array(strtoupper($str), array('TRUE', 'FALSE'), TRUE))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tstatic $_str;\n\n\t\tif (empty($_str))\n\t\t{\n\t\t\t$_str = ($this->_escape_char !== '\"')\n\t\t\t\t? array('\"', \"'\") : array(\"'\");\n\t\t}\n\n\t\treturn in_array($str[0], $_str, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reset Query Builder values.\n\t *\n\t * Publicly-visible method to reset the QB values.\n\t *\n\t * @return\tCI_DB_query_builder\n\t */\n\tpublic function reset_query()\n\t{\n\t\t$this->_reset_select();\n\t\t$this->_reset_write();\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Resets the query builder values.  Called by the get() function\n\t *\n\t * @param\tarray\tAn array of fields to reset\n\t * @return\tvoid\n\t */\n\tprotected function _reset_run($qb_reset_items)\n\t{\n\t\tforeach ($qb_reset_items as $item => $default_value)\n\t\t{\n\t\t\t$this->$item = $default_value;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Resets the query builder values.  Called by the get() function\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _reset_select()\n\t{\n\t\t$this->_reset_run(array(\n\t\t\t'qb_select'\t\t=> array(),\n\t\t\t'qb_from'\t\t=> array(),\n\t\t\t'qb_join'\t\t=> array(),\n\t\t\t'qb_where'\t\t=> array(),\n\t\t\t'qb_groupby'\t\t=> array(),\n\t\t\t'qb_having'\t\t=> array(),\n\t\t\t'qb_orderby'\t\t=> array(),\n\t\t\t'qb_aliased_tables'\t=> array(),\n\t\t\t'qb_no_escape'\t\t=> array(),\n\t\t\t'qb_distinct'\t\t=> FALSE,\n\t\t\t'qb_limit'\t\t=> FALSE,\n\t\t\t'qb_offset'\t\t=> FALSE\n\t\t));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Resets the query builder \"write\" values.\n\t *\n\t * Called by the insert() update() insert_batch() update_batch() and delete() functions\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _reset_write()\n\t{\n\t\t$this->_reset_run(array(\n\t\t\t'qb_set'\t=> array(),\n\t\t\t'qb_set_ub'\t=> array(),\n\t\t\t'qb_from'\t=> array(),\n\t\t\t'qb_join'\t=> array(),\n\t\t\t'qb_where'\t=> array(),\n\t\t\t'qb_orderby'\t=> array(),\n\t\t\t'qb_keys'\t=> array(),\n\t\t\t'qb_limit'\t=> FALSE\n\t\t));\n\t}\n\n}\n"
  },
  {
    "path": "system/database/DB_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Database Result Class\n *\n * This is the platform-independent result class.\n * This class will not be called directly. Rather, the adapter\n * class for the specific database will extend and instantiate it.\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_result {\n\n\t/**\n\t * Connection ID\n\t *\n\t * @var\tresource|object\n\t */\n\tpublic $conn_id;\n\n\t/**\n\t * Result ID\n\t *\n\t * @var\tresource|object\n\t */\n\tpublic $result_id;\n\n\t/**\n\t * Result Array\n\t *\n\t * @var\tarray[]\n\t */\n\tpublic $result_array\t\t\t= array();\n\n\t/**\n\t * Result Object\n\t *\n\t * @var\tobject[]\n\t */\n\tpublic $result_object\t\t\t= array();\n\n\t/**\n\t * Custom Result Object\n\t *\n\t * @var\tobject[]\n\t */\n\tpublic $custom_result_object\t\t= array();\n\n\t/**\n\t * Current Row index\n\t *\n\t * @var\tint\n\t */\n\tpublic $current_row\t\t\t= 0;\n\n\t/**\n\t * Number of rows\n\t *\n\t * @var\tint\n\t */\n\tpublic $num_rows;\n\n\t/**\n\t * Row data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $row_data;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tobject\t$driver_object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$driver_object)\n\t{\n\t\t$this->conn_id = $driver_object->conn_id;\n\t\t$this->result_id = $driver_object->result_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\tif (is_int($this->num_rows))\n\t\t{\n\t\t\treturn $this->num_rows;\n\t\t}\n\t\telseif (count($this->result_array) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = count($this->result_array);\n\t\t}\n\t\telseif (count($this->result_object) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = count($this->result_object);\n\t\t}\n\n\t\treturn $this->num_rows = count($this->result_array());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Query result. Acts as a wrapper function for the following functions.\n\t *\n\t * @param\tstring\t$type\t'object', 'array' or a custom class name\n\t * @return\tarray\n\t */\n\tpublic function result($type = 'object')\n\t{\n\t\tif ($type === 'array')\n\t\t{\n\t\t\treturn $this->result_array();\n\t\t}\n\t\telseif ($type === 'object')\n\t\t{\n\t\t\treturn $this->result_object();\n\t\t}\n\n\t\treturn $this->custom_result_object($type);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Custom query result.\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tarray\n\t */\n\tpublic function custom_result_object($class_name)\n\t{\n\t\tif (isset($this->custom_result_object[$class_name]))\n\t\t{\n\t\t\treturn $this->custom_result_object[$class_name];\n\t\t}\n\t\telseif ( ! $this->result_id OR $this->num_rows === 0)\n\t\t{\n\t\t\treturn array();\n\t\t}\n\n\t\t// Don't fetch the result set again if we already have it\n\t\t$_data = NULL;\n\t\tif (($c = count($this->result_array)) > 0)\n\t\t{\n\t\t\t$_data = 'result_array';\n\t\t}\n\t\telseif (($c = count($this->result_object)) > 0)\n\t\t{\n\t\t\t$_data = 'result_object';\n\t\t}\n\n\t\tif ($_data !== NULL)\n\t\t{\n\t\t\tfor ($i = 0; $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$this->custom_result_object[$class_name][$i] = new $class_name();\n\n\t\t\t\tforeach ($this->{$_data}[$i] as $key => $value)\n\t\t\t\t{\n\t\t\t\t\t$this->custom_result_object[$class_name][$i]->$key = $value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $this->custom_result_object[$class_name];\n\t\t}\n\n\t\tis_null($this->row_data) OR $this->data_seek(0);\n\t\t$this->custom_result_object[$class_name] = array();\n\n\t\twhile ($row = $this->_fetch_object($class_name))\n\t\t{\n\t\t\t$this->custom_result_object[$class_name][] = $row;\n\t\t}\n\n\t\treturn $this->custom_result_object[$class_name];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Query result. \"object\" version.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function result_object()\n\t{\n\t\tif (count($this->result_object) > 0)\n\t\t{\n\t\t\treturn $this->result_object;\n\t\t}\n\n\t\t// In the event that query caching is on, the result_id variable\n\t\t// will not be a valid resource so we'll simply return an empty\n\t\t// array.\n\t\tif ( ! $this->result_id OR $this->num_rows === 0)\n\t\t{\n\t\t\treturn array();\n\t\t}\n\n\t\tif (($c = count($this->result_array)) > 0)\n\t\t{\n\t\t\tfor ($i = 0; $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$this->result_object[$i] = (object) $this->result_array[$i];\n\t\t\t}\n\n\t\t\treturn $this->result_object;\n\t\t}\n\n\t\tis_null($this->row_data) OR $this->data_seek(0);\n\t\twhile ($row = $this->_fetch_object())\n\t\t{\n\t\t\t$this->result_object[] = $row;\n\t\t}\n\n\t\treturn $this->result_object;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Query result. \"array\" version.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function result_array()\n\t{\n\t\tif (count($this->result_array) > 0)\n\t\t{\n\t\t\treturn $this->result_array;\n\t\t}\n\n\t\t// In the event that query caching is on, the result_id variable\n\t\t// will not be a valid resource so we'll simply return an empty\n\t\t// array.\n\t\tif ( ! $this->result_id OR $this->num_rows === 0)\n\t\t{\n\t\t\treturn array();\n\t\t}\n\n\t\tif (($c = count($this->result_object)) > 0)\n\t\t{\n\t\t\tfor ($i = 0; $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$this->result_array[$i] = (array) $this->result_object[$i];\n\t\t\t}\n\n\t\t\treturn $this->result_array;\n\t\t}\n\n\t\tis_null($this->row_data) OR $this->data_seek(0);\n\t\twhile ($row = $this->_fetch_assoc())\n\t\t{\n\t\t\t$this->result_array[] = $row;\n\t\t}\n\n\t\treturn $this->result_array;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Row\n\t *\n\t * A wrapper method.\n\t *\n\t * @param\tmixed\t$n\n\t * @param\tstring\t$type\t'object' or 'array'\n\t * @return\tmixed\n\t */\n\tpublic function row($n = 0, $type = 'object')\n\t{\n\t\tif ( ! is_numeric($n))\n\t\t{\n\t\t\t// We cache the row data for subsequent uses\n\t\t\tis_array($this->row_data) OR $this->row_data = $this->row_array(0);\n\n\t\t\t// array_key_exists() instead of isset() to allow for NULL values\n\t\t\tif (empty($this->row_data) OR ! array_key_exists($n, $this->row_data))\n\t\t\t{\n\t\t\t\treturn NULL;\n\t\t\t}\n\n\t\t\treturn $this->row_data[$n];\n\t\t}\n\n\t\tif ($type === 'object') return $this->row_object($n);\n\t\telseif ($type === 'array') return $this->row_array($n);\n\n\t\treturn $this->custom_row_object($n, $type);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Assigns an item into a particular column slot\n\t *\n\t * @param\tmixed\t$key\n\t * @param\tmixed\t$value\n\t * @return\tvoid\n\t */\n\tpublic function set_row($key, $value = NULL)\n\t{\n\t\t// We cache the row data for subsequent uses\n\t\tif ( ! is_array($this->row_data))\n\t\t{\n\t\t\t$this->row_data = $this->row_array(0);\n\t\t}\n\n\t\tif (is_array($key))\n\t\t{\n\t\t\tforeach ($key as $k => $v)\n\t\t\t{\n\t\t\t\t$this->row_data[$k] = $v;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif ($key !== '' && $value !== NULL)\n\t\t{\n\t\t\t$this->row_data[$key] = $value;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns a single result row - custom object version\n\t *\n\t * @param\tint\t$n\n\t * @param\tstring\t$type\n\t * @return\tobject\n\t */\n\tpublic function custom_row_object($n, $type)\n\t{\n\t\tisset($this->custom_result_object[$type]) OR $this->custom_result_object[$type] = $this->custom_result_object($type);\n\n\t\tif (count($this->custom_result_object[$type]) === 0)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif ($n !== $this->current_row && isset($this->custom_result_object[$type][$n]))\n\t\t{\n\t\t\t$this->current_row = $n;\n\t\t}\n\n\t\treturn $this->custom_result_object[$type][$this->current_row];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns a single result row - object version\n\t *\n\t * @param\tint\t$n\n\t * @return\tobject\n\t */\n\tpublic function row_object($n = 0)\n\t{\n\t\t$result = $this->result_object();\n\t\tif (count($result) === 0)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif ($n !== $this->current_row && isset($result[$n]))\n\t\t{\n\t\t\t$this->current_row = $n;\n\t\t}\n\n\t\treturn $result[$this->current_row];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns a single result row - array version\n\t *\n\t * @param\tint\t$n\n\t * @return\tarray\n\t */\n\tpublic function row_array($n = 0)\n\t{\n\t\t$result = $this->result_array();\n\t\tif (count($result) === 0)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif ($n !== $this->current_row && isset($result[$n]))\n\t\t{\n\t\t\t$this->current_row = $n;\n\t\t}\n\n\t\treturn $result[$this->current_row];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the \"first\" row\n\t *\n\t * @param\tstring\t$type\n\t * @return\tmixed\n\t */\n\tpublic function first_row($type = 'object')\n\t{\n\t\t$result = $this->result($type);\n\t\treturn (count($result) === 0) ? NULL : $result[0];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the \"last\" row\n\t *\n\t * @param\tstring\t$type\n\t * @return\tmixed\n\t */\n\tpublic function last_row($type = 'object')\n\t{\n\t\t$result = $this->result($type);\n\t\treturn (count($result) === 0) ? NULL : $result[count($result) - 1];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the \"next\" row\n\t *\n\t * @param\tstring\t$type\n\t * @return\tmixed\n\t */\n\tpublic function next_row($type = 'object')\n\t{\n\t\t$result = $this->result($type);\n\t\tif (count($result) === 0)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\treturn isset($result[$this->current_row + 1])\n\t\t\t? $result[++$this->current_row]\n\t\t\t: NULL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns the \"previous\" row\n\t *\n\t * @param\tstring\t$type\n\t * @return\tmixed\n\t */\n\tpublic function previous_row($type = 'object')\n\t{\n\t\t$result = $this->result($type);\n\t\tif (count($result) === 0)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (isset($result[$this->current_row - 1]))\n\t\t{\n\t\t\t--$this->current_row;\n\t\t}\n\t\treturn $result[$this->current_row];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an unbuffered row and move pointer to next row\n\t *\n\t * @param\tstring\t$type\t'array', 'object' or a custom class name\n\t * @return\tmixed\n\t */\n\tpublic function unbuffered_row($type = 'object')\n\t{\n\t\tif ($type === 'array')\n\t\t{\n\t\t\treturn $this->_fetch_assoc();\n\t\t}\n\t\telseif ($type === 'object')\n\t\t{\n\t\t\treturn $this->_fetch_object();\n\t\t}\n\n\t\treturn $this->_fetch_object($type);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * The following methods are normally overloaded by the identically named\n\t * methods in the platform-specific driver -- except when query caching\n\t * is used. When caching is enabled we do not load the other driver.\n\t * These functions are primarily here to prevent undefined function errors\n\t * when a cached result object is in use. They are not otherwise fully\n\t * operational due to the unavailability of the database resource IDs with\n\t * cached results.\n\t */\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn 0;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names.\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\treturn array();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data.\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\treturn array();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\t$this->result_id = FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array.\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn array();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object.\n\t *\n\t * Overridden by driver result classes.\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn new $class_name();\n\t}\n\n}\n"
  },
  {
    "path": "system/database/DB_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Database Utility Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nabstract class CI_DB_utility {\n\n\t/**\n\t * Database object\n\t *\n\t * @var\tobject\n\t */\n\tprotected $db;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t\t= FALSE;\n\n\t/**\n\t * OPTIMIZE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_optimize_table\t= FALSE;\n\n\t/**\n\t * REPAIR TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_repair_table\t= FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$db\tDatabase object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\t$this->db =& $db;\n\t\tlog_message('info', 'Database Utility Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List databases\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_databases()\n\t{\n\t\t// Is there a cached result?\n\t\tif (isset($this->db->data_cache['db_names']))\n\t\t{\n\t\t\treturn $this->db->data_cache['db_names'];\n\t\t}\n\t\telseif ($this->_list_databases === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\t$this->db->data_cache['db_names'] = array();\n\n\t\t$query = $this->db->query($this->_list_databases);\n\t\tif ($query === FALSE)\n\t\t{\n\t\t\treturn $this->db->data_cache['db_names'];\n\t\t}\n\n\t\tfor ($i = 0, $query = $query->result_array(), $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$this->db->data_cache['db_names'][] = current($query[$i]);\n\t\t}\n\n\t\treturn $this->db->data_cache['db_names'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determine if a particular database exists\n\t *\n\t * @param\tstring\t$database_name\n\t * @return\tbool\n\t */\n\tpublic function database_exists($database_name)\n\t{\n\t\treturn in_array($database_name, $this->list_databases());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Optimize Table\n\t *\n\t * @param\tstring\t$table_name\n\t * @return\tmixed\n\t */\n\tpublic function optimize_table($table_name)\n\t{\n\t\tif ($this->_optimize_table === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\t$query = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name)));\n\t\tif ($query !== FALSE)\n\t\t{\n\t\t\t$query = $query->result_array();\n\t\t\treturn current($query);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Optimize Database\n\t *\n\t * @return\tmixed\n\t */\n\tpublic function optimize_database()\n\t{\n\t\tif ($this->_optimize_table === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\t$result = array();\n\t\tforeach ($this->db->list_tables() as $table_name)\n\t\t{\n\t\t\t$res = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name)));\n\t\t\tif (is_bool($res))\n\t\t\t{\n\t\t\t\treturn $res;\n\t\t\t}\n\n\t\t\t// Build the result array...\n\t\t\t$res = $res->result_array();\n\t\t\t$res = current($res);\n\t\t\t$key = str_replace($this->db->database.'.', '', current($res));\n\t\t\t$keys = array_keys($res);\n\t\t\tunset($res[$keys[0]]);\n\n\t\t\t$result[$key] = $res;\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Repair Table\n\t *\n\t * @param\tstring\t$table_name\n\t * @return\tmixed\n\t */\n\tpublic function repair_table($table_name)\n\t{\n\t\tif ($this->_repair_table === FALSE)\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;\n\t\t}\n\n\t\t$query = $this->db->query(sprintf($this->_repair_table, $this->db->escape_identifiers($table_name)));\n\t\tif (is_bool($query))\n\t\t{\n\t\t\treturn $query;\n\t\t}\n\n\t\t$query = $query->result_array();\n\t\treturn current($query);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate CSV from a query result object\n\t *\n\t * @param\tobject\t$query\t\tQuery result object\n\t * @param\tstring\t$delim\t\tDelimiter (default: ,)\n\t * @param\tstring\t$newline\tNewline character (default: \\n)\n\t * @param\tstring\t$enclosure\tEnclosure (default: \")\n\t * @return\tstring\n\t */\n\tpublic function csv_from_result($query, $delim = ',', $newline = \"\\n\", $enclosure = '\"')\n\t{\n\t\tif ( ! is_object($query) OR ! method_exists($query, 'list_fields'))\n\t\t{\n\t\t\tshow_error('You must submit a valid result object');\n\t\t}\n\n\t\t$out = '';\n\t\t// First generate the headings from the table column names\n\t\tforeach ($query->list_fields() as $name)\n\t\t{\n\t\t\t$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;\n\t\t}\n\n\t\t$out = substr($out, 0, -strlen($delim)).$newline;\n\n\t\t// Next blast through the result array and build out the rows\n\t\twhile ($row = $query->unbuffered_row('array'))\n\t\t{\n\t\t\t$line = array();\n\t\t\tforeach ($row as $item)\n\t\t\t{\n\t\t\t\t$line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, (string) $item).$enclosure;\n\t\t\t}\n\t\t\t$out .= implode($delim, $line).$newline;\n\t\t}\n\n\t\treturn $out;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate XML data from a query result object\n\t *\n\t * @param\tobject\t$query\tQuery result object\n\t * @param\tarray\t$params\tAny preferences\n\t * @return\tstring\n\t */\n\tpublic function xml_from_result($query, $params = array())\n\t{\n\t\tif ( ! is_object($query) OR ! method_exists($query, 'list_fields'))\n\t\t{\n\t\t\tshow_error('You must submit a valid result object');\n\t\t}\n\n\t\t// Set our default values\n\t\tforeach (array('root' => 'root', 'element' => 'element', 'newline' => \"\\n\", 'tab' => \"\\t\") as $key => $val)\n\t\t{\n\t\t\tif ( ! isset($params[$key]))\n\t\t\t{\n\t\t\t\t$params[$key] = $val;\n\t\t\t}\n\t\t}\n\n\t\t// Create variables for convenience\n\t\textract($params);\n\n\t\t// Load the xml helper\n\t\tget_instance()->load->helper('xml');\n\n\t\t// Generate the result\n\t\t$xml = '<'.$root.'>'.$newline;\n\t\twhile ($row = $query->unbuffered_row())\n\t\t{\n\t\t\t$xml .= $tab.'<'.$element.'>'.$newline;\n\t\t\tforeach ($row as $key => $val)\n\t\t\t{\n\t\t\t\t$xml .= $tab.$tab.'<'.$key.'>'.xml_convert($val).'</'.$key.'>'.$newline;\n\t\t\t}\n\t\t\t$xml .= $tab.'</'.$element.'>'.$newline;\n\t\t}\n\n\t\treturn $xml.'</'.$root.'>'.$newline;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database Backup\n\t *\n\t * @param\tarray\t$params\n\t * @return\tstring\n\t */\n\tpublic function backup($params = array())\n\t{\n\t\t// If the parameters have not been submitted as an\n\t\t// array then we know that it is simply the table\n\t\t// name, which is a valid short cut.\n\t\tif (is_string($params))\n\t\t{\n\t\t\t$params = array('tables' => $params);\n\t\t}\n\n\t\t// Set up our default preferences\n\t\t$prefs = array(\n\t\t\t'tables'\t\t=> array(),\n\t\t\t'ignore'\t\t=> array(),\n\t\t\t'filename'\t\t=> '',\n\t\t\t'format'\t\t=> 'gzip', // gzip, zip, txt\n\t\t\t'add_drop'\t\t=> TRUE,\n\t\t\t'add_insert'\t\t=> TRUE,\n\t\t\t'newline'\t\t=> \"\\n\",\n\t\t\t'foreign_key_checks'\t=> TRUE\n\t\t);\n\n\t\t// Did the user submit any preferences? If so set them....\n\t\tif (count($params) > 0)\n\t\t{\n\t\t\tforeach ($prefs as $key => $val)\n\t\t\t{\n\t\t\t\tif (isset($params[$key]))\n\t\t\t\t{\n\t\t\t\t\t$prefs[$key] = $params[$key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Are we backing up a complete database or individual tables?\n\t\t// If no table names were submitted we'll fetch the entire table list\n\t\tif (count($prefs['tables']) === 0)\n\t\t{\n\t\t\t$prefs['tables'] = $this->db->list_tables();\n\t\t}\n\n\t\t// Validate the format\n\t\tif ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))\n\t\t{\n\t\t\t$prefs['format'] = 'txt';\n\t\t}\n\n\t\t// Is the encoder supported? If not, we'll either issue an\n\t\t// error or use plain text depending on the debug settings\n\t\tif (($prefs['format'] === 'gzip' && ! function_exists('gzencode'))\n\t\t\tOR ($prefs['format'] === 'zip' && ! function_exists('gzcompress')))\n\t\t{\n\t\t\tif ($this->db->db_debug)\n\t\t\t{\n\t\t\t\treturn $this->db->display_error('db_unsupported_compression');\n\t\t\t}\n\n\t\t\t$prefs['format'] = 'txt';\n\t\t}\n\n\t\t// Was a Zip file requested?\n\t\tif ($prefs['format'] === 'zip')\n\t\t{\n\t\t\t// Set the filename if not provided (only needed with Zip files)\n\t\t\tif ($prefs['filename'] === '')\n\t\t\t{\n\t\t\t\t$prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database)\n\t\t\t\t\t\t\t.date('Y-m-d_H-i', time()).'.sql';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// If they included the .zip file extension we'll remove it\n\t\t\t\tif (preg_match('|.+?\\.zip$|', $prefs['filename']))\n\t\t\t\t{\n\t\t\t\t\t$prefs['filename'] = str_replace('.zip', '', $prefs['filename']);\n\t\t\t\t}\n\n\t\t\t\t// Tack on the \".sql\" file extension if needed\n\t\t\t\tif ( ! preg_match('|.+?\\.sql$|', $prefs['filename']))\n\t\t\t\t{\n\t\t\t\t\t$prefs['filename'] .= '.sql';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Load the Zip class and output it\n\t\t\t$CI =& get_instance();\n\t\t\t$CI->load->library('zip');\n\t\t\t$CI->zip->add_data($prefs['filename'], $this->_backup($prefs));\n\t\t\treturn $CI->zip->get_zip();\n\t\t}\n\t\telseif ($prefs['format'] === 'txt') // Was a text file requested?\n\t\t{\n\t\t\treturn $this->_backup($prefs);\n\t\t}\n\t\telseif ($prefs['format'] === 'gzip') // Was a Gzip file requested?\n\t\t{\n\t\t\treturn gzencode($this->_backup($prefs));\n\t\t}\n\n\t\treturn;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/cubrid/cubrid_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CUBRID Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEsen Sagynov\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_cubrid_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'cubrid';\n\n\t/**\n\t * Auto-commit flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $auto_commit = TRUE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '`';\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM(%d)');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:[^:]*:[^:]*:(\\?.+)?$/', $this->dsn, $matches))\n\t\t{\n\t\t\tif (stripos($matches[2], 'autocommit=off') !== FALSE)\n\t\t\t{\n\t\t\t\t$this->auto_commit = FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If no port is defined by the user, use the default value\n\t\t\tempty($this->port) OR $this->port = 33000;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tif (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\\?.+)?$/', $this->dsn, $matches))\n\t\t{\n\t\t\t$func = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url';\n\t\t\treturn ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '')\n\t\t\t\t? $func($this->dsn, $this->username, $this->password)\n\t\t\t\t: $func($this->dsn);\n\t\t}\n\n\t\t$func = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect';\n\t\treturn ($this->username !== '')\n\t\t\t? $func($this->hostname, $this->port, $this->database, $this->username, $this->password)\n\t\t\t: $func($this->hostname, $this->port, $this->database);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reconnect\n\t *\n\t * Keep / reestablish the db connection if no queries have been\n\t * sent for a length of time exceeding the server's idle timeout\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function reconnect()\n\t{\n\t\tif (cubrid_ping($this->conn_id) === FALSE)\n\t\t{\n\t\t\t$this->conn_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\treturn ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE)\n\t\t\t? FALSE\n\t\t\t: $this->data_cache['version'] = $version;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn cubrid_query($sql, $this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\tif (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ($autocommit === TRUE)\n\t\t{\n\t\t\treturn cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\tif ( ! cubrid_commit($this->conn_id))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))\n\t\t{\n\t\t\treturn cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\tif ( ! cubrid_rollback($this->conn_id))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))\n\t\t{\n\t\t\tcubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn cubrid_real_escape_string($str, $this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn cubrid_affected_rows();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tint\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn cubrid_insert_id($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SHOW TABLES';\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%'\";\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->Field;\n\n\t\t\tsscanf($query[$i]->Type, '%[a-z](%d)',\n\t\t\t\t$retval[$i]->type,\n\t\t\t\t$retval[$i]->max_length\n\t\t\t);\n\n\t\t\t$retval[$i]->default\t\t= $query[$i]->Default;\n\t\t\t$retval[$i]->primary_key\t= (int) ($query[$i]->Key === 'PRI');\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FROM tables\n\t *\n\t * Groups tables in FROM clauses if needed, so there is no confusion\n\t * about operator precedence.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _from_tables()\n\t{\n\t\tif ( ! empty($this->qb_join) && count($this->qb_from) > 1)\n\t\t{\n\t\t\treturn '('.implode(', ', $this->qb_from).')';\n\t\t}\n\n\t\treturn implode(', ', $this->qb_from);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tcubrid_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/cubrid/cubrid_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CUBRID Forge Class\n *\n * @category\tDatabase\n * @author\t\tEsen Sagynov\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_cubrid_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= FALSE;\n\n\t/**\n\t * CREATE TABLE keys flag\n\t *\n\t * Whether table keys are created from within the\n\t * CREATE TABLE statement.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_create_table_keys\t= TRUE;\n\n\t/**\n\t * DROP DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_database\t= FALSE;\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'SHORT'\t\t=> 'INTEGER',\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'INTEGER'\t=> 'BIGINT',\n\t\t'BIGINT'\t=> 'NUMERIC',\n\t\t'FLOAT'\t\t=> 'DOUBLE',\n\t\t'REAL'\t\t=> 'DOUBLE'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('DROP', 'ADD'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' CHANGE '.$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE ';\n\t\t\t\t$sqls[] = $sql.$alter_type.$this->_process_column($field[$i]);\n\t\t\t}\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\t$extra_clause = isset($field['after'])\n\t\t\t? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';\n\n\t\tif (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)\n\t\t{\n\t\t\t$extra_clause = ' FIRST';\n\t\t}\n\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['null']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['unique']\n\t\t\t.$extra_clause;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'LONGTEXT':\n\t\t\t\t$attributes['TYPE'] = 'STRING';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process indexes\n\t *\n\t * @param\tstring\t$table\t(ignored)\n\t * @return\tstring\n\t */\n\tprotected function _process_indexes($table)\n\t{\n\t\t$sql = '';\n\n\t\tfor ($i = 0, $c = count($this->keys); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_array($this->keys[$i]))\n\t\t\t{\n\t\t\t\tfor ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)\n\t\t\t\t{\n\t\t\t\t\tif ( ! isset($this->fields[$this->keys[$i][$i2]]))\n\t\t\t\t\t{\n\t\t\t\t\t\tunset($this->keys[$i][$i2]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! isset($this->fields[$this->keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->keys[$i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tis_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);\n\n\t\t\t$sql .= \",\\n\\tKEY \".$this->db->escape_identifiers(implode('_', $this->keys[$i]))\n\t\t\t\t.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';\n\t\t}\n\n\t\t$this->keys = array();\n\n\t\treturn $sql;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/cubrid/cubrid_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CUBRID Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tEsen Sagynov\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_cubrid_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\treturn is_int($this->num_rows)\n\t\t\t? $this->num_rows\n\t\t\t: $this->num_rows = cubrid_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn cubrid_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\treturn cubrid_column_names($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= cubrid_field_name($this->result_id, $i);\n\t\t\t$retval[$i]->type\t\t= cubrid_field_type($this->result_id, $i);\n\t\t\t$retval[$i]->max_length\t\t= cubrid_field_len($this->result_id, $i);\n\t\t\t$retval[$i]->primary_key\t= (int) (strpos(cubrid_field_flags($this->result_id, $i), 'primary_key') !== FALSE);\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_resource($this->result_id) OR\n\t\t\t(get_resource_type($this->result_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->result_id))))\n\t\t{\n\t\t\tcubrid_close_request($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn cubrid_data_seek($this->result_id, $n);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn cubrid_fetch_assoc($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn cubrid_fetch_object($this->result_id, $class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/cubrid/cubrid_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CUBRID Utility Class\n *\n * @category\tDatabase\n * @author\t\tEsen Sagynov\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_cubrid_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_databases()\n\t{\n\t\tif (isset($this->db->data_cache['db_names']))\n\t\t{\n\t\t\treturn $this->db->data_cache['db_names'];\n\t\t}\n\n\t\treturn $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CUBRID Export\n\t *\n\t * @param\tarray\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// No SQL based support in CUBRID as of version 8.4.0. Database or\n\t\t// table backup can be performed using CUBRID Manager\n\t\t// database administration tool.\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/cubrid/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/ibase/ibase_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Firebird/Interbase Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_ibase_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'ibase';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RAND()', 'RAND()');\n\n\t/**\n\t * IBase Transaction status flag\n\t *\n\t * @var\tresource\n\t */\n\tprotected $_ibase_trans;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\treturn ($persistent === TRUE)\n\t\t\t? ibase_pconnect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set)\n\t\t\t: ibase_connect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\tif (($service = ibase_service_attach($this->hostname, $this->username, $this->password)))\n\t\t{\n\t\t\t$this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION);\n\n\t\t\t// Don't keep the service open\n\t\t\tibase_service_detach($service);\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\tif (($trans_handle = ibase_trans($this->conn_id)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_ibase_trans = $trans_handle;\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\tif (ibase_commit($this->_ibase_trans))\n\t\t{\n\t\t\t$this->_ibase_trans = NULL;\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\tif (ibase_rollback($this->_ibase_trans))\n\t\t{\n\t\t\t$this->_ibase_trans = NULL;\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn ibase_affected_rows($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @param\tstring\t$generator_name\n\t * @param\tint\t$inc_by\n\t * @return\tint\n\t */\n\tpublic function insert_id($generator_name, $inc_by = 0)\n\t{\n\t\t//If a generator hasn't been used before it will return 0\n\t\treturn ibase_gen_id('\"'.$generator_name.'\"', $inc_by);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT TRIM(\"RDB$RELATION_NAME\") AS TABLE_NAME FROM \"RDB$RELATIONS\" WHERE \"RDB$RELATION_NAME\" NOT LIKE \\'RDB$%\\' AND \"RDB$RELATION_NAME\" NOT LIKE \\'MON$%\\'';\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' AND TRIM(\"RDB$RELATION_NAME\") AS TABLE_NAME LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT TRIM(\"RDB$FIELD_NAME\") AS COLUMN_NAME FROM \"RDB$RELATION_FIELDS\" WHERE \"RDB$RELATION_NAME\" = '.$this->escape($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT \"rfields\".\"RDB$FIELD_NAME\" AS \"name\",\n\t\t\t\tCASE \"fields\".\"RDB$FIELD_TYPE\"\n\t\t\t\t\tWHEN 7 THEN \\'SMALLINT\\'\n\t\t\t\t\tWHEN 8 THEN \\'INTEGER\\'\n\t\t\t\t\tWHEN 9 THEN \\'QUAD\\'\n\t\t\t\t\tWHEN 10 THEN \\'FLOAT\\'\n\t\t\t\t\tWHEN 11 THEN \\'DFLOAT\\'\n\t\t\t\t\tWHEN 12 THEN \\'DATE\\'\n\t\t\t\t\tWHEN 13 THEN \\'TIME\\'\n\t\t\t\t\tWHEN 14 THEN \\'CHAR\\'\n\t\t\t\t\tWHEN 16 THEN \\'INT64\\'\n\t\t\t\t\tWHEN 27 THEN \\'DOUBLE\\'\n\t\t\t\t\tWHEN 35 THEN \\'TIMESTAMP\\'\n\t\t\t\t\tWHEN 37 THEN \\'VARCHAR\\'\n\t\t\t\t\tWHEN 40 THEN \\'CSTRING\\'\n\t\t\t\t\tWHEN 261 THEN \\'BLOB\\'\n\t\t\t\t\tELSE NULL\n\t\t\t\tEND AS \"type\",\n\t\t\t\t\"fields\".\"RDB$FIELD_LENGTH\" AS \"max_length\",\n\t\t\t\t\"rfields\".\"RDB$DEFAULT_VALUE\" AS \"default\"\n\t\t\tFROM \"RDB$RELATION_FIELDS\" \"rfields\"\n\t\t\t\tJOIN \"RDB$FIELDS\" \"fields\" ON \"rfields\".\"RDB$FIELD_SOURCE\" = \"fields\".\"RDB$FIELD_NAME\"\n\t\t\tWHERE \"rfields\".\"RDB$RELATION_NAME\" = '.$this->escape($table).'\n\t\t\tORDER BY \"rfields\".\"RDB$FIELD_POSITION\"';\n\n\t\treturn (($query = $this->query($sql)) !== FALSE)\n\t\t\t? $query->result_object()\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => ibase_errcode(), 'message' => ibase_errmsg());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'DELETE FROM '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t// Limit clause depends on if Interbase or Firebird\n\t\tif (stripos($this->version(), 'firebird') !== FALSE)\n\t\t{\n\t\t\t$select = 'FIRST '.$this->qb_limit\n\t\t\t\t.($this->qb_offset ? ' SKIP '.$this->qb_offset : '');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$select = 'ROWS '\n\t\t\t\t.($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit);\n\t\t}\n\n\t\treturn preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring|bool\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tibase_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/ibase/ibase_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Interbase/Firebird Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_ibase_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * RENAME TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_rename_table\t= FALSE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INTEGER'\t=> 'INT64',\n\t\t'FLOAT'\t\t=> 'DOUBLE PRECISION'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create database\n\t *\n\t * @param\tstring\t$db_name\n\t * @return\tbool\n\t */\n\tpublic function create_database($db_name)\n\t{\n\t\t// Firebird databases are flat files, so a path is required\n\n\t\t// Hostname is needed for remote access\n\t\tempty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name;\n\n\t\treturn parent::create_database('\"'.$db_name.'\"');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function drop_database($db_name)\n\t{\n\t\tif ( ! ibase_drop_db($this->conn_id))\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t}\n\t\telseif ( ! empty($this->db->data_cache['db_names']))\n\t\t{\n\t\t\t$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE);\n\t\t\tif ($key !== FALSE)\n\t\t\t{\n\t\t\t\tunset($this->db->data_cache['db_names'][$key]);\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('DROP', 'ADD'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif (isset($field[$i]['type']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name'])\n\t\t\t\t\t.' TYPE '.$field[$i]['type'].$field[$i]['length'];\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['default']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' SET DEFAULT '.$field[$i]['default'];\n\t\t\t}\n\n\t\t\tif (isset($field[$i]['null']))\n\t\t\t{\n\t\t\t\t$sqls[] = 'UPDATE \"RDB$RELATION_FIELDS\" SET \"RDB$NULL_FLAG\" = '\n\t\t\t\t\t.($field[$i]['null'] === TRUE ? 'NULL' : '1')\n\t\t\t\t\t.' WHERE \"RDB$FIELD_NAME\" = '.$this->db->escape($field[$i]['name'])\n\t\t\t\t\t.' AND \"RDB$RELATION_NAME\" = '.$this->db->escape($table);\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['new_name']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);\n\t\t\t}\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['null']\n\t\t\t.$field['unique']\n\t\t\t.$field['default'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\treturn;\n\t\t\tcase 'BIGINT':\n\t\t\t\t$attributes['TYPE'] = 'INT64';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\t// Not supported\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/ibase/ibase_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Interbase/Firebird Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_ibase_result extends CI_DB_result {\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn ibase_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tfor ($i = 0, $num_fields = $this->num_fields(); $i < $num_fields; $i++)\n\t\t{\n\t\t\t$info = ibase_field_info($this->result_id, $i);\n\t\t\t$field_names[] = $info['name'];\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$info = ibase_field_info($this->result_id, $i);\n\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $info['name'];\n\t\t\t$retval[$i]->type\t\t= $info['type'];\n\t\t\t$retval[$i]->max_length\t\t= $info['length'];\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tibase_free_result($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn ibase_fetch_assoc($this->result_id, IBASE_FETCH_BLOBS);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\t$row = ibase_fetch_object($this->result_id, IBASE_FETCH_BLOBS);\n\n\t\tif ($class_name === 'stdClass' OR ! $row)\n\t\t{\n\t\t\treturn $row;\n\t\t}\n\n\t\t$class_name = new $class_name();\n\t\tforeach ($row as $key => $value)\n\t\t{\n\t\t\t$class_name->$key = $value;\n\t\t}\n\n\t\treturn $class_name;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/ibase/ibase_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Interbase/Firebird Utility Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_ibase_utility extends CI_DB_utility {\n\n\t/**\n\t * Export\n\t *\n\t * @param\tstring\t$filename\n\t * @return\tmixed\n\t */\n\tprotected function _backup($filename)\n\t{\n\t\tif ($service = ibase_service_attach($this->db->hostname, $this->db->username, $this->db->password))\n\t\t{\n\t\t\t$res = ibase_backup($service, $this->db->database, $filename.'.fbk');\n\n\t\t\t// Close the service connection\n\t\t\tibase_service_detach($service);\n\t\t\treturn $res;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/ibase/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/mssql/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/mssql/mssql_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MS SQL Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mssql_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'mssql';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('NEWID()', 'RAND(%d)');\n\n\t/**\n\t * Quoted identifier flag\n\t *\n\t * Whether to use SQL-92 standard quoted identifier\n\t * (double quotes) or brackets for identifier escaping.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_quoted_identifier = TRUE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Appends the port number to the hostname, if needed.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif ( ! empty($this->port))\n\t\t{\n\t\t\t$this->hostname .= (DIRECTORY_SEPARATOR === '\\\\' ? ',' : ':').$this->port;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\t$this->conn_id = ($persistent)\n\t\t\t\t? mssql_pconnect($this->hostname, $this->username, $this->password)\n\t\t\t\t: mssql_connect($this->hostname, $this->username, $this->password);\n\n\t\tif ( ! $this->conn_id)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// ----------------------------------------------------------------\n\n\t\t// Select the DB... assuming a database name is specified in the config file\n\t\tif ($this->database !== '' && ! $this->db_select())\n\t\t{\n\t\t\tlog_message('error', 'Unable to select database: '.$this->database);\n\n\t\t\treturn ($this->db_debug === TRUE)\n\t\t\t\t? $this->display_error('db_unable_to_select', $this->database)\n\t\t\t\t: FALSE;\n\t\t}\n\n\t\t// Determine how identifiers are escaped\n\t\t$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi');\n\t\t$query = $query->row_array();\n\t\t$this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi'];\n\t\t$this->_escape_char = ($this->_quoted_identifier) ? '\"' : array('[', ']');\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select the database\n\t *\n\t * @param\tstring\t$database\n\t * @return\tbool\n\t */\n\tpublic function db_select($database = '')\n\t{\n\t\tif ($database === '')\n\t\t{\n\t\t\t$database = $this->database;\n\t\t}\n\n\t\t// Note: Escaping is required in the event that the DB name\n\t\t// contains reserved characters.\n\t\tif (mssql_select_db('['.$database.']', $this->conn_id))\n\t\t{\n\t\t\t$this->database = $database;\n\t\t\t$this->data_cache = array();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tmixed\tresource if rows are returned, bool otherwise\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn mssql_query($sql, $this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn $this->simple_query('BEGIN TRAN');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\treturn $this->simple_query('COMMIT TRAN');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\treturn $this->simple_query('ROLLBACK TRAN');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn mssql_rows_affected($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * Returns the last id created in the Identity column.\n\t *\n\t * @return\tstring\n\t */\n\tpublic function insert_id()\n\t{\n\t\t$query = version_compare($this->version(), '8', '>=')\n\t\t\t? 'SELECT SCOPE_IDENTITY() AS last_id'\n\t\t\t: 'SELECT @@IDENTITY AS last_id';\n\n\t\t$query = $this->query($query);\n\t\t$query = $query->row();\n\t\treturn $query->last_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set client character set\n\t *\n\t * @param\tstring\t$charset\n\t * @return\tbool\n\t */\n\tprotected function _db_set_charset($charset)\n\t{\n\t\treturn (ini_set('mssql.charset', $charset) !== FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Version number query string\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _version()\n\t{\n\t\treturn \"SELECT SERVERPROPERTY('ProductVersion') AS ver\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT '.$this->escape_identifiers('name')\n\t\t\t.' FROM '.$this->escape_identifiers('sysobjects')\n\t\t\t.' WHERE '.$this->escape_identifiers('type').\" = 'U'\";\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' AND '.$this->escape_identifiers('name').\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql.' ORDER BY '.$this->escape_identifiers('name');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT COLUMN_NAME\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->COLUMN_NAME;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->DATA_TYPE;\n\t\t\t$retval[$i]->max_length\t\t= ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION;\n\t\t\t$retval[$i]->default\t\t= $query[$i]->COLUMN_DEFAULT;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\t// We need this because the error info is discarded by the\n\t\t// server the first time you request it, and query() already\n\t\t// calls error() once for logging purposes when a query fails.\n\t\tstatic $error = array('code' => 0, 'message' => NULL);\n\n\t\t$message = mssql_get_last_message();\n\t\tif ( ! empty($message))\n\t\t{\n\t\t\t$error['code']    = $this->query('SELECT @@ERROR AS code')->row()->code;\n\t\t\t$error['message'] = $message;\n\t\t}\n\n\t\treturn $error;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE TABLE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\tif ($this->qb_limit)\n\t\t{\n\t\t\treturn 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete';\n\t\t}\n\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t$limit = $this->qb_offset + $this->qb_limit;\n\n\t\t// As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported,\n\t\t// however an ORDER BY clause is required for it to work\n\t\tif (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby))\n\t\t{\n\t\t\t$orderby = $this->_compile_order_by();\n\n\t\t\t// We have to strip the ORDER BY clause\n\t\t\t$sql = trim(substr($sql, 0, strrpos($sql, $orderby)));\n\n\t\t\t// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results\n\t\t\tif (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE)\n\t\t\t{\n\t\t\t\t$select = '*'; // Inevitable\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Use only field names and their aliases, everything else is out of our scope.\n\t\t\t\t$select = array();\n\t\t\t\t$field_regexp = ($this->_quoted_identifier)\n\t\t\t\t\t? '(\"[^\\\"]+\")' : '(\\[[^\\]]+\\])';\n\t\t\t\tfor ($i = 0, $c = count($this->qb_select); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$select[] = preg_match('/(?:\\s|\\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m)\n\t\t\t\t\t\t? $m[1] : $this->qb_select[$i];\n\t\t\t\t}\n\t\t\t\t$select = implode(', ', $select);\n\t\t\t}\n\n\t\t\treturn 'SELECT '.$select.\" FROM (\\n\\n\"\n\t\t\t\t.preg_replace('/^(SELECT( DISTINCT)?)/i', '\\\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql)\n\t\t\t\t.\"\\n\\n) \".$this->escape_identifiers('CI_subquery')\n\t\t\t\t.\"\\nWHERE \".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit;\n\t\t}\n\n\t\treturn preg_replace('/(^\\SELECT (DISTINCT)?)/i','\\\\1 TOP '.$limit.' ', $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring|bool\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\t// Multiple-value inserts are only supported as of SQL Server 2008\n\t\tif (version_compare($this->version(), '10', '>='))\n\t\t{\n\t\t\treturn parent::_insert_batch($table, $keys, $values);\n\t\t}\n\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tmssql_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mssql/mssql_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MS SQL Forge Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mssql_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= \"IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nCREATE TABLE\";\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= \"IF EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nDROP TABLE\";\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT'\t=> 'SMALLINT',\n\t\t'SMALLINT'\t=> 'INT',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'REAL'\t\t=> 'FLOAT'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('ADD', 'DROP'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN ';\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\t$sqls[] = $sql.$this->_process_column($field[$i]);\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tif (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)\n\t\t{\n\t\t\tunset($attributes['CONSTRAINT']);\n\t\t}\n\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INTEGER':\n\t\t\t\t$attributes['TYPE'] = 'INT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['auto_increment'] = ' IDENTITY(1,1)';\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mssql/mssql_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MSSQL Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mssql_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\treturn is_int($this->num_rows)\n\t\t\t? $this->num_rows\n\t\t\t: $this->num_rows = mssql_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn mssql_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tmssql_field_seek($this->result_id, 0);\n\t\twhile ($field = mssql_fetch_field($this->result_id))\n\t\t{\n\t\t\t$field_names[] = $field->name;\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$field = mssql_fetch_field($this->result_id, $i);\n\n\t\t\t$retval[$i]\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t= $field->name;\n\t\t\t$retval[$i]->type\t= $field->type;\n\t\t\t$retval[$i]->max_length\t= $field->max_length;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_resource($this->result_id))\n\t\t{\n\t\t\tmssql_free_result($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn mssql_data_seek($this->result_id, $n);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn mssql_fetch_assoc($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\t$row = mssql_fetch_object($this->result_id);\n\n\t\tif ($class_name === 'stdClass' OR ! $row)\n\t\t{\n\t\t\treturn $row;\n\t\t}\n\n\t\t$class_name = new $class_name();\n\t\tforeach ($row as $key => $value)\n\t\t{\n\t\t\t$class_name->$key = $value;\n\t\t}\n\n\t\treturn $class_name;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mssql/mssql_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MS SQL Utility Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mssql_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t= 'EXEC sp_helpdb'; // Can also be: EXEC sp_databases\n\n\t/**\n\t * OPTIMIZE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_optimize_table\t= 'ALTER INDEX all ON %s REORGANIZE';\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tbool\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysql/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/mysql/mysql_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQL Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysql_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'mysql';\n\n\t/**\n\t * Compression flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $compress = FALSE;\n\n\t/**\n\t * DELETE hack flag\n\t *\n\t * Whether to use the MySQL \"delete hack\" which allows the number\n\t * of affected rows to be shown. Uses a preg_replace when enabled,\n\t * adding a bit more processing to all queries.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $delete_hack = TRUE;\n\n\t/**\n\t * Strict ON flag\n\t *\n\t * Whether we're running in strict SQL mode.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $stricton;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '`';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif ( ! empty($this->port))\n\t\t{\n\t\t\t$this->hostname .= ':'.$this->port;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\t$client_flags = ($this->compress === FALSE) ? 0 : MYSQL_CLIENT_COMPRESS;\n\n\t\tif ($this->encrypt === TRUE)\n\t\t{\n\t\t\t$client_flags = $client_flags | MYSQL_CLIENT_SSL;\n\t\t}\n\n\t\t// Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages\n\t\t$this->conn_id = ($persistent === TRUE)\n\t\t\t? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags)\n\t\t\t: mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags);\n\n\t\t// ----------------------------------------------------------------\n\n\t\t// Select the DB... assuming a database name is specified in the config file\n\t\tif ($this->database !== '' && ! $this->db_select())\n\t\t{\n\t\t\tlog_message('error', 'Unable to select database: '.$this->database);\n\n\t\t\treturn ($this->db_debug === TRUE)\n\t\t\t\t? $this->display_error('db_unable_to_select', $this->database)\n\t\t\t\t: FALSE;\n\t\t}\n\n\t\tif (isset($this->stricton) && is_resource($this->conn_id))\n\t\t{\n\t\t\tif ($this->stricton)\n\t\t\t{\n\t\t\t\t$this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, \",\", \"STRICT_ALL_TABLES\")');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->simple_query(\n\t\t\t\t\t'SET SESSION sql_mode =\n\t\t\t\t\tREPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(\n\t\t\t\t\t@@sql_mode,\n\t\t\t\t\t\"STRICT_ALL_TABLES,\", \"\"),\n\t\t\t\t\t\",STRICT_ALL_TABLES\", \"\"),\n\t\t\t\t\t\"STRICT_ALL_TABLES\", \"\"),\n\t\t\t\t\t\"STRICT_TRANS_TABLES,\", \"\"),\n\t\t\t\t\t\",STRICT_TRANS_TABLES\", \"\"),\n\t\t\t\t\t\"STRICT_TRANS_TABLES\", \"\")'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reconnect\n\t *\n\t * Keep / reestablish the db connection if no queries have been\n\t * sent for a length of time exceeding the server's idle timeout\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function reconnect()\n\t{\n\t\tif (mysql_ping($this->conn_id) === FALSE)\n\t\t{\n\t\t\t$this->conn_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select the database\n\t *\n\t * @param\tstring\t$database\n\t * @return\tbool\n\t */\n\tpublic function db_select($database = '')\n\t{\n\t\tif ($database === '')\n\t\t{\n\t\t\t$database = $this->database;\n\t\t}\n\n\t\tif (mysql_select_db($database, $this->conn_id))\n\t\t{\n\t\t\t$this->database = $database;\n\t\t\t$this->data_cache = array();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set client character set\n\t *\n\t * @param\tstring\t$charset\n\t * @return\tbool\n\t */\n\tprotected function _db_set_charset($charset)\n\t{\n\t\treturn mysql_set_charset($charset, $this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\tif ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $this->data_cache['version'] = $version;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tmixed\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn mysql_query($this->_prep_query($sql), $this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep the query\n\t *\n\t * If needed, each database adapter can prep the query string\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tstring\n\t */\n\tprotected function _prep_query($sql)\n\t{\n\t\t// mysql_affected_rows() returns 0 for \"DELETE FROM TABLE\" queries. This hack\n\t\t// modifies the query so that it a proper number of affected rows is returned.\n\t\tif ($this->delete_hack === TRUE && preg_match('/^\\s*DELETE\\s+FROM\\s+(\\S+)\\s*$/i', $sql))\n\t\t{\n\t\t\treturn trim($sql).' WHERE 1=1';\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\t$this->simple_query('SET AUTOCOMMIT=0');\n\t\treturn $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\tif ($this->simple_query('COMMIT'))\n\t\t{\n\t\t\t$this->simple_query('SET AUTOCOMMIT=1');\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\tif ($this->simple_query('ROLLBACK'))\n\t\t{\n\t\t\t$this->simple_query('SET AUTOCOMMIT=1');\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn mysql_real_escape_string($str, $this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn mysql_affected_rows($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tint\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn mysql_insert_id($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char;\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%'\";\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->Field;\n\n\t\t\tsscanf($query[$i]->Type, '%[a-z](%d)',\n\t\t\t\t$retval[$i]->type,\n\t\t\t\t$retval[$i]->max_length\n\t\t\t);\n\n\t\t\t$retval[$i]->default\t\t= $query[$i]->Default;\n\t\t\t$retval[$i]->primary_key\t= (int) ($query[$i]->Key === 'PRI');\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FROM tables\n\t *\n\t * Groups tables in FROM clauses if needed, so there is no confusion\n\t * about operator precedence.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _from_tables()\n\t{\n\t\tif ( ! empty($this->qb_join) && count($this->qb_from) > 1)\n\t\t{\n\t\t\treturn '('.implode(', ', $this->qb_from).')';\n\t\t}\n\n\t\treturn implode(', ', $this->qb_from);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\t// Error suppression to avoid annoying E_WARNINGs in cases\n\t\t// where the connection has already been closed for some reason.\n\t\t@mysql_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysql/mysql_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQL Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysql_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s';\n\n\t/**\n\t * CREATE TABLE keys flag\n\t *\n\t * Whether table keys are created from within the\n\t * CREATE TABLE statement.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_create_table_keys\t= TRUE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT',\n\t\t'SMALLINT',\n\t\t'MEDIUMINT',\n\t\t'INT',\n\t\t'INTEGER',\n\t\t'BIGINT',\n\t\t'REAL',\n\t\t'DOUBLE',\n\t\t'DOUBLE PRECISION',\n\t\t'FLOAT',\n\t\t'DECIMAL',\n\t\t'NUMERIC'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null = 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CREATE TABLE attributes\n\t *\n\t * @param\tarray\t$attributes\tAssociative array of table attributes\n\t * @return\tstring\n\t */\n\tprotected function _create_table_attr($attributes)\n\t{\n\t\t$sql = '';\n\n\t\tforeach (array_keys($attributes) as $key)\n\t\t{\n\t\t\tif (is_string($key))\n\t\t\t{\n\t\t\t\t$sql .= ' '.strtoupper($key).' = '.$attributes[$key];\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty($this->db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET'))\n\t\t{\n\t\t\t$sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set;\n\t\t}\n\n\t\tif ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE'))\n\t\t{\n\t\t\t$sql .= ' COLLATE = '.$this->db->dbcollat;\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP')\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$field[$i] = ($alter_type === 'ADD')\n\t\t\t\t\t\t? \"\\n\\tADD \".$field[$i]['_literal']\n\t\t\t\t\t\t: \"\\n\\tMODIFY \".$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ($alter_type === 'ADD')\n\t\t\t\t{\n\t\t\t\t\t$field[$i]['_literal'] = \"\\n\\tADD \";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$field[$i]['_literal'] = empty($field[$i]['new_name']) ? \"\\n\\tMODIFY \" : \"\\n\\tCHANGE \";\n\t\t\t\t}\n\n\t\t\t\t$field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]);\n\t\t\t}\n\t\t}\n\n\t\treturn array($sql.implode(',', $field));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\t$extra_clause = isset($field['after'])\n\t\t\t? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';\n\n\t\tif (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)\n\t\t{\n\t\t\t$extra_clause = ' FIRST';\n\t\t}\n\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['null']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['unique']\n\t\t\t.(empty($field['comment']) ? '' : ' COMMENT '.$field['comment'])\n\t\t\t.$extra_clause;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process indexes\n\t *\n\t * @param\tstring\t$table\t(ignored)\n\t * @return\tstring\n\t */\n\tprotected function _process_indexes($table)\n\t{\n\t\t$sql = '';\n\n\t\tfor ($i = 0, $c = count($this->keys); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_array($this->keys[$i]))\n\t\t\t{\n\t\t\t\tfor ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)\n\t\t\t\t{\n\t\t\t\t\tif ( ! isset($this->fields[$this->keys[$i][$i2]]))\n\t\t\t\t\t{\n\t\t\t\t\t\tunset($this->keys[$i][$i2]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! isset($this->fields[$this->keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->keys[$i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tis_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);\n\n\t\t\t$sql .= \",\\n\\tKEY \".$this->db->escape_identifiers(implode('_', $this->keys[$i]))\n\t\t\t\t.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';\n\t\t}\n\n\t\t$this->keys = array();\n\n\t\treturn $sql;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysql/mysql_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQL Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysql_result extends CI_DB_result {\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$driver_object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$driver_object)\n\t{\n\t\tparent::__construct($driver_object);\n\n\t\t// Required, due to mysql_data_seek() causing nightmares\n\t\t// with empty result sets\n\t\t$this->num_rows = mysql_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\treturn $this->num_rows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn mysql_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tmysql_field_seek($this->result_id, 0);\n\t\twhile ($field = mysql_fetch_field($this->result_id))\n\t\t{\n\t\t\t$field_names[] = $field->name;\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= mysql_field_name($this->result_id, $i);\n\t\t\t$retval[$i]->type\t\t= mysql_field_type($this->result_id, $i);\n\t\t\t$retval[$i]->max_length\t\t= mysql_field_len($this->result_id, $i);\n\t\t\t$retval[$i]->primary_key\t= (int) (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') !== FALSE);\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_resource($this->result_id))\n\t\t{\n\t\t\tmysql_free_result($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn $this->num_rows\n\t\t\t? mysql_data_seek($this->result_id, $n)\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn mysql_fetch_assoc($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn mysql_fetch_object($this->result_id, $class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysql/mysql_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQL Utility Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysql_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t= 'SHOW DATABASES';\n\n\t/**\n\t * OPTIMIZE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_optimize_table\t= 'OPTIMIZE TABLE %s';\n\n\t/**\n\t * REPAIR TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_repair_table\t= 'REPAIR TABLE %s';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\tif (count($params) === 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Extract the prefs for simplicity\n\t\textract($params);\n\n\t\t// Build the output\n\t\t$output = '';\n\n\t\t// Do we need to include a statement to disable foreign key checks?\n\t\tif ($foreign_key_checks === FALSE)\n\t\t{\n\t\t\t$output .= 'SET foreign_key_checks = 0;'.$newline;\n\t\t}\n\n\t\tforeach ( (array) $tables as $table)\n\t\t{\n\t\t\t// Is the table in the \"ignore\" list?\n\t\t\tif (in_array($table, (array) $ignore, TRUE))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the table schema\n\t\t\t$query = $this->db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table));\n\n\t\t\t// No result means the table name was invalid\n\t\t\tif ($query === FALSE)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Write out the table schema\n\t\t\t$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;\n\n\t\t\tif ($add_drop === TRUE)\n\t\t\t{\n\t\t\t\t$output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline;\n\t\t\t}\n\n\t\t\t$i = 0;\n\t\t\t$result = $query->result_array();\n\t\t\tforeach ($result[0] as $val)\n\t\t\t{\n\t\t\t\tif ($i++ % 2)\n\t\t\t\t{\n\t\t\t\t\t$output .= $val.';'.$newline.$newline;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If inserts are not needed we're done...\n\t\t\tif ($add_insert === FALSE)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Grab all the data from the current table\n\t\t\t$query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table));\n\n\t\t\tif ($query->num_rows() === 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fetch the field names and determine if the field is an\n\t\t\t// integer type. We use this info to decide whether to\n\t\t\t// surround the data with quotes or not\n\n\t\t\t$i = 0;\n\t\t\t$field_str = '';\n\t\t\t$is_int = array();\n\t\t\twhile ($field = mysql_fetch_field($query->result_id))\n\t\t\t{\n\t\t\t\t// Most versions of MySQL store timestamp as a string\n\t\t\t\t$is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)),\n\t\t\t\t\t\t\tarray('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),\n\t\t\t\t\t\t\tTRUE);\n\n\t\t\t\t// Create a string of field names\n\t\t\t\t$field_str .= $this->db->escape_identifiers($field->name).', ';\n\t\t\t\t$i++;\n\t\t\t}\n\n\t\t\t// Trim off the end comma\n\t\t\t$field_str = preg_replace('/, $/' , '', $field_str);\n\n\t\t\t// Build the insert string\n\t\t\tforeach ($query->result_array() as $row)\n\t\t\t{\n\t\t\t\t$val_str = '';\n\n\t\t\t\t$i = 0;\n\t\t\t\tforeach ($row as $v)\n\t\t\t\t{\n\t\t\t\t\t// Is the value NULL?\n\t\t\t\t\tif ($v === NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\t$val_str .= 'NULL';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Escape the data if it's not an integer\n\t\t\t\t\t\t$val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Append a comma\n\t\t\t\t\t$val_str .= ', ';\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\n\t\t\t\t// Remove the comma at the end of the string\n\t\t\t\t$val_str = preg_replace('/, $/' , '', $val_str);\n\n\t\t\t\t// Build the INSERT string\n\t\t\t\t$output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline;\n\t\t\t}\n\n\t\t\t$output .= $newline.$newline;\n\t\t}\n\n\t\t// Do we need to include a statement to re-enable foreign key checks?\n\t\tif ($foreign_key_checks === FALSE)\n\t\t{\n\t\t\t$output .= 'SET foreign_key_checks = 1;'.$newline;\n\t\t}\n\n\t\treturn $output;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysqli/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/mysqli/mysqli_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQLi Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysqli_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'mysqli';\n\n\t/**\n\t * Compression flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $compress = FALSE;\n\n\t/**\n\t * DELETE hack flag\n\t *\n\t * Whether to use the MySQL \"delete hack\" which allows the number\n\t * of affected rows to be shown. Uses a preg_replace when enabled,\n\t * adding a bit more processing to all queries.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $delete_hack = TRUE;\n\n\t/**\n\t * Strict ON flag\n\t *\n\t * Whether we're running in strict SQL mode.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $stricton;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '`';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * MySQLi object\n\t *\n\t * Has to be preserved without being assigned to $conn_id.\n\t *\n\t * @var\tMySQLi\n\t */\n\tprotected $_mysqli;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tobject\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\t// PHP 8.1 changes default error handling mode from silent to exceptions - reverse that\n\t\tif (is_php('8.1'))\n\t\t{\n\t\t\t$mysqli_driver = new mysqli_driver();\n\t\t\t$mysqli_driver->report_mode = MYSQLI_REPORT_OFF;\n\t\t}\n\n\t\t// Do we have a socket path?\n\t\tif ($this->hostname[0] === '/')\n\t\t{\n\t\t\t$hostname = NULL;\n\t\t\t$port = NULL;\n\t\t\t$socket = $this->hostname;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$hostname = ($persistent === TRUE)\n\t\t\t\t? 'p:'.$this->hostname : $this->hostname;\n\t\t\t$port = empty($this->port) ? NULL : $this->port;\n\t\t\t$socket = NULL;\n\t\t}\n\n\t\t$client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;\n\t\t$this->_mysqli = mysqli_init();\n\n\t\t$this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);\n\n\t\tif (isset($this->stricton))\n\t\t{\n\t\t\tif ($this->stricton)\n\t\t\t{\n\t\t\t\t$this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, \",\", \"STRICT_ALL_TABLES\")');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_mysqli->options(MYSQLI_INIT_COMMAND,\n\t\t\t\t\t'SET SESSION sql_mode =\n\t\t\t\t\tREPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(\n\t\t\t\t\t@@sql_mode,\n\t\t\t\t\t\"STRICT_ALL_TABLES,\", \"\"),\n\t\t\t\t\t\",STRICT_ALL_TABLES\", \"\"),\n\t\t\t\t\t\"STRICT_ALL_TABLES\", \"\"),\n\t\t\t\t\t\"STRICT_TRANS_TABLES,\", \"\"),\n\t\t\t\t\t\",STRICT_TRANS_TABLES\", \"\"),\n\t\t\t\t\t\"STRICT_TRANS_TABLES\", \"\")'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (is_array($this->encrypt))\n\t\t{\n\t\t\t$ssl = array();\n\t\t\tempty($this->encrypt['ssl_key'])    OR $ssl['key']    = $this->encrypt['ssl_key'];\n\t\t\tempty($this->encrypt['ssl_cert'])   OR $ssl['cert']   = $this->encrypt['ssl_cert'];\n\t\t\tempty($this->encrypt['ssl_ca'])     OR $ssl['ca']     = $this->encrypt['ssl_ca'];\n\t\t\tempty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath'];\n\t\t\tempty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher'];\n\n\t\t\tif (isset($this->encrypt['ssl_verify']))\n\t\t\t{\n\t\t\t\t$client_flags |= MYSQLI_CLIENT_SSL;\n\n\t\t\t\tif ($this->encrypt['ssl_verify'])\n\t\t\t\t{\n\t\t\t\t\tdefined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE);\n\t\t\t\t}\n\t\t\t\t// Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT\n\t\t\t\t// to FALSE didn't do anything, so PHP 5.6.16 introduced yet another\n\t\t\t\t// constant ...\n\t\t\t\t//\n\t\t\t\t// https://secure.php.net/ChangeLog-5.php#5.6.16\n\t\t\t\t// https://bugs.php.net/bug.php?id=68344\n\t\t\t\telseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'))\n\t\t\t\t{\n\t\t\t\t\t$client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! empty($ssl))\n\t\t\t{\n\t\t\t\t$client_flags |= MYSQLI_CLIENT_SSL;\n\t\t\t\t$this->_mysqli->ssl_set(\n\t\t\t\t\tisset($ssl['key'])    ? $ssl['key']    : NULL,\n\t\t\t\t\tisset($ssl['cert'])   ? $ssl['cert']   : NULL,\n\t\t\t\t\tisset($ssl['ca'])     ? $ssl['ca']     : NULL,\n\t\t\t\t\tisset($ssl['capath']) ? $ssl['capath'] : NULL,\n\t\t\t\t\tisset($ssl['cipher']) ? $ssl['cipher'] : NULL\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags))\n\t\t{\n\t\t\t// Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails\n\t\t\tif (\n\t\t\t\t($client_flags & MYSQLI_CLIENT_SSL)\n\t\t\t\t&& version_compare($this->_mysqli->client_info, '5.7.3', '<=')\n\t\t\t\t&& empty($this->_mysqli->query(\"SHOW STATUS LIKE 'ssl_cipher'\")->fetch_object()->Value)\n\t\t\t)\n\t\t\t{\n\t\t\t\t$this->_mysqli->close();\n\t\t\t\t$message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!';\n\t\t\t\tlog_message('error', $message);\n\t\t\t\treturn ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE;\n\t\t\t}\n\n\t\t\treturn $this->_mysqli;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reconnect\n\t *\n\t * Keep / reestablish the db connection if no queries have been\n\t * sent for a length of time exceeding the server's idle timeout\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function reconnect()\n\t{\n\t\tif ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE)\n\t\t{\n\t\t\t$this->conn_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select the database\n\t *\n\t * @param\tstring\t$database\n\t * @return\tbool\n\t */\n\tpublic function db_select($database = '')\n\t{\n\t\tif ($database === '')\n\t\t{\n\t\t\t$database = $this->database;\n\t\t}\n\n\t\tif ($this->conn_id->select_db($database))\n\t\t{\n\t\t\t$this->database = $database;\n\t\t\t$this->data_cache = array();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set client character set\n\t *\n\t * @param\tstring\t$charset\n\t * @return\tbool\n\t */\n\tprotected function _db_set_charset($charset)\n\t{\n\t\treturn $this->conn_id->set_charset($charset);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\treturn $this->data_cache['version'] = $this->conn_id->server_info;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tmixed\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn $this->conn_id->query($this->_prep_query($sql));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep the query\n\t *\n\t * If needed, each database adapter can prep the query string\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tstring\n\t */\n\tprotected function _prep_query($sql)\n\t{\n\t\t// mysqli_affected_rows() returns 0 for \"DELETE FROM TABLE\" queries. This hack\n\t\t// modifies the query so that it a proper number of affected rows is returned.\n\t\tif ($this->delete_hack === TRUE && preg_match('/^\\s*DELETE\\s+FROM\\s+(\\S+)\\s*$/i', $sql))\n\t\t{\n\t\t\treturn trim($sql).' WHERE 1=1';\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\t$this->conn_id->autocommit(FALSE);\n\t\treturn is_php('5.5')\n\t\t\t? $this->conn_id->begin_transaction()\n\t\t\t: $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\tif ($this->conn_id->commit())\n\t\t{\n\t\t\t$this->conn_id->autocommit(TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\tif ($this->conn_id->rollback())\n\t\t{\n\t\t\t$this->conn_id->autocommit(TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn $this->conn_id->real_escape_string($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn $this->conn_id->affected_rows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tint\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn $this->conn_id->insert_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char;\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%'\";\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->Field;\n\n\t\t\tsscanf($query[$i]->Type, '%[a-z](%d)',\n\t\t\t\t$retval[$i]->type,\n\t\t\t\t$retval[$i]->max_length\n\t\t\t);\n\n\t\t\t$retval[$i]->default\t\t= $query[$i]->Default;\n\t\t\t$retval[$i]->primary_key\t= (int) ($query[$i]->Key === 'PRI');\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\tif ( ! empty($this->_mysqli->connect_errno))\n\t\t{\n\t\t\treturn array(\n\t\t\t\t'code'    => $this->_mysqli->connect_errno,\n\t\t\t\t'message' => $this->_mysqli->connect_error\n\t\t\t);\n\t\t}\n\n\t\treturn array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FROM tables\n\t *\n\t * Groups tables in FROM clauses if needed, so there is no confusion\n\t * about operator precedence.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _from_tables()\n\t{\n\t\tif ( ! empty($this->qb_join) && count($this->qb_from) > 1)\n\t\t{\n\t\t\treturn '('.implode(', ', $this->qb_from).')';\n\t\t}\n\n\t\treturn implode(', ', $this->qb_from);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\t$this->conn_id->close();\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysqli/mysqli_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQLi Forge Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysqli_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s';\n\n\t/**\n\t * CREATE TABLE keys flag\n\t *\n\t * Whether table keys are created from within the\n\t * CREATE TABLE statement.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_create_table_keys\t= TRUE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT',\n\t\t'SMALLINT',\n\t\t'MEDIUMINT',\n\t\t'INT',\n\t\t'INTEGER',\n\t\t'BIGINT',\n\t\t'REAL',\n\t\t'DOUBLE',\n\t\t'DOUBLE PRECISION',\n\t\t'FLOAT',\n\t\t'DECIMAL',\n\t\t'NUMERIC'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null = 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CREATE TABLE attributes\n\t *\n\t * @param\tarray\t$attributes\tAssociative array of table attributes\n\t * @return\tstring\n\t */\n\tprotected function _create_table_attr($attributes)\n\t{\n\t\t$sql = '';\n\n\t\tforeach (array_keys($attributes) as $key)\n\t\t{\n\t\t\tif (is_string($key))\n\t\t\t{\n\t\t\t\t$sql .= ' '.strtoupper($key).' = '.$attributes[$key];\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty($this->db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET'))\n\t\t{\n\t\t\t$sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set;\n\t\t}\n\n\t\tif ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE'))\n\t\t{\n\t\t\t$sql .= ' COLLATE = '.$this->db->dbcollat;\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP')\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$field[$i] = ($alter_type === 'ADD')\n\t\t\t\t\t\t? \"\\n\\tADD \".$field[$i]['_literal']\n\t\t\t\t\t\t: \"\\n\\tMODIFY \".$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ($alter_type === 'ADD')\n\t\t\t\t{\n\t\t\t\t\t$field[$i]['_literal'] = \"\\n\\tADD \";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$field[$i]['_literal'] = empty($field[$i]['new_name']) ? \"\\n\\tMODIFY \" : \"\\n\\tCHANGE \";\n\t\t\t\t}\n\n\t\t\t\t$field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]);\n\t\t\t}\n\t\t}\n\n\t\treturn array($sql.implode(',', $field));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\t$extra_clause = isset($field['after'])\n\t\t\t? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';\n\n\t\tif (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)\n\t\t{\n\t\t\t$extra_clause = ' FIRST';\n\t\t}\n\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['null']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['unique']\n\t\t\t.(empty($field['comment']) ? '' : ' COMMENT '.$field['comment'])\n\t\t\t.$extra_clause;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process indexes\n\t *\n\t * @param\tstring\t$table\t(ignored)\n\t * @return\tstring\n\t */\n\tprotected function _process_indexes($table)\n\t{\n\t\t$sql = '';\n\n\t\tfor ($i = 0, $c = count($this->keys); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_array($this->keys[$i]))\n\t\t\t{\n\t\t\t\tfor ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)\n\t\t\t\t{\n\t\t\t\t\tif ( ! isset($this->fields[$this->keys[$i][$i2]]))\n\t\t\t\t\t{\n\t\t\t\t\t\tunset($this->keys[$i][$i2]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! isset($this->fields[$this->keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->keys[$i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tis_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);\n\n\t\t\t$sql .= \",\\n\\tKEY \".$this->db->escape_identifiers(implode('_', $this->keys[$i]))\n\t\t\t\t.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';\n\t\t}\n\n\t\t$this->keys = array();\n\n\t\treturn $sql;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysqli/mysqli_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQLi Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysqli_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\treturn is_int($this->num_rows)\n\t\t\t? $this->num_rows\n\t\t\t: $this->num_rows = $this->result_id->num_rows;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn $this->result_id->field_count;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\t$this->result_id->field_seek(0);\n\t\twhile ($field = $this->result_id->fetch_field())\n\t\t{\n\t\t\t$field_names[] = $field->name;\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\t$field_data = $this->result_id->fetch_fields();\n\t\tfor ($i = 0, $c = count($field_data); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $field_data[$i]->name;\n\t\t\t$retval[$i]->type\t\t= static::_get_field_type($field_data[$i]->type);\n\t\t\t$retval[$i]->max_length\t\t= $field_data[$i]->max_length;\n\t\t\t$retval[$i]->primary_key\t= (int) ($field_data[$i]->flags & MYSQLI_PRI_KEY_FLAG);\n\t\t\t$retval[$i]->default\t\t= $field_data[$i]->def;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get field type\n\t *\n\t * Extracts field type info from the bitflags returned by\n\t * mysqli_result::fetch_fields()\n\t *\n\t * @used-by\tCI_DB_mysqli_result::field_data()\n\t * @param\tint\t$type\n\t * @return\tstring\n\t */\n\tprivate static function _get_field_type($type)\n\t{\n\t\tstatic $map;\n\t\tisset($map) OR $map = array(\n\t\t\tMYSQLI_TYPE_DECIMAL     => 'decimal',\n\t\t\tMYSQLI_TYPE_BIT         => 'bit',\n\t\t\tMYSQLI_TYPE_TINY        => 'tinyint',\n\t\t\tMYSQLI_TYPE_SHORT       => 'smallint',\n\t\t\tMYSQLI_TYPE_INT24       => 'mediumint',\n\t\t\tMYSQLI_TYPE_LONG        => 'int',\n\t\t\tMYSQLI_TYPE_LONGLONG    => 'bigint',\n\t\t\tMYSQLI_TYPE_FLOAT       => 'float',\n\t\t\tMYSQLI_TYPE_DOUBLE      => 'double',\n\t\t\tMYSQLI_TYPE_TIMESTAMP   => 'timestamp',\n\t\t\tMYSQLI_TYPE_DATE        => 'date',\n\t\t\tMYSQLI_TYPE_TIME        => 'time',\n\t\t\tMYSQLI_TYPE_DATETIME    => 'datetime',\n\t\t\tMYSQLI_TYPE_YEAR        => 'year',\n\t\t\tMYSQLI_TYPE_NEWDATE     => 'date',\n\t\t\tMYSQLI_TYPE_INTERVAL    => 'interval',\n\t\t\tMYSQLI_TYPE_ENUM        => 'enum',\n\t\t\tMYSQLI_TYPE_SET         => 'set',\n\t\t\tMYSQLI_TYPE_TINY_BLOB   => 'tinyblob',\n\t\t\tMYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob',\n\t\t\tMYSQLI_TYPE_BLOB        => 'blob',\n\t\t\tMYSQLI_TYPE_LONG_BLOB   => 'longblob',\n\t\t\tMYSQLI_TYPE_STRING      => 'char',\n\t\t\tMYSQLI_TYPE_VAR_STRING  => 'varchar',\n\t\t\tMYSQLI_TYPE_GEOMETRY    => 'geometry'\n\t\t);\n\n\t\treturn isset($map[$type]) ? $map[$type] : $type;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_object($this->result_id))\n\t\t{\n\t\t\t$this->result_id->free();\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn $this->result_id->data_seek($n);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn $this->result_id->fetch_assoc();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn $this->result_id->fetch_object($class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/mysqli/mysqli_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * MySQLi Utility Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_mysqli_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t= 'SHOW DATABASES';\n\n\t/**\n\t * OPTIMIZE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_optimize_table\t= 'OPTIMIZE TABLE %s';\n\n\t/**\n\t * REPAIR TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_repair_table\t= 'REPAIR TABLE %s';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\tif (count($params) === 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Extract the prefs for simplicity\n\t\textract($params);\n\n\t\t// Build the output\n\t\t$output = '';\n\n\t\t// Do we need to include a statement to disable foreign key checks?\n\t\tif ($foreign_key_checks === FALSE)\n\t\t{\n\t\t\t$output .= 'SET foreign_key_checks = 0;'.$newline;\n\t\t}\n\n\t\tforeach ( (array) $tables as $table)\n\t\t{\n\t\t\t// Is the table in the \"ignore\" list?\n\t\t\tif (in_array($table, (array) $ignore, TRUE))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the table schema\n\t\t\t$query = $this->db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table));\n\n\t\t\t// No result means the table name was invalid\n\t\t\tif ($query === FALSE)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Write out the table schema\n\t\t\t$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;\n\n\t\t\tif ($add_drop === TRUE)\n\t\t\t{\n\t\t\t\t$output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline;\n\t\t\t}\n\n\t\t\t$i = 0;\n\t\t\t$result = $query->result_array();\n\t\t\tforeach ($result[0] as $val)\n\t\t\t{\n\t\t\t\tif ($i++ % 2)\n\t\t\t\t{\n\t\t\t\t\t$output .= $val.';'.$newline.$newline;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If inserts are not needed we're done...\n\t\t\tif ($add_insert === FALSE)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Grab all the data from the current table\n\t\t\t$query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table));\n\n\t\t\tif ($query->num_rows() === 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fetch the field names and determine if the field is an\n\t\t\t// integer type. We use this info to decide whether to\n\t\t\t// surround the data with quotes or not\n\n\t\t\t$i = 0;\n\t\t\t$field_str = '';\n\t\t\t$is_int = array();\n\t\t\twhile ($field = $query->result_id->fetch_field())\n\t\t\t{\n\t\t\t\t// Most versions of MySQL store timestamp as a string\n\t\t\t\t$is_int[$i] = in_array($field->type, array(MYSQLI_TYPE_TINY, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_INT24, MYSQLI_TYPE_LONG), TRUE);\n\n\t\t\t\t// Create a string of field names\n\t\t\t\t$field_str .= $this->db->escape_identifiers($field->name).', ';\n\t\t\t\t$i++;\n\t\t\t}\n\n\t\t\t// Trim off the end comma\n\t\t\t$field_str = preg_replace('/, $/' , '', $field_str);\n\n\t\t\t// Build the insert string\n\t\t\tforeach ($query->result_array() as $row)\n\t\t\t{\n\t\t\t\t$val_str = '';\n\n\t\t\t\t$i = 0;\n\t\t\t\tforeach ($row as $v)\n\t\t\t\t{\n\t\t\t\t\t// Is the value NULL?\n\t\t\t\t\tif ($v === NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\t$val_str .= 'NULL';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Escape the data if it's not an integer\n\t\t\t\t\t\t$val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Append a comma\n\t\t\t\t\t$val_str .= ', ';\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\n\t\t\t\t// Remove the comma at the end of the string\n\t\t\t\t$val_str = preg_replace('/, $/' , '', $val_str);\n\n\t\t\t\t// Build the INSERT string\n\t\t\t\t$output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline;\n\t\t\t}\n\n\t\t\t$output .= $newline.$newline;\n\t\t}\n\n\t\t// Do we need to include a statement to re-enable foreign key checks?\n\t\tif ($foreign_key_checks === FALSE)\n\t\t{\n\t\t\t$output .= 'SET foreign_key_checks = 1;'.$newline;\n\t\t}\n\n\t\treturn $output;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/oci8/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/oci8/oci8_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.4.1\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * oci8 Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage  Drivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\n\n/**\n * oci8 Database Adapter Class\n *\n * This is a modification of the DB_driver class to\n * permit access to oracle databases\n *\n * @author\t  Kelly McArdle\n */\nclass CI_DB_oci8_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'oci8';\n\n\t/**\n\t * Statement ID\n\t *\n\t * @var\tresource\n\t */\n\tpublic $stmt_id;\n\n\t/**\n\t * Cursor ID\n\t *\n\t * @var\tresource\n\t */\n\tpublic $curs_id;\n\n\t/**\n\t * Commit mode flag\n\t *\n\t * @var\tint\n\t */\n\tpublic $commit_mode = OCI_COMMIT_ON_SUCCESS;\n\n\t/**\n\t * Limit used flag\n\t *\n\t * If we use LIMIT, we'll add a field that will\n\t * throw off num_fields later.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $limit_used = FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reset $stmt_id flag\n\t *\n\t * Used by stored_procedure() to prevent _execute() from\n\t * re-setting the statement ID.\n\t */\n\tprotected $_reset_stmt_id = TRUE;\n\n\t/**\n\t * List of reserved identifiers\n\t *\n\t * Identifiers that must NOT be escaped.\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_reserved_identifiers = array('*', 'rownum');\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('ASC', 'ASC'); // not currently supported\n\n\t/**\n\t * COUNT string\n\t *\n\t * @used-by\tCI_DB_driver::count_all()\n\t * @used-by\tCI_DB_query_builder::count_all_results()\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_count_string = 'SELECT COUNT(1) AS ';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\t$valid_dsns = array(\n\t\t\t'tns'\t=> '/^\\(DESCRIPTION=(\\(.+\\)){2,}\\)$/', // TNS\n\t\t\t// Easy Connect string (Oracle 10g+)\n\t\t\t'ec'\t=> '/^(\\/\\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\\/[a-z0-9$_]+)?(:[^\\/])?(\\/[a-z0-9$_]+)?$/i',\n\t\t\t'in'\t=> '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora)\n\t\t);\n\n\t\t/* Space characters don't have any effect when actually\n\t\t * connecting, but can be a hassle while validating the DSN.\n\t\t */\n\t\t$this->dsn = str_replace(array(\"\\n\", \"\\r\", \"\\t\", ' '), '', $this->dsn);\n\n\t\tif ($this->dsn !== '')\n\t\t{\n\t\t\tforeach ($valid_dsns as $regexp)\n\t\t\t{\n\t\t\t\tif (preg_match($regexp, $this->dsn))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Legacy support for TNS in the hostname configuration field\n\t\t$this->hostname = str_replace(array(\"\\n\", \"\\r\", \"\\t\", ' '), '', $this->hostname);\n\t\tif (preg_match($valid_dsns['tns'], $this->hostname))\n\t\t{\n\t\t\t$this->dsn = $this->hostname;\n\t\t\treturn;\n\t\t}\n\t\telseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE\n\t\t\t&& (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== ''))\n\t\t{\n\t\t\t/* If the hostname field isn't empty, doesn't contain\n\t\t\t * ':' and/or '/' and if port and/or database aren't\n\t\t\t * empty, then the hostname field is most likely indeed\n\t\t\t * just a hostname. Therefore we'll try and build an\n\t\t\t * Easy Connect string from these 3 settings, assuming\n\t\t\t * that the database field is a service name.\n\t\t\t */\n\t\t\t$this->dsn = $this->hostname\n\t\t\t\t.(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '')\n\t\t\t\t.($this->database !== '' ? '/'.ltrim($this->database, '/') : '');\n\n\t\t\tif (preg_match($valid_dsns['ec'], $this->dsn))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t/* At this point, we can only try and validate the hostname and\n\t\t * database fields separately as DSNs.\n\t\t */\n\t\tif (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname))\n\t\t{\n\t\t\t$this->dsn = $this->hostname;\n\t\t\treturn;\n\t\t}\n\n\t\t$this->database = str_replace(array(\"\\n\", \"\\r\", \"\\t\", ' '), '', $this->database);\n\t\tforeach ($valid_dsns as $regexp)\n\t\t{\n\t\t\tif (preg_match($regexp, $this->database))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t/* Well - OK, an empty string should work as well.\n\t\t * PHP will try to use environment variables to\n\t\t * determine which Oracle instance to connect to.\n\t\t */\n\t\t$this->dsn = '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\t$func = ($persistent === TRUE) ? 'oci_pconnect' : 'oci_connect';\n\t\treturn empty($this->char_set)\n\t\t\t? $func($this->username, $this->password, $this->dsn)\n\t\t\t: $func($this->username, $this->password, $this->dsn, $this->char_set);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\tif ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif (preg_match('#Release\\s(\\d+(?:\\.\\d+)+)#', $version_string, $match))\n\t\t{\n\t\t\treturn $this->data_cache['version'] = $match[1];\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\t/* Oracle must parse the query before it is run. All of the actions with\n\t\t * the query are based on the statement id returned by oci_parse().\n\t\t */\n\t\tif ($this->_reset_stmt_id === TRUE)\n\t\t{\n\t\t\t$this->stmt_id = oci_parse($this->conn_id, $sql);\n\t\t}\n\n\t\toci_set_prefetch($this->stmt_id, 1000);\n\t\treturn oci_execute($this->stmt_id, $this->commit_mode);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get cursor. Returns a cursor from the database\n\t *\n\t * @return\tresource\n\t */\n\tpublic function get_cursor()\n\t{\n\t\treturn $this->curs_id = oci_new_cursor($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Stored Procedure.  Executes a stored procedure\n\t *\n\t * @param\tstring\tpackage name in which the stored procedure is in\n\t * @param\tstring\tstored procedure name to execute\n\t * @param\tarray\tparameters\n\t * @return\tmixed\n\t *\n\t * params array keys\n\t *\n\t * KEY      OPTIONAL  NOTES\n\t * name     no        the name of the parameter should be in :<param_name> format\n\t * value    no        the value of the parameter.  If this is an OUT or IN OUT parameter,\n\t *                    this should be a reference to a variable\n\t * type     yes       the type of the parameter\n\t * length   yes       the max size of the parameter\n\t */\n\tpublic function stored_procedure($package, $procedure, array $params)\n\t{\n\t\tif ($package === '' OR $procedure === '')\n\t\t{\n\t\t\tlog_message('error', 'Invalid query: '.$package.'.'.$procedure);\n\t\t\treturn ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE;\n\t\t}\n\n\t\t// Build the query string\n\t\t$sql = 'BEGIN '.$package.'.'.$procedure.'(';\n\n\t\t$have_cursor = FALSE;\n\t\tforeach ($params as $param)\n\t\t{\n\t\t\t$sql .= $param['name'].',';\n\n\t\t\tif (isset($param['type']) && $param['type'] === OCI_B_CURSOR)\n\t\t\t{\n\t\t\t\t$have_cursor = TRUE;\n\t\t\t}\n\t\t}\n\t\t$sql = trim($sql, ',').'); END;';\n\n\t\t$this->_reset_stmt_id = FALSE;\n\t\t$this->stmt_id = oci_parse($this->conn_id, $sql);\n\t\t$this->_bind_params($params);\n\t\t$result = $this->query($sql, FALSE, $have_cursor);\n\t\t$this->_reset_stmt_id = TRUE;\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Bind parameters\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tprotected function _bind_params($params)\n\t{\n\t\tif ( ! is_array($params) OR ! is_resource($this->stmt_id))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tforeach ($params as $param)\n\t\t{\n\t\t\tforeach (array('name', 'value', 'type', 'length') as $val)\n\t\t\t{\n\t\t\t\tif ( ! isset($param[$val]))\n\t\t\t\t{\n\t\t\t\t\t$param[$val] = '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\t$this->commit_mode = OCI_NO_AUTO_COMMIT;\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\t$this->commit_mode = OCI_COMMIT_ON_SUCCESS;\n\n\t\treturn oci_commit($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\t$this->commit_mode = OCI_COMMIT_ON_SUCCESS;\n\t\treturn oci_rollback($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn oci_num_rows($this->stmt_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tint\n\t */\n\tpublic function insert_id()\n\t{\n\t\t// not supported in oracle\n\t\treturn $this->display_error('db_unsupported_function');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"TABLE_NAME\" FROM \"ALL_TABLES\"';\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' WHERE \"TABLE_NAME\" LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\tif (strpos($table, '.') !== FALSE)\n\t\t{\n\t\t\tsscanf($table, '%[^.].%s', $owner, $table);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$owner = $this->username;\n\t\t}\n\n\t\treturn 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS\n\t\t\tWHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).'\n\t\t\t\tAND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (strpos($table, '.') !== FALSE)\n\t\t{\n\t\t\tsscanf($table, '%[^.].%s', $owner, $table);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$owner = $this->username;\n\t\t}\n\n\t\t$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE\n\t\t\tFROM ALL_TAB_COLUMNS\n\t\t\tWHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).'\n\t\t\t\tAND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->COLUMN_NAME;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->DATA_TYPE;\n\n\t\t\t$length = ($query[$i]->CHAR_LENGTH > 0)\n\t\t\t\t? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION;\n\t\t\tif ($length === NULL)\n\t\t\t{\n\t\t\t\t$length = $query[$i]->DATA_LENGTH;\n\t\t\t}\n\t\t\t$retval[$i]->max_length\t\t= $length;\n\n\t\t\t$default = $query[$i]->DATA_DEFAULT;\n\t\t\tif ($default === NULL && $query[$i]->NULLABLE === 'N')\n\t\t\t{\n\t\t\t\t$default = '';\n\t\t\t}\n\t\t\t$retval[$i]->default = $default;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\t// oci_error() returns an array that already contains\n\t\t// 'code' and 'message' keys, but it can return false\n\t\t// if there was no error ....\n\t\tif (is_resource($this->curs_id))\n\t\t{\n\t\t\t$error = oci_error($this->curs_id);\n\t\t}\n\t\telseif (is_resource($this->stmt_id))\n\t\t{\n\t\t\t$error = oci_error($this->stmt_id);\n\t\t}\n\t\telseif (is_resource($this->conn_id))\n\t\t{\n\t\t\t$error = oci_error($this->conn_id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$error = oci_error();\n\t\t}\n\n\t\treturn is_array($error)\n\t\t\t? $error\n\t\t\t: array('code' => '', 'message' => '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param \tarray\t$values\tINSERT values\n\t * @return\tstring\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\t$keys = implode(', ', $keys);\n\t\t$sql = \"INSERT ALL\\n\";\n\n\t\tfor ($i = 0, $c = count($values); $i < $c; $i++)\n\t\t{\n\t\t\t$sql .= '\tINTO '.$table.' ('.$keys.') VALUES '.$values[$i].\"\\n\";\n\t\t}\n\n\t\treturn $sql.'SELECT * FROM dual';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE TABLE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\tif ($this->qb_limit)\n\t\t{\n\t\t\t$this->where('rownum <= ',$this->qb_limit, FALSE);\n\t\t\t$this->qb_limit = FALSE;\n\t\t}\n\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\tif (version_compare($this->version(), '12.1', '>='))\n\t\t{\n\t\t\t// OFFSET-FETCH can be used only with the ORDER BY clause\n\t\t\tempty($this->qb_orderby) && $sql .= ' ORDER BY 1';\n\n\t\t\treturn $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY';\n\t\t}\n\n\t\t$this->limit_used = TRUE;\n\t\treturn 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')'\n\t\t\t.($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tif (is_resource($this->curs_id))\n\t\t{\n\t\t\toci_free_statement($this->curs_id);\n\t\t}\n\n\t\tif (is_resource($this->stmt_id))\n\t\t{\n\t\t\toci_free_statement($this->stmt_id);\n\t\t}\n\n\t\toci_close($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * We need to reset our $limit_used hack flag, so it doesn't propagate\n\t * to subsequent queries.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _reset_select()\n\t{\n\t\t$this->limit_used = FALSE;\n\t\tparent::_reset_select();\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/oci8/oci8_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.4.1\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Oracle Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_oci8_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= FALSE;\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * DROP DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_database\t= FALSE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP')\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\t\telseif ($alter_type === 'CHANGE')\n\t\t{\n\t\t\t$alter_type = 'MODIFY';\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$field[$i] = \"\\n\\t\".$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$field[$i]['_literal'] = \"\\n\\t\".$this->_process_column($field[$i]);\n\n\t\t\t\tif ( ! empty($field[$i]['comment']))\n\t\t\t\t{\n\t\t\t\t\t$sqls[] = 'COMMENT ON COLUMN '\n\t\t\t\t\t\t.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t\t.' IS '.$field[$i]['comment'];\n\t\t\t\t}\n\n\t\t\t\tif ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name']))\n\t\t\t\t{\n\t\t\t\t\t$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t\t.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);\n\t\t\t\t}\n\n\t\t\t\t$field[$i] = \"\\n\\t\".$field[$i]['_literal'];\n\t\t\t}\n\t\t}\n\n\t\t$sql .= ' '.$alter_type.' ';\n\t\t$sql .= (count($field) === 1)\n\t\t\t\t? $field[0]\n\t\t\t\t: '('.implode(',', $field).')';\n\n\t\t// RENAME COLUMN must be executed after MODIFY\n\t\tarray_unshift($sqls, $sql);\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'number') !== FALSE && version_compare($this->db->version(), '12.1', '>='))\n\t\t{\n\t\t\t$field['auto_increment'] = ' GENERATED ALWAYS AS IDENTITY';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['null']\n\t\t\t.$field['unique'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tcase 'INT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tcase 'BIGINT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/oci8/oci8_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.4.1\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * oci8 Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_oci8_result extends CI_DB_result {\n\n\t/**\n\t * Statement ID\n\t *\n\t * @var\tresource\n\t */\n\tpublic $stmt_id;\n\n\t/**\n\t * Cursor ID\n\t *\n\t * @var\tresource\n\t */\n\tpublic $curs_id;\n\n\t/**\n\t * Limit used flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $limit_used;\n\n\t/**\n\t * Commit mode flag\n\t *\n\t * @var\tint\n\t */\n\tpublic $commit_mode;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$driver_object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$driver_object)\n\t{\n\t\tparent::__construct($driver_object);\n\n\t\t$this->stmt_id = $driver_object->stmt_id;\n\t\t$this->curs_id = $driver_object->curs_id;\n\t\t$this->limit_used = $driver_object->limit_used;\n\t\t$this->commit_mode =& $driver_object->commit_mode;\n\t\t$driver_object->stmt_id = FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\t$count = oci_num_fields($this->stmt_id);\n\n\t\t// if we used a limit we subtract it\n\t\treturn ($this->limit_used) ? $count - 1 : $count;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tfor ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++)\n\t\t{\n\t\t\t$field_names[] = oci_field_name($this->stmt_id, $c);\n\t\t}\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++)\n\t\t{\n\t\t\t$F\t\t= new stdClass();\n\t\t\t$F->name\t= oci_field_name($this->stmt_id, $c);\n\t\t\t$F->type\t= oci_field_type($this->stmt_id, $c);\n\t\t\t$F->max_length\t= oci_field_size($this->stmt_id, $c);\n\n\t\t\t$retval[] = $F;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_resource($this->result_id))\n\t\t{\n\t\t\toci_free_statement($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\n\t\tif (is_resource($this->stmt_id))\n\t\t{\n\t\t\toci_free_statement($this->stmt_id);\n\t\t}\n\n\t\tif (is_resource($this->curs_id))\n\t\t{\n\t\t\toci_cancel($this->curs_id);\n\t\t\t$this->curs_id = NULL;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\t$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;\n\t\treturn oci_fetch_assoc($id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\t$row = ($this->curs_id)\n\t\t\t? oci_fetch_object($this->curs_id)\n\t\t\t: oci_fetch_object($this->stmt_id);\n\n\t\tif ($class_name === 'stdClass' OR ! $row)\n\t\t{\n\t\t\treturn $row;\n\t\t}\n\n\t\t$class_name = new $class_name();\n\t\tforeach ($row as $key => $value)\n\t\t{\n\t\t\t$class_name->$key = $value;\n\t\t}\n\n\t\treturn $class_name;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/oci8/oci8_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.4.1\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Oracle Utility Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_oci8_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t= 'SELECT username FROM dba_users'; // Schemas are actual usernames\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/odbc/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/odbc/odbc_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * ODBC Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_odbc_driver extends CI_DB_driver {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'odbc';\n\n\t/**\n\t * Database schema\n\t *\n\t * @var\tstring\n\t */\n\tpublic $schema = 'public';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * Must be empty for ODBC.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '';\n\n\t/**\n\t * ESCAPE statement string\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_like_escape_str = \" {escape '%s'} \";\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RND()', 'RND(%d)');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ODBC result ID resource returned from odbc_prepare()\n\t *\n\t * @var\tresource\n\t */\n\tprivate $odbc_result;\n\n\t/**\n\t * Values to use with odbc_execute() for prepared statements\n\t *\n\t * @var\tarray\n\t */\n\tprivate $binds = array();\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\t// Legacy support for DSN in the hostname field\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = $this->hostname;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\treturn ($persistent === TRUE)\n\t\t\t? odbc_pconnect($this->dsn, $this->username, $this->password)\n\t\t\t: odbc_connect($this->dsn, $this->username, $this->password);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile Bindings\n\t *\n\t * @param\tstring\t$sql\tSQL statement\n\t * @param\tarray\t$binds\tAn array of values to bind\n\t * @return\tstring\n\t */\n\tpublic function compile_binds($sql, $binds)\n\t{\n\t\tif (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)\n\t\t{\n\t\t\treturn $sql;\n\t\t}\n\t\telseif ( ! is_array($binds))\n\t\t{\n\t\t\t$binds = array($binds);\n\t\t\t$bind_count = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Make sure we're using numeric keys\n\t\t\t$binds = array_values($binds);\n\t\t\t$bind_count = count($binds);\n\t\t}\n\n\t\t// We'll need the marker length later\n\t\t$ml = strlen($this->bind_marker);\n\n\t\t// Make sure not to replace a chunk inside a string that happens to match the bind marker\n\t\tif ($c = preg_match_all(\"/'[^']*'|\\\"[^\\\"]*\\\"/i\", $sql, $matches))\n\t\t{\n\t\t\t$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',\n\t\t\t\tstr_replace($matches[0],\n\t\t\t\t\tstr_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]),\n\t\t\t\t\t$sql, $c),\n\t\t\t\t$matches, PREG_OFFSET_CAPTURE);\n\n\t\t\t// Bind values' count must match the count of markers in the query\n\t\t\tif ($bind_count !== $c)\n\t\t\t{\n\t\t\t\treturn $sql;\n\t\t\t}\n\t\t}\n\t\telseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count)\n\t\t{\n\t\t\treturn $sql;\n\t\t}\n\n\t\tif ($this->bind_marker !== '?')\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\t$c--;\n\t\t\t\t$sql = substr_replace($sql, '?', $matches[0][$c][1], $ml);\n\t\t\t}\n\t\t\twhile ($c !== 0);\n\t\t}\n\n\t\tif (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql)))\n\t\t{\n\t\t\t$this->binds = array_values($binds);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\tif ( ! isset($this->odbc_result))\n\t\t{\n\t\t\treturn odbc_exec($this->conn_id, $sql);\n\t\t}\n\t\telseif ($this->odbc_result === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds)))\n\t\t{\n\t\t\t// For queries that return result sets, return the result_id resource on success\n\t\t\t$this->is_write_type($sql) OR $success = $this->odbc_result;\n\t\t}\n\n\t\t$this->odbc_result = NULL;\n\t\t$this->binds       = array();\n\n\t\treturn $success;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn odbc_autocommit($this->conn_id, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\tif (odbc_commit($this->conn_id))\n\t\t{\n\t\t\todbc_autocommit($this->conn_id, TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\tif (odbc_rollback($this->conn_id))\n\t\t{\n\t\t\todbc_autocommit($this->conn_id, TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determines if a query is a \"write\" type.\n\t *\n\t * @param\tstring\tAn SQL query string\n\t * @return\tbool\n\t */\n\tpublic function is_write_type($sql)\n\t{\n\t\tif (preg_match('#^(INSERT|UPDATE).*RETURNING\\s.+(\\,\\s?.+)*$#is', $sql))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::is_write_type($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\t$this->display_error('db_unsupported_feature');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn odbc_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tbool\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = \"SELECT table_name FROM information_schema.tables WHERE table_schema = '\".$this->schema.\"'\";\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" AND table_name LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SHOW COLUMNS FROM '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data query\n\t *\n\t * Generates a platform-specific query so that the column data can be retrieved\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _field_data($table)\n\t{\n\t\treturn 'SELECT TOP 1 FROM '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\todbc_close($this->conn_id);\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/odbc/odbc_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * ODBC Forge Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/database/\n */\nclass CI_DB_odbc_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\t// Not supported (in most databases at least)\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/odbc/odbc_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * ODBC Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_odbc_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\tif (is_int($this->num_rows))\n\t\t{\n\t\t\treturn $this->num_rows;\n\t\t}\n\t\telseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1)\n\t\t{\n\t\t\treturn $this->num_rows;\n\t\t}\n\n\t\t// Work-around for ODBC subdrivers that don't support num_rows()\n\t\tif (count($this->result_array) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = count($this->result_array);\n\t\t}\n\t\telseif (count($this->result_object) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = count($this->result_object);\n\t\t}\n\n\t\treturn $this->num_rows = count($this->result_array());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn odbc_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\t$num_fields = $this->num_fields();\n\n\t\tif ($num_fields > 0)\n\t\t{\n\t\t\tfor ($i = 1; $i <= $num_fields; $i++)\n\t\t\t{\n\t\t\t\t$field_names[] = odbc_field_name($this->result_id, $i);\n\t\t\t}\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= odbc_field_name($this->result_id, $odbc_index);\n\t\t\t$retval[$i]->type\t\t= odbc_field_type($this->result_id, $odbc_index);\n\t\t\t$retval[$i]->max_length\t\t= odbc_field_len($this->result_id, $odbc_index);\n\t\t\t$retval[$i]->primary_key\t= 0;\n\t\t\t$retval[$i]->default\t\t= '';\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_resource($this->result_id))\n\t\t{\n\t\t\todbc_free_result($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn odbc_fetch_array($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\t$row = odbc_fetch_object($this->result_id);\n\n\t\tif ($class_name === 'stdClass' OR ! $row)\n\t\t{\n\t\t\treturn $row;\n\t\t}\n\n\t\t$class_name = new $class_name();\n\t\tforeach ($row as $key => $value)\n\t\t{\n\t\t\t$class_name->$key = $value;\n\t\t}\n\n\t\treturn $class_name;\n\t}\n\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('odbc_fetch_array'))\n{\n\t/**\n\t * ODBC Fetch array\n\t *\n\t * Emulates the native odbc_fetch_array() function when\n\t * it is not available (odbc_fetch_array() requires unixODBC)\n\t *\n\t * @param\tresource\t&$result\n\t * @param\tint\t\t$rownumber\n\t * @return\tarray\n\t */\n\tfunction odbc_fetch_array(&$result, $rownumber = 1)\n\t{\n\t\t$rs = array();\n\t\tif ( ! odbc_fetch_into($result, $rs, $rownumber))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$rs_assoc = array();\n\t\tforeach ($rs as $k => $v)\n\t\t{\n\t\t\t$field_name = odbc_field_name($result, $k+1);\n\t\t\t$rs_assoc[$field_name] = $v;\n\t\t}\n\n\t\treturn $rs_assoc;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('odbc_fetch_object'))\n{\n\t/**\n\t * ODBC Fetch object\n\t *\n\t * Emulates the native odbc_fetch_object() function when\n\t * it is not available.\n\t *\n\t * @param\tresource\t&$result\n\t * @param\tint\t\t$rownumber\n\t * @return\tobject\n\t */\n\tfunction odbc_fetch_object(&$result, $rownumber = 1)\n\t{\n\t\t$rs = array();\n\t\tif ( ! odbc_fetch_into($result, $rs, $rownumber))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$rs_object = new stdClass();\n\t\tforeach ($rs as $k => $v)\n\t\t{\n\t\t\t$field_name = odbc_field_name($result, $k+1);\n\t\t\t$rs_object->$field_name = $v;\n\t\t}\n\n\t\treturn $rs_object;\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/odbc/odbc_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * ODBC Utility Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/database/\n */\nclass CI_DB_odbc_utility extends CI_DB_utility {\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/pdo/pdo_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'pdo';\n\n\t/**\n\t * PDO Options\n\t *\n\t * @var\tarray\n\t */\n\tpublic $options = array();\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Validates the DSN string and/or detects the subdriver.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (preg_match('/([^:]+):/', $this->dsn, $match) && count($match) === 2)\n\t\t{\n\t\t\t// If there is a minimum valid dsn string pattern found, we're done\n\t\t\t// This is for general PDO users, who tend to have a full DSN string.\n\t\t\t$this->subdriver = $match[1];\n\t\t\treturn;\n\t\t}\n\t\t// Legacy support for DSN specified in the hostname field\n\t\telseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2)\n\t\t{\n\t\t\t$this->dsn = $this->hostname;\n\t\t\t$this->hostname = NULL;\n\t\t\t$this->subdriver = $match[1];\n\t\t\treturn;\n\t\t}\n\t\telseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE))\n\t\t{\n\t\t\t$this->subdriver = 'dblib';\n\t\t}\n\t\telseif ($this->subdriver === '4D')\n\t\t{\n\t\t\t$this->subdriver = '4d';\n\t\t}\n\t\telseif ( ! in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE))\n\t\t{\n\t\t\tlog_message('error', 'PDO: Invalid or non-existent subdriver');\n\n\t\t\tif ($this->db_debug)\n\t\t\t{\n\t\t\t\tshow_error('Invalid or non-existent PDO subdriver');\n\t\t\t}\n\t\t}\n\n\t\t$this->dsn = NULL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tobject\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tif ($persistent === TRUE)\n\t\t{\n\t\t\t$this->options[PDO::ATTR_PERSISTENT] = TRUE;\n\t\t}\n\n\t\t// From PHP8.0, default PDO::ATTR_ERRMODE is changed\n\t\t// from PDO::ERRMODE_SILENT to PDO::ERRMODE_EXCEPTION\n\t\t// as https://wiki.php.net/rfc/pdo_default_errmode\n\t\tif ( ! isset($this->options[PDO::ATTR_ERRMODE]))\n\t\t{\n\t\t\t$this->options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_SILENT;\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\treturn new PDO($this->dsn, $this->username, $this->password, $this->options);\n\t\t}\n\t\tcatch (PDOException $e)\n\t\t{\n\t\t\tif ($this->db_debug && empty($this->failover))\n\t\t\t{\n\t\t\t\t$this->display_error($e->getMessage(), '', TRUE);\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\t// Not all subdrivers support the getAttribute() method\n\t\ttry\n\t\t{\n\t\t\treturn $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION);\n\t\t}\n\t\tcatch (PDOException $e)\n\t\t{\n\t\t\treturn parent::version();\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tSQL query\n\t * @return\tmixed\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn $this->conn_id->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn $this->conn_id->beginTransaction();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\treturn $this->conn_id->commit();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\treturn $this->conn_id->rollBack();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\t// Escape the string\n\t\t$str = $this->conn_id->quote($str);\n\n\t\t// If there are duplicated quotes, trim them away\n\t\treturn ($str[0] === \"'\")\n\t\t\t? substr($str, 1, -1)\n\t\t\t: $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn is_object($this->result_id) ? $this->result_id->rowCount() : 0;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @param\tstring\t$name\n\t * @return\tint\n\t */\n\tpublic function insert_id($name = NULL)\n\t{\n\t\treturn $this->conn_id->lastInsertId($name);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data query\n\t *\n\t * Generates a platform-specific query so that the column data can be retrieved\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _field_data($table)\n\t{\n\t\treturn 'SELECT TOP 1 * FROM '.$this->protect_identifiers($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\t$error = array('code' => '00000', 'message' => '');\n\t\t$pdo_error = $this->conn_id->errorInfo();\n\n\t\tif (empty($pdo_error[0]))\n\t\t{\n\t\t\treturn $error;\n\t\t}\n\n\t\t$error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0];\n\t\tif (isset($pdo_error[2]))\n\t\t{\n\t\t\t$error['message'] = $pdo_error[2];\n\t\t}\n\n\t\treturn $error;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE TABLE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\t$this->result_id = FALSE;\n\t\t$this->conn_id = FALSE;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/pdo_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Forge Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/database/\n */\nclass CI_DB_pdo_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= FALSE;\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/pdo_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\tif (is_int($this->num_rows))\n\t\t{\n\t\t\treturn $this->num_rows;\n\t\t}\n\t\telseif (count($this->result_array) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = count($this->result_array);\n\t\t}\n\t\telseif (count($this->result_object) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = count($this->result_object);\n\t\t}\n\t\telseif (($num_rows = $this->result_id->rowCount()) > 0)\n\t\t{\n\t\t\treturn $this->num_rows = $num_rows;\n\t\t}\n\n\t\treturn $this->num_rows = count($this->result_array());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn $this->result_id->columnCount();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tbool\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t// Might trigger an E_WARNING due to not all subdrivers\n\t\t\t// supporting getColumnMeta()\n\t\t\t$field_names[$i] = @$this->result_id->getColumnMeta($i);\n\t\t\t$field_names[$i] = $field_names[$i]['name'];\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\ttry\n\t\t{\n\t\t\t$retval = array();\n\n\t\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$field = $this->result_id->getColumnMeta($i);\n\n\t\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t\t$retval[$i]->name\t\t= $field['name'];\n\t\t\t\t$retval[$i]->type\t\t= isset($field['native_type']) ? $field['native_type'] : null;\n\t\t\t\t$retval[$i]->max_length\t\t= ($field['len'] > 0) ? $field['len'] : NULL;\n\t\t\t\t$retval[$i]->primary_key\t= (int) ( ! empty($field['flags']) && in_array('primary_key', $field['flags'], TRUE));\n\t\t\t}\n\n\t\t\treturn $retval;\n\t\t}\n\t\tcatch (Exception $e)\n\t\t{\n\t\t\tif ($this->db->db_debug)\n\t\t\t{\n\t\t\t\treturn $this->db->display_error('db_unsupported_feature');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_object($this->result_id))\n\t\t{\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn $this->result_id->fetch(PDO::FETCH_ASSOC);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn $this->result_id->fetchObject($class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/pdo_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.1.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Utility Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/database/\n */\nclass CI_DB_pdo_utility extends CI_DB_utility {\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_4d_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO 4D Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_4d_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = '4d';\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_escape_char = array('[', ']');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\n\t\t\tempty($this->port) OR $this->dsn .= ';port='.$this->port;\n\t\t\tempty($this->database) OR $this->dsn .= ';dbname='.$this->database;\n\t\t\tempty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t\telseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE)\n\t\t{\n\t\t\t$this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES');\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME').\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS')\n\t\t\t.' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data query\n\t *\n\t * Generates a platform-specific query so that the column data can be retrieved\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _field_data($table)\n\t{\n\t\treturn 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\treturn $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : '');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_4d_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO 4D Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_4d_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= 'CREATE SCHEMA %s';\n\n\t/**\n\t * DROP DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_database\t= 'DROP SCHEMA %s';\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= 'CREATE TABLE IF NOT EXISTS';\n\n\t/**\n\t * RENAME TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_rename_table\t= FALSE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= 'DROP TABLE IF EXISTS';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'INT16'\t\t=> 'INT',\n\t\t'SMALLINT'\t=> 'INT',\n\t\t'INT'\t\t=> 'INT64',\n\t\t'INT32'\t\t=> 'INT64'\n\t);\n\n\t/**\n\t * DEFAULT value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_default\t\t= FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('ADD', 'DROP'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t// No method of modifying columns is supported\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['null']\n\t\t\t.$field['unique']\n\t\t\t.$field['auto_increment'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INTEGER':\n\t\t\t\t$attributes['TYPE'] = 'INT';\n\t\t\t\treturn;\n\t\t\tcase 'BIGINT':\n\t\t\t\t$attributes['TYPE'] = 'INT64';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute UNIQUE\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_unique(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE)\n\t\t{\n\t\t\t$field['unique'] = ' UNIQUE';\n\n\t\t\t// UNIQUE must be used with NOT NULL\n\t\t\t$field['null'] = ' NOT NULL';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE)\n\t\t{\n\t\t\tif (stripos($field['type'], 'int') !== FALSE)\n\t\t\t{\n\t\t\t\t$field['auto_increment'] = ' AUTO_INCREMENT';\n\t\t\t}\n\t\t\telseif (strcasecmp($field['type'], 'UUID') === 0)\n\t\t\t{\n\t\t\t\t$field['auto_increment'] = ' AUTO_GENERATE';\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO CUBRID Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'cubrid';\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '`';\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var array\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM(%d)');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\n\t\t\tempty($this->port) OR $this->dsn .= ';port='.$this->port;\n\t\t\tempty($this->database) OR $this->dsn .= ';dbname='.$this->database;\n\t\t\tempty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SHOW TABLES';\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%'\";\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->Field;\n\n\t\t\tsscanf($query[$i]->Type, '%[a-z](%d)',\n\t\t\t\t$retval[$i]->type,\n\t\t\t\t$retval[$i]->max_length\n\t\t\t);\n\n\t\t\t$retval[$i]->default\t\t= $query[$i]->Default;\n\t\t\t$retval[$i]->primary_key\t= (int) ($query[$i]->Key === 'PRI');\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FROM tables\n\t *\n\t * Groups tables in FROM clauses if needed, so there is no confusion\n\t * about operator precedence.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _from_tables()\n\t{\n\t\tif ( ! empty($this->qb_join) && count($this->qb_from) > 1)\n\t\t{\n\t\t\treturn '('.implode(', ', $this->qb_from).')';\n\t\t}\n\n\t\treturn implode(', ', $this->qb_from);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO CUBRID Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_cubrid_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= FALSE;\n\n\t/**\n\t * DROP DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_database\t= FALSE;\n\n\t/**\n\t * CREATE TABLE keys flag\n\t *\n\t * Whether table keys are created from within the\n\t * CREATE TABLE statement.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_create_table_keys\t= TRUE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= 'DROP TABLE IF EXISTS';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'SHORT'\t\t=> 'INTEGER',\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'INTEGER'\t=> 'BIGINT',\n\t\t'BIGINT'\t=> 'NUMERIC',\n\t\t'FLOAT'\t\t=> 'DOUBLE',\n\t\t'REAL'\t\t=> 'DOUBLE'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('DROP', 'ADD'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' CHANGE '.$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE ';\n\t\t\t\t$sqls[] = $sql.$alter_type.$this->_process_column($field[$i]);\n\t\t\t}\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\t$extra_clause = isset($field['after'])\n\t\t\t? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';\n\n\t\tif (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)\n\t\t{\n\t\t\t$extra_clause = ' FIRST';\n\t\t}\n\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['null']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['unique']\n\t\t\t.$extra_clause;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'LONGTEXT':\n\t\t\t\t$attributes['TYPE'] = 'STRING';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process indexes\n\t *\n\t * @param\tstring\t$table\t(ignored)\n\t * @return\tstring\n\t */\n\tprotected function _process_indexes($table)\n\t{\n\t\t$sql = '';\n\n\t\tfor ($i = 0, $c = count($this->keys); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_array($this->keys[$i]))\n\t\t\t{\n\t\t\t\tfor ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)\n\t\t\t\t{\n\t\t\t\t\tif ( ! isset($this->fields[$this->keys[$i][$i2]]))\n\t\t\t\t\t{\n\t\t\t\t\t\tunset($this->keys[$i][$i2]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! isset($this->fields[$this->keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->keys[$i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tis_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);\n\n\t\t\t$sql .= \",\\n\\tKEY \".$this->db->escape_identifiers(implode('_', $this->keys[$i]))\n\t\t\t\t.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';\n\t\t}\n\n\t\t$this->keys = array();\n\n\t\treturn $sql;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO DBLIB Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'dblib';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('NEWID()', 'RAND(%d)');\n\n\t/**\n\t * Quoted identifier flag\n\t *\n\t * Whether to use SQL-92 standard quoted identifier\n\t * (double quotes) or brackets for identifier escaping.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_quoted_identifier;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\n\t\t\tif ( ! empty($this->port))\n\t\t\t{\n\t\t\t\t$this->dsn .= (DIRECTORY_SEPARATOR === '\\\\' ? ',' : ':').$this->port;\n\t\t\t}\n\n\t\t\tempty($this->database) OR $this->dsn .= ';dbname='.$this->database;\n\t\t\tempty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;\n\t\t\tempty($this->appname) OR $this->dsn .= ';appname='.$this->appname;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE)\n\t\t\t{\n\t\t\t\t$this->dsn .= ';charset='.$this->char_set;\n\t\t\t}\n\n\t\t\t$this->subdriver = 'dblib';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tobject\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tif ($persistent === TRUE)\n\t\t{\n\t\t\tlog_message('debug', \"dblib driver doesn't support persistent connections\");\n\t\t}\n\n\t\t$this->conn_id = parent::db_connect(FALSE);\n\n\t\tif ( ! is_object($this->conn_id))\n\t\t{\n\t\t\treturn $this->conn_id;\n\t\t}\n\n\t\t// Determine how identifiers are escaped\n\t\t$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi');\n\t\t$query = $query->row_array();\n\t\t$this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi'];\n\t\t$this->_escape_char = ($this->_quoted_identifier) ? '\"' : array('[', ']');\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT '.$this->escape_identifiers('name')\n\t\t\t.' FROM '.$this->escape_identifiers('sysobjects')\n\t\t\t.' WHERE '.$this->escape_identifiers('type').\" = 'U'\";\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' AND '.$this->escape_identifiers('name').\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql.' ORDER BY '.$this->escape_identifiers('name');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT COLUMN_NAME\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->COLUMN_NAME;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->DATA_TYPE;\n\t\t\t$retval[$i]->max_length\t\t= ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION;\n\t\t\t$retval[$i]->default\t\t= $query[$i]->COLUMN_DEFAULT;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\tif ($this->qb_limit)\n\t\t{\n\t\t\treturn 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete';\n\t\t}\n\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t$limit = $this->qb_offset + $this->qb_limit;\n\n\t\t// As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported,\n\t\t// however an ORDER BY clause is required for it to work\n\t\tif (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby))\n\t\t{\n\t\t\t$orderby = $this->_compile_order_by();\n\n\t\t\t// We have to strip the ORDER BY clause\n\t\t\t$sql = trim(substr($sql, 0, strrpos($sql, $orderby)));\n\n\t\t\t// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results\n\t\t\tif (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE)\n\t\t\t{\n\t\t\t\t$select = '*'; // Inevitable\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Use only field names and their aliases, everything else is out of our scope.\n\t\t\t\t$select = array();\n\t\t\t\t$field_regexp = ($this->_quoted_identifier)\n\t\t\t\t\t? '(\"[^\\\"]+\")' : '(\\[[^\\]]+\\])';\n\t\t\t\tfor ($i = 0, $c = count($this->qb_select); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$select[] = preg_match('/(?:\\s|\\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m)\n\t\t\t\t\t\t? $m[1] : $this->qb_select[$i];\n\t\t\t\t}\n\t\t\t\t$select = implode(', ', $select);\n\t\t\t}\n\n\t\t\treturn 'SELECT '.$select.\" FROM (\\n\\n\"\n\t\t\t\t.preg_replace('/^(SELECT( DISTINCT)?)/i', '\\\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql)\n\t\t\t\t.\"\\n\\n) \".$this->escape_identifiers('CI_subquery')\n\t\t\t\t.\"\\nWHERE \".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit;\n\t\t}\n\n\t\treturn preg_replace('/(^\\SELECT (DISTINCT)?)/i','\\\\1 TOP '.$limit.' ', $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring|bool\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\t// Multiple-value inserts are only supported as of SQL Server 2008\n\t\tif (version_compare($this->version(), '10', '>='))\n\t\t{\n\t\t\treturn parent::_insert_batch($table, $keys, $values);\n\t\t}\n\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return      string\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\treturn $this->data_cache['version'] = $this->conn_id->query(\"SELECT SERVERPROPERTY('ProductVersion') AS ver\")->fetchColumn(0);\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO DBLIB Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_dblib_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= \"IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nCREATE TABLE\";\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= \"IF EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nDROP TABLE\";\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT'\t=> 'SMALLINT',\n\t\t'SMALLINT'\t=> 'INT',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'REAL'\t\t=> 'FLOAT'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('ADD', 'DROP'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN ';\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\t$sqls[] = $sql.$this->_process_column($field[$i]);\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tif (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)\n\t\t{\n\t\t\tunset($attributes['CONSTRAINT']);\n\t\t}\n\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INTEGER':\n\t\t\t\t$attributes['TYPE'] = 'INT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['auto_increment'] = ' IDENTITY(1,1)';\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Firebird Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_firebird_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'firebird';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RAND()', 'RAND()');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'firebird:';\n\n\t\t\tif ( ! empty($this->database))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'dbname='.$this->database;\n\t\t\t}\n\t\t\telseif ( ! empty($this->hostname))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'dbname='.$this->hostname;\n\t\t\t}\n\n\t\t\tempty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;\n\t\t\tempty($this->role) OR $this->dsn .= ';role='.$this->role;\n\t\t}\n\t\telseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE)\n\t\t{\n\t\t\t$this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"RDB$RELATION_NAME\" FROM \"RDB$RELATIONS\" WHERE \"RDB$RELATION_NAME\" NOT LIKE \\'RDB$%\\' AND \"RDB$RELATION_NAME\" NOT LIKE \\'MON$%\\'';\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' AND \"RDB$RELATION_NAME\" LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT \"RDB$FIELD_NAME\" FROM \"RDB$RELATION_FIELDS\" WHERE \"RDB$RELATION_NAME\" = '.$this->escape($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT \"rfields\".\"RDB$FIELD_NAME\" AS \"name\",\n\t\t\t\tCASE \"fields\".\"RDB$FIELD_TYPE\"\n\t\t\t\t\tWHEN 7 THEN \\'SMALLINT\\'\n\t\t\t\t\tWHEN 8 THEN \\'INTEGER\\'\n\t\t\t\t\tWHEN 9 THEN \\'QUAD\\'\n\t\t\t\t\tWHEN 10 THEN \\'FLOAT\\'\n\t\t\t\t\tWHEN 11 THEN \\'DFLOAT\\'\n\t\t\t\t\tWHEN 12 THEN \\'DATE\\'\n\t\t\t\t\tWHEN 13 THEN \\'TIME\\'\n\t\t\t\t\tWHEN 14 THEN \\'CHAR\\'\n\t\t\t\t\tWHEN 16 THEN \\'INT64\\'\n\t\t\t\t\tWHEN 27 THEN \\'DOUBLE\\'\n\t\t\t\t\tWHEN 35 THEN \\'TIMESTAMP\\'\n\t\t\t\t\tWHEN 37 THEN \\'VARCHAR\\'\n\t\t\t\t\tWHEN 40 THEN \\'CSTRING\\'\n\t\t\t\t\tWHEN 261 THEN \\'BLOB\\'\n\t\t\t\t\tELSE NULL\n\t\t\t\tEND AS \"type\",\n\t\t\t\t\"fields\".\"RDB$FIELD_LENGTH\" AS \"max_length\",\n\t\t\t\t\"rfields\".\"RDB$DEFAULT_VALUE\" AS \"default\"\n\t\t\tFROM \"RDB$RELATION_FIELDS\" \"rfields\"\n\t\t\t\tJOIN \"RDB$FIELDS\" \"fields\" ON \"rfields\".\"RDB$FIELD_SOURCE\" = \"fields\".\"RDB$FIELD_NAME\"\n\t\t\tWHERE \"rfields\".\"RDB$RELATION_NAME\" = '.$this->escape($table).'\n\t\t\tORDER BY \"rfields\".\"RDB$FIELD_POSITION\"';\n\n\t\treturn (($query = $this->query($sql)) !== FALSE)\n\t\t\t? $query->result_object()\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'DELETE FROM '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t// Limit clause depends on if Interbase or Firebird\n\t\tif (stripos($this->version(), 'firebird') !== FALSE)\n\t\t{\n\t\t\t$select = 'FIRST '.$this->qb_limit\n\t\t\t\t.($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : '');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$select = 'ROWS '\n\t\t\t\t.($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit);\n\t\t}\n\n\t\treturn preg_replace('`SELECT`i', 'SELECT '.$select, $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring|bool\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Firebird Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_firebird_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * RENAME TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_rename_table\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INTEGER'\t=> 'INT64',\n\t\t'FLOAT'\t\t=> 'DOUBLE PRECISION'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create database\n\t *\n\t * @param\tstring\t$db_name\n\t * @return\tstring\n\t */\n\tpublic function create_database($db_name)\n\t{\n\t\t// Firebird databases are flat files, so a path is required\n\n\t\t// Hostname is needed for remote access\n\t\tempty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name;\n\n\t\treturn parent::create_database('\"'.$db_name.'\"');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function drop_database($db_name)\n\t{\n\t\tif ( ! ibase_drop_db($this->conn_id))\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t}\n\t\telseif ( ! empty($this->db->data_cache['db_names']))\n\t\t{\n\t\t\t$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE);\n\t\t\tif ($key !== FALSE)\n\t\t\t{\n\t\t\t\tunset($this->db->data_cache['db_names'][$key]);\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('DROP', 'ADD'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif (isset($field[$i]['type']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TYPE '.$field[$i]['type'].$field[$i]['length'];\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['default']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' SET '.$field[$i]['default'];\n\t\t\t}\n\n\t\t\tif (isset($field[$i]['null']))\n\t\t\t{\n\t\t\t\t$sqls[] = 'UPDATE \"RDB$RELATION_FIELDS\" SET \"RDB$NULL_FLAG\" = '\n\t\t\t\t\t.($field[$i]['null'] === TRUE ? 'NULL' : '1')\n\t\t\t\t\t.' WHERE \"RDB$FIELD_NAME\" = '.$this->db->escape($field[$i]['name'])\n\t\t\t\t\t.' AND \"RDB$RELATION_NAME\" = '.$this->db->escape($table);\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['new_name']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);\n\t\t\t}\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['null']\n\t\t\t.$field['unique']\n\t\t\t.$field['default'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\treturn;\n\t\t\tcase 'BIGINT':\n\t\t\t\t$attributes['TYPE'] = 'INT64';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\t// Not supported\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO IBM DB2 Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_ibm_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'ibm';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'ibm:';\n\n\t\t\t// Pre-defined DSN\n\t\t\tif (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT))\n\t\t\t{\n\t\t\t\tif (isset($this->DSN))\n\t\t\t\t{\n\t\t\t\t\t$this->dsn .= 'DSN='.$this->DSN;\n\t\t\t\t}\n\t\t\t\telseif ( ! empty($this->database))\n\t\t\t\t{\n\t\t\t\t\t$this->dsn .= 'DSN='.$this->database;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';';\n\n\t\t\tif (isset($this->DATABASE))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'DATABASE='.$this->DATABASE.';';\n\t\t\t}\n\t\t\telseif ( ! empty($this->database))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'DATABASE='.$this->database.';';\n\t\t\t}\n\n\t\t\tif (isset($this->HOSTNAME))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';');\n\t\t\t}\n\n\t\t\tif (isset($this->PORT))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'PORT='.$this->port.';';\n\t\t\t}\n\t\t\telseif ( ! empty($this->port))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';PORT='.$this->port.';';\n\t\t\t}\n\n\t\t\t$this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;');\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"tabname\" FROM \"syscat\".\"tables\"\n\t\t\tWHERE \"type\" = \\'T\\' AND LOWER(\"tabschema\") = '.$this->escape(strtolower($this->database));\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' AND \"tabname\" LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT \"colname\" FROM \"syscat\".\"columns\"\n\t\t\tWHERE LOWER(\"tabschema\") = '.$this->escape(strtolower($this->database)).'\n\t\t\t\tAND LOWER(\"tabname\") = '.$this->escape(strtolower($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT \"colname\" AS \"name\", \"typename\" AS \"type\", \"default\" AS \"default\", \"length\" AS \"max_length\",\n\t\t\t\tCASE \"keyseq\" WHEN NULL THEN 0 ELSE 1 END AS \"primary_key\"\n\t\t\tFROM \"syscat\".\"columns\"\n\t\t\tWHERE LOWER(\"tabschema\") = '.$this->escape(strtolower($this->database)).'\n\t\t\t\tAND LOWER(\"tabname\") = '.$this->escape(strtolower($table)).'\n\t\t\tORDER BY \"colno\"';\n\n\t\treturn (($query = $this->query($sql)) !== FALSE)\n\t\t\t? $query->result_object()\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t$sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY';\n\n\t\treturn ($this->qb_offset)\n\t\t\t? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset\n\t\t\t: $sql;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO IBM DB2 Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_ibm_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * RENAME TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_rename_table\t= 'RENAME TABLE %s TO %s';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'INTEGER'\t=> 'BIGINT'\n\t);\n\n\t/**\n\t * DEFAULT value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_default\t\t= FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'CHANGE')\n\t\t{\n\t\t\t$alter_type = 'MODIFY';\n\t\t}\n\n\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute UNIQUE\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_unique(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE)\n\t\t{\n\t\t\t$field['unique'] = ' UNIQUE';\n\n\t\t\t// UNIQUE must be used with NOT NULL\n\t\t\t$field['null'] = ' NOT NULL';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\t// Not supported\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_informix_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Informix Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_informix_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'informix';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('ASC', 'ASC'); // Currently not supported\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'informix:';\n\n\t\t\t// Pre-defined DSN\n\t\t\tif (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service))\n\t\t\t{\n\t\t\t\tif (isset($this->DSN))\n\t\t\t\t{\n\t\t\t\t\t$this->dsn .= 'DSN='.$this->DSN;\n\t\t\t\t}\n\t\t\t\telseif ( ! empty($this->database))\n\t\t\t\t{\n\t\t\t\t\t$this->dsn .= 'DSN='.$this->database;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isset($this->host))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'host='.$this->host;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\t\t\t}\n\n\t\t\tif (isset($this->service))\n\t\t\t{\n\t\t\t\t$this->dsn .= '; service='.$this->service;\n\t\t\t}\n\t\t\telseif ( ! empty($this->port))\n\t\t\t{\n\t\t\t\t$this->dsn .= '; service='.$this->port;\n\t\t\t}\n\n\t\t\tempty($this->database) OR $this->dsn .= '; database='.$this->database;\n\t\t\tempty($this->server) OR $this->dsn .= '; server='.$this->server;\n\n\t\t\t$this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp')\n\t\t\t\t.'; EnableScrollableCursors=1';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"tabname\" FROM \"systables\"\n\t\t\tWHERE \"tabid\" > 99 AND \"tabtype\" = \\'T\\' AND LOWER(\"owner\") = '.$this->escape(strtolower($this->username));\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' AND \"tabname\" LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\tif (strpos($table, '.') !== FALSE)\n\t\t{\n\t\t\tsscanf($table, '%[^.].%s', $owner, $table);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$owner = $this->username;\n\t\t}\n\n\t\treturn 'SELECT \"colname\" FROM \"systables\", \"syscolumns\"\n\t\t\tWHERE \"systables\".\"tabid\" = \"syscolumns\".\"tabid\"\n\t\t\t\tAND \"systables\".\"tabtype\" = \\'T\\'\n\t\t\t\tAND LOWER(\"systables\".\"owner\") = '.$this->escape(strtolower($owner)).'\n\t\t\t\tAND LOWER(\"systables\".\"tabname\") = '.$this->escape(strtolower($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT \"syscolumns\".\"colname\" AS \"name\",\n\t\t\t\tCASE \"syscolumns\".\"coltype\"\n\t\t\t\t\tWHEN 0 THEN \\'CHAR\\'\n\t\t\t\t\tWHEN 1 THEN \\'SMALLINT\\'\n\t\t\t\t\tWHEN 2 THEN \\'INTEGER\\'\n\t\t\t\t\tWHEN 3 THEN \\'FLOAT\\'\n\t\t\t\t\tWHEN 4 THEN \\'SMALLFLOAT\\'\n\t\t\t\t\tWHEN 5 THEN \\'DECIMAL\\'\n\t\t\t\t\tWHEN 6 THEN \\'SERIAL\\'\n\t\t\t\t\tWHEN 7 THEN \\'DATE\\'\n\t\t\t\t\tWHEN 8 THEN \\'MONEY\\'\n\t\t\t\t\tWHEN 9 THEN \\'NULL\\'\n\t\t\t\t\tWHEN 10 THEN \\'DATETIME\\'\n\t\t\t\t\tWHEN 11 THEN \\'BYTE\\'\n\t\t\t\t\tWHEN 12 THEN \\'TEXT\\'\n\t\t\t\t\tWHEN 13 THEN \\'VARCHAR\\'\n\t\t\t\t\tWHEN 14 THEN \\'INTERVAL\\'\n\t\t\t\t\tWHEN 15 THEN \\'NCHAR\\'\n\t\t\t\t\tWHEN 16 THEN \\'NVARCHAR\\'\n\t\t\t\t\tWHEN 17 THEN \\'INT8\\'\n\t\t\t\t\tWHEN 18 THEN \\'SERIAL8\\'\n\t\t\t\t\tWHEN 19 THEN \\'SET\\'\n\t\t\t\t\tWHEN 20 THEN \\'MULTISET\\'\n\t\t\t\t\tWHEN 21 THEN \\'LIST\\'\n\t\t\t\t\tWHEN 22 THEN \\'Unnamed ROW\\'\n\t\t\t\t\tWHEN 40 THEN \\'LVARCHAR\\'\n\t\t\t\t\tWHEN 41 THEN \\'BLOB/CLOB/BOOLEAN\\'\n\t\t\t\t\tWHEN 4118 THEN \\'Named ROW\\'\n\t\t\t\t\tELSE \"syscolumns\".\"coltype\"\n\t\t\t\tEND AS \"type\",\n\t\t\t\t\"syscolumns\".\"collength\" as \"max_length\",\n\t\t\t\tCASE \"sysdefaults\".\"type\"\n\t\t\t\t\tWHEN \\'L\\' THEN \"sysdefaults\".\"default\"\n\t\t\t\t\tELSE NULL\n\t\t\t\tEND AS \"default\"\n\t\t\tFROM \"syscolumns\", \"systables\", \"sysdefaults\"\n\t\t\tWHERE \"syscolumns\".\"tabid\" = \"systables\".\"tabid\"\n\t\t\t\tAND \"systables\".\"tabid\" = \"sysdefaults\".\"tabid\"\n\t\t\t\tAND \"syscolumns\".\"colno\" = \"sysdefaults\".\"colno\"\n\t\t\t\tAND \"systables\".\"tabtype\" = \\'T\\'\n\t\t\t\tAND LOWER(\"systables\".\"owner\") = '.$this->escape(strtolower($this->username)).'\n\t\t\t\tAND LOWER(\"systables\".\"tabname\") = '.$this->escape(strtolower($table)).'\n\t\t\tORDER BY \"syscolumns\".\"colno\"';\n\n\t\treturn (($query = $this->query($sql)) !== FALSE)\n\t\t\t? $query->result_object()\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE TABLE ONLY '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\t$SQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t$select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' ';\n\t\treturn preg_replace('/^(SELECT\\s)/i', $select, $sql, 1);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_informix_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Informix Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_informix_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * RENAME TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_rename_table\t= 'RENAME TABLE %s TO %s';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'INTEGER'\t=> 'BIGINT',\n\t\t'REAL'\t\t=> 'DOUBLE PRECISION',\n\t\t'SMALLFLOAT'\t=> 'DOUBLE PRECISION'\n\t);\n\n\t/**\n\t * DEFAULT value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_default\t\t= ', ';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'CHANGE')\n\t\t{\n\t\t\t$alter_type = 'MODIFY';\n\t\t}\n\n\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'BYTE':\n\t\t\tcase 'TEXT':\n\t\t\tcase 'BLOB':\n\t\t\tcase 'CLOB':\n\t\t\t\t$attributes['UNIQUE'] = FALSE;\n\t\t\t\tif (isset($attributes['DEFAULT']))\n\t\t\t\t{\n\t\t\t\t\tunset($attributes['DEFAULT']);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute UNIQUE\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_unique(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE)\n\t\t{\n\t\t\t$field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\t// Not supported\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO MySQL Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'mysql';\n\n\t/**\n\t * Compression flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $compress = FALSE;\n\n\t/**\n\t * Strict ON flag\n\t *\n\t * Whether we're running in strict SQL mode.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $stricton;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '`';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\n\t\t\tempty($this->port) OR $this->dsn .= ';port='.$this->port;\n\t\t\tempty($this->database) OR $this->dsn .= ';dbname='.$this->database;\n\t\t\tempty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t\telseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE)\n\t\t{\n\t\t\t$this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tobject\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tif (isset($this->stricton))\n\t\t{\n\t\t\tif ($this->stricton)\n\t\t\t{\n\t\t\t\t$sql = 'CONCAT(@@sql_mode, \",\", \"STRICT_ALL_TABLES\")';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(\n                                        @@sql_mode,\n                                        \"STRICT_ALL_TABLES,\", \"\"),\n                                        \",STRICT_ALL_TABLES\", \"\"),\n                                        \"STRICT_ALL_TABLES\", \"\"),\n                                        \"STRICT_TRANS_TABLES,\", \"\"),\n                                        \",STRICT_TRANS_TABLES\", \"\"),\n                                        \"STRICT_TRANS_TABLES\", \"\")';\n\t\t\t}\n\n\t\t\tif ( ! empty($sql))\n\t\t\t{\n\t\t\t\tif (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND]))\n\t\t\t\t{\n\t\t\t\t\t$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ($this->compress === TRUE)\n\t\t{\n\t\t\t$this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE;\n\t\t}\n\n\t\tif (is_array($this->encrypt))\n\t\t{\n\t\t\t$ssl = array();\n\t\t\tempty($this->encrypt['ssl_key'])    OR $ssl[PDO::MYSQL_ATTR_SSL_KEY]    = $this->encrypt['ssl_key'];\n\t\t\tempty($this->encrypt['ssl_cert'])   OR $ssl[PDO::MYSQL_ATTR_SSL_CERT]   = $this->encrypt['ssl_cert'];\n\t\t\tempty($this->encrypt['ssl_ca'])     OR $ssl[PDO::MYSQL_ATTR_SSL_CA]     = $this->encrypt['ssl_ca'];\n\t\t\tempty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath'];\n\t\t\tempty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher'];\n\n\t\t\tif (defined('PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT') && isset($this->encrypt['ssl_verify']))\n\t\t\t{\n\t\t\t\t$ssl[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = $this->encrypt['ssl_verify'];\n\t\t\t}\n\n\t\t\t// DO NOT use array_merge() here!\n\t\t\t// It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers.\n\t\t\tempty($ssl) OR $this->options += $ssl;\n\t\t}\n\n\t\t// Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails\n\t\tif (\n\t\t\t($pdo = parent::db_connect($persistent)) !== FALSE\n\t\t\t&& ! empty($ssl)\n\t\t\t&& version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=')\n\t\t\t&& empty($pdo->query(\"SHOW STATUS LIKE 'ssl_cipher'\")->fetchObject()->Value)\n\t\t)\n\t\t{\n\t\t\t$message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!';\n\t\t\tlog_message('error', $message);\n\t\t\treturn ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE;\n\t\t}\n\n\t\treturn $pdo;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select the database\n\t *\n\t * @param\tstring\t$database\n\t * @return\tbool\n\t */\n\tpublic function db_select($database = '')\n\t{\n\t\tif ($database === '')\n\t\t{\n\t\t\t$database = $this->database;\n\t\t}\n\n\t\tif (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database)))\n\t\t{\n\t\t\t$this->database = $database;\n\t\t\t$this->data_cache = array();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\t$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);\n\t\treturn $this->conn_id->beginTransaction();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\tif ($this->conn_id->commit())\n\t\t{\n\t\t\t$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\tif ($this->conn_id->rollBack())\n\t\t{\n\t\t\t$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char;\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%'\";\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->Field;\n\n\t\t\tsscanf($query[$i]->Type, '%[a-z](%d)',\n\t\t\t\t$retval[$i]->type,\n\t\t\t\t$retval[$i]->max_length\n\t\t\t);\n\n\t\t\t$retval[$i]->default\t\t= $query[$i]->Default;\n\t\t\t$retval[$i]->primary_key\t= (int) ($query[$i]->Key === 'PRI');\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FROM tables\n\t *\n\t * Groups tables in FROM clauses if needed, so there is no confusion\n\t * about operator precedence.\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _from_tables()\n\t{\n\t\tif ( ! empty($this->qb_join) && count($this->qb_from) > 1)\n\t\t{\n\t\t\treturn '('.implode(', ', $this->qb_from).')';\n\t\t}\n\n\t\treturn implode(', ', $this->qb_from);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO MySQL Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_mysql_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s';\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= 'CREATE TABLE IF NOT EXISTS';\n\n\t/**\n\t * CREATE TABLE keys flag\n\t *\n\t * Whether table keys are created from within the\n\t * CREATE TABLE statement.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_create_table_keys\t= TRUE;\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= 'DROP TABLE IF EXISTS';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT',\n\t\t'SMALLINT',\n\t\t'MEDIUMINT',\n\t\t'INT',\n\t\t'INTEGER',\n\t\t'BIGINT',\n\t\t'REAL',\n\t\t'DOUBLE',\n\t\t'DOUBLE PRECISION',\n\t\t'FLOAT',\n\t\t'DECIMAL',\n\t\t'NUMERIC'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null = 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CREATE TABLE attributes\n\t *\n\t * @param\tarray\t$attributes\tAssociative array of table attributes\n\t * @return\tstring\n\t */\n\tprotected function _create_table_attr($attributes)\n\t{\n\t\t$sql = '';\n\n\t\tforeach (array_keys($attributes) as $key)\n\t\t{\n\t\t\tif (is_string($key))\n\t\t\t{\n\t\t\t\t$sql .= ' '.strtoupper($key).' = '.$attributes[$key];\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty($this->db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET'))\n\t\t{\n\t\t\t$sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set;\n\t\t}\n\n\t\tif ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE'))\n\t\t{\n\t\t\t$sql .= ' COLLATE = '.$this->db->dbcollat;\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP')\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$field[$i] = ($alter_type === 'ADD')\n\t\t\t\t\t\t? \"\\n\\tADD \".$field[$i]['_literal']\n\t\t\t\t\t\t: \"\\n\\tMODIFY \".$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ($alter_type === 'ADD')\n\t\t\t\t{\n\t\t\t\t\t$field[$i]['_literal'] = \"\\n\\tADD \";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$field[$i]['_literal'] = empty($field[$i]['new_name']) ? \"\\n\\tMODIFY \" : \"\\n\\tCHANGE \";\n\t\t\t\t}\n\n\t\t\t\t$field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]);\n\t\t\t}\n\t\t}\n\n\t\treturn array($sql.implode(',', $field));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\t$extra_clause = isset($field['after'])\n\t\t\t? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';\n\n\t\tif (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)\n\t\t{\n\t\t\t$extra_clause = ' FIRST';\n\t\t}\n\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['null']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['unique']\n\t\t\t.(empty($field['comment']) ? '' : ' COMMENT '.$field['comment'])\n\t\t\t.$extra_clause;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process indexes\n\t *\n\t * @param\tstring\t$table\t(ignored)\n\t * @return\tstring\n\t */\n\tprotected function _process_indexes($table)\n\t{\n\t\t$sql = '';\n\n\t\tfor ($i = 0, $c = count($this->keys); $i < $c; $i++)\n\t\t{\n\t\t\tif (is_array($this->keys[$i]))\n\t\t\t{\n\t\t\t\tfor ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)\n\t\t\t\t{\n\t\t\t\t\tif ( ! isset($this->fields[$this->keys[$i][$i2]]))\n\t\t\t\t\t{\n\t\t\t\t\t\tunset($this->keys[$i][$i2]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! isset($this->fields[$this->keys[$i]]))\n\t\t\t{\n\t\t\t\tunset($this->keys[$i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tis_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);\n\n\t\t\t$sql .= \",\\n\\tKEY \".$this->db->escape_identifiers(implode('_', $this->keys[$i]))\n\t\t\t\t.' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';\n\t\t}\n\n\t\t$this->keys = array();\n\n\t\treturn $sql;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_oci_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Oracle Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_oci_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'oci';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List of reserved identifiers\n\t *\n\t * Identifiers that must NOT be escaped.\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_reserved_identifiers = array('*', 'rownum');\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('ASC', 'ASC'); // Currently not supported\n\n\t/**\n\t * COUNT string\n\t *\n\t * @used-by\tCI_DB_driver::count_all()\n\t * @used-by\tCI_DB_query_builder::count_all_results()\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_count_string = 'SELECT COUNT(1) AS ';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'oci:dbname=';\n\n\t\t\t// Oracle has a slightly different PDO DSN format (Easy Connect),\n\t\t\t// which also supports pre-defined DSNs.\n\t\t\tif (empty($this->hostname) && empty($this->port))\n\t\t\t{\n\t\t\t\t$this->dsn .= $this->database;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname)\n\t\t\t\t\t.(empty($this->port) ? '' : ':'.$this->port).'/';\n\n\t\t\t\tempty($this->database) OR $this->dsn .= $this->database;\n\t\t\t}\n\n\t\t\tempty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t\telseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE)\n\t\t{\n\t\t\t$this->dsn .= ';charset='.$this->char_set;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\t$version_string = parent::version();\n\t\tif (preg_match('#(Release\\s)?(?<version>\\d+(?:\\.\\d+)+)#', $version_string, $match))\n\t\t{\n\t\t\treturn $this->data_cache['version'] = $match['version'];\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"TABLE_NAME\" FROM \"ALL_TABLES\"';\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' WHERE \"TABLE_NAME\" LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\tif (strpos($table, '.') !== FALSE)\n\t\t{\n\t\t\tsscanf($table, '%[^.].%s', $owner, $table);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$owner = $this->username;\n\t\t}\n\n\t\treturn 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS\n\t\t\tWHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).'\n\t\t\t\tAND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (strpos($table, '.') !== FALSE)\n\t\t{\n\t\t\tsscanf($table, '%[^.].%s', $owner, $table);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$owner = $this->username;\n\t\t}\n\n\t\t$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE\n\t\t\tFROM ALL_TAB_COLUMNS\n\t\t\tWHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).'\n\t\t\t\tAND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->COLUMN_NAME;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->DATA_TYPE;\n\n\t\t\t$length = ($query[$i]->CHAR_LENGTH > 0)\n\t\t\t\t? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION;\n\t\t\tif ($length === NULL)\n\t\t\t{\n\t\t\t\t$length = $query[$i]->DATA_LENGTH;\n\t\t\t}\n\t\t\t$retval[$i]->max_length\t\t= $length;\n\n\t\t\t$default = $query[$i]->DATA_DEFAULT;\n\t\t\tif ($default === NULL && $query[$i]->NULLABLE === 'N')\n\t\t\t{\n\t\t\t\t$default = '';\n\t\t\t}\n\t\t\t$retval[$i]->default\t\t= $query[$i]->COLUMN_DEFAULT;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return \tstring\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\t$keys = implode(', ', $keys);\n\t\t$sql = \"INSERT ALL\\n\";\n\n\t\tfor ($i = 0, $c = count($values); $i < $c; $i++)\n\t\t{\n\t\t\t$sql .= '\tINTO '.$table.' ('.$keys.') VALUES '.$values[$i].\"\\n\";\n\t\t}\n\n\t\treturn $sql.'SELECT * FROM dual';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\tif ($this->qb_limit)\n\t\t{\n\t\t\t$this->where('rownum <= ',$this->qb_limit, FALSE);\n\t\t\t$this->qb_limit = FALSE;\n\t\t}\n\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\tif (version_compare($this->version(), '12.1', '>='))\n\t\t{\n\t\t\t// OFFSET-FETCH can be used only with the ORDER BY clause\n\t\t\tempty($this->qb_orderby) && $sql .= ' ORDER BY 1';\n\n\t\t\treturn $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY';\n\t\t}\n\n\t\treturn 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')'\n\t\t\t.($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): '');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_oci_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO Oracle Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_oci_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_database\t= FALSE;\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * DROP DATABASE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_database\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP')\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\t\telseif ($alter_type === 'CHANGE')\n\t\t{\n\t\t\t$alter_type = 'MODIFY';\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\t$field[$i] = \"\\n\\t\".$field[$i]['_literal'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$field[$i]['_literal'] = \"\\n\\t\".$this->_process_column($field[$i]);\n\n\t\t\t\tif ( ! empty($field[$i]['comment']))\n\t\t\t\t{\n\t\t\t\t\t$sqls[] = 'COMMENT ON COLUMN '\n\t\t\t\t\t\t.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t\t.' IS '.$field[$i]['comment'];\n\t\t\t\t}\n\n\t\t\t\tif ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name']))\n\t\t\t\t{\n\t\t\t\t\t$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t\t.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$sql .= ' '.$alter_type.' ';\n\t\t$sql .= (count($field) === 1)\n\t\t\t\t? $field[0]\n\t\t\t\t: '('.implode(',', $field).')';\n\n\t\t// RENAME COLUMN must be executed after MODIFY\n\t\tarray_unshift($sqls, $sql);\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'number') !== FALSE && version_compare($this->db->version(), '12.1', '>='))\n\t\t{\n\t\t\t$field['auto_increment'] = ' GENERATED ALWAYS AS IDENTITY';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type'].$field['length']\n\t\t\t.$field['unsigned']\n\t\t\t.$field['default']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['null']\n\t\t\t.$field['unique'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tcase 'INT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tcase 'BIGINT':\n\t\t\t\t$attributes['TYPE'] = 'NUMBER';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO ODBC Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'odbc';\n\n\t/**\n\t * Database schema\n\t *\n\t * @var\tstring\n\t */\n\tpublic $schema = 'public';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Identifier escape character\n\t *\n\t * Must be empty for ODBC.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_escape_char = '';\n\n\t/**\n\t * ESCAPE statement string\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_like_escape_str = \" {escape '%s'} \";\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RND()', 'RND(%d)');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'odbc:';\n\n\t\t\t// Pre-defined DSN\n\t\t\tif (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT))\n\t\t\t{\n\t\t\t\tif (isset($this->DSN))\n\t\t\t\t{\n\t\t\t\t\t$this->dsn .= 'DSN='.$this->DSN;\n\t\t\t\t}\n\t\t\t\telseif ( ! empty($this->database))\n\t\t\t\t{\n\t\t\t\t\t$this->dsn .= 'DSN='.$this->database;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the DSN is not pre-configured - try to build an IBM DB2 connection string\n\t\t\t$this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';';\n\n\t\t\tif (isset($this->DATABASE))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'DATABASE='.$this->DATABASE.';';\n\t\t\t}\n\t\t\telseif ( ! empty($this->database))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'DATABASE='.$this->database.';';\n\t\t\t}\n\n\t\t\tif (isset($this->HOSTNAME))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';');\n\t\t\t}\n\n\t\t\tif (isset($this->PORT))\n\t\t\t{\n\t\t\t\t$this->dsn .= 'PORT='.$this->port.';';\n\t\t\t}\n\t\t\telseif ( ! empty($this->port))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';PORT='.$this->port.';';\n\t\t\t}\n\n\t\t\t$this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;');\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\t$this->display_error('db_unsupported_feature');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determines if a query is a \"write\" type.\n\t *\n\t * @param\tstring\tAn SQL query string\n\t * @return\tbool\n\t */\n\tpublic function is_write_type($sql)\n\t{\n\t\tif (preg_match('#^(INSERT|UPDATE).*RETURNING\\s.+(\\,\\s?.+)*$#is', $sql))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::is_write_type($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = \"SELECT table_name FROM information_schema.tables WHERE table_schema = '\".$this->schema.\"'\";\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.\" AND table_name LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table);\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO ODBC Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/database/\n */\nclass CI_DB_pdo_odbc_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\t// Not supported (in most databases at least)\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO PostgreSQL Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'pgsql';\n\n\t/**\n\t * Database schema\n\t *\n\t * @var\tstring\n\t */\n\tpublic $schema = 'public';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM()');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\n\t\t\tempty($this->port) OR $this->dsn .= ';port='.$this->port;\n\t\t\tempty($this->database) OR $this->dsn .= ';dbname='.$this->database;\n\n\t\t\tif ( ! empty($this->username))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';user='.$this->username;\n\t\t\t\tempty($this->password) OR $this->dsn .= ';password='.$this->password;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tobject\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\t$this->conn_id = parent::db_connect($persistent);\n\n\t\tif (is_object($this->conn_id) && ! empty($this->schema))\n\t\t{\n\t\t\t$this->simple_query('SET search_path TO '.$this->schema.',public');\n\t\t}\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @param\tstring\t$name\n\t * @return\tint\n\t */\n\tpublic function insert_id($name = NULL)\n\t{\n\t\tif ($name === NULL && version_compare($this->version(), '8.1', '>='))\n\t\t{\n\t\t\t$query = $this->query('SELECT LASTVAL() AS ins_id');\n\t\t\t$query = $query->row();\n\t\t\treturn $query->ins_id;\n\t\t}\n\n\t\treturn $this->conn_id->lastInsertId($name);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determines if a query is a \"write\" type.\n\t *\n\t * @param\tstring\tAn SQL query string\n\t * @return\tbool\n\t */\n\tpublic function is_write_type($sql)\n\t{\n\t\tif (preg_match('#^(INSERT|UPDATE).*RETURNING\\s.+(\\,\\s?.+)*$#is', $sql))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::is_write_type($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * \"Smart\" Escape String\n\t *\n\t * Escapes data based on type\n\t *\n\t * @param\tstring\t$str\n\t * @return\tmixed\n\t */\n\tpublic function escape($str)\n\t{\n\t\tif (is_bool($str))\n\t\t{\n\t\t\treturn ($str) ? 'TRUE' : 'FALSE';\n\t\t}\n\n\t\treturn parent::escape($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY\n\t *\n\t * @param\tstring\t$orderby\n\t * @param\tstring\t$direction\tASC, DESC or RANDOM\n\t * @param\tbool\t$escape\n\t * @return\tobject\n\t */\n\tpublic function order_by($orderby, $direction = '', $escape = NULL)\n\t{\n\t\t$direction = strtoupper(trim($direction));\n\t\tif ($direction === 'RANDOM')\n\t\t{\n\t\t\tif ( ! is_float($orderby) && ctype_digit((string) $orderby))\n\t\t\t{\n\t\t\t\t$orderby = ($orderby > 1)\n\t\t\t\t\t? (float) '0.'.$orderby\n\t\t\t\t\t: (float) $orderby;\n\t\t\t}\n\n\t\t\tif (is_float($orderby))\n\t\t\t{\n\t\t\t\t$this->simple_query('SET SEED '.$orderby);\n\t\t\t}\n\n\t\t\t$orderby = $this->_random_keyword[0];\n\t\t\t$direction = '';\n\t\t\t$escape = FALSE;\n\t\t}\n\n\t\treturn parent::order_by($orderby, $direction, $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"table_name\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = \\''.$this->schema.\"'\";\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' AND \"table_name\" LIKE \\''\n\t\t\t\t.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT \"column_name\"\n\t\t\tFROM \"information_schema\".\"columns\"\n\t\t\tWHERE \"table_schema\" = \\''.$this->schema.'\\' AND LOWER(\"table_name\") = '.$this->escape(strtolower($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT \"column_name\", \"data_type\", \"character_maximum_length\", \"numeric_precision\", \"column_default\"\n\t\t\tFROM \"information_schema\".\"columns\"\n\t\t\tWHERE \"table_schema\" = \\''.$this->schema.'\\' AND LOWER(\"table_name\") = '.$this->escape(strtolower($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->column_name;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->data_type;\n\t\t\t$retval[$i]->max_length\t\t= ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision;\n\t\t\t$retval[$i]->default\t\t= $query[$i]->column_default;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update_Batch statement\n\t *\n\t * Generates a platform-specific batch update string from the supplied data\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$values\tUpdate data\n\t * @param\tstring\t$index\tWHERE key\n\t * @return\tstring\n\t */\n\tprotected function _update_batch($table, $values, $index)\n\t{\n\t\t$ids = array();\n\t\tforeach ($values as $key => $val)\n\t\t{\n\t\t\t$ids[] = $val[$index]['value'];\n\n\t\t\tforeach (array_keys($val) as $field)\n\t\t\t{\n\t\t\t\tif ($field !== $index)\n\t\t\t\t{\n\t\t\t\t\t$final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$cases = '';\n\t\tforeach ($final as $k => $v)\n\t\t{\n\t\t\t$cases .= $k.' = (CASE '.$val[$index]['field'].\"\\n\"\n\t\t\t\t.implode(\"\\n\", $v).\"\\n\"\n\t\t\t\t.'ELSE '.$k.' END), ';\n\t\t}\n\n\t\t$this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE);\n\n\t\treturn 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\treturn $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : '');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO PostgreSQL Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_pgsql_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= 'DROP TABLE IF EXISTS';\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= 'CREATE TABLE IF NOT EXISTS';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'INT2'\t\t=> 'INTEGER',\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'INT4'\t\t=> 'BIGINT',\n\t\t'INTEGER'\t=> 'BIGINT',\n\t\t'INT8'\t\t=> 'NUMERIC',\n\t\t'BIGINT'\t=> 'NUMERIC',\n\t\t'REAL'\t\t=> 'DOUBLE PRECISION',\n\t\t'FLOAT'\t\t=> 'DOUBLE PRECISION'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null = 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$db\tDatabase object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\tparent::__construct($db);\n\n\t\tif (version_compare($this->db->version(), '9.0', '>'))\n\t\t{\n\t\t\t$this->create_table_if = 'CREATE TABLE IF NOT EXISTS';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('DROP', 'ADD'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TYPE '.$field[$i]['type'].$field[$i]['length'];\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['default']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' SET '.$field[$i]['default'];\n\t\t\t}\n\n\t\t\tif (isset($field[$i]['null']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.(trim($field[$i]['null']) === $this->_null ? ' DROP NOT NULL' : ' SET NOT NULL');\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['new_name']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['comment']))\n\t\t\t{\n\t\t\t\t$sqls[] = 'COMMENT ON COLUMN '\n\t\t\t\t\t.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' IS '.$field[$i]['comment'];\n\t\t\t}\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\t// Reset field lengths for data types that don't support it\n\t\tif (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE)\n\t\t{\n\t\t\t$attributes['CONSTRAINT'] = NULL;\n\t\t}\n\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE)\n\t\t{\n\t\t\t$field['type'] = ($field['type'] === 'NUMERIC')\n\t\t\t\t? 'BIGSERIAL'\n\t\t\t\t: 'SERIAL';\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO SQLite Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'sqlite';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM()');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'sqlite:';\n\n\t\t\tif (empty($this->database) && empty($this->hostname))\n\t\t\t{\n\t\t\t\t$this->database = ':memory:';\n\t\t\t}\n\n\t\t\t$this->database = empty($this->database) ? $this->hostname : $this->database;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"NAME\" FROM \"SQLITE_MASTER\" WHERE \"TYPE\" = \\'table\\'';\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' AND \"NAME\" LIKE \\''.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @return\tarray\n\t */\n\tpublic function list_fields($table)\n\t{\n\t\tif (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$fields = array();\n\t\tforeach ($result->result_array() as $row)\n\t\t{\n\t\t\t$fields[] = $row['name'];\n\t\t}\n\n\t\treturn $fields;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$query = $query->result_array();\n\t\tif (empty($query))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]['name'];\n\t\t\t$retval[$i]->type\t\t= $query[$i]['type'];\n\t\t\t$retval[$i]->max_length\t\t= NULL;\n\t\t\t$retval[$i]->default\t\t= $query[$i]['dflt_value'];\n\t\t\t$retval[$i]->primary_key\t= isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Replace statement\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return \tstring\n\t */\n\tprotected function _replace($table, $keys, $values)\n\t{\n\t\treturn 'INSERT OR '.parent::_replace($table, $keys, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'DELETE FROM '.$table;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO SQLite Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_sqlite_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= 'CREATE TABLE IF NOT EXISTS';\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= 'DROP TABLE IF EXISTS';\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$db\tDatabase object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\tparent::__construct($db);\n\n\t\tif (version_compare($this->db->version(), '3.3', '<'))\n\t\t{\n\t\t\t$this->_create_table_if = FALSE;\n\t\t\t$this->_drop_table_if   = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function create_database($db_name)\n\t{\n\t\t// In SQLite, a database is created when you connect to the database.\n\t\t// We'll return TRUE so that an error isn't generated\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function drop_database($db_name)\n\t{\n\t\t// In SQLite, a database is dropped when we delete a file\n\t\tif (file_exists($this->db->database))\n\t\t{\n\t\t\t// We need to close the pseudo-connection first\n\t\t\t$this->db->close();\n\t\t\tif ( ! @unlink($this->db->database))\n\t\t\t{\n\t\t\t\treturn $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t\t}\n\t\t\telseif ( ! empty($this->db->data_cache['db_names']))\n\t\t\t{\n\t\t\t\t$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE);\n\t\t\t\tif ($key !== FALSE)\n\t\t\t\t{\n\t\t\t\t\tunset($this->db->data_cache['db_names'][$key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP' OR $alter_type === 'CHANGE')\n\t\t{\n\t\t\t// drop_column():\n\t\t\t//\tBEGIN TRANSACTION;\n\t\t\t//\tCREATE TEMPORARY TABLE t1_backup(a,b);\n\t\t\t//\tINSERT INTO t1_backup SELECT a,b FROM t1;\n\t\t\t//\tDROP TABLE t1;\n\t\t\t//\tCREATE TABLE t1(a,b);\n\t\t\t//\tINSERT INTO t1 SELECT a,b FROM t1_backup;\n\t\t\t//\tDROP TABLE t1_backup;\n\t\t\t//\tCOMMIT;\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['null']\n\t\t\t.$field['unique']\n\t\t\t.$field['default'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'ENUM':\n\t\t\tcase 'SET':\n\t\t\t\t$attributes['TYPE'] = 'TEXT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['type'] = 'INTEGER PRIMARY KEY';\n\t\t\t$field['default'] = '';\n\t\t\t$field['null'] = '';\n\t\t\t$field['unique'] = '';\n\t\t\t$field['auto_increment'] = ' AUTOINCREMENT';\n\n\t\t\t$this->primary_keys = array();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO SQLSRV Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_sqlsrv_driver extends CI_DB_pdo_driver {\n\n\t/**\n\t * Sub-driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $subdriver = 'sqlsrv';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('NEWID()', 'RAND(%d)');\n\n\t/**\n\t * Quoted identifier flag\n\t *\n\t * Whether to use SQL-92 standard quoted identifier\n\t * (double quotes) or brackets for identifier escaping.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_quoted_identifier;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Builds the DSN if not already set.\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->dsn))\n\t\t{\n\t\t\t$this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname);\n\n\t\t\tempty($this->port) OR $this->dsn .= ','.$this->port;\n\t\t\tempty($this->database) OR $this->dsn .= ';Database='.$this->database;\n\n\t\t\t// Some custom options\n\n\t\t\tif (isset($this->QuotedId))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';QuotedId='.$this->QuotedId;\n\t\t\t\t$this->_quoted_identifier = (bool) $this->QuotedId;\n\t\t\t}\n\n\t\t\tif (isset($this->ConnectionPooling))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling;\n\t\t\t}\n\n\t\t\tif ($this->encrypt === TRUE)\n\t\t\t{\n\t\t\t\t$this->dsn .= ';Encrypt=1';\n\t\t\t}\n\n\t\t\tif (isset($this->TraceOn))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';TraceOn='.$this->TraceOn;\n\t\t\t}\n\n\t\t\tif (isset($this->TrustServerCertificate))\n\t\t\t{\n\t\t\t\t$this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate;\n\t\t\t}\n\n\t\t\tempty($this->APP) OR $this->dsn .= ';APP='.$this->APP;\n\t\t\tempty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner;\n\t\t\tempty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout;\n\t\t\tempty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets;\n\t\t\tempty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile;\n\t\t\tempty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID;\n\t\t}\n\t\telseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match))\n\t\t{\n\t\t\t$this->_quoted_identifier = (bool) $match[1];\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tobject\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tif ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set))\n\t\t{\n\t\t\t$this->options[PDO::SQLSRV_ENCODING_UTF8] = 1;\n\t\t}\n\n\t\t$this->conn_id = parent::db_connect($persistent);\n\n\t\tif ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier))\n\t\t{\n\t\t\treturn $this->conn_id;\n\t\t}\n\n\t\t// Determine how identifiers are escaped\n\t\t$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi');\n\t\t$query = $query->row_array();\n\t\t$this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi'];\n\t\t$this->_escape_char = ($this->_quoted_identifier) ? '\"' : array('[', ']');\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT '.$this->escape_identifiers('name')\n\t\t\t.' FROM '.$this->escape_identifiers('sysobjects')\n\t\t\t.' WHERE '.$this->escape_identifiers('type').\" = 'U'\";\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' AND '.$this->escape_identifiers('name').\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql.' ORDER BY '.$this->escape_identifiers('name');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT COLUMN_NAME\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->COLUMN_NAME;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->DATA_TYPE;\n\t\t\t$retval[$i]->max_length\t\t= ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION;\n\t\t\t$retval[$i]->default\t\t= $query[$i]->COLUMN_DEFAULT;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\tif ($this->qb_limit)\n\t\t{\n\t\t\treturn 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete';\n\t\t}\n\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t// As of SQL Server 2012 (11.0.*) OFFSET is supported\n\t\tif (version_compare($this->version(), '11', '>='))\n\t\t{\n\t\t\t// SQL Server OFFSET-FETCH can be used only with the ORDER BY clause\n\t\t\tempty($this->qb_orderby) && $sql .= ' ORDER BY 1';\n\n\t\t\treturn $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY';\n\t\t}\n\n\t\t$limit = $this->qb_offset + $this->qb_limit;\n\n\t\t// An ORDER BY clause is required for ROW_NUMBER() to work\n\t\tif ($this->qb_offset && ! empty($this->qb_orderby))\n\t\t{\n\t\t\t$orderby = $this->_compile_order_by();\n\n\t\t\t// We have to strip the ORDER BY clause\n\t\t\t$sql = trim(substr($sql, 0, strrpos($sql, $orderby)));\n\n\t\t\t// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results\n\t\t\tif (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE)\n\t\t\t{\n\t\t\t\t$select = '*'; // Inevitable\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Use only field names and their aliases, everything else is out of our scope.\n\t\t\t\t$select = array();\n\t\t\t\t$field_regexp = ($this->_quoted_identifier)\n\t\t\t\t\t? '(\"[^\\\"]+\")' : '(\\[[^\\]]+\\])';\n\t\t\t\tfor ($i = 0, $c = count($this->qb_select); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$select[] = preg_match('/(?:\\s|\\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m)\n\t\t\t\t\t\t? $m[1] : $this->qb_select[$i];\n\t\t\t\t}\n\t\t\t\t$select = implode(', ', $select);\n\t\t\t}\n\n\t\t\treturn 'SELECT '.$select.\" FROM (\\n\\n\"\n\t\t\t\t.preg_replace('/^(SELECT( DISTINCT)?)/i', '\\\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql)\n\t\t\t\t.\"\\n\\n) \".$this->escape_identifiers('CI_subquery')\n\t\t\t\t.\"\\nWHERE \".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit;\n\t\t}\n\n\t\treturn preg_replace('/(^\\SELECT (DISTINCT)?)/i','\\\\1 TOP '.$limit.' ', $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring|bool\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\t// Multiple-value inserts are only supported as of SQL Server 2008\n\t\tif (version_compare($this->version(), '10', '>='))\n\t\t{\n\t\t\treturn parent::_insert_batch($table, $keys, $values);\n\t\t}\n\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PDO SQLSRV Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_pdo_sqlsrv_forge extends CI_DB_pdo_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= \"IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nCREATE TABLE\";\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= \"IF EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nDROP TABLE\";\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT'\t=> 'SMALLINT',\n\t\t'SMALLINT'\t=> 'INT',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'REAL'\t\t=> 'FLOAT'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('ADD', 'DROP'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN ';\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\t$sqls[] = $sql.$this->_process_column($field[$i]);\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tif (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)\n\t\t{\n\t\t\tunset($attributes['CONSTRAINT']);\n\t\t}\n\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INTEGER':\n\t\t\t\t$attributes['TYPE'] = 'INT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['auto_increment'] = ' IDENTITY(1,1)';\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/postgre/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/postgre/postgre_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Postgre Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_postgre_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'postgre';\n\n\t/**\n\t * Database schema\n\t *\n\t * @var\tstring\n\t */\n\tpublic $schema = 'public';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM()');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Build DSN\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _build_dsn()\n\t{\n\t\t$this->dsn === '' OR $this->dsn = '';\n\n\t\tif (strpos($this->hostname, '/') !== FALSE)\n\t\t{\n\t\t\t// If UNIX sockets are used, we shouldn't set a port\n\t\t\t$this->port = '';\n\t\t}\n\n\t\t$this->hostname === '' OR $this->dsn = 'host='.$this->hostname.' ';\n\n\t\tif ( ! empty($this->port) && ctype_digit($this->port))\n\t\t{\n\t\t\t$this->dsn .= 'port='.$this->port.' ';\n\t\t}\n\n\t\tif ($this->username !== '')\n\t\t{\n\t\t\t$this->dsn .= 'user='.$this->username.' ';\n\n\t\t\t/* An empty password is valid!\n\t\t\t *\n\t\t\t * $db['password'] = NULL must be done in order to ignore it.\n\t\t\t */\n\t\t\t$this->password === NULL OR $this->dsn .= \"password='\".$this->password.\"' \";\n\t\t}\n\n\t\t$this->database === '' OR $this->dsn .= 'dbname='.$this->database.' ';\n\n\t\t/* We don't have these options as elements in our standard configuration\n\t\t * array, but they might be set by parse_url() if the configuration was\n\t\t * provided via string. Example:\n\t\t *\n\t\t * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1\n\t\t */\n\t\tforeach (array('connect_timeout', 'options', 'sslmode', 'service') as $key)\n\t\t{\n\t\t\tif (isset($this->$key) && is_string($this->$key) && $this->$key !== '')\n\t\t\t{\n\t\t\t\t$this->dsn .= $key.\"='\".$this->$key.\"' \";\n\t\t\t}\n\t\t}\n\n\t\t$this->dsn = rtrim($this->dsn);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource|object\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tempty($this->dsn) && $this->_build_dsn();\n\t\t$this->conn_id = ($persistent === TRUE)\n\t\t\t? pg_pconnect($this->dsn)\n\t\t\t: pg_connect($this->dsn);\n\n\t\tif ($this->conn_id !== FALSE)\n\t\t{\n\t\t\tif ($persistent === TRUE\n\t\t\t\t&& pg_connection_status($this->conn_id) === PGSQL_CONNECTION_BAD\n\t\t\t\t&& pg_ping($this->conn_id) === FALSE\n\t\t\t)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tempty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public');\n\t\t}\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reconnect\n\t *\n\t * Keep / reestablish the db connection if no queries have been\n\t * sent for a length of time exceeding the server's idle timeout\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function reconnect()\n\t{\n\t\tif (pg_ping($this->conn_id) === FALSE)\n\t\t{\n\t\t\t$this->conn_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set client character set\n\t *\n\t * @param\tstring\t$charset\n\t * @return\tbool\n\t */\n\tprotected function _db_set_charset($charset)\n\t{\n\t\treturn (pg_set_client_encoding($this->conn_id, $charset) === 0);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\tif ( ! $this->conn_id OR ($pg_version = pg_version($this->conn_id)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/* If PHP was compiled with PostgreSQL lib versions earlier\n\t\t * than 7.4, pg_version() won't return the server version\n\t\t * and so we'll have to fall back to running a query in\n\t\t * order to get it.\n\t\t */\n\t\treturn (isset($pg_version['server']) && preg_match('#^(\\d+\\.\\d+)#', $pg_version['server'], $match))\n\t\t\t? $this->data_cache['version'] = $match[1]\n\t\t\t: parent::version();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource|object\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn pg_query($this->conn_id, $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn (bool) pg_query($this->conn_id, 'BEGIN');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\treturn (bool) pg_query($this->conn_id, 'COMMIT');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\treturn (bool) pg_query($this->conn_id, 'ROLLBACK');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Determines if a query is a \"write\" type.\n\t *\n\t * @param\tstring\tAn SQL query string\n\t * @return\tbool\n\t */\n\tpublic function is_write_type($sql)\n\t{\n\t\tif (preg_match('#^(INSERT|UPDATE).*RETURNING\\s.+(\\,\\s?.+)*$#is', $sql))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::is_write_type($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn pg_escape_string($this->conn_id, $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * \"Smart\" Escape String\n\t *\n\t * Escapes data based on type\n\t *\n\t * @param\tstring\t$str\n\t * @return\tmixed\n\t */\n\tpublic function escape($str)\n\t{\n\t\tif (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))))\n\t\t{\n\t\t\treturn pg_escape_literal($this->conn_id, $str);\n\t\t}\n\t\telseif (is_bool($str))\n\t\t{\n\t\t\treturn ($str) ? 'TRUE' : 'FALSE';\n\t\t}\n\n\t\treturn parent::escape($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn pg_affected_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tstring\n\t */\n\tpublic function insert_id()\n\t{\n\t\t$v = $this->version();\n\n\t\t$table\t= (func_num_args() > 0) ? func_get_arg(0) : NULL;\n\t\t$column\t= (func_num_args() > 1) ? func_get_arg(1) : NULL;\n\n\t\tif ($table === NULL && $v >= '8.1')\n\t\t{\n\t\t\t$sql = 'SELECT LASTVAL() AS ins_id';\n\t\t}\n\t\telseif ($table !== NULL)\n\t\t{\n\t\t\tif ($column !== NULL && $v >= '8.0')\n\t\t\t{\n\t\t\t\t$sql = 'SELECT pg_get_serial_sequence(\\''.$table.\"', '\".$column.\"') AS seq\";\n\t\t\t\t$query = $this->query($sql);\n\t\t\t\t$query = $query->row();\n\t\t\t\t$seq = $query->seq;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// seq_name passed in table parameter\n\t\t\t\t$seq = $table;\n\t\t\t}\n\n\t\t\t$sql = 'SELECT CURRVAL(\\''.$seq.\"') AS ins_id\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn pg_last_oid($this->result_id);\n\t\t}\n\n\t\t$query = $this->query($sql);\n\t\t$query = $query->row();\n\t\treturn (int) $query->ins_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT \"table_name\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = \\''.$this->schema.\"'\";\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix !== '')\n\t\t{\n\t\t\treturn $sql.' AND \"table_name\" LIKE \\''\n\t\t\t\t.$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT \"column_name\"\n\t\t\tFROM \"information_schema\".\"columns\"\n\t\t\tWHERE \"table_schema\" = \\''.$this->schema.'\\' AND LOWER(\"table_name\") = '.$this->escape(strtolower($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT \"column_name\", \"data_type\", \"character_maximum_length\", \"numeric_precision\", \"column_default\"\n\t\t\tFROM \"information_schema\".\"columns\"\n\t\t\tWHERE \"table_schema\" = \\''.$this->schema.'\\' AND LOWER(\"table_name\") = '.$this->escape(strtolower($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->column_name;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->data_type;\n\t\t\t$retval[$i]->max_length\t\t= ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision;\n\t\t\t$retval[$i]->default\t\t= $query[$i]->column_default;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => '', 'message' => pg_last_error($this->conn_id));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY\n\t *\n\t * @param\tstring\t$orderby\n\t * @param\tstring\t$direction\tASC, DESC or RANDOM\n\t * @param\tbool\t$escape\n\t * @return\tobject\n\t */\n\tpublic function order_by($orderby, $direction = '', $escape = NULL)\n\t{\n\t\t$direction = strtoupper(trim($direction));\n\t\tif ($direction === 'RANDOM')\n\t\t{\n\t\t\tif ( ! is_float($orderby) && ctype_digit((string) $orderby))\n\t\t\t{\n\t\t\t\t$orderby = ($orderby > 1)\n\t\t\t\t\t? (float) '0.'.$orderby\n\t\t\t\t\t: (float) $orderby;\n\t\t\t}\n\n\t\t\tif (is_float($orderby))\n\t\t\t{\n\t\t\t\t$this->simple_query('SET SEED '.$orderby);\n\t\t\t}\n\n\t\t\t$orderby = $this->_random_keyword[0];\n\t\t\t$direction = '';\n\t\t\t$escape = FALSE;\n\t\t}\n\n\t\treturn parent::order_by($orderby, $direction, $escape);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update_Batch statement\n\t *\n\t * Generates a platform-specific batch update string from the supplied data\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$values\tUpdate data\n\t * @param\tstring\t$index\tWHERE key\n\t * @return\tstring\n\t */\n\tprotected function _update_batch($table, $values, $index)\n\t{\n\t\t$ids = array();\n\t\tforeach ($values as $key => $val)\n\t\t{\n\t\t\t$ids[] = $val[$index]['value'];\n\n\t\t\tforeach (array_keys($val) as $field)\n\t\t\t{\n\t\t\t\tif ($field !== $index)\n\t\t\t\t{\n\t\t\t\t\t$final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$cases = '';\n\t\tforeach ($final as $k => $v)\n\t\t{\n\t\t\t$cases .= $k.' = (CASE '.$val[$index]['field'].\"\\n\"\n\t\t\t\t.implode(\"\\n\", $v).\"\\n\"\n\t\t\t\t.'ELSE '.$k.' END), ';\n\t\t}\n\n\t\t$this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE);\n\n\t\treturn 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\treturn $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tpg_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/postgre/postgre_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Postgre Forge Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_postgre_forge extends CI_DB_forge {\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'INT2'\t\t=> 'INTEGER',\n\t\t'SMALLINT'\t=> 'INTEGER',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'INT4'\t\t=> 'BIGINT',\n\t\t'INTEGER'\t=> 'BIGINT',\n\t\t'INT8'\t\t=> 'NUMERIC',\n\t\t'BIGINT'\t=> 'NUMERIC',\n\t\t'REAL'\t\t=> 'DOUBLE PRECISION',\n\t\t'FLOAT'\t\t=> 'DOUBLE PRECISION'\n\t);\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null = 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$db\tDatabase object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\tparent::__construct($db);\n\n\t\tif (version_compare($this->db->version(), '9.0', '>'))\n\t\t{\n\t\t\t$this->create_table_if = 'CREATE TABLE IF NOT EXISTS';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('DROP', 'ADD'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\tif ($field[$i]['_literal'] !== FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TYPE '.$field[$i]['type'].$field[$i]['length'];\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['default']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' SET '.$field[$i]['default'];\n\t\t\t}\n\n\t\t\tif (isset($field[$i]['null']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.(trim($field[$i]['null']) === $this->_null ? ' DROP NOT NULL' : ' SET NOT NULL');\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['new_name']))\n\t\t\t{\n\t\t\t\t$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);\n\t\t\t}\n\n\t\t\tif ( ! empty($field[$i]['comment']))\n\t\t\t{\n\t\t\t\t$sqls[] = 'COMMENT ON COLUMN '\n\t\t\t\t\t.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name'])\n\t\t\t\t\t.' IS '.$field[$i]['comment'];\n\t\t\t}\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\t// Reset field lengths for data types that don't support it\n\t\tif (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE)\n\t\t{\n\t\t\t$attributes['CONSTRAINT'] = NULL;\n\t\t}\n\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'TINYINT':\n\t\t\t\t$attributes['TYPE'] = 'SMALLINT';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE)\n\t\t{\n\t\t\t$field['type'] = ($field['type'] === 'NUMERIC')\n\t\t\t\t? 'BIGSERIAL'\n\t\t\t\t: 'SERIAL';\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/postgre/postgre_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Postgres Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_postgre_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\treturn is_int($this->num_rows)\n\t\t\t? $this->num_rows\n\t\t\t: $this->num_rows = pg_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn pg_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$field_names[] = pg_field_name($this->result_id, $i);\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= pg_field_name($this->result_id, $i);\n\t\t\t$retval[$i]->type\t\t= pg_field_type($this->result_id, $i);\n\t\t\t$retval[$i]->max_length\t\t= pg_field_size($this->result_id, $i);\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif ($this->result_id !== FALSE)\n\t\t{\n\t\t\tpg_free_result($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn pg_result_seek($this->result_id, $n);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn pg_fetch_assoc($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn pg_fetch_object($this->result_id, NULL, $class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/postgre/postgre_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Postgre Utility Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_postgre_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t= 'SELECT datname FROM pg_database';\n\n\t/**\n\t * OPTIMIZE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_optimize_table\t= 'REINDEX TABLE %s';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/sqlite/sqlite_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'sqlite';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM()');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tresource\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\t$error = NULL;\n\t\t$conn_id = ($persistent === TRUE)\n\t\t\t? sqlite_popen($this->database, 0666, $error)\n\t\t\t: sqlite_open($this->database, 0666, $error);\n\n\t\tisset($error) && log_message('error', $error);\n\n\t\treturn $conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\treturn isset($this->data_cache['version'])\n\t\t\t? $this->data_cache['version']\n\t\t\t: $this->data_cache['version'] = sqlite_libversion();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn $this->is_write_type($sql)\n\t\t\t? sqlite_exec($this->conn_id, $sql)\n\t\t\t: sqlite_query($this->conn_id, $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn $this->simple_query('BEGIN TRANSACTION');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\treturn $this->simple_query('COMMIT');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\treturn $this->simple_query('ROLLBACK');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependant string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn sqlite_escape_string($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn sqlite_changes($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tint\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn sqlite_last_insert_rowid($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = \"SELECT name FROM sqlite_master WHERE type='table'\";\n\n\t\tif ($prefix_limit !== FALSE && $this->dbprefix != '')\n\t\t{\n\t\t\treturn $sql.\" AND 'name' LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \".sprintf($this->_like_escape_str, $this->_like_escape_chr);\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tbool\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\t// Not supported\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$query = $query->result_array();\n\t\tif (empty($query))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]['name'];\n\t\t\t$retval[$i]->type\t\t= $query[$i]['type'];\n\t\t\t$retval[$i]->max_length\t\t= NULL;\n\t\t\t$retval[$i]->default\t\t= $query[$i]['dflt_value'];\n\t\t\t$retval[$i]->primary_key\t= isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occured.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\t$error = array('code' => sqlite_last_error($this->conn_id));\n\t\t$error['message'] = sqlite_error_string($error['code']);\n\t\treturn $error;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Replace statement\n\t *\n\t * Generates a platform-specific replace string from the supplied data\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring\n\t */\n\tprotected function _replace($table, $keys, $values)\n\t{\n\t\treturn 'INSERT OR '.parent::_replace($table, $keys, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this function maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'DELETE FROM '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tsqlite_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite/sqlite_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= FALSE;\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function create_database($db_name)\n\t{\n\t\t// In SQLite, a database is created when you connect to the database.\n\t\t// We'll return TRUE so that an error isn't generated\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function drop_database($db_name)\n\t{\n\t\tif ( ! file_exists($this->db->database) OR ! @unlink($this->db->database))\n\t\t{\n\t\t\treturn ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t}\n\t\telseif ( ! empty($this->db->data_cache['db_names']))\n\t\t{\n\t\t\t$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE);\n\t\t\tif ($key !== FALSE)\n\t\t\t{\n\t\t\t\tunset($this->db->data_cache['db_names'][$key]);\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @todo\timplement drop_column(), modify_column()\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP' OR $alter_type === 'CHANGE')\n\t\t{\n\t\t\t// drop_column():\n\t\t\t//\tBEGIN TRANSACTION;\n\t\t\t//\tCREATE TEMPORARY TABLE t1_backup(a,b);\n\t\t\t//\tINSERT INTO t1_backup SELECT a,b FROM t1;\n\t\t\t//\tDROP TABLE t1;\n\t\t\t//\tCREATE TABLE t1(a,b);\n\t\t\t//\tINSERT INTO t1 SELECT a,b FROM t1_backup;\n\t\t\t//\tDROP TABLE t1_backup;\n\t\t\t//\tCOMMIT;\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['null']\n\t\t\t.$field['unique']\n\t\t\t.$field['default'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'ENUM':\n\t\t\tcase 'SET':\n\t\t\t\t$attributes['TYPE'] = 'TEXT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['type'] = 'INTEGER PRIMARY KEY';\n\t\t\t$field['default'] = '';\n\t\t\t$field['null'] = '';\n\t\t\t$field['unique'] = '';\n\t\t\t$field['auto_increment'] = ' AUTOINCREMENT';\n\n\t\t\t$this->primary_keys = array();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite/sqlite_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite_result extends CI_DB_result {\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\treturn is_int($this->num_rows)\n\t\t\t? $this->num_rows\n\t\t\t: $this->num_rows = @sqlite_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn @sqlite_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$field_names[$i] = sqlite_field_name($this->result_id, $i);\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= sqlite_field_name($this->result_id, $i);\n\t\t\t$retval[$i]->type\t\t= NULL;\n\t\t\t$retval[$i]->max_length\t\t= NULL;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\n\t * @return\tbool\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\treturn sqlite_seek($this->result_id, $n);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn sqlite_fetch_array($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn sqlite_fetch_object($this->result_id, $class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite/sqlite_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite Utility Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite_utility extends CI_DB_utility {\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/sqlite3/sqlite3_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite3 Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite3_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'sqlite3';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('RANDOM()', 'RANDOM()');\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Non-persistent database connection\n\t *\n\t * @param\tbool\t$persistent\n\t * @return\tSQLite3\n\t */\n\tpublic function db_connect($persistent = FALSE)\n\t{\n\t\tif ($persistent)\n\t\t{\n\t\t\tlog_message('debug', 'SQLite3 doesn\\'t support persistent connections');\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\treturn ( ! $this->password)\n\t\t\t\t? new SQLite3($this->database)\n\t\t\t\t: new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password);\n\t\t}\n\t\tcatch (Exception $e)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\t$version = SQLite3::version();\n\t\treturn $this->data_cache['version'] = $version['versionString'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @todo\tImplement use of SQLite3::querySingle(), if needed\n\t * @param\tstring\t$sql\n\t * @return\tmixed\tSQLite3Result object or bool\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn $this->is_write_type($sql)\n\t\t\t? $this->conn_id->exec($sql)\n\t\t\t: $this->conn_id->query($sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn $this->conn_id->exec('BEGIN TRANSACTION');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\treturn $this->conn_id->exec('END TRANSACTION');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\treturn $this->conn_id->exec('ROLLBACK');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Platform-dependent string escape\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _escape_str($str)\n\t{\n\t\treturn $this->conn_id->escapeString($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn $this->conn_id->changes();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * @return\tint\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn $this->conn_id->lastInsertRowID();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\t$prefix_limit\n\t * @return\tstring\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\treturn 'SELECT \"NAME\" FROM \"SQLITE_MASTER\" WHERE \"TYPE\" = \\'table\\''\n\t\t\t.(($prefix_limit !== FALSE && $this->dbprefix != '')\n\t\t\t\t? ' AND \"NAME\" LIKE \\''.$this->escape_like_str($this->dbprefix).'%\\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr)\n\t\t\t\t: '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @return\tarray\n\t */\n\tpublic function list_fields($table)\n\t{\n\t\tif (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$fields = array();\n\t\tforeach ($result->result_array() as $row)\n\t\t{\n\t\t\t$fields[] = $row['name'];\n\t\t}\n\n\t\treturn $fields;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\tif (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$query = $query->result_array();\n\t\tif (empty($query))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]['name'];\n\t\t\t$retval[$i]->type\t\t= $query[$i]['type'];\n\t\t\t$retval[$i]->max_length\t\t= NULL;\n\t\t\t$retval[$i]->default\t\t= $query[$i]['dflt_value'];\n\t\t\t$retval[$i]->primary_key\t= isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\treturn array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg());\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Replace statement\n\t *\n\t * Generates a platform-specific replace string from the supplied data\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring\n\t */\n\tprotected function _replace($table, $keys, $values)\n\t{\n\t\treturn 'INSERT OR '.parent::_replace($table, $keys, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'DELETE FROM '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\t$this->conn_id->close();\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite3/sqlite3_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite3 Forge Class\n *\n * @category\tDatabase\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite3_forge extends CI_DB_forge {\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tbool|array\n\t */\n\tprotected $_unsigned\t\t= FALSE;\n\n\t/**\n\t * NULL value representation in CREATE/ALTER TABLE statements\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_null\t\t= 'NULL';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tobject\t&$db\tDatabase object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$db)\n\t{\n\t\tparent::__construct($db);\n\n\t\tif (version_compare($this->db->version(), '3.3', '<'))\n\t\t{\n\t\t\t$this->_create_table_if = FALSE;\n\t\t\t$this->_drop_table_if   = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create database\n\t *\n\t * @param\tstring\t$db_name\n\t * @return\tbool\n\t */\n\tpublic function create_database($db_name)\n\t{\n\t\t// In SQLite, a database is created when you connect to the database.\n\t\t// We'll return TRUE so that an error isn't generated\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Drop database\n\t *\n\t * @param\tstring\t$db_name\t(ignored)\n\t * @return\tbool\n\t */\n\tpublic function drop_database($db_name)\n\t{\n\t\t// In SQLite, a database is dropped when we delete a file\n\t\tif (file_exists($this->db->database))\n\t\t{\n\t\t\t// We need to close the pseudo-connection first\n\t\t\t$this->db->close();\n\t\t\tif ( ! @unlink($this->db->database))\n\t\t\t{\n\t\t\t\treturn $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t\t\t}\n\t\t\telseif ( ! empty($this->db->data_cache['db_names']))\n\t\t\t{\n\t\t\t\t$key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE);\n\t\t\t\tif ($key !== FALSE)\n\t\t\t\t{\n\t\t\t\t\tunset($this->db->data_cache['db_names'][$key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @todo\timplement drop_column(), modify_column()\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif ($alter_type === 'DROP' OR $alter_type === 'CHANGE')\n\t\t{\n\t\t\t// drop_column():\n\t\t\t//\tBEGIN TRANSACTION;\n\t\t\t//\tCREATE TEMPORARY TABLE t1_backup(a,b);\n\t\t\t//\tINSERT INTO t1_backup SELECT a,b FROM t1;\n\t\t\t//\tDROP TABLE t1;\n\t\t\t//\tCREATE TABLE t1(a,b);\n\t\t\t//\tINSERT INTO t1 SELECT a,b FROM t1_backup;\n\t\t\t//\tDROP TABLE t1_backup;\n\t\t\t//\tCOMMIT;\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process column\n\t *\n\t * @param\tarray\t$field\n\t * @return\tstring\n\t */\n\tprotected function _process_column($field)\n\t{\n\t\treturn $this->db->escape_identifiers($field['name'])\n\t\t\t.' '.$field['type']\n\t\t\t.$field['auto_increment']\n\t\t\t.$field['null']\n\t\t\t.$field['unique']\n\t\t\t.$field['default'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'ENUM':\n\t\t\tcase 'SET':\n\t\t\t\t$attributes['TYPE'] = 'TEXT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['type'] = 'INTEGER PRIMARY KEY';\n\t\t\t$field['default'] = '';\n\t\t\t$field['null'] = '';\n\t\t\t$field['unique'] = '';\n\t\t\t$field['auto_increment'] = ' AUTOINCREMENT';\n\n\t\t\t$this->primary_keys = array();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite3/sqlite3_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite3 Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite3_result extends CI_DB_result {\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn $this->result_id->numColumns();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$field_names[] = $this->result_id->columnName($i);\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\tstatic $data_types = array(\n\t\t\tSQLITE3_INTEGER\t=> 'integer',\n\t\t\tSQLITE3_FLOAT\t=> 'float',\n\t\t\tSQLITE3_TEXT\t=> 'text',\n\t\t\tSQLITE3_BLOB\t=> 'blob',\n\t\t\tSQLITE3_NULL\t=> 'null'\n\t\t);\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = $this->num_fields(); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $this->result_id->columnName($i);\n\n\t\t\t$type = $this->result_id->columnType($i);\n\t\t\t$retval[$i]->type\t\t= isset($data_types[$type]) ? $data_types[$type] : $type;\n\n\t\t\t$retval[$i]->max_length\t\t= NULL;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_object($this->result_id))\n\t\t{\n\t\t\t$this->result_id->finalize();\n\t\t\t$this->result_id = NULL;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn $this->result_id->fetchArray(SQLITE3_ASSOC);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\t// No native support for fetching rows as objects\n\t\tif (($row = $this->result_id->fetchArray(SQLITE3_ASSOC)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ($class_name === 'stdClass')\n\t\t{\n\t\t\treturn (object) $row;\n\t\t}\n\n\t\t$class_name = new $class_name();\n\t\tforeach (array_keys($row) as $key)\n\t\t{\n\t\t\t$class_name->$key = $row[$key];\n\t\t}\n\n\t\treturn $class_name;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Data Seek\n\t *\n\t * Moves the internal pointer to the desired offset. We call\n\t * this internally before fetching results to make sure the\n\t * result set starts at zero.\n\t *\n\t * @param\tint\t$n\t(ignored)\n\t * @return\tarray\n\t */\n\tpublic function data_seek($n = 0)\n\t{\n\t\t// Only resetting to the start of the result set is supported\n\t\treturn ($n > 0) ? FALSE : $this->result_id->reset();\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlite3/sqlite3_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLite3 Utility Class\n *\n * @category\tDatabase\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlite3_utility extends CI_DB_utility {\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tmixed\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Not supported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlsrv/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/database/drivers/sqlsrv/sqlsrv_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.3\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLSRV Database Adapter Class\n *\n * Note: _DB is an extender class that the app controller\n * creates dynamically based on whether the query builder\n * class is being used or not.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tDrivers\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlsrv_driver extends CI_DB {\n\n\t/**\n\t * Database driver\n\t *\n\t * @var\tstring\n\t */\n\tpublic $dbdriver = 'sqlsrv';\n\n\t/**\n\t * Scrollable flag\n\t *\n\t * Determines what cursor type to use when executing queries.\n\t *\n\t * FALSE or SQLSRV_CURSOR_FORWARD would increase performance,\n\t * but would disable num_rows() (and possibly insert_id())\n\t *\n\t * @var\tmixed\n\t */\n\tpublic $scrollable;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ORDER BY random keyword\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_random_keyword = array('NEWID()', 'RAND(%d)');\n\n\t/**\n\t * Quoted identifier flag\n\t *\n\t * Whether to use SQL-92 standard quoted identifier\n\t * (double quotes) or brackets for identifier escaping.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_quoted_identifier = TRUE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\tparent::__construct($params);\n\n\t\t// This is only supported as of SQLSRV 3.0\n\t\tif ($this->scrollable === NULL)\n\t\t{\n\t\t\t$this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED')\n\t\t\t\t? SQLSRV_CURSOR_CLIENT_BUFFERED\n\t\t\t\t: FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database connection\n\t *\n\t * @param\tbool\t$pooling\n\t * @return\tresource\n\t */\n\tpublic function db_connect($pooling = FALSE)\n\t{\n\t\t$charset = in_array(strtolower($this->char_set), array('utf-8', 'utf8'), TRUE)\n\t\t\t? 'UTF-8' : SQLSRV_ENC_CHAR;\n\n\t\t$connection = array(\n\t\t\t'UID'\t\t\t=> empty($this->username) ? '' : $this->username,\n\t\t\t'PWD'\t\t\t=> empty($this->password) ? '' : $this->password,\n\t\t\t'Database'\t\t=> $this->database,\n\t\t\t'ConnectionPooling'\t=> ($pooling === TRUE) ? 1 : 0,\n\t\t\t'CharacterSet'\t\t=> $charset,\n\t\t\t'Encrypt'\t\t=> ($this->encrypt === TRUE) ? 1 : 0,\n\t\t\t'ReturnDatesAsStrings'\t=> 1\n\t\t);\n\n\t\t// If the username and password are both empty, assume this is a\n\t\t// 'Windows Authentication Mode' connection.\n\t\tif (empty($connection['UID']) && empty($connection['PWD']))\n\t\t{\n\t\t\tunset($connection['UID'], $connection['PWD']);\n\t\t}\n\n\t\tif (FALSE !== ($this->conn_id = sqlsrv_connect($this->hostname, $connection)))\n\t\t{\n\t\t\t// Determine how identifiers are escaped\n\t\t\t$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi');\n\t\t\t$query = $query->row_array();\n\t\t\t$this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi'];\n\t\t\t$this->_escape_char = ($this->_quoted_identifier) ? '\"' : array('[', ']');\n\t\t}\n\n\t\treturn $this->conn_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Select the database\n\t *\n\t * @param\tstring\t$database\n\t * @return\tbool\n\t */\n\tpublic function db_select($database = '')\n\t{\n\t\tif ($database === '')\n\t\t{\n\t\t\t$database = $this->database;\n\t\t}\n\n\t\tif ($this->_execute('USE '.$this->escape_identifiers($database)))\n\t\t{\n\t\t\t$this->database = $database;\n\t\t\t$this->data_cache = array();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Execute the query\n\t *\n\t * @param\tstring\t$sql\tan SQL query\n\t * @return\tresource\n\t */\n\tprotected function _execute($sql)\n\t{\n\t\treturn ($this->scrollable === FALSE OR $this->is_write_type($sql))\n\t\t\t? sqlsrv_query($this->conn_id, $sql)\n\t\t\t: sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Begin Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_begin()\n\t{\n\t\treturn sqlsrv_begin_transaction($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Commit Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_commit()\n\t{\n\t\treturn sqlsrv_commit($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rollback Transaction\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _trans_rollback()\n\t{\n\t\treturn sqlsrv_rollback($this->conn_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Affected Rows\n\t *\n\t * @return\tint\n\t */\n\tpublic function affected_rows()\n\t{\n\t\treturn sqlsrv_rows_affected($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert ID\n\t *\n\t * Returns the last id created in the Identity column.\n\t *\n\t * @return\tstring\n\t */\n\tpublic function insert_id()\n\t{\n\t\treturn $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Database version number\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\tif (isset($this->data_cache['version']))\n\t\t{\n\t\t\treturn $this->data_cache['version'];\n\t\t}\n\n\t\tif ( ! $this->conn_id OR ($info = sqlsrv_server_info($this->conn_id)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $this->data_cache['version'] = $info['SQLServerVersion'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List table query\n\t *\n\t * Generates a platform-specific query string so that the table names can be fetched\n\t *\n\t * @param\tbool\n\t * @return\tstring\t$prefix_limit\n\t */\n\tprotected function _list_tables($prefix_limit = FALSE)\n\t{\n\t\t$sql = 'SELECT '.$this->escape_identifiers('name')\n\t\t\t.' FROM '.$this->escape_identifiers('sysobjects')\n\t\t\t.' WHERE '.$this->escape_identifiers('type').\" = 'U'\";\n\n\t\tif ($prefix_limit === TRUE && $this->dbprefix !== '')\n\t\t{\n\t\t\t$sql .= ' AND '.$this->escape_identifiers('name').\" LIKE '\".$this->escape_like_str($this->dbprefix).\"%' \"\n\t\t\t\t.sprintf($this->_escape_like_str, $this->_escape_like_chr);\n\t\t}\n\n\t\treturn $sql.' ORDER BY '.$this->escape_identifiers('name');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * List column query\n\t *\n\t * Generates a platform-specific query string so that the column names can be fetched\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _list_columns($table = '')\n\t{\n\t\treturn 'SELECT COLUMN_NAME\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns an object with field data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tarray\n\t */\n\tpublic function field_data($table)\n\t{\n\t\t$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT\n\t\t\tFROM INFORMATION_SCHEMA.Columns\n\t\t\tWHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));\n\n\t\tif (($query = $this->query($sql)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t$query = $query->result_object();\n\n\t\t$retval = array();\n\t\tfor ($i = 0, $c = count($query); $i < $c; $i++)\n\t\t{\n\t\t\t$retval[$i]\t\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t\t= $query[$i]->COLUMN_NAME;\n\t\t\t$retval[$i]->type\t\t= $query[$i]->DATA_TYPE;\n\t\t\t$retval[$i]->max_length\t\t= ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION;\n\t\t\t$retval[$i]->default\t\t= $query[$i]->COLUMN_DEFAULT;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Returns an array containing code and message of the last\n\t * database error that has occurred.\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error()\n\t{\n\t\t$error = array('code' => '00000', 'message' => '');\n\t\t$sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS);\n\n\t\tif ( ! is_array($sqlsrv_errors))\n\t\t{\n\t\t\treturn $error;\n\t\t}\n\n\t\t$sqlsrv_error = array_shift($sqlsrv_errors);\n\t\tif (isset($sqlsrv_error['SQLSTATE']))\n\t\t{\n\t\t\t$error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE'];\n\t\t}\n\t\telseif (isset($sqlsrv_error['code']))\n\t\t{\n\t\t\t$error['code'] = $sqlsrv_error['code'];\n\t\t}\n\n\t\tif (isset($sqlsrv_error['message']))\n\t\t{\n\t\t\t$error['message'] = $sqlsrv_error['message'];\n\t\t}\n\n\t\treturn $error;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update statement\n\t *\n\t * Generates a platform-specific update string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @param\tarray\t$values\n\t * @return\tstring\n\t */\n\tprotected function _update($table, $values)\n\t{\n\t\t$this->qb_limit = FALSE;\n\t\t$this->qb_orderby = array();\n\t\treturn parent::_update($table, $values);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Truncate statement\n\t *\n\t * Generates a platform-specific truncate string from the supplied data\n\t *\n\t * If the database does not support the TRUNCATE statement,\n\t * then this method maps to 'DELETE FROM table'\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _truncate($table)\n\t{\n\t\treturn 'TRUNCATE TABLE '.$table;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete statement\n\t *\n\t * Generates a platform-specific delete string from the supplied data\n\t *\n\t * @param\tstring\t$table\n\t * @return\tstring\n\t */\n\tprotected function _delete($table)\n\t{\n\t\tif ($this->qb_limit)\n\t\t{\n\t\t\treturn 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete';\n\t\t}\n\n\t\treturn parent::_delete($table);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * LIMIT\n\t *\n\t * Generates a platform-specific LIMIT clause\n\t *\n\t * @param\tstring\t$sql\tSQL Query\n\t * @return\tstring\n\t */\n\tprotected function _limit($sql)\n\t{\n\t\t// As of SQL Server 2012 (11.0.*) OFFSET is supported\n\t\tif (version_compare($this->version(), '11', '>='))\n\t\t{\n\t\t\t// SQL Server OFFSET-FETCH can be used only with the ORDER BY clause\n\t\t\tempty($this->qb_orderby) && $sql .= ' ORDER BY 1';\n\n\t\t\treturn $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY';\n\t\t}\n\n\t\t$limit = $this->qb_offset + $this->qb_limit;\n\n\t\t// An ORDER BY clause is required for ROW_NUMBER() to work\n\t\tif ($this->qb_offset && ! empty($this->qb_orderby))\n\t\t{\n\t\t\t$orderby = $this->_compile_order_by();\n\n\t\t\t// We have to strip the ORDER BY clause\n\t\t\t$sql = trim(substr($sql, 0, strrpos($sql, $orderby)));\n\n\t\t\t// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results\n\t\t\tif (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE)\n\t\t\t{\n\t\t\t\t$select = '*'; // Inevitable\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Use only field names and their aliases, everything else is out of our scope.\n\t\t\t\t$select = array();\n\t\t\t\t$field_regexp = ($this->_quoted_identifier)\n\t\t\t\t\t? '(\"[^\\\"]+\")' : '(\\[[^\\]]+\\])';\n\t\t\t\tfor ($i = 0, $c = count($this->qb_select); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$select[] = preg_match('/(?:\\s|\\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m)\n\t\t\t\t\t\t? $m[1] : $this->qb_select[$i];\n\t\t\t\t}\n\t\t\t\t$select = implode(', ', $select);\n\t\t\t}\n\n\t\t\treturn 'SELECT '.$select.\" FROM (\\n\\n\"\n\t\t\t\t.preg_replace('/^(SELECT( DISTINCT)?)/i', '\\\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql)\n\t\t\t\t.\"\\n\\n) \".$this->escape_identifiers('CI_subquery')\n\t\t\t\t.\"\\nWHERE \".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit;\n\t\t}\n\n\t\treturn preg_replace('/(^\\SELECT (DISTINCT)?)/i','\\\\1 TOP '.$limit.' ', $sql);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert batch statement\n\t *\n\t * Generates a platform-specific insert string from the supplied data.\n\t *\n\t * @param\tstring\t$table\tTable name\n\t * @param\tarray\t$keys\tINSERT keys\n\t * @param\tarray\t$values\tINSERT values\n\t * @return\tstring|bool\n\t */\n\tprotected function _insert_batch($table, $keys, $values)\n\t{\n\t\t// Multiple-value inserts are only supported as of SQL Server 2008\n\t\tif (version_compare($this->version(), '10', '>='))\n\t\t{\n\t\t\treturn parent::_insert_batch($table, $keys, $values);\n\t\t}\n\n\t\treturn ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close DB Connection\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _close()\n\t{\n\t\tsqlsrv_close($this->conn_id);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlsrv/sqlsrv_forge.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.3\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLSRV Forge Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlsrv_forge extends CI_DB_forge {\n\n\t/**\n\t * CREATE TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_create_table_if\t= \"IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nCREATE TABLE\";\n\n\t/**\n\t * DROP TABLE IF statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_drop_table_if\t= \"IF EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'%s') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\\nDROP TABLE\";\n\n\t/**\n\t * UNSIGNED support\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_unsigned\t\t= array(\n\t\t'TINYINT'\t=> 'SMALLINT',\n\t\t'SMALLINT'\t=> 'INT',\n\t\t'INT'\t\t=> 'BIGINT',\n\t\t'REAL'\t\t=> 'FLOAT'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ALTER TABLE\n\t *\n\t * @param\tstring\t$alter_type\tALTER type\n\t * @param\tstring\t$table\t\tTable name\n\t * @param\tmixed\t$field\t\tColumn definition\n\t * @return\tstring|string[]\n\t */\n\tprotected function _alter_table($alter_type, $table, $field)\n\t{\n\t\tif (in_array($alter_type, array('ADD', 'DROP'), TRUE))\n\t\t{\n\t\t\treturn parent::_alter_table($alter_type, $table, $field);\n\t\t}\n\n\t\t$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN ';\n\t\t$sqls = array();\n\t\tfor ($i = 0, $c = count($field); $i < $c; $i++)\n\t\t{\n\t\t\t$sqls[] = $sql.$this->_process_column($field[$i]);\n\t\t}\n\n\t\treturn $sqls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute TYPE\n\t *\n\t * Performs a data type mapping between different databases.\n\t *\n\t * @param\tarray\t&$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _attr_type(&$attributes)\n\t{\n\t\tif (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)\n\t\t{\n\t\t\tunset($attributes['CONSTRAINT']);\n\t\t}\n\n\t\tswitch (strtoupper($attributes['TYPE']))\n\t\t{\n\t\t\tcase 'MEDIUMINT':\n\t\t\t\t$attributes['TYPE'] = 'INTEGER';\n\t\t\t\t$attributes['UNSIGNED'] = FALSE;\n\t\t\t\treturn;\n\t\t\tcase 'INTEGER':\n\t\t\t\t$attributes['TYPE'] = 'INT';\n\t\t\t\treturn;\n\t\t\tdefault: return;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field attribute AUTO_INCREMENT\n\t *\n\t * @param\tarray\t&$attributes\n\t * @param\tarray\t&$field\n\t * @return\tvoid\n\t */\n\tprotected function _attr_auto_increment(&$attributes, &$field)\n\t{\n\t\tif ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE)\n\t\t{\n\t\t\t$field['auto_increment'] = ' IDENTITY(1,1)';\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlsrv/sqlsrv_result.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.3\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLSRV Result Class\n *\n * This class extends the parent result class: CI_DB_result\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlsrv_result extends CI_DB_result {\n\n\t/**\n\t * Scrollable flag\n\t *\n\t * @var\tmixed\n\t */\n\tpublic $scrollable;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tobject\t$driver_object\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$driver_object)\n\t{\n\t\tparent::__construct($driver_object);\n\n\t\t$this->scrollable = $driver_object->scrollable;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of rows in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_rows()\n\t{\n\t\t// sqlsrv_num_rows() doesn't work with the FORWARD and DYNAMIC cursors (FALSE is the same as FORWARD)\n\t\tif ( ! in_array($this->scrollable, array(FALSE, SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_DYNAMIC), TRUE))\n\t\t{\n\t\t\treturn parent::num_rows();\n\t\t}\n\n\t\treturn is_int($this->num_rows)\n\t\t\t? $this->num_rows\n\t\t\t: $this->num_rows = sqlsrv_num_rows($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Number of fields in the result set\n\t *\n\t * @return\tint\n\t */\n\tpublic function num_fields()\n\t{\n\t\treturn @sqlsrv_num_fields($this->result_id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch Field Names\n\t *\n\t * Generates an array of column names\n\t *\n\t * @return\tarray\n\t */\n\tpublic function list_fields()\n\t{\n\t\t$field_names = array();\n\t\tforeach (sqlsrv_field_metadata($this->result_id) as $offset => $field)\n\t\t{\n\t\t\t$field_names[] = $field['Name'];\n\t\t}\n\n\t\treturn $field_names;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Field data\n\t *\n\t * Generates an array of objects containing field meta-data\n\t *\n\t * @return\tarray\n\t */\n\tpublic function field_data()\n\t{\n\t\t$retval = array();\n\t\tforeach (sqlsrv_field_metadata($this->result_id) as $i => $field)\n\t\t{\n\t\t\t$retval[$i]\t\t= new stdClass();\n\t\t\t$retval[$i]->name\t= $field['Name'];\n\t\t\t$retval[$i]->type\t= $field['Type'];\n\t\t\t$retval[$i]->max_length\t= $field['Size'];\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Free the result\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function free_result()\n\t{\n\t\tif (is_resource($this->result_id))\n\t\t{\n\t\t\tsqlsrv_free_stmt($this->result_id);\n\t\t\t$this->result_id = FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - associative array\n\t *\n\t * Returns the result set as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _fetch_assoc()\n\t{\n\t\treturn sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result - object\n\t *\n\t * Returns the result set as an object\n\t *\n\t * @param\tstring\t$class_name\n\t * @return\tobject\n\t */\n\tprotected function _fetch_object($class_name = 'stdClass')\n\t{\n\t\treturn sqlsrv_fetch_object($this->result_id, $class_name);\n\t}\n\n}\n"
  },
  {
    "path": "system/database/drivers/sqlsrv/sqlsrv_utility.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.3\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SQLSRV Utility Class\n *\n * @category\tDatabase\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/database/\n */\nclass CI_DB_sqlsrv_utility extends CI_DB_utility {\n\n\t/**\n\t * List databases statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_list_databases\t= 'EXEC sp_helpdb'; // Can also be: EXEC sp_databases\n\n\t/**\n\t * OPTIMIZE TABLE statement\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_optimize_table\t= 'ALTER INDEX all ON %s REORGANIZE';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Export\n\t *\n\t * @param\tarray\t$params\tPreferences\n\t * @return\tbool\n\t */\n\tprotected function _backup($params = array())\n\t{\n\t\t// Currently unsupported\n\t\treturn $this->db->display_error('db_unsupported_feature');\n\t}\n\n}\n"
  },
  {
    "path": "system/database/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/fonts/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/helpers/array_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Array Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/array_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('element'))\n{\n\t/**\n\t * Element\n\t *\n\t * Lets you determine whether an array index is set and whether it has a value.\n\t * If the element is empty it returns NULL (or whatever you specify as the default value.)\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @param\tmixed\n\t * @return\tmixed\tdepends on what the array contains\n\t */\n\tfunction element($item, array $array, $default = NULL)\n\t{\n\t\treturn array_key_exists($item, $array) ? $array[$item] : $default;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('random_element'))\n{\n\t/**\n\t * Random Element - Takes an array as input and returns a random element\n\t *\n\t * @param\tarray\n\t * @return\tmixed\tdepends on what the array contains\n\t */\n\tfunction random_element($array)\n\t{\n\t\treturn is_array($array) ? $array[array_rand($array)] : $array;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('elements'))\n{\n\t/**\n\t * Elements\n\t *\n\t * Returns only the array items specified. Will return a default value if\n\t * it is not set.\n\t *\n\t * @param\tarray\n\t * @param\tarray\n\t * @param\tmixed\n\t * @return\tmixed\tdepends on what the array contains\n\t */\n\tfunction elements($items, array $array, $default = NULL)\n\t{\n\t\t$return = array();\n\n\t\tis_array($items) OR $items = array($items);\n\n\t\tforeach ($items as $item)\n\t\t{\n\t\t\t$return[$item] = array_key_exists($item, $array) ? $array[$item] : $default;\n\t\t}\n\n\t\treturn $return;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/captcha_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter CAPTCHA Helper\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/captcha_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('create_captcha'))\n{\n\t/**\n\t * Create CAPTCHA\n\t *\n\t * @param\tarray\t$data\t\tData for the CAPTCHA\n\t * @param\tstring\t$img_path\tPath to create the image in (deprecated)\n\t * @param\tstring\t$img_url\tURL to the CAPTCHA image folder (deprecated)\n\t * @param\tstring\t$font_path\tServer path to font (deprecated)\n\t * @return\tstring\n\t */\n\tfunction create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')\n\t{\n\t\t$defaults = array(\n\t\t\t'word'\t\t=> '',\n\t\t\t'img_path'\t=> '',\n\t\t\t'img_url'\t=> '',\n\t\t\t'img_width'\t=> '150',\n\t\t\t'img_height'\t=> '30',\n\t\t\t'font_path'\t=> '',\n\t\t\t'expiration'\t=> 7200,\n\t\t\t'word_length'\t=> 8,\n\t\t\t'font_size'\t=> 16,\n\t\t\t'img_id'\t=> '',\n\t\t\t'pool'\t\t=> '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t\t'colors'\t=> array(\n\t\t\t\t'background'\t=> array(255,255,255),\n\t\t\t\t'border'\t=> array(153,102,102),\n\t\t\t\t'text'\t\t=> array(204,153,153),\n\t\t\t\t'grid'\t\t=> array(255,182,182)\n\t\t\t)\n\t\t);\n\n\t\tforeach ($defaults as $key => $val)\n\t\t{\n\t\t\tif ( ! is_array($data) && empty($$key))\n\t\t\t{\n\t\t\t\t$$key = $val;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$$key = isset($data[$key]) ? $data[$key] : $val;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! extension_loaded('gd'))\n\t\t{\n\t\t\tlog_message('error', 'create_captcha(): GD extension is not loaded.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($img_path === '' OR $img_url === '')\n\t\t{\n\t\t\tlog_message('error', 'create_captcha(): $img_path and $img_url are required.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! is_dir($img_path) OR ! is_really_writable($img_path))\n\t\t{\n\t\t\tlog_message('error', \"create_captcha(): '{$img_path}' is not a dir, nor is it writable.\");\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// -----------------------------------\n\t\t// Remove old images\n\t\t// -----------------------------------\n\n\t\t$now = microtime(TRUE);\n\n\t\t$current_dir = @opendir($img_path);\n\t\twhile ($filename = @readdir($current_dir))\n\t\t{\n\t\t\tif (in_array(substr($filename, -4), array('.jpg', '.png'))\n\t\t\t\t&& (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now)\n\t\t\t{\n\t\t\t\t@unlink($img_path.$filename);\n\t\t\t}\n\t\t}\n\n\t\t@closedir($current_dir);\n\n\t\t// -----------------------------------\n\t\t// Do we have a \"word\" yet?\n\t\t// -----------------------------------\n\n\t\tif (empty($word))\n\t\t{\n\t\t\t$word = '';\n\t\t\t$pool_length = strlen($pool);\n\t\t\t$rand_max = $pool_length - 1;\n\n\t\t\t// PHP7 or a suitable polyfill\n\t\t\tif (function_exists('random_int'))\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tfor ($i = 0; $i < $word_length; $i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$word .= $pool[random_int(0, $rand_max)];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (Exception $e)\n\t\t\t\t{\n\t\t\t\t\t// This means fallback to the next possible\n\t\t\t\t\t// alternative to random_int()\n\t\t\t\t\t$word = '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (empty($word))\n\t\t{\n\t\t\t// Nobody will have a larger character pool than\n\t\t\t// 256 characters, but let's handle it just in case ...\n\t\t\t//\n\t\t\t// No, I do not care that the fallback to mt_rand() can\n\t\t\t// handle it; if you trigger this, you're very obviously\n\t\t\t// trying to break it. -- Narf\n\t\t\tif ($pool_length > 256)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t// We'll try using the operating system's PRNG first,\n\t\t\t// which we can access through CI_Security::get_random_bytes()\n\t\t\t$security = get_instance()->security;\n\n\t\t\t// To avoid numerous get_random_bytes() calls, we'll\n\t\t\t// just try fetching as much bytes as we need at once.\n\t\t\tif (($bytes = $security->get_random_bytes($pool_length)) !== FALSE)\n\t\t\t{\n\t\t\t\t$byte_index = $word_index = 0;\n\t\t\t\twhile ($word_index < $word_length)\n\t\t\t\t{\n\t\t\t\t\t// Do we have more random data to use?\n\t\t\t\t\t// It could be exhausted by previous iterations\n\t\t\t\t\t// ignoring bytes higher than $rand_max.\n\t\t\t\t\tif ($byte_index === $pool_length)\n\t\t\t\t\t{\n\t\t\t\t\t\t// No failures should be possible if the\n\t\t\t\t\t\t// first get_random_bytes() call didn't\n\t\t\t\t\t\t// return FALSE, but still ...\n\t\t\t\t\t\tfor ($i = 0; $i < 5; $i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (($bytes = $security->get_random_bytes($pool_length)) === FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$byte_index = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ($bytes === FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Sadly, this means fallback to mt_rand()\n\t\t\t\t\t\t\t$word = '';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlist(, $rand_index) = unpack('C', $bytes[$byte_index++]);\n\t\t\t\t\tif ($rand_index > $rand_max)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$word .= $pool[$rand_index];\n\t\t\t\t\t$word_index++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (empty($word))\n\t\t{\n\t\t\tfor ($i = 0; $i < $word_length; $i++)\n\t\t\t{\n\t\t\t\t$word .= $pool[mt_rand(0, $rand_max)];\n\t\t\t}\n\t\t}\n\t\telseif ( ! is_string($word))\n\t\t{\n\t\t\t$word = (string) $word;\n\t\t}\n\n\t\t// -----------------------------------\n\t\t// Determine angle and position\n\t\t// -----------------------------------\n\t\t$length\t= strlen($word);\n\t\t$angle\t= ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0;\n\t\t$x_axis\t= mt_rand(6, (360/$length)-16);\n\t\t$y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height);\n\n\t\t// Create image\n\t\t// PHP.net recommends imagecreatetruecolor(), but it isn't always available\n\t\t$im = function_exists('imagecreatetruecolor')\n\t\t\t? imagecreatetruecolor($img_width, $img_height)\n\t\t\t: imagecreate($img_width, $img_height);\n\n\t\t// -----------------------------------\n\t\t//  Assign colors\n\t\t// ----------------------------------\n\n\t\tis_array($colors) OR $colors = $defaults['colors'];\n\n\t\tforeach (array_keys($defaults['colors']) as $key)\n\t\t{\n\t\t\t// Check for a possible missing value\n\t\t\tis_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key];\n\t\t\t$colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]);\n\t\t}\n\n\t\t// Create the rectangle\n\t\tImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']);\n\n\t\t// -----------------------------------\n\t\t//  Create the spiral pattern\n\t\t// -----------------------------------\n\t\t$theta\t\t= 1;\n\t\t$thetac\t\t= 7;\n\t\t$radius\t\t= 16;\n\t\t$circles\t= 20;\n\t\t$points\t\t= 32;\n\n\t\tfor ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++)\n\t\t{\n\t\t\t$theta += $thetac;\n\t\t\t$rad = $radius * ($i / $points);\n\t\t\t$x = ($rad * cos($theta)) + $x_axis;\n\t\t\t$y = ($rad * sin($theta)) + $y_axis;\n\t\t\t$theta += $thetac;\n\t\t\t$rad1 = $radius * (($i + 1) / $points);\n\t\t\t$x1 = ($rad1 * cos($theta)) + $x_axis;\n\t\t\t$y1 = ($rad1 * sin($theta)) + $y_axis;\n\t\t\timageline($im, $x, $y, $x1, $y1, $colors['grid']);\n\t\t\t$theta -= $thetac;\n\t\t}\n\n\t\t// -----------------------------------\n\t\t//  Write the text\n\t\t// -----------------------------------\n\n\t\t$use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext'));\n\t\tif ($use_font === FALSE)\n\t\t{\n\t\t\t($font_size > 5) && $font_size = 5;\n\t\t\t$x = mt_rand(0, $img_width / ($length / 3));\n\t\t\t$y = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t($font_size > 30) && $font_size = 30;\n\t\t\t$x = mt_rand(0, $img_width / ($length / 1.5));\n\t\t\t$y = $font_size + 2;\n\t\t}\n\n\t\tfor ($i = 0; $i < $length; $i++)\n\t\t{\n\t\t\tif ($use_font === FALSE)\n\t\t\t{\n\t\t\t\t$y = mt_rand(0 , $img_height / 2);\n\t\t\t\timagestring($im, $font_size, $x, $y, $word[$i], $colors['text']);\n\t\t\t\t$x += ($font_size * 2);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$y = mt_rand($img_height / 2, $img_height - 3);\n\t\t\t\timagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]);\n\t\t\t\t$x += $font_size;\n\t\t\t}\n\t\t}\n\n\t\t// Create the border\n\t\timagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']);\n\n\t\t// -----------------------------------\n\t\t//  Generate the image\n\t\t// -----------------------------------\n\t\t$img_url = rtrim($img_url, '/').'/';\n\n\t\tif (function_exists('imagejpeg'))\n\t\t{\n\t\t\t$img_filename = $now.'.jpg';\n\t\t\timagejpeg($im, $img_path.$img_filename);\n\t\t}\n\t\telseif (function_exists('imagepng'))\n\t\t{\n\t\t\t$img_filename = $now.'.png';\n\t\t\timagepng($im, $img_path.$img_filename);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$img = '<img '.($img_id === '' ? '' : 'id=\"'.$img_id.'\"').' src=\"'.$img_url.$img_filename.'\" style=\"width: '.$img_width.'px; height: '.$img_height .'px; border: 0;\" alt=\" \" />';\n\t\tImageDestroy($im);\n\n\t\treturn array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/cookie_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Cookie Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/cookie_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_cookie'))\n{\n\t/**\n\t * Set cookie\n\t *\n\t * Accepts seven parameters, or you can submit an associative\n\t * array in the first parameter containing all the values.\n\t *\n\t * @param\tmixed\n\t * @param\tstring\tthe value of the cookie\n\t * @param\tstring\tthe number of seconds until expiration\n\t * @param\tstring\tthe cookie domain.  Usually:  .yourdomain.com\n\t * @param\tstring\tthe cookie path\n\t * @param\tstring\tthe cookie prefix\n\t * @param\tbool\ttrue makes the cookie secure\n\t * @param\tbool\ttrue makes the cookie accessible via http(s) only (no javascript)\n\t * @return\tvoid\n\t */\n\tfunction set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL)\n\t{\n\t\t// Set the config file options\n\t\tget_instance()->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('get_cookie'))\n{\n\t/**\n\t * Fetch an item from the COOKIE array\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tmixed\n\t */\n\tfunction get_cookie($index, $xss_clean = NULL)\n\t{\n\t\tis_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE);\n\t\t$prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix');\n\t\treturn get_instance()->input->cookie($prefix.$index, $xss_clean);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('delete_cookie'))\n{\n\t/**\n\t * Delete a COOKIE\n\t *\n\t * @param\tmixed\n\t * @param\tstring\tthe cookie domain. Usually: .yourdomain.com\n\t * @param\tstring\tthe cookie path\n\t * @param\tstring\tthe cookie prefix\n\t * @return\tvoid\n\t */\n\tfunction delete_cookie($name, $domain = '', $path = '/', $prefix = '')\n\t{\n\t\tset_cookie($name, '', '', $domain, $path, $prefix);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/date_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Date Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/date_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('now'))\n{\n\t/**\n\t * Get \"now\" time\n\t *\n\t * Returns time() based on the timezone parameter or on the\n\t * \"time_reference\" setting\n\t *\n\t * @param\tstring\n\t * @return\tint\n\t */\n\tfunction now($timezone = NULL)\n\t{\n\t\tif (empty($timezone))\n\t\t{\n\t\t\t$timezone = config_item('time_reference');\n\t\t}\n\n\t\tif ($timezone === 'local' OR $timezone === date_default_timezone_get())\n\t\t{\n\t\t\treturn time();\n\t\t}\n\n\t\t$datetime = new DateTime('now', new DateTimeZone($timezone));\n\t\tsscanf($datetime->format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second);\n\n\t\treturn mktime($hour, $minute, $second, $month, $day, $year);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('mdate'))\n{\n\t/**\n\t * Convert MySQL Style Datecodes\n\t *\n\t * This function is identical to PHPs date() function,\n\t * except that it allows date codes to be formatted using\n\t * the MySQL style, where each code letter is preceded\n\t * with a percent sign:  %Y %m %d etc...\n\t *\n\t * The benefit of doing dates this way is that you don't\n\t * have to worry about escaping your text letters that\n\t * match the date codes.\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @return\tint\n\t */\n\tfunction mdate($datestr = '', $time = '')\n\t{\n\t\tif ($datestr === '')\n\t\t{\n\t\t\treturn '';\n\t\t}\n\t\telseif (empty($time))\n\t\t{\n\t\t\t$time = now();\n\t\t}\n\n\t\t$datestr = str_replace(\n\t\t\t'%\\\\',\n\t\t\t'',\n\t\t\tpreg_replace('/([a-z]+?){1}/i', '\\\\\\\\\\\\1', $datestr)\n\t\t);\n\n\t\treturn date($datestr, $time);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('standard_date'))\n{\n\t/**\n\t * Standard Date\n\t *\n\t * Returns a date formatted according to the submitted standard.\n\t *\n\t * As of PHP 5.2, the DateTime extension provides constants that\n\t * serve for the exact same purpose and are used with date().\n\t *\n\t * @todo\tRemove in version 3.1+.\n\t * @deprecated\t3.0.0\tUse PHP's native date() instead.\n\t * @link\thttps://www.php.net/manual/en/class.datetime.php#datetime.constants.types\n\t *\n\t * @example\tdate(DATE_RFC822, now()); // default\n\t * @example\tdate(DATE_W3C, $time); // a different format and time\n\t *\n\t * @param\tstring\t$fmt = 'DATE_RFC822'\tthe chosen format\n\t * @param\tint\t$time = NULL\t\tUnix timestamp\n\t * @return\tstring\n\t */\n\tfunction standard_date($fmt = 'DATE_RFC822', $time = NULL)\n\t{\n\t\tif (empty($time))\n\t\t{\n\t\t\t$time = now();\n\t\t}\n\n\t\t// Procedural style pre-defined constants from the DateTime extension\n\t\tif (strpos($fmt, 'DATE_') !== 0 OR defined($fmt) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn date(constant($fmt), $time);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('timespan'))\n{\n\t/**\n\t * Timespan\n\t *\n\t * Returns a span of seconds in this format:\n\t *\t10 days 14 hours 36 minutes 47 seconds\n\t *\n\t * @param\tint\ta number of seconds\n\t * @param\tint\tUnix timestamp\n\t * @param\tint\ta number of display units\n\t * @return\tstring\n\t */\n\tfunction timespan($seconds = 1, $time = '', $units = 7)\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->lang->load('date');\n\n\t\tis_numeric($seconds) OR $seconds = 1;\n\t\tis_numeric($time) OR $time = time();\n\t\tis_numeric($units) OR $units = 7;\n\n\t\t$seconds = ($time <= $seconds) ? 1 : $time - $seconds;\n\n\t\t$str = array();\n\t\t$years = floor($seconds / 31557600);\n\n\t\tif ($years > 0)\n\t\t{\n\t\t\t$str[] = $years.' '.$CI->lang->line($years > 1 ? 'date_years' : 'date_year');\n\t\t}\n\n\t\t$seconds -= $years * 31557600;\n\t\t$months = floor($seconds / 2629743);\n\n\t\tif (count($str) < $units && ($years > 0 OR $months > 0))\n\t\t{\n\t\t\tif ($months > 0)\n\t\t\t{\n\t\t\t\t$str[] = $months.' '.$CI->lang->line($months > 1 ? 'date_months' : 'date_month');\n\t\t\t}\n\n\t\t\t$seconds -= $months * 2629743;\n\t\t}\n\n\t\t$weeks = floor($seconds / 604800);\n\n\t\tif (count($str) < $units && ($years > 0 OR $months > 0 OR $weeks > 0))\n\t\t{\n\t\t\tif ($weeks > 0)\n\t\t\t{\n\t\t\t\t$str[] = $weeks.' '.$CI->lang->line($weeks > 1 ? 'date_weeks' : 'date_week');\n\t\t\t}\n\n\t\t\t$seconds -= $weeks * 604800;\n\t\t}\n\n\t\t$days = floor($seconds / 86400);\n\n\t\tif (count($str) < $units && ($months > 0 OR $weeks > 0 OR $days > 0))\n\t\t{\n\t\t\tif ($days > 0)\n\t\t\t{\n\t\t\t\t$str[] = $days.' '.$CI->lang->line($days > 1 ? 'date_days' : 'date_day');\n\t\t\t}\n\n\t\t\t$seconds -= $days * 86400;\n\t\t}\n\n\t\t$hours = floor($seconds / 3600);\n\n\t\tif (count($str) < $units && ($days > 0 OR $hours > 0))\n\t\t{\n\t\t\tif ($hours > 0)\n\t\t\t{\n\t\t\t\t$str[] = $hours.' '.$CI->lang->line($hours > 1 ? 'date_hours' : 'date_hour');\n\t\t\t}\n\n\t\t\t$seconds -= $hours * 3600;\n\t\t}\n\n\t\t$minutes = floor($seconds / 60);\n\n\t\tif (count($str) < $units && ($days > 0 OR $hours > 0 OR $minutes > 0))\n\t\t{\n\t\t\tif ($minutes > 0)\n\t\t\t{\n\t\t\t\t$str[] = $minutes.' '.$CI->lang->line($minutes > 1 ? 'date_minutes' : 'date_minute');\n\t\t\t}\n\n\t\t\t$seconds -= $minutes * 60;\n\t\t}\n\n\t\tif (count($str) === 0)\n\t\t{\n\t\t\t$str[] = $seconds.' '.$CI->lang->line($seconds > 1 ? 'date_seconds' : 'date_second');\n\t\t}\n\n\t\treturn implode(', ', $str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('days_in_month'))\n{\n\t/**\n\t * Number of days in a month\n\t *\n\t * Takes a month/year as input and returns the number of days\n\t * for the given month/year. Takes leap years into consideration.\n\t *\n\t * @param\tint\ta numeric month\n\t * @param\tint\ta numeric year\n\t * @return\tint\n\t */\n\tfunction days_in_month($month = 0, $year = '')\n\t{\n\t\tif ($month < 1 OR $month > 12)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\telseif ( ! is_numeric($year) OR strlen($year) !== 4)\n\t\t{\n\t\t\t$year = date('Y');\n\t\t}\n\n\t\tif (defined('CAL_GREGORIAN'))\n\t\t{\n\t\t\treturn cal_days_in_month(CAL_GREGORIAN, $month, $year);\n\t\t}\n\n\t\tif ($year >= 1970)\n\t\t{\n\t\t\treturn (int) date('t', mktime(12, 0, 0, $month, 1, $year));\n\t\t}\n\n\t\tif ($month == 2)\n\t\t{\n\t\t\tif ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0))\n\t\t\t{\n\t\t\t\treturn 29;\n\t\t\t}\n\t\t}\n\n\t\t$days_in_month\t= array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);\n\t\treturn $days_in_month[$month - 1];\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('local_to_gmt'))\n{\n\t/**\n\t * Converts a local Unix timestamp to GMT\n\t *\n\t * @param\tint\tUnix timestamp\n\t * @return\tint\n\t */\n\tfunction local_to_gmt($time = '')\n\t{\n\t\tif ($time === '')\n\t\t{\n\t\t\t$time = time();\n\t\t}\n\n\t\treturn mktime(\n\t\t\tgmdate('G', $time),\n\t\t\tgmdate('i', $time),\n\t\t\tgmdate('s', $time),\n\t\t\tgmdate('n', $time),\n\t\t\tgmdate('j', $time),\n\t\t\tgmdate('Y', $time)\n\t\t);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('gmt_to_local'))\n{\n\t/**\n\t * Converts GMT time to a localized value\n\t *\n\t * Takes a Unix timestamp (in GMT) as input, and returns\n\t * at the local value based on the timezone and DST setting\n\t * submitted\n\t *\n\t * @param\tint\tUnix timestamp\n\t * @param\tstring\ttimezone\n\t * @param\tbool\twhether DST is active\n\t * @return\tint\n\t */\n\tfunction gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE)\n\t{\n\t\tif ($time === '')\n\t\t{\n\t\t\treturn now();\n\t\t}\n\n\t\t$time += timezones($timezone) * 3600;\n\n\t\treturn ($dst === TRUE) ? $time + 3600 : $time;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('mysql_to_unix'))\n{\n\t/**\n\t * Converts a MySQL Timestamp to Unix\n\t *\n\t * @param\tint\tMySQL timestamp YYYY-MM-DD HH:MM:SS\n\t * @return\tint\tUnix timstamp\n\t */\n\tfunction mysql_to_unix($time = '')\n\t{\n\t\t// We'll remove certain characters for backward compatibility\n\t\t// since the formatting changed with MySQL 4.1\n\t\t// YYYY-MM-DD HH:MM:SS\n\n\t\t$time = str_replace(array('-', ':', ' '), '', $time);\n\n\t\t// YYYYMMDDHHMMSS\n\t\treturn mktime(\n\t\t\tsubstr($time, 8, 2),\n\t\t\tsubstr($time, 10, 2),\n\t\t\tsubstr($time, 12, 2),\n\t\t\tsubstr($time, 4, 2),\n\t\t\tsubstr($time, 6, 2),\n\t\t\tsubstr($time, 0, 4)\n\t\t);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('unix_to_human'))\n{\n\t/**\n\t * Unix to \"Human\"\n\t *\n\t * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM\n\t *\n\t * @param\tint\tUnix timestamp\n\t * @param\tbool\twhether to show seconds\n\t * @param\tstring\tformat: us or euro\n\t * @return\tstring\n\t */\n\tfunction unix_to_human($time = '', $seconds = FALSE, $fmt = 'us')\n\t{\n\t\t$r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' ';\n\n\t\tif ($fmt === 'us')\n\t\t{\n\t\t\t$r .= date('h', $time).':'.date('i', $time);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$r .= date('H', $time).':'.date('i', $time);\n\t\t}\n\n\t\tif ($seconds)\n\t\t{\n\t\t\t$r .= ':'.date('s', $time);\n\t\t}\n\n\t\tif ($fmt === 'us')\n\t\t{\n\t\t\treturn $r.' '.date('A', $time);\n\t\t}\n\n\t\treturn $r;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('human_to_unix'))\n{\n\t/**\n\t * Convert \"human\" date to GMT\n\t *\n\t * Reverses the above process\n\t *\n\t * @param\tstring\tformat: us or euro\n\t * @return\tint\n\t */\n\tfunction human_to_unix($datestr = '')\n\t{\n\t\tif ($datestr === '')\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$datestr = preg_replace('/\\040+/', ' ', trim($datestr));\n\n\t\tif ( ! preg_match('/^(\\d{2}|\\d{4})\\-[0-9]{1,2}\\-[0-9]{1,2}\\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\\s[AP]M)?$/i', $datestr))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tsscanf($datestr, '%d-%d-%d %s %s', $year, $month, $day, $time, $ampm);\n\t\tsscanf($time, '%d:%d:%d', $hour, $min, $sec);\n\t\tisset($sec) OR $sec = 0;\n\n\t\tif (isset($ampm))\n\t\t{\n\t\t\t$ampm = strtolower($ampm);\n\n\t\t\tif ($ampm[0] === 'p' && $hour < 12)\n\t\t\t{\n\t\t\t\t$hour += 12;\n\t\t\t}\n\t\t\telseif ($ampm[0] === 'a' && $hour === 12)\n\t\t\t{\n\t\t\t\t$hour = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn mktime($hour, $min, $sec, $month, $day, $year);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('nice_date'))\n{\n\t/**\n\t * Turns many \"reasonably-date-like\" strings into something\n\t * that is actually useful. This only works for dates after unix epoch.\n\t *\n\t * @deprecated\t3.1.3\tUse DateTime::createFromFormat($input_format, $input)->format($output_format);\n\t * @param\tstring\tThe terribly formatted date-like string\n\t * @param\tstring\tDate format to return (same as php date function)\n\t * @return\tstring\n\t */\n\tfunction nice_date($bad_date = '', $format = FALSE)\n\t{\n\t\tif (empty($bad_date))\n\t\t{\n\t\t\treturn 'Unknown';\n\t\t}\n\t\telseif (empty($format))\n\t\t{\n\t\t\t$format = 'U';\n\t\t}\n\n\t\t// Date like: YYYYMM\n\t\tif (preg_match('/^\\d{6}$/i', $bad_date))\n\t\t{\n\t\t\tif (in_array(substr($bad_date, 0, 2), array('19', '20')))\n\t\t\t{\n\t\t\t\t$year  = substr($bad_date, 0, 4);\n\t\t\t\t$month = substr($bad_date, 4, 2);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$month  = substr($bad_date, 0, 2);\n\t\t\t\t$year   = substr($bad_date, 2, 4);\n\t\t\t}\n\n\t\t\treturn date($format, strtotime($year.'-'.$month.'-01'));\n\t\t}\n\n\t\t// Date Like: YYYYMMDD\n\t\tif (preg_match('/^\\d{8}$/i', $bad_date, $matches))\n\t\t{\n\t\t\treturn DateTime::createFromFormat('Ymd', $bad_date)->format($format);\n\t\t}\n\n\t\t// Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between)\n\t\tif (preg_match('/^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/i', $bad_date, $matches))\n\t\t{\n\t\t\treturn date($format, strtotime($matches[3].'-'.$matches[1].'-'.$matches[2]));\n\t\t}\n\n\t\t// Any other kind of string, when converted into UNIX time,\n\t\t// produces \"0 seconds after epoc...\" is probably bad...\n\t\t// return \"Invalid Date\".\n\t\tif (date('U', strtotime($bad_date)) === '0')\n\t\t{\n\t\t\treturn 'Invalid Date';\n\t\t}\n\n\t\t// It's probably a valid-ish date format already\n\t\treturn date($format, strtotime($bad_date));\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('timezone_menu'))\n{\n\t/**\n\t * Timezone Menu\n\t *\n\t * Generates a drop-down menu of timezones.\n\t *\n\t * @param\tstring\ttimezone\n\t * @param\tstring\tclassname\n\t * @param\tstring\tmenu name\n\t * @param\tmixed\tattributes\n\t * @return\tstring\n\t */\n\tfunction timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '')\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->lang->load('date');\n\n\t\t$default = ($default === 'GMT') ? 'UTC' : $default;\n\n\t\t$menu = '<select name=\"'.$name.'\"';\n\n\t\tif ($class !== '')\n\t\t{\n\t\t\t$menu .= ' class=\"'.$class.'\"';\n\t\t}\n\n\t\t$menu .= _stringify_attributes($attributes).\">\\n\";\n\n\t\tforeach (timezones() as $key => $val)\n\t\t{\n\t\t\t$selected = ($default === $key) ? ' selected=\"selected\"' : '';\n\t\t\t$menu .= '<option value=\"'.$key.'\"'.$selected.'>'.$CI->lang->line($key).\"</option>\\n\";\n\t\t}\n\n\t\treturn $menu.'</select>';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('timezones'))\n{\n\t/**\n\t * Timezones\n\t *\n\t * Returns an array of timezones. This is a helper function\n\t * for various other ones in this library\n\t *\n\t * @param\tstring\ttimezone\n\t * @return\tstring\n\t */\n\tfunction timezones($tz = '')\n\t{\n\t\t// Note: Don't change the order of these even though\n\t\t// some items appear to be in the wrong order\n\n\t\t$zones = array(\n\t\t\t'UM12'\t\t=> -12,\n\t\t\t'UM11'\t\t=> -11,\n\t\t\t'UM10'\t\t=> -10,\n\t\t\t'UM95'\t\t=> -9.5,\n\t\t\t'UM9'\t\t=> -9,\n\t\t\t'UM8'\t\t=> -8,\n\t\t\t'UM7'\t\t=> -7,\n\t\t\t'UM6'\t\t=> -6,\n\t\t\t'UM5'\t\t=> -5,\n\t\t\t'UM45'\t\t=> -4.5,\n\t\t\t'UM4'\t\t=> -4,\n\t\t\t'UM35'\t\t=> -3.5,\n\t\t\t'UM3'\t\t=> -3,\n\t\t\t'UM2'\t\t=> -2,\n\t\t\t'UM1'\t\t=> -1,\n\t\t\t'UTC'\t\t=> 0,\n\t\t\t'UP1'\t\t=> +1,\n\t\t\t'UP2'\t\t=> +2,\n\t\t\t'UP3'\t\t=> +3,\n\t\t\t'UP35'\t\t=> +3.5,\n\t\t\t'UP4'\t\t=> +4,\n\t\t\t'UP45'\t\t=> +4.5,\n\t\t\t'UP5'\t\t=> +5,\n\t\t\t'UP55'\t\t=> +5.5,\n\t\t\t'UP575'\t\t=> +5.75,\n\t\t\t'UP6'\t\t=> +6,\n\t\t\t'UP65'\t\t=> +6.5,\n\t\t\t'UP7'\t\t=> +7,\n\t\t\t'UP8'\t\t=> +8,\n\t\t\t'UP875'\t\t=> +8.75,\n\t\t\t'UP9'\t\t=> +9,\n\t\t\t'UP95'\t\t=> +9.5,\n\t\t\t'UP10'\t\t=> +10,\n\t\t\t'UP105'\t\t=> +10.5,\n\t\t\t'UP11'\t\t=> +11,\n\t\t\t'UP115'\t\t=> +11.5,\n\t\t\t'UP12'\t\t=> +12,\n\t\t\t'UP1275'\t=> +12.75,\n\t\t\t'UP13'\t\t=> +13,\n\t\t\t'UP14'\t\t=> +14\n\t\t);\n\n\t\tif ($tz === '')\n\t\t{\n\t\t\treturn $zones;\n\t\t}\n\n\t\treturn isset($zones[$tz]) ? $zones[$tz] : 0;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('date_range'))\n{\n\t/**\n\t * Date range\n\t *\n\t * Returns a list of dates within a specified period.\n\t *\n\t * @param\tint\tunix_start\tUNIX timestamp of period start date\n\t * @param\tint\tunix_end|days\tUNIX timestamp of period end date\n\t *\t\t\t\t\tor interval in days.\n\t * @param\tmixed\tis_unix\t\tSpecifies whether the second parameter\n\t *\t\t\t\t\tis a UNIX timestamp or a day interval\n\t *\t\t\t\t\t - TRUE or 'unix' for a timestamp\n\t *\t\t\t\t\t - FALSE or 'days' for an interval\n\t * @param\tstring  date_format\tOutput date format, same as in date()\n\t * @return\tarray\n\t */\n\tfunction date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d')\n\t{\n\t\tif ($unix_start == '' OR $mixed == '' OR $format == '')\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$is_unix = ! ( ! $is_unix OR $is_unix === 'days');\n\n\t\t// Validate input and try strtotime() on invalid timestamps/intervals, just in case\n\t\tif ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE)\n\t\t\tOR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE))\n\t\t\tOR ($is_unix === TRUE && $mixed < $unix_start))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed)))\n\t\t{\n\t\t\treturn array(date($format, $unix_start));\n\t\t}\n\n\t\t$range = array();\n\n\t\t$from = new DateTime();\n\t\t$from->setTimestamp($unix_start);\n\n\t\tif ($is_unix)\n\t\t{\n\t\t\t$arg = new DateTime();\n\t\t\t$arg->setTimestamp($mixed);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$arg = (int) $mixed;\n\t\t}\n\n\t\t$period = new DatePeriod($from, new DateInterval('P1D'), $arg);\n\t\tforeach ($period as $date)\n\t\t{\n\t\t\t$range[] = $date->format($format);\n\t\t}\n\n\t\t/* If a period end date was passed to the DatePeriod constructor, it might not\n\t\t * be in our results. Not sure if this is a bug or it's just possible because\n\t\t * the end date might actually be less than 24 hours away from the previously\n\t\t * generated DateTime object, but either way - we have to append it manually.\n\t\t */\n\t\tif ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format))\n\t\t{\n\t\t\t$range[] = $arg->format($format);\n\t\t}\n\n\t\treturn $range;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/directory_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Directory Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/directory_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('directory_map'))\n{\n\t/**\n\t * Create a Directory Map\n\t *\n\t * Reads the specified directory and builds an array\n\t * representation of it. Sub-folders contained with the\n\t * directory will be mapped as well.\n\t *\n\t * @param\tstring\t$source_dir\t\tPath to source\n\t * @param\tint\t$directory_depth\tDepth of directories to traverse\n\t *\t\t\t\t\t\t(0 = fully recursive, 1 = current dir, etc)\n\t * @param\tbool\t$hidden\t\t\tWhether to show hidden files\n\t * @return\tarray\n\t */\n\tfunction directory_map($source_dir, $directory_depth = 0, $hidden = FALSE)\n\t{\n\t\tif ($fp = @opendir($source_dir))\n\t\t{\n\t\t\t$filedata\t= array();\n\t\t\t$new_depth\t= $directory_depth - 1;\n\t\t\t$source_dir\t= rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;\n\n\t\t\twhile (FALSE !== ($file = readdir($fp)))\n\t\t\t{\n\t\t\t\t// Remove '.', '..', and hidden files [optional]\n\t\t\t\tif ($file === '.' OR $file === '..' OR ($hidden === FALSE && $file[0] === '.'))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tis_dir($source_dir.$file) && $file .= DIRECTORY_SEPARATOR;\n\n\t\t\t\tif (($directory_depth < 1 OR $new_depth > 0) && is_dir($source_dir.$file))\n\t\t\t\t{\n\t\t\t\t\t$filedata[$file] = directory_map($source_dir.$file, $new_depth, $hidden);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$filedata[] = $file;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosedir($fp);\n\t\t\treturn $filedata;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/download_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Download Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/download_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('force_download'))\n{\n\t/**\n\t * Force Download\n\t *\n\t * Generates headers that force a download to happen\n\t *\n\t * @param\tstring\tfilename\n\t * @param\tmixed\tthe data to be downloaded\n\t * @param\tbool\twhether to try and send the actual file MIME type\n\t * @return\tvoid\n\t */\n\tfunction force_download($filename = '', $data = '', $set_mime = FALSE)\n\t{\n\t\tif ($filename === '' OR $data === '')\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\telseif ($data === NULL)\n\t\t{\n\t\t\tif ( ! @is_file($filename) OR ($filesize = @filesize($filename)) === FALSE)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$filepath = $filename;\n\t\t\t$filename = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $filename));\n\t\t\t$filename = end($filename);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$filesize = strlen($data);\n\t\t}\n\n\t\t// Set the default MIME type to send\n\t\t$mime = 'application/octet-stream';\n\n\t\t$x = explode('.', $filename);\n\t\t$extension = end($x);\n\n\t\tif ($set_mime === TRUE)\n\t\t{\n\t\t\tif (count($x) === 1 OR $extension === '')\n\t\t\t{\n\t\t\t\t/* If we're going to detect the MIME type,\n\t\t\t\t * we'll need a file extension.\n\t\t\t\t */\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Load the mime types\n\t\t\t$mimes =& get_mimes();\n\n\t\t\t// Only change the default MIME if we can find one\n\t\t\tif (isset($mimes[$extension]))\n\t\t\t{\n\t\t\t\t$mime = is_array($mimes[$extension]) ? $mimes[$extension][0] : $mimes[$extension];\n\t\t\t}\n\t\t}\n\n\t\t/* It was reported that browsers on Android 2.1 (and possibly older as well)\n\t\t * need to have the filename extension upper-cased in order to be able to\n\t\t * download it.\n\t\t *\n\t\t * Reference: http://digiblog.de/2011/04/19/android-and-the-download-file-headers/\n\t\t */\n\t\tif (count($x) !== 1 && isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/Android\\s(1|2\\.[01])/', $_SERVER['HTTP_USER_AGENT']))\n\t\t{\n\t\t\t$x[count($x) - 1] = strtoupper($extension);\n\t\t\t$filename = implode('.', $x);\n\t\t}\n\n\t\tif ($data === NULL && ($fp = @fopen($filepath, 'rb')) === FALSE)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean output buffer\n\t\tif (ob_get_level() !== 0 && @ob_end_clean() === FALSE)\n\t\t{\n\t\t\t@ob_clean();\n\t\t}\n\n\t\t// Generate the server headers\n\t\theader('Content-Type: '.$mime);\n\t\theader('Content-Disposition: attachment; filename=\"'.$filename.'\"');\n\t\theader('Expires: 0');\n\t\theader('Content-Transfer-Encoding: binary');\n\t\theader('Content-Length: '.$filesize);\n\t\theader('Cache-Control: private, no-transform, no-store, must-revalidate');\n\n\t\t// If we have raw data - just dump it\n\t\tif ($data !== NULL)\n\t\t{\n\t\t\texit($data);\n\t\t}\n\n\t\t// Flush 1MB chunks of data\n\t\twhile ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE)\n\t\t{\n\t\t\techo $data;\n\t\t}\n\n\t\tfclose($fp);\n\t\texit;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/email_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Email Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/email_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('valid_email'))\n{\n\t/**\n\t * Validate email address\n\t *\n\t * @deprecated\t3.0.0\tUse PHP's filter_var() instead\n\t * @param\tstring\t$email\n\t * @return\tbool\n\t */\n\tfunction valid_email($email)\n\t{\n\t\treturn (bool) filter_var($email, FILTER_VALIDATE_EMAIL);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('send_email'))\n{\n\t/**\n\t * Send an email\n\t *\n\t * @deprecated\t3.0.0\tUse PHP's mail() instead\n\t * @param\tstring\t$recipient\n\t * @param\tstring\t$subject\n\t * @param\tstring\t$message\n\t * @return\tbool\n\t */\n\tfunction send_email($recipient, $subject, $message)\n\t{\n\t\treturn mail($recipient, $subject, $message);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/file_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter File Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/file_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('read_file'))\n{\n\t/**\n\t * Read File\n\t *\n\t * Opens the file specified in the path and returns it as a string.\n\t *\n\t * @todo\tRemove in version 3.1+.\n\t * @deprecated\t3.0.0\tIt is now just an alias for PHP's native file_get_contents().\n\t * @param\tstring\t$file\tPath to file\n\t * @return\tstring\tFile contents\n\t */\n\tfunction read_file($file)\n\t{\n\t\treturn @file_get_contents($file);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('write_file'))\n{\n\t/**\n\t * Write File\n\t *\n\t * Writes data to the file specified in the path.\n\t * Creates a new file if non-existent.\n\t *\n\t * @param\tstring\t$path\tFile path\n\t * @param\tstring\t$data\tData to write\n\t * @param\tstring\t$mode\tfopen() mode (default: 'wb')\n\t * @return\tbool\n\t */\n\tfunction write_file($path, $data, $mode = 'wb')\n\t{\n\t\tif ( ! $fp = @fopen($path, $mode))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tflock($fp, LOCK_EX);\n\n\t\tfor ($result = $written = 0, $length = strlen($data); $written < $length; $written += $result)\n\t\t{\n\t\t\tif (($result = fwrite($fp, substr($data, $written))) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tflock($fp, LOCK_UN);\n\t\tfclose($fp);\n\n\t\treturn is_int($result);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('delete_files'))\n{\n\t/**\n\t * Delete Files\n\t *\n\t * Deletes all files contained in the supplied directory path.\n\t * Files must be writable or owned by the system in order to be deleted.\n\t * If the second parameter is set to TRUE, any directories contained\n\t * within the supplied base directory will be nuked as well.\n\t *\n\t * @param\tstring\t$path\t\tFile path\n\t * @param\tbool\t$del_dir\tWhether to delete any directories found in the path\n\t * @param\tbool\t$htdocs\t\tWhether to skip deleting .htaccess and index page files\n\t * @param\tint\t$_level\t\tCurrent directory depth level (default: 0; internal use only)\n\t * @return\tbool\n\t */\n\tfunction delete_files($path, $del_dir = FALSE, $htdocs = FALSE, $_level = 0)\n\t{\n\t\t// Trim the trailing slash\n\t\t$path = rtrim($path, '/\\\\');\n\n\t\tif ( ! $current_dir = @opendir($path))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\twhile (FALSE !== ($filename = @readdir($current_dir)))\n\t\t{\n\t\t\tif ($filename !== '.' && $filename !== '..')\n\t\t\t{\n\t\t\t\t$filepath = $path.DIRECTORY_SEPARATOR.$filename;\n\n\t\t\t\tif (is_dir($filepath) && $filename[0] !== '.' && ! is_link($filepath))\n\t\t\t\t{\n\t\t\t\t\tdelete_files($filepath, $del_dir, $htdocs, $_level + 1);\n\t\t\t\t}\n\t\t\t\telseif ($htdocs !== TRUE OR ! preg_match('/^(\\.htaccess|index\\.(html|htm|php)|web\\.config)$/i', $filename))\n\t\t\t\t{\n\t\t\t\t\t@unlink($filepath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tclosedir($current_dir);\n\n\t\treturn ($del_dir === TRUE && $_level > 0)\n\t\t\t? @rmdir($path)\n\t\t\t: TRUE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('get_filenames'))\n{\n\t/**\n\t * Get Filenames\n\t *\n\t * Reads the specified directory and builds an array containing the filenames.\n\t * Any sub-folders contained within the specified path are read as well.\n\t *\n\t * @param\tstring\tpath to source\n\t * @param\tbool\twhether to include the path as part of the filename\n\t * @param\tbool\tinternal variable to determine recursion status - do not use in calls\n\t * @return\tarray\n\t */\n\tfunction get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE)\n\t{\n\t\tstatic $_filedata = array();\n\n\t\tif ($fp = @opendir($source_dir))\n\t\t{\n\t\t\t// reset the array and make sure $source_dir has a trailing slash on the initial call\n\t\t\tif ($_recursion === FALSE)\n\t\t\t{\n\t\t\t\t$_filedata = array();\n\t\t\t\t$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;\n\t\t\t}\n\n\t\t\twhile (FALSE !== ($file = readdir($fp)))\n\t\t\t{\n\t\t\t\tif (is_dir($source_dir.$file) && $file[0] !== '.')\n\t\t\t\t{\n\t\t\t\t\tget_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);\n\t\t\t\t}\n\t\t\t\telseif ($file[0] !== '.')\n\t\t\t\t{\n\t\t\t\t\t$_filedata[] = ($include_path === TRUE) ? $source_dir.$file : $file;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosedir($fp);\n\t\t\treturn $_filedata;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('get_dir_file_info'))\n{\n\t/**\n\t * Get Directory File Information\n\t *\n\t * Reads the specified directory and builds an array containing the filenames,\n\t * filesize, dates, and permissions\n\t *\n\t * Any sub-folders contained within the specified path are read as well.\n\t *\n\t * @param\tstring\tpath to source\n\t * @param\tbool\tLook only at the top level directory specified?\n\t * @param\tbool\tinternal variable to determine recursion status - do not use in calls\n\t * @return\tarray\n\t */\n\tfunction get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE)\n\t{\n\t\tstatic $_filedata = array();\n\t\t$relative_path = $source_dir;\n\n\t\tif ($fp = @opendir($source_dir))\n\t\t{\n\t\t\t// reset the array and make sure $source_dir has a trailing slash on the initial call\n\t\t\tif ($_recursion === FALSE)\n\t\t\t{\n\t\t\t\t$_filedata = array();\n\t\t\t\t$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;\n\t\t\t}\n\n\t\t\t// Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast\n\t\t\twhile (FALSE !== ($file = readdir($fp)))\n\t\t\t{\n\t\t\t\tif (is_dir($source_dir.$file) && $file[0] !== '.' && $top_level_only === FALSE)\n\t\t\t\t{\n\t\t\t\t\tget_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE);\n\t\t\t\t}\n\t\t\t\telseif ($file[0] !== '.')\n\t\t\t\t{\n\t\t\t\t\t$_filedata[$file] = get_file_info($source_dir.$file);\n\t\t\t\t\t$_filedata[$file]['relative_path'] = $relative_path;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosedir($fp);\n\t\t\treturn $_filedata;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('get_file_info'))\n{\n\t/**\n\t * Get File Info\n\t *\n\t * Given a file and path, returns the name, path, size, date modified\n\t * Second parameter allows you to explicitly declare what information you want returned\n\t * Options are: name, server_path, size, date, readable, writable, executable, fileperms\n\t * Returns FALSE if the file cannot be found.\n\t *\n\t * @param\tstring\tpath to file\n\t * @param\tmixed\tarray or comma separated string of information returned\n\t * @return\tarray\n\t */\n\tfunction get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date'))\n\t{\n\t\tif ( ! file_exists($file))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (is_string($returned_values))\n\t\t{\n\t\t\t$returned_values = explode(',', $returned_values);\n\t\t}\n\n\t\tforeach ($returned_values as $key)\n\t\t{\n\t\t\tswitch ($key)\n\t\t\t{\n\t\t\t\tcase 'name':\n\t\t\t\t\t$fileinfo['name'] = basename($file);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'server_path':\n\t\t\t\t\t$fileinfo['server_path'] = $file;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'size':\n\t\t\t\t\t$fileinfo['size'] = filesize($file);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\t$fileinfo['date'] = filemtime($file);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'readable':\n\t\t\t\t\t$fileinfo['readable'] = is_readable($file);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'writable':\n\t\t\t\t\t$fileinfo['writable'] = is_really_writable($file);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'executable':\n\t\t\t\t\t$fileinfo['executable'] = is_executable($file);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'fileperms':\n\t\t\t\t\t$fileinfo['fileperms'] = fileperms($file);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn $fileinfo;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('get_mime_by_extension'))\n{\n\t/**\n\t * Get Mime by Extension\n\t *\n\t * Translates a file extension into a mime type based on config/mimes.php.\n\t * Returns FALSE if it can't determine the type, or open the mime config file\n\t *\n\t * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience\n\t * It should NOT be trusted, and should certainly NOT be used for security\n\t *\n\t * @param\tstring\t$filename\tFile name\n\t * @return\tstring\n\t */\n\tfunction get_mime_by_extension($filename)\n\t{\n\t\tstatic $mimes;\n\n\t\tif ( ! is_array($mimes))\n\t\t{\n\t\t\t$mimes = get_mimes();\n\n\t\t\tif (empty($mimes))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t$extension = strtolower(substr(strrchr($filename, '.'), 1));\n\n\t\tif (isset($mimes[$extension]))\n\t\t{\n\t\t\treturn is_array($mimes[$extension])\n\t\t\t\t? current($mimes[$extension]) // Multiple mime types, just give the first one\n\t\t\t\t: $mimes[$extension];\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('symbolic_permissions'))\n{\n\t/**\n\t * Symbolic Permissions\n\t *\n\t * Takes a numeric value representing a file's permissions and returns\n\t * standard symbolic notation representing that value\n\t *\n\t * @param\tint\t$perms\tPermissions\n\t * @return\tstring\n\t */\n\tfunction symbolic_permissions($perms)\n\t{\n\t\tif (($perms & 0xC000) === 0xC000)\n\t\t{\n\t\t\t$symbolic = 's'; // Socket\n\t\t}\n\t\telseif (($perms & 0xA000) === 0xA000)\n\t\t{\n\t\t\t$symbolic = 'l'; // Symbolic Link\n\t\t}\n\t\telseif (($perms & 0x8000) === 0x8000)\n\t\t{\n\t\t\t$symbolic = '-'; // Regular\n\t\t}\n\t\telseif (($perms & 0x6000) === 0x6000)\n\t\t{\n\t\t\t$symbolic = 'b'; // Block special\n\t\t}\n\t\telseif (($perms & 0x4000) === 0x4000)\n\t\t{\n\t\t\t$symbolic = 'd'; // Directory\n\t\t}\n\t\telseif (($perms & 0x2000) === 0x2000)\n\t\t{\n\t\t\t$symbolic = 'c'; // Character special\n\t\t}\n\t\telseif (($perms & 0x1000) === 0x1000)\n\t\t{\n\t\t\t$symbolic = 'p'; // FIFO pipe\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$symbolic = 'u'; // Unknown\n\t\t}\n\n\t\t// Owner\n\t\t$symbolic .= (($perms & 0x0100) ? 'r' : '-')\n\t\t\t.(($perms & 0x0080) ? 'w' : '-')\n\t\t\t.(($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-'));\n\n\t\t// Group\n\t\t$symbolic .= (($perms & 0x0020) ? 'r' : '-')\n\t\t\t.(($perms & 0x0010) ? 'w' : '-')\n\t\t\t.(($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-'));\n\n\t\t// World\n\t\t$symbolic .= (($perms & 0x0004) ? 'r' : '-')\n\t\t\t.(($perms & 0x0002) ? 'w' : '-')\n\t\t\t.(($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-'));\n\n\t\treturn $symbolic;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('octal_permissions'))\n{\n\t/**\n\t * Octal Permissions\n\t *\n\t * Takes a numeric value representing a file's permissions and returns\n\t * a three character string representing the file's octal permissions\n\t *\n\t * @param\tint\t$perms\tPermissions\n\t * @return\tstring\n\t */\n\tfunction octal_permissions($perms)\n\t{\n\t\treturn substr(sprintf('%o', $perms), -3);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/form_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Form Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/form_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_open'))\n{\n\t/**\n\t * Form Declaration\n\t *\n\t * Creates the opening portion of the form.\n\t *\n\t * @param\tstring\tthe URI segments of the form destination\n\t * @param\tarray\ta key/value pair of attributes\n\t * @param\tarray\ta key/value pair hidden data\n\t * @return\tstring\n\t */\n\tfunction form_open($action = '', $attributes = array(), $hidden = array())\n\t{\n\t\t$CI =& get_instance();\n\n\t\t// If no action is provided then set to the current url\n\t\tif ( ! $action)\n\t\t{\n\t\t\t$action = $CI->config->site_url($CI->uri->uri_string());\n\t\t}\n\t\t// If an action is not a full URL then turn it into one\n\t\telseif (strpos($action, '://') === FALSE)\n\t\t{\n\t\t\t$action = $CI->config->site_url($action);\n\t\t}\n\n\t\t$attributes = _attributes_to_string($attributes);\n\n\t\tif (stripos($attributes, 'method=') === FALSE)\n\t\t{\n\t\t\t$attributes .= ' method=\"post\"';\n\t\t}\n\n\t\tif (stripos($attributes, 'accept-charset=') === FALSE)\n\t\t{\n\t\t\t$attributes .= ' accept-charset=\"'.strtolower(config_item('charset')).'\"';\n\t\t}\n\n\t\t$form = '<form action=\"'.$action.'\"'.$attributes.\">\\n\";\n\n\t\tif (is_array($hidden))\n\t\t{\n\t\t\tforeach ($hidden as $name => $value)\n\t\t\t{\n\t\t\t\t$form .= '<input type=\"hidden\" name=\"'.$name.'\" value=\"'.html_escape($value).'\" />'.\"\\n\";\n\t\t\t}\n\t\t}\n\n\t\t// Add CSRF field if enabled, but leave it out for GET requests and requests to external websites\n\t\tif ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method=\"get\"'))\n\t\t{\n\t\t\t// Prepend/append random-length \"white noise\" around the CSRF\n\t\t\t// token input, as a form of protection against BREACH attacks\n\t\t\tif (FALSE !== ($noise = $CI->security->get_random_bytes(1)))\n\t\t\t{\n\t\t\t\tlist(, $noise) = unpack('c', $noise);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$noise = mt_rand(-128, 127);\n\t\t\t}\n\n\t\t\t// Prepend if $noise has a negative value, append if positive, do nothing for zero\n\t\t\t$prepend = $append = '';\n\t\t\tif ($noise < 0)\n\t\t\t{\n\t\t\t\t$prepend = str_repeat(\" \", abs($noise));\n\t\t\t}\n\t\t\telseif ($noise > 0)\n\t\t\t{\n\t\t\t\t$append  = str_repeat(\" \", $noise);\n\t\t\t}\n\n\t\t\t$form .= sprintf(\n\t\t\t\t'%s<input type=\"hidden\" name=\"%s\" value=\"%s\" />%s%s',\n\t\t\t\t$prepend,\n\t\t\t\t$CI->security->get_csrf_token_name(),\n\t\t\t\t$CI->security->get_csrf_hash(),\n\t\t\t\t$append,\n\t\t\t\t\"\\n\"\n\t\t\t);\n\t\t}\n\n\t\treturn $form;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_open_multipart'))\n{\n\t/**\n\t * Form Declaration - Multipart type\n\t *\n\t * Creates the opening portion of the form, but with \"multipart/form-data\".\n\t *\n\t * @param\tstring\tthe URI segments of the form destination\n\t * @param\tarray\ta key/value pair of attributes\n\t * @param\tarray\ta key/value pair hidden data\n\t * @return\tstring\n\t */\n\tfunction form_open_multipart($action = '', $attributes = array(), $hidden = array())\n\t{\n\t\tif (is_string($attributes))\n\t\t{\n\t\t\t$attributes .= ' enctype=\"multipart/form-data\"';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$attributes['enctype'] = 'multipart/form-data';\n\t\t}\n\n\t\treturn form_open($action, $attributes, $hidden);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_hidden'))\n{\n\t/**\n\t * Hidden Input Field\n\t *\n\t * Generates hidden fields. You can pass a simple key/value string or\n\t * an associative array with multiple values.\n\t *\n\t * @param\tmixed\t$name\t\tField name\n\t * @param\tstring\t$value\t\tField value\n\t * @param\tbool\t$recursing\n\t * @return\tstring\n\t */\n\tfunction form_hidden($name, $value = '', $recursing = FALSE)\n\t{\n\t\tstatic $form;\n\n\t\tif ($recursing === FALSE)\n\t\t{\n\t\t\t$form = \"\\n\";\n\t\t}\n\n\t\tif (is_array($name))\n\t\t{\n\t\t\tforeach ($name as $key => $val)\n\t\t\t{\n\t\t\t\tform_hidden($key, $val, TRUE);\n\t\t\t}\n\n\t\t\treturn $form;\n\t\t}\n\n\t\tif ( ! is_array($value))\n\t\t{\n\t\t\t$form .= '<input type=\"hidden\" name=\"'.$name.'\" value=\"'.html_escape($value).\"\\\" />\\n\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach ($value as $k => $v)\n\t\t\t{\n\t\t\t\t$k = is_int($k) ? '' : $k;\n\t\t\t\tform_hidden($name.'['.$k.']', $v, TRUE);\n\t\t\t}\n\t\t}\n\n\t\treturn $form;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_input'))\n{\n\t/**\n\t * Text Input Field\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_input($data = '', $value = '', $extra = '')\n\t{\n\t\t$defaults = array(\n\t\t\t'type' => 'text',\n\t\t\t'name' => is_array($data) ? '' : $data,\n\t\t\t'value' => $value\n\t\t);\n\n\t\treturn '<input '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).\" />\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_password'))\n{\n\t/**\n\t * Password Field\n\t *\n\t * Identical to the input function but adds the \"password\" type\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_password($data = '', $value = '', $extra = '')\n\t{\n\t\tis_array($data) OR $data = array('name' => $data);\n\t\t$data['type'] = 'password';\n\t\treturn form_input($data, $value, $extra);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_upload'))\n{\n\t/**\n\t * Upload Field\n\t *\n\t * Identical to the input function but adds the \"file\" type\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_upload($data = '', $value = '', $extra = '')\n\t{\n\t\t$defaults = array('type' => 'file', 'name' => '');\n\t\tis_array($data) OR $data = array('name' => $data);\n\t\t$data['type'] = 'file';\n\n\t\treturn '<input '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).\" />\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_textarea'))\n{\n\t/**\n\t * Textarea field\n\t *\n\t * @param\tmixed\t$data\n\t * @param\tstring\t$value\n\t * @param\tmixed\t$extra\n\t * @return\tstring\n\t */\n\tfunction form_textarea($data = '', $value = '', $extra = '')\n\t{\n\t\t$defaults = array(\n\t\t\t'name' => is_array($data) ? '' : $data,\n\t\t\t'cols' => '40',\n\t\t\t'rows' => '10'\n\t\t);\n\n\t\tif ( ! is_array($data) OR ! isset($data['value']))\n\t\t{\n\t\t\t$val = $value;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$val = $data['value'];\n\t\t\tunset($data['value']); // textareas don't use the value attribute\n\t\t}\n\n\t\treturn '<textarea '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).'>'\n\t\t\t.html_escape($val)\n\t\t\t.\"</textarea>\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_multiselect'))\n{\n\t/**\n\t * Multi-select menu\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @param\tmixed\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_multiselect($name = '', $options = array(), $selected = array(), $extra = '')\n\t{\n\t\t$extra = _attributes_to_string($extra);\n\t\tif (stripos($extra, 'multiple') === FALSE)\n\t\t{\n\t\t\t$extra .= ' multiple=\"multiple\"';\n\t\t}\n\n\t\treturn form_dropdown($name, $options, $selected, $extra);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('form_dropdown'))\n{\n\t/**\n\t * Drop-down Menu\n\t *\n\t * @param\tmixed\t$data\n\t * @param\tmixed\t$options\n\t * @param\tmixed\t$selected\n\t * @param\tmixed\t$extra\n\t * @return\tstring\n\t */\n\tfunction form_dropdown($data = '', $options = array(), $selected = array(), $extra = '')\n\t{\n\t\t$defaults = array();\n\n\t\tif (is_array($data))\n\t\t{\n\t\t\tif (isset($data['selected']))\n\t\t\t{\n\t\t\t\t$selected = $data['selected'];\n\t\t\t\tunset($data['selected']); // select tags don't have a selected attribute\n\t\t\t}\n\n\t\t\tif (isset($data['options']))\n\t\t\t{\n\t\t\t\t$options = $data['options'];\n\t\t\t\tunset($data['options']); // select tags don't use an options attribute\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$defaults = array('name' => $data);\n\t\t}\n\n\t\tis_array($selected) OR $selected = array($selected);\n\t\tis_array($options) OR $options = array($options);\n\n\t\t// If no selected state was submitted we will attempt to set it automatically\n\t\tif (empty($selected))\n\t\t{\n\t\t\tif (is_array($data))\n\t\t\t{\n\t\t\t\tif (isset($data['name'], $_POST[$data['name']]))\n\t\t\t\t{\n\t\t\t\t\t$selected = array($_POST[$data['name']]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (isset($_POST[$data]))\n\t\t\t{\n\t\t\t\t$selected = array($_POST[$data]);\n\t\t\t}\n\t\t}\n\n\t\t$extra = _attributes_to_string($extra);\n\n\t\t$multiple = (count($selected) > 1 && stripos($extra, 'multiple') === FALSE) ? ' multiple=\"multiple\"' : '';\n\n\t\t$form = '<select '.rtrim(_parse_form_attributes($data, $defaults)).$extra.$multiple.\">\\n\";\n\n\t\tforeach ($options as $key => $val)\n\t\t{\n\t\t\t$key = (string) $key;\n\n\t\t\tif (is_array($val))\n\t\t\t{\n\t\t\t\tif (empty($val))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$form .= '<optgroup label=\"'.$key.\"\\\">\\n\";\n\n\t\t\t\tforeach ($val as $optgroup_key => $optgroup_val)\n\t\t\t\t{\n\t\t\t\t\t$sel = in_array($optgroup_key, $selected) ? ' selected=\"selected\"' : '';\n\t\t\t\t\t$form .= '<option value=\"'.html_escape($optgroup_key).'\"'.$sel.'>'\n\t\t\t\t\t\t.(string) $optgroup_val.\"</option>\\n\";\n\t\t\t\t}\n\n\t\t\t\t$form .= \"</optgroup>\\n\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$form .= '<option value=\"'.html_escape($key).'\"'\n\t\t\t\t\t.(in_array($key, $selected) ? ' selected=\"selected\"' : '').'>'\n\t\t\t\t\t.(string) $val.\"</option>\\n\";\n\t\t\t}\n\t\t}\n\n\t\treturn $form.\"</select>\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_checkbox'))\n{\n\t/**\n\t * Checkbox Field\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tbool\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '')\n\t{\n\t\t$defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value);\n\n\t\tif (is_array($data) && array_key_exists('checked', $data))\n\t\t{\n\t\t\t$checked = $data['checked'];\n\n\t\t\tif ($checked == FALSE)\n\t\t\t{\n\t\t\t\tunset($data['checked']);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$data['checked'] = 'checked';\n\t\t\t}\n\t\t}\n\n\t\tif ($checked == TRUE)\n\t\t{\n\t\t\t$defaults['checked'] = 'checked';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tunset($defaults['checked']);\n\t\t}\n\n\t\treturn '<input '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).\" />\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_radio'))\n{\n\t/**\n\t * Radio Button\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tbool\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_radio($data = '', $value = '', $checked = FALSE, $extra = '')\n\t{\n\t\tis_array($data) OR $data = array('name' => $data);\n\t\t$data['type'] = 'radio';\n\n\t\treturn form_checkbox($data, $value, $checked, $extra);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_submit'))\n{\n\t/**\n\t * Submit Button\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_submit($data = '', $value = '', $extra = '')\n\t{\n\t\t$defaults = array(\n\t\t\t'type' => 'submit',\n\t\t\t'name' => is_array($data) ? '' : $data,\n\t\t\t'value' => $value\n\t\t);\n\n\t\treturn '<input '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).\" />\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_reset'))\n{\n\t/**\n\t * Reset Button\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_reset($data = '', $value = '', $extra = '')\n\t{\n\t\t$defaults = array(\n\t\t\t'type' => 'reset',\n\t\t\t'name' => is_array($data) ? '' : $data,\n\t\t\t'value' => $value\n\t\t);\n\n\t\treturn '<input '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).\" />\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_button'))\n{\n\t/**\n\t * Form Button\n\t *\n\t * @param\tmixed\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction form_button($data = '', $content = '', $extra = '')\n\t{\n\t\t$defaults = array(\n\t\t\t'name' => is_array($data) ? '' : $data,\n\t\t\t'type' => 'button'\n\t\t);\n\n\t\tif (is_array($data) && isset($data['content']))\n\t\t{\n\t\t\t$content = $data['content'];\n\t\t\tunset($data['content']); // content is not an attribute\n\t\t}\n\n\t\treturn '<button '._parse_form_attributes($data, $defaults)._attributes_to_string($extra).'>'\n\t\t\t.$content\n\t\t\t.\"</button>\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_label'))\n{\n\t/**\n\t * Form Label Tag\n\t *\n\t * @param\tstring\tThe text to appear onscreen\n\t * @param\tstring\tThe id the label applies to\n\t * @param\tmixed\tAdditional attributes\n\t * @return\tstring\n\t */\n\tfunction form_label($label_text = '', $id = '', $attributes = array())\n\t{\n\n\t\t$label = '<label';\n\n\t\tif ($id !== '')\n\t\t{\n\t\t\t$label .= ' for=\"'.$id.'\"';\n\t\t}\n\n\t\t$label .= _attributes_to_string($attributes);\n\n\t\treturn $label.'>'.$label_text.'</label>';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_fieldset'))\n{\n\t/**\n\t * Fieldset Tag\n\t *\n\t * Used to produce <fieldset><legend>text</legend>.  To close fieldset\n\t * use form_fieldset_close()\n\t *\n\t * @param\tstring\tThe legend text\n\t * @param\tarray\tAdditional attributes\n\t * @return\tstring\n\t */\n\tfunction form_fieldset($legend_text = '', $attributes = array())\n\t{\n\t\t$fieldset = '<fieldset'._attributes_to_string($attributes).\">\\n\";\n\t\tif ($legend_text !== '')\n\t\t{\n\t\t\treturn $fieldset.'<legend>'.$legend_text.\"</legend>\\n\";\n\t\t}\n\n\t\treturn $fieldset;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_fieldset_close'))\n{\n\t/**\n\t * Fieldset Close Tag\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction form_fieldset_close($extra = '')\n\t{\n\t\treturn '</fieldset>'.$extra;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_close'))\n{\n\t/**\n\t * Form Close Tag\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction form_close($extra = '')\n\t{\n\t\treturn '</form>'.$extra;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_prep'))\n{\n\t/**\n\t * Form Prep\n\t *\n\t * Formats text so that it can be safely placed in a form field in the event it has HTML tags.\n\t *\n\t * @deprecated\t3.0.0\tAn alias for html_escape()\n\t * @param\tstring|string[]\t$str\t\tValue to escape\n\t * @return\tstring|string[]\tEscaped values\n\t */\n\tfunction form_prep($str)\n\t{\n\t\treturn html_escape($str, TRUE);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_value'))\n{\n\t/**\n\t * Form Value\n\t *\n\t * Grabs a value from the POST array for the specified field so you can\n\t * re-populate an input field or textarea. If Form Validation\n\t * is active it retrieves the info from the validation class\n\t *\n\t * @param\tstring\t$field\t\tField name\n\t * @param\tstring\t$default\tDefault value\n\t * @param\tbool\t$html_escape\tWhether to escape HTML special characters or not\n\t * @return\tstring\n\t */\n\tfunction set_value($field, $default = '', $html_escape = TRUE)\n\t{\n\t\t$CI =& get_instance();\n\n\t\t$value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field))\n\t\t\t? $CI->form_validation->set_value($field, $default)\n\t\t\t: $CI->input->post($field, FALSE);\n\n\t\tisset($value) OR $value = $default;\n\t\treturn ($html_escape) ? html_escape($value) : $value;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_select'))\n{\n\t/**\n\t * Set Select\n\t *\n\t * Let's you set the selected value of a <select> menu via data in the POST array.\n\t * If Form Validation is active it retrieves the info from the validation class\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tfunction set_select($field, $value = '', $default = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\n\t\tif (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field))\n\t\t{\n\t\t\treturn $CI->form_validation->set_select($field, $value, $default);\n\t\t}\n\t\telseif (($input = $CI->input->post($field, FALSE)) === NULL)\n\t\t{\n\t\t\treturn ($default === TRUE) ? ' selected=\"selected\"' : '';\n\t\t}\n\n\t\t$value = (string) $value;\n\t\tif (is_array($input))\n\t\t{\n\t\t\t// Note: in_array('', array(0)) returns TRUE, do not use it\n\t\t\tforeach ($input as &$v)\n\t\t\t{\n\t\t\t\tif ($value === $v)\n\t\t\t\t{\n\t\t\t\t\treturn ' selected=\"selected\"';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\n\t\treturn ($input === $value) ? ' selected=\"selected\"' : '';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_checkbox'))\n{\n\t/**\n\t * Set Checkbox\n\t *\n\t * Let's you set the selected value of a checkbox via the value in the POST array.\n\t * If Form Validation is active it retrieves the info from the validation class\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tfunction set_checkbox($field, $value = '', $default = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\n\t\tif (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field))\n\t\t{\n\t\t\treturn $CI->form_validation->set_checkbox($field, $value, $default);\n\t\t}\n\n\t\t// Form inputs are always strings ...\n\t\t$value = (string) $value;\n\t\t$input = $CI->input->post($field, FALSE);\n\n\t\tif (is_array($input))\n\t\t{\n\t\t\t// Note: in_array('', array(0)) returns TRUE, do not use it\n\t\t\tforeach ($input as &$v)\n\t\t\t{\n\t\t\t\tif ($value === $v)\n\t\t\t\t{\n\t\t\t\t\treturn ' checked=\"checked\"';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\n\t\t// Unchecked checkbox and radio inputs are not even submitted by browsers ...\n\t\tif ($CI->input->method() === 'post')\n\t\t{\n\t\t\treturn ($input === $value) ? ' checked=\"checked\"' : '';\n\t\t}\n\n\t\treturn ($default === TRUE) ? ' checked=\"checked\"' : '';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_radio'))\n{\n\t/**\n\t * Set Radio\n\t *\n\t * Let's you set the selected value of a radio field via info in the POST array.\n\t * If Form Validation is active it retrieves the info from the validation class\n\t *\n\t * @param\tstring\t$field\n\t * @param\tstring\t$value\n\t * @param\tbool\t$default\n\t * @return\tstring\n\t */\n\tfunction set_radio($field, $value = '', $default = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\n\t\tif (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field))\n\t\t{\n\t\t\treturn $CI->form_validation->set_radio($field, $value, $default);\n\t\t}\n\n\t\t// Form inputs are always strings ...\n\t\t$value = (string) $value;\n\t\t$input = $CI->input->post($field, FALSE);\n\n\t\tif (is_array($input))\n\t\t{\n\t\t\t// Note: in_array('', array(0)) returns TRUE, do not use it\n\t\t\tforeach ($input as &$v)\n\t\t\t{\n\t\t\t\tif ($value === $v)\n\t\t\t\t{\n\t\t\t\t\treturn ' checked=\"checked\"';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\n\t\t// Unchecked checkbox and radio inputs are not even submitted by browsers ...\n\t\tif ($CI->input->method() === 'post')\n\t\t{\n\t\t\treturn ($input === $value) ? ' checked=\"checked\"' : '';\n\t\t}\n\n\t\treturn ($default === TRUE) ? ' checked=\"checked\"' : '';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('form_error'))\n{\n\t/**\n\t * Form Error\n\t *\n\t * Returns the error for a specific form field. This is a helper for the\n\t * form validation class.\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction form_error($field = '', $prefix = '', $suffix = '')\n\t{\n\t\tif (FALSE === ($OBJ =& _get_validation_object()))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\treturn $OBJ->error($field, $prefix, $suffix);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('validation_errors'))\n{\n\t/**\n\t * Validation Error String\n\t *\n\t * Returns all the errors associated with a form submission. This is a helper\n\t * function for the form validation class.\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction validation_errors($prefix = '', $suffix = '')\n\t{\n\t\tif (FALSE === ($OBJ =& _get_validation_object()))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\treturn $OBJ->error_string($prefix, $suffix);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_parse_form_attributes'))\n{\n\t/**\n\t * Parse the form attributes\n\t *\n\t * Helper function used by some of the form helpers\n\t *\n\t * @param\tarray\t$attributes\tList of attributes\n\t * @param\tarray\t$default\tDefault values\n\t * @return\tstring\n\t */\n\tfunction _parse_form_attributes($attributes, $default)\n\t{\n\t\tif (is_array($attributes))\n\t\t{\n\t\t\tforeach ($default as $key => $val)\n\t\t\t{\n\t\t\t\tif (isset($attributes[$key]))\n\t\t\t\t{\n\t\t\t\t\t$default[$key] = $attributes[$key];\n\t\t\t\t\tunset($attributes[$key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (count($attributes) > 0)\n\t\t\t{\n\t\t\t\t$default = array_merge($default, $attributes);\n\t\t\t}\n\t\t}\n\n\t\t$att = '';\n\n\t\tforeach ($default as $key => $val)\n\t\t{\n\t\t\tif ($key === 'value')\n\t\t\t{\n\t\t\t\t$val = html_escape($val);\n\t\t\t}\n\t\t\telseif ($key === 'name' && ! strlen($default['name']))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$att .= $key.'=\"'.$val.'\" ';\n\t\t}\n\n\t\treturn $att;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_attributes_to_string'))\n{\n\t/**\n\t * Attributes To String\n\t *\n\t * Helper function used by some of the form helpers\n\t *\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction _attributes_to_string($attributes)\n\t{\n\t\tif (empty($attributes))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\tif (is_object($attributes))\n\t\t{\n\t\t\t$attributes = (array) $attributes;\n\t\t}\n\n\t\tif (is_array($attributes))\n\t\t{\n\t\t\t$atts = '';\n\n\t\t\tforeach ($attributes as $key => $val)\n\t\t\t{\n\t\t\t\t$atts .= ' '.$key.'=\"'.$val.'\"';\n\t\t\t}\n\n\t\t\treturn $atts;\n\t\t}\n\n\t\tif (is_string($attributes))\n\t\t{\n\t\t\treturn ' '.$attributes;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_get_validation_object'))\n{\n\t/**\n\t * Validation Object\n\t *\n\t * Determines what the form validation class was instantiated as, fetches\n\t * the object and returns it.\n\t *\n\t * @return\tmixed\n\t */\n\tfunction &_get_validation_object()\n\t{\n\t\t$CI =& get_instance();\n\n\t\t// We set this as a variable since we're returning by reference.\n\t\t$return = FALSE;\n\n\t\tif (FALSE !== ($object = $CI->load->is_loaded('Form_validation')))\n\t\t{\n\t\t\tif ( ! isset($CI->$object) OR ! is_object($CI->$object))\n\t\t\t{\n\t\t\t\treturn $return;\n\t\t\t}\n\n\t\t\treturn $CI->$object;\n\t\t}\n\n\t\treturn $return;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/html_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter HTML Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/html_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('heading'))\n{\n\t/**\n\t * Heading\n\t *\n\t * Generates an HTML heading tag.\n\t *\n\t * @param\tstring\tcontent\n\t * @param\tint\theading level\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction heading($data = '', $h = '1', $attributes = '')\n\t{\n\t\treturn '<h'.$h._stringify_attributes($attributes).'>'.$data.'</h'.$h.'>';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('ul'))\n{\n\t/**\n\t * Unordered List\n\t *\n\t * Generates an HTML unordered list from an single or multi-dimensional array.\n\t *\n\t * @param\tarray\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction ul($list, $attributes = '')\n\t{\n\t\treturn _list('ul', $list, $attributes);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('ol'))\n{\n\t/**\n\t * Ordered List\n\t *\n\t * Generates an HTML ordered list from an single or multi-dimensional array.\n\t *\n\t * @param\tarray\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction ol($list, $attributes = '')\n\t{\n\t\treturn _list('ol', $list, $attributes);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_list'))\n{\n\t/**\n\t * Generates the list\n\t *\n\t * Generates an HTML ordered list from an single or multi-dimensional array.\n\t *\n\t * @param\tstring\n\t * @param\tmixed\n\t * @param\tmixed\n\t * @param\tint\n\t * @return\tstring\n\t */\n\tfunction _list($type = 'ul', $list = array(), $attributes = '', $depth = 0)\n\t{\n\t\t// If an array wasn't submitted there's nothing to do...\n\t\tif ( ! is_array($list))\n\t\t{\n\t\t\treturn $list;\n\t\t}\n\n\t\t// Set the indentation based on the depth\n\t\t$out = str_repeat(' ', $depth)\n\t\t\t// Write the opening list tag\n\t\t\t.'<'.$type._stringify_attributes($attributes).\">\\n\";\n\n\t\t// Cycle through the list elements.  If an array is\n\t\t// encountered we will recursively call _list()\n\n\t\tstatic $_last_list_item = '';\n\t\tforeach ($list as $key => $val)\n\t\t{\n\t\t\t$_last_list_item = $key;\n\n\t\t\t$out .= str_repeat(' ', $depth + 2).'<li>';\n\n\t\t\tif ( ! is_array($val))\n\t\t\t{\n\t\t\t\t$out .= $val;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$out .= $_last_list_item.\"\\n\"._list($type, $val, '', $depth + 4).str_repeat(' ', $depth + 2);\n\t\t\t}\n\n\t\t\t$out .= \"</li>\\n\";\n\t\t}\n\n\t\t// Set the indentation for the closing tag and apply it\n\t\treturn $out.str_repeat(' ', $depth).'</'.$type.\">\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('img'))\n{\n\t/**\n\t * Image\n\t *\n\t * Generates an <img /> element\n\t *\n\t * @param\tmixed\n\t * @param\tbool\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tfunction img($src = '', $index_page = FALSE, $attributes = '')\n\t{\n\t\tif ( ! is_array($src) )\n\t\t{\n\t\t\t$src = array('src' => $src);\n\t\t}\n\n\t\t// If there is no alt attribute defined, set it to an empty string\n\t\tif ( ! isset($src['alt']))\n\t\t{\n\t\t\t$src['alt'] = '';\n\t\t}\n\n\t\t$img = '<img';\n\n\t\tforeach ($src as $k => $v)\n\t\t{\n\t\t\tif ($k === 'src' && ! preg_match('#^(data:[a-z,;])|(([a-z]+:)?(?<!data:)//)#i', $v))\n\t\t\t{\n\t\t\t\tif ($index_page === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$img .= ' src=\"'.get_instance()->config->site_url($v).'\"';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$img .= ' src=\"'.get_instance()->config->base_url($v).'\"';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$img .= ' '.$k.'=\"'.$v.'\"';\n\t\t\t}\n\t\t}\n\n\t\treturn $img._stringify_attributes($attributes).' />';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('doctype'))\n{\n\t/**\n\t * Doctype\n\t *\n\t * Generates a page document type declaration\n\t *\n\t * Examples of valid options: html5, xhtml-11, xhtml-strict, xhtml-trans,\n\t * xhtml-frame, html4-strict, html4-trans, and html4-frame.\n\t * All values are saved in the doctypes config file.\n\t *\n\t * @param\tstring\ttype\tThe doctype to be generated\n\t * @return\tstring\n\t */\n\tfunction doctype($type = 'xhtml1-strict')\n\t{\n\t\tstatic $doctypes;\n\n\t\tif ( ! is_array($doctypes))\n\t\t{\n\t\t\tif (file_exists(APPPATH.'config/doctypes.php'))\n\t\t\t{\n\t\t\t\tinclude(APPPATH.'config/doctypes.php');\n\t\t\t}\n\n\t\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'))\n\t\t\t{\n\t\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php');\n\t\t\t}\n\n\t\t\tif (empty($_doctypes) OR ! is_array($_doctypes))\n\t\t\t{\n\t\t\t\t$doctypes = array();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$doctypes = $_doctypes;\n\t\t}\n\n\t\treturn isset($doctypes[$type]) ? $doctypes[$type] : FALSE;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('link_tag'))\n{\n\t/**\n\t * Link\n\t *\n\t * Generates link to a CSS file\n\t *\n\t * @param\tmixed\tstylesheet hrefs or an array\n\t * @param\tstring\trel\n\t * @param\tstring\ttype\n\t * @param\tstring\ttitle\n\t * @param\tstring\tmedia\n\t * @param\tbool\tshould index_page be added to the css path\n\t * @return\tstring\n\t */\n\tfunction link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = '', $media = '', $index_page = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\t\t$link = '<link ';\n\n\t\tif (is_array($href))\n\t\t{\n\t\t\tforeach ($href as $k => $v)\n\t\t\t{\n\t\t\t\tif ($k === 'href' && ! preg_match('#^([a-z]+:)?//#i', $v))\n\t\t\t\t{\n\t\t\t\t\tif ($index_page === TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$link .= 'href=\"'.$CI->config->site_url($v).'\" ';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$link .= 'href=\"'.$CI->config->base_url($v).'\" ';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$link .= $k.'=\"'.$v.'\" ';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (preg_match('#^([a-z]+:)?//#i', $href))\n\t\t\t{\n\t\t\t\t$link .= 'href=\"'.$href.'\" ';\n\t\t\t}\n\t\t\telseif ($index_page === TRUE)\n\t\t\t{\n\t\t\t\t$link .= 'href=\"'.$CI->config->site_url($href).'\" ';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$link .= 'href=\"'.$CI->config->base_url($href).'\" ';\n\t\t\t}\n\n\t\t\t$link .= 'rel=\"'.$rel.'\" type=\"'.$type.'\" ';\n\n\t\t\tif ($media !== '')\n\t\t\t{\n\t\t\t\t$link .= 'media=\"'.$media.'\" ';\n\t\t\t}\n\n\t\t\tif ($title !== '')\n\t\t\t{\n\t\t\t\t$link .= 'title=\"'.$title.'\" ';\n\t\t\t}\n\t\t}\n\n\t\treturn $link.\"/>\\n\";\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('meta'))\n{\n\t/**\n\t * Generates meta tags from an array of key/values\n\t *\n\t * @param\tarray\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction meta($name = '', $content = '', $type = 'name', $newline = \"\\n\")\n\t{\n\t\t// Since we allow the data to be passes as a string, a simple array\n\t\t// or a multidimensional one, we need to do a little prepping.\n\t\tif ( ! is_array($name))\n\t\t{\n\t\t\t$name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline));\n\t\t}\n\t\telseif (isset($name['name']))\n\t\t{\n\t\t\t// Turn single array into multidimensional\n\t\t\t$name = array($name);\n\t\t}\n\n\t\t$str = '';\n\t\tforeach ($name as $meta)\n\t\t{\n\t\t\t$type\t\t= (isset($meta['type']) && $meta['type'] !== 'name')\t? 'http-equiv' : 'name';\n\t\t\t$name\t\t= isset($meta['name'])\t\t\t\t\t? $meta['name'] : '';\n\t\t\t$content\t= isset($meta['content'])\t\t\t\t? $meta['content'] : '';\n\t\t\t$newline\t= isset($meta['newline'])\t\t\t\t? $meta['newline'] : \"\\n\";\n\n\t\t\t$str .= '<meta '.$type.'=\"'.$name.'\" content=\"'.$content.'\" />'.$newline;\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('br'))\n{\n\t/**\n\t * Generates HTML BR tags based on number supplied\n\t *\n\t * @deprecated\t3.0.0\tUse str_repeat() instead\n\t * @param\tint\t$count\tNumber of times to repeat the tag\n\t * @return\tstring\n\t */\n\tfunction br($count = 1)\n\t{\n\t\treturn str_repeat('<br />', $count);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('nbs'))\n{\n\t/**\n\t * Generates non-breaking space entities based on number supplied\n\t *\n\t * @deprecated\t3.0.0\tUse str_repeat() instead\n\t * @param\tint\n\t * @return\tstring\n\t */\n\tfunction nbs($num = 1)\n\t{\n\t\treturn str_repeat('&nbsp;', $num);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/helpers/inflector_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Inflector Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/inflector_helper.html\n */\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('singular'))\n{\n\t/**\n\t * Singular\n\t *\n\t * Takes a plural word and makes it singular\n\t *\n\t * @param\tstring\t$str\tInput string\n\t * @return\tstring\n\t */\n\tfunction singular($str)\n\t{\n\t\t$result = strval($str);\n\n\t\tif ( ! word_is_countable($result))\n\t\t{\n\t\t\treturn $result;\n\t\t}\n\n\t\t$singular_rules = array(\n\t\t\t'/(matr)ices$/'\t\t=> '\\1ix',\n\t\t\t'/(vert|ind)ices$/'\t=> '\\1ex',\n\t\t\t'/^(ox)en/'\t\t=> '\\1',\n\t\t\t'/(alias)es$/'\t\t=> '\\1',\n\t\t\t'/([octop|vir])i$/'\t=> '\\1us',\n\t\t\t'/(cris|ax|test)es$/'\t=> '\\1is',\n\t\t\t'/(shoe)s$/'\t\t=> '\\1',\n\t\t\t'/(o)es$/'\t\t=> '\\1',\n\t\t\t'/(bus|campus)es$/'\t=> '\\1',\n\t\t\t'/([m|l])ice$/'\t\t=> '\\1ouse',\n\t\t\t'/(x|ch|ss|sh)es$/'\t=> '\\1',\n\t\t\t'/(m)ovies$/'\t\t=> '\\1\\2ovie',\n\t\t\t'/(s)eries$/'\t\t=> '\\1\\2eries',\n\t\t\t'/([^aeiouy]|qu)ies$/'\t=> '\\1y',\n\t\t\t'/([lr])ves$/'\t\t=> '\\1f',\n\t\t\t'/(tive)s$/'\t\t=> '\\1',\n\t\t\t'/(hive)s$/'\t\t=> '\\1',\n\t\t\t'/([^f])ves$/'\t\t=> '\\1fe',\n\t\t\t'/(^analy)ses$/'\t=> '\\1sis',\n\t\t\t'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/' => '\\1\\2sis',\n\t\t\t'/([ti])a$/'\t\t=> '\\1um',\n\t\t\t'/(p)eople$/'\t\t=> '\\1\\2erson',\n\t\t\t'/(m)en$/'\t\t=> '\\1an',\n\t\t\t'/(s)tatuses$/'\t\t=> '\\1\\2tatus',\n\t\t\t'/(c)hildren$/'\t\t=> '\\1\\2hild',\n\t\t\t'/(n)ews$/'\t\t=> '\\1\\2ews',\n\t\t\t'/(quiz)zes$/'\t\t=> '\\1',\n\t\t\t'/([^us])s$/'\t\t=> '\\1'\n\t\t);\n\n\t\tforeach ($singular_rules as $rule => $replacement)\n\t\t{\n\t\t\tif (preg_match($rule, $result))\n\t\t\t{\n\t\t\t\t$result = preg_replace($rule, $replacement, $result);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn $result;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('plural'))\n{\n\t/**\n\t * Plural\n\t *\n\t * Takes a singular word and makes it plural\n\t *\n\t * @param\tstring\t$str\tInput string\n\t * @return\tstring\n\t */\n\tfunction plural($str)\n\t{\n\t\t$result = strval($str);\n\n\t\tif ( ! word_is_countable($result))\n\t\t{\n\t\t\treturn $result;\n\t\t}\n\n\t\t$plural_rules = array(\n\t\t\t'/(quiz)$/'                => '\\1zes',      // quizzes\n\t\t\t'/^(ox)$/'                 => '\\1\\2en',     // ox\n\t\t\t'/([m|l])ouse$/'           => '\\1ice',      // mouse, louse\n\t\t\t'/(matr|vert|ind)ix|ex$/'  => '\\1ices',     // matrix, vertex, index\n\t\t\t'/(x|ch|ss|sh)$/'          => '\\1es',       // search, switch, fix, box, process, address\n\t\t\t'/([^aeiouy]|qu)y$/'       => '\\1ies',      // query, ability, agency\n\t\t\t'/(hive)$/'                => '\\1s',        // archive, hive\n\t\t\t'/(?:([^f])fe|([lr])f)$/'  => '\\1\\2ves',    // half, safe, wife\n\t\t\t'/sis$/'                   => 'ses',        // basis, diagnosis\n\t\t\t'/([ti])um$/'              => '\\1a',        // datum, medium\n\t\t\t'/(p)erson$/'              => '\\1eople',    // person, salesperson\n\t\t\t'/(m)an$/'                 => '\\1en',       // man, woman, spokesman\n\t\t\t'/(c)hild$/'               => '\\1hildren',  // child\n\t\t\t'/(buffal|tomat)o$/'       => '\\1\\2oes',    // buffalo, tomato\n\t\t\t'/(bu|campu)s$/'           => '\\1\\2ses',    // bus, campus\n\t\t\t'/(alias|status|virus)$/'  => '\\1es',       // alias\n\t\t\t'/(octop)us$/'             => '\\1i',        // octopus\n\t\t\t'/(ax|cris|test)is$/'      => '\\1es',       // axis, crisis\n\t\t\t'/s$/'                     => 's',          // no change (compatibility)\n\t\t\t'/$/'                      => 's',\n\t\t);\n\n\t\tforeach ($plural_rules as $rule => $replacement)\n\t\t{\n\t\t\tif (preg_match($rule, $result))\n\t\t\t{\n\t\t\t\t$result = preg_replace($rule, $replacement, $result);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn $result;\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('camelize'))\n{\n\t/**\n\t * Camelize\n\t *\n\t * Takes multiple words separated by spaces or underscores and camelizes them\n\t *\n\t * @param\tstring\t$str\tInput string\n\t * @return\tstring\n\t */\n\tfunction camelize($str)\n\t{\n\t\treturn strtolower($str[0]).substr(str_replace(' ', '', ucwords(preg_replace('/[\\s_]+/', ' ', $str))), 1);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('underscore'))\n{\n\t/**\n\t * Underscore\n\t *\n\t * Takes multiple words separated by spaces and underscores them\n\t *\n\t * @param\tstring\t$str\tInput string\n\t * @return\tstring\n\t */\n\tfunction underscore($str)\n\t{\n\t\treturn preg_replace('/[\\s]+/', '_', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str)));\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('humanize'))\n{\n\t/**\n\t * Humanize\n\t *\n\t * Takes multiple words separated by the separator and changes them to spaces\n\t *\n\t * @param\tstring\t$str\t\tInput string\n\t * @param \tstring\t$separator\tInput separator\n\t * @return\tstring\n\t */\n\tfunction humanize($str, $separator = '_')\n\t{\n\t\treturn ucwords(preg_replace('/['.preg_quote($separator).']+/', ' ', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str))));\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('word_is_countable'))\n{\n\t/**\n\t * Checks if the given word has a plural version.\n\t *\n\t * @param\tstring\t$word\tWord to check\n\t * @return\tbool\n\t */\n\tfunction word_is_countable($word)\n\t{\n\t\treturn ! in_array(\n\t\t\tstrtolower($word),\n\t\t\tarray(\n\t\t\t\t'audio',\n\t\t\t\t'bison',\n\t\t\t\t'chassis',\n\t\t\t\t'compensation',\n\t\t\t\t'coreopsis',\n\t\t\t\t'data',\n\t\t\t\t'deer',\n\t\t\t\t'education',\n\t\t\t\t'emoji',\n\t\t\t\t'equipment',\n\t\t\t\t'fish',\n\t\t\t\t'furniture',\n\t\t\t\t'gold',\n\t\t\t\t'information',\n\t\t\t\t'knowledge',\n\t\t\t\t'love',\n\t\t\t\t'rain',\n\t\t\t\t'money',\n\t\t\t\t'moose',\n\t\t\t\t'nutrition',\n\t\t\t\t'offspring',\n\t\t\t\t'plankton',\n\t\t\t\t'pokemon',\n\t\t\t\t'police',\n\t\t\t\t'rice',\n\t\t\t\t'series',\n\t\t\t\t'sheep',\n\t\t\t\t'species',\n\t\t\t\t'swine',\n\t\t\t\t'traffic',\n\t\t\t\t'wheat'\n\t\t\t)\n\t\t);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('is_countable'))\n{\n\tfunction is_countable($word)\n\t{\n\t\ttrigger_error('is_countable() is a native PHP function since version 7.3.0; use word_is_countable() instead', E_USER_WARNING);\n\t\treturn word_is_countable($word);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/language_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Language Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/language_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('lang'))\n{\n\t/**\n\t * Lang\n\t *\n\t * Fetches a language variable and optionally outputs a form label\n\t *\n\t * @param\tstring\t$line\t\tThe language line\n\t * @param\tstring\t$for\t\tThe \"for\" value (id of the form element)\n\t * @param\tarray\t$attributes\tAny additional HTML attributes\n\t * @return\tstring\n\t */\n\tfunction lang($line, $for = '', $attributes = array())\n\t{\n\t\t$line = get_instance()->lang->line($line);\n\n\t\tif ($for !== '')\n\t\t{\n\t\t\t$line = '<label for=\"'.$for.'\"'._stringify_attributes($attributes).'>'.$line.'</label>';\n\t\t}\n\n\t\treturn $line;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/number_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Number Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/number_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('byte_format'))\n{\n\t/**\n\t * Formats a numbers as bytes, based on size, and adds the appropriate suffix\n\t *\n\t * @param\tmixed\twill be cast as int\n\t * @param\tint\n\t * @return\tstring\n\t */\n\tfunction byte_format($num, $precision = 1)\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->lang->load('number');\n\n\t\tif ($num >= 1000000000000)\n\t\t{\n\t\t\t$num = round($num / 1099511627776, $precision);\n\t\t\t$unit = $CI->lang->line('terabyte_abbr');\n\t\t}\n\t\telseif ($num >= 1000000000)\n\t\t{\n\t\t\t$num = round($num / 1073741824, $precision);\n\t\t\t$unit = $CI->lang->line('gigabyte_abbr');\n\t\t}\n\t\telseif ($num >= 1000000)\n\t\t{\n\t\t\t$num = round($num / 1048576, $precision);\n\t\t\t$unit = $CI->lang->line('megabyte_abbr');\n\t\t}\n\t\telseif ($num >= 1000)\n\t\t{\n\t\t\t$num = round($num / 1024, $precision);\n\t\t\t$unit = $CI->lang->line('kilobyte_abbr');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$unit = $CI->lang->line('bytes');\n\t\t\treturn number_format($num).' '.$unit;\n\t\t}\n\n\t\treturn number_format($num, $precision).' '.$unit;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/path_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Path Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/path_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('set_realpath'))\n{\n\t/**\n\t * Set Realpath\n\t *\n\t * @param\tstring\n\t * @param\tbool\tchecks to see if the path exists\n\t * @return\tstring\n\t */\n\tfunction set_realpath($path, $check_existance = FALSE)\n\t{\n\t\t// Security check to make sure the path is NOT a URL. No remote file inclusion!\n\t\tif (preg_match('#^(http:\\/\\/|https:\\/\\/|www\\.|ftp|php:\\/\\/)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path)\n\t\t{\n\t\t\tshow_error('The path you submitted must be a local server path, not a URL');\n\t\t}\n\n\t\t// Resolve the path\n\t\tif (realpath($path) !== FALSE)\n\t\t{\n\t\t\t$path = realpath($path);\n\t\t}\n\t\telseif ($check_existance && ! is_dir($path) && ! is_file($path))\n\t\t{\n\t\t\tshow_error('Not a valid path: '.$path);\n\t\t}\n\n\t\t// Add a trailing slash, if this is a directory\n\t\treturn is_dir($path) ? rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR : $path;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/security_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Security Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/security_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('xss_clean'))\n{\n\t/**\n\t * XSS Filtering\n\t *\n\t * @param\tstring\n\t * @param\tbool\twhether or not the content is an image file\n\t * @return\tstring\n\t */\n\tfunction xss_clean($str, $is_image = FALSE)\n\t{\n\t\treturn get_instance()->security->xss_clean($str, $is_image);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('sanitize_filename'))\n{\n\t/**\n\t * Sanitize Filename\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction sanitize_filename($filename)\n\t{\n\t\treturn get_instance()->security->sanitize_filename($filename);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('do_hash'))\n{\n\t/**\n\t * Hash encode a string\n\t *\n\t * @todo\tRemove in version 3.1+.\n\t * @deprecated\t3.0.0\tUse PHP's native hash() instead.\n\t * @param\tstring\t$str\n\t * @param\tstring\t$type = 'sha1'\n\t * @return\tstring\n\t */\n\tfunction do_hash($str, $type = 'sha1')\n\t{\n\t\tif ( ! in_array(strtolower($type), hash_algos()))\n\t\t{\n\t\t\t$type = 'md5';\n\t\t}\n\n\t\treturn hash($type, $str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('strip_image_tags'))\n{\n\t/**\n\t * Strip Image Tags\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction strip_image_tags($str)\n\t{\n\t\treturn get_instance()->security->strip_image_tags($str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('encode_php_tags'))\n{\n\t/**\n\t * Convert PHP tags to entities\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction encode_php_tags($str)\n\t{\n\t\treturn str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $str);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/smiley_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Smiley Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/smiley_helper.html\n * @deprecated\t3.0.0\tThis helper is too specific for CI.\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('smiley_js'))\n{\n\t/**\n\t * Smiley Javascript\n\t *\n\t * Returns the javascript required for the smiley insertion.  Optionally takes\n\t * an array of aliases to loosely couple the smiley array to the view.\n\t *\n\t * @param\tmixed\talias name or array of alias->field_id pairs\n\t * @param\tstring\tfield_id if alias name was passed in\n\t * @param\tbool\n\t * @return\tarray\n\t */\n\tfunction smiley_js($alias = '', $field_id = '', $inline = TRUE)\n\t{\n\t\tstatic $do_setup = TRUE;\n\t\t$r = '';\n\n\t\tif ($alias !== '' && ! is_array($alias))\n\t\t{\n\t\t\t$alias = array($alias => $field_id);\n\t\t}\n\n\t\tif ($do_setup === TRUE)\n\t\t{\n\t\t\t$do_setup = FALSE;\n\t\t\t$m = array();\n\n\t\t\tif (is_array($alias))\n\t\t\t{\n\t\t\t\tforeach ($alias as $name => $id)\n\t\t\t\t{\n\t\t\t\t\t$m[] = '\"'.$name.'\" : \"'.$id.'\"';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$m = '{'.implode(',', $m).'}';\n\n\t\t\t$r .= <<<EOF\n\t\t\tvar smiley_map = {$m};\n\n\t\t\tfunction insert_smiley(smiley, field_id) {\n\t\t\t\tvar el = document.getElementById(field_id), newStart;\n\n\t\t\t\tif ( ! el && smiley_map[field_id]) {\n\t\t\t\t\tel = document.getElementById(smiley_map[field_id]);\n\n\t\t\t\t\tif ( ! el)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tel.focus();\n\t\t\t\tsmiley = \" \" + smiley;\n\n\t\t\t\tif ('selectionStart' in el) {\n\t\t\t\t\tnewStart = el.selectionStart + smiley.length;\n\n\t\t\t\t\tel.value = el.value.substr(0, el.selectionStart) +\n\t\t\t\t\t\t\t\t\tsmiley +\n\t\t\t\t\t\t\t\t\tel.value.substr(el.selectionEnd, el.value.length);\n\t\t\t\t\tel.setSelectionRange(newStart, newStart);\n\t\t\t\t}\n\t\t\t\telse if (document.selection) {\n\t\t\t\t\tdocument.selection.createRange().text = smiley;\n\t\t\t\t}\n\t\t\t}\nEOF;\n\t\t}\n\t\telseif (is_array($alias))\n\t\t{\n\t\t\tforeach ($alias as $name => $id)\n\t\t\t{\n\t\t\t\t$r .= 'smiley_map[\"'.$name.'\"] = \"'.$id.\"\\\";\\n\";\n\t\t\t}\n\t\t}\n\n\t\treturn ($inline)\n\t\t\t? '<script type=\"text/javascript\" charset=\"utf-8\">/*<![CDATA[ */'.$r.'// ]]></script>'\n\t\t\t: $r;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('get_clickable_smileys'))\n{\n\t/**\n\t * Get Clickable Smileys\n\t *\n\t * Returns an array of image tag links that can be clicked to be inserted\n\t * into a form field.\n\t *\n\t * @param\tstring\tthe URL to the folder containing the smiley images\n\t * @param\tarray\n\t * @return\tarray\n\t */\n\tfunction get_clickable_smileys($image_url, $alias = '')\n\t{\n\t\t// For backward compatibility with js_insert_smiley\n\t\tif (is_array($alias))\n\t\t{\n\t\t\t$smileys = $alias;\n\t\t}\n\t\telseif (FALSE === ($smileys = _get_smiley_array()))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Add a trailing slash to the file path if needed\n\t\t$image_url = rtrim($image_url, '/').'/';\n\n\t\t$used = array();\n\t\tforeach ($smileys as $key => $val)\n\t\t{\n\t\t\t// Keep duplicates from being used, which can happen if the\n\t\t\t// mapping array contains multiple identical replacements. For example:\n\t\t\t// :-) and :) might be replaced with the same image so both smileys\n\t\t\t// will be in the array.\n\t\t\tif (isset($used[$smileys[$key][0]]))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$link[] = '<a href=\"javascript:void(0);\" onclick=\"insert_smiley(\\''.$key.'\\', \\''.$alias.'\\')\"><img src=\"'.$image_url.$smileys[$key][0].'\" alt=\"'.$smileys[$key][3].'\" style=\"width: '.$smileys[$key][1].'; height: '.$smileys[$key][2].'; border: 0;\" /></a>';\n\t\t\t$used[$smileys[$key][0]] = TRUE;\n\t\t}\n\n\t\treturn $link;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('parse_smileys'))\n{\n\t/**\n\t * Parse Smileys\n\t *\n\t * Takes a string as input and swaps any contained smileys for the actual image\n\t *\n\t * @param\tstring\tthe text to be parsed\n\t * @param\tstring\tthe URL to the folder containing the smiley images\n\t * @param\tarray\n\t * @return\tstring\n\t */\n\tfunction parse_smileys($str = '', $image_url = '', $smileys = NULL)\n\t{\n\t\tif ($image_url === '' OR ( ! is_array($smileys) && FALSE === ($smileys = _get_smiley_array())))\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t// Add a trailing slash to the file path if needed\n\t\t$image_url = rtrim($image_url, '/').'/';\n\n\t\tforeach ($smileys as $key => $val)\n\t\t{\n\t\t\t$str = str_replace($key, '<img src=\"'.$image_url.$smileys[$key][0].'\" alt=\"'.$smileys[$key][3].'\" style=\"width: '.$smileys[$key][1].'; height: '.$smileys[$key][2].'; border: 0;\" />', $str);\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('_get_smiley_array'))\n{\n\t/**\n\t * Get Smiley Array\n\t *\n\t * Fetches the config/smiley.php file\n\t *\n\t * @return\tmixed\n\t */\n\tfunction _get_smiley_array()\n\t{\n\t\tstatic $_smileys;\n\n\t\tif ( ! is_array($_smileys))\n\t\t{\n\t\t\tif (file_exists(APPPATH.'config/smileys.php'))\n\t\t\t{\n\t\t\t\tinclude(APPPATH.'config/smileys.php');\n\t\t\t}\n\n\t\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'))\n\t\t\t{\n\t\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/smileys.php');\n\t\t\t}\n\n\t\t\tif (empty($smileys) OR ! is_array($smileys))\n\t\t\t{\n\t\t\t\t$_smileys = array();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$_smileys = $smileys;\n\t\t}\n\n\t\treturn $_smileys;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/string_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter String Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/string_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('trim_slashes'))\n{\n\t/**\n\t * Trim Slashes\n\t *\n\t * Removes any leading/trailing slashes from a string:\n\t *\n\t * /this/that/theother/\n\t *\n\t * becomes:\n\t *\n\t * this/that/theother\n\t *\n\t * @todo\tRemove in version 3.1+.\n\t * @deprecated\t3.0.0\tThis is just an alias for PHP's native trim()\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction trim_slashes($str)\n\t{\n\t\treturn trim($str, '/');\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('strip_slashes'))\n{\n\t/**\n\t * Strip Slashes\n\t *\n\t * Removes slashes contained in a string or in an array\n\t *\n\t * @param\tmixed\tstring or array\n\t * @return\tmixed\tstring or array\n\t */\n\tfunction strip_slashes($str)\n\t{\n\t\tif ( ! is_array($str))\n\t\t{\n\t\t\treturn stripslashes($str);\n\t\t}\n\n\t\tforeach ($str as $key => $val)\n\t\t{\n\t\t\t$str[$key] = strip_slashes($val);\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('strip_quotes'))\n{\n\t/**\n\t * Strip Quotes\n\t *\n\t * Removes single and double quotes from a string\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction strip_quotes($str)\n\t{\n\t\treturn str_replace(array('\"', \"'\"), '', $str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('quotes_to_entities'))\n{\n\t/**\n\t * Quotes to Entities\n\t *\n\t * Converts single and double quotes to entities\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction quotes_to_entities($str)\n\t{\n\t\treturn str_replace(array(\"\\'\",\"\\\"\",\"'\",'\"'), array(\"&#39;\",\"&quot;\",\"&#39;\",\"&quot;\"), $str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('reduce_double_slashes'))\n{\n\t/**\n\t * Reduce Double Slashes\n\t *\n\t * Converts double slashes in a string to a single slash,\n\t * except those found in http://\n\t *\n\t * http://www.some-site.com//index.php\n\t *\n\t * becomes:\n\t *\n\t * http://www.some-site.com/index.php\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction reduce_double_slashes($str)\n\t{\n\t\treturn preg_replace('#(^|[^:])//+#', '\\\\1/', $str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('reduce_multiples'))\n{\n\t/**\n\t * Reduce Multiples\n\t *\n\t * Reduces multiple instances of a particular character.  Example:\n\t *\n\t * Fred, Bill,, Joe, Jimmy\n\t *\n\t * becomes:\n\t *\n\t * Fred, Bill, Joe, Jimmy\n\t *\n\t * @param\tstring\n\t * @param\tstring\tthe character you wish to reduce\n\t * @param\tbool\tTRUE/FALSE - whether to trim the character from the beginning/end\n\t * @return\tstring\n\t */\n\tfunction reduce_multiples($str, $character = ',', $trim = FALSE)\n\t{\n\t\t$str = preg_replace('#'.preg_quote($character, '#').'{2,}#', $character, $str);\n\t\treturn ($trim === TRUE) ? trim($str, $character) : $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('random_string'))\n{\n\t/**\n\t * Create a \"Random\" String\n\t *\n\t * @param\tstring\ttype of random string.  basic, alpha, alnum, numeric, nozero, unique, md5, encrypt and sha1\n\t * @param\tint\tnumber of characters\n\t * @return\tstring\n\t */\n\tfunction random_string($type = 'alnum', $len = 8)\n\t{\n\t\tswitch ($type)\n\t\t{\n\t\t\tcase 'basic':\n\t\t\t\treturn mt_rand();\n\t\t\tcase 'alnum':\n\t\t\tcase 'numeric':\n\t\t\tcase 'nozero':\n\t\t\tcase 'alpha':\n\t\t\t\tswitch ($type)\n\t\t\t\t{\n\t\t\t\t\tcase 'alpha':\n\t\t\t\t\t\t$pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'alnum':\n\t\t\t\t\t\t$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'numeric':\n\t\t\t\t\t\t$pool = '0123456789';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'nozero':\n\t\t\t\t\t\t$pool = '123456789';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn substr(str_shuffle(str_repeat($pool, ceil($len / strlen($pool)))), 0, $len);\n\t\t\tcase 'unique': // todo: remove in 3.1+\n\t\t\tcase 'md5':\n\t\t\t\treturn md5(uniqid(mt_rand()));\n\t\t\tcase 'encrypt': // todo: remove in 3.1+\n\t\t\tcase 'sha1':\n\t\t\t\treturn sha1(uniqid(mt_rand(), TRUE));\n\t\t}\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('increment_string'))\n{\n\t/**\n\t * Add's _1 to a string or increment the ending number to allow _2, _3, etc\n\t *\n\t * @param\tstring\trequired\n\t * @param\tstring\tWhat should the duplicate number be appended with\n\t * @param\tstring\tWhich number should be used for the first dupe increment\n\t * @return\tstring\n\t */\n\tfunction increment_string($str, $separator = '_', $first = 1)\n\t{\n\t\tpreg_match('/(.+)'.preg_quote($separator, '/').'([0-9]+)$/', $str, $match);\n\t\treturn isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $str.$separator.$first;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('alternator'))\n{\n\t/**\n\t * Alternator\n\t *\n\t * Allows strings to be alternated. See docs...\n\t *\n\t * @param\tstring (as many parameters as needed)\n\t * @return\tstring\n\t */\n\tfunction alternator()\n\t{\n\t\tstatic $i;\n\n\t\tif (func_num_args() === 0)\n\t\t{\n\t\t\t$i = 0;\n\t\t\treturn '';\n\t\t}\n\n\t\t$args = func_get_args();\n\t\treturn $args[($i++ % count($args))];\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('repeater'))\n{\n\t/**\n\t * Repeater function\n\t *\n\t * @todo\tRemove in version 3.1+.\n\t * @deprecated\t3.0.0\tThis is just an alias for PHP's native str_repeat()\n\t *\n\t * @param\tstring\t$data\tString to repeat\n\t * @param\tint\t$num\tNumber of repeats\n\t * @return\tstring\n\t */\n\tfunction repeater($data, $num = 1)\n\t{\n\t\treturn ($num > 0) ? str_repeat($data, $num) : '';\n\t}\n}\n"
  },
  {
    "path": "system/helpers/text_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Text Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/text_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('word_limiter'))\n{\n\t/**\n\t * Word Limiter\n\t *\n\t * Limits a string to X number of words.\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @param\tstring\tthe end character. Usually an ellipsis\n\t * @return\tstring\n\t */\n\tfunction word_limiter($str, $limit = 100, $end_char = '&#8230;')\n\t{\n\t\tif (trim($str) === '')\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\tpreg_match('/^\\s*+(?:\\S++\\s*+){1,'.(int) $limit.'}/', $str, $matches);\n\n\t\tif (strlen($str) === strlen($matches[0]))\n\t\t{\n\t\t\t$end_char = '';\n\t\t}\n\n\t\treturn rtrim($matches[0]).$end_char;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('character_limiter'))\n{\n\t/**\n\t * Character Limiter\n\t *\n\t * Limits the string based on the character count.  Preserves complete words\n\t * so the character count may not be exactly as specified.\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @param\tstring\tthe end character. Usually an ellipsis\n\t * @return\tstring\n\t */\n\tfunction character_limiter($str, $n = 500, $end_char = '&#8230;')\n\t{\n\t\tif (mb_strlen($str) < $n)\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t// a bit complicated, but faster than preg_replace with \\s+\n\t\t$str = preg_replace('/ {2,}/', ' ', str_replace(array(\"\\r\", \"\\n\", \"\\t\", \"\\v\", \"\\f\"), ' ', $str));\n\n\t\tif (mb_strlen($str) <= $n)\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t$out = '';\n\t\tforeach (explode(' ', trim($str)) as $val)\n\t\t{\n\t\t\t$out .= $val.' ';\n\n\t\t\tif (mb_strlen($out) >= $n)\n\t\t\t{\n\t\t\t\t$out = trim($out);\n\t\t\t\treturn (mb_strlen($out) === mb_strlen($str)) ? $out : $out.$end_char;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('ascii_to_entities'))\n{\n\t/**\n\t * High ASCII to Entities\n\t *\n\t * Converts high ASCII text and MS Word special characters to character entities\n\t *\n\t * @param\tstring\t$str\n\t * @return\tstring\n\t */\n\tfunction ascii_to_entities($str)\n\t{\n\t\t$out = '';\n\t\t$length = defined('MB_OVERLOAD_STRING')\n\t\t\t? mb_strlen($str, '8bit') - 1\n\t\t\t: strlen($str) - 1;\n\t\tfor ($i = 0, $count = 1, $temp = array(); $i <= $length; $i++)\n\t\t{\n\t\t\t$ordinal = ord($str[$i]);\n\n\t\t\tif ($ordinal < 128)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t\tIf the $temp array has a value but we have moved on, then it seems only\n\t\t\t\t\tfair that we output that entity and restart $temp before continuing. -Paul\n\t\t\t\t*/\n\t\t\t\tif (count($temp) === 1)\n\t\t\t\t{\n\t\t\t\t\t$out .= '&#'.array_shift($temp).';';\n\t\t\t\t\t$count = 1;\n\t\t\t\t}\n\n\t\t\t\t$out .= $str[$i];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (count($temp) === 0)\n\t\t\t\t{\n\t\t\t\t\t$count = ($ordinal < 224) ? 2 : 3;\n\t\t\t\t}\n\n\t\t\t\t$temp[] = $ordinal;\n\n\t\t\t\tif (count($temp) === $count)\n\t\t\t\t{\n\t\t\t\t\t$number = ($count === 3)\n\t\t\t\t\t\t? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64)\n\t\t\t\t\t\t: (($temp[0] % 32) * 64) + ($temp[1] % 64);\n\n\t\t\t\t\t$out .= '&#'.$number.';';\n\t\t\t\t\t$count = 1;\n\t\t\t\t\t$temp = array();\n\t\t\t\t}\n\t\t\t\t// If this is the last iteration, just output whatever we have\n\t\t\t\telseif ($i === $length)\n\t\t\t\t{\n\t\t\t\t\t$out .= '&#'.implode(';', $temp).';';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $out;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('entities_to_ascii'))\n{\n\t/**\n\t * Entities to ASCII\n\t *\n\t * Converts character entities back to ASCII\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tfunction entities_to_ascii($str, $all = TRUE)\n\t{\n\t\tif (preg_match_all('/\\&#(\\d+)\\;/', $str, $matches))\n\t\t{\n\t\t\tfor ($i = 0, $s = count($matches[0]); $i < $s; $i++)\n\t\t\t{\n\t\t\t\t$digits = $matches[1][$i];\n\t\t\t\t$out = '';\n\n\t\t\t\tif ($digits < 128)\n\t\t\t\t{\n\t\t\t\t\t$out .= chr($digits);\n\n\t\t\t\t}\n\t\t\t\telseif ($digits < 2048)\n\t\t\t\t{\n\t\t\t\t\t$out .= chr(192 + (($digits - ($digits % 64)) / 64)).chr(128 + ($digits % 64));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$out .= chr(224 + (($digits - ($digits % 4096)) / 4096))\n\t\t\t\t\t\t.chr(128 + ((($digits % 4096) - ($digits % 64)) / 64))\n\t\t\t\t\t\t.chr(128 + ($digits % 64));\n\t\t\t\t}\n\n\t\t\t\t$str = str_replace($matches[0][$i], $out, $str);\n\t\t\t}\n\t\t}\n\n\t\tif ($all)\n\t\t{\n\t\t\treturn str_replace(\n\t\t\t\tarray('&amp;', '&lt;', '&gt;', '&quot;', '&apos;', '&#45;'),\n\t\t\t\tarray('&', '<', '>', '\"', \"'\", '-'),\n\t\t\t\t$str\n\t\t\t);\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('word_censor'))\n{\n\t/**\n\t * Word Censoring Function\n\t *\n\t * Supply a string and an array of disallowed words and any\n\t * matched words will be converted to #### or to the replacement\n\t * word you've submitted.\n\t *\n\t * @param\tstring\tthe text string\n\t * @param\tstring\tthe array of censored words\n\t * @param\tstring\tthe optional replacement value\n\t * @return\tstring\n\t */\n\tfunction word_censor($str, $censored, $replacement = '')\n\t{\n\t\tif ( ! is_array($censored))\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t$str = ' '.$str.' ';\n\n\t\t// \\w, \\b and a few others do not match on a unicode character\n\t\t// set for performance reasons. As a result words like über\n\t\t// will not match on a word boundary. Instead, we'll assume that\n\t\t// a bad word will be bookeneded by any of these characters.\n\t\t$delim = '[-_\\'\\\"`(){}<>\\[\\]|!?@#%&,.:;^~*+=\\/ 0-9\\n\\r\\t]';\n\n\t\tforeach ($censored as $badword)\n\t\t{\n\t\t\t$badword = str_replace('\\*', '\\w*?', preg_quote($badword, '/'));\n\t\t\tif ($replacement !== '')\n\t\t\t{\n\t\t\t\t$str = preg_replace(\n\t\t\t\t\t\"/({$delim})(\".$badword.\")({$delim})/i\",\n\t\t\t\t\t\"\\\\1{$replacement}\\\\3\",\n\t\t\t\t\t$str\n\t\t\t\t);\n\t\t\t}\n\t\t\telseif (preg_match_all(\"/{$delim}(\".$badword.\"){$delim}/i\", $str, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE))\n\t\t\t{\n\t\t\t\t$matches = $matches[1];\n\t\t\t\tfor ($i = count($matches) - 1; $i >= 0; $i--)\n\t\t\t\t{\n\t\t\t\t\t$length = strlen($matches[$i][0]);\n\t\t\t\t\t$str = substr_replace(\n\t\t\t\t\t\t$str,\n\t\t\t\t\t\tstr_repeat('#', $length),\n\t\t\t\t\t\t$matches[$i][1],\n\t\t\t\t\t\t$length\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn trim($str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('highlight_code'))\n{\n\t/**\n\t * Code Highlighter\n\t *\n\t * Colorizes code strings\n\t *\n\t * @param\tstring\tthe text string\n\t * @return\tstring\n\t */\n\tfunction highlight_code($str)\n\t{\n\t\t/* The highlight string function encodes and highlights\n\t\t * brackets so we need them to start raw.\n\t\t *\n\t\t * Also replace any existing PHP tags to temporary markers\n\t\t * so they don't accidentally break the string out of PHP,\n\t\t * and thus, thwart the highlighting.\n\t\t */\n\t\t$str = str_replace(\n\t\t\tarray('&lt;', '&gt;', '<?', '?>', '<%', '%>', '\\\\', '</script>'),\n\t\t\tarray('<', '>', 'phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'),\n\t\t\t$str\n\t\t);\n\n\t\t// The highlight_string function requires that the text be surrounded\n\t\t// by PHP tags, which we will remove later\n\t\t$str = highlight_string('<?php '.$str.' ?>', TRUE);\n\n\t\t// Remove our artificially added PHP, and the syntax highlighting that came with it\n\t\t$str = preg_replace(\n\t\t\tarray(\n\t\t\t\t'/<span style=\"color: #([A-Z0-9]+)\">&lt;\\?php(&nbsp;| )/i',\n\t\t\t\t'/(<span style=\"color: #[A-Z0-9]+\">.*?)\\?&gt;<\\/span>\\n<\\/span>\\n<\\/code>/is',\n\t\t\t\t'/<span style=\"color: #[A-Z0-9]+\"\\><\\/span>/i'\n\t\t\t),\n\t\t\tarray(\n\t\t\t\t'<span style=\"color: #$1\">',\n\t\t\t\t\"$1</span>\\n</span>\\n</code>\",\n\t\t\t\t''\n\t\t\t),\n\t\t\t$str\n\t\t);\n\n\t\t// Replace our markers back to PHP tags.\n\t\treturn str_replace(\n\t\t\tarray('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'),\n\t\t\tarray('&lt;?', '?&gt;', '&lt;%', '%&gt;', '\\\\', '&lt;/script&gt;'),\n\t\t\t$str\n\t\t);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('highlight_phrase'))\n{\n\t/**\n\t * Phrase Highlighter\n\t *\n\t * Highlights a phrase within a text string\n\t *\n\t * @param\tstring\t$str\t\tthe text string\n\t * @param\tstring\t$phrase\t\tthe phrase you'd like to highlight\n\t * @param\tstring\t$tag_open\tthe openging tag to precede the phrase with\n\t * @param\tstring\t$tag_close\tthe closing tag to end the phrase with\n\t * @return\tstring\n\t */\n\tfunction highlight_phrase($str, $phrase, $tag_open = '<mark>', $tag_close = '</mark>')\n\t{\n\t\treturn ($str !== '' && $phrase !== '')\n\t\t\t? preg_replace('/('.preg_quote($phrase, '/').')/i'.(UTF8_ENABLED ? 'u' : ''), $tag_open.'\\\\1'.$tag_close, $str)\n\t\t\t: $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('convert_accented_characters'))\n{\n\t/**\n\t * Convert Accented Foreign Characters to ASCII\n\t *\n\t * @param\tstring\t$str\tInput string\n\t * @return\tstring\n\t */\n\tfunction convert_accented_characters($str)\n\t{\n\t\tstatic $array_from, $array_to;\n\n\t\tif ( ! is_array($array_from))\n\t\t{\n\t\t\tif (file_exists(APPPATH.'config/foreign_chars.php'))\n\t\t\t{\n\t\t\t\tinclude(APPPATH.'config/foreign_chars.php');\n\t\t\t}\n\n\t\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'))\n\t\t\t{\n\t\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php');\n\t\t\t}\n\n\t\t\tif (empty($foreign_characters) OR ! is_array($foreign_characters))\n\t\t\t{\n\t\t\t\t$array_from = array();\n\t\t\t\t$array_to = array();\n\n\t\t\t\treturn $str;\n\t\t\t}\n\n\t\t\t$array_from = array_keys($foreign_characters);\n\t\t\t$array_to = array_values($foreign_characters);\n\t\t}\n\n\t\treturn preg_replace($array_from, $array_to, $str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('word_wrap'))\n{\n\t/**\n\t * Word Wrap\n\t *\n\t * Wraps text at the specified character. Maintains the integrity of words.\n\t * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor\n\t * will URLs.\n\t *\n\t * @param\tstring\t$str\t\tthe text string\n\t * @param\tint\t$charlim = 76\tthe number of characters to wrap at\n\t * @return\tstring\n\t */\n\tfunction word_wrap($str, $charlim = 76)\n\t{\n\t\t// Set the character limit\n\t\tis_numeric($charlim) OR $charlim = 76;\n\n\t\t// Reduce multiple spaces\n\t\t$str = preg_replace('| +|', ' ', $str);\n\n\t\t// Standardize newlines\n\t\tif (strpos($str, \"\\r\") !== FALSE)\n\t\t{\n\t\t\t$str = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n\t\t}\n\n\t\t// If the current word is surrounded by {unwrap} tags we'll\n\t\t// strip the entire chunk and replace it with a marker.\n\t\t$unwrap = array();\n\t\tif (preg_match_all('|\\{unwrap\\}(.+?)\\{/unwrap\\}|s', $str, $matches))\n\t\t{\n\t\t\tfor ($i = 0, $c = count($matches[0]); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$unwrap[] = $matches[1][$i];\n\t\t\t\t$str = str_replace($matches[0][$i], '{{unwrapped'.$i.'}}', $str);\n\t\t\t}\n\t\t}\n\n\t\t// Use PHP's native function to do the initial wordwrap.\n\t\t// We set the cut flag to FALSE so that any individual words that are\n\t\t// too long get left alone. In the next step we'll deal with them.\n\t\t$str = wordwrap($str, $charlim, \"\\n\", FALSE);\n\n\t\t// Split the string into individual lines of text and cycle through them\n\t\t$output = '';\n\t\tforeach (explode(\"\\n\", $str) as $line)\n\t\t{\n\t\t\t// Is the line within the allowed character count?\n\t\t\t// If so we'll join it to the output and continue\n\t\t\tif (mb_strlen($line) <= $charlim)\n\t\t\t{\n\t\t\t\t$output .= $line.\"\\n\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$temp = '';\n\t\t\twhile (mb_strlen($line) > $charlim)\n\t\t\t{\n\t\t\t\t// If the over-length word is a URL we won't wrap it\n\t\t\t\tif (preg_match('!\\[url.+\\]|://|www\\.!', $line))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Trim the word down\n\t\t\t\t$temp .= mb_substr($line, 0, $charlim - 1);\n\t\t\t\t$line = mb_substr($line, $charlim - 1);\n\t\t\t}\n\n\t\t\t// If $temp contains data it means we had to split up an over-length\n\t\t\t// word into smaller chunks so we'll add it back to our current line\n\t\t\tif ($temp !== '')\n\t\t\t{\n\t\t\t\t$output .= $temp.\"\\n\".$line.\"\\n\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$output .= $line.\"\\n\";\n\t\t\t}\n\t\t}\n\n\t\t// Put our markers back\n\t\tif (count($unwrap) > 0)\n\t\t{\n\t\t\tforeach ($unwrap as $key => $val)\n\t\t\t{\n\t\t\t\t$output = str_replace('{{unwrapped'.$key.'}}', $val, $output);\n\t\t\t}\n\t\t}\n\n\t\treturn $output;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('ellipsize'))\n{\n\t/**\n\t * Ellipsize String\n\t *\n\t * This function will strip tags from a string, split it at its max_length and ellipsize\n\t *\n\t * @param\tstring\tstring to ellipsize\n\t * @param\tint\tmax length of string\n\t * @param\tmixed\tint (1|0) or float, .5, .2, etc for position to split\n\t * @param\tstring\tellipsis ; Default '...'\n\t * @return\tstring\tellipsized string\n\t */\n\tfunction ellipsize($str, $max_length, $position = 1, $ellipsis = '&hellip;')\n\t{\n\t\t// Strip tags\n\t\t$str = trim(strip_tags($str));\n\n\t\t// Is the string long enough to ellipsize?\n\t\tif (mb_strlen($str) <= $max_length)\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t$beg = mb_substr($str, 0, floor($max_length * $position));\n\t\t$position = ($position > 1) ? 1 : $position;\n\n\t\tif ($position === 1)\n\t\t{\n\t\t\t$end = mb_substr($str, 0, -($max_length - mb_strlen($beg)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$end = mb_substr($str, -($max_length - mb_strlen($beg)));\n\t\t}\n\n\t\treturn $beg.$ellipsis.$end;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/typography_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Typography Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/typography_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('nl2br_except_pre'))\n{\n\t/**\n\t * Convert newlines to HTML line breaks except within PRE tags\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction nl2br_except_pre($str)\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->load->library('typography');\n\t\treturn $CI->typography->nl2br_except_pre($str);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('auto_typography'))\n{\n\t/**\n\t * Auto Typography Wrapper Function\n\t *\n\t * @param\tstring\t$str\n\t * @param\tbool\t$reduce_linebreaks = FALSE\twhether to reduce multiple instances of double newlines to two\n\t * @return\tstring\n\t */\n\tfunction auto_typography($str, $reduce_linebreaks = FALSE)\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->load->library('typography');\n\t\treturn $CI->typography->auto_typography($str, $reduce_linebreaks);\n\t}\n}\n\n// --------------------------------------------------------------------\n\nif ( ! function_exists('entity_decode'))\n{\n\t/**\n\t * HTML Entities Decode\n\t *\n\t * This function is a replacement for html_entity_decode()\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tfunction entity_decode($str, $charset = NULL)\n\t{\n\t\treturn get_instance()->security->entity_decode($str, $charset);\n\t}\n}\n"
  },
  {
    "path": "system/helpers/url_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter URL Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/url_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('site_url'))\n{\n\t/**\n\t * Site URL\n\t *\n\t * Create a local URL based on your basepath. Segments can be passed via the\n\t * first parameter either as a string or an array.\n\t *\n\t * @param\tstring\t$uri\n\t * @param\tstring\t$protocol\n\t * @return\tstring\n\t */\n\tfunction site_url($uri = '', $protocol = NULL)\n\t{\n\t\treturn get_instance()->config->site_url($uri, $protocol);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('base_url'))\n{\n\t/**\n\t * Base URL\n\t *\n\t * Create a local URL based on your basepath.\n\t * Segments can be passed in as a string or an array, same as site_url\n\t * or a URL to a file can be passed in, e.g. to an image file.\n\t *\n\t * @param\tstring\t$uri\n\t * @param\tstring\t$protocol\n\t * @return\tstring\n\t */\n\tfunction base_url($uri = '', $protocol = NULL)\n\t{\n\t\treturn get_instance()->config->base_url($uri, $protocol);\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('current_url'))\n{\n\t/**\n\t * Current URL\n\t *\n\t * Returns the full URL (including segments) of the page where this\n\t * function is placed\n\t *\n\t * @return\tstring\n\t */\n\tfunction current_url()\n\t{\n\t\t$CI =& get_instance();\n\t\treturn $CI->config->site_url($CI->uri->uri_string());\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('uri_string'))\n{\n\t/**\n\t * URL String\n\t *\n\t * Returns the URI segments.\n\t *\n\t * @return\tstring\n\t */\n\tfunction uri_string()\n\t{\n\t\treturn get_instance()->uri->uri_string();\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('index_page'))\n{\n\t/**\n\t * Index page\n\t *\n\t * Returns the \"index_page\" from your config file\n\t *\n\t * @return\tstring\n\t */\n\tfunction index_page()\n\t{\n\t\treturn get_instance()->config->item('index_page');\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('anchor'))\n{\n\t/**\n\t * Anchor Link\n\t *\n\t * Creates an anchor based on the local URL.\n\t *\n\t * @param\tstring\tthe URL\n\t * @param\tstring\tthe link title\n\t * @param\tmixed\tany attributes\n\t * @return\tstring\n\t */\n\tfunction anchor($uri = '', $title = '', $attributes = '')\n\t{\n\t\t$title = (string) $title;\n\n\t\t$site_url = is_array($uri)\n\t\t\t? site_url($uri)\n\t\t\t: (preg_match('#^(\\w+:)?//#i', $uri) ? $uri : site_url($uri));\n\n\t\tif ($title === '')\n\t\t{\n\t\t\t$title = $site_url;\n\t\t}\n\n\t\tif ($attributes !== '')\n\t\t{\n\t\t\t$attributes = _stringify_attributes($attributes);\n\t\t}\n\n\t\treturn '<a href=\"'.$site_url.'\"'.$attributes.'>'.$title.'</a>';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('anchor_popup'))\n{\n\t/**\n\t * Anchor Link - Pop-up version\n\t *\n\t * Creates an anchor based on the local URL. The link\n\t * opens a new window based on the attributes specified.\n\t *\n\t * @param\tstring\tthe URL\n\t * @param\tstring\tthe link title\n\t * @param\tmixed\tany attributes\n\t * @return\tstring\n\t */\n\tfunction anchor_popup($uri = '', $title = '', $attributes = FALSE)\n\t{\n\t\t$title = (string) $title;\n\t\t$site_url = preg_match('#^(\\w+:)?//#i', $uri) ? $uri : site_url($uri);\n\n\t\tif ($title === '')\n\t\t{\n\t\t\t$title = $site_url;\n\t\t}\n\n\t\tif ($attributes === FALSE)\n\t\t{\n\t\t\treturn '<a href=\"'.$site_url.'\" onclick=\"window.open(\\''.$site_url.\"', '_blank'); return false;\\\">\".$title.'</a>';\n\t\t}\n\n\t\tif ( ! is_array($attributes))\n\t\t{\n\t\t\t$attributes = array($attributes);\n\n\t\t\t// Ref: http://www.w3schools.com/jsref/met_win_open.asp\n\t\t\t$window_name = '_blank';\n\t\t}\n\t\telseif ( ! empty($attributes['window_name']))\n\t\t{\n\t\t\t$window_name = $attributes['window_name'];\n\t\t\tunset($attributes['window_name']);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$window_name = '_blank';\n\t\t}\n\n\t\tforeach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'menubar' => 'no', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0') as $key => $val)\n\t\t{\n\t\t\t$atts[$key] = isset($attributes[$key]) ? $attributes[$key] : $val;\n\t\t\tunset($attributes[$key]);\n\t\t}\n\n\t\t$attributes = _stringify_attributes($attributes);\n\n\t\treturn '<a href=\"'.$site_url\n\t\t\t.'\" onclick=\"window.open(\\''.$site_url.\"', '\".$window_name.\"', '\"._stringify_attributes($atts, TRUE).\"'); return false;\\\"\"\n\t\t\t.$attributes.'>'.$title.'</a>';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('mailto'))\n{\n\t/**\n\t * Mailto Link\n\t *\n\t * @param\tstring\tthe email address\n\t * @param\tstring\tthe link title\n\t * @param\tmixed\tany attributes\n\t * @return\tstring\n\t */\n\tfunction mailto($email, $title = '', $attributes = '')\n\t{\n\t\t$title = (string) $title;\n\n\t\tif ($title === '')\n\t\t{\n\t\t\t$title = $email;\n\t\t}\n\n\t\treturn '<a href=\"mailto:'.$email.'\"'._stringify_attributes($attributes).'>'.$title.'</a>';\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('safe_mailto'))\n{\n\t/**\n\t * Encoded Mailto Link\n\t *\n\t * Create a spam-protected mailto link written in Javascript\n\t *\n\t * @param\tstring\tthe email address\n\t * @param\tstring\tthe link title\n\t * @param\tmixed\tany attributes\n\t * @return\tstring\n\t */\n\tfunction safe_mailto($email, $title = '', $attributes = '')\n\t{\n\t\t$title = (string) $title;\n\n\t\tif ($title === '')\n\t\t{\n\t\t\t$title = $email;\n\t\t}\n\n\t\t$x = str_split('<a href=\"mailto:', 1);\n\n\t\tfor ($i = 0, $l = strlen($email); $i < $l; $i++)\n\t\t{\n\t\t\t$x[] = '|'.ord($email[$i]);\n\t\t}\n\n\t\t$x[] = '\"';\n\n\t\tif ($attributes !== '')\n\t\t{\n\t\t\tif (is_array($attributes))\n\t\t\t{\n\t\t\t\tforeach ($attributes as $key => $val)\n\t\t\t\t{\n\t\t\t\t\t$x[] = ' '.$key.'=\"';\n\t\t\t\t\tfor ($i = 0, $l = strlen($val); $i < $l; $i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$x[] = '|'.ord($val[$i]);\n\t\t\t\t\t}\n\t\t\t\t\t$x[] = '\"';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor ($i = 0, $l = strlen($attributes); $i < $l; $i++)\n\t\t\t\t{\n\t\t\t\t\t$x[] = $attributes[$i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$x[] = '>';\n\n\t\t$temp = array();\n\t\tfor ($i = 0, $l = strlen($title); $i < $l; $i++)\n\t\t{\n\t\t\t$ordinal = ord($title[$i]);\n\n\t\t\tif ($ordinal < 128)\n\t\t\t{\n\t\t\t\t$x[] = '|'.$ordinal;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (count($temp) === 0)\n\t\t\t\t{\n\t\t\t\t\t$count = ($ordinal < 224) ? 2 : 3;\n\t\t\t\t}\n\n\t\t\t\t$temp[] = $ordinal;\n\t\t\t\tif (count($temp) === $count)\n\t\t\t\t{\n\t\t\t\t\t$number = ($count === 3)\n\t\t\t\t\t\t\t? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64)\n\t\t\t\t\t\t\t: (($temp[0] % 32) * 64) + ($temp[1] % 64);\n\t\t\t\t\t$x[] = '|'.$number;\n\t\t\t\t\t$count = 1;\n\t\t\t\t\t$temp = array();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>';\n\n\t\t$x = array_reverse($x);\n\n\t\t$output = \"<script type=\\\"text/javascript\\\">\\n\"\n\t\t\t.\"\\t//<![CDATA[\\n\"\n\t\t\t.\"\\tvar l=new Array();\\n\";\n\n\t\tfor ($i = 0, $c = count($x); $i < $c; $i++)\n\t\t{\n\t\t\t$output .= \"\\tl[\".$i.\"] = '\".$x[$i].\"';\\n\";\n\t\t}\n\n\t\t$output .= \"\\n\\tfor (var i = l.length-1; i >= 0; i=i-1) {\\n\"\n\t\t\t.\"\\t\\tif (l[i].substring(0, 1) === '|') document.write(\\\"&#\\\"+unescape(l[i].substring(1))+\\\";\\\");\\n\"\n\t\t\t.\"\\t\\telse document.write(unescape(l[i]));\\n\"\n\t\t\t.\"\\t}\\n\"\n\t\t\t.\"\\t//]]>\\n\"\n\t\t\t.'</script>';\n\n\t\treturn $output;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('auto_link'))\n{\n\t/**\n\t * Auto-linker\n\t *\n\t * Automatically links URL and Email addresses.\n\t * Note: There's a bit of extra code here to deal with\n\t * URLs or emails that end in a period. We'll strip these\n\t * off and add them after the link.\n\t *\n\t * @param\tstring\tthe string\n\t * @param\tstring\tthe type: email, url, or both\n\t * @param\tbool\twhether to create pop-up links\n\t * @return\tstring\n\t */\n\tfunction auto_link($str, $type = 'both', $popup = FALSE)\n\t{\n\t\t// Find and replace any URLs.\n\t\tif ($type !== 'email' && preg_match_all('#(\\w*://|www\\.)[a-z0-9]+(-+[a-z0-9]+)*(\\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\\s()<>;]+\\w)?/?)?#i', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER))\n\t\t{\n\t\t\t// Set our target HTML if using popup links.\n\t\t\t$target = ($popup) ? ' target=\"_blank\" rel=\"noopener\"' : '';\n\n\t\t\t// We process the links in reverse order (last -> first) so that\n\t\t\t// the returned string offsets from preg_match_all() are not\n\t\t\t// moved as we add more HTML.\n\t\t\tforeach (array_reverse($matches) as $match)\n\t\t\t{\n\t\t\t\t// $match[0] is the matched string/link\n\t\t\t\t// $match[1] is either a protocol prefix or 'www.'\n\t\t\t\t//\n\t\t\t\t// With PREG_OFFSET_CAPTURE, both of the above is an array,\n\t\t\t\t// where the actual value is held in [0] and its offset at the [1] index.\n\t\t\t\t$a = '<a href=\"'.(strpos($match[1][0], '/') ? '' : 'http://').$match[0][0].'\"'.$target.'>'.$match[0][0].'</a>';\n\t\t\t\t$str = substr_replace($str, $a, $match[0][1], strlen($match[0][0]));\n\t\t\t}\n\t\t}\n\n\t\t// Find and replace any emails.\n\t\tif ($type !== 'url' && preg_match_all('#([\\w\\.\\-\\+]+@[a-z0-9\\-]+\\.[a-z0-9\\-\\.]+[^[:punct:]\\s])#i', $str, $matches, PREG_OFFSET_CAPTURE))\n\t\t{\n\t\t\tforeach (array_reverse($matches[0]) as $match)\n\t\t\t{\n\t\t\t\tif (filter_var($match[0], FILTER_VALIDATE_EMAIL) !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t$str = substr_replace($str, safe_mailto($match[0]), $match[1], strlen($match[0]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('prep_url'))\n{\n\t/**\n\t * Prep URL\n\t *\n\t * Simply adds the http:// part if no scheme is included\n\t *\n\t * @param\tstring\tthe URL\n\t * @return\tstring\n\t */\n\tfunction prep_url($str = '')\n\t{\n\t\tif ($str === 'http://' OR $str === '')\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\t$url = parse_url($str);\n\n\t\tif ( ! $url OR ! isset($url['scheme']))\n\t\t{\n\t\t\treturn 'http://'.$str;\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('url_title'))\n{\n\t/**\n\t * Create URL Title\n\t *\n\t * Takes a \"title\" string as input and creates a\n\t * human-friendly URL string with a \"separator\" string\n\t * as the word separator.\n\t *\n\t * @todo\tRemove old 'dash' and 'underscore' usage in 3.1+.\n\t * @param\tstring\t$str\t\tInput string\n\t * @param\tstring\t$separator\tWord separator\n\t *\t\t\t(usually '-' or '_')\n\t * @param\tbool\t$lowercase\tWhether to transform the output string to lowercase\n\t * @return\tstring\n\t */\n\tfunction url_title($str, $separator = '-', $lowercase = FALSE)\n\t{\n\t\tif ($separator === 'dash')\n\t\t{\n\t\t\t$separator = '-';\n\t\t}\n\t\telseif ($separator === 'underscore')\n\t\t{\n\t\t\t$separator = '_';\n\t\t}\n\n\t\t$q_separator = preg_quote($separator, '#');\n\n\t\t$trans = array(\n\t\t\t'&.+?;'\t\t\t=> '',\n\t\t\t'[^\\w\\d _-]'\t\t=> '',\n\t\t\t'\\s+'\t\t\t=> $separator,\n\t\t\t'('.$q_separator.')+'\t=> $separator\n\t\t);\n\n\t\t$str = strip_tags($str);\n\t\tforeach ($trans as $key => $val)\n\t\t{\n\t\t\t$str = preg_replace('#'.$key.'#i'.(UTF8_ENABLED ? 'u' : ''), $val, $str);\n\t\t}\n\n\t\tif ($lowercase === TRUE)\n\t\t{\n\t\t\t$str = strtolower($str);\n\t\t}\n\n\t\treturn trim(trim($str, $separator));\n\t}\n}\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('redirect'))\n{\n\t/**\n\t * Header Redirect\n\t *\n\t * Header redirect in two flavors\n\t * For very fine grained control over headers, you could use the Output\n\t * Library's set_header() function.\n\t *\n\t * @param\tstring\t$uri\tURL\n\t * @param\tstring\t$method\tRedirect method\n\t *\t\t\t'auto', 'location' or 'refresh'\n\t * @param\tint\t$code\tHTTP Response status code\n\t * @return\tvoid\n\t */\n\tfunction redirect($uri = '', $method = 'auto', $code = NULL)\n\t{\n\t\tif ( ! preg_match('#^(\\w+:)?//#i', $uri))\n\t\t{\n\t\t\t$uri = site_url($uri);\n\t\t}\n\n\t\t// IIS environment likely? Use 'refresh' for better compatibility\n\t\tif ($method === 'auto' && isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== FALSE)\n\t\t{\n\t\t\t$method = 'refresh';\n\t\t}\n\t\telseif ($method !== 'refresh' && (empty($code) OR ! is_numeric($code)))\n\t\t{\n\t\t\tif (isset($_SERVER['SERVER_PROTOCOL'], $_SERVER['REQUEST_METHOD']) && $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.1')\n\t\t\t{\n\t\t\t\t$code = ($_SERVER['REQUEST_METHOD'] !== 'GET')\n\t\t\t\t\t? 303\t// reference: http://en.wikipedia.org/wiki/Post/Redirect/Get\n\t\t\t\t\t: 307;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$code = 302;\n\t\t\t}\n\t\t}\n\n\t\tswitch ($method)\n\t\t{\n\t\t\tcase 'refresh':\n\t\t\t\theader('Refresh:0;url='.$uri);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\theader('Location: '.$uri, TRUE, $code);\n\t\t\t\tbreak;\n\t\t}\n\t\texit;\n\t}\n}\n"
  },
  {
    "path": "system/helpers/xml_helper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter XML Helpers\n *\n * @package\t\tCodeIgniter\n * @subpackage\tHelpers\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/helpers/xml_helper.html\n */\n\n// ------------------------------------------------------------------------\n\nif ( ! function_exists('xml_convert'))\n{\n\t/**\n\t * Convert Reserved XML characters to Entities\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tfunction xml_convert($str, $protect_all = FALSE)\n\t{\n\t\t$temp = '__TEMP_AMPERSANDS__';\n\n\t\t// Replace entities to temporary markers so that\n\t\t// ampersands won't get messed up\n\t\t$str = preg_replace('/&#(\\d+);/', $temp.'\\\\1;', $str);\n\n\t\tif ($protect_all === TRUE)\n\t\t{\n\t\t\t$str = preg_replace('/&(\\w+);/', $temp.'\\\\1;', $str);\n\t\t}\n\n\t\t$str = str_replace(\n\t\t\tarray('&', '<', '>', '\"', \"'\", '-'),\n\t\t\tarray('&amp;', '&lt;', '&gt;', '&quot;', '&apos;', '&#45;'),\n\t\t\t$str\n\t\t);\n\n\t\t// Decode the temp markers back to entities\n\t\t$str = preg_replace('/'.$temp.'(\\d+);/', '&#\\\\1;', $str);\n\n\t\tif ($protect_all === TRUE)\n\t\t{\n\t\t\treturn preg_replace('/'.$temp.'(\\w+);/', '&\\\\1;', $str);\n\t\t}\n\n\t\treturn $str;\n\t}\n}\n"
  },
  {
    "path": "system/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/language/english/calendar_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['cal_su'] = 'Su';\n$lang['cal_mo'] = 'Mo';\n$lang['cal_tu'] = 'Tu';\n$lang['cal_we'] = 'We';\n$lang['cal_th'] = 'Th';\n$lang['cal_fr'] = 'Fr';\n$lang['cal_sa'] = 'Sa';\n$lang['cal_sun'] = 'Sun';\n$lang['cal_mon'] = 'Mon';\n$lang['cal_tue'] = 'Tue';\n$lang['cal_wed'] = 'Wed';\n$lang['cal_thu'] = 'Thu';\n$lang['cal_fri'] = 'Fri';\n$lang['cal_sat'] = 'Sat';\n$lang['cal_sunday'] = 'Sunday';\n$lang['cal_monday'] = 'Monday';\n$lang['cal_tuesday'] = 'Tuesday';\n$lang['cal_wednesday'] = 'Wednesday';\n$lang['cal_thursday'] = 'Thursday';\n$lang['cal_friday'] = 'Friday';\n$lang['cal_saturday'] = 'Saturday';\n$lang['cal_jan'] = 'Jan';\n$lang['cal_feb'] = 'Feb';\n$lang['cal_mar'] = 'Mar';\n$lang['cal_apr'] = 'Apr';\n$lang['cal_may'] = 'May';\n$lang['cal_jun'] = 'Jun';\n$lang['cal_jul'] = 'Jul';\n$lang['cal_aug'] = 'Aug';\n$lang['cal_sep'] = 'Sep';\n$lang['cal_oct'] = 'Oct';\n$lang['cal_nov'] = 'Nov';\n$lang['cal_dec'] = 'Dec';\n$lang['cal_january'] = 'January';\n$lang['cal_february'] = 'February';\n$lang['cal_march'] = 'March';\n$lang['cal_april'] = 'April';\n$lang['cal_mayl'] = 'May';\n$lang['cal_june'] = 'June';\n$lang['cal_july'] = 'July';\n$lang['cal_august'] = 'August';\n$lang['cal_september'] = 'September';\n$lang['cal_october'] = 'October';\n$lang['cal_november'] = 'November';\n$lang['cal_december'] = 'December';\n"
  },
  {
    "path": "system/language/english/date_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['date_year'] = 'Year';\n$lang['date_years'] = 'Years';\n$lang['date_month'] = 'Month';\n$lang['date_months'] = 'Months';\n$lang['date_week'] = 'Week';\n$lang['date_weeks'] = 'Weeks';\n$lang['date_day'] = 'Day';\n$lang['date_days'] = 'Days';\n$lang['date_hour'] = 'Hour';\n$lang['date_hours'] = 'Hours';\n$lang['date_minute'] = 'Minute';\n$lang['date_minutes'] = 'Minutes';\n$lang['date_second'] = 'Second';\n$lang['date_seconds'] = 'Seconds';\n\n$lang['UM12']\t= '(UTC -12:00) Baker/Howland Island';\n$lang['UM11']\t= '(UTC -11:00) Niue';\n$lang['UM10']\t= '(UTC -10:00) Hawaii-Aleutian Standard Time, Cook Islands, Tahiti';\n$lang['UM95']\t= '(UTC -9:30) Marquesas Islands';\n$lang['UM9']\t= '(UTC -9:00) Alaska Standard Time, Gambier Islands';\n$lang['UM8']\t= '(UTC -8:00) Pacific Standard Time, Clipperton Island';\n$lang['UM7']\t= '(UTC -7:00) Mountain Standard Time';\n$lang['UM6']\t= '(UTC -6:00) Central Standard Time';\n$lang['UM5']\t= '(UTC -5:00) Eastern Standard Time, Western Caribbean Standard Time';\n$lang['UM45']\t= '(UTC -4:30) Venezuelan Standard Time';\n$lang['UM4']\t= '(UTC -4:00) Atlantic Standard Time, Eastern Caribbean Standard Time';\n$lang['UM35']\t= '(UTC -3:30) Newfoundland Standard Time';\n$lang['UM3']\t= '(UTC -3:00) Argentina, Brazil, French Guiana, Uruguay';\n$lang['UM2']\t= '(UTC -2:00) South Georgia/South Sandwich Islands';\n$lang['UM1']\t= '(UTC -1:00) Azores, Cape Verde Islands';\n$lang['UTC']\t= '(UTC) Greenwich Mean Time, Western European Time';\n$lang['UP1']\t= '(UTC +1:00) Central European Time, West Africa Time';\n$lang['UP2']\t= '(UTC +2:00) Central Africa Time, Eastern European Time, Kaliningrad Time';\n$lang['UP3']\t= '(UTC +3:00) Moscow Time, East Africa Time, Arabia Standard Time';\n$lang['UP35']\t= '(UTC +3:30) Iran Standard Time';\n$lang['UP4']\t= '(UTC +4:00) Azerbaijan Standard Time, Samara Time';\n$lang['UP45']\t= '(UTC +4:30) Afghanistan';\n$lang['UP5']\t= '(UTC +5:00) Pakistan Standard Time, Yekaterinburg Time';\n$lang['UP55']\t= '(UTC +5:30) Indian Standard Time, Sri Lanka Time';\n$lang['UP575']\t= '(UTC +5:45) Nepal Time';\n$lang['UP6']\t= '(UTC +6:00) Bangladesh Standard Time, Bhutan Time, Omsk Time';\n$lang['UP65']\t= '(UTC +6:30) Cocos Islands, Myanmar';\n$lang['UP7']\t= '(UTC +7:00) Krasnoyarsk Time, Cambodia, Laos, Thailand, Vietnam';\n$lang['UP8']\t= '(UTC +8:00) Australian Western Standard Time, Beijing Time, Irkutsk Time';\n$lang['UP875']\t= '(UTC +8:45) Australian Central Western Standard Time';\n$lang['UP9']\t= '(UTC +9:00) Japan Standard Time, Korea Standard Time, Yakutsk Time';\n$lang['UP95']\t= '(UTC +9:30) Australian Central Standard Time';\n$lang['UP10']\t= '(UTC +10:00) Australian Eastern Standard Time, Vladivostok Time';\n$lang['UP105']\t= '(UTC +10:30) Lord Howe Island';\n$lang['UP11']\t= '(UTC +11:00) Srednekolymsk Time, Solomon Islands, Vanuatu';\n$lang['UP115']\t= '(UTC +11:30) Norfolk Island';\n$lang['UP12']\t= '(UTC +12:00) Fiji, Gilbert Islands, Kamchatka Time, New Zealand Standard Time';\n$lang['UP1275']\t= '(UTC +12:45) Chatham Islands Standard Time';\n$lang['UP13']\t= '(UTC +13:00) Samoa Time Zone, Phoenix Islands Time, Tonga';\n$lang['UP14']\t= '(UTC +14:00) Line Islands';\n"
  },
  {
    "path": "system/language/english/db_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['db_invalid_connection_str'] = 'Unable to determine the database settings based on the connection string you submitted.';\n$lang['db_unable_to_connect'] = 'Unable to connect to your database server using the provided settings.';\n$lang['db_unable_to_select'] = 'Unable to select the specified database: %s';\n$lang['db_unable_to_create'] = 'Unable to create the specified database: %s';\n$lang['db_invalid_query'] = 'The query you submitted is not valid.';\n$lang['db_must_set_table'] = 'You must set the database table to be used with your query.';\n$lang['db_must_use_set'] = 'You must use the \"set\" method to update an entry.';\n$lang['db_must_use_index'] = 'You must specify an index to match on for batch updates.';\n$lang['db_batch_missing_index'] = 'One or more rows submitted for batch updating is missing the specified index.';\n$lang['db_must_use_where'] = 'Updates are not allowed unless they contain a \"where\" clause.';\n$lang['db_del_must_use_where'] = 'Deletes are not allowed unless they contain a \"where\" or \"like\" clause.';\n$lang['db_field_param_missing'] = 'To fetch fields requires the name of the table as a parameter.';\n$lang['db_unsupported_function'] = 'This feature is not available for the database you are using.';\n$lang['db_transaction_failure'] = 'Transaction failure: Rollback performed.';\n$lang['db_unable_to_drop'] = 'Unable to drop the specified database.';\n$lang['db_unsupported_feature'] = 'Unsupported feature of the database platform you are using.';\n$lang['db_unsupported_compression'] = 'The file compression format you chose is not supported by your server.';\n$lang['db_filepath_error'] = 'Unable to write data to the file path you have submitted.';\n$lang['db_invalid_cache_path'] = 'The cache path you submitted is not valid or writable.';\n$lang['db_table_name_required'] = 'A table name is required for that operation.';\n$lang['db_column_name_required'] = 'A column name is required for that operation.';\n$lang['db_column_definition_required'] = 'A column definition is required for that operation.';\n$lang['db_unable_to_set_charset'] = 'Unable to set client connection character set: %s';\n$lang['db_error_heading'] = 'A Database Error Occurred';\n"
  },
  {
    "path": "system/language/english/email_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['email_must_be_array'] = 'The email validation method must be passed an array.';\n$lang['email_invalid_address'] = 'Invalid email address: %s';\n$lang['email_attachment_missing'] = 'Unable to locate the following email attachment: %s';\n$lang['email_attachment_unreadable'] = 'Unable to open this attachment: %s';\n$lang['email_no_from'] = 'Cannot send mail with no \"From\" header.';\n$lang['email_no_recipients'] = 'You must include recipients: To, Cc, or Bcc';\n$lang['email_send_failure_phpmail'] = 'Unable to send email using PHP mail(). Your server might not be configured to send mail using this method.';\n$lang['email_send_failure_sendmail'] = 'Unable to send email using PHP Sendmail. Your server might not be configured to send mail using this method.';\n$lang['email_send_failure_smtp'] = 'Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method.';\n$lang['email_sent'] = 'Your message has been successfully sent using the following protocol: %s';\n$lang['email_no_socket'] = 'Unable to open a socket to Sendmail. Please check settings.';\n$lang['email_no_hostname'] = 'You did not specify a SMTP hostname.';\n$lang['email_smtp_error'] = 'The following SMTP error was encountered: %s';\n$lang['email_no_smtp_unpw'] = 'Error: You must assign a SMTP username and password.';\n$lang['email_failed_smtp_login'] = 'Failed to send AUTH LOGIN command. Error: %s';\n$lang['email_smtp_auth_un'] = 'Failed to authenticate username. Error: %s';\n$lang['email_smtp_auth_pw'] = 'Failed to authenticate password. Error: %s';\n$lang['email_smtp_data_failure'] = 'Unable to send data: %s';\n$lang['email_exit_status'] = 'Exit status code: %s';\n"
  },
  {
    "path": "system/language/english/form_validation_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['form_validation_required']\t\t= 'The {field} field is required.';\n$lang['form_validation_isset']\t\t\t= 'The {field} field must have a value.';\n$lang['form_validation_valid_email']\t\t= 'The {field} field must contain a valid email address.';\n$lang['form_validation_valid_emails']\t\t= 'The {field} field must contain all valid email addresses.';\n$lang['form_validation_valid_url']\t\t= 'The {field} field must contain a valid URL.';\n$lang['form_validation_valid_ip']\t\t= 'The {field} field must contain a valid IP.';\n$lang['form_validation_valid_base64']\t\t= 'The {field} field must contain a valid Base64 string.';\n$lang['form_validation_min_length']\t\t= 'The {field} field must be at least {param} characters in length.';\n$lang['form_validation_max_length']\t\t= 'The {field} field cannot exceed {param} characters in length.';\n$lang['form_validation_exact_length']\t\t= 'The {field} field must be exactly {param} characters in length.';\n$lang['form_validation_alpha']\t\t\t= 'The {field} field may only contain alphabetical characters.';\n$lang['form_validation_alpha_numeric']\t\t= 'The {field} field may only contain alpha-numeric characters.';\n$lang['form_validation_alpha_numeric_spaces']\t= 'The {field} field may only contain alpha-numeric characters and spaces.';\n$lang['form_validation_alpha_dash']\t\t= 'The {field} field may only contain alpha-numeric characters, underscores, and dashes.';\n$lang['form_validation_numeric']\t\t= 'The {field} field must contain only numbers.';\n$lang['form_validation_is_numeric']\t\t= 'The {field} field must contain only numeric characters.';\n$lang['form_validation_integer']\t\t= 'The {field} field must contain an integer.';\n$lang['form_validation_regex_match']\t\t= 'The {field} field is not in the correct format.';\n$lang['form_validation_matches']\t\t= 'The {field} field does not match the {param} field.';\n$lang['form_validation_differs']\t\t= 'The {field} field must differ from the {param} field.';\n$lang['form_validation_is_unique'] \t\t= 'The {field} field must contain a unique value.';\n$lang['form_validation_is_natural']\t\t= 'The {field} field must only contain digits.';\n$lang['form_validation_is_natural_no_zero']\t= 'The {field} field must only contain digits and must be greater than zero.';\n$lang['form_validation_decimal']\t\t= 'The {field} field must contain a decimal number.';\n$lang['form_validation_less_than']\t\t= 'The {field} field must contain a number less than {param}.';\n$lang['form_validation_less_than_equal_to']\t= 'The {field} field must contain a number less than or equal to {param}.';\n$lang['form_validation_greater_than']\t\t= 'The {field} field must contain a number greater than {param}.';\n$lang['form_validation_greater_than_equal_to']\t= 'The {field} field must contain a number greater than or equal to {param}.';\n$lang['form_validation_error_message_not_set']\t= 'Unable to access an error message corresponding to your field name {field}.';\n$lang['form_validation_in_list']\t\t= 'The {field} field must be one of: {param}.';\n"
  },
  {
    "path": "system/language/english/ftp_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['ftp_no_connection']\t\t= 'Unable to locate a valid connection ID. Please make sure you are connected before performing any file routines.';\n$lang['ftp_unable_to_connect']\t\t= 'Unable to connect to your FTP server using the supplied hostname.';\n$lang['ftp_unable_to_login']\t\t= 'Unable to login to your FTP server. Please check your username and password.';\n$lang['ftp_unable_to_mkdir']\t\t= 'Unable to create the directory you have specified.';\n$lang['ftp_unable_to_changedir']\t= 'Unable to change directories.';\n$lang['ftp_unable_to_chmod']\t\t= 'Unable to set file permissions. Please check your path.';\n$lang['ftp_unable_to_upload']\t\t= 'Unable to upload the specified file. Please check your path.';\n$lang['ftp_unable_to_download']\t\t= 'Unable to download the specified file. Please check your path.';\n$lang['ftp_no_source_file']\t\t= 'Unable to locate the source file. Please check your path.';\n$lang['ftp_unable_to_rename']\t\t= 'Unable to rename the file.';\n$lang['ftp_unable_to_delete']\t\t= 'Unable to delete the file.';\n$lang['ftp_unable_to_move']\t\t= 'Unable to move the file. Please make sure the destination directory exists.';\n"
  },
  {
    "path": "system/language/english/imglib_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['imglib_source_image_required'] = 'You must specify a source image in your preferences.';\n$lang['imglib_gd_required'] = 'The GD image library is required for this feature.';\n$lang['imglib_gd_required_for_props'] = 'Your server must support the GD image library in order to determine the image properties.';\n$lang['imglib_unsupported_imagecreate'] = 'Your server does not support the GD function required to process this type of image.';\n$lang['imglib_gif_not_supported'] = 'GIF images are often not supported due to licensing restrictions. You may have to use JPG or PNG images instead.';\n$lang['imglib_jpg_not_supported'] = 'JPG images are not supported.';\n$lang['imglib_png_not_supported'] = 'PNG images are not supported.';\n$lang['imglib_jpg_or_png_required'] = 'The image resize protocol specified in your preferences only works with JPEG or PNG image types.';\n$lang['imglib_copy_error'] = 'An error was encountered while attempting to replace the file. Please make sure your file directory is writable.';\n$lang['imglib_rotate_unsupported'] = 'Image rotation does not appear to be supported by your server.';\n$lang['imglib_libpath_invalid'] = 'The path to your image library is not correct. Please set the correct path in your image preferences.';\n$lang['imglib_image_process_failed'] = 'Image processing failed. Please verify that your server supports the chosen protocol and that the path to your image library is correct.';\n$lang['imglib_rotation_angle_required'] = 'An angle of rotation is required to rotate the image.';\n$lang['imglib_invalid_path'] = 'The path to the image is not correct.';\n$lang['imglib_invalid_image'] = 'The provided image is not valid.';\n$lang['imglib_copy_failed'] = 'The image copy routine failed.';\n$lang['imglib_missing_font'] = 'Unable to find a font to use.';\n$lang['imglib_save_failed'] = 'Unable to save the image. Please make sure the image and file directory are writable.';\n"
  },
  {
    "path": "system/language/english/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/language/english/migration_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['migration_none_found'] = 'No migrations were found.';\n$lang['migration_not_found'] = 'No migration could be found with the version number: %s.';\n$lang['migration_sequence_gap'] = 'There is a gap in the migration sequence near version number: %s.';\n$lang['migration_multiple_version'] = 'There are multiple migrations with the same version number: %s.';\n$lang['migration_class_doesnt_exist'] = 'The migration class \"%s\" could not be found.';\n$lang['migration_missing_up_method'] = 'The migration class \"%s\" is missing an \"up\" method.';\n$lang['migration_missing_down_method'] = 'The migration class \"%s\" is missing a \"down\" method.';\n$lang['migration_invalid_filename'] = 'Migration \"%s\" has an invalid filename.';\n"
  },
  {
    "path": "system/language/english/number_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['terabyte_abbr'] = 'TB';\n$lang['gigabyte_abbr'] = 'GB';\n$lang['megabyte_abbr'] = 'MB';\n$lang['kilobyte_abbr'] = 'KB';\n$lang['bytes'] = 'Bytes';\n"
  },
  {
    "path": "system/language/english/pagination_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['pagination_first_link'] = '&lsaquo; First';\n$lang['pagination_next_link'] = '&gt;';\n$lang['pagination_prev_link'] = '&lt;';\n$lang['pagination_last_link'] = 'Last &rsaquo;';\n"
  },
  {
    "path": "system/language/english/profiler_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['profiler_database'] = 'DATABASE';\n$lang['profiler_controller_info'] = 'CLASS/METHOD';\n$lang['profiler_benchmarks'] = 'BENCHMARKS';\n$lang['profiler_queries'] = 'QUERIES';\n$lang['profiler_get_data'] = 'GET DATA';\n$lang['profiler_post_data'] = 'POST DATA';\n$lang['profiler_uri_string'] = 'URI STRING';\n$lang['profiler_memory_usage'] = 'MEMORY USAGE';\n$lang['profiler_config'] = 'CONFIG VARIABLES';\n$lang['profiler_session_data'] = 'SESSION DATA';\n$lang['profiler_headers'] = 'HTTP HEADERS';\n$lang['profiler_no_db'] = 'Database driver is not currently loaded';\n$lang['profiler_no_queries'] = 'No queries were run';\n$lang['profiler_no_post'] = 'No POST data exists';\n$lang['profiler_no_get'] = 'No GET data exists';\n$lang['profiler_no_uri'] = 'No URI data exists';\n$lang['profiler_no_memory'] = 'Memory Usage Unavailable';\n$lang['profiler_no_profiles'] = 'No Profile data - all Profiler sections have been disabled.';\n$lang['profiler_section_hide'] = 'Hide';\n$lang['profiler_section_show'] = 'Show';\n$lang['profiler_seconds'] = 'seconds';\n"
  },
  {
    "path": "system/language/english/unit_test_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['ut_test_name'] = 'Test Name';\n$lang['ut_test_datatype'] = 'Test Datatype';\n$lang['ut_res_datatype'] = 'Expected Datatype';\n$lang['ut_result'] = 'Result';\n$lang['ut_undefined'] = 'Undefined Test Name';\n$lang['ut_file'] = 'File Name';\n$lang['ut_line'] = 'Line Number';\n$lang['ut_passed'] = 'Passed';\n$lang['ut_failed'] = 'Failed';\n$lang['ut_boolean'] = 'Boolean';\n$lang['ut_integer'] = 'Integer';\n$lang['ut_float'] = 'Float';\n$lang['ut_double'] = 'Float'; // can be the same as float\n$lang['ut_string'] = 'String';\n$lang['ut_array'] = 'Array';\n$lang['ut_object'] = 'Object';\n$lang['ut_resource'] = 'Resource';\n$lang['ut_null'] = 'Null';\n$lang['ut_notes'] = 'Notes';\n"
  },
  {
    "path": "system/language/english/upload_lang.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n$lang['upload_userfile_not_set'] = 'Unable to find a post variable called userfile.';\n$lang['upload_file_exceeds_limit'] = 'The uploaded file exceeds the maximum allowed size in your PHP configuration file.';\n$lang['upload_file_exceeds_form_limit'] = 'The uploaded file exceeds the maximum size allowed by the submission form.';\n$lang['upload_file_partial'] = 'The file was only partially uploaded.';\n$lang['upload_no_temp_directory'] = 'The temporary folder is missing.';\n$lang['upload_unable_to_write_file'] = 'The file could not be written to disk.';\n$lang['upload_stopped_by_extension'] = 'The file upload was stopped by extension.';\n$lang['upload_no_file_selected'] = 'You did not select a file to upload.';\n$lang['upload_invalid_filetype'] = 'The filetype you are attempting to upload is not allowed.';\n$lang['upload_invalid_filesize'] = 'The file you are attempting to upload is larger than the permitted size.';\n$lang['upload_invalid_dimensions'] = 'The image you are attempting to upload doesn\\'t fit into the allowed dimensions.';\n$lang['upload_destination_error'] = 'A problem was encountered while attempting to move the uploaded file to the final destination.';\n$lang['upload_no_filepath'] = 'The upload path does not appear to be valid.';\n$lang['upload_no_file_types'] = 'You have not specified any allowed file types.';\n$lang['upload_bad_filename'] = 'The file name you submitted already exists on the server.';\n$lang['upload_not_writable'] = 'The upload destination folder does not appear to be writable.';\n"
  },
  {
    "path": "system/language/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/libraries/Cache/Cache.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Caching Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tCore\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Cache extends CI_Driver_Library {\n\n\t/**\n\t * Valid cache drivers\n\t *\n\t * @var array\n\t */\n\tprotected $valid_drivers = array(\n\t\t'apc',\n\t\t'dummy',\n\t\t'file',\n\t\t'memcached',\n\t\t'redis',\n\t\t'wincache'\n\t);\n\n\t/**\n\t * Path of cache files (if file-based cache)\n\t *\n\t * @var string\n\t */\n\tprotected $_cache_path = NULL;\n\n\t/**\n\t * Reference to the driver\n\t *\n\t * @var mixed\n\t */\n\tprotected $_adapter = 'dummy';\n\n\t/**\n\t * Fallback driver\n\t *\n\t * @var string\n\t */\n\tprotected $_backup_driver = 'dummy';\n\n\t/**\n\t * Cache key prefix\n\t *\n\t * @var\tstring\n\t */\n\tpublic $key_prefix = '';\n\n\t/**\n\t * Constructor\n\t *\n\t * Initialize class properties based on the configuration array.\n\t *\n\t * @param\tarray\t$config = array()\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\tisset($config['adapter']) && $this->_adapter = $config['adapter'];\n\t\tisset($config['backup']) && $this->_backup_driver = $config['backup'];\n\t\tisset($config['key_prefix']) && $this->key_prefix = $config['key_prefix'];\n\n\t\t// If the specified adapter isn't available, check the backup.\n\t\tif ( ! $this->is_supported($this->_adapter))\n\t\t{\n\t\t\tif ( ! $this->is_supported($this->_backup_driver))\n\t\t\t{\n\t\t\t\t// Backup isn't supported either. Default to 'Dummy' driver.\n\t\t\t\tlog_message('error', 'Cache adapter \"'.$this->_adapter.'\" and backup \"'.$this->_backup_driver.'\" are both unavailable. Cache is now using \"Dummy\" adapter.');\n\t\t\t\t$this->_adapter = 'dummy';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Backup is supported. Set it to primary.\n\t\t\t\tlog_message('debug', 'Cache adapter \"'.$this->_adapter.'\" is unavailable. Falling back to \"'.$this->_backup_driver.'\" backup adapter.');\n\t\t\t\t$this->_adapter = $this->_backup_driver;\n\t\t\t}\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get\n\t *\n\t * Look for a value in the cache. If it exists, return the data\n\t * if not, return FALSE\n\t *\n\t * @param\tstring\t$id\n\t * @return\tmixed\tvalue matching $id or FALSE on failure\n\t */\n\tpublic function get($id)\n\t{\n\t\treturn $this->{$this->_adapter}->get($this->key_prefix.$id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Save\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tmixed\t$data\tData to store\n\t * @param\tint\t$ttl\tCache TTL (in seconds)\n\t * @param\tbool\t$raw\tWhether to store the raw value\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\treturn $this->{$this->_adapter}->save($this->key_prefix.$id, $data, $ttl, $raw);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from Cache\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function delete($id)\n\t{\n\t\treturn $this->{$this->_adapter}->delete($this->key_prefix.$id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\treturn $this->{$this->_adapter}->increment($this->key_prefix.$id, $offset);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\treturn $this->{$this->_adapter}->decrement($this->key_prefix.$id, $offset);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean the cache\n\t *\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function clean()\n\t{\n\t\treturn $this->{$this->_adapter}->clean();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Info\n\t *\n\t * @param\tstring\t$type = 'user'\tuser/filehits\n\t * @return\tmixed\tarray containing cache info on success OR FALSE on failure\n\t */\n\tpublic function cache_info($type = 'user')\n\t{\n\t\treturn $this->{$this->_adapter}->cache_info($type);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get Cache Metadata\n\t *\n\t * @param\tstring\t$id\tkey to get cache metadata on\n\t * @return\tmixed\tcache item metadata\n\t */\n\tpublic function get_metadata($id)\n\t{\n\t\treturn $this->{$this->_adapter}->get_metadata($this->key_prefix.$id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Is the requested driver supported in this environment?\n\t *\n\t * @param\tstring\t$driver\tThe driver to test\n\t * @return\tarray\n\t */\n\tpublic function is_supported($driver)\n\t{\n\t\tstatic $support;\n\n\t\tif ( ! isset($support, $support[$driver]))\n\t\t{\n\t\t\t$support[$driver] = $this->{$driver}->is_supported();\n\t\t}\n\n\t\treturn $support[$driver];\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/Cache_apc.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter APC Caching Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tCore\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Cache_apc extends CI_Driver {\n\n\t/**\n\t * Class constructor\n\t *\n\t * Only present so that an error message is logged\n\t * if APC is not available.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tif ( ! $this->is_supported())\n\t\t{\n\t\t\tlog_message('error', 'Cache: Failed to initialize APC; extension not loaded/enabled?');\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get\n\t *\n\t * Look for a value in the cache. If it exists, return the data\n\t * if not, return FALSE\n\t *\n\t * @param\tstring\n\t * @return\tmixed\tvalue that is stored/FALSE on failure\n\t */\n\tpublic function get($id)\n\t{\n\t\t$success = FALSE;\n\t\t$data = apc_fetch($id, $success);\n\n\t\treturn ($success === TRUE) ? $data : FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Save\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tmixed\t$data\tData to store\n\t * @param\tint\t$ttl\tLength of time (in seconds) to cache the data\n\t * @param\tbool\t$raw\tWhether to store the raw value (unused)\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\treturn apc_store($id, $data, (int) $ttl);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from Cache\n\t *\n\t * @param\tmixed\tunique identifier of the item in the cache\n\t * @return\tbool\ttrue on success/false on failure\n\t */\n\tpublic function delete($id)\n\t{\n\t\treturn apc_delete($id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\treturn apc_inc($id, $offset);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\treturn apc_dec($id, $offset);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean the cache\n\t *\n\t * @return\tbool\tfalse on failure/true on success\n\t */\n\tpublic function clean()\n\t{\n\t\treturn apc_clear_cache('user');\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Info\n\t *\n\t * @param\tstring\tuser/filehits\n\t * @return\tmixed\tarray on success, false on failure\n\t */\n\tpublic function cache_info($type = NULL)\n\t{\n\t\treturn apc_cache_info($type);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get Cache Metadata\n\t *\n\t * @param\tmixed\tkey to get cache metadata on\n\t * @return\tmixed\tarray on success/false on failure\n\t */\n\tpublic function get_metadata($id)\n\t{\n\t\t$cache_info = apc_cache_info('user', FALSE);\n\t\tif (empty($cache_info) OR empty($cache_info['cache_list']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tforeach ($cache_info['cache_list'] as &$entry)\n\t\t{\n\t\t\tif ($entry['info'] !== $id)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$success  = FALSE;\n\t\t\t$metadata = array(\n\t\t\t\t'expire' => ($entry['ttl'] ? $entry['mtime'] + $entry['ttl'] : 0),\n\t\t\t\t'mtime'  => $entry['ttl'],\n\t\t\t\t'data'   => apc_fetch($id, $success)\n\t\t\t);\n\n\t\t\treturn ($success === TRUE) ? $metadata : FALSE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * is_supported()\n\t *\n\t * Check to see if APC is available on this system, bail if it isn't.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_supported()\n\t{\n\t\treturn (extension_loaded('apc') && ini_get('apc.enabled'));\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/Cache_dummy.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Dummy Caching Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tCore\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Cache_dummy extends CI_Driver {\n\n\t/**\n\t * Get\n\t *\n\t * Since this is the dummy class, it's always going to return FALSE.\n\t *\n\t * @param\tstring\n\t * @return\tbool\tFALSE\n\t */\n\tpublic function get($id)\n\t{\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Save\n\t *\n\t * @param\tstring\tUnique Key\n\t * @param\tmixed\tData to store\n\t * @param\tint\tLength of time (in seconds) to cache the data\n\t * @param\tbool\tWhether to store the raw value\n\t * @return\tbool\tTRUE, Simulating success\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from Cache\n\t *\n\t * @param\tmixed\tunique identifier of the item in the cache\n\t * @return\tbool\tTRUE, simulating success\n\t */\n\tpublic function delete($id)\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean the cache\n\t *\n\t * @return\tbool\tTRUE, simulating success\n\t */\n\tpublic function clean()\n\t{\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Info\n\t *\n\t * @param\tstring\tuser/filehits\n\t * @return\tbool\tFALSE\n\t */\n\tpublic function cache_info($type = NULL)\n\t{\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get Cache Metadata\n\t *\n\t * @param\tmixed\tkey to get cache metadata on\n\t * @return\tbool\tFALSE\n\t */\n\tpublic function get_metadata($id)\n\t{\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Is this caching driver supported on the system?\n\t * Of course this one is.\n\t *\n\t * @return\tbool\tTRUE\n\t */\n\tpublic function is_supported()\n\t{\n\t\treturn TRUE;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/Cache_file.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter File Caching Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tCore\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Cache_file extends CI_Driver {\n\n\t/**\n\t * Directory in which to save cache files\n\t *\n\t * @var string\n\t */\n\tprotected $_cache_path;\n\n\t/**\n\t * Initialize file-based cache\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->load->helper('file');\n\t\t$path = $CI->config->item('cache_path');\n\t\t$this->_cache_path = ($path === '') ? APPPATH.'cache/' : $path;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Fetch from cache\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @return\tmixed\tData on success, FALSE on failure\n\t */\n\tpublic function get($id)\n\t{\n\t\t$data = $this->_get($id);\n\t\treturn is_array($data) ? $data['data'] : FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Save into cache\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tmixed\t$data\tData to store\n\t * @param\tint\t$ttl\tTime to live in seconds\n\t * @param\tbool\t$raw\tWhether to store the raw value (unused)\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\t$contents = array(\n\t\t\t'time'\t\t=> time(),\n\t\t\t'ttl'\t\t=> $ttl,\n\t\t\t'data'\t\t=> $data\n\t\t);\n\n\t\tif (write_file($this->_cache_path.$id, serialize($contents)))\n\t\t{\n\t\t\tchmod($this->_cache_path.$id, 0640);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from Cache\n\t *\n\t * @param\tmixed\tunique identifier of item in cache\n\t * @return\tbool\ttrue on success/false on failure\n\t */\n\tpublic function delete($id)\n\t{\n\t\treturn is_file($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tNew value on success, FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\t$data = $this->_get($id);\n\n\t\tif ($data === FALSE)\n\t\t{\n\t\t\t$data = array('data' => 0, 'ttl' => 60);\n\t\t}\n\t\telseif ( ! is_int($data['data']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$new_value = $data['data'] + $offset;\n\t\treturn $this->save($id, $new_value, $data['ttl'])\n\t\t\t? $new_value\n\t\t\t: FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tNew value on success, FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\t$data = $this->_get($id);\n\n\t\tif ($data === FALSE)\n\t\t{\n\t\t\t$data = array('data' => 0, 'ttl' => 60);\n\t\t}\n\t\telseif ( ! is_int($data['data']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$new_value = $data['data'] - $offset;\n\t\treturn $this->save($id, $new_value, $data['ttl'])\n\t\t\t? $new_value\n\t\t\t: FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean the Cache\n\t *\n\t * @return\tbool\tfalse on failure/true on success\n\t */\n\tpublic function clean()\n\t{\n\t\treturn delete_files($this->_cache_path, FALSE, TRUE);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Info\n\t *\n\t * Not supported by file-based caching\n\t *\n\t * @param\tstring\tuser/filehits\n\t * @return\tmixed\tFALSE\n\t */\n\tpublic function cache_info($type = NULL)\n\t{\n\t\treturn get_dir_file_info($this->_cache_path);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get Cache Metadata\n\t *\n\t * @param\tmixed\tkey to get cache metadata on\n\t * @return\tmixed\tFALSE on failure, array on success.\n\t */\n\tpublic function get_metadata($id)\n\t{\n\t\tif ( ! is_file($this->_cache_path.$id))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$data = unserialize(file_get_contents($this->_cache_path.$id));\n\n\t\tif (is_array($data))\n\t\t{\n\t\t\t$mtime = filemtime($this->_cache_path.$id);\n\n\t\t\tif ( ! isset($data['ttl'], $data['time']))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\treturn array(\n\t\t\t\t'expire' => $data['time'] + $data['ttl'],\n\t\t\t\t'mtime'\t => $mtime\n\t\t\t);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Is supported\n\t *\n\t * In the file driver, check to see that the cache directory is indeed writable\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_supported()\n\t{\n\t\treturn is_really_writable($this->_cache_path);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get all data\n\t *\n\t * Internal method to get all the relevant data about a cache item\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @return\tmixed\tData array on success or FALSE on failure\n\t */\n\tprotected function _get($id)\n\t{\n\t\tif ( ! is_file($this->_cache_path.$id))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$data = unserialize(file_get_contents($this->_cache_path.$id));\n\n\t\tif ($data['ttl'] > 0 && time() > $data['time'] + $data['ttl'])\n\t\t{\n\t\t\tfile_exists($this->_cache_path.$id) && unlink($this->_cache_path.$id);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/Cache_memcached.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Memcached Caching Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tCore\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Cache_memcached extends CI_Driver {\n\n\t/**\n\t * Holds the memcached object\n\t *\n\t * @var object\n\t */\n\tprotected $_memcached;\n\n\t/**\n\t * Memcached configuration\n\t *\n\t * @var array\n\t */\n\tprotected $_config = array(\n\t\t'default' => array(\n\t\t\t'host'\t\t=> '127.0.0.1',\n\t\t\t'port'\t\t=> 11211,\n\t\t\t'weight'\t=> 1\n\t\t)\n\t);\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Setup Memcache(d)\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t// Try to load memcached server info from the config file.\n\t\t$CI =& get_instance();\n\t\t$defaults = $this->_config['default'];\n\n\t\tif ($CI->config->load('memcached', TRUE, TRUE))\n\t\t{\n\t\t\t$this->_config = $CI->config->config['memcached'];\n\t\t}\n\n\t\tif (class_exists('Memcached', FALSE))\n\t\t{\n\t\t\t$this->_memcached = new Memcached();\n\t\t}\n\t\telseif (class_exists('Memcache', FALSE))\n\t\t{\n\t\t\t$this->_memcached = new Memcache();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog_message('error', 'Cache: Failed to create Memcache(d) object; extension not loaded?');\n\t\t\treturn;\n\t\t}\n\n\t\tforeach ($this->_config as $cache_server)\n\t\t{\n\t\t\tisset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host'];\n\t\t\tisset($cache_server['port']) OR $cache_server['port'] = $defaults['port'];\n\t\t\tisset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight'];\n\n\t\t\tif ($this->_memcached instanceof Memcache)\n\t\t\t{\n\t\t\t\t// Third parameter is persistence and defaults to TRUE.\n\t\t\t\t$this->_memcached->addServer(\n\t\t\t\t\t$cache_server['hostname'],\n\t\t\t\t\t$cache_server['port'],\n\t\t\t\t\tTRUE,\n\t\t\t\t\t$cache_server['weight']\n\t\t\t\t);\n\t\t\t}\n\t\t\telseif ($this->_memcached instanceof Memcached)\n\t\t\t{\n\t\t\t\t$this->_memcached->addServer(\n\t\t\t\t\t$cache_server['hostname'],\n\t\t\t\t\t$cache_server['port'],\n\t\t\t\t\t$cache_server['weight']\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Fetch from cache\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @return\tmixed\tData on success, FALSE on failure\n\t */\n\tpublic function get($id)\n\t{\n\t\t$data = $this->_memcached->get($id);\n\n\t\treturn is_array($data) ? $data[0] : $data;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Save\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tmixed\t$data\tData being cached\n\t * @param\tint\t$ttl\tTime to live\n\t * @param\tbool\t$raw\tWhether to store the raw value\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\tif ($raw !== TRUE)\n\t\t{\n\t\t\t$data = array($data, time(), $ttl);\n\t\t}\n\n\t\tif ($this->_memcached instanceof Memcached)\n\t\t{\n\t\t\treturn $this->_memcached->set($id, $data, $ttl);\n\t\t}\n\t\telseif ($this->_memcached instanceof Memcache)\n\t\t{\n\t\t\treturn $this->_memcached->set($id, $data, 0, $ttl);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from Cache\n\t *\n\t * @param\tmixed\t$id\tkey to be deleted.\n\t * @return\tbool\ttrue on success, false on failure\n\t */\n\tpublic function delete($id)\n\t{\n\t\treturn $this->_memcached->delete($id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\tif (($result = $this->_memcached->increment($id, $offset)) === FALSE)\n\t\t{\n\t\t\treturn $this->_memcached->add($id, $offset) ? $offset : FALSE;\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\tif (($result = $this->_memcached->decrement($id, $offset)) === FALSE)\n\t\t{\n\t\t\treturn $this->_memcached->add($id, 0) ? 0 : FALSE;\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean the Cache\n\t *\n\t * @return\tbool\tfalse on failure/true on success\n\t */\n\tpublic function clean()\n\t{\n\t\treturn $this->_memcached->flush();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Info\n\t *\n\t * @return\tmixed\tarray on success, false on failure\n\t */\n\tpublic function cache_info()\n\t{\n\t\treturn $this->_memcached->getStats();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get Cache Metadata\n\t *\n\t * @param\tmixed\t$id\tkey to get cache metadata on\n\t * @return\tmixed\tFALSE on failure, array on success.\n\t */\n\tpublic function get_metadata($id)\n\t{\n\t\t$stored = $this->_memcached->get($id);\n\n\t\tif (count($stored) !== 3)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tlist($data, $time, $ttl) = $stored;\n\n\t\treturn array(\n\t\t\t'expire'\t=> $time + $ttl,\n\t\t\t'mtime'\t\t=> $time,\n\t\t\t'data'\t\t=> $data\n\t\t);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Is supported\n\t *\n\t * Returns FALSE if memcached is not supported on the system.\n\t * If it is, we setup the memcached object & return TRUE\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_supported()\n\t{\n\t\treturn (extension_loaded('memcached') OR extension_loaded('memcache'));\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class destructor\n\t *\n\t * Closes the connection to Memcache(d) if present.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __destruct()\n\t{\n\t\tif ($this->_memcached instanceof Memcache)\n\t\t{\n\t\t\t$this->_memcached->close();\n\t\t}\n\t\telseif ($this->_memcached instanceof Memcached && method_exists($this->_memcached, 'quit'))\n\t\t{\n\t\t\t$this->_memcached->quit();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/Cache_redis.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Redis Caching Class\n *\n * @package\t   CodeIgniter\n * @subpackage Libraries\n * @category   Core\n * @author\t   Anton Lindqvist <anton@qvister.se>\n * @link\n */\nclass CI_Cache_redis extends CI_Driver\n{\n\t/**\n\t * Default config\n\t *\n\t * @static\n\t * @var\tarray\n\t */\n\tprotected static $_default_config = array(\n\t\t'socket_type' => 'tcp',\n\t\t'host' => '127.0.0.1',\n\t\t'password' => NULL,\n\t\t'port' => 6379,\n\t\t'timeout' => 0\n\t);\n\n\t/**\n\t * Redis connection\n\t *\n\t * @var\tRedis\n\t */\n\tprotected $_redis;\n\n\t/**\n\t * An internal cache for storing keys of serialized values.\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_serialized = array();\n\n\t/**\n\t * del()/delete() method name depending on phpRedis version\n\t *\n\t * @var\tstring\n\t */\n\tprotected static $_delete_name;\n\n\t/**\n\t * sRem()/sRemove() method name depending on phpRedis version\n\t *\n\t * @var\tstring\n\t */\n\tprotected static $_sRemove_name;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Setup Redis\n\t *\n\t * Loads Redis config file if present. Will halt execution\n\t * if a Redis connection can't be established.\n\t *\n\t * @return\tvoid\n\t * @see\t\tRedis::connect()\n\t */\n\tpublic function __construct()\n\t{\n\t\tif ( ! $this->is_supported())\n\t\t{\n\t\t\tlog_message('error', 'Cache: Failed to create Redis object; extension not loaded?');\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! isset(static::$_delete_name, static::$_sRemove_name))\n\t\t{\n\t\t\tif (version_compare(phpversion('redis'), '5', '>='))\n\t\t\t{\n\t\t\t\tstatic::$_delete_name  = 'del';\n\t\t\t\tstatic::$_sRemove_name = 'sRem';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatic::$_delete_name  = 'delete';\n\t\t\t\tstatic::$_sRemove_name = 'sRemove';\n\t\t\t}\n\t\t}\n\n\t\t$CI =& get_instance();\n\n\t\tif ($CI->config->load('redis', TRUE, TRUE))\n\t\t{\n\t\t\t$config = array_merge(self::$_default_config, $CI->config->item('redis'));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$config = self::$_default_config;\n\t\t}\n\n\t\t$this->_redis = new Redis();\n\n\t\ttry\n\t\t{\n\t\t\tif ($config['socket_type'] === 'unix')\n\t\t\t{\n\t\t\t\t$success = $this->_redis->connect($config['socket']);\n\t\t\t}\n\t\t\telse // tcp socket\n\t\t\t{\n\t\t\t\t$success = $this->_redis->connect($config['host'], $config['port'], $config['timeout']);\n\t\t\t}\n\n\t\t\tif ( ! $success)\n\t\t\t{\n\t\t\t\tlog_message('error', 'Cache: Redis connection failed. Check your configuration.');\n\t\t\t}\n\n\t\t\tif (isset($config['password']) && ! $this->_redis->auth($config['password']))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Cache: Redis authentication failed.');\n\t\t\t}\n\t\t}\n\t\tcatch (RedisException $e)\n\t\t{\n\t\t\tlog_message('error', 'Cache: Redis connection refused ('.$e->getMessage().')');\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get cache\n\t *\n\t * @param\tstring\t$key\tCache ID\n\t * @return\tmixed\n\t */\n\tpublic function get($key)\n\t{\n\t\t$value = $this->_redis->get($key);\n\n\t\tif ($value !== FALSE && $this->_redis->sIsMember('_ci_redis_serialized', $key))\n\t\t{\n\t\t\treturn unserialize($value);\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Save cache\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tmixed\t$data\tData to save\n\t * @param\tint\t$ttl\tTime to live in seconds\n\t * @param\tbool\t$raw\tWhether to store the raw value (unused)\n\t * @return\tbool\tTRUE on success, FALSE on failure\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\tif (is_array($data) OR is_object($data))\n\t\t{\n\t\t\tif ( ! $this->_redis->sIsMember('_ci_redis_serialized', $id) && ! $this->_redis->sAdd('_ci_redis_serialized', $id))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tisset($this->_serialized[$id]) OR $this->_serialized[$id] = TRUE;\n\t\t\t$data = serialize($data);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_redis->{static::$_sRemove_name}('_ci_redis_serialized', $id);\n\t\t}\n\n\t\treturn $this->_redis->set($id, $data, $ttl);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from cache\n\t *\n\t * @param\tstring\t$key\tCache key\n\t * @return\tbool\n\t */\n\tpublic function delete($key)\n\t{\n\t\tif ($this->_redis->{static::$_delete_name}($key) !== 1)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_redis->{static::$_sRemove_name}('_ci_redis_serialized', $key);\n\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\treturn $this->_redis->incrBy($id, $offset);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\treturn $this->_redis->decrBy($id, $offset);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean cache\n\t *\n\t * @return\tbool\n\t * @see\t\tRedis::flushDB()\n\t */\n\tpublic function clean()\n\t{\n\t\treturn $this->_redis->flushDB();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get cache driver info\n\t *\n\t * @param\tstring\t$type\tNot supported in Redis.\n\t *\t\t\t\tOnly included in order to offer a\n\t *\t\t\t\tconsistent cache API.\n\t * @return\tarray\n\t * @see\t\tRedis::info()\n\t */\n\tpublic function cache_info($type = NULL)\n\t{\n\t\treturn $this->_redis->info();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get cache metadata\n\t *\n\t * @param\tstring\t$key\tCache key\n\t * @return\tarray\n\t */\n\tpublic function get_metadata($key)\n\t{\n\t\t$value = $this->get($key);\n\n\t\tif ($value !== FALSE)\n\t\t{\n\t\t\treturn array(\n\t\t\t\t'expire' => time() + $this->_redis->ttl($key),\n\t\t\t\t'data' => $value\n\t\t\t);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Check if Redis driver is supported\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_supported()\n\t{\n\t\treturn extension_loaded('redis');\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class destructor\n\t *\n\t * Closes the connection to Redis if present.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __destruct()\n\t{\n\t\tif ($this->_redis)\n\t\t{\n\t\t\t$this->_redis->close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/Cache_wincache.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Wincache Caching Class\n *\n * Read more about Wincache functions here:\n * https://www.php.net/manual/en/ref.wincache.php\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tCore\n * @author\t\tMike Murkovic\n * @link\n */\nclass CI_Cache_wincache extends CI_Driver {\n\n\t/**\n\t * Class constructor\n\t *\n\t * Only present so that an error message is logged\n\t * if APC is not available.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tif ( ! $this->is_supported())\n\t\t{\n\t\t\tlog_message('error', 'Cache: Failed to initialize Wincache; extension not loaded/enabled?');\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get\n\t *\n\t * Look for a value in the cache. If it exists, return the data,\n\t * if not, return FALSE\n\t *\n\t * @param\tstring\t$id\tCache Ide\n\t * @return\tmixed\tValue that is stored/FALSE on failure\n\t */\n\tpublic function get($id)\n\t{\n\t\t$success = FALSE;\n\t\t$data = wincache_ucache_get($id, $success);\n\n\t\t// Success returned by reference from wincache_ucache_get()\n\t\treturn ($success) ? $data : FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Save\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tmixed\t$data\tData to store\n\t * @param\tint\t$ttl\tTime to live (in seconds)\n\t * @param\tbool\t$raw\tWhether to store the raw value (unused)\n\t * @return\tbool\ttrue on success/false on failure\n\t */\n\tpublic function save($id, $data, $ttl = 60, $raw = FALSE)\n\t{\n\t\treturn wincache_ucache_set($id, $data, $ttl);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Delete from Cache\n\t *\n\t * @param\tmixed\tunique identifier of the item in the cache\n\t * @return\tbool\ttrue on success/false on failure\n\t */\n\tpublic function delete($id)\n\t{\n\t\treturn wincache_ucache_delete($id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Increment a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to add\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function increment($id, $offset = 1)\n\t{\n\t\t$success = FALSE;\n\t\t$value = wincache_ucache_inc($id, $offset, $success);\n\n\t\treturn ($success === TRUE) ? $value : FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Decrement a raw value\n\t *\n\t * @param\tstring\t$id\tCache ID\n\t * @param\tint\t$offset\tStep/value to reduce by\n\t * @return\tmixed\tNew value on success or FALSE on failure\n\t */\n\tpublic function decrement($id, $offset = 1)\n\t{\n\t\t$success = FALSE;\n\t\t$value = wincache_ucache_dec($id, $offset, $success);\n\n\t\treturn ($success === TRUE) ? $value : FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Clean the cache\n\t *\n\t * @return\tbool\tfalse on failure/true on success\n\t */\n\tpublic function clean()\n\t{\n\t\treturn wincache_ucache_clear();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cache Info\n\t *\n\t * @return\tmixed\tarray on success, false on failure\n\t */\n\tpublic function cache_info()\n\t{\n\t\treturn wincache_ucache_info(TRUE);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get Cache Metadata\n\t *\n\t * @param\tmixed\tkey to get cache metadata on\n\t * @return\tmixed\tarray on success/false on failure\n\t */\n\tpublic function get_metadata($id)\n\t{\n\t\tif ($stored = wincache_ucache_info(FALSE, $id))\n\t\t{\n\t\t\t$age = $stored['ucache_entries'][1]['age_seconds'];\n\t\t\t$ttl = $stored['ucache_entries'][1]['ttl_seconds'];\n\t\t\t$hitcount = $stored['ucache_entries'][1]['hitcount'];\n\n\t\t\treturn array(\n\t\t\t\t'expire'\t=> $ttl - $age,\n\t\t\t\t'hitcount'\t=> $hitcount,\n\t\t\t\t'age'\t\t=> $age,\n\t\t\t\t'ttl'\t\t=> $ttl\n\t\t\t);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * is_supported()\n\t *\n\t * Check to see if WinCache is available on this system, bail if it isn't.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_supported()\n\t{\n\t\treturn (extension_loaded('wincache') && ini_get('wincache.ucenabled'));\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Cache/drivers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/libraries/Cache/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/libraries/Calendar.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Calendar Class\n *\n * This class enables the creation of calendars\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/calendar.html\n */\nclass CI_Calendar {\n\n\t/**\n\t * Calendar layout template\n\t *\n\t * @var mixed\n\t */\n\tpublic $template = '';\n\n\t/**\n\t * Replacements array for template\n\t *\n\t * @var array\n\t */\n\tpublic $replacements = array();\n\n\t/**\n\t * Day of the week to start the calendar on\n\t *\n\t * @var string\n\t */\n\tpublic $start_day = 'sunday';\n\n\t/**\n\t * How to display months\n\t *\n\t * @var string\n\t */\n\tpublic $month_type = 'long';\n\n\t/**\n\t * How to display names of days\n\t *\n\t * @var string\n\t */\n\tpublic $day_type = 'abr';\n\n\t/**\n\t * Whether to show next/prev month links\n\t *\n\t * @var bool\n\t */\n\tpublic $show_next_prev = FALSE;\n\n\t/**\n\t * Url base to use for next/prev month links\n\t *\n\t * @var bool\n\t */\n\tpublic $next_prev_url = '';\n\n\t/**\n\t * Show days of other months\n\t *\n\t * @var bool\n\t */\n\tpublic $show_other_days = FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * CI Singleton\n\t *\n\t * @var object\n\t */\n\tprotected $CI;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Loads the calendar language file and sets the default time reference.\n\t *\n\t * @uses\tCI_Lang::$is_loaded\n\t *\n\t * @param\tarray\t$config\tCalendar options\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\t$this->CI =& get_instance();\n\t\t$this->CI->lang->load('calendar');\n\n\t\tempty($config) OR $this->initialize($config);\n\n\t\tlog_message('info', 'Calendar Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize the user preferences\n\t *\n\t * Accepts an associative array as input, containing display preferences\n\t *\n\t * @param\tarray\tconfig preferences\n\t * @return\tCI_Calendar\n\t */\n\tpublic function initialize($config = array())\n\t{\n\t\tforeach ($config as $key => $val)\n\t\t{\n\t\t\tif (isset($this->$key))\n\t\t\t{\n\t\t\t\t$this->$key = $val;\n\t\t\t}\n\t\t}\n\n\t\t// Set the next_prev_url to the controller if required but not defined\n\t\tif ($this->show_next_prev === TRUE && empty($this->next_prev_url))\n\t\t{\n\t\t\t$this->next_prev_url = $this->CI->config->site_url($this->CI->router->class.'/'.$this->CI->router->method);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate the calendar\n\t *\n\t * @param\tint\tthe year\n\t * @param\tint\tthe month\n\t * @param\tarray\tthe data to be shown in the calendar cells\n\t * @return\tstring\n\t */\n\tpublic function generate($year = '', $month = '', $data = array())\n\t{\n\t\t$local_time = time();\n\n\t\t// Set and validate the supplied month/year\n\t\tif (empty($year))\n\t\t{\n\t\t\t$year = date('Y', $local_time);\n\t\t}\n\t\telseif (strlen($year) === 1)\n\t\t{\n\t\t\t$year = '200'.$year;\n\t\t}\n\t\telseif (strlen($year) === 2)\n\t\t{\n\t\t\t$year = '20'.$year;\n\t\t}\n\n\t\tif (empty($month))\n\t\t{\n\t\t\t$month = date('m', $local_time);\n\t\t}\n\t\telseif (strlen($month) === 1)\n\t\t{\n\t\t\t$month = '0'.$month;\n\t\t}\n\n\t\t$adjusted_date = $this->adjust_date($month, $year);\n\n\t\t$month\t= $adjusted_date['month'];\n\t\t$year\t= $adjusted_date['year'];\n\n\t\t// Determine the total days in the month\n\t\t$total_days = $this->get_total_days($month, $year);\n\n\t\t// Set the starting day of the week\n\t\t$start_days\t= array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);\n\t\t$start_day\t= isset($start_days[$this->start_day]) ? $start_days[$this->start_day] : 0;\n\n\t\t// Set the starting day number\n\t\t$local_date = mktime(12, 0, 0, $month, 1, $year);\n\t\t$date = getdate($local_date);\n\t\t$day  = $start_day + 1 - $date['wday'];\n\n\t\twhile ($day > 1)\n\t\t{\n\t\t\t$day -= 7;\n\t\t}\n\n\t\t// Set the current month/year/day\n\t\t// We use this to determine the \"today\" date\n\t\t$cur_year\t= date('Y', $local_time);\n\t\t$cur_month\t= date('m', $local_time);\n\t\t$cur_day\t= date('j', $local_time);\n\n\t\t$is_current_month = ($cur_year == $year && $cur_month == $month);\n\n\t\t// Generate the template data array\n\t\t$this->parse_template();\n\n\t\t// Begin building the calendar output\n\t\t$out = $this->replacements['table_open'].\"\\n\\n\".$this->replacements['heading_row_start'].\"\\n\";\n\n\t\t// \"previous\" month link\n\t\tif ($this->show_next_prev === TRUE)\n\t\t{\n\t\t\t// Add a trailing slash to the URL if needed\n\t\t\t$this->next_prev_url = preg_replace('/(.+?)\\/*$/', '\\\\1/', $this->next_prev_url);\n\n\t\t\t$adjusted_date = $this->adjust_date($month - 1, $year);\n\t\t\t$out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_previous_cell']).\"\\n\";\n\t\t}\n\n\t\t// Heading containing the month/year\n\t\t$colspan = ($this->show_next_prev === TRUE) ? 5 : 7;\n\n\t\t$this->replacements['heading_title_cell'] = str_replace('{colspan}', $colspan,\n\t\t\t\t\t\t\t\tstr_replace('{heading}', $this->get_month_name($month).'&nbsp;'.$year, $this->replacements['heading_title_cell']));\n\n\t\t$out .= $this->replacements['heading_title_cell'].\"\\n\";\n\n\t\t// \"next\" month link\n\t\tif ($this->show_next_prev === TRUE)\n\t\t{\n\t\t\t$adjusted_date = $this->adjust_date($month + 1, $year);\n\t\t\t$out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_next_cell']);\n\t\t}\n\n\t\t$out .= \"\\n\".$this->replacements['heading_row_end'].\"\\n\\n\"\n\t\t\t// Write the cells containing the days of the week\n\t\t\t.$this->replacements['week_row_start'].\"\\n\";\n\n\t\t$day_names = $this->get_day_names();\n\n\t\tfor ($i = 0; $i < 7; $i ++)\n\t\t{\n\t\t\t$out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->replacements['week_day_cell']);\n\t\t}\n\n\t\t$out .= \"\\n\".$this->replacements['week_row_end'].\"\\n\";\n\n\t\t// Build the main body of the calendar\n\t\twhile ($day <= $total_days)\n\t\t{\n\t\t\t$out .= \"\\n\".$this->replacements['cal_row_start'].\"\\n\";\n\n\t\t\tfor ($i = 0; $i < 7; $i++)\n\t\t\t{\n\t\t\t\tif ($day > 0 && $day <= $total_days)\n\t\t\t\t{\n\t\t\t\t\t$out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start'];\n\n\t\t\t\t\tif (isset($data[$day]))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Cells with content\n\t\t\t\t\t\t$temp = ($is_current_month === TRUE && $day == $cur_day) ?\n\t\t\t\t\t\t\t\t$this->replacements['cal_cell_content_today'] : $this->replacements['cal_cell_content'];\n\t\t\t\t\t\t$out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Cells with no content\n\t\t\t\t\t\t$temp = ($is_current_month === TRUE && $day == $cur_day) ?\n\t\t\t\t\t\t\t\t$this->replacements['cal_cell_no_content_today'] : $this->replacements['cal_cell_no_content'];\n\t\t\t\t\t\t$out .= str_replace('{day}', $day, $temp);\n\t\t\t\t\t}\n\n\t\t\t\t\t$out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_end_today'] : $this->replacements['cal_cell_end'];\n\t\t\t\t}\n\t\t\t\telseif ($this->show_other_days === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$out .= $this->replacements['cal_cell_start_other'];\n\n\t\t\t\t\tif ($day <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Day of previous month\n\t\t\t\t\t\t$prev_month = $this->adjust_date($month - 1, $year);\n\t\t\t\t\t\t$prev_month_days = $this->get_total_days($prev_month['month'], $prev_month['year']);\n\t\t\t\t\t\t$out .= str_replace('{day}', $prev_month_days + $day, $this->replacements['cal_cell_other']);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Day of next month\n\t\t\t\t\t\t$out .= str_replace('{day}', $day - $total_days, $this->replacements['cal_cell_other']);\n\t\t\t\t\t}\n\n\t\t\t\t\t$out .= $this->replacements['cal_cell_end_other'];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Blank cells\n\t\t\t\t\t$out .= $this->replacements['cal_cell_start'].$this->replacements['cal_cell_blank'].$this->replacements['cal_cell_end'];\n\t\t\t\t}\n\n\t\t\t\t$day++;\n\t\t\t}\n\n\t\t\t$out .= \"\\n\".$this->replacements['cal_row_end'].\"\\n\";\n\t\t}\n\n\t\treturn $out .= \"\\n\".$this->replacements['table_close'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Month Name\n\t *\n\t * Generates a textual month name based on the numeric\n\t * month provided.\n\t *\n\t * @param\tint\tthe month\n\t * @return\tstring\n\t */\n\tpublic function get_month_name($month)\n\t{\n\t\tif ($this->month_type === 'short')\n\t\t{\n\t\t\t$month_names = array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');\n\t\t}\n\n\t\treturn ($this->CI->lang->line($month_names[$month]) === FALSE)\n\t\t\t? ucfirst(substr($month_names[$month], 4))\n\t\t\t: $this->CI->lang->line($month_names[$month]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Day Names\n\t *\n\t * Returns an array of day names (Sunday, Monday, etc.) based\n\t * on the type. Options: long, short, abr\n\t *\n\t * @param\tstring\n\t * @return\tarray\n\t */\n\tpublic function get_day_names($day_type = '')\n\t{\n\t\tif ($day_type !== '')\n\t\t{\n\t\t\t$this->day_type = $day_type;\n\t\t}\n\n\t\tif ($this->day_type === 'long')\n\t\t{\n\t\t\t$day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');\n\t\t}\n\t\telseif ($this->day_type === 'short')\n\t\t{\n\t\t\t$day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');\n\t\t}\n\n\t\t$days = array();\n\t\tfor ($i = 0, $c = count($day_names); $i < $c; $i++)\n\t\t{\n\t\t\t$days[] = ($this->CI->lang->line('cal_'.$day_names[$i]) === FALSE) ? ucfirst($day_names[$i]) : $this->CI->lang->line('cal_'.$day_names[$i]);\n\t\t}\n\n\t\treturn $days;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Adjust Date\n\t *\n\t * This function makes sure that we have a valid month/year.\n\t * For example, if you submit 13 as the month, the year will\n\t * increment and the month will become January.\n\t *\n\t * @param\tint\tthe month\n\t * @param\tint\tthe year\n\t * @return\tarray\n\t */\n\tpublic function adjust_date($month, $year)\n\t{\n\t\t$date = array();\n\n\t\t$date['month']\t= $month;\n\t\t$date['year']\t= $year;\n\n\t\twhile ($date['month'] > 12)\n\t\t{\n\t\t\t$date['month'] -= 12;\n\t\t\t$date['year']++;\n\t\t}\n\n\t\twhile ($date['month'] <= 0)\n\t\t{\n\t\t\t$date['month'] += 12;\n\t\t\t$date['year']--;\n\t\t}\n\n\t\tif (strlen($date['month']) === 1)\n\t\t{\n\t\t\t$date['month'] = '0'.$date['month'];\n\t\t}\n\n\t\treturn $date;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Total days in a given month\n\t *\n\t * @param\tint\tthe month\n\t * @param\tint\tthe year\n\t * @return\tint\n\t */\n\tpublic function get_total_days($month, $year)\n\t{\n\t\t$this->CI->load->helper('date');\n\t\treturn days_in_month($month, $year);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Default Template Data\n\t *\n\t * This is used in the event that the user has not created their own template\n\t *\n\t * @return\tarray\n\t */\n\tpublic function default_template()\n\t{\n\t\treturn array(\n\t\t\t'table_open'\t\t\t\t=> '<table border=\"0\" cellpadding=\"4\" cellspacing=\"0\">',\n\t\t\t'heading_row_start'\t\t\t=> '<tr>',\n\t\t\t'heading_previous_cell'\t\t=> '<th><a href=\"{previous_url}\">&lt;&lt;</a></th>',\n\t\t\t'heading_title_cell'\t\t=> '<th colspan=\"{colspan}\">{heading}</th>',\n\t\t\t'heading_next_cell'\t\t\t=> '<th><a href=\"{next_url}\">&gt;&gt;</a></th>',\n\t\t\t'heading_row_end'\t\t\t=> '</tr>',\n\t\t\t'week_row_start'\t\t\t=> '<tr>',\n\t\t\t'week_day_cell'\t\t\t\t=> '<td>{week_day}</td>',\n\t\t\t'week_row_end'\t\t\t\t=> '</tr>',\n\t\t\t'cal_row_start'\t\t\t\t=> '<tr>',\n\t\t\t'cal_cell_start'\t\t\t=> '<td>',\n\t\t\t'cal_cell_start_today'\t\t=> '<td>',\n\t\t\t'cal_cell_start_other'\t\t=> '<td style=\"color: #666;\">',\n\t\t\t'cal_cell_content'\t\t\t=> '<a href=\"{content}\">{day}</a>',\n\t\t\t'cal_cell_content_today'\t=> '<a href=\"{content}\"><strong>{day}</strong></a>',\n\t\t\t'cal_cell_no_content'\t\t=> '{day}',\n\t\t\t'cal_cell_no_content_today'\t=> '<strong>{day}</strong>',\n\t\t\t'cal_cell_blank'\t\t\t=> '&nbsp;',\n\t\t\t'cal_cell_other'\t\t\t=> '{day}',\n\t\t\t'cal_cell_end'\t\t\t\t=> '</td>',\n\t\t\t'cal_cell_end_today'\t\t=> '</td>',\n\t\t\t'cal_cell_end_other'\t\t=> '</td>',\n\t\t\t'cal_row_end'\t\t\t\t=> '</tr>',\n\t\t\t'table_close'\t\t\t\t=> '</table>'\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse Template\n\t *\n\t * Harvests the data within the template {pseudo-variables}\n\t * used to display the calendar\n\t *\n\t * @return\tCI_Calendar\n\t */\n\tpublic function parse_template()\n\t{\n\t\t$this->replacements = $this->default_template();\n\n\t\tif (empty($this->template))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\n\t\tif (is_string($this->template))\n\t\t{\n\t\t\t$today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');\n\n\t\t\tforeach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today', 'cal_cell_start_other', 'cal_cell_other', 'cal_cell_end_other') as $val)\n\t\t\t{\n\t\t\t\tif (preg_match('/\\{'.$val.'\\}(.*?)\\{\\/'.$val.'\\}/si', $this->template, $match))\n\t\t\t\t{\n\t\t\t\t\t$this->replacements[$val] = $match[1];\n\t\t\t\t}\n\t\t\t\telseif (in_array($val, $today, TRUE))\n\t\t\t\t{\n\t\t\t\t\t$this->replacements[$val] = $this->replacements[substr($val, 0, -6)];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telseif (is_array($this->template))\n\t\t{\n\t\t\t$this->replacements = array_merge($this->replacements, $this->template);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Cart.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Shopping Cart Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tShopping Cart\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/cart.html\n * @deprecated\t3.0.0\tThis class is too specific for CI.\n */\nclass CI_Cart {\n\n\t/**\n\t * These are the regular expression rules that we use to validate the product ID and product name\n\t * alpha-numeric, dashes, underscores, or periods\n\t *\n\t * @var string\n\t */\n\tpublic $product_id_rules = '\\.a-z0-9_-';\n\n\t/**\n\t * These are the regular expression rules that we use to validate the product ID and product name\n\t * alpha-numeric, dashes, underscores, colons or periods\n\t *\n\t * @var string\n\t */\n\tpublic $product_name_rules = '\\w \\-\\.\\:';\n\n\t/**\n\t * only allow safe product names\n\t *\n\t * @var bool\n\t */\n\tpublic $product_name_safe = TRUE;\n\n\t// --------------------------------------------------------------------------\n\n\t/**\n\t * Reference to CodeIgniter instance\n\t *\n\t * @var object\n\t */\n\tprotected $CI;\n\n\t/**\n\t * Contents of the cart\n\t *\n\t * @var array\n\t */\n\tprotected $_cart_contents = array();\n\n\t/**\n\t * Shopping Class Constructor\n\t *\n\t * The constructor loads the Session class, used to store the shopping cart contents.\n\t *\n\t * @param\tarray\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params = array())\n\t{\n\t\t// Set the super object to a local variable for use later\n\t\t$this->CI =& get_instance();\n\n\t\t// Are any config settings being passed manually?  If so, set them\n\t\t$config = is_array($params) ? $params : array();\n\n\t\t// Load the Sessions class\n\t\t$this->CI->load->driver('session', $config);\n\n\t\t// Grab the shopping cart array from the session table\n\t\t$this->_cart_contents = $this->CI->session->userdata('cart_contents');\n\t\tif ($this->_cart_contents === NULL)\n\t\t{\n\t\t\t// No cart exists so we'll set some base values\n\t\t\t$this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);\n\t\t}\n\n\t\tlog_message('info', 'Cart Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert items into the cart and save it to the session table\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tpublic function insert($items = array())\n\t{\n\t\t// Was any cart data passed? No? Bah...\n\t\tif ( ! is_array($items) OR count($items) === 0)\n\t\t{\n\t\t\tlog_message('error', 'The insert method must be passed an array containing data.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// You can either insert a single product using a one-dimensional array,\n\t\t// or multiple products using a multi-dimensional one. The way we\n\t\t// determine the array type is by looking for a required array key named \"id\"\n\t\t// at the top level. If it's not found, we will assume it's a multi-dimensional array.\n\n\t\t$save_cart = FALSE;\n\t\tif (isset($items['id']))\n\t\t{\n\t\t\tif (($rowid = $this->_insert($items)))\n\t\t\t{\n\t\t\t\t$save_cart = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach ($items as $val)\n\t\t\t{\n\t\t\t\tif (is_array($val) && isset($val['id']))\n\t\t\t\t{\n\t\t\t\t\tif ($this->_insert($val))\n\t\t\t\t\t{\n\t\t\t\t\t\t$save_cart = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Save the cart data if the insert was successful\n\t\tif ($save_cart === TRUE)\n\t\t{\n\t\t\t$this->_save_cart();\n\t\t\treturn isset($rowid) ? $rowid : TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Insert\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tprotected function _insert($items = array())\n\t{\n\t\t// Was any cart data passed? No? Bah...\n\t\tif ( ! is_array($items) OR count($items) === 0)\n\t\t{\n\t\t\tlog_message('error', 'The insert method must be passed an array containing data.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Does the $items array contain an id, quantity, price, and name?  These are required\n\t\tif ( ! isset($items['id'], $items['qty'], $items['price'], $items['name']))\n\t\t{\n\t\t\tlog_message('error', 'The cart array must contain a product ID, quantity, price, and name.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Prep the quantity. It can only be a number.  Duh... also trim any leading zeros\n\t\t$items['qty'] = (float) $items['qty'];\n\n\t\t// If the quantity is zero or blank there's nothing for us to do\n\t\tif ($items['qty'] == 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods\n\t\t// Not totally sure we should impose this rule, but it seems prudent to standardize IDs.\n\t\t// Note: These can be user-specified by setting the $this->product_id_rules variable.\n\t\tif ( ! preg_match('/^['.$this->product_id_rules.']+$/i', $items['id']))\n\t\t{\n\t\t\tlog_message('error', 'Invalid product ID.  The product ID can only contain alpha-numeric characters, dashes, and underscores');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods.\n\t\t// Note: These can be user-specified by setting the $this->product_name_rules variable.\n\t\tif ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $items['name']))\n\t\t{\n\t\t\tlog_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Prep the price. Remove leading zeros and anything that isn't a number or decimal point.\n\t\t$items['price'] = (float) $items['price'];\n\n\t\t// We now need to create a unique identifier for the item being inserted into the cart.\n\t\t// Every time something is added to the cart it is stored in the master cart array.\n\t\t// Each row in the cart array, however, must have a unique index that identifies not only\n\t\t// a particular product, but makes it possible to store identical products with different options.\n\t\t// For example, what if someone buys two identical t-shirts (same product ID), but in\n\t\t// different sizes?  The product ID (and other attributes, like the name) will be identical for\n\t\t// both sizes because it's the same shirt. The only difference will be the size.\n\t\t// Internally, we need to treat identical submissions, but with different options, as a unique product.\n\t\t// Our solution is to convert the options array to a string and MD5 it along with the product ID.\n\t\t// This becomes the unique \"row ID\"\n\t\tif (isset($items['options']) && count($items['options']) > 0)\n\t\t{\n\t\t\t$rowid = md5($items['id'].serialize($items['options']));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// No options were submitted so we simply MD5 the product ID.\n\t\t\t// Technically, we don't need to MD5 the ID in this case, but it makes\n\t\t\t// sense to standardize the format of array indexes for both conditions\n\t\t\t$rowid = md5($items['id']);\n\t\t}\n\n\t\t// --------------------------------------------------------------------\n\n\t\t// Now that we have our unique \"row ID\", we'll add our cart items to the master array\n\t\t// grab quantity if it's already there and add it on\n\t\t$old_quantity = isset($this->_cart_contents[$rowid]['qty']) ? (int) $this->_cart_contents[$rowid]['qty'] : 0;\n\n\t\t// Re-create the entry, just to make sure our index contains only the data from this submission\n\t\t$items['rowid'] = $rowid;\n\t\t$items['qty'] += $old_quantity;\n\t\t$this->_cart_contents[$rowid] = $items;\n\n\t\treturn $rowid;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update the cart\n\t *\n\t * This function permits the quantity of a given item to be changed.\n\t * Typically it is called from the \"view cart\" page if a user makes\n\t * changes to the quantity before checkout. That array must contain the\n\t * product ID and quantity for each item.\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tpublic function update($items = array())\n\t{\n\t\t// Was any cart data passed?\n\t\tif ( ! is_array($items) OR count($items) === 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// You can either update a single product using a one-dimensional array,\n\t\t// or multiple products using a multi-dimensional one.  The way we\n\t\t// determine the array type is by looking for a required array key named \"rowid\".\n\t\t// If it's not found we assume it's a multi-dimensional array\n\t\t$save_cart = FALSE;\n\t\tif (isset($items['rowid']))\n\t\t{\n\t\t\tif ($this->_update($items) === TRUE)\n\t\t\t{\n\t\t\t\t$save_cart = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach ($items as $val)\n\t\t\t{\n\t\t\t\tif (is_array($val) && isset($val['rowid']))\n\t\t\t\t{\n\t\t\t\t\tif ($this->_update($val) === TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$save_cart = TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Save the cart data if the insert was successful\n\t\tif ($save_cart === TRUE)\n\t\t{\n\t\t\t$this->_save_cart();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update the cart\n\t *\n\t * This function permits changing item properties.\n\t * Typically it is called from the \"view cart\" page if a user makes\n\t * changes to the quantity before checkout. That array must contain the\n\t * rowid and quantity for each item.\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tprotected function _update($items = array())\n\t{\n\t\t// Without these array indexes there is nothing we can do\n\t\tif ( ! isset($items['rowid'], $this->_cart_contents[$items['rowid']]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Prep the quantity\n\t\tif (isset($items['qty']))\n\t\t{\n\t\t\t$items['qty'] = (float) $items['qty'];\n\t\t\t// Is the quantity zero?  If so we will remove the item from the cart.\n\t\t\t// If the quantity is greater than zero we are updating\n\t\t\tif ($items['qty'] == 0)\n\t\t\t{\n\t\t\t\tunset($this->_cart_contents[$items['rowid']]);\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t\t// find updatable keys\n\t\t$keys = array_intersect(array_keys($this->_cart_contents[$items['rowid']]), array_keys($items));\n\t\t// if a price was passed, make sure it contains valid data\n\t\tif (isset($items['price']))\n\t\t{\n\t\t\t$items['price'] = (float) $items['price'];\n\t\t}\n\n\t\t// product id & name shouldn't be changed\n\t\tforeach (array_diff($keys, array('id', 'name')) as $key)\n\t\t{\n\t\t\t$this->_cart_contents[$items['rowid']][$key] = $items[$key];\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Save the cart array to the session DB\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _save_cart()\n\t{\n\t\t// Let's add up the individual prices and set the cart sub-total\n\t\t$this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0;\n\t\tforeach ($this->_cart_contents as $key => $val)\n\t\t{\n\t\t\t// We make sure the array contains the proper indexes\n\t\t\tif ( ! is_array($val) OR ! isset($val['price'], $val['qty']))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$this->_cart_contents['cart_total'] += ($val['price'] * $val['qty']);\n\t\t\t$this->_cart_contents['total_items'] += $val['qty'];\n\t\t\t$this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']);\n\t\t}\n\n\t\t// Is our cart empty? If so we delete it from the session\n\t\tif (count($this->_cart_contents) <= 2)\n\t\t{\n\t\t\t$this->CI->session->unset_userdata('cart_contents');\n\n\t\t\t// Nothing more to do... coffee time!\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// If we made it this far it means that our cart has data.\n\t\t// Let's pass it to the Session class so it can be stored\n\t\t$this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents));\n\n\t\t// Woot!\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Cart Total\n\t *\n\t * @return\tint\n\t */\n\tpublic function total()\n\t{\n\t\treturn $this->_cart_contents['cart_total'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Remove Item\n\t *\n\t * Removes an item from the cart\n\t *\n\t * @param\tint\n\t * @return\tbool\n\t */\n\t public function remove($rowid)\n\t {\n\t\t// unset & save\n\t\tunset($this->_cart_contents[$rowid]);\n\t\t$this->_save_cart();\n\t\treturn TRUE;\n\t }\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Total Items\n\t *\n\t * Returns the total item count\n\t *\n\t * @return\tint\n\t */\n\tpublic function total_items()\n\t{\n\t\treturn $this->_cart_contents['total_items'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Cart Contents\n\t *\n\t * Returns the entire cart array\n\t *\n\t * @param\tbool\n\t * @return\tarray\n\t */\n\tpublic function contents($newest_first = FALSE)\n\t{\n\t\t// do we want the newest first?\n\t\t$cart = ($newest_first) ? array_reverse($this->_cart_contents) : $this->_cart_contents;\n\n\t\t// Remove these so they don't create a problem when showing the cart table\n\t\tunset($cart['total_items']);\n\t\tunset($cart['cart_total']);\n\n\t\treturn $cart;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get cart item\n\t *\n\t * Returns the details of a specific item in the cart\n\t *\n\t * @param\tstring\t$row_id\n\t * @return\tarray\n\t */\n\tpublic function get_item($row_id)\n\t{\n\t\treturn (in_array($row_id, array('total_items', 'cart_total'), TRUE) OR ! isset($this->_cart_contents[$row_id]))\n\t\t\t? FALSE\n\t\t\t: $this->_cart_contents[$row_id];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Has options\n\t *\n\t * Returns TRUE if the rowid passed to this function correlates to an item\n\t * that has options associated with it.\n\t *\n\t * @param\tstring\t$row_id = ''\n\t * @return\tbool\n\t */\n\tpublic function has_options($row_id = '')\n\t{\n\t\treturn (isset($this->_cart_contents[$row_id]['options']) && count($this->_cart_contents[$row_id]['options']) !== 0);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Product options\n\t *\n\t * Returns the an array of options, for a particular product row ID\n\t *\n\t * @param\tstring\t$row_id = ''\n\t * @return\tarray\n\t */\n\tpublic function product_options($row_id = '')\n\t{\n\t\treturn isset($this->_cart_contents[$row_id]['options']) ? $this->_cart_contents[$row_id]['options'] : array();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Format Number\n\t *\n\t * Returns the supplied number with commas and a decimal point.\n\t *\n\t * @param\tfloat\n\t * @return\tstring\n\t */\n\tpublic function format_number($n = '')\n\t{\n\t\treturn ($n === '') ? '' : number_format( (float) $n, 2, '.', ',');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Destroy the cart\n\t *\n\t * Empties the cart and kills the session\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function destroy()\n\t{\n\t\t$this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);\n\t\t$this->CI->session->unset_userdata('cart_contents');\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Driver Library Class\n *\n * This class enables you to create \"Driver\" libraries that add runtime ability\n * to extend the capabilities of a class via additional driver objects\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Driver_Library {\n\n\t/**\n\t * Array of drivers that are available to use with the driver class\n\t *\n\t * @var array\n\t */\n\tprotected $valid_drivers = array();\n\n\t/**\n\t * Name of the current class - usually the driver class\n\t *\n\t * @var string\n\t */\n\tprotected $lib_name;\n\n\t/**\n\t * Get magic method\n\t *\n\t * The first time a child is used it won't exist, so we instantiate it\n\t * subsequents calls will go straight to the proper child.\n\t *\n\t * @param\tstring\tChild class name\n\t * @return\tobject\tChild class\n\t */\n\tpublic function __get($child)\n\t{\n\t\t// Try to load the driver\n\t\treturn $this->load_driver($child);\n\t}\n\n\t/**\n\t * Load driver\n\t *\n\t * Separate load_driver call to support explicit driver load by library or user\n\t *\n\t * @param\tstring\tDriver name (w/o parent prefix)\n\t * @return\tobject\tChild class\n\t */\n\tpublic function load_driver($child)\n\t{\n\t\t// Get CodeIgniter instance and subclass prefix\n\t\t$prefix = config_item('subclass_prefix');\n\n\t\tif ( ! isset($this->lib_name))\n\t\t{\n\t\t\t// Get library name without any prefix\n\t\t\t$this->lib_name = str_replace(array('CI_', $prefix), '', get_class($this));\n\t\t}\n\n\t\t// The child will be prefixed with the parent lib\n\t\t$child_name = $this->lib_name.'_'.$child;\n\n\t\t// See if requested child is a valid driver\n\t\tif ( ! in_array($child, $this->valid_drivers))\n\t\t{\n\t\t\t// The requested driver isn't valid!\n\t\t\t$msg = 'Invalid driver requested: '.$child_name;\n\t\t\tlog_message('error', $msg);\n\t\t\tshow_error($msg);\n\t\t}\n\n\t\t// Get package paths and filename case variations to search\n\t\t$CI = get_instance();\n\t\t$paths = $CI->load->get_package_paths(TRUE);\n\n\t\t// Is there an extension?\n\t\t$class_name = $prefix.$child_name;\n\t\t$found = class_exists($class_name, FALSE);\n\t\tif ( ! $found)\n\t\t{\n\t\t\t// Check for subclass file\n\t\t\tforeach ($paths as $path)\n\t\t\t{\n\t\t\t\t// Does the file exist?\n\t\t\t\t$file = $path.'libraries/'.$this->lib_name.'/drivers/'.$prefix.$child_name.'.php';\n\t\t\t\tif (file_exists($file))\n\t\t\t\t{\n\t\t\t\t\t// Yes - require base class from BASEPATH\n\t\t\t\t\t$basepath = BASEPATH.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php';\n\t\t\t\t\tif ( ! file_exists($basepath))\n\t\t\t\t\t{\n\t\t\t\t\t\t$msg = 'Unable to load the requested class: CI_'.$child_name;\n\t\t\t\t\t\tlog_message('error', $msg);\n\t\t\t\t\t\tshow_error($msg);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Include both sources and mark found\n\t\t\t\t\tinclude_once($basepath);\n\t\t\t\t\tinclude_once($file);\n\t\t\t\t\t$found = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Do we need to search for the class?\n\t\tif ( ! $found)\n\t\t{\n\t\t\t// Use standard class name\n\t\t\t$class_name = 'CI_'.$child_name;\n\t\t\tif ( ! class_exists($class_name, FALSE))\n\t\t\t{\n\t\t\t\t// Check package paths\n\t\t\t\tforeach ($paths as $path)\n\t\t\t\t{\n\t\t\t\t\t// Does the file exist?\n\t\t\t\t\t$file = $path.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php';\n\t\t\t\t\tif (file_exists($file))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Include source\n\t\t\t\t\t\tinclude_once($file);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Did we finally find the class?\n\t\tif ( ! class_exists($class_name, FALSE))\n\t\t{\n\t\t\tif (class_exists($child_name, FALSE))\n\t\t\t{\n\t\t\t\t$class_name = $child_name;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$msg = 'Unable to load the requested driver: '.$class_name;\n\t\t\t\tlog_message('error', $msg);\n\t\t\t\tshow_error($msg);\n\t\t\t}\n\t\t}\n\n\t\t// Instantiate, decorate and add child\n\t\t$obj = new $class_name();\n\t\t$obj->decorate($this);\n\t\t$this->$child = $obj;\n\t\treturn $this->$child;\n\t}\n\n}\n\n// --------------------------------------------------------------------------\n\n/**\n * CodeIgniter Driver Class\n *\n * This class enables you to create drivers for a Library based on the Driver Library.\n * It handles the drivers' access to the parent library\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\n */\nclass CI_Driver {\n\n\t/**\n\t * Instance of the parent class\n\t *\n\t * @var object\n\t */\n\tprotected $_parent;\n\n\t/**\n\t * List of methods in the parent class\n\t *\n\t * @var array\n\t */\n\tprotected $_methods = array();\n\n\t/**\n\t * List of properties in the parent class\n\t *\n\t * @var array\n\t */\n\tprotected $_properties = array();\n\n\t/**\n\t * Array of methods and properties for the parent class(es)\n\t *\n\t * @static\n\t * @var\tarray\n\t */\n\tprotected static $_reflections = array();\n\n\t/**\n\t * Decorate\n\t *\n\t * Decorates the child with the parent driver lib's methods and properties\n\t *\n\t * @param\tobject\n\t * @return\tvoid\n\t */\n\tpublic function decorate($parent)\n\t{\n\t\t$this->_parent = $parent;\n\n\t\t// Lock down attributes to what is defined in the class\n\t\t// and speed up references in magic methods\n\n\t\t$class_name = get_class($parent);\n\n\t\tif ( ! isset(self::$_reflections[$class_name]))\n\t\t{\n\t\t\t$r = new ReflectionObject($parent);\n\n\t\t\tforeach ($r->getMethods() as $method)\n\t\t\t{\n\t\t\t\tif ($method->isPublic())\n\t\t\t\t{\n\t\t\t\t\t$this->_methods[] = $method->getName();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tforeach ($r->getProperties() as $prop)\n\t\t\t{\n\t\t\t\tif ($prop->isPublic())\n\t\t\t\t{\n\t\t\t\t\t$this->_properties[] = $prop->getName();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tself::$_reflections[$class_name] = array($this->_methods, $this->_properties);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlist($this->_methods, $this->_properties) = self::$_reflections[$class_name];\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * __call magic method\n\t *\n\t * Handles access to the parent driver library's methods\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @return\tmixed\n\t */\n\tpublic function __call($method, $args = array())\n\t{\n\t\tif (in_array($method, $this->_methods))\n\t\t{\n\t\t\treturn call_user_func_array(array($this->_parent, $method), $args);\n\t\t}\n\n\t\tthrow new BadMethodCallException('No such method: '.$method.'()');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * __get magic method\n\t *\n\t * Handles reading of the parent driver library's properties\n\t *\n\t * @param\tstring\n\t * @return\tmixed\n\t */\n\tpublic function __get($var)\n\t{\n\t\tif (in_array($var, $this->_properties))\n\t\t{\n\t\t\treturn $this->_parent->$var;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * __set magic method\n\t *\n\t * Handles writing to the parent driver library's properties\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @return\tmixed\n\t */\n\tpublic function __set($var, $val)\n\t{\n\t\tif (in_array($var, $this->_properties))\n\t\t{\n\t\t\t$this->_parent->$var = $val;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Email.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Email Class\n *\n * Permits email to be sent using Mail, Sendmail, or SMTP.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/email.html\n */\nclass CI_Email {\n\n\t/**\n\t * Used as the User-Agent and X-Mailer headers' value.\n\t *\n\t * @var\tstring\n\t */\n\tpublic $useragent\t= 'CodeIgniter';\n\n\t/**\n\t * Path to the Sendmail binary.\n\t *\n\t * @var\tstring\n\t */\n\tpublic $mailpath\t= '/usr/sbin/sendmail';\t// Sendmail path\n\n\t/**\n\t * Which method to use for sending e-mails.\n\t *\n\t * @var\tstring\t'mail', 'sendmail' or 'smtp'\n\t */\n\tpublic $protocol\t= 'mail';\t\t// mail/sendmail/smtp\n\n\t/**\n\t * STMP Server host\n\t *\n\t * @var\tstring\n\t */\n\tpublic $smtp_host\t= '';\n\n\t/**\n\t * SMTP Username\n\t *\n\t * @var\tstring\n\t */\n\tpublic $smtp_user\t= '';\n\n\t/**\n\t * SMTP Password\n\t *\n\t * @var\tstring\n\t */\n\tpublic $smtp_pass\t= '';\n\n\t/**\n\t * SMTP Server port\n\t *\n\t * @var\tint\n\t */\n\tpublic $smtp_port\t= 25;\n\n\t/**\n\t * SMTP connection timeout in seconds\n\t *\n\t * @var\tint\n\t */\n\tpublic $smtp_timeout\t= 5;\n\n\t/**\n\t * SMTP persistent connection\n\t *\n\t * @var\tbool\n\t */\n\tpublic $smtp_keepalive\t= FALSE;\n\n\t/**\n\t * SMTP Encryption\n\t *\n\t * @var\tstring\tempty, 'tls' or 'ssl'\n\t */\n\tpublic $smtp_crypto\t= '';\n\n\t/**\n\t * Whether to apply word-wrapping to the message body.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $wordwrap\t= TRUE;\n\n\t/**\n\t * Number of characters to wrap at.\n\t *\n\t * @see\tCI_Email::$wordwrap\n\t * @var\tint\n\t */\n\tpublic $wrapchars\t= 76;\n\n\t/**\n\t * Message format.\n\t *\n\t * @var\tstring\t'text' or 'html'\n\t */\n\tpublic $mailtype\t= 'text';\n\n\t/**\n\t * Character set (default: utf-8)\n\t *\n\t * @var\tstring\n\t */\n\tpublic $charset\t\t= 'UTF-8';\n\n\t/**\n\t * Alternative message (for HTML messages only)\n\t *\n\t * @var\tstring\n\t */\n\tpublic $alt_message\t= '';\n\n\t/**\n\t * Whether to validate e-mail addresses.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $validate\t= FALSE;\n\n\t/**\n\t * X-Priority header value.\n\t *\n\t * @var\tint\t1-5\n\t */\n\tpublic $priority\t= 3;\t\t\t// Default priority (1 - 5)\n\n\t/**\n\t * Newline character sequence.\n\t * Use \"\\r\\n\" to comply with RFC 822.\n\t *\n\t * @link\thttp://www.ietf.org/rfc/rfc822.txt\n\t * @var\tstring\t\"\\r\\n\" or \"\\n\"\n\t */\n\tpublic $newline\t\t= \"\\n\";\t\t\t// Default newline. \"\\r\\n\" or \"\\n\" (Use \"\\r\\n\" to comply with RFC 822)\n\n\t/**\n\t * CRLF character sequence\n\t *\n\t * RFC 2045 specifies that for 'quoted-printable' encoding,\n\t * \"\\r\\n\" must be used. However, it appears that some servers\n\t * (even on the receiving end) don't handle it properly and\n\t * switching to \"\\n\", while improper, is the only solution\n\t * that seems to work for all environments.\n\t *\n\t * @link\thttp://www.ietf.org/rfc/rfc822.txt\n\t * @var\tstring\n\t */\n\tpublic $crlf\t\t= \"\\n\";\n\n\t/**\n\t * Whether to use Delivery Status Notification.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $dsn\t\t= FALSE;\n\n\t/**\n\t * Whether to send multipart alternatives.\n\t * Yahoo! doesn't seem to like these.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $send_multipart\t= TRUE;\n\n\t/**\n\t * Whether to send messages to BCC recipients in batches.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $bcc_batch_mode\t= FALSE;\n\n\t/**\n\t * BCC Batch max number size.\n\t *\n\t * @see\tCI_Email::$bcc_batch_mode\n\t * @var\tint\n\t */\n\tpublic $bcc_batch_size\t= 200;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Whether PHP is running in safe mode. Initialized by the class constructor.\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_safe_mode\t\t= FALSE;\n\n\t/**\n\t * Subject header\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_subject\t\t= '';\n\n\t/**\n\t * Message body\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_body\t\t= '';\n\n\t/**\n\t * Final message body to be sent.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_finalbody\t\t= '';\n\n\t/**\n\t * Final headers to send\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_header_str\t\t= '';\n\n\t/**\n\t * SMTP Connection socket placeholder\n\t *\n\t * @var\tresource\n\t */\n\tprotected $_smtp_connect\t= '';\n\n\t/**\n\t * Mail encoding\n\t *\n\t * @var\tstring\t'8bit' or '7bit'\n\t */\n\tprotected $_encoding\t\t= '8bit';\n\n\t/**\n\t * Whether to perform SMTP authentication\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_smtp_auth\t\t= FALSE;\n\n\t/**\n\t * Whether to send a Reply-To header\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_replyto_flag\t= FALSE;\n\n\t/**\n\t * Debug messages\n\t *\n\t * @see\tCI_Email::print_debugger()\n\t * @var\tstring\n\t */\n\tprotected $_debug_msg\t\t= array();\n\n\t/**\n\t * Recipients\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_recipients\t\t= array();\n\n\t/**\n\t * CC Recipients\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_cc_array\t\t= array();\n\n\t/**\n\t * BCC Recipients\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_bcc_array\t\t= array();\n\n\t/**\n\t * Message headers\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_headers\t\t= array();\n\n\t/**\n\t * Attachment data\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_attachments\t\t= array();\n\n\t/**\n\t * Valid $protocol values\n\t *\n\t * @see\tCI_Email::$protocol\n\t * @var\tstring[]\n\t */\n\tprotected $_protocols\t\t= array('mail', 'sendmail', 'smtp');\n\n\t/**\n\t * Base charsets\n\t *\n\t * Character sets valid for 7-bit encoding,\n\t * excluding language suffix.\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_base_charsets\t= array('us-ascii', 'iso-2022-');\n\n\t/**\n\t * Bit depths\n\t *\n\t * Valid mail encodings\n\t *\n\t * @see\tCI_Email::$_encoding\n\t * @var\tstring[]\n\t */\n\tprotected $_bit_depths\t\t= array('7bit', '8bit');\n\n\t/**\n\t * $priority translations\n\t *\n\t * Actual values to send with the X-Priority header\n\t *\n\t * @var\tstring[]\n\t */\n\tprotected $_priorities = array(\n\t\t1 => '1 (Highest)',\n\t\t2 => '2 (High)',\n\t\t3 => '3 (Normal)',\n\t\t4 => '4 (Low)',\n\t\t5 => '5 (Lowest)'\n\t);\n\n\t/**\n\t * mbstring.func_overload flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected static $func_overload;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor - Sets Email Preferences\n\t *\n\t * The constructor can be passed an array of config values\n\t *\n\t * @param\tarray\t$config = array()\n\t * @return\tvoid\n\t */\n\tpublic function __construct(array $config = array())\n\t{\n\t\t$this->charset = config_item('charset');\n\t\t$this->initialize($config);\n\t\t$this->_safe_mode = ( ! is_php('5.4') && ini_get('safe_mode'));\n\n\t\tisset(self::$func_overload) OR self::$func_overload = ( ! is_php('8.0') && extension_loaded('mbstring') && @ini_get('mbstring.func_overload'));\n\n\t\tlog_message('info', 'Email Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize preferences\n\t *\n\t * @param\tarray\t$config\n\t * @return\tCI_Email\n\t */\n\tpublic function initialize(array $config = array())\n\t{\n\t\t$this->clear();\n\n\t\tforeach ($config as $key => $val)\n\t\t{\n\t\t\tif (isset($this->$key))\n\t\t\t{\n\t\t\t\t$method = 'set_'.$key;\n\n\t\t\t\tif (method_exists($this, $method))\n\t\t\t\t{\n\t\t\t\t\t$this->$method($val);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->$key = $val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->charset = strtoupper($this->charset);\n\t\t$this->_smtp_auth = isset($this->smtp_user[0], $this->smtp_pass[0]);\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize the Email Data\n\t *\n\t * @param\tbool\n\t * @return\tCI_Email\n\t */\n\tpublic function clear($clear_attachments = FALSE)\n\t{\n\t\t$this->_subject\t\t= '';\n\t\t$this->_body\t\t= '';\n\t\t$this->_finalbody\t= '';\n\t\t$this->_header_str\t= '';\n\t\t$this->_replyto_flag\t= FALSE;\n\t\t$this->_recipients\t= array();\n\t\t$this->_cc_array\t= array();\n\t\t$this->_bcc_array\t= array();\n\t\t$this->_headers\t\t= array();\n\t\t$this->_debug_msg\t= array();\n\n\t\t$this->set_header('Date', $this->_set_date());\n\n\t\tif ($clear_attachments !== FALSE)\n\t\t{\n\t\t\t$this->_attachments = array();\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set FROM\n\t *\n\t * @param\tstring\t$from\n\t * @param\tstring\t$name\n\t * @param\tstring\t$return_path = NULL\tReturn-Path\n\t * @return\tCI_Email\n\t */\n\tpublic function from($from, $name = '', $return_path = NULL)\n\t{\n\t\tif (preg_match('/\\<(.*)\\>/', $from, $match))\n\t\t{\n\t\t\t$from = $match[1];\n\t\t}\n\n\t\tif ($this->validate)\n\t\t{\n\t\t\t$this->validate_email($this->_str_to_array($from));\n\t\t\tif ($return_path)\n\t\t\t{\n\t\t\t\t$this->validate_email($this->_str_to_array($return_path));\n\t\t\t}\n\t\t}\n\n\t\t// prepare the display name\n\t\tif ($name !== '')\n\t\t{\n\t\t\t// only use Q encoding if there are characters that would require it\n\t\t\tif ( ! preg_match('/[\\200-\\377]/', $name))\n\t\t\t{\n\t\t\t\t// add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes\n\t\t\t\t$name = '\"'.addcslashes($name, \"\\0..\\37\\177'\\\"\\\\\").'\"';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$name = $this->_prep_q_encoding($name);\n\t\t\t}\n\t\t}\n\n\t\t$this->set_header('From', $name.' <'.$from.'>');\n\n\t\tisset($return_path) OR $return_path = $from;\n\t\t$this->set_header('Return-Path', '<'.$return_path.'>');\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Reply-to\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function reply_to($replyto, $name = '')\n\t{\n\t\tif (preg_match('/\\<(.*)\\>/', $replyto, $match))\n\t\t{\n\t\t\t$replyto = $match[1];\n\t\t}\n\n\t\tif ($this->validate)\n\t\t{\n\t\t\t$this->validate_email($this->_str_to_array($replyto));\n\t\t}\n\n\t\tif ($name !== '')\n\t\t{\n\t\t\t// only use Q encoding if there are characters that would require it\n\t\t\tif ( ! preg_match('/[\\200-\\377]/', $name))\n\t\t\t{\n\t\t\t\t// add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes\n\t\t\t\t$name = '\"'.addcslashes($name, \"\\0..\\37\\177'\\\"\\\\\").'\"';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$name = $this->_prep_q_encoding($name);\n\t\t\t}\n\t\t}\n\n\t\t$this->set_header('Reply-To', $name.' <'.$replyto.'>');\n\t\t$this->_replyto_flag = TRUE;\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Recipients\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function to($to)\n\t{\n\t\t$to = $this->_str_to_array($to);\n\t\t$to = $this->clean_email($to);\n\n\t\tif ($this->validate)\n\t\t{\n\t\t\t$this->validate_email($to);\n\t\t}\n\n\t\tif ($this->_get_protocol() !== 'mail')\n\t\t{\n\t\t\t$this->set_header('To', implode(', ', $to));\n\t\t}\n\n\t\t$this->_recipients = $to;\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set CC\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function cc($cc)\n\t{\n\t\t$cc = $this->clean_email($this->_str_to_array($cc));\n\n\t\tif ($this->validate)\n\t\t{\n\t\t\t$this->validate_email($cc);\n\t\t}\n\n\t\t$this->set_header('Cc', implode(', ', $cc));\n\n\t\tif ($this->_get_protocol() === 'smtp')\n\t\t{\n\t\t\t$this->_cc_array = $cc;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set BCC\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function bcc($bcc, $limit = '')\n\t{\n\t\tif ($limit !== '' && is_numeric($limit))\n\t\t{\n\t\t\t$this->bcc_batch_mode = TRUE;\n\t\t\t$this->bcc_batch_size = $limit;\n\t\t}\n\n\t\t$bcc = $this->clean_email($this->_str_to_array($bcc));\n\n\t\tif ($this->validate)\n\t\t{\n\t\t\t$this->validate_email($bcc);\n\t\t}\n\n\t\tif ($this->_get_protocol() === 'smtp' OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size))\n\t\t{\n\t\t\t$this->_bcc_array = $bcc;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->set_header('Bcc', implode(', ', $bcc));\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Email Subject\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function subject($subject)\n\t{\n\t\t$subject = $this->_prep_q_encoding($subject);\n\t\t$this->set_header('Subject', $subject);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Body\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function message($body)\n\t{\n\t\t$this->_body = rtrim(str_replace(\"\\r\", '', $body));\n\n\t\t/* strip slashes only if magic quotes is ON\n\t\t   if we do it with magic quotes OFF, it strips real, user-inputted chars.\n\n\t\t   NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and\n\t\t\t it will probably not exist in future versions at all.\n\t\t*/\n\t\tif ( ! is_php('5.4') && get_magic_quotes_gpc())\n\t\t{\n\t\t\t$this->_body = stripslashes($this->_body);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Assign file attachments\n\t *\n\t * @param\tstring\t$file\tCan be local path, URL or buffered content\n\t * @param\tstring\t$disposition = 'attachment'\n\t * @param\tstring\t$newname = NULL\n\t * @param\tstring\t$mime = ''\n\t * @return\tCI_Email\n\t */\n\tpublic function attach($file, $disposition = '', $newname = NULL, $mime = '')\n\t{\n\t\tif ($mime === '')\n\t\t{\n\t\t\tif (strpos($file, '://') === FALSE && ! file_exists($file))\n\t\t\t{\n\t\t\t\t$this->_set_error_message('lang:email_attachment_missing', $file);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif ( ! $fp = @fopen($file, 'rb'))\n\t\t\t{\n\t\t\t\t$this->_set_error_message('lang:email_attachment_unreadable', $file);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$file_content = stream_get_contents($fp);\n\t\t\t$mime = $this->_mime_types(pathinfo($file, PATHINFO_EXTENSION));\n\t\t\tfclose($fp);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$file_content =& $file; // buffered file\n\t\t}\n\n\t\t$this->_attachments[] = array(\n\t\t\t'name'\t\t=> array($file, $newname),\n\t\t\t'disposition'\t=> empty($disposition) ? 'attachment' : $disposition,  // Can also be 'inline'  Not sure if it matters\n\t\t\t'type'\t\t=> $mime,\n\t\t\t'content'\t=> chunk_split(base64_encode($file_content)),\n\t\t\t'multipart'\t=> 'mixed'\n\t\t);\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set and return attachment Content-ID\n\t *\n\t * Useful for attached inline pictures\n\t *\n\t * @param\tstring\t$filename\n\t * @return\tstring\n\t */\n\tpublic function attachment_cid($filename)\n\t{\n\t\tfor ($i = 0, $c = count($this->_attachments); $i < $c; $i++)\n\t\t{\n\t\t\tif ($this->_attachments[$i]['name'][0] === $filename)\n\t\t\t{\n\t\t\t\t$this->_attachments[$i]['multipart'] = 'related';\n\t\t\t\t$this->_attachments[$i]['cid'] = uniqid(basename($this->_attachments[$i]['name'][0]).'@');\n\t\t\t\treturn $this->_attachments[$i]['cid'];\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add a Header Item\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function set_header($header, $value)\n\t{\n\t\t$this->_headers[$header] = str_replace(array(\"\\n\", \"\\r\"), '', $value);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Convert a String to an Array\n\t *\n\t * @param\tstring\n\t * @return\tarray\n\t */\n\tprotected function _str_to_array($email)\n\t{\n\t\tif ( ! is_array($email))\n\t\t{\n\t\t\treturn (strpos($email, ',') !== FALSE)\n\t\t\t\t? preg_split('/[\\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY)\n\t\t\t\t: (array) trim($email);\n\t\t}\n\n\t\treturn $email;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Multipart Value\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function set_alt_message($str)\n\t{\n\t\t$this->alt_message = (string) $str;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Mailtype\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function set_mailtype($type = 'text')\n\t{\n\t\t$this->mailtype = ($type === 'html') ? 'html' : 'text';\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Wordwrap\n\t *\n\t * @param\tbool\n\t * @return\tCI_Email\n\t */\n\tpublic function set_wordwrap($wordwrap = TRUE)\n\t{\n\t\t$this->wordwrap = (bool) $wordwrap;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Protocol\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function set_protocol($protocol = 'mail')\n\t{\n\t\t$this->protocol = in_array($protocol, $this->_protocols, TRUE) ? strtolower($protocol) : 'mail';\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Priority\n\t *\n\t * @param\tint\n\t * @return\tCI_Email\n\t */\n\tpublic function set_priority($n = 3)\n\t{\n\t\t$this->priority = preg_match('/^[1-5]$/', $n) ? (int) $n : 3;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Newline Character\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function set_newline($newline = \"\\n\")\n\t{\n\t\t$this->newline = in_array($newline, array(\"\\n\", \"\\r\\n\", \"\\r\")) ? $newline : \"\\n\";\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set CRLF\n\t *\n\t * @param\tstring\n\t * @return\tCI_Email\n\t */\n\tpublic function set_crlf($crlf = \"\\n\")\n\t{\n\t\t$this->crlf = ($crlf !== \"\\n\" && $crlf !== \"\\r\\n\" && $crlf !== \"\\r\") ? \"\\n\" : $crlf;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the Message ID\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _get_message_id()\n\t{\n\t\t$from = str_replace(array('>', '<'), '', $this->_headers['Return-Path']);\n\t\treturn '<'.uniqid('').strstr($from, '@').'>';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Mail Protocol\n\t *\n\t * @return\tmixed\n\t */\n\tprotected function _get_protocol()\n\t{\n\t\t$this->protocol = strtolower($this->protocol);\n\t\tin_array($this->protocol, $this->_protocols, TRUE) OR $this->protocol = 'mail';\n\t\treturn $this->protocol;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Mail Encoding\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _get_encoding()\n\t{\n\t\tin_array($this->_encoding, $this->_bit_depths) OR $this->_encoding = '8bit';\n\n\t\tforeach ($this->_base_charsets as $charset)\n\t\t{\n\t\t\tif (strpos($this->charset, $charset) === 0)\n\t\t\t{\n\t\t\t\t$this->_encoding = '7bit';\n\t\t\t}\n\t\t}\n\n\t\treturn $this->_encoding;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get content type (text/html/attachment)\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _get_content_type()\n\t{\n\t\tif ($this->mailtype === 'html')\n\t\t{\n\t\t\treturn empty($this->_attachments) ? 'html' : 'html-attach';\n\t\t}\n\t\telseif\t($this->mailtype === 'text' && ! empty($this->_attachments))\n\t\t{\n\t\t\treturn 'plain-attach';\n\t\t}\n\n\t\treturn 'plain';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set RFC 822 Date\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _set_date()\n\t{\n\t\t$timezone = date('Z');\n\t\t$operator = ($timezone[0] === '-') ? '-' : '+';\n\t\t$timezone = abs($timezone);\n\t\t$timezone = floor($timezone/3600) * 100 + ($timezone % 3600) / 60;\n\n\t\treturn sprintf('%s %s%04d', date('D, j M Y H:i:s'), $operator, $timezone);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mime message\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _get_mime_message()\n\t{\n\t\treturn 'This is a multi-part message in MIME format.'.$this->newline.'Your email application may not support this format.';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate Email Address\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function validate_email($email)\n\t{\n\t\tif ( ! is_array($email))\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_must_be_array');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tforeach ($email as $val)\n\t\t{\n\t\t\tif ( ! $this->valid_email($val))\n\t\t\t{\n\t\t\t\t$this->_set_error_message('lang:email_invalid_address', $val);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Email Validation\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function valid_email($email)\n\t{\n\t\tif (function_exists('idn_to_ascii') && strpos($email, '@'))\n\t\t{\n\t\t\tlist($account, $domain) = explode('@', $email, 2);\n\t\t\t$domain = defined('INTL_IDNA_VARIANT_UTS46')\n\t\t\t\t? idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46)\n\t\t\t\t: idn_to_ascii($domain);\n\n\t\t\tif ($domain !== FALSE)\n\t\t\t{\n\t\t\t\t$email = $account.'@'.$domain;\n\t\t\t}\n\t\t}\n\n\t\treturn (bool) filter_var($email, FILTER_VALIDATE_EMAIL);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clean Extended Email Address: Joe Smith <joe@smith.com>\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function clean_email($email)\n\t{\n\t\tif ( ! is_array($email))\n\t\t{\n\t\t\treturn preg_match('/\\<(.*)\\>/', $email, $match) ? $match[1] : $email;\n\t\t}\n\n\t\t$clean_email = array();\n\n\t\tforeach ($email as $addy)\n\t\t{\n\t\t\t$clean_email[] = preg_match('/\\<(.*)\\>/', $addy, $match) ? $match[1] : $addy;\n\t\t}\n\n\t\treturn $clean_email;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Build alternative plain text message\n\t *\n\t * Provides the raw message for use in plain-text headers of\n\t * HTML-formatted emails.\n\t * If the user hasn't specified his own alternative message\n\t * it creates one by stripping the HTML\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _get_alt_message()\n\t{\n\t\tif ( ! empty($this->alt_message))\n\t\t{\n\t\t\treturn ($this->wordwrap)\n\t\t\t\t? $this->word_wrap($this->alt_message, 76)\n\t\t\t\t: $this->alt_message;\n\t\t}\n\n\t\t$body = preg_match('/\\<body.*?\\>(.*)\\<\\/body\\>/si', $this->_body, $match) ? $match[1] : $this->_body;\n\t\t$body = str_replace(\"\\t\", '', preg_replace('#<!--(.*)--\\>#', '', trim(strip_tags($body))));\n\n\t\tfor ($i = 20; $i >= 3; $i--)\n\t\t{\n\t\t\t$body = str_replace(str_repeat(\"\\n\", $i), \"\\n\\n\", $body);\n\t\t}\n\n\t\t// Reduce multiple spaces\n\t\t$body = preg_replace('| +|', ' ', $body);\n\n\t\treturn ($this->wordwrap)\n\t\t\t? $this->word_wrap($body, 76)\n\t\t\t: $body;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Word Wrap\n\t *\n\t * @param\tstring\n\t * @param\tint\tline-length limit\n\t * @return\tstring\n\t */\n\tpublic function word_wrap($str, $charlim = NULL)\n\t{\n\t\t// Set the character limit, if not already present\n\t\tif (empty($charlim))\n\t\t{\n\t\t\t$charlim = empty($this->wrapchars) ? 76 : $this->wrapchars;\n\t\t}\n\n\t\t// Standardize newlines\n\t\tif (strpos($str, \"\\r\") !== FALSE)\n\t\t{\n\t\t\t$str = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n\t\t}\n\n\t\t// Reduce multiple spaces at end of line\n\t\t$str = preg_replace('| +\\n|', \"\\n\", $str);\n\n\t\t// If the current word is surrounded by {unwrap} tags we'll\n\t\t// strip the entire chunk and replace it with a marker.\n\t\t$unwrap = array();\n\t\tif (preg_match_all('|\\{unwrap\\}(.+?)\\{/unwrap\\}|s', $str, $matches))\n\t\t{\n\t\t\tfor ($i = 0, $c = count($matches[0]); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$unwrap[] = $matches[1][$i];\n\t\t\t\t$str = str_replace($matches[0][$i], '{{unwrapped'.$i.'}}', $str);\n\t\t\t}\n\t\t}\n\n\t\t// Use PHP's native function to do the initial wordwrap.\n\t\t// We set the cut flag to FALSE so that any individual words that are\n\t\t// too long get left alone. In the next step we'll deal with them.\n\t\t$str = wordwrap($str, $charlim, \"\\n\", FALSE);\n\n\t\t// Split the string into individual lines of text and cycle through them\n\t\t$output = '';\n\t\tforeach (explode(\"\\n\", $str) as $line)\n\t\t{\n\t\t\t// Is the line within the allowed character count?\n\t\t\t// If so we'll join it to the output and continue\n\t\t\tif (self::strlen($line) <= $charlim)\n\t\t\t{\n\t\t\t\t$output .= $line.$this->newline;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$temp = '';\n\t\t\tdo\n\t\t\t{\n\t\t\t\t// If the over-length word is a URL we won't wrap it\n\t\t\t\tif (preg_match('!\\[url.+\\]|://|www\\.!', $line))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Trim the word down\n\t\t\t\t$temp .= self::substr($line, 0, $charlim - 1);\n\t\t\t\t$line = self::substr($line, $charlim - 1);\n\t\t\t}\n\t\t\twhile (self::strlen($line) > $charlim);\n\n\t\t\t// If $temp contains data it means we had to split up an over-length\n\t\t\t// word into smaller chunks so we'll add it back to our current line\n\t\t\tif ($temp !== '')\n\t\t\t{\n\t\t\t\t$output .= $temp.$this->newline;\n\t\t\t}\n\n\t\t\t$output .= $line.$this->newline;\n\t\t}\n\n\t\t// Put our markers back\n\t\tif (count($unwrap) > 0)\n\t\t{\n\t\t\tforeach ($unwrap as $key => $val)\n\t\t\t{\n\t\t\t\t$output = str_replace('{{unwrapped'.$key.'}}', $val, $output);\n\t\t\t}\n\t\t}\n\n\t\treturn $output;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Build final headers\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _build_headers()\n\t{\n\t\t$this->set_header('User-Agent', $this->useragent);\n\t\t$this->set_header('X-Sender', $this->clean_email($this->_headers['From']));\n\t\t$this->set_header('X-Mailer', $this->useragent);\n\t\t$this->set_header('X-Priority', $this->_priorities[$this->priority]);\n\t\t$this->set_header('Message-ID', $this->_get_message_id());\n\t\t$this->set_header('Mime-Version', '1.0');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Write Headers as a string\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _write_headers()\n\t{\n\t\tif ($this->protocol === 'mail')\n\t\t{\n\t\t\tif (isset($this->_headers['Subject']))\n\t\t\t{\n\t\t\t\t$this->_subject = $this->_headers['Subject'];\n\t\t\t\tunset($this->_headers['Subject']);\n\t\t\t}\n\t\t}\n\n\t\treset($this->_headers);\n\t\t$this->_header_str = '';\n\n\t\tforeach ($this->_headers as $key => $val)\n\t\t{\n\t\t\t$val = trim($val);\n\n\t\t\tif ($val !== '')\n\t\t\t{\n\t\t\t\t$this->_header_str .= $key.': '.$val.$this->newline;\n\t\t\t}\n\t\t}\n\n\t\tif ($this->_get_protocol() === 'mail')\n\t\t{\n\t\t\t$this->_header_str = rtrim($this->_header_str);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Build Final Body and attachments\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _build_message()\n\t{\n\t\tif ($this->wordwrap === TRUE && $this->mailtype !== 'html')\n\t\t{\n\t\t\t$this->_body = $this->word_wrap($this->_body);\n\t\t}\n\n\t\t$this->_write_headers();\n\n\t\t$hdr = ($this->_get_protocol() === 'mail') ? $this->newline : '';\n\t\t$body = '';\n\n\t\tswitch ($this->_get_content_type())\n\t\t{\n\t\t\tcase 'plain':\n\n\t\t\t\t$hdr .= 'Content-Type: text/plain; charset='.$this->charset.$this->newline\n\t\t\t\t\t.'Content-Transfer-Encoding: '.$this->_get_encoding();\n\n\t\t\t\tif ($this->_get_protocol() === 'mail')\n\t\t\t\t{\n\t\t\t\t\t$this->_header_str .= $hdr;\n\t\t\t\t\t$this->_finalbody = $this->_body;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->_finalbody = $hdr.$this->newline.$this->newline.$this->_body;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\tcase 'html':\n\n\t\t\t\tif ($this->send_multipart === FALSE)\n\t\t\t\t{\n\t\t\t\t\t$hdr .= 'Content-Type: text/html; charset='.$this->charset.$this->newline\n\t\t\t\t\t\t.'Content-Transfer-Encoding: quoted-printable';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$boundary = uniqid('B_ALT_');\n\t\t\t\t\t$hdr .= 'Content-Type: multipart/alternative; boundary=\"'.$boundary.'\"';\n\n\t\t\t\t\t$body .= $this->_get_mime_message().$this->newline.$this->newline\n\t\t\t\t\t\t.'--'.$boundary.$this->newline\n\n\t\t\t\t\t\t.'Content-Type: text/plain; charset='.$this->charset.$this->newline\n\t\t\t\t\t\t.'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline.$this->newline\n\t\t\t\t\t\t.$this->_get_alt_message().$this->newline.$this->newline\n\t\t\t\t\t\t.'--'.$boundary.$this->newline\n\n\t\t\t\t\t\t.'Content-Type: text/html; charset='.$this->charset.$this->newline\n\t\t\t\t\t\t.'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline;\n\t\t\t\t}\n\n\t\t\t\t$this->_finalbody = $body.$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline;\n\n\t\t\t\tif ($this->_get_protocol() === 'mail')\n\t\t\t\t{\n\t\t\t\t\t$this->_header_str .= $hdr;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->_finalbody = $hdr.$this->newline.$this->newline.$this->_finalbody;\n\t\t\t\t}\n\n\t\t\t\tif ($this->send_multipart !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t$this->_finalbody .= '--'.$boundary.'--';\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\tcase 'plain-attach':\n\n\t\t\t\t$boundary = uniqid('B_ATC_');\n\t\t\t\t$hdr .= 'Content-Type: multipart/mixed; boundary=\"'.$boundary.'\"';\n\n\t\t\t\tif ($this->_get_protocol() === 'mail')\n\t\t\t\t{\n\t\t\t\t\t$this->_header_str .= $hdr;\n\t\t\t\t}\n\n\t\t\t\t$body .= $this->_get_mime_message().$this->newline\n\t\t\t\t\t.$this->newline\n\t\t\t\t\t.'--'.$boundary.$this->newline\n\t\t\t\t\t.'Content-Type: text/plain; charset='.$this->charset.$this->newline\n\t\t\t\t\t.'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline\n\t\t\t\t\t.$this->newline\n\t\t\t\t\t.$this->_body.$this->newline.$this->newline;\n\n\t\t\t\t$this->_append_attachments($body, $boundary);\n\n\t\t\t\tbreak;\n\t\t\tcase 'html-attach':\n\n\t\t\t\t$alt_boundary = uniqid('B_ALT_');\n\t\t\t\t$last_boundary = NULL;\n\n\t\t\t\tif ($this->_attachments_have_multipart('mixed'))\n\t\t\t\t{\n\t\t\t\t\t$atc_boundary = uniqid('B_ATC_');\n\t\t\t\t\t$hdr .= 'Content-Type: multipart/mixed; boundary=\"'.$atc_boundary.'\"';\n\t\t\t\t\t$last_boundary = $atc_boundary;\n\t\t\t\t}\n\n\t\t\t\tif ($this->_attachments_have_multipart('related'))\n\t\t\t\t{\n\t\t\t\t\t$rel_boundary = uniqid('B_REL_');\n\t\t\t\t\t$rel_boundary_header = 'Content-Type: multipart/related; boundary=\"'.$rel_boundary.'\"';\n\n\t\t\t\t\tif (isset($last_boundary))\n\t\t\t\t\t{\n\t\t\t\t\t\t$body .= '--'.$last_boundary.$this->newline.$rel_boundary_header;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$hdr .= $rel_boundary_header;\n\t\t\t\t\t}\n\n\t\t\t\t\t$last_boundary = $rel_boundary;\n\t\t\t\t}\n\n\t\t\t\tif ($this->_get_protocol() === 'mail')\n\t\t\t\t{\n\t\t\t\t\t$this->_header_str .= $hdr;\n\t\t\t\t}\n\n\t\t\t\tself::strlen($body) && $body .= $this->newline.$this->newline;\n\t\t\t\t$body .= $this->_get_mime_message().$this->newline.$this->newline\n\t\t\t\t\t.'--'.$last_boundary.$this->newline\n\n\t\t\t\t\t.'Content-Type: multipart/alternative; boundary=\"'.$alt_boundary.'\"'.$this->newline.$this->newline\n\t\t\t\t\t.'--'.$alt_boundary.$this->newline\n\n\t\t\t\t\t.'Content-Type: text/plain; charset='.$this->charset.$this->newline\n\t\t\t\t\t.'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline.$this->newline\n\t\t\t\t\t.$this->_get_alt_message().$this->newline.$this->newline\n\t\t\t\t\t.'--'.$alt_boundary.$this->newline\n\n\t\t\t\t\t.'Content-Type: text/html; charset='.$this->charset.$this->newline\n\t\t\t\t\t.'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline\n\n\t\t\t\t\t.$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline\n\t\t\t\t\t.'--'.$alt_boundary.'--'.$this->newline.$this->newline;\n\n\t\t\t\tif ( ! empty($rel_boundary))\n\t\t\t\t{\n\t\t\t\t\t$body .= $this->newline.$this->newline;\n\t\t\t\t\t$this->_append_attachments($body, $rel_boundary, 'related');\n\t\t\t\t}\n\n\t\t\t\t// multipart/mixed attachments\n\t\t\t\tif ( ! empty($atc_boundary))\n\t\t\t\t{\n\t\t\t\t\t$body .= $this->newline.$this->newline;\n\t\t\t\t\t$this->_append_attachments($body, $atc_boundary, 'mixed');\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$this->_finalbody = ($this->_get_protocol() === 'mail')\n\t\t\t? $body\n\t\t\t: $hdr.$this->newline.$this->newline.$body;\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\tprotected function _attachments_have_multipart($type)\n\t{\n\t\tforeach ($this->_attachments as &$attachment)\n\t\t{\n\t\t\tif ($attachment['multipart'] === $type)\n\t\t\t{\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prepares attachment string\n\t *\n\t * @param\tstring\t$body\t\tMessage body to append to\n\t * @param\tstring\t$boundary\tMultipart boundary\n\t * @param\tstring\t$multipart\tWhen provided, only attachments of this type will be processed\n\t * @return\tstring\n\t */\n\tprotected function _append_attachments(&$body, $boundary, $multipart = null)\n\t{\n\t\tfor ($i = 0, $c = count($this->_attachments); $i < $c; $i++)\n\t\t{\n\t\t\tif (isset($multipart) && $this->_attachments[$i]['multipart'] !== $multipart)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$name = isset($this->_attachments[$i]['name'][1])\n\t\t\t\t? $this->_attachments[$i]['name'][1]\n\t\t\t\t: basename($this->_attachments[$i]['name'][0]);\n\n\t\t\t$body .= '--'.$boundary.$this->newline\n\t\t\t\t.'Content-Type: '.$this->_attachments[$i]['type'].'; name=\"'.$name.'\"'.$this->newline\n\t\t\t\t.'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline\n\t\t\t\t.'Content-Transfer-Encoding: base64'.$this->newline\n\t\t\t\t.(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline)\n\t\t\t\t.$this->newline\n\t\t\t\t.$this->_attachments[$i]['content'].$this->newline;\n\t\t}\n\n\t\t// $name won't be set if no attachments were appended,\n\t\t// and therefore a boundary wouldn't be necessary\n\t\tempty($name) OR $body .= '--'.$boundary.'--';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep Quoted Printable\n\t *\n\t * Prepares string for Quoted-Printable Content-Transfer-Encoding\n\t * Refer to RFC 2045 http://www.ietf.org/rfc/rfc2045.txt\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _prep_quoted_printable($str)\n\t{\n\t\t// ASCII code numbers for \"safe\" characters that can always be\n\t\t// used literally, without encoding, as described in RFC 2049.\n\t\t// http://www.ietf.org/rfc/rfc2049.txt\n\t\tstatic $ascii_safe_chars = array(\n\t\t\t// ' (  )   +   ,   -   .   /   :   =   ?\n\t\t\t39, 40, 41, 43, 44, 45, 46, 47, 58, 61, 63,\n\t\t\t// numbers\n\t\t\t48, 49, 50, 51, 52, 53, 54, 55, 56, 57,\n\t\t\t// upper-case letters\n\t\t\t65, 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,\n\t\t\t// lower-case letters\n\t\t\t97, 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\n\t\t);\n\n\t\t// We are intentionally wrapping so mail servers will encode characters\n\t\t// properly and MUAs will behave, so {unwrap} must go!\n\t\t$str = str_replace(array('{unwrap}', '{/unwrap}'), '', $str);\n\n\t\t// RFC 2045 specifies CRLF as \"\\r\\n\".\n\t\t// However, many developers choose to override that and violate\n\t\t// the RFC rules due to (apparently) a bug in MS Exchange,\n\t\t// which only works with \"\\n\".\n\t\tif ($this->crlf === \"\\r\\n\")\n\t\t{\n\t\t\treturn quoted_printable_encode($str);\n\t\t}\n\n\t\t// Reduce multiple spaces & remove nulls\n\t\t$str = preg_replace(array('| +|', '/\\x00+/'), array(' ', ''), $str);\n\n\t\t// Standardize newlines\n\t\tif (strpos($str, \"\\r\") !== FALSE)\n\t\t{\n\t\t\t$str = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n\t\t}\n\n\t\t$escape = '=';\n\t\t$output = '';\n\n\t\tforeach (explode(\"\\n\", $str) as $line)\n\t\t{\n\t\t\t$length = self::strlen($line);\n\t\t\t$temp = '';\n\n\t\t\t// Loop through each character in the line to add soft-wrap\n\t\t\t// characters at the end of a line \" =\\r\\n\" and add the newly\n\t\t\t// processed line(s) to the output (see comment on $crlf class property)\n\t\t\tfor ($i = 0; $i < $length; $i++)\n\t\t\t{\n\t\t\t\t// Grab the next character\n\t\t\t\t$char = $line[$i];\n\t\t\t\t$ascii = ord($char);\n\n\t\t\t\t// Convert spaces and tabs but only if it's the end of the line\n\t\t\t\tif ($ascii === 32 OR $ascii === 9)\n\t\t\t\t{\n\t\t\t\t\tif ($i === ($length - 1))\n\t\t\t\t\t{\n\t\t\t\t\t\t$char = $escape.sprintf('%02s', dechex($ascii));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// DO NOT move this below the $ascii_safe_chars line!\n\t\t\t\t//\n\t\t\t\t// = (equals) signs are allowed by RFC2049, but must be encoded\n\t\t\t\t// as they are the encoding delimiter!\n\t\t\t\telseif ($ascii === 61)\n\t\t\t\t{\n\t\t\t\t\t$char = $escape.strtoupper(sprintf('%02s', dechex($ascii)));  // =3D\n\t\t\t\t}\n\t\t\t\telseif ( ! in_array($ascii, $ascii_safe_chars, TRUE))\n\t\t\t\t{\n\t\t\t\t\t$char = $escape.strtoupper(sprintf('%02s', dechex($ascii)));\n\t\t\t\t}\n\n\t\t\t\t// If we're at the character limit, add the line to the output,\n\t\t\t\t// reset our temp variable, and keep on chuggin'\n\t\t\t\tif ((self::strlen($temp) + self::strlen($char)) >= 76)\n\t\t\t\t{\n\t\t\t\t\t$output .= $temp.$escape.$this->crlf;\n\t\t\t\t\t$temp = '';\n\t\t\t\t}\n\n\t\t\t\t// Add the character to our temporary line\n\t\t\t\t$temp .= $char;\n\t\t\t}\n\n\t\t\t// Add our completed line to the output\n\t\t\t$output .= $temp.$this->crlf;\n\t\t}\n\n\t\t// get rid of extra CRLF tacked onto the end\n\t\treturn self::substr($output, 0, self::strlen($this->crlf) * -1);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep Q Encoding\n\t *\n\t * Performs \"Q Encoding\" on a string for use in email headers.\n\t * It's related but not identical to quoted-printable, so it has its\n\t * own method.\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _prep_q_encoding($str)\n\t{\n\t\t$str = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n\n\t\tif ($this->charset === 'UTF-8')\n\t\t{\n\t\t\t// Note: We used to have mb_encode_mimeheader() as the first choice\n\t\t\t//       here, but it turned out to be buggy and unreliable. DO NOT\n\t\t\t//       re-add it! -- Narf\n\t\t\tif (ICONV_ENABLED === TRUE)\n\t\t\t{\n\t\t\t\t$output = @iconv_mime_encode('', $str,\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'scheme' => 'Q',\n\t\t\t\t\t\t'line-length' => 76,\n\t\t\t\t\t\t'input-charset' => $this->charset,\n\t\t\t\t\t\t'output-charset' => $this->charset,\n\t\t\t\t\t\t'line-break-chars' => $this->crlf\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// There are reports that iconv_mime_encode() might fail and return FALSE\n\t\t\t\tif ($output !== FALSE)\n\t\t\t\t{\n\t\t\t\t\t// iconv_mime_encode() will always put a header field name.\n\t\t\t\t\t// We've passed it an empty one, but it still prepends our\n\t\t\t\t\t// encoded string with ': ', so we need to strip it.\n\t\t\t\t\treturn self::substr($output, 2);\n\t\t\t\t}\n\n\t\t\t\t$chars = iconv_strlen($str, 'UTF-8');\n\t\t\t}\n\t\t\telseif (MB_ENABLED === TRUE)\n\t\t\t{\n\t\t\t\t$chars = mb_strlen($str, 'UTF-8');\n\t\t\t}\n\t\t}\n\n\t\t// We might already have this set for UTF-8\n\t\tisset($chars) OR $chars = self::strlen($str);\n\n\t\t$output = '=?'.$this->charset.'?Q?';\n\t\tfor ($i = 0, $length = self::strlen($output); $i < $chars; $i++)\n\t\t{\n\t\t\t$chr = ($this->charset === 'UTF-8' && ICONV_ENABLED === TRUE)\n\t\t\t\t? '='.implode('=', str_split(strtoupper(bin2hex(iconv_substr($str, $i, 1, $this->charset))), 2))\n\t\t\t\t: '='.strtoupper(bin2hex($str[$i]));\n\n\t\t\t// RFC 2045 sets a limit of 76 characters per line.\n\t\t\t// We'll append ?= to the end of each line though.\n\t\t\tif ($length + ($l = self::strlen($chr)) > 74)\n\t\t\t{\n\t\t\t\t$output .= '?='.$this->crlf // EOL\n\t\t\t\t\t.' =?'.$this->charset.'?Q?'.$chr; // New line\n\t\t\t\t$length = 6 + self::strlen($this->charset) + $l; // Reset the length for the new line\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$output .= $chr;\n\t\t\t\t$length += $l;\n\t\t\t}\n\t\t}\n\n\t\t// End the header\n\t\treturn $output.'?=';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send Email\n\t *\n\t * @param\tbool\t$auto_clear = TRUE\n\t * @return\tbool\n\t */\n\tpublic function send($auto_clear = TRUE)\n\t{\n\t\tif ( ! isset($this->_headers['From']))\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_no_from');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($this->_replyto_flag === FALSE)\n\t\t{\n\t\t\t$this->reply_to($this->_headers['From']);\n\t\t}\n\n\t\tif ( ! isset($this->_recipients) && ! isset($this->_headers['To'])\n\t\t\t&& ! isset($this->_bcc_array) && ! isset($this->_headers['Bcc'])\n\t\t\t&& ! isset($this->_headers['Cc']))\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_no_recipients');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_build_headers();\n\n\t\tif ($this->bcc_batch_mode && count($this->_bcc_array) > $this->bcc_batch_size)\n\t\t{\n\t\t\t$result = $this->batch_bcc_send();\n\n\t\t\tif ($result && $auto_clear)\n\t\t\t{\n\t\t\t\t$this->clear();\n\t\t\t}\n\n\t\t\treturn $result;\n\t\t}\n\n\t\tif ($this->_build_message() === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$result = $this->_spool_email();\n\n\t\tif ($result && $auto_clear)\n\t\t{\n\t\t\t$this->clear();\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Batch Bcc Send. Sends groups of BCCs in batches\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function batch_bcc_send()\n\t{\n\t\t$float = $this->bcc_batch_size - 1;\n\t\t$set = '';\n\t\t$chunk = array();\n\n\t\tfor ($i = 0, $c = count($this->_bcc_array); $i < $c; $i++)\n\t\t{\n\t\t\tif (isset($this->_bcc_array[$i]))\n\t\t\t{\n\t\t\t\t$set .= ', '.$this->_bcc_array[$i];\n\t\t\t}\n\n\t\t\tif ($i === $float)\n\t\t\t{\n\t\t\t\t$chunk[] = self::substr($set, 1);\n\t\t\t\t$float += $this->bcc_batch_size;\n\t\t\t\t$set = '';\n\t\t\t}\n\n\t\t\tif ($i === $c-1)\n\t\t\t{\n\t\t\t\t$chunk[] = self::substr($set, 1);\n\t\t\t}\n\t\t}\n\n\t\tfor ($i = 0, $c = count($chunk); $i < $c; $i++)\n\t\t{\n\t\t\tunset($this->_headers['Bcc']);\n\n\t\t\t$bcc = $this->clean_email($this->_str_to_array($chunk[$i]));\n\n\t\t\tif ($this->protocol !== 'smtp')\n\t\t\t{\n\t\t\t\t$this->set_header('Bcc', implode(', ', $bcc));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_bcc_array = $bcc;\n\t\t\t}\n\n\t\t\tif ($this->_build_message() === FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$this->_spool_email();\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Unwrap special elements\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _unwrap_specials()\n\t{\n\t\t$this->_finalbody = preg_replace_callback('/\\{unwrap\\}(.*?)\\{\\/unwrap\\}/si', array($this, '_remove_nl_callback'), $this->_finalbody);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Strip line-breaks via callback\n\t *\n\t * @param\tstring\t$matches\n\t * @return\tstring\n\t */\n\tprotected function _remove_nl_callback($matches)\n\t{\n\t\tif (strpos($matches[1], \"\\r\") !== FALSE OR strpos($matches[1], \"\\n\") !== FALSE)\n\t\t{\n\t\t\t$matches[1] = str_replace(array(\"\\r\\n\", \"\\r\", \"\\n\"), '', $matches[1]);\n\t\t}\n\n\t\treturn $matches[1];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Spool mail to the mail server\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _spool_email()\n\t{\n\t\t$this->_unwrap_specials();\n\n\t\t$protocol = $this->_get_protocol();\n\t\t$method   = '_send_with_'.$protocol;\n\t\tif ( ! $this->$method())\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_send_failure_'.($protocol === 'mail' ? 'phpmail' : $protocol));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_set_error_message('lang:email_sent', $protocol);\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate email for shell\n\t *\n\t * Applies stricter, shell-safe validation to email addresses.\n\t * Introduced to prevent RCE via sendmail's -f option.\n\t *\n\t * @see\thttps://github.com/bcit-ci/CodeIgniter/issues/4963\n\t * @see\thttps://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36\n\t * @license\thttps://creativecommons.org/publicdomain/zero/1.0/\tCC0 1.0, Public Domain\n\t *\n\t * Credits for the base concept go to Paul Buonopane <paul@namepros.com>\n\t *\n\t * @param\tstring\t$email\n\t * @return\tbool\n\t */\n\tprotected function _validate_email_for_shell(&$email)\n\t{\n\t\tif (function_exists('idn_to_ascii') && strpos($email, '@'))\n\t\t{\n\t\t\tlist($account, $domain) = explode('@', $email, 2);\n\t\t\t$domain = defined('INTL_IDNA_VARIANT_UTS46')\n\t\t\t\t? idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46)\n\t\t\t\t: idn_to_ascii($domain);\n\n\t\t\tif ($domain !== FALSE)\n\t\t\t{\n\t\t\t\t$email = $account.'@'.$domain;\n\t\t\t}\n\t\t}\n\n\t\treturn (filter_var($email, FILTER_VALIDATE_EMAIL) === $email && preg_match('#\\A[a-z0-9._+-]+@[a-z0-9.-]{1,253}\\z#i', $email));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send using mail()\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _send_with_mail()\n\t{\n\t\tif (is_array($this->_recipients))\n\t\t{\n\t\t\t$this->_recipients = implode(', ', $this->_recipients);\n\t\t}\n\n\t\t// _validate_email_for_shell() below accepts by reference,\n\t\t// so this needs to be assigned to a variable\n\t\t$from = $this->clean_email($this->_headers['Return-Path']);\n\n\t\tif ($this->_safe_mode === TRUE || ! $this->_validate_email_for_shell($from))\n\t\t{\n\t\t\treturn mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// most documentation of sendmail using the \"-f\" flag lacks a space after it, however\n\t\t\t// we've encountered servers that seem to require it to be in place.\n\t\t\treturn mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, '-f '.$from);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send using Sendmail\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _send_with_sendmail()\n\t{\n\t\t// _validate_email_for_shell() below accepts by reference,\n\t\t// so this needs to be assigned to a variable\n\t\t$from = $this->clean_email($this->_headers['From']);\n\t\tif ($this->_validate_email_for_shell($from))\n\t\t{\n\t\t\t$from = '-f '.$from;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$from = '';\n\t\t}\n\n\t\t// is popen() enabled?\n\t\tif ( ! function_usable('popen')\tOR FALSE === ($fp = @popen($this->mailpath.' -oi '.$from.' -t', 'w')))\n\t\t{\n\t\t\t// server probably has popen disabled, so nothing we can do to get a verbose error.\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tfputs($fp, $this->_header_str);\n\t\tfputs($fp, $this->_finalbody);\n\n\t\t$status = pclose($fp);\n\n\t\tif ($status !== 0)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_exit_status', $status);\n\t\t\t$this->_set_error_message('lang:email_no_socket');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send using SMTP\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _send_with_smtp()\n\t{\n\t\tif ($this->smtp_host === '')\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_no_hostname');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! $this->_smtp_connect() OR ! $this->_smtp_authenticate())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! $this->_send_command('from', $this->clean_email($this->_headers['From'])))\n\t\t{\n\t\t\t$this->_smtp_end();\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tforeach ($this->_recipients as $val)\n\t\t{\n\t\t\tif ( ! $this->_send_command('to', $val))\n\t\t\t{\n\t\t\t\t$this->_smtp_end();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\tif (count($this->_cc_array) > 0)\n\t\t{\n\t\t\tforeach ($this->_cc_array as $val)\n\t\t\t{\n\t\t\t\tif ($val !== '' && ! $this->_send_command('to', $val))\n\t\t\t\t{\n\t\t\t\t\t$this->_smtp_end();\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (count($this->_bcc_array) > 0)\n\t\t{\n\t\t\tforeach ($this->_bcc_array as $val)\n\t\t\t{\n\t\t\t\tif ($val !== '' && ! $this->_send_command('to', $val))\n\t\t\t\t{\n\t\t\t\t\t$this->_smtp_end();\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $this->_send_command('data'))\n\t\t{\n\t\t\t$this->_smtp_end();\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// perform dot transformation on any lines that begin with a dot\n\t\t$this->_send_data($this->_header_str.preg_replace('/^\\./m', '..$1', $this->_finalbody));\n\n\t\t$this->_send_data('.');\n\n\t\t$reply = $this->_get_smtp_data();\n\t\t$this->_set_error_message($reply);\n\n\t\t$this->_smtp_end();\n\n\t\tif (strpos($reply, '250') !== 0)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_smtp_error', $reply);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * SMTP End\n\t *\n\t * Shortcut to send RSET or QUIT depending on keep-alive\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _smtp_end()\n\t{\n\t\t($this->smtp_keepalive)\n\t\t\t? $this->_send_command('reset')\n\t\t\t: $this->_send_command('quit');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * SMTP Connect\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _smtp_connect()\n\t{\n\t\tif (is_resource($this->_smtp_connect))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t$ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : '';\n\n\t\t$this->_smtp_connect = fsockopen($ssl.$this->smtp_host,\n\t\t\t\t\t\t\t$this->smtp_port,\n\t\t\t\t\t\t\t$errno,\n\t\t\t\t\t\t\t$errstr,\n\t\t\t\t\t\t\t$this->smtp_timeout);\n\n\t\tif ( ! is_resource($this->_smtp_connect))\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tstream_set_timeout($this->_smtp_connect, $this->smtp_timeout);\n\t\t$this->_set_error_message($this->_get_smtp_data());\n\n\t\tif ($this->smtp_crypto === 'tls')\n\t\t{\n\t\t\t$this->_send_command('hello');\n\t\t\t$this->_send_command('starttls');\n\n\t\t\t/**\n\t\t\t * STREAM_CRYPTO_METHOD_TLS_CLIENT is quite the mess ...\n\t\t\t *\n\t\t\t * - On PHP <5.6 it doesn't even mean TLS, but SSL 2.0, and there's no option to use actual TLS\n\t\t\t * - On PHP 5.6.0-5.6.6, >=7.2 it means negotiation with any of TLS 1.0, 1.1, 1.2\n\t\t\t * - On PHP 5.6.7-7.1.* it means only TLS 1.0\n\t\t\t *\n\t\t\t * We want the negotiation, so we'll force it below ...\n\t\t\t */\n\t\t\t$method = is_php('5.6')\n\t\t\t\t? STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT\n\t\t\t\t: STREAM_CRYPTO_METHOD_TLS_CLIENT;\n\t\t\t$crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, $method);\n\n\t\t\tif ($crypto !== TRUE)\n\t\t\t{\n\t\t\t\t$this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data());\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn $this->_send_command('hello');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send SMTP command\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tprotected function _send_command($cmd, $data = '')\n\t{\n\t\tswitch ($cmd)\n\t\t{\n\t\t\tcase 'hello' :\n\n\t\t\t\t\t\tif ($this->_smtp_auth OR $this->_get_encoding() === '8bit')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->_send_data('EHLO '.$this->_get_hostname());\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->_send_data('HELO '.$this->_get_hostname());\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$resp = 250;\n\t\t\tbreak;\n\t\t\tcase 'starttls'\t:\n\n\t\t\t\t\t\t$this->_send_data('STARTTLS');\n\t\t\t\t\t\t$resp = 220;\n\t\t\tbreak;\n\t\t\tcase 'from' :\n\n\t\t\t\t\t\t$this->_send_data('MAIL FROM:<'.$data.'>');\n\t\t\t\t\t\t$resp = 250;\n\t\t\tbreak;\n\t\t\tcase 'to' :\n\n\t\t\t\t\t\tif ($this->dsn)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->_send_data('RCPT TO:<'.$data.'> NOTIFY=SUCCESS,DELAY,FAILURE ORCPT=rfc822;'.$data);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->_send_data('RCPT TO:<'.$data.'>');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$resp = 250;\n\t\t\tbreak;\n\t\t\tcase 'data'\t:\n\n\t\t\t\t\t\t$this->_send_data('DATA');\n\t\t\t\t\t\t$resp = 354;\n\t\t\tbreak;\n\t\t\tcase 'reset':\n\n\t\t\t\t\t\t$this->_send_data('RSET');\n\t\t\t\t\t\t$resp = 250;\n\t\t\tbreak;\n\t\t\tcase 'quit'\t:\n\n\t\t\t\t\t\t$this->_send_data('QUIT');\n\t\t\t\t\t\t$resp = 221;\n\t\t\tbreak;\n\t\t}\n\n\t\t$reply = $this->_get_smtp_data();\n\n\t\t$this->_debug_msg[] = '<pre>'.$cmd.': '.$reply.'</pre>';\n\n\t\tif ((int) self::substr($reply, 0, 3) !== $resp)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_smtp_error', $reply);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($cmd === 'quit')\n\t\t{\n\t\t\tfclose($this->_smtp_connect);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * SMTP Authenticate\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _smtp_authenticate()\n\t{\n\t\tif ( ! $this->_smtp_auth)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif ($this->smtp_user === '' && $this->smtp_pass === '')\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_no_smtp_unpw');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_send_data('AUTH LOGIN');\n\n\t\t$reply = $this->_get_smtp_data();\n\n\t\tif (strpos($reply, '503') === 0)\t// Already authenticated\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telseif (strpos($reply, '334') !== 0)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_failed_smtp_login', $reply);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_send_data(base64_encode($this->smtp_user));\n\n\t\t$reply = $this->_get_smtp_data();\n\n\t\tif (strpos($reply, '334') !== 0)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_smtp_auth_un', $reply);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_send_data(base64_encode($this->smtp_pass));\n\n\t\t$reply = $this->_get_smtp_data();\n\n\t\tif (strpos($reply, '235') !== 0)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_smtp_auth_pw', $reply);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($this->smtp_keepalive)\n\t\t{\n\t\t\t$this->_smtp_auth = FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send SMTP data\n\t *\n\t * @param\tstring\t$data\n\t * @return\tbool\n\t */\n\tprotected function _send_data($data)\n\t{\n\t\t$data .= $this->newline;\n\t\tfor ($written = $timestamp = 0, $length = self::strlen($data); $written < $length; $written += $result)\n\t\t{\n\t\t\tif (($result = fwrite($this->_smtp_connect, self::substr($data, $written))) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// See https://bugs.php.net/bug.php?id=39598 and http://php.net/manual/en/function.fwrite.php#96951\n\t\t\telseif ($result === 0)\n\t\t\t{\n\t\t\t\tif ($timestamp === 0)\n\t\t\t\t{\n\t\t\t\t\t$timestamp = time();\n\t\t\t\t}\n\t\t\t\telseif ($timestamp < (time() - $this->smtp_timeout))\n\t\t\t\t{\n\t\t\t\t\t$result = FALSE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tusleep(250000);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$timestamp = 0;\n\t\t}\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\t$this->_set_error_message('lang:email_smtp_data_failure', $data);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get SMTP data\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _get_smtp_data()\n\t{\n\t\t$data = '';\n\n\t\twhile ($str = fgets($this->_smtp_connect, 512))\n\t\t{\n\t\t\t$data .= $str;\n\n\t\t\tif ($str[3] === ' ')\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Hostname\n\t *\n\t * There are only two legal types of hostname - either a fully\n\t * qualified domain name (eg: \"mail.example.com\") or an IP literal\n\t * (eg: \"[1.2.3.4]\").\n\t *\n\t * @link\thttps://tools.ietf.org/html/rfc5321#section-2.3.5\n\t * @link\thttp://cbl.abuseat.org/namingproblems.html\n\t * @return\tstring\n\t */\n\tprotected function _get_hostname()\n\t{\n\t\tif (isset($_SERVER['SERVER_NAME']))\n\t\t{\n\t\t\treturn $_SERVER['SERVER_NAME'];\n\t\t}\n\n\t\treturn isset($_SERVER['SERVER_ADDR']) ? '['.$_SERVER['SERVER_ADDR'].']' : '[127.0.0.1]';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Debug Message\n\t *\n\t * @param\tarray\t$include\tList of raw data chunks to include in the output\n\t *\t\t\t\t\tValid options are: 'headers', 'subject', 'body'\n\t * @return\tstring\n\t */\n\tpublic function print_debugger($include = array('headers', 'subject', 'body'))\n\t{\n\t\t$msg = '';\n\n\t\tif (count($this->_debug_msg) > 0)\n\t\t{\n\t\t\tforeach ($this->_debug_msg as $val)\n\t\t\t{\n\t\t\t\t$msg .= $val;\n\t\t\t}\n\t\t}\n\n\t\t// Determine which parts of our raw data needs to be printed\n\t\t$raw_data = '';\n\t\tis_array($include) OR $include = array($include);\n\n\t\tif (in_array('headers', $include, TRUE))\n\t\t{\n\t\t\t$raw_data = htmlspecialchars($this->_header_str).\"\\n\";\n\t\t}\n\n\t\tif (in_array('subject', $include, TRUE))\n\t\t{\n\t\t\t$raw_data .= htmlspecialchars($this->_subject).\"\\n\";\n\t\t}\n\n\t\tif (in_array('body', $include, TRUE))\n\t\t{\n\t\t\t$raw_data .= htmlspecialchars($this->_finalbody);\n\t\t}\n\n\t\treturn $msg.($raw_data === '' ? '' : '<pre>'.$raw_data.'</pre>');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Message\n\t *\n\t * @param\tstring\t$msg\n\t * @param\tstring\t$val = ''\n\t * @return\tvoid\n\t */\n\tprotected function _set_error_message($msg, $val = '')\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->lang->load('email');\n\n\t\tif (sscanf($msg, 'lang:%s', $line) !== 1 OR FALSE === ($line = $CI->lang->line($line)))\n\t\t{\n\t\t\t$this->_debug_msg[] = str_replace('%s', $val, $msg).'<br />';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_debug_msg[] = str_replace('%s', $val, $line).'<br />';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mime Types\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _mime_types($ext = '')\n\t{\n\t\t$ext = strtolower($ext);\n\n\t\t$mimes =& get_mimes();\n\n\t\tif (isset($mimes[$ext]))\n\t\t{\n\t\t\treturn is_array($mimes[$ext])\n\t\t\t\t? current($mimes[$ext])\n\t\t\t\t: $mimes[$ext];\n\t\t}\n\n\t\treturn 'application/x-unknown-content-type';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Destructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __destruct()\n\t{\n\t\tis_resource($this->_smtp_connect) && $this->_send_command('quit');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn (self::$func_overload)\n\t\t\t? mb_strlen($str, '8bit')\n\t\t\t: strlen($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe substr()\n\t *\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tprotected static function substr($str, $start, $length = NULL)\n\t{\n\t\tif (self::$func_overload)\n\t\t{\n\t\t\t// mb_substr($str, $start, null, '8bit') returns an empty\n\t\t\t// string on PHP 5.3\n\t\t\tisset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);\n\t\t\treturn mb_substr($str, $start, $length, '8bit');\n\t\t}\n\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Encrypt.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Encryption Class\n *\n * Provides two-way keyed encoding using Mcrypt\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/encryption.html\n */\nclass CI_Encrypt {\n\n\t/**\n\t * Reference to the user's encryption key\n\t *\n\t * @var string\n\t */\n\tpublic $encryption_key\t\t= '';\n\n\t/**\n\t * Type of hash operation\n\t *\n\t * @var string\n\t */\n\tprotected $_hash_type\t\t= 'sha1';\n\n\t/**\n\t * Flag for the existence of mcrypt\n\t *\n\t * @var bool\n\t */\n\tprotected $_mcrypt_exists\t= FALSE;\n\n\t/**\n\t * Current cipher to be used with mcrypt\n\t *\n\t * @var string\n\t */\n\tprotected $_mcrypt_cipher;\n\n\t/**\n\t * Method for encrypting/decrypting data\n\t *\n\t * @var int\n\t */\n\tprotected $_mcrypt_mode;\n\n\t/**\n\t * Initialize Encryption class\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tif (($this->_mcrypt_exists = function_exists('mcrypt_encrypt')) === FALSE)\n\t\t{\n\t\t\tshow_error('The Encrypt library requires the Mcrypt extension.');\n\t\t}\n\n\t\tlog_message('info', 'Encrypt Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch the encryption key\n\t *\n\t * Returns it as MD5 in order to have an exact-length 128 bit key.\n\t * Mcrypt is sensitive to keys that are not the correct length\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function get_key($key = '')\n\t{\n\t\tif ($key === '')\n\t\t{\n\t\t\tif ($this->encryption_key !== '')\n\t\t\t{\n\t\t\t\treturn $this->encryption_key;\n\t\t\t}\n\n\t\t\t$key = config_item('encryption_key');\n\n\t\t\tif ( ! self::strlen($key))\n\t\t\t{\n\t\t\t\tshow_error('In order to use the encryption class requires that you set an encryption key in your config file.');\n\t\t\t}\n\t\t}\n\n\t\treturn md5($key);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the encryption key\n\t *\n\t * @param\tstring\n\t * @return\tCI_Encrypt\n\t */\n\tpublic function set_key($key = '')\n\t{\n\t\t$this->encryption_key = $key;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encode\n\t *\n\t * Encodes the message string using bitwise XOR encoding.\n\t * The key is combined with a random hash, and then it\n\t * too gets converted using XOR. The whole thing is then run\n\t * through mcrypt using the randomized key. The end result\n\t * is a double-encrypted message string that is randomized\n\t * with each call to this function, even if the supplied\n\t * message and key are the same.\n\t *\n\t * @param\tstring\tthe string to encode\n\t * @param\tstring\tthe key\n\t * @return\tstring\n\t */\n\tpublic function encode($string, $key = '')\n\t{\n\t\treturn base64_encode($this->mcrypt_encode($string, $this->get_key($key)));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decode\n\t *\n\t * Reverses the above process\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function decode($string, $key = '')\n\t{\n\t\tif (preg_match('/[^a-zA-Z0-9\\/\\+=]/', $string) OR base64_encode(base64_decode($string)) !== $string)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $this->mcrypt_decode(base64_decode($string), $this->get_key($key));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encode from Legacy\n\t *\n\t * Takes an encoded string from the original Encryption class algorithms and\n\t * returns a newly encoded string using the improved method added in 2.0.0\n\t * This allows for backwards compatibility and a method to transition to the\n\t * new encryption algorithms.\n\t *\n\t * For more details, see https://codeigniter.com/userguide3/installation/upgrade_200.html#encryption\n\t *\n\t * @param\tstring\n\t * @param\tint\t\t(mcrypt mode constant)\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function encode_from_legacy($string, $legacy_mode = MCRYPT_MODE_ECB, $key = '')\n\t{\n\t\tif (preg_match('/[^a-zA-Z0-9\\/\\+=]/', $string))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// decode it first\n\t\t// set mode temporarily to what it was when string was encoded with the legacy\n\t\t// algorithm - typically MCRYPT_MODE_ECB\n\t\t$current_mode = $this->_get_mode();\n\t\t$this->set_mode($legacy_mode);\n\n\t\t$key = $this->get_key($key);\n\t\t$dec = base64_decode($string);\n\t\tif (($dec = $this->mcrypt_decode($dec, $key)) === FALSE)\n\t\t{\n\t\t\t$this->set_mode($current_mode);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$dec = $this->_xor_decode($dec, $key);\n\n\t\t// set the mcrypt mode back to what it should be, typically MCRYPT_MODE_CBC\n\t\t$this->set_mode($current_mode);\n\n\t\t// and re-encode\n\t\treturn base64_encode($this->mcrypt_encode($dec, $key));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * XOR Decode\n\t *\n\t * Takes an encoded string and key as input and generates the\n\t * plain-text original message\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _xor_decode($string, $key)\n\t{\n\t\t$string = $this->_xor_merge($string, $key);\n\n\t\t$dec = '';\n\t\tfor ($i = 0, $l = self::strlen($string); $i < $l; $i++)\n\t\t{\n\t\t\t$dec .= ($string[$i++] ^ $string[$i]);\n\t\t}\n\n\t\treturn $dec;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * XOR key + string Combiner\n\t *\n\t * Takes a string and key as input and computes the difference using XOR\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _xor_merge($string, $key)\n\t{\n\t\t$hash = $this->hash($key);\n\t\t$str = '';\n\n\t\tfor ($i = 0, $ls = self::strlen($string), $lh = self::strlen($hash); $i < $ls; $i++)\n\t\t{\n\t\t\t$str .= $string[$i] ^ $hash[($i % $lh)];\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encrypt using Mcrypt\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function mcrypt_encode($data, $key)\n\t{\n\t\t$init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());\n\t\t$init_vect = mcrypt_create_iv($init_size, MCRYPT_DEV_URANDOM);\n\t\treturn $this->_add_cipher_noise($init_vect.mcrypt_encrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), $key);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decrypt using Mcrypt\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function mcrypt_decode($data, $key)\n\t{\n\t\t$data = $this->_remove_cipher_noise($data, $key);\n\t\t$init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());\n\n\t\tif ($init_size > self::strlen($data))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$init_vect = self::substr($data, 0, $init_size);\n\t\t$data      = self::substr($data, $init_size);\n\n\t\treturn rtrim(mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), \"\\0\");\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Adds permuted noise to the IV + encrypted data to protect\n\t * against Man-in-the-middle attacks on CBC mode ciphers\n\t * http://www.ciphersbyritter.com/GLOSSARY.HTM#IV\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _add_cipher_noise($data, $key)\n\t{\n\t\t$key = $this->hash($key);\n\t\t$str = '';\n\n\t\tfor ($i = 0, $j = 0, $ld = self::strlen($data), $lk = self::strlen($key); $i < $ld; ++$i, ++$j)\n\t\t{\n\t\t\tif ($j >= $lk)\n\t\t\t{\n\t\t\t\t$j = 0;\n\t\t\t}\n\n\t\t\t$str .= chr((ord($data[$i]) + ord($key[$j])) % 256);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Removes permuted noise from the IV + encrypted data, reversing\n\t * _add_cipher_noise()\n\t *\n\t * Function description\n\t *\n\t * @param\tstring\t$data\n\t * @param\tstring\t$key\n\t * @return\tstring\n\t */\n\tprotected function _remove_cipher_noise($data, $key)\n\t{\n\t\t$key = $this->hash($key);\n\t\t$str = '';\n\n\t\tfor ($i = 0, $j = 0, $ld = self::strlen($data), $lk = self::strlen($key); $i < $ld; ++$i, ++$j)\n\t\t{\n\t\t\tif ($j >= $lk)\n\t\t\t{\n\t\t\t\t$j = 0;\n\t\t\t}\n\n\t\t\t$temp = ord($data[$i]) - ord($key[$j]);\n\n\t\t\tif ($temp < 0)\n\t\t\t{\n\t\t\t\t$temp += 256;\n\t\t\t}\n\n\t\t\t$str .= chr($temp);\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Mcrypt Cipher\n\t *\n\t * @param\tint\n\t * @return\tCI_Encrypt\n\t */\n\tpublic function set_cipher($cipher)\n\t{\n\t\t$this->_mcrypt_cipher = $cipher;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Mcrypt Mode\n\t *\n\t * @param\tint\n\t * @return\tCI_Encrypt\n\t */\n\tpublic function set_mode($mode)\n\t{\n\t\t$this->_mcrypt_mode = $mode;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Mcrypt cipher Value\n\t *\n\t * @return\tint\n\t */\n\tprotected function _get_cipher()\n\t{\n\t\tif ($this->_mcrypt_cipher === NULL)\n\t\t{\n\t\t\treturn $this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256;\n\t\t}\n\n\t\treturn $this->_mcrypt_cipher;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Mcrypt Mode Value\n\t *\n\t * @return\tint\n\t */\n\tprotected function _get_mode()\n\t{\n\t\tif ($this->_mcrypt_mode === NULL)\n\t\t{\n\t\t\treturn $this->_mcrypt_mode = MCRYPT_MODE_CBC;\n\t\t}\n\n\t\treturn $this->_mcrypt_mode;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Hash type\n\t *\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function set_hash($type = 'sha1')\n\t{\n\t\t$this->_hash_type = in_array($type, hash_algos()) ? $type : 'sha1';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Hash encode a string\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function hash($str)\n\t{\n\t\treturn hash($this->_hash_type, $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn defined('MB_OVERLOAD_STRING')\n\t\t\t? mb_strlen($str, '8bit')\n\t\t\t: strlen($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe substr()\n\t *\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tprotected static function substr($str, $start, $length = NULL)\n\t{\n\t\tif (defined('MB_OVERLOAD_STRING'))\n\t\t{\n\t\t\t// mb_substr($str, $start, null, '8bit') returns an empty\n\t\t\t// string on PHP 5.3\n\t\t\tisset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);\n\t\t\treturn mb_substr($str, $start, $length, '8bit');\n\t\t}\n\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Encryption.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Encryption Class\n *\n * Provides two-way keyed encryption via PHP's MCrypt and/or OpenSSL extensions.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/libraries/encryption.html\n */\nclass CI_Encryption {\n\n\t/**\n\t * Encryption cipher\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_cipher = 'aes-128';\n\n\t/**\n\t * Cipher mode\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_mode = 'cbc';\n\n\t/**\n\t * Cipher handle\n\t *\n\t * @var\tmixed\n\t */\n\tprotected $_handle;\n\n\t/**\n\t * Encryption key\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_key;\n\n\t/**\n\t * PHP extension to be used\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_driver;\n\n\t/**\n\t * List of usable drivers (PHP extensions)\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_drivers = array();\n\n\t/**\n\t * List of available modes\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_modes = array(\n\t\t'mcrypt' => array(\n\t\t\t'cbc' => 'cbc',\n\t\t\t'ecb' => 'ecb',\n\t\t\t'ofb' => 'nofb',\n\t\t\t'ofb8' => 'ofb',\n\t\t\t'cfb' => 'ncfb',\n\t\t\t'cfb8' => 'cfb',\n\t\t\t'ctr' => 'ctr',\n\t\t\t'stream' => 'stream'\n\t\t),\n\t\t'openssl' => array(\n\t\t\t'cbc' => 'cbc',\n\t\t\t'ecb' => 'ecb',\n\t\t\t'ofb' => 'ofb',\n\t\t\t'cfb' => 'cfb',\n\t\t\t'cfb8' => 'cfb8',\n\t\t\t'ctr' => 'ctr',\n\t\t\t'stream' => '',\n\t\t\t'xts' => 'xts'\n\t\t)\n\t);\n\n\t/**\n\t * List of supported HMAC algorithms\n\t *\n\t * name => digest size pairs\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_digests = array(\n\t\t'sha224' => 28,\n\t\t'sha256' => 32,\n\t\t'sha384' => 48,\n\t\t'sha512' => 64\n\t);\n\n\t/**\n\t * mbstring.func_overload flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected static $func_overload;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(array $params = array())\n\t{\n\t\t$this->_drivers = array(\n\t\t\t'mcrypt'  => defined('MCRYPT_DEV_URANDOM'),\n\t\t\t'openssl' => extension_loaded('openssl')\n\t\t);\n\n\t\tif ( ! $this->_drivers['mcrypt'] && ! $this->_drivers['openssl'])\n\t\t{\n\t\t\tshow_error('Encryption: Unable to find an available encryption driver.');\n\t\t}\n\n\t\tisset(self::$func_overload) OR self::$func_overload = ( ! is_php('8.0') && extension_loaded('mbstring') && @ini_get('mbstring.func_overload'));\n\t\t$this->initialize($params);\n\n\t\tif ( ! isset($this->_key) && self::strlen($key = config_item('encryption_key')) > 0)\n\t\t{\n\t\t\t$this->_key = $key;\n\t\t}\n\n\t\tlog_message('info', 'Encryption Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tCI_Encryption\n\t */\n\tpublic function initialize(array $params)\n\t{\n\t\tif ( ! empty($params['driver']))\n\t\t{\n\t\t\tif (isset($this->_drivers[$params['driver']]))\n\t\t\t{\n\t\t\t\tif ($this->_drivers[$params['driver']])\n\t\t\t\t{\n\t\t\t\t\t$this->_driver = $params['driver'];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlog_message('error', \"Encryption: Driver '\".$params['driver'].\"' is not available.\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlog_message('error', \"Encryption: Unknown driver '\".$params['driver'].\"' cannot be configured.\");\n\t\t\t}\n\t\t}\n\n\t\tif (empty($this->_driver))\n\t\t{\n\t\t\t$this->_driver = ($this->_drivers['openssl'] === TRUE)\n\t\t\t\t? 'openssl'\n\t\t\t\t: 'mcrypt';\n\n\t\t\tlog_message('debug', \"Encryption: Auto-configured driver '\".$this->_driver.\"'.\");\n\t\t}\n\n\t\tempty($params['cipher']) && $params['cipher'] = $this->_cipher;\n\t\tempty($params['key']) OR $this->_key = $params['key'];\n\t\t$this->{'_'.$this->_driver.'_initialize'}($params);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize MCrypt\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tprotected function _mcrypt_initialize($params)\n\t{\n\t\tif ( ! empty($params['cipher']))\n\t\t{\n\t\t\t$params['cipher'] = strtolower($params['cipher']);\n\t\t\t$this->_cipher_alias($params['cipher']);\n\n\t\t\tif ( ! in_array($params['cipher'], mcrypt_list_algorithms(), TRUE))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Encryption: MCrypt cipher '.strtoupper($params['cipher']).' is not available.');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_cipher = $params['cipher'];\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty($params['mode']))\n\t\t{\n\t\t\t$params['mode'] = strtolower($params['mode']);\n\t\t\tif ( ! isset($this->_modes['mcrypt'][$params['mode']]))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Encryption: MCrypt mode '.strtoupper($params['mode']).' is not available.');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_mode = $this->_modes['mcrypt'][$params['mode']];\n\t\t\t}\n\t\t}\n\n\t\tif (isset($this->_cipher, $this->_mode))\n\t\t{\n\t\t\tif (is_resource($this->_handle)\n\t\t\t\t&& (strtolower(mcrypt_enc_get_algorithms_name($this->_handle)) !== $this->_cipher\n\t\t\t\t\tOR strtolower(mcrypt_enc_get_modes_name($this->_handle)) !== $this->_mode)\n\t\t\t)\n\t\t\t{\n\t\t\t\tmcrypt_module_close($this->_handle);\n\t\t\t}\n\n\t\t\tif ($this->_handle = mcrypt_module_open($this->_cipher, '', $this->_mode, ''))\n\t\t\t{\n\t\t\t\tlog_message('info', 'Encryption: MCrypt cipher '.strtoupper($this->_cipher).' initialized in '.strtoupper($this->_mode).' mode.');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlog_message('error', 'Encryption: Unable to initialize MCrypt with cipher '.strtoupper($this->_cipher).' in '.strtoupper($this->_mode).' mode.');\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize OpenSSL\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tprotected function _openssl_initialize($params)\n\t{\n\t\tif ( ! empty($params['cipher']))\n\t\t{\n\t\t\t$params['cipher'] = strtolower($params['cipher']);\n\t\t\t$this->_cipher_alias($params['cipher']);\n\t\t\t$this->_cipher = $params['cipher'];\n\t\t}\n\n\t\tif ( ! empty($params['mode']))\n\t\t{\n\t\t\t$params['mode'] = strtolower($params['mode']);\n\t\t\tif ( ! isset($this->_modes['openssl'][$params['mode']]))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Encryption: OpenSSL mode '.strtoupper($params['mode']).' is not available.');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_mode = $this->_modes['openssl'][$params['mode']];\n\t\t\t}\n\t\t}\n\n\t\tif (isset($this->_cipher, $this->_mode))\n\t\t{\n\t\t\t// This is mostly for the stream mode, which doesn't get suffixed in OpenSSL\n\t\t\t$handle = empty($this->_mode)\n\t\t\t\t? $this->_cipher\n\t\t\t\t: $this->_cipher.'-'.$this->_mode;\n\n\t\t\tif ( ! in_array($handle, openssl_get_cipher_methods(), TRUE))\n\t\t\t{\n\t\t\t\t$this->_handle = NULL;\n\t\t\t\tlog_message('error', 'Encryption: Unable to initialize OpenSSL with method '.strtoupper($handle).'.');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->_handle = $handle;\n\t\t\t\tlog_message('info', 'Encryption: OpenSSL initialized with method '.strtoupper($handle).'.');\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create a random key\n\t *\n\t * @param\tint\t$length\tOutput length\n\t * @return\tstring\n\t */\n\tpublic function create_key($length)\n\t{\n\t\tif (function_exists('random_bytes'))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn random_bytes((int) $length);\n\t\t\t}\n\t\t\tcatch (Exception $e)\n\t\t\t{\n\t\t\t\tlog_message('error', $e->getMessage());\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\telseif (defined('MCRYPT_DEV_URANDOM'))\n\t\t{\n\t\t\treturn mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);\n\t\t}\n\n\t\t$is_secure = NULL;\n\t\t$key = openssl_random_pseudo_bytes($length, $is_secure);\n\t\treturn ($is_secure === TRUE)\n\t\t\t? $key\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encrypt\n\t *\n\t * @param\tstring\t$data\tInput data\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tstring\n\t */\n\tpublic function encrypt($data, array $params = NULL)\n\t{\n\t\tif (($params = $this->_get_params($params)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tisset($params['key']) OR $params['key'] = $this->hkdf($this->_key, 'sha512', NULL, self::strlen($this->_key), 'encryption');\n\n\t\tif (($data = $this->{'_'.$this->_driver.'_encrypt'}($data, $params)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$params['base64'] && $data = base64_encode($data);\n\n\t\tif (isset($params['hmac_digest']))\n\t\t{\n\t\t\tisset($params['hmac_key']) OR $params['hmac_key'] = $this->hkdf($this->_key, 'sha512', NULL, NULL, 'authentication');\n\t\t\treturn hash_hmac($params['hmac_digest'], $data, $params['hmac_key'], ! $params['base64']).$data;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encrypt via MCrypt\n\t *\n\t * @param\tstring\t$data\tInput data\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tstring\n\t */\n\tprotected function _mcrypt_encrypt($data, $params)\n\t{\n\t\tif ( ! is_resource($params['handle']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// The greater-than-1 comparison is mostly a work-around for a bug,\n\t\t// where 1 is returned for ARCFour instead of 0.\n\t\t$iv = (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1)\n\t\t\t? $this->create_key($iv_size)\n\t\t\t: NULL;\n\n\t\tif (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0)\n\t\t{\n\t\t\tif ($params['handle'] !== $this->_handle)\n\t\t\t{\n\t\t\t\tmcrypt_module_close($params['handle']);\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Use PKCS#7 padding in order to ensure compatibility with OpenSSL\n\t\t// and other implementations outside of PHP.\n\t\tif (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE))\n\t\t{\n\t\t\t$block_size = mcrypt_enc_get_block_size($params['handle']);\n\t\t\t$pad = $block_size - (self::strlen($data) % $block_size);\n\t\t\t$data .= str_repeat(chr($pad), $pad);\n\t\t}\n\n\t\t// Work-around for yet another strange behavior in MCrypt.\n\t\t//\n\t\t// When encrypting in ECB mode, the IV is ignored. Yet\n\t\t// mcrypt_enc_get_iv_size() returns a value larger than 0\n\t\t// even if ECB is used AND mcrypt_generic_init() complains\n\t\t// if you don't pass an IV with length equal to the said\n\t\t// return value.\n\t\t//\n\t\t// This probably would've been fine (even though still wasteful),\n\t\t// but OpenSSL isn't that dumb and we need to make the process\n\t\t// portable, so ...\n\t\t$data = (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB')\n\t\t\t? $iv.mcrypt_generic($params['handle'], $data)\n\t\t\t: mcrypt_generic($params['handle'], $data);\n\n\t\tmcrypt_generic_deinit($params['handle']);\n\t\tif ($params['handle'] !== $this->_handle)\n\t\t{\n\t\t\tmcrypt_module_close($params['handle']);\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encrypt via OpenSSL\n\t *\n\t * @param\tstring\t$data\tInput data\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tstring\n\t */\n\tprotected function _openssl_encrypt($data, $params)\n\t{\n\t\tif (empty($params['handle']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$iv = ($iv_size = openssl_cipher_iv_length($params['handle']))\n\t\t\t? $this->create_key($iv_size)\n\t\t\t: '';\n\n\t\t$data = openssl_encrypt(\n\t\t\t$data,\n\t\t\t$params['handle'],\n\t\t\t$params['key'],\n\t\t\t1, // DO NOT TOUCH!\n\t\t\t$iv\n\t\t);\n\n\t\tif ($data === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $iv.$data;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decrypt\n\t *\n\t * @param\tstring\t$data\tEncrypted data\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tstring\n\t */\n\tpublic function decrypt($data, array $params = NULL)\n\t{\n\t\tif (($params = $this->_get_params($params)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (isset($params['hmac_digest']))\n\t\t{\n\t\t\t// This might look illogical, but it is done during encryption as well ...\n\t\t\t// The 'base64' value is effectively an inverted \"raw data\" parameter\n\t\t\t$digest_size = ($params['base64'])\n\t\t\t\t? $this->_digests[$params['hmac_digest']] * 2\n\t\t\t\t: $this->_digests[$params['hmac_digest']];\n\n\t\t\tif (self::strlen($data) <= $digest_size)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$hmac_input = self::substr($data, 0, $digest_size);\n\t\t\t$data = self::substr($data, $digest_size);\n\n\t\t\tisset($params['hmac_key']) OR $params['hmac_key'] = $this->hkdf($this->_key, 'sha512', NULL, NULL, 'authentication');\n\t\t\t$hmac_check = hash_hmac($params['hmac_digest'], $data, $params['hmac_key'], ! $params['base64']);\n\n\t\t\t// Time-attack-safe comparison\n\t\t\t$diff = 0;\n\t\t\tfor ($i = 0; $i < $digest_size; $i++)\n\t\t\t{\n\t\t\t\t$diff |= ord($hmac_input[$i]) ^ ord($hmac_check[$i]);\n\t\t\t}\n\n\t\t\tif ($diff !== 0)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\tif ($params['base64'])\n\t\t{\n\t\t\t$data = base64_decode($data);\n\t\t}\n\n\t\tisset($params['key']) OR $params['key'] = $this->hkdf($this->_key, 'sha512', NULL, self::strlen($this->_key), 'encryption');\n\n\t\treturn $this->{'_'.$this->_driver.'_decrypt'}($data, $params);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decrypt via MCrypt\n\t *\n\t * @param\tstring\t$data\tEncrypted data\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tstring\n\t */\n\tprotected function _mcrypt_decrypt($data, $params)\n\t{\n\t\tif ( ! is_resource($params['handle']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// The greater-than-1 comparison is mostly a work-around for a bug,\n\t\t// where 1 is returned for ARCFour instead of 0.\n\t\tif (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1)\n\t\t{\n\t\t\tif (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB')\n\t\t\t{\n\t\t\t\t$iv = self::substr($data, 0, $iv_size);\n\t\t\t\t$data = self::substr($data, $iv_size);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// MCrypt is dumb and this is ignored, only size matters\n\t\t\t\t$iv = str_repeat(\"\\x0\", $iv_size);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$iv = '';\n\t\t}\n\n\t\tif (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0)\n\t\t{\n\t\t\tif ($params['handle'] !== $this->_handle)\n\t\t\t{\n\t\t\t\tmcrypt_module_close($params['handle']);\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$data = mdecrypt_generic($params['handle'], $data);\n\t\t// Remove PKCS#7 padding, if necessary\n\t\tif (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE))\n\t\t{\n\t\t\t$data = self::substr($data, 0, -ord($data[self::strlen($data)-1]));\n\t\t}\n\n\t\tmcrypt_generic_deinit($params['handle']);\n\t\tif ($params['handle'] !== $this->_handle)\n\t\t{\n\t\t\tmcrypt_module_close($params['handle']);\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decrypt via OpenSSL\n\t *\n\t * @param\tstring\t$data\tEncrypted data\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tstring\n\t */\n\tprotected function _openssl_decrypt($data, $params)\n\t{\n\t\tif ($iv_size = openssl_cipher_iv_length($params['handle']))\n\t\t{\n\t\t\t$iv = self::substr($data, 0, $iv_size);\n\t\t\t$data = self::substr($data, $iv_size);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$iv = '';\n\t\t}\n\n\t\treturn empty($params['handle'])\n\t\t\t? FALSE\n\t\t\t: openssl_decrypt(\n\t\t\t\t$data,\n\t\t\t\t$params['handle'],\n\t\t\t\t$params['key'],\n\t\t\t\t1, // DO NOT TOUCH!\n\t\t\t\t$iv\n\t\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get params\n\t *\n\t * @param\tarray\t$params\tInput parameters\n\t * @return\tarray\n\t */\n\tprotected function _get_params($params)\n\t{\n\t\tif (empty($params))\n\t\t{\n\t\t\treturn isset($this->_cipher, $this->_mode, $this->_key, $this->_handle)\n\t\t\t\t? array(\n\t\t\t\t\t'handle' => $this->_handle,\n\t\t\t\t\t'cipher' => $this->_cipher,\n\t\t\t\t\t'mode' => $this->_mode,\n\t\t\t\t\t'key' => NULL,\n\t\t\t\t\t'base64' => TRUE,\n\t\t\t\t\t'hmac_digest' => 'sha512',\n\t\t\t\t\t'hmac_key' => NULL\n\t\t\t\t)\n\t\t\t\t: FALSE;\n\t\t}\n\t\telseif ( ! isset($params['cipher'], $params['mode'], $params['key']))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (isset($params['mode']))\n\t\t{\n\t\t\t$params['mode'] = strtolower($params['mode']);\n\t\t\tif ( ! isset($this->_modes[$this->_driver][$params['mode']]))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$params['mode'] = $this->_modes[$this->_driver][$params['mode']];\n\t\t}\n\n\t\tif (isset($params['hmac']) && $params['hmac'] === FALSE)\n\t\t{\n\t\t\t$params['hmac_digest'] = $params['hmac_key'] = NULL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ( ! isset($params['hmac_key']))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telseif (isset($params['hmac_digest']))\n\t\t\t{\n\t\t\t\t$params['hmac_digest'] = strtolower($params['hmac_digest']);\n\t\t\t\tif ( ! isset($this->_digests[$params['hmac_digest']]))\n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$params['hmac_digest'] = 'sha512';\n\t\t\t}\n\t\t}\n\n\t\t$params = array(\n\t\t\t'handle' => NULL,\n\t\t\t'cipher' => $params['cipher'],\n\t\t\t'mode' => $params['mode'],\n\t\t\t'key' => $params['key'],\n\t\t\t'base64' => isset($params['raw_data']) ? ! $params['raw_data'] : FALSE,\n\t\t\t'hmac_digest' => $params['hmac_digest'],\n\t\t\t'hmac_key' => $params['hmac_key']\n\t\t);\n\n\t\t$this->_cipher_alias($params['cipher']);\n\t\t$params['handle'] = ($params['cipher'] !== $this->_cipher OR $params['mode'] !== $this->_mode)\n\t\t\t? $this->{'_'.$this->_driver.'_get_handle'}($params['cipher'], $params['mode'])\n\t\t\t: $this->_handle;\n\n\t\treturn $params;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get MCrypt handle\n\t *\n\t * @param\tstring\t$cipher\tCipher name\n\t * @param\tstring\t$mode\tEncryption mode\n\t * @return\tresource\n\t */\n\tprotected function _mcrypt_get_handle($cipher, $mode)\n\t{\n\t\treturn mcrypt_module_open($cipher, '', $mode, '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get OpenSSL handle\n\t *\n\t * @param\tstring\t$cipher\tCipher name\n\t * @param\tstring\t$mode\tEncryption mode\n\t * @return\tstring\n\t */\n\tprotected function _openssl_get_handle($cipher, $mode)\n\t{\n\t\t// OpenSSL methods aren't suffixed with '-stream' for this mode\n\t\treturn ($mode === 'stream')\n\t\t\t? $cipher\n\t\t\t: $cipher.'-'.$mode;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Cipher alias\n\t *\n\t * Tries to translate cipher names between MCrypt and OpenSSL's \"dialects\".\n\t *\n\t * @param\tstring\t$cipher\tCipher name\n\t * @return\tvoid\n\t */\n\tprotected function _cipher_alias(&$cipher)\n\t{\n\t\tstatic $dictionary;\n\n\t\tif (empty($dictionary))\n\t\t{\n\t\t\t$dictionary = array(\n\t\t\t\t'mcrypt' => array(\n\t\t\t\t\t'aes-128' => 'rijndael-128',\n\t\t\t\t\t'aes-192' => 'rijndael-128',\n\t\t\t\t\t'aes-256' => 'rijndael-128',\n\t\t\t\t\t'des3-ede3' => 'tripledes',\n\t\t\t\t\t'bf' => 'blowfish',\n\t\t\t\t\t'cast5' => 'cast-128',\n\t\t\t\t\t'rc4' => 'arcfour',\n\t\t\t\t\t'rc4-40' => 'arcfour'\n\t\t\t\t),\n\t\t\t\t'openssl' => array(\n\t\t\t\t\t'rijndael-128' => 'aes-128',\n\t\t\t\t\t'tripledes' => 'des-ede3',\n\t\t\t\t\t'blowfish' => 'bf',\n\t\t\t\t\t'cast-128' => 'cast5',\n\t\t\t\t\t'arcfour' => 'rc4-40',\n\t\t\t\t\t'rc4' => 'rc4-40'\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Notes:\n\t\t\t//\n\t\t\t// - Rijndael-128 is, at the same time all three of AES-128,\n\t\t\t//   AES-192 and AES-256. The only difference between them is\n\t\t\t//   the key size. Rijndael-192, Rijndael-256 on the other hand\n\t\t\t//   also have different block sizes and are NOT AES-compatible.\n\t\t\t//\n\t\t\t// - Blowfish is said to be supporting key sizes between\n\t\t\t//   4 and 56 bytes, but it appears that between MCrypt and\n\t\t\t//   OpenSSL, only those of 16 and more bytes are compatible.\n\t\t\t//   Also, don't know what MCrypt's 'blowfish-compat' is.\n\t\t\t//\n\t\t\t// - CAST-128/CAST5 produces a longer cipher when encrypted via\n\t\t\t//   OpenSSL, but (strangely enough) can be decrypted by either\n\t\t\t//   extension anyway.\n\t\t\t//   Also, it appears that OpenSSL uses 16 rounds regardless of\n\t\t\t//   the key size, while RFC2144 says that for key sizes lower\n\t\t\t//   than 11 bytes, only 12 rounds should be used. This makes\n\t\t\t//   it portable only with keys of between 11 and 16 bytes.\n\t\t\t//\n\t\t\t// - RC4 (ARCFour) has a strange implementation under OpenSSL.\n\t\t\t//   Its 'rc4-40' cipher method seems to work flawlessly, yet\n\t\t\t//   there's another one, 'rc4' that only works with a 16-byte key.\n\t\t\t//\n\t\t\t// - DES is compatible, but doesn't need an alias.\n\t\t\t//\n\t\t\t// Other seemingly matching ciphers between MCrypt, OpenSSL:\n\t\t\t//\n\t\t\t// - RC2 is NOT compatible and only an obscure forum post\n\t\t\t//   confirms that it is MCrypt's fault.\n\t\t}\n\n\t\tif (isset($dictionary[$this->_driver][$cipher]))\n\t\t{\n\t\t\t$cipher = $dictionary[$this->_driver][$cipher];\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * HKDF\n\t *\n\t * @link\thttps://tools.ietf.org/rfc/rfc5869.txt\n\t * @param\t$key\tInput key\n\t * @param\t$digest\tA SHA-2 hashing algorithm\n\t * @param\t$salt\tOptional salt\n\t * @param\t$length\tOutput length (defaults to the selected digest size)\n\t * @param\t$info\tOptional context/application-specific info\n\t * @return\tstring\tA pseudo-random key\n\t */\n\tpublic function hkdf($key, $digest = 'sha512', $salt = NULL, $length = NULL, $info = '')\n\t{\n\t\tif ( ! isset($this->_digests[$digest]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (empty($length) OR ! is_int($length))\n\t\t{\n\t\t\t$length = $this->_digests[$digest];\n\t\t}\n\t\telseif ($length > (255 * $this->_digests[$digest]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tself::strlen($salt) OR $salt = str_repeat(\"\\0\", $this->_digests[$digest]);\n\n\t\t$prk = hash_hmac($digest, $key, $salt, TRUE);\n\t\t$key = '';\n\t\tfor ($key_block = '', $block_index = 1; self::strlen($key) < $length; $block_index++)\n\t\t{\n\t\t\t$key_block = hash_hmac($digest, $key_block.$info.chr($block_index), $prk, TRUE);\n\t\t\t$key .= $key_block;\n\t\t}\n\n\t\treturn self::substr($key, 0, $length);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * __get() magic\n\t *\n\t * @param\tstring\t$key\tProperty name\n\t * @return\tmixed\n\t */\n\tpublic function __get($key)\n\t{\n\t\t// Because aliases\n\t\tif ($key === 'mode')\n\t\t{\n\t\t\treturn array_search($this->_mode, $this->_modes[$this->_driver], TRUE);\n\t\t}\n\t\telseif (in_array($key, array('cipher', 'driver', 'drivers', 'digests'), TRUE))\n\t\t{\n\t\t\treturn $this->{'_'.$key};\n\t\t}\n\n\t\treturn NULL;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn (self::$func_overload)\n\t\t\t? mb_strlen((string) $str, '8bit')\n\t\t\t: strlen((string) $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe substr()\n\t *\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tprotected static function substr($str, $start, $length = NULL)\n\t{\n\t\tif (self::$func_overload)\n\t\t{\n\t\t\t// mb_substr($str, $start, null, '8bit') returns an empty\n\t\t\t// string on PHP 5.3\n\t\t\tisset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);\n\t\t\treturn mb_substr($str, $start, $length, '8bit');\n\t\t}\n\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Form_validation.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Form Validation Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tValidation\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/form_validation.html\n */\nclass CI_Form_validation {\n\n\t/**\n\t * Reference to the CodeIgniter instance\n\t *\n\t * @var object\n\t */\n\tprotected $CI;\n\n\t/**\n\t * Validation data for the current form submission\n\t *\n\t * @var array\n\t */\n\tprotected $_field_data\t\t= array();\n\n\t/**\n\t * Validation rules for the current form\n\t *\n\t * @var array\n\t */\n\tprotected $_config_rules\t= array();\n\n\t/**\n\t * Array of validation errors\n\t *\n\t * @var array\n\t */\n\tprotected $_error_array\t\t= array();\n\n\t/**\n\t * Array of custom error messages\n\t *\n\t * @var array\n\t */\n\tprotected $_error_messages\t= array();\n\n\t/**\n\t * Start tag for error wrapping\n\t *\n\t * @var string\n\t */\n\tprotected $_error_prefix\t= '<p>';\n\n\t/**\n\t * End tag for error wrapping\n\t *\n\t * @var string\n\t */\n\tprotected $_error_suffix\t= '</p>';\n\n\t/**\n\t * Custom error message\n\t *\n\t * @var string\n\t */\n\tprotected $error_string\t\t= '';\n\n\t/**\n\t * Whether the form data has been validated as safe\n\t *\n\t * @var bool\n\t */\n\tprotected $_safe_form_data\t= FALSE;\n\n\t/**\n\t * Custom data to validate\n\t *\n\t * @var array\n\t */\n\tpublic $validation_data\t= array();\n\n\t/**\n\t * Initialize Form_Validation class\n\t *\n\t * @param\tarray\t$rules\n\t * @return\tvoid\n\t */\n\tpublic function __construct($rules = array())\n\t{\n\t\t$this->CI =& get_instance();\n\n\t\t// applies delimiters set in config file.\n\t\tif (isset($rules['error_prefix']))\n\t\t{\n\t\t\t$this->_error_prefix = $rules['error_prefix'];\n\t\t\tunset($rules['error_prefix']);\n\t\t}\n\t\tif (isset($rules['error_suffix']))\n\t\t{\n\t\t\t$this->_error_suffix = $rules['error_suffix'];\n\t\t\tunset($rules['error_suffix']);\n\t\t}\n\n\t\t// Validation rules can be stored in a config file.\n\t\t$this->_config_rules = $rules;\n\n\t\t// Automatically load the form helper\n\t\t$this->CI->load->helper('form');\n\n\t\tlog_message('info', 'Form Validation Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Rules\n\t *\n\t * This function takes an array of field names and validation\n\t * rules as input, any custom error messages, validates the info,\n\t * and stores it\n\t *\n\t * @param\tmixed\t$field\n\t * @param\tstring\t$label\n\t * @param\tmixed\t$rules\n\t * @param\tarray\t$errors\n\t * @return\tCI_Form_validation\n\t */\n\tpublic function set_rules($field, $label = '', $rules = array(), $errors = array())\n\t{\n\t\t// No reason to set rules if we have no POST data\n\t\t// or a validation array has not been specified\n\t\tif ($this->CI->input->method() !== 'post' && empty($this->validation_data))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\n\t\t// If an array was passed via the first parameter instead of individual string\n\t\t// values we cycle through it and recursively call this function.\n\t\tif (is_array($field))\n\t\t{\n\t\t\tforeach ($field as $row)\n\t\t\t{\n\t\t\t\t// Houston, we have a problem...\n\t\t\t\tif ( ! isset($row['field'], $row['rules']))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// If the field label wasn't passed we use the field name\n\t\t\t\t$label = isset($row['label']) ? $row['label'] : $row['field'];\n\n\t\t\t\t// Add the custom error message array\n\t\t\t\t$errors = (isset($row['errors']) && is_array($row['errors'])) ? $row['errors'] : array();\n\n\t\t\t\t// Here we go!\n\t\t\t\t$this->set_rules($row['field'], $label, $row['rules'], $errors);\n\t\t\t}\n\n\t\t\treturn $this;\n\t\t}\n\n\t\t// No fields or no rules? Nothing to do...\n\t\tif ( ! is_string($field) OR $field === '' OR empty($rules))\n\t\t{\n\t\t\treturn $this;\n\t\t}\n\t\telseif ( ! is_array($rules))\n\t\t{\n\t\t\t// BC: Convert pipe-separated rules string to an array\n\t\t\tif ( ! is_string($rules))\n\t\t\t{\n\t\t\t\treturn $this;\n\t\t\t}\n\n\t\t\t$rules = preg_split('/\\|(?![^\\[]*\\])/', $rules);\n\t\t}\n\n\t\t// If the field label wasn't passed we use the field name\n\t\t$label = ($label === '') ? $field : $label;\n\n\t\t$indexes = array();\n\n\t\t// Is the field name an array? If it is an array, we break it apart\n\t\t// into its components so that we can fetch the corresponding POST data later\n\t\tif (($is_array = (bool) preg_match_all('/\\[(.*?)\\]/', $field, $matches)) === TRUE)\n\t\t{\n\t\t\tsscanf($field, '%[^[][', $indexes[0]);\n\n\t\t\tfor ($i = 0, $c = count($matches[0]); $i < $c; $i++)\n\t\t\t{\n\t\t\t\tif ($matches[1][$i] !== '')\n\t\t\t\t{\n\t\t\t\t\t$indexes[] = $matches[1][$i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build our master array\n\t\t$this->_field_data[$field] = array(\n\t\t\t'field'\t\t=> $field,\n\t\t\t'label'\t\t=> $label,\n\t\t\t'rules'\t\t=> $rules,\n\t\t\t'errors'\t=> $errors,\n\t\t\t'is_array'\t=> $is_array,\n\t\t\t'keys'\t\t=> $indexes,\n\t\t\t'postdata'\t=> NULL,\n\t\t\t'error'\t\t=> ''\n\t\t);\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * By default, form validation uses the $_POST array to validate\n\t *\n\t * If an array is set through this method, then this array will\n\t * be used instead of the $_POST array\n\t *\n\t * Note that if you are validating multiple arrays, then the\n\t * reset_validation() function should be called after validating\n\t * each array due to the limitations of CI's singleton\n\t *\n\t * @param\tarray\t$data\n\t * @return\tCI_Form_validation\n\t */\n\tpublic function set_data(array $data)\n\t{\n\t\tif ( ! empty($data))\n\t\t{\n\t\t\t$this->validation_data = $data;\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Error Message\n\t *\n\t * Lets users set their own error messages on the fly. Note:\n\t * The key name has to match the function name that it corresponds to.\n\t *\n\t * @param\tarray\n\t * @param\tstring\n\t * @return\tCI_Form_validation\n\t */\n\tpublic function set_message($lang, $val = '')\n\t{\n\t\tif ( ! is_array($lang))\n\t\t{\n\t\t\t$lang = array($lang => $val);\n\t\t}\n\n\t\t$this->_error_messages = array_merge($this->_error_messages, $lang);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set The Error Delimiter\n\t *\n\t * Permits a prefix/suffix to be added to each error message\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tCI_Form_validation\n\t */\n\tpublic function set_error_delimiters($prefix = '<p>', $suffix = '</p>')\n\t{\n\t\t$this->_error_prefix = $prefix;\n\t\t$this->_error_suffix = $suffix;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Error Message\n\t *\n\t * Gets the error message associated with a particular field\n\t *\n\t * @param\tstring\t$field\tField name\n\t * @param\tstring\t$prefix\tHTML start tag\n\t * @param \tstring\t$suffix\tHTML end tag\n\t * @return\tstring\n\t */\n\tpublic function error($field, $prefix = '', $suffix = '')\n\t{\n\t\tif (empty($this->_field_data[$field]['error']))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\tif ($prefix === '')\n\t\t{\n\t\t\t$prefix = $this->_error_prefix;\n\t\t}\n\n\t\tif ($suffix === '')\n\t\t{\n\t\t\t$suffix = $this->_error_suffix;\n\t\t}\n\n\t\treturn $prefix.$this->_field_data[$field]['error'].$suffix;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Array of Error Messages\n\t *\n\t * Returns the error messages as an array\n\t *\n\t * @return\tarray\n\t */\n\tpublic function error_array()\n\t{\n\t\treturn $this->_error_array;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error String\n\t *\n\t * Returns the error messages as a string, wrapped in the error delimiters\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function error_string($prefix = '', $suffix = '')\n\t{\n\t\t// No errors, validation passes!\n\t\tif (count($this->_error_array) === 0)\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\tif ($prefix === '')\n\t\t{\n\t\t\t$prefix = $this->_error_prefix;\n\t\t}\n\n\t\tif ($suffix === '')\n\t\t{\n\t\t\t$suffix = $this->_error_suffix;\n\t\t}\n\n\t\t// Generate the error string\n\t\t$str = '';\n\t\tforeach ($this->_error_array as $val)\n\t\t{\n\t\t\tif ($val !== '')\n\t\t\t{\n\t\t\t\t$str .= $prefix.$val.$suffix.\"\\n\";\n\t\t\t}\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Run the Validator\n\t *\n\t * This function does all the work.\n\t *\n\t * @param\tstring\t$group\n\t * @return\tbool\n\t */\n\tpublic function run($group = '')\n\t{\n\t\t$validation_array = empty($this->validation_data)\n\t\t\t? $_POST\n\t\t\t: $this->validation_data;\n\n\t\t// Does the _field_data array containing the validation rules exist?\n\t\t// If not, we look to see if they were assigned via a config file\n\t\tif (count($this->_field_data) === 0)\n\t\t{\n\t\t\t// No validation rules?  We're done...\n\t\t\tif (count($this->_config_rules) === 0)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif (empty($group))\n\t\t\t{\n\t\t\t\t// Is there a validation rule for the particular URI being accessed?\n\t\t\t\t$group = trim($this->CI->uri->ruri_string(), '/');\n\t\t\t\tisset($this->_config_rules[$group]) OR $group = $this->CI->router->class.'/'.$this->CI->router->method;\n\t\t\t}\n\n\t\t\t$this->set_rules(isset($this->_config_rules[$group]) ? $this->_config_rules[$group] : $this->_config_rules);\n\n\t\t\t// Were we able to set the rules correctly?\n\t\t\tif (count($this->_field_data) === 0)\n\t\t\t{\n\t\t\t\tlog_message('debug', 'Unable to find validation rules');\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t// Load the language file containing error messages\n\t\t$this->CI->lang->load('form_validation');\n\n\t\t// Cycle through the rules for each field and match the corresponding $validation_data item\n\t\tforeach ($this->_field_data as $field => &$row)\n\t\t{\n\t\t\t// Fetch the data from the validation_data array item and cache it in the _field_data array.\n\t\t\t// Depending on whether the field name is an array or a string will determine where we get it from.\n\t\t\tif ($row['is_array'] === TRUE)\n\t\t\t{\n\t\t\t\t$this->_field_data[$field]['postdata'] = $this->_reduce_array($validation_array, $row['keys']);\n\t\t\t}\n\t\t\telseif (isset($validation_array[$field]))\n\t\t\t{\n\t\t\t\t$this->_field_data[$field]['postdata'] = $validation_array[$field];\n\t\t\t}\n\t\t}\n\n\t\t// Execute validation rules\n\t\t// Note: A second foreach (for now) is required in order to avoid false-positives\n\t\t//\t for rules like 'matches', which correlate to other validation fields.\n\t\tforeach ($this->_field_data as $field => &$row)\n\t\t{\n\t\t\t// Don't try to validate if we have no rules set\n\t\t\tif (empty($row['rules']))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$this->_execute($row, $row['rules'], $row['postdata']);\n\t\t}\n\n\t\t// Did we end up with any errors?\n\t\t$total_errors = count($this->_error_array);\n\t\tif ($total_errors > 0)\n\t\t{\n\t\t\t$this->_safe_form_data = TRUE;\n\t\t}\n\n\t\t// Now we need to re-set the POST data with the new, processed data\n\t\tempty($this->validation_data) && $this->_reset_post_array();\n\n\t\treturn ($total_errors === 0);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prepare rules\n\t *\n\t * Re-orders the provided rules in order of importance, so that\n\t * they can easily be executed later without weird checks ...\n\t *\n\t * \"Callbacks\" are given the highest priority (always called),\n\t * followed by 'required' (called if callbacks didn't fail),\n\t * and then every next rule depends on the previous one passing.\n\t *\n\t * @param\tarray\t$rules\n\t * @return\tarray\n\t */\n\tprotected function _prepare_rules($rules)\n\t{\n\t\t$new_rules = array();\n\t\t$callbacks = array();\n\n\t\tforeach ($rules as &$rule)\n\t\t{\n\t\t\t// Let 'required' always be the first (non-callback) rule\n\t\t\tif ($rule === 'required')\n\t\t\t{\n\t\t\t\tarray_unshift($new_rules, 'required');\n\t\t\t}\n\t\t\t// 'isset' is a kind of a weird alias for 'required' ...\n\t\t\telseif ($rule === 'isset' && (empty($new_rules) OR $new_rules[0] !== 'required'))\n\t\t\t{\n\t\t\t\tarray_unshift($new_rules, 'isset');\n\t\t\t}\n\t\t\t// The old/classic 'callback_'-prefixed rules\n\t\t\telseif (is_string($rule) && strncmp('callback_', $rule, 9) === 0)\n\t\t\t{\n\t\t\t\t$callbacks[] = $rule;\n\t\t\t}\n\t\t\t// Proper callables\n\t\t\telseif (is_callable($rule))\n\t\t\t{\n\t\t\t\t$callbacks[] = $rule;\n\t\t\t}\n\t\t\t// \"Named\" callables; i.e. array('name' => $callable)\n\t\t\telseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1]))\n\t\t\t{\n\t\t\t\t$callbacks[] = $rule;\n\t\t\t}\n\t\t\t// Everything else goes at the end of the queue\n\t\t\telse\n\t\t\t{\n\t\t\t\t$new_rules[] = $rule;\n\t\t\t}\n\t\t}\n\n\t\treturn array_merge($callbacks, $new_rules);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Traverse a multidimensional $_POST array index until the data is found\n\t *\n\t * @param\tarray\n\t * @param\tarray\n\t * @param\tint\n\t * @return\tmixed\n\t */\n\tprotected function _reduce_array($array, $keys, $i = 0)\n\t{\n\t\tif (is_array($array) && isset($keys[$i]))\n\t\t{\n\t\t\treturn isset($array[$keys[$i]]) ? $this->_reduce_array($array[$keys[$i]], $keys, ($i+1)) : NULL;\n\t\t}\n\n\t\t// NULL must be returned for empty fields\n\t\treturn ($array === '') ? NULL : $array;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Re-populate the _POST array with our finalized and processed data\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _reset_post_array()\n\t{\n\t\tforeach ($this->_field_data as $field => $row)\n\t\t{\n\t\t\tif ($row['postdata'] !== NULL)\n\t\t\t{\n\t\t\t\tif ($row['is_array'] === FALSE)\n\t\t\t\t{\n\t\t\t\t\tisset($_POST[$field]) && $_POST[$field] = is_array($row['postdata']) ? NULL : $row['postdata'];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// start with a reference\n\t\t\t\t\t$post_ref =& $_POST;\n\n\t\t\t\t\t// before we assign values, make a reference to the right POST key\n\t\t\t\t\tif (count($row['keys']) === 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t$post_ref =& $post_ref[current($row['keys'])];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach ($row['keys'] as $val)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$post_ref =& $post_ref[$val];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$post_ref = $row['postdata'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Executes the Validation routines\n\t *\n\t * @param\tarray\n\t * @param\tarray\n\t * @param\tmixed\n\t * @param\tint\n\t * @return\tmixed\n\t */\n\tprotected function _execute($row, $rules, $postdata = NULL, $cycles = 0)\n\t{\n\t\t// If the $_POST data is an array we will run a recursive call\n\t\t//\n\t\t// Note: We MUST check if the array is empty or not!\n\t\t//       Otherwise empty arrays will always pass validation.\n\t\tif (is_array($postdata) && ! empty($postdata))\n\t\t{\n\t\t\tforeach ($postdata as $key => $val)\n\t\t\t{\n\t\t\t\t$this->_execute($row, $rules, $val, $key);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t$rules = $this->_prepare_rules($rules);\n\t\tforeach ($rules as $rule)\n\t\t{\n\t\t\t$_in_array = FALSE;\n\n\t\t\t// We set the $postdata variable with the current data in our master array so that\n\t\t\t// each cycle of the loop is dealing with the processed data from the last cycle\n\t\t\tif ($row['is_array'] === TRUE && is_array($this->_field_data[$row['field']]['postdata']))\n\t\t\t{\n\t\t\t\t// We shouldn't need this safety, but just in case there isn't an array index\n\t\t\t\t// associated with this cycle we'll bail out\n\t\t\t\tif ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles]))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$postdata = $this->_field_data[$row['field']]['postdata'][$cycles];\n\t\t\t\t$_in_array = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// If we get an array field, but it's not expected - then it is most likely\n\t\t\t\t// somebody messing with the form on the client side, so we'll just consider\n\t\t\t\t// it an empty field\n\t\t\t\t$postdata = is_array($this->_field_data[$row['field']]['postdata'])\n\t\t\t\t\t? NULL\n\t\t\t\t\t: $this->_field_data[$row['field']]['postdata'];\n\t\t\t}\n\n\t\t\t// Is the rule a callback?\n\t\t\t$callback = $callable = FALSE;\n\t\t\tif (is_string($rule))\n\t\t\t{\n\t\t\t\tif (strpos($rule, 'callback_') === 0)\n\t\t\t\t{\n\t\t\t\t\t$rule = substr($rule, 9);\n\t\t\t\t\t$callback = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (is_callable($rule))\n\t\t\t{\n\t\t\t\t$callable = TRUE;\n\t\t\t}\n\t\t\telseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1]))\n\t\t\t{\n\t\t\t\t// We have a \"named\" callable, so save the name\n\t\t\t\t$callable = $rule[0];\n\t\t\t\t$rule = $rule[1];\n\t\t\t}\n\n\t\t\t// Strip the parameter (if exists) from the rule\n\t\t\t// Rules can contain a parameter: max_length[5]\n\t\t\t$param = FALSE;\n\t\t\tif ( ! $callable && preg_match('/(.*?)\\[(.*)\\]/', $rule, $match))\n\t\t\t{\n\t\t\t\t$rule = $match[1];\n\t\t\t\t$param = $match[2];\n\t\t\t}\n\n\t\t\t// Ignore empty, non-required inputs with a few exceptions ...\n\t\t\tif (\n\t\t\t\t($postdata === NULL OR $postdata === '')\n\t\t\t\t&& $callback === FALSE\n\t\t\t\t&& $callable === FALSE\n\t\t\t\t&& ! in_array($rule, array('required', 'isset', 'matches'), TRUE)\n\t\t\t)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Call the function that corresponds to the rule\n\t\t\tif ($callback OR $callable !== FALSE)\n\t\t\t{\n\t\t\t\tif ($callback)\n\t\t\t\t{\n\t\t\t\t\tif ( ! method_exists($this->CI, $rule))\n\t\t\t\t\t{\n\t\t\t\t\t\tlog_message('debug', 'Unable to find callback validation rule: '.$rule);\n\t\t\t\t\t\t$result = FALSE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Run the function and grab the result\n\t\t\t\t\t\t$result = $this->CI->$rule($postdata, $param);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$result = is_array($rule)\n\t\t\t\t\t\t? $rule[0]->{$rule[1]}($postdata)\n\t\t\t\t\t\t: $rule($postdata);\n\n\t\t\t\t\t// Is $callable set to a rule name?\n\t\t\t\t\tif ($callable !== FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$rule = $callable;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Re-assign the result to the master data array\n\t\t\t\tif ($_in_array === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ( ! method_exists($this, $rule))\n\t\t\t{\n\t\t\t\t// If our own wrapper function doesn't exist we see if a native PHP function does.\n\t\t\t\t// Users can use any native PHP function call that has one param.\n\t\t\t\tif (function_exists($rule))\n\t\t\t\t{\n\t\t\t\t\t// Native PHP functions issue warnings if you pass them more parameters than they use\n\t\t\t\t\t$result = ($param !== FALSE) ? $rule($postdata, $param) : $rule($postdata);\n\n\t\t\t\t\tif ($_in_array === TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlog_message('debug', 'Unable to find validation rule: '.$rule);\n\t\t\t\t\t$result = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$result = $this->$rule($postdata, $param);\n\n\t\t\t\tif ($_in_array === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Did the rule test negatively? If so, grab the error.\n\t\t\tif ($result === FALSE)\n\t\t\t{\n\t\t\t\t// Callable rules might not have named error messages\n\t\t\t\tif ( ! is_string($rule))\n\t\t\t\t{\n\t\t\t\t\t$line = $this->CI->lang->line('form_validation_error_message_not_set').'(Anonymous function)';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$line = $this->_get_error_message($rule, $row['field']);\n\t\t\t\t}\n\n\t\t\t\t// Is the parameter we are inserting into the error message the name\n\t\t\t\t// of another field? If so we need to grab its \"field label\"\n\t\t\t\tif (isset($this->_field_data[$param], $this->_field_data[$param]['label']))\n\t\t\t\t{\n\t\t\t\t\t$param = $this->_translate_fieldname($this->_field_data[$param]['label']);\n\t\t\t\t}\n\n\t\t\t\t// Build the error message\n\t\t\t\t$message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']), $param);\n\n\t\t\t\t// Save the error message\n\t\t\t\t$this->_field_data[$row['field']]['error'] = $message;\n\n\t\t\t\tif ( ! isset($this->_error_array[$row['field']]))\n\t\t\t\t{\n\t\t\t\t\t$this->_error_array[$row['field']] = $message;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the error message for the rule\n\t *\n\t * @param \tstring $rule \tThe rule name\n\t * @param \tstring $field\tThe field name\n\t * @return \tstring\n\t */\n\tprotected function _get_error_message($rule, $field)\n\t{\n\t\t// check if a custom message is defined through validation config row.\n\t\tif (isset($this->_field_data[$field]['errors'][$rule]))\n\t\t{\n\t\t\treturn $this->_field_data[$field]['errors'][$rule];\n\t\t}\n\t\t// check if a custom message has been set using the set_message() function\n\t\telseif (isset($this->_error_messages[$rule]))\n\t\t{\n\t\t\treturn $this->_error_messages[$rule];\n\t\t}\n\t\telseif (FALSE !== ($line = $this->CI->lang->line('form_validation_'.$rule)))\n\t\t{\n\t\t\treturn $line;\n\t\t}\n\t\t// DEPRECATED support for non-prefixed keys, lang file again\n\t\telseif (FALSE !== ($line = $this->CI->lang->line($rule, FALSE)))\n\t\t{\n\t\t\treturn $line;\n\t\t}\n\n\t\treturn $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Translate a field name\n\t *\n\t * @param\tstring\tthe field name\n\t * @return\tstring\n\t */\n\tprotected function _translate_fieldname($fieldname)\n\t{\n\t\t// Do we need to translate the field name? We look for the prefix 'lang:' to determine this\n\t\t// If we find one, but there's no translation for the string - just return it\n\t\tif (sscanf($fieldname, 'lang:%s', $line) === 1 && FALSE === ($fieldname = $this->CI->lang->line($line, FALSE)))\n\t\t{\n\t\t\treturn $line;\n\t\t}\n\n\t\treturn $fieldname;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Build an error message using the field and param.\n\t *\n\t * @param\tstring\tThe error message line\n\t * @param\tstring\tA field's human name\n\t * @param\tmixed\tA rule's optional parameter\n\t * @return\tstring\n\t */\n\tprotected function _build_error_msg($line, $field = '', $param = '')\n\t{\n\t\t// Check for %s in the string for legacy support.\n\t\tif (strpos($line, '%s') !== FALSE)\n\t\t{\n\t\t\treturn sprintf($line, $field, $param);\n\t\t}\n\n\t\treturn str_replace(array('{field}', '{param}'), array($field, $param), $line);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Checks if the rule is present within the validator\n\t *\n\t * Permits you to check if a rule is present within the validator\n\t *\n\t * @param\tstring\tthe field name\n\t * @return\tbool\n\t */\n\tpublic function has_rule($field)\n\t{\n\t\treturn isset($this->_field_data[$field]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the value from a form\n\t *\n\t * Permits you to repopulate a form field with the value it was submitted\n\t * with, or, if that value doesn't exist, with the default\n\t *\n\t * @param\tstring\tthe field name\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function set_value($field = '', $default = '')\n\t{\n\t\tif ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata']))\n\t\t{\n\t\t\treturn $default;\n\t\t}\n\n\t\t// If the data is an array output them one at a time.\n\t\t//\tE.g: form_input('name[]', set_value('name[]');\n\t\tif (is_array($this->_field_data[$field]['postdata']))\n\t\t{\n\t\t\treturn array_shift($this->_field_data[$field]['postdata']);\n\t\t}\n\n\t\treturn $this->_field_data[$field]['postdata'];\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Select\n\t *\n\t * Enables pull-down lists to be set to the value the user\n\t * selected in the event of an error\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function set_select($field = '', $value = '', $default = FALSE)\n\t{\n\t\tif ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata']))\n\t\t{\n\t\t\treturn ($default === TRUE && count($this->_field_data) === 0) ? ' selected=\"selected\"' : '';\n\t\t}\n\n\t\t$field = $this->_field_data[$field]['postdata'];\n\t\t$value = (string) $value;\n\t\tif (is_array($field))\n\t\t{\n\t\t\t// Note: in_array('', array(0)) returns TRUE, do not use it\n\t\t\tforeach ($field as &$v)\n\t\t\t{\n\t\t\t\tif ($value === $v)\n\t\t\t\t{\n\t\t\t\t\treturn ' selected=\"selected\"';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\t\telseif (($field === '' OR $value === '') OR ($field !== $value))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\treturn ' selected=\"selected\"';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Radio\n\t *\n\t * Enables radio buttons to be set to the value the user\n\t * selected in the event of an error\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function set_radio($field = '', $value = '', $default = FALSE)\n\t{\n\t\tif ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata']))\n\t\t{\n\t\t\treturn ($default === TRUE && count($this->_field_data) === 0) ? ' checked=\"checked\"' : '';\n\t\t}\n\n\t\t$field = $this->_field_data[$field]['postdata'];\n\t\t$value = (string) $value;\n\t\tif (is_array($field))\n\t\t{\n\t\t\t// Note: in_array('', array(0)) returns TRUE, do not use it\n\t\t\tforeach ($field as &$v)\n\t\t\t{\n\t\t\t\tif ($value === $v)\n\t\t\t\t{\n\t\t\t\t\treturn ' checked=\"checked\"';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\t\telseif (($field === '' OR $value === '') OR ($field !== $value))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\treturn ' checked=\"checked\"';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Checkbox\n\t *\n\t * Enables checkboxes to be set to the value the user\n\t * selected in the event of an error\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function set_checkbox($field = '', $value = '', $default = FALSE)\n\t{\n\t\t// Logic is exactly the same as for radio fields\n\t\treturn $this->set_radio($field, $value, $default);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Required\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function required($str)\n\t{\n\t\treturn is_array($str)\n\t\t\t? (empty($str) === FALSE)\n\t\t\t: (trim((string) $str) !== '');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Performs a Regular Expression match test.\n\t *\n\t * @param\tstring\n\t * @param\tstring\tregex\n\t * @return\tbool\n\t */\n\tpublic function regex_match($str, $regex)\n\t{\n\t\treturn (bool) preg_match($regex, $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Match one field to another\n\t *\n\t * @param\tstring\t$str\tstring to compare against\n\t * @param\tstring\t$field\n\t * @return\tbool\n\t */\n\tpublic function matches($str, $field)\n\t{\n\t\treturn isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])\n\t\t\t? ($str === $this->_field_data[$field]['postdata'])\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Differs from another field\n\t *\n\t * @param\tstring\n\t * @param\tstring\tfield\n\t * @return\tbool\n\t */\n\tpublic function differs($str, $field)\n\t{\n\t\treturn ! (isset($this->_field_data[$field]) && $this->_field_data[$field]['postdata'] === $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is Unique\n\t *\n\t * Check if the input value doesn't already exist\n\t * in the specified database field.\n\t *\n\t * @param\tstring\t$str\n\t * @param\tstring\t$field\n\t * @return\tbool\n\t */\n\tpublic function is_unique($str, $field)\n\t{\n\t\tsscanf($field, '%[^.].%[^.]', $table, $field);\n\t\treturn isset($this->CI->db)\n\t\t\t? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)\n\t\t\t: FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Minimum Length\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function min_length($str, $val)\n\t{\n\t\tif ( ! is_numeric($val))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn ($val <= mb_strlen($str));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Max Length\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function max_length($str, $val)\n\t{\n\t\tif ( ! is_numeric($val))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn ($val >= mb_strlen($str));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Exact Length\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function exact_length($str, $val)\n\t{\n\t\tif ( ! is_numeric($val))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn (mb_strlen($str) === (int) $val);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Valid URL\n\t *\n\t * @param\tstring\t$str\n\t * @return\tbool\n\t */\n\tpublic function valid_url($str)\n\t{\n\t\tif (empty($str))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif (preg_match('/^(?:([^:]*)\\:)?\\/\\/(.+)$/', $str, $matches))\n\t\t{\n\t\t\tif (empty($matches[2]))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telseif ( ! in_array(strtolower($matches[1]), array('http', 'https'), TRUE))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$str = $matches[2];\n\t\t}\n\n\t\t// Apparently, FILTER_VALIDATE_URL doesn't reject digit-only names for some reason ...\n\t\t// See https://github.com/bcit-ci/CodeIgniter/issues/5755\n\t\tif (ctype_digit($str))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// PHP 7 accepts IPv6 addresses within square brackets as hostnames,\n\t\t// but it appears that the PR that came in with https://bugs.php.net/bug.php?id=68039\n\t\t// was never merged into a PHP 5 branch ... https://3v4l.org/8PsSN\n\t\tif (preg_match('/^\\[([^\\]]+)\\]/', $str, $matches) && ! is_php('7') && filter_var($matches[1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE)\n\t\t{\n\t\t\t$str = 'ipv6.host'.substr($str, strlen($matches[1]) + 2);\n\t\t}\n\n\t\treturn (filter_var('http://'.$str, FILTER_VALIDATE_URL) !== FALSE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Valid Email\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function valid_email($str)\n\t{\n\t\tif (function_exists('idn_to_ascii') && preg_match('#\\A([^@]+)@(.+)\\z#', $str, $matches))\n\t\t{\n\t\t\t$domain = defined('INTL_IDNA_VARIANT_UTS46')\n\t\t\t\t? idn_to_ascii($matches[2], 0, INTL_IDNA_VARIANT_UTS46)\n\t\t\t\t: idn_to_ascii($matches[2]);\n\n\t\t\tif ($domain !== FALSE)\n\t\t\t{\n\t\t\t\t$str = $matches[1].'@'.$domain;\n\t\t\t}\n\t\t}\n\n\t\treturn (bool) filter_var($str, FILTER_VALIDATE_EMAIL);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Valid Emails\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function valid_emails($str)\n\t{\n\t\tif (strpos($str, ',') === FALSE)\n\t\t{\n\t\t\treturn $this->valid_email(trim($str));\n\t\t}\n\n\t\tforeach (explode(',', $str) as $email)\n\t\t{\n\t\t\tif (trim($email) !== '' && $this->valid_email(trim($email)) === FALSE)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate IP Address\n\t *\n\t * @param\tstring\n\t * @param\tstring\t'ipv4' or 'ipv6' to validate a specific IP format\n\t * @return\tbool\n\t */\n\tpublic function valid_ip($ip, $which = '')\n\t{\n\t\treturn $this->CI->input->valid_ip($ip, $which);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Alpha\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function alpha($str)\n\t{\n\t\treturn ctype_alpha($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Alpha-numeric\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function alpha_numeric($str)\n\t{\n\t\treturn ctype_alnum((string) $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Alpha-numeric w/ spaces\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function alpha_numeric_spaces($str)\n\t{\n\t\treturn (bool) preg_match('/^[A-Z0-9 ]+$/i', $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Alpha-numeric with underscores and dashes\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function alpha_dash($str)\n\t{\n\t\treturn (bool) preg_match('/^[a-z0-9_-]+$/i', $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Numeric\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function numeric($str)\n\t{\n\t\treturn (bool) preg_match('/^[\\-+]?[0-9]*\\.?[0-9]+$/', $str);\n\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Integer\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function integer($str)\n\t{\n\t\treturn (bool) preg_match('/^[\\-+]?[0-9]+$/', $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decimal number\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function decimal($str)\n\t{\n\t\treturn (bool) preg_match('/^[\\-+]?[0-9]+\\.[0-9]+$/', $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Greater than\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @return\tbool\n\t */\n\tpublic function greater_than($str, $min)\n\t{\n\t\treturn is_numeric($str) ? ($str > $min) : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Equal to or Greater than\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @return\tbool\n\t */\n\tpublic function greater_than_equal_to($str, $min)\n\t{\n\t\treturn is_numeric($str) ? ($str >= $min) : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Less than\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @return\tbool\n\t */\n\tpublic function less_than($str, $max)\n\t{\n\t\treturn is_numeric($str) ? ($str < $max) : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Equal to or Less than\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @return\tbool\n\t */\n\tpublic function less_than_equal_to($str, $max)\n\t{\n\t\treturn is_numeric($str) ? ($str <= $max) : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Value should be within an array of values\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function in_list($value, $list)\n\t{\n\t\treturn in_array($value, explode(',', $list), TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is a Natural number  (0,1,2,3, etc.)\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function is_natural($str)\n\t{\n\t\treturn ctype_digit((string) $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is a Natural number, but not a zero  (1,2,3, etc.)\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function is_natural_no_zero($str)\n\t{\n\t\treturn ($str != 0 && ctype_digit((string) $str));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Valid Base64\n\t *\n\t * Tests a string for characters outside of the Base64 alphabet\n\t * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function valid_base64($str)\n\t{\n\t\treturn (base64_encode(base64_decode($str)) === $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep data for form\n\t *\n\t * This function allows HTML to be safely shown in a form.\n\t * Special characters are converted.\n\t *\n\t * @deprecated\t3.0.6\tNot used anywhere within the framework and pretty much useless\n\t * @param\tmixed\t$data\tInput data\n\t * @return\tmixed\n\t */\n\tpublic function prep_for_form($data)\n\t{\n\t\tif ($this->_safe_form_data === FALSE OR empty($data))\n\t\t{\n\t\t\treturn $data;\n\t\t}\n\n\t\tif (is_array($data))\n\t\t{\n\t\t\tforeach ($data as $key => $val)\n\t\t\t{\n\t\t\t\t$data[$key] = $this->prep_for_form($val);\n\t\t\t}\n\n\t\t\treturn $data;\n\t\t}\n\n\t\treturn str_replace(array(\"'\", '\"', '<', '>'), array('&#39;', '&quot;', '&lt;', '&gt;'), stripslashes($data));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep URL\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function prep_url($str = '')\n\t{\n\t\tif ($str === 'http://' OR $str === '')\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\tif (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0)\n\t\t{\n\t\t\treturn 'http://'.$str;\n\t\t}\n\n\t\treturn $str;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Strip Image Tags\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function strip_image_tags($str)\n\t{\n\t\treturn $this->CI->security->strip_image_tags($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Convert PHP tags to entities\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function encode_php_tags($str)\n\t{\n\t\treturn str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Reset validation vars\n\t *\n\t * Prevents subsequent validation routines from being affected by the\n\t * results of any previous validation routine due to the CI singleton.\n\t *\n\t * @return\tCI_Form_validation\n\t */\n\tpublic function reset_validation()\n\t{\n\t\t$this->_field_data = array();\n\t\t$this->_error_array = array();\n\t\t$this->_error_messages = array();\n\t\t$this->error_string = '';\n\t\treturn $this;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Ftp.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * FTP Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/ftp.html\n */\nclass CI_FTP {\n\n\t/**\n\t * FTP Server hostname\n\t *\n\t * @var\tstring\n\t */\n\tpublic $hostname = '';\n\n\t/**\n\t * FTP Username\n\t *\n\t * @var\tstring\n\t */\n\tpublic $username = '';\n\n\t/**\n\t * FTP Password\n\t *\n\t * @var\tstring\n\t */\n\tpublic $password = '';\n\n\t/**\n\t * FTP Server port\n\t *\n\t * @var\tint\n\t */\n\tpublic $port = 21;\n\n\t/**\n\t * Passive mode flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $passive = TRUE;\n\n\t/**\n\t * Debug flag\n\t *\n\t * Specifies whether to display error messages.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $debug = FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Connection ID\n\t *\n\t * @var\tresource\n\t */\n\tprotected $conn_id;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\tempty($config) OR $this->initialize($config);\n\t\tlog_message('info', 'FTP Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize preferences\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function initialize($config = array())\n\t{\n\t\tforeach ($config as $key => $val)\n\t\t{\n\t\t\tif (isset($this->$key))\n\t\t\t{\n\t\t\t\t$this->$key = $val;\n\t\t\t}\n\t\t}\n\n\t\t// Prep the hostname\n\t\t$this->hostname = preg_replace('|.+?://|', '', $this->hostname);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FTP Connect\n\t *\n\t * @param\tarray\t $config\tConnection values\n\t * @return\tbool\n\t */\n\tpublic function connect($config = array())\n\t{\n\t\tif (count($config) > 0)\n\t\t{\n\t\t\t$this->initialize($config);\n\t\t}\n\n\t\tif (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port)))\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_connect');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! $this->_login())\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_login');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set passive mode if needed\n\t\tif ($this->passive === TRUE)\n\t\t{\n\t\t\tftp_pasv($this->conn_id, TRUE);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FTP Login\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _login()\n\t{\n\t\treturn @ftp_login($this->conn_id, $this->username, $this->password);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validates the connection ID\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _is_conn()\n\t{\n\t\tif ($this->conn_id === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_no_connection');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Change directory\n\t *\n\t * The second parameter lets us momentarily turn off debugging so that\n\t * this function can be used to test for the existence of a folder\n\t * without throwing an error. There's no FTP equivalent to is_dir()\n\t * so we do it by trying to change to a particular directory.\n\t * Internally, this parameter is only used by the \"mirror\" function below.\n\t *\n\t * @param\tstring\t$path\n\t * @param\tbool\t$suppress_debug\n\t * @return\tbool\n\t */\n\tpublic function changedir($path, $suppress_debug = FALSE)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$result = @ftp_chdir($this->conn_id, $path);\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE && $suppress_debug === FALSE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_changedir');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create a directory\n\t *\n\t * @param\tstring\t$path\n\t * @param\tint\t$permissions\n\t * @return\tbool\n\t */\n\tpublic function mkdir($path, $permissions = NULL)\n\t{\n\t\tif ($path === '' OR ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$result = @ftp_mkdir($this->conn_id, $path);\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_mkdir');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set file permissions if needed\n\t\tif ($permissions !== NULL)\n\t\t{\n\t\t\t$this->chmod($path, (int) $permissions);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Upload a file to the server\n\t *\n\t * @param\tstring\t$locpath\n\t * @param\tstring\t$rempath\n\t * @param\tstring\t$mode\n\t * @param\tint\t$permissions\n\t * @return\tbool\n\t */\n\tpublic function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! file_exists($locpath))\n\t\t{\n\t\t\t$this->_error('ftp_no_source_file');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set the mode if not specified\n\t\tif ($mode === 'auto')\n\t\t{\n\t\t\t// Get the file extension so we can set the upload type\n\t\t\t$ext = $this->_getext($locpath);\n\t\t\t$mode = $this->_settype($ext);\n\t\t}\n\n\t\t$mode = ($mode === 'ascii') ? FTP_ASCII : FTP_BINARY;\n\n\t\t$result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_upload');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set file permissions if needed\n\t\tif ($permissions !== NULL)\n\t\t{\n\t\t\t$this->chmod($rempath, (int) $permissions);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Download a file from a remote server to the local server\n\t *\n\t * @param\tstring\t$rempath\n\t * @param\tstring\t$locpath\n\t * @param\tstring\t$mode\n\t * @return\tbool\n\t */\n\tpublic function download($rempath, $locpath, $mode = 'auto')\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set the mode if not specified\n\t\tif ($mode === 'auto')\n\t\t{\n\t\t\t// Get the file extension so we can set the upload type\n\t\t\t$ext = $this->_getext($rempath);\n\t\t\t$mode = $this->_settype($ext);\n\t\t}\n\n\t\t$mode = ($mode === 'ascii') ? FTP_ASCII : FTP_BINARY;\n\n\t\t$result = @ftp_get($this->conn_id, $locpath, $rempath, $mode);\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_download');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rename (or move) a file\n\t *\n\t * @param\tstring\t$old_file\n\t * @param\tstring\t$new_file\n\t * @param\tbool\t$move\n\t * @return\tbool\n\t */\n\tpublic function rename($old_file, $new_file, $move = FALSE)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$result = @ftp_rename($this->conn_id, $old_file, $new_file);\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_'.($move === FALSE ? 'rename' : 'move'));\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Move a file\n\t *\n\t * @param\tstring\t$old_file\n\t * @param\tstring\t$new_file\n\t * @return\tbool\n\t */\n\tpublic function move($old_file, $new_file)\n\t{\n\t\treturn $this->rename($old_file, $new_file, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Rename (or move) a file\n\t *\n\t * @param\tstring\t$filepath\n\t * @return\tbool\n\t */\n\tpublic function delete_file($filepath)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$result = @ftp_delete($this->conn_id, $filepath);\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_delete');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Delete a folder and recursively delete everything (including sub-folders)\n\t * contained within it.\n\t *\n\t * @param\tstring\t$filepath\n\t * @return\tbool\n\t */\n\tpublic function delete_dir($filepath)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Add a trailing slash to the file path if needed\n\t\t$filepath = preg_replace('/(.+?)\\/*$/', '\\\\1/', $filepath);\n\n\t\t$list = $this->list_files($filepath);\n\t\tif ( ! empty($list))\n\t\t{\n\t\t\tfor ($i = 0, $c = count($list); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t// If we can't delete the item it's probably a directory,\n\t\t\t\t// so we'll recursively call delete_dir()\n\t\t\t\tif ( ! preg_match('#/\\.\\.?$#', $list[$i]) && ! @ftp_delete($this->conn_id, $list[$i]))\n\t\t\t\t{\n\t\t\t\t\t$this->delete_dir($filepath.$list[$i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (@ftp_rmdir($this->conn_id, $filepath) === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_delete');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set file permissions\n\t *\n\t * @param\tstring\t$path\tFile path\n\t * @param\tint\t$perm\tPermissions\n\t * @return\tbool\n\t */\n\tpublic function chmod($path, $perm)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (@ftp_chmod($this->conn_id, $perm, $path) === FALSE)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\t$this->_error('ftp_unable_to_chmod');\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * FTP List files in the specified directory\n\t *\n\t * @param\tstring\t$path\n\t * @return\tarray\n\t */\n\tpublic function list_files($path = '.')\n\t{\n\t\treturn $this->_is_conn()\n\t\t\t? ftp_nlist($this->conn_id, $path)\n\t\t\t: FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Read a directory and recreate it remotely\n\t *\n\t * This function recursively reads a folder and everything it contains\n\t * (including sub-folders) and creates a mirror via FTP based on it.\n\t * Whatever the directory structure of the original file path will be\n\t * recreated on the server.\n\t *\n\t * @param\tstring\t$locpath\tPath to source with trailing slash\n\t * @param\tstring\t$rempath\tPath to destination - include the base folder with trailing slash\n\t * @return\tbool\n\t */\n\tpublic function mirror($locpath, $rempath)\n\t{\n\t\tif ( ! $this->_is_conn())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Open the local file path\n\t\tif ($fp = @opendir($locpath))\n\t\t{\n\t\t\t// Attempt to open the remote file path and try to create it, if it doesn't exist\n\t\t\tif ( ! $this->changedir($rempath, TRUE) && ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath)))\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t// Recursively read the local directory\n\t\t\twhile (FALSE !== ($file = readdir($fp)))\n\t\t\t{\n\t\t\t\tif (is_dir($locpath.$file) && $file[0] !== '.')\n\t\t\t\t{\n\t\t\t\t\t$this->mirror($locpath.$file.'/', $rempath.$file.'/');\n\t\t\t\t}\n\t\t\t\telseif ($file[0] !== '.')\n\t\t\t\t{\n\t\t\t\t\t// Get the file extension so we can se the upload type\n\t\t\t\t\t$ext = $this->_getext($file);\n\t\t\t\t\t$mode = $this->_settype($ext);\n\n\t\t\t\t\t$this->upload($locpath.$file, $rempath.$file, $mode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Extract the file extension\n\t *\n\t * @param\tstring\t$filename\n\t * @return\tstring\n\t */\n\tprotected function _getext($filename)\n\t{\n\t\treturn (($dot = strrpos($filename, '.')) === FALSE)\n\t\t\t? 'txt'\n\t\t\t: substr($filename, $dot + 1);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the upload type\n\t *\n\t * @param\tstring\t$ext\tFilename extension\n\t * @return\tstring\n\t */\n\tprotected function _settype($ext)\n\t{\n\t\treturn in_array($ext, array('txt', 'text', 'php', 'phps', 'php4', 'js', 'css', 'htm', 'html', 'phtml', 'shtml', 'log', 'xml'), TRUE)\n\t\t\t? 'ascii'\n\t\t\t: 'binary';\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Close the connection\n\t *\n\t * @return\tbool\n\t */\n\tpublic function close()\n\t{\n\t\treturn $this->_is_conn()\n\t\t\t? @ftp_close($this->conn_id)\n\t\t\t: FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Display error message\n\t *\n\t * @param\tstring\t$line\n\t * @return\tvoid\n\t */\n\tprotected function _error($line)\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->lang->load('ftp');\n\t\tshow_error($CI->lang->line($line));\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Image_lib.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Image Manipulation class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tImage_lib\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/image_lib.html\n */\nclass CI_Image_lib {\n\n\t/**\n\t * PHP extension/library to use for image manipulation\n\t * Can be: imagemagick, netpbm, gd, gd2\n\t *\n\t * @var string\n\t */\n\tpublic $image_library\t\t= 'gd2';\n\n\t/**\n\t * Path to the graphic library (if applicable)\n\t *\n\t * @var string\n\t */\n\tpublic $library_path\t\t= '';\n\n\t/**\n\t * Whether to send to browser or write to disk\n\t *\n\t * @var bool\n\t */\n\tpublic $dynamic_output\t\t= FALSE;\n\n\t/**\n\t * Path to original image\n\t *\n\t * @var string\n\t */\n\tpublic $source_image\t\t= '';\n\n\t/**\n\t * Path to the modified image\n\t *\n\t * @var string\n\t */\n\tpublic $new_image\t\t= '';\n\n\t/**\n\t * Image width\n\t *\n\t * @var int\n\t */\n\tpublic $width\t\t\t= '';\n\n\t/**\n\t * Image height\n\t *\n\t * @var int\n\t */\n\tpublic $height\t\t\t= '';\n\n\t/**\n\t * Quality percentage of new image\n\t *\n\t * @var int\n\t */\n\tpublic $quality\t\t\t= 90;\n\n\t/**\n\t * Whether to create a thumbnail\n\t *\n\t * @var bool\n\t */\n\tpublic $create_thumb\t\t= FALSE;\n\n\t/**\n\t * String to add to thumbnail version of image\n\t *\n\t * @var string\n\t */\n\tpublic $thumb_marker\t\t= '_thumb';\n\n\t/**\n\t * Whether to maintain aspect ratio when resizing or use hard values\n\t *\n\t * @var bool\n\t */\n\tpublic $maintain_ratio\t\t= TRUE;\n\n\t/**\n\t * auto, height, or width.  Determines what to use as the master dimension\n\t *\n\t * @var string\n\t */\n\tpublic $master_dim\t\t= 'auto';\n\n\t/**\n\t * Angle at to rotate image\n\t *\n\t * @var string\n\t */\n\tpublic $rotation_angle\t\t= '';\n\n\t/**\n\t * X Coordinate for manipulation of the current image\n\t *\n\t * @var int\n\t */\n\tpublic $x_axis\t\t\t= '';\n\n\t/**\n\t * Y Coordinate for manipulation of the current image\n\t *\n\t * @var int\n\t */\n\tpublic $y_axis\t\t\t= '';\n\n\t// --------------------------------------------------------------------------\n\t// Watermark Vars\n\t// --------------------------------------------------------------------------\n\n\t/**\n\t * Watermark text if graphic is not used\n\t *\n\t * @var string\n\t */\n\tpublic $wm_text\t\t\t= '';\n\n\t/**\n\t * Type of watermarking.  Options:  text/overlay\n\t *\n\t * @var string\n\t */\n\tpublic $wm_type\t\t\t= 'text';\n\n\t/**\n\t * Default transparency for watermark\n\t *\n\t * @var int\n\t */\n\tpublic $wm_x_transp\t\t= 4;\n\n\t/**\n\t * Default transparency for watermark\n\t *\n\t * @var int\n\t */\n\tpublic $wm_y_transp\t\t= 4;\n\n\t/**\n\t * Watermark image path\n\t *\n\t * @var string\n\t */\n\tpublic $wm_overlay_path\t\t= '';\n\n\t/**\n\t * TT font\n\t *\n\t * @var string\n\t */\n\tpublic $wm_font_path\t\t= '';\n\n\t/**\n\t * Font size (different versions of GD will either use points or pixels)\n\t *\n\t * @var int\n\t */\n\tpublic $wm_font_size\t\t= 17;\n\n\t/**\n\t * Vertical alignment:   T M B\n\t *\n\t * @var string\n\t */\n\tpublic $wm_vrt_alignment\t= 'B';\n\n\t/**\n\t * Horizontal alignment: L R C\n\t *\n\t * @var string\n\t */\n\tpublic $wm_hor_alignment\t= 'C';\n\n\t/**\n\t * Padding around text\n\t *\n\t * @var int\n\t */\n\tpublic $wm_padding\t\t\t= 0;\n\n\t/**\n\t * Lets you push text to the right\n\t *\n\t * @var int\n\t */\n\tpublic $wm_hor_offset\t\t= 0;\n\n\t/**\n\t * Lets you push text down\n\t *\n\t * @var int\n\t */\n\tpublic $wm_vrt_offset\t\t= 0;\n\n\t/**\n\t * Text color\n\t *\n\t * @var string\n\t */\n\tprotected $wm_font_color\t= '#ffffff';\n\n\t/**\n\t * Dropshadow color\n\t *\n\t * @var string\n\t */\n\tprotected $wm_shadow_color\t= '';\n\n\t/**\n\t * Dropshadow distance\n\t *\n\t * @var int\n\t */\n\tpublic $wm_shadow_distance\t= 2;\n\n\t/**\n\t * Image opacity: 1 - 100  Only works with image\n\t *\n\t * @var int\n\t */\n\tpublic $wm_opacity\t\t= 50;\n\n\t// --------------------------------------------------------------------------\n\t// Private Vars\n\t// --------------------------------------------------------------------------\n\n\t/**\n\t * Source image folder\n\t *\n\t * @var string\n\t */\n\tpublic $source_folder\t\t= '';\n\n\t/**\n\t * Destination image folder\n\t *\n\t * @var string\n\t */\n\tpublic $dest_folder\t\t= '';\n\n\t/**\n\t * Image mime-type\n\t *\n\t * @var string\n\t */\n\tpublic $mime_type\t\t= '';\n\n\t/**\n\t * Original image width\n\t *\n\t * @var int\n\t */\n\tpublic $orig_width\t\t= '';\n\n\t/**\n\t * Original image height\n\t *\n\t * @var int\n\t */\n\tpublic $orig_height\t\t= '';\n\n\t/**\n\t * Image format\n\t *\n\t * @var string\n\t */\n\tpublic $image_type\t\t= '';\n\n\t/**\n\t * Size of current image\n\t *\n\t * @var string\n\t */\n\tpublic $size_str\t\t= '';\n\n\t/**\n\t * Full path to source image\n\t *\n\t * @var string\n\t */\n\tpublic $full_src_path\t\t= '';\n\n\t/**\n\t * Full path to destination image\n\t *\n\t * @var string\n\t */\n\tpublic $full_dst_path\t\t= '';\n\n\t/**\n\t * File permissions\n\t *\n\t * @var\tint\n\t */\n\tpublic $file_permissions = 0644;\n\n\t/**\n\t * Name of function to create image\n\t *\n\t * @var string\n\t */\n\tpublic $create_fnc\t\t= 'imagecreatetruecolor';\n\n\t/**\n\t * Name of function to copy image\n\t *\n\t * @var string\n\t */\n\tpublic $copy_fnc\t\t= 'imagecopyresampled';\n\n\t/**\n\t * Error messages\n\t *\n\t * @var array\n\t */\n\tpublic $error_msg\t\t= array();\n\n\t/**\n\t * Whether to have a drop shadow on watermark\n\t *\n\t * @var bool\n\t */\n\tprotected $wm_use_drop_shadow\t= FALSE;\n\n\t/**\n\t * Whether to use truetype fonts\n\t *\n\t * @var bool\n\t */\n\tpublic $wm_use_truetype\t= FALSE;\n\n\t/**\n\t * Initialize Image Library\n\t *\n\t * @param\tarray\t$props\n\t * @return\tvoid\n\t */\n\tpublic function __construct($props = array())\n\t{\n\t\tif (count($props) > 0)\n\t\t{\n\t\t\t$this->initialize($props);\n\t\t}\n\n\t\t/**\n\t\t * A work-around for some improperly formatted, but\n\t\t * usable JPEGs; known to be produced by Samsung\n\t\t * smartphones' front-facing cameras.\n\t\t *\n\t\t * @see\thttps://github.com/bcit-ci/CodeIgniter/issues/4967\n\t\t * @see\thttps://bugs.php.net/bug.php?id=72404\n\t\t */\n\t\tini_set('gd.jpeg_ignore_warning', 1);\n\n\t\tlog_message('info', 'Image Lib Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize image properties\n\t *\n\t * Resets values in case this class is used in a loop\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function clear()\n\t{\n\t\t$props = array('thumb_marker', 'library_path', 'source_image', 'new_image', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'wm_text', 'wm_overlay_path', 'wm_font_path', 'wm_shadow_color', 'source_folder', 'dest_folder', 'mime_type', 'orig_width', 'orig_height', 'image_type', 'size_str', 'full_src_path', 'full_dst_path');\n\n\t\tforeach ($props as $val)\n\t\t{\n\t\t\t$this->$val = '';\n\t\t}\n\n\t\t$this->image_library \t\t= 'gd2';\n\t\t$this->dynamic_output \t\t= FALSE;\n\t\t$this->quality \t\t\t\t= 90;\n\t\t$this->create_thumb \t\t= FALSE;\n\t\t$this->thumb_marker \t\t= '_thumb';\n\t\t$this->maintain_ratio \t\t= TRUE;\n\t\t$this->master_dim \t\t\t= 'auto';\n\t\t$this->wm_type \t\t\t\t= 'text';\n\t\t$this->wm_x_transp \t\t\t= 4;\n\t\t$this->wm_y_transp \t\t\t= 4;\n\t\t$this->wm_font_size \t\t= 17;\n\t\t$this->wm_vrt_alignment \t= 'B';\n\t\t$this->wm_hor_alignment \t= 'C';\n\t\t$this->wm_padding \t\t\t= 0;\n\t\t$this->wm_hor_offset \t\t= 0;\n\t\t$this->wm_vrt_offset \t\t= 0;\n\t\t$this->wm_font_color\t\t= '#ffffff';\n\t\t$this->wm_shadow_distance \t= 2;\n\t\t$this->wm_opacity \t\t\t= 50;\n\t\t$this->create_fnc \t\t\t= 'imagecreatetruecolor';\n\t\t$this->copy_fnc \t\t\t= 'imagecopyresampled';\n\t\t$this->error_msg \t\t\t= array();\n\t\t$this->wm_use_drop_shadow \t= FALSE;\n\t\t$this->wm_use_truetype \t\t= FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * initialize image preferences\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tpublic function initialize($props = array())\n\t{\n\t\t// Convert array elements into class variables\n\t\tif (count($props) > 0)\n\t\t{\n\t\t\tforeach ($props as $key => $val)\n\t\t\t{\n\t\t\t\tif (property_exists($this, $key))\n\t\t\t\t{\n\t\t\t\t\tif (in_array($key, array('wm_font_color', 'wm_shadow_color'), TRUE))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (preg_match('/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i', $val, $matches))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* $matches[1] contains our hex color value, but it might be\n\t\t\t\t\t\t\t * both in the full 6-length format or the shortened 3-length\n\t\t\t\t\t\t\t * value.\n\t\t\t\t\t\t\t * We'll later need the full version, so we keep it if it's\n\t\t\t\t\t\t\t * already there and if not - we'll convert to it. We can\n\t\t\t\t\t\t\t * access string characters by their index as in an array,\n\t\t\t\t\t\t\t * so we'll do that and use concatenation to form the final\n\t\t\t\t\t\t\t * value:\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t$val = (strlen($matches[1]) === 6)\n\t\t\t\t\t\t\t\t? '#'.$matches[1]\n\t\t\t\t\t\t\t\t: '#'.$matches[1][0].$matches[1][0].$matches[1][1].$matches[1][1].$matches[1][2].$matches[1][2];\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telseif (in_array($key, array('width', 'height'), TRUE) && ! ctype_digit((string) $val))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$this->$key = $val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Is there a source image? If not, there's no reason to continue\n\t\tif ($this->source_image === '')\n\t\t{\n\t\t\t$this->set_error('imglib_source_image_required');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/* Is getimagesize() available?\n\t\t *\n\t\t * We use it to determine the image properties (width/height).\n\t\t * Note: We need to figure out how to determine image\n\t\t * properties using ImageMagick and NetPBM\n\t\t */\n\t\tif ( ! function_exists('getimagesize'))\n\t\t{\n\t\t\t$this->set_error('imglib_gd_required_for_props');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->image_library = strtolower($this->image_library);\n\n\t\t/* Set the full server path\n\t\t *\n\t\t * The source image may or may not contain a path.\n\t\t * Either way, we'll try use realpath to generate the\n\t\t * full server path in order to more reliably read it.\n\t\t */\n\t\tif (($full_source_path = realpath($this->source_image)) !== FALSE)\n\t\t{\n\t\t\t$full_source_path = str_replace('\\\\', '/', $full_source_path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$full_source_path = $this->source_image;\n\t\t}\n\n\t\t$x = explode('/', $full_source_path);\n\t\t$this->source_image = end($x);\n\t\t$this->source_folder = str_replace($this->source_image, '', $full_source_path);\n\n\t\t// Set the Image Properties\n\t\tif ( ! $this->get_image_properties($this->source_folder.$this->source_image))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/*\n\t\t * Assign the \"new\" image name/path\n\t\t *\n\t\t * If the user has set a \"new_image\" name it means\n\t\t * we are making a copy of the source image. If not\n\t\t * it means we are altering the original. We'll\n\t\t * set the destination filename and path accordingly.\n\t\t */\n\t\tif ($this->new_image === '')\n\t\t{\n\t\t\t$this->dest_image  = $this->source_image;\n\t\t\t$this->dest_folder = $this->source_folder;\n\t\t}\n\t\telseif (strpos($this->new_image, '/') === FALSE && strpos($this->new_image, '\\\\') === FALSE)\n\t\t{\n\t\t\t$this->dest_image  = $this->new_image;\n\t\t\t$this->dest_folder = $this->source_folder;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Is there a file name?\n\t\t\tif ( ! preg_match('#\\.(jpg|jpeg|gif|png)$#i', $this->new_image))\n\t\t\t{\n\t\t\t\t$this->dest_image  = $this->source_image;\n\t\t\t\t$this->dest_folder = $this->new_image;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$x = explode('/', str_replace('\\\\', '/', $this->new_image));\n\t\t\t\t$this->dest_image  = end($x);\n\t\t\t\t$this->dest_folder = str_replace($this->dest_image, '', $this->new_image);\n\t\t\t}\n\n\t\t\t$this->dest_folder = realpath($this->dest_folder).'/';\n\t\t}\n\n\t\t/* Compile the finalized filenames/paths\n\t\t *\n\t\t * We'll create two master strings containing the\n\t\t * full server path to the source image and the\n\t\t * full server path to the destination image.\n\t\t * We'll also split the destination image name\n\t\t * so we can insert the thumbnail marker if needed.\n\t\t */\n\t\tif ($this->create_thumb === FALSE OR $this->thumb_marker === '')\n\t\t{\n\t\t\t$this->thumb_marker = '';\n\t\t}\n\n\t\t$xp = $this->explode_name($this->dest_image);\n\n\t\t$filename = $xp['name'];\n\t\t$file_ext = $xp['ext'];\n\n\t\t$this->full_src_path = $this->source_folder.$this->source_image;\n\t\t$this->full_dst_path = $this->dest_folder.$filename.$this->thumb_marker.$file_ext;\n\n\t\t/* Should we maintain image proportions?\n\t\t *\n\t\t * When creating thumbs or copies, the target width/height\n\t\t * might not be in correct proportion with the source\n\t\t * image's width/height. We'll recalculate it here.\n\t\t */\n\t\tif ($this->maintain_ratio === TRUE && ($this->width !== 0 OR $this->height !== 0))\n\t\t{\n\t\t\t$this->image_reproportion();\n\t\t}\n\n\t\t/* Was a width and height specified?\n\t\t *\n\t\t * If the destination width/height was not submitted we\n\t\t * will use the values from the actual file\n\t\t */\n\t\tif ($this->width === '')\n\t\t{\n\t\t\t$this->width = $this->orig_width;\n\t\t}\n\n\t\tif ($this->height === '')\n\t\t{\n\t\t\t$this->height = $this->orig_height;\n\t\t}\n\n\t\t// Set the quality\n\t\t$this->quality = trim(str_replace('%', '', $this->quality));\n\n\t\tif ($this->quality === '' OR $this->quality === 0 OR ! ctype_digit($this->quality))\n\t\t{\n\t\t\t$this->quality = 90;\n\t\t}\n\n\t\t// Set the x/y coordinates\n\t\tis_numeric($this->x_axis) OR $this->x_axis = 0;\n\t\tis_numeric($this->y_axis) OR $this->y_axis = 0;\n\n\t\t// Watermark-related Stuff...\n\t\tif ($this->wm_overlay_path !== '')\n\t\t{\n\t\t\t$this->wm_overlay_path = str_replace('\\\\', '/', realpath($this->wm_overlay_path));\n\t\t}\n\n\t\tif ($this->wm_shadow_color !== '')\n\t\t{\n\t\t\t$this->wm_use_drop_shadow = TRUE;\n\t\t}\n\t\telseif ($this->wm_use_drop_shadow === TRUE && $this->wm_shadow_color === '')\n\t\t{\n\t\t\t$this->wm_use_drop_shadow = FALSE;\n\t\t}\n\n\t\tif ($this->wm_font_path !== '')\n\t\t{\n\t\t\t$this->wm_use_truetype = TRUE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Resize\n\t *\n\t * This is a wrapper function that chooses the proper\n\t * resize function based on the protocol specified\n\t *\n\t * @return\tbool\n\t */\n\tpublic function resize()\n\t{\n\t\t$protocol = ($this->image_library === 'gd2') ? 'image_process_gd' : 'image_process_'.$this->image_library;\n\t\treturn $this->$protocol('resize');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Crop\n\t *\n\t * This is a wrapper function that chooses the proper\n\t * cropping function based on the protocol specified\n\t *\n\t * @return\tbool\n\t */\n\tpublic function crop()\n\t{\n\t\t$protocol = ($this->image_library === 'gd2') ? 'image_process_gd' : 'image_process_'.$this->image_library;\n\t\treturn $this->$protocol('crop');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Rotate\n\t *\n\t * This is a wrapper function that chooses the proper\n\t * rotation function based on the protocol specified\n\t *\n\t * @return\tbool\n\t */\n\tpublic function rotate()\n\t{\n\t\t// Allowed rotation values\n\t\t$degs = array(90, 180, 270, 'vrt', 'hor');\n\n\t\tif ($this->rotation_angle === '' OR ! in_array($this->rotation_angle, $degs))\n\t\t{\n\t\t\t$this->set_error('imglib_rotation_angle_required');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Reassign the width and height\n\t\tif ($this->rotation_angle === 90 OR $this->rotation_angle === 270)\n\t\t{\n\t\t\t$this->width\t= $this->orig_height;\n\t\t\t$this->height\t= $this->orig_width;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->width\t= $this->orig_width;\n\t\t\t$this->height\t= $this->orig_height;\n\t\t}\n\n\t\t// Choose resizing function\n\t\tif ($this->image_library === 'imagemagick' OR $this->image_library === 'netpbm')\n\t\t{\n\t\t\t$protocol = 'image_process_'.$this->image_library;\n\t\t\treturn $this->$protocol('rotate');\n\t\t}\n\n\t\treturn ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt')\n\t\t\t? $this->image_mirror_gd()\n\t\t\t: $this->image_rotate_gd();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Process Using GD/GD2\n\t *\n\t * This function will resize or crop\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function image_process_gd($action = 'resize')\n\t{\n\t\t$v2_override = FALSE;\n\n\t\t// If the target width/height match the source, AND if the new file name is not equal to the old file name\n\t\t// we'll simply make a copy of the original with the new name... assuming dynamic rendering is off.\n\t\tif ($this->dynamic_output === FALSE && $this->orig_width === $this->width && $this->orig_height === $this->height)\n\t\t{\n\t\t\tif ($this->source_image !== $this->new_image && @copy($this->full_src_path, $this->full_dst_path))\n\t\t\t{\n\t\t\t\tchmod($this->full_dst_path, $this->file_permissions);\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Let's set up our values based on the action\n\t\tif ($action === 'crop')\n\t\t{\n\t\t\t// Reassign the source width/height if cropping\n\t\t\t$this->orig_width  = $this->width;\n\t\t\t$this->orig_height = $this->height;\n\n\t\t\t// GD 2.0 has a cropping bug so we'll test for it\n\t\t\tif ($this->gd_version() !== FALSE)\n\t\t\t{\n\t\t\t\t$gd_version = str_replace('0', '', $this->gd_version());\n\t\t\t\t$v2_override = ($gd_version == 2);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If resizing the x/y axis must be zero\n\t\t\t$this->x_axis = 0;\n\t\t\t$this->y_axis = 0;\n\t\t}\n\n\t\t// Create the image handle\n\t\tif ( ! ($src_img = $this->image_create_gd()))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/* Create the image\n\t\t *\n\t\t * Old conditional which users report cause problems with shared GD libs who report themselves as \"2.0 or greater\"\n\t\t * it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment\n\t\t * below should that ever prove inaccurate.\n\t\t *\n\t\t * if ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor') && $v2_override === FALSE)\n\t\t */\n\t\tif ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor'))\n\t\t{\n\t\t\t$create\t= 'imagecreatetruecolor';\n\t\t\t$copy\t= 'imagecopyresampled';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$create\t= 'imagecreate';\n\t\t\t$copy\t= 'imagecopyresized';\n\t\t}\n\n\t\t$dst_img = $create($this->width, $this->height);\n\n\t\tif ($this->image_type === 3) // png we can actually preserve transparency\n\t\t{\n\t\t\timagealphablending($dst_img, FALSE);\n\t\t\timagesavealpha($dst_img, TRUE);\n\t\t}\n\n\t\t$copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height);\n\n\t\t// Show the image\n\t\tif ($this->dynamic_output === TRUE)\n\t\t{\n\t\t\t$this->image_display_gd($dst_img);\n\t\t}\n\t\telseif ( ! $this->image_save_gd($dst_img)) // Or save it\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Kill the file handles\n\t\timagedestroy($dst_img);\n\t\timagedestroy($src_img);\n\n\t\tif ($this->dynamic_output !== TRUE)\n\t\t{\n\t\t\tchmod($this->full_dst_path, $this->file_permissions);\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Process Using ImageMagick\n\t *\n\t * This function will resize, crop or rotate\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function image_process_imagemagick($action = 'resize')\n\t{\n\t\t// Do we have a vaild library path?\n\t\tif ($this->library_path === '')\n\t\t{\n\t\t\t$this->set_error('imglib_libpath_invalid');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! preg_match('/convert$/i', $this->library_path))\n\t\t{\n\t\t\t$this->library_path = rtrim($this->library_path, '/').'/convert';\n\t\t}\n\n\t\t// Execute the command\n\t\t$cmd = $this->library_path.' -quality '.$this->quality;\n\n\t\tif ($action === 'crop')\n\t\t{\n\t\t\t$cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis;\n\t\t}\n\t\telseif ($action === 'rotate')\n\t\t{\n\t\t\t$cmd .= ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt')\n\t\t\t\t\t? ' -flop'\n\t\t\t\t\t: ' -rotate '.$this->rotation_angle;\n\t\t}\n\t\telse // Resize\n\t\t{\n\t\t\tif($this->maintain_ratio === TRUE)\n\t\t\t{\n\t\t\t\t$cmd .= ' -resize '.$this->width.'x'.$this->height;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$cmd .= ' -resize '.$this->width.'x'.$this->height.'\\!';\n\t\t\t}\n\t\t}\n\n\t\t$cmd .= ' '.escapeshellarg($this->full_src_path).' '.escapeshellarg($this->full_dst_path).' 2>&1';\n\n\t\t$retval = 1;\n\t\t// exec() might be disabled\n\t\tif (function_usable('exec'))\n\t\t{\n\t\t\t@exec($cmd, $output, $retval);\n\t\t}\n\n\t\t// Did it work?\n\t\tif ($retval > 0)\n\t\t{\n\t\t\t$this->set_error('imglib_image_process_failed');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tchmod($this->full_dst_path, $this->file_permissions);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Process Using NetPBM\n\t *\n\t * This function will resize, crop or rotate\n\t *\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function image_process_netpbm($action = 'resize')\n\t{\n\t\tif ($this->library_path === '')\n\t\t{\n\t\t\t$this->set_error('imglib_libpath_invalid');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Build the resizing command\n\t\tswitch ($this->image_type)\n\t\t{\n\t\t\tcase 1 :\n\t\t\t\t$cmd_in\t\t= 'giftopnm';\n\t\t\t\t$cmd_out\t= 'ppmtogif';\n\t\t\t\tbreak;\n\t\t\tcase 2 :\n\t\t\t\t$cmd_in\t\t= 'jpegtopnm';\n\t\t\t\t$cmd_out\t= 'ppmtojpeg';\n\t\t\t\tbreak;\n\t\t\tcase 3 :\n\t\t\t\t$cmd_in\t\t= 'pngtopnm';\n\t\t\t\t$cmd_out\t= 'ppmtopng';\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ($action === 'crop')\n\t\t{\n\t\t\t$cmd_inner = 'pnmcut -left '.$this->x_axis.' -top '.$this->y_axis.' -width '.$this->width.' -height '.$this->height;\n\t\t}\n\t\telseif ($action === 'rotate')\n\t\t{\n\t\t\tswitch ($this->rotation_angle)\n\t\t\t{\n\t\t\t\tcase 90:\t$angle = 'r270';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 180:\t$angle = 'r180';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 270:\t$angle = 'r90';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'vrt':\t$angle = 'tb';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'hor':\t$angle = 'lr';\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$cmd_inner = 'pnmflip -'.$angle.' ';\n\t\t}\n\t\telse // Resize\n\t\t{\n\t\t\t$cmd_inner = 'pnmscale -xysize '.$this->width.' '.$this->height;\n\t\t}\n\n\t\t$cmd = $this->library_path.$cmd_in.' '.escapeshellarg($this->full_src_path).' | '.$cmd_inner.' | '.$cmd_out.' > '.$this->dest_folder.'netpbm.tmp';\n\n\t\t$retval = 1;\n\t\t// exec() might be disabled\n\t\tif (function_usable('exec'))\n\t\t{\n\t\t\t@exec($cmd, $output, $retval);\n\t\t}\n\n\t\t// Did it work?\n\t\tif ($retval > 0)\n\t\t{\n\t\t\t$this->set_error('imglib_image_process_failed');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// With NetPBM we have to create a temporary image.\n\t\t// If you try manipulating the original it fails so\n\t\t// we have to rename the temp file.\n\t\tcopy($this->dest_folder.'netpbm.tmp', $this->full_dst_path);\n\t\tunlink($this->dest_folder.'netpbm.tmp');\n\t\tchmod($this->full_dst_path, $this->file_permissions);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Rotate Using GD\n\t *\n\t * @return\tbool\n\t */\n\tpublic function image_rotate_gd()\n\t{\n\t\t// Create the image handle\n\t\tif ( ! ($src_img = $this->image_create_gd()))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set the background color\n\t\t// This won't work with transparent PNG files so we are\n\t\t// going to have to figure out how to determine the color\n\t\t// of the alpha channel in a future release.\n\n\t\t$white = imagecolorallocate($src_img, 255, 255, 255);\n\n\t\t// Rotate it!\n\t\t$dst_img = imagerotate($src_img, $this->rotation_angle, $white);\n\n\t\t// Show the image\n\t\tif ($this->dynamic_output === TRUE)\n\t\t{\n\t\t\t$this->image_display_gd($dst_img);\n\t\t}\n\t\telseif ( ! $this->image_save_gd($dst_img)) // ... or save it\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Kill the file handles\n\t\timagedestroy($dst_img);\n\t\timagedestroy($src_img);\n\n\t\tchmod($this->full_dst_path, $this->file_permissions);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create Mirror Image using GD\n\t *\n\t * This function will flip horizontal or vertical\n\t *\n\t * @return\tbool\n\t */\n\tpublic function image_mirror_gd()\n\t{\n\t\tif ( ! $src_img = $this->image_create_gd())\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$width  = $this->orig_width;\n\t\t$height = $this->orig_height;\n\n\t\tif ($this->rotation_angle === 'hor')\n\t\t{\n\t\t\tfor ($i = 0; $i < $height; $i++)\n\t\t\t{\n\t\t\t\t$left = 0;\n\t\t\t\t$right = $width - 1;\n\n\t\t\t\twhile ($left < $right)\n\t\t\t\t{\n\t\t\t\t\t$cl = imagecolorat($src_img, $left, $i);\n\t\t\t\t\t$cr = imagecolorat($src_img, $right, $i);\n\n\t\t\t\t\timagesetpixel($src_img, $left, $i, $cr);\n\t\t\t\t\timagesetpixel($src_img, $right, $i, $cl);\n\n\t\t\t\t\t$left++;\n\t\t\t\t\t$right--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor ($i = 0; $i < $width; $i++)\n\t\t\t{\n\t\t\t\t$top = 0;\n\t\t\t\t$bottom = $height - 1;\n\n\t\t\t\twhile ($top < $bottom)\n\t\t\t\t{\n\t\t\t\t\t$ct = imagecolorat($src_img, $i, $top);\n\t\t\t\t\t$cb = imagecolorat($src_img, $i, $bottom);\n\n\t\t\t\t\timagesetpixel($src_img, $i, $top, $cb);\n\t\t\t\t\timagesetpixel($src_img, $i, $bottom, $ct);\n\n\t\t\t\t\t$top++;\n\t\t\t\t\t$bottom--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Show the image\n\t\tif ($this->dynamic_output === TRUE)\n\t\t{\n\t\t\t$this->image_display_gd($src_img);\n\t\t}\n\t\telseif ( ! $this->image_save_gd($src_img)) // ... or save it\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Kill the file handles\n\t\timagedestroy($src_img);\n\n\t\tchmod($this->full_dst_path, $this->file_permissions);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Image Watermark\n\t *\n\t * This is a wrapper function that chooses the type\n\t * of watermarking based on the specified preference.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function watermark()\n\t{\n\t\treturn ($this->wm_type === 'overlay') ? $this->overlay_watermark() : $this->text_watermark();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Watermark - Graphic Version\n\t *\n\t * @return\tbool\n\t */\n\tpublic function overlay_watermark()\n\t{\n\t\tif ( ! function_exists('imagecolortransparent'))\n\t\t{\n\t\t\t$this->set_error('imglib_gd_required');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Fetch source image properties\n\t\t$this->get_image_properties();\n\n\t\t// Fetch watermark image properties\n\t\t$props\t\t= $this->get_image_properties($this->wm_overlay_path, TRUE);\n\t\t$wm_img_type\t= $props['image_type'];\n\t\t$wm_width\t= $props['width'];\n\t\t$wm_height\t= $props['height'];\n\n\t\t// Create two image resources\n\t\t$wm_img  = $this->image_create_gd($this->wm_overlay_path, $wm_img_type);\n\t\t$src_img = $this->image_create_gd($this->full_src_path);\n\n\t\t// Reverse the offset if necessary\n\t\t// When the image is positioned at the bottom\n\t\t// we don't want the vertical offset to push it\n\t\t// further down. We want the reverse, so we'll\n\t\t// invert the offset. Same with the horizontal\n\t\t// offset when the image is at the right\n\n\t\t$this->wm_vrt_alignment = strtoupper($this->wm_vrt_alignment[0]);\n\t\t$this->wm_hor_alignment = strtoupper($this->wm_hor_alignment[0]);\n\n\t\tif ($this->wm_vrt_alignment === 'B')\n\t\t\t$this->wm_vrt_offset = $this->wm_vrt_offset * -1;\n\n\t\tif ($this->wm_hor_alignment === 'R')\n\t\t\t$this->wm_hor_offset = $this->wm_hor_offset * -1;\n\n\t\t// Set the base x and y axis values\n\t\t$x_axis = $this->wm_hor_offset + $this->wm_padding;\n\t\t$y_axis = $this->wm_vrt_offset + $this->wm_padding;\n\n\t\t// Set the vertical position\n\t\tif ($this->wm_vrt_alignment === 'M')\n\t\t{\n\t\t\t$y_axis += ($this->orig_height / 2) - ($wm_height / 2);\n\t\t}\n\t\telseif ($this->wm_vrt_alignment === 'B')\n\t\t{\n\t\t\t$y_axis += $this->orig_height - $wm_height;\n\t\t}\n\n\t\t// Set the horizontal position\n\t\tif ($this->wm_hor_alignment === 'C')\n\t\t{\n\t\t\t$x_axis += ($this->orig_width / 2) - ($wm_width / 2);\n\t\t}\n\t\telseif ($this->wm_hor_alignment === 'R')\n\t\t{\n\t\t\t$x_axis += $this->orig_width - $wm_width;\n\t\t}\n\n\t\t// Build the finalized image\n\t\tif ($wm_img_type === 3 && function_exists('imagealphablending'))\n\t\t{\n\t\t\t@imagealphablending($src_img, TRUE);\n\t\t}\n\n\t\t// Set RGB values for text and shadow\n\t\t$rgba = imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp);\n\t\t$alpha = ($rgba & 0x7F000000) >> 24;\n\n\t\t// make a best guess as to whether we're dealing with an image with alpha transparency or no/binary transparency\n\t\tif ($alpha > 0)\n\t\t{\n\t\t\t// copy the image directly, the image's alpha transparency being the sole determinant of blending\n\t\t\timagecopy($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// set our RGB value from above to be transparent and merge the images with the specified opacity\n\t\t\timagecolortransparent($wm_img, imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp));\n\t\t\timagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity);\n\t\t}\n\n\t\t// We can preserve transparency for PNG images\n\t\tif ($this->image_type === 3)\n\t\t{\n\t\t\timagealphablending($src_img, FALSE);\n\t\t\timagesavealpha($src_img, TRUE);\n\t\t}\n\n\t\t// Output the image\n\t\tif ($this->dynamic_output === TRUE)\n\t\t{\n\t\t\t$this->image_display_gd($src_img);\n\t\t}\n\t\telseif ( ! $this->image_save_gd($src_img)) // ... or save it\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\timagedestroy($src_img);\n\t\timagedestroy($wm_img);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Watermark - Text Version\n\t *\n\t * @return\tbool\n\t */\n\tpublic function text_watermark()\n\t{\n\t\tif ( ! ($src_img = $this->image_create_gd()))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($this->wm_use_truetype === TRUE && ! file_exists($this->wm_font_path))\n\t\t{\n\t\t\t$this->set_error('imglib_missing_font');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Fetch source image properties\n\t\t$this->get_image_properties();\n\n\t\t// Reverse the vertical offset\n\t\t// When the image is positioned at the bottom\n\t\t// we don't want the vertical offset to push it\n\t\t// further down. We want the reverse, so we'll\n\t\t// invert the offset. Note: The horizontal\n\t\t// offset flips itself automatically\n\n\t\tif ($this->wm_vrt_alignment === 'B')\n\t\t{\n\t\t\t$this->wm_vrt_offset = $this->wm_vrt_offset * -1;\n\t\t}\n\n\t\tif ($this->wm_hor_alignment === 'R')\n\t\t{\n\t\t\t$this->wm_hor_offset = $this->wm_hor_offset * -1;\n\t\t}\n\n\t\t// Set font width and height\n\t\t// These are calculated differently depending on\n\t\t// whether we are using the true type font or not\n\t\tif ($this->wm_use_truetype === TRUE)\n\t\t{\n\t\t\tif (empty($this->wm_font_size))\n\t\t\t{\n\t\t\t\t$this->wm_font_size = 17;\n\t\t\t}\n\n\t\t\tif (function_exists('imagettfbbox'))\n\t\t\t{\n\t\t\t\t$temp = imagettfbbox($this->wm_font_size, 0, $this->wm_font_path, $this->wm_text);\n\t\t\t\t$temp = $temp[2] - $temp[0];\n\n\t\t\t\t$fontwidth = $temp / strlen($this->wm_text);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$fontwidth = $this->wm_font_size - ($this->wm_font_size / 4);\n\t\t\t}\n\n\t\t\t$fontheight = $this->wm_font_size;\n\t\t\t$this->wm_vrt_offset += $this->wm_font_size;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$fontwidth  = imagefontwidth($this->wm_font_size);\n\t\t\t$fontheight = imagefontheight($this->wm_font_size);\n\t\t}\n\n\t\t// Set base X and Y axis values\n\t\t$x_axis = $this->wm_hor_offset + $this->wm_padding;\n\t\t$y_axis = $this->wm_vrt_offset + $this->wm_padding;\n\n\t\tif ($this->wm_use_drop_shadow === FALSE)\n\t\t{\n\t\t\t$this->wm_shadow_distance = 0;\n\t\t}\n\n\t\t$this->wm_vrt_alignment = strtoupper($this->wm_vrt_alignment[0]);\n\t\t$this->wm_hor_alignment = strtoupper($this->wm_hor_alignment[0]);\n\n\t\t// Set vertical alignment\n\t\tif ($this->wm_vrt_alignment === 'M')\n\t\t{\n\t\t\t$y_axis += ($this->orig_height / 2) + ($fontheight / 2);\n\t\t}\n\t\telseif ($this->wm_vrt_alignment === 'B')\n\t\t{\n\t\t\t$y_axis += $this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight / 2);\n\t\t}\n\n\t\t// Set horizontal alignment\n\t\tif ($this->wm_hor_alignment === 'R')\n\t\t{\n\t\t\t$x_axis += $this->orig_width - ($fontwidth * strlen($this->wm_text)) - $this->wm_shadow_distance;\n\t\t}\n\t\telseif ($this->wm_hor_alignment === 'C')\n\t\t{\n\t\t\t$x_axis += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2);\n\t\t}\n\n\t\tif ($this->wm_use_drop_shadow)\n\t\t{\n\t\t\t// Offset from text\n\t\t\t$x_shad = $x_axis + $this->wm_shadow_distance;\n\t\t\t$y_shad = $y_axis + $this->wm_shadow_distance;\n\n\t\t\t/* Set RGB values for shadow\n\t\t\t *\n\t\t\t * First character is #, so we don't really need it.\n\t\t\t * Get the rest of the string and split it into 2-length\n\t\t\t * hex values:\n\t\t\t */\n\t\t\t$drp_color = str_split(substr($this->wm_shadow_color, 1, 6), 2);\n\t\t\t$drp_color = imagecolorclosest($src_img, hexdec($drp_color[0]), hexdec($drp_color[1]), hexdec($drp_color[2]));\n\n\t\t\t// Add the shadow to the source image\n\t\t\tif ($this->wm_use_truetype)\n\t\t\t{\n\t\t\t\timagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\timagestring($src_img, $this->wm_font_size, $x_shad, $y_shad, $this->wm_text, $drp_color);\n\t\t\t}\n\t\t}\n\n\t\t/* Set RGB values for text\n\t\t *\n\t\t * First character is #, so we don't really need it.\n\t\t * Get the rest of the string and split it into 2-length\n\t\t * hex values:\n\t\t */\n\t\t$txt_color = str_split(substr($this->wm_font_color, 1, 6), 2);\n\t\t$txt_color = imagecolorclosest($src_img, hexdec($txt_color[0]), hexdec($txt_color[1]), hexdec($txt_color[2]));\n\n\t\t// Add the text to the source image\n\t\tif ($this->wm_use_truetype)\n\t\t{\n\t\t\timagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text);\n\t\t}\n\t\telse\n\t\t{\n\t\t\timagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color);\n\t\t}\n\n\t\t// We can preserve transparency for PNG images\n\t\tif ($this->image_type === 3)\n\t\t{\n\t\t\timagealphablending($src_img, FALSE);\n\t\t\timagesavealpha($src_img, TRUE);\n\t\t}\n\n\t\t// Output the final image\n\t\tif ($this->dynamic_output === TRUE)\n\t\t{\n\t\t\t$this->image_display_gd($src_img);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->image_save_gd($src_img);\n\t\t}\n\n\t\timagedestroy($src_img);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create Image - GD\n\t *\n\t * This simply creates an image resource handle\n\t * based on the type of image being processed\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tresource\n\t */\n\tpublic function image_create_gd($path = '', $image_type = '')\n\t{\n\t\tif ($path === '')\n\t\t{\n\t\t\t$path = $this->full_src_path;\n\t\t}\n\n\t\tif ($image_type === '')\n\t\t{\n\t\t\t$image_type = $this->image_type;\n\t\t}\n\n\t\tswitch ($image_type)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tif ( ! function_exists('imagecreatefromgif'))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported'));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\treturn imagecreatefromgif($path);\n\t\t\tcase 2:\n\t\t\t\tif ( ! function_exists('imagecreatefromjpeg'))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported'));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\treturn imagecreatefromjpeg($path);\n\t\t\tcase 3:\n\t\t\t\tif ( ! function_exists('imagecreatefrompng'))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported'));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\treturn imagecreatefrompng($path);\n\t\t\tdefault:\n\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate'));\n\t\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Write image file to disk - GD\n\t *\n\t * Takes an image resource as input and writes the file\n\t * to the specified destination\n\t *\n\t * @param\tresource\n\t * @return\tbool\n\t */\n\tpublic function image_save_gd($resource)\n\t{\n\t\tswitch ($this->image_type)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tif ( ! function_exists('imagegif'))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported'));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\tif ( ! @imagegif($resource, $this->full_dst_path))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error('imglib_save_failed');\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tif ( ! function_exists('imagejpeg'))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported'));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\tif ( ! @imagejpeg($resource, $this->full_dst_path, $this->quality))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error('imglib_save_failed');\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tif ( ! function_exists('imagepng'))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported'));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\tif ( ! @imagepng($resource, $this->full_dst_path))\n\t\t\t\t{\n\t\t\t\t\t$this->set_error('imglib_save_failed');\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$this->set_error(array('imglib_unsupported_imagecreate'));\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Dynamically outputs an image\n\t *\n\t * @param\tresource\n\t * @return\tvoid\n\t */\n\tpublic function image_display_gd($resource)\n\t{\n\t\theader('Content-Disposition: filename='.$this->source_image.';');\n\t\theader('Content-Type: '.$this->mime_type);\n\t\theader('Content-Transfer-Encoding: binary');\n\t\theader('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');\n\n\t\tswitch ($this->image_type)\n\t\t{\n\t\t\tcase 1\t:\timagegif($resource);\n\t\t\t\tbreak;\n\t\t\tcase 2\t:\timagejpeg($resource, NULL, $this->quality);\n\t\t\t\tbreak;\n\t\t\tcase 3\t:\timagepng($resource);\n\t\t\t\tbreak;\n\t\t\tdefault:\techo 'Unable to display the image';\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Re-proportion Image Width/Height\n\t *\n\t * When creating thumbs, the desired width/height\n\t * can end up warping the image due to an incorrect\n\t * ratio between the full-sized image and the thumb.\n\t *\n\t * This function lets us re-proportion the width/height\n\t * if users choose to maintain the aspect ratio when resizing.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function image_reproportion()\n\t{\n\t\tif (($this->width === 0 && $this->height === 0) OR $this->orig_width === 0 OR $this->orig_height === 0\n\t\t\tOR ( ! ctype_digit((string) $this->width) && ! ctype_digit((string) $this->height))\n\t\t\tOR ! ctype_digit((string) $this->orig_width) OR ! ctype_digit((string) $this->orig_height))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Sanitize\n\t\t$this->width = (int) $this->width;\n\t\t$this->height = (int) $this->height;\n\n\t\tif ($this->master_dim !== 'width' && $this->master_dim !== 'height')\n\t\t{\n\t\t\tif ($this->width > 0 && $this->height > 0)\n\t\t\t{\n\t\t\t\t$this->master_dim = ((($this->orig_height/$this->orig_width) - ($this->height/$this->width)) < 0)\n\t\t\t\t\t\t\t? 'width' : 'height';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->master_dim = ($this->height === 0) ? 'width' : 'height';\n\t\t\t}\n\t\t}\n\t\telseif (($this->master_dim === 'width' && $this->width === 0)\n\t\t\tOR ($this->master_dim === 'height' && $this->height === 0))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif ($this->master_dim === 'width')\n\t\t{\n\t\t\t$this->height = (int) ceil($this->width*$this->orig_height/$this->orig_width);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->width = (int) ceil($this->orig_width*$this->height/$this->orig_height);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get image properties\n\t *\n\t * A helper function that gets info about the file\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tmixed\n\t */\n\tpublic function get_image_properties($path = '', $return = FALSE)\n\t{\n\t\t// For now we require GD but we should\n\t\t// find a way to determine this using IM or NetPBM\n\n\t\tif ($path === '')\n\t\t{\n\t\t\t$path = $this->full_src_path;\n\t\t}\n\n\t\tif ( ! file_exists($path))\n\t\t{\n\t\t\t$this->set_error('imglib_invalid_path');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$vals = getimagesize($path);\n\t\tif ($vals === FALSE)\n\t\t{\n\t\t\t$this->set_error('imglib_invalid_image');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');\n\t\t$mime = isset($types[$vals[2]]) ? 'image/'.$types[$vals[2]] : 'image/jpg';\n\n\t\tif ($return === TRUE)\n\t\t{\n\t\t\treturn array(\n\t\t\t\t'width'      => $vals[0],\n\t\t\t\t'height'     => $vals[1],\n\t\t\t\t'image_type' => $vals[2],\n\t\t\t\t'size_str'   => $vals[3],\n\t\t\t\t'mime_type'  => $mime\n\t\t\t);\n\t\t}\n\n\t\t$this->orig_width  = $vals[0];\n\t\t$this->orig_height = $vals[1];\n\t\t$this->image_type  = $vals[2];\n\t\t$this->size_str    = $vals[3];\n\t\t$this->mime_type   = $mime;\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Size calculator\n\t *\n\t * This function takes a known width x height and\n\t * recalculates it to a new size. Only one\n\t * new variable needs to be known\n\t *\n\t *\t$props = array(\n\t *\t\t\t'width'\t\t=> $width,\n\t *\t\t\t'height'\t=> $height,\n\t *\t\t\t'new_width'\t=> 40,\n\t *\t\t\t'new_height'\t=> ''\n\t *\t\t);\n\t *\n\t * @param\tarray\n\t * @return\tarray\n\t */\n\tpublic function size_calculator($vals)\n\t{\n\t\tif ( ! is_array($vals))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t$allowed = array('new_width', 'new_height', 'width', 'height');\n\n\t\tforeach ($allowed as $item)\n\t\t{\n\t\t\tif (empty($vals[$item]))\n\t\t\t{\n\t\t\t\t$vals[$item] = 0;\n\t\t\t}\n\t\t}\n\n\t\tif ($vals['width'] === 0 OR $vals['height'] === 0)\n\t\t{\n\t\t\treturn $vals;\n\t\t}\n\n\t\tif ($vals['new_width'] === 0)\n\t\t{\n\t\t\t$vals['new_width'] = ceil($vals['width']*$vals['new_height']/$vals['height']);\n\t\t}\n\t\telseif ($vals['new_height'] === 0)\n\t\t{\n\t\t\t$vals['new_height'] = ceil($vals['new_width']*$vals['height']/$vals['width']);\n\t\t}\n\n\t\treturn $vals;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Explode source_image\n\t *\n\t * This is a helper function that extracts the extension\n\t * from the source_image.  This function lets us deal with\n\t * source_images with multiple periods, like: my.cool.jpg\n\t * It returns an associative array with two elements:\n\t * $array['ext']  = '.jpg';\n\t * $array['name'] = 'my.cool';\n\t *\n\t * @param\tarray\n\t * @return\tarray\n\t */\n\tpublic function explode_name($source_image)\n\t{\n\t\t$ext = strrchr($source_image, '.');\n\t\t$name = ($ext === FALSE) ? $source_image : substr($source_image, 0, -strlen($ext));\n\n\t\treturn array('ext' => $ext, 'name' => $name);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is GD Installed?\n\t *\n\t * @return\tbool\n\t */\n\tpublic function gd_loaded()\n\t{\n\t\tif ( ! extension_loaded('gd'))\n\t\t{\n\t\t\t/* As it is stated in the PHP manual, dl() is not always available\n\t\t\t * and even if so - it could generate an E_WARNING message on failure\n\t\t\t */\n\t\t\treturn (function_exists('dl') && @dl('gd.so'));\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get GD version\n\t *\n\t * @return\tmixed\n\t */\n\tpublic function gd_version()\n\t{\n\t\tif (function_exists('gd_info'))\n\t\t{\n\t\t\t$gd_version = @gd_info();\n\t\t\treturn preg_replace('/\\D/', '', $gd_version['GD Version']);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set error message\n\t *\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function set_error($msg)\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->lang->load('imglib');\n\n\t\tif (is_array($msg))\n\t\t{\n\t\t\tforeach ($msg as $val)\n\t\t\t{\n\t\t\t\t$msg = ($CI->lang->line($val) === FALSE) ? $val : $CI->lang->line($val);\n\t\t\t\t$this->error_msg[] = $msg;\n\t\t\t\tlog_message('error', $msg);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$msg = ($CI->lang->line($msg) === FALSE) ? $msg : $CI->lang->line($msg);\n\t\t\t$this->error_msg[] = $msg;\n\t\t\tlog_message('error', $msg);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show error messages\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function display_errors($open = '<p>', $close = '</p>')\n\t{\n\t\treturn (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : '';\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Javascript/Jquery.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Jquery Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLoader\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/javascript.html\n */\nclass CI_Jquery extends CI_Javascript {\n\n\t/**\n\t * JavaScript directory location\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_javascript_folder = 'js';\n\n\t/**\n\t * JQuery code for load\n\t *\n\t * @var\tarray\n\t */\n\tpublic $jquery_code_for_load = array();\n\n\t/**\n\t * JQuery code for compile\n\t *\n\t * @var\tarray\n\t */\n\tpublic $jquery_code_for_compile = array();\n\n\t/**\n\t * JQuery corner active flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $jquery_corner_active = FALSE;\n\n\t/**\n\t * JQuery table sorter active flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $jquery_table_sorter_active = FALSE;\n\n\t/**\n\t * JQuery table sorter pager active\n\t *\n\t * @var\tbool\n\t */\n\tpublic $jquery_table_sorter_pager_active = FALSE;\n\n\t/**\n\t * JQuery AJAX image\n\t *\n\t * @var\tstring\n\t */\n\tpublic $jquery_ajax_img = '';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params)\n\t{\n\t\t$this->CI =& get_instance();\n\t\textract($params);\n\n\t\tif ($autoload === TRUE)\n\t\t{\n\t\t\t$this->script();\n\t\t}\n\n\t\tlog_message('info', 'Jquery Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Event Code\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Blur\n\t *\n\t * Outputs a jQuery blur event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _blur($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'blur');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Change\n\t *\n\t * Outputs a jQuery change event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _change($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'change');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Click\n\t *\n\t * Outputs a jQuery click event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @param\tbool\twhether or not to return false\n\t * @return\tstring\n\t */\n\tprotected function _click($element = 'this', $js = '', $ret_false = TRUE)\n\t{\n\t\tis_array($js) OR $js = array($js);\n\n\t\tif ($ret_false)\n\t\t{\n\t\t\t$js[] = 'return false;';\n\t\t}\n\n\t\treturn $this->_add_event($element, $js, 'click');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Double Click\n\t *\n\t * Outputs a jQuery dblclick event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _dblclick($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'dblclick');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Outputs a jQuery error event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _error($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'error');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Focus\n\t *\n\t * Outputs a jQuery focus event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _focus($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'focus');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Hover\n\t *\n\t * Outputs a jQuery hover event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- Javascript code for mouse over\n\t * @param\tstring\t- Javascript code for mouse out\n\t * @return\tstring\n\t */\n\tprotected function _hover($element = 'this', $over = '', $out = '')\n\t{\n\t\t$event = \"\\n\\t$(\".$this->_prep_element($element).\").hover(\\n\\t\\tfunction()\\n\\t\\t{\\n\\t\\t\\t{$over}\\n\\t\\t}, \\n\\t\\tfunction()\\n\\t\\t{\\n\\t\\t\\t{$out}\\n\\t\\t});\\n\";\n\n\t\t$this->jquery_code_for_compile[] = $event;\n\n\t\treturn $event;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Keydown\n\t *\n\t * Outputs a jQuery keydown event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _keydown($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'keydown');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Keyup\n\t *\n\t * Outputs a jQuery keydown event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _keyup($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'keyup');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load\n\t *\n\t * Outputs a jQuery load event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _load($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'load');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mousedown\n\t *\n\t * Outputs a jQuery mousedown event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _mousedown($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'mousedown');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mouse Out\n\t *\n\t * Outputs a jQuery mouseout event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _mouseout($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'mouseout');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mouse Over\n\t *\n\t * Outputs a jQuery mouseover event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _mouseover($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'mouseover');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mouseup\n\t *\n\t * Outputs a jQuery mouseup event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _mouseup($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'mouseup');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Output\n\t *\n\t * Outputs script directly\n\t *\n\t * @param\tarray\t$array_js = array()\n\t * @return\tvoid\n\t */\n\tprotected function _output($array_js = array())\n\t{\n\t\tif ( ! is_array($array_js))\n\t\t{\n\t\t\t$array_js = array($array_js);\n\t\t}\n\n\t\tforeach ($array_js as $js)\n\t\t{\n\t\t\t$this->jquery_code_for_compile[] = \"\\t\".$js.\"\\n\";\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Resize\n\t *\n\t * Outputs a jQuery resize event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _resize($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'resize');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Scroll\n\t *\n\t * Outputs a jQuery scroll event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _scroll($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'scroll');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Unload\n\t *\n\t * Outputs a jQuery unload event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tprotected function _unload($element = 'this', $js = '')\n\t{\n\t\treturn $this->_add_event($element, $js, 'unload');\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Effects\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Class\n\t *\n\t * Outputs a jQuery addClass event\n\t *\n\t * @param\tstring\t$element\n\t * @param\tstring\t$class\n\t * @return\tstring\n\t */\n\tprotected function _addClass($element = 'this', $class = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\treturn '$('.$element.').addClass(\"'.$class.'\");';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Animate\n\t *\n\t * Outputs a jQuery animate event\n\t *\n\t * @param\tstring\t$element\n\t * @param\tarray\t$params\n\t * @param\tstring\t$speed\t'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t$extra\n\t * @return\tstring\n\t */\n\tprotected function _animate($element = 'this', $params = array(), $speed = '', $extra = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\t$animations = \"\\t\\t\\t\";\n\n\t\tforeach ($params as $param => $value)\n\t\t{\n\t\t\t$animations .= $param.\": '\".$value.\"', \";\n\t\t}\n\n\t\t$animations = substr($animations, 0, -2); // remove the last \", \"\n\n\t\tif ($speed !== '')\n\t\t{\n\t\t\t$speed = ', '.$speed;\n\t\t}\n\n\t\tif ($extra !== '')\n\t\t{\n\t\t\t$extra = ', '.$extra;\n\t\t}\n\n\t\treturn \"$({$element}).animate({\\n$animations\\n\\t\\t}\".$speed.$extra.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fade In\n\t *\n\t * Outputs a jQuery hide event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _fadeIn($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn \"$({$element}).fadeIn({$speed}{$callback});\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fade Out\n\t *\n\t * Outputs a jQuery hide event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _fadeOut($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn '$('.$element.').fadeOut('.$speed.$callback.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Hide\n\t *\n\t * Outputs a jQuery hide action\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _hide($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn \"$({$element}).hide({$speed}{$callback});\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Remove Class\n\t *\n\t * Outputs a jQuery remove class event\n\t *\n\t * @param\tstring\t$element\n\t * @param\tstring\t$class\n\t * @return\tstring\n\t */\n\tprotected function _removeClass($element = 'this', $class = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\treturn '$('.$element.').removeClass(\"'.$class.'\");';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slide Up\n\t *\n\t * Outputs a jQuery slideUp event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _slideUp($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn '$('.$element.').slideUp('.$speed.$callback.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slide Down\n\t *\n\t * Outputs a jQuery slideDown event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _slideDown($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn '$('.$element.').slideDown('.$speed.$callback.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slide Toggle\n\t *\n\t * Outputs a jQuery slideToggle event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _slideToggle($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn '$('.$element.').slideToggle('.$speed.$callback.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Toggle\n\t *\n\t * Outputs a jQuery toggle event\n\t *\n\t * @param\tstring\t- element\n\t * @return\tstring\n\t */\n\tprotected function _toggle($element = 'this')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\treturn '$('.$element.').toggle();';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Toggle Class\n\t *\n\t * Outputs a jQuery toggle class event\n\t *\n\t * @param\tstring\t$element\n\t * @param\tstring\t$class\n\t * @return\tstring\n\t */\n\tprotected function _toggleClass($element = 'this', $class = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\treturn '$('.$element.').toggleClass(\"'.$class.'\");';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show\n\t *\n\t * Outputs a jQuery show event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tprotected function _show($element = 'this', $speed = '', $callback = '')\n\t{\n\t\t$element = $this->_prep_element($element);\n\t\t$speed = $this->_validate_speed($speed);\n\n\t\tif ($callback !== '')\n\t\t{\n\t\t\t$callback = \", function(){\\n{$callback}\\n}\";\n\t\t}\n\n\t\treturn '$('.$element.').show('.$speed.$callback.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Updater\n\t *\n\t * An Ajax call that populates the designated DOM node with\n\t * returned content\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tthe controller to run the call against\n\t * @param\tstring\toptional parameters\n\t * @return\tstring\n\t */\n\n\tprotected function _updater($container = 'this', $controller = '', $options = '')\n\t{\n\t\t$container = $this->_prep_element($container);\n\t\t$controller = (strpos('://', $controller) === FALSE) ? $controller : $this->CI->config->site_url($controller);\n\n\t\t// ajaxStart and ajaxStop are better choices here... but this is a stop gap\n\t\tif ($this->CI->config->item('javascript_ajax_img') === '')\n\t\t{\n\t\t\t$loading_notifier = 'Loading...';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$loading_notifier = '<img src=\"'.$this->CI->config->slash_item('base_url').$this->CI->config->item('javascript_ajax_img').'\" alt=\"Loading\" />';\n\t\t}\n\n\t\t$updater = '$('.$container.\").empty();\\n\" // anything that was in... get it out\n\t\t\t.\"\\t\\t$(\".$container.').prepend(\"'.$loading_notifier.\"\\\");\\n\"; // to replace with an image\n\n\t\t$request_options = '';\n\t\tif ($options !== '')\n\t\t{\n\t\t\t$request_options .= ', {'\n\t\t\t\t\t.(is_array($options) ? \"'\".implode(\"', '\", $options).\"'\" : \"'\".str_replace(':', \"':'\", $options).\"'\")\n\t\t\t\t\t.'}';\n\t\t}\n\n\t\treturn $updater.\"\\t\\t$($container).load('$controller'$request_options);\";\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Pre-written handy stuff\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Zebra tables\n\t *\n\t * @param\tstring\t$class\n\t * @param\tstring\t$odd\n\t * @param\tstring\t$hover\n\t * @return\tstring\n\t */\n\tprotected function _zebraTables($class = '', $odd = 'odd', $hover = '')\n\t{\n\t\t$class = ($class !== '') ? '.'.$class : '';\n\t\t$zebra = \"\\t\\$(\\\"table{$class} tbody tr:nth-child(even)\\\").addClass(\\\"{$odd}\\\");\";\n\n\t\t$this->jquery_code_for_compile[] = $zebra;\n\n\t\tif ($hover !== '')\n\t\t{\n\t\t\t$hover = $this->hover(\"table{$class} tbody tr\", \"$(this).addClass('hover');\", \"$(this).removeClass('hover');\");\n\t\t}\n\n\t\treturn $zebra;\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Plugins\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Corner Plugin\n\t *\n\t * @link\thttps://www.malsup.com/jquery/corner/\n\t * @param\tstring\t$element\n\t * @param\tstring\t$corner_style\n\t * @return\tstring\n\t */\n\tpublic function corner($element = '', $corner_style = '')\n\t{\n\t\t// may want to make this configurable down the road\n\t\t$corner_location = '/plugins/jquery.corner.js';\n\n\t\tif ($corner_style !== '')\n\t\t{\n\t\t\t$corner_style = '\"'.$corner_style.'\"';\n\t\t}\n\n\t\treturn '$('.$this->_prep_element($element).').corner('.$corner_style.');';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Modal window\n\t *\n\t * Load a thickbox modal window\n\t *\n\t * @param\tstring\t$src\n\t * @param\tbool\t$relative\n\t * @return\tvoid\n\t */\n\tpublic function modal($src, $relative = FALSE)\n\t{\n\t\t$this->jquery_code_for_load[] = $this->external($src, $relative);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Effect\n\t *\n\t * Load an Effect library\n\t *\n\t * @param\tstring\t$src\n\t * @param\tbool\t$relative\n\t * @return\tvoid\n\t */\n\tpublic function effect($src, $relative = FALSE)\n\t{\n\t\t$this->jquery_code_for_load[] = $this->external($src, $relative);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Plugin\n\t *\n\t * Load a plugin library\n\t *\n\t * @param\tstring\t$src\n\t * @param\tbool\t$relative\n\t * @return\tvoid\n\t */\n\tpublic function plugin($src, $relative = FALSE)\n\t{\n\t\t$this->jquery_code_for_load[] = $this->external($src, $relative);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * UI\n\t *\n\t * Load a user interface library\n\t *\n\t * @param\tstring\t$src\n\t * @param\tbool\t$relative\n\t * @return\tvoid\n\t */\n\tpublic function ui($src, $relative = FALSE)\n\t{\n\t\t$this->jquery_code_for_load[] = $this->external($src, $relative);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sortable\n\t *\n\t * Creates a jQuery sortable\n\t *\n\t * @param\tstring\t$element\n\t * @param\tarray\t$options\n\t * @return\tstring\n\t */\n\tpublic function sortable($element, $options = array())\n\t{\n\t\tif (count($options) > 0)\n\t\t{\n\t\t\t$sort_options = array();\n\t\t\tforeach ($options as $k=>$v)\n\t\t\t{\n\t\t\t\t$sort_options[] = \"\\n\\t\\t\".$k.': '.$v;\n\t\t\t}\n\t\t\t$sort_options = implode(',', $sort_options);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$sort_options = '';\n\t\t}\n\n\t\treturn '$('.$this->_prep_element($element).').sortable({'.$sort_options.\"\\n\\t});\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Table Sorter Plugin\n\t *\n\t * @param\tstring\ttable name\n\t * @param\tstring\tplugin location\n\t * @return\tstring\n\t */\n\tpublic function tablesorter($table = '', $options = '')\n\t{\n\t\t$this->jquery_code_for_compile[] = \"\\t$(\".$this->_prep_element($table).').tablesorter('.$options.\");\\n\";\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Class functions\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Event\n\t *\n\t * Constructs the syntax for an event, and adds to into the array for compilation\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @param\tstring\tThe event to pass\n\t * @return\tstring\n\t */\n\tprotected function _add_event($element, $js, $event)\n\t{\n\t\tif (is_array($js))\n\t\t{\n\t\t\t$js = implode(\"\\n\\t\\t\", $js);\n\t\t}\n\n\t\t$event = \"\\n\\t$(\".$this->_prep_element($element).').'.$event.\"(function(){\\n\\t\\t{$js}\\n\\t});\\n\";\n\t\t$this->jquery_code_for_compile[] = $event;\n\t\treturn $event;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile\n\t *\n\t * As events are specified, they are stored in an array\n\t * This function compiles them all for output on a page\n\t *\n\t * @param\tstring\t$view_var\n\t * @param\tbool\t$script_tags\n\t * @return\tvoid\n\t */\n\tprotected function _compile($view_var = 'script_foot', $script_tags = TRUE)\n\t{\n\t\t// External references\n\t\t$external_scripts = implode('', $this->jquery_code_for_load);\n\t\t$this->CI->load->vars(array('library_src' => $external_scripts));\n\n\t\tif (count($this->jquery_code_for_compile) === 0)\n\t\t{\n\t\t\t// no inline references, let's just return\n\t\t\treturn;\n\t\t}\n\n\t\t// Inline references\n\t\t$script = '$(document).ready(function() {'.\"\\n\"\n\t\t\t.implode('', $this->jquery_code_for_compile)\n\t\t\t.'});';\n\n\t\t$output = ($script_tags === FALSE) ? $script : $this->inline($script);\n\n\t\t$this->CI->load->vars(array($view_var => $output));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clear Compile\n\t *\n\t * Clears the array of script events collected for output\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _clear_compile()\n\t{\n\t\t$this->jquery_code_for_compile = array();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Document Ready\n\t *\n\t * A wrapper for writing document.ready()\n\t *\n\t * @param\tarray\t$js\n\t * @return\tvoid\n\t */\n\tprotected function _document_ready($js)\n\t{\n\t\tis_array($js) OR $js = array($js);\n\n\t\tforeach ($js as $script)\n\t\t{\n\t\t\t$this->jquery_code_for_compile[] = $script;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Script Tag\n\t *\n\t * Outputs the script tag that loads the jquery.js file into an HTML document\n\t *\n\t * @param\tstring\t$library_src\n\t * @param\tbool\t$relative\n\t * @return\tstring\n\t */\n\tpublic function script($library_src = '', $relative = FALSE)\n\t{\n\t\t$library_src = $this->external($library_src, $relative);\n\t\t$this->jquery_code_for_load[] = $library_src;\n\t\treturn $library_src;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep Element\n\t *\n\t * Puts HTML element in quotes for use in jQuery code\n\t * unless the supplied element is the Javascript 'this'\n\t * object, in which case no quotes are added\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _prep_element($element)\n\t{\n\t\tif ($element !== 'this')\n\t\t{\n\t\t\t$element = '\"'.$element.'\"';\n\t\t}\n\n\t\treturn $element;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate Speed\n\t *\n\t * Ensures the speed parameter is valid for jQuery\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _validate_speed($speed)\n\t{\n\t\tif (in_array($speed, array('slow', 'normal', 'fast')))\n\t\t{\n\t\t\treturn '\"'.$speed.'\"';\n\t\t}\n\t\telseif (preg_match('/[^0-9]/', $speed))\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\treturn $speed;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Javascript/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/libraries/Javascript.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Javascript Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tJavascript\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/javascript.html\n * @deprecated\t3.0.0\tThis was never a good idea in the first place.\n */\nclass CI_Javascript {\n\n\t/**\n\t * JavaScript location\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_javascript_location = 'js';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tarray\t$params\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params = array())\n\t{\n\t\t$defaults = array('js_library_driver' => 'jquery', 'autoload' => TRUE);\n\n\t\tforeach ($defaults as $key => $val)\n\t\t{\n\t\t\tif (isset($params[$key]) && $params[$key] !== '')\n\t\t\t{\n\t\t\t\t$defaults[$key] = $params[$key];\n\t\t\t}\n\t\t}\n\n\t\textract($defaults);\n\n\t\t$this->CI =& get_instance();\n\n\t\t// load the requested js library\n\t\t$this->CI->load->library('Javascript/'.$js_library_driver, array('autoload' => $autoload));\n\t\t// make js to refer to current library\n\t\t$this->js =& $this->CI->$js_library_driver;\n\n\t\tlog_message('info', 'Javascript Class Initialized and loaded. Driver used: '.$js_library_driver);\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Event Code\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Blur\n\t *\n\t * Outputs a javascript library blur event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function blur($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_blur($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Change\n\t *\n\t * Outputs a javascript library change event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function change($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_change($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Click\n\t *\n\t * Outputs a javascript library click event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @param\tbool\twhether or not to return false\n\t * @return\tstring\n\t */\n\tpublic function click($element = 'this', $js = '', $ret_false = TRUE)\n\t{\n\t\treturn $this->js->_click($element, $js, $ret_false);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Double Click\n\t *\n\t * Outputs a javascript library dblclick event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function dblclick($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_dblclick($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error\n\t *\n\t * Outputs a javascript library error event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function error($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_error($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Focus\n\t *\n\t * Outputs a javascript library focus event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function focus($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_focus($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Hover\n\t *\n\t * Outputs a javascript library hover event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- Javascript code for mouse over\n\t * @param\tstring\t- Javascript code for mouse out\n\t * @return\tstring\n\t */\n\tpublic function hover($element = 'this', $over = '', $out = '')\n\t{\n\t\treturn $this->js->_hover($element, $over, $out);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Keydown\n\t *\n\t * Outputs a javascript library keydown event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function keydown($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_keydown($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Keyup\n\t *\n\t * Outputs a javascript library keydown event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function keyup($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_keyup($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Load\n\t *\n\t * Outputs a javascript library load event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function load($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_load($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mousedown\n\t *\n\t * Outputs a javascript library mousedown event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function mousedown($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_mousedown($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mouse Out\n\t *\n\t * Outputs a javascript library mouseout event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function mouseout($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_mouseout($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mouse Over\n\t *\n\t * Outputs a javascript library mouseover event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function mouseover($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_mouseover($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Mouseup\n\t *\n\t * Outputs a javascript library mouseup event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function mouseup($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_mouseup($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Output\n\t *\n\t * Outputs the called javascript to the screen\n\t *\n\t * @param\tstring\tThe code to output\n\t * @return\tstring\n\t */\n\tpublic function output($js)\n\t{\n\t\treturn $this->js->_output($js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Ready\n\t *\n\t * Outputs a javascript library mouseup event\n\t *\n\t * @param\tstring\t$js\tCode to execute\n\t * @return\tstring\n\t */\n\tpublic function ready($js)\n\t{\n\t\treturn $this->js->_document_ready($js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Resize\n\t *\n\t * Outputs a javascript library resize event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function resize($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_resize($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Scroll\n\t *\n\t * Outputs a javascript library scroll event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function scroll($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_scroll($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Unload\n\t *\n\t * Outputs a javascript library unload event\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tstring\tThe code to execute\n\t * @return\tstring\n\t */\n\tpublic function unload($element = 'this', $js = '')\n\t{\n\t\treturn $this->js->_unload($element, $js);\n\t}\n\n\t// --------------------------------------------------------------------\n\t// Effects\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Class\n\t *\n\t * Outputs a javascript library addClass event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- Class to add\n\t * @return\tstring\n\t */\n\tpublic function addClass($element = 'this', $class = '')\n\t{\n\t\treturn $this->js->_addClass($element, $class);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Animate\n\t *\n\t * Outputs a javascript library animate event\n\t *\n\t * @param\tstring\t$element = 'this'\n\t * @param\tarray\t$params = array()\n\t * @param\tmixed\t$speed\t\t\t'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t$extra\n\t * @return\tstring\n\t */\n\tpublic function animate($element = 'this', $params = array(), $speed = '', $extra = '')\n\t{\n\t\treturn $this->js->_animate($element, $params, $speed, $extra);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fade In\n\t *\n\t * Outputs a javascript library hide event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function fadeIn($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_fadeIn($element, $speed, $callback);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fade Out\n\t *\n\t * Outputs a javascript library hide event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function fadeOut($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_fadeOut($element, $speed, $callback);\n\t}\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slide Up\n\t *\n\t * Outputs a javascript library slideUp event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function slideUp($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_slideUp($element, $speed, $callback);\n\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Remove Class\n\t *\n\t * Outputs a javascript library removeClass event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- Class to add\n\t * @return\tstring\n\t */\n\tpublic function removeClass($element = 'this', $class = '')\n\t{\n\t\treturn $this->js->_removeClass($element, $class);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slide Down\n\t *\n\t * Outputs a javascript library slideDown event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function slideDown($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_slideDown($element, $speed, $callback);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Slide Toggle\n\t *\n\t * Outputs a javascript library slideToggle event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function slideToggle($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_slideToggle($element, $speed, $callback);\n\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Hide\n\t *\n\t * Outputs a javascript library hide action\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function hide($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_hide($element, $speed, $callback);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Toggle\n\t *\n\t * Outputs a javascript library toggle event\n\t *\n\t * @param\tstring\t- element\n\t * @return\tstring\n\t */\n\tpublic function toggle($element = 'this')\n\t{\n\t\treturn $this->js->_toggle($element);\n\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Toggle Class\n\t *\n\t * Outputs a javascript library toggle class event\n\t *\n\t * @param\tstring\t$element = 'this'\n\t * @param\tstring\t$class = ''\n\t * @return\tstring\n\t */\n\tpublic function toggleClass($element = 'this', $class = '')\n\t{\n\t\treturn $this->js->_toggleClass($element, $class);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show\n\t *\n\t * Outputs a javascript library show event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function show($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_show($element, $speed, $callback);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile\n\t *\n\t * gather together all script needing to be output\n\t *\n\t * @param\tstring\t$view_var\n\t * @param\tbool\t$script_tags\n\t * @return\tstring\n\t */\n\tpublic function compile($view_var = 'script_foot', $script_tags = TRUE)\n\t{\n\t\t$this->js->_compile($view_var, $script_tags);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clear Compile\n\t *\n\t * Clears any previous javascript collected for output\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function clear_compile()\n\t{\n\t\t$this->js->_clear_compile();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * External\n\t *\n\t * Outputs a <script> tag with the source as an external js file\n\t *\n\t * @param\tstring\t$external_file\n\t * @param\tbool\t$relative\n\t * @return\tstring\n\t */\n\tpublic function external($external_file = '', $relative = FALSE)\n\t{\n\t\tif ($external_file !== '')\n\t\t{\n\t\t\t$this->_javascript_location = $external_file;\n\t\t}\n\t\telseif ($this->CI->config->item('javascript_location') !== '')\n\t\t{\n\t\t\t$this->_javascript_location = $this->CI->config->item('javascript_location');\n\t\t}\n\n\t\tif ($relative === TRUE OR strpos($external_file, 'http://') === 0 OR strpos($external_file, 'https://') === 0)\n\t\t{\n\t\t\t$str = $this->_open_script($external_file);\n\t\t}\n\t\telseif (strpos($this->_javascript_location, 'http://') !== FALSE)\n\t\t{\n\t\t\t$str = $this->_open_script($this->_javascript_location.$external_file);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$str = $this->_open_script($this->CI->config->slash_item('base_url').$this->_javascript_location.$external_file);\n\t\t}\n\n\t\treturn $str.$this->_close_script();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Inline\n\t *\n\t * Outputs a <script> tag\n\t *\n\t * @param\tstring\tThe element to attach the event to\n\t * @param\tbool\tIf a CDATA section should be added\n\t * @return\tstring\n\t */\n\tpublic function inline($script, $cdata = TRUE)\n\t{\n\t\treturn $this->_open_script()\n\t\t\t. ($cdata ? \"\\n// <![CDATA[\\n\".$script.\"\\n// ]]>\\n\" : \"\\n\".$script.\"\\n\")\n\t\t\t. $this->_close_script();\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Open Script\n\t *\n\t * Outputs an opening <script>\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _open_script($src = '')\n\t{\n\t\treturn '<script type=\"text/javascript\" charset=\"'.strtolower($this->CI->config->item('charset')).'\"'\n\t\t\t.($src === '' ? '>' : ' src=\"'.$src.'\">');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Close Script\n\t *\n\t * Outputs an closing </script>\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _close_script($extra = \"\\n\")\n\t{\n\t\treturn '</script>'.$extra;\n\t}\n\n\t// --------------------------------------------------------------------\n\t// AJAX-Y STUFF - still a testbed\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update\n\t *\n\t * Outputs a javascript library slideDown event\n\t *\n\t * @param\tstring\t- element\n\t * @param\tstring\t- One of 'slow', 'normal', 'fast', or time in milliseconds\n\t * @param\tstring\t- Javascript callback function\n\t * @return\tstring\n\t */\n\tpublic function update($element = 'this', $speed = '', $callback = '')\n\t{\n\t\treturn $this->js->_updater($element, $speed, $callback);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate JSON\n\t *\n\t * Can be passed a database result or associative array and returns a JSON formatted string\n\t *\n\t * @param\tmixed\tresult set or array\n\t * @param\tbool\tmatch array types (defaults to objects)\n\t * @return\tstring\ta json formatted string\n\t */\n\tpublic function generate_json($result = NULL, $match_array_type = FALSE)\n\t{\n\t\t// JSON data can optionally be passed to this function\n\t\t// either as a database result object or an array, or a user supplied array\n\t\tif ($result !== NULL)\n\t\t{\n\t\t\tif (is_object($result))\n\t\t\t{\n\t\t\t\t$json_result = is_callable(array($result, 'result_array')) ? $result->result_array() : (array) $result;\n\t\t\t}\n\t\t\telseif (is_array($result))\n\t\t\t{\n\t\t\t\t$json_result = $result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn $this->_prep_args($result);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 'null';\n\t\t}\n\n\t\t$json = array();\n\t\t$_is_assoc = TRUE;\n\n\t\tif ( ! is_array($json_result) && empty($json_result))\n\t\t{\n\t\t\tshow_error('Generate JSON Failed - Illegal key, value pair.');\n\t\t}\n\t\telseif ($match_array_type)\n\t\t{\n\t\t\t$_is_assoc = $this->_is_associative_array($json_result);\n\t\t}\n\n\t\tforeach ($json_result as $k => $v)\n\t\t{\n\t\t\tif ($_is_assoc)\n\t\t\t{\n\t\t\t\t$json[] = $this->_prep_args($k, TRUE).':'.$this->generate_json($v, $match_array_type);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$json[] = $this->generate_json($v, $match_array_type);\n\t\t\t}\n\t\t}\n\n\t\t$json = implode(',', $json);\n\n\t\treturn $_is_assoc ? '{'.$json.'}' : '['.$json.']';\n\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is associative array\n\t *\n\t * Checks for an associative array\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tprotected function _is_associative_array($arr)\n\t{\n\t\tforeach (array_keys($arr) as $key => $val)\n\t\t{\n\t\t\tif ($key !== $val)\n\t\t\t{\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep Args\n\t *\n\t * Ensures a standard json value and escapes values\n\t *\n\t * @param\tmixed\t$result\n\t * @param\tbool\t$is_key = FALSE\n\t * @return\tstring\n\t */\n\tprotected function _prep_args($result, $is_key = FALSE)\n\t{\n\t\tif ($result === NULL)\n\t\t{\n\t\t\treturn 'null';\n\t\t}\n\t\telseif (is_bool($result))\n\t\t{\n\t\t\treturn ($result === TRUE) ? 'true' : 'false';\n\t\t}\n\t\telseif (is_string($result) OR $is_key)\n\t\t{\n\t\t\treturn '\"'.str_replace(array('\\\\', \"\\t\", \"\\n\", \"\\r\", '\"', '/'), array('\\\\\\\\', '\\\\t', '\\\\n', \"\\\\r\", '\\\"', '\\/'), $result).'\"';\n\t\t}\n\t\telseif (is_scalar($result))\n\t\t{\n\t\t\treturn $result;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Migration.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Migration Class\n *\n * All migrations should implement this, forces up() and down() and gives\n * access to the CI super-global.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tReactor Engineers\n * @link\n */\nclass CI_Migration {\n\n\t/**\n\t * Whether the library is enabled\n\t *\n\t * @var bool\n\t */\n\tprotected $_migration_enabled = FALSE;\n\n\t/**\n\t * Migration numbering type\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_migration_type = 'sequential';\n\n\t/**\n\t * Path to migration classes\n\t *\n\t * @var string\n\t */\n\tprotected $_migration_path = NULL;\n\n\t/**\n\t * Current migration version\n\t *\n\t * @var mixed\n\t */\n\tprotected $_migration_version = 0;\n\n\t/**\n\t * Database table with migration info\n\t *\n\t * @var string\n\t */\n\tprotected $_migration_table = 'migrations';\n\n\t/**\n\t * Whether to automatically run migrations\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_migration_auto_latest = FALSE;\n\n\t/**\n\t * Migration basename regex\n\t *\n\t * @var string\n\t */\n\tprotected $_migration_regex;\n\n\t/**\n\t * Error message\n\t *\n\t * @var string\n\t */\n\tprotected $_error_string = '';\n\n\t/**\n\t * Initialize Migration Class\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\t// Only run this constructor on main library load\n\t\tif ( ! in_array(get_class($this), array('CI_Migration', config_item('subclass_prefix').'Migration'), TRUE))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tforeach ($config as $key => $val)\n\t\t{\n\t\t\t$this->{'_'.$key} = $val;\n\t\t}\n\n\t\tlog_message('info', 'Migrations Class Initialized');\n\n\t\t// Are they trying to use migrations while it is disabled?\n\t\tif ($this->_migration_enabled !== TRUE)\n\t\t{\n\t\t\tshow_error('Migrations has been loaded but is disabled or set up incorrectly.');\n\t\t}\n\n\t\t// If not set, set it\n\t\t$this->_migration_path !== '' OR $this->_migration_path = APPPATH.'migrations/';\n\n\t\t// Add trailing slash if not set\n\t\t$this->_migration_path = rtrim($this->_migration_path, '/').'/';\n\n\t\t// Load migration language\n\t\t$this->lang->load('migration');\n\n\t\t// They'll probably be using dbforge\n\t\t$this->load->dbforge();\n\n\t\t// Make sure the migration table name was set.\n\t\tif (empty($this->_migration_table))\n\t\t{\n\t\t\tshow_error('Migrations configuration file (migration.php) must have \"migration_table\" set.');\n\t\t}\n\n\t\t// Migration basename regex\n\t\t$this->_migration_regex = ($this->_migration_type === 'timestamp')\n\t\t\t? '/^\\d{14}_(\\w+)$/'\n\t\t\t: '/^\\d{3}_(\\w+)$/';\n\n\t\t// Make sure a valid migration numbering type was set.\n\t\tif ( ! in_array($this->_migration_type, array('sequential', 'timestamp')))\n\t\t{\n\t\t\tshow_error('An invalid migration numbering type was specified: '.$this->_migration_type);\n\t\t}\n\n\t\t// If the migrations table is missing, make it\n\t\tif ( ! $this->db->table_exists($this->_migration_table))\n\t\t{\n\t\t\t$this->dbforge->add_field(array(\n\t\t\t\t'version' => array('type' => 'BIGINT', 'constraint' => 20),\n\t\t\t));\n\n\t\t\t$this->dbforge->create_table($this->_migration_table, TRUE);\n\n\t\t\t$this->db->insert($this->_migration_table, array('version' => 0));\n\t\t}\n\n\t\t// Do we auto migrate to the latest migration?\n\t\tif ($this->_migration_auto_latest === TRUE && ! $this->latest())\n\t\t{\n\t\t\tshow_error($this->error_string());\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Migrate to a schema version\n\t *\n\t * Calls each migration step required to get to the schema version of\n\t * choice\n\t *\n\t * @param\tstring\t$target_version\tTarget schema version\n\t * @return\tmixed\tTRUE if no migrations are found, current version string on success, FALSE on failure\n\t */\n\tpublic function version($target_version)\n\t{\n\t\t// Note: We use strings, so that timestamp versions work on 32-bit systems\n\t\t$current_version = $this->_get_version();\n\n\t\tif ($this->_migration_type === 'sequential')\n\t\t{\n\t\t\t$target_version = sprintf('%03d', $target_version);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$target_version = (string) $target_version;\n\t\t}\n\n\t\t$migrations = $this->find_migrations();\n\n\t\tif ($target_version > 0 && ! isset($migrations[$target_version]))\n\t\t{\n\t\t\t$this->_error_string = sprintf($this->lang->line('migration_not_found'), $target_version);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($target_version > $current_version)\n\t\t{\n\t\t\t$method = 'up';\n\t\t}\n\t\telseif ($target_version < $current_version)\n\t\t{\n\t\t\t$method = 'down';\n\t\t\t// We need this so that migrations are applied in reverse order\n\t\t\tkrsort($migrations);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Well, there's nothing to migrate then ...\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Validate all available migrations within our target range.\n\t\t//\n\t\t// Unfortunately, we'll have to use another loop to run them\n\t\t// in order to avoid leaving the procedure in a broken state.\n\t\t//\n\t\t// See https://github.com/bcit-ci/CodeIgniter/issues/4539\n\t\t$pending = array();\n\t\tforeach ($migrations as $number => $file)\n\t\t{\n\t\t\t// Ignore versions out of our range.\n\t\t\t//\n\t\t\t// Because we've previously sorted the $migrations array depending on the direction,\n\t\t\t// we can safely break the loop once we reach $target_version ...\n\t\t\tif ($method === 'up')\n\t\t\t{\n\t\t\t\tif ($number <= $current_version)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telseif ($number > $target_version)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ($number > $current_version)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telseif ($number <= $target_version)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for sequence gaps\n\t\t\tif ($this->_migration_type === 'sequential')\n\t\t\t{\n\t\t\t\tif (isset($previous) && abs($number - $previous) > 1)\n\t\t\t\t{\n\t\t\t\t\t$this->_error_string = sprintf($this->lang->line('migration_sequence_gap'), $number);\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\t$previous = $number;\n\t\t\t}\n\n\t\t\tinclude_once($file);\n\t\t\t$class = 'Migration_'.ucfirst(strtolower($this->_get_migration_name(basename($file, '.php'))));\n\n\t\t\t// Validate the migration file structure\n\t\t\tif ( ! class_exists($class, FALSE))\n\t\t\t{\n\t\t\t\t$this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telseif ( ! method_exists($class, $method) OR ! (new ReflectionMethod($class, $method))->isPublic())\n\t\t\t{\n\t\t\t\t$this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$pending[$number] = array($class, $method);\n\t\t}\n\n\t\t// Now just run the necessary migrations\n\t\tforeach ($pending as $number => $migration)\n\t\t{\n\t\t\tlog_message('debug', 'Migrating '.$method.' from version '.$current_version.' to version '.$number);\n\n\t\t\t$migration[0] = new $migration[0];\n\t\t\tcall_user_func($migration);\n\t\t\t$current_version = $number;\n\t\t\t$this->_update_version($current_version);\n\t\t}\n\n\t\t// This is necessary when moving down, since the the last migration applied\n\t\t// will be the down() method for the next migration up from the target\n\t\tif ($current_version <> $target_version)\n\t\t{\n\t\t\t$current_version = $target_version;\n\t\t\t$this->_update_version($current_version);\n\t\t}\n\n\t\tlog_message('debug', 'Finished migrating to '.$current_version);\n\t\treturn $current_version;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sets the schema to the latest migration\n\t *\n\t * @return\tmixed\tCurrent version string on success, FALSE on failure\n\t */\n\tpublic function latest()\n\t{\n\t\t$migrations = $this->find_migrations();\n\n\t\tif (empty($migrations))\n\t\t{\n\t\t\t$this->_error_string = $this->lang->line('migration_none_found');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$last_migration = basename(end($migrations));\n\n\t\t// Calculate the last migration step from existing migration\n\t\t// filenames and proceed to the standard version migration\n\t\treturn $this->version($this->_get_migration_number($last_migration));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sets the schema to the migration version set in config\n\t *\n\t * @return\tmixed\tTRUE if no migrations are found, current version string on success, FALSE on failure\n\t */\n\tpublic function current()\n\t{\n\t\treturn $this->version($this->_migration_version);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Error string\n\t *\n\t * @return\tstring\tError message returned as a string\n\t */\n\tpublic function error_string()\n\t{\n\t\treturn $this->_error_string;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Retrieves list of available migration scripts\n\t *\n\t * @return\tarray\tlist of migration file paths sorted by version\n\t */\n\tpublic function find_migrations()\n\t{\n\t\t$migrations = array();\n\n\t\t// Load all *_*.php files in the migrations path\n\t\tforeach (glob($this->_migration_path.'*_*.php') as $file)\n\t\t{\n\t\t\t$name = basename($file, '.php');\n\n\t\t\t// Filter out non-migration files\n\t\t\tif (preg_match($this->_migration_regex, $name))\n\t\t\t{\n\t\t\t\t$number = $this->_get_migration_number($name);\n\n\t\t\t\t// There cannot be duplicate migration numbers\n\t\t\t\tif (isset($migrations[$number]))\n\t\t\t\t{\n\t\t\t\t\t$this->_error_string = sprintf($this->lang->line('migration_multiple_version'), $number);\n\t\t\t\t\tshow_error($this->_error_string);\n\t\t\t\t}\n\n\t\t\t\t$migrations[$number] = $file;\n\t\t\t}\n\t\t}\n\n\t\tksort($migrations);\n\t\treturn $migrations;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Extracts the migration number from a filename\n\t *\n\t * @param\tstring\t$migration\n\t * @return\tstring\tNumeric portion of a migration filename\n\t */\n\tprotected function _get_migration_number($migration)\n\t{\n\t\treturn sscanf($migration, '%[0-9]+', $number)\n\t\t\t? $number : '0';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Extracts the migration class name from a filename\n\t *\n\t * @param\tstring\t$migration\n\t * @return\tstring\ttext portion of a migration filename\n\t */\n\tprotected function _get_migration_name($migration)\n\t{\n\t\t$parts = explode('_', $migration);\n\t\tarray_shift($parts);\n\t\treturn implode('_', $parts);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Retrieves current schema version\n\t *\n\t * @return\tstring\tCurrent migration version\n\t */\n\tprotected function _get_version()\n\t{\n\t\t$row = $this->db->select('version')->get($this->_migration_table)->row();\n\t\treturn $row ? $row->version : '0';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Stores the current schema version\n\t *\n\t * @param\tstring\t$migration\tMigration reached\n\t * @return\tvoid\n\t */\n\tprotected function _update_version($migration)\n\t{\n\t\t$this->db->update($this->_migration_table, array(\n\t\t\t'version' => $migration\n\t\t));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Enable the use of CI super-global\n\t *\n\t * @param\tstring\t$var\n\t * @return\tmixed\n\t */\n\tpublic function __get($var)\n\t{\n\t\treturn get_instance()->$var;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Pagination.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Pagination Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tPagination\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/pagination.html\n */\nclass CI_Pagination {\n\n\t/**\n\t * Base URL\n\t *\n\t * The page that we're linking to\n\t *\n\t * @var\tstring\n\t */\n\tprotected $base_url\t\t= '';\n\n\t/**\n\t * Prefix\n\t *\n\t * @var\tstring\n\t */\n\tprotected $prefix = '';\n\n\t/**\n\t * Suffix\n\t *\n\t * @var\tstring\n\t */\n\tprotected $suffix = '';\n\n\t/**\n\t * Total number of items\n\t *\n\t * @var\tint\n\t */\n\tprotected $total_rows = 0;\n\n\t/**\n\t * Number of links to show\n\t *\n\t * Relates to \"digit\" type links shown before/after\n\t * the currently viewed page.\n\t *\n\t * @var\tint\n\t */\n\tprotected $num_links = 2;\n\n\t/**\n\t * Items per page\n\t *\n\t * @var\tint\n\t */\n\tpublic $per_page = 10;\n\n\t/**\n\t * Current page\n\t *\n\t * @var\tint\n\t */\n\tpublic $cur_page = 0;\n\n\t/**\n\t * Use page numbers flag\n\t *\n\t * Whether to use actual page numbers instead of an offset\n\t *\n\t * @var\tbool\n\t */\n\tprotected $use_page_numbers = FALSE;\n\n\t/**\n\t * First link\n\t *\n\t * @var\tstring\n\t */\n\tprotected $first_link = '&lsaquo; First';\n\n\t/**\n\t * Next link\n\t *\n\t * @var\tstring\n\t */\n\tprotected $next_link = '&gt;';\n\n\t/**\n\t * Previous link\n\t *\n\t * @var\tstring\n\t */\n\tprotected $prev_link = '&lt;';\n\n\t/**\n\t * Last link\n\t *\n\t * @var\tstring\n\t */\n\tprotected $last_link = 'Last &rsaquo;';\n\n\t/**\n\t * URI Segment\n\t *\n\t * @var\tint\n\t */\n\tprotected $uri_segment = 0;\n\n\t/**\n\t * Full tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $full_tag_open = '';\n\n\t/**\n\t * Full tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $full_tag_close = '';\n\n\t/**\n\t * First tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $first_tag_open = '';\n\n\t/**\n\t * First tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $first_tag_close = '';\n\n\t/**\n\t * Last tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $last_tag_open = '';\n\n\t/**\n\t * Last tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $last_tag_close = '';\n\n\t/**\n\t * First URL\n\t *\n\t * An alternative URL for the first page\n\t *\n\t * @var\tstring\n\t */\n\tprotected $first_url = '';\n\n\t/**\n\t * Current tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $cur_tag_open = '<strong>';\n\n\t/**\n\t * Current tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $cur_tag_close = '</strong>';\n\n\t/**\n\t * Next tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $next_tag_open = '';\n\n\t/**\n\t * Next tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $next_tag_close = '';\n\n\t/**\n\t * Previous tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $prev_tag_open = '';\n\n\t/**\n\t * Previous tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $prev_tag_close = '';\n\n\t/**\n\t * Number tag open\n\t *\n\t * @var\tstring\n\t */\n\tprotected $num_tag_open = '';\n\n\t/**\n\t * Number tag close\n\t *\n\t * @var\tstring\n\t */\n\tprotected $num_tag_close = '';\n\n\t/**\n\t * Page query string flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $page_query_string = FALSE;\n\n\t/**\n\t * Query string segment\n\t *\n\t * @var\tstring\n\t */\n\tprotected $query_string_segment = 'per_page';\n\n\t/**\n\t * Display pages flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $display_pages = TRUE;\n\n\t/**\n\t * Attributes\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_attributes = '';\n\n\t/**\n\t * Link types\n\t *\n\t * \"rel\" attribute\n\t *\n\t * @see\tCI_Pagination::_attr_rel()\n\t * @var\tarray\n\t */\n\tprotected $_link_types = array();\n\n\t/**\n\t * Reuse query string flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $reuse_query_string = FALSE;\n\n\t/**\n\t * Use global URL suffix flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $use_global_url_suffix = FALSE;\n\n\t/**\n\t * Data page attribute\n\t *\n\t * @var\tstring\n\t */\n\tprotected $data_page_attr = 'data-ci-pagination-page';\n\n\t/**\n\t * CI Singleton\n\t *\n\t * @var\tobject\n\t */\n\tprotected $CI;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tarray\t$params\tInitialization parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct($params = array())\n\t{\n\t\t$this->CI =& get_instance();\n\t\t$this->CI->load->language('pagination');\n\t\tforeach (array('first_link', 'next_link', 'prev_link', 'last_link') as $key)\n\t\t{\n\t\t\tif (($val = $this->CI->lang->line('pagination_'.$key)) !== FALSE)\n\t\t\t{\n\t\t\t\t$this->$key = $val;\n\t\t\t}\n\t\t}\n\n\t\t// _parse_attributes(), called by initialize(), needs to run at least once\n\t\t// in order to enable \"rel\" attributes, and this triggers it.\n\t\tisset($params['attributes']) OR $params['attributes'] = array();\n\n\t\t$this->initialize($params);\n\t\tlog_message('info', 'Pagination Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize Preferences\n\t *\n\t * @param\tarray\t$params\tInitialization parameters\n\t * @return\tCI_Pagination\n\t */\n\tpublic function initialize(array $params = array())\n\t{\n\t\tif (isset($params['attributes']) && is_array($params['attributes']))\n\t\t{\n\t\t\t$this->_parse_attributes($params['attributes']);\n\t\t\tunset($params['attributes']);\n\t\t}\n\n\t\t// Deprecated legacy support for the anchor_class option\n\t\t// Should be removed in CI 3.1+\n\t\tif (isset($params['anchor_class']))\n\t\t{\n\t\t\tempty($params['anchor_class']) OR $attributes['class'] = $params['anchor_class'];\n\t\t\tunset($params['anchor_class']);\n\t\t}\n\n\t\tforeach ($params as $key => $val)\n\t\t{\n\t\t\tif (property_exists($this, $key))\n\t\t\t{\n\t\t\t\t$this->$key = $val;\n\t\t\t}\n\t\t}\n\n\t\tif ($this->CI->config->item('enable_query_strings') === TRUE)\n\t\t{\n\t\t\t$this->page_query_string = TRUE;\n\t\t}\n\n\t\tif ($this->use_global_url_suffix === TRUE)\n\t\t{\n\t\t\t$this->suffix = $this->CI->config->item('url_suffix');\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate the pagination links\n\t *\n\t * @return\tstring\n\t */\n\tpublic function create_links()\n\t{\n\t\t// If our item count or per-page total is zero there is no need to continue.\n\t\t// Note: DO NOT change the operator to === here!\n\t\tif ($this->total_rows == 0 OR $this->per_page == 0)\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\t// Calculate the total number of pages\n\t\t$num_pages = (int) ceil($this->total_rows / $this->per_page);\n\n\t\t// Is there only one page? Hm... nothing more to do here then.\n\t\tif ($num_pages === 1)\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\t// Check the user defined number of links.\n\t\t$this->num_links = (int) $this->num_links;\n\n\t\tif ($this->num_links < 0)\n\t\t{\n\t\t\tshow_error('Your number of links must be a non-negative number.');\n\t\t}\n\n\t\t// Keep any existing query string items.\n\t\t// Note: Has nothing to do with any other query string option.\n\t\tif ($this->reuse_query_string === TRUE)\n\t\t{\n\t\t\t$get = $this->CI->input->get();\n\n\t\t\t// Unset the control, method, old-school routing options\n\t\t\tunset($get['c'], $get['m'], $get[$this->query_string_segment]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$get = array();\n\t\t}\n\n\t\t// Put together our base and first URLs.\n\t\t// Note: DO NOT append to the properties as that would break successive calls\n\t\t$base_url = trim($this->base_url);\n\t\t$first_url = $this->first_url;\n\n\t\t$query_string = '';\n\t\t$query_string_sep = (strpos($base_url, '?') === FALSE) ? '?' : '&amp;';\n\n\t\t// Are we using query strings?\n\t\tif ($this->page_query_string === TRUE)\n\t\t{\n\t\t\t// If a custom first_url hasn't been specified, we'll create one from\n\t\t\t// the base_url, but without the page item.\n\t\t\tif ($first_url === '')\n\t\t\t{\n\t\t\t\t$first_url = $base_url;\n\n\t\t\t\t// If we saved any GET items earlier, make sure they're appended.\n\t\t\t\tif ( ! empty($get))\n\t\t\t\t{\n\t\t\t\t\t$first_url .= $query_string_sep.http_build_query($get);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the page segment to the end of the query string, where the\n\t\t\t// page number will be appended.\n\t\t\t$base_url .= $query_string_sep.http_build_query(array_merge($get, array($this->query_string_segment => '')));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Standard segment mode.\n\t\t\t// Generate our saved query string to append later after the page number.\n\t\t\tif ( ! empty($get))\n\t\t\t{\n\t\t\t\t$query_string = $query_string_sep.http_build_query($get);\n\t\t\t\t$this->suffix .= $query_string;\n\t\t\t}\n\n\t\t\t// Does the base_url have the query string in it?\n\t\t\t// If we're supposed to save it, remove it so we can append it later.\n\t\t\tif ($this->reuse_query_string === TRUE && ($base_query_pos = strpos($base_url, '?')) !== FALSE)\n\t\t\t{\n\t\t\t\t$base_url = substr($base_url, 0, $base_query_pos);\n\t\t\t}\n\n\t\t\tif ($first_url === '')\n\t\t\t{\n\t\t\t\t$first_url = $base_url.$query_string;\n\t\t\t}\n\n\t\t\t$base_url = rtrim($base_url, '/').'/';\n\t\t}\n\n\t\t// Determine the current page number.\n\t\t$base_page = ($this->use_page_numbers) ? 1 : 0;\n\n\t\t// Are we using query strings?\n\t\tif ($this->page_query_string === TRUE)\n\t\t{\n\t\t\t$this->cur_page = $this->CI->input->get($this->query_string_segment);\n\t\t}\n\t\telseif (empty($this->cur_page))\n\t\t{\n\t\t\t// Default to the last segment number if one hasn't been defined.\n\t\t\tif ($this->uri_segment === 0)\n\t\t\t{\n\t\t\t\t$this->uri_segment = count($this->CI->uri->segment_array());\n\t\t\t}\n\n\t\t\t$this->cur_page = $this->CI->uri->segment($this->uri_segment);\n\n\t\t\t// Remove any specified prefix/suffix from the segment.\n\t\t\tif ($this->prefix !== '' OR $this->suffix !== '')\n\t\t\t{\n\t\t\t\t$this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->cur_page = (string) $this->cur_page;\n\t\t}\n\n\t\t// If something isn't quite right, back to the default base page.\n\t\tif ( ! ctype_digit($this->cur_page) OR ($this->use_page_numbers && (int) $this->cur_page === 0))\n\t\t{\n\t\t\t$this->cur_page = $base_page;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Make sure we're using integers for comparisons later.\n\t\t\t$this->cur_page = (int) $this->cur_page;\n\t\t}\n\n\t\t// Is the page number beyond the result range?\n\t\t// If so, we show the last page.\n\t\tif ($this->use_page_numbers)\n\t\t{\n\t\t\tif ($this->cur_page > $num_pages)\n\t\t\t{\n\t\t\t\t$this->cur_page = $num_pages;\n\t\t\t}\n\t\t}\n\t\telseif ($this->cur_page > $this->total_rows)\n\t\t{\n\t\t\t$this->cur_page = ($num_pages - 1) * $this->per_page;\n\t\t}\n\n\t\t$uri_page_number = $this->cur_page;\n\n\t\t// If we're using offset instead of page numbers, convert it\n\t\t// to a page number, so we can generate the surrounding number links.\n\t\tif ( ! $this->use_page_numbers)\n\t\t{\n\t\t\t$this->cur_page = (int) floor(($this->cur_page/$this->per_page) + 1);\n\t\t}\n\n\t\t// Calculate the start and end numbers. These determine\n\t\t// which number to start and end the digit links with.\n\t\t$start\t= (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;\n\t\t$end\t= (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;\n\n\t\t// And here we go...\n\t\t$output = '';\n\n\t\t// Render the \"First\" link.\n\t\tif ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1 + ! $this->num_links))\n\t\t{\n\t\t\t// Take the general parameters, and squeeze this pagination-page attr in for JS frameworks.\n\t\t\t$attributes = sprintf('%s %s=\"%d\"', $this->_attributes, $this->data_page_attr, 1);\n\n\t\t\t$output .= $this->first_tag_open.'<a href=\"'.$first_url.'\"'.$attributes.$this->_attr_rel('start').'>'\n\t\t\t\t.$this->first_link.'</a>'.$this->first_tag_close;\n\t\t}\n\n\t\t// Render the \"Previous\" link.\n\t\tif ($this->prev_link !== FALSE && $this->cur_page !== 1)\n\t\t{\n\t\t\t$i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page;\n\n\t\t\t$attributes = sprintf('%s %s=\"%d\"', $this->_attributes, $this->data_page_attr, ($this->cur_page - 1));\n\n\t\t\tif ($i === $base_page)\n\t\t\t{\n\t\t\t\t// First page\n\t\t\t\t$output .= $this->prev_tag_open.'<a href=\"'.$first_url.'\"'.$attributes.$this->_attr_rel('prev').'>'\n\t\t\t\t\t.$this->prev_link.'</a>'.$this->prev_tag_close;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$append = $this->prefix.$i.$this->suffix;\n\t\t\t\t$output .= $this->prev_tag_open.'<a href=\"'.$base_url.$append.'\"'.$attributes.$this->_attr_rel('prev').'>'\n\t\t\t\t\t.$this->prev_link.'</a>'.$this->prev_tag_close;\n\t\t\t}\n\n\t\t}\n\n\t\t// Render the pages\n\t\tif ($this->display_pages !== FALSE)\n\t\t{\n\t\t\t// Write the digit links\n\t\t\tfor ($loop = $start - 1; $loop <= $end; $loop++)\n\t\t\t{\n\t\t\t\t$i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page;\n\n\t\t\t\t$attributes = sprintf('%s %s=\"%d\"', $this->_attributes, $this->data_page_attr, $loop);\n\n\t\t\t\tif ($i >= $base_page)\n\t\t\t\t{\n\t\t\t\t\tif ($this->cur_page === $loop)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Current page\n\t\t\t\t\t\t$output .= $this->cur_tag_open.$loop.$this->cur_tag_close;\n\t\t\t\t\t}\n\t\t\t\t\telseif ($i === $base_page)\n\t\t\t\t\t{\n\t\t\t\t\t\t// First page\n\t\t\t\t\t\t$output .= $this->num_tag_open.'<a href=\"'.$first_url.'\"'.$attributes.$this->_attr_rel('start').'>'\n\t\t\t\t\t\t\t.$loop.'</a>'.$this->num_tag_close;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$append = $this->prefix.$i.$this->suffix;\n\t\t\t\t\t\t$output .= $this->num_tag_open.'<a href=\"'.$base_url.$append.'\"'.$attributes.'>'\n\t\t\t\t\t\t\t.$loop.'</a>'.$this->num_tag_close;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Render the \"next\" link\n\t\tif ($this->next_link !== FALSE && $this->cur_page < $num_pages)\n\t\t{\n\t\t\t$i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page;\n\n\t\t\t$attributes = sprintf('%s %s=\"%d\"', $this->_attributes, $this->data_page_attr, $this->cur_page + 1);\n\n\t\t\t$output .= $this->next_tag_open.'<a href=\"'.$base_url.$this->prefix.$i.$this->suffix.'\"'.$attributes\n\t\t\t\t.$this->_attr_rel('next').'>'.$this->next_link.'</a>'.$this->next_tag_close;\n\t\t}\n\n\t\t// Render the \"Last\" link\n\t\tif ($this->last_link !== FALSE && ($this->cur_page + $this->num_links + ! $this->num_links) < $num_pages)\n\t\t{\n\t\t\t$i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page;\n\n\t\t\t$attributes = sprintf('%s %s=\"%d\"', $this->_attributes, $this->data_page_attr, $num_pages);\n\n\t\t\t$output .= $this->last_tag_open.'<a href=\"'.$base_url.$this->prefix.$i.$this->suffix.'\"'.$attributes.'>'\n\t\t\t\t.$this->last_link.'</a>'.$this->last_tag_close;\n\t\t}\n\n\t\t// Kill double slashes. Note: Sometimes we can end up with a double slash\n\t\t// in the penultimate link so we'll kill all double slashes.\n\t\t$output = preg_replace('#([^:\"])//+#', '\\\\1/', $output);\n\n\t\t// Add the wrapper HTML if exists\n\t\treturn $this->full_tag_open.$output.$this->full_tag_close;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse attributes\n\t *\n\t * @param\tarray\t$attributes\n\t * @return\tvoid\n\t */\n\tprotected function _parse_attributes($attributes)\n\t{\n\t\tisset($attributes['rel']) OR $attributes['rel'] = TRUE;\n\t\t$this->_link_types = ($attributes['rel'])\n\t\t\t? array('start' => 'start', 'prev' => 'prev', 'next' => 'next')\n\t\t\t: array();\n\t\tunset($attributes['rel']);\n\n\t\t$this->_attributes = '';\n\t\tforeach ($attributes as $key => $value)\n\t\t{\n\t\t\t$this->_attributes .= ' '.$key.'=\"'.$value.'\"';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add \"rel\" attribute\n\t *\n\t * @link\thttps://www.w3.org/TR/html5/links.html#linkTypes\n\t * @param\tstring\t$type\n\t * @return\tstring\n\t */\n\tprotected function _attr_rel($type)\n\t{\n\t\tif (isset($this->_link_types[$type]))\n\t\t{\n\t\t\tunset($this->_link_types[$type]);\n\t\t\treturn ' rel=\"'.$type.'\"';\n\t\t}\n\n\t\treturn '';\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Parser.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Parser Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tParser\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/parser.html\n */\nclass CI_Parser {\n\n\t/**\n\t * Left delimiter character for pseudo vars\n\t *\n\t * @var string\n\t */\n\tpublic $l_delim = '{';\n\n\t/**\n\t * Right delimiter character for pseudo vars\n\t *\n\t * @var string\n\t */\n\tpublic $r_delim = '}';\n\n\t/**\n\t * Reference to CodeIgniter instance\n\t *\n\t * @var object\n\t */\n\tprotected $CI;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->CI =& get_instance();\n\t\tlog_message('info', 'Parser Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse a template\n\t *\n\t * Parses pseudo-variables contained in the specified template view,\n\t * replacing them with the data in the second param\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function parse($template, $data, $return = FALSE)\n\t{\n\t\t$template = $this->CI->load->view($template, $data, TRUE);\n\n\t\treturn $this->_parse($template, $data, $return);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse a String\n\t *\n\t * Parses pseudo-variables contained in the specified string,\n\t * replacing them with the data in the second param\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function parse_string($template, $data, $return = FALSE)\n\t{\n\t\treturn $this->_parse($template, $data, $return);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse a template\n\t *\n\t * Parses pseudo-variables contained in the specified template,\n\t * replacing them with the data in the second param\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tprotected function _parse($template, $data, $return = FALSE)\n\t{\n\t\tif ($template === '')\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$replace = array();\n\t\tforeach ($data as $key => $val)\n\t\t{\n\t\t\t$replace = array_merge(\n\t\t\t\t$replace,\n\t\t\t\tis_array($val)\n\t\t\t\t\t? $this->_parse_pair($key, $val, $template)\n\t\t\t\t\t: $this->_parse_single($key, (string) $val, $template)\n\t\t\t);\n\t\t}\n\n\t\tunset($data);\n\t\t$template = strtr($template, $replace);\n\n\t\tif ($return === FALSE)\n\t\t{\n\t\t\t$this->CI->output->append_output($template);\n\t\t}\n\n\t\treturn $template;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the left/right variable delimiters\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function set_delimiters($l = '{', $r = '}')\n\t{\n\t\t$this->l_delim = $l;\n\t\t$this->r_delim = $r;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse a single key/value\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _parse_single($key, $val, $string)\n\t{\n\t\treturn array($this->l_delim.$key.$this->r_delim => (string) $val);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse a tag pair\n\t *\n\t * Parses tag pairs: {some_tag} string... {/some_tag}\n\t *\n\t * @param\tstring\n\t * @param\tarray\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _parse_pair($variable, $data, $string)\n\t{\n\t\t$replace = array();\n\t\tpreg_match_all(\n\t\t\t'#'.preg_quote($this->l_delim.$variable.$this->r_delim).'(.+?)'.preg_quote($this->l_delim.'/'.$variable.$this->r_delim).'#s',\n\t\t\t$string,\n\t\t\t$matches,\n\t\t\tPREG_SET_ORDER\n\t\t);\n\n\t\tforeach ($matches as $match)\n\t\t{\n\t\t\t$str = '';\n\t\t\tforeach ($data as $row)\n\t\t\t{\n\t\t\t\t$temp = array();\n\t\t\t\tforeach ($row as $key => $val)\n\t\t\t\t{\n\t\t\t\t\tif (is_array($val))\n\t\t\t\t\t{\n\t\t\t\t\t\t$pair = $this->_parse_pair($key, $val, $match[1]);\n\t\t\t\t\t\tif ( ! empty($pair))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$temp = array_merge($temp, $pair);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$temp[$this->l_delim.$key.$this->r_delim] = $val;\n\t\t\t\t}\n\n\t\t\t\t$str .= strtr($match[1], $temp);\n\t\t\t}\n\n\t\t\t$replace[$match[0]] = $str;\n\t\t}\n\n\t\treturn $replace;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Profiler.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Profiler Class\n *\n * This class enables you to display benchmark, query, and other data\n * in order to help with debugging and optimization.\n *\n * Note: At some point it would be good to move all the HTML in this class\n * into a set of template files in order to allow customization.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tLibraries\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/general/profiling.html\n */\nclass CI_Profiler {\n\n\t/**\n\t * List of profiler sections available to show\n\t *\n\t * @var array\n\t */\n\tprotected $_available_sections = array(\n\t\t'benchmarks',\n\t\t'get',\n\t\t'memory_usage',\n\t\t'post',\n\t\t'uri_string',\n\t\t'controller_info',\n\t\t'queries',\n\t\t'http_headers',\n\t\t'session_data',\n\t\t'config'\n\t);\n\n\t/**\n\t * Number of queries to show before making the additional queries togglable\n\t *\n\t * @var int\n\t */\n\tprotected $_query_toggle_count = 25;\n\n\t/**\n\t * Reference to the CodeIgniter singleton\n\t *\n\t * @var object\n\t */\n\tprotected $CI;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * Initialize Profiler\n\t *\n\t * @param\tarray\t$config\tParameters\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\t$this->CI =& get_instance();\n\t\t$this->CI->load->language('profiler');\n\n\t\t// default all sections to display\n\t\tforeach ($this->_available_sections as $section)\n\t\t{\n\t\t\tif ( ! isset($config[$section]))\n\t\t\t{\n\t\t\t\t$this->{'_compile_'.$section} = TRUE;\n\t\t\t}\n\t\t}\n\n\t\t$this->set_sections($config);\n\t\tlog_message('info', 'Profiler Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Sections\n\t *\n\t * Sets the private _compile_* properties to enable/disable Profiler sections\n\t *\n\t * @param\tmixed\t$config\n\t * @return\tvoid\n\t */\n\tpublic function set_sections($config)\n\t{\n\t\tif (isset($config['query_toggle_count']))\n\t\t{\n\t\t\t$this->_query_toggle_count = (int) $config['query_toggle_count'];\n\t\t\tunset($config['query_toggle_count']);\n\t\t}\n\n\t\tforeach ($config as $method => $enable)\n\t\t{\n\t\t\tif (in_array($method, $this->_available_sections))\n\t\t\t{\n\t\t\t\t$this->{'_compile_'.$method} = ($enable !== FALSE);\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Auto Profiler\n\t *\n\t * This function cycles through the entire array of mark points and\n\t * matches any two points that are named identically (ending in \"_start\"\n\t * and \"_end\" respectively).  It then compiles the execution times for\n\t * all points and returns it as an array\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _compile_benchmarks()\n\t{\n\t\t$profile = array();\n\t\tforeach ($this->CI->benchmark->marker as $key => $val)\n\t\t{\n\t\t\t// We match the \"end\" marker so that the list ends\n\t\t\t// up in the order that it was defined\n\t\t\tif (preg_match('/(.+?)_end$/i', $key, $match)\n\t\t\t\t&& isset($this->CI->benchmark->marker[$match[1].'_end'], $this->CI->benchmark->marker[$match[1].'_start']))\n\t\t\t{\n\t\t\t\t$profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key);\n\t\t\t}\n\t\t}\n\n\t\t// Build a table containing the profile data.\n\t\t// Note: At some point we should turn this into a template that can\n\t\t// be modified. We also might want to make this data available to be logged\n\n\t\t$output = \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_benchmarks\" style=\"border:1px solid #900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#900;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_benchmarks').\"&nbsp;&nbsp;</legend>\"\n\t\t\t.\"\\n\\n\\n<table style=\\\"width:100%;\\\">\\n\";\n\n\t\tforeach ($profile as $key => $val)\n\t\t{\n\t\t\t$key = ucwords(str_replace(array('_', '-'), ' ', $key));\n\t\t\t$output .= '<tr><td style=\"padding:5px;width:50%;color:#000;font-weight:bold;background-color:#ddd;\">'\n\t\t\t\t\t.$key.'&nbsp;&nbsp;</td><td style=\"padding:5px;width:50%;color:#900;font-weight:normal;background-color:#ddd;\">'\n\t\t\t\t\t.$val.\"</td></tr>\\n\";\n\t\t}\n\n\t\treturn $output.\"</table>\\n</fieldset>\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile Queries\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_queries()\n\t{\n\t\t$dbs = array();\n\n\t\t// Let's determine which databases are currently connected to\n\t\tforeach (get_object_vars($this->CI) as $name => $cobject)\n\t\t{\n\t\t\tif (is_object($cobject))\n\t\t\t{\n\t\t\t\tif ($cobject instanceof CI_DB)\n\t\t\t\t{\n\t\t\t\t\t$dbs[get_class($this->CI).':$'.$name] = $cobject;\n\t\t\t\t}\n\t\t\t\telseif ($cobject instanceof CI_Model)\n\t\t\t\t{\n\t\t\t\t\tforeach (get_object_vars($cobject) as $mname => $mobject)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ($mobject instanceof CI_DB)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$dbs[get_class($cobject).':$'.$mname] = $mobject;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (count($dbs) === 0)\n\t\t{\n\t\t\treturn \"\\n\\n\"\n\t\t\t\t.'<fieldset id=\"ci_profiler_queries\" style=\"border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t\t.\"\\n\"\n\t\t\t\t.'<legend style=\"color:#0000FF;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').'&nbsp;&nbsp;</legend>'\n\t\t\t\t.\"\\n\\n\\n<table style=\\\"border:none; width:100%;\\\">\\n\"\n\t\t\t\t.'<tr><td style=\"width:100%;color:#0000FF;font-weight:normal;background-color:#eee;padding:5px;\">'\n\t\t\t\t.$this->CI->lang->line('profiler_no_db')\n\t\t\t\t.\"</td></tr>\\n</table>\\n</fieldset>\";\n\t\t}\n\n\t\t// Load the text helper so we can highlight the SQL\n\t\t$this->CI->load->helper('text');\n\n\t\t// Key words we want bolded\n\t\t$highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT&nbsp;JOIN', 'ORDER&nbsp;BY', 'GROUP&nbsp;BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR&nbsp;', 'HAVING', 'OFFSET', 'NOT&nbsp;IN', 'IN', 'LIKE', 'NOT&nbsp;LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')');\n\n\t\t$output  = \"\\n\\n\";\n\t\t$count = 0;\n\n\t\tforeach ($dbs as $name => $db)\n\t\t{\n\t\t\t$hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : '';\n\t\t\t$total_time = number_format(array_sum($db->query_times), 4).' '.$this->CI->lang->line('profiler_seconds');\n\n\t\t\t$show_hide_js = '(<span style=\"cursor: pointer;\" onclick=\"var s=document.getElementById(\\'ci_profiler_queries_db_'.$count.'\\').style;s.display=s.display==\\'none\\'?\\'\\':\\'none\\';this.innerHTML=this.innerHTML==\\''.$this->CI->lang->line('profiler_section_hide').'\\'?\\''.$this->CI->lang->line('profiler_section_show').'\\':\\''.$this->CI->lang->line('profiler_section_hide').'\\';\">'.$this->CI->lang->line('profiler_section_hide').'</span>)';\n\n\t\t\tif ($hide_queries !== '')\n\t\t\t{\n\t\t\t\t$show_hide_js = '(<span style=\"cursor: pointer;\" onclick=\"var s=document.getElementById(\\'ci_profiler_queries_db_'.$count.'\\').style;s.display=s.display==\\'none\\'?\\'\\':\\'none\\';this.innerHTML=this.innerHTML==\\''.$this->CI->lang->line('profiler_section_show').'\\'?\\''.$this->CI->lang->line('profiler_section_hide').'\\':\\''.$this->CI->lang->line('profiler_section_show').'\\';\">'.$this->CI->lang->line('profiler_section_show').'</span>)';\n\t\t\t}\n\n\t\t\t$output .= '<fieldset style=\"border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t\t.\"\\n\"\n\t\t\t\t.'<legend style=\"color:#0000FF;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_database')\n\t\t\t\t.':&nbsp; '.$db->database.' ('.$name.')&nbsp;&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries')\n\t\t\t\t.': '.count($db->queries).' ('.$total_time.')&nbsp;&nbsp;'.$show_hide_js.\"</legend>\\n\\n\\n\"\n\t\t\t\t.'<table style=\"width:100%;'.$hide_queries.'\" id=\"ci_profiler_queries_db_'.$count.\"\\\">\\n\";\n\n\t\t\tif (count($db->queries) === 0)\n\t\t\t{\n\t\t\t\t$output .= '<tr><td style=\"width:100%;color:#0000FF;font-weight:normal;background-color:#eee;padding:5px;\">'\n\t\t\t\t\t\t.$this->CI->lang->line('profiler_no_queries').\"</td></tr>\\n\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tforeach ($db->queries as $key => $val)\n\t\t\t\t{\n\t\t\t\t\t$time = number_format($db->query_times[$key], 4);\n\t\t\t\t\t$val = highlight_code($val);\n\n\t\t\t\t\tforeach ($highlight as $bold)\n\t\t\t\t\t{\n\t\t\t\t\t\t$val = str_replace($bold, '<strong>'.$bold.'</strong>', $val);\n\t\t\t\t\t}\n\n\t\t\t\t\t$output .= '<tr><td style=\"padding:5px;vertical-align:top;width:1%;color:#900;font-weight:normal;background-color:#ddd;\">'\n\t\t\t\t\t\t\t.$time.'&nbsp;&nbsp;</td><td style=\"padding:5px;color:#000;font-weight:normal;background-color:#ddd;\">'\n\t\t\t\t\t\t\t.$val.\"</td></tr>\\n\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$output .= \"</table>\\n</fieldset>\";\n\t\t\t$count++;\n\t\t}\n\n\t\treturn $output;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile $_GET Data\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_get()\n\t{\n\t\t$output = \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_get\" style=\"border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#cd6e00;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_get_data').\"&nbsp;&nbsp;</legend>\\n\";\n\n\t\tif (count($_GET) === 0)\n\t\t{\n\t\t\t$output .= '<div style=\"color:#cd6e00;font-weight:normal;padding:4px 0 4px 0;\">'.$this->CI->lang->line('profiler_no_get').'</div>';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$output .= \"\\n\\n<table style=\\\"width:100%;border:none;\\\">\\n\";\n\n\t\t\tforeach ($_GET as $key => $val)\n\t\t\t{\n\t\t\t\tis_int($key) OR $key = \"'\".htmlspecialchars($key, ENT_QUOTES, config_item('charset')).\"'\";\n\t\t\t\t$val = (is_array($val) OR is_object($val))\n\t\t\t\t\t? '<pre>'.htmlspecialchars(print_r($val, TRUE), ENT_QUOTES, config_item('charset')).'</pre>'\n\t\t\t\t\t: htmlspecialchars($val, ENT_QUOTES, config_item('charset'));\n\n\t\t\t\t$output .= '<tr><td style=\"width:50%;color:#000;background-color:#ddd;padding:5px;\">&#36;_GET['\n\t\t\t\t\t.$key.']&nbsp;&nbsp; </td><td style=\"width:50%;padding:5px;color:#cd6e00;font-weight:normal;background-color:#ddd;\">'\n\t\t\t\t\t.$val.\"</td></tr>\\n\";\n\t\t\t}\n\n\t\t\t$output .= \"</table>\\n\";\n\t\t}\n\n\t\treturn $output.'</fieldset>';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile $_POST Data\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_post()\n\t{\n\t\t$output = \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_post\" style=\"border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#009900;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_post_data').\"&nbsp;&nbsp;</legend>\\n\";\n\n\t\tif (count($_POST) === 0 && count($_FILES) === 0)\n\t\t{\n\t\t\t$output .= '<div style=\"color:#009900;font-weight:normal;padding:4px 0 4px 0;\">'.$this->CI->lang->line('profiler_no_post').'</div>';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$output .= \"\\n\\n<table style=\\\"width:100%;\\\">\\n\";\n\n\t\t\tforeach ($_POST as $key => $val)\n\t\t\t{\n\t\t\t\tis_int($key) OR $key = \"'\".htmlspecialchars($key, ENT_QUOTES, config_item('charset')).\"'\";\n\t\t\t\t$val = (is_array($val) OR is_object($val))\n\t\t\t\t\t? '<pre>'.htmlspecialchars(print_r($val, TRUE), ENT_QUOTES, config_item('charset')).'</pre>'\n\t\t\t\t\t: htmlspecialchars($val, ENT_QUOTES, config_item('charset'));\n\n\t\t\t\t$output .= '<tr><td style=\"width:50%;padding:5px;color:#000;background-color:#ddd;\">&#36;_POST['\n\t\t\t\t\t.$key.']&nbsp;&nbsp; </td><td style=\"width:50%;padding:5px;color:#009900;font-weight:normal;background-color:#ddd;\">'\n\t\t\t\t\t.$val.\"</td></tr>\\n\";\n\t\t\t}\n\n\t\t\tforeach ($_FILES as $key => $val)\n\t\t\t{\n\t\t\t\tis_int($key) OR $key = \"'\".htmlspecialchars($key, ENT_QUOTES, config_item('charset')).\"'\";\n\t\t\t\t$val = (is_array($val) OR is_object($val))\n\t\t\t\t\t? '<pre>'.htmlspecialchars(print_r($val, TRUE), ENT_QUOTES, config_item('charset')).'</pre>'\n\t\t\t\t\t: htmlspecialchars($val, ENT_QUOTES, config_item('charset'));\n\n\t\t\t\t$output .= '<tr><td style=\"width:50%;padding:5px;color:#000;background-color:#ddd;\">&#36;_FILES['\n\t\t\t\t\t.$key.']&nbsp;&nbsp; </td><td style=\"width:50%;padding:5px;color:#009900;font-weight:normal;background-color:#ddd;\">'\n\t\t\t\t\t.$val.\"</td></tr>\\n\";\n\t\t\t}\n\n\t\t\t$output .= \"</table>\\n\";\n\t\t}\n\n\t\treturn $output.'</fieldset>';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show query string\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_uri_string()\n\t{\n\t\treturn \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_uri_string\" style=\"border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#000;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_uri_string').\"&nbsp;&nbsp;</legend>\\n\"\n\t\t\t.'<div style=\"color:#000;font-weight:normal;padding:4px 0 4px 0;\">'\n\t\t\t.($this->CI->uri->uri_string === '' ? $this->CI->lang->line('profiler_no_uri') : $this->CI->uri->uri_string)\n\t\t\t.'</div></fieldset>';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show the controller and function that were called\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_controller_info()\n\t{\n\t\treturn \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_controller_info\" style=\"border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#995300;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_controller_info').\"&nbsp;&nbsp;</legend>\\n\"\n\t\t\t.'<div style=\"color:#995300;font-weight:normal;padding:4px 0 4px 0;\">'.$this->CI->router->class.'/'.$this->CI->router->method\n\t\t\t.'</div></fieldset>';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile memory usage\n\t *\n\t * Display total used memory\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_memory_usage()\n\t{\n\t\treturn \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_memory_usage\" style=\"border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#5a0099;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_memory_usage').\"&nbsp;&nbsp;</legend>\\n\"\n\t\t\t.'<div style=\"color:#5a0099;font-weight:normal;padding:4px 0 4px 0;\">'\n\t\t\t.(($usage = memory_get_usage()) != '' ? number_format($usage).' bytes' : $this->CI->lang->line('profiler_no_memory'))\n\t\t\t.'</div></fieldset>';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile header information\n\t *\n\t * Lists HTTP headers\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_http_headers()\n\t{\n\t\t$output = \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_http_headers\" style=\"border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#000;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_headers')\n\t\t\t.'&nbsp;&nbsp;(<span style=\"cursor: pointer;\" onclick=\"var s=document.getElementById(\\'ci_profiler_httpheaders_table\\').style;s.display=s.display==\\'none\\'?\\'\\':\\'none\\';this.innerHTML=this.innerHTML==\\''.$this->CI->lang->line('profiler_section_show').'\\'?\\''.$this->CI->lang->line('profiler_section_hide').'\\':\\''.$this->CI->lang->line('profiler_section_show').'\\';\">'.$this->CI->lang->line('profiler_section_show').\"</span>)</legend>\\n\\n\\n\"\n\t\t\t.'<table style=\"width:100%;display:none;\" id=\"ci_profiler_httpheaders_table\">'.\"\\n\";\n\n\t\tforeach (array('HTTP_ACCEPT', 'HTTP_USER_AGENT', 'HTTP_CONNECTION', 'SERVER_PORT', 'SERVER_NAME', 'REMOTE_ADDR', 'SERVER_SOFTWARE', 'HTTP_ACCEPT_LANGUAGE', 'SCRIPT_NAME', 'REQUEST_METHOD',' HTTP_HOST', 'REMOTE_HOST', 'CONTENT_TYPE', 'SERVER_PROTOCOL', 'QUERY_STRING', 'HTTP_ACCEPT_ENCODING', 'HTTP_X_FORWARDED_FOR', 'HTTP_DNT') as $header)\n\t\t{\n\t\t\t$val = isset($_SERVER[$header]) ? htmlspecialchars($_SERVER[$header], ENT_QUOTES, config_item('charset')) : '';\n\t\t\t$output .= '<tr><td style=\"vertical-align:top;width:50%;padding:5px;color:#900;background-color:#ddd;\">'\n\t\t\t\t.$header.'&nbsp;&nbsp;</td><td style=\"width:50%;padding:5px;color:#000;background-color:#ddd;\">'.$val.\"</td></tr>\\n\";\n\t\t}\n\n\t\treturn $output.\"</table>\\n</fieldset>\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile config information\n\t *\n\t * Lists developer config variables\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _compile_config()\n\t{\n\t\t$output = \"\\n\\n\"\n\t\t\t.'<fieldset id=\"ci_profiler_config\" style=\"border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.\"\\n\"\n\t\t\t.'<legend style=\"color:#000;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_config').'&nbsp;&nbsp;(<span style=\"cursor: pointer;\" onclick=\"var s=document.getElementById(\\'ci_profiler_config_table\\').style;s.display=s.display==\\'none\\'?\\'\\':\\'none\\';this.innerHTML=this.innerHTML==\\''.$this->CI->lang->line('profiler_section_show').'\\'?\\''.$this->CI->lang->line('profiler_section_hide').'\\':\\''.$this->CI->lang->line('profiler_section_show').'\\';\">'.$this->CI->lang->line('profiler_section_show').\"</span>)</legend>\\n\\n\\n\"\n\t\t\t.'<table style=\"width:100%;display:none;\" id=\"ci_profiler_config_table\">'.\"\\n\";\n\n\t\tforeach ($this->CI->config->config as $config => $val)\n\t\t{\n\t\t\t$pre       = '';\n\t\t\t$pre_close = '';\n\n\t\t\tif (is_array($val) OR is_object($val))\n\t\t\t{\n\t\t\t\t$val = print_r($val, TRUE);\n\n\t\t\t\t$pre       = '<pre>' ;\n\t\t\t\t$pre_close = '</pre>';\n\t\t\t}\n\n\t\t\t$output .= '<tr><td style=\"padding:5px;vertical-align:top;color:#900;background-color:#ddd;\">'\n\t\t\t\t.$config.'&nbsp;&nbsp;</td><td style=\"padding:5px;color:#000;background-color:#ddd;\">'.$pre.htmlspecialchars((string) $val, ENT_QUOTES, config_item('charset')).$pre_close.\"</td></tr>\\n\";\n\t\t}\n\n\t\treturn $output.\"</table>\\n</fieldset>\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile session userdata\n\t *\n\t * @return \tstring\n\t */\n\tprotected function _compile_session_data()\n\t{\n\t\tif ( ! isset($this->CI->session))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t$output = '<fieldset id=\"ci_profiler_csession\" style=\"border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee;\">'\n\t\t\t.'<legend style=\"color:#000;\">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_session_data').'&nbsp;&nbsp;(<span style=\"cursor: pointer;\" onclick=\"var s=document.getElementById(\\'ci_profiler_session_data\\').style;s.display=s.display==\\'none\\'?\\'\\':\\'none\\';this.innerHTML=this.innerHTML==\\''.$this->CI->lang->line('profiler_section_show').'\\'?\\''.$this->CI->lang->line('profiler_section_hide').'\\':\\''.$this->CI->lang->line('profiler_section_show').'\\';\">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>'\n\t\t\t.'<table style=\"width:100%;display:none;\" id=\"ci_profiler_session_data\">';\n\n\t\tforeach ($this->CI->session->userdata() as $key => $val)\n\t\t{\n\t\t\t$pre       = '';\n\t\t\t$pre_close = '';\n\n\t\t\tif (is_array($val) OR is_object($val))\n\t\t\t{\n\t\t\t\t$val = print_r($val, TRUE);\n\n\t\t\t\t$pre       = '<pre>' ;\n\t\t\t\t$pre_close = '</pre>';\n\t\t\t}\n\n\t\t\t$output .= '<tr><td style=\"padding:5px;vertical-align:top;color:#900;background-color:#ddd;\">'\n\t\t\t\t.$key.'&nbsp;&nbsp;</td><td style=\"padding:5px;color:#000;background-color:#ddd;\">'.$pre.htmlspecialchars((string) $val, ENT_QUOTES, config_item('charset')).$pre_close.\"</td></tr>\\n\";\n\t\t}\n\n\t\treturn $output.\"</table>\\n</fieldset>\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Run the Profiler\n\t *\n\t * @return\tstring\n\t */\n\tpublic function run()\n\t{\n\t\t$output = '<div id=\"codeigniter_profiler\" style=\"clear:both;background-color:#fff;padding:10px;\">';\n\t\t$fields_displayed = 0;\n\n\t\tforeach ($this->_available_sections as $section)\n\t\t{\n\t\t\tif ($this->{'_compile_'.$section} !== FALSE)\n\t\t\t{\n\t\t\t\t$func = '_compile_'.$section;\n\t\t\t\t$output .= $this->{$func}();\n\t\t\t\t$fields_displayed++;\n\t\t\t}\n\t\t}\n\n\t\tif ($fields_displayed === 0)\n\t\t{\n\t\t\t$output .= '<p style=\"border:1px solid #5a0099;padding:10px;margin:20px 0;background-color:#eee;\">'\n\t\t\t\t.$this->CI->lang->line('profiler_no_profiles').'</p>';\n\t\t}\n\n\t\treturn $output.'</div>';\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Session/CI_Session_driver_interface.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CI_Session_driver_interface\n *\n * A compatibility typeless SessionHandlerInterface alias\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\ninterface CI_Session_driver_interface {\n\n\tpublic function open($save_path, $name);\n\tpublic function close();\n\tpublic function read($session_id);\n\tpublic function write($session_id, $session_data);\n\tpublic function destroy($session_id);\n\tpublic function gc($maxlifetime);\n\tpublic function updateTimestamp($session_id, $data);\n\tpublic function validateId($session_id);\n}\n"
  },
  {
    "path": "system/libraries/Session/OldSessionWrapper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * OldSessionWrapper\n *\n * PHP 8 Session handler compatibility wrapper, pre-PHP8 version\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_SessionWrapper implements SessionHandlerInterface, SessionUpdateTimestampHandlerInterface {\n\n\tprotected $driver;\n\n\tpublic function __construct(CI_Session_driver_interface $driver)\n\t{\n\t\t$this->driver = $driver;\n\t}\n\n\tpublic function open($save_path, $name)\n\t{\n\t\treturn $this->driver->open($save_path, $name);\n\t}\n\n\tpublic function close()\n\t{\n\t\treturn $this->driver->close();\n\t}\n\n\tpublic function read($id)\n\t{\n\t\treturn $this->driver->read($id);\n\t}\n\n\tpublic function write($id, $data)\n\t{\n\t\treturn $this->driver->write($id, $data);\n\t}\n\n\tpublic function destroy($id)\n\t{\n\t\treturn $this->driver->destroy($id);\n\t}\n\n\tpublic function gc($maxlifetime)\n\t{\n\t\treturn $this->driver->gc($maxlifetime);\n\t}\n\n\tpublic function updateTimestamp($id, $data)\n\t{\n\t\treturn $this->driver->updateTimestamp($id, $data);\n\t}\n\n\tpublic function validateId($id)\n\t{\n\t\treturn $this->driver->validateId($id);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Session/PHP8SessionWrapper.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * PHP8SessionWrapper\n *\n * PHP 8 Session handler compatibility wrapper\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_SessionWrapper implements SessionHandlerInterface, SessionUpdateTimestampHandlerInterface {\n\n\tprotected CI_Session_driver_interface $driver;\n\n\tpublic function __construct(CI_Session_driver_interface $driver)\n\t{\n\t\t$this->driver = $driver;\n\t}\n\n\tpublic function open(string $save_path, string $name): bool\n\t{\n\t\treturn $this->driver->open($save_path, $name);\n\t}\n\n\tpublic function close(): bool\n\t{\n\t\treturn $this->driver->close();\n\t}\n\n\t#[\\ReturnTypeWillChange]\n\tpublic function read(string $id): mixed\n\t{\n\t\treturn $this->driver->read($id);\n\t}\n\n\tpublic function write(string $id, string $data): bool\n\t{\n\t\treturn $this->driver->write($id, $data);\n\t}\n\n\tpublic function destroy(string $id): bool\n\t{\n\t\treturn $this->driver->destroy($id);\n\t}\n\n\t#[\\ReturnTypeWillChange]\n\tpublic function gc(int $maxlifetime): mixed\n\t{\n\t\treturn $this->driver->gc($maxlifetime);\n\t}\n\n\tpublic function updateTimestamp(string $id, string$data): bool\n\t{\n\t\treturn $this->driver->updateTimestamp($id, $data);\n\t}\n\n\tpublic function validateId(string $id): bool\n\t{\n\t\treturn $this->driver->validateId($id);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Session/Session.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 2.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Session Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\t\tAndrey Andreev\n * @link\t\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_Session {\n\n\t/**\n\t * Userdata array\n\t *\n\t * Just a reference to $_SESSION, for BC purposes.\n\t */\n\tpublic $userdata;\n\n\tprotected $_driver = 'files';\n\tprotected $_config;\n\tprotected $_sid_regexp;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(array $params = array())\n\t{\n\t\t// No sessions under CLI\n\t\tif (is_cli())\n\t\t{\n\t\t\tlog_message('debug', 'Session: Initialization under CLI aborted.');\n\t\t\treturn;\n\t\t}\n\t\telseif ((bool) ini_get('session.auto_start'))\n\t\t{\n\t\t\tlog_message('error', 'Session: session.auto_start is enabled in php.ini. Aborting.');\n\t\t\treturn;\n\t\t}\n\t\telseif ( ! empty($params['driver']))\n\t\t{\n\t\t\t$this->_driver = $params['driver'];\n\t\t\tunset($params['driver']);\n\t\t}\n\t\telseif ($driver = config_item('sess_driver'))\n\t\t{\n\t\t\t$this->_driver = $driver;\n\t\t}\n\t\t// Note: BC workaround\n\t\telseif (config_item('sess_use_database'))\n\t\t{\n\t\t\tlog_message('debug', 'Session: \"sess_driver\" is empty; using BC fallback to \"sess_use_database\".');\n\t\t\t$this->_driver = 'database';\n\t\t}\n\n\t\t$class = $this->_ci_load_classes($this->_driver);\n\n\t\t// Configuration ...\n\t\t$this->_configure($params);\n\t\t$this->_config['_sid_regexp'] = $this->_sid_regexp;\n\n\t\t$class   = new $class($this->_config);\n\t\t$wrapper = new CI_SessionWrapper($class);\n\t\tif (is_php('5.4'))\n\t\t{\n\t\t\tsession_set_save_handler($wrapper, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsession_set_save_handler(\n\t\t\t\tarray($wrapper, 'open'),\n\t\t\t\tarray($wrapper, 'close'),\n\t\t\t\tarray($wrapper, 'read'),\n\t\t\t\tarray($wrapper, 'write'),\n\t\t\t\tarray($wrapper, 'destroy'),\n\t\t\t\tarray($wrapper, 'gc')\n\t\t\t);\n\n\t\t\tregister_shutdown_function('session_write_close');\n\t\t}\n\n\t\t// Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers\n\t\tif (isset($_COOKIE[$this->_config['cookie_name']])\n\t\t\t&& (\n\t\t\t\t! is_string($_COOKIE[$this->_config['cookie_name']])\n\t\t\t\tOR ! preg_match('#\\A'.$this->_sid_regexp.'\\z#', $_COOKIE[$this->_config['cookie_name']])\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tunset($_COOKIE[$this->_config['cookie_name']]);\n\t\t}\n\n\t\tsession_start();\n\n\t\t// Is session ID auto-regeneration configured? (ignoring ajax requests)\n\t\tif ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) OR strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')\n\t\t\t&& ($regenerate_time = config_item('sess_time_to_update')) > 0\n\t\t)\n\t\t{\n\t\t\tif ( ! isset($_SESSION['__ci_last_regenerate']))\n\t\t\t{\n\t\t\t\t$_SESSION['__ci_last_regenerate'] = time();\n\t\t\t}\n\t\t\telseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time))\n\t\t\t{\n\t\t\t\t$this->sess_regenerate((bool) config_item('sess_regenerate_destroy'));\n\t\t\t}\n\t\t}\n\t\t// Another work-around ... PHP doesn't seem to send the session cookie\n\t\t// unless it is being currently created or regenerated\n\t\telseif (isset($_COOKIE[$this->_config['cookie_name']]) && $_COOKIE[$this->_config['cookie_name']] === session_id())\n\t\t{\n\t\t\t$expires = empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime'];\n\t\t\tif (is_php('7.3'))\n\t\t\t{\n\t\t\t\tsetcookie(\n\t\t\t\t\t$this->_config['cookie_name'],\n\t\t\t\t\tsession_id(),\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'expires' => $expires,\n\t\t\t\t\t\t'path' => $this->_config['cookie_path'],\n\t\t\t\t\t\t'domain' => $this->_config['cookie_domain'],\n\t\t\t\t\t\t'secure' => $this->_config['cookie_secure'],\n\t\t\t\t\t\t'httponly' => TRUE,\n\t\t\t\t\t\t'samesite' => $this->_config['cookie_samesite']\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$header = 'Set-Cookie: '.$this->_config['cookie_name'].'='.session_id();\n\t\t\t\t$header .= empty($expires) ? '' : '; Expires='.gmdate('D, d-M-Y H:i:s T', $expires).'; Max-Age='.$this->_config['cookie_lifetime'];\n\t\t\t\t$header .= '; Path='.$this->_config['cookie_path'];\n\t\t\t\t$header .= ($this->_config['cookie_domain'] !== '' ? '; Domain='.$this->_config['cookie_domain'] : '');\n\t\t\t\t$header .= ($this->_config['cookie_secure'] ? '; Secure' : '').'; HttpOnly; SameSite='.$this->_config['cookie_samesite'];\n\t\t\t\theader($header);\n\t\t\t}\n\n\t\t\tif ( ! $this->_config['cookie_secure'] && $this->_config['cookie_samesite'] === 'None')\n\t\t\t{\n\t\t\t\tlog_message('error', \"Session: '\".$this->_config['cookie_name'].\"' cookie sent with SameSite=None, but without Secure attribute.'\");\n\t\t\t}\n\t\t}\n\n\t\t$this->_ci_init_vars();\n\n\t\tlog_message('info', \"Session: Class initialized using '\".$this->_driver.\"' driver.\");\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * CI Load Classes\n\t *\n\t * An internal method to load all possible dependency and extension\n\t * classes. It kind of emulates the CI_Driver library, but is\n\t * self-sufficient.\n\t *\n\t * @param\tstring\t$driver\tDriver name\n\t * @return\tstring\tDriver class name\n\t */\n\tprotected function _ci_load_classes($driver)\n\t{\n\t\t// PHP 5.4 compatibility\n\t\tinterface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'libraries/Session/SessionHandlerInterface.php');\n\t\t// PHP 7 compatibility\n\t\tinterface_exists('SessionUpdateTimestampHandlerInterface', FALSE) OR require_once(BASEPATH.'libraries/Session/SessionUpdateTimestampHandlerInterface.php');\n\n\t\trequire_once(BASEPATH.'libraries/Session/CI_Session_driver_interface.php');\n\t\t$wrapper = is_php('8.0') ? 'PHP8SessionWrapper' : 'OldSessionWrapper';\n\t\trequire_once(BASEPATH.'libraries/Session/'.$wrapper.'.php');\n\n\t\t$prefix = config_item('subclass_prefix');\n\n\t\tif ( ! class_exists('CI_Session_driver', FALSE))\n\t\t{\n\t\t\trequire_once(\n\t\t\t\tfile_exists(APPPATH.'libraries/Session/Session_driver.php')\n\t\t\t\t\t? APPPATH.'libraries/Session/Session_driver.php'\n\t\t\t\t\t: BASEPATH.'libraries/Session/Session_driver.php'\n\t\t\t);\n\n\t\t\tif (file_exists($file_path = APPPATH.'libraries/Session/'.$prefix.'Session_driver.php'))\n\t\t\t{\n\t\t\t\trequire_once($file_path);\n\t\t\t}\n\t\t}\n\n\t\t$class = 'Session_'.$driver.'_driver';\n\n\t\t// Allow custom drivers without the CI_ or MY_ prefix\n\t\tif ( ! class_exists($class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$class.'.php'))\n\t\t{\n\t\t\trequire_once($file_path);\n\t\t\tif (class_exists($class, FALSE))\n\t\t\t{\n\t\t\t\treturn $class;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! class_exists('CI_'.$class, FALSE))\n\t\t{\n\t\t\tif (file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$class.'.php') OR file_exists($file_path = BASEPATH.'libraries/Session/drivers/'.$class.'.php'))\n\t\t\t{\n\t\t\t\trequire_once($file_path);\n\t\t\t}\n\n\t\t\tif ( ! class_exists('CI_'.$class, FALSE) && ! class_exists($class, FALSE))\n\t\t\t{\n\t\t\t\tthrow new UnexpectedValueException(\"Session: Configured driver '\".$driver.\"' was not found. Aborting.\");\n\t\t\t}\n\t\t}\n\n\t\tif ( ! class_exists($prefix.$class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php'))\n\t\t{\n\t\t\trequire_once($file_path);\n\t\t\tif (class_exists($prefix.$class, FALSE))\n\t\t\t{\n\t\t\t\treturn $prefix.$class;\n\t\t\t}\n\n\t\t\tlog_message('debug', 'Session: '.$prefix.$class.\".php found but it doesn't declare class \".$prefix.$class.'.');\n\t\t}\n\n\t\treturn 'CI_'.$class;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Configuration\n\t *\n\t * Handle input parameters and configuration defaults\n\t *\n\t * @param\tarray\t&$params\tInput parameters\n\t * @return\tvoid\n\t */\n\tprotected function _configure(&$params)\n\t{\n\t\t$expiration = config_item('sess_expiration');\n\n\t\tif (isset($params['cookie_lifetime']))\n\t\t{\n\t\t\t$params['cookie_lifetime'] = (int) $params['cookie_lifetime'];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$params['cookie_lifetime'] = ( ! isset($expiration) && config_item('sess_expire_on_close'))\n\t\t\t\t? 0 : (int) $expiration;\n\t\t}\n\n\t\tisset($params['cookie_name']) OR $params['cookie_name'] = config_item('sess_cookie_name');\n\t\tif (empty($params['cookie_name']))\n\t\t{\n\t\t\t$params['cookie_name'] = ini_get('session.name');\n\t\t}\n\t\telse\n\t\t{\n\t\t\tini_set('session.name', $params['cookie_name']);\n\t\t}\n\n\t\tisset($params['cookie_path']) OR $params['cookie_path'] = config_item('cookie_path');\n\t\tisset($params['cookie_domain']) OR $params['cookie_domain'] = config_item('cookie_domain');\n\t\tisset($params['cookie_secure']) OR $params['cookie_secure'] = (bool) config_item('cookie_secure');\n\n\t\tisset($params['cookie_samesite']) OR $params['cookie_samesite'] = config_item('sess_samesite');\n\t\tif ( ! isset($params['cookie_samesite']) && is_php('7.3'))\n\t\t{\n\t\t\t$params['cookie_samesite'] = ini_get('session.cookie_samesite');\n\t\t}\n\n\t\tif (isset($params['cookie_samesite']))\n\t\t{\n\t\t\t$params['cookie_samesite'] = ucfirst(strtolower($params['cookie_samesite']));\n\t\t\tin_array($params['cookie_samesite'], array('Lax', 'Strict', 'None'), TRUE) OR $params['cookie_samesite'] = 'Lax';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$params['cookie_samesite'] = 'Lax';\n\t\t}\n\n\t\tif (is_php('7.3'))\n\t\t{\n\t\t\tsession_set_cookie_params(array(\n\t\t\t\t'lifetime' => $params['cookie_lifetime'],\n\t\t\t\t'path'     => $params['cookie_path'],\n\t\t\t\t'domain'   => $params['cookie_domain'],\n\t\t\t\t'secure'   => $params['cookie_secure'],\n\t\t\t\t'httponly' => TRUE,\n\t\t\t\t'samesite' => $params['cookie_samesite']\n\t\t\t));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsession_set_cookie_params(\n\t\t\t\t$params['cookie_lifetime'],\n\t\t\t\t$params['cookie_path'].'; SameSite='.$params['cookie_samesite'],\n\t\t\t\t$params['cookie_domain'],\n\t\t\t\t$params['cookie_secure'],\n\t\t\t\tTRUE // HttpOnly; Yes, this is intentional and not configurable for security reasons\n\t\t\t);\n\t\t}\n\n\t\tif (empty($expiration))\n\t\t{\n\t\t\t$params['expiration'] = (int) ini_get('session.gc_maxlifetime');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$params['expiration'] = (int) $expiration;\n\t\t\tini_set('session.gc_maxlifetime', $expiration);\n\t\t}\n\n\t\t$params['match_ip'] = (bool) (isset($params['match_ip']) ? $params['match_ip'] : config_item('sess_match_ip'));\n\n\t\tisset($params['save_path']) OR $params['save_path'] = config_item('sess_save_path');\n\n\t\t$this->_config = $params;\n\n\t\t// Security is king\n\t\tini_set('session.use_trans_sid', 0);\n\t\tini_set('session.use_strict_mode', 1);\n\t\tini_set('session.use_cookies', 1);\n\t\tini_set('session.use_only_cookies', 1);\n\n\t\t$this->_configure_sid_length();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Configure session ID length\n\t *\n\t * To make life easier, we used to force SHA-1 and 4 bits per\n\t * character on everyone. And of course, someone was unhappy.\n\t *\n\t * Then PHP 7.1 broke backwards-compatibility because ext/session\n\t * is such a mess that nobody wants to touch it with a pole stick,\n\t * and the one guy who does, nobody has the energy to argue with.\n\t *\n\t * So we were forced to make changes, and OF COURSE something was\n\t * going to break and now we have this pile of shit. -- Narf\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _configure_sid_length()\n\t{\n\t\tif (PHP_VERSION_ID < 70100)\n\t\t{\n\t\t\t$hash_function = ini_get('session.hash_function');\n\t\t\tif (ctype_digit($hash_function))\n\t\t\t{\n\t\t\t\tif ($hash_function !== '1')\n\t\t\t\t{\n\t\t\t\t\tini_set('session.hash_function', 1);\n\t\t\t\t}\n\n\t\t\t\t$bits = 160;\n\t\t\t}\n\t\t\telseif ( ! in_array($hash_function, hash_algos(), TRUE))\n\t\t\t{\n\t\t\t\tini_set('session.hash_function', 1);\n\t\t\t\t$bits = 160;\n\t\t\t}\n\t\t\telseif (($bits = strlen(hash($hash_function, 'dummy', false)) * 4) < 160)\n\t\t\t{\n\t\t\t\tini_set('session.hash_function', 1);\n\t\t\t\t$bits = 160;\n\t\t\t}\n\n\t\t\t$bits_per_character = (int) ini_get('session.hash_bits_per_character');\n\t\t\t$sid_length         = (int) ceil($bits / $bits_per_character);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$bits_per_character = (int) ini_get('session.sid_bits_per_character');\n\t\t\t$sid_length         = (int) ini_get('session.sid_length');\n\t\t\tif (($bits = $sid_length * $bits_per_character) < 160)\n\t\t\t{\n\t\t\t\t// Add as many more characters as necessary to reach at least 160 bits\n\t\t\t\t$sid_length += (int) ceil((160 % $bits) / $bits_per_character);\n\t\t\t\tini_set('session.sid_length', $sid_length);\n\t\t\t}\n\t\t}\n\n\t\t// Yes, 4,5,6 are the only known possible values as of 2016-10-27\n\t\tswitch ($bits_per_character)\n\t\t{\n\t\t\tcase 4:\n\t\t\t\t$this->_sid_regexp = '[0-9a-f]';\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\t$this->_sid_regexp = '[0-9a-v]';\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\t$this->_sid_regexp = '[0-9a-zA-Z,-]';\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$this->_sid_regexp .= '{'.$sid_length.'}';\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Handle temporary variables\n\t *\n\t * Clears old \"flash\" data, marks the new one for deletion and handles\n\t * \"temp\" data deletion.\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _ci_init_vars()\n\t{\n\t\tif ( ! empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\t$current_time = time();\n\n\t\t\tforeach ($_SESSION['__ci_vars'] as $key => &$value)\n\t\t\t{\n\t\t\t\tif ($value === 'new')\n\t\t\t\t{\n\t\t\t\t\t$_SESSION['__ci_vars'][$key] = 'old';\n\t\t\t\t}\n\t\t\t\telseif ($value === 'old' || $value < $current_time)\n\t\t\t\t{\n\t\t\t\t\tunset($_SESSION[$key], $_SESSION['__ci_vars'][$key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (empty($_SESSION['__ci_vars']))\n\t\t\t{\n\t\t\t\tunset($_SESSION['__ci_vars']);\n\t\t\t}\n\t\t}\n\n\t\t$this->userdata =& $_SESSION;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Mark as flash\n\t *\n\t * @param\tmixed\t$key\tSession data key(s)\n\t * @return\tbool\n\t */\n\tpublic function mark_as_flash($key)\n\t{\n\t\tif (is_array($key))\n\t\t{\n\t\t\tfor ($i = 0, $c = count($key); $i < $c; $i++)\n\t\t\t{\n\t\t\t\tif ( ! isset($_SESSION[$key[$i]]))\n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$new = array_fill_keys($key, 'new');\n\n\t\t\t$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars'])\n\t\t\t\t? array_merge($_SESSION['__ci_vars'], $new)\n\t\t\t\t: $new;\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif ( ! isset($_SESSION[$key]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$_SESSION['__ci_vars'][$key] = 'new';\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get flash keys\n\t *\n\t * @return\tarray\n\t */\n\tpublic function get_flash_keys()\n\t{\n\t\tif ( ! isset($_SESSION['__ci_vars']))\n\t\t{\n\t\t\treturn array();\n\t\t}\n\n\t\t$keys = array();\n\t\tforeach (array_keys($_SESSION['__ci_vars']) as $key)\n\t\t{\n\t\t\tis_int($_SESSION['__ci_vars'][$key]) OR $keys[] = $key;\n\t\t}\n\n\t\treturn $keys;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Unmark flash\n\t *\n\t * @param\tmixed\t$key\tSession data key(s)\n\t * @return\tvoid\n\t */\n\tpublic function unmark_flash($key)\n\t{\n\t\tif (empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tis_array($key) OR $key = array($key);\n\n\t\tforeach ($key as $k)\n\t\t{\n\t\t\tif (isset($_SESSION['__ci_vars'][$k]) && ! is_int($_SESSION['__ci_vars'][$k]))\n\t\t\t{\n\t\t\t\tunset($_SESSION['__ci_vars'][$k]);\n\t\t\t}\n\t\t}\n\n\t\tif (empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\tunset($_SESSION['__ci_vars']);\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Mark as temp\n\t *\n\t * @param\tmixed\t$key\tSession data key(s)\n\t * @param\tint\t$ttl\tTime-to-live in seconds\n\t * @return\tbool\n\t */\n\tpublic function mark_as_temp($key, $ttl = 300)\n\t{\n\t\t$ttl += time();\n\n\t\tif (is_array($key))\n\t\t{\n\t\t\t$temp = array();\n\n\t\t\tforeach ($key as $k => $v)\n\t\t\t{\n\t\t\t\t// Do we have a key => ttl pair, or just a key?\n\t\t\t\tif (is_int($k))\n\t\t\t\t{\n\t\t\t\t\t$k = $v;\n\t\t\t\t\t$v = $ttl;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$v += time();\n\t\t\t\t}\n\n\t\t\t\tif ( ! isset($_SESSION[$k]))\n\t\t\t\t{\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\n\t\t\t\t$temp[$k] = $v;\n\t\t\t}\n\n\t\t\t$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars'])\n\t\t\t\t? array_merge($_SESSION['__ci_vars'], $temp)\n\t\t\t\t: $temp;\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif ( ! isset($_SESSION[$key]))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$_SESSION['__ci_vars'][$key] = $ttl;\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get temp keys\n\t *\n\t * @return\tarray\n\t */\n\tpublic function get_temp_keys()\n\t{\n\t\tif ( ! isset($_SESSION['__ci_vars']))\n\t\t{\n\t\t\treturn array();\n\t\t}\n\n\t\t$keys = array();\n\t\tforeach (array_keys($_SESSION['__ci_vars']) as $key)\n\t\t{\n\t\t\tis_int($_SESSION['__ci_vars'][$key]) && $keys[] = $key;\n\t\t}\n\n\t\treturn $keys;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Unmark temp\n\t *\n\t * @param\tmixed\t$key\tSession data key(s)\n\t * @return\tvoid\n\t */\n\tpublic function unmark_temp($key)\n\t{\n\t\tif (empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tis_array($key) OR $key = array($key);\n\n\t\tforeach ($key as $k)\n\t\t{\n\t\t\tif (isset($_SESSION['__ci_vars'][$k]) && is_int($_SESSION['__ci_vars'][$k]))\n\t\t\t{\n\t\t\t\tunset($_SESSION['__ci_vars'][$k]);\n\t\t\t}\n\t\t}\n\n\t\tif (empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\tunset($_SESSION['__ci_vars']);\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * __get()\n\t *\n\t * @param\tstring\t$key\t'session_id' or a session data key\n\t * @return\tmixed\n\t */\n\tpublic function __get($key)\n\t{\n\t\t// Note: Keep this order the same, just in case somebody wants to\n\t\t//       use 'session_id' as a session data key, for whatever reason\n\t\tif (isset($_SESSION[$key]))\n\t\t{\n\t\t\treturn $_SESSION[$key];\n\t\t}\n\t\telseif ($key === 'session_id')\n\t\t{\n\t\t\treturn session_id();\n\t\t}\n\n\t\treturn NULL;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * __isset()\n\t *\n\t * @param\tstring\t$key\t'session_id' or a session data key\n\t * @return\tbool\n\t */\n\tpublic function __isset($key)\n\t{\n\t\tif ($key === 'session_id')\n\t\t{\n\t\t\treturn (session_status() === PHP_SESSION_ACTIVE);\n\t\t}\n\n\t\treturn isset($_SESSION[$key]);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * __set()\n\t *\n\t * @param\tstring\t$key\tSession data key\n\t * @param\tmixed\t$value\tSession data value\n\t * @return\tvoid\n\t */\n\tpublic function __set($key, $value)\n\t{\n\t\t$_SESSION[$key] = $value;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Session destroy\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function sess_destroy()\n\t{\n\t\tsession_destroy();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Session regenerate\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tbool\t$destroy\tDestroy old session data flag\n\t * @return\tvoid\n\t */\n\tpublic function sess_regenerate($destroy = FALSE)\n\t{\n\t\t$_SESSION['__ci_last_regenerate'] = time();\n\t\tsession_regenerate_id($destroy);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get userdata reference\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @return\tarray\n\t */\n\tpublic function &get_userdata()\n\t{\n\t\treturn $_SESSION;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Userdata (fetch)\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tstring\t$key\tSession data key\n\t * @return\tmixed\tSession data value or NULL if not found\n\t */\n\tpublic function userdata($key = NULL)\n\t{\n\t\tif (isset($key))\n\t\t{\n\t\t\treturn isset($_SESSION[$key]) ? $_SESSION[$key] : NULL;\n\t\t}\n\t\telseif (empty($_SESSION))\n\t\t{\n\t\t\treturn array();\n\t\t}\n\n\t\t$userdata = array();\n\t\t$_exclude = array_merge(\n\t\t\tarray('__ci_vars'),\n\t\t\t$this->get_flash_keys(),\n\t\t\t$this->get_temp_keys()\n\t\t);\n\n\t\tforeach (array_keys($_SESSION) as $key)\n\t\t{\n\t\t\tif ( ! in_array($key, $_exclude, TRUE))\n\t\t\t{\n\t\t\t\t$userdata[$key] = $_SESSION[$key];\n\t\t\t}\n\t\t}\n\n\t\treturn $userdata;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Set userdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tmixed\t$data\tSession data key or an associative array\n\t * @param\tmixed\t$value\tValue to store\n\t * @return\tvoid\n\t */\n\tpublic function set_userdata($data, $value = NULL)\n\t{\n\t\tif (is_array($data))\n\t\t{\n\t\t\tforeach ($data as $key => &$value)\n\t\t\t{\n\t\t\t\t$_SESSION[$key] = $value;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t$_SESSION[$data] = $value;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Unset userdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tmixed\t$key\tSession data key(s)\n\t * @return\tvoid\n\t */\n\tpublic function unset_userdata($key)\n\t{\n\t\tif (is_array($key))\n\t\t{\n\t\t\tforeach ($key as $k)\n\t\t\t{\n\t\t\t\tunset($_SESSION[$k]);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tunset($_SESSION[$key]);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * All userdata (fetch)\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @return\tarray\t$_SESSION, excluding flash data items\n\t */\n\tpublic function all_userdata()\n\t{\n\t\treturn $this->userdata();\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Has userdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tstring\t$key\tSession data key\n\t * @return\tbool\n\t */\n\tpublic function has_userdata($key)\n\t{\n\t\treturn isset($_SESSION[$key]);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Flashdata (fetch)\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tstring\t$key\tSession data key\n\t * @return\tmixed\tSession data value or NULL if not found\n\t */\n\tpublic function flashdata($key = NULL)\n\t{\n\t\tif (isset($key))\n\t\t{\n\t\t\treturn (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && ! is_int($_SESSION['__ci_vars'][$key]))\n\t\t\t\t? $_SESSION[$key]\n\t\t\t\t: NULL;\n\t\t}\n\n\t\t$flashdata = array();\n\n\t\tif ( ! empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\tforeach ($_SESSION['__ci_vars'] as $key => &$value)\n\t\t\t{\n\t\t\t\tis_int($value) OR $flashdata[$key] = $_SESSION[$key];\n\t\t\t}\n\t\t}\n\n\t\treturn $flashdata;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Set flashdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tmixed\t$data\tSession data key or an associative array\n\t * @param\tmixed\t$value\tValue to store\n\t * @return\tvoid\n\t */\n\tpublic function set_flashdata($data, $value = NULL)\n\t{\n\t\t$this->set_userdata($data, $value);\n\t\t$this->mark_as_flash(is_array($data) ? array_keys($data) : $data);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Keep flashdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tmixed\t$key\tSession data key(s)\n\t * @return\tvoid\n\t */\n\tpublic function keep_flashdata($key)\n\t{\n\t\t$this->mark_as_flash($key);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Temp data (fetch)\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tstring\t$key\tSession data key\n\t * @return\tmixed\tSession data value or NULL if not found\n\t */\n\tpublic function tempdata($key = NULL)\n\t{\n\t\tif (isset($key))\n\t\t{\n\t\t\treturn (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && is_int($_SESSION['__ci_vars'][$key]))\n\t\t\t\t? $_SESSION[$key]\n\t\t\t\t: NULL;\n\t\t}\n\n\t\t$tempdata = array();\n\n\t\tif ( ! empty($_SESSION['__ci_vars']))\n\t\t{\n\t\t\tforeach ($_SESSION['__ci_vars'] as $key => &$value)\n\t\t\t{\n\t\t\t\tis_int($value) && $tempdata[$key] = $_SESSION[$key];\n\t\t\t}\n\t\t}\n\n\t\treturn $tempdata;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Set tempdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tmixed\t$data\tSession data key or an associative array of items\n\t * @param\tmixed\t$value\tValue to store\n\t * @param\tint\t$ttl\tTime-to-live in seconds\n\t * @return\tvoid\n\t */\n\tpublic function set_tempdata($data, $value = NULL, $ttl = 300)\n\t{\n\t\t$this->set_userdata($data, $value);\n\t\t$this->mark_as_temp(is_array($data) ? array_keys($data) : $data, $ttl);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Unset tempdata\n\t *\n\t * Legacy CI_Session compatibility method\n\t *\n\t * @param\tmixed\t$data\tSession data key(s)\n\t * @return\tvoid\n\t */\n\tpublic function unset_tempdata($key)\n\t{\n\t\t$this->unmark_temp($key);\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Session/SessionHandlerInterface.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SessionHandlerInterface\n *\n * PHP 5.4 compatibility interface\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\ninterface SessionHandlerInterface {\n\n\tpublic function open($save_path, $name);\n\tpublic function close();\n\tpublic function read($session_id);\n\tpublic function write($session_id, $session_data);\n\tpublic function destroy($session_id);\n\tpublic function gc($maxlifetime);\n}\n"
  },
  {
    "path": "system/libraries/Session/SessionUpdateTimestampHandlerInterface.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * SessionUpdateTimestampHandlerInterface\n *\n * PHP 7 compatibility interface\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\ninterface SessionUpdateTimestampHandlerInterface {\n\n\tpublic function updateTimestamp($session_id, $data);\n\tpublic function validateId($session_id);\n}\n"
  },
  {
    "path": "system/libraries/Session/Session_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Session Driver Class\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nabstract class CI_Session_driver {\n\n\tprotected $_config;\n\n\t/**\n\t * Data fingerprint\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_fingerprint;\n\n\t/**\n\t * Lock placeholder\n\t *\n\t * @var\tmixed\n\t */\n\tprotected $_lock = FALSE;\n\n\t/**\n\t * Read session ID\n\t *\n\t * Used to detect session_regenerate_id() calls because PHP only calls\n\t * write() after regenerating the ID.\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_session_id;\n\n\t/**\n\t * Success and failure return values\n\t *\n\t * Necessary due to a bug in all PHP 5 versions where return values\n\t * from userspace handlers are not handled properly. PHP 7 fixes the\n\t * bug, so we need to return different values depending on the version.\n\t *\n\t * @see\thttps://wiki.php.net/rfc/session.user.return-value\n\t * @var\tmixed\n\t */\n\tprotected $_success, $_failure;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$params)\n\t{\n\t\t$this->_config =& $params;\n\n\t\tif (is_php('7'))\n\t\t{\n\t\t\t$this->_success = TRUE;\n\t\t\t$this->_failure = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_success = 0;\n\t\t\t$this->_failure = -1;\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * PHP 5.x validate ID\n\t *\n\t * Enforces session.use_strict_mode\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function php5_validate_id()\n\t{\n\t\tif ($this->_success === 0 && isset($_COOKIE[$this->_config['cookie_name']]) && ! $this->validateId($_COOKIE[$this->_config['cookie_name']]))\n\t\t{\n\t\t\tunset($_COOKIE[$this->_config['cookie_name']]);\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Cookie destroy\n\t *\n\t * Internal method to force removal of a cookie by the client\n\t * when session_destroy() is called.\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _cookie_destroy()\n\t{\n\t\tif ( ! is_php('7.3'))\n\t\t{\n\t\t\t$header = 'Set-Cookie: '.$this->_config['cookie_name'].'=';\n\t\t\t$header .= '; Expires='.gmdate('D, d-M-Y H:i:s T', 1).'; Max-Age=-1';\n\t\t\t$header .= '; Path='.$this->_config['cookie_path'];\n\t\t\t$header .= ($this->_config['cookie_domain'] !== '' ? '; Domain='.$this->_config['cookie_domain'] : '');\n\t\t\t$header .= ($this->_config['cookie_secure'] ? '; Secure' : '').'; HttpOnly; SameSite='.$this->_config['cookie_samesite'];\n\t\t\theader($header);\n\t\t\treturn;\n\t\t}\n\n\t\treturn setcookie(\n\t\t\t$this->_config['cookie_name'],\n\t\t\t'',\n\t\t\tarray(\n\t\t\t\t'expires' => 1,\n\t\t\t\t'path' => $this->_config['cookie_path'],\n\t\t\t\t'domain' => $this->_config['cookie_domain'],\n\t\t\t\t'secure' => $this->_config['cookie_secure'],\n\t\t\t\t'httponly' => TRUE,\n\t\t\t\t'samesite' => $this->_config['cookie_samesite']\n\t\t\t)\n\t\t);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get lock\n\t *\n\t * A dummy method allowing drivers with no locking functionality\n\t * (databases other than PostgreSQL and MySQL) to act as if they\n\t * do acquire a lock.\n\t *\n\t * @param\tstring\t$session_id\n\t * @return\tbool\n\t */\n\tprotected function _get_lock($session_id)\n\t{\n\t\t$this->_lock = TRUE;\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Release lock\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _release_lock()\n\t{\n\t\tif ($this->_lock)\n\t\t{\n\t\t\t$this->_lock = FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Session/drivers/Session_database_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Session Database Driver\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_Session_database_driver extends CI_Session_driver implements CI_Session_driver_interface {\n\n\t/**\n\t * DB object\n\t *\n\t * @var\tobject\n\t */\n\tprotected $_db;\n\n\t/**\n\t * Row exists flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_row_exists = FALSE;\n\n\t/**\n\t * Lock \"driver\" flag\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_platform;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$params)\n\t{\n\t\tparent::__construct($params);\n\n\t\t$CI =& get_instance();\n\t\tisset($CI->db) OR $CI->load->database();\n\t\t$this->_db = $CI->db;\n\n\t\tif ( ! $this->_db instanceof CI_DB_query_builder)\n\t\t{\n\t\t\tthrow new Exception('Query Builder not enabled for the configured database. Aborting.');\n\t\t}\n\t\telseif ($this->_db->pconnect)\n\t\t{\n\t\t\tthrow new Exception('Configured database connection is persistent. Aborting.');\n\t\t}\n\t\telseif ($this->_db->cache_on)\n\t\t{\n\t\t\tthrow new Exception('Configured database connection has cache enabled. Aborting.');\n\t\t}\n\n\t\t$db_driver = $this->_db->dbdriver.(empty($this->_db->subdriver) ? '' : '_'.$this->_db->subdriver);\n\t\tif (strpos($db_driver, 'mysql') !== FALSE)\n\t\t{\n\t\t\t$this->_platform = 'mysql';\n\t\t}\n\t\telseif (in_array($db_driver, array('postgre', 'pdo_pgsql'), TRUE))\n\t\t{\n\t\t\t$this->_platform = 'postgre';\n\t\t}\n\n\t\t// Note: BC work-around for the old 'sess_table_name' setting, should be removed in the future.\n\t\tif ( ! isset($this->_config['save_path']) && ($this->_config['save_path'] = config_item('sess_table_name')))\n\t\t{\n\t\t\tlog_message('debug', 'Session: \"sess_save_path\" is empty; using BC fallback to \"sess_table_name\".');\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Open\n\t *\n\t * Initializes the database connection\n\t *\n\t * @param\tstring\t$save_path\tTable name\n\t * @param\tstring\t$name\t\tSession cookie name, unused\n\t * @return\tbool\n\t */\n\tpublic function open($save_path, $name)\n\t{\n\t\tif (empty($this->_db->conn_id) && ! $this->_db->db_connect())\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t$this->php5_validate_id();\n\n\t\treturn $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Read\n\t *\n\t * Reads session data and acquires a lock\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tstring\tSerialized session data\n\t */\n\tpublic function read($session_id)\n\t{\n\t\tif ($this->_get_lock($session_id) === FALSE)\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t// Prevent previous QB calls from messing with our queries\n\t\t$this->_db->reset_query();\n\n\t\t// Needed by write() to detect session_regenerate_id() calls\n\t\t$this->_session_id = $session_id;\n\n\t\t$this->_db\n\t\t\t->select('data')\n\t\t\t->from($this->_config['save_path'])\n\t\t\t->where('id', $session_id);\n\n\t\tif ($this->_config['match_ip'])\n\t\t{\n\t\t\t$this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);\n\t\t}\n\n\t\tif ( ! ($result = $this->_db->get()) OR ($result = $result->row()) === NULL)\n\t\t{\n\t\t\t// PHP7 will reuse the same SessionHandler object after\n\t\t\t// ID regeneration, so we need to explicitly set this to\n\t\t\t// FALSE instead of relying on the default ...\n\t\t\t$this->_row_exists = FALSE;\n\t\t\t$this->_fingerprint = md5('');\n\t\t\treturn '';\n\t\t}\n\n\t\t// PostgreSQL's variant of a BLOB datatype is Bytea, which is a\n\t\t// PITA to work with, so we use base64-encoded data in a TEXT\n\t\t// field instead.\n\t\t$result = ($this->_platform === 'postgre')\n\t\t\t? base64_decode(rtrim($result->data))\n\t\t\t: $result->data;\n\n\t\t$this->_fingerprint = md5($result);\n\t\t$this->_row_exists = TRUE;\n\t\treturn $result;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Write\n\t *\n\t * Writes (create / update) session data\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @param\tstring\t$session_data\tSerialized session data\n\t * @return\tbool\n\t */\n\tpublic function write($session_id, $session_data)\n\t{\n\t\t// Prevent previous QB calls from messing with our queries\n\t\t$this->_db->reset_query();\n\n\t\t// Was the ID regenerated?\n\t\tif (isset($this->_session_id) && $session_id !== $this->_session_id)\n\t\t{\n\t\t\tif ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))\n\t\t\t{\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\n\t\t\t$this->_row_exists = FALSE;\n\t\t\t$this->_session_id = $session_id;\n\t\t}\n\t\telseif ($this->_lock === FALSE)\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\tif ($this->_row_exists === FALSE)\n\t\t{\n\t\t\t$insert_data = array(\n\t\t\t\t'id' => $session_id,\n\t\t\t\t'ip_address' => $_SERVER['REMOTE_ADDR'],\n\t\t\t\t'timestamp' => time(),\n\t\t\t\t'data' => ($this->_platform === 'postgre' ? base64_encode($session_data) : $session_data)\n\t\t\t);\n\n\t\t\tif ($this->_db->insert($this->_config['save_path'], $insert_data))\n\t\t\t{\n\t\t\t\t$this->_fingerprint = md5($session_data);\n\t\t\t\t$this->_row_exists = TRUE;\n\t\t\t\treturn $this->_success;\n\t\t\t}\n\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t$this->_db->where('id', $session_id);\n\t\tif ($this->_config['match_ip'])\n\t\t{\n\t\t\t$this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);\n\t\t}\n\n\t\t$update_data = array('timestamp' => time());\n\t\tif ($this->_fingerprint !== md5($session_data))\n\t\t{\n\t\t\t$update_data['data'] = ($this->_platform === 'postgre')\n\t\t\t\t? base64_encode($session_data)\n\t\t\t\t: $session_data;\n\t\t}\n\n\t\tif ($this->_db->update($this->_config['save_path'], $update_data))\n\t\t{\n\t\t\t$this->_fingerprint = md5($session_data);\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Close\n\t *\n\t * Releases locks\n\t *\n\t * @return\tbool\n\t */\n\tpublic function close()\n\t{\n\t\treturn ($this->_lock && ! $this->_release_lock())\n\t\t\t? $this->_failure\n\t\t\t: $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Destroy\n\t *\n\t * Destroys the current session.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function destroy($session_id)\n\t{\n\t\tif ($this->_lock)\n\t\t{\n\t\t\t// Prevent previous QB calls from messing with our queries\n\t\t\t$this->_db->reset_query();\n\n\t\t\t$this->_db->where('id', $session_id);\n\t\t\tif ($this->_config['match_ip'])\n\t\t\t{\n\t\t\t\t$this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);\n\t\t\t}\n\n\t\t\tif ( ! $this->_db->delete($this->_config['save_path']))\n\t\t\t{\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\t\t}\n\n\t\tif ($this->close() === $this->_success)\n\t\t{\n\t\t\t$this->_cookie_destroy();\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Garbage Collector\n\t *\n\t * Deletes expired sessions\n\t *\n\t * @param\tint \t$maxlifetime\tMaximum lifetime of sessions\n\t * @return\tbool\n\t */\n\tpublic function gc($maxlifetime)\n\t{\n\t\t// Prevent previous QB calls from messing with our queries\n\t\t$this->_db->reset_query();\n\n\t\treturn ($this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime)))\n\t\t\t? $this->_success\n\t\t\t: $this->_failure;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update Timestamp\n\t *\n\t * Update session timestamp without modifying data\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @param\tstring\t$data\tUnknown & unused\n\t * @return\tbool\n\t */\n\tpublic function updateTimestamp($id, $unknown)\n\t{\n\t\t// Prevent previous QB calls from messing with our queries\n\t\t$this->_db->reset_query();\n\n\t\t$this->_db->where('id', $id);\n\t\tif ($this->_config['match_ip'])\n\t\t{\n\t\t\t$this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);\n\t\t}\n\n\t\treturn (bool) $this->_db->update($this->_config['save_path'], array('timestamp' => time()));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate ID\n\t *\n\t * Checks whether a session ID record exists server-side,\n\t * to enforce session.use_strict_mode.\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function validateId($id)\n\t{\n\t\t// Prevent previous QB calls from messing with our queries\n\t\t$this->_db->reset_query();\n\n\t\t$this->_db->select('1')->from($this->_config['save_path'])->where('id', $id);\n\t\tempty($this->_config['match_ip']) OR $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);\n\t\t$result = $this->_db->get();\n\t\tempty($result) OR $result = $result->row();\n\n\t\treturn ! empty($result);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get lock\n\t *\n\t * Acquires a lock, depending on the underlying platform.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tprotected function _get_lock($session_id)\n\t{\n\t\tif ($this->_platform === 'mysql')\n\t\t{\n\t\t\t$arg = md5($session_id.($this->_config['match_ip'] ? '_'.$_SERVER['REMOTE_ADDR'] : ''));\n\t\t\tif ($this->_db->query(\"SELECT GET_LOCK('\".$arg.\"', 300) AS ci_session_lock\")->row()->ci_session_lock)\n\t\t\t{\n\t\t\t\t$this->_lock = $arg;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ($this->_platform === 'postgre')\n\t\t{\n\t\t\t$arg = \"hashtext('\".$session_id.\"')\".($this->_config['match_ip'] ? \", hashtext('\".$_SERVER['REMOTE_ADDR'].\"')\" : '');\n\t\t\tif ($this->_db->simple_query('SELECT pg_advisory_lock('.$arg.')'))\n\t\t\t{\n\t\t\t\t$this->_lock = $arg;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::_get_lock($session_id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Release lock\n\t *\n\t * Releases a previously acquired lock\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _release_lock()\n\t{\n\t\tif ( ! $this->_lock)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif ($this->_platform === 'mysql')\n\t\t{\n\t\t\tif ($this->_db->query(\"SELECT RELEASE_LOCK('\".$this->_lock.\"') AS ci_session_lock\")->row()->ci_session_lock)\n\t\t\t{\n\t\t\t\t$this->_lock = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ($this->_platform === 'postgre')\n\t\t{\n\t\t\tif ($this->_db->simple_query('SELECT pg_advisory_unlock('.$this->_lock.')'))\n\t\t\t{\n\t\t\t\t$this->_lock = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn parent::_release_lock();\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Session/drivers/Session_files_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Session Files Driver\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_Session_files_driver extends CI_Session_driver implements CI_Session_driver_interface {\n\n\t/**\n\t * Save path\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_save_path;\n\n\t/**\n\t * File handle\n\t *\n\t * @var\tresource\n\t */\n\tprotected $_file_handle;\n\n\t/**\n\t * File name\n\t *\n\t * @var\tresource\n\t */\n\tprotected $_file_path;\n\n\t/**\n\t * File new flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected $_file_new;\n\n\t/**\n\t * Validate SID regular expression\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_sid_regexp;\n\n\t/**\n\t * mbstring.func_overload flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected static $func_overload;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (isset($this->_config['save_path']))\n\t\t{\n\t\t\t$this->_config['save_path'] = rtrim($this->_config['save_path'], '/\\\\');\n\t\t\tini_set('session.save_path', $this->_config['save_path']);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog_message('debug', 'Session: \"sess_save_path\" is empty; using \"session.save_path\" value from php.ini.');\n\t\t\t$this->_config['save_path'] = rtrim(ini_get('session.save_path'), '/\\\\');\n\t\t}\n\n\t\t$this->_sid_regexp = $this->_config['_sid_regexp'];\n\n\t\tisset(self::$func_overload) OR self::$func_overload = ( ! is_php('8.0') && extension_loaded('mbstring') && @ini_get('mbstring.func_overload'));\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Open\n\t *\n\t * Sanitizes the save_path directory.\n\t *\n\t * @param\tstring\t$save_path\tPath to session files' directory\n\t * @param\tstring\t$name\t\tSession cookie name\n\t * @return\tbool\n\t */\n\tpublic function open($save_path, $name)\n\t{\n\t\tif ( ! is_dir($save_path))\n\t\t{\n\t\t\tif ( ! mkdir($save_path, 0700, TRUE))\n\t\t\t{\n\t\t\t\tlog_message('error', \"Session: Configured save path '\".$this->_config['save_path'].\"' is not a directory, doesn't exist or cannot be created.\");\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\t\t}\n\t\telseif ( ! is_writable($save_path))\n\t\t{\n\t\t\tlog_message('error', \"Session: Configured save path '\".$this->_config['save_path'].\"' is not writable by the PHP process.\");\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t$this->_config['save_path'] = $save_path;\n\t\t$this->_file_path = $this->_config['save_path'].DIRECTORY_SEPARATOR\n\t\t\t.$name // we'll use the session cookie name as a prefix to avoid collisions\n\t\t\t.($this->_config['match_ip'] ? md5($_SERVER['REMOTE_ADDR']) : '');\n\n\t\t$this->php5_validate_id();\n\n\t\treturn $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Read\n\t *\n\t * Reads session data and acquires a lock\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tstring\tSerialized session data\n\t */\n\tpublic function read($session_id)\n\t{\n\t\t// This might seem weird, but PHP 5.6 introduces session_reset(),\n\t\t// which re-reads session data\n\t\tif ($this->_file_handle === NULL)\n\t\t{\n\t\t\t$this->_file_new = ! file_exists($this->_file_path.$session_id);\n\n\t\t\tif (($this->_file_handle = fopen($this->_file_path.$session_id, 'c+b')) === FALSE)\n\t\t\t{\n\t\t\t\tlog_message('error', \"Session: Unable to open file '\".$this->_file_path.$session_id.\"'.\");\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\n\t\t\tif (flock($this->_file_handle, LOCK_EX) === FALSE)\n\t\t\t{\n\t\t\t\tlog_message('error', \"Session: Unable to obtain lock for file '\".$this->_file_path.$session_id.\"'.\");\n\t\t\t\tfclose($this->_file_handle);\n\t\t\t\t$this->_file_handle = NULL;\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\n\t\t\t// Needed by write() to detect session_regenerate_id() calls\n\t\t\t$this->_session_id = $session_id;\n\n\t\t\tif ($this->_file_new)\n\t\t\t{\n\t\t\t\tchmod($this->_file_path.$session_id, 0600);\n\t\t\t\t$this->_fingerprint = md5('');\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// Prevent possible data corruption\n\t\t\t// See https://github.com/bcit-ci/CodeIgniter/issues/5857\n\t\t\tclearstatcache(TRUE, $this->_file_path.$session_id);\n\t\t}\n\t\t// We shouldn't need this, but apparently we do ...\n\t\t// See https://github.com/bcit-ci/CodeIgniter/issues/4039\n\t\telseif ($this->_file_handle === FALSE)\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trewind($this->_file_handle);\n\t\t}\n\n\t\t$session_data = '';\n\t\tfor ($read = 0, $length = filesize($this->_file_path.$session_id); $read < $length; $read += self::strlen($buffer))\n\t\t{\n\t\t\tif (($buffer = fread($this->_file_handle, $length - $read)) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$session_data .= $buffer;\n\t\t}\n\n\t\t$this->_fingerprint = md5($session_data);\n\t\treturn $session_data;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Write\n\t *\n\t * Writes (create / update) session data\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @param\tstring\t$session_data\tSerialized session data\n\t * @return\tbool\n\t */\n\tpublic function write($session_id, $session_data)\n\t{\n\t\t// If the two IDs don't match, we have a session_regenerate_id() call\n\t\t// and we need to close the old handle and open a new one\n\t\tif ($session_id !== $this->_session_id && ($this->close() === $this->_failure OR $this->read($session_id) === $this->_failure))\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\tif ( ! is_resource($this->_file_handle))\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\t\telseif ($this->_fingerprint === md5($session_data))\n\t\t{\n\t\t\treturn ( ! $this->_file_new && ! touch($this->_file_path.$session_id))\n\t\t\t\t? $this->_failure\n\t\t\t\t: $this->_success;\n\t\t}\n\n\t\tif ( ! $this->_file_new)\n\t\t{\n\t\t\tftruncate($this->_file_handle, 0);\n\t\t\trewind($this->_file_handle);\n\t\t}\n\n\t\tif (($length = strlen($session_data)) > 0)\n\t\t{\n\t\t\tfor ($written = 0; $written < $length; $written += $result)\n\t\t\t{\n\t\t\t\tif (($result = fwrite($this->_file_handle, substr($session_data, $written))) === FALSE)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! is_int($result))\n\t\t\t{\n\t\t\t\t$this->_fingerprint = md5(substr($session_data, 0, $written));\n\t\t\t\tlog_message('error', 'Session: Unable to write data.');\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\t\t}\n\n\t\t$this->_fingerprint = md5($session_data);\n\t\treturn $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Close\n\t *\n\t * Releases locks and closes file descriptor.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function close()\n\t{\n\t\tif (is_resource($this->_file_handle))\n\t\t{\n\t\t\tflock($this->_file_handle, LOCK_UN);\n\t\t\tfclose($this->_file_handle);\n\n\t\t\t$this->_file_handle = $this->_file_new = $this->_session_id = NULL;\n\t\t}\n\n\t\treturn $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Destroy\n\t *\n\t * Destroys the current session.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function destroy($session_id)\n\t{\n\t\tif ($this->close() === $this->_success)\n\t\t{\n\t\t\tif (file_exists($this->_file_path.$session_id))\n\t\t\t{\n\t\t\t\t$this->_cookie_destroy();\n\t\t\t\treturn unlink($this->_file_path.$session_id)\n\t\t\t\t\t? $this->_success\n\t\t\t\t\t: $this->_failure;\n\t\t\t}\n\n\t\t\treturn $this->_success;\n\t\t}\n\t\telseif ($this->_file_path !== NULL)\n\t\t{\n\t\t\tclearstatcache();\n\t\t\tif (file_exists($this->_file_path.$session_id))\n\t\t\t{\n\t\t\t\t$this->_cookie_destroy();\n\t\t\t\treturn unlink($this->_file_path.$session_id)\n\t\t\t\t\t? $this->_success\n\t\t\t\t\t: $this->_failure;\n\t\t\t}\n\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Garbage Collector\n\t *\n\t * Deletes expired sessions\n\t *\n\t * @param\tint \t$maxlifetime\tMaximum lifetime of sessions\n\t * @return\tbool\n\t */\n\tpublic function gc($maxlifetime)\n\t{\n\t\tif ( ! is_dir($this->_config['save_path']) OR ($directory = opendir($this->_config['save_path'])) === FALSE)\n\t\t{\n\t\t\tlog_message('debug', \"Session: Garbage collector couldn't list files under directory '\".$this->_config['save_path'].\"'.\");\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t$ts = time() - $maxlifetime;\n\n\t\t$pattern = ($this->_config['match_ip'] === TRUE)\n\t\t\t? '[0-9a-f]{32}'\n\t\t\t: '';\n\n\t\t$pattern = sprintf(\n\t\t\t'#\\A%s'.$pattern.$this->_sid_regexp.'\\z#',\n\t\t\tpreg_quote($this->_config['cookie_name'])\n\t\t);\n\n\t\twhile (($file = readdir($directory)) !== FALSE)\n\t\t{\n\t\t\t// If the filename doesn't match this pattern, it's either not a session file or is not ours\n\t\t\tif ( ! preg_match($pattern, $file)\n\t\t\t\tOR ! is_file($this->_config['save_path'].DIRECTORY_SEPARATOR.$file)\n\t\t\t\tOR ($mtime = filemtime($this->_config['save_path'].DIRECTORY_SEPARATOR.$file)) === FALSE\n\t\t\t\tOR $mtime > $ts)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tunlink($this->_config['save_path'].DIRECTORY_SEPARATOR.$file);\n\t\t}\n\n\t\tclosedir($directory);\n\n\t\treturn $this->_success;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update Timestamp\n\t *\n\t * Update session timestamp without modifying data\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @param\tstring\t$data\tUnknown & unused\n\t * @return\tbool\n\t */\n\tpublic function updateTimestamp($id, $unknown)\n\t{\n\t\treturn touch($this->_file_path.$id);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate ID\n\t *\n\t * Checks whether a session ID record exists server-side,\n\t * to enforce session.use_strict_mode.\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function validateId($id)\n\t{\n\t\t$result = is_file($this->_file_path.$id);\n\t\tclearstatcache(TRUE, $this->_file_path.$id);\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn (self::$func_overload)\n\t\t\t? mb_strlen($str, '8bit')\n\t\t\t: strlen($str);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Session/drivers/Session_memcached_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Session Memcached Driver\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_Session_memcached_driver extends CI_Session_driver implements CI_Session_driver_interface {\n\n\t/**\n\t * Memcached instance\n\t *\n\t * @var\tMemcached\n\t */\n\tprotected $_memcached;\n\n\t/**\n\t * Key prefix\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_key_prefix = 'ci_session:';\n\n\t/**\n\t * Lock key\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_lock_key;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$params)\n\t{\n\t\tparent::__construct($params);\n\n\t\tif (empty($this->_config['save_path']))\n\t\t{\n\t\t\tlog_message('error', 'Session: No Memcached save path configured.');\n\t\t}\n\n\t\tif ($this->_config['match_ip'] === TRUE)\n\t\t{\n\t\t\t$this->_key_prefix .= $_SERVER['REMOTE_ADDR'].':';\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Open\n\t *\n\t * Sanitizes save_path and initializes connections.\n\t *\n\t * @param\tstring\t$save_path\tServer path(s)\n\t * @param\tstring\t$name\t\tSession cookie name, unused\n\t * @return\tbool\n\t */\n\tpublic function open($save_path, $name)\n\t{\n\t\t$this->_memcached = new Memcached();\n\t\t$this->_memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, TRUE); // required for touch() usage\n\t\t$server_list = array();\n\t\tforeach ($this->_memcached->getServerList() as $server)\n\t\t{\n\t\t\t$server_list[] = $server['host'].':'.$server['port'];\n\t\t}\n\n\t\tif ( ! preg_match_all('#,?([^,:]+)\\:(\\d{1,5})(?:\\:(\\d+))?#', $this->_config['save_path'], $matches, PREG_SET_ORDER))\n\t\t{\n\t\t\t$this->_memcached = NULL;\n\t\t\tlog_message('error', 'Session: Invalid Memcached save path format: '.$this->_config['save_path']);\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\tforeach ($matches as $match)\n\t\t{\n\t\t\t// If Memcached already has this server (or if the port is invalid), skip it\n\t\t\tif (in_array($match[1].':'.$match[2], $server_list, TRUE))\n\t\t\t{\n\t\t\t\tlog_message('debug', 'Session: Memcached server pool already has '.$match[1].':'.$match[2]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( ! $this->_memcached->addServer($match[1], $match[2], isset($match[3]) ? $match[3] : 0))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Could not add '.$match[1].':'.$match[2].' to Memcached server pool.');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$server_list[] = $match[1].':'.$match[2];\n\t\t\t}\n\t\t}\n\n\t\tif (empty($server_list))\n\t\t{\n\t\t\tlog_message('error', 'Session: Memcached server pool is empty.');\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t$this->php5_validate_id();\n\n\t\treturn $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Read\n\t *\n\t * Reads session data and acquires a lock\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tstring\tSerialized session data\n\t */\n\tpublic function read($session_id)\n\t{\n\t\tif (isset($this->_memcached) && $this->_get_lock($session_id))\n\t\t{\n\t\t\t// Needed by write() to detect session_regenerate_id() calls\n\t\t\t$this->_session_id = $session_id;\n\n\t\t\t$session_data = (string) $this->_memcached->get($this->_key_prefix.$session_id);\n\t\t\t$this->_fingerprint = md5($session_data);\n\t\t\treturn $session_data;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Write\n\t *\n\t * Writes (create / update) session data\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @param\tstring\t$session_data\tSerialized session data\n\t * @return\tbool\n\t */\n\tpublic function write($session_id, $session_data)\n\t{\n\t\tif ( ! isset($this->_memcached, $this->_lock_key))\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\t\t// Was the ID regenerated?\n\t\telseif ($session_id !== $this->_session_id)\n\t\t{\n\t\t\tif ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))\n\t\t\t{\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\n\t\t\t$this->_fingerprint = md5('');\n\t\t\t$this->_session_id = $session_id;\n\t\t}\n\n\t\t$key = $this->_key_prefix.$session_id;\n\n\t\t$this->_memcached->replace($this->_lock_key, time(), 300);\n\t\tif ($this->_fingerprint !== ($fingerprint = md5($session_data)))\n\t\t{\n\t\t\tif ($this->_memcached->set($key, $session_data, $this->_config['expiration']))\n\t\t\t{\n\t\t\t\t$this->_fingerprint = $fingerprint;\n\t\t\t\treturn $this->_success;\n\t\t\t}\n\n\t\t\treturn $this->_failure;\n\t\t}\n\t\telseif (\n\t\t\t$this->_memcached->touch($key, $this->_config['expiration'])\n\t\t\tOR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration']))\n\t\t)\n\t\t{\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Close\n\t *\n\t * Releases locks and closes connection.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function close()\n\t{\n\t\tif (isset($this->_memcached))\n\t\t{\n\t\t\t$this->_release_lock();\n\t\t\tif ( ! $this->_memcached->quit())\n\t\t\t{\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\n\t\t\t$this->_memcached = NULL;\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Destroy\n\t *\n\t * Destroys the current session.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function destroy($session_id)\n\t{\n\t\tif (isset($this->_memcached, $this->_lock_key))\n\t\t{\n\t\t\t$this->_memcached->delete($this->_key_prefix.$session_id);\n\t\t\t$this->_cookie_destroy();\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Garbage Collector\n\t *\n\t * Deletes expired sessions\n\t *\n\t * @param\tint \t$maxlifetime\tMaximum lifetime of sessions\n\t * @return\tbool\n\t */\n\tpublic function gc($maxlifetime)\n\t{\n\t\t// Not necessary, Memcached takes care of that.\n\t\treturn $this->_success;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update Timestamp\n\t *\n\t * Update session timestamp without modifying data\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @param\tstring\t$data\tUnknown & unused\n\t * @return\tbool\n\t */\n\tpublic function updateTimestamp($id, $unknown)\n\t{\n\t\treturn $this->_memcached->touch($this->_key_prefix.$id, $this->_config['expiration']);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate ID\n\t *\n\t * Checks whether a session ID record exists server-side,\n\t * to enforce session.use_strict_mode.\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function validateId($id)\n\t{\n\t\t$this->_memcached->get($this->_key_prefix.$id);\n\t\treturn ($this->_memcached->getResultCode() === Memcached::RES_SUCCESS);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get lock\n\t *\n\t * Acquires an (emulated) lock.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tprotected function _get_lock($session_id)\n\t{\n\t\t// PHP 7 reuses the SessionHandler object on regeneration,\n\t\t// so we need to check here if the lock key is for the\n\t\t// correct session ID.\n\t\tif ($this->_lock_key === $this->_key_prefix.$session_id.':lock')\n\t\t{\n\t\t\tif ( ! $this->_memcached->replace($this->_lock_key, time(), 300))\n\t\t\t{\n\t\t\t\treturn ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND)\n\t\t\t\t\t? $this->_memcached->add($this->_lock_key, time(), 300)\n\t\t\t\t\t: FALSE;\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// 30 attempts to obtain a lock, in case another request already has it\n\t\t$lock_key = $this->_key_prefix.$session_id.':lock';\n\t\t$attempt = 0;\n\t\tdo\n\t\t{\n\t\t\tif ($this->_memcached->get($lock_key))\n\t\t\t{\n\t\t\t\tsleep(1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$method = ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND) ? 'add' : 'set';\n\t\t\tif ( ! $this->_memcached->$method($lock_key, time(), 300))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$this->_lock_key = $lock_key;\n\t\t\tbreak;\n\t\t}\n\t\twhile (++$attempt < 30);\n\n\t\tif ($attempt === 30)\n\t\t{\n\t\t\tlog_message('error', 'Session: Unable to obtain lock for '.$this->_key_prefix.$session_id.' after 30 attempts, aborting.');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->_lock = TRUE;\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Release lock\n\t *\n\t * Releases a previously acquired lock\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _release_lock()\n\t{\n\t\tif (isset($this->_memcached, $this->_lock_key) && $this->_lock)\n\t\t{\n\t\t\tif ( ! $this->_memcached->delete($this->_lock_key) && $this->_memcached->getResultCode() !== Memcached::RES_NOTFOUND)\n\t\t\t{\n\t\t\t\tlog_message('error', 'Session: Error while trying to free lock for '.$this->_lock_key);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$this->_lock_key = NULL;\n\t\t\t$this->_lock = FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n}\n"
  },
  {
    "path": "system/libraries/Session/drivers/Session_redis_driver.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 3.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * CodeIgniter Session Redis Driver\n *\n * @package\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tSessions\n * @author\tAndrey Andreev\n * @link\thttps://codeigniter.com/userguide3/libraries/sessions.html\n */\nclass CI_Session_redis_driver extends CI_Session_driver implements CI_Session_driver_interface {\n\n\t/**\n\t * phpRedis instance\n\t *\n\t * @var\tRedis\n\t */\n\tprotected $_redis;\n\n\t/**\n\t * Key prefix\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_key_prefix = 'ci_session:';\n\n\t/**\n\t * Lock key\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_lock_key;\n\n\t/**\n\t * Key exists flag\n\t *\n\t * @var bool\n\t */\n\tprotected $_key_exists = FALSE;\n\n\t/**\n\t * Name of setTimeout() method in phpRedis\n\t *\n\t * Due to some deprecated methods in phpRedis, we need to call the\n\t * specific methods depending on the version of phpRedis.\n\t *\n\t * @var string\n\t */\n\tprotected $_setTimeout_name;\n\n\t/**\n\t * Name of delete() method in phpRedis\n\t *\n\t * Due to some deprecated methods in phpRedis, we need to call the\n\t * specific methods depending on the version of phpRedis.\n\t *\n\t * @var string\n\t */\n\tprotected $_delete_name;\n\n\t/**\n\t * Success return value of ping() method in phpRedis\n\t *\n\t * @var mixed\n\t */\n\tprotected $_ping_success;\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Class constructor\n\t *\n\t * @param\tarray\t$params\tConfiguration parameters\n\t * @return\tvoid\n\t */\n\tpublic function __construct(&$params)\n\t{\n\t\tparent::__construct($params);\n\n\t\t// Detect the names of some methods in phpRedis instance\n\t\tif (version_compare(phpversion('redis'), '5', '>='))\n\t\t{\n\t\t\t$this->_setTimeout_name = 'expire';\n\t\t\t$this->_delete_name = 'del';\n\t\t\t$this->_ping_success = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_setTimeout_name = 'setTimeout';\n\t\t\t$this->_delete_name = 'delete';\n\t\t\t$this->_ping_success = '+PONG';\n\t\t}\n\n\t\tif (empty($this->_config['save_path']))\n\t\t{\n\t\t\tlog_message('error', 'Session: No Redis save path configured.');\n\t\t}\n\t\telseif (preg_match('#(?:tcp://)?([^:?]+)(?:\\:(\\d+))?(\\?.+)?#', $this->_config['save_path'], $matches))\n\t\t{\n\t\t\tisset($matches[3]) OR $matches[3] = ''; // Just to avoid undefined index notices below\n\t\t\t$this->_config['save_path'] = array(\n\t\t\t\t'host' => $matches[1],\n\t\t\t\t'port' => empty($matches[2]) ? NULL : $matches[2],\n\t\t\t\t'password' => preg_match('#auth=([^\\s&]+)#', $matches[3], $match) ? $match[1] : NULL,\n\t\t\t\t'database' => preg_match('#database=(\\d+)#', $matches[3], $match) ? (int) $match[1] : NULL,\n\t\t\t\t'timeout' => preg_match('#timeout=(\\d+\\.\\d+)#', $matches[3], $match) ? (float) $match[1] : NULL\n\t\t\t);\n\n\t\t\tpreg_match('#prefix=([^\\s&]+)#', $matches[3], $match) && $this->_key_prefix = $match[1];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlog_message('error', 'Session: Invalid Redis save path format: '.$this->_config['save_path']);\n\t\t}\n\n\t\tif ($this->_config['match_ip'] === TRUE)\n\t\t{\n\t\t\t$this->_key_prefix .= $_SERVER['REMOTE_ADDR'].':';\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Open\n\t *\n\t * Sanitizes save_path and initializes connection.\n\t *\n\t * @param\tstring\t$save_path\tServer path\n\t * @param\tstring\t$name\t\tSession cookie name, unused\n\t * @return\tbool\n\t */\n\tpublic function open($save_path, $name)\n\t{\n\t\tif (empty($this->_config['save_path']))\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\t$redis = new Redis();\n\t\tif ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout']))\n\t\t{\n\t\t\tlog_message('error', 'Session: Unable to connect to Redis with the configured settings.');\n\t\t}\n\t\telseif (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password']))\n\t\t{\n\t\t\tlog_message('error', 'Session: Unable to authenticate to Redis instance.');\n\t\t}\n\t\telseif (isset($this->_config['save_path']['database']) && ! $redis->select($this->_config['save_path']['database']))\n\t\t{\n\t\t\tlog_message('error', 'Session: Unable to select Redis database with index '.$this->_config['save_path']['database']);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->_redis = $redis;\n\t\t\t$this->php5_validate_id();\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Read\n\t *\n\t * Reads session data and acquires a lock\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tstring\tSerialized session data\n\t */\n\tpublic function read($session_id)\n\t{\n\t\tif (isset($this->_redis) && $this->_get_lock($session_id))\n\t\t{\n\t\t\t// Needed by write() to detect session_regenerate_id() calls\n\t\t\t$this->_session_id = $session_id;\n\n\t\t\t$session_data = $this->_redis->get($this->_key_prefix.$session_id);\n\n\t\t\tis_string($session_data)\n\t\t\t\t? $this->_key_exists = TRUE\n\t\t\t\t: $session_data = '';\n\n\t\t\t$this->_fingerprint = md5($session_data);\n\t\t\treturn $session_data;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Write\n\t *\n\t * Writes (create / update) session data\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @param\tstring\t$session_data\tSerialized session data\n\t * @return\tbool\n\t */\n\tpublic function write($session_id, $session_data)\n\t{\n\t\tif ( ! isset($this->_redis, $this->_lock_key))\n\t\t{\n\t\t\treturn $this->_failure;\n\t\t}\n\t\t// Was the ID regenerated?\n\t\telseif ($session_id !== $this->_session_id)\n\t\t{\n\t\t\tif ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))\n\t\t\t{\n\t\t\t\treturn $this->_failure;\n\t\t\t}\n\n\t\t\t$this->_key_exists = FALSE;\n\t\t\t$this->_session_id = $session_id;\n\t\t}\n\n\t\t$this->_redis->{$this->_setTimeout_name}($this->_lock_key, 300);\n\t\tif ($this->_fingerprint !== ($fingerprint = md5($session_data)) OR $this->_key_exists === FALSE)\n\t\t{\n\t\t\tif ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration']))\n\t\t\t{\n\t\t\t\t$this->_fingerprint = $fingerprint;\n\t\t\t\t$this->_key_exists = TRUE;\n\t\t\t\treturn $this->_success;\n\t\t\t}\n\n\t\t\treturn $this->_failure;\n\t\t}\n\n\t\treturn ($this->_redis->{$this->_setTimeout_name}($this->_key_prefix.$session_id, $this->_config['expiration']))\n\t\t\t? $this->_success\n\t\t\t: $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Close\n\t *\n\t * Releases locks and closes connection.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function close()\n\t{\n\t\tif (isset($this->_redis))\n\t\t{\n\t\t\ttry {\n\t\t\t\tif ($this->_redis->ping() === $this->_ping_success)\n\t\t\t\t{\n\t\t\t\t\t$this->_release_lock();\n\t\t\t\t\tif ($this->_redis->close() === FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn $this->_failure;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (RedisException $e)\n\t\t\t{\n\t\t\t\tlog_message('error', 'Session: Got RedisException on close(): '.$e->getMessage());\n\t\t\t}\n\n\t\t\t$this->_redis = NULL;\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_success;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Destroy\n\t *\n\t * Destroys the current session.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function destroy($session_id)\n\t{\n\t\tif (isset($this->_redis, $this->_lock_key))\n\t\t{\n\t\t\tif (($result = $this->_redis->{$this->_delete_name}($this->_key_prefix.$session_id)) !== 1)\n\t\t\t{\n\t\t\t\tlog_message('debug', 'Session: Redis::'.$this->_delete_name.'() expected to return 1, got '.var_export($result, TRUE).' instead.');\n\t\t\t}\n\n\t\t\t$this->_cookie_destroy();\n\t\t\treturn $this->_success;\n\t\t}\n\n\t\treturn $this->_failure;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Garbage Collector\n\t *\n\t * Deletes expired sessions\n\t *\n\t * @param\tint \t$maxlifetime\tMaximum lifetime of sessions\n\t * @return\tbool\n\t */\n\tpublic function gc($maxlifetime)\n\t{\n\t\t// Not necessary, Redis takes care of that.\n\t\treturn $this->_success;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Update Timestamp\n\t *\n\t * Update session timestamp without modifying data\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @param\tstring\t$data\tUnknown & unused\n\t * @return\tbool\n\t */\n\tpublic function updateTimestamp($id, $unknown)\n\t{\n\t\treturn $this->_redis->{$this->_setTimeout_name}($this->_key_prefix.$id, $this->_config['expiration']);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate ID\n\t *\n\t * Checks whether a session ID record exists server-side,\n\t * to enforce session.use_strict_mode.\n\t *\n\t * @param\tstring\t$id\tSession ID\n\t * @return\tbool\n\t */\n\tpublic function validateId($id)\n\t{\n\t\treturn (bool) $this->_redis->exists($this->_key_prefix.$id);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Get lock\n\t *\n\t * Acquires an (emulated) lock.\n\t *\n\t * @param\tstring\t$session_id\tSession ID\n\t * @return\tbool\n\t */\n\tprotected function _get_lock($session_id)\n\t{\n\t\t// PHP 7 reuses the SessionHandler object on regeneration,\n\t\t// so we need to check here if the lock key is for the\n\t\t// correct session ID.\n\t\tif ($this->_lock_key === $this->_key_prefix.$session_id.':lock')\n\t\t{\n\t\t\treturn $this->_redis->{$this->_setTimeout_name}($this->_lock_key, 300);\n\t\t}\n\n\t\t// 30 attempts to obtain a lock, in case another request already has it\n\t\t$lock_key = $this->_key_prefix.$session_id.':lock';\n\t\t$attempt = 0;\n\t\tdo\n\t\t{\n\t\t\tif (($ttl = $this->_redis->ttl($lock_key)) > 0)\n\t\t\t{\n\t\t\t\tsleep(1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ($ttl === -2 && ! $this->_redis->set($lock_key, time(), array('nx', 'ex' => 300)))\n\t\t\t{\n\t\t\t\t// Sleep for 1s to wait for lock releases.\n\t\t\t\tsleep(1);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telseif ( ! $this->_redis->setex($lock_key, 300, time()))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$this->_lock_key = $lock_key;\n\t\t\tbreak;\n\t\t}\n\t\twhile (++$attempt < 30);\n\n\t\tif ($attempt === 30)\n\t\t{\n\t\t\tlog_message('error', 'Session: Unable to obtain lock for '.$this->_key_prefix.$session_id.' after 30 attempts, aborting.');\n\t\t\treturn FALSE;\n\t\t}\n\t\telseif ($ttl === -1)\n\t\t{\n\t\t\tlog_message('debug', 'Session: Lock for '.$this->_key_prefix.$session_id.' had no TTL, overriding.');\n\t\t}\n\n\t\t$this->_lock = TRUE;\n\t\treturn TRUE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Release lock\n\t *\n\t * Releases a previously acquired lock\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _release_lock()\n\t{\n\t\tif (isset($this->_redis, $this->_lock_key) && $this->_lock)\n\t\t{\n\t\t\tif ( ! $this->_redis->{$this->_delete_name}($this->_lock_key))\n\t\t\t{\n\t\t\t\tlog_message('error', 'Session: Error while trying to free lock for '.$this->_lock_key);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$this->_lock_key = NULL;\n\t\t\t$this->_lock = FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Session/drivers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/libraries/Session/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "system/libraries/Table.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.1\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * HTML Table Generating Class\n *\n * Lets you create tables manually or from database result objects, or arrays.\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tHTML Tables\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/table.html\n */\nclass CI_Table {\n\n\t/**\n\t * Data for table rows\n\t *\n\t * @var array\n\t */\n\tpublic $rows\t\t= array();\n\n\t/**\n\t * Data for table heading\n\t *\n\t * @var array\n\t */\n\tpublic $heading\t\t= array();\n\n\t/**\n\t * Whether or not to automatically create the table header\n\t *\n\t * @var bool\n\t */\n\tpublic $auto_heading\t= TRUE;\n\n\t/**\n\t * Table caption\n\t *\n\t * @var string\n\t */\n\tpublic $caption\t\t= NULL;\n\n\t/**\n\t * Table layout template\n\t *\n\t * @var array\n\t */\n\tpublic $template\t= NULL;\n\n\t/**\n\t * Newline setting\n\t *\n\t * @var string\n\t */\n\tpublic $newline\t\t= \"\\n\";\n\n\t/**\n\t * Contents of empty cells\n\t *\n\t * @var string\n\t */\n\tpublic $empty_cells\t= '';\n\n\t/**\n\t * Callback for custom table layout\n\t *\n\t * @var function\n\t */\n\tpublic $function\t= NULL;\n\n\t/**\n\t * Set the template from the table config file if it exists\n\t *\n\t * @param\tarray\t$config\t(default: array())\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\t// initialize config\n\t\tforeach ($config as $key => $val)\n\t\t{\n\t\t\t$this->template[$key] = $val;\n\t\t}\n\n\t\tlog_message('info', 'Table Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the template\n\t *\n\t * @param\tarray\t$template\n\t * @return\tbool\n\t */\n\tpublic function set_template($template)\n\t{\n\t\tif ( ! is_array($template))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->template = $template;\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the table heading\n\t *\n\t * Can be passed as an array or discreet params\n\t *\n\t * @param\tmixed\n\t * @return\tCI_Table\n\t */\n\tpublic function set_heading($args = array())\n\t{\n\t\t$this->heading = $this->_prep_args(func_get_args());\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set columns. Takes a one-dimensional array as input and creates\n\t * a multi-dimensional array with a depth equal to the number of\n\t * columns. This allows a single array with many elements to be\n\t * displayed in a table that has a fixed column count.\n\t *\n\t * @param\tarray\t$array\n\t * @param\tint\t$col_limit\n\t * @return\tarray\n\t */\n\tpublic function make_columns($array = array(), $col_limit = 0)\n\t{\n\t\tif ( ! is_array($array) OR count($array) === 0 OR ! is_int($col_limit))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Turn off the auto-heading feature since it's doubtful we\n\t\t// will want headings from a one-dimensional array\n\t\t$this->auto_heading = FALSE;\n\n\t\tif ($col_limit === 0)\n\t\t{\n\t\t\treturn $array;\n\t\t}\n\n\t\t$new = array();\n\t\tdo\n\t\t{\n\t\t\t$temp = array_splice($array, 0, $col_limit);\n\n\t\t\tif (count($temp) < $col_limit)\n\t\t\t{\n\t\t\t\tfor ($i = count($temp); $i < $col_limit; $i++)\n\t\t\t\t{\n\t\t\t\t\t$temp[] = '&nbsp;';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$new[] = $temp;\n\t\t}\n\t\twhile (count($array) > 0);\n\n\t\treturn $new;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set \"empty\" cells\n\t *\n\t * Can be passed as an array or discreet params\n\t *\n\t * @param\tmixed\t$value\n\t * @return\tCI_Table\n\t */\n\tpublic function set_empty($value)\n\t{\n\t\t$this->empty_cells = $value;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add a table row\n\t *\n\t * Can be passed as an array or discreet params\n\t *\n\t * @param\tmixed\n\t * @return\tCI_Table\n\t */\n\tpublic function add_row($args = array())\n\t{\n\t\t$this->rows[] = $this->_prep_args(func_get_args());\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep Args\n\t *\n\t * Ensures a standard associative array format for all cell data\n\t *\n\t * @param\tarray\n\t * @return\tarray\n\t */\n\tprotected function _prep_args($args)\n\t{\n\t\t// If there is no $args[0], skip this and treat as an associative array\n\t\t// This can happen if there is only a single key, for example this is passed to table->generate\n\t\t// array(array('foo'=>'bar'))\n\t\tif (isset($args[0]) && count($args) === 1 && is_array($args[0]) && ! isset($args[0]['data']))\n\t\t{\n\t\t\t$args = $args[0];\n\t\t}\n\n\t\tforeach ($args as $key => $val)\n\t\t{\n\t\t\tis_array($val) OR $args[$key] = array('data' => $val);\n\t\t}\n\n\t\treturn $args;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add a table caption\n\t *\n\t * @param\tstring\t$caption\n\t * @return\tCI_Table\n\t */\n\tpublic function set_caption($caption)\n\t{\n\t\t$this->caption = $caption;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate the table\n\t *\n\t * @param\tmixed\t$table_data\n\t * @return\tstring\n\t */\n\tpublic function generate($table_data = NULL)\n\t{\n\t\t// The table data can optionally be passed to this function\n\t\t// either as a database result object or an array\n\t\tif ( ! empty($table_data))\n\t\t{\n\t\t\tif ($table_data instanceof CI_DB_result)\n\t\t\t{\n\t\t\t\t$this->_set_from_db_result($table_data);\n\t\t\t}\n\t\t\telseif (is_array($table_data))\n\t\t\t{\n\t\t\t\t$this->_set_from_array($table_data);\n\t\t\t}\n\t\t}\n\n\t\t// Is there anything to display? No? Smite them!\n\t\tif (empty($this->heading) && empty($this->rows))\n\t\t{\n\t\t\treturn 'Undefined table data';\n\t\t}\n\n\t\t// Compile and validate the template date\n\t\t$this->_compile_template();\n\n\t\t// Validate a possibly existing custom cell manipulation function\n\t\tif (isset($this->function) && ! is_callable($this->function))\n\t\t{\n\t\t\t$this->function = NULL;\n\t\t}\n\n\t\t// Build the table!\n\n\t\t$out = $this->template['table_open'].$this->newline;\n\n\t\t// Add any caption here\n\t\tif ($this->caption)\n\t\t{\n\t\t\t$out .= '<caption>'.$this->caption.'</caption>'.$this->newline;\n\t\t}\n\n\t\t// Is there a table heading to display?\n\t\tif ( ! empty($this->heading))\n\t\t{\n\t\t\t$out .= $this->template['thead_open'].$this->newline.$this->template['heading_row_start'].$this->newline;\n\n\t\t\tforeach ($this->heading as $heading)\n\t\t\t{\n\t\t\t\t$temp = $this->template['heading_cell_start'];\n\n\t\t\t\tforeach ($heading as $key => $val)\n\t\t\t\t{\n\t\t\t\t\tif ($key !== 'data')\n\t\t\t\t\t{\n\t\t\t\t\t\t$temp = str_replace('<th', '<th '.$key.'=\"'.$val.'\"', $temp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$out .= $temp.(isset($heading['data']) ? $heading['data'] : '').$this->template['heading_cell_end'];\n\t\t\t}\n\n\t\t\t$out .= $this->template['heading_row_end'].$this->newline.$this->template['thead_close'].$this->newline;\n\t\t}\n\n\t\t// Build the table rows\n\t\tif ( ! empty($this->rows))\n\t\t{\n\t\t\t$out .= $this->template['tbody_open'].$this->newline;\n\n\t\t\t$i = 1;\n\t\t\tforeach ($this->rows as $row)\n\t\t\t{\n\t\t\t\tif ( ! is_array($row))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// We use modulus to alternate the row colors\n\t\t\t\t$name = fmod($i++, 2) ? '' : 'alt_';\n\n\t\t\t\t$out .= $this->template['row_'.$name.'start'].$this->newline;\n\n\t\t\t\tforeach ($row as $cell)\n\t\t\t\t{\n\t\t\t\t\t$temp = $this->template['cell_'.$name.'start'];\n\n\t\t\t\t\tforeach ($cell as $key => $val)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ($key !== 'data')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$temp = str_replace('<td', '<td '.$key.'=\"'.$val.'\"', $temp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$cell = isset($cell['data']) ? $cell['data'] : '';\n\t\t\t\t\t$out .= $temp;\n\n\t\t\t\t\tif ($cell === '' OR $cell === NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\t$out .= $this->empty_cells;\n\t\t\t\t\t}\n\t\t\t\t\telseif (isset($this->function))\n\t\t\t\t\t{\n\t\t\t\t\t\t$out .= call_user_func($this->function, $cell);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$out .= $cell;\n\t\t\t\t\t}\n\n\t\t\t\t\t$out .= $this->template['cell_'.$name.'end'];\n\t\t\t\t}\n\n\t\t\t\t$out .= $this->template['row_'.$name.'end'].$this->newline;\n\t\t\t}\n\n\t\t\t$out .= $this->template['tbody_close'].$this->newline;\n\t\t}\n\n\t\t$out .= $this->template['table_close'];\n\n\t\t// Clear table class properties before generating the table\n\t\t$this->clear();\n\n\t\treturn $out;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Clears the table arrays.  Useful if multiple tables are being generated\n\t *\n\t * @return\tCI_Table\n\t */\n\tpublic function clear()\n\t{\n\t\t$this->rows = array();\n\t\t$this->heading = array();\n\t\t$this->auto_heading = TRUE;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set table data from a database result object\n\t *\n\t * @param\tCI_DB_result\t$object\tDatabase result object\n\t * @return\tvoid\n\t */\n\tprotected function _set_from_db_result($object)\n\t{\n\t\t// First generate the headings from the table column names\n\t\tif ($this->auto_heading === TRUE && empty($this->heading))\n\t\t{\n\t\t\t$this->heading = $this->_prep_args($object->list_fields());\n\t\t}\n\n\t\tforeach ($object->result_array() as $row)\n\t\t{\n\t\t\t$this->rows[] = $this->_prep_args($row);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set table data from an array\n\t *\n\t * @param\tarray\t$data\n\t * @return\tvoid\n\t */\n\tprotected function _set_from_array($data)\n\t{\n\t\tif ($this->auto_heading === TRUE && empty($this->heading))\n\t\t{\n\t\t\t$this->heading = $this->_prep_args(array_shift($data));\n\t\t}\n\n\t\tforeach ($data as &$row)\n\t\t{\n\t\t\t$this->rows[] = $this->_prep_args($row);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile Template\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _compile_template()\n\t{\n\t\tif ($this->template === NULL)\n\t\t{\n\t\t\t$this->template = $this->_default_template();\n\t\t\treturn;\n\t\t}\n\n\t\t$this->temp = $this->_default_template();\n\t\tforeach (array('table_open', 'thead_open', 'thead_close', 'heading_row_start', 'heading_row_end', 'heading_cell_start', 'heading_cell_end', 'tbody_open', 'tbody_close', 'row_start', 'row_end', 'cell_start', 'cell_end', 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close') as $val)\n\t\t{\n\t\t\tif ( ! isset($this->template[$val]))\n\t\t\t{\n\t\t\t\t$this->template[$val] = $this->temp[$val];\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Default Template\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _default_template()\n\t{\n\t\treturn array(\n\t\t\t'table_open'\t\t=> '<table border=\"0\" cellpadding=\"4\" cellspacing=\"0\">',\n\n\t\t\t'thead_open'\t\t=> '<thead>',\n\t\t\t'thead_close'\t\t=> '</thead>',\n\n\t\t\t'heading_row_start'\t=> '<tr>',\n\t\t\t'heading_row_end'\t=> '</tr>',\n\t\t\t'heading_cell_start'\t=> '<th>',\n\t\t\t'heading_cell_end'\t=> '</th>',\n\n\t\t\t'tbody_open'\t\t=> '<tbody>',\n\t\t\t'tbody_close'\t\t=> '</tbody>',\n\n\t\t\t'row_start'\t\t=> '<tr>',\n\t\t\t'row_end'\t\t=> '</tr>',\n\t\t\t'cell_start'\t\t=> '<td>',\n\t\t\t'cell_end'\t\t=> '</td>',\n\n\t\t\t'row_alt_start'\t\t=> '<tr>',\n\t\t\t'row_alt_end'\t\t=> '</tr>',\n\t\t\t'cell_alt_start'\t=> '<td>',\n\t\t\t'cell_alt_end'\t\t=> '</td>',\n\n\t\t\t'table_close'\t\t=> '</table>'\n\t\t);\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Trackback.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Trackback Class\n *\n * Trackback Sending/Receiving Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tTrackbacks\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/trackback.html\n */\nclass CI_Trackback {\n\n\t/**\n\t * Character set\n\t *\n\t * @var\tstring\n\t */\n\tpublic $charset = 'UTF-8';\n\n\t/**\n\t * Trackback data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $data = array(\n\t\t'url' => '',\n\t\t'title' => '',\n\t\t'excerpt' => '',\n\t\t'blog_name' => '',\n\t\t'charset' => ''\n\t);\n\n\t/**\n\t * Convert ASCII flag\n\t *\n\t * Whether to convert high-ASCII and MS Word\n\t * characters to HTML entities.\n\t *\n\t * @var\tbool\n\t */\n\tpublic $convert_ascii = TRUE;\n\n\t/**\n\t * Response\n\t *\n\t * @var\tstring\n\t */\n\tpublic $response = '';\n\n\t/**\n\t * Error messages list\n\t *\n\t * @var\tstring[]\n\t */\n\tpublic $error_msg = array();\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tlog_message('info', 'Trackback Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send Trackback\n\t *\n\t * @param\tarray\n\t * @return\tbool\n\t */\n\tpublic function send($tb_data)\n\t{\n\t\tif ( ! is_array($tb_data))\n\t\t{\n\t\t\t$this->set_error('The send() method must be passed an array');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Pre-process the Trackback Data\n\t\tforeach (array('url', 'title', 'excerpt', 'blog_name', 'ping_url') as $item)\n\t\t{\n\t\t\tif ( ! isset($tb_data[$item]))\n\t\t\t{\n\t\t\t\t$this->set_error('Required item missing: '.$item);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tswitch ($item)\n\t\t\t{\n\t\t\t\tcase 'ping_url':\n\t\t\t\t\t$$item = $this->extract_urls($tb_data[$item]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'excerpt':\n\t\t\t\t\t$$item = $this->limit_characters($this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'url':\n\t\t\t\t\t$$item = str_replace('&#45;', '-', $this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$$item = $this->convert_xml(strip_tags(stripslashes($tb_data[$item])));\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Convert High ASCII Characters\n\t\t\tif ($this->convert_ascii === TRUE && in_array($item, array('excerpt', 'title', 'blog_name'), TRUE))\n\t\t\t{\n\t\t\t\t$$item = $this->convert_ascii($$item);\n\t\t\t}\n\t\t}\n\n\t\t// Build the Trackback data string\n\t\t$charset = isset($tb_data['charset']) ? $tb_data['charset'] : $this->charset;\n\n\t\t$data = 'url='.rawurlencode($url).'&title='.rawurlencode($title).'&blog_name='.rawurlencode($blog_name)\n\t\t\t.'&excerpt='.rawurlencode($excerpt).'&charset='.rawurlencode($charset);\n\n\t\t// Send Trackback(s)\n\t\t$return = TRUE;\n\t\tif (count($ping_url) > 0)\n\t\t{\n\t\t\tforeach ($ping_url as $url)\n\t\t\t{\n\t\t\t\tif ($this->process($url, $data) === FALSE)\n\t\t\t\t{\n\t\t\t\t\t$return = FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $return;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Receive Trackback  Data\n\t *\n\t * This function simply validates the incoming TB data.\n\t * It returns FALSE on failure and TRUE on success.\n\t * If the data is valid it is set to the $this->data array\n\t * so that it can be inserted into a database.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function receive()\n\t{\n\t\tforeach (array('url', 'title', 'blog_name', 'excerpt') as $val)\n\t\t{\n\t\t\tif (empty($_POST[$val]))\n\t\t\t{\n\t\t\t\t$this->set_error('The following required POST variable is missing: '.$val);\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\t$this->data['charset'] = isset($_POST['charset']) ? strtoupper(trim($_POST['charset'])) : 'auto';\n\n\t\t\tif ($val !== 'url' && MB_ENABLED === TRUE)\n\t\t\t{\n\t\t\t\tif (MB_ENABLED === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$_POST[$val] = mb_convert_encoding($_POST[$val], $this->charset, $this->data['charset']);\n\t\t\t\t}\n\t\t\t\telseif (ICONV_ENABLED === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$_POST[$val] = @iconv($this->data['charset'], $this->charset.'//IGNORE', $_POST[$val]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$_POST[$val] = ($val !== 'url') ? $this->convert_xml(strip_tags($_POST[$val])) : strip_tags($_POST[$val]);\n\n\t\t\tif ($val === 'excerpt')\n\t\t\t{\n\t\t\t\t$_POST['excerpt'] = $this->limit_characters($_POST['excerpt']);\n\t\t\t}\n\n\t\t\t$this->data[$val] = $_POST[$val];\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send Trackback Error Message\n\t *\n\t * Allows custom errors to be set. By default it\n\t * sends the \"incomplete information\" error, as that's\n\t * the most common one.\n\t *\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function send_error($message = 'Incomplete Information')\n\t{\n\t\texit('<?xml version=\"1.0\" encoding=\"utf-8\"?'.\">\\n<response>\\n<error>1</error>\\n<message>\".$message.\"</message>\\n</response>\");\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send Trackback Success Message\n\t *\n\t * This should be called when a trackback has been\n\t * successfully received and inserted.\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function send_success()\n\t{\n\t\texit('<?xml version=\"1.0\" encoding=\"utf-8\"?'.\">\\n<response>\\n<error>0</error>\\n</response>\");\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fetch a particular item\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function data($item)\n\t{\n\t\treturn isset($this->data[$item]) ? $this->data[$item] : '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Process Trackback\n\t *\n\t * Opens a socket connection and passes the data to\n\t * the server. Returns TRUE on success, FALSE on failure\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tbool\n\t */\n\tpublic function process($url, $data)\n\t{\n\t\t$target = parse_url($url);\n\n\t\t// Open the socket\n\t\tif ( ! $fp = @fsockopen($target['host'], 80))\n\t\t{\n\t\t\t$this->set_error('Invalid Connection: '.$url);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Build the path\n\t\t$path = isset($target['path']) ? $target['path'] : $url;\n\t\tempty($target['query']) OR $path .= '?'.$target['query'];\n\n\t\t// Add the Trackback ID to the data string\n\t\tif ($id = $this->get_id($url))\n\t\t{\n\t\t\t$data = 'tb_id='.$id.'&'.$data;\n\t\t}\n\n\t\t// Transfer the data\n\t\tfputs($fp, 'POST '.$path.\" HTTP/1.0\\r\\n\");\n\t\tfputs($fp, 'Host: '.$target['host'].\"\\r\\n\");\n\t\tfputs($fp, \"Content-type: application/x-www-form-urlencoded\\r\\n\");\n\t\tfputs($fp, 'Content-length: '.strlen($data).\"\\r\\n\");\n\t\tfputs($fp, \"Connection: close\\r\\n\\r\\n\");\n\t\tfputs($fp, $data);\n\n\t\t// Was it successful?\n\n\t\t$this->response = '';\n\t\twhile ( ! feof($fp))\n\t\t{\n\t\t\t$this->response .= fgets($fp, 128);\n\t\t}\n\t\t@fclose($fp);\n\n\t\tif (stripos($this->response, '<error>0</error>') === FALSE)\n\t\t{\n\t\t\t$message = preg_match('/<message>(.*?)<\\/message>/is', $this->response, $match)\n\t\t\t\t? trim($match[1])\n\t\t\t\t: 'An unknown error was encountered';\n\t\t\t$this->set_error($message);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Extract Trackback URLs\n\t *\n\t * This function lets multiple trackbacks be sent.\n\t * It takes a string of URLs (separated by comma or\n\t * space) and puts each URL into an array\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function extract_urls($urls)\n\t{\n\t\t// Remove the pesky white space and replace with a comma, then replace doubles.\n\t\t$urls = str_replace(',,', ',', preg_replace('/\\s*(\\S+)\\s*/', '\\\\1,', $urls));\n\n\t\t// Break into an array via commas and remove duplicates\n\t\t$urls = array_unique(preg_split('/[,]/', rtrim($urls, ',')));\n\n\t\tarray_walk($urls, array($this, 'validate_url'));\n\t\treturn $urls;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate URL\n\t *\n\t * Simply adds \"http://\" if missing\n\t *\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function validate_url(&$url)\n\t{\n\t\t$url = trim($url);\n\n\t\tif (stripos($url, 'http') !== 0)\n\t\t{\n\t\t\t$url = 'http://'.$url;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Find the Trackback URL's ID\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function get_id($url)\n\t{\n\t\t$tb_id = '';\n\n\t\tif (strpos($url, '?') !== FALSE)\n\t\t{\n\t\t\t$tb_array = explode('/', $url);\n\t\t\t$tb_end   = $tb_array[count($tb_array)-1];\n\n\t\t\tif ( ! is_numeric($tb_end))\n\t\t\t{\n\t\t\t\t$tb_end  = $tb_array[count($tb_array)-2];\n\t\t\t}\n\n\t\t\t$tb_array = explode('=', $tb_end);\n\t\t\t$tb_id\t= $tb_array[count($tb_array)-1];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$url = rtrim($url, '/');\n\n\t\t\t$tb_array = explode('/', $url);\n\t\t\t$tb_id\t= $tb_array[count($tb_array)-1];\n\n\t\t\tif ( ! is_numeric($tb_id))\n\t\t\t{\n\t\t\t\t$tb_id = $tb_array[count($tb_array)-2];\n\t\t\t}\n\t\t}\n\n\t\treturn ctype_digit((string) $tb_id) ? $tb_id : FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Convert Reserved XML characters to Entities\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function convert_xml($str)\n\t{\n\t\t$temp = '__TEMP_AMPERSANDS__';\n\n\t\t$str = preg_replace(array('/&#(\\d+);/', '/&(\\w+);/'), $temp.'\\\\1;', $str);\n\n\t\t$str = str_replace(array('&', '<', '>', '\"', \"'\", '-'),\n\t\t\t\t\tarray('&amp;', '&lt;', '&gt;', '&quot;', '&#39;', '&#45;'),\n\t\t\t\t\t$str);\n\n\t\treturn preg_replace(array('/'.$temp.'(\\d+);/', '/'.$temp.'(\\w+);/'), array('&#\\\\1;', '&\\\\1;'), $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Character limiter\n\t *\n\t * Limits the string based on the character count. Will preserve complete words.\n\t *\n\t * @param\tstring\n\t * @param\tint\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function limit_characters($str, $n = 500, $end_char = '&#8230;')\n\t{\n\t\tif (strlen($str) < $n)\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t$str = preg_replace('/\\s+/', ' ', str_replace(array(\"\\r\\n\", \"\\r\", \"\\n\"), ' ', $str));\n\n\t\tif (strlen($str) <= $n)\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t$out = '';\n\t\tforeach (explode(' ', trim($str)) as $val)\n\t\t{\n\t\t\t$out .= $val.' ';\n\t\t\tif (strlen($out) >= $n)\n\t\t\t{\n\t\t\t\treturn rtrim($out).$end_char;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * High ASCII to Entities\n\t *\n\t * Converts Hight ascii text and MS Word special chars\n\t * to character entities\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function convert_ascii($str)\n\t{\n\t\t$count\t= 1;\n\t\t$out\t= '';\n\t\t$temp\t= array();\n\n\t\tfor ($i = 0, $s = strlen($str); $i < $s; $i++)\n\t\t{\n\t\t\t$ordinal = ord($str[$i]);\n\n\t\t\tif ($ordinal < 128)\n\t\t\t{\n\t\t\t\t$out .= $str[$i];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (count($temp) === 0)\n\t\t\t\t{\n\t\t\t\t\t$count = ($ordinal < 224) ? 2 : 3;\n\t\t\t\t}\n\n\t\t\t\t$temp[] = $ordinal;\n\n\t\t\t\tif (count($temp) === $count)\n\t\t\t\t{\n\t\t\t\t\t$number = ($count === 3)\n\t\t\t\t\t\t? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64)\n\t\t\t\t\t\t: (($temp[0] % 32) * 64) + ($temp[1] % 64);\n\n\t\t\t\t\t$out .= '&#'.$number.';';\n\t\t\t\t\t$count = 1;\n\t\t\t\t\t$temp = array();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $out;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set error message\n\t *\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function set_error($msg)\n\t{\n\t\tlog_message('error', $msg);\n\t\t$this->error_msg[] = $msg;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Show error messages\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function display_errors($open = '<p>', $close = '</p>')\n\t{\n\t\treturn (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : '';\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Typography.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Typography Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tHelpers\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/typography.html\n */\nclass CI_Typography {\n\n\t/**\n\t * Block level elements that should not be wrapped inside <p> tags\n\t *\n\t * @var string\n\t */\n\tpublic $block_elements = 'address|blockquote|div|dl|fieldset|form|h\\d|hr|noscript|object|ol|p|pre|script|table|ul';\n\n\t/**\n\t * Elements that should not have <p> and <br /> tags within them.\n\t *\n\t * @var string\n\t */\n\tpublic $skip_elements\t= 'p|pre|ol|ul|dl|object|table|h\\d';\n\n\t/**\n\t * Tags we want the parser to completely ignore when splitting the string.\n\t *\n\t * @var string\n\t */\n\tpublic $inline_elements = 'a|abbr|acronym|b|bdo|big|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|q|samp|select|small|span|strong|sub|sup|textarea|tt|var';\n\n\t/**\n\t * array of block level elements that require inner content to be within another block level element\n\t *\n\t * @var array\n\t */\n\tpublic $inner_block_required = array('blockquote');\n\n\t/**\n\t * the last block element parsed\n\t *\n\t * @var string\n\t */\n\tpublic $last_block_element = '';\n\n\t/**\n\t * whether or not to protect quotes within { curly braces }\n\t *\n\t * @var bool\n\t */\n\tpublic $protect_braced_quotes = FALSE;\n\n\t/**\n\t * Auto Typography\n\t *\n\t * This function converts text, making it typographically correct:\n\t *\t- Converts double spaces into paragraphs.\n\t *\t- Converts single line breaks into <br /> tags\n\t *\t- Converts single and double quotes into correctly facing curly quote entities.\n\t *\t- Converts three dots into ellipsis.\n\t *\t- Converts double dashes into em-dashes.\n\t *  - Converts two spaces into entities\n\t *\n\t * @param\tstring\n\t * @param\tbool\twhether to reduce more then two consecutive newlines to two\n\t * @return\tstring\n\t */\n\tpublic function auto_typography($str, $reduce_linebreaks = FALSE)\n\t{\n\t\tif ($str === '')\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\t// Standardize Newlines to make matching easier\n\t\tif (strpos($str, \"\\r\") !== FALSE)\n\t\t{\n\t\t\t$str = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n\t\t}\n\n\t\t// Reduce line breaks.  If there are more than two consecutive linebreaks\n\t\t// we'll compress them down to a maximum of two since there's no benefit to more.\n\t\tif ($reduce_linebreaks === TRUE)\n\t\t{\n\t\t\t$str = preg_replace(\"/\\n\\n+/\", \"\\n\\n\", $str);\n\t\t}\n\n\t\t// HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed\n\t\t$html_comments = array();\n\t\tif (strpos($str, '<!--') !== FALSE && preg_match_all('#(<!\\-\\-.*?\\-\\->)#s', $str, $matches))\n\t\t{\n\t\t\tfor ($i = 0, $total = count($matches[0]); $i < $total; $i++)\n\t\t\t{\n\t\t\t\t$html_comments[] = $matches[0][$i];\n\t\t\t\t$str = str_replace($matches[0][$i], '{@HC'.$i.'}', $str);\n\t\t\t}\n\t\t}\n\n\t\t// match and yank <pre> tags if they exist.  It's cheaper to do this separately since most content will\n\t\t// not contain <pre> tags, and it keeps the PCRE patterns below simpler and faster\n\t\tif (strpos($str, '<pre') !== FALSE)\n\t\t{\n\t\t\t$str = preg_replace_callback('#<pre.*?>.*?</pre>#si', array($this, '_protect_characters'), $str);\n\t\t}\n\n\t\t// Convert quotes within tags to temporary markers.\n\t\t$str = preg_replace_callback('#<.+?>#si', array($this, '_protect_characters'), $str);\n\n\t\t// Do the same with braces if necessary\n\t\tif ($this->protect_braced_quotes === TRUE)\n\t\t{\n\t\t\t$str = preg_replace_callback('#\\{.+?\\}#si', array($this, '_protect_characters'), $str);\n\t\t}\n\n\t\t// Convert \"ignore\" tags to temporary marker.  The parser splits out the string at every tag\n\t\t// it encounters.  Certain inline tags, like image tags, links, span tags, etc. will be\n\t\t// adversely affected if they are split out so we'll convert the opening bracket < temporarily to: {@TAG}\n\t\t$str = preg_replace('#<(/*)('.$this->inline_elements.')([ >])#i', '{@TAG}\\\\1\\\\2\\\\3', $str);\n\n\t\t/* Split the string at every tag. This expression creates an array with this prototype:\n\t\t *\n\t\t *\t[array]\n\t\t *\t{\n\t\t *\t\t[0] = <opening tag>\n\t\t *\t\t[1] = Content...\n\t\t *\t\t[2] = <closing tag>\n\t\t *\t\tEtc...\n\t\t *\t}\n\t\t */\n\t\t$chunks = preg_split('/(<(?:[^<>]+(?:\"[^\"]*\"|\\'[^\\']*\\')?)+>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);\n\n\t\t// Build our finalized string.  We cycle through the array, skipping tags, and processing the contained text\n\t\t$str = '';\n\t\t$process = TRUE;\n\n\t\tfor ($i = 0, $c = count($chunks) - 1; $i <= $c; $i++)\n\t\t{\n\t\t\t// Are we dealing with a tag? If so, we'll skip the processing for this cycle.\n\t\t\t// Well also set the \"process\" flag which allows us to skip <pre> tags and a few other things.\n\t\t\tif (preg_match('#<(/*)('.$this->block_elements.').*?>#', $chunks[$i], $match))\n\t\t\t{\n\t\t\t\tif (preg_match('#'.$this->skip_elements.'#', $match[2]))\n\t\t\t\t{\n\t\t\t\t\t$process = ($match[1] === '/');\n\t\t\t\t}\n\n\t\t\t\tif ($match[1] === '')\n\t\t\t\t{\n\t\t\t\t\t$this->last_block_element = $match[2];\n\t\t\t\t}\n\n\t\t\t\t$str .= $chunks[$i];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ($process === FALSE)\n\t\t\t{\n\t\t\t\t$str .= $chunks[$i];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//  Force a newline to make sure end tags get processed by _format_newlines()\n\t\t\tif ($i === $c)\n\t\t\t{\n\t\t\t\t$chunks[$i] .= \"\\n\";\n\t\t\t}\n\n\t\t\t//  Convert Newlines into <p> and <br /> tags\n\t\t\t$str .= $this->_format_newlines($chunks[$i]);\n\t\t}\n\n\t\t// No opening block level tag? Add it if needed.\n\t\tif ( ! preg_match('/^\\s*<(?:'.$this->block_elements.')/i', $str))\n\t\t{\n\t\t\t$str = preg_replace('/^(.*?)<('.$this->block_elements.')/i', '<p>$1</p><$2', $str);\n\t\t}\n\n\t\t// Convert quotes, elipsis, em-dashes, non-breaking spaces, and ampersands\n\t\t$str = $this->format_characters($str);\n\n\t\t// restore HTML comments\n\t\tfor ($i = 0, $total = count($html_comments); $i < $total; $i++)\n\t\t{\n\t\t\t// remove surrounding paragraph tags, but only if there's an opening paragraph tag\n\t\t\t// otherwise HTML comments at the ends of paragraphs will have the closing tag removed\n\t\t\t// if '<p>{@HC1}' then replace <p>{@HC1}</p> with the comment, else replace only {@HC1} with the comment\n\t\t\t$str = preg_replace('#(?(?=<p>\\{@HC'.$i.'\\})<p>\\{@HC'.$i.'\\}(\\s*</p>)|\\{@HC'.$i.'\\})#s', $html_comments[$i], $str);\n\t\t}\n\n\t\t// Final clean up\n\t\t$table = array(\n\n\t\t\t\t\t\t// If the user submitted their own paragraph tags within the text\n\t\t\t\t\t\t// we will retain them instead of using our tags.\n\t\t\t\t\t\t'/(<p[^>*?]>)<p>/'\t=> '$1', // <?php BBEdit syntax coloring bug fix\n\n\t\t\t\t\t\t// Reduce multiple instances of opening/closing paragraph tags to a single one\n\t\t\t\t\t\t'#(</p>)+#'\t\t\t=> '</p>',\n\t\t\t\t\t\t'/(<p>\\W*<p>)+/'\t=> '<p>',\n\n\t\t\t\t\t\t// Clean up stray paragraph tags that appear before block level elements\n\t\t\t\t\t\t'#<p></p><('.$this->block_elements.')#'\t=> '<$1',\n\n\t\t\t\t\t\t// Clean up stray non-breaking spaces preceding block elements\n\t\t\t\t\t\t'#(&nbsp;\\s*)+<('.$this->block_elements.')#'\t=> '  <$2',\n\n\t\t\t\t\t\t// Replace the temporary markers we added earlier\n\t\t\t\t\t\t'/\\{@TAG\\}/'\t\t=> '<',\n\t\t\t\t\t\t'/\\{@DQ\\}/'\t\t\t=> '\"',\n\t\t\t\t\t\t'/\\{@SQ\\}/'\t\t\t=> \"'\",\n\t\t\t\t\t\t'/\\{@DD\\}/'\t\t\t=> '--',\n\t\t\t\t\t\t'/\\{@NBS\\}/'\t\t=> '  ',\n\n\t\t\t\t\t\t// An unintended consequence of the _format_newlines function is that\n\t\t\t\t\t\t// some of the newlines get truncated, resulting in <p> tags\n\t\t\t\t\t\t// starting immediately after <block> tags on the same line.\n\t\t\t\t\t\t// This forces a newline after such occurrences, which looks much nicer.\n\t\t\t\t\t\t\"/><p>\\n/\"\t\t\t=> \">\\n<p>\",\n\n\t\t\t\t\t\t// Similarly, there might be cases where a closing </block> will follow\n\t\t\t\t\t\t// a closing </p> tag, so we'll correct it by adding a newline in between\n\t\t\t\t\t\t'#</p></#'\t\t\t=> \"</p>\\n</\"\n\t\t\t\t\t\t);\n\n\t\t// Do we need to reduce empty lines?\n\t\tif ($reduce_linebreaks === TRUE)\n\t\t{\n\t\t\t$table['#<p>\\n*</p>#'] = '';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If we have empty paragraph tags we add a non-breaking space\n\t\t\t// otherwise most browsers won't treat them as true paragraphs\n\t\t\t$table['#<p></p>#'] = '<p>&nbsp;</p>';\n\t\t}\n\n\t\treturn preg_replace(array_keys($table), $table, $str);\n\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Format Characters\n\t *\n\t * This function mainly converts double and single quotes\n\t * to curly entities, but it also converts em-dashes,\n\t * double spaces, and ampersands\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function format_characters($str)\n\t{\n\t\tstatic $table;\n\n\t\tif ( ! isset($table))\n\t\t{\n\t\t\t$table = array(\n\t\t\t\t\t\t\t// nested smart quotes, opening and closing\n\t\t\t\t\t\t\t// note that rules for grammar (English) allow only for two levels deep\n\t\t\t\t\t\t\t// and that single quotes are _supposed_ to always be on the outside\n\t\t\t\t\t\t\t// but we'll accommodate both\n\t\t\t\t\t\t\t// Note that in all cases, whitespace is the primary determining factor\n\t\t\t\t\t\t\t// on which direction to curl, with non-word characters like punctuation\n\t\t\t\t\t\t\t// being a secondary factor only after whitespace is addressed.\n\t\t\t\t\t\t\t'/\\'\"(\\s|$)/'\t\t\t\t\t=> '&#8217;&#8221;$1',\n\t\t\t\t\t\t\t'/(^|\\s|<p>)\\'\"/'\t\t\t\t=> '$1&#8216;&#8220;',\n\t\t\t\t\t\t\t'/\\'\"(\\W)/'\t\t\t\t\t\t=> '&#8217;&#8221;$1',\n\t\t\t\t\t\t\t'/(\\W)\\'\"/'\t\t\t\t\t\t=> '$1&#8216;&#8220;',\n\t\t\t\t\t\t\t'/\"\\'(\\s|$)/'\t\t\t\t\t=> '&#8221;&#8217;$1',\n\t\t\t\t\t\t\t'/(^|\\s|<p>)\"\\'/'\t\t\t\t=> '$1&#8220;&#8216;',\n\t\t\t\t\t\t\t'/\"\\'(\\W)/'\t\t\t\t\t\t=> '&#8221;&#8217;$1',\n\t\t\t\t\t\t\t'/(\\W)\"\\'/'\t\t\t\t\t\t=> '$1&#8220;&#8216;',\n\n\t\t\t\t\t\t\t// single quote smart quotes\n\t\t\t\t\t\t\t'/\\'(\\s|$)/'\t\t\t\t\t=> '&#8217;$1',\n\t\t\t\t\t\t\t'/(^|\\s|<p>)\\'/'\t\t\t\t=> '$1&#8216;',\n\t\t\t\t\t\t\t'/\\'(\\W)/'\t\t\t\t\t\t=> '&#8217;$1',\n\t\t\t\t\t\t\t'/(\\W)\\'/'\t\t\t\t\t\t=> '$1&#8216;',\n\n\t\t\t\t\t\t\t// double quote smart quotes\n\t\t\t\t\t\t\t'/\"(\\s|$)/'\t\t\t\t\t\t=> '&#8221;$1',\n\t\t\t\t\t\t\t'/(^|\\s|<p>)\"/'\t\t\t\t\t=> '$1&#8220;',\n\t\t\t\t\t\t\t'/\"(\\W)/'\t\t\t\t\t\t=> '&#8221;$1',\n\t\t\t\t\t\t\t'/(\\W)\"/'\t\t\t\t\t\t=> '$1&#8220;',\n\n\t\t\t\t\t\t\t// apostrophes\n\t\t\t\t\t\t\t\"/(\\w)'(\\w)/\"\t\t\t\t\t=> '$1&#8217;$2',\n\n\t\t\t\t\t\t\t// Em dash and ellipses dots\n\t\t\t\t\t\t\t'/\\s?\\-\\-\\s?/'\t\t\t\t\t=> '&#8212;',\n\t\t\t\t\t\t\t'/(\\w)\\.{3}/'\t\t\t\t\t=> '$1&#8230;',\n\n\t\t\t\t\t\t\t// double space after sentences\n\t\t\t\t\t\t\t'/(\\W)  /'\t\t\t\t\t\t=> '$1&nbsp; ',\n\n\t\t\t\t\t\t\t// ampersands, if not a character entity\n\t\t\t\t\t\t\t'/&(?!#?[a-zA-Z0-9]{2,};)/'\t\t=> '&amp;'\n\t\t\t\t\t\t);\n\t\t}\n\n\t\treturn preg_replace(array_keys($table), $table, $str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Format Newlines\n\t *\n\t * Converts newline characters into either <p> tags or <br />\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tprotected function _format_newlines($str)\n\t{\n\t\tif ($str === '' OR (strpos($str, \"\\n\") === FALSE && ! in_array($this->last_block_element, $this->inner_block_required)))\n\t\t{\n\t\t\treturn $str;\n\t\t}\n\n\t\t// Convert two consecutive newlines to paragraphs\n\t\t$str = str_replace(\"\\n\\n\", \"</p>\\n\\n<p>\", $str);\n\n\t\t// Convert single spaces to <br /> tags\n\t\t$str = preg_replace(\"/([^\\n])(\\n)([^\\n])/\", '\\\\1<br />\\\\2\\\\3', $str);\n\n\t\t// Wrap the whole enchilada in enclosing paragraphs\n\t\tif ($str !== \"\\n\")\n\t\t{\n\t\t\t// We trim off the right-side new line so that the closing </p> tag\n\t\t\t// will be positioned immediately following the string, matching\n\t\t\t// the behavior of the opening <p> tag\n\t\t\t$str =  '<p>'.rtrim($str).'</p>';\n\t\t}\n\n\t\t// Remove empty paragraphs if they are on the first line, as this\n\t\t// is a potential unintended consequence of the previous code\n\t\treturn preg_replace('/<p><\\/p>(.*)/', '\\\\1', $str, 1);\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Protect Characters\n\t *\n\t * Protects special characters from being formatted later\n\t * We don't want quotes converted within tags so we'll temporarily convert them to {@DQ} and {@SQ}\n\t * and we don't want double dashes converted to emdash entities, so they are marked with {@DD}\n\t * likewise double spaces are converted to {@NBS} to prevent entity conversion\n\t *\n\t * @param\tarray\n\t * @return\tstring\n\t */\n\tprotected function _protect_characters($match)\n\t{\n\t\treturn str_replace(array(\"'\",'\"','--','  '), array('{@SQ}', '{@DQ}', '{@DD}', '{@NBS}'), $match[0]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Convert newlines to HTML line breaks except within PRE tags\n\t *\n\t * @param\tstring\n\t * @return\tstring\n\t */\n\tpublic function nl2br_except_pre($str)\n\t{\n\t\t$newstr = '';\n\t\tfor ($ex = explode('pre>', $str), $ct = count($ex), $i = 0; $i < $ct; $i++)\n\t\t{\n\t\t\t$newstr .= (($i % 2) === 0) ? nl2br($ex[$i]) : $ex[$i];\n\t\t\tif ($ct - 1 !== $i)\n\t\t\t{\n\t\t\t\t$newstr .= 'pre>';\n\t\t\t}\n\t\t}\n\n\t\treturn $newstr;\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Unit_test.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.3.1\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Unit Testing Class\n *\n * Simple testing class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tUnitTesting\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/unit_testing.html\n */\nclass CI_Unit_test {\n\n\t/**\n\t * Active flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $active = TRUE;\n\n\t/**\n\t * Test results\n\t *\n\t * @var\tarray\n\t */\n\tpublic $results = array();\n\n\t/**\n\t * Strict comparison flag\n\t *\n\t * Whether to use === or == when comparing\n\t *\n\t * @var\tbool\n\t */\n\tpublic $strict = FALSE;\n\n\t/**\n\t * Template\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_template = NULL;\n\n\t/**\n\t * Template rows\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_template_rows = NULL;\n\n\t/**\n\t * List of visible test items\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_test_items_visible\t= array(\n\t\t'test_name',\n\t\t'test_datatype',\n\t\t'res_datatype',\n\t\t'result',\n\t\t'file',\n\t\t'line',\n\t\t'notes'\n\t);\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tlog_message('info', 'Unit Testing Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Run the tests\n\t *\n\t * Runs the supplied tests\n\t *\n\t * @param\tarray\t$items\n\t * @return\tvoid\n\t */\n\tpublic function set_test_items($items)\n\t{\n\t\tif ( ! empty($items) && is_array($items))\n\t\t{\n\t\t\t$this->_test_items_visible = $items;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Run the tests\n\t *\n\t * Runs the supplied tests\n\t *\n\t * @param\tmixed\t$test\n\t * @param\tmixed\t$expected\n\t * @param\tstring\t$test_name\n\t * @param\tstring\t$notes\n\t * @return\tstring\n\t */\n\tpublic function run($test, $expected = TRUE, $test_name = 'undefined', $notes = '')\n\t{\n\t\tif ($this->active === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (in_array($expected, array('is_object', 'is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null', 'is_resource'), TRUE))\n\t\t{\n\t\t\t$result = $expected($test);\n\t\t\t$extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$result = ($this->strict === TRUE) ? ($test === $expected) : ($test == $expected);\n\t\t\t$extype = gettype($expected);\n\t\t}\n\n\t\t$back = $this->_backtrace();\n\n\t\t$report = array (\n\t\t\t'test_name'     => $test_name,\n\t\t\t'test_datatype' => gettype($test),\n\t\t\t'res_datatype'  => $extype,\n\t\t\t'result'        => ($result === TRUE) ? 'passed' : 'failed',\n\t\t\t'file'          => $back['file'],\n\t\t\t'line'          => $back['line'],\n\t\t\t'notes'         => $notes\n\t\t);\n\n\t\t$this->results[] = $report;\n\n\t\treturn $this->report($this->result(array($report)));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate a report\n\t *\n\t * Displays a table with the test data\n\t *\n\t * @param\tarray\t $result\n\t * @return\tstring\n\t */\n\tpublic function report($result = array())\n\t{\n\t\tif (count($result) === 0)\n\t\t{\n\t\t\t$result = $this->result();\n\t\t}\n\n\t\t$CI =& get_instance();\n\t\t$CI->load->language('unit_test');\n\n\t\t$this->_parse_template();\n\n\t\t$r = '';\n\t\tforeach ($result as $res)\n\t\t{\n\t\t\t$table = '';\n\n\t\t\tforeach ($res as $key => $val)\n\t\t\t{\n\t\t\t\tif ($key === $CI->lang->line('ut_result'))\n\t\t\t\t{\n\t\t\t\t\tif ($val === $CI->lang->line('ut_passed'))\n\t\t\t\t\t{\n\t\t\t\t\t\t$val = '<span style=\"color: #0C0;\">'.$val.'</span>';\n\t\t\t\t\t}\n\t\t\t\t\telseif ($val === $CI->lang->line('ut_failed'))\n\t\t\t\t\t{\n\t\t\t\t\t\t$val = '<span style=\"color: #C00;\">'.$val.'</span>';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$table .= str_replace(array('{item}', '{result}'), array($key, $val), $this->_template_rows);\n\t\t\t}\n\n\t\t\t$r .= str_replace('{rows}', $table, $this->_template);\n\t\t}\n\n\t\treturn $r;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Use strict comparison\n\t *\n\t * Causes the evaluation to use === rather than ==\n\t *\n\t * @param\tbool\t$state\n\t * @return\tvoid\n\t */\n\tpublic function use_strict($state = TRUE)\n\t{\n\t\t$this->strict = (bool) $state;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Make Unit testing active\n\t *\n\t * Enables/disables unit testing\n\t *\n\t * @param\tbool\n\t * @return\tvoid\n\t */\n\tpublic function active($state = TRUE)\n\t{\n\t\t$this->active = (bool) $state;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Result Array\n\t *\n\t * Returns the raw result data\n\t *\n\t * @param\tarray\t$results\n\t * @return\tarray\n\t */\n\tpublic function result($results = array())\n\t{\n\t\t$CI =& get_instance();\n\t\t$CI->load->language('unit_test');\n\n\t\tif (count($results) === 0)\n\t\t{\n\t\t\t$results = $this->results;\n\t\t}\n\n\t\t$retval = array();\n\t\tforeach ($results as $result)\n\t\t{\n\t\t\t$temp = array();\n\t\t\tforeach ($result as $key => $val)\n\t\t\t{\n\t\t\t\tif ( ! in_array($key, $this->_test_items_visible))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telseif (in_array($key, array('test_name', 'test_datatype', 'res_datatype', 'result'), TRUE))\n\t\t\t\t{\n\t\t\t\t\tif (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val), FALSE)))\n\t\t\t\t\t{\n\t\t\t\t\t\t$val = $line;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$temp[$CI->lang->line('ut_'.$key, FALSE)] = $val;\n\t\t\t}\n\n\t\t\t$retval[] = $temp;\n\t\t}\n\n\t\treturn $retval;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the template\n\t *\n\t * This lets us set the template to be used to display results\n\t *\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function set_template($template)\n\t{\n\t\t$this->_template = $template;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Generate a backtrace\n\t *\n\t * This lets us show file names and line numbers\n\t *\n\t * @return\tarray\n\t */\n\tprotected function _backtrace()\n\t{\n\t\t$back = debug_backtrace();\n\t\treturn array(\n\t\t\t'file' => (isset($back[1]['file']) ? $back[1]['file'] : ''),\n\t\t\t'line' => (isset($back[1]['line']) ? $back[1]['line'] : '')\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Default Template\n\t *\n\t * @return\tstring\n\t */\n\tprotected function _default_template()\n\t{\n\t\t$this->_template = \"\\n\".'<table style=\"width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;\">{rows}'.\"\\n</table>\";\n\n\t\t$this->_template_rows = \"\\n\\t<tr>\\n\\t\\t\".'<th style=\"text-align: left; border-bottom:1px solid #CCC;\">{item}</th>'\n\t\t\t\t\t.\"\\n\\t\\t\".'<td style=\"border-bottom:1px solid #CCC;\">{result}</td>'.\"\\n\\t</tr>\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse Template\n\t *\n\t * Harvests the data within the template {pseudo-variables}\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _parse_template()\n\t{\n\t\tif ($this->_template_rows !== NULL)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif ($this->_template === NULL OR ! preg_match('/\\{rows\\}(.*?)\\{\\/rows\\}/si', $this->_template, $match))\n\t\t{\n\t\t\t$this->_default_template();\n\t\t\treturn;\n\t\t}\n\n\t\t$this->_template_rows = $match[1];\n\t\t$this->_template = str_replace($match[0], '{rows}', $this->_template);\n\t}\n\n}\n\n/**\n * Helper function to test boolean TRUE\n *\n * @param\tmixed\t$test\n * @return\tbool\n */\nfunction is_true($test)\n{\n\treturn ($test === TRUE);\n}\n\n/**\n * Helper function to test boolean FALSE\n *\n * @param\tmixed\t$test\n * @return\tbool\n */\nfunction is_false($test)\n{\n\treturn ($test === FALSE);\n}\n"
  },
  {
    "path": "system/libraries/Upload.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * File Uploading Class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tUploads\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/file_uploading.html\n */\nclass CI_Upload {\n\n\t/**\n\t * Maximum file size\n\t *\n\t * @var\tint\n\t */\n\tpublic $max_size = 0;\n\n\t/**\n\t * Maximum image width\n\t *\n\t * @var\tint\n\t */\n\tpublic $max_width = 0;\n\n\t/**\n\t * Maximum image height\n\t *\n\t * @var\tint\n\t */\n\tpublic $max_height = 0;\n\n\t/**\n\t * Minimum image width\n\t *\n\t * @var\tint\n\t */\n\tpublic $min_width = 0;\n\n\t/**\n\t * Minimum image height\n\t *\n\t * @var\tint\n\t */\n\tpublic $min_height = 0;\n\n\t/**\n\t * Maximum filename length\n\t *\n\t * @var\tint\n\t */\n\tpublic $max_filename = 0;\n\n\t/**\n\t * Maximum duplicate filename increment ID\n\t *\n\t * @var\tint\n\t */\n\tpublic $max_filename_increment = 100;\n\n\t/**\n\t * Allowed file types\n\t *\n\t * @var\tstring\n\t */\n\tpublic $allowed_types = '';\n\n\t/**\n\t * Temporary filename\n\t *\n\t * @var\tstring\n\t */\n\tpublic $file_temp = '';\n\n\t/**\n\t * Filename\n\t *\n\t * @var\tstring\n\t */\n\tpublic $file_name = '';\n\n\t/**\n\t * Original filename\n\t *\n\t * @var\tstring\n\t */\n\tpublic $orig_name = '';\n\n\t/**\n\t * File type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $file_type = '';\n\n\t/**\n\t * File size\n\t *\n\t * @var\tint\n\t */\n\tpublic $file_size = NULL;\n\n\t/**\n\t * Filename extension\n\t *\n\t * @var\tstring\n\t */\n\tpublic $file_ext = '';\n\n\t/**\n\t * Force filename extension to lowercase\n\t *\n\t * @var\tstring\n\t */\n\tpublic $file_ext_tolower = FALSE;\n\n\t/**\n\t * Upload path\n\t *\n\t * @var\tstring\n\t */\n\tpublic $upload_path = '';\n\n\t/**\n\t * Overwrite flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $overwrite = FALSE;\n\n\t/**\n\t * Obfuscate filename flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $encrypt_name = FALSE;\n\n\t/**\n\t * Is image flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $is_image = FALSE;\n\n\t/**\n\t * Image width\n\t *\n\t * @var\tint\n\t */\n\tpublic $image_width = NULL;\n\n\t/**\n\t * Image height\n\t *\n\t * @var\tint\n\t */\n\tpublic $image_height = NULL;\n\n\t/**\n\t * Image type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $image_type = '';\n\n\t/**\n\t * Image size string\n\t *\n\t * @var\tstring\n\t */\n\tpublic $image_size_str = '';\n\n\t/**\n\t * Error messages list\n\t *\n\t * @var\tarray\n\t */\n\tpublic $error_msg = array();\n\n\t/**\n\t * Remove spaces flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $remove_spaces = TRUE;\n\n\t/**\n\t * MIME detection flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $detect_mime = TRUE;\n\n\t/**\n\t * XSS filter flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $xss_clean = FALSE;\n\n\t/**\n\t * Apache mod_mime fix flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $mod_mime_fix = TRUE;\n\n\t/**\n\t * Temporary filename prefix\n\t *\n\t * @var\tstring\n\t */\n\tpublic $temp_prefix = 'temp_file_';\n\n\t/**\n\t * Filename sent by the client\n\t *\n\t * @var\tbool\n\t */\n\tpublic $client_name = '';\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Filename override\n\t *\n\t * @var\tstring\n\t */\n\tprotected $_file_name_override = '';\n\n\t/**\n\t * MIME types list\n\t *\n\t * @var\tarray\n\t */\n\tprotected $_mimes = array();\n\n\t/**\n\t * CI Singleton\n\t *\n\t * @var\tobject\n\t */\n\tprotected $_CI;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\tempty($config) OR $this->initialize($config, FALSE);\n\n\t\t$this->_mimes =& get_mimes();\n\t\t$this->_CI =& get_instance();\n\n\t\tlog_message('info', 'Upload Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize preferences\n\t *\n\t * @param\tarray\t$config\n\t * @param\tbool\t$reset\n\t * @return\tCI_Upload\n\t */\n\tpublic function initialize(array $config = array(), $reset = TRUE)\n\t{\n\t\t$reflection = new ReflectionClass($this);\n\n\t\tif ($reset === TRUE)\n\t\t{\n\t\t\t$defaults = $reflection->getDefaultProperties();\n\t\t\tforeach (array_keys($defaults) as $key)\n\t\t\t{\n\t\t\t\tif ($key[0] === '_')\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (isset($config[$key]))\n\t\t\t\t{\n\t\t\t\t\tif ($reflection->hasMethod('set_'.$key))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->{'set_'.$key}($config[$key]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->$key = $config[$key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->$key = $defaults[$key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach ($config as $key => &$value)\n\t\t\t{\n\t\t\t\tif ($key[0] !== '_' && $reflection->hasProperty($key))\n\t\t\t\t{\n\t\t\t\t\tif ($reflection->hasMethod('set_'.$key))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->{'set_'.$key}($value);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->$key = $value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if a file_name was provided in the config, use it instead of the user input\n\t\t// supplied file name for all uploads until initialized again\n\t\t$this->_file_name_override = $this->file_name;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Perform the file upload\n\t *\n\t * @param\tstring\t$field\n\t * @return\tbool\n\t */\n\tpublic function do_upload($field = 'userfile')\n\t{\n\t\t// Is $_FILES[$field] set? If not, no reason to continue.\n\t\tif (isset($_FILES[$field]))\n\t\t{\n\t\t\t$_file = $_FILES[$field];\n\t\t}\n\t\t// Does the field name contain array notation?\n\t\telseif (($c = preg_match_all('/(?:^[^\\[]+)|\\[[^]]*\\]/', $field, $matches)) > 1)\n\t\t{\n\t\t\t$_file = $_FILES;\n\t\t\tfor ($i = 0; $i < $c; $i++)\n\t\t\t{\n\t\t\t\t// We can't track numeric iterations, only full field names are accepted\n\t\t\t\tif (($field = trim($matches[0][$i], '[]')) === '' OR ! isset($_file[$field]))\n\t\t\t\t{\n\t\t\t\t\t$_file = NULL;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t$_file = $_file[$field];\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset($_file))\n\t\t{\n\t\t\t$this->set_error('upload_no_file_selected', 'debug');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Is the upload path valid?\n\t\tif ( ! $this->validate_upload_path())\n\t\t{\n\t\t\t// errors will already be set by validate_upload_path() so just return FALSE\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Was the file able to be uploaded? If not, determine the reason why.\n\t\tif ( ! is_uploaded_file($_file['tmp_name']))\n\t\t{\n\t\t\t$error = isset($_file['error']) ? $_file['error'] : 4;\n\n\t\t\tswitch ($error)\n\t\t\t{\n\t\t\t\tcase UPLOAD_ERR_INI_SIZE:\n\t\t\t\t\t$this->set_error('upload_file_exceeds_limit', 'info');\n\t\t\t\t\tbreak;\n\t\t\t\tcase UPLOAD_ERR_FORM_SIZE:\n\t\t\t\t\t$this->set_error('upload_file_exceeds_form_limit', 'info');\n\t\t\t\t\tbreak;\n\t\t\t\tcase UPLOAD_ERR_PARTIAL:\n\t\t\t\t\t$this->set_error('upload_file_partial', 'debug');\n\t\t\t\t\tbreak;\n\t\t\t\tcase UPLOAD_ERR_NO_FILE:\n\t\t\t\t\t$this->set_error('upload_no_file_selected', 'debug');\n\t\t\t\t\tbreak;\n\t\t\t\tcase UPLOAD_ERR_NO_TMP_DIR:\n\t\t\t\t\t$this->set_error('upload_no_temp_directory', 'error');\n\t\t\t\t\tbreak;\n\t\t\t\tcase UPLOAD_ERR_CANT_WRITE:\n\t\t\t\t\t$this->set_error('upload_unable_to_write_file', 'error');\n\t\t\t\t\tbreak;\n\t\t\t\tcase UPLOAD_ERR_EXTENSION:\n\t\t\t\t\t$this->set_error('upload_stopped_by_extension', 'debug');\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$this->set_error('upload_no_file_selected', 'debug');\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set the uploaded data as class variables\n\t\t$this->file_temp = $_file['tmp_name'];\n\t\t$this->file_size = $_file['size'];\n\n\t\t// Skip MIME type detection?\n\t\tif ($this->detect_mime !== FALSE)\n\t\t{\n\t\t\t$this->_file_mime_type($_file);\n\t\t}\n\n\t\t$this->file_type = preg_replace('/^(.+?);.*$/', '\\\\1', $this->file_type);\n\t\t$this->file_type = strtolower(trim(stripslashes($this->file_type), '\"'));\n\t\t$this->file_name = $this->_prep_filename($_file['name']);\n\t\t$this->file_ext\t = $this->get_extension($this->file_name);\n\t\t$this->client_name = $this->file_name;\n\n\t\t// Is the file type allowed to be uploaded?\n\t\tif ( ! $this->is_allowed_filetype())\n\t\t{\n\t\t\t$this->set_error('upload_invalid_filetype', 'debug');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// if we're overriding, let's now make sure the new name and type is allowed\n\t\tif ($this->_file_name_override !== '')\n\t\t{\n\t\t\t$this->file_name = $this->_prep_filename($this->_file_name_override);\n\n\t\t\t// If no extension was provided in the file_name config item, use the uploaded one\n\t\t\tif (strpos($this->_file_name_override, '.') === FALSE)\n\t\t\t{\n\t\t\t\t$this->file_name .= $this->file_ext;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// An extension was provided, let's have it!\n\t\t\t\t$this->file_ext\t= $this->get_extension($this->_file_name_override);\n\t\t\t}\n\n\t\t\tif ( ! $this->is_allowed_filetype(TRUE))\n\t\t\t{\n\t\t\t\t$this->set_error('upload_invalid_filetype', 'debug');\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t// Convert the file size to kilobytes\n\t\tif ($this->file_size > 0)\n\t\t{\n\t\t\t$this->file_size = round($this->file_size/1024, 2);\n\t\t}\n\n\t\t// Is the file size within the allowed maximum?\n\t\tif ( ! $this->is_allowed_filesize())\n\t\t{\n\t\t\t$this->set_error('upload_invalid_filesize', 'info');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Are the image dimensions within the allowed size?\n\t\t// Note: This can fail if the server has an open_basedir restriction.\n\t\tif ( ! $this->is_allowed_dimensions())\n\t\t{\n\t\t\t$this->set_error('upload_invalid_dimensions', 'info');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Sanitize the file name for security\n\t\t$this->file_name = $this->_CI->security->sanitize_filename($this->file_name);\n\n\t\t// Truncate the file name if it's too long\n\t\tif ($this->max_filename > 0)\n\t\t{\n\t\t\t$this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename);\n\t\t}\n\n\t\t// Remove white spaces in the name\n\t\tif ($this->remove_spaces === TRUE)\n\t\t{\n\t\t\t$this->file_name = preg_replace('/\\s+/', '_', $this->file_name);\n\t\t}\n\n\t\tif ($this->file_ext_tolower && ($ext_length = strlen($this->file_ext)))\n\t\t{\n\t\t\t// file_ext was previously lower-cased by a get_extension() call\n\t\t\t$this->file_name = substr($this->file_name, 0, -$ext_length).$this->file_ext;\n\t\t}\n\n\t\t/*\n\t\t * Validate the file name\n\t\t * This function appends an number onto the end of\n\t\t * the file if one with the same name already exists.\n\t\t * If it returns false there was a problem.\n\t\t */\n\t\t$this->orig_name = $this->file_name;\n\t\tif (FALSE === ($this->file_name = $this->set_filename($this->upload_path, $this->file_name)))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/*\n\t\t * Run the file through the XSS hacking filter\n\t\t * This helps prevent malicious code from being\n\t\t * embedded within a file. Scripts can easily\n\t\t * be disguised as images or other file types.\n\t\t */\n\t\tif ($this->xss_clean && $this->do_xss_clean() === FALSE)\n\t\t{\n\t\t\t$this->set_error('upload_unable_to_write_file', 'error');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t/*\n\t\t * Move the file to the final destination\n\t\t * To deal with different server configurations\n\t\t * we'll attempt to use copy() first. If that fails\n\t\t * we'll use move_uploaded_file(). One of the two should\n\t\t * reliably work in most environments\n\t\t */\n\t\tif ( ! @copy($this->file_temp, $this->upload_path.$this->file_name))\n\t\t{\n\t\t\tif ( ! @move_uploaded_file($this->file_temp, $this->upload_path.$this->file_name))\n\t\t\t{\n\t\t\t\t$this->set_error('upload_destination_error', 'error');\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Set the finalized image dimensions\n\t\t * This sets the image width/height (assuming the\n\t\t * file was an image). We use this information\n\t\t * in the \"data\" function.\n\t\t */\n\t\t$this->set_image_properties($this->upload_path.$this->file_name);\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Finalized Data Array\n\t *\n\t * Returns an associative array containing all of the information\n\t * related to the upload, allowing the developer easy access in one array.\n\t *\n\t * @param\tstring\t$index\n\t * @return\tmixed\n\t */\n\tpublic function data($index = NULL)\n\t{\n\t\t$data = array(\n\t\t\t\t'file_name'\t\t=> $this->file_name,\n\t\t\t\t'file_type'\t\t=> $this->file_type,\n\t\t\t\t'file_path'\t\t=> $this->upload_path,\n\t\t\t\t'full_path'\t\t=> $this->upload_path.$this->file_name,\n\t\t\t\t'raw_name'\t\t=> substr($this->file_name, 0, -strlen($this->file_ext)),\n\t\t\t\t'orig_name'\t\t=> $this->orig_name,\n\t\t\t\t'client_name'\t\t=> $this->client_name,\n\t\t\t\t'file_ext'\t\t=> $this->file_ext,\n\t\t\t\t'file_size'\t\t=> $this->file_size,\n\t\t\t\t'is_image'\t\t=> $this->is_image(),\n\t\t\t\t'image_width'\t\t=> $this->image_width,\n\t\t\t\t'image_height'\t\t=> $this->image_height,\n\t\t\t\t'image_type'\t\t=> $this->image_type,\n\t\t\t\t'image_size_str'\t=> $this->image_size_str,\n\t\t\t);\n\n\t\tif ( ! empty($index))\n\t\t{\n\t\t\treturn isset($data[$index]) ? $data[$index] : NULL;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Upload Path\n\t *\n\t * @param\tstring\t$path\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_upload_path($path)\n\t{\n\t\t// Make sure it has a trailing slash\n\t\t$this->upload_path = rtrim($path, '/').'/';\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the file name\n\t *\n\t * This function takes a filename/path as input and looks for the\n\t * existence of a file with the same name. If found, it will append a\n\t * number to the end of the filename to avoid overwriting a pre-existing file.\n\t *\n\t * @param\tstring\t$path\n\t * @param\tstring\t$filename\n\t * @return\tstring\n\t */\n\tpublic function set_filename($path, $filename)\n\t{\n\t\tif ($this->encrypt_name === TRUE)\n\t\t{\n\t\t\t$filename = md5(uniqid(mt_rand())).$this->file_ext;\n\t\t}\n\n\t\tif ($this->overwrite === TRUE OR ! file_exists($path.$filename))\n\t\t{\n\t\t\treturn $filename;\n\t\t}\n\n\t\t$filename = str_replace($this->file_ext, '', $filename);\n\n\t\t$new_filename = '';\n\t\tfor ($i = 1; $i < $this->max_filename_increment; $i++)\n\t\t{\n\t\t\tif ( ! file_exists($path.$filename.$i.$this->file_ext))\n\t\t\t{\n\t\t\t\t$new_filename = $filename.$i.$this->file_ext;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ($new_filename === '')\n\t\t{\n\t\t\t$this->set_error('upload_bad_filename', 'debug');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $new_filename;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Maximum File Size\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_max_filesize($n)\n\t{\n\t\t$this->max_size = ($n < 0) ? 0 : (int) $n;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Maximum File Size\n\t *\n\t * An internal alias to set_max_filesize() to help with configuration\n\t * as initialize() will look for a set_<property_name>() method ...\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tprotected function set_max_size($n)\n\t{\n\t\treturn $this->set_max_filesize($n);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Maximum File Name Length\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_max_filename($n)\n\t{\n\t\t$this->max_filename = ($n < 0) ? 0 : (int) $n;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Maximum Image Width\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_max_width($n)\n\t{\n\t\t$this->max_width = ($n < 0) ? 0 : (int) $n;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Maximum Image Height\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_max_height($n)\n\t{\n\t\t$this->max_height = ($n < 0) ? 0 : (int) $n;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set minimum image width\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_min_width($n)\n\t{\n\t\t$this->min_width = ($n < 0) ? 0 : (int) $n;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set minimum image height\n\t *\n\t * @param\tint\t$n\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_min_height($n)\n\t{\n\t\t$this->min_height = ($n < 0) ? 0 : (int) $n;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Allowed File Types\n\t *\n\t * @param\tmixed\t$types\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_allowed_types($types)\n\t{\n\t\t$this->allowed_types = (is_array($types) OR $types === '*')\n\t\t\t? $types\n\t\t\t: explode('|', $types);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Image Properties\n\t *\n\t * Uses GD to determine the width/height/type of image\n\t *\n\t * @param\tstring\t$path\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_image_properties($path = '')\n\t{\n\t\tif ($this->is_image() && function_exists('getimagesize'))\n\t\t{\n\t\t\tif (FALSE !== ($D = @getimagesize($path)))\n\t\t\t{\n\t\t\t\t$types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');\n\n\t\t\t\t$this->image_width\t= $D[0];\n\t\t\t\t$this->image_height\t= $D[1];\n\t\t\t\t$this->image_type\t= isset($types[$D[2]]) ? $types[$D[2]] : 'unknown';\n\t\t\t\t$this->image_size_str\t= $D[3]; // string containing height and width\n\t\t\t}\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set XSS Clean\n\t *\n\t * Enables the XSS flag so that the file that was uploaded\n\t * will be run through the XSS filter.\n\t *\n\t * @param\tbool\t$flag\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_xss_clean($flag = FALSE)\n\t{\n\t\t$this->xss_clean = ($flag === TRUE);\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate the image\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_image()\n\t{\n\t\t// IE will sometimes return odd mime-types during upload, so here we just standardize all\n\t\t// jpegs or pngs to the same file type.\n\n\t\t$png_mimes  = array('image/x-png');\n\t\t$jpeg_mimes = array('image/jpg', 'image/jpe', 'image/jpeg', 'image/pjpeg');\n\n\t\tif (in_array($this->file_type, $png_mimes))\n\t\t{\n\t\t\t$this->file_type = 'image/png';\n\t\t}\n\t\telseif (in_array($this->file_type, $jpeg_mimes))\n\t\t{\n\t\t\t$this->file_type = 'image/jpeg';\n\t\t}\n\n\t\t$img_mimes = array('image/gif',\t'image/jpeg', 'image/png', 'image/webp');\n\n\t\treturn in_array($this->file_type, $img_mimes, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Verify that the filetype is allowed\n\t *\n\t * @param\tbool\t$ignore_mime\n\t * @return\tbool\n\t */\n\tpublic function is_allowed_filetype($ignore_mime = FALSE)\n\t{\n\t\tif ($this->allowed_types === '*')\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif (empty($this->allowed_types) OR ! is_array($this->allowed_types))\n\t\t{\n\t\t\t$this->set_error('upload_no_file_types', 'debug');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$ext = strtolower(ltrim($this->file_ext, '.'));\n\n\t\tif ( ! in_array($ext, $this->allowed_types, TRUE))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Images get some additional checks\n\t\tif (in_array($ext, array('gif', 'jpg', 'jpeg', 'jpe', 'png', 'webp'), TRUE) && @getimagesize($this->file_temp) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ($ignore_mime === TRUE)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif (isset($this->_mimes[$ext]))\n\t\t{\n\t\t\treturn is_array($this->_mimes[$ext])\n\t\t\t\t? in_array($this->file_type, $this->_mimes[$ext], TRUE)\n\t\t\t\t: ($this->_mimes[$ext] === $this->file_type);\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Verify that the file is within the allowed size\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_allowed_filesize()\n\t{\n\t\treturn ($this->max_size === 0 OR $this->max_size > $this->file_size);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Verify that the image is within the allowed width/height\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_allowed_dimensions()\n\t{\n\t\tif ( ! $this->is_image())\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\tif (function_exists('getimagesize'))\n\t\t{\n\t\t\t$D = @getimagesize($this->file_temp);\n\n\t\t\tif ($this->max_width > 0 && $D[0] > $this->max_width)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif ($this->max_height > 0 && $D[1] > $this->max_height)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif ($this->min_width > 0 && $D[0] < $this->min_width)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tif ($this->min_height > 0 && $D[1] < $this->min_height)\n\t\t\t{\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Validate Upload Path\n\t *\n\t * Verifies that it is a valid upload path with proper permissions.\n\t *\n\t * @return\tbool\n\t */\n\tpublic function validate_upload_path()\n\t{\n\t\tif ($this->upload_path === '')\n\t\t{\n\t\t\t$this->set_error('upload_no_filepath', 'error');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (realpath($this->upload_path) !== FALSE)\n\t\t{\n\t\t\t$this->upload_path = str_replace('\\\\', '/', realpath($this->upload_path));\n\t\t}\n\n\t\tif ( ! is_dir($this->upload_path))\n\t\t{\n\t\t\t$this->set_error('upload_no_filepath', 'error');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif ( ! is_really_writable($this->upload_path))\n\t\t{\n\t\t\t$this->set_error('upload_not_writable', 'error');\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->upload_path = preg_replace('/(.+?)\\/*$/', '\\\\1/',  $this->upload_path);\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Extract the file extension\n\t *\n\t * @param\tstring\t$filename\n\t * @return\tstring\n\t */\n\tpublic function get_extension($filename)\n\t{\n\t\t$x = explode('.', $filename);\n\n\t\tif (count($x) === 1)\n\t\t{\n\t\t\treturn '';\n\t\t}\n\n\t\t$ext = ($this->file_ext_tolower) ? strtolower(end($x)) : end($x);\n\t\treturn '.'.$ext;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Limit the File Name Length\n\t *\n\t * @param\tstring\t$filename\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tpublic function limit_filename_length($filename, $length)\n\t{\n\t\tif (strlen($filename) < $length)\n\t\t{\n\t\t\treturn $filename;\n\t\t}\n\n\t\t$ext = '';\n\t\tif (strpos($filename, '.') !== FALSE)\n\t\t{\n\t\t\t$parts\t\t= explode('.', $filename);\n\t\t\t$ext\t\t= '.'.array_pop($parts);\n\t\t\t$filename\t= implode('.', $parts);\n\t\t}\n\n\t\treturn substr($filename, 0, ($length - strlen($ext))).$ext;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Runs the file through the XSS clean function\n\t *\n\t * This prevents people from embedding malicious code in their files.\n\t * I'm not sure that it won't negatively affect certain files in unexpected ways,\n\t * but so far I haven't found that it causes trouble.\n\t *\n\t * @return\tstring\n\t */\n\tpublic function do_xss_clean()\n\t{\n\t\t$file = $this->file_temp;\n\n\t\tif (filesize($file) == 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tif (memory_get_usage() && ($memory_limit = ini_get('memory_limit')) > 0)\n\t\t{\n\t\t\t$memory_limit = str_split($memory_limit, strspn($memory_limit, '1234567890'));\n\t\t\tif ( ! empty($memory_limit[1]))\n\t\t\t{\n\t\t\t\tswitch ($memory_limit[1][0])\n\t\t\t\t{\n\t\t\t\t\tcase 'g':\n\t\t\t\t\tcase 'G':\n\t\t\t\t\t\t$memory_limit[0] *= 1024 * 1024 * 1024;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'm':\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t$memory_limit[0] *= 1024 * 1024;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$memory_limit = (int) ceil(filesize($file) + $memory_limit[0]);\n\t\t\tini_set('memory_limit', $memory_limit); // When an integer is used, the value is measured in bytes. - PHP.net\n\t\t}\n\n\t\t// If the file being uploaded is an image, then we should have no problem with XSS attacks (in theory), but\n\t\t// IE can be fooled into mime-type detecting a malformed image as an html file, thus executing an XSS attack on anyone\n\t\t// using IE who looks at the image. It does this by inspecting the first 255 bytes of an image. To get around this\n\t\t// CI will itself look at the first 255 bytes of an image to determine its relative safety. This can save a lot of\n\t\t// processor power and time if it is actually a clean image, as it will be in nearly all instances _except_ an\n\t\t// attempted XSS attack.\n\n\t\tif (function_exists('getimagesize') && @getimagesize($file) !== FALSE)\n\t\t{\n\t\t\tif (($file = @fopen($file, 'rb')) === FALSE) // \"b\" to force binary\n\t\t\t{\n\t\t\t\treturn FALSE; // Couldn't open the file, return FALSE\n\t\t\t}\n\n\t\t\t$opening_bytes = fread($file, 256);\n\t\t\tfclose($file);\n\n\t\t\t// These are known to throw IE into mime-type detection chaos\n\t\t\t// <a, <body, <head, <html, <img, <plaintext, <pre, <script, <table, <title\n\t\t\t// title is basically just in SVG, but we filter it anyhow\n\n\t\t\t// if it's an image or no \"triggers\" detected in the first 256 bytes - we're good\n\t\t\treturn ! preg_match('/<(a|body|head|html|img|plaintext|pre|script|table|title)[\\s>]/i', $opening_bytes);\n\t\t}\n\n\t\tif (($data = @file_get_contents($file)) === FALSE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\treturn $this->_CI->security->xss_clean($data, TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set an error message\n\t *\n\t * @param\tstring\t$msg\n\t * @return\tCI_Upload\n\t */\n\tpublic function set_error($msg, $log_level = 'error')\n\t{\n\t\t$this->_CI->lang->load('upload');\n\n\t\tis_array($msg) OR $msg = array($msg);\n\t\tforeach ($msg as $val)\n\t\t{\n\t\t\t$msg = ($this->_CI->lang->line($val) === FALSE) ? $val : $this->_CI->lang->line($val);\n\t\t\t$this->error_msg[] = $msg;\n\t\t\tlog_message($log_level, $msg);\n\t\t}\n\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Display the error message\n\t *\n\t * @param\tstring\t$open\n\t * @param\tstring\t$close\n\t * @return\tstring\n\t */\n\tpublic function display_errors($open = '<p>', $close = '</p>')\n\t{\n\t\treturn (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : '';\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prep Filename\n\t *\n\t * Prevents possible script execution from Apache's handling\n\t * of files' multiple extensions.\n\t *\n\t * @link\thttp://httpd.apache.org/docs/1.3/mod/mod_mime.html#multipleext\n\t *\n\t * @param\tstring\t$filename\n\t * @return\tstring\n\t */\n\tprotected function _prep_filename($filename)\n\t{\n\t\tif ($this->mod_mime_fix === FALSE OR $this->allowed_types === '*' OR ($ext_pos = strrpos($filename, '.')) === FALSE)\n\t\t{\n\t\t\treturn $filename;\n\t\t}\n\n\t\t$ext = substr($filename, $ext_pos);\n\t\t$filename = substr($filename, 0, $ext_pos);\n\t\treturn str_replace('.', '_', $filename).$ext;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * File MIME type\n\t *\n\t * Detects the (actual) MIME type of the uploaded file, if possible.\n\t * The input array is expected to be $_FILES[$field]\n\t *\n\t * @param\tarray\t$file\n\t * @return\tvoid\n\t */\n\tprotected function _file_mime_type($file)\n\t{\n\t\t// We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii)\n\t\t$regexp = '/^([a-z\\-]+\\/[a-z0-9\\-\\.\\+]+)(;\\s.+)?$/';\n\n\t\t/**\n\t\t * Fileinfo extension - most reliable method\n\t\t *\n\t\t * Apparently XAMPP, CentOS, cPanel and who knows what\n\t\t * other PHP distribution channels EXPLICITLY DISABLE\n\t\t * ext/fileinfo, which is otherwise enabled by default\n\t\t * since PHP 5.3 ...\n\t\t */\n\t\tif (function_exists('finfo_file'))\n\t\t{\n\t\t\t$finfo = @finfo_open(FILEINFO_MIME);\n\t\t\tif ($finfo !== FALSE) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system\n\t\t\t{\n\t\t\t\t$mime = @finfo_file($finfo, $file['tmp_name']);\n\t\t\t\tfinfo_close($finfo);\n\n\t\t\t\t/* According to the comments section of the PHP manual page,\n\t\t\t\t * it is possible that this function returns an empty string\n\t\t\t\t * for some files (e.g. if they don't exist in the magic MIME database)\n\t\t\t\t */\n\t\t\t\tif (is_string($mime) && preg_match($regexp, $mime, $matches))\n\t\t\t\t{\n\t\t\t\t\t$this->file_type = $matches[1];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* This is an ugly hack, but UNIX-type systems provide a \"native\" way to detect the file type,\n\t\t * which is still more secure than depending on the value of $_FILES[$field]['type'], and as it\n\t\t * was reported in issue #750 (https://github.com/EllisLab/CodeIgniter/issues/750) - it's better\n\t\t * than mime_content_type() as well, hence the attempts to try calling the command line with\n\t\t * three different functions.\n\t\t *\n\t\t * Notes:\n\t\t *\t- the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system\n\t\t *\t- many system admins would disable the exec(), shell_exec(), popen() and similar functions\n\t\t *\t  due to security concerns, hence the function_usable() checks\n\t\t */\n\t\tif (DIRECTORY_SEPARATOR !== '\\\\')\n\t\t{\n\t\t\t$cmd = function_exists('escapeshellarg')\n\t\t\t\t? 'file --brief --mime '.escapeshellarg($file['tmp_name']).' 2>&1'\n\t\t\t\t: 'file --brief --mime '.$file['tmp_name'].' 2>&1';\n\n\t\t\tif (function_usable('exec'))\n\t\t\t{\n\t\t\t\t/* This might look confusing, as $mime is being populated with all of the output when set in the second parameter.\n\t\t\t\t * However, we only need the last line, which is the actual return value of exec(), and as such - it overwrites\n\t\t\t\t * anything that could already be set for $mime previously. This effectively makes the second parameter a dummy\n\t\t\t\t * value, which is only put to allow us to get the return status code.\n\t\t\t\t */\n\t\t\t\t$mime = @exec($cmd, $mime, $return_status);\n\t\t\t\tif ($return_status === 0 && is_string($mime) && preg_match($regexp, $mime, $matches))\n\t\t\t\t{\n\t\t\t\t\t$this->file_type = $matches[1];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! ini_get('safe_mode') && function_usable('shell_exec'))\n\t\t\t{\n\t\t\t\t$mime = @shell_exec($cmd);\n\t\t\t\tif (strlen($mime) > 0)\n\t\t\t\t{\n\t\t\t\t\t$mime = explode(\"\\n\", trim($mime));\n\t\t\t\t\tif (preg_match($regexp, $mime[(count($mime) - 1)], $matches))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->file_type = $matches[1];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (function_usable('popen'))\n\t\t\t{\n\t\t\t\t$proc = @popen($cmd, 'r');\n\t\t\t\tif (is_resource($proc))\n\t\t\t\t{\n\t\t\t\t\t$mime = @fread($proc, 512);\n\t\t\t\t\t@pclose($proc);\n\t\t\t\t\tif ($mime !== FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\t$mime = explode(\"\\n\", trim($mime));\n\t\t\t\t\t\tif (preg_match($regexp, $mime[(count($mime) - 1)], $matches))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->file_type = $matches[1];\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to mime_content_type(), if available (still better than $_FILES[$field]['type'])\n\t\tif (function_exists('mime_content_type'))\n\t\t{\n\t\t\t$this->file_type = @mime_content_type($file['tmp_name']);\n\t\t\tif (strlen($this->file_type) > 0) // It's possible that mime_content_type() returns FALSE or an empty string\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t$this->file_type = $file['type'];\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/User_agent.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * User Agent Class\n *\n * Identifies the platform, browser, robot, or mobile device of the browsing agent\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tUser Agent\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/user_agent.html\n */\nclass CI_User_agent {\n\n\t/**\n\t * Current user-agent\n\t *\n\t * @var string\n\t */\n\tpublic $agent = NULL;\n\n\t/**\n\t * Flag for if the user-agent belongs to a browser\n\t *\n\t * @var bool\n\t */\n\tpublic $is_browser = FALSE;\n\n\t/**\n\t * Flag for if the user-agent is a robot\n\t *\n\t * @var bool\n\t */\n\tpublic $is_robot = FALSE;\n\n\t/**\n\t * Flag for if the user-agent is a mobile browser\n\t *\n\t * @var bool\n\t */\n\tpublic $is_mobile = FALSE;\n\n\t/**\n\t * Languages accepted by the current user agent\n\t *\n\t * @var array\n\t */\n\tpublic $languages = array();\n\n\t/**\n\t * Character sets accepted by the current user agent\n\t *\n\t * @var array\n\t */\n\tpublic $charsets = array();\n\n\t/**\n\t * List of platforms to compare against current user agent\n\t *\n\t * @var array\n\t */\n\tpublic $platforms = array();\n\n\t/**\n\t * List of browsers to compare against current user agent\n\t *\n\t * @var array\n\t */\n\tpublic $browsers = array();\n\n\t/**\n\t * List of mobile browsers to compare against current user agent\n\t *\n\t * @var array\n\t */\n\tpublic $mobiles = array();\n\n\t/**\n\t * List of robots to compare against current user agent\n\t *\n\t * @var array\n\t */\n\tpublic $robots = array();\n\n\t/**\n\t * Current user-agent platform\n\t *\n\t * @var string\n\t */\n\tpublic $platform = '';\n\n\t/**\n\t * Current user-agent browser\n\t *\n\t * @var string\n\t */\n\tpublic $browser = '';\n\n\t/**\n\t * Current user-agent version\n\t *\n\t * @var string\n\t */\n\tpublic $version = '';\n\n\t/**\n\t * Current user-agent mobile name\n\t *\n\t * @var string\n\t */\n\tpublic $mobile = '';\n\n\t/**\n\t * Current user-agent robot name\n\t *\n\t * @var string\n\t */\n\tpublic $robot = '';\n\n\t/**\n\t * HTTP Referer\n\t *\n\t * @var\tmixed\n\t */\n\tpublic $referer;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * Sets the User Agent and runs the compilation routine\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->_load_agent_file();\n\n\t\tif (isset($_SERVER['HTTP_USER_AGENT']))\n\t\t{\n\t\t\t$this->agent = trim($_SERVER['HTTP_USER_AGENT']);\n\t\t\t$this->_compile_data();\n\t\t}\n\n\t\tlog_message('info', 'User Agent Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile the User Agent Data\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _load_agent_file()\n\t{\n\t\tif (($found = file_exists(APPPATH.'config/user_agents.php')))\n\t\t{\n\t\t\tinclude(APPPATH.'config/user_agents.php');\n\t\t}\n\n\t\tif (file_exists(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'))\n\t\t{\n\t\t\tinclude(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php');\n\t\t\t$found = TRUE;\n\t\t}\n\n\t\tif ($found !== TRUE)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$return = FALSE;\n\n\t\tif (isset($platforms))\n\t\t{\n\t\t\t$this->platforms = $platforms;\n\t\t\tunset($platforms);\n\t\t\t$return = TRUE;\n\t\t}\n\n\t\tif (isset($browsers))\n\t\t{\n\t\t\t$this->browsers = $browsers;\n\t\t\tunset($browsers);\n\t\t\t$return = TRUE;\n\t\t}\n\n\t\tif (isset($mobiles))\n\t\t{\n\t\t\t$this->mobiles = $mobiles;\n\t\t\tunset($mobiles);\n\t\t\t$return = TRUE;\n\t\t}\n\n\t\tif (isset($robots))\n\t\t{\n\t\t\t$this->robots = $robots;\n\t\t\tunset($robots);\n\t\t\t$return = TRUE;\n\t\t}\n\n\t\treturn $return;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Compile the User Agent Data\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _compile_data()\n\t{\n\t\t$this->_set_platform();\n\n\t\tforeach (array('_set_robot', '_set_browser', '_set_mobile') as $function)\n\t\t{\n\t\t\tif ($this->$function() === TRUE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Platform\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _set_platform()\n\t{\n\t\tif (is_array($this->platforms) && count($this->platforms) > 0)\n\t\t{\n\t\t\tforeach ($this->platforms as $key => $val)\n\t\t\t{\n\t\t\t\tif (preg_match('|'.preg_quote($key).'|i', $this->agent))\n\t\t\t\t{\n\t\t\t\t\t$this->platform = $val;\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->platform = 'Unknown Platform';\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Browser\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _set_browser()\n\t{\n\t\tif (is_array($this->browsers) && count($this->browsers) > 0)\n\t\t{\n\t\t\tforeach ($this->browsers as $key => $val)\n\t\t\t{\n\t\t\t\tif (preg_match('|'.$key.'.*?([0-9\\.]+)|i', $this->agent, $match))\n\t\t\t\t{\n\t\t\t\t\t$this->is_browser = TRUE;\n\t\t\t\t\t$this->version = $match[1];\n\t\t\t\t\t$this->browser = $val;\n\t\t\t\t\t$this->_set_mobile();\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Robot\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _set_robot()\n\t{\n\t\tif (is_array($this->robots) && count($this->robots) > 0)\n\t\t{\n\t\t\tforeach ($this->robots as $key => $val)\n\t\t\t{\n\t\t\t\tif (preg_match('|'.preg_quote($key).'|i', $this->agent))\n\t\t\t\t{\n\t\t\t\t\t$this->is_robot = TRUE;\n\t\t\t\t\t$this->robot = $val;\n\t\t\t\t\t$this->_set_mobile();\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the Mobile Device\n\t *\n\t * @return\tbool\n\t */\n\tprotected function _set_mobile()\n\t{\n\t\tif (is_array($this->mobiles) && count($this->mobiles) > 0)\n\t\t{\n\t\t\tforeach ($this->mobiles as $key => $val)\n\t\t\t{\n\t\t\t\tif (FALSE !== (stripos($this->agent, $key)))\n\t\t\t\t{\n\t\t\t\t\t$this->is_mobile = TRUE;\n\t\t\t\t\t$this->mobile = $val;\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the accepted languages\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _set_languages()\n\t{\n\t\tif ((count($this->languages) === 0) && ! empty($_SERVER['HTTP_ACCEPT_LANGUAGE']))\n\t\t{\n\t\t\t$this->languages = explode(',', preg_replace('/(;\\s?q=[0-9\\.]+)|\\s/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE']))));\n\t\t}\n\n\t\tif (count($this->languages) === 0)\n\t\t{\n\t\t\t$this->languages = array('Undefined');\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set the accepted character sets\n\t *\n\t * @return\tvoid\n\t */\n\tprotected function _set_charsets()\n\t{\n\t\tif ((count($this->charsets) === 0) && ! empty($_SERVER['HTTP_ACCEPT_CHARSET']))\n\t\t{\n\t\t\t$this->charsets = explode(',', preg_replace('/(;\\s?q=.+)|\\s/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET']))));\n\t\t}\n\n\t\tif (count($this->charsets) === 0)\n\t\t{\n\t\t\t$this->charsets = array('Undefined');\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is Browser\n\t *\n\t * @param\tstring\t$key\n\t * @return\tbool\n\t */\n\tpublic function is_browser($key = NULL)\n\t{\n\t\tif ( ! $this->is_browser)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// No need to be specific, it's a browser\n\t\tif ($key === NULL)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Check for a specific browser\n\t\treturn (isset($this->browsers[$key]) && $this->browser === $this->browsers[$key]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is Robot\n\t *\n\t * @param\tstring\t$key\n\t * @return\tbool\n\t */\n\tpublic function is_robot($key = NULL)\n\t{\n\t\tif ( ! $this->is_robot)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// No need to be specific, it's a robot\n\t\tif ($key === NULL)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Check for a specific robot\n\t\treturn (isset($this->robots[$key]) && $this->robot === $this->robots[$key]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is Mobile\n\t *\n\t * @param\tstring\t$key\n\t * @return\tbool\n\t */\n\tpublic function is_mobile($key = NULL)\n\t{\n\t\tif ( ! $this->is_mobile)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// No need to be specific, it's a mobile\n\t\tif ($key === NULL)\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\n\t\t// Check for a specific robot\n\t\treturn (isset($this->mobiles[$key]) && $this->mobile === $this->mobiles[$key]);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Is this a referral from another site?\n\t *\n\t * @return\tbool\n\t */\n\tpublic function is_referral()\n\t{\n\t\tif ( ! isset($this->referer))\n\t\t{\n\t\t\tif (empty($_SERVER['HTTP_REFERER']))\n\t\t\t{\n\t\t\t\t$this->referer = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$referer_host = @parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);\n\t\t\t\t$own_host = parse_url((string) config_item('base_url'), PHP_URL_HOST);\n\n\t\t\t\t$this->referer = ($referer_host && $referer_host !== $own_host);\n\t\t\t}\n\t\t}\n\n\t\treturn $this->referer;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Agent String\n\t *\n\t * @return\tstring\n\t */\n\tpublic function agent_string()\n\t{\n\t\treturn $this->agent;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Platform\n\t *\n\t * @return\tstring\n\t */\n\tpublic function platform()\n\t{\n\t\treturn $this->platform;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get Browser Name\n\t *\n\t * @return\tstring\n\t */\n\tpublic function browser()\n\t{\n\t\treturn $this->browser;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the Browser Version\n\t *\n\t * @return\tstring\n\t */\n\tpublic function version()\n\t{\n\t\treturn $this->version;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get The Robot Name\n\t *\n\t * @return\tstring\n\t */\n\tpublic function robot()\n\t{\n\t\treturn $this->robot;\n\t}\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the Mobile Device\n\t *\n\t * @return\tstring\n\t */\n\tpublic function mobile()\n\t{\n\t\treturn $this->mobile;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the referrer\n\t *\n\t * @return\tbool\n\t */\n\tpublic function referrer()\n\t{\n\t\treturn empty($_SERVER['HTTP_REFERER']) ? '' : trim($_SERVER['HTTP_REFERER']);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the accepted languages\n\t *\n\t * @return\tarray\n\t */\n\tpublic function languages()\n\t{\n\t\tif (count($this->languages) === 0)\n\t\t{\n\t\t\t$this->_set_languages();\n\t\t}\n\n\t\treturn $this->languages;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the accepted Character Sets\n\t *\n\t * @return\tarray\n\t */\n\tpublic function charsets()\n\t{\n\t\tif (count($this->charsets) === 0)\n\t\t{\n\t\t\t$this->_set_charsets();\n\t\t}\n\n\t\treturn $this->charsets;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Test for a particular language\n\t *\n\t * @param\tstring\t$lang\n\t * @return\tbool\n\t */\n\tpublic function accept_lang($lang = 'en')\n\t{\n\t\treturn in_array(strtolower($lang), $this->languages(), TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Test for a particular character set\n\t *\n\t * @param\tstring\t$charset\n\t * @return\tbool\n\t */\n\tpublic function accept_charset($charset = 'utf-8')\n\t{\n\t\treturn in_array(strtolower($charset), $this->charsets(), TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse a custom user-agent string\n\t *\n\t * @param\tstring\t$string\n\t * @return\tvoid\n\t */\n\tpublic function parse($string)\n\t{\n\t\t// Reset values\n\t\t$this->is_browser = FALSE;\n\t\t$this->is_robot = FALSE;\n\t\t$this->is_mobile = FALSE;\n\t\t$this->browser = '';\n\t\t$this->version = '';\n\t\t$this->mobile = '';\n\t\t$this->robot = '';\n\n\t\t// Set the new user-agent string and parse it, unless empty\n\t\t$this->agent = $string;\n\n\t\tif ( ! empty($string))\n\t\t{\n\t\t\t$this->_compile_data();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Xmlrpc.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\nif ( ! function_exists('xml_parser_create'))\n{\n\tshow_error('Your PHP installation does not support XML');\n}\n\n// ------------------------------------------------------------------------\n\n/**\n * XML-RPC request handler class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tXML-RPC\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/xmlrpc.html\n */\nclass CI_Xmlrpc {\n\n\t/**\n\t * Debug flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $debug\t\t= FALSE;\n\n\t/**\n\t * I4 data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcI4\t= 'i4';\n\n\t/**\n\t * Integer data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcInt\t= 'int';\n\n\t/**\n\t * Boolean data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcBoolean\t= 'boolean';\n\n\t/**\n\t * Double data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcDouble\t= 'double';\n\n\t/**\n\t * String data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcString\t= 'string';\n\n\t/**\n\t * DateTime format\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcDateTime\t= 'dateTime.iso8601';\n\n\t/**\n\t * Base64 data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcBase64\t= 'base64';\n\n\t/**\n\t * Array data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcArray\t= 'array';\n\n\t/**\n\t * Struct data type\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcStruct\t= 'struct';\n\n\t/**\n\t * Data types list\n\t *\n\t * @var\tarray\n\t */\n\tpublic $xmlrpcTypes\t= array();\n\n\t/**\n\t * Valid parents list\n\t *\n\t * @var\tarray\n\t */\n\tpublic $valid_parents\t= array();\n\n\t/**\n\t * Response error numbers list\n\t *\n\t * @var\tarray\n\t */\n\tpublic $xmlrpcerr\t\t= array();\n\n\t/**\n\t * Response error messages list\n\t *\n\t * @var\tstring[]\n\t */\n\tpublic $xmlrpcstr\t\t= array();\n\n\t/**\n\t * Encoding charset\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpc_defencoding\t= 'UTF-8';\n\n\t/**\n\t * XML-RPC client name\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcName\t\t= 'XML-RPC for CodeIgniter';\n\n\t/**\n\t * XML-RPC version\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpcVersion\t\t= '1.1';\n\n\t/**\n\t * Start of user errors\n\t *\n\t * @var\tint\n\t */\n\tpublic $xmlrpcerruser\t\t= 800;\n\n\t/**\n\t * Start of XML parse errors\n\t *\n\t * @var\tint\n\t */\n\tpublic $xmlrpcerrxml\t\t= 100;\n\n\t/**\n\t * Backslash replacement value\n\t *\n\t * @var\tstring\n\t */\n\tpublic $xmlrpc_backslash\t= '';\n\n\t/**\n\t * XML-RPC Client object\n\t *\n\t * @var\tobject\n\t */\n\tpublic $client;\n\n\t/**\n\t * XML-RPC Method name\n\t *\n\t * @var\tstring\n\t */\n\tpublic $method;\n\n\t/**\n\t * XML-RPC Data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $data;\n\n\t/**\n\t * XML-RPC Message\n\t *\n\t * @var\tstring\n\t */\n\tpublic $message\t\t\t= '';\n\n\t/**\n\t * Request error message\n\t *\n\t * @var\tstring\n\t */\n\tpublic $error\t\t\t= '';\n\n\t/**\n\t * XML-RPC result object\n\t *\n\t * @var\tobject\n\t */\n\tpublic $result;\n\n\t/**\n\t * XML-RPC Response\n\t *\n\t * @var\tarray\n\t */\n\tpublic $response\t\t= array(); // Response from remote server\n\n\t/**\n\t * XSS Filter flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $xss_clean\t\t= TRUE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * Initializes property default values\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\t$this->xmlrpc_backslash = chr(92).chr(92);\n\n\t\t// Types for info sent back and forth\n\t\t$this->xmlrpcTypes = array(\n\t\t\t$this->xmlrpcI4\t \t\t=> '1',\n\t\t\t$this->xmlrpcInt\t\t=> '1',\n\t\t\t$this->xmlrpcBoolean\t=> '1',\n\t\t\t$this->xmlrpcString\t\t=> '1',\n\t\t\t$this->xmlrpcDouble\t\t=> '1',\n\t\t\t$this->xmlrpcDateTime\t=> '1',\n\t\t\t$this->xmlrpcBase64\t\t=> '1',\n\t\t\t$this->xmlrpcArray\t\t=> '2',\n\t\t\t$this->xmlrpcStruct\t\t=> '3'\n\t\t);\n\n\t\t// Array of Valid Parents for Various XML-RPC elements\n\t\t$this->valid_parents = array('BOOLEAN' => array('VALUE'),\n\t\t\t'I4'\t\t\t\t=> array('VALUE'),\n\t\t\t'INT'\t\t\t\t=> array('VALUE'),\n\t\t\t'STRING'\t\t\t=> array('VALUE'),\n\t\t\t'DOUBLE'\t\t\t=> array('VALUE'),\n\t\t\t'DATETIME.ISO8601'\t=> array('VALUE'),\n\t\t\t'BASE64'\t\t\t=> array('VALUE'),\n\t\t\t'ARRAY'\t\t\t=> array('VALUE'),\n\t\t\t'STRUCT'\t\t\t=> array('VALUE'),\n\t\t\t'PARAM'\t\t\t=> array('PARAMS'),\n\t\t\t'METHODNAME'\t\t=> array('METHODCALL'),\n\t\t\t'PARAMS'\t\t\t=> array('METHODCALL', 'METHODRESPONSE'),\n\t\t\t'MEMBER'\t\t\t=> array('STRUCT'),\n\t\t\t'NAME'\t\t\t\t=> array('MEMBER'),\n\t\t\t'DATA'\t\t\t\t=> array('ARRAY'),\n\t\t\t'FAULT'\t\t\t=> array('METHODRESPONSE'),\n\t\t\t'VALUE'\t\t\t=> array('MEMBER', 'DATA', 'PARAM', 'FAULT')\n\t\t);\n\n\t\t// XML-RPC Responses\n\t\t$this->xmlrpcerr['unknown_method'] = '1';\n\t\t$this->xmlrpcstr['unknown_method'] = 'This is not a known method for this XML-RPC Server';\n\t\t$this->xmlrpcerr['invalid_return'] = '2';\n\t\t$this->xmlrpcstr['invalid_return'] = 'The XML data received was either invalid or not in the correct form for XML-RPC. Turn on debugging to examine the XML data further.';\n\t\t$this->xmlrpcerr['incorrect_params'] = '3';\n\t\t$this->xmlrpcstr['incorrect_params'] = 'Incorrect parameters were passed to method';\n\t\t$this->xmlrpcerr['introspect_unknown'] = '4';\n\t\t$this->xmlrpcstr['introspect_unknown'] = 'Cannot inspect signature for request: method unknown';\n\t\t$this->xmlrpcerr['http_error'] = '5';\n\t\t$this->xmlrpcstr['http_error'] = \"Did not receive a '200 OK' response from remote server.\";\n\t\t$this->xmlrpcerr['no_data'] = '6';\n\t\t$this->xmlrpcstr['no_data'] = 'No data received from server.';\n\n\t\t$this->initialize($config);\n\n\t\tlog_message('info', 'XML-RPC Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function initialize($config = array())\n\t{\n\t\tif (count($config) > 0)\n\t\t{\n\t\t\tforeach ($config as $key => $val)\n\t\t\t{\n\t\t\t\tif (isset($this->$key))\n\t\t\t\t{\n\t\t\t\t\t$this->$key = $val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse server URL\n\t *\n\t * @param\tstring\t$url\n\t * @param\tint\t$port\n\t * @param\tstring\t$proxy\n\t * @param\tint\t$proxy_port\n\t * @return\tvoid\n\t */\n\tpublic function server($url, $port = 80, $proxy = FALSE, $proxy_port = 8080)\n\t{\n\t\tif (stripos($url, 'http') !== 0)\n\t\t{\n\t\t\t$url = 'http://'.$url;\n\t\t}\n\n\t\t$parts = parse_url($url);\n\n\t\tif (isset($parts['user'], $parts['pass']))\n\t\t{\n\t\t\t$parts['host'] = $parts['user'].':'.$parts['pass'].'@'.$parts['host'];\n\t\t}\n\n\t\t$path = isset($parts['path']) ? $parts['path'] : '/';\n\n\t\tif ( ! empty($parts['query']))\n\t\t{\n\t\t\t$path .= '?'.$parts['query'];\n\t\t}\n\n\t\t$this->client = new XML_RPC_Client($path, $parts['host'], $port, $proxy, $proxy_port);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Timeout\n\t *\n\t * @param\tint\t$seconds\n\t * @return\tvoid\n\t */\n\tpublic function timeout($seconds = 5)\n\t{\n\t\tif ($this->client !== NULL && is_int($seconds))\n\t\t{\n\t\t\t$this->client->timeout = $seconds;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Methods\n\t *\n\t * @param\tstring\t$function\tMethod name\n\t * @return\tvoid\n\t */\n\tpublic function method($function)\n\t{\n\t\t$this->method = $function;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Take Array of Data and Create Objects\n\t *\n\t * @param\tarray\t$incoming\n\t * @return\tvoid\n\t */\n\tpublic function request($incoming)\n\t{\n\t\tif ( ! is_array($incoming))\n\t\t{\n\t\t\t// Send Error\n\t\t\treturn;\n\t\t}\n\n\t\t$this->data = array();\n\n\t\tforeach ($incoming as $key => $value)\n\t\t{\n\t\t\t$this->data[$key] = $this->values_parsing($value);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Set Debug\n\t *\n\t * @param\tbool\t$flag\n\t * @return\tvoid\n\t */\n\tpublic function set_debug($flag = TRUE)\n\t{\n\t\t$this->debug = ($flag === TRUE);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Values Parsing\n\t *\n\t * @param\tmixed\t$value\n\t * @return\tobject\n\t */\n\tpublic function values_parsing($value)\n\t{\n\t\tif (is_array($value) && array_key_exists(0, $value))\n\t\t{\n\t\t\tif ( ! isset($value[1], $this->xmlrpcTypes[$value[1]]))\n\t\t\t{\n\t\t\t\t$temp = new XML_RPC_Values($value[0], (is_array($value[0]) ? 'array' : 'string'));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (is_array($value[0]) && ($value[1] === 'struct' OR $value[1] === 'array'))\n\t\t\t\t{\n\t\t\t\t\tforeach (array_keys($value[0]) as $k)\n\t\t\t\t\t{\n\t\t\t\t\t\t$value[0][$k] = $this->values_parsing($value[0][$k]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$temp = new XML_RPC_Values($value[0], $value[1]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$temp = new XML_RPC_Values($value, 'string');\n\t\t}\n\n\t\treturn $temp;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sends XML-RPC Request\n\t *\n\t * @return\tbool\n\t */\n\tpublic function send_request()\n\t{\n\t\t$this->message = new XML_RPC_Message($this->method, $this->data);\n\t\t$this->message->debug = $this->debug;\n\n\t\tif ( ! $this->result = $this->client->send($this->message) OR ! is_object($this->result->val))\n\t\t{\n\t\t\t$this->error = $this->result->errstr;\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t$this->response = $this->result->decode();\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns Error\n\t *\n\t * @return\tstring\n\t */\n\tpublic function display_error()\n\t{\n\t\treturn $this->error;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Returns Remote Server Response\n\t *\n\t * @return\tstring\n\t */\n\tpublic function display_response()\n\t{\n\t\treturn $this->response;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Sends an Error Message for Server Request\n\t *\n\t * @param\tint\t$number\n\t * @param\tstring\t$message\n\t * @return\tobject\n\t */\n\tpublic function send_error_message($number, $message)\n\t{\n\t\treturn new XML_RPC_Response(0, $number, $message);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send Response for Server Request\n\t *\n\t * @param\tarray\t$response\n\t * @return\tobject\n\t */\n\tpublic function send_response($response)\n\t{\n\t\t// $response should be array of values, which will be parsed\n\t\t// based on their data and type into a valid group of XML-RPC values\n\t\treturn new XML_RPC_Response($this->values_parsing($response));\n\t}\n\n} // END XML_RPC Class\n\n/**\n * XML-RPC Client class\n *\n * @category\tXML-RPC\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/xmlrpc.html\n */\nclass XML_RPC_Client extends CI_Xmlrpc\n{\n\t/**\n\t * Path\n\t *\n\t * @var\tstring\n\t */\n\tpublic $path\t\t\t= '';\n\n\t/**\n\t * Server hostname\n\t *\n\t * @var\tstring\n\t */\n\tpublic $server\t\t\t= '';\n\n\t/**\n\t * Server port\n\t *\n\t * @var\tint\n\t */\n\tpublic $port\t\t\t= 80;\n\n\t/**\n\t *\n\t * Server username\n\t *\n\t * @var\tstring\n\t */\n\tpublic $username;\n\n\t/**\n\t * Server password\n\t *\n\t * @var\tstring\n\t */\n\tpublic $password;\n\n\t/**\n\t * Proxy hostname\n\t *\n\t * @var\tstring\n\t */\n\tpublic $proxy\t\t\t= FALSE;\n\n\t/**\n\t * Proxy port\n\t *\n\t * @var\tint\n\t */\n\tpublic $proxy_port\t\t= 8080;\n\n\t/**\n\t * Error number\n\t *\n\t * @var\tstring\n\t */\n\tpublic $errno\t\t\t= '';\n\n\t/**\n\t * Error message\n\t *\n\t * @var\tstring\n\t */\n\tpublic $errstring\t\t= '';\n\n\t/**\n\t * Timeout in seconds\n\t *\n\t * @var\tint\n\t */\n\tpublic $timeout\t\t= 5;\n\n\t/**\n\t * No Multicall flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $no_multicall\t= FALSE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tstring\t$path\n\t * @param\tobject\t$server\n\t * @param\tint\t$port\n\t * @param\tstring\t$proxy\n\t * @param\tint\t$proxy_port\n\t * @return\tvoid\n\t */\n\tpublic function __construct($path, $server, $port = 80, $proxy = FALSE, $proxy_port = 8080)\n\t{\n\t\tparent::__construct();\n\n\t\t$url = parse_url('http://'.$server);\n\n\t\tif (isset($url['user'], $url['pass']))\n\t\t{\n\t\t\t$this->username = $url['user'];\n\t\t\t$this->password = $url['pass'];\n\t\t}\n\n\t\t$this->port = $port;\n\t\t$this->server = $url['host'];\n\t\t$this->path = $path;\n\t\t$this->proxy = $proxy;\n\t\t$this->proxy_port = $proxy_port;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send message\n\t *\n\t * @param\tmixed\t$msg\n\t * @return\tobject\n\t */\n\tpublic function send($msg)\n\t{\n\t\tif (is_array($msg))\n\t\t{\n\t\t\t// Multi-call disabled\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['multicall_recursion'], $this->xmlrpcstr['multicall_recursion']);\n\t\t}\n\n\t\treturn $this->sendPayload($msg);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Send payload\n\t *\n\t * @param\tobject\t$msg\n\t * @return\tobject\n\t */\n\tpublic function sendPayload($msg)\n\t{\n\t\tif ($this->proxy === FALSE)\n\t\t{\n\t\t\t$server = $this->server;\n\t\t\t$port = $this->port;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$server = $this->proxy;\n\t\t\t$port = $this->proxy_port;\n\t\t}\n\n\t\t$fp = @fsockopen($server, $port, $this->errno, $this->errstring, $this->timeout);\n\n\t\tif ( ! is_resource($fp))\n\t\t{\n\t\t\terror_log($this->xmlrpcstr['http_error']);\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']);\n\t\t}\n\n\t\tif (empty($msg->payload))\n\t\t{\n\t\t\t// $msg = XML_RPC_Messages\n\t\t\t$msg->createPayload();\n\t\t}\n\n\t\t$r = \"\\r\\n\";\n\t\t$op = 'POST '.$this->path.' HTTP/1.0'.$r\n\t\t\t.'Host: '.$this->server.$r\n\t\t\t.'Content-Type: text/xml'.$r\n\t\t\t.(isset($this->username, $this->password) ? 'Authorization: Basic '.base64_encode($this->username.':'.$this->password).$r : '')\n\t\t\t.'User-Agent: '.$this->xmlrpcName.$r\n\t\t\t.'Content-Length: '.strlen($msg->payload).$r.$r\n\t\t\t.$msg->payload;\n\n\t\tstream_set_timeout($fp, $this->timeout); // set timeout for subsequent operations\n\n\t\tfor ($written = $timestamp = 0, $length = strlen($op); $written < $length; $written += $result)\n\t\t{\n\t\t\tif (($result = fwrite($fp, substr($op, $written))) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// See https://bugs.php.net/bug.php?id=39598 and http://php.net/manual/en/function.fwrite.php#96951\n\t\t\telseif ($result === 0)\n\t\t\t{\n\t\t\t\tif ($timestamp === 0)\n\t\t\t\t{\n\t\t\t\t\t$timestamp = time();\n\t\t\t\t}\n\t\t\t\telseif ($timestamp < (time() - $this->timeout))\n\t\t\t\t{\n\t\t\t\t\t$result = FALSE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$timestamp = 0;\n\t\t\t}\n\t\t}\n\n\t\tif ($result === FALSE)\n\t\t{\n\t\t\terror_log($this->xmlrpcstr['http_error']);\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']);\n\t\t}\n\n\t\t$resp = $msg->parseResponse($fp);\n\t\tfclose($fp);\n\t\treturn $resp;\n\t}\n\n} // END XML_RPC_Client Class\n\n/**\n * XML-RPC Response class\n *\n * @category\tXML-RPC\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/xmlrpc.html\n */\nclass XML_RPC_Response\n{\n\n\t/**\n\t * Value\n\t *\n\t * @var\tmixed\n\t */\n\tpublic $val\t\t= 0;\n\n\t/**\n\t * Error number\n\t *\n\t * @var\tint\n\t */\n\tpublic $errno\t\t= 0;\n\n\t/**\n\t * Error message\n\t *\n\t * @var\tstring\n\t */\n\tpublic $errstr\t\t= '';\n\n\t/**\n\t * Headers list\n\t *\n\t * @var\tarray\n\t */\n\tpublic $headers\t\t= array();\n\n\t/**\n\t * XSS Filter flag\n\t *\n\t * @var\tbool\n\t */\n\tpublic $xss_clean\t= TRUE;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tmixed\t$val\n\t * @param\tint\t$code\n\t * @param\tstring\t$fstr\n\t * @return\tvoid\n\t */\n\tpublic function __construct($val, $code = 0, $fstr = '')\n\t{\n\t\tif ($code !== 0)\n\t\t{\n\t\t\t// error\n\t\t\t$this->errno = $code;\n\t\t\t$this->errstr = htmlspecialchars($fstr,\n\t\t\t\t\t\t\t(is_php('5.4') ? ENT_XML1 | ENT_NOQUOTES : ENT_NOQUOTES),\n\t\t\t\t\t\t\t'UTF-8');\n\t\t}\n\t\telseif ( ! is_object($val))\n\t\t{\n\t\t\t// programmer error, not an object\n\t\t\terror_log(\"Invalid type '\".gettype($val).\"' (value: \".$val.') passed to XML_RPC_Response. Defaulting to empty value.');\n\t\t\t$this->val = new XML_RPC_Values();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->val = $val;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fault code\n\t *\n\t * @return\tint\n\t */\n\tpublic function faultCode()\n\t{\n\t\treturn $this->errno;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Fault string\n\t *\n\t * @return\tstring\n\t */\n\tpublic function faultString()\n\t{\n\t\treturn $this->errstr;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Value\n\t *\n\t * @return\tmixed\n\t */\n\tpublic function value()\n\t{\n\t\treturn $this->val;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Prepare response\n\t *\n\t * @return\tstring\txml\n\t */\n\tpublic function prepare_response()\n\t{\n\t\treturn \"<methodResponse>\\n\"\n\t\t\t.($this->errno\n\t\t\t\t? '<fault>\n\t<value>\n\t\t<struct>\n\t\t\t<member>\n\t\t\t\t<name>faultCode</name>\n\t\t\t\t<value><int>'.$this->errno.'</int></value>\n\t\t\t</member>\n\t\t\t<member>\n\t\t\t\t<name>faultString</name>\n\t\t\t\t<value><string>'.$this->errstr.'</string></value>\n\t\t\t</member>\n\t\t</struct>\n\t</value>\n</fault>'\n\t\t\t\t: \"<params>\\n<param>\\n\".$this->val->serialize_class().\"</param>\\n</params>\")\n\t\t\t.\"\\n</methodResponse>\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decode\n\t *\n\t * @param\tmixed\t$array\n\t * @return\tarray\n\t */\n\tpublic function decode($array = NULL)\n\t{\n\t\t$CI =& get_instance();\n\n\t\tif (is_array($array))\n\t\t{\n\t\t\tforeach ($array as $key => &$value)\n\t\t\t{\n\t\t\t\tif (is_array($value))\n\t\t\t\t{\n\t\t\t\t\t$array[$key] = $this->decode($value);\n\t\t\t\t}\n\t\t\t\telseif ($this->xss_clean)\n\t\t\t\t{\n\t\t\t\t\t$array[$key] = $CI->security->xss_clean($value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $array;\n\t\t}\n\n\t\t$result = $this->xmlrpc_decoder($this->val);\n\n\t\tif (is_array($result))\n\t\t{\n\t\t\t$result = $this->decode($result);\n\t\t}\n\t\telseif ($this->xss_clean)\n\t\t{\n\t\t\t$result = $CI->security->xss_clean($result);\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * XML-RPC Object to PHP Types\n\t *\n\t * @param\tobject\n\t * @return\tarray\n\t */\n\tpublic function xmlrpc_decoder($xmlrpc_val)\n\t{\n\t\t$kind = $xmlrpc_val->kindOf();\n\n\t\tif ($kind === 'scalar')\n\t\t{\n\t\t\treturn $xmlrpc_val->scalarval();\n\t\t}\n\t\telseif ($kind === 'array')\n\t\t{\n\t\t\treset($xmlrpc_val->me);\n\t\t\t$b = current($xmlrpc_val->me);\n\t\t\t$arr = array();\n\n\t\t\tfor ($i = 0, $size = count($b); $i < $size; $i++)\n\t\t\t{\n\t\t\t\t$arr[] = $this->xmlrpc_decoder($xmlrpc_val->me['array'][$i]);\n\t\t\t}\n\t\t\treturn $arr;\n\t\t}\n\t\telseif ($kind === 'struct')\n\t\t{\n\t\t\treset($xmlrpc_val->me['struct']);\n\t\t\t$arr = array();\n\n\t\t\tforeach ($xmlrpc_val->me['struct'] as $key => &$value)\n\t\t\t{\n\t\t\t\t$arr[$key] = $this->xmlrpc_decoder($value);\n\t\t\t}\n\n\t\t\treturn $arr;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * ISO-8601 time to server or UTC time\n\t *\n\t * @param\tstring\n\t * @param\tbool\n\t * @return\tint\tunix timestamp\n\t */\n\tpublic function iso8601_decode($time, $utc = FALSE)\n\t{\n\t\t// Return a time in the localtime, or UTC\n\t\t$t = 0;\n\t\tif (preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $time, $regs))\n\t\t{\n\t\t\t$fnc = ($utc === TRUE) ? 'gmmktime' : 'mktime';\n\t\t\t$t = $fnc($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);\n\t\t}\n\t\treturn $t;\n\t}\n\n} // END XML_RPC_Response Class\n\n/**\n * XML-RPC Message class\n *\n * @category\tXML-RPC\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/xmlrpc.html\n */\nclass XML_RPC_Message extends CI_Xmlrpc\n{\n\n\t/**\n\t * Payload\n\t *\n\t * @var\tstring\n\t */\n\tpublic $payload;\n\n\t/**\n\t * Method name\n\t *\n\t * @var\tstring\n\t */\n\tpublic $method_name;\n\n\t/**\n\t * Parameter list\n\t *\n\t * @var\tarray\n\t */\n\tpublic $params\t\t= array();\n\n\t/**\n\t * XH?\n\t *\n\t * @var\tarray\n\t */\n\tpublic $xh\t\t= array();\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tstring\t$method\n\t * @param\tarray\t$pars\n\t * @return\tvoid\n\t */\n\tpublic function __construct($method, $pars = FALSE)\n\t{\n\t\tparent::__construct();\n\n\t\t$this->method_name = $method;\n\t\tif (is_array($pars) && count($pars) > 0)\n\t\t{\n\t\t\tfor ($i = 0, $c = count($pars); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t// $pars[$i] = XML_RPC_Values\n\t\t\t\t$this->params[] = $pars[$i];\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Create Payload to Send\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function createPayload()\n\t{\n\t\t$this->payload = '<?xml version=\"1.0\"?'.\">\\r\\n<methodCall>\\r\\n\"\n\t\t\t\t.'<methodName>'.$this->method_name.\"</methodName>\\r\\n\"\n\t\t\t\t.\"<params>\\r\\n\";\n\n\t\tfor ($i = 0, $c = count($this->params); $i < $c; $i++)\n\t\t{\n\t\t\t// $p = XML_RPC_Values\n\t\t\t$p = $this->params[$i];\n\t\t\t$this->payload .= \"<param>\\r\\n\".$p->serialize_class().\"</param>\\r\\n\";\n\t\t}\n\n\t\t$this->payload .= \"</params>\\r\\n</methodCall>\\r\\n\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse External XML-RPC Server's Response\n\t *\n\t * @param\tresource\n\t * @return\tobject\n\t */\n\tpublic function parseResponse($fp)\n\t{\n\t\t$data = '';\n\n\t\twhile ($datum = fread($fp, 4096))\n\t\t{\n\t\t\t$data .= $datum;\n\t\t}\n\n\t\t// Display HTTP content for debugging\n\t\tif ($this->debug === TRUE)\n\t\t{\n\t\t\techo \"<pre>---DATA---\\n\".htmlspecialchars($data).\"\\n---END DATA---\\n\\n</pre>\";\n\t\t}\n\n\t\t// Check for data\n\t\tif ($data === '')\n\t\t{\n\t\t\terror_log($this->xmlrpcstr['no_data']);\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['no_data'], $this->xmlrpcstr['no_data']);\n\t\t}\n\n\t\t// Check for HTTP 200 Response\n\t\tif (strpos($data, 'HTTP') === 0 && ! preg_match('/^HTTP\\/[0-9\\.]+ 200 /', $data))\n\t\t{\n\t\t\t$errstr = substr($data, 0, strpos($data, \"\\n\")-1);\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error'].' ('.$errstr.')');\n\t\t}\n\n\t\t//-------------------------------------\n\t\t// Create and Set Up XML Parser\n\t\t//-------------------------------------\n\n\t\t$parser = xml_parser_create($this->xmlrpc_defencoding);\n\t\t$pname = (string) $parser;\n\t\t$this->xh[$pname] = array(\n\t\t\t'isf'\t\t=> 0,\n\t\t\t'ac'\t\t=> '',\n\t\t\t'headers'\t=> array(),\n\t\t\t'stack'\t\t=> array(),\n\t\t\t'valuestack'\t=> array(),\n\t\t\t'isf_reason'\t=> 0\n\t\t);\n\n\t\txml_set_object($parser, $this);\n\t\txml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, TRUE);\n\t\txml_set_element_handler($parser, 'open_tag', 'closing_tag');\n\t\txml_set_character_data_handler($parser, 'character_data');\n\t\t//xml_set_default_handler($parser, 'default_handler');\n\n\t\t// Get headers\n\t\t$lines = explode(\"\\r\\n\", $data);\n\t\twhile (($line = array_shift($lines)))\n\t\t{\n\t\t\tif (strlen($line) < 1)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$this->xh[$pname]['headers'][] = $line;\n\t\t}\n\t\t$data = implode(\"\\r\\n\", $lines);\n\n\t\t// Parse XML data\n\t\tif ( ! xml_parse($parser, $data, TRUE))\n\t\t{\n\t\t\t$errstr = sprintf('XML error: %s at line %d',\n\t\t\t\t\t\txml_error_string(xml_get_error_code($parser)),\n\t\t\t\t\t\txml_get_current_line_number($parser));\n\n\t\t\t$r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);\n\t\t\txml_parser_free($parser);\n\t\t\treturn $r;\n\t\t}\n\t\txml_parser_free($parser);\n\n\t\t// Got ourselves some badness, it seems\n\t\tif ($this->xh[$pname]['isf'] > 1)\n\t\t{\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\techo \"---Invalid Return---\\n\".$this->xh[$pname]['isf_reason'].\"---Invalid Return---\\n\\n\";\n\t\t\t}\n\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return'].' '.$this->xh[$pname]['isf_reason']);\n\t\t}\n\t\telseif ( ! is_object($this->xh[$pname]['value']))\n\t\t{\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return'].' '.$this->xh[$pname]['isf_reason']);\n\t\t}\n\n\t\t// Display XML content for debugging\n\t\tif ($this->debug === TRUE)\n\t\t{\n\t\t\techo '<pre>';\n\n\t\t\tif (count($this->xh[$pname]['headers']) > 0)\n\t\t\t{\n\t\t\t\techo \"---HEADERS---\\n\";\n\t\t\t\tforeach ($this->xh[$pname]['headers'] as $header)\n\t\t\t\t{\n\t\t\t\t\techo $header.\"\\n\";\n\t\t\t\t}\n\t\t\t\techo \"---END HEADERS---\\n\\n\";\n\t\t\t}\n\n\t\t\techo \"---DATA---\\n\".htmlspecialchars($data).\"\\n---END DATA---\\n\\n---PARSED---\\n\";\n\t\t\tvar_dump($this->xh[$pname]['value']);\n\t\t\techo \"\\n---END PARSED---</pre>\";\n\t\t}\n\n\t\t// Send response\n\t\t$v = $this->xh[$pname]['value'];\n\t\tif ($this->xh[$pname]['isf'])\n\t\t{\n\t\t\t$errno_v = $v->me['struct']['faultCode'];\n\t\t\t$errstr_v = $v->me['struct']['faultString'];\n\t\t\t$errno = $errno_v->scalarval();\n\n\t\t\tif ($errno === 0)\n\t\t\t{\n\t\t\t\t// FAULT returned, errno needs to reflect that\n\t\t\t\t$errno = -1;\n\t\t\t}\n\n\t\t\t$r = new XML_RPC_Response($v, $errno, $errstr_v->scalarval());\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$r = new XML_RPC_Response($v);\n\t\t}\n\n\t\t$r->headers = $this->xh[$pname]['headers'];\n\t\treturn $r;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t// ------------------------------------\n\t//  Begin Return Message Parsing section\n\t// ------------------------------------\n\n\t// quick explanation of components:\n\t//   ac - used to accumulate values\n\t//   isf - used to indicate a fault\n\t//   lv - used to indicate \"looking for a value\": implements\n\t//\t\tthe logic to allow values with no types to be strings\n\t//   params - used to store parameters in method calls\n\t//   method - used to store method name\n\t//\t stack - array with parent tree of the xml element,\n\t//\t\t\t used to validate the nesting of elements\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Start Element Handler\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function open_tag($the_parser, $name)\n\t{\n\t\t$the_parser = (string) $the_parser;\n\n\t\t// If invalid nesting, then return\n\t\tif ($this->xh[$the_parser]['isf'] > 1) return;\n\n\t\t// Evaluate and check for correct nesting of XML elements\n\t\tif (count($this->xh[$the_parser]['stack']) === 0)\n\t\t{\n\t\t\tif ($name !== 'METHODRESPONSE' && $name !== 'METHODCALL')\n\t\t\t{\n\t\t\t\t$this->xh[$the_parser]['isf'] = 2;\n\t\t\t\t$this->xh[$the_parser]['isf_reason'] = 'Top level XML-RPC element is missing';\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// not top level element: see if parent is OK\n\t\telseif ( ! in_array($this->xh[$the_parser]['stack'][0], $this->valid_parents[$name], TRUE))\n\t\t{\n\t\t\t$this->xh[$the_parser]['isf'] = 2;\n\t\t\t$this->xh[$the_parser]['isf_reason'] = 'XML-RPC element '.$name.' cannot be child of '.$this->xh[$the_parser]['stack'][0];\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ($name)\n\t\t{\n\t\t\tcase 'STRUCT':\n\t\t\tcase 'ARRAY':\n\t\t\t\t// Creates array for child elements\n\t\t\t\t$cur_val = array('value' => array(), 'type' => $name);\n\t\t\t\tarray_unshift($this->xh[$the_parser]['valuestack'], $cur_val);\n\t\t\t\tbreak;\n\t\t\tcase 'METHODNAME':\n\t\t\tcase 'NAME':\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\t\t\t\tbreak;\n\t\t\tcase 'FAULT':\n\t\t\t\t$this->xh[$the_parser]['isf'] = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'PARAM':\n\t\t\t\t$this->xh[$the_parser]['value'] = NULL;\n\t\t\t\tbreak;\n\t\t\tcase 'VALUE':\n\t\t\t\t$this->xh[$the_parser]['vt'] = 'value';\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\t\t\t\t$this->xh[$the_parser]['lv'] = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'I4':\n\t\t\tcase 'INT':\n\t\t\tcase 'STRING':\n\t\t\tcase 'BOOLEAN':\n\t\t\tcase 'DOUBLE':\n\t\t\tcase 'DATETIME.ISO8601':\n\t\t\tcase 'BASE64':\n\t\t\t\tif ($this->xh[$the_parser]['vt'] !== 'value')\n\t\t\t\t{\n\t\t\t\t\t//two data elements inside a value: an error occurred!\n\t\t\t\t\t$this->xh[$the_parser]['isf'] = 2;\n\t\t\t\t\t$this->xh[$the_parser]['isf_reason'] = 'There is a '.$name.' element following a '\n\t\t\t\t\t\t\t\t\t\t.$this->xh[$the_parser]['vt'].' element inside a single value';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\t\t\t\tbreak;\n\t\t\tcase 'MEMBER':\n\t\t\t\t// Set name of <member> to nothing to prevent errors later if no <name> is found\n\t\t\t\t$this->xh[$the_parser]['valuestack'][0]['name'] = '';\n\n\t\t\t\t// Set NULL value to check to see if value passed for this param/member\n\t\t\t\t$this->xh[$the_parser]['value'] = NULL;\n\t\t\t\tbreak;\n\t\t\tcase 'DATA':\n\t\t\tcase 'METHODCALL':\n\t\t\tcase 'METHODRESPONSE':\n\t\t\tcase 'PARAMS':\n\t\t\t\t// valid elements that add little to processing\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t/// An Invalid Element is Found, so we have trouble\n\t\t\t\t$this->xh[$the_parser]['isf'] = 2;\n\t\t\t\t$this->xh[$the_parser]['isf_reason'] = 'Invalid XML-RPC element found: '.$name;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Add current element name to stack, to allow validation of nesting\n\t\tarray_unshift($this->xh[$the_parser]['stack'], $name);\n\n\t\t$name === 'VALUE' OR $this->xh[$the_parser]['lv'] = 0;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * End Element Handler\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function closing_tag($the_parser, $name)\n\t{\n\t\t$the_parser = (string) $the_parser;\n\n\t\tif ($this->xh[$the_parser]['isf'] > 1) return;\n\n\t\t// Remove current element from stack and set variable\n\t\t// NOTE: If the XML validates, then we do not have to worry about\n\t\t// the opening and closing of elements. Nesting is checked on the opening\n\t\t// tag so we be safe there as well.\n\n\t\t$curr_elem = array_shift($this->xh[$the_parser]['stack']);\n\n\t\tswitch ($name)\n\t\t{\n\t\t\tcase 'STRUCT':\n\t\t\tcase 'ARRAY':\n\t\t\t\t$cur_val = array_shift($this->xh[$the_parser]['valuestack']);\n\t\t\t\t$this->xh[$the_parser]['value'] = isset($cur_val['values']) ? $cur_val['values'] : array();\n\t\t\t\t$this->xh[$the_parser]['vt']\t= strtolower($name);\n\t\t\t\tbreak;\n\t\t\tcase 'NAME':\n\t\t\t\t$this->xh[$the_parser]['valuestack'][0]['name'] = $this->xh[$the_parser]['ac'];\n\t\t\t\tbreak;\n\t\t\tcase 'BOOLEAN':\n\t\t\tcase 'I4':\n\t\t\tcase 'INT':\n\t\t\tcase 'STRING':\n\t\t\tcase 'DOUBLE':\n\t\t\tcase 'DATETIME.ISO8601':\n\t\t\tcase 'BASE64':\n\t\t\t\t$this->xh[$the_parser]['vt'] = strtolower($name);\n\n\t\t\t\tif ($name === 'STRING')\n\t\t\t\t{\n\t\t\t\t\t$this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];\n\t\t\t\t}\n\t\t\t\telseif ($name === 'DATETIME.ISO8601')\n\t\t\t\t{\n\t\t\t\t\t$this->xh[$the_parser]['vt']\t= $this->xmlrpcDateTime;\n\t\t\t\t\t$this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];\n\t\t\t\t}\n\t\t\t\telseif ($name === 'BASE64')\n\t\t\t\t{\n\t\t\t\t\t$this->xh[$the_parser]['value'] = base64_decode($this->xh[$the_parser]['ac']);\n\t\t\t\t}\n\t\t\t\telseif ($name === 'BOOLEAN')\n\t\t\t\t{\n\t\t\t\t\t// Translated BOOLEAN values to TRUE AND FALSE\n\t\t\t\t\t$this->xh[$the_parser]['value'] = (bool) $this->xh[$the_parser]['ac'];\n\t\t\t\t}\n\t\t\t\telseif ($name=='DOUBLE')\n\t\t\t\t{\n\t\t\t\t\t// we have a DOUBLE\n\t\t\t\t\t// we must check that only 0123456789-.<space> are characters here\n\t\t\t\t\t$this->xh[$the_parser]['value'] = preg_match('/^[+-]?[eE0-9\\t \\.]+$/', $this->xh[$the_parser]['ac'])\n\t\t\t\t\t\t\t\t\t\t? (float) $this->xh[$the_parser]['ac']\n\t\t\t\t\t\t\t\t\t\t: 'ERROR_NON_NUMERIC_FOUND';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// we have an I4/INT\n\t\t\t\t\t// we must check that only 0123456789-<space> are characters here\n\t\t\t\t\t$this->xh[$the_parser]['value'] = preg_match('/^[+-]?[0-9\\t ]+$/', $this->xh[$the_parser]['ac'])\n\t\t\t\t\t\t\t\t\t\t? (int) $this->xh[$the_parser]['ac']\n\t\t\t\t\t\t\t\t\t\t: 'ERROR_NON_NUMERIC_FOUND';\n\t\t\t\t}\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\t\t\t\t$this->xh[$the_parser]['lv'] = 3; // indicate we've found a value\n\t\t\t\tbreak;\n\t\t\tcase 'VALUE':\n\t\t\t\t// This if() detects if no scalar was inside <VALUE></VALUE>\n\t\t\t\tif ($this->xh[$the_parser]['vt'] == 'value')\n\t\t\t\t{\n\t\t\t\t\t$this->xh[$the_parser]['value']\t= $this->xh[$the_parser]['ac'];\n\t\t\t\t\t$this->xh[$the_parser]['vt']\t= $this->xmlrpcString;\n\t\t\t\t}\n\n\t\t\t\t// build the XML-RPC value out of the data received, and substitute it\n\t\t\t\t$temp = new XML_RPC_Values($this->xh[$the_parser]['value'], $this->xh[$the_parser]['vt']);\n\n\t\t\t\tif (count($this->xh[$the_parser]['valuestack']) && $this->xh[$the_parser]['valuestack'][0]['type'] === 'ARRAY')\n\t\t\t\t{\n\t\t\t\t\t// Array\n\t\t\t\t\t$this->xh[$the_parser]['valuestack'][0]['values'][] = $temp;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Struct\n\t\t\t\t\t$this->xh[$the_parser]['value'] = $temp;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'MEMBER':\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\n\t\t\t\t// If value add to array in the stack for the last element built\n\t\t\t\tif ($this->xh[$the_parser]['value'])\n\t\t\t\t{\n\t\t\t\t\t$this->xh[$the_parser]['valuestack'][0]['values'][$this->xh[$the_parser]['valuestack'][0]['name']] = $this->xh[$the_parser]['value'];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'DATA':\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\t\t\t\tbreak;\n\t\t\tcase 'PARAM':\n\t\t\t\tif ($this->xh[$the_parser]['value'])\n\t\t\t\t{\n\t\t\t\t\t$this->xh[$the_parser]['params'][] = $this->xh[$the_parser]['value'];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'METHODNAME':\n\t\t\t\t$this->xh[$the_parser]['method'] = ltrim($this->xh[$the_parser]['ac']);\n\t\t\t\tbreak;\n\t\t\tcase 'PARAMS':\n\t\t\tcase 'FAULT':\n\t\t\tcase 'METHODCALL':\n\t\t\tcase 'METHORESPONSE':\n\t\t\t\t// We're all good kids with nuthin' to do\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// End of an Invalid Element. Taken care of during the opening tag though\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse character data\n\t *\n\t * @param\tstring\n\t * @param\tstring\n\t * @return\tvoid\n\t */\n\tpublic function character_data($the_parser, $data)\n\t{\n\t\t$the_parser = (string) $the_parser;\n\n\t\tif ($this->xh[$the_parser]['isf'] > 1) return; // XML Fault found already\n\n\t\t// If a value has not been found\n\t\tif ($this->xh[$the_parser]['lv'] !== 3)\n\t\t{\n\t\t\tif ($this->xh[$the_parser]['lv'] === 1)\n\t\t\t{\n\t\t\t\t$this->xh[$the_parser]['lv'] = 2; // Found a value\n\t\t\t}\n\n\t\t\tif ( ! isset($this->xh[$the_parser]['ac']))\n\t\t\t{\n\t\t\t\t$this->xh[$the_parser]['ac'] = '';\n\t\t\t}\n\n\t\t\t$this->xh[$the_parser]['ac'] .= $data;\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add parameter\n\t *\n\t * @param\tmixed\n\t * @return\tvoid\n\t */\n\tpublic function addParam($par)\n\t{\n\t\t$this->params[] = $par;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Output parameters\n\t *\n\t * @param\tarray\t$array\n\t * @return\tarray\n\t */\n\tpublic function output_parameters(array $array = array())\n\t{\n\t\t$CI =& get_instance();\n\n\t\tif ( ! empty($array))\n\t\t{\n\t\t\tforeach ($array as $key => &$value)\n\t\t\t{\n\t\t\t\tif (is_array($value))\n\t\t\t\t{\n\t\t\t\t\t$array[$key] = $this->output_parameters($value);\n\t\t\t\t}\n\t\t\t\telseif ($key !== 'bits' && $this->xss_clean)\n\t\t\t\t{\n\t\t\t\t\t// 'bits' is for the MetaWeblog API image bits\n\t\t\t\t\t// @todo - this needs to be made more general purpose\n\t\t\t\t\t$array[$key] = $CI->security->xss_clean($value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $array;\n\t\t}\n\n\t\t$parameters = array();\n\n\t\tfor ($i = 0, $c = count($this->params); $i < $c; $i++)\n\t\t{\n\t\t\t$a_param = $this->decode_message($this->params[$i]);\n\n\t\t\tif (is_array($a_param))\n\t\t\t{\n\t\t\t\t$parameters[] = $this->output_parameters($a_param);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$parameters[] = ($this->xss_clean) ? $CI->security->xss_clean($a_param) : $a_param;\n\t\t\t}\n\t\t}\n\n\t\treturn $parameters;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Decode message\n\t *\n\t * @param\tobject\n\t * @return\tmixed\n\t */\n\tpublic function decode_message($param)\n\t{\n\t\t$kind = $param->kindOf();\n\n\t\tif ($kind === 'scalar')\n\t\t{\n\t\t\treturn $param->scalarval();\n\t\t}\n\t\telseif ($kind === 'array')\n\t\t{\n\t\t\treset($param->me);\n\t\t\t$b = current($param->me);\n\t\t\t$arr = array();\n\n\t\t\tfor ($i = 0, $c = count($b); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$arr[] = $this->decode_message($param->me['array'][$i]);\n\t\t\t}\n\n\t\t\treturn $arr;\n\t\t}\n\t\telseif ($kind === 'struct')\n\t\t{\n\t\t\treset($param->me['struct']);\n\t\t\t$arr = array();\n\n\t\t\tforeach ($param->me['struct'] as $key => &$value)\n\t\t\t{\n\t\t\t\t$arr[$key] = $this->decode_message($value);\n\t\t\t}\n\n\t\t\treturn $arr;\n\t\t}\n\t}\n\n} // END XML_RPC_Message Class\n\n/**\n * XML-RPC Values class\n *\n * @category\tXML-RPC\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/xmlrpc.html\n */\nclass XML_RPC_Values extends CI_Xmlrpc\n{\n\t/**\n\t * Value data\n\t *\n\t * @var\tarray\n\t */\n\tpublic $me\t= array();\n\n\t/**\n\t * Value type\n\t *\n\t * @var\tint\n\t */\n\tpublic $mytype\t= 0;\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Constructor\n\t *\n\t * @param\tmixed\t$val\n\t * @param\tstring\t$type\n\t * @return\tvoid\n\t */\n\tpublic function __construct($val = -1, $type = '')\n\t{\n\t\tparent::__construct();\n\n\t\tif ($val !== -1 OR $type !== '')\n\t\t{\n\t\t\t$type = $type === '' ? 'string' : $type;\n\n\t\t\tif ($this->xmlrpcTypes[$type] == 1)\n\t\t\t{\n\t\t\t\t$this->addScalar($val, $type);\n\t\t\t}\n\t\t\telseif ($this->xmlrpcTypes[$type] == 2)\n\t\t\t{\n\t\t\t\t$this->addArray($val);\n\t\t\t}\n\t\t\telseif ($this->xmlrpcTypes[$type] == 3)\n\t\t\t{\n\t\t\t\t$this->addStruct($val);\n\t\t\t}\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add scalar value\n\t *\n\t * @param\tscalar\n\t * @param\tstring\n\t * @return\tint\n\t */\n\tpublic function addScalar($val, $type = 'string')\n\t{\n\t\t$typeof = $this->xmlrpcTypes[$type];\n\n\t\tif ($this->mytype === 1)\n\t\t{\n\t\t\techo '<strong>XML_RPC_Values</strong>: scalar can have only one value<br />';\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ($typeof != 1)\n\t\t{\n\t\t\techo '<strong>XML_RPC_Values</strong>: not a scalar type (${typeof})<br />';\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ($type === $this->xmlrpcBoolean)\n\t\t{\n\t\t\t$val = (int) (strcasecmp($val, 'true') === 0 OR $val === 1 OR ($val === TRUE && strcasecmp($val, 'false')));\n\t\t}\n\n\t\tif ($this->mytype === 2)\n\t\t{\n\t\t\t// adding to an array here\n\t\t\t$ar = $this->me['array'];\n\t\t\t$ar[] = new XML_RPC_Values($val, $type);\n\t\t\t$this->me['array'] = $ar;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// a scalar, so set the value and remember we're scalar\n\t\t\t$this->me[$type] = $val;\n\t\t\t$this->mytype = $typeof;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add array value\n\t *\n\t * @param\tarray\n\t * @return\tint\n\t */\n\tpublic function addArray($vals)\n\t{\n\t\tif ($this->mytype !== 0)\n\t\t{\n\t\t\techo '<strong>XML_RPC_Values</strong>: already initialized as a ['.$this->kindOf().']<br />';\n\t\t\treturn 0;\n\t\t}\n\n\t\t$this->mytype = $this->xmlrpcTypes['array'];\n\t\t$this->me['array'] = $vals;\n\t\treturn 1;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add struct value\n\t *\n\t * @param\tobject\n\t * @return\tint\n\t */\n\tpublic function addStruct($vals)\n\t{\n\t\tif ($this->mytype !== 0)\n\t\t{\n\t\t\techo '<strong>XML_RPC_Values</strong>: already initialized as a ['.$this->kindOf().']<br />';\n\t\t\treturn 0;\n\t\t}\n\t\t$this->mytype = $this->xmlrpcTypes['struct'];\n\t\t$this->me['struct'] = $vals;\n\t\treturn 1;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get value type\n\t *\n\t * @return\tstring\n\t */\n\tpublic function kindOf()\n\t{\n\t\tswitch ($this->mytype)\n\t\t{\n\t\t\tcase 3: return 'struct';\n\t\t\tcase 2: return 'array';\n\t\t\tcase 1: return 'scalar';\n\t\t\tdefault: return 'undef';\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Serialize data\n\t *\n\t * @param\tstring\n\t * @param\tmixed\n\t * @return\tstring\n\t */\n\tpublic function serializedata($typ, $val)\n\t{\n\t\t$rs = '';\n\n\t\tswitch ($this->xmlrpcTypes[$typ])\n\t\t{\n\t\t\tcase 3:\n\t\t\t\t// struct\n\t\t\t\t$rs .= \"<struct>\\n\";\n\t\t\t\treset($val);\n\t\t\t\tforeach ($val as $key2 => &$val2)\n\t\t\t\t{\n\t\t\t\t\t$rs .= \"<member>\\n<name>{$key2}</name>\\n\".$this->serializeval($val2).\"</member>\\n\";\n\t\t\t\t}\n\t\t\t\t$rs .= '</struct>';\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t// array\n\t\t\t\t$rs .= \"<array>\\n<data>\\n\";\n\t\t\t\tfor ($i = 0, $c = count($val); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$rs .= $this->serializeval($val[$i]);\n\t\t\t\t}\n\t\t\t\t$rs .= \"</data>\\n</array>\\n\";\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\t// others\n\t\t\t\tswitch ($typ)\n\t\t\t\t{\n\t\t\t\t\tcase $this->xmlrpcBase64:\n\t\t\t\t\t\t$rs .= '<'.$typ.'>'.base64_encode( (string) $val).'</'.$typ.\">\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase $this->xmlrpcBoolean:\n\t\t\t\t\t\t$rs .= '<'.$typ.'>'.( (bool) $val ? '1' : '0').'</'.$typ.\">\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase $this->xmlrpcString:\n\t\t\t\t\t\t$rs .= '<'.$typ.'>'.htmlspecialchars( (string) $val).'</'.$typ.\">\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$rs .= '<'.$typ.'>'.$val.'</'.$typ.\">\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn $rs;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Serialize class\n\t *\n\t * @return\tstring\n\t */\n\tpublic function serialize_class()\n\t{\n\t\treturn $this->serializeval($this);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Serialize value\n\t *\n\t * @param\tobject\n\t * @return\tstring\n\t */\n\tpublic function serializeval($o)\n\t{\n\t\t$array = $o->me;\n\t\tlist($value, $type) = array(reset($array), key($array));\n\t\treturn \"<value>\\n\".$this->serializedata($type, $value).\"</value>\\n\";\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Scalar value\n\t *\n\t * @return\tmixed\n\t */\n\tpublic function scalarval()\n\t{\n\t\treturn reset($this->me);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Encode time in ISO-8601 form.\n\t * Useful for sending time in XML-RPC\n\t *\n\t * @param\tint\tunix timestamp\n\t * @param\tbool\n\t * @return\tstring\n\t */\n\tpublic function iso8601_encode($time, $utc = FALSE)\n\t{\n\t\treturn ($utc) ? date('Ymd\\TH:i:s', $time) : gmdate('Ymd\\TH:i:s', $time);\n\t}\n\n} // END XML_RPC_Values Class\n"
  },
  {
    "path": "system/libraries/Xmlrpcs.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\nif ( ! function_exists('xml_parser_create'))\n{\n\tshow_error('Your PHP installation does not support XML');\n}\n\nif ( ! class_exists('CI_Xmlrpc', FALSE))\n{\n\tshow_error('You must load the Xmlrpc class before loading the Xmlrpcs class in order to create a server.');\n}\n\n// ------------------------------------------------------------------------\n\n/**\n * XML-RPC server class\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tXML-RPC\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/xmlrpc.html\n */\nclass CI_Xmlrpcs extends CI_Xmlrpc {\n\n\t/**\n\t * Array of methods mapped to function names and signatures\n\t *\n\t * @var array\n\t */\n\tpublic $methods = array();\n\n\t/**\n\t * Debug Message\n\t *\n\t * @var string\n\t */\n\tpublic $debug_msg = '';\n\n\t/**\n\t * XML RPC Server methods\n\t *\n\t * @var array\n\t */\n\tpublic $system_methods\t= array();\n\n\t/**\n\t * Configuration object\n\t *\n\t * @var object\n\t */\n\tpublic $object = FALSE;\n\n\t/**\n\t * Initialize XMLRPC class\n\t *\n\t * @param\tarray\t$config\n\t * @return\tvoid\n\t */\n\tpublic function __construct($config = array())\n\t{\n\t\tparent::__construct();\n\t\t$this->set_system_methods();\n\n\t\tif (isset($config['functions']) && is_array($config['functions']))\n\t\t{\n\t\t\t$this->methods = array_merge($this->methods, $config['functions']);\n\t\t}\n\n\t\tlog_message('info', 'XML-RPC Server Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize Prefs and Serve\n\t *\n\t * @param\tmixed\n\t * @return\tvoid\n\t */\n\tpublic function initialize($config = array())\n\t{\n\t\tif (isset($config['functions']) && is_array($config['functions']))\n\t\t{\n\t\t\t$this->methods = array_merge($this->methods, $config['functions']);\n\t\t}\n\n\t\tif (isset($config['debug']))\n\t\t{\n\t\t\t$this->debug = $config['debug'];\n\t\t}\n\n\t\tif (isset($config['object']) && is_object($config['object']))\n\t\t{\n\t\t\t$this->object = $config['object'];\n\t\t}\n\n\t\tif (isset($config['xss_clean']))\n\t\t{\n\t\t\t$this->xss_clean = $config['xss_clean'];\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Setting of System Methods\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function set_system_methods()\n\t{\n\t\t$this->methods = array(\n\t\t\t\t\t'system.listMethods'\t => array(\n\t\t\t\t\t\t\t\t\t\t'function' => 'this.listMethods',\n\t\t\t\t\t\t\t\t\t\t'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString), array($this->xmlrpcArray)),\n\t\t\t\t\t\t\t\t\t\t'docstring' => 'Returns an array of available methods on this server'),\n\t\t\t\t\t'system.methodHelp'\t => array(\n\t\t\t\t\t\t\t\t\t\t'function' => 'this.methodHelp',\n\t\t\t\t\t\t\t\t\t\t'signature' => array(array($this->xmlrpcString, $this->xmlrpcString)),\n\t\t\t\t\t\t\t\t\t\t'docstring' => 'Returns a documentation string for the specified method'),\n\t\t\t\t\t'system.methodSignature' => array(\n\t\t\t\t\t\t\t\t\t\t'function' => 'this.methodSignature',\n\t\t\t\t\t\t\t\t\t\t'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString)),\n\t\t\t\t\t\t\t\t\t\t'docstring' => 'Returns an array describing the return type and required parameters of a method'),\n\t\t\t\t\t'system.multicall'\t => array(\n\t\t\t\t\t\t\t\t\t\t'function' => 'this.multicall',\n\t\t\t\t\t\t\t\t\t\t'signature' => array(array($this->xmlrpcArray, $this->xmlrpcArray)),\n\t\t\t\t\t\t\t\t\t\t'docstring' => 'Combine multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details')\n\t\t\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Main Server Function\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function serve()\n\t{\n\t\t$r = $this->parseRequest();\n\t\t$payload = '<?xml version=\"1.0\" encoding=\"'.$this->xmlrpc_defencoding.'\"?'.'>'.\"\\n\".$this->debug_msg.$r->prepare_response();\n\n\t\theader('Content-Type: text/xml');\n\t\theader('Content-Length: '.strlen($payload));\n\t\texit($payload);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Method to Class\n\t *\n\t * @param\tstring\tmethod name\n\t * @param\tstring\tfunction\n\t * @param\tstring\tsignature\n\t * @param\tstring\tdocstring\n\t * @return\tvoid\n\t */\n\tpublic function add_to_map($methodname, $function, $sig, $doc)\n\t{\n\t\t$this->methods[$methodname] = array(\n\t\t\t'function'\t=> $function,\n\t\t\t'signature'\t=> $sig,\n\t\t\t'docstring'\t=> $doc\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Parse Server Request\n\t *\n\t * @param\tstring\tdata\n\t * @return\tobject\txmlrpc response\n\t */\n\tpublic function parseRequest($data = '')\n\t{\n\t\t//-------------------------------------\n\t\t//  Get Data\n\t\t//-------------------------------------\n\n\t\tif ($data === '')\n\t\t{\n\t\t\t$CI =& get_instance();\n\t\t\tif ($CI->input->method() === 'post')\n\t\t\t{\n\t\t\t\t$data = $CI->input->raw_input_stream;\n\t\t\t}\n\t\t}\n\n\t\t//-------------------------------------\n\t\t//  Set up XML Parser\n\t\t//-------------------------------------\n\n\t\t$parser = xml_parser_create($this->xmlrpc_defencoding);\n\t\t$parser_object = new XML_RPC_Message('filler');\n\t\t$pname = (string) $parser;\n\n\t\t$parser_object->xh[$pname] = array(\n\t\t\t'isf' => 0,\n\t\t\t'isf_reason' => '',\n\t\t\t'params' => array(),\n\t\t\t'stack' => array(),\n\t\t\t'valuestack' => array(),\n\t\t\t'method' => ''\n\t\t);\n\n\t\txml_set_object($parser, $parser_object);\n\t\txml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, TRUE);\n\t\txml_set_element_handler($parser, 'open_tag', 'closing_tag');\n\t\txml_set_character_data_handler($parser, 'character_data');\n\t\t//xml_set_default_handler($parser, 'default_handler');\n\n\t\t//-------------------------------------\n\t\t// PARSE + PROCESS XML DATA\n\t\t//-------------------------------------\n\n\t\tif ( ! xml_parse($parser, $data, 1))\n\t\t{\n\t\t\t// Return XML error as a faultCode\n\t\t\t$r = new XML_RPC_Response(0,\n\t\t\t\t$this->xmlrpcerrxml + xml_get_error_code($parser),\n\t\t\t\tsprintf('XML error: %s at line %d',\n\t\t\t\txml_error_string(xml_get_error_code($parser)),\n\t\t\t\txml_get_current_line_number($parser)));\n\t\t\txml_parser_free($parser);\n\t\t}\n\t\telseif ($parser_object->xh[$pname]['isf'])\n\t\t{\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);\n\t\t}\n\t\telse\n\t\t{\n\t\t\txml_parser_free($parser);\n\n\t\t\t$m = new XML_RPC_Message($parser_object->xh[$pname]['method']);\n\t\t\t$plist = '';\n\n\t\t\tfor ($i = 0, $c = count($parser_object->xh[$pname]['params']); $i < $c; $i++)\n\t\t\t{\n\t\t\t\tif ($this->debug === TRUE)\n\t\t\t\t{\n\t\t\t\t\t$plist .= $i.' - '.print_r(get_object_vars($parser_object->xh[$pname]['params'][$i]), TRUE).\";\\n\";\n\t\t\t\t}\n\n\t\t\t\t$m->addParam($parser_object->xh[$pname]['params'][$i]);\n\t\t\t}\n\n\t\t\tif ($this->debug === TRUE)\n\t\t\t{\n\t\t\t\techo \"<pre>---PLIST---\\n\".$plist.\"\\n---PLIST END---\\n\\n</pre>\";\n\t\t\t}\n\n\t\t\t$r = $this->_execute($m);\n\t\t}\n\n\t\t//-------------------------------------\n\t\t// SET DEBUGGING MESSAGE\n\t\t//-------------------------------------\n\n\t\tif ($this->debug === TRUE)\n\t\t{\n\t\t\t$this->debug_msg = \"<!-- DEBUG INFO:\\n\\n\".$plist.\"\\n END DEBUG-->\\n\";\n\t\t}\n\n\t\treturn $r;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Executes the Method\n\t *\n\t * @param\tobject\n\t * @return\tmixed\n\t */\n\tprotected function _execute($m)\n\t{\n\t\t$methName = $m->method_name;\n\n\t\t// Check to see if it is a system call\n\t\t$system_call = (strpos($methName, 'system') === 0);\n\n\t\tif ($this->xss_clean === FALSE)\n\t\t{\n\t\t\t$m->xss_clean = FALSE;\n\t\t}\n\n\t\t//-------------------------------------\n\t\t// Valid Method\n\t\t//-------------------------------------\n\n\t\tif ( ! isset($this->methods[$methName]['function']))\n\t\t{\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\n\t\t}\n\n\t\t//-------------------------------------\n\t\t// Check for Method (and Object)\n\t\t//-------------------------------------\n\n\t\t$method_parts = explode('.', $this->methods[$methName]['function']);\n\t\t$objectCall   = ! empty($method_parts[1]);\n\n\t\tif ($system_call === TRUE)\n\t\t{\n\t\t\tif ( ! is_callable(array($this, $method_parts[1])))\n\t\t\t{\n\t\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\n\t\t\t}\n\t\t}\n\t\telseif (($objectCall && ( ! method_exists($method_parts[0], $method_parts[1]) OR ! (new ReflectionMethod($method_parts[0], $method_parts[1]))->isPublic()))\n\t\t\tOR ( ! $objectCall && ! is_callable($this->methods[$methName]['function']))\n\t\t)\n\t\t{\n\t\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\n\t\t}\n\n\t\t//-------------------------------------\n\t\t// Checking Methods Signature\n\t\t//-------------------------------------\n\n\t\tif (isset($this->methods[$methName]['signature']))\n\t\t{\n\t\t\t$sig = $this->methods[$methName]['signature'];\n\t\t\tfor ($i = 0, $c = count($sig); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$current_sig = $sig[$i];\n\n\t\t\t\tif (count($current_sig) === count($m->params)+1)\n\t\t\t\t{\n\t\t\t\t\tfor ($n = 0, $mc = count($m->params); $n < $mc; $n++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$p = $m->params[$n];\n\t\t\t\t\t\t$pt = ($p->kindOf() === 'scalar') ? $p->scalarval() : $p->kindOf();\n\n\t\t\t\t\t\tif ($pt !== $current_sig[$n+1])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$pno = $n+1;\n\t\t\t\t\t\t\t$wanted = $current_sig[$n+1];\n\n\t\t\t\t\t\t\treturn new XML_RPC_Response(0,\n\t\t\t\t\t\t\t\t$this->xmlrpcerr['incorrect_params'],\n\t\t\t\t\t\t\t\t$this->xmlrpcstr['incorrect_params'] .\n\t\t\t\t\t\t\t\t': Wanted '.$wanted.', got '.$pt.' at param '.$pno.')');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//-------------------------------------\n\t\t// Calls the Function\n\t\t//-------------------------------------\n\n\t\tif ($objectCall === TRUE)\n\t\t{\n\t\t\tif ($method_parts[0] === 'this' && $system_call === TRUE)\n\t\t\t{\n\t\t\t\treturn call_user_func(array($this, $method_parts[1]), $m);\n\t\t\t}\n\t\t\telseif ($this->object === FALSE)\n\t\t\t{\n\t\t\t\treturn get_instance()->{$method_parts[1]}($m);\n\t\t\t}\n\n\t\t\treturn $this->object->{$method_parts[1]}($m);\n\t\t}\n\n\t\treturn call_user_func($this->methods[$methName]['function'], $m);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Server Function: List Methods\n\t *\n\t * @param\tmixed\n\t * @return\tobject\n\t */\n\tpublic function listMethods($m)\n\t{\n\t\t$v = new XML_RPC_Values();\n\t\t$output = array();\n\n\t\tforeach ($this->methods as $key => $value)\n\t\t{\n\t\t\t$output[] = new XML_RPC_Values($key, 'string');\n\t\t}\n\n\t\tforeach ($this->system_methods as $key => $value)\n\t\t{\n\t\t\t$output[] = new XML_RPC_Values($key, 'string');\n\t\t}\n\n\t\t$v->addArray($output);\n\t\treturn new XML_RPC_Response($v);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Server Function: Return Signature for Method\n\t *\n\t * @param\tmixed\n\t * @return\tobject\n\t */\n\tpublic function methodSignature($m)\n\t{\n\t\t$parameters = $m->output_parameters();\n\t\t$method_name = $parameters[0];\n\n\t\tif (isset($this->methods[$method_name]))\n\t\t{\n\t\t\tif ($this->methods[$method_name]['signature'])\n\t\t\t{\n\t\t\t\t$sigs = array();\n\t\t\t\t$signature = $this->methods[$method_name]['signature'];\n\n\t\t\t\tfor ($i = 0, $c = count($signature); $i < $c; $i++)\n\t\t\t\t{\n\t\t\t\t\t$cursig = array();\n\t\t\t\t\t$inSig = $signature[$i];\n\t\t\t\t\tfor ($j = 0, $jc = count($inSig); $j < $jc; $j++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$cursig[]= new XML_RPC_Values($inSig[$j], 'string');\n\t\t\t\t\t}\n\t\t\t\t\t$sigs[] = new XML_RPC_Values($cursig, 'array');\n\t\t\t\t}\n\n\t\t\t\treturn new XML_RPC_Response(new XML_RPC_Values($sigs, 'array'));\n\t\t\t}\n\n\t\t\treturn new XML_RPC_Response(new XML_RPC_Values('undef', 'string'));\n\t\t}\n\n\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Server Function: Doc String for Method\n\t *\n\t * @param\tmixed\n\t * @return\tobject\n\t */\n\tpublic function methodHelp($m)\n\t{\n\t\t$parameters = $m->output_parameters();\n\t\t$method_name = $parameters[0];\n\n\t\tif (isset($this->methods[$method_name]))\n\t\t{\n\t\t\t$docstring = isset($this->methods[$method_name]['docstring']) ? $this->methods[$method_name]['docstring'] : '';\n\n\t\t\treturn new XML_RPC_Response(new XML_RPC_Values($docstring, 'string'));\n\t\t}\n\n\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Server Function: Multi-call\n\t *\n\t * @param\tmixed\n\t * @return\tobject\n\t */\n\tpublic function multicall($m)\n\t{\n\t\t// Disabled\n\t\treturn new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\n\n\t\t$parameters = $m->output_parameters();\n\t\t$calls = $parameters[0];\n\n\t\t$result = array();\n\n\t\tforeach ($calls as $value)\n\t\t{\n\t\t\t$m = new XML_RPC_Message($value[0]);\n\t\t\t$plist = '';\n\n\t\t\tfor ($i = 0, $c = count($value[1]); $i < $c; $i++)\n\t\t\t{\n\t\t\t\t$m->addParam(new XML_RPC_Values($value[1][$i], 'string'));\n\t\t\t}\n\n\t\t\t$attempt = $this->_execute($m);\n\n\t\t\tif ($attempt->faultCode() !== 0)\n\t\t\t{\n\t\t\t\treturn $attempt;\n\t\t\t}\n\n\t\t\t$result[] = new XML_RPC_Values(array($attempt->value()), 'array');\n\t\t}\n\n\t\treturn new XML_RPC_Response(new XML_RPC_Values($result, 'array'));\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Multi-call Function: Error Handling\n\t *\n\t * @param\tmixed\n\t * @return\tobject\n\t */\n\tpublic function multicall_error($err)\n\t{\n\t\t$str = is_string($err) ? $this->xmlrpcstr[\"multicall_${err}\"] : $err->faultString();\n\t\t$code = is_string($err) ? $this->xmlrpcerr[\"multicall_${err}\"] : $err->faultCode();\n\n\t\t$struct['faultCode'] = new XML_RPC_Values($code, 'int');\n\t\t$struct['faultString'] = new XML_RPC_Values($str, 'string');\n\n\t\treturn new XML_RPC_Values($struct, 'struct');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Multi-call Function: Processes method\n\t *\n\t * @param\tmixed\n\t * @return\tobject\n\t */\n\tpublic function do_multicall($call)\n\t{\n\t\tif ($call->kindOf() !== 'struct')\n\t\t{\n\t\t\treturn $this->multicall_error('notstruct');\n\t\t}\n\t\telseif ( ! $methName = $call->me['struct']['methodName'])\n\t\t{\n\t\t\treturn $this->multicall_error('nomethod');\n\t\t}\n\n\t\tlist($scalar_value, $scalar_type) = array(reset($methName->me), key($methName->me));\n\t\t$scalar_type = $scalar_type === $this->xmlrpcI4 ? $this->xmlrpcInt : $scalar_type;\n\n\t\tif ($methName->kindOf() !== 'scalar' OR $scalar_type !== 'string')\n\t\t{\n\t\t\treturn $this->multicall_error('notstring');\n\t\t}\n\t\telseif ($scalar_value === 'system.multicall')\n\t\t{\n\t\t\treturn $this->multicall_error('recursion');\n\t\t}\n\t\telseif ( ! $params = $call->me['struct']['params'])\n\t\t{\n\t\t\treturn $this->multicall_error('noparams');\n\t\t}\n\t\telseif ($params->kindOf() !== 'array')\n\t\t{\n\t\t\treturn $this->multicall_error('notarray');\n\t\t}\n\n\t\tlist($b, $a) = array(reset($params->me), key($params->me));\n\n\t\t$msg = new XML_RPC_Message($scalar_value);\n\t\tfor ($i = 0, $numParams = count($b); $i < $numParams; $i++)\n\t\t{\n\t\t\t$msg->params[] = $params->me['array'][$i];\n\t\t}\n\n\t\t$result = $this->_execute($msg);\n\n\t\tif ($result->faultCode() !== 0)\n\t\t{\n\t\t\treturn $this->multicall_error($result);\n\t\t}\n\n\t\treturn new XML_RPC_Values(array($result->value()), 'array');\n\t}\n\n}\n"
  },
  {
    "path": "system/libraries/Zip.php",
    "content": "<?php\n/**\n * CodeIgniter\n *\n * An open source application development framework for PHP\n *\n * This content is released under the MIT License (MIT)\n *\n * Copyright (c) 2019 - 2022, CodeIgniter Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @package\tCodeIgniter\n * @author\tEllisLab Dev Team\n * @copyright\tCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)\n * @copyright\tCopyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)\n * @copyright\tCopyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)\n * @license\thttps://opensource.org/licenses/MIT\tMIT License\n * @link\thttps://codeigniter.com\n * @since\tVersion 1.0.0\n * @filesource\n */\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\n/**\n * Zip Compression Class\n *\n * This class is based on a library I found at Zend:\n * http://www.zend.com/codex.php?id=696&single=1\n *\n * The original library is a little rough around the edges so I\n * refactored it and added several additional methods -- Rick Ellis\n *\n * @package\t\tCodeIgniter\n * @subpackage\tLibraries\n * @category\tEncryption\n * @author\t\tEllisLab Dev Team\n * @link\t\thttps://codeigniter.com/userguide3/libraries/zip.html\n */\nclass CI_Zip {\n\n\t/**\n\t * Zip data in string form\n\t *\n\t * @var string\n\t */\n\tpublic $zipdata = '';\n\n\t/**\n\t * Zip data for a directory in string form\n\t *\n\t * @var string\n\t */\n\tpublic $directory = '';\n\n\t/**\n\t * Number of files/folder in zip file\n\t *\n\t * @var int\n\t */\n\tpublic $entries = 0;\n\n\t/**\n\t * Number of files in zip\n\t *\n\t * @var int\n\t */\n\tpublic $file_num = 0;\n\n\t/**\n\t * relative offset of local header\n\t *\n\t * @var int\n\t */\n\tpublic $offset = 0;\n\n\t/**\n\t * Reference to time at init\n\t *\n\t * @var int\n\t */\n\tpublic $now;\n\n\t/**\n\t * The level of compression\n\t *\n\t * Ranges from 0 to 9, with 9 being the highest level.\n\t *\n\t * @var\tint\n\t */\n\tpublic $compression_level = 2;\n\n\t/**\n\t * mbstring.func_overload flag\n\t *\n\t * @var\tbool\n\t */\n\tprotected static $func_overload;\n\n\t/**\n\t * Initialize zip compression class\n\t *\n\t * @return\tvoid\n\t */\n\tpublic function __construct()\n\t{\n\t\tisset(self::$func_overload) OR self::$func_overload = ( ! is_php('8.0') && extension_loaded('mbstring') && @ini_get('mbstring.func_overload'));\n\n\t\t$this->now = time();\n\t\tlog_message('info', 'Zip Compression Class Initialized');\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Directory\n\t *\n\t * Lets you add a virtual directory into which you can place files.\n\t *\n\t * @param\tmixed\t$directory\tthe directory name. Can be string or array\n\t * @return\tvoid\n\t */\n\tpublic function add_dir($directory)\n\t{\n\t\tforeach ((array) $directory as $dir)\n\t\t{\n\t\t\tif ( ! preg_match('|.+/$|', $dir))\n\t\t\t{\n\t\t\t\t$dir .= '/';\n\t\t\t}\n\n\t\t\t$dir_time = $this->_get_mod_time($dir);\n\t\t\t$this->_add_dir($dir, $dir_time['file_mtime'], $dir_time['file_mdate']);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get file/directory modification time\n\t *\n\t * If this is a newly created file/dir, we will set the time to 'now'\n\t *\n\t * @param\tstring\t$dir\tpath to file\n\t * @return\tarray\tfilemtime/filemdate\n\t */\n\tprotected function _get_mod_time($dir)\n\t{\n\t\t// filemtime() may return false, but raises an error for non-existing files\n\t\t$date = file_exists($dir) ? getdate(filemtime($dir)) : getdate($this->now);\n\n\t\treturn array(\n\t\t\t'file_mtime' => ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2,\n\t\t\t'file_mdate' => (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']\n\t\t);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Directory\n\t *\n\t * @param\tstring\t$dir\tthe directory name\n\t * @param\tint\t$file_mtime\n\t * @param\tint\t$file_mdate\n\t * @return\tvoid\n\t */\n\tprotected function _add_dir($dir, $file_mtime, $file_mdate)\n\t{\n\t\t$dir = str_replace('\\\\', '/', $dir);\n\n\t\t$this->zipdata .=\n\t\t\t\"\\x50\\x4b\\x03\\x04\\x0a\\x00\\x00\\x00\\x00\\x00\"\n\t\t\t.pack('v', $file_mtime)\n\t\t\t.pack('v', $file_mdate)\n\t\t\t.pack('V', 0) // crc32\n\t\t\t.pack('V', 0) // compressed filesize\n\t\t\t.pack('V', 0) // uncompressed filesize\n\t\t\t.pack('v', self::strlen($dir)) // length of pathname\n\t\t\t.pack('v', 0) // extra field length\n\t\t\t.$dir\n\t\t\t// below is \"data descriptor\" segment\n\t\t\t.pack('V', 0) // crc32\n\t\t\t.pack('V', 0) // compressed filesize\n\t\t\t.pack('V', 0); // uncompressed filesize\n\n\t\t$this->directory .=\n\t\t\t\"\\x50\\x4b\\x01\\x02\\x00\\x00\\x0a\\x00\\x00\\x00\\x00\\x00\"\n\t\t\t.pack('v', $file_mtime)\n\t\t\t.pack('v', $file_mdate)\n\t\t\t.pack('V',0) // crc32\n\t\t\t.pack('V',0) // compressed filesize\n\t\t\t.pack('V',0) // uncompressed filesize\n\t\t\t.pack('v', self::strlen($dir)) // length of pathname\n\t\t\t.pack('v', 0) // extra field length\n\t\t\t.pack('v', 0) // file comment length\n\t\t\t.pack('v', 0) // disk number start\n\t\t\t.pack('v', 0) // internal file attributes\n\t\t\t.pack('V', 16) // external file attributes - 'directory' bit set\n\t\t\t.pack('V', $this->offset) // relative offset of local header\n\t\t\t.$dir;\n\n\t\t$this->offset = self::strlen($this->zipdata);\n\t\t$this->entries++;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Data to Zip\n\t *\n\t * Lets you add files to the archive. If the path is included\n\t * in the filename it will be placed within a directory. Make\n\t * sure you use add_dir() first to create the folder.\n\t *\n\t * @param\tmixed\t$filepath\tA single filepath or an array of file => data pairs\n\t * @param\tstring\t$data\t\tSingle file contents\n\t * @return\tvoid\n\t */\n\tpublic function add_data($filepath, $data = NULL)\n\t{\n\t\tif (is_array($filepath))\n\t\t{\n\t\t\tforeach ($filepath as $path => $data)\n\t\t\t{\n\t\t\t\t$file_data = $this->_get_mod_time($path);\n\t\t\t\t$this->_add_data($path, $data, $file_data['file_mtime'], $file_data['file_mdate']);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$file_data = $this->_get_mod_time($filepath);\n\t\t\t$this->_add_data($filepath, $data, $file_data['file_mtime'], $file_data['file_mdate']);\n\t\t}\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Add Data to Zip\n\t *\n\t * @param\tstring\t$filepath\tthe file name/path\n\t * @param\tstring\t$data\tthe data to be encoded\n\t * @param\tint\t$file_mtime\n\t * @param\tint\t$file_mdate\n\t * @return\tvoid\n\t */\n\tprotected function _add_data($filepath, $data, $file_mtime, $file_mdate)\n\t{\n\t\t$filepath = str_replace('\\\\', '/', $filepath);\n\n\t\t$uncompressed_size = self::strlen($data);\n\t\t$crc32  = crc32($data);\n\t\t$gzdata = self::substr(gzcompress($data, $this->compression_level), 2, -4);\n\t\t$compressed_size = self::strlen($gzdata);\n\n\t\t$this->zipdata .=\n\t\t\t\"\\x50\\x4b\\x03\\x04\\x14\\x00\\x00\\x00\\x08\\x00\"\n\t\t\t.pack('v', $file_mtime)\n\t\t\t.pack('v', $file_mdate)\n\t\t\t.pack('V', $crc32)\n\t\t\t.pack('V', $compressed_size)\n\t\t\t.pack('V', $uncompressed_size)\n\t\t\t.pack('v', self::strlen($filepath)) // length of filename\n\t\t\t.pack('v', 0) // extra field length\n\t\t\t.$filepath\n\t\t\t.$gzdata; // \"file data\" segment\n\n\t\t$this->directory .=\n\t\t\t\"\\x50\\x4b\\x01\\x02\\x00\\x00\\x14\\x00\\x00\\x00\\x08\\x00\"\n\t\t\t.pack('v', $file_mtime)\n\t\t\t.pack('v', $file_mdate)\n\t\t\t.pack('V', $crc32)\n\t\t\t.pack('V', $compressed_size)\n\t\t\t.pack('V', $uncompressed_size)\n\t\t\t.pack('v', self::strlen($filepath)) // length of filename\n\t\t\t.pack('v', 0) // extra field length\n\t\t\t.pack('v', 0) // file comment length\n\t\t\t.pack('v', 0) // disk number start\n\t\t\t.pack('v', 0) // internal file attributes\n\t\t\t.pack('V', 32) // external file attributes - 'archive' bit set\n\t\t\t.pack('V', $this->offset) // relative offset of local header\n\t\t\t.$filepath;\n\n\t\t$this->offset = self::strlen($this->zipdata);\n\t\t$this->entries++;\n\t\t$this->file_num++;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Read the contents of a file and add it to the zip\n\t *\n\t * @param\tstring\t$path\n\t * @param\tbool\t$archive_filepath\n\t * @return\tbool\n\t */\n\tpublic function read_file($path, $archive_filepath = FALSE)\n\t{\n\t\tif (file_exists($path) && FALSE !== ($data = file_get_contents($path)))\n\t\t{\n\t\t\tif (is_string($archive_filepath))\n\t\t\t{\n\t\t\t\t$name = str_replace('\\\\', '/', $archive_filepath);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$name = str_replace('\\\\', '/', $path);\n\n\t\t\t\tif ($archive_filepath === FALSE)\n\t\t\t\t{\n\t\t\t\t\t$name = preg_replace('|.*/(.+)|', '\\\\1', $name);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->add_data($name, $data);\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\t// ------------------------------------------------------------------------\n\n\t/**\n\t * Read a directory and add it to the zip.\n\t *\n\t * This function recursively reads a folder and everything it contains (including\n\t * sub-folders) and creates a zip based on it. Whatever directory structure\n\t * is in the original file path will be recreated in the zip file.\n\t *\n\t * @param\tstring\t$path\tpath to source directory\n\t * @param\tbool\t$preserve_filepath\n\t * @param\tstring\t$root_path\n\t * @return\tbool\n\t */\n\tpublic function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL)\n\t{\n\t\t$path = rtrim($path, '/\\\\').DIRECTORY_SEPARATOR;\n\t\tif ( ! $fp = @opendir($path))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// Set the original directory root for child dir's to use as relative\n\t\tif ($root_path === NULL)\n\t\t{\n\t\t\t$root_path = str_replace(array('\\\\', '/'), DIRECTORY_SEPARATOR, dirname($path)).DIRECTORY_SEPARATOR;\n\t\t}\n\n\t\twhile (FALSE !== ($file = readdir($fp)))\n\t\t{\n\t\t\tif ($file[0] === '.')\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is_dir($path.$file))\n\t\t\t{\n\t\t\t\t$this->read_dir($path.$file.DIRECTORY_SEPARATOR, $preserve_filepath, $root_path);\n\t\t\t}\n\t\t\telseif (FALSE !== ($data = file_get_contents($path.$file)))\n\t\t\t{\n\t\t\t\t$name = str_replace(array('\\\\', '/'), DIRECTORY_SEPARATOR, $path);\n\t\t\t\tif ($preserve_filepath === FALSE)\n\t\t\t\t{\n\t\t\t\t\t$name = str_replace($root_path, '', $name);\n\t\t\t\t}\n\n\t\t\t\t$this->add_data($name.$file, $data);\n\t\t\t}\n\t\t}\n\n\t\tclosedir($fp);\n\t\treturn TRUE;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Get the Zip file\n\t *\n\t * @return\tstring\t(binary encoded)\n\t */\n\tpublic function get_zip()\n\t{\n\t\t// Is there any data to return?\n\t\tif ($this->entries === 0)\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\t// @see https://github.com/bcit-ci/CodeIgniter/issues/5864\n\t\t$footer = $this->directory.\"\\x50\\x4b\\x05\\x06\\x00\\x00\\x00\\x00\"\n\t\t\t.pack('v', $this->entries) // total # of entries \"on this disk\"\n\t\t\t.pack('v', $this->entries) // total # of entries overall\n\t\t\t.pack('V', self::strlen($this->directory)) // size of central dir\n\t\t\t.pack('V', self::strlen($this->zipdata)) // offset to start of central dir\n\t\t\t.\"\\x00\\x00\"; // .zip file comment length\n\t\treturn $this->zipdata.$footer;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Write File to the specified directory\n\t *\n\t * Lets you write a file\n\t *\n\t * @param\tstring\t$filepath\tthe file name\n\t * @return\tbool\n\t */\n\tpublic function archive($filepath)\n\t{\n\t\tif ( ! ($fp = @fopen($filepath, 'w+b')))\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tflock($fp, LOCK_EX);\n\n\t\tfor ($result = $written = 0, $data = $this->get_zip(), $length = self::strlen($data); $written < $length; $written += $result)\n\t\t{\n\t\t\tif (($result = fwrite($fp, self::substr($data, $written))) === FALSE)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tflock($fp, LOCK_UN);\n\t\tfclose($fp);\n\n\t\treturn is_int($result);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Download\n\t *\n\t * @param\tstring\t$filename\tthe file name\n\t * @return\tvoid\n\t */\n\tpublic function download($filename = 'backup.zip')\n\t{\n\t\tif ( ! preg_match('|.+?\\.zip$|', $filename))\n\t\t{\n\t\t\t$filename .= '.zip';\n\t\t}\n\n\t\tget_instance()->load->helper('download');\n\t\t$get_zip = $this->get_zip();\n\t\t$zip_content =& $get_zip;\n\n\t\tforce_download($filename, $zip_content);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Initialize Data\n\t *\n\t * Lets you clear current zip data. Useful if you need to create\n\t * multiple zips with different data.\n\t *\n\t * @return\tCI_Zip\n\t */\n\tpublic function clear_data()\n\t{\n\t\t$this->zipdata = '';\n\t\t$this->directory = '';\n\t\t$this->entries = 0;\n\t\t$this->file_num = 0;\n\t\t$this->offset = 0;\n\t\treturn $this;\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe strlen()\n\t *\n\t * @param\tstring\t$str\n\t * @return\tint\n\t */\n\tprotected static function strlen($str)\n\t{\n\t\treturn (self::$func_overload)\n\t\t\t? mb_strlen($str, '8bit')\n\t\t\t: strlen($str);\n\t}\n\n\t// --------------------------------------------------------------------\n\n\t/**\n\t * Byte-safe substr()\n\t *\n\t * @param\tstring\t$str\n\t * @param\tint\t$start\n\t * @param\tint\t$length\n\t * @return\tstring\n\t */\n\tprotected static function substr($str, $start, $length = NULL)\n\t{\n\t\tif (self::$func_overload)\n\t\t{\n\t\t\t// mb_substr($str, $start, null, '8bit') returns an empty\n\t\t\t// string on PHP 5.3\n\t\t\tisset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);\n\t\t\treturn mb_substr($str, $start, $length, '8bit');\n\t\t}\n\n\t\treturn isset($length)\n\t\t\t? substr($str, $start, $length)\n\t\t\t: substr($str, $start);\n\t}\n}\n"
  },
  {
    "path": "system/libraries/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<title>403 Forbidden</title>\n</head>\n<body>\n\n<p>Directory access is forbidden.</p>\n\n</body>\n</html>\n"
  }
]